ZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HCmluZGV4IDJhN2UzMzguLmNhNDQyZDMgMTAwNjQ0Ci0tLSBhL0NPUFlJTkcKKysrIGIvQ09QWUlORwpAQCAtMTgsNyArMTgsNyBAQAogCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKIAogIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICAgICAgICAgICAgICAgICAgICAgICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwogIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgogCkBAIC0zMjEsNyArMzIxLDcgQEAKIAogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKIAogCiBBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCmluZGV4IGYyOGEyNGUuLjQzM2NmNWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWApAQCAtNDYsNiArNDYsOCBAQAogCS0gcHJvY2VkdXJlIHRvIGdldCBhIHNvdXJjZSBwYXRjaCBpbmNsdWRlZCBpbnRvIHRoZSBrZXJuZWwgdHJlZS4KIFZHQS1zb2Z0Y3Vyc29yLnR4dAogCS0gaG93IHRvIGNoYW5nZSB5b3VyIFZHQSBjdXJzb3IgZnJvbSBhIGJsaW5raW5nIHVuZGVyc2NvcmUuCithcHBseWluZy1wYXRjaGVzLnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdmFyaW91cyB0cmVlcyBhbmQgaG93IHRvIGFwcGx5IHRoZWlyIHBhdGNoZXMuCiBhcm0vCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IG9uIHRoZSBBUk0gYXJjaGl0ZWN0dXJlLgogYmFzaWNfcHJvZmlsaW5nLnR4dApAQCAtMjc1LDcgKzI3Nyw3IEBACiB1bmljb2RlLnR4dAogCS0gaW5mbyBvbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIvZm9udCBtYXBwaW5nIHVzZWQgaW4gTGludXguCiB1bWwvCi0JLSBkaXJlY3Rvcnkgd2l0aCBpbmZvbWF0aW9uIGFib3V0IFVzZXIgTW9kZSBMaW51eC4KKwktIGRpcmVjdG9yeSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IFVzZXIgTW9kZSBMaW51eC4KIHVzYi8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gcmVnYXJkaW5nIHRoZSBVbml2ZXJzYWwgU2VyaWFsIEJ1cy4KIHZpZGVvNGxpbnV4LwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZSBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKaW5kZXggZjI1YjM5NS4uMjJlNWY5MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQorKysgYi9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCkBAIC0yMzYsNiArMjM2LDkgQEAKIG9mIHRoZSBmdW5jdGlvbiwgdGVsbGluZyBwZW9wbGUgd2hhdCBpdCBkb2VzLCBhbmQgcG9zc2libHkgV0hZIGl0IGRvZXMKIGl0LgogCitXaGVuIGNvbW1lbnRpbmcgdGhlIGtlcm5lbCBBUEkgZnVuY3Rpb25zLCBwbGVhc2UgdXNlIHRoZSBrZXJuZWxkb2MgZm9ybWF0LgorU2VlIHRoZSBmaWxlcyBEb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQgYW5kIHNjcmlwdHMva2VybmVsLWRvYworZm9yIGRldGFpbHMuCiAKIAkJQ2hhcHRlciA4OiBZb3UndmUgbWFkZSBhIG1lc3Mgb2YgaXQKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dCBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKaW5kZXggNmVlM2NkNi4uMWFmMGYyZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJCWRtYV9hZGRyX3QgYWRkcik7CiAKIFRoaXMgcHV0cyBtZW1vcnkgYmFjayBpbnRvIHRoZSBwb29sLiAgVGhlIHBvb2wgaXMgd2hhdCB3YXMgcGFzc2VkIHRvCi10aGUgdGhlIHBvb2wgYWxsb2NhdGlvbiByb3V0aW5lOyB0aGUgY3B1IGFuZCBkbWEgYWRkcmVzc2VzIGFyZSB3aGF0Cit0aGUgcG9vbCBhbGxvY2F0aW9uIHJvdXRpbmU7IHRoZSBjcHUgYW5kIGRtYSBhZGRyZXNzZXMgYXJlIHdoYXQKIHdlcmUgcmV0dXJuZWQgd2hlbiB0aGF0IHJvdXRpbmUgYWxsb2NhdGVkIHRoZSBtZW1vcnkgYmVpbmcgZnJlZWQuCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtSVNBLUxQQy50eHQgYi9Eb2N1bWVudGF0aW9uL0RNQS1JU0EtTFBDLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVmNmJlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ETUEtSVNBLUxQQy50eHQKQEAgLTAsMCArMSwxNTEgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgIERNQSB3aXRoIElTQSBhbmQgTFBDIGRldmljZXMKKyAgICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIFBpZXJyZSBPc3NtYW4gPGRyemV1c0BkcnpldXMuY3g+CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byBkbyBETUEgdHJhbnNmZXJzIHVzaW5nIHRoZSBvbGQgSVNBIERNQQorY29udHJvbGxlci4gRXZlbiB0aG91Z2ggSVNBIGlzIG1vcmUgb3IgbGVzcyBkZWFkIHRvZGF5IHRoZSBMUEMgYnVzCit1c2VzIHRoZSBzYW1lIERNQSBzeXN0ZW0gc28gaXQgd2lsbCBiZSBhcm91bmQgZm9yIHF1aXRlIHNvbWUgdGltZS4KKworUGFydCBJIC0gSGVhZGVycyBhbmQgZGVwZW5kZW5jaWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gZG8gSVNBIHN0eWxlIERNQSB5b3UgbmVlZCB0byBpbmNsdWRlIHR3byBoZWFkZXJzOgorCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKK1RoZSBmaXJzdCBpcyB0aGUgZ2VuZXJpYyBETUEgQVBJIHVzZWQgdG8gY29udmVydCB2aXJ0dWFsIGFkZHJlc3NlcyB0bworcGh5c2ljYWwgYWRkcmVzc2VzIChzZWUgRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dCBmb3IgZGV0YWlscykuCisKK1RoZSBzZWNvbmQgY29udGFpbnMgdGhlIHJvdXRpbmVzIHNwZWNpZmljIHRvIElTQSBETUEgdHJhbnNmZXJzLiBTaW5jZQordGhpcyBpcyBub3QgcHJlc2VudCBvbiBhbGwgcGxhdGZvcm1zIG1ha2Ugc3VyZSB5b3UgY29uc3RydWN0IHlvdXIKK0tjb25maWcgdG8gYmUgZGVwZW5kZW50IG9uIElTQV9ETUFfQVBJIChub3QgSVNBKSBzbyB0aGF0IG5vYm9keSB0cmllcwordG8gYnVpbGQgeW91ciBkcml2ZXIgb24gdW5zdXBwb3J0ZWQgcGxhdGZvcm1zLgorCitQYXJ0IElJIC0gQnVmZmVyIGFsbG9jYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgSVNBIERNQSBjb250cm9sbGVyIGhhcyBzb21lIHZlcnkgc3RyaWN0IHJlcXVpcmVtZW50cyBvbiB3aGljaAorbWVtb3J5IGl0IGNhbiBhY2Nlc3Mgc28gZXh0cmEgY2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gYWxsb2NhdGluZworYnVmZmVycy4KKworKFlvdSB1c3VhbGx5IG5lZWQgYSBzcGVjaWFsIGJ1ZmZlciBmb3IgRE1BIHRyYW5zZmVycyBpbnN0ZWFkIG9mCit0cmFuc2ZlcnJpbmcgZGlyZWN0bHkgdG8gYW5kIGZyb20geW91ciBub3JtYWwgZGF0YSBzdHJ1Y3R1cmVzLikKKworVGhlIERNQS1hYmxlIGFkZHJlc3Mgc3BhY2UgaXMgdGhlIGxvd2VzdCAxNiBNQiBvZiBfcGh5c2ljYWxfIG1lbW9yeS4KK0Fsc28gdGhlIHRyYW5zZmVyIGJsb2NrIG1heSBub3QgY3Jvc3MgcGFnZSBib3VuZGFyaWVzICh3aGljaCBhcmUgNjQKK29yIDEyOCBLaUIgZGVwZW5kaW5nIG9uIHdoaWNoIGNoYW5uZWwgeW91IHVzZSkuCisKK0luIG9yZGVyIHRvIGFsbG9jYXRlIGEgcGllY2Ugb2YgbWVtb3J5IHRoYXQgc2F0aXNmaWVzIGFsbCB0aGVzZQorcmVxdWlyZW1lbnRzIHlvdSBwYXNzIHRoZSBmbGFnIEdGUF9ETUEgdG8ga21hbGxvYy4KKworVW5mb3J0dW5hdGVseSB0aGUgbWVtb3J5IGF2YWlsYWJsZSBmb3IgSVNBIERNQSBpcyBzY2FyY2Ugc28gdW5sZXNzIHlvdQorYWxsb2NhdGUgdGhlIG1lbW9yeSBkdXJpbmcgYm9vdC11cCBpdCdzIGEgZ29vZCBpZGVhIHRvIGFsc28gcGFzcworX19HRlBfUkVQRUFUIGFuZCBfX0dGUF9OT1dBUk4gdG8gbWFrZSB0aGUgYWxsb2NhdGVyIHRyeSBhIGJpdCBoYXJkZXIuCisKKyhUaGlzIHNjYXJjaXR5IGFsc28gbWVhbnMgdGhhdCB5b3Ugc2hvdWxkIGFsbG9jYXRlIHRoZSBidWZmZXIgYXMKK2Vhcmx5IGFzIHBvc3NpYmxlIGFuZCBub3QgcmVsZWFzZSBpdCB1bnRpbCB0aGUgZHJpdmVyIGlzIHVubG9hZGVkLikKKworUGFydCBJSUkgLSBBZGRyZXNzIHRyYW5zbGF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gdHJhbnNsYXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYSBwaHlzaWNhbCB1c2UgdGhlIG5vcm1hbCBETUEKK0FQSS4gRG8gX25vdF8gdXNlIGlzYV92aXJ0X3RvX3BoeXMoKSBldmVuIHRob3VnaCBpdCBkb2VzIHRoZSBzYW1lCit0aGluZy4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSBmdW5jdGlvbiBpc2FfdmlydF90b19waHlzKCkKK3dpbGwgcmVxdWlyZSBhIEtjb25maWcgZGVwZW5kZW5jeSB0byBJU0EsIG5vdCBqdXN0IElTQV9ETUFfQVBJIHdoaWNoCitpcyByZWFsbHkgYWxsIHlvdSBuZWVkLiBSZW1lbWJlciB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBETUEgY29udHJvbGxlcgoraGFzIGl0cyBvcmlnaW5zIGluIElTQSBpdCBpcyB1c2VkIGVsc2V3aGVyZS4KKworTm90ZTogeDg2XzY0IGhhZCBhIGJyb2tlbiBETUEgQVBJIHdoZW4gaXQgY2FtZSB0byBJU0EgYnV0IGhhcyBzaW5jZQorYmVlbiBmaXhlZC4gSWYgeW91ciBhcmNoIGhhcyBwcm9ibGVtcyB0aGVuIGZpeCB0aGUgRE1BIEFQSSBpbnN0ZWFkIG9mCityZXZlcnRpbmcgdG8gdGhlIElTQSBmdW5jdGlvbnMuCisKK1BhcnQgSVYgLSBDaGFubmVscworLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Egbm9ybWFsIElTQSBETUEgY29udHJvbGxlciBoYXMgOCBjaGFubmVscy4gVGhlIGxvd2VyIGZvdXIgYXJlIGZvcgorOC1iaXQgdHJhbnNmZXJzIGFuZCB0aGUgdXBwZXIgZm91ciBhcmUgZm9yIDE2LWJpdCB0cmFuc2ZlcnMuCisKKyhBY3R1YWxseSB0aGUgRE1BIGNvbnRyb2xsZXIgaXMgcmVhbGx5IHR3byBzZXBhcmF0ZSBjb250cm9sbGVycyB3aGVyZQorY2hhbm5lbCA0IGlzIHVzZWQgdG8gZ2l2ZSBETUEgYWNjZXNzIGZvciB0aGUgc2Vjb25kIGNvbnRyb2xsZXIgKDAtMykuCitUaGlzIG1lYW5zIHRoYXQgb2YgdGhlIGZvdXIgMTYtYml0cyBjaGFubmVscyBvbmx5IHRocmVlIGFyZSB1c2FibGUuKQorCitZb3UgYWxsb2NhdGUgdGhlc2UgaW4gYSBzaW1pbGFyIGZhc2hpb24gYXMgYWxsIGJhc2ljIHJlc291cmNlczoKKworZXh0ZXJuIGludCByZXF1ZXN0X2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIsIGNvbnN0IGNoYXIgKiBkZXZpY2VfaWQpOworZXh0ZXJuIHZvaWQgZnJlZV9kbWEodW5zaWduZWQgaW50IGRtYW5yKTsKKworVGhlIGFiaWxpdHkgdG8gdXNlIDE2LWJpdCBvciA4LWJpdCB0cmFuc2ZlcnMgaXMgX25vdF8gdXAgdG8geW91IGFzIGEKK2RyaXZlciBhdXRob3IgYnV0IGRlcGVuZHMgb24gd2hhdCB0aGUgaGFyZHdhcmUgc3VwcG9ydHMuIENoZWNrIHlvdXIKK3NwZWNzIG9yIHRlc3QgZGlmZmVyZW50IGNoYW5uZWxzLgorCitQYXJ0IFYgLSBUcmFuc2ZlciBkYXRhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdyBmb3IgdGhlIGdvb2Qgc3R1ZmYsIHRoZSBhY3R1YWwgRE1BIHRyYW5zZmVyLiA6KQorCitCZWZvcmUgeW91IHVzZSBhbnkgSVNBIERNQSByb3V0aW5lcyB5b3UgbmVlZCB0byBjbGFpbSB0aGUgRE1BIGxvY2sKK3VzaW5nIGNsYWltX2RtYV9sb2NrKCkuIFRoZSByZWFzb24gaXMgdGhhdCBzb21lIERNQSBvcGVyYXRpb25zIGFyZQorbm90IGF0b21pYyBzbyBvbmx5IG9uZSBkcml2ZXIgbWF5IGZpZGRsZSB3aXRoIHRoZSByZWdpc3RlcnMgYXQgYQordGltZS4KKworVGhlIGZpcnN0IHRpbWUgeW91IHVzZSB0aGUgRE1BIGNvbnRyb2xsZXIgeW91IHNob3VsZCBjYWxsCitjbGVhcl9kbWFfZmYoKS4gVGhpcyBjbGVhcnMgYW4gaW50ZXJuYWwgcmVnaXN0ZXIgaW4gdGhlIERNQQorY29udHJvbGxlciB0aGF0IGlzIHVzZWQgZm9yIHRoZSBub24tYXRvbWljIG9wZXJhdGlvbnMuIEFzIGxvbmcgYXMgeW91CisoYW5kIGV2ZXJ5b25lIGVsc2UpIHVzZXMgdGhlIGxvY2tpbmcgZnVuY3Rpb25zIHRoZW4geW91IG9ubHkgbmVlZCB0bworcmVzZXQgdGhpcyBvbmNlLgorCitOZXh0LCB5b3UgdGVsbCB0aGUgY29udHJvbGxlciBpbiB3aGljaCBkaXJlY3Rpb24geW91IGludGVuZCB0byBkbyB0aGUKK3RyYW5zZmVyIHVzaW5nIHNldF9kbWFfbW9kZSgpLiBDdXJyZW50bHkgeW91IGhhdmUgdGhlIG9wdGlvbnMKK0RNQV9NT0RFX1JFQUQgYW5kIERNQV9NT0RFX1dSSVRFLgorCitTZXQgdGhlIGFkZHJlc3MgZnJvbSB3aGVyZSB0aGUgdHJhbnNmZXIgc2hvdWxkIHN0YXJ0ICh0aGlzIG5lZWRzIHRvCitiZSAxNi1iaXQgYWxpZ25lZCBmb3IgMTYtYml0IHRyYW5zZmVycykgYW5kIGhvdyBtYW55IGJ5dGVzIHRvCit0cmFuc2Zlci4gTm90ZSB0aGF0IGl0J3MgX2J5dGVzXy4gVGhlIERNQSByb3V0aW5lcyB3aWxsIGRvIGFsbCB0aGUKK3JlcXVpcmVkIHRyYW5zbGF0aW9uIHRvIHZhbHVlcyB0aGF0IHRoZSBETUEgY29udHJvbGxlciB1bmRlcnN0YW5kcy4KKworVGhlIGZpbmFsIHN0ZXAgaXMgZW5hYmxpbmcgdGhlIERNQSBjaGFubmVsIGFuZCByZWxlYXNpbmcgdGhlIERNQQorbG9jay4KKworT25jZSB0aGUgRE1BIHRyYW5zZmVyIGlzIGZpbmlzaGVkIChvciB0aW1lZCBvdXQpIHlvdSBzaG91bGQgZGlzYWJsZQordGhlIGNoYW5uZWwgYWdhaW4uIFlvdSBzaG91bGQgYWxzbyBjaGVjayBnZXRfZG1hX3Jlc2lkdWUoKSB0byBtYWtlCitzdXJlIHRoYXQgYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJlZC4KKworRXhhbXBsZToKKworaW50IGZsYWdzLCByZXNpZHVlOworCitmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisKK2NsZWFyX2RtYV9mZigpOworCitzZXRfZG1hX21vZGUoY2hhbm5lbCwgRE1BX01PREVfV1JJVEUpOworc2V0X2RtYV9hZGRyKGNoYW5uZWwsIHBoeXNfYWRkcik7CitzZXRfZG1hX2NvdW50KGNoYW5uZWwsIG51bV9ieXRlcyk7CisKK2RtYV9lbmFibGUoY2hhbm5lbCk7CisKK3JlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCit3aGlsZSAoIWRldmljZV9kb25lKCkpOworCitmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisKK2RtYV9kaXNhYmxlKGNoYW5uZWwpOworCityZXNpZHVlID0gZG1hX2dldF9yZXNpZHVlKGNoYW5uZWwpOworaWYgKHJlc2lkdWUgIT0gMCkKKwlwcmludGsoS0VSTl9FUlIgImRyaXZlcjogSW5jb21wbGV0ZSBETUEgdHJhbnNmZXIhIgorCQkiICVkIGJ5dGVzIGxlZnQhXG4iLCByZXNpZHVlKTsKKworcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisKK1BhcnQgVkkgLSBTdXNwZW5kL3Jlc3VtZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0IGlzIHRoZSBkcml2ZXIncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbWFjaGluZSBpc24ndAorc3VzcGVuZGVkIHdoaWxlIGEgRE1BIHRyYW5zZmVyIGlzIGluIHByb2dyZXNzLiBBbHNvLCBhbGwgRE1BIHNldHRpbmdzCithcmUgbG9zdCB3aGVuIHRoZSBzeXN0ZW0gc3VzcGVuZHMgc28gaWYgeW91ciBkcml2ZXIgcmVsaWVzIG9uIHRoZSBETUEKK2NvbnRyb2xsZXIgYmVpbmcgaW4gYSBjZXJ0YWluIHN0YXRlIHRoZW4geW91IGhhdmUgdG8gcmVzdG9yZSB0aGVzZQorcmVnaXN0ZXJzIHVwb24gcmVzdW1lLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2pvdXJuYWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svam91cm5hbC1hcGkudG1wbAppbmRleCAxZWY2ZjQzLi4zNDFhYWE0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svam91cm5hbC1hcGkudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svam91cm5hbC1hcGkudG1wbApAQCAtMTE2LDcgKzExNiw3IEBACiAKIFlvdSBzdGlsbCBuZWVkIHRvIGFjdHVhbGx5IGpvdXJuYWwgeW91ciBmaWxlc3lzdGVtIGNoYW5nZXMsIHRoaXMKIGlzIGRvbmUgYnkgd3JhcHBpbmcgdGhlbSBpbnRvIHRyYW5zYWN0aW9ucy4gQWRkaXRpb25hbGx5IHlvdQotYWxzbyBuZWVkIHRvIHdyYXAgdGhlIG1vZGlmaWNhdGlvbiBvZiBlYWNoIG9mIHRoZSB0aGUgYnVmZmVycworYWxzbyBuZWVkIHRvIHdyYXAgdGhlIG1vZGlmaWNhdGlvbiBvZiBlYWNoIG9mIHRoZSBidWZmZXJzCiB3aXRoIGNhbGxzIHRvIHRoZSBqb3VybmFsIGxheWVyLCBzbyBpdCBrbm93cyB3aGF0IHRoZSBtb2RpZmljYXRpb25zCiB5b3UgYXJlIGFjdHVhbGx5IG1ha2luZyBhcmUuIFRvIGRvIHRoaXMgdXNlICBqb3VybmFsX3N0YXJ0KCkgd2hpY2gKIHJldHVybnMgYSB0cmFuc2FjdGlvbiBoYW5kbGUuCkBAIC0xMjgsNyArMTI4LDcgQEAKIGFyZSBuZXN0YWJsZSBjYWxscywgc28geW91IGNhbiByZWVudGVyIGEgdHJhbnNhY3Rpb24gaWYgbmVjZXNzYXJ5LAogYnV0IHJlbWVtYmVyIHlvdSBtdXN0IGNhbGwgam91cm5hbF9zdG9wKCkgdGhlIHNhbWUgbnVtYmVyIG9mIHRpbWVzIGFzCiBqb3VybmFsX3N0YXJ0KCkgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZWQgKG9yIG1vcmUgYWNjdXJhdGVseQotbGVhdmVzIHRoZSB0aGUgdXBkYXRlIHBoYXNlKS4gRXh0My9WRlMgbWFrZXMgdXNlIG9mIHRoaXMgZmVhdHVyZSB0byBzaW1wbGlmeSAKK2xlYXZlcyB0aGUgdXBkYXRlIHBoYXNlKS4gRXh0My9WRlMgbWFrZXMgdXNlIG9mIHRoaXMgZmVhdHVyZSB0byBzaW1wbGlmeQogcXVvdGEgc3VwcG9ydC4KIDwvcGFyYT4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1oYWNraW5nLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWhhY2tpbmcudG1wbAppbmRleCA0OWE5ZWY4Li42MzY3YmJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWhhY2tpbmcudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWhhY2tpbmcudG1wbApAQCAtOCw4ICs4LDcgQEAKICAgCiAgIDxhdXRob3Jncm91cD4KICAgIDxhdXRob3I+Ci0gICAgPGZpcnN0bmFtZT5QYXVsPC9maXJzdG5hbWU+Ci0gICAgPG90aGVybmFtZT5SdXN0eTwvb3RoZXJuYW1lPgorICAgIDxmaXJzdG5hbWU+UnVzdHk8L2ZpcnN0bmFtZT4KICAgICA8c3VybmFtZT5SdXNzZWxsPC9zdXJuYW1lPgogICAgIDxhZmZpbGlhdGlvbj4KICAgICAgPGFkZHJlc3M+CkBAIC0yMCw3ICsxOSw3IEBACiAgIDwvYXV0aG9yZ3JvdXA+CiAKICAgPGNvcHlyaWdodD4KLSAgIDx5ZWFyPjIwMDE8L3llYXI+CisgICA8eWVhcj4yMDA1PC95ZWFyPgogICAgPGhvbGRlcj5SdXN0eSBSdXNzZWxsPC9ob2xkZXI+CiAgIDwvY29weXJpZ2h0PgogCkBAIC02NCw3ICs2Myw3IEBACiAgPGNoYXB0ZXIgaWQ9ImludHJvZHVjdGlvbiI+CiAgIDx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPgogICA8cGFyYT4KLSAgIFdlbGNvbWUsIGdlbnRsZSByZWFkZXIsIHRvIFJ1c3R5J3MgVW5yZWxpYWJsZSBHdWlkZSB0byBMaW51eAorICAgV2VsY29tZSwgZ2VudGxlIHJlYWRlciwgdG8gUnVzdHkncyBSZW1hcmthYmx5IFVucmVsaWFibGUgR3VpZGUgdG8gTGludXgKICAgIEtlcm5lbCBIYWNraW5nLiAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGNvbW1vbiByb3V0aW5lcyBhbmQKICAgIGdlbmVyYWwgcmVxdWlyZW1lbnRzIGZvciBrZXJuZWwgY29kZTogaXRzIGdvYWwgaXMgdG8gc2VydmUgYXMgYQogICAgcHJpbWVyIGZvciBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgZm9yIGV4cGVyaWVuY2VkIEMKQEAgLTk2LDEzICs5NSwxMyBAQAogCiAgICA8bGlzdGl0ZW0+CiAgICAgPHBhcmE+Ci0gICAgIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHByb2Nlc3MsIHNlcnZpbmcgYSBzb2Z0aXJxLCB0YXNrbGV0IG9yIGJoOworICAgICBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBwcm9jZXNzLCBzZXJ2aW5nIGEgc29mdGlycSBvciB0YXNrbGV0OwogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAKICAgIDxsaXN0aXRlbT4KICAgICA8cGFyYT4KLSAgICAgcnVubmluZyBpbiBrZXJuZWwgc3BhY2UsIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3M7CisgICAgIHJ1bm5pbmcgaW4ga2VybmVsIHNwYWNlLCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzICh1c2VyIGNvbnRleHQpOwogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAKQEAgLTExNCwxMSArMTEzLDEyIEBACiAgIDwvaXRlbWl6ZWRsaXN0PgogCiAgIDxwYXJhPgotICAgVGhlcmUgaXMgYSBzdHJpY3Qgb3JkZXJpbmcgYmV0d2VlbiB0aGVzZTogb3RoZXIgdGhhbiB0aGUgbGFzdAotICAgY2F0ZWdvcnkgKHVzZXJzcGFjZSkgZWFjaCBjYW4gb25seSBiZSBwcmUtZW1wdGVkIGJ5IHRob3NlIGFib3ZlLgotICAgRm9yIGV4YW1wbGUsIHdoaWxlIGEgc29mdGlycSBpcyBydW5uaW5nIG9uIGEgQ1BVLCBubyBvdGhlcgotICAgc29mdGlycSB3aWxsIHByZS1lbXB0IGl0LCBidXQgYSBoYXJkd2FyZSBpbnRlcnJ1cHQgY2FuLiAgSG93ZXZlciwKLSAgIGFueSBvdGhlciBDUFVzIGluIHRoZSBzeXN0ZW0gZXhlY3V0ZSBpbmRlcGVuZGVudGx5LgorICAgVGhlcmUgaXMgYW4gb3JkZXJpbmcgYmV0d2VlbiB0aGVzZS4gIFRoZSBib3R0b20gdHdvIGNhbiBwcmVlbXB0CisgICBlYWNoIG90aGVyLCBidXQgYWJvdmUgdGhhdCBpcyBhIHN0cmljdCBoaWVyYXJjaHk6IGVhY2ggY2FuIG9ubHkgYmUKKyAgIHByZWVtcHRlZCBieSB0aGUgb25lcyBhYm92ZSBpdC4gIEZvciBleGFtcGxlLCB3aGlsZSBhIHNvZnRpcnEgaXMKKyAgIHJ1bm5pbmcgb24gYSBDUFUsIG5vIG90aGVyIHNvZnRpcnEgd2lsbCBwcmVlbXB0IGl0LCBidXQgYSBoYXJkd2FyZQorICAgaW50ZXJydXB0IGNhbi4gIEhvd2V2ZXIsIGFueSBvdGhlciBDUFVzIGluIHRoZSBzeXN0ZW0gZXhlY3V0ZQorICAgaW5kZXBlbmRlbnRseS4KICAgPC9wYXJhPgogCiAgIDxwYXJhPgpAQCAtMTMwLDEwICsxMzAsMTAgQEAKICAgIDx0aXRsZT5Vc2VyIENvbnRleHQ8L3RpdGxlPgogCiAgICA8cGFyYT4KLSAgICBVc2VyIGNvbnRleHQgaXMgd2hlbiB5b3UgYXJlIGNvbWluZyBpbiBmcm9tIGEgc3lzdGVtIGNhbGwgb3IKLSAgICBvdGhlciB0cmFwOiB5b3UgY2FuIHNsZWVwLCBhbmQgeW91IG93biB0aGUgQ1BVIChleGNlcHQgZm9yCi0gICAgaW50ZXJydXB0cykgdW50aWwgeW91IGNhbGwgPGZ1bmN0aW9uPnNjaGVkdWxlKCk8L2Z1bmN0aW9uPi4gIAotICAgIEluIG90aGVyIHdvcmRzLCB1c2VyIGNvbnRleHQgKHVubGlrZSB1c2Vyc3BhY2UpIGlzIG5vdCBwcmUtZW1wdGFibGUuCisgICAgVXNlciBjb250ZXh0IGlzIHdoZW4geW91IGFyZSBjb21pbmcgaW4gZnJvbSBhIHN5c3RlbSBjYWxsIG9yIG90aGVyCisgICAgdHJhcDogbGlrZSB1c2Vyc3BhY2UsIHlvdSBjYW4gYmUgcHJlZW1wdGVkIGJ5IG1vcmUgaW1wb3J0YW50IHRhc2tzCisgICAgYW5kIGJ5IGludGVycnVwdHMuICBZb3UgY2FuIHNsZWVwLCBieSBjYWxsaW5nCisgICAgPGZ1bmN0aW9uPnNjaGVkdWxlKCk8L2Z1bmN0aW9uPi4KICAgIDwvcGFyYT4KIAogICAgPG5vdGU+CkBAIC0xNTMsNyArMTUzLDcgQEAKIAogICAgPGNhdXRpb24+CiAgICAgPHBhcmE+Ci0gICAgIEJld2FyZSB0aGF0IGlmIHlvdSBoYXZlIGludGVycnVwdHMgb3IgYm90dG9tIGhhbHZlcyBkaXNhYmxlZCAKKyAgICAgQmV3YXJlIHRoYXQgaWYgeW91IGhhdmUgcHJlZW1wdGlvbiBvciBzb2Z0aXJxcyBkaXNhYmxlZAogICAgICAoc2VlIGJlbG93KSwgPGZ1bmN0aW9uPmluX2ludGVycnVwdCgpPC9mdW5jdGlvbj4gd2lsbCByZXR1cm4gYSAKICAgICAgZmFsc2UgcG9zaXRpdmUuCiAgICAgPC9wYXJhPgpAQCAtMTY4LDEwICsxNjgsMTAgQEAKICAgICA8aGFyZHdhcmU+a2V5Ym9hcmQ8L2hhcmR3YXJlPiBhcmUgZXhhbXBsZXMgb2YgcmVhbAogICAgIGhhcmR3YXJlIHdoaWNoIHByb2R1Y2UgaW50ZXJydXB0cyBhdCBhbnkgdGltZS4gIFRoZSBrZXJuZWwgcnVucwogICAgIGludGVycnVwdCBoYW5kbGVycywgd2hpY2ggc2VydmljZXMgdGhlIGhhcmR3YXJlLiAgVGhlIGtlcm5lbAotICAgIGd1YXJhbnRlZXMgdGhhdCB0aGlzIGhhbmRsZXIgaXMgbmV2ZXIgcmUtZW50ZXJlZDogaWYgYW5vdGhlcgorICAgIGd1YXJhbnRlZXMgdGhhdCB0aGlzIGhhbmRsZXIgaXMgbmV2ZXIgcmUtZW50ZXJlZDogaWYgdGhlIHNhbWUKICAgICBpbnRlcnJ1cHQgYXJyaXZlcywgaXQgaXMgcXVldWVkIChvciBkcm9wcGVkKS4gIEJlY2F1c2UgaXQKICAgICBkaXNhYmxlcyBpbnRlcnJ1cHRzLCB0aGlzIGhhbmRsZXIgaGFzIHRvIGJlIGZhc3Q6IGZyZXF1ZW50bHkgaXQKLSAgICBzaW1wbHkgYWNrbm93bGVkZ2VzIHRoZSBpbnRlcnJ1cHQsIG1hcmtzIGEgYHNvZnR3YXJlIGludGVycnVwdCcKKyAgICBzaW1wbHkgYWNrbm93bGVkZ2VzIHRoZSBpbnRlcnJ1cHQsIG1hcmtzIGEgJ3NvZnR3YXJlIGludGVycnVwdCcKICAgICBmb3IgZXhlY3V0aW9uIGFuZCBleGl0cy4KICAgIDwvcGFyYT4KIApAQCAtMTg4LDYwICsxODgsNTIgQEAKICAgPC9zZWN0MT4KIAogICA8c2VjdDEgaWQ9ImJhc2ljcy1zb2Z0aXJxcyI+Ci0gICA8dGl0bGU+U29mdHdhcmUgSW50ZXJydXB0IENvbnRleHQ6IEJvdHRvbSBIYWx2ZXMsIFRhc2tsZXRzLCBzb2Z0aXJxczwvdGl0bGU+CisgICA8dGl0bGU+U29mdHdhcmUgSW50ZXJydXB0IENvbnRleHQ6IFNvZnRpcnFzIGFuZCBUYXNrbGV0czwvdGl0bGU+CiAKICAgIDxwYXJhPgogICAgIFdoZW5ldmVyIGEgc3lzdGVtIGNhbGwgaXMgYWJvdXQgdG8gcmV0dXJuIHRvIHVzZXJzcGFjZSwgb3IgYQotICAgIGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGV4aXRzLCBhbnkgYHNvZnR3YXJlIGludGVycnVwdHMnCisgICAgaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZXhpdHMsIGFueSAnc29mdHdhcmUgaW50ZXJydXB0cycKICAgICB3aGljaCBhcmUgbWFya2VkIHBlbmRpbmcgKHVzdWFsbHkgYnkgaGFyZHdhcmUgaW50ZXJydXB0cykgYXJlCiAgICAgcnVuICg8ZmlsZW5hbWU+a2VybmVsL3NvZnRpcnEuYzwvZmlsZW5hbWU+KS4KICAgIDwvcGFyYT4KIAogICAgPHBhcmE+CiAgICAgTXVjaCBvZiB0aGUgcmVhbCBpbnRlcnJ1cHQgaGFuZGxpbmcgd29yayBpcyBkb25lIGhlcmUuICBFYXJseSBpbgotICAgIHRoZSB0cmFuc2l0aW9uIHRvIDxhY3JvbnltPlNNUDwvYWNyb255bT4sIHRoZXJlIHdlcmUgb25seSBgYm90dG9tIAorICAgIHRoZSB0cmFuc2l0aW9uIHRvIDxhY3JvbnltPlNNUDwvYWNyb255bT4sIHRoZXJlIHdlcmUgb25seSAnYm90dG9tCiAgICAgaGFsdmVzJyAoQkhzKSwgd2hpY2ggZGlkbid0IHRha2UgYWR2YW50YWdlIG9mIG11bHRpcGxlIENQVXMuICBTaG9ydGx5IAogICAgIGFmdGVyIHdlIHN3aXRjaGVkIGZyb20gd2luZC11cCBjb21wdXRlcnMgbWFkZSBvZiBtYXRjaC1zdGlja3MgYW5kIHNub3QsCi0gICAgd2UgYWJhbmRvbmVkIHRoaXMgbGltaXRhdGlvbi4KKyAgICB3ZSBhYmFuZG9uZWQgdGhpcyBsaW1pdGF0aW9uIGFuZCBzd2l0Y2hlZCB0byAnc29mdGlycXMnLgogICAgPC9wYXJhPgogCiAgICA8cGFyYT4KICAgICA8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvbGludXgvaW50ZXJydXB0Lmg8L2ZpbGVuYW1lPiBsaXN0cyB0aGUKLSAgICBkaWZmZXJlbnQgQkgncy4gIE5vIG1hdHRlciBob3cgbWFueSBDUFVzIHlvdSBoYXZlLCBubyB0d28gQkhzIHdpbGwgcnVuIGF0IAotICAgIHRoZSBzYW1lIHRpbWUuIFRoaXMgbWFkZSB0aGUgdHJhbnNpdGlvbiB0byBTTVAgc2ltcGxlciwgYnV0IHN1Y2tzIGhhcmQgZm9yCi0gICAgc2NhbGFibGUgcGVyZm9ybWFuY2UuICBBIHZlcnkgaW1wb3J0YW50IGJvdHRvbSBoYWxmIGlzIHRoZSB0aW1lcgotICAgIEJIICg8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvbGludXgvdGltZXIuaDwvZmlsZW5hbWU+KTogeW91Ci0gICAgY2FuIHJlZ2lzdGVyIHRvIGhhdmUgaXQgY2FsbCBmdW5jdGlvbnMgZm9yIHlvdSBpbiBhIGdpdmVuIGxlbmd0aCBvZiB0aW1lLgorICAgIGRpZmZlcmVudCBzb2Z0aXJxcy4gIEEgdmVyeSBpbXBvcnRhbnQgc29mdGlycSBpcyB0aGUKKyAgICB0aW1lciBzb2Z0aXJxICg8ZmlsZW5hbWUKKyAgICBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC90aW1lci5oPC9maWxlbmFtZT4pOiB5b3UgY2FuCisgICAgcmVnaXN0ZXIgdG8gaGF2ZSBpdCBjYWxsIGZ1bmN0aW9ucyBmb3IgeW91IGluIGEgZ2l2ZW4gbGVuZ3RoIG9mCisgICAgdGltZS4KICAgIDwvcGFyYT4KIAogICAgPHBhcmE+Ci0gICAgMi4zLjQzIGludHJvZHVjZWQgc29mdGlycXMsIGFuZCByZS1pbXBsZW1lbnRlZCB0aGUgKG5vdwotICAgIGRlcHJlY2F0ZWQpIEJIcyB1bmRlcm5lYXRoIHRoZW0uICBTb2Z0aXJxcyBhcmUgZnVsbHktU01QCi0gICAgdmVyc2lvbnMgb2YgQkhzOiB0aGV5IGNhbiBydW4gb24gYXMgbWFueSBDUFVzIGF0IG9uY2UgYXMKLSAgICByZXF1aXJlZC4gIFRoaXMgbWVhbnMgdGhleSBuZWVkIHRvIGRlYWwgd2l0aCBhbnkgcmFjZXMgaW4gc2hhcmVkCi0gICAgZGF0YSB1c2luZyB0aGVpciBvd24gbG9ja3MuICBBIGJpdG1hc2sgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mCi0gICAgd2hpY2ggYXJlIGVuYWJsZWQsIHNvIHRoZSAzMiBhdmFpbGFibGUgc29mdGlycXMgc2hvdWxkIG5vdCBiZQotICAgIHVzZWQgdXAgbGlnaHRseS4gICg8ZW1waGFzaXM+WWVzPC9lbXBoYXNpcz4sIHBlb3BsZSB3aWxsCi0gICAgbm90aWNlKS4KLSAgIDwvcGFyYT4KLQotICAgPHBhcmE+Ci0gICAgdGFza2xldHMgKDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaDwvZmlsZW5hbWU+KQotICAgIGFyZSBsaWtlIHNvZnRpcnFzLCBleGNlcHQgdGhleSBhcmUgZHluYW1pY2FsbHktcmVnaXN0cmFibGUgKG1lYW5pbmcgeW91IAotICAgIGNhbiBoYXZlIGFzIG1hbnkgYXMgeW91IHdhbnQpLCBhbmQgdGhleSBhbHNvIGd1YXJhbnRlZSB0aGF0IGFueSB0YXNrbGV0IAotICAgIHdpbGwgb25seSBydW4gb24gb25lIENQVSBhdCBhbnkgdGltZSwgYWx0aG91Z2ggZGlmZmVyZW50IHRhc2tsZXRzIGNhbiAKLSAgICBydW4gc2ltdWx0YW5lb3VzbHkgKHVubGlrZSBkaWZmZXJlbnQgQkhzKS4gIAorICAgIFNvZnRpcnFzIGFyZSBvZnRlbiBhIHBhaW4gdG8gZGVhbCB3aXRoLCBzaW5jZSB0aGUgc2FtZSBzb2Z0aXJxCisgICAgd2lsbCBydW4gc2ltdWx0YW5lb3VzbHkgb24gbW9yZSB0aGFuIG9uZSBDUFUuICBGb3IgdGhpcyByZWFzb24sCisgICAgdGFza2xldHMgKDxmaWxlbmFtZQorICAgIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oPC9maWxlbmFtZT4pIGFyZSBtb3JlCisgICAgb2Z0ZW4gdXNlZDogdGhleSBhcmUgZHluYW1pY2FsbHktcmVnaXN0cmFibGUgKG1lYW5pbmcgeW91IGNhbiBoYXZlCisgICAgYXMgbWFueSBhcyB5b3Ugd2FudCksIGFuZCB0aGV5IGFsc28gZ3VhcmFudGVlIHRoYXQgYW55IHRhc2tsZXQKKyAgICB3aWxsIG9ubHkgcnVuIG9uIG9uZSBDUFUgYXQgYW55IHRpbWUsIGFsdGhvdWdoIGRpZmZlcmVudCB0YXNrbGV0cworICAgIGNhbiBydW4gc2ltdWx0YW5lb3VzbHkuCiAgICA8L3BhcmE+CiAgICA8Y2F1dGlvbj4KICAgICA8cGFyYT4KLSAgICAgVGhlIG5hbWUgYHRhc2tsZXQnIGlzIG1pc2xlYWRpbmc6IHRoZXkgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggYHRhc2tzJywgCisgICAgIFRoZSBuYW1lICd0YXNrbGV0JyBpcyBtaXNsZWFkaW5nOiB0aGV5IGhhdmUgbm90aGluZyB0byBkbyB3aXRoICd0YXNrcycsCiAgICAgIGFuZCBwcm9iYWJseSBtb3JlIHRvIGRvIHdpdGggc29tZSBiYWQgdm9ka2EgQWxleGV5IEt1em5ldHNvdiBoYWQgYXQgdGhlIAogICAgICB0aW1lLgogICAgIDwvcGFyYT4KICAgIDwvY2F1dGlvbj4KIAogICAgPHBhcmE+Ci0gICAgWW91IGNhbiB0ZWxsIHlvdSBhcmUgaW4gYSBzb2Z0aXJxIChvciBib3R0b20gaGFsZiwgb3IgdGFza2xldCkKKyAgICBZb3UgY2FuIHRlbGwgeW91IGFyZSBpbiBhIHNvZnRpcnEgKG9yIHRhc2tsZXQpCiAgICAgdXNpbmcgdGhlIDxmdW5jdGlvbj5pbl9zb2Z0aXJxKCk8L2Z1bmN0aW9uPiBtYWNybyAKICAgICAoPGZpbGVuYW1lIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oPC9maWxlbmFtZT4pLgogICAgPC9wYXJhPgpAQCAtMjg4LDExICsyODAsMTAgQEAKICAgICA8dGVybT5BIHJpZ2lkIHN0YWNrIGxpbWl0PC90ZXJtPgogICAgIDxsaXN0aXRlbT4KICAgICAgPHBhcmE+Ci0gICAgICBUaGUga2VybmVsIHN0YWNrIGlzIGFib3V0IDZLIGluIDIuMiAoZm9yIG1vc3QKLSAgICAgIGFyY2hpdGVjdHVyZXM6IGl0J3MgYWJvdXQgMTRLIG9uIHRoZSBBbHBoYSksIGFuZCBzaGFyZWQKLSAgICAgIHdpdGggaW50ZXJydXB0cyBzbyB5b3UgY2FuJ3QgdXNlIGl0IGFsbC4gIEF2b2lkIGRlZXAKLSAgICAgIHJlY3Vyc2lvbiBhbmQgaHVnZSBsb2NhbCBhcnJheXMgb24gdGhlIHN0YWNrIChhbGxvY2F0ZQotICAgICAgdGhlbSBkeW5hbWljYWxseSBpbnN0ZWFkKS4KKyAgICAgIERlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhlIGtlcm5lbCBzdGFjayBpcyBhYm91dCAzSyB0byA2SyBmb3IgbW9zdCAzMi1iaXQgYXJjaGl0ZWN0dXJlczogaXQncworICAgICAgYWJvdXQgMTRLIG9uIG1vc3QgNjQtYml0IGFyY2hzLCBhbmQgb2Z0ZW4gc2hhcmVkIHdpdGggaW50ZXJydXB0cworICAgICAgc28geW91IGNhbid0IHVzZSBpdCBhbGwuICBBdm9pZCBkZWVwIHJlY3Vyc2lvbiBhbmQgaHVnZSBsb2NhbAorICAgICAgYXJyYXlzIG9uIHRoZSBzdGFjayAoYWxsb2NhdGUgdGhlbSBkeW5hbWljYWxseSBpbnN0ZWFkKS4KICAgICAgPC9wYXJhPgogICAgIDwvbGlzdGl0ZW0+CiAgICA8L3Zhcmxpc3RlbnRyeT4KQEAgLTMzOSw3ICszMzAsNyBAQAogCiAgIDxwYXJhPgogICAgSWYgYWxsIHlvdXIgcm91dGluZSBkb2VzIGlzIHJlYWQgb3Igd3JpdGUgc29tZSBwYXJhbWV0ZXIsIGNvbnNpZGVyCi0gICBpbXBsZW1lbnRpbmcgYSA8ZnVuY3Rpb24+c3lzY3RsPC9mdW5jdGlvbj4gaW50ZXJmYWNlIGluc3RlYWQuCisgICBpbXBsZW1lbnRpbmcgYSA8ZnVuY3Rpb24+c3lzZnM8L2Z1bmN0aW9uPiBpbnRlcmZhY2UgaW5zdGVhZC4KICAgPC9wYXJhPgogCiAgIDxwYXJhPgpAQCAtNDE3LDcgKzQwOCwxMCBAQAogICA8L3BhcmE+CiAKICAgPHBhcmE+Ci0gICBZb3Ugd2lsbCBldmVudHVhbGx5IGxvY2sgdXAgeW91ciBib3ggaWYgeW91IGJyZWFrIHRoZXNlIHJ1bGVzLiAgCisgICBZb3Ugc2hvdWxkIGFsd2F5cyBjb21waWxlIHlvdXIga2VybmVsCisgICA8c3ltYm9sPkNPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUDwvc3ltYm9sPiBvbiwgYW5kIGl0IHdpbGwgd2FybgorICAgeW91IGlmIHlvdSBicmVhayB0aGVzZSBydWxlcy4gIElmIHlvdSA8ZW1waGFzaXM+ZG88L2VtcGhhc2lzPiBicmVhaworICAgdGhlIHJ1bGVzLCB5b3Ugd2lsbCBldmVudHVhbGx5IGxvY2sgdXAgeW91ciBib3guCiAgIDwvcGFyYT4KIAogICA8cGFyYT4KQEAgLTUxNSw4ICs1MDksNyBAQAogICAgICAgc3VjY2VzcykuCiAgICAgIDwvcGFyYT4KICAgICA8L2NhdXRpb24+Ci0gICAgW1llcywgdGhpcyBtb3JvbmljIGludGVyZmFjZSBtYWtlcyBtZSBjcmluZ2UuICBQbGVhc2Ugc3VibWl0IGEKLSAgICBwYXRjaCBhbmQgYmVjb21lIG15IGhlcm8gLS1SUi5dCisgICAgW1llcywgdGhpcyBtb3JvbmljIGludGVyZmFjZSBtYWtlcyBtZSBjcmluZ2UuICBUaGUgZmxhbWV3YXIgY29tZXMgdXAgZXZlcnkgeWVhciBvciBzby4gLS1SUi5dCiAgICA8L3BhcmE+CiAgICA8cGFyYT4KICAgICBUaGUgZnVuY3Rpb25zIG1heSBzbGVlcCBpbXBsaWNpdGx5LiBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQKQEAgLTU4NywxMCArNTgwLDExIEBACiAgICA8L3ZhcmlhYmxlbGlzdD4KIAogICAgPHBhcmE+Ci0gICAgSWYgeW91IHNlZSBhIDxlcnJvcm5hbWU+a21lbV9ncm93OiBDYWxsZWQgbm9uYXRvbWljYWxseSBmcm9tIGludAotICAgIDwvZXJyb3JuYW1lPiB3YXJuaW5nIG1lc3NhZ2UgeW91IGNhbGxlZCBhIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uCi0gICAgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCB3aXRob3V0IDxjb25zdGFudD5HRlBfQVRPTUlDPC9jb25zdGFudD4uCi0gICAgWW91IHNob3VsZCByZWFsbHkgZml4IHRoYXQuICBSdW4sIGRvbid0IHdhbGsuCisgICAgSWYgeW91IHNlZSBhIDxlcnJvcm5hbWU+c2xlZXBpbmcgZnVuY3Rpb24gY2FsbGVkIGZyb20gaW52YWxpZAorICAgIGNvbnRleHQ8L2Vycm9ybmFtZT4gd2FybmluZyBtZXNzYWdlLCB0aGVuIG1heWJlIHlvdSBjYWxsZWQgYQorICAgIHNsZWVwaW5nIGFsbG9jYXRpb24gZnVuY3Rpb24gZnJvbSBpbnRlcnJ1cHQgY29udGV4dCB3aXRob3V0CisgICAgPGNvbnN0YW50PkdGUF9BVE9NSUM8L2NvbnN0YW50Pi4gIFlvdSBzaG91bGQgcmVhbGx5IGZpeCB0aGF0LgorICAgIFJ1biwgZG9uJ3Qgd2Fsay4KICAgIDwvcGFyYT4KIAogICAgPHBhcmE+CkBAIC02MzksMTYgKzYzMywxNiBAQAogICA8L3NlY3QxPgogCiAgIDxzZWN0MSBpZD0icm91dGluZXMtdWRlbGF5Ij4KLSAgIDx0aXRsZT48ZnVuY3Rpb24+dWRlbGF5KCk8L2Z1bmN0aW9uPi88ZnVuY3Rpb24+bWRlbGF5KCk8L2Z1bmN0aW9uPgorICAgPHRpdGxlPjxmdW5jdGlvbj5tZGVsYXkoKTwvZnVuY3Rpb24+LzxmdW5jdGlvbj51ZGVsYXkoKTwvZnVuY3Rpb24+CiAgICAgIDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9hc20vZGVsYXkuaDwvZmlsZW5hbWU+CiAgICAgIDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC9kZWxheS5oPC9maWxlbmFtZT4KICAgIDwvdGl0bGU+CiAKICAgIDxwYXJhPgotICAgIFRoZSA8ZnVuY3Rpb24+dWRlbGF5KCk8L2Z1bmN0aW9uPiBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3Igc21hbGwgcGF1c2VzLgotICAgIERvIG5vdCB1c2UgbGFyZ2UgdmFsdWVzIHdpdGggPGZ1bmN0aW9uPnVkZWxheSgpPC9mdW5jdGlvbj4gYXMgeW91IHJpc2sKKyAgICBUaGUgPGZ1bmN0aW9uPnVkZWxheSgpPC9mdW5jdGlvbj4gYW5kIDxmdW5jdGlvbj5uZGVsYXkoKTwvZnVuY3Rpb24+IGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBmb3Igc21hbGwgcGF1c2VzLgorICAgIERvIG5vdCB1c2UgbGFyZ2UgdmFsdWVzIHdpdGggdGhlbSBhcyB5b3UgcmlzawogICAgIG92ZXJmbG93IC0gdGhlIGhlbHBlciBmdW5jdGlvbiA8ZnVuY3Rpb24+bWRlbGF5KCk8L2Z1bmN0aW9uPiBpcyB1c2VmdWwKLSAgICBoZXJlLCBvciBldmVuIGNvbnNpZGVyIDxmdW5jdGlvbj5zY2hlZHVsZV90aW1lb3V0KCk8L2Z1bmN0aW9uPi4KKyAgICBoZXJlLCBvciBjb25zaWRlciA8ZnVuY3Rpb24+bXNsZWVwKCk8L2Z1bmN0aW9uPi4KICAgIDwvcGFyYT4gCiAgIDwvc2VjdDE+CiAgCkBAIC02OTgsOCArNjkyLDggQEAKICAgICBUaGVzZSByb3V0aW5lcyBkaXNhYmxlIHNvZnQgaW50ZXJydXB0cyBvbiB0aGUgbG9jYWwgQ1BVLCBhbmQKICAgICByZXN0b3JlIHRoZW0uICBUaGV5IGFyZSByZWVudHJhbnQ7IGlmIHNvZnQgaW50ZXJydXB0cyB3ZXJlCiAgICAgZGlzYWJsZWQgYmVmb3JlLCB0aGV5IHdpbGwgc3RpbGwgYmUgZGlzYWJsZWQgYWZ0ZXIgdGhpcyBwYWlyCi0gICAgb2YgZnVuY3Rpb25zIGhhcyBiZWVuIGNhbGxlZC4gIFRoZXkgcHJldmVudCBzb2Z0aXJxcywgdGFza2xldHMKLSAgICBhbmQgYm90dG9tIGhhbHZlcyBmcm9tIHJ1bm5pbmcgb24gdGhlIGN1cnJlbnQgQ1BVLgorICAgIG9mIGZ1bmN0aW9ucyBoYXMgYmVlbiBjYWxsZWQuICBUaGV5IHByZXZlbnQgc29mdGlycXMgYW5kIHRhc2tsZXRzCisgICAgZnJvbSBydW5uaW5nIG9uIHRoZSBjdXJyZW50IENQVS4KICAgIDwvcGFyYT4KICAgPC9zZWN0MT4KIApAQCAtNzA4LDEwICs3MDIsMTYgQEAKICAgICA8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvYXNtL3NtcC5oPC9maWxlbmFtZT48L3RpdGxlPgogICAgCiAgICA8cGFyYT4KLSAgICA8ZnVuY3Rpb24+c21wX3Byb2Nlc3Nvcl9pZCgpPC9mdW5jdGlvbj4gcmV0dXJucyB0aGUgY3VycmVudAotICAgIHByb2Nlc3NvciBudW1iZXIsIGJldHdlZW4gMCBhbmQgPHN5bWJvbD5OUl9DUFVTPC9zeW1ib2w+ICh0aGUKLSAgICBtYXhpbXVtIG51bWJlciBvZiBDUFVzIHN1cHBvcnRlZCBieSBMaW51eCwgY3VycmVudGx5IDMyKS4gIFRoZXNlCi0gICAgdmFsdWVzIGFyZSBub3QgbmVjZXNzYXJpbHkgY29udGludW91cy4KKyAgICA8ZnVuY3Rpb24+Z2V0X2NwdSgpPC9mdW5jdGlvbj4gZGlzYWJsZXMgcHJlZW1wdGlvbiAoc28geW91IHdvbid0CisgICAgc3VkZGVubHkgZ2V0IG1vdmVkIHRvIGFub3RoZXIgQ1BVKSBhbmQgcmV0dXJucyB0aGUgY3VycmVudAorICAgIHByb2Nlc3NvciBudW1iZXIsIGJldHdlZW4gMCBhbmQgPHN5bWJvbD5OUl9DUFVTPC9zeW1ib2w+LiAgTm90ZQorICAgIHRoYXQgdGhlIENQVSBudW1iZXJzIGFyZSBub3QgbmVjZXNzYXJpbHkgY29udGludW91cy4gIFlvdSByZXR1cm4KKyAgICBpdCBhZ2FpbiB3aXRoIDxmdW5jdGlvbj5wdXRfY3B1KCk8L2Z1bmN0aW9uPiB3aGVuIHlvdSBhcmUgZG9uZS4KKyAgIDwvcGFyYT4KKyAgIDxwYXJhPgorICAgIElmIHlvdSBrbm93IHlvdSBjYW5ub3QgYmUgcHJlZW1wdGVkIGJ5IGFub3RoZXIgdGFzayAoaWUuIHlvdSBhcmUKKyAgICBpbiBpbnRlcnJ1cHQgY29udGV4dCwgb3IgaGF2ZSBwcmVlbXB0aW9uIGRpc2FibGVkKSB5b3UgY2FuIHVzZQorICAgIHNtcF9wcm9jZXNzb3JfaWQoKS4KICAgIDwvcGFyYT4KICAgPC9zZWN0MT4KIApAQCAtNzIyLDE5ICs3MjIsMTQgQEAKICAgIDxwYXJhPgogICAgIEFmdGVyIGJvb3QsIHRoZSBrZXJuZWwgZnJlZXMgdXAgYSBzcGVjaWFsIHNlY3Rpb247IGZ1bmN0aW9ucwogICAgIG1hcmtlZCB3aXRoIDx0eXBlPl9faW5pdDwvdHlwZT4gYW5kIGRhdGEgc3RydWN0dXJlcyBtYXJrZWQgd2l0aAotICAgIDx0eXBlPl9faW5pdGRhdGE8L3R5cGU+IGFyZSBkcm9wcGVkIGFmdGVyIGJvb3QgaXMgY29tcGxldGUgKHdpdGhpbgotICAgIG1vZHVsZXMgdGhpcyBkaXJlY3RpdmUgaXMgY3VycmVudGx5IGlnbm9yZWQpLiAgPHR5cGU+X19leGl0PC90eXBlPgorICAgIDx0eXBlPl9faW5pdGRhdGE8L3R5cGU+IGFyZSBkcm9wcGVkIGFmdGVyIGJvb3QgaXMgY29tcGxldGU6IHNpbWlsYXJseQorICAgIG1vZHVsZXMgZGlzY2FyZCB0aGlzIG1lbW9yeSBhZnRlciBpbml0aWFsaXphdGlvbi4gIDx0eXBlPl9fZXhpdDwvdHlwZT4KICAgICBpcyB1c2VkIHRvIGRlY2xhcmUgYSBmdW5jdGlvbiB3aGljaCBpcyBvbmx5IHJlcXVpcmVkIG9uIGV4aXQ6IHRoZQogICAgIGZ1bmN0aW9uIHdpbGwgYmUgZHJvcHBlZCBpZiB0aGlzIGZpbGUgaXMgbm90IGNvbXBpbGVkIGFzIGEgbW9kdWxlLgogICAgIFNlZSB0aGUgaGVhZGVyIGZpbGUgZm9yIHVzZS4gTm90ZSB0aGF0IGl0IG1ha2VzIG5vIHNlbnNlIGZvciBhIGZ1bmN0aW9uCiAgICAgbWFya2VkIHdpdGggPHR5cGU+X19pbml0PC90eXBlPiB0byBiZSBleHBvcnRlZCB0byBtb2R1bGVzIHdpdGggCiAgICAgPGZ1bmN0aW9uPkVYUE9SVF9TWU1CT0woKTwvZnVuY3Rpb24+IC0gdGhpcyB3aWxsIGJyZWFrLgogICAgPC9wYXJhPgotICAgPHBhcmE+Ci0gICBTdGF0aWMgZGF0YSBzdHJ1Y3R1cmVzIG1hcmtlZCBhcyA8dHlwZT5fX2luaXRkYXRhPC90eXBlPiBtdXN0IGJlIGluaXRpYWxpc2VkCi0gICAoYXMgb3Bwb3NlZCB0byBvcmRpbmFyeSBzdGF0aWMgZGF0YSB3aGljaCBpcyB6ZXJvZWQgQlNTKSBhbmQgY2Fubm90IGJlIAotICAgPHR5cGU+Y29uc3Q8L3R5cGU+LgotICAgPC9wYXJhPiAKIAogICA8L3NlY3QxPgogCkBAIC03NjIsOSArNzU3LDggQEAKICAgIDxwYXJhPgogICAgIFRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIHRvIGNhdXNlCiAgICAgbW9kdWxlIGxvYWRpbmcgdG8gZmFpbCAodW5mb3J0dW5hdGVseSwgdGhpcyBoYXMgbm8gZWZmZWN0IGlmCi0gICAgdGhlIG1vZHVsZSBpcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwpLiAgRm9yIG1vZHVsZXMsIHRoaXMgaXMKLSAgICBjYWxsZWQgaW4gdXNlciBjb250ZXh0LCB3aXRoIGludGVycnVwdHMgZW5hYmxlZCwgYW5kIHRoZQotICAgIGtlcm5lbCBsb2NrIGhlbGQsIHNvIGl0IGNhbiBzbGVlcC4KKyAgICB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCkuICBUaGlzIGZ1bmN0aW9uIGlzCisgICAgY2FsbGVkIGluIHVzZXIgY29udGV4dCB3aXRoIGludGVycnVwdHMgZW5hYmxlZCwgc28gaXQgY2FuIHNsZWVwLgogICAgPC9wYXJhPgogICA8L3NlY3QxPgogICAKQEAgLTc3OSw2ICs3NzMsMzQgQEAKICAgICByZWFjaGVkIHplcm8uICBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIHNsZWVwLCBidXQgY2Fubm90IGZhaWw6CiAgICAgZXZlcnl0aGluZyBtdXN0IGJlIGNsZWFuZWQgdXAgYnkgdGhlIHRpbWUgaXQgcmV0dXJucy4KICAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgTm90ZSB0aGF0IHRoaXMgbWFjcm8gaXMgb3B0aW9uYWw6IGlmIGl0IGlzIG5vdCBwcmVzZW50LCB5b3VyCisgICAgbW9kdWxlIHdpbGwgbm90IGJlIHJlbW92YWJsZSAoZXhjZXB0IGZvciAncm1tb2QgLWYnKS4KKyAgIDwvcGFyYT4KKyAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9InJvdXRpbmVzLW1vZHVsZS11c2UtY291bnRlcnMiPgorICAgPHRpdGxlPiA8ZnVuY3Rpb24+dHJ5X21vZHVsZV9nZXQoKTwvZnVuY3Rpb24+LzxmdW5jdGlvbj5tb2R1bGVfcHV0KCk8L2Z1bmN0aW9uPgorICAgIDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC9tb2R1bGUuaDwvZmlsZW5hbWU+PC90aXRsZT4KKworICAgPHBhcmE+CisgICAgVGhlc2UgbWFuaXB1bGF0ZSB0aGUgbW9kdWxlIHVzYWdlIGNvdW50LCB0byBwcm90ZWN0IGFnYWluc3QKKyAgICByZW1vdmFsIChhIG1vZHVsZSBhbHNvIGNhbid0IGJlIHJlbW92ZWQgaWYgYW5vdGhlciBtb2R1bGUgdXNlcyBvbmUKKyAgICBvZiBpdHMgZXhwb3J0ZWQgc3ltYm9sczogc2VlIGJlbG93KS4gIEJlZm9yZSBjYWxsaW5nIGludG8gbW9kdWxlCisgICAgY29kZSwgeW91IHNob3VsZCBjYWxsIDxmdW5jdGlvbj50cnlfbW9kdWxlX2dldCgpPC9mdW5jdGlvbj4gb24KKyAgICB0aGF0IG1vZHVsZTogaWYgaXQgZmFpbHMsIHRoZW4gdGhlIG1vZHVsZSBpcyBiZWluZyByZW1vdmVkIGFuZCB5b3UKKyAgICBzaG91bGQgYWN0IGFzIGlmIGl0IHdhc24ndCB0aGVyZS4gIE90aGVyd2lzZSwgeW91IGNhbiBzYWZlbHkgZW50ZXIKKyAgICB0aGUgbW9kdWxlLCBhbmQgY2FsbCA8ZnVuY3Rpb24+bW9kdWxlX3B1dCgpPC9mdW5jdGlvbj4gd2hlbiB5b3UncmUKKyAgICBmaW5pc2hlZC4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICBNb3N0IHJlZ2lzdGVyYWJsZSBzdHJ1Y3R1cmVzIGhhdmUgYW4KKyAgIDxzdHJ1Y3RmaWVsZD5vd25lcjwvc3RydWN0ZmllbGQ+IGZpZWxkLCBzdWNoIGFzIGluIHRoZQorICAgPHN0cnVjdG5hbWU+ZmlsZV9vcGVyYXRpb25zPC9zdHJ1Y3RuYW1lPiBzdHJ1Y3R1cmUuIFNldCB0aGlzIGZpZWxkCisgICB0byB0aGUgbWFjcm8gPHN5bWJvbD5USElTX01PRFVMRTwvc3ltYm9sPi4KKyAgIDwvcGFyYT4KICAgPC9zZWN0MT4KIAogIDwhLS0gYWRkIGluZm8gb24gbmV3LXN0eWxlIG1vZHVsZSByZWZjb3VudGluZyBoZXJlIC0tPgpAQCAtODIxLDcgKzg0Myw3IEBACiAgICAgVGhlcmUgaXMgYSBtYWNybyB0byBkbyB0aGlzOgogICAgIDxmdW5jdGlvbj53YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKTwvZnVuY3Rpb24+CiAKLSAgICA8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvbGludXgvc2NoZWQuaDwvZmlsZW5hbWU+IFRoZQorICAgIDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC93YWl0Lmg8L2ZpbGVuYW1lPiBUaGUKICAgICBmaXJzdCBhcmd1bWVudCBpcyB0aGUgd2FpdCBxdWV1ZSBoZWFkLCBhbmQgdGhlIHNlY29uZCBpcyBhbgogICAgIGV4cHJlc3Npb24gd2hpY2ggaXMgZXZhbHVhdGVkOyB0aGUgbWFjcm8gcmV0dXJucwogICAgIDxyZXR1cm52YWx1ZT4wPC9yZXR1cm52YWx1ZT4gd2hlbiB0aGlzIGV4cHJlc3Npb24gaXMgdHJ1ZSwgb3IKQEAgLTg0NywxMCArODY5LDExIEBACiAgICA8cGFyYT4KICAgICBDYWxsIDxmdW5jdGlvbj53YWtlX3VwKCk8L2Z1bmN0aW9uPgogCi0gICAgPGZpbGVuYW1lIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2xpbnV4L3NjaGVkLmg8L2ZpbGVuYW1lPjssCisgICAgPGZpbGVuYW1lIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2xpbnV4L3dhaXQuaDwvZmlsZW5hbWU+OywKICAgICB3aGljaCB3aWxsIHdha2UgdXAgZXZlcnkgcHJvY2VzcyBpbiB0aGUgcXVldWUuICBUaGUgZXhjZXB0aW9uIGlzCiAgICAgaWYgb25lIGhhcyA8Y29uc3RhbnQ+VEFTS19FWENMVVNJVkU8L2NvbnN0YW50PiBzZXQsIGluIHdoaWNoIGNhc2UKLSAgICB0aGUgcmVtYWluZGVyIG9mIHRoZSBxdWV1ZSB3aWxsIG5vdCBiZSB3b2tlbi4KKyAgICB0aGUgcmVtYWluZGVyIG9mIHRoZSBxdWV1ZSB3aWxsIG5vdCBiZSB3b2tlbi4gIFRoZXJlIGFyZSBvdGhlciB2YXJpYW50cworICAgIG9mIHRoaXMgYmFzaWMgZnVuY3Rpb24gYXZhaWxhYmxlIGluIHRoZSBzYW1lIGhlYWRlci4KICAgIDwvcGFyYT4KICAgPC9zZWN0MT4KICA8L2NoYXB0ZXI+CkBAIC04NjMsNyArODg2LDcgQEAKICAgIGZpcnN0IGNsYXNzIG9mIG9wZXJhdGlvbnMgd29yayBvbiA8dHlwZT5hdG9taWNfdDwvdHlwZT4KIAogICAgPGZpbGVuYW1lIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2FzbS9hdG9taWMuaDwvZmlsZW5hbWU+OyB0aGlzCi0gICBjb250YWlucyBhIHNpZ25lZCBpbnRlZ2VyIChhdCBsZWFzdCAyNCBiaXRzIGxvbmcpLCBhbmQgeW91IG11c3QgdXNlCisgICBjb250YWlucyBhIHNpZ25lZCBpbnRlZ2VyIChhdCBsZWFzdCAzMiBiaXRzIGxvbmcpLCBhbmQgeW91IG11c3QgdXNlCiAgICB0aGVzZSBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBvciByZWFkIGF0b21pY190IHZhcmlhYmxlcy4KICAgIDxmdW5jdGlvbj5hdG9taWNfcmVhZCgpPC9mdW5jdGlvbj4gYW5kCiAgICA8ZnVuY3Rpb24+YXRvbWljX3NldCgpPC9mdW5jdGlvbj4gZ2V0IGFuZCBzZXQgdGhlIGNvdW50ZXIsCkBAIC04ODIsMTMgKzkwNSwxMiBAQAogCiAgIDxwYXJhPgogICAgTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgc2xvd2VyIHRoYW4gbm9ybWFsIGFyaXRobWV0aWMsIGFuZAotICAgc28gc2hvdWxkIG5vdCBiZSB1c2VkIHVubmVjZXNzYXJpbHkuICBPbiBzb21lIHBsYXRmb3JtcyB0aGV5Ci0gICBhcmUgbXVjaCBzbG93ZXIsIGxpa2UgMzItYml0IFNwYXJjIHdoZXJlIHRoZXkgdXNlIGEgc3BpbmxvY2suCisgICBzbyBzaG91bGQgbm90IGJlIHVzZWQgdW5uZWNlc3NhcmlseS4KICAgPC9wYXJhPgogCiAgIDxwYXJhPgotICAgVGhlIHNlY29uZCBjbGFzcyBvZiBhdG9taWMgb3BlcmF0aW9ucyBpcyBhdG9taWMgYml0IG9wZXJhdGlvbnMgb24gYQotICAgPHR5cGU+bG9uZzwvdHlwZT4sIGRlZmluZWQgaW4KKyAgIFRoZSBzZWNvbmQgY2xhc3Mgb2YgYXRvbWljIG9wZXJhdGlvbnMgaXMgYXRvbWljIGJpdCBvcGVyYXRpb25zIG9uIGFuCisgICA8dHlwZT51bnNpZ25lZCBsb25nPC90eXBlPiwgZGVmaW5lZCBpbgogCiAgICA8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvbGludXgvYml0b3BzLmg8L2ZpbGVuYW1lPi4gIFRoZXNlCiAgICBvcGVyYXRpb25zIGdlbmVyYWxseSB0YWtlIGEgcG9pbnRlciB0byB0aGUgYml0IHBhdHRlcm4sIGFuZCBhIGJpdApAQCAtODk5LDcgKzkyMSw3IEBACiAgICA8ZnVuY3Rpb24+dGVzdF9hbmRfY2xlYXJfYml0KCk8L2Z1bmN0aW9uPiBhbmQKICAgIDxmdW5jdGlvbj50ZXN0X2FuZF9jaGFuZ2VfYml0KCk8L2Z1bmN0aW9uPiBkbyB0aGUgc2FtZSB0aGluZywKICAgIGV4Y2VwdCByZXR1cm4gdHJ1ZSBpZiB0aGUgYml0IHdhcyBwcmV2aW91c2x5IHNldDsgdGhlc2UgYXJlCi0gICBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciB2ZXJ5IHNpbXBsZSBsb2NraW5nLgorICAgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgYXRvbWljYWxseSBzZXR0aW5nIGZsYWdzLgogICA8L3BhcmE+CiAgIAogICA8cGFyYT4KQEAgLTkwNywxMiArOTI5LDYgQEAKICAgIHRoYW4gQklUU19QRVJfTE9ORy4gIFRoZSByZXN1bHRpbmcgYmVoYXZpb3IgaXMgc3RyYW5nZSBvbiBiaWctZW5kaWFuCiAgICBwbGF0Zm9ybXMgdGhvdWdoIHNvIGl0IGlzIGEgZ29vZCBpZGVhIG5vdCB0byBkbyB0aGlzLgogICA8L3BhcmE+Ci0KLSAgPHBhcmE+Ci0gICBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIGJpdHMgZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlLCBhbmQgaW4KLSAgIHBhcnRpY3VsYXIsIHRoZSBiaXRmaWVsZCBwYXNzZWQgdG8gdGhlc2Ugb3BlcmF0aW9ucyBtdXN0IGJlIGF0Ci0gICBsZWFzdCBhcyBsYXJnZSBhcyBhIDx0eXBlPmxvbmc8L3R5cGU+LgotICA8L3BhcmE+CiAgPC9jaGFwdGVyPgogCiAgPGNoYXB0ZXIgaWQ9InN5bWJvbHMiPgpAQCAtOTMyLDExICs5NDgsOCBAQAogICAgIDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC9tb2R1bGUuaDwvZmlsZW5hbWU+PC90aXRsZT4KIAogICAgPHBhcmE+Ci0gICAgVGhpcyBpcyB0aGUgY2xhc3NpYyBtZXRob2Qgb2YgZXhwb3J0aW5nIGEgc3ltYm9sLCBhbmQgaXQgd29ya3MKLSAgICBmb3IgYm90aCBtb2R1bGVzIGFuZCBub24tbW9kdWxlcy4gIEluIHRoZSBrZXJuZWwgYWxsIHRoZXNlCi0gICAgZGVjbGFyYXRpb25zIGFyZSBvZnRlbiBidW5kbGVkIGludG8gYSBzaW5nbGUgZmlsZSB0byBoZWxwCi0gICAgZ2Vua3N5bXMgKHdoaWNoIHNlYXJjaGVzIHNvdXJjZSBmaWxlcyBmb3IgdGhlc2UgZGVjbGFyYXRpb25zKS4KLSAgICBTZWUgdGhlIGNvbW1lbnQgb24gZ2Vua3N5bXMgYW5kIE1ha2VmaWxlcyBiZWxvdy4KKyAgICBUaGlzIGlzIHRoZSBjbGFzc2ljIG1ldGhvZCBvZiBleHBvcnRpbmcgYSBzeW1ib2w6IGR5bmFtaWNhbGx5CisgICAgbG9hZGVkIG1vZHVsZXMgd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgc3ltYm9sIGFzIG5vcm1hbC4KICAgIDwvcGFyYT4KICAgPC9zZWN0MT4KIApAQCAtOTQ5LDcgKzk2Miw4IEBACiAgICAgc3ltYm9scyBleHBvcnRlZCBieSA8ZnVuY3Rpb24+RVhQT1JUX1NZTUJPTF9HUEwoKTwvZnVuY3Rpb24+IGNhbgogICAgIG9ubHkgYmUgc2VlbiBieSBtb2R1bGVzIHdpdGggYQogICAgIDxmdW5jdGlvbj5NT0RVTEVfTElDRU5TRSgpPC9mdW5jdGlvbj4gdGhhdCBzcGVjaWZpZXMgYSBHUEwKLSAgICBjb21wYXRpYmxlIGxpY2Vuc2UuCisgICAgY29tcGF0aWJsZSBsaWNlbnNlLiAgSXQgaW1wbGllcyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBjb25zaWRlcmVkCisgICAgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gaXNzdWUsIGFuZCBub3QgcmVhbGx5IGFuIGludGVyZmFjZS4KICAgIDwvcGFyYT4KICAgPC9zZWN0MT4KICA8L2NoYXB0ZXI+CkBAIC05NjIsMTIgKzk3NiwxMyBAQAogICAgIDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC9saXN0Lmg8L2ZpbGVuYW1lPjwvdGl0bGU+CiAKICAgIDxwYXJhPgotICAgIFRoZXJlIGFyZSB0aHJlZSBzZXRzIG9mIGxpbmtlZC1saXN0IHJvdXRpbmVzIGluIHRoZSBrZXJuZWwKLSAgICBoZWFkZXJzLCBidXQgdGhpcyBvbmUgc2VlbXMgdG8gYmUgd2lubmluZyBvdXQgKGFuZCBMaW51cyBoYXMKLSAgICB1c2VkIGl0KS4gIElmIHlvdSBkb24ndCBoYXZlIHNvbWUgcGFydGljdWxhciBwcmVzc2luZyBuZWVkIGZvcgotICAgIGEgc2luZ2xlIGxpc3QsIGl0J3MgYSBnb29kIGNob2ljZS4gIEluIGZhY3QsIEkgZG9uJ3QgY2FyZQotICAgIHdoZXRoZXIgaXQncyBhIGdvb2QgY2hvaWNlIG9yIG5vdCwganVzdCB1c2UgaXQgc28gd2UgY2FuIGdldAotICAgIHJpZCBvZiB0aGUgb3RoZXJzLgorICAgIFRoZXJlIHVzZWQgdG8gYmUgdGhyZWUgc2V0cyBvZiBsaW5rZWQtbGlzdCByb3V0aW5lcyBpbiB0aGUga2VybmVsCisgICAgaGVhZGVycywgYnV0IHRoaXMgb25lIGlzIHRoZSB3aW5uZXIuICBJZiB5b3UgZG9uJ3QgaGF2ZSBzb21lCisgICAgcGFydGljdWxhciBwcmVzc2luZyBuZWVkIGZvciBhIHNpbmdsZSBsaXN0LCBpdCdzIGEgZ29vZCBjaG9pY2UuCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgIEluIHBhcnRpY3VsYXIsIDxmdW5jdGlvbj5saXN0X2Zvcl9lYWNoX2VudHJ5PC9mdW5jdGlvbj4gaXMgdXNlZnVsLgogICAgPC9wYXJhPgogICA8L3NlY3QxPgogCkBAIC05NzksMTQgKzk5NCwxMyBAQAogICAgIGNvbnZlbnRpb24sIGFuZCByZXR1cm4gPHJldHVybnZhbHVlPjA8L3JldHVybnZhbHVlPiBmb3Igc3VjY2VzcywKICAgICBhbmQgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIKICAgICAoZWcuIDxyZXR1cm52YWx1ZT4tRUZBVUxUPC9yZXR1cm52YWx1ZT4pIGZvciBmYWlsdXJlLiAgVGhpcyBjYW4gYmUKLSAgICB1bmludHVpdGl2ZSBhdCBmaXJzdCwgYnV0IGl0J3MgZmFpcmx5IHdpZGVzcHJlYWQgaW4gdGhlIG5ldHdvcmtpbmcKLSAgICBjb2RlLCBmb3IgZXhhbXBsZS4KKyAgICB1bmludHVpdGl2ZSBhdCBmaXJzdCwgYnV0IGl0J3MgZmFpcmx5IHdpZGVzcHJlYWQgaW4gdGhlIGtlcm5lbC4KICAgIDwvcGFyYT4KIAogICAgPHBhcmE+Ci0gICAgVGhlIGZpbGVzeXN0ZW0gY29kZSB1c2VzIDxmdW5jdGlvbj5FUlJfUFRSKCk8L2Z1bmN0aW9uPgorICAgIFVzaW5nIDxmdW5jdGlvbj5FUlJfUFRSKCk8L2Z1bmN0aW9uPgogCi0gICAgPGZpbGVuYW1lIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2xpbnV4L2ZzLmg8L2ZpbGVuYW1lPjsgdG8KKyAgICA8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvbGludXgvZXJyLmg8L2ZpbGVuYW1lPjsgdG8KICAgICBlbmNvZGUgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgaW50byBhIHBvaW50ZXIsIGFuZAogICAgIDxmdW5jdGlvbj5JU19FUlIoKTwvZnVuY3Rpb24+IGFuZCA8ZnVuY3Rpb24+UFRSX0VSUigpPC9mdW5jdGlvbj4KICAgICB0byBnZXQgaXQgYmFjayBvdXQgYWdhaW46IGF2b2lkcyBhIHNlcGFyYXRlIHBvaW50ZXIgcGFyYW1ldGVyIGZvcgpAQCAtMTA0MCw3ICsxMDU0LDcgQEAKICAgICBzdXBwb3J0ZWQsIGR1ZSB0byBsYWNrIG9mIGdlbmVyYWwgdXNlLCBidXQgdGhlIGZvbGxvd2luZyBhcmUKICAgICBjb25zaWRlcmVkIHN0YW5kYXJkIChzZWUgdGhlIEdDQyBpbmZvIHBhZ2Ugc2VjdGlvbiAiQwogICAgIEV4dGVuc2lvbnMiIGZvciBtb3JlIGRldGFpbHMgLSBZZXMsIHJlYWxseSB0aGUgaW5mbyBwYWdlLCB0aGUKLSAgICBtYW4gcGFnZSBpcyBvbmx5IGEgc2hvcnQgc3VtbWFyeSBvZiB0aGUgc3R1ZmYgaW4gaW5mbyk6CisgICAgbWFuIHBhZ2UgaXMgb25seSBhIHNob3J0IHN1bW1hcnkgb2YgdGhlIHN0dWZmIGluIGluZm8pLgogICAgPC9wYXJhPgogICAgPGl0ZW1pemVkbGlzdD4KICAgICA8bGlzdGl0ZW0+CkBAIC0xMDkxLDcgKzExMDUsNyBAQAogICAgIDwvbGlzdGl0ZW0+CiAgICAgPGxpc3RpdGVtPgogICAgICA8cGFyYT4KLSAgICAgIEZ1bmN0aW9uIG5hbWVzIGFzIHN0cmluZ3MgKF9fRlVOQ1RJT05fXykKKyAgICAgIEZ1bmN0aW9uIG5hbWVzIGFzIHN0cmluZ3MgKF9fZnVuY19fKS4KICAgICAgPC9wYXJhPgogICAgIDwvbGlzdGl0ZW0+CiAgICAgPGxpc3RpdGVtPgpAQCAtMTE2NCw2MyArMTE3OCwzNSBAQAogICAgPGxpc3RpdGVtPgogICAgIDxwYXJhPgogICAgICBVc3VhbGx5IHlvdSB3YW50IGEgY29uZmlndXJhdGlvbiBvcHRpb24gZm9yIHlvdXIga2VybmVsIGhhY2suCi0gICAgIEVkaXQgPGZpbGVuYW1lPkNvbmZpZy5pbjwvZmlsZW5hbWU+IGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkKLSAgICAgKGJ1dCB1bmRlciA8ZmlsZW5hbWU+YXJjaC88L2ZpbGVuYW1lPiBpdCdzIGNhbGxlZAotICAgICA8ZmlsZW5hbWU+Y29uZmlnLmluPC9maWxlbmFtZT4pLiAgVGhlIENvbmZpZyBMYW5ndWFnZSB1c2VkIGlzIG5vdAotICAgICBiYXNoLCBldmVuIHRob3VnaCBpdCBsb29rcyBsaWtlIGJhc2g7IHRoZSBzYWZlIHdheSBpcyB0byB1c2Ugb25seQotICAgICB0aGUgY29uc3RydWN0cyB0aGF0IHlvdSBhbHJlYWR5IHNlZSBpbgotICAgICA8ZmlsZW5hbWU+Q29uZmlnLmluPC9maWxlbmFtZT4gZmlsZXMgKHNlZQotICAgICA8ZmlsZW5hbWU+RG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQ8L2ZpbGVuYW1lPikuCi0gICAgIEl0J3MgZ29vZCB0byBydW4gIm1ha2UgeGNvbmZpZyIgYXQgbGVhc3Qgb25jZSB0byB0ZXN0IChiZWNhdXNlCi0gICAgIGl0J3MgdGhlIG9ubHkgb25lIHdpdGggYSBzdGF0aWMgcGFyc2VyKS4KLSAgICA8L3BhcmE+Ci0KLSAgICA8cGFyYT4KLSAgICAgVmFyaWFibGVzIHdoaWNoIGNhbiBiZSBZIG9yIE4gdXNlIDx0eXBlPmJvb2w8L3R5cGU+IGZvbGxvd2VkIGJ5IGEKLSAgICAgdGFnbGluZSBhbmQgdGhlIGNvbmZpZyBkZWZpbmUgbmFtZSAod2hpY2ggbXVzdCBzdGFydCB3aXRoCi0gICAgIENPTkZJR18pLiAgVGhlIDx0eXBlPnRyaXN0YXRlPC90eXBlPiBmdW5jdGlvbiBpcyB0aGUgc2FtZSwgYnV0Ci0gICAgIGFsbG93cyB0aGUgYW5zd2VyIE0gKHdoaWNoIGRlZmluZXMKLSAgICAgPHN5bWJvbD5DT05GSUdfZm9vX01PRFVMRTwvc3ltYm9sPiBpbiB5b3VyIHNvdXJjZSwgaW5zdGVhZCBvZgotICAgICA8c3ltYm9sPkNPTkZJR19GT088L3N5bWJvbD4pIGlmIDxzeW1ib2w+Q09ORklHX01PRFVMRVM8L3N5bWJvbD4KLSAgICAgaXMgZW5hYmxlZC4KKyAgICAgRWRpdCA8ZmlsZW5hbWU+S2NvbmZpZzwvZmlsZW5hbWU+IGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkuCisgICAgIFRoZSBDb25maWcgbGFuZ3VhZ2UgaXMgc2ltcGxlIHRvIHVzZSBieSBjdXQgYW5kIHBhc3RlLCBhbmQgdGhlcmUncworICAgICBjb21wbGV0ZSBkb2N1bWVudGF0aW9uIGluCisgICAgIDxmaWxlbmFtZT5Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dDwvZmlsZW5hbWU+LgogICAgIDwvcGFyYT4KIAogICAgIDxwYXJhPgogICAgICBZb3UgbWF5IHdlbGwgd2FudCB0byBtYWtlIHlvdXIgQ09ORklHIG9wdGlvbiBvbmx5IHZpc2libGUgaWYKICAgICAgPHN5bWJvbD5DT05GSUdfRVhQRVJJTUVOVEFMPC9zeW1ib2w+IGlzIGVuYWJsZWQ6IHRoaXMgc2VydmVzIGFzIGEKICAgICAgd2FybmluZyB0byB1c2Vycy4gIFRoZXJlIG1hbnkgb3RoZXIgZmFuY3kgdGhpbmdzIHlvdSBjYW4gZG86IHNlZQotICAgICB0aGUgdmFyaW91cyA8ZmlsZW5hbWU+Q29uZmlnLmluPC9maWxlbmFtZT4gZmlsZXMgZm9yIGlkZWFzLgorICAgICB0aGUgdmFyaW91cyA8ZmlsZW5hbWU+S2NvbmZpZzwvZmlsZW5hbWU+IGZpbGVzIGZvciBpZGVhcy4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgSW4geW91ciBkZXNjcmlwdGlvbiBvZiB0aGUgb3B0aW9uLCBtYWtlIHN1cmUgeW91IGFkZHJlc3MgYm90aCB0aGUKKyAgICAgZXhwZXJ0IHVzZXIgYW5kIHRoZSB1c2VyIHdobyBrbm93cyBub3RoaW5nIGFib3V0IHlvdXIgZmVhdHVyZS4gIE1lbnRpb24KKyAgICAgaW5jb21wYXRpYmlsaXRpZXMgYW5kIGlzc3VlcyBoZXJlLiAgPGVtcGhhc2lzPiBEZWZpbml0ZWx5CisgICAgIDwvZW1waGFzaXM+IGVuZCB5b3VyIGRlc2NyaXB0aW9uIHdpdGggPHF1b3RlPiBpZiBpbiBkb3VidCwgc2F5IE4KKyAgICAgPC9xdW90ZT4gKG9yLCBvY2Nhc2lvbmFsbHksIGBZJyk7IHRoaXMgaXMgZm9yIHBlb3BsZSB3aG8gaGF2ZSBubworICAgICBpZGVhIHdoYXQgeW91IGFyZSB0YWxraW5nIGFib3V0LgogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAKICAgIDxsaXN0aXRlbT4KICAgICA8cGFyYT4KICAgICAgRWRpdCB0aGUgPGZpbGVuYW1lPk1ha2VmaWxlPC9maWxlbmFtZT46IHRoZSBDT05GSUcgdmFyaWFibGVzIGFyZQotICAgICBleHBvcnRlZCBoZXJlIHNvIHlvdSBjYW4gY29uZGl0aW9uYWxpemUgY29tcGlsYXRpb24gd2l0aCBgaWZlcScuCi0gICAgIElmIHlvdXIgZmlsZSBleHBvcnRzIHN5bWJvbHMgdGhlbiBhZGQgdGhlIG5hbWVzIHRvCi0gICAgIDx2YXJuYW1lPmV4cG9ydC1vYmpzPC92YXJuYW1lPiBzbyB0aGF0IGdlbmtzeW1zIHdpbGwgZmluZCB0aGVtLgotICAgICA8Y2F1dGlvbj4KLSAgICAgIDxwYXJhPgotICAgICAgIFRoZXJlIGlzIGEgcmVzdHJpY3Rpb24gb24gdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0gdGhhdCBvYmplY3RzCi0gICAgICAgd2hpY2ggZXhwb3J0IHN5bWJvbHMgbXVzdCBoYXZlIGdsb2JhbGx5IHVuaXF1ZSBuYW1lcy4KLSAgICAgICBJZiB5b3VyIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgZ2xvYmFsbHkgdW5pcXVlIG5hbWUgdGhlbiB0aGUKLSAgICAgICBzdGFuZGFyZCBmaXggaXMgdG8gbW92ZSB0aGUKLSAgICAgICA8ZnVuY3Rpb24+RVhQT1JUX1NZTUJPTCgpPC9mdW5jdGlvbj4gc3RhdGVtZW50cyB0byB0aGVpciBvd24KLSAgICAgICBvYmplY3Qgd2l0aCBhIHVuaXF1ZSBuYW1lLgotICAgICAgIFRoaXMgaXMgd2h5IHNldmVyYWwgc3lzdGVtcyBoYXZlIHNlcGFyYXRlIGV4cG9ydGluZyBvYmplY3RzLAotICAgICAgIHVzdWFsbHkgc3VmZml4ZWQgd2l0aCBrc3ltcy4KLSAgICAgIDwvcGFyYT4KLSAgICAgPC9jYXV0aW9uPgotICAgIDwvcGFyYT4KLSAgIDwvbGlzdGl0ZW0+Ci0KLSAgIDxsaXN0aXRlbT4KLSAgICA8cGFyYT4KLSAgICAgRG9jdW1lbnQgeW91ciBvcHRpb24gaW4gRG9jdW1lbnRhdGlvbi9Db25maWd1cmUuaGVscC4gIE1lbnRpb24KLSAgICAgaW5jb21wYXRpYmlsaXRpZXMgYW5kIGlzc3VlcyBoZXJlLiAgPGVtcGhhc2lzPiBEZWZpbml0ZWx5Ci0gICAgIDwvZW1waGFzaXM+IGVuZCB5b3VyIGRlc2NyaXB0aW9uIHdpdGggPHF1b3RlPiBpZiBpbiBkb3VidCwgc2F5IE4KLSAgICAgPC9xdW90ZT4gKG9yLCBvY2Nhc2lvbmFsbHksIGBZJyk7IHRoaXMgaXMgZm9yIHBlb3BsZSB3aG8gaGF2ZSBubwotICAgICBpZGVhIHdoYXQgeW91IGFyZSB0YWxraW5nIGFib3V0LgorICAgICBleHBvcnRlZCBoZXJlIHNvIHlvdSBjYW4gdXN1YWxseSBqdXN0IGFkZCBhICJvYmotJChDT05GSUdfeHh4KSArPQorICAgICB4eHgubyIgbGluZS4gIFRoZSBzeW50YXggaXMgZG9jdW1lbnRlZCBpbgorICAgICA8ZmlsZW5hbWU+RG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dDwvZmlsZW5hbWU+LgogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAKQEAgLTEyNTMsMjAgKzEyMzksMTIgQEAKICAgPC9wYXJhPgogCiAgIDxwYXJhPgotICAgPGZpbGVuYW1lPmluY2x1ZGUvbGludXgvYnJsb2NrLmg6PC9maWxlbmFtZT4KKyAgIDxmaWxlbmFtZT5pbmNsdWRlL2FzbS1pMzg2L2RlbGF5Lmg6PC9maWxlbmFtZT4KICAgPC9wYXJhPgogICA8cHJvZ3JhbWxpc3Rpbmc+Ci1leHRlcm4gaW5saW5lIHZvaWQgYnJfcmVhZF9sb2NrIChlbnVtIGJybG9ja19pbmRpY2VzIGlkeCkKLXsKLSAgICAgICAgLyoKLSAgICAgICAgICogVGhpcyBjYXVzZXMgYSBsaW5rLXRpbWUgYnVnIG1lc3NhZ2UgaWYgYW4KLSAgICAgICAgICogaW52YWxpZCBpbmRleCBpcyB1c2VkOgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGlkeCA+PSBfX0JSX0VORCkKLSAgICAgICAgICAgICAgICBfX2JyX2xvY2tfdXNhZ2VfYnVnKCk7Ci0KLSAgICAgICAgcmVhZF9sb2NrKCZhbXA7X19icmxvY2tfYXJyYXlbc21wX3Byb2Nlc3Nvcl9pZCgpXVtpZHhdKTsKLX0KKyNkZWZpbmUgbmRlbGF5KG4pIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/IFwKKyAgICAgICAgKChuKSA+IDIwMDAwID8gX19iYWRfbmRlbGF5KCkgOiBfX2NvbnN0X3VkZWxheSgobikgKiA1dWwpKSA6IFwKKyAgICAgICAgX19uZGVsYXkobikpCiAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKICAgPHBhcmE+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWNhYm9vay50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21jYWJvb2sudG1wbAppbmRleCA0MzY3ZjQ2Li40MmE3NjBjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWNhYm9vay50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tY2Fib29rLnRtcGwKQEAgLTk2LDcgKzk2LDcgQEAKIAogICA8Y2hhcHRlciBpZD0icHViZnVuY3Rpb25zIj4KICAgICAgPHRpdGxlPlB1YmxpYyBGdW5jdGlvbnMgUHJvdmlkZWQ8L3RpdGxlPgotIUVhcmNoL2kzODYva2VybmVsL21jYS5jCishRWRyaXZlcnMvbWNhL21jYS1sZWdhY3kuYwogICA8L2NoYXB0ZXI+CiAKICAgPGNoYXB0ZXIgaWQ9ImRtYWZ1bmN0aW9ucyI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdXNiLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdXNiLnRtcGwKaW5kZXggZjNlZjBiZi4uNzA1YzQ0MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3VzYi50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay91c2IudG1wbApAQCAtODQxLDcgKzg0MSw3IEBACiAJCSAgICBGaWxlIG1vZGlmaWNhdGlvbiB0aW1lIGlzIG5vdCB1cGRhdGVkIGJ5IHRoaXMgcmVxdWVzdC4KIAkJICAgIDwvcGFyYT48cGFyYT4KIAkJICAgIFRob3NlIHN0cnVjdCBtZW1iZXJzIGFyZSBmcm9tIHNvbWUgaW50ZXJmYWNlIGRlc2NyaXB0b3IKLQkJICAgIGFwcGx5aW5nIHRvIHRoZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorCQkgICAgYXBwbHlpbmcgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KIAkJICAgIFRoZSBpbnRlcmZhY2UgbnVtYmVyIGlzIHRoZSBiSW50ZXJmYWNlTnVtYmVyIHZhbHVlLCBhbmQKIAkJICAgIHRoZSBhbHRzZXR0aW5nIG51bWJlciBpcyB0aGUgYkFsdGVybmF0ZVNldHRpbmcgdmFsdWUuCiAJCSAgICAoVGhpcyByZXNldHMgZWFjaCBlbmRwb2ludCBpbiB0aGUgaW50ZXJmYWNlLikKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vSVBNSS50eHQgYi9Eb2N1bWVudGF0aW9uL0lQTUkudHh0CmluZGV4IDg0ZDNkNGQuLmJmMWNmOThkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0lQTUkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vSVBNSS50eHQKQEAgLTYwNSwxMiArNjA1LDEzIEBACiBpdCB3aWxsIHNlbmQgdGhlIHByb3BlciBJUE1JIGNvbW1hbmRzIHRvIGRvIHRoaXMuICBUaGlzIGlzIHN1cHBvcnRlZCBvbgogc2V2ZXJhbCBwbGF0Zm9ybXMuCiAKLVRoZXJlIGlzIGEgbW9kdWxlIHBhcmFtZXRlciBuYW1lZCAicG93ZXJvZmZfY29udHJvbCIgdGhhdCBtYXkgZWl0aGVyIGJlIHplcm8KLShkbyBhIHBvd2VyIGRvd24pIG9yIDIgKGRvIGEgcG93ZXIgY3ljbGUsIHBvd2VyIHRoZSBzeXN0ZW0gb2ZmLCB0aGVuIHBvd2VyCi1pdCBvbiBpbiBhIGZldyBzZWNvbmRzKS4gIFNldHRpbmcgaXBtaV9wb3dlcm9mZi5wb3dlcm9mZl9jb250cm9sPXggd2lsbCBkbwotdGhlIHNhbWUgdGhpbmcgb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuICBUaGUgcGFyYW1ldGVyIGlzIGFsc28gYXZhaWxhYmxlCi12aWEgdGhlIHByb2MgZmlsZXN5c3RlbSBpbiAvcHJvYy9pcG1pL3Bvd2Vyb2ZmX2NvbnRyb2wuICBOb3RlIHRoYXQgaWYgdGhlCi1zeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBwb3dlciBjeWNsaW5nLCBpdCB3aWxsIGFsd2F5cyB0byB0aGUgcG93ZXIgb2ZmLgorVGhlcmUgaXMgYSBtb2R1bGUgcGFyYW1ldGVyIG5hbWVkICJwb3dlcm9mZl9wb3dlcmN5Y2xlIiB0aGF0IG1heQorZWl0aGVyIGJlIHplcm8gKGRvIGEgcG93ZXIgZG93bikgb3Igbm9uLXplcm8gKGRvIGEgcG93ZXIgY3ljbGUsIHBvd2VyCit0aGUgc3lzdGVtIG9mZiwgdGhlbiBwb3dlciBpdCBvbiBpbiBhIGZldyBzZWNvbmRzKS4gIFNldHRpbmcKK2lwbWlfcG93ZXJvZmYucG93ZXJvZmZfY29udHJvbD14IHdpbGwgZG8gdGhlIHNhbWUgdGhpbmcgb24gdGhlIGtlcm5lbAorY29tbWFuZCBsaW5lLiAgVGhlIHBhcmFtZXRlciBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIHByb2MgZmlsZXN5c3RlbQoraW4gL3Byb2Mvc3lzL2Rldi9pcG1pL3Bvd2Vyb2ZmX3Bvd2VyY3ljbGUuICBOb3RlIHRoYXQgaWYgdGhlIHN5c3RlbQorZG9lcyBub3Qgc3VwcG9ydCBwb3dlciBjeWNsaW5nLCBpdCB3aWxsIGFsd2F5cyBkbyB0aGUgcG93ZXIgb2ZmLgogCiBOb3RlIHRoYXQgaWYgeW91IGhhdmUgQUNQSSBlbmFibGVkLCB0aGUgc3lzdGVtIHdpbGwgcHJlZmVyIHVzaW5nIEFDUEkgdG8KIHBvd2VyIG9mZi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vTVNJLUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24vTVNJLUhPV1RPLnR4dAppbmRleCBkNTAzMmViLi42M2VkYzVmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL01TSS1IT1dUTy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9NU0ktSE9XVE8udHh0CkBAIC00MzAsNyArNDMwLDcgQEAKIE1TSS1jYXBhYmxlIGhhcmR3YXJlIGlzIHJlc3BvbnNpYmxlIGZvciB3aGV0aGVyIGNhbGxpbmcKIHBjaV9lbmFibGVfbXNpIG9yIG5vdC4gQSByZXR1cm4gb2YgemVybyBpbmRpY2F0ZXMgdGhlIGtlcm5lbAogc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVzIHRoZSBNU0kvTVNJLVggY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgb2YgdGhlCi1kZXZpY2UgZnVudGlvbi4gVGhlIGRldmljZSBmdW5jdGlvbiBpcyBub3cgcnVubmluZyBvbiBNU0kvTVNJLVggbW9kZS4KK2RldmljZSBmdW5jdGlvbi4gVGhlIGRldmljZSBmdW5jdGlvbiBpcyBub3cgcnVubmluZyBvbiBNU0kvTVNJLVggbW9kZS4KIAogNS42IEhvdyB0byB0ZWxsIHdoZXRoZXIgTVNJL01TSS1YIGlzIGVuYWJsZWQgb24gZGV2aWNlIGZ1bmN0aW9uCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVL05NSS1SQ1UudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvTk1JLVJDVS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2MzRhNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUkNVL05NSS1SQ1UudHh0CkBAIC0wLDAgKzEsMTEyIEBACitVc2luZyBSQ1UgdG8gUHJvdGVjdCBEeW5hbWljIE5NSSBIYW5kbGVycworCisKK0FsdGhvdWdoIFJDVSBpcyB1c3VhbGx5IHVzZWQgdG8gcHJvdGVjdCByZWFkLW1vc3RseSBkYXRhIHN0cnVjdHVyZXMsCitpdCBpcyBwb3NzaWJsZSB0byB1c2UgUkNVIHRvIHByb3ZpZGUgZHluYW1pYyBub24tbWFza2FibGUgaW50ZXJydXB0CitoYW5kbGVycywgYXMgd2VsbCBhcyBkeW5hbWljIGlycSBoYW5kbGVycy4gIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzCitob3cgdG8gZG8gdGhpcywgZHJhd2luZyBsb29zZWx5IGZyb20gWndhbmUgTXdhaWthbWJvJ3MgTk1JLXRpbWVyCit3b3JrIGluICJhcmNoL2kzODYvb3Byb2ZpbGUvbm1pX3RpbWVyX2ludC5jIiBhbmQgaW4KKyJhcmNoL2kzODYva2VybmVsL3RyYXBzLmMiLgorCitUaGUgcmVsZXZhbnQgcGllY2VzIG9mIGNvZGUgYXJlIGxpc3RlZCBiZWxvdywgZWFjaCBmb2xsb3dlZCBieSBhCiticmllZiBleHBsYW5hdGlvbi4KKworCXN0YXRpYyBpbnQgZHVtbXlfbm1pX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KQorCXsKKwkJcmV0dXJuIDA7CisJfQorCitUaGUgZHVtbXlfbm1pX2NhbGxiYWNrKCkgZnVuY3Rpb24gaXMgYSAiZHVtbXkiIE5NSSBoYW5kbGVyIHRoYXQgZG9lcworbm90aGluZywgYnV0IHJldHVybnMgemVybywgdGh1cyBzYXlpbmcgdGhhdCBpdCBkaWQgbm90aGluZywgYWxsb3dpbmcKK3RoZSBOTUkgaGFuZGxlciB0byB0YWtlIHRoZSBkZWZhdWx0IG1hY2hpbmUtc3BlY2lmaWMgYWN0aW9uLgorCisJc3RhdGljIG5taV9jYWxsYmFja190IG5taV9jYWxsYmFjayA9IGR1bW15X25taV9jYWxsYmFjazsKKworVGhpcyBubWlfY2FsbGJhY2sgdmFyaWFibGUgaXMgYSBnbG9iYWwgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgY3VycmVudAorTk1JIGhhbmRsZXIuCisKKwlmYXN0Y2FsbCB2b2lkIGRvX25taShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKKwl7CisJCWludCBjcHU7CisKKwkJbm1pX2VudGVyKCk7CisKKwkJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCQkrK25taV9jb3VudChjcHUpOworCisJCWlmICghcmN1X2RlcmVmZXJlbmNlKG5taV9jYWxsYmFjaykocmVncywgY3B1KSkKKwkJCWRlZmF1bHRfZG9fbm1pKHJlZ3MpOworCisJCW5taV9leGl0KCk7CisJfQorCitUaGUgZG9fbm1pKCkgZnVuY3Rpb24gcHJvY2Vzc2VzIGVhY2ggTk1JLiAgSXQgZmlyc3QgZGlzYWJsZXMgcHJlZW1wdGlvbgoraW4gdGhlIHNhbWUgd2F5IHRoYXQgYSBoYXJkd2FyZSBpcnEgd291bGQsIHRoZW4gaW5jcmVtZW50cyB0aGUgcGVyLUNQVQorY291bnQgb2YgTk1Jcy4gIEl0IHRoZW4gaW52b2tlcyB0aGUgTk1JIGhhbmRsZXIgc3RvcmVkIGluIHRoZSBubWlfY2FsbGJhY2sKK2Z1bmN0aW9uIHBvaW50ZXIuICBJZiB0aGlzIGhhbmRsZXIgcmV0dXJucyB6ZXJvLCBkb19ubWkoKSBpbnZva2VzIHRoZQorZGVmYXVsdF9kb19ubWkoKSBmdW5jdGlvbiB0byBoYW5kbGUgYSBtYWNoaW5lLXNwZWNpZmljIE5NSS4gIEZpbmFsbHksCitwcmVlbXB0aW9uIGlzIHJlc3RvcmVkLgorCitTdHJpY3RseSBzcGVha2luZywgcmN1X2RlcmVmZXJlbmNlKCkgaXMgbm90IG5lZWRlZCwgc2luY2UgdGhpcyBjb2RlIHJ1bnMKK29ubHkgb24gaTM4Niwgd2hpY2ggZG9lcyBub3QgbmVlZCByY3VfZGVyZWZlcmVuY2UoKSBhbnl3YXkuICBIb3dldmVyLAoraXQgaXMgYSBnb29kIGRvY3VtZW50YXRpb24gYWlkLCBwYXJ0aWN1bGFybHkgZm9yIGFueW9uZSBhdHRlbXB0aW5nIHRvCitkbyBzb21ldGhpbmcgc2ltaWxhciBvbiBBbHBoYS4KKworUXVpY2sgUXVpejogIFdoeSBtaWdodCB0aGUgcmN1X2RlcmVmZXJlbmNlKCkgYmUgbmVjZXNzYXJ5IG9uIEFscGhhLAorCSAgICAgZ2l2ZW4gdGhhdCB0aGUgY29kZSByZWZlcmVuY2VkIGJ5IHRoZSBwb2ludGVyIGlzIHJlYWQtb25seT8KKworCitCYWNrIHRvIHRoZSBkaXNjdXNzaW9uIG9mIE5NSSBhbmQgUkNVLi4uCisKKwl2b2lkIHNldF9ubWlfY2FsbGJhY2sobm1pX2NhbGxiYWNrX3QgY2FsbGJhY2spCisJeworCQlyY3VfYXNzaWduX3BvaW50ZXIobm1pX2NhbGxiYWNrLCBjYWxsYmFjayk7CisJfQorCitUaGUgc2V0X25taV9jYWxsYmFjaygpIGZ1bmN0aW9uIHJlZ2lzdGVycyBhbiBOTUkgaGFuZGxlci4gIE5vdGUgdGhhdCBhbnkKK2RhdGEgdGhhdCBpcyB0byBiZSB1c2VkIGJ5IHRoZSBjYWxsYmFjayBtdXN0IGJlIGluaXRpYWxpemVkIHVwIC1iZWZvcmUtCit0aGUgY2FsbCB0byBzZXRfbm1pX2NhbGxiYWNrKCkuICBPbiBhcmNoaXRlY3R1cmVzIHRoYXQgZG8gbm90IG9yZGVyCit3cml0ZXMsIHRoZSByY3VfYXNzaWduX3BvaW50ZXIoKSBlbnN1cmVzIHRoYXQgdGhlIE5NSSBoYW5kbGVyIHNlZXMgdGhlCitpbml0aWFsaXplZCB2YWx1ZXMuCisKKwl2b2lkIHVuc2V0X25taV9jYWxsYmFjayh2b2lkKQorCXsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG5taV9jYWxsYmFjaywgZHVtbXlfbm1pX2NhbGxiYWNrKTsKKwl9CisKK1RoaXMgZnVuY3Rpb24gdW5yZWdpc3RlcnMgYW4gTk1JIGhhbmRsZXIsIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwKK2R1bW15X25taV9oYW5kbGVyKCkuICBIb3dldmVyLCB0aGVyZSBtYXkgd2VsbCBiZSBhbiBOTUkgaGFuZGxlcgorY3VycmVudGx5IGV4ZWN1dGluZyBvbiBzb21lIG90aGVyIENQVS4gIFdlIHRoZXJlZm9yZSBjYW5ub3QgZnJlZQordXAgYW55IGRhdGEgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBvbGQgTk1JIGhhbmRsZXIgdW50aWwgZXhlY3V0aW9uCitvZiBpdCBjb21wbGV0ZXMgb24gYWxsIG90aGVyIENQVXMuCisKK09uZSB3YXkgdG8gYWNjb21wbGlzaCB0aGlzIGlzIHZpYSBzeW5jaHJvbml6ZV9zY2hlZCgpLCBwZXJoYXBzIGFzCitmb2xsb3dzOgorCisJdW5zZXRfbm1pX2NhbGxiYWNrKCk7CisJc3luY2hyb25pemVfc2NoZWQoKTsKKwlrZnJlZShteV9ubWlfZGF0YSk7CisKK1RoaXMgd29ya3MgYmVjYXVzZSBzeW5jaHJvbml6ZV9zY2hlZCgpIGJsb2NrcyB1bnRpbCBhbGwgQ1BVcyBjb21wbGV0ZQorYW55IHByZWVtcHRpb24tZGlzYWJsZWQgc2VnbWVudHMgb2YgY29kZSB0aGF0IHRoZXkgd2VyZSBleGVjdXRpbmcuCitTaW5jZSBOTUkgaGFuZGxlcnMgZGlzYWJsZSBwcmVlbXB0aW9uLCBzeW5jaHJvbml6ZV9zY2hlZCgpIGlzIGd1YXJhbnRlZWQKK25vdCB0byByZXR1cm4gdW50aWwgYWxsIG9uZ29pbmcgTk1JIGhhbmRsZXJzIGV4aXQuICBJdCBpcyB0aGVyZWZvcmUgc2FmZQordG8gZnJlZSB1cCB0aGUgaGFuZGxlcidzIGRhdGEgYXMgc29vbiBhcyBzeW5jaHJvbml6ZV9zY2hlZCgpIHJldHVybnMuCisKKworQW5zd2VyIHRvIFF1aWNrIFF1aXoKKworCVdoeSBtaWdodCB0aGUgcmN1X2RlcmVmZXJlbmNlKCkgYmUgbmVjZXNzYXJ5IG9uIEFscGhhLCBnaXZlbgorCXRoYXQgdGhlIGNvZGUgcmVmZXJlbmNlZCBieSB0aGUgcG9pbnRlciBpcyByZWFkLW9ubHk/CisKKwlBbnN3ZXI6IFRoZSBjYWxsZXIgdG8gc2V0X25taV9jYWxsYmFjaygpIG1pZ2h0IHdlbGwgaGF2ZQorCQlpbml0aWFsaXplZCBzb21lIGRhdGEgdGhhdCBpcyB0byBiZSB1c2VkIGJ5IHRoZQorCQluZXcgTk1JIGhhbmRsZXIuICBJbiB0aGlzIGNhc2UsIHRoZSByY3VfZGVyZWZlcmVuY2UoKQorCQl3b3VsZCBiZSBuZWVkZWQsIGJlY2F1c2Ugb3RoZXJ3aXNlIGEgQ1BVIHRoYXQgcmVjZWl2ZWQKKwkJYW4gTk1JIGp1c3QgYWZ0ZXIgdGhlIG5ldyBoYW5kbGVyIHdhcyBzZXQgbWlnaHQgc2VlCisJCXRoZSBwb2ludGVyIHRvIHRoZSBuZXcgTk1JIGhhbmRsZXIsIGJ1dCB0aGUgb2xkCisJCXByZS1pbml0aWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBoYW5kbGVyJ3MgZGF0YS4KKworCQlNb3JlIGltcG9ydGFudCwgdGhlIHJjdV9kZXJlZmVyZW5jZSgpIG1ha2VzIGl0IGNsZWFyCisJCXRvIHNvbWVvbmUgcmVhZGluZyB0aGUgY29kZSB0aGF0IHRoZSBwb2ludGVyIGlzIGJlaW5nCisJCXByb3RlY3RlZCBieSBSQ1UuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9SVEZQLnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL1JURlAudHh0CmluZGV4IDljNmQ0NTAuLmZjYmNiYzMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUkNVL1JURlAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL1JURlAudHh0CkBAIC0yLDcgKzIsOCBAQAogCiAKIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIFJDVS1yZWxhdGVkIHB1YmxpY2F0aW9ucywgYW5kIGlzIGZvbGxvd2VkIGJ5Ci10aGUgY29ycmVzcG9uZGluZyBiaWJ0ZXggZW50cmllcy4KK3RoZSBjb3JyZXNwb25kaW5nIGJpYnRleCBlbnRyaWVzLiAgQSBudW1iZXIgb2YgdGhlIHB1YmxpY2F0aW9ucyBtYXkKK2JlIGZvdW5kIGF0IGh0dHA6Ly93d3cucmRyb3AuY29tL3VzZXJzL3BhdWxtY2svUkNVLy4KIAogVGhlIGZpcnN0IHRoaW5nIHJlc2VtYmxpbmcgUkNVIHdhcyBwdWJsaXNoZWQgaW4gMTk4MCwgd2hlbiBLdW5nIGFuZCBMZWhtYW4KIFtLdW5nODBdIHJlY29tbWVuZGVkIHVzZSBvZiBhIGdhcmJhZ2UgY29sbGVjdG9yIHRvIGRlZmVyIGRlc3RydWN0aW9uCkBAIC0xMTMsNiArMTE0LDEwIEBACiBhbmQgYSBwYXBlciBkZXNjcmliaW5nIFNFTGludXggcGVyZm9ybWFuY2Ugd2l0aCBSQ1UgW0phbWVzTW9ycmlzMDRiXS4KIAogCisyMDA1IGhhcyBzZWVuIGZ1cnRoZXIgYWRhcHRhdGlvbiBvZiBSQ1UgdG8gcmVhbHRpbWUgdXNlLCBwZXJtaXR0aW5nCitwcmVlbXB0aW9uIG9mIFJDVSByZWFsdGltZSBjcml0aWNhbCBzZWN0aW9ucyBbUGF1bE1jS2VubmV5MDVhLAorUGF1bE1jS2VubmV5MDViXS4KKwogQmlidGV4IEVudHJpZXMKIAogQGFydGljbGV7S3VuZzgwCkBAIC00MTAsMyArNDE1LDMyIEBACiBcdXJse2h0dHA6Ly93d3cubGl2ZWpvdXJuYWwuY29tL3VzZXJzL2phbWVzX21vcnJpcy8yMTUzLmh0bWx9CiBbVmlld2VkIERlY2VtYmVyIDEwLCAyMDA0XSIKIH0KKworQHVucHVibGlzaGVke1BhdWxNY0tlbm5leTA1YQorLEF1dGhvcj0iUGF1bCBFLiBNY0tlbm5leSIKKyxUaXRsZT0ie1tSRkNdfSB7UkNVfSBhbmQge0NPTkZJR1xfUFJFRU1QVFxfUlR9IHByb2dyZXNzIgorLG1vbnRoPSJNYXkiCisseWVhcj0iMjAwNSIKKyxub3RlPSJBdmFpbGFibGU6CitcdXJse2h0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDUvNS85LzE4NX0KK1tWaWV3ZWQgTWF5IDEzLCAyMDA1XSIKKyxhbm5vdGF0aW9uPSIKKwlGaXJzdCBwdWJsaWNhdGlvbiBvZiB3b3JraW5nIGxvY2stYmFzZWQgZGVmZXJyZWQgZnJlZSBwYXRjaGVzCisJZm9yIHRoZSBDT05GSUdfUFJFRU1QVF9SVCBlbnZpcm9ubWVudC4KKyIKK30KKworQGNvbmZlcmVuY2V7UGF1bE1jS2VubmV5MDViCissQXV0aG9yPSJQYXVsIEUuIE1jS2VubmV5IGFuZCBEaXBhbmthciBTYXJtYSIKKyxUaXRsZT0iVG93YXJkcyBIYXJkIFJlYWx0aW1lIFJlc3BvbnNlIGZyb20gdGhlIExpbnV4IEtlcm5lbCBvbiBTTVAgSGFyZHdhcmUiCissQm9va3RpdGxlPSJsaW51eC5jb25mLmF1IDIwMDUiCissbW9udGg9IkFwcmlsIgorLHllYXI9IjIwMDUiCissYWRkcmVzcz0iQ2FuYmVycmEsIEF1c3RyYWxpYSIKKyxub3RlPSJBdmFpbGFibGU6CitcdXJse2h0dHA6Ly93d3cucmRyb3AuY29tL3VzZXJzL3BhdWxtY2svUkNVL3JlYWx0aW1lUkNVLjIwMDUuMDQuMjNhLnBkZn0KK1tWaWV3ZWQgTWF5IDEzLCAyMDA1XSIKKyxhbm5vdGF0aW9uPSIKKwlSZWFsdGltZSB0dXJucyBpbnRvIG1ha2luZyBSQ1UgeWV0IG1vcmUgcmVhbHRpbWUgZnJpZW5kbHkuCisiCit9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9VUC50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS9VUC50eHQKaW5kZXggM2JmYjg0Yi4uYWFiNGE5ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvVVAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL1VQLnR4dApAQCAtOCw3ICs4LDcgQEAKIHdhaXQgZm9yIGFueXRoaW5nIGVsc2UgdG8gZ2V0IGRvbmUsIHNpbmNlIHRoZXJlIGFyZSBubyBvdGhlciBDUFVzIGZvcgogYW55dGhpbmcgZWxzZSB0byBiZSBoYXBwZW5pbmcgb24uICBBbHRob3VnaCB0aGlzIGFwcHJvYWNoIHdpbGwgLXNvcnQtIC1vZi0KIHdvcmsgYSBzdXJwcmlzaW5nIGFtb3VudCBvZiB0aGUgdGltZSwgaXQgaXMgYSB2ZXJ5IGJhZCBpZGVhIGluIGdlbmVyYWwuCi1UaGlzIGRvY3VtZW50IHByZXNlbnRzIHR3byBleGFtcGxlcyB0aGF0IGRlbW9uc3RyYXRlIGV4YWN0bHkgaG93IGJhZCBhbgorVGhpcyBkb2N1bWVudCBwcmVzZW50cyB0aHJlZSBleGFtcGxlcyB0aGF0IGRlbW9uc3RyYXRlIGV4YWN0bHkgaG93IGJhZCBhbgogaWRlYSB0aGlzIGlzLgogCiAKQEAgLTI2LDYgKzI2LDkgQEAKIGVsZW1lbnQgQi4gIFRoaXMgc2l0dWF0aW9uIGNhbiBncmVhdGx5IGRlY3JlYXNlIHRoZSBsaWZlIGV4cGVjdGFuY3kgb2YKIHlvdXIga2VybmVsLgogCitUaGlzIHNhbWUgcHJvYmxlbSBjYW4gb2NjdXIgaWYgY2FsbF9yY3UoKSBpcyBpbnZva2VkIGZyb20gYSBoYXJkd2FyZQoraW50ZXJydXB0IGhhbmRsZXIuCisKIAogRXhhbXBsZSAyOiBGdW5jdGlvbi1DYWxsIEZhdGFsaXR5CiAKQEAgLTQ0LDggKzQ3LDM3IEBACiB1bmRlcmx5aW5nIFJDVSwgbmFtZWx5IHRoYXQgY2FsbF9yY3UoKSBkZWZlcnMgaW52b2tpbmcgaXRzIGFyZ3VtZW50cyB1bnRpbAogYWxsIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgY3VycmVudGx5IGV4ZWN1dGluZyBoYXZlIGNvbXBsZXRlZC4KIAotUXVpY2sgUXVpejogd2h5IGlzIGl0IC1ub3QtIGxlZ2FsIHRvIGludm9rZSBzeW5jaHJvbml6ZV9yY3UoKSBpbgotdGhpcyBjYXNlPworUXVpY2sgUXVpeiAjMTogd2h5IGlzIGl0IC1ub3QtIGxlZ2FsIHRvIGludm9rZSBzeW5jaHJvbml6ZV9yY3UoKSBpbgorCXRoaXMgY2FzZT8KKworCitFeGFtcGxlIDM6IERlYXRoIGJ5IERlYWRsb2NrCisKK1N1cHBvc2UgdGhhdCBjYWxsX3JjdSgpIGlzIGludm9rZWQgd2hpbGUgaG9sZGluZyBhIGxvY2ssIGFuZCB0aGF0IHRoZQorY2FsbGJhY2sgZnVuY3Rpb24gbXVzdCBhY3F1aXJlIHRoaXMgc2FtZSBsb2NrLiAgSW4gdGhpcyBjYXNlLCBpZgorY2FsbF9yY3UoKSB3ZXJlIHRvIGRpcmVjdGx5IGludm9rZSB0aGUgY2FsbGJhY2ssIHRoZSByZXN1bHQgd291bGQKK2JlIHNlbGYtZGVhZGxvY2suCisKK0luIHNvbWUgY2FzZXMsIGl0IHdvdWxkIHBvc3NpYmxlIHRvIHJlc3RydWN0dXJlIHRvIGNvZGUgc28gdGhhdAordGhlIGNhbGxfcmN1KCkgaXMgZGVsYXllZCB1bnRpbCBhZnRlciB0aGUgbG9jayBpcyByZWxlYXNlZC4gIEhvd2V2ZXIsCit0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBjYW4gYmUgcXVpdGUgdWdseToKKworMS4JSWYgYSBudW1iZXIgb2YgaXRlbXMgbmVlZCB0byBiZSBwYXNzZWQgdG8gY2FsbF9yY3UoKSB3aXRoaW4KKwl0aGUgc2FtZSBjcml0aWNhbCBzZWN0aW9uLCB0aGVuIHRoZSBjb2RlIHdvdWxkIG5lZWQgdG8gY3JlYXRlCisJYSBsaXN0IG9mIHRoZW0sIHRoZW4gdHJhdmVyc2UgdGhlIGxpc3Qgb25jZSB0aGUgbG9jayB3YXMKKwlyZWxlYXNlZC4KKworMi4JSW4gc29tZSBjYXNlcywgdGhlIGxvY2sgd2lsbCBiZSBoZWxkIGFjcm9zcyBzb21lIGtlcm5lbCBBUEksCisJc28gdGhhdCBkZWxheWluZyB0aGUgY2FsbF9yY3UoKSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZAorCXJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgaXRlbSBiZSBwYXNzZWQgdXAgdmlhIGEgY29tbW9uIEFQSS4KKwlJdCBpcyBmYXIgYmV0dGVyIHRvIGd1YXJhbnRlZSB0aGF0IGNhbGxiYWNrcyBhcmUgaW52b2tlZAorCXdpdGggbm8gbG9ja3MgaGVsZCB0aGFuIHRvIGhhdmUgdG8gbW9kaWZ5IHN1Y2ggQVBJcyB0byBhbGxvdworCWFyYml0cmFyeSBkYXRhIGl0ZW1zIHRvIGJlIHBhc3NlZCBiYWNrIHVwIHRocm91Z2ggdGhlbS4KKworSWYgY2FsbF9yY3UoKSBkaXJlY3RseSBpbnZva2VzIHRoZSBjYWxsYmFjaywgcGFpbmZ1bCBsb2NraW5nIHJlc3RyaWN0aW9ucworb3IgQVBJIGNoYW5nZXMgd291bGQgYmUgcmVxdWlyZWQuCisKK1F1aWNrIFF1aXogIzI6IFdoYXQgbG9ja2luZyByZXN0cmljdGlvbiBtdXN0IFJDVSBjYWxsYmFja3MgcmVzcGVjdD8KIAogCiBTdW1tYXJ5CkBAIC01MywxMiArODUsMzUgQEAKIFBlcm1pdHRpbmcgY2FsbF9yY3UoKSB0byBpbW1lZGlhdGVseSBpbnZva2UgaXRzIGFyZ3VtZW50cyBvciBwZXJtaXR0aW5nCiBzeW5jaHJvbml6ZV9yY3UoKSB0byBpbW1lZGlhdGVseSByZXR1cm4gYnJlYWtzIFJDVSwgZXZlbiBvbiBhIFVQIHN5c3RlbS4KIFNvIGRvIG5vdCBkbyBpdCEgIEV2ZW4gb24gYSBVUCBzeXN0ZW0sIHRoZSBSQ1UgaW5mcmFzdHJ1Y3R1cmUgLW11c3QtCi1yZXNwZWN0IGdyYWNlIHBlcmlvZHMuCityZXNwZWN0IGdyYWNlIHBlcmlvZHMsIGFuZCAtbXVzdC0gaW52b2tlIGNhbGxiYWNrcyBmcm9tIGEga25vd24gZW52aXJvbm1lbnQKK2luIHdoaWNoIG5vIGxvY2tzIGFyZSBoZWxkLgogCiAKLUFuc3dlciB0byBRdWljayBRdWl6CitBbnN3ZXIgdG8gUXVpY2sgUXVpeiAjMToKKwlXaHkgaXMgaXQgLW5vdC0gbGVnYWwgdG8gaW52b2tlIHN5bmNocm9uaXplX3JjdSgpIGluIHRoaXMgY2FzZT8KIAotVGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgc2Nhbm5pbmcgYW4gUkNVLXByb3RlY3RlZCBsaW5rZWQgbGlzdCwgYW5kCi1pcyB0aGVyZWZvcmUgd2l0aGluIGFuIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4gIFRoZXJlZm9yZSwKLXRoZSBjYWxsZWQgZnVuY3Rpb24gaGFzIGJlZW4gaW52b2tlZCB3aXRoaW4gYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbAotc2VjdGlvbiwgYW5kIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYmxvY2suCisJQmVjYXVzZSB0aGUgY2FsbGluZyBmdW5jdGlvbiBpcyBzY2FubmluZyBhbiBSQ1UtcHJvdGVjdGVkIGxpbmtlZAorCWxpc3QsIGFuZCBpcyB0aGVyZWZvcmUgd2l0aGluIGFuIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4KKwlUaGVyZWZvcmUsIHRoZSBjYWxsZWQgZnVuY3Rpb24gaGFzIGJlZW4gaW52b2tlZCB3aXRoaW4gYW4gUkNVCisJcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24sIGFuZCBpcyBub3QgcGVybWl0dGVkIHRvIGJsb2NrLgorCitBbnN3ZXIgdG8gUXVpY2sgUXVpeiAjMjoKKwlXaGF0IGxvY2tpbmcgcmVzdHJpY3Rpb24gbXVzdCBSQ1UgY2FsbGJhY2tzIHJlc3BlY3Q/CisKKwlBbnkgbG9jayB0aGF0IGlzIGFjcXVpcmVkIHdpdGhpbiBhbiBSQ1UgY2FsbGJhY2sgbXVzdCBiZQorCWFjcXVpcmVkIGVsc2V3aGVyZSB1c2luZyBhbiBfaXJxIHZhcmlhbnQgb2YgdGhlIHNwaW5sb2NrCisJcHJpbWl0aXZlLiAgRm9yIGV4YW1wbGUsIGlmICJteWxvY2siIGlzIGFjcXVpcmVkIGJ5IGFuCisJUkNVIGNhbGxiYWNrLCB0aGVuIGEgcHJvY2Vzcy1jb250ZXh0IGFjcXVpc2l0aW9uIG9mIHRoaXMKKwlsb2NrIG11c3QgdXNlIHNvbWV0aGluZyBsaWtlIHNwaW5fbG9ja19pcnFzYXZlKCkgdG8KKwlhY3F1aXJlIHRoZSBsb2NrLgorCisJSWYgdGhlIHByb2Nlc3MtY29udGV4dCBjb2RlIHdlcmUgdG8gc2ltcGx5IHVzZSBzcGluX2xvY2soKSwKKwl0aGVuLCBzaW5jZSBSQ1UgY2FsbGJhY2tzIGNhbiBiZSBpbnZva2VkIGZyb20gc29mdGlycSBjb250ZXh0LAorCXRoZSBjYWxsYmFjayBtaWdodCBiZSBjYWxsZWQgZnJvbSBhIHNvZnRpcnEgdGhhdCBpbnRlcnJ1cHRlZAorCXRoZSBwcm9jZXNzLWNvbnRleHQgY3JpdGljYWwgc2VjdGlvbi4gIFRoaXMgd291bGQgcmVzdWx0IGluCisJc2VsZi1kZWFkbG9jay4KKworCVRoaXMgcmVzdHJpY3Rpb24gbWlnaHQgc2VlbSBncmF0dWl0b3VzLCBzaW5jZSB2ZXJ5IGZldyBSQ1UKKwljYWxsYmFja3MgYWNxdWlyZSBsb2NrcyBkaXJlY3RseS4gIEhvd2V2ZXIsIGEgZ3JlYXQgbWFueSBSQ1UKKwljYWxsYmFja3MgZG8gYWNxdWlyZSBsb2NrcyAtaW5kaXJlY3RseS0sIGZvciBleGFtcGxlLCB2aWEKKwl0aGUga2ZyZWUoKSBwcmltaXRpdmUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dAppbmRleCA4ZjNmYjc3Li5lMTE4YTdjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQKQEAgLTQzLDYgKzQzLDEwIEBACiAJcmN1X3JlYWRfbG9ja19iaCgpKSBpbiB0aGUgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zLAogCWFuZCBhcmUgYWxzbyBhbiBleGNlbGxlbnQgYWlkIHRvIHJlYWRhYmlsaXR5LgogCisJQXMgYSByb3VnaCBydWxlIG9mIHRodW1iLCBhbnkgZGVyZWZlcmVuY2Ugb2YgYW4gUkNVLXByb3RlY3RlZAorCXBvaW50ZXIgbXVzdCBiZSBjb3ZlcmVkIGJ5IHJjdV9yZWFkX2xvY2soKSBvciByY3VfcmVhZF9sb2NrX2JoKCkKKwlvciBieSB0aGUgYXBwcm9wcmlhdGUgdXBkYXRlLXNpZGUgbG9jay4KKwogMy4JRG9lcyB0aGUgdXBkYXRlIGNvZGUgdG9sZXJhdGUgY29uY3VycmVudCBhY2Nlc3Nlcz8KIAogCVRoZSB3aG9sZSBwb2ludCBvZiBSQ1UgaXMgdG8gcGVybWl0IHJlYWRlcnMgdG8gcnVuIHdpdGhvdXQKQEAgLTkwLDcgKzk0LDExIEBACiAKIAkJVGhlIHJjdV9kZXJlZmVyZW5jZSgpIHByaW1pdGl2ZSBpcyB1c2VkIGJ5IHRoZSB2YXJpb3VzCiAJCSJfcmN1KCkiIGxpc3QtdHJhdmVyc2FsIHByaW1pdGl2ZXMsIHN1Y2ggYXMgdGhlCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KCkuCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KCkuICBOb3RlIHRoYXQgaXQgaXMgcGVyZmVjdGx5CisJCWxlZ2FsIChpZiByZWR1bmRhbnQpIGZvciB1cGRhdGUtc2lkZSBjb2RlIHRvIHVzZQorCQlyY3VfZGVyZWZlcmVuY2UoKSBhbmQgdGhlICJfcmN1KCkiIGxpc3QtdHJhdmVyc2FsCisJCXByaW1pdGl2ZXMuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4gY29kZQorCQl0aGF0IGlzIGNvbW1vbiB0byByZWFkZXJzIGFuZCB1cGRhdGVycy4KIAogCWIuCUlmIHRoZSBsaXN0IG1hY3JvcyBhcmUgYmVpbmcgdXNlZCwgdGhlIGxpc3RfYWRkX3RhaWxfcmN1KCkKIAkJYW5kIGxpc3RfYWRkX3JjdSgpIHByaW1pdGl2ZXMgbXVzdCBiZSB1c2VkIGluIG9yZGVyCkBAIC0xNTAsMTYgKzE1OCw5IEBACiAKIAlVc2Ugb2YgdGhlIF9yY3UoKSBsaXN0LXRyYXZlcnNhbCBwcmltaXRpdmVzIG91dHNpZGUgb2YgYW4KIAlSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24gY2F1c2VzIG5vIGhhcm0gb3RoZXIgdGhhbgotCWEgc2xpZ2h0IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIG9uIEFscGhhIENQVXMgYW5kIHNvbWUKLQljb25mdXNpb24gb24gdGhlIHBhcnQgb2YgcGVvcGxlIHRyeWluZyB0byByZWFkIHRoZSBjb2RlLgotCi0JQW5vdGhlciB3YXkgb2YgdGhpbmtpbmcgb2YgdGhpcyBpcyAiSWYgeW91IGFyZSBob2xkaW5nIHRoZQotCWxvY2sgdGhhdCBwcmV2ZW50cyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZnJvbSBjaGFuZ2luZywgd2h5IGRvCi0JeW91IGFsc28gbmVlZCBSQ1UtYmFzZWQgcHJvdGVjdGlvbj8iICBUaGF0IHNhaWQsIHRoZXJlIG1heQotCXdlbGwgYmUgc2l0dWF0aW9ucyB3aGVyZSB1c2Ugb2YgdGhlIF9yY3UoKSBsaXN0LXRyYXZlcnNhbAotCXByaW1pdGl2ZXMgd2hpbGUgdGhlIHVwZGF0ZS1zaWRlIGxvY2sgaXMgaGVsZCByZXN1bHRzIGluCi0Jc2ltcGxlciBhbmQgbW9yZSBtYWludGFpbmFibGUgY29kZS4gIFRoZSBqdXJ5IGlzIHN0aWxsIG91dAotCW9uIHRoaXMgcXVlc3Rpb24uCisJYSBzbGlnaHQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gb24gQWxwaGEgQ1BVcy4gIEl0IGNhbgorCWFsc28gYmUgcXVpdGUgaGVscGZ1bCBpbiByZWR1Y2luZyBjb2RlIGJsb2F0IHdoZW4gY29tbW9uCisJY29kZSBpcyBzaGFyZWQgYmV0d2VlbiByZWFkZXJzIGFuZCB1cGRhdGVycy4KIAogMTAuCUNvbnZlcnNlbHksIGlmIHlvdSBhcmUgaW4gYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLAogCXlvdSAtbXVzdC0gdXNlIHRoZSAiX3JjdSgpIiB2YXJpYW50cyBvZiB0aGUgbGlzdCBtYWNyb3MuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9yY3UudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvcmN1LnR4dAppbmRleCBlYjQ0NDAwLi42ZmEwOTIyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9yY3UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3JjdS50eHQKQEAgLTY0LDYgKzY0LDU0IEBACiAJT2YgdGhlc2UsIG9uZSB3YXMgYWxsb3dlZCB0byBsYXBzZSBieSB0aGUgYXNzaWduZWUsIGFuZCB0aGUKIAlvdGhlcnMgaGF2ZSBiZWVuIGNvbnRyaWJ1dGVkIHRvIHRoZSBMaW51eCBrZXJuZWwgdW5kZXIgR1BMLgogCitvCUkgaGVhciB0aGF0IFJDVSBuZWVkcyB3b3JrIGluIG9yZGVyIHRvIHN1cHBvcnQgcmVhbHRpbWUga2VybmVscz8KKworCVllcywgd29yayBpbiBwcm9ncmVzcy4KKwogbwlXaGVyZSBjYW4gSSBmaW5kIG1vcmUgaW5mb3JtYXRpb24gb24gUkNVPwogCiAJU2VlIHRoZSBSVEZQLnR4dCBmaWxlIGluIHRoaXMgZGlyZWN0b3J5LgorCU9yIHBvaW50IHlvdXIgYnJvd3NlciBhdCBodHRwOi8vd3d3LnJkcm9wLmNvbS91c2Vycy9wYXVsbWNrL1JDVS8uCisKK28JV2hhdCBhcmUgYWxsIHRoZXNlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5PworCisKKwlOTUktUkNVLnR4dAorCisJCURlc2NyaWJlcyBob3cgdG8gdXNlIFJDVSB0byBpbXBsZW1lbnQgZHluYW1pYworCQlOTUkgaGFuZGxlcnMsIHdoaWNoIGNhbiBiZSByZXZlY3RvcmVkIG9uIHRoZSBmbHksCisJCXdpdGhvdXQgcmVib290aW5nLgorCisJUlRGUC50eHQKKworCQlMaXN0IG9mIFJDVS1yZWxhdGVkIHB1YmxpY2F0aW9ucyBhbmQgd2ViIHNpdGVzLgorCisJVVAudHh0CisKKwkJRGlzY3Vzc2lvbiBvZiBSQ1UgdXNhZ2UgaW4gVVAga2VybmVscy4KKworCWFycmF5UkNVLnR4dAorCisJCURlc2NyaWJlcyBob3cgdG8gdXNlIFJDVSB0byBwcm90ZWN0IGFycmF5cywgd2l0aAorCQlyZXNpemVhYmxlIGFycmF5cyB3aG9zZSBlbGVtZW50cyByZWZlcmVuY2Ugb3RoZXIKKwkJZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIG9mIHRoZSBtb3N0IGludGVyZXN0LgorCisJY2hlY2tsaXN0LnR4dAorCisJCUxpc3RzIHRoaW5ncyB0byBjaGVjayBmb3Igd2hlbiBpbnNwZWN0aW5nIGNvZGUgdGhhdAorCQl1c2VzIFJDVS4KKworCWxpc3RSQ1UudHh0CisKKwkJRGVzY3JpYmVzIGhvdyB0byB1c2UgUkNVIHRvIHByb3RlY3QgbGlua2VkIGxpc3RzLgorCQlUaGlzIGlzIHRoZSBzaW1wbGVzdCBhbmQgbW9zdCBjb21tb24gdXNlIG9mIFJDVQorCQlpbiB0aGUgTGludXgga2VybmVsLgorCisJcmN1LnR4dAorCisJCVlvdSBhcmUgcmVhZGluZyBpdCEKKworCXdoYXRpc1JDVS50eHQKKworCQlPdmVydmlldyBvZiBob3cgdGhlIFJDVSBpbXBsZW1lbnRhdGlvbiB3b3Jrcy4gIEFsb25nCisJCXRoZSB3YXksIHByZXNlbnRzIGEgY29uY2VwdHVhbCB2aWV3IG9mIFJDVS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVL3JjdXJlZi50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS9yY3VyZWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyM2ZlZTYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS9yY3VyZWYudHh0CkBAIC0wLDAgKzEsNzQgQEAKK1JlZmNvdW50ZXIgZnJhbWV3b3JrIGZvciBlbGVtZW50cyBvZiBsaXN0cy9hcnJheXMgcHJvdGVjdGVkIGJ5CitSQ1UuCisKK1JlZmNvdW50aW5nIG9uIGVsZW1lbnRzIG9mICBsaXN0cyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5IHRyYWRpdGlvbmFsCityZWFkZXIvd3JpdGVyIHNwaW5sb2NrcyBvciBzZW1hcGhvcmVzIGFyZSBzdHJhaWdodCBmb3J3YXJkIGFzIGluOgorCisxLgkJCQkJMi4KK2FkZCgpCQkJCQlzZWFyY2hfYW5kX3JlZmVyZW5jZSgpCit7CQkJCQl7CisJYWxsb2Nfb2JqZWN0CQkJCXJlYWRfbG9jaygmbGlzdF9sb2NrKTsKKwkuLi4JCQkJCXNlYXJjaF9mb3JfZWxlbWVudAorCWF0b21pY19zZXQoJmVsLT5yYywgMSk7CQkJYXRvbWljX2luYygmZWwtPnJjKTsKKwl3cml0ZV9sb2NrKCZsaXN0X2xvY2spOwkJCS4uLgorCWFkZF9lbGVtZW50CQkJCXJlYWRfdW5sb2NrKCZsaXN0X2xvY2spOworCS4uLgkJCQkJLi4uCisJd3JpdGVfdW5sb2NrKCZsaXN0X2xvY2spOwl9Cit9CisKKzMuCQkJCQk0LgorcmVsZWFzZV9yZWZlcmVuY2VkKCkJCQlkZWxldGUoKQorewkJCQkJeworCS4uLgkJCQl3cml0ZV9sb2NrKCZsaXN0X2xvY2spOworCWF0b21pY19kZWMoJmVsLT5yYywgcmVsZnVuYykJLi4uCisJLi4uCQkJCWRlbGV0ZV9lbGVtZW50Cit9CQkJCQl3cml0ZV91bmxvY2soJmxpc3RfbG9jayk7CisgCQkJCQkuLi4KKwkJCQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVsLT5yYykpCisJCQkJCQlrZnJlZShlbCk7CisJCQkJCS4uLgorCQkJCQl9CisKK0lmIHRoaXMgbGlzdC9hcnJheSBpcyBtYWRlIGxvY2sgZnJlZSB1c2luZyByY3UgYXMgaW4gY2hhbmdpbmcgdGhlCit3cml0ZV9sb2NrIGluIGFkZCgpIGFuZCBkZWxldGUoKSB0byBzcGluX2xvY2sgYW5kIGNoYW5naW5nIHJlYWRfbG9jaworaW4gc2VhcmNoX2FuZF9yZWZlcmVuY2UgdG8gcmN1X3JlYWRfbG9jaygpLCB0aGUgcmN1cmVmX2dldCBpbgorc2VhcmNoX2FuZF9yZWZlcmVuY2UgY291bGQgcG90ZW50aWFsbHkgaG9sZCByZWZlcmVuY2UgdG8gYW4gZWxlbWVudCB3aGljaAoraGFzIGFscmVhZHkgYmVlbiBkZWxldGVkIGZyb20gdGhlIGxpc3QvYXJyYXkuICByY3VyZWZfbGZfZ2V0X3JjdSB0YWtlcworY2FyZSBvZiB0aGlzIHNjZW5hcmlvLiBzZWFyY2hfYW5kX3JlZmVyZW5jZSBzaG91bGQgbG9vayBhczsKKworMS4JCQkJCTIuCithZGQoKQkJCQkJc2VhcmNoX2FuZF9yZWZlcmVuY2UoKQorewkJCQkJeworIAlhbGxvY19vYmplY3QJCQkJcmN1X3JlYWRfbG9jaygpOworCS4uLgkJCQkJc2VhcmNoX2Zvcl9lbGVtZW50CisJYXRvbWljX3NldCgmZWwtPnJjLCAxKTsJCQlpZiAocmN1cmVmX2luY19sZigmZWwtPnJjKSkgeworCXdyaXRlX2xvY2soJmxpc3RfbG9jayk7CQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJCQkJCXJldHVybiBGQUlMOworCWFkZF9lbGVtZW50CQkJCX0KKwkuLi4JCQkJCS4uLgorCXdyaXRlX3VubG9jaygmbGlzdF9sb2NrKTsJCXJjdV9yZWFkX3VubG9jaygpOworfQkJCQkJfQorMy4JCQkJCTQuCityZWxlYXNlX3JlZmVyZW5jZWQoKQkJCWRlbGV0ZSgpCit7CQkJCQl7CisJLi4uCQkJCXdyaXRlX2xvY2soJmxpc3RfbG9jayk7CisJcmN1cmVmX2RlYygmZWwtPnJjLCByZWxmdW5jKQkuLi4KKwkuLi4JCQkJZGVsZXRlX2VsZW1lbnQKK30JCQkJCXdyaXRlX3VubG9jaygmbGlzdF9sb2NrKTsKKyAJCQkJCS4uLgorCQkJCQlpZiAocmN1cmVmX2RlY19hbmRfdGVzdCgmZWwtPnJjKSkKKwkJCQkJCWNhbGxfcmN1KCZlbC0+aGVhZCwgZWxfZnJlZSk7CisJCQkJCS4uLgorCQkJCQl9CisKK1NvbWV0aW1lcywgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IG5lZWQgdG8gYmUgb2J0YWluZWQgaW4gdGhlCit1cGRhdGUgKHdyaXRlKSBzdHJlYW0uICBJbiBzdWNoIGNhc2VzLCByY3VyZWZfaW5jX2xmIG1pZ2h0IGJlIGFuIG92ZXJraWxsCitzaW5jZSB0aGUgc3BpbmxvY2sgc2VyaWFsaXNpbmcgbGlzdCB1cGRhdGVzIGFyZSBoZWxkLiByY3VyZWZfaW5jCitpcyB0byBiZSB1c2VkIGluIHN1Y2ggY2FzZXMuCitGb3IgYXJjaGVzIHdoaWNoIGRvIG5vdCBoYXZlIGNtcHhjaGcgcmN1cmVmX2luY19sZgorYXBpIHVzZXMgYSBoYXNoZWQgc3BpbmxvY2sgaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzYW1lIGhhc2hlZCBzcGlubG9jaworaXMgYWNxdWlyZWQgaW4gYWxsIHJjdXJlZl94eHggcHJpbWl0aXZlcyB0byBwcmVzZXJ2ZSBhdG9taWNpdHkuCitOb3RlOiBVc2UgcmN1cmVmX2luYyBhcGkgb25seSBpZiB5b3UgbmVlZCB0byB1c2UgcmN1cmVmX2luY19sZiBvbiB0aGUKK3JlZmNvdW50ZXIgYXRsZWFzdCBhdCBvbmUgcGxhY2UuICBNaXhpbmcgcmN1cmVmX2luYyBhbmQgYXRvbWljX3h4eCBhcGkKK21pZ2h0IGxlYWQgdG8gcmFjZXMuIHJjdXJlZl9pbmNfbGYoKSBtdXN0IGJlIHVzZWQgaW4gbG9ja2ZyZWUKK1JDVSBjcml0aWNhbCBzZWN0aW9ucyBvbmx5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0ZDg5YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS50eHQKQEAgLTAsMCArMSw5MDIgQEAKK1doYXQgaXMgUkNVPworCitSQ1UgaXMgYSBzeW5jaHJvbml6YXRpb24gbWVjaGFuaXNtIHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBMaW51eCBrZXJuZWwKK2R1cmluZyB0aGUgMi41IGRldmVsb3BtZW50IGVmZm9ydCB0aGF0IGlzIG9wdGltaXplZCBmb3IgcmVhZC1tb3N0bHkKK3NpdHVhdGlvbnMuICBBbHRob3VnaCBSQ1UgaXMgYWN0dWFsbHkgcXVpdGUgc2ltcGxlIG9uY2UgeW91IHVuZGVyc3RhbmQgaXQsCitnZXR0aW5nIHRoZXJlIGNhbiBzb21ldGltZXMgYmUgYSBjaGFsbGVuZ2UuICBQYXJ0IG9mIHRoZSBwcm9ibGVtIGlzIHRoYXQKK21vc3Qgb2YgdGhlIHBhc3QgZGVzY3JpcHRpb25zIG9mIFJDVSBoYXZlIGJlZW4gd3JpdHRlbiB3aXRoIHRoZSBtaXN0YWtlbgorYXNzdW1wdGlvbiB0aGF0IHRoZXJlIGlzICJvbmUgdHJ1ZSB3YXkiIHRvIGRlc2NyaWJlIFJDVS4gIEluc3RlYWQsCit0aGUgZXhwZXJpZW5jZSBoYXMgYmVlbiB0aGF0IGRpZmZlcmVudCBwZW9wbGUgbXVzdCB0YWtlIGRpZmZlcmVudCBwYXRocwordG8gYXJyaXZlIGF0IGFuIHVuZGVyc3RhbmRpbmcgb2YgUkNVLiAgVGhpcyBkb2N1bWVudCBwcm92aWRlcyBzZXZlcmFsCitkaWZmZXJlbnQgcGF0aHMsIGFzIGZvbGxvd3M6CisKKzEuCVJDVSBPVkVSVklFVworMi4JV0hBVCBJUyBSQ1UnUyBDT1JFIEFQST8KKzMuCVdIQVQgQVJFIFNPTUUgRVhBTVBMRSBVU0VTIE9GIENPUkUgUkNVIEFQST8KKzQuCVdIQVQgSUYgTVkgVVBEQVRJTkcgVEhSRUFEIENBTk5PVCBCTE9DSz8KKzUuCVdIQVQgQVJFIFNPTUUgU0lNUExFIElNUExFTUVOVEFUSU9OUyBPRiBSQ1U/Cis2LglBTkFMT0dZIFdJVEggUkVBREVSLVdSSVRFUiBMT0NLSU5HCis3LglGVUxMIExJU1QgT0YgUkNVIEFQSXMKKzguCUFOU1dFUlMgVE8gUVVJQ0sgUVVJWlpFUworCitQZW9wbGUgd2hvIHByZWZlciBzdGFydGluZyB3aXRoIGEgY29uY2VwdHVhbCBvdmVydmlldyBzaG91bGQgZm9jdXMgb24KK1NlY3Rpb24gMSwgdGhvdWdoIG1vc3QgcmVhZGVycyB3aWxsIHByb2ZpdCBieSByZWFkaW5nIHRoaXMgc2VjdGlvbiBhdAorc29tZSBwb2ludC4gIFBlb3BsZSB3aG8gcHJlZmVyIHRvIHN0YXJ0IHdpdGggYW4gQVBJIHRoYXQgdGhleSBjYW4gdGhlbgorZXhwZXJpbWVudCB3aXRoIHNob3VsZCBmb2N1cyBvbiBTZWN0aW9uIDIuICBQZW9wbGUgd2hvIHByZWZlciB0byBzdGFydAord2l0aCBleGFtcGxlIHVzZXMgc2hvdWxkIGZvY3VzIG9uIFNlY3Rpb25zIDMgYW5kIDQuICBQZW9wbGUgd2hvIG5lZWQgdG8KK3VuZGVyc3RhbmQgdGhlIFJDVSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZm9jdXMgb24gU2VjdGlvbiA1LCB0aGVuIGRpdmUKK2ludG8gdGhlIGtlcm5lbCBzb3VyY2UgY29kZS4gIFBlb3BsZSB3aG8gcmVhc29uIGJlc3QgYnkgYW5hbG9neSBzaG91bGQKK2ZvY3VzIG9uIFNlY3Rpb24gNi4gIFNlY3Rpb24gNyBzZXJ2ZXMgYXMgYW4gaW5kZXggdG8gdGhlIGRvY2Jvb2sgQVBJCitkb2N1bWVudGF0aW9uLCBhbmQgU2VjdGlvbiA4IGlzIHRoZSB0cmFkaXRpb25hbCBhbnN3ZXIga2V5LgorCitTbywgc3RhcnQgd2l0aCB0aGUgc2VjdGlvbiB0aGF0IG1ha2VzIHRoZSBtb3N0IHNlbnNlIHRvIHlvdSBhbmQgeW91cgorcHJlZmVycmVkIG1ldGhvZCBvZiBsZWFybmluZy4gIElmIHlvdSBuZWVkIHRvIGtub3cgZXZlcnl0aGluZyBhYm91dAorZXZlcnl0aGluZywgZmVlbCBmcmVlIHRvIHJlYWQgdGhlIHdob2xlIHRoaW5nIC0tIGJ1dCBpZiB5b3UgYXJlIHJlYWxseQordGhhdCB0eXBlIG9mIHBlcnNvbiwgeW91IGhhdmUgcGVydXNlZCB0aGUgc291cmNlIGNvZGUgYW5kIHdpbGwgdGhlcmVmb3JlCituZXZlciBuZWVkIHRoaXMgZG9jdW1lbnQgYW55d2F5LiAgOy0pCisKKworMS4gIFJDVSBPVkVSVklFVworCitUaGUgYmFzaWMgaWRlYSBiZWhpbmQgUkNVIGlzIHRvIHNwbGl0IHVwZGF0ZXMgaW50byAicmVtb3ZhbCIgYW5kCisicmVjbGFtYXRpb24iIHBoYXNlcy4gIFRoZSByZW1vdmFsIHBoYXNlIHJlbW92ZXMgcmVmZXJlbmNlcyB0byBkYXRhIGl0ZW1zCit3aXRoaW4gYSBkYXRhIHN0cnVjdHVyZSAocG9zc2libHkgYnkgcmVwbGFjaW5nIHRoZW0gd2l0aCByZWZlcmVuY2VzIHRvCituZXcgdmVyc2lvbnMgb2YgdGhlc2UgZGF0YSBpdGVtcyksIGFuZCBjYW4gcnVuIGNvbmN1cnJlbnRseSB3aXRoIHJlYWRlcnMuCitUaGUgcmVhc29uIHRoYXQgaXQgaXMgc2FmZSB0byBydW4gdGhlIHJlbW92YWwgcGhhc2UgY29uY3VycmVudGx5IHdpdGgKK3JlYWRlcnMgaXMgdGhlIHNlbWFudGljcyBvZiBtb2Rlcm4gQ1BVcyBndWFyYW50ZWUgdGhhdCByZWFkZXJzIHdpbGwgc2VlCitlaXRoZXIgdGhlIG9sZCBvciB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGRhdGEgc3RydWN0dXJlIHJhdGhlciB0aGFuIGEKK3BhcnRpYWxseSB1cGRhdGVkIHJlZmVyZW5jZS4gIFRoZSByZWNsYW1hdGlvbiBwaGFzZSBkb2VzIHRoZSB3b3JrIG9mIHJlY2xhaW1pbmcKKyhlLmcuLCBmcmVlaW5nKSB0aGUgZGF0YSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGRhdGEgc3RydWN0dXJlIGR1cmluZyB0aGUKK3JlbW92YWwgcGhhc2UuICBCZWNhdXNlIHJlY2xhaW1pbmcgZGF0YSBpdGVtcyBjYW4gZGlzcnVwdCBhbnkgcmVhZGVycworY29uY3VycmVudGx5IHJlZmVyZW5jaW5nIHRob3NlIGRhdGEgaXRlbXMsIHRoZSByZWNsYW1hdGlvbiBwaGFzZSBtdXN0Citub3Qgc3RhcnQgdW50aWwgcmVhZGVycyBubyBsb25nZXIgaG9sZCByZWZlcmVuY2VzIHRvIHRob3NlIGRhdGEgaXRlbXMuCisKK1NwbGl0dGluZyB0aGUgdXBkYXRlIGludG8gcmVtb3ZhbCBhbmQgcmVjbGFtYXRpb24gcGhhc2VzIHBlcm1pdHMgdGhlCit1cGRhdGVyIHRvIHBlcmZvcm0gdGhlIHJlbW92YWwgcGhhc2UgaW1tZWRpYXRlbHksIGFuZCB0byBkZWZlciB0aGUKK3JlY2xhbWF0aW9uIHBoYXNlIHVudGlsIGFsbCByZWFkZXJzIGFjdGl2ZSBkdXJpbmcgdGhlIHJlbW92YWwgcGhhc2UgaGF2ZQorY29tcGxldGVkLCBlaXRoZXIgYnkgYmxvY2tpbmcgdW50aWwgdGhleSBmaW5pc2ggb3IgYnkgcmVnaXN0ZXJpbmcgYQorY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIGFmdGVyIHRoZXkgZmluaXNoLiAgT25seSByZWFkZXJzIHRoYXQgYXJlIGFjdGl2ZQorZHVyaW5nIHRoZSByZW1vdmFsIHBoYXNlIG5lZWQgYmUgY29uc2lkZXJlZCwgYmVjYXVzZSBhbnkgcmVhZGVyIHN0YXJ0aW5nCithZnRlciB0aGUgcmVtb3ZhbCBwaGFzZSB3aWxsIGJlIHVuYWJsZSB0byBnYWluIGEgcmVmZXJlbmNlIHRvIHRoZSByZW1vdmVkCitkYXRhIGl0ZW1zLCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBkaXNydXB0ZWQgYnkgdGhlIHJlY2xhbWF0aW9uIHBoYXNlLgorCitTbyB0aGUgdHlwaWNhbCBSQ1UgdXBkYXRlIHNlcXVlbmNlIGdvZXMgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzoKKworYS4JUmVtb3ZlIHBvaW50ZXJzIHRvIGEgZGF0YSBzdHJ1Y3R1cmUsIHNvIHRoYXQgc3Vic2VxdWVudAorCXJlYWRlcnMgY2Fubm90IGdhaW4gYSByZWZlcmVuY2UgdG8gaXQuCisKK2IuCVdhaXQgZm9yIGFsbCBwcmV2aW91cyByZWFkZXJzIHRvIGNvbXBsZXRlIHRoZWlyIFJDVSByZWFkLXNpZGUKKwljcml0aWNhbCBzZWN0aW9ucy4KKworYy4JQXQgdGhpcyBwb2ludCwgdGhlcmUgY2Fubm90IGJlIGFueSByZWFkZXJzIHdobyBob2xkIHJlZmVyZW5jZXMKKwl0byB0aGUgZGF0YSBzdHJ1Y3R1cmUsIHNvIGl0IG5vdyBtYXkgc2FmZWx5IGJlIHJlY2xhaW1lZAorCShlLmcuLCBrZnJlZSgpZCkuCisKK1N0ZXAgKGIpIGFib3ZlIGlzIHRoZSBrZXkgaWRlYSB1bmRlcmx5aW5nIFJDVSdzIGRlZmVycmVkIGRlc3RydWN0aW9uLgorVGhlIGFiaWxpdHkgdG8gd2FpdCB1bnRpbCBhbGwgcmVhZGVycyBhcmUgZG9uZSBhbGxvd3MgUkNVIHJlYWRlcnMgdG8KK3VzZSBtdWNoIGxpZ2h0ZXItd2VpZ2h0IHN5bmNocm9uaXphdGlvbiwgaW4gc29tZSBjYXNlcywgYWJzb2x1dGVseSBubworc3luY2hyb25pemF0aW9uIGF0IGFsbC4gIEluIGNvbnRyYXN0LCBpbiBtb3JlIGNvbnZlbnRpb25hbCBsb2NrLWJhc2VkCitzY2hlbWVzLCByZWFkZXJzIG11c3QgdXNlIGhlYXZ5LXdlaWdodCBzeW5jaHJvbml6YXRpb24gaW4gb3JkZXIgdG8KK3ByZXZlbnQgYW4gdXBkYXRlciBmcm9tIGRlbGV0aW5nIHRoZSBkYXRhIHN0cnVjdHVyZSBvdXQgZnJvbSB1bmRlciB0aGVtLgorVGhpcyBpcyBiZWNhdXNlIGxvY2stYmFzZWQgdXBkYXRlcnMgdHlwaWNhbGx5IHVwZGF0ZSBkYXRhIGl0ZW1zIGluIHBsYWNlLAorYW5kIG11c3QgdGhlcmVmb3JlIGV4Y2x1ZGUgcmVhZGVycy4gIEluIGNvbnRyYXN0LCBSQ1UtYmFzZWQgdXBkYXRlcnMKK3R5cGljYWxseSB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHdyaXRlcyB0byBzaW5nbGUgYWxpZ25lZAorcG9pbnRlcnMgYXJlIGF0b21pYyBvbiBtb2Rlcm4gQ1BVcywgYWxsb3dpbmcgYXRvbWljIGluc2VydGlvbiwgcmVtb3ZhbCwKK2FuZCByZXBsYWNlbWVudCBvZiBkYXRhIGl0ZW1zIGluIGEgbGlua2VkIHN0cnVjdHVyZSB3aXRob3V0IGRpc3J1cHRpbmcKK3JlYWRlcnMuICBDb25jdXJyZW50IFJDVSByZWFkZXJzIGNhbiB0aGVuIGNvbnRpbnVlIGFjY2Vzc2luZyB0aGUgb2xkCit2ZXJzaW9ucywgYW5kIGNhbiBkaXNwZW5zZSB3aXRoIHRoZSBhdG9taWMgb3BlcmF0aW9ucywgbWVtb3J5IGJhcnJpZXJzLAorYW5kIGNvbW11bmljYXRpb25zIGNhY2hlIG1pc3NlcyB0aGF0IGFyZSBzbyBleHBlbnNpdmUgb24gcHJlc2VudC1kYXkKK1NNUCBjb21wdXRlciBzeXN0ZW1zLCBldmVuIGluIGFic2VuY2Ugb2YgbG9jayBjb250ZW50aW9uLgorCitJbiB0aGUgdGhyZWUtc3RlcCBwcm9jZWR1cmUgc2hvd24gYWJvdmUsIHRoZSB1cGRhdGVyIGlzIHBlcmZvcm1pbmcgYm90aAordGhlIHJlbW92YWwgYW5kIHRoZSByZWNsYW1hdGlvbiBzdGVwLCBidXQgaXQgaXMgb2Z0ZW4gaGVscGZ1bCBmb3IgYW4KK2VudGlyZWx5IGRpZmZlcmVudCB0aHJlYWQgdG8gZG8gdGhlIHJlY2xhbWF0aW9uLCBhcyBpcyBpbiBmYWN0IHRoZSBjYXNlCitpbiB0aGUgTGludXgga2VybmVsJ3MgZGlyZWN0b3J5LWVudHJ5IGNhY2hlIChkY2FjaGUpLiAgRXZlbiBpZiB0aGUgc2FtZQordGhyZWFkIHBlcmZvcm1zIGJvdGggdGhlIHVwZGF0ZSBzdGVwIChzdGVwIChhKSBhYm92ZSkgYW5kIHRoZSByZWNsYW1hdGlvbgorc3RlcCAoc3RlcCAoYykgYWJvdmUpLCBpdCBpcyBvZnRlbiBoZWxwZnVsIHRvIHRoaW5rIG9mIHRoZW0gc2VwYXJhdGVseS4KK0ZvciBleGFtcGxlLCBSQ1UgcmVhZGVycyBhbmQgdXBkYXRlcnMgbmVlZCBub3QgY29tbXVuaWNhdGUgYXQgYWxsLAorYnV0IFJDVSBwcm92aWRlcyBpbXBsaWNpdCBsb3ctb3ZlcmhlYWQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHJlYWRlcnMKK2FuZCByZWNsYWltZXJzLCBuYW1lbHksIGluIHN0ZXAgKGIpIGFib3ZlLgorCitTbyBob3cgdGhlIGhlY2sgY2FuIGEgcmVjbGFpbWVyIHRlbGwgd2hlbiBhIHJlYWRlciBpcyBkb25lLCBnaXZlbgordGhhdCByZWFkZXJzIGFyZSBub3QgZG9pbmcgYW55IHNvcnQgb2Ygc3luY2hyb25pemF0aW9uIG9wZXJhdGlvbnM/Pz8KK1JlYWQgb24gdG8gbGVhcm4gYWJvdXQgaG93IFJDVSdzIEFQSSBtYWtlcyB0aGlzIGVhc3kuCisKKworMi4gIFdIQVQgSVMgUkNVJ1MgQ09SRSBBUEk/CisKK1RoZSBjb3JlIFJDVSBBUEkgaXMgcXVpdGUgc21hbGw6CisKK2EuCXJjdV9yZWFkX2xvY2soKQorYi4JcmN1X3JlYWRfdW5sb2NrKCkKK2MuCXN5bmNocm9uaXplX3JjdSgpIC8gY2FsbF9yY3UoKQorZC4JcmN1X2Fzc2lnbl9wb2ludGVyKCkKK2UuCXJjdV9kZXJlZmVyZW5jZSgpCisKK1RoZXJlIGFyZSBtYW55IG90aGVyIG1lbWJlcnMgb2YgdGhlIFJDVSBBUEksIGJ1dCB0aGUgcmVzdCBjYW4gYmUKK2V4cHJlc3NlZCBpbiB0ZXJtcyBvZiB0aGVzZSBmaXZlLCB0aG91Z2ggbW9zdCBpbXBsZW1lbnRhdGlvbnMgaW5zdGVhZAorZXhwcmVzcyBzeW5jaHJvbml6ZV9yY3UoKSBpbiB0ZXJtcyBvZiB0aGUgY2FsbF9yY3UoKSBjYWxsYmFjayBBUEkuCisKK1RoZSBmaXZlIGNvcmUgUkNVIEFQSXMgYXJlIGRlc2NyaWJlZCBiZWxvdywgdGhlIG90aGVyIDE4IHdpbGwgYmUgZW51bWVyYXRlZAorbGF0ZXIuICBTZWUgdGhlIGtlcm5lbCBkb2Nib29rIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mbywgb3IgbG9vayBkaXJlY3RseQorYXQgdGhlIGZ1bmN0aW9uIGhlYWRlciBjb21tZW50cy4KKworcmN1X3JlYWRfbG9jaygpCisKKwl2b2lkIHJjdV9yZWFkX2xvY2sodm9pZCk7CisKKwlVc2VkIGJ5IGEgcmVhZGVyIHRvIGluZm9ybSB0aGUgcmVjbGFpbWVyIHRoYXQgdGhlIHJlYWRlciBpcworCWVudGVyaW5nIGFuIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4gIEl0IGlzIGlsbGVnYWwKKwl0byBibG9jayB3aGlsZSBpbiBhbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24sIHRob3VnaAorCWtlcm5lbHMgYnVpbHQgd2l0aCBDT05GSUdfUFJFRU1QVF9SQ1UgY2FuIHByZWVtcHQgUkNVIHJlYWQtc2lkZQorCWNyaXRpY2FsIHNlY3Rpb25zLiAgQW55IFJDVS1wcm90ZWN0ZWQgZGF0YSBzdHJ1Y3R1cmUgYWNjZXNzZWQKKwlkdXJpbmcgYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmVtYWluCisJdW5yZWNsYWltZWQgZm9yIHRoZSBmdWxsIGR1cmF0aW9uIG9mIHRoYXQgY3JpdGljYWwgc2VjdGlvbi4KKwlSZWZlcmVuY2UgY291bnRzIG1heSBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggUkNVIHRvIG1haW50YWluCisJbG9uZ2VyLXRlcm0gcmVmZXJlbmNlcyB0byBkYXRhIHN0cnVjdHVyZXMuCisKK3JjdV9yZWFkX3VubG9jaygpCisKKwl2b2lkIHJjdV9yZWFkX3VubG9jayh2b2lkKTsKKworCVVzZWQgYnkgYSByZWFkZXIgdG8gaW5mb3JtIHRoZSByZWNsYWltZXIgdGhhdCB0aGUgcmVhZGVyIGlzCisJZXhpdGluZyBhbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uICBOb3RlIHRoYXQgUkNVCisJcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIG1heSBiZSBuZXN0ZWQgYW5kL29yIG92ZXJsYXBwaW5nLgorCitzeW5jaHJvbml6ZV9yY3UoKQorCisJdm9pZCBzeW5jaHJvbml6ZV9yY3Uodm9pZCk7CisKKwlNYXJrcyB0aGUgZW5kIG9mIHVwZGF0ZXIgY29kZSBhbmQgdGhlIGJlZ2lubmluZyBvZiByZWNsYWltZXIKKwljb2RlLiAgSXQgZG9lcyB0aGlzIGJ5IGJsb2NraW5nIHVudGlsIGFsbCBwcmUtZXhpc3RpbmcgUkNVCisJcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIG9uIGFsbCBDUFVzIGhhdmUgY29tcGxldGVkLgorCU5vdGUgdGhhdCBzeW5jaHJvbml6ZV9yY3UoKSB3aWxsIC1ub3QtIG5lY2Vzc2FyaWx5IHdhaXQgZm9yCisJYW55IHN1YnNlcXVlbnQgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucyB0byBjb21wbGV0ZS4KKwlGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBvZiBldmVudHM6CisKKwkgICAgICAgICBDUFUgMCAgICAgICAgICAgICAgICAgIENQVSAxICAgICAgICAgICAgICAgICBDUFUgMgorCSAgICAgLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0KKwkgMS4gIHJjdV9yZWFkX2xvY2soKQorCSAyLiAgICAgICAgICAgICAgICAgICAgZW50ZXJzIHN5bmNocm9uaXplX3JjdSgpCisJIDMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY3VfcmVhZF9sb2NrKCkKKwkgNC4gIHJjdV9yZWFkX3VubG9jaygpCisJIDUuICAgICAgICAgICAgICAgICAgICAgZXhpdHMgc3luY2hyb25pemVfcmN1KCkKKwkgNi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmN1X3JlYWRfdW5sb2NrKCkKKworCVRvIHJlaXRlcmF0ZSwgc3luY2hyb25pemVfcmN1KCkgd2FpdHMgb25seSBmb3Igb25nb2luZyBSQ1UKKwlyZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgdG8gY29tcGxldGUsIG5vdCBuZWNlc3NhcmlseSBmb3IKKwlhbnkgdGhhdCBiZWdpbiBhZnRlciBzeW5jaHJvbml6ZV9yY3UoKSBpcyBpbnZva2VkLgorCisJT2YgY291cnNlLCBzeW5jaHJvbml6ZV9yY3UoKSBkb2VzIG5vdCBuZWNlc3NhcmlseSByZXR1cm4KKwktaW1tZWRpYXRlbHktIGFmdGVyIHRoZSBsYXN0IHByZS1leGlzdGluZyBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsCisJc2VjdGlvbiBjb21wbGV0ZXMuICBGb3Igb25lIHRoaW5nLCB0aGVyZSBtaWdodCB3ZWxsIGJlIHNjaGVkdWxpbmcKKwlkZWxheXMuICBGb3IgYW5vdGhlciB0aGluZywgbWFueSBSQ1UgaW1wbGVtZW50YXRpb25zIHByb2Nlc3MKKwlyZXF1ZXN0cyBpbiBiYXRjaGVzIGluIG9yZGVyIHRvIGltcHJvdmUgZWZmaWNpZW5jaWVzLCB3aGljaCBjYW4KKwlmdXJ0aGVyIGRlbGF5IHN5bmNocm9uaXplX3JjdSgpLgorCisJU2luY2Ugc3luY2hyb25pemVfcmN1KCkgaXMgdGhlIEFQSSB0aGF0IG11c3QgZmlndXJlIG91dCB3aGVuCisJcmVhZGVycyBhcmUgZG9uZSwgaXRzIGltcGxlbWVudGF0aW9uIGlzIGtleSB0byBSQ1UuICBGb3IgUkNVCisJdG8gYmUgdXNlZnVsIGluIGFsbCBidXQgdGhlIG1vc3QgcmVhZC1pbnRlbnNpdmUgc2l0dWF0aW9ucywKKwlzeW5jaHJvbml6ZV9yY3UoKSdzIG92ZXJoZWFkIG11c3QgYWxzbyBiZSBxdWl0ZSBzbWFsbC4KKworCVRoZSBjYWxsX3JjdSgpIEFQSSBpcyBhIGNhbGxiYWNrIGZvcm0gb2Ygc3luY2hyb25pemVfcmN1KCksCisJYW5kIGlzIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiBhIGxhdGVyIHNlY3Rpb24uICBJbnN0ZWFkIG9mCisJYmxvY2tpbmcsIGl0IHJlZ2lzdGVycyBhIGZ1bmN0aW9uIGFuZCBhcmd1bWVudCB3aGljaCBhcmUgaW52b2tlZAorCWFmdGVyIGFsbCBvbmdvaW5nIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgaGF2ZSBjb21wbGV0ZWQuCisJVGhpcyBjYWxsYmFjayB2YXJpYW50IGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4gc2l0dWF0aW9ucyB3aGVyZQorCWl0IGlzIGlsbGVnYWwgdG8gYmxvY2suCisKK3JjdV9hc3NpZ25fcG9pbnRlcigpCisKKwl0eXBlb2YocCkgcmN1X2Fzc2lnbl9wb2ludGVyKHAsIHR5cGVvZihwKSB2KTsKKworCVllcywgcmN1X2Fzc2lnbl9wb2ludGVyKCkgLWlzLSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLCB0aG91Z2ggaXQKKwl3b3VsZCBiZSBjb29sIHRvIGJlIGFibGUgdG8gZGVjbGFyZSBhIGZ1bmN0aW9uIGluIHRoaXMgbWFubmVyLgorCShDb21waWxlciBleHBlcnRzIHdpbGwgbm8gZG91YnQgZGlzYWdyZWUuKQorCisJVGhlIHVwZGF0ZXIgdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIGFzc2lnbiBhIG5ldyB2YWx1ZSB0byBhbgorCVJDVS1wcm90ZWN0ZWQgcG9pbnRlciwgaW4gb3JkZXIgdG8gc2FmZWx5IGNvbW11bmljYXRlIHRoZSBjaGFuZ2UKKwlpbiB2YWx1ZSBmcm9tIHRoZSB1cGRhdGVyIHRvIHRoZSByZWFkZXIuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMKKwl0aGUgbmV3IHZhbHVlLCBhbmQgYWxzbyBleGVjdXRlcyBhbnkgbWVtb3J5LWJhcnJpZXIgaW5zdHJ1Y3Rpb25zCisJcmVxdWlyZWQgZm9yIGEgZ2l2ZW4gQ1BVIGFyY2hpdGVjdHVyZS4KKworCVBlcmhhcHMgbW9yZSBpbXBvcnRhbnQsIGl0IHNlcnZlcyB0byBkb2N1bWVudCB3aGljaCBwb2ludGVycworCWFyZSBwcm90ZWN0ZWQgYnkgUkNVLiAgVGhhdCBzYWlkLCByY3VfYXNzaWduX3BvaW50ZXIoKSBpcyBtb3N0CisJZnJlcXVlbnRseSB1c2VkIGluZGlyZWN0bHksIHZpYSB0aGUgX3JjdSBsaXN0LW1hbmlwdWxhdGlvbgorCXByaW1pdGl2ZXMgc3VjaCBhcyBsaXN0X2FkZF9yY3UoKS4KKworcmN1X2RlcmVmZXJlbmNlKCkKKworCXR5cGVvZihwKSByY3VfZGVyZWZlcmVuY2UocCk7CisKKwlMaWtlIHJjdV9hc3NpZ25fcG9pbnRlcigpLCByY3VfZGVyZWZlcmVuY2UoKSBtdXN0IGJlIGltcGxlbWVudGVkCisJYXMgYSBtYWNyby4KKworCVRoZSByZWFkZXIgdXNlcyByY3VfZGVyZWZlcmVuY2UoKSB0byBmZXRjaCBhbiBSQ1UtcHJvdGVjdGVkCisJcG9pbnRlciwgd2hpY2ggcmV0dXJucyBhIHZhbHVlIHRoYXQgbWF5IHRoZW4gYmUgc2FmZWx5CisJZGVyZWZlcmVuY2VkLiAgTm90ZSB0aGF0IHJjdV9kZWZlcmVuY2UoKSBkb2VzIG5vdCBhY3R1YWxseQorCWRlcmVmZXJlbmNlIHRoZSBwb2ludGVyLCBpbnN0ZWFkLCBpdCBwcm90ZWN0cyB0aGUgcG9pbnRlciBmb3IKKwlsYXRlciBkZXJlZmVyZW5jaW5nLiAgSXQgYWxzbyBleGVjdXRlcyBhbnkgbmVlZGVkIG1lbW9yeS1iYXJyaWVyCisJaW5zdHJ1Y3Rpb25zIGZvciBhIGdpdmVuIENQVSBhcmNoaXRlY3R1cmUuICBDdXJyZW50bHksIG9ubHkgQWxwaGEKKwluZWVkcyBtZW1vcnkgYmFycmllcnMgd2l0aGluIHJjdV9kZXJlZmVyZW5jZSgpIC0tIG9uIG90aGVyIENQVXMsCisJaXQgY29tcGlsZXMgdG8gbm90aGluZywgbm90IGV2ZW4gYSBjb21waWxlciBkaXJlY3RpdmUuCisKKwlDb21tb24gY29kaW5nIHByYWN0aWNlIHVzZXMgcmN1X2RlcmVmZXJlbmNlKCkgdG8gY29weSBhbgorCVJDVS1wcm90ZWN0ZWQgcG9pbnRlciB0byBhIGxvY2FsIHZhcmlhYmxlLCB0aGVuIGRlcmVmZXJlbmNlcworCXRoaXMgbG9jYWwgdmFyaWFibGUsIGZvciBleGFtcGxlIGFzIGZvbGxvd3M6CisKKwkJcCA9IHJjdV9kZXJlZmVyZW5jZShoZWFkLm5leHQpOworCQlyZXR1cm4gcC0+ZGF0YTsKKworCUhvd2V2ZXIsIGluIHRoaXMgY2FzZSwgb25lIGNvdWxkIGp1c3QgYXMgZWFzaWx5IGNvbWJpbmUgdGhlc2UKKwlpbnRvIG9uZSBzdGF0ZW1lbnQ6CisKKwkJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZShoZWFkLm5leHQpLT5kYXRhOworCisJSWYgeW91IGFyZSBnb2luZyB0byBiZSBmZXRjaGluZyBtdWx0aXBsZSBmaWVsZHMgZnJvbSB0aGUKKwlSQ1UtcHJvdGVjdGVkIHN0cnVjdHVyZSwgdXNpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGlzIG9mCisJY291cnNlIHByZWZlcnJlZC4gIFJlcGVhdGVkIHJjdV9kZXJlZmVyZW5jZSgpIGNhbGxzIGxvb2sKKwl1Z2x5IGFuZCBpbmN1ciB1bm5lY2Vzc2FyeSBvdmVyaGVhZCBvbiBBbHBoYSBDUFVzLgorCisJTm90ZSB0aGF0IHRoZSB2YWx1ZSByZXR1cm5lZCBieSByY3VfZGVyZWZlcmVuY2UoKSBpcyB2YWxpZAorCW9ubHkgd2l0aGluIHRoZSBlbmNsb3NpbmcgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLgorCUZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGlzIC1ub3QtIGxlZ2FsOgorCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJcCA9IHJjdV9kZXJlZmVyZW5jZShoZWFkLm5leHQpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJeCA9IHAtPmFkZHJlc3M7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJeSA9IHAtPmRhdGE7CisJCXJjdV9yZWFkX3VubG9jaygpOworCisJSG9sZGluZyBhIHJlZmVyZW5jZSBmcm9tIG9uZSBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24KKwl0byBhbm90aGVyIGlzIGp1c3QgYXMgaWxsZWdhbCBhcyBob2xkaW5nIGEgcmVmZXJlbmNlIGZyb20KKwlvbmUgbG9jay1iYXNlZCBjcml0aWNhbCBzZWN0aW9uIHRvIGFub3RoZXIhICBTaW1pbGFybHksCisJdXNpbmcgYSByZWZlcmVuY2Ugb3V0c2lkZSBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBpbiB3aGljaAorCWl0IHdhcyBhY3F1aXJlZCBpcyBqdXN0IGFzIGlsbGVnYWwgYXMgZG9pbmcgc28gd2l0aCBub3JtYWwKKwlsb2NraW5nLgorCisJQXMgd2l0aCByY3VfYXNzaWduX3BvaW50ZXIoKSwgYW4gaW1wb3J0YW50IGZ1bmN0aW9uIG9mCisJcmN1X2RlcmVmZXJlbmNlKCkgaXMgdG8gZG9jdW1lbnQgd2hpY2ggcG9pbnRlcnMgYXJlIHByb3RlY3RlZAorCWJ5IFJDVS4gIEFuZCwgYWdhaW4gbGlrZSByY3VfYXNzaWduX3BvaW50ZXIoKSwgcmN1X2RlcmVmZXJlbmNlKCkKKwlpcyB0eXBpY2FsbHkgdXNlZCBpbmRpcmVjdGx5LCB2aWEgdGhlIF9yY3UgbGlzdC1tYW5pcHVsYXRpb24KKwlwcmltaXRpdmVzLCBzdWNoIGFzIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KCkuCisKK1RoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzaG93cyBob3cgZWFjaCBBUEkgY29tbXVuaWNhdGVzIGFtb25nIHRoZQorcmVhZGVyLCB1cGRhdGVyLCBhbmQgcmVjbGFpbWVyLgorCisKKwkgICAgcmN1X2Fzc2lnbl9wb2ludGVyKCkKKwkgICAgCQkJICAgICstLS0tLS0tLSsKKwkgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fCByZWFkZXIgfC0tLS0tLS0tLSsKKwkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tKyAgICAgICAgIHwKKwkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKKwkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgUHJvdGVjdDoKKwkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgcmN1X3JlYWRfbG9jaygpCisJICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8IHJjdV9yZWFkX3VubG9jaygpCisJICAgIHwgICAgICAgIHJjdV9kZXJlZmVyZW5jZSgpICB8ICAgICAgICAgICAgICB8CisgICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAorICAgICAgIHwgdXBkYXRlciB8PC0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgIHwKKyAgICAgICArLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWCisJICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisJICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58IHJlY2xhaW1lciB8CisJICAgIAkJCQkgICAgICAgICArLS0tLS0tLS0tLS0rCisJICAgICAgRGVmZXI6CisJICAgICAgc3luY2hyb25pemVfcmN1KCkgJiBjYWxsX3JjdSgpCisKKworVGhlIFJDVSBpbmZyYXN0cnVjdHVyZSBvYnNlcnZlcyB0aGUgdGltZSBzZXF1ZW5jZSBvZiByY3VfcmVhZF9sb2NrKCksCityY3VfcmVhZF91bmxvY2soKSwgc3luY2hyb25pemVfcmN1KCksIGFuZCBjYWxsX3JjdSgpIGludm9jYXRpb25zIGluCitvcmRlciB0byBkZXRlcm1pbmUgd2hlbiAoMSkgc3luY2hyb25pemVfcmN1KCkgaW52b2NhdGlvbnMgbWF5IHJldHVybgordG8gdGhlaXIgY2FsbGVycyBhbmQgKDIpIGNhbGxfcmN1KCkgY2FsbGJhY2tzIG1heSBiZSBpbnZva2VkLiAgRWZmaWNpZW50CitpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIFJDVSBpbmZyYXN0cnVjdHVyZSBtYWtlIGhlYXZ5IHVzZSBvZiBiYXRjaGluZyBpbgorb3JkZXIgdG8gYW1vcnRpemUgdGhlaXIgb3ZlcmhlYWQgb3ZlciBtYW55IHVzZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgQVBJcy4KKworVGhlcmUgYXJlIG5vIGZld2VyIHRoYW4gdGhyZWUgUkNVIG1lY2hhbmlzbXMgaW4gdGhlIExpbnV4IGtlcm5lbDsgdGhlCitkaWFncmFtIGFib3ZlIHNob3dzIHRoZSBmaXJzdCBvbmUsIHdoaWNoIGlzIGJ5IGZhciB0aGUgbW9zdCBjb21tb25seSB1c2VkLgorVGhlIHJjdV9kZXJlZmVyZW5jZSgpIGFuZCByY3VfYXNzaWduX3BvaW50ZXIoKSBwcmltaXRpdmVzIGFyZSB1c2VkIGZvcgorYWxsIHRocmVlIG1lY2hhbmlzbXMsIGJ1dCBkaWZmZXJlbnQgZGVmZXIgYW5kIHByb3RlY3QgcHJpbWl0aXZlcyBhcmUKK3VzZWQgYXMgZm9sbG93czoKKworCURlZmVyCQkJUHJvdGVjdAorCithLglzeW5jaHJvbml6ZV9yY3UoKQlyY3VfcmVhZF9sb2NrKCkgLyByY3VfcmVhZF91bmxvY2soKQorCWNhbGxfcmN1KCkKKworYi4JY2FsbF9yY3VfYmgoKQkJcmN1X3JlYWRfbG9ja19iaCgpIC8gcmN1X3JlYWRfdW5sb2NrX2JoKCkKKworYy4Jc3luY2hyb25pemVfc2NoZWQoKQlwcmVlbXB0X2Rpc2FibGUoKSAvIHByZWVtcHRfZW5hYmxlKCkKKwkJCQlsb2NhbF9pcnFfc2F2ZSgpIC8gbG9jYWxfaXJxX3Jlc3RvcmUoKQorCQkJCWhhcmRpcnEgZW50ZXIgLyBoYXJkaXJxIGV4aXQKKwkJCQlOTUkgZW50ZXIgLyBOTUkgZXhpdAorCitUaGVzZSB0aHJlZSBtZWNoYW5pc21zIGFyZSB1c2VkIGFzIGZvbGxvd3M6CisKK2EuCVJDVSBhcHBsaWVkIHRvIG5vcm1hbCBkYXRhIHN0cnVjdHVyZXMuCisKK2IuCVJDVSBhcHBsaWVkIHRvIG5ldHdvcmtpbmcgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgbWF5IGJlIHN1YmplY3RlZAorCXRvIHJlbW90ZSBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2tzLgorCitjLglSQ1UgYXBwbGllZCB0byBzY2hlZHVsZXIgYW5kIGludGVycnVwdC9OTUktaGFuZGxlciB0YXNrcy4KKworQWdhaW4sIG1vc3QgdXNlcyB3aWxsIGJlIG9mIChhKS4gIFRoZSAoYikgYW5kIChjKSBjYXNlcyBhcmUgaW1wb3J0YW50Citmb3Igc3BlY2lhbGl6ZWQgdXNlcywgYnV0IGFyZSByZWxhdGl2ZWx5IHVuY29tbW9uLgorCisKKzMuICBXSEFUIEFSRSBTT01FIEVYQU1QTEUgVVNFUyBPRiBDT1JFIFJDVSBBUEk/CisKK1RoaXMgc2VjdGlvbiBzaG93cyBhIHNpbXBsZSB1c2Ugb2YgdGhlIGNvcmUgUkNVIEFQSSB0byBwcm90ZWN0IGEKK2dsb2JhbCBwb2ludGVyIHRvIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0cnVjdHVyZS4gIE1vcmUgdHlwaWNhbAordXNlcyBvZiBSQ1UgbWF5IGJlIGZvdW5kIGluIGxpc3RSQ1UudHh0LCBhcnJheVJDVS50eHQsIGFuZCBOTUktUkNVLnR4dC4KKworCXN0cnVjdCBmb28geworCQlpbnQgYTsKKwkJY2hhciBiOworCQlsb25nIGM7CisJfTsKKwlERUZJTkVfU1BJTkxPQ0soZm9vX211dGV4KTsKKworCXN0cnVjdCBmb28gKmdibF9mb287CisKKwkvKgorCSAqIENyZWF0ZSBhIG5ldyBzdHJ1Y3QgZm9vIHRoYXQgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBjdXJyZW50bHkKKwkgKiBwb2ludGVkIHRvIGJ5IGdibF9mb28sIGV4Y2VwdCB0aGF0IGZpZWxkICJhIiBpcyByZXBsYWNlZAorCSAqIHdpdGggIm5ld19hIi4gIFBvaW50cyBnYmxfZm9vIHRvIHRoZSBuZXcgc3RydWN0dXJlLCBhbmQKKwkgKiBmcmVlcyB1cCB0aGUgb2xkIHN0cnVjdHVyZSBhZnRlciBhIGdyYWNlIHBlcmlvZC4KKwkgKgorCSAqIFVzZXMgcmN1X2Fzc2lnbl9wb2ludGVyKCkgdG8gZW5zdXJlIHRoYXQgY29uY3VycmVudCByZWFkZXJzCisJICogc2VlIHRoZSBpbml0aWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBuZXcgc3RydWN0dXJlLgorCSAqCisJICogVXNlcyBzeW5jaHJvbml6ZV9yY3UoKSB0byBlbnN1cmUgdGhhdCBhbnkgcmVhZGVycyB0aGF0IG1pZ2h0CisJICogaGF2ZSByZWZlcmVuY2VzIHRvIHRoZSBvbGQgc3RydWN0dXJlIGNvbXBsZXRlIGJlZm9yZSBmcmVlaW5nCisJICogdGhlIG9sZCBzdHJ1Y3R1cmUuCisJICovCisJdm9pZCBmb29fdXBkYXRlX2EoaW50IG5ld19hKQorCXsKKwkJc3RydWN0IGZvbyAqbmV3X2ZwOworCQlzdHJ1Y3QgZm9vICpvbGRfZnA7CisKKwkJbmV3X2ZwID0ga21hbGxvYyhzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7CisJCXNwaW5fbG9jaygmZm9vX211dGV4KTsKKwkJb2xkX2ZwID0gZ2JsX2ZvbzsKKwkJKm5ld19mcCA9ICpvbGRfZnA7CisJCW5ld19mcC0+YSA9IG5ld19hOworCQlyY3VfYXNzaWduX3BvaW50ZXIoZ2JsX2ZvbywgbmV3X2ZwKTsKKwkJc3Bpbl91bmxvY2soJmZvb19tdXRleCk7CisJCXN5bmNocm9uaXplX3JjdSgpOworCQlrZnJlZShvbGRfZnApOworCX0KKworCS8qCisJICogUmV0dXJuIHRoZSB2YWx1ZSBvZiBmaWVsZCAiYSIgb2YgdGhlIGN1cnJlbnQgZ2JsX2ZvbworCSAqIHN0cnVjdHVyZS4gIFVzZSByY3VfcmVhZF9sb2NrKCkgYW5kIHJjdV9yZWFkX3VubG9jaygpCisJICogdG8gZW5zdXJlIHRoYXQgdGhlIHN0cnVjdHVyZSBkb2VzIG5vdCBnZXQgZGVsZXRlZCBvdXQKKwkgKiBmcm9tIHVuZGVyIHVzLCBhbmQgdXNlIHJjdV9kZXJlZmVyZW5jZSgpIHRvIGVuc3VyZSB0aGF0CisJICogd2Ugc2VlIHRoZSBpbml0aWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBzdHJ1Y3R1cmUgKGltcG9ydGFudAorCSAqIGZvciBERUMgQWxwaGEgYW5kIGZvciBwZW9wbGUgcmVhZGluZyB0aGUgY29kZSkuCisJICovCisJaW50IGZvb19nZXRfYSh2b2lkKQorCXsKKwkJaW50IHJldHZhbDsKKworCQlyY3VfcmVhZF9sb2NrKCk7CisJCXJldHZhbCA9IHJjdV9kZXJlZmVyZW5jZShnYmxfZm9vKS0+YTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCitTbywgdG8gc3VtIHVwOgorCitvCVVzZSByY3VfcmVhZF9sb2NrKCkgYW5kIHJjdV9yZWFkX3VubG9jaygpIHRvIGd1YXJkIFJDVQorCXJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucy4KKworbwlXaXRoaW4gYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLCB1c2UgcmN1X2RlcmVmZXJlbmNlKCkKKwl0byBkZXJlZmVyZW5jZSBSQ1UtcHJvdGVjdGVkIHBvaW50ZXJzLgorCitvCVVzZSBzb21lIHNvbGlkIHNjaGVtZSAoc3VjaCBhcyBsb2NrcyBvciBzZW1hcGhvcmVzKSB0bworCWtlZXAgY29uY3VycmVudCB1cGRhdGVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLgorCitvCVVzZSByY3VfYXNzaWduX3BvaW50ZXIoKSB0byB1cGRhdGUgYW4gUkNVLXByb3RlY3RlZCBwb2ludGVyLgorCVRoaXMgcHJpbWl0aXZlIHByb3RlY3RzIGNvbmN1cnJlbnQgcmVhZGVycyBmcm9tIHRoZSB1cGRhdGVyLAorCS1ub3QtIGNvbmN1cnJlbnQgdXBkYXRlcyBmcm9tIGVhY2ggb3RoZXIhICBZb3UgdGhlcmVmb3JlIHN0aWxsCisJbmVlZCB0byB1c2UgbG9ja2luZyAob3Igc29tZXRoaW5nIHNpbWlsYXIpIHRvIGtlZXAgY29uY3VycmVudAorCXJjdV9hc3NpZ25fcG9pbnRlcigpIHByaW1pdGl2ZXMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIuCisKK28JVXNlIHN5bmNocm9uaXplX3JjdSgpIC1hZnRlci0gcmVtb3ZpbmcgYSBkYXRhIGVsZW1lbnQgZnJvbSBhbgorCVJDVS1wcm90ZWN0ZWQgZGF0YSBzdHJ1Y3R1cmUsIGJ1dCAtYmVmb3JlLSByZWNsYWltaW5nL2ZyZWVpbmcKKwl0aGUgZGF0YSBlbGVtZW50LCBpbiBvcmRlciB0byB3YWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiBhbGwKKwlSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIHRoYXQgbWlnaHQgYmUgcmVmZXJlbmNpbmcgdGhhdAorCWRhdGEgaXRlbS4KKworU2VlIGNoZWNrbGlzdC50eHQgZm9yIGFkZGl0aW9uYWwgcnVsZXMgdG8gZm9sbG93IHdoZW4gdXNpbmcgUkNVLgorCisKKzQuICBXSEFUIElGIE1ZIFVQREFUSU5HIFRIUkVBRCBDQU5OT1QgQkxPQ0s/CisKK0luIHRoZSBleGFtcGxlIGFib3ZlLCBmb29fdXBkYXRlX2EoKSBibG9ja3MgdW50aWwgYSBncmFjZSBwZXJpb2QgZWxhcHNlcy4KK1RoaXMgaXMgcXVpdGUgc2ltcGxlLCBidXQgaW4gc29tZSBjYXNlcyBvbmUgY2Fubm90IGFmZm9yZCB0byB3YWl0IHNvCitsb25nIC0tIHRoZXJlIG1pZ2h0IGJlIG90aGVyIGhpZ2gtcHJpb3JpdHkgd29yayB0byBiZSBkb25lLgorCitJbiBzdWNoIGNhc2VzLCBvbmUgdXNlcyBjYWxsX3JjdSgpIHJhdGhlciB0aGFuIHN5bmNocm9uaXplX3JjdSgpLgorVGhlIGNhbGxfcmN1KCkgQVBJIGlzIGFzIGZvbGxvd3M6CisKKwl2b2lkIGNhbGxfcmN1KHN0cnVjdCByY3VfaGVhZCAqIGhlYWQsCisJCSAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpKTsKKworVGhpcyBmdW5jdGlvbiBpbnZva2VzIGZ1bmMoaGVhZCkgYWZ0ZXIgYSBncmFjZSBwZXJpb2QgaGFzIGVsYXBzZWQuCitUaGlzIGludm9jYXRpb24gbWlnaHQgaGFwcGVuIGZyb20gZWl0aGVyIHNvZnRpcnEgb3IgcHJvY2VzcyBjb250ZXh0LAorc28gdGhlIGZ1bmN0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYmxvY2suICBUaGUgZm9vIHN0cnVjdCBuZWVkcyB0bworaGF2ZSBhbiByY3VfaGVhZCBzdHJ1Y3R1cmUgYWRkZWQsIHBlcmhhcHMgYXMgZm9sbG93czoKKworCXN0cnVjdCBmb28geworCQlpbnQgYTsKKwkJY2hhciBiOworCQlsb25nIGM7CisJCXN0cnVjdCByY3VfaGVhZCByY3U7CisJfTsKKworVGhlIGZvb191cGRhdGVfYSgpIGZ1bmN0aW9uIG1pZ2h0IHRoZW4gYmUgd3JpdHRlbiBhcyBmb2xsb3dzOgorCisJLyoKKwkgKiBDcmVhdGUgYSBuZXcgc3RydWN0IGZvbyB0aGF0IGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgY3VycmVudGx5CisJICogcG9pbnRlZCB0byBieSBnYmxfZm9vLCBleGNlcHQgdGhhdCBmaWVsZCAiYSIgaXMgcmVwbGFjZWQKKwkgKiB3aXRoICJuZXdfYSIuICBQb2ludHMgZ2JsX2ZvbyB0byB0aGUgbmV3IHN0cnVjdHVyZSwgYW5kCisJICogZnJlZXMgdXAgdGhlIG9sZCBzdHJ1Y3R1cmUgYWZ0ZXIgYSBncmFjZSBwZXJpb2QuCisJICoKKwkgKiBVc2VzIHJjdV9hc3NpZ25fcG9pbnRlcigpIHRvIGVuc3VyZSB0aGF0IGNvbmN1cnJlbnQgcmVhZGVycworCSAqIHNlZSB0aGUgaW5pdGlhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgbmV3IHN0cnVjdHVyZS4KKwkgKgorCSAqIFVzZXMgY2FsbF9yY3UoKSB0byBlbnN1cmUgdGhhdCBhbnkgcmVhZGVycyB0aGF0IG1pZ2h0IGhhdmUKKwkgKiByZWZlcmVuY2VzIHRvIHRoZSBvbGQgc3RydWN0dXJlIGNvbXBsZXRlIGJlZm9yZSBmcmVlaW5nIHRoZQorCSAqIG9sZCBzdHJ1Y3R1cmUuCisJICovCisJdm9pZCBmb29fdXBkYXRlX2EoaW50IG5ld19hKQorCXsKKwkJc3RydWN0IGZvbyAqbmV3X2ZwOworCQlzdHJ1Y3QgZm9vICpvbGRfZnA7CisKKwkJbmV3X2ZwID0ga21hbGxvYyhzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7CisJCXNwaW5fbG9jaygmZm9vX211dGV4KTsKKwkJb2xkX2ZwID0gZ2JsX2ZvbzsKKwkJKm5ld19mcCA9ICpvbGRfZnA7CisJCW5ld19mcC0+YSA9IG5ld19hOworCQlyY3VfYXNzaWduX3BvaW50ZXIoZ2JsX2ZvbywgbmV3X2ZwKTsKKwkJc3Bpbl91bmxvY2soJmZvb19tdXRleCk7CisJCWNhbGxfcmN1KCZvbGRfZnAtPnJjdSwgZm9vX3JlY2xhaW0pOworCX0KKworVGhlIGZvb19yZWNsYWltKCkgZnVuY3Rpb24gbWlnaHQgYXBwZWFyIGFzIGZvbGxvd3M6CisKKwl2b2lkIGZvb19yZWNsYWltKHN0cnVjdCByY3VfaGVhZCAqcnApCisJeworCQlzdHJ1Y3QgZm9vICpmcCA9IGNvbnRhaW5lcl9vZihycCwgc3RydWN0IGZvbywgcmN1KTsKKworCQlrZnJlZShmcCk7CisJfQorCitUaGUgY29udGFpbmVyX29mKCkgcHJpbWl0aXZlIGlzIGEgbWFjcm8gdGhhdCwgZ2l2ZW4gYSBwb2ludGVyIGludG8gYQorc3RydWN0LCB0aGUgdHlwZSBvZiB0aGUgc3RydWN0LCBhbmQgdGhlIHBvaW50ZWQtdG8gZmllbGQgd2l0aGluIHRoZQorc3RydWN0LCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3QuCisKK1RoZSB1c2Ugb2YgY2FsbF9yY3UoKSBwZXJtaXRzIHRoZSBjYWxsZXIgb2YgZm9vX3VwZGF0ZV9hKCkgdG8KK2ltbWVkaWF0ZWx5IHJlZ2FpbiBjb250cm9sLCB3aXRob3V0IG5lZWRpbmcgdG8gd29ycnkgZnVydGhlciBhYm91dCB0aGUKK29sZCB2ZXJzaW9uIG9mIHRoZSBuZXdseSB1cGRhdGVkIGVsZW1lbnQuICBJdCBhbHNvIGNsZWFybHkgc2hvd3MgdGhlCitSQ1UgZGlzdGluY3Rpb24gYmV0d2VlbiB1cGRhdGVyLCBuYW1lbHkgZm9vX3VwZGF0ZV9hKCksIGFuZCByZWNsYWltZXIsCituYW1lbHkgZm9vX3JlY2xhaW0oKS4KKworVGhlIHN1bW1hcnkgb2YgYWR2aWNlIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUgcHJldmlvdXMgc2VjdGlvbiwgZXhjZXB0Cit0aGF0IHdlIGFyZSBub3cgdXNpbmcgY2FsbF9yY3UoKSByYXRoZXIgdGhhbiBzeW5jaHJvbml6ZV9yY3UoKToKKworbwlVc2UgY2FsbF9yY3UoKSAtYWZ0ZXItIHJlbW92aW5nIGEgZGF0YSBlbGVtZW50IGZyb20gYW4KKwlSQ1UtcHJvdGVjdGVkIGRhdGEgc3RydWN0dXJlIGluIG9yZGVyIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sKKwlmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBhZnRlciB0aGUgY29tcGxldGlvbiBvZiBhbGwgUkNVCisJcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIHRoYXQgbWlnaHQgYmUgcmVmZXJlbmNpbmcgdGhhdAorCWRhdGEgaXRlbS4KKworQWdhaW4sIHNlZSBjaGVja2xpc3QudHh0IGZvciBhZGRpdGlvbmFsIHJ1bGVzIGdvdmVybmluZyB0aGUgdXNlIG9mIFJDVS4KKworCis1LiAgV0hBVCBBUkUgU09NRSBTSU1QTEUgSU1QTEVNRU5UQVRJT05TIE9GIFJDVT8KKworT25lIG9mIHRoZSBuaWNlIHRoaW5ncyBhYm91dCBSQ1UgaXMgdGhhdCBpdCBoYXMgZXh0cmVtZWx5IHNpbXBsZSAidG95IgoraW1wbGVtZW50YXRpb25zIHRoYXQgYXJlIGEgZ29vZCBmaXJzdCBzdGVwIHRvd2FyZHMgdW5kZXJzdGFuZGluZyB0aGUKK3Byb2R1Y3Rpb24tcXVhbGl0eSBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIExpbnV4IGtlcm5lbC4gIFRoaXMgc2VjdGlvbgorcHJlc2VudHMgdHdvIHN1Y2ggInRveSIgaW1wbGVtZW50YXRpb25zIG9mIFJDVSwgb25lIHRoYXQgaXMgaW1wbGVtZW50ZWQKK2luIHRlcm1zIG9mIGZhbWlsaWFyIGxvY2tpbmcgcHJpbWl0aXZlcywgYW5kIGFub3RoZXIgdGhhdCBtb3JlIGNsb3NlbHkKK3Jlc2VtYmxlcyAiY2xhc3NpYyIgUkNVLiAgQm90aCBhcmUgd2F5IHRvbyBzaW1wbGUgZm9yIHJlYWwtd29ybGQgdXNlLAorbGFja2luZyBib3RoIGZ1bmN0aW9uYWxpdHkgYW5kIHBlcmZvcm1hbmNlLiAgSG93ZXZlciwgdGhleSBhcmUgdXNlZnVsCitpbiBnZXR0aW5nIGEgZmVlbCBmb3IgaG93IFJDVSB3b3Jrcy4gIFNlZSBrZXJuZWwvcmN1cGRhdGUuYyBmb3IgYQorcHJvZHVjdGlvbi1xdWFsaXR5IGltcGxlbWVudGF0aW9uLCBhbmQgc2VlOgorCisJaHR0cDovL3d3dy5yZHJvcC5jb20vdXNlcnMvcGF1bG1jay9SQ1UKKworZm9yIHBhcGVycyBkZXNjcmliaW5nIHRoZSBMaW51eCBrZXJuZWwgUkNVIGltcGxlbWVudGF0aW9uLiAgVGhlIE9MUycwMQorYW5kIE9MUycwMiBwYXBlcnMgYXJlIGEgZ29vZCBpbnRyb2R1Y3Rpb24sIGFuZCB0aGUgZGlzc2VydGF0aW9uIHByb3ZpZGVzCittb3JlIGRldGFpbHMgb24gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCisKKworNUEuICAiVE9ZIiBJTVBMRU1FTlRBVElPTiAjMTogTE9DS0lORworCitUaGlzIHNlY3Rpb24gcHJlc2VudHMgYSAidG95IiBSQ1UgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBiYXNlZCBvbgorZmFtaWxpYXIgbG9ja2luZyBwcmltaXRpdmVzLiAgSXRzIG92ZXJoZWFkIG1ha2VzIGl0IGEgbm9uLXN0YXJ0ZXIgZm9yCityZWFsLWxpZmUgdXNlLCBhcyBkb2VzIGl0cyBsYWNrIG9mIHNjYWxhYmlsaXR5LiAgSXQgaXMgYWxzbyB1bnN1aXRhYmxlCitmb3IgcmVhbHRpbWUgdXNlLCBzaW5jZSBpdCBhbGxvd3Mgc2NoZWR1bGluZyBsYXRlbmN5IHRvICJibGVlZCIgZnJvbQorb25lIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIHRvIGFub3RoZXIuCisKK0hvd2V2ZXIsIGl0IGlzIHByb2JhYmx5IHRoZSBlYXNpZXN0IGltcGxlbWVudGF0aW9uIHRvIHJlbGF0ZSB0bywgc28gaXMKK2EgZ29vZCBzdGFydGluZyBwb2ludC4KKworSXQgaXMgZXh0cmVtZWx5IHNpbXBsZToKKworCXN0YXRpYyBERUZJTkVfUldMT0NLKHJjdV9ncF9tdXRleCk7CisKKwl2b2lkIHJjdV9yZWFkX2xvY2sodm9pZCkKKwl7CisJCXJlYWRfbG9jaygmcmN1X2dwX211dGV4KTsKKwl9CisKKwl2b2lkIHJjdV9yZWFkX3VubG9jayh2b2lkKQorCXsKKwkJcmVhZF91bmxvY2soJnJjdV9ncF9tdXRleCk7CisJfQorCisJdm9pZCBzeW5jaHJvbml6ZV9yY3Uodm9pZCkKKwl7CisJCXdyaXRlX2xvY2soJnJjdV9ncF9tdXRleCk7CisJCXdyaXRlX3VubG9jaygmcmN1X2dwX211dGV4KTsKKwl9CisKK1tZb3UgY2FuIGlnbm9yZSByY3VfYXNzaWduX3BvaW50ZXIoKSBhbmQgcmN1X2RlcmVmZXJlbmNlKCkgd2l0aG91dAorbWlzc2luZyBtdWNoLiAgQnV0IGhlcmUgdGhleSBhcmUgYW55d2F5LiAgQW5kIHdoYXRldmVyIHlvdSBkbywgZG9uJ3QKK2ZvcmdldCBhYm91dCB0aGVtIHdoZW4gc3VibWl0dGluZyBwYXRjaGVzIG1ha2luZyB1c2Ugb2YgUkNVIV0KKworCSNkZWZpbmUgcmN1X2Fzc2lnbl9wb2ludGVyKHAsIHYpCSh7IFwKKwkJCQkJCQlzbXBfd21iKCk7IFwKKwkJCQkJCQkocCkgPSAodik7IFwKKwkJCQkJCX0pCisKKwkjZGVmaW5lIHJjdV9kZXJlZmVyZW5jZShwKSAgICAgKHsgXAorCQkJCQl0eXBlb2YocCkgX19fX19fX19fcDEgPSBwOyBcCisJCQkJCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOyBcCisJCQkJCShfX19fX19fX19wMSk7IFwKKwkJCQkJfSkKKworCitUaGUgcmN1X3JlYWRfbG9jaygpIGFuZCByY3VfcmVhZF91bmxvY2soKSBwcmltaXRpdmUgcmVhZC1hY3F1aXJlCithbmQgcmVsZWFzZSBhIGdsb2JhbCByZWFkZXItd3JpdGVyIGxvY2suICBUaGUgc3luY2hyb25pemVfcmN1KCkKK3ByaW1pdGl2ZSB3cml0ZS1hY3F1aXJlcyB0aGlzIHNhbWUgbG9jaywgdGhlbiBpbW1lZGlhdGVseSByZWxlYXNlcworaXQuICBUaGlzIG1lYW5zIHRoYXQgb25jZSBzeW5jaHJvbml6ZV9yY3UoKSBleGl0cywgYWxsIFJDVSByZWFkLXNpZGUKK2NyaXRpY2FsIHNlY3Rpb25zIHRoYXQgd2VyZSBpbiBwcm9ncmVzcyBiZWZvcmUgc3luY2hvbml6ZV9yY3UoKSB3YXMKK2NhbGxlZCBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIGNvbXBsZXRlZCAtLSB0aGVyZSBpcyBubyB3YXkgdGhhdAorc3luY2hyb25pemVfcmN1KCkgd291bGQgaGF2ZSBiZWVuIGFibGUgdG8gd3JpdGUtYWNxdWlyZSB0aGUgbG9jaworb3RoZXJ3aXNlLgorCitJdCBpcyBwb3NzaWJsZSB0byBuZXN0IHJjdV9yZWFkX2xvY2soKSwgc2luY2UgcmVhZGVyLXdyaXRlciBsb2NrcyBtYXkKK2JlIHJlY3Vyc2l2ZWx5IGFjcXVpcmVkLiAgTm90ZSBhbHNvIHRoYXQgcmN1X3JlYWRfbG9jaygpIGlzIGltbXVuZQorZnJvbSBkZWFkbG9jayAoYW4gaW1wb3J0YW50IHByb3BlcnR5IG9mIFJDVSkuICBUaGUgcmVhc29uIGZvciB0aGlzIGlzCit0aGF0IHRoZSBvbmx5IHRoaW5nIHRoYXQgY2FuIGJsb2NrIHJjdV9yZWFkX2xvY2soKSBpcyBhIHN5bmNocm9uaXplX3JjdSgpLgorQnV0IHN5bmNocm9uaXplX3JjdSgpIGRvZXMgbm90IGFjcXVpcmUgYW55IGxvY2tzIHdoaWxlIGhvbGRpbmcgcmN1X2dwX211dGV4LAorc28gdGhlcmUgY2FuIGJlIG5vIGRlYWRsb2NrIGN5Y2xlLgorCitRdWljayBRdWl6ICMxOglXaHkgaXMgdGhpcyBhcmd1bWVudCBuYWl2ZT8gIEhvdyBjb3VsZCBhIGRlYWRsb2NrCisJCW9jY3VyIHdoZW4gdXNpbmcgdGhpcyBhbGdvcml0aG0gaW4gYSByZWFsLXdvcmxkIExpbnV4CisJCWtlcm5lbD8gIEhvdyBjb3VsZCB0aGlzIGRlYWRsb2NrIGJlIGF2b2lkZWQ/CisKKworNUIuICAiVE9ZIiBFWEFNUExFICMyOiBDTEFTU0lDIFJDVQorCitUaGlzIHNlY3Rpb24gcHJlc2VudHMgYSAidG95IiBSQ1UgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBiYXNlZCBvbgorImNsYXNzaWMgUkNVIi4gIEl0IGlzIGFsc28gc2hvcnQgb24gcGVyZm9ybWFuY2UgKGJ1dCBvbmx5IGZvciB1cGRhdGVzKSBhbmQKK29uIGZlYXR1cmVzIHN1Y2ggYXMgaG90cGx1ZyBDUFUgYW5kIHRoZSBhYmlsaXR5IHRvIHJ1biBpbiBDT05GSUdfUFJFRU1QVAora2VybmVscy4gIFRoZSBkZWZpbml0aW9ucyBvZiByY3VfZGVyZWZlcmVuY2UoKSBhbmQgcmN1X2Fzc2lnbl9wb2ludGVyKCkKK2FyZSB0aGUgc2FtZSBhcyB0aG9zZSBzaG93biBpbiB0aGUgcHJlY2VkaW5nIHNlY3Rpb24sIHNvIHRoZXkgYXJlIG9taXR0ZWQuCisKKwl2b2lkIHJjdV9yZWFkX2xvY2sodm9pZCkgeyB9CisKKwl2b2lkIHJjdV9yZWFkX3VubG9jayh2b2lkKSB7IH0KKworCXZvaWQgc3luY2hyb25pemVfcmN1KHZvaWQpCisJeworCQlpbnQgY3B1OworCisJCWZvcl9lYWNoX2NwdShjcHUpCisJCQlydW5fb24oY3B1KTsKKwl9CisKK05vdGUgdGhhdCByY3VfcmVhZF9sb2NrKCkgYW5kIHJjdV9yZWFkX3VubG9jaygpIGRvIGFic29sdXRlbHkgbm90aGluZy4KK1RoaXMgaXMgdGhlIGdyZWF0IHN0cmVuZ3RoIG9mIGNsYXNzaWMgUkNVIGluIGEgbm9uLXByZWVtcHRpdmUga2VybmVsOgorcmVhZC1zaWRlIG92ZXJoZWFkIGlzIHByZWNpc2VseSB6ZXJvLCBhdCBsZWFzdCBvbiBub24tQWxwaGEgQ1BVcy4KK0FuZCB0aGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHdheSB0aGF0IHJjdV9yZWFkX2xvY2soKSBjYW4gcG9zc2libHkKK3BhcnRpY2lwYXRlIGluIGEgZGVhZGxvY2sgY3ljbGUhCisKK1RoZSBpbXBsZW1lbnRhdGlvbiBvZiBzeW5jaHJvbml6ZV9yY3UoKSBzaW1wbHkgc2NoZWR1bGVzIGl0c2VsZiBvbiBlYWNoCitDUFUgaW4gdHVybi4gIFRoZSBydW5fb24oKSBwcmltaXRpdmUgY2FuIGJlIGltcGxlbWVudGVkIHN0cmFpZ2h0Zm9yd2FyZGx5CitpbiB0ZXJtcyBvZiB0aGUgc2NoZWRfc2V0YWZmaW5pdHkoKSBwcmltaXRpdmUuICBPZiBjb3Vyc2UsIGEgc29tZXdoYXQgbGVzcworInRveSIgaW1wbGVtZW50YXRpb24gd291bGQgcmVzdG9yZSB0aGUgYWZmaW5pdHkgdXBvbiBjb21wbGV0aW9uIHJhdGhlcgordGhhbiBqdXN0IGxlYXZpbmcgYWxsIHRhc2tzIHJ1bm5pbmcgb24gdGhlIGxhc3QgQ1BVLCBidXQgd2hlbiBJIHNhaWQKKyJ0b3kiLCBJIG1lYW50IC10b3ktIQorCitTbyBob3cgdGhlIGhlY2sgaXMgdGhpcyBzdXBwb3NlZCB0byB3b3JrPz8/CisKK1JlbWVtYmVyIHRoYXQgaXQgaXMgaWxsZWdhbCB0byBibG9jayB3aGlsZSBpbiBhbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsCitzZWN0aW9uLiAgVGhlcmVmb3JlLCBpZiBhIGdpdmVuIENQVSBleGVjdXRlcyBhIGNvbnRleHQgc3dpdGNoLCB3ZSBrbm93Cit0aGF0IGl0IG11c3QgaGF2ZSBjb21wbGV0ZWQgYWxsIHByZWNlZGluZyBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zLgorT25jZSAtYWxsLSBDUFVzIGhhdmUgZXhlY3V0ZWQgYSBjb250ZXh0IHN3aXRjaCwgdGhlbiAtYWxsLSBwcmVjZWRpbmcKK1JDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgd2lsbCBoYXZlIGNvbXBsZXRlZC4KKworU28sIHN1cHBvc2UgdGhhdCB3ZSByZW1vdmUgYSBkYXRhIGl0ZW0gZnJvbSBpdHMgc3RydWN0dXJlIGFuZCB0aGVuIGludm9rZQorc3luY2hyb25pemVfcmN1KCkuICBPbmNlIHN5bmNocm9uaXplX3JjdSgpIHJldHVybnMsIHdlIGFyZSBndWFyYW50ZWVkCit0aGF0IHRoZXJlIGFyZSBubyBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIGhvbGRpbmcgYSByZWZlcmVuY2UKK3RvIHRoYXQgZGF0YSBpdGVtLCBzbyB3ZSBjYW4gc2FmZWx5IHJlY2xhaW0gaXQuCisKK1F1aWNrIFF1aXogIzI6CUdpdmUgYW4gZXhhbXBsZSB3aGVyZSBDbGFzc2ljIFJDVSdzIHJlYWQtc2lkZQorCQlvdmVyaGVhZCBpcyAtbmVnYXRpdmUtLgorCitRdWljayBRdWl6ICMzOiAgSWYgaXQgaXMgaWxsZWdhbCB0byBibG9jayBpbiBhbiBSQ1UgcmVhZC1zaWRlCisJCWNyaXRpY2FsIHNlY3Rpb24sIHdoYXQgdGhlIGhlY2sgZG8geW91IGRvIGluCisJCVBSRUVNUFRfUlQsIHdoZXJlIG5vcm1hbCBzcGlubG9ja3MgY2FuIGJsb2NrPz8/CisKKworNi4gIEFOQUxPR1kgV0lUSCBSRUFERVItV1JJVEVSIExPQ0tJTkcKKworQWx0aG91Z2ggUkNVIGNhbiBiZSB1c2VkIGluIG1hbnkgZGlmZmVyZW50IHdheXMsIGEgdmVyeSBjb21tb24gdXNlIG9mCitSQ1UgaXMgYW5hbG9nb3VzIHRvIHJlYWRlci13cml0ZXIgbG9ja2luZy4gIFRoZSBmb2xsb3dpbmcgdW5pZmllZAorZGlmZiBzaG93cyBob3cgY2xvc2VseSByZWxhdGVkIFJDVSBhbmQgcmVhZGVyLXdyaXRlciBsb2NraW5nIGNhbiBiZS4KKworCUBAIC0xMywxNSArMTQsMTUgQEAKKwkJc3RydWN0IGxpc3RfaGVhZCAqbHA7CisJCXN0cnVjdCBlbCAqcDsKKworCS0JcmVhZF9sb2NrKCk7CisJLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGhlYWQsIGxwKSB7CisJKwlyY3VfcmVhZF9sb2NrKCk7CisJKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwLCBoZWFkLCBscCkgeworCQkJaWYgKHAtPmtleSA9PSBrZXkpIHsKKwkJCQkqcmVzdWx0ID0gcC0+ZGF0YTsKKwktCQkJcmVhZF91bmxvY2soKTsKKwkrCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwktCXJlYWRfdW5sb2NrKCk7CisJKwlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIDA7CisJIH0KKworCUBAIC0yOSwxNSArMzAsMTYgQEAKKwkgeworCQlzdHJ1Y3QgZWwgKnA7CisKKwktCXdyaXRlX2xvY2soJmxpc3RtdXRleCk7CisJKwlzcGluX2xvY2soJmxpc3RtdXRleCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgaGVhZCwgbHApIHsKKwkJCWlmIChwLT5rZXkgPT0ga2V5KSB7CisJCQkJbGlzdF9kZWwoJnAtPmxpc3QpOworCS0JCQl3cml0ZV91bmxvY2soJmxpc3RtdXRleCk7CisJKwkJCXNwaW5fdW5sb2NrKCZsaXN0bXV0ZXgpOworCSsJCQlzeW5jaHJvbml6ZV9yY3UoKTsKKwkJCQlrZnJlZShwKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCS0Jd3JpdGVfdW5sb2NrKCZsaXN0bXV0ZXgpOworCSsJc3Bpbl91bmxvY2soJmxpc3RtdXRleCk7CisJCXJldHVybiAwOworCSB9CisKK09yLCBmb3IgdGhvc2Ugd2hvIHByZWZlciBhIHNpZGUtYnktc2lkZSBsaXN0aW5nOgorCisgMSBzdHJ1Y3QgZWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgMSBzdHJ1Y3QgZWwgeworIDIgICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7ICAgICAgICAgICAgIDIgICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisgMyAgIGxvbmcga2V5OyAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgIGxvbmcga2V5OworIDQgICBzcGlubG9ja190IG11dGV4OyAgICAgICAgICAgICAgICAgIDQgICBzcGlubG9ja190IG11dGV4OworIDUgICBpbnQgZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgIDUgICBpbnQgZGF0YTsKKyA2ICAgLyogT3RoZXIgZGF0YSBmaWVsZHMgKi8gICAgICAgICAgICA2ICAgLyogT3RoZXIgZGF0YSBmaWVsZHMgKi8KKyA3IH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3IH07CisgOCBzcGlubG9ja190IGxpc3RtdXRleDsgICAgICAgICAgICAgICAgOCBzcGlubG9ja190IGxpc3RtdXRleDsKKyA5IHN0cnVjdCBlbCBoZWFkOyAgICAgICAgICAgICAgICAgICAgICA5IHN0cnVjdCBlbCBoZWFkOworCisgMSBpbnQgc2VhcmNoKGxvbmcga2V5LCBpbnQgKnJlc3VsdCkgICAgMSBpbnQgc2VhcmNoKGxvbmcga2V5LCBpbnQgKnJlc3VsdCkKKyAyIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIHsKKyAzICAgc3RydWN0IGxpc3RfaGVhZCAqbHA7ICAgICAgICAgICAgICAzICAgc3RydWN0IGxpc3RfaGVhZCAqbHA7CisgNCAgIHN0cnVjdCBlbCAqcDsgICAgICAgICAgICAgICAgICAgICAgNCAgIHN0cnVjdCBlbCAqcDsKKyA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisgNiAgIHJlYWRfbG9jaygpOyAgICAgICAgICAgICAgICAgICAgICAgNiAgIHJjdV9yZWFkX2xvY2soKTsKKyA3ICAgbGlzdF9mb3JfZWFjaF9lbnRyeShwLCBoZWFkLCBscCkgeyA3ICAgbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocCwgaGVhZCwgbHApIHsKKyA4ICAgICBpZiAocC0+a2V5ID09IGtleSkgeyAgICAgICAgICAgICA4ICAgICBpZiAocC0+a2V5ID09IGtleSkgeworIDkgICAgICAgKnJlc3VsdCA9IHAtPmRhdGE7ICAgICAgICAgICAgIDkgICAgICAgKnJlc3VsdCA9IHAtPmRhdGE7CisxMCAgICAgICByZWFkX3VubG9jaygpOyAgICAgICAgICAgICAgICAxMCAgICAgICByY3VfcmVhZF91bmxvY2soKTsKKzExICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgICAgICAgIDExICAgICAgIHJldHVybiAxOworMTIgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgICAgIH0KKzEzICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzICAgfQorMTQgICByZWFkX3VubG9jaygpOyAgICAgICAgICAgICAgICAgICAgMTQgICByY3VfcmVhZF91bmxvY2soKTsKKzE1ICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAgcmV0dXJuIDA7CisxNiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiB9CisKKyAxIGludCBkZWxldGUobG9uZyBrZXkpICAgICAgICAgICAgICAgICAxIGludCBkZWxldGUobG9uZyBrZXkpCisgMiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiB7CisgMyAgIHN0cnVjdCBlbCAqcDsgICAgICAgICAgICAgICAgICAgICAgMyAgIHN0cnVjdCBlbCAqcDsKKyA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisgNSAgIHdyaXRlX2xvY2soJmxpc3RtdXRleCk7ICAgICAgICAgICAgNSAgIHNwaW5fbG9jaygmbGlzdG11dGV4KTsKKyA2ICAgbGlzdF9mb3JfZWFjaF9lbnRyeShwLCBoZWFkLCBscCkgeyA2ICAgbGlzdF9mb3JfZWFjaF9lbnRyeShwLCBoZWFkLCBscCkgeworIDcgICAgIGlmIChwLT5rZXkgPT0ga2V5KSB7ICAgICAgICAgICAgIDcgICAgIGlmIChwLT5rZXkgPT0ga2V5KSB7CisgOCAgICAgICBsaXN0X2RlbCgmcC0+bGlzdCk7ICAgICAgICAgICAgOCAgICAgICBsaXN0X2RlbCgmcC0+bGlzdCk7CisgOSAgICAgICB3cml0ZV91bmxvY2soJmxpc3RtdXRleCk7ICAgICAgOSAgICAgICBzcGluX3VubG9jaygmbGlzdG11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgIHN5bmNocm9uaXplX3JjdSgpOworMTAgICAgICAga2ZyZWUocCk7ICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAga2ZyZWUocCk7CisxMSAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAxMiAgICAgICByZXR1cm4gMTsKKzEyICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzICAgICB9CisxMyAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgIH0KKzE0ICAgd3JpdGVfdW5sb2NrKCZsaXN0bXV0ZXgpOyAgICAgICAgIDE1ICAgc3Bpbl91bmxvY2soJmxpc3RtdXRleCk7CisxNSAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAxNiAgIHJldHVybiAwOworMTYgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcgfQorCitFaXRoZXIgd2F5LCB0aGUgZGlmZmVyZW5jZXMgYXJlIHF1aXRlIHNtYWxsLiAgUmVhZC1zaWRlIGxvY2tpbmcgbW92ZXMKK3RvIHJjdV9yZWFkX2xvY2soKSBhbmQgcmN1X3JlYWRfdW5sb2NrLCB1cGRhdGUtc2lkZSBsb2NraW5nIG1vdmVzIGZyb20KK2Zyb20gYSByZWFkZXItd3JpdGVyIGxvY2sgdG8gYSBzaW1wbGUgc3BpbmxvY2ssIGFuZCBhIHN5bmNocm9uaXplX3JjdSgpCitwcmVjZWRlcyB0aGUga2ZyZWUoKS4KKworSG93ZXZlciwgdGhlcmUgaXMgb25lIHBvdGVudGlhbCBjYXRjaDogdGhlIHJlYWQtc2lkZSBhbmQgdXBkYXRlLXNpZGUKK2NyaXRpY2FsIHNlY3Rpb25zIGNhbiBub3cgcnVuIGNvbmN1cnJlbnRseS4gIEluIG1hbnkgY2FzZXMsIHRoaXMgd2lsbAorbm90IGJlIGEgcHJvYmxlbSwgYnV0IGl0IGlzIG5lY2Vzc2FyeSB0byBjaGVjayBjYXJlZnVsbHkgcmVnYXJkbGVzcy4KK0ZvciBleGFtcGxlLCBpZiBtdWx0aXBsZSBpbmRlcGVuZGVudCBsaXN0IHVwZGF0ZXMgbXVzdCBiZSBzZWVuIGFzCithIHNpbmdsZSBhdG9taWMgdXBkYXRlLCBjb252ZXJ0aW5nIHRvIFJDVSB3aWxsIHJlcXVpcmUgc3BlY2lhbCBjYXJlLgorCitBbHNvLCB0aGUgcHJlc2VuY2Ugb2Ygc3luY2hyb25pemVfcmN1KCkgbWVhbnMgdGhhdCB0aGUgUkNVIHZlcnNpb24gb2YKK2RlbGV0ZSgpIGNhbiBub3cgYmxvY2suICBJZiB0aGlzIGlzIGEgcHJvYmxlbSwgdGhlcmUgaXMgYSBjYWxsYmFjay1iYXNlZAorbWVjaGFuaXNtIHRoYXQgbmV2ZXIgYmxvY2tzLCBuYW1lbHkgY2FsbF9yY3UoKSwgdGhhdCBjYW4gYmUgdXNlZCBpbgorcGxhY2Ugb2Ygc3luY2hyb25pemVfcmN1KCkuCisKKworNy4gIEZVTEwgTElTVCBPRiBSQ1UgQVBJcworCitUaGUgUkNVIEFQSXMgYXJlIGRvY3VtZW50ZWQgaW4gZG9jYm9vay1mb3JtYXQgaGVhZGVyIGNvbW1lbnRzIGluIHRoZQorTGludXgta2VybmVsIHNvdXJjZSBjb2RlLCBidXQgaXQgaGVscHMgdG8gaGF2ZSBhIGZ1bGwgbGlzdCBvZiB0aGUKK0FQSXMsIHNpbmNlIHRoZXJlIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHdheSB0byBjYXRlZ29yaXplIHRoZW0KK2luIGRvY2Jvb2suICBIZXJlIGlzIHRoZSBsaXN0LCBieSBjYXRlZ29yeS4KKworTWFya2VycyBmb3IgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uczoKKworCXJjdV9yZWFkX2xvY2sKKwlyY3VfcmVhZF91bmxvY2sKKwlyY3VfcmVhZF9sb2NrX2JoCisJcmN1X3JlYWRfdW5sb2NrX2JoCisKK1JDVSBwb2ludGVyL2xpc3QgdHJhdmVyc2FsOgorCisJcmN1X2RlcmVmZXJlbmNlCisJbGlzdF9mb3JfZWFjaF9yY3UJCSh0byBiZSBkZXByZWNhdGVkIGluIGZhdm9yIG9mCisJCQkJCSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSkKKwlsaXN0X2Zvcl9lYWNoX3NhZmVfcmN1CQkoZGVwcmVjYXRlZCwgbm90IHVzZWQpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UKKwlsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlX3JjdQkodG8gYmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBuZXcKKwkJCQkJIGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmN1KQorCWhsaXN0X2Zvcl9lYWNoX3JjdQkJKHRvIGJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YKKwkJCQkJIGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSkKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UKKworUkNVIHBvaW50ZXIgdXBkYXRlOgorCisJcmN1X2Fzc2lnbl9wb2ludGVyCisJbGlzdF9hZGRfcmN1CisJbGlzdF9hZGRfdGFpbF9yY3UKKwlsaXN0X2RlbF9yY3UKKwlsaXN0X3JlcGxhY2VfcmN1CisJaGxpc3RfZGVsX3JjdQorCWhsaXN0X2FkZF9oZWFkX3JjdQorCitSQ1UgZ3JhY2UgcGVyaW9kOgorCisJc3luY2hyb25pemVfa2VybmVsIChkZXByZWNhdGVkKQorCXN5bmNocm9uaXplX25ldAorCXN5bmNocm9uaXplX3NjaGVkCisJc3luY2hyb25pemVfcmN1CisJY2FsbF9yY3UKKwljYWxsX3JjdV9iaAorCitTZWUgdGhlIGNvbW1lbnQgaGVhZGVycyBpbiB0aGUgc291cmNlIGNvZGUgKG9yIHRoZSBkb2Nib29rIGdlbmVyYXRlZAorZnJvbSB0aGVtKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCis4LiAgQU5TV0VSUyBUTyBRVUlDSyBRVUlaWkVTCisKK1F1aWNrIFF1aXogIzE6CVdoeSBpcyB0aGlzIGFyZ3VtZW50IG5haXZlPyAgSG93IGNvdWxkIGEgZGVhZGxvY2sKKwkJb2NjdXIgd2hlbiB1c2luZyB0aGlzIGFsZ29yaXRobSBpbiBhIHJlYWwtd29ybGQgTGludXgKKwkJa2VybmVsPyAgW1JlZmVycmluZyB0byB0aGUgbG9jay1iYXNlZCAidG95IiBSQ1UKKwkJYWxnb3JpdGhtLl0KKworQW5zd2VyOgkJQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBvZiBldmVudHM6CisKKwkJMS4JQ1BVIDAgYWNxdWlyZXMgc29tZSB1bnJlbGF0ZWQgbG9jaywgY2FsbCBpdAorCQkJInByb2JsZW1hdGljX2xvY2siLgorCisJCTIuCUNQVSAxIGVudGVycyBzeW5jaHJvbml6ZV9yY3UoKSwgd3JpdGUtYWNxdWlyaW5nCisJCQlyY3VfZ3BfbXV0ZXguCisKKwkJMy4JQ1BVIDAgZW50ZXJzIHJjdV9yZWFkX2xvY2soKSwgYnV0IG11c3Qgd2FpdAorCQkJYmVjYXVzZSBDUFUgMSBob2xkcyByY3VfZ3BfbXV0ZXguCisKKwkJNC4JQ1BVIDEgaXMgaW50ZXJydXB0ZWQsIGFuZCB0aGUgaXJxIGhhbmRsZXIKKwkJCWF0dGVtcHRzIHRvIGFjcXVpcmUgcHJvYmxlbWF0aWNfbG9jay4KKworCQlUaGUgc3lzdGVtIGlzIG5vdyBkZWFkbG9ja2VkLgorCisJCU9uZSB3YXkgdG8gYXZvaWQgdGhpcyBkZWFkbG9jayBpcyB0byB1c2UgYW4gYXBwcm9hY2ggbGlrZQorCQl0aGF0IG9mIENPTkZJR19QUkVFTVBUX1JULCB3aGVyZSBhbGwgbm9ybWFsIHNwaW5sb2NrcworCQliZWNvbWUgYmxvY2tpbmcgbG9ja3MsIGFuZCBhbGwgaXJxIGhhbmRsZXJzIGV4ZWN1dGUgaW4KKwkJdGhlIGNvbnRleHQgb2Ygc3BlY2lhbCB0YXNrcy4gIEluIHRoaXMgY2FzZSwgaW4gc3RlcCA0CisJCWFib3ZlLCB0aGUgaXJxIGhhbmRsZXIgd291bGQgYmxvY2ssIGFsbG93aW5nIENQVSAxIHRvCisJCXJlbGVhc2UgcmN1X2dwX211dGV4LCBhdm9pZGluZyB0aGUgZGVhZGxvY2suCisKKwkJRXZlbiBpbiB0aGUgYWJzZW5jZSBvZiBkZWFkbG9jaywgdGhpcyBSQ1UgaW1wbGVtZW50YXRpb24KKwkJYWxsb3dzIGxhdGVuY3kgdG8gImJsZWVkIiBmcm9tIHJlYWRlcnMgdG8gb3RoZXIKKwkJcmVhZGVycyB0aHJvdWdoIHN5bmNocm9uaXplX3JjdSgpLiAgVG8gc2VlIHRoaXMsCisJCWNvbnNpZGVyIHRhc2sgQSBpbiBhbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24KKwkJKHRodXMgcmVhZC1ob2xkaW5nIHJjdV9ncF9tdXRleCksIHRhc2sgQiBibG9ja2VkCisJCWF0dGVtcHRpbmcgdG8gd3JpdGUtYWNxdWlyZSByY3VfZ3BfbXV0ZXgsIGFuZAorCQl0YXNrIEMgYmxvY2tlZCBpbiByY3VfcmVhZF9sb2NrKCkgYXR0ZW1wdGluZyB0bworCQlyZWFkX2FjcXVpcmUgcmN1X2dwX211dGV4LiAgVGFzayBBJ3MgUkNVIHJlYWQtc2lkZQorCQlsYXRlbmN5IGlzIGhvbGRpbmcgdXAgdGFzayBDLCBhbGJlaXQgaW5kaXJlY3RseSB2aWEKKwkJdGFzayBCLgorCisJCVJlYWx0aW1lIFJDVSBpbXBsZW1lbnRhdGlvbnMgdGhlcmVmb3JlIHVzZSBhIGNvdW50ZXItYmFzZWQKKwkJYXBwcm9hY2ggd2hlcmUgdGFza3MgaW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucworCQljYW5ub3QgYmUgYmxvY2tlZCBieSB0YXNrcyBleGVjdXRpbmcgc3luY2hyb25pemVfcmN1KCkuCisKK1F1aWNrIFF1aXogIzI6CUdpdmUgYW4gZXhhbXBsZSB3aGVyZSBDbGFzc2ljIFJDVSdzIHJlYWQtc2lkZQorCQlvdmVyaGVhZCBpcyAtbmVnYXRpdmUtLgorCitBbnN3ZXI6CQlJbWFnaW5lIGEgc2luZ2xlLUNQVSBzeXN0ZW0gd2l0aCBhIG5vbi1DT05GSUdfUFJFRU1QVAorCQlrZXJuZWwgd2hlcmUgYSByb3V0aW5nIHRhYmxlIGlzIHVzZWQgYnkgcHJvY2Vzcy1jb250ZXh0CisJCWNvZGUsIGJ1dCBjYW4gYmUgdXBkYXRlZCBieSBpcnEtY29udGV4dCBjb2RlIChmb3IgZXhhbXBsZSwKKwkJYnkgYW4gIklDTVAgUkVESVJFQ1QiIHBhY2tldCkuCVRoZSB1c3VhbCB3YXkgb2YgaGFuZGxpbmcKKwkJdGhpcyB3b3VsZCBiZSB0byBoYXZlIHRoZSBwcm9jZXNzLWNvbnRleHQgY29kZSBkaXNhYmxlCisJCWludGVycnVwdHMgd2hpbGUgc2VhcmNoaW5nIHRoZSByb3V0aW5nIHRhYmxlLiAgVXNlIG9mCisJCVJDVSBhbGxvd3Mgc3VjaCBpbnRlcnJ1cHQtZGlzYWJsaW5nIHRvIGJlIGRpc3BlbnNlZCB3aXRoLgorCQlUaHVzLCB3aXRob3V0IFJDVSwgeW91IHBheSB0aGUgY29zdCBvZiBkaXNhYmxpbmcgaW50ZXJydXB0cywKKwkJYW5kIHdpdGggUkNVIHlvdSBkb24ndC4KKworCQlPbmUgY2FuIGFyZ3VlIHRoYXQgdGhlIG92ZXJoZWFkIG9mIFJDVSBpbiB0aGlzCisJCWNhc2UgaXMgbmVnYXRpdmUgd2l0aCByZXNwZWN0IHRvIHRoZSBzaW5nbGUtQ1BVCisJCWludGVycnVwdC1kaXNhYmxpbmcgYXBwcm9hY2guICBPdGhlcnMgbWlnaHQgYXJndWUgdGhhdAorCQl0aGUgb3ZlcmhlYWQgb2YgUkNVIGlzIG1lcmVseSB6ZXJvLCBhbmQgdGhhdCByZXBsYWNpbmcKKwkJdGhlIHBvc2l0aXZlIG92ZXJoZWFkIG9mIHRoZSBpbnRlcnJ1cHQtZGlzYWJsaW5nIHNjaGVtZQorCQl3aXRoIHRoZSB6ZXJvLW92ZXJoZWFkIFJDVSBzY2hlbWUgZG9lcyBub3QgY29uc3RpdHV0ZQorCQluZWdhdGl2ZSBvdmVyaGVhZC4KKworCQlJbiByZWFsIGxpZmUsIG9mIGNvdXJzZSwgdGhpbmdzIGFyZSBtb3JlIGNvbXBsZXguICBCdXQKKwkJZXZlbiB0aGUgdGhlb3JldGljYWwgcG9zc2liaWxpdHkgb2YgbmVnYXRpdmUgb3ZlcmhlYWQgZm9yCisJCWEgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZSBpcyBhIGJpdCB1bmV4cGVjdGVkLiAgOy0pCisKK1F1aWNrIFF1aXogIzM6ICBJZiBpdCBpcyBpbGxlZ2FsIHRvIGJsb2NrIGluIGFuIFJDVSByZWFkLXNpZGUKKwkJY3JpdGljYWwgc2VjdGlvbiwgd2hhdCB0aGUgaGVjayBkbyB5b3UgZG8gaW4KKwkJUFJFRU1QVF9SVCwgd2hlcmUgbm9ybWFsIHNwaW5sb2NrcyBjYW4gYmxvY2s/Pz8KKworQW5zd2VyOgkJSnVzdCBhcyBQUkVFTVBUX1JUIHBlcm1pdHMgcHJlZW1wdGlvbiBvZiBzcGlubG9jaworCQljcml0aWNhbCBzZWN0aW9ucywgaXQgcGVybWl0cyBwcmVlbXB0aW9uIG9mIFJDVQorCQlyZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMuICBJdCBhbHNvIHBlcm1pdHMKKwkJc3BpbmxvY2tzIGJsb2NraW5nIHdoaWxlIGluIFJDVSByZWFkLXNpZGUgY3JpdGljYWwKKwkJc2VjdGlvbnMuCisKKwkJV2h5IHRoZSBhcHBhcmVudCBpbmNvbnNpc3RlbmN5PyAgQmVjYXVzZSBpdCBpcyBpdAorCQlwb3NzaWJsZSB0byB1c2UgcHJpb3JpdHkgYm9vc3RpbmcgdG8ga2VlcCB0aGUgUkNVCisJCWdyYWNlIHBlcmlvZHMgc2hvcnQgaWYgbmVlZCBiZSAoZm9yIGV4YW1wbGUsIGlmIHJ1bm5pbmcKKwkJc2hvcnQgb2YgbWVtb3J5KS4gIEluIGNvbnRyYXN0LCBpZiBibG9ja2luZyB3YWl0aW5nCisJCWZvciAoc2F5KSBuZXR3b3JrIHJlY2VwdGlvbiwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cKKwkJd2hhdCBzaG91bGQgYmUgYm9vc3RlZC4gIEVzcGVjaWFsbHkgZ2l2ZW4gdGhhdCB0aGUKKwkJcHJvY2VzcyB3ZSBuZWVkIHRvIGJvb3N0IG1pZ2h0IHdlbGwgYmUgYSBodW1hbiBiZWluZworCQl3aG8ganVzdCB3ZW50IG91dCBmb3IgYSBwaXp6YSBvciBzb21ldGhpbmcuICBBbmQgYWx0aG91Z2gKKwkJYSBjb21wdXRlci1vcGVyYXRlZCBjYXR0bGUgcHJvZCBtaWdodCBhcm91c2Ugc2VyaW91cworCQlpbnRlcmVzdCwgaXQgbWlnaHQgYWxzbyBwcm92b2tlIHNlcmlvdXMgb2JqZWN0aW9ucy4KKwkJQmVzaWRlcywgaG93IGRvZXMgdGhlIGNvbXB1dGVyIGtub3cgd2hhdCBwaXp6YSBwYXJsb3IKKwkJdGhlIGh1bWFuIGJlaW5nIHdlbnQgdG8/Pz8KKworCitBQ0tOT1dMRURHRU1FTlRTCisKK015IHRoYW5rcyB0byB0aGUgcGVvcGxlIHdobyBoZWxwZWQgbWFrZSB0aGlzIGh1bWFuLXJlYWRhYmxlLCBpbmNsdWRpbmcKK0pvbiBXYWxwb2xlLCBKb3NoIFRyaXBsZXR0LCBTZXJnZSBIYWxseW4sIGFuZCBTdXphbm5lIFdvb2QuCisKKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LnJkcm9wLmNvbS91c2Vycy9wYXVsbWNrL1JDVS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNwaS1ob3RrZXkudHh0IGIvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQKaW5kZXggMGFjZGM4MC4uNzQ0ZjFhZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQKQEAgLTM1LDQgKzM1LDQgQEAKIHRvIHJldHJpZXZlIGl0LgogCiBOb3RlOiBVc2UgY21kbGluZSAiYWNwaV9nZW5lcmljX2hvdGtleSIgdG8gb3Zlci1yaWRlCi1sb2FkaW5nIGFueSBwbGF0Zm9ybSBzcGVjaWZpYyBkcml2ZXJzLgorcGxhdGZvcm0tc3BlY2lmaWMgd2l0aCBnZW5lcmljIGRyaXZlci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2FwcGx5aW5nLXBhdGNoZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MWU0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2FwcGx5aW5nLXBhdGNoZXMudHh0CkBAIC0wLDAgKzEsNDM5IEBACisKKwlBcHBseWluZyBQYXRjaGVzIFRvIFRoZSBMaW51eCBLZXJuZWwKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCShXcml0dGVuIGJ5IEplc3BlciBKdWhsLCBBdWd1c3QgMjAwNSkKKworCisKK0EgZnJlcXVlbnRseSBhc2tlZCBxdWVzdGlvbiBvbiB0aGUgTGludXggS2VybmVsIE1haWxpbmcgTGlzdCBpcyBob3cgdG8gYXBwbHkKK2EgcGF0Y2ggdG8gdGhlIGtlcm5lbCBvciwgbW9yZSBzcGVjaWZpY2FsbHksIHdoYXQgYmFzZSBrZXJuZWwgYSBwYXRjaCBmb3IKK29uZSBvZiB0aGUgbWFueSB0cmVlcy9icmFuY2hlcyBzaG91bGQgYmUgYXBwbGllZCB0by4gSG9wZWZ1bGx5IHRoaXMgZG9jdW1lbnQKK3dpbGwgZXhwbGFpbiB0aGlzIHRvIHlvdS4KKworSW4gYWRkaXRpb24gdG8gZXhwbGFpbmluZyBob3cgdG8gYXBwbHkgYW5kIHJldmVydCBwYXRjaGVzLCBhIGJyaWVmCitkZXNjcmlwdGlvbiBvZiB0aGUgZGlmZmVyZW50IGtlcm5lbCB0cmVlcyAoYW5kIGV4YW1wbGVzIG9mIGhvdyB0byBhcHBseQordGhlaXIgc3BlY2lmaWMgcGF0Y2hlcykgaXMgYWxzbyBwcm92aWRlZC4KKworCitXaGF0IGlzIGEgcGF0Y2g/CistLS0KKyBBIHBhdGNoIGlzIGEgc21hbGwgdGV4dCBkb2N1bWVudCBjb250YWluaW5nIGEgZGVsdGEgb2YgY2hhbmdlcyBiZXR3ZWVuIHR3bworZGlmZmVyZW50IHZlcnNpb25zIG9mIGEgc291cmNlIHRyZWUuIFBhdGNoZXMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgYGRpZmYnCitwcm9ncmFtLgorVG8gY29ycmVjdGx5IGFwcGx5IGEgcGF0Y2ggeW91IG5lZWQgdG8ga25vdyB3aGF0IGJhc2UgaXQgd2FzIGdlbmVyYXRlZCBmcm9tCithbmQgd2hhdCBuZXcgdmVyc2lvbiB0aGUgcGF0Y2ggd2lsbCBjaGFuZ2UgdGhlIHNvdXJjZSB0cmVlIGludG8uIFRoZXNlCitzaG91bGQgYm90aCBiZSBwcmVzZW50IGluIHRoZSBwYXRjaCBmaWxlIG1ldGFkYXRhIG9yIGJlIHBvc3NpYmxlIHRvIGRlZHVjZQorZnJvbSB0aGUgZmlsZW5hbWUuCisKKworSG93IGRvIEkgYXBwbHkgb3IgcmV2ZXJ0IGEgcGF0Y2g/CistLS0KKyBZb3UgYXBwbHkgYSBwYXRjaCB3aXRoIHRoZSBgcGF0Y2gnIHByb2dyYW0uIFRoZSBwYXRjaCBwcm9ncmFtIHJlYWRzIGEgZGlmZgorKG9yIHBhdGNoKSBmaWxlIGFuZCBtYWtlcyB0aGUgY2hhbmdlcyB0byB0aGUgc291cmNlIHRyZWUgZGVzY3JpYmVkIGluIGl0LgorCitQYXRjaGVzIGZvciB0aGUgTGludXgga2VybmVsIGFyZSBnZW5lcmF0ZWQgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBkaXJlY3RvcnkKK2hvbGRpbmcgdGhlIGtlcm5lbCBzb3VyY2UgZGlyLgorCitUaGlzIG1lYW5zIHRoYXQgcGF0aHMgdG8gZmlsZXMgaW5zaWRlIHRoZSBwYXRjaCBmaWxlIGNvbnRhaW4gdGhlIG5hbWUgb2YgdGhlCitrZXJuZWwgc291cmNlIGRpcmVjdG9yaWVzIGl0IHdhcyBnZW5lcmF0ZWQgYWdhaW5zdCAob3Igc29tZSBvdGhlciBkaXJlY3RvcnkKK25hbWVzIGxpa2UgImEvIiBhbmQgImIvIikuCitTaW5jZSB0aGlzIGlzIHVubGlrZWx5IHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBrZXJuZWwgc291cmNlIGRpciBvbiB5b3VyCitsb2NhbCBtYWNoaW5lIChidXQgaXMgb2Z0ZW4gdXNlZnVsIGluZm8gdG8gc2VlIHdoYXQgdmVyc2lvbiBhbiBvdGhlcndpc2UKK3VubGFiZWxlZCBwYXRjaCB3YXMgZ2VuZXJhdGVkIGFnYWluc3QpIHlvdSBzaG91bGQgY2hhbmdlIGludG8geW91ciBrZXJuZWwKK3NvdXJjZSBkaXJlY3RvcnkgYW5kIHRoZW4gc3RyaXAgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHBhdGggZnJvbSBmaWxlbmFtZXMKK2luIHRoZSBwYXRjaCBmaWxlIHdoZW4gYXBwbHlpbmcgaXQgKHRoZSAtcDEgYXJndW1lbnQgdG8gYHBhdGNoJyBkb2VzIHRoaXMpLgorCitUbyByZXZlcnQgYSBwcmV2aW91c2x5IGFwcGxpZWQgcGF0Y2gsIHVzZSB0aGUgLVIgYXJndW1lbnQgdG8gcGF0Y2guCitTbywgaWYgeW91IGFwcGxpZWQgYSBwYXRjaCBsaWtlIHRoaXM6CisJcGF0Y2ggLXAxIDwgLi4vcGF0Y2gteC55LnoKKworWW91IGNhbiByZXZlcnQgKHVuZG8pIGl0IGxpa2UgdGhpczoKKwlwYXRjaCAtUiAtcDEgPCAuLi9wYXRjaC14LnkuegorCisKK0hvdyBkbyBJIGZlZWQgYSBwYXRjaC9kaWZmIGZpbGUgdG8gYHBhdGNoJz8KKy0tLQorIFRoaXMgKGFzIHVzdWFsIHdpdGggTGludXggYW5kIG90aGVyIFVOSVggbGlrZSBvcGVyYXRpbmcgc3lzdGVtcykgY2FuIGJlCitkb25lIGluIHNldmVyYWwgZGlmZmVyZW50IHdheXMuCitJbiBhbGwgdGhlIGV4YW1wbGVzIGJlbG93IEkgZmVlZCB0aGUgZmlsZSAoaW4gdW5jb21wcmVzc2VkIGZvcm0pIHRvIHBhdGNoCit2aWEgc3RkaW4gdXNpbmcgdGhlIGZvbGxvd2luZyBzeW50YXg6CisJcGF0Y2ggLXAxIDwgcGF0aC90by9wYXRjaC14LnkuegorCitJZiB5b3UganVzdCB3YW50IHRvIGJlIGFibGUgdG8gZm9sbG93IHRoZSBleGFtcGxlcyBiZWxvdyBhbmQgZG9uJ3Qgd2FudCB0bwora25vdyBvZiBtb3JlIHRoYW4gb25lIHdheSB0byB1c2UgcGF0Y2gsIHRoZW4geW91IGNhbiBzdG9wIHJlYWRpbmcgdGhpcworc2VjdGlvbiBoZXJlLgorCitQYXRjaCBjYW4gYWxzbyBnZXQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gdXNlIHZpYSB0aGUgLWkgYXJndW1lbnQsIGxpa2UKK3RoaXM6CisJcGF0Y2ggLXAxIC1pIHBhdGgvdG8vcGF0Y2gteC55LnoKKworSWYgeW91ciBwYXRjaCBmaWxlIGlzIGNvbXByZXNzZWQgd2l0aCBnemlwIG9yIGJ6aXAyIGFuZCB5b3UgZG9uJ3Qgd2FudCB0bwordW5jb21wcmVzcyBpdCBiZWZvcmUgYXBwbHlpbmcgaXQsIHRoZW4geW91IGNhbiBmZWVkIGl0IHRvIHBhdGNoIGxpa2UgdGhpcworaW5zdGVhZDoKKwl6Y2F0IHBhdGgvdG8vcGF0Y2gteC55LnouZ3ogfCBwYXRjaCAtcDEKKwliemNhdCBwYXRoL3RvL3BhdGNoLXgueS56LmJ6MiB8IHBhdGNoIC1wMQorCitJZiB5b3Ugd2lzaCB0byB1bmNvbXByZXNzIHRoZSBwYXRjaCBmaWxlIGJ5IGhhbmQgZmlyc3QgYmVmb3JlIGFwcGx5aW5nIGl0Cisod2hhdCBJIGFzc3VtZSB5b3UndmUgZG9uZSBpbiB0aGUgZXhhbXBsZXMgYmVsb3cpLCB0aGVuIHlvdSBzaW1wbHkgcnVuCitndW56aXAgb3IgYnVuemlwMiBvbiB0aGUgZmlsZSAtIGxpa2UgdGhpczoKKwlndW56aXAgcGF0Y2gteC55LnouZ3oKKwlidW56aXAyIHBhdGNoLXgueS56LmJ6MgorCitXaGljaCB3aWxsIGxlYXZlIHlvdSB3aXRoIGEgcGxhaW4gdGV4dCBwYXRjaC14LnkueiBmaWxlIHRoYXQgeW91IGNhbiBmZWVkIHRvCitwYXRjaCB2aWEgc3RkaW4gb3IgdGhlIC1pIGFyZ3VtZW50LCBhcyB5b3UgcHJlZmVyLgorCitBIGZldyBvdGhlciBuaWNlIGFyZ3VtZW50cyBmb3IgcGF0Y2ggYXJlIC1zIHdoaWNoIGNhdXNlcyBwYXRjaCB0byBiZSBzaWxlbnQKK2V4Y2VwdCBmb3IgZXJyb3JzIHdoaWNoIGlzIG5pY2UgdG8gcHJldmVudCBlcnJvcnMgZnJvbSBzY3JvbGxpbmcgb3V0IG9mIHRoZQorc2NyZWVuIHRvbyBmYXN0LCBhbmQgLS1kcnktcnVuIHdoaWNoIGNhdXNlcyBwYXRjaCB0byBqdXN0IHByaW50IGEgbGlzdGluZyBvZgord2hhdCB3b3VsZCBoYXBwZW4sIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IG1ha2UgYW55IGNoYW5nZXMuIEZpbmFsbHkgLS12ZXJib3NlCit0ZWxscyBwYXRjaCB0byBwcmludCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3b3JrIGJlaW5nIGRvbmUuCisKKworQ29tbW9uIGVycm9ycyB3aGVuIHBhdGNoaW5nCistLS0KKyBXaGVuIHBhdGNoIGFwcGxpZXMgYSBwYXRjaCBmaWxlIGl0IGF0dGVtcHRzIHRvIHZlcmlmeSB0aGUgc2FuaXR5IG9mIHRoZQorZmlsZSBpbiBkaWZmZXJlbnQgd2F5cy4KK0NoZWNraW5nIHRoYXQgdGhlIGZpbGUgbG9va3MgbGlrZSBhIHZhbGlkIHBhdGNoIGZpbGUsIGNoZWNraW5nIHRoZSBjb2RlCithcm91bmQgdGhlIGJpdHMgYmVpbmcgbW9kaWZpZWQgbWF0Y2hlcyB0aGUgY29udGV4dCBwcm92aWRlZCBpbiB0aGUgcGF0Y2ggYXJlCitqdXN0IHR3byBvZiB0aGUgYmFzaWMgc2FuaXR5IGNoZWNrcyBwYXRjaCBkb2VzLgorCitJZiBwYXRjaCBlbmNvdW50ZXJzIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgbG9vayBxdWl0ZSByaWdodCBpdCBoYXMgdHdvCitvcHRpb25zLiBJdCBjYW4gZWl0aGVyIHJlZnVzZSB0byBhcHBseSB0aGUgY2hhbmdlcyBhbmQgYWJvcnQgb3IgaXQgY2FuIHRyeQordG8gZmluZCBhIHdheSB0byBtYWtlIHRoZSBwYXRjaCBhcHBseSB3aXRoIGEgZmV3IG1pbm9yIGNoYW5nZXMuCisKK09uZSBleGFtcGxlIG9mIHNvbWV0aGluZyB0aGF0J3Mgbm90ICdxdWl0ZSByaWdodCcgdGhhdCBwYXRjaCB3aWxsIGF0dGVtcHQgdG8KK2ZpeCB1cCBpcyBpZiBhbGwgdGhlIGNvbnRleHQgbWF0Y2hlcywgdGhlIGxpbmVzIGJlaW5nIGNoYW5nZWQgbWF0Y2gsIGJ1dCB0aGUKK2xpbmUgbnVtYmVycyBhcmUgZGlmZmVyZW50LiBUaGlzIGNhbiBoYXBwZW4sIGZvciBleGFtcGxlLCBpZiB0aGUgcGF0Y2ggbWFrZXMKK2EgY2hhbmdlIGluIHRoZSBtaWRkbGUgb2YgdGhlIGZpbGUgYnV0IGZvciBzb21lIHJlYXNvbnMgYSBmZXcgbGluZXMgaGF2ZQorYmVlbiBhZGRlZCBvciByZW1vdmVkIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gSW4gdGhhdCBjYXNlCitldmVyeXRoaW5nIGxvb2tzIGdvb2QgaXQgaGFzIGp1c3QgbW92ZWQgdXAgb3IgZG93biBhIGJpdCwgYW5kIHBhdGNoIHdpbGwKK3VzdWFsbHkgYWRqdXN0IHRoZSBsaW5lIG51bWJlcnMgYW5kIGFwcGx5IHRoZSBwYXRjaC4KKworV2hlbmV2ZXIgcGF0Y2ggYXBwbGllcyBhIHBhdGNoIHRoYXQgaXQgaGFkIHRvIG1vZGlmeSBhIGJpdCB0byBtYWtlIGl0IGZpdAoraXQnbGwgdGVsbCB5b3UgYWJvdXQgaXQgYnkgc2F5aW5nIHRoZSBwYXRjaCBhcHBsaWVkIHdpdGggJ2Z1enonLgorWW91IHNob3VsZCBiZSB3YXJ5IG9mIHN1Y2ggY2hhbmdlcyBzaW5jZSBldmVuIHRob3VnaCBwYXRjaCBwcm9iYWJseSBnb3QgaXQKK3JpZ2h0IGl0IGRvZXNuJ3QgL2Fsd2F5cy8gZ2V0IGl0IHJpZ2h0LCBhbmQgdGhlIHJlc3VsdCB3aWxsIHNvbWV0aW1lcyBiZQord3JvbmcuCisKK1doZW4gcGF0Y2ggZW5jb3VudGVycyBhIGNoYW5nZSB0aGF0IGl0IGNhbid0IGZpeCB1cCB3aXRoIGZ1enogaXQgcmVqZWN0cyBpdAorb3V0cmlnaHQgYW5kIGxlYXZlcyBhIGZpbGUgd2l0aCBhIC5yZWogZXh0ZW5zaW9uIChhIHJlamVjdCBmaWxlKS4gWW91IGNhbgorcmVhZCB0aGlzIGZpbGUgdG8gc2VlIGV4YWN0ZWx5IHdoYXQgY2hhbmdlIGNvdWxkbid0IGJlIGFwcGxpZWQsIHNvIHlvdSBjYW4KK2dvIGZpeCBpdCB1cCBieSBoYW5kIGlmIHlvdSB3aXNoLgorCitJZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgdGhpcmQgcGFydHkgcGF0Y2hlcyBhcHBsaWVkIHRvIHlvdXIga2VybmVsIHNvdXJjZSwgYnV0Citvbmx5IHBhdGNoZXMgZnJvbSBrZXJuZWwub3JnIGFuZCB5b3UgYXBwbHkgdGhlIHBhdGNoZXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIsCithbmQgaGF2ZSBtYWRlIG5vIG1vZGlmaWNhdGlvbnMgeW91cnNlbGYgdG8gdGhlIHNvdXJjZSBmaWxlcywgdGhlbiB5b3Ugc2hvdWxkCituZXZlciBzZWUgYSBmdXp6IG9yIHJlamVjdCBtZXNzYWdlIGZyb20gcGF0Y2guIElmIHlvdSBkbyBzZWUgc3VjaCBtZXNzYWdlcworYW55d2F5LCB0aGVuIHRoZXJlJ3MgYSBoaWdoIHJpc2sgdGhhdCBlaXRoZXIgeW91ciBsb2NhbCBzb3VyY2UgdHJlZSBvciB0aGUKK3BhdGNoIGZpbGUgaXMgY29ycnVwdGVkIGluIHNvbWUgd2F5LiBJbiB0aGF0IGNhc2UgeW91IHNob3VsZCBwcm9iYWJseSB0cnkKK3JlZG93bmxvYWRpbmcgdGhlIHBhdGNoIGFuZCBpZiB0aGluZ3MgYXJlIHN0aWxsIG5vdCBPSyB0aGVuIHlvdSdkIGJlIGFkdmlzZWQKK3RvIHN0YXJ0IHdpdGggYSBmcmVzaCB0cmVlIGRvd25sb2FkZWQgaW4gZnVsbCBmcm9tIGtlcm5lbC5vcmcuCisKK0xldCdzIGxvb2sgYSBiaXQgbW9yZSBhdCBzb21lIG9mIHRoZSBtZXNzYWdlcyBwYXRjaCBjYW4gcHJvZHVjZS4KKworSWYgcGF0Y2ggc3RvcHMgYW5kIHByZXNlbnRzIGEgIkZpbGUgdG8gcGF0Y2g6IiBwcm9tcHQsIHRoZW4gcGF0Y2ggY291bGQgbm90CitmaW5kIGEgZmlsZSB0byBiZSBwYXRjaGVkLiBNb3N0IGxpa2VseSB5b3UgZm9yZ290IHRvIHNwZWNpZnkgLXAxIG9yIHlvdSBhcmUKK2luIHRoZSB3cm9uZyBkaXJlY3RvcnkuIExlc3Mgb2Z0ZW4sIHlvdSdsbCBmaW5kIHBhdGNoZXMgdGhhdCBuZWVkIHRvIGJlCithcHBsaWVkIHdpdGggLXAwIGluc3RlYWQgb2YgLXAxIChyZWFkaW5nIHRoZSBwYXRjaCBmaWxlIHNob3VsZCByZXZlYWwgaWYKK3RoaXMgaXMgdGhlIGNhc2UgLSBpZiBzbywgdGhlbiB0aGlzIGlzIGFuIGVycm9yIGJ5IHRoZSBwZXJzb24gd2hvIGNyZWF0ZWQKK3RoZSBwYXRjaCBidXQgaXMgbm90IGZhdGFsKS4KKworSWYgeW91IGdldCAiSHVuayAjMiBzdWNjZWVkZWQgYXQgMTg4NyB3aXRoIGZ1enogMiAob2Zmc2V0IDcgbGluZXMpLiIgb3IgYQorbWVzc2FnZSBzaW1pbGFyIHRvIHRoYXQsIHRoZW4gaXQgbWVhbnMgdGhhdCBwYXRjaCBoYWQgdG8gYWRqdXN0IHRoZSBsb2NhdGlvbgorb2YgdGhlIGNoYW5nZSAoaW4gdGhpcyBleGFtcGxlIGl0IG5lZWRlZCB0byBtb3ZlIDcgbGluZXMgZnJvbSB3aGVyZSBpdAorZXhwZWN0ZWQgdG8gbWFrZSB0aGUgY2hhbmdlIHRvIG1ha2UgaXQgZml0KS4KK1RoZSByZXN1bHRpbmcgZmlsZSBtYXkgb3IgbWF5IG5vdCBiZSBPSywgZGVwZW5kaW5nIG9uIHRoZSByZWFzb24gdGhlIGZpbGUKK3dhcyBkaWZmZXJlbnQgdGhhbiBleHBlY3RlZC4KK1RoaXMgb2Z0ZW4gaGFwcGVucyBpZiB5b3UgdHJ5IHRvIGFwcGx5IGEgcGF0Y2ggdGhhdCB3YXMgZ2VuZXJhdGVkIGFnYWluc3QgYQorZGlmZmVyZW50IGtlcm5lbCB2ZXJzaW9uIHRoYW4gdGhlIG9uZSB5b3UgYXJlIHRyeWluZyB0byBwYXRjaC4KKworSWYgeW91IGdldCBhIG1lc3NhZ2UgbGlrZSAiSHVuayAjMyBGQUlMRUQgYXQgMjM4Ny4iLCB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlCitwYXRjaCBjb3VsZCBub3QgYmUgYXBwbGllZCBjb3JyZWN0bHkgYW5kIHRoZSBwYXRjaCBwcm9ncmFtIHdhcyB1bmFibGUgdG8KK2Z1enogaXRzIHdheSB0aHJvdWdoLiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSAucmVqIGZpbGUgd2l0aCB0aGUgY2hhbmdlIHRoYXQKK2NhdXNlZCB0aGUgcGF0Y2ggdG8gZmFpbCBhbmQgYWxzbyBhIC5vcmlnIGZpbGUgc2hvd2luZyB5b3UgdGhlIG9yaWdpbmFsCitjb250ZW50IHRoYXQgY291bGRuJ3QgYmUgY2hhbmdlZC4KKworSWYgeW91IGdldCAiUmV2ZXJzZWQgKG9yIHByZXZpb3VzbHkgYXBwbGllZCkgcGF0Y2ggZGV0ZWN0ZWQhICBBc3N1bWUgLVI/IFtuXSIKK3RoZW4gcGF0Y2ggZGV0ZWN0ZWQgdGhhdCB0aGUgY2hhbmdlIGNvbnRhaW5lZCBpbiB0aGUgcGF0Y2ggc2VlbXMgdG8gaGF2ZQorYWxyZWFkeSBiZWVuIG1hZGUuCitJZiB5b3UgYWN0dWFsbHkgZGlkIGFwcGx5IHRoaXMgcGF0Y2ggcHJldmlvdXNseSBhbmQgeW91IGp1c3QgcmUtYXBwbGllZCBpdAoraW4gZXJyb3IsIHRoZW4ganVzdCBzYXkgW25dbyBhbmQgYWJvcnQgdGhpcyBwYXRjaC4gSWYgeW91IGFwcGxpZWQgdGhpcyBwYXRjaAorcHJldmlvdXNseSBhbmQgYWN0dWFsbHkgaW50ZW5kZWQgdG8gcmV2ZXJ0IGl0LCBidXQgZm9yZ290IHRvIHNwZWNpZnkgLVIsCit0aGVuIHlvdSBjYW4gc2F5IFt5XWVzIGhlcmUgdG8gbWFrZSBwYXRjaCByZXZlcnQgaXQgZm9yIHlvdS4KK1RoaXMgY2FuIGFsc28gaGFwcGVuIGlmIHRoZSBjcmVhdG9yIG9mIHRoZSBwYXRjaCByZXZlcnNlZCB0aGUgc291cmNlIGFuZAorZGVzdGluYXRpb24gZGlyZWN0b3JpZXMgd2hlbiBjcmVhdGluZyB0aGUgcGF0Y2gsIGFuZCBpbiB0aGF0IGNhc2UgcmV2ZXJ0aW5nCit0aGUgcGF0Y2ggd2lsbCBpbiBmYWN0IGFwcGx5IGl0LgorCitBIG1lc3NhZ2Ugc2ltaWxhciB0byAicGF0Y2g6ICoqKiogdW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBwYXRjaCIgb3IgInBhdGNoCit1bmV4cGVjdGVkbHkgZW5kcyBpbiBtaWRkbGUgb2YgbGluZSIgbWVhbnMgdGhhdCBwYXRjaCBjb3VsZCBtYWtlIG5vIHNlbnNlIG9mCit0aGUgZmlsZSB5b3UgZmVkIHRvIGl0LiBFaXRoZXIgeW91ciBkb3dubG9hZCBpcyBicm9rZW4gb3IgeW91IHRyaWVkIHRvIGZlZWQKK3BhdGNoIGEgY29tcHJlc3NlZCBwYXRjaCBmaWxlIHdpdGhvdXQgdW5jb21wcmVzc2luZyBpdCBmaXJzdC4KKworQXMgSSBhbHJlYWR5IG1lbnRpb25lZCBhYm92ZSwgdGhlc2UgZXJyb3JzIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgeW91IGFwcGx5CithIHBhdGNoIGZyb20ga2VybmVsLm9yZyB0byB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIGFuIHVubW9kaWZpZWQgc291cmNlIHRyZWUuCitTbyBpZiB5b3UgZ2V0IHRoZXNlIGVycm9ycyB3aXRoIGtlcm5lbC5vcmcgcGF0Y2hlcyB0aGVuIHlvdSBzaG91bGQgcHJvYmFibHkKK2Fzc3VtZSB0aGF0IGVpdGhlciB5b3VyIHBhdGNoIGZpbGUgb3IgeW91ciB0cmVlIGlzIGJyb2tlbiBhbmQgSSdkIGFkdmljZSB5b3UKK3RvIHN0YXJ0IG92ZXIgd2l0aCBhIGZyZXNoIGRvd25sb2FkIG9mIGEgZnVsbCBrZXJuZWwgdHJlZSBhbmQgdGhlIHBhdGNoIHlvdQord2lzaCB0byBhcHBseS4KKworCitBcmUgdGhlcmUgYW55IGFsdGVybmF0aXZlcyB0byBgcGF0Y2gnPworLS0tCisgWWVzIHRoZXJlIGFyZSBhbHRlcm5hdGl2ZXMuIFlvdSBjYW4gdXNlIHRoZSBgaW50ZXJkaWZmJyBwcm9ncmFtCisoaHR0cDovL2N5YmVyZWxrLm5ldC90aW0vcGF0Y2h1dGlscy8pIHRvIGdlbmVyYXRlIGEgcGF0Y2ggcmVwcmVzZW50aW5nIHRoZQorZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gcGF0Y2hlcyBhbmQgdGhlbiBhcHBseSB0aGUgcmVzdWx0LgorVGhpcyB3aWxsIGxldCB5b3UgbW92ZSBmcm9tIHNvbWV0aGluZyBsaWtlIDIuNi4xMi4yIHRvIDIuNi4xMi4zIGluIGEgc2luZ2xlCitzdGVwLiBUaGUgLXogZmxhZyB0byBpbnRlcmRpZmYgd2lsbCBldmVuIGxldCB5b3UgZmVlZCBpdCBwYXRjaGVzIGluIGd6aXAgb3IKK2J6aXAyIGNvbXByZXNzZWQgZm9ybSBkaXJlY3RseSB3aXRob3V0IHRoZSB1c2Ugb2YgemNhdCBvciBiemNhdCBvciBtYW51YWwKK2RlY29tcHJlc3Npb24uCisKK0hlcmUncyBob3cgeW91J2QgZ28gZnJvbSAyLjYuMTIuMiB0byAyLjYuMTIuMyBpbiBhIHNpbmdsZSBzdGVwOgorCWludGVyZGlmZiAteiAuLi9wYXRjaC0yLjYuMTIuMi5iejIgLi4vcGF0Y2gtMi42LjEyLjMuZ3ogfCBwYXRjaCAtcDEKKworQWx0aG91Z2ggaW50ZXJkaWZmIG1heSBzYXZlIHlvdSBhIHN0ZXAgb3IgdHdvIHlvdSBhcmUgZ2VuZXJhbGx5IGFkdmlzZWQgdG8KK2RvIHRoZSBhZGRpdGlvbmFsIHN0ZXBzIHNpbmNlIGludGVyZGlmZiBjYW4gZ2V0IHRoaW5ncyB3cm9uZyBpbiBzb21lIGNhc2VzLgorCisgQW5vdGhlciBhbHRlcm5hdGl2ZSBpcyBga2V0Y2h1cCcsIHdoaWNoIGlzIGEgcHl0aG9uIHNjcmlwdCBmb3IgYXV0b21hdGljCitkb3dubG9hZGluZyBhbmQgYXBwbHlpbmcgb2YgcGF0Y2hlcyAoaHR0cDovL3d3dy5zZWxlbmljLmNvbS9rZXRjaHVwLykuCisKK090aGVyIG5pY2UgdG9vbHMgYXJlIGRpZmZzdGF0IHdoaWNoIHNob3dzIGEgc3VtbWFyeSBvZiBjaGFuZ2VzIG1hZGUgYnkgYQorcGF0Y2gsIGxzZGlmZiB3aGljaCBkaXNwbGF5cyBhIHNob3J0IGxpc3Rpbmcgb2YgYWZmZWN0ZWQgZmlsZXMgaW4gYSBwYXRjaAorZmlsZSwgYWxvbmcgd2l0aCAob3B0aW9uYWxseSkgdGhlIGxpbmUgbnVtYmVycyBvZiB0aGUgc3RhcnQgb2YgZWFjaCBwYXRjaAorYW5kIGdyZXBkaWZmIHdoaWNoIGRpc3BsYXlzIGEgbGlzdCBvZiB0aGUgZmlsZXMgbW9kaWZpZWQgYnkgYSBwYXRjaCB3aGVyZQordGhlIHBhdGNoIGNvbnRhaW5zIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLgorCisKK1doZXJlIGNhbiBJIGRvd25sb2FkIHRoZSBwYXRjaGVzPworLS0tCisgVGhlIHBhdGNoZXMgYXJlIGF2YWlsYWJsZSBhdCBodHRwOi8va2VybmVsLm9yZy8KK01vc3QgcmVjZW50IHBhdGNoZXMgYXJlIGxpbmtlZCBmcm9tIHRoZSBmcm9udCBwYWdlLCBidXQgdGhleSBhbHNvIGhhdmUKK3NwZWNpZmljIGhvbWVzLgorCitUaGUgMi42LngueSAoLXN0YWJsZSkgYW5kIDIuNi54IHBhdGNoZXMgbGl2ZSBhdAorIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvdjIuNi8KKworVGhlIC1yYyBwYXRjaGVzIGxpdmUgYXQKKyBmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3YyLjYvdGVzdGluZy8KKworVGhlIC1naXQgcGF0Y2hlcyBsaXZlIGF0CisgZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC92Mi42L3NuYXBzaG90cy8KKworVGhlIC1tbSBrZXJuZWxzIGxpdmUgYXQKKyBmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9ha3BtL3BhdGNoZXMvMi42LworCitJbiBwbGFjZSBvZiBmdHAua2VybmVsLm9yZyB5b3UgY2FuIHVzZSBmdHAuY2Mua2VybmVsLm9yZywgd2hlcmUgY2MgaXMgYQorY291bnRyeSBjb2RlLiBUaGlzIHdheSB5b3UnbGwgYmUgZG93bmxvYWRpbmcgZnJvbSBhIG1pcnJvciBzaXRlIHRoYXQncyBtb3N0CitsaWtlbHkgZ2VvZ3JhcGhpY2FsbHkgY2xvc2VyIHRvIHlvdSwgcmVzdWx0aW5nIGluIGZhc3RlciBkb3dubG9hZHMgZm9yIHlvdSwKK2xlc3MgYmFuZHdpZHRoIHVzZWQgZ2xvYmFsbHkgYW5kIGxlc3MgbG9hZCBvbiB0aGUgbWFpbiBrZXJuZWwub3JnIHNlcnZlcnMgLQordGhlc2UgYXJlIGdvb2QgdGhpbmdzLCBkbyB1c2UgbWlycm9ycyB3aGVuIHBvc3NpYmxlLgorCisKK1RoZSAyLjYueCBrZXJuZWxzCistLS0KKyBUaGVzZSBhcmUgdGhlIGJhc2Ugc3RhYmxlIHJlbGVhc2VzIHJlbGVhc2VkIGJ5IExpbnVzLiBUaGUgaGlnaGVzdCBudW1iZXJlZAorcmVsZWFzZSBpcyB0aGUgbW9zdCByZWNlbnQuCisKK0lmIHJlZ3Jlc3Npb25zIG9yIG90aGVyIHNlcmlvdXMgZmxhd3MgYXJlIGZvdW5kIHRoZW4gYSAtc3RhYmxlIGZpeCBwYXRjaAord2lsbCBiZSByZWxlYXNlZCAoc2VlIGJlbG93KSBvbiB0b3Agb2YgdGhpcyBiYXNlLiBPbmNlIGEgbmV3IDIuNi54IGJhc2UKK2tlcm5lbCBpcyByZWxlYXNlZCwgYSBwYXRjaCBpcyBtYWRlIGF2YWlsYWJsZSB0aGF0IGlzIGEgZGVsdGEgYmV0d2VlbiB0aGUKK3ByZXZpb3VzIDIuNi54IGtlcm5lbCBhbmQgdGhlIG5ldyBvbmUuCisKK1RvIGFwcGx5IGEgcGF0Y2ggbW92aW5nIGZyb20gMi42LjExIHRvIDIuNi4xMiB5b3UnZCBkbyB0aGUgZm9sbG93aW5nIChub3RlCit0aGF0IHN1Y2ggcGF0Y2hlcyBkbyAqTk9UKiBhcHBseSBvbiB0b3Agb2YgMi42LngueSBrZXJuZWxzIGJ1dCBvbiB0b3Agb2YgdGhlCitiYXNlIDIuNi54IGtlcm5lbCAtIGlmIHlvdSBuZWVkIHRvIG1vdmUgZnJvbSAyLjYueC55IHRvIDIuNi54KzEgeW91IG5lZWQgdG8KK2ZpcnN0IHJldmVydCB0aGUgMi42LngueSBwYXRjaCkuCisKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisKKyMgbW92aW5nIGZyb20gMi42LjExIHRvIDIuNi4xMgorJCBjZCB+L2xpbnV4LTIuNi4xMQkJCSMgY2hhbmdlIHRvIGtlcm5lbCBzb3VyY2UgZGlyCiskIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMgkJIyBhcHBseSB0aGUgMi42LjEyIHBhdGNoCiskIGNkIC4uCiskIG12IGxpbnV4LTIuNi4xMSBsaW51eC0yLjYuMTIJCSMgcmVuYW1lIHNvdXJjZSBkaXIKKworIyBtb3ZpbmcgZnJvbSAyLjYuMTEuMSB0byAyLjYuMTIKKyQgY2Qgfi9saW51eC0yLjYuMTEuMQkJCSMgY2hhbmdlIHRvIGtlcm5lbCBzb3VyY2UgZGlyCiskIHBhdGNoIC1wMSAtUiA8IC4uL3BhdGNoLTIuNi4xMS4xCSMgcmV2ZXJ0IHRoZSAyLjYuMTEuMSBwYXRjaAorCQkJCQkjIHNvdXJjZSBkaXIgaXMgbm93IDIuNi4xMQorJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTIJCSMgYXBwbHkgbmV3IDIuNi4xMiBwYXRjaAorJCBjZCAuLgorJCBtdiBsaW51eC0yLjYuMTEuMSBpbnV4LTIuNi4xMgkJIyByZW5hbWUgc291cmNlIGRpcgorCisKK1RoZSAyLjYueC55IGtlcm5lbHMKKy0tLQorIEtlcm5lbHMgd2l0aCA0IGRpZ2l0IHZlcnNpb25zIGFyZSAtc3RhYmxlIGtlcm5lbHMuIFRoZXkgY29udGFpbiBzbWFsbChpc2gpCitjcml0aWNhbCBmaXhlcyBmb3Igc2VjdXJpdHkgcHJvYmxlbXMgb3Igc2lnbmlmaWNhbnQgcmVncmVzc2lvbnMgZGlzY292ZXJlZAoraW4gYSBnaXZlbiAyLjYueCBrZXJuZWwuCisKK1RoaXMgaXMgdGhlIHJlY29tbWVuZGVkIGJyYW5jaCBmb3IgdXNlcnMgd2hvIHdhbnQgdGhlIG1vc3QgcmVjZW50IHN0YWJsZQora2VybmVsIGFuZCBhcmUgbm90IGludGVyZXN0ZWQgaW4gaGVscGluZyB0ZXN0IGRldmVsb3BtZW50L2V4cGVyaW1lbnRhbAordmVyc2lvbnMuCisKK0lmIG5vIDIuNi54Lnkga2VybmVsIGlzIGF2YWlsYWJsZSwgdGhlbiB0aGUgaGlnaGVzdCBudW1iZXJlZCAyLjYueCBrZXJuZWwgaXMKK3RoZSBjdXJyZW50IHN0YWJsZSBrZXJuZWwuCisKK1RoZXNlIHBhdGNoZXMgYXJlIG5vdCBpbmNyZW1lbnRhbCwgbWVhbmluZyB0aGF0IGZvciBleGFtcGxlIHRoZSAyLjYuMTIuMworcGF0Y2ggZG9lcyBub3QgYXBwbHkgb24gdG9wIG9mIHRoZSAyLjYuMTIuMiBrZXJuZWwgc291cmNlLCBidXQgcmF0aGVyIG9uIHRvcAorb2YgdGhlIGJhc2UgMi42LjEyIGtlcm5lbCBzb3VyY2UuCitTbywgaW4gb3JkZXIgdG8gYXBwbHkgdGhlIDIuNi4xMi4zIHBhdGNoIHRvIHlvdXIgZXhpc3RpbmcgMi42LjEyLjIga2VybmVsCitzb3VyY2UgeW91IGhhdmUgdG8gZmlyc3QgYmFjayBvdXQgdGhlIDIuNi4xMi4yIHBhdGNoIChzbyB5b3UgYXJlIGxlZnQgd2l0aCBhCitiYXNlIDIuNi4xMiBrZXJuZWwgc291cmNlKSBhbmQgdGhlbiBhcHBseSB0aGUgbmV3IDIuNi4xMi4zIHBhdGNoLgorCitIZXJlJ3MgYSBzbWFsbCBleGFtcGxlOgorCiskIGNkIH4vbGludXgtMi42LjEyLjIJCQkjIGNoYW5nZSBpbnRvIHRoZSBrZXJuZWwgc291cmNlIGRpcgorJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC0yLjYuMTIuMgkjIHJldmVydCB0aGUgMi42LjEyLjIgcGF0Y2gKKyQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEyLjMJCSMgYXBwbHkgdGhlIG5ldyAyLjYuMTIuMyBwYXRjaAorJCBjZCAuLgorJCBtdiBsaW51eC0yLjYuMTIuMiBsaW51eC0yLjYuMTIuMwkjIHJlbmFtZSB0aGUga2VybmVsIHNvdXJjZSBkaXIKKworCitUaGUgLXJjIGtlcm5lbHMKKy0tLQorIFRoZXNlIGFyZSByZWxlYXNlLWNhbmRpZGF0ZSBrZXJuZWxzLiBUaGVzZSBhcmUgZGV2ZWxvcG1lbnQga2VybmVscyByZWxlYXNlZAorYnkgTGludXMgd2hlbmV2ZXIgaGUgZGVlbXMgdGhlIGN1cnJlbnQgZ2l0ICh0aGUga2VybmVsJ3Mgc291cmNlIG1hbmFnZW1lbnQKK3Rvb2wpIHRyZWUgdG8gYmUgaW4gYSByZWFzb25hYmx5IHNhbmUgc3RhdGUgYWRlcXVhdGUgZm9yIHRlc3RpbmcuCisKK1RoZXNlIGtlcm5lbHMgYXJlIG5vdCBzdGFibGUgYW5kIHlvdSBzaG91bGQgZXhwZWN0IG9jY2FzaW9uYWwgYnJlYWthZ2UgaWYKK3lvdSBpbnRlbmQgdG8gcnVuIHRoZW0uIFRoaXMgaXMgaG93ZXZlciB0aGUgbW9zdCBzdGFibGUgb2YgdGhlIG1haW4KK2RldmVsb3BtZW50IGJyYW5jaGVzIGFuZCBpcyBhbHNvIHdoYXQgd2lsbCBldmVudHVhbGx5IHR1cm4gaW50byB0aGUgbmV4dAorc3RhYmxlIGtlcm5lbCwgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgaXQgYmUgdGVzdGVkIGJ5IGFzIG1hbnkgcGVvcGxlIGFzCitwb3NzaWJsZS4KKworVGhpcyBpcyBhIGdvb2QgYnJhbmNoIHRvIHJ1biBmb3IgcGVvcGxlIHdobyB3YW50IHRvIGhlbHAgb3V0IHRlc3RpbmcKK2RldmVsb3BtZW50IGtlcm5lbHMgYnV0IGRvIG5vdCB3YW50IHRvIHJ1biBzb21lIG9mIHRoZSByZWFsbHkgZXhwZXJpbWVudGFsCitzdHVmZiAoc3VjaCBwZW9wbGUgc2hvdWxkIHNlZSB0aGUgc2VjdGlvbnMgYWJvdXQgLWdpdCBhbmQgLW1tIGtlcm5lbHMgYmVsb3cpLgorCitUaGUgLXJjIHBhdGNoZXMgYXJlIG5vdCBpbmNyZW1lbnRhbCwgdGhleSBhcHBseSB0byBhIGJhc2UgMi42Lngga2VybmVsLCBqdXN0CitsaWtlIHRoZSAyLjYueC55IHBhdGNoZXMgZGVzY3JpYmVkIGFib3ZlLiBUaGUga2VybmVsIHZlcnNpb24gYmVmb3JlIHRoZSAtcmNOCitzdWZmaXggZGVub3RlcyB0aGUgdmVyc2lvbiBvZiB0aGUga2VybmVsIHRoYXQgdGhpcyAtcmMga2VybmVsIHdpbGwgZXZlbnR1YWxseQordHVybiBpbnRvLgorU28sIDIuNi4xMy1yYzUgbWVhbnMgdGhhdCB0aGlzIGlzIHRoZSBmaWZ0aCByZWxlYXNlIGNhbmRpZGF0ZSBmb3IgdGhlIDIuNi4xMwora2VybmVsIGFuZCB0aGUgcGF0Y2ggc2hvdWxkIGJlIGFwcGxpZWQgb24gdG9wIG9mIHRoZSAyLjYuMTIga2VybmVsIHNvdXJjZS4KKworSGVyZSBhcmUgMyBleGFtcGxlcyBvZiBob3cgdG8gYXBwbHkgdGhlc2UgcGF0Y2hlczoKKworIyBmaXJzdCBhbiBleGFtcGxlIG9mIG1vdmluZyBmcm9tIDIuNi4xMiB0byAyLjYuMTMtcmMzCiskIGNkIH4vbGludXgtMi42LjEyCQkJIyBjaGFuZ2UgaW50byB0aGUgMi42LjEyIHNvdXJjZSBkaXIKKyQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEzLXJjMwkjIGFwcGx5IHRoZSAyLjYuMTMtcmMzIHBhdGNoCiskIGNkIC4uCiskIG12IGxpbnV4LTIuNi4xMiBsaW51eC0yLjYuMTMtcmMzCSMgcmVuYW1lIHRoZSBzb3VyY2UgZGlyCisKKyMgbm93IGxldCdzIG1vdmUgZnJvbSAyLjYuMTMtcmMzIHRvIDIuNi4xMy1yYzUKKyQgY2Qgfi9saW51eC0yLjYuMTMtcmMzCQkJIyBjaGFuZ2UgaW50byB0aGUgMi42LjEzLXJjMyBkaXIKKyQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtMi42LjEzLXJjMwkjIHJldmVydCB0aGUgMi42LjEzLXJjMyBwYXRjaAorJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTMtcmM1CSMgYXBwbHkgdGhlIG5ldyAyLjYuMTMtcmM1IHBhdGNoCiskIGNkIC4uCiskIG12IGxpbnV4LTIuNi4xMy1yYzMgbGludXgtMi42LjEzLXJjNQkjIHJlbmFtZSB0aGUgc291cmNlIGRpcgorCisjIGZpbmFsbHkgbGV0J3MgdHJ5IGFuZCBtb3ZlIGZyb20gMi42LjEyLjMgdG8gMi42LjEzLXJjNQorJCBjZCB+L2xpbnV4LTIuNi4xMi4zCQkJIyBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBzb3VyY2UgZGlyCiskIHBhdGNoIC1wMSAtUiA8IC4uL3BhdGNoLTIuNi4xMi4zCSMgcmV2ZXJ0IHRoZSAyLjYuMTIuMyBwYXRjaAorJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTMtcmM1CSMgYXBwbHkgbmV3IDIuNi4xMy1yYzUgcGF0Y2gKKyQgY2QgLi4KKyQgbXYgbGludXgtMi42LjEyLjMgbGludXgtMi42LjEzLXJjNQkjIHJlbmFtZSB0aGUga2VybmVsIHNvdXJjZSBkaXIKKworCitUaGUgLWdpdCBrZXJuZWxzCistLS0KKyBUaGVzZSBhcmUgZGFpbHkgc25hcHNob3RzIG9mIExpbnVzJyBrZXJuZWwgdHJlZSAobWFuYWdlZCBpbiBhIGdpdAorcmVwb3NpdG9yeSwgaGVuY2UgdGhlIG5hbWUpLgorCitUaGVzZSBwYXRjaGVzIGFyZSB1c3VhbGx5IHJlbGVhc2VkIGRhaWx5IGFuZCByZXByZXNlbnQgdGhlIGN1cnJlbnQgc3RhdGUgb2YKK0xpbnVzJyB0cmVlLiBUaGV5IGFyZSBtb3JlIGV4cGVyaW1lbnRhbCB0aGFuIC1yYyBrZXJuZWxzIHNpbmNlIHRoZXkgYXJlCitnZW5lcmF0ZWQgYXV0b21hdGljYWxseSB3aXRob3V0IGV2ZW4gYSBjdXJzb3J5IGdsYW5jZSB0byBzZWUgaWYgdGhleSBhcmUKK3NhbmUuCisKKy1naXQgcGF0Y2hlcyBhcmUgbm90IGluY3JlbWVudGFsIGFuZCBhcHBseSBlaXRoZXIgdG8gYSBiYXNlIDIuNi54IGtlcm5lbCBvcgorYSBiYXNlIDIuNi54LXJjIGtlcm5lbCAtIHlvdSBjYW4gc2VlIHdoaWNoIGZyb20gdGhlaXIgbmFtZS4KK0EgcGF0Y2ggbmFtZWQgMi42LjEyLWdpdDEgYXBwbGllcyB0byB0aGUgMi42LjEyIGtlcm5lbCBzb3VyY2UgYW5kIGEgcGF0Y2gKK25hbWVkIDIuNi4xMy1yYzMtZ2l0MiBhcHBsaWVzIHRvIHRoZSBzb3VyY2Ugb2YgdGhlIDIuNi4xMy1yYzMga2VybmVsLgorCitIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byBhcHBseSB0aGVzZSBwYXRjaGVzOgorCisjIG1vdmluZyBmcm9tIDIuNi4xMiB0byAyLjYuMTItZ2l0MQorJCBjZCB+L2xpbnV4LTIuNi4xMgkJCSMgY2hhbmdlIHRvIHRoZSBrZXJuZWwgc291cmNlIGRpcgorJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTItZ2l0MQkjIGFwcGx5IHRoZSAyLjYuMTItZ2l0MSBwYXRjaAorJCBjZCAuLgorJCBtdiBsaW51eC0yLjYuMTIgbGludXgtMi42LjEyLWdpdDEJIyByZW5hbWUgdGhlIGtlcm5lbCBzb3VyY2UgZGlyCisKKyMgbW92aW5nIGZyb20gMi42LjEyLWdpdDEgdG8gMi42LjEzLXJjMi1naXQzCiskIGNkIH4vbGludXgtMi42LjEyLWdpdDEJCSMgY2hhbmdlIHRvIHRoZSBrZXJuZWwgc291cmNlIGRpcgorJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC0yLjYuMTItZ2l0MQkjIHJldmVydCB0aGUgMi42LjEyLWdpdDEgcGF0Y2gKKwkJCQkJIyB3ZSBub3cgaGF2ZSBhIDIuNi4xMiBrZXJuZWwKKyQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEzLXJjMgkjIGFwcGx5IHRoZSAyLjYuMTMtcmMyIHBhdGNoCisJCQkJCSMgdGhlIGtlcm5lbCBpcyBub3cgMi42LjEzLXJjMgorJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTMtcmMyLWdpdDMJIyBhcHBseSB0aGUgMi42LjEzLXJjMi1naXQzIHBhdGNoCisJCQkJCSMgdGhlIGtlcm5lbCBpcyBub3cgMi42LjEzLXJjMi1naXQzCiskIGNkIC4uCiskIG12IGxpbnV4LTIuNi4xMi1naXQxIGxpbnV4LTIuNi4xMy1yYzItZ2l0MwkjIHJlbmFtZSBzb3VyY2UgZGlyCisKKworVGhlIC1tbSBrZXJuZWxzCistLS0KKyBUaGVzZSBhcmUgZXhwZXJpbWVudGFsIGtlcm5lbHMgcmVsZWFzZWQgYnkgQW5kcmV3IE1vcnRvbi4KKworVGhlIC1tbSB0cmVlIHNlcnZlcyBhcyBhIHNvcnQgb2YgcHJvdmluZyBncm91bmQgZm9yIG5ldyBmZWF0dXJlcyBhbmQgb3RoZXIKK2V4cGVyaW1lbnRhbCBwYXRjaGVzLgorT25jZSBhIHBhdGNoIGhhcyBwcm92ZWQgaXRzIHdvcnRoIGluIC1tbSBmb3IgYSB3aGlsZSBBbmRyZXcgcHVzaGVzIGl0IG9uIHRvCitMaW51cyBmb3IgaW5jbHVzaW9uIGluIG1haW5saW5lLgorCitBbHRob3VnaCBpdCdzIGVuY291cmFnZWQgdGhhdCBwYXRjaGVzIGZsb3cgdG8gTGludXMgdmlhIHRoZSAtbW0gdHJlZSwgdGhpcworaXMgbm90IGFsd2F5cyBlbmZvcmNlZC4KK1N1YnN5c3RlbSBtYWludGFpbmVycyAob3IgaW5kaXZpZHVhbHMpIHNvbWV0aW1lcyBwdXNoIHRoZWlyIHBhdGNoZXMgZGlyZWN0bHkKK3RvIExpbnVzLCBldmVuIHRob3VnaCAob3IgYWZ0ZXIpIHRoZXkgaGF2ZSBiZWVuIG1lcmdlZCBhbmQgdGVzdGVkIGluIC1tbSAob3IKK3NvbWV0aW1lcyBldmVuIHdpdGhvdXQgcHJpb3IgdGVzdGluZyBpbiAtbW0pLgorCitZb3Ugc2hvdWxkIGdlbmVyYWxseSBzdHJpdmUgdG8gZ2V0IHlvdXIgcGF0Y2hlcyBpbnRvIG1haW5saW5lIHZpYSAtbW0gdG8KK2Vuc3VyZSBtYXhpbXVtIHRlc3RpbmcuCisKK1RoaXMgYnJhbmNoIGlzIGluIGNvbnN0YW50IGZsdXggYW5kIGNvbnRhaW5zIG1hbnkgZXhwZXJpbWVudGFsIGZlYXR1cmVzLCBhCitsb3Qgb2YgZGVidWdnaW5nIHBhdGNoZXMgbm90IGFwcHJvcHJpYXRlIGZvciBtYWlubGluZSBldGMgYW5kIGlzIHRoZSBtb3N0CitleHBlcmltZW50YWwgb2YgdGhlIGJyYW5jaGVzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LgorCitUaGVzZSBrZXJuZWxzIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIHVzZSBvbiBzeXN0ZW1zIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlCitzdGFibGUgYW5kIHRoZXkgYXJlIG1vcmUgcmlza3kgdG8gcnVuIHRoYW4gYW55IG9mIHRoZSBvdGhlciBicmFuY2hlcyAobWFrZQorc3VyZSB5b3UgaGF2ZSB1cC10by1kYXRlIGJhY2t1cHMgLSB0aGF0IGdvZXMgZm9yIGFueSBleHBlcmltZW50YWwga2VybmVsIGJ1dAorZXZlbiBtb3JlIHNvIGZvciAtbW0ga2VybmVscykuCisKK1RoZXNlIGtlcm5lbHMgaW4gYWRkaXRpb24gdG8gYWxsIHRoZSBvdGhlciBleHBlcmltZW50YWwgcGF0Y2hlcyB0aGV5IGNvbnRhaW4KK3VzdWFsbHkgYWxzbyBjb250YWluIGFueSBjaGFuZ2VzIGluIHRoZSBtYWlubGluZSAtZ2l0IGtlcm5lbHMgYXZhaWxhYmxlIGF0Cit0aGUgdGltZSBvZiByZWxlYXNlLgorCitUZXN0aW5nIG9mIC1tbSBrZXJuZWxzIGlzIGdyZWF0bHkgYXBwcmVjaWF0ZWQgc2luY2UgdGhlIHdob2xlIHBvaW50IG9mIHRoZQordHJlZSBpcyB0byB3ZWVkIG91dCByZWdyZXNzaW9ucywgY3Jhc2hlcywgZGF0YSBjb3JydXB0aW9uIGJ1Z3MsIGJ1aWxkCiticmVha2FnZSAoYW5kIGFueSBvdGhlciBidWcgaW4gZ2VuZXJhbCkgYmVmb3JlIGNoYW5nZXMgYXJlIG1lcmdlZCBpbnRvIHRoZQorbW9yZSBzdGFibGUgbWFpbmxpbmUgTGludXMgdHJlZS4KK0J1dCB0ZXN0ZXJzIG9mIC1tbSBzaG91bGQgYmUgYXdhcmUgdGhhdCBicmVha2FnZSBpbiB0aGlzIHRyZWUgaXMgbW9yZSBjb21tb24KK3RoYW4gaW4gYW55IG90aGVyIHRyZWUuCisKK1RoZSAtbW0ga2VybmVscyBhcmUgbm90IHJlbGVhc2VkIG9uIGEgZml4ZWQgc2NoZWR1bGUsIGJ1dCB1c3VhbGx5IGEgZmV3IC1tbQora2VybmVscyBhcmUgcmVsZWFzZWQgaW4gYmV0d2VlbiBlYWNoIC1yYyBrZXJuZWwgKDEgdG8gMyBpcyBjb21tb24pLgorVGhlIC1tbSBrZXJuZWxzIGFwcGx5IHRvIGVpdGhlciBhIGJhc2UgMi42Lngga2VybmVsICh3aGVuIG5vIC1yYyBrZXJuZWxzCitoYXZlIGJlZW4gcmVsZWFzZWQgeWV0KSBvciB0byBhIExpbnVzIC1yYyBrZXJuZWwuCisKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgYXBwbHlpbmcgdGhlIC1tbSBwYXRjaGVzOgorCisjIG1vdmluZyBmcm9tIDIuNi4xMiB0byAyLjYuMTItbW0xCiskIGNkIH4vbGludXgtMi42LjEyCQkJIyBjaGFuZ2UgdG8gdGhlIDIuNi4xMiBzb3VyY2UgZGlyCiskIHBhdGNoIC1wMSA8IC4uLzIuNi4xMi1tbTEJCSMgYXBwbHkgdGhlIDIuNi4xMi1tbTEgcGF0Y2gKKyQgY2QgLi4KKyQgbXYgbGludXgtMi42LjEyIGxpbnV4LTIuNi4xMi1tbTEJIyByZW5hbWUgdGhlIHNvdXJjZSBhcHByb3ByaWF0ZWx5CisKKyMgbW92aW5nIGZyb20gMi42LjEyLW1tMSB0byAyLjYuMTMtcmMzLW1tMworJCBjZCB+L2xpbnV4LTIuNi4xMi1tbTEKKyQgcGF0Y2ggLXAxIC1SIDwgLi4vMi42LjEyLW1tMQkJIyByZXZlcnQgdGhlIDIuNi4xMi1tbTEgcGF0Y2gKKwkJCQkJIyB3ZSBub3cgaGF2ZSBhIDIuNi4xMiBzb3VyY2UKKyQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEzLXJjMwkjIGFwcGx5IHRoZSAyLjYuMTMtcmMzIHBhdGNoCisJCQkJCSMgd2Ugbm93IGhhdmUgYSAyLjYuMTMtcmMzIHNvdXJjZQorJCBwYXRjaCAtcDEgPCAuLi8yLjYuMTMtcmMzLW1tMwkJIyBhcHBseSB0aGUgMi42LjEzLXJjMy1tbTMgcGF0Y2gKKyQgY2QgLi4KKyQgbXYgbGludXgtMi42LjEyLW1tMSBsaW51eC0yLjYuMTMtcmMzLW1tMwkjIHJlbmFtZSB0aGUgc291cmNlIGRpcgorCisKK1RoaXMgY29uY2x1ZGVzIHRoaXMgbGlzdCBvZiBleHBsYW5hdGlvbnMgb2YgdGhlIHZhcmlvdXMga2VybmVsIHRyZWVzIGFuZCBJCitob3BlIHlvdSBhcmUgbm93IGNyeXN0YWwgY2xlYXIgb24gaG93IHRvIGFwcGx5IHRoZSB2YXJpb3VzIHBhdGNoZXMgYW5kIGhlbHAKK3Rlc3RpbmcgdGhlIGtlcm5lbC4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9zb255Y2Q1MzUgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQppbmRleCA1OTU4MWE0Li5iODFlMTA5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQorKysgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQpAQCAtNjgsNyArNjgsOCBAQAogUG9yZmlyaSBDbGF1ZGlvIDxDLlBvcmZpcmlAbmlzbXMudGVpLmVyaWNzc29uLnNlPiBmb3IgcGF0Y2hlcwogdG8gbWFrZSB0aGUgZHJpdmVyIHdvcmsgd2l0aCB0aGUgb2xkZXIgQ0RVLTUxMC81MTUgc2VyaWVzLCBhbmQKIEhlaWtvIEVpc3NmZWxkdCA8aGVpa29AY29sb3NzdXMuZXNjYXBlLmRlPiBmb3IgcG9pbnRpbmcgb3V0IHRoYXQKLXRoZSB2ZXJpZnlfYXJlYSgpIGNoZWNrcyB3ZXJlIGlnbm9yaW5nIHRoZSByZXN1bHRzIG9mIHNhaWQgY2hlY2tzLgordGhlIHZlcmlmeV9hcmVhKCkgY2hlY2tzIHdlcmUgaWdub3JpbmcgdGhlIHJlc3VsdHMgb2Ygc2FpZCBjaGVja3MKKyhub3RlOiB2ZXJpZnlfYXJlYSgpIGhhcyBzaW5jZSBiZWVuIHJlcGxhY2VkIGJ5IGFjY2Vzc19vaygpKS4KIAogKEFja25vd2xlZGdtZW50cyBmcm9tIFJvbiBKZXBwZXNlbiBpbiB0aGUgMC4zIHJlbGVhc2U6KQogVGhhbmtzIHRvIENvcmV5IE1pbnlhcmQgd2hvIHdyb3RlIHRoZSBvcmlnaW5hbCBDRFUtMzFBIGRyaXZlciBvbiB3aGljaApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHVmcmVxLXN0YXRzLnR4dCBiL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvY3B1ZnJlcS1zdGF0cy50eHQKaW5kZXggZTJkMWU3Ni4uNmE4Mjk0OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHVmcmVxLXN0YXRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdWZyZXEtc3RhdHMudHh0CkBAIC0zNiw3ICszNiw3IEBACiAKIEFsbCB0aGUgc3RhdGlzdGljcyB3aWxsIGJlIGZyb20gdGhlIHRpbWUgdGhlIHN0YXRzIGRyaXZlciBoYXMgYmVlbiBpbnNlcnRlZCAKIHRvIHRoZSB0aW1lIHdoZW4gYSByZWFkIG9mIGEgcGFydGljdWxhciBzdGF0aXN0aWMgaXMgZG9uZS4gT2J2aW91c2x5LCBzdGF0cyAKLWRyaXZlciB3aWxsIG5vdCBoYXZlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGhlIGZyZXF1Y255IHRyYW5zaXRpb25zIGJlZm9yZQorZHJpdmVyIHdpbGwgbm90IGhhdmUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcmVxdWVuY3kgdHJhbnNpdGlvbnMgYmVmb3JlCiB0aGUgc3RhdHMgZHJpdmVyIGluc2VydGlvbi4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdXNldHMudHh0CmluZGV4IGFkOTQ0YzAuLmQxN2I3ZDIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHVzZXRzLnR4dApAQCAtNjAsNiArNjAsMTggQEAKIGxvYWQgYmFsYW5jaW5nIGNvZGUgdHJ5aW5nIHRvIHB1bGwgdGFza3Mgb3V0c2lkZSBvZiB0aGUgY3B1IGV4Y2x1c2l2ZQogY3B1c2V0IG9ubHkgdG8gYmUgcHJldmVudGVkIGJ5IHRoZSB0YXNrcycgY3B1c19hbGxvd2VkIG1hc2suCiAKK0EgY3B1c2V0IHRoYXQgaXMgbWVtX2V4Y2x1c2l2ZSByZXN0cmljdHMga2VybmVsIGFsbG9jYXRpb25zIGZvcgorcGFnZSwgYnVmZmVyIGFuZCBvdGhlciBkYXRhIGNvbW1vbmx5IHNoYXJlZCBieSB0aGUga2VybmVsIGFjcm9zcworbXVsdGlwbGUgdXNlcnMuICBBbGwgY3B1c2V0cywgd2hldGhlciBtZW1fZXhjbHVzaXZlIG9yIG5vdCwgcmVzdHJpY3QKK2FsbG9jYXRpb25zIG9mIG1lbW9yeSBmb3IgdXNlciBzcGFjZS4gIFRoaXMgZW5hYmxlcyBjb25maWd1cmluZyBhCitzeXN0ZW0gc28gdGhhdCBzZXZlcmFsIGluZGVwZW5kZW50IGpvYnMgY2FuIHNoYXJlIGNvbW1vbiBrZXJuZWwKK2RhdGEsIHN1Y2ggYXMgZmlsZSBzeXN0ZW0gcGFnZXMsIHdoaWxlIGlzb2xhdGluZyBlYWNoIGpvYnMgdXNlcgorYWxsb2NhdGlvbiBpbiBpdHMgb3duIGNwdXNldC4gIFRvIGRvIHRoaXMsIGNvbnN0cnVjdCBhIGxhcmdlCittZW1fZXhjbHVzaXZlIGNwdXNldCB0byBob2xkIGFsbCB0aGUgam9icywgYW5kIGNvbnN0cnVjdCBjaGlsZCwKK25vbi1tZW1fZXhjbHVzaXZlIGNwdXNldHMgZm9yIGVhY2ggaW5kaXZpZHVhbCBqb2IuICBPbmx5IGEgc21hbGwKK2Ftb3VudCBvZiB0eXBpY2FsIGtlcm5lbCBtZW1vcnksIHN1Y2ggYXMgcmVxdWVzdHMgZnJvbSBpbnRlcnJ1cHQKK2hhbmRsZXJzLCBpcyBhbGxvd2VkIHRvIGJlIHRha2VuIG91dHNpZGUgZXZlbiBhIG1lbV9leGNsdXNpdmUgY3B1c2V0LgorCiBVc2VyIGxldmVsIGNvZGUgbWF5IGNyZWF0ZSBhbmQgZGVzdHJveSBjcHVzZXRzIGJ5IG5hbWUgaW4gdGhlIGNwdXNldAogdmlydHVhbCBmaWxlIHN5c3RlbSwgbWFuYWdlIHRoZSBhdHRyaWJ1dGVzIGFuZCBwZXJtaXNzaW9ucyBvZiB0aGVzZQogY3B1c2V0cyBhbmQgd2hpY2ggQ1BVcyBhbmQgTWVtb3J5IE5vZGVzIGFyZSBhc3NpZ25lZCB0byBlYWNoIGNwdXNldCwKQEAgLTI2NSw3ICsyNzcsNyBAQAogaW1wYWN0aW5nIHRoZSBzY2hlZHVsZXIgY29kZSBpbiB0aGUga2VybmVsIHdpdGggYSBjaGVjayBmb3IgY2hhbmdlcwogaW4gYSB0YXNrcyBwcm9jZXNzb3IgcGxhY2VtZW50LgogCi1UaGVyZSBpcyBhbiBleGNlcHRpb24gdG8gdGhlIGFib3ZlLiAgSWYgaG90cGx1ZyBmdW50aW9uYWxpdHkgaXMgdXNlZAorVGhlcmUgaXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBhYm92ZS4gIElmIGhvdHBsdWcgZnVuY3Rpb25hbGl0eSBpcyB1c2VkCiB0byByZW1vdmUgYWxsIHRoZSBDUFVzIHRoYXQgYXJlIGN1cnJlbnRseSBhc3NpZ25lZCB0byBhIGNwdXNldCwKIHRoZW4gdGhlIGtlcm5lbCB3aWxsIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSBjcHVzX2FsbG93ZWQgb2YgYWxsCiB0YXNrcyBhdHRhY2hlZCB0byBDUFVzIGluIHRoYXQgY3B1c2V0IHRvIGFsbG93IGFsbCBDUFVzLiAgV2hlbiBtZW1vcnkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3J5cHRvL2FwaS1pbnRyby50eHQgYi9Eb2N1bWVudGF0aW9uL2NyeXB0by9hcGktaW50cm8udHh0CmluZGV4IGEyZDViNDkuLjc0ZGZmYzYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3J5cHRvL2FwaS1pbnRyby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcnlwdG8vYXBpLWludHJvLnR4dApAQCAtMjIzLDYgKzIyMyw3IEBACiAKIFRFQS9YVEVBIGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgIEFhcm9uIEdyb3RoZQorICBNaWNoYWVsIFJpbmdlCiAKIEtoYXphZCBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogICBBYXJvbiBHcm90aGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3J5cHRvL2Rlc2NvcmUtcmVhZG1lLnR4dCBiL0RvY3VtZW50YXRpb24vY3J5cHRvL2Rlc2NvcmUtcmVhZG1lLnR4dAppbmRleCAxNjY0NzRjLi4xNmU5ZTYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NyeXB0by9kZXNjb3JlLXJlYWRtZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcnlwdG8vZGVzY29yZS1yZWFkbWUudHh0CkBAIC0xLDQgKzEsNCBAQAotQmVsb3cgaXMgdGhlIG9yZ2luYWwgUkVBRE1FIGZpbGUgZnJvbSB0aGUgZGVzY29yZS5zaGFyIHBhY2thZ2UuCitCZWxvdyBpcyB0aGUgb3JpZ2luYWwgUkVBRE1FIGZpbGUgZnJvbSB0aGUgZGVzY29yZS5zaGFyIHBhY2thZ2UuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogZGVzIC0gZmFzdCAmIHBvcnRhYmxlIERFUyBlbmNyeXB0aW9uICYgZGVjcnlwdGlvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGNkYmFzLnR4dCBiL0RvY3VtZW50YXRpb24vZGNkYmFzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWM1MmUyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kY2RiYXMudHh0CkBAIC0wLDAgKzEsOTEgQEAKK092ZXJ2aWV3CisKK1RoZSBEZWxsIFN5c3RlbXMgTWFuYWdlbWVudCBCYXNlIERyaXZlciBwcm92aWRlcyBhIHN5c2ZzIGludGVyZmFjZSBmb3IKK3N5c3RlbXMgbWFuYWdlbWVudCBzb2Z0d2FyZSBzdWNoIGFzIERlbGwgT3Blbk1hbmFnZSB0byBwZXJmb3JtIHN5c3RlbQorbWFuYWdlbWVudCBpbnRlcnJ1cHRzIGFuZCBob3N0IGNvbnRyb2wgYWN0aW9ucyAoc3lzdGVtIHBvd2VyIGN5Y2xlIG9yCitwb3dlciBvZmYgYWZ0ZXIgT1Mgc2h1dGRvd24pIG9uIGNlcnRhaW4gRGVsbCBzeXN0ZW1zLgorCitEZWxsIE9wZW5NYW5hZ2UgcmVxdWlyZXMgdGhpcyBkcml2ZXIgb24gdGhlIGZvbGxvd2luZyBEZWxsIFBvd2VyRWRnZSBzeXN0ZW1zOgorMzAwLCAxMzAwLCAxNDAwLCA0MDBTQywgNTAwU0MsIDE1MDBTQywgMTU1MCwgNjAwU0MsIDE2MDBTQywgNjUwLCAxNjU1TUMsCis3MDAsIGFuZCA3NTAuICBPdGhlciBEZWxsIHNvZnR3YXJlIHN1Y2ggYXMgdGhlIG9wZW4gc291cmNlIGxpYnNtYmlvcyBwcm9qZWN0CitpcyBleHBlY3RlZCB0byBtYWtlIHVzZSBvZiB0aGlzIGRyaXZlciwgYW5kIGl0IG1heSBpbmNsdWRlIHRoZSB1c2Ugb2YgdGhpcworZHJpdmVyIG9uIG90aGVyIERlbGwgc3lzdGVtcy4KKworVGhlIERlbGwgbGlic21iaW9zIHByb2plY3QgYWltcyB0b3dhcmRzIHByb3ZpZGluZyBhY2Nlc3MgdG8gYXMgbXVjaCBCSU9TCitpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZS4gIFNlZSBodHRwOi8vbGludXguZGVsbC5jb20vbGlic21iaW9zL21haW4vIGZvcgorbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGlic21iaW9zIHByb2plY3QuCisKKworU3lzdGVtIE1hbmFnZW1lbnQgSW50ZXJydXB0CisKK09uIHNvbWUgRGVsbCBzeXN0ZW1zLCBzeXN0ZW1zIG1hbmFnZW1lbnQgc29mdHdhcmUgbXVzdCBhY2Nlc3MgY2VydGFpbgorbWFuYWdlbWVudCBpbmZvcm1hdGlvbiB2aWEgYSBzeXN0ZW0gbWFuYWdlbWVudCBpbnRlcnJ1cHQgKFNNSSkuICBUaGUgU01JIGRhdGEKK2J1ZmZlciBtdXN0IHJlc2lkZSBpbiAzMi1iaXQgYWRkcmVzcyBzcGFjZSwgYW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZQorYnVmZmVyIGlzIHJlcXVpcmVkIGZvciB0aGUgU01JLiAgVGhlIGRyaXZlciBtYWludGFpbnMgdGhlIG1lbW9yeSByZXF1aXJlZCBmb3IKK3RoZSBTTUkgYW5kIHByb3ZpZGVzIGEgd2F5IGZvciB0aGUgYXBwbGljYXRpb24gdG8gZ2VuZXJhdGUgdGhlIFNNSS4KK1RoZSBkcml2ZXIgY3JlYXRlcyB0aGUgZm9sbG93aW5nIHN5c2ZzIGVudHJpZXMgZm9yIHN5c3RlbXMgbWFuYWdlbWVudAorc29mdHdhcmUgdG8gcGVyZm9ybSB0aGVzZSBzeXN0ZW0gbWFuYWdlbWVudCBpbnRlcnJ1cHRzOgorCisvc3lzL2RldmljZXMvcGxhdGZvcm0vZGNkYmFzL3NtaV9kYXRhCisvc3lzL2RldmljZXMvcGxhdGZvcm0vZGNkYmFzL3NtaV9kYXRhX2J1Zl9waHlzX2FkZHIKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9kY2RiYXMvc21pX2RhdGFfYnVmX3NpemUKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9kY2RiYXMvc21pX3JlcXVlc3QKKworU3lzdGVtcyBtYW5hZ2VtZW50IHNvZnR3YXJlIG11c3QgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGV4ZWN1dGUKK2EgU01JIHVzaW5nIHRoaXMgZHJpdmVyOgorCisxKSBMb2NrIHNtaV9kYXRhLgorMikgV3JpdGUgc3lzdGVtIG1hbmFnZW1lbnQgY29tbWFuZCB0byBzbWlfZGF0YS4KKzMpIFdyaXRlICIxIiB0byBzbWlfcmVxdWVzdCB0byBnZW5lcmF0ZSBhIGNhbGxpbmcgaW50ZXJmYWNlIFNNSSBvcgorICAgIjIiIHRvIGdlbmVyYXRlIGEgcmF3IFNNSS4KKzQpIFJlYWQgc3lzdGVtIG1hbmFnZW1lbnQgY29tbWFuZCByZXNwb25zZSBmcm9tIHNtaV9kYXRhLgorNSkgVW5sb2NrIHNtaV9kYXRhLgorCisKK0hvc3QgQ29udHJvbCBBY3Rpb24KKworRGVsbCBPcGVuTWFuYWdlIHN1cHBvcnRzIGEgaG9zdCBjb250cm9sIGZlYXR1cmUgdGhhdCBhbGxvd3MgdGhlIGFkbWluaXN0cmF0b3IKK3RvIHBlcmZvcm0gYSBwb3dlciBjeWNsZSBvciBwb3dlciBvZmYgb2YgdGhlIHN5c3RlbSBhZnRlciB0aGUgT1MgaGFzIGZpbmlzaGVkCitzaHV0dGluZyBkb3duLiAgT24gc29tZSBEZWxsIHN5c3RlbXMsIHRoaXMgaG9zdCBjb250cm9sIGZlYXR1cmUgcmVxdWlyZXMgdGhhdAorYSBkcml2ZXIgcGVyZm9ybSBhIFNNSSBhZnRlciB0aGUgT1MgaGFzIGZpbmlzaGVkIHNodXR0aW5nIGRvd24uCisKK1RoZSBkcml2ZXIgY3JlYXRlcyB0aGUgZm9sbG93aW5nIHN5c2ZzIGVudHJpZXMgZm9yIHN5c3RlbXMgbWFuYWdlbWVudCBzb2Z0d2FyZQordG8gc2NoZWR1bGUgdGhlIGRyaXZlciB0byBwZXJmb3JtIGEgcG93ZXIgY3ljbGUgb3IgcG93ZXIgb2ZmIGhvc3QgY29udHJvbAorYWN0aW9uIGFmdGVyIHRoZSBzeXN0ZW0gaGFzIGZpbmlzaGVkIHNodXR0aW5nIGRvd246CisKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9kY2RiYXMvaG9zdF9jb250cm9sX2FjdGlvbgorL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2RjZGJhcy9ob3N0X2NvbnRyb2xfc21pX3R5cGUKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9kY2RiYXMvaG9zdF9jb250cm9sX29uX3NodXRkb3duCisKK0RlbGwgT3Blbk1hbmFnZSBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGV4ZWN1dGUgYSBwb3dlciBjeWNsZSBvcgorcG93ZXIgb2ZmIGhvc3QgY29udHJvbCBhY3Rpb24gdXNpbmcgdGhpcyBkcml2ZXI6CisKKzEpIFdyaXRlIGhvc3QgY29udHJvbCBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIHRvIGhvc3RfY29udHJvbF9hY3Rpb24uCisyKSBXcml0ZSB0eXBlIG9mIFNNSSB0aGF0IGRyaXZlciBuZWVkcyB0byBwZXJmb3JtIHRvIGhvc3RfY29udHJvbF9zbWlfdHlwZS4KKzMpIFdyaXRlICIxIiB0byBob3N0X2NvbnRyb2xfb25fc2h1dGRvd24gdG8gZW5hYmxlIGhvc3QgY29udHJvbCBhY3Rpb24uCis0KSBJbml0aWF0ZSBPUyBzaHV0ZG93bi4KKyAgIChEcml2ZXIgd2lsbCBwZXJmb3JtIGhvc3QgY29udHJvbCBTTUkgd2hlbiBpdCBpcyBub3RpZmllZCB0aGF0IHRoZSBPUworICAgaGFzIGZpbmlzaGVkIHNodXR0aW5nIGRvd24uKQorCisKK0hvc3QgQ29udHJvbCBTTUkgVHlwZQorCitUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSB2YWx1ZSB0byB3cml0ZSB0byBob3N0X2NvbnRyb2xfc21pX3R5cGUgdG8KK3BlcmZvcm0gYSBwb3dlciBjeWNsZSBvciBwb3dlciBvZmYgaG9zdCBjb250cm9sIGFjdGlvbjoKKworUG93ZXJFZGdlIFN5c3RlbSAgICBIb3N0IENvbnRyb2wgU01JIFR5cGUKKy0tLS0tLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAzMDAgICAgICAgICAgICAgSENfU01JVFlQRV9UWVBFMQorICAgICAxMzAwICAgICAgICAgICAgIEhDX1NNSVRZUEVfVFlQRTEKKyAgICAgMTQwMCAgICAgICAgICAgICBIQ19TTUlUWVBFX1RZUEUyCisgICAgICA1MDBTQyAgICAgICAgICAgSENfU01JVFlQRV9UWVBFMgorICAgICAxNTAwU0MgICAgICAgICAgIEhDX1NNSVRZUEVfVFlQRTIKKyAgICAgMTU1MCAgICAgICAgICAgICBIQ19TTUlUWVBFX1RZUEUyCisgICAgICA2MDBTQyAgICAgICAgICAgSENfU01JVFlQRV9UWVBFMgorICAgICAxNjAwU0MgICAgICAgICAgIEhDX1NNSVRZUEVfVFlQRTIKKyAgICAgIDY1MCAgICAgICAgICAgICBIQ19TTUlUWVBFX1RZUEUyCisgICAgIDE2NTVNQyAgICAgICAgICAgSENfU01JVFlQRV9UWVBFMgorICAgICAgNzAwICAgICAgICAgICAgIEhDX1NNSVRZUEVfVFlQRTMKKyAgICAgIDc1MCAgICAgICAgICAgICBIQ19TTUlUWVBFX1RZUEUzCisKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZWxsX3JidS50eHQgYi9Eb2N1bWVudGF0aW9uL2RlbGxfcmJ1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2ZhNWMzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZWxsX3JidS50eHQKQEAgLTAsMCArMSw3NCBAQAorUHVycG9zZToKK0RlbW9uc3RyYXRlIHRoZSB1c2FnZSBvZiB0aGUgbmV3IG9wZW4gc291cmNlZCByYnUgKFJlbW90ZSBCSU9TIFVwZGF0ZSkgZHJpdmVyCitmb3IgdXBkYXRpbmcgQklPUyBpbWFnZXMgb24gRGVsbCBzZXJ2ZXJzIGFuZCBkZXNrdG9wcy4KKworU2NvcGU6CitUaGlzIGRvY3VtZW50IGRpc2N1c3NlcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgcmJ1IGRyaXZlciBvbmx5LgorSXQgZG9lcyBub3QgY292ZXIgdGhlIHN1cHBvcnQgbmVlZGVkIGZyb20gYXBsaWNhdGlvbnMgdG8gZW5hYmxlIHRoZSBCSU9TIHRvCit1cGRhdGUgaXRzZWxmIHdpdGggdGhlIGltYWdlIGRvd25sb2FkZWQgaW4gdG8gdGhlIG1lbW9yeS4KKworT3ZlcnZpZXc6CitUaGlzIGRyaXZlciB3b3JrcyB3aXRoIERlbGwgT3Blbk1hbmFnZSBvciBEZWxsIFVwZGF0ZSBQYWNrYWdlcyBmb3IgdXBkYXRpbmcKK3RoZSBCSU9TIG9uIERlbGwgc2VydmVycyAoc3RhcnRpbmcgZnJvbSBzZXJ2ZXJzIHNvbGQgc2luY2UgMTk5OSksIGRlc2t0b3BzCithbmQgbm90ZWJvb2tzIChzdGFydGluZyBmcm9tIHRob3NlIHNvbGQgaW4gMjAwNSkuCitQbGVhc2UgZ28gdG8gIGh0dHA6Ly9zdXBwb3J0LmRlbGwuY29tIHJlZ2lzdGVyIGFuZCB5b3UgY2FuIGZpbmQgaW5mbyBvbgorT3Blbk1hbmFnZSBhbmQgRGVsbCBVcGRhdGUgcGFja2FnZXMgKERVUCkuCisKK0RlbGxfUkJVIGRyaXZlciBzdXBwb3J0cyBCSU9TIHVwZGF0ZSB1c2luZyB0aGUgbW9uaWxvdGhpYyBpbWFnZSBhbmQgcGFja2V0aXplZAoraW1hZ2UgbWV0aG9kcy4gSW4gY2FzZSBvZiBtb25pb2xpdGhpYyB0aGUgZHJpdmVyIGFsbG9jYXRlcyBhIGNvbnRpZ3VvdXMgY2h1bmsKK29mIHBoeXNpY2FsIHBhZ2VzIGhhdmluZyB0aGUgQklPUyBpbWFnZS4gSW4gY2FzZSBvZiBwYWNrZXRpemVkIHRoZSBhcHAKK3VzaW5nIHRoZSBkcml2ZXIgYnJlYWtzIHRoZSBpbWFnZSBpbiB0byBwYWNrZXRzIG9mIGZpeGVkIHNpemVzIGFuZCB0aGUgZHJpdmVyCit3b3VsZCBwbGFjZSBlYWNoIHBhY2tldCBpbiBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeS4gVGhlIGRyaXZlciBhbHNvCittYWludGFpbnMgYSBsaW5rIGxpc3Qgb2YgcGFja2V0cyBmb3IgcmVhZGluZyB0aGVtIGJhY2suCitJZiB0aGUgZGVsbF9yYnUgZHJpdmVyIGlzIHVubG9hZGVkIGFsbCB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpcyBmcmVlZC4KKworVGhlIHJidSBkcml2ZXIgbmVlZHMgdG8gaGF2ZSBhbiBhcHBsaWNhdGlvbiB3aGljaCB3aWxsIGluZm9ybSB0aGUgQklPUyB0bworZW5hYmxlIHRoZSB1cGRhdGUgaW4gdGhlIG5leHQgc3lzdGVtIHJlYm9vdC4KKworVGhlIHVzZXIgc2hvdWxkIG5vdCB1bmxvYWQgdGhlIHJidSBkcml2ZXIgYWZ0ZXIgZG93bmxvYWRpbmcgdGhlIEJJT1MgaW1hZ2UKK29yIHVwZGF0aW5nLgorCitUaGUgZHJpdmVyIGxvYWQgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzIHVuZGVyIHRoZSAvc3lzIGZpbGUgc3lzdGVtLgorL3N5cy9jbGFzcy9maXJtd2FyZS9kZWxsX3JidS9sb2FkaW5nCisvc3lzL2NsYXNzL2Zpcm13YXJlL2RlbGxfcmJ1L2RhdGEKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9kZWxsX3JidS9pbWFnZV90eXBlCisvc3lzL2RldmljZXMvcGxhdGZvcm0vZGVsbF9yYnUvZGF0YQorCitUaGUgZHJpdmVyIHN1cHBvcnRzIHR3byB0eXBlcyBvZiB1cGRhdGUgbWVjaGFuaXNtOyBtb25vbGl0aGljIGFuZCBwYWNrZXRpemVkLgorVGhlc2UgdXBkYXRlIG1lY2hhbmlzbSBkZXBlbmRzIHVwb24gdGhlIEJJT1MgY3VycmVudGx5IHJ1bm5pbmcgb24gdGhlIHN5c3RlbS4KK01vc3Qgb2YgdGhlIERlbGwgc3lzdGVtcyBzdXBwb3J0IGEgbW9ub2xpdGhpYyB1cGRhdGUgd2hlcmUgdGhlIEJJT1MgaW1hZ2UgaXMKK2NvcGllZCB0byBhIHNpbmdsZSBjb250aWd1b3VzIGJsb2NrIG9mIHBoeXNpY2FsIG1lbW9yeS4KK0luIGNhc2Ugb2YgcGFja2V0IG1lY2hhbmlzbSB0aGUgc2luZ2xlIG1lbW9yeSBjYW4gYmUgYnJva2VuIGluIHNtYWxsZXIgY2h1a3MKK29mIGNvbnRpZ3VvdXMgbWVtb3J5IGFuZCB0aGUgQklPUyBpbWFnZSBpcyBzY2F0dGVyZWQgaW4gdGhlc2UgcGFja2V0cy4KKworQnkgZGVmYXVsdCB0aGUgZHJpdmVyIHVzZXMgbW9ub2xpdGhpYyBtZW1vcnkgZm9yIHRoZSB1cGRhdGUgdHlwZS4gVGhpcyBjYW4gYmUKK2NoYW5nZWQgdG8gY29udGlndW91cyBkdXJpbmcgdGhlIGRyaXZlciBsb2FkIHRpbWUgYnkgc3BlY2lmeWluZyB0aGUgbG9hZAorcGFyYW1ldGVyIGltYWdlX3R5cGU9cGFja2V0LiAgVGhpcyBjYW4gYWxzbyBiZSBjaGFuZ2VkIGxhdGVyIGFzIGJlbG93CitlY2hvIHBhY2tldCA+IC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9kZWxsX3JidS9pbWFnZV90eXBlCisKK0RvIHRoZSBzdGVwcyBiZWxvdyB0byBkb3dubG9hZCB0aGUgQklPUyBpbWFnZS4KKzEpIGVjaG8gMSA+IC9zeXMvY2xhc3MvZmlybXdhcmUvZGVsbF9yYnUvbG9hZGluZworMikgY3AgYmlvc19pbWFnZS5oZHIgL3N5cy9jbGFzcy9maXJtd2FyZS9kZWxsX3JidS9kYXRhCiszKSBlY2hvIDAgPiAvc3lzL2NsYXNzL2Zpcm13YXJlL2RlbGxfcmJ1L2xvYWRpbmcKKworVGhlIC9zeXMvY2xhc3MvZmlybXdhcmUvZGVsbF9yYnUvIGVudHJpZXMgd2lsbCByZW1haW4gdGlsbCB0aGUgZm9sbG93aW5nIGlzCitkb25lLgorZWNobyAtMSA+IC9zeXMvY2xhc3MvZmlybXdhcmUvZGVsbF9yYnUvbG9hZGluZworCitVbnRpbCB0aGlzIHN0ZXAgaXMgY29tcGxldGVkIHRoZSBkcml2ciBjYW5ub3QgYmUgdW5sb2FkZWQuCisKK0Fsc28gdGhlIGRyaXZlciBwcm92aWRlcyAvc3lzL2RldmljZXMvcGxhdGZvcm0vZGVsbF9yYnUvZGF0YSByZWFkb25seSBmaWxlIHRvCityZWFkIGJhY2sgdGhlIGltYWdlIGRvd25sb2FkZWQuIFRoaXMgaXMgdXNlZnVsIGluIGNhc2Ugb2YgcGFja2V0IHVwZGF0ZQorbWVjaGFuaXNtIHdoZXJlIHRoZSBhYm92ZSBzdGVwcyAxLDIsMyB3aWxsIHJlcGVhdGVkIGZvciBldmVyeSBwYWNrZXQuCitCeSByZWFkaW5nIHRoZSAvc3lzL2RldmljZXMvcGxhdGZvcm0vZGVsbF9yYnUvZGF0YSBmaWxlIGFsbCBwYWNrZXQgZGF0YQorZG93bmxvYWRlZCBjYW4gYmUgdmVyaWZpZWQgaW4gYSBzaW5nbGUgZmlsZS4KK1RoZSBwYWNrZXRzIGFyZSBhcnJhbmdlZCBpbiB0aGlzIGZpbGUgb25lIGFmdGVyIHRoZSBvdGhlciBpbiBhIEZJRk8gb3JkZXIuCisKK05PVEU6CitUaGlzIGRyaXZlciByZXF1aXJlcyBhIHBhdGNoIGZvciBmaXJtd2FyZV9jbGFzcy5jIHdoaWNoIGhhcyB0aGUgYWRkaXRpb24KK29mIHJlcXVlc3RfZmlybXdhcmVfbm93YWl0X25vaG90cGx1ZyBmdW5jdGlvbiB0byB3b3J0aworQWxzbyBhZnRlciB1cGRhdGluZyB0aGUgQklPUyBpbWFnZSBhbiB1c2VyIG1kb2UgYXBwbGljYXRpb24gbmVlZWRzIHRvIGV4ZWN1dGUKK2NvZGUgd2hpY2ggbWVzc2FnZSB0aGUgQklPUyB1cGRhdGUgcmVxdWVzdCB0byB0aGUgQklPUy4gU28gb24gdGhlIG5leHQgcmVib290Cit0aGUgQklPUyBrbm93cyBhYm91dCB0aGUgbmV3IGltYWdlIGRvd25sb2FkZWQgYW5kIGl0IHVwZGF0ZXMgaXQgc2VsZi4KK0Fsc28gZG9uJ3QgdW5sb2FkIHRoZSByYnUgZHJpdmUgaWYgdGhlIGltYWdlIGhhcyB0byBiZSB1cGRhdGVkLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2R2Yi9idDh4eC50eHQgYi9Eb2N1bWVudGF0aW9uL2R2Yi9idDh4eC50eHQKaW5kZXggZTZiOGQwNS4uY2I2M2I3YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvYnQ4eHgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHZiL2J0OHh4LnR4dApAQCAtMSw1NSArMSw3NCBAQAotSG93IHRvIGdldCB0aGUgTmVidWxhIEVsZWN0cm9uaWNzIERpZ2lUViwgUGlubmFjbGUgUENUViBTYXQsIFR3aW5oYW4gRFNUICsgY2xvbmVzIHdvcmtpbmcKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitIb3cgdG8gZ2V0IHRoZSBOZWJ1bGEsIFBDVFYgYW5kIFR3aW5oYW4gRFNUIGNhcmRzIHdvcmtpbmcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0xKSBHZW5lcmFsIGluZm9ybWF0aW9uCi09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGNsYXNzIG9mIGNhcmRzIGhhcyBhIGJ0ODc4YSBhcyB0aGUgUENJIGludGVyZmFjZSwgYW5kCityZXF1aXJlIHRoZSBidHR2IGRyaXZlci4KIAotVGhpcyBjbGFzcyBvZiBjYXJkcyBoYXMgYSBidDg3OGEgY2hpcCBhcyB0aGUgUENJIGludGVyZmFjZS4KLVRoZSBkaWZmZXJlbnQgY2FyZCBkcml2ZXJzIHJlcXVpcmUgdGhlIGJ0dHYgZHJpdmVyIHRvIHByb3ZpZGUgdGhlIG1lYW5zCi10byBhY2Nlc3MgdGhlIGkyYyBidXMgYW5kIHRoZSBncGlvIHBpbnMgb2YgdGhlIGJ0OHh4IGNoaXBzZXQuCitQbGVhc2UgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgd2FybmluZyBhYm91dCB0aGUgYnR0diBtb2R1bGUKK29wdGlvbnMgYmVsb3cgZm9yIHRoZSBEU1QgY2FyZC4KIAotMikgQ29tcGlsYXRpb24gcnVsZXMgZm9yIEtlcm5lbCA+PSAyLjYuMTIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisxKSBHZW5lcmFsIGluZm9ybWF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT0KIAotRW5hYmxlIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKK1RoZXNlIGRyaXZlcnMgcmVxdWlyZSB0aGUgYnR0diBkcml2ZXIgdG8gcHJvdmlkZSB0aGUgbWVhbnMgdG8gYWNjZXNzCit0aGUgaTJjIGJ1cyBhbmQgdGhlIGdwaW8gcGlucyBvZiB0aGUgYnQ4eHggY2hpcHNldC4KIAorQmVjYXVzZSBvZiB0aGlzLCB5b3UgbmVlZCB0byBlbmFibGUKICJEZXZpY2UgZHJpdmVycyIgPT4gIk11bHRpbWVkaWEgZGV2aWNlcyIKLSA9PiAiVmlkZW8gRm9yIExpbnV4IiA9PiAiQlQ4NDggVmlkZW8gRm9yIExpbnV4IgotIkRldmljZSBkcml2ZXJzIiA9PiAiTXVsdGltZWRpYSBkZXZpY2VzIiA9PiAiRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcyIKLSA9PiAiRFZCIGZvciBMaW51eCIgIkRWQiBDb3JlIFN1cHBvcnQiICJOZWJ1bGEvUGlubmFjbGUgUENUVi9Ud2luSGFuIFBDSSBDYXJkcyIKKyAgPT4gIlZpZGVvIEZvciBMaW51eCIgPT4gIkJUODQ4IFZpZGVvIEZvciBMaW51eCIKIAotMykgTG9hZGluZyBNb2R1bGVzLCBkZXNjcmliZWQgYnkgdHdvIGFwcHJvYWNoZXMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitGdXJ0aGVybW9yZSB5b3UgbmVlZCB0byBlbmFibGUKKyJEZXZpY2UgZHJpdmVycyIgPT4gIk11bHRpbWVkaWEgZGV2aWNlcyIgPT4gIkRpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMiCisgID0+ICJEVkIgZm9yIExpbnV4IiAiRFZCIENvcmUgU3VwcG9ydCIgIkJUOHh4IGJhc2VkIFBDSSBjYXJkcyIKKworMikgTG9hZGluZyBNb2R1bGVzCis9PT09PT09PT09PT09PT09PT0KIAogSW4gZ2VuZXJhbCB5b3UgbmVlZCB0byBsb2FkIHRoZSBidHR2IGRyaXZlciwgd2hpY2ggd2lsbCBoYW5kbGUgdGhlIGdwaW8gYW5kCi1pMmMgY29tbXVuaWNhdGlvbiBmb3IgdXMsIHBsdXMgdGhlIGNvbW1vbiBkdmItYnQ4eHggZGV2aWNlIGRyaXZlciwKLXdoaWNoIGlzIGNhbGxlZCB0aGUgYmFja2VuZC4KLVRoZSBmcm9udGVuZHMgZm9yIE5lYnVsYSBEaWdpVFYgKG54dDYwMDApLCBQaW5uYWNsZSBQQ1RWIFNhdCAoY3gyNDExMCksCi1Ud2luSGFuIERTVCArIGNsb25lcyAoZHN0IGFuZCBkc3QtY2EpIGFyZSBsb2FkZWQgYXV0b21hdGljYWxseSBieSB0aGUgYmFja2VuZC4KLUZvciBmdXJ0aGVyIGRldGFpbHMgYWJvdXQgVHdpbkhhbiBEU1QgKyBjbG9uZXMgc2VlIC9Eb2N1bWVudGF0aW9uL2R2Yi9jaS50eHQuCitpMmMgY29tbXVuaWNhdGlvbiBmb3IgdXMsIHBsdXMgdGhlIGNvbW1vbiBkdmItYnQ4eHggZGV2aWNlIGRyaXZlci4KK1RoZSBmcm9udGVuZHMgZm9yIE5lYnVsYSAobnh0NjAwMCksIFBpbm5hY2xlIFBDVFYgKGN4MjQxMTApIGFuZAorVHdpbkhhbiAoZHN0KSBhcmUgbG9hZGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGR2Yi1idDh4eCBkZXZpY2UgZHJpdmVyLgogCi0zYSkgVGhlIG1hbnVhbCBhcHByb2FjaAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTG9hZGluZyBtb2R1bGVzOgotbW9kcHJvYmUgYnR0dgotbW9kcHJvYmUgZHZiLWJ0OHh4Ci0KLVVubG9hZGluZyBtb2R1bGVzOgotbW9kcHJvYmUgLXIgZHZiLWJ0OHh4Ci1tb2Rwcm9iZSAtciBidHR2Ci0KLTNiKSBUaGUgYXV0b21hdGljIGFwcHJvYWNoCiszYSkgTmVidWxhIC8gUGlubmFjbGUgUENUVgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotSWYgbm90IGFscmVhZHkgZG9uZSBieSBpbnN0YWxsYXRpb24sIHBsYWNlIGEgbGluZSBlaXRoZXIgaW4KLS9ldGMvbW9kdWxlcy5jb25mIG9yIGluIC9ldGMvbW9kcHJvYmUuY29uZiBjb250YWluaW5nIHRoaXMgdGV4dDoKLWFsaWFzIGNoYXItbWFqb3ItODEJYnR0dgorICAgJCBtb2Rwcm9iZSBidHR2IChub3JtYWxseSBidHR2IGlzIGJlaW5nIGxvYWRlZCBhdXRvbWF0aWNhbGx5IGJ5IGttb2QpCisgICAkIG1vZHByb2JlIGR2Yi1idDh4eCAob3IganVzdCBwbGFjZSBkdmItYnQ4eHggaW4gL2V0Yy9tb2R1bGVzIGZvciBhdXRvbWF0aWMgbG9hZGluZykKIAotVGhlbiBwbGFjZSBhIGxpbmUgaW4gL2V0Yy9tb2R1bGVzIGNvbnRhaW5pbmcgdGhpcyB0ZXh0OgotZHZiLWJ0OHh4CiAKLVJlYm9vdCB5b3VyIHN5c3RlbSBhbmQgaGF2ZSBmdW4hCiszYikgVHdpbkhhbiBhbmQgQ2xvbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAkIG1vZHByb2JlIGJ0dHYgaTJjX2h3PTEgY2FyZD0weDcxCisgICAkIG1vZHByb2JlIGR2Yi1idDh4eAorICAgJCBtb2Rwcm9iZSBkc3QKKworVGhlIHZhbHVlIDB4NzEgd2lsbCBvdmVycmlkZSB0aGUgUENJIHR5cGUgZGV0ZWN0aW9uIGZvciBkdmItYnQ4eHgsCit3aGljaCAgaXMgbmVjZXNzYXJ5IGZvciBUd2luSGFuIGNhcmRzLgorCitJZiB5b3UncmUgaGF2aW5nIGFuIG9sZGVyIGNhcmQgKGJsdWUgY29sb3IgY2lyY3VpdCkgYW5kIGNhcmQ9MHg3MSBsb2NrcworeW91ciBtYWNoaW5lLCB0cnkgdXNpbmcgMHg2OCwgdG9vLiBJZiB0aGF0IGRvZXMgbm90IHdvcmssIGFzayBvbiB0aGUKK21haWxpbmcgbGlzdC4KKworVGhlIERTVCBtb2R1bGUgdGFrZXMgYSBjb3VwbGUgb2YgdXNlZnVsIHBhcmFtZXRlcnMuCisKK3ZlcmJvc2UgdGFrZXMgdmFsdWVzIDAgdG8gNC4gVGhlc2UgdmFsdWVzIGNvbnRyb2wgdGhlIHZlcmJvc2l0eSBsZXZlbCwKK2FuZCBjYW4gYmUgdXNlZCB0byBkZWJ1ZyBhbHNvLgorCit2ZXJib3NlPTAgbWVhbnMgY29tcGxldGUgZGlzYWJsaW5nIG9mIG1lc3NhZ2VzCisJMSBvbmx5IGVycm9yIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQKKwkyIG5vdGlmaWNhdGlvbnMgYXJlIGFsc28gZGlzcGxheWVkCisJMyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIGFyZSBhbHNvIGRpc3BsYXllZAorCTQgZGVidWcgc2V0dGluZworCitkc3RfYWRkb25zIHRha2VzIHZhbHVlcyAwIGFuZCAweDIwLiBBIHZhbHVlIG9mIDAgbWVhbnMgaXQgaXMgYSBGVEEgY2FyZC4KKzB4MjAgbWVhbnMgaXQgaGFzIGEgQ29uZGl0aW9uYWwgQWNjZXNzIHNsb3QuCisKK1RoZSBhdXRvZGVjdGVkIHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieXRoZSBjYXJkcyAncmVzcG9uc2UKK3N0cmluZycgd2hpY2ggeW91IGNhbiBzZWUgaW4geW91ciBsb2dzIGUuZy4KKworZHN0X2dldF9kZXZpY2VfaWQ6IFJlY29nbmlzZSBbRFNUTUNJXQorCiAKIC0tCi1BdXRob3JzOiBSaWNoYXJkIFdhbGtlciwgSmFtaWUgSG9uYW4sIE1pY2hhZWwgSHVub2xkLCBNYW51IEFicmFoYW0sIFV3ZSBCdWdsYQorQXV0aG9yczogUmljaGFyZCBXYWxrZXIsIEphbWllIEhvbmFuLCBNaWNoYWVsIEh1bm9sZCwgTWFudSBBYnJhaGFtCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2R2Yi9jaS50eHQgYi9Eb2N1bWVudGF0aW9uL2R2Yi9jaS50eHQKaW5kZXggNjJlMDcwMS4uOTVmMGU3MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvY2kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHZiL2NpLnR4dApAQCAtMjMsNyArMjMsNiBAQAogCSAgZWc6ICQgc3phcCAtYyBjaGFubmVscy5jb25mIC1yICJUTUMiIC14CiAKIAkoYikgYSBjaGFubmVscy5jb25mIGNvbnRhaW5pbmcgYSB2YWxpZCBQTVQgUElECi0KIAkgIGVnOiBUTUM6MTE5OTY6aDowOjI3NTAwOjI3ODo1MTI6NjUwOjMyMQogCiAJICBoZXJlIDI3OCBpcyBhIHZhbGlkIFBNVCBQSUQuIHRoZSByZXN0IG9mIHRoZSB2YWx1ZXMgYXJlIHRoZQpAQCAtMzEsMTMgKzMwLDcgQEAKIAogCShjKSBhZnRlciBydW5uaW5nIGEgc3phcCwgeW91IGhhdmUgdG8gcnVuIGNhX3phcCwgZm9yIHRoZQogCSAgZGVzY3JhbWJsZXIgdG8gZnVuY3Rpb24sCi0KLQkgIGVnOiAkIGNhX3phcCBwYXRjaGVkX2NoYW5uZWxzLmNvbmYgIlRNQyIKLQotCSAgVGhlIHBhdGNoZWQgbWVhbnMgYSBwYXRjaCB0byBhcHBseSB0byBzY2FuLCBzdWNoIHRoYXQgc2NhbiBjYW4KLQkgIGdlbmVyYXRlIGEgY2hhbm5lbHMuY29uZl93aXRoIHBtdCwgd2hpY2ggaGFzIHRoaXMgUE1UIFBJRCBpbmZvCi0JICAoTk9URTogc3phcCBjYW5ub3QgdXNlIHRoaXMgY2hhbm5lbHMuY29uZiB3aXRoIHRoZSBQTVRfUElEKQotCisJICBlZzogJCBjYV96YXAgY2hhbm5lbHMuY29uZiAiVE1DIgogCiAJKGQpIEhvcGVmbGx5IEVuam95IHlvdXIgZmF2b3VyaXRlIHN1YnNjcmliZWQgY2hhbm5lbCBhcyB5b3UgZG8gd2l0aAogCSAgYSBGVEEgY2FyZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZXhjZXB0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vZXhjZXB0aW9uLnR4dAppbmRleCBmMWQ0MzY5Li4zY2IzOWFkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2V4Y2VwdGlvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9leGNlcHRpb24udHh0CkBAIC03LDcgKzcsNyBAQAogCiBJbiBvbGRlciB2ZXJzaW9ucyBvZiBMaW51eCB0aGlzIHdhcyBkb25lIHdpdGggdGhlIAogaW50IHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKSAKLWZ1bmN0aW9uLgorZnVuY3Rpb24gKHdoaWNoIGhhcyBzaW5jZSBiZWVuIHJlcGxhY2VkIGJ5IGFjY2Vzc19vaygpKS4KIAogVGhpcyBmdW5jdGlvbiB2ZXJpZmllZCB0aGF0IHRoZSBtZW1vcnkgYXJlYSBzdGFydGluZyBhdCBhZGRyZXNzIAogYWRkciBhbmQgb2Ygc2l6ZSBzaXplIHdhcyBhY2Nlc3NpYmxlIGZvciB0aGUgb3BlcmF0aW9uIHNwZWNpZmllZCAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9idWdzIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL2J1Z3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwY2M2NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9idWdzCkBAIC0wLDAgKzEsMTQgQEAKK0J1Z3MKKz09PT0KKworSSBjdXJyZW50bHkgZG9uJ3Qga25vdyBvZiBhbnkgYnVnLiBQbGVhc2UgZG8gc2VuZCByZXBvcnRzIHRvOgorIC0gbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CisgLSBLbnV0X1BldGVyc2VuQHQtb25saW5lLmRlLgorCisKK1VudGVzdGVkIGZlYXR1cmVzCis9PT09PT09PT09PT09PT09PQorCitBbGwgTENEIHN0dWZmIGlzIHVudGVzdGVkLiBJZiBpdCB3b3JrZWQgaW4gdHJpZGVudGZiLCBpdCBzaG91bGQgd29yayBpbgorY3libGFmYi4gUGxlYXNlIHRlc3QgYW5kIHJlcG9ydCB0aGUgcmVzdWx0cyB0byBLbnV0X1BldGVyc2VuQHQtb25saW5lLmRlLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvY3JlZGl0cyBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9jcmVkaXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjNiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvY3JlZGl0cwpAQCAtMCwwICsxLDcgQEAKK1RoYW5rcyB0bworPT09PT09PT09CisgICAqIAlBbGFuIEhvdXJpaGFuZSwgZm9yIHdyaXRpbmcgdGhlIFggdHJpZGVudCBkcml2ZXIKKyAgICoJSmFuaSBNb25vc2VzLCBmb3Igd3JpdGluZyB0aGUgdHJpZGVudGZiIGRyaXZlcgorICAgKglBbnRvbmlubyBBLiBEYXBsYXMsIGZvciByZXZpZXcgb2YgdGhlIGZpcnN0IHB1Ymxpc2hlZAorCXZlcnNpb24gb2YgY3libGFmYiBhbmQgc29tZSBjb2RlCisgICAqCUpvY2hlbiBIZWluLCBmb3IgdGVzdGluZyBhbmQgYSBoZWxwZnVsbCBidWcgcmVwb3J0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvZG9jdW1lbnRhdGlvbiBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9kb2N1bWVudGF0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMWFhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvZG9jdW1lbnRhdGlvbgpAQCAtMCwwICsxLDE3IEBACitBdmFpbGFibGUgRG9jdW1lbnRhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT0KKworQXBvbGxvIFBMRSAxMzMgQ2hpcHNldCBWVDg2MDFBIE5vcnRoIEJyaWRnZSBEYXRhc2hlZXQsIFJldi4gMS44MiwgT2N0b2JlciAyMiwKKzIwMDEsIGF2YWlsYWJsZSBmcm9tIFZJQToKKworCWh0dHA6Ly93d3cudmlhdnBzZC5jb20vcHJvZHVjdC82LzE1L0RTODYwMUExODIucGRmCisKK1RoZSBkYXRhc2hlZXQgaXMgaW5jb21wbGV0ZSwgc29tZSByZWdpc3RlcnMgdGhhdCBuZWVkIHRvIGJlIHByb2dyYW1tZWQgYXJlIG5vdAorZXhwbGFpbmVkIGF0IGFsbCBhbmQgaW1wb3J0YW50IGJpdHMgYXJlIGxpc3RlZCBhcyAicmVzZXJ2ZWQiLiBCdXQgeW91IHJlYWxseQorbmVlZCB0aGUgZGF0YXNoZWV0IHRvIHVuZGVyc3RhbmQgdGhlIGNvZGUuICAicC4geHh4IiBjb21tZW50cyByZWZlciB0byBwYWdlCitudW1iZXJzIG9mIHRoaXMgZG9jdW1lbnQuCisKK1hGcmVlL1hPcmcgZHJpdmVycyBhcmUgYXZhaWxhYmxlIGFuZCBvZiBnb29kIHF1YWxpdHksIGxvb2tpbmcgYXQgdGhlIGNvZGUKK3RoZXJlIGlzIGEgZ29vZCBpZGVhIGlmIHRoZSBkYXRhc2hlZXQgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggaW5mb3JtYXRpb24KK29yIGlmIHRoZSBkYXRhc2hlZXQgc2VlbXMgdG8gYmUgd3JvbmcuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9mYi5tb2RlcyBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9mYi5tb2RlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQzNTFmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL2ZiLm1vZGVzCkBAIC0wLDAgKzEsMTU1IEBACisjCisjICAgU2FtcGxlIGZiLm1vZGVzIGZpbGUKKyMKKyMJUHJvdmlkZXMgYW4gaW5jb21wbGV0ZSBsaXN0IG9mIHdvcmtpbmcgbW9kZXMgZm9yCisjCXRoZSBjeWJlcmJsYWRlL2kxIGdyYXBoaWNzIGNvcmUuCisjCisjCVRoZSB2YWx1ZSA0Mjk0OTY3MjU2IGlzIHVzZWQgaW5zdGVhZCBvZiAtNDAuIE9mIGNvdXJzZSwgLTQwIGlzIG5vdAorIwlhIHJlYWxseSByZWFzb25hYmxlIHZhbHVlLCBidXQgY2hpcCBkZXNpZ24gZG9lcyBub3QgYWx3YXlzIGZvbGxvdworIwlsb2dpYy4gQmVsaWV2ZSBtZSwgaXQncyBvaywgYW5kIGl0J3MgdGhlIHdheSB0aGUgQklPUyBkb2VzIGl0LgorIworIwlmYnNldCByZXF1aXJlcyA0Mjk0OTY3MjU2IGluIGZiLm1vZGVzIGFuZCAtNDAgYXMgYW4gYXJndW1lbnQgdG8KKyMJdGhlIC10IHBhcmFtZXRlci4gVGhhdCdzIGFsc28gbm90IHRvbyByZWFzb25hYmxlLCBhbmQgaXQgbWlnaHQgY2hhbmdlCisjCWluIHRoZSBmdXR1cmUgb3IgbWlnaHQgZXZlbiBiZSBkaWZmZXJ0IGZvciB5b3VyIGN1cnJlbnQgdmVyc2lvbi4KKyMKKworbW9kZSAiNjQweDQ4MC01MCIKKyAgICBnZW9tZXRyeSA2NDAgNDgwIDY0MCAzNzU2IDgKKyAgICB0aW1pbmdzIDQ3NjE5IDQyOTQ5NjcyNTYgMjQgMTcgMCAyMTYgMworZW5kbW9kZQorCittb2RlICI2NDB4NDgwLTYwIgorICAgIGdlb21ldHJ5IDY0MCA0ODAgNjQwIDM3NTYgOAorICAgIHRpbWluZ3MgMzk2ODIgNDI5NDk2NzI1NiAyNCAxNyAwIDIxNiAzCitlbmRtb2RlCisKK21vZGUgIjY0MHg0ODAtNzAiCisgICAgZ2VvbWV0cnkgNjQwIDQ4MCA2NDAgMzc1NiA4CisgICAgdGltaW5ncyAzNDAxMyA0Mjk0OTY3MjU2IDI0IDE3IDAgMjE2IDMKK2VuZG1vZGUKKworbW9kZSAiNjQweDQ4MC03MiIKKyAgICBnZW9tZXRyeSA2NDAgNDgwIDY0MCAzNzU2IDgKKyAgICB0aW1pbmdzIDMzMDY4IDQyOTQ5NjcyNTYgMjQgMTcgMCAyMTYgMworZW5kbW9kZQorCittb2RlICI2NDB4NDgwLTc1IgorICAgIGdlb21ldHJ5IDY0MCA0ODAgNjQwIDM3NTYgOAorICAgIHRpbWluZ3MgMzE3NDYgNDI5NDk2NzI1NiAyNCAxNyAwIDIxNiAzCitlbmRtb2RlCisKK21vZGUgIjY0MHg0ODAtODAiCisgICAgZ2VvbWV0cnkgNjQwIDQ4MCA2NDAgMzc1NiA4CisgICAgdGltaW5ncyAyOTc2MSA0Mjk0OTY3MjU2IDI0IDE3IDAgMjE2IDMKK2VuZG1vZGUKKworbW9kZSAiNjQweDQ4MC04NSIKKyAgICBnZW9tZXRyeSA2NDAgNDgwIDY0MCAzNzU2IDgKKyAgICB0aW1pbmdzIDI4MDExIDQyOTQ5NjcyNTYgMjQgMTcgMCAyMTYgMworZW5kbW9kZQorCittb2RlICI4MDB4NjAwLTUwIgorICAgIGdlb21ldHJ5IDgwMCA2MDAgODAwIDMyMjEgOAorICAgIHRpbWluZ3MgMzAzMDMgOTYgMjQgMTQgMCAxMzYgMTEKK2VuZG1vZGUKKworbW9kZSAiODAweDYwMC02MCIKKyAgICBnZW9tZXRyeSA4MDAgNjAwIDgwMCAzMjIxIDgKKyAgICB0aW1pbmdzIDI1MjUyIDk2IDI0IDE0IDAgMTM2IDExCitlbmRtb2RlCisKK21vZGUgIjgwMHg2MDAtNzAiCisgICAgZ2VvbWV0cnkgODAwIDYwMCA4MDAgMzIyMSA4CisgICAgdGltaW5ncyAyMTY0NSA5NiAyNCAxNCAwIDEzNiAxMQorZW5kbW9kZQorCittb2RlICI4MDB4NjAwLTcyIgorICAgIGdlb21ldHJ5IDgwMCA2MDAgODAwIDMyMjEgOAorICAgIHRpbWluZ3MgMjEwNDMgOTYgMjQgMTQgMCAxMzYgMTEKK2VuZG1vZGUKKworbW9kZSAiODAweDYwMC03NSIKKyAgICBnZW9tZXRyeSA4MDAgNjAwIDgwMCAzMjIxIDgKKyAgICB0aW1pbmdzIDIwMjAyIDk2IDI0IDE0IDAgMTM2IDExCitlbmRtb2RlCisKK21vZGUgIjgwMHg2MDAtODAiCisgICAgZ2VvbWV0cnkgODAwIDYwMCA4MDAgMzIyMSA4CisgICAgdGltaW5ncyAxODkzOSA5NiAyNCAxNCAwIDEzNiAxMQorZW5kbW9kZQorCittb2RlICI4MDB4NjAwLTg1IgorICAgIGdlb21ldHJ5IDgwMCA2MDAgODAwIDMyMjEgOAorICAgIHRpbWluZ3MgMTc4MjUgOTYgMjQgMTQgMCAxMzYgMTEKK2VuZG1vZGUKKworbW9kZSAiMTAyNHg3NjgtNTAiCisgICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICB0aW1pbmdzIDE5MDU0IDE0NCAyNCAyOSAwIDEyMCAzCitlbmRtb2RlCisKK21vZGUgIjEwMjR4NzY4LTYwIgorICAgIGdlb21ldHJ5IDEwMjQgNzY4IDEwMjQgMjgxNSA4CisgICAgdGltaW5ncyAxNTg4MCAxNDQgMjQgMjkgMCAxMjAgMworZW5kbW9kZQorCittb2RlICIxMDI0eDc2OC03MCIKKyAgICBnZW9tZXRyeSAxMDI0IDc2OCAxMDI0IDI4MTUgOAorICAgIHRpbWluZ3MgMTM2MTAgMTQ0IDI0IDI5IDAgMTIwIDMKK2VuZG1vZGUKKworbW9kZSAiMTAyNHg3NjgtNzIiCisgICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICB0aW1pbmdzIDEzMjMyIDE0NCAyNCAyOSAwIDEyMCAzCitlbmRtb2RlCisKK21vZGUgIjEwMjR4NzY4LTc1IgorICAgIGdlb21ldHJ5IDEwMjQgNzY4IDEwMjQgMjgxNSA4CisgICAgdGltaW5ncyAxMjcwMyAxNDQgMjQgMjkgMCAxMjAgMworZW5kbW9kZQorCittb2RlICIxMDI0eDc2OC04MCIKKyAgICBnZW9tZXRyeSAxMDI0IDc2OCAxMDI0IDI4MTUgOAorICAgIHRpbWluZ3MgMTE5MTAgMTQ0IDI0IDI5IDAgMTIwIDMKK2VuZG1vZGUKKworbW9kZSAiMTAyNHg3NjgtODUiCisgICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICB0aW1pbmdzIDExMjA5IDE0NCAyNCAyOSAwIDEyMCAzCitlbmRtb2RlCisKK21vZGUgIjEyODB4MTAyNC01MCIKKyAgICBnZW9tZXRyeSAxMjgwIDEwMjQgMTI4MCAyNjYyIDgKKyAgICB0aW1pbmdzIDExMTE0IDIzMiAxNiAzOSAwIDE2MCAzCitlbmRtb2RlCisKK21vZGUgIjEyODB4MTAyNC02MCIKKyAgICBnZW9tZXRyeSAxMjgwIDEwMjQgMTI4MCAyNjYyIDgKKyAgICB0aW1pbmdzIDkyNjIgMjMyIDE2IDM5IDAgMTYwIDMKK2VuZG1vZGUKKworbW9kZSAiMTI4MHgxMDI0LTcwIgorICAgIGdlb21ldHJ5IDEyODAgMTAyNCAxMjgwIDI2NjIgOAorICAgIHRpbWluZ3MgNzkzOSAyMzIgMTYgMzkgMCAxNjAgMworZW5kbW9kZQorCittb2RlICIxMjgweDEwMjQtNzIiCisgICAgZ2VvbWV0cnkgMTI4MCAxMDI0IDEyODAgMjY2MiA4CisgICAgdGltaW5ncyA3NzE5IDIzMiAxNiAzOSAwIDE2MCAzCitlbmRtb2RlCisKK21vZGUgIjEyODB4MTAyNC03NSIKKyAgICBnZW9tZXRyeSAxMjgwIDEwMjQgMTI4MCAyNjYyIDgKKyAgICB0aW1pbmdzIDc0MTAgMjMyIDE2IDM5IDAgMTYwIDMKK2VuZG1vZGUKKworbW9kZSAiMTI4MHgxMDI0LTgwIgorICAgIGdlb21ldHJ5IDEyODAgMTAyNCAxMjgwIDI2NjIgOAorICAgIHRpbWluZ3MgNjk0NiAyMzIgMTYgMzkgMCAxNjAgMworZW5kbW9kZQorCittb2RlICIxMjgweDEwMjQtODUiCisgICAgZ2VvbWV0cnkgMTI4MCAxMDI0IDEyODAgMjY2MiA4CisgICAgdGltaW5ncyA2NTM4IDIzMiAxNiAzOSAwIDE2MCAzCitlbmRtb2RlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9wZXJmb3JtYW5jZSBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9wZXJmb3JtYW5jZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjRlNDdhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL3BlcmZvcm1hbmNlCkBAIC0wLDAgKzEsODAgQEAKK1NwZWVkCis9PT09PQorCitDeUJsYUZCIGlzIG11Y2ggZmFzdGVyIHRoYW4gdHJpZGVudGZiIGFuZCB2ZXNhZmIuIENvbXBhcmUgdGhlIHBlcmZvcm1hbmNlIGRhdGEKK2ZvciBtb2RlIDEyODB4MTAyNC1bOCwxNiwzMl1ANjEgSHouCisKK1Rlc3QgMTogQ2F0IGEgZmlsZSB3aXRoIDIwMDAgbGluZXMgb2YgMCBjaGFyYWN0ZXJzLgorVGVzdCAyOiBDYXQgYSBmaWxlIHdpdGggMjAwMCBsaW5lcyBvZiA4MCBjaGFyYWN0ZXJzLgorVGVzdCAzOiBDYXQgYSBmaWxlIHdpdGggMjAwMCBsaW5lcyBvZiAxNjAgY2hhcmFjdGVycy4KKworQWxsIHZhbHVlcyBzaG93IHN5c3RlbSB0aW1lIHVzZSBpbiBzZWNvbmRzLCBrZXJuZWwgMi42LjEyIHdhcyB1c2VkIGZvcgordGhlIG1lYXN1cmVtZW50cy4gMi42LjEzIGlzIGEgYml0IHNsb3dlciwgMi42LjE0IGhvcGVmdWxseSB3aWxsIGluY2x1ZGUgYQorcGF0Y2ggdGhhdCBzcGVlZHMgdXAga2VybmVsIGJpdGJsaXR0aW5nIGEgbG90ICggPiAyMCUpLgorCisrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8CSAgICB8CQkJbm90IGFjY2VsZXJhdGVkIAkJICB8Cit8IFRSSURFTlRGQiArLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCit8IG9mIDIuNi4xMiB8CSAgIDggYnBwICAgICAgfCAgICAgMTYgYnBwCXwgICAgIDMyIGJwcAkgIHwKK3wJICAgIHwgbm95cGFuIHwJIHlwYW4gfCBub3lwYW4gfCAgIHlwYW4gfCBub3lwYW4gfCAgIHlwYW4gfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworfCAgICBUZXN0IDEgfAk0LjMxIHwJIDQuMzMgfCAgIDYuMDUgfCAgMTIuODEgfCAgLS0tLSAgfCAgLS0tLSAgfAorfCAgICBUZXN0IDIgfCAgNjcuOTQgfAkgNS40NCB8IDEyMy4xNiB8ICAxNC43OSB8ICAtLS0tICB8ICAtLS0tICB8Cit8ICAgIFRlc3QgMyB8IDEzMS4zNiB8CSA2LjU1IHwgMjQwLjEyIHwgIDE2Ljc2IHwgIC0tLS0gIHwgIC0tLS0gIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK3wgIENvbW1lbnRzIHwJCSAgICAgIHwgCQl8IGNvbXBsZXRlbHkgYnJvLSB8Cit8CSAgICB8CQkgICAgICB8IAkJfCBrZW4sIG1vbml0b3IJICB8Cit8CSAgICB8CQkgICAgICB8IAkJfCBzd2l0Y2hlcyBvZmYJICB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCisKKworKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfAkgICAgfAkJCSAgYWNjZWxlcmF0ZWQJCQkgIHwKK3wgVFJJREVOVEZCICstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKK3wgb2YgMi42LjEyIHwJICAgOCBicHAgICAgICB8ICAgICAxNiBicHAJfCAgICAgMzIgYnBwCSAgfAorfAkgICAgfCBub3lwYW4gfAkgeXBhbiB8IG5veXBhbiB8ICAgeXBhbiB8IG5veXBhbiB8ICAgeXBhbiB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8ICAgIFRlc3QgMSB8ICAtLS0tICB8CS0tLS0gIHwgIDIwLjYyIHwgICAxLjIyIHwgIC0tLS0gIHwgIC0tLS0gIHwKK3wgICAgVGVzdCAyIHwgIC0tLS0gIHwJLS0tLSAgfCAgMjIuNjEgfCAgIDMuMTkgfCAgLS0tLSAgfCAgLS0tLSAgfAorfCAgICBUZXN0IDMgfCAgLS0tLSAgfAktLS0tICB8ICAyNC41OSB8ICAgNS4xNiB8ICAtLS0tICB8ICAtLS0tICB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8ICBDb21tZW50cyB8IGJyb2tlbiwgd3JpdGluZyB8IGJyb2tlbiwgb2sgb25seSB8IGNvbXBsZXRlbHkgYnJvLSB8Cit8CSAgICB8IHRvIHdyb25nIHBsYWNlcyB8IGlmIGJnY29sb3IgaXMJfCBrZW4sIG1vbml0b3IJICB8Cit8CSAgICB8IG9uIHNjcmVlbiArIGJ1ZyB8IGJsYWNrLCBidWcgaW4JfCBzd2l0Y2hlcyBvZmYJICB8Cit8CSAgICB8IGluIGZpbGxyZWN0KCkgICB8IGZpbGxyZWN0KCkJfAkJICB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCisKKworKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfAkgICAgfAkJCW5vdCBhY2NlbGVyYXRlZCAJCSAgfAorfCAgIFZFU0FGQiAgKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKworfCBvZiAyLjYuMTIgfAkgICA4IGJwcCAgICAgIHwgICAgIDE2IGJwcAl8ICAgICAzMiBicHAJICB8Cit8CSAgICB8IG5veXBhbiB8CSB5cGFuIHwgbm95cGFuIHwgICB5cGFuIHwgbm95cGFuIHwgICB5cGFuIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK3wgICAgVGVzdCAxIHwJNC4yNiB8CSAzLjc2IHwgICA1Ljk5IHwgICA3LjIzIHwgIC0tLS0gIHwgIC0tLS0gIHwKK3wgICAgVGVzdCAyIHwgIDY1LjY1IHwJIDQuODkgfCAxMjAuODggfCAgIDkuMDggfCAgLS0tLSAgfCAgLS0tLSAgfAorfCAgICBUZXN0IDMgfCAxMjYuOTEgfAkgNS45NCB8IDIzNS43NyB8ICAxMS4wMyB8ICAtLS0tICB8ICAtLS0tICB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8ICBDb21tZW50cyB8IHZnYT0weDMwNyAgICAgICB8IHZnYT0weDMxYQl8IHZnYT0weDMxYiBub3QgICB8Cit8CSAgICB8IGZoPTgwa0h6CSAgICAgIHwgZmg9ODBrSHoJfCBzdXBwb3J0ZWQgYnkJICB8Cit8CSAgICB8IGZ2PTc1a0h6CSAgICAgIHwgZnY9NzVrSHoJfCB2aWRlbyBCSU9TIGFuZCAgfAorfAkgICAgfAkJICAgICAgfCAJCXwgaGFyZHdhcmUJICB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCisKKworKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfAkgICAgfAkJCSAgYWNjZWxlcmF0ZWQJCQkgIHwKK3wgIENZQkxBRkIgICstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKK3wJICAgIHwJICAgOCBicHAgICAgICB8ICAgICAxNiBicHAJfCAgICAgMzIgYnBwCSAgfAorfAkgICAgfCBub3lwYW4gfAkgeXBhbiB8IG5veXBhbiB8ICAgeXBhbiB8IG5veXBhbiB8ICAgeXBhbiB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8ICAgIFRlc3QgMSB8CTguMDIgfAkgMC4yMyB8ICAxOS4wNCB8ICAgMC42MSB8ICA1Ny4xMiB8ICAgMi43NCB8Cit8ICAgIFRlc3QgMiB8CTguMzggfAkgMC41NSB8ICAxOS4zOSB8ICAgMC45MiB8ICA1Ny41NCB8ICAgMy4xMyB8Cit8ICAgIFRlc3QgMyB8CTguNzMgfAkgMC44NiB8ICAxOS43NCB8ICAgMS4yNCB8ICA1Ny45NSB8ICAgMy41MSB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8ICBDb21tZW50cyB8CQkgICAgICB8IAkJfAkJICB8Cit8CSAgICB8CQkgICAgICB8IAkJfAkJICB8Cit8CSAgICB8CQkgICAgICB8IAkJfAkJICB8Cit8CSAgICB8CQkgICAgICB8IAkJfAkJICB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi90b2RvIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL3RvZG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBmYjJmOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi90b2RvCkBAIC0wLDAgKzEsMzIgQEAKK1RPRE8gLyBNaXNzaW5nIGZlYXR1cmVzCis9PT09PT09PT09PT09PT09PT09PT09PQorCitWZXJpZnkgTENEIHN0dWZmCQkic3RyZXRjaCIgYW5kICJjZW50ZXIiIG9wdGlvbnMgYXJlCisJCQkJY29tcGxldGVseSB1bnRlc3RlZCAuLi4gdGhpcyBjb2RlIG5lZWRzIHRvIGJlCisJCQkJdmVyaWZpZWQuIEFzIEkgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gc3VjaAorCQkJCWhhcmR3YXJlLCBwbGVhc2UgY29udGFjdCBtZSBpZiB5b3UgYXJlCisJCQkJd2lsbGluZyBydW4gc29tZSB0ZXN0cy4KKworSW50ZXJsYWNlZCB2aWRlbyBtb2RlcwkJVGhlIHJlYXNvbiB0aGF0IGludGVybGVhdmVkCisJCQkJbW9kZXMgYXJlIGRpc2FibGVkIGlzIHRoYXQgSSBkbyBub3Qga25vdworCQkJCXRoZSBtZWFuaW5nIG9mIHRoZSB2ZXJ0aWNhbCBpbnRlcmxhY2UKKwkJCQlwYXJhbWV0ZXIuIEFsc28gdGhlIGRhdGFzaGVldCBtZW50aW9ucyBhCisJCQkJYml0IGQ4IG9mIGEgaG9yaXpvbnRhbCBpbnRlcmxhY2UgcGFyYW1ldGVyLAorCQkJCWJ1dCBub3doZXJlIHRoZSBsb3dlciA4IGJpdHMuIFBsZWFzZSBoZWxwCisJCQkJaWYgeW91IGNhbi4KKworbG93LXJlcyBkb3VibGUgc2NhbiBtb2RlcwlXaG8gbmVlZHMgaXQ/CisKK2FjY2VsZXJhdGVkIGNvbG9yIGJsaXR0aW5nCVdobyBuZWVkcyBpdD8gVGhlIGNvbnNvbGUgZHJpdmVyIGRvZXMgdXNlIGNvbG9yCisJCQkJYmxpdHRpbmcgZm9yIG5vdGhpbmcgYnV0IGRyYXdpbmcgdGhlIHBlbmd1aW5lLAorCQkJCWV2ZXJ5dGhpbmcgZWxzZSBpcyBkb25lIHVzaW5nIGNvbG9yIGV4cGFuZGluZworCQkJCWJsaXR0aW5nIG9mIDFicHAgY2hhcmFjdGVyIGJpdG1hcHMuCisKK3hwYW5uaW5nCQkJV2hvIG5lZWRzIGl0PworCitpb2N0bHMJCQkJV2hvIG5lZWRzIGl0PworCitUVi1vdXQJCQkJV2lsbCBiZSBkb25lIGxhdGVyCisKKz8/PwkJCQlGZWVsIGZyZWUgdG8gY29udGFjdCBtZSBpZiB5b3UgaGF2ZSBhbnkKKwkJCQlmZWF0dXJlIHJlcXVlc3RzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvdXNhZ2UgYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvdXNhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyN2M4ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi91c2FnZQpAQCAtMCwwICsxLDIwNiBAQAorQ3lCbGFGQiBpcyBhIGZyYW1lYnVmZmVyIGRyaXZlciBmb3IgdGhlIEN5YmVyYmxhZGUvaTEgZ3JhcGhpY3MgY29yZSBpbnRlZ3JhdGVkCitpbnRvIHRoZSBWSUEgQXBvbGxvIFBMRTEzMyAoYWthIHZ0ODYwMSkgc291dGggYnJpZGdlLiBJdCBpcyBkZXZlbG9wZWQgYW5kCit0ZXN0ZWQgdXNpbmcgYSBWSUEgRVBJQSA1MDAwIGJvYXJkLgorCitDeWJsYWZiIC0gY29tcGlsZWQgaW50byB0aGUga2VybmVsIG9yIGFzIGEgbW9kdWxlPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworWW91IG1pZ2h0IGNvbXBpbGUgY3libGFmYiBlaXRoZXIgYXMgYSBtb2R1bGUgb3IgY29tcGlsZSBpdCBwZXJtYW5lbnRseSBpbnRvIHRoZQora2VybmVsLgorCitVbmxlc3MgeW91IGhhdmUgYSByZWFsIHJlYXNvbiB0byBkbyBzbyB5b3Ugc2hvdWxkIG5vdCBjb21waWxlIGJvdGggdmVzYWZiIGFuZAorY3libGFmYiBwZXJtYW5lbnRseSBpbnRvIHRoZSBrZXJuZWwuIEl0J3MgcG9zc2libGUgYW5kIGl0IGhlbHBzIGR1cmluZyB0aGUKK2RldmVsb3BlbWVudCBjeWNsZSwgYnV0IGl0J3MgdXNlbGVzcyBhbmQgd2lsbCBhdCBsZWFzdCBibG9jayBzb21lIG90aGVyd2lzZQordXNlZnVsbCBtZW1vcnkgZm9yIG9yZGluYXJ5IHVzZXJzLgorCitTZWxlY3RpbmcgTW9kZXMKKz09PT09PT09PT09PT09PQorCisJU3RhcnR1cCBNb2RlCisJPT09PT09PT09PT09CisKKwlGaXJzdCBvZiBhbGwsIHlvdSBtaWdodCB1c2UgdGhlICJ2Z2E9Pz8/IiBib290IHBhcmFtZXRlciBhcyBpdCBpcworCWRvY3VtZW50ZWQgaW4gdmVzYWZiLnR4dCBhbmQgc3ZnYS50eHQuIEN5YmxhZmIgd2lsbCBkZXRlY3QgdGhlIHZpZGVvCisJbW9kZSBzZWxlY3RlZCBhbmQgd2lsbCB1c2UgdGhlIGdlb21ldHJ5IGFuZCB0aW1pbmdzIGZvdW5kIGJ5CisJaW5zcGVjdGluZyB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzLgorCisJCXZpZGVvPWN5YmxhZmIgdmdhPTB4MzE3CisKKwlBbHRlcm5hdGl2ZWx5IHlvdSBtaWdodCB1c2UgYSBjb21iaW5hdGlvbiBvZiB0aGUgbW9kZSwgcmVmIGFuZCBicHAKKwlwYXJhbWV0ZXJzLiBJZiB5b3UgY29tcGlsZWQgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIGFkZCBzb21ldGhpbmcKKwlsaWtlIHRoaXMgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmU6CisKKwkJdmlkZW89Y3libGFmYjoxMjgweDEwMjQsYnBwPTE2LHJlZj01MCAuLi4KKworCUlmIHlvdSBjb21waWxlZCB0aGUgZHJpdmVyIGFzIGEgbW9kdWxlLCB0aGUgc2FtZSBtb2RlIHdvdWxkIGJlCisJc2VsZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisJCW1vZHByb2JlIGN5YmxhZmIgbW9kZT0xMjgweDEwMjQgYnBwPTE2IHJlZj01MCAuLi4KKworCU5vbmUgb2YgdGhlIG1vZGVzIHBvc3NpYmxlIHRvIHNlbGVjdCBhcyBzdGFydHVwIG1vZGVzIGFyZSBhZmZlY3RlZCBieQorCXRoZSBwcm9ibGVtcyBkZXNjcmliZWQgYXQgdGhlIGVuZCBvZiB0aGUgbmV4dCBzdWJzZWN0aW9uLgorCisJTW9kZSBjaGFuZ2VzIHVzaW5nIGZic2V0CisJPT09PT09PT09PT09PT09PT09PT09PT09CisKKwlZb3UgbWlnaHQgdXNlIGZic2V0IHRvIGNoYW5nZSB0aGUgdmlkZW8gbW9kZSwgc2VlICJtYW4gZmJzZXQiLiBDeWJsYWZiCisJZ2VuZXJhbGx5IGRvZXMgYXNzdW1lIHRoYXQgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBCdXQgaXQgZG9lcworCXNvbWUgY2hlY2tzLCBlc3BlY2lhbGx5IHRob3NlIHRoYXQgYXJlIG5lZWRlZCB0byBwcmV2ZW50IHlvdSBmcm9tCisJZGFtYWdpbmcgeW91ciBoYXJkd2FyZS4KKworCQktIG9ubHkgOCwgMTYsIDI0IGFuZCAzMiBicHAgdmlkZW8gbW9kZXMgYXJlIGFjY2VwdGVkCisJCS0gaW50ZXJsYWNlZCB2aWRlbyBtb2RlcyBhcmUgbm90IGFjY2VwdGVkCisJCS0gZG91YmxlIHNjYW4gdmlkZW8gbW9kZXMgYXJlIG5vdCBhY2NlcHRlZAorCQktIGlmIGEgZmxhdCBwYW5lbCBpcyBmb3VuZCwgY3libGFmYiBkb2VzIG5vdCBhbGxvdyB5b3UKKwkJICB0byBwcm9ncmFtIGEgcmVzb2x1dGlvbiBoaWdoZXIgdGhhbiB0aGUgcGh5c2ljYWwKKwkJICByZXNvbHV0aW9uIG9mIHRoZSBmbGF0IHBhbmVsIG1vbml0b3IKKwkJLSBjeWJsYWZiIGRvZXMgbm90IGFsbG93IHhyZXMgdG8gZGlmZmVyIGZyb20geHJlc192aXJ0dWFsCisJCS0gY3libGFmYiBkb2VzIG5vdCBhbGxvdyB2Y2xrIHRvIGV4Y2VlZCAyMzAgTUh6LiBBcyAzMiBicHAKKwkJICBhbmQgKGN1cnJlbnRseSkgMjQgYml0IG1vZGVzIHVzZSBhIGRvdWJsZWQgdmNsayBpbnRlcm5hbGx5LAorCQkgIHRoZSBkb3RjbG9jayBsaW1pdCBhcyBzZWVuIGJ5IGZic2V0IGlzIDExNSBNSHogZm9yIHRob3NlCisJCSAgbW9kZXMgYW5kIDIzMCBNSHogZm9yIDggYW5kIDE2IGJwcCBtb2Rlcy4KKworCUFueSByZXF1ZXN0IHRoYXQgdmlvbGF0ZXMgdGhlIHJ1bGVzIGdpdmVuIGFib3ZlIHdpbGwgYmUgaWdub3JlZCBhbmQKKwlmYnNldCB3aWxsIHJldHVybiBhbiBlcnJvci4KKworCUlmIHlvdSBwcm9ncmFtIGEgdmlydHVhbCB5IHJlc29sdXRpb24gaGlnaGVyIHRoYW4gdGhlIGhhcmR3YXJlIGxpbWl0LAorCWN5YmxhZmIgd2lsbCBzaWxlbnRseSBkZWNyZWFzZSB0aGF0IHZhbHVlIHRvIHRoZSBoaWdoZXN0IHBvc3NpYmxlCisJdmFsdWUuCisKKwlBdHRlbXB0cyB0byBkaXNhYmxlIGFjY2VsZXJhdGlvbiBhcmUgaWdub3JlZC4KKworCVNvbWUgdmlkZW8gbW9kZXMgdGhhdCBzaG91bGQgd29yayBkbyBub3Qgd29yayBhcyBleHBlY3RlZC4gSWYgeW91IHVzZQorCXRoZSBzdGFuZGFyZCBmYi5tb2RlcywgZmJzZXQgNjQweDQ4MC02MCB3aWxsIHByb2dyYW0gdGhhdCBtb2RlLCBidXQKKwl5b3Ugd2lsbCBzZWUgYSB2ZXJ0aWNhbCBhcmVhLCBhYm91dCB0d28gY2hhcmFjdGVycyB3aWRlLCB3aXRoIG9ubHkKKwltdWNoIGRhcmtlciBjaGFyYWN0ZXJzIHRoYW4gdGhlIG90aGVyIGNoYXJhY3RlcnMgb24gdGhlIHNjcmVlbi4KKwlDeWJsYWZiIGRvZXMgYWxsb3cgdGhhdCBtb2RlIHRvIGJlIHNldCwgYXMgaXQgZG9lcyBub3QgdmlvbGF0ZSB0aGUKKwlvZmZpY2lhbCBzcGVjaWZpY2F0aW9ucy4gSXQgd291bGQgbmVlZCBhIGxvdCBvZiBjb2RlIHRvIHJlbGlhYmx5IHNvcnQKKwlvdXQgYWxsIGludmFsaWQgbW9kZXMsIHBsYXlpbmcgYXJvdW5kIHdpdGggdGhlIG1hcmdpbiB2YWx1ZXMgd2lsbAorCWdpdmUgYSB2YWxpZCBtb2RlIHF1aWNrbHkuIEFuZCBpZiBjeWJsYWZiIHdvdWxkIGRldGVjdCBzdWNoIGFuIGludmFsaWQKKwltb2RlLCBzaG91bGQgaXQgc2lsZW50bHkgYWx0ZXIgdGhlIHJlcXVlc3RlZCB2YWx1ZXMgb3Igc2hvdWxkIGl0CisJcmVwb3J0IGFuIGVycm9yPyBCb3RoIG9wdGlvbnMgaGF2ZSBzb21lIHByb3MgYW5kIGNvbnMuIEFzIHN0YXRlZAorCWFib3ZlLCBub25lIG9mIHRoZSBzdGFydHVwIG1vZGVzIGFyZSBhZmZlY3RlZCwgYW5kIGlmIHlvdSBzZXQKKwl2ZXJib3NpdHkgdG8gMSBvciBoaWdoZXIsIGN5YmxhZmIgd2lsbCBwcmludCB0aGUgZmJzZXQgY29tbWFuZCB0aGF0CisJd291bGQgYmUgbmVlZGVkIHRvIHByb2dyYW0gdGhhdCBtb2RlIHVzaW5nIGZic2V0LgorCisKK090aGVyIFBhcmFtZXRlcnMKKz09PT09PT09PT09PT09PT0KKworCitjcnQJCWRvbid0IGF1dG9kZXRlY3QsIGFzc3VtZSBtb25pdG9yIGNvbm5lY3RlZCB0bworCQlzdGFuZGFyZCBWR0EgY29ubmVjdG9yCisKK2ZwCQlkb24ndCBhdXRvZGV0ZWN0LCBhc3N1bWUgZmxhdCBwYW5lbCBkaXNwbGF5CisJCWNvbm5lY3RlZCB0byBmbGF0IHBhbmVsIG1vbml0b3IgaW50ZXJmYWNlCisKK25hdGl2ZXggCWluZm9ybSBkcml2ZXIgYWJvdXQgbmF0aXZlIHggcmVzb2x1dGlvbiBvZgorCQlmbGF0IHBhbmVsIG1vbml0b3IgY29ubmVjdGVkIHRvIHNwZWNpYWwKKwkJaW50ZXJmYWNlIChzaG91bGQgYmUgYXV0b2RldGVjdGVkKQorCitzdHJldGNoIAlzdHJldGNoIGltYWdlIHRvIGFkYXB0IGxvdyByZXNvbHV0aW9uIG1vZGVzIHRvCisJCWhpZ2VyIHJlc29sdXRpb25zIG9mIGZsYXQgcGFuZWwgbW9uaXRvcnMKKwkJY29ubmVjdGVkIHRvIHNwZWNpYWwgaW50ZXJmYWNlCisKK2NlbnRlcgkJY2VudGVyIGltYWdlIHRvIGFkYXB0IGxvdyByZXNvbHV0aW9uIG1vZGVzIHRvCisJCWhpZ2VyIHJlc29sdXRpb25zIG9mIGZsYXQgcGFuZWwgbW9uaXRvcnMKKwkJY29ubmVjdGVkIHRvIHNwZWNpYWwgaW50ZXJmYWNlCisKK21lbXNpemUgCXVzZSBpZiBhdXRvZGV0ZWN0ZWQgbWVtc2l6ZSBpcyB3cm9uZyAuLi4KKwkJc2hvdWxkIG5ldmVyIGJlIG5lY2Vzc2FyeQorCitub3BjaXJyIAlkaXNhYmxlIFBDSSByZWFkIHJldHJ5Citub3BjaXdyIAlkaXNhYmxlIFBDSSB3cml0ZSByZXRyeQorbm9wY2lyYiAJZGlzYWJsZSBQQ0kgcmVhZCBidXJzdHMKK25vcGNpd2IgCWRpc2FibGUgUENJIHdyaXRlIGJ1cnN0cworCiticHAJCWJwcCBmb3Igc3BlY2lmaWVkIG1vZGVzCisJCXZhbGlkIHZhbHVlczogOCB8fCAxNiB8fCAyNCB8fCAzMgorCityZWYJCXJlZnJlc2ggcmF0ZSBmb3Igc3BlY2lmaWVkIG1vZGUKKwkJdmFsaWQgdmFsdWVzOiA1MCA8PSByZWYgPD0gODUKKworbW9kZQkJNjQweDQ4MCBvciA4MDB4NjAwIG9yIDEwMjR4NzY4IG9yIDEyODB4MTAyNAorCQlpZiBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhcnR1cCBtb2RlIHdpbGwgYmUgZGV0ZWN0ZWQKKwkJYW5kIHVzZWQsIHNvIHlvdSBtaWdodCBhbHNvIHVzZSB0aGUgdmdhPT8/PyBwYXJhbWV0ZXIKKwkJZGVzY3JpYmVkIGluIHZlc2FmYi50eHQuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIG1vZGUsCisJCWJwcCBhbmQgcmVmIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWQuCisKK3ZlcmJvc2l0eQkwIGlzIHRoZSBkZWZhdWx0LCBpbmNyZWFzZSB0byBhdCBsZWFzdCAyIGZvciBldmVyeQorCQlidWcgcmVwb3J0IQorCit2ZXNhZmIJCWFsbG93cyBjeWJsYWZiIHRvIGJlIGxvYWRlZCBhZnRlciB2ZXNhZmIgaGFzIGJlZW4KKwkJbG9hZGVkLiBTZWUgc2VjdGlvbnMgIk1vZHVsZSB1bmxvYWRpbmcgLi4uIi4KKworCitEZXZlbG9wbWVudCBoaW50cworPT09PT09PT09PT09PT09PT0KKworSXQncyBtdWNoIGZhc3RlciBkbyBjb21waWxlIGEgbW9kdWxlIGFuZCB0byBsb2FkIHRoZSBuZXcgdmVyc2lvbiBhZnRlcgordW5sb2FkaW5nIHRoZSBvbGQgbW9kdWxlIHRoYW4gdG8gY29tcGlsZSBhIG5ldyBrZXJuZWwgYW5kIHRvIHJlYm9vdC4gU28gaWYgeW91Cit0cnkgdG8gd29yayBvbiBjeWJsYWZiLCBpdCBtaWdodCBiZSBhIGdvb2QgaWRlYSB0byB1c2UgY3libGFmYiBhcyBhIG1vZHVsZS4KK0luIHJlYWwgbGlmZSwgZmFzdCBvZnRlbiBtZWFucyBkYW5nZXJvdXMsIGFuZCB0aGF0J3MgYWxzbyB0aGUgY2FzZSBoZXJlLiBJZgoreW91IGludHJvZHVjZSBhIHNlcmlvdXMgYnVnIHdoZW4gY3libGFmYiBpcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsIHRoZQora2VybmVsIHdpbGwgbG9jayBvciBvb3BzIHdpdGggYSBoaWdoIHByb2JhYmlsaXR5IGJlZm9yZSB0aGUgZmlsZSBzeXN0ZW0gaXMKK21vdW50ZWQsIGFuZCB0aGUgZGFuZ2VyIGZvciB5b3VyIGRhdGEgaXMgbG93LiBJZiB5b3UgbG9hZCBhIGJyb2tlbiBvd24gdmVyc2lvbgorb2YgY3libGFmYiBvbiBhIHJ1bm5pbmcgc3lzdGVtLCB0aGUgZGFuZ2VyIGZvciB0aGUgaW50ZWdyaXR5IG9mIHRoZSBmaWxlCitzeXN0ZW0gaXMgbXVjaCBoaWdoZXIgYXMgeW91IG1pZ2h0IG5lZWQgYSBoYXJkIHJlc2V0IGFmdGVyd2FyZHMuIERlY2lkZQoreW91cnNlbGYuCisKK01vZHVsZSB1bmxvYWRpbmcsIHRoZSB2ZmIgbWV0aG9kCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJZiB5b3Ugd2FudCB0byB1bmxvYWQvcmVsb2FkIGN5YmxhZmIgdXNpbmcgdGhlIHZpcnR1YWwgZnJhbWVidWZmZXIsIHlvdSBuZWVkCit0byBlbmFibGUgdmZiIHN1cHBvcnQgaW4gdGhlIGtlcm5lbCBmaXJzdC4gQWZ0ZXIgdGhhdCwgbG9hZCB0aGUgbW9kdWxlcyBhcworc2hvd24gYmVsb3c6CisKKwltb2Rwcm9iZSB2ZmIgdmZiX2VuYWJsZT0xCisJbW9kcHJvYmUgZmJjb24KKwltb2Rwcm9iZSBjeWJsYWZiCisJZmJzZXQgLWZiIC9kZXYvZmIxIDEyODB4MTAyNC02MCAtdnlyZXMgMjY2MgorCWNvbjJmYiAvZGV2L2ZiMSAvZGV2L3R0eTEKKwkuLi4KKworSWYgeW91IG5vdyBtYWRlIHNvbWUgY2hhbmdlcyB0byBjeWJsYWZiIGFuZCB3YW50IHRvIHJlbG9hZCBpdCwgeW91IG1pZ2h0IGRvIGl0CithcyBzaG93IGJlbG93OgorCisJY29uMmZiIC9kZXYvZmIwIC9kZXYvdHR5MQorCS4uLgorCXJtbW9kIGN5YmxhZmIKKwltb2Rwcm9iZSBjeWJsYWZiCisJY29uMmZiIC9kZXYvZmIxIC9kZXYvdHR5MQorCS4uLgorCitPZiBjb3Vyc2UsIHlvdSBtaWdodCBjaG9vc2UgYW5vdGhlciBtb2RlLCBhbmQgbW9zdCBjZXJ0YWlubHkgeW91IGFsc28gd2FudCB0bworbWFwIHNvbWUgb3RoZXIgL2Rldi90dHkqIHRvIHRoZSByZWFsIGZyYW1lYnVmZmVyIGRldmljZS4gWW91IG1pZ2h0IGFsc28gY2hvb3NlCit0byBjb21waWxlIGZiY29uIGFzIGEga2VybmVsIG1vZHVsZSBvciBwbGFjZSBpdCBwZXJtYW5lbnRseSBpbiB0aGUga2VybmVsLgorCitJIGRvIG5vdCBrbm93IG9mIGFueSB3YXkgdG8gdW5sb2FkIGZiY29uLCBhbmQgZmJjb24gd2lsbCBwcmV2ZW50IHRoZQorZnJhbWVidWZmZXIgZGV2aWNlIGxvYWRlZCBmaXJzdCBmcm9tIHVubG9hZGluZy4gW0lmIHRoZXJlIGlzIGEgd2F5LCB0aGVuCitwbGVhc2UgYWRkIGEgZGVzY3JpcHRpb24gaGVyZSFdCisKK01vZHVsZSB1bmxvYWRpbmcsIHRoZSB2ZXNhZmIgbWV0aG9kCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb25maWd1cmUgdGhlIGtlcm5lbDoKKworCTwqPiBTdXBwb3J0IGZvciBmcmFtZSBidWZmZXIgZGV2aWNlcworCVsqXSAgIFZFU0EgVkdBIGdyYXBoaWNzIHN1cHBvcnQKKwk8TT4gICBDeWJlcmJsYWRlL2kxIHN1cHBvcnQKKworQWRkIGUuZy4gInZpZGVvPXZlc2FmYjp5cGFuIHZnYT0weDMwNyIgdG8gdGhlIGtlcm5lbCBwYXJhbWV0ZXJzLiBUaGUgeXBhbgorcGFyYW1ldGVyIGlzIGltcG9ydGFudCwgY2hvb3NlIGFueSB2Z2EgcGFyYW1ldGVyIHlvdSBsaWtlIGFzIGxvbmcgYXMgaXQgaXMKK2EgZ3JhcGhpY3MgbW9kZS4KKworQWZ0ZXIgYm9vdGluZywgbG9hZCBjeWJsYWZiIHdpdGhvdXQgYW55IG1vZGUgYW5kIGJwcCBwYXJhbWV0ZXIgYW5kIGFzc2lnbgorY3libGFmYiB0byBpbmRpdmlkdWFsIHR0eXMgdXNpbmcgY29uMmZiLCBlLmcuOgorCisJbW9kcHJvYmUgY3libGFmYiB2ZXNhZmI9MQorCWNvbjJmYiAvZGV2L2ZiMSAvZGV2L3R0eTEKKworVW5sb2FkaW5nIGN5YmxhZmIgd29ya3Mgd2l0aG91dCBwcm9ibGVtcyBhZnRlciB5b3UgYXNzaWduIHZlc2FmYiB0byBhbGwKK3R0eXMgYWdhaW4sIGUuZy46CisKKwljb24yZmIgL2Rldi9mYjAgL2Rldi90dHkxCisJcm1tb2QgY3libGFmYgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvd2h5Y3libGFmYiBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi93aHljeWJsYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMjNiYzEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvd2h5Y3libGFmYgpAQCAtMCwwICsxLDg1IEBACitJIHRyaWVkIHRoZSBmb2xsb3dpbmcgZnJhbWVidWZmZXIgZHJpdmVyczoKKworCS0gVFJJREVOVEZCIGlzIGZ1bGwgb2YgYnVncy4gQWNjZWxlcmF0aW9uIGlzIGJyb2tlbiBmb3IgQmxhZGUzRAorCSAgZ3JhcGhpY3MgY29yZXMgbGlrZSB0aGUgY3liZXJibGFkZS9pMS4gSXQgY2xhaW1zIHRvIHN1cHBvcnQgYSBncmVhdAorCSAgbnVtYmVyIG9mIGRldmljZXMsIGJ1dCBkb2N1bWVudGF0aW9uIGZvciBtb3N0IG9mIHRoZXNlIGRldmljZXMgaXMKKwkgIHVuZm9ydHVuYXRlbHkgbm90IGF2YWlsYWJsZS4gVGhlcmUgaXMgX25vXyByZWFzb24gdG8gdXNlIHRyaWRlbnRmYgorCSAgZm9yIGN5YmVyYmxhZGUvaTEgKyBDUlQgdXNlcnMuIFZFU0FGQiBpcyBmYXN0ZXIsIGFuZCB0aGUgb25lCisJICBhZHZhbnRhZ2UsIG1vZGUgc3dpdGNoaW5nLCBpcyBicm9rZW4gaW4gdHJpZGVudGZiLgorCisJLSBWRVNBRkIgaXMgdXNlZCBieSBtYW55IGRpc3RyaWJ1dGlvbnMgYXMgYSBzdGFuZGFyZC4gVmVzYWZiIGRvZXMKKwkgIG5vdCBzdXBwb3J0IG1vZGUgc3dpdGNoaW5nLiBWRVNBRkIgaXMgYSBiaXQgZmFzdGVyIHRoYW4gdGhlIHdvcmtpbmcKKwkgIGNvbmZpZ3VyYXRpb25zIG9mIFRSSURFTlRGQiwgYnV0IGl0IGlzIHN0aWxsIHRvbyBzbG93LCBldmVuIGlmIHlvdQorCSAgdXNlIHlwYW4uCisKKwktIEVQSUFGQiAoeW91J2xsIGZpbmQgaXQgb24gc291cmNlZm9yZ2UpIHN1cHBvcnRzIHRoZSBDeWJlcmJsYWRlL2kxCisJICBncmFwaGljcyBjb3JlLCBidXQgaXQgc3RpbGwgaGFzIHNlcmlvdXMgYnVncyBhbmQgZGV2ZWxvcGVtZW50IHNlZW1zCisJICB0byBoYXZlIHN0b3BwZWQuIFRoaXMgaXMgdGhlIG9uZSBkcml2ZXIgd2l0aCBUVi1vdXQgc3VwcG9ydC4gSWYgeW91CisJICBkbyBuZWVkIHRoaXMgZmVhdHVyZSwgdHJ5IGVwaWFmYi4KKworTm9uZSBvZiB0aGVzZSBkcml2ZXJzIHdhcyBhIHJlYWwgb3B0aW9uIGZvciBtZS4KKworSSBiZWxpZXZlIHRoYXQgaXMgdW5yZWFzb25hYmxlIHRvIGNoYW5nZSBjb2RlIHRoYXQgYW5ub3VuY2VzIHRvIHN1cHBvcnQgMjAKK2RldmljZXMgaWYgSSBvbmx5IGhhdmUgbW9yZSBvciBsZXNzIHN1ZmZpY2llbnQgZG9jdW1lbnRhdGlvbiBmb3IgZXhhY3RseSBvbmUKK29mIHRoZXNlLiBUaGUgcmlzayBvZiBicmVha2luZyBkZXZpY2UgZm9vIHdoaWxlIGZpeGluZyBkZXZpY2UgYmFyIGlzIHRvbyBoaWdoLgorCitTbyBJIGRlY2lkZWQgdG8gc3RhcnQgQ3lCbGFGQiBhcyBhIHN0cmlwcGVkIGRvd24gdHJpZGVudGZiLgorCitBbGwgY29kZSBzcGVjaWZpYyB0byBvdGhlciBUcmlkZW50IGNoaXBzIGhhcyBiZWVuIHJlbW92ZWQuIEFmdGVyIHRoYXQgdGhlcmUKK3dlcmUgYSBsb3Qgb2YgY29zbWV0aWMgY2hhbmdlcyB0byBpbmNyZWFzZSB0aGUgcmVhZGFiaWxpdHkgb2YgdGhlIGNvZGUuIEFsbAorcmVnaXN0ZXIgbmFtZXMgd2VyZSBjaGFuZ2VkIHRvIHRob3NlIG1uZW1vbmljcyB1c2VkIGluIHRoZSBkYXRhc2hlZXQuIEZ1bmN0aW9uCithbmQgbWFjcm8gbmFtZXMgd2VyZSBjaGFuZ2VkIGlmIHRoZXkgaGluZGVyZWQgZWFzeSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBjb2RlLgorCitBZnRlciB0aGF0IEkgZGVidWdnZWQgdGhlIGNvZGUgYW5kIGltcGxlbWVudGVkIHNvbWUgbmV3IGZlYXR1cmVzLiBJJ2xsIHRyeSB0bworZ2l2ZSBhIGxpdHRsZSBzdW1tYXJ5IG9mIHRoZSBtYWluIGNoYW5nZXM6CisKKwktIGNhbGN1bGF0aW9uIG9mIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHRpbWluZ3Mgd2FzIGZpeGVkCisKKwktIHZpZGVvIHNpZ25hbCBxdWFsaXR5IGhhcyBiZWVuIGltcHJvdmVkIGRyYW1hdGljYWxseQorCisJLSBhY2NlbGVyYXRpb246CisKKwkJLSBmaWxscmVjdCBhbmQgY29weWFyZWEgd2VyZSBmaXhlZCBhbmQgcmVlbmFibGVkCisKKwkJLSBjb2xvciBleHBhbmRpbmcgaW1hZ2VibGl0IHdhcyBuZXdseSBpbXBsZW1lbnRlZCwgY29sb3IKKwkJICBpbWFnZWJsaXQgKG9ubHkgdXNlZCB0byBkcmF3IHRoZSBwZW5ndWluZSkgc3RpbGwgdXNlcyB0aGUKKwkJICBnZW5lcmljIGNvZGUuCisKKwkJLSBpbml0IG9mIHRoZSBhY2NlbGVyYXRpb24gZW5naW5lIHdhcyBpbXByb3ZlZCBhbmQgbW92ZWQgdG8gYQorCQkgIHBsYWNlIHdoZXJlIGl0IHJlYWxseSB3b3JrcyAuLi4KKworCQktIHN5bmMgZnVuY3Rpb24gaGFzIGEgdGltZW91dCBub3cgYW5kIHRyaWVzIHRvIHJlc2V0IGFuZAorCQkgIHJlaW5pdCB0aGUgYWNjZWwgZW5naW5lIGlmIG5lY2Vzc2FyeQorCisJCS0gZmV3ZXIgc2xvdyBjb3B5YXJlYSBjYWxscyB3aGVuIGRvaW5nIHlwYW4gc2Nyb2xsaW5nIGJ5IHVzaW5nCisJCSAgdW5kb2N1bWVudGVkIGJpdCBkMjEgb2Ygc2NyZWVuIHN0YXJ0IGFkZHJlc3Mgc3RvcmVkIGluCisJCSAgQ1IyQls1XS4gQklPUyBkb2VzIHVzZSBpdCBhbHNvLCBzbyB0aGlzIHNob3VsZCBiZSBzYWZlLgorCisJLSBjeWJsYWZiIHJlamVjdHMgYW55IGF0dGVtcHQgdG8gc2V0IG1vZGVzIHRoYXQgd291bGQgY2F1c2UgdmNsaworCSAgdmFsdWVzIGFib3ZlIHJlYXNvbmFibGUgMjMwIE1Iei4gMzJiaXQgbW9kZXMgdXNlIGEgY2xvY2sKKwkgIG11bHRpcGxpY2F0b3Igb2YgMiwgc28gZmJzZXQgZG9lcyBzaG93IHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IKKwkgIHBpeGNsb2NrIGJ1dCBub3QgZm9yIHZjbGsgaW4gdGhpcyBjYXNlLiBUaGUgZmJzZXQgbGltaXQgaXMgMTE1IE1IegorCSAgZm9yIDMyIGJwcCBtb2Rlcy4KKworCS0gY3libGFmYiByZWplY3RzIG1vZGVzIGtub3duIHRvIGJlIGJyb2tlbiBvciB1bmltcGxlbWVudGVkIChhbGwKKwkgIGludGVybGFjZWQgbW9kZXMsIGFsbCBkb3VibGVzY2FuIG1vZGVzIGZvciBub3cpCisKKwktIGN5YmxhZmIgbm93IHdvcmtzIGluZGVwZW5kYW50IG9mIHRoZSB2aWRlbyBtb2RlIGluIGVmZmVjdCBhdCBzdGFydHVwCisJICB0aW1lICh0cmlkZW50ZmIgZG9lcyBub3QgaW5pdCBhbGwgbmVlZGVkIHJlZ2lzdGVycyB0byByZWFzb25hYmxlCisJICB2YWx1ZXMpCisKKwktIHN3aXRjaGluZyBiZXR3ZWVuIHZpZGVvIG1vZGVzIGRvZXMgd29yayByZWxpYWJseSBub3cKKworCS0gdGhlIGZpcnN0IHZpZGVvIG1vZGUgbm93IGlzIHRoZSBvbmUgc2VsZWN0ZWQgb24gc3RhcnR1cCB1c2luZyB0aGUKKwkgIHZnYT0/Pz8/IG1lY2hhbmlzbSBvciBhbnkgb2YKKwkJLSA2NDB4NDgwLCA4MDB4NjAwLCAxMDI0eDc2OCwgMTI4MHgxMDI0CisJCS0gOCwgMTYsIDI0IG9yIDMyIGJwcAorCQktIHJlZnJlc2ggYmV0d2VlbiA1MCBIeiBhbmQgODUgSHosIDEgSHogc3RlcHMgKDEyODB4MTAyNC0zMgorCQkgIGlzIGxpbWl0ZWQgdG8gNjNIeikKKworCS0gcGNpIHJldHJ5IGFuZCBwY2kgYnVyc3QgbW9kZSBhcmUgc2V0dGFibGUgKHRyeSB0byBkaXNhYmxlIGlmIHlvdQorCSAgZXhwZXJpZW5jZSBsYXRlbmN5IHByb2JsZW1zKQorCisJLSBidWlsdCBhcyBhIG1vZHVsZSBjeWJsYWZiIG1pZ2h0IGJlIHVubG9hZGVkIGFuZCByZWxvYWRlZCB1c2luZworCSAgdGhlIHZmYiBtb2R1bGUgYW5kIGNvbjJ2dCBvciBtaWdodCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggdmVzYWZiCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvbW9kZWRiLnR4dCBiL0RvY3VtZW50YXRpb24vZmIvbW9kZWRiLnR4dAppbmRleCBlMDQ0NThiMy4uNGZjZGI0YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYi9tb2RlZGIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmIvbW9kZWRiLnR4dApAQCAtMjAsMTIgKzIwLDgzIEBACiAKIFZhbGlkIG1vZGUgc3BlY2lmaWVycyAobW9kZV9vcHRpb24gYXJndW1lbnQpOgogCi0gICAgPHhyZXM+eDx5cmVzPlstPGJwcD5dW0A8cmVmcmVzaD5dCisgICAgPHhyZXM+eDx5cmVzPltNXVtSXVstPGJwcD5dW0A8cmVmcmVzaD5dW2ldW21dCiAgICAgPG5hbWU+Wy08YnBwPl1bQDxyZWZyZXNoPl0KIAogd2l0aCA8eHJlcz4sIDx5cmVzPiwgPGJwcD4gYW5kIDxyZWZyZXNoPiBkZWNpbWFsIG51bWJlcnMgYW5kIDxuYW1lPiBhIHN0cmluZy4KIFRoaW5ncyBiZXR3ZWVuIHNxdWFyZSBicmFja2V0cyBhcmUgb3B0aW9uYWwuCiAKK0lmICdNJyBpcyBzcGVjaWZpZWQgaW4gdGhlIG1vZGVfb3B0aW9uIGFyZ3VtZW50IChhZnRlciA8eXJlcz4gYW5kIGJlZm9yZQorPGJwcD4gYW5kIDxyZWZyZXNoPiwgaWYgc3BlY2lmaWVkKSB0aGUgdGltaW5ncyB3aWxsIGJlIGNhbGN1bGF0ZWQgdXNpbmcKK1ZFU0EoVE0pIENvb3JkaW5hdGVkIFZpZGVvIFRpbWluZ3MgaW5zdGVhZCBvZiBsb29raW5nIHVwIHRoZSBtb2RlIGZyb20gYSB0YWJsZS4KK0lmICdSJyBpcyBzcGVjaWZpZWQsIGRvIGEgJ3JlZHVjZWQgYmxhbmtpbmcnIGNhbGN1bGF0aW9uIGZvciBkaWdpdGFsIGRpc3BsYXlzLgorSWYgJ2knIGlzIHNwZWNpZmllZCwgY2FsY3VsYXRlIGZvciBhbiBpbnRlcmxhY2VkIG1vZGUuICBBbmQgaWYgJ20nIGlzCitzcGVjaWZpZWQsIGFkZCBtYXJnaW5zIHRvIHRoZSBjYWxjdWxhdGlvbiAoMS44JSBvZiB4cmVzIHJvdW5kZWQgZG93biB0byA4CitwaXhlbHMgYW5kIDEuOCUgb2YgeXJlcykuCisKKyAgICAgICBTYW1wbGUgdXNhZ2U6IDEwMjR4NzY4TUA2MG0gLSBDVlQgdGltaW5nIHdpdGggbWFyZ2lucworCisqKioqKiBvT28gKioqKiogb09vICoqKioqIG9PbyAqKioqKiBvT28gKioqKiogb09vICoqKioqIG9PbyAqKioqKiBvT28gKioqKioKKworV2hhdCBpcyB0aGUgVkVTQShUTSkgQ29vcmRpbmF0ZWQgVmlkZW8gVGltaW5ncyAoQ1ZUKT8KKworRnJvbSB0aGUgVkVTQShUTSkgV2Vic2l0ZToKKworICAgICAiVGhlIHB1cnBvc2Ugb2YgQ1ZUIGlzIHRvIHByb3ZpZGUgYSBtZXRob2QgZm9yIGdlbmVyYXRpbmcgYSBjb25zaXN0ZW50CisgICAgICBhbmQgY29vcmRpbmF0ZWQgc2V0IG9mIHN0YW5kYXJkIGZvcm1hdHMsIGRpc3BsYXkgcmVmcmVzaCByYXRlcywgYW5kCisgICAgICB0aW1pbmcgc3BlY2lmaWNhdGlvbnMgZm9yIGNvbXB1dGVyIGRpc3BsYXkgcHJvZHVjdHMsIGJvdGggdGhvc2UKKyAgICAgIGVtcGxveWluZyBDUlRzLCBhbmQgdGhvc2UgdXNpbmcgb3RoZXIgZGlzcGxheSB0ZWNobm9sb2dpZXMuIFRoZQorICAgICAgaW50ZW50aW9uIG9mIENWVCBpcyB0byBnaXZlIGJvdGggc291cmNlIGFuZCBkaXNwbGF5IG1hbnVmYWN0dXJlcnMgYQorICAgICAgY29tbW9uIHNldCBvZiB0b29scyB0byBlbmFibGUgbmV3IHRpbWluZ3MgdG8gYmUgZGV2ZWxvcGVkIGluIGEKKyAgICAgIGNvbnNpc3RlbnQgbWFubmVyIHRoYXQgZW5zdXJlcyBncmVhdGVyIGNvbXBhdGliaWxpdHkuIgorCitUaGlzIGlzIHRoZSB0aGlyZCBzdGFuZGFyZCBhcHByb3ZlZCBieSBWRVNBKFRNKSBjb25jZXJuaW5nIHZpZGVvIHRpbWluZ3MuICBUaGUKK2ZpcnN0IHdhcyB0aGUgRGlzY3JldGUgVmlkZW8gVGltaW5ncyAoRFZUKSB3aGljaCBpcyAgYSBjb2xsZWN0aW9uIG9mCitwcmUtZGVmaW5lZCBtb2RlcyBhcHByb3ZlZCBieSBWRVNBKFRNKS4gIFRoZSBzZWNvbmQgaXMgdGhlIEdlbmVyYWxpemVkIFRpbWluZworRm9ybXVsYSAoR1RGKSB3aGljaCBpcyBhbiBhbGdvcml0aG0gdG8gY2FsY3VsYXRlIHRoZSB0aW1pbmdzLCBnaXZlbiB0aGUKK3BpeGVsY2xvY2ssIHRoZSBob3Jpem9udGFsIHN5bmMgZnJlcXVlbmN5LCBvciB0aGUgdmVydGljYWwgcmVmcmVzaCByYXRlLgorCitUaGUgR1RGIGlzIGxpbWl0ZWQgYnkgdGhlIGZhY3QgdGhhdCBpdCBpcyBkZXNpZ25lZCBtYWlubHkgZm9yIENSVCBkaXNwbGF5cy4KK0l0IGFydGlmaWNpYWxseSBpbmNyZWFzZXMgdGhlIHBpeGVsY2xvY2sgYmVjYXVzZSBvZiBpdHMgaGlnaCBibGFua2luZworcmVxdWlyZW1lbnQuIFRoaXMgaXMgaW5hcHByb3ByaWF0ZSBmb3IgZGlnaXRhbCBkaXNwbGF5IGludGVyZmFjZSB3aXRoIGl0cyBoaWdoCitkYXRhIHJhdGUgd2hpY2ggcmVxdWlyZXMgdGhhdCBpdCBjb25zZXJ2ZXMgdGhlIHBpeGVsY2xvY2sgYXMgbXVjaCBhcyBwb3NzaWJsZS4KK0Fsc28sIEdURiBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBkaXNwbGF5LgorCitUaGUgQ1ZUIGFkZHJlc3NlcyB0aGVzZSBsaW1pdGF0aW9ucy4gIElmIHVzZWQgd2l0aCBDUlQncywgdGhlIGZvcm11bGEgdXNlZAoraXMgYSBkZXJpdmF0aW9uIG9mIEdURiB3aXRoIGEgZmV3IG1vZGlmaWNhdGlvbnMuICBJZiB1c2VkIHdpdGggZGlnaXRhbAorZGlzcGxheXMsIHRoZSAicmVkdWNlZCBibGFua2luZyIgY2FsY3VsYXRpb24gY2FuIGJlIHVzZWQuCisKK0Zyb20gdGhlIGZyYW1lYnVmZmVyIHN1YnN5c3RlbSBwZXJzcGVjdGl2ZSwgbmV3IGZvcm1hdHMgbmVlZCBub3QgYmUgYWRkZWQKK3RvIHRoZSBnbG9iYWwgbW9kZSBkYXRhYmFzZSB3aGVuZXZlciBhIG5ldyBtb2RlIGlzIHJlbGVhc2VkIGJ5IGRpc3BsYXkKK21hbnVmYWN0dXJlcnMuIFNwZWNpZnlpbmcgZm9yIENWVCB3aWxsIHdvcmsgZm9yIG1vc3QsIGlmIG5vdCBhbGwsIHJlbGF0aXZlbHkKK25ldyBDUlQgZGlzcGxheXMgYW5kIHByb2JhYmx5IHdpdGggbW9zdCBmbGF0cGFuZWxzLCBpZiAncmVkdWNlZCBibGFua2luZycKK2NhbGN1bGF0aW9uIGlzIHNwZWNpZmllZC4gIChUaGUgQ1ZUIGNvbXBhdGliaWxpdHkgb2YgdGhlIGRpc3BsYXkgY2FuIGJlCitkZXRlcm1pbmVkIGZyb20gaXRzIEVESUQuIFRoZSB2ZXJzaW9uIDEuMyBvZiB0aGUgRURJRCBoYXMgZXh0cmEgMTI4LWJ5dGUKK2Jsb2NrcyB3aGVyZSBhZGRpdGlvbmFsIHRpbWluZyBpbmZvcm1hdGlvbiBpcyBwbGFjZWQuICBBcyBvZiB0aGlzIHRpbWUsIHRoZXJlCitpcyBubyBzdXBwb3J0IHlldCBpbiB0aGUgbGF5ZXIgdG8gcGFyc2UgdGhpcyBhZGRpdGlvbmFsIGJsb2Nrcy4pCisKK0NWVCBhbHNvIGludHJvZHVjZWQgYSBuZXcgbmFtaW5nIGNvbnZlbnRpb24gKHNob3VsZCBiZSBzZWVuIGZyb20gZG1lc2cgb3V0cHV0KToKKworICAgIDxwaXg+TTxhPlstUl0KKworICAgIHdoZXJlOiBwaXggPSB0b3RhbCBhbW91bnQgb2YgcGl4ZWxzIGluIE1CICh4cmVzIHggeXJlcykKKyAgICAgICAgICAgTSAgID0gYWx3YXlzIHByZXNlbnQKKyAgICAgICAgICAgYSAgID0gYXNwZWN0IHJhdGlvICgzIC0gNDozOyA0IC0gNTo0OyA5IC0gMTU6OSwgMTY6OTsgQSAtIDE2OjEwKQorICAgICAgICAgIC1SICAgPSByZWR1Y2VkIGJsYW5raW5nCisKKwkgIGV4YW1wbGU6ICAuNDhNMy1SIC0gODAweDYwMCB3aXRoIHJlZHVjZWQgYmxhbmtpbmcKKworTm90ZTogVkVTQShUTSkgaGFzIHJlc3RyaWN0aW9ucyBvbiB3aGF0IGlzIGEgc3RhbmRhcmQgQ1ZUIHRpbWluZzoKKworICAgICAgLSBhc3BlY3QgcmF0aW8gY2FuIG9ubHkgYmUgb25lIG9mIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICAgIC0gYWNjZXB0YWJsZSByZWZyZXNoIHJhdGVzIGFyZSA1MCwgNjAsIDcwIG9yIDg1IEh6IG9ubHkKKyAgICAgIC0gaWYgcmVkdWNlZCBibGFua2luZywgdGhlIHJlZnJlc2ggcmF0ZSBtdXN0IGJlIGF0IDYwSHoKKworSWYgb25lIG9mIHRoZSBhYm92ZSBhcmUgbm90IHNhdGlzZmllZCwgdGhlIGtlcm5lbCB3aWxsIHByaW50IGEgd2FybmluZyBidXQgdGhlCit0aW1pbmdzIHdpbGwgc3RpbGwgYmUgY2FsY3VsYXRlZC4KKworKioqKiogb09vICoqKioqIG9PbyAqKioqKiBvT28gKioqKiogb09vICoqKioqIG9PbyAqKioqKiBvT28gKioqKiogb09vICoqKioqCisKIFRvIGZpbmQgYSBzdWl0YWJsZSB2aWRlbyBtb2RlLCB5b3UganVzdCBjYWxsCiAKIGludCBfX2luaXQgZmJfZmluZF9tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CmluZGV4IDA2NjVjYjEuLjc4NGUwOGMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKQEAgLTE3LDIzICsxNyw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OglBQ1BJIFM0YmlvcyBzdXBwb3J0Ci1XaGVuOglNYXkgMjAwNQotV2h5OglOb29uZSB1c2VzIGl0LCBhbmQgaXQgcHJvYmFibHkgZG9lcyBub3Qgd29yaywgYW55d2F5LiBzd3N1c3AgaXMKLQlmYXN0ZXIsIG1vcmUgcmVsaWFibGUsIGFuZCBwZW9wbGUgYXJlIGFjdHVhbGx5IHVzaW5nIGl0LgotV2hvOglQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1XaGF0OglQQ0kgTmFtZSBEYXRhYmFzZSAoQ09ORklHX1BDSV9OQU1FUykKLVdoZW46CUp1bHkgMjAwNQotV2h5OglJdCBibG9hdHMgdGhlIGtlcm5lbCB1bm5lY2Vzc2FyaWx5LCBhbmQgaXMgaGFuZGxlZCBieSB1c2Vyc3BhY2UgYmV0dGVyCi0JKHBjaXV0aWxzIHN1cHBvcnRzIGl0LikgIFdpbGwgZWxpbWluYXRlIHRoZSBuZWVkIHRvIHRyeSB0byBrZWVwIHRoZQotCXBjaS5pZHMgZmlsZSBpbiBzeW5jIHdpdGggdGhlIHNmLm5ldCBkYXRhYmFzZSBhbGwgb2YgdGhlIHRpbWUuCi1XaG86CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0Oglpb19yZW1hcF9wYWdlX3JhbmdlKCkgKG1hY3JvIG9yIGZ1bmN0aW9uKQogV2hlbjoJU2VwdGVtYmVyIDIwMDUKIFdoeToJUmVwbGFjZWQgYnkgaW9fcmVtYXBfcGZuX3JhbmdlKCkgd2hpY2ggYWxsb3dzIG1vcmUgbWVtb3J5IHNwYWNlCkBAIC01MSwxNCArMzQsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKCkgLyB1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbigpCi1XaGVuOglBcHJpbCAyMDA1Ci1XaHk6CVJlcGxhY2VkIGJ5IC0+Y29tcGF0X2lvY3RsIGluIGZpbGVfb3BlcmF0aW9ucyBhbmQgb3RoZXIgbWV0aG9kCi0JdmVjb3JzLgotV2hvOglBbmRpIEtsZWVuIDxha0BtdWMuZGU+LCBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIFdoYXQ6CVJDVSBBUEkgbW92ZXMgdG8gRVhQT1JUX1NZTUJPTF9HUEwKIFdoZW46CUFwcmlsIDIwMDYKIEZpbGVzOglpbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgsIGtlcm5lbC9yY3VwZGF0ZS5jCkBAIC03NCwxNCArNDksNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJcmVtb3ZlIHZlcmlmeV9hcmVhKCkKLVdoZW46CUp1bHkgMjAwNgotRmlsZXM6CVZhcmlvdXMgdWFjY2Vzcy5oIGhlYWRlcnMuCi1XaHk6CURlcHJlY2F0ZWQgYW5kIHJlZHVuZGFudC4gYWNjZXNzX29rKCkgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KLVdobzoJSmVzcGVyIEp1aGwgPGp1aGwtbGttbEBkaWYuZGs+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglJRUVFMTM5NCBBdWRpbyBhbmQgTXVzaWMgRGF0YSBUcmFuc21pc3Npb24gUHJvdG9jb2wgZHJpdmVyLAogCUNvbm5lY3Rpb24gTWFuYWdlbWVudCBQcm9jZWR1cmVzIGRyaXZlcgogV2hlbjoJTm92ZW1iZXIgMjAwNQpAQCAtMTAyLDE2ICs2OSw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OglyZWdpc3Rlcl9zZXJpYWwvdW5yZWdpc3Rlcl9zZXJpYWwKLVdoZW46CVNlcHRlbWJlciAyMDA1Ci1XaHk6CVRoaXMgaW50ZXJmYWNlIGRvZXMgbm90IGFsbG93IHNlcmlhbCBwb3J0cyB0byBiZSByZWdpc3RlcmVkIGFnYWluc3QKLQlhIHN0cnVjdCBkZXZpY2UsIGFuZCBhcyBzdWNoIGRvZXMgbm90IGFsbG93IGNvcnJlY3QgcG93ZXIgbWFuYWdlbWVudAotCW9mIHN1Y2ggcG9ydHMuICA4MjUwLWJhc2VkIHBvcnRzIHNob3VsZCB1c2Ugc2VyaWFsODI1MF9yZWdpc3Rlcl9wb3J0Ci0JYW5kIHNlcmlhbDgyNTBfdW5yZWdpc3Rlcl9wb3J0LCBvciBwbGF0Zm9ybSBkZXZpY2VzIGluc3RlYWQuCi1XaG86CVJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglpMmMgc3lzZnMgbmFtZSBjaGFuZ2U6IGluMV9yZWYsIHZpZCBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBjcHUwX3ZpZAogV2hlbjoJTm92ZW1iZXIgMjAwNQogRmlsZXM6CWRyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjUuYywgZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyNi5jCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2ZpbGVzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZmlsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjA2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2ZpbGVzLnR4dApAQCAtMCwwICsxLDEyMyBAQAorRmlsZSBtYW5hZ2VtZW50IGluIHRoZSBMaW51eCBrZXJuZWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyBsb2NraW5nIGZvciBmaWxlcyAoc3RydWN0IGZpbGUpCithbmQgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIChzdHJ1Y3QgZmlsZXMpIHdvcmtzLgorCitVcCB1bnRpbCAyLjYuMTIsIHRoZSBmaWxlIGRlc2NyaXB0b3IgdGFibGUgaGFzIGJlZW4gcHJvdGVjdGVkCit3aXRoIGEgbG9jayAoZmlsZXMtPmZpbGVfbG9jaykgYW5kIHJlZmVyZW5jZSBjb3VudCAoZmlsZXMtPmNvdW50KS4KKy0+ZmlsZV9sb2NrIHByb3RlY3RlZCBhY2Nlc3NlcyB0byBhbGwgdGhlIGZpbGUgcmVsYXRlZCBmaWVsZHMKK29mIHRoZSB0YWJsZS4gLT5jb3VudCB3YXMgdXNlZCBmb3Igc2hhcmluZyB0aGUgZmlsZSBkZXNjcmlwdG9yCit0YWJsZSBiZXR3ZWVuIHRhc2tzIGNsb25lZCB3aXRoIENMT05FX0ZJTEVTIGZsYWcuIFR5cGljYWxseQordGhpcyB3b3VsZCBiZSB0aGUgY2FzZSBmb3IgcG9zaXggdGhyZWFkcy4gQXMgd2l0aCB0aGUgY29tbW9uCityZWZjb3VudGluZyBtb2RlbCBpbiB0aGUga2VybmVsLCB0aGUgbGFzdCB0YXNrIGRvaW5nCithIHB1dF9maWxlc19zdHJ1Y3QoKSBmcmVlcyB0aGUgZmlsZSBkZXNjcmlwdG9yIChmZCkgdGFibGUuCitUaGUgZmlsZXMgKHN0cnVjdCBmaWxlKSB0aGVtc2VsdmVzIGFyZSBwcm90ZWN0ZWQgdXNpbmcKK3JlZmVyZW5jZSBjb3VudCAoLT5mX2NvdW50KS4KKworSW4gdGhlIG5ldyBsb2NrLWZyZWUgbW9kZWwgb2YgZmlsZSBkZXNjcmlwdG9yIG1hbmFnZW1lbnQsCit0aGUgcmVmZXJlbmNlIGNvdW50aW5nIGlzIHNpbWlsYXIsIGJ1dCB0aGUgbG9ja2luZyBpcworYmFzZWQgb24gUkNVLiBUaGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIGNvbnRhaW5zIG11bHRpcGxlCitlbGVtZW50cyAtIHRoZSBmZCBzZXRzIChvcGVuX2ZkcyBhbmQgY2xvc2Vfb25fZXhlYywgdGhlCithcnJheSBvZiBmaWxlIHBvaW50ZXJzLCB0aGUgc2l6ZXMgb2YgdGhlIHNldHMgYW5kIHRoZSBhcnJheQorZXRjLikuIEluIG9yZGVyIGZvciB0aGUgdXBkYXRlcyB0byBhcHBlYXIgYXRvbWljIHRvCithIGxvY2stZnJlZSByZWFkZXIsIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIGZpbGUgZGVzY3JpcHRvcgordGFibGUgYXJlIGluIGEgc2VwYXJhdGUgc3RydWN0dXJlIC0gc3RydWN0IGZkdGFibGUuCitmaWxlc19zdHJ1Y3QgY29udGFpbnMgYSBwb2ludGVyIHRvIHN0cnVjdCBmZHRhYmxlIHRocm91Z2gKK3doaWNoIHRoZSBhY3R1YWwgZmQgdGFibGUgaXMgYWNjZXNzZWQuIEluaXRpYWxseSB0aGUKK2ZkdGFibGUgaXMgZW1iZWRkZWQgaW4gZmlsZXNfc3RydWN0IGl0c2VsZi4gT24gYSBzdWJzZXF1ZW50CitleHBhbnNpb24gb2YgZmR0YWJsZSwgYSBuZXcgZmR0YWJsZSBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkCithbmQgZmlsZXMtPmZkdGFiIHBvaW50cyB0byB0aGUgbmV3IHN0cnVjdHVyZS4gVGhlIGZkdGFibGUKK3N0cnVjdHVyZSBpcyBmcmVlZCB3aXRoIFJDVSBhbmQgbG9jay1mcmVlIHJlYWRlcnMgZWl0aGVyCitzZWUgdGhlIG9sZCBmZHRhYmxlIG9yIHRoZSBuZXcgZmR0YWJsZSBtYWtpbmcgdGhlIHVwZGF0ZQorYXBwZWFyIGF0b21pYy4gSGVyZSBhcmUgdGhlIGxvY2tpbmcgcnVsZXMgZm9yCit0aGUgZmR0YWJsZSBzdHJ1Y3R1cmUgLQorCisxLiBBbGwgcmVmZXJlbmNlcyB0byB0aGUgZmR0YWJsZSBtdXN0IGJlIGRvbmUgdGhyb3VnaAorICAgdGhlIGZpbGVzX2ZkdGFibGUoKSBtYWNybyA6CisKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCisJcmN1X3JlYWRfbG9jaygpOworCisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJLi4uLgorCWlmIChuIDw9IGZkdC0+bWF4X2ZkcykKKwkJLi4uLgorCS4uLgorCXJjdV9yZWFkX3VubG9jaygpOworCisgICBmaWxlc19mZHRhYmxlKCkgdXNlcyByY3VfZGVyZWZlcmVuY2UoKSBtYWNybyB3aGljaCB0YWtlcyBjYXJlIG9mCisgICB0aGUgbWVtb3J5IGJhcnJpZXIgcmVxdWlyZW1lbnRzIGZvciBsb2NrLWZyZWUgZGVyZWZlcmVuY2UuCisgICBUaGUgZmR0YWJsZSBwb2ludGVyIG11c3QgYmUgcmVhZCB3aXRoaW4gdGhlIHJlYWQtc2lkZQorICAgY3JpdGljYWwgc2VjdGlvbi4KKworMi4gUmVhZGluZyBvZiB0aGUgZmR0YWJsZSBhcyBkZXNjcmliZWQgYWJvdmUgbXVzdCBiZSBwcm90ZWN0ZWQKKyAgIGJ5IHJjdV9yZWFkX2xvY2soKS9yY3VfcmVhZF91bmxvY2soKS4KKworMy4gRm9yIGFueSB1cGRhdGUgdG8gdGhlIHRoZSBmZCB0YWJsZSwgZmlsZXMtPmZpbGVfbG9jayBtdXN0CisgICBiZSBoZWxkLgorCis0LiBUbyBsb29rIHVwIHRoZSBmaWxlIHN0cnVjdHVyZSBnaXZlbiBhbiBmZCwgYSByZWFkZXIKKyAgIG11c3QgdXNlIGVpdGhlciBmY2hlY2soKSBvciBmY2hlY2tfZmlsZXMoKSBBUElzLiBUaGVzZQorICAgdGFrZSBjYXJlIG9mIGJhcnJpZXIgcmVxdWlyZW1lbnRzIGR1ZSB0byBsb2NrLWZyZWUgbG9va3VwLgorICAgQW4gZXhhbXBsZSA6CisKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlmaWxlID0gZmNoZWNrKGZkKTsKKwlpZiAoZmlsZSkgeworCQkuLi4KKwl9CisJLi4uLgorCXJjdV9yZWFkX3VubG9jaygpOworCis1LiBIYW5kbGluZyBvZiB0aGUgZmlsZSBzdHJ1Y3R1cmVzIGlzIHNwZWNpYWwuIFNpbmNlIHRoZSBsb29rLXVwCisgICBvZiB0aGUgZmQgKGZnZXQoKS9mZ2V0X2xpZ2h0KCkpIGFyZSBsb2NrLWZyZWUsIGl0IGlzIHBvc3NpYmxlCisgICB0aGF0IGxvb2stdXAgbWF5IHJhY2Ugd2l0aCB0aGUgbGFzdCBwdXQoKSBvcGVyYXRpb24gb24gdGhlCisgICBmaWxlIHN0cnVjdHVyZS4gVGhpcyBpcyBhdm9pZGVkIHVzaW5nIHRoZSByY3VyZWYgQVBJcworICAgb24gLT5mX2NvdW50IDoKKworCXJjdV9yZWFkX2xvY2soKTsKKwlmaWxlID0gZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCk7CisJaWYgKGZpbGUpIHsKKwkJaWYgKHJjdXJlZl9pbmNfbGYoJmZpbGUtPmZfY291bnQpKQorCQkJKmZwdXRfbmVlZGVkID0gMTsKKwkJZWxzZQorCQkvKiBEaWRuJ3QgZ2V0IHRoZSByZWZlcmVuY2UsIHNvbWVvbmUncyBmcmVlZCAqLworCQkJZmlsZSA9IE5VTEw7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCS4uLi4KKwlyZXR1cm4gZmlsZTsKKworICAgcmN1cmVmX2luY19sZigpIGRldGVjdHMgaWYgcmVmY291bnRzIGlzIGFscmVhZHkgemVybyBvcgorICAgZ29lcyB0byB6ZXJvIGR1cmluZyBpbmNyZW1lbnQuIElmIGl0IGRvZXMsIHdlIGZhaWwKKyAgIGZnZXQoKS9mZ2V0X2xpZ2h0KCkuCisKKzYuIFNpbmNlIGJvdGggZmR0YWJsZSBhbmQgZmlsZSBzdHJ1Y3R1cmVzIGNhbiBiZSBsb29rZWQgdXAKKyAgIGxvY2stZnJlZSwgdGhleSBtdXN0IGJlIGluc3RhbGxlZCB1c2luZyByY3VfYXNzaWduX3BvaW50ZXIoKQorICAgQVBJLiBJZiB0aGV5IGFyZSBsb29rZWQgdXAgbG9jay1mcmVlLCByY3VfZGVyZWZlcmVuY2UoKQorICAgbXVzdCBiZSB1c2VkLiBIb3dldmVyIGl0IGlzIGFkdmlzYWJsZSB0byB1c2UgZmlsZXNfZmR0YWJsZSgpCisgICBhbmQgZmNoZWNrKCkvZmNoZWNrX2ZpbGVzKCkgd2hpY2ggdGFrZSBjYXJlIG9mIHRoZXNlIGlzc3Vlcy4KKworNy4gV2hpbGUgdXBkYXRpbmcsIHRoZSBmZHRhYmxlIHBvaW50ZXIgbXVzdCBiZSBsb29rZWQgdXAgd2hpbGUKKyAgIGhvbGRpbmcgZmlsZXMtPmZpbGVfbG9jay4gSWYgLT5maWxlX2xvY2sgaXMgZHJvcHBlZCwgdGhlbgorICAgYW5vdGhlciB0aHJlYWQgZXhwYW5kIHRoZSBmaWxlcyB0aGVyZWJ5IGNyZWF0aW5nIGEgbmV3CisgICBmZHRhYmxlIGFuZCBtYWtpbmcgdGhlIGVhcmxpZXIgZmR0YWJsZSBwb2ludGVyIHN0YWxlLgorICAgRm9yIGV4YW1wbGUgOgorCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmZCA9IGxvY2F0ZV9mZChmaWxlcywgZmlsZSwgc3RhcnQpOworCWlmIChmZCA+PSAwKSB7CisJCS8qIGxvY2F0ZV9mZCgpIG1heSBoYXZlIGV4cGFuZGVkIGZkdGFibGUsIGxvYWQgdGhlIHB0ciAqLworCQlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwkJRkRfU0VUKGZkLCBmZHQtPm9wZW5fZmRzKTsKKwkJRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOworCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJLi4uLi4KKworICAgU2luY2UgbG9jYXRlX2ZkKCkgY2FuIGRyb3AgLT5maWxlX2xvY2sgKGFuZCByZWFjcXVpcmUgLT5maWxlX2xvY2spLAorICAgdGhlIGZkdGFibGUgcG9pbnRlciAoZmR0KSBtdXN0IGJlIGxvYWRlZCBhZnRlciBsb2NhdGVfZmQoKS4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1NzQxZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS50eHQKQEAgLTAsMCArMSwzMTUgQEAKK0RlZmluaXRpb25zCit+fn5+fn5+fn5+fgorCitVc2Vyc3BhY2UgZmlsZXN5c3RlbToKKworICBBIGZpbGVzeXN0ZW0gaW4gd2hpY2ggZGF0YSBhbmQgbWV0YWRhdGEgYXJlIHByb3ZpZGVkIGJ5IGFuIG9yZGluYXJ5CisgIHVzZXJzcGFjZSBwcm9jZXNzLiAgVGhlIGZpbGVzeXN0ZW0gY2FuIGJlIGFjY2Vzc2VkIG5vcm1hbGx5IHRocm91Z2gKKyAgdGhlIGtlcm5lbCBpbnRlcmZhY2UuCisKK0ZpbGVzeXN0ZW0gZGFlbW9uOgorCisgIFRoZSBwcm9jZXNzKGVzKSBwcm92aWRpbmcgdGhlIGRhdGEgYW5kIG1ldGFkYXRhIG9mIHRoZSBmaWxlc3lzdGVtLgorCitOb24tcHJpdmlsZWdlZCBtb3VudCAob3IgdXNlciBtb3VudCk6CisKKyAgQSB1c2Vyc3BhY2UgZmlsZXN5c3RlbSBtb3VudGVkIGJ5IGEgbm9uLXByaXZpbGVnZWQgKG5vbi1yb290KSB1c2VyLgorICBUaGUgZmlsZXN5c3RlbSBkYWVtb24gaXMgcnVubmluZyB3aXRoIHRoZSBwcml2aWxlZ2VzIG9mIHRoZSBtb3VudGluZworICB1c2VyLiAgTk9URTogdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgbW91bnRzIGFsbG93ZWQgd2l0aCB0aGUgInVzZXIiCisgIG9wdGlvbiBpbiAvZXRjL2ZzdGFiLCB3aGljaCBpcyBub3QgZGlzY3Vzc2VkIGhlcmUuCisKK01vdW50IG93bmVyOgorCisgIFRoZSB1c2VyIHdobyBkb2VzIHRoZSBtb3VudGluZy4KKworVXNlcjoKKworICBUaGUgdXNlciB3aG8gaXMgcGVyZm9ybWluZyBmaWxlc3lzdGVtIG9wZXJhdGlvbnMuCisKK1doYXQgaXMgRlVTRT8KK35+fn5+fn5+fn5+fn4KKworRlVTRSBpcyBhIHVzZXJzcGFjZSBmaWxlc3lzdGVtIGZyYW1ld29yay4gIEl0IGNvbnNpc3RzIG9mIGEga2VybmVsCittb2R1bGUgKGZ1c2Uua28pLCBhIHVzZXJzcGFjZSBsaWJyYXJ5IChsaWJmdXNlLiopIGFuZCBhIG1vdW50IHV0aWxpdHkKKyhmdXNlcm1vdW50KS4KKworT25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBmZWF0dXJlcyBvZiBGVVNFIGlzIGFsbG93aW5nIHNlY3VyZSwKK25vbi1wcml2aWxlZ2VkIG1vdW50cy4gIFRoaXMgb3BlbnMgdXAgbmV3IHBvc3NpYmlsaXRpZXMgZm9yIHRoZSB1c2Ugb2YKK2ZpbGVzeXN0ZW1zLiAgQSBnb29kIGV4YW1wbGUgaXMgc3NoZnM6IGEgc2VjdXJlIG5ldHdvcmsgZmlsZXN5c3RlbQordXNpbmcgdGhlIHNmdHAgcHJvdG9jb2wuCisKK1RoZSB1c2Vyc3BhY2UgbGlicmFyeSBhbmQgdXRpbGl0aWVzIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgRlVTRQoraG9tZXBhZ2U6CisKKyAgaHR0cDovL2Z1c2Uuc291cmNlZm9yZ2UubmV0LworCitNb3VudCBvcHRpb25zCit+fn5+fn5+fn5+fn5+CisKKydmZD1OJworCisgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gdXNlIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIHVzZXJzcGFjZQorICBmaWxlc3lzdGVtIGFuZCB0aGUga2VybmVsLiAgVGhlIGZpbGUgZGVzY3JpcHRvciBtdXN0IGhhdmUgYmVlbgorICBvYnRhaW5lZCBieSBvcGVuaW5nIHRoZSBGVVNFIGRldmljZSAoJy9kZXYvZnVzZScpLgorCisncm9vdG1vZGU9TScKKworICBUaGUgZmlsZSBtb2RlIG9mIHRoZSBmaWxlc3lzdGVtJ3Mgcm9vdCBpbiBvY3RhbCByZXByZXNlbnRhdGlvbi4KKworJ3VzZXJfaWQ9TicKKworICBUaGUgbnVtZXJpYyB1c2VyIGlkIG9mIHRoZSBtb3VudCBvd25lci4KKworJ2dyb3VwX2lkPU4nCisKKyAgVGhlIG51bWVyaWMgZ3JvdXAgaWQgb2YgdGhlIG1vdW50IG93bmVyLgorCisnZGVmYXVsdF9wZXJtaXNzaW9ucycKKworICBCeSBkZWZhdWx0IEZVU0UgZG9lc24ndCBjaGVjayBmaWxlIGFjY2VzcyBwZXJtaXNzaW9ucywgdGhlCisgIGZpbGVzeXN0ZW0gaXMgZnJlZSB0byBpbXBsZW1lbnQgaXQncyBhY2Nlc3MgcG9saWN5IG9yIGxlYXZlIGl0IHRvCisgIHRoZSB1bmRlcmx5aW5nIGZpbGUgYWNjZXNzIG1lY2hhbmlzbSAoZS5nLiBpbiBjYXNlIG9mIG5ldHdvcmsKKyAgZmlsZXN5c3RlbXMpLiAgVGhpcyBvcHRpb24gZW5hYmxlcyBwZXJtaXNzaW9uIGNoZWNraW5nLCByZXN0cmljdGluZworICBhY2Nlc3MgYmFzZWQgb24gZmlsZSBtb2RlLiAgVGhpcyBpcyBvcHRpb24gaXMgdXN1YWxseSB1c2VmdWwKKyAgdG9nZXRoZXIgd2l0aCB0aGUgJ2FsbG93X290aGVyJyBtb3VudCBvcHRpb24uCisKKydhbGxvd19vdGhlcicKKworICBUaGlzIG9wdGlvbiBvdmVycmlkZXMgdGhlIHNlY3VyaXR5IG1lYXN1cmUgcmVzdHJpY3RpbmcgZmlsZSBhY2Nlc3MKKyAgdG8gdGhlIHVzZXIgbW91bnRpbmcgdGhlIGZpbGVzeXN0ZW0uICBUaGlzIG9wdGlvbiBpcyBieSBkZWZhdWx0IG9ubHkKKyAgYWxsb3dlZCB0byByb290LCBidXQgdGhpcyByZXN0cmljdGlvbiBjYW4gYmUgcmVtb3ZlZCB3aXRoIGEKKyAgKHVzZXJzcGFjZSkgY29uZmlndXJhdGlvbiBvcHRpb24uCisKKydtYXhfcmVhZD1OJworCisgIFdpdGggdGhpcyBvcHRpb24gdGhlIG1heGltdW0gc2l6ZSBvZiByZWFkIG9wZXJhdGlvbnMgY2FuIGJlIHNldC4KKyAgVGhlIGRlZmF1bHQgaXMgaW5maW5pdGUuICBOb3RlIHRoYXQgdGhlIHNpemUgb2YgcmVhZCByZXF1ZXN0cyBpcworICBsaW1pdGVkIGFueXdheSB0byAzMiBwYWdlcyAod2hpY2ggaXMgMTI4a2J5dGUgb24gaTM4NikuCisKK0hvdyBkbyBub24tcHJpdmlsZWdlZCBtb3VudHMgd29yaz8KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworU2luY2UgdGhlIG1vdW50KCkgc3lzdGVtIGNhbGwgaXMgYSBwcml2aWxlZ2VkIG9wZXJhdGlvbiwgYSBoZWxwZXIKK3Byb2dyYW0gKGZ1c2VybW91bnQpIGlzIG5lZWRlZCwgd2hpY2ggaXMgaW5zdGFsbGVkIHNldHVpZCByb290LgorCitUaGUgaW1wbGljYXRpb24gb2YgcHJvdmlkaW5nIG5vbi1wcml2aWxlZ2VkIG1vdW50cyBpcyB0aGF0IHRoZSBtb3VudAorb3duZXIgbXVzdCBub3QgYmUgYWJsZSB0byB1c2UgdGhpcyBjYXBhYmlsaXR5IHRvIGNvbXByb21pc2UgdGhlCitzeXN0ZW0uICBPYnZpb3VzIHJlcXVpcmVtZW50cyBhcmlzaW5nIGZyb20gdGhpcyBhcmU6CisKKyBBKSBtb3VudCBvd25lciBzaG91bGQgbm90IGJlIGFibGUgdG8gZ2V0IGVsZXZhdGVkIHByaXZpbGVnZXMgd2l0aCB0aGUKKyAgICBoZWxwIG9mIHRoZSBtb3VudGVkIGZpbGVzeXN0ZW0KKworIEIpIG1vdW50IG93bmVyIHNob3VsZCBub3QgZ2V0IGlsbGVnaXRpbWF0ZSBhY2Nlc3MgdG8gaW5mb3JtYXRpb24gZnJvbQorICAgIG90aGVyIHVzZXJzJyBhbmQgdGhlIHN1cGVyIHVzZXIncyBwcm9jZXNzZXMKKworIEMpIG1vdW50IG93bmVyIHNob3VsZCBub3QgYmUgYWJsZSB0byBpbmR1Y2UgdW5kZXNpcmVkIGJlaGF2aW9yIGluCisgICAgb3RoZXIgdXNlcnMnIG9yIHRoZSBzdXBlciB1c2VyJ3MgcHJvY2Vzc2VzCisKK0hvdyBhcmUgcmVxdWlyZW1lbnRzIGZ1bGZpbGxlZD8KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworIEEpIFRoZSBtb3VudCBvd25lciBjb3VsZCBnYWluIGVsZXZhdGVkIHByaXZpbGVnZXMgYnkgZWl0aGVyOgorCisgICAgIDEpIGNyZWF0aW5nIGEgZmlsZXN5c3RlbSBjb250YWluaW5nIGEgZGV2aWNlIGZpbGUsIHRoZW4gb3BlbmluZworCXRoaXMgZGV2aWNlCisKKyAgICAgMikgY3JlYXRpbmcgYSBmaWxlc3lzdGVtIGNvbnRhaW5pbmcgYSBzdWlkIG9yIHNnaWQgYXBwbGljYXRpb24sCisJdGhlbiBleGVjdXRpbmcgdGhpcyBhcHBsaWNhdGlvbgorCisgICAgVGhlIHNvbHV0aW9uIGlzIG5vdCB0byBhbGxvdyBvcGVuaW5nIGRldmljZSBmaWxlcyBhbmQgaWdub3JlCisgICAgc2V0dWlkIGFuZCBzZXRnaWQgYml0cyB3aGVuIGV4ZWN1dGluZyBwcm9ncmFtcy4gIFRvIGVuc3VyZSB0aGlzCisgICAgZnVzZXJtb3VudCBhbHdheXMgYWRkcyAibm9zdWlkIiBhbmQgIm5vZGV2IiB0byB0aGUgbW91bnQgb3B0aW9ucworICAgIGZvciBub24tcHJpdmlsZWdlZCBtb3VudHMuCisKKyBCKSBJZiBhbm90aGVyIHVzZXIgaXMgYWNjZXNzaW5nIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGluIHRoZQorICAgIGZpbGVzeXN0ZW0sIHRoZSBmaWxlc3lzdGVtIGRhZW1vbiBzZXJ2aW5nIHJlcXVlc3RzIGNhbiByZWNvcmQgdGhlCisgICAgZXhhY3Qgc2VxdWVuY2UgYW5kIHRpbWluZyBvZiBvcGVyYXRpb25zIHBlcmZvcm1lZC4gIFRoaXMKKyAgICBpbmZvcm1hdGlvbiBpcyBvdGhlcndpc2UgaW5hY2Nlc3NpYmxlIHRvIHRoZSBtb3VudCBvd25lciwgc28gdGhpcworICAgIGNvdW50cyBhcyBhbiBpbmZvcm1hdGlvbiBsZWFrLgorCisgICAgVGhlIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbSB3aWxsIGJlIHByZXNlbnRlZCBpbiBwb2ludCAyKSBvZiBDKS4KKworIEMpIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgaW4gd2hpY2ggdGhlIG1vdW50IG93bmVyIGNhbiBpbmR1Y2UKKyAgICB1bmRlc2lyZWQgYmVoYXZpb3IgaW4gb3RoZXIgdXNlcnMnIHByb2Nlc3Nlcywgc3VjaCBhczoKKworICAgICAxKSBtb3VudGluZyBhIGZpbGVzeXN0ZW0gb3ZlciBhIGZpbGUgb3IgZGlyZWN0b3J5IHdoaWNoIHRoZSBtb3VudAorICAgICAgICBvd25lciBjb3VsZCBvdGhlcndpc2Ugbm90IGJlIGFibGUgdG8gbW9kaWZ5IChvciBjb3VsZCBvbmx5CisgICAgICAgIG1ha2UgbGltaXRlZCBtb2RpZmljYXRpb25zKS4KKworICAgICAgICBUaGlzIGlzIHNvbHZlZCBpbiBmdXNlcm1vdW50LCBieSBjaGVja2luZyB0aGUgYWNjZXNzCisgICAgICAgIHBlcm1pc3Npb25zIG9uIHRoZSBtb3VudHBvaW50IGFuZCBvbmx5IGFsbG93aW5nIHRoZSBtb3VudCBpZgorICAgICAgICB0aGUgbW91bnQgb3duZXIgY2FuIGRvIHVubGltaXRlZCBtb2RpZmljYXRpb24gKGhhcyB3cml0ZQorICAgICAgICBhY2Nlc3MgdG8gdGhlIG1vdW50cG9pbnQsIGFuZCBtb3VudHBvaW50IGlzIG5vdCBhICJzdGlja3kiCisgICAgICAgIGRpcmVjdG9yeSkKKworICAgICAyKSBFdmVuIGlmIDEpIGlzIHNvbHZlZCB0aGUgbW91bnQgb3duZXIgY2FuIGNoYW5nZSB0aGUgYmVoYXZpb3IKKyAgICAgICAgb2Ygb3RoZXIgdXNlcnMnIHByb2Nlc3Nlcy4KKworICAgICAgICAgaSkgSXQgY2FuIHNsb3cgZG93biBvciBpbmRlZmluaXRlbHkgZGVsYXkgdGhlIGV4ZWN1dGlvbiBvZiBhCisgICAgICAgICAgIGZpbGVzeXN0ZW0gb3BlcmF0aW9uIGNyZWF0aW5nIGEgRG9TIGFnYWluc3QgdGhlIHVzZXIgb3IgdGhlCisgICAgICAgICAgIHdob2xlIHN5c3RlbS4gIEZvciBleGFtcGxlIGEgc3VpZCBhcHBsaWNhdGlvbiBsb2NraW5nIGEKKyAgICAgICAgICAgc3lzdGVtIGZpbGUsIGFuZCB0aGVuIGFjY2Vzc2luZyBhIGZpbGUgb24gdGhlIG1vdW50IG93bmVyJ3MKKyAgICAgICAgICAgZmlsZXN5c3RlbSBjb3VsZCBiZSBzdG9wcGVkLCBhbmQgdGh1cyBjYXVzaW5nIHRoZSBzeXN0ZW0KKyAgICAgICAgICAgZmlsZSB0byBiZSBsb2NrZWQgZm9yZXZlci4KKworICAgICAgICAgaWkpIEl0IGNhbiBwcmVzZW50IGZpbGVzIG9yIGRpcmVjdG9yaWVzIG9mIHVubGltaXRlZCBsZW5ndGgsIG9yCisgICAgICAgICAgIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIG9mIHVubGltaXRlZCBkZXB0aCwgcG9zc2libHkgY2F1c2luZyBhCisgICAgICAgICAgIHN5c3RlbSBwcm9jZXNzIHRvIGVhdCB1cCBkaXNrc3BhY2UsIG1lbW9yeSBvciBvdGhlcgorICAgICAgICAgICByZXNvdXJjZXMsIGFnYWluIGNhdXNpbmcgRG9TLgorCisJVGhlIHNvbHV0aW9uIHRvIHRoaXMgYXMgd2VsbCBhcyBCKSBpcyBub3QgdG8gYWxsb3cgcHJvY2Vzc2VzCisJdG8gYWNjZXNzIHRoZSBmaWxlc3lzdGVtLCB3aGljaCBjb3VsZCBvdGhlcndpc2Ugbm90IGJlCisJbW9uaXRvcmVkIG9yIG1hbmlwdWxhdGVkIGJ5IHRoZSBtb3VudCBvd25lci4gIFNpbmNlIGlmIHRoZQorCW1vdW50IG93bmVyIGNhbiBwdHJhY2UgYSBwcm9jZXNzLCBpdCBjYW4gZG8gYWxsIG9mIHRoZSBhYm92ZQorCXdpdGhvdXQgdXNpbmcgYSBGVVNFIG1vdW50LCB0aGUgc2FtZSBjcml0ZXJpYSBhcyB1c2VkIGluCisJcHRyYWNlIGNhbiBiZSB1c2VkIHRvIGNoZWNrIGlmIGEgcHJvY2VzcyBpcyBhbGxvd2VkIHRvIGFjY2VzcworCXRoZSBmaWxlc3lzdGVtIG9yIG5vdC4KKworCU5vdGUgdGhhdCB0aGUgcHRyYWNlIGNoZWNrIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgdG8KKwlwcmV2ZW50IEIvMi9pLCBpdCBpcyBlbm91Z2ggdG8gY2hlY2sgaWYgbW91bnQgb3duZXIgaGFzIGVub3VnaAorCXByaXZpbGVnZSB0byBzZW5kIHNpZ25hbCB0byB0aGUgcHJvY2VzcyBhY2Nlc3NpbmcgdGhlCisJZmlsZXN5c3RlbSwgc2luY2UgU0lHU1RPUCBjYW4gYmUgdXNlZCB0byBnZXQgYSBzaW1pbGFyIGVmZmVjdC4KKworSSB0aGluayB0aGVzZSBsaW1pdGF0aW9ucyBhcmUgdW5hY2NlcHRhYmxlPworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitJZiBhIHN5c2FkbWluIHRydXN0cyB0aGUgdXNlcnMgZW5vdWdoLCBvciBjYW4gZW5zdXJlIHRocm91Z2ggb3RoZXIKK21lYXN1cmVzLCB0aGF0IHN5c3RlbSBwcm9jZXNzZXMgd2lsbCBuZXZlciBlbnRlciBub24tcHJpdmlsZWdlZAorbW91bnRzLCBpdCBjYW4gcmVsYXggdGhlIGxhc3QgbGltaXRhdGlvbiB3aXRoIGEgInVzZXJfYWxsb3dfb3RoZXIiCitjb25maWcgb3B0aW9uLiAgSWYgdGhpcyBjb25maWcgb3B0aW9uIGlzIHNldCwgdGhlIG1vdW50aW5nIHVzZXIgY2FuCithZGQgdGhlICJhbGxvd19vdGhlciIgbW91bnQgb3B0aW9uIHdoaWNoIGRpc2FibGVzIHRoZSBjaGVjayBmb3Igb3RoZXIKK3VzZXJzJyBwcm9jZXNzZXMuCisKK0tlcm5lbCAtIHVzZXJzcGFjZSBpbnRlcmZhY2UKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIGZvbGxvd2luZyBkaWFncmFtIHNob3dzIGhvdyBhIGZpbGVzeXN0ZW0gb3BlcmF0aW9uIChpbiB0aGlzCitleGFtcGxlIHVubGluaykgaXMgcGVyZm9ybWVkIGluIEZVU0UuCisKK05PVEU6IGV2ZXJ5dGhpbmcgaW4gdGhpcyBkZXNjcmlwdGlvbiBpcyBncmVhdGx5IHNpbXBsaWZpZWQKKworIHwgICJybSAvbW50L2Z1c2UvZmlsZSIgICAgICAgICAgICAgICB8ICBGVVNFIGZpbGVzeXN0ZW0gZGFlbW9uCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgPnN5c19yZWFkKCkKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA+ZnVzZV9kZXZfcmVhZCgpCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICA+cmVxdWVzdF93YWl0KCkKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgW3NsZWVwIG9uIGZjLT53YWl0cV0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgID5zeXNfdW5saW5rKCkgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICA+ZnVzZV91bmxpbmsoKSAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgW2dldCByZXF1ZXN0IGZyb20gICAgICAgICAgICAgfAorIHwgICAgICAgZmMtPnVudXNlZF9saXN0XSAgICAgICAgICAgICB8CisgfCAgICAgID5yZXF1ZXN0X3NlbmQoKSAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICBbcXVldWUgcmVxIG9uIGZjLT5wZW5kaW5nXSAgfAorIHwgICAgICAgIFt3YWtlIHVwIGZjLT53YWl0cV0gICAgICAgICB8ICAgICAgICBbd29rZW4gdXBdCisgfCAgICAgICAgPnJlcXVlc3Rfd2FpdF9hbnN3ZXIoKSAgICAgIHwKKyB8ICAgICAgICAgIFtzbGVlcCBvbiByZXEtPndhaXRxXSAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgPHJlcXVlc3Rfd2FpdCgpCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBbcmVtb3ZlIHJlcSBmcm9tIGZjLT5wZW5kaW5nXQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgW2NvcHkgcmVxIHRvIHJlYWQgYnVmZmVyXQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgW2FkZCByZXEgdG8gZmMtPnByb2Nlc3NpbmddCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgPGZ1c2VfZGV2X3JlYWQoKQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA8c3lzX3JlYWQoKQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFtwZXJmb3JtIHVubGlua10KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA+c3lzX3dyaXRlKCkKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA+ZnVzZV9kZXZfd3JpdGUoKQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgW2xvb2sgdXAgcmVxIGluIGZjLT5wcm9jZXNzaW5nXQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgW3JlbW92ZSBmcm9tIGZjLT5wcm9jZXNzaW5nXQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgW2NvcHkgd3JpdGUgYnVmZmVyIHRvIHJlcV0KKyB8ICAgICAgICAgIFt3b2tlbiB1cF0gICAgICAgICAgICAgICAgfCAgICAgIFt3YWtlIHVwIHJlcS0+d2FpdHFdCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgPGZ1c2VfZGV2X3dyaXRlKCkKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgPHN5c193cml0ZSgpCisgfCAgICAgICAgPHJlcXVlc3Rfd2FpdF9hbnN3ZXIoKSAgICAgIHwKKyB8ICAgICAgPHJlcXVlc3Rfc2VuZCgpICAgICAgICAgICAgICAgfAorIHwgICAgICBbYWRkIHJlcXVlc3QgdG8gICAgICAgICAgICAgICB8CisgfCAgICAgICBmYy0+dW51c2VkX2xpc3RdICAgICAgICAgICAgIHwKKyB8ICAgIDxmdXNlX3VubGluaygpICAgICAgICAgICAgICAgICAgfAorIHwgIDxzeXNfdW5saW5rKCkgICAgICAgICAgICAgICAgICAgICB8CisKK1RoZXJlIGFyZSBhIGNvdXBsZSBvZiB3YXlzIGluIHdoaWNoIHRvIGRlYWRsb2NrIGEgRlVTRSBmaWxlc3lzdGVtLgorU2luY2Ugd2UgYXJlIHRhbGtpbmcgYWJvdXQgdW5wcml2aWxlZ2VkIHVzZXJzcGFjZSBwcm9ncmFtcywKK3NvbWV0aGluZyBtdXN0IGJlIGRvbmUgYWJvdXQgdGhlc2UuCisKK1NjZW5hcmlvIDEgLSAgU2ltcGxlIGRlYWRsb2NrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgfCAgInJtIC9tbnQvZnVzZS9maWxlIiAgICAgICAgICAgICAgIHwgIEZVU0UgZmlsZXN5c3RlbSBkYWVtb24KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgID5zeXNfdW5saW5rKCIvbW50L2Z1c2UvZmlsZSIpICAgICB8CisgfCAgICBbYWNxdWlyZSBpbm9kZSBzZW1hcGhvcmUgICAgICAgIHwKKyB8ICAgICBmb3IgImZpbGUiXSAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgPmZ1c2VfdW5saW5rKCkgICAgICAgICAgICAgICAgICB8CisgfCAgICAgIFtzbGVlcCBvbiByZXEtPndhaXRxXSAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgPHN5c19yZWFkKCkKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgPnN5c191bmxpbmsoIi9tbnQvZnVzZS9maWxlIikKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBbYWNxdWlyZSBpbm9kZSBzZW1hcGhvcmUKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgZm9yICJmaWxlIl0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAqREVBRExPQ0sqCisKK1RoZSBzb2x1dGlvbiBmb3IgdGhpcyBpcyB0byBhbGxvdyByZXF1ZXN0cyB0byBiZSBpbnRlcnJ1cHRlZCB3aGlsZQordGhleSBhcmUgaW4gdXNlcnNwYWNlOgorCisgfCAgICAgIFtpbnRlcnJ1cHRlZCBieSBzaWduYWxdICAgICAgIHwKKyB8ICAgIDxmdXNlX3VubGluaygpICAgICAgICAgICAgICAgICAgfAorIHwgICAgW3JlbGVhc2Ugc2VtYXBob3JlXSAgICAgICAgICAgICB8ICAgIFtzZW1hcGhvcmUgYWNxdWlyZWRdCisgfCAgPHN5c191bmxpbmsoKSAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA+ZnVzZV91bmxpbmsoKQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgW3F1ZXVlIHJlcSBvbiBmYy0+cGVuZGluZ10KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFt3YWtlIHVwIGZjLT53YWl0cV0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFtzbGVlcCBvbiByZXEtPndhaXRxXQorCitJZiB0aGUgZmlsZXN5c3RlbSBkYWVtb24gd2FzIHNpbmdsZSB0aHJlYWRlZCwgdGhpcyB3aWxsIHN0b3AgaGVyZSwKK3NpbmNlIHRoZXJlJ3Mgbm8gb3RoZXIgdGhyZWFkIHRvIGRlcXVldWUgYW5kIGV4ZWN1dGUgdGhlIHJlcXVlc3QuCitJbiB0aGlzIGNhc2UgdGhlIHNvbHV0aW9uIGlzIHRvIGtpbGwgdGhlIEZVU0UgZGFlbW9uIGFzIHdlbGwuICBJZgordGhlcmUgYXJlIG11bHRpcGxlIHNlcnZpbmcgdGhyZWFkcywgeW91IGp1c3QgaGF2ZSB0byBraWxsIHRoZW0gYXMKK2xvbmcgYXMgYW55IHJlbWFpbi4KKworTW9yYWw6IGEgZmlsZXN5c3RlbSB3aGljaCBkZWFkbG9ja3MsIGNhbiBzb29uIGZpbmQgaXRzZWxmIGRlYWQuCisKK1NjZW5hcmlvIDIgLSBUcmlja3kgZGVhZGxvY2sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBvbmUgbmVlZHMgYSBjYXJlZnVsbHkgY3JhZnRlZCBmaWxlc3lzdGVtLiAgSXQncyBhIHZhcmlhdGlvbiBvbgordGhlIGFib3ZlLCBvbmx5IHRoZSBjYWxsIGJhY2sgdG8gdGhlIGZpbGVzeXN0ZW0gaXMgbm90IGV4cGxpY2l0LAorYnV0IGlzIGNhdXNlZCBieSBhIHBhZ2VmYXVsdC4KKworIHwgIEthbWlrYXplIGZpbGVzeXN0ZW0gdGhyZWFkIDEgICAgICB8ICBLYW1pa2F6ZSBmaWxlc3lzdGVtIHRocmVhZCAyCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBbZmQgPSBvcGVuKCIvbW50L2Z1c2UvZmlsZSIpXSAgICAgfCAgW3JlcXVlc3Qgc2VydmVkIG5vcm1hbGx5XQorIHwgIFttbWFwIGZkIHRvICdhZGRyJ10gICAgICAgICAgICAgICB8CisgfCAgW2Nsb3NlIGZkXSAgICAgICAgICAgICAgICAgICAgICAgIHwgIFtGTFVTSCB0cmlnZ2VycyAnbWFnaWMnIGZsYWddCisgfCAgW3JlYWQgYSBieXRlIGZyb20gYWRkcl0gICAgICAgICAgIHwKKyB8ICAgID5kb19wYWdlX2ZhdWx0KCkgICAgICAgICAgICAgICAgfAorIHwgICAgICBbZmluZCBvciBjcmVhdGUgcGFnZV0gICAgICAgICB8CisgfCAgICAgIFtsb2NrIHBhZ2VdICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgPmZ1c2VfcmVhZHBhZ2UoKSAgICAgICAgICAgICAgfAorIHwgICAgICAgICBbcXVldWUgUkVBRCByZXF1ZXN0XSAgICAgICB8CisgfCAgICAgICAgIFtzbGVlcCBvbiByZXEtPndhaXRxXSAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgW3JlYWQgcmVxdWVzdCB0byBidWZmZXJdCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFtjcmVhdGUgcmVwbHkgaGVhZGVyIGJlZm9yZSBhZGRyXQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA+c3lzX3dyaXRlKGFkZHIgLSBoZWFkZXJsZW5ndGgpCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgPmZ1c2VfZGV2X3dyaXRlKCkKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFtsb29rIHVwIHJlcSBpbiBmYy0+cHJvY2Vzc2luZ10KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFtyZW1vdmUgZnJvbSBmYy0+cHJvY2Vzc2luZ10KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFtjb3B5IHdyaXRlIGJ1ZmZlciB0byByZXFdCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgID5kb19wYWdlX2ZhdWx0KCkKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgW2ZpbmQgb3IgY3JlYXRlIHBhZ2VdCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIFtsb2NrIHBhZ2VdCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICogREVBRExPQ0sgKgorCitTb2x1dGlvbiBpcyBhZ2FpbiB0byBsZXQgdGhlIHRoZSByZXF1ZXN0IGJlIGludGVycnVwdGVkIChub3QKK2VsYWJvcmF0ZWQgZnVydGhlcikuCisKK0FuIGFkZGl0aW9uYWwgcHJvYmxlbSBpcyB0aGF0IHdoaWxlIHRoZSB3cml0ZSBidWZmZXIgaXMgYmVpbmcKK2NvcGllZCB0byB0aGUgcmVxdWVzdCwgdGhlIHJlcXVlc3QgbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQuICBUaGlzCitpcyBiZWNhdXNlIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoZSBjb3B5IG1heSBub3QgYmUgdmFsaWQKK2FmdGVyIHRoZSByZXF1ZXN0IGlzIGludGVycnVwdGVkLgorCitUaGlzIGlzIHNvbHZlZCB3aXRoIGRvaW5nIHRoZSBjb3B5IGF0b21pY2FsbHksIGFuZCBhbGxvd2luZworaW50ZXJydXB0aW9uIHdoaWxlIHRoZSBwYWdlKHMpIGJlbG9uZ2luZyB0byB0aGUgd3JpdGUgYnVmZmVyIGFyZQorZmF1bHRlZCB3aXRoIGdldF91c2VyX3BhZ2VzKCkuICBUaGUgJ3JlcS0+bG9ja2VkJyBmbGFnIGluZGljYXRlcword2hlbiB0aGUgY29weSBpcyB0YWtpbmcgcGxhY2UsIGFuZCBpbnRlcnJ1cHRpb24gaXMgZGVsYXllZCB1bnRpbAordGhpcyBmbGFnIGlzIHVuc2V0LgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9udGZzLnR4dAppbmRleCBlZWY0YWNhLi5hNWZiYzhlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQKQEAgLTQzOSw2ICs0MzksMTggQEAKIAogTm90ZSwgYSB0ZWNobmljYWwgQ2hhbmdlTG9nIGFpbWVkIGF0IGtlcm5lbCBoYWNrZXJzIGlzIGluIGZzL250ZnMvQ2hhbmdlTG9nLgogCisyLjEuMjQ6CisJLSBTdXBwb3J0IGpvdXJuYWxzICgkTG9nRmlsZSkgd2hpY2ggaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGNoa2Rzay4gIFRoaXMKKwkgIG1lYW5zIHVzZXJzIGNhbiBib290IGludG8gV2luZG93cyBhZnRlciB3ZSBtYXJrZWQgdGhlIHZvbHVtZSBkaXJ0eS4KKwkgIFRoZSBXaW5kb3dzIGJvb3Qgd2lsbCBydW4gY2hrZHNrIGFuZCB0aGVuIHJlYm9vdC4gIFRoZSB1c2VyIGNhbiB0aGVuCisJICBpbW1lZGlhdGVseSBib290IGludG8gTGludXggcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGRvIGEgZnVsbCBXaW5kb3dzCisJICBib290IGZpcnN0IGJlZm9yZSByZWJvb3RpbmcgaW50byBMaW51eCBhbmQgd2Ugd2lsbCByZWNvZ25pemUgc3VjaCBhCisJICBqb3VybmFsIGFuZCBlbXB0eSBpdCBhcyBpdCBpcyBjbGVhbiBieSBkZWZpbml0aW9uLgorCS0gU3VwcG9ydCBqb3VybmFscyAoJExvZ0ZpbGUpIHdpdGggb25seSBvbmUgcmVzdGFydCBwYWdlIGFzIHdlbGwgYXMKKwkgIGpvdXJuYWxzIHdpdGggdHdvIGRpZmZlcmVudCByZXN0YXJ0IHBhZ2VzLiAgV2Ugc2FuaXR5IGNoZWNrIGJvdGggYW5kCisJICBlaXRoZXIgdXNlIHRoZSBvbmx5IHNhbmUgb25lIG9yIHRoZSBtb3JlIHJlY2VudCBvbmUgb2YgdGhlIHR3byBpbiB0aGUKKwkgIGNhc2UgdGhhdCBib3RoIGFyZSB2YWxpZC4KKwktIExvdHMgb2YgYnVnIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMgYWNyb3NzIHRoZSBib2FyZC4KIDIuMS4yMzoKIAktIFN0YW1wIHRoZSB1c2VyIHNwYWNlIGpvdXJuYWwsIGFrYSB0cmFuc2FjdGlvbiBsb2csIGFrYSAkVXNuSnJubCwgaWYKIAkgIGl0IGlzIHByZXNlbnQgYW5kIGFjdGl2ZSB0aHVzIHRlbGxpbmcgV2luZG93cyBhbmQgYXBwbGljYXRpb25zIHVzaW5nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAppbmRleCA2Yzk4ZjJiLi5kNDc3MzU2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKQEAgLTEzMyw2ICsxMzMsNyBAQAogIHN0YXRtICAgUHJvY2VzcyBtZW1vcnkgc3RhdHVzIGluZm9ybWF0aW9uICAgICAgICAgICAgICAKICBzdGF0dXMgIFByb2Nlc3Mgc3RhdHVzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm0gICAgICAgICAgCiAgd2NoYW4gICBJZiBDT05GSUdfS0FMTFNZTVMgaXMgc2V0LCBhIHByZS1kZWNvZGVkIHdjaGFuCisgc21hcHMJIEV4dGVuc2lvbiBiYXNlZCBvbiBtYXBzLCBwcmVzZW50aW5nIHRoZSByc3Mgc2l6ZSBmb3IgZWFjaCBtYXBwZWQgZmlsZQogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAKIEZvciBleGFtcGxlLCB0byBnZXQgdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBvZiBhIHByb2Nlc3MsIGFsbCB5b3UgaGF2ZSB0byBkbyBpcwpAQCAtMTI0MCwxNiArMTI0MSwzOCBAQAogb3ZlcmNvbW1pdF9tZW1vcnkKIC0tLS0tLS0tLS0tLS0tLS0tCiAKLVRoaXMgZmlsZSAgY29udGFpbnMgIG9uZSAgdmFsdWUuICBUaGUgZm9sbG93aW5nIGFsZ29yaXRobSBpcyB1c2VkIHRvIGRlY2lkZSBpZgotdGhlcmUncyBlbm91Z2ggIG1lbW9yeTogIGlmICB0aGUgIHZhbHVlIG9mIG92ZXJjb21taXRfbWVtb3J5IGlzIHBvc2l0aXZlLCB0aGVuCi10aGVyZSdzIGFsd2F5cyAgZW5vdWdoICBtZW1vcnkuIFRoaXMgaXMgYSB1c2VmdWwgZmVhdHVyZSwgc2luY2UgcHJvZ3JhbXMgb2Z0ZW4KLW1hbGxvYygpIGh1Z2UgIGFtb3VudHMgIG9mICBtZW1vcnkgJ2p1c3QgaW4gY2FzZScsIHdoaWxlIHRoZXkgb25seSB1c2UgYSBzbWFsbAotcGFydCBvZiAgaXQuICBMZWF2aW5nICB0aGlzIHZhbHVlIGF0IDAgd2lsbCBsZWFkIHRvIHRoZSBmYWlsdXJlIG9mIHN1Y2ggYSBodWdlCi1tYWxsb2MoKSwgd2hlbiBpbiBmYWN0IHRoZSBzeXN0ZW0gaGFzIGVub3VnaCBtZW1vcnkgZm9yIHRoZSBwcm9ncmFtIHRvIHJ1bi4KK0NvbnRyb2xzIG92ZXJjb21taXQgb2Ygc3lzdGVtIG1lbW9yeSwgcG9zc2libHkgYWxsb3dpbmcgcHJvY2Vzc2VzCit0byBhbGxvY2F0ZSAoYnV0IG5vdCB1c2UpIG1vcmUgbWVtb3J5IHRoYW4gaXMgYWN0dWFsbHkgYXZhaWxhYmxlLgogCi1PbiB0aGUgIG90aGVyICBoYW5kLCAgZW5hYmxpbmcgdGhpcyBmZWF0dXJlIGNhbiBjYXVzZSB5b3UgdG8gcnVuIG91dCBvZiBtZW1vcnkKLWFuZCB0aHJhc2ggdGhlIHN5c3RlbSB0byBkZWF0aCwgc28gbGFyZ2UgYW5kL29yIGltcG9ydGFudCBzZXJ2ZXJzIHdpbGwgd2FudCB0bwotc2V0IHRoaXMgdmFsdWUgdG8gMC4KKworMAktCUhldXJpc3RpYyBvdmVyY29tbWl0IGhhbmRsaW5nLiBPYnZpb3VzIG92ZXJjb21taXRzIG9mCisJCWFkZHJlc3Mgc3BhY2UgYXJlIHJlZnVzZWQuIFVzZWQgZm9yIGEgdHlwaWNhbCBzeXN0ZW0uIEl0CisJCWVuc3VyZXMgYSBzZXJpb3VzbHkgd2lsZCBhbGxvY2F0aW9uIGZhaWxzIHdoaWxlIGFsbG93aW5nCisJCW92ZXJjb21taXQgdG8gcmVkdWNlIHN3YXAgdXNhZ2UuICByb290IGlzIGFsbG93ZWQgdG8KKwkJYWxsb2NhdGUgc2xpZ2hseSBtb3JlIG1lbW9yeSBpbiB0aGlzIG1vZGUuIFRoaXMgaXMgdGhlCisJCWRlZmF1bHQuCisKKzEJLQlBbHdheXMgb3ZlcmNvbW1pdC4gQXBwcm9wcmlhdGUgZm9yIHNvbWUgc2NpZW50aWZpYworCQlhcHBsaWNhdGlvbnMuCisKKzIJLQlEb24ndCBvdmVyY29tbWl0LiBUaGUgdG90YWwgYWRkcmVzcyBzcGFjZSBjb21taXQKKwkJZm9yIHRoZSBzeXN0ZW0gaXMgbm90IHBlcm1pdHRlZCB0byBleGNlZWQgc3dhcCBwbHVzIGEKKwkJY29uZmlndXJhYmxlIHBlcmNlbnRhZ2UgKGRlZmF1bHQgaXMgNTApIG9mIHBoeXNpY2FsIFJBTS4KKwkJRGVwZW5kaW5nIG9uIHRoZSBwZXJjZW50YWdlIHlvdSB1c2UsIGluIG1vc3Qgc2l0dWF0aW9ucworCQl0aGlzIG1lYW5zIGEgcHJvY2VzcyB3aWxsIG5vdCBiZSBraWxsZWQgd2hpbGUgYXR0ZW1wdGluZworCQl0byB1c2UgYWxyZWFkeS1hbGxvY2F0ZWQgbWVtb3J5IGJ1dCB3aWxsIHJlY2VpdmUgZXJyb3JzCisJCW9uIG1lbW9yeSBhbGxvY2F0aW9uIGFzCWFwcHJvcHJpYXRlLgorCitvdmVyY29tbWl0X3JhdGlvCistLS0tLS0tLS0tLS0tLS0tCisKK1BlcmNlbnRhZ2Ugb2YgcGh5c2ljYWwgbWVtb3J5IHNpemUgdG8gaW5jbHVkZSBpbiBvdmVyY29tbWl0IGNhbGN1bGF0aW9ucworKHNlZSBhYm92ZS4pCisKK01lbW9yeSBhbGxvY2F0aW9uIGxpbWl0ID0gc3dhcHNwYWNlICsgcGh5c21lbSAqIChvdmVyY29tbWl0X3JhdGlvIC8gMTAwKQorCisJc3dhcHNwYWNlID0gdG90YWwgc2l6ZSBvZiBhbGwgc3dhcCBhcmVhcworCXBoeXNtZW0gPSBzaXplIG9mIHBoeXNpY2FsIG1lbW9yeSBpbiBzeXN0ZW0KIAogbnJfaHVnZXBhZ2VzIGFuZCBodWdldGxiX3NobV9ncm91cAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9yZWxheWZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcmVsYXlmcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0ZTFiMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcmVsYXlmcy50eHQKQEAgLTAsMCArMSwzNjIgQEAKKworcmVsYXlmcyAtIGEgaGlnaC1zcGVlZCBkYXRhIHJlbGF5IGZpbGVzeXN0ZW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3JlbGF5ZnMgaXMgYSBmaWxlc3lzdGVtIGRlc2lnbmVkIHRvIHByb3ZpZGUgYW4gZWZmaWNpZW50IG1lY2hhbmlzbSBmb3IKK3Rvb2xzIGFuZCBmYWNpbGl0aWVzIHRvIHJlbGF5IGxhcmdlIGFuZCBwb3RlbnRpYWxseSBzdXN0YWluZWQgc3RyZWFtcworb2YgZGF0YSBmcm9tIGtlcm5lbCBzcGFjZSB0byB1c2VyIHNwYWNlLgorCitUaGUgbWFpbiBhYnN0cmFjdGlvbiBvZiByZWxheWZzIGlzIHRoZSAnY2hhbm5lbCcuICBBIGNoYW5uZWwgY29uc2lzdHMKK29mIGEgc2V0IG9mIHBlci1jcHUga2VybmVsIGJ1ZmZlcnMgZWFjaCByZXByZXNlbnRlZCBieSBhIGZpbGUgaW4gdGhlCityZWxheWZzIGZpbGVzeXN0ZW0uICBLZXJuZWwgY2xpZW50cyB3cml0ZSBpbnRvIGEgY2hhbm5lbCB1c2luZworZWZmaWNpZW50IHdyaXRlIGZ1bmN0aW9ucyB3aGljaCBhdXRvbWF0aWNhbGx5IGxvZyB0byB0aGUgY3VycmVudCBjcHUncworY2hhbm5lbCBidWZmZXIuICBVc2VyIHNwYWNlIGFwcGxpY2F0aW9ucyBtbWFwKCkgdGhlIHBlci1jcHUgZmlsZXMgYW5kCityZXRyaWV2ZSB0aGUgZGF0YSBhcyBpdCBiZWNvbWVzIGF2YWlsYWJsZS4KKworVGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBsb2dnZWQgaW50byB0aGUgY2hhbm5lbCBidWZmZXJzIGlzIGNvbXBsZXRlbHkKK3VwIHRvIHRoZSByZWxheWZzIGNsaWVudDsgcmVsYXlmcyBkb2VzIGhvd2V2ZXIgcHJvdmlkZSBob29rcyB3aGljaAorYWxsb3cgY2xpZW50cyB0byBpbXBvc2Ugc29tZSBzdHVjdHVyZSBvbiB0aGUgYnVmZmVyIGRhdGEuICBOb3IgZG9lcworcmVsYXlmcyBpbXBsZW1lbnQgYW55IGZvcm0gb2YgZGF0YSBmaWx0ZXJpbmcgLSB0aGlzIGFsc28gaXMgbGVmdCB0bwordGhlIGNsaWVudC4gIFRoZSBwdXJwb3NlIGlzIHRvIGtlZXAgcmVsYXlmcyBhcyBzaW1wbGUgYXMgcG9zc2libGUuCisKK1RoaXMgZG9jdW1lbnQgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIHJlbGF5ZnMgQVBJLiAgVGhlIGRldGFpbHMgb2YKK3RoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFyZSBkb2N1bWVudGVkIGFsb25nIHdpdGggdGhlIGZ1bmN0aW9ucyBpbiB0aGUKK2ZpbGVzeXN0ZW0gY29kZSAtIHBsZWFzZSBzZWUgdGhhdCBmb3IgZGV0YWlscy4KKworU2VtYW50aWNzCis9PT09PT09PT0KKworRWFjaCByZWxheWZzIGNoYW5uZWwgaGFzIG9uZSBidWZmZXIgcGVyIENQVSwgZWFjaCBidWZmZXIgaGFzIG9uZSBvcgorbW9yZSBzdWItYnVmZmVycy4gTWVzc2FnZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGZpcnN0IHN1Yi1idWZmZXIgdW50aWwKK2l0IGlzIHRvbyBmdWxsIHRvIGNvbnRhaW4gYSBuZXcgbWVzc2FnZSwgaW4gd2hpY2ggY2FzZSBpdCBpdCBpcword3JpdHRlbiB0byB0aGUgbmV4dCAoaWYgYXZhaWxhYmxlKS4gIE1lc3NhZ2VzIGFyZSBuZXZlciBzcGxpdCBhY3Jvc3MKK3N1Yi1idWZmZXJzLiAgQXQgdGhpcyBwb2ludCwgdXNlcnNwYWNlIGNhbiBiZSBub3RpZmllZCBzbyBpdCBlbXB0aWVzCit0aGUgZmlyc3Qgc3ViLWJ1ZmZlciwgd2hpbGUgdGhlIGtlcm5lbCBjb250aW51ZXMgd3JpdGluZyB0byB0aGUgbmV4dC4KKworV2hlbiBub3RpZmllZCB0aGF0IGEgc3ViLWJ1ZmZlciBpcyBmdWxsLCB0aGUga2VybmVsIGtub3dzIGhvdyBtYW55CitieXRlcyBvZiBpdCBhcmUgcGFkZGluZyBpLmUuIHVudXNlZC4gIFVzZXJzcGFjZSBjYW4gdXNlIHRoaXMga25vd2xlZGdlCit0byBjb3B5IG9ubHkgdmFsaWQgZGF0YS4KKworQWZ0ZXIgY29weWluZyBpdCwgdXNlcnNwYWNlIGNhbiBub3RpZnkgdGhlIGtlcm5lbCB0aGF0IGEgc3ViLWJ1ZmZlcgoraGFzIGJlZW4gY29uc3VtZWQuCisKK3JlbGF5ZnMgY2FuIG9wZXJhdGUgaW4gYSBtb2RlIHdoZXJlIGl0IHdpbGwgb3ZlcndyaXRlIGRhdGEgbm90IHlldAorY29sbGVjdGVkIGJ5IHVzZXJzcGFjZSwgYW5kIG5vdCB3YWl0IGZvciBpdCB0byBjb25zdW1lIGl0LgorCityZWxheWZzIGl0c2VsZiBkb2VzIG5vdCBwcm92aWRlIGZvciBjb21tdW5pY2F0aW9uIG9mIHN1Y2ggZGF0YSBiZXR3ZWVuCit1c2Vyc3BhY2UgYW5kIGtlcm5lbCwgYWxsb3dpbmcgdGhlIGtlcm5lbCBzaWRlIHRvIHJlbWFpbiBzaW1wbGUgYW5kIG5vdAoraW1wb3NlIGEgc2luZ2xlIGludGVyZmFjZSBvbiB1c2Vyc3BhY2UuIEl0IGRvZXMgcHJvdmlkZSBhIHNlcGFyYXRlCitoZWxwZXIgdGhvdWdoLCBkZXNjcmliZWQgYmVsb3cuCisKK2tsb2csIHJlbGF5LWFwcCAmIGxpYnJlbGF5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCityZWxheWZzIGl0c2VsZiBpcyByZWFkeSB0byB1c2UsIGJ1dCB0byBtYWtlIHRoaW5ncyBlYXNpZXIsIHR3bworYWRkaXRpb25hbCBzeXN0ZW1zIGFyZSBwcm92aWRlZC4gIGtsb2cgaXMgYSBzaW1wbGUgd3JhcHBlciB0byBtYWtlCit3cml0aW5nIGZvcm1hdHRlZCB0ZXh0IG9yIHJhdyBkYXRhIHRvIGEgY2hhbm5lbCBzaW1wbGVyLCByZWdhcmRsZXNzIG9mCit3aGV0aGVyIGEgY2hhbm5lbCB0byB3cml0ZSBpbnRvIGV4aXN0cyBvciBub3QsIG9yIHdoZXRoZXIgcmVsYXlmcyBpcworY29tcGlsZWQgaW50byB0aGUga2VybmVsIG9yIGlzIGNvbmZpZ3VyZWQgYXMgYSBtb2R1bGUuICByZWxheS1hcHAgaXMKK3RoZSBrZXJuZWwgY291bnRlcnBhcnQgb2YgdXNlcnNwYWNlIGxpYnJlbGF5LmMsIGNvbWJpbmVkIHRoZXNlIHR3bworZmlsZXMgcHJvdmlkZSBnbHVlIHRvIGVhc2lseSBzdHJlYW0gZGF0YSB0byBkaXNrLCB3aXRob3V0IGhhdmluZyB0bworYm90aGVyIHdpdGggaG91c2VrZWVwaW5nLiAga2xvZyBhbmQgcmVsYXktYXBwIGNhbiBiZSB1c2VkIHRvZ2V0aGVyLAord2l0aCBrbG9nIHByb3ZpZGluZyBoaWdoLWxldmVsIGxvZ2dpbmcgZnVuY3Rpb25zIHRvIHRoZSBrZXJuZWwgYW5kCityZWxheS1hcHAgdGFraW5nIGNhcmUgb2Yga2VybmVsLXVzZXIgY29udHJvbCBhbmQgZGlzay1sb2dnaW5nIGNob3Jlcy4KKworSXQgaXMgcG9zc2libGUgdG8gdXNlIHJlbGF5ZnMgd2l0aG91dCByZWxheS1hcHAgJiBsaWJyZWxheSwgYnV0IHlvdSdsbAoraGF2ZSB0byBpbXBsZW1lbnQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHVzZXJzcGFjZSBhbmQga2VybmVsLCBhbGxvd2luZworYm90aCB0byBjb252ZXkgdGhlIHN0YXRlIG9mIGJ1ZmZlcnMgKGZ1bGwsIGVtcHR5LCBhbW91bnQgb2YgcGFkZGluZykuCisKK2tsb2csIHJlbGF5LWFwcCBhbmQgbGlicmVsYXkgY2FuIGJlIGZvdW5kIGluIHRoZSByZWxheS1hcHBzIHRhcmJhbGwgb24KK2h0dHA6Ly9yZWxheWZzLnNvdXJjZWZvcmdlLm5ldAorCitUaGUgcmVsYXlmcyB1c2VyIHNwYWNlIEFQSQorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcmVsYXlmcyBpbXBsZW1lbnRzIGJhc2ljIGZpbGUgb3BlcmF0aW9ucyBmb3IgdXNlciBzcGFjZSBhY2Nlc3MgdG8KK3JlbGF5ZnMgY2hhbm5lbCBidWZmZXIgZGF0YS4gIEhlcmUgYXJlIHRoZSBmaWxlIG9wZXJhdGlvbnMgdGhhdCBhcmUKK2F2YWlsYWJsZSBhbmQgc29tZSBjb21tZW50cyByZWdhcmRpbmcgdGhlaXIgYmVoYXZpb3I6CisKK29wZW4oKQkgZW5hYmxlcyB1c2VyIHRvIG9wZW4gYW4gX2V4aXN0aW5nXyBidWZmZXIuCisKK21tYXAoKQkgcmVzdWx0cyBpbiBjaGFubmVsIGJ1ZmZlciBiZWluZyBtYXBwZWQgaW50byB0aGUgY2FsbGVyJ3MKKwkgbWVtb3J5IHNwYWNlLiBOb3RlIHRoYXQgeW91IGNhbid0IGRvIGEgcGFydGlhbCBtbWFwIC0geW91IG11c3QKKwkgbWFwIHRoZSBlbnRpcmUgZmlsZSwgd2hpY2ggaXMgTlJCVUYgKiBTVUJCVUZTSVpFLgorCityZWFkKCkJIHJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgY2hhbm5lbCBidWZmZXIuICBUaGUgYnl0ZXMgcmVhZCBhcmUKKwkgJ2NvbnN1bWVkJyBieSB0aGUgcmVhZGVyIGkuZS4gdGhleSB3b24ndCBiZSBhdmFpbGFibGUgYWdhaW4KKwkgdG8gc3Vic2VxdWVudCByZWFkcy4gIElmIHRoZSBjaGFubmVsIGlzIGJlaW5nIHVzZWQgaW4KKwkgbm8tb3ZlcndyaXRlIG1vZGUgKHRoZSBkZWZhdWx0KSwgaXQgY2FuIGJlIHJlYWQgYXQgYW55IHRpbWUKKwkgZXZlbiBpZiB0aGVyZSdzIGFuIGFjdGl2ZSBrZXJuZWwgd3JpdGVyLiAgSWYgdGhlIGNoYW5uZWwgaXMKKwkgYmVpbmcgdXNlZCBpbiBvdmVyd3JpdGUgbW9kZSBhbmQgdGhlcmUgYXJlIGFjdGl2ZSBjaGFubmVsCisJIHdyaXRlcnMsIHJlc3VsdHMgbWF5IGJlIHVucHJlZGljdGFibGUgLSB1c2VycyBzaG91bGQgbWFrZQorCSBzdXJlIHRoYXQgYWxsIGxvZ2dpbmcgdG8gdGhlIGNoYW5uZWwgaGFzIGVuZGVkIGJlZm9yZSB1c2luZworCSByZWFkKCkgd2l0aCBvdmVyd3JpdGUgbW9kZS4KKworcG9sbCgpCSBQT0xMSU4vUE9MTFJETk9STS9QT0xMRVJSIHN1cHBvcnRlZC4gIFVzZXIgYXBwbGljYXRpb25zIGFyZQorCSBub3RpZmllZCB3aGVuIHN1Yi1idWZmZXIgYm91bmRhcmllcyBhcmUgY3Jvc3NlZC4KKworY2xvc2UoKSBkZWNyZW1lbnRzIHRoZSBjaGFubmVsIGJ1ZmZlcidzIHJlZmNvdW50LiAgV2hlbiB0aGUgcmVmY291bnQKKwlyZWFjaGVzIDAgaS5lLiB3aGVuIG5vIHByb2Nlc3Mgb3Iga2VybmVsIGNsaWVudCBoYXMgdGhlIGJ1ZmZlcgorCW9wZW4sIHRoZSBjaGFubmVsIGJ1ZmZlciBpcyBmcmVlZC4KKworCitJbiBvcmRlciBmb3IgYSB1c2VyIGFwcGxpY2F0aW9uIHRvIG1ha2UgdXNlIG9mIHJlbGF5ZnMgZmlsZXMsIHRoZQorcmVsYXlmcyBmaWxlc3lzdGVtIG11c3QgYmUgbW91bnRlZC4gIEZvciBleGFtcGxlLAorCisJbW91bnQgLXQgcmVsYXlmcyByZWxheWZzIC9tbnQvcmVsYXkKKworTk9URToJcmVsYXlmcyBkb2Vzbid0IG5lZWQgdG8gYmUgbW91bnRlZCBmb3Iga2VybmVsIGNsaWVudHMgdG8gY3JlYXRlCisJb3IgdXNlIGNoYW5uZWxzIC0gaXQgb25seSBuZWVkcyB0byBiZSBtb3VudGVkIHdoZW4gdXNlciBzcGFjZQorCWFwcGxpY2F0aW9ucyBuZWVkIGFjY2VzcyB0byB0aGUgYnVmZmVyIGRhdGEuCisKKworVGhlIHJlbGF5ZnMga2VybmVsIEFQSQorPT09PT09PT09PT09PT09PT09PT09PQorCitIZXJlJ3MgYSBzdW1tYXJ5IG9mIHRoZSBBUEkgcmVsYXlmcyBwcm92aWRlcyB0byBpbi1rZXJuZWwgY2xpZW50czoKKworCisgIGNoYW5uZWwgbWFuYWdlbWVudCBmdW5jdGlvbnM6CisKKyAgICByZWxheV9vcGVuKGJhc2VfZmlsZW5hbWUsIHBhcmVudCwgc3ViYnVmX3NpemUsIG5fc3ViYnVmcywKKyAgICAgICAgICAgICAgIGNhbGxiYWNrcykKKyAgICByZWxheV9jbG9zZShjaGFuKQorICAgIHJlbGF5X2ZsdXNoKGNoYW4pCisgICAgcmVsYXlfcmVzZXQoY2hhbikKKyAgICByZWxheWZzX2NyZWF0ZV9kaXIobmFtZSwgcGFyZW50KQorICAgIHJlbGF5ZnNfcmVtb3ZlX2RpcihkZW50cnkpCisKKyAgY2hhbm5lbCBtYW5hZ2VtZW50IHR5cGljYWxseSBjYWxsZWQgb24gaW5zdGlnYXRpb24gb2YgdXNlcnNwYWNlOgorCisgICAgcmVsYXlfc3ViYnVmc19jb25zdW1lZChjaGFuLCBjcHUsIHN1YmJ1ZnNfY29uc3VtZWQpCisKKyAgd3JpdGUgZnVuY3Rpb25zOgorCisgICAgcmVsYXlfd3JpdGUoY2hhbiwgZGF0YSwgbGVuZ3RoKQorICAgIF9fcmVsYXlfd3JpdGUoY2hhbiwgZGF0YSwgbGVuZ3RoKQorICAgIHJlbGF5X3Jlc2VydmUoY2hhbiwgbGVuZ3RoKQorCisgIGNhbGxiYWNrczoKKworICAgIHN1YmJ1Zl9zdGFydChidWYsIHN1YmJ1ZiwgcHJldl9zdWJidWYsIHByZXZfcGFkZGluZykKKyAgICBidWZfbWFwcGVkKGJ1ZiwgZmlscCkKKyAgICBidWZfdW5tYXBwZWQoYnVmLCBmaWxwKQorCisgIGhlbHBlciBmdW5jdGlvbnM6CisKKyAgICByZWxheV9idWZfZnVsbChidWYpCisgICAgc3ViYnVmX3N0YXJ0X3Jlc2VydmUoYnVmLCBsZW5ndGgpCisKKworQ3JlYXRpbmcgYSBjaGFubmVsCistLS0tLS0tLS0tLS0tLS0tLS0KKworcmVsYXlfb3BlbigpIGlzIHVzZWQgdG8gY3JlYXRlIGEgY2hhbm5lbCwgYWxvbmcgd2l0aCBpdHMgcGVyLWNwdQorY2hhbm5lbCBidWZmZXJzLiAgRWFjaCBjaGFubmVsIGJ1ZmZlciB3aWxsIGhhdmUgYW4gYXNzb2NpYXRlZCBmaWxlCitjcmVhdGVkIGZvciBpdCBpbiB0aGUgcmVsYXlmcyBmaWxlc3lzdGVtLCB3aGljaCBjYW4gYmUgb3BlbmVkIGFuZAorbW1hcHBlZCBmcm9tIHVzZXIgc3BhY2UgaWYgZGVzaXJlZC4gIFRoZSBmaWxlcyBhcmUgbmFtZWQKK2Jhc2VuYW1lMC4uLmJhc2VuYW1lTi0xIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBvbmxpbmUgY3B1cywgYW5kIGJ5CitkZWZhdWx0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZmlsZXN5c3RlbS4gIElmIHlvdSB3YW50IGEKK2RpcmVjdG9yeSBzdHJ1Y3R1cmUgdG8gY29udGFpbiB5b3VyIHJlbGF5ZnMgZmlsZXMsIHlvdSBjYW4gY3JlYXRlIGl0Cit3aXRoIHJlbGF5ZnNfY3JlYXRlX2RpcigpIGFuZCBwYXNzIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHRvCityZWxheV9vcGVuKCkuICBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgY2xlYW5pbmcgdXAgYW55IGRpcmVjdG9yeQorc3RydWN0dXJlIHRoZXkgY3JlYXRlIHdoZW4gdGhlIGNoYW5uZWwgaXMgY2xvc2VkIC0gdXNlCityZWxheWZzX3JlbW92ZV9kaXIoKSBmb3IgdGhhdC4KKworVGhlIHRvdGFsIHNpemUgb2YgZWFjaCBwZXItY3B1IGJ1ZmZlciBpcyBjYWxjdWxhdGVkIGJ5IG11bHRpcGx5aW5nIHRoZQorbnVtYmVyIG9mIHN1Yi1idWZmZXJzIGJ5IHRoZSBzdWItYnVmZmVyIHNpemUgcGFzc2VkIGludG8gcmVsYXlfb3BlbigpLgorVGhlIGlkZWEgYmVoaW5kIHN1Yi1idWZmZXJzIGlzIHRoYXQgdGhleSdyZSBiYXNpY2FsbHkgYW4gZXh0ZW5zaW9uIG9mCitkb3VibGUtYnVmZmVyaW5nIHRvIE4gYnVmZmVycywgYW5kIHRoZXkgYWxzbyBhbGxvdyBhcHBsaWNhdGlvbnMgdG8KK2Vhc2lseSBpbXBsZW1lbnQgcmFuZG9tLWFjY2Vzcy1vbi1idWZmZXItYm91bmRhcnkgc2NoZW1lcywgd2hpY2ggY2FuCitiZSBpbXBvcnRhbnQgZm9yIHNvbWUgaGlnaC12b2x1bWUgYXBwbGljYXRpb25zLiAgVGhlIG51bWJlciBhbmQgc2l6ZQorb2Ygc3ViLWJ1ZmZlcnMgaXMgY29tcGxldGVseSBkZXBlbmRlbnQgb24gdGhlIGFwcGxpY2F0aW9uIGFuZCBldmVuIGZvcgordGhlIHNhbWUgYXBwbGljYXRpb24sIGRpZmZlcmVudCBjb25kaXRpb25zIHdpbGwgd2FycmFudCBkaWZmZXJlbnQKK3ZhbHVlcyBmb3IgdGhlc2UgcGFyYW1ldGVycyBhdCBkaWZmZXJlbnQgdGltZXMuICBUeXBpY2FsbHksIHRoZSByaWdodAordmFsdWVzIHRvIHVzZSBhcmUgYmVzdCBkZWNpZGVkIGFmdGVyIHNvbWUgZXhwZXJpbWVudGF0aW9uOyBpbiBnZW5lcmFsLAordGhvdWdoLCBpdCdzIHNhZmUgdG8gYXNzdW1lIHRoYXQgaGF2aW5nIG9ubHkgMSBzdWItYnVmZmVyIGlzIGEgYmFkCitpZGVhIC0geW91J3JlIGd1YXJhbnRlZWQgdG8gZWl0aGVyIG92ZXJ3cml0ZSBkYXRhIG9yIGxvc2UgZXZlbnRzCitkZXBlbmRpbmcgb24gdGhlIGNoYW5uZWwgbW9kZSBiZWluZyB1c2VkLgorCitDaGFubmVsICdtb2RlcycKKy0tLS0tLS0tLS0tLS0tLQorCityZWxheWZzIGNoYW5uZWxzIGNhbiBiZSB1c2VkIGluIGVpdGhlciBvZiB0d28gbW9kZXMgLSAnb3ZlcndyaXRlJyBvcgorJ25vLW92ZXJ3cml0ZScuICBUaGUgbW9kZSBpcyBlbnRpcmVseSBkZXRlcm1pbmVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbgorb2YgdGhlIHN1YmJ1Zl9zdGFydCgpIGNhbGxiYWNrLCBhcyBkZXNjcmliZWQgYmVsb3cuICBJbiAnb3ZlcndyaXRlJworbW9kZSwgYWxzbyBrbm93biBhcyAnZmxpZ2h0IHJlY29yZGVyJyBtb2RlLCB3cml0ZXMgY29udGludW91c2x5IGN5Y2xlCithcm91bmQgdGhlIGJ1ZmZlciBhbmQgd2lsbCBuZXZlciBmYWlsLCBidXQgd2lsbCB1bmNvbmRpdGlvbmFsbHkKK292ZXJ3cml0ZSBvbGQgZGF0YSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQncyBhY3R1YWxseSBiZWVuIGNvbnN1bWVkLgorSW4gbm8tb3ZlcndyaXRlIG1vZGUsIHdyaXRlcyB3aWxsIGZhaWwgaS5lLiBkYXRhIHdpbGwgYmUgbG9zdCwgaWYgdGhlCitudW1iZXIgb2YgdW5jb25zdW1lZCBzdWItYnVmZmVycyBlcXVhbHMgdGhlIHRvdGFsIG51bWJlciBvZgorc3ViLWJ1ZmZlcnMgaW4gdGhlIGNoYW5uZWwuICBJdCBzaG91bGQgYmUgY2xlYXIgdGhhdCBpZiB0aGVyZSBpcyBubworY29uc3VtZXIgb3IgaWYgdGhlIGNvbnN1bWVyIGNhbid0IGNvbnN1bWUgc3ViLWJ1ZmZlcnMgZmFzdCBlbm91Z2h0LAorZGF0YSB3aWxsIGJlIGxvc3QgaW4gZWl0aGVyIGNhc2U7IHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2hldGhlciBkYXRhCitpcyBsb3N0IGZyb20gdGhlIGJlZ2lubmluZyBvciB0aGUgZW5kIG9mIGEgYnVmZmVyLgorCitBcyBleHBsYWluZWQgYWJvdmUsIGEgcmVsYXlmcyBjaGFubmVsIGlzIG1hZGUgb2YgdXAgb25lIG9yIG1vcmUKK3Blci1jcHUgY2hhbm5lbCBidWZmZXJzLCBlYWNoIGltcGxlbWVudGVkIGFzIGEgY2lyY3VsYXIgYnVmZmVyCitzdWJkaXZpZGVkIGludG8gb25lIG9yIG1vcmUgc3ViLWJ1ZmZlcnMuICBNZXNzYWdlcyBhcmUgd3JpdHRlbiBpbnRvCit0aGUgY3VycmVudCBzdWItYnVmZmVyIG9mIHRoZSBjaGFubmVsJ3MgY3VycmVudCBwZXItY3B1IGJ1ZmZlciB2aWEgdGhlCit3cml0ZSBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93LiAgV2hlbmV2ZXIgYSBtZXNzYWdlIGNhbid0IGZpdCBpbnRvCit0aGUgY3VycmVudCBzdWItYnVmZmVyLCBiZWNhdXNlIHRoZXJlJ3Mgbm8gcm9vbSBsZWZ0IGZvciBpdCwgdGhlCitjbGllbnQgaXMgbm90aWZpZWQgdmlhIHRoZSBzdWJidWZfc3RhcnQoKSBjYWxsYmFjayB0aGF0IGEgc3dpdGNoIHRvIGEKK25ldyBzdWItYnVmZmVyIGlzIGFib3V0IHRvIG9jY3VyLiAgVGhlIGNsaWVudCB1c2VzIHRoaXMgY2FsbGJhY2sgdG8gMSkKK2luaXRpYWxpemUgdGhlIG5leHQgc3ViLWJ1ZmZlciBpZiBhcHByb3ByaWF0ZSAyKSBmaW5hbGl6ZSB0aGUgcHJldmlvdXMKK3N1Yi1idWZmZXIgaWYgYXBwcm9wcmlhdGUgYW5kIDMpIHJldHVybiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZword2hldGhlciBvciBub3QgdG8gYWN0dWFsbHkgZ28gYWhlYWQgd2l0aCB0aGUgc3ViLWJ1ZmZlciBzd2l0Y2guCisKK1RvIGltcGxlbWVudCAnbm8tb3ZlcndyaXRlJyBtb2RlLCB0aGUgdXNlcnNwYWNlIGNsaWVudCB3b3VsZCBwcm92aWRlCithbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3ViYnVmX3N0YXJ0KCkgY2FsbGJhY2sgc29tZXRoaW5nIGxpa2UgdGhlCitmb2xsb3dpbmc6CisKK3N0YXRpYyBpbnQgc3ViYnVmX3N0YXJ0KHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnN1YmJ1ZiwKKwkJCXZvaWQgKnByZXZfc3ViYnVmLAorCQkJdW5zaWduZWQgaW50IHByZXZfcGFkZGluZykKK3sKKwlpZiAocHJldl9zdWJidWYpCisJCSooKHVuc2lnbmVkICopcHJldl9zdWJidWYpID0gcHJldl9wYWRkaW5nOworCisJaWYgKHJlbGF5X2J1Zl9mdWxsKGJ1ZikpCisJCXJldHVybiAwOworCisJc3ViYnVmX3N0YXJ0X3Jlc2VydmUoYnVmLCBzaXplb2YodW5zaWduZWQgaW50KSk7CisKKwlyZXR1cm4gMTsKK30KKworSWYgdGhlIGN1cnJlbnQgYnVmZmVyIGlzIGZ1bGwgaS5lLiBhbGwgc3ViLWJ1ZmZlcnMgcmVtYWluIHVuY29uc3VtZWQsCit0aGUgY2FsbGJhY2sgcmV0dXJucyAwIHRvIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBzd2l0Y2ggc2hvdWxkIG5vdAorb2NjdXIgeWV0IGkuZS4gdW50aWwgdGhlIGNvbnN1bWVyIGhhcyBoYWQgYSBjaGFuY2UgdG8gcmVhZCB0aGUgY3VycmVudAorc2V0IG9mIHJlYWR5IHN1Yi1idWZmZXJzLiAgRm9yIHRoZSByZWxheV9idWZfZnVsbCgpIGZ1bmN0aW9uIHRvIG1ha2UKK3NlbnNlLCB0aGUgY29uc3VtZXIgaXMgcmVwb25zaWJsZSBmb3Igbm90aWZ5aW5nIHJlbGF5ZnMgd2hlbgorc3ViLWJ1ZmZlcnMgaGF2ZSBiZWVuIGNvbnN1bWVkIHZpYSByZWxheV9zdWJidWZzX2NvbnN1bWVkKCkuICBBbnkKK3N1YnNlcXVlbnQgYXR0ZW1wdHMgdG8gd3JpdGUgaW50byB0aGUgYnVmZmVyIHdpbGwgYWdhaW4gaW52b2tlIHRoZQorc3ViYnVmX3N0YXJ0KCkgY2FsbGJhY2sgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzOyBvbmx5IHdoZW4gdGhlCitjb25zdW1lciBoYXMgY29uc3VtZWQgb25lIG9yIG1vcmUgb2YgdGhlIHJlYWR5IHN1Yi1idWZmZXJzIHdpbGwKK3JlbGF5X2J1Zl9mdWxsKCkgcmV0dXJuIDAsIGluIHdoaWNoIGNhc2UgdGhlIGJ1ZmZlciBzd2l0Y2ggY2FuCitjb250aW51ZS4KKworVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdWJidWZfc3RhcnQoKSBjYWxsYmFjayBmb3IgJ292ZXJ3cml0ZScgbW9kZQord291bGQgYmUgdmVyeSBzaW1pbGFyOgorCitzdGF0aWMgaW50IHN1YmJ1Zl9zdGFydChzdHJ1Y3QgcmNoYW5fYnVmICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzdWJidWYsCisJCQl2b2lkICpwcmV2X3N1YmJ1ZiwKKwkJCXVuc2lnbmVkIGludCBwcmV2X3BhZGRpbmcpCit7CisJaWYgKHByZXZfc3ViYnVmKQorCQkqKCh1bnNpZ25lZCAqKXByZXZfc3ViYnVmKSA9IHByZXZfcGFkZGluZzsKKworCXN1YmJ1Zl9zdGFydF9yZXNlcnZlKGJ1Ziwgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworCisJcmV0dXJuIDE7Cit9CisKK0luIHRoaXMgY2FzZSwgdGhlIHJlbGF5X2J1Zl9mdWxsKCkgY2hlY2sgaXMgbWVhbmluZ2xlc3MgYW5kIHRoZQorY2FsbGJhY2sgYWx3YXlzIHJldHVybnMgMSwgY2F1c2luZyB0aGUgYnVmZmVyIHN3aXRjaCB0byBvY2N1cgordW5jb25kaXRpb25hbGx5LiAgSXQncyBhbHNvIG1lYW5pbmdsZXNzIGZvciB0aGUgY2xpZW50IHRvIHVzZSB0aGUKK3JlbGF5X3N1YmJ1ZnNfY29uc3VtZWQoKSBmdW5jdGlvbiBpbiB0aGlzIG1vZGUsIGFzIGl0J3MgbmV2ZXIKK2NvbnN1bHRlZC4KKworVGhlIGRlZmF1bHQgc3ViYnVmX3N0YXJ0KCkgaW1wbGVtZW50YXRpb24sIHVzZWQgaWYgdGhlIGNsaWVudCBkb2Vzbid0CitkZWZpbmUgYW55IGNhbGxiYWNrcywgb3IgZG9lc24ndCBkZWZpbmUgdGhlIHN1YmJ1Zl9zdGFydCgpIGNhbGxiYWNrLAoraW1wbGVtZW50cyB0aGUgc2ltcGxlc3QgcG9zc2libGUgJ25vLW92ZXJ3cml0ZScgbW9kZSBpLmUuIGl0IGRvZXMKK25vdGhpbmcgYnV0IHJldHVybiAwLgorCitIZWFkZXIgaW5mb3JtYXRpb24gY2FuIGJlIHJlc2VydmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzdWItYnVmZmVyCitieSBjYWxsaW5nIHRoZSBzdWJidWZfc3RhcnRfcmVzZXJ2ZSgpIGhlbHBlciBmdW5jdGlvbiBmcm9tIHdpdGhpbiB0aGUKK3N1YmJ1Zl9zdGFydCgpIGNhbGxiYWNrLiAgVGhpcyByZXNlcnZlZCBhcmVhIGNhbiBiZSB1c2VkIHRvIHN0b3JlCit3aGF0ZXZlciBpbmZvcm1hdGlvbiB0aGUgY2xpZW50IHdhbnRzLiAgSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHJvb20gaXMKK3Jlc2VydmVkIGluIGVhY2ggc3ViLWJ1ZmZlciB0byBzdG9yZSB0aGUgcGFkZGluZyBjb3VudCBmb3IgdGhhdAorc3ViLWJ1ZmZlci4gIFRoaXMgaXMgZmlsbGVkIGluIGZvciB0aGUgcHJldmlvdXMgc3ViLWJ1ZmZlciBpbiB0aGUKK3N1YmJ1Zl9zdGFydCgpIGltcGxlbWVudGF0aW9uOyB0aGUgcGFkZGluZyB2YWx1ZSBmb3IgdGhlIHByZXZpb3VzCitzdWItYnVmZmVyIGlzIHBhc3NlZCBpbnRvIHRoZSBzdWJidWZfc3RhcnQoKSBjYWxsYmFjayBhbG9uZyB3aXRoIGEKK3BvaW50ZXIgdG8gdGhlIHByZXZpb3VzIHN1Yi1idWZmZXIsIHNpbmNlIHRoZSBwYWRkaW5nIHZhbHVlIGlzbid0Citrbm93biB1bnRpbCBhIHN1Yi1idWZmZXIgaXMgZmlsbGVkLiAgVGhlIHN1YmJ1Zl9zdGFydCgpIGNhbGxiYWNrIGlzCithbHNvIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHN1Yi1idWZmZXIgd2hlbiB0aGUgY2hhbm5lbCBpcyBvcGVuZWQsIHRvCitnaXZlIHRoZSBjbGllbnQgYSBjaGFuY2UgdG8gcmVzZXJ2ZSBzcGFjZSBpbiBpdC4gIEluIHRoaXMgY2FzZSB0aGUKK3ByZXZpb3VzIHN1Yi1idWZmZXIgcG9pbnRlciBwYXNzZWQgaW50byB0aGUgY2FsbGJhY2sgd2lsbCBiZSBOVUxMLCBzbwordGhlIGNsaWVudCBzaG91bGQgY2hlY2sgdGhlIHZhbHVlIG9mIHRoZSBwcmV2X3N1YmJ1ZiBwb2ludGVyIGJlZm9yZQord3JpdGluZyBpbnRvIHRoZSBwcmV2aW91cyBzdWItYnVmZmVyLgorCitXcml0aW5nIHRvIGEgY2hhbm5lbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora2VybmVsIGNsaWVudHMgd3JpdGUgZGF0YSBpbnRvIHRoZSBjdXJyZW50IGNwdSdzIGNoYW5uZWwgYnVmZmVyIHVzaW5nCityZWxheV93cml0ZSgpIG9yIF9fcmVsYXlfd3JpdGUoKS4gIHJlbGF5X3dyaXRlKCkgaXMgdGhlIG1haW4gbG9nZ2luZworZnVuY3Rpb24gLSBpdCB1c2VzIGxvY2FsX2lycXNhdmUoKSB0byBwcm90ZWN0IHRoZSBidWZmZXIgYW5kIHNob3VsZCBiZQordXNlZCBpZiB5b3UgbWlnaHQgYmUgbG9nZ2luZyBmcm9tIGludGVycnVwdCBjb250ZXh0LiAgSWYgeW91IGtub3cKK3lvdSdsbCBuZXZlciBiZSBsb2dnaW5nIGZyb20gaW50ZXJydXB0IGNvbnRleHQsIHlvdSBjYW4gdXNlCitfX3JlbGF5X3dyaXRlKCksIHdoaWNoIG9ubHkgZGlzYWJsZXMgcHJlZW1wdGlvbi4gIFRoZXNlIGZ1bmN0aW9ucworZG9uJ3QgcmV0dXJuIGEgdmFsdWUsIHNvIHlvdSBjYW4ndCBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhleQorZmFpbGVkIC0gdGhlIGFzc3VtcHRpb24gaXMgdGhhdCB5b3Ugd291bGRuJ3Qgd2FudCB0byBjaGVjayBhIHJldHVybgordmFsdWUgaW4gdGhlIGZhc3QgbG9nZ2luZyBwYXRoIGFueXdheSwgYW5kIHRoYXQgdGhleSdsbCBhbHdheXMgc3VjY2VlZAordW5sZXNzIHRoZSBidWZmZXIgaXMgZnVsbCBhbmQgbm8tb3ZlcndyaXRlIG1vZGUgaXMgYmVpbmcgdXNlZCwgaW4KK3doaWNoIGNhc2UgeW91IGNhbiBkZXRlY3QgYSBmYWlsZWQgd3JpdGUgaW4gdGhlIHN1YmJ1Zl9zdGFydCgpCitjYWxsYmFjayBieSBjYWxsaW5nIHRoZSByZWxheV9idWZfZnVsbCgpIGhlbHBlciBmdW5jdGlvbi4KKworcmVsYXlfcmVzZXJ2ZSgpIGlzIHVzZWQgdG8gcmVzZXJ2ZSBhIHNsb3QgaW4gYSBjaGFubmVsIGJ1ZmZlciB3aGljaAorY2FuIGJlIHdyaXR0ZW4gdG8gbGF0ZXIuICBUaGlzIHdvdWxkIHR5cGljYWxseSBiZSB1c2VkIGluIGFwcGxpY2F0aW9ucwordGhhdCBuZWVkIHRvIHdyaXRlIGRpcmVjdGx5IGludG8gYSBjaGFubmVsIGJ1ZmZlciB3aXRob3V0IGhhdmluZyB0bworc3RhZ2UgZGF0YSBpbiBhIHRlbXBvcmFyeSBidWZmZXIgYmVmb3JlaGFuZC4gIEJlY2F1c2UgdGhlIGFjdHVhbCB3cml0ZQorbWF5IG5vdCBoYXBwZW4gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNsb3QgaXMgcmVzZXJ2ZWQsIGFwcGxpY2F0aW9ucwordXNpbmcgcmVsYXlfcmVzZXJ2ZSgpIGNhbiBrZWVwIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseQord3JpdHRlbiwgZWl0aGVyIGluIHNwYWNlIHJlc2VydmVkIGluIHRoZSBzdWItYnVmZmVycyB0aGVtc2VsdmVzIG9yIGFzCithIHNlcGFyYXRlIGFycmF5LiAgU2VlIHRoZSAncmVzZXJ2ZScgZXhhbXBsZSBpbiB0aGUgcmVsYXktYXBwcyB0YXJiYWxsCithdCBodHRwOi8vcmVsYXlmcy5zb3VyY2Vmb3JnZS5uZXQgZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgY2FuIGJlCitkb25lLiAgQmVjYXVzZSB0aGUgd3JpdGUgaXMgdW5kZXIgY29udHJvbCBvZiB0aGUgY2xpZW50IGFuZCBpcworc2VwYXJhdGVkIGZyb20gdGhlIHJlc2VydmUsIHJlbGF5X3Jlc2VydmUoKSBkb2Vzbid0IHByb3RlY3QgdGhlIGJ1ZmZlcgorYXQgYWxsIC0gaXQncyB1cCB0byB0aGUgY2xpZW50IHRvIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlCitzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyByZWxheV9yZXNlcnZlKCkuCisKK0Nsb3NpbmcgYSBjaGFubmVsCistLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgY2xpZW50IGNhbGxzIHJlbGF5X2Nsb3NlKCkgd2hlbiBpdCdzIGZpbmlzaGVkIHVzaW5nIHRoZSBjaGFubmVsLgorVGhlIGNoYW5uZWwgYW5kIGl0cyBhc3NvY2lhdGVkIGJ1ZmZlcnMgYXJlIGRlc3Ryb3llZCB3aGVuIHRoZXJlIGFyZSBubworbG9uZ2VyIGFueSByZWZlcmVuY2VzIHRvIGFueSBvZiB0aGUgY2hhbm5lbCBidWZmZXJzLiAgcmVsYXlfZmx1c2goKQorZm9yY2VzIGEgc3ViLWJ1ZmZlciBzd2l0Y2ggb24gYWxsIHRoZSBjaGFubmVsIGJ1ZmZlcnMsIGFuZCBjYW4gYmUgdXNlZAordG8gZmluYWxpemUgYW5kIHByb2Nlc3MgdGhlIGxhc3Qgc3ViLWJ1ZmZlcnMgYmVmb3JlIHRoZSBjaGFubmVsIGlzCitjbG9zZWQuCisKK01pc2MKKy0tLS0KKworU29tZSBhcHBsaWNhdGlvbnMgbWF5IHdhbnQgdG8ga2VlcCBhIGNoYW5uZWwgYXJvdW5kIGFuZCByZS11c2UgaXQKK3JhdGhlciB0aGFuIG9wZW4gYW5kIGNsb3NlIGEgbmV3IGNoYW5uZWwgZm9yIGVhY2ggdXNlLiAgcmVsYXlfcmVzZXQoKQorY2FuIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZSAtIGl0IHJlc2V0cyBhIGNoYW5uZWwgdG8gaXRzIGluaXRpYWwKK3N0YXRlIHdpdGhvdXQgcmVhbGxvY2F0aW5nIGNoYW5uZWwgYnVmZmVyIG1lbW9yeSBvciBkZXN0cm95aW5nCitleGlzdGluZyBtYXBwaW5ncy4gIEl0IHNob3VsZCBob3dldmVyIG9ubHkgYmUgY2FsbGVkIHdoZW4gaXQncyBzYWZlIHRvCitkbyBzbyBpLmUuIHdoZW4gdGhlIGNoYW5uZWwgaXNuJ3QgY3VycmVudGx5IGJlaW5nIHdyaXR0ZW4gdG8uCisKK0ZpbmFsbHksIHRoZXJlIGFyZSBhIGNvdXBsZSBvZiB1dGlsaXR5IGNhbGxiYWNrcyB0aGF0IGNhbiBiZSB1c2VkIGZvcgorZGlmZmVyZW50IHB1cnBvc2VzLiAgYnVmX21hcHBlZCgpIGlzIGNhbGxlZCB3aGVuZXZlciBhIGNoYW5uZWwgYnVmZmVyCitpcyBtbWFwcGVkIGZyb20gdXNlciBzcGFjZSBhbmQgYnVmX3VubWFwcGVkKCkgaXMgY2FsbGVkIHdoZW4gaXQncwordW5tYXBwZWQuICBUaGUgY2xpZW50IGNhbiB1c2UgdGhpcyBub3RpZmljYXRpb24gdG8gdHJpZ2dlciBhY3Rpb25zCit3aXRoaW4gdGhlIGtlcm5lbCBhcHBsaWNhdGlvbiwgc3VjaCBhcyBlbmFibGluZy9kaXNhYmxpbmcgbG9nZ2luZyB0bwordGhlIGNoYW5uZWwuCisKKworUmVzb3VyY2VzCis9PT09PT09PT0KKworRm9yIG5ld3MsIGV4YW1wbGUgY29kZSwgbWFpbGluZyBsaXN0LCBldGMuIHNlZSB0aGUgcmVsYXlmcyBob21lcGFnZToKKworICAgIGh0dHA6Ly9yZWxheWZzLnNvdXJjZWZvcmdlLm5ldAorCisKK0NyZWRpdHMKKz09PT09PT0KKworVGhlIGlkZWFzIGFuZCBzcGVjcyBmb3IgcmVsYXlmcyBjYW1lIGFib3V0IGFzIGEgcmVzdWx0IG9mIGRpc2N1c3Npb25zCitvbiB0cmFjaW5nIGludm9sdmluZyB0aGUgZm9sbG93aW5nOgorCitNaWNoZWwgRGFnZW5haXMJCTxtaWNoZWwuZGFnZW5haXNAcG9seW10bC5jYT4KK1JpY2hhcmQgTW9vcmUJCTxyaWNoYXJkal9tb29yZUB1ay5pYm0uY29tPgorQm9iIFdpc25pZXdza2kJCTxib2JAd2F0c29uLmlibS5jb20+CitLYXJpbSBZYWdobW91cgkJPGthcmltQG9wZXJzeXMuY29tPgorVG9tIFphbnVzc2kJCTx6YW51c3NpQHVzLmlibS5jb20+CisKK0Fsc28gdGhhbmtzIHRvIEh1YmVydHVzIEZyYW5rZSBmb3IgYSBsb3Qgb2YgdXNlZnVsIHN1Z2dlc3Rpb25zIGFuZCBidWcKK3JlcG9ydHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N5c2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3lzZnMudHh0CmluZGV4IGRjMjc2NTkuLmM4YmNlODIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3lzZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3lzZnMudHh0CkBAIC05MCw3ICs5MCw3IEBACiAKIEl0IGFsc28gZGVmaW5lcyB0aGlzIGhlbHBlciBmb3IgZGVmaW5pbmcgZGV2aWNlIGF0dHJpYnV0ZXM6IAogCi0jZGVmaW5lIERFVklDRV9BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkgICAgICBcCisjZGVmaW5lIERFVklDRV9BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICBcCiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl8jI19uYW1lID0geyAgICAgICAgICAgIFwKICAgICAgICAgLmF0dHIgPSB7Lm5hbWUgID0gX19zdHJpbmdpZnkoX25hbWUpICwgLm1vZGUgICA9IF9tb2RlIH0sICAgICAgXAogICAgICAgICAuc2hvdyAgID0gX3Nob3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC05OSwxNCArOTksMTQgQEAKIAogRm9yIGV4YW1wbGUsIGRlY2xhcmluZwogCi1zdGF0aWMgREVWSUNFX0FUVFIoZm9vLDA2NDQsc2hvd19mb28sc3RvcmVfZm9vKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmb28sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zvbywgc3RvcmVfZm9vKTsKIAogaXMgZXF1aXZhbGVudCB0byBkb2luZzoKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2ZvbyA9IHsKICAgICAgICAuYXR0cgk9IHsKIAkJLm5hbWUgPSAiZm9vIiwKLQkJLm1vZGUgPSAwNjQ0LAorCQkubW9kZSA9IFNfSVdVU1IgfCBTX0lSVUdPLAogCX0sCiAJLnNob3cgPSBzaG93X2ZvbywKIAkuc3RvcmUgPSBzdG9yZV9mb28sCkBAIC0xMjEsOCArMTIxLDggQEAKIHNob3cgYW5kIHN0b3JlIG1ldGhvZHMgb2YgdGhlIGF0dHJpYnV0ZSBvd25lcnMuIAogCiBzdHJ1Y3Qgc3lzZnNfb3BzIHsKLSAgICAgICAgc3NpemVfdCAoKnNob3cpKHN0cnVjdCBrb2JqZWN0ICosIHN0cnVjdCBhdHRyaWJ1dGUgKixjaGFyICopOwotICAgICAgICBzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBrb2JqZWN0ICosc3RydWN0IGF0dHJpYnV0ZSAqLGNvbnN0IGNoYXIgKik7CisgICAgICAgIHNzaXplX3QgKCpzaG93KShzdHJ1Y3Qga29iamVjdCAqLCBzdHJ1Y3QgYXR0cmlidXRlICosIGNoYXIgKik7CisgICAgICAgIHNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGtvYmplY3QgKiwgc3RydWN0IGF0dHJpYnV0ZSAqLCBjb25zdCBjaGFyICopOwogfTsKIAogWyBTdWJzeXN0ZW1zIHNob3VsZCBoYXZlIGFscmVhZHkgZGVmaW5lZCBhIHN0cnVjdCBrb2JqX3R5cGUgYXMgYQpAQCAtMTM3LDcgKzEzNyw3IEBACiAKIFRvIGlsbHVzdHJhdGU6CiAKLSNkZWZpbmUgdG9fZGV2X2F0dHIoX2F0dHIpIGNvbnRhaW5lcl9vZihfYXR0cixzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSxhdHRyKQorI2RlZmluZSB0b19kZXZfYXR0cihfYXR0cikgY29udGFpbmVyX29mKF9hdHRyLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSwgYXR0cikKICNkZWZpbmUgdG9fZGV2KGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKQogCiBzdGF0aWMgc3NpemVfdApAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgICAgIHNzaXplX3QgcmV0ID0gMDsKIAogICAgICAgICBpZiAoZGV2X2F0dHItPnNob3cpCi0gICAgICAgICAgICAgICAgcmV0ID0gZGV2X2F0dHItPnNob3coZGV2LGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0ID0gZGV2X2F0dHItPnNob3coZGV2LCBidWYpOwogICAgICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0yMTYsMTYgKzIxNiwxNiBAQAogCiBzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotICAgICAgICByZXR1cm4gc3ByaW50ZihidWYsIiVzXG4iLGRldi0+bmFtZSk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGRldi0+bmFtZSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX25hbWUoc3RydWN0IGRldmljZSAqIGRldiwgY29uc3QgY2hhciAqIGJ1ZikKIHsKLQlzc2NhbmYoYnVmLCIlMjBzIixkZXYtPm5hbWUpOwotCXJldHVybiBzdHJsZW4oYnVmKTsKKwlzc2NhbmYoYnVmLCAiJTIwcyIsIGRldi0+bmFtZSk7CisJcmV0dXJuIHN0cm5sZW4oYnVmLCBQQUdFX1NJWkUpOwogfQogCi1zdGF0aWMgREVWSUNFX0FUVFIobmFtZSxTX0lSVUdPLHNob3dfbmFtZSxzdG9yZV9uYW1lKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIHN0b3JlX25hbWUpOwogCiAKIChOb3RlIHRoYXQgdGhlIHJlYWwgaW1wbGVtZW50YXRpb24gZG9lc24ndCBhbGxvdyB1c2Vyc3BhY2UgdG8gc2V0IHRoZSAKQEAgLTI5MCw3ICsyOTAsNyBAQAogCiBEZWNsYXJpbmc6CiAKLURFVklDRV9BVFRSKF9uYW1lLF9zdHIsX21vZGUsX3Nob3csX3N0b3JlKTsKK0RFVklDRV9BVFRSKF9uYW1lLCBfc3RyLCBfbW9kZSwgX3Nob3csIF9zdG9yZSk7CiAKIENyZWF0aW9uL1JlbW92YWw6CiAKQEAgLTMxMCw3ICszMTAsNyBAQAogCiBEZWNsYXJpbmc6CiAKLUJVU19BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkKK0JVU19BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkKIAogQ3JlYXRpb24vUmVtb3ZhbDoKIApAQCAtMzMxLDcgKzMzMSw3IEBACiAKIERlY2xhcmluZzoKIAotRFJJVkVSX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKQorRFJJVkVSX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQogCiBDcmVhdGlvbi9SZW1vdmFsOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Y5ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92OWZzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTkyZmViCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92OWZzLnR4dApAQCAtMCwwICsxLDk1IEBACisJCQlWOUZTOiA5UDIwMDAgZm9yIExpbnV4CisJCQk9PT09PT09PT09PT09PT09PT09PT09CisKK0FCT1VUCis9PT09PQorCit2OWZzIGlzIGEgVW5peCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGxhbiA5IDlwIHJlbW90ZSBmaWxlc3lzdGVtIHByb3RvY29sLgorCitUaGlzIHNvZnR3YXJlIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CithbmQgTWF5YSBHb2toYWxlIDxtYXlhQGxhbmwuZ292Pi4gIEFkZGl0aW9uYWwgZGV2ZWxvcG1lbnQgYnkgR3JlZyBXYXRzb24KKzxnd2F0c29uQGxhbmwuZ292PiBhbmQgbW9zdCByZWNlbnRseSBFcmljIFZhbiBIZW5zYmVyZ2VuCis8ZXJpY3ZoQGdtYWlsLmNvbT4gYW5kIExhdGNoZXNhciBJb25rb3YgPGx1Y2hvQGlvbmtvdi5uZXQ+LgorCitVU0FHRQorPT09PT0KKworRm9yIHJlbW90ZSBmaWxlIHNlcnZlcjoKKworCW1vdW50IC10IDlQIDEwLjEwLjEuMiAvbW50LzkKKworRm9yIFBsYW4gOSBGcm9tIFVzZXIgU3BhY2UgYXBwbGljYXRpb25zIChodHRwOi8vc3d0Y2guY29tL3BsYW45KQorCisJbW91bnQgLXQgOVAgYG5hbWVzcGFjZWAvYWNtZSAvbW50LzkgLW8gcHJvdG89dW5peCxuYW1lPSRVU0VSCisKK09QVElPTlMKKz09PT09PT0KKworICBwcm90bz1uYW1lCXNlbGVjdCBhbiBhbHRlcm5hdGl2ZSB0cmFuc3BvcnQuICBWYWxpZCBvcHRpb25zIGFyZQorICAJCWN1cnJlbnRseToKKyAJCQl1bml4IC0gc3BlY2lmeWluZyBhIG5hbWVkIHBpcGUgbW91bnQgcG9pbnQKKyAJCQl0Y3AgIC0gc3BlY2lmeWluZyBhIG5vcm1hbCBUQ1AvSVAgY29ubmVjdGlvbgorIAkJCWZkICAgLSB1c2VkIHBhc3NlZCBmaWxlIGRlc2NyaXB0b3JzIGZvciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWUgcmZkbm8gYW5kIHdmZG5vKQorCisgIG5hbWU9bmFtZQl1c2VyIG5hbWUgdG8gYXR0ZW1wdCBtb3VudCBhcyBvbiB0aGUgcmVtb3RlIHNlcnZlci4gIFRoZQorICAJCXNlcnZlciBtYXkgb3ZlcnJpZGUgb3IgaWdub3JlIHRoaXMgdmFsdWUuICBDZXJ0YWluIHVzZXIKKwkJbmFtZXMgbWF5IHJlcXVpcmUgYXV0aGVudGljYXRpb24uCisKKyAgYW5hbWU9bmFtZQlhbmFtZSBzcGVjaWZpZXMgdGhlIGZpbGUgdHJlZSB0byBhY2Nlc3Mgd2hlbiB0aGUgc2VydmVyIGlzCisgIAkJb2ZmZXJpbmcgc2V2ZXJhbCBleHBvcnRlZCBmaWxlIHN5c3RlbXMuCisKKyAgZGVidWc9bglzcGVjaWZpZXMgZGVidWcgbGV2ZWwuICBUaGUgZGVidWcgbGV2ZWwgaXMgYSBiaXRtYXNrLgorICAJCQkweDAxID0gZGlzcGxheSB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzCisJCQkweDAyID0gZGV2ZWxvcGVyIGRlYnVnIChERUJVR19DVVJSRU5UKQorCQkJMHgwNCA9IGRpc3BsYXkgOVAgdHJhY2UKKwkJCTB4MDggPSBkaXNwbGF5IFZGUyB0cmFjZQorCQkJMHgxMCA9IGRpc3BsYXkgTWFyc2hhbGxpbmcgZGVidWcKKwkJCTB4MjAgPSBkaXNwbGF5IFJQQyBkZWJ1ZworCQkJMHg0MCA9IGRpc3BsYXkgdHJhbnNwb3J0IGRlYnVnCisJCQkweDgwID0gZGlzcGxheSBhbGxvY2F0aW9uIGRlYnVnCisKKyAgcmZkbm89bgl0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciByZWFkaW5nIHdpdGggcHJvdG89ZmQKKworICB3ZmRubz1uCXRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHdyaXRpbmcgd2l0aCBwcm90bz1mZAorCisgIG1heGRhdGE9bgl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHVzZSBmb3IgOVAgcGFja2V0IHBheWxvYWQgKG1zaXplKQorCisgIHBvcnQ9bglwb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBzZXJ2ZXIKKworICB0aW1lb3V0PW4JcmVxdWVzdCB0aW1lb3V0cyAoaW4gbXMpIChkZWZhdWx0IDYwMDAwbXMpCisKKyAgbm9leHRlbmQJZm9yY2UgbGVnYWN5IG1vZGUgKG5vIDlQMjAwMC51IHNlbWFudGljcykKKworICB1aWQJCWF0dGVtcHQgdG8gbW91bnQgYXMgYSBwYXJ0aWN1bGFyIHVpZAorCisgIGdpZAkJYXR0ZW1wdCB0byBtb3VudCB3aXRoIGEgcGFydGljdWxhciBnaWQKKworICBhZmlkCQlzZWN1cml0eSBjaGFubmVsIC0gdXNlZCBieSBQbGFuIDkgYXV0aGVudGljYXRpb24gcHJvdG9jb2xzCisKKyAgbm9kZXZtYXAJZG8gbm90IG1hcCBzcGVjaWFsIGZpbGVzIC0gcmVwcmVzZW50IHRoZW0gYXMgbm9ybWFsIGZpbGVzLgorICAJCVRoaXMgY2FuIGJlIHVzZWQgdG8gc2hhcmUgZGV2aWNlcy9uYW1lZCBwaXBlcy9zb2NrZXRzIGJldHdlZW4KKwkJaG9zdHMuICBUaGlzIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBleHBhbmRlZCBpbiBsYXRlciB2ZXJzaW9ucy4KKworUkVTT1VSQ0VTCis9PT09PT09PT0KKworVGhlIExpbnV4IHZlcnNpb24gb2YgdGhlIDlQIHNlcnZlciwgYWxvbmcgd2l0aCBzb21lIGNsaWVudC1zaWRlIHV0aWxpdGllcworY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly92OWZzLnNmLm5ldCAoYWxvbmcgd2l0aCBhIENWUyByZXBvc2l0b3J5IG9mIHRoZQorZGV2ZWxvcG1lbnQgYnJhbmNoIG9mIHRoaXMgbW9kdWxlKS4gIFRoZXJlIGFyZSB1c2VyIGFuZCBkZXZlbG9wZXIgbWFpbGluZworbGlzdHMgaGVyZSwgYXMgd2VsbCBhcyBhIGJ1Zy10cmFja2VyLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgUGxhbiA5IE9wZXJhdGluZyBTeXN0ZW0gY2hlY2sgb3V0CitodHRwOi8vcGxhbjkuYmVsbC1sYWJzLmNvbS9wbGFuOQorCitGb3IgaW5mb3JtYXRpb24gb24gUGxhbiA5IGZyb20gVXNlciBTcGFjZSAoUGxhbiA5IGFwcGxpY2F0aW9ucyBhbmQgbGlicmFyaWVzCitwb3J0ZWQgdG8gTGludXgvQlNEL09TWC9ldGMpIGNoZWNrIG91dCBodHRwOi8vc3d0Y2guY29tL3BsYW45CisKKworU1RBVFVTCis9PT09PT0KKworVGhlIDIuNiBrZXJuZWwgc3VwcG9ydCBpcyB3b3JraW5nIG9uIFBQQyBhbmQgeDg2LgorCitQTEVBU0UgVVNFIFRIRSBTT1VSQ0VGT1JHRSBCVUctVFJBQ0tFUiBUTyBSRVBPUlQgUFJPQkxFTVMuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dAppbmRleCAzZjMxOGRkLi5mMDQyYzEyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CkBAIC0xLDM1ICsxLDI3IEBACi0vKiAtKi0gYXV0by1maWxsIC0qLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLQkJT3ZlcnZpZXcgb2YgdGhlIFZpcnR1YWwgRmlsZSBTeXN0ZW0KKwkgICAgICBPdmVydmlldyBvZiB0aGUgTGludXggVmlydHVhbCBGaWxlIFN5c3RlbQogCi0JCVJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCU9yaWdpbmFsIGF1dGhvcjogUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CiAKLQkJCSAgICAgIDUtSlVMLTE5OTkKKwkJICBMYXN0IHVwZGF0ZWQgb24gQXVndXN0IDI1LCAyMDA1CisKKyAgQ29weXJpZ2h0IChDKSAxOTk5IFJpY2hhcmQgR29vY2gKKyAgQ29weXJpZ2h0IChDKSAyMDA1IFBla2thIEVuYmVyZworCisgIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAKIAotQ29udmVudGlvbnMgdXNlZCBpbiB0aGlzIGRvY3VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uPgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUVhY2ggc2VjdGlvbiBpbiB0aGlzIGRvY3VtZW50IHdpbGwgaGF2ZSB0aGUgc3RyaW5nICI8c2VjdGlvbj4iIGF0IHRoZQotcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBzZWN0aW9uIHRpdGxlLiBFYWNoIHN1YnNlY3Rpb24gd2lsbCBoYXZlCi0iPHN1YnNlY3Rpb24+IiBhdCB0aGUgcmlnaHQtaGFuZCBzaWRlLiBUaGVzZSBzdHJpbmdzIGFyZSBtZWFudCB0byBtYWtlCi1pdCBlYXNpZXIgdG8gc2VhcmNoIHRocm91Z2ggdGhlIGRvY3VtZW50LgotCi1OT1RFIHRoYXQgdGhlIG1hc3RlciBjb3B5IG9mIHRoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIG9ubGluZSBhdDoKLWh0dHA6Ly93d3cuYXRuZi5jc2lyby5hdS9+cmdvb2NoL2xpbnV4L2RvY3MvdmZzLnR4dAotCi0KLVdoYXQgaXMgaXQ/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj4KK1doYXQgaXMgaXQ/CiA9PT09PT09PT09PQogCiBUaGUgVmlydHVhbCBGaWxlIFN5c3RlbSAob3RoZXJ3aXNlIGtub3duIGFzIHRoZSBWaXJ0dWFsIEZpbGVzeXN0ZW0KIFN3aXRjaCkgaXMgdGhlIHNvZnR3YXJlIGxheWVyIGluIHRoZSBrZXJuZWwgdGhhdCBwcm92aWRlcyB0aGUKIGZpbGVzeXN0ZW0gaW50ZXJmYWNlIHRvIHVzZXJzcGFjZSBwcm9ncmFtcy4gSXQgYWxzbyBwcm92aWRlcyBhbgogYWJzdHJhY3Rpb24gd2l0aGluIHRoZSBrZXJuZWwgd2hpY2ggYWxsb3dzIGRpZmZlcmVudCBmaWxlc3lzdGVtCi1pbXBsZW1lbnRhdGlvbnMgdG8gY28tZXhpc3QuCitpbXBsZW1lbnRhdGlvbnMgdG8gY29leGlzdC4KIAogCi1BIFF1aWNrIExvb2sgQXQgSG93IEl0IFdvcmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24+CitBIFF1aWNrIExvb2sgQXQgSG93IEl0IFdvcmtzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIEluIHRoaXMgc2VjdGlvbiBJJ2xsIGJyaWVmbHkgZGVzY3JpYmUgaG93IHRoaW5ncyB3b3JrLCBiZWZvcmUKQEAgLTM4LDcgKzMwLDggQEAKIG90aGVyIHZpZXcgd2hpY2ggaXMgaG93IGEgZmlsZXN5c3RlbSBpcyBzdXBwb3J0ZWQgYW5kIHN1YnNlcXVlbnRseQogbW91bnRlZC4KIAotT3BlbmluZyBhIEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdWJzZWN0aW9uPgorCitPcGVuaW5nIGEgRmlsZQogLS0tLS0tLS0tLS0tLS0KIAogVGhlIFZGUyBpbXBsZW1lbnRzIHRoZSBvcGVuKDIpLCBzdGF0KDIpLCBjaG1vZCgyKSBhbmQgc2ltaWxhciBzeXN0ZW0KQEAgLTc3LDcgKzcwLDcgQEAKIAogT3BlbmluZyBhIGZpbGUgcmVxdWlyZXMgYW5vdGhlciBvcGVyYXRpb246IGFsbG9jYXRpb24gb2YgYSBmaWxlCiBzdHJ1Y3R1cmUgKHRoaXMgaXMgdGhlIGtlcm5lbC1zaWRlIGltcGxlbWVudGF0aW9uIG9mIGZpbGUKLWRlc2NyaXB0b3JzKS4gVGhlIGZyZXNobHkgYWxsb2NhdGVkIGZpbGUgc3RydWN0dXJlIGlzIGluaXRpYWxpc2VkIHdpdGgKK2Rlc2NyaXB0b3JzKS4gVGhlIGZyZXNobHkgYWxsb2NhdGVkIGZpbGUgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIHdpdGgKIGEgcG9pbnRlciB0byB0aGUgZGVudHJ5IGFuZCBhIHNldCBvZiBmaWxlIG9wZXJhdGlvbiBtZW1iZXIgZnVuY3Rpb25zLgogVGhlc2UgYXJlIHRha2VuIGZyb20gdGhlIGlub2RlIGRhdGEuIFRoZSBvcGVuKCkgZmlsZSBtZXRob2QgaXMgdGhlbgogY2FsbGVkIHNvIHRoZSBzcGVjaWZpYyBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uIGNhbiBkbyBpdCdzIHdvcmsuIFlvdQpAQCAtMTAyLDcgKzk1LDggQEAKIHByb2Nlc3NvcnMuIFlvdSBzaG91bGQgZW5zdXJlIHRoYXQgYWNjZXNzIHRvIHNoYXJlZCByZXNvdXJjZXMgaXMKIHByb3RlY3RlZCBieSBhcHByb3ByaWF0ZSBsb2Nrcy4KIAotUmVnaXN0ZXJpbmcgYW5kIE1vdW50aW5nIGEgRmlsZXN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdWJzZWN0aW9uPgorCitSZWdpc3RlcmluZyBhbmQgTW91bnRpbmcgYSBGaWxlc3lzdGVtCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElmIHlvdSB3YW50IHRvIHN1cHBvcnQgYSBuZXcga2luZCBvZiBmaWxlc3lzdGVtIGluIHRoZSBrZXJuZWwsIGFsbCB5b3UKQEAgLTEyMywxNyArMTE3LDIxIEBACiBJdCdzIG5vdyB0aW1lIHRvIGxvb2sgYXQgdGhpbmdzIGluIG1vcmUgZGV0YWlsLgogCiAKLXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj4KK3N0cnVjdCBmaWxlX3N5c3RlbV90eXBlCiA9PT09PT09PT09PT09PT09PT09PT09PQogCi1UaGlzIGRlc2NyaWJlcyB0aGUgZmlsZXN5c3RlbS4gQXMgb2Yga2VybmVsIDIuMS45OSwgdGhlIGZvbGxvd2luZworVGhpcyBkZXNjcmliZXMgdGhlIGZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMTMsIHRoZSBmb2xsb3dpbmcKIG1lbWJlcnMgYXJlIGRlZmluZWQ6CiAKIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHsKIAljb25zdCBjaGFyICpuYW1lOwogCWludCBmc19mbGFnczsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKigqcmVhZF9zdXBlcikgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICosIGludCk7Ci0Jc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiBuZXh0OworICAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKigqZ2V0X3NiKSAoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCB2b2lkICopOworICAgICAgICB2b2lkICgqa2lsbF9zYikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKyAgICAgICAgc3RydWN0IG1vZHVsZSAqb3duZXI7CisgICAgICAgIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICogbmV4dDsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBmc19zdXBlcnM7CiB9OwogCiAgIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBmaWxlc3lzdGVtIHR5cGUsIHN1Y2ggYXMgImV4dDIiLCAiaXNvOTY2MCIsCkBAIC0xNDEsNTEgKzEzOSw5NyBAQAogCiAgIGZzX2ZsYWdzOiB2YXJpb3VzIGZsYWdzIChpLmUuIEZTX1JFUVVJUkVTX0RFViwgRlNfTk9fRENBQ0hFLCBldGMuKQogCi0gIHJlYWRfc3VwZXI6IHRoZSBtZXRob2QgdG8gY2FsbCB3aGVuIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMKKyAgZ2V0X3NiOiB0aGUgbWV0aG9kIHRvIGNhbGwgd2hlbiBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzCiAJZmlsZXN5c3RlbSBzaG91bGQgYmUgbW91bnRlZAogCi0gIG5leHQ6IGZvciBpbnRlcm5hbCBWRlMgdXNlOiB5b3Ugc2hvdWxkIGluaXRpYWxpc2UgdGhpcyB0byBOVUxMCisgIGtpbGxfc2I6IHRoZSBtZXRob2QgdG8gY2FsbCB3aGVuIGFuIGluc3RhbmNlIG9mIHRoaXMgZmlsZXN5c3RlbQorCXNob3VsZCBiZSB1bm1vdW50ZWQKIAotVGhlIHJlYWRfc3VwZXIoKSBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorICBvd25lcjogZm9yIGludGVybmFsIFZGUyB1c2U6IHlvdSBzaG91bGQgaW5pdGlhbGl6ZSB0aGlzIHRvIFRISVNfTU9EVUxFIGluCisgIAltb3N0IGNhc2VzLgorCisgIG5leHQ6IGZvciBpbnRlcm5hbCBWRlMgdXNlOiB5b3Ugc2hvdWxkIGluaXRpYWxpemUgdGhpcyB0byBOVUxMCisKK1RoZSBnZXRfc2IoKSBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgogCiAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2I6IHRoZSBzdXBlcmJsb2NrIHN0cnVjdHVyZS4gVGhpcyBpcyBwYXJ0aWFsbHkKLQlpbml0aWFsaXNlZCBieSB0aGUgVkZTIGFuZCB0aGUgcmVzdCBtdXN0IGJlIGluaXRpYWxpc2VkIGJ5IHRoZQotCXJlYWRfc3VwZXIoKSBtZXRob2QKKwlpbml0aWFsaXplZCBieSB0aGUgVkZTIGFuZCB0aGUgcmVzdCBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IHRoZQorCWdldF9zYigpIG1ldGhvZAorCisgIGludCBmbGFnczogbW91bnQgZmxhZ3MKKworICBjb25zdCBjaGFyICpkZXZfbmFtZTogdGhlIGRldmljZSBuYW1lIHdlIGFyZSBtb3VudGluZy4KIAogICB2b2lkICpkYXRhOiBhcmJpdHJhcnkgbW91bnQgb3B0aW9ucywgdXN1YWxseSBjb21lcyBhcyBhbiBBU0NJSQogCXN0cmluZwogCiAgIGludCBzaWxlbnQ6IHdoZXRoZXIgb3Igbm90IHRvIGJlIHNpbGVudCBvbiBlcnJvcgogCi1UaGUgcmVhZF9zdXBlcigpIG1ldGhvZCBtdXN0IGRldGVybWluZSBpZiB0aGUgYmxvY2sgZGV2aWNlIHNwZWNpZmllZAorVGhlIGdldF9zYigpIG1ldGhvZCBtdXN0IGRldGVybWluZSBpZiB0aGUgYmxvY2sgZGV2aWNlIHNwZWNpZmllZAogaW4gdGhlIHN1cGVyYmxvY2sgY29udGFpbnMgYSBmaWxlc3lzdGVtIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QKIHN1cHBvcnRzLiBPbiBzdWNjZXNzIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgc3VwZXJibG9jayBwb2ludGVyLCBvbgogZmFpbHVyZSBpdCByZXR1cm5zIE5VTEwuCiAKIFRoZSBtb3N0IGludGVyZXN0aW5nIG1lbWJlciBvZiB0aGUgc3VwZXJibG9jayBzdHJ1Y3R1cmUgdGhhdCB0aGUKLXJlYWRfc3VwZXIoKSBtZXRob2QgZmlsbHMgaW4gaXMgdGhlICJzX29wIiBmaWVsZC4gVGhpcyBpcyBhIHBvaW50ZXIgdG8KK2dldF9zYigpIG1ldGhvZCBmaWxscyBpbiBpcyB0aGUgInNfb3AiIGZpZWxkLiBUaGlzIGlzIGEgcG9pbnRlciB0bwogYSAic3RydWN0IHN1cGVyX29wZXJhdGlvbnMiIHdoaWNoIGRlc2NyaWJlcyB0aGUgbmV4dCBsZXZlbCBvZiB0aGUKIGZpbGVzeXN0ZW0gaW1wbGVtZW50YXRpb24uCiAKK1VzdWFsbHksIGEgZmlsZXN5c3RlbSB1c2VzIGdlbmVyaWMgb25lIG9mIHRoZSBnZW5lcmljIGdldF9zYigpCitpbXBsZW1lbnRhdGlvbnMgYW5kIHByb3ZpZGVzIGEgZmlsbF9zdXBlcigpIG1ldGhvZCBpbnN0ZWFkLiBUaGUKK2dlbmVyaWMgbWV0aG9kcyBhcmU6CiAKLXN0cnVjdCBzdXBlcl9vcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj4KKyAgZ2V0X3NiX2JkZXY6IG1vdW50IGEgZmlsZXN5c3RlbSByZXNpZGluZyBvbiBhIGJsb2NrIGRldmljZQorCisgIGdldF9zYl9ub2RldjogbW91bnQgYSBmaWxlc3lzdGVtIHRoYXQgaXMgbm90IGJhY2tlZCBieSBhIGRldmljZQorCisgIGdldF9zYl9zaW5nbGU6IG1vdW50IGEgZmlsZXN5c3RlbSB3aGljaCBzaGFyZXMgdGhlIGluc3RhbmNlIGJldHdlZW4KKyAgCWFsbCBtb3VudHMKKworQSBmaWxsX3N1cGVyKCkgbWV0aG9kIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKKworICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOiB0aGUgc3VwZXJibG9jayBzdHJ1Y3R1cmUuIFRoZSBtZXRob2QgZmlsbF9zdXBlcigpCisgIAltdXN0IGluaXRpYWxpemUgdGhpcyBwcm9wZXJseS4KKworICB2b2lkICpkYXRhOiBhcmJpdHJhcnkgbW91bnQgb3B0aW9ucywgdXN1YWxseSBjb21lcyBhcyBhbiBBU0NJSQorCXN0cmluZworCisgIGludCBzaWxlbnQ6IHdoZXRoZXIgb3Igbm90IHRvIGJlIHNpbGVudCBvbiBlcnJvcgorCisKK3N0cnVjdCBzdXBlcl9vcGVyYXRpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGlzIGRlc2NyaWJlcyBob3cgdGhlIFZGUyBjYW4gbWFuaXB1bGF0ZSB0aGUgc3VwZXJibG9jayBvZiB5b3VyCi1maWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi4xLjk5LCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CitmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjEzLCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CiAKIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHsKLQl2b2lkICgqcmVhZF9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKLQlpbnQgKCp3cml0ZV9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwotCXZvaWQgKCpwdXRfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7Ci0Jdm9pZCAoKmRyb3BfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7Ci0Jdm9pZCAoKmRlbGV0ZV9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKLQlpbnQgKCpub3RpZnlfY2hhbmdlKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7Ci0Jdm9pZCAoKnB1dF9zdXBlcikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKLQl2b2lkICgqd3JpdGVfc3VwZXIpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci0JaW50ICgqc3RhdGZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBzdGF0ZnMgKiwgaW50KTsKLQlpbnQgKCpyZW1vdW50X2ZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCAqLCBjaGFyICopOwotCXZvaWQgKCpjbGVhcl9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKKyAgICAgICAgc3RydWN0IGlub2RlICooKmFsbG9jX2lub2RlKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKyAgICAgICAgdm9pZCAoKmRlc3Ryb3lfaW5vZGUpKHN0cnVjdCBpbm9kZSAqKTsKKworICAgICAgICB2b2lkICgqcmVhZF9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKKworICAgICAgICB2b2lkICgqZGlydHlfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7CisgICAgICAgIGludCAoKndyaXRlX2lub2RlKSAoc3RydWN0IGlub2RlICosIGludCk7CisgICAgICAgIHZvaWQgKCpwdXRfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7CisgICAgICAgIHZvaWQgKCpkcm9wX2lub2RlKSAoc3RydWN0IGlub2RlICopOworICAgICAgICB2b2lkICgqZGVsZXRlX2lub2RlKSAoc3RydWN0IGlub2RlICopOworICAgICAgICB2b2lkICgqcHV0X3N1cGVyKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOworICAgICAgICB2b2lkICgqd3JpdGVfc3VwZXIpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisgICAgICAgIGludCAoKnN5bmNfZnMpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KTsKKyAgICAgICAgdm9pZCAoKndyaXRlX3N1cGVyX2xvY2tmcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKyAgICAgICAgdm9pZCAoKnVubG9ja2ZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOworICAgICAgICBpbnQgKCpzdGF0ZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGtzdGF0ZnMgKik7CisgICAgICAgIGludCAoKnJlbW91bnRfZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50ICosIGNoYXIgKik7CisgICAgICAgIHZvaWQgKCpjbGVhcl9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKKyAgICAgICAgdm9pZCAoKnVtb3VudF9iZWdpbikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworICAgICAgICB2b2lkICgqc3luY19pbm9kZXMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CisgICAgICAgIGludCAoKnNob3dfb3B0aW9ucykoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKKworICAgICAgICBzc2l6ZV90ICgqcXVvdGFfcmVhZCkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CisgICAgICAgIHNzaXplX3QgKCpxdW90YV93cml0ZSkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY29uc3QgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CiB9OwogCiBBbGwgbWV0aG9kcyBhcmUgY2FsbGVkIHdpdGhvdXQgYW55IGxvY2tzIGJlaW5nIGhlbGQsIHVubGVzcyBvdGhlcndpc2UKQEAgLTE5Myw0MyArMjM3LDYyIEBACiBvbmx5IGNhbGxlZCBmcm9tIGEgcHJvY2VzcyBjb250ZXh0IChpLmUuIG5vdCBmcm9tIGFuIGludGVycnVwdCBoYW5kbGVyCiBvciBib3R0b20gaGFsZikuCiAKKyAgYWxsb2NfaW5vZGU6IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBpbm9kZV9hbGxvYygpIHRvIGFsbG9jYXRlIG1lbW9yeQorIAlmb3Igc3RydWN0IGlub2RlIGFuZCBpbml0aWFsaXplIGl0LgorCisgIGRlc3Ryb3lfaW5vZGU6IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBkZXN0cm95X2lub2RlKCkgdG8gcmVsZWFzZQorICAJcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3Igc3RydWN0IGlub2RlLgorCiAgIHJlYWRfaW5vZGU6IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byByZWFkIGEgc3BlY2lmaWMgaW5vZGUgZnJvbSB0aGUKLQltb3VudGVkIGZpbGVzeXN0ZW0uIFRoZSAiaV9pbm8iIG1lbWJlciBpbiB0aGUgInN0cnVjdCBpbm9kZSIKLQl3aWxsIGJlIGluaXRpYWxpc2VkIGJ5IHRoZSBWRlMgdG8gaW5kaWNhdGUgd2hpY2ggaW5vZGUgdG8KLQlyZWFkLiBPdGhlciBtZW1iZXJzIGFyZSBmaWxsZWQgaW4gYnkgdGhpcyBtZXRob2QKKyAgICAgICAgbW91bnRlZCBmaWxlc3lzdGVtLiAgVGhlIGlfaW5vIG1lbWJlciBpbiB0aGUgc3RydWN0IGlub2RlIGlzCisJaW5pdGlhbGl6ZWQgYnkgdGhlIFZGUyB0byBpbmRpY2F0ZSB3aGljaCBpbm9kZSB0byByZWFkLiBPdGhlcgorCW1lbWJlcnMgYXJlIGZpbGxlZCBpbiBieSB0aGlzIG1ldGhvZC4KKworCVlvdSBjYW4gc2V0IHRoaXMgdG8gTlVMTCBhbmQgdXNlIGlnZXQ1X2xvY2tlZCgpIGluc3RlYWQgb2YgaWdldCgpCisJdG8gcmVhZCBpbm9kZXMuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgZmlsZXN5c3RlbXMgZm9yIHdoaWNoIHRoZQorCWlub2RlIG51bWJlciBpcyBub3Qgc3VmZmljaWVudCB0byBpZGVudGlmeSBhbiBpbm9kZS4KKworICBkaXJ0eV9pbm9kZTogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBWRlMgdG8gbWFyayBhbiBpbm9kZSBkaXJ0eS4KIAogICB3cml0ZV9pbm9kZTogdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIFZGUyBuZWVkcyB0byB3cml0ZSBhbgogCWlub2RlIHRvIGRpc2MuICBUaGUgc2Vjb25kIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGUgd3JpdGUKIAlzaG91bGQgYmUgc3luY2hyb25vdXMgb3Igbm90LCBub3QgYWxsIGZpbGVzeXN0ZW1zIGNoZWNrIHRoaXMgZmxhZy4KIAogICBwdXRfaW5vZGU6IGNhbGxlZCB3aGVuIHRoZSBWRlMgaW5vZGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBpbm9kZQotCWNhY2hlLiBUaGlzIG1ldGhvZCBpcyBvcHRpb25hbAorCWNhY2hlLgogCiAgIGRyb3BfaW5vZGU6IGNhbGxlZCB3aGVuIHRoZSBsYXN0IGFjY2VzcyB0byB0aGUgaW5vZGUgaXMgZHJvcHBlZCwKIAl3aXRoIHRoZSBpbm9kZV9sb2NrIHNwaW5sb2NrIGhlbGQuCiAKLQlUaGlzIG1ldGhvZCBzaG91bGQgYmUgZWl0aGVyIE5VTEwgKG5vcm1hbCB1bml4IGZpbGVzeXN0ZW0KKwlUaGlzIG1ldGhvZCBzaG91bGQgYmUgZWl0aGVyIE5VTEwgKG5vcm1hbCBVTklYIGZpbGVzeXN0ZW0KIAlzZW1hbnRpY3MpIG9yICJnZW5lcmljX2RlbGV0ZV9pbm9kZSIgKGZvciBmaWxlc3lzdGVtcyB0aGF0IGRvIG5vdAogCXdhbnQgdG8gY2FjaGUgaW5vZGVzIC0gY2F1c2luZyAiZGVsZXRlX2lub2RlIiB0byBhbHdheXMgYmUKIAljYWxsZWQgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgaV9ubGluaykKIAotCVRoZSAiZ2VuZXJpY19kZWxldGVfaW5vZGUoKSIgYmVoYXZpb3VyIGlzIGVxdWl2YWxlbnQgdG8gdGhlCisJVGhlICJnZW5lcmljX2RlbGV0ZV9pbm9kZSgpIiBiZWhhdmlvciBpcyBlcXVpdmFsZW50IHRvIHRoZQogCW9sZCBwcmFjdGljZSBvZiB1c2luZyAiZm9yY2VfZGVsZXRlIiBpbiB0aGUgcHV0X2lub2RlKCkgY2FzZSwKIAlidXQgZG9lcyBub3QgaGF2ZSB0aGUgcmFjZXMgdGhhdCB0aGUgImZvcmNlX2RlbGV0ZSgpIiBhcHByb2FjaAogCWhhZC4gCiAKICAgZGVsZXRlX2lub2RlOiBjYWxsZWQgd2hlbiB0aGUgVkZTIHdhbnRzIHRvIGRlbGV0ZSBhbiBpbm9kZQogCi0gIG5vdGlmeV9jaGFuZ2U6IGNhbGxlZCB3aGVuIFZGUyBpbm9kZSBhdHRyaWJ1dGVzIGFyZSBjaGFuZ2VkLiBJZiB0aGlzCi0JaXMgTlVMTCB0aGUgVkZTIGZhbGxzIGJhY2sgdG8gdGhlIHdyaXRlX2lub2RlKCkgbWV0aG9kLiBUaGlzCi0JaXMgY2FsbGVkIHdpdGggdGhlIGtlcm5lbCBsb2NrIGhlbGQKLQogICBwdXRfc3VwZXI6IGNhbGxlZCB3aGVuIHRoZSBWRlMgd2lzaGVzIHRvIGZyZWUgdGhlIHN1cGVyYmxvY2sKIAkoaS5lLiB1bm1vdW50KS4gVGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgc3VwZXJibG9jayBsb2NrIGhlbGQKIAogICB3cml0ZV9zdXBlcjogY2FsbGVkIHdoZW4gdGhlIFZGUyBzdXBlcmJsb2NrIG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8KIAlkaXNjLiBUaGlzIG1ldGhvZCBpcyBvcHRpb25hbAogCisgIHN5bmNfZnM6IGNhbGxlZCB3aGVuIFZGUyBpcyB3cml0aW5nIG91dCBhbGwgZGlydHkgZGF0YSBhc3NvY2lhdGVkIHdpdGgKKyAgCWEgc3VwZXJibG9jay4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1ldGhvZAorCXNob3VsZCB3YWl0IHVudGlsIHRoZSB3cml0ZSBvdXQgaGFzIGJlZW4gY29tcGxldGVkLiBPcHRpb25hbC4KKworICB3cml0ZV9zdXBlcl9sb2NrZnM6IGNhbGxlZCB3aGVuIFZGUyBpcyBsb2NraW5nIGEgZmlsZXN5c3RlbSBhbmQgZm9yY2luZworICAJaXQgaW50byBhIGNvbnNpc3RlbnQgc3RhdGUuICBUaGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZQorCUxvZ2ljYWwgVm9sdW1lIE1hbmFnZXIgKExWTSkuCisKKyAgdW5sb2NrZnM6IGNhbGxlZCB3aGVuIFZGUyBpcyB1bmxvY2tpbmcgYSBmaWxlc3lzdGVtIGFuZCBtYWtpbmcgaXQgd3JpdGFibGUKKyAgCWFnYWluLgorCiAgIHN0YXRmczogY2FsbGVkIHdoZW4gdGhlIFZGUyBuZWVkcyB0byBnZXQgZmlsZXN5c3RlbSBzdGF0aXN0aWNzLiBUaGlzCiAJaXMgY2FsbGVkIHdpdGggdGhlIGtlcm5lbCBsb2NrIGhlbGQKIApAQCAtMjM4LDIxICszMDEsMzEgQEAKIAogICBjbGVhcl9pbm9kZTogY2FsbGVkIHRoZW4gdGhlIFZGUyBjbGVhcnMgdGhlIGlub2RlLiBPcHRpb25hbAogCisgIHVtb3VudF9iZWdpbjogY2FsbGVkIHdoZW4gdGhlIFZGUyBpcyB1bm1vdW50aW5nIGEgZmlsZXN5c3RlbS4KKworICBzeW5jX2lub2RlczogY2FsbGVkIHdoZW4gdGhlIFZGUyBpcyB3cml0aW5nIG91dCBkaXJ0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aAorICAJYSBzdXBlcmJsb2NrLgorCisgIHNob3dfb3B0aW9uczogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gc2hvdyBtb3VudCBvcHRpb25zIGZvciAvcHJvYy88cGlkPi9tb3VudHMuCisKKyAgcXVvdGFfcmVhZDogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gcmVhZCBmcm9tIGZpbGVzeXN0ZW0gcXVvdGEgZmlsZS4KKworICBxdW90YV93cml0ZTogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gd3JpdGUgdG8gZmlsZXN5c3RlbSBxdW90YSBmaWxlLgorCiBUaGUgcmVhZF9pbm9kZSgpIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBpbiB0aGUgImlfb3AiCiBmaWVsZC4gVGhpcyBpcyBhIHBvaW50ZXIgdG8gYSAic3RydWN0IGlub2RlX29wZXJhdGlvbnMiIHdoaWNoCiBkZXNjcmliZXMgdGhlIG1ldGhvZHMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGluZGl2aWR1YWwgaW5vZGVzLgogCiAKLXN0cnVjdCBpbm9kZV9vcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj4KK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGlzIGRlc2NyaWJlcyBob3cgdGhlIFZGUyBjYW4gbWFuaXB1bGF0ZSBhbiBpbm9kZSBpbiB5b3VyCi1maWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi4xLjk5LCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CitmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjEzLCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CiAKIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHsKLQlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICogZGVmYXVsdF9maWxlX29wczsKLQlpbnQgKCpjcmVhdGUpIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50KTsKLQlpbnQgKCpsb29rdXApIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICopOworCWludCAoKmNyZWF0ZSkgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CisJc3RydWN0IGRlbnRyeSAqICgqbG9va3VwKSAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOwogCWludCAoKmxpbmspIChzdHJ1Y3QgZGVudHJ5ICosc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqKTsKIAlpbnQgKCp1bmxpbmspIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICopOwogCWludCAoKnN5bWxpbmspIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosY29uc3QgY2hhciAqKTsKQEAgLTI2MSwyNSArMzM0LDIyIEBACiAJaW50ICgqbWtub2QpIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50LGRldl90KTsKIAlpbnQgKCpyZW5hbWUpIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLAogCQkJc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7Ci0JaW50ICgqcmVhZGxpbmspIChzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKixpbnQpOwotCXN0cnVjdCBkZW50cnkgKiAoKmZvbGxvd19saW5rKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgZGVudHJ5ICopOwotCWludCAoKnJlYWRwYWdlKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKik7Ci0JaW50ICgqd3JpdGVwYWdlKSAoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKLQlpbnQgKCpibWFwKSAoc3RydWN0IGlub2RlICosaW50KTsKKwlpbnQgKCpyZWFkbGluaykgKHN0cnVjdCBkZW50cnkgKiwgY2hhciBfX3VzZXIgKixpbnQpOworICAgICAgICB2b2lkICogKCpmb2xsb3dfbGluaykgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKKyAgICAgICAgdm9pZCAoKnB1dF9saW5rKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICosIHZvaWQgKik7CiAJdm9pZCAoKnRydW5jYXRlKSAoc3RydWN0IGlub2RlICopOwotCWludCAoKnBlcm1pc3Npb24pIChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKLQlpbnQgKCpzbWFwKSAoc3RydWN0IGlub2RlICosaW50KTsKLQlpbnQgKCp1cGRhdGVwYWdlKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKiwgY29uc3QgY2hhciAqLAotCQkJCXVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCwgaW50KTsKLQlpbnQgKCpyZXZhbGlkYXRlKSAoc3RydWN0IGRlbnRyeSAqKTsKKwlpbnQgKCpwZXJtaXNzaW9uKSAoc3RydWN0IGlub2RlICosIGludCwgc3RydWN0IG5hbWVpZGF0YSAqKTsKKwlpbnQgKCpzZXRhdHRyKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7CisJaW50ICgqZ2V0YXR0cikgKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdCAqKTsKKwlpbnQgKCpzZXR4YXR0cikgKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqLGNvbnN0IHZvaWQgKixzaXplX3QsaW50KTsKKwlzc2l6ZV90ICgqZ2V0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOworCXNzaXplX3QgKCpsaXN0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKKwlpbnQgKCpyZW1vdmV4YXR0cikgKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKIH07CiAKIEFnYWluLCBhbGwgbWV0aG9kcyBhcmUgY2FsbGVkIHdpdGhvdXQgYW55IGxvY2tzIGJlaW5nIGhlbGQsIHVubGVzcwogb3RoZXJ3aXNlIG5vdGVkLgogCi0gIGRlZmF1bHRfZmlsZV9vcHM6IHRoaXMgaXMgYSBwb2ludGVyIHRvIGEgInN0cnVjdCBmaWxlX29wZXJhdGlvbnMiCi0Jd2hpY2ggZGVzY3JpYmVzIGhvdyB0byBvcGVuIGFuZCB0aGVuIG1hbmlwdWxhdGUgb3BlbiBmaWxlcwotCiAgIGNyZWF0ZTogY2FsbGVkIGJ5IHRoZSBvcGVuKDIpIGFuZCBjcmVhdCgyKSBzeXN0ZW0gY2FsbHMuIE9ubHkKIAlyZXF1aXJlZCBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IHJlZ3VsYXIgZmlsZXMuIFRoZSBkZW50cnkgeW91CiAJZ2V0IHNob3VsZCBub3QgaGF2ZSBhbiBpbm9kZSAoaS5lLiBpdCBzaG91bGQgYmUgYSBuZWdhdGl2ZQpAQCAtMzI4LDMxICszOTgsMTQzIEBACiAJeW91IHdhbnQgdG8gc3VwcG9ydCByZWFkaW5nIHN5bWJvbGljIGxpbmtzCiAKICAgZm9sbG93X2xpbms6IGNhbGxlZCBieSB0aGUgVkZTIHRvIGZvbGxvdyBhIHN5bWJvbGljIGxpbmsgdG8gdGhlCi0JaW5vZGUgaXQgcG9pbnRzIHRvLiBPbmx5IHJlcXVpcmVkIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQKLQlzeW1ib2xpYyBsaW5rcworCWlub2RlIGl0IHBvaW50cyB0by4gIE9ubHkgcmVxdWlyZWQgaWYgeW91IHdhbnQgdG8gc3VwcG9ydAorCXN5bWJvbGljIGxpbmtzLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdm9pZCBwb2ludGVyIGNvb2tpZQorCXRoYXQgaXMgcGFzc2VkIHRvIHB1dF9saW5rKCkuCisKKyAgcHV0X2xpbms6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHJlbGVhc2UgcmVzb3VyY2VzIGFsbG9jYXRlZCBieQorICAJZm9sbG93X2xpbmsoKS4gIFRoZSBjb29raWUgcmV0dXJuZWQgYnkgZm9sbG93X2xpbmsoKSBpcyBwYXNzZWQgdG8KKwl0byB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBsYXN0IHBhcmFtZXRlci4gIEl0IGlzIHVzZWQgYnkgZmlsZXN5c3RlbXMKKwlzdWNoIGFzIE5GUyB3aGVyZSBwYWdlIGNhY2hlIGlzIG5vdCBzdGFibGUgKGkuZS4gcGFnZSB0aGF0IHdhcworCWluc3RhbGxlZCB3aGVuIHRoZSBzeW1ib2xpYyBsaW5rIHdhbGsgc3RhcnRlZCBtaWdodCBub3QgYmUgaW4gdGhlCisJcGFnZSBjYWNoZSBhdCB0aGUgZW5kIG9mIHRoZSB3YWxrKS4KKworICB0cnVuY2F0ZTogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gY2hhbmdlIHRoZSBzaXplIG9mIGEgZmlsZS4gIFRoZSBpX3NpemUKKyAJZmllbGQgb2YgdGhlIGlub2RlIGlzIHNldCB0byB0aGUgZGVzaXJlZCBzaXplIGJ5IHRoZSBWRlMgYmVmb3JlCisJdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdHJ1bmNhdGUoMikKKwlzeXN0ZW0gY2FsbCBhbmQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LgorCisgIHBlcm1pc3Npb246IGNhbGxlZCBieSB0aGUgVkZTIHRvIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzIG9uIGEgUE9TSVgtbGlrZQorICAJZmlsZXN5c3RlbS4KKworICBzZXRhdHRyOiBjYWxsZWQgYnkgdGhlIFZGUyB0byBzZXQgYXR0cmlidXRlcyBmb3IgYSBmaWxlLiAgVGhpcyBmdW5jdGlvbiBpcworICAJY2FsbGVkIGJ5IGNobW9kKDIpIGFuZCByZWxhdGVkIHN5c3RlbSBjYWxscy4KKworICBnZXRhdHRyOiBjYWxsZWQgYnkgdGhlIFZGUyB0byBnZXQgYXR0cmlidXRlcyBvZiBhIGZpbGUuICBUaGlzIGZ1bmN0aW9uIGlzCisgIAljYWxsZWQgYnkgc3RhdCgyKSBhbmQgcmVsYXRlZCBzeXN0ZW0gY2FsbHMuCisKKyAgc2V0eGF0dHI6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHNldCBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgZm9yIGEgZmlsZS4KKyAgCUV4dGVuZGVkIGF0dHJpYnV0ZSBpcyBhIG5hbWU6dmFsdWUgcGFpciBhc3NvY2lhdGVkIHdpdGggYW4gaW5vZGUuIFRoaXMKKwlmdW5jdGlvbiBpcyBjYWxsZWQgYnkgc2V0eGF0dHIoMikgc3lzdGVtIGNhbGwuCisKKyAgZ2V0eGF0dHI6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUKKyAgCW5hbWUuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBnZXR4YXR0cigyKSBmdW5jdGlvbiBjYWxsLgorCisgIGxpc3R4YXR0cjogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gbGlzdCBhbGwgZXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbgorICAJZmlsZS4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpc3R4YXR0cigyKSBzeXN0ZW0gY2FsbC4KKworICByZW1vdmV4YXR0cjogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBmcm9tIGEgZmlsZS4KKyAgCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHJlbW92ZXhhdHRyKDIpIHN5c3RlbSBjYWxsLgogCiAKLXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj4KK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBkZXNjcmliZXMgaG93IHRoZSBWRlMgY2FuIG1hbmlwdWxhdGUgbWFwcGluZyBvZiBhIGZpbGUgdG8gcGFnZSBjYWNoZSBpbgoreW91ciBmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjEzLCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgeworCWludCAoKndyaXRlcGFnZSkoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKKwlpbnQgKCpyZWFkcGFnZSkoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKik7CisJaW50ICgqc3luY19wYWdlKShzdHJ1Y3QgcGFnZSAqKTsKKwlpbnQgKCp3cml0ZXBhZ2VzKShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKik7CisJaW50ICgqc2V0X3BhZ2VfZGlydHkpKHN0cnVjdCBwYWdlICpwYWdlKTsKKwlpbnQgKCpyZWFkcGFnZXMpKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcyk7CisJaW50ICgqcHJlcGFyZV93cml0ZSkoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKKwlpbnQgKCpjb21taXRfd3JpdGUpKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwYWdlICosIHVuc2lnbmVkLCB1bnNpZ25lZCk7CisJc2VjdG9yX3QgKCpibWFwKShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzZWN0b3JfdCk7CisJaW50ICgqaW52YWxpZGF0ZXBhZ2UpIChzdHJ1Y3QgcGFnZSAqLCB1bnNpZ25lZCBsb25nKTsKKwlpbnQgKCpyZWxlYXNlcGFnZSkgKHN0cnVjdCBwYWdlICosIGludCk7CisJc3NpemVfdCAoKmRpcmVjdF9JTykoaW50LCBzdHJ1Y3Qga2lvY2IgKiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCQlsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpOworCXN0cnVjdCBwYWdlKiAoKmdldF94aXBfcGFnZSkoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgc2VjdG9yX3QsCisJCQlpbnQpOworfTsKKworICB3cml0ZXBhZ2U6IGNhbGxlZCBieSB0aGUgVk0gd3JpdGUgYSBkaXJ0eSBwYWdlIHRvIGJhY2tpbmcgc3RvcmUuCisKKyAgcmVhZHBhZ2U6IGNhbGxlZCBieSB0aGUgVk0gdG8gcmVhZCBhIHBhZ2UgZnJvbSBiYWNraW5nIHN0b3JlLgorCisgIHN5bmNfcGFnZTogY2FsbGVkIGJ5IHRoZSBWTSB0byBub3RpZnkgdGhlIGJhY2tpbmcgc3RvcmUgdG8gcGVyZm9ybSBhbGwKKyAgCXF1ZXVlZCBJL08gb3BlcmF0aW9ucyBmb3IgYSBwYWdlLiBJL08gb3BlcmF0aW9ucyBmb3Igb3RoZXIgcGFnZXMKKwlhc3NvY2lhdGVkIHdpdGggdGhpcyBhZGRyZXNzX3NwYWNlIG9iamVjdCBtYXkgYWxzbyBiZSBwZXJmb3JtZWQuCisKKyAgd3JpdGVwYWdlczogY2FsbGVkIGJ5IHRoZSBWTSB0byB3cml0ZSBvdXQgcGFnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAJYWRkcmVzc19zcGFjZSBvYmplY3QuCisKKyAgc2V0X3BhZ2VfZGlydHk6IGNhbGxlZCBieSB0aGUgVk0gdG8gc2V0IGEgcGFnZSBkaXJ0eS4KKworICByZWFkcGFnZXM6IGNhbGxlZCBieSB0aGUgVk0gdG8gcmVhZCBwYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3Nfc3BhY2UKKyAgCW9iamVjdC4KKworICBwcmVwYXJlX3dyaXRlOiBjYWxsZWQgYnkgdGhlIGdlbmVyaWMgd3JpdGUgcGF0aCBpbiBWTSB0byBzZXQgdXAgYSB3cml0ZQorICAJcmVxdWVzdCBmb3IgYSBwYWdlLgorCisgIGNvbW1pdF93cml0ZTogY2FsbGVkIGJ5IHRoZSBnZW5lcmljIHdyaXRlIHBhdGggaW4gVk0gdG8gd3JpdGUgcGFnZSB0bworICAJaXRzIGJhY2tpbmcgc3RvcmUuCisKKyAgYm1hcDogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gbWFwIGEgbG9naWNhbCBibG9jayBvZmZzZXQgd2l0aGluIG9iamVjdCB0bworICAJcGh5c2ljYWwgYmxvY2sgbnVtYmVyLiBUaGlzIG1ldGhvZCBpcyB1c2UgYnkgZm9yIHRoZSBsZWdhY3kgRklCTUFQCisJaW9jdGwuIE90aGVyIHVzZXMgYXJlIGRpc2NvdXJhZ2VkLgorCisgIGludmFsaWRhdGVwYWdlOiBjYWxsZWQgYnkgdGhlIFZNIG9uIHRydW5jYXRlIHRvIGRpc2Fzc29jaWF0ZSBhIHBhZ2UgZnJvbSBpdHMKKyAgCWFkZHJlc3Nfc3BhY2UgbWFwcGluZy4KKworICByZWxlYXNlcGFnZTogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gcmVsZWFzZSBmaWxlc3lzdGVtIHNwZWNpZmljIG1ldGFkYXRhIGZyb20KKyAgCWEgcGFnZS4KKworICBkaXJlY3RfSU86IGNhbGxlZCBieSB0aGUgVk0gZm9yIGRpcmVjdCBJL08gd3JpdGVzIGFuZCByZWFkcy4KKworICBnZXRfeGlwX3BhZ2U6IGNhbGxlZCBieSB0aGUgVk0gdG8gdHJhbnNsYXRlIGEgYmxvY2sgbnVtYmVyIHRvIGEgcGFnZS4KKwlUaGUgcGFnZSBpcyB2YWxpZCB1bnRpbCB0aGUgY29ycmVzcG9uZGluZyBmaWxlc3lzdGVtIGlzIHVubW91bnRlZC4KKwlGaWxlc3lzdGVtcyB0aGF0IHdhbnQgdG8gdXNlIGV4ZWN1dGUtaW4tcGxhY2UgKFhJUCkgbmVlZCB0byBpbXBsZW1lbnQKKwlpdC4gIEFuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gY2FuIGJlIGZvdW5kIGluIGZzL2V4dDIveGlwLmMuCisKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PQogCiBUaGlzIGRlc2NyaWJlcyBob3cgdGhlIFZGUyBjYW4gbWFuaXB1bGF0ZSBhbiBvcGVuIGZpbGUuIEFzIG9mIGtlcm5lbAotMi4xLjk5LCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CisyLjYuMTMsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB7CiAJbG9mZl90ICgqbGxzZWVrKSAoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBpbnQpOwotCXNzaXplX3QgKCpyZWFkKSAoc3RydWN0IGZpbGUgKiwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKLQlzc2l6ZV90ICgqd3JpdGUpIChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCwgbG9mZl90ICopOworCXNzaXplX3QgKCpyZWFkKSAoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CisJc3NpemVfdCAoKmFpb19yZWFkKSAoc3RydWN0IGtpb2NiICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90KTsKKwlzc2l6ZV90ICgqd3JpdGUpIChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKwlzc2l6ZV90ICgqYWlvX3dyaXRlKSAoc3RydWN0IGtpb2NiICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90KTsKIAlpbnQgKCpyZWFkZGlyKSAoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOwogCXVuc2lnbmVkIGludCAoKnBvbGwpIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKik7CiAJaW50ICgqaW9jdGwpIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKwlsb25nICgqdW5sb2NrZWRfaW9jdGwpIChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworCWxvbmcgKCpjb21wYXRfaW9jdGwpIChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCWludCAoKm1tYXApIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CiAJaW50ICgqb3BlbikgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKKwlpbnQgKCpmbHVzaCkgKHN0cnVjdCBmaWxlICopOwogCWludCAoKnJlbGVhc2UpIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7Ci0JaW50ICgqZnN5bmMpIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOwotCWludCAoKmZhc3luYykgKHN0cnVjdCBmaWxlICosIGludCk7Ci0JaW50ICgqY2hlY2tfbWVkaWFfY2hhbmdlKSAoa2Rldl90IGRldik7Ci0JaW50ICgqcmV2YWxpZGF0ZSkgKGtkZXZfdCBkZXYpOworCWludCAoKmZzeW5jKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQgZGF0YXN5bmMpOworCWludCAoKmFpb19mc3luYykgKHN0cnVjdCBraW9jYiAqLCBpbnQgZGF0YXN5bmMpOworCWludCAoKmZhc3luYykgKGludCwgc3RydWN0IGZpbGUgKiwgaW50KTsKIAlpbnQgKCpsb2NrKSAoc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOworCXNzaXplX3QgKCpyZWFkdikgKHN0cnVjdCBmaWxlICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCB1bnNpZ25lZCBsb25nLCBsb2ZmX3QgKik7CisJc3NpemVfdCAoKndyaXRldikgKHN0cnVjdCBmaWxlICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCB1bnNpZ25lZCBsb25nLCBsb2ZmX3QgKik7CisJc3NpemVfdCAoKnNlbmRmaWxlKSAoc3RydWN0IGZpbGUgKiwgbG9mZl90ICosIHNpemVfdCwgcmVhZF9hY3Rvcl90LCB2b2lkICopOworCXNzaXplX3QgKCpzZW5kcGFnZSkgKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwYWdlICosIGludCwgc2l6ZV90LCBsb2ZmX3QgKiwgaW50KTsKKwl1bnNpZ25lZCBsb25nICgqZ2V0X3VubWFwcGVkX2FyZWEpKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOworCWludCAoKmNoZWNrX2ZsYWdzKShpbnQpOworCWludCAoKmRpcl9ub3RpZnkpKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFyZyk7CisJaW50ICgqZmxvY2spIChzdHJ1Y3QgZmlsZSAqLCBpbnQsIHN0cnVjdCBmaWxlX2xvY2sgKik7CiB9OwogCiBBZ2FpbiwgYWxsIG1ldGhvZHMgYXJlIGNhbGxlZCB3aXRob3V0IGFueSBsb2NrcyBiZWluZyBoZWxkLCB1bmxlc3MKQEAgLTM2Miw4ICs1NDQsMTIgQEAKIAogICByZWFkOiBjYWxsZWQgYnkgcmVhZCgyKSBhbmQgcmVsYXRlZCBzeXN0ZW0gY2FsbHMKIAorICBhaW9fcmVhZDogY2FsbGVkIGJ5IGlvX3N1Ym1pdCgyKSBhbmQgb3RoZXIgYXN5bmNocm9ub3VzIEkvTyBvcGVyYXRpb25zCisKICAgd3JpdGU6IGNhbGxlZCBieSB3cml0ZSgyKSBhbmQgcmVsYXRlZCBzeXN0ZW0gY2FsbHMKIAorICBhaW9fd3JpdGU6IGNhbGxlZCBieSBpb19zdWJtaXQoMikgYW5kIG90aGVyIGFzeW5jaHJvbm91cyBJL08gb3BlcmF0aW9ucworCiAgIHJlYWRkaXI6IGNhbGxlZCB3aGVuIHRoZSBWRlMgbmVlZHMgdG8gcmVhZCB0aGUgZGlyZWN0b3J5IGNvbnRlbnRzCiAKICAgcG9sbDogY2FsbGVkIGJ5IHRoZSBWRlMgd2hlbiBhIHByb2Nlc3Mgd2FudHMgdG8gY2hlY2sgaWYgdGhlcmUgaXMKQEAgLTM3MiwxOCArNTU4LDI1IEBACiAKICAgaW9jdGw6IGNhbGxlZCBieSB0aGUgaW9jdGwoMikgc3lzdGVtIGNhbGwKIAorICB1bmxvY2tlZF9pb2N0bDogY2FsbGVkIGJ5IHRoZSBpb2N0bCgyKSBzeXN0ZW0gY2FsbC4gRmlsZXN5c3RlbXMgdGhhdCBkbyBub3QKKyAgCXJlcXVpcmUgdGhlIEJLTCBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGlvY3RsKCkgYWJvdmUuCisKKyAgY29tcGF0X2lvY3RsOiBjYWxsZWQgYnkgdGhlIGlvY3RsKDIpIHN5c3RlbSBjYWxsIHdoZW4gMzIgYml0IHN5c3RlbSBjYWxscworIAkgYXJlIHVzZWQgb24gNjQgYml0IGtlcm5lbHMuCisKICAgbW1hcDogY2FsbGVkIGJ5IHRoZSBtbWFwKDIpIHN5c3RlbSBjYWxsCiAKICAgb3BlbjogY2FsbGVkIGJ5IHRoZSBWRlMgd2hlbiBhbiBpbm9kZSBzaG91bGQgYmUgb3BlbmVkLiBXaGVuIHRoZSBWRlMKLQlvcGVucyBhIGZpbGUsIGl0IGNyZWF0ZXMgYSBuZXcgInN0cnVjdCBmaWxlIiBhbmQgaW5pdGlhbGlzZXMKLQl0aGUgImZfb3AiIGZpbGUgb3BlcmF0aW9ucyBtZW1iZXIgd2l0aCB0aGUgImRlZmF1bHRfZmlsZV9vcHMiCi0JZmllbGQgaW4gdGhlIGlub2RlIHN0cnVjdHVyZS4gSXQgdGhlbiBjYWxscyB0aGUgb3BlbiBtZXRob2QKLQlmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBmaWxlIHN0cnVjdHVyZS4gWW91IG1pZ2h0IHRoaW5rIHRoYXQKLQl0aGUgb3BlbiBtZXRob2QgcmVhbGx5IGJlbG9uZ3MgaW4gInN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIiwKLQlhbmQgeW91IG1heSBiZSByaWdodC4gSSB0aGluayBpdCdzIGRvbmUgdGhlIHdheSBpdCBpcyBiZWNhdXNlCi0JaXQgbWFrZXMgZmlsZXN5c3RlbXMgc2ltcGxlciB0byBpbXBsZW1lbnQuIFRoZSBvcGVuKCkgbWV0aG9kCi0JaXMgYSBnb29kIHBsYWNlIHRvIGluaXRpYWxpc2UgdGhlICJwcml2YXRlX2RhdGEiIG1lbWJlciBpbiB0aGUKLQlmaWxlIHN0cnVjdHVyZSBpZiB5b3Ugd2FudCB0byBwb2ludCB0byBhIGRldmljZSBzdHJ1Y3R1cmUKKwlvcGVucyBhIGZpbGUsIGl0IGNyZWF0ZXMgYSBuZXcgInN0cnVjdCBmaWxlIi4gSXQgdGhlbiBjYWxscyB0aGUKKwlvcGVuIG1ldGhvZCBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBmaWxlIHN0cnVjdHVyZS4gWW91IG1pZ2h0CisJdGhpbmsgdGhhdCB0aGUgb3BlbiBtZXRob2QgcmVhbGx5IGJlbG9uZ3MgaW4KKwkic3RydWN0IGlub2RlX29wZXJhdGlvbnMiLCBhbmQgeW91IG1heSBiZSByaWdodC4gSSB0aGluayBpdCdzCisJZG9uZSB0aGUgd2F5IGl0IGlzIGJlY2F1c2UgaXQgbWFrZXMgZmlsZXN5c3RlbXMgc2ltcGxlciB0bworCWltcGxlbWVudC4gVGhlIG9wZW4oKSBtZXRob2QgaXMgYSBnb29kIHBsYWNlIHRvIGluaXRpYWxpemUgdGhlCisJInByaXZhdGVfZGF0YSIgbWVtYmVyIGluIHRoZSBmaWxlIHN0cnVjdHVyZSBpZiB5b3Ugd2FudCB0byBwb2ludAorCXRvIGEgZGV2aWNlIHN0cnVjdHVyZQorCisgIGZsdXNoOiBjYWxsZWQgYnkgdGhlIGNsb3NlKDIpIHN5c3RlbSBjYWxsIHRvIGZsdXNoIGEgZmlsZQogCiAgIHJlbGVhc2U6IGNhbGxlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhbiBvcGVuIGZpbGUgaXMgY2xvc2VkCiAKQEAgLTM5Miw2ICs1ODUsMjMgQEAKICAgZmFzeW5jOiBjYWxsZWQgYnkgdGhlIGZjbnRsKDIpIHN5c3RlbSBjYWxsIHdoZW4gYXN5bmNocm9ub3VzCiAJKG5vbi1ibG9ja2luZykgbW9kZSBpcyBlbmFibGVkIGZvciBhIGZpbGUKIAorICBsb2NrOiBjYWxsZWQgYnkgdGhlIGZjbnRsKDIpIHN5c3RlbSBjYWxsIGZvciBGX0dFVExLLCBGX1NFVExLLCBhbmQgRl9TRVRMS1cKKyAgCWNvbW1hbmRzCisKKyAgcmVhZHY6IGNhbGxlZCBieSB0aGUgcmVhZHYoMikgc3lzdGVtIGNhbGwKKworICB3cml0ZXY6IGNhbGxlZCBieSB0aGUgd3JpdGV2KDIpIHN5c3RlbSBjYWxsCisKKyAgc2VuZGZpbGU6IGNhbGxlZCBieSB0aGUgc2VuZGZpbGUoMikgc3lzdGVtIGNhbGwKKworICBnZXRfdW5tYXBwZWRfYXJlYTogY2FsbGVkIGJ5IHRoZSBtbWFwKDIpIHN5c3RlbSBjYWxsCisKKyAgY2hlY2tfZmxhZ3M6IGNhbGxlZCBieSB0aGUgZmNudGwoMikgc3lzdGVtIGNhbGwgZm9yIEZfU0VURkwgY29tbWFuZAorCisgIGRpcl9ub3RpZnk6IGNhbGxlZCBieSB0aGUgZmNudGwoMikgc3lzdGVtIGNhbGwgZm9yIEZfTk9USUZZIGNvbW1hbmQKKworICBmbG9jazogY2FsbGVkIGJ5IHRoZSBmbG9jaygyKSBzeXN0ZW0gY2FsbAorCiBOb3RlIHRoYXQgdGhlIGZpbGUgb3BlcmF0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIHNwZWNpZmljCiBmaWxlc3lzdGVtIGluIHdoaWNoIHRoZSBpbm9kZSByZXNpZGVzLiBXaGVuIG9wZW5pbmcgYSBkZXZpY2Ugbm9kZQogKGNoYXJhY3RlciBvciBibG9jayBzcGVjaWFsKSBtb3N0IGZpbGVzeXN0ZW1zIHdpbGwgY2FsbCBzcGVjaWFsCkBAIC00MDAsMjkgKzYxMCwyOCBAQAogb3BlcmF0aW9ucyB3aXRoIHRob3NlIGZvciB0aGUgZGV2aWNlIGRyaXZlciwgYW5kIHRoZW4gcHJvY2VlZCB0byBjYWxsCiB0aGUgbmV3IG9wZW4oKSBtZXRob2QgZm9yIHRoZSBmaWxlLiBUaGlzIGlzIGhvdyBvcGVuaW5nIGEgZGV2aWNlIGZpbGUKIGluIHRoZSBmaWxlc3lzdGVtIGV2ZW50dWFsbHkgZW5kcyB1cCBjYWxsaW5nIHRoZSBkZXZpY2UgZHJpdmVyIG9wZW4oKQotbWV0aG9kLiBOb3RlIHRoZSBkZXZmcyAodGhlIERldmljZSBGaWxlU3lzdGVtKSBoYXMgYSBtb3JlIGRpcmVjdCBwYXRoCi1mcm9tIGRldmljZSBub2RlIHRvIGRldmljZSBkcml2ZXIgKHRoaXMgaXMgYW4gdW5vZmZpY2lhbCBrZXJuZWwKLXBhdGNoKS4KK21ldGhvZC4KIAogCi1EaXJlY3RvcnkgRW50cnkgQ2FjaGUgKGRjYWNoZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24+Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RpcmVjdG9yeSBFbnRyeSBDYWNoZSAoZGNhY2hlKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKIAogc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zCi09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGlzIGRlc2NyaWJlcyBob3cgYSBmaWxlc3lzdGVtIGNhbiBvdmVybG9hZCB0aGUgc3RhbmRhcmQgZGVudHJ5CiBvcGVyYXRpb25zLiBEZW50cmllcyBhbmQgdGhlIGRjYWNoZSBhcmUgdGhlIGRvbWFpbiBvZiB0aGUgVkZTIGFuZCB0aGUKIGluZGl2aWR1YWwgZmlsZXN5c3RlbSBpbXBsZW1lbnRhdGlvbnMuIERldmljZSBkcml2ZXJzIGhhdmUgbm8gYnVzaW5lc3MKIGhlcmUuIFRoZXNlIG1ldGhvZHMgbWF5IGJlIHNldCB0byBOVUxMLCBhcyB0aGV5IGFyZSBlaXRoZXIgb3B0aW9uYWwgb3IKLXRoZSBWRlMgdXNlcyBhIGRlZmF1bHQuIEFzIG9mIGtlcm5lbCAyLjEuOTksIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUKK3RoZSBWRlMgdXNlcyBhIGRlZmF1bHQuIEFzIG9mIGtlcm5lbCAyLjYuMTMsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUKIGRlZmluZWQ6CiAKIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyB7Ci0JaW50ICgqZF9yZXZhbGlkYXRlKShzdHJ1Y3QgZGVudHJ5ICopOworCWludCAoKmRfcmV2YWxpZGF0ZSkoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOwogCWludCAoKmRfaGFzaCkgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IHFzdHIgKik7CiAJaW50ICgqZF9jb21wYXJlKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgcXN0ciAqLCBzdHJ1Y3QgcXN0ciAqKTsKLQl2b2lkICgqZF9kZWxldGUpKHN0cnVjdCBkZW50cnkgKik7CisJaW50ICgqZF9kZWxldGUpKHN0cnVjdCBkZW50cnkgKik7CiAJdm9pZCAoKmRfcmVsZWFzZSkoc3RydWN0IGRlbnRyeSAqKTsKIAl2b2lkICgqZF9pcHV0KShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpbm9kZSAqKTsKIH07CkBAIC00NTEsNiArNjYwLDcgQEAKIG9mIGNoaWxkIGRlbnRyaWVzLiBDaGlsZCBkZW50cmllcyBhcmUgYmFzaWNhbGx5IGxpa2UgZmlsZXMgaW4gYQogZGlyZWN0b3J5LgogCisKIERpcmVjdG9yeSBFbnRyeSBDYWNoZSBBUElzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00NzEsNyArNjgxLDcgQEAKIAkiZF9kZWxldGUiIG1ldGhvZCBpcyBjYWxsZWQKIAogICBkX2Ryb3A6IHRoaXMgdW5oYXNoZXMgYSBkZW50cnkgZnJvbSBpdHMgcGFyZW50cyBoYXNoIGxpc3QuIEEKLQlzdWJzZXF1ZW50IGNhbGwgdG8gZHB1dCgpIHdpbGwgZGVsbG9jYXRlIHRoZSBkZW50cnkgaWYgaXRzCisJc3Vic2VxdWVudCBjYWxsIHRvIGRwdXQoKSB3aWxsIGRlYWxsb2NhdGUgdGhlIGRlbnRyeSBpZiBpdHMKIAl1c2FnZSBjb3VudCBkcm9wcyB0byAwCiAKICAgZF9kZWxldGU6IGRlbGV0ZSBhIGRlbnRyeS4gSWYgdGhlcmUgYXJlIG5vIG90aGVyIG9wZW4gcmVmZXJlbmNlcyB0bwpAQCAtNTA3LDE2ICs3MTcsMTYgQEAKIG9mIHRoZSBwYXRobmFtZSBhbmQgdXNpbmcgdGhhdCBkZW50cnkgYWxvbmcgd2l0aCB0aGUgbmV4dAogY29tcG9uZW50IHRvIGxvb2sgdXAgdGhlIG5leHQgbGV2ZWwgYW5kIHNvIG9uLiBTaW5jZSBpdAogaXMgYSBmcmVxdWVudCBvcGVyYXRpb24gZm9yIHdvcmtsb2FkcyBsaWtlIG11bHRpdXNlcgotZW52aXJvbm1lbnRzIGFuZCB3ZWJzZXJ2ZXJzLCBpdCBpcyBpbXBvcnRhbnQgdG8gb3B0aW1pemUKK2Vudmlyb25tZW50cyBhbmQgd2ViIHNlcnZlcnMsIGl0IGlzIGltcG9ydGFudCB0byBvcHRpbWl6ZQogdGhpcyBwYXRoLgogCiBQcmlvciB0byAyLjUuMTAsIGRjYWNoZV9sb2NrIHdhcyBhY3F1aXJlZCBpbiBkX2xvb2t1cCBhbmQgdGh1cwogaW4gZXZlcnkgY29tcG9uZW50IGR1cmluZyBwYXRoIGxvb2stdXAuIFNpbmNlIDIuNS4xMCBvbndhcmRzLAotZmFzdHdhbGsgYWxnb3JpdGhtIGNoYW5nZWQgdGhpcyBieSBob2xkaW5nIHRoZSBkY2FjaGVfbG9jaworZmFzdC13YWxrIGFsZ29yaXRobSBjaGFuZ2VkIHRoaXMgYnkgaG9sZGluZyB0aGUgZGNhY2hlX2xvY2sKIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHdhbGtpbmcgYXMgbWFueSBjYWNoZWQgcGF0aCBjb21wb25lbnQKLWRlbnRyaWVzIGFzIHBvc3NpYmxlLiBUaGlzIHNpZ25maWNhbnRseSBkZWNyZWFzZXMgdGhlIG51bWJlcgorZGVudHJpZXMgYXMgcG9zc2libGUuIFRoaXMgc2lnbmlmaWNhbnRseSBkZWNyZWFzZXMgdGhlIG51bWJlcgogb2YgYWNxdWlzaXRpb24gb2YgZGNhY2hlX2xvY2suIEhvd2V2ZXIgaXQgYWxzbyBpbmNyZWFzZXMgdGhlCi1sb2NrIGhvbGQgdGltZSBzaWduZmljYW50bHkgYW5kIGFmZmVjdHMgcGVyZm9ybWFuY2UgaW4gbGFyZ2UKK2xvY2sgaG9sZCB0aW1lIHNpZ25pZmljYW50bHkgYW5kIGFmZmVjdHMgcGVyZm9ybWFuY2UgaW4gbGFyZ2UKIFNNUCBtYWNoaW5lcy4gU2luY2UgMi41LjYyIGtlcm5lbCwgZGNhY2hlIGhhcyBiZWVuIHVzaW5nCiBhIG5ldyBsb2NraW5nIG1vZGVsIHRoYXQgdXNlcyBSQ1UgdG8gbWFrZSBkY2FjaGUgbG9vay11cAogbG9jay1mcmVlLgpAQCAtNTI3LDcgKzczNyw3IEBACiBhcyBkX2lub2RlIGFuZCBzZXZlcmFsIG90aGVyIHRoaW5ncyBsaWtlIG1vdW50IGxvb2stdXAuIFJDVS1iYXNlZAogY2hhbmdlcyBhZmZlY3Qgb25seSB0aGUgd2F5IHRoZSBoYXNoIGNoYWluIGlzIHByb3RlY3RlZC4gRm9yIGV2ZXJ5dGhpbmcKIGVsc2UgdGhlIGRjYWNoZV9sb2NrIG11c3QgYmUgdGFrZW4gZm9yIGJvdGggdHJhdmVyc2luZyBhcyB3ZWxsIGFzCi11cGRhdGluZy4gVGhlIGhhc2ggY2hhaW4gdXBkYXRpb25zIHRvbyB0YWtlIHRoZSBkY2FjaGVfbG9jay4KK3VwZGF0aW5nLiBUaGUgaGFzaCBjaGFpbiB1cGRhdGVzIHRvbyB0YWtlIHRoZSBkY2FjaGVfbG9jay4KIFRoZSBzaWduaWZpY2FudCBjaGFuZ2UgaXMgdGhlIHdheSBkX2xvb2t1cCB0cmF2ZXJzZXMgdGhlIGhhc2ggY2hhaW4sCiBpdCBkb2Vzbid0IGFjcXVpcmUgdGhlIGRjYWNoZV9sb2NrIGZvciB0aGlzIGFuZCByZWx5IG9uIFJDVSB0bwogZW5zdXJlIHRoYXQgdGhlIGRlbnRyeSBoYXMgbm90IGJlZW4gKmZyZWVkKi4KQEAgLTUzNSwxNCArNzQ1LDE1IEBACiAKIERjYWNoZSBsb2NraW5nIGRldGFpbHMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogRm9yIG1hbnkgbXVsdGktdXNlciB3b3JrbG9hZHMsIG9wZW4oKSBhbmQgc3RhdCgpIG9uIGZpbGVzIGFyZQogdmVyeSBmcmVxdWVudGx5IG9jY3VycmluZyBvcGVyYXRpb25zLiBCb3RoIGludm9sdmUgd2Fsa2luZwogb2YgcGF0aCBuYW1lcyB0byBmaW5kIHRoZSBkZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUKIGNvbmNlcm5lZCBmaWxlLiBJbiAyLjQga2VybmVsLCBkY2FjaGVfbG9jayB3YXMgaGVsZAogZHVyaW5nIGxvb2stdXAgb2YgZWFjaCBwYXRoIGNvbXBvbmVudC4gQ29udGVudGlvbiBhbmQKLWNhY2hlbGluZSBib3VuY2luZyBvZiB0aGlzIGdsb2JhbCBsb2NrIGNhdXNlZCBzaWduaWZpY2FudAorY2FjaGUtbGluZSBib3VuY2luZyBvZiB0aGlzIGdsb2JhbCBsb2NrIGNhdXNlZCBzaWduaWZpY2FudAogc2NhbGFiaWxpdHkgcHJvYmxlbXMuIFdpdGggdGhlIGludHJvZHVjdGlvbiBvZiBSQ1UKLWluIGxpbnV4IGtlcm5lbCwgdGhpcyB3YXMgd29ya2VkIGFyb3VuZCBieSBtYWtpbmcKK2luIExpbnV4IGtlcm5lbCwgdGhpcyB3YXMgd29ya2VkIGFyb3VuZCBieSBtYWtpbmcKIHRoZSBsb29rLXVwIG9mIHBhdGggY29tcG9uZW50cyBkdXJpbmcgcGF0aCB3YWxraW5nIGxvY2stZnJlZS4KIAogCkBAIC01NjIsNyArNzczLDcgQEAKIDIuIEluc2VydGlvbiBvZiBhIGRlbnRyeSBpbnRvIHRoZSBoYXNoIHRhYmxlIGlzIGRvbmUgdXNpbmcKICAgIGhsaXN0X2FkZF9oZWFkX3JjdSgpIHdoaWNoIHRha2UgY2FyZSBvZiBvcmRlcmluZyB0aGUgd3JpdGVzIC0KICAgIHRoZSB3cml0ZXMgdG8gdGhlIGRlbnRyeSBtdXN0IGJlIHZpc2libGUgYmVmb3JlIHRoZSBkZW50cnkKLSAgIGlzIGluc2VydGVkLiBUaGlzIHdvcmtzIGluIGNvbmp1Y3Rpb24gd2l0aCBobGlzdF9mb3JfZWFjaF9yY3UoKQorICAgaXMgaW5zZXJ0ZWQuIFRoaXMgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCBobGlzdF9mb3JfZWFjaF9yY3UoKQogICAgd2hpbGUgd2Fsa2luZyB0aGUgaGFzaCBjaGFpbi4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdAogICAgYWxsIGluaXRpYWxpemF0aW9uIHRvIHRoZSBkZW50cnkgbXVzdCBiZSBkb25lIGJlZm9yZSBobGlzdF9hZGRfaGVhZF9yY3UoKQogICAgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBkY2FjaGVfbG9jayBwcm90ZWN0aW9uIHdoaWxlIHRyYXZlcnNpbmcKQEAgLTU4NCw3ICs3OTUsNyBAQAogICAgdGhlIHNhbWUuICBJbiBzb21lIHNlbnNlLCBkY2FjaGVfcmN1IHBhdGggd2Fsa2luZyBsb29rcyBsaWtlCiAgICB0aGUgcHJlLTIuNS4xMCB2ZXJzaW9uLgogCi01LiBBbGwgZGVudHJ5IGhhc2ggY2hhaW4gdXBkYXRpb25zIG11c3QgdGFrZSB0aGUgZGNhY2hlX2xvY2sgYXMgd2VsbCBhcworNS4gQWxsIGRlbnRyeSBoYXNoIGNoYWluIHVwZGF0ZXMgbXVzdCB0YWtlIHRoZSBkY2FjaGVfbG9jayBhcyB3ZWxsIGFzCiAgICB0aGUgcGVyLWRlbnRyeSBsb2NrIGluIHRoYXQgb3JkZXIuIGRwdXQoKSBkb2VzIHRoaXMgdG8gZW5zdXJlCiAgICB0aGF0IGEgZGVudHJ5IHRoYXQgaGFzIGp1c3QgYmVlbiBsb29rZWQgdXAgaW4gYW5vdGhlciBDUFUKICAgIGRvZXNuJ3QgZ2V0IGRlbGV0ZWQgYmVmb3JlIGRnZXQoKSBjYW4gYmUgZG9uZSBvbiBpdC4KQEAgLTY0MCwxMCArODUxLDEwIEBACiAgICBTaW5jZSB3ZSByZWRvIHRoZSBkX3BhcmVudCBjaGVjayBhbmQgY29tcGFyZSBuYW1lIHdoaWxlIGhvbGRpbmcKICAgIGRfbG9jaywgbG9jay1mcmVlIGxvb2stdXAgd2lsbCBub3QgcmFjZSBhZ2FpbnN0IGRfbW92ZSgpLgogCi00LiBUaGVyZSBjYW4gYmUgYSB0aGVvcml0aWNhbCByYWNlIHdoZW4gYSBkZW50cnkga2VlcHMgY29taW5nIGJhY2sKKzQuIFRoZXJlIGNhbiBiZSBhIHRoZW9yZXRpY2FsIHJhY2Ugd2hlbiBhIGRlbnRyeSBrZWVwcyBjb21pbmcgYmFjawogICAgdG8gb3JpZ2luYWwgYnVja2V0IGR1ZSB0byBkb3VibGUgbW92ZXMuIER1ZSB0byB0aGlzIGxvb2stdXAgbWF5CiAgICBjb25zaWRlciB0aGF0IGl0IGhhcyBuZXZlciBtb3ZlZCBhbmQgY2FuIGVuZCB1cCBpbiBhIGluZmluaXRlIGxvb3AuCi0gICBCdXQgdGhpcyBpcyBub3QgYW55IHdvcnNlIHRoYXQgdGhlb3JpdGljYWwgbGl2ZWxvY2tzIHdlIGFscmVhZHkKKyAgIEJ1dCB0aGlzIGlzIG5vdCBhbnkgd29yc2UgdGhhdCB0aGVvcmV0aWNhbCBsaXZlbG9ja3Mgd2UgYWxyZWFkeQogICAgaGF2ZSBpbiB0aGUga2VybmVsLgogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbG03OCBiL0RvY3VtZW50YXRpb24vaHdtb24vbG03OAppbmRleCAzNTcwODZlLi5mZDVkYzdhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNzgKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTc4CkBAIC0yLDE2ICsyLDExIEBACiA9PT09PT09PT09PT09PT09PT0KIAogU3VwcG9ydGVkIGNoaXBzOgotICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03OAorICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03OCAvIExNNzgtSgogICAgIFByZWZpeDogJ2xtNzgnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDIwIC0gMHgyZiwgSVNBIDB4MjkwICg4IEkvTyBwb3J0cykKICAgICBEYXRhc2hlZXQ6IFB1YmxpY2x5IGF2YWlsYWJsZSBhdCB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciB3ZWJzaXRlCiAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS8KLSAgKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzgtSgotICAgIFByZWZpeDogJ2xtNzgtaicKLSAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MjAgLSAweDJmLCBJU0EgMHgyOTAgKDggSS9PIHBvcnRzKQotICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIHdlYnNpdGUKLSAgICAgICAgICAgICAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tLwogICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03OQogICAgIFByZWZpeDogJ2xtNzknCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDIwIC0gMHgyZiwgSVNBIDB4MjkwICg4IEkvTyBwb3J0cykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNzkyZCBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNzkyZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTcxYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODM3OTJkCkBAIC0wLDAgKzEsMTc0IEBACitLZXJuZWwgZHJpdmVyIHc4Mzc5MmQKKz09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogV2luYm9uZCBXODM3OTJECisgICAgUHJlZml4OiAndzgzNzkyZCcKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MmMgLSAweDJmCisgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LndpbmJvbmQuY29tLnR3L0UtV0lOQk9OREhUTS9wYXJ0bmVyL1BERnJlc3VsdC5hc3A/UG5hbWU9MTAzNQorCitBdXRob3I6IENodW5oYW8gSHVhbmcKK0NvbnRhY3Q6IERaU2hlbiA8RFpTaGVuQFdpbmJvbmQuY29tLnR3PgorCisKK01vZHVsZSBQYXJhbWV0ZXJzCistLS0tLS0tLS0tLS0tLS0tLQorCisqIGluaXQgaW50CisgIChkZWZhdWx0IDEpCisgIFVzZSAnaW5pdD0wJyB0byBieXBhc3MgaW5pdGlhbGl6aW5nIHRoZSBjaGlwLgorICBUcnkgdGhpcyBpZiB5b3VyIGNvbXB1dGVyIGNyYXNoZXMgd2hlbiB5b3UgbG9hZCB0aGUgbW9kdWxlLgorCisqIGZvcmNlX3N1YmNsaWVudHM9YnVzLGNhZGRyLHNhZGRyLHNhZGRyCisgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSB0aGUgaTJjIGFkZHJlc3NlcyBmb3Igc3ViY2xpZW50cyBvZgorICBhIGNlcnRhaW4gY2hpcC4gRXhhbXBsZSB1c2FnZSBpcyBgZm9yY2Vfc3ViY2xpZW50cz0wLDB4MmYsMHg0YSwweDRiJworICB0byBmb3JjZSB0aGUgc3ViY2xpZW50cyBvZiBjaGlwIDB4MmYgb24gYnVzIDAgdG8gaTJjIGFkZHJlc3NlcworICAweDRhIGFuZCAweDRiLgorCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4Mzc5MkFEL0QuCisKK0RldGVjdGlvbiBvZiB0aGUgY2hpcCBjYW4gc29tZXRpbWVzIGJlIGZvaWxlZCBiZWNhdXNlIGl0IGNhbiBiZSBpbiBhbgoraW50ZXJuYWwgc3RhdGUgdGhhdCBhbGxvd3Mgbm8gY2xlYW4gYWNjZXNzIChCYW5rIHdpdGggSUQgcmVnaXN0ZXIgaXMgbm90CitjdXJyZW50bHkgc2VsZWN0ZWQpLiBJZiB5b3Uga25vdyB0aGUgYWRkcmVzcyBvZiB0aGUgY2hpcCwgdXNlIGEgJ2ZvcmNlJworcGFyYW1ldGVyOyB0aGlzIHdpbGwgcHV0IGl0IGludG8gYSBtb3JlIHdlbGwtYmVoYXZlZCBzdGF0ZSBmaXJzdC4KKworVGhlIGRyaXZlciBpbXBsZW1lbnRzIHRocmVlIHRlbXBlcmF0dXJlIHNlbnNvcnMsIHNldmVuIGZhbiByb3RhdGlvbiBzcGVlZAorc2Vuc29ycywgbmluZSB2b2x0YWdlIHNlbnNvcnMsIGFuZCB0d28gYXV0b21hdGljIGZhbiByZWd1bGF0aW9uCitzdHJhdGVnaWVzIGNhbGxlZDogU21hcnQgRmFuIEkgKFRoZXJtYWwgQ3J1aXNlIG1vZGUpIGFuZCBTbWFydCBGYW4gSUkuCitBdXRvbWF0aWMgZmFuIGNvbnRyb2wgbW9kZSBpcyBwb3NzaWJsZSBvbmx5IGZvciBmYW4xLWZhbjMuIEZhbjQtZmFuNyBjYW4gcnVuCitzeW5jaHJvbml6ZWQgd2l0aCBzZWxlY3RlZCBmYW4gKGZhbjEtZmFuMykuIFRoaXMgZnVuY3Rpb25hbGl0eSBhbmQgbWFudWFsIFBXTQorY29udHJvbCBmb3IgZmFuNC1mYW43IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKK1RlbXBlcmF0dXJlcyBhcmUgbWVhc3VyZWQgaW4gZGVncmVlcyBDZWxzaXVzIGFuZCBtZWFzdXJlbWVudCByZXNvbHV0aW9uIGlzIDEKK2RlZ0MgZm9yIHRlbXAxIGFuZCAwLjUgZGVnQyBmb3IgdGVtcDIgYW5kIHRlbXAzLiBBbiBhbGFybSBpcyB0cmlnZ2VyZWQgd2hlbgordGhlIHRlbXBlcmF0dXJlIGdldHMgaGlnaGVyIHRoYW4gdGhlIE92ZXJ0ZW1wZXJhdHVyZSBTaHV0ZG93biB2YWx1ZTsgaXQgc3RheXMKK29uIHVudGlsIHRoZSB0ZW1wZXJhdHVyZSBmYWxscyBiZWxvdyB0aGUgSHlzdGVyZXNpcyB2YWx1ZS4KKworRmFuIHJvdGF0aW9uIHNwZWVkcyBhcmUgcmVwb3J0ZWQgaW4gUlBNIChyb3RhdGlvbnMgcGVyIG1pbnV0ZSkuIEFuIGFsYXJtIGlzCit0cmlnZ2VyZWQgaWYgdGhlIHJvdGF0aW9uIHNwZWVkIGhhcyBkcm9wcGVkIGJlbG93IGEgcHJvZ3JhbW1hYmxlIGxpbWl0LiBGYW4KK3JlYWRpbmdzIGNhbiBiZSBkaXZpZGVkIGJ5IGEgcHJvZ3JhbW1hYmxlIGRpdmlkZXIgKDEsIDIsIDQsIDgsIDE2LCAzMiwgNjQgb3IKKzEyOCkgdG8gZ2l2ZSB0aGUgcmVhZGluZ3MgbW9yZSByYW5nZSBvciBhY2N1cmFjeS4KKworVm9sdGFnZSBzZW5zb3JzIChhbHNvIGtub3duIGFzIElOIHNlbnNvcnMpIHJlcG9ydCB0aGVpciB2YWx1ZXMgaW4gbWlsbGl2b2x0cy4KK0FuIGFsYXJtIGlzIHRyaWdnZXJlZCBpZiB0aGUgdm9sdGFnZSBoYXMgY3Jvc3NlZCBhIHByb2dyYW1tYWJsZSBtaW5pbXVtCitvciBtYXhpbXVtIGxpbWl0LgorCitBbGFybXMgYXJlIHByb3ZpZGVkIGFzIG91dHB1dCBmcm9tICJyZWFsdGltZSBzdGF0dXMgcmVnaXN0ZXIiLiBGb2xsb3dpbmcgYml0cworYXJlIGRlZmluZWQ6CisKK2JpdCAtIGFsYXJtIG9uOgorMCAgLSBpbjAKKzEgIC0gaW4xCisyICAtIHRlbXAxCiszICAtIHRlbXAyCis0ICAtIHRlbXAzCis1ICAtIGZhbjEKKzYgIC0gZmFuMgorNyAgLSBmYW4zCis4ICAtIGluMgorOSAgLSBpbjMKKzEwIC0gaW40CisxMSAtIGluNQorMTIgLSBpbjYKKzEzIC0gVklEIGNoYW5nZQorMTQgLSBjaGFzc2lzCisxNSAtIGZhbjcKKzE2IC0gdGFydDEKKzE3IC0gdGFydDIKKzE4IC0gdGFydDMKKzE5IC0gaW43CisyMCAtIGluOAorMjEgLSBmYW40CisyMiAtIGZhbjUKKzIzIC0gZmFuNgorCitUYXJ0IHdpbGwgYmUgYXNzZXJ0ZWQgd2hpbGUgdGFyZ2V0IHRlbXBlcmF0dXJlIGNhbm5vdCBiZSBhY2hpZXZlZCBhZnRlciAzIG1pbnV0ZXMKK29mIGZ1bGwgc3BlZWQgcm90YXRpb24gb2YgY29ycmVzcG9uZGluZyBmYW4uCisKK0luIGFkZGl0aW9uIHRvIHRoZSBhbGFybXMgZGVzY3JpYmVkIGFib3ZlLCB0aGVyZSBpcyBhIENIQVMgYWxhcm0gb24gdGhlIGNoaXBzCit3aGljaCB0cmlnZ2VycyBpZiB5b3VyIGNvbXB1dGVyIGNhc2UgaXMgb3BlbiAoVGhpcyBvbmUgaXMgbGF0Y2hlZCwgY29udHJhcnkKK3RvIHJlYWx0aW1lIGFsYXJtcykuCisKK1RoZSBjaGlwcyBvbmx5IHVwZGF0ZSB2YWx1ZXMgZWFjaCAzIHNlY29uZHM7IHJlYWRpbmcgdGhlbSBtb3JlIG9mdGVuIHdpbGwKK2RvIG5vIGhhcm0sIGJ1dCB3aWxsIHJldHVybiAnb2xkJyB2YWx1ZXMuCisKKworVzgzNzkyRCBQUk9CTEVNUworLS0tLS0tLS0tLS0tLS0tLQorS25vd24gcHJvYmxlbXM6CisJLSBUaGlzIGRyaXZlciBpcyBvbmx5IGZvciBXaW5ib25kIFc4Mzc5MkQgQyB2ZXJzaW9uIGRldmljZSwgdGhlcmUKKwkgIGFyZSBhbHNvIHNvbWUgbW90aGVyYm9hcmRzIHdpdGggQiB2ZXJzaW9uIFc4Mzc5MkQgZGV2aWNlLiBUaGUKKwkgIGNhbGN1bGF0aW9uIG1ldGhvZCB0byBpbjYtaW43KG1lYXN1cmVkIHZhbHVlLCBsaW1pdHMpIGlzIGEgbGl0dGxlCisJICBkaWZmZXJlbnQgYmV0d2VlbiBDIGFuZCBCIHZlcnNpb24uIEMgb3IgQiB2ZXJzaW9uIGNhbiBiZSBpZGVudGlmaWVkCisJICBieSBDUlsweDQ5aF0uCisJLSBUaGUgZnVuY3Rpb24gb2YgdmlkIGFuZCB2cm0gaGFzIG5vdCBiZWVuIGZpbmlzaGVkLCBiZWNhdXNlIEknbSBOT1QKKwkgIHZlcnkgZmFtaWxpYXIgd2l0aCB0aGVtLiBBZGRpbmcgc3VwcG9ydCBpcyB3ZWxjb21lLgoroAktIFRoZSBmdW5jdGlvbiBvZiBjaGFzc2lzIG9wZW4gZGV0ZWN0aW9uIG5lZWRzIG1vcmUgdGVzdHMuCisJLSBJZiB5b3UgaGF2ZSBBU1VTIHNlcnZlciBib2FyZCBhbmQgY2hpcCB3YXMgbm90IGZvdW5kOiBUaGVuIHlvdSB3aWxsCisJICBuZWVkIHRvIHVwZ3JhZGUgdG8gbGF0ZXN0IChvciBiZXRhKSBCSU9TLiBJZiBpdCBkb2VzIG5vdCBoZWxwIHBsZWFzZQorCSAgY29udGFjdCB1cy4KKworRmFuIGNvbnRyb2wKKy0tLS0tLS0tLS0tCisKK01hbnVhbCBtb2RlCistLS0tLS0tLS0tLQorCitXb3JrcyBhcyBleHBlY3RlZC4gWW91IGp1c3QgbmVlZCB0byBzcGVjaWZ5IGRlc2lyZWQgUFdNL0RDIHZhbHVlIChmYW4gc3BlZWQpCitpbiBhcHByb3ByaWF0ZSBwd20jIGZpbGUuCisKK1RoZXJtYWwgY3J1aXNlCistLS0tLS0tLS0tLS0tLQorCitJbiB0aGlzIG1vZGUsIFc4Mzc5MkQgcHJvdmlkZXMgdGhlIFNtYXJ0IEZhbiBzeXN0ZW0gdG8gYXV0b21hdGljYWxseSBjb250cm9sCitmYW4gc3BlZWQgdG8ga2VlcCB0aGUgdGVtcGVyYXR1cmVzIG9mIENQVSBhbmQgdGhlIHN5c3RlbSB3aXRoaW4gc3BlY2lmaWMKK3JhbmdlLiBBdCBmaXJzdCBhIHdhbnRlZCB0ZW1wZXJhdHVyZSBhbmQgaW50ZXJ2YWwgbXVzdCBiZSBzZXQuIFRoaXMgaXMgZG9uZQordmlhIHRoZXJtYWxfY3J1aXNlIyBmaWxlLiBUaGUgdG9sZXJhbmNlIyBmaWxlIHNlcnZlcyB0byBjcmVhdGUgVCArLSB0b2xlcmFuY2UKK2ludGVydmFsLiBUaGUgZmFuIHNwZWVkIHdpbGwgYmUgbG93ZXJlZCBhcyBsb25nIGFzIHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlCityZW1haW5zIGJlbG93IHRoZSB0aGVybWFsX2NydWlzZSMgKy0gdG9sZXJhbmNlIyB2YWx1ZS4gT25jZSB0aGUgdGVtcGVyYXR1cmUKK2V4Y2VlZHMgdGhlIGhpZ2ggbGltaXQgKFQrdG9sZXJhbmNlKSwgdGhlIGZhbiB3aWxsIGJlIHR1cm5lZCBvbiB3aXRoIGEKK3NwZWNpZmljIHNwZWVkIHNldCBieSBwd20jIGFuZCBhdXRvbWF0aWNhbGx5IGNvbnRyb2xsZWQgaXRzIFBXTSBkdXR5IGN5Y2xlCit3aXRoIHRoZSB0ZW1wZXJhdHVyZSB2YXJ5aW5nLiBUaHJlZSBjb25kaXRpb25zIG1heSBvY2N1cjoKKworKDEpIElmIHRoZSB0ZW1wZXJhdHVyZSBzdGlsbCBleGNlZWRzIHRoZSBoaWdoIGxpbWl0LCBQV00gZHV0eQorY3ljbGUgd2lsbCBpbmNyZWFzZSBzbG93bHkuCisKKygyKSBJZiB0aGUgdGVtcGVyYXR1cmUgZ29lcyBiZWxvdyB0aGUgaGlnaCBsaW1pdCwgYnV0IHN0aWxsIGFib3ZlIHRoZSBsb3cKK2xpbWl0IChULXRvbGVyYW5jZSksIHRoZSBmYW4gc3BlZWQgd2lsbCBiZSBmaXhlZCBhdCB0aGUgY3VycmVudCBzcGVlZCBiZWNhdXNlCit0aGUgdGVtcGVyYXR1cmUgaXMgaW4gdGhlIHRhcmdldCByYW5nZS4KKworKDMpIElmIHRoZSB0ZW1wZXJhdHVyZSBnb2VzIGJlbG93IHRoZSBsb3cgbGltaXQsIFBXTSBkdXR5IGN5Y2xlIHdpbGwgZGVjcmVhc2UKK3Nsb3dseSB0byAwIG9yIGEgcHJlc2V0IHN0b3AgdmFsdWUgdW50aWwgdGhlIHRlbXBlcmF0dXJlIGV4Y2VlZHMgdGhlIGxvdworbGltaXQuIChUaGUgcHJlc2V0IHN0b3AgdmFsdWUgaGFuZGxpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBkcml2ZXIpCisKK1NtYXJ0IEZhbiBJSQorLS0tLS0tLS0tLS0tCisKK1c4Mzc5MkQgYWxzbyBwcm92aWRlcyBhIHNwZWNpYWwgbW9kZSBmb3IgZmFuLiBGb3VyIHRlbXBlcmF0dXJlIHBvaW50cyBhcmUKK2F2YWlsYWJsZS4gV2hlbiByZWxhdGVkIHRlbXBlcmF0dXJlIHNlbnNvcnMgZGV0ZWN0cyB0aGUgdGVtcGVyYXR1cmUgaW4gcHJlc2V0Cit0ZW1wZXJhdHVyZSByZWdpb24gKHNmMl9wb2ludEBfZmFuIyArLSB0b2xlcmFuY2UjKSBpdCB3aWxsIGNhdXNlIGZhbnMgdG8gcnVuCitvbiBwcm9ncmFtbWVkIHZhbHVlIGZyb20gc2YyX2xldmVsQF9mYW4jLiBZb3UgbmVlZCB0byBzZXQgZm91ciB0ZW1wZXJhdHVyZXMKK2ZvciBlYWNoIGZhbi4KKworCisvc3lzIGZpbGVzCistLS0tLS0tLS0tCisKK3B3bVsxLTNdIC0gdGhpcyBmaWxlIHN0b3JlcyBQV00gZHV0eSBjeWNsZSBvciBEQyB2YWx1ZSAoZmFuIHNwZWVkKSBpbiByYW5nZToKKwkwIChzdG9wKSB0byAyNTUgKGZ1bGwpCitwd21bMS0zXV9lbmFibGUgLSB0aGlzIGZpbGUgY29udHJvbHMgbW9kZSBvZiBmYW4vdGVtcGVyYXR1cmUgY29udHJvbDoKKyAgICAgICAgICAgICogMCBEaXNhYmxlZAorICAgICAgICAgICAgKiAxIE1hbnVhbCBtb2RlCisgICAgICAgICAgICAqIDIgU21hcnQgRmFuIElJCisgICAgICAgICAgICAqIDMgVGhlcm1hbCBDcnVpc2UKK3B3bVsxLTNdX21vZGUgLSBTZWxlY3QgUFdNIG9mIERDIG1vZGUKKyAgICAgICAgICAgICogMCBEQworICAgICAgICAgICAgKiAxIFBXTQordGhlcm1hbF9jcnVpc2VbMS0zXSAtIFNlbGVjdHMgdGhlIGRlc2lyZWQgdGVtcGVyYXR1cmUgZm9yIGNydWlzZSAoZGVnQykKK3RvbGVyYW5jZVsxLTNdIC0gVmFsdWUgaW4gZGVncmVlcyBvZiBDZWxzaXVzIChkZWdDKSBmb3IgKy0gVAorc2YyX3BvaW50WzEtNF1fZmFuWzEtM10gLSBmb3VyIHRlbXBlcmF0dXJlIHBvaW50cyBmb3IgZWFjaCBmYW4gZm9yIFNtYXJ0IEZhbiBJSQorc2YyX2xldmVsWzEtM11fZmFuWzEtM10gLSB0aHJlZSBQV00vREMgbGV2ZWxzIGZvciBlYWNoIGZhbiBmb3IgU21hcnQgRmFuIElJCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9tYXg2ODc1IGIvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbWF4Njg3NQppbmRleCBiMDIwMDI4Li45NmZlYzU2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9tYXg2ODc1CisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL21heDY4NzUKQEAgLTQsMjIgKzQsMTMgQEAKIFN1cHBvcnRlZCBjaGlwczoKICAgKiBNYXhpbSBNQVg2ODc0LCBNQVg2ODc1CiAgICAgUHJlZml4OiAnbWF4Njg3NScKLSAgICBBZGRyZXNzZXMgc2Nhbm5lZDogMHg1MCwgMHg1MgorICAgIEFkZHJlc3NlcyBzY2FubmVkOiBOb25lIChzZWUgYmVsb3cpCiAgICAgRGF0YXNoZWV0OgogICAgICAgICBodHRwOi8vcGRmc2Vydi5tYXhpbS1pYy5jb20vZW4vZHMvTUFYNjg3NC1NQVg2ODc1LnBkZgogCiBBdXRob3I6IEJlbiBHYXJkbmVyIDxiZ2FyZG5lckB3YWJ0ZWMuY29tPgogCiAKLU1vZHVsZSBQYXJhbWV0ZXJzCi0tLS0tLS0tLS0tLS0tLS0tLQotCi0qIGFsbG93X3dyaXRlIGludAotICBTZXQgdG8gbm9uLXplcm8gdG8gZW5hYmxlIHdyaXRlIHBlcm1pc3Npb246Ci0gICowOiBSZWFkIG9ubHkKLSAgIDE6IFJlYWQgYW5kIHdyaXRlCi0KLQogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCiAKQEAgLTMzLDM0ICsyNCw4NSBAQAogCiBUaGUgTWF4aW0gTUFYNjg3NCBpcyBhIHNpbWlsYXIsIG1vc3RseSBjb21wYXRpYmxlIGRldmljZSwgd2l0aCBtb3JlIGludHB1dHMKIGFuZCBvdXRwdXRzOgotCiAgICAgICAgICAgICAgdmluICAgICBncGkgICAgdm91dAogTUFYNjg3NCAgICAgICAgNiAgICAgICA0ICAgICAgIDgKIE1BWDY4NzUgICAgICAgIDQgICAgICAgMyAgICAgICA1CiAKLU1BWDY4NzQgY2hpcHMgY2FuIGhhdmUgZm91ciBkaWZmZXJlbnQgYWRkcmVzc2VzIChhcyBvcHBvc2VkIHRvIG9ubHkgdHdvIGZvcgotdGhlIE1BWDY4NzUpLiBUaGUgYWRkaXRpb25hbCBhZGRyZXNzZXMgKDB4NTQgYW5kIDB4NTYpIGFyZSBub3QgcHJvYmVkIGJ5Ci10aGlzIGRyaXZlciBieSBkZWZhdWx0LCBidXQgdGhlIHByb2JlIG1vZHVsZSBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgaWYKLW5lZWRlZC4KLQotU2VlIHRoZSBkYXRhc2hlZXQgZm9yIGRldGFpbHMgb24gaG93IHRvIHByb2dyYW0gdGhlIEVFUFJPTS4KK1NlZSB0aGUgZGF0YXNoZWV0IGZvciBtb3JlIGluZm9ybWF0aW9uLgogCiAKIFN5c2ZzIGVudHJpZXMKIC0tLS0tLS0tLS0tLS0KIAotZWVwcm9tX3VzZXIgICAtIDUxMiBieXRlcyBvZiB1c2VyLWRlZmluZWQgRUVQUk9NIHNwYWNlLiBPbmx5IHdyaXRhYmxlIGlmCi0gICAgICAgICAgICAgICAgYWxsb3dfd3JpdGUgd2FzIHNldCBhbmQgcmVnaXN0ZXIgMHg0MyBpcyAwLgotCi1lZXByb21fY29uZmlnIC0gNzAgYnl0ZXMgb2YgY29uZmlnIEVFUFJPTS4gTm90ZSB0aGF0IGNoYW5nZXMgd2lsbCBub3QgZ2V0Ci0gICAgICAgICAgICAgICAgbG9hZGVkIGludG8gcmVnaXN0ZXIgc3BhY2UgdW50aWwgYSBwb3dlciBjeWNsZSBvciBkZXZpY2UgcmVzZXQuCi0KLXJlZ19jb25maWcgICAgLSA3MCBieXRlcyBvZiByZWdpc3RlciBzcGFjZS4gQW55IGNoYW5nZXMgdGFrZSBhZmZlY3QgaW1tZWRpYXRlbHkuCitlZXByb20gICAgICAgIC0gNTEyIGJ5dGVzIG9mIHVzZXItZGVmaW5lZCBFRVBST00gc3BhY2UuCiAKIAogR2VuZXJhbCBSZW1hcmtzCiAtLS0tLS0tLS0tLS0tLS0KIAotQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdpbGwgcmVxdWlyZSB0aGF0IHRoZSBFRVBST01zIGJlIHByb2dyYW1tZWQgb25jZSBhbmQKLW5ldmVyIGFsdGVyZWQgYWZ0ZXJ3YXJkcy4KK1ZhbGlkIGFkZHJlc3NlcyBmb3IgdGhlIE1BWDY4NzUgYXJlIDB4NTAgYW5kIDB4NTIuCitWYWxpZCBhZGRyZXNzZXMgZm9yIHRoZSBNQVg2ODc0IGFyZSAweDUwLCAweDUyLCAweDU0IGFuZCAweDU2LgorVGhlIGRyaXZlciBkb2VzIG5vdCBwcm9iZSBhbnkgYWRkcmVzcywgc28geW91IG11c3QgZm9yY2UgdGhlIGFkZHJlc3MuCisKK0V4YW1wbGU6CiskIG1vZHByb2JlIG1heDY4NzUgZm9yY2U9MCwweDUwCisKK1RoZSBNQVg2ODc0L01BWDY4NzUgaWdub3JlcyBhZGRyZXNzIGJpdCAwLCBzbyB0aGlzIGRyaXZlciBhdHRhY2hlcyB0byBtdWx0aXBsZQorYWRkcmVzc2VzLiAgRm9yIGV4YW1wbGUsIGZvciBhZGRyZXNzIDB4NTAsIGl0IGFsc28gcmVzZXJ2ZXMgMHg1MS4KK1RoZSBldmVuLWFkZHJlc3MgaW5zdGFuY2UgaXMgY2FsbGVkICdtYXg2ODc1JywgdGhlIG9kZCBvbmUgaXMgJ21heDY4NzUgc3ViY2xpZW50Jy4KKworCitQcm9ncmFtbWluZyB0aGUgY2hpcCB1c2luZyBpMmMtZGV2CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1VzZSB0aGUgaTJjLWRldiBpbnRlcmZhY2UgdG8gYWNjZXNzIGFuZCBwcm9ncmFtIHRoZSBjaGlwcy4KK1JlYWRzIGFuZCB3cml0ZXMgYXJlIHBlcmZvcm1lZCBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gdGhlIGFkZHJlc3MgcmFuZ2UuCisKK1RoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBhcmUgYXQgYWRkcmVzc2VzIDB4MDAgLSAweDQ1LgorVXNlIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoKSB0byB3cml0ZSBhIHJlZ2lzdGVyIGFuZAoraTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCkgdG8gcmVhZCBhIHJlZ2lzdGVyLgorVGhlIGNvbW1hbmQgaXMgdGhlIHJlZ2lzdGVyIG51bWJlci4KKworRXhhbXBsZXM6CitUbyB3cml0ZSBhIDEgdG8gcmVnaXN0ZXIgMHg0NToKKyAgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShmZCwgMHg0NSwgMSk7CisKK1RvIHJlYWQgcmVnaXN0ZXIgMHg0NToKKyAgdmFsdWUgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZmQsIDB4NDUpOworCisKK1RoZSBjb25maWd1cmF0aW9uIEVFUFJPTSBpcyBhdCBhZGRyZXNzZXMgMHg4MDAwIC0gMHg4MDQ1LgorVGhlIHVzZXIgRUVQUk9NIGlzIGF0IGFkZHJlc3NlcyAweDgxMDAgLSAweDgyZmYuCisKK1VzZSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKCkgdG8gd3JpdGUgYSBieXRlIHRvIEVFUFJPTS4KKworVGhlIGNvbW1hbmQgaXMgdGhlIHVwcGVyIGJ5dGUgb2YgdGhlIGFkZHJlc3M6IDB4ODAsIDB4ODEsIG9yIDB4ODIuCitUaGUgZGF0YSB3b3JkIGlzIHRoZSBsb3dlciBwYXJ0IG9mIHRoZSBhZGRyZXNzIG9yJ2Qgd2l0aCBkYXRhIDw8IDguCisgIGNtZCA9IGFkZHJlc3MgPj4gODsKKyAgdmFsID0gKGFkZHJlc3MgJiAweGZmKSB8IChkYXRhIDw8IDgpOworCitFeGFtcGxlOgorVG8gd3JpdGUgMHg1YSB0byBhZGRyZXNzIDB4ODAwMzoKKyAgaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShmZCwgMHg4MCwgMHg1YTAzKTsKKworCitSZWFkaW5nIGRhdGEgZnJvbSB0aGUgRUVQUk9NIGlzIGEgbGl0dGxlIG1vcmUgY29tcGxpY2F0ZWQuCitVc2UgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSgpIHRvIHNldCB0aGUgcmVhZCBhZGRyZXNzIGFuZCB0aGVuCitpMmNfc21idXNfcmVhZF9ieXRlKCkgb3IgaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoKSB0byByZWFkIHRoZSBkYXRhLgorCitFeGFtcGxlOgorVG8gcmVhZCBkYXRhIHN0YXJ0aW5nIGF0IG9mZnNldCAweDgxMDAsIGZpcnN0IHNldCB0aGUgYWRkcmVzczoKKyAgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShmZCwgMHg4MSwgMHgwMCk7CisKK0FuZCB0aGVuIHJlYWQgdGhlIGRhdGEKKyAgdmFsdWUgPSBpMmNfc21idXNfcmVhZF9ieXRlKGZkKTsKKworICBvcgorCisgIGNvdW50ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoZmQsIDB4ODQsIGJ1ZmZlcik7CisKK1RoZSBibG9jayByZWFkIHNob3VsZCByZWFkIDE2IGJ5dGVzLgorMHg4NCBpcyB0aGUgYmxvY2sgcmVhZCBjb21tYW5kLgorCitTZWUgdGhlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9mdW5jdGlvbmFsaXR5IGIvRG9jdW1lbnRhdGlvbi9pMmMvZnVuY3Rpb25hbGl0eQppbmRleCA4YTc4YTk1Li40MWZmZWZiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy9mdW5jdGlvbmFsaXR5CisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2Z1bmN0aW9uYWxpdHkKQEAgLTExNSw3ICsxMTUsNyBAQAogSWYgeW91IHRyeSB0byBhY2Nlc3MgYW4gYWRhcHRlciBmcm9tIGEgdXNlcnNwYWNlIHByb2dyYW0sIHlvdSB3aWxsIGhhdmUKIHRvIHVzZSB0aGUgL2RldiBpbnRlcmZhY2UuIFlvdSB3aWxsIHN0aWxsIGhhdmUgdG8gY2hlY2sgd2hldGhlciB0aGUKIGZ1bmN0aW9uYWxpdHkgeW91IG5lZWQgaXMgc3VwcG9ydGVkLCBvZiBjb3Vyc2UuIFRoaXMgaXMgZG9uZSB1c2luZwotdGhlIEkyQ19GVU5DUyBpb2N0bC4gQW4gZXhhbXBsZSwgYWRhcHRlZCBmcm9tIHRoZSBsbV9zZW5zb3JzIGkyY19kZXRlY3QKK3RoZSBJMkNfRlVOQ1MgaW9jdGwuIEFuIGV4YW1wbGUsIGFkYXB0ZWQgZnJvbSB0aGUgbG1fc2Vuc29ycyBpMmNkZXRlY3QKIHByb2dyYW0sIGlzIGJlbG93OgogCiAgIGludCBmaWxlOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvcG9ydGluZy1jbGllbnRzIGIvRG9jdW1lbnRhdGlvbi9pMmMvcG9ydGluZy1jbGllbnRzCmluZGV4IGE3YWRiZGQuLjQ4NDlkZmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL3BvcnRpbmctY2xpZW50cworKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9wb3J0aW5nLWNsaWVudHMKQEAgLTEsNCArMSw0IEBACi1SZXZpc2lvbiA0LCAyMDA0LTAzLTMwCitSZXZpc2lvbiA1LCAyMDA1LTA3LTI5CiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KIEdyZWcgS0ggPGdyZWdAa3JvYWguY29tPgogCkBAIC0xNywyMCArMTcsMjIgQEAKIAogVGVjaG5pY2FsIGNoYW5nZXM6CiAKLSogW0luY2x1ZGVzXSBHZXQgcmlkIG9mICJ2ZXJzaW9uLmgiLiBSZXBsYWNlIDxsaW51eC9pMmMtcHJvYy5oPiB3aXRoCi0gIDxsaW51eC9pMmMtc2Vuc29yLmg+LiBJbmNsdWRlcyB0eXBpY2FsbHkgbG9vayBsaWtlIHRoYXQ6CisqIFtJbmNsdWRlc10gR2V0IHJpZCBvZiAidmVyc2lvbi5oIiBhbmQgPGxpbnV4L2kyYy1wcm9jLmg+LgorICBJbmNsdWRlcyB0eXBpY2FsbHkgbG9vayBsaWtlIHRoYXQ6CiAgICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICAgI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICAgI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICAgI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotICAjaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgotICAjaW5jbHVkZSA8bGludXgvaTJjLXZpZC5oPgkvKiBpZiB5b3UgbmVlZCBWUk0gc3VwcG9ydCAqLworICAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4JLyogZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcgZHJpdmVycyAqLworICAjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyAgI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgkvKiBpZiB5b3UgbmVlZCBWUk0gc3VwcG9ydCAqLwogICAjaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBpZiB5b3UgaGF2ZSBJL08gb3BlcmF0aW9ucyAqLwogICBQbGVhc2UgcmVzcGVjdCB0aGlzIGluY2x1c2lvbiBvcmRlci4gU29tZSBleHRyYSBoZWFkZXJzIG1heSBiZQogICByZXF1aXJlZCBmb3IgYSBnaXZlbiBkcml2ZXIgKGUuZy4gImxtNzUuaCIpLgogCi0qIFtBZGRyZXNzZXNdIFNFTlNPUlNfSTJDX0VORCBiZWNvbWVzIEkyQ19DTElFTlRfRU5ELCBTRU5TT1JTX0lTQV9FTkQKLSAgYmVjb21lcyBJMkNfQ0xJRU5UX0lTQV9FTkQuCisqIFtBZGRyZXNzZXNdIFNFTlNPUlNfSTJDX0VORCBiZWNvbWVzIEkyQ19DTElFTlRfRU5ELCBJU0EgYWRkcmVzc2VzCisgIGFyZSBubyBtb3JlIGhhbmRsZWQgYnkgdGhlIGkyYyBjb3JlLgorICBTRU5TT1JTX0lOU01PRF88bj4gYmVjb21lcyBJMkNfQ0xJRU5UX0lOU01PRF88bj4uCiAKICogW0NsaWVudCBkYXRhXSBHZXQgcmlkIG9mIHN5c2N0bF9pZC4gVHJ5IHVzaW5nIHN0YW5kYXJkIG5hbWVzIGZvcgogICByZWdpc3RlciB2YWx1ZXMgKGZvciBleGFtcGxlLCB0ZW1wX29zIGJlY29tZXMgdGVtcF9tYXgpLiBZb3UncmUKQEAgLTY2LDEzICs2OCwxNSBAQAogICBpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCiAgICAgICAgICAgcmV0dXJuIDA7CiAgIElTQS1vbmx5IGRyaXZlcnMgb2YgY291cnNlIGRvbid0IG5lZWQgdGhpcy4KKyAgQ2FsbCBpMmNfcHJvYmUoKSBpbnN0ZWFkIG9mIGkyY19kZXRlY3QoKS4KIAogKiBbRGV0ZWN0XSBBcyBtZW50aW9uZWQgZWFybGllciwgdGhlIGZsYWdzIHBhcmFtZXRlciBpcyBnb25lLgogICBUaGUgdHlwZV9uYW1lIGFuZCBjbGllbnRfbmFtZSBzdHJpbmdzIGFyZSByZXBsYWNlZCBieSBhIHNpbmdsZQogICBuYW1lIHN0cmluZywgd2hpY2ggd2lsbCBiZSBmaWxsZWQgd2l0aCBhIGxvd2VyY2FzZSwgc2hvcnQgc3RyaW5nCiAgICh0eXBpY2FsbHkgdGhlIGRyaXZlciBuYW1lLCBlLmcuICJsbTc1IikuCiAgIEluIGkyYy1vbmx5IGRyaXZlcnMsIGRyb3AgdGhlIGkyY19pc19pc2FfYWRhcHRlciBjaGVjaywgaXQncwotICB1c2VsZXNzLgorICB1c2VsZXNzLiBTYW1lIGZvciBpc2Etb25seSBkcml2ZXJzLCBhcyB0aGUgdGVzdCB3b3VsZCBhbHdheXMgYmUKKyAgdHJ1ZS4gT25seSBoeWJyaWQgZHJpdmVycyAod2hpY2ggYXJlIHF1aXRlIHJhcmUpIHN0aWxsIG5lZWQgaXQuCiAgIFRoZSBlcnJvck4gbGFiZWxzIGFyZSByZWR1Y2VkIHRvIHRoZSBudW1iZXIgbmVlZGVkLiBJZiB0aGF0IG51bWJlcgogICBpcyAyIChpMmMtb25seSBkcml2ZXJzKSwgaXQgaXMgYWR2aXNlZCB0aGF0IHRoZSBsYWJlbHMgYXJlIG5hbWVkCiAgIGV4aXQgYW5kIGV4aXRfZnJlZS4gRm9yIGkyYytpc2EgZHJpdmVycywgbGFiZWxzIHNob3VsZCBiZSBuYW1lZApAQCAtODYsNiArOTAsOCBAQAogICBkZXZpY2VfY3JlYXRlX2ZpbGUuIE1vdmUgdGhlIGRyaXZlciBpbml0aWFsaXphdGlvbiBiZWZvcmUgYW55CiAgIHN5c2ZzIGZpbGUgY3JlYXRpb24uCiAgIERyb3AgY2xpZW50LT5pZC4KKyAgRHJvcCBhbnkgMjRSRjA4IGNvcnJ1cHRpb24gcHJldmVudGlvbiB5b3UgZmluZCwgYXMgdGhpcyBpcyBub3cgZG9uZQorICBhdCB0aGUgaTJjLWNvcmUgbGV2ZWwsIGFuZCBkb2luZyBpdCB0d2ljZSB2b2lkcyBpdC4KIAogKiBbSW5pdF0gTGltaXRzIG11c3Qgbm90IGJlIHNldCBieSB0aGUgZHJpdmVyIChjYW4gYmUgZG9uZSBsYXRlciBpbgogICB1c2VyLXNwYWNlKS4gQ2hpcCBzaG91bGQgbm90IGJlIHJlc2V0IGRlZmF1bHQgKGFsdGhvdWdoIGEgbW9kdWxlCkBAIC05Myw3ICs5OSw4IEBACiAgIGxpbWl0ZWQgdG8gdGhlIHN0cmljdGx5IG5lY2Vzc2FyeSBzdGVwcy4KIAogKiBbRGV0YWNoXSBHZXQgcmlkIG9mIGRhdGEsIHJlbW92ZSB0aGUgY2FsbCB0bwotICBpMmNfZGVyZWdpc3Rlcl9lbnRyeS4KKyAgaTJjX2RlcmVnaXN0ZXJfZW50cnkuIERvIG5vdCBsb2cgYW4gZXJyb3IgbWVzc2FnZSBpZgorICBpMmNfZGV0YWNoX2NsaWVudCBmYWlscywgYXMgaTJjLWNvcmUgd2lsbCBub3cgZG8gaXQgZm9yIHlvdS4KIAogKiBbVXBkYXRlXSBEb24ndCBhY2Nlc3MgY2xpZW50LT5kYXRhIGRpcmVjdGx5LCB1c2UKICAgaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkgaW5zdGVhZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cyBiL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cwppbmRleCA5MTY2NGJlLi4wNzcyNzU3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy93cml0aW5nLWNsaWVudHMKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvd3JpdGluZy1jbGllbnRzCkBAIC0xNDgsMTUgKzE0OCwxNSBAQAogZGV0ZWN0aW9uIGFsZ29yaXRobS4KIAogWW91IGRvIG5vdCBoYXZlIHRvIHVzZSB0aGlzIHBhcmFtZXRlciBpbnRlcmZhY2U7IGJ1dCBkb24ndCB0cnkgdG8gdXNlCi1mdW5jdGlvbiBpMmNfcHJvYmUoKSAob3IgaTJjX2RldGVjdCgpKSBpZiB5b3UgZG9uJ3QuCitmdW5jdGlvbiBpMmNfcHJvYmUoKSBpZiB5b3UgZG9uJ3QuCiAKIE5PVEU6IElmIHlvdSB3YW50IHRvIHdyaXRlIGEgYHNlbnNvcnMnIGRyaXZlciwgdGhlIGludGVyZmFjZSBpcyBzbGlnaHRseQogICAgICAgZGlmZmVyZW50ISBTZWUgYmVsb3cuCiAKIAogCi1Qcm9iaW5nIGNsYXNzZXMgKGkyYykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUHJvYmluZyBjbGFzc2VzCistLS0tLS0tLS0tLS0tLS0KIAogQWxsIHBhcmFtZXRlcnMgYXJlIGdpdmVuIGFzIGxpc3RzIG9mIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycy4gTGlzdHMgYXJlCiB0ZXJtaW5hdGVkIGJ5IEkyQ19DTElFTlRfRU5ELgpAQCAtMTcxLDEyICsxNzEsMTggQEAKICAgIGlnbm9yZTogaW5zbW9kIHBhcmFtZXRlci4KICAgICAgQSBsaXN0IG9mIHBhaXJzLiBUaGUgZmlyc3QgdmFsdWUgaXMgYSBidXMgbnVtYmVyICgtMSBmb3IgYW55IEkyQyBidXMpLCAKICAgICAgdGhlIHNlY29uZCBpcyB0aGUgSTJDIGFkZHJlc3MuIFRoZXNlIGFkZHJlc3NlcyBhcmUgbmV2ZXIgcHJvYmVkLiAKLSAgICAgVGhpcyBwYXJhbWV0ZXIgb3ZlcnJ1bGVzICdub3JtYWwnIGFuZCAncHJvYmUnLCBidXQgbm90IHRoZSAnZm9yY2UnIGxpc3RzLgorICAgICBUaGlzIHBhcmFtZXRlciBvdmVycnVsZXMgdGhlICdub3JtYWxfaTJjJyBsaXN0IG9ubHkuCiAgICBmb3JjZTogaW5zbW9kIHBhcmFtZXRlci4gCiAgICAgIEEgbGlzdCBvZiBwYWlycy4gVGhlIGZpcnN0IHZhbHVlIGlzIGEgYnVzIG51bWJlciAoLTEgZm9yIGFueSBJMkMgYnVzKSwKICAgICAgdGhlIHNlY29uZCBpcyB0aGUgSTJDIGFkZHJlc3MuIEEgZGV2aWNlIGlzIGJsaW5kbHkgYXNzdW1lZCB0byBiZSBvbgogICAgICB0aGUgZ2l2ZW4gYWRkcmVzcywgbm8gcHJvYmluZyBpcyBkb25lLiAKIAorQWRkaXRpb25hbGx5LCBraW5kLXNwZWNpZmljIGZvcmNlIGxpc3RzIG1heSBvcHRpb25hbGx5IGJlIGRlZmluZWQgaWYKK3RoZSBkcml2ZXIgc3VwcG9ydHMgc2V2ZXJhbCBjaGlwIGtpbmRzLiBUaGV5IGFyZSBncm91cGVkIGluIGEKK05VTEwtdGVybWluYXRlZCBsaXN0IG9mIHBvaW50ZXJzIG5hbWVkIGZvcmNlcywgdGhvc2UgZmlyc3QgZWxlbWVudCBpZiB0aGUKK2dlbmVyaWMgZm9yY2UgbGlzdCBtZW50aW9uZWQgYWJvdmUuIEVhY2ggYWRkaXRpb25hbCBsaXN0IGNvcnJlc3BvbmQgdG8gYW4KK2luc21vZCBwYXJhbWV0ZXIgb2YgdGhlIGZvcm0gZm9yY2VfPGtpbmQ+LgorCiBGb3J0dW5hdGVseSwgYXMgYSBtb2R1bGUgd3JpdGVyLCB5b3UganVzdCBoYXZlIHRvIGRlZmluZSB0aGUgYG5vcm1hbF9pMmMnIAogcGFyYW1ldGVyLiBUaGUgY29tcGxldGUgZGVjbGFyYXRpb24gY291bGQgbG9vayBsaWtlIHRoaXM6CiAKQEAgLTE4Niw2NiArMTkyLDE3IEBACiAKICAgLyogTWFnaWMgZGVmaW5pdGlvbiBvZiBhbGwgb3RoZXIgdmFyaWFibGVzIGFuZCB0aGluZ3MgKi8KICAgSTJDX0NMSUVOVF9JTlNNT0Q7CisgIC8qIE9yLCBpZiB5b3VyIGRyaXZlciBzdXBwb3J0cywgc2F5LCAyIGtpbmQgb2YgZGV2aWNlczogKi8KKyAgSTJDX0NMSUVOVF9JTlNNT0RfMihmb28sIGJhcik7CisKK0lmIHlvdSB1c2UgdGhlIG11bHRpLWtpbmQgZm9ybSwgYW4gZW51bSB3aWxsIGJlIGRlZmluZWQgZm9yIHlvdToKKyAgZW51bSBjaGlwcyB7IGFueV9jaGlwLCBmb28sIGJhciwgLi4uIH0KK1lvdSBjYW4gdGhlbiAoYW5kIGNlcnRhaW5seSBzaG91bGQpIHVzZSBpdCBpbiB0aGUgZHJpdmVyIGNvZGUuCiAKIE5vdGUgdGhhdCB5b3UgKmhhdmUqIHRvIGNhbGwgdGhlIGRlZmluZWQgdmFyaWFibGUgYG5vcm1hbF9pMmMnLAogd2l0aG91dCBhbnkgcHJlZml4IQogCiAKLVByb2JpbmcgY2xhc3NlcyAoc2Vuc29ycykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSWYgeW91IHdyaXRlIGEgYHNlbnNvcnMnIGRyaXZlciwgeW91IHVzZSBhIHNsaWdodGx5IGRpZmZlcmVudCBpbnRlcmZhY2UuCi1BcyB3ZWxsIGFzIEkyQyBhZGRyZXNzZXMsIHdlIGhhdmUgdG8gY29wZSB3aXRoIElTQSBhZGRyZXNzZXMuIEFsc28sIHdlCi11c2UgYSBlbnVtIG9mIGNoaXAgdHlwZXMuIERvbid0IGZvcmdldCB0byBpbmNsdWRlIGBzZW5zb3JzLmgnLgotCi1UaGUgZm9sbG93aW5nIGxpc3RzIGFyZSB1c2VkIGludGVybmFsbHkuIFRoZXkgYXJlIGFsbCBsaXN0cyBvZiBpbnRlZ2Vycy4KLQotICAgbm9ybWFsX2kyYzogZmlsbGVkIGluIGJ5IHRoZSBtb2R1bGUgd3JpdGVyLiBUZXJtaW5hdGVkIGJ5IFNFTlNPUlNfSTJDX0VORC4KLSAgICAgQSBsaXN0IG9mIEkyQyBhZGRyZXNzZXMgd2hpY2ggc2hvdWxkIG5vcm1hbGx5IGJlIGV4YW1pbmVkLgotICAgbm9ybWFsX2lzYTogZmlsbGVkIGluIGJ5IHRoZSBtb2R1bGUgd3JpdGVyLiBUZXJtaW5hdGVkIGJ5IFNFTlNPUlNfSVNBX0VORC4KLSAgICAgQSBsaXN0IG9mIElTQSBhZGRyZXNzZXMgd2hpY2ggc2hvdWxkIG5vcm1hbGx5IGJlIGV4YW1pbmVkLgotICAgcHJvYmU6IGluc21vZCBwYXJhbWV0ZXIuIEluaXRpYWxpemUgdGhpcyBsaXN0IHdpdGggU0VOU09SU19JMkNfRU5EIHZhbHVlcy4KLSAgICAgQSBsaXN0IG9mIHBhaXJzLiBUaGUgZmlyc3QgdmFsdWUgaXMgYSBidXMgbnVtYmVyIChTRU5TT1JTX0lTQV9CVVMgZm9yCi0gICAgIHRoZSBJU0EgYnVzLCAtMSBmb3IgYW55IEkyQyBidXMpLCB0aGUgc2Vjb25kIGlzIHRoZSBhZGRyZXNzLiBUaGVzZQotICAgICBhZGRyZXNzZXMgYXJlIGFsc28gcHJvYmVkLCBhcyBpZiB0aGV5IHdlcmUgaW4gdGhlICdub3JtYWwnIGxpc3QuCi0gICBpZ25vcmU6IGluc21vZCBwYXJhbWV0ZXIuIEluaXRpYWxpemUgdGhpcyBsaXN0IHdpdGggU0VOU09SU19JMkNfRU5EIHZhbHVlcy4KLSAgICAgQSBsaXN0IG9mIHBhaXJzLiBUaGUgZmlyc3QgdmFsdWUgaXMgYSBidXMgbnVtYmVyIChTRU5TT1JTX0lTQV9CVVMgZm9yCi0gICAgIHRoZSBJU0EgYnVzLCAtMSBmb3IgYW55IEkyQyBidXMpLCB0aGUgc2Vjb25kIGlzIHRoZSBJMkMgYWRkcmVzcy4gVGhlc2UKLSAgICAgYWRkcmVzc2VzIGFyZSBuZXZlciBwcm9iZWQuIFRoaXMgcGFyYW1ldGVyIG92ZXJydWxlcyAnbm9ybWFsJyBhbmQgCi0gICAgICdwcm9iZScsIGJ1dCBub3QgdGhlICdmb3JjZScgbGlzdHMuCi0KLUFsc28gdXNlZCBpcyBhIGxpc3Qgb2YgcG9pbnRlcnMgdG8gc2Vuc29yc19mb3JjZV9kYXRhIHN0cnVjdHVyZXM6Ci0gICBmb3JjZV9kYXRhOiBpbnNtb2QgcGFyYW1ldGVycy4gQSBsaXN0LCBlbmRpbmcgd2l0aCBhbiBlbGVtZW50IG9mIHdoaWNoCi0gICAgIHRoZSBmb3JjZSBmaWVsZCBpcyBOVUxMLgotICAgICBFYWNoIGVsZW1lbnQgY29udGFpbnMgdGhlIHR5cGUgb2YgY2hpcCBhbmQgYSBsaXN0IG9mIHBhaXJzLgotICAgICBUaGUgZmlyc3QgdmFsdWUgaXMgYSBidXMgbnVtYmVyIChTRU5TT1JTX0lTQV9CVVMgZm9yIHRoZSBJU0EgYnVzLCAKLSAgICAgLTEgZm9yIGFueSBJMkMgYnVzKSwgdGhlIHNlY29uZCBpcyB0aGUgYWRkcmVzcy4gCi0gICAgIFRoZXNlIGFyZSBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgdG8gaW5zbW9kIHZhcmlhYmxlcyBvZiB0aGUgZm9ybQotICAgICBmb3JjZV9mb28uCi0KLVNvIHdlIGhhdmUgYSBnZW5lcmljIGluc21vZCB2YXJpYWJsZWQgYGZvcmNlJywgYW5kIGNoaXAtc3BlY2lmaWMgdmFyaWFibGVzCi1gZm9yY2VfQ0hJUE5BTUUnLgotCi1Gb3J0dW5hdGVseSwgYXMgYSBtb2R1bGUgd3JpdGVyLCB5b3UganVzdCBoYXZlIHRvIGRlZmluZSB0aGUgYG5vcm1hbF9pMmMnIAotYW5kIGBub3JtYWxfaXNhJyBwYXJhbWV0ZXJzLCBhbmQgZGVmaW5lIHdoYXQgY2hpcCBuYW1lcyBhcmUgdXNlZC4gCi1UaGUgY29tcGxldGUgZGVjbGFyYXRpb24gY291bGQgbG9vayBsaWtlIHRoaXM6Ci0gIC8qIFNjYW4gaTJjIGFkZHJlc3NlcyAweDM3LCBhbmQgMHg0OCB0byAweDRmICovCi0gIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MzcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGQsIDB4NGUsIDB4NGYsIEkyQ19DTElFTlRfRU5EIH07Ci0gIC8qIFNjYW4gSVNBIGFkZHJlc3MgMHgyOTAgKi8KLSAgc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7MHgwMjkwLFNFTlNPUlNfSVNBX0VORH07Ci0KLSAgLyogRGVmaW5lIGNoaXBzIGZvbyBhbmQgYmFyLCBhcyB3ZWxsIGFzIGFsbCBtb2R1bGUgcGFyYW1ldGVycyBhbmQgdGhpbmdzICovCi0gIFNFTlNPUlNfSU5TTU9EXzIoZm9vLGJhcik7Ci0KLUlmIHlvdSBoYXZlIG9uZSBjaGlwLCB5b3UgdXNlIG1hY3JvIFNFTlNPUlNfSU5TTU9EXzEoY2hpcCksIGlmIHlvdSBoYXZlIDIKLXlvdSB1c2UgbWFjcm8gU0VOU09SU19JTlNNT0RfMihjaGlwMSxjaGlwMiksIGV0Yy4gSWYgeW91IGRvIG5vdCB3YW50IHRvCi1ib3RoZXIgd2l0aCBjaGlwIHR5cGVzLCB5b3UgY2FuIHVzZSBTRU5TT1JTX0lOU01PRF8wLgotCi1BIGVudW0gaXMgYXV0b21hdGljYWxseSBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0gIGVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyLCAuLi4gfQotCi0KIEF0dGFjaGluZyB0byBhbiBhZGFwdGVyCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yNjQsMTcgKzIyMSwxMCBAQAogICAgIHJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwmYWRkcl9kYXRhLCZmb29fZGV0ZWN0X2NsaWVudCk7CiAgIH0KIAotRm9yIGBzZW5zb3JzJyBkcml2ZXJzLCB1c2UgdGhlIGkyY19kZXRlY3QgZnVuY3Rpb24gaW5zdGVhZDoKLSAgCi0gIGludCBmb29fYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQotICB7IAotICAgIHJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsJmFkZHJfZGF0YSwmZm9vX2RldGVjdF9jbGllbnQpOwotICB9Ci0KIFJlbWVtYmVyLCBzdHJ1Y3R1cmUgYGFkZHJfZGF0YScgaXMgZGVmaW5lZCBieSB0aGUgbWFjcm9zIGV4cGxhaW5lZCBhYm92ZSwKIHNvIHlvdSBkbyBub3QgaGF2ZSB0byBkZWZpbmUgaXQgeW91cnNlbGYuCiAKLVRoZSBpMmNfcHJvYmUgb3IgaTJjX2RldGVjdCBmdW5jdGlvbiB3aWxsIGNhbGwgdGhlIGZvb19kZXRlY3RfY2xpZW50CitUaGUgaTJjX3Byb2JlIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgZm9vX2RldGVjdF9jbGllbnQKIGZ1bmN0aW9uIG9ubHkgZm9yIHRob3NlIGkyYyBhZGRyZXNzZXMgdGhhdCBhY3R1YWxseSBoYXZlIGEgZGV2aWNlIG9uCiB0aGVtICh1bmxlc3MgYSBgZm9yY2UnIHBhcmFtZXRlciB3YXMgdXNlZCkuIEluIGFkZGl0aW9uLCBhZGRyZXNzZXMgdGhhdAogYXJlIGFscmVhZHkgaW4gdXNlIChieSBzb21lIG90aGVyIHJlZ2lzdGVyZWQgY2xpZW50KSBhcmUgc2tpcHBlZC4KQEAgLTI4MywxOSArMjMzLDE4IEBACiBUaGUgZGV0ZWN0IGNsaWVudCBmdW5jdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVGhlIGRldGVjdCBjbGllbnQgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19wcm9iZSBvciBpMmNfZGV0ZWN0LgotVGhlIGBraW5kJyBwYXJhbWV0ZXIgY29udGFpbnMgMCBpZiB0aGlzIGNhbGwgaXMgZHVlIHRvIGEgYGZvcmNlJwotcGFyYW1ldGVyLCBhbmQgLTEgb3RoZXJ3aXNlIChmb3IgaTJjX2RldGVjdCwgaXQgY29udGFpbnMgMCBpZgotdGhpcyBjYWxsIGlzIGR1ZSB0byB0aGUgZ2VuZXJpYyBgZm9yY2UnIHBhcmFtZXRlciwgYW5kIHRoZSBjaGlwIHR5cGUKLW51bWJlciBpZiBpdCBpcyBkdWUgdG8gYSBzcGVjaWZpYyBgZm9yY2UnIHBhcmFtZXRlcikuCitUaGUgZGV0ZWN0IGNsaWVudCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX3Byb2JlLiBUaGUgYGtpbmQnIHBhcmFtZXRlcgorY29udGFpbnMgLTEgZm9yIGEgcHJvYmVkIGRldGVjdGlvbiwgMCBmb3IgYSBmb3JjZWQgZGV0ZWN0aW9uLCBvciBhIHBvc2l0aXZlCitudW1iZXIgZm9yIGEgZm9yY2VkIGRldGVjdGlvbiB3aXRoIGEgY2hpcCB0eXBlIGZvcmNlZC4KIAogQmVsb3csIHNvbWUgdGhpbmdzIGFyZSBvbmx5IG5lZWRlZCBpZiB0aGlzIGlzIGEgYHNlbnNvcnMnIGRyaXZlci4gVGhvc2UKIHBhcnRzIGFyZSBiZXR3ZWVuIC8qIFNFTlNPUlMgT05MWSBTVEFSVCAqLyBhbmQgLyogU0VOU09SUyBPTkxZIEVORCAqLwogbWFya2Vycy4gCiAKLVRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgcmV0dXJuIGFuIGVycm9yIChhbnkgdmFsdWUgIT0gMCkgaWYgdGhlcmUgaXMKLXNvbWUgcmVhc29uIHdoeSBubyBtb3JlIGRldGVjdGlvbiBzaG91bGQgYmUgZG9uZSBhbnltb3JlLiBJZiB0aGUKLWRldGVjdGlvbiBqdXN0IGZhaWxzIGZvciB0aGlzIGFkZHJlc3MsIHJldHVybiAwLgorUmV0dXJuaW5nIGFuIGVycm9yIGRpZmZlcmVudCBmcm9tIC1FTk9ERVYgaW4gYSBkZXRlY3QgZnVuY3Rpb24gd2lsbCBjYXVzZQordGhlIGRldGVjdGlvbiB0byBzdG9wOiBvdGhlciBhZGRyZXNzZXMgYW5kIGFkYXB0ZXJzIHdvbid0IGJlIHNjYW5uZWQuCitUaGlzIHNob3VsZCBvbmx5IGJlIGRvbmUgb24gZmF0YWwgb3IgaW50ZXJuYWwgZXJyb3JzLCBzdWNoIGFzIGEgbWVtb3J5CitzaG9ydGFnZSBvciBpMmNfYXR0YWNoX2NsaWVudCBmYWlsaW5nLgogCiBGb3Igbm93LCB5b3UgY2FuIGlnbm9yZSB0aGUgYGZsYWdzJyBwYXJhbWV0ZXIuIEl0IGlzIHRoZXJlIGZvciBmdXR1cmUgdXNlLgogCkBAIC0zMjAsMTEgKzI2OSwxMCBAQAogICAgIGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9ICIiOwogICAgIGludCBpc19pc2EgPSBpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcik7CiAKLSAgICBpZiAoaXNfaXNhKSB7CisgICAgLyogRG8gdGhpcyBvbmx5IGlmIHRoZSBjaGlwIGNhbiBhZGRpdGlvbmFsbHkgYmUgZm91bmQgb24gdGhlIElTQSBidXMKKyAgICAgICAoaHlicmlkIGNoaXApLiAqLwogCi0gICAgICAvKiBJZiB0aGlzIGNsaWVudCBjYW4ndCBiZSBvbiB0aGUgSVNBIGJ1cyBhdCBhbGwsIHdlIGNhbiBzdG9wIG5vdwotICAgICAgICAgKGNhbGwgYGdvdG8gRVJST1IwJykuIEJ1dCBmb3Iga2lja3MsIHdlIHdpbGwgYXNzdW1lIGl0IGlzIGFsbAotICAgICAgICAgcmlnaHQuICovCisgICAgaWYgKGlzX2lzYSkgewogCiAgICAgICAvKiBEaXNjYXJkIGltbWVkaWF0ZWx5IGlmIHRoaXMgSVNBIHJhbmdlIGlzIGFscmVhZHkgdXNlZCAqLwogICAgICAgaWYgKGNoZWNrX3JlZ2lvbihhZGRyZXNzLEZPT19FWFRFTlQpKQpAQCAtNDk1LDE1ICs0NDMsMTMgQEAKICAgICAvKiBTRU5TT1JTIE9OTFkgRU5EICovCiAKICAgICAvKiBUcnkgdG8gZGV0YWNoIHRoZSBjbGllbnQgZnJvbSBpMmMgc3BhY2UgKi8KLSAgICBpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0gICAgICBwcmludGsoImZvby5vOiBDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisgICAgaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQogCi0gICAgLyogU0VOU09SUyBPTkxZIFNUQVJUICovCisgICAgLyogSFlCUklEIFNFTlNPUlMgQ0hJUCBPTkxZIFNUQVJUICovCiAgICAgaWYgaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50KQogICAgICAgcmVsZWFzZV9yZWdpb24oY2xpZW50LT5hZGRyLExNNzhfRVhURU5UKTsKLSAgICAvKiBTRU5TT1JTIE9OTFkgRU5EICovCisgICAgLyogSFlCUklEIFNFTlNPUlMgQ0hJUCBPTkxZIEVORCAqLwogCiAgICAga2ZyZWUoY2xpZW50KTsgLyogRnJlZXMgY2xpZW50IGRhdGEgdG9vLCBpZiBhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMzg2L2Jvb3QudHh0IGIvRG9jdW1lbnRhdGlvbi9pMzg2L2Jvb3QudHh0CmluZGV4IDFjNDhmMGUuLjEwMzEyYmUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTM4Ni9ib290LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2kzODYvYm9vdC50eHQKQEAgLTIsNyArMiw3IEBACiAJCSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAJCSAgICBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KLQkJCUxhc3QgdXBkYXRlIDIwMDItMDEtMDEKKwkJCUxhc3QgdXBkYXRlIDIwMDUtMDktMDIKIAogT24gdGhlIGkzODYgcGxhdGZvcm0sIHRoZSBMaW51eCBrZXJuZWwgdXNlcyBhIHJhdGhlciBjb21wbGljYXRlZCBib290CiBjb252ZW50aW9uLiAgVGhpcyBoYXMgZXZvbHZlZCBwYXJ0aWFsbHkgZHVlIHRvIGhpc3RvcmljYWwgYXNwZWN0cywgYXMKQEAgLTM0LDYgKzM0LDggQEAKIFByb3RvY29sIDIuMDM6CShLZXJuZWwgMi40LjE4LXByZTEpIEV4cGxpY2l0bHkgbWFrZXMgdGhlIGhpZ2hlc3QgcG9zc2libGUKIAkJaW5pdHJkIGFkZHJlc3MgYXZhaWxhYmxlIHRvIHRoZSBib290bG9hZGVyLgogCitQcm90b2NvbCAyLjA0OgkoS2VybmVsIDIuNi4xNCkgRXh0ZW5kIHRoZSBzeXNzaXplIGZpZWxkIHRvIGZvdXIgYnl0ZXMuCisKIAogKioqKiBNRU1PUlkgTEFZT1VUCiAKQEAgLTEwMywxMCArMTA1LDkgQEAKIE9mZnNldAlQcm90bwlOYW1lCQlNZWFuaW5nCiAvU2l6ZQogCi0wMUYxLzEJQUxMCXNldHVwX3NlY3RzCVRoZSBzaXplIG9mIHRoZSBzZXR1cCBpbiBzZWN0b3JzCiswMUYxLzEJQUxMKDEJc2V0dXBfc2VjdHMJVGhlIHNpemUgb2YgdGhlIHNldHVwIGluIHNlY3RvcnMKIDAxRjIvMglBTEwJcm9vdF9mbGFncwlJZiBzZXQsIHRoZSByb290IGlzIG1vdW50ZWQgcmVhZG9ubHkKLTAxRjQvMglBTEwJc3lzc2l6ZQkJRE8gTk9UIFVTRSAtIGZvciBib290c2VjdC5TIHVzZSBvbmx5Ci0wMUY2LzIJQUxMCXN3YXBfZGV2CURPIE5PVCBVU0UgLSBvYnNvbGV0ZQorMDFGNC80CTIuMDQrKDIJc3lzc2l6ZQkJVGhlIHNpemUgb2YgdGhlIDMyLWJpdCBjb2RlIGluIDE2LWJ5dGUgcGFyYXMKIDAxRjgvMglBTEwJcmFtX3NpemUJRE8gTk9UIFVTRSAtIGZvciBib290c2VjdC5TIHVzZSBvbmx5CiAwMUZBLzIJQUxMCXZpZF9tb2RlCVZpZGVvIG1vZGUgY29udHJvbAogMDFGQy8yCUFMTAlyb290X2RldglEZWZhdWx0IHJvb3QgZGV2aWNlIG51bWJlcgpAQCAtMTI5LDggKzEzMCwxMiBAQAogMDIyOC80CTIuMDIrCWNtZF9saW5lX3B0cgkzMi1iaXQgcG9pbnRlciB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZQogMDIyQy80CTIuMDMrCWluaXRyZF9hZGRyX21heAlIaWdoZXN0IGxlZ2FsIGluaXRyZCBhZGRyZXNzCiAKLUZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaWYgdGhlIHNldHVwX3NlY3RzIGZpZWxkIGNvbnRhaW5zIDAsIHRoZQotcmVhbCB2YWx1ZSBpcyA0LgorKDEpIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaWYgdGhlIHNldHVwX3NlY3RzIGZpZWxkIGNvbnRhaW5zIDAsIHRoZQorICAgIHJlYWwgdmFsdWUgaXMgNC4KKworKDIpIEZvciBib290IHByb3RvY29sIHByaW9yIHRvIDIuMDQsIHRoZSB1cHBlciB0d28gYnl0ZXMgb2YgdGhlIHN5c3NpemUKKyAgICBmaWVsZCBhcmUgdW51c2FibGUsIHdoaWNoIG1lYW5zIHRoZSBzaXplIG9mIGEgYnpJbWFnZSBrZXJuZWwKKyAgICBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KIAogSWYgdGhlICJIZHJTIiAoMHg1MzcyNjQ0OCkgbWFnaWMgbnVtYmVyIGlzIG5vdCBmb3VuZCBhdCBvZmZzZXQgMHgyMDIsCiB0aGUgYm9vdCBwcm90b2NvbCB2ZXJzaW9uIGlzICJvbGQiLiAgTG9hZGluZyBhbiBvbGQga2VybmVsLCB0aGUKQEAgLTIzMCwxMiArMjM1LDE2IEBACiByZWxldmFudCB0byB0aGUgYm9vdCBsb2FkZXIgaXRzZWxmLCBzZWUgInNwZWNpYWwgY29tbWFuZCBsaW5lIG9wdGlvbnMiCiBiZWxvdy4KIAotVGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgaXMgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHVwIHRvIDI1NQotY2hhcmFjdGVycyBsb25nLCBwbHVzIHRoZSBmaW5hbCBudWxsLgorVGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgaXMgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGN1cnJlbnRseSB1cCB0bworMjU1IGNoYXJhY3RlcnMgbG9uZywgcGx1cyB0aGUgZmluYWwgbnVsbC4gIEEgc3RyaW5nIHRoYXQgaXMgdG9vIGxvbmcKK3dpbGwgYmUgYXV0b21hdGljYWxseSB0cnVuY2F0ZWQgYnkgdGhlIGtlcm5lbCwgYSBib290IGxvYWRlciBtYXkgYWxsb3cKK2EgbG9uZ2VyIGNvbW1hbmQgbGluZSB0byBiZSBwYXNzZWQgdG8gcGVybWl0IGZ1dHVyZSBrZXJuZWxzIHRvIGV4dGVuZAordGhpcyBsaW1pdC4KIAogSWYgdGhlIGJvb3QgcHJvdG9jb2wgdmVyc2lvbiBpcyAyLjAyIG9yIGxhdGVyLCB0aGUgYWRkcmVzcyBvZiB0aGUKIGtlcm5lbCBjb21tYW5kIGxpbmUgaXMgZ2l2ZW4gYnkgdGhlIGhlYWRlciBmaWVsZCBjbWRfbGluZV9wdHIgKHNlZQotYWJvdmUuKQorYWJvdmUuKSAgVGhpcyBhZGRyZXNzIGNhbiBiZSBhbnl3aGVyZSBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIHNldHVwCitoZWFwIGFuZCAweEEwMDAwLgogCiBJZiB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpcyAqbm90KiAyLjAyIG9yIGhpZ2hlciwgdGhlIGtlcm5lbAogY29tbWFuZCBsaW5lIGlzIGVudGVyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBwcm90b2NvbDoKQEAgLTI1NSw3ICsyNjQsNyBAQAogKioqKiBTQU1QTEUgQk9PVCBDT05GSUdVUkFUSU9OCiAKIEFzIGEgc2FtcGxlIGNvbmZpZ3VyYXRpb24sIGFzc3VtZSB0aGUgZm9sbG93aW5nIGxheW91dCBvZiB0aGUgcmVhbAotbW9kZSBzZWdtZW50OgorbW9kZSBzZWdtZW50ICh0aGlzIGlzIGEgdHlwaWNhbCwgYW5kIHJlY29tbWVuZGVkIGxheW91dCk6CiAKIAkweDAwMDAtMHg3RkZGCVJlYWwgbW9kZSBrZXJuZWwKIAkweDgwMDAtMHg4RkZGCVN0YWNrIGFuZCBoZWFwCkBAIC0zMTIsOSArMzIxLDkgQEAKIAogKioqKiBMT0FESU5HIFRIRSBSRVNUIE9GIFRIRSBLRVJORUwKIAotVGhlIG5vbi1yZWFsLW1vZGUga2VybmVsIHN0YXJ0cyBhdCBvZmZzZXQgKHNldHVwX3NlY3RzKzEpKjUxMiBpbiB0aGUKLWtlcm5lbCBmaWxlIChhZ2FpbiwgaWYgc2V0dXBfc2VjdHMgPT0gMCB0aGUgcmVhbCB2YWx1ZSBpcyA0LikgIEl0Ci1zaG91bGQgYmUgbG9hZGVkIGF0IGFkZHJlc3MgMHgxMDAwMCBmb3IgSW1hZ2UvekltYWdlIGtlcm5lbHMgYW5kCitUaGUgMzItYml0IChub24tcmVhbC1tb2RlKSBrZXJuZWwgc3RhcnRzIGF0IG9mZnNldCAoc2V0dXBfc2VjdHMrMSkqNTEyCitpbiB0aGUga2VybmVsIGZpbGUgKGFnYWluLCBpZiBzZXR1cF9zZWN0cyA9PSAwIHRoZSByZWFsIHZhbHVlIGlzIDQuKQorSXQgc2hvdWxkIGJlIGxvYWRlZCBhdCBhZGRyZXNzIDB4MTAwMDAgZm9yIEltYWdlL3pJbWFnZSBrZXJuZWxzIGFuZAogMHgxMDAwMDAgZm9yIGJ6SW1hZ2Uga2VybmVscy4KIAogVGhlIGtlcm5lbCBpcyBhIGJ6SW1hZ2Uga2VybmVsIGlmIHRoZSBwcm90b2NvbCA+PSAyLjAwIGFuZCB0aGUgMHgwMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pYm0tYWNwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2libS1hY3BpLnR4dAppbmRleCBjNDM3YjFhLi44YjNmZDgyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2libS1hY3BpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2libS1hY3BpLnR4dApAQCAtMSwxNiArMSwxNiBAQAogCQkgICAgSUJNIFRoaW5rUGFkIEFDUEkgRXh0cmFzIERyaXZlcgogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAwLjgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOCBOb3ZlbWJlciAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAwLjEyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxNyBBdWd1c3QgMjAwNQogCiAgICAgICAgICAgICAgICBCb3Jpc2xhdiBEZWlhbm92IDxib3Jpc2xhdkB1c2Vycy5zZi5uZXQ+CiAJCSAgICAgIGh0dHA6Ly9pYm0tYWNwaS5zZi5uZXQvCiAKIAotVGhpcyBpcyBhIExpbnV4IEFDUEkgZHJpdmVyIGZvciB0aGUgSUJNIFRoaW5rUGFkIGxhcHRvcHMuIEl0IGFpbXMgdG8KLXN1cHBvcnQgdmFyaW91cyBmZWF0dXJlcyBvZiB0aGVzZSBsYXB0b3BzIHdoaWNoIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2gKLXRoZSBBQ1BJIGZyYW1ld29yayBidXQgbm90IG90aGVyd2lzZSBzdXBwb3J0ZWQgYnkgdGhlIGdlbmVyaWMgTGludXgKLUFDUEkgZHJpdmVycy4KK1RoaXMgaXMgYSBMaW51eCBBQ1BJIGRyaXZlciBmb3IgdGhlIElCTSBUaGlua1BhZCBsYXB0b3BzLiBJdCBzdXBwb3J0cwordmFyaW91cyBmZWF0dXJlcyBvZiB0aGVzZSBsYXB0b3BzIHdoaWNoIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlCitBQ1BJIGZyYW1ld29yayBidXQgbm90IG90aGVyd2lzZSBzdXBwb3J0ZWQgYnkgdGhlIGdlbmVyaWMgTGludXggQUNQSQorZHJpdmVycy4KIAogCiBTdGF0dXMKQEAgLTI1LDkgKzI1LDE0IEBACiAJLSBUaGlua0xpZ2h0IG9uIGFuZCBvZmYKIAktIGxpbWl0ZWQgZG9ja2luZyBhbmQgdW5kb2NraW5nCiAJLSBVbHRyYUJheSBlamVjdAotCS0gRXhwZXJpbWVudGFsOiBDTU9TIGNvbnRyb2wKLQktIEV4cGVyaW1lbnRhbDogTEVEIGNvbnRyb2wKLQktIEV4cGVyaW1lbnRhbDogQUNQSSBzb3VuZHMKKwktIENNT1MgY29udHJvbAorCS0gTEVEIGNvbnRyb2wKKwktIEFDUEkgc291bmRzCisJLSB0ZW1wZXJhdHVyZSBzZW5zb3JzCisJLSBFeHBlcmltZW50YWw6IGVtYmVkZGVkIGNvbnRyb2xsZXIgcmVnaXN0ZXIgZHVtcAorCS0gRXhwZXJpbWVudGFsOiBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sCisJLSBFeHBlcmltZW50YWw6IHZvbHVtZSBjb250cm9sCisJLSBFeHBlcmltZW50YWw6IGZhbiBzcGVlZCwgZmFuIGVuYWJsZS9kaXNhYmxlCiAKIEEgY29tcGF0aWJpbGl0eSB0YWJsZSBieSBtb2RlbCBhbmQgZmVhdHVyZSBpcyBtYWludGFpbmVkIG9uIHRoZSB3ZWIKIHNpdGUsIGh0dHA6Ly9pYm0tYWNwaS5zZi5uZXQvLiBJIGFwcHJlY2lhdGUgYW55IHN1Y2Nlc3Mgb3IgZmFpbHVyZQpAQCAtOTEsMTIgKzk2LDEyIEBACiBjb21tYW5kcyBzdXBwb3J0ZWQgYnkgdGhlIHZhcmlvdXMgZmVhdHVyZXMgaXMgZ3VhcmFudGVlZCB0byBjaGFuZ2UKIGZyZXF1ZW50bHkuCiAKLURyaXZlciBWZXJzaW9uIC0tIC9wcm9jL2FjcGkvaWJtL2RyaXZlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RyaXZlciB2ZXJzaW9uIC0tIC9wcm9jL2FjcGkvaWJtL2RyaXZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoZSBkcml2ZXIgbmFtZSBhbmQgdmVyc2lvbi4gTm8gY29tbWFuZHMgY2FuIGJlIHdyaXR0ZW4gdG8gdGhpcyBmaWxlLgogCi1Ib3QgS2V5cyAtLSAvcHJvYy9hY3BpL2libS9ob3RrZXkKK0hvdCBrZXlzIC0tIC9wcm9jL2FjcGkvaWJtL2hvdGtleQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFdpdGhvdXQgdGhpcyBkcml2ZXIsIG9ubHkgdGhlIEZuLUY0IGtleSAoc2xlZXAgYnV0dG9uKSBnZW5lcmF0ZXMgYW4KQEAgLTE4OCw3ICsxOTMsNyBAQAogdGhlIGZsaWNrZXJpbmcgb3IgdmlkZW8gY29ycnVwdGlvbiBjYW4gYmUgYXZvaWRlZC4KIAogVGhlIHZpZGVvX3N3aXRjaCBjb21tYW5kIGN5Y2xlcyB0aHJvdWdoIHRoZSBhdmFpbGFibGUgdmlkZW8gb3V0cHV0cwotKGl0IHN1bXVsYXRlcyB0aGUgYmVoYXZpb3Igb2YgRm4tRjcpLgorKGl0IHNpbXVsYXRlcyB0aGUgYmVoYXZpb3Igb2YgRm4tRjcpLgogCiBWaWRlbyBleHBhbnNpb24gY2FuIGJlIHRvZ2dsZWQgdGhyb3VnaCB0aGlzIGZlYXR1cmUuIFRoaXMgY29udHJvbHMKIHdoZXRoZXIgdGhlIGRpc3BsYXkgaXMgZXhwYW5kZWQgdG8gZmlsbCB0aGUgZW50aXJlIExDRCBzY3JlZW4gd2hlbiBhCkBAIC0yMDEsNiArMjA2LDEyIEBACiBmZWF0dXJlcyBvZiB0aGlzIGRyaXZlciwgYXMgaXQgdXNlcyB0aGUgc2FtZSBBQ1BJIG1ldGhvZHMgYXMKIEZuLUY3LiBWaWRlbyBzd2l0Y2hpbmcgb24gdGhlIGNvbnNvbGUgc2hvdWxkIHN0aWxsIHdvcmsuCiAKK1VQREFURTogVGhlcmUncyBub3cgYSBwYXRjaCBmb3IgdGhlIFgub3JnIFJhZGVvbiBkcml2ZXIgd2hpY2gKK2FkZHJlc3NlcyB0aGlzIGlzc3VlLiBTb21lIHBlb3BsZSBhcmUgcmVwb3J0aW5nIHN1Y2Nlc3Mgd2l0aCB0aGUgcGF0Y2gKK3doaWxlIG90aGVycyBhcmUgc3RpbGwgaGF2aW5nIHByb2JsZW1zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbjoKKworaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAwMAorCiBUaGlua0xpZ2h0IGNvbnRyb2wgLS0gL3Byb2MvYWNwaS9pYm0vbGlnaHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yMTEsNyArMjIyLDcgQEAKIAllY2hvIG9uICA+IC9wcm9jL2FjcGkvaWJtL2xpZ2h0CiAJZWNobyBvZmYgPiAvcHJvYy9hY3BpL2libS9saWdodAogCi1Eb2NraW5nIC8gVW5kb2NraW5nIC0tIC9wcm9jL2FjcGkvaWJtL2RvY2sKK0RvY2tpbmcgLyB1bmRvY2tpbmcgLS0gL3Byb2MvYWNwaS9pYm0vZG9jawogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIERvY2tpbmcgYW5kIHVuZG9ja2luZyAoZS5nLiB3aXRoIHRoZSBYNCBVbHRyYUJhc2UpIHJlcXVpcmVzIHNvbWUKQEAgLTIyOCwxMSArMjM5LDE1IEBACiB3aGVuIG9yaWdpbmFsbHkgYm9vdGVkLiBUaGlzIGlzIGR1ZSB0byB0aGUgY3VycmVudCBsYWNrIG9mIHN1cHBvcnQgZm9yCiBob3QgcGx1Z2dpbmcgb2YgZGV2aWNlcyBpbiB0aGUgTGludXggQUNQSSBmcmFtZXdvcmsuIElmIHRoZSBsYXB0b3Agd2FzCiBib290ZWQgd2hpbGUgbm90IGluIHRoZSBkb2NrLCB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgaXMgc2hvd24gaW4gdGhlCi1sb2dzOiAiaWJtX2FjcGk6IGRvY2sgZGV2aWNlIG5vdCBwcmVzZW50Ii4gTm8gZG9jay1yZWxhdGVkIGV2ZW50cyBhcmUKLWdlbmVyYXRlZCBidXQgdGhlIGRvY2sgYW5kIHVuZG9jayBjb21tYW5kcyBkZXNjcmliZWQgYmVsb3cgc3RpbGwKLXdvcmsuIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIG1hbnVhbGx5IG9yIHRyaWdnZXJlZCBieSBGbiBrZXkKLWNvbWJpbmF0aW9ucyAoc2VlIHRoZSBleGFtcGxlIGFjcGlkIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW5jbHVkZWQgaW4KLXRoZSBkcml2ZXIgdGFyYmFsbCBwYWNrYWdlIGF2YWlsYWJsZSBvbiB0aGUgd2ViIHNpdGUpLgorbG9nczoKKworCU1hciAxNyAwMTo0MjozNCBhZXJvIGtlcm5lbDogaWJtX2FjcGk6IGRvY2sgZGV2aWNlIG5vdCBwcmVzZW50CisKK0luIHRoaXMgY2FzZSwgbm8gZG9jay1yZWxhdGVkIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ1dCB0aGUgZG9jayBhbmQKK3VuZG9jayBjb21tYW5kcyBkZXNjcmliZWQgYmVsb3cgc3RpbGwgd29yay4gVGhleSBjYW4gYmUgZXhlY3V0ZWQKK21hbnVhbGx5IG9yIHRyaWdnZXJlZCBieSBGbiBrZXkgY29tYmluYXRpb25zIChzZWUgdGhlIGV4YW1wbGUgYWNwaWQKK2NvbmZpZ3VyYXRpb24gZmlsZXMgaW5jbHVkZWQgaW4gdGhlIGRyaXZlciB0YXJiYWxsIHBhY2thZ2UgYXZhaWxhYmxlCitvbiB0aGUgd2ViIHNpdGUpLgogCiBXaGVuIHRoZSBlamVjdCByZXF1ZXN0IGJ1dHRvbiBvbiB0aGUgZG9jayBpcyBwcmVzc2VkLCB0aGUgZmlyc3QgZXZlbnQKIGFib3ZlIGlzIGdlbmVyYXRlZC4gVGhlIGhhbmRsZXIgZm9yIHRoaXMgZXZlbnQgc2hvdWxkIGlzc3VlIHRoZQpAQCAtMjY3LDcgKzI4Miw3IEBACiBVbHRyYUJhc2UgZG9ja3MgYW5kICJkdW1iIiBwb3J0IHJlcGxpY2F0b3JzIGxpa2UgdGhlIE1pbmkgRG9jayAodGhlCiBsYXR0ZXIgZG9uJ3QgbmVlZCBhbnkgQUNQSSBzdXBwb3J0LCBhY3R1YWxseSkuCiAKLVVsdHJhQmF5IEVqZWN0IC0tIC9wcm9jL2FjcGkvaWJtL2JheQorVWx0cmFCYXkgZWplY3QgLS0gL3Byb2MvYWNwaS9pYm0vYmF5CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSW5zZXJ0aW5nIG9yIGVqZWN0aW5nIGFuIFVsdHJhQmF5IGRldmljZSByZXF1aXJlcyBzb21lIGFjdGlvbnMgdG8gYmUKQEAgLTI4NCw4ICsyOTksMTEgQEAKIGlzIGluIHRoZSBkb2NrLCBzbyBpdCBtYXkgbm90IGJlIHByZXNlbnQgaWYgdGhlIGxhcHRvcCB3YXMgdW5kb2NrZWQpLgogVGhpcyBpcyBkdWUgdG8gdGhlIGN1cnJlbnQgbGFjayBvZiBzdXBwb3J0IGZvciBob3QgcGx1Z2dpbmcgb2YgZGV2aWNlcwogaW4gdGhlIExpbnV4IEFDUEkgZnJhbWV3b3JrLiBJZiB0aGUgbGFwdG9wIHdhcyBib290ZWQgd2l0aG91dCB0aGUKLVVsdHJhQmF5LCB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgaXMgc2hvd24gaW4gdGhlIGxvZ3M6ICJpYm1fYWNwaTogYmF5Ci1kZXZpY2Ugbm90IHByZXNlbnQiLiBObyBiYXktcmVsYXRlZCBldmVudHMgYXJlIGdlbmVyYXRlZCBidXQgdGhlIGVqZWN0CitVbHRyYUJheSwgdGhlIGZvbGxvd2luZyBtZXNzYWdlIGlzIHNob3duIGluIHRoZSBsb2dzOgorCisJTWFyIDE3IDAxOjQyOjM0IGFlcm8ga2VybmVsOiBpYm1fYWNwaTogYmF5IGRldmljZSBub3QgcHJlc2VudAorCitJbiB0aGlzIGNhc2UsIG5vIGJheS1yZWxhdGVkIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ1dCB0aGUgZWplY3QKIGNvbW1hbmQgZGVzY3JpYmVkIGJlbG93IHN0aWxsIHdvcmtzLiBJdCBjYW4gYmUgZXhlY3V0ZWQgbWFudWFsbHkgb3IKIHRyaWdnZXJlZCBieSBhIGhvdCBrZXkgY29tYmluYXRpb24uCiAKQEAgLTMwNiwyMiArMzI0LDMzIEBACiBUaGUgY29udGVudHMgb2YgdGhlIC9wcm9jL2FjcGkvaWJtL2JheSBmaWxlIHNob3dzIHRoZSBjdXJyZW50IHN0YXR1cwogb2YgdGhlIFVsdHJhQmF5LCBhcyBwcm92aWRlZCBieSB0aGUgQUNQSSBmcmFtZXdvcmsuCiAKLUV4cGVyaW1lbnRhbCBGZWF0dXJlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFWFBFUklNRU5UQUwgd2FybSBlamVjdCBzdXBwb3J0IG9uIHRoZSA2MDBlL3gsIEEyMnAgYW5kIEEzeCAoVG8gdXNlCit0aGlzIGZlYXR1cmUsIHlvdSBuZWVkIHRvIHN1cHBseSB0aGUgZXhwZXJpbWVudGFsPTEgcGFyYW1ldGVyIHdoZW4KK2xvYWRpbmcgdGhlIG1vZHVsZSk6CiAKLVRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIG1hcmtlZCBleHBlcmltZW50YWwgYmVjYXVzZSB1c2luZyB0aGVtCi1pbnZvbHZlcyBndWVzc2luZyB0aGUgY29ycmVjdCB2YWx1ZXMgb2Ygc29tZSBwYXJhbWV0ZXJzLiBHdWVzc2luZwotaW5jb3JyZWN0bHkgbWF5IGhhdmUgdW5kZXNpcmFibGUgZWZmZWN0cyBsaWtlIGNyYXNoaW5nIHlvdXIKLVRoaW5rUGFkLiBVU0UgVEhFU0UgV0lUSCBDQVVUSU9OISBUbyBhY3RpdmF0ZSB0aGVtLCB5b3UnbGwgbmVlZCB0bwotc3VwcGx5IHRoZSBleHBlcmltZW50YWw9MSBwYXJhbWV0ZXIgd2hlbiBsb2FkaW5nIHRoZSBtb2R1bGUuCitUaGVzZSBtb2RlbHMgZG8gbm90IGhhdmUgYSBidXR0b24gbmVhciB0aGUgVWx0cmFCYXkgZGV2aWNlIHRvIHJlcXVlc3QKK2EgaG90IGVqZWN0IGJ1dCByYXRoZXIgcmVxdWlyZSB0aGUgbGFwdG9wIHRvIGJlIHB1dCB0byBzbGVlcAorKHN1c3BlbmQtdG8tcmFtKSBiZWZvcmUgdGhlIGJheSBkZXZpY2UgaXMgZWplY3RlZCBvciBpbnNlcnRlZCkuCitUaGUgc2VxdWVuY2Ugb2Ygc3RlcHMgdG8gZWplY3QgdGhlIGRldmljZSBpcyBhcyBmb2xsb3dzOgogCi1FeHBlcmltZW50YWw6IENNT1MgY29udHJvbCAtIC9wcm9jL2FjcGkvaWJtL2Ntb3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWVjaG8gZWplY3QgPiAvcHJvYy9hY3BpL2libS9iYXkKKwlwdXQgdGhlIFRoaW5rUGFkIHRvIHNsZWVwCisJcmVtb3ZlIHRoZSBkcml2ZQorCXJlc3VtZSBmcm9tIHNsZWVwCisJY2F0IC9wcm9jL2FjcGkvaWJtL2JheSBzaG91bGQgc2hvdyB0aGF0IHRoZSBkcml2ZSB3YXMgcmVtb3ZlZAorCitPbiB0aGUgQTN4LCBib3RoIHRoZSBVbHRyYUJheSAyMDAwIGFuZCBVbHRyYUJheSBQbHVzIGRldmljZXMgYXJlCitzdXBwb3J0ZWQuIFVzZSAiZWplY3QyIiBpbnN0ZWFkIG9mICJlamVjdCIgZm9yIHRoZSBzZWNvbmQgYmF5LgorCitOb3RlOiB0aGUgVWx0cmFCYXkgZWplY3Qgc3VwcG9ydCBvbiB0aGUgNjAwZS94LCBBMjJwIGFuZCBBM3ggaXMKK0VYUEVSSU1FTlRBTCBhbmQgbWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkLiBVU0UgV0lUSCBDQVVUSU9OIQorCitDTU9TIGNvbnRyb2wgLS0gL3Byb2MvYWNwaS9pYm0vY21vcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhpcyBmZWF0dXJlIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgQUNQSSBmaXJtd2FyZSB0byBjb250cm9sIHRoZQotVGhpbmtMaWdodCBvbiBtb3N0IG5ld2VyIFRoaW5rUGFkIG1vZGVscy4gSXQgYXBwZWFycyB0aGF0IGl0IGNhbiBhbHNvCi1jb250cm9sIExDRCBicmlnaHRuZXNzLCBzb3VuZHMgdm9sdW1lIGFuZCBtb3JlLCBidXQgb25seSBvbiBzb21lCi1tb2RlbHMuCitUaGlua0xpZ2h0IG9uIG1vc3QgbmV3ZXIgVGhpbmtQYWQgbW9kZWxzLiBJdCBtYXkgYWxzbyBjb250cm9sIExDRAorYnJpZ2h0bmVzcywgc291bmRzIHZvbHVtZSBhbmQgbW9yZSwgYnV0IG9ubHkgb24gc29tZSBtb2RlbHMuCiAKIFRoZSBjb21tYW5kcyBhcmUgbm9uLW5lZ2F0aXZlIGludGVnZXIgbnVtYmVyczoKIApAQCAtMzMwLDEwICszNTksOSBAQAogCWVjaG8gMiA+L3Byb2MvYWNwaS9pYm0vY21vcwogCS4uLgogCi1UaGUgcmFuZ2Ugb2YgbnVtYmVycyB3aGljaCBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHZhcmlvdXMgbW9kZWxzIGlzIDAKLXRvIDIxLCBidXQgaXQncyBwb3NzaWJsZSB0aGF0IG51bWJlcnMgb3V0c2lkZSB0aGlzIHJhbmdlIGhhdmUKLWludGVyZXN0aW5nIGJlaGF2aW9yLiBIZXJlIGlzIHRoZSBiZWhhdmlvciBvbiB0aGUgWDQwICh0cGIgaXMgdGhlCi1UaGlua1BhZCBCdXR0b25zIHV0aWxpdHkpOgorVGhlIHJhbmdlIG9mIHZhbGlkIG51bWJlcnMgaXMgMCB0byAyMSwgYnV0IG5vdCBhbGwgaGF2ZSBhbiBlZmZlY3QgYW5kCit0aGUgYmVoYXZpb3IgdmFyaWVzIGZyb20gbW9kZWwgdG8gbW9kZWwuIEhlcmUgaXMgdGhlIGJlaGF2aW9yIG9uIHRoZQorWDQwICh0cGIgaXMgdGhlIFRoaW5rUGFkIEJ1dHRvbnMgdXRpbGl0eSk6CiAKIAkwIC0gbm8gZWZmZWN0IGJ1dCB0cGIgcmVwb3J0cyAiVm9sdW1lIGRvd24iCiAJMSAtIG5vIGVmZmVjdCBidXQgdHBiIHJlcG9ydHMgIlZvbHVtZSB1cCIKQEAgLTM0NiwyNiArMzc0LDE4IEBACiAJMTMgLSBUaGlua0xpZ2h0IG9mZgogCTE0IC0gbm8gZWZmZWN0IGJ1dCB0cGIgcmVwb3J0cyBUaGlua0xpZ2h0IHN0YXR1cyBjaGFuZ2UKIAotSWYgeW91IHRyeSB0aGlzIGZlYXR1cmUsIHBsZWFzZSBzZW5kIG1lIGEgcmVwb3J0IHNpbWlsYXIgdG8gdGhlCi1hYm92ZS4gT24gbW9kZWxzIHdoaWNoIGFsbG93IGNvbnRyb2wgb2YgTENEIGJyaWdodG5lc3Mgb3Igc291bmQKLXZvbHVtZSwgSSdkIGxpa2UgdG8gcHJvdmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYW4gdXNlci1mcmllbmRseQotd2F5LCBidXQgZmlyc3QgSSBuZWVkIGEgd2F5IHRvIGlkZW50aWZ5IHRoZSBtb2RlbHMgd2hpY2ggdGhpcyBpcwotcG9zc2libGUuCi0KLUV4cGVyaW1lbnRhbDogTEVEIGNvbnRyb2wgLSAvcHJvYy9hY3BpL2libS9MRUQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xFRCBjb250cm9sIC0tIC9wcm9jL2FjcGkvaWJtL2xlZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFNvbWUgb2YgdGhlIExFRCBpbmRpY2F0b3JzIGNhbiBiZSBjb250cm9sbGVkIHRocm91Z2ggdGhpcyBmZWF0dXJlLiBUaGUKIGF2YWlsYWJsZSBjb21tYW5kcyBhcmU6CiAKLQllY2hvIDxsZWQgbnVtYmVyPiBvbiA+L3Byb2MvYWNwaS9pYm0vbGVkCi0JZWNobyA8bGVkIG51bWJlcj4gb2ZmID4vcHJvYy9hY3BpL2libS9sZWQKLQllY2hvIDxsZWQgbnVtYmVyPiBibGluayA+L3Byb2MvYWNwaS9pYm0vbGVkCisJZWNobyAnPGxlZCBudW1iZXI+IG9uJyA+L3Byb2MvYWNwaS9pYm0vbGVkCisJZWNobyAnPGxlZCBudW1iZXI+IG9mZicgPi9wcm9jL2FjcGkvaWJtL2xlZAorCWVjaG8gJzxsZWQgbnVtYmVyPiBibGluaycgPi9wcm9jL2FjcGkvaWJtL2xlZAogCi1UaGUgPGxlZCBudW1iZXI+IHBhcmFtZXRlciBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLiBUaGUgcmFuZ2Ugb2YgTEVECi1udW1iZXJzIHVzZWQgaW50ZXJuYWxseSBieSB2YXJpb3VzIG1vZGVscyBpcyAwIHRvIDcgYnV0IGl0J3MgcG9zc2libGUKLXRoYXQgbnVtYmVycyBvdXRzaWRlIHRoaXMgcmFuZ2UgYXJlIGFsc28gdmFsaWQuIEhlcmUgaXMgdGhlIG1hcHBpbmcgb24KLXRoZSBYNDA6CitUaGUgPGxlZCBudW1iZXI+IHJhbmdlIGlzIDAgdG8gNy4gVGhlIHNldCBvZiBMRURzIHRoYXQgY2FuIGJlCitjb250cm9sbGVkIHZhcmllcyBmcm9tIG1vZGVsIHRvIG1vZGVsLiBIZXJlIGlzIHRoZSBtYXBwaW5nIG9uIHRoZSBYNDA6CiAKIAkwIC0gcG93ZXIKIAkxIC0gYmF0dGVyeSAob3JhbmdlKQpAQCAtMzc2LDQ5ICszOTYsMjI0IEBACiAKIEFsbCBvZiB0aGUgYWJvdmUgY2FuIGJlIHR1cm5lZCBvbiBhbmQgb2ZmIGFuZCBjYW4gYmUgbWFkZSB0byBibGluay4KIAotSWYgeW91IHRyeSB0aGlzIGZlYXR1cmUsIHBsZWFzZSBzZW5kIG1lIGEgcmVwb3J0IHNpbWlsYXIgdG8gdGhlCi1hYm92ZS4gSSdkIGxpa2UgdG8gcHJvdmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYW4gdXNlci1mcmllbmRseSB3YXksCi1idXQgZmlyc3QgSSBuZWVkIHRvIGlkZW50aWZ5IHRoZSB3aGljaCBudW1iZXJzIGNvcnJlc3BvbmQgdG8gd2hpY2gKLUxFRHMgb24gdmFyaW91cyBtb2RlbHMuCi0KLUV4cGVyaW1lbnRhbDogQUNQSSBzb3VuZHMgLSAvcHJvYy9hY3BpL2libS9iZWVwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNQSSBzb3VuZHMgLS0gL3Byb2MvYWNwaS9pYm0vYmVlcAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGUgQkVFUCBtZXRob2QgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBBQ1BJIGZpcm13YXJlIHRvIHByb3ZpZGUKLWF1ZGlibGUgYWxlcnRzIGluIHZhcmlvdXMgc2l0dXRhdGlvbi4gVGhpcyBmZWF0dXJlIGFsbG93cyB0aGUgc2FtZQorYXVkaWJsZSBhbGVydHMgaW4gdmFyaW91cyBzaXR1YXRpb25zLiBUaGlzIGZlYXR1cmUgYWxsb3dzIHRoZSBzYW1lCiBzb3VuZHMgdG8gYmUgdHJpZ2dlcmVkIG1hbnVhbGx5LgogCiBUaGUgY29tbWFuZHMgYXJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG51bWJlcnM6CiAKLQllY2hvIDAgPi9wcm9jL2FjcGkvaWJtL2JlZXAKLQllY2hvIDEgPi9wcm9jL2FjcGkvaWJtL2JlZXAKLQllY2hvIDIgPi9wcm9jL2FjcGkvaWJtL2JlZXAKLQkuLi4KKwllY2hvIDxudW1iZXI+ID4vcHJvYy9hY3BpL2libS9iZWVwCiAKLVRoZSByYW5nZSBvZiBudW1iZXJzIHdoaWNoIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdmFyaW91cyBtb2RlbHMgaXMgMAotdG8gMTcsIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgbnVtYmVycyBvdXRzaWRlIHRoaXMgcmFuZ2UgYXJlIGFsc28KLXZhbGlkLiBIZXJlIGlzIHRoZSBiZWhhdmlvciBvbiB0aGUgWDQwOgorVGhlIHZhbGlkIDxudW1iZXI+IHJhbmdlIGlzIDAgdG8gMTcuIE5vdCBhbGwgbnVtYmVycyB0cmlnZ2VyIHNvdW5kcworYW5kIHRoZSBzb3VuZHMgdmFyeSBmcm9tIG1vZGVsIHRvIG1vZGVsLiBIZXJlIGlzIHRoZSBiZWhhdmlvciBvbiB0aGUKK1g0MDoKIAotCTIgLSB0d28gYmVlcHMsIHBhdXNlLCB0aGlyZCBiZWVwCisJMCAtIHN0b3AgYSBzb3VuZCBpbiBwcm9ncmVzcyAoYnV0IHVzZSAxNyB0byBzdG9wIDE2KQorCTIgLSB0d28gYmVlcHMsIHBhdXNlLCB0aGlyZCBiZWVwICgibG93IGJhdHRlcnkiKQogCTMgLSBzaW5nbGUgYmVlcAotCTQgLSAidW5hYmxlIgkKKwk0IC0gaGlnaCwgZm9sbG93ZWQgYnkgbG93LXBpdGNoZWQgYmVlcCAoInVuYWJsZSIpCiAJNSAtIHNpbmdsZSBiZWVwCi0JNiAtICJBQy9EQyIKKwk2IC0gdmVyeSBoaWdoLCBmb2xsb3dlZCBieSBoaWdoLXBpdGNoZWQgYmVlcCAoIkFDL0RDIikKIAk3IC0gaGlnaC1waXRjaGVkIGJlZXAKIAk5IC0gdGhyZWUgc2hvcnQgYmVlcHMKIAkxMCAtIHZlcnkgbG9uZyBiZWVwCiAJMTIgLSBsb3ctcGl0Y2hlZCBiZWVwCisJMTUgLSB0aHJlZSBoaWdoLXBpdGNoZWQgYmVlcHMgcmVwZWF0aW5nIGNvbnN0YW50bHksIHN0b3Agd2l0aCAwCisJMTYgLSBvbmUgbWVkaXVtLXBpdGNoZWQgYmVlcCByZXBlYXRpbmcgY29uc3RhbnRseSwgc3RvcCB3aXRoIDE3CisJMTcgLSBzdG9wIDE2CiAKLShJJ3ZlIG9ubHkgYmVlbiBhYmxlIHRvIGlkZW50aWZ5IGEgY291cGxlIG9mIHRoZW0pLgorVGVtcGVyYXR1cmUgc2Vuc29ycyAtLSAvcHJvYy9hY3BpL2libS90aGVybWFsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotSWYgeW91IHRyeSB0aGlzIGZlYXR1cmUsIHBsZWFzZSBzZW5kIG1lIGEgcmVwb3J0IHNpbWlsYXIgdG8gdGhlCi1hYm92ZS4gSSdkIGxpa2UgdG8gcHJvdmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYW4gdXNlci1mcmllbmRseSB3YXksCi1idXQgZmlyc3QgSSBuZWVkIHRvIGlkZW50aWZ5IHRoZSB3aGljaCBudW1iZXJzIGNvcnJlc3BvbmQgdG8gd2hpY2gKLXNvdW5kcyBvbiB2YXJpb3VzIG1vZGVscy4KK01vc3QgVGhpbmtQYWRzIGluY2x1ZGUgc2l4IG9yIG1vcmUgc2VwYXJhdGUgdGVtcGVyYXR1cmUgc2Vuc29ycyBidXQKK29ubHkgZXhwb3NlIHRoZSBDUFUgdGVtcGVyYXR1cmUgdGhyb3VnaCB0aGUgc3RhbmRhcmQgQUNQSSBtZXRob2RzLgorVGhpcyBmZWF0dXJlIHNob3dzIHJlYWRpbmdzIGZyb20gdXAgdG8gZWlnaHQgZGlmZmVyZW50IHNlbnNvcnMuIFNvbWUKK3JlYWRpbmdzIG1heSBub3QgYmUgdmFsaWQsIGUuZy4gbWF5IHNob3cgbGFyZ2UgbmVnYXRpdmUgdmFsdWVzLiBGb3IKK2V4YW1wbGUsIG9uIHRoZSBYNDAsIGEgdHlwaWNhbCBvdXRwdXQgbWF5IGJlOgorCit0ZW1wZXJhdHVyZXM6ICAgNDIgNDIgNDUgNDEgMzYgLTEyOCAzMyAtMTI4CisKK1Rob21hcyBHcnViZXIgdG9vayBoaXMgUjUxIGFwYXJ0IGFuZCB0cmFjZWQgYWxsIHNpeCBhY3RpdmUgc2Vuc29ycyBpbgoraGlzIGxhcHRvcCAodGhlIGxvY2F0aW9uIG9mIHNlbnNvcnMgbWF5IHZhcnkgb24gb3RoZXIgbW9kZWxzKToKKworMTogIENQVQorMjogIE1pbmkgUENJIE1vZHVsZQorMzogIEhERAorNDogIEdQVQorNTogIEJhdHRlcnkKKzY6ICBOL0EKKzc6ICBCYXR0ZXJ5Cis4OiAgTi9BCisKK05vIGNvbW1hbmRzIGNhbiBiZSB3cml0dGVuIHRvIHRoaXMgZmlsZS4KKworRVhQRVJJTUVOVEFMOiBFbWJlZGRlZCBjb250cm9sbGVyIHJlaWdzdGVyIGR1bXAgLS0gL3Byb2MvYWNwaS9pYm0vZWNkdW1wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBmZWF0dXJlIGlzIG1hcmtlZCBFWFBFUklNRU5UQUwgYmVjYXVzZSB0aGUgaW1wbGVtZW50YXRpb24KK2RpcmVjdGx5IGFjY2Vzc2VzIGhhcmR3YXJlIHJlZ2lzdGVycyBhbmQgbWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkLiBVU0UKK1dJVEggQ0FVVElPTiEgVG8gdXNlIHRoaXMgZmVhdHVyZSwgeW91IG5lZWQgdG8gc3VwcGx5IHRoZQorZXhwZXJpbWVudGFsPTEgcGFyYW1ldGVyIHdoZW4gbG9hZGluZyB0aGUgbW9kdWxlLgorCitUaGlzIGZlYXR1cmUgZHVtcHMgdGhlIHZhbHVlcyBvZiAyNTYgZW1iZWRkZWQgY29udHJvbGxlcgorcmVnaXN0ZXJzLiBWYWx1ZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIHJlZ2lzdGVycword2VyZSBkdW1wZWQgYXJlIG1hcmtlZCB3aXRoIGEgc3RhcjoKKworW3Jvb3RAeDQwIGlibS1hY3BpXSMgY2F0IC9wcm9jL2FjcGkvaWJtL2VjZHVtcCAKK0VDICAgICAgICswMCArMDEgKzAyICswMyArMDQgKzA1ICswNiArMDcgKzA4ICswOSArMGEgKzBiICswYyArMGQgKzBlICswZgorRUMgMHgwMDogIGE3ICA0NyAgODcgIDAxICBmZSAgOTYgIDAwICAwOCAgMDEgIDAwICBjYiAgMDAgIDAwICAwMCAgNDAgIDAwCitFQyAweDEwOiAgMDAgIDAwICBmZiAgZmYgIGY0ICAzYyAgODcgIDA5ICAwMSAgZmYgIDQyICAwMSAgZmYgIGZmICAwZCAgMDAKK0VDIDB4MjA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAzICA0MyAgMDAgIDAwICA4MAorRUMgMHgzMDogIDAxICAwNyAgMWEgIDAwICAzMCAgMDQgIDAwICAwMCAqODUgIDAwICAwMCAgMTAgIDAwICA1MCAgMDAgIDAwCitFQyAweDQwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMTQgIDAxICAwMCAgMDQgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAKK0VDIDB4NTA6ICAwMCAgYzAgIDAyICAwZCAgMDAgIDAxICAwMSAgMDIgIDAyICAwMyAgMDMgIDAzICAwMyAqYmMgKjAyICpiYworRUMgMHg2MDogKjAyICpiYyAqMDIgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCitFQyAweDcwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAxMiAgMzAgIDQwICoyNCAqMjYgKjJjICoyNyAqMjAgIDgwICoxZiAgODAKK0VDIDB4ODA6ICAwMCAgMDAgIDAwICAwNiAqMzcgKjBlICAwMyAgMDAgIDAwICAwMCAgMGUgIDA3ICAwMCAgMDAgIDAwICAwMAorRUMgMHg5MDogIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCitFQyAweGEwOiAqZmYgIDA5ICBmZiAgMDkgIGZmICBmZiAqNjQgIDAwICowMCAqMDAgKmEyICA0MSAqZmYgKmZmICplMCAgMDAKK0VDIDB4YjA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAorRUMgMHhjMDogIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCitFQyAweGQwOiAgMDMgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAKK0VDIDB4ZTA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDExICAyMCAgNDkgIDA0ICAyNCAgMDYgIDU1ICAwMworRUMgMHhmMDogIDMxICA1NSAgNDggIDU0ICAzNSAgMzggIDU3ICA1NyAgMDggIDJmICA0NSAgNzMgIDA3ICA2NSAgNmMgIDFhCisKK1RoaXMgZmVhdHVyZSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJlZ2lzdGVyIGhvbGRpbmcgdGhlIGZhbgorc3BlZWQgb24gc29tZSBtb2RlbHMuIFRvIGRvIHRoYXQsIGRvIHRoZSBmb2xsb3dpbmc6CisKKwktIG1ha2Ugc3VyZSB0aGUgYmF0dGVyeSBpcyBmdWxseSBjaGFyZ2VkCisJLSBtYWtlIHN1cmUgdGhlIGZhbiBpcyBydW5uaW5nCisJLSBydW4gJ2NhdCAvcHJvYy9hY3BpL2libS9lY2R1bXAnIHNldmVyYWwgdGltZXMsIG9uY2UgcGVyIHNlY29uZCBvciBzbworCitUaGUgZmlyc3Qgc3RlcCBtYWtlcyBzdXJlIHZhcmlvdXMgY2hhcmdpbmctcmVsYXRlZCB2YWx1ZXMgZG9uJ3QKK3ZhcnkuIFRoZSBzZWNvbmQgZW5zdXJlcyB0aGF0IHRoZSBmYW4tcmVsYXRlZCB2YWx1ZXMgZG8gdmFyeSwgc2luY2UKK3RoZSBmYW4gc3BlZWQgZmx1Y3R1YXRlcyBhIGJpdC4gVGhlIHRoaXJkIHdpbGwgKGhvcGVmdWxseSkgbWFyayB0aGUKK2ZhbiByZWdpc3RlciB3aXRoIGEgc3RhcjoKKworW3Jvb3RAeDQwIGlibS1hY3BpXSMgY2F0IC9wcm9jL2FjcGkvaWJtL2VjZHVtcCAKK0VDICAgICAgICswMCArMDEgKzAyICswMyArMDQgKzA1ICswNiArMDcgKzA4ICswOSArMGEgKzBiICswYyArMGQgKzBlICswZgorRUMgMHgwMDogIGE3ICA0NyAgODcgIDAxICBmZSAgOTYgIDAwICAwOCAgMDEgIDAwICBjYiAgMDAgIDAwICAwMCAgNDAgIDAwCitFQyAweDEwOiAgMDAgIDAwICBmZiAgZmYgIGY0ICAzYyAgODcgIDA5ICAwMSAgZmYgIDQyICAwMSAgZmYgIGZmICAwZCAgMDAKK0VDIDB4MjA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAzICA0MyAgMDAgIDAwICA4MAorRUMgMHgzMDogIDAxICAwNyAgMWEgIDAwICAzMCAgMDQgIDAwICAwMCAgODUgIDAwICAwMCAgMTAgIDAwICA1MCAgMDAgIDAwCitFQyAweDQwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMTQgIDAxICAwMCAgMDQgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAKK0VDIDB4NTA6ICAwMCAgYzAgIDAyICAwZCAgMDAgIDAxICAwMSAgMDIgIDAyICAwMyAgMDMgIDAzICAwMyAgYmMgIDAyICBiYworRUMgMHg2MDogIDAyICBiYyAgMDIgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCitFQyAweDcwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAxMiAgMzAgIDQwICAyNCAgMjcgIDJjICAyNyAgMjEgIDgwICAxZiAgODAKK0VDIDB4ODA6ICAwMCAgMDAgIDAwICAwNiAqYmUgIDBkICAwMyAgMDAgIDAwICAwMCAgMGUgIDA3ICAwMCAgMDAgIDAwICAwMAorRUMgMHg5MDogIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCitFQyAweGEwOiAgZmYgIDA5ICBmZiAgMDkgIGZmICBmZiAgNjQgIDAwICAwMCAgMDAgIGEyICA0MSAgZmYgIGZmICBlMCAgMDAKK0VDIDB4YjA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAorRUMgMHhjMDogIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCitFQyAweGQwOiAgMDMgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAKK0VDIDB4ZTA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDExICAyMCAgNDkgIDA0ICAyNCAgMDYgIDU1ICAwMworRUMgMHhmMDogIDMxICA1NSAgNDggIDU0ICAzNSAgMzggIDU3ICA1NyAgMDggIDJmICA0NSAgNzMgIDA3ICA2NSAgNmMgIDFhCisKK0Fub3RoZXIgc2V0IG9mIHZhbHVlcyB0aGF0IHZhcmllcyBvZnRlbiBpcyB0aGUgdGVtcGVyYXR1cmUKK3JlYWRpbmdzLiBTaW5jZSB0ZW1wZXJhdHVyZXMgZG9uJ3QgY2hhbmdlIHZhcnkgZmFzdCwgeW91IGNhbiB0YWtlCitzZXZlcmFsIHF1aWNrIGR1bXBzIHRvIGVsaW1pbmF0ZSB0aGVtLgorCitZb3UgY2FuIHVzZSBhIHNpbWlsYXIgbWV0aG9kIHRvIGZpZ3VyZSBvdXQgdGhlIG1lYW5pbmcgb2Ygb3RoZXIKK2VtYmVkZGVkIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIC0gZS5nLiBtYWtlIHN1cmUgbm90aGluZyBlbHNlIGNoYW5nZXMKK2V4Y2VwdCB0aGUgY2hhcmdpbmcgb3IgZGlzY2hhcmdpbmcgYmF0dGVyeSB0byBkZXRlcm1pbmUgd2hpY2gKK3JlZ2lzdGVycyBjb250YWluIHRoZSBjdXJyZW50IGJhdHRlcnkgY2FwYWNpdHksIGV0Yy4gSWYgeW91IGV4cGVyaW1lbnQKK3dpdGggdGhpcywgZG8gc2VuZCBtZSB5b3VyIHJlc3VsdHMgKGluY2x1ZGluZyBzb21lIGNvbXBsZXRlIGR1bXBzIHdpdGgKK2EgZGVzY3JpcHRpb24gb2YgdGhlIGNvbmRpdGlvbnMgd2hlbiB0aGV5IHdlcmUgdGFrZW4uKQorCitFWFBFUklNRU5UQUw6IExDRCBicmlnaHRuZXNzIGNvbnRyb2wgLS0gL3Byb2MvYWNwaS9pYm0vYnJpZ2h0bmVzcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBmZWF0dXJlIGlzIG1hcmtlZCBFWFBFUklNRU5UQUwgYmVjYXVzZSB0aGUgaW1wbGVtZW50YXRpb24KK2RpcmVjdGx5IGFjY2Vzc2VzIGhhcmR3YXJlIHJlZ2lzdGVycyBhbmQgbWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkLiBVU0UKK1dJVEggQ0FVVElPTiEgVG8gdXNlIHRoaXMgZmVhdHVyZSwgeW91IG5lZWQgdG8gc3VwcGx5IHRoZQorZXhwZXJpbWVudGFsPTEgcGFyYW1ldGVyIHdoZW4gbG9hZGluZyB0aGUgbW9kdWxlLgorCitUaGlzIGZlYXR1cmUgYWxsb3dzIHNvZnR3YXJlIGNvbnRyb2wgb2YgdGhlIExDRCBicmlnaHRuZXNzIG9uIFRoaW5rUGFkCittb2RlbHMgd2hpY2ggZG9uJ3QgaGF2ZSBhIGhhcmR3YXJlIGJyaWdodG5lc3Mgc2xpZGVyLiBUaGUgYXZhaWxhYmxlCitjb21tYW5kcyBhcmU6CisKKwllY2hvIHVwICAgPi9wcm9jL2FjcGkvaWJtL2JyaWdodG5lc3MKKwllY2hvIGRvd24gPi9wcm9jL2FjcGkvaWJtL2JyaWdodG5lc3MKKwllY2hvICdsZXZlbCA8bGV2ZWw+JyA+L3Byb2MvYWNwaS9pYm0vYnJpZ2h0bmVzcworCitUaGUgPGxldmVsPiBudW1iZXIgcmFuZ2UgaXMgMCB0byA3LCBhbHRob3VnaCBub3QgYWxsIG9mIHRoZW0gbWF5IGJlCitkaXN0aW5jdC4gVGhlIGN1cnJlbnQgYnJpZ2h0bmVzcyBsZXZlbCBpcyBzaG93biBpbiB0aGUgZmlsZS4KKworRVhQRVJJTUVOVEFMOiBWb2x1bWUgY29udHJvbCAtLSAvcHJvYy9hY3BpL2libS92b2x1bWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZmVhdHVyZSBpcyBtYXJrZWQgRVhQRVJJTUVOVEFMIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uCitkaXJlY3RseSBhY2Nlc3NlcyBoYXJkd2FyZSByZWdpc3RlcnMgYW5kIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC4gVVNFCitXSVRIIENBVVRJT04hIFRvIHVzZSB0aGlzIGZlYXR1cmUsIHlvdSBuZWVkIHRvIHN1cHBseSB0aGUKK2V4cGVyaW1lbnRhbD0xIHBhcmFtZXRlciB3aGVuIGxvYWRpbmcgdGhlIG1vZHVsZS4KKworVGhpcyBmZWF0dXJlIGFsbG93cyB2b2x1bWUgY29udHJvbCBvbiBUaGlua1BhZCBtb2RlbHMgd2hpY2ggZG9uJ3QgaGF2ZQorYSBoYXJkd2FyZSB2b2x1bWUga25vYi4gVGhlIGF2YWlsYWJsZSBjb21tYW5kcyBhcmU6CisKKwllY2hvIHVwICAgPi9wcm9jL2FjcGkvaWJtL3ZvbHVtZQorCWVjaG8gZG93biA+L3Byb2MvYWNwaS9pYm0vdm9sdW1lCisJZWNobyBtdXRlID4vcHJvYy9hY3BpL2libS92b2x1bWUKKwllY2hvICdsZXZlbCA8bGV2ZWw+JyA+L3Byb2MvYWNwaS9pYm0vdm9sdW1lCisKK1RoZSA8bGV2ZWw+IG51bWJlciByYW5nZSBpcyAwIHRvIDE1IGFsdGhvdWdoIG5vdCBhbGwgb2YgdGhlbSBtYXkgYmUKK2Rpc3RpbmN0LiBUaGUgdW5tdXRlIHRoZSB2b2x1bWUgYWZ0ZXIgdGhlIG11dGUgY29tbWFuZCwgdXNlIGVpdGhlciB0aGUKK3VwIG9yIGRvd24gY29tbWFuZCAodGhlIGxldmVsIGNvbW1hbmQgd2lsbCBub3QgdW5tdXRlIHRoZSB2b2x1bWUpLgorVGhlIGN1cnJlbnQgdm9sdW1lIGxldmVsIGFuZCBtdXRlIHN0YXRlIGlzIHNob3duIGluIHRoZSBmaWxlLgorCitFWFBFUklNRU5UQUw6IGZhbiBzcGVlZCwgZmFuIGVuYWJsZS9kaXNhYmxlIC0tIC9wcm9jL2FjcGkvaWJtL2ZhbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBmZWF0dXJlIGlzIG1hcmtlZCBFWFBFUklNRU5UQUwgYmVjYXVzZSB0aGUgaW1wbGVtZW50YXRpb24KK2RpcmVjdGx5IGFjY2Vzc2VzIGhhcmR3YXJlIHJlZ2lzdGVycyBhbmQgbWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkLiBVU0UKK1dJVEggQ0FVVElPTiEgVG8gdXNlIHRoaXMgZmVhdHVyZSwgeW91IG5lZWQgdG8gc3VwcGx5IHRoZQorZXhwZXJpbWVudGFsPTEgcGFyYW1ldGVyIHdoZW4gbG9hZGluZyB0aGUgbW9kdWxlLgorCitUaGlzIGZlYXR1cmUgYXR0ZW1wdHMgdG8gc2hvdyB0aGUgY3VycmVudCBmYW4gc3BlZWQuIFRoZSBzcGVlZCBpcyByZWFkCitkaXJlY3RseSBmcm9tIHRoZSBoYXJkd2FyZSByZWdpc3RlcnMgb2YgdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIuIFRoaXMKK2lzIGtub3duIHRvIHdvcmsgb24gbGF0ZXIgUiwgVCBhbmQgWCBzZXJpZXMgVGhpbmtQYWRzIGJ1dCBtYXkgc2hvdyBhCitib2d1cyB2YWx1ZSBvbiBvdGhlciBtb2RlbHMuCisKK1RoZSBmYW4gbWF5IGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorCisJZWNobyBlbmFibGUgID4vcHJvYy9hY3BpL2libS9mYW4KKwllY2hvIGRpc2FibGUgPi9wcm9jL2FjcGkvaWJtL2ZhbgorCitXQVJOSU5HIFdBUk5JTkcgV0FSTklORzogZG8gbm90IGxlYXZlIHRoZSBmYW4gZGlzYWJsZWQgdW5sZXNzIHlvdSBhcmUKK21vbml0b3JpbmcgdGhlIHRlbXBlcmF0dXJlIHNlbnNvciByZWFkaW5ncyBhbmQgeW91IGFyZSByZWFkeSB0byBlbmFibGUKK2l0IGlmIG5lY2Vzc2FyeSB0byBhdm9pZCBvdmVyaGVhdGluZy4KKworVGhlIGZhbiBvbmx5IHJ1bnMgaWYgaXQncyBlbmFibGVkICphbmQqIHRoZSB2YXJpb3VzIHRlbXBlcmF0dXJlCitzZW5zb3JzIHdoaWNoIGNvbnRyb2wgaXQgcmVhZCBoaWdoIGVub3VnaC4gT24gdGhlIFg0MCwgdGhpcyBzZWVtcyB0bworZGVwZW5kIG9uIHRoZSBDUFUgYW5kIEhERCB0ZW1wZXJhdHVyZXMuIFNwZWNpZmljYWxseSwgdGhlIGZhbiBpcwordHVybmVkIG9uIHdoZW4gZWl0aGVyIHRoZSBDUFUgdGVtcGVyYXR1cmUgY2xpbWJzIHRvIDU2IGRlZ3JlZXMgb3IgdGhlCitIREQgdGVtcGVyYXR1cmUgY2xpbWJzIHRvIDQ2IGRlZ3JlZXMuIFRoZSBmYW4gaXMgdHVybmVkIG9mZiB3aGVuIHRoZQorQ1BVIHRlbXBlcmF0dXJlIGRyb3BzIHRvIDQ5IGRlZ3JlZXMgYW5kIHRoZSBIREQgdGVtcGVyYXR1cmUgZHJvcHMgdG8KKzQxIGRlZ3JlZXMuIFRoZXNlIHRocmVzaG9sZHMgY2Fubm90IGN1cnJlbnRseSBiZSBjb250cm9sbGVkLgorCitPbiB0aGUgWDMxIGFuZCBYNDAgKGFuZCBPTkxZIG9uIHRob3NlIG1vZGVscyksIHRoZSBmYW4gc3BlZWQgY2FuIGJlCitjb250cm9sbGVkIHRvIGEgY2VydGFpbiBkZWdyZWUuIE9uY2UgdGhlIGZhbiBpcyBydW5uaW5nLCBpdCBjYW4gYmUKK2ZvcmNlZCB0byBydW4gZmFzdGVyIG9yIHNsb3dlciB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworCWVjaG8gJ3NwZWVkIDxzcGVlZD4nID4gL3Byb2MvYWNwaS9pYm0vdGhlcm1hbAorCitUaGUgc3VzdGFpbmFibGUgcmFuZ2Ugb2YgZmFuIHNwZWVkcyBvbiB0aGUgWDQwIGFwcGVhcnMgdG8gYmUgZnJvbQorYWJvdXQgMzcwMCB0byBhYm91dCA3MzUwLiBWYWx1ZXMgb3V0c2lkZSB0aGlzIHJhbmdlIGVpdGhlciBkbyBub3QgaGF2ZQorYW55IGVmZmVjdCBvciB0aGUgZmFuIHNwZWVkIGV2ZW50dWFsbHkgc2V0dGxlcyBzb21ld2hlcmUgaW4gdGhhdAorcmFuZ2UuIFRoZSBmYW4gY2Fubm90IGJlIHN0b3BwZWQgb3Igc3RhcnRlZCB3aXRoIHRoaXMgY29tbWFuZC4KKworT24gdGhlIDU3MCwgdGVtcGVyYXR1cmUgcmVhZGluZ3MgYXJlIG5vdCBhdmFpbGFibGUgdGhyb3VnaCB0aGlzCitmZWF0dXJlIGFuZCB0aGUgZmFuIGNvbnRyb2wgd29ya3MgYSBsaXR0bGUgZGlmZmVyZW50bHkuIFRoZSBmYW4gc3BlZWQKK2lzIHJlcG9ydGVkIGluIGxldmVscyBmcm9tIDAgKG9mZikgdG8gNyAobWF4KSBhbmQgY2FuIGJlIGNvbnRyb2xsZWQKK3dpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisJZWNobyAnbGV2ZWwgPGxldmVsPicgPiAvcHJvYy9hY3BpL2libS90aGVybWFsCiAKIAotTXVsdGlwbGUgQ29tbWFuZCwgTW9kdWxlIFBhcmFtZXRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNdWx0aXBsZSBDb21tYW5kcywgTW9kdWxlIFBhcmFtZXRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBNdWx0aXBsZSBjb21tYW5kcyBjYW4gYmUgd3JpdHRlbiB0byB0aGUgcHJvYyBmaWxlcyBpbiBvbmUgc2hvdCBieQogc2VwYXJhdGluZyB0aGVtIHdpdGggY29tbWFzLCBmb3IgZXhhbXBsZToKQEAgLTQ1MSwyNCArNjQ2LDE5IEBACiAJL3Vzci9sb2NhbC9zYmluL2xhcHRvcF9tb2RlIC0tIGZyb20gdGhlIExpbnV4IGtlcm5lbCBzb3VyY2UKIAkJZGlzdHJpYnV0aW9uLCBzZWUgRG9jdW1lbnRhdGlvbi9sYXB0b3AtbW9kZS50eHQKIAkvc2Jpbi9zZXJ2aWNlIC0tIGNvbWVzIHdpdGggUmVkaGF0L0ZlZG9yYSBkaXN0cmlidXRpb25zCisJL3Vzci9zYmluL2hpYmVybmF0ZSAtLSBmcm9tIHRoZSBTb2Z0d2FyZSBTdXNwZW5kIDIgZGlzdHJpYnV0aW9uLAorCQlzZWUgaHR0cDovL3NvZnR3YXJlc3VzcGVuZC5iZXJsaW9zLmRlLwogCi1Ub2FuIFQgTmd1eWVuIDxudHRAY29udHJvbC51Y2hpY2Fnby5lZHU+IGhhcyB3cml0dGVuIGEgU3VTRSBwb3dlcnNhdmUKLXNjcmlwdCBmb3IgdGhlIFgyMCwgaW5jbHVkZWQgaW4gY29uZmlnL3Vzci9zYmluL2libV9ob3RrZXlzX1gyMAorVG9hbiBUIE5ndXllbiA8bnR0QHBoeXNpY3MudWNsYS5lZHU+IG5vdGVzIHRoYXQgU3VzZSB1c2VzIHRoZQorcG93ZXJzYXZlIHByb2dyYW0gdG8gc3VzcGVuZCAoJ3Bvd2Vyc2F2ZSAtLXN1c3BlbmQtdG8tcmFtJykgb3IKK2hpYmVybmF0ZSAoJ3Bvd2Vyc2F2ZSAtLXN1c3BlbmQtdG8tZGlzaycpLiBUaGlzIG1lYW5zIHRoYXQgdGhlCitoaWJlcm5hdGUgc2NyaXB0IGlzIG5vdCBuZWVkZWQgb24gdGhhdCBkaXN0cmlidXRpb24uCiAKIEhlbnJpayBCcml4IEFuZGVyc2VuIDxicml4QGdlbnRvby5vcmc+IGhhcyB3cml0dGVuIGEgR2VudG9vIEFDUEkgZXZlbnQKIGhhbmRsZXIgc2NyaXB0IGZvciB0aGUgWDMxLiBZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbQogaHR0cDovL2Rldi5nZW50b28ub3JnL35icml4L2ZpbGVzL3gzMS5zaAogCiBEYXZpZCBTY2h3ZWlrZXJ0IDxkd3NAZWUuZXRoLmNoPiBoYXMgd3JpdHRlbiBhbiBhbHRlcm5hdGl2ZSBibGFuay5zaAotc2NyaXB0IHdoaWNoIHdvcmtzIG9uIERlYmlhbiBzeXN0ZW1zLCBpbmNsdWRlZCBpbgotY29uZmlncy9ldGMvYWNwaS9hY3Rpb25zL2JsYW5rLWRlYmlhbi5zaAotCi0KLVRPRE8KLS0tLS0KLQotSSdkIGxpa2UgdG8gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYnV0IGhhdmVuJ3QgeWV0IGZvdW5kIHRoZQotdGltZSBhbmQvb3IgSSBkb24ndCB5ZXQga25vdyBob3cgdG8gaW1wbGVtZW50IHRoZW06Ci0KLS0gVWx0cmFCYXkgZmxvcHB5IGRyaXZlIHN1cHBvcnQKLQorc2NyaXB0IHdoaWNoIHdvcmtzIG9uIERlYmlhbiBzeXN0ZW1zLiBUaGlzIHNjcmlwdHMgaGFzIG5vdyBiZWVuCitleHRlbmRlZCB0byBhbHNvIHdvcmsgb24gRmVkb3JhIHN5c3RlbXMgYW5kIGluY2x1ZGVkIGFzIHRoZSBkZWZhdWx0CitibGFuay5zaCBpbiB0aGUgZGlzdHJpYnV0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC95ZWFsaW5rLnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQveWVhbGluay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmMDk1YQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaW5wdXQveWVhbGluay50eHQKQEAgLTAsMCArMSwyMDMgQEAKK0RyaXZlciBkb2N1bWVudGF0aW9uIGZvciB5ZWFsaW5rIHVzYi1wMWsgcGhvbmVzCisKKzAuIFN0YXR1cworfn5+fn5+fn5+CisKK1RoZSBwMWsgaXMgYSByZWxhdGl2ZWx5IGNoZWFwIHVzYiAxLjEgcGhvbmUgd2l0aDoKKyAgLSBrZXlib2FyZAkJZnVsbCBzdXBwb3J0LCB5ZWFsaW5rLmtvIC8gaW5wdXQgZXZlbnQgQVBJCisgIC0gTENECQkJZnVsbCBzdXBwb3J0LCB5ZWFsaW5rLmtvIC8gc3lzZnMgQVBJCisgIC0gTEVECQkJZnVsbCBzdXBwb3J0LCB5ZWFsaW5rLmtvIC8gc3lzZnMgQVBJCisgIC0gZGlhbHRvbmUJCWZ1bGwgc3VwcG9ydCwgeWVhbGluay5rbyAvIHN5c2ZzIEFQSQorICAtIHJpbmd0b25lCQlmdWxsIHN1cHBvcnQsIHllYWxpbmsua28gLyBzeXNmcyBBUEkKKyAgLSBhdWRpbyBwbGF5YmFjayAgIAlmdWxsIHN1cHBvcnQsIHNuZF91c2JfYXVkaW8ua28gLyBhbHNhIEFQSQorICAtIGF1ZGlvIHJlY29yZCAgICAgCWZ1bGwgc3VwcG9ydCwgc25kX3VzYl9hdWRpby5rbyAvIGFsc2EgQVBJCisKK0ZvciB2ZW5kb3IgZG9jdW1lbnRhdGlvbiBzZWUgaHR0cDovL3d3dy55ZWFsaW5rLmNvbQorCisKKzEuIENvbXBpbGF0aW9uIChzdGFuZCBhbG9uZSB2ZXJzaW9uKQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0N1cnJlbnRseSBvbmx5IGtlcm5lbCAyLjYueC55IHZlcnNpb25zIGFyZSBzdXBwb3J0ZWQuCitJbiBvcmRlciB0byBidWlsZCB0aGUgeWVhbGluay5rbyBtb2R1bGUgZG86CisKKyAgbWFrZQorCitJZiB5b3UgZW5jb3VudGVyIHByb2JsZW1zIHBsZWFzZSBjaGVjayBpZiBpbiB0aGUgTUFLRV9PUFRTIHZhcmlhYmxlIGluCit0aGUgTWFrZWZpbGUgaXMgcG9pbnRpbmcgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHlvdXIga2VybmVsIHNvdXJjZXMKK2FyZSBsb2NhdGVkLCBkZWZhdWx0IC91c3Ivc3JjL2xpbnV4LgorCisKKworMi4ga2V5Ym9hcmQgZmVhdHVyZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+CitUaGUgY3VycmVudCBtYXBwaW5nIGluIHRoZSBrZXJuZWwgaXMgcHJvdmlkZWQgYnkgdGhlIG1hcF9wMWtfdG9fa2V5CitmdW5jdGlvbjoKKworICAgUGh5c2ljYWwgVVNCLVAxSyBidXR0b24gbGF5b3V0CWlucHV0IGV2ZW50cworCisKKyAgICAgICAgICAgICAgdXAJCQkgICAgIHVwCisgICAgICAgIElOICAgICAgICAgICBPVVQJCWxlZnQsCXJpZ2h0CisgICAgICAgICAgICAgZG93bgkJCSAgICBkb3duCisKKyAgICAgIHBpY2t1cCAgIEMgICAgaGFuZ3VwCQllbnRlciwgYmFja3NwYWNlLCBlc2NhcGUKKyAgICAgICAgMSAgICAgIDIgICAgICAzCQkJMSwgMiwgMworICAgICAgICA0ICAgICAgNSAgICAgIDYJCQk0LCA1LCA2LAorICAgICAgICA3ICAgICAgOCAgICAgIDkJCQk3LCA4LCA5LAorICAgICAgICAqICAgICAgMCAgICAgICMJCQkqLCAwLCAjLAorCisgIFRoZSAidXAiIGFuZCAiZG93biIga2V5cywgYXJlIHN5bWJvbGlzZWQgYnkgYXJyb3dzIG9uIHRoZSBidXR0b24uCisgIFRoZSAicGlja3VwIiBhbmQgImhhbmd1cCIga2V5cyBhcmUgc3ltYm9saXNlZCBieSBhIGdyZWVuIGFuZCByZWQgcGhvbmUKKyAgb24gdGhlIGJ1dHRvbi4KKworCiszLiBMQ0QgZmVhdHVyZXMKK35+fn5+fn5+fn5+fn5+fgorVGhlIExDRCBpcyBkaXZpZGVkIGFuZCBvcmdhbmlzZWQgYXMgYSAzIGxpbmUgZGlzcGxheToKKworICAgIHxbXSAgIFtdW10gICBbXVtdICAgW11bXSAgIGluICAgfFtdW10KKyAgICB8W10gTSBbXVtdIEQgW11bXSA6IFtdW10gICBvdXQgIHxbXVtdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZQorCisgICAgTkVXIFJFUCAgICAgICAgIFNVIE1PIFRVIFdFIFRIIEZSIFNBCisKKyAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXQorICAgIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdCisKKworTGluZSAxCUZvcm1hdCAoc2VlIGJlbG93KQk6IDE4LmU4Lk04Ljg4Li4uMTg4CisJSWNvbiBuYW1lcwkJOiAgIE0gIEQgIDogIElOIE9VVCBTVE9SRQorTGluZSAyICBGb3JtYXQJCQk6IC4uLi4uLi4uLgorCUljb24gbmFtZQkJOiBORVcgUkVQIFNVIE1PIFRVIFdFIFRIIEZSIFNBCitMaW5lIDMgIEZvcm1hdAkJCTogODg4ODg4ODg4ODg4CisKKworRm9ybWF0IGRlc2NyaXB0aW9uOgorICBGcm9tIGEgdXNlciBzcGFjZSBwZXJzcGVjdGl2ZSB0aGUgd29ybGQgaXMgc2VwZXJhdGVkIGluICJkaWdpdHMiIGFuZCAiaWNvbnMiLgorICBBIGRpZ2l0IGNhbiBoYXZlIGEgY2hhcmFjdGVyIHNldCwgYW4gaWNvbiBjYW4gb25seSBiZSBPTiBvciBPRkYuCisKKyAgRm9ybWF0IHNwZWNpZmllcgorICAgICc4JyA6ICBHZW5lcmljIDcgc2VnbWVudCBkaWdpdCB3aXRoIGluZGl2aWR1YWwgYWRkcmVzc2FibGUgc2VnbWVudHMKKworICAgIFJlZHVjZWQgY2FwYWJpbGxpdHkgNyBzZWdtIGRpZ2l0LCB3aGVuIHNlZ21lbnRzIGFyZSBoYXJkIHdpcmVkIHRvZ2V0aGVyLgorICAgICcxJyA6IDIgc2VnbWVudHMgZGlnaXQgb25seSBhYmxlIHRvIHByb2R1Y2UgYSAxLgorICAgICdlJyA6IE1vc3Qgc2lnbmlmaWNhbnQgZGF5IG9mIHRoZSBtb250aCBkaWdpdCwKKyAgICAgICAgICBhYmxlIHRvIHByb2R1Y2UgYXQgbGVhc3QgMSAyIDMuCisgICAgJ00nIDogTW9zdCBzaWduaWZpY2FudCBtaW51dGUgZGlnaXQsCisgICAgICAgICAgYWJsZSB0byBwcm9kdWNlIGF0IGxlYXN0IDAgMSAyIDMgNCA1LgorCisgICAgSWNvbnMgb3IgcGljdG9ncmFtczoKKyAgICAnLicgOiBGb3IgZXhhbXBsZSBsaWtlIEFNLCBQTSwgU1UsIGEgJ2RvdCcgLi4gb3Igb3RoZXIgc2luZ2xlIHNlZ21lbnQKKwkgIGVsZW1lbnRzLgorCisKKzQuIERyaXZlciB1c2FnZQorfn5+fn5+fn5+fn5+fn5+CitGb3IgdXNlcmxhbmQgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VzIGFyZSBhdmFpbGFibGUgdXNpbmcgdGhlIHN5c2ZzIGludGVyZmFjZToKKyAgL3N5cy8uLi4vCisgICAgICAgICAgIGxpbmUxCVJlYWQvV3JpdGUsIGxjZCBsaW5lMQorICAgICAgICAgICBsaW5lMglSZWFkL1dyaXRlLCBsY2QgbGluZTIKKyAgICAgICAgICAgbGluZTMJUmVhZC9Xcml0ZSwgbGNkIGxpbmUzCisKKwkgICBnZXRfaWNvbnMgICAgUmVhZCwgcmV0dXJucyBhIHNldCBvZiBhdmFpbGFibGUgaWNvbnMuCisJICAgaGlkZV9pY29uICAgIFdyaXRlLCBoaWRlIHRoZSBlbGVtZW50IGJ5IHdyaXRpbmcgdGhlIGljb24gbmFtZS4KKwkgICBzaG93X2ljb24gICAgV3JpdGUsIGRpc3BsYXkgdGhlIGVsZW1lbnQgYnkgd3JpdGluZyB0aGUgaWNvbiBuYW1lLgorCisJICAgbWFwX3NlZzcJUmVhZC9Xcml0ZSwgdGhlIDcgc2VnbWVudHMgY2hhciBzZXQsIGNvbW1vbiBmb3IgYWxsCisJICAgCQl5ZWFsaW5rIHBob25lcy4gKHNlZSBtYXBfdG9fN3NlZ21lbnQuaCkKKworCSAgIHJpbmd0b25lCVdyaXRlLCB1cGxvYWQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGEgcmluZ3RvbmUsCisJICAgCQlzZWUgeWVhbGluay5jLiBzdGF0dXMgRVhQRVJJTUVOVEFMIGR1ZSB0byBwb3RlbnRpYWwKKwkJCXJhY2VzIGJldHdlZW4gYXN5bmMuIGFuZCBzeW5jIHVzYiBjYWxscy4KKworCis0LjEgbGluZVgKK35+fn5+fn5+fgorUmVhZGluZyAvc3lzLy4uL2xpbmVYIHdpbGwgcmV0dXJuIHRoZSBmb3JtYXQgc3RyaW5nIHdpdGggaXRzIGN1cnJlbnQgdmFsdWU6CisKKyAgRXhhbXBsZToKKyAgY2F0IC4vbGluZTMKKyAgODg4ODg4ODg4ODg4CisgIExpbnV4IFJvY2tzIQorCitXcml0aW5nIHRvIC9zeXMvLi4vbGluZVggd2lsbCBzZXQgdGhlIGNvcmVzcG9uZGluZyBMQ0QgbGluZS4KKyAtIEV4Y2VzcyBjaGFyYWN0ZXJzIGFyZSBpZ25vcmVkLgorIC0gSWYgbGVzcyBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoYW4gYWxsb3dlZCwgdGhlIHJlbWFpbmluZyBkaWdpdHMgYXJlCisgICB1bmNoYW5nZWQuCisgLSBUaGUgdGFiICdcdCdhbmQgJ1xuJyBjaGFyIGRvZXMgbm90IG92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgY29udGVudC4KKyAtIFdyaXRpbmcgYSBzcGFjZSB0byBhbiBpY29uIHdpbGwgYWx3YXlzIGhpZGUgaXRzIGNvbnRlbnQuCisKKyAgRXhhbXBsZToKKyAgZGF0ZSArIiVtLiVlLiVrOiVNIiAgfCBzZWQgJ3MvXjAvIC8nID4gLi9saW5lMQorCisgIFdpbGwgdXBkYXRlIHRoZSBMQ0Qgd2l0aCB0aGUgY3VycmVudCBkYXRlICYgdGltZS4KKworCis0LjIgZ2V0X2ljb25zCit+fn5+fn5+fn5+fn5+CitSZWFkaW5nIHdpbGwgcmV0dXJuIGFsbCBhdmFpbGFibGUgaWNvbiBuYW1lcyBhbmQgaXRzIGN1cnJlbnQgc2V0dGluZ3M6CisKKyAgY2F0IC4vZ2V0X2ljb25zCisgIG9uIE0KKyAgb24gRAorICBvbiA6CisgICAgIElOCisgICAgIE9VVAorICAgICBTVE9SRQorICAgICBORVcKKyAgICAgUkVQCisgICAgIFNVCisgICAgIE1PCisgICAgIFRVCisgICAgIFdFCisgICAgIFRICisgICAgIEZSCisgICAgIFNBCisgICAgIExFRAorICAgICBESUFMVE9ORQorICAgICBSSU5HVE9ORQorCisKKzQuMyBzaG93L2hpZGUgaWNvbnMKK35+fn5+fn5+fn5+fn5+fn5+fn4KK1dyaXRpbmcgdG8gdGhlc2UgZmlsZXMgd2lsbCB1cGRhdGUgdGhlIHN0YXRlIG9mIHRoZSBpY29uLgorT25seSBvbmUgaWNvbiBhdCBhIHRpbWUgY2FuIGJlIHVwZGF0ZWQuCisKK0lmIGFuIGljb24gaXMgYWxzbyBvbiBhIC4vbGluZVggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMKK3VwZGF0ZWQgd2l0aCB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBpY29uLgorCisgIEV4YW1wbGUgLSBsaWdodCB1cCB0aGUgc3RvcmUgaWNvbjoKKyAgZWNobyAtbiAiU1RPUkUiID4gLi9zaG93X2ljb24KKworICBjYXQgLi9saW5lMQorICAxOC5lOC5NOC44OC4uLjE4OAorICAgICAgICAgICAgICAgUworCisgIEV4YW1wbGUgLSBzb3VuZCB0aGUgcmluZ3RvbmUgZm9yIDEwIHNlY29uZHM6CisgIGVjaG8gLW4gUklOR1RPTkUgPiAvc3lzLy4uLi4vc2hvd19pY29uCisgIHNsZWVwIDEwCisgIGVjaG8gLW4gUklOR1RPTkUgPiAvc3lzLy4uLi4vaGlkZV9pY29uCisKKworNS4gU291bmQgZmVhdHVyZXMKK35+fn5+fn5+fn5+fn5+fn5+CitTb3VuZCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEFMU0EgZHJpdmVyOiBzbmRfdXNiX2F1ZGlvCisKK09uZSAxNi1iaXQgY2hhbm5lbCB3aXRoIHNhbXBsZSBhbmQgcGxheWJhY2sgcmF0ZXMgb2YgODAwMCBIeiBpcyB0aGUgcHJhY3RpY2FsCitsaW1pdCBvZiB0aGUgZGV2aWNlLgorCisgIEV4YW1wbGUgLSByZWNvcmRpbmcgdGVzdDoKKyAgYXJlY29yZCAtdiAtZCAxMCAtciA4MDAwIC1mIFMxNl9MRSAtdCB3YXYgIGZvb2Jhci53YXYKKworICBFeGFtcGxlIC0gcGxheWJhY2sgdGVzdDoKKyAgYXBsYXkgZm9vYmFyLndhdgorCisKKzYuIENyZWRpdHMgJiBBY2tub3dsZWRnbWVudHMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAgLSBPbGl2aWVyIFZhbmRvcnBlLCBmb3Igc3RhcnRpbmcgdGhlIHVzYmIyay1hcGkgcHJvamVjdCBkb2luZyBtdWNoIG9mCisJdGhlIHJldmVyc2UgZW5naW5lZXJpbmcuCisgIC0gTWFydGluIERpZWhsLCBmb3IgcG9pbnRpbmcgb3V0IGhvdyB0byBoYW5kbGUgVVNCIG1lbW9yeSBhbGxvY2F0aW9uLgorICAtIERtaXRyeSBUb3Jva2hvdiwgZm9yIHRoZSBudW1lcm91cyBjb2RlIHJldmlld3MgYW5kIHN1Z2dlc3Rpb25zLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2Nkcm9tLnR4dCBiL0RvY3VtZW50YXRpb24vaW9jdGwvY2Ryb20udHh0CmluZGV4IDRjY2RjYzYuLjhlYzMyY2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW9jdGwvY2Ryb20udHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW9jdGwvY2Ryb20udHh0CkBAIC04NzgsNyArODc4LDcgQEAKIAogCWVycm9yIHJldHVybnM6CiAJICBFSU5WQUwJcGh5c2ljYWwubGF5ZXJfbnVtIGV4Y2VlZHMgbnVtYmVyIG9mIGxheWVycwotCSAgRUlPCQlSZWNpZXZlZCBpbnZhbGlkIHJlc3BvbnNlIGZyb20gZHJpdmUKKwkgIEVJTwkJUmVjZWl2ZWQgaW52YWxpZCByZXNwb25zZSBmcm9tIGRyaXZlCiAKIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dAppbmRleCAyNjE2YTU4Li45YTE1ODY1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKQEAgLTg3Miw3ICs4NzIsMTMgQEAKIAlBc3NpZ25tZW50cyB0byAkKHRhcmdldHMpIGFyZSB3aXRob3V0ICQob2JqKS8gcHJlZml4LgogCWlmX2NoYW5nZWQgbWF5IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBjdXN0b20gY29tbWFuZHMgYXMKIAlkZWZpbmVkIGluIDYuNyAiQ3VzdG9tIGtidWlsZCBjb21tYW5kcyIuCisKIAlOb3RlOiBJdCBpcyBhIHR5cGljYWwgbWlzdGFrZSB0byBmb3JnZXQgdGhlIEZPUkNFIHByZXJlcXVpc2l0ZS4KKwlBbm90aGVyIGNvbW1vbiBwaXRmYWxsIGlzIHRoYXQgd2hpdGVzcGFjZSBpcyBzb21ldGltZXMKKwlzaWduaWZpY2FudDsgZm9yIGluc3RhbmNlLCB0aGUgYmVsb3cgd2lsbCBmYWlsIChub3RlIHRoZSBleHRyYSBzcGFjZQorCWFmdGVyIHRoZSBjb21tYSk6CisJCXRhcmdldDogc291cmNlKHMpIEZPUkNFCisJI1dST05HISMJJChjYWxsIGlmX2NoYW5nZWQsIGxkL29iamNvcHkvZ3ppcCkKIAogICAgIGxkCiAJTGluayB0YXJnZXQuIE9mdGVuIExERkxBR1NfJEAgaXMgdXNlZCB0byBzZXQgc3BlY2lmaWMgb3B0aW9ucyB0byBsZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0IGIvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKaW5kZXggN2ZmMjEzZi4uMWY1ZjdkMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKQEAgLTM5LDggKzM5LDcgQEAKICAgIGFuZCBhcHBseSBodHRwOi8vbHNlLnNvdXJjZWZvcmdlLm5ldC9rZHVtcC9wYXRjaGVzL2tleGVjLXRvb2xzLTEuMTAxLWtkdW1wLnBhdGNoCiAgICBhbmQgYWZ0ZXIgdGhhdCBidWlsZCB0aGUgc291cmNlLgogCi0yKSBEb3dubG9hZCBhbmQgYnVpbGQgdGhlIGFwcHJvcHJpYXRlIChsYXRlc3QpIGtleGVjL2tkdW1wICgtbW0pIGtlcm5lbAotICAgcGF0Y2hzZXQgYW5kIGFwcGx5IGl0IHRvIHRoZSB2YW5pbGxhIGtlcm5lbCB0cmVlLgorMikgRG93bmxvYWQgYW5kIGJ1aWxkIHRoZSBhcHByb3ByaWF0ZSAoMi42LjEzLXJjMSBvbndhcmRzKSB2YW5pbGxhIGtlcm5lbC4KIAogICAgVHdvIGtlcm5lbHMgbmVlZCB0byBiZSBidWlsdCBpbiBvcmRlciB0byBnZXQgdGhpcyBmZWF0dXJlIHdvcmtpbmcuCiAKQEAgLTg0LDE1ICs4MywxNiBAQAogCiA0KSBMb2FkIHRoZSBzZWNvbmQga2VybmVsIHRvIGJlIGJvb3RlZCB1c2luZzoKIAotICAga2V4ZWMgLXAgPHNlY29uZC1rZXJuZWw+IC0tY3Jhc2gtZHVtcCAtLWFyZ3MtbGludXggLS1hcHBlbmQ9InJvb3Q9PHJvb3QtZGV2PgotICAgaW5pdCAxIGlycXBvbGwiCisgICBrZXhlYyAtcCA8c2Vjb25kLWtlcm5lbD4gLS1hcmdzLWxpbnV4IC0tZWxmMzItY29yZS1oZWFkZXJzCisgICAtLWFwcGVuZD0icm9vdD08cm9vdC1kZXY+IGluaXQgMSBpcnFwb2xsIgogCiAgICBOb3RlOiBpKSA8c2Vjb25kLWtlcm5lbD4gaGFzIHRvIGJlIGEgdm1saW51eCBpbWFnZS4gYnpJbWFnZSB3aWxsIG5vdCB3b3JrLAogCSAgICBhcyBvZiBub3cuCi0JaWkpIEJ5IGRlZmF1bHQgRUxGIGhlYWRlcnMgYXJlIHN0b3JlZCBpbiBFTEYzMiBmb3JtYXQgKGZvciBpMzg2KS4gVGhpcwotCSAgICBpcyBzdWZmaWNpZW50IHRvIHJlcHJlc2VudCB0aGUgcGh5c2ljYWwgbWVtb3J5IHVwIHRvIDRHQi4gVG8gc3RvcmUKLQkgICAgaGVhZGVycyBpbiBFTEY2NCBmb3JtYXQsIHNwZWNpZml5ICItLWVsZjY0LWNvcmUtaGVhZGVycyIgb24gdGhlCi0JICAgIGtleGVjIGNvbW1hbmQgbGluZSBhZGRpdGlvbmFsbHkuCisJaWkpIEJ5IGRlZmF1bHQgRUxGIGhlYWRlcnMgYXJlIHN0b3JlZCBpbiBFTEY2NCBmb3JtYXQuIE9wdGlvbgorCSAgICAtLWVsZjMyLWNvcmUtaGVhZGVycyBmb3JjZXMgZ2VuZXJhdGlvbiBvZiBFTEYzMiBoZWFkZXJzLiBnZGIgY2FuCisJICAgIG5vdCBvcGVuIEVMRjY0IGhlYWRlcnMgb24gMzIgYml0IHN5c3RlbXMuIFNvIGNyZWF0aW5nIEVMRjMyCisJICAgIGhlYWRlcnMgY2FuIGNvbWUgaGFuZHkgZm9yIHVzZXJzIHdobyBoYXZlIGdvdCBub24tUEFFIHN5c3RlbXMgYW5kCisJICAgIGhlbmNlIGhhdmUgbWVtb3J5IGxlc3MgdGhhbiA0R0IuCiAgICAgICAgaWlpKSBTcGVjaWZ5ICJpcnFwb2xsIiBhcyBjb21tYW5kIGxpbmUgcGFyYW1ldGVyLiBUaGlzIHJlZHVjZXMgZHJpdmVyCiAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiBmYWlsdXJlcyBpbiBzZWNvbmQga2VybmVsIGR1ZSB0byBzaGFyZWQgaW50ZXJydXB0cy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCAzZDVjZDdhLi5kYjI2MDNjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtNTQ5LDYgKzU0OSw3IEBACiAJCQkgICAgIGtleWJvYXJkIGFuZCBjYW4gbm90IGNvbnRyb2wgaXRzIHN0YXRlCiAJCQkgICAgIChEb24ndCBhdHRlbXB0IHRvIGJsaW5rIHRoZSBsZWRzKQogCWk4MDQyLm5vYXV4CVtIV10gRG9uJ3QgY2hlY2sgZm9yIGF1eGlsaWFyeSAoPT0gbW91c2UpIHBvcnQKKwlpODA0Mi5ub2tiZAlbSFddIERvbid0IGNoZWNrL2NyZWF0ZSBrZXlib2FyZCBwb3J0CiAJaTgwNDIubm9tdXgJW0hXXSBEb24ndCBjaGVjayBwcmVzZW5jZSBvZiBhbiBhY3RpdmUgbXVsdGlwbGV4aW5nCiAJCQkgICAgIGNvbnRyb2xsZXIKIAlpODA0Mi5ub3BucAlbSFddIERvbid0IHVzZSBBQ1BJUG5QIC8gUG5QQklPUyB0byBkaXNjb3ZlciBLQkQvQVVYCkBAIC0xMTc0LDYgKzExNzUsMTEgQEAKIAkJCU5ldyBuYW1lIGZvciB0aGUgcmFtZGlzayBwYXJhbWV0ZXIuCiAJCQlTZWUgRG9jdW1lbnRhdGlvbi9yYW1kaXNrLnR4dC4KIAorCXJkaW5pdD0JCVtLTkxdCisJCQlGb3JtYXQ6IDxmdWxsX3BhdGg+CisJCQlSdW4gc3BlY2lmaWVkIGJpbmFyeSBpbnN0ZWFkIG9mIC9pbml0IGZyb20gdGhlIHJhbWRpc2ssCisJCQl1c2VkIGZvciBlYXJseSB1c2Vyc3BhY2Ugc3RhcnR1cC4gU2VlIGluaXRyZC4KKwogCXJlYm9vdD0JCVtCVUdTPUlBLTMyLEJVR1M9QVJNLEJVR1M9SUEtNjRdIFJlYm9vdGluZyBtb2RlCiAJCQlGb3JtYXQ6IDxyZWJvb3RfbW9kZT5bLDxyZWJvb3RfbW9kZTI+WywuLi5dXQogCQkJU2VlIGFyY2gvKi9rZXJuZWwvcmVib290LmMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21vbm8udHh0IGIvRG9jdW1lbnRhdGlvbi9tb25vLnR4dAppbmRleCA2NzM5YWI5Li44MDdhMGM3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21vbm8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbW9uby50eHQKQEAgLTMwLDcgKzMwLDcgQEAKICAgIFJlYWQgdGhlIGZpbGUgJ2JpbmZtdF9taXNjLnR4dCcgaW4gdGhpcyBkaXJlY3RvcnkgdG8ga25vdwogICAgbW9yZSBhYm91dCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLgogCi0zKSBBZGQgdGhlIGZvbGxvd2luZyBlbnJpZXMgdG8gL2V0Yy9yYy5sb2NhbCBvciBzaW1pbGFyIHNjcmlwdAorMykgQWRkIHRoZSBmb2xsb3dpbmcgZW50cmllcyB0byAvZXRjL3JjLmxvY2FsIG9yIHNpbWlsYXIgc2NyaXB0CiAgICB0byBiZSBydW4gYXQgc3lzdGVtIHN0YXJ0dXA6CiAKICMgSW5zZXJ0IEJJTkZNVF9NSVNDIG1vZHVsZSBpbnRvIHRoZSBrZXJuZWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9SRUFETUUuaXB3MjEwMCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9SRUFETUUuaXB3MjEwMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQ2OTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL1JFQURNRS5pcHcyMTAwCkBAIC0wLDAgKzEsMjQ2IEBACisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorSW50ZWwoUikgUFJPL1dpcmVsZXNzIDIxMDAgTmV0d29yayBDb25uZWN0aW9uIERyaXZlciBmb3IgTGludXgKK1JFQURNRS5pcHcyMTAwCisKK01hcmNoIDE0LCAyMDA1CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorSW5kZXgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMC4gSW50cm9kdWN0aW9uCisxLiBSZWxlYXNlIDEuMS4wIEN1cnJlbnQgRmVhdHVyZXMKKzIuIENvbW1hbmQgTGluZSBQYXJhbWV0ZXJzCiszLiBTeXNmcyBIZWxwZXIgRmlsZXMKKzQuIFJhZGlvIEtpbGwgU3dpdGNoCis1LiBEeW5hbWljIEZpcm13YXJlCis2LiBQb3dlciBNYW5hZ2VtZW50Cis3LiBTdXBwb3J0Cis4LiBMaWNlbnNlCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09CiswLiBJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLSAtLS0tLSAgIC0tLS0tICAgICAgIC0tLS0gICAgICAgLS0tICAgICAgIC0tICAgICAgICAgLSAgICAgCisKK1RoaXMgZG9jdW1lbnQgcHJvdmlkZXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSAKK0lQVzIxMDAgZHJpdmVyIHByb2plY3QuICBUaGUgbWFpbiBwcm9qZWN0IHdlYnNpdGUsIHdoZXJlIHRoZSBsYXRlc3QgCitkZXZlbG9wbWVudCB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgY2FuIGJlIGZvdW5kLCBpczoKKworCWh0dHA6Ly9pcHcyMTAwLnNvdXJjZWZvcmdlLm5ldAorCitUaGVyZSB5b3UgY2FuIGZpbmQgdGhlIG5vdCBvbmx5IHRoZSBsYXRlc3QgcmVsZWFzZXMsIGJ1dCBhbHNvIGluZm9ybWF0aW9uIGFib3V0Citwb3RlbnRpYWwgZml4ZXMgYW5kIHBhdGNoZXMsIGFzIHdlbGwgYXMgbGlua3MgdG8gdGhlIGRldmVsb3BtZW50IG1haWxpbmcgbGlzdAorZm9yIHRoZSBkcml2ZXIgcHJvamVjdC4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzEuIFJlbGVhc2UgMS4xLjAgQ3VycmVudCBTdXBwb3J0ZWQgRmVhdHVyZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCistIE1hbmFnZWQgKEJTUykgYW5kIEFkLUhvYyAoSUJTUykKKy0gV0VQIChzaGFyZWQga2V5IGFuZCBvcGVuKQorLSBXaXJlbGVzcyBUb29scyBzdXBwb3J0IAorLSA4MDIuMXggKHRlc3RlZCB3aXRoIFhTdXBwbGljYW50IDEuMC4xKQorCitFbmFibGVkIChidXQgbm90IHN1cHBvcnRlZCkgZmVhdHVyZXM6CistIE1vbml0b3IvUkZNb24gbW9kZQorLSBXUEEvV1BBMgorCitUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBvZmZpY2lhbGx5IHN1cHBvcnRlZCBhbmQgZW5hYmxlZCBpcyBhIHJlZmxlY3Rpb24KK29uIHRoZSBhbW91bnQgb2YgdmFsaWRhdGlvbiBhbmQgaW50ZXJvcGVyYWJpbGl0eSB0ZXN0aW5nIHRoYXQgaGFzIGJlZW4KK3BlcmZvcm1lZCBvbiBhIGdpdmVuIGZlYXR1cmUuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisyLiBDb21tYW5kIExpbmUgUGFyYW1ldGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKworSWYgdGhlIGRyaXZlciBpcyBidWlsdCBhcyBhIG1vZHVsZSwgdGhlIGZvbGxvd2luZyBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSB1c2VkCitieSBlbnRlcmluZyB0aGVtIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCB0aGUgbW9kcHJvYmUgY29tbWFuZCB1c2luZyB0aGlzCitzeW50YXg6CisKKwltb2Rwcm9iZSBpcHcyMTAwIFs8b3B0aW9uPj08VkFMMT48LFZBTDI+Li4uXQorCitGb3IgZXhhbXBsZSwgdG8gZGlzYWJsZSB0aGUgcmFkaW8gb24gZHJpdmVyIGxvYWRpbmcsIGVudGVyOgorCisJbW9kcHJvYmUgaXB3MjEwMCBkaXNhYmxlPTEKKworVGhlIGlwdzIxMDAgZHJpdmVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbW9kdWxlIHBhcmFtZXRlcnM6CisKK05hbWUJCVZhbHVlCQlFeGFtcGxlOgorZGVidWcJCTB4MC0weGZmZmZmZmZmCWRlYnVnPTEwMjQKK21vZGUJCTAsMSwyCQltb2RlPTEgICAvKiBBZEhvYyAqLworY2hhbm5lbAkJaW50CQljaGFubmVsPTMgLyogT25seSB2YWxpZCBpbiBBZEhvYyBvciBNb25pdG9yICovCithc3NvY2lhdGUJYm9vbGVhbgkJYXNzb2NpYXRlPTAgLyogRG8gTk9UIGF1dG8gYXNzb2NpYXRlICovCitkaXNhYmxlCQlib29sZWFuCQlkaXNhYmxlPTEgLyogRG8gbm90IHBvd2VyIHRoZSBIVyAqLworCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorMy4gU3lzZnMgSGVscGVyIEZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorCitUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZSBkcml2ZXIuICBNYW55IG9mIHRoZSAKK2dlbmVyYWwgY2FwYWJpbGl0aWVzIGFyZSBleHBvc2VkIHRocm91Z2ggdGhlIFdpcmVsZXNzIFRvb2xzIChpd2NvbmZpZykuICBUaGVyZQorYXJlIGEgZmV3IGNhcGFiaWxpdGllcyB0aGF0IGFyZSBleHBvc2VkIHRocm91Z2ggZW50cmllcyBpbiB0aGUgTGludXggU3lzZnMuCisKKworLS0tLS0gRHJpdmVyIExldmVsIC0tLS0tLQorRm9yIHRoZSBkcml2ZXIgbGV2ZWwgZmlsZXMsIGxvb2sgaW4gL3N5cy9idXMvcGNpL2RyaXZlcnMvaXB3MjEwMC8KKworICBkZWJ1Z19sZXZlbCAgCisJCisJVGhpcyBjb250cm9scyB0aGUgc2FtZSBnbG9iYWwgYXMgdGhlICdkZWJ1ZycgbW9kdWxlIHBhcmFtZXRlci4gIEZvciAKKyAgICAgICAgaW5mb3JtYXRpb24gb24gdGhlIHZhcmlvdXMgZGVidWdnaW5nIGxldmVscyBhdmFpbGFibGUsIHJ1biB0aGUgJ2R2YWxzJworCXNjcmlwdCBmb3VuZCBpbiB0aGUgZHJpdmVyIHNvdXJjZSBkaXJlY3RvcnkuCisKKwlOT1RFOiAgJ2RlYnVnX2xldmVsJyBpcyBvbmx5IGVuYWJsZWQgaWYgQ09ORklHX0lQVzIxMDBfREVCVUcgaXMgdHVybgorCSAgICAgICBvbi4KKworLS0tLS0gRGV2aWNlIExldmVsIC0tLS0tLQorRm9yIHRoZSBkZXZpY2UgbGV2ZWwgZmlsZXMgbG9vayBpbgorCQorCS9zeXMvYnVzL3BjaS9kcml2ZXJzL2lwdzIxMDAve1BDSS1JRH0vCisKK0ZvciBleGFtcGxlOgorCS9zeXMvYnVzL3BjaS9kcml2ZXJzL2lwdzIxMDAvMDAwMDowMjowMS4wCisKK0ZvciB0aGUgZGV2aWNlIGxldmVsIGZpbGVzLCBzZWUgL3N5cy9idXMvcGNpL2RyaXZlcnMvaXB3MjEwMDoKKworICByZl9raWxsCisJcmVhZCAtIAorCTAgPSBSRiBraWxsIG5vdCBlbmFibGVkIChyYWRpbyBvbikKKwkxID0gU1cgYmFzZWQgUkYga2lsbCBhY3RpdmUgKHJhZGlvIG9mZikKKwkyID0gSFcgYmFzZWQgUkYga2lsbCBhY3RpdmUgKHJhZGlvIG9mZikKKwkzID0gQm90aCBIVyBhbmQgU1cgUkYga2lsbCBhY3RpdmUgKHJhZGlvIG9mZikKKwl3cml0ZSAtCisJMCA9IElmIFNXIGJhc2VkIFJGIGtpbGwgYWN0aXZlLCB0dXJuIHRoZSByYWRpbyBiYWNrIG9uCisJMSA9IElmIHJhZGlvIGlzIG9uLCBhY3RpdmF0ZSBTVyBiYXNlZCBSRiBraWxsCisKKwlOT1RFOiBJZiB5b3UgZW5hYmxlIHRoZSBTVyBiYXNlZCBSRiBraWxsIGFuZCB0aGVuIHRvZ2dsZSB0aGUgSFcKKyAgCWJhc2VkIFJGIGtpbGwgZnJvbSBPTiAtPiBPRkYgLT4gT04sIHRoZSByYWRpbyB3aWxsIE5PVCBjb21lIGJhY2sgb24KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzQuIFJhZGlvIEtpbGwgU3dpdGNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01vc3QgbGFwdG9wcyBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgdXNlciB0byBwaHlzaWNhbGx5IGRpc2FibGUgdGhlIHJhZGlvLgorU29tZSB2ZW5kb3JzIGhhdmUgaW1wbGVtZW50ZWQgdGhpcyBhcyBhIHBoeXNpY2FsIHN3aXRjaCB0aGF0IHJlcXVpcmVzIG5vCitzb2Z0d2FyZSB0byB0dXJuIHRoZSByYWRpbyBvZmYgYW5kIG9uLiAgT24gb3RoZXIgbGFwdG9wcywgaG93ZXZlciwgdGhlIHN3aXRjaAoraXMgY29udHJvbGxlZCB0aHJvdWdoIGEgYnV0dG9uIGJlaW5nIHByZXNzZWQgYW5kIGEgc29mdHdhcmUgZHJpdmVyIHRoZW4gbWFraW5nCitjYWxscyB0byB0dXJuIHRoZSByYWRpbyBvZmYgYW5kIG9uLiAgVGhpcyBpcyByZWZlcnJlZCB0byBhcyBhICJzb2Z0d2FyZSBiYXNlZAorUkYga2lsbCBzd2l0Y2giCisKK1NlZSB0aGUgU3lzZnMgaGVscGVyIGZpbGUgJ3JmX2tpbGwnIGZvciBkZXRlcm1pbmluZyB0aGUgc3RhdGUgb2YgdGhlIFJGIHN3aXRjaAorb24geW91ciBzeXN0ZW0uCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09Cis1LiBEeW5hbWljIEZpcm13YXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorQXMgdGhlIGZpcm13YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIGEgcmVzdHJpY3RlZCB1c2UgbGljZW5zZSwgaXQgY2FuIG5vdCBiZSAKK2luY2x1ZGVkIHdpdGhpbiB0aGUga2VybmVsIHNvdXJjZXMuICBUbyBlbmFibGUgdGhlIElQVzIxMDAgeW91IHdpbGwgbmVlZCBhIAorZmlybXdhcmUgaW1hZ2UgdG8gbG9hZCBpbnRvIHRoZSB3aXJlbGVzcyBOSUMncyBwcm9jZXNzb3JzLgorCitZb3UgY2FuIG9idGFpbiB0aGVzZSBpbWFnZXMgZnJvbSA8aHR0cDovL2lwdzIxMDAuc2YubmV0L2Zpcm13YXJlLnBocD4uCisKK1NlZSBJTlNUQUxMIGZvciBpbnN0cnVjdGlvbnMgb24gaW5zdGFsbGluZyB0aGUgZmlybXdhcmUuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09Cis2LiBQb3dlciBNYW5hZ2VtZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorVGhlIElQVzIxMDAgc3VwcG9ydHMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFBvd2VyIFNhdmUgUHJvdG9jb2wgCit0aHJvdWdoIGEgcHJpdmF0ZSB3aXJlbGVzcyBleHRlbnNpb24gaW50ZXJmYWNlLiAgVGhlIElQVzIxMDAgc3VwcG9ydHMgCit0aGUgZm9sbG93aW5nIGRpZmZlcmVudCBtb2RlczoKKworCW9mZglObyBwb3dlciBtYW5hZ2VtZW50LiAgUmFkaW8gaXMgYWx3YXlzIG9uLgorCW9uCUF1dG9tYXRpYyBwb3dlciBtYW5hZ2VtZW50CisJMS01CURpZmZlcmVudCBsZXZlbHMgb2YgcG93ZXIgbWFuYWdlbWVudC4gIFRoZSBoaWdoZXIgdGhlIAorCQludW1iZXIgdGhlIGdyZWF0ZXIgdGhlIHBvd2VyIHNhdmluZ3MsIGJ1dCB3aXRoIGFuIGltcGFjdCB0byAKKwkJcGFja2V0IGxhdGVuY2llcy4gCisKK1Bvd2VyIG1hbmFnZW1lbnQgd29ya3MgYnkgcG93ZXJpbmcgZG93biB0aGUgcmFkaW8gYWZ0ZXIgYSBjZXJ0YWluIAoraW50ZXJ2YWwgb2YgdGltZSBoYXMgcGFzc2VkIHdoZXJlIG5vIHBhY2tldHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRoZSAKK3JhZGlvLiAgT25jZSBwb3dlcmVkIGRvd24sIHRoZSByYWRpbyByZW1haW5zIGluIHRoYXQgc3RhdGUgZm9yIGEgZ2l2ZW4gCitwZXJpb2Qgb2YgdGltZS4gIEZvciBoaWdoZXIgcG93ZXIgc2F2aW5ncywgdGhlIGludGVydmFsIGJldHdlZW4gbGFzdCAKK3BhY2tldCBwcm9jZXNzZWQgdG8gc2xlZXAgaXMgc2hvcnRlciBhbmQgdGhlIHNsZWVwIHBlcmlvZCBpcyBsb25nZXIuCisKK1doZW4gdGhlIHJhZGlvIGlzIGFzbGVlcCwgdGhlIGFjY2VzcyBwb2ludCBzZW5kaW5nIGRhdGEgdG8gdGhlIHN0YXRpb24gCittdXN0IGJ1ZmZlciBwYWNrZXRzIGF0IHRoZSBBUCB1bnRpbCB0aGUgc3RhdGlvbiB3YWtlcyB1cCBhbmQgcmVxdWVzdHMgCithbnkgYnVmZmVyZWQgcGFja2V0cy4gIElmIHlvdSBoYXZlIGFuIEFQIHRoYXQgZG9lcyBub3QgY29ycmVjdGx5IHN1cHBvcnQgCit0aGUgUFNQIHByb3RvY29sIHlvdSBtYXkgZXhwZXJpZW5jZSBwYWNrZXQgbG9zcyBvciB2ZXJ5IHBvb3IgcGVyZm9ybWFuY2UgCit3aGlsZSBwb3dlciBtYW5hZ2VtZW50IGlzIGVuYWJsZWQuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB5b3Ugd2lsbCBuZWVkIAordG8gdHJ5IGFuZCBmaW5kIGEgZmlybXdhcmUgdXBkYXRlIGZvciB5b3VyIEFQLCBvciBkaXNhYmxlIHBvd2VyIAorbWFuYWdlbWVudCAodmlhIGBpd2NvbmZpZyBldGgxIHBvd2VyIG9mZmApCisKK1RvIGNvbmZpZ3VyZSB0aGUgcG93ZXIgbGV2ZWwgb24gdGhlIElQVzIxMDAgeW91IHVzZSBhIGNvbWJpbmF0aW9uIG9mIAoraXdjb25maWcgYW5kIGl3cHJpdi4gIGl3Y29uZmlnIGlzIHVzZWQgdG8gdHVybiBwb3dlciBtYW5hZ2VtZW50IG9uLCBvZmYsIAorYW5kIHNldCBpdCB0byBhdXRvLgorCisJaXdjb25maWcgZXRoMSBwb3dlciBvZmYgICAgRGlzYWJsZXMgcmFkaW8gcG93ZXIgZG93bgorCWl3Y29uZmlnIGV0aDEgcG93ZXIgb24gICAgIEVuYWJsZXMgcmFkaW8gcG93ZXIgbWFuYWdlbWVudCB0byAKKwkJCQkgICBsYXN0IHNldCBsZXZlbCAoZGVmYXVsdHMgdG8gQVVUTykKKwlpd3ByaXYgZXRoMSBzZXRfcG93ZXIgMCAgICBTZXRzIHBvd2VyIGxldmVsIHRvIEFVVE8gYW5kIGVuYWJsZXMgCisJCQkJICAgcG93ZXIgbWFuYWdlbWVudCBpZiBub3QgcHJldmlvdXNseSAKKwkJCQkgICBlbmFibGVkLgorCWl3cHJpdiBldGgxIHNldF9wb3dlciAxLTUgIFNldCB0aGUgcG93ZXIgbGV2ZWwgYXMgc3BlY2lmaWVkLCAKKwkJCQkgICBlbmFibGluZyBwb3dlciBtYW5hZ2VtZW50IGlmIG5vdCAKKwkJCQkgICBwcmV2aW91c2x5IGVuYWJsZWQuCisKK1lvdSBjYW4gdmlldyB0aGUgY3VycmVudCBwb3dlciBsZXZlbCBzZXR0aW5nIHZpYToKKwkKKwlpd3ByaXYgZXRoMSBnZXRfcG93ZXIKKworSXQgd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQgcGVyaW9kIG9yIHRpbWVvdXQgdGhhdCBpcyBjb25maWd1cmVkIGFzIGEgc3RyaW5nCitpbiB0aGUgZm9ybSBvZiB4eHh4L3l5eXkgKHopIHdoZXJlIHh4eHggaXMgdGhlIHRpbWVvdXQgaW50ZXJ2YWwgKGFtb3VudCBvZgordGltZSBhZnRlciBwYWNrZXQgcHJvY2Vzc2luZyksIHl5eXkgaXMgdGhlIHBlcmlvZCB0byBzbGVlcCAoYW1vdW50IG9mIHRpbWUgdG8gCit3YWl0IGJlZm9yZSBwb3dlcmluZyB0aGUgcmFkaW8gYW5kIHF1ZXJ5aW5nIHRoZSBhY2Nlc3MgcG9pbnQgZm9yIGJ1ZmZlcmVkCitwYWNrZXRzKSwgYW5kIHogaXMgdGhlICdwb3dlciBsZXZlbCcuICBJZiBwb3dlciBtYW5hZ2VtZW50IGlzIHR1cm5lZCBvZmYgdGhlCit4eHh4L3l5eXkgd2lsbCBiZSByZXBsYWNlZCB3aXRoICdvZmYnIC0tIHRoZSBsZXZlbCByZXBvcnRlZCB3aWxsIGJlIHRoZSBhY3RpdmUKK2xldmVsIGlmIGBpd2NvbmZpZyBldGgxIHBvd2VyIG9uYCBpcyBpbnZva2VkLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorNy4gU3VwcG9ydAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKworRm9yIGdlbmVyYWwgZGV2ZWxvcG1lbnQgaW5mb3JtYXRpb24gYW5kIHN1cHBvcnQsCitnbyB0bzoKKwkKKyAgICBodHRwOi8vaXB3MjEwMC5zZi5uZXQvCisKK1RoZSBpcHcyMTAwIDEuMS4wIGRyaXZlciBhbmQgZmlybXdhcmUgY2FuIGJlIGRvd25sb2FkZWQgZnJvbTogIAorCisgICAgaHR0cDovL3N1cHBvcnQuaW50ZWwuY29tCisKK0ZvciBpbnN0YWxsYXRpb24gc3VwcG9ydCBvbiB0aGUgaXB3MjEwMCAxLjEuMCBkcml2ZXIgb24gTGludXgga2VybmVscyAKKzIuNi44IG9yIGdyZWF0ZXIsIGVtYWlsIHN1cHBvcnQgaXMgYXZhaWxhYmxlIGZyb206ICAKKworICAgIGh0dHA6Ly9zdXBwb3J0bWFpbC5pbnRlbC5jb20KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09Cis4LiBMaWNlbnNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorCisgIENvcHlyaWdodChjKSAyMDAzIC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodmVyc2lvbiAyKSBhcyAKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBMaWNlbnNlIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvUkVBRE1FLmlwdzIyMDAgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvUkVBRE1FLmlwdzIyMDAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxNjA4MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9SRUFETUUuaXB3MjIwMApAQCAtMCwwICsxLDMwMCBAQAorCitJbnRlbChSKSBQUk8vV2lyZWxlc3MgMjkxNUFCRyBEcml2ZXIgZm9yIExpbnV4IGluIHN1cHBvcnQgb2Y6CisKK0ludGVsKFIpIFBSTy9XaXJlbGVzcyAyMjAwQkcgTmV0d29yayBDb25uZWN0aW9uIAorSW50ZWwoUikgUFJPL1dpcmVsZXNzIDI5MTVBQkcgTmV0d29yayBDb25uZWN0aW9uIAorCitOb3RlOiBUaGUgSW50ZWwoUikgUFJPL1dpcmVsZXNzIDI5MTVBQkcgRHJpdmVyIGZvciBMaW51eCBhbmQgSW50ZWwoUikgCitQUk8vV2lyZWxlc3MgMjIwMEJHIERyaXZlciBmb3IgTGludXggaXMgYSB1bmlmaWVkIGRyaXZlciB0aGF0IHdvcmtzIG9uIAorYm90aCBoYXJkd2FyZSBhZGFwdGVycyBsaXN0ZWQgYWJvdmUuIEluIHRoaXMgZG9jdW1lbnQgdGhlIEludGVsKFIpIAorUFJPL1dpcmVsZXNzIDI5MTVBQkcgRHJpdmVyIGZvciBMaW51eCB3aWxsIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSAKK3VuaWZpZWQgZHJpdmVyLgorCitDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSwgSW50ZWwgQ29ycG9yYXRpb24KKworUkVBRE1FLmlwdzIyMDAKKworVmVyc2lvbjogMS4wLjAKK0RhdGUgICA6IEphbnVhcnkgMzEsIDIwMDUKKworCitJbmRleAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEuICAgSW50cm9kdWN0aW9uCisxLjEuIE92ZXJ2aWV3IG9mIGZlYXR1cmVzCisxLjIuIE1vZHVsZSBwYXJhbWV0ZXJzCisxLjMuIFdpcmVsZXNzIEV4dGVuc2lvbiBQcml2YXRlIE1ldGhvZHMKKzEuNC4gU3lzZnMgSGVscGVyIEZpbGVzCisyLiAgIEFib3V0IHRoZSBWZXJzaW9uIE51bWJlcnMKKzMuICAgU3VwcG9ydAorNC4gICBMaWNlbnNlCisKKworMS4gICBJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGF0dGVtcHQgdG8gcHJvdmlkZSBhIGJyaWVmIGludHJvZHVjdGlvbiB0byB1c2luZyAKK3RoZSBJbnRlbChSKSBQUk8vV2lyZWxlc3MgMjkxNUFCRyBEcml2ZXIgZm9yIExpbnV4LgorCitUaGlzIGRvY3VtZW50IGlzIG5vdCBtZWFudCB0byBiZSBhIGNvbXByZWhlbnNpdmUgbWFudWFsIG9uIAordW5kZXJzdGFuZGluZyBvciB1c2luZyB3aXJlbGVzcyB0ZWNobm9sb2dpZXMsIGJ1dCBzaG91bGQgYmUgc3VmZmljaWVudCAKK3RvIGdldCB5b3UgbW92aW5nIHdpdGhvdXQgd2lyZXMgb24gTGludXguCisKK0ZvciBpbmZvcm1hdGlvbiBvbiBidWlsZGluZyBhbmQgaW5zdGFsbGluZyB0aGUgZHJpdmVyLCBzZWUgdGhlIElOU1RBTEwKK2ZpbGUuCisKKworMS4xLiBPdmVydmlldyBvZiBGZWF0dXJlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBjdXJyZW50IHJlbGVhc2UgKDEuMC4wKSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOgorCisrIEJTUyBtb2RlIChJbmZyYXN0cnVjdHVyZSwgTWFuYWdlZCkKKysgSUJTUyBtb2RlIChBZC1Ib2MpCisrIFdFUCAoT1BFTiBhbmQgU0hBUkVEIEtFWSBtb2RlKQorKyA4MDIuMXggRUFQIHZpYSB3cGFfc3VwcGxpY2FudCBhbmQgeHN1cHBsaWNhbnQKKysgV2lyZWxlc3MgRXh0ZW5zaW9uIHN1cHBvcnQgCisrIEZ1bGwgQiBhbmQgRyByYXRlIHN1cHBvcnQgKDIyMDAgYW5kIDI5MTUpCisrIEZ1bGwgQSByYXRlIHN1cHBvcnQgKDI5MTUgb25seSkKKysgVHJhbnNtaXQgcG93ZXIgY29udHJvbAorKyBTIHN0YXRlIHN1cHBvcnQgKEFDUEkgc3VzcGVuZC9yZXN1bWUpCisrIGxvbmcvc2hvcnQgcHJlYW1ibGUgc3VwcG9ydAorCisKKworMS4yLiBDb21tYW5kIExpbmUgUGFyYW1ldGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGlrZSBtYW55IG1vZHVsZXMgdXNlZCBpbiB0aGUgTGludXgga2VybmVsLCB0aGUgSW50ZWwoUikgUFJPL1dpcmVsZXNzIAorMjkxNUFCRyBEcml2ZXIgZm9yIExpbnV4IGFsbG93cyBjZXJ0YWluIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBiZSAKK3Byb3ZpZGVkIGFzIG1vZHVsZSBwYXJhbWV0ZXJzLiAgVGhlIG1vc3QgY29tbW9uIHdheSB0byBzcGVjaWZ5IGEgbW9kdWxlIAorcGFyYW1ldGVyIGlzIHZpYSB0aGUgY29tbWFuZCBsaW5lLiAgCisKK1RoZSBnZW5lcmFsIGZvcm0gaXM6CisKKyUgbW9kcHJvYmUgaXB3MjIwMCBwYXJhbWV0ZXI9dmFsdWUKKworV2hlcmUgdGhlIHN1cHBvcnRlZCBwYXJhbWV0ZXIgYXJlOgorCisgIGFzc29jaWF0ZQorCVNldCB0byAwIHRvIGRpc2FibGUgdGhlIGF1dG8gc2Nhbi1hbmQtYXNzb2NpYXRlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlCisJZHJpdmVyLiAgSWYgZGlzYWJsZWQsIHRoZSBkcml2ZXIgd2lsbCBub3QgYXR0ZW1wdCB0byBzY2FuIAorCWZvciBhbmQgYXNzb2NpYXRlIHRvIGEgbmV0d29yayB1bnRpbCBpdCBoYXMgYmVlbiBjb25maWd1cmVkIHdpdGggCisJb25lIG9yIG1vcmUgcHJvcGVydGllcyBmb3IgdGhlIHRhcmdldCBuZXR3b3JrLCBmb3IgZXhhbXBsZSBjb25maWd1cmluZyAKKwl0aGUgbmV0d29yayBTU0lELiAgRGVmYXVsdCBpcyAxIChhdXRvLWFzc29jaWF0ZSkKKwkKKwlFeGFtcGxlOiAlIG1vZHByb2JlIGlwdzIyMDAgYXNzb2NpYXRlPTAKKworICBhdXRvX2NyZWF0ZQorCVNldCB0byAwIHRvIGRpc2FibGUgdGhlIGF1dG8gY3JlYXRpb24gb2YgYW4gQWQtSG9jIG5ldHdvcmsgCisJbWF0Y2hpbmcgdGhlIGNoYW5uZWwgYW5kIG5ldHdvcmsgbmFtZSBwYXJhbWV0ZXJzIHByb3ZpZGVkLiAgCisJRGVmYXVsdCBpcyAxLgorCisgIGNoYW5uZWwKKwljaGFubmVsIG51bWJlciBmb3IgYXNzb2NpYXRpb24uICBUaGUgbm9ybWFsIG1ldGhvZCBmb3Igc2V0dGluZworICAgICAgICB0aGUgY2hhbm5lbCB3b3VsZCBiZSB0byB1c2UgdGhlIHN0YW5kYXJkIHdpcmVsZXNzIHRvb2xzCisgICAgICAgIChpLmUuIGBpd2NvbmZpZyBldGgxIGNoYW5uZWwgMTBgKSwgYnV0IGl0IGlzIHVzZWZ1bCBzb21ldGltZXMKKwl0byBzZXQgdGhpcyB3aGlsZSBkZWJ1Z2dpbmcuICBDaGFubmVsIDAgbWVhbnMgJ0FOWScKKworICBkZWJ1ZworCUlmIHVzaW5nIGEgZGVidWcgYnVpbGQsIHRoaXMgaXMgdXNlZCB0byBjb250cm9sIHRoZSBhbW91bnQgb2YgZGVidWcKKwlpbmZvIGlzIGxvZ2dlZC4gIFNlZSB0aGUgJ2R2YWwnIGFuZCAnbG9hZCcgc2NyaXB0IGZvciBtb3JlIGluZm8gb24KKwlob3cgdG8gdXNlIHRoaXMgKHRoZSBkdmFsIGFuZCBsb2FkIHNjcmlwdHMgYXJlIHByb3ZpZGVkIGFzIHBhcnQgCisJb2YgdGhlIGlwdzIyMDAgZGV2ZWxvcG1lbnQgc25hcHNob3QgcmVsZWFzZXMgYXZhaWxhYmxlIGZyb20gdGhlIAorCVNvdXJjZUZvcmdlIHByb2plY3QgYXQgaHR0cDovL2lwdzIyMDAuc2YubmV0KQorCisgIG1vZGUKKwlDYW4gYmUgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQgbW9kZSBvZiB0aGUgYWRhcHRlci4gIAorCTAgPSBNYW5hZ2VkLCAxID0gQWQtSG9jCisKKworMS4zLiBXaXJlbGVzcyBFeHRlbnNpb24gUHJpdmF0ZSBNZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcyBhbiBpbnRlcmZhY2UgZGVzaWduZWQgdG8gaGFuZGxlIGdlbmVyaWMgaGFyZHdhcmUsIHRoZXJlIGFyZSBjZXJ0YWluIAorY2FwYWJpbGl0aWVzIG5vdCBleHBvc2VkIHRocm91Z2ggdGhlIG5vcm1hbCBXaXJlbGVzcyBUb29sIGludGVyZmFjZS4gIEFzIAorc3VjaCwgYSBwcm92aXNpb24gaXMgcHJvdmlkZWQgZm9yIGEgZHJpdmVyIHRvIGRlY2xhcmUgY3VzdG9tLCBvciAKK3ByaXZhdGUsIG1ldGhvZHMuICBUaGUgSW50ZWwoUikgUFJPL1dpcmVsZXNzIDI5MTVBQkcgRHJpdmVyIGZvciBMaW51eCAKK2RlZmluZXMgc2V2ZXJhbCBvZiB0aGVzZSB0byBjb25maWd1cmUgdmFyaW91cyBzZXR0aW5ncy4KKworVGhlIGdlbmVyYWwgZm9ybSBvZiB1c2luZyB0aGUgcHJpdmF0ZSB3aXJlbGVzcyBtZXRob2RzIGlzOgorCisJJSBpd3ByaXYgJElGTkFNRSBtZXRob2QgcGFyYW1ldGVycworCitXaGVyZSAkSUZOQU1FIGlzIHRoZSBpbnRlcmZhY2UgbmFtZSB0aGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCAKKyh0eXBpY2FsbHkgZXRoMSwgY3VzdG9taXplZCB2aWEgb25lIG9mIHRoZSB2YXJpb3VzIG5ldHdvcmsgaW50ZXJmYWNlCituYW1lIG1hbmFnZXJzLCBzdWNoIGFzIGlmcmVuYW1lKQorCitUaGUgc3VwcG9ydGVkIHByaXZhdGUgbWV0aG9kcyBhcmU6CisKKyAgZ2V0X21vZGUKKwlDYW4gYmUgdXNlZCB0byByZXBvcnQgb3V0IHdoaWNoIElFRUUgbW9kZSB0aGUgZHJpdmVyIGlzIAorCWNvbmZpZ3VyZWQgdG8gc3VwcG9ydC4gIEV4YW1wbGU6CisJCisJJSBpd3ByaXYgZXRoMSBnZXRfbW9kZQorCWV0aDEJZ2V0X21vZGU6ODAyLjExYmcgKDYpCisKKyAgc2V0X21vZGUKKwlDYW4gYmUgdXNlZCB0byBjb25maWd1cmUgd2hpY2ggSUVFRSBtb2RlIHRoZSBkcml2ZXIgd2lsbCAKKwlzdXBwb3J0LiAgCisKKwlVc2FnZToKKwklIGl3cHJpdiBldGgxIHNldF9tb2RlIHttb2RlfQorCVdoZXJlIHttb2RlfSBpcyBhIG51bWJlciBpbiB0aGUgcmFuZ2UgMS03OgorCTEJODAyLjExYSAoMjkxNSBvbmx5KQorCTIJODAyLjExYgorCTMJODAyLjExYWIgKDI5MTUgb25seSkKKwk0CTgwMi4xMWcgCisJNQk4MDIuMTFhZyAoMjkxNSBvbmx5KQorCTYJODAyLjExYmcKKwk3CTgwMi4xMWFiZyAoMjkxNSBvbmx5KQorCisgIGdldF9wcmVhbWJsZQorCUNhbiBiZSB1c2VkIHRvIHJlcG9ydCBjb25maWd1cmF0aW9uIG9mIHByZWFtYmxlIGxlbmd0aC4KKworICBzZXRfcHJlYW1ibGUKKwlDYW4gYmUgdXNlZCB0byBzZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgcHJlYW1ibGUgbGVuZ3RoOgorCisJVXNhZ2U6CisJJSBpd3ByaXYgZXRoMSBzZXRfcHJlYW1ibGUge21vZGV9CisJV2hlcmUge21vZGV9IGlzIG9uZSBvZjoKKwkxCUxvbmcgcHJlYW1ibGUgb25seQorCTAJQXV0byAobG9uZyBvciBzaG9ydCBiYXNlZCBvbiBjb25uZWN0aW9uKQorCQorCisxLjQuIFN5c2ZzIEhlbHBlciBGaWxlczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBMaW51eCBrZXJuZWwgcHJvdmlkZXMgYSBwc2V1ZG8gZmlsZSBzeXN0ZW0gdGhhdCBjYW4gYmUgdXNlZCB0byAKK2FjY2VzcyB2YXJpb3VzIGNvbXBvbmVudHMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBUaGUgSW50ZWwoUikgCitQUk8vV2lyZWxlc3MgMjkxNUFCRyBEcml2ZXIgZm9yIExpbnV4IGV4cG9zZXMgc2V2ZXJhbCBjb25maWd1cmF0aW9uIAorcGFyYW1ldGVycyB0aHJvdWdoIHRoaXMgbWVjaGFuaXNtLgorCitBbiBlbnRyeSBpbiB0aGUgc3lzZnMgY2FuIHN1cHBvcnQgcmVhZGluZyBhbmQvb3Igd3JpdGluZy4gIFlvdSBjYW4gCit0eXBpY2FsbHkgcXVlcnkgdGhlIGNvbnRlbnRzIG9mIGEgc3lzZnMgZW50cnkgdGhyb3VnaCB0aGUgdXNlIG9mIGNhdCwgCithbmQgY2FuIHNldCB0aGUgY29udGVudHMgdmlhIGVjaG8uICBGb3IgZXhhbXBsZToKKworJSBjYXQgL3N5cy9idXMvcGNpL2RyaXZlcnMvaXB3MjIwMC9kZWJ1Z19sZXZlbAorCitXaWxsIHJlcG9ydCB0aGUgY3VycmVudCBkZWJ1ZyBsZXZlbCBvZiB0aGUgZHJpdmVyJ3MgbG9nZ2luZyBzdWJzeXN0ZW0gCisob25seSBhdmFpbGFibGUgaWYgQ09ORklHX0lQV19ERUJVRyB3YXMgY29uZmlndXJlZCB3aGVuIHRoZSBkcml2ZXIgd2FzIAorYnVpbHQpLgorCitZb3UgY2FuIHNldCB0aGUgZGVidWcgbGV2ZWwgdmlhOgorCislIGVjaG8gJFZBTFVFID4gL3N5cy9idXMvcGNpL2RyaXZlcnMvaXB3MjIwMC9kZWJ1Z19sZXZlbAorCitXaGVyZSAkVkFMVUUgd291bGQgYmUgYSBudW1iZXIgaW4gdGhlIGNhc2Ugb2YgdGhpcyBzeXNmcyBlbnRyeS4gIFRoZSAKK2lucHV0IHRvIHN5c2ZzIGZpbGVzIGRvZXMgbm90IGhhdmUgdG8gYmUgYSBudW1iZXIuICBGb3IgZXhhbXBsZSwgdGhlIAorZmlybXdhcmUgbG9hZGVyIHVzZWQgYnkgaG90cGx1ZyB1dGlsaXplcyBzeXNmcyBlbnRyaWVzIGZvciB0cmFuc2ZlcnJpbmcgCit0aGUgZmlybXdhcmUgaW1hZ2UgZnJvbSB1c2VyIHNwYWNlIGludG8gdGhlIGRyaXZlci4KKworVGhlIEludGVsKFIpIFBSTy9XaXJlbGVzcyAyOTE1QUJHIERyaXZlciBmb3IgTGludXggZXhwb3NlcyBzeXNmcyBlbnRyaWVzIAorYXQgdHdvIGxldmVscyAtLSBkcml2ZXIgbGV2ZWwsIHdoaWNoIGFwcGx5IHRvIGFsbCBpbnN0YW5jZXMgb2YgdGhlIAorZHJpdmVyIChpbiB0aGUgZXZlbnQgdGhhdCB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBkZXZpY2UgaW5zdGFsbGVkKSBhbmQgCitkZXZpY2UgbGV2ZWwsIHdoaWNoIGFwcGxpZXMgb25seSB0byB0aGUgc2luZ2xlIHNwZWNpZmljIGluc3RhbmNlLgorCisKKzEuNC4xIERyaXZlciBMZXZlbCBTeXNmcyBIZWxwZXIgRmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZvciB0aGUgZHJpdmVyIGxldmVsIGZpbGVzLCBsb29rIGluIC9zeXMvYnVzL3BjaS9kcml2ZXJzL2lwdzIyMDAvCisKKyAgZGVidWdfbGV2ZWwgIAorCQorCVRoaXMgY29udHJvbHMgdGhlIHNhbWUgZ2xvYmFsIGFzIHRoZSAnZGVidWcnIG1vZHVsZSBwYXJhbWV0ZXIKKworCisxLjQuMiBEZXZpY2UgTGV2ZWwgU3lzZnMgSGVscGVyIEZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGb3IgdGhlIGRldmljZSBsZXZlbCBmaWxlcywgbG9vayBpbgorCQorCS9zeXMvYnVzL3BjaS9kcml2ZXJzL2lwdzIyMDAve1BDSS1JRH0vCisKK0ZvciBleGFtcGxlOgorCS9zeXMvYnVzL3BjaS9kcml2ZXJzL2lwdzIyMDAvMDAwMDowMjowMS4wCisKK0ZvciB0aGUgZGV2aWNlIGxldmVsIGZpbGVzLCBzZWUgL3N5cy9idXMvcGNpL1tkcml2ZXJzL2lwdzIyMDA6CisKKyAgcmZfa2lsbAorCXJlYWQgLSAKKwkwID0gUkYga2lsbCBub3QgZW5hYmxlZCAocmFkaW8gb24pCisJMSA9IFNXIGJhc2VkIFJGIGtpbGwgYWN0aXZlIChyYWRpbyBvZmYpCisJMiA9IEhXIGJhc2VkIFJGIGtpbGwgYWN0aXZlIChyYWRpbyBvZmYpCisJMyA9IEJvdGggSFcgYW5kIFNXIFJGIGtpbGwgYWN0aXZlIChyYWRpbyBvZmYpCisJd3JpdGUgLQorCTAgPSBJZiBTVyBiYXNlZCBSRiBraWxsIGFjdGl2ZSwgdHVybiB0aGUgcmFkaW8gYmFjayBvbgorCTEgPSBJZiByYWRpbyBpcyBvbiwgYWN0aXZhdGUgU1cgYmFzZWQgUkYga2lsbAorCisJTk9URTogSWYgeW91IGVuYWJsZSB0aGUgU1cgYmFzZWQgUkYga2lsbCBhbmQgdGhlbiB0b2dnbGUgdGhlIEhXCisgIAliYXNlZCBSRiBraWxsIGZyb20gT04gLT4gT0ZGIC0+IE9OLCB0aGUgcmFkaW8gd2lsbCBOT1QgY29tZSBiYWNrIG9uCisJCisgIHVjb2RlIAorCXJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIHVjb2RlIHZlcnNpb24gbnVtYmVyCisKKworMi4gICBBYm91dCB0aGUgVmVyc2lvbiBOdW1iZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEdWUgdG8gdGhlIG5hdHVyZSBvZiBvcGVuIHNvdXJjZSBkZXZlbG9wbWVudCBwcm9qZWN0cywgdGhlcmUgYXJlIAorZnJlcXVlbnRseSBjaGFuZ2VzIGJlaW5nIGluY29ycG9yYXRlZCB0aGF0IGhhdmUgbm90IGdvbmUgdGhyb3VnaCAKK2EgY29tcGxldGUgdmFsaWRhdGlvbiBwcm9jZXNzLiAgVGhlc2UgY2hhbmdlcyBhcmUgaW5jb3Jwb3JhdGVkIGludG8gCitkZXZlbG9wbWVudCBzbmFwc2hvdCByZWxlYXNlcy4KKworUmVsZWFzZXMgYXJlIG51bWJlcmVkIHdpdGggYSB0aHJlZSBsZXZlbCBzY2hlbWU6IAorCisJbWFqb3IubWlub3IuZGV2ZWxvcG1lbnQKKworQW55IHZlcnNpb24gd2hlcmUgdGhlICdkZXZlbG9wbWVudCcgcG9ydGlvbiBpcyAwIChmb3IgZXhhbXBsZQorMS4wLjAsIDEuMS4wLCBldGMuKSBpbmRpY2F0ZXMgYSBzdGFibGUgdmVyc2lvbiB0aGF0IHdpbGwgYmUgbWFkZSAKK2F2YWlsYWJsZSBmb3Iga2VybmVsIGluY2x1c2lvbi4KKworQW55IHZlcnNpb24gd2hlcmUgdGhlICdkZXZlbG9wbWVudCcgcG9ydGlvbiBpcyBub3QgYSAwIChmb3IKK2V4YW1wbGUgMS4wLjEsIDEuMS41LCBldGMuKSBpbmRpY2F0ZXMgYSBkZXZlbG9wbWVudCB2ZXJzaW9uIHRoYXQgaXMKK2JlaW5nIG1hZGUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nIGFuZCBjdXR0aW5nIGVkZ2UgdXNlcnMuICBUaGUgc3RhYmlsaXR5IAorYW5kIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRldmVsb3BtZW50IHJlbGVhc2VzIGFyZSBub3Qga25vdy4gIFdlIG1ha2UKK2VmZm9ydHMgdG8gdHJ5IGFuZCBrZWVwIGFsbCBzbmFwc2hvdHMgcmVhc29uYWJseSBzdGFibGUsIGJ1dCBkdWUgdG8gdGhlCitmcmVxdWVuY3kgb2YgdGhlaXIgcmVsZWFzZSwgYW5kIHRoZSBkZXNpcmUgdG8gZ2V0IHRob3NlIHJlbGVhc2VzIAorYXZhaWxhYmxlIGFzIHF1aWNrbHkgYXMgcG9zc2libGUsIHVua25vd24gYW5vbWFsaWVzIHNob3VsZCBiZSBleHBlY3RlZC4KKworVGhlIG1ham9yIHZlcnNpb24gbnVtYmVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgd2hlbiBzaWduaWZpY2FudCBjaGFuZ2VzCithcmUgbWFkZSB0byB0aGUgZHJpdmVyLiAgQ3VycmVudGx5LCB0aGVyZSBhcmUgbm8gbWFqb3IgY2hhbmdlcyBwbGFubmVkLgorCisKKzMuICBTdXBwb3J0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGb3IgaW5zdGFsbGF0aW9uIHN1cHBvcnQgb2YgdGhlIDEuMC4wIHZlcnNpb24sIHlvdSBjYW4gY29udGFjdCAKK2h0dHA6Ly9zdXBwb3J0bWFpbC5pbnRlbC5jb20sIG9yIHlvdSBjYW4gdXNlIHRoZSBvcGVuIHNvdXJjZSBwcm9qZWN0IAorc3VwcG9ydC4KKworRm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gYW5kIHN1cHBvcnQsIGdvIHRvOgorCQorICAgIGh0dHA6Ly9pcHcyMjAwLnNmLm5ldC8KKworCis0LiAgTGljZW5zZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIAorICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9ib25kaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9ib25kaW5nLnR4dAppbmRleCAyNGQwMjk0Li5hNTVmMGY5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYm9uZGluZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0CkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogCiAJSWYgcnVubmluZyBTTk1QIGFnZW50cywgdGhlIGJvbmRpbmcgZHJpdmVyIHNob3VsZCBiZSBsb2FkZWQKIGJlZm9yZSBhbnkgbmV0d29yayBkcml2ZXJzIHBhcnRpY2lwYXRpbmcgaW4gYSBib25kLiAgVGhpcyByZXF1aXJlbWVudAotaXMgZHVlIHRvIHRoZSB0aGUgaW50ZXJmYWNlIGluZGV4IChpcEFkRW50SWZJbmRleCkgYmVpbmcgYXNzb2NpYXRlZCB0bworaXMgZHVlIHRvIHRoZSBpbnRlcmZhY2UgaW5kZXggKGlwQWRFbnRJZkluZGV4KSBiZWluZyBhc3NvY2lhdGVkIHRvCiB0aGUgZmlyc3QgaW50ZXJmYWNlIGZvdW5kIHdpdGggYSBnaXZlbiBJUCBhZGRyZXNzLiAgVGhhdCBpcywgdGhlcmUgaXMKIG9ubHkgb25lIGlwQWRFbnRJZkluZGV4IGZvciBlYWNoIElQIGFkZHJlc3MuICBGb3IgZXhhbXBsZSwgaWYgZXRoMCBhbmQKIGV0aDEgYXJlIHNsYXZlcyBvZiBib25kMCBhbmQgdGhlIGRyaXZlciBmb3IgZXRoMCBpcyBsb2FkZWQgYmVmb3JlIHRoZQpAQCAtMTkzNyw3ICsxOTM3LDcgQEAKIAlJZiBub3QgZXhwbGljaXRseSBjb25maWd1cmVkICh3aXRoIGlmY29uZmlnIG9yIGlwIGxpbmspLCB0aGUKIE1BQyBhZGRyZXNzIG9mIHRoZSBib25kaW5nIGRldmljZSBpcyB0YWtlbiBmcm9tIGl0cyBmaXJzdCBzbGF2ZQogZGV2aWNlLiAgVGhpcyBNQUMgYWRkcmVzcyBpcyB0aGVuIHBhc3NlZCB0byBhbGwgZm9sbG93aW5nIHNsYXZlcyBhbmQKLXJlbWFpbnMgcGVyc2lzdGVudCAoZXZlbiBpZiB0aGUgdGhlIGZpcnN0IHNsYXZlIGlzIHJlbW92ZWQpIHVudGlsIHRoZQorcmVtYWlucyBwZXJzaXN0ZW50IChldmVuIGlmIHRoZSBmaXJzdCBzbGF2ZSBpcyByZW1vdmVkKSB1bnRpbCB0aGUKIGJvbmRpbmcgZGV2aWNlIGlzIGJyb3VnaHQgZG93biBvciByZWNvbmZpZ3VyZWQuCiAKIAlJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIE1BQyBhZGRyZXNzLCB5b3UgY2FuIHNldCBpdCB3aXRoCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3hnYi50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3hnYi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzMjQ2MwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9jeGdiLnR4dApAQCAtMCwwICsxLDM1MiBAQAorICAgICAgICAgICAgICAgICBDaGVsc2lvIE4yMTAgMTBHYiBFdGhlcm5ldCBOZXR3b3JrIENvbnRyb2xsZXIKKworICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBSZWxlYXNlIE5vdGVzIGZvciBMaW51eAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMS4xCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1bmUgMjAsIDIwMDUKKworQ09OVEVOVFMKKz09PT09PT09CisgSU5UUk9EVUNUSU9OCisgRkVBVFVSRVMKKyBQRVJGT1JNQU5DRQorIERSSVZFUiBNRVNTQUdFUworIEtOT1dOIElTU1VFUworIFNVUFBPUlQKKworCitJTlRST0RVQ1RJT04KKz09PT09PT09PT09PQorCisgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIExpbnV4IGRyaXZlciBmb3IgQ2hlbHNpbyAxMEdiIEV0aGVybmV0IE5ldHdvcmsKKyBDb250cm9sbGVyLiBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgQ2hlbHNpbyBOMjEwIE5JQyBhbmQgaXMgYmFja3dhcmQKKyBjb21wYXRpYmxlIHdpdGggdGhlIENoZWxzaW8gTjExMCBtb2RlbCAxMEdiIE5JQ3MuCisKKworRkVBVFVSRVMKKz09PT09PT09CisKKyBBZGFwdGl2ZSBJbnRlcnJ1cHRzIChhZGFwdGl2ZS1yeCkKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBUaGlzIGZlYXR1cmUgcHJvdmlkZXMgYW4gYWRhcHRpdmUgYWxnb3JpdGhtIHRoYXQgYWRqdXN0cyB0aGUgaW50ZXJydXB0CisgIGNvYWxlc2NpbmcgcGFyYW1ldGVycywgYWxsb3dpbmcgdGhlIGRyaXZlciB0byBkeW5hbWljYWxseSBhZGFwdCB0aGUgbGF0ZW5jeQorICBzZXR0aW5ncyB0byBhY2hpZXZlIHRoZSBoaWdoZXN0IHBlcmZvcm1hbmNlIGR1cmluZyB2YXJpb3VzIHR5cGVzIG9mIG5ldHdvcmsKKyAgbG9hZC4KKworICBUaGUgaW50ZXJmYWNlIHVzZWQgdG8gY29udHJvbCB0aGlzIGZlYXR1cmUgaXMgZXRodG9vbC4gUGxlYXNlIHNlZSB0aGUKKyAgZXRodG9vbCBtYW5wYWdlIGZvciBhZGRpdGlvbmFsIHVzYWdlIGluZm9ybWF0aW9uLgorCisgIEJ5IGRlZmF1bHQsIGFkYXB0aXZlLXJ4IGlzIGRpc2FibGVkLgorICBUbyBlbmFibGUgYWRhcHRpdmUtcng6CisKKyAgICAgIGV0aHRvb2wgLUMgPGludGVyZmFjZT4gYWRhcHRpdmUtcnggb24KKworICBUbyBkaXNhYmxlIGFkYXB0aXZlLXJ4LCB1c2UgZXRodG9vbDoKKworICAgICAgZXRodG9vbCAtQyA8aW50ZXJmYWNlPiBhZGFwdGl2ZS1yeCBvZmYKKworICBBZnRlciBkaXNhYmxpbmcgYWRhcHRpdmUtcngsIHRoZSB0aW1lciBsYXRlbmN5IHZhbHVlIHdpbGwgYmUgc2V0IHRvIDUwdXMuCisgIFlvdSBtYXkgc2V0IHRoZSB0aW1lciBsYXRlbmN5IGFmdGVyIGRpc2FibGluZyBhZGFwdGl2ZS1yeDoKKworICAgICAgZXRodG9vbCAtQyA8aW50ZXJmYWNlPiByeC11c2VjcyA8bWljcm9zZWNvbmRzPgorCisgIEFuIGV4YW1wbGUgdG8gc2V0IHRoZSB0aW1lciBsYXRlbmN5IHZhbHVlIHRvIDEwMHVzIG9uIGV0aDA6CisKKyAgICAgIGV0aHRvb2wgLUMgZXRoMCByeC11c2VjcyAxMDAKKworICBZb3UgbWF5IGFsc28gcHJvdmlkZSBhIHRpbWVyIGxhdGVuY3kgdmFsdWUgd2hpbGUgZGlzYWJsaW5nIGFkcGF0aXZlLXJ4OgorCisgICAgICBldGh0b29sIC1DIDxpbnRlcmZhY2U+IGFkYXB0aXZlLXJ4IG9mZiByeC11c2VjcyA8bWljcm9zZWNvbmRzPgorCisgIElmIGFkYXB0aXZlLXJ4IGlzIGRpc2FibGVkIGFuZCBhIHRpbWVyIGxhdGVuY3kgdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGUgdGltZXIKKyAgd2lsbCBiZSBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSB1bnRpbCBjaGFuZ2VkIGJ5IHRoZSB1c2VyIG9yIHVudGlsCisgIGFkYXB0aXZlLXJ4IGlzIGVuYWJsZWQuCisKKyAgVG8gdmlldyB0aGUgc3RhdHVzIG9mIHRoZSBhZGFwdGl2ZS1yeCBhbmQgdGltZXIgbGF0ZW5jeSB2YWx1ZXM6CisKKyAgICAgIGV0aHRvb2wgLWMgPGludGVyZmFjZT4KKworCisgVENQIFNlZ21lbnRhdGlvbiBPZmZsb2FkaW5nIChUU08pIFN1cHBvcnQKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFRoaXMgZmVhdHVyZSwgYWxzbyBrbm93biBhcyAibGFyZ2Ugc2VuZCIsIGVuYWJsZXMgYSBzeXN0ZW0ncyBwcm90b2NvbCBzdGFjaworICB0byBvZmZsb2FkIHBvcnRpb25zIG9mIG91dGJvdW5kIFRDUCBwcm9jZXNzaW5nIHRvIGEgbmV0d29yayBpbnRlcmZhY2UgY2FyZAorICB0aGVyZWJ5IHJlZHVjaW5nIHN5c3RlbSBDUFUgdXRpbGl6YXRpb24gYW5kIGVuaGFuY2luZyBwZXJmb3JtYW5jZS4KKworICBUaGUgaW50ZXJmYWNlIHVzZWQgdG8gY29udHJvbCB0aGlzIGZlYXR1cmUgaXMgZXRodG9vbCB2ZXJzaW9uIDEuOCBvciBoaWdoZXIuCisgIFBsZWFzZSBzZWUgdGhlIGV0aHRvb2wgbWFucGFnZSBmb3IgYWRkaXRpb25hbCB1c2FnZSBpbmZvcm1hdGlvbi4KKworICBCeSBkZWZhdWx0LCBUU08gaXMgZW5hYmxlZC4KKyAgVG8gZGlzYWJsZSBUU086CisKKyAgICAgIGV0aHRvb2wgLUsgPGludGVyZmFjZT4gdHNvIG9mZgorCisgIFRvIGVuYWJsZSBUU086CisKKyAgICAgIGV0aHRvb2wgLUsgPGludGVyZmFjZT4gdHNvIG9uCisKKyAgVG8gdmlldyB0aGUgc3RhdHVzIG9mIFRTTzoKKworICAgICAgZXRodG9vbCAtayA8aW50ZXJmYWNlPgorCisKK1BFUkZPUk1BTkNFCis9PT09PT09PT09PQorCisgVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBhcyBhbiBleGFtcGxlIG9mIGhvdyB0byBjaGFuZ2Ugc3lzdGVtCisgcGFyYW1ldGVycyBmb3IgInBlcmZvcm1hbmNlIHR1bmluZyIgYW4gd2hhdCB2YWx1ZSB0byB1c2UuIFlvdSBtYXkgb3IgbWF5IG5vdAorIHdhbnQgdG8gY2hhbmdlIHRoZXNlIHN5c3RlbSBwYXJhbWV0ZXJzLCBkZXBlbmRpbmcgb24geW91ciBzZXJ2ZXIvd29ya3N0YXRpb24KKyBhcHBsaWNhdGlvbi4gRG9pbmcgc28gaXMgbm90IHdhcnJhbnRlZCBpbiBhbnkgd2F5IGJ5IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsCisgYW5kIGlzIGRvbmUgYXQgIllPVVIgT1dOIFJJU0siLiBDaGVsc2lvIHdpbGwgbm90IGJlIGhlbGQgcmVzcG9uc2libGUgZm9yIGxvc3MKKyBvZiBkYXRhIG9yIGRhbWFnZSB0byBlcXVpcG1lbnQuCisKKyBZb3VyIGRpc3RyaWJ1dGlvbiBtYXkgaGF2ZSBhIGRpZmZlcmVudCB3YXkgb2YgZG9pbmcgdGhpbmdzLCBvciB5b3UgbWF5IHByZWZlcgorIGEgZGlmZmVyZW50IG1ldGhvZC4gVGhlc2UgY29tbWFuZHMgYXJlIHNob3duIG9ubHkgdG8gcHJvdmlkZSBhbiBleGFtcGxlIG9mCisgd2hhdCB0byBkbyBhbmQgYXJlIGJ5IG5vIG1lYW5zIGRlZmluaXRpdmUuCisKKyBNYWtpbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcgc3lzdGVtIGNoYW5nZXMgd2lsbCBvbmx5IGxhc3QgdW50aWwgeW91IHJlYm9vdAorIHlvdXIgc3lzdGVtLiBZb3UgbWF5IHdhbnQgdG8gd3JpdGUgYSBzY3JpcHQgdGhhdCBydW5zIGF0IGJvb3QtdXAgd2hpY2gKKyBpbmNsdWRlcyB0aGUgb3B0aW1hbCBzZXR0aW5ncyBmb3IgeW91ciBzeXN0ZW0uCisKKyAgU2V0dGluZyBQQ0kgTGF0ZW5jeSBUaW1lcjoKKyAgICAgIHNldHBjaSAtZCAxNDI1OiogMHgwYy5sPTB4MDAwMEY4MDAKKworICBEaXNhYmxpbmcgVENQIHRpbWVzdGFtcDoKKyAgICAgIHN5c2N0bCAtdyBuZXQuaXB2NC50Y3BfdGltZXN0YW1wcz0wCisKKyAgRGlzYWJsaW5nIFNBQ0s6CisgICAgICBzeXNjdGwgLXcgbmV0LmlwdjQudGNwX3NhY2s9MAorCisgIFNldHRpbmcgbGFyZ2UgbnVtYmVyIG9mIGluY29taW5nIGNvbm5lY3Rpb24gcmVxdWVzdHM6CisgICAgICBzeXNjdGwgLXcgbmV0LmlwdjQudGNwX21heF9zeW5fYmFja2xvZz0zMDAwCisKKyAgU2V0dGluZyBtYXhpbXVtIHJlY2VpdmUgc29ja2V0IGJ1ZmZlciBzaXplOgorICAgICAgc3lzY3RsIC13IG5ldC5jb3JlLnJtZW1fbWF4PTEwMjQwMDAKKworICBTZXR0aW5nIG1heGltdW0gc2VuZCBzb2NrZXQgYnVmZmVyIHNpemU6CisgICAgICBzeXNjdGwgLXcgbmV0LmNvcmUud21lbV9tYXg9MTAyNDAwMAorCisgIFNldCBzbXBfYWZmaW5pdHkgKG9uIGEgbXVsdGlwcm9jZXNzb3Igc3lzdGVtKSB0byBhIHNpbmdsZSBDUFU6CisgICAgICBlY2hvIDEgPiAvcHJvYy9pcnEvPGludGVycnVwdF9udW1iZXI+L3NtcF9hZmZpbml0eQorCisgIFNldHRpbmcgZGVmYXVsdCByZWNlaXZlIHNvY2tldCBidWZmZXIgc2l6ZToKKyAgICAgIHN5c2N0bCAtdyBuZXQuY29yZS5ybWVtX2RlZmF1bHQ9NTI0Mjg3CisKKyAgU2V0dGluZyBkZWZhdWx0IHNlbmQgc29ja2V0IGJ1ZmZlciBzaXplOgorICAgICAgc3lzY3RsIC13IG5ldC5jb3JlLndtZW1fZGVmYXVsdD01MjQyODcKKworICBTZXR0aW5nIG1heGltdW0gb3B0aW9uIG1lbW9yeSBidWZmZXJzOgorICAgICAgc3lzY3RsIC13IG5ldC5jb3JlLm9wdG1lbV9tYXg9NTI0Mjg3CisKKyAgU2V0dGluZyBtYXhpbXVtIGJhY2tsb2cgKCMgb2YgdW5wcm9jZXNzZWQgcGFja2V0cyBiZWZvcmUga2VybmVsIGRyb3BzKToKKyAgICAgIHN5c2N0bCAtdyBuZXQuY29yZS5uZXRkZXZfbWF4X2JhY2tsb2c9MzAwMDAwCisKKyAgU2V0dGluZyBUQ1AgcmVhZCBidWZmZXJzIChtaW4vZGVmYXVsdC9tYXgpOgorICAgICAgc3lzY3RsIC13IG5ldC5pcHY0LnRjcF9ybWVtPSIxMDAwMDAwMCAxMDAwMDAwMCAxMDAwMDAwMCIKKworICBTZXR0aW5nIFRDUCB3cml0ZSBidWZmZXJzIChtaW4vcHJlc3N1cmUvbWF4KToKKyAgICAgIHN5c2N0bCAtdyBuZXQuaXB2NC50Y3Bfd21lbT0iMTAwMDAwMDAgMTAwMDAwMDAgMTAwMDAwMDAiCisKKyAgU2V0dGluZyBUQ1AgYnVmZmVyIHNwYWNlIChtaW4vcHJlc3N1cmUvbWF4KToKKyAgICAgIHN5c2N0bCAtdyBuZXQuaXB2NC50Y3BfbWVtPSIxMDAwMDAwMCAxMDAwMDAwMCAxMDAwMDAwMCIKKworICBUQ1Agd2luZG93IHNpemUgZm9yIHNpbmdsZSBjb25uZWN0aW9uczoKKyAgIFRoZSByZWNlaXZlIGJ1ZmZlciAoUlhfV0lORE9XKSBzaXplIG11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlCisgICBCYW5kd2lkdGgtRGVsYXkgUHJvZHVjdCBvZiB0aGUgY29tbXVuaWNhdGlvbiBsaW5rIGJldHdlZW4gdGhlIHNlbmRlciBhbmQKKyAgIHJlY2VpdmVyLiBEdWUgdG8gdGhlIHZhcmlhdGlvbnMgb2YgUlRULCB5b3UgbWF5IHdhbnQgdG8gaW5jcmVhc2UgdGhlIGJ1ZmZlcgorICAgc2l6ZSB1cCB0byAyIHRpbWVzIHRoZSBCYW5kd2lkdGgtRGVsYXkgUHJvZHVjdC4gUmVmZXJlbmNlIHBhZ2UgMjg5IG9mCisgICAiVENQL0lQIElsbHVzdHJhdGVkLCBWb2x1bWUgMSwgVGhlIFByb3RvY29scyIgYnkgVy4gUmljaGFyZCBTdGV2ZW5zLgorICAgQXQgMTBHYiBzcGVlZHMsIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICAgICAgUlhfV0lORE9XID49IDEuMjVNQnl0ZXMgKiBSVFQoaW4gbWlsbGlzZWNvbmRzKQorICAgICAgIEV4YW1wbGUgZm9yIFJUVCB3aXRoIDEwMHVzOiBSWF9XSU5ET1cgPSAoMSwyNTAsMDAwICogMC4xKSA9IDEyNSwwMDAKKyAgIFJYX1dJTkRPVyBzaXplcyBvZiAyNTZLQiAtIDUxMktCIHNob3VsZCBiZSBzdWZmaWNpZW50LgorICAgU2V0dGluZyB0aGUgbWluLCBtYXgsIGFuZCBkZWZhdWx0IHJlY2VpdmUgYnVmZmVyIChSWF9XSU5ET1cpIHNpemU6CisgICAgICAgc3lzY3RsIC13IG5ldC5pcHY0LnRjcF9ybWVtPSI8bWluPiA8ZGVmYXVsdD4gPG1heD4iCisKKyAgVENQIHdpbmRvdyBzaXplIGZvciBtdWx0aXBsZSBjb25uZWN0aW9uczoKKyAgIFRoZSByZWNlaXZlIGJ1ZmZlciAoUlhfV0lORE9XKSBzaXplIG1heSBiZSBjYWxjdWxhdGVkIHRoZSBzYW1lIGFzIHNpbmdsZQorICAgY29ubmVjdGlvbnMsIGJ1dCBzaG91bGQgYmUgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zLiBUaGUKKyAgIHNtYWxsZXIgd2luZG93IHByZXZlbnRzIGNvbmdlc3Rpb24gYW5kIGZhY2lsaXRhdGVzIGJldHRlciBwYWNpbmcsCisgICBlc3BlY2lhbGx5IGlmL3doZW4gTUFDIGxldmVsIGZsb3cgY29udHJvbCBkb2VzIG5vdCB3b3JrIHdlbGwgb3Igd2hlbiBpdCBpcworICAgbm90IHN1cHBvcnRlZCBvbiB0aGUgbWFjaGluZS4gRXhwZXJpbWVudGF0aW9uIG1heSBiZSBuZWNlc3NhcnkgdG8gYXR0YWluCisgICB0aGUgY29ycmVjdCB2YWx1ZS4gVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYSBzdGFydGluZyBwb2ludCBmb3QgdGhlCisgICBjb3JyZWN0IHJlY2VpdmUgYnVmZmVyIHNpemUuCisgICBTZXR0aW5nIHRoZSBtaW4sIG1heCwgYW5kIGRlZmF1bHQgcmVjZWl2ZSBidWZmZXIgKFJYX1dJTkRPVykgc2l6ZSBpcworICAgcGVyZm9ybWVkIGluIHRoZSBzYW1lIG1hbm5lciBhcyBzaW5nbGUgY29ubmVjdGlvbi4KKworCitEUklWRVIgTUVTU0FHRVMKKz09PT09PT09PT09PT09PQorCisgVGhlIGZvbGxvd2luZyBtZXNzYWdlcyBhcmUgdGhlIG1vc3QgY29tbW9uIG1lc3NhZ2VzIGxvZ2dlZCBieSBzeXNsb2cuIFRoZXNlCisgbWF5IGJlIGZvdW5kIGluIC92YXIvbG9nL21lc3NhZ2VzLgorCisgIERyaXZlciB1cDoKKyAgICAgQ2hlbHNpbyBOZXR3b3JrIERyaXZlciAtIHZlcnNpb24gMi4xLjEKKworICBOSUMgZGV0ZWN0ZWQ6CisgICAgIGV0aCM6IENoZWxzaW8gTjIxMCAxeDEwR0Jhc2VYIE5JQyAocmV2ICMpLCBQQ0lYIDEzM01Iei82NC1iaXQKKworICBMaW5rIHVwOgorICAgICBldGgjOiBsaW5rIGlzIHVwIGF0IDEwIEdicHMsIGZ1bGwgZHVwbGV4CisKKyAgTGluayBkb3duOgorICAgICBldGgjOiBsaW5rIGlzIGRvd24KKworCitLTk9XTiBJU1NVRVMKKz09PT09PT09PT09PQorCisgVGhlc2UgaXNzdWVzIGhhdmUgYmVlbiBpZGVudGlmaWVkIGR1cmluZyB0ZXN0aW5nLiBUaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uCisgaXMgcHJvdmlkZWQgYXMgYSB3b3JrYXJvdW5kIHRvIHRoZSBwcm9ibGVtLiBJbiBzb21lIGNhc2VzLCB0aGlzIHByb2JsZW0gaXMKKyBpbmhlcmVudCB0byBMaW51eCBvciB0byBhIHBhcnRpY3VsYXIgTGludXggRGlzdHJpYnV0aW9uIGFuZC9vciBoYXJkd2FyZQorIHBsYXRmb3JtLgorCisgIDEuIExhcmdlIG51bWJlciBvZiBUQ1AgcmV0cmFuc21pdHMgb24gYSBtdWx0aXByb2Nlc3NvciAoU01QKSBzeXN0ZW0uCisKKyAgICAgIE9uIGEgc3lzdGVtIHdpdGggbXVsdGlwbGUgQ1BVcywgdGhlIGludGVycnVwdCAoSVJRKSBmb3IgdGhlIG5ldHdvcmsKKyAgICAgIGNvbnRyb2xsZXIgbWF5IGJlIGJvdW5kIHRvIG1vcmUgdGhhbiBvbmUgQ1BVLiBUaGlzIHdpbGwgY2F1c2UgVENQCisgICAgICByZXRyYW5zbWl0cyBpZiB0aGUgcGFja2V0IGRhdGEgd2VyZSB0byBiZSBzcGxpdCBhY3Jvc3MgZGlmZmVyZW50IENQVXMKKyAgICAgIGFuZCByZS1hc3NlbWJsZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiBleHBlY3RlZC4KKworICAgICAgVG8gZWxpbWluYXRlIHRoZSBUQ1AgcmV0cmFuc21pdHMsIHNldCBzbXBfYWZmaW5pdHkgb24gdGhlIHBhcnRpY3VsYXIKKyAgICAgIGludGVycnVwdCB0byBhIHNpbmdsZSBDUFUuIFlvdSBjYW4gbG9jYXRlIHRoZSBpbnRlcnJ1cHQgKElSUSkgdXNlZCBvbgorICAgICAgdGhlIE4xMTAvTjIxMCBieSB1c2luZyBpZmNvbmZpZzoKKyAgICAgICAgICBpZmNvbmZpZyA8ZGV2X25hbWU+IHwgZ3JlcCBJbnRlcnJ1cHQKKyAgICAgIFNldCB0aGUgc21wX2FmZmluaXR5IHRvIGEgc2luZ2xlIENQVToKKyAgICAgICAgICBlY2hvIDEgPiAvcHJvYy9pcnEvPGludGVycnVwdF9udW1iZXI+L3NtcF9hZmZpbml0eQorCisgICAgICBJdCBpcyBoaWdobHkgc3VnZ2VzdGVkIHRoYXQgeW91IGRvIG5vdCBydW4gdGhlIGlycWJhbGFuY2UgZGFlbW9uIG9uIHlvdXIKKyAgICAgIHN5c3RlbSwgYXMgdGhpcyB3aWxsIGNoYW5nZSBhbnkgc21wX2FmZmluaXR5IHNldHRpbmcgeW91IGhhdmUgYXBwbGllZC4KKyAgICAgIFRoZSBpcnFiYWxhbmNlIGRhZW1vbiBydW5zIG9uIGEgMTAgc2Vjb25kIGludGVydmFsIGFuZCBiaW5kcyBpbnRlcnJ1cHRzCisgICAgICB0byB0aGUgbGVhc3QgbG9hZGVkIENQVSBkZXRlcm1pbmVkIGJ5IHRoZSBkYWVtb24uIFRvIGRpc2FibGUgdGhpcyBkYWVtb246CisgICAgICAgICAgY2hrY29uZmlnIC0tbGV2ZWwgMjM0NSBpcnFiYWxhbmNlIG9mZgorCisgICAgICBCeSBkZWZhdWx0LCBzb21lIExpbnV4IGRpc3RyaWJ1dGlvbnMgZW5hYmxlIHRoZSBrZXJuZWwgZmVhdHVyZSwKKyAgICAgIGlycWJhbGFuY2UsIHdoaWNoIHBlcmZvcm1zIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZSBkYWVtb24uIFRvIGRpc2FibGUKKyAgICAgIHRoaXMgZmVhdHVyZSwgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byB5b3VyIGJvb3Rsb2FkZXI6CisgICAgICAgICAgbm9pcnFiYWxhbmNlCisKKyAgICAgICAgICBFeGFtcGxlIHVzaW5nIHRoZSBHcnViIGJvb3Rsb2FkZXI6CisgICAgICAgICAgICAgIHRpdGxlIFJlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCBBUyAoMi40LjIxLTI3LkVMc21wKQorICAgICAgICAgICAgICByb290IChoZDAsMCkKKyAgICAgICAgICAgICAga2VybmVsIC92bWxpbnV6LTIuNC4yMS0yNy5FTHNtcCBybyByb290PS9kZXYvaGRhMyBub2lycWJhbGFuY2UKKyAgICAgICAgICAgICAgaW5pdHJkIC9pbml0cmQtMi40LjIxLTI3LkVMc21wLmltZworCisgIDIuIEFmdGVyIHJ1bm5pbmcgaW5zbW9kLCB0aGUgZHJpdmVyIGlzIGxvYWRlZCBhbmQgdGhlIGluY29ycmVjdCBuZXR3b3JrCisgICAgIGludGVyZmFjZSBpcyBicm91Z2h0IHVwIHdpdGhvdXQgcnVubmluZyBpZnVwLgorCisgICAgICBXaGVuIHVzaW5nIDIuNC54IGtlcm5lbHMsIGluY2x1ZGluZyBSSEVMIGtlcm5lbHMsIHRoZSBMaW51eCBrZXJuZWwKKyAgICAgIGludm9rZXMgYSBzY3JpcHQgbmFtZWQgImhvdHBsdWciLiBUaGlzIHNjcmlwdCBpcyBwcmltYXJpbHkgdXNlZCB0bworICAgICAgYXV0b21hdGljYWxseSBicmluZyB1cCBVU0IgZGV2aWNlcyB3aGVuIHRoZXkgYXJlIHBsdWdnZWQgaW4sIGhvd2V2ZXIsCisgICAgICB0aGUgc2NyaXB0IGFsc28gYXR0ZW1wdHMgdG8gYXV0b21hdGljYWxseSBicmluZyB1cCBhIG5ldHdvcmsgaW50ZXJmYWNlCisgICAgICBhZnRlciBsb2FkaW5nIHRoZSBrZXJuZWwgbW9kdWxlLiBUaGUgaG90cGx1ZyBzY3JpcHQgZG9lcyB0aGlzIGJ5IHNjYW5uaW5nCisgICAgICB0aGUgaWZjZmctZXRoIyBjb25maWcgZmlsZXMgaW4gL2V0Yy9zeXNjb25maWcvbmV0d29yay1zY3JpcHRzLCBsb29raW5nCisgICAgICBmb3IgSFdBRERSPTxtYWNfYWRkcmVzcz4uCisKKyAgICAgIElmIHRoZSBob3RwbHVnIHNjcmlwdCBkb2VzIG5vdCBmaW5kIHRoZSBIV0FERFJSIHdpdGhpbiBhbnkgb2YgdGhlCisgICAgICBpZmNmZy1ldGgjIGZpbGVzLCBpdCB3aWxsIGJyaW5nIHVwIHRoZSBkZXZpY2Ugd2l0aCB0aGUgbmV4dCBhdmFpbGFibGUKKyAgICAgIGludGVyZmFjZSBuYW1lLiBJZiB0aGlzIGludGVyZmFjZSBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yIGEgZGlmZmVyZW50CisgICAgICBuZXR3b3JrIGNhcmQsIHlvdXIgbmV3IGludGVyZmFjZSB3aWxsIGhhdmUgaW5jb3JyZWN0IElQIGFkZHJlc3MgYW5kCisgICAgICBuZXR3b3JrIHNldHRpbmdzLgorCisgICAgICBUbyBzb2x2ZSB0aGlzIGlzc3VlLCB5b3UgY2FuIGFkZCB0aGUgSFdBRERSPTxtYWNfYWRkcmVzcz4ga2V5IHRvIHRoZQorICAgICAgaW50ZXJmYWNlIGNvbmZpZyBmaWxlIG9mIHlvdXIgbmV0d29yayBjb250cm9sbGVyLgorCisgICAgICBUbyBkaXNhYmxlIHRoaXMgImhvdHBsdWciIGZlYXR1cmUsIHlvdSBtYXkgYWRkIHRoZSBkcml2ZXIgKG1vZHVsZSBuYW1lKQorICAgICAgdG8gdGhlICJibGFja2xpc3QiIGZpbGUgbG9jYXRlZCBpbiAvZXRjL2hvdHBsdWcuIEl0IGhhcyBiZWVuIG5vdGVkIHRoYXQKKyAgICAgIHRoaXMgZG9lcyBub3Qgd29yayBmb3IgbmV0d29yayBkZXZpY2VzIGJlY2F1c2UgdGhlIG5ldC5hZ2VudCBzY3JpcHQKKyAgICAgIGRvZXMgbm90IHVzZSB0aGUgYmxhY2tsaXN0IGZpbGUuIFNpbXBseSByZW1vdmUsIG9yIHJlbmFtZSwgdGhlIG5ldC5hZ2VudAorICAgICAgc2NyaXB0IGxvY2F0ZWQgaW4gL2V0Yy9ob3RwbHVnIHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorCisgIDMuIFRyYW5zcG9ydCBQcm90b2NvbCAoVFApIGhhbmdzIHdoZW4gcnVubmluZyBoZWF2eSBtdWx0aS1jb25uZWN0aW9uIHRyYWZmaWMKKyAgICAgb24gYW4gQU1EIE9wdGVyb24gc3lzdGVtIHdpdGggSHlwZXJUcmFuc3BvcnQgUENJLVggVHVubmVsIGNoaXBzZXQuCisKKyAgICAgIElmIHlvdXIgQU1EIE9wdGVyb24gc3lzdGVtIHVzZXMgdGhlIEFNRC04MTMxIEh5cGVyVHJhbnNwb3J0IFBDSS1YIFR1bm5lbAorICAgICAgY2hpcHNldCwgeW91IG1heSBleHBlcmllbmNlIHRoZSAiMTMzLU1oeiBNb2RlIFNwbGl0IENvbXBsZXRpb24gRGF0YQorICAgICAgQ29ycnVwdGlvbiIgYnVnIGlkZW50aWZpZWQgYnkgQU1EIHdoaWxlIHVzaW5nIGEgMTMzTWh6IFBDSS1YIGNhcmQgb24gdGhlCisgICAgICBidXMgUENJLVggYnVzLgorCisgICAgICBBTUQgc3RhdGVzLCAiVW5kZXIgaGlnaGx5IHNwZWNpZmljIGNvbmRpdGlvbnMsIHRoZSBBTUQtODEzMSBQQ0ktWCBUdW5uZWwKKyAgICAgIGNhbiBwcm92aWRlIHN0YWxlIGRhdGEgdmlhIHNwbGl0IGNvbXBsZXRpb24gY3ljbGVzIHRvIGEgUENJLVggY2FyZCB0aGF0CisgICAgICBpcyBvcGVyYXRpbmcgYXQgMTMzIE1oeiIsIGNhdXNpbmcgZGF0YSBjb3JydXB0aW9uLgorCisgICAgICBBTUQncyBwcm92aWRlcyB0aHJlZSB3b3JrYXJvdW5kcyBmb3IgdGhpcyBwcm9ibGVtLCBob3dldmVyLCBDaGVsc2lvCisgICAgICByZWNvbW1lbmRzIHRoZSBmaXJzdCBvcHRpb24gZm9yIGJlc3QgcGVyZm9ybWFuY2Ugd2l0aCB0aGlzIGJ1ZzoKKworICAgICAgICBGb3IgMTMzTWh6IHNlY29uZGFyeSBidXMgb3BlcmF0aW9uLCBsaW1pdCB0aGUgdHJhbnNhY3Rpb24gbGVuZ3RoIGFuZAorICAgICAgICB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9ucywgdmlhIEJJT1MgY29uZmlndXJhdGlvbgorICAgICAgICBwcm9ncmFtbWluZyBvZiB0aGUgUENJLVggY2FyZCwgdG8gdGhlIGZvbGxvd2luZzoKKworICAgICAgICAgICBEYXRhIExlbmd0aCAoYnl0ZXMpOiAxaworICAgICAgICAgICBUb3RhbCBhbGxvd2VkIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9uczogMgorCisgICAgICBQbGVhc2UgcmVmZXIgdG8gQU1EIDgxMzEtSFQvUENJLVggRXJyYXRhIDI2MzEwIFJldiAzLjA4IEF1Z3VzdCAyMDA0LAorICAgICAgc2VjdGlvbiA1NiwgIjEzMy1NSHogTW9kZSBTcGxpdCBDb21wbGV0aW9uIERhdGEgQ29ycnVwdGlvbiIgZm9yIG1vcmUKKyAgICAgIGRldGFpbHMgd2l0aCB0aGlzIGJ1ZyBhbmQgd29ya2Fyb3VuZHMgc3VnZ2VzdGVkIGJ5IEFNRC4KKworICAgICAgSXQgbWF5IGJlIHBvc3NpYmxlIHRvIHdvcmsgb3V0c2lkZSBBTUQncyByZWNvbW1lbmRlZCBQQ0ktWCBzZXR0aW5ncywgdHJ5CisgICAgICBpbmNyZWFzaW5nIHRoZSBEYXRhIExlbmd0aCB0byAyayBieXRlcyBmb3IgaW5jcmVhc2VkIHBlcmZvcm1hbmNlLiBJZiB5b3UKKyAgICAgIGhhdmUgaXNzdWVzIHdpdGggdGhlc2Ugc2V0dGluZ3MsIHBsZWFzZSByZXZlcnQgdG8gdGhlICJzYWZlIiBzZXR0aW5ncworICAgICAgYW5kIGR1cGxpY2F0ZSB0aGUgcHJvYmxlbSBiZWZvcmUgc3VibWl0dGluZyBhIGJ1ZyBvciBhc2tpbmcgZm9yIHN1cHBvcnQuCisKKyAgICAgIE5PVEU6IFRoZSBkZWZhdWx0IHNldHRpbmcgb24gbW9zdCBzeXN0ZW1zIGlzIDggb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICBhbmQgMmsgYnl0ZXMgZGF0YSBsZW5ndGguCisKKyAgNC4gT24gbXVsdGlwcm9jZXNzb3Igc3lzdGVtcywgaXQgaGFzIGJlZW4gbm90ZWQgdGhhdCBhbiBhcHBsaWNhdGlvbiB3aGljaAorICAgICBpcyBoYW5kbGluZyAxMEdiIG5ldHdvcmtpbmcgY2FuIHN3aXRjaCBiZXR3ZWVuIENQVXMgY2F1c2luZyBkZWdyYWRlZAorICAgICBhbmQvb3IgdW5zdGFibGUgcGVyZm9ybWFuY2UuCisKKyAgICAgIElmIHJ1bm5pbmcgb24gYW4gU01QIHN5c3RlbSBhbmQgdGFraW5nIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cywgaXQKKyAgICAgIGlzIHN1Z2dlc3RlZCB5b3UgZWl0aGVyIHJ1biB0aGUgbGF0ZXN0IG5ldHBlcmYtMi40LjArIG9yIHVzZSBhIGJpbmRpbmcKKyAgICAgIHRvb2wgc3VjaCBhcyBUaW0gSG9ja2luJ3MgcHJvY3N0YXRlIHV0aWxpdGllcyAocnVub24pCisgICAgICA8aHR0cDovL3d3dy5ob2NraW4ub3JnL350aG9ja2luL3Byb2NzdGF0ZS8+LgorCisgICAgICBCaW5kaW5nIG5ldHNlcnZlciBhbmQgbmV0cGVyZiAob3Igb3RoZXIgYXBwbGljYXRpb25zKSB0byBwYXJ0aWN1bGFyCisgICAgICBDUFVzIHdpbGwgaGF2ZSBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzLgorICAgICAgWW91IG1heSBuZWVkIHRvIGV4cGVyaW1lbnQgd2hpY2ggQ1BVIHRvIGJpbmQgdGhlIGFwcGxpY2F0aW9uIHRvIGluCisgICAgICBvcmRlciB0byBhY2hpZXZlIHRoZSBiZXN0IHBlcmZvcm1hbmNlIGZvciB5b3VyIHN5c3RlbS4KKworICAgICAgSWYgeW91IGFyZSBkZXZlbG9waW5nIGFuIGFwcGxpY2F0aW9uIGRlc2lnbmVkIGZvciAxMEdiIG5ldHdvcmtpbmcsCisgICAgICBwbGVhc2Uga2VlcCBpbiBtaW5kIHlvdSBtYXkgd2FudCB0byBsb29rIGF0IGtlcm5lbCBmdW5jdGlvbnMKKyAgICAgIHNjaGVkX3NldGFmZmluaXR5ICYgc2NoZWRfZ2V0YWZmaW5pdHkgdG8gYmluZCB5b3VyIGFwcGxpY2F0aW9uLgorCisgICAgICBJZiB5b3UgYXJlIGp1c3QgcnVubmluZyB1c2VyLXNwYWNlIGFwcGxpY2F0aW9ucyBzdWNoIGFzIGZ0cCwgdGVsbmV0LAorICAgICAgZXRjLiwgeW91IG1heSB3YW50IHRvIHRyeSB0aGUgcnVub24gdG9vbCBwcm92aWRlZCBieSBUaW0gSG9ja2luJ3MKKyAgICAgIHByb2NzdGF0ZSB1dGlsaXR5LiBZb3UgY291bGQgYWxzbyB0cnkgYmluZGluZyB0aGUgaW50ZXJmYWNlIHRvIGEKKyAgICAgIHBhcnRpY3VsYXIgQ1BVOiBydW5vbiAwIGlmdXAgZXRoMAorCisKK1NVUFBPUlQKKz09PT09PT0KKworIElmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggdGhlIHNvZnR3YXJlIG9yIGhhcmR3YXJlLCBwbGVhc2UgY29udGFjdCBvdXIKKyBjdXN0b21lciBzdXBwb3J0IHRlYW0gdmlhIGVtYWlsIGF0IHN1cHBvcnRAY2hlbHNpby5jb20gb3IgY2hlY2sgb3VyIHdlYnNpdGUKKyBhdCBodHRwOi8vd3d3LmNoZWxzaW8uY29tCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIENoZWxzaW8gQ29tbXVuaWNhdGlvbnMKKyAzNzAgU2FuIEFsZXNvIEF2ZS4KKyBTdWl0ZSAxMDAKKyBTdW5ueXZhbGUsIENBIDk0MDg1CisgaHR0cDovL3d3dy5jaGVsc2lvLmNvbQorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhbi1yb3V0ZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhbi1yb3V0ZXIudHh0CmluZGV4IGFlYTIwY2QuLmM5Njg5N2EgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW4tcm91dGVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQKQEAgLTM1NSw3ICszNTUsNyBAQAogCQkJCVRoZXJlIGlzIG5vIGZ1bmN0aW9uYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gcGFja2FnZXMgICAgICAgICAKIAogMi4wLjcgICBBdWcgMjYsIDE5OTkJCW8gIE1lcmdlZCBYMjVBUEkgY29kZSBpbnRvIFdBTlBJUEUuCi0JCQkJbyAgRml4ZWQgYSBtZW1lb3J5IGxlYWsgZm9yIFgyNUFQSQorCQkJCW8gIEZpeGVkIGEgbWVtb3J5IGxlYWsgZm9yIFgyNUFQSQogCQkJCW8gIFVwZGF0ZWQgdGhlIFgyNUFQSSBjb2RlIGZvciAyLjIuWCBrZXJuZWxzLgogCQkJCW8gIEltcHJvdmVkIE5FTSBoYW5kbGluZy4gICAKIApAQCAtNTE0LDcgKzUxNCw3IEBACiAJCQkJbyBQYXRjaGVzIGZvciAyLjQuMCBrZXJuZWwKIAkJCQlvIFBhdGNoZXMgZm9yIDIuMi4xOCBrZXJuZWwKIAkJCQlvIE1pbm9yIHVwZGF0ZXMgdG8gUFBQIGFuZCBDSExEQyBkcml2ZXJzLgotCQkJCSAgTm90ZTogTm8gZnVuY3RpbmFsIGRpZmZlcmVuY2UuIAorCQkJCSAgTm90ZTogTm8gZnVuY3Rpb25hbCBkaWZmZXJlbmNlLgogCiBiZXRhMy0yLjIuOQlKYW4gMTAgMjAwMQogCQkJCW8gSSBtaXNzZWQgdGhlIDIuMi4xOCBrZXJuZWwgcGF0Y2hlcyBpbiBiZXRhMi0yLjIuMApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9wY2kudHh0CmluZGV4IDc2ZDI4ZDAuLjcxMTIxMGIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcGNpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3BjaS50eHQKQEAgLTg0LDcgKzg0LDcgQEAKIAogTW9zdCBkcml2ZXJzIGRvbid0IG5lZWQgdG8gdXNlIHRoZSBkcml2ZXJfZGF0YSBmaWVsZC4gIEJlc3QgcHJhY3RpY2UKIGZvciB1c2Ugb2YgZHJpdmVyX2RhdGEgaXMgdG8gdXNlIGl0IGFzIGFuIGluZGV4IGludG8gYSBzdGF0aWMgbGlzdCBvZgotZXF1aXZhbGFudCBkZXZpY2UgdHlwZXMsIG5vdCB0byB1c2UgaXQgYXMgYSBwb2ludGVyLgorZXF1aXZhbGVudCBkZXZpY2UgdHlwZXMsIG5vdCB0byB1c2UgaXQgYXMgYSBwb2ludGVyLgogCiBIYXZlIGEgdGFibGUgZW50cnkge1BDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9CiB0byBoYXZlIHByb2JlKCkgY2FsbGVkIGZvciBldmVyeSBQQ0kgZGV2aWNlIGtub3duIHRvIHRoZSBzeXN0ZW0uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC1kbWNyeXB0LnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLWRtY3J5cHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OTMxYjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC1kbWNyeXB0LnR4dApAQCAtMCwwICsxLDEzOCBAQAorQXV0aG9yOiBBbmRyZWFzIFN0ZWlubWV0eiA8YXN0QGRvbWR2LmRlPgorCisKK0hvdyB0byB1c2UgZG0tY3J5cHQgYW5kIHN3c3VzcCB0b2dldGhlcjoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU29tZSBwcmVyZXF1aXNpdGVzOgorWW91IGtub3cgaG93IGRtLWNyeXB0IHdvcmtzLiBJZiBub3QsIHZpc2l0IHRoZSBmb2xsb3dpbmcgd2ViIHBhZ2U6CitodHRwOi8vd3d3LnNhb3V0LmRlL21pc2MvZG0tY3J5cHQvCitZb3UgaGF2ZSByZWFkIERvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dCBhbmQgdW5kZXJzdGFuZCBpdC4KK1lvdSBkaWQgcmVhZCBEb2N1bWVudGF0aW9uL2luaXRyZC50eHQgYW5kIGtub3cgaG93IGFuIGluaXRyZCB3b3Jrcy4KK1lvdSBrbm93IGhvdyB0byBjcmVhdGUgb3IgaG93IHRvIG1vZGlmeSBhbiBpbml0cmQuCisKK05vdyB5b3VyIHN5c3RlbSBpcyBwcm9wZXJseSBzZXQgdXAsIHlvdXIgZGlzayBpcyBlbmNyeXB0ZWQgZXhjZXB0IGZvcgordGhlIHN3YXAgZGV2aWNlKHMpIGFuZCB0aGUgYm9vdCBwYXJ0aXRpb24gd2hpY2ggbWF5IGNvbnRhaW4gYSBtaW5pCitzeXN0ZW0gZm9yIGNyeXB0byBzZXR1cCBhbmQvb3IgcmVzY3VlIHB1cnBvc2VzLiBZb3UgbWF5IGV2ZW4gaGF2ZQorYW4gaW5pdHJkIHRoYXQgZG9lcyB5b3VyIGN1cnJlbnQgY3J5cHRvIHNldHVwIGFscmVhZHkuCisKK0F0IHRoaXMgcG9pbnQgeW91IHdhbnQgdG8gZW5jcnlwdCB5b3VyIHN3YXAsIHRvby4gU3RpbGwgeW91IHdhbnQgdG8KK2JlIGFibGUgdG8gc3VzcGVuZCB1c2luZyBzd3N1c3AuIFRoaXMsIGhvd2V2ZXIsIG1lYW5zIHRoYXQgeW91CitoYXZlIHRvIGJlIGFibGUgdG8gZWl0aGVyIGVudGVyIGEgcGFzc3BocmFzZSBvciB0aGF0IHlvdSByZWFkCit0aGUga2V5KHMpIGZyb20gYW4gZXh0ZXJuYWwgZGV2aWNlIGxpa2UgYSBwY21jaWEgZmxhc2ggZGlzaworb3IgYW4gdXNiIHN0aWNrIHByaW9yIHRvIHJlc3VtZS4gU28geW91IG5lZWQgYW4gaW5pdHJkLCB0aGF0IHNldHMKK3VwIGRtLWNyeXB0IGFuZCB0aGVuIGFza3Mgc3dzdXNwIHRvIHJlc3VtZSBmcm9tIHRoZSBlbmNyeXB0ZWQKK3N3YXAgZGV2aWNlLgorCitUaGUgbW9zdCBpbXBvcnRhbnQgdGhpbmcgaXMgdGhhdCB5b3Ugc2V0IHVwIGRtLWNyeXB0IGluIHN1Y2gKK2Egd2F5IHRoYXQgdGhlIHN3YXAgZGV2aWNlIHlvdSBzdXNwZW5kIHRvL3Jlc3VtZSBmcm9tIGhhcworYWx3YXlzIHRoZSBzYW1lIG1ham9yL21pbm9yIHdpdGhpbiB0aGUgaW5pdHJkIGFzIHdlbGwgYXMKK3dpdGhpbiB5b3VyIHJ1bm5pbmcgc3lzdGVtLiBUaGUgZWFzaWVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzCit0byBhbHdheXMgc2V0IHVwIHRoaXMgc3dhcCBkZXZpY2UgZmlyc3Qgd2l0aCBkbXNldHVwLCBzbyB0aGF0CitpdCB3aWxsIGFsd2F5cyBsb29rIGxpa2UgdGhlIGZvbGxvd2luZzoKKworYnJ3LS0tLS0tLSAgMSByb290IHJvb3QgMjU0LCAwIEp1bCAyOCAxMzozNyAvZGV2L21hcHBlci9zd2FwMAorCitOb3cgc2V0IHVwIHlvdXIga2VybmVsIHRvIHVzZSAvZGV2L21hcHBlci9zd2FwMCBhcyB0aGUgZGVmYXVsdAorcmVzdW1lIHBhcnRpdGlvbiwgc28geW91ciBrZXJuZWwgLmNvbmZpZyBjb250YWluczoKKworQ09ORklHX1BNX1NURF9QQVJUSVRJT049Ii9kZXYvbWFwcGVyL3N3YXAwIgorCitQcmVwYXJlIHlvdXIgYm9vdCBsb2FkZXIgdG8gdXNlIHRoZSBpbml0cmQgeW91IHdpbGwgY3JlYXRlIG9yCittb2RpZnkuIEZvciBsaWxvIHRoZSBzaW1wbGVzdCBzZXR1cCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcKK2xpbmVzOgorCitpbWFnZT0vYm9vdC92bWxpbnV6Citpbml0cmQ9L2Jvb3QvaW5pdHJkLmd6CitsYWJlbD1saW51eAorYXBwZW5kPSJyb290PS9kZXYvcmFtMCBpbml0PS9saW51eHJjIHJ3IgorCitGaW5hbGx5IHlvdSBuZWVkIHRvIGNyZWF0ZSBvciBtb2RpZnkgeW91ciBpbml0cmQuIExldHMgYXNzdW1lCit5b3UgY3JlYXRlIGFuIGluaXRyZCB0aGF0IHJlYWRzIHRoZSByZXF1aXJlZCBkbS1jcnlwdCBzZXR1cAorZnJvbSBhIHBjbWNpYSBmbGFzaCBkaXNrIGNhcmQuIFRoZSBjYXJkIGlzIGZvcm1hdHRlZCB3aXRoIGFuIGV4dDIKK2ZzIHdoaWNoIHJlc2lkZXMgb24gL2Rldi9oZGUxIHdoZW4gdGhlIGNhcmQgaXMgaW5zZXJ0ZWQuIFRoZQorY2FyZCBjb250YWlucyBhdCBsZWFzdCB0aGUgZW5jcnlwdGVkIHN3YXAgc2V0dXAgaW4gYSBmaWxlCituYW1lZCAic3dhcGtleSIuIC9ldGMvZnN0YWIgb2YgeW91ciBpbml0cmQgY29udGFpbnMgc29tZXRoaW5nCitsaWtlIHRoZSBmb2xsb3dpbmc6CisKKy9kZXYvaGRhMSAgIC9tbnQgICAgZXh0MyAgICAgIHJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgMAorbm9uZSAgICAgICAgL3Byb2MgICBwcm9jICAgICAgZGVmYXVsdHMsbm9hdGltZSxub2RpcmF0aW1lICAgMCAwCitub25lICAgICAgICAvc3lzICAgIHN5c2ZzICAgICBkZWZhdWx0cyxub2F0aW1lLG5vZGlyYXRpbWUgICAwIDAKKworL2Rldi9oZGExIGNvbnRhaW5zIGFuIHVuZW5jcnlwdGVkIG1pbmkgc3lzdGVtIHRoYXQgc2V0cyB1cCBhbGwKK29mIHlvdXIgY3J5cHRvIGRldmljZXMsIGFnYWluIGJ5IHJlYWRpbmcgdGhlIHNldHVwIGZyb20gdGhlCitwY21jaWEgZmxhc2ggZGlzay4gV2hhdCBmb2xsb3dzIG5vdyBpcyBhIC9saW51eHJjIGZvciB5b3VyCitpbml0cmQgdGhhdCBhbGxvd3MgeW91IHRvIHJlc3VtZSBmcm9tIGVuY3J5cHRlZCBzd2FwIGFuZCB0aGF0Citjb250aW51ZXMgYm9vdCB3aXRoIHlvdXIgbWluaSBzeXN0ZW0gb24gL2Rldi9oZGExIGlmIHJlc3VtZQorZG9lcyBub3QgaGFwcGVuOgorCisjIS9iaW4vc2gKK1BBVEg9L3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4KK21vdW50IC9wcm9jCittb3VudCAvc3lzCittYXBwZWQ9MAorbm9yZXN1bWU9YGdyZXAgLWMgbm9yZXN1bWUgL3Byb2MvY21kbGluZWAKK2lmIFsgIiQqIiAhPSAiIiBdCit0aGVuCisgIG5vcmVzdW1lPTEKK2ZpCitkbWVzZyAtbiAxCisvc2Jpbi9jYXJkbWdyIC1xCitmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOSAwCitkbworICBpZiBbIC1mIC9wcm9jL2lkZS9oZGUvbWVkaWEgXQorICB0aGVuCisgICAgdXNsZWVwIDUwMDAwMAorICAgIG1vdW50IC10IGV4dDIgLW8gcm8gL2Rldi9oZGUxIC9tbnQKKyAgICBpZiBbIC1mIC9tbnQvc3dhcGtleSBdCisgICAgdGhlbgorICAgICAgZG1zZXR1cCBjcmVhdGUgc3dhcDAgL21udC9zd2Fwa2V5ID4gL2Rldi9udWxsIDI+JjEgJiYgbWFwcGVkPTEKKyAgICBmaQorICAgIHVtb3VudCAvbW50CisgICAgYnJlYWsKKyAgZmkKKyAgdXNsZWVwIDUwMDAwMAorZG9uZQora2lsbHByb2MgL3NiaW4vY2FyZG1ncgorZG1lc2cgLW4gNgoraWYgWyAkbWFwcGVkID0gMSBdCit0aGVuCisgIGlmIFsgJG5vcmVzdW1lICE9IDAgXQorICB0aGVuCisgICAgbWtzd2FwIC9kZXYvbWFwcGVyL3N3YXAwID4gL2Rldi9udWxsIDI+JjEKKyAgZmkKKyAgZWNobyAyNTQ6MCA+IC9zeXMvcG93ZXIvcmVzdW1lCisgIGRtc2V0dXAgcmVtb3ZlIHN3YXAwCitmaQordW1vdW50IC9zeXMKK21vdW50IC9tbnQKK3Vtb3VudCAvcHJvYworY2QgL21udAorcGl2b3Rfcm9vdCAuIG1udAorbW91bnQgL3Byb2MKK3Vtb3VudCAtbCAvbW50Cit1bW91bnQgL3Byb2MKK2V4ZWMgY2hyb290IC4gL3NiaW4vaW5pdCAkKiA8IGRldi9jb25zb2xlID4gZGV2L2NvbnNvbGUgMj4mMQorCitQbGVhc2UgZG9uJ3QgbWluZCB0aGUgd2VpcmQgbG9vcCBhYm92ZSwgYnVzeWJveCdzIG1zaCBkb2Vzbid0IGtub3cKK3RoZSBsZXQgc3RhdGVtZW50LiBOb3csIHdoYXQgaXMgaGFwcGVuaW5nIGluIHRoZSBzY3JpcHQ/CitGaXJzdCB3ZSBoYXZlIHRvIGRlY2lkZSBpZiB3ZSB3YW50IHRvIHRyeSB0byByZXN1bWUsIG9yIG5vdC4KK1dlIHdpbGwgbm90IHJlc3VtZSBpZiBib290aW5nIHdpdGggIm5vcmVzdW1lIiBvciBhbnkgcGFyYW1ldGVycworZm9yIGluaXQgbGlrZSAic2luZ2xlIiBvciAiZW1lcmdlbmN5IiBhcyBib290IHBhcmFtZXRlcnMuCisKK1RoZW4gd2UgbmVlZCB0byBzZXQgdXAgZG1jcnlwdCB3aXRoIHRoZSBzZXR1cCBkYXRhIGZyb20gdGhlCitwY21jaWEgZmxhc2ggZGlzay4gSWYgdGhpcyBzdWNjZWVkcyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBzd2FwCitkZXZpY2UgaWYgd2UgZG9uJ3Qgd2FudCB0byByZXN1bWUuIFRoZSBsaW5lICJlY2hvIDI1NDowID4gL3N5cy9wb3dlci9yZXN1bWUiCit0aGVuIGF0dGVtcHRzIHRvIHJlc3VtZSBmcm9tIHRoZSBmaXJzdCBkZXZpY2UgbWFwcGVyIGRldmljZS4KK05vdGUgdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gc2V0IHRoZSBkZXZpY2UgaW4gL3N5cy9wb3dlci9yZXN1bWUsCityZWdhcmRsZXNzIGlmIHJlc3VtaW5nIG9yIG5vdCwgb3RoZXJ3aXNlIGxhdGVyIHN1c3BlbmQgd2lsbCBmYWlsLgorSWYgcmVzdW1lIHN0YXJ0cywgc2NyaXB0IGV4ZWN1dGlvbiB0ZXJtaW5hdGVzIGhlcmUuCisKK090aGVyd2lzZSB3ZSBqdXN0IHJlbW92ZSB0aGUgZW5jcnlwdGVkIHN3YXAgZGV2aWNlIGFuZCBsZWF2ZSBpdCB0byB0aGUKK21pbmkgc3lzdGVtIG9uIC9kZXYvaGRhMSB0byBzZXQgdGhlIHdob2xlIGNyeXB0byB1cCAoaXQgaXMgdXAgdG8KK3lvdSB0byBtb2RpZnkgdGhpcyB0byB5b3VyIHRhc3RlKS4KKworV2hhdCB0aGVuIGZvbGxvd3MgaXMgdGhlIHdlbGwga25vd24gcHJvY2VzcyB0byBjaGFuZ2UgdGhlIHJvb3QKK2ZpbGUgc3lzdGVtIGFuZCBjb250aW51ZSBib290aW5nIGZyb20gdGhlcmUuIEkgcHJlZmVyIHRvIHVubW91bnQKK3RoZSBpbml0cmQgcHJpb3IgdG8gY29udGludWUgYm9vdGluZyBidXQgaXQgaXMgdXAgdG8geW91IHRvIG1vZGlmeQordGhpcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAppbmRleCA3YTZiNzg5Li5iMGQ1MDg0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CkBAIC0xLDIyICsxLDIwIEBACi1Gcm9tIGtlcm5lbC9zdXNwZW5kLmM6CitTb21lIHdhcm5pbmdzLCBmaXJzdC4KIAogICogQklHIEZBVCBXQVJOSU5HICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIElmIHlvdSBoYXZlIHVuc3VwcG9ydGVkICgqKSBkZXZpY2VzIHVzaW5nIERNQS4uLgotICoJCQkJLi4uc2F5IGdvb2RieWUgdG8geW91ciBkYXRhLgotICoKICAqIElmIHlvdSB0b3VjaCBhbnl0aGluZyBvbiBkaXNrIGJldHdlZW4gc3VzcGVuZCBhbmQgcmVzdW1lLi4uCiAgKgkJCQkuLi5raXNzIHlvdXIgZGF0YSBnb29kYnllLgogICoKLSAqIElmIHlvdXIgZGlzayBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzdXNwZW5kLi4uIChJREUgZG9lcykKLSAqCQkJCS4uLnlvdSdkIGJldHRlciBmaW5kIG91dCBob3cgdG8gZ2V0IGFsb25nCi0gKgkJCQkgICB3aXRob3V0IHlvdXIgZGF0YS4KKyAqIElmIHlvdSBkbyByZXN1bWUgZnJvbSBpbml0cmQgYWZ0ZXIgeW91ciBmaWxlc3lzdGVtcyBhcmUgbW91bnRlZC4uLgorICoJCQkJLi4uYnllIGJ5ZSByb290IHBhcnRpdGlvbi4KKyAqCQkJW3RoaXMgaXMgYWN0dWFsbHkgc2FtZSBjYXNlIGFzIGFib3ZlXQogICoKLSAqIElmIHlvdSBjaGFuZ2Uga2VybmVsIGNvbW1hbmQgbGluZSBiZXR3ZWVuIHN1c3BlbmQgYW5kIHJlc3VtZS4uLgotICoJCQkgICAgICAgIC4uLnByZXBhcmUgZm9yIG5hc3R5IGZzY2sgb3Igd29yc2UuCi0gKgotICogSWYgeW91IGNoYW5nZSB5b3VyIGhhcmR3YXJlIHdoaWxlIHN5c3RlbSBpcyBzdXNwZW5kZWQuLi4KLSAqCQkJICAgICAgICAuLi53ZWxsLCBpdCB3YXMgbm90IGdvb2QgaWRlYS4KKyAqIElmIHlvdSBoYXZlIHVuc3VwcG9ydGVkICgqKSBkZXZpY2VzIHVzaW5nIERNQSwgeW91IG1heSBoYXZlIHNvbWUKKyAqIHByb2JsZW1zLiBJZiB5b3VyIGRpc2sgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgc3VzcGVuZC4uLiAoSURFIGRvZXMpLAorICogaXQgbWF5IGNhdXNlIHNvbWUgcHJvYmxlbXMsIHRvby4gSWYgeW91IGNoYW5nZSBrZXJuZWwgY29tbWFuZCBsaW5lCisgKiBiZXR3ZWVuIHN1c3BlbmQgYW5kIHJlc3VtZSwgaXQgbWF5IGRvIHNvbWV0aGluZyB3cm9uZy4gSWYgeW91IGNoYW5nZQorICogeW91ciBoYXJkd2FyZSB3aGlsZSBzeXN0ZW0gaXMgc3VzcGVuZGVkLi4uIHdlbGwsIGl0IHdhcyBub3QgZ29vZCBpZGVhOworICogYnV0IGl0IHdpbGwgcHJvYmFibHkgb25seSBjcmFzaC4KICAqCiAgKiAoKikgc3VzcGVuZC9yZXN1bWUgc3VwcG9ydCBpcyBuZWVkZWQgdG8gbWFrZSBpdCBzYWZlLgogCkBAIC0zMCw2ICsyOCwxMyBAQAogZWNobyBwbGF0Zm9ybSA+IC9zeXMvcG93ZXIvZGlzazsgZWNobyBkaXNrID4gL3N5cy9wb3dlci9zdGF0ZQogCiAKK0VuY3J5cHRlZCBzdXNwZW5kIGltYWdlOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJZiB5b3Ugd2FudCB0byBzdG9yZSB5b3VyIHN1c3BlbmQgaW1hZ2UgZW5jcnlwdGVkIHdpdGggYSB0ZW1wb3JhcnkKK2tleSB0byBwcmV2ZW50IGRhdGEgZ2F0aGVyaW5nIGFmdGVyIHJlc3VtZSB5b3UgbXVzdCBjb21waWxlCitjcnlwdG8gYW5kIHRoZSBhZXMgYWxnb3JpdGhtIGludG8gdGhlIGtlcm5lbCAtIG1vZHVsZXMgd29uJ3Qgd29yaworYXMgdGhleSBjYW5ub3QgYmUgbG9hZGVkIGF0IHJlc3VtZSB0aW1lLgorCiAKIEFydGljbGUgYWJvdXQgZ29hbHMgYW5kIGltcGxlbWVudGF0aW9uIG9mIFNvZnR3YXJlIFN1c3BlbmQgZm9yIExpbnV4CiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpAQCAtODUsMTEgKzkwLDYgQEAKIFlvdSBoYXZlIHlvdXIgc2VydmVyIG9uIFVQUy4gUG93ZXIgZGllZCwgYW5kIFVQUyBpcyBpbmRpY2F0aW5nIDMwCiBzZWNvbmRzIHRvIGZhaWx1cmUuIFdoYXQgZG8geW91IGRvPyBTdXNwZW5kIHRvIGRpc2suCiAKLUV0aGVybmV0IGNhcmQgaW4geW91ciBzZXJ2ZXIgZGllZC4gWW91IHdhbnQgdG8gcmVwbGFjZSBpdC4gWW91cgotc2VydmVyIGlzIG5vdCBob3RwbHVnIGNhcGFibGUuIFdoYXQgZG8geW91IGRvPyBTdXNwZW5kIHRvIGRpc2ssCi1yZXBsYWNlIGV0aGVybmV0IGNhcmQsIHJlc3VtZS4gSWYgeW91IGFyZSBmYXN0IHlvdXIgdXNlcnMgd2lsbCBub3QKLWV2ZW4gc2VlIGJyb2tlbiBjb25uZWN0aW9ucy4KLQogCiBROiBNYXliZSBJJ20gbWlzc2luZyBzb21ldGhpbmcsIGJ1dCB3aHkgZG9uJ3QgdGhlIHJlZ3VsYXIgSS9PIHBhdGhzIHdvcms/CiAKQEAgLTExNywzMSArMTE3LDYgQEAKIAogQTogWWVzLiBUaGF0J3Mgd2hhdCBlY2hvIHBsYXRmb3JtID4gL3N5cy9wb3dlci9kaXNrIGRvZXMuCiAKLVE6IE15IG1hY2hpbmUgZG9lc24ndCB3b3JrIHdpdGggQUNQSS4gSG93IGNhbiBJIHVzZSBzd3N1c3AgdGhhbiA/Ci0KLUE6IERvIGEgcmVib290KCkgc3lzY2FsbCB3aXRoIHJpZ2h0IHBhcmFtZXRlcnMuIFdhcm5pbmc6IGdsaWJjIGdldHMgaW4KLWl0cyB3YXksIHNvIGNoZWNrIHdpdGggc3RyYWNlOgotCi1yZWJvb3QoTElOVVhfUkVCT09UX01BR0lDMSwgTElOVVhfUkVCT09UX01BR0lDMiwgMHhkMDAwZmNlMikKLQotKFRoYW5rcyB0byBQZXRlciBPc3Rlcmx1bmQ6KQotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzY2FsbC5oPgotCi0jZGVmaW5lIExJTlVYX1JFQk9PVF9NQUdJQzEgICAgIDB4ZmVlMWRlYWQKLSNkZWZpbmUgTElOVVhfUkVCT09UX01BR0lDMiAgICAgNjcyMjc0NzkzCi0jZGVmaW5lIExJTlVYX1JFQk9PVF9DTURfU1dfU1VTUEVORCAgICAgMHhEMDAwRkNFMgotCi1pbnQgbWFpbigpCi17Ci0gICAgc3lzY2FsbChTWVNfcmVib290LCBMSU5VWF9SRUJPT1RfTUFHSUMxLCBMSU5VWF9SRUJPT1RfTUFHSUMyLAotICAgICAgICAgICAgTElOVVhfUkVCT09UX0NNRF9TV19TVVNQRU5ELCAwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotQWxzbyAvc3lzLyBpbnRlcmZhY2Ugc2hvdWxkIGJlIHN0aWxsIHByZXNlbnQuCi0KIFE6IFdoYXQgaXMgJ3N1c3BlbmQyJz8KIAogQTogc3VzcGVuZDIgaXMgJ1NvZnR3YXJlIFN1c3BlbmQgMicsIGEgZm9ya2VkIGltcGxlbWVudGF0aW9uIG9mCkBAIC0zMTEsMyArMjg2LDQ2IEBACiBzeXN0ZW0gaXMgc2h1dCBkb3duIG9yIHN1c3BlbmRlZC4gQWRkaXRpb25hbGx5IHVzZSB0aGUgZW5jcnlwdGVkCiBzdXNwZW5kIGltYWdlIHRvIHByZXZlbnQgc2Vuc2l0aXZlIGRhdGEgZnJvbSBiZWluZyBzdG9sZW4gYWZ0ZXIKIHJlc3VtZS4KKworUTogV2h5IGNhbid0IHdlIHN1c3BlbmQgdG8gYSBzd2FwIGZpbGU/CisKK0E6IEJlY2F1c2UgYWNjZXNzaW5nIHN3YXAgZmlsZSBuZWVkcyB0aGUgZmlsZXN5c3RlbSBtb3VudGVkLCBhbmQKK2ZpbGVzeXN0ZW0gbWlnaHQgZG8gc29tZXRoaW5nIHdyb25nIChsaWtlIHJlcGxheWluZyB0aGUgam91cm5hbCkKK2R1cmluZyBtb3VudC4KKworVGhlcmUgYXJlIGZldyB3YXlzIHRvIGdldCB0aGF0IGZpeGVkOgorCisxKSBQcm9iYWJseSBjb3VsZCBiZSBzb2x2ZWQgYnkgbW9kaWZ5aW5nIGV2ZXJ5IGZpbGVzeXN0ZW0gdG8gc3VwcG9ydAorc29tZSBraW5kIG9mICJyZWFsbHkgcmVhZC1vbmx5ISIgb3B0aW9uLiBQYXRjaGVzIHdlbGNvbWUuCisKKzIpIHN1c3BlbmQyIGdldHMgYXJvdW5kIHRoYXQgYnkgc3RvcmluZyBhYnNvbHV0ZSBwb3NpdGlvbnMgaW4gb24tZGlzaworaW1hZ2UgKGFuZCBibG9ja3NpemUpLCB3aXRoIHJlc3VtZSBwYXJhbWV0ZXIgcG9pbnRpbmcgZGlyZWN0bHkgdG8KK3N1c3BlbmQgaGVhZGVyLgorCitROiBJcyB0aGVyZSBhIG1heGltdW0gc3lzdGVtIFJBTSBzaXplIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHN3c3VzcD8KKworQTogSXQgc2hvdWxkIHdvcmsgb2theSB3aXRoIGhpZ2htZW0uCisKK1E6IERvZXMgc3dzdXNwICh0byBkaXNrKSB1c2Ugb25seSBvbmUgc3dhcCBwYXJ0aXRpb24gb3IgY2FuIGl0IHVzZQorbXVsdGlwbGUgc3dhcCBwYXJ0aXRpb25zIChhZ2dyZWdhdGUgdGhlbSBpbnRvIG9uZSBsb2dpY2FsIHNwYWNlKT8KKworQTogT25seSBvbmUgc3dhcCBwYXJ0aXRpb24sIHNvcnJ5LgorCitROiBJZiBteSBhcHBsaWNhdGlvbihzKSBjYXVzZXMgbG90cyBvZiBtZW1vcnkgJiBzd2FwIHNwYWNlIHRvIGJlIHVzZWQKKyhvdmVyIGhhbGYgb2YgdGhlIHRvdGFsIHN5c3RlbSBSQU0pLCBpcyBpdCBjb3JyZWN0IHRoYXQgaXQgaXMgbGlrZWx5Cit0byBiZSB1c2VsZXNzIHRvIHRyeSB0byBzdXNwZW5kIHRvIGRpc2sgd2hpbGUgdGhhdCBhcHAgaXMgcnVubmluZz8KKworQTogTm8sIGl0IHNob3VsZCB3b3JrIG9rYXksIGFzIGxvbmcgYXMgeW91ciBhcHAgZG9lcyBub3QgbWxvY2soKQoraXQuIEp1c3QgcHJlcGFyZSBiaWcgZW5vdWdoIHN3YXAgcGFydGl0aW9uLgorCitROiBXaGF0IGluZm9ybWF0aW9uIGlzIHVzZWZ1bGwgZm9yIGRlYnVnZ2luZyBzdXNwZW5kLXRvLWRpc2sgcHJvYmxlbXM/CisKK0E6IFdlbGwsIGxhc3QgbWVzc2FnZXMgb24gdGhlIHNjcmVlbiBhcmUgYWx3YXlzIHVzZWZ1bC4gSWYgc29tZXRoaW5nCitpcyBicm9rZW4sIGl0IGlzIHVzdWFsbHkgc29tZSBrZXJuZWwgZHJpdmVyLCB0aGVyZWZvcmUgdHJ5aW5nIHdpdGggYXMKK2xpdHRsZSBhcyBwb3NzaWJsZSBtb2R1bGVzIGxvYWRlZCBoZWxwcyBhIGxvdC4gSSBhbHNvIHByZWZlciBwZW9wbGUgdG8KK3N1c3BlbmQgZnJvbSBjb25zb2xlLCBwcmVmZXJhYmx5IHdpdGhvdXQgWCBydW5uaW5nLiBCb290aW5nIHdpdGgKK2luaXQ9L2Jpbi9iYXNoLCB0aGVuIHN3YXBvbiBhbmQgc3RhcnRpbmcgc3VzcGVuZCBzZXF1ZW5jZSBtYW51YWxseQordXN1YWxseSBkb2VzIHRoZSB0cmljay4gVGhlbiBpdCBpcyBnb29kIGlkZWEgdG8gdHJ5IHdpdGggbGF0ZXN0Cit2YW5pbGxhIGtlcm5lbC4KKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvdmlkZW8udHh0CmluZGV4IDdhNGE1MDMuLjUyNmQ2ZGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvdmlkZW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvdmlkZW8udHh0CkBAIC00Niw2ICs0NiwxMiBAQAogICBQT1NUaW5nIGJpb3Mgd29ya3MuIE9sZSBSb2huZSBoYXMgcGF0Y2ggdG8gZG8ganVzdCB0aGF0IGF0CiAgIGh0dHA6Ly9kZXYuZ2VudG9vLm9yZy9+bWFyaW5lYW0vcGF0Y2gtcmFkZW9uZmItMi42LjExLXJjMi1tbTIuCiAKKyg4KSBvbiBzb21lIHN5c3RlbXMsIHlvdSBjYW4gdXNlIHRoZSB2aWRlb19wb3N0IHV0aWxpdHkgbWVudGlvbmVkIGhlcmU6CisgIGh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjcwLiBEbyBlY2hvIDMgPiAvc3lzL3Bvd2VyL3N0YXRlCisgICYmIC91c3Ivc2Jpbi92aWRlb19wb3N0IC0gd2hpY2ggd2lsbCBpbml0aWFsaXplIHRoZSBkaXNwbGF5IGluIGNvbnNvbGUgbW9kZS4KKyAgSWYgIHlvdSBhcmUgaW4gWCwgeW91IGNhbiBzd2l0Y2ggdG8gYSB2aXJ0dWFsIHRlcm1pbmFsIGFuZCBiYWNrIHRvIFggdXNpbmcKKyAgQ1RSTCtBTFQrRjEgLSBDVFJMK0FMVCtGNyB0byBnZXQgdGhlIGRpc3BsYXkgd29ya2luZyBpbiBncmFwaGljYWwgbW9kZSBhZ2Fpbi4KKwogTm93LCBpZiB5b3UgcGFzcyBhY3BpX3NsZWVwPXNvbWV0aGluZywgYW5kIGl0IGRvZXMgbm90IHdvcmsgd2l0aCB5b3VyCiBiaW9zLCB5b3UnbGwgZ2V0IGEgaGFyZCBjcmFzaCBkdXJpbmcgcmVzdW1lLiBCZSBjYXJlZnVsLiBBbHNvIGl0IGlzCiBzYWZlc3QgdG8gZG8geW91ciBleHBlcmltZW50cyB3aXRoIHBsYWluIG9sZCBWR0EgY29uc29sZS4gVGhlIHZlc2FmYgpAQCAtNjQsNyArNzAsOCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBBY2VyIEFzcGlyZSAxNDA2TEMJCW9sZSdzIGxhdGUgQklPUyBpbml0ICg3KSwgdHVybiBvZmYgRFJJCiBBY2VyIFRNIDI0MkZYCQkJdmJldG9vbCAoNikKLUFjZXIgVE0gQzMwMCAgICAgICAgICAgICAgICAgICAgdmdhPW5vcm1hbCAob25seSBzdXNwZW5kIG9uIGNvbnNvbGUsIG5vdCBpbiBYKSwgdmJldG9vbCAoNikKK0FjZXIgVE0gQzExMAkJCXZpZGVvX3Bvc3QgKDgpCitBY2VyIFRNIEMzMDAgICAgICAgICAgICAgICAgICAgIHZnYT1ub3JtYWwgKG9ubHkgc3VzcGVuZCBvbiBjb25zb2xlLCBub3QgaW4gWCksIHZiZXRvb2wgKDYpIG9yIHZpZGVvX3Bvc3QgKDgpCiBBY2VyIFRNIDQwNTJMQ2kJCSAgICAgICAgczNfYmlvcyAoMikKIEFjZXIgVE0gNjM2TGNpCQkJczNfYmlvcyB2Z2E9bm9ybWFsICgyKQogQWNlciBUTSA2NTAgKFJhZGVvbiBNNykJCXZnYT1ub3JtYWwgcGx1cyBib290LXJhZGVvbiAoNSkgZ2V0cyB0ZXh0IGNvbnNvbGUgYmFjawpAQCAtMTEzLDYgKzEyMCw3IEBACiBJQk0gVFAgWDIwCQkJPz8/ICgqKQogSUJNIFRQIFgzMAkJCXMzX2Jpb3MgKDIpCiBJQk0gVFAgWDMxIC8gVHlwZSAyNjcyLVhYSCAgICAgIG5vbmUgKDEpLCB1c2UgcmFkZW9udG9vbCAoaHR0cDovL2ZkZC5jb20vc29mdHdhcmUvcmFkZW9uLykgdG8gdHVybiBvZmYgYmFja2xpZ2h0LgorSUJNIFRQIFgzMgkJCW5vbmUgKDEpLCBidXQgYmFja2xpZ2h0IGlzIG9uIGFuZCB2aWRlbyBpcyB0cmFzaGVkIGFmdGVyIGxvbmcgc3VzcGVuZAogSUJNIFRoaW5rcGFkIFg0MCBUeXBlIDIzNzEtN0pHICBzM19iaW9zLHMzX21vZGUgKDQpCiBNZWRpb24gTUQ0MjIwCQkJPz8/ICgqKQogU2Ftc3VuZyBQMzUJCQl2YmV0b29sIG5lZWRlZCAoNikKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9lZWgtcGNpLWVycm9yLXJlY292ZXJ5LnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9lZWgtcGNpLWVycm9yLXJlY292ZXJ5LnR4dAppbmRleCAyYmZlNzFiLi5lNzVkNzQ3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZWVoLXBjaS1lcnJvci1yZWNvdmVyeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2VlaC1wY2ktZXJyb3ItcmVjb3ZlcnkudHh0CkBAIC0xMzQsNyArMTM0LDcgQEAKIHdpdGggdGhhdCBhZGRyZXNzIChpZiBhbnkpLgogCiBUaGUgZGVmYXVsdCBpbmNsdWRlL2FzbS1wcGM2NC9pby5oIG1hY3JvcyByZWFkYigpLCBpbmIoKSwgaW5zYigpLAotZXRjLiBpbmNsdWRlIGEgY2hlY2sgdG8gc2VlIGlmIHRoZSB0aGUgaS9vIHJlYWQgcmV0dXJuZWQgYWxsLTB4ZmYncy4KK2V0Yy4gaW5jbHVkZSBhIGNoZWNrIHRvIHNlZSBpZiB0aGUgaS9vIHJlYWQgcmV0dXJuZWQgYWxsLTB4ZmYncy4KIElmIHNvLCB0aGVzZSBtYWtlIGEgY2FsbCB0byBlZWhfZG5fY2hlY2tfZmFpbHVyZSgpLCB3aGljaCBpbiB0dXJuCiBhc2tzIHRoZSBmaXJtd2FyZSBpZiB0aGUgYWxsLWZmJ3MgdmFsdWUgaXMgdGhlIHNpZ24gb2YgYSB0cnVlIEVFSAogZXJyb3IuICBJZiBpdCBpcyBub3QsIHByb2Nlc3NpbmcgY29udGludWVzIGFzIG5vcm1hbC4gIFRoZSBncmFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0IGIvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0CmluZGV4IGUyNGZkZWEuLmUzMjFhOGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vczM5MC9zMzkwZGJmLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvczM5MGRiZi50eHQKQEAgLTQ2OCw3ICs0NjgsNyBAQAogVGhlIHJhdyB2aWV3IHJldHVybnMgYSBieXRlc3RyZWFtIGFzIHRoZSBkZWJ1ZyBhcmVhcyBhcmUgc3RvcmVkIGluIG1lbW9yeS4KIAogVGhlIHNwcmludGYgdmlldyBmb3JtYXRzIHRoZSBkZWJ1ZyBlbnRyaWVzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgc3ByaW50ZgotZnVuY3Rpb24gd291bGQgZG8uIFRoZSBzcHJpbnRmIGV2ZW50L2V4cGVjdGlvbiBmdWN0aW9ucyB3cml0ZSB0byB0aGUgCitmdW5jdGlvbiB3b3VsZCBkby4gVGhlIHNwcmludGYgZXZlbnQvZXhwZWN0aW9uIGZ1bmN0aW9ucyB3cml0ZSB0byB0aGUKIGRlYnVnIGVudHJ5IGEgcG9pbnRlciB0byB0aGUgZm9ybWF0IHN0cmluZyAoc2l6ZSA9IHNpemVvZihsb25nKSkgCiBhbmQgZm9yIGVhY2ggdmFyYXJnIGEgbG9uZyB2YWx1ZS4gU28gZS5nLiBmb3IgYSBkZWJ1ZyBlbnRyeSB3aXRoIGEgZm9ybWF0IAogc3RyaW5nIHBsdXMgdHdvIHZhcmFyZ3Mgb25lIHdvdWxkIG5lZWQgdG8gYWxsb2NhdGUgYSAoMyAqIHNpemVvZihsb25nKSkgCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvYWljN3h4eC50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvYWljN3h4eC50eHQKaW5kZXggMTYwZTczNS4uNDdlNzRkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL2FpYzd4eHgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9haWM3eHh4LnR4dApAQCAtMSw1ICsxLDUgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09ICAgIEFkYXB0ZWMgQWljN3h4eCBGYXN0IC0+IFVsdHJhMTYwIEZhbWlseSBNYW5hZ2VyIFNldCB2Ni4yLjI4ICAgPQorPSAgICBBZGFwdGVjIEFpYzd4eHggRmFzdCAtPiBVbHRyYTE2MCBGYW1pbHkgTWFuYWdlciBTZXQgdjcuMCAgICAgID0KID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRE1FIGZvciAgICAgICAgICAgICAgICAgICAgICAgICAgICA9CiA9ICAgICAgICAgICAgICAgICAgICAgVGhlIExpbnV4IE9wZXJhdGluZyBTeXN0ZW0gICAgICAgICAgICAgICAgICAgPQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEzMSw2ICsxMzEsMTAgQEAKICAgICAgIFNDU0kgInN0dWIiIGVmZmVjdHMuCiAKIDIuIFZlcnNpb24gSGlzdG9yeQorICAgNy4wCSAgKDR0aCBBdWd1c3QsIDIwMDUpCisJLSBVcGRhdGVkIGRyaXZlciB0byB1c2UgU0NTSSB0cmFuc3BvcnQgY2xhc3MgaW5mcmFzdHJ1Y3R1cmUKKwktIFVwcG9ydGVkIHNlcXVlbmNlciBhbmQgY29yZSBmaXhlcyBmcm9tIGxhc3QgYWRhcHRlYyByZWxlYXNlZAorCSAgdmVyc2lvbiBvZiB0aGUgZHJpdmVyLgogICAgNi4yLjM2IChKdW5lIDNyZCwgMjAwMykKICAgICAgICAgLSBDb3JyZWN0IGNvZGUgdGhhdCBkaXNhYmxlcyBQQ0kgcGFyaXR5IGVycm9yIGNoZWNraW5nLgogICAgICAgICAtIENvcnJlY3QgYW5kIHNpbXBsaWZ5IGhhbmRsaW5nIG9mIHRoZSBpZ25vcmUgd2lkZSByZXNpZHVlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvaWJtbWNhLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9pYm1tY2EudHh0CmluZGV4IDI4MTQ0OTEuLjJmZmIzYWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9pYm1tY2EudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9pYm1tY2EudHh0CkBAIC0zNDQsNyArMzQ0LDcgQEAKICAgIC9wcm9jL3Njc2kvaWJtbWNhLzxob3N0X25vPi4gaWJtbWNhX3Byb2NfaW5mbygpIHByb3ZpZGVzIHRoaXMgaW5mb3JtYXRpb24uCiAgICAKICAgIFRoaXMgdGFibGUgaXMgcXVpdGUgaW5mb3JtYXRpdmUgZm9yIGludGVyZXN0ZWQgdXNlcnMuIEl0IHNob3dzIHRoZSBsb2FkCi0gICBvZiBjb21tYW5kcyBvbiB0aGUgc3Vic3lzdGVtIGFuZCB3ZXRoZXIgeW91IGFyZSBydW5uaW5nIHRoZSBieXBhc3NlZCAKKyAgIG9mIGNvbW1hbmRzIG9uIHRoZSBzdWJzeXN0ZW0gYW5kIHdoZXRoZXIgeW91IGFyZSBydW5uaW5nIHRoZSBieXBhc3NlZAogICAgKHNvZnR3YXJlKSBvciBpbnRlZ3JhdGVkIChoYXJkd2FyZSkgU0NTSS1jb21tYW5kIHNldCAoc2VlIGJlbG93KS4gVGhlCiAgICBhbW91bnQgb2YgYWNjZXNzZXMgaXMgc2hvd24uIFJlYWQsIHdyaXRlLCBtb2Rlc2VsZWN0IGlzIHNob3duIHNlcGFyYXRlbHkKICAgIGluIG9yZGVyIHRvIGhlbHAgZGVidWdnaW5nIHByb2JsZW1zIHdpdGggQ0QtUk9NcyBvciB0YXBlZHJpdmVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfbWlkX2xvd19hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfbWlkX2xvd19hcGkudHh0CmluZGV4IDc1MzY4MjMuLjQ0ZGY4OWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX21pZF9sb3dfYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaV9taWRfbG93X2FwaS50eHQKQEAgLTM3MywxMyArMzczLDExIEBACiAgICBzY3NpX2FjdGl2YXRlX3RjcSAtIHR1cm4gb24gdGFnIGNvbW1hbmQgcXVldWVpbmcKICAgIHNjc2lfYWRkX2RldmljZSAtIGNyZWF0ZXMgbmV3IHNjc2kgZGV2aWNlIChsdSkgaW5zdGFuY2UKICAgIHNjc2lfYWRkX2hvc3QgLSBwZXJmb3JtIHN5c2ZzIHJlZ2lzdHJhdGlvbiBhbmQgU0NTSSBidXMgc2Nhbi4KLSAgIHNjc2lfYWRkX3RpbWVyIC0gKHJlLSlzdGFydCB0aW1lciBvbiBhIFNDU0kgY29tbWFuZC4KICAgIHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoIC0gY2hhbmdlIHRoZSBxdWV1ZSBkZXB0aCBvbiBhIFNDU0kgZGV2aWNlCiAgICBzY3NpX2Fzc2lnbl9sb2NrIC0gcmVwbGFjZSBkZWZhdWx0IGhvc3RfbG9jayB3aXRoIGdpdmVuIGxvY2sKICAgIHNjc2lfYmlvc19wdGFibGUgLSByZXR1cm4gY29weSBvZiBibG9jayBkZXZpY2UncyBwYXJ0aXRpb24gdGFibGUKICAgIHNjc2lfYmxvY2tfcmVxdWVzdHMgLSBwcmV2ZW50IGZ1cnRoZXIgY29tbWFuZHMgYmVpbmcgcXVldWVkIHRvIGdpdmVuIGhvc3QKICAgIHNjc2lfZGVhY3RpdmF0ZV90Y3EgLSB0dXJuIG9mZiB0YWcgY29tbWFuZCBxdWV1ZWluZwotICAgc2NzaV9kZWxldGVfdGltZXIgLSBjYW5jZWwgdGltZXIgb24gYSBTQ1NJIGNvbW1hbmQuCiAgICBzY3NpX2hvc3RfYWxsb2MgLSByZXR1cm4gYSBuZXcgc2NzaV9ob3N0IGluc3RhbmNlIHdob3NlIHJlZmNvdW50PT0xCiAgICBzY3NpX2hvc3RfZ2V0IC0gaW5jcmVtZW50cyBTY3NpX0hvc3QgaW5zdGFuY2UncyByZWZjb3VudAogICAgc2NzaV9ob3N0X3B1dCAtIGRlY3JlbWVudHMgU2NzaV9Ib3N0IGluc3RhbmNlJ3MgcmVmY291bnQgKGZyZWUgaWYgMCkKQEAgLTQ1OCwyNyArNDU2LDYgQEAKIAogCiAvKioKLSAqIHNjc2lfYWRkX3RpbWVyIC0gKHJlLSlzdGFydCB0aW1lciBvbiBhIFNDU0kgY29tbWFuZC4KLSAqIEBzY21kOiAgICBwb2ludGVyIHRvIHNjc2kgY29tbWFuZCBpbnN0YW5jZQotICogQHRpbWVvdXQ6IGR1cmF0aW9uIG9mIHRpbWVvdXQgaW4gImppZmZpZXMiCi0gKiBAY29tcGxldGU6IHBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gY2FsbCBpZiB0aW1lb3V0IGV4cGlyZXMKLSAqCi0gKiAgICAgIFJldHVybnMgbm90aGluZwotICoKLSAqICAgICAgTWlnaHQgYmxvY2s6IG5vCi0gKgotICogICAgICBOb3RlczogRWFjaCBzY3NpIGNvbW1hbmQgaGFzIGl0cyBvd24gdGltZXIsIGFuZCBhcyBpdCBpcyBhZGRlZAotICogICAgICB0byB0aGUgcXVldWUsIHdlIHNldCB1cCB0aGUgdGltZXIuIFdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGVzLCAKLSAqICAgICAgd2UgY2FuY2VsIHRoZSB0aW1lci4gQW4gTExEIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBjaGFuZ2UKLSAqICAgICAgdGhlIGV4aXN0aW5nIHRpbWVvdXQgdmFsdWUuCi0gKgotICogICAgICBEZWZpbmVkIGluOiBkcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCi0gKiovCi12b2lkIHNjc2lfYWRkX3RpbWVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsIGludCB0aW1lb3V0LCAKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmNvbXBsZXRlKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQotCi0KLS8qKgogICogc2NzaV9hZGp1c3RfcXVldWVfZGVwdGggLSBhbGxvdyBMTEQgdG8gY2hhbmdlIHF1ZXVlIGRlcHRoIG9uIGEgU0NTSSBkZXZpY2UKICAqIEBzZGV2OiAgICAgICBwb2ludGVyIHRvIFNDU0kgZGV2aWNlIHRvIGNoYW5nZSBxdWV1ZSBkZXB0aCBvbgogICogQHRhZ2dlZDogICAgIDAgLSBubyB0YWdnZWQgcXVldWluZwpAQCAtNTY2LDI0ICs1NDMsNiBAQAogCiAKIC8qKgotICogc2NzaV9kZWxldGVfdGltZXIgLSBjYW5jZWwgdGltZXIgb24gYSBTQ1NJIGNvbW1hbmQuCi0gKiBAc2NtZDogICAgcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgaW5zdGFuY2UKLSAqCi0gKiAgICAgIFJldHVybnMgMSBpZiBhYmxlIHRvIGNhbmNlbCB0aW1lciBlbHNlIDAgKGkuZS4gdG9vIGxhdGUgb3IgYWxyZWFkeQotICogICAgICBjYW5jZWxsZWQpLgotICoKLSAqICAgICAgTWlnaHQgYmxvY2s6IG5vIFttYXkgaW4gdGhlIGZ1dHVyZSBpZiBpdCBpbnZva2VzIGRlbF90aW1lcl9zeW5jKCldCi0gKgotICogICAgICBOb3RlczogQWxsIGNvbW1hbmRzIGlzc3VlZCBieSB1cHBlciBsZXZlbHMgYWxyZWFkeSBoYXZlIGEgdGltZW91dAotICogICAgICBhc3NvY2lhdGVkIHdpdGggdGhlbS4gQW4gTExEIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBjYW5jZWwgdGhlCi0gKiAgICAgIHRpbWVyLgotICoKLSAqICAgICAgRGVmaW5lZCBpbjogZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwotICoqLwotaW50IHNjc2lfZGVsZXRlX3RpbWVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCi0KLQotLyoqCiAgKiBzY3NpX2hvc3RfYWxsb2MgLSBjcmVhdGUgYSBzY3NpIGhvc3QgYWRhcHRlciBpbnN0YW5jZSBhbmQgcGVyZm9ybSBiYXNpYwogICogICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24uCiAgKiBAc2h0OiAgICAgICAgcG9pbnRlciB0byBzY3NpIGhvc3QgdGVtcGxhdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2VyaWFsL2RyaXZlciBiL0RvY3VtZW50YXRpb24vc2VyaWFsL2RyaXZlcgppbmRleCBhYzdlYWJiLi44Nzg1NmQzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NlcmlhbC9kcml2ZXIKKysrIGIvRG9jdW1lbnRhdGlvbi9zZXJpYWwvZHJpdmVyCkBAIC0xMTEsMjQgKzExMSwxNyBAQAogCUludGVycnVwdHM6IGxvY2FsbHkgZGlzYWJsZWQuCiAJVGhpcyBjYWxsIG11c3Qgbm90IHNsZWVwCiAKLSAgc3RvcF90eChwb3J0LHR0eV9zdG9wKQorICBzdG9wX3R4KHBvcnQpCiAJU3RvcCB0cmFuc21pdHRpbmcgY2hhcmFjdGVycy4gIFRoaXMgbWlnaHQgYmUgZHVlIHRvIHRoZSBDVFMKIAlsaW5lIGJlY29taW5nIGluYWN0aXZlIG9yIHRoZSB0dHkgbGF5ZXIgaW5kaWNhdGluZyB3ZSB3YW50Ci0JdG8gc3RvcCB0cmFuc21pc3Npb24uCi0KLQl0dHlfc3RvcDogMSBpZiB0aGlzIGNhbGwgaXMgZHVlIHRvIHRoZSBUVFkgbGF5ZXIgaXNzdWluZyBhCi0JICAgICAgICAgIFRUWSBzdG9wIHRvIHRoZSBkcml2ZXIgKGVxdWl2IHRvIHJzX3N0b3ApLgorCXRvIHN0b3AgdHJhbnNtaXNzaW9uIGR1ZSB0byBhbiBYT0ZGIGNoYXJhY3Rlci4KIAogCUxvY2tpbmc6IHBvcnQtPmxvY2sgdGFrZW4uCiAJSW50ZXJydXB0czogbG9jYWxseSBkaXNhYmxlZC4KIAlUaGlzIGNhbGwgbXVzdCBub3Qgc2xlZXAKIAotICBzdGFydF90eChwb3J0LHR0eV9zdGFydCkKLQlzdGFydCB0cmFuc21pdHRpbmcgY2hhcmFjdGVycy4gIChpbmNpZGVudGFsbHksIG5vbmVtcHR5IHdpbGwKLQlhbHdheXMgYmUgbm9uemVybywgYW5kIHNob3VsZG4ndCBiZSB1c2VkIC0gaXQgd2lsbCBiZSBkcm9wcGVkKS4KLQotCXR0eV9zdGFydDogMSBpZiB0aGlzIGNhbGwgd2FzIGR1ZSB0byB0aGUgVFRZIGxheWVyIGlzc3VpbmcKLQkgICAgICAgICAgIGEgVFRZIHN0YXJ0IHRvIHRoZSBkcml2ZXIgKGVxdWl2IHRvIHJzX3N0YXJ0KQorICBzdGFydF90eChwb3J0KQorCXN0YXJ0IHRyYW5zbWl0dGluZyBjaGFyYWN0ZXJzLgogCiAJTG9ja2luZzogcG9ydC0+bG9jayB0YWtlbi4KIAlJbnRlcnJ1cHRzOiBsb2NhbGx5IGRpc2FibGVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb255cGkudHh0IGIvRG9jdW1lbnRhdGlvbi9zb255cGkudHh0CmluZGV4IDBmM2IyNDAuLmMxMjM3YTkyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvbnlwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb255cGkudHh0CkBAIC05OSw2ICs5OSw3IEBACiAJCQkJU09OWVBJX01FWUVfTUFTSwkJMHgwNDAwCiAJCQkJU09OWVBJX01FTU9SWVNUSUNLX01BU0sJCTB4MDgwMAogCQkJCVNPTllQSV9CQVRURVJZX01BU0sJCTB4MTAwMAorCQkJCVNPTllQSV9XSVJFTEVTU19NQVNLCQkweDIwMDAKIAogCXVzZWlucHV0OglpZiBzZXQgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSB0d28gaW5wdXQgZGV2aWNlcyBhcmUKIAkJCWNyZWF0ZWQsIG9uZSB3aGljaCBpbnRlcnByZXRzIHRoZSBqb2dkaWFsIGV2ZW50cyBhcwpAQCAtMTM3LDYgKzEzOCwxNSBAQAogCSAgc3BlZWQgaGFuZGxpbmcgZXRjKS4gVXNlIEFDUEkgaW5zdGVhZCBvZiBBUE0gaWYgaXQgd29ya3Mgb24geW91cgogCSAgbGFwdG9wLgogCisJLSBzb255cGkgbGFja3MgdGhlIGFiaWxpdHkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBjZXJ0YWluIGtleQorCSAgZXZlbnRzIG9uIHNvbWUgbW9kZWxzLgorCisJLSBzb21lIG1vZGVscyB3aXRoIHRoZSBudmlkaWEgY2FyZCAoZ2Vmb3JjZSBnbyA2MjAwIHRjKSB1c2VzIGEKKwkgIGRpZmZlcmVudCB3YXkgdG8gYWRqdXN0IHRoZSBiYWNrbGlnaHRpbmcgb2YgdGhlIHNjcmVlbi4gVGhlcmUKKwkgIGlzIGEgdXNlcnNwYWNlIHV0aWxpdHkgdG8gYWRqdXN0IHRoZSBicmlnaHRuZXNzIG9uIHRob3NlIG1vZGVscywKKwkgIHdoaWNoIGNhbiBiZSBkb3dubG9hZGVkIGZyb20KKwkgIGh0dHA6Ly93d3cuYWNjLnVtdS5zZS9+ZXJpa3cvcHJvZ3JhbS9zbWFydGRpbW1lci0wLjEudGFyLmJ6MgorCiAJLSBzaW5jZSBhbGwgZGV2ZWxvcG1lbnQgd2FzIGRvbmUgYnkgcmV2ZXJzZSBlbmdpbmVlcmluZywgdGhlcmUgaXMKIAkgIF9hYnNvbHV0ZWx5IG5vIGd1YXJhbnRlZV8gdGhhdCB0aGlzIGRyaXZlciB3aWxsIG5vdCBjcmFzaCB5b3VyCiAJICBsYXB0b3AuIFBlcm1hbmVudGx5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dAppbmRleCBhMThlY2I5Li5lYmZjZGYyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dApAQCAtMTMyLDYgKzEzMiw3IEBACiAgICAgbXB1X2lycQktIElSUSAjIGZvciBNUFUtNDAxIFVBUlQgKFBuUCBzZXR1cCkKICAgICBkbWExCS0gZmlyc3QgRE1BICMgZm9yIEFEMTgxNkEgY2hpcCAoUG5QIHNldHVwKQogICAgIGRtYTIJLSBzZWNvbmQgRE1BICMgZm9yIEFEMTgxNkEgY2hpcCAoUG5QIHNldHVwKQorICAgIGNsb2NrZnJlcSAgIC0gQ2xvY2sgZnJlcXVlbmN5IGZvciBBRDE4MTZBIGNoaXAgKGRlZmF1bHQgPSAwLCAzMzAwMEh6KQogICAgIAogICAgIE1vZHVsZSBzdXBwb3J0cyB1cCB0byA4IGNhcmRzLCBhdXRvcHJvYmUgYW5kIFBuUC4KICAgICAKQEAgLTE0NTgsNyArMTQ1OSw3IEBACiBUbyBhdXRvLWxvYWQgYW4gQUxTQSBkcml2ZXIgZm9yIE9TUyBzZXJ2aWNlcywgZGVmaW5lIHRoZSBzdHJpbmcKICdzb3VuZC1zbG90LSVpJyB3aGVyZSAlaSBtZWFucyB0aGUgc2xvdCBudW1iZXIgZm9yIE9TUywgd2hpY2gKIGNvcnJlc3BvbmRzIHRvIHRoZSBjYXJkIGluZGV4IG9mIEFMU0EuICBVc3VhbGx5LCBkZWZpbmUgdGhpcwotYXMgdGhlIHRoZSBzYW1lIGNhcmQgbW9kdWxlLgorYXMgdGhlIHNhbWUgY2FyZCBtb2R1bGUuCiAKIEFuIGV4YW1wbGUgY29uZmlndXJhdGlvbiBmb3IgYSBzaW5nbGUgZW11MTBrMSBjYXJkIGlzIGxpa2UgYmVsb3c6CiAtLS0tLSAvZXRjL21vZHByb2JlLmNvbmYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbAppbmRleCBkYjBiN2QyLi4wNDc1NDc4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCkBAIC0zNDIyLDEwICszNDIyLDE3IEBACiAKICAgICAgIDxwYXJhPgogICAgICAgICBUaGUgPHN0cnVjdGZpZWxkPmlmYWNlPC9zdHJ1Y3RmaWVsZD4gZmllbGQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mCi0gICAgICB0aGUgY29udHJvbCwKLSAgICAgIDxjb25zdGFudD5TTkRSVl9DVExfRUxFTV9JRkFDRV9YWFg8L2NvbnN0YW50Pi4gVGhlcmUgYXJlCi0gICAgICA8Y29uc3RhbnQ+TUlYRVI8L2NvbnN0YW50PiwgPGNvbnN0YW50PlBDTTwvY29uc3RhbnQ+LAotICAgICAgPGNvbnN0YW50PkNBUkQ8L2NvbnN0YW50PiwgZXRjLgorICAgICAgdGhlIGNvbnRyb2wsIDxjb25zdGFudD5TTkRSVl9DVExfRUxFTV9JRkFDRV9YWFg8L2NvbnN0YW50Piwgd2hpY2gKKyAgICAgIGlzIHVzdWFsbHkgPGNvbnN0YW50Pk1JWEVSPC9jb25zdGFudD4uCisgICAgICBVc2UgPGNvbnN0YW50PkNBUkQ8L2NvbnN0YW50PiBmb3IgZ2xvYmFsIGNvbnRyb2xzIHRoYXQgYXJlIG5vdAorICAgICAgbG9naWNhbGx5IHBhcnQgb2YgdGhlIG1peGVyLgorICAgICAgSWYgdGhlIGNvbnRyb2wgaXMgY2xvc2VseSBhc3NvY2lhdGVkIHdpdGggc29tZSBzcGVjaWZpYyBkZXZpY2Ugb24KKyAgICAgIHRoZSBzb3VuZCBjYXJkLCB1c2UgPGNvbnN0YW50PkhXREVQPC9jb25zdGFudD4sCisgICAgICA8Y29uc3RhbnQ+UENNPC9jb25zdGFudD4sIDxjb25zdGFudD5SQVdNSURJPC9jb25zdGFudD4sCisgICAgICA8Y29uc3RhbnQ+VElNRVI8L2NvbnN0YW50Piwgb3IgPGNvbnN0YW50PlNFUVVFTkNFUjwvY29uc3RhbnQ+LCBhbmQKKyAgICAgIHNwZWNpZnkgdGhlIGRldmljZSBudW1iZXIgd2l0aCB0aGUKKyAgICAgIDxzdHJ1Y3RmaWVsZD5kZXZpY2U8L3N0cnVjdGZpZWxkPiBhbmQKKyAgICAgIDxzdHJ1Y3RmaWVsZD5zdWJkZXZpY2U8L3N0cnVjdGZpZWxkPiBmaWVsZHMuCiAgICAgICA8L3BhcmE+CiAKICAgICAgIDxwYXJhPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGFyc2UudHh0IGIvRG9jdW1lbnRhdGlvbi9zcGFyc2UudHh0CmluZGV4IGY5Nzg0MTQuLjVkZjQ0ZGMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BhcnNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NwYXJzZS50eHQKQEAgLTU3LDcgKzU3LDcgQEAKIAogYW5kIERhdmVKIGhhcyB0YXItYmFsbHMgYXQKIAotCWh0dHA6Ly93d3cuY29kZW1vbmtleS5vcmcudWsvcHJvamVjdHMvYml0a2VlcGVyL3NwYXJzZS8KKwlodHRwOi8vd3d3LmNvZGVtb25rZXkub3JnLnVrL3Byb2plY3RzL2dpdC1zbmFwc2hvdHMvc3BhcnNlLwogCiAKIE9uY2UgeW91IGhhdmUgaXQsIGp1c3QgZG8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzcnEudHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNycS50eHQKaW5kZXggMTM2ZDgxNy4uYmFmMTdiMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNycS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNycS50eHQKQEAgLTE3MSw3ICsxNzEsNyBAQAogTmV4dCwgeW91IG11c3QgY3JlYXRlIGEgc3lzcnFfa2V5X29wIHN0cnVjdCwgYW5kIHBvcHVsYXRlIGl0IHdpdGggQSkgdGhlIGtleQogaGFuZGxlciBmdW5jdGlvbiB5b3Ugd2lsbCB1c2UsIEIpIGEgaGVscF9tc2cgc3RyaW5nLCB0aGF0IHdpbGwgcHJpbnQgd2hlbiBTeXNSUQogcHJpbnRzIGhlbHAsIGFuZCBDKSBhbiBhY3Rpb25fbXNnIHN0cmluZywgdGhhdCB3aWxsIHByaW50IHJpZ2h0IGJlZm9yZSB5b3VyCi1oYW5kbGVyIGlzIGNhbGxlZC4gWW91ciBoYW5kbGVyIG11c3QgY29uZm9ybSB0byB0aGUgcHJvdG95cGUgaW4gJ3N5c3JxLmgnLgoraGFuZGxlciBpcyBjYWxsZWQuIFlvdXIgaGFuZGxlciBtdXN0IGNvbmZvcm0gdG8gdGhlIHByb3RvdHlwZSBpbiAnc3lzcnEuaCcuCiAKIEFmdGVyIHRoZSBzeXNycV9rZXlfb3AgaXMgY3JlYXRlZCwgeW91IGNhbiBjYWxsIHRoZSBtYWNybyAKIHJlZ2lzdGVyX3N5c3JxX2tleShpbnQga2V5LCBzdHJ1Y3Qgc3lzcnFfa2V5X29wICpvcF9wKSB0aGF0IGlzIGRlZmluZWQgaW4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0IGIvRG9jdW1lbnRhdGlvbi91bWwvVXNlck1vZGVMaW51eC1IT1dUTy50eHQKaW5kZXggMGM3YjY1NC4uNTQ0NDMwZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91bWwvVXNlck1vZGVMaW51eC1IT1dUTy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91bWwvVXNlck1vZGVMaW51eC1IT1dUTy50eHQKQEAgLTIxNzYsNyArMjE3Niw3IEBACiAgIElmIHlvdSB3YW50IHRvIGFjY2VzcyBmaWxlcyBvbiB0aGUgaG9zdCBtYWNoaW5lIGZyb20gaW5zaWRlIFVNTCwgeW91CiAgIGNhbiB0cmVhdCBpdCBhcyBhIHNlcGFyYXRlIG1hY2hpbmUgYW5kIGVpdGhlciBuZnMgbW91bnQgZGlyZWN0b3JpZXMKICAgZnJvbSB0aGUgaG9zdCBvciBjb3B5IGZpbGVzIGludG8gdGhlIHZpcnR1YWwgbWFjaGluZSB3aXRoIHNjcCBvciByY3AuCi0gIEhvd2V2ZXIsIHNpbmNlIFVNTCBpcyBydW5uaW5nIG9uIHRoZSB0aGUgaG9zdCwgaXQgY2FuIGFjY2VzcyB0aG9zZQorICBIb3dldmVyLCBzaW5jZSBVTUwgaXMgcnVubmluZyBvbiB0aGUgaG9zdCwgaXQgY2FuIGFjY2VzcyB0aG9zZQogICBmaWxlcyBqdXN0IGxpa2UgYW55IG90aGVyIHByb2Nlc3MgYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUgaW5zaWRlIHRoZQogICB2aXJ0dWFsIG1hY2hpbmUgd2l0aG91dCBuZWVkaW5nIHRvIHVzZSB0aGUgbmV0d29yay4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvZ2FkZ2V0X3NlcmlhbC50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi9nYWRnZXRfc2VyaWFsLnR4dAppbmRleCBhOTM4YzNkLi44MTVmNWMyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi9nYWRnZXRfc2VyaWFsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9nYWRnZXRfc2VyaWFsLnR4dApAQCAtMjAsNyArMjAsNyBAQAogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKIE1BIDAyMTExLTEzMDcgVVNBLgogCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgdGhlIGdhZGdldCBzZXJpYWwgZHJpdmVyIGl0c2VsZiBhcmUKK1RoaXMgZG9jdW1lbnQgYW5kIHRoZSBnYWRnZXQgc2VyaWFsIGRyaXZlciBpdHNlbGYgYXJlCiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgQWwgQm9yY2hlcnMgKGFsYm9yY2hlcnNAc3RlaW5lcnBvaW50LmNvbSkuCiAKIElmIHlvdSBoYXZlIHF1ZXN0aW9ucywgcHJvYmxlbXMsIG9yIHN1Z2dlc3Rpb25zIGZvciB0aGlzIGRyaXZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2CmluZGV4IDYyYTEyYTAuLmVjNzg1ZjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0dgorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYKQEAgLTEyNiwxMCArMTI2LDEyIEBACiBjYXJkPTEyNSAtIE1BVFJJWCBWaXNpb24gU2lnbWEtU1EKIGNhcmQ9MTI2IC0gTUFUUklYIFZpc2lvbiBTaWdtYS1TTEMKIGNhcmQ9MTI3IC0gQVBBQyBWaWV3Y29tcCA4NzgoQU1BWCkKLWNhcmQ9MTI4IC0gRFZJQ08gRnVzaW9uSERUViBEVkItVCBMaXRlCitjYXJkPTEyOCAtIERWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZQogY2FyZD0xMjkgLSBWLUdlYXIgTXlWQ0QKIGNhcmQ9MTMwIC0gU3VwZXIgVFYgVHVuZXIKIGNhcmQ9MTMxIC0gVGliZXQgU3lzdGVtcyAnUHJvZ3Jlc3MgRFZSJyBDUzE2CiBjYXJkPTEzMiAtIEtvZGljb20gNDQwMFIgKG1hc3RlcikKIGNhcmQ9MTMzIC0gS29kaWNvbSA0NDAwUiAoc2xhdmUpCiBjYXJkPTEzNCAtIEFkbGluayBSVFYyNAorY2FyZD0xMzUgLSBEVmlDTyBGdXNpb25IRFRWIDUgTGl0ZQorY2FyZD0xMzYgLSBBY29ycCBZODc4RgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CmluZGV4IDFiNWEzYTkuLmRjNTcyMjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKQEAgLTYyLDMgKzYyLDYgQEAKICA2MSAtPiBQaGlsaXBzIFRPVUdIIERWQi1UIHJlZmVyZW5jZSBkZXNpZ24gICAgIFsxMTMxOjIwMDRdCiAgNjIgLT4gQ29tcHJvIFZpZGVvTWF0ZSBUViBHb2xkK0lJCiAgNjMgLT4gS3dvcmxkIFhwZXJ0IFRWIFBWUjcxMzQKKyA2NCAtPiBGbHlUViBtaW5pIEFzdXMgRGlnaW1hdHJpeCAgICAgICAgICAgICAgIFsxMDQzOjAyMTAsMTA0MzowMjEwXQorIDY1IC0+IFYtU3RyZWFtIFN0dWRpbyBUViBUZXJtaW5hdG9yCisgNjYgLT4gWXVhbiBUVU4tOTAwIChzYWE3MTM1KQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lciBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIKaW5kZXggZjMzMDJlMS4uZjU4NzZiZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lcgorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyCkBAIC02NCwzICs2NCw0IEBACiB0dW5lcj02MyAtIFBoaWxpcHMgRk1EMTIxNk1FIE1LMyBIeWJyaWQgVHVuZXIKIHR1bmVyPTY0IC0gTEcgVERWUy1IMDYyRi9UVUE2MDM0CiB0dW5lcj02NSAtIFltZWMgVFZGNjZUNS1CL0RGRgordHVuZXI9NjYgLSBMRyBOVFNDIChUQUxOIG1pbmkgc2VyaWVzKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ab3JhbiBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvWm9yYW4KaW5kZXggMDE0MjVjMi4uNTJjOTRiZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ab3JhbgorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1pvcmFuCkBAIC0yMjIsNyArMjIyLDcgQEAKIGNhbiBnZW5lcmF0ZTogUEFMICwgTlRTQyAsIFNFQ0FNCiAKIFRoZSBhZHY3MTd4LCBzaG91bGQgYmUgYWJsZSB0byBwcm9kdWNlIFBBTCBOLiBCdXQgeW91IGZpbmQgbm90aGluZyBQQUwgTiAKLXNwZWNpZmljIGluIHRoZSB0aGUgcmVnaXN0ZXJzLiBTZWVtIHRoYXQgeW91IGhhdmUgdG8gcmV1c2UgYSBvdGhlciBzdGFuZGFyZAorc3BlY2lmaWMgaW4gdGhlIHJlZ2lzdGVycy4gU2VlbSB0aGF0IHlvdSBoYXZlIHRvIHJldXNlIGEgb3RoZXIgc3RhbmRhcmQKIHRvIGdlbmVyYXRlIFBBTCBOLCBtYXliZSBpdCB3b3VsZCB3b3JrIGlmIHlvdSB1c2UgdGhlIFBBTCBNIHNldHRpbmdzLiAKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vbG9ja2luZyBiL0RvY3VtZW50YXRpb24vdm0vbG9ja2luZwppbmRleCBjM2VmMDlhLi5mMzY2ZmE5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL2xvY2tpbmcKKysrIGIvRG9jdW1lbnRhdGlvbi92bS9sb2NraW5nCkBAIC04MywxOSArODMsMTggQEAKIHZtdHJ1bmNhdGUpIGRvZXMgbm90IGxvc2Ugc2VuZGluZyBpcGkncyB0byBjbG9uZWQgdGhyZWFkcyB0aGF0IG1pZ2h0IAogYmUgc3Bhd25lZCB1bmRlcm5lYXRoIGl0IGFuZCBnbyB0byB1c2VyIG1vZGUgdG8gZHJhZyBpbiBwdGUncyBpbnRvIHRsYnMuCiAKLXN3YXBfbGlzdF9sb2NrL3N3YXBfZGV2aWNlX2xvY2sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N3YXBfbG9jaworLS0tLS0tLS0tLS0tLS0KIFRoZSBzd2FwIGRldmljZXMgYXJlIGNoYWluZWQgaW4gcHJpb3JpdHkgb3JkZXIgZnJvbSB0aGUgInN3YXBfbGlzdCIgaGVhZGVyLiAKIFRoZSAic3dhcF9saXN0IiBpcyB1c2VkIGZvciB0aGUgcm91bmQtcm9iaW4gc3dhcGhhbmRsZSBhbGxvY2F0aW9uIHN0cmF0ZWd5LgogVGhlICNmcmVlIHN3YXBoYW5kbGVzIGlzIG1haW50YWluZWQgaW4gIm5yX3N3YXBfcGFnZXMiLiBUaGVzZSB0d28gdG9nZXRoZXIKLWFyZSBwcm90ZWN0ZWQgYnkgdGhlIHN3YXBfbGlzdF9sb2NrLiAKK2FyZSBwcm90ZWN0ZWQgYnkgdGhlIHN3YXBfbG9jay4KIAotVGhlIHN3YXBfZGV2aWNlX2xvY2ssIHdoaWNoIGlzIHBlciBzd2FwIGRldmljZSwgcHJvdGVjdHMgdGhlIHJlZmVyZW5jZSAKLWNvdW50cyBvbiB0aGUgY29ycmVzcG9uZGluZyBzd2FwaGFuZGxlcywgbWFpbnRhaW5lZCBpbiB0aGUgInN3YXBfbWFwIgotYXJyYXksIGFuZCB0aGUgImhpZ2hlc3RfYml0IiBhbmQgImxvd2VzdF9iaXQiIGZpZWxkcy4KK1RoZSBzd2FwX2xvY2sgYWxzbyBwcm90ZWN0cyBhbGwgdGhlIGRldmljZSByZWZlcmVuY2UgY291bnRzIG9uIHRoZQorY29ycmVzcG9uZGluZyBzd2FwaGFuZGxlcywgbWFpbnRhaW5lZCBpbiB0aGUgInN3YXBfbWFwIiBhcnJheSwgYW5kIHRoZQorImhpZ2hlc3RfYml0IiBhbmQgImxvd2VzdF9iaXQiIGZpZWxkcy4KIAotQm90aCBvZiB0aGVzZSBhcmUgc3BpbmxvY2tzLCBhbmQgYXJlIG5ldmVyIGFjcXVpcmVkIGZyb20gaW50ciBsZXZlbC4gVGhlCi1sb2NraW5nIGhpZXJhcmNoeSBpcyBzd2FwX2xpc3RfbG9jayAtPiBzd2FwX2RldmljZV9sb2NrLgorVGhlIHN3YXBfbG9jayBpcyBhIHNwaW5sb2NrLCBhbmQgaXMgbmV2ZXIgYWNxdWlyZWQgZnJvbSBpbnRyIGxldmVsLgogCiBUbyBwcmV2ZW50IHJhY2VzIGJldHdlZW4gc3dhcCBzcGFjZSBkZWxldGlvbiBvciBhc3luYyByZWFkYWhlYWQgc3dhcGlucwogZGVjaWRpbmcgd2hldGhlciBhIHN3YXAgaGFuZGxlIGlzIGJlaW5nIHVzZWQsIGllIHdvcnRoeSBvZiBiZWluZyByZWFkIGluCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLWFwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLWFwaS50eHQKaW5kZXggMjgzODhhYS4uYzViZWI1NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1hcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2ctYXBpLnR4dApAQCAtMjI4LDYgKzIyOCwyNiBAQAogCVRoZSBHRVRTVEFUVVMgY2FsbCByZXR1cm5zIGlmIHRoZSBkZXZpY2UgaXMgb3BlbiBvciBub3QuCiAJW0ZJWE1FIC0tIHNpbGxpbmVzcyBhZ2Fpbj9dCiAJCitib29rZV93ZHQuYyAtLSBQb3dlclBDIEJvb2tFIFdhdGNoZG9nIFRpbWVyCisKKwlUaW1lb3V0IGRlZmF1bHQgdmFyaWVzIGFjY29yZGluZyB0byBmcmVxdWVuY3ksIHN1cHBvcnRzCisJU0VUVElNRU9VVAorCisJV2F0Y2hkb2cgY2FuIG5vdCBiZSB0dXJuZWQgb2ZmLCBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKKwlkb2VzIG5vdCBtYWtlIHNlbnNlCisKKwlHRVRTVVBQT1JUIHJldHVybnMgdGhlIHdhdGNoZG9nX2luZm8gc3RydWN0LCBhbmQKKwlHRVRTVEFUVVMgcmV0dXJucyB0aGUgc3VwcG9ydGVkIG9wdGlvbnMuIEdFVEJPT1RTVEFUVVMKKwlyZXR1cm5zIGEgMSBpZiB0aGUgbGFzdCByZXNldCB3YXMgY2F1c2VkIGJ5IHRoZQorCXdhdGNoZG9nIGFuZCBhIDAgb3RoZXJ3aXNlLiBUaGlzIHdhdGNoZG9nIGNhbiBub3QgYmUKKwlkaXNhYmxlZCBvbmNlIGl0IGhhcyBiZWVuIHN0YXJ0ZWQuIFRoZSB3ZHRfcGVyaW9kIGtlcm5lbAorCXBhcmFtZXRlciBzZWxlY3RzIHdoaWNoIGJpdCBvZiB0aGUgdGltZSBiYXNlIGNoYW5naW5nCisJZnJvbSAwLT4xIHdpbGwgdHJpZ2dlciB0aGUgd2F0Y2hkb2cgZXhjZXB0aW9uLiBDaGFuZ2luZworCXRoZSB0aW1lb3V0IGZyb20gdGhlIGlvY3RsIGNhbGxzIHdpbGwgY2hhbmdlIHRoZQorCXdkdF9wZXJpb2QgYXMgZGVmaW5lZCBhYm92ZS4gRmluYWxseSBpZiB5b3Ugd291bGQgbGlrZSB0bworCXJlcGxhY2UgdGhlIGRlZmF1bHQgV2F0Y2hkb2cgSGFuZGxlciB5b3UgY2FuIGltcGxlbWVudCB0aGUKKwlXYXRjaGRvZ0hhbmRsZXIoKSBmdW5jdGlvbiBpbiB5b3VyIG93biBjb2RlLgorCiBldXJvdGVjaHdkdC5jIC0tIEV1cm90ZWNoIENQVS0xMjIwLzE0MTAKIAogCVRoZSB0aW1lb3V0IGNhbiBiZSBzZXQgdXNpbmcgdGhlIFNFVFRJTUVPVVQgaW9jdGwgYW5kIGRlZmF1bHRzCmRpZmYgLS1naXQgYS9LYnVpbGQgYi9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwMDM5MQotLS0gL2Rldi9udWxsCisrKyBiL0tidWlsZApAQCAtMCwwICsxLDQ5IEBACisjCisjIEtidWlsZCBmb3IgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB0aGUga2VybmVsCisjIFRoaXMgZmlsZSB0YWtlcyBjYXJlIG9mIHRoZSBmb2xsb3dpbmc6CisjIDEpIEdlbmVyYXRlIGFzbS1vZmZzZXRzLmgKKworIyMjIyMKKyMgMSkgR2VuZXJhdGUgYXNtLW9mZnNldHMuaAorIworCitvZmZzZXRzLWZpbGUgOj0gaW5jbHVkZS9hc20tJChBUkNIKS9hc20tb2Zmc2V0cy5oCisKK2Fsd2F5cyAgOj0gJChvZmZzZXRzLWZpbGUpCit0YXJnZXRzIDo9ICQob2Zmc2V0cy1maWxlKQordGFyZ2V0cyArPSBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMKKworIyBEZWZhdWx0IHNlZCByZWdleHAgLSBtdWx0aWxpbmUgZHVlIHRvIHN5bnRheCBjb25zdHJhaW50cworZGVmaW5lIHNlZC15CisJIi9eLT4ve3M6Xi0+XChbXiBdKlwpIFtcJCQjXSpcKFteIF0qXCkgXCguKlwpOiNkZWZpbmUgXDEgXDIgLyogXDMgKi86OyBzOi0+Ojo7IHA7fSIKK2VuZGVmCisjIE92ZXJyaWRlIGRlZmF1bHQgcmVnZXhwIGZvciBzcGVjaWZpYyBhcmNoaXRlY3R1cmVzCitzZWQtJChDT05GSUdfTUlQUykgOj0gIi9eQEBAL3MvLy9wIgorCitxdWlldF9jbWRfb2Zmc2V0cyA9IEdFTiAgICAgJEAKK2RlZmluZSBjbWRfb2Zmc2V0cworCW1rZGlyIC1wICQoZGlyICRAKTsgXAorCWNhdCAkPCB8IFwKKwkoc2V0IC1lOyBcCisJIGVjaG8gIiNpZm5kZWYgX19BU01fT0ZGU0VUU19IX18iOyBcCisJIGVjaG8gIiNkZWZpbmUgX19BU01fT0ZGU0VUU19IX18iOyBcCisJIGVjaG8gIi8qIjsgXAorCSBlY2hvICIgKiBETyBOT1QgTU9ESUZZLiI7IFwKKwkgZWNobyAiICoiOyBcCisJIGVjaG8gIiAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICQoc3JjdHJlZSkvS2J1aWxkIjsgXAorCSBlY2hvICIgKiI7IFwKKwkgZWNobyAiICovIjsgXAorCSBlY2hvICIiOyBcCisJIHNlZCAtbmUgJChzZWQteSk7IFwKKwkgZWNobyAiIjsgXAorCSBlY2hvICIjZW5kaWYiICkgPiAkQAorZW5kZWYKKworIyBXZSB1c2UgaW50ZXJuYWwga2J1aWxkIHJ1bGVzIHRvIGF2b2lkIHRoZSAiaXMgdXAgdG8gZGF0ZSIgbWVzc2FnZSBmcm9tIG1ha2UKK2FyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMuczogYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5jIEZPUkNFCisJJChRKW1rZGlyIC1wICQoZGlyICRAKQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjY19zX2MpCisKKyQob2JqKS8kKG9mZnNldHMtZmlsZSk6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucyBLYnVpbGQKKwkkKGNhbGwgY21kLG9mZnNldHMpCisKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggNTY0YTAzZS4uZjAzOGRjYSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTExNiw2ICsxMTYsMTIgQEAKIEw6CWxpbnV4LWhhbXNAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK1lFQUxJTksgUEhPTkUgRFJJVkVSCitQOglIZW5rIFZlcmdvbmV0CitNOglIZW5rLlZlcmdvbmV0QGdtYWlsLmNvbQorTDoJdXNiYjJrLWFwaS1kZXZAbm9uZ251Lm9yZworUzoJTWFpbnRhaW5lZAorCiA4MTM5Q1AgMTAvMTAwIEZBU1QgRVRIRVJORVQgRFJJVkVSCiBQOglKZWZmIEdhcnppawogTToJamdhcnppa0Bwb2JveC5jb20KQEAgLTIwMiwxMyArMjA4LDYgQEAKIE06CWNvbGluQGNvbGluby5uZXQKIFM6CU1haW50YWluZWQKIAotQURWQU5TWVMgU0NTSSBEUklWRVIKLVA6CUJvYiBGcmV5Ci1NOglsaW51eEBhZHZhbnN5cy5jb20KLVc6CWh0dHA6Ly93d3cuYWR2YW5zeXMuY29tL2xpbnV4Lmh0bWwKLUw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi0KIEFFRFNQMTYgRFJJVkVSCiBQOglSaWNjYXJkbyBGYWNjaGV0dGkKIE06CWZpemJhbkB0aW4uaXQKQEAgLTYyNyw2ICs2MjYsMTIgQEAKIFc6CWh0dHA6Ly93d3cuYXJtLmxpbnV4Lm9yZy51ay8KIFM6CU1haW50YWluZWQKIAorQ1lCTEFGQiBGUkFNRUJVRkZFUiBEUklWRVIKK1A6CUtudXQgUGV0ZXJzZW4KK006CUtudXRfUGV0ZXJzZW5AdC1vbmxpbmUuZGUKK0w6CWxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorUzoJTWFpbnRhaW5lZAorCiBDWUNMQURFUyAyWCBTWU5DIENBUkQgRFJJVkVSCiBQOglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8KIE06CWFjbWVAY29uZWN0aXZhLmNvbS5icgpAQCAtNjk2LDYgKzcwMSwxMSBAQAogVzoJaHR0cDovL3d3dy5kZWJpYW4ub3JnL35kei9pOGsvCiBTOglNYWludGFpbmVkCiAKK0RFTEwgU1lTVEVNUyBNQU5BR0VNRU5UIEJBU0UgRFJJVkVSIChkY2RiYXMpCitQOglEb3VnIFdhcnplY2hhCitNOglEb3VnbGFzX1dhcnplY2hhQGRlbGwuY29tCitTOglNYWludGFpbmVkCisKIERFVklDRS1NQVBQRVIKIFA6CUFsYXNkYWlyIEtlcmdvbgogTDoJZG0tZGV2ZWxAcmVkaGF0LmNvbQpAQCAtODI0LDYgKzgzNCwxMyBAQAogVzoJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9lbXUxMGsxLwogUzoJTWFpbnRhaW5lZAogCitFTVVMRVggTFBGQyBGQyBTQ1NJIERSSVZFUgorUDogICAgICBKYW1lcyBTbWFydAorTTogICAgICBqYW1lcy5zbWFydEBlbXVsZXguY29tCitMOiAgICAgIGxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCitXOiAgICAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbHBmY3h4eHgKK1M6ICAgICAgU3VwcG9ydGVkCisKIEVQU09OIDEzNTUgRlJBTUVCVUZGRVIgRFJJVkVSCiBQOglDaHJpc3RvcGhlciBIb292ZXIKIE06CWNoQG11cmdhdHJvaWQuY29tLCBjaEBocGwuaHAuY29tCkBAIC04NzksNyArODk2LDcgQEAKIAogRklMRVNZU1RFTVMgKFZGUyBhbmQgaW5mcmFzdHJ1Y3R1cmUpCiBQOglBbGV4YW5kZXIgVmlybwotTToJdmlyb0BwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWsKK006CXZpcm9AemVuaXYubGludXgub3JnLnVrCiBTOglNYWludGFpbmVkCiAKIEZJUk1XQVJFIExPQURFUiAocmVxdWVzdF9maXJtd2FyZSkKQEAgLTkxNCw2ICs5MzEsMTMgQEAKIFc6CWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZnRhcGUKIFM6CU9ycGhhbgogCitGVVNFOiBGSUxFU1lTVEVNIElOIFVTRVJTUEFDRQorUDoJTWlrbG9zIFN6ZXJlZGkKK006CW1pa2xvc0BzemVyZWRpLmh1CitMOglmdXNlLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorVzoJaHR0cDovL2Z1c2Uuc291cmNlZm9yZ2UubmV0LworUzoJTWFpbnRhaW5lZAorCiBGVVRVUkUgRE9NQUlOIFRNQy0xNngwIFNDU0kgRFJJVkVSICgxNi1iaXQpCiBQOglSaWsgRmFpdGgKIE06CWZhaXRoQGNzLnVuYy5lZHUKQEAgLTkzMyw2ICs5NTcsMTMgQEAKIFc6CWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2hkbGMvCiBTOglNYWludGFpbmVkCiAKK0hBUkRXQVJFIE1PTklUT1JJTkcKK1A6CUplYW4gRGVsdmFyZQorTToJa2hhbGlAbGludXgtZnIub3JnCitMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCitXOglodHRwOi8vd3d3LmxtLXNlbnNvcnMubnUvCitTOglNYWludGFpbmVkCisKIEhBUk1PTlkgU09VTkQgRFJJVkVSCiBQOglLeWxlIE1jTWFydGluCiBNOglreWxlQHBhcmlzYy1saW51eC5vcmcKQEAgLTk5MSw2ICsxMDIyLDEzIEBACiBMOglpc3Nfc3RvcmFnZWRldkBocC5jb20KIFM6CVN1cHBvcnRlZAogIAorSE9TVCBBUCBEUklWRVIKK1A6CUpvdW5pIE1hbGluZW4KK006CWprbWFsaW5lQGNjLmh1dC5maQorTDoJaG9zdGFwQHNobW9vLmNvbQorVzoJaHR0cDovL2hvc3RhcC5lcGl0ZXN0LmZpLworUzoJTWFpbnRhaW5lZAorCiBIUDEwMDoJRHJpdmVyIGZvciBIUCAxMC8xMDAgTWJpdC9zIFZvaWNlIEdyYWRlIE5ldHdvcmsgQWRhcHRlciBTZXJpZXMKIFA6CUphcm9zbGF2IEt5c2VsYQogTToJcGVyZXhAc3VzZS5jegpAQCAtMTAwNyw3ICsxMDQ1LDcgQEAKIE06CXdsaUBob2xvbW9ycGh5LmNvbQogUzoJTWFpbnRhaW5lZAogCi1JMkMgQU5EIFNFTlNPUlMgRFJJVkVSUworSTJDIFNVQlNZU1RFTQogUDoJR3JlZyBLcm9haC1IYXJ0bWFuCiBNOglncmVnQGtyb2FoLmNvbQogUDoJSmVhbiBEZWx2YXJlCkBAIC0xNzk0LDEzICsxODMyLDYgQEAKIEw6CWxpbnV4LWFiaS1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFM6CU1haW50YWluZWQKIAotUENJIElEIERBVEFCQVNFCi1QOglNYXJ0aW4gTWFyZXMKLU06CW1qQHVjdy5jegotTDoJcGNpaWRzLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotVzoJaHR0cDovL3BjaWlkcy5zb3VyY2Vmb3JnZS5uZXQvCi1TOglNYWludGFpbmVkCi0KIFBDSSBTT1VORCBEUklWRVJTIChFUzEzNzAsIEVTMTM3MSBhbmQgU09OSUNWSUJFUykKIFA6CVRob21hcyBTYWlsZXIKIE06CXNhaWxlckBpZmUuZWUuZXRoei5jaApAQCAtMTk1Myw3ICsxOTg0LDYgQEAKIAogUk9DS0VUUE9SVCBEUklWRVIKIFA6CUNvbXRyb2wgQ29ycC4KLU06CXN1cHBvcnRAY29tdHJvbC5jb20KIFc6CWh0dHA6Ly93d3cuY29tdHJvbC5jb20KIFM6CU1haW50YWluZWQKIApAQCAtMjA5Miw2ICsyMTIyLDEyIEBACiBXOglodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9FQjI0MTBJVFgvCiBTOglTdXBwb3J0ZWQKIAorU0lTIDE5MCBFVEhFUk5FVCBEUklWRVIKK1A6CUZyYW5jb2lzIFJvbWlldQorTToJcm9taWV1QGZyLnpvcmVpbC5jb20KK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKwogU0lTIDU1MTMgSURFIENPTlRST0xMRVIgRFJJVkVSCiBQOglMaW9uZWwgQm91dG9uCiBNOglMaW9uZWwuQm91dG9uQGluZXQ2LmZyCkBAIC0yNjM3LDExICsyNjczLDYgQEAKIFVDTElOVVggKEFORCBNNjhLTk9NTVUpCiBQOglHcmVnIFVuZ2VyZXIKIE06CWdlcmdAdWNsaW51eC5vcmcKLU06CWdlcmdAc25hcGdlYXIuY29tCi1QOglEYXZpZCBNY0N1bGxvdWdoCi1NOglkYXZpZG1Ac25hcGdlYXIuY29tCi1QOglELiBKZWZmIERpb25uZSAoY3JlYXRlZCBmaXJzdCB1Q2xpbnV4IHBvcnQpCi1NOglqZWZmQHVjbGludXgub3JnCiBXOglodHRwOi8vd3d3LnVjbGludXgub3JnLwogTDoJdWNsaW51eC1kZXZAdWNsaW51eC5vcmcgIChzdWJzY3JpYmVycy1vbmx5KQogUzoJTWFpbnRhaW5lZApAQCAtMjY2Niw2ICsyNjk3LDE3IEBACiBXOglodHRwOi8vcmlvNTAwLnNvdXJjZWZvcmdlLm5ldAogUzoJTWFpbnRhaW5lZAogCitWOUZTIEZJTEUgU1lTVEVNCitQOiAgICAgIEVyaWMgVmFuIEhlbnNiZXJnZW4KK006ICAgICAgZXJpY3ZoQGdtYWlsLmNvbQorUDogICAgICBSb24gTWlubmljaAorTTogICAgICBybWlubmljaEBsYW5sLmdvdgorUDogICAgICBMYXRjaGVzYXIgSW9ua292CitNOiAgICAgIGx1Y2hvQGlvbmtvdi5uZXQKK0w6ICAgICAgdjlmcy1kZXZlbG9wZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0CitXOiAgICAgIGh0dHA6Ly92OWZzLnNmLm5ldAorUzogICAgICBNYWludGFpbmVkCisKIFZJREVPIEZPUiBMSU5VWAogUDoJTWF1cm8gQ2FydmFsaG8gQ2hlaGFiCiBNOgltY2hlaGFiQGJydHVyYm8uY29tLmJyCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDNkODRkZjUuLjM4MjI5OGYgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xMDksMTAgKzEwOSw5IEBACiAuUEhPTlk6ICQoTUFLRUNNREdPQUxTKQogCiAkKGZpbHRlci1vdXQgX2FsbCwkKE1BS0VDTURHT0FMUykpIF9hbGw6Ci0JJChpZiAkKEtCVUlMRF9WRVJCT1NFOjE9KSxAKSQoTUFLRSkgLUMgJChLQlVJTERfT1VUUFVUKQkJXAotCUtCVUlMRF9TUkM9JChDVVJESVIpCSAgICAgS0JVSUxEX1ZFUkJPU0U9JChLQlVJTERfVkVSQk9TRSkJXAotCUtCVUlMRF9DSEVDSz0kKEtCVUlMRF9DSEVDSykgS0JVSUxEX0VYVE1PRD0iJChLQlVJTERfRVhUTU9EKSIJXAotICAgICAgICAtZiAkKENVUkRJUikvTWFrZWZpbGUgJEAKKwkkKGlmICQoS0JVSUxEX1ZFUkJPU0U6MT0pLEApJChNQUtFKSAtQyAkKEtCVUlMRF9PVVRQVVQpIFwKKwlLQlVJTERfU1JDPSQoQ1VSRElSKSBcCisJS0JVSUxEX0VYVE1PRD0iJChLQlVJTERfRVhUTU9EKSIgLWYgJChDVVJESVIpL01ha2VmaWxlICRACiAKICMgTGVhdmUgcHJvY2Vzc2luZyB0byBhYm92ZSBpbnZvY2F0aW9uIG9mIG1ha2UKIHNraXAtbWFrZWZpbGUgOj0gMQpAQCAtMjMzLDcgKzIzMiw3IEBACiAgIEtCVUlMRF9NT0RVTEVTIDo9IDEKIGVuZGlmCiAKLWV4cG9ydCBLQlVJTERfTU9EVUxFUyBLQlVJTERfQlVJTFRJTiBLQlVJTERfVkVSQk9TRQorZXhwb3J0IEtCVUlMRF9NT0RVTEVTIEtCVUlMRF9CVUlMVElOCiBleHBvcnQgS0JVSUxEX0NIRUNLU1JDIEtCVUlMRF9TUkMgS0JVSUxEX0VYVE1PRAogCiAjIEJlYXV0aWZ5IG91dHB1dApAQCAtMzA5LDYgKzMwOCw5IEBACiAjIExvb2sgZm9yIG1ha2UgaW5jbHVkZSBmaWxlcyByZWxhdGl2ZSB0byByb290IG9mIGtlcm5lbCBzcmMKIE1BS0VGTEFHUyArPSAtLWluY2x1ZGUtZGlyPSQoc3JjdHJlZSkKIAorIyBXZSBuZWVkIHNvbWUgZ2VuZXJpYyBkZWZpbml0aW9ucworaW5jbHVkZSAgJChzcmN0cmVlKS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCisKICMgRm9yIG1heGltdW0gcGVyZm9ybWFuY2UgKCsgcG9zc2libHkgcmFuZG9tIGJyZWFrYWdlLCB1bmNvbW1lbnQKICMgdGhlIGZvbGxvd2luZykKIApAQCAtMzMyLDcgKzMzNCw3IEBACiBQRVJMCQk9IHBlcmwKIENIRUNLCQk9IHNwYXJzZQogCi1DSEVDS0ZMQUdTICAgICA6PSAtRF9fbGludXhfXyAtRGxpbnV4IC1EX19TVERDX18gLUR1bml4IC1EX191bml4X18KK0NIRUNLRkxBR1MgICAgIDo9IC1EX19saW51eF9fIC1EbGludXggLURfX1NURENfXyAtRHVuaXggLURfX3VuaXhfXyAkKENGKQogTU9ERkxBR1MJPSAtRE1PRFVMRQogQ0ZMQUdTX01PRFVMRSAgID0gJChNT0RGTEFHUykKIEFGTEFHU19NT0RVTEUgICA9ICQoTU9ERkxBR1MpCkBAIC0zNDgsNyArMzUwLDcgQEAKIAogQ1BQRkxBR1MgICAgICAgIDo9IC1EX19LRVJORUxfXyAkKExJTlVYSU5DTFVERSkKIAotQ0ZMQUdTIAkJOj0gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyBcCitDRkxBR1MgCQk6PSAtV2FsbCAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgXAogCSAgCSAgIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIFwKIAkJICAgLWZmcmVlc3RhbmRpbmcKIEFGTEFHUwkJOj0gLURfX0FTU0VNQkxZX18KQEAgLTM2NywxNSArMzY5LDEwIEBACiAjIGV2ZW4gYmUgcmVhZC1vbmx5LgogZXhwb3J0IE1PRFZFUkRJUiA6PSAkKGlmICQoS0JVSUxEX0VYVE1PRCksJChmaXJzdHdvcmQgJChLQlVJTERfRVhUTU9EKSkvKS50bXBfdmVyc2lvbnMKIAotIyBUaGUgdGVtcG9yYXJ5IGZpbGUgdG8gc2F2ZSBnY2MgLU1EIGdlbmVyYXRlZCBkZXBlbmRlbmNpZXMgbXVzdCBub3QKLSMgY29udGFpbiBhIGNvbW1hCi1jb21tYSA6PSAsCi1kZXBmaWxlID0gJChzdWJzdCAkKGNvbW1hKSxfLCQoQEQpLy4kKEBGKS5kKQotCiAjIEZpbGVzIHRvIGlnbm9yZSBpbiBmaW5kIC4uLiBzdGF0ZW1lbnRzCiAKLVJDU19GSU5EX0lHTk9SRSA6PSBcKCAtbmFtZSBTQ0NTIC1vIC1uYW1lIEJpdEtlZXBlciAtbyAtbmFtZSAuc3ZuIC1vIC1uYW1lIENWUyAtbyAtbmFtZSAucGMgXCkgLXBydW5lIC1vCi1SQ1NfVEFSX0lHTk9SRSA6PSAtLWV4Y2x1ZGUgU0NDUyAtLWV4Y2x1ZGUgQml0S2VlcGVyIC0tZXhjbHVkZSAuc3ZuIC0tZXhjbHVkZSBDVlMgLS1leGNsdWRlIC5wYworUkNTX0ZJTkRfSUdOT1JFIDo9IFwoIC1uYW1lIFNDQ1MgLW8gLW5hbWUgQml0S2VlcGVyIC1vIC1uYW1lIC5zdm4gLW8gLW5hbWUgQ1ZTIC1vIC1uYW1lIC5wYyAtbyAtbmFtZSAuaGcgXCkgLXBydW5lIC1vCitSQ1NfVEFSX0lHTk9SRSA6PSAtLWV4Y2x1ZGUgU0NDUyAtLWV4Y2x1ZGUgQml0S2VlcGVyIC0tZXhjbHVkZSAuc3ZuIC0tZXhjbHVkZSBDVlMgLS1leGNsdWRlIC5wYyAtLWV4Y2x1ZGUgLmhnCiAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjIFJ1bGVzIHNoYXJlZCBiZXR3ZWVuICpjb25maWcgdGFyZ2V0cyBhbmQgYnVpbGQgdGFyZ2V0cwpAQCAtMzg1LDYgKzM4Miw5IEBACiBzY3JpcHRzX2Jhc2ljOgogCSQoUSkkKE1BS0UpICQoYnVpbGQpPXNjcmlwdHMvYmFzaWMKIAorIyBUbyBhdm9pZCBhbnkgaW1wbGljaXQgcnVsZSB0byBraWNrIGluLCBkZWZpbmUgYW4gZW1wdHkgY29tbWFuZC4KK3NjcmlwdHMvYmFzaWMvJTogc2NyaXB0c19iYXNpYyA7CisKIC5QSE9OWTogb3V0cHV0bWFrZWZpbGUKICMgb3V0cHV0bWFrZWZpbGUgZ2VuZXJhdGUgYSBNYWtlZmlsZSB0byBiZSBwbGFjZWQgaW4gb3V0cHV0IGRpcmVjdG9yeSwgaWYKICMgdXNpbmcgYSBzZXBlcmF0ZSBvdXRwdXQgZGlyZWN0b3J5LiBUaGlzIGFsbG93cyBjb252aW5pZW50IHVzZQpAQCAtNDQ3LDkgKzQ0Nyw4IEBACiBpbmNsdWRlICQoc3JjdHJlZSkvYXJjaC8kKEFSQ0gpL01ha2VmaWxlCiBleHBvcnQgS0JVSUxEX0RFRkNPTkZJRwogCi1jb25maWc6IHNjcmlwdHNfYmFzaWMgb3V0cHV0bWFrZWZpbGUgRk9SQ0UKLQkkKFEpJChNQUtFKSAkKGJ1aWxkKT1zY3JpcHRzL2tjb25maWcgJEAKLSVjb25maWc6IHNjcmlwdHNfYmFzaWMgb3V0cHV0bWFrZWZpbGUgRk9SQ0UKK2NvbmZpZyAlY29uZmlnOiBzY3JpcHRzX2Jhc2ljIG91dHB1dG1ha2VmaWxlIEZPUkNFCisJJChRKW1rZGlyIC1wIGluY2x1ZGUvbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT1zY3JpcHRzL2tjb25maWcgJEAKIAogZWxzZQpAQCAtNTUxLDYgKzU1MCwyNiBAQAogIyBpbWFnZXMuIERlZmF1bHQgaXMgL2Jvb3QsIGJ1dCB5b3UgY2FuIHNldCBpdCB0byBvdGhlciB2YWx1ZXMKIGV4cG9ydAlJTlNUQUxMX1BBVEggPz0gL2Jvb3QKIAorIyBJZiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgc2V0LCB3ZSBhdXRvbWF0aWNhbGx5IHBlcmZvcm0gc29tZSB0ZXN0cworIyBhbmQgdHJ5IHRvIGRldGVybWluZSBpZiB0aGUgY3VycmVudCBzb3VyY2UgdHJlZSBpcyBhIHJlbGVhc2UgdHJlZSwgb2YgYW55IHNvcnQsCisjIG9yIGlmIGlzIGEgcHVyZSBkZXZlbG9wbWVudCB0cmVlLgorIworIyBBICdyZWxlYXNlIHRyZWUnIGlzIGFueSB0cmVlIHdpdGggYSBnaXQgVEFHIGFzc29jaWF0ZWQKKyMgd2l0aCBpdC4gIFRoZSBwcmltYXJ5IGdvYWwgb2YgdGhpcyBpcyB0byBtYWtlIGl0IHNhZmUgZm9yIGEgbmF0aXZlCisjIGdpdC9DVlMvU1ZOIHVzZXIgdG8gYnVpbGQgYSByZWxlYXNlIHRyZWUgKGkuZSwgMi42LjkpIGFuZCBhbHNvIHRvCisjIGNvbnRpbnVlIGRldmVsb3BpbmcgYWdhaW5zdCB0aGUgY3VycmVudCBMaW51cyB0cmVlLCB3aXRob3V0IGhhdmluZyB0aGUgTGludXMKKyMgdHJlZSBvdmVyd3JpdGUgdGhlIDIuNi45IHRyZWUgd2hlbiBpbnN0YWxsZWQuCisjCisjIEN1cnJlbnRseSwgb25seSBnaXQgaXMgc3VwcG9ydGVkLgorIyBPdGhlciBTQ01zIGNhbiBlZGl0IHNjcmlwdHMvc2V0bG9jYWx2ZXJzaW9uIGFuZCBhZGQgdGhlIGFwcHJvcHJpYXRlCisjIGNoZWNrcyBhcyBuZWVkZWQuCisKKworaWZkZWYgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPCisJbG9jYWx2ZXJzaW9uLWF1dG8gOj0gJChzaGVsbCAkKFBFUkwpICQoc3JjdHJlZSkvc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24gJChzcmN0cmVlKSkKKwlMT0NBTFZFUlNJT04gOj0gJChMT0NBTFZFUlNJT04pJChsb2NhbHZlcnNpb24tYXV0bykKK2VuZGlmCisKICMKICMgSU5TVEFMTF9NT0RfUEFUSCBzcGVjaWZpZXMgYSBwcmVmaXggdG8gTU9ETElCIGZvciBtb2R1bGUgZGlyZWN0b3J5CiAjIHJlbG9jYXRpb25zIHJlcXVpcmVkIGJ5IGJ1aWxkIHJvb3RzLiAgVGhpcyBpcyBub3QgZGVmaW5lZCBpbiB0aGUKQEAgLTYyNCw4ICs2NDMsMTMgQEAKICMgR2VuZXJhdGUgbmV3IHZtbGludXggdmVyc2lvbgogcXVpZXRfY21kX3ZtbGludXhfdmVyc2lvbiA9IEdFTiAgICAgLnZlcnNpb24KICAgICAgIGNtZF92bWxpbnV4X3ZlcnNpb24gPSBzZXQgLWU7ICAgICAgICAgICAgICAgICAgICAgXAotCS4gJChzcmN0cmVlKS9zY3JpcHRzL21rdmVyc2lvbiA+IC50bXBfdmVyc2lvbjsJXAotCW12IC1mIC50bXBfdmVyc2lvbiAudmVyc2lvbjsJCQlcCisJaWYgWyAhIC1yIC52ZXJzaW9uIF07IHRoZW4JCQlcCisJICBybSAtZiAudmVyc2lvbjsJCQkJXAorCSAgZWNobyAxID4udmVyc2lvbjsJCQkJXAorCWVsc2UJCQkJCQlcCisJICBtdiAudmVyc2lvbiAub2xkX3ZlcnNpb247CQkJXAorCSAgZXhwciAwJCQoY2F0IC5vbGRfdmVyc2lvbikgKyAxID4udmVyc2lvbjsJXAorCWZpOwkJCQkJCVwKIAkkKE1BS0UpICQoYnVpbGQpPWluaXQKIAogIyBHZW5lcmF0ZSBTeXN0ZW0ubWFwCkBAIC02OTEsOCArNzE1LDEwIEBACiAKICMgVXBkYXRlIHZtbGludXggdmVyc2lvbiBiZWZvcmUgbGluawogIyBVc2UgKyBpbiBmcm9udCBvZiB0aGlzIHJ1bGUgdG8gc2lsZW50IHdhcm5pbmcgYWJvdXQgbWFrZSAtajEKKyMgRmlyc3QgY29tbWFuZCBpcyAnOicgdG8gYWxsb3cgdXMgdG8gdXNlICsgaW4gZnJvbnQgb2YgdGhpcyBydWxlCiBjbWRfa3N5bV9sZCA9ICQoY21kX3ZtbGludXhfXykKIGRlZmluZSBydWxlX2tzeW1fbGQKKwk6IAogCSskKGNhbGwgY21kLHZtbGludXhfdmVyc2lvbikKIAkkKGNhbGwgY21kLHZtbGludXhfXykKIAkkKFEpZWNobyAnY21kXyRAIDo9ICQoY21kX3ZtbGludXhfXyknID4gJChARCkvLiQoQEYpLmNtZApAQCAtNzIyLDExICs3NDgsMjIgQEAKICMgTmVlZHMgdG8gdmlzaXQgc2NyaXB0cy8gYmVmb3JlICQoS0FMTFNZTVMpIGNhbiBiZSB1c2VkLgogJChLQUxMU1lNUyk6IHNjcmlwdHMgOwogCisjIEdlbmVyYXRlIHNvbWUgZGF0YSBmb3IgZGVidWdnaW5nIHN0cmFuZ2Uga2FsbHN5bXMgcHJvYmxlbXMKK2RlYnVnX2thbGxzeW1zOiAudG1wX21hcCQobGFzdF9rYWxsc3ltcykKKworLnRtcF9tYXAlOiAudG1wX3ZtbGludXglIEZPUkNFCisJKCQoT0JKRFVNUCkgLWggJDwgfCAkKEFXSykgJy9eICtbMC05XS97cHJpbnQgJCQ0ICIgMCAiICQkMn0nOyAkKE5NKSAkPCkgfCBzb3J0ID4gJEAKKworLnRtcF9tYXAzOiAudG1wX21hcDIKKworLnRtcF9tYXAyOiAudG1wX21hcDEKKwogZW5kaWYgIyBpZmRlZiBDT05GSUdfS0FMTFNZTVMKIAogIyB2bWxpbnV4IGltYWdlIC0gaW5jbHVkaW5nIHVwZGF0ZWQga2VybmVsIHN5bWJvbHMKIHZtbGludXg6ICQodm1saW51eC1sZHMpICQodm1saW51eC1pbml0KSAkKHZtbGludXgtbWFpbikgJChrYWxsc3ltcy5vKSBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkX3J1bGUsdm1saW51eF9fKQorCSQoUSlybSAtZiAub2xkX3ZlcnNpb24KIAogIyBUaGUgYWN0dWFsIG9iamVjdHMgYXJlIGdlbmVyYXRlZCB3aGVuIGRlc2NlbmRpbmcsIAogIyBtYWtlIHN1cmUgbm8gaW1wbGljaXQgcnVsZSBraWNrcyBpbgpAQCAtNzQ3LDE3ICs3ODQsMTcgQEAKICMgQSBtdWx0aSBsZXZlbCBhcHByb2FjaCBpcyB1c2VkLiBwcmVwYXJlMSBpcyB1cGRhdGVkIGZpcnN0LCB0aGVuIHByZXBhcmUwLgogIyBwcmVwYXJlLWFsbCBpcyB0aGUgY29sbGVjdGlvbiBwb2ludCBmb3IgdGhlIHByZXBhcmUgdGFyZ2V0cy4KIAotLlBIT05ZOiBwcmVwYXJlLWFsbCBwcmVwYXJlIHByZXBhcmUwIHByZXBhcmUxIHByZXBhcmUyCisuUEhPTlk6IHByZXBhcmUtYWxsIHByZXBhcmUgcHJlcGFyZTAgcHJlcGFyZTEgcHJlcGFyZTIgcHJlcGFyZTMKIAotIyBwcmVwYXJlMiBpcyB1c2VkIHRvIGNoZWNrIGlmIHdlIGFyZSBidWlsZGluZyBpbiBhIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnksCisjIHByZXBhcmUzIGlzIHVzZWQgdG8gY2hlY2sgaWYgd2UgYXJlIGJ1aWxkaW5nIGluIGEgc2VwYXJhdGUgb3V0cHV0IGRpcmVjdG9yeSwKICMgYW5kIGlmIHNvIGRvOgogIyAxKSBDaGVjayB0aGF0IG1ha2UgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkIGluIHRoZSBrZXJuZWwgc3JjICQoc3JjdHJlZSkKICMgMikgQ3JlYXRlIHRoZSBpbmNsdWRlMiBkaXJlY3RvcnksIHVzZWQgZm9yIHRoZSBzZWNvbmQgYXNtIHN5bWxpbmsKIAotcHJlcGFyZTI6CitwcmVwYXJlMzoKIGlmbmVxICgkKEtCVUlMRF9TUkMpLCkKIAlAZWNobyAnICBVc2luZyAkKHNyY3RyZWUpIGFzIHNvdXJjZSBmb3Iga2VybmVsJwotCSQoUSlpZiBbIC1oICQoc3JjdHJlZSkvaW5jbHVkZS9hc20gLW8gLWYgJChzcmN0cmVlKS8uY29uZmlnIF07IHRoZW4gXAorCSQoUSlpZiBbIC1mICQoc3JjdHJlZSkvLmNvbmZpZyBdOyB0aGVuIFwKIAkJZWNobyAiICAkKHNyY3RyZWUpIGlzIG5vdCBjbGVhbiwgcGxlYXNlIHJ1biAnbWFrZSBtcnByb3BlciciO1wKIAkJZWNobyAiICBpbiB0aGUgJyQoc3JjdHJlZSknIGRpcmVjdG9yeS4iO1wKIAkJL2Jpbi9mYWxzZTsgXApAQCAtNzY2LDE3ICs4MDMsMjEgQEAKIAkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoQVJDSCkgaW5jbHVkZTIvYXNtCiBlbmRpZgogCi0jIHByZXBhcmUxIGNyZWF0ZXMgYSBtYWtlZmlsZSBpZiB1c2luZyBhIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnkKLXByZXBhcmUxOiBwcmVwYXJlMiBvdXRwdXRtYWtlZmlsZQorIyBwcmVwYXJlMiBjcmVhdGVzIGEgbWFrZWZpbGUgaWYgdXNpbmcgYSBzZXBhcmF0ZSBvdXRwdXQgZGlyZWN0b3J5CitwcmVwYXJlMjogcHJlcGFyZTMgb3V0cHV0bWFrZWZpbGUKIAotcHJlcGFyZTA6IHByZXBhcmUxIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIGluY2x1ZGUvYXNtIGluY2x1ZGUvY29uZmlnL01BUktFUgorcHJlcGFyZTE6IHByZXBhcmUyIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIGluY2x1ZGUvYXNtIFwKKyAgICAgICAgICAgICAgICAgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKIGlmbmVxICgkKEtCVUlMRF9NT0RVTEVTKSwpCiAJJChRKXJtIC1yZiAkKE1PRFZFUkRJUikKIAkkKFEpbWtkaXIgLXAgJChNT0RWRVJESVIpCiBlbmRpZgogCitwcmVwYXJlMDogcHJlcGFyZSBwcmVwYXJlMSBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPS4KKwogIyBBbGwgdGhlIHByZXBhcmluZy4uCi1wcmVwYXJlLWFsbDogcHJlcGFyZTAgcHJlcGFyZQorcHJlcGFyZS1hbGw6IHByZXBhcmUwCiAKICMJTGVhdmUgdGhpcyBhcyBkZWZhdWx0IGZvciBwcmVwcm9jZXNzaW5nIHZtbGludXgubGRzLlMsIHdoaWNoIGlzIG5vdwogIwlkb25lIGluIGFyY2gvJChBUkNIKS9rZXJuZWwvTWFrZWZpbGUKQEAgLTgxNSw3ICs4NTYsNyBAQAogCiAjIAlTcGxpdCBhdXRvY29uZi5oIGludG8gaW5jbHVkZS9saW51eC9jb25maWcvKgogCi1pbmNsdWRlL2NvbmZpZy9NQVJLRVI6IGluY2x1ZGUvbGludXgvYXV0b2NvbmYuaAoraW5jbHVkZS9jb25maWcvTUFSS0VSOiBzY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUgaW5jbHVkZS9saW51eC9hdXRvY29uZi5oCiAJQGVjaG8gJyAgU1BMSVQgICBpbmNsdWRlL2xpbnV4L2F1dG9jb25mLmggLT4gaW5jbHVkZS9jb25maWcvKicKIAlAc2NyaXB0cy9iYXNpYy9zcGxpdC1pbmNsdWRlIGluY2x1ZGUvbGludXgvYXV0b2NvbmYuaCBpbmNsdWRlL2NvbmZpZwogCUB0b3VjaCAkQApAQCAtODc1LDcgKzkxNiw3IEBACiAKIC5QSE9OWTogX21vZGluc3RfCiBfbW9kaW5zdF86Ci0JQGlmIFsgLXogImAkKERFUE1PRCkgLVYgfCBncmVwIG1vZHVsZS1pbml0LXRvb2xzYCIgXTsgdGhlbiBcCisJQGlmIFsgLXogImAkKERFUE1PRCkgLVYgMj4vZGV2L251bGwgfCBncmVwIG1vZHVsZS1pbml0LXRvb2xzYCIgXTsgdGhlbiBcCiAJCWVjaG8gIldhcm5pbmc6IHlvdSBtYXkgbmVlZCB0byBpbnN0YWxsIG1vZHVsZS1pbml0LXRvb2xzIjsgXAogCQllY2hvICJTZWUgaHR0cDovL3d3dy5jb2RlbW9ua2V5Lm9yZy51ay9kb2NzL3Bvc3QtaGFsbG93ZWVuLTIuNi50eHQiO1wKIAkJc2xlZXAgMTsgXApAQCAtOTE5LDI2ICs5NjAsNiBAQAogCiBlbmRpZiAjIENPTkZJR19NT0RVTEVTCiAKLSMgR2VuZXJhdGUgYXNtLW9mZnNldHMuaCAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWRlZmluZSBmaWxlY2hrX2dlbi1hc20tb2Zmc2V0cwotCShzZXQgLWU7IFwKLQkgZWNobyAiI2lmbmRlZiBfX0FTTV9PRkZTRVRTX0hfXyI7IFwKLQkgZWNobyAiI2RlZmluZSBfX0FTTV9PRkZTRVRTX0hfXyI7IFwKLQkgZWNobyAiLyoiOyBcCi0JIGVjaG8gIiAqIERPIE5PVCBNT0RJRlkuIjsgXAotCSBlY2hvICIgKiI7IFwKLQkgZWNobyAiICogVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYXJjaC8kKEFSQ0gpL01ha2VmaWxlIjsgXAotCSBlY2hvICIgKiI7IFwKLQkgZWNobyAiICovIjsgXAotCSBlY2hvICIiOyBcCi0JIHNlZCAtbmUgIi9eLT4ve3M6Xi0+XChbXiBdKlwpIFtcJCQjXSpcKFteIF0qXCkgXCguKlwpOiNkZWZpbmUgXDEgXDIgLyogXDMgKi86OyBzOi0+Ojo7IHA7fSI7IFwKLQkgZWNobyAiIjsgXAotCSBlY2hvICIjZW5kaWYiICkKLWVuZGVmCi0KLQogIyMjCiAjIENsZWFuaW5nIGlzIGRvbmUgb24gdGhyZWUgbGV2ZWxzLgogIyBtYWtlIGNsZWFuICAgICBEZWxldGUgbW9zdCBnZW5lcmF0ZWQgZmlsZXMKQEAgLTk2MSw3ICs5ODIsNyBAQAogIwogY2xlYW46IHJtLWRpcnMgIDo9ICQoQ0xFQU5fRElSUykKIGNsZWFuOiBybS1maWxlcyA6PSAkKENMRUFOX0ZJTEVTKQotY2xlYW4tZGlycyAgICAgIDo9ICQoYWRkcHJlZml4IF9jbGVhbl8sJCh2bWxpbnV4LWFsbGRpcnMpKQorY2xlYW4tZGlycyAgICAgIDo9ICQoYWRkcHJlZml4IF9jbGVhbl8sJChzcmN0cmVlKSAkKHZtbGludXgtYWxsZGlycykpCiAKIC5QSE9OWTogJChjbGVhbi1kaXJzKSBjbGVhbiBhcmNoY2xlYW4KICQoY2xlYW4tZGlycyk6CkBAIC0xMDQwLDYgKzEwNjEsNyBAQAogCUBlY2hvICAnICBycG0JCSAgLSBCdWlsZCBhIGtlcm5lbCBhcyBhbiBSUE0gcGFja2FnZScKIAlAZWNobyAgJyAgdGFncy9UQUdTCSAgLSBHZW5lcmF0ZSB0YWdzIGZpbGUgZm9yIGVkaXRvcnMnCiAJQGVjaG8gICcgIGNzY29wZQkgIC0gR2VuZXJhdGUgY3Njb3BlIGluZGV4JworCUBlY2hvICAnICBrZXJuZWxyZWxlYXNlCSAgLSBPdXRwdXQgdGhlIHJlbGVhc2UgdmVyc2lvbiBzdHJpbmcnCiAJQGVjaG8gICcnCiAJQGVjaG8gICdTdGF0aWMgYW5hbHlzZXJzJwogCUBlY2hvICAnICBidWlsZGNoZWNrICAgICAgLSBMaXN0IGRhbmdsaW5nIHJlZmVyZW5jZXMgdG8gdm1saW51eCBkaXNjYXJkZWQgc2VjdGlvbnMnCkBAIC0xMTU5LDM3ICsxMTgxLDQ5IEBACiBfX3NyY3RyZWUgPSAkKHNyY3RyZWUpLwogZW5kaWYKIAorQUxMU09VUkNFX0FSQ0hTIDo9ICQoQVJDSCkKKwogZGVmaW5lIGFsbC1zb3VyY2VzCiAJKCBmaW5kICQoX19zcmN0cmVlKSAkKFJDU19GSU5EX0lHTk9SRSkgXAogCSAgICAgICBcKCAtbmFtZSBpbmNsdWRlIC1vIC1uYW1lIGFyY2ggXCkgLXBydW5lIC1vIFwKIAkgICAgICAgLW5hbWUgJyouW2NoU10nIC1wcmludDsgXAotCSAgZmluZCAkKF9fc3JjdHJlZSlhcmNoLyQoQVJDSCkgJChSQ1NfRklORF9JR05PUkUpIFwKLQkgICAgICAgLW5hbWUgJyouW2NoU10nIC1wcmludDsgXAorCSAgZm9yIEFSQ0ggaW4gJChBTExTT1VSQ0VfQVJDSFMpIDsgZG8gXAorCSAgICAgICBmaW5kICQoX19zcmN0cmVlKWFyY2gvJCR7QVJDSH0gJChSQ1NfRklORF9JR05PUkUpIFwKKwkgICAgICAgICAgICAtbmFtZSAnKi5bY2hTXScgLXByaW50OyBcCisJICBkb25lIDsgXAogCSAgZmluZCAkKF9fc3JjdHJlZSlzZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUgJChSQ1NfRklORF9JR05PUkUpIFwKIAkgICAgICAgLW5hbWUgJyouW2NoU10nIC1wcmludDsgXAogCSAgZmluZCAkKF9fc3JjdHJlZSlpbmNsdWRlICQoUkNTX0ZJTkRfSUdOT1JFKSBcCiAJICAgICAgIFwoIC1uYW1lIGNvbmZpZyAtbyAtbmFtZSAnYXNtLSonIFwpIC1wcnVuZSBcCiAJICAgICAgIC1vIC1uYW1lICcqLltjaFNdJyAtcHJpbnQ7IFwKLQkgIGZpbmQgJChfX3NyY3RyZWUpaW5jbHVkZS9hc20tJChBUkNIKSAkKFJDU19GSU5EX0lHTk9SRSkgXAotCSAgICAgICAtbmFtZSAnKi5bY2hTXScgLXByaW50OyBcCisJICBmb3IgQVJDSCBpbiAkKEFMTFNPVVJDRV9BUkNIUykgOyBkbyBcCisJICAgICAgIGZpbmQgJChfX3NyY3RyZWUpaW5jbHVkZS9hc20tJCR7QVJDSH0gJChSQ1NfRklORF9JR05PUkUpIFwKKwkgICAgICAgICAgICAtbmFtZSAnKi5bY2hTXScgLXByaW50OyBcCisJICBkb25lIDsgXAogCSAgZmluZCAkKF9fc3JjdHJlZSlpbmNsdWRlL2FzbS1nZW5lcmljICQoUkNTX0ZJTkRfSUdOT1JFKSBcCiAJICAgICAgIC1uYW1lICcqLltjaFNdJyAtcHJpbnQgKQogZW5kZWYKIAogcXVpZXRfY21kX2NzY29wZS1maWxlID0gRklMRUxTVCBjc2NvcGUuZmlsZXMKLSAgICAgIGNtZF9jc2NvcGUtZmlsZSA9ICQoYWxsLXNvdXJjZXMpID4gY3Njb3BlLmZpbGVzCisgICAgICBjbWRfY3Njb3BlLWZpbGUgPSAoZWNobyBcLWs7IGVjaG8gXC1xOyAkKGFsbC1zb3VyY2VzKSkgPiBjc2NvcGUuZmlsZXMKIAogcXVpZXRfY21kX2NzY29wZSA9IE1BS0UgICAgY3Njb3BlLm91dAotICAgICAgY21kX2NzY29wZSA9IGNzY29wZSAtayAtYiAtcQorICAgICAgY21kX2NzY29wZSA9IGNzY29wZSAtYgogCiBjc2NvcGU6IEZPUkNFCiAJJChjYWxsIGNtZCxjc2NvcGUtZmlsZSkKIAkkKGNhbGwgY21kLGNzY29wZSkKIAogcXVpZXRfY21kX1RBR1MgPSBNQUtFICAgJEAKLWNtZF9UQUdTID0gJChhbGwtc291cmNlcykgfCBldGFncyAtCitkZWZpbmUgY21kX1RBR1MKKwlybSAtZiAkQDsgXAorCUVUQUdTRj1gZXRhZ3MgLS12ZXJzaW9uIHwgZ3JlcCAtaSBleHViZXJhbnQgPi9kZXYvbnVsbCAmJiBlY2hvICItSSBfX2luaXRkYXRhLF9fZXhpdGRhdGEsRVhQT1JUX1NZTUJPTCxFWFBPUlRfU1lNQk9MX0dQTCAtLWV4dHJhPStmImA7IFwKKwkkKGFsbC1zb3VyY2VzKSB8IHhhcmdzIGV0YWdzICQkRVRBR1NGIC1hCitlbmRlZgogCi0jIAlFeHViZXJhbnQgY3RhZ3Mgd29ya3MgYmV0dGVyIHdpdGggLUkKK1RBR1M6IEZPUkNFCisJJChjYWxsIGNtZCxUQUdTKQorCiAKIHF1aWV0X2NtZF90YWdzID0gTUFLRSAgICRACiBkZWZpbmUgY21kX3RhZ3MKQEAgLTExOTgsOSArMTIzMiw2IEBACiAJJChhbGwtc291cmNlcykgfCB4YXJncyBjdGFncyAkJENUQUdTRiAtYQogZW5kZWYKIAotVEFHUzogRk9SQ0UKLQkkKGNhbGwgY21kLFRBR1MpCi0KIHRhZ3M6IEZPUkNFCiAJJChjYWxsIGNtZCx0YWdzKQogCkBAIC0xMjY4LDgyICsxMjk5LDExIEBACiAgIGluY2x1ZGUgJChjbWRfZmlsZXMpCiBlbmRpZgogCi0jIEV4ZWN1dGUgY29tbWFuZCBhbmQgZ2VuZXJhdGUgY21kIGZpbGUKLWlmX2NoYW5nZWQgPSAkKGlmICQoc3RyaXAgJD8gXAotCQkgICAgICAgICAgJChmaWx0ZXItb3V0ICQoY21kXyQoMSkpLCQoY21kXyRAKSlcCi0JCQkgICQoZmlsdGVyLW91dCAkKGNtZF8kQCksJChjbWRfJCgxKSkpKSxcCi0JQHNldCAtZTsgXAotCSQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSxlY2hvICcgICQoc3Vic3QgJywnXCcnLCQoJChxdWlldCljbWRfJCgxKSkpJzspIFwKLQkkKGNtZF8kKDEpKTsgXAotCWVjaG8gJ2NtZF8kQCA6PSAkKHN1YnN0ICQkLCQkJCQsJChzdWJzdCAnLCdcJycsJChjbWRfJCgxKSkpKScgPiAkKEBEKS8uJChARikuY21kKQotCi0KLSMgZXhlY3V0ZSB0aGUgY29tbWFuZCBhbmQgYWxzbyBwb3N0cHJvY2VzcyBnZW5lcmF0ZWQgLmQgZGVwZW5kZW5jaWVzCi0jIGZpbGUKLWlmX2NoYW5nZWRfZGVwID0gJChpZiAkKHN0cmlwICQ/ICQoZmlsdGVyLW91dCBGT1JDRSAkKHdpbGRjYXJkICReKSwkXilcCi0JCSAgICAgICAgICAkKGZpbHRlci1vdXQgJChjbWRfJCgxKSksJChjbWRfJEApKVwKLQkJCSAgJChmaWx0ZXItb3V0ICQoY21kXyRAKSwkKGNtZF8kKDEpKSkpLFwKLQkkKFEpc2V0IC1lOyBcCi0JJChpZiAkKCQocXVpZXQpY21kXyQoMSkpLGVjaG8gJyAgJChzdWJzdCAnLCdcJycsJCgkKHF1aWV0KWNtZF8kKDEpKSknOykgXAotCSQoY21kXyQoMSkpOyBcCi0Jc2NyaXB0cy9iYXNpYy9maXhkZXAgJChkZXBmaWxlKSAkQCAnJChzdWJzdCAkJCwkJCQkLCQoc3Vic3QgJywnXCcnLCQoY21kXyQoMSkpKSknID4gJChARCkvLiQoQEYpLnRtcDsgXAotCXJtIC1mICQoZGVwZmlsZSk7IFwKLQltdiAtZiAkKEBEKS8uJChARikudG1wICQoQEQpLy4kKEBGKS5jbWQpCi0KLSMgVXNhZ2U6ICQoY2FsbCBpZl9jaGFuZ2VkX3J1bGUsZm9vKQotIyB3aWxsIGNoZWNrIGlmICQoY21kX2ZvbykgY2hhbmdlZCwgb3IgYW55IG9mIHRoZSBwcmVxdWlzaXRlcyBjaGFuZ2VkLAotIyBhbmQgaWYgc28gd2lsbCBleGVjdXRlICQocnVsZV9mb28pCi0KLWlmX2NoYW5nZWRfcnVsZSA9ICQoaWYgJChzdHJpcCAkPyBcCi0JCSAgICAgICAgICAgICAgICQoZmlsdGVyLW91dCAkKGNtZF8kKDEpKSwkKGNtZF8kKEBGKSkpXAotCQkJICAgICAgICQoZmlsdGVyLW91dCAkKGNtZF8kKEBGKSksJChjbWRfJCgxKSkpKSxcCi0JICAgICAgICAgICAgICAgJChRKSQocnVsZV8kKDEpKSkKLQotIyBJZiBxdWlldCBpcyBzZXQsIG9ubHkgcHJpbnQgc2hvcnQgdmVyc2lvbiBvZiBjb21tYW5kCi0KLWNtZCA9IEAkKGlmICQoJChxdWlldCljbWRfJCgxKSksZWNobyAnICAkKCQocXVpZXQpY21kXyQoMSkpJyAmJikgJChjbWRfJCgxKSkKLQotIyBmaWxlY2hrIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGNvbnRlbnQgb2YgYSBnZW5lcmF0ZWQgZmlsZSBpcyB1cGRhdGVkLgotIyBTYW1wbGUgdXNhZ2U6Ci0jIGRlZmluZSBmaWxlY2hrX3NhbXBsZQotIwllY2hvICRLRVJORUxSRUxFQVNFCi0jIGVuZGVmCi0jIHZlcnNpb24uaCA6IE1ha2VmaWxlCi0jCSQoY2FsbCBmaWxlY2hrLHNhbXBsZSkKLSMgVGhlIHJ1bGUgZGVmaW5lZCBzaGFsbCB3cml0ZSB0byBzdGRvdXQgdGhlIGNvbnRlbnQgb2YgdGhlIG5ldyBmaWxlLgotIyBUaGUgZXhpc3RpbmcgZmlsZSB3aWxsIGJlIGNvbXBhcmVkIHdpdGggdGhlIG5ldyBvbmUuCi0jIC0gSWYgbm8gZmlsZSBleGlzdCBpdCBpcyBjcmVhdGVkCi0jIC0gSWYgdGhlIGNvbnRlbnQgZGlmZmVyIHRoZSBuZXcgZmlsZSBpcyB1c2VkCi0jIC0gSWYgdGhleSBhcmUgZXF1YWwgbm8gY2hhbmdlLCBhbmQgbm8gdGltZXN0YW1wIHVwZGF0ZQotCi1kZWZpbmUgZmlsZWNoawotCUBzZXQgLWU7CQkJCVwKLQllY2hvICcgIENISyAgICAgJEAnOwkJCVwKLQlta2RpciAtcCAkKGRpciAkQCk7CQkJXAotCSQoZmlsZWNoa18kKDEpKSA8ICQ8ID4gJEAudG1wOwkJXAotCWlmIFsgLXIgJEAgXSAmJiBjbXAgLXMgJEAgJEAudG1wOyB0aGVuCVwKLQkJcm0gLWYgJEAudG1wOwkJCVwKLQllbHNlCQkJCQlcCi0JCWVjaG8gJyAgVVBEICAgICAkQCc7CQlcCi0JCW12IC1mICRALnRtcCAkQDsJCVwKLQlmaQotZW5kZWYKLQotIyBTaG9ydGhhbmQgZm9yICQoUSkkKE1BS0UpIC1mIHNjcmlwdHMvTWFrZWZpbGUuYnVpbGQgb2JqPWRpcgotIyBVc2FnZToKLSMgJChRKSQoTUFLRSkgJChidWlsZCk9ZGlyCi1idWlsZCA6PSAtZiAkKGlmICQoS0JVSUxEX1NSQyksJChzcmN0cmVlKS8pc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBvYmoKLQogIyBTaG9ydGhhbmQgZm9yICQoUSkkKE1BS0UpIC1mIHNjcmlwdHMvTWFrZWZpbGUuY2xlYW4gb2JqPWRpcgogIyBVc2FnZToKICMgJChRKSQoTUFLRSkgJChjbGVhbik9ZGlyCiBjbGVhbiA6PSAtZiAkKGlmICQoS0JVSUxEX1NSQyksJChzcmN0cmVlKS8pc2NyaXB0cy9NYWtlZmlsZS5jbGVhbiBvYmoKIAotIwkkKGNhbGwgZGVzY2VuZCw8ZGlyPiw8dGFyZ2V0PikKLSMJUmVjdXJzaXZlbHkgY2FsbCBhIHN1Yi1tYWtlIGluIDxkaXI+IHdpdGggdGFyZ2V0IDx0YXJnZXQ+Ci0jIFVzYWdlIGlzIGRlcHJlY2F0ZWQsIGJlY2F1c2UgbWFrZSBkb2VzIG5vdCBzZWUgdGhpcyBhcyBhbiBpbnZvY2F0aW9uIG9mIG1ha2UuCi1kZXNjZW5kID0kKFEpJChNQUtFKSAtZiAkKGlmICQoS0JVSUxEX1NSQyksJChzcmN0cmVlKS8pc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBvYmo9JCgxKSAkKDIpCi0KIGVuZGlmCSMgc2tpcC1tYWtlZmlsZQogCiBGT1JDRToKZGlmZiAtLWdpdCBhL1JFUE9SVElORy1CVUdTIGIvUkVQT1JUSU5HLUJVR1MKaW5kZXggMjI0YzM0Ny4uZjlkYTgyNyAxMDA2NDQKLS0tIGEvUkVQT1JUSU5HLUJVR1MKKysrIGIvUkVQT1JUSU5HLUJVR1MKQEAgLTksNyArOSw3IEBACiBidWcgcmVwb3J0LiBUaGlzIGV4cGxhaW5zIHdoYXQgeW91IHNob3VsZCBkbyB3aXRoIHRoZSAiT29wcyIgaW5mb3JtYXRpb24KIHRvIG1ha2UgaXQgdXNlZnVsIHRvIHRoZSByZWNpcGllbnQuCiAKLSAgICAgIFNlbmQgdGhlIG91dHB1dCB0aGUgbWFpbnRhaW5lciBvZiB0aGUga2VybmVsIGFyZWEgdGhhdCBzZWVtcyB0bworICAgICAgU2VuZCB0aGUgb3V0cHV0IHRvIHRoZSBtYWludGFpbmVyIG9mIHRoZSBrZXJuZWwgYXJlYSB0aGF0IHNlZW1zIHRvCiBiZSBpbnZvbHZlZCB3aXRoIHRoZSBwcm9ibGVtLiBEb24ndCB3b3JyeSB0b28gbXVjaCBhYm91dCBnZXR0aW5nIHRoZQogd3JvbmcgcGVyc29uLiBJZiB5b3UgYXJlIHVuc3VyZSBzZW5kIGl0IHRvIHRoZSBwZXJzb24gcmVzcG9uc2libGUgZm9yIHRoZQogY29kZSByZWxldmFudCB0byB3aGF0IHlvdSB3ZXJlIGRvaW5nLiBJZiBpdCBvY2N1cnMgcmVwZWF0YWJseSB0cnkgYW5kCkBAIC0xOCwxNSArMTgsMTUgQEAKIAogICAgICAgSWYgaXQgaXMgYSBzZWN1cml0eSBidWcsIHBsZWFzZSBjb3B5IHRoZSBTZWN1cml0eSBDb250YWN0IGxpc3RlZAogaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUuICBUaGV5IGNhbiBoZWxwIGNvb3JkaW5hdGUgYnVnZml4IGFuZCBkaXNjbG9zdXJlLgotU2VlIERvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzIGZvciBtb3JlIGluZm9tYXRpb24uCitTZWUgRG9jdW1lbnRhdGlvbi9TZWN1cml0eUJ1Z3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKICAgICAgIElmIHlvdSBhcmUgdG90YWxseSBzdHVtcGVkIGFzIHRvIHdob20gdG8gc2VuZCB0aGUgcmVwb3J0LCBzZW5kIGl0IHRvCiBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnLiAoRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGxpbnV4LWtlcm5lbAogbWFpbGluZyBsaXN0IHNlZSBodHRwOi8vd3d3LnR1eC5vcmcvbGttbC8pLgogCi1UaGlzIGlzIGEgc3VnZ2VzdGVkIGZvcm1hdCBmb3IgYSBidWcgcmVwb3J0IHNlbnQgdG8gdGhlIExpbnV4IGtlcm5lbCBtYWlsaW5nIAotbGlzdC4gSGF2aW5nIGEgc3RhbmRhcmRpemVkIGJ1ZyByZXBvcnQgZm9ybSBtYWtlcyBpdCBlYXNpZXIgIGZvciB5b3Ugbm90IHRvIAotb3Zlcmxvb2sgdGhpbmdzLCBhbmQgZWFzaWVyIGZvciB0aGUgZGV2ZWxvcGVycyB0byBmaW5kIHRoZSBwaWVjZXMgb2YgCitUaGlzIGlzIGEgc3VnZ2VzdGVkIGZvcm1hdCBmb3IgYSBidWcgcmVwb3J0IHNlbnQgdG8gdGhlIExpbnV4IGtlcm5lbCBtYWlsaW5nCitsaXN0LiBIYXZpbmcgYSBzdGFuZGFyZGl6ZWQgYnVnIHJlcG9ydCBmb3JtIG1ha2VzIGl0IGVhc2llciBmb3IgeW91IG5vdCB0bworb3Zlcmxvb2sgdGhpbmdzLCBhbmQgZWFzaWVyIGZvciB0aGUgZGV2ZWxvcGVycyB0byBmaW5kIHRoZSBwaWVjZXMgb2YKIGluZm9ybWF0aW9uIHRoZXkncmUgcmVhbGx5IGludGVyZXN0ZWQgaW4uIERvbid0IGZlZWwgeW91IGhhdmUgdG8gZm9sbG93IGl0LgogCiAgICAgICBGaXJzdCBydW4gdGhlIHZlcl9saW51eCBzY3JpcHQgaW5jbHVkZWQgYXMgc2NyaXB0cy92ZXJfbGludXgsIHdoaWNoCkBAIC0zNSw5ICszNSw5IEBACiAKIFVzZSB0aGF0IGluZm9ybWF0aW9uIHRvIGZpbGwgaW4gYWxsIGZpZWxkcyBvZiB0aGUgYnVnIHJlcG9ydCBmb3JtLCBhbmQKIHBvc3QgaXQgdG8gdGhlIG1haWxpbmcgbGlzdCB3aXRoIGEgc3ViamVjdCBvZiAiUFJPQkxFTTogPG9uZSBsaW5lCi1zdW1tYXJ5IGZyb20gWzEuXT4iIGZvciBlYXN5IGlkZW50aWZpY2F0aW9uIGJ5IHRoZSBkZXZlbG9wZXJzICAgIAorc3VtbWFyeSBmcm9tIFsxLl0+IiBmb3IgZWFzeSBpZGVudGlmaWNhdGlvbiBieSB0aGUgZGV2ZWxvcGVycy4KIAotWzEuXSBPbmUgbGluZSBzdW1tYXJ5IG9mIHRoZSBwcm9ibGVtOiAgICAKK1sxLl0gT25lIGxpbmUgc3VtbWFyeSBvZiB0aGUgcHJvYmxlbToKIFsyLl0gRnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbS9yZXBvcnQ6CiBbMy5dIEtleXdvcmRzIChpLmUuLCBtb2R1bGVzLCBuZXR3b3JraW5nLCBrZXJuZWwpOgogWzQuXSBLZXJuZWwgdmVyc2lvbiAoZnJvbSAvcHJvYy92ZXJzaW9uKToKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvS2NvbmZpZyBiL2FyY2gvYWxwaGEvS2NvbmZpZwppbmRleCAxODlkNWVhLi43ODY0OTFmIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL0tjb25maWcKKysrIGIvYXJjaC9hbHBoYS9LY29uZmlnCkBAIC00NzksNiArNDc5LDkgQEAKIAlkZXBlbmRzIG9uIEFMUEhBX0dFTkVSSUMgfHwgQUxQSEFfSkVOU0VOIHx8IEFMUEhBX0FMQ09SIHx8IEFMUEhBX01JS0FTQSB8fCBBTFBIQV9TQUJMRSB8fCBBTFBIQV9MWU5YIHx8IEFMUEhBX05PUklUQUtFIHx8IEFMUEhBX1JBV0hJREUKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJZGVmX2Jvb2wgeQorCiBjb25maWcgU01QCiAJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFMUEhBX1NBQkxFIHx8IEFMUEhBX0xZTlggfHwgQUxQSEFfUkFXSElERSB8fCBBTFBIQV9EUDI2NCB8fCBBTFBIQV9XSUxERklSRSB8fCBBTFBIQV9USVRBTiB8fCBBTFBIQV9HRU5FUklDIHx8IEFMUEhBX1NIQVJLIHx8IEFMUEhBX01BUlZFTApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9NYWtlZmlsZSBiL2FyY2gvYWxwaGEvTWFrZWZpbGUKaW5kZXggMjJlYmZiMi4uMWI3MDRlZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9NYWtlZmlsZQorKysgYi9hcmNoL2FscGhhL01ha2VmaWxlCkBAIC0xMDgsMjAgKzEwOCw5IEBACiBib290aW1hZ2UgYm9vdHBmaWxlIGJvb3RwemZpbGU6IHZtbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICQoYm9vdCkvJEAKIAotCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbV9vZmZzZXRzLmgKLQotYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBcCi0JCQkJICAgaW5jbHVkZS9jb25maWcvTUFSS0VSCi0KLWluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtX29mZnNldHMuaDogYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zCi0JJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXRzKQotCiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQogCi1DTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbV9vZmZzZXRzLmgKLQogZGVmaW5lIGFyY2hoZWxwCiAgIGVjaG8gJyogYm9vdAkJLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoYXJjaC9hbHBoYS9ib290L3ZtbGludXguZ3opJwogICBlY2hvICcgIGJvb3RpbWFnZQktIFNSTSBib290YWJsZSBpbWFnZSAoYXJjaC9hbHBoYS9ib290L2Jvb3RpbWFnZSknCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9hbHBoYV9rc3ltcy5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvYWxwaGFfa3N5bXMuYwppbmRleCBmYzVlZjkwLi4yNGFlOWEzIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9hbHBoYV9rc3ltcy5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL2FscGhhX2tzeW1zLmMKQEAgLTE4NSwxNSArMTg1LDYgQEAKIEVYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb24pOwogRVhQT1JUX1NZTUJPTChzbXBfY2FsbF9mdW5jdGlvbl9vbl9jcHUpOwogRVhQT1JUX1NZTUJPTChfYXRvbWljX2RlY19hbmRfbG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi1FWFBPUlRfU1lNQk9MKF9yYXdfc3Bpbl91bmxvY2spOwotRVhQT1JUX1NZTUJPTChkZWJ1Z19zcGluX2xvY2spOwotRVhQT1JUX1NZTUJPTChkZWJ1Z19zcGluX3RyeWxvY2spOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0RFQlVHX1JXTE9DSwotRVhQT1JUX1NZTUJPTChfcmF3X3dyaXRlX2xvY2spOwotRVhQT1JUX1NZTUJPTChfcmF3X3JlYWRfbG9jayk7Ci0jZW5kaWYKIEVYUE9SVF9TWU1CT0woY3B1X3ByZXNlbnRfbWFzayk7CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9hbHBoYS9rZXJuZWwvZW50cnkuUwppbmRleCBmMDkyN2VlLi43NmNjMGNiIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL2VudHJ5LlMKQEAgLTUsNyArNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wYWwuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL2hlYWQuUyBiL2FyY2gvYWxwaGEva2VybmVsL2hlYWQuUwppbmRleCA0Y2EyZTQwLi4wOTA1NzIxIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvaGVhZC5TCkBAIC05LDcgKzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAuZ2xvYmwgc3dhcHBlcl9wZ19kaXIKIC5nbG9ibCBfc3RleHQKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL21vZHVsZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvbW9kdWxlLmMKaW5kZXggZmMyNzFlMy4uYWFjNmQ0YiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvbW9kdWxlLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAogc3RydWN0IGdvdF9lbnRyeSB7CiAJc3RydWN0IGdvdF9lbnRyeSAqbmV4dDsKLQlFbGY2NF9BZGRyIHJfb2Zmc2V0OworCUVsZjY0X1N4d29yZCByX2FkZGVuZDsKIAlpbnQgZ290X29mZnNldDsKIH07CiAKQEAgLTU3LDE0ICs1NywxNCBAQAogewogCXVuc2lnbmVkIGxvbmcgcl9zeW0gPSBFTEY2NF9SX1NZTSAocmVsYS0+cl9pbmZvKTsKIAl1bnNpZ25lZCBsb25nIHJfdHlwZSA9IEVMRjY0X1JfVFlQRSAocmVsYS0+cl9pbmZvKTsKLQlFbGY2NF9BZGRyIHJfb2Zmc2V0ID0gcmVsYS0+cl9vZmZzZXQ7CisJRWxmNjRfU3h3b3JkIHJfYWRkZW5kID0gcmVsYS0+cl9hZGRlbmQ7CiAJc3RydWN0IGdvdF9lbnRyeSAqZzsKIAogCWlmIChyX3R5cGUgIT0gUl9BTFBIQV9MSVRFUkFMKQogCQlyZXR1cm47CiAKIAlmb3IgKGcgPSBjaGFpbnMgKyByX3N5bTsgZyA7IGcgPSBnLT5uZXh0KQotCQlpZiAoZy0+cl9vZmZzZXQgPT0gcl9vZmZzZXQpIHsKKwkJaWYgKGctPnJfYWRkZW5kID09IHJfYWRkZW5kKSB7CiAJCQlpZiAoZy0+Z290X29mZnNldCA9PSAwKSB7CiAJCQkJZy0+Z290X29mZnNldCA9ICpwb2Zmc2V0OwogCQkJCSpwb2Zmc2V0ICs9IDg7CkBAIC03NCw3ICs3NCw3IEBACiAKIAlnID0ga21hbGxvYyAoc2l6ZW9mICgqZyksIEdGUF9LRVJORUwpOwogCWctPm5leHQgPSBjaGFpbnNbcl9zeW1dLm5leHQ7Ci0JZy0+cl9vZmZzZXQgPSByX29mZnNldDsKKwlnLT5yX2FkZGVuZCA9IHJfYWRkZW5kOwogCWctPmdvdF9vZmZzZXQgPSAqcG9mZnNldDsKIAkqcG9mZnNldCArPSA4OwogCWNoYWluc1tyX3N5bV0ubmV4dCA9IGc7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKaW5kZXggMTY3ZmQ4OWYuLjA2MzYxMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKQEAgLTk3NCw2ICs5NzQsNyBAQAogCXNpemVfdCBzaXplOwogCWxvbmcgdGltZW91dDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCiAJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCWlmICh0dnApIHsKQEAgLTk5NSw3ICs5OTYsOCBAQAogCQl9CiAJfQogCi0JaWYgKG4gPCAwIHx8IG4gPiBjdXJyZW50LT5maWxlcy0+bWF4X2Zkc2V0KQorCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOworCWlmIChuIDwgMCB8fCBuID4gZmR0LT5tYXhfZmRzZXQpCiAJCWdvdG8gb3V0X25vZmRzOwogCiAJLyoKQEAgLTExNTIsOCArMTE1NCw3IEBACiAKIAl0aWNrcyA9IHRpbWV2YWxfdG9famlmZmllcygmdG1wKTsKIAotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCXRpY2tzID0gc2NoZWR1bGVfdGltZW91dCh0aWNrcyk7CisJdGlja3MgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGlja3MpOwogCiAJaWYgKHJlbWFpbikgewogCQlqaWZmaWVzX3RvX3RpbWV2YWwodGlja3MsICZ0bXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYwppbmRleCBlMjExYWE3Li5kYTBiZTM0IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYwpAQCAtOTg5LDE3NSArOTg5LDMgQEAKIAogCXByZWVtcHRfZW5hYmxlKCk7CiB9Ci0MCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi12b2lkCi1fcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKiBsb2NrKQotewotCW1iKCk7Ci0JbG9jay0+bG9jayA9IDA7Ci0KLQlsb2NrLT5vbl9jcHUgPSAtMTsKLQlsb2NrLT5wcmV2aW91cyA9IE5VTEw7Ci0JbG9jay0+dGFzayA9IE5VTEw7Ci0JbG9jay0+YmFzZV9maWxlID0gIm5vbmUiOwotCWxvY2stPmxpbmVfbm8gPSAwOwotfQotCi12b2lkCi1kZWJ1Z19zcGluX2xvY2soc3BpbmxvY2tfdCAqIGxvY2ssIGNvbnN0IGNoYXIgKmJhc2VfZmlsZSwgaW50IGxpbmVfbm8pCi17Ci0JbG9uZyB0bXA7Ci0JbG9uZyBzdHVjazsKLQl2b2lkICppbmxpbmVfcGMgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7Ci0JdW5zaWduZWQgbG9uZyBzdGFydGVkID0gamlmZmllczsKLQlpbnQgcHJpbnRlZCA9IDA7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCXN0dWNrID0gMUwgPDwgMzA7Ci0gdHJ5X2FnYWluOgotCi0JLyogVXNlIHN1Yi1zZWN0aW9ucyB0byBwdXQgdGhlIGFjdHVhbCBsb29wIGF0IHRoZSBlbmQKLQkgICBvZiB0aGlzIG9iamVjdCBmaWxlJ3MgdGV4dCBzZWN0aW9uIHNvIGFzIHRvIHBlcmZlY3QKLQkgICBicmFuY2ggcHJlZGljdGlvbi4gICovCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JIjE6CWxkbF9sCSUwLCUxXG4iCi0JIglzdWJxCSUyLDEsJTJcbiIKLQkiCWJsYnMJJTAsMmZcbiIKLQkiCW9yCSUwLDEsJTBcbiIKLQkiCXN0bF9jCSUwLCUxXG4iCi0JIgliZXEJJTAsM2ZcbiIKLQkiNDoJbWJcbiIKLQkiLnN1YnNlY3Rpb24gMlxuIgotCSIyOglsZGwJJTAsJTFcbiIKLQkiCXN1YnEJJTIsMSwlMlxuIgotCSIzOglibHQJJTIsNGJcbiIKLQkiCWJsYnMJJTAsMmJcbiIKLQkiCWJyCTFiXG4iCi0JIi5wcmV2aW91cyIKLQk6ICI9ciIgKHRtcCksICI9bSIgKGxvY2stPmxvY2spLCAiPXIiIChzdHVjaykKLQk6ICJtIiAobG9jay0+bG9jayksICIyIiAoc3R1Y2spIDogIm1lbW9yeSIpOwotCi0JaWYgKHN0dWNrIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiJXM6JWQgc3BpbmxvY2sgc3R1Y2sgaW4gJXMgYXQgJXAoJWQpIgotCQkgICAgICAgIiBvd25lciAlcyBhdCAlcCglZCkgJXM6JWRcbiIsCi0JCSAgICAgICBiYXNlX2ZpbGUsIGxpbmVfbm8sCi0JCSAgICAgICBjdXJyZW50LT5jb21tLCBpbmxpbmVfcGMsIGNwdSwKLQkJICAgICAgIGxvY2stPnRhc2stPmNvbW0sIGxvY2stPnByZXZpb3VzLAotCQkgICAgICAgbG9jay0+b25fY3B1LCBsb2NrLT5iYXNlX2ZpbGUsIGxvY2stPmxpbmVfbm8pOwotCQlzdHVjayA9IDFMIDw8IDM2OwotCQlwcmludGVkID0gMTsKLQkJZ290byB0cnlfYWdhaW47Ci0JfQotCi0JLyogRXhpdGluZy4gIEdvdCB0aGUgbG9jay4gICovCi0JbG9jay0+b25fY3B1ID0gY3B1OwotCWxvY2stPnByZXZpb3VzID0gaW5saW5lX3BjOwotCWxvY2stPnRhc2sgPSBjdXJyZW50OwotCWxvY2stPmJhc2VfZmlsZSA9IGJhc2VfZmlsZTsKLQlsb2NrLT5saW5lX25vID0gbGluZV9ubzsKLQotCWlmIChwcmludGVkKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICIlczolZCBzcGlubG9jayBncmFiYmVkIGluICVzIGF0ICVwKCVkKSAlbGQgdGlja3NcbiIsCi0JCSAgICAgICBiYXNlX2ZpbGUsIGxpbmVfbm8sIGN1cnJlbnQtPmNvbW0sIGlubGluZV9wYywKLQkJICAgICAgIGNwdSwgamlmZmllcyAtIHN0YXJ0ZWQpOwotCX0KLX0KLQotaW50Ci1kZWJ1Z19zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqIGxvY2ssIGNvbnN0IGNoYXIgKmJhc2VfZmlsZSwgaW50IGxpbmVfbm8pCi17Ci0JaW50IHJldDsKLQlpZiAoKHJldCA9ICF0ZXN0X2FuZF9zZXRfYml0KDAsIGxvY2spKSkgewotCQlsb2NrLT5vbl9jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCWxvY2stPnByZXZpb3VzID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwotCQlsb2NrLT50YXNrID0gY3VycmVudDsKLQl9IGVsc2UgewotCQlsb2NrLT5iYXNlX2ZpbGUgPSBiYXNlX2ZpbGU7Ci0JCWxvY2stPmxpbmVfbm8gPSBsaW5lX25vOwotCX0KLQlyZXR1cm4gcmV0OwotfQotI2VuZGlmIC8qIENPTkZJR19ERUJVR19TUElOTE9DSyAqLwotDAotI2lmZGVmIENPTkZJR19ERUJVR19SV0xPQ0sKLXZvaWQgX3Jhd193cml0ZV9sb2NrKHJ3bG9ja190ICogbG9jaykKLXsKLQlsb25nIHJlZ3gsIHJlZ3k7Ci0JaW50IHN0dWNrX2xvY2ssIHN0dWNrX3JlYWRlcjsKLQl2b2lkICppbmxpbmVfcGMgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7Ci0KLSB0cnlfYWdhaW46Ci0KLQlzdHVja19sb2NrID0gMTw8MzA7Ci0Jc3R1Y2tfcmVhZGVyID0gMTw8MzA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkiMToJbGRsX2wJJTEsJTBcbiIKLQkiCWJsYnMJJTEsNmZcbiIKLQkiCWJsdAklMSw4ZlxuIgotCSIJbW92CTEsJTFcbiIKLQkiCXN0bF9jCSUxLCUwXG4iCi0JIgliZXEJJTEsNmZcbiIKLQkiNDoJbWJcbiIKLQkiLnN1YnNlY3Rpb24gMlxuIgotCSI2OglibHQJJTMsNGIJIyBkZWJ1Z1xuIgotCSIJc3VibAklMywxLCUzCSMgZGVidWdcbiIKLQkiCWxkbAklMSwlMFxuIgotCSIJYmxicwklMSw2YlxuIgotCSI4OglibHQJJTQsNGIJIyBkZWJ1Z1xuIgotCSIJc3VibAklNCwxLCU0CSMgZGVidWdcbiIKLQkiCWxkbAklMSwlMFxuIgotCSIJYmx0CSUxLDhiXG4iCi0JIglicgkxYlxuIgotCSIucHJldmlvdXMiCi0JOiAiPW0iICgqKHZvbGF0aWxlIGludCAqKWxvY2spLCAiPSZyIiAocmVneCksICI9JnIiIChyZWd5KSwKLQkgICI9JnIiIChzdHVja19sb2NrKSwgIj0mciIgKHN0dWNrX3JlYWRlcikKLQk6ICJtIiAoKih2b2xhdGlsZSBpbnQgKilsb2NrKSwgIjMiIChzdHVja19sb2NrKSwgIjQiIChzdHVja19yZWFkZXIpIDogIm1lbW9yeSIpOwotCi0JaWYgKHN0dWNrX2xvY2sgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIndyaXRlX2xvY2sgc3R1Y2sgYXQgJXBcbiIsIGlubGluZV9wYyk7Ci0JCWdvdG8gdHJ5X2FnYWluOwotCX0KLQlpZiAoc3R1Y2tfcmVhZGVyIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3cml0ZV9sb2NrIHN0dWNrIG9uIHJlYWRlcnMgYXQgJXBcbiIsCi0JCSAgICAgICBpbmxpbmVfcGMpOwotCQlnb3RvIHRyeV9hZ2FpbjsKLQl9Ci19Ci0KLXZvaWQgX3Jhd19yZWFkX2xvY2socndsb2NrX3QgKiBsb2NrKQotewotCWxvbmcgcmVneDsKLQlpbnQgc3R1Y2tfbG9jazsKLQl2b2lkICppbmxpbmVfcGMgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7Ci0KLSB0cnlfYWdhaW46Ci0KLQlzdHVja19sb2NrID0gMTw8MzA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkiMToJbGRsX2wJJTEsJTA7IgotCSIJYmxicwklMSw2ZjsiCi0JIglzdWJsCSUxLDIsJTE7IgotCSIJc3RsX2MJJTEsJTA7IgotCSIJYmVxCSUxLDZmOyIKLQkiNDoJbWJcbiIKLQkiLnN1YnNlY3Rpb24gMlxuIgotCSI2OglsZGwJJTEsJTA7IgotCSIJYmx0CSUyLDRiCSMgZGVidWdcbiIKLQkiCXN1YmwJJTIsMSwlMgkjIGRlYnVnXG4iCi0JIglibGJzCSUxLDZiOyIKLQkiCWJyCTFiXG4iCi0JIi5wcmV2aW91cyIKLQk6ICI9bSIgKCoodm9sYXRpbGUgaW50ICopbG9jayksICI9JnIiIChyZWd4KSwgIj0mciIgKHN0dWNrX2xvY2spCi0JOiAibSIgKCoodm9sYXRpbGUgaW50ICopbG9jayksICIyIiAoc3R1Y2tfbG9jaykgOiAibWVtb3J5Iik7Ci0KLQlpZiAoc3R1Y2tfbG9jayA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVhZF9sb2NrIHN0dWNrIGF0ICVwXG4iLCBpbmxpbmVfcGMpOwotCQlnb3RvIHRyeV9hZ2FpbjsKLQl9Ci19Ci0jZW5kaWYgLyogQ09ORklHX0RFQlVHX1JXTE9DSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jCmluZGV4IDgwNDcyNzguLmUzMmZlZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19tYXJ2ZWwuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMKQEAgLTM3MywxMiArMzczLDExIEBACiAJCWlycSArPSAweDgwOwkJCS8qIG9mZnNldCBmb3IgbHNpICAgICAgICovCiAKICNpZiAxCi0JCXByaW50aygiUENJOiVkOiVkOiVkIChob3NlICVkKSBbJXNdIGlzIHVzaW5nIE1TSVxuIiwKKwkJcHJpbnRrKCJQQ0k6JWQ6JWQ6JWQgKGhvc2UgJWQpIGlzIHVzaW5nIE1TSVxuIiwKIAkJICAgICAgIGRldi0+YnVzLT5udW1iZXIsIAogCQkgICAgICAgUENJX1NMT1QoZGV2LT5kZXZmbiksIAogCQkgICAgICAgUENJX0ZVTkMoZGV2LT5kZXZmbiksCi0JCSAgICAgICBob3NlLT5pbmRleCwKLQkJICAgICAgIHBjaV9wcmV0dHlfbmFtZSAoZGV2KSk7CisJCSAgICAgICBob3NlLT5pbmRleCk7CiAJCXByaW50aygiICAlZCBtZXNzYWdlKHMpIGZyb20gMHglMDR4XG4iLCAKIAkJICAgICAgIDEgPDwgKChtc2dfY3RsICYgUENJX01TSV9GTEFHU19RU0laRSkgPj4gNCksCiAJCSAgICAgICBtc2dfZGF0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYwppbmRleCA4MjI2YzVjLi42N2JlNTBiIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkgKiBDTU9TIGNsb2NrIGFjY29yZGluZ2x5IGV2ZXJ5IH4xMSBtaW51dGVzLiBTZXRfcnRjX21tc3MoKSBoYXMgdG8gYmUKIAkgKiBjYWxsZWQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gNTAwIG1zIGJlZm9yZSB0aGUgbmV3IHNlY29uZCBzdGFydHMuCiAJICovCi0JaWYgKCh0aW1lX3N0YXR1cyAmIFNUQV9VTlNZTkMpID09IDAKKwlpZiAobnRwX3N5bmNlZCgpCiAJICAgICYmIHh0aW1lLnR2X3NlYyA+IHN0YXRlLmxhc3RfcnRjX3VwZGF0ZSArIDY2MAogCSAgICAmJiB4dGltZS50dl9uc2VjID49IDUwMDAwMCAtICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyCiAJICAgICYmIHh0aW1lLnR2X25zZWMgPD0gNTAwMDAwICsgKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIpIHsKQEAgLTUwMiwxMCArNTAyLDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAogCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOwogCWNsb2NrX3dhc19zZXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvbGliL2RiZ19zdGFja2NoZWNrLlMgYi9hcmNoL2FscGhhL2xpYi9kYmdfc3RhY2tjaGVjay5TCmluZGV4IGNjNWNlM2EuLjNjMWYzZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvbGliL2RiZ19zdGFja2NoZWNrLlMKKysrIGIvYXJjaC9hbHBoYS9saWIvZGJnX3N0YWNrY2hlY2suUwpAQCAtNSw3ICs1LDcgQEAKICAqIFZlcmlmeSB0aGF0IHdlIGhhdmUgbm90IG92ZXJmbG93ZWQgdGhlIHN0YWNrLiAgT29wcyBpZiB3ZSBoYXZlLgogICovCiAKLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCS50ZXh0CiAJLnNldCBub2F0CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2xpYi9kYmdfc3RhY2traWxsLlMgYi9hcmNoL2FscGhhL2xpYi9kYmdfc3RhY2traWxsLlMKaW5kZXggZTA5ZjJhZS4uZTlmNmE5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9saWIvZGJnX3N0YWNra2lsbC5TCisrKyBiL2FyY2gvYWxwaGEvbGliL2RiZ19zdGFja2tpbGwuUwpAQCAtNiw3ICs2LDcgQEAKICAqIHVuaW5pdGlhbGl6ZWQgbG9jYWwgdmFyaWFibGVzIGluIHRoZSBhY3QuCiAgKi8KIAotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAJLnRleHQKIAkuc2V0IG5vYXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IDRiZjBlODcuLjExZmZmMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtNjQsNiArNjQsOSBAQAogY29uZmlnIEdFTkVSSUNfQlVTVF9TUElOTE9DSwogCWJvb2wKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJYm9vbAorCiBjb25maWcgR0VORVJJQ19JU0FfRE1BCiAJYm9vbAogCkBAIC0xNTAsNiArMTUzLDcgQEAKIAlzZWxlY3QgQVJDSF9BQ09STgogCXNlbGVjdCBGSVEKIAlzZWxlY3QgVElNRVJfQUNPUk4KKwlzZWxlY3QgQVJDSF9NQVlfSEFWRV9QQ19GREMKIAloZWxwCiAJICBPbiB0aGUgQWNvcm4gUmlzYy1QQywgTGludXggY2FuIHN1cHBvcnQgdGhlIGludGVybmFsIElERSBkaXNrIGFuZAogCSAgQ0QtUk9NIGludGVyZmFjZSwgc2VyaWFsIGFuZCBwYXJhbGxlbCBwb3J0LCBhbmQgdGhlIGZsb3BweSBkcml2ZS4KQEAgLTMyMiw4ICszMjYsOCBAQAogCSAgcHJvY2Vzc29yIG1hY2hpbmVzLiBPbiBhIHNpbmdsZSBwcm9jZXNzb3IgbWFjaGluZSwgdGhlIGtlcm5lbCB3aWxsCiAJICBydW4gZmFzdGVyIGlmIHlvdSBzYXkgTiBoZXJlLgogCi0JICBTZWUgYWxzbyB0aGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zbXAudGV4PiwKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vc21wLnR4dD4sIDxmaWxlOkRvY3VtZW50YXRpb24vaTM4Ni9JTy1BUElDLnR4dD4sCisJICBTZWUgYWxzbyB0aGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zbXAudHh0PiwKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vaTM4Ni9JTy1BUElDLnR4dD4sCiAJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25taV93YXRjaGRvZy50eHQ+IGFuZCB0aGUgU01QLUhPV1RPIGF2YWlsYWJsZSBhdAogCSAgPGh0dHA6Ly93d3cubGludXhkb2Mub3JnL2RvY3MuaHRtbCNob3d0bz4uCiAKQEAgLTM2NSw4ICszNjksOCBAQAogCiAJICBQbGVhc2Ugbm90ZSB0aGF0IGR5bmFtaWMgdGljayBtYXkgYWZmZWN0IHRoZSBhY2N1cmFjeSBvZgogCSAgdGltZWtlZXBpbmcgb24gc29tZSBwbGF0Zm9ybXMgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KLQkgIEN1cnJlbnRseSBhdCBsZWFzdCBPTUFQIHBsYXRmb3JtIGlzIGtub3duIHRvIGhhdmUgYWNjdXJhdGUKLQkgIHRpbWVrZWVwaW5nIHdpdGggZHluYW1pYyB0aWNrLgorCSAgQ3VycmVudGx5IGF0IGxlYXN0IE9NQVAsIFBYQTJ4eCBhbmQgU0ExMXgwIHBsYXRmb3JtcyBhcmUga25vd24KKwkgIHRvIGhhdmUgYWNjdXJhdGUgdGltZWtlZXBpbmcgd2l0aCBkeW5hbWljIHRpY2suCiAKIGNvbmZpZyBBUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnLmRlYnVnIGIvYXJjaC9hcm0vS2NvbmZpZy5kZWJ1ZwppbmRleCA0NWE1NzA5Li41ZDNhY2ZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvYXJtL0tjb25maWcuZGVidWcKQEAgLTUzLDcgKzUzLDcgQEAKIAlib29sICJLZXJuZWwgbG93LWxldmVsIGRlYnVnZ2luZyBmdW5jdGlvbnMiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKIAloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgZGVmaW5pdGlvbnMgb2YgcHJpbnRhc2NpaSwgcHJpbnRjaGFyLCBwcmludGhleAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIGRlZmluaXRpb25zIG9mIHByaW50YXNjaWksIHByaW50Y2gsIHByaW50aGV4CiAJICBpbiB0aGUga2VybmVsLiAgVGhpcyBpcyBoZWxwZnVsIGlmIHlvdSBhcmUgZGVidWdnaW5nIGNvZGUgdGhhdAogCSAgZXhlY3V0ZXMgYmVmb3JlIHRoZSBjb25zb2xlIGlzIGluaXRpYWxpemVkLgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IDY3ZjE0NTMuLmU2MjVhYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC0xNzgsNyArMTc4LDcgQEAKIHByZXBhcmU6IG1ha2V0b29scyBpbmNsdWRlL2FzbS1hcm0vLmFyY2gKIAogLlBIT05ZOiBtYWtldG9vbHMgRk9SQ0UKLW1ha2V0b29sczogaW5jbHVkZS9hc20tYXJtL2NvbnN0YW50cy5oIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIEZPUkNFCittYWtldG9vbHM6IGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIEZPUkNFCiAJJChRKSQoTUFLRSkgJChidWlsZCk9YXJjaC9hcm0vdG9vbHMgaW5jbHVkZS9hc20tYXJtL21hY2gtdHlwZXMuaAogCiAjIENvbnZlcnQgYnpJbWFnZSB0byB6SW1hZ2UKQEAgLTE5MCw3ICsxOTAsNyBAQAogemluc3RhbGwgaW5zdGFsbDogdm1saW51eAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgTUFDSElORT0kKE1BQ0hJTkUpICRACiAKLUNMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLWFybS9jb25zdGFudHMuaCogaW5jbHVkZS9hc20tYXJtL21hY2gtdHlwZXMuaCBcCitDTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS1hcm0vbWFjaC10eXBlcy5oIFwKIAkgICAgICAgaW5jbHVkZS9hc20tYXJtL2FyY2ggaW5jbHVkZS9hc20tYXJtLy5hcmNoCiAKICMgV2UgdXNlIE1SUFJPUEVSX0ZJTEVTIGFuZCBDTEVBTl9GSUxFUyBub3cKQEAgLTIwMSwxMSArMjAxLDYgQEAKIGJwOjsJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBNQUNISU5FPSQoTUFDSElORSkgJChib290KS9ib290cEltYWdlCiBpIHppOjsJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBNQUNISU5FPSQoTUFDSElORSkgJEAKIAotYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBcCi0JCQkJICAgaW5jbHVkZS9hc20tYXJtLy5hcmNoCi0KLWluY2x1ZGUvYXNtLSQoQVJDSCkvY29uc3RhbnRzLmg6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKIAogZGVmaW5lIGFyY2hoZWxwCiAgIGVjaG8gICcqIHpJbWFnZSAgICAgICAgLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoYXJjaC8kKEFSQ0gpL2Jvb3QvekltYWdlKScKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLXNoYXJwc2wuUyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLXNoYXJwc2wuUwppbmRleCBkNmJmOGEyLi41OWFkNjk2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1zaGFycHNsLlMKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtc2hhcnBzbC5TCkBAIC03LDcgKzcsOCBAQAogICogc28gd2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBtYWNoaW5lIGZvciBvdXJzZWx2ZXMuLi4KICAqCiAgKiBTdXBwb3J0IGZvciBQb29kbGUsIENvcmdpIChTTC1DNzAwKSwgU2hlcGhlcmQgKFNMLUM3NTApCi0gKiBhbmQgSHVza3kgKFNMLUM3NjApLgorICogSHVza3kgKFNMLUM3NjApLCBUb3NhIChTTC1DNjAwMCksIFNwaXR6IChTTC1DMzAwMCksCisgKiBBa2l0YSAoU0wtQzEwMDApIGFuZCBCb3J6b2kgKFNMLUMzMTAwKS4KICAqCiAgKi8KIApAQCAtMjMsNiArMjQsMjIgQEAKIAogX19TaGFycFNMX3N0YXJ0OgogCisvKiBDaGVjayBmb3IgVEM2MzkzIC0gaWYgZm91bmQgd2UgaGF2ZSBhIFRvc2EgKi8KKwlsZHIJcjcsIC5UT1NBSUQKKwltb3YJcjEsICMweDEwMDAwMDAwCQlAIEJhc2UgYWRkcmVzcyBvZiBUQzYzOTMgY2hpcAorCW1vdiAJcjYsICMweDAzCisJbGRyaAlyMywgW3IxLCAjOF0JCUAgTG9hZCBUQzYzOTNYQiBSZXZpc29uOiBUaGlzIGlzIDB4MDAwMworCWNtcAlyNiwgcjMKKwliZXEJLlNIQVJQRU5ECQlAIFN1Y2Nlc3MgLT4gdG9zYQorCisvKiBDaGVjayBmb3IgcHhhMjcwIC0gaWYgZm91bmQsIGJyYW5jaCAqLworCW1yYyBwMTUsIDAsIHI0LCBjMCwgYzAJCUAgR2V0IFByb2Nlc3NvciBJRAorCWFuZAlyNCwgcjQsICMweGZmZmZmZjAwCisJbGRyCXIzLCAuUFhBMjcwSUQKKwljbXAJcjQsIHIzCisJYmVxCS5QWEEyNzAKKworLyogQ2hlY2sgZm9yIHcxMDAgLSBpZiBub3QgZm91bmQgd2UgaGF2ZSBhIFBvb2RsZSAqLwogCWxkcglyMSwgLlcxMDBBRERSCQlAIEJhc2UgYWRkcmVzcyBvZiB3MTAwIGNoaXAgKyByZWdzIG9mZnNldAogCiAJbW92IHI2LCAjMHgzMQkJCUAgTG9hZCBNYWdpYyBJbml0IHZhbHVlCkBAIC0zMCw3ICs0Nyw3IEBACiAJbW92IHI1LCAjMHgzMDAwCiAuVzEwMExPT1A6CiAJc3VicyByNSwgcjUsICMxCi0gICAgYm5lIC5XMTAwTE9PUAorCWJuZSAuVzEwMExPT1AKIAltb3YgcjYsICMweDMwCQkJQCBMb2FkIDJuZCBNYWdpYyBJbml0IHZhbHVlCiAJc3RyCXI2LCBbcjEsICMweDI4MF0JQCB0byBTQ1JBVENIX1VNU0sKIApAQCAtNDAsNDUgKzU3LDUyIEBACiAJY21wCXI2LCByMwogCWJuZQkuU0hBUlBFTkQJCQlAIFdlIGhhdmUgbm8gdzEwMCAtIFBvb2RsZQogCi0JbXJjIHAxNSwgMCwgcjYsIGMwLCBjMAlAIEdldCBQcm9jZXNzb3IgSUQKLQlhbmQJcjYsIHI2LCAjMHhmZmZmZmYwMAorLyogQ2hlY2sgZm9yIHB4YTI1MCAtIGlmIGZvdW5kIHdlIGhhdmUgYSBDb3JnaSAqLwogCWxkcglyNywgLkNPUkdJSUQKIAlsZHIJcjMsIC5QWEEyNTVJRAotCWNtcAlyNiwgcjMKKwljbXAJcjQsIHIzCiAJYmxvCS5TSEFSUEVORAkJCUAgV2UgaGF2ZSBhIFBYQTI1MCAtIENvcmdpCiAKLQltb3YJcjEsICMweDBjMDAwMDAwCQlAIEJhc2UgYWRkcmVzcyBvZiBOQU5EIGNoaXAKLQlsZHJiCXIzLCBbcjEsICMyNF0JQCBMb2FkIEZMQVNIQ1RMCi0JYmljCXIzLCByMywgIzB4MTEJCUAgU0VUIE5DRQotCW9ycglyMywgcjMsICMweDBhCQlAIFNFVCBDTFIgKyBGTFdQCi0Jc3RyYglyMywgW3IxLCAjMjRdCUAgU2F2ZSB0byBGTEFTSENUTAotCW1vdiAJcjIsICMweDkwCQlAIENvbW1hbmQgInJlYWRpZCIKLQlzdHJiCXIyLCBbcjEsICMyMF0JQCBTYXZlIHRvIEZMQVNISU8KLQliaWMJcjMsIHIzLCAjMgkJCUAgQ0xSIENMRQotCW9ycglyMywgcjMsICM0CQkJQCBTRVQgQUxFCi0Jc3RyYglyMywgW3IxLCAjMjRdCUAgU2F2ZSB0byBGTEFTSENUTAotCW1vdgkJcjIsICMwCQkJQCBBZGRyZXNzIDB4MDAKLQlzdHJiCXIyLCBbcjEsICMyMF0JQCBTYXZlIHRvIEZMQVNISU8KLQliaWMJcjMsIHIzLCAjNAkJCUAgQ0xSIEFMRQotCXN0cmIJcjMsIFtyMSwgIzI0XQlAIFNhdmUgdG8gRkxBU0hDVEwKLS5TSEFSUDE6Ci0JbGRyYglyMywgW3IxLCAjMjRdCUAgTG9hZCBGTEFTSENUTAotCXRzdAlyMywgIzMyCQkJCUAgSXMgY2hpcCByZWFkeT8KLQliZXEJLlNIQVJQMQotCWxkcmIJcjIsIFtyMSwgIzIwXQlAIE5BTkQgTWFudWZhY3R1cmVyIElECi0JbGRyYglyMywgW3IxLCAjMjBdCUAgTkFORCBDaGlwIElECisvKiBDaGVjayBmb3IgNjRNaUIgZmxhc2ggLSBpZiBmb3VuZCB3ZSBoYXZlIGEgU2hlcGhlcmQgKi8KKwlibAlnZXRfZmxhc2hfaWRzCiAJbGRyCXI3LCAuU0hFUEhFUkRJRAogCWNtcAlyMywgIzB4NzYJCQlAIDY0TWlCIGZsYXNoCiAJYmVxCS5TSEFSUEVORAkJCUAgV2UgaGF2ZSBTaGVwaGVyZAorCisvKiBNdXN0IGJlIGEgSHVza3kgKi8KIAlsZHIJcjcsIC5IVVNLWUlECQlAIE11c3QgYmUgSHVza3kKIAliIC5TSEFSUEVORAogCisuUFhBMjcwOgorLyogQ2hlY2sgZm9yIDE2TWlCIGZsYXNoIC0gaWYgZm91bmQgd2UgaGF2ZSBTcGl0eiAqLworCWJsCWdldF9mbGFzaF9pZHMKKwlsZHIJcjcsIC5TUElUWklECisJY21wCXIzLCAjMHg3MwkJCUAgMTZNaUIgZmxhc2gKKwliZXEJLlNIQVJQRU5ECQkJQCBXZSBoYXZlIFNwaXR6CisKKy8qIENoZWNrIGZvciBhIHNlY29uZCBTQ09PUCBjaGlwIC0gaWYgZm91bmQgd2UgaGF2ZSBCb3J6b2kgKi8KKwlsZHIJcjEsIC5TQ09PUDJBRERSCisJbGRyCXI3LCAuQk9SWk9JSUQKKwltb3YgCXI2LCAjMHgwMTQwCisJc3RyaAlyNiwgW3IxXQorCWxkcmgJcjYsIFtyMV0KKwljbXAJcjYsICMweDAxNDAKKwliZXEJLlNIQVJQRU5ECQkJQCBXZSBoYXZlIEJvcnpvaQorCisvKiBNdXN0IGJlIEFraXRhICovCisJbGRyCXI3LCAuQUtJVEFJRAorCWIJLlNIQVJQRU5ECQkJQCBXZSBoYXZlIEJvcnpvaQorCiAuUFhBMjU1SUQ6CiAJLndvcmQJMHg2OTA1MmQwMAkJQCBQWEEyNTUgUHJvY2Vzc29yIElECisuUFhBMjcwSUQ6CisJLndvcmQJMHg2OTA1NDEwMAkJQCBQWEEyNzAgUHJvY2Vzc29yIElECiAuVzEwMElEOgogCS53b3JkCTB4NTc0MTEwMDIJCUAgdzEwMCBDaGlwIElECiAuVzEwMEFERFI6CiAJLndvcmQgCTB4MDgwMTAwMDAJCUAgdzEwMCBDaGlwIElEIFJlZyBBZGRyZXNzCisuU0NPT1AyQUREUjoKKwkud29yZAkweDA4ODAwMDQwCiAuUE9PRExFSUQ6CiAJLndvcmQJTUFDSF9UWVBFX1BPT0RMRQogLkNPUkdJSUQ6CkBAIC04Nyw2ICsxMTEsNDEgQEAKIAkud29yZAlNQUNIX1RZUEVfU0hFUEhFUkQKIC5IVVNLWUlEOgogCS53b3JkCU1BQ0hfVFlQRV9IVVNLWQorLlRPU0FJRDoKKwkud29yZAlNQUNIX1RZUEVfVE9TQQorLlNQSVRaSUQ6CisJLndvcmQJTUFDSF9UWVBFX1NQSVRaCisuQUtJVEFJRDoKKwkud29yZAlNQUNIX1RZUEVfQUtJVEEKKy5CT1JaT0lJRDoKKwkud29yZAlNQUNIX1RZUEVfQk9SWk9JCisKKy8qCisgKiBSZXR1cm46IHIyIC0gTkFORCBNYW51ZmFjdHVyZXIgSUQKKyAqICAgICAgICAgcjMgLSBOQU5EIENoaXAgSUQKKyAqIENvcnJ1cHRzOiByMQorICovCitnZXRfZmxhc2hfaWRzOgorCW1vdglyMSwgIzB4MGMwMDAwMDAJCUAgQmFzZSBhZGRyZXNzIG9mIE5BTkQgY2hpcAorCWxkcmIJcjMsIFtyMSwgIzI0XQkJQCBMb2FkIEZMQVNIQ1RMCisJYmljCXIzLCByMywgIzB4MTEJCUAgU0VUIE5DRQorCW9ycglyMywgcjMsICMweDBhCQlAIFNFVCBDTFIgKyBGTFdQCisJc3RyYglyMywgW3IxLCAjMjRdCQlAIFNhdmUgdG8gRkxBU0hDVEwKKwltb3YgCXIyLCAjMHg5MAkJQCBDb21tYW5kICJyZWFkaWQiCisJc3RyYglyMiwgW3IxLCAjMjBdCQlAIFNhdmUgdG8gRkxBU0hJTworCWJpYwlyMywgcjMsICMyCQlAIENMUiBDTEUKKwlvcnIJcjMsIHIzLCAjNAkJQCBTRVQgQUxFCisJc3RyYglyMywgW3IxLCAjMjRdCQlAIFNhdmUgdG8gRkxBU0hDVEwKKwltb3YJcjIsICMwCQkJQCBBZGRyZXNzIDB4MDAKKwlzdHJiCXIyLCBbcjEsICMyMF0JCUAgU2F2ZSB0byBGTEFTSElPCisJYmljCXIzLCByMywgIzQJCUAgQ0xSIEFMRQorCXN0cmIJcjMsIFtyMSwgIzI0XQkJQCBTYXZlIHRvIEZMQVNIQ1RMCisuZmlkczE6CisJbGRyYglyMywgW3IxLCAjMjRdCQlAIExvYWQgRkxBU0hDVEwKKwl0c3QJcjMsICMzMgkJCUAgSXMgY2hpcCByZWFkeT8KKwliZXEJLmZpZHMxCisJbGRyYglyMiwgW3IxLCAjMjBdCQlAIE5BTkQgTWFudWZhY3R1cmVyIElECisJbGRyYglyMywgW3IxLCAjMjBdCQlAIE5BTkQgQ2hpcCBJRAorCW1vdglwYywgbHIKKwogLlNIQVJQRU5EOgotCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9naWMuYyBiL2FyY2gvYXJtL2NvbW1vbi9naWMuYwppbmRleCA1MWRiZjU0Li5kNzQ5OTA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vZ2ljLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL2dpYy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYyBiL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYwppbmRleCA0MWYxMjY1Li4yNzg2ZjdjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vbG9jb21vLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIAkJZCA9IGlycV9kZXNjICsgaXJxOwogCQlmb3IgKGkgPSAwOyBpIDw9IDM7IGkrKywgZCsrLCBpcnErKykgewogCQkJaWYgKHJlcSAmICgweDAxMDAgPDwgaSkpIHsKLQkJCQlkLT5oYW5kbGUoaXJxLCBkLCByZWdzKTsKKwkJCQlkZXNjX2hhbmRsZV9pcnEoaXJxLCBkLCByZWdzKTsKIAkJCX0KIAogCQl9CkBAIC0yMjAsNyArMjIwLDcgQEAKIAogCWlmIChsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19LRVlCT0FSRCArIExPQ09NT19LSUMpICYgMHgwMDAxKSB7CiAJCWQgPSBpcnFfZGVzYyArIExPQ09NT19JUlFfS0VZX1NUQVJUOwotCQlkLT5oYW5kbGUoTE9DT01PX0lSUV9LRVlfU1RBUlQsIGQsIHJlZ3MpOworCQlkZXNjX2hhbmRsZV9pcnEoTE9DT01PX0lSUV9LRVlfU1RBUlQsIGQsIHJlZ3MpOwogCX0KIH0KIApAQCAtMjczLDcgKzI3Myw3IEBACiAJCWQgPSBpcnFfZGVzYyArIExPQ09NT19JUlFfR1BJT19TVEFSVDsKIAkJZm9yIChpID0gMDsgaSA8PSAxNTsgaSsrLCBpcnErKywgZCsrKSB7CiAJCQlpZiAocmVxICYgKDB4MDAwMSA8PCBpKSkgewotCQkJCWQtPmhhbmRsZShpcnEsIGQsIHJlZ3MpOworCQkJCWRlc2NfaGFuZGxlX2lycShpcnEsIGQsIHJlZ3MpOwogCQkJfQogCQl9CiAJfQpAQCAtMzI4LDcgKzMyOCw3IEBACiAKIAlpZiAobG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fTFRJTlQpICYgMHgwMDAxKSB7CiAJCWQgPSBpcnFfZGVzYyArIExPQ09NT19JUlFfTFRfU1RBUlQ7Ci0JCWQtPmhhbmRsZShMT0NPTU9fSVJRX0xUX1NUQVJULCBkLCByZWdzKTsKKwkJZGVzY19oYW5kbGVfaXJxKExPQ09NT19JUlFfTFRfU1RBUlQsIGQsIHJlZ3MpOwogCX0KIH0KIApAQCAtMzc5LDcgKzM3OSw3IEBACiAKIAkJZm9yIChpID0gMDsgaSA8PSAzOyBpKyssIGlycSsrLCBkKyspIHsKIAkJCWlmIChyZXEgJiAoMHgwMDAxIDw8IGkpKSB7Ci0JCQkJZC0+aGFuZGxlKGlycSwgZCwgcmVncyk7CisJCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZCwgcmVncyk7CiAJCQl9CiAJCX0KIAl9CkBAIC01NDEsNiArNTQxLDEwMyBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KKworc3RydWN0IGxvY29tb19zYXZlX2RhdGEgeworCXUxNglMQ01fR1BPOworCXUxNglMQ01fU1BJQ1Q7CisJdTE2CUxDTV9HUEU7CisJdTE2CUxDTV9BU0Q7CisJdTE2CUxDTV9TUElNRDsKK307CisKK3N0YXRpYyBpbnQgbG9jb21vX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcG1fbWVzc2FnZV90LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IGxvY29tbyAqbGNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbG9jb21vX3NhdmVfZGF0YSAqc2F2ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGxldmVsICE9IFNVU1BFTkRfRElTQUJMRSkKKwkJcmV0dXJuIDA7CisKKwlzYXZlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxvY29tb19zYXZlX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNhdmUpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2LT5wb3dlci5zYXZlZF9zdGF0ZSA9ICh2b2lkICopIHNhdmU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGNoaXAtPmxvY2ssIGZsYWdzKTsKKworCXNhdmUtPkxDTV9HUE8gICAgID0gbG9jb21vX3JlYWRsKGxjaGlwLT5iYXNlICsgTE9DT01PX0dQTyk7CS8qIEdQSU8gKi8KKwlsb2NvbW9fd3JpdGVsKDB4MDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0dQTyk7CisJc2F2ZS0+TENNX1NQSUNUICAgPSBsb2NvbW9fcmVhZGwobGNoaXAtPmJhc2UgKyBMT0NPTU9fU1BJQ1QpOwkvKiBTUEkgKi8KKwlsb2NvbW9fd3JpdGVsKDB4NDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX1NQSUNUKTsKKwlzYXZlLT5MQ01fR1BFICAgICA9IGxvY29tb19yZWFkbChsY2hpcC0+YmFzZSArIExPQ09NT19HUEUpOwkvKiBHUElPICovCisJbG9jb21vX3dyaXRlbCgweDAwLCBsY2hpcC0+YmFzZSArIExPQ09NT19HUEUpOworCXNhdmUtPkxDTV9BU0QgICAgID0gbG9jb21vX3JlYWRsKGxjaGlwLT5iYXNlICsgTE9DT01PX0FTRCk7CS8qIEFEU1RBUlQgKi8KKwlsb2NvbW9fd3JpdGVsKDB4MDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0FTRCk7CisJc2F2ZS0+TENNX1NQSU1EICAgPSBsb2NvbW9fcmVhZGwobGNoaXAtPmJhc2UgKyBMT0NPTU9fU1BJTUQpOwkvKiBTUEkgKi8KKwlsb2NvbW9fd3JpdGVsKDB4M0MxNCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fU1BJTUQpOworCisJbG9jb21vX3dyaXRlbCgweDAwLCBsY2hpcC0+YmFzZSArIExPQ09NT19QQUlGKTsKKwlsb2NvbW9fd3JpdGVsKDB4MDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0RBQyk7CisJbG9jb21vX3dyaXRlbCgweDAwLCBsY2hpcC0+YmFzZSArIExPQ09NT19CQUNLTElHSFQgKyBMT0NPTU9fVEMpOworCisJaWYgKCAobG9jb21vX3JlYWRsKGxjaGlwLT5iYXNlICsgTE9DT01PX0xFRCArIExPQ09NT19MUFQwKSAmIDB4ODgpICYmIChsb2NvbW9fcmVhZGwobGNoaXAtPmJhc2UgKyBMT0NPTU9fTEVEICsgTE9DT01PX0xQVDEpICYgMHg4OCkgKQorCQlsb2NvbW9fd3JpdGVsKDB4MDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0MzMkspOyAJLyogQ0xLMzIgb2ZmICovCisJZWxzZQorCQkvKiAxOE1IeiBhbHJlYWR5IGVuYWJsZWQsIHNvIG5vIHdhaXQgKi8KKwkJbG9jb21vX3dyaXRlbCgweGMxLCBsY2hpcC0+YmFzZSArIExPQ09NT19DMzJLKTsgCS8qIENMSzMyIG9uICovCisKKwlsb2NvbW9fd3JpdGVsKDB4MDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX1RBREMpOwkJLyogMThNSHogY2xvY2sgb2ZmKi8KKwlsb2NvbW9fd3JpdGVsKDB4MDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0FVRElPICsgTE9DT01PX0FDQyk7CQkJLyogMjJNSHovMjRNSHogY2xvY2sgb2ZmICovCisJbG9jb21vX3dyaXRlbCgweDAwLCBsY2hpcC0+YmFzZSArIExPQ09NT19GUk9OVExJR0hUICsgTE9DT01PX0FMUyk7CQkJLyogRkwgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxjaGlwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsb2NvbW9fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCXN0cnVjdCBsb2NvbW8gKmxjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGxvY29tb19zYXZlX2RhdGEgKnNhdmU7CisJdW5zaWduZWQgbG9uZyByOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGxldmVsICE9IFJFU1VNRV9FTkFCTEUpCisJCXJldHVybiAwOworCisJc2F2ZSA9IChzdHJ1Y3QgbG9jb21vX3NhdmVfZGF0YSAqKSBkZXYtPnBvd2VyLnNhdmVkX3N0YXRlOworCWlmICghc2F2ZSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGNoaXAtPmxvY2ssIGZsYWdzKTsKKworCWxvY29tb193cml0ZWwoc2F2ZS0+TENNX0dQTywgbGNoaXAtPmJhc2UgKyBMT0NPTU9fR1BPKTsKKwlsb2NvbW9fd3JpdGVsKHNhdmUtPkxDTV9TUElDVCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fU1BJQ1QpOworCWxvY29tb193cml0ZWwoc2F2ZS0+TENNX0dQRSwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fR1BFKTsKKwlsb2NvbW9fd3JpdGVsKHNhdmUtPkxDTV9BU0QsIGxjaGlwLT5iYXNlICsgTE9DT01PX0FTRCk7CisJbG9jb21vX3dyaXRlbChzYXZlLT5MQ01fU1BJTUQsIGxjaGlwLT5iYXNlICsgTE9DT01PX1NQSU1EKTsKKworCWxvY29tb193cml0ZWwoMHgwMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fQzMySyk7CisJbG9jb21vX3dyaXRlbCgweDkwLCBsY2hpcC0+YmFzZSArIExPQ09NT19UQURDKTsKKworCWxvY29tb193cml0ZWwoMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fS0VZQk9BUkQgKyBMT0NPTU9fS1NDKTsKKwlyID0gbG9jb21vX3JlYWRsKGxjaGlwLT5iYXNlICsgTE9DT01PX0tFWUJPQVJEICsgTE9DT01PX0tJQyk7CisJciAmPSAweEZFRkY7CisJbG9jb21vX3dyaXRlbChyLCBsY2hpcC0+YmFzZSArIExPQ09NT19LRVlCT0FSRCArIExPQ09NT19LSUMpOworCWxvY29tb193cml0ZWwoMHgxLCBsY2hpcC0+YmFzZSArIExPQ09NT19LRVlCT0FSRCArIExPQ09NT19LQ01EKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxjaGlwLT5sb2NrLCBmbGFncyk7CisKKwlkZXYtPnBvd2VyLnNhdmVkX3N0YXRlID0gTlVMTDsKKwlrZnJlZShzYXZlKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKIC8qKgogICoJbG9jb21vX3Byb2JlIC0gcHJvYmUgZm9yIGEgc2luZ2xlIExvQ29NbyBjaGlwLgogICoJQHBoeXNfYWRkcjogcGh5c2ljYWwgYWRkcmVzcyBvZiBkZXZpY2UuCkBAIC02NTEsMTUgKzc0OCwxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgbG9jb21vX3JlbW92ZV9jaGlsZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKwlyZXR1cm4gMDsKK30gCisKIHN0YXRpYyB2b2lkIF9fbG9jb21vX3JlbW92ZShzdHJ1Y3QgbG9jb21vICpsY2hpcCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsLCAqbjsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBuLCAmbGNoaXAtPmRldi0+Y2hpbGRyZW4pIHsKLQkJc3RydWN0IGRldmljZSAqZCA9IGxpc3RfdG9fZGV2KGwpOwotCi0JCWRldmljZV91bnJlZ2lzdGVyKGQpOwotCX0KKwlkZXZpY2VfZm9yX2VhY2hfY2hpbGQobGNoaXAtPmRldiwgTlVMTCwgbG9jb21vX3JlbW92ZV9jaGlsZCk7CiAKIAlpZiAobGNoaXAtPmlycSAhPSBOT19JUlEpIHsKIAkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIobGNoaXAtPmlycSwgTlVMTCk7CkBAIC03MDcsNiArODA0LDEwIEBACiAJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCiAJLnByb2JlCQk9IGxvY29tb19wcm9iZSwKIAkucmVtb3ZlCQk9IGxvY29tb19yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBsb2NvbW9fc3VzcGVuZCwKKwkucmVzdW1lCQk9IGxvY29tb19yZXN1bWUsCisjZW5kaWYKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vc2ExMTExLmMgYi9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKaW5kZXggMzhjMmViNi4uMWE0N2ZiZjljIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCkBAIC0yNjgsOCArMjY4LDggQEAKIAkubWFzawkJPSBzYTExMTFfbWFza19sb3dpcnEsCiAJLnVubWFzawkJPSBzYTExMTFfdW5tYXNrX2xvd2lycSwKIAkucmV0cmlnZ2VyCT0gc2ExMTExX3JldHJpZ2dlcl9sb3dpcnEsCi0JLnR5cGUJCT0gc2ExMTExX3R5cGVfbG93aXJxLAotCS53YWtlCQk9IHNhMTExMV93YWtlX2xvd2lycSwKKwkuc2V0X3R5cGUJPSBzYTExMTFfdHlwZV9sb3dpcnEsCisJLnNldF93YWtlCT0gc2ExMTExX3dha2VfbG93aXJxLAogfTsKIAogc3RhdGljIHZvaWQgc2ExMTExX21hc2tfaGlnaGlycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMzY0LDggKzM2NCw4IEBACiAJLm1hc2sJCT0gc2ExMTExX21hc2tfaGlnaGlycSwKIAkudW5tYXNrCQk9IHNhMTExMV91bm1hc2tfaGlnaGlycSwKIAkucmV0cmlnZ2VyCT0gc2ExMTExX3JldHJpZ2dlcl9oaWdoaXJxLAotCS50eXBlCQk9IHNhMTExMV90eXBlX2hpZ2hpcnEsCi0JLndha2UJCT0gc2ExMTExX3dha2VfaGlnaGlycSwKKwkuc2V0X3R5cGUJPSBzYTExMTFfdHlwZV9oaWdoaXJxLAorCS5zZXRfd2FrZQk9IHNhMTExMV93YWtlX2hpZ2hpcnEsCiB9OwogCiBzdGF0aWMgdm9pZCBzYTExMTFfc2V0dXBfaXJxKHN0cnVjdCBzYTExMTEgKnNhY2hpcCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zY29vcC5jIGIvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMKaW5kZXggY2ZkMGQzZS4uZDNhMDRjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMKQEAgLTE3LDYgKzE3LDEyIEBACiAKICNkZWZpbmUgU0NPT1BfUkVHKGQsYWRyKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopKGQgKyhhZHIpKSkKIAorLyogUENNQ0lBIHRvIFNjb29wIGxpbmthZ2Ugc3RydWN0dXJlcyBmb3IgcHhhMnh4X3NoYXJwc2wuYworICAgVGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8gbGluayBtdWx0aXBsZSBzY29vcCBkZXZpY2VzIGludG8gb25lCisgICBzaW5nbGUgZW50aXR5IGZvciB0aGUgcHhhMnh4X3BjbWNpYSBkZXZpY2UgKi8KK2ludCBzY29vcF9udW07CitzdHJ1Y3Qgc2Nvb3BfcGNtY2lhX2RldiAqc2Nvb3BfZGV2czsKKwogc3RydWN0ICBzY29vcF9kZXYgewogCXZvaWQgICpiYXNlOwogCXNwaW5sb2NrX3Qgc2Nvb3BfbG9jazsKQEAgLTg1LDcgKzkxLDcgQEAKIEVYUE9SVF9TWU1CT0wod3JpdGVfc2Nvb3BfcmVnKTsKIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBzY29vcF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3Qgc3RhdGUsIHVpbnQzMl90IGxldmVsKQorc3RhdGljIGludCBzY29vcF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCB1aW50MzJfdCBsZXZlbCkKIHsKIAlpZiAobGV2ZWwgPT0gU1VTUEVORF9QT1dFUl9ET1dOKSB7CiAJCXN0cnVjdCBzY29vcF9kZXYgKnNkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZwppbmRleCAyNDk1NTI2Li40MTk4Njc3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL29tYXBfaDJfMTYxMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwX2gyXzE2MTBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMgotIyBGcmkgSnVsICA4IDA0OjQ5OjM0IDIwMDUKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMworIyBNb24gU2VwICA1IDE4OjA3OjEyIDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CkBAIC0xMDIsOSArMTAyLDExIEBACiAjIENPTkZJR19PTUFQX01QVV9USU1FUiBpcyBub3Qgc2V0CiBDT05GSUdfT01BUF8zMktfVElNRVI9eQogQ09ORklHX09NQVBfMzJLX1RJTUVSX0haPTEyOAorIyBDT05GSUdfT01BUF9ETV9USU1FUiBpcyBub3Qgc2V0CiBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMT15CiAjIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQyIGlzIG5vdCBzZXQKICMgQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDMgaXMgbm90IHNldAorQ09ORklHX09NQVBfU0VSSUFMX1dBS0U9eQogCiAjCiAjIE9NQVAgQ29yZSBUeXBlCkBAIC0xNjYsNyArMTY4LDYgQEAKICMKICMgS2VybmVsIEZlYXR1cmVzCiAjCi0jIENPTkZJR19TTVAgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFQ9eQogQ09ORklHX05PX0lETEVfSFo9eQogIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKQEAgLTIzMCw2ICsyMzEsNjggQEAKICMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CiAKICMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9UQ1BESUFHPXkKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisKKyMKICMgRGV2aWNlIERyaXZlcnMKICMKIApAQCAtMjQzLDc4ICszMDYsNyBAQAogIwogIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCiAjCi1DT05GSUdfTVREPXkKLUNPTkZJR19NVERfREVCVUc9eQotQ09ORklHX01URF9ERUJVR19WRVJCT1NFPTMKLSMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAotQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ01ETElORV9QQVJUUz15Ci0jIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKLQotIwotIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwotIwotQ09ORklHX01URF9DSEFSPXkKLUNPTkZJR19NVERfQkxPQ0s9eQotIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GVEwgaXMgbm90IHNldAotIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAotCi0jCi0jIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCi0jCi1DT05GSUdfTVREX0NGST15Ci0jIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0dFTl9QUk9CRT15Ci0jIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAotQ09ORklHX01URF9DRklfSTE9eQotQ09ORklHX01URF9DRklfSTI9eQotIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKLSMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9VVElMPXkKLSMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAotCi0jCi0jIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKLSMKLSMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKLQotIwotIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKIAogIwogIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKQEAgLTQwMyw3MiArMzk1LDggQEAKICMKIAogIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi1DT05GSUdfUEFDS0VUPXkKLSMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfRklCX0hBU0g9eQotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotQ09ORklHX0lQX1BOUF9CT09UUD15Ci0jIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9UQ1BESUFHPXkKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVENQX0NPTkdfQklDPXkKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CkBAIC01MTgsNiArNDQ2LDggQEAKICMgQ09ORklHX1NMSVBfTU9ERV9TTElQNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAogCiAjCiAjIElTRE4gc3Vic3lzdGVtCkBAIC02MTUsNzcgKzU0NSwxNSBAQAogIwogIyBJMkMgc3VwcG9ydAogIwotQ09ORklHX0kyQz15Ci1DT05GSUdfSTJDX0NIQVJERVY9eQotCi0jCi0jIEkyQyBBbGdvcml0aG1zCi0jCi0jIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAotIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TRU5TT1IgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKK0NPTkZJR19JU1AxMzAxX09NQVA9eQogCiAjCi0jIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CiAjCi0jIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAotQ09ORklHX0lTUDEzMDFfT01BUD15Ci1DT05GSUdfVFBTNjUwMTA9eQotIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCiAjIE1pc2MgZGV2aWNlcwpAQCAtNzU2LDE1ICs2MjQsOSBAQAogIyBPcGVuIFNvdW5kIFN5c3RlbQogIwogQ09ORklHX1NPVU5EX1BSSU1FPXkKLSMgQ09ORklHX1NPVU5EX0JUODc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0ZVU0lPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9DUzQyODEgaXMgbm90IHNldAotIyBDT05GSUdfU09VTkRfU09OSUNWSUJFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9UUklERU5UIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX01TTkRDTEFTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX01TTkRQSU4gaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfT1NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX1RWTUlYRVIgaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfQUQxOTgwIGlzIG5vdCBzZXQKIAogIwpAQCAtODEwLDYgKzY3Miw3IEBACiAjIENPTkZJR19KQkQgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAKICMKICMgWEZTIHN1cHBvcnQKQEAgLTgxNyw2ICs2ODAsNyBAQAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ST01GU19GUz15CitDT05GSUdfSU5PVElGWT15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldApAQCAtODU3LDE1ICs3MjEsNiBAQAogIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0pGRlMyX0ZTPXkKLUNPTkZJR19KRkZTMl9GU19ERUJVRz0yCi0jIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0Ci1DT05GSUdfSkZGUzJfWkxJQj15Ci1DT05GSUdfSkZGUzJfUlRJTUU9eQotIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAogQ09ORklHX0NSQU1GUz15CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldApAQCAtMTAwNyw0ICs4NjIsMyBAQAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfWkxJQl9JTkZMQVRFPXkKLUNPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvczNjMjQxMF9kZWZjb25maWcKaW5kZXggOTZhNzk0ZC4uNzU2MzQ4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3MzYzI0MTBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLWdpdDQKLSMgV2VkIEp1biAyMiAxNTo1Njo0MiAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTMtZ2l0OAorIyBUaHUgU2VwICA4IDE5OjI0OjAyIDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CkBAIC0yMiw2ICsyMiw3IEBACiAjIEdlbmVyYWwgc2V0dXAKICMKIENPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldApAQCAtMzEsNiArMzIsNyBAQAogIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldApAQCAtODgsNyArOTAsOSBAQAogIwogIyBTM0MyNFhYIEltcGxlbWVudGF0aW9ucwogIworQ09ORklHX01BQ0hfQU5VQklTPXkKIENPTkZJR19BUkNIX0JBU1Q9eQorQ09ORklHX0JBU1RfUEMxMDRfSVJRPXkKIENPTkZJR19BUkNIX0gxOTQwPXkKIENPTkZJR19NQUNIX04zMD15CiBDT05GSUdfQVJDSF9TTURLMjQxMD15CkBAIC0xMTIsNiArMTE2LDcgQEAKICMgQ09ORklHX1MzQzI0MTBfRE1BX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1MzQzI0MTBfUE1fREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfUzNDMjQxMF9QTV9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfUE1fU0lNVEVDPXkKIENPTkZJR19TM0MyNDEwX0xPV0xFVkVMX1VBUlRfUE9SVD0wCiAKICMKQEAgLTE0OSw3ICsxNTQsMTUgQEAKICMKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RJU0NPTlRJR01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKIENPTkZJR19BTElHTk1FTlRfVFJBUD15CiAKICMKQEAgLTE4Niw2ICsxOTksNzQgQEAKIENPTkZJR19BUE09eQogCiAjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKICMgRGV2aWNlIERyaXZlcnMKICMKIApAQCAtMjU4LDYgKzMzOSw3IEBACiAjIENPTkZJR19NVERfSU1QQTcgaXMgbm90IHNldAogQ09ORklHX01URF9CQVNUPXkKIENPTkZJR19NVERfQkFTVF9NQVhTSVpFPTQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIAogIwogIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKQEAgLTMxMiw3ICszOTQsNiBAQAogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogCiAjCkBAIC0zNTQsNiArNDM1LDcgQEAKICMKICMgU0NTSSBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKIAogIwpAQCAtMzc2LDcwICs0NTgsOCBAQAogIwogCiAjCi0jIE5ldHdvcmtpbmcgc3VwcG9ydAorIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CiAjCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLSMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9GSUJfSEFTSD15Ci0jIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlA9eQotIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUF9CT09UUD15Ci0jIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9UQ1BESUFHPXkKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldApAQCAtNDQ3LDYgKzQ2NywxMSBAQAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKIAogIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKICMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCiAjCiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKQEAgLTQ4MCw2ICs1MDUsOCBAQAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAogCiAjCiAjIElTRE4gc3Vic3lzdGVtCkBAIC01NjIsNyArNTg5LDYgQEAKIENPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKIENPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQogIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfODI1MF9NVUxUSVBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMXzgyNTBfUlNBIGlzIG5vdCBzZXQKIAogIwpAQCAtNjA1LDcgKzYzMSw2IEBACiAjCiAjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgogIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCkBAIC02MjgsNyArNjUzLDcgQEAKICMKICMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CiAjCi0jIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSVNBPW0KICMgQ09ORklHX0kyQ19QQVJQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfUzNDMjQxMD15CkBAIC02MzYsMTQgKzY2MSwzMyBAQAogIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAogCiAjCi0jIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0CisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwotQ09ORklHX0kyQ19TRU5TT1I9bQorIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAorQ09ORklHX1NFTlNPUlNfRUVQUk9NPW0KKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorQ09ORklHX0hXTU9OX1ZJRD1tCiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldApAQCAtNjYyLDMwICs3MDYsMjQgQEAKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAotCi0jCi0jIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKLUNPTkZJR19TRU5TT1JTX0VFUFJPTT1tCi0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCiAjIE1pc2MgZGV2aWNlcwogIwogCiAjCisjIE11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycworIworCisjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKQEAgLTczMSw3ICs3NjksNyBAQAogIyBVU0Igc3VwcG9ydAogIwogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKICMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CiAKICMKQEAgLTc0OSw2ICs3ODcsNyBAQAogIwogQ09ORklHX0VYVDJfRlM9eQogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CkBAIC03NTgsNiArNzk3LDcgQEAKIENPTkZJR19GU19NQkNBQ0hFPXkKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogCiAjCiAjIFhGUyBzdXBwb3J0CkBAIC03NjUsNiArODA1LDcgQEAKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfUk9NRlNfRlM9eQorQ09ORklHX0lOT1RJRlk9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAogQ09ORklHX0ROT1RJRlk9eQogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKQEAgLTc5MSwxMSArODMyLDExIEBACiAjCiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX1JFTEFZRlNfRlMgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKQEAgLTgxMiw4ICs4NTMsNyBAQAogIyBDT05GSUdfSkZGU19QUk9DX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KRkZTMl9GUz15CiBDT05GSUdfSkZGUzJfRlNfREVCVUc9MAotIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CiAjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKIENPTkZJR19KRkZTMl9aTElCPXkKIENPTkZJR19KRkZTMl9SVElNRT15CkBAIC04MzUsNiArODc1LDcgQEAKICMgQ09ORklHX05GU0QgaXMgbm90IHNldAogQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19MT0NLRD15CitDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKQEAgLTkyMCw2ICs5NjEsNyBAQAogQ09ORklHX0RFQlVHX0tFUk5FTD15CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNgorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvY2FsbHMuUyBiL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCmluZGV4IDJiNmI0YzcuLjk0OWVjNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCkBAIC0xMCw3ICsxMCw3IEBACiAgKiAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIHR3aWNlIGluIGVudHJ5LWNvbW1vbi5TCiAgKi8KICNpZm5kZWYgTlJfc3lzY2FsbHMKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMzIwCisjZGVmaW5lIE5SX3N5c2NhbGxzIDMyOAogI2Vsc2UKIAogX19zeXNjYWxsX3N0YXJ0OgpAQCAtMjg0LDcgKzI4NCw3IEBACiAJCS5sb25nCXN5c19mc3RhdGZzNjQKIAkJLmxvbmcJc3lzX3Rna2lsbAogCQkubG9uZwlzeXNfdXRpbWVzCi0vKiAyNzAgKi8JLmxvbmcJc3lzX2ZhZHZpc2U2NF82NAorLyogMjcwICovCS5sb25nCXN5c19hcm1fZmFkdmlzZTY0XzY0X3dyYXBwZXIKIAkJLmxvbmcJc3lzX3BjaWNvbmZpZ19pb2Jhc2UKIAkJLmxvbmcJc3lzX3BjaWNvbmZpZ19yZWFkCiAJCS5sb25nCXN5c19wY2ljb25maWdfd3JpdGUKQEAgLTMzMyw2ICszMzMsOSBAQAogCQkubG9uZwlzeXNfaW5vdGlmeV9pbml0CiAJCS5sb25nCXN5c19pbm90aWZ5X2FkZF93YXRjaAogCQkubG9uZwlzeXNfaW5vdGlmeV9ybV93YXRjaAorCQkubG9uZwlzeXNfbWJpbmRfd3JhcHBlcgorLyogMzIwICovCS5sb25nCXN5c19nZXRfbWVtcG9saWN5CisJCS5sb25nCXN5c19zZXRfbWVtcG9saWN5CiBfX3N5c2NhbGxfZW5kOgogCiAJCS5yZXB0CU5SX3N5c2NhbGxzIC0gKF9fc3lzY2FsbF9lbmQgLSBfX3N5c2NhbGxfc3RhcnQpIC8gNApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMgYi9hcmNoL2FybS9rZXJuZWwvZWNhcmQuYwppbmRleCA2NTQwZGI2Li5kY2ViODI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZWNhcmQuYworKysgYi9hcmNoL2FybS9rZXJuZWwvZWNhcmQuYwpAQCAtNTg1LDcgKzU4NSw3IEBACiAKIAkJaWYgKHBlbmRpbmcpIHsKIAkJCXN0cnVjdCBpcnFkZXNjICpkID0gaXJxX2Rlc2MgKyBlYy0+aXJxOwotCQkJZC0+aGFuZGxlKGVjLT5pcnEsIGQsIHJlZ3MpOworCQkJZGVzY19oYW5kbGVfaXJxKGVjLT5pcnEsIGQsIHJlZ3MpOwogCQkJY2FsbGVkICsrOwogCQl9CiAJfQpAQCAtNjMyLDcgKzYzMiw3IEBACiAJCQkgKiBTZXJpYWwgY2FyZHMgc2hvdWxkIGdvIGluIDAvMSwgZXRoZXJuZXQvc2NzaSBpbiAyLzMKIAkJCSAqIG90aGVyd2lzZSB5b3Ugd2lsbCBsb3NlIHNlcmlhbCBkYXRhIGF0IGhpZ2ggc3BlZWRzIQogCQkJICovCi0JCQlkLT5oYW5kbGUoZWMtPmlycSwgZCwgcmVncyk7CisJCQlkZXNjX2hhbmRsZV9pcnEoZWMtPmlycSwgZCwgcmVncyk7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYXJkJWQ6IGludGVycnVwdCBmcm9tIHVuY2xhaW1lZCAiCiAJCQkgICAgICAgImNhcmQ/Pz9cbiIsIHNsb3QpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TCmluZGV4IDNmOGQwZTMuLmRiMzAyYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUworKysgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMKQEAgLTI2NSw2ICsyNjUsMTQgQEAKIAkJc3RyCXI1LCBbc3AsICM0XQkJQCBwdXNoIHNpeHRoIGFyZwogCQliCXN5c19mdXRleAogCitzeXNfYXJtX2ZhZHZpc2U2NF82NF93cmFwcGVyOgorCQlzdHIJcjUsIFtzcCwgIzRdCQlAIHB1c2ggcjUgdG8gc3RhY2sKKwkJYglzeXNfYXJtX2ZhZHZpc2U2NF82NAorCitzeXNfbWJpbmRfd3JhcHBlcjoKKwkJc3RyCXI1LCBbc3AsICM0XQorCQliCXN5c19tYmluZAorCiAvKgogICogTm90ZTogb2ZmXzRrIChyNSkgaXMgYWx3YXlzIHVuaXRzIG9mIDRLLiAgSWYgd2UgY2FuJ3QgZG8gdGhlIHJlcXVlc3RlZAogICogb2Zmc2V0LCB3ZSByZXR1cm4gRUlOVkFMLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWhlYWRlci5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWhlYWRlci5TCmluZGV4IGFmZWYyMTIuLjY0OGNmZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1oZWFkZXIuUworKysgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktaGVhZGVyLlMKQEAgLTMsNyArMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogCiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2hlYWQuUyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKaW5kZXggMTE1NWNmMC4uNTM5NjI2MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2hlYWQuUworKysgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2lycS5jIGIvYXJjaC9hcm0va2VybmVsL2lycS5jCmluZGV4IDM5NTEzN2EuLjMyODQxMTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2FybS9rZXJuZWwvaXJxLmMKQEAgLTIwNyw4ICsyMDcsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOwotCWlmIChkZXNjLT5jaGlwLT53YWtlKQotCQlkZXNjLT5jaGlwLT53YWtlKGlycSwgMSk7CisJaWYgKGRlc2MtPmNoaXAtPnNldF93YWtlKQorCQlkZXNjLT5jaGlwLT5zZXRfd2FrZShpcnEsIDEpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woZW5hYmxlX2lycV93YWtlKTsKQEAgLTIxOSw4ICsyMTksOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOwotCWlmIChkZXNjLT5jaGlwLT53YWtlKQotCQlkZXNjLT5jaGlwLT53YWtlKGlycSwgMCk7CisJaWYgKGRlc2MtPmNoaXAtPnNldF93YWtlKQorCQlkZXNjLT5jaGlwLT5zZXRfd2FrZShpcnEsIDApOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woZGlzYWJsZV9pcnFfd2FrZSk7CkBAIC01MTcsNyArNTE3LDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIG4sICZoZWFkKSB7CiAJCQlkZXNjID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgaXJxZGVzYywgcGVuZCk7CiAJCQlsaXN0X2RlbF9pbml0KCZkZXNjLT5wZW5kKTsKLQkJCWRlc2MtPmhhbmRsZShkZXNjIC0gaXJxX2Rlc2MsIGRlc2MsIHJlZ3MpOworCQkJZGVzY19oYW5kbGVfaXJxKGRlc2MgLSBpcnFfZGVzYywgZGVzYywgcmVncyk7CiAJCX0KIAogCQkvKgpAQCAtNTQ1LDcgKzU0NSw3IEBACiAKIAlpcnFfZW50ZXIoKTsKIAlzcGluX2xvY2soJmlycV9jb250cm9sbGVyX2xvY2spOwotCWRlc2MtPmhhbmRsZShpcnEsIGRlc2MsIHJlZ3MpOworCWRlc2NfaGFuZGxlX2lycShpcnEsIGRlc2MsIHJlZ3MpOwogCiAJLyoKIAkgKiBOb3cgcmUtcnVuIGFueSBwZW5kaW5nIGludGVycnVwdHMuCkBAIC02MjQsOSArNjI0LDkgQEAKIAl9CiAKIAlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0JaWYgKGRlc2MtPmNoaXAtPnR5cGUpIHsKKwlpZiAoZGVzYy0+Y2hpcC0+c2V0X3R5cGUpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKLQkJcmV0ID0gZGVzYy0+Y2hpcC0+dHlwZShpcnEsIHR5cGUpOworCQlyZXQgPSBkZXNjLT5jaGlwLT5zZXRfdHlwZShpcnEsIHR5cGUpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7CiAJfQogCkBAIC04NDYsOCArODQ2LDggQEAKIAogCQlpcnFfZGVzY1tpXS5wcm9iaW5nID0gMTsKIAkJaXJxX2Rlc2NbaV0udHJpZ2dlcmVkID0gMDsKLQkJaWYgKGlycV9kZXNjW2ldLmNoaXAtPnR5cGUpCi0JCQlpcnFfZGVzY1tpXS5jaGlwLT50eXBlKGksIElSUVRfUFJPQkUpOworCQlpZiAoaXJxX2Rlc2NbaV0uY2hpcC0+c2V0X3R5cGUpCisJCQlpcnFfZGVzY1tpXS5jaGlwLT5zZXRfdHlwZShpLCBJUlFUX1BST0JFKTsKIAkJaXJxX2Rlc2NbaV0uY2hpcC0+dW5tYXNrKGkpOwogCQlpcnFzICs9IDE7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2l3bW14dC5TIGIvYXJjaC9hcm0va2VybmVsL2l3bW14dC5TCmluZGV4IDhmNzRlMjQuLjI0YzdiMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9pd21teHQuUworKysgYi9hcmNoL2FybS9rZXJuZWwvaXdtbXh0LlMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogI2RlZmluZSBNTVhfV1IwCQkgCSgweDAwKQogI2RlZmluZSBNTVhfV1IxCQkgCSgweDA4KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCmluZGV4IGIyMDg1NzMuLjgyNjE2NDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogCSAqIFdlIG5lZWQgdG8gdGVsbCB0aGUgc2Vjb25kYXJ5IGNvcmUgd2hlcmUgdG8gZmluZAogCSAqIGl0cyBzdGFjayBhbmQgdGhlIHBhZ2UgdGFibGVzLgogCSAqLwotCXNlY29uZGFyeV9kYXRhLnN0YWNrID0gKHZvaWQgKilpZGxlLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFIC0gODsKKwlzZWNvbmRhcnlfZGF0YS5zdGFjayA9ICh2b2lkICopaWRsZS0+dGhyZWFkX2luZm8gKyBUSFJFQURfU1RBUlRfU1A7CiAJc2Vjb25kYXJ5X2RhdGEucGdkaXIgPSB2aXJ0X3RvX3BoeXMocGdkKTsKIAl3bWIoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYyBiL2FyY2gvYXJtL2tlcm5lbC9zeXNfYXJtLmMKaW5kZXggZjg5N2NlMi4uNDI2MjlmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYworKysgYi9hcmNoL2FybS9rZXJuZWwvc3lzX2FybS5jCkBAIC0zMTEsMyArMzExLDEzIEBACiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woZXhlY3ZlKTsKKworLyoKKyAqIFNpbmNlIGxvZmZfdCBpcyBhIDY0IGJpdCB0eXBlIHdlIGF2b2lkIGEgbG90IG9mIEFCSSBoYXN0bGUKKyAqIHdpdGggYSBkaWZmZXJlbnQgYXJndW1lbnQgb3JkZXJpbmcuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfYXJtX2ZhZHZpc2U2NF82NChpbnQgZmQsIGludCBhZHZpY2UsCisJCQkJICAgICBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKQoreworCXJldHVybiBzeXNfZmFkdmlzZTY0XzY0KGZkLCBvZmZzZXQsIGxlbiwgYWR2aWNlKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMgYi9hcmNoL2FybS9rZXJuZWwvdGltZS5jCmluZGV4IDFiN2ZjZDUuLjY5NDQ5YTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RpbWUuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBkb19zZXRfcnRjKHZvaWQpCiB7Ci0JaWYgKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQyB8fCBzZXRfcnRjID09IE5VTEwpCisJaWYgKCFudHBfc3luY2VkKCkgfHwgc2V0X3J0YyA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlpZiAobmV4dF9ydGNfdXBkYXRlICYmCkBAIC0yOTIsMTAgKzI5Miw3IEBACiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOwogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOwogCi0JdGltZV9hZGp1c3QgPSAwOwkJLyogc3RvcCBhY3RpdmUgYWRqdGltZSgpICovCi0JdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJbnRwX2NsZWFyKCk7CiAJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CiAJY2xvY2tfd2FzX3NldCgpOwogCXJldHVybiAwOwpAQCAtNDMzLDEwICs0MzAsMTIgQEAKIHsKIAlzdHJ1Y3QgZHluX3RpY2tfdGltZXIgKmR5bl90aWNrID0gc3lzdGVtX3RpbWVyLT5keW5fdGljazsKIAotCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwotCWlmIChkeW5fdGljay0+c3RhdGUgJiBEWU5fVElDS19FTkFCTEVEKQotCQlkeW5fdGljay0+cmVwcm9ncmFtKG5leHRfdGltZXJfaW50ZXJydXB0KCkgLSBqaWZmaWVzKTsKLQl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCWlmIChkeW5fdGljaykgeworCQl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKwkJaWYgKGR5bl90aWNrLT5zdGF0ZSAmIERZTl9USUNLX0VOQUJMRUQpCisJCQlkeW5fdGljay0+cmVwcm9ncmFtKG5leHRfdGltZXJfaW50ZXJydXB0KCkgLSBqaWZmaWVzKTsKKwkJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwl9CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHRpbWVyX3Nob3dfZHluX3RpY2soc3RydWN0IHN5c19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2NvcHlfcGFnZS5TIGIvYXJjaC9hcm0vbGliL2NvcHlfcGFnZS5TCmluZGV4IDRjMzhhYmQuLjY4MTE3OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jb3B5X3BhZ2UuUworKysgYi9hcmNoL2FybS9saWIvY29weV9wYWdlLlMKQEAgLTExLDcgKzExLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjZGVmaW5lIENPUFlfQ09VTlQgKFBBR0VfU1ovNjQgUExEKCAtMSApKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUwppbmRleCA0NmEyZGM5Li4zMzNiY2EyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TCisrKyBiL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHl1c2VyLlMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCQkudGV4dAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvZ2V0dXNlci5TIGIvYXJjaC9hcm0vbGliL2dldHVzZXIuUwppbmRleCA2NGFhNmY0Li5kMjA0MDE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvZ2V0dXNlci5TCisrKyBiL2FyY2gvYXJtL2xpYi9nZXR1c2VyLlMKQEAgLTI2LDcgKzI2LDcgQEAKICAqIE5vdGUgdGhhdCBBRERSX0xJTUlUIGlzIGVpdGhlciAwIG9yIDB4YzAwMDAwMDAuCiAgKiBOb3RlIGFsc28gdGhhdCBpdCBpcyBpbnRlbmRlZCB0aGF0IF9fZ2V0X3VzZXJfYmFkIGlzIG5vdCBnbG9iYWwuCiAgKi8KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9wdXR1c2VyLlMgYi9hcmNoL2FybS9saWIvcHV0dXNlci5TCmluZGV4IGIwOTM5OGQuLjQ1OTNlOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9wdXR1c2VyLlMKKysrIGIvYXJjaC9hcm0vbGliL3B1dHVzZXIuUwpAQCAtMjYsNyArMjYsNyBAQAogICogTm90ZSB0aGF0IEFERFJfTElNSVQgaXMgZWl0aGVyIDAgb3IgMHhjMDAwMDAwMAogICogTm90ZSBhbHNvIHRoYXQgaXQgaXMgaW50ZW5kZWQgdGhhdCBfX3B1dF91c2VyX2JhZCBpcyBub3QgZ2xvYmFsLgogICovCi0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvY29yZS5jCmluZGV4IDExMmYxZDY4Li5lMjE2YWI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYwpAQCAtMzU0LDcgKzM1NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDAsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCiAJLmRldgkJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYwppbmRleCAyM2M0ZGExLi41YWVhZGZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMKQEAgLTIxOSw3ICsyMTksNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAwLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9hcmNoLmMgYi9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYwppbmRleCA3ZGFhMDIxLi40NGM1NjU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYworKysgYi9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYwpAQCAtNTIsNyArNTIsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAwLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvS2NvbmZpZwppbmRleCAzMjRkOWVkLi5iZGQyNTc5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvS2NvbmZpZwpAQCAtODcsNiArODcsNyBAQAogCiAjIEVCU0EyODUgYm9hcmQgaW4gZWl0aGVyIGhvc3Qgb3IgYWRkaW4gbW9kZQogY29uZmlnIEFSQ0hfRUJTQTI4NQorCXNlbGVjdCBBUkNIX01BWV9IQVZFX1BDX0ZEQwogCWJvb2wKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLWlycS5jCmluZGV4IGIyMTAxNjAuLmUxYzQzYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS1pcnEuYwpAQCAtOTUsNyArOTUsNyBAQAogCX0KIAogCWRlc2MgPSBpcnFfZGVzYyArIGlzYV9pcnE7Ci0JZGVzYy0+aGFuZGxlKGlzYV9pcnEsIGRlc2MsIHJlZ3MpOworCWRlc2NfaGFuZGxlX2lycShpc2FfaXJxLCBkZXNjLCByZWdzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxX2Nhc2NhZGUgPSB7IC5oYW5kbGVyID0gbm9fYWN0aW9uLCAubmFtZSA9ICJjYXNjYWRlIiwgfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EuYwppbmRleCBhYTNhMWZlLi4yODg0NmM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS5jCkBAIC0zNCw3ICszNCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDAsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCiAJLmRldgkJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jb21tb24uYwppbmRleCA5NmFhM2FmLi41MTEwZTJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWg3MjB4L2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvY29tbW9uLmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogCXdoaWxlIChtYXNrKSB7CiAJCWlmIChtYXNrICYgMSkgewogCQkJSVJRREJHKCJoYW5kbGluZyBpcnEgJWRcbiIsIGlycSk7Ci0JCQlkZXNjLT5oYW5kbGUoaXJxLCBkZXNjLCByZWdzKTsKKwkJCWRlc2NfaGFuZGxlX2lycShpcnEsIGRlc2MsIHJlZ3MpOwogCQl9CiAJCWlycSsrOwogCQlkZXNjKys7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMi5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDIuYwppbmRleCA1OTNiNmEyLi5hNGE3YzAxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvY3B1LWg3MjAyLmMKQEAgLTkwLDcgKzkwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKIAkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJCT0gMCwKKwkuaWQJCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKIAkuZGV2CQkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCiAJfSwKQEAgLTEyNiw3ICsxMjYsNyBAQAogCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKIAl3aGlsZSAobWFzaykgewogCQlpZiAobWFzayAmIDEpCi0JCQlkZXNjLT5oYW5kbGUoaXJxLCBkZXNjLCByZWdzKTsKKwkJCWRlc2NfaGFuZGxlX2lycShpcnEsIGRlc2MsIHJlZ3MpOwogCQlpcnErKzsKIAkJZGVzYysrOwogCQltYXNrID4+PSAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvaXJxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9pcnEuYwppbmRleCAwYzI3MTM0Li5lZWI4YTZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9pcnEuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJd2hpbGUgKG1hc2spIHsKIAkJaWYgKG1hc2sgJiAxKSB7CiAJCQlERUJVR19JUlEoImhhbmRsaW5nIGlycSAlZFxuIiwgaXJxKTsKLQkJCWRlc2MtPmhhbmRsZShpcnEsIGRlc2MsIHJlZ3MpOworCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYywgcmVncyk7CiAJCX0KIAkJaXJxKys7CiAJCWRlc2MrKzsKQEAgLTIxNCw3ICsyMTQsNyBAQAogCS5hY2sgPSBpbXhfZ3Bpb19hY2tfaXJxLAogCS5tYXNrID0gaW14X2dwaW9fbWFza19pcnEsCiAJLnVubWFzayA9IGlteF9ncGlvX3VubWFza19pcnEsCi0JLnR5cGUgPSBpbXhfZ3Bpb19pcnFfdHlwZSwKKwkuc2V0X3R5cGUgPSBpbXhfZ3Bpb19pcnFfdHlwZSwKIH07CiAKIHZvaWQgX19pbml0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYwppbmRleCA1NjlmMzI4Li4yYmU1YzAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQlpcnEgKz0gSVJRX1NJQ19TVEFSVDsKIAogCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0JCWRlc2MtPmhhbmRsZShpcnEsIGRlc2MsIHJlZ3MpOworCQlkZXNjX2hhbmRsZV9pcnEoaXJxLCBkZXNjLCByZWdzKTsKIAl9IHdoaWxlIChzdGF0dXMpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXRpbWUuYwppbmRleCBkNTNhZjE2Li4wMDM5NzkzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS10aW1lLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAkvKgogCSAqIE5vdyBjb252ZXJ0IHRoZW0gdG8gdXNlYy4KIAkgKi8KLQl1c2VjID0gKHVuc2lnbmVkIGxvbmcpKGVsYXBzZWQgKiAodGlja19uc2VjIC8gMTAwMCkpIC8gTEFUQ0g7CisJdXNlYyA9ICh1bnNpZ25lZCBsb25nKShlbGFwc2VkIC8gKENMT0NLX1RJQ0tfUkFURS8xMDAwMDAwKSk7CiAKIAlyZXR1cm4gdXNlYzsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS10aW1lLmMgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMzEtdGltZS5jCmluZGV4IDFhNmQ5ZDYuLjhlZGRmYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS10aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXRpbWUuYwpAQCAtNTgsNyArNTgsNyBAQAogCS8qCiAJICogTm93IGNvbnZlcnQgdGhlbSB0byB1c2VjLgogCSAqLwotCXVzZWMgPSAodW5zaWduZWQgbG9uZykoZWxhcHNlZCAqICh0aWNrX25zZWMgLyAxMDAwKSkgLyBMQVRDSDsKKwl1c2VjID0gKHVuc2lnbmVkIGxvbmcpKGVsYXBzZWQgLyAoQ0xPQ0tfVElDS19SQVRFLzEwMDAwMDApKTsKIAogCXJldHVybiB1c2VjOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMKaW5kZXggNDViMTg2NS4uNzRiZDJmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCkBAIC0xNzQsNyArMTc0LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaXhwMjAwMF9zZXJpYWxfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCT0gMCwKKwkuaWQJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCS5kZXYJCT0gewogCQkucGxhdGZvcm1fZGF0YQkJPSBpeHAyMDAwX3NlcmlhbF9wb3J0LAogCX0sCkBAIC0zMTcsNyArMzE3LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDw9IDc7IGkrKykgewogCQlpZiAoc3RhdHVzICYgKDE8PGkpKSB7CiAJCQlkZXNjID0gaXJxX2Rlc2MgKyBpICsgSVJRX0lYUDIwMDBfR1BJTzA7Ci0JCQlkZXNjLT5oYW5kbGUoaSArIElSUV9JWFAyMDAwX0dQSU8wLCBkZXNjLCByZWdzKTsKKwkJCWRlc2NfaGFuZGxlX2lycShpICsgSVJRX0lYUDIwMDBfR1BJTzAsIGRlc2MsIHJlZ3MpOwogCQl9CiAJfQogfQpAQCAtMzgwLDEwICszODAsMTAgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFjaGlwIGl4cDIwMDBfR1BJT19pcnFfY2hpcCA9IHsKLQkudHlwZQk9IGl4cDIwMDBfR1BJT19pcnFfdHlwZSwKLQkuYWNrCT0gaXhwMjAwMF9HUElPX2lycV9tYXNrX2FjaywKLQkubWFzawk9IGl4cDIwMDBfR1BJT19pcnFfbWFzaywKLQkudW5tYXNrCT0gaXhwMjAwMF9HUElPX2lycV91bm1hc2sKKwkuYWNrCQk9IGl4cDIwMDBfR1BJT19pcnFfbWFza19hY2ssCisJLm1hc2sJCT0gaXhwMjAwMF9HUElPX2lycV9tYXNrLAorCS51bm1hc2sJCT0gaXhwMjAwMF9HUElPX2lycV91bm1hc2ssCisJLnNldF90eXBlCT0gaXhwMjAwMF9HUElPX2lycV90eXBlLAogfTsKIAogc3RhdGljIHZvaWQgaXhwMjAwMF9wY2lfaXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAwLmMKaW5kZXggYTQzMzY5YS4uNjNiYTAxOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAwLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQkJc3RydWN0IGlycWRlc2MgKmNwbGRfZGVzYzsKIAkJCWludCBjcGxkX2lycSA9IElYUDIwMDBfQk9BUkRfSVJRKDApICsgaTsKIAkJCWNwbGRfZGVzYyA9IGlycV9kZXNjICsgY3BsZF9pcnE7Ci0JCQljcGxkX2Rlc2MtPmhhbmRsZShjcGxkX2lycSwgY3BsZF9kZXNjLCByZWdzKTsKKwkJCWRlc2NfaGFuZGxlX2lycShjcGxkX2lycSwgY3BsZF9kZXNjLCByZWdzKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYwppbmRleCA0MzQ0N2RhLi43YTUxMDk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYwpAQCAtODIsNyArODIsNyBAQAogCQkJc3RydWN0IGlycWRlc2MgKmNwbGRfZGVzYzsKIAkJCWludCBjcGxkX2lycSA9IElYUDIwMDBfQk9BUkRfSVJRKDApICsgaTsKIAkJCWNwbGRfZGVzYyA9IGlycV9kZXNjICsgY3BsZF9pcnE7Ci0JCQljcGxkX2Rlc2MtPmhhbmRsZShjcGxkX2lycSwgY3BsZF9kZXNjLCByZWdzKTsKKwkJCWRlc2NfaGFuZGxlX2lycShjcGxkX2lycSwgY3BsZF9kZXNjLCByZWdzKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYwppbmRleCAwNDQ5MGE5Li41MmFkMTEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYwpAQCAtMzgsOTAgKzM4LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKLWVudW0gaXhwNHh4X2lycV90eXBlIHsKLQlJWFA0WFhfSVJRX0xFVkVMLCBJWFA0WFhfSVJRX0VER0UKLX07Ci1zdGF0aWMgdm9pZCBpeHA0eHhfY29uZmlnX2lycSh1bnNpZ25lZCBpcnEsIGVudW0gaXhwNHh4X2lycV90eXBlIHR5cGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogR1BJTyBhY2NlcyBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29uZmlndXJlIEdQSU8gbGluZSBmb3IgaW5wdXQsIGludGVycnVwdCwgb3Igb3V0cHV0IG9wZXJhdGlvbgotICoKLSAqIFRPRE86IEVuYWJsZS9kaXNhYmxlIHRoZSBpcnFfZGVzYyBiYXNlZCBvbiBpbnRlcnJ1cHQgb3Igb3V0cHV0IG1vZGUuCi0gKiBUT0RPOiBTaG91bGQgdGhlc2UgYmUgbmFtZWQgaXhwNHh4X2dwaW9fPwotICovCi12b2lkIGdwaW9fbGluZV9jb25maWcodTggbGluZSwgdTMyIHN0eWxlKQotewotCXN0YXRpYyBjb25zdCBpbnQgZ3BpbzJpcnFbXSA9IHsKLQkJNiwgNywgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5Ci0JfTsKLQl1MzIgZW5hYmxlOwotCXZvbGF0aWxlIHUzMiAqaW50X3JlZzsKLQl1MzIgaW50X3N0eWxlOwotCWVudW0gaXhwNHh4X2lycV90eXBlIGlycV90eXBlOwotCi0JZW5hYmxlID0gKklYUDRYWF9HUElPX0dQT0VSOwotCi0JaWYgKHN0eWxlICYgSVhQNFhYX0dQSU9fT1VUKSB7Ci0JCWVuYWJsZSAmPSB+KCgxKSA8PCBsaW5lKTsKLQl9IGVsc2UgaWYgKHN0eWxlICYgSVhQNFhYX0dQSU9fSU4pIHsKLQkJZW5hYmxlIHw9ICgoMSkgPDwgbGluZSk7Ci0KLQkJc3dpdGNoIChzdHlsZSAmIElYUDRYWF9HUElPX0lOVFNUWUxFX01BU0spCi0JCXsKLQkJY2FzZSAoSVhQNFhYX0dQSU9fQUNUSVZFX0hJR0gpOgotCQkJaW50X3N0eWxlID0gSVhQNFhYX0dQSU9fU1RZTEVfQUNUSVZFX0hJR0g7Ci0JCQlpcnFfdHlwZSA9IElYUDRYWF9JUlFfTEVWRUw7Ci0JCQlicmVhazsKLQkJY2FzZSAoSVhQNFhYX0dQSU9fQUNUSVZFX0xPVyk6Ci0JCQlpbnRfc3R5bGUgPSBJWFA0WFhfR1BJT19TVFlMRV9BQ1RJVkVfTE9XOwotCQkJaXJxX3R5cGUgPSBJWFA0WFhfSVJRX0xFVkVMOwotCQkJYnJlYWs7Ci0JCWNhc2UgKElYUDRYWF9HUElPX1JJU0lOR19FREdFKToKLQkJCWludF9zdHlsZSA9IElYUDRYWF9HUElPX1NUWUxFX1JJU0lOR19FREdFOwotCQkJaXJxX3R5cGUgPSBJWFA0WFhfSVJRX0VER0U7Ci0JCQlicmVhazsKLQkJY2FzZSAoSVhQNFhYX0dQSU9fRkFMTElOR19FREdFKToKLQkJCWludF9zdHlsZSA9IElYUDRYWF9HUElPX1NUWUxFX0ZBTExJTkdfRURHRTsKLQkJCWlycV90eXBlID0gSVhQNFhYX0lSUV9FREdFOwotCQkJYnJlYWs7Ci0JCWNhc2UgKElYUDRYWF9HUElPX1RSQU5TSVRJT05BTCk6Ci0JCQlpbnRfc3R5bGUgPSBJWFA0WFhfR1BJT19TVFlMRV9UUkFOU0lUSU9OQUw7Ci0JCQlpcnFfdHlwZSA9IElYUDRYWF9JUlFfRURHRTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaW50X3N0eWxlID0gSVhQNFhYX0dQSU9fU1RZTEVfQUNUSVZFX0hJR0g7Ci0JCQlpcnFfdHlwZSA9IElYUDRYWF9JUlFfTEVWRUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChzdHlsZSAmIElYUDRYWF9HUElPX0lOVFNUWUxFX01BU0spCi0JCQlpeHA0eHhfY29uZmlnX2lycShncGlvMmlycVtsaW5lXSwgaXJxX3R5cGUpOwotCi0JCWlmIChsaW5lID49IDgpIHsJLyogcGlucyA4LTE1ICovIAotCQkJbGluZSAtPSA4OwotCQkJaW50X3JlZyA9IElYUDRYWF9HUElPX0dQSVQyUjsKLQkJfQotCQllbHNlIHsJCQkvKiBwaW5zIDAtNyAqLwotCQkJaW50X3JlZyA9IElYUDRYWF9HUElPX0dQSVQxUjsKLQkJfQotCi0JCS8qIENsZWFyIHRoZSBzdHlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIHBpbiAqLwotCQkqaW50X3JlZyAmPSB+KElYUDRYWF9HUElPX1NUWUxFX0NMRUFSIDw8IAotCQkgICAgCQkobGluZSAqIElYUDRYWF9HUElPX1NUWUxFX1NJWkUpKTsKLQotCQkvKiBTZXQgdGhlIG5ldyBzdHlsZSAqLwotCQkqaW50X3JlZyB8PSAoaW50X3N0eWxlIDw8IChsaW5lICogSVhQNFhYX0dQSU9fU1RZTEVfU0laRSkpOwotCX0KLQotCSpJWFA0WFhfR1BJT19HUE9FUiA9IGVuYWJsZTsKLX0KLQotRVhQT1JUX1NZTUJPTChncGlvX2xpbmVfY29uZmlnKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElYUDR4eCBjaGlwc2V0IEkvTyBtYXBwaW5nCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE2NSw2ICs4MSw2OSBAQAogICogICAgICAgKGJlIGl0IFBDSSBvciBzb21ldGhpbmcgZWxzZSkgY29uZmlndXJlcyB0aGF0IEdQSU8gbGluZQogICogICAgICAgYXMgYW4gSVJRLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZW51bSBpeHA0eHhfaXJxX3R5cGUgeworCUlYUDRYWF9JUlFfTEVWRUwsIElYUDRYWF9JUlFfRURHRQorfTsKKworc3RhdGljIHZvaWQgaXhwNHh4X2NvbmZpZ19pcnEodW5zaWduZWQgaXJxLCBlbnVtIGl4cDR4eF9pcnFfdHlwZSB0eXBlKTsKKworLyoKKyAqIElSUSAtPiBHUElPIG1hcHBpbmcgdGFibGUKKyAqLworc3RhdGljIGludCBpcnEyZ3Bpb1szMl0gPSB7CisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgIDAsICAxLAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwktMSwgLTEsIC0xLCAgMiwgIDMsICA0LCAgNSwgIDYsCisJIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgLTEsIC0xLAorfTsKKworc3RhdGljIGludCBpeHA0eHhfc2V0X2lycV90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQoreworCWludCBsaW5lID0gaXJxMmdwaW9baXJxXTsKKwl1MzIgaW50X3N0eWxlOworCWVudW0gaXhwNHh4X2lycV90eXBlIGlycV90eXBlOworCXZvbGF0aWxlIHUzMiAqaW50X3JlZzsKKworCS8qCisJICogT25seSBmb3IgR1BJTyBJUlFzCisJICovCisJaWYgKGxpbmUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0eXBlICYgSVJRVF9CT1RIRURHRSkgeworCQlpbnRfc3R5bGUgPSBJWFA0WFhfR1BJT19TVFlMRV9UUkFOU0lUSU9OQUw7CisJCWlycV90eXBlID0gSVhQNFhYX0lSUV9FREdFOworCX0gZWxzZSAgaWYgKHR5cGUgJiBJUlFUX1JJU0lORykgeworCQlpbnRfc3R5bGUgPSBJWFA0WFhfR1BJT19TVFlMRV9SSVNJTkdfRURHRTsKKwkJaXJxX3R5cGUgPSBJWFA0WFhfSVJRX0VER0U7CisJfSBlbHNlIGlmICh0eXBlICYgSVJRVF9GQUxMSU5HKSB7CisJCWludF9zdHlsZSA9IElYUDRYWF9HUElPX1NUWUxFX0ZBTExJTkdfRURHRTsKKwkJaXJxX3R5cGUgPSBJWFA0WFhfSVJRX0VER0U7CisJfSBlbHNlIGlmICh0eXBlICYgSVJRVF9ISUdIKSB7CisJCWludF9zdHlsZSA9IElYUDRYWF9HUElPX1NUWUxFX0FDVElWRV9ISUdIOworCQlpcnFfdHlwZSA9IElYUDRYWF9JUlFfTEVWRUw7CisJfSBlbHNlIGlmICh0eXBlICYgSVJRVF9MT1cpIHsKKwkJaW50X3N0eWxlID0gSVhQNFhYX0dQSU9fU1RZTEVfQUNUSVZFX0xPVzsKKwkJaXJxX3R5cGUgPSBJWFA0WFhfSVJRX0xFVkVMOworCX0KKworCWl4cDR4eF9jb25maWdfaXJxKGlycSwgaXJxX3R5cGUpOworCisJaWYgKGxpbmUgPj0gOCkgewkvKiBwaW5zIDgtMTUgKi8KKwkJbGluZSAtPSA4OworCQlpbnRfcmVnID0gSVhQNFhYX0dQSU9fR1BJVDJSOworCX0gZWxzZSB7CQkvKiBwaW5zIDAtNyAqLworCQlpbnRfcmVnID0gSVhQNFhYX0dQSU9fR1BJVDFSOworCX0KKworCS8qIENsZWFyIHRoZSBzdHlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIHBpbiAqLworCSppbnRfcmVnICY9IH4oSVhQNFhYX0dQSU9fU1RZTEVfQ0xFQVIgPDwKKwkgICAgCQkobGluZSAqIElYUDRYWF9HUElPX1NUWUxFX1NJWkUpKTsKKworCS8qIFNldCB0aGUgbmV3IHN0eWxlICovCisJKmludF9yZWcgfD0gKGludF9zdHlsZSA8PCAobGluZSAqIElYUDRYWF9HUElPX1NUWUxFX1NJWkUpKTsKK30KKwogc3RhdGljIHZvaWQgaXhwNHh4X2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWYgKGNwdV9pc19peHA0NngoKSAmJiBpcnEgPj0gMzIpCkBAIC0xODMsMTIgKzE2Miw2IEBACiAKIHN0YXRpYyB2b2lkIGl4cDR4eF9pcnFfYWNrKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jc3RhdGljIGludCBpcnEyZ3Bpb1szMl0gPSB7Ci0JCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsICAwLCAgMSwKLQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotCQktMSwgLTEsIC0xLCAgMiwgIDMsICA0LCAgNSwgIDYsCi0JCSA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIC0xLCAtMSwKLQl9OwogCWludCBsaW5lID0gKGlycSA8IDMyKSA/IGlycTJncGlvW2lycV0gOiAtMTsKIAogCWlmIChsaW5lID49IDApCkBAIC0yMDYsMTUgKzE3OSwxNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycWNoaXAgaXhwNHh4X2lycV9sZXZlbF9jaGlwID0gewotCS5hY2sJPSBpeHA0eHhfaXJxX21hc2ssCi0JLm1hc2sJPSBpeHA0eHhfaXJxX21hc2ssCi0JLnVubWFzawk9IGl4cDR4eF9pcnFfbGV2ZWxfdW5tYXNrLAorCS5hY2sJCT0gaXhwNHh4X2lycV9tYXNrLAorCS5tYXNrCQk9IGl4cDR4eF9pcnFfbWFzaywKKwkudW5tYXNrCQk9IGl4cDR4eF9pcnFfbGV2ZWxfdW5tYXNrLAorCS5zZXRfdHlwZQk9IGl4cDR4eF9zZXRfaXJxX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycWNoaXAgaXhwNHh4X2lycV9lZGdlX2NoaXAgPSB7Ci0JLmFjawk9IGl4cDR4eF9pcnFfYWNrLAotCS5tYXNrCT0gaXhwNHh4X2lycV9tYXNrLAotCS51bm1hc2sJPSBpeHA0eHhfaXJxX3VubWFzaywKKwkuYWNrCQk9IGl4cDR4eF9pcnFfYWNrLAorCS5tYXNrCQk9IGl4cDR4eF9pcnFfbWFzaywKKwkudW5tYXNrCQk9IGl4cDR4eF9pcnFfdW5tYXNrLAorCS5zZXRfdHlwZQk9IGl4cDR4eF9zZXRfaXJxX3R5cGUsCiB9OwogCiBzdGF0aWMgdm9pZCBpeHA0eHhfY29uZmlnX2lycSh1bnNpZ25lZCBpcnEsIGVudW0gaXhwNHh4X2lycV90eXBlIHR5cGUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtcGNpLmMKaW5kZXggYWZhZmI0Mi4uNjBkZThhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1wY2kuYwpAQCAtMzAsMTEgKzMwLDggQEAKIAogdm9pZCBfX2luaXQgY295b3RlX3BjaV9wcmVpbml0KHZvaWQpCiB7Ci0JZ3Bpb19saW5lX2NvbmZpZyhDT1lPVEVfUENJX1NMT1QwX1BJTiwKLQkJCUlYUDRYWF9HUElPX0lOIHwgSVhQNFhYX0dQSU9fQUNUSVZFX0xPVyk7Ci0KLQlncGlvX2xpbmVfY29uZmlnKENPWU9URV9QQ0lfU0xPVDFfUElOLAotCQkJSVhQNFhYX0dQSU9fSU4gfCBJWFA0WFhfR1BJT19BQ1RJVkVfTE9XKTsKKwlzZXRfaXJxX3R5cGUoSVJRX0NPWU9URV9QQ0lfU0xPVDAsIElSUVRfTE9XKTsKKwlzZXRfaXJxX3R5cGUoSVJRX0NPWU9URV9QQ0lfU0xPVDEsIElSUVRfTE9XKTsKIAogCWdwaW9fbGluZV9pc3JfY2xlYXIoQ09ZT1RFX1BDSV9TTE9UMF9QSU4pOwogCWdwaW9fbGluZV9pc3JfY2xlYXIoQ09ZT1RFX1BDSV9TTE9UMV9QSU4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYwppbmRleCA0MTFlYTk5Li4wNTBjOTI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYwpAQCAtMjQsMTEgKzI0LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KIAotdm9pZCBfX2luaXQgY295b3RlX21hcF9pbyh2b2lkKQotewotCWl4cDR4eF9tYXBfaW8oKTsKLX0KLQogc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGNveW90ZV9mbGFzaF9kYXRhID0gewogCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAogCS53aWR0aAkJPSAyLApAQCAtNzEsNyArNjYsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3lvdGVfdWFydCA9IHsKIAkubmFtZQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQk9IDAsCisJLmlkCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKIAkuZGV2CQkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCT0gY295b3RlX3VhcnRfZGF0YSwKIAl9LApAQCAtMTA3LDcgKzEwMiw3IEBACiAJLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCiAJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCiAJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKLQkubWFwX2lvCQk9IGNveW90ZV9tYXBfaW8sCisJLm1hcF9pbwkJPSBpeHA0eHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKIAkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCkBAIC0xMjUsNyArMTIwLDcgQEAKIAkucGh5c19yYW0JPSBQSFlTX09GRlNFVCwKIAkucGh5c19pbwk9IElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKIAkuaW9fcGdfb2Zmc3QJPSAoKElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkgPj4gMTgpICYgMHhmZmZjLAotCS5tYXBfaW8JCT0gY295b3RlX21hcF9pbywKKwkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAogCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtcGNpLmMKaW5kZXggYjE4MDM1OC4uYTY2NDg0YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXBjaS5jCkBAIC0zNSwyNiArMzUsMjAgQEAKIGV4dGVybiBpbnQgaXhwNHh4X3NldHVwKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKTsKIGV4dGVybiBzdHJ1Y3QgcGNpX2J1cyAqaXhwNHh4X3NjYW5fYnVzKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKTsKIAotICAgICAgICAvKgotICAgICAgICAqIFRoZSBleGFjdCBHUElPIHBpbnMgYW5kIElSUXMgYXJlIGRlZmluZWQgaW4gYXJjaC1peHA0eHgvZ3R3eDU3MTUuaAotICAgICAgICAqIFNsb3QgMCBpc24ndCBhY3R1YWxseSBwb3B1bGF0ZWQgd2l0aCBhIGNhcmQgY29ubmVjdG9yIGJ1dAotICAgICAgICAqIHdlIGluaXRpYWxpemUgaXQgYW55d2F5IGluIGNhc2UgYSBmdXR1cmUgdmVyc2lvbiBoYXMgdGhlCi0gICAgICAgICogc2xvdCBwb3B1bGF0ZWQgb3Igc29tZW9uZSB3aXRoIGdvb2Qgc29sZGVyaW5nIHNraWxscyBoYXMKLSAgICAgICAgKiBzb21lIGZyZWUgdGltZS4KLSAgICAgICAgKi8KIAotCi1zdGF0aWMgdm9pZCBndHd4NTcxNV9pbml0X2dwaW8odTggcGluLCB1MzIgc3R5bGUpCi17Ci0JZ3Bpb19saW5lX2NvbmZpZyhwaW4sIHN0eWxlIHwgSVhQNFhYX0dQSU9fQUNUSVZFX0xPVyk7Ci0KLQlpZiAoc3R5bGUgJiBJWFA0WFhfR1BJT19JTikgZ3Bpb19saW5lX2lzcl9jbGVhcihwaW4pOwotfQotCisvKgorICogVGhlIGV4YWN0IEdQSU8gcGlucyBhbmQgSVJRcyBhcmUgZGVmaW5lZCBpbiBhcmNoLWl4cDR4eC9ndHd4NTcxNS5oCisgKiBTbG90IDAgaXNuJ3QgYWN0dWFsbHkgcG9wdWxhdGVkIHdpdGggYSBjYXJkIGNvbm5lY3RvciBidXQKKyAqIHdlIGluaXRpYWxpemUgaXQgYW55d2F5IGluIGNhc2UgYSBmdXR1cmUgdmVyc2lvbiBoYXMgdGhlCisgKiBzbG90IHBvcHVsYXRlZCBvciBzb21lb25lIHdpdGggZ29vZCBzb2xkZXJpbmcgc2tpbGxzIGhhcworICogc29tZSBmcmVlIHRpbWUuCisgKi8KIHZvaWQgX19pbml0IGd0d3g1NzE1X3BjaV9wcmVpbml0KHZvaWQpCiB7Ci0JZ3R3eDU3MTVfaW5pdF9ncGlvKEdUV1g1NzE1X1BDSV9TTE9UMF9JTlRBX0dQSU8sCUlYUDRYWF9HUElPX0lOKTsKLQlndHd4NTcxNV9pbml0X2dwaW8oR1RXWDU3MTVfUENJX1NMT1QxX0lOVEFfR1BJTywJSVhQNFhYX0dQSU9fSU4pOworCXNldF9pcnFfdHlwZShHVFdYNTcxNV9QQ0lfU0xPVDBfSU5UQV9JUlEsIElSUVRfTE9XKTsKKwlzZXRfaXJxX3R5cGUoR1RXWDU3MTVfUENJX1NMT1QwX0lOVEJfSVJRLCBJUlFUX0xPVyk7CisJc2V0X2lycV90eXBlKEdUV1g1NzE1X1BDSV9TTE9UMV9JTlRBX0lSUSwgSVJRVF9MT1cpOworCXNldF9pcnFfdHlwZShHVFdYNTcxNV9QQ0lfU0xPVDFfSU5UQl9JUlEsIElSUVRfTE9XKTsKIAogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMKaW5kZXggMzMzNDU5ZC4uMjlhNmQwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1zZXR1cC5jCkBAIC05Myw3ICs5Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGd0d3g1NzE1X3VhcnRfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCT0gMCwKKwkuaWQJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBndHd4NTcxNV91YXJ0X3BsYXRmb3JtX2RhdGEsCiAJfSwKQEAgLTEwMSwxMiArMTAxLDYgQEAKIAkucmVzb3VyY2UJPSBndHd4NTcxNV91YXJ0X3Jlc291cmNlcywKIH07CiAKLQotdm9pZCBfX2luaXQgZ3R3eDU3MTVfbWFwX2lvKHZvaWQpCi17Ci0JaXhwNHh4X21hcF9pbygpOwotfQotCiBzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgZ3R3eDU3MTVfZmxhc2hfZGF0YSA9IHsKIAkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKIAkud2lkdGgJCT0gMiwKQEAgLTE0NCw3ICsxMzgsNyBAQAogCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAogCS5waHlzX2lvCT0gSVhQNFhYX1VBUlQyX0JBU0VfUEhZUywKIAkuaW9fcGdfb2Zmc3QJPSAoKElYUDRYWF9VQVJUMl9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKLQkubWFwX2lvCQk9IGd0d3g1NzE1X21hcF9pbywKKwkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAogCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXBjaS5jCmluZGV4IGMyYWI5ZWIuLmY5YTFkM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1wY2kuYwpAQCAtMjcsMTQgKzI3LDEwIEBACiAKIHZvaWQgX19pbml0IGl4ZHA0MjVfcGNpX3ByZWluaXQodm9pZCkKIHsKLQlncGlvX2xpbmVfY29uZmlnKElYRFA0MjVfUENJX0lOVEFfUElOLAotCQkJCUlYUDRYWF9HUElPX0lOIHwgSVhQNFhYX0dQSU9fQUNUSVZFX0xPVyk7Ci0JZ3Bpb19saW5lX2NvbmZpZyhJWERQNDI1X1BDSV9JTlRCX1BJTiwgCi0JCQkJSVhQNFhYX0dQSU9fSU4gfCBJWFA0WFhfR1BJT19BQ1RJVkVfTE9XKTsKLQlncGlvX2xpbmVfY29uZmlnKElYRFA0MjVfUENJX0lOVENfUElOLCAKLQkJCQlJWFA0WFhfR1BJT19JTiB8IElYUDRYWF9HUElPX0FDVElWRV9MT1cpOwotCWdwaW9fbGluZV9jb25maWcoSVhEUDQyNV9QQ0lfSU5URF9QSU4sIAotCQkJCUlYUDRYWF9HUElPX0lOIHwgSVhQNFhYX0dQSU9fQUNUSVZFX0xPVyk7CisJc2V0X2lycV90eXBlKElSUV9JWERQNDI1X1BDSV9JTlRBLCBJUlFUX0xPVyk7CisJc2V0X2lycV90eXBlKElSUV9JWERQNDI1X1BDSV9JTlRCLCBJUlFUX0xPVyk7CisJc2V0X2lycV90eXBlKElSUV9JWERQNDI1X1BDSV9JTlRDLCBJUlFUX0xPVyk7CisJc2V0X2lycV90eXBlKElSUV9JWERQNDI1X1BDSV9JTlRELCBJUlFUX0xPVyk7CiAKIAlncGlvX2xpbmVfaXNyX2NsZWFyKElYRFA0MjVfUENJX0lOVEFfUElOKTsKIAlncGlvX2xpbmVfaXNyX2NsZWFyKElYRFA0MjVfUENJX0lOVEJfUElOKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYwppbmRleCBmYTA2NDZjLi5hZTFmYTA5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCkBAIC0yNCwxMSArMjQsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogCi12b2lkIF9faW5pdCBpeGRwNDI1X21hcF9pbyh2b2lkKSAKLXsKLQlpeHA0eHhfbWFwX2lvKCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBpeGRwNDI1X2ZsYXNoX2RhdGEgPSB7CiAJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCiAJLndpZHRoCQk9IDIsCkBAIC0xMDEsNyArOTYsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpeGRwNDI1X3VhcnQgPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDAsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCiAJLmRldi5wbGF0Zm9ybV9kYXRhCT0gaXhkcDQyNV91YXJ0X2RhdGEsCiAJLm51bV9yZXNvdXJjZXMJCT0gMiwKIAkucmVzb3VyY2UJCT0gaXhkcDQyNV91YXJ0X3Jlc291cmNlcwpAQCAtMTMzLDcgKzEyOCw3IEBACiAJLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCiAJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCiAJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKLQkubWFwX2lvCQk9IGl4ZHA0MjVfbWFwX2lvLAorCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLApAQCAtMTQ1LDcgKzE0MCw3IEBACiAJLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCiAJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCiAJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKLQkubWFwX2lvCQk9IGl4ZHA0MjVfbWFwX2lvLAorCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLApAQCAtMTU3LDcgKzE1Miw3IEBACiAJLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCiAJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCiAJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKLQkubWFwX2lvCQk9IGl4ZHA0MjVfbWFwX2lvLAorCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLApAQCAtMTc2LDcgKzE3MSw3IEBACiAJLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCiAJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCiAJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKLQkubWFwX2lvCQk9IGl4ZHA0MjVfbWFwX2lvLAorCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcGc0MjUtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwZzQyNS1wY2kuYwppbmRleCBjZTQ1NjNmLi5mZTVlNzY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwZzQyNS1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwZzQyNS1wY2kuYwpAQCAtMjksOCArMjksOCBAQAogCiB2b2lkIF9faW5pdCBpeGRwZzQyNV9wY2lfcHJlaW5pdCh2b2lkKQogewotCWdwaW9fbGluZV9jb25maWcoNiwgSVhQNFhYX0dQSU9fSU4gfCBJWFA0WFhfR1BJT19BQ1RJVkVfTE9XKTsKLQlncGlvX2xpbmVfY29uZmlnKDcsIElYUDRYWF9HUElPX0lOIHwgSVhQNFhYX0dQSU9fQUNUSVZFX0xPVyk7CisJc2V0X2lycV90eXBlKElSUV9JWFA0WFhfR1BJTzYsIElSUVRfTE9XKTsKKwlzZXRfaXJxX3R5cGUoSVJRX0lYUDRYWF9HUElPNywgSVJRVF9MT1cpOwogCiAJZ3Bpb19saW5lX2lzcl9jbGVhcig2KTsKIAlncGlvX2xpbmVfaXNyX2NsZWFyKDcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NvbW1vbi5oCmluZGV4IGJlZGE3YzIuLjU3OGE1MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jb21tb24uaAorKysgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY29tbW9uLmgKQEAgLTEzLDQgKzEzLDQgQEAKIGV4dGVybiB2b2lkIGxoN2E0MDBfaW5pdF9pcnEgKHZvaWQpOwogZXh0ZXJuIHZvaWQgbGg3YTQwNF9pbml0X2lycSAodm9pZCk7CiAKLSNkZWZpbmUgSVJRX0RJU1BBVENIKGlycSkgaXJxX2Rlc2NbaXJxXS5oYW5kbGUgKChpcnEpLCAmaXJxX2Rlc2NbaXJxXSwgcmVncykKKyNkZWZpbmUgSVJRX0RJU1BBVENIKGlycSkgZGVzY19oYW5kbGVfaXJxKChpcnEpLChpcnFfZGVzYyArIGlycSksIHJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWcKaW5kZXggNzQwOGFjOS4uMjdmYzJlOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvS2NvbmZpZwpAQCAtNDcsNiArNDcsMTQgQEAKIAkgIFRJIE9NQVAgNTkxMiBPU0sgKE9NQVAgU3RhcnRlciBLaXQpIGJvYXJkIHN1cHBvcnQuIFNheSBZIGhlcmUKICAgICAgICAgICBpZiB5b3UgaGF2ZSBzdWNoIGEgYm9hcmQuCiAKK2NvbmZpZyBPTUFQX09TS19NSVNUUkFMCisJYm9vbCAiTWlzdHJhbCBRVkdBIGJvYXJkIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBNQUNIX09NQVBfT1NLCisgICAgCWhlbHAKKwkgIFRoZSBPU0sgc3VwcG9ydHMgYW4gb3B0aW9uYWwgYWRkLW9uIGJvYXJkIHdpdGggYSBRdWFydGVyLVZHQQorCSAgdG91Y2hzY3JlZW4sIFBEQS1pc2ggYnV0dG9ucywgYSByZXN1bWUgYnV0dG9uLCBiaWNvbG9yIExFRCwKKwkgIGFuZCBjYW1lcmEgY29ubmVjdG9yLiAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSB0aGlzIGJvYXJkLgorCiBjb25maWcgTUFDSF9PTUFQX1BFUlNFVVMyCiAJYm9vbCAiVEkgUGVyc2V1czIiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIEFSQ0hfT01BUDczMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUKaW5kZXggZDM4NmZkOS4uMTgxYTkzZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIwogCiAjIENvbW1vbiBzdXBwb3J0Ci1vYmoteSA6PSBpby5vIGlkLm8gaXJxLm8gdGltZS5vIHNlcmlhbC5vCitvYmoteSA6PSBpby5vIGlkLm8gaXJxLm8gdGltZS5vIHNlcmlhbC5vIGRldmljZXMubwogbGVkLXkgOj0gbGVkcy5vCiAKICMgU3BlY2lmaWMgYm9hcmQgc3VwcG9ydApAQCAtMjMsNiArMjMsNyBAQAogCiAjIExFRHMgc3VwcG9ydAogbGVkLSQoQ09ORklHX01BQ0hfT01BUF9IMikJCSs9IGxlZHMtaDJwMi1kZWJ1Zy5vCitsZWQtJChDT05GSUdfTUFDSF9PTUFQX0gzKQkJKz0gbGVkcy1oMnAyLWRlYnVnLm8KIGxlZC0kKENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SKQkrPSBsZWRzLWlubm92YXRvci5vCiBsZWQtJChDT05GSUdfTUFDSF9PTUFQX1BFUlNFVVMyKQkrPSBsZWRzLWgycDItZGVidWcubwogbGVkLSQoQ09ORklHX01BQ0hfT01BUF9PU0spCQkrPSBsZWRzLW9zay5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jCmluZGV4IDEyMjc5NmUuLmMyMDljNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jCkBAIC00OCwxOSArNDgsNDMgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCiBzdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyBnZW5lcmljMTYxMF91c2JfY29uZmlnIF9faW5pdGRhdGEgPSB7CisjaWZkZWYgQ09ORklHX1VTQl9PVEcKKwkub3RnCQk9IDEsCisjZW5kaWYKIAkucmVnaXN0ZXJfaG9zdAk9IDEsCiAJLnJlZ2lzdGVyX2Rldgk9IDEsCiAJLmhtY19tb2RlCT0gMTYsCiAJLnBpbnNbMF0JPSA2LAogfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX21tY19jb25maWcgZ2VuZXJpY19tbWNfY29uZmlnIF9faW5pdGRhdGEgPSB7CisJLm1tYyBbMF0gPSB7CisJCS5lbmFibGVkIAk9IDAsCisJCS53aXJlNAkJPSAwLAorCQkud3BfcGluCQk9IC0xLAorCQkucG93ZXJfcGluCT0gLTEsCisJCS5zd2l0Y2hfcGluCT0gLTEsCisJfSwKKwkubW1jIFsxXSA9IHsKKwkJLmVuYWJsZWQgCT0gMCwKKwkJLndpcmU0CQk9IDAsCisJCS53cF9waW4JCT0gLTEsCisJCS5wb3dlcl9waW4JPSAtMSwKKwkJLnN3aXRjaF9waW4JPSAtMSwKKwl9LAorfTsKKwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIGdlbmVyaWNfY29uZmlnW10gPSB7CiAJeyBPTUFQX1RBR19VU0IsICAgICAgICAgICBOVUxMIH0sCisJeyBPTUFQX1RBR19NTUMsICAgICAgICAgICAmZ2VuZXJpY19tbWNfY29uZmlnIH0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9nZW5lcmljX2luaXQodm9pZCkKIHsKKwljb25zdCBzdHJ1Y3Qgb21hcF91YXJ0X2NvbmZpZyAqdWFydF9jb25mOworCiAJLyoKIAkgKiBNYWtlIHN1cmUgdGhlIHNlcmlhbCBwb3J0cyBhcmUgbXV4ZWQgb24gYXQgdGhpcyBwb2ludC4KIAkgKiBZb3UgaGF2ZSB0byBtdXggdGhlbSBvZmYgaW4gZGV2aWNlIGRyaXZlcnMgbGF0ZXIgb24KQEAgLTc2LDYgKzEwMCwxOCBAQAogCQlnZW5lcmljX2NvbmZpZ1swXS5kYXRhID0gJmdlbmVyaWMxNjEwX3VzYl9jb25maWc7CiAJfQogI2VuZGlmCisKKwl1YXJ0X2NvbmYgPSBvbWFwX2dldF9jb25maWcoT01BUF9UQUdfVUFSVCwgc3RydWN0IG9tYXBfdWFydF9jb25maWcpOworCWlmICh1YXJ0X2NvbmYgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBpbnQgZW5hYmxlZF9wb3J0cywgaTsKKworCQllbmFibGVkX3BvcnRzID0gdWFydF9jb25mLT5lbmFibGVkX3VhcnRzOworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlpZiAoIShlbmFibGVkX3BvcnRzICYgKDEgPDwgaSkpKQorCQkJCWdlbmVyaWNfc2VyaWFsX3BvcnRzW2ldID0gMDsKKwkJfQorCX0KKwogCW9tYXBfYm9hcmRfY29uZmlnID0gZ2VuZXJpY19jb25maWc7CiAJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoZ2VuZXJpY19jb25maWcpOwogCW9tYXBfc2VyaWFsX2luaXQoZ2VuZXJpY19zZXJpYWxfcG9ydHMpOwpAQCAtODMsNyArMTE5LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ2VuZXJpY19tYXBfaW8odm9pZCkKIHsKLQlvbWFwX21hcF9jb21tb25faW8oKQorCW9tYXBfbWFwX2NvbW1vbl9pbygpOwogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfR0VORVJJQywgIkdlbmVyaWMgT01BUDE1MTAvMTYxMC8xNzEwIikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYwppbmRleCBmNDk4M2VlLi5kNDZhNzAwNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvY29tbW9uLmg+CkBAIC04MCw4ICs4MSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGgyX2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAkJPSBPTUFQX0NTMkJfUEhZUywKLQkuZW5kCQk9IE9NQVBfQ1MyQl9QSFlTICsgT01BUF9DUzJCX1NJWkUgLSAxLAorCS8qIFRoaXMgaXMgb24gQ1MzLCB3aGVyZXZlciBpdCdzIG1hcHBlZCAqLwogCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKIH07CiAKQEAgLTEyNiwxMCArMTI2LDkgQEAKIAkJcHJpbnRrKCJFcnJvciByZXF1ZXN0aW5nIGdwaW8gMCBmb3Igc21jOTF4IGlycVxuIik7CiAJCXJldHVybjsKIAl9Ci0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMCwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7CiB9CiAKLXZvaWQgaDJfaW5pdF9pcnEodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBoMl9pbml0X2lycSh2b2lkKQogewogCW9tYXBfaW5pdF9pcnEoKTsKIAlvbWFwX2dwaW9faW5pdCgpOwpAQCAtMTUyLDkgKzE1MSwxMyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX21tY19jb25maWcgaDJfbW1jX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS5tbWNfYmxvY2tzCQk9IDEsCi0JLm1tYzFfcG93ZXJfcGluCQk9IC0xLAkvKiB0cHM2NTAxMCBncGlvMyAqLwotCS5tbWMxX3N3aXRjaF9waW4JPSBPTUFQX01QVUlPKDEpLAorCS5tbWMgWzBdID0geworCQkuZW5hYmxlZCAJPSAxLAorCQkud2lyZTQJCT0gMSwKKwkJLndwX3BpbgkJPSBPTUFQX01QVUlPKDMpLAorCQkucG93ZXJfcGluCT0gLTEsCS8qIHRwczY1MDEwIGdwaW8zICovCisJCS5zd2l0Y2hfcGluCT0gT01BUF9NUFVJTygxKSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgaDJfY29uZmlnW10gPSB7CkBAIC0xNjQsNiArMTY3LDE2IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBoMl9pbml0KHZvaWQpCiB7CisJLyogTk9URTogcmV2QyBib2FyZHMgc3VwcG9ydCBOQU5ELWJvb3QsIHdoaWNoIGNhbiBwdXQgTk9SIG9uIENTMkIKKwkgKiBhbmQgTkFORCAoZWl0aGVyIDE2Yml0IG9yIDhiaXQpIG9uIENTMy4KKwkgKi8KKwloMl9mbGFzaF9yZXNvdXJjZS5lbmQgPSBoMl9mbGFzaF9yZXNvdXJjZS5zdGFydCA9IG9tYXBfY3MzX3BoeXMoKTsKKwloMl9mbGFzaF9yZXNvdXJjZS5lbmQgKz0gU1pfMzJNIC0gMTsKKworCS8qIE1NQzogIGNhcmQgZGV0ZWN0IGFuZCBXUCAqLworCS8vIG9tYXBfY2ZnX3JlZyhVMTlfQVJNSU8xKTsJCS8qIENEICovCisJb21hcF9jZmdfcmVnKEJBTExPVVRfVjhfQVJNSU8zKTsJLyogV1AgKi8KKwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGgyX2RldmljZXMsIEFSUkFZX1NJWkUoaDJfZGV2aWNlcykpOwogCW9tYXBfYm9hcmRfY29uZmlnID0gaDJfY29uZmlnOwogCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKGgyX2NvbmZpZyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKaW5kZXggN2NkNDE5ZC4uMjc5ODYxMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYwpAQCAtODIsOCArODIsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoM19mbGFzaF9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJCT0gT01BUF9DUzJCX1BIWVMsCi0JLmVuZAkJPSBPTUFQX0NTMkJfUEhZUyArIE9NQVBfQ1MyQl9TSVpFIC0gMSwKKwkvKiBUaGlzIGlzIG9uIENTMywgd2hlcmV2ZXIgaXQncyBtYXBwZWQgKi8KIAkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCiB9OwogCkBAIC0xNjEsMTMgKzE2MCwyNiBAQAogCS5waW5zWzFdCT0gMywKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnIGgzX21tY19jb25maWcgX19pbml0ZGF0YSA9IHsKKwkubW1jWzBdID0geworCQkuZW5hYmxlZCAJPSAxLAorCQkucG93ZXJfcGluCT0gLTEsICAgLyogdHBzNjUwMTAgR1BJTzQgKi8KKwkJLnN3aXRjaF9waW4JPSBPTUFQX01QVUlPKDEpLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBoM19jb25maWdbXSA9IHsKIAl7IE9NQVBfVEFHX1VTQiwJICZoM191c2JfY29uZmlnIH0sCisJeyBPTUFQX1RBR19NTUMsICAmaDNfbW1jX2NvbmZpZyB9LAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGgzX2luaXQodm9pZCkKIHsKKwloM19mbGFzaF9yZXNvdXJjZS5lbmQgPSBoM19mbGFzaF9yZXNvdXJjZS5zdGFydCA9IG9tYXBfY3MzX3BoeXMoKTsKKwloM19mbGFzaF9yZXNvdXJjZS5lbmQgKz0gT01BUF9DUzNfU0laRSAtIDE7CiAJKHZvaWQpIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworCW9tYXBfYm9hcmRfY29uZmlnID0gaDNfY29uZmlnOworCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKGgzX2NvbmZpZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBoM19pbml0X3NtYzkxeCh2b2lkKQpAQCAtMTc3LDcgKzE4OSw2IEBACiAJCXByaW50aygiRXJyb3IgcmVxdWVzdGluZyBncGlvIDQwIGZvciBzbWM5MXggaXJxXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCg0MCwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7CiB9CiAKIHZvaWQgaDNfaW5pdF9pcnEodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCmluZGV4IDkxZGU2MGEuLmRmMDMxMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KICNpbmNsdWRlIDxhc20vYXJjaC9mcGdhLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CkBAIC0xNzMsNyArMTc0LDYgQEAKIAkJCXByaW50aygiRXJyb3IgcmVxdWVzdGluZyBncGlvIDAgZm9yIHNtYzkxeCBpcnFcbiIpOwogCQkJcmV0dXJuOwogCQl9Ci0JCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDAsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CiAJfQogfQogCkBAIC0yMjAsOCArMjIwLDE5IEBACiB9OwogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnIGlubm92YXRvcl9tbWNfY29uZmlnIF9faW5pdGRhdGEgPSB7CisJLm1tYyBbMF0gPSB7CisJCS5lbmFibGVkIAk9IDEsCisJCS53aXJlNAkJPSAxLAorCQkud3BfcGluCQk9IE9NQVBfTVBVSU8oMyksCisJCS5wb3dlcl9waW4JPSAtMSwJLyogRlBHQSBGMyBVSU80MiAqLworCQkuc3dpdGNoX3Bpbgk9IC0xLAkvKiBGUEdBIEY0IFVJTzQzICovCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIGlubm92YXRvcl9jb25maWdbXSA9IHsKIAl7IE9NQVBfVEFHX1VTQiwgICAgICAgICBOVUxMIH0sCisJeyBPTUFQX1RBR19NTUMsCQkmaW5ub3ZhdG9yX21tY19jb25maWcgfSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbm5vdmF0b3JfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1uZXRzdGFyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5ldHN0YXIuYwppbmRleCA2NzUwYjIwLi5kOTA0ZTY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5ldHN0YXIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5ldHN0YXIuYwpAQCAtNzUsMTYgKzc1LDE1IEBACiAJbWRlbGF5KDUwKTsJLyogNTBtcyB1bnRpbCBQSFkgcmVhZHkgKi8KIAkvKiBzbWM5MXggaW50ZXJydXB0IHBpbiAqLwogCW9tYXBfcmVxdWVzdF9ncGlvKDgpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDgsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CiAKIAlvbWFwX3JlcXVlc3RfZ3BpbygxMik7CiAJb21hcF9yZXF1ZXN0X2dwaW8oMTMpOwogCW9tYXBfcmVxdWVzdF9ncGlvKDE0KTsKIAlvbWFwX3JlcXVlc3RfZ3BpbygxNSk7Ci0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTIsIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDEzLCBPTUFQX0dQSU9fRkFMTElOR19FREdFKTsKLQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCgxNCwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7Ci0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTUsIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOworCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKDEyKSwgSVJRVF9GQUxMSU5HKTsKKwlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUSgxMyksIElSUVRfRkFMTElORyk7CisJc2V0X2lycV90eXBlKE9NQVBfR1BJT19JUlEoMTQpLCBJUlFUX0ZBTExJTkcpOworCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKDE1KSwgSVJRVF9GQUxMSU5HKTsKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG5ldHN0YXJfZGV2aWNlcywgQVJSQVlfU0laRShuZXRzdGFyX2RldmljZXMpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKaW5kZXggNjg0NGU1My4uMjExMDNkZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jCkBAIC0yOSwxMSArMjksMTYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+CkBAIC00MSwxMiArNDYsNTYgQEAKICNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgogCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9zazU5MTJfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci17IE9NQVBfT1NLX05PUl9GTEFTSF9CQVNFLCBPTUFQX09TS19OT1JfRkxBU0hfU1RBUlQsIE9NQVBfT1NLX05PUl9GTEFTSF9TSVpFLAotCU1UX0RFVklDRSB9LAorc3RhdGljIGludCBfX2luaXRkYXRhIG9za19zZXJpYWxfcG9ydHNbT01BUF9NQVhfTlJfUE9SVFNdID0gezEsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gb3NrX3BhcnRpdGlvbnNbXSA9IHsKKwkvKiBib290bG9hZGVyIChVLUJvb3QsIGV0YykgaW4gZmlyc3Qgc2VjdG9yICovCisJeworCSAgICAgIC5uYW1lCQk9ICJib290bG9hZGVyIiwKKwkgICAgICAub2Zmc2V0CQk9IDAsCisJICAgICAgLnNpemUJCT0gU1pfMTI4SywKKwkgICAgICAubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sCisJLyogYm9vdGxvYWRlciBwYXJhbXMgaW4gdGhlIG5leHQgc2VjdG9yICovCisJeworCSAgICAgIC5uYW1lCQk9ICJwYXJhbXMiLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IFNaXzEyOEssCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwLAorCX0sIHsKKwkgICAgICAubmFtZQkJPSAia2VybmVsIiwKKwkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkgICAgICAuc2l6ZQkJPSBTWl8yTSwKKwkgICAgICAubWFza19mbGFncwk9IDAKKwl9LCB7CisJICAgICAgLm5hbWUJCT0gImZpbGVzeXN0ZW0iLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwCisJfQogfTsKIAotc3RhdGljIGludCBfX2luaXRkYXRhIG9za19zZXJpYWxfcG9ydHNbT01BUF9NQVhfTlJfUE9SVFNdID0gezEsIDAsIDB9Oworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIG9za19mbGFzaF9kYXRhID0geworCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCS53aWR0aAkJPSAyLAorCS5wYXJ0cwkJPSBvc2tfcGFydGl0aW9ucywKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKG9za19wYXJ0aXRpb25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb3NrX2ZsYXNoX3Jlc291cmNlID0geworCS8qIHRoaXMgaXMgb24gQ1MzLCB3aGVyZXZlciBpdCdzIG1hcHBlZCAqLworCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9zazU5MTJfZmxhc2hfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZvc2tfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkucmVzb3VyY2UJPSAmb3NrX2ZsYXNoX3Jlc291cmNlLAorfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvc2s1OTEyX3NtYzkxeF9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CkBAIC04Niw5ICsxMzUsMTYgQEAKIAkucmVzb3VyY2UJPSBvc2s1OTEyX2NmX3Jlc291cmNlcywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9zazU5MTJfbWNic3AxX2RldmljZSA9IHsKKwkubmFtZQkJPSAib21hcF9tY2JzcCIsCisJLmlkCQk9IDEsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3NrNTkxMl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmb3NrNTkxMl9mbGFzaF9kZXZpY2UsCiAJJm9zazU5MTJfc21jOTF4X2RldmljZSwKIAkmb3NrNTkxMl9jZl9kZXZpY2UsCisJJm9zazU5MTJfbWNic3AxX2RldmljZSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvc2tfaW5pdF9zbWM5MXgodm9pZCkKQEAgLTk3LDcgKzE1Myw2IEBACiAJCXByaW50aygiRXJyb3IgcmVxdWVzdGluZyBncGlvIDAgZm9yIHNtYzkxeCBpcnFcbiIpOwogCQlyZXR1cm47CiAJfQotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDAsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CiAKIAkvKiBDaGVjayBFTUlGUyB3YWl0IHN0YXRlcyB0byBmaXggZXJyb3JzIHdpdGggU01DX0dFVF9QS1RfSERSICovCiAJRU1JRlNfQ0NTKDEpIHw9IDB4MjsKQEAgLTExMCwxMSArMTY1LDExIEBACiAJCXByaW50aygiRXJyb3IgcmVxdWVzdGluZyBncGlvIDYyIGZvciBDRiBpcnFcbiIpOwogCQlyZXR1cm47CiAJfQotCS8qIGl0J3MgcmVhbGx5IGFjdGl2ZS1sb3cgKi8KLQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCg2MiwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7CisJLyogdGhlIENGIEkvTyBJUlEgaXMgcmVhbGx5IGFjdGl2ZS1sb3cgKi8KKwlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUSg2MiksIElSUVRfRkFMTElORyk7CiB9CiAKLXZvaWQgb3NrX2luaXRfaXJxKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgb3NrX2luaXRfaXJxKHZvaWQpCiB7CiAJb21hcF9pbml0X2lycSgpOwogCW9tYXBfZ3Bpb19pbml0KCk7CkBAIC0xNDIsMTggKzE5Nyw2OSBAQAogCXsgT01BUF9UQUdfVVNCLCAgICAgICAgICAgJm9za191c2JfY29uZmlnIH0sCiB9OwogCisjaWZkZWYJQ09ORklHX09NQVBfT1NLX01JU1RSQUwKKworI2lmZGVmCUNPTkZJR19QTQorc3RhdGljIGlycXJldHVybl90Citvc2tfbWlzdHJhbF93YWtlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICppZ25vcmVkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IG9za19taXN0cmFsX2luaXQodm9pZCkKK3sKKwkvKiBGSVhNRSBoZXJlJ3Mgd2hlcmUgdG8gZmVlZCBpbiBmcmFtZWJ1ZmZlciwgdG91Y2hwYWQsIGFuZAorCSAqIGtleWJvYXJkIHNldHVwIC4uLiAgbm90IGluIHRoZSBkcml2ZXJzIGZvciB0aG9zZSBkZXZpY2VzIQorCSAqCisJICogTk9URTogIHdlIGNvdWxkIGFjdHVhbGx5IHRlbGwgaWYgdGhlcmUncyBhIE1pc3RyYWwgYm9hcmQKKwkgKiBhdHRhY2hlZCwgZS5nLiBieSB0cnlpbmcgdG8gcmVhZCBzb21ldGhpbmcgZnJvbSB0aGUgYWRzNzg0Ni4KKwkgKiBCdXQgdGhpcyBpcyB0b28gZWFybHkgZm9yIHRoYXQuLi4KKwkgKi8KKworCS8qIHRoZSBzaWRld2F5cyBidXR0b24gKFNXMSkgaXMgZm9yIHVzZSBhcyBhICJ3YWtldXAiIGJ1dHRvbiAqLworCW9tYXBfY2ZnX3JlZyhOMTVfMTYxMF9NUFVJTzIpOworCWlmIChvbWFwX3JlcXVlc3RfZ3BpbyhPTUFQX01QVUlPKDIpKSA9PSAwKSB7CisJCWludCByZXQgPSAwOworCQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihPTUFQX01QVUlPKDIpLCAxKTsKKwkJc2V0X2lycV90eXBlKE9NQVBfR1BJT19JUlEoT01BUF9NUFVJTygyKSksIElSUVRfUklTSU5HKTsKKyNpZmRlZglDT05GSUdfUE0KKwkJLyogc2hhcmUgdGhlIElSUSBpbiBjYXNlIHNvbWVvbmUgd2FudHMgdG8gdXNlIHRoZQorCQkgKiBidXR0b24gZm9yIG1vcmUgdGhhbiB3YWtldXAgZnJvbSBzeXN0ZW0gc2xlZXAuCisJCSAqLworCQlyZXQgPSByZXF1ZXN0X2lycShPTUFQX0dQSU9fSVJRKE9NQVBfTVBVSU8oMikpLAorCQkJCSZvc2tfbWlzdHJhbF93YWtlX2ludGVycnVwdCwKKwkJCQlTQV9TSElSUSwgIm1pc3RyYWxfd2FrZXVwIiwKKwkJCQkmb3NrX21pc3RyYWxfd2FrZV9pbnRlcnJ1cHQpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCW9tYXBfZnJlZV9ncGlvKE9NQVBfTVBVSU8oMikpOworCQkJcHJpbnRrKEtFUk5fRVJSICJPU0srTWlzdHJhbDogbm8gd2FrZXVwIGlycSwgJWQ/XG4iLAorCQkJCXJldCk7CisJCX0gZWxzZQorCQkJZW5hYmxlX2lycV93YWtlKE9NQVBfR1BJT19JUlEoT01BUF9NUFVJTygyKSkpOworI2VuZGlmCisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiAiT1NLK01pc3RyYWw6IHdha2V1cCBidXR0b24gaXMgYXdvbFxuIik7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IG9za19taXN0cmFsX2luaXQodm9pZCkgeyB9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgX19pbml0IG9za19pbml0KHZvaWQpCiB7CisJb3NrX2ZsYXNoX3Jlc291cmNlLmVuZCA9IG9za19mbGFzaF9yZXNvdXJjZS5zdGFydCA9IG9tYXBfY3MzX3BoeXMoKTsKKwlvc2tfZmxhc2hfcmVzb3VyY2UuZW5kICs9IFNaXzMyTSAtIDE7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMob3NrNTkxMl9kZXZpY2VzLCBBUlJBWV9TSVpFKG9zazU5MTJfZGV2aWNlcykpOwogCW9tYXBfYm9hcmRfY29uZmlnID0gb3NrX2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShvc2tfY29uZmlnKTsKIAlVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcgfD0gKDMgPDwgMSk7CisKKwlvc2tfbWlzdHJhbF9pbml0KCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvc2tfbWFwX2lvKHZvaWQpCiB7CiAJb21hcF9tYXBfY29tbW9uX2lvKCk7Ci0JaW90YWJsZV9pbml0KG9zazU5MTJfaW9fZGVzYywgQVJSQVlfU0laRShvc2s1OTEyX2lvX2Rlc2MpKTsKIAlvbWFwX3NlcmlhbF9pbml0KG9za19zZXJpYWxfcG9ydHMpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKaW5kZXggMjEzMzE3My4uMTA3YzY4YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKKyNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KICNpbmNsdWRlIDxhc20vYXJjaC9mcGdhLmg+CkBAIC04Myw4ICs4NCw4IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHAyX2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAkJPSBPTUFQX0ZMQVNIXzBfU1RBUlQsCi0JLmVuZAkJPSBPTUFQX0ZMQVNIXzBfU1RBUlQgKyBPTUFQX0ZMQVNIXzBfU0laRSAtIDEsCisJLnN0YXJ0CQk9IE9NQVBfQ1MwX1BIWVMsCisJLmVuZAkJPSBPTUFQX0NTMF9QSFlTICsgU1pfMzJNIC0gMSwKIAkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwppbmRleCBlNDIyODE5Li5iZjMwYjFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKQEAgLTI1LDEzICsyNSwxNCBAQAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKLSNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KLSNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KIAogZXh0ZXJuIHZvaWQgb21hcF9pbml0X3RpbWUodm9pZCk7CiBleHRlcm4gaW50IG9tYXBfZ3Bpb19pbml0KHZvaWQpOwpAQCAtNzQsNyArNzUsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAxLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNMSwKIAkuZGV2CQkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCT0gdm9pY2VibHVlX3BvcnRzLAogCX0sCkBAIC04Niw2ICs4NywyNyBAQAogfQogYXJjaF9pbml0Y2FsbChleHRfdWFydF9pbml0KTsKIAorc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIHZvaWNlYmx1ZV9mbGFzaF9kYXRhID0geworCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCS53aWR0aAkJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB2b2ljZWJsdWVfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CT0gT01BUF9DUzBfUEhZUywKKwkuZW5kCT0gT01BUF9DUzBfUEhZUyArIFNaXzMyTSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB2b2ljZWJsdWVfZmxhc2hfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ2b2ljZWJsdWVfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkucmVzb3VyY2UJPSAmdm9pY2VibHVlX2ZsYXNoX3Jlc291cmNlLAorfTsKKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB2b2ljZWJsdWVfc21jOTF4X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CT0gT01BUF9DUzJfUEhZUyArIDB4MzAwLApAQCAtMTA3LDYgKzEyOSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdm9pY2VibHVlX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZ2b2ljZWJsdWVfZmxhc2hfZGV2aWNlLAogCSZ2b2ljZWJsdWVfc21jOTF4X2RldmljZSwKIH07CiAKQEAgLTExOSw4ICsxNDIsMTcgQEAKIAkucGluc1syXQk9IDYsCiB9OwogCitzdGF0aWMgc3RydWN0IG9tYXBfbW1jX2NvbmZpZyB2b2ljZWJsdWVfbW1jX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5tbWNbMF0gPSB7CisJCS5lbmFibGVkCT0gMSwKKwkJLnBvd2VyX3Bpbgk9IDIsCisJCS5zd2l0Y2hfcGluCT0gLTEsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIHZvaWNlYmx1ZV9jb25maWdbXSA9IHsKIAl7IE9NQVBfVEFHX1VTQiwgJnZvaWNlYmx1ZV91c2JfY29uZmlnIH0sCisJeyBPTUFQX1RBR19NTUMsICZ2b2ljZWJsdWVfbW1jX2NvbmZpZyB9LAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IHZvaWNlYmx1ZV9pbml0X2lycSh2b2lkKQpAQCAtMTMxLDkgKzE2Myw2IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCB2b2ljZWJsdWVfaW5pdCh2b2lkKQogewotCS8qIFRoZXJlIGlzIGEgZ29vZCBjaGFuY2UgYm9hcmQgaXMgZ29pbmcgdXAsIHNvIGVuYWJsZSBQb3dlciBMRUQKLQkgKiAoaXQgaXMgY29ubmVjdGVkIHRocm91Z2ggaW52ZXJ0b3IpICovCi0Jb21hcF93cml0ZWIoMHgwMCwgT01BUF9MUEcxX0xDUik7CiAJLyogV2F0Y2hkb2cgKi8KIAlvbWFwX3JlcXVlc3RfZ3BpbygwKTsKIAkvKiBzbWM5MXggcmVzZXQgKi8KQEAgLTE0NSw3ICsxNzQsNiBAQAogCW1kZWxheSg1MCk7CS8qIDUwbXMgdW50aWwgUEhZIHJlYWR5ICovCiAJLyogc21jOTF4IGludGVycnVwdCBwaW4gKi8KIAlvbWFwX3JlcXVlc3RfZ3Bpbyg4KTsKLQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCg4LCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOwogCS8qIDE2QzU1NCByZXNldCovCiAJb21hcF9yZXF1ZXN0X2dwaW8oNik7CiAJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oNiwgMCk7CkBAIC0xNTUsMTQgKzE4MywxOSBAQAogCW9tYXBfcmVxdWVzdF9ncGlvKDEzKTsKIAlvbWFwX3JlcXVlc3RfZ3BpbygxNCk7CiAJb21hcF9yZXF1ZXN0X2dwaW8oMTUpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDEyLCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDEzLCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDE0LCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDE1LCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOworCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKDEyKSwgSVJRVF9SSVNJTkcpOworCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKDEzKSwgSVJRVF9SSVNJTkcpOworCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKDE0KSwgSVJRVF9SSVNJTkcpOworCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKDE1KSwgSVJRVF9SSVNJTkcpOwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXModm9pY2VibHVlX2RldmljZXMsIEFSUkFZX1NJWkUodm9pY2VibHVlX2RldmljZXMpKTsKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IHZvaWNlYmx1ZV9jb25maWc7CiAJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUodm9pY2VibHVlX2NvbmZpZyk7CisKKwkvKiBUaGVyZSBpcyBhIGdvb2QgY2hhbmNlIGJvYXJkIGlzIGdvaW5nIHVwLCBzbyBlbmFibGUgcG93ZXIgTEVECisJICogKGl0IGlzIGNvbm5lY3RlZCB0aHJvdWdoIGludmVydG9yKSAqLworCW9tYXBfd3JpdGViKDB4MDAsIE9NQVBfTFBHMV9MQ1IpOworCW9tYXBfd3JpdGViKDB4MDAsIE9NQVBfTFBHMV9QTVIpOwkvKiBEaXNhYmxlIGNsb2NrICovCiB9CiAKIHN0YXRpYyBpbnQgX19pbml0ZGF0YSBvbWFwX3NlcmlhbF9wb3J0c1tPTUFQX01BWF9OUl9QT1JUU10gPSB7MSwgMSwgMX07CkBAIC0xODQsOSArMjE3LDkgQEAKIAlpZiAodGVzdF9hbmRfc2V0X2JpdChNQUNISU5FX1BBTklDRUQsICZtYWNoaW5lX3N0YXRlKSkKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCi0JLyogRmxhc2ggUG93ZXIgTEVECi0JICogKFRPRE86IEVuYWJsZSBjbG9jayByaWdodCB3YXkgKGVuYWJsZWQgaW4gYm9vdGxvYWRlciBhbHJlYWR5KSkgKi8KKwkvKiBGbGFzaCBwb3dlciBMRUQgKi8KIAlvbWFwX3dyaXRlYigweDc4LCBPTUFQX0xQRzFfTENSKTsKKwlvbWFwX3dyaXRlYigweDAxLCBPTUFQX0xQRzFfUE1SKTsJLyogRW5hYmxlIGNsb2NrICovCiAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CkBAIC0xOTUsMTUgKzIyOCwxNCBAQAogCS5ub3RpZmllcl9jYWxsCT0gcGFuaWNfZXZlbnQsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBzZXR1cF9ub3RpZmllcih2b2lkKQorc3RhdGljIGludCBfX2luaXQgdm9pY2VibHVlX3NldHVwKHZvaWQpCiB7CiAJLyogU2V0dXAgcGFuaWMgbm90aWZpZXIgKi8KIAlub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnBhbmljX2Jsb2NrKTsKIAogCXJldHVybiAwOwogfQotCi1wb3N0Y29yZV9pbml0Y2FsbChzZXR1cF9ub3RpZmllcik7Citwb3N0Y29yZV9pbml0Y2FsbCh2b2ljZWJsdWVfc2V0dXApOwogCiBzdGF0aWMgaW50IHdkdF9ncGlvX3N0YXRlOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZGV2aWNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YjM5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2RldmljZXMuYwpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvZGV2aWNlcy5jCisgKgorICogT01BUDEgcGxhdGZvcm0gZGV2aWNlIHNldHVwL2luaXRpYWxpemF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisKKworc3RhdGljIHZvaWQgb21hcF9ub3BfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisgICAgICAgIC8qIE5vdGhpbmcgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmCWRlZmluZWQoQ09ORklHX0kyQ19PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfT01BUF9NT0RVTEUpCisKKyNkZWZpbmUJT01BUF9JMkNfQkFTRQkJMHhmZmZiMzgwMAorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGkyY19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAkJPSBPTUFQX0kyQ19CQVNFLAorCQkuZW5kCQk9IE9NQVBfSTJDX0JBU0UgKyAweDNmLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAkJPSBJTlRfSTJDLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKKy8qIERNQSBub3QgdXNlZDsgd29ya3MgYXJvdW5kIGVycmF0dW0gd3JpdGluZyB0byBub24tZW1wdHkgaTJjIGZpZm8gKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcF9pMmNfZGV2aWNlID0geworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiaTJjX29tYXAiLAorICAgICAgICAuaWQgICAgICAgICAgICAgPSAtMSwKKyAgICAgICAgLmRldiA9IHsKKyAgICAgICAgICAgICAgICAucmVsZWFzZSAgICAgICAgPSBvbWFwX25vcF9yZWxlYXNlLAorICAgICAgICB9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShpMmNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBpMmNfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHZvaWQgb21hcF9pbml0X2kyYyh2b2lkKQoreworCS8qIEZJWE1FIGRlZmluZSBhbmQgdXNlIGEgYm9vdCB0YWcsIGluIGNhc2Ugb2YgYm9hcmRzIHRoYXQKKwkgKiBlaXRoZXIgZG9uJ3Qgd2lyZSB1cCBJMkMsIG9yIGNoaXBzIHRoYXQgbXV4IGl0IGRpZmZlcmVudGx5Li4uCisJICogaXQgY2FuIGluY2x1ZGUgY2xvY2tpbmcgYW5kIGFkZHJlc3MgaW5mbywgbWF5YmUgbW9yZS4KKwkgKi8KKwlvbWFwX2NmZ19yZWcoSTJDX1NDTCk7CisJb21hcF9jZmdfcmVnKEkyQ19TREEpOworCisJKHZvaWQpIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcF9pMmNfZGV2aWNlKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9pbml0X2kyYyh2b2lkKSB7fQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZglkZWZpbmVkKENPTkZJR19PTUFQMTYxMF9JUikgfHwgZGVmaW5lZChDT05GSUdfT01BUDE2MU9fSVJfTU9EVUxFKQorCitzdGF0aWMgdTY0IGlyZGFfZG1hbWFzayA9IDB4ZmZmZmZmZmY7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNjEwaXJfZGV2aWNlID0geworCS5uYW1lID0gIm9tYXAxNjEwLWlyIiwKKwkuaWQgPSAtMSwKKwkuZGV2ID0geworCQkucmVsZWFzZQk9IG9tYXBfbm9wX3JlbGVhc2UsCisJCS5kbWFfbWFzawk9ICZpcmRhX2RtYW1hc2ssCisJfSwKK307CisKK3N0YXRpYyB2b2lkIG9tYXBfaW5pdF9pcmRhKHZvaWQpCit7CisJLyogRklYTUUgZGVmaW5lIGFuZCB1c2UgYSBib290IHRhZywgbWVtYmVycyBzb21ldGhpbmcgbGlrZToKKwkgKiAgdTgJCXVhcnQ7CQkvLyB1YXJ0MSwgb3IgdWFydDMKKwkgKiAuLi4gYnV0IGRyaXZlciBvbmx5IGhhbmRsZXMgdWFydDMgZm9yIG5vdworCSAqICBzMTYJCWZpcl9zZWw7CS8vIGdwaW8gZm9yIFNJUiB2cyBGSVIKKwkgKiAuLi4gbWF5IHByZWZlciBhIGNhbGxiYWNrIGZvciBTSVIvTUlSL0ZJUiBtb2RlIHNlbGVjdDsKKwkgKiB3aGlsZSBoMiB1c2VzIGEgR1BJTywgSDMgdXNlcyBhIGdwaW8gZXhwYW5kZXIKKwkgKi8KKwlpZiAobWFjaGluZV9pc19vbWFwX2gyKCkKKwkJCXx8IG1hY2hpbmVfaXNfb21hcF9oMygpKQorCQkodm9pZCkgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvbWFwMTYxMGlyX2RldmljZSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaW5pdF9pcmRhKHZvaWQpIHt9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmCWRlZmluZWQoQ09ORklHX01NQ19PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9NT0RVTEUpCisKKyNkZWZpbmUJT01BUF9NTUMxX0JBU0UJCTB4ZmZmYjc4MDAKKyNkZWZpbmUJT01BUF9NTUMyX0JBU0UJCTB4ZmZmYjdjMDAJLyogb21hcDE2eHggb25seSAqLworCitzdGF0aWMgc3RydWN0IG9tYXBfbW1jX2NvbmYgbW1jMV9jb25mOworCitzdGF0aWMgdTY0IG1tYzFfZG1hbWFzayA9IDB4ZmZmZmZmZmY7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbW1jMV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAkJPSBJT19BRERSRVNTKE9NQVBfTU1DMV9CQVNFKSwKKwkJLmVuZAkJPSBJT19BRERSRVNTKE9NQVBfTU1DMV9CQVNFKSArIDB4N2YsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IElOVF9NTUMsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbW1jX29tYXBfZGV2aWNlMSA9IHsKKwkubmFtZQkJPSAibW1jaS1vbWFwIiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucmVsZWFzZQk9IG9tYXBfbm9wX3JlbGVhc2UsCisJCS5kbWFfbWFzawk9ICZtbWMxX2RtYW1hc2ssCisJCS5wbGF0Zm9ybV9kYXRhCT0gJm1tYzFfY29uZiwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtbWMxX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbW1jMV9yZXNvdXJjZXMsCit9OworCisjaWZkZWYJQ09ORklHX0FSQ0hfT01BUDE2WFgKKworc3RhdGljIHN0cnVjdCBvbWFwX21tY19jb25mIG1tYzJfY29uZjsKKworc3RhdGljIHU2NCBtbWMyX2RtYW1hc2sgPSAweGZmZmZmZmZmOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1tYzJfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJCT0gSU9fQUREUkVTUyhPTUFQX01NQzJfQkFTRSksCisJCS5lbmQJCT0gSU9fQUREUkVTUyhPTUFQX01NQzJfQkFTRSkgKyAweDdmLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAkJPSBJTlRfMTYxMF9NTUMyLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1tY19vbWFwX2RldmljZTIgPSB7CisJLm5hbWUJCT0gIm1tY2ktb21hcCIsCisJLmlkCQk9IDIsCisJLmRldiA9IHsKKwkJLnJlbGVhc2UJPSBvbWFwX25vcF9yZWxlYXNlLAorCQkuZG1hX21hc2sJPSAmbW1jMl9kbWFtYXNrLAorCQkucGxhdGZvcm1fZGF0YQk9ICZtbWMyX2NvbmYsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobW1jMl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG1tYzJfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9pbml0X21tYyh2b2lkKQoreworCWNvbnN0IHN0cnVjdCBvbWFwX21tY19jb25maWcJKm1tY19jb25mOworCWNvbnN0IHN0cnVjdCBvbWFwX21tY19jb25mCSptbWM7CisKKwkvKiBOT1RFOiAgYXNzdW1lcyBNTUMgd2FzIG5ldmVyICh3cm9uZ2x5KSBlbmFibGVkICovCisJbW1jX2NvbmYgPSBvbWFwX2dldF9jb25maWcoT01BUF9UQUdfTU1DLCBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnKTsKKwlpZiAoIW1tY19jb25mKQorCQlyZXR1cm47CisKKwkvKiBibG9jayAxIGlzIGFsd2F5cyBhdmFpbGFibGUgYW5kIGhhcyBqdXN0IG9uZSBwaW5vdXQgb3B0aW9uICovCisJbW1jID0gJm1tY19jb25mLT5tbWNbMF07CisJaWYgKG1tYy0+ZW5hYmxlZCkgeworCQlvbWFwX2NmZ19yZWcoTU1DX0NNRCk7CisJCW9tYXBfY2ZnX3JlZyhNTUNfQ0xLKTsKKwkJb21hcF9jZmdfcmVnKE1NQ19EQVQwKTsKKwkJaWYgKGNwdV9pc19vbWFwMTcxMCgpKSB7CisJICAgICAgICAgICAgICBvbWFwX2NmZ19yZWcoTTE1XzE3MTBfTU1DX0NMS0kpOworCSAgICAgICAgICAgICAgb21hcF9jZmdfcmVnKFAxOV8xNzEwX01NQ19DTURESVIpOworCSAgICAgICAgICAgICAgb21hcF9jZmdfcmVnKFAyMF8xNzEwX01NQ19EQVRESVIwKTsKKwkgICAgICAgIH0KKwkJaWYgKG1tYy0+d2lyZTQpIHsKKwkJCW9tYXBfY2ZnX3JlZyhNTUNfREFUMSk7CisJCQkvKiBOT1RFOiAgREFUMiBjYW4gYmUgb24gVzEwIChoZXJlKSBvciBNMTUgKi8KKwkJCWlmICghbW1jLT5ub211eCkKKwkJCQlvbWFwX2NmZ19yZWcoTU1DX0RBVDIpOworCQkJb21hcF9jZmdfcmVnKE1NQ19EQVQzKTsKKwkJfQorCQltbWMxX2NvbmYgPSAqbW1jOworCQkodm9pZCkgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtbWNfb21hcF9kZXZpY2UxKTsKKwl9CisKKyNpZmRlZglDT05GSUdfQVJDSF9PTUFQMTZYWAorCS8qIGJsb2NrIDIgaXMgb24gbmV3ZXIgY2hpcHMsIGFuZCBoYXMgbWFueSBwaW5vdXQgb3B0aW9ucyAqLworCW1tYyA9ICZtbWNfY29uZi0+bW1jWzFdOworCWlmIChtbWMtPmVuYWJsZWQpIHsKKwkJaWYgKCFtbWMtPm5vbXV4KSB7CisJCQlvbWFwX2NmZ19yZWcoWThfMTYxMF9NTUMyX0NNRCk7CisJCQlvbWFwX2NmZ19yZWcoWTEwXzE2MTBfTU1DMl9DTEspOworCQkJb21hcF9jZmdfcmVnKFIxOF8xNjEwX01NQzJfQ0xLSU4pOworCQkJb21hcF9jZmdfcmVnKFc4XzE2MTBfTU1DMl9EQVQwKTsKKwkJCWlmIChtbWMtPndpcmU0KSB7CisJCQkJb21hcF9jZmdfcmVnKFY4XzE2MTBfTU1DMl9EQVQxKTsKKwkJCQlvbWFwX2NmZ19yZWcoVzE1XzE2MTBfTU1DMl9EQVQyKTsKKwkJCQlvbWFwX2NmZ19yZWcoUjEwXzE2MTBfTU1DMl9EQVQzKTsKKwkJCX0KKworCQkJLyogVGhlc2UgYXJlIG5lZWRlZCBmb3IgdGhlIGxldmVsIHNoaWZ0ZXIgKi8KKwkJCW9tYXBfY2ZnX3JlZyhWOV8xNjEwX01NQzJfQ01ERElSKTsKKwkJCW9tYXBfY2ZnX3JlZyhWNV8xNjEwX01NQzJfREFURElSMCk7CisJCQlvbWFwX2NmZ19yZWcoVzE5XzE2MTBfTU1DMl9EQVRESVIxKTsKKwkJfQorCisJCS8qIEZlZWRiYWNrIGNsb2NrIG11c3QgYmUgc2V0IG9uIE9NQVAtMTcxMCBNTUMyICovCisJCWlmIChjcHVfaXNfb21hcDE3MTAoKSkKKwkJCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoTU9EX0NPTkZfQ1RSTF8xKSB8ICgxIDw8IDI0KSwKKwkJCQkgICAgIE1PRF9DT05GX0NUUkxfMSk7CisJCW1tYzJfY29uZiA9ICptbWM7CisJCSh2b2lkKSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm1tY19vbWFwX2RldmljZTIpOworCX0KKyNlbmRpZgorCXJldHVybjsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9pbml0X21tYyh2b2lkKSB7fQorI2VuZGlmCisKKyNpZglkZWZpbmVkKENPTkZJR19PTUFQX1JUQykgfHwgZGVmaW5lZChDT05GSUdfT01BUF9SVEMpCisKKyNkZWZpbmUJT01BUF9SVENfQkFTRQkJMHhmZmZiNDgwMAorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHJ0Y19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAkJPSBPTUFQX1JUQ19CQVNFLAorCQkuZW5kCQk9IE9NQVBfUlRDX0JBU0UgKyAweDVmLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAkJPSBJTlRfUlRDX1RJTUVSLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydAkJPSBJTlRfUlRDX0FMQVJNLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXBfcnRjX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAib21hcF9ydGMiLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5kZXYgPSB7CisJCS5yZWxlYXNlICAgICAgICA9IG9tYXBfbm9wX3JlbGVhc2UsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocnRjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gcnRjX3Jlc291cmNlcywKK307CisKK3N0YXRpYyB2b2lkIG9tYXBfaW5pdF9ydGModm9pZCkKK3sKKwkodm9pZCkgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvbWFwX3J0Y19kZXZpY2UpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfcnRjKHZvaWQpIHt9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmCWRlZmluZWQoQ09ORklHX09NQVAxNlhYX1dBVENIRE9HKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQMTZYWF9XQVRDSERPR19NT0RVTEUpCisKKyNkZWZpbmUJT01BUF9XRFRfQkFTRQkJMHhmZmZlYjAwMAorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHdkdF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAkJPSBPTUFQX1dEVF9CQVNFLAorCQkuZW5kCQk9IE9NQVBfV0RUX0JBU0UgKyAweDRmLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXBfd2R0X2RldmljZSA9IHsKKwkubmFtZQkgICA9ICJvbWFwMTYxMF93ZHQiLAorCS5pZAkgICAgID0gLTEsCisJLmRldiA9IHsKKwkJLnJlbGVhc2UJPSBvbWFwX25vcF9yZWxlYXNlLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHdkdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHdkdF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgdm9pZCBvbWFwX2luaXRfd2R0KHZvaWQpCit7CisJKHZvaWQpIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcF93ZHRfZGV2aWNlKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9pbml0X3dkdCh2b2lkKSB7fQorI2VuZGlmCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFRoaXMgZ2V0cyBjYWxsZWQgYWZ0ZXIgYm9hcmQtc3BlY2lmaWMgSU5JVF9NQUNISU5FLCBhbmQgaW5pdGlhbGl6ZXMgbW9zdAorICogb24tY2hpcCBwZXJpcGhlcmFscyBhY2Nlc3NpYmxlIG9uIHRoaXMgYm9hcmQgKGV4Y2VwdCBmb3IgZmV3IGxpa2UgVVNCKToKKyAqCisgKiAgKGEpIERvZXMgYW55ICJzdGFuZGFyZCBjb25maWciIHBpbiBtdXhpbmcgbmVlZGVkLiAgQm9hcmQtc3BlY2lmaWMKKyAqCWNvZGUgd2lsbCBoYXZlIG11eGVkIEdQSU8gcGlucyBhbmQgZG9uZSAibm9uc3RhbmRhcmQiIHNldHVwOworICoJdGhhdCBjb2RlIGNvdWxkIGxpdmUgaW4gdGhlIGJvb3QgbG9hZGVyLgorICogIChiKSBQb3B1bGF0aW5nIGJvYXJkLXNwZWNpZmljIHBsYXRmb3JtX2RhdGEgd2l0aCB0aGUgZGF0YSBkcml2ZXJzCisgKglyZWx5IG9uIHRvIGhhbmRsZSB3aXJpbmcgdmFyaWF0aW9ucy4KKyAqICAoYykgQ3JlYXRpbmcgcGxhdGZvcm0gZGV2aWNlcyBhcyBtZWFuaW5nZnVsIG9uIHRoaXMgYm9hcmQgYW5kCisgKgl3aXRoIHRoaXMga2VybmVsIGNvbmZpZ3VyYXRpb24uCisgKgorICogQ2xhaW1pbmcgR1BJT3MsIGFuZCBzZXR0aW5nIHRoZWlyIGRpcmVjdGlvbiBhbmQgaW5pdGlhbCB2YWx1ZXMsIGlzIHRoZQorICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIGRldmljZSBkcml2ZXJzLiAgU28gaXMgcmVzcG9uZGluZyB0byBwcm9iZSgpLgorICoKKyAqIEJvYXJkLXNwZWNpZmljIGtub3dsZWdlIGxpa2UgY3JlYXRpbmcgZGV2aWNlcyBvciBwaW4gc2V0dXAgaXMgdG8gYmUKKyAqIGtlcHQgb3V0IG9mIGRyaXZlcnMgYXMgbXVjaCBhcyBwb3NzaWJsZS4gIEluIHBhcnRpY3VsYXIsIHBpbiBzZXR1cAorICogbWF5IGJlIGhhbmRsZWQgYnkgdGhlIGJvb3QgbG9hZGVyLCBhbmQgZHJpdmVycyBzaG91bGQgZXhwZWN0IGl0IHdpbGwKKyAqIG5vcm1hbGx5IGhhdmUgYmVlbiBkb25lIGJ5IHRoZSB0aW1lIHRoZXkncmUgcHJvYmVkLgorICovCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2luaXRfZGV2aWNlcyh2b2lkKQoreworCS8qIHBsZWFzZSBrZWVwIHRoZXNlIGNhbGxzLCBhbmQgdGhlaXIgaW1wbGVtZW50YXRpb25zIGFib3ZlLAorCSAqIGluIGFscGhhYmV0aWNhbCBvcmRlciBzbyB0aGV5J3JlIGVhc2llciB0byBzb3J0IHRocm91Z2guCisJICovCisJb21hcF9pbml0X2kyYygpOworCW9tYXBfaW5pdF9pcmRhKCk7CisJb21hcF9pbml0X21tYygpOworCW9tYXBfaW5pdF9ydGMoKTsKKwlvbWFwX2luaXRfd2R0KCk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwob21hcF9pbml0X2RldmljZXMpOworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZnBnYS5jCmluZGV4IDdjMDhmNmMuLmFjYTJhMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvZnBnYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZnBnYS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9mcGdhLmMKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvZnBnYS5jCiAgKgogICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIE9NQVAtMTUxMCBJbm5vdmF0b3IgRlBHQQogICoKQEAgLTEwMiw3ICsxMDIsNyBAQAogCSAgICAgZnBnYV9pcnErKywgc3RhdCA+Pj0gMSkgewogCQlpZiAoc3RhdCAmIDEpIHsKIAkJCWQgPSBpcnFfZGVzYyArIGZwZ2FfaXJxOwotCQkJZC0+aGFuZGxlKGZwZ2FfaXJxLCBkLCByZWdzKTsKKwkJCWRlc2NfaGFuZGxlX2lycShmcGdhX2lycSwgZCwgcmVncyk7CiAJCX0KIAl9CiB9CkBAIC0xODEsNyArMTgxLDcgQEAKIAkgKi8KIAlvbWFwX3JlcXVlc3RfZ3BpbygxMyk7CiAJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oMTMsIDEpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDEzLCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOworCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKDEzKSwgSVJRVF9SSVNJTkcpOwogCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKE9NQVAxNTEwX0lOVF9GUEdBLCBpbm5vdmF0b3JfZnBnYV9JUlFfZGVtdXgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMKaW5kZXggMjA3ZGYwZi4uZWI4MjYxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pby5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYwpAQCAtMTksNiArMTksNyBAQAogCiBleHRlcm4gaW50IGNsa19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcF9jaGVja19yZXZpc2lvbih2b2lkKTsKK2V4dGVybiB2b2lkIG9tYXBfc3JhbV9pbml0KHZvaWQpOwogCiAvKgogICogVGhlIG1hY2hpbmUgc3BlY2lmaWMgY29kZSBtYXkgcHJvdmlkZSB0aGUgZXh0cmEgbWFwcGluZyBiZXNpZGVzIHRoZQpAQCAtMzIsNyArMzMsNiBAQAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwNzMwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogIHsgT01BUDczMF9EU1BfQkFTRSwgICAgT01BUDczMF9EU1BfU1RBUlQsICAgIE9NQVA3MzBfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAogIHsgT01BUDczMF9EU1BSRUdfQkFTRSwgT01BUDczMF9EU1BSRUdfU1RBUlQsIE9NQVA3MzBfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAotIHsgT01BUDczMF9TUkFNX0JBU0UsICAgT01BUDczMF9TUkFNX1NUQVJULCAgIE9NQVA3MzBfU1JBTV9TSVpFLCAgIE1UX0RFVklDRSB9CiB9OwogI2VuZGlmCiAKQEAgLTQwLDI3ICs0MCwxMyBAQAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwMTUxMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKICB7IE9NQVAxNTEwX0RTUF9CQVNFLCAgICBPTUFQMTUxMF9EU1BfU1RBUlQsICAgIE9NQVAxNTEwX0RTUF9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKICB7IE9NQVAxNTEwX0RTUFJFR19CQVNFLCBPTUFQMTUxMF9EU1BSRUdfU1RBUlQsIE9NQVAxNTEwX0RTUFJFR19TSVpFLCBNVF9ERVZJQ0UgfSwKLSB7IE9NQVAxNTEwX1NSQU1fQkFTRSwgICBPTUFQMTUxMF9TUkFNX1NUQVJULCAgIE9NQVAxNTEwX1NSQU1fU0laRSwgICBNVF9ERVZJQ0UgfQogfTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDE2MTBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXAxNnh4X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogIHsgT01BUDE2WFhfRFNQX0JBU0UsICAgIE9NQVAxNlhYX0RTUF9TVEFSVCwgICAgT01BUDE2WFhfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAogIHsgT01BUDE2WFhfRFNQUkVHX0JBU0UsIE9NQVAxNlhYX0RTUFJFR19TVEFSVCwgT01BUDE2WFhfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAotIHsgT01BUDE2WFhfU1JBTV9CQVNFLCAgIE9NQVAxNlhYX1NSQU1fU1RBUlQsICAgT01BUDE2MTBfU1JBTV9TSVpFLCAgIE1UX0RFVklDRSB9Ci19OwotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXA1OTEyX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotIHsgT01BUDE2WFhfRFNQX0JBU0UsICAgIE9NQVAxNlhYX0RTUF9TVEFSVCwgICAgT01BUDE2WFhfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAotIHsgT01BUDE2WFhfRFNQUkVHX0JBU0UsIE9NQVAxNlhYX0RTUFJFR19TVEFSVCwgT01BUDE2WFhfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAotLyoKLSAqIFRoZSBPTUFQNTkxMiBoYXMgMjUwa0J5dGUgaW50ZXJuYWwgU1JBTS4gQmVjYXVzZSB0aGUgbWFwcGluZyBpcyBiYXNlZWQgb24gcGFnZQotICogc2l6ZSAoNGtCeXRlKSwgaXQgc2VlbXMgdGhhdCB0aGUgbGFzdCAya0J5dGUgKD0weDgwMCkgb2YgdGhlIDI1MGtCeXRlIGFyZSBub3QgbWFwcGVkLgotICogQWRkIGFkZGl0aW9uYWwgMmtCeXRlICgweDgwMCkgc28gdGhhdCB0aGUgbGFzdCBwYWdlIGlzIG1hcHBlZCBhbmQgdGhlIGxhc3QgMmtCeXRlCi0gKiBjYW4gYmUgdXNlZC4KLSAqLwotIHsgT01BUDE2WFhfU1JBTV9CQVNFLCAgIE9NQVAxNlhYX1NSQU1fU1RBUlQsICAgT01BUDU5MTJfU1JBTV9TSVpFICsgMHg4MDAsICAgTVRfREVWSUNFIH0KIH07CiAjZW5kaWYKIApAQCAtODYsMTQgKzcyLDEzIEBACiAJfQogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLQlpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpIHsKLQkJaW90YWJsZV9pbml0KG9tYXAxNjEwX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDE2MTBfaW9fZGVzYykpOwotCX0KLQlpZiAoY3B1X2lzX29tYXA1OTEyKCkpIHsKLQkJaW90YWJsZV9pbml0KG9tYXA1OTEyX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDU5MTJfaW9fZGVzYykpOworCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgeworCQlpb3RhYmxlX2luaXQob21hcDE2eHhfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMTZ4eF9pb19kZXNjKSk7CiAJfQogI2VuZGlmCiAKKwlvbWFwX3NyYW1faW5pdCgpOworCiAJLyogUkVWSVNJVDogUmVmZXIgdG8gT01BUDU5MTAgRXJyYXRhLCBBZHZpc29yeSBTWVNfMTogIlRpbWVvdXQgQWJvcnQKIAkgKiBvbiBhIFBvc3RlZCBXcml0ZSBpbiB0aGUgVElQQiBCcmlkZ2UiLgogCSAqLwpAQCAtMTA4LDggKzkzLDkgQEAKIC8qCiAgKiBUaGlzIHNob3VsZCBvbmx5IGdldCBjYWxsZWQgZnJvbSBib2FyZCBzcGVjaWZpYyBpbml0CiAgKi8KLXZvaWQgb21hcF9tYXBfY29tbW9uX2lvKHZvaWQpCit2b2lkIF9faW5pdCBvbWFwX21hcF9jb21tb25faW8odm9pZCkKIHsKIAlpZiAoIWluaXRpYWxpemVkKQogCQlfb21hcF9tYXBfaW8oKTsKIH0KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMKaW5kZXggYTExYjZkOC4uMTkyY2U2MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lycS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9pcnEuYworICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYwogICoKICAqIEludGVycnVwdCBoYW5kbGVyIGZvciBhbGwgT01BUCBib2FyZHMKICAqCkBAIC0xNjUsMTAgKzE2NSwxMCBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBvbWFwX2lycV9jaGlwID0gewotCS5hY2sgICAgPSBvbWFwX21hc2tfYWNrX2lycSwKLQkubWFzayAgID0gb21hcF9tYXNrX2lycSwKLQkudW5tYXNrID0gb21hcF91bm1hc2tfaXJxLAotCS53YWtlCT0gb21hcF93YWtlX2lycSwKKwkuYWNrCQk9IG9tYXBfbWFza19hY2tfaXJxLAorCS5tYXNrCQk9IG9tYXBfbWFza19pcnEsCisJLnVubWFzawkJPSBvbWFwX3VubWFza19pcnEsCisJLnNldF93YWtlCT0gb21hcF93YWtlX2lycSwKIH07CiAKIHZvaWQgX19pbml0IG9tYXBfaW5pdF9pcnEodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1oMnAyLWRlYnVnLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jCmluZGV4IGVjMGQ4MjguLmJlMjgzY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1oMnAyLWRlYnVnLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWgycDItZGVidWcuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1oMnAyLWRlYnVnLmMKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1oMnAyLWRlYnVnLmMKICAqCiAgKiBDb3B5cmlnaHQgMjAwMyBieSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQKICAqCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1pbm5vdmF0b3IuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1pbm5vdmF0b3IuYwppbmRleCA4MDQzYjdkLi5jOGZmZDFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaW5ub3ZhdG9yLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWlubm92YXRvci5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLWlubm92YXRvci5jCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaW5ub3ZhdG9yLmMKICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1vc2suYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1vc2suYwppbmRleCA0YTBlOGI5Li4yYzhiZGE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLW9zay5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLW9zay5jCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMKICAqCiAgKiBMRUQgZHJpdmVyIGZvciBPU0ssIGFuZCBvcHRpb25hbGx5IE1pc3RyYWwgUVZHQSwgYm9hcmRzCiAgKi8KQEAgLTY0LDcgKzY0LDcgQEAKIAogc3RhdGljIERFQ0xBUkVfV09SSyh3b3JrLCB0cHNfd29yaywgTlVMTCk7CiAKLSNpZmRlZglDT05GSUdfRkJfT01BUAorI2lmZGVmCUNPTkZJR19PTUFQX09TS19NSVNUUkFMCiAKIC8qIEZvciBub3csIGFsbCBzeXN0ZW0gaW5kaWNhdG9ycyByZXF1aXJlIHRoZSBNaXN0cmFsIGJvYXJkLCBzaW5jZSB0aGF0CiAgKiBMRUQgY2FuIGJlIG1hbmlwdWxhdGVkIHdpdGhvdXQgYSB0YXNrIGNvbnRleHQuICBUaGlzIExFRCBpcyBlaXRoZXIgcmVkLApAQCAtMTI3LDcgKzEyNyw3IEBACiAJCWh3X2xlZF9zdGF0ZSA9IDA7CiAJCWJyZWFrOwogCi0jaWZkZWYJQ09ORklHX0ZCX09NQVAKKyNpZmRlZglDT05GSUdfT01BUF9PU0tfTUlTVFJBTAogCiAJY2FzZSBsZWRfdGltZXI6CiAJCWh3X2xlZF9zdGF0ZSBePSBUSU1FUl9MRUQ7CkBAIC0xNDQsNyArMTQ0LDcgQEAKIAkJbWlzdHJhbF9zZXRsZWQoKTsKIAkJYnJlYWs7CiAKLSNlbmRpZgkvKiBDT05GSUdfRkJfT01BUCAqLworI2VuZGlmCS8qIENPTkZJR19PTUFQX09TS19NSVNUUkFMICovCiAKIAkvKiAiZ3JlZW4iID09IHRwcyBMRUQxIChsZWZ0bW9zdCwgbm9ybWFsbHkgcG93ZXItZ29vZCkKIAkgKiB3b3JrcyBvbmx5IHdpdGggREMgYWRhcHRlciwgbm90IG9uIGJhdHRlcnkgcG93ZXIhCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy5jCmluZGV4IDhhYjIxZmUuLjVjNmIxYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9sZWRzLmMKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy5jCiAgKgogICogT01BUCBMRURzIGRpc3BhdGNoZXIKICAqLwpAQCAtMjAsNyArMjAsOSBAQAogCWlmIChtYWNoaW5lX2lzX29tYXBfaW5ub3ZhdG9yKCkpCiAJCWxlZHNfZXZlbnQgPSBpbm5vdmF0b3JfbGVkc19ldmVudDsKIAotCWVsc2UgaWYgKG1hY2hpbmVfaXNfb21hcF9oMigpIHx8IG1hY2hpbmVfaXNfb21hcF9wZXJzZXVzMigpKQorCWVsc2UgaWYgKG1hY2hpbmVfaXNfb21hcF9oMigpCisJCQl8fCBtYWNoaW5lX2lzX29tYXBfaDMoKQorCQkJfHwgbWFjaGluZV9pc19vbWFwX3BlcnNldXMyKCkpCiAJCWxlZHNfZXZlbnQgPSBoMnAyX2RiZ19sZWRzX2V2ZW50OwogCiAJZWxzZSBpZiAobWFjaGluZV9pc19vbWFwX29zaygpKQpAQCAtMzAsOCArMzIsMTIgQEAKIAkJcmV0dXJuIC0xOwogCiAJaWYgKG1hY2hpbmVfaXNfb21hcF9oMigpCisJCQl8fCBtYWNoaW5lX2lzX29tYXBfaDMoKQogCQkJfHwgbWFjaGluZV9pc19vbWFwX3BlcnNldXMyKCkKLQkJCXx8IG1hY2hpbmVfaXNfb21hcF9vc2soKSkgeworI2lmZGVmCUNPTkZJR19PTUFQX09TS19NSVNUUkFMCisJCQl8fCBtYWNoaW5lX2lzX29tYXBfb3NrKCkKKyNlbmRpZgorCQkJKSB7CiAKIAkJLyogTEVEMS9MRUQyIHBpbnMgY2FuIGJlIHVzZWQgYXMgR1BJTyAoYXMgZG9uZSBoZXJlKSwgb3IgYnkKIAkJICogdGhlIExQRyAod29ya3MgZXZlbiBpbiBkZWVwIHNsZWVwISksIHRvIGRyaXZlIGEgYmljb2xvcgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMKaW5kZXggMjE0ZTVkMS4uNDBjNGY3YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jCkBAIC0yNCw3ICsyNCwxMSBAQAogCiAjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgorI2lmZGVmIENPTkZJR19QTQorI2luY2x1ZGUgPGFzbS9hcmNoL3BtLmg+CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBjbGsgKiB1YXJ0MV9jayA9IE5VTEw7CiBzdGF0aWMgc3RydWN0IGNsayAqIHVhcnQyX2NrID0gTlVMTDsKQEAgLTk0LDcgKzk4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKIAkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJCT0gMCwKKwkuaWQJCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKIAkuZGV2CQkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCiAJfSwKQEAgLTE5Myw2ICsxOTcsODYgQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfT01BUF9TRVJJQUxfV0FLRQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9zZXJpYWxfd2FrZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKiBOZWVkIHRvIGRvIHNvbWV0aGluZyB3aXRoIHNlcmlhbCBwb3J0IHJpZ2h0IGFmdGVyIHdha2UtdXA/ICovCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogUmVyb3V0ZXMgc2VyaWFsIFJYIGxpbmVzIHRvIEdQSU8gbGluZXMgZm9yIHRoZSBkdXJhdGlvbiBvZgorICogc2xlZXAgdG8gYWxsb3cgd2FraW5nIHVwIHRoZSBkZXZpY2UgZnJvbSBzZXJpYWwgcG9ydCBldmVuCisgKiBpbiBkZWVwIHNsZWVwLgorICovCit2b2lkIG9tYXBfc2VyaWFsX3dha2VfdHJpZ2dlcihpbnQgZW5hYmxlKQoreworCWlmICghY3B1X2lzX29tYXAxNnh4KCkpCisJCXJldHVybjsKKworCWlmICh1YXJ0MV9jayAhPSBOVUxMKSB7CisJCWlmIChlbmFibGUpCisJCQlvbWFwX2NmZ19yZWcoVjE0XzE2WFhfR1BJTzM3KTsKKwkJZWxzZQorCQkJb21hcF9jZmdfcmVnKFYxNF8xNlhYX1VBUlQxX1JYKTsKKwl9CisJaWYgKHVhcnQyX2NrICE9IE5VTEwpIHsKKwkJaWYgKGVuYWJsZSkKKwkJCW9tYXBfY2ZnX3JlZyhSOV8xNlhYX0dQSU8xOCk7CisJCWVsc2UKKwkJCW9tYXBfY2ZnX3JlZyhSOV8xNlhYX1VBUlQyX1JYKTsKKwl9CisJaWYgKHVhcnQzX2NrICE9IE5VTEwpIHsKKwkJaWYgKGVuYWJsZSkKKwkJCW9tYXBfY2ZnX3JlZyhMMTRfMTZYWF9HUElPNDkpOworCQllbHNlCisJCQlvbWFwX2NmZ19yZWcoTDE0XzE2WFhfVUFSVDNfUlgpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfc2VyaWFsX3NldF9wb3J0X3dha2V1cChpbnQgZ3Bpb19ucikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gb21hcF9yZXF1ZXN0X2dwaW8oZ3Bpb19ucik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgcmVxdWVzdCBVQVJUIHdha2UgR1BJTzogJWlcbiIsCisJCSAgICAgICBncGlvX25yKTsKKwkJcmV0dXJuOworCX0KKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihncGlvX25yLCAxKTsKKwlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUShncGlvX25yKSwgSVJRVF9SSVNJTkcpOworCXJldCA9IHJlcXVlc3RfaXJxKE9NQVBfR1BJT19JUlEoZ3Bpb19uciksICZvbWFwX3NlcmlhbF93YWtlX2ludGVycnVwdCwKKwkJCSAgMCwgInNlcmlhbCB3YWtldXAiLCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCW9tYXBfZnJlZV9ncGlvKGdwaW9fbnIpOworCQlwcmludGsoS0VSTl9FUlIgIk5vIGludGVycnVwdCBmb3IgVUFSVCB3YWtlIEdQSU86ICVpXG4iLAorCQkgICAgICAgZ3Bpb19ucik7CisJCXJldHVybjsKKwl9CisJZW5hYmxlX2lycV93YWtlKE9NQVBfR1BJT19JUlEoZ3Bpb19ucikpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX3NlcmlhbF93YWtldXBfaW5pdCh2b2lkKQoreworCWlmICghY3B1X2lzX29tYXAxNnh4KCkpCisJCXJldHVybiAwOworCisJaWYgKHVhcnQxX2NrICE9IE5VTEwpCisJCW9tYXBfc2VyaWFsX3NldF9wb3J0X3dha2V1cCgzNyk7CisJaWYgKHVhcnQyX2NrICE9IE5VTEwpCisJCW9tYXBfc2VyaWFsX3NldF9wb3J0X3dha2V1cCgxOCk7CisJaWYgKHVhcnQzX2NrICE9IE5VTEwpCisJCW9tYXBfc2VyaWFsX3NldF9wb3J0X3dha2V1cCg0OSk7CisKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwob21hcF9zZXJpYWxfd2FrZXVwX2luaXQpOworCisjZW5kaWYJLyogQ09ORklHX09NQVBfU0VSSUFMX1dBS0UgKi8KKwogc3RhdGljIGludCBfX2luaXQgb21hcF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc2VyaWFsX2RldmljZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvdGltZS5jCmluZGV4IGQ1NDA1MzkuLjE5MWE5YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvdGltZS5jCkBAIC0yNDcsMTMgKzI0Nyw2IEBACiAjZGVmaW5lIE9NQVBfMzJLX1RJTUVSX1RDUgkJMHgwNAogCiAjZGVmaW5lIE9NQVBfMzJLX1RJQ0tTX1BFUl9IWgkJKDMyNzY4IC8gSFopCi0jaWYgKDMyNzY4ICUgSFopICE9IDAKLS8qIFdlIGNhbm5vdCBpZ25vcmUgbW9kdWxvLgotICogUG90ZW50aWFsIGVycm9yIGNhbiBiZSBhcyBoaWdoIGFzIHNldmVyYWwgcGVyY2VudC4KLSAqLwotI2RlZmluZSBPTUFQXzMyS19USUNLX01PRFVMTwkJKDMyNzY4ICUgSFopCi1zdGF0aWMgdW5zaWduZWQgbW9kdWxvX2NvdW50ID0gMDsgLyogQ291bnRzIDEvSFogdW5pdHMgKi8KLSNlbmRpZgogCiAvKgogICogVFJNIHNheXMgMSAvIEhaID0gKCBUVlIgKyAxKSAvIDMyNzY4LCBzbyBUUlYgPSAoMzI3NjggLyBIWikgLSAxCkBAIC0yOTYsMTMgKzI4OSwyMiBAQAogfQogCiAvKgotICogUm91bmRzIGRvd24gdG8gbmVhcmVzdCB1c2VjCisgKiBSb3VuZHMgZG93biB0byBuZWFyZXN0IHVzZWMuIE5vdGUgdGhhdCB0aGlzIHdpbGwgb3ZlcmZsb3cgZm9yIGxhcmdlciB2YWx1ZXMuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBvbWFwXzMya190aWNrc190b191c2Vjcyh1bnNpZ25lZCBsb25nIHRpY2tzXzMyaykKIHsKIAlyZXR1cm4gKHRpY2tzXzMyayAqIDUqNSo1KjUqNSo1KSA+PiA5OwogfQogCisvKgorICogUm91bmRzIGRvd24gdG8gbmVhcmVzdCBuc2VjLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworb21hcF8zMmtfdGlja3NfdG9fbnNlY3ModW5zaWduZWQgbG9uZyB0aWNrc18zMmspCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpIHRpY2tzXzMyayAqIDEwMDAgKiA1KjUqNSo1KjUqNSA+PiA5OworfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwXzMya19sYXN0X3RpY2sgPSAwOwogCiAvKgpAQCAtMzE1LDYgKzMxNywxNSBAQAogfQogCiAvKgorICogUmV0dXJucyBjdXJyZW50IHRpbWUgZnJvbSBib290IGluIG5zZWNzLiBJdCdzIE9LIGZvciB0aGlzIHRvIHdyYXAKKyAqIGFyb3VuZCBmb3Igbm93LCBhcyBpdCdzIGp1c3QgYSByZWxhdGl2ZSB0aW1lIHN0YW1wLgorICovCit1bnNpZ25lZCBsb25nIGxvbmcgc2NoZWRfY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gb21hcF8zMmtfdGlja3NfdG9fbnNlY3Mob21hcF8zMmtfc3luY190aW1lcl9yZWFkKCkpOworfQorCisvKgogICogVGltZXIgaW50ZXJydXB0IGZvciAzMktIeiB0aW1lci4gV2hlbiBkeW5hbWljIHRpY2sgaXMgZW5hYmxlZCwgdGhpcwogICogZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgZnJvbSBvdGhlciBpbnRlcnJ1cHRzIHRvIHJlbW92ZSBsYXRlbmN5CiAgKiBpc3N1ZXMgd2l0aCBkeW5hbWljIHRpY2suIEluIHRoZSBkeW5hbWljIHRpY2sgY2FzZSwgd2UgbmVlZCB0byBsb2NrCkBAIC0zMzAsMTkgKzM0MSw2IEBACiAJbm93ID0gb21hcF8zMmtfc3luY190aW1lcl9yZWFkKCk7CiAKIAl3aGlsZSAobm93IC0gb21hcF8zMmtfbGFzdF90aWNrID49IE9NQVBfMzJLX1RJQ0tTX1BFUl9IWikgewotI2lmZGVmIE9NQVBfMzJLX1RJQ0tfTU9EVUxPCi0JCS8qIE1vZHVsbyBhZGRpdGlvbiBtYXkgcHV0IG9tYXBfMzJrX2xhc3RfdGljayBhaGVhZCBvZiBub3cKLQkJICogYW5kIGNhdXNlIHVud2FudGVkIHJlcGV0aXRpb24gb2YgdGhlIHdoaWxlIGxvb3AuCi0JCSAqLwotCQlpZiAodW5saWtlbHkobm93IC0gb21hcF8zMmtfbGFzdF90aWNrID09IH4wKSkKLQkJCWJyZWFrOwotCi0JCW1vZHVsb19jb3VudCArPSBPTUFQXzMyS19USUNLX01PRFVMTzsKLQkJaWYgKG1vZHVsb19jb3VudCA+IEhaKSB7Ci0JCQkrK29tYXBfMzJrX2xhc3RfdGljazsKLQkJCW1vZHVsb19jb3VudCAtPSBIWjsKLQkJfQotI2VuZGlmCiAJCW9tYXBfMzJrX2xhc3RfdGljayArPSBPTUFQXzMyS19USUNLU19QRVJfSFo7CiAJCXRpbWVyX3RpY2socmVncyk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQppbmRleCBlZmMyZjY1Li4zM2RhZTk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQpAQCAtMTEsNyArMTEsNyBAQAogb2JqLSQoQ09ORklHX0FSQ0hfTFVCQk9DSykgKz0gbHViYm9jay5vCiBvYmotJChDT05GSUdfTUFDSF9NQUlOU1RPTkUpICs9IG1haW5zdG9uZS5vCiBvYmotJChDT05GSUdfQVJDSF9QWEFfSURQKSArPSBpZHAubwotb2JqLSQoQ09ORklHX1BYQV9TSEFSUF9DN3h4KQkrPSBjb3JnaS5vIGNvcmdpX3NzcC5vIHNzcC5vCitvYmotJChDT05GSUdfUFhBX1NIQVJQX0M3eHgpCSs9IGNvcmdpLm8gY29yZ2lfc3NwLm8gY29yZ2lfbGNkLm8gc3NwLm8KIG9iai0kKENPTkZJR19NQUNIX1BPT0RMRSkJKz0gcG9vZGxlLm8KIAogIyBTdXBwb3J0IGZvciBibGlua3kgbGlnaHRzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYwppbmRleCA4NmI4NjJmLi4wN2I1ZGQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKQEAgLTM5LDcgKzM5LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9tYWNoL3NoYXJwc2xfcGFyYW0uaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvc2Nvb3AuaD4KLSNpbmNsdWRlIDx2aWRlby93MTAwZmIuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIApAQCAtNjAsNiArNTksMTUgQEAKIAkuaW9fb3V0CQk9IENPUkdJX1NDT09QX0lPX09VVCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2Nvb3BfcGNtY2lhX2RldiBjb3JnaV9wY21jaWFfc2Nvb3BbXSA9IHsKK3sKKwkuZGV2ICAgICAgICA9ICZjb3JnaXNjb29wX2RldmljZS5kZXYsCisJLmlycSAgICAgICAgPSBDT1JHSV9JUlFfR1BJT19DRl9JUlEsCisJLmNkX2lycSAgICAgPSBDT1JHSV9JUlFfR1BJT19DRl9DRCwKKwkuY2RfaXJxX3N0ciA9ICJQQ01DSUEwIENEIiwKK30sCit9OworCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvcmdpc2Nvb3BfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzaGFycC1zY29vcCIsCiAJLmlkCQk9IC0xLApAQCAtNzgsNyArODYsNyBAQAogICogYWxzbyB1c2Ugc2Nvb3AgZnVuY3Rpb25zIGFuZCB0aGlzIG1ha2VzIHRoZSBwb3dlciB1cC9kb3duIG9yZGVyCiAgKiB3b3JrIGNvcnJlY3RseS4KICAqLwotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2lzc3BfZGV2aWNlID0geworc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3JnaXNzcF9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gImNvcmdpLXNzcCIsCiAJLmRldgkJPSB7CiAgCQkucGFyZW50ID0gJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwKQEAgLTg4LDM1ICs5Niw2IEBACiAKIAogLyoKLSAqIENvcmdpIHcxMDAgRnJhbWUgQnVmZmVyIERldmljZQotICovCi1zdGF0aWMgc3RydWN0IHcxMDBmYl9tYWNoX2luZm8gY29yZ2lfZmJfaW5mbyA9IHsKLQkudzEwMGZiX3NzcF9zZW5kIAk9IGNvcmdpX3NzcF9sY2R0Z19zZW5kLAotCS5jb21hZGogCQkJPSAtMSwKLQkucGhhZGFkaiAJCQk9IC0xLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb3JnaV9mYl9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAkJPSAweDA4MDAwMDAwLAotCQkuZW5kCQk9IDB4MDhmZmZmZmYsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2lmYl9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gIncxMDBmYiIsCi0JLmlkCQk9IC0xLAotCS5kZXYJCT0gewotIAkJLnBsYXRmb3JtX2RhdGEJPSAmY29yZ2lfZmJfaW5mbywKLSAJCS5wYXJlbnQgPSAmY29yZ2lzc3BfZGV2aWNlLmRldiwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjb3JnaV9mYl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IGNvcmdpX2ZiX3Jlc291cmNlcywKLX07Ci0KLQotLyoKICAqIENvcmdpIEJhY2tsaWdodCBEZXZpY2UKICAqLwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2libF9kZXZpY2UgPSB7CkBAIC0xMjksMjkgKzEwOCwzNSBAQAogCiAKIC8qCisgKiBDb3JnaSBLZXlib2FyZCBEZXZpY2UKKyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2lrYmRfZGV2aWNlID0geworCS5uYW1lCQk9ICJjb3JnaS1rZXlib2FyZCIsCisJLmlkCQk9IC0xLAorfTsKKworCisvKgorICogQ29yZ2kgVG91Y2ggU2NyZWVuIERldmljZQorICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3JnaXRzX2RldmljZSA9IHsKKwkubmFtZQkJPSAiY29yZ2ktdHMiLAorCS5kZXYJCT0geworIAkJLnBhcmVudCA9ICZjb3JnaXNzcF9kZXZpY2UuZGV2LAorCX0sCisJLmlkCQk9IC0xLAorfTsKKworCisvKgogICogTU1DL1NEIERldmljZQogICoKLSAqIFRoZSBjYXJkIGRldGVjdCBpbnRlcnJ1cHQgaXNuJ3QgZGVib3VuY2VkIHNvIHdlIGRlbGF5IGl0IGJ5IEhaLzQKKyAqIFRoZSBjYXJkIGRldGVjdCBpbnRlcnJ1cHQgaXNuJ3QgZGVib3VuY2VkIHNvIHdlIGRlbGF5IGl0IGJ5IDI1MG1zCiAgKiB0byBnaXZlIHRoZSBjYXJkIGEgY2hhbmNlIHRvIGZ1bGx5IGluc2VydC9lamVjdC4KICAqLwotc3RhdGljIHN0cnVjdCBtbWNfZGV0ZWN0IHsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBkZXRlY3RfdGltZXI7Ci0Jdm9pZCAqZGV2aWQ7Ci19IG1tY19kZXRlY3Q7CitzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIGNvcmdpX21jaV9wbGF0Zm9ybV9kYXRhOwogCi1zdGF0aWMgdm9pZCBtbWNfZGV0ZWN0X2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQltbWNfZGV0ZWN0X2NoYW5nZShtbWNfZGV0ZWN0LmRldmlkKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGNvcmdpX21tY19kZXRlY3RfaW50KGludCBpcnEsIHZvaWQgKmRldmlkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQltbWNfZGV0ZWN0LmRldmlkPWRldmlkOwotCW1vZF90aW1lcigmbW1jX2RldGVjdC5kZXRlY3RfdGltZXIsIGppZmZpZXMgKyBIWi80KTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgY29yZ2lfbWNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBpcnFyZXR1cm5fdCAoKnVudXNlZF9kZXRlY3RfaW50KShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGNvcmdpX21jaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaXJxcmV0dXJuX3QgKCpjb3JnaV9kZXRlY3RfaW50KShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksIHZvaWQgKmRhdGEpCiB7CiAJaW50IGVycjsKIApAQCAtMTYxLDExICsxNDYsOSBAQAogCXB4YV9ncGlvX21vZGUoQ09SR0lfR1BJT19uU0RfREVURUNUIHwgR1BJT19JTik7CiAJcHhhX2dwaW9fbW9kZShDT1JHSV9HUElPX1NEX1BXUiB8IEdQSU9fT1VUKTsKIAotCWluaXRfdGltZXIoJm1tY19kZXRlY3QuZGV0ZWN0X3RpbWVyKTsKLQltbWNfZGV0ZWN0LmRldGVjdF90aW1lci5mdW5jdGlvbiA9IG1tY19kZXRlY3RfY2FsbGJhY2s7Ci0JbW1jX2RldGVjdC5kZXRlY3RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmbW1jX2RldGVjdDsKKwljb3JnaV9tY2lfcGxhdGZvcm1fZGF0YS5kZXRlY3RfZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKDI1MCk7CiAKLQllcnIgPSByZXF1ZXN0X2lycShDT1JHSV9JUlFfR1BJT19uU0RfREVURUNULCBjb3JnaV9tbWNfZGV0ZWN0X2ludCwgU0FfSU5URVJSVVBULAorCWVyciA9IHJlcXVlc3RfaXJxKENPUkdJX0lSUV9HUElPX25TRF9ERVRFQ1QsIGNvcmdpX2RldGVjdF9pbnQsIFNBX0lOVEVSUlVQVCwKIAkJCSAgICAgIk1NQyBjYXJkIGRldGVjdCIsIGRhdGEpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjb3JnaV9tY2lfaW5pdDogTU1DL1NEOiBjYW4ndCByZXF1ZXN0IE1NQyBjYXJkIGRldGVjdCBJUlFcbiIpOwpAQCAtMTkwLDIwICsxNzMsMjYgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgY29yZ2lfbWNpX2dldF9ybyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIEdQTFIoQ09SR0lfR1BJT19uU0RfV1ApICYgR1BJT19iaXQoQ09SR0lfR1BJT19uU0RfV1ApOworfQorCiBzdGF0aWMgdm9pZCBjb3JnaV9tY2lfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJZnJlZV9pcnEoQ09SR0lfSVJRX0dQSU9fblNEX0RFVEVDVCwgZGF0YSk7Ci0JZGVsX3RpbWVyKCZtbWNfZGV0ZWN0LmRldGVjdF90aW1lcik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgY29yZ2lfbWNpX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm9jcl9tYXNrCT0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0LAogCS5pbml0IAkJPSBjb3JnaV9tY2lfaW5pdCwKKwkuZ2V0X3JvCQk9IGNvcmdpX21jaV9nZXRfcm8sCiAJLnNldHBvd2VyIAk9IGNvcmdpX21jaV9zZXRwb3dlciwKIAkuZXhpdAkJPSBjb3JnaV9tY2lfZXhpdCwKIH07CiAKIAorCiAvKgogICogVVNCIERldmljZSBDb250cm9sbGVyCiAgKi8KQEAgLTIyOSwxOCArMjE4LDIwIEBACiAJJmNvcmdpc2Nvb3BfZGV2aWNlLAogCSZjb3JnaXNzcF9kZXZpY2UsCiAJJmNvcmdpZmJfZGV2aWNlLAorCSZjb3JnaWtiZF9kZXZpY2UsCiAJJmNvcmdpYmxfZGV2aWNlLAorCSZjb3JnaXRzX2RldmljZSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjb3JnaV9pbml0KHZvaWQpCiB7Ci0JY29yZ2lfZmJfaW5mby5jb21hZGo9c2hhcnBzbF9wYXJhbS5jb21hZGo7Ci0JY29yZ2lfZmJfaW5mby5waGFkYWRqPXNoYXJwc2xfcGFyYW0ucGhhZGFkajsKLQogCXB4YV9ncGlvX21vZGUoQ09SR0lfR1BJT19VU0JfUFVMTFVQIHwgR1BJT19PVVQpOwogIAlweGFfc2V0X3VkY19pbmZvKCZ1ZGNfaW5mbyk7CiAJcHhhX3NldF9tY2lfaW5mbygmY29yZ2lfbWNpX3BsYXRmb3JtX2RhdGEpOwogCisJc2Nvb3BfbnVtID0gMTsKKwlzY29vcF9kZXZzID0gJmNvcmdpX3BjbWNpYV9zY29vcFswXTsKKwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9sY2QuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpX2xjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWMyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9sY2QuYwpAQCAtMCwwICsxLDM5NiBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvdmlkZW8vdzEwMGZiLmMKKyAqCisgKiBDb3JnaSBMQ0QgU3BlY2lmaWMgQ29kZSBmb3IgQVRJIEltYWdlb24gdzEwMCAoV2FsbGFieSkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmljaGFyZCBQdXJkaWUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jb3JnaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NoYXJwc2xfcGFyYW0uaD4KKyNpbmNsdWRlIDx2aWRlby93MTAwZmIuaD4KKworLyogUmVnaXN0ZXIgQWRkcmVzc2VzICovCisjZGVmaW5lIFJFU0NUTF9BRFJTICAgICAweDAwCisjZGVmaW5lIFBIQUNUUkxfQURSUyAgICAweDAxCisjZGVmaW5lIERVVFlDVFJMX0FEUlMgICAweDAyCisjZGVmaW5lIFBPV0VSUkVHMF9BRFJTICAweDAzCisjZGVmaW5lIFBPV0VSUkVHMV9BRFJTICAweDA0CisjZGVmaW5lIEdQT1IzX0FEUlMgICAgICAweDA1CisjZGVmaW5lIFBJQ1RSTF9BRFJTICAgICAweDA2CisjZGVmaW5lIFBPTENUUkxfQURSUyAgICAweDA3CisKKy8qIFJlc2dpc3RlciBCaXQgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUkVTQ1RMX1FWR0EgICAgIDB4MDEKKyNkZWZpbmUgUkVTQ1RMX1ZHQSAgICAgIDB4MDAKKworI2RlZmluZSBQT1dFUjFfVldfT04gICAgMHgwMSAgLyogVlcgU3VwcGx5IEZFVCBPTiAqLworI2RlZmluZSBQT1dFUjFfR1ZTU19PTiAgMHgwMiAgLyogR1ZTUygtOFYpIFBvd2VyIFN1cHBseSBPTiAqLworI2RlZmluZSBQT1dFUjFfVkREX09OICAgMHgwNCAgLyogVkREKDhWKSxTVlNTKC00VikgUG93ZXIgU3VwcGx5IE9OICovCisKKyNkZWZpbmUgUE9XRVIxX1ZXX09GRiAgIDB4MDAgIC8qIFZXIFN1cHBseSBGRVQgT0ZGICovCisjZGVmaW5lIFBPV0VSMV9HVlNTX09GRiAweDAwICAvKiBHVlNTKC04VikgUG93ZXIgU3VwcGx5IE9GRiAqLworI2RlZmluZSBQT1dFUjFfVkREX09GRiAgMHgwMCAgLyogVkREKDhWKSxTVlNTKC00VikgUG93ZXIgU3VwcGx5IE9GRiAqLworCisjZGVmaW5lIFBPV0VSMF9DT01fRENMSyAweDAxICAvKiBDT00gVm9sdGFnZSBEQyBCaWFzIERBQyBTZXJpYWwgRGF0YSBDbG9jayAqLworI2RlZmluZSBQT1dFUjBfQ09NX0RPVVQgMHgwMiAgLyogQ09NIFZvbHRhZ2UgREMgQmlhcyBEQUMgU2VyaWFsIERhdGEgT3V0ICovCisjZGVmaW5lIFBPV0VSMF9EQUNfT04gICAweDA0ICAvKiBEQUMgUG93ZXIgU3VwcGx5IE9OICovCisjZGVmaW5lIFBPV0VSMF9DT01fT04gICAweDA4ICAvKiBDT00gUG93ZXdyIFN1cHBseSBPTiAqLworI2RlZmluZSBQT1dFUjBfVkNDNV9PTiAgMHgxMCAgLyogVkNDNSBQb3dlciBTdXBwbHkgT04gKi8KKworI2RlZmluZSBQT1dFUjBfREFDX09GRiAgMHgwMCAgLyogREFDIFBvd2VyIFN1cHBseSBPRkYgKi8KKyNkZWZpbmUgUE9XRVIwX0NPTV9PRkYgIDB4MDAgIC8qIENPTSBQb3dld3IgU3VwcGx5IE9GRiAqLworI2RlZmluZSBQT1dFUjBfVkNDNV9PRkYgMHgwMCAgLyogVkNDNSBQb3dlciBTdXBwbHkgT0ZGICovCisKKyNkZWZpbmUgUElDVFJMX0lOSVRfU1RBVEUgICAgICAweDAxCisjZGVmaW5lIFBJQ1RSTF9JTklPRkYgICAgICAgICAgMHgwMgorI2RlZmluZSBQSUNUUkxfUE9XRVJfRE9XTiAgICAgIDB4MDQKKyNkZWZpbmUgUElDVFJMX0NPTV9TSUdOQUxfT0ZGICAweDA4CisjZGVmaW5lIFBJQ1RSTF9EQUNfU0lHTkFMX09GRiAgMHgxMAorCisjZGVmaW5lIFBPTENUUkxfU1lOQ19QT0xfRkFMTCAgMHgwMQorI2RlZmluZSBQT0xDVFJMX0VOX1BPTF9GQUxMICAgIDB4MDIKKyNkZWZpbmUgUE9MQ1RSTF9EQVRBX1BPTF9GQUxMICAweDA0CisjZGVmaW5lIFBPTENUUkxfU1lOQ19BQ1RfSCAgICAgMHgwOAorI2RlZmluZSBQT0xDVFJMX0VOX0FDVF9MICAgICAgIDB4MTAKKworI2RlZmluZSBQT0xDVFJMX1NZTkNfUE9MX1JJU0UgIDB4MDAKKyNkZWZpbmUgUE9MQ1RSTF9FTl9QT0xfUklTRSAgICAweDAwCisjZGVmaW5lIFBPTENUUkxfREFUQV9QT0xfUklTRSAgMHgwMAorI2RlZmluZSBQT0xDVFJMX1NZTkNfQUNUX0wgICAgIDB4MDAKKyNkZWZpbmUgUE9MQ1RSTF9FTl9BQ1RfSCAgICAgICAweDAwCisKKyNkZWZpbmUgUEhBQ1RSTF9QSEFTRV9NQU5VQUwgICAweDAxCisjZGVmaW5lIERFRkFVTFRfUEhBRF9RVkdBICAgICAoOSkKKyNkZWZpbmUgREVGQVVMVF9DT01BREogICAgICAgICgxMjUpCisKKy8qCisgKiBUaGlzIGlzIG9ubHkgYSBwc3VlZG8gSTJDIGludGVyZmFjZS4gV2UgY2FuJ3QgdXNlIHRoZSBzdGFuZGFyZCBrZXJuZWwKKyAqIHJvdXRpbmVzIGFzIHRoZSBpbnRlcmZhY2UgaXMgd3JpdGUgb25seS4gV2UganVzdCBhc3N1bWUgdGhlIGRhdGEgaXMgYWNrZWQuLi4KKyAqLworc3RhdGljIHZvaWQgbGNkdGdfc3NwX2kyY19zZW5kKHU4IGRhdGEpCit7CisJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcwX0FEUlMsIGRhdGEpOworCXVkZWxheSgxMCk7Cit9CisKK3N0YXRpYyB2b2lkIGxjZHRnX2kyY19zZW5kX2JpdCh1OCBkYXRhKQoreworCWxjZHRnX3NzcF9pMmNfc2VuZChkYXRhKTsKKwlsY2R0Z19zc3BfaTJjX3NlbmQoZGF0YSB8IFBPV0VSMF9DT01fRENMSyk7CisJbGNkdGdfc3NwX2kyY19zZW5kKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBsY2R0Z19pMmNfc2VuZF9zdGFydCh1OCBiYXNlKQoreworCWxjZHRnX3NzcF9pMmNfc2VuZChiYXNlIHwgUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUKTsKKwlsY2R0Z19zc3BfaTJjX3NlbmQoYmFzZSB8IFBPV0VSMF9DT01fRENMSyk7CisJbGNkdGdfc3NwX2kyY19zZW5kKGJhc2UpOworfQorCitzdGF0aWMgdm9pZCBsY2R0Z19pMmNfc2VuZF9zdG9wKHU4IGJhc2UpCit7CisJbGNkdGdfc3NwX2kyY19zZW5kKGJhc2UpOworCWxjZHRnX3NzcF9pMmNfc2VuZChiYXNlIHwgUE9XRVIwX0NPTV9EQ0xLKTsKKwlsY2R0Z19zc3BfaTJjX3NlbmQoYmFzZSB8IFBPV0VSMF9DT01fRENMSyB8IFBPV0VSMF9DT01fRE9VVCk7Cit9CisKK3N0YXRpYyB2b2lkIGxjZHRnX2kyY19zZW5kX2J5dGUodTggYmFzZSwgdTggZGF0YSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChkYXRhICYgMHg4MCkKKwkJCWxjZHRnX2kyY19zZW5kX2JpdChiYXNlIHwgUE9XRVIwX0NPTV9ET1VUKTsKKwkJZWxzZQorCQkJbGNkdGdfaTJjX3NlbmRfYml0KGJhc2UpOworCQlkYXRhIDw8PSAxOworCX0KK30KKworc3RhdGljIHZvaWQgbGNkdGdfaTJjX3dhaXRfYWNrKHU4IGJhc2UpCit7CisJbGNkdGdfaTJjX3NlbmRfYml0KGJhc2UpOworfQorCitzdGF0aWMgdm9pZCBsY2R0Z19zZXRfY29tbW9uX3ZvbHRhZ2UodTggYmFzZV9kYXRhLCB1OCBkYXRhKQoreworCS8qIFNldCBDb21tb24gVm9sdGFnZSB0byBNNjIzMzJGUCB2aWEgSTJDICovCisJbGNkdGdfaTJjX3NlbmRfc3RhcnQoYmFzZV9kYXRhKTsKKwlsY2R0Z19pMmNfc2VuZF9ieXRlKGJhc2VfZGF0YSwgMHg5Yyk7CisJbGNkdGdfaTJjX3dhaXRfYWNrKGJhc2VfZGF0YSk7CisJbGNkdGdfaTJjX3NlbmRfYnl0ZShiYXNlX2RhdGEsIDB4MDApOworCWxjZHRnX2kyY193YWl0X2FjayhiYXNlX2RhdGEpOworCWxjZHRnX2kyY19zZW5kX2J5dGUoYmFzZV9kYXRhLCBkYXRhKTsKKwlsY2R0Z19pMmNfd2FpdF9hY2soYmFzZV9kYXRhKTsKKwlsY2R0Z19pMmNfc2VuZF9zdG9wKGJhc2VfZGF0YSk7Cit9CisKKy8qIFNldCBQaGFzZSBBZGp1Y3QgKi8KK3N0YXRpYyB2b2lkIGxjZHRnX3NldF9waGFkYWRqKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCit7CisJaW50IGFkajsKKwlzd2l0Y2gocGFyLT54cmVzKSB7CisJCWNhc2UgNDgwOgorCQljYXNlIDY0MDoKKwkJCS8qIFNldHRpbmcgZm9yIFZHQSAqLworCQkJYWRqID0gc2hhcnBzbF9wYXJhbS5waGFkYWRqOworCQkJaWYgKGFkaiA8IDApIHsKKwkJCQlhZGogPSBQSEFDVFJMX1BIQVNFX01BTlVBTDsKKwkJCX0gZWxzZSB7CisJCQkJYWRqID0gKChhZGogJiAweDBmKSA8PCAxKSB8IFBIQUNUUkxfUEhBU0VfTUFOVUFMOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjQwOgorCQljYXNlIDMyMDoKKwkJZGVmYXVsdDoKKwkJCS8qIFNldHRpbmcgZm9yIFFWR0EgKi8KKwkJCWFkaiA9IChERUZBVUxUX1BIQURfUVZHQSA8PCAxKSB8IFBIQUNUUkxfUEhBU0VfTUFOVUFMOworCQkJYnJlYWs7CisJfQorCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUEhBQ1RSTF9BRFJTLCBhZGopOworfQorCitzdGF0aWMgaW50IGxjZF9pbml0ZWQ7CisKK3N0YXRpYyB2b2lkIGxjZHRnX2h3X2luaXQoc3RydWN0IHcxMDBmYl9wYXIgKnBhcikKK3sKKwlpZiAoIWxjZF9pbml0ZWQpIHsKKwkJaW50IGNvbWFkajsKKworCQkvKiBJbml0aWFsaXplIEludGVybmFsIExvZ2ljICYgUG9ydCAqLworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQSUNUUkxfQURSUywgUElDVFJMX1BPV0VSX0RPV04gfCBQSUNUUkxfSU5JT0ZGIHwgUElDVFJMX0lOSVRfU1RBVEUKKwkgIAkJCXwgUElDVFJMX0NPTV9TSUdOQUxfT0ZGIHwgUElDVFJMX0RBQ19TSUdOQUxfT0ZGKTsKKworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQT1dFUlJFRzBfQURSUywgUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUIHwgUE9XRVIwX0RBQ19PRkYKKwkJCQl8IFBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT0ZGKTsKKworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQT1dFUlJFRzFfQURSUywgUE9XRVIxX1ZXX09GRiB8IFBPV0VSMV9HVlNTX09GRiB8IFBPV0VSMV9WRERfT0ZGKTsKKworCQkvKiBWREQoKzhWKSwgU1ZTUygtNFYpIE9OICovCisJCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMV9BRFJTLCBQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT0ZGIHwgUE9XRVIxX1ZERF9PTik7CisJCW1kZWxheSgzKTsKKworCQkvKiBEQUMgT04gKi8KKwkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcwX0FEUlMsIFBPV0VSMF9DT01fRENMSyB8IFBPV0VSMF9DT01fRE9VVCB8IFBPV0VSMF9EQUNfT04KKwkJCQl8IFBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT0ZGKTsKKworCQkvKiBJTklCID0gSCwgSU5JID0gTCAgKi8KKwkJLyogUElDVExbMF0gPSBIICwgUElDVExbMV0gPSBQSUNUTFsyXSA9IFBJQ1RMWzRdID0gTCAqLworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQSUNUUkxfQURSUywgUElDVFJMX0lOSVRfU1RBVEUgfCBQSUNUUkxfQ09NX1NJR05BTF9PRkYpOworCisJCS8qIFNldCBDb21tb24gVm9sdGFnZSAqLworCQljb21hZGogPSBzaGFycHNsX3BhcmFtLmNvbWFkajsKKwkJaWYgKGNvbWFkaiA8IDApCisJCQljb21hZGogPSBERUZBVUxUX0NPTUFESjsKKwkJbGNkdGdfc2V0X2NvbW1vbl92b2x0YWdlKChQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PRkYpLCBjb21hZGopOworCisJCS8qIFZDQzUgT04sIERBQyBPTiAqLworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQT1dFUlJFRzBfQURSUywgUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUIHwgUE9XRVIwX0RBQ19PTiB8CisJCQkJUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PTik7CisKKwkJLyogR1ZTUygtOFYpIE9OLCBWREQgT04gKi8KKwkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcxX0FEUlMsIFBPV0VSMV9WV19PRkYgfCBQT1dFUjFfR1ZTU19PTiB8IFBPV0VSMV9WRERfT04pOworCQltZGVsYXkoMik7CisKKwkJLyogQ09NIFNJR05BTCBPTiAoUElDVExbM10gPSBMKSAqLworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQSUNUUkxfQURSUywgUElDVFJMX0lOSVRfU1RBVEUpOworCisJCS8qIENPTSBPTiwgREFDIE9OLCBWQ0M1X09OICovCisJCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfQ09NX0RDTEsgfCBQT1dFUjBfQ09NX0RPVVQgfCBQT1dFUjBfREFDX09OCisJCQkJfCBQT1dFUjBfQ09NX09OIHwgUE9XRVIwX1ZDQzVfT04pOworCisJCS8qIFZXIE9OLCBHVlNTIE9OLCBWREQgT04gKi8KKwkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcxX0FEUlMsIFBPV0VSMV9WV19PTiB8IFBPV0VSMV9HVlNTX09OIHwgUE9XRVIxX1ZERF9PTik7CisKKwkJLyogU2lnbmFscyBvdXRwdXQgZW5hYmxlICovCisJCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBJQ1RSTF9BRFJTLCAwKTsKKworCQkvKiBTZXQgUGhhc2UgQWRqdWN0ICovCisJCWxjZHRnX3NldF9waGFkYWRqKHBhcik7CisKKwkJLyogSW5pdGlhbGl6ZSBmb3IgSW5wdXQgU2lnbmFscyBmcm9tIEFUSSAqLworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQT0xDVFJMX0FEUlMsIFBPTENUUkxfU1lOQ19QT0xfUklTRSB8IFBPTENUUkxfRU5fUE9MX1JJU0UKKwkJCQl8IFBPTENUUkxfREFUQV9QT0xfUklTRSB8IFBPTENUUkxfU1lOQ19BQ1RfTCB8IFBPTENUUkxfRU5fQUNUX0gpOworCQl1ZGVsYXkoMTAwMCk7CisKKwkJbGNkX2luaXRlZD0xOworCX0gZWxzZSB7CisJCWxjZHRnX3NldF9waGFkYWRqKHBhcik7CisJfQorCisJc3dpdGNoKHBhci0+eHJlcykgeworCQljYXNlIDQ4MDoKKwkJY2FzZSA2NDA6CisJCQkvKiBTZXQgTGNkIFJlc29sdXRpb24gKFZHQSkgKi8KKwkJCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFJFU0NUTF9BRFJTLCBSRVNDVExfVkdBKTsKKwkJCWJyZWFrOworCQljYXNlIDI0MDoKKwkJY2FzZSAzMjA6CisJCWRlZmF1bHQ6CisJCQkvKiBTZXQgTGNkIFJlc29sdXRpb24gKFFWR0EpICovCisJCQljb3JnaV9zc3BfbGNkdGdfc2VuZChSRVNDVExfQURSUywgUkVTQ1RMX1FWR0EpOworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBsY2R0Z19zdXNwZW5kKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCit7CisJLyogNjBIeiB4IDIgZnJhbWUgPSAxNi43bXNlYyB4IDIgPSAzMy40IG1zZWMgKi8KKwltZGVsYXkoMzQpOworCisJLyogKDEpVlcgT0ZGICovCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcxX0FEUlMsIFBPV0VSMV9WV19PRkYgfCBQT1dFUjFfR1ZTU19PTiB8IFBPV0VSMV9WRERfT04pOworCisJLyogKDIpQ09NIE9GRiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBJQ1RSTF9BRFJTLCBQSUNUUkxfQ09NX1NJR05BTF9PRkYpOworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PTik7CisKKwkvKiAoMylTZXQgQ29tbW9uIFZvbHRhZ2UgQmlhcyAwViAqLworCWxjZHRnX3NldF9jb21tb25fdm9sdGFnZShQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PTiwgMCk7CisKKwkvKiAoNClHVlNTIE9GRiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMV9BRFJTLCBQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT0ZGIHwgUE9XRVIxX1ZERF9PTik7CisKKwkvKiAoNSlWQ0M1IE9GRiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PRkYpOworCisJLyogKDYpU2V0IFBEV04sIElOSU9GRiwgREFDT0ZGICovCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUElDVFJMX0FEUlMsIFBJQ1RSTF9JTklPRkYgfCBQSUNUUkxfREFDX1NJR05BTF9PRkYgfAorCQkJUElDVFJMX1BPV0VSX0RPV04gfCBQSUNUUkxfQ09NX1NJR05BTF9PRkYpOworCisJLyogKDcpREFDIE9GRiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfREFDX09GRiB8IFBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT0ZGKTsKKworCS8qICg4KVZERCBPRkYgKi8KKwljb3JnaV9zc3BfbGNkdGdfc2VuZChQT1dFUlJFRzFfQURSUywgUE9XRVIxX1ZXX09GRiB8IFBPV0VSMV9HVlNTX09GRiB8IFBPV0VSMV9WRERfT0ZGKTsKKworCWxjZF9pbml0ZWQgPSAwOworfQorCitzdGF0aWMgc3RydWN0IHcxMDBfdGdfaW5mbyBjb3JnaV9sY2R0Z19pbmZvID0geworCS5jaGFuZ2U9bGNkdGdfaHdfaW5pdCwKKwkuc3VzcGVuZD1sY2R0Z19zdXNwZW5kLAorCS5yZXN1bWU9bGNkdGdfaHdfaW5pdCwKK307CisKKy8qCisgKiBDb3JnaSB3MTAwIEZyYW1lIEJ1ZmZlciBEZXZpY2UKKyAqLworCitzdGF0aWMgc3RydWN0IHcxMDBfbWVtX2luZm8gY29yZ2lfZmJfbWVtID0geworCS5leHRfY250bCAgICAgICAgICA9IDB4MDAwNDAwMDMsCisJLnNkcmFtX21vZGVfcmVnICAgID0gMHgwMDY1MDAyMSwKKwkuZXh0X3RpbWluZ19jbnRsICAgPSAweDEwMDAyYTRhLAorCS5pb19jbnRsICAgICAgICAgICA9IDB4N2ZmODcwMTIsCisJLnNpemUgICAgICAgICAgICAgID0gMHgxZmZmZmYsCit9OworCitzdGF0aWMgc3RydWN0IHcxMDBfZ2VuX3JlZ3MgY29yZ2lfZmJfcmVncyA9IHsKKwkubGNkX2Zvcm1hdCAgICA9IDB4MDAwMDAwMDMsCisJLmxjZGRfY250bDEgICAgPSAweDAxQ0MwMDAwLAorCS5sY2RkX2NudGwyICAgID0gMHgwMDAzRkZGRiwKKwkuZ2VubGNkX2NudGwxICA9IDB4MDBGRkZGMEQsCisJLmdlbmxjZF9jbnRsMiAgPSAweDAwM0YzMDAzLAorCS5nZW5sY2RfY250bDMgID0gMHgwMDAxMDJhYSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdzEwMF9ncGlvX3JlZ3MgY29yZ2lfZmJfZ3BpbyA9IHsKKwkuaW5pdF9kYXRhMSAgID0gMHgwMDAwMDBiZiwKKwkuaW5pdF9kYXRhMiAgID0gMHgwMDAwMDAwMCwKKwkuZ3Bpb19kaXIxICAgID0gMHgwMDAwMDAwMCwKKwkuZ3Bpb19vZTEgICAgID0gMHgwM2MwZmVmZiwKKwkuZ3Bpb19kaXIyICAgID0gMHgwMDAwMDAwMCwKKwkuZ3Bpb19vZTIgICAgID0gMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdzEwMF9tb2RlIGNvcmdpX2ZiX21vZGVzW10gPSB7Cit7CisJLnhyZXMgICAgICAgICAgICA9IDQ4MCwKKwkueXJlcyAgICAgICAgICAgID0gNjQwLAorCS5sZWZ0X21hcmdpbiAgICAgPSAweDU2LAorCS5yaWdodF9tYXJnaW4gICAgPSAweDU1LAorCS51cHBlcl9tYXJnaW4gICAgPSAweDAzLAorCS5sb3dlcl9tYXJnaW4gICAgPSAweDAwLAorCS5jcnRjX3NzICAgICAgICAgPSAweDgyMzYwMDU2LAorCS5jcnRjX2xzICAgICAgICAgPSAweEEwMjgwMDAwLAorCS5jcnRjX2dzICAgICAgICAgPSAweDgwMjgwMDI4LAorCS5jcnRjX3Zwb3NfZ3MgICAgPSAweDAyODMwMDAyLAorCS5jcnRjX3JldiAgICAgICAgPSAweDAwNDAwMDA4LAorCS5jcnRjX2RjbGsgICAgICAgPSAweEEwMDAwMDAwLAorCS5jcnRjX2djbGsgICAgICAgPSAweDgwMTUwMTBGLAorCS5jcnRjX2dvZSAgICAgICAgPSAweDgwMTAwMTEwLAorCS5jcnRjX3BzMV9hY3RpdmUgPSAweDQxMDYwMDEwLAorCS5wbGxfZnJlcSAgICAgICAgPSA3NSwKKwkuZmFzdF9wbGxfZnJlcSAgID0gMTAwLAorCS5zeXNjbGtfc3JjICAgICAgPSBDTEtfU1JDX1BMTCwKKwkuc3lzY2xrX2RpdmlkZXIgID0gMCwKKwkucGl4Y2xrX3NyYyAgICAgID0gQ0xLX1NSQ19QTEwsCisJLnBpeGNsa19kaXZpZGVyICA9IDIsCisJLnBpeGNsa19kaXZpZGVyX3JvdGF0ZWQgPSA2LAorfSx7CisJLnhyZXMgICAgICAgICAgICA9IDI0MCwKKwkueXJlcyAgICAgICAgICAgID0gMzIwLAorCS5sZWZ0X21hcmdpbiAgICAgPSAweDI3LAorCS5yaWdodF9tYXJnaW4gICAgPSAweDJlLAorCS51cHBlcl9tYXJnaW4gICAgPSAweDAxLAorCS5sb3dlcl9tYXJnaW4gICAgPSAweDAwLAorCS5jcnRjX3NzICAgICAgICAgPSAweDgxMTcwMDI3LAorCS5jcnRjX2xzICAgICAgICAgPSAweEEwMTQwMDAwLAorCS5jcnRjX2dzICAgICAgICAgPSAweEMwMTQwMDE0LAorCS5jcnRjX3Zwb3NfZ3MgICAgPSAweDAwMDEwMTQxLAorCS5jcnRjX3JldiAgICAgICAgPSAweDAwNDAwMDA4LAorCS5jcnRjX2RjbGsgICAgICAgPSAweEEwMDAwMDAwLAorCS5jcnRjX2djbGsgICAgICAgPSAweDgwMTUwMTBGLAorCS5jcnRjX2dvZSAgICAgICAgPSAweDgwMTAwMTEwLAorCS5jcnRjX3BzMV9hY3RpdmUgPSAweDQxMDYwMDEwLAorCS5wbGxfZnJlcSAgICAgICAgPSAwLAorCS5mYXN0X3BsbF9mcmVxICAgPSAwLAorCS5zeXNjbGtfc3JjICAgICAgPSBDTEtfU1JDX1hUQUwsCisJLnN5c2Nsa19kaXZpZGVyICA9IDAsCisJLnBpeGNsa19zcmMgICAgICA9IENMS19TUkNfWFRBTCwKKwkucGl4Y2xrX2RpdmlkZXIgID0gMSwKKwkucGl4Y2xrX2RpdmlkZXJfcm90YXRlZCA9IDEsCit9LAorCit9OworCitzdGF0aWMgc3RydWN0IHcxMDBmYl9tYWNoX2luZm8gY29yZ2lfZmJfaW5mbyA9IHsKKwkudGcgICAgICAgICA9ICZjb3JnaV9sY2R0Z19pbmZvLAorCS5pbml0X21vZGUgID0gSU5JVF9NT0RFX1JPVEFURUQsCisJLm1lbSAgICAgICAgPSAmY29yZ2lfZmJfbWVtLAorCS5yZWdzICAgICAgID0gJmNvcmdpX2ZiX3JlZ3MsCisJLm1vZGVsaXN0ICAgPSAmY29yZ2lfZmJfbW9kZXNbMF0sCisJLm51bV9tb2RlcyAgPSAyLAorCS5ncGlvICAgICAgID0gJmNvcmdpX2ZiX2dwaW8sCisJLnh0YWxfZnJlcSAgPSAxMjUwMDAwMCwKKwkueHRhbF9kYmwgICA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvcmdpX2ZiX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICAgPSAweDA4MDAwMDAwLAorCQkuZW5kICAgICA9IDB4MDhmZmZmZmYsCisJCS5mbGFncyAgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2lmYl9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gIncxMDBmYiIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNvcmdpX2ZiX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gY29yZ2lfZmJfcmVzb3VyY2VzLAorCS5kZXYgICAgICAgICAgICA9IHsKKyAJCS5wbGF0Zm9ybV9kYXRhID0gJmNvcmdpX2ZiX2luZm8sCisgCQkucGFyZW50ID0gJmNvcmdpc3NwX2RldmljZS5kZXYsCisJfSwKKworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpX3NzcC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2lfc3NwLmMKaW5kZXggOGNjZmZiYS4uMzY2YTliZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2lfc3NwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2lfc3NwLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9jb3JnaS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CiAKLXN0YXRpYyBzcGlubG9ja190IGNvcmdpX3NzcF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhjb3JnaV9zc3BfbG9jayk7CiBzdGF0aWMgc3RydWN0IHNzcF9kZXYgY29yZ2lfc3NwX2RldjsKIHN0YXRpYyBzdHJ1Y3Qgc3NwX3N0YXRlIGNvcmdpX3NzcF9zdGF0ZTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaXJxLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9pcnEuYwppbmRleCBmM2NhYzQzLi41MzliNTk2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pcnEuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJLmFjawkJPSBweGFfYWNrX2xvd19ncGlvLAogCS5tYXNrCQk9IHB4YV9tYXNrX2xvd19pcnEsCiAJLnVubWFzawkJPSBweGFfdW5tYXNrX2xvd19pcnEsCi0JLnR5cGUJCT0gcHhhX2dwaW9faXJxX3R5cGUsCisJLnNldF90eXBlCT0gcHhhX2dwaW9faXJxX3R5cGUsCiB9OwogCiAvKgpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJCQltYXNrID4+PSAyOwogCQkJZG8gewogCQkJCWlmIChtYXNrICYgMSkKLQkJCQkJZGVzYy0+aGFuZGxlKGlycSwgZGVzYywgcmVncyk7CisJCQkJCWRlc2NfaGFuZGxlX2lycShpcnEsIGRlc2MsIHJlZ3MpOwogCQkJCWlycSsrOwogCQkJCWRlc2MrKzsKIAkJCQltYXNrID4+PSAxOwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CiAJCQlkbyB7CiAJCQkJaWYgKG1hc2sgJiAxKQotCQkJCQlkZXNjLT5oYW5kbGUoaXJxLCBkZXNjLCByZWdzKTsKKwkJCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYywgcmVncyk7CiAJCQkJaXJxKys7CiAJCQkJZGVzYysrOwogCQkJCW1hc2sgPj49IDE7CkBAIC0xODcsNyArMTg3LDcgQEAKIAkJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKIAkJCWRvIHsKIAkJCQlpZiAobWFzayAmIDEpCi0JCQkJCWRlc2MtPmhhbmRsZShpcnEsIGRlc2MsIHJlZ3MpOworCQkJCQlkZXNjX2hhbmRsZV9pcnEoaXJxLCBkZXNjLCByZWdzKTsKIAkJCQlpcnErKzsKIAkJCQlkZXNjKys7CiAJCQkJbWFzayA+Pj0gMTsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQkJZGVzYyA9IGlycV9kZXNjICsgaXJxOwogCQkJZG8gewogCQkJCWlmIChtYXNrICYgMSkKLQkJCQkJZGVzYy0+aGFuZGxlKGlycSwgZGVzYywgcmVncyk7CisJCQkJCWRlc2NfaGFuZGxlX2lycShpcnEsIGRlc2MsIHJlZ3MpOwogCQkJCWlycSsrOwogCQkJCWRlc2MrKzsKIAkJCQltYXNrID4+PSAxOwpAQCAtMjQxLDcgKzI0MSw3IEBACiAJLmFjawkJPSBweGFfYWNrX211eGVkX2dwaW8sCiAJLm1hc2sJCT0gcHhhX21hc2tfbXV4ZWRfZ3BpbywKIAkudW5tYXNrCQk9IHB4YV91bm1hc2tfbXV4ZWRfZ3BpbywKLQkudHlwZQkJPSBweGFfZ3Bpb19pcnFfdHlwZSwKKwkuc2V0X3R5cGUJPSBweGFfZ3Bpb19pcnFfdHlwZSwKIH07CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCmluZGV4IDYzMDk4NTMuLjkyM2Y2ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAkJaWYgKGxpa2VseShwZW5kaW5nKSkgewogCQkJaXJxID0gTFVCQk9DS19JUlEoMCkgKyBfX2ZmcyhwZW5kaW5nKTsKIAkJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQkJCWRlc2MtPmhhbmRsZShpcnEsIGRlc2MsIHJlZ3MpOworCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYywgcmVncyk7CiAJCX0KIAkJcGVuZGluZyA9IExVQl9JUlFfU0VUX0NMUiAmIGx1YmJvY2tfaXJxX2VuYWJsZWQ7CiAJfSB3aGlsZSAocGVuZGluZyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCmluZGV4IDgyN2I3YjUuLjg1ZmRiNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCkBAIC03Miw3ICs3Miw3IEBACiAJCWlmIChsaWtlbHkocGVuZGluZykpIHsKIAkJCWlycSA9IE1BSU5TVE9ORV9JUlEoMCkgKyBfX2ZmcyhwZW5kaW5nKTsKIAkJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQkJCWRlc2MtPmhhbmRsZShpcnEsIGRlc2MsIHJlZ3MpOworCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYywgcmVncyk7CiAJCX0KIAkJcGVuZGluZyA9IE1TVF9JTlRTRVRDTFIgJiBtYWluc3RvbmVfaXJxX2VuYWJsZWQ7CiAJfSB3aGlsZSAocGVuZGluZyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jCmluZGV4IDBlNGY2ZmEuLjQ3Y2ZiOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jCkBAIC02Miw2ICs2MiwxNSBAQAogCS5yZXNvdXJjZQk9IHBvb2RsZV9zY29vcF9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHNjb29wX3BjbWNpYV9kZXYgcG9vZGxlX3BjbWNpYV9zY29vcFtdID0geworeworCS5kZXYgICAgICAgID0gJnBvb2RsZV9zY29vcF9kZXZpY2UuZGV2LAorCS5pcnEgICAgICAgID0gUE9PRExFX0lSUV9HUElPX0NGX0lSUSwKKwkuY2RfaXJxICAgICA9IFBPT0RMRV9JUlFfR1BJT19DRl9DRCwKKwkuY2RfaXJxX3N0ciA9ICJQQ01DSUEwIENEIiwKK30sCit9OworCiAKIC8qIExvQ29NbyBkZXZpY2UgKi8KIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbG9jb21vX3Jlc291cmNlc1tdID0gewpAQCAtMTQ3LDYgKzE1Niw5IEBACiAKIAlzZXRfcHhhX2ZiX2luZm8oJnBvb2RsZV9mYl9pbmZvKTsKIAorCXNjb29wX251bSA9IDE7CisJc2Nvb3BfZGV2cyA9ICZwb29kbGVfcGNtY2lhX3Njb29wWzBdOworCiAJcmV0ID0gcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJwb29kbGU6IFVuYWJsZSB0byByZWdpc3RlciBMb0NvTW8gZGV2aWNlXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYwppbmRleCA2ZTUyMDIxLi43ZGFkM2YxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvdGltZS5jCkBAIC03MCw2ICs3MCwxMSBAQAogCXJldHVybiB1c2VjOwogfQogCisjaWZkZWYgQ09ORklHX05PX0lETEVfSFoKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluaXRpYWxfbWF0Y2g7CitzdGF0aWMgaW50IG1hdGNoX3Bvc3BvbmVkOworI2VuZGlmCisKIHN0YXRpYyBpcnFyZXR1cm5fdAogcHhhX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtNzcsMTEgKzgyLDE5IEBACiAKIAl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKIAorI2lmZGVmIENPTkZJR19OT19JRExFX0haCisJaWYgKG1hdGNoX3Bvc3BvbmVkKSB7CisJCW1hdGNoX3Bvc3BvbmVkID0gMDsKKwkJT1NNUjAgPSBpbml0aWFsX21hdGNoOworCX0KKyNlbmRpZgorCiAJLyogTG9vcCB1bnRpbCB3ZSBnZXQgYWhlYWQgb2YgdGhlIGZyZWUgcnVubmluZyB0aW1lci4KIAkgKiBUaGlzIGVuc3VyZXMgYW4gZXhhY3QgY2xvY2sgdGljayBjb3VudCBhbmQgdGltZSBhY2N1cmFjeS4KLQkgKiBJUlFzIGFyZSBkaXNhYmxlZCBpbnNpZGUgdGhlIGxvb3AgdG8gZW5zdXJlIGNvaGVyZW5jZSBiZXR3ZWVuCi0JICogbG9zdF90aWNrcyAodXBkYXRlZCBpbiBkb190aW1lcigpKSBhbmQgdGhlIG1hdGNoIHJlZyB2YWx1ZSwgc28gd2UKLQkgKiBjYW4gdXNlIGRvX2dldHRpbWVvZmRheSgpIGZyb20gaW50ZXJydXB0IGhhbmRsZXJzLgorCSAqIFNpbmNlIElSUXMgYXJlIGRpc2FibGVkIGF0IHRoaXMgcG9pbnQsIGNvaGVyZW5jZSBiZXR3ZWVuCisJICogbG9zdF90aWNrcyh1cGRhdGVkIGluIGRvX3RpbWVyKCkpIGFuZCB0aGUgbWF0Y2ggcmVnIHZhbHVlIGlzCisJICogZW5zdXJlZCwgaGVuY2Ugd2UgY2FuIHVzZSBkb19nZXR0aW1lb2ZkYXkoKSBmcm9tIGludGVycnVwdAorCSAqIGhhbmRsZXJzLgogCSAqCiAJICogSEFDSyBBTEVSVDogaXQgc2VlbXMgdGhhdCB0aGUgUFhBIHRpbWVyIHJlZ3MgYXJlbid0IHVwZGF0ZWQgcmlnaHQKIAkgKiBhd2F5IGluIGFsbCBjYXNlcyB3aGVuIGEgd3JpdGUgb2NjdXJzLiAgV2UgdGhlcmVmb3JlIGNvbXBhcmUgd2l0aApAQCAtMTI2LDYgKzEzOSw0MiBAQAogCU9TQ1IgPSAwOwkJLyogaW5pdGlhbGl6ZSBmcmVlLXJ1bm5pbmcgdGltZXIsIGZvcmNlIGZpcnN0IG1hdGNoICovCiB9CiAKKyNpZmRlZiBDT05GSUdfTk9fSURMRV9IWgorc3RhdGljIGludCBweGFfZHluX3RpY2tfZW5hYmxlX2Rpc2FibGUodm9pZCkKK3sKKwkvKiBub3RoaW5nIHRvIGRvICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB4YV9keW5fdGlja19yZXByb2dyYW0odW5zaWduZWQgbG9uZyB0aWNrcykKK3sKKwlpZiAodGlja3MgPiAxKSB7CisJCWluaXRpYWxfbWF0Y2ggPSBPU01SMDsKKwkJT1NNUjAgPSBpbml0aWFsX21hdGNoICsgdGlja3MgKiBMQVRDSDsKKwkJbWF0Y2hfcG9zcG9uZWQgPSAxOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90CitweGFfZHluX3RpY2tfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChtYXRjaF9wb3Nwb25lZCkgeworCQltYXRjaF9wb3Nwb25lZCA9IDA7CisJCU9TTVIwID0gaW5pdGlhbF9tYXRjaDsKKwkJaWYgKCAoc2lnbmVkIGxvbmcpKGluaXRpYWxfbWF0Y2ggLSBPU0NSKSA8PSA4ICkKKwkJCXJldHVybiBweGFfdGltZXJfaW50ZXJydXB0KGlycSwgZGV2X2lkLCByZWdzKTsKKwl9CisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgc3RydWN0IGR5bl90aWNrX3RpbWVyIHB4YV9keW5fdGljayA9IHsKKwkuZW5hYmxlCQk9IHB4YV9keW5fdGlja19lbmFibGVfZGlzYWJsZSwKKwkuZGlzYWJsZQk9IHB4YV9keW5fdGlja19lbmFibGVfZGlzYWJsZSwKKwkucmVwcm9ncmFtCT0gcHhhX2R5bl90aWNrX3JlcHJvZ3JhbSwKKwkuaGFuZGxlcgk9IHB4YV9keW5fdGlja19oYW5kbGVyLAorfTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBvc21yWzRdLCBvaWVyOwogCkBAIC0xNjEsNCArMjEwLDcgQEAKIAkuc3VzcGVuZAk9IHB4YV90aW1lcl9zdXNwZW5kLAogCS5yZXN1bWUJCT0gcHhhX3RpbWVyX3Jlc3VtZSwKIAkub2Zmc2V0CQk9IHB4YV9nZXR0aW1lb2Zmc2V0LAorI2lmZGVmIENPTkZJR19OT19JRExFX0haCisJLmR5bl90aWNrCT0gJnB4YV9keW5fdGljaywKKyNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcnBjL3Jpc2NwYy5jIGIvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMKaW5kZXggYTEwMjY4Ni4uZTM1ODdlZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAwLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZwppbmRleCBkNGQwM2QwLi4wNjgwN2M2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZwpAQCAtMiw2ICsyLDEzIEBACiAKIG1lbnUgIlMzQzI0WFggSW1wbGVtZW50YXRpb25zIgogCitjb25maWcgTUFDSF9BTlVCSVMKKwlib29sICJTaW10ZWMgRWxlY3Ryb25pY3MgQU5VQklTIgorCXNlbGVjdCBDUFVfUzNDMjQ0MAorCWhlbHAKKwkgIFNheSBZIGdlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgU2ltdGVjIEVsZWN0cm9uaWNzIEFOVUJJUworCSAgZGV2ZWxvcG1lbnQgc3lzdGVtCisKIGNvbmZpZyBBUkNIX0JBU1QKIAlib29sICJTaW10ZWMgRWxlY3Ryb25pY3MgQkFTVCAoRUIyNDEwSVRYKSIKIAlzZWxlY3QgQ1BVX1MzQzI0MTAKQEAgLTExLDYgKzE4LDE0IEBACiAKIAkgIFByb2R1Y3QgcGFnZTogPGh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL0VCMjQxMElUWC8+LgogCitjb25maWcgQkFTVF9QQzEwNF9JUlEKKwlib29sICJCQVNUIFBDMTA0IElSUSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9CQVNUCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkJaGVyZSB0byBlbmFibGUgdGhlIFBDMTA0IElSUSByb3V0aW5nIG9uIHRoZQorCSAgU2ltdGVjIEJBU1QgKEVCMjQxMElUWCkKKwogY29uZmlnIEFSQ0hfSDE5NDAKIAlib29sICJJUEFRIEgxOTQwIgogCXNlbGVjdCBDUFVfUzNDMjQxMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCmluZGV4IDU1ZWQ3YzcuLmI0ZjFlMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKQEAgLTI2LDggKzI2LDEzIEBACiBvYmotJChDT05GSUdfQ1BVX1MzQzI0NDApICArPSBzM2MyNDQwLWlycS5vCiBvYmotJChDT05GSUdfQ1BVX1MzQzI0NDApICArPSBzM2MyNDQwLWNsb2NrLm8KIAorIyBiYXN0IGV4dHJhcworCitvYmotJChDT05GSUdfQkFTVF9QQzEwNF9JUlEpCSs9IGJhc3QtaXJxLm8KKwogIyBtYWNoaW5lIHNwZWNpZmljIHN1cHBvcnQKIAorb2JqLSQoQ09ORklHX01BQ0hfQU5VQklTKQkrPSBtYWNoLWFudWJpcy5vCiBvYmotJChDT05GSUdfQVJDSF9CQVNUKQkJKz0gbWFjaC1iYXN0Lm8gdXNiLXNpbXRlYy5vCiBvYmotJChDT05GSUdfQVJDSF9IMTk0MCkJKz0gbWFjaC1oMTk0MC5vCiBvYmotJChDT05GSUdfTUFDSF9OMzApCQkrPSBtYWNoLW4zMC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvYmFzdC1pcnEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9iYXN0LWlycS5jCmluZGV4IDVlNWJiZTguLmZiYmViMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9iYXN0LWlycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9iYXN0LWlycS5jCkBAIC0xLDYgKzEsNiBAQAogLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Jhc3QtaXJxLmMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKICAqICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgogICoKICAqIGh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL0VCMjQxMElUWC8KQEAgLTIxLDcgKzIxLDggQEAKICAqCiAgKiBNb2RpZmljYXRpb25zOgogICogICAgIDA4LUphbi0yMDAzIEJKRCAgTW92ZWQgZnJvbSBjZW50cmFsIElSUSBjb2RlCi0gKi8KKyAqICAgICAyMS1BdWctMjAwNSBCSkQgIEZpeGVkIG1pc3NpbmcgY29kZSBhbmQgY29tcGlsZSBlcnJvcnMKKyovCiAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTMwLDEyICszMSwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKwogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zM2MyNDEwL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iYXN0LW1hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Jhc3QtaXJxLmg+CisKKyNpbmNsdWRlICJpcnEuaCIKIAogI2lmIDAKICNpbmNsdWRlIDxhc20vZGVidWctbGwuaD4KQEAgLTc5LDE1ICs4NywxNSBAQAogCXRlbXAgPSBfX3Jhd19yZWFkYihCQVNUX1ZBX1BDMTA0X0lSUU1BU0spOwogCXRlbXAgJj0gfmJhc3RfcGMxMDRfaXJxbWFza3NbaXJxbm9dOwogCV9fcmF3X3dyaXRlYih0ZW1wLCBCQVNUX1ZBX1BDMTA0X0lSUU1BU0spOwotCi0JaWYgKHRlbXAgPT0gMCkKLQkJYmFzdF9leHRpbnRfbWFzayhJUlFfSVNBKTsKIH0KIAogc3RhdGljIHZvaWQKLWJhc3RfcGMxMDRfYWNrKHVuc2lnbmVkIGludCBpcnFubykKK2Jhc3RfcGMxMDRfbWFza2Fjayh1bnNpZ25lZCBpbnQgaXJxbm8pCiB7Ci0JYmFzdF9leHRpbnRfYWNrKElSUV9JU0EpOworCXN0cnVjdCBpcnFkZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBJUlFfSVNBOworCisJYmFzdF9wYzEwNF9tYXNrKGlycW5vKTsKKwlkZXNjLT5jaGlwLT5hY2soSVJRX0lTQSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC05OCwxNCArMTA2LDEyIEBACiAJdGVtcCA9IF9fcmF3X3JlYWRiKEJBU1RfVkFfUEMxMDRfSVJRTUFTSyk7CiAJdGVtcCB8PSBiYXN0X3BjMTA0X2lycW1hc2tzW2lycW5vXTsKIAlfX3Jhd193cml0ZWIodGVtcCwgQkFTVF9WQV9QQzEwNF9JUlFNQVNLKTsKLQotCWJhc3RfZXh0aW50X3VubWFzayhJUlFfSVNBKTsKIH0KIAotc3RhdGljIHN0cnVjdCBiYXN0X3BjMTA0X2NoaXAgPSB7CitzdGF0aWMgc3RydWN0IGlycWNoaXAgIGJhc3RfcGMxMDRfY2hpcCA9IHsKIAkubWFzawkgICAgID0gYmFzdF9wYzEwNF9tYXNrLAogCS51bm1hc2sJICAgICA9IGJhc3RfcGMxMDRfdW5tYXNrLAotCS5hY2sJICAgICA9IGJhc3RfcGMxMDRfYWNrCisJLmFjawkgICAgID0gYmFzdF9wYzEwNF9tYXNrYWNrCiB9OwogCiBzdGF0aWMgdm9pZApAQCAtMTE5LDE0ICsxMjUsNDkgQEAKIAogCXN0YXQgPSBfX3Jhd19yZWFkYihCQVNUX1ZBX1BDMTA0X0lSUVJFUSkgJiAweGY7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNCAmJiBzdGF0ICE9IDA7IGkrKykgewotCQlpZiAoc3RhdCAmIDEpIHsKLQkJCWlycW5vID0gYmFzdF9wYzEwNF9pcnFzW2ldOwotCQkJZGVzYyA9IGlycV9kZXNjICsgaXJxbm87CisJaWYgKHVubGlrZWx5KHN0YXQgPT0gMCkpIHsKKwkJLyogYWNrIGlmIHdlIGdldCBhbiBpcnEgd2l0aCBub3RoaW5nIChpZSwgc3RhcnR1cCkgKi8KIAotCQkJZGVzYy0+aGFuZGxlKGlycW5vLCBkZXNjLCByZWdzKTsKKwkJZGVzYyA9IGlycV9kZXNjICsgSVJRX0lTQTsKKwkJZGVzYy0+Y2hpcC0+YWNrKElSUV9JU0EpOworCX0gZWxzZSB7CisJCS8qIGhhbmRsZSB0aGUgSVJRICovCisKKwkJZm9yIChpID0gMDsgc3RhdCAhPSAwOyBpKyssIHN0YXQgPj49IDEpIHsKKwkJCWlmIChzdGF0ICYgMSkgeworCQkJCWlycW5vID0gYmFzdF9wYzEwNF9pcnFzW2ldOworCisJCQkJZGVzY19oYW5kbGVfaXJxKGlycW5vLCBpcnFfZGVzYyArIGlycW5vLCByZWdzKTsKKwkJCX0KIAkJfQotCi0JCXN0YXQgPj49IDE7CiAJfQogfQorCitzdGF0aWMgX19pbml0IGludCBiYXN0X2lycV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAobWFjaGluZV9pc19iYXN0KCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQkFTVCBQQzEwNCBJUlEgcm91dGluZywgKGMpIDIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzXG4iKTsKKworCQkvKiB6YXAgYWxsIHRoZSBJUlFzICovCisKKwkJX19yYXdfd3JpdGViKDB4MCwgQkFTVF9WQV9QQzEwNF9JUlFNQVNLKTsKKworCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfSVNBLCBiYXN0X2lycV9wYzEwNF9kZW11eCk7CisKKwkJLyogcmVpZ3N0ZXIgb3VyIElSUXMgKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQl1bnNpZ25lZCBpbnQgaXJxbm8gPSBiYXN0X3BjMTA0X2lycXNbaV07CisKKwkJCXNldF9pcnFfY2hpcChpcnFubywgJmJhc3RfcGMxMDRfY2hpcCk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxbm8sIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2ZsYWdzKGlycW5vLCBJUlFGX1ZBTElEKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKGJhc3RfaXJxX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY2xvY2suYwppbmRleCA5YTY2MDUwLi5mNTk2MDgyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY2xvY2suYwpAQCAtMzg4LDYgKzM4OCw3IEBACiAJCQkJdW5zaWduZWQgbG9uZyBoY2xrLAogCQkJCXVuc2lnbmVkIGxvbmcgcGNsaykKIHsKKwl1bnNpZ25lZCBsb25nIGNsa3Nsb3cgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0NMS1NMT1cpOwogCXN0cnVjdCBjbGsgKmNsa3AgPSBpbml0X2Nsb2NrczsKIAlpbnQgcHRyOwogCWludCByZXQ7CkBAIC00NDYsNSArNDQ3LDEzIEBACiAJCX0KIAl9CiAKKwkvKiBzaG93IHRoZSBjbG9jay1zbG93IHZhbHVlICovCisKKwlwcmludGsoIkNMT0NLOiBTbG93IG1vZGUgKCVsZC4lbGQgTUh6KSwgJXMsIE1QTEwgJXMsIFVQTEwgJXNcbiIsCisJICAgICAgIHByaW50X21oeih4dGFsIC8gKCAyICogUzNDMjQxMF9DTEtTTE9XX0dFVF9TTE9XVkFMKGNsa3Nsb3cpKSksCisJICAgICAgIChjbGtzbG93ICYgUzNDMjQxMF9DTEtTTE9XX1NMT1cpID8gInNsb3ciIDogImZhc3QiLAorCSAgICAgICAoY2xrc2xvdyAmIFMzQzI0MTBfQ0xLU0xPV19NUExMX09GRikgPyAib2ZmIiA6ICJvbiIsCisJICAgICAgIChjbGtzbG93ICYgUzNDMjQxMF9DTEtTTE9XX1VDTEtfT0ZGKSA/ICJvZmYiIDogIm9uIik7CisKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kZXZzLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZGV2cy5jCmluZGV4IDQ2NjRiZDEuLjAwNzc5MzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kZXZzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RldnMuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLQorI2luY2x1ZGUgPGFzbS9hcmNoL2ZiLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMTAzLDYgKzEwMywxNSBAQAogCiBFWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfbGNkKTsKIAorc3RhdGljIHN0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvIHMzYzI0MTBmYl9pbmZvOworCit2b2lkIF9faW5pdCBzZXRfczNjMjQxMGZiX2luZm8oc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8gKmhhcmRfczNjMjQxMGZiX2luZm8pCit7CisJbWVtY3B5KCZzM2MyNDEwZmJfaW5mbyxoYXJkX3MzYzI0MTBmYl9pbmZvLHNpemVvZihzdHJ1Y3QgczNjMjQxMGZiX21hY2hfaW5mbykpOworCXMzY19kZXZpY2VfbGNkLmRldi5wbGF0Zm9ybV9kYXRhID0gJnMzYzI0MTBmYl9pbmZvOworfQorRVhQT1JUX1NZTUJPTChzZXRfczNjMjQxMGZiX2luZm8pOworCiAvKiBOQU5EIENvbnRyb2xsZXIgKi8KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfbmFuZF9yZXNvdXJjZVtdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jCmluZGV4IDk3M2E1ZmUuLjY2ZDhjMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMKQEAgLTE4NCwxNCArMTg0LDE0IEBACiAJLmFjawkgICA9IHMzY19pcnFfbWFza2FjaywKIAkubWFzawkgICA9IHMzY19pcnFfbWFzaywKIAkudW5tYXNrCSAgID0gczNjX2lycV91bm1hc2ssCi0JLndha2UJICAgPSBzM2NfaXJxX3dha2UKKwkuc2V0X3dha2UJICAgPSBzM2NfaXJxX3dha2UKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBzM2NfaXJxX2NoaXAgPSB7CiAJLmFjawkgICA9IHMzY19pcnFfYWNrLAogCS5tYXNrCSAgID0gczNjX2lycV9tYXNrLAogCS51bm1hc2sJICAgPSBzM2NfaXJxX3VubWFzaywKLQkud2FrZQkgICA9IHMzY19pcnFfd2FrZQorCS5zZXRfd2FrZQkgICA9IHMzY19pcnFfd2FrZQogfTsKIAogLyogUzNDMjQxMF9FSU5UTUFTSwpAQCAtMzUwLDE2ICszNTAsMTYgQEAKIAkubWFzawkgICAgPSBzM2NfaXJxZXh0X21hc2ssCiAJLnVubWFzawkgICAgPSBzM2NfaXJxZXh0X3VubWFzaywKIAkuYWNrCSAgICA9IHMzY19pcnFleHRfYWNrLAotCS50eXBlCSAgICA9IHMzY19pcnFleHRfdHlwZSwKLQkud2FrZQkgICAgPSBzM2NfaXJxZXh0X3dha2UKKwkuc2V0X3R5cGUgICAgPSBzM2NfaXJxZXh0X3R5cGUsCisJLnNldF93YWtlICAgID0gczNjX2lycWV4dF93YWtlCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycWNoaXAgczNjX2lycV9laW50MHQ0ID0gewogCS5hY2sJICAgPSBzM2NfaXJxX2FjaywKIAkubWFzawkgICA9IHMzY19pcnFfbWFzaywKIAkudW5tYXNrCSAgID0gczNjX2lycV91bm1hc2ssCi0JLndha2UJICAgPSBzM2NfaXJxX3dha2UsCi0JLnR5cGUJICAgPSBzM2NfaXJxZXh0X3R5cGUsCisJLnNldF93YWtlICA9IHMzY19pcnFfd2FrZSwKKwkuc2V0X3R5cGUgID0gczNjX2lycWV4dF90eXBlLAogfTsKIAogLyogbWFzayB2YWx1ZXMgZm9yIHRoZSBwYXJlbnQgcmVnaXN0ZXJzIGZvciBlYWNoIG9mIHRoZSBpbnRlcnJ1cHQgdHlwZXMgKi8KQEAgLTQ5NiwxMSArNDk2LDExIEBACiAJaWYgKHN1YnNyYyAhPSAwKSB7CiAJCWlmIChzdWJzcmMgJiAxKSB7CiAJCQlteWRlc2MgPSBpcnFfZGVzYyArIElSUV9UQzsKLQkJCW15ZGVzYy0+aGFuZGxlKCBJUlFfVEMsIG15ZGVzYywgcmVncyk7CisJCQlkZXNjX2hhbmRsZV9pcnEoSVJRX1RDLCBteWRlc2MsIHJlZ3MpOwogCQl9CiAJCWlmIChzdWJzcmMgJiAyKSB7CiAJCQlteWRlc2MgPSBpcnFfZGVzYyArIElSUV9BREM7Ci0JCQlteWRlc2MtPmhhbmRsZShJUlFfQURDLCBteWRlc2MsIHJlZ3MpOworCQkJZGVzY19oYW5kbGVfaXJxKElSUV9BREMsIG15ZGVzYywgcmVncyk7CiAJCX0KIAl9CiB9CkBAIC01MjksMTcgKzUyOSwxNyBAQAogCQlkZXNjID0gaXJxX2Rlc2MgKyBzdGFydDsKIAogCQlpZiAoc3Vic3JjICYgMSkKLQkJCWRlc2MtPmhhbmRsZShzdGFydCwgZGVzYywgcmVncyk7CisJCQlkZXNjX2hhbmRsZV9pcnEoc3RhcnQsIGRlc2MsIHJlZ3MpOwogCiAJCWRlc2MrKzsKIAogCQlpZiAoc3Vic3JjICYgMikKLQkJCWRlc2MtPmhhbmRsZShzdGFydCsxLCBkZXNjLCByZWdzKTsKKwkJCWRlc2NfaGFuZGxlX2lycShzdGFydCsxLCBkZXNjLCByZWdzKTsKIAogCQlkZXNjKys7CiAKIAkJaWYgKHN1YnNyYyAmIDQpCi0JCQlkZXNjLT5oYW5kbGUoc3RhcnQrMiwgZGVzYywgcmVncyk7CisJCQlkZXNjX2hhbmRsZV9pcnEoc3RhcnQrMiwgZGVzYywgcmVncyk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1hbnViaXMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWFudWJpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4N2FhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1hbnViaXMuYwpAQCAtMCwwICsxLDI3MCBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYW51YmlzLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKgkwMi1NYXktMjAwNSBCSkQgIENvcGllZCBmcm9tIG1hY2gtYmFzdC5jCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9hbnViaXMtbWFwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYW51YmlzLWlycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2FudWJpcy1jcGxkLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWxjZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL25hbmQuaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2VjYy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgImRldnMuaCIKKyNpbmNsdWRlICJjcHUuaCIKKworI2RlZmluZSBDT1BZUklHSFQgIiwgKGMpIDIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzIgorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGFudWJpc19pb2Rlc2NbXSBfX2luaXRkYXRhID0geworICAvKiBJU0EgSU8gYXJlYXMgKi8KKworICB7ICh1MzIpUzNDMjRYWF9WQV9JU0FfQllURSwgMHgwLAkgICBTWl8xNk0sIE1UX0RFVklDRSB9LAorICB7ICh1MzIpUzNDMjRYWF9WQV9JU0FfV09SRCwgMHgwLAkgICBTWl8xNk0sIE1UX0RFVklDRSB9LAorCisgIC8qIHdlIGNvdWxkIHBvc3NpYmx5IGNvbXByZXNzIHRoZSBuZXh0IHNldCBkb3duIGludG8gYSBzZXQgb2Ygc21hbGxlciB0YWJsZXMKKyAgICogcGFnZXRhYmxlcywgYnV0IHRoYXQgd291bGQgbWVhbiB1c2luZyBhbiBMMiBzZWN0aW9uLCBhbmQgaXQgc3RpbGwgbWVhbnMKKyAgICogd2UgY2Fubm90IGFjdHVhbGx5IGZlZWQgdGhlIHNhbWUgcmVnaXN0ZXIgdG8gYW4gTERSIGR1ZSB0byAxNksgc3BhY2luZworICAgKi8KKworICAvKiBDUExEIGNvbnRyb2wgcmVnaXN0ZXJzICovCisKKyAgeyAodTMyKUFOVUJJU19WQV9DVFJMMSwJQU5VQklTX1BBX0NUUkwxLAlTWl80SywgTVRfREVWSUNFIH0sCisgIHsgKHUzMilBTlVCSVNfVkFfQ1RSTDIsCUFOVUJJU19QQV9DVFJMMiwJU1pfNEssIE1UX0RFVklDRSB9LAorCisgIC8qIElERSBkcml2ZXMgKi8KKworICB7ICh1MzIpQU5VQklTX0lERVBSSSwJCVMzQzI0MTBfQ1MzLAkJU1pfMU0sIE1UX0RFVklDRSB9LAorICB7ICh1MzIpQU5VQklTX0lERVBSSUFVWCwJUzNDMjQxMF9DUzMrKDE8PDI2KSwJU1pfMU0sIE1UX0RFVklDRSB9LAorCisgIHsgKHUzMilBTlVCSVNfSURFU0VDLAkJUzNDMjQxMF9DUzQsCQlTWl8xTSwgTVRfREVWSUNFIH0sCisgIHsgKHUzMilBTlVCSVNfSURFU0VDQVVYLAlTM0MyNDEwX0NTNCsoMTw8MjYpLAlTWl8xTSwgTVRfREVWSUNFIH0sCit9OworCisjZGVmaW5lIFVDT04gUzNDMjQxMF9VQ09OX0RFRkFVTFQgfCBTM0MyNDEwX1VDT05fVUNMSworI2RlZmluZSBVTENPTiBTM0MyNDEwX0xDT05fQ1M4IHwgUzNDMjQxMF9MQ09OX1BOT05FIHwgUzNDMjQxMF9MQ09OX1NUT1BCCisjZGVmaW5lIFVGQ09OIFMzQzI0MTBfVUZDT05fUlhUUklHOCB8IFMzQzI0MTBfVUZDT05fRklGT01PREUKKworc3RhdGljIHN0cnVjdCBzM2MyNHh4X3VhcnRfY2xrc3JjIGFudWJpc19zZXJpYWxfY2xvY2tzW10gPSB7CisJWzBdID0geworCQkubmFtZQkJPSAidWNsayIsCisJCS5kaXZpc29yCT0gMSwKKwkJLm1pbl9iYXVkCT0gMCwKKwkJLm1heF9iYXVkCT0gMCwKKwl9LAorCVsxXSA9IHsKKwkJLm5hbWUJCT0gInBjbGsiLAorCQkuZGl2aXNvcgk9IDEsCisJCS5taW5fYmF1ZAk9IDAsCisJCS5tYXhfYmF1ZAk9IDAuCisJfQorfTsKKworCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfdWFydGNmZyBhbnViaXNfdWFydGNmZ3NbXSA9IHsKKwlbMF0gPSB7CisJCS5od3BvcnQJICAgICA9IDAsCisJCS5mbGFncwkgICAgID0gMCwKKwkJLnVjb24JICAgICA9IFVDT04sCisJCS51bGNvbgkgICAgID0gVUxDT04sCisJCS51ZmNvbgkgICAgID0gVUZDT04sCisJCS5jbG9ja3MJICAgICA9IGFudWJpc19zZXJpYWxfY2xvY2tzLAorCQkuY2xvY2tzX3NpemUgPSBBUlJBWV9TSVpFKGFudWJpc19zZXJpYWxfY2xvY2tzKQorCX0sCisJWzFdID0geworCQkuaHdwb3J0CSAgICAgPSAyLAorCQkuZmxhZ3MJICAgICA9IDAsCisJCS51Y29uCSAgICAgPSBVQ09OLAorCQkudWxjb24JICAgICA9IFVMQ09OLAorCQkudWZjb24JICAgICA9IFVGQ09OLAorCQkuY2xvY2tzCSAgICAgPSBhbnViaXNfc2VyaWFsX2Nsb2NrcywKKwkJLmNsb2Nrc19zaXplID0gQVJSQVlfU0laRShhbnViaXNfc2VyaWFsX2Nsb2NrcykKKwl9LAorfTsKKworLyogTkFORCBGbGFzaCBvbiBBbnViaXMgYm9hcmQgKi8KKworc3RhdGljIGludCBleHRlcm5hbF9tYXBbXSAgID0geyAyIH07CitzdGF0aWMgaW50IGNoaXAwX21hcFtdICAgICAgPSB7IDAgfTsKK3N0YXRpYyBpbnQgY2hpcDFfbWFwW10gICAgICA9IHsgMSB9OworCitzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBhbnViaXNfZGVmYXVsdF9uYW5kX3BhcnRbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIkJvb3QgQWdlbnQiLAorCQkuc2l6ZQk9IFNaXzE2SywKKwkJLm9mZnNldAk9IDAKKwl9LAorCVsxXSA9IHsKKwkJLm5hbWUJPSAiL2Jvb3QiLAorCQkuc2l6ZQk9IFNaXzRNIC0gU1pfMTZLLAorCQkub2Zmc2V0CT0gU1pfMTZLLAorCX0sCisJWzJdID0geworCQkubmFtZQk9ICJ1c2VyMSIsCisJCS5vZmZzZXQJPSBTWl80TSwKKwkJLnNpemUJPSBTWl8zMk0gLSBTWl80TSwKKwl9LAorCVszXSA9IHsKKwkJLm5hbWUJPSAidXNlcjIiLAorCQkub2Zmc2V0CT0gU1pfMzJNLAorCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCisJfQorfTsKKworLyogdGhlIEFudWJpcyBoYXMgMyBzZWxlY3RhYmxlIHNsb3RzIGZvciBuYW5kLWZsYXNoLCB0aGUgdHdvCisgKiBvbi1ib2FyZCBjaGlwIGFyZWFzLCBhcyB3ZWxsIGFzIHRoZSBleHRlcm5hbCBzbG90LgorICoKKyAqIE5vdGUsIHRoZXJlIGlzIG5vIGN1cnJlbnQgaG90LXBsdWcgc3VwcG9ydCBmb3IgdGhlIEV4dGVybmFsCisgKiBzb2NrZXQuCisqLworCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfbmFuZF9zZXQgYW51YmlzX25hbmRfc2V0c1tdID0geworCVsxXSA9IHsKKwkJLm5hbWUJCT0gIkV4dGVybmFsIiwKKwkJLm5yX2NoaXBzCT0gMSwKKwkJLm5yX21hcAkJPSBleHRlcm5hbF9tYXAsCisJCS5ucl9wYXJ0aXRpb25zCT0gQVJSQVlfU0laRShhbnViaXNfZGVmYXVsdF9uYW5kX3BhcnQpLAorCQkucGFydGl0aW9ucwk9IGFudWJpc19kZWZhdWx0X25hbmRfcGFydAorCX0sCisJWzBdID0geworCQkubmFtZQkJPSAiY2hpcDAiLAorCQkubnJfY2hpcHMJPSAxLAorCQkubnJfbWFwCQk9IGNoaXAwX21hcCwKKwkJLm5yX3BhcnRpdGlvbnMJPSBBUlJBWV9TSVpFKGFudWJpc19kZWZhdWx0X25hbmRfcGFydCksCisJCS5wYXJ0aXRpb25zCT0gYW51YmlzX2RlZmF1bHRfbmFuZF9wYXJ0CisJfSwKKwlbMl0gPSB7CisJCS5uYW1lCQk9ICJjaGlwMSIsCisJCS5ucl9jaGlwcwk9IDEsCisJCS5ucl9tYXAJCT0gY2hpcDFfbWFwLAorCQkubnJfcGFydGl0aW9ucwk9IEFSUkFZX1NJWkUoYW51YmlzX2RlZmF1bHRfbmFuZF9wYXJ0KSwKKwkJLnBhcnRpdGlvbnMJPSBhbnViaXNfZGVmYXVsdF9uYW5kX3BhcnQKKwl9LAorfTsKKworc3RhdGljIHZvaWQgYW51YmlzX25hbmRfc2VsZWN0KHN0cnVjdCBzM2MyNDEwX25hbmRfc2V0ICpzZXQsIGludCBzbG90KQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwlzbG90ID0gc2V0LT5ucl9tYXBbc2xvdF0gJiAzOworCisJcHJfZGVidWcoImFudWJpc19uYW5kOiBzZWxlY3Rpbmcgc2xvdCAlZCAoc2V0ICVwLCVwKVxuIiwKKwkJIHNsb3QsIHNldCwgc2V0LT5ucl9tYXApOworCisJdG1wID0gX19yYXdfcmVhZGIoQU5VQklTX1ZBX0NUUkwxKTsKKwl0bXAgJj0gfkFOVUJJU19DVFJMMV9OQU5EU0VMOworCXRtcCB8PSBzbG90OworCisJcHJfZGVidWcoImFudWJpc19uYW5kOiBjdHJsMSBub3cgJTAyeFxuIiwgdG1wKTsKKworCV9fcmF3X3dyaXRlYih0bXAsIEFOVUJJU19WQV9DVFJMMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9uYW5kIGFudWJpc19uYW5kX2luZm8gPSB7CisJLnRhY2xzCQk9IDI1LAorCS50d3JwaDAJCT0gODAsCisJLnR3cnBoMQkJPSA4MCwKKwkubnJfc2V0cwk9IEFSUkFZX1NJWkUoYW51YmlzX25hbmRfc2V0cyksCisJLnNldHMJCT0gYW51YmlzX25hbmRfc2V0cywKKwkuc2VsZWN0X2NoaXAJPSBhbnViaXNfbmFuZF9zZWxlY3QsCit9OworCisKKy8qIFN0YW5kYXJkIEFudWJpcyBkZXZpY2VzICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphbnViaXNfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnMzY19kZXZpY2VfdXNiLAorCSZzM2NfZGV2aWNlX3dkdCwKKwkmczNjX2RldmljZV9hZGMsCisJJnMzY19kZXZpY2VfaTJjLAorIAkmczNjX2RldmljZV9ydGMsCisJJnMzY19kZXZpY2VfbmFuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICphbnViaXNfY2xvY2tzW10gPSB7CisJJnMzYzI0eHhfZGNsazAsCisJJnMzYzI0eHhfZGNsazEsCisJJnMzYzI0eHhfY2xrb3V0MCwKKwkmczNjMjR4eF9jbGtvdXQxLAorCSZzM2MyNHh4X3VjbGssCit9OworCitzdGF0aWMgc3RydWN0IHMzYzI0eHhfYm9hcmQgYW51YmlzX2JvYXJkIF9faW5pdGRhdGEgPSB7CisJLmRldmljZXMgICAgICAgPSBhbnViaXNfZGV2aWNlcywKKwkuZGV2aWNlc19jb3VudCA9IEFSUkFZX1NJWkUoYW51YmlzX2RldmljZXMpLAorCS5jbG9ja3MJICAgICAgID0gYW51YmlzX2Nsb2NrcywKKwkuY2xvY2tzX2NvdW50ICA9IEFSUkFZX1NJWkUoYW51YmlzX2Nsb2NrcykKK307CisKK3ZvaWQgX19pbml0IGFudWJpc19tYXBfaW8odm9pZCkKK3sKKwkvKiBpbml0aWFsaXNlIHRoZSBjbG9ja3MgKi8KKworCXMzYzI0eHhfZGNsazAucGFyZW50ID0gTlVMTDsKKwlzM2MyNHh4X2RjbGswLnJhdGUgICA9IDEyKjEwMDAqMTAwMDsKKworCXMzYzI0eHhfZGNsazEucGFyZW50ID0gTlVMTDsKKwlzM2MyNHh4X2RjbGsxLnJhdGUgICA9IDI0KjEwMDAqMTAwMDsKKworCXMzYzI0eHhfY2xrb3V0MC5wYXJlbnQgID0gJnMzYzI0eHhfZGNsazA7CisJczNjMjR4eF9jbGtvdXQxLnBhcmVudCAgPSAmczNjMjR4eF9kY2xrMTsKKworCXMzYzI0eHhfdWNsay5wYXJlbnQgID0gJnMzYzI0eHhfY2xrb3V0MTsKKworCXMzY19kZXZpY2VfbmFuZC5kZXYucGxhdGZvcm1fZGF0YSA9ICZhbnViaXNfbmFuZF9pbmZvOworCisJczNjMjR4eF9pbml0X2lvKGFudWJpc19pb2Rlc2MsIEFSUkFZX1NJWkUoYW51YmlzX2lvZGVzYykpOworCXMzYzI0eHhfaW5pdF9jbG9ja3MoMCk7CisJczNjMjR4eF9pbml0X3VhcnRzKGFudWJpc191YXJ0Y2ZncywgQVJSQVlfU0laRShhbnViaXNfdWFydGNmZ3MpKTsKKwlzM2MyNHh4X3NldF9ib2FyZCgmYW51YmlzX2JvYXJkKTsKKworCS8qIGVuc3VyZSB0aGF0IHRoZSBHUElPIGlzIHNldHVwICovCisJczNjMjQxMF9ncGlvX3NldHBpbihTM0MyNDEwX0dQQTAsIDEpOworfQorCitNQUNISU5FX1NUQVJUKEFOVUJJUywgIlNpbXRlYy1BbnViaXMiKQorCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4gKi8KKwkucGh5c19yYW0JPSBTM0MyNDEwX1NEUkFNX1BBLAorCS5waHlzX2lvCT0gUzNDMjQxMF9QQV9VQVJULAorCS5pb19wZ19vZmZzdAk9ICgoKHUzMilTM0MyNFhYX1ZBX1VBUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLm1hcF9pbwkJPSBhbnViaXNfbWFwX2lvLAorCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYwppbmRleCBlOTE4MjI0Li4xYTMzNjdkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jCkBAIC0zODEsNyArMzgxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmFzdF9zaW8gPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDAsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCiAJLmRldgkJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9ICZiYXN0X3Npb19kYXRhLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYwppbmRleCBlYTRmYjFhLi42ZmYxODg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKQEAgLTQ1LDYgKzQ1LDkgQEAKIAogLy8jaW5jbHVkZSA8YXNtL2RlYnVnLWxsLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWxjZC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZmIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAKQEAgLTg4LDYgKzkxLDQ4IEBACiAKIAogCisvKioKKyAqIFNldCBsY2Qgb24gb3Igb2ZmCisgKiovCitzdGF0aWMgc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8gaDE5NDBfbGNkY2ZnIF9faW5pdGRhdGEgPSB7CisJLmZpeGVkX3N5bmNzPQkJMSwKKwkucmVncz17CisJCS5sY2Rjb24xPQlTM0MyNDEwX0xDRENPTjFfVEZUMTZCUFAgfCBcCisJCQkJUzNDMjQxMF9MQ0RDT04xX1RGVCB8IFwKKwkJCQlTM0MyNDEwX0xDRENPTjFfQ0xLVkFMKDB4MEMpLAorCisJCS5sY2Rjb24yPQlTM0MyNDEwX0xDRENPTjJfVkJQRCg3KSB8IFwKKwkJCQlTM0MyNDEwX0xDRENPTjJfTElORVZBTCgzMTkpIHwgXAorCQkJCVMzQzI0MTBfTENEQ09OMl9WRlBEKDYpIHwgXAorCQkJCVMzQzI0MTBfTENEQ09OMl9WU1BXKDApLAorCisJCS5sY2Rjb24zPQlTM0MyNDEwX0xDRENPTjNfSEJQRCgxOSkgfCBcCisJCQkJUzNDMjQxMF9MQ0RDT04zX0hPWlZBTCgyMzkpIHwgXAorCQkJCVMzQzI0MTBfTENEQ09OM19IRlBEKDcpLAorCisJCS5sY2Rjb240PQlTM0MyNDEwX0xDRENPTjRfTVZBTCgwKSB8IFwKKwkJCQlTM0MyNDEwX0xDRENPTjRfSFNQVygzKSwKKworCQkubGNkY29uNT0JUzNDMjQxMF9MQ0RDT041X0ZSTTU2NSB8IFwKKwkJCQlTM0MyNDEwX0xDRENPTjVfSU5WVkxJTkUgfCBcCisJCQkJUzNDMjQxMF9MQ0RDT041X0hXU1dQLAorCX0sCisJLmxwY3NlbD0JMHgwMiwKKwkuZ3BjY29uPQkweGFhOTQwNjU5LAorCS5ncGNjb25fbWFzaz0JMHhmZmZmZmZmZiwKKwkuZ3BjdXA9CQkweDAwMDBmZmZmLAorCS5ncGN1cF9tYXNrPQkweGZmZmZmZmZmLAorCS5ncGRjb249CTB4YWE4NGFhYTAsCisJLmdwZGNvbl9tYXNrPQkweGZmZmZmZmZmLAorCS5ncGR1cD0JCTB4MDAwMGZhZmYsCisJLmdwZHVwX21hc2s9CTB4ZmZmZmZmZmYsCisKKwkud2lkdGg9CQkyNDAsCisJLmhlaWdodD0JMzIwLAorCS54cmVzPQkJezI0MCwyNDAsMjQwfSwKKwkueXJlcz0JCXszMjAsMzIwLDMyMH0sCisJLmJwcD0JCXsxNiwxNiwxNn0sCit9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaDE5NDBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnMzY19kZXZpY2VfdXNiLApAQCAtMTE2LDYgKzE2MSwxMSBAQAogCiB9CiAKK3ZvaWQgX19pbml0IGgxOTQwX2luaXQodm9pZCkKK3sKKwlzZXRfczNjMjQxMGZiX2luZm8oJmgxOTQwX2xjZGNmZyk7Cit9CisKIE1BQ0hJTkVfU1RBUlQoSDE5NDAsICJJUEFRLUgxOTQwIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbkBmbHVmZi5vcmc+ICovCiAJLnBoeXNfcmFtCT0gUzNDMjQxMF9TRFJBTV9QQSwKQEAgLTEyNCw1ICsxNzQsNiBAQAogCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKIAkubWFwX2lvCQk9IGgxOTQwX21hcF9pbywKIAkuaW5pdF9pcnEJPSBoMTk0MF9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lICAgPSBoMTk0MF9pbml0LAogCS50aW1lcgkJPSAmczNjMjR4eF90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uMzAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW4zMC5jCmluZGV4IDc5MDQ0ZDkuLjY2YmY1YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW4zMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW4zMC5jCkBAIC0xMTAsMzQgKzExMCwyNCBAQAogCXMzYzI0eHhfaW5pdF9pcnEoKTsKIH0KIAotCi1zdGF0aWMgaW50IG4zMF91c2JzdGFydF90aHJlYWQodm9pZCAqdW51c2VkKQotewotCS8qIFR1cm4gb2ZmIHN1c3BlbmQgb24gYm90aCBVU0IgcG9ydHMsIGFuZCBzd2l0Y2ggdGhlCi0JICogc2VsZWN0YWJsZSBVU0IgcG9ydCB0byBVU0IgZGV2aWNlIG1vZGUuICovCi0Jd3JpdGVsKHJlYWRsKFMzQzI0MTBfTUlTQ0NSKSAmIH4weDAwMDAzMDA4LCBTM0MyNDEwX01JU0NDUik7Ci0KLQkvKiBUdXJuIG9mZiB0aGUgRCsgcHVsbCB1cCBmb3IgMyBzZWNvbmRzIHNvIHRoYXQgdGhlIFVTQiBob3N0Ci0JICogYXQgdGhlIG90aGVyIGVuZCB3aWxsIGRvIGEgcmVzY2FuIG9mIHRoZSBVU0IgYnVzLiAgKi8KLQlzM2MyNDEwX2dwaW9fc2V0cGluKFMzQzI0MTBfR1BCMywgMCk7Ci0KLQltc2xlZXBfaW50ZXJydXB0aWJsZSgzKkhaKTsKLQotCXMzYzI0MTBfZ3Bpb19zZXRwaW4oUzNDMjQxMF9HUEIzLCAxKTsKLQotCXJldHVybiAwOwotfQotCisvKiBHUEIzIGlzIHRoZSBsaW5lIHRoYXQgY29udHJvbHMgdGhlIHB1bGwtdXAgZm9yIHRoZSBVU0IgRCsgbGluZSAqLwogCiB2b2lkIF9faW5pdCBuMzBfaW5pdCh2b2lkKQogewogCXMzY19kZXZpY2VfaTJjLmRldi5wbGF0Zm9ybV9kYXRhID0gJm4zMF9pMmNjZmc7CiAKLQlrdGhyZWFkX3J1bihuMzBfdXNic3RhcnRfdGhyZWFkLCBOVUxMLCAibjMwX3VzYnN0YXJ0Iik7CisJLyogVHVybiBvZmYgc3VzcGVuZCBvbiBib3RoIFVTQiBwb3J0cywgYW5kIHN3aXRjaCB0aGUKKwkgKiBzZWxlY3RhYmxlIFVTQiBwb3J0IHRvIFVTQiBkZXZpY2UgbW9kZS4gKi8KKworCXMzYzI0MTBfbW9kaWZ5X21pc2NjcihTM0MyNDEwX01JU0NDUl9VU0JIT1NUIHwKKwkJCSAgICAgIFMzQzI0MTBfTUlTQ0NSX1VTQlNVU1BORDAgfAorCQkJICAgICAgUzNDMjQxMF9NSVNDQ1JfVVNCU1VTUE5EMSwgMHgwKTsKIH0KIAogTUFDSElORV9TVEFSVChOMzAsICJBY2VyLU4zMCIpCi0JLyogTWFpbnRhaW5lcjogQ2hyaXN0ZXIgV2VpbmlnZWwgPGNocmlzdGVyQHdlaW5pZ2VsLnNlPiwgQmVuIERvb2tzIDxiZW4tbGludXhAZmx1ZmYub3JnPiAqLworCS8qIE1haW50YWluZXI6IENocmlzdGVyIFdlaW5pZ2VsIDxjaHJpc3RlckB3ZWluaWdlbC5zZT4sCisJCQkJQmVuIERvb2tzIDxiZW4tbGludXhAZmx1ZmYub3JnPgorCSovCiAJLnBoeXNfcmFtCT0gUzNDMjQxMF9TRFJBTV9QQSwKIAkucGh5c19pbwk9IFMzQzI0MTBfUEFfVUFSVCwKIAkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jCmluZGV4IDkyNGU4NDYuLjhmOWFiMjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKIAkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJCT0gMCwKKwkuaWQJCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKIAkuZGV2CQkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCiAJfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS1zaW10ZWMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS1zaW10ZWMuYwppbmRleCAyY2I3OTg4Li40YzdjY2VmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0tc2ltdGVjLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLXNpbXRlYy5jCkBAIC00OCw3ICs0OCw3IEBACiAKIAkvKiBjaGVjayB3aGljaCBtYWNoaW5lIHdlIGFyZSBydW5uaW5nIG9uICovCiAKLQlpZiAoIW1hY2hpbmVfaXNfYmFzdCgpICYmICFtYWNoaW5lX2lzX3ZyMTAwMCgpKQorCWlmICghbWFjaGluZV9pc19iYXN0KCkgJiYgIW1hY2hpbmVfaXNfdnIxMDAwKCkgJiYgIW1hY2hpbmVfaXNfYW51YmlzKCkpCiAJCXJldHVybiAwOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiU2ltdGVjIEJvYXJkIFBvd2VyIE1hbmFuZ2VtZW50IiBDT1BZUklHSFQgIlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0uYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS5jCmluZGV4IDEzYTQ4ZWUuLmZlNTdkOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS5jCkBAIC01ODUsMTQgKzU4NSwxNiBAQAogCiAJczNjMjQxMF9wbV9jaGVja19zdG9yZSgpOwogCi0JLy8gbmVlZCB0byBtYWtlIHNvbWUgZm9ybSBvZiB0aW1lLWRlbHRhCi0KIAkvKiBzZW5kIHRoZSBjcHUgdG8gc2xlZXAuLi4gKi8KIAogCV9fcmF3X3dyaXRlbCgweDAwLCBTM0MyNDEwX0NMS0NPTik7ICAvKiB0dXJuIG9mZiBjbG9ja3Mgb3ZlciBzbGVlcCAqLwogCiAJczNjMjQxMF9jcHVfc3VzcGVuZChyZWdzX3NhdmUpOwogCisJLyogcmVzdG9yZSB0aGUgY3B1IHN0YXRlICovCisKKwljcHVfaW5pdCgpOworCiAJLyogdW5zZXQgdGhlIHJldHVybi1mcm9tLXNsZWVwIGZsYWcsIHRvIGVuc3VyZSByZXNldCAqLwogCiAJdG1wID0gX19yYXdfcmVhZGwoUzNDMjQxMF9HU1RBVFVTMik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC1jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAtY2xvY2suYwppbmRleCBiMDE4YTFmLi5jNjdlMDk3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC1jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLWNsb2NrLmMKQEAgLTY4LDYgKzY4LDcgQEAKIHN0YXRpYyBpbnQgczNjMjQ0MF9jbGtfYWRkKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyB1cGxsY29uID0gX19yYXdfcmVhZGwoUzNDMjQxMF9VUExMQ09OKTsKKwl1bnNpZ25lZCBsb25nIGNhbWRpdm4gPSBfX3Jhd19yZWFkbChTM0MyNDQwX0NBTURJVk4pOwogCXN0cnVjdCBjbGsgKmNsa19oOwogCXN0cnVjdCBjbGsgKmNsa19wOwogCXN0cnVjdCBjbGsgKmNsa194dGFsOwpAQCAtODAsOCArODEsOSBAQAogCiAJczNjMjQ0MF9jbGtfdXBsbC5yYXRlID0gczNjMjQxMF9nZXRfcGxsKHVwbGxjb24sIGNsa194dGFsLT5yYXRlKTsKIAotCXByaW50aygiUzNDMjQ0MDogQ2xvY2sgU3VwcG9ydCwgVVBMTCAlbGQuJTAzbGQgTUh6XG4iLAotCSAgICAgICBwcmludF9taHooczNjMjQ0MF9jbGtfdXBsbC5yYXRlKSk7CisJcHJpbnRrKCJTM0MyNDQwOiBDbG9jayBTdXBwb3J0LCBVUExMICVsZC4lMDNsZCBNSHosIERWUyAlc1xuIiwKKwkgICAgICAgcHJpbnRfbWh6KHMzYzI0NDBfY2xrX3VwbGwucmF0ZSksCisJICAgICAgIChjYW1kaXZuICYgUzNDMjQ0MF9DQU1ESVZOX0RWU0VOKSA/ICJvbiIgOiAib2ZmIik7CiAKIAljbGtfcCA9IGNsa19nZXQoTlVMTCwgInBjbGsiKTsKIAljbGtfaCA9IGNsa19nZXQoTlVMTCwgImhjbGsiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLWlycS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAtaXJxLmMKaW5kZXggN2NiOTkxMi4uMjc4ZDAwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAtaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAtaXJxLmMKQEAgLTY0LDExICs2NCwxMSBAQAogCWlmIChzdWJzcmMgIT0gMCkgewogCQlpZiAoc3Vic3JjICYgMSkgewogCQkJbXlkZXNjID0gaXJxX2Rlc2MgKyBJUlFfUzNDMjQ0MF9XRFQ7Ci0JCQlteWRlc2MtPmhhbmRsZSggSVJRX1MzQzI0NDBfV0RULCBteWRlc2MsIHJlZ3MpOworCQkJZGVzY19oYW5kbGVfaXJxKElSUV9TM0MyNDQwX1dEVCwgbXlkZXNjLCByZWdzKTsKIAkJfQogCQlpZiAoc3Vic3JjICYgMikgewogCQkJbXlkZXNjID0gaXJxX2Rlc2MgKyBJUlFfUzNDMjQ0MF9BQzk3OwotCQkJbXlkZXNjLT5oYW5kbGUoSVJRX1MzQzI0NDBfQUM5NywgbXlkZXNjLCByZWdzKTsKKwkJCWRlc2NfaGFuZGxlX2lycShJUlFfUzNDMjQ0MF9BQzk3LCBteWRlc2MsIHJlZ3MpOwogCQl9CiAJfQogfQpAQCAtMTIyLDExICsxMjIsMTEgQEAKIAlpZiAoc3Vic3JjICE9IDApIHsKIAkJaWYgKHN1YnNyYyAmIDEpIHsKIAkJCW15ZGVzYyA9IGlycV9kZXNjICsgSVJRX1MzQzI0NDBfQ0FNX0M7Ci0JCQlteWRlc2MtPmhhbmRsZSggSVJRX1MzQzI0NDBfV0RULCBteWRlc2MsIHJlZ3MpOworCQkJZGVzY19oYW5kbGVfaXJxKElSUV9TM0MyNDQwX0NBTV9DLCBteWRlc2MsIHJlZ3MpOwogCQl9CiAJCWlmIChzdWJzcmMgJiAyKSB7CiAJCQlteWRlc2MgPSBpcnFfZGVzYyArIElSUV9TM0MyNDQwX0NBTV9QOwotCQkJbXlkZXNjLT5oYW5kbGUoSVJRX1MzQzI0NDBfQUM5NywgbXlkZXNjLCByZWdzKTsKKwkJCWRlc2NfaGFuZGxlX2lycShJUlFfUzNDMjQ0MF9DQU1fUCwgbXlkZXNjLCByZWdzKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdGltZS5jCmluZGV4IDc2NWEzYTkuLmMwYWNmYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3RpbWUuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAKIAkvKiBjb25maWd1cmUgdGhlIHN5c3RlbSBmb3Igd2hpY2hldmVyIG1hY2hpbmUgaXMgaW4gdXNlICovCiAKLQlpZiAobWFjaGluZV9pc19iYXN0KCkgfHwgbWFjaGluZV9pc192cjEwMDAoKSkgeworCWlmIChtYWNoaW5lX2lzX2Jhc3QoKSB8fCBtYWNoaW5lX2lzX3ZyMTAwMCgpIHx8IG1hY2hpbmVfaXNfYW51YmlzKCkpIHsKIAkJLyogdGltZXIgaXMgYXQgMTJNSHosIHNjYWxlciBpcyAxICovCiAJCXRpbWVyX3VzZWNfdGlja3MgPSB0aW1lcl9tYXNrX3VzZWNfdGlja3MoMSwgMTIwMDAwMDApOwogCQl0Y250ID0gMTIwMDAwMDAgLyBIWjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaXJxLmMKaW5kZXggNjZhOTI5Yy4uYzEzMWE1MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaXJxLmMKQEAgLTk4LDggKzk4LDggQEAKIAkuYWNrCQk9IHNhMTEwMF9sb3dfZ3Bpb19hY2ssCiAJLm1hc2sJCT0gc2ExMTAwX2xvd19ncGlvX21hc2ssCiAJLnVubWFzawkJPSBzYTExMDBfbG93X2dwaW9fdW5tYXNrLAotCS50eXBlCQk9IHNhMTEwMF9ncGlvX3R5cGUsCi0JLndha2UJCT0gc2ExMTAwX2xvd19ncGlvX3dha2UsCisJLnNldF90eXBlCT0gc2ExMTAwX2dwaW9fdHlwZSwKKwkuc2V0X3dha2UJPSBzYTExMDBfbG93X2dwaW9fd2FrZSwKIH07CiAKIC8qCkBAIC0xMjYsNyArMTI2LDcgQEAKIAkJbWFzayA+Pj0gMTE7CiAJCWRvIHsKIAkJCWlmIChtYXNrICYgMSkKLQkJCQlkZXNjLT5oYW5kbGUoaXJxLCBkZXNjLCByZWdzKTsKKwkJCQlkZXNjX2hhbmRsZV9pcnEoaXJxLCBkZXNjLCByZWdzKTsKIAkJCW1hc2sgPj49IDE7CiAJCQlpcnErKzsKIAkJCWRlc2MrKzsKQEAgLTE4MSw4ICsxODEsOCBAQAogCS5hY2sJCT0gc2ExMTAwX2hpZ2hfZ3Bpb19hY2ssCiAJLm1hc2sJCT0gc2ExMTAwX2hpZ2hfZ3Bpb19tYXNrLAogCS51bm1hc2sJCT0gc2ExMTAwX2hpZ2hfZ3Bpb191bm1hc2ssCi0JLnR5cGUJCT0gc2ExMTAwX2dwaW9fdHlwZSwKLQkud2FrZQkJPSBzYTExMDBfaGlnaF9ncGlvX3dha2UsCisJLnNldF90eXBlCT0gc2ExMTAwX2dwaW9fdHlwZSwKKwkuc2V0X3dha2UJPSBzYTExMDBfaGlnaF9ncGlvX3dha2UsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvbmVwb25zZXQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL25lcG9uc2V0LmMKaW5kZXggMTQwNTM4My4uZmMwNjE2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvbmVwb25zZXQuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9uZXBvbnNldC5jCkBAIC02MSwxMiArNjEsMTIgQEAKIAogCQkJaWYgKGlyciAmIElSUl9FVEhFUk5FVCkgewogCQkJCWQgPSBpcnFfZGVzYyArIElSUV9ORVBPTlNFVF9TTUM5MTk2OwotCQkJCWQtPmhhbmRsZShJUlFfTkVQT05TRVRfU01DOTE5NiwgZCwgcmVncyk7CisJCQkJZGVzY19oYW5kbGVfaXJxKElSUV9ORVBPTlNFVF9TTUM5MTk2LCBkLCByZWdzKTsKIAkJCX0KIAogCQkJaWYgKGlyciAmIElSUl9VU0FSKSB7CiAJCQkJZCA9IGlycV9kZXNjICsgSVJRX05FUE9OU0VUX1VTQVI7Ci0JCQkJZC0+aGFuZGxlKElSUV9ORVBPTlNFVF9VU0FSLCBkLCByZWdzKTsKKwkJCQlkZXNjX2hhbmRsZV9pcnEoSVJRX05FUE9OU0VUX1VTQVIsIGQsIHJlZ3MpOwogCQkJfQogCiAJCQlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKQEAgLTc0LDcgKzc0LDcgQEAKIAogCQlpZiAoaXJyICYgSVJSX1NBMTExMSkgewogCQkJZCA9IGlycV9kZXNjICsgSVJRX05FUE9OU0VUX1NBMTExMTsKLQkJCWQtPmhhbmRsZShJUlFfTkVQT05TRVRfU0ExMTExLCBkLCByZWdzKTsKKwkJCWRlc2NfaGFuZGxlX2lycShJUlFfTkVQT05TRVRfU0ExMTExLCBkLCByZWdzKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3RpbWUuYwppbmRleCAwZWViMzYxLi40N2UwNDIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvdGltZS5jCkBAIC03MCwxNSArNzAsMTEgQEAKIAlyZXR1cm4gdXNlYzsKIH0KIAotLyoKLSAqIFdlIHdpbGwgYmUgZW50ZXJlZCB3aXRoIElSUXMgZW5hYmxlZC4KLSAqCi0gKiBMb29wIHVudGlsIHdlIGdldCBhaGVhZCBvZiB0aGUgZnJlZSBydW5uaW5nIHRpbWVyLgotICogVGhpcyBlbnN1cmVzIGFuIGV4YWN0IGNsb2NrIHRpY2sgY291bnQgYW5kIHRpbWUgYWNjdXJhY3kuCi0gKiBJUlFzIGFyZSBkaXNhYmxlZCBpbnNpZGUgdGhlIGxvb3AgdG8gZW5zdXJlIGNvaGVyZW5jZSBiZXR3ZWVuCi0gKiBsb3N0X3RpY2tzICh1cGRhdGVkIGluIGRvX3RpbWVyKCkpIGFuZCB0aGUgbWF0Y2ggcmVnIHZhbHVlLCBzbyB3ZQotICogY2FuIHVzZSBkb19nZXR0aW1lb2ZkYXkoKSBmcm9tIGludGVycnVwdCBoYW5kbGVycy4KLSAqLworI2lmZGVmIENPTkZJR19OT19JRExFX0haCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbml0aWFsX21hdGNoOworc3RhdGljIGludCBtYXRjaF9wb3Nwb25lZDsKKyNlbmRpZgorCiBzdGF0aWMgaXJxcmV0dXJuX3QKIHNhMTEwMF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTg2LDYgKzgyLDIxIEBACiAKIAl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKIAorI2lmZGVmIENPTkZJR19OT19JRExFX0haCisJaWYgKG1hdGNoX3Bvc3BvbmVkKSB7CisJCW1hdGNoX3Bvc3BvbmVkID0gMDsKKwkJT1NNUjAgPSBpbml0aWFsX21hdGNoOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBMb29wIHVudGlsIHdlIGdldCBhaGVhZCBvZiB0aGUgZnJlZSBydW5uaW5nIHRpbWVyLgorCSAqIFRoaXMgZW5zdXJlcyBhbiBleGFjdCBjbG9jayB0aWNrIGNvdW50IGFuZCB0aW1lIGFjY3VyYWN5LgorCSAqIFNpbmNlIElSUXMgYXJlIGRpc2FibGVkIGF0IHRoaXMgcG9pbnQsIGNvaGVyZW5jZSBiZXR3ZWVuCisJICogbG9zdF90aWNrcyh1cGRhdGVkIGluIGRvX3RpbWVyKCkpIGFuZCB0aGUgbWF0Y2ggcmVnIHZhbHVlIGlzCisJICogZW5zdXJlZCwgaGVuY2Ugd2UgY2FuIHVzZSBkb19nZXR0aW1lb2ZkYXkoKSBmcm9tIGludGVycnVwdAorCSAqIGhhbmRsZXJzLgorCSAqLwogCWRvIHsKIAkJdGltZXJfdGljayhyZWdzKTsKIAkJT1NTUiA9IE9TU1JfTTA7ICAvKiBDbGVhciBtYXRjaCBvbiB0aW1lciAwICovCkBAIC0xMjAsNiArMTMxLDQyIEBACiAJT1NDUiA9IDA7CQkvKiBpbml0aWFsaXplIGZyZWUtcnVubmluZyB0aW1lciwgZm9yY2UgZmlyc3QgbWF0Y2ggKi8KIH0KIAorI2lmZGVmIENPTkZJR19OT19JRExFX0haCitzdGF0aWMgaW50IHNhMTEwMF9keW5fdGlja19lbmFibGVfZGlzYWJsZSh2b2lkKQoreworCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2ExMTAwX2R5bl90aWNrX3JlcHJvZ3JhbSh1bnNpZ25lZCBsb25nIHRpY2tzKQoreworCWlmICh0aWNrcyA+IDEpIHsKKwkJaW5pdGlhbF9tYXRjaCA9IE9TTVIwOworCQlPU01SMCA9IGluaXRpYWxfbWF0Y2ggKyB0aWNrcyAqIExBVENIOworCQltYXRjaF9wb3Nwb25lZCA9IDE7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK3NhMTEwMF9keW5fdGlja19oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKG1hdGNoX3Bvc3BvbmVkKSB7CisJCW1hdGNoX3Bvc3BvbmVkID0gMDsKKwkJT1NNUjAgPSBpbml0aWFsX21hdGNoOworCQlpZiAoKHNpZ25lZCBsb25nKShpbml0aWFsX21hdGNoIC0gT1NDUikgPD0gMCkKKwkJCXJldHVybiBzYTExMDBfdGltZXJfaW50ZXJydXB0KGlycSwgZGV2X2lkLCByZWdzKTsKKwl9CisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgc3RydWN0IGR5bl90aWNrX3RpbWVyIHNhMTEwMF9keW5fdGljayA9IHsKKwkuZW5hYmxlCQk9IHNhMTEwMF9keW5fdGlja19lbmFibGVfZGlzYWJsZSwKKwkuZGlzYWJsZQk9IHNhMTEwMF9keW5fdGlja19lbmFibGVfZGlzYWJsZSwKKwkucmVwcm9ncmFtCT0gc2ExMTAwX2R5bl90aWNrX3JlcHJvZ3JhbSwKKwkuaGFuZGxlcgk9IHNhMTEwMF9keW5fdGlja19oYW5kbGVyLAorfTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BNCiB1bnNpZ25lZCBsb25nIG9zbXJbNF0sIG9pZXI7CiAKQEAgLTE1Niw0ICsyMDMsNyBAQAogCS5zdXNwZW5kCT0gc2ExMTAwX3RpbWVyX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBzYTExMDBfdGltZXJfcmVzdW1lLAogCS5vZmZzZXQJCT0gc2ExMTAwX2dldHRpbWVvZmZzZXQsCisjaWZkZWYgQ09ORklHX05PX0lETEVfSFoKKwkuZHluX3RpY2sJPSAmc2ExMTAwX2R5bl90aWNrLAorI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLXNoYXJrL2NvcmUuYwppbmRleCBlNzM3ZWFlLi45NDZjMGQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNoYXJrL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLXNoYXJrL2NvcmUuYwpAQCAtNDEsNyArNDEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAwLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCmluZGV4IGYwMWMwZjguLjNjODg2MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogCQlpcnEgKz0gSVJRX1NJQ19TVEFSVDsKIAogCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0JCWRlc2MtPmhhbmRsZShpcnEsIGRlc2MsIHJlZ3MpOworCQlkZXNjX2hhbmRsZV9pcnEoaXJxLCBkZXNjLCByZWdzKTsKIAl9IHdoaWxlIChzdGF0dXMpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9hbGlnbm1lbnQuYyBiL2FyY2gvYXJtL21tL2FsaWdubWVudC5jCmluZGV4IDgxZjRhOGEuLjRiMzlkODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2FsaWdubWVudC5jCisrKyBiL2FyY2gvYXJtL21tL2FsaWdubWVudC5jCkBAIC00NSw3ICs0NSw3IEBACiAKICNkZWZpbmUgTERTVF9QX0VRX1UoaSkJKCgoKGkpIF4gKChpKSA+PiAxKSkgJiAoMSA8PCAyMykpID09IDApCiAKLSNkZWZpbmUgTERTVEhfSV9CSVQoaSkJKGkgJiAoMSA8PCAyMikpCQkvKiBoYWxmLXdvcmQgaW1tZWQJKi8KKyNkZWZpbmUgTERTVEhEX0lfQklUKGkpCShpICYgKDEgPDwgMjIpKQkJLyogZG91YmxlL2hhbGYtd29yZCBpbW1lZCAqLwogI2RlZmluZSBMRE1fU19CSVQoaSkJKGkgJiAoMSA8PCAyMikpCQkvKiB3cml0ZSBDUFNSIGZyb20gU1BTUgkqLwogCiAjZGVmaW5lIFJOX0JJVFMoaSkJKChpID4+IDE2KSAmIDE1KQkvKiBSbgkJCSovCkBAIC02OCw2ICs2OCw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBhaV9za2lwcGVkOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgYWlfaGFsZjsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFpX3dvcmQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBhaV9kd29yZDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFpX211bHRpOwogc3RhdGljIGludCBhaV91c2VybW9kZTsKIApAQCAtOTMsNiArOTQsOCBAQAogCXAgKz0gc3ByaW50ZihwLCAiU2tpcHBlZDpcdCVsdVxuIiwgYWlfc2tpcHBlZCk7CiAJcCArPSBzcHJpbnRmKHAsICJIYWxmOlx0XHQlbHVcbiIsIGFpX2hhbGYpOwogCXAgKz0gc3ByaW50ZihwLCAiV29yZDpcdFx0JWx1XG4iLCBhaV93b3JkKTsKKwlpZiAoY3B1X2FyY2hpdGVjdHVyZSgpID49IENQVV9BUkNIX0FSTXY1VEUpCisJCXAgKz0gc3ByaW50ZihwLCAiRFdvcmQ6XHRcdCVsdVxuIiwgYWlfZHdvcmQpOwogCXAgKz0gc3ByaW50ZihwLCAiTXVsdGk6XHRcdCVsdVxuIiwgYWlfbXVsdGkpOwogCXAgKz0gc3ByaW50ZihwLCAiVXNlciBmYXVsdHM6XHQlaSAoJXMpXG4iLCBhaV91c2VybW9kZSwKIAkJCXVzZXJtb2RlX2FjdGlvblthaV91c2VybW9kZV0pOwpAQCAtMjgzLDEyICsyODYsNiBAQAogewogCXVuc2lnbmVkIGludCByZCA9IFJEX0JJVFMoaW5zdHIpOwogCi0JaWYgKChpbnN0ciAmIDB4MDFmMDBmZjApID09IDB4MDEwMDAwOTApCi0JCWdvdG8gc3dwOwotCi0JaWYgKChpbnN0ciAmIDB4OTApICE9IDB4OTAgfHwgKGluc3RyICYgMHg2MCkgPT0gMCkKLQkJZ290byBiYWQ7Ci0KIAlhaV9oYWxmICs9IDE7CiAKIAlpZiAodXNlcl9tb2RlKHJlZ3MpKQpAQCAtMzIzLDEwICszMjAsNDcgQEAKIAogIAlyZXR1cm4gVFlQRV9MRFNUOwogCi0gc3dwOgotCXByaW50ayhLRVJOX0VSUiAiQWxpZ25tZW50IHRyYXA6IG5vdCBoYW5kbGluZyBzd3AgaW5zdHJ1Y3Rpb25cbiIpOwotIGJhZDoKLQlyZXR1cm4gVFlQRV9FUlJPUjsKKyBmYXVsdDoKKwlyZXR1cm4gVFlQRV9GQVVMVDsKK30KKworc3RhdGljIGludAorZG9fYWxpZ25tZW50X2xkcmRzdHJkKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBpbnN0ciwKKwkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IHJkID0gUkRfQklUUyhpbnN0cik7CisKKwlhaV9kd29yZCArPSAxOworCisJaWYgKHVzZXJfbW9kZShyZWdzKSkKKwkJZ290byB1c2VyOworCisJaWYgKChpbnN0ciAmIDB4ZjApID09IDB4ZDApIHsKKwkJdW5zaWduZWQgbG9uZyB2YWw7CisJCWdldDMyX3VuYWxpZ25lZF9jaGVjayh2YWwsIGFkZHIpOworCQlyZWdzLT51cmVnc1tyZF0gPSB2YWw7CisJCWdldDMyX3VuYWxpZ25lZF9jaGVjayh2YWwsIGFkZHIrNCk7CisJCXJlZ3MtPnVyZWdzW3JkKzFdID0gdmFsOworCX0gZWxzZSB7CisJCXB1dDMyX3VuYWxpZ25lZF9jaGVjayhyZWdzLT51cmVnc1tyZF0sIGFkZHIpOworCQlwdXQzMl91bmFsaWduZWRfY2hlY2socmVncy0+dXJlZ3NbcmQrMV0sIGFkZHIrNCk7CisJfQorCisJcmV0dXJuIFRZUEVfTERTVDsKKworIHVzZXI6CisJaWYgKChpbnN0ciAmIDB4ZjApID09IDB4ZDApIHsKKwkJdW5zaWduZWQgbG9uZyB2YWw7CisJCWdldDMydF91bmFsaWduZWRfY2hlY2sodmFsLCBhZGRyKTsKKwkJcmVncy0+dXJlZ3NbcmRdID0gdmFsOworCQlnZXQzMnRfdW5hbGlnbmVkX2NoZWNrKHZhbCwgYWRkcis0KTsKKwkJcmVncy0+dXJlZ3NbcmQrMV0gPSB2YWw7CisJfSBlbHNlIHsKKwkJcHV0MzJ0X3VuYWxpZ25lZF9jaGVjayhyZWdzLT51cmVnc1tyZF0sIGFkZHIpOworCQlwdXQzMnRfdW5hbGlnbmVkX2NoZWNrKHJlZ3MtPnVyZWdzW3JkKzFdLCBhZGRyKzQpOworCX0KKworCXJldHVybiBUWVBFX0xEU1Q7CiAKICBmYXVsdDoKIAlyZXR1cm4gVFlQRV9GQVVMVDsKQEAgLTYxNywxMiArNjUxLDIwIEBACiAJcmVncy0+QVJNX3BjICs9IHRodW1iX21vZGUocmVncykgPyAyIDogNDsKIAogCXN3aXRjaCAoQ09ESU5HX0JJVFMoaW5zdHIpKSB7Ci0JY2FzZSAweDAwMDAwMDAwOgkvKiBsZHJoIG9yIHN0cmggKi8KLQkJaWYgKExEU1RIX0lfQklUKGluc3RyKSkKKwljYXNlIDB4MDAwMDAwMDA6CS8qIDMuMTMuNCBsb2FkL3N0b3JlIGluc3RydWN0aW9uIGV4dGVuc2lvbnMgKi8KKwkJaWYgKExEU1RIRF9JX0JJVChpbnN0cikpCiAJCQlvZmZzZXQudW4gPSAoaW5zdHIgJiAweGYwMCkgPj4gNCB8IChpbnN0ciAmIDE1KTsKIAkJZWxzZQogCQkJb2Zmc2V0LnVuID0gcmVncy0+dXJlZ3NbUk1fQklUUyhpbnN0cildOwotCQloYW5kbGVyID0gZG9fYWxpZ25tZW50X2xkcmhzdHJoOworCisJCWlmICgoaW5zdHIgJiAweDAwMDAwMGYwKSA9PSAweDAwMDAwMGIwIHx8IC8qIExEUkgsIFNUUkggKi8KKwkJICAgIChpbnN0ciAmIDB4MDAxMDAwZjApID09IDB4MDAxMDAwZjApICAgLyogTERSU0ggKi8KKwkJCWhhbmRsZXIgPSBkb19hbGlnbm1lbnRfbGRyaHN0cmg7CisJCWVsc2UgaWYgKChpbnN0ciAmIDB4MDAxMDAwZjApID09IDB4MDAwMDAwZDAgfHwgLyogTERSRCAqLworCQkJIChpbnN0ciAmIDB4MDAxMDAwZjApID09IDB4MDAwMDAwZjApICAgLyogU1RSRCAqLworCQkJaGFuZGxlciA9IGRvX2FsaWdubWVudF9sZHJkc3RyZDsKKwkJZWxzZQorCQkJZ290byBiYWQ7CiAJCWJyZWFrOwogCiAJY2FzZSAweDA0MDAwMDAwOgkvKiBsZHIgb3Igc3RyIGltbWVkaWF0ZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjMuUyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXYzLlMKaW5kZXggNDk0MGYxOS4uM2M1OGViYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjMuUworKysgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12My5TCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAJCS50ZXh0CiAJCS5hbGlnbgk1CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb3B5cGFnZS12NHdiLlMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12NHdiLlMKaW5kZXggYjk0YzM0NS4uODMxMTczNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3Yi5TCisrKyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0d2IuUwpAQCAtMTEsNyArMTEsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIAkudGV4dAogCS5hbGlnbgk1CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb3B5cGFnZS12NHd0LlMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12NHd0LlMKaW5kZXggOTc2NzkzOS4uZTFmMmFmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3dC5TCisrKyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0d3QuUwpAQCAtMTQsNyArMTQsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIAkudGV4dAogCS5hbGlnbgk1CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9mbHVzaC5jIGIvYXJjaC9hcm0vbW0vZmx1c2guYwppbmRleCAxOTE3ODhmLi5iMDIwOGM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9mbHVzaC5jCisrKyBiL2FyY2gvYXJtL21tL2ZsdXNoLmMKQEAgLTE2LDYgKzE2LDU4IEBACiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKICNpZmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1ZJUFQKKwordm9pZCBmbHVzaF9jYWNoZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlpZiAoY2FjaGVfaXNfdml2dCgpKSB7CisJCWlmIChjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtbS0+Y3B1X3ZtX21hc2spKQorCQkJX19jcHVjX2ZsdXNoX3VzZXJfYWxsKCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2FjaGVfaXNfdmlwdF9hbGlhc2luZygpKSB7CisJCWFzbSgJIm1jcglwMTUsIDAsICUwLCBjNywgYzE0LCAwXG4iCisJCSIJbWNyCXAxNSwgMCwgJTAsIGM3LCBjNSwgMFxuIgorCQkiCW1jcglwMTUsIDAsICUwLCBjNywgYzEwLCA0IgorCQkgICAgOgorCQkgICAgOiAiciIgKDApCisJCSAgICA6ICJjYyIpOworCX0KK30KKwordm9pZCBmbHVzaF9jYWNoZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJaWYgKGNhY2hlX2lzX3ZpdnQoKSkgeworCQlpZiAoY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgdm1hLT52bV9tbS0+Y3B1X3ZtX21hc2spKQorCQkJX19jcHVjX2ZsdXNoX3VzZXJfcmFuZ2Uoc3RhcnQgJiBQQUdFX01BU0ssIFBBR0VfQUxJR04oZW5kKSwKKwkJCQkJCXZtYS0+dm1fZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNhY2hlX2lzX3ZpcHRfYWxpYXNpbmcoKSkgeworCQlhc20oCSJtY3IJcDE1LCAwLCAlMCwgYzcsIGMxNCwgMFxuIgorCQkiCW1jcglwMTUsIDAsICUwLCBjNywgYzUsIDBcbiIKKwkJIgltY3IJcDE1LCAwLCAlMCwgYzcsIGMxMCwgNCIKKwkJICAgIDoKKwkJICAgIDogInIiICgwKQorCQkgICAgOiAiY2MiKTsKKwl9Cit9CisKK3ZvaWQgZmx1c2hfY2FjaGVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyB1c2VyX2FkZHIsIHVuc2lnbmVkIGxvbmcgcGZuKQoreworCWlmIChjYWNoZV9pc192aXZ0KCkpIHsKKwkJaWYgKGNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIHZtYS0+dm1fbW0tPmNwdV92bV9tYXNrKSkgeworCQkJdW5zaWduZWQgbG9uZyBhZGRyID0gdXNlcl9hZGRyICYgUEFHRV9NQVNLOworCQkJX19jcHVjX2ZsdXNoX3VzZXJfcmFuZ2UoYWRkciwgYWRkciArIFBBR0VfU0laRSwgdm1hLT52bV9mbGFncyk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmIChjYWNoZV9pc192aXB0X2FsaWFzaW5nKCkpCisJCWZsdXNoX3Bmbl9hbGlhcyhwZm4sIHVzZXJfYWRkcik7Cit9CisKICNkZWZpbmUgQUxJQVNfRkxVU0hfU1RBUlQJMHhmZmZmNDAwMAogCiAjZGVmaW5lIFRPUF9QVEUoeCkJcHRlX29mZnNldF9rZXJuZWwodG9wX3BtZCwgeCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL21tLWFybXYuYyBiL2FyY2gvYXJtL21tL21tLWFybXYuYwppbmRleCAzYzY1NWM1Li5kMTI1YTNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbS1hcm12LmMKKysrIGIvYXJjaC9hcm0vbW0vbW0tYXJtdi5jCkBAIC0yNzUsMTEgKzI3NSw5IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkgewotCQlhbGxvY19pbml0X3NlY3Rpb24odmlydCwgcGh5cyAmIFNVUEVSU0VDVElPTl9NQVNLLAotCQkJCSAgIHByb3QgfCBQTURfU0VDVF9TVVBFUik7CisJCWFsbG9jX2luaXRfc2VjdGlvbih2aXJ0LCBwaHlzLCBwcm90IHwgUE1EX1NFQ1RfU1VQRVIpOwogCiAJCXZpcnQgKz0gKFBHRElSX1NJWkUgLyAyKTsKLQkJcGh5cyArPSAoUEdESVJfU0laRSAvIDIpOwogCX0KIH0KIApAQCAtMjk3LDE0ICsyOTUsMTAgQEAKIAlwdGVfdCAqcHRlcDsKIAogCWlmIChwbWRfbm9uZSgqcG1kcCkpIHsKLQkJdW5zaWduZWQgbG9uZyBwbWR2YWw7CiAJCXB0ZXAgPSBhbGxvY19ib290bWVtX2xvd19wYWdlcygyICogUFRSU19QRVJfUFRFICoKIAkJCQkJICAgICAgIHNpemVvZihwdGVfdCkpOwogCi0JCXBtZHZhbCA9IF9fcGEocHRlcCkgfCBwcm90X2wxOwotCQlwbWRwWzBdID0gX19wbWQocG1kdmFsKTsKLQkJcG1kcFsxXSA9IF9fcG1kKHBtZHZhbCArIDI1NiAqIHNpemVvZihwdGVfdCkpOwotCQlmbHVzaF9wbWRfZW50cnkocG1kcCk7CisJCV9fcG1kX3BvcHVsYXRlKHBtZHAsIF9fcGEocHRlcCkgfCBwcm90X2wxKTsKIAl9CiAJcHRlcCA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZHAsIHZpcnQpOwogCkBAIC00NTksNyArNDUzLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCXVuc2lnbmVkIGxvbmcgdiA9IHBncHJvdF92YWwocHJvdGVjdGlvbl9tYXBbaV0pOwotCQl2ICY9ICh+KFBURV9CVUZGRVJBQkxFfFBURV9DQUNIRUFCTEUpKSB8IHVzZXJfcGdwcm90OworCQl2ID0gKHYgJiB+KFBURV9CVUZGRVJBQkxFfFBURV9DQUNIRUFCTEUpKSB8IHVzZXJfcGdwcm90OwogCQlwcm90ZWN0aW9uX21hcFtpXSA9IF9fcGdwcm90KHYpOwogCX0KIApAQCAtNTgzLDIzICs1NzcsMjMgQEAKICAqLwogdm9pZCBzZXR1cF9tbV9mb3JfcmVib290KGNoYXIgbW9kZSkKIHsKLQl1bnNpZ25lZCBsb25nIHBtZHZhbDsKKwl1bnNpZ25lZCBsb25nIGJhc2VfcG1kdmFsOwogCXBnZF90ICpwZ2Q7Ci0JcG1kX3QgKnBtZDsKIAlpbnQgaTsKLQlpbnQgY3B1X2FyY2ggPSBjcHVfYXJjaGl0ZWN0dXJlKCk7CiAKIAlpZiAoY3VycmVudC0+bW0gJiYgY3VycmVudC0+bW0tPnBnZCkKIAkJcGdkID0gY3VycmVudC0+bW0tPnBnZDsKIAllbHNlCiAJCXBnZCA9IGluaXRfbW0ucGdkOwogCi0JZm9yIChpID0gMDsgaSA8IEZJUlNUX1VTRVJfUEdEX05SICsgVVNFUl9QVFJTX1BFUl9QR0Q7IGkrKykgewotCQlwbWR2YWwgPSAoaSA8PCBQR0RJUl9TSElGVCkgfAotCQkJIFBNRF9TRUNUX0FQX1dSSVRFIHwgUE1EX1NFQ1RfQVBfUkVBRCB8Ci0JCQkgUE1EX1RZUEVfU0VDVDsKLQkJaWYgKGNwdV9hcmNoIDw9IENQVV9BUkNIX0FSTXY1VEVKKQotCQkJcG1kdmFsIHw9IFBNRF9CSVQ0OworCWJhc2VfcG1kdmFsID0gUE1EX1NFQ1RfQVBfV1JJVEUgfCBQTURfU0VDVF9BUF9SRUFEIHwgUE1EX1RZUEVfU0VDVDsKKwlpZiAoY3B1X2FyY2hpdGVjdHVyZSgpIDw9IENQVV9BUkNIX0FSTXY1VEVKKQorCQliYXNlX3BtZHZhbCB8PSBQTURfQklUNDsKKworCWZvciAoaSA9IDA7IGkgPCBGSVJTVF9VU0VSX1BHRF9OUiArIFVTRVJfUFRSU19QRVJfUEdEOyBpKyssIHBnZCsrKSB7CisJCXVuc2lnbmVkIGxvbmcgcG1kdmFsID0gKGkgPDwgUEdESVJfU0hJRlQpIHwgYmFzZV9wbWR2YWw7CisJCXBtZF90ICpwbWQ7CisKIAkJcG1kID0gcG1kX29mZihwZ2QsIGkgPDwgUEdESVJfU0hJRlQpOwogCQlwbWRbMF0gPSBfX3BtZChwbWR2YWwpOwogCQlwbWRbMV0gPSBfX3BtZChwbWR2YWwgKyAoMSA8PCAoUEdESVJfU0hJRlQgLSAxKSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUwppbmRleCA1YzBhZTUyLi4xZDczOWQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TCmluZGV4IGQ2OTM4OWMuLjliNzI1NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMGUuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKaW5kZXggNzQ3ZWQ5Ni4uMzdiNzBmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyNi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMKaW5kZXggMjQ4MTEwYy4uOTMxYjY5MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNl83LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTZfNy5TCmluZGV4IDBlZTIxNGIuLmQwZjFiYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNl83LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm02XzcuUwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KQEAgLTM4LDggKzM4LDggQEAKIAltcmMJcDE1LCAwLCByMSwgYzUsIGMwLCAwCQlAIGdldCBGU1IKIAltcmMJcDE1LCAwLCByMCwgYzYsIGMwLCAwCQlAIGdldCBGQVIKIAlsZHIJcjgsIFtyMF0JCQlAIHJlYWQgYXJtIGluc3RydWN0aW9uCi0JdHN0CXI4LCAjMSA8PCAyMAkJCUAgTCA9IDEgLT4gd3JpdGU/Ci0Jb3JyZXEJcjEsIHIxLCAjMSA8PCA4CQkJQCB5ZXMuCisJdHN0CXI4LCAjMSA8PCAyMAkJCUAgTCA9IDAgLT4gd3JpdGU/CisJb3JyZXEJcjEsIHIxLCAjMSA8PCAxMQkJQCB5ZXMuCiAJYW5kCXI3LCByOCwgIzE1IDw8IDI0CiAJYWRkCXBjLCBwYywgcjcsIGxzciAjMjIJCUAgTm93IGJyYW5jaCB0byB0aGUgcmVsZXZhbnQgcHJvY2Vzc2luZyByb3V0aW5lCiAJbm9wCkBAIC03MSw4ICs3MSw4IEBACiAJbXJjCXAxNSwgMCwgcjEsIGM1LCBjMCwgMAkJQCBnZXQgRlNSCiAJbXJjCXAxNSwgMCwgcjAsIGM2LCBjMCwgMAkJQCBnZXQgRkFSCiAJbGRyCXI4LCBbcjJdCQkJQCByZWFkIGFybSBpbnN0cnVjdGlvbgotCXRzdAlyOCwgIzEgPDwgMjAJCQlAIEwgPSAxIC0+IHdyaXRlPwotCW9ycmVxCXIxLCByMSwgIzEgPDwgOAkJCUAgeWVzLgorCXRzdAlyOCwgIzEgPDwgMjAJCQlAIEwgPSAwIC0+IHdyaXRlPworCW9ycmVxCXIxLCByMSwgIzEgPDwgMTEJCUAgeWVzLgogCWFuZAlyNywgcjgsICMxNCA8PCAyNAogCXRlcQlyNywgIzggPDwgMjQJCQlAIHdhcyBpdCBsZG0vc3RtCiAJbW92bmUJcGMsIGxyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTcyMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUwppbmRleCA1N2NmYTZhLi5jNjljOWRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTcyMC5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLW1hY3Jvcy5TIGIvYXJjaC9hcm0vbW0vcHJvYy1tYWNyb3MuUwppbmRleCA5MTM3ZmU1Li43Y2ZjMjYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLW1hY3Jvcy5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtbWFjcm9zLlMKQEAgLTQsNyArNCw3IEBACiAgKiAgVk1BX1ZNX0ZMQUdTCiAgKiAgVk1fRVhFQwogICovCi0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TCmluZGV4IDM2MGNhZTkuLjM0ZjdlN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwLlMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TCmluZGV4IGQ0NDdjZDUuLmNhMTRmODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy12Ni5TIGIvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCmluZGV4IDEzOWEzODYuLmViMzQ4MjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtdjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXY2LlMKQEAgLTExLDcgKzExLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3RsYi12My5TIGIvYXJjaC9hcm0vbW0vdGxiLXYzLlMKaW5kZXggNDRiMGRhZS4uYzEwNzg2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vdGxiLXYzLlMKKysrIGIvYXJjaC9hcm0vbW0vdGxiLXYzLlMKQEAgLTEzLDcgKzEzLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3RsYi12NC5TIGIvYXJjaC9hcm0vbW0vdGxiLXY0LlMKaW5kZXggZGI4MmVlNC4uZDZjOTQ0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vdGxiLXY0LlMKKysrIGIvYXJjaC9hcm0vbW0vdGxiLXY0LlMKQEAgLTE0LDcgKzE0LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3RsYi12NHdiLlMgYi9hcmNoL2FybS9tbS90bGItdjR3Yi5TCmluZGV4IDc5MDhkNWYuLmNiODI5Y2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3RsYi12NHdiLlMKKysrIGIvYXJjaC9hcm0vbW0vdGxiLXY0d2IuUwpAQCAtMTQsNyArMTQsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vdGxiLXY0d2JpLlMgYi9hcmNoL2FybS9tbS90bGItdjR3YmkuUwppbmRleCBlZmJlOTRiLi42MGNmYzRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS90bGItdjR3YmkuUworKysgYi9hcmNoL2FybS9tbS90bGItdjR3YmkuUwpAQCAtMTQsNyArMTQsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vdGxiLXY2LlMgYi9hcmNoL2FybS9tbS90bGItdjYuUwppbmRleCA5OWVkMjZlLi42Zjc2Yjg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS90bGItdjYuUworKysgYi9hcmNoL2FybS9tbS90bGItdjYuUwpAQCAtMTEsNyArMTEsNyBAQAogICogIFRoZXNlIGFzc3VtZSBhIHNwbGl0IEkvRCBUTEIuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL253ZnBlL2VudHJ5MjYuUyBiL2FyY2gvYXJtL253ZnBlL2VudHJ5MjYuUwppbmRleCAwZWQzOGIwLi41MTk0MGE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ud2ZwZS9lbnRyeTI2LlMKKysrIGIvYXJjaC9hcm0vbndmcGUvZW50cnkyNi5TCkBAIC0yMCw3ICsyMCw3IEBACiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCi0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAvKiBUaGlzIGlzIHRoZSBrZXJuZWwncyBlbnRyeSBwb2ludCBpbnRvIHRoZSBmbG9hdGluZyBwb2ludCBlbXVsYXRvci4KIEl0IGlzIGNhbGxlZCBmcm9tIHRoZSBrZXJuZWwgd2l0aCBjb2RlIHNpbWlsYXIgdG8gdGhpczoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKaW5kZXggMzQ1MzY1OC4uOTY5M2U5YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKQEAgLTkxLDYgKzkxLDEzIEBACiAJICBLZXJuZWwgaW50ZXJuYWwgdGltZXIgZnJlcXVlbmN5IHNob3VsZCBiZSBhIGRpdmlzb3Igb2YgMzI3NjgsCiAJICBzdWNoIGFzIDY0IG9yIDEyOC4KIAorY29uZmlnIE9NQVBfRE1fVElNRVIKKwlib29sICJVc2UgZHVhbC1tb2RlIHRpbWVyIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAorCWhlbHAKKwkgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBPTUFQIER1YWwtTW9kZSB0aW1lcnMuCisKIGNob2ljZQogCXByb21wdCAiTG93LWxldmVsIGRlYnVnIGNvbnNvbGUgVUFSVCIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUApAQCAtMTA3LDYgKzExNCwxNSBAQAogCiBlbmRjaG9pY2UKIAorY29uZmlnIE9NQVBfU0VSSUFMX1dBS0UKKwlib29sICJFbmFibGUgd2FrZS11cCBldmVudHMgZm9yIHNlcmlhbCBwb3J0cyIKKwlkZXBlbmRzIE9NQVBfTVVYCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGhhdmUgeW91ciBzeXN0ZW0gd2FrZSB1cAorCSAgdG8gZGF0YSBvbiB0aGUgc2VyaWFsIFJYIGxpbmUuIFRoaXMgYWxsb3dzIHlvdSB0byB3YWtlIHRoZQorCSAgc3lzdGVtIGZyb20gc2VyaWFsIGNvbnNvbGUuCisKIGVuZG1lbnUKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZQppbmRleCA1MzFlMTFhLi43ZTE0NGY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIwogCiAjIENvbW1vbiBzdXBwb3J0Ci1vYmoteSA6PSBjb21tb24ubyBkbWEubyBjbG9jay5vIG11eC5vIGdwaW8ubyBtY2JzcC5vIHVzYi5vCitvYmoteSA6PSBjb21tb24ubyBzcmFtLm8gc3JhbS1mbi5vIGNsb2NrLm8gZG1hLm8gbXV4Lm8gZ3Bpby5vIG1jYnNwLm8gdXNiLm8KIG9iai1tIDo9CiBvYmotbiA6PQogb2JqLSAgOj0KQEAgLTE1LDMgKzE1LDUgQEAKIG9iai0kKENPTkZJR19QTSkgKz0gcG0ubyBzbGVlcC5vCiAKIG9iai0kKENPTkZJR19DUFVfRlJFUSkgKz0gY3B1LW9tYXAubworb2JqLSQoQ09ORklHX09NQVBfRE1fVElNRVIpICs9IGRtdGltZXIubworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCmluZGV4IDU5ZDkxYjMuLjUyYTU4YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgInNyYW0uaCIKIAogc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOwogc3RhdGljIERFQ0xBUkVfTVVURVgoY2xvY2tzX3NlbSk7CkBAIC0xNDEsNyArMTQyLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGFybXBlcl9jayA9IHsKIAkubmFtZQkJPSAiYXJtcGVyX2NrIiwKIAkucGFyZW50CQk9ICZja19kcGxsMSwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDczMCB8IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKIAkJCSAgUkFURV9DS0NUTCwKIAkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAogCS5lbmFibGVfYml0CT0gRU5fUEVSQ0ssCkBAIC0zODUsNyArMzg2LDggQEAKIAkubmFtZQkJPSAidWFydDJfY2siLAogCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLwogCS5yYXRlCQk9IDEyMDAwMDAwLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwgRU5BQkxFX1JFR18zMkJJVCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8IEVOQUJMRV9SRUdfMzJCSVQgfAorCQkJICBBTFdBWVNfRU5BQkxFRCwKIAkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKIAkuZW5hYmxlX2JpdAk9IDMwLAkvKiBDaG9vc2VzIGJldHdlZW4gMTJNSHogYW5kIDQ4TUh6ICovCiAJLnNldF9yYXRlCT0gJnNldF91YXJ0X3JhdGUsCkBAIC00NDMsNiArNDQ1LDE1IEBACiAJLmVuYWJsZV9iaXQJPSA4IC8qIFVIT1NUX0VOICovLAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGsgdXNiX2RjX2NrID0geworCS5uYW1lCQk9ICJ1c2JfZGNfY2siLAorCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLworCS5yYXRlCQk9IDQ4MDAwMDAwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCB8IFJBVEVfRklYRUQsCisJLmVuYWJsZV9yZWcJPSBTT0ZUX1JFUV9SRUcsCisJLmVuYWJsZV9iaXQJPSA0LAorfTsKKwogc3RhdGljIHN0cnVjdCBjbGsgbWNsa18xNTEwID0gewogCS5uYW1lCQk9ICJtY2xrIiwKIAkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQuIE1heSBiZSBlbmFibGVkIGJ5IGV4dCBoYXJkd2FyZS4gKi8KQEAgLTU1Miw2ICs1NjMsNyBAQAogCSZ1YXJ0M18xNnh4LAogCSZ1c2JfY2xrbywKIAkmdXNiX2hoY19jazE1MTAsICZ1c2JfaGhjX2NrMTZ4eCwKKwkmdXNiX2RjX2NrLAogCSZtY2xrXzE1MTAsICAmbWNsa18xNnh4LAogCSZiY2xrXzE1MTAsICAmYmNsa18xNnh4LAogCSZtbWMxX2NrLApAQCAtOTQ2LDE0ICs5NTgsMTMgQEAKIAlpZiAoIXB0ci0+cmF0ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIXB0ci0+cmF0ZSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBJbiBtb3N0IGNhc2VzIHdlIHNob3VsZCBub3QgbmVlZCB0byByZXByb2dyYW0gRFBMTC4KKwkgKiBSZXByb2dyYW1taW5nIHRoZSBEUExMIGlzIHRyaWNreSwgaXQgbXVzdCBiZSBkb25lIGZyb20gU1JBTS4KKwkgKi8KKwlvbWFwX3NyYW1fcmVwcm9ncmFtX2Nsb2NrKHB0ci0+ZHBsbGN0bF92YWwsIHB0ci0+Y2tjdGxfdmFsKTsKIAotCWlmICh1bmxpa2VseShja19kcGxsMS5yYXRlID09IDApKSB7Ci0JCW9tYXBfd3JpdGV3KHB0ci0+ZHBsbGN0bF92YWwsIERQTExfQ1RMKTsKLQkJY2tfZHBsbDEucmF0ZSA9IHB0ci0+cGxsX3JhdGU7Ci0JfQotCW9tYXBfd3JpdGV3KHB0ci0+Y2tjdGxfdmFsLCBBUk1fQ0tDVEwpOworCWNrX2RwbGwxLnJhdGUgPSBwdHItPnBsbF9yYXRlOwogCXByb3BhZ2F0ZV9yYXRlKCZja19kcGxsMSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjI0LDkgKzEyMzUsMTEgQEAKICNlbmRpZgogCS8qIENhY2hlIHJhdGVzIGZvciBjbG9ja3MgY29ubmVjdGVkIHRvIGNrX3JlZiAobm90IGRwbGwxKSAqLwogCXByb3BhZ2F0ZV9yYXRlKCZja19yZWYpOwotCXByaW50ayhLRVJOX0lORk8gIkNsb2NraW5nIHJhdGUgKHh0YWwvRFBMTDEvTVBVKTogJWxkLiUwMWxkLyVsZC8lbGQgTUh6XG4iLAorCXByaW50ayhLRVJOX0lORk8gIkNsb2NraW5nIHJhdGUgKHh0YWwvRFBMTDEvTVBVKTogIgorCQkiJWxkLiUwMWxkLyVsZC4lMDFsZC8lbGQuJTAxbGQgTUh6XG4iLAogCSAgICAgICBja19yZWYucmF0ZSAvIDEwMDAwMDAsIChja19yZWYucmF0ZSAvIDEwMDAwMCkgJSAxMCwKLQkgICAgICAgY2tfZHBsbDEucmF0ZSwgYXJtX2NrLnJhdGUpOworCSAgICAgICBja19kcGxsMS5yYXRlIC8gMTAwMDAwMCwgKGNrX2RwbGwxLnJhdGUgLyAxMDAwMDApICUgMTAsCisJICAgICAgIGFybV9jay5yYXRlIC8gMTAwMDAwMCwgKGFybV9jay5yYXRlIC8gMTAwMDAwKSAlIDEwKTsKIAogI2lmZGVmIENPTkZJR19NQUNIX09NQVBfUEVSU0VVUzIKIAkvKiBTZWxlY3Qgc2xpY2VyIG91dHB1dCBhcyBPTUFQIGlucHV0IGNsb2NrICovCkBAIC0xMjcxLDcgKzEyODQsOSBAQAogCXN0cnVjdCBjbGsgKnA7CiAJX191MzIgcmVndmFsMzI7CiAKLQlvbWFwX3dyaXRldygwLCBTT0ZUX1JFUV9SRUcpOworCS8qIFVTQl9SRVFfRU4gd2lsbCBiZSBkaXNhYmxlZCBsYXRlciBpZiBuZWNlc3NhcnkgKHVzYl9kY19jaykgKi8KKwlyZWd2YWwzMiA9IG9tYXBfcmVhZHcoU09GVF9SRVFfUkVHKSAmICgxIDw8IDQpOworCW9tYXBfd3JpdGV3KHJlZ3ZhbDMyLCBTT0ZUX1JFUV9SRUcpOwogCW9tYXBfd3JpdGV3KDAsIFNPRlRfUkVRX1JFRzIpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMKaW5kZXggZWE5NjdhOC4uNmNiMjBhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgpAQCAtMzUsMTEgKzM2LDExIEBACiAKICNkZWZpbmUgTk9fTEVOR1RIX0NIRUNLIDB4ZmZmZmZmZmYKIAotZXh0ZXJuIGludCBvbWFwX2Jvb3Rsb2FkZXJfdGFnX2xlbjsKLWV4dGVybiB1OCBvbWFwX2Jvb3Rsb2FkZXJfdGFnW107Cit1bnNpZ25lZCBjaGFyIG9tYXBfYm9vdGxvYWRlcl90YWdbNTEyXTsKK2ludCBvbWFwX2Jvb3Rsb2FkZXJfdGFnX2xlbjsKIAogc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCAqb21hcF9ib2FyZF9jb25maWc7Ci1pbnQgb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IDA7CitpbnQgb21hcF9ib2FyZF9jb25maWdfc2l6ZTsKIAogc3RhdGljIGNvbnN0IHZvaWQgKmdldF9jb25maWcodTE2IHRhZywgc2l6ZV90IGxlbiwgaW50IHNraXAsIHNpemVfdCAqbGVuX291dCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYwppbmRleCBjMGE1YzJmLi5kYTdiNjUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJZG1hX2NoYW5bY2ggKyA2XS5zYXZlZF9jc3IgPSBjc3IgPj4gNzsKIAkJY3NyICY9IDB4N2Y7CiAJfQotCWlmICghY3NyKQorCWlmICgoY3NyICYgMHgzZikgPT0gMCkKIAkJcmV0dXJuIDA7CiAJaWYgKHVubGlrZWx5KGRtYV9jaGFuW2NoXS5kZXZfaWQgPT0gLTEpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNwdXJpb3VzIGludGVycnVwdCBmcm9tIERNQSBjaGFubmVsICVkIChDU1IgJTA0eClcbiIsCkBAIC04OTAsMTEgKzg5MCwxMSBAQAogCXcgfD0gMSA8PCA4OwogCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CiAKKwlsY2RfZG1hLmFjdGl2ZSA9IDE7CisKIAl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7CiAJdyB8PSAxIDw8IDc7CiAJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwotCi0JbGNkX2RtYS5hY3RpdmUgPSAxOwogfQogCiB2b2lkIG9tYXBfc2V0dXBfbGNkX2RtYSh2b2lkKQpAQCAtOTY1LDggKzk2NSw4IEBACiAgKi8KIGRtYV9hZGRyX3Qgb21hcF9nZXRfZG1hX3NyY19wb3MoaW50IGxjaCkKIHsKLQlyZXR1cm4gKGRtYV9hZGRyX3QpIChPTUFQX0RNQV9DU1NBX0wobGNoKSB8Ci0JCQkgICAgIChPTUFQX0RNQV9DU1NBX1UobGNoKSA8PCAxNikpOworCXJldHVybiAoZG1hX2FkZHJfdCkgKG9tYXBfcmVhZHcoT01BUF9ETUFfQ1NTQV9MKGxjaCkpIHwKKwkob21hcF9yZWFkdyhPTUFQX0RNQV9DU1NBX1UobGNoKSkgPDwgMTYpKTsKIH0KIAogLyoKQEAgLTk3OSw4ICs5NzksMTggQEAKICAqLwogZG1hX2FkZHJfdCBvbWFwX2dldF9kbWFfZHN0X3BvcyhpbnQgbGNoKQogewotCXJldHVybiAoZG1hX2FkZHJfdCkgKE9NQVBfRE1BX0NEU0FfTChsY2gpIHwKLQkJCSAgICAgKE9NQVBfRE1BX0NEU0FfVShsY2gpIDw8IDE2KSk7CisJcmV0dXJuIChkbWFfYWRkcl90KSAob21hcF9yZWFkdyhPTUFQX0RNQV9DRFNBX0wobGNoKSkgfAorCShvbWFwX3JlYWR3KE9NQVBfRE1BX0NEU0FfVShsY2gpKSA8PCAxNikpOworfQorCisvKgorICogUmV0dXJucyBjdXJyZW50IHNvdXJjZSB0cmFuc2ZlciBjb3VudGluZyBmb3IgdGhlIGdpdmVuIERNQSBjaGFubmVsLgorICogQ2FuIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgcHJvZ3Jlc3Mgb2YgYSB0cmFuc2ZlciBpbnNpZGUgYSAgYmxvY2suCisgKiBJdCBtdXN0IGJlIGNhbGxlZCB3aXRoIGRpc2FibGVkIGludGVycnVwdHMuCisgKi8KK2ludCBvbWFwX2dldF9kbWFfc3JjX2FkZHJfY291bnRlcihpbnQgbGNoKQoreworCXJldHVybiAoZG1hX2FkZHJfdCkgb21hcF9yZWFkdyhPTUFQX0RNQV9DU0FDKGxjaCkpOwogfQogCiBpbnQgb21hcF9kbWFfcnVubmluZyh2b2lkKQpAQCAtMTA3Niw2ICsxMDg2LDcgQEAKIAogRVhQT1JUX1NZTUJPTChvbWFwX2dldF9kbWFfc3JjX3Bvcyk7CiBFWFBPUlRfU1lNQk9MKG9tYXBfZ2V0X2RtYV9kc3RfcG9zKTsKK0VYUE9SVF9TWU1CT0wob21hcF9nZXRfZG1hX3NyY19hZGRyX2NvdW50ZXIpOwogRVhQT1JUX1NZTUJPTChvbWFwX2NsZWFyX2RtYSk7CiBFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9wcmlvcml0eSk7CiBFWFBPUlRfU1lNQk9MKG9tYXBfcmVxdWVzdF9kbWEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0NjhkNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvZG10aW1lci5jCisgKgorICogT01BUCBEdWFsLU1vZGUgVGltZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IExhdXJpIExldWtrdW5lbiA8bGF1cmkubGV1a2t1bmVuQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KKyAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2RtdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNkZWZpbmUgT01BUF9USU1FUl9DT1VOVAkJOAorCisjZGVmaW5lIE9NQVBfVElNRVJfSURfUkVHCQkweDAwCisjZGVmaW5lIE9NQVBfVElNRVJfT0NQX0NGR19SRUcJCTB4MTAKKyNkZWZpbmUgT01BUF9USU1FUl9TWVNfU1RBVF9SRUcJCTB4MTQKKyNkZWZpbmUgT01BUF9USU1FUl9TVEFUX1JFRwkJMHgxOAorI2RlZmluZSBPTUFQX1RJTUVSX0lOVF9FTl9SRUcJCTB4MWMKKyNkZWZpbmUgT01BUF9USU1FUl9XQUtFVVBfRU5fUkVHCTB4MjAKKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX1JFRwkJMHgyNAorI2RlZmluZSBPTUFQX1RJTUVSX0NPVU5URVJfUkVHCQkweDI4CisjZGVmaW5lIE9NQVBfVElNRVJfTE9BRF9SRUcJCTB4MmMKKyNkZWZpbmUgT01BUF9USU1FUl9UUklHR0VSX1JFRwkJMHgzMAorI2RlZmluZSBPTUFQX1RJTUVSX1dSSVRFX1BFTkRfUkVHIAkweDM0CisjZGVmaW5lIE9NQVBfVElNRVJfTUFUQ0hfUkVHCQkweDM4CisjZGVmaW5lIE9NQVBfVElNRVJfQ0FQVFVSRV9SRUcJCTB4M2MKKyNkZWZpbmUgT01BUF9USU1FUl9JRl9DVFJMX1JFRwkJMHg0MAorCisKK3N0YXRpYyBzdHJ1Y3QgZG10aW1lcl9pbmZvX3N0cnVjdCB7CisJc3RydWN0IGxpc3RfaGVhZAl1bnVzZWRfdGltZXJzOworCXN0cnVjdCBsaXN0X2hlYWQJcmVzZXJ2ZWRfdGltZXJzOworfSBkbV90aW1lcl9pbmZvOworCitzdGF0aWMgc3RydWN0IG9tYXBfZG1fdGltZXIgZG1fdGltZXJzW10gPSB7CisJeyAuYmFzZT0weGZmZmIxNDAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVIxIH0sCisJeyAuYmFzZT0weGZmZmIxYzAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVIyIH0sCisJeyAuYmFzZT0weGZmZmIyNDAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVIzIH0sCisJeyAuYmFzZT0weGZmZmIyYzAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVI0IH0sCisJeyAuYmFzZT0weGZmZmIzNDAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVI1IH0sCisJeyAuYmFzZT0weGZmZmIzYzAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVI2IH0sCisJeyAuYmFzZT0weGZmZmI0NDAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVI3IH0sCisJeyAuYmFzZT0weGZmZmI0YzAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVI4IH0sCisJeyAuYmFzZT0weDAgfSwKK307CisKKworc3RhdGljIHNwaW5sb2NrX3QgZG1fdGltZXJfbG9jazsKKworCitpbmxpbmUgdm9pZCBvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCByZWcsIHUzMiB2YWx1ZSkKK3sKKwlvbWFwX3dyaXRlbCh2YWx1ZSwgdGltZXItPmJhc2UgKyByZWcpOworCXdoaWxlIChvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX1dSSVRFX1BFTkRfUkVHKSkKKwkJOworfQorCit1MzIgb21hcF9kbV90aW1lcl9yZWFkX3JlZyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCByZWcpCit7CisJcmV0dXJuIG9tYXBfcmVhZGwodGltZXItPmJhc2UgKyByZWcpOworfQorCitpbnQgb21hcF9kbV90aW1lcnNfYWN0aXZlKHZvaWQpCit7CisJc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyOworCisJZm9yICh0aW1lciA9ICZkbV90aW1lcnNbMF07IHRpbWVyLT5iYXNlOyArK3RpbWVyKQorCQlpZiAob21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRykgJgorCQkgICAgT01BUF9USU1FUl9DVFJMX1NUKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIG9tYXBfZG1fdGltZXJfc2V0X3NvdXJjZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBzb3VyY2UpCit7CisJaW50IG4gPSAodGltZXIgLSBkbV90aW1lcnMpIDw8IDE7CisJdTMyIGw7CisKKwlsID0gb21hcF9yZWFkbChNT0RfQ09ORl9DVFJMXzEpICYgfigweDAzIDw8IG4pOworCWwgfD0gc291cmNlIDw8IG47CisJb21hcF93cml0ZWwobCwgTU9EX0NPTkZfQ1RSTF8xKTsKK30KKworCitzdGF0aWMgdm9pZCBvbWFwX2RtX3RpbWVyX3Jlc2V0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwkvKiBSZXNldCBhbmQgc2V0IHBvc3RlZCBtb2RlICovCisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfSUZfQ1RSTF9SRUcsIDB4MDYpOworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX09DUF9DRkdfUkVHLCAweDAyKTsKKworCW9tYXBfZG1fdGltZXJfc2V0X3NvdXJjZSh0aW1lciwgT01BUF9USU1FUl9TUkNfQVJNWE9SKTsKK30KKworCisKK3N0cnVjdCBvbWFwX2RtX3RpbWVyICogb21hcF9kbV90aW1lcl9yZXF1ZXN0KHZvaWQpCit7CisJc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtX3RpbWVyX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmRtX3RpbWVyX2luZm8udW51c2VkX3RpbWVycykpIHsKKwkJdGltZXIgPSAoc3RydWN0IG9tYXBfZG1fdGltZXIgKikKKwkJCQlkbV90aW1lcl9pbmZvLnVudXNlZF90aW1lcnMubmV4dDsKKwkJbGlzdF9tb3ZlX3RhaWwoKHN0cnVjdCBsaXN0X2hlYWQgKil0aW1lciwKKwkJCQkmZG1fdGltZXJfaW5mby5yZXNlcnZlZF90aW1lcnMpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdGltZXI7Cit9CisKKwordm9pZCBvbWFwX2RtX3RpbWVyX2ZyZWUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlvbWFwX2RtX3RpbWVyX3Jlc2V0KHRpbWVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7CisJbGlzdF9tb3ZlX3RhaWwoKHN0cnVjdCBsaXN0X2hlYWQgKil0aW1lciwgJmRtX3RpbWVyX2luZm8udW51c2VkX3RpbWVycyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1fdGltZXJfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIG9tYXBfZG1fdGltZXJfc2V0X2ludF9lbmFibGUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLAorCQkJCXVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9JTlRfRU5fUkVHLCB2YWx1ZSk7Cit9CisKK3Vuc2lnbmVkIGludCBvbWFwX2RtX3RpbWVyX3JlYWRfc3RhdHVzKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwlyZXR1cm4gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9TVEFUX1JFRyk7Cit9CisKK3ZvaWQgb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXMoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfU1RBVF9SRUcsIHZhbHVlKTsKK30KKwordm9pZCBvbWFwX2RtX3RpbWVyX2VuYWJsZV9hdXRvcmVsb2FkKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwl1MzIgbDsKKwlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CisJbCB8PSBPTUFQX1RJTUVSX0NUUkxfQVI7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGwpOworfQorCit2b2lkIG9tYXBfZG1fdGltZXJfdHJpZ2dlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCit7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfVFJJR0dFUl9SRUcsIDEpOworfQorCit2b2lkIG9tYXBfZG1fdGltZXJfc2V0X3RyaWdnZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdTMyIGw7CisKKwlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CisJbCB8PSB2YWx1ZSAmIDB4MzsKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgbCk7Cit9CisKK3ZvaWQgb21hcF9kbV90aW1lcl9zdGFydChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCit7CisJdTMyIGw7CisKKwlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CisJbCB8PSBPTUFQX1RJTUVSX0NUUkxfU1Q7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGwpOworfQorCit2b2lkIG9tYXBfZG1fdGltZXJfc3RvcChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCit7CisJdTMyIGw7CisKKwlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CisJbCAmPSB+MHgxOworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBsKTsKK30KKwordW5zaWduZWQgaW50IG9tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwlyZXR1cm4gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DT1VOVEVSX1JFRyk7Cit9CisKK3ZvaWQgb21hcF9kbV90aW1lcl9yZXNldF9jb3VudGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DT1VOVEVSX1JFRywgMCk7Cit9CisKK3ZvaWQgb21hcF9kbV90aW1lcl9zZXRfbG9hZChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCBsb2FkKQoreworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0xPQURfUkVHLCBsb2FkKTsKK30KKwordm9pZCBvbWFwX2RtX3RpbWVyX3NldF9tYXRjaChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCBtYXRjaCkKK3sKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9NQVRDSF9SRUcsIG1hdGNoKTsKK30KKwordm9pZCBvbWFwX2RtX3RpbWVyX2VuYWJsZV9jb21wYXJlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwl1MzIgbDsKKworCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKTsKKwlsIHw9IE9NQVBfVElNRVJfQ1RSTF9DRTsKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgbCk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIF9fZG1fdGltZXJfaW5pdCh2b2lkKQoreworCXN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcjsKKworCXNwaW5fbG9ja19pbml0KCZkbV90aW1lcl9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmZG1fdGltZXJfaW5mby51bnVzZWRfdGltZXJzKTsKKwlJTklUX0xJU1RfSEVBRCgmZG1fdGltZXJfaW5mby5yZXNlcnZlZF90aW1lcnMpOworCisJdGltZXIgPSAmZG1fdGltZXJzWzBdOworCXdoaWxlICh0aW1lci0+YmFzZSkgeworCQlsaXN0X2FkZF90YWlsKChzdHJ1Y3QgbGlzdF9oZWFkICopdGltZXIsICZkbV90aW1lcl9pbmZvLnVudXNlZF90aW1lcnMpOworCQlvbWFwX2RtX3RpbWVyX3Jlc2V0KHRpbWVyKTsKKwkJdGltZXIrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfZG1fdGltZXJfaW5pdCh2b2lkKQoreworCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKKwkJX19kbV90aW1lcl9pbml0KCk7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwob21hcF9kbV90aW1lcl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCmluZGV4IDFjODViNGUuLjU1MDU5YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBTdXBwb3J0IGZ1bmN0aW9ucyBmb3IgT01BUCBHUElPCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAzIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgogICogV3JpdHRlbiBieSBKdWhhIFlyavZs5CA8anVoYS55cmpvbGFAbm9raWEuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0xNyw4ICsxNywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KQEAgLTI5LDcgKzMyLDcgQEAKIC8qCiAgKiBPTUFQMTUxMCBHUElPIHJlZ2lzdGVycwogICovCi0jZGVmaW5lIE9NQVAxNTEwX0dQSU9fQkFTRQkJMHhmZmZjZTAwMAorI2RlZmluZSBPTUFQMTUxMF9HUElPX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmNlMDAwCiAjZGVmaW5lIE9NQVAxNTEwX0dQSU9fREFUQV9JTlBVVAkweDAwCiAjZGVmaW5lIE9NQVAxNTEwX0dQSU9fREFUQV9PVVRQVVQJMHgwNAogI2RlZmluZSBPTUFQMTUxMF9HUElPX0RJUl9DT05UUk9MCTB4MDgKQEAgLTQzLDM0ICs0NiwzNyBAQAogLyoKICAqIE9NQVAxNjEwIHNwZWNpZmljIEdQSU8gcmVnaXN0ZXJzCiAgKi8KLSNkZWZpbmUgT01BUDE2MTBfR1BJTzFfQkFTRQkJMHhmZmZiZTQwMAotI2RlZmluZSBPTUFQMTYxMF9HUElPMl9CQVNFCQkweGZmZmJlYzAwCi0jZGVmaW5lIE9NQVAxNjEwX0dQSU8zX0JBU0UJCTB4ZmZmYmI0MDAKLSNkZWZpbmUgT01BUDE2MTBfR1BJTzRfQkFTRQkJMHhmZmZiYmMwMAorI2RlZmluZSBPTUFQMTYxMF9HUElPMV9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZTQwMAorI2RlZmluZSBPTUFQMTYxMF9HUElPMl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZWMwMAorI2RlZmluZSBPTUFQMTYxMF9HUElPM19CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiYjQwMAorI2RlZmluZSBPTUFQMTYxMF9HUElPNF9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiYmMwMAogI2RlZmluZSBPTUFQMTYxMF9HUElPX1JFVklTSU9OCQkweDAwMDAKICNkZWZpbmUgT01BUDE2MTBfR1BJT19TWVNDT05GSUcJCTB4MDAxMAogI2RlZmluZSBPTUFQMTYxMF9HUElPX1NZU1NUQVRVUwkJMHgwMDE0CiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fSVJRU1RBVFVTMQkweDAwMTgKICNkZWZpbmUgT01BUDE2MTBfR1BJT19JUlFFTkFCTEUxCTB4MDAxYworI2RlZmluZSBPTUFQMTYxMF9HUElPX1dBS0VVUEVOQUJMRQkweDAwMjgKICNkZWZpbmUgT01BUDE2MTBfR1BJT19EQVRBSU4JCTB4MDAyYwogI2RlZmluZSBPTUFQMTYxMF9HUElPX0RBVEFPVVQJCTB4MDAzMAogI2RlZmluZSBPTUFQMTYxMF9HUElPX0RJUkVDVElPTgkJMHgwMDM0CiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMQkweDAwMzgKICNkZWZpbmUgT01BUDE2MTBfR1BJT19FREdFX0NUUkwyCTB4MDAzYwogI2RlZmluZSBPTUFQMTYxMF9HUElPX0NMRUFSX0lSUUVOQUJMRTEJMHgwMDljCisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fQ0xFQVJfV0FLRVVQRU5BCTB4MDBhOAogI2RlZmluZSBPTUFQMTYxMF9HUElPX0NMRUFSX0RBVEFPVVQJMHgwMGIwCiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fU0VUX0lSUUVOQUJMRTEJMHgwMGRjCisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fU0VUX1dBS0VVUEVOQQkweDAwZTgKICNkZWZpbmUgT01BUDE2MTBfR1BJT19TRVRfREFUQU9VVAkweDAwZjAKIAogLyoKICAqIE9NQVA3MzAgc3BlY2lmaWMgR1BJTyByZWdpc3RlcnMKICAqLwotI2RlZmluZSBPTUFQNzMwX0dQSU8xX0JBU0UJCTB4ZmZmYmMwMDAKLSNkZWZpbmUgT01BUDczMF9HUElPMl9CQVNFCQkweGZmZmJjODAwCi0jZGVmaW5lIE9NQVA3MzBfR1BJTzNfQkFTRQkJMHhmZmZiZDAwMAotI2RlZmluZSBPTUFQNzMwX0dQSU80X0JBU0UJCTB4ZmZmYmQ4MDAKLSNkZWZpbmUgT01BUDczMF9HUElPNV9CQVNFCQkweGZmZmJlMDAwCi0jZGVmaW5lIE9NQVA3MzBfR1BJTzZfQkFTRQkJMHhmZmZiZTgwMAorI2RlZmluZSBPTUFQNzMwX0dQSU8xX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJjMDAwCisjZGVmaW5lIE9NQVA3MzBfR1BJTzJfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmM4MDAKKyNkZWZpbmUgT01BUDczMF9HUElPM19CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZDAwMAorI2RlZmluZSBPTUFQNzMwX0dQSU80X0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJkODAwCisjZGVmaW5lIE9NQVA3MzBfR1BJTzVfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmUwMDAKKyNkZWZpbmUgT01BUDczMF9HUElPNl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZTgwMAogI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9JTlBVVAkJMHgwMAogI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9PVVRQVVQJMHgwNAogI2RlZmluZSBPTUFQNzMwX0dQSU9fRElSX0NPTlRST0wJMHgwOApAQCAtNzgsMTQgKzg0LDQzIEBACiAjZGVmaW5lIE9NQVA3MzBfR1BJT19JTlRfTUFTSwkJMHgxMAogI2RlZmluZSBPTUFQNzMwX0dQSU9fSU5UX1NUQVRVUwkJMHgxNAogCisvKgorICogb21hcDI0eHggc3BlY2lmaWMgR1BJTyByZWdpc3RlcnMKKyAqLworI2RlZmluZSBPTUFQMjRYWF9HUElPMV9CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxODAwMAorI2RlZmluZSBPTUFQMjRYWF9HUElPMl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxYTAwMAorI2RlZmluZSBPTUFQMjRYWF9HUElPM19CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxYzAwMAorI2RlZmluZSBPTUFQMjRYWF9HUElPNF9CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxZTAwMAorI2RlZmluZSBPTUFQMjRYWF9HUElPX1JFVklTSU9OCQkweDAwMDAKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19TWVNDT05GSUcJCTB4MDAxMAorI2RlZmluZSBPTUFQMjRYWF9HUElPX1NZU1NUQVRVUwkJMHgwMDE0CisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fSVJRU1RBVFVTMQkweDAwMTgKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19JUlFFTkFCTEUxCTB4MDAxYworI2RlZmluZSBPTUFQMjRYWF9HUElPX0NUUkwJCTB4MDAzMAorI2RlZmluZSBPTUFQMjRYWF9HUElPX09FCQkweDAwMzQKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19EQVRBSU4JCTB4MDAzOAorI2RlZmluZSBPTUFQMjRYWF9HUElPX0RBVEFPVVQJCTB4MDAzYworI2RlZmluZSBPTUFQMjRYWF9HUElPX0xFVkVMREVURUNUMAkweDAwNDAKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19MRVZFTERFVEVDVDEJMHgwMDQ0CisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fUklTSU5HREVURUNUCTB4MDA0OAorI2RlZmluZSBPTUFQMjRYWF9HUElPX0ZBTExJTkdERVRFQ1QJMHgwMDRjCisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fQ0xFQVJJUlFFTkFCTEUxCTB4MDA2MAorI2RlZmluZSBPTUFQMjRYWF9HUElPX1NFVElSUUVOQUJMRTEJMHgwMDY0CisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fQ0xFQVJXS1VFTkEJMHgwMDgwCisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fU0VUV0tVRU5BCQkweDAwODQKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19DTEVBUkRBVEFPVVQJMHgwMDkwCisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fU0VUREFUQU9VVAkweDAwOTQKKwogI2RlZmluZSBPTUFQX01QVUlPX01BU0sJCSh+T01BUF9NQVhfR1BJT19MSU5FUyAmIDB4ZmYpCiAKIHN0cnVjdCBncGlvX2JhbmsgewotCXUzMiBiYXNlOworCXZvaWQgX19pb21lbSAqYmFzZTsKIAl1MTYgaXJxOwogCXUxNiB2aXJ0dWFsX2lycV9zdGFydDsKLQl1OCBtZXRob2Q7CisJaW50IG1ldGhvZDsKIAl1MzIgcmVzZXJ2ZWRfbWFwOworCXUzMiBzdXNwZW5kX3dha2V1cDsKKwl1MzIgc2F2ZWRfd2FrZXVwOwogCXNwaW5sb2NrX3QgbG9jazsKIH07CiAKQEAgLTkzLDggKzEyOCw5IEBACiAjZGVmaW5lIE1FVEhPRF9HUElPXzE1MTAJMQogI2RlZmluZSBNRVRIT0RfR1BJT18xNjEwCTIKICNkZWZpbmUgTUVUSE9EX0dQSU9fNzMwCQkzCisjZGVmaW5lIE1FVEhPRF9HUElPXzI0WFgJNAogCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAogc3RhdGljIHN0cnVjdCBncGlvX2JhbmsgZ3Bpb19iYW5rXzE2MTBbNV0gPSB7CiAJeyBPTUFQX01QVUlPX0JBU0UsICAgICBJTlRfTVBVSU8sCSAgICBJSF9NUFVJT19CQVNFLCAgICAgTUVUSE9EX01QVUlPfSwKIAl7IE9NQVAxNjEwX0dQSU8xX0JBU0UsIElOVF9HUElPX0JBTksxLAkgICAgSUhfR1BJT19CQVNFLCAgICAgIE1FVEhPRF9HUElPXzE2MTAgfSwKQEAgLTEyMyw2ICsxNTksMTUgQEAKIH07CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCitzdGF0aWMgc3RydWN0IGdwaW9fYmFuayBncGlvX2JhbmtfMjR4eFs0XSA9IHsKKwl7IE9NQVAyNFhYX0dQSU8xX0JBU0UsIElOVF8yNFhYX0dQSU9fQkFOSzEsIElIX0dQSU9fQkFTRSwJTUVUSE9EX0dQSU9fMjRYWCB9LAorCXsgT01BUDI0WFhfR1BJTzJfQkFTRSwgSU5UXzI0WFhfR1BJT19CQU5LMiwgSUhfR1BJT19CQVNFICsgMzIsCU1FVEhPRF9HUElPXzI0WFggfSwKKwl7IE9NQVAyNFhYX0dQSU8zX0JBU0UsIElOVF8yNFhYX0dQSU9fQkFOSzMsIElIX0dQSU9fQkFTRSArIDY0LAlNRVRIT0RfR1BJT18yNFhYIH0sCisJeyBPTUFQMjRYWF9HUElPNF9CQVNFLCBJTlRfMjRYWF9HUElPX0JBTks0LCBJSF9HUElPX0JBU0UgKyA5NiwJTUVUSE9EX0dQSU9fMjRYWCB9LAorfTsKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IGdwaW9fYmFuayAqZ3Bpb19iYW5rOwogc3RhdGljIGludCBncGlvX2JhbmtfY291bnQ7CiAKQEAgLTE0OSwxNCArMTk0LDIzIEBACiAJCXJldHVybiAmZ3Bpb19iYW5rWzEgKyAoZ3BpbyA+PiA1KV07CiAJfQogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCisJCXJldHVybiAmZ3Bpb19iYW5rW2dwaW8gPj4gNV07CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZ2V0X2dwaW9faW5kZXgoaW50IGdwaW8pCiB7CisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAogCWlmIChjcHVfaXNfb21hcDczMCgpKQogCQlyZXR1cm4gZ3BpbyAmIDB4MWY7Ci0JZWxzZQotCQlyZXR1cm4gZ3BpbyAmIDB4MGY7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKKwkJcmV0dXJuIGdwaW8gJiAweDFmOworI2VuZGlmCisJcmV0dXJuIGdwaW8gJiAweDBmOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBncGlvX3ZhbGlkKGludCBncGlvKQpAQCAtMTgwLDYgKzIzNCwxMCBAQAogCWlmIChjcHVfaXNfb21hcDczMCgpICYmIGdwaW8gPCAxOTIpCiAJCXJldHVybiAwOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkgJiYgZ3BpbyA8IDEyOCkKKwkJcmV0dXJuIDA7CisjZW5kaWYKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTE5NSw3ICsyNTMsNyBAQAogCiBzdGF0aWMgdm9pZCBfc2V0X2dwaW9fZGlyZWN0aW9uKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgaXNfaW5wdXQpCiB7Ci0JdTMyIHJlZyA9IGJhbmstPmJhc2U7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwogCXUzMiBsOwogCiAJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKQEAgLTIxMSw2ICsyNjksOSBAQAogCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgogCQlyZWcgKz0gT01BUDczMF9HUElPX0RJUl9DT05UUk9MOwogCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzI0WFg6CisJCXJlZyArPSBPTUFQMjRYWF9HUElPX09FOworCQlicmVhazsKIAl9CiAJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CiAJaWYgKGlzX2lucHV0KQpAQCAtMjM0LDcgKzI5NSw3IEBACiAKIHN0YXRpYyB2b2lkIF9zZXRfZ3Bpb19kYXRhb3V0KHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgZW5hYmxlKQogewotCXUzMiByZWcgPSBiYW5rLT5iYXNlOworCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZTsKIAl1MzIgbCA9IDA7CiAKIAlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewpAQCAtMjY5LDYgKzMzMCwxMyBAQAogCQllbHNlCiAJCQlsICY9IH4oMSA8PCBncGlvKTsKIAkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgorCQlpZiAoZW5hYmxlKQorCQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fU0VUREFUQU9VVDsKKwkJZWxzZQorCQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fQ0xFQVJEQVRBT1VUOworCQlsID0gMSA8PCBncGlvOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAkJcmV0dXJuOwpAQCAtMjkxLDcgKzM1OSw3IEBACiBpbnQgb21hcF9nZXRfZ3Bpb19kYXRhaW4oaW50IGdwaW8pCiB7CiAJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKLQl1MzIgcmVnOworCXZvaWQgX19pb21lbSAqcmVnOwogCiAJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQogCQlyZXR1cm4gLTE7CkBAIC0zMTAsMTA5ICszNzgsMTMyIEBACiAJY2FzZSBNRVRIT0RfR1BJT183MzA6CiAJCXJlZyArPSBPTUFQNzMwX0dQSU9fREFUQV9JTlBVVDsKIAkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgorCQlyZWcgKz0gT01BUDI0WFhfR1BJT19EQVRBSU47CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCQlyZXR1cm4gLTE7CiAJfQotCXJldHVybiAoX19yYXdfcmVhZGwocmVnKSAmICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKSkgIT0gMDsKKwlyZXR1cm4gKF9fcmF3X3JlYWRsKHJlZykKKwkJCSYgKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpKSAhPSAwOwogfQogCi1zdGF0aWMgdm9pZCBfc2V0X2dwaW9fZWRnZV9jdHJsKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgZWRnZSkKKyNkZWZpbmUgTU9EX1JFR19CSVQocmVnLCBiaXRfbWFzaywgc2V0KQlcCitkbyB7CVwKKwlpbnQgbCA9IF9fcmF3X3JlYWRsKGJhc2UgKyByZWcpOyBcCisJaWYgKHNldCkgbCB8PSBiaXRfbWFzazsgXAorCWVsc2UgbCAmPSB+Yml0X21hc2s7IFwKKwlfX3Jhd193cml0ZWwobCwgYmFzZSArIHJlZyk7IFwKK30gd2hpbGUoMCkKKworc3RhdGljIGlubGluZSB2b2lkIHNldF8yNHh4X2dwaW9fdHJpZ2dlcmluZyh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBncGlvLCBpbnQgdHJpZ2dlcikKIHsKLQl1MzIgcmVnID0gYmFuay0+YmFzZTsKLQl1MzIgbDsKKwl1MzIgZ3Bpb19iaXQgPSAxIDw8IGdwaW87CisKKwlNT0RfUkVHX0JJVChPTUFQMjRYWF9HUElPX0xFVkVMREVURUNUMCwgZ3Bpb19iaXQsCisJCXRyaWdnZXIgJiBJUlFUX0xPVyk7CisJTU9EX1JFR19CSVQoT01BUDI0WFhfR1BJT19MRVZFTERFVEVDVDEsIGdwaW9fYml0LAorCQl0cmlnZ2VyICYgSVJRVF9ISUdIKTsKKwlNT0RfUkVHX0JJVChPTUFQMjRYWF9HUElPX1JJU0lOR0RFVEVDVCwgZ3Bpb19iaXQsCisJCXRyaWdnZXIgJiBJUlFUX1JJU0lORyk7CisJTU9EX1JFR19CSVQoT01BUDI0WFhfR1BJT19GQUxMSU5HREVURUNULCBncGlvX2JpdCwKKwkJdHJpZ2dlciAmIElSUVRfRkFMTElORyk7CisJLyogRklYTUU6IFBvc3NpYmx5IGRvICdzZXRfaXJxX2hhbmRsZXIoaiwgZG9fbGV2ZWxfSVJRKScgaWYgb25seSBsZXZlbAorCSAqIHRyaWdnZXJpbmcgcmVxdWVzdGVkLiAqLworfQorCitzdGF0aWMgaW50IF9zZXRfZ3Bpb190cmlnZ2VyaW5nKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgdHJpZ2dlcikKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2U7CisJdTMyIGwgPSAwOwogCiAJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKIAljYXNlIE1FVEhPRF9NUFVJTzoKIAkJcmVnICs9IE9NQVBfTVBVSU9fR1BJT19JTlRfRURHRTsKIAkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JCWlmIChlZGdlID09IE9NQVBfR1BJT19SSVNJTkdfRURHRSkKKwkJaWYgKHRyaWdnZXIgPT0gSVJRVF9SSVNJTkcpCiAJCQlsIHw9IDEgPDwgZ3BpbzsKLQkJZWxzZQorCQllbHNlIGlmICh0cmlnZ2VyID09IElSUVRfRkFMTElORykKIAkJCWwgJj0gfigxIDw8IGdwaW8pOwotCQlfX3Jhd193cml0ZWwobCwgcmVnKTsKKwkJZWxzZQorCQkJZ290byBiYWQ7CiAJCWJyZWFrOwogCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKIAkJcmVnICs9IE9NQVAxNTEwX0dQSU9fSU5UX0NPTlRST0w7CiAJCWwgPSBfX3Jhd19yZWFkbChyZWcpOwotCQlpZiAoZWRnZSA9PSBPTUFQX0dQSU9fUklTSU5HX0VER0UpCisJCWlmICh0cmlnZ2VyID09IElSUVRfUklTSU5HKQogCQkJbCB8PSAxIDw8IGdwaW87Ci0JCWVsc2UKKwkJZWxzZSBpZiAodHJpZ2dlciA9PSBJUlFUX0ZBTExJTkcpCiAJCQlsICY9IH4oMSA8PCBncGlvKTsKLQkJX19yYXdfd3JpdGVsKGwsIHJlZyk7CisJCWVsc2UKKwkJCWdvdG8gYmFkOwogCQlicmVhazsKIAljYXNlIE1FVEhPRF9HUElPXzE2MTA6Ci0JCWVkZ2UgJj0gMHgwMzsKIAkJaWYgKGdwaW8gJiAweDA4KQogCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMjsKIAkJZWxzZQogCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMTsKIAkJZ3BpbyAmPSAweDA3OworCQkvKiBXZSBhbGxvdyBvbmx5IGVkZ2UgdHJpZ2dlcmluZywgaS5lLiB0d28gbG93ZXN0IGJpdHMgKi8KKwkJaWYgKHRyaWdnZXIgJiB+SVJRVF9CT1RIRURHRSkKKwkJCUJVRygpOworCQkvKiBOT1RFOiBrbm93cyBfX0lSUVRfe0ZBTCxSSVN9RURHRSBtYXRjaCBPTUFQIGhhcmR3YXJlICovCisJCXRyaWdnZXIgJj0gMHgwMzsKIAkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CiAJCWwgJj0gfigzIDw8IChncGlvIDw8IDEpKTsKLQkJbCB8PSBlZGdlIDw8IChncGlvIDw8IDEpOwotCQlfX3Jhd193cml0ZWwobCwgcmVnKTsKKwkJbCB8PSB0cmlnZ2VyIDw8IChncGlvIDw8IDEpOwogCQlicmVhazsKIAljYXNlIE1FVEhPRF9HUElPXzczMDoKIAkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfQ09OVFJPTDsKIAkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JCWlmIChlZGdlID09IE9NQVBfR1BJT19SSVNJTkdfRURHRSkKKwkJaWYgKHRyaWdnZXIgPT0gSVJRVF9SSVNJTkcpCiAJCQlsIHw9IDEgPDwgZ3BpbzsKLQkJZWxzZQorCQllbHNlIGlmICh0cmlnZ2VyID09IElSUVRfRkFMTElORykKIAkJCWwgJj0gfigxIDw8IGdwaW8pOwotCQlfX3Jhd193cml0ZWwobCwgcmVnKTsKKwkJZWxzZQorCQkJZ290byBiYWQ7CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKKwkJc2V0XzI0eHhfZ3Bpb190cmlnZ2VyaW5nKHJlZywgZ3BpbywgdHJpZ2dlcik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwotCQlyZXR1cm47CisJCWdvdG8gYmFkOwogCX0KKwlfX3Jhd193cml0ZWwobCwgcmVnKTsKKwlyZXR1cm4gMDsKK2JhZDoKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAotdm9pZCBvbWFwX3NldF9ncGlvX2VkZ2VfY3RybChpbnQgZ3BpbywgaW50IGVkZ2UpCitzdGF0aWMgaW50IGdwaW9faXJxX3R5cGUodW5zaWduZWQgaXJxLCB1bnNpZ25lZCB0eXBlKQogewogCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CisJdW5zaWduZWQgZ3BpbzsKKwlpbnQgcmV0dmFsOworCisJaWYgKGlycSA+IElIX01QVUlPX0JBU0UpCisJCWdwaW8gPSBPTUFQX01QVUlPKGlycSAtIElIX01QVUlPX0JBU0UpOworCWVsc2UKKwkJZ3BpbyA9IGlycSAtIElIX0dQSU9fQkFTRTsKIAogCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0eXBlICYgKF9fSVJRVF9MT1dMVkx8X19JUlFUX0hJR0hMVkx8SVJRVF9QUk9CRSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CiAJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKLQlfc2V0X2dwaW9fZWRnZV9jdHJsKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBlZGdlKTsKKwlyZXR2YWwgPSBfc2V0X2dwaW9fdHJpZ2dlcmluZyhiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgdHlwZSk7CiAJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwotfQotCi0KLXN0YXRpYyBpbnQgX2dldF9ncGlvX2VkZ2VfY3RybChzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbykKLXsKLQl1MzIgcmVnID0gYmFuay0+YmFzZSwgbDsKLQotCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7Ci0JY2FzZSBNRVRIT0RfTVBVSU86Ci0JCWwgPSBfX3Jhd19yZWFkbChyZWcgKyBPTUFQX01QVUlPX0dQSU9fSU5UX0VER0UpOwotCQlyZXR1cm4gKGwgJiAoMSA8PCBncGlvKSkgPwotCQkJT01BUF9HUElPX1JJU0lOR19FREdFIDogT01BUF9HUElPX0ZBTExJTkdfRURHRTsKLQljYXNlIE1FVEhPRF9HUElPXzE1MTA6Ci0JCWwgPSBfX3Jhd19yZWFkbChyZWcgKyBPTUFQMTUxMF9HUElPX0lOVF9DT05UUk9MKTsKLQkJcmV0dXJuIChsICYgKDEgPDwgZ3BpbykpID8KLQkJCU9NQVBfR1BJT19SSVNJTkdfRURHRSA6IE9NQVBfR1BJT19GQUxMSU5HX0VER0U7Ci0JY2FzZSBNRVRIT0RfR1BJT18xNjEwOgotCQlpZiAoZ3BpbyAmIDB4MDgpCi0JCQlyZWcgKz0gT01BUDE2MTBfR1BJT19FREdFX0NUUkwyOwotCQllbHNlCi0JCQlyZWcgKz0gT01BUDE2MTBfR1BJT19FREdFX0NUUkwxOwotCQlyZXR1cm4gKF9fcmF3X3JlYWRsKHJlZykgPj4gKChncGlvICYgMHgwNykgPDwgMSkpICYgMHgwMzsKLQljYXNlIE1FVEhPRF9HUElPXzczMDoKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyArIE9NQVA3MzBfR1BJT19JTlRfQ09OVFJPTCk7Ci0JCXJldHVybiAobCAmICgxIDw8IGdwaW8pKSA/Ci0JCQlPTUFQX0dQSU9fUklTSU5HX0VER0UgOiBPTUFQX0dQSU9fRkFMTElOR19FREdFOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm4gLTE7Ci0JfQorCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIF9jbGVhcl9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaykKIHsKLQl1MzIgcmVnID0gYmFuay0+YmFzZTsKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2U7CiAKIAlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewogCWNhc2UgTUVUSE9EX01QVUlPOgpAQCAtNDI4LDYgKzUxOSw5IEBACiAJY2FzZSBNRVRIT0RfR1BJT183MzA6CiAJCXJlZyArPSBPTUFQNzMwX0dQSU9fSU5UX1NUQVRVUzsKIAkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgorCQlyZWcgKz0gT01BUDI0WFhfR1BJT19JUlFTVEFUVVMxOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAkJcmV0dXJuOwpAQCAtNDQyLDcgKzUzNiw3IEBACiAKIHN0YXRpYyB2b2lkIF9lbmFibGVfZ3Bpb19pcnFiYW5rKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvX21hc2ssIGludCBlbmFibGUpCiB7Ci0JdTMyIHJlZyA9IGJhbmstPmJhc2U7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwogCXUzMiBsOwogCiAJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKQEAgLTQ3Nyw2ICs1NzEsMTMgQEAKIAkJZWxzZQogCQkJbCB8PSBncGlvX21hc2s7CiAJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKKwkJaWYgKGVuYWJsZSkKKwkJCXJlZyArPSBPTUFQMjRYWF9HUElPX1NFVElSUUVOQUJMRTE7CisJCWVsc2UKKwkJCXJlZyArPSBPTUFQMjRYWF9HUElPX0NMRUFSSVJRRU5BQkxFMTsKKwkJbCA9IGdwaW9fbWFzazsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJCXJldHVybjsKQEAgLTQ4OSw2ICs1OTAsNTAgQEAKIAlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCAxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pLCBlbmFibGUpOwogfQogCisvKgorICogTm90ZSB0aGF0IEVOQVdBS0VVUCBuZWVkcyB0byBiZSBlbmFibGVkIGluIEdQSU9fU1lTQ09ORklHIHJlZ2lzdGVyLgorICogMTUxMCBkb2VzIG5vdCBzZWVtIHRvIGhhdmUgYSB3YWtlLXVwIHJlZ2lzdGVyLiBJZiBKVEFHIGlzIGNvbm5lY3RlZAorICogdG8gdGhlIHRhcmdldCwgc3lzdGVtIHdpbGwgd2FrZSB1cCBhbHdheXMgb24gR1BJTyBldmVudHMuIFdoaWxlCisgKiBzeXN0ZW0gaXMgcnVubmluZyBhbGwgcmVnaXN0ZXJlZCBHUElPIGludGVycnVwdHMgbmVlZCB0byBoYXZlIHdha2UtdXAKKyAqIGVuYWJsZWQuIFdoZW4gc3lzdGVtIGlzIHN1c3BlbmRlZCwgb25seSBzZWxlY3RlZCBHUElPIGludGVycnVwdHMgbmVlZAorICogdG8gaGF2ZSB3YWtlLXVwIGVuYWJsZWQuCisgKi8KK3N0YXRpYyBpbnQgX3NldF9ncGlvX3dha2V1cChzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSkKK3sKKwlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgeworCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKKwljYXNlIE1FVEhPRF9HUElPXzI0WFg6CisJCXNwaW5fbG9jaygmYmFuay0+bG9jayk7CisJCWlmIChlbmFibGUpCisJCQliYW5rLT5zdXNwZW5kX3dha2V1cCB8PSAoMSA8PCBncGlvKTsKKwkJZWxzZQorCQkJYmFuay0+c3VzcGVuZF93YWtldXAgJj0gfigxIDw8IGdwaW8pOworCQlzcGluX3VubG9jaygmYmFuay0+bG9jayk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZW5hYmxlIEdQSU8gd2FrZXVwIGZvciBtZXRob2QgJWlcbiIsCisJCSAgICAgICBiYW5rLT5tZXRob2QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKy8qIFVzZSBkaXNhYmxlX2lycV93YWtlKCkgYW5kIGVuYWJsZV9pcnFfd2FrZSgpIGZ1bmN0aW9ucyBmcm9tIGRyaXZlcnMgKi8KK3N0YXRpYyBpbnQgZ3Bpb193YWtlX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGludCBncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOworCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CisJaW50IHJldHZhbDsKKworCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CisJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKKwlyZXR2YWwgPSBfc2V0X2dwaW9fd2FrZXVwKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBlbmFibGUpOworCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKIGludCBvbWFwX3JlcXVlc3RfZ3BpbyhpbnQgZ3BpbykKIHsKIAlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwpAQCAtNTA1LDE1ICs2NTAsMzMgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAliYW5rLT5yZXNlcnZlZF9tYXAgfD0gKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpOworCisJLyogU2V0IHRyaWdnZXIgdG8gbm9uZS4gWW91IG5lZWQgdG8gZW5hYmxlIHRoZSB0cmlnZ2VyIGFmdGVyIHJlcXVlc3RfaXJxICovCisJX3NldF9ncGlvX3RyaWdnZXJpbmcoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIElSUVRfTk9FREdFKTsKKwogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCiAJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNTEwKSB7Ci0JCXUzMiByZWc7CisJCXZvaWQgX19pb21lbSAqcmVnOwogCi0JCS8qIENsYWltIHRoZSBwaW4gZm9yIHRoZSBBUk0gKi8KKwkJLyogQ2xhaW0gdGhlIHBpbiBmb3IgTVBVICovCiAJCXJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMTUxMF9HUElPX1BJTl9DT05UUk9MOwogCQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwocmVnKSB8ICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKSwgcmVnKTsKIAl9CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAorCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTYxMCkgeworCQkvKiBFbmFibGUgd2FrZS11cCBkdXJpbmcgaWRsZSBmb3IgZHluYW1pYyB0aWNrICovCisJCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fU0VUX1dBS0VVUEVOQTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIHJlZyk7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKwlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzI0WFgpIHsKKwkJLyogRW5hYmxlIHdha2UtdXAgZHVyaW5nIGlkbGUgZm9yIGR5bmFtaWMgdGljayAqLworCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX1NFVFdLVUVOQTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIHJlZyk7CisJfQorI2VuZGlmCiAJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwogCiAJcmV0dXJuIDA7CkBAIC01MzMsNiArNjk2LDIwIEBACiAJCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKIAkJcmV0dXJuOwogCX0KKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAorCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTYxMCkgeworCQkvKiBEaXNhYmxlIHdha2UtdXAgZHVyaW5nIGlkbGUgZm9yIGR5bmFtaWMgdGljayAqLworCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0NMRUFSX1dBS0VVUEVOQTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIHJlZyk7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKwlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzI0WFgpIHsKKwkJLyogRGlzYWJsZSB3YWtlLXVwIGR1cmluZyBpZGxlIGZvciBkeW5hbWljIHRpY2sgKi8KKwkJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19DTEVBUldLVUVOQTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIHJlZyk7CisJfQorI2VuZGlmCiAJYmFuay0+cmVzZXJ2ZWRfbWFwICY9IH4oMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSk7CiAJX3NldF9ncGlvX2RpcmVjdGlvbihiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgMSk7CiAJX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAwKTsKQEAgLTU1Miw3ICs3MjksNyBAQAogc3RhdGljIHZvaWQgZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywKIAkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdTMyIGlzcl9yZWcgPSAwOworCXZvaWQgX19pb21lbSAqaXNyX3JlZyA9IE5VTEw7CiAJdTMyIGlzcjsKIAl1bnNpZ25lZCBpbnQgZ3Bpb19pcnE7CiAJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKQEAgLTU3NCwyNCArNzUxLDMwIEBACiAJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT183MzApCiAJCWlzcl9yZWcgPSBiYW5rLT5iYXNlICsgT01BUDczMF9HUElPX0lOVF9TVEFUVVM7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMjRYWCkKKwkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0lSUVNUQVRVUzE7CisjZW5kaWYKIAotCWlzciA9IF9fcmF3X3JlYWRsKGlzcl9yZWcpOwotCV9lbmFibGVfZ3Bpb19pcnFiYW5rKGJhbmssIGlzciwgMCk7Ci0JX2NsZWFyX2dwaW9faXJxYmFuayhiYW5rLCBpc3IpOwotCV9lbmFibGVfZ3Bpb19pcnFiYW5rKGJhbmssIGlzciwgMSk7Ci0JZGVzYy0+Y2hpcC0+dW5tYXNrKGlycSk7CisJd2hpbGUoMSkgeworCQlpc3IgPSBfX3Jhd19yZWFkbChpc3JfcmVnKTsKKwkJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyLCAwKTsKKwkJX2NsZWFyX2dwaW9faXJxYmFuayhiYW5rLCBpc3IpOworCQlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCBpc3IsIDEpOworCQlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKIAotCWlmICh1bmxpa2VseSghaXNyKSkKLQkJcmV0dXJuOworCQlpZiAoIWlzcikKKwkJCWJyZWFrOwogCi0JZ3Bpb19pcnEgPSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydDsKLQlmb3IgKDsgaXNyICE9IDA7IGlzciA+Pj0gMSwgZ3Bpb19pcnErKykgewotCQlzdHJ1Y3QgaXJxZGVzYyAqZDsKLQkJaWYgKCEoaXNyICYgMSkpCi0JCQljb250aW51ZTsKLQkJZCA9IGlycV9kZXNjICsgZ3Bpb19pcnE7Ci0JCWQtPmhhbmRsZShncGlvX2lycSwgZCwgcmVncyk7Ci0JfQorCQlncGlvX2lycSA9IGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0OworCQlmb3IgKDsgaXNyICE9IDA7IGlzciA+Pj0gMSwgZ3Bpb19pcnErKykgeworCQkJc3RydWN0IGlycWRlc2MgKmQ7CisJCQlpZiAoIShpc3IgJiAxKSkKKwkJCQljb250aW51ZTsKKwkJCWQgPSBpcnFfZGVzYyArIGdwaW9faXJxOworCQkJZGVzY19oYW5kbGVfaXJxKGdwaW9faXJxLCBkLCByZWdzKTsKKwkJfQorICAgICAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGdwaW9fYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtNjEzLDE0ICs3OTYsMTAgQEAKIHN0YXRpYyB2b2lkIGdwaW9fdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXVuc2lnbmVkIGludCBncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOworCXVuc2lnbmVkIGludCBncGlvX2lkeCA9IGdldF9ncGlvX2luZGV4KGdwaW8pOwogCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwogCi0JaWYgKF9nZXRfZ3Bpb19lZGdlX2N0cmwoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbykpID09IE9NQVBfR1BJT19OT19FREdFKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiT01BUCBHUElPICVkOiB0cnlpbmcgdG8gZW5hYmxlIEdQSU8gSVJRIHdoaWxlIG5vIGVkZ2UgaXMgc2V0XG4iLAotCQkgICAgICAgZ3Bpbyk7Ci0JCV9zZXRfZ3Bpb19lZGdlX2N0cmwoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7Ci0JfQotCV9zZXRfZ3Bpb19pcnFlbmFibGUoYmFuaywgZ3BpbywgMSk7CisJX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvX2lkeCwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkIG1wdWlvX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTY0NSw5ICs4MjQsMTEgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFjaGlwIGdwaW9faXJxX2NoaXAgPSB7Ci0JLmFjawk9IGdwaW9fYWNrX2lycSwKLQkubWFzawk9IGdwaW9fbWFza19pcnEsCi0JLnVubWFzayA9IGdwaW9fdW5tYXNrX2lycSwKKwkuYWNrCQk9IGdwaW9fYWNrX2lycSwKKwkubWFzawkJPSBncGlvX21hc2tfaXJxLAorCS51bm1hc2sJCT0gZ3Bpb191bm1hc2tfaXJxLAorCS5zZXRfdHlwZQk9IGdwaW9faXJxX3R5cGUsCisJLnNldF93YWtlCT0gZ3Bpb193YWtlX2VuYWJsZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBtcHVpb19pcnFfY2hpcCA9IHsKQEAgLTY1Nyw2ICs4MzgsNyBAQAogfTsKIAogc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CitzdGF0aWMgc3RydWN0IGNsayAqIGdwaW9fY2sgPSBOVUxMOwogCiBzdGF0aWMgaW50IF9faW5pdCBfb21hcF9ncGlvX2luaXQodm9pZCkKIHsKQEAgLTY2NSw2ICs4NDcsMTQgQEAKIAogCWluaXRpYWxpemVkID0gMTsKIAorCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQlncGlvX2NrID0gY2xrX2dldChOVUxMLCAiYXJtX2dwaW9fY2siKTsKKwkJaWYgKElTX0VSUihncGlvX2NrKSkKKwkJCXByaW50aygiQ291bGQgbm90IGdldCBhcm1fZ3Bpb19ja1xuIik7CisJCWVsc2UKKwkJCWNsa191c2UoZ3Bpb19jayk7CisJfQorCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKIAlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUDE1MTAgR1BJTyBoYXJkd2FyZVxuIik7CkBAIC02NzQsNyArODY0LDcgQEAKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCiAJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7Ci0JCWludCByZXY7CisJCXUzMiByZXY7CiAKIAkJZ3Bpb19iYW5rX2NvdW50ID0gNTsKIAkJZ3Bpb19iYW5rID0gZ3Bpb19iYW5rXzE2MTA7CkBAIC02OTAsNiArODgwLDE3IEBACiAJCWdwaW9fYmFuayA9IGdwaW9fYmFua183MzA7CiAJfQogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKKwkJaW50IHJldjsKKworCQlncGlvX2JhbmtfY291bnQgPSA0OworCQlncGlvX2JhbmsgPSBncGlvX2JhbmtfMjR4eDsKKwkJcmV2ID0gb21hcF9yZWFkbChncGlvX2JhbmtbMF0uYmFzZSArIE9NQVAyNFhYX0dQSU9fUkVWSVNJT04pOworCQlwcmludGsoS0VSTl9JTkZPICJPTUFQMjR4eCBHUElPIGhhcmR3YXJlIHZlcnNpb24gJWQuJWRcbiIsCisJCQkocmV2ID4+IDQpICYgMHgwZiwgcmV2ICYgMHgwZik7CisJfQorI2VuZGlmCiAJZm9yIChpID0gMDsgaSA8IGdwaW9fYmFua19jb3VudDsgaSsrKSB7CiAJCWludCBqLCBncGlvX2NvdW50ID0gMTY7CiAKQEAgLTcxMCw2ICs5MTEsNyBAQAogCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzE2MTApIHsKIAkJCV9fcmF3X3dyaXRldygweDAwMDAsIGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0lSUUVOQUJMRTEpOwogCQkJX19yYXdfd3JpdGV3KDB4ZmZmZiwgYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fSVJRU1RBVFVTMSk7CisJCQlfX3Jhd193cml0ZXcoMHgwMDE0LCBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19TWVNDT05GSUcpOwogCQl9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCkBAIC03MjAsNiArOTIyLDE0IEBACiAJCQlncGlvX2NvdW50ID0gMzI7IC8qIDczMCBoYXMgMzItYml0IEdQSU9zICovCiAJCX0KICNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCisJCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMjRYWCkgeworCQkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0lSUUVOQUJMRTEpOworCQkJX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0lSUVNUQVRVUzEpOworCisJCQlncGlvX2NvdW50ID0gMzI7CisJCX0KKyNlbmRpZgogCQlmb3IgKGogPSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydDsKIAkJICAgICBqIDwgYmFuay0+dmlydHVhbF9pcnFfc3RhcnQgKyBncGlvX2NvdW50OyBqKyspIHsKIAkJCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX01QVUlPKQpAQCAtNzM1LDEyICs5NDUsOTcgQEAKIAogCS8qIEVuYWJsZSBzeXN0ZW0gY2xvY2sgZm9yIEdQSU8gbW9kdWxlLgogCSAqIFRoZSBDQU1fQ0xLX0NUUkwgKmlzKiByZWFsbHkgdGhlIHJpZ2h0IHBsYWNlLiAqLwotCWlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkKKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkpCiAJCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoVUxQRF9DQU1fQ0xLX0NUUkwpIHwgMHgwNCwgVUxQRF9DQU1fQ0xLX0NUUkwpOwogCiAJcmV0dXJuIDA7CiB9CiAKKyNpZiBkZWZpbmVkIChDT05GSUdfQVJDSF9PTUFQMTZYWCkgfHwgZGVmaW5lZCAoQ09ORklHX0FSQ0hfT01BUDI0WFgpCitzdGF0aWMgaW50IG9tYXBfZ3Bpb19zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCWludCBpOworCisJaWYgKCFjcHVfaXNfb21hcDI0eHgoKSAmJiAhY3B1X2lzX29tYXAxNnh4KCkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGdwaW9fYmFua19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSAmZ3Bpb19iYW5rW2ldOworCQl2b2lkIF9faW9tZW0gKndha2Vfc3RhdHVzOworCQl2b2lkIF9faW9tZW0gKndha2VfY2xlYXI7CisJCXZvaWQgX19pb21lbSAqd2FrZV9zZXQ7CisKKwkJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKKwkJY2FzZSBNRVRIT0RfR1BJT18xNjEwOgorCQkJd2FrZV9zdGF0dXMgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19XQUtFVVBFTkFCTEU7CisJCQl3YWtlX2NsZWFyID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fQ0xFQVJfV0FLRVVQRU5BOworCQkJd2FrZV9zZXQgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19TRVRfV0FLRVVQRU5BOworCQkJYnJlYWs7CisJCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKKwkJCXdha2Vfc3RhdHVzID0gYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fU0VUV0tVRU5BOworCQkJd2FrZV9jbGVhciA9IGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0NMRUFSV0tVRU5BOworCQkJd2FrZV9zZXQgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19TRVRXS1VFTkE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKKwkJYmFuay0+c2F2ZWRfd2FrZXVwID0gX19yYXdfcmVhZGwod2FrZV9zdGF0dXMpOworCQlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgd2FrZV9jbGVhcik7CisJCV9fcmF3X3dyaXRlbChiYW5rLT5zdXNwZW5kX3dha2V1cCwgd2FrZV9zZXQpOworCQlzcGluX3VubG9jaygmYmFuay0+bG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9ncGlvX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQoreworCWludCBpOworCisJaWYgKCFjcHVfaXNfb21hcDI0eHgoKSAmJiAhY3B1X2lzX29tYXAxNnh4KCkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGdwaW9fYmFua19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSAmZ3Bpb19iYW5rW2ldOworCQl2b2lkIF9faW9tZW0gKndha2VfY2xlYXI7CisJCXZvaWQgX19pb21lbSAqd2FrZV9zZXQ7CisKKwkJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKKwkJY2FzZSBNRVRIT0RfR1BJT18xNjEwOgorCQkJd2FrZV9jbGVhciA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0NMRUFSX1dBS0VVUEVOQTsKKwkJCXdha2Vfc2V0ID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fU0VUX1dBS0VVUEVOQTsKKwkJCWJyZWFrOworCQljYXNlIE1FVEhPRF9HUElPXzI0WFg6CisJCQl3YWtlX2NsZWFyID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fQ0xFQVJfV0FLRVVQRU5BOworCQkJd2FrZV9zZXQgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19TRVRfV0FLRVVQRU5BOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCisJCXNwaW5fbG9jaygmYmFuay0+bG9jayk7CisJCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCB3YWtlX2NsZWFyKTsKKwkJX19yYXdfd3JpdGVsKGJhbmstPnNhdmVkX3dha2V1cCwgd2FrZV9zZXQpOworCQlzcGluX3VubG9jaygmYmFuay0+bG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIG9tYXBfZ3Bpb19zeXNjbGFzcyA9IHsKKwlzZXRfa3NldF9uYW1lKCJncGlvIiksCisJLnN1c3BlbmQJPSBvbWFwX2dwaW9fc3VzcGVuZCwKKwkucmVzdW1lCQk9IG9tYXBfZ3Bpb19yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2Ugb21hcF9ncGlvX2RldmljZSA9IHsKKwkuaWQJCT0gMCwKKwkuY2xzCQk9ICZvbWFwX2dwaW9fc3lzY2xhc3MsCit9OworI2VuZGlmCisKIC8qCiAgKiBUaGlzIG1heSBnZXQgY2FsbGVkIGVhcmx5IGZyb20gYm9hcmQgc3BlY2lmaWMgaW5pdAogICovCkBAIC03NTIsMTEgKzEwNDcsMzAgQEAKIAkJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfZ3Bpb19zeXNpbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWluaXRpYWxpemVkKQorCQlyZXQgPSBfb21hcF9ncGlvX2luaXQoKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0WFgpCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpIHx8IGNwdV9pc19vbWFwMjR4eCgpKSB7CisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0ID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZvbWFwX2dwaW9fc3lzY2xhc3MpOworCQkJaWYgKHJldCA9PSAwKQorCQkJCXJldCA9IHN5c2Rldl9yZWdpc3Rlcigmb21hcF9ncGlvX2RldmljZSk7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9CisKIEVYUE9SVF9TWU1CT0wob21hcF9yZXF1ZXN0X2dwaW8pOwogRVhQT1JUX1NZTUJPTChvbWFwX2ZyZWVfZ3Bpbyk7CiBFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKTsKIEVYUE9SVF9TWU1CT0wob21hcF9zZXRfZ3Bpb19kYXRhb3V0KTsKIEVYUE9SVF9TWU1CT0wob21hcF9nZXRfZ3Bpb19kYXRhaW4pOwotRVhQT1JUX1NZTUJPTChvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCk7CiAKLWFyY2hfaW5pdGNhbGwob21hcF9ncGlvX2luaXQpOworYXJjaF9pbml0Y2FsbChvbWFwX2dwaW9fc3lzaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCmluZGV4IDQzNTY3ZDUuLjljOWI3ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2RzcF9jb21tb24uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9tY2JzcC5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CkBAIC0xODcsOSArMTg4LDYgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLSNkZWZpbmUgRU5fWE9SUENLCQkxCi0jZGVmaW5lIERTUF9SU1RDVDIgICAgICAgICAgICAgIDB4ZTEwMDgwMTQKLQogc3RhdGljIHZvaWQgb21hcF9tY2JzcF9kc3BfcmVxdWVzdCh2b2lkKQogewogCWlmIChjcHVfaXNfb21hcDE1MTAoKSB8fCBjcHVfaXNfb21hcDE2eHgoKSkgewpAQCAtMTk4LDYgKzE5NiwxMSBAQAogCiAJCS8qIGVuYWJsZSAxMk1IeiBjbG9jayB0byBtY2JzcCAxICYgMyAqLwogCQljbGtfdXNlKG1jYnNwX2RzcHhvcl9jayk7CisKKwkJLyoKKwkJICogRFNQIGV4dGVybmFsIHBlcmlwaGVyYWwgcmVzZXQKKwkJICogRklYTUU6IFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIGRzcCBjb2RlCisJCSAqLwogCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoRFNQX1JTVENUMikgfCAxIHwgMSA8PCAxLAogCQkJICAgICBEU1BfUlNUQ1QyKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvbXV4LmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvbXV4LmMKaW5kZXggZWE3Yjk1NS4uNjQ0ODIwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL211eC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tdXguYwpAQCAtNDgsNiArNDgsOSBAQAogCQlwdWxsX29yaWcgPSAwLCBwdWxsID0gMDsKIAl1bnNpZ25lZCBpbnQgbWFzaywgd2FybiA9IDA7CiAKKwlpZiAoY3B1X2lzX29tYXA3eHgoKSkKKwkJcmV0dXJuIDA7CisKIAlpZiAocmVnX2NmZyA+IEFSUkFZX1NJWkUocmVnX2NmZ190YWJsZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJNVVg6IHJlZ19jZmcgJWRcbiIsIHJlZ19jZmcpOwogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9vY3BpLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvb2NwaS5jCmluZGV4IDJlZGUyZWUuLjFmYjE2ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9vY3BpLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL29jcGkuYwpAQCAtMjUsNiArMjUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9wbS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3BtLmMKaW5kZXggZTY1MzZiMS4uZTE1YzZjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL3BtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3BtLmMKQEAgLTM5LDI0ICszOSwzMiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKLSNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMTZ4eC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvcG0uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KLSNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3RwczY1MDEwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZHNwX2NvbW1vbi5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJzcmFtLmgiCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYXJtX3NsZWVwX3NhdmVbQVJNX1NMRUVQX1NBVkVfU0laRV07CiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgdWxwZF9zbGVlcF9zYXZlW1VMUERfU0xFRVBfU0FWRV9TSVpFXTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbXB1aTE1MTBfc2xlZXBfc2F2ZVtNUFVJMTUxMF9TTEVFUF9TQVZFX1NJWkVdOwogc3RhdGljIHVuc2lnbmVkIGludCBtcHVpMTYxMF9zbGVlcF9zYXZlW01QVUkxNjEwX1NMRUVQX1NBVkVfU0laRV07CiAKK3N0YXRpYyB2b2lkICgqb21hcF9zcmFtX2lkbGUpKHZvaWQpID0gTlVMTDsKK3N0YXRpYyB2b2lkICgqb21hcF9zcmFtX3N1c3BlbmQpKHVuc2lnbmVkIGxvbmcgcjAsIHVuc2lnbmVkIGxvbmcgcjEpID0gTlVMTDsKKwogLyoKICAqIExldCdzIHBvd2VyIGRvd24gb24gaWRsZSwgYnV0IG9ubHkgaWYgd2UgYXJlIHJlYWxseQogICogaWRsZSwgYmVjYXVzZSBvbmNlIHdlIHN0YXJ0IGRvd24gdGhlIHBhdGggb2YKQEAgLTY1LDcgKzczLDYgQEAKICAqLwogdm9pZCBvbWFwX3BtX2lkbGUodm9pZCkKIHsKLQlpbnQgKCpmdW5jX3B0cikodm9pZCkgPSAwOwogCXVuc2lnbmVkIGludCBtYXNrMzIgPSAwOwogCiAJLyoKQEAgLTg0LDYgKzkxLDEzIEBACiAJbWFzazMyID0gb21hcF9yZWFkbChBUk1fU1lTU1QpOwogCiAJLyoKKwkgKiBQcmV2ZW50IHRoZSBVTFBEIGZyb20gZW50ZXJpbmcgbG93IHBvd2VyIHN0YXRlIGJ5IHNldHRpbmcKKwkgKiBQT1dFUl9DVFJMX1JFRzo0ID0gMAorCSAqLworCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoVUxQRF9QT1dFUl9DVFJMKSAmCisJCSAgICB+VUxQRF9ERUVQX1NMRUVQX1RSQU5TSVRJT05fRU4sIFVMUERfUE9XRVJfQ1RSTCk7CisKKwkvKgogCSAqIFNpbmNlIGFuIGludGVycnVwdCBtYXkgc2V0IHVwIGEgdGltZXIsIHdlIGRvbid0IHdhbnQgdG8KIAkgKiByZXByb2dyYW0gdGhlIGhhcmR3YXJlIHRpbWVyIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLgogCSAqIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIG9ubHkgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gaWRsZS4KQEAgLTkyLDE4ICsxMDYsOSBAQAogCiAJaWYgKChtYXNrMzIgJiBEU1BfSURMRSkgPT0gMCkgewogCQlfX2FzbV9fIHZvbGF0aWxlICgibWNyCXAxNSwgMCwgcjAsIGM3LCBjMCwgNCIpOwotCX0gZWxzZSB7CisJfSBlbHNlCisJCW9tYXBfc3JhbV9pZGxlKCk7CiAKLQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCQlmdW5jX3B0ciA9ICh2b2lkICopKE9NQVAxNTEwX1NSQU1fSURMRV9TVVNQRU5EKTsKLQkJfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgewotCQkJZnVuY19wdHIgPSAodm9pZCAqKShPTUFQMTYxMF9TUkFNX0lETEVfU1VTUEVORCk7Ci0JCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA1OTEyKCkpIHsKLQkJCWZ1bmNfcHRyID0gKHZvaWQgKikoT01BUDU5MTJfU1JBTV9JRExFX1NVU1BFTkQpOwotCQl9Ci0KLQkJZnVuY19wdHIoKTsKLQl9CiAJbG9jYWxfZmlxX2VuYWJsZSgpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKIH0KQEAgLTExNSw1OCArMTIwLDU1IEBACiAgKi8KIHN0YXRpYyB2b2lkIG9tYXBfcG1fd2FrZXVwX3NldHVwKHZvaWQpCiB7Ci0JLyoKLQkgKiBFbmFibGUgQVJNIFhPUiBjbG9jayBhbmQgcmVsZWFzZSBwZXJpcGhlcmFsIGZyb20gcmVzZXQgYnkKLQkgKiB3cml0aW5nIDEgdG8gUEVSX0VOIGJpdCBpbiBBUk1fUlNUQ1QyLCB0aGlzIGlzIHJlcXVpcmVkCi0JICogZm9yIFVBUlQgY29uZmlndXJhdGlvbiB0byB1c2UgVUFSVDIgdG8gd2FrZSB1cC4KLQkgKi8KLQotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX0lETEVDVDIpIHwgRU5BQkxFX1hPUkNMSywgQVJNX0lETEVDVDIpOwotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX1JTVENUMikgfCBQRVJfRU4sIEFSTV9SU1RDVDIpOwotCW9tYXBfd3JpdGV3KE1PREVNXzMyS19FTiwgVUxQRF9DTE9DS19DVFJMKTsKKwl1MzIgbGV2ZWwxX3dha2UgPSBPTUFQX0lSUV9CSVQoSU5UX0lIMl9JUlEpOworCXUzMiBsZXZlbDJfd2FrZSA9IE9NQVBfSVJRX0JJVChJTlRfVUFSVDIpIHwgT01BUF9JUlFfQklUKElOVF9LRVlCT0FSRCk7CiAKIAkvKgotCSAqIFR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCBMMS0ybmQgbGV2ZWwgY2FzY2FkZSwKLQkgKiBhbmQgdGhlIEwyIHdha2V1cCBpbnRlcnJ1cHRzOiBrZXlwYWQgYW5kIFVBUlQyLgorCSAqIFR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCBHUElPIGJhbmsgMSwgTDEtMm5kIGxldmVsIGNhc2NhZGUsCisJICogYW5kIHRoZSBMMiB3YWtldXAgaW50ZXJydXB0czoga2V5cGFkIGFuZCBVQVJUMi4gTm90ZSB0aGF0IHRoZQorCSAqIGRyaXZlcnMgbXVzdCBzdGlsbCBzZXBhcmF0ZWx5IGNhbGwgb21hcF9zZXRfZ3Bpb193YWtldXAoKSB0bworCSAqIHdha2UgdXAgdG8gYSBHUElPIGludGVycnVwdC4KIAkgKi8KKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkgfHwgY3B1X2lzX29tYXAxNnh4KCkpCisJCWxldmVsMV93YWtlIHw9IE9NQVBfSVJRX0JJVChJTlRfR1BJT19CQU5LMSk7CisJZWxzZSBpZiAoY3B1X2lzX29tYXA3MzAoKSkKKwkJbGV2ZWwxX3dha2UgfD0gT01BUF9JUlFfQklUKElOVF83MzBfR1BJT19CQU5LMSk7CiAKLQlvbWFwX3dyaXRlbCh+SVJRX0xFVkVMMiwgT01BUF9JSDFfTUlSKTsKKwlvbWFwX3dyaXRlbCh+bGV2ZWwxX3dha2UsIE9NQVBfSUgxX01JUik7CiAKLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJb21hcF93cml0ZWwofihJUlFfVUFSVDIgfCBJUlFfS0VZQk9BUkQpLCAgT01BUF9JSDJfTUlSKTsKLQl9CisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKQorCQlvbWFwX3dyaXRlbCh+bGV2ZWwyX3dha2UsICBPTUFQX0lIMl9NSVIpOwogCisJLyogSU5UXzE2MTBfV0FLRV9VUF9SRVEgaXMgbmVlZGVkIGZvciBHUElPIHdha2V1cC4uLiAqLwogCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgewotCQlvbWFwX3dyaXRlbCh+KElSUV9VQVJUMiB8IElSUV9LRVlCT0FSRCksIE9NQVBfSUgyXzBfTUlSKTsKLQotCQlvbWFwX3dyaXRlbCh+MHgwLCBPTUFQX0lIMl8xX01JUik7CisJCW9tYXBfd3JpdGVsKH5sZXZlbDJfd2FrZSwgT01BUF9JSDJfMF9NSVIpOworCQlvbWFwX3dyaXRlbCh+T01BUF9JUlFfQklUKElOVF8xNjEwX1dBS0VfVVBfUkVRKSwgT01BUF9JSDJfMV9NSVIpOwogCQlvbWFwX3dyaXRlbCh+MHgwLCBPTUFQX0lIMl8yX01JUik7CiAJCW9tYXBfd3JpdGVsKH4weDAsIE9NQVBfSUgyXzNfTUlSKTsKIAl9CiAKLQkvKiAgTmV3IElSUSBhZ3JlZW1lbnQgKi8KKwkvKiAgTmV3IElSUSBhZ3JlZW1lbnQsIHJlY2FsY3VsYXRlIGluIGNhc2NhZGUgb3JkZXIgKi8KKwlvbWFwX3dyaXRlbCgxLCBPTUFQX0lIMl9DT05UUk9MKTsKICAJb21hcF93cml0ZWwoMSwgT01BUF9JSDFfQ09OVFJPTCk7Ci0KLQkvKiBleHRlcm5hbCBQVUxMIHRvIGRvd24sIGJpdCAyMiA9IDAgKi8KLQlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKFBVTExfRFdOX0NUUkxfMikgJiB+KDE8PDIyKSwgUFVMTF9EV05fQ1RSTF8yKTsKIH0KIAogdm9pZCBvbWFwX3BtX3N1c3BlbmQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgbWFzazMyID0gMDsKIAl1bnNpZ25lZCBsb25nIGFyZzAgPSAwLCBhcmcxID0gMDsKLQlpbnQgKCpmdW5jX3B0cikodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KSA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgc2F2ZV9kc3BfaWRsZWN0MjsKIAotCXByaW50aygiUE06IE9NQVAleCBpcyBlbnRlcmluZyBkZWVwIHNsZWVwIG5vdyAuLi5cbiIsIHN5c3RlbV9yZXYpOworCXByaW50aygiUE06IE9NQVAleCBpcyB0cnlpbmcgdG8gZW50ZXIgZGVlcCBzbGVlcC4uLlxuIiwgc3lzdGVtX3Jldik7CisKKwlvbWFwX3NlcmlhbF93YWtlX3RyaWdnZXIoMSk7CiAKIAlpZiAobWFjaGluZV9pc19vbWFwX29zaygpKSB7CiAJCS8qIFN0b3AgTEVEMSAoRDkpIGJsaW5rICovCiAJCXRwczY1MDEwX3NldF9sZWQoTEVEMSwgT0ZGKTsKIAl9CiAKKwlvbWFwX3dyaXRldygweGZmZmYsIFVMUERfU09GVF9ESVNBQkxFX1JFUV9SRUcpOworCiAJLyoKLQkgKiBTdGVwIDE6IHR1cm4gb2ZmIGludGVycnVwdHMKKwkgKiBTdGVwIDE6IHR1cm4gb2ZmIGludGVycnVwdHMgKEZJWE1FOiBOT1RFOiBhbHJlYWR5IGRpc2FibGVkKQogCSAqLwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKQEAgLTIwNyw2ICsyMDksOCBAQAogCUFSTV9TQVZFKEFSTV9DS0NUTCk7CiAJQVJNX1NBVkUoQVJNX0lETEVDVDEpOwogCUFSTV9TQVZFKEFSTV9JRExFQ1QyKTsKKwlpZiAoIShjcHVfaXNfb21hcDE1MTAoKSkpCisJCUFSTV9TQVZFKEFSTV9JRExFQ1QzKTsKIAlBUk1fU0FWRShBUk1fRVdVUENUKTsKIAlBUk1fU0FWRShBUk1fUlNUQ1QxKTsKIAlBUk1fU0FWRShBUk1fUlNUQ1QyKTsKQEAgLTIxNCw0MiArMjE4LDEyIEBACiAJVUxQRF9TQVZFKFVMUERfQ0xPQ0tfQ1RSTCk7CiAJVUxQRF9TQVZFKFVMUERfU1RBVFVTX1JFUSk7CiAKLQkvKgotCSAqIFN0ZXAgMzogTE9XX1BXUiBzaWduYWwgZW5hYmxpbmcKLQkgKgotCSAqIEFsbG93IHRoZSBMT1dfUFdSIHNpZ25hbCB0byBiZSB2aXNpYmxlIG9uIE1QVUlPNSBiYWxsLgotCSAqLwotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQkvKiBQT1dFUl9DVFJMX1JFRyA9IDB4MSAoTE9XX1BPV0VSIGlzIGF2YWlsYWJsZSkgKi8KLQkJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpIHwKLQkJCSAgICBPTUFQMTUxMF9VTFBEX0xPV19QT1dFUl9SRVEsIFVMUERfUE9XRVJfQ1RSTCk7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2eHgoKSkgewotCQkvKiBQT1dFUl9DVFJMX1JFRyA9IDB4MSAoTE9XX1BPV0VSIGlzIGF2YWlsYWJsZSkgKi8KLQkJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpIHwKLQkJCSAgICBPTUFQMTYxMF9VTFBEX0xPV19QT1dFUl9SRVEsIFVMUERfUE9XRVJfQ1RSTCk7Ci0JfQotCi0JLyogY29uZmlndXJlIExPV19QV1IgcGluICovCi0Jb21hcF9jZmdfcmVnKFQyMF8xNjEwX0xPV19QV1IpOworCS8qIChTdGVwIDMgcmVtb3ZlZCAtIHdlIG5vdyBhbGxvdyBkZWVwIHNsZWVwIGJ5IGRlZmF1bHQpICovCiAKIAkvKgogCSAqIFN0ZXAgNDogT01BUCBEU1AgU2h1dGRvd24KIAkgKi8KIAotCS8qIFNldCBEU1BfUlNUID0gMSBhbmQgRFNQX0VOID0gMCwgcHV0IERTUCBibG9jayBpbnRvIHJlc2V0ICovCi0Jb21hcF93cml0ZWwoKG9tYXBfcmVhZGwoQVJNX1JTVENUMSkgfCBEU1BfUlNUKSAmIH5EU1BfRU5BQkxFLAotCQkgICAgQVJNX1JTVENUMSk7Ci0KLQkvKiBTZXQgRFNQIGJvb3QgbW9kZSB0byBEU1AtSURMRSwgRFNQX0JPT1RfTU9ERSA9IDB4MiAqLwotICAgICAgICBvbWFwX3dyaXRlbChEU1BfSURMRV9NT0RFLCBNUFVJX0RTUF9CT09UX0NPTkZJRyk7Ci0KLQkvKiBTZXQgRU5fRFNQQ0sgPSAwLCBzdG9wIERTUCBibG9jayBjbG9jayAqLwotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX0NLQ1RMKSAmIH5EU1BfQ0xPQ0tfRU5BQkxFLCBBUk1fQ0tDVEwpOwotCi0JLyogU3RvcCBhbnkgRFNQIGRvbWFpbiBjbG9ja3MgKi8KLQlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKEFSTV9JRExFQ1QyKSB8ICgxPDxFTl9BUElDSyksIEFSTV9JRExFQ1QyKTsKLQlzYXZlX2RzcF9pZGxlY3QyID0gX19yYXdfcmVhZHcoRFNQX0lETEVDVDIpOwotCV9fcmF3X3dyaXRldygwLCBEU1BfSURMRUNUMik7CiAKIAkvKgogCSAqIFN0ZXAgNTogV2FrZXVwIEV2ZW50IFNldHVwCkBAIC0yNTgsMjQgKzIzMiw5IEBACiAJb21hcF9wbV93YWtldXBfc2V0dXAoKTsKIAogCS8qCi0JICogU3RlcCA2YTogQVJNIGFuZCBUcmFmZmljIGNvbnRyb2xsZXIgc2h1dGRvd24KLQkgKgotCSAqIFN0ZXAgNiBzdGFydHMgaGVyZSB3aXRoIGNsb2NrIGFuZCB3YXRjaGRvZyBkaXNhYmxlCisJICogU3RlcCA2OiBBUk0gYW5kIFRyYWZmaWMgY29udHJvbGxlciBzaHV0ZG93bgogCSAqLwogCi0JLyogc3RvcCBjbG9ja3MgKi8KLQltYXNrMzIgPSBvbWFwX3JlYWRsKEFSTV9JRExFQ1QyKTsKLQltYXNrMzIgJj0gfigxPDxFTl9XRFRDSyk7ICAvKiBiaXQgMCAtPiAwIChXRFQgY2xvY2spICovCi0JbWFzazMyIHw9ICAoMTw8RU5fWE9SUENLKTsgLyogYml0IDEgLT4gMSAoWE9SUENLIGNsb2NrKSAqLwotCW1hc2szMiAmPSB+KDE8PEVOX1BFUkNLKTsgIC8qIGJpdCAyIC0+IDAgKE1QVVBFUl9DSyBjbG9jaykgKi8KLQltYXNrMzIgJj0gfigxPDxFTl9MQ0RDSyk7ICAvKiBiaXQgMyAtPiAwIChMQ0RDIGNsb2NrKSAqLwotCW1hc2szMiAmPSB+KDE8PEVOX0xCQ0spOyAgIC8qIGJpdCA0IC0+IDAgKGxvY2FsIGJ1cyBjbG9jaykgKi8KLQltYXNrMzIgfD0gICgxPDxFTl9BUElDSyk7ICAvKiBiaXQgNiAtPiAxIChNUFVJIGNsb2NrKSAqLwotCW1hc2szMiAmPSB+KDE8PEVOX1RJTUNLKTsgIC8qIGJpdCA3IC0+IDAgKE1QVSB0aW1lciBjbG9jaykgKi8KLQltYXNrMzIgJj0gfigxPDxETUFDS19SRVEpOyAvKiBiaXQgOCAtPiAwIChETUFDIGNsb2NrKSAqLwotCW1hc2szMiAmPSB+KDE8PEVOX0dQSU9DSyk7IC8qIGJpdCA5IC0+IDAgKEdQSU8gY2xvY2spICovCi0Jb21hcF93cml0ZWwobWFzazMyLCBBUk1fSURMRUNUMik7Ci0KIAkvKiBkaXNhYmxlIEFSTSB3YXRjaGRvZyAqLwogCW9tYXBfd3JpdGVsKDB4MDBGNSwgT01BUF9XRFRfVElNRVJfTU9ERSk7CiAJb21hcF93cml0ZWwoMHgwMEEwLCBPTUFQX1dEVF9USU1FUl9NT0RFKTsKQEAgLTI5NSw0NyArMjU0LDI0IEBACiAJYXJnMCA9IGFybV9zbGVlcF9zYXZlW0FSTV9TTEVFUF9TQVZFX0FSTV9JRExFQ1QxXTsKIAlhcmcxID0gYXJtX3NsZWVwX3NhdmVbQVJNX1NMRUVQX1NBVkVfQVJNX0lETEVDVDJdOwogCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCWZ1bmNfcHRyID0gKHZvaWQgKikoT01BUDE1MTBfU1JBTV9BUElfU1VTUEVORCk7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgewotCQlmdW5jX3B0ciA9ICh2b2lkICopKE9NQVAxNjEwX1NSQU1fQVBJX1NVU1BFTkQpOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA1OTEyKCkpIHsKLQkJZnVuY19wdHIgPSAodm9pZCAqKShPTUFQNTkxMl9TUkFNX0FQSV9TVVNQRU5EKTsKLQl9Ci0KIAkvKgogCSAqIFN0ZXAgNmM6IEFSTSBhbmQgVHJhZmZpYyBjb250cm9sbGVyIHNodXRkb3duCiAJICoKIAkgKiBKdW1wIHRvIGFzc2VtYmx5IGNvZGUuIFRoZSBwcm9jZXNzb3Igd2lsbCBzdGF5IHRoZXJlCiAgCSAqIHVudGlsIHdha2UgdXAuCiAJICovCi0KLSAgICAgICAgZnVuY19wdHIoYXJnMCwgYXJnMSk7CisgICAgICAgIG9tYXBfc3JhbV9zdXNwZW5kKGFyZzAsIGFyZzEpOwogCiAJLyoKIAkgKiBJZiB3ZSBhcmUgaGVyZSwgcHJvY2Vzc29yIGlzIHdva2VuIHVwIQogCSAqLwogCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCS8qIFBPV0VSX0NUUkxfUkVHID0gMHgwIChMT1dfUE9XRVIgaXMgZGlzYWJsZWQpICovCi0JCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoVUxQRF9QT1dFUl9DVFJMKSAmCi0JCQkgICAgfk9NQVAxNTEwX1VMUERfTE9XX1BPV0VSX1JFUSwgVUxQRF9QT1dFUl9DVFJMKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7Ci0JCS8qIFBPV0VSX0NUUkxfUkVHID0gMHgwIChMT1dfUE9XRVIgaXMgZGlzYWJsZWQpICovCi0JCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoVUxQRF9QT1dFUl9DVFJMKSAmCi0JCQkgICAgfk9NQVAxNjEwX1VMUERfTE9XX1BPV0VSX1JFUSwgVUxQRF9QT1dFUl9DVFJMKTsKLQl9Ci0KLQotCS8qIFJlc3RvcmUgRFNQIGNsb2NrcyAqLwotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX0lETEVDVDIpIHwgKDE8PEVOX0FQSUNLKSwgQVJNX0lETEVDVDIpOwotCV9fcmF3X3dyaXRldyhzYXZlX2RzcF9pZGxlY3QyLCBEU1BfSURMRUNUMik7Ci0JQVJNX1JFU1RPUkUoQVJNX0lETEVDVDIpOwotCiAJLyoKIAkgKiBSZXN0b3JlIEFSTSBzdGF0ZSwgZXhjZXB0IEFSTV9JRExFQ1QxLzIgd2hpY2ggb21hcF9jcHVfc3VzcGVuZCBkaWQKIAkgKi8KIAorCWlmICghKGNwdV9pc19vbWFwMTUxMCgpKSkKKwkJQVJNX1JFU1RPUkUoQVJNX0lETEVDVDMpOwogCUFSTV9SRVNUT1JFKEFSTV9DS0NUTCk7CiAJQVJNX1JFU1RPUkUoQVJNX0VXVVBDVCk7CiAJQVJNX1JFU1RPUkUoQVJNX1JTVENUMSk7CkBAIC0zNjYsNiArMzAyLDggQEAKIAkJTVBVSTE2MTBfUkVTVE9SRShPTUFQX0lIMl8zX01JUik7CiAJfQogCisJb21hcF93cml0ZXcoMCwgVUxQRF9TT0ZUX0RJU0FCTEVfUkVRX1JFRyk7CisKIAkvKgogCSAqIFJlZW5hYmxlIGludGVycnVwdHMKIAkgKi8KQEAgLTM3Myw2ICszMTEsOCBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAlsb2NhbF9maXFfZW5hYmxlKCk7CiAKKwlvbWFwX3NlcmlhbF93YWtlX3RyaWdnZXIoMCk7CisKIAlwcmludGsoIlBNOiBPTUFQJXggaXMgcmUtc3RhcnRpbmcgZnJvbSBkZWVwIHNsZWVwLi4uXG4iLCBzeXN0ZW1fcmV2KTsKIAogCWlmIChtYWNoaW5lX2lzX29tYXBfb3NrKCkpIHsKQEAgLTQwMSw2ICszNDEsOCBAQAogCUFSTV9TQVZFKEFSTV9DS0NUTCk7CiAJQVJNX1NBVkUoQVJNX0lETEVDVDEpOwogCUFSTV9TQVZFKEFSTV9JRExFQ1QyKTsKKwlpZiAoIShjcHVfaXNfb21hcDE1MTAoKSkpCisJCUFSTV9TQVZFKEFSTV9JRExFQ1QzKTsKIAlBUk1fU0FWRShBUk1fRVdVUENUKTsKIAlBUk1fU0FWRShBUk1fUlNUQ1QxKTsKIAlBUk1fU0FWRShBUk1fUlNUQ1QyKTsKQEAgLTQzNiw2ICszNzgsNyBAQAogCQkgICAiQVJNX0NLQ1RMX1JFRzogICAgICAgICAgICAweCUtOHggICAgIFxuIgogCQkgICAiQVJNX0lETEVDVDFfUkVHOiAgICAgICAgICAweCUtOHggICAgIFxuIgogCQkgICAiQVJNX0lETEVDVDJfUkVHOiAgICAgICAgICAweCUtOHggICAgIFxuIgorCQkgICAiQVJNX0lETEVDVDNfUkVHOgkgICAgICAweCUtOHggICAgIFxuIgogCQkgICAiQVJNX0VXVVBDVF9SRUc6ICAgICAgICAgICAweCUtOHggICAgIFxuIgogCQkgICAiQVJNX1JTVENUMV9SRUc6ICAgICAgICAgICAweCUtOHggICAgIFxuIgogCQkgICAiQVJNX1JTVENUMl9SRUc6ICAgICAgICAgICAweCUtOHggICAgIFxuIgpAQCAtNDQ5LDYgKzM5Miw3IEBACiAJCSAgIEFSTV9TSE9XKEFSTV9DS0NUTCksCiAJCSAgIEFSTV9TSE9XKEFSTV9JRExFQ1QxKSwKIAkJICAgQVJNX1NIT1coQVJNX0lETEVDVDIpLAorCQkgICBBUk1fU0hPVyhBUk1fSURMRUNUMyksCiAJCSAgIEFSTV9TSE9XKEFSTV9FV1VQQ1QpLAogCQkgICBBUk1fU0hPVyhBUk1fUlNUQ1QxKSwKIAkJICAgQVJNX1NIT1coQVJNX1JTVENUMiksCkBAIC01MDcsNyArNDUxLDcgQEAKIAogCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZHJpdmVyL29tYXBfcG0iLAogCQkJCSAgICAgICBTX0lXVVNSIHwgU19JUlVHTywgTlVMTCwKLQkJCQkgICAgICAgb21hcF9wbV9yZWFkX3Byb2MsIDApOworCSAgIG9tYXBfcG1fcmVhZF9wcm9jLCBOVUxMKTsKIH0KIAogI2VuZGlmIC8qIERFQlVHICYmIENPTkZJR19QUk9DX0ZTICovCkBAIC01ODAsNyArNTI0LDIxIEBACiB9CiAKIAotc3RydWN0IHBtX29wcyBvbWFwX3BtX29wcyA9eworc3RhdGljIGlycXJldHVybl90ICBvbWFwX3dha2V1cF9pbnRlcnJ1cHQoaW50ICBpcnEsIHZvaWQgKiAgZGV2LAorCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKiAgcmVncykKK3sKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG9tYXBfd2FrZXVwX2lycSA9IHsKKwkubmFtZQkJPSAicGVyaXBoZXJhbCB3YWtldXAiLAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCisJLmhhbmRsZXIJPSBvbWFwX3dha2V1cF9pbnRlcnJ1cHQKK307CisKKworCitzdGF0aWMgc3RydWN0IHBtX29wcyBvbWFwX3BtX29wcyA9ewogCS5wbV9kaXNrX21vZGUgPSAwLAogICAgICAgICAucHJlcGFyZSAgICAgICAgPSBvbWFwX3BtX3ByZXBhcmUsCiAgICAgICAgIC5lbnRlciAgICAgICAgICA9IG9tYXBfcG1fZW50ZXIsCkBAIC01OTAsNDIgKzU0OCw2MSBAQAogc3RhdGljIGludCBfX2luaXQgb21hcF9wbV9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKCJQb3dlciBNYW5hZ2VtZW50IGZvciBUSSBPTUFQLlxuIik7Ci0JcG1faWRsZSA9IG9tYXBfcG1faWRsZTsKIAkvKgogCSAqIFdlIGNvcHkgdGhlIGFzc2VtYmxlciBzbGVlcC93YWtldXAgcm91dGluZXMgdG8gU1JBTS4KIAkgKiBUaGVzZSByb3V0aW5lcyBuZWVkIHRvIGJlIGluIFNSQU0gYXMgdGhhdCdzIHRoZSBvbmx5CiAJICogbWVtb3J5IHRoZSBNUFUgY2FuIHNlZSB3aGVuIGl0IHdha2VzIHVwLgogCSAqLwotCi0jaWZkZWYJQ09ORklHX0FSQ0hfT01BUDE1MTAKIAlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJbWVtY3B5KCh2b2lkICopT01BUDE1MTBfU1JBTV9JRExFX1NVU1BFTkQsCi0JCSAgICAgICBvbWFwMTUxMF9pZGxlX2xvb3Bfc3VzcGVuZCwKLQkJICAgICAgIG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kX3N6KTsKLQkJbWVtY3B5KCh2b2lkICopT01BUDE1MTBfU1JBTV9BUElfU1VTUEVORCwgb21hcDE1MTBfY3B1X3N1c3BlbmQsCi0JCSAgICAgICBvbWFwMTUxMF9jcHVfc3VzcGVuZF9zeik7Ci0JfSBlbHNlCi0jZW5kaWYKLQlpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpIHsKLQkJbWVtY3B5KCh2b2lkICopT01BUDE2MTBfU1JBTV9JRExFX1NVU1BFTkQsCi0JCSAgICAgICBvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZCwKLQkJICAgICAgIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kX3N6KTsKLQkJbWVtY3B5KCh2b2lkICopT01BUDE2MTBfU1JBTV9BUElfU1VTUEVORCwgb21hcDE2MTBfY3B1X3N1c3BlbmQsCi0JCSAgICAgICBvbWFwMTYxMF9jcHVfc3VzcGVuZF9zeik7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDU5MTIoKSkgewotCQltZW1jcHkoKHZvaWQgKilPTUFQNTkxMl9TUkFNX0lETEVfU1VTUEVORCwKLQkJICAgICAgIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kLAotCQkgICAgICAgb21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opOwotCQltZW1jcHkoKHZvaWQgKilPTUFQNTkxMl9TUkFNX0FQSV9TVVNQRU5ELCBvbWFwMTYxMF9jcHVfc3VzcGVuZCwKLQkJICAgICAgIG9tYXAxNjEwX2NwdV9zdXNwZW5kX3N6KTsKKwkJb21hcF9zcmFtX2lkbGUgPSBvbWFwX3NyYW1fcHVzaChvbWFwMTUxMF9pZGxlX2xvb3Bfc3VzcGVuZCwKKwkJCQkJCW9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kX3N6KTsKKwkJb21hcF9zcmFtX3N1c3BlbmQgPSBvbWFwX3NyYW1fcHVzaChvbWFwMTUxMF9jcHVfc3VzcGVuZCwKKwkJCQkJCSAgIG9tYXAxNTEwX2NwdV9zdXNwZW5kX3N6KTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCW9tYXBfc3JhbV9pZGxlID0gb21hcF9zcmFtX3B1c2gob21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmQsCisJCQkJCQlvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZF9zeik7CisJCW9tYXBfc3JhbV9zdXNwZW5kID0gb21hcF9zcmFtX3B1c2gob21hcDE2MTBfY3B1X3N1c3BlbmQsCisJCQkJCQkgICBvbWFwMTYxMF9jcHVfc3VzcGVuZF9zeik7CiAJfQogCisJaWYgKG9tYXBfc3JhbV9pZGxlID09IE5VTEwgfHwgb21hcF9zcmFtX3N1c3BlbmQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlBNIG5vdCBpbml0aWFsaXplZDogTWlzc2luZyBTUkFNIHN1cHBvcnRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwbV9pZGxlID0gb21hcF9wbV9pZGxlOworCisJc2V0dXBfaXJxKElOVF8xNjEwX1dBS0VfVVBfUkVRLCAmb21hcF93YWtldXBfaXJxKTsKKyNpZiAwCisJLyogLS0tIEJFR0lOIEJPQVJELURFUEVOREVOVCBDT0RFIC0tLSAqLworCS8qIFNsZWVweCBtYXNrIGRpcmVjdGlvbiAqLworCW9tYXBfd3JpdGV3KChvbWFwX3JlYWR3KDB4ZmZmYjUwMDgpICYgfjIpLCAweGZmZmI1MDA4KTsKKwkvKiBVbm1hc2sgc2xlZXB4IHNpZ25hbCAqLworCW9tYXBfd3JpdGV3KChvbWFwX3JlYWR3KDB4ZmZmYjUwMDQpICYgfjIpLCAweGZmZmI1MDA0KTsKKwkvKiAtLS0gRU5EIEJPQVJELURFUEVOREVOVCBDT0RFIC0tLSAqLworI2VuZGlmCisKKwkvKiBQcm9ncmFtIG5ldyBwb3dlciByYW1wLXVwIHRpbWUKKwkgKiAoMCBmb3IgbW9zdCBib2FyZHMgc2luY2Ugd2UgZG9uJ3QgbG93ZXIgdm9sdGFnZSB3aGVuIGluIGRlZXAgc2xlZXApCisJICovCisJb21hcF93cml0ZXcoVUxQRF9TRVRVUF9BTkFMT0dfQ0VMTF8zX1ZBTCwgVUxQRF9TRVRVUF9BTkFMT0dfQ0VMTF8zKTsKKworCS8qIFNldHVwIFVMUEQgUE9XRVJfQ1RSTF9SRUcgLSBlbnRlciBkZWVwIHNsZWVwIHdoZW5ldmVyIHBvc3NpYmxlICovCisJb21hcF93cml0ZXcoVUxQRF9QT1dFUl9DVFJMX1JFR19WQUwsIFVMUERfUE9XRVJfQ1RSTCk7CisKKwkvKiBDb25maWd1cmUgSURMRUNUMyAqLworCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKKwkJb21hcF93cml0ZWwoT01BUDE2MTBfSURMRUNUM19WQUwsIE9NQVAxNjEwX0lETEVDVDMpOworCiAJcG1fc2V0X29wcygmb21hcF9wbV9vcHMpOwogCiAjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKIAlvbWFwX3BtX2luaXRfcHJvYygpOwogI2VuZGlmCiAKKwkvKiBjb25maWd1cmUgTE9XX1BXUiBwaW4gKi8KKwlvbWFwX2NmZ19yZWcoVDIwXzE2MTBfTE9XX1BXUik7CisKIAlyZXR1cm4gMDsKIH0KIF9faW5pdGNhbGwob21hcF9wbV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zbGVlcC5TIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NsZWVwLlMKaW5kZXggMjc5NDkwYy4uOWY3NDU4MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL3NsZWVwLlMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NsZWVwLlMKQEAgLTY2LDcgKzY2LDcgQEAKIAlAIGdldCBBUk1fSURMRUNUMiBpbnRvIHIyCiAJbGRyaAlyMiwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCiAJbW92CXI1LCAjT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZgotIAlvcnIJcjUscjUsICNPTUFQMTUxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmMDAKKwlvcnIJcjUsIHI1LCAjT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZjAwCiAJc3RyaAlyNSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCiAKIAlAIHJlcXVlc3QgQVJNIGlkbGUKQEAgLTc2LDcgKzc2LDcgQEAKIAlzdHJoCXIzLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KIAogCW1vdglyNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmCi0Jb3JyICAgICByNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCisJb3JyCXI1LCByNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmMDAKIGxfMTUxMDoJc3VicwlyNSwgcjUsICMxCiAJYm5lCWxfMTUxMAogLyoKQEAgLTk2LDcgKzk2LDcgQEAKIAlzdHJoCXIyLCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KIAlzdHJoCXIxLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KIAotCWxkbWZkICAgc3AhLCB7cjAgLSByMTIsIHBjfSAgICAgQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgorCWxkbWZkCXNwISwge3IwIC0gcjEyLCBwY30JCUAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KIAogRU5UUlkob21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opCiAJLndvcmQJLiAtIG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kCkBAIC0xMTUsOCArMTE1LDggQEAKIAlAIHR1cm4gb2ZmIGNsb2NrIGRvbWFpbnMKIAlAIGdldCBBUk1fSURMRUNUMiBpbnRvIHIyCiAJbGRyaAlyMiwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCi0JbW92CXI1LCAjT01BUDE2MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZgotIAlvcnIJcjUscjUsICNPTUFQMTYxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmMDAKKwltb3YJcjUsICNPTUFQMTYxMF9JRExFQ1QyX1NMRUVQX1ZBTCAmIDB4ZmYKKwlvcnIJcjUsIHI1LCAjT01BUDE2MTBfSURMRUNUMl9TTEVFUF9WQUwgJiAweGZmMDAKIAlzdHJoCXI1LCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KIAogCUAgcmVxdWVzdCBBUk0gaWRsZQpAQCAtMTI2LDcgKzEyNiw3IEBACiAJc3RyaAlyMywgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCiAKIAltb3YJcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZgotCW9yciAgICAgcjUsIHI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYwMAorCW9ycglyNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCiBsXzE2MTA6CXN1YnMJcjUsIHI1LCAjMQogCWJuZQlsXzE2MTAKIC8qCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlzdHJoCXIyLCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KIAlzdHJoCXIxLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KIAotCWxkbWZkICAgc3AhLCB7cjAgLSByMTIsIHBjfSAgICAgQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgorCWxkbWZkCXNwISwge3IwIC0gcjEyLCBwY30JCUAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KIAogRU5UUlkob21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opCiAJLndvcmQJLiAtIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kCkBAIC0yMDgsNyArMjA4LDcgQEAKIAogCUAgdHVybiBvZmYgY2xvY2sgZG9tYWlucwogCW1vdglyNSwgI09NQVAxNTEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYKLSAJb3JyCXI1LHI1LCAjT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZjAwCisJb3JyCXI1LCByNSwgI09NQVAxNTEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYwMAogCXN0cmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQogCiAJQCByZXF1ZXN0IEFSTSBpZGxlCkBAIC0yMTcsNyArMjE3LDcgQEAKIAlzdHJoCXIzLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KIAogCW1vdglyNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmCi0Jb3JyICAgICByNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCisJb3JyCXI1LCByNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmMDAKIGxfMTUxMF8yOgogCXN1YnMJcjUsIHI1LCAjMQogCWJuZQlsXzE1MTBfMgpAQCAtMjM3LDcgKzIzNyw3IEBACiAJc3RyaAlyMCwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCiAKIAlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCi0JbGRtZmQgICBzcCEsIHtyMCAtIHIxMiwgcGN9CisJbGRtZmQJc3AhLCB7cjAgLSByMTIsIHBjfQogCiBFTlRSWShvbWFwMTUxMF9jcHVfc3VzcGVuZF9zeikKIAkud29yZAkuIC0gb21hcDE1MTBfY3B1X3N1c3BlbmQKQEAgLTI0OSwyMSArMjQ5LDI2IEBACiAJQCBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjawogCXN0bWZkCXNwISwge3IwIC0gcjEyLCBscn0KIAorCUAgRHJhaW4gd3JpdGUgY2FjaGUKKwltb3YJcjQsICMwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQKKwlub3AKKwogCUAgbG9hZCBiYXNlIGFkZHJlc3Mgb2YgVHJhZmZpYyBDb250cm9sbGVyCi0JbW92CXI0LCAjVENNSUZfQVNNX0JBU0UgJiAweGZmMDAwMDAwCi0Jb3JyCXI0LCByNCwgI1RDTUlGX0FTTV9CQVNFICYgMHgwMGZmMDAwMAotCW9ycglyNCwgcjQsICNUQ01JRl9BU01fQkFTRSAmIDB4MDAwMGZmMDAKKwltb3YJcjYsICNUQ01JRl9BU01fQkFTRSAmIDB4ZmYwMDAwMDAKKwlvcnIJcjYsIHI2LCAjVENNSUZfQVNNX0JBU0UgJiAweDAwZmYwMDAwCisJb3JyCXI2LCByNiwgI1RDTUlGX0FTTV9CQVNFICYgMHgwMDAwZmYwMAogCiAJQCBwcmVwYXJlIHRvIHB1dCBTRFJBTSBpbnRvIHNlbGYtcmVmcmVzaCBtYW51YWxseQotCWxkcglyNSwgW3I0LCAjRU1JRkZfU0RSQU1fQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQotCW9ycglyNSwgcjUsICNTRUxGX1JFRlJFU0hfTU9ERSAmIDB4ZmYwMDAwMDAKLQlvcnIJcjUsIHI1LCAjU0VMRl9SRUZSRVNIX01PREUgJiAweDAwMDAwMGZmCi0Jc3RyCXI1LCBbcjQsICNFTUlGRl9TRFJBTV9DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisJbGRyCXI3LCBbcjYsICNFTUlGRl9TRFJBTV9DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisJb3JyCXI5LCByNywgI1NFTEZfUkVGUkVTSF9NT0RFICYgMHhmZjAwMDAwMAorCW9ycglyOSwgcjksICNTRUxGX1JFRlJFU0hfTU9ERSAmIDB4MDAwMDAwZmYKKwlzdHIJcjksIFtyNiwgI0VNSUZGX1NEUkFNX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KIAogCUAgcHJlcGFyZSB0byBwdXQgRU1JRlMgdG8gU2xlZXAKLQlsZHIJcjUsIFtyNCwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KLQlvcnIJcjUsIHI1LCAjSURMRV9FTUlGU19SRVFVRVNUICYgMHhmZgotCXN0cglyNSwgW3I0LCAjRU1JRlNfQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQorCWxkcglyOCwgW3I2LCAjRU1JRlNfQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQorCW9ycglyOSwgcjgsICNJRExFX0VNSUZTX1JFUVVFU1QgJiAweGZmCisJc3RyCXI5LCBbcjYsICNFTUlGU19DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCiAKIAlAIGxvYWQgYmFzZSBhZGRyZXNzIG9mIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMgogCW1vdglyNCwgI0NMS0dFTl9SRUdfQVNNX0JBU0UgJiAweGZmMDAwMDAwCkBAIC0yNzEsMjYgKzI3NiwyMiBAQAogCW9ycglyNCwgcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHgwMDAwZmYwMAogCiAJQCB0dXJuIG9mZiBjbG9jayBkb21haW5zCi0JbW92CXI1LCAjT01BUDE2MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZgotIAlvcnIJcjUscjUsICNPTUFQMTYxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmMDAKLQlzdHJoCXI1LCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KLQotCUAgd29yayBhcm91bmQgZXJyYXRhIG9mIE9NQVAxNjEwLzU5MTIuIEVuYWJsZSAoISkgcGVyaXBoZXJhbAotCUAgY2xvY2sgdG8gbGV0IHRoZSBjaGlwIGdvIGludG8gZGVlcCBzbGVlcAotCWxkcmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQotIAlvcnIJcjUscjUsICNFTl9QRVJDS19CSVQgJiAweGZmCisJQCBkbyBub3QgZGlzYWJsZSBQRVJDSyAoMHgwNCkKKwltb3YJcjUsICNPTUFQMTYxMF9JRExFQ1QyX1NMRUVQX1ZBTCAmIDB4ZmYKKwlvcnIJcjUsIHI1LCAjT01BUDE2MTBfSURMRUNUMl9TTEVFUF9WQUwgJiAweGZmMDAKIAlzdHJoCXI1LCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KIAogCUAgcmVxdWVzdCBBUk0gaWRsZQotCW1vdglyMywgI09NQVAxNjEwX0RFRVBfU0xFRVBfUkVRVUVTVCAmIDB4ZmYKLQlvcnIJcjMsIHIzLCAjT01BUDE2MTBfREVFUF9TTEVFUF9SRVFVRVNUICYgMHhmZjAwCisJbW92CXIzLCAjT01BUDE2MTBfSURMRUNUMV9TTEVFUF9WQUwgJiAweGZmCisJb3JyCXIzLCByMywgI09NQVAxNjEwX0lETEVDVDFfU0xFRVBfVkFMICYgMHhmZjAwCiAJc3RyaAlyMywgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCiAKLQltb3YJcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZgotCW9yciAgICAgcjUsIHI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYwMAotbF8xNjEwXzI6Ci0Jc3VicwlyNSwgcjUsICMxCi0JYm5lCWxfMTYxMF8yCisJQCBkaXNhYmxlIGluc3RydWN0aW9uIGNhY2hlCisJbXJjCXAxNSwgMCwgcjksIGMxLCBjMCwgMAorCWJpYwlyMiwgcjksICMweDEwMDAKKwltY3IJcDE1LCAwLCByMiwgYzEsIGMwLCAwCisJbm9wCisKIC8qCiAgKiBMZXQncyB3YWl0IGZvciB0aGUgbmV4dCB3YWtlIHVwIGV2ZW50IHRvIHdha2UgdXMgdXAuIHIwIGNhbid0IGJlCiAgKiB1c2VkIGhlcmUgYmVjYXVzZSByMCBob2xkcyBBUk1fSURMRUNUMQpAQCAtMzAxLDEzICszMDIsMjEgQEAKICAqIG9tYXAxNjEwX2NwdV9zdXNwZW5kKCkncyByZXN1bWUgcG9pbnQuCiAgKgogICogSXQgd2lsbCBqdXN0IHN0YXJ0IGV4ZWN1dGluZyBoZXJlLCBzbyB3ZSdsbCByZXN0b3JlIHN0dWZmIGZyb20gdGhlCi0gKiBzdGFjaywgcmVzZXQgdGhlIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMi4KKyAqIHN0YWNrLgogICovCisJQCByZS1lbmFibGUgSWNhY2hlCisJbWNyCXAxNSwgMCwgcjksIGMxLCBjMCwgMAorCisJQCByZXNldCB0aGUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyLgogCXN0cmgJcjEsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQogCXN0cmgJcjAsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQogCisJQCBSZXN0b3JlIEVNSUZGIGNvbnRyb2xzCisJc3RyCXI3LCBbcjYsICNFTUlGRl9TRFJBTV9DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisJc3RyCXI4LCBbcjYsICNFTUlGU19DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisKIAlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCi0JbGRtZmQgICBzcCEsIHtyMCAtIHIxMiwgcGN9CisJbGRtZmQJc3AhLCB7cjAgLSByMTIsIHBjfQogCiBFTlRSWShvbWFwMTYxMF9jcHVfc3VzcGVuZF9zeikKIAkud29yZAkuIC0gb21hcDE2MTBfY3B1X3N1c3BlbmQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLWZuLlMgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS1mbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZWEzNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS1mbi5TCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5TCisgKgorICogRnVuY3Rpb25zIHRoYXQgbmVlZCB0byBiZSBydW4gaW4gaW50ZXJuYWwgU1JBTQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorCisJLnRleHQKKworLyoKKyAqIFJlcHJvZ3JhbXMgVUxQRCBhbmQgQ0tDVEwuCisgKi8KK0VOVFJZKHNyYW1fcmVwcm9ncmFtX2Nsb2NrKQorCXN0bWZkCXNwISwge3IwIC0gcjEyLCBscn0JCUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKKworCW1vdglyMiwgI0lPX0FERFJFU1MoRFBMTF9DVEwpICYgMHhmZjAwMDAwMAorCW9ycglyMiwgcjIsICNJT19BRERSRVNTKERQTExfQ1RMKSAmIDB4MDBmZjAwMDAKKwlvcnIJcjIsIHIyLCAjSU9fQUREUkVTUyhEUExMX0NUTCkgJiAweDAwMDBmZjAwCisKKwltb3YJcjMsICNJT19BRERSRVNTKEFSTV9DS0NUTCkgJiAweGZmMDAwMDAwCisJb3JyCXIzLCByMywgI0lPX0FERFJFU1MoQVJNX0NLQ1RMKSAmIDB4MDBmZjAwMDAKKwlvcnIJcjMsIHIzLCAjSU9fQUREUkVTUyhBUk1fQ0tDVEwpICYgMHgwMDAwZmYwMAorCisJdHN0CXIwLCAjMSA8PCA0CQkJQCB3YW50IGxvY2sgbW9kZT8KKwliZXEJbmV3Y2sJCQkJQCBub3BlCisJYmljCXIwLCByMCwgIzEgPDwgNAkJCUAgZWxzZSBjbGVhciBsb2NrIGJpdAorCXN0cmgJcjAsIFtyMl0JCQlAIHNldCBkcGxsIGludG8gYnlwYXNzIG1vZGUKKwlvcnIJcjAsIHIwLCAjMSA8PCA0CQkJQCBzZXQgbG9jayBiaXQgYWdhaW4KKworbmV3Y2s6CisJc3RyaAlyMSwgW3IzXQkJCUAgd3JpdGUgbmV3IGNrY3RsIHZhbHVlCisJc3RyaAlyMCwgW3IyXQkJCUAgd3JpdGUgbmV3IGRwbGwgdmFsdWUKKworCW1vdglyNCwgIzB4MDcwMAkJCUAgbGV0IHRoZSBjbG9ja3Mgc2V0dGxlCisJb3JyCXI0LCByNCwgIzB4MDBmZgorZGVsYXk6CXN1YglyNCwgcjQsICMxCisJY21wCXI0LCAjMAorCWJuZQlkZWxheQorCitsb2NrOglsZHJoCXI0LCBbcjJdLCAjMAkJCUAgcmVhZCBiYWNrIGRwbGwgdmFsdWUKKwl0c3QJcjAsICMxIDw8IDQJCQlAIHdhbnQgbG9jayBtb2RlPworCWJlcQlvdXQJCQkJQCBub3BlCisJdHN0CXI0LCAjMSA8PCAwCQkJQCBkcGxsIHJhdGUgbG9ja2VkPworCWJlcQlsb2NrCQkJCUAgdHJ5IGFnYWluCisKK291dDoKKwlsZG1mZAlzcCEsIHtyMCAtIHIxMiwgcGN9CQlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCitFTlRSWShzcmFtX3JlcHJvZ3JhbV9jbG9ja19zeikKKwkud29yZAkuIC0gc3JhbV9yZXByb2dyYW1fY2xvY2sKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTlhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYworICoKKyAqIE9NQVAgU1JBTSBkZXRlY3Rpb24gYW5kIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIFdyaXR0ZW4gYnkgVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCisjaW5jbHVkZSAic3JhbS5oIgorCisjZGVmaW5lIE9NQVAxX1NSQU1fQkFTRQkJMHhkMDAwMDAwMAorI2RlZmluZSBPTUFQMV9TUkFNX1NUQVJUCTB4MjAwMDAwMDAKKyNkZWZpbmUgU1JBTV9CT09UTE9BREVSX1NaCTB4ODAKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcF9zcmFtX2Jhc2U7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwX3NyYW1fc2l6ZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXBfc3JhbV9jZWlsOworCisvKgorICogVGhlIGFtb3VudCBvZiBTUkFNIGRlcGVuZHMgb24gdGhlIGNvcmUgdHlwZToKKyAqIDczMCA9IDIwMEssIDE1MTAgPSA1MTJLLCA1OTEyID0gMjU2SywgMTYxMCA9IDE2SywgMTcxMCA9IDE2SworICogTm90ZSB0aGF0IHdlIGNhbm5vdCB0cnkgdG8gdGVzdCBmb3IgU1JBTSBoZXJlIGJlY2F1c2Ugd3JpdGVzCisgKiB0byBzZWN1cmUgU1JBTSB3aWxsIGhhbmcgdGhlIHN5c3RlbS4gQWxzbyB0aGUgU1JBTSBpcyBub3QKKyAqIHlldCBtYXBwZWQgYXQgdGhpcyBwb2ludC4KKyAqLwordm9pZCBfX2luaXQgb21hcF9kZXRlY3Rfc3JhbSh2b2lkKQoreworCW9tYXBfc3JhbV9iYXNlID0gT01BUDFfU1JBTV9CQVNFOworCisJaWYgKGNwdV9pc19vbWFwNzMwKCkpCisJCW9tYXBfc3JhbV9zaXplID0gMHgzMjAwMDsKKwllbHNlIGlmIChjcHVfaXNfb21hcDE1MTAoKSkKKwkJb21hcF9zcmFtX3NpemUgPSAweDgwMDAwOworCWVsc2UgaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTYyMSgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKQorCQlvbWFwX3NyYW1fc2l6ZSA9IDB4NDAwMDsKKwllbHNlIGlmIChjcHVfaXNfb21hcDE2MTEoKSkKKwkJb21hcF9zcmFtX3NpemUgPSAweDNlODAwOworCWVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBkZXRlY3QgU1JBTSBzaXplXG4iKTsKKwkJb21hcF9zcmFtX3NpemUgPSAweDQwMDA7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiU1JBTSBzaXplOiAweCVseFxuIiwgb21hcF9zcmFtX3NpemUpOworCW9tYXBfc3JhbV9jZWlsID0gb21hcF9zcmFtX2Jhc2UgKyBvbWFwX3NyYW1fc2l6ZTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwX3NyYW1faW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJeyBPTUFQMV9TUkFNX0JBU0UsIE9NQVAxX1NSQU1fU1RBUlQsIDAsIE1UX0RFVklDRSB9Cit9OworCisvKgorICogSW4gb3JkZXIgdG8gdXNlIGxhc3QgMmtCIG9mIFNSQU0gb24gMTYxMWIsIHdlIG11c3Qgcm91bmQgdGhlIHNpemUKKyAqIHVwIHRvIG11bHRpcGxlIG9mIFBBR0VfU0laRS4gV2UgY2Fubm90IHVzZSBpb3JlbWFwIGZvciBTUkFNLCBhcworICogY2xvY2sgaW5pdCBuZWVkcyBTUkFNIGVhcmx5LgorICovCit2b2lkIF9faW5pdCBvbWFwX21hcF9zcmFtKHZvaWQpCit7CisJaWYgKG9tYXBfc3JhbV9zaXplID09IDApCisJCXJldHVybjsKKworCW9tYXBfc3JhbV9pb19kZXNjWzBdLmxlbmd0aCA9IChvbWFwX3NyYW1fc2l6ZSArIFBBR0VfU0laRS0xKS9QQUdFX1NJWkU7CisJb21hcF9zcmFtX2lvX2Rlc2NbMF0ubGVuZ3RoICo9IFBBR0VfU0laRTsKKwlpb3RhYmxlX2luaXQob21hcF9zcmFtX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcF9zcmFtX2lvX2Rlc2MpKTsKKworCS8qCisJICogTG9va3MgbGlrZSB3ZSBuZWVkIHRvIHByZXNlcnZlIHNvbWUgYm9vdGxvYWRlciBjb2RlIGF0IHRoZQorCSAqIGJlZ2lubmluZyBvZiBTUkFNIGZvciBqdW1waW5nIHRvIGZsYXNoIGZvciByZWJvb3QgdG8gd29yay4uLgorCSAqLworCW1lbXNldCgodm9pZCAqKW9tYXBfc3JhbV9iYXNlICsgU1JBTV9CT09UTE9BREVSX1NaLCAwLAorCSAgICAgICBvbWFwX3NyYW1fc2l6ZSAtIFNSQU1fQk9PVExPQURFUl9TWik7Cit9CisKK3N0YXRpYyB2b2lkICgqX29tYXBfc3JhbV9yZXByb2dyYW1fY2xvY2spKHUzMiBkcGxsY3RsLCB1MzIgY2tjdGwpID0gTlVMTDsKKwordm9pZCBvbWFwX3NyYW1fcmVwcm9ncmFtX2Nsb2NrKHUzMiBkcGxsY3RsLCB1MzIgY2tjdGwpCit7CisJaWYgKF9vbWFwX3NyYW1fcmVwcm9ncmFtX2Nsb2NrID09IE5VTEwpCisJCXBhbmljKCJDYW5ub3QgdXNlIFNSQU0iKTsKKworCXJldHVybiBfb21hcF9zcmFtX3JlcHJvZ3JhbV9jbG9jayhkcGxsY3RsLCBja2N0bCk7Cit9CisKK3ZvaWQgKiBvbWFwX3NyYW1fcHVzaCh2b2lkICogc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA+IChvbWFwX3NyYW1fY2VpbCAtIChvbWFwX3NyYW1fYmFzZSArIFNSQU1fQk9PVExPQURFUl9TWikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm90IGVub3VnaCBzcGFjZSBpbiBTUkFNXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW9tYXBfc3JhbV9jZWlsIC09IHNpemU7CisJb21hcF9zcmFtX2NlaWwgJj0gfjB4MzsKKwltZW1jcHkoKHZvaWQgKilvbWFwX3NyYW1fY2VpbCwgc3RhcnQsIHNpemUpOworCisJcmV0dXJuICh2b2lkICopb21hcF9zcmFtX2NlaWw7Cit9CisKK3ZvaWQgX19pbml0IG9tYXBfc3JhbV9pbml0KHZvaWQpCit7CisJb21hcF9kZXRlY3Rfc3JhbSgpOworCW9tYXBfbWFwX3NyYW0oKTsKKwlfb21hcF9zcmFtX3JlcHJvZ3JhbV9jbG9jayA9IG9tYXBfc3JhbV9wdXNoKHNyYW1fcmVwcm9ncmFtX2Nsb2NrLAorCQkJCQkJICAgIHNyYW1fcmVwcm9ncmFtX2Nsb2NrX3N6KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTg0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5oCisgKgorICogSW50ZXJmYWNlIGZvciBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHJ1biBpbiBpbnRlcm5hbCBTUkFNCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQVJDSF9BUk1fT01BUF9TUkFNX0gKKyNkZWZpbmUgX19BUkNIX0FSTV9PTUFQX1NSQU1fSAorCitleHRlcm4gdm9pZCAqIG9tYXBfc3JhbV9wdXNoKHZvaWQgKiBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiB2b2lkIG9tYXBfc3JhbV9yZXByb2dyYW1fY2xvY2sodTMyIGRwbGxjdGwsIHUzMiBja2N0bCk7CisKKy8qIERvIG5vdCB1c2UgdGhlc2UgKi8KK2V4dGVybiB2b2lkIHNyYW1fcmVwcm9ncmFtX2Nsb2NrKHUzMiBja2N0bCwgdTMyIGRwbGxjdGwpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3JhbV9yZXByb2dyYW1fY2xvY2tfc3o7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCmluZGV4IDI1YmM0YTguLjk4ZjFjNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC91c2IuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMKQEAgLTQxLDYgKzQxLDcgQEAKIAogLyogVGhlc2Ugcm91dGluZXMgc2hvdWxkIGhhbmRsZSB0aGUgc3RhbmRhcmQgY2hpcC1zcGVjaWZpYyBtb2RlcwogICogZm9yIHVzYjAvMS8yIHBvcnRzLCBjb3ZlcmluZyBiYXNpYyBtdXggYW5kIHRyYW5zY2VpdmVyIHNldHVwLgorICogQ2FsbCBvbWFwX3VzYl9pbml0KCkgb25jZSwgZnJvbSBJTklUX01BQ0hJTkUoKS4KICAqCiAgKiBTb21lIGJvYXJkLSouYyBmaWxlcyB3aWxsIG5lZWQgdG8gc2V0IHVwIGFkZGl0aW9uYWwgbXV4IG9wdGlvbnMsCiAgKiBsaWtlIGZvciBzdXNwZW5kIGhhbmRsaW5nLCB2YnVzIHNlbnNpbmcsIEdQSU9zLCBhbmQgdGhlIEQrIHB1bGx1cC4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC9lbnRyeS5TIGIvYXJjaC9hcm0vdmZwL2VudHJ5LlMKaW5kZXggZTczYzhkZS4uNmYxNzE4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdmZwL2VudHJ5LlMKKysrIGIvYXJjaC9hcm0vdmZwL2VudHJ5LlMKQEAgLTE3LDcgKzE3LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS92ZnBtYWNyb3MuaD4KIAogCS5nbG9ibAlkb192ZnAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvS2NvbmZpZyBiL2FyY2gvYXJtMjYvS2NvbmZpZwppbmRleCAxZjAzNzMyLi4xZjAwYjNkIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L0tjb25maWcKKysrIGIvYXJjaC9hcm0yNi9LY29uZmlnCkBAIC01NSw2ICs1NSwxMCBAQAogY29uZmlnIEdFTkVSSUNfSVNBX0RNQQogCWJvb2wKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJYm9vbAorCWRlZmF1bHQgeQorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogCmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L01ha2VmaWxlIGIvYXJjaC9hcm0yNi9NYWtlZmlsZQppbmRleCBhZGE4OTg1Li44NDRhOWU0IDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtMjYvTWFrZWZpbGUKQEAgLTE3LDEwICsxNyw2IEBACiBDRkxBR1MJCSs9LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLW1uby1zY2hlZC1wcm9sb2cKIGVuZGlmCiAKLWlmZXEgKCQoQ09ORklHX0RFQlVHX0lORk8pLHkpCi1DRkxBR1MJCSs9LWcKLWVuZGlmCi0KIENGTEFHU19CT09UCTo9LW1hcGNzLTI2IC1tY3B1PWFybTMgLW1zb2Z0LWZsb2F0IC1VYXJtCiBDRkxBR1MJCSs9LW1hcGNzLTI2IC1tY3B1PWFybTMgLW1zb2Z0LWZsb2F0IC1VYXJtCiBBRkxBR1MJCSs9LW1hcGNzLTI2IC1tY3B1PWFybTMgLW1zb2Z0LWZsb2F0CkBAIC01MywxMCArNDksNiBAQAogCiBib290IDo9IGFyY2gvYXJtMjYvYm9vdAogCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbV9vZmZzZXRzLmgKLUNMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtX29mZnNldHMuaAotCi0KIC5QSE9OWTogbWFrZXRvb2xzIEZPUkNFCiBtYWtldG9vbHM6IEZPUkNFCiAJCkBAIC05OCwxMiArOTAsNiBAQAogCWZpOyBcCiAJKQogCi1hcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLQkJCQkgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKLQotaW5jbHVkZS9hc20tJChBUkNIKS9hc21fb2Zmc2V0cy5oOiBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCi0KIGRlZmluZSBhcmNoaGVscAogICBlY2hvICAnKiB6SW1hZ2UgICAgICAgIC0gQ29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgKGFyY2gvJChBUkNIKS9ib290L3pJbWFnZSknCiAgIGVjaG8gICcgIEltYWdlICAgICAgICAgLSBVbmNvbXByZXNzZWQga2VybmVsIGltYWdlIChhcmNoLyQoQVJDSCkvYm9vdC9JbWFnZSknCmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9hcm0yNi9rZXJuZWwvZW50cnkuUwppbmRleCBhMjMxZGQ4Li42ZDkxMGVhIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL2VudHJ5LlMKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c2lycS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9rZXJuZWwvdGltZS5jIGIvYXJjaC9hcm0yNi9rZXJuZWwvdGltZS5jCmluZGV4IDU0OWE2YjIuLmU2NmFlZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2FybTI2L2tlcm5lbC90aW1lLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZG9fc2V0X3J0Yyh2b2lkKQogewotCWlmICh0aW1lX3N0YXR1cyAmIFNUQV9VTlNZTkMgfHwgc2V0X3J0YyA9PSBOVUxMKQorCWlmICghbnRwX3N5bmNlZCgpIHx8IHNldF9ydGMgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAvL0ZJWE1FIC0gdGltZXNwZWMudHZfc2VjIGlzIGEgdGltZV90IG5vdCB1bnNpZ25lZCBsb25nCkBAIC0xODksMTAgKzE4OSw3IEBACiAKIAl4dGltZS50dl9zZWMgPSB0di0+dHZfc2VjOwogCXh0aW1lLnR2X25zZWMgPSB0di0+dHZfbnNlYzsKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2xpYi9jb3B5X3BhZ2UuUyBiL2FyY2gvYXJtMjYvbGliL2NvcHlfcGFnZS5TCmluZGV4IDJkNzllZTEuLmM3NTExYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYvbGliL2NvcHlfcGFnZS5TCisrKyBiL2FyY2gvYXJtMjYvbGliL2NvcHlfcGFnZS5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAJCS50ZXh0CiAJCS5hbGlnbgk1CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2xpYi9jc3VtcGFydGlhbGNvcHl1c2VyLlMgYi9hcmNoL2FybTI2L2xpYi9jc3VtcGFydGlhbGNvcHl1c2VyLlMKaW5kZXggNWI4MjExOC4uMjYxZGQxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TCisrKyBiL2FyY2gvYXJtMjYvbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIAkJLnRleHQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9saWIvZ2V0dXNlci5TIGIvYXJjaC9hcm0yNi9saWIvZ2V0dXNlci5TCmluZGV4IGU2ZDU5YjMzLi4yYjFkZTdmIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2xpYi9nZXR1c2VyLlMKKysrIGIvYXJjaC9hcm0yNi9saWIvZ2V0dXNlci5TCkBAIC0yNiw3ICsyNiw3IEBACiAgKiBOb3RlIHRoYXQgQUREUl9MSU1JVCBpcyBlaXRoZXIgMCBvciAweGMwMDAwMDAwLgogICogTm90ZSBhbHNvIHRoYXQgaXQgaXMgaW50ZW5kZWQgdGhhdCBfX2dldF91c2VyX2JhZCBpcyBub3QgZ2xvYmFsLgogICovCi0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvbGliL3B1dHVzZXIuUyBiL2FyY2gvYXJtMjYvbGliL3B1dHVzZXIuUwppbmRleCA4NzU4OGNiLi40NmM3ZjE1IDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2xpYi9wdXR1c2VyLlMKKysrIGIvYXJjaC9hcm0yNi9saWIvcHV0dXNlci5TCkBAIC0yNiw3ICsyNiw3IEBACiAgKiBOb3RlIHRoYXQgQUREUl9MSU1JVCBpcyBlaXRoZXIgMCBvciAweGMwMDAwMDAwCiAgKiBOb3RlIGFsc28gdGhhdCBpdCBpcyBpbnRlbmRlZCB0aGF0IF9fcHV0X3VzZXJfYmFkIGlzIG5vdCBnbG9iYWwuCiAgKi8KLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9tbS9wcm9jLWZ1bmNzLlMgYi9hcmNoL2FybTI2L21tL3Byb2MtZnVuY3MuUwppbmRleCBjM2Q0Y2QzLi5mOWZjYTUyIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L21tL3Byb2MtZnVuY3MuUworKysgYi9hcmNoL2FybTI2L21tL3Byb2MtZnVuY3MuUwpAQCAtMTQsNyArMTQsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvbndmcGUvZW50cnkuUyBiL2FyY2gvYXJtMjYvbndmcGUvZW50cnkuUwppbmRleCA3ZDZkZmFhLi5lNjMxMjAwIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L253ZnBlL2VudHJ5LlMKKysrIGIvYXJjaC9hcm0yNi9ud2ZwZS9lbnRyeS5TCkBAIC0yMCw3ICsyMCw3IEBACiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCi0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIC8qIFRoaXMgaXMgdGhlIGtlcm5lbCdzIGVudHJ5IHBvaW50IGludG8gdGhlIGZsb2F0aW5nIHBvaW50IGVtdWxhdG9yLgogSXQgaXMgY2FsbGVkIGZyb20gdGhlIGtlcm5lbCB3aXRoIGNvZGUgc2ltaWxhciB0byB0aGlzOgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL0tjb25maWcuZGVidWcgYi9hcmNoL2NyaXMvS2NvbmZpZy5kZWJ1ZwppbmRleCBjZDcyMzI0Li4wYTFkNjJhIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL2NyaXMvS2NvbmZpZy5kZWJ1ZwpAQCAtNSwxMCArNSwxMyBAQAogCWJvb2wgIktlcm5lbCBwcm9maWxpbmcgc3VwcG9ydCIKIAogY29uZmlnIFNZU1RFTV9QUk9GSUxFUgotICAgICAgICBib29sICJTeXN0ZW0gcHJvZmlsaW5nIHN1cHBvcnQiCisJYm9vbCAiU3lzdGVtIHByb2ZpbGluZyBzdXBwb3J0IgorCitzb3VyY2UgImxpYi9LY29uZmlnLmRlYnVnIgogCiBjb25maWcgRVRSQVhfS0dEQgogCWJvb2wgIlVzZSBrZXJuZWwgR0RCIGRlYnVnZ2VyIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCiAJLS0taGVscC0tLQogCSAgVGhlIENSSVMgdmVyc2lvbiBvZiBnZGIgY2FuIGJlIHVzZWQgdG8gcmVtb3RlbHkgZGVidWcgYSBydW5uaW5nCiAJICBMaW51eCBrZXJuZWwgdmlhIHRoZSBzZXJpYWwgZGVidWcgcG9ydC4gIFByb3ZpZGVkIHlvdSBoYXZlIGdkYi1jcmlzCkBAIC0yMiwyNSArMjUsMTEgQEAKIAkgIHRoaXMgb3B0aW9uIGlzIHR1cm5lZCBvbiEKIAogCi1jb25maWcgREVCVUdfSU5GTwotICAgICAgICBib29sICJDb21waWxlIHRoZSBrZXJuZWwgd2l0aCBkZWJ1ZyBpbmZvIgotICAgICAgICBoZWxwCi0gICAgICAgICAgSWYgeW91IHNheSBZIGhlcmUgdGhlIHJlc3VsdGluZyBrZXJuZWwgaW1hZ2Ugd2lsbCBpbmNsdWRlCi0gICAgICAgICAgZGVidWdnaW5nIGluZm8gcmVzdWx0aW5nIGluIGEgbGFyZ2VyIGtlcm5lbCBpbWFnZS4KLSAgICAgICAgICBTYXkgWSBoZXJlIG9ubHkgaWYgeW91IHBsYW4gdG8gdXNlIGdkYiB0byBkZWJ1ZyB0aGUga2VybmVsLgotICAgICAgICAgIElmIHlvdSBkb24ndCBkZWJ1ZyB0aGUga2VybmVsLCB5b3UgY2FuIHNheSBOLgotCi1jb25maWcgRlJBTUVfUE9JTlRFUgotICAgICAgICBib29sICJDb21waWxlIHRoZSBrZXJuZWwgd2l0aCBmcmFtZSBwb2ludGVycyIKLSAgICAgICAgaGVscAotICAgICAgICAgIElmIHlvdSBzYXkgWSBoZXJlIHRoZSByZXN1bHRpbmcga2VybmVsIGltYWdlIHdpbGwgYmUgc2xpZ2h0bHkgbGFyZ2VyCi0gICAgICAgICAgYW5kIHNsb3dlciwgYnV0IGl0IHdpbGwgZ2l2ZSB2ZXJ5IHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICAgICAgICAgSWYgeW91IGRvbid0IGRlYnVnIHRoZSBrZXJuZWwsIHlvdSBjYW4gc2F5IE4sIGJ1dCB3ZSBtYXkgbm90IGJlIGFibGUKLSAgICAgICAgICB0byBzb2x2ZSBwcm9ibGVtcyB3aXRob3V0IGZyYW1lIHBvaW50ZXJzLgotCiBjb25maWcgREVCVUdfTk1JX09PUFMKLSAgICAgICBib29sICJOTUkgY2F1c2VzIG9vcHMgcHJpbnRvdXQiCi0gICAgICAgaGVscAotICAgICAgICAgSWYgdGhlIHN5c3RlbSBsb2NrcyB1cCB3aXRob3V0IGFueSBkZWJ1ZyBpbmZvcm1hdGlvbiB5b3UgY2FuIHNheSBZCi0gICAgICAgICBoZXJlIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gZHVtcCBhbiBPT1BTIHdpdGggYW4gZXh0ZXJuYWwgTk1JLgorCWJvb2wgIk5NSSBjYXVzZXMgb29wcyBwcmludG91dCIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIElmIHRoZSBzeXN0ZW0gbG9ja3MgdXAgd2l0aG91dCBhbnkgZGVidWcgaW5mb3JtYXRpb24geW91IGNhbiBzYXkgWQorCSAgaGVyZSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGR1bXAgYW4gT09QUyB3aXRoIGFuIGV4dGVybmFsIE5NSS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL01ha2VmaWxlIGIvYXJjaC9jcmlzL01ha2VmaWxlCmluZGV4IDkwY2E4NzMuLmEwMDA0M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9NYWtlZmlsZQorKysgYi9hcmNoL2NyaXMvTWFrZWZpbGUKQEAgLTEwNyw4ICsxMDcsNyBAQAogCXJtIC1mIHRpbWFnZSB2bWxpbnV4LmJpbiBkZWNvbXByZXNzLmJpbiByZXNjdWUuYmluIGNyYW1mcy5pbWcKIAlybSAtcmYgJChMRF9TQ1JJUFQpLnRtcAogCi1wcmVwYXJlOiAkKFNSQ19BUkNIKS8ubGlua3MgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKEFSQ0gpLy5hcmNoIFwKLQkgaW5jbHVkZS9hc20tJChBUkNIKS8kKFNBUkNIKS9vZmZzZXQuaAorcHJlcGFyZTogJChTUkNfQVJDSCkvLmxpbmtzICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tJChBUkNIKS8uYXJjaAogCiAjIENyZWF0ZSBzb21lIGxpbmtzIHRvIG1ha2UgYWxsIHRvb2xzIGhhcHB5CiAkKFNSQ19BUkNIKS8ubGlua3M6CkBAIC0xMjAsNiArMTE5LDcgQEAKIAlAbG4gLXNmbiAkKFNSQ19BUkNIKS8kKFNBUkNIKS9saWIgJChTUkNfQVJDSCkvbGliCiAJQGxuIC1zZm4gJChTUkNfQVJDSCkvJChTQVJDSCkgJChTUkNfQVJDSCkvYXJjaAogCUBsbiAtc2ZuICQoU1JDX0FSQ0gpLyQoU0FSQ0gpL3ZtbGludXgubGRzLlMgJChTUkNfQVJDSCkva2VybmVsL3ZtbGludXgubGRzLlMKKwlAbG4gLXNmbiAkKFNSQ19BUkNIKS8kKFNBUkNIKS9hc20tb2Zmc2V0cy5jICQoU1JDX0FSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5jCiAJQHRvdWNoICRACiAKICMgQ3JlYXRlIGxpbmsgdG8gc3ViIGFyY2ggaW5jbHVkZXMKQEAgLTEyOCw5ICsxMjgsMyBAQAogCUBybSAtZiBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FyY2gKIAlAbG4gLXNmICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tJChBUkNIKS8kKFNBUkNIKSAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoQVJDSCkvYXJjaAogCUB0b3VjaCAkQAotCi1hcmNoLyQoQVJDSCkvJChTQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLQkJCQkJaW5jbHVkZS9jb25maWcvTUFSS0VSCi0KLWluY2x1ZGUvYXNtLSQoQVJDSCkvJChTQVJDSCkvb2Zmc2V0Lmg6IGFyY2gvJChBUkNIKS8kKFNBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvZW50cnkuUwppbmRleCBjMDE2M2JmLi5jODA4MDA1IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9lbnRyeS5TCkBAIC0yNzAsNyArMjcwLDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9zdl9hZGRyX2FnLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3RpbWUuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvdGltZS5jCmluZGV4IDZiN2I0ZTAuLmRjM2RmZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvdGltZS5jCkBAIC0yNDAsNyArMjQwLDcgQEAKIAkgKiBUaGUgZGl2aXNpb24gaGVyZSBpcyBub3QgdGltZSBjcml0aWNhbCBzaW5jZSBpdCB3aWxsIHJ1biBvbmNlIGluIAogCSAqIDExIG1pbnV0ZXMKIAkgKi8KLQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorCWlmIChudHBfc3luY2VkKCkgJiYKIAkgICAgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPj0gNTAwMDAwIC0gKHRpY2tfbnNlYyAvIDEwMDApIC8gMiAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApIDw9IDUwMDAwMCArICh0aWNrX25zZWMgLyAxMDAwKSAvIDIpIHsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvZW50cnkuUyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvZW50cnkuUwppbmRleCBhOGVkNTVlLi4zYmQ4NTAzIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9lbnRyeS5TCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL2FzbS9yZWdfbWFwX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9hc20vaW50cl92ZWN0X2RlZnNfYXNtLmg+CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMva2VybmVsL3RpbWUuYyBiL2FyY2gvY3Jpcy9rZXJuZWwvdGltZS5jCmluZGV4IGZhMmQ0MzIuLmEyZDk5YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvY3Jpcy9rZXJuZWwvdGltZS5jCkBAIC0xMTQsMTAgKzExNCw3IEBACiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOwogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOwogCi0JdGltZV9hZGp1c3QgPSAwOwkJLyogc3RvcCBhY3RpdmUgYWRqdGltZSgpICovCi0JdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJbnRwX2NsZWFyKCk7CiAJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CiAJY2xvY2tfd2FzX3NldCgpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL2Zydi9rZXJuZWwvYXNtLW9mZnNldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI2MzExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9mcnYva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTAsMCArMSBAQAorLyogRHVtbXkgYXNtLW9mZnNldHMuYyBmaWxlLiBSZXF1aXJlZCBieSBrYnVpbGQgYW5kIHJlYWR5IHRvIGJlIHVzZWQgLSBoaW50ISAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL2Zydl9rc3ltcy5jIGIvYXJjaC9mcnYva2VybmVsL2Zydl9rc3ltcy5jCmluZGV4IDYyY2ZiZDkuLjFhNzZkNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9mcnZfa3N5bXMuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvZnJ2X2tzeW1zLmMKQEAgLTcxLDcgKzcxLDYgQEAKIEVYUE9SVF9TWU1CT0wobWVtY21wKTsKIEVYUE9SVF9TWU1CT0wobWVtc2Nhbik7CiBFWFBPUlRfU1lNQk9MKG1lbW1vdmUpOwotRVhQT1JUX1NZTUJPTChzdHJ0b2spOwogCiBFWFBPUlRfU1lNQk9MKGdldF93Y2hhbik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC90aW1lLmMgYi9hcmNoL2Zydi9rZXJuZWwvdGltZS5jCmluZGV4IDA3NWRiNjYuLjhkNjU1OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3RpbWUuYwpAQCAtODUsNyArODUsNyBAQAogCSAqIENNT1MgY2xvY2sgYWNjb3JkaW5nbHkgZXZlcnkgfjExIG1pbnV0ZXMuIFNldF9ydGNfbW1zcygpIGhhcyB0byBiZQogCSAqIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byA1MDAgbXMgYmVmb3JlIHRoZSBuZXcgc2Vjb25kIHN0YXJ0cy4KIAkgKi8KLQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorCWlmIChudHBfc3luY2VkKCkgJiYKIAkgICAgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPj0gNTAwMDAwIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA8PSA1MDAwMDAgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMgpAQCAtMjE2LDEwICsyMTYsNyBAQAogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ4dGltZSwgc2VjLCBuc2VjKTsKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsIHd0bV9zZWMsIHd0bV9uc2VjKTsKIAotCXRpbWVfYWRqdXN0ID0gMDsJCS8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLwotCXRpbWVfc3RhdHVzIHw9IFNUQV9VTlNZTkM7Ci0JdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKLQl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworCW50cF9jbGVhcigpOwogCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOwogCWNsb2NrX3dhc19zZXQoKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvTWFrZWZpbGUgYi9hcmNoL2g4MzAwL01ha2VmaWxlCmluZGV4IGM5YjgwY2YuLjQwYjNmNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvTWFrZWZpbGUKKysrIGIvYXJjaC9oODMwMC9NYWtlZmlsZQpAQCAtNjEsMTIgKzYxLDYgQEAKIGFyY2hjbGVhbjoKIAkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKGJvb3QpCiAKLXByZXBhcmU6IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtLW9mZnNldHMuaAotCi1pbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbS1vZmZzZXRzLmg6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucyBcCi0JCQkJICAgaW5jbHVkZS9hc20gaW5jbHVkZS9saW51eC92ZXJzaW9uLmgKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCi0KIHZtbGludXguc3JlYyB2bWxpbnV4LmJpbjogdm1saW51eAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgJChib290KS8kQAogCkBAIC03NCw1ICs2OCwzIEBACiAgIGVjaG8gICd2bWxpbnV4LmJpbiAgLSBDcmVhdGUgcmF3IGJpbmFyeScKICAgZWNobyAgJ3ZtbGludXguc3JlYyAtIENyZWF0ZSBzcmVjIGJpbmFyeScKIGVuZGVmCi0KLUNMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtLW9mZnNldHMuaApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvdGltZS5jIGIvYXJjaC9oODMwMC9rZXJuZWwvdGltZS5jCmluZGV4IDhhNjAwMjEuLmFmOGM1ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC90aW1lLmMKQEAgLTExNiwxMCArMTE2LDcgQEAKIAogCXh0aW1lLnR2X3NlYyA9IHR2LT50dl9zZWM7CiAJeHRpbWUudHZfbnNlYyA9IHR2LT50dl9uc2VjOwotCXRpbWVfYWRqdXN0ID0gMDsJCS8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLwotCXRpbWVfc3RhdHVzIHw9IFNUQV9VTlNZTkM7Ci0JdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKLQl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworCW50cF9jbGVhcigpOwogCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOwogCWNsb2NrX3dhc19zZXQoKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnIGIvYXJjaC9pMzg2L0tjb25maWcKaW5kZXggNjE5ZDg0My4uYjIyZjAwMyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L0tjb25maWcKKysrIGIvYXJjaC9pMzg2L0tjb25maWcKQEAgLTE0LDYgKzE0LDEwIEBACiAJICA0ODYsIDU4NiwgUGVudGl1bXMsIGFuZCB2YXJpb3VzIGluc3RydWN0aW9uLXNldC1jb21wYXRpYmxlIGNoaXBzIGJ5CiAJICBBTUQsIEN5cml4LCBhbmQgb3RoZXJzLgogCitjb25maWcgU0VNQVBIT1JFX1NMRUVQRVJTCisJYm9vbAorCWRlZmF1bHQgeQorCiBjb25maWcgTU1VCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtMzMsNiArMzcsMTAgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQworCWJvb2wKKwlkZWZhdWx0IHkKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIG1lbnUgIlByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcyIKQEAgLTc1NCw2ICs3NjIsNyBAQAogCWRlcGVuZHMgb24gU01QICYmIEhJR0hNRU02NEcgJiYgKFg4Nl9OVU1BUSB8fCBYODZfR0VORVJJQ0FSQ0ggfHwgKFg4Nl9TVU1NSVQgJiYgQUNQSSkpCiAJZGVmYXVsdCBuIGlmIFg4Nl9QQwogCWRlZmF1bHQgeSBpZiAoWDg2X05VTUFRIHx8IFg4Nl9TVU1NSVQpCisJc2VsZWN0IFNQQVJTRU1FTV9TVEFUSUMKIAogIyBOZWVkIGNvbW1lbnRzIHRvIGhlbHAgdGhlIGhhcGxlc3MgdXNlciB0cnlpbmcgdG8gdHVybiBvbiBOVU1BIHN1cHBvcnQKIGNvbW1lbnQgIk5VTUEgKE5VTUEtUSkgcmVxdWlyZXMgU01QLCA2NEdCIGhpZ2htZW0gc3VwcG9ydCIKQEAgLTEyMDMsNyArMTIxMiw2IEBACiBjb25maWcgUENJX01NQ09ORklHCiAJYm9vbAogCWRlcGVuZHMgb24gUENJICYmIEFDUEkgJiYgKFBDSV9HT01NQ09ORklHIHx8IFBDSV9HT0FOWSkKLQlzZWxlY3QgQUNQSV9CT09UCiAJZGVmYXVsdCB5CiAKIHNvdXJjZSAiZHJpdmVycy9wY2kvcGNpZS9LY29uZmlnIgpAQCAtMTMxMyw2ICsxMzIxLDExIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgR0VORVJJQ19QRU5ESU5HX0lSUQorCWJvb2wKKwlkZXBlbmRzIG9uIEdFTkVSSUNfSEFSRElSUVMgJiYgU01QCisJZGVmYXVsdCB5CisKIGNvbmZpZyBYODZfU01QCiAJYm9vbAogCWRlcGVuZHMgb24gU01QICYmICFYODZfVk9ZQUdFUgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L01ha2VmaWxlIGIvYXJjaC9pMzg2L01ha2VmaWxlCmluZGV4IGJmN2M5YmEuLjA5OTUxOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYvTWFrZWZpbGUKQEAgLTE1NiwxNSArMTU2LDYgQEAKIGluc3RhbGwga2VybmVsX2luc3RhbGw6CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBCT09USU1BR0U9JChLQlVJTERfSU1BR0UpIGluc3RhbGwKIAotcHJlcGFyZTogaW5jbHVkZS9hc20tJChBUkNIKS9hc21fb2Zmc2V0cy5oCi1DTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbV9vZmZzZXRzLmgKLQotYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBcCi0JCQkJICAgaW5jbHVkZS9jb25maWcvTUFSS0VSCi0KLWluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtX29mZnNldHMuaDogYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zCi0JJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXRzKQotCiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9YXJjaC9pMzg2L2Jvb3QKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUyBiL2FyY2gvaTM4Ni9ib290L3NldHVwLlMKaW5kZXggOGNiNDIwZi4uY2E2NjhkOSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUworKysgYi9hcmNoL2kzODYvYm9vdC9zZXR1cC5TCkBAIC04Miw3ICs4Miw3IEBACiAjIFRoaXMgaXMgdGhlIHNldHVwIGhlYWRlciwgYW5kIGl0IG11c3Qgc3RhcnQgYXQgJWNzOjIgKG9sZCAweDkwMjA6MikKIAogCQkuYXNjaWkJIkhkclMiCQkjIGhlYWRlciBzaWduYXR1cmUKLQkJLndvcmQJMHgwMjAzCQkjIGhlYWRlciB2ZXJzaW9uIG51bWJlciAoPj0gMHgwMTA1KQorCQkud29yZAkweDAyMDQJCSMgaGVhZGVyIHZlcnNpb24gbnVtYmVyICg+PSAweDAxMDUpCiAJCQkJCSMgb3IgZWxzZSBvbGQgbG9hZGxpbi0xLjUgd2lsbCBmYWlsKQogcmVhbG1vZGVfc3d0Y2g6CS53b3JkCTAsIDAJCSMgZGVmYXVsdF9zd2l0Y2gsIFNFVFVQU0VHCiBzdGFydF9zeXNfc2VnOgkud29yZAlTWVNTRUcKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L3Rvb2xzL2J1aWxkLmMgYi9hcmNoL2kzODYvYm9vdC90b29scy9idWlsZC5jCmluZGV4IDY4MzVmNmQuLjA1Nzk4NDEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9ib290L3Rvb2xzL2J1aWxkLmMKKysrIGIvYXJjaC9pMzg2L2Jvb3QvdG9vbHMvYnVpbGQuYwpAQCAtMTc3LDcgKzE3Nyw5IEBACiAJCWRpZSgiT3V0cHV0OiBzZWVrIGZhaWxlZCIpOwogCWJ1ZlswXSA9IChzeXNfc2l6ZSAmIDB4ZmYpOwogCWJ1ZlsxXSA9ICgoc3lzX3NpemUgPj4gOCkgJiAweGZmKTsKLQlpZiAod3JpdGUoMSwgYnVmLCAyKSAhPSAyKQorCWJ1ZlsyXSA9ICgoc3lzX3NpemUgPj4gMTYpICYgMHhmZik7CisJYnVmWzNdID0gKChzeXNfc2l6ZSA+PiAyNCkgJiAweGZmKTsKKwlpZiAod3JpdGUoMSwgYnVmLCA0KSAhPSA0KQogCQlkaWUoIldyaXRlIG9mIGltYWdlIGxlbmd0aCBmYWlsZWQiKTsKIAogCXJldHVybiAwOwkJCQkJICAgIC8qIEV2ZXJ5dGhpbmcgaXMgT0sgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L3ZpZGVvLlMgYi9hcmNoL2kzODYvYm9vdC92aWRlby5TCmluZGV4IDA1ODc0NzcuLjkyZjY2OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9ib290L3ZpZGVvLlMKKysrIGIvYXJjaC9pMzg2L2Jvb3QvdmlkZW8uUwpAQCAtOTcsNiArOTcsNyBAQAogI2RlZmluZSBQQVJBTV9WRVNBUE1fT0ZGCTB4MzAKICNkZWZpbmUgUEFSQU1fTEZCX1BBR0VTCQkweDMyCiAjZGVmaW5lIFBBUkFNX1ZFU0FfQVRUUklCCTB4MzQKKyNkZWZpbmUgUEFSQU1fQ0FQQUJJTElUSUVTICAgICAgMHgzNgogCiAvKiBEZWZpbmUgRE9fU1RPUkUgYWNjb3JkaW5nIHRvIENPTkZJR19WSURFT19SRVRBSU4gKi8KICNpZmRlZiBDT05GSUdfVklERU9fUkVUQUlOCkBAIC0yMzMsNiArMjM0LDEwIEBACiAJbW92dwkxOCglZGkpLCAlYXgKIAltb3ZsCSVlYXgsICVmczooUEFSQU1fTEZCX1NJWkUpCiAKKyMgc3RvcmUgbW9kZSBjYXBhYmlsaXRpZXMKKwltb3ZsICAgIDEwKCVkaSksICVlYXgKKwltb3ZsICAgICVlYXgsICVmczooUEFSQU1fQ0FQQUJJTElUSUVTKQorCiAjIHN3aXRjaGluZyB0aGUgREFDIHRvIDgtYml0IGlzIGZvciA8PSA4IGJwcCBvbmx5CiAJbW92dwklZnM6KFBBUkFNX0xGQl9ERVBUSCksICVheAogCWNtcHcJJDgsICVheApAQCAtMTk0NCw3ICsxOTQ5LDcgQEAKIAltb3Z3CSQweDRmMTUsICVheCAgICAgICAgICAgICAgICAgICAgIyBkbyBWQkUvRERDCiAJbW92dwkkMHgwMSwgJWJ4CiAJbW92dwkkMHgwMCwgJWN4Ci0JbW92dyAgICAkMHgwMSwgJWR4CisJbW92dyAgICAkMHgwMCwgJWR4CiAJbW92dwkkMHgxNDAsICVkaQogCWludAkkMHgxMAogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvZGVmY29uZmlnIGIvYXJjaC9pMzg2L2RlZmNvbmZpZwppbmRleCBjYTA3Yjk1Li42YTQzMWI5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvZGVmY29uZmlnCisrKyBiL2FyY2gvaTM4Ni9kZWZjb25maWcKQEAgLTEzMSw4ICsxMzEsNiBAQAogIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKICMKIENPTkZJR19BQ1BJPXkKLUNPTkZJR19BQ1BJX0JPT1Q9eQotQ09ORklHX0FDUElfSU5URVJQUkVURVI9eQogQ09ORklHX0FDUElfU0xFRVA9eQogQ09ORklHX0FDUElfU0xFRVBfUFJPQ19GUz15CiBDT05GSUdfQUNQSV9BQz15CkBAIC0xNDQsMTAgKzE0Miw4IEBACiAjIENPTkZJR19BQ1BJX0FTVVMgaXMgbm90IHNldAogIyBDT05GSUdfQUNQSV9UT1NISUJBIGlzIG5vdCBzZXQKICMgQ09ORklHX0FDUElfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0FDUElfQlVTPXkKIENPTkZJR19BQ1BJX0VDPXkKIENPTkZJR19BQ1BJX1BPV0VSPXkKLUNPTkZJR19BQ1BJX1BDST15CiBDT05GSUdfQUNQSV9TWVNURU09eQogIyBDT05GSUdfWDg2X1BNX1RJTUVSIGlzIG5vdCBzZXQKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNGNjODNiMy4uZjEwZGUwZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCkBAIC03LDExICs3LDExIEBACiBvYmoteQk6PSBwcm9jZXNzLm8gc2VtYXBob3JlLm8gc2lnbmFsLm8gZW50cnkubyB0cmFwcy5vIGlycS5vIHZtODYubyBcCiAJCXB0cmFjZS5vIHRpbWUubyBpb3BvcnQubyBsZHQubyBzZXR1cC5vIGk4MjU5Lm8gc3lzX2kzODYubyBcCiAJCXBjaS1kbWEubyBpMzg2X2tzeW1zLm8gaTM4Ny5vIGRtaV9zY2FuLm8gYm9vdGZsYWcubyBcCi0JCWRvdWJsZWZhdWx0Lm8gcXVpcmtzLm8KKwkJZG91YmxlZmF1bHQubyBxdWlya3MubyBpODIzNy5vCiAKIG9iai15CQkJCSs9IGNwdS8KIG9iai15CQkJCSs9IHRpbWVycy8KLW9iai0kKENPTkZJR19BQ1BJX0JPT1QpCQkrPSBhY3BpLworb2JqLSQoQ09ORklHX0FDUEkpCQkrPSBhY3BpLwogb2JqLSQoQ09ORklHX1g4Nl9CSU9TX1JFQk9PVCkJKz0gcmVib290Lm8KIG9iai0kKENPTkZJR19NQ0EpCQkrPSBtY2Eubwogb2JqLSQoQ09ORklHX1g4Nl9NU1IpCQkrPSBtc3IubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL01ha2VmaWxlCmluZGV4IDVlMjkxYTIuLjI2N2NhNDggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvTWFrZWZpbGUKQEAgLTEsNCArMSw0IEBACi1vYmotJChDT05GSUdfQUNQSV9CT09UKQkJOj0gYm9vdC5vCitvYmoteQkJCQk6PSBib290Lm8KIG9iai0kKENPTkZJR19YODZfSU9fQVBJQykJKz0gZWFybHlxdWlyay5vCiBvYmotJChDT05GSUdfQUNQSV9TTEVFUCkJKz0gc2xlZXAubyB3YWtldXAubwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYwppbmRleCBiNzgwOGE4Li5hNjMzNTFjIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTQwLDE5ICs0MCwyNSBAQAogCiAjaWZkZWYJQ09ORklHX1g4Nl82NAogCi1zdGF0aWMgaW5saW5lIHZvaWQgIGFjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGFjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCit7Cit9CiBleHRlcm4gdm9pZCBfX2luaXQgY2x1c3RlcmVkX2FwaWNfY2hlY2sodm9pZCk7Ci1zdGF0aWMgaW5saW5lIGludCBpb2FwaWNfc2V0dXBfZGlzYWJsZWQodm9pZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgaW9hcGljX3NldHVwX2Rpc2FibGVkKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KIAotI2Vsc2UJLyogWDg2ICovCisjZWxzZQkJCQkvKiBYODYgKi8KIAogI2lmZGVmCUNPTkZJR19YODZfTE9DQUxfQVBJQwogI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgogI2luY2x1ZGUgPG1hY2hfbXBwYXJzZS5oPgotI2VuZGlmCS8qIENPTkZJR19YODZfTE9DQUxfQVBJQyAqLworI2VuZGlmCQkJCS8qIENPTkZJR19YODZfTE9DQUxfQVBJQyAqLwogCi0jZW5kaWYJLyogWDg2ICovCisjZW5kaWYJCQkJLyogWDg2ICovCiAKICNkZWZpbmUgQkFEX01BRFRfRU5UUlkoZW50cnksIGVuZCkgKAkJCQkJICAgIFwKIAkJKCFlbnRyeSkgfHwgKHVuc2lnbmVkIGxvbmcpZW50cnkgKyBzaXplb2YoKmVudHJ5KSA+IGVuZCB8fCAgXApAQCAtNjAsMTMgKzY2LDggQEAKIAogI2RlZmluZSBQUkVGSVgJCQkiQUNQSTogIgogCi0jaWZkZWYgQ09ORklHX0FDUElfUENJCiBpbnQgYWNwaV9ub2lycSBfX2luaXRkYXRhOwkvKiBza2lwIEFDUEkgSVJRIGluaXRpYWxpemF0aW9uICovCi1pbnQgYWNwaV9wY2lfZGlzYWJsZWQgX19pbml0ZGF0YTsgLyogc2tpcCBBQ1BJIFBDSSBzY2FuIGFuZCBJUlEgaW5pdGlhbGl6YXRpb24gKi8KLSNlbHNlCi1pbnQgYWNwaV9ub2lycSBfX2luaXRkYXRhID0gMTsKLWludCBhY3BpX3BjaV9kaXNhYmxlZCBfX2luaXRkYXRhID0gMTsKLSNlbmRpZgoraW50IGFjcGlfcGNpX2Rpc2FibGVkIF9faW5pdGRhdGE7CS8qIHNraXAgQUNQSSBQQ0kgc2NhbiBhbmQgSVJRIGluaXRpYWxpemF0aW9uICovCiBpbnQgYWNwaV9odCBfX2luaXRkYXRhID0gMTsJLyogZW5hYmxlIEhUICovCiAKIGludCBhY3BpX2xhcGljOwpAQCAtODgsNyArODksNyBAQAogCiAjZGVmaW5lIE1BWF9NQURUX0VOVFJJRVMJMjU2CiB1OCB4ODZfYWNwaWlkX3RvX2FwaWNpZFtNQVhfTUFEVF9FTlRSSUVTXSA9Ci0JCQl7IFswIC4uLiBNQVhfTUFEVF9FTlRSSUVTLTFdID0gMHhmZiB9OworICAgIHtbMCAuLi4gTUFYX01BRFRfRU5UUklFUyAtIDFdID0gMHhmZiB9OwogRVhQT1JUX1NZTUJPTCh4ODZfYWNwaWlkX3RvX2FwaWNpZCk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05OSw3ICsxMDAsNyBAQAogICogVGhlIGRlZmF1bHQgaW50ZXJydXB0IHJvdXRpbmcgbW9kZWwgaXMgUElDICg4MjU5KS4gIFRoaXMgZ2V0cwogICogb3ZlcnJpZGVuIGlmIElPQVBJQ3MgYXJlIGVudW1lcmF0ZWQgKGJlbG93KS4KICAqLwotZW51bSBhY3BpX2lycV9tb2RlbF9pZAkJYWNwaV9pcnFfbW9kZWwgPSBBQ1BJX0lSUV9NT0RFTF9QSUM7CitlbnVtIGFjcGlfaXJxX21vZGVsX2lkIGFjcGlfaXJxX21vZGVsID0gQUNQSV9JUlFfTU9ERUxfUElDOwogCiAjaWZkZWYJQ09ORklHX1g4Nl82NAogCkBAIC0xMDcsNyArMTA4LDcgQEAKIGNoYXIgKl9fYWNwaV9tYXBfdGFibGUodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSkKLQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIE5VTEw7CiAKIAlpZiAocGh5c19hZGRyIDwgKGVuZF9wZm5fbWFwIDw8IFBBR0VfU0hJRlQpKQogCQlyZXR1cm4gX192YShwaHlzX2FkZHIpOwpAQCAtMTM0LDggKzEzNSw4IEBACiAJdW5zaWduZWQgbG9uZyBiYXNlLCBvZmZzZXQsIG1hcHBlZF9zaXplOwogCWludCBpZHg7CiAKLQlpZiAocGh5cyArIHNpemUgPCA4KjEwMjQqMTAyNCkgCi0JCXJldHVybiBfX3ZhKHBoeXMpOyAKKwlpZiAocGh5cyArIHNpemUgPCA4ICogMTAyNCAqIDEwMjQpCisJCXJldHVybiBfX3ZhKHBoeXMpOwogCiAJb2Zmc2V0ID0gcGh5cyAmIChQQUdFX1NJWkUgLSAxKTsKIAltYXBwZWRfc2l6ZSA9IFBBR0VfU0laRSAtIG9mZnNldDsKQEAgLTE1NCw3ICsxNTUsNyBAQAogCQltYXBwZWRfc2l6ZSArPSBQQUdFX1NJWkU7CiAJfQogCi0JcmV0dXJuICgodW5zaWduZWQgY2hhciAqKSBiYXNlICsgb2Zmc2V0KTsKKwlyZXR1cm4gKCh1bnNpZ25lZCBjaGFyICopYmFzZSArIG9mZnNldCk7CiB9CiAjZW5kaWYKIApAQCAtMTcyLDcgKzE3Myw3IEBACiAJaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWNmZyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnICopIF9fYWNwaV9tYXBfdGFibGUocGh5c19hZGRyLCBzaXplKTsKKwltY2ZnID0gKHN0cnVjdCBhY3BpX3RhYmxlX21jZmcgKilfX2FjcGlfbWFwX3RhYmxlKHBoeXNfYWRkciwgc2l6ZSk7CiAJaWYgKCFtY2ZnKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIE1DRkdcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTIwOSwyMCArMjEwLDE3IEBACiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUENJX01NQ09ORklHICovCisjZW5kaWYJCQkJLyogQ09ORklHX1BDSV9NTUNPTkZJRyAqLwogCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9tYWR0ICgKLQl1bnNpZ25lZCBsb25nCQlwaHlzX2FkZHIsCi0JdW5zaWduZWQgbG9uZwkJc2l6ZSkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2VfbWFkdCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX21hZHQJKm1hZHQgPSBOVUxMOworCXN0cnVjdCBhY3BpX3RhYmxlX21hZHQgKm1hZHQgPSBOVUxMOwogCiAJaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWFkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICopIF9fYWNwaV9tYXBfdGFibGUocGh5c19hZGRyLCBzaXplKTsKKwltYWR0ID0gKHN0cnVjdCBhY3BpX3RhYmxlX21hZHQgKilfX2FjcGlfbWFwX3RhYmxlKHBoeXNfYWRkciwgc2l6ZSk7CiAJaWYgKCFtYWR0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIE1BRFRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTIzMiwyMiArMjMwLDIwIEBACiAJCWFjcGlfbGFwaWNfYWRkciA9ICh1NjQpIG1hZHQtPmxhcGljX2FkZHJlc3M7CiAKIAkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJMb2NhbCBBUElDIGFkZHJlc3MgMHglMDh4XG4iLAotCQkJbWFkdC0+bGFwaWNfYWRkcmVzcyk7CisJCSAgICAgICBtYWR0LT5sYXBpY19hZGRyZXNzKTsKIAl9CiAKIAlhY3BpX21hZHRfb2VtX2NoZWNrKG1hZHQtPmhlYWRlci5vZW1faWQsIG1hZHQtPmhlYWRlci5vZW1fdGFibGVfaWQpOwotCQorCiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfbGFwaWMgKAotCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQorYWNwaV9wYXJzZV9sYXBpYyhhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfbGFwaWMJKnByb2Nlc3NvciA9IE5VTEw7CisJc3RydWN0IGFjcGlfdGFibGVfbGFwaWMgKnByb2Nlc3NvciA9IE5VTEw7CiAKLQlwcm9jZXNzb3IgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWMqKSBoZWFkZXI7CisJcHJvY2Vzc29yID0gKHN0cnVjdCBhY3BpX3RhYmxlX2xhcGljICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKHByb2Nlc3NvciwgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNjAsMjAgKzI1NiwxOSBAQAogCiAJeDg2X2FjcGlpZF90b19hcGljaWRbcHJvY2Vzc29yLT5hY3BpX2lkXSA9IHByb2Nlc3Nvci0+aWQ7CiAKLQltcF9yZWdpc3Rlcl9sYXBpYyAoCi0JCXByb2Nlc3Nvci0+aWQsCQkJCQkgICAvKiBBUElDIElEICovCi0JCXByb2Nlc3Nvci0+ZmxhZ3MuZW5hYmxlZCk7CQkJICAvKiBFbmFibGVkPyAqLworCW1wX3JlZ2lzdGVyX2xhcGljKHByb2Nlc3Nvci0+aWQsCS8qIEFQSUMgSUQgKi8KKwkJCSAgcHJvY2Vzc29yLT5mbGFncy5lbmFibGVkKTsJLyogRW5hYmxlZD8gKi8KIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9sYXBpY19hZGRyX292ciAoCi0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLAorCQkJICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19hZGRyX292ciAqbGFwaWNfYWRkcl9vdnIgPSBOVUxMOwogCi0JbGFwaWNfYWRkcl9vdnIgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfYWRkcl9vdnIqKSBoZWFkZXI7CisJbGFwaWNfYWRkcl9vdnIgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfYWRkcl9vdnIgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkobGFwaWNfYWRkcl9vdnIsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjg0LDEyICsyNzksMTEgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfbGFwaWNfbm1pICgKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfbGFwaWNfbm1pKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19ubWkgKmxhcGljX25taSA9IE5VTEw7CiAKLQlsYXBpY19ubWkgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfbm1pKikgaGVhZGVyOworCWxhcGljX25taSA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19ubWkgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkobGFwaWNfbm1pLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMwMiwzNyArMjk2LDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNlbmRpZgkJCQkvKkNPTkZJR19YODZfTE9DQUxfQVBJQyAqLwogCi0jZW5kaWYgLypDT05GSUdfWDg2X0xPQ0FMX0FQSUMqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpCisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX2lvYXBpYyAoCi0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX2lvYXBpYyhhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfaW9hcGljICppb2FwaWMgPSBOVUxMOwogCi0JaW9hcGljID0gKHN0cnVjdCBhY3BpX3RhYmxlX2lvYXBpYyopIGhlYWRlcjsKKwlpb2FwaWMgPSAoc3RydWN0IGFjcGlfdGFibGVfaW9hcGljICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKGlvYXBpYywgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0gCisKIAlhY3BpX3RhYmxlX3ByaW50X21hZHRfZW50cnkoaGVhZGVyKTsKIAotCW1wX3JlZ2lzdGVyX2lvYXBpYyAoCi0JCWlvYXBpYy0+aWQsCi0JCWlvYXBpYy0+YWRkcmVzcywKLQkJaW9hcGljLT5nbG9iYWxfaXJxX2Jhc2UpOwotIAorCW1wX3JlZ2lzdGVyX2lvYXBpYyhpb2FwaWMtPmlkLAorCQkJICAgaW9hcGljLT5hZGRyZXNzLCBpb2FwaWMtPmdsb2JhbF9pcnFfYmFzZSk7CisKIAlyZXR1cm4gMDsKIH0KIAogLyoKICAqIFBhcnNlIEludGVycnVwdCBTb3VyY2UgT3ZlcnJpZGUgZm9yIHRoZSBBQ1BJIFNDSQogICovCi1zdGF0aWMgdm9pZAotYWNwaV9zY2lfaW9hcGljX3NldHVwKHUzMiBnc2ksIHUxNiBwb2xhcml0eSwgdTE2IHRyaWdnZXIpCitzdGF0aWMgdm9pZCBhY3BpX3NjaV9pb2FwaWNfc2V0dXAodTMyIGdzaSwgdTE2IHBvbGFyaXR5LCB1MTYgdHJpZ2dlcikKIHsKIAlpZiAodHJpZ2dlciA9PSAwKQkvKiBjb21wYXRpYmxlIFNDSSB0cmlnZ2VyIGlzIGxldmVsICovCiAJCXRyaWdnZXIgPSAzOwpAQCAtMzQ4LDcgKzMzNyw3IEBACiAJCXBvbGFyaXR5ID0gYWNwaV9zY2lfZmxhZ3MucG9sYXJpdHk7CiAKIAkvKgotIAkgKiBtcF9jb25maWdfYWNwaV9sZWdhY3lfaXJxcygpIGFscmVhZHkgc2V0dXAgSVJRcyA8IDE2CisJICogbXBfY29uZmlnX2FjcGlfbGVnYWN5X2lycXMoKSBhbHJlYWR5IHNldHVwIElSUXMgPCAxNgogCSAqIElmIEdTSSBpcyA8IDE2LCB0aGlzIHdpbGwgdXBkYXRlIGl0cyBmbGFncywKIAkgKiBlbHNlIGl0IHdpbGwgY3JlYXRlIGEgbmV3IG1wX2lycXNbXSBlbnRyeS4KIAkgKi8KQEAgLTM2MywxMiArMzUyLDEyIEBACiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX2ludF9zcmNfb3ZyICgKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfaW50X3NyY19vdnIoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9pbnRfc3JjX292ciAqaW50c3JjID0gTlVMTDsKIAotCWludHNyYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9pbnRfc3JjX292ciopIGhlYWRlcjsKKwlpbnRzcmMgPSAoc3RydWN0IGFjcGlfdGFibGVfaW50X3NyY19vdnIgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkoaW50c3JjLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM3NywzMyArMzY2LDMwIEBACiAKIAlpZiAoaW50c3JjLT5idXNfaXJxID09IGFjcGlfZmFkdC5zY2lfaW50KSB7CiAJCWFjcGlfc2NpX2lvYXBpY19zZXR1cChpbnRzcmMtPmdsb2JhbF9pcnEsCi0JCQlpbnRzcmMtPmZsYWdzLnBvbGFyaXR5LCBpbnRzcmMtPmZsYWdzLnRyaWdnZXIpOworCQkJCSAgICAgIGludHNyYy0+ZmxhZ3MucG9sYXJpdHksCisJCQkJICAgICAgaW50c3JjLT5mbGFncy50cmlnZ2VyKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKGFjcGlfc2tpcF90aW1lcl9vdmVycmlkZSAmJgotCQlpbnRzcmMtPmJ1c19pcnEgPT0gMCAmJiBpbnRzcmMtPmdsb2JhbF9pcnEgPT0gMikgewotCQkJcHJpbnRrKFBSRUZJWCAiQklPUyBJUlEwIHBpbjIgb3ZlcnJpZGUgaWdub3JlZC5cbiIpOwotCQkJcmV0dXJuIDA7CisJICAgIGludHNyYy0+YnVzX2lycSA9PSAwICYmIGludHNyYy0+Z2xvYmFsX2lycSA9PSAyKSB7CisJCXByaW50ayhQUkVGSVggIkJJT1MgSVJRMCBwaW4yIG92ZXJyaWRlIGlnbm9yZWQuXG4iKTsKKwkJcmV0dXJuIDA7CiAJfQogCi0JbXBfb3ZlcnJpZGVfbGVnYWN5X2lycSAoCi0JCWludHNyYy0+YnVzX2lycSwKLQkJaW50c3JjLT5mbGFncy5wb2xhcml0eSwKLQkJaW50c3JjLT5mbGFncy50cmlnZ2VyLAotCQlpbnRzcmMtPmdsb2JhbF9pcnEpOworCW1wX292ZXJyaWRlX2xlZ2FjeV9pcnEoaW50c3JjLT5idXNfaXJxLAorCQkJICAgICAgIGludHNyYy0+ZmxhZ3MucG9sYXJpdHksCisJCQkgICAgICAgaW50c3JjLT5mbGFncy50cmlnZ2VyLCBpbnRzcmMtPmdsb2JhbF9pcnEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2Vfbm1pX3NyYyAoCi0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX25taV9zcmMoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX25taV9zcmMgKm5taV9zcmMgPSBOVUxMOwogCi0Jbm1pX3NyYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9ubWlfc3JjKikgaGVhZGVyOworCW5taV9zcmMgPSAoc3RydWN0IGFjcGlfdGFibGVfbm1pX3NyYyAqKWhlYWRlcjsKIAogCWlmIChCQURfTUFEVF9FTlRSWShubWlfc3JjLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQxNSw5ICs0MDEsNyBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLyogQ09ORklHX1g4Nl9JT19BUElDICovCi0KLSNpZmRlZglDT05GSUdfQUNQSV9CVVMKKyNlbmRpZgkJCQkvKiBDT05GSUdfWDg2X0lPX0FQSUMgKi8KIAogLyoKICAqIGFjcGlfcGljX3NjaV9zZXRfdHJpZ2dlcigpCkBAIC00MzMsOCArNDE3LDcgQEAKICAqIEVDTFIyIGlzIElSUSdzIDgtMTUgKElSUSA4LCAxMyBtdXN0IGJlIDApCiAgKi8KIAotdm9pZCBfX2luaXQKLWFjcGlfcGljX3NjaV9zZXRfdHJpZ2dlcih1bnNpZ25lZCBpbnQgaXJxLCB1MTYgdHJpZ2dlcikKK3ZvaWQgX19pbml0IGFjcGlfcGljX3NjaV9zZXRfdHJpZ2dlcih1bnNpZ25lZCBpbnQgaXJxLCB1MTYgdHJpZ2dlcikKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgaXJxOwogCXVuc2lnbmVkIGludCBvbGQsIG5ldzsKQEAgLTQ1NCwxMCArNDM3LDEwIEBACiAJICogcm91dGluZyB0YWJsZXMuLgogCSAqLwogCXN3aXRjaCAodHJpZ2dlcikgewotCWNhc2UgMToJLyogRWRnZSAtIGNsZWFyICovCisJY2FzZSAxOgkJLyogRWRnZSAtIGNsZWFyICovCiAJCW5ldyAmPSB+bWFzazsKIAkJYnJlYWs7Ci0JY2FzZSAzOiAvKiBMZXZlbCAtIHNldCAqLworCWNhc2UgMzoJCS8qIExldmVsIC0gc2V0ICovCiAJCW5ldyB8PSBtYXNrOwogCQlicmVhazsKIAl9CkBAIC00NzAsMjEgKzQ1MywyMiBAQAogCW91dGIobmV3ID4+IDgsIDB4NGQxKTsKIH0KIAotCi0jZW5kaWYgLyogQ09ORklHX0FDUElfQlVTICovCi0KIGludCBhY3BpX2dzaV90b19pcnEodTMyIGdzaSwgdW5zaWduZWQgaW50ICppcnEpCiB7CiAjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCiAJaWYgKHVzZV9wY2lfdmVjdG9yKCkgJiYgIXBsYXRmb3JtX2xlZ2FjeV9pcnEoZ3NpKSkKLSAJCSppcnEgPSBJT19BUElDX1ZFQ1RPUihnc2kpOworCQkqaXJxID0gSU9fQVBJQ19WRUNUT1IoZ3NpKTsKIAllbHNlCiAjZW5kaWYKIAkJKmlycSA9IGdzaTsKIAlyZXR1cm4gMDsKIH0KIAotdW5zaWduZWQgaW50IGFjcGlfcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCBlZGdlX2xldmVsLCBpbnQgYWN0aXZlX2hpZ2hfbG93KQorLyoKKyAqIHN1Y2Nlc3M6IHJldHVybiBJUlEgbnVtYmVyICg+PTApCisgKiBmYWlsdXJlOiByZXR1cm4gPCAwCisgKi8KK2ludCBhY3BpX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdykKIHsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCXVuc2lnbmVkIGludCBwbGF0X2dzaSA9IGdzaTsKQEAgLTQ5Nyw3ICs0ODEsNyBAQAogCQlleHRlcm4gdm9pZCBlaXNhX3NldF9sZXZlbF9pcnEodW5zaWduZWQgaW50IGlycSk7CiAKIAkJaWYgKGVkZ2VfbGV2ZWwgPT0gQUNQSV9MRVZFTF9TRU5TSVRJVkUpCi0JCQkJZWlzYV9zZXRfbGV2ZWxfaXJxKGdzaSk7CisJCQllaXNhX3NldF9sZXZlbF9pcnEoZ3NpKTsKIAl9CiAjZW5kaWYKIApAQCAtNTA5LDYwICs0OTMsNTggQEAKIAlhY3BpX2dzaV90b19pcnEocGxhdF9nc2ksICZpcnEpOwogCXJldHVybiBpcnE7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9yZWdpc3Rlcl9nc2kpOwogCiAvKgogICogIEFDUEkgYmFzZWQgaG90cGx1ZyBzdXBwb3J0IGZvciBDUFUKICAqLwogI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVCi1pbnQKLWFjcGlfbWFwX2xzYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqcGNwdSkKK2ludCBhY3BpX21hcF9sc2FwaWMoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKnBjcHUpCiB7CiAJLyogVEJEICovCiAJcmV0dXJuIC1FSU5WQUw7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9tYXBfbHNhcGljKTsKIAotCi1pbnQKLWFjcGlfdW5tYXBfbHNhcGljKGludCBjcHUpCitpbnQgYWNwaV91bm1hcF9sc2FwaWMoaW50IGNwdSkKIHsKIAkvKiBUQkQgKi8KIAlyZXR1cm4gLUVJTlZBTDsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX3VubWFwX2xzYXBpYyk7Ci0jZW5kaWYgLyogQ09ORklHX0FDUElfSE9UUExVR19DUFUgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSAqLwogCi1pbnQKLWFjcGlfcmVnaXN0ZXJfaW9hcGljKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTY0IHBoeXNfYWRkciwgdTMyIGdzaV9iYXNlKQoraW50IGFjcGlfcmVnaXN0ZXJfaW9hcGljKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTY0IHBoeXNfYWRkciwgdTMyIGdzaV9iYXNlKQogewogCS8qIFRCRCAqLwogCXJldHVybiAtRUlOVkFMOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfcmVnaXN0ZXJfaW9hcGljKTsKIAotaW50Ci1hY3BpX3VucmVnaXN0ZXJfaW9hcGljKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGdzaV9iYXNlKQoraW50IGFjcGlfdW5yZWdpc3Rlcl9pb2FwaWMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZ3NpX2Jhc2UpCiB7CiAJLyogVEJEICovCiAJcmV0dXJuIC1FSU5WQUw7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV91bnJlZ2lzdGVyX2lvYXBpYyk7CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdAotYWNwaV9zY2FuX3JzZHAgKAotCXVuc2lnbmVkIGxvbmcJCXN0YXJ0LAotCXVuc2lnbmVkIGxvbmcJCWxlbmd0aCkKK2FjcGlfc2Nhbl9yc2RwKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQogewotCXVuc2lnbmVkIGxvbmcJCW9mZnNldCA9IDA7Ci0JdW5zaWduZWQgbG9uZwkJc2lnX2xlbiA9IHNpemVvZigiUlNEIFBUUiAiKSAtIDE7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgc2lnX2xlbiA9IHNpemVvZigiUlNEIFBUUiAiKSAtIDE7CiAKIAkvKgogCSAqIFNjYW4gYWxsIDE2LWJ5dGUgYm91bmRhcmllcyBvZiB0aGUgcGh5c2ljYWwgbWVtb3J5IHJlZ2lvbiBmb3IgdGhlCiAJICogUlNEUCBzaWduYXR1cmUuCiAJICovCiAJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBsZW5ndGg7IG9mZnNldCArPSAxNikgewotCQlpZiAoc3RybmNtcCgoY2hhciAqKSAoc3RhcnQgKyBvZmZzZXQpLCAiUlNEIFBUUiAiLCBzaWdfbGVuKSkKKwkJaWYgKHN0cm5jbXAoKGNoYXIgKikoc3RhcnQgKyBvZmZzZXQpLCAiUlNEIFBUUiAiLCBzaWdfbGVuKSkKIAkJCWNvbnRpbnVlOwogCQlyZXR1cm4gKHN0YXJ0ICsgb2Zmc2V0KTsKIAl9CkBAIC01NzUsMjAgKzU1NywxOSBAQAogCXN0cnVjdCBhY3BpX3RhYmxlX3NiZiAqc2I7CiAKIAlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSkKLQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzYiA9IChzdHJ1Y3QgYWNwaV90YWJsZV9zYmYgKikgX19hY3BpX21hcF90YWJsZShwaHlzX2FkZHIsIHNpemUpOworCXNiID0gKHN0cnVjdCBhY3BpX3RhYmxlX3NiZiAqKV9fYWNwaV9tYXBfdGFibGUocGh5c19hZGRyLCBzaXplKTsKIAlpZiAoIXNiKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIFNCRlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXNiZl9wb3J0ID0gc2ItPnNiZl9jbW9zOyAvKiBTYXZlIENNT1MgcG9ydCAqLworCXNiZl9wb3J0ID0gc2ItPnNiZl9jbW9zOwkvKiBTYXZlIENNT1MgcG9ydCAqLwogCiAJcmV0dXJuIDA7CiB9CiAKLQogI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCiAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2VfaHBldCh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKQEAgLTU5OCw3ICs1NzksNyBAQAogCWlmICghcGh5cyB8fCAhc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlocGV0X3RibCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9ocGV0ICopIF9fYWNwaV9tYXBfdGFibGUocGh5cywgc2l6ZSk7CisJaHBldF90YmwgPSAoc3RydWN0IGFjcGlfdGFibGVfaHBldCAqKV9fYWNwaV9tYXBfdGFibGUocGh5cywgc2l6ZSk7CiAJaWYgKCFocGV0X3RibCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCBIUEVUXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC02MDksMjIgKzU5MCwyMSBAQAogCQkgICAgICAgIm1lbW9yeS5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQotCiAjaWZkZWYJQ09ORklHX1g4Nl82NAotICAgICAgICB2eHRpbWUuaHBldF9hZGRyZXNzID0gaHBldF90YmwtPmFkZHIuYWRkcmwgfAotICAgICAgICAgICAgICAgICgobG9uZykgaHBldF90YmwtPmFkZHIuYWRkcmggPDwgMzIpOworCXZ4dGltZS5ocGV0X2FkZHJlc3MgPSBocGV0X3RibC0+YWRkci5hZGRybCB8CisJICAgICgobG9uZylocGV0X3RibC0+YWRkci5hZGRyaCA8PCAzMik7CiAKLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkhQRVQgaWQ6ICUjeCBiYXNlOiAlI2x4XG4iLAotICAgICAgICAgICAgICAgaHBldF90YmwtPmlkLCB2eHRpbWUuaHBldF9hZGRyZXNzKTsKLSNlbHNlCS8qIFg4NiAqLworCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJIUEVUIGlkOiAlI3ggYmFzZTogJSNseFxuIiwKKwkgICAgICAgaHBldF90YmwtPmlkLCB2eHRpbWUuaHBldF9hZGRyZXNzKTsKKyNlbHNlCQkJCS8qIFg4NiAqLwogCXsKIAkJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHBldF9hZGRyZXNzOwogCiAJCWhwZXRfYWRkcmVzcyA9IGhwZXRfdGJsLT5hZGRyLmFkZHJsOwogCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSFBFVCBpZDogJSN4IGJhc2U6ICUjbHhcbiIsCi0JCQlocGV0X3RibC0+aWQsIGhwZXRfYWRkcmVzcyk7CisJCSAgICAgICBocGV0X3RibC0+aWQsIGhwZXRfYWRkcmVzcyk7CiAJfQotI2VuZGlmCS8qIFg4NiAqLworI2VuZGlmCQkJCS8qIFg4NiAqLwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NDAsMjggKzYyMCwyNSBAQAogewogCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqZmFkdCA9IE5VTEw7CiAKLQlmYWR0ID0gKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiopIF9fYWNwaV9tYXBfdGFibGUocGh5cyxzaXplKTsKLQlpZighZmFkdCkgeworCWZhZHQgPSAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICopX19hY3BpX21hcF90YWJsZShwaHlzLCBzaXplKTsKKwlpZiAoIWZhZHQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgRkFEVFxuIik7CiAJCXJldHVybiAwOwogCX0KLQotI2lmZGVmCUNPTkZJR19BQ1BJX0lOVEVSUFJFVEVSCiAJLyogaW5pdGlhbGl6ZSBzY2lfaW50IGVhcmx5IGZvciBJTlRfU1JDX09WUiBNQURUIHBhcnNpbmcgKi8KIAlhY3BpX2ZhZHQuc2NpX2ludCA9IGZhZHQtPnNjaV9pbnQ7Ci0jZW5kaWYKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JVUwogCS8qIGluaXRpYWxpemUgcmV2IGFuZCBhcGljX3BoeXNfZGVzdF9tb2RlIGZvciB4ODZfNjQgZ2VuYXBpYyAqLwogCWFjcGlfZmFkdC5yZXZpc2lvbiA9IGZhZHQtPnJldmlzaW9uOwotCWFjcGlfZmFkdC5mb3JjZV9hcGljX3BoeXNpY2FsX2Rlc3RpbmF0aW9uX21vZGUgPSBmYWR0LT5mb3JjZV9hcGljX3BoeXNpY2FsX2Rlc3RpbmF0aW9uX21vZGU7Ci0jZW5kaWYKKwlhY3BpX2ZhZHQuZm9yY2VfYXBpY19waHlzaWNhbF9kZXN0aW5hdGlvbl9tb2RlID0KKwkgICAgZmFkdC0+Zm9yY2VfYXBpY19waHlzaWNhbF9kZXN0aW5hdGlvbl9tb2RlOwogCiAjaWZkZWYgQ09ORklHX1g4Nl9QTV9USU1FUgogCS8qIGRldGVjdCB0aGUgbG9jYXRpb24gb2YgdGhlIEFDUEkgUE0gVGltZXIgKi8KIAlpZiAoZmFkdC0+cmV2aXNpb24gPj0gRkFEVDJfUkVWSVNJT05fSUQpIHsKIAkJLyogRkFEVCByZXYuIDIgKi8KLQkJaWYgKGZhZHQtPnhwbV90bXJfYmxrLmFkZHJlc3Nfc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKQorCQlpZiAoZmFkdC0+eHBtX3Rtcl9ibGsuYWRkcmVzc19zcGFjZV9pZCAhPQorCQkgICAgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKQogCQkJcmV0dXJuIDA7CiAKIAkJcG10bXJfaW9wb3J0ID0gZmFkdC0+eHBtX3Rtcl9ibGsuYWRkcmVzczsKQEAgLTY3MCwxNiArNjQ3LDE1IEBACiAJCXBtdG1yX2lvcG9ydCA9IGZhZHQtPlYxX3BtX3Rtcl9ibGs7CiAJfQogCWlmIChwbXRtcl9pb3BvcnQpCi0JCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJQTS1UaW1lciBJTyBQb3J0OiAlI3hcbiIsIHBtdG1yX2lvcG9ydCk7CisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJQTS1UaW1lciBJTyBQb3J0OiAlI3hcbiIsCisJCSAgICAgICBwbXRtcl9pb3BvcnQpOwogI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKLQotdW5zaWduZWQgbG9uZyBfX2luaXQKLWFjcGlfZmluZF9yc2RwICh2b2lkKQordW5zaWduZWQgbG9uZyBfX2luaXQgYWNwaV9maW5kX3JzZHAodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nCQlyc2RwX3BoeXMgPSAwOworCXVuc2lnbmVkIGxvbmcgcnNkcF9waHlzID0gMDsKIAogCWlmIChlZmlfZW5hYmxlZCkgewogCQlpZiAoZWZpLmFjcGkyMCkKQEAgLTY5MSw5ICs2NjcsOSBAQAogCSAqIFNjYW4gbWVtb3J5IGxvb2tpbmcgZm9yIHRoZSBSU0RQIHNpZ25hdHVyZS4gRmlyc3Qgc2VhcmNoIEVCREEgKGxvdwogCSAqIG1lbW9yeSkgcGFyYWdyYXBocyBhbmQgdGhlbiBzZWFyY2ggdXBwZXIgbWVtb3J5IChFMDAwMC1GRkZGRikuCiAJICovCi0JcnNkcF9waHlzID0gYWNwaV9zY2FuX3JzZHAgKDAsIDB4NDAwKTsKKwlyc2RwX3BoeXMgPSBhY3BpX3NjYW5fcnNkcCgwLCAweDQwMCk7CiAJaWYgKCFyc2RwX3BoeXMpCi0JCXJzZHBfcGh5cyA9IGFjcGlfc2Nhbl9yc2RwICgweEUwMDAwLCAweDIwMDAwKTsKKwkJcnNkcF9waHlzID0gYWNwaV9zY2FuX3JzZHAoMHhFMDAwMCwgMHgyMDAwMCk7CiAKIAlyZXR1cm4gcnNkcF9waHlzOwogfQpAQCAtNzAzLDggKzY3OSw3IEBACiAgKiBQYXJzZSBMQVBJQyBlbnRyaWVzIGluIE1BRFQKICAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8IDAgb24gZXJyb3IKICAqLwotc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfbWFkdF9sYXBpY19lbnRyaWVzKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX21hZHRfbGFwaWNfZW50cmllcyh2b2lkKQogewogCWludCBjb3VudDsKIApAQCAtNzEzLDI4ICs2ODgsMzEgQEAKIAkgKiBhbmQgKG9wdGlvbmFsbHkpIG92ZXJyaWRlbiBieSBhIExBUElDX0FERFJfT1ZSIGVudHJ5ICg2NC1iaXQgdmFsdWUpLgogCSAqLwogCi0JY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0xBUElDX0FERFJfT1ZSLCBhY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyLCAwKTsKKwljb3VudCA9CisJICAgIGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTEFQSUNfQUREUl9PVlIsCisJCQkJICBhY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyLCAwKTsKIAlpZiAoY291bnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTEFQSUMgYWRkcmVzcyBvdmVycmlkZSBlbnRyeVxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJFcnJvciBwYXJzaW5nIExBUElDIGFkZHJlc3Mgb3ZlcnJpZGUgZW50cnlcbiIpOwogCQlyZXR1cm4gY291bnQ7CiAJfQogCiAJbXBfcmVnaXN0ZXJfbGFwaWNfYWRkcmVzcyhhY3BpX2xhcGljX2FkZHIpOwogCiAJY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0xBUElDLCBhY3BpX3BhcnNlX2xhcGljLAotCQkJCSAgICAgICBNQVhfQVBJQ1MpOwotCWlmICghY291bnQpIHsgCisJCQkJICAgICAgTUFYX0FQSUNTKTsKKwlpZiAoIWNvdW50KSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIk5vIExBUElDIGVudHJpZXMgcHJlc2VudFxuIik7CiAJCS8qIFRCRDogQ2xlYW51cCB0byBhbGxvdyBmYWxsYmFjayB0byBNUFMgKi8KIAkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWVsc2UgaWYgKGNvdW50IDwgMCkgeworCX0gZWxzZSBpZiAoY291bnQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTEFQSUMgZW50cnlcbiIpOwogCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCiAJCXJldHVybiBjb3VudDsKIAl9CiAKLQljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTEFQSUNfTk1JLCBhY3BpX3BhcnNlX2xhcGljX25taSwgMCk7CisJY291bnQgPQorCSAgICBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0xBUElDX05NSSwgYWNwaV9wYXJzZV9sYXBpY19ubWksIDApOwogCWlmIChjb3VudCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBMQVBJQyBOTUkgZW50cnlcbiIpOwogCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCkBAIC03NDIsMTUgKzcyMCwxNCBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9JT19BUElDKSAmJiBkZWZpbmVkKENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSKQorI2lmZGVmCUNPTkZJR19YODZfSU9fQVBJQwogLyoKICAqIFBhcnNlIElPQVBJQyByZWxhdGVkIGVudHJpZXMgaW4gTUFEVAogICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwgMCBvbiBlcnJvcgogICovCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9tYWR0X2lvYXBpY19lbnRyaWVzKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX21hZHRfaW9hcGljX2VudHJpZXModm9pZCkKIHsKIAlpbnQgY291bnQ7CiAKQEAgLTc2MiwzMCArNzM5LDM0IEBACiAJICovCiAJaWYgKGFjcGlfZGlzYWJsZWQgfHwgYWNwaV9ub2lycSkgewogCQlyZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgfQorCX0KIAogCS8qCi0gCSAqIGlmICJub2FwaWMiIGJvb3Qgb3B0aW9uLCBkb24ndCBsb29rIGZvciBJTy1BUElDcworCSAqIGlmICJub2FwaWMiIGJvb3Qgb3B0aW9uLCBkb24ndCBsb29rIGZvciBJTy1BUElDcwogCSAqLwogCWlmIChza2lwX2lvYXBpY19zZXR1cCkgewogCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiU2tpcHBpbmcgSU9BUElDIHByb2JlICIKLQkJCSJkdWUgdG8gJ25vYXBpYycgb3B0aW9uLlxuIik7CisJCSAgICAgICAiZHVlIHRvICdub2FwaWMnIG9wdGlvbi5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfSU9BUElDLCBhY3BpX3BhcnNlX2lvYXBpYywgTUFYX0lPX0FQSUNTKTsKKwljb3VudCA9CisJICAgIGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfSU9BUElDLCBhY3BpX3BhcnNlX2lvYXBpYywKKwkJCQkgIE1BWF9JT19BUElDUyk7CiAJaWYgKCFjb3VudCkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJObyBJT0FQSUMgZW50cmllcyBwcmVzZW50XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWVsc2UgaWYgKGNvdW50IDwgMCkgeworCX0gZWxzZSBpZiAoY291bnQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgSU9BUElDIGVudHJ5XG4iKTsKIAkJcmV0dXJuIGNvdW50OwogCX0KIAotCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9JTlRfU1JDX09WUiwgYWNwaV9wYXJzZV9pbnRfc3JjX292ciwgTlJfSVJRX1ZFQ1RPUlMpOworCWNvdW50ID0KKwkgICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9JTlRfU1JDX09WUiwgYWNwaV9wYXJzZV9pbnRfc3JjX292ciwKKwkJCQkgIE5SX0lSUV9WRUNUT1JTKTsKIAlpZiAoY291bnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgaW50ZXJydXB0IHNvdXJjZSBvdmVycmlkZXMgZW50cnlcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCisJCSAgICAgICAiRXJyb3IgcGFyc2luZyBpbnRlcnJ1cHQgc291cmNlIG92ZXJyaWRlcyBlbnRyeVxuIik7CiAJCS8qIFRCRDogQ2xlYW51cCB0byBhbGxvdyBmYWxsYmFjayB0byBNUFMgKi8KIAkJcmV0dXJuIGNvdW50OwogCX0KQEAgLTgwMCw3ICs3ODEsOSBAQAogCS8qIEZpbGwgaW4gaWRlbnRpdHkgbGVnYWN5IG1hcGluZ3Mgd2hlcmUgbm8gb3ZlcnJpZGUgKi8KIAltcF9jb25maWdfYWNwaV9sZWdhY3lfaXJxcygpOwogCi0JY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX05NSV9TUkMsIGFjcGlfcGFyc2Vfbm1pX3NyYywgTlJfSVJRX1ZFQ1RPUlMpOworCWNvdW50ID0KKwkgICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9OTUlfU1JDLCBhY3BpX3BhcnNlX25taV9zcmMsCisJCQkJICBOUl9JUlFfVkVDVE9SUyk7CiAJaWYgKGNvdW50IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBwYXJzaW5nIE5NSSBTUkMgZW50cnlcbiIpOwogCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCkBAIC04MTQsMTEgKzc5Nyw5IEBACiB7CiAJcmV0dXJuIC0xOwogfQotI2VuZGlmIC8qICEoQ09ORklHX1g4Nl9JT19BUElDICYmIENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSKSAqLworI2VuZGlmCS8qICFDT05GSUdfWDg2X0lPX0FQSUMgKi8KIAotCi1zdGF0aWMgdm9pZCBfX2luaXQKLWFjcGlfcHJvY2Vzc19tYWR0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgYWNwaV9wcm9jZXNzX21hZHQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAlpbnQgY291bnQsIGVycm9yOwpAQCAtODMzLDYgKzgxNCw5IEBACiAJCWlmICghZXJyb3IpIHsKIAkJCWFjcGlfbGFwaWMgPSAxOwogCisjaWZkZWYgQ09ORklHX1g4Nl9HRU5FUklDQVJDSAorCQkJZ2VuZXJpY19iaWdzbXBfcHJvYmUoKTsKKyNlbmRpZgogCQkJLyoKIAkJCSAqIFBhcnNlIE1BRFQgSU8tQVBJQyBlbnRyaWVzCiAJCQkgKi8KQEAgLTg1MCw3ICs4MzQsOCBAQAogCQkJLyoKIAkJCSAqIERlbGwgUHJlY2lzaW9uIFdvcmtzdGF0aW9uIDQxMCwgNjEwIGNvbWUgaGVyZS4KIAkJCSAqLwotCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiSW52YWxpZCBCSU9TIE1BRFQsIGRpc2FibGluZyBBQ1BJXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJCSAgICAgICAiSW52YWxpZCBCSU9TIE1BRFQsIGRpc2FibGluZyBBQ1BJXG4iKTsKIAkJCWRpc2FibGVfYWNwaSgpOwogCQl9CiAJfQpAQCAtODYyLDcgKzg0Nyw2IEBACiAKICNpZmRlZiBfX2kzODZfXwogCi0jaWZkZWYJQ09ORklHX0FDUElfUENJCiBzdGF0aWMgaW50IF9faW5pdCBkaXNhYmxlX2FjcGlfaXJxKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQogewogCWlmICghYWNwaV9mb3JjZSkgewpAQCAtODgyLDEyICs4NjYsMTEgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogc3RhdGljIGludCBfX2luaXQgZG1pX2Rpc2FibGVfYWNwaShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKIHsKIAlpZiAoIWFjcGlfZm9yY2UpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBkZXRlY3RlZDogYWNwaSBvZmZcbiIsZC0+aWRlbnQpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIGRldGVjdGVkOiBhY3BpIG9mZlxuIiwgZC0+aWRlbnQpOwogCQlkaXNhYmxlX2FjcGkoKTsKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9OT1RJQ0UKQEAgLTkwMiw3ICs4ODUsOCBAQAogc3RhdGljIGludCBfX2luaXQgZm9yY2VfYWNwaV9odChzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKIHsKIAlpZiAoIWFjcGlfZm9yY2UpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBkZXRlY3RlZDogZm9yY2UgdXNlIG9mIGFjcGk9aHRcbiIsIGQtPmlkZW50KTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBkZXRlY3RlZDogZm9yY2UgdXNlIG9mIGFjcGk9aHRcbiIsCisJCSAgICAgICBkLT5pZGVudCk7CiAJCWRpc2FibGVfYWNwaSgpOwogCQlhY3BpX2h0ID0gMTsKIAl9IGVsc2UgewpAQCAtOTIxLDE1NSArOTA1LDE1NSBAQAogCSAqIEJveGVzIHRoYXQgbmVlZCBBQ1BJIGRpc2FibGVkCiAJICovCiAJewotCQkuY2FsbGJhY2sgPSBkbWlfZGlzYWJsZV9hY3BpLAotCQkuaWRlbnQgPSAiSUJNIFRoaW5rcGFkIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAotCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiMjYyOUgxRyIpLAotCQl9LAotCX0sCisJIC5jYWxsYmFjayA9IGRtaV9kaXNhYmxlX2FjcGksCisJIC5pZGVudCA9ICJJQk0gVGhpbmtwYWQiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAorCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIjI2MjlIMUciKSwKKwkJICAgICB9LAorCSB9LAogCiAJLyoKIAkgKiBCb3hlcyB0aGF0IG5lZWQgYWNwaT1odAogCSAqLwogCXsKLQkJLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKLQkJLmlkZW50ID0gIkZTQyBQcmltZXJneSBUODUwIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJGVUpJVFNVIFNJRU1FTlMiKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUFJJTUVSR1kgVDg1MCIpLAotCQl9LAotCX0sCisJIC5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCisJIC5pZGVudCA9ICJGU0MgUHJpbWVyZ3kgVDg1MCIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAorCQkgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUFJJTUVSR1kgVDg1MCIpLAorCQkgICAgIH0sCisJIH0sCiAJewotCQkuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAotCQkuaWRlbnQgPSAiREVMTCBHWDI0MCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCi0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJPcHRpUGxleCBHWDI0MCIpLAotCQl9LAotCX0sCisJIC5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCisJIC5pZGVudCA9ICJERUxMIEdYMjQwIiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiT3B0aVBsZXggR1gyNDAiKSwKKwkJICAgICB9LAorCSB9LAogCXsKLQkJLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKLQkJLmlkZW50ID0gIkhQIFZJU1VBTElaRSBOVCBXb3Jrc3RhdGlvbiIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJIZXdsZXR0LVBhY2thcmQiKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSFAgVklTVUFMSVpFIE5UIFdvcmtzdGF0aW9uIiksCi0JCX0sCi0JfSwKKwkgLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKKwkgLmlkZW50ID0gIkhQIFZJU1VBTElaRSBOVCBXb3Jrc3RhdGlvbiIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCisJCSAgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJIUCBWSVNVQUxJWkUgTlQgV29ya3N0YXRpb24iKSwKKwkJICAgICB9LAorCSB9LAogCXsKLQkJLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKLQkJLmlkZW50ID0gIkNvbXBhcSBXb3Jrc3RhdGlvbiBXODAwMCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQ29tcGFxIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIldvcmtzdGF0aW9uIFc4MDAwIiksCi0JCX0sCi0JfSwKKwkgLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKKwkgLmlkZW50ID0gIkNvbXBhcSBXb3Jrc3RhdGlvbiBXODAwMCIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkNvbXBhcSIpLAorCQkgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiV29ya3N0YXRpb24gVzgwMDAiKSwKKwkJICAgICB9LAorCSB9LAogCXsKLQkJLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKLQkJLmlkZW50ID0gIkFTVVMgUDRCMjY2IiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAotCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiUDRCMjY2IiksCi0JCX0sCi0JfSwKKwkgLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKKwkgLmlkZW50ID0gIkFTVVMgUDRCMjY2IiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJQNEIyNjYiKSwKKwkJICAgICB9LAorCSB9LAogCXsKLQkJLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKLQkJLmlkZW50ID0gIkFTVVMgUDJCLURTIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAotCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiUDJCLURTIiksCi0JCX0sCi0JfSwKKwkgLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKKwkgLmlkZW50ID0gIkFTVVMgUDJCLURTIiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJQMkItRFMiKSwKKwkJICAgICB9LAorCSB9LAogCXsKLQkJLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKLQkJLmlkZW50ID0gIkFTVVMgQ1VSLURMUyIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIkNVUi1ETFMiKSwKLQkJfSwKLQl9LAorCSAuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCSAuaWRlbnQgPSAiQVNVUyBDVVItRExTIiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJDVVItRExTIiksCisJCSAgICAgfSwKKwkgfSwKIAl7Ci0JCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCi0JCS5pZGVudCA9ICJBQklUIGk0NDBCWC1XODM5NzciLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQUJJVCA8aHR0cDovL3d3dy5hYml0LmNvbT4iKSwKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgImk0NDBCWC1XODM5NzcgKEJQNikiKSwKLQkJfSwKLQl9LAorCSAuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCSAuaWRlbnQgPSAiQUJJVCBpNDQwQlgtVzgzOTc3IiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBQklUIDxodHRwOi8vd3d3LmFiaXQuY29tPiIpLAorCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgImk0NDBCWC1XODM5NzcgKEJQNikiKSwKKwkJICAgICB9LAorCSB9LAogCXsKLQkJLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKLQkJLmlkZW50ID0gIklCTSBCbGFkZWNlbnRlciIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIklCTSBlU2VydmVyIEJsYWRlQ2VudGVyIEhTMjAiKSwKLQkJfSwKLQl9LAorCSAuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCSAuaWRlbnQgPSAiSUJNIEJsYWRlY2VudGVyIiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJJQk0gZVNlcnZlciBCbGFkZUNlbnRlciBIUzIwIiksCisJCSAgICAgfSwKKwkgfSwKIAl7Ci0JCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCi0JCS5pZGVudCA9ICJJQk0gZVNlcnZlciB4U2VyaWVzIDM2MCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgImVTZXJ2ZXIgeFNlcmllcyAzNjAiKSwKLQkJfSwKLQl9LAorCSAuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCSAuaWRlbnQgPSAiSUJNIGVTZXJ2ZXIgeFNlcmllcyAzNjAiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAorCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgImVTZXJ2ZXIgeFNlcmllcyAzNjAiKSwKKwkJICAgICB9LAorCSB9LAogCXsKLQkJLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKLQkJLmlkZW50ID0gIklCTSBlc2VydmVyIHhTZXJpZXMgMzMwIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAotCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiZXNlcnZlciB4U2VyaWVzIDMzMCIpLAotCQl9LAotCX0sCisJIC5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCisJIC5pZGVudCA9ICJJQk0gZXNlcnZlciB4U2VyaWVzIDMzMCIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiZXNlcnZlciB4U2VyaWVzIDMzMCIpLAorCQkgICAgIH0sCisJIH0sCiAJewotCQkuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAotCQkuaWRlbnQgPSAiSUJNIGVzZXJ2ZXIgeFNlcmllcyA0NDAiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgImVzZXJ2ZXIgeFNlcmllcyA0NDAiKSwKLQkJfSwKLQl9LAorCSAuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCSAuaWRlbnQgPSAiSUJNIGVzZXJ2ZXIgeFNlcmllcyA0NDAiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAorCQkgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiZXNlcnZlciB4U2VyaWVzIDQ0MCIpLAorCQkgICAgIH0sCisJIH0sCiAKLSNpZmRlZglDT05GSUdfQUNQSV9QQ0kKIAkvKgogCSAqIEJveGVzIHRoYXQgbmVlZCBBQ1BJIFBDSSBJUlEgcm91dGluZyBkaXNhYmxlZAogCSAqLwogCXsKLQkJLmNhbGxiYWNrID0gZGlzYWJsZV9hY3BpX2lycSwKLQkJLmlkZW50ID0gIkFTVVMgQTdWIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DIiksCi0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICI8QTdWPiIpLAotCQkJLyogbmV3ZXIgQklPUywgUmV2aXNpb24gMTAxMSwgZG9lcyB3b3JrICovCi0JCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIkFTVVMgQTdWIEFDUEkgQklPUyBSZXZpc2lvbiAxMDA3IiksCi0JCX0sCi0JfSwKKwkgLmNhbGxiYWNrID0gZGlzYWJsZV9hY3BpX2lycSwKKwkgLmlkZW50ID0gIkFTVVMgQTdWIiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQyIpLAorCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIjxBN1Y+IiksCisJCSAgICAgLyogbmV3ZXIgQklPUywgUmV2aXNpb24gMTAxMSwgZG9lcyB3b3JrICovCisJCSAgICAgRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sCisJCQkgICAgICAgIkFTVVMgQTdWIEFDUEkgQklPUyBSZXZpc2lvbiAxMDA3IiksCisJCSAgICAgfSwKKwkgfSwKIAogCS8qCiAJICogQm94ZXMgdGhhdCBuZWVkIEFDUEkgUENJIElSUSByb3V0aW5nIGFuZCBQQ0kgc2NhbiBkaXNhYmxlZAogCSAqLwotCXsJLyogX0JCTiAwIGJ1ZyAqLwotCQkuY2FsbGJhY2sgPSBkaXNhYmxlX2FjcGlfcGNpLAotCQkuaWRlbnQgPSAiQVNVUyBQUi1ETFMiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCi0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJQUi1ETFMiKSwKLQkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiQVNVUyBQUi1ETFMgQUNQSSBCSU9TIFJldmlzaW9uIDEwMTAiKSwKLQkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDMvMjEvMjAwMyIpCi0JCX0sCi0JfSwKKwl7CQkJLyogX0JCTiAwIGJ1ZyAqLworCSAuY2FsbGJhY2sgPSBkaXNhYmxlX2FjcGlfcGNpLAorCSAuaWRlbnQgPSAiQVNVUyBQUi1ETFMiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIlBSLURMUyIpLAorCQkgICAgIERNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLAorCQkJICAgICAgICJBU1VTIFBSLURMUyBBQ1BJIEJJT1MgUmV2aXNpb24gMTAxMCIpLAorCQkgICAgIERNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDMvMjEvMjAwMyIpCisJCSAgICAgfSwKKwkgfSwKIAl7Ci0JCS5jYWxsYmFjayA9IGRpc2FibGVfYWNwaV9wY2ksCi0JCS5pZGVudCA9ICJBY2VyIFRyYXZlbE1hdGUgMzZ4IExhcHRvcCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAotIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSAzNjAiKSwKLQkJfSwKLQl9LAotI2VuZGlmCi0JeyB9CisJIC5jYWxsYmFjayA9IGRpc2FibGVfYWNwaV9wY2ksCisJIC5pZGVudCA9ICJBY2VyIFRyYXZlbE1hdGUgMzZ4IExhcHRvcCIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgMzYwIiksCisJCSAgICAgfSwKKwkgfSwKKwl7fQogfTsKIAotI2VuZGlmCS8qIF9faTM4Nl9fICovCisjZW5kaWYJCQkJLyogX19pMzg2X18gKi8KIAogLyoKICAqIGFjcGlfYm9vdF90YWJsZV9pbml0KCkgYW5kIGFjcGlfYm9vdF9pbml0KCkKQEAgLTEwOTQsOCArMTA3OCw3IEBACiAgKgkhMDogZmFpbHVyZQogICovCiAKLWludCBfX2luaXQKLWFjcGlfYm9vdF90YWJsZV9pbml0KHZvaWQpCitpbnQgX19pbml0IGFjcGlfYm9vdF90YWJsZV9pbml0KHZvaWQpCiB7CiAJaW50IGVycm9yOwogCkBAIC0xMTA4LDcgKzEwOTEsNyBAQAogCSAqIE9uZSBleGNlcHRpb246IGFjcGk9aHQgY29udGludWVzIGZhciBlbm91Z2ggdG8gZW51bWVyYXRlIExBUElDcwogCSAqLwogCWlmIChhY3BpX2Rpc2FibGVkICYmICFhY3BpX2h0KQotCQkgcmV0dXJuIDE7CisJCXJldHVybiAxOwogCiAJLyogCiAJICogSW5pdGlhbGl6ZSB0aGUgQUNQSSBib290LXRpbWUgdGFibGUgcGFyc2VyLgpAQCAtMTExOCw3ICsxMTAxLDYgQEAKIAkJZGlzYWJsZV9hY3BpKCk7CiAJCXJldHVybiBlcnJvcjsKIAl9Ci0KICNpZmRlZiBfX2kzODZfXwogCWNoZWNrX2FjcGlfcGNpKCk7CiAjZW5kaWYKQEAgLTExNDIsNyArMTEyNCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogaW50IF9faW5pdCBhY3BpX2Jvb3RfaW5pdCh2b2lkKQogewogCS8qCkBAIC0xMTUwLDcgKzExMzEsNyBAQAogCSAqIE9uZSBleGNlcHRpb246IGFjcGk9aHQgY29udGludWVzIGZhciBlbm91Z2ggdG8gZW51bWVyYXRlIExBUElDcwogCSAqLwogCWlmIChhY3BpX2Rpc2FibGVkICYmICFhY3BpX2h0KQotCQkgcmV0dXJuIDE7CisJCXJldHVybiAxOwogCiAJYWNwaV90YWJsZV9wYXJzZShBQ1BJX0JPT1QsIGFjcGlfcGFyc2Vfc2JmKTsKIApAQCAtMTE2OCw0ICsxMTQ5LDMgQEAKIAogCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvZWFybHlxdWlyay5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYwppbmRleCA3MjZhNWNhLi5mMWI5ZDJhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FjcGkvZWFybHlxdWlyay5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKQEAgLTgsNDQgKzgsNDQgQEAKICNpbmNsdWRlIDxhc20vcGNpLWRpcmVjdC5oPgogI2luY2x1ZGUgPGFzbS9hY3BpLmg+CiAKLXN0YXRpYyBpbnQgX19pbml0IGNoZWNrX2JyaWRnZShpbnQgdmVuZG9yLCBpbnQgZGV2aWNlKSAKK3N0YXRpYyBpbnQgX19pbml0IGNoZWNrX2JyaWRnZShpbnQgdmVuZG9yLCBpbnQgZGV2aWNlKQogewogCS8qIEFjY29yZGluZyB0byBOdmlkaWEgYWxsIHRpbWVyIG92ZXJyaWRlcyBhcmUgYm9ndXMuIEp1c3QgaWdub3JlCiAJICAgdGhlbSBhbGwuICovCi0JaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05WSURJQSkgeyAKLQkJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsgCQkKKwlpZiAodmVuZG9yID09IFBDSV9WRU5ET1JfSURfTlZJRElBKSB7CisJCWFjcGlfc2tpcF90aW1lcl9vdmVycmlkZSA9IDE7CiAJfQogCXJldHVybiAwOwogfQotICAgCi12b2lkIF9faW5pdCBjaGVja19hY3BpX3BjaSh2b2lkKSAKLXsgCi0JaW50IG51bSxzbG90LGZ1bmM7IAorCit2b2lkIF9faW5pdCBjaGVja19hY3BpX3BjaSh2b2lkKQoreworCWludCBudW0sIHNsb3QsIGZ1bmM7CiAKIAkvKiBBc3N1bWUgdGhlIG1hY2hpbmUgc3VwcG9ydHMgdHlwZSAxLiBJZiBub3QgaXQgd2lsbCAKIAkgICBhbHdheXMgcmVhZCBmZmZmZmZmZiBhbmQgc2hvdWxkIG5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdC4gKi8KIAogCS8qIFBvb3IgbWFuJ3MgUENJIGRpc2NvdmVyeSAqLwotCWZvciAobnVtID0gMDsgbnVtIDwgMzI7IG51bSsrKSB7IAotCQlmb3IgKHNsb3QgPSAwOyBzbG90IDwgMzI7IHNsb3QrKykgeyAKLQkJCWZvciAoZnVuYyA9IDA7IGZ1bmMgPCA4OyBmdW5jKyspIHsgCisJZm9yIChudW0gPSAwOyBudW0gPCAzMjsgbnVtKyspIHsKKwkJZm9yIChzbG90ID0gMDsgc2xvdCA8IDMyOyBzbG90KyspIHsKKwkJCWZvciAoZnVuYyA9IDA7IGZ1bmMgPCA4OyBmdW5jKyspIHsKIAkJCQl1MzIgY2xhc3M7CiAJCQkJdTMyIHZlbmRvcjsKLQkJCQljbGFzcyA9IHJlYWRfcGNpX2NvbmZpZyhudW0sc2xvdCxmdW5jLAorCQkJCWNsYXNzID0gcmVhZF9wY2lfY29uZmlnKG51bSwgc2xvdCwgZnVuYywKIAkJCQkJCQlQQ0lfQ0xBU1NfUkVWSVNJT04pOwogCQkJCWlmIChjbGFzcyA9PSAweGZmZmZmZmZmKQotCQkJCQlicmVhazsgCisJCQkJCWJyZWFrOwogCiAJCQkJaWYgKChjbGFzcyA+PiAxNikgIT0gUENJX0NMQVNTX0JSSURHRV9QQ0kpCi0JCQkJCWNvbnRpbnVlOyAKLQkJCQkKLQkJCQl2ZW5kb3IgPSByZWFkX3BjaV9jb25maWcobnVtLCBzbG90LCBmdW5jLCAKKwkJCQkJY29udGludWU7CisKKwkJCQl2ZW5kb3IgPSByZWFkX3BjaV9jb25maWcobnVtLCBzbG90LCBmdW5jLAogCQkJCQkJCSBQQ0lfVkVORE9SX0lEKTsKLQkJCQkKLQkJCQlpZiAoY2hlY2tfYnJpZGdlKHZlbmRvciYweGZmZmYsIHZlbmRvciA+PiAxNikpCi0JCQkJCXJldHVybjsgCi0JCQl9IAotCQkJCisKKwkJCQlpZiAoY2hlY2tfYnJpZGdlKHZlbmRvciAmIDB4ZmZmZiwgdmVuZG9yID4+IDE2KSkKKwkJCQkJcmV0dXJuOworCQkJfQorCiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCmluZGV4IGMxYWY5MzAuLjFjYjJiMTggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCkBAIC0yMCwxMiArMjAsMTMgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgRkFTVENBTEwoYWNwaV9jb3B5X3dha2V1cF9yb3V0aW5lKHVuc2lnbmVkIGxvbmcpKTsKIAotc3RhdGljIHZvaWQgaW5pdF9sb3dfbWFwcGluZyhwZ2RfdCAqcGdkLCBpbnQgcGdkX2xpbWl0KQorc3RhdGljIHZvaWQgaW5pdF9sb3dfbWFwcGluZyhwZ2RfdCAqIHBnZCwgaW50IHBnZF9saW1pdCkKIHsKIAlpbnQgcGdkX29mcyA9IDA7CiAKLQl3aGlsZSAoKHBnZF9vZnMgPCBwZ2RfbGltaXQpICYmIChwZ2Rfb2ZzICsgVVNFUl9QVFJTX1BFUl9QR0QgPCBQVFJTX1BFUl9QR0QpKSB7Ci0JCXNldF9wZ2QocGdkLCAqKHBnZCtVU0VSX1BUUlNfUEVSX1BHRCkpOworCXdoaWxlICgocGdkX29mcyA8IHBnZF9saW1pdCkKKwkgICAgICAgJiYgKHBnZF9vZnMgKyBVU0VSX1BUUlNfUEVSX1BHRCA8IFBUUlNfUEVSX1BHRCkpIHsKKwkJc2V0X3BnZChwZ2QsICoocGdkICsgVVNFUl9QVFJTX1BFUl9QR0QpKTsKIAkJcGdkX29mcysrLCBwZ2QrKzsKIAl9CiAJZmx1c2hfdGxiX2FsbCgpOwpAQCAtMzcsMTIgKzM4LDEzIEBACiAgKiBDcmVhdGUgYW4gaWRlbnRpdHkgbWFwcGVkIHBhZ2UgdGFibGUgYW5kIGNvcHkgdGhlIHdha2V1cCByb3V0aW5lIHRvCiAgKiBsb3cgbWVtb3J5LgogICovCi1pbnQgYWNwaV9zYXZlX3N0YXRlX21lbSAodm9pZCkKK2ludCBhY3BpX3NhdmVfc3RhdGVfbWVtKHZvaWQpCiB7CiAJaWYgKCFhY3BpX3dha2V1cF9hZGRyZXNzKQogCQlyZXR1cm4gMTsKIAlpbml0X2xvd19tYXBwaW5nKHN3YXBwZXJfcGdfZGlyLCBVU0VSX1BUUlNfUEVSX1BHRCk7Ci0JbWVtY3B5KCh2b2lkICopIGFjcGlfd2FrZXVwX2FkZHJlc3MsICZ3YWtldXBfc3RhcnQsICZ3YWtldXBfZW5kIC0gJndha2V1cF9zdGFydCk7CisJbWVtY3B5KCh2b2lkICopYWNwaV93YWtldXBfYWRkcmVzcywgJndha2V1cF9zdGFydCwKKwkgICAgICAgJndha2V1cF9lbmQgLSAmd2FrZXVwX3N0YXJ0KTsKIAlhY3BpX2NvcHlfd2FrZXVwX3JvdXRpbmUoYWNwaV93YWtldXBfYWRkcmVzcyk7CiAKIAlyZXR1cm4gMDsKQEAgLTUxLDcgKzUzLDcgQEAKIC8qCiAgKiBhY3BpX3Jlc3RvcmVfc3RhdGUgLSB1bmRvIGVmZmVjdHMgb2YgYWNwaV9zYXZlX3N0YXRlX21lbQogICovCi12b2lkIGFjcGlfcmVzdG9yZV9zdGF0ZV9tZW0gKHZvaWQpCit2b2lkIGFjcGlfcmVzdG9yZV9zdGF0ZV9tZW0odm9pZCkKIHsKIAl6YXBfbG93X21hcHBpbmdzKCk7CiB9CkBAIC02Nyw3ICs2OSw4IEBACiB2b2lkIF9faW5pdCBhY3BpX3Jlc2VydmVfYm9vdG1lbSh2b2lkKQogewogCWlmICgoJndha2V1cF9lbmQgLSAmd2FrZXVwX3N0YXJ0KSA+IFBBR0VfU0laRSkgewotCQlwcmludGsoS0VSTl9FUlIgIkFDUEk6IFdha2V1cCBjb2RlIHdheSB0b28gYmlnLCBTMyBkaXNhYmxlZC5cbiIpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJBQ1BJOiBXYWtldXAgY29kZSB3YXkgdG9vIGJpZywgUzMgZGlzYWJsZWQuXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtOTAsMTAgKzkzLDggQEAKIAlyZXR1cm4gMTsKIH0KIAotCiBfX3NldHVwKCJhY3BpX3NsZWVwPSIsIGFjcGlfc2xlZXBfc2V0dXApOwogCi0KIHN0YXRpYyBfX2luaXQgaW50IHJlc2V0X3ZpZGVvbW9kZV9hZnRlcl9zMyhzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKIHsKIAlhY3BpX3ZpZGVvX2ZsYWdzIHw9IDI7CkBAIC0xMDEsMTQgKzEwMiwxNCBAQAogfQogCiBzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBhY3Bpc2xlZXBfZG1pX3RhYmxlW10gPSB7Ci0JewkvKiBSZXNldCB2aWRlbyBtb2RlIGFmdGVyIHJldHVybmluZyBmcm9tIEFDUEkgUzMgc2xlZXAgKi8KLQkJLmNhbGxiYWNrID0gcmVzZXRfdmlkZW9tb2RlX2FmdGVyX3MzLAotCQkuaWRlbnQgPSAiVG9zaGliYSBTYXRlbGxpdGUgNDAzMGNkdCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJTNDAzMENEVC80LjMiKSwKLQkJfSwKLQl9LAotCXsgfQorCXsJCQkvKiBSZXNldCB2aWRlbyBtb2RlIGFmdGVyIHJldHVybmluZyBmcm9tIEFDUEkgUzMgc2xlZXAgKi8KKwkgLmNhbGxiYWNrID0gcmVzZXRfdmlkZW9tb2RlX2FmdGVyX3MzLAorCSAuaWRlbnQgPSAiVG9zaGliYSBTYXRlbGxpdGUgNDAzMGNkdCIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUzQwMzBDRFQvNC4zIiksCisJCSAgICAgfSwKKwkgfSwKKwl7fQogfTsKIAogc3RhdGljIGludCBfX2luaXQgYWNwaXNsZWVwX2RtaV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvd2FrZXVwLlMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvd2FrZXVwLlMKaW5kZXggNDRkODg2Yy4uN2M3NGZlMCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3dha2V1cC5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUwpAQCAtMzA0LDEyICszMDQsNiBAQAogCWNhbGwJcmVzdG9yZV9wcm9jZXNzb3Jfc3RhdGUKIAlyZXQKIAotRU5UUlkoZG9fc3VzcGVuZF9sb3dsZXZlbF9zNGJpb3MpCi0JY2FsbCBzYXZlX3Byb2Nlc3Nvcl9zdGF0ZQotCWNhbGwgc2F2ZV9yZWdpc3RlcnMKLQljYWxsIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zCi0JcmV0Ci0KIEFMSUdOCiAjIHNhdmVkIHJlZ2lzdGVycwogc2F2ZWRfZ2R0OgkubG9uZwkwLDAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMKaW5kZXggNDU1M2ZmZC4uOWFkNDNiZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogfQogCiAKLXZvaWQgX19kZXZpbml0IGdldF9jcHVfdmVuZG9yKHN0cnVjdCBjcHVpbmZvX3g4NiAqYywgaW50IGVhcmx5KQorc3RhdGljIHZvaWQgX19kZXZpbml0IGdldF9jcHVfdmVuZG9yKHN0cnVjdCBjcHVpbmZvX3g4NiAqYywgaW50IGVhcmx5KQogewogCWNoYXIgKnYgPSBjLT54ODZfdmVuZG9yX2lkOwogCWludCBpOwpAQCAtNjEzLDggKzYxMyw4IEBACiAJbWVtY3B5KHRocmVhZC0+dGxzX2FycmF5LCAmcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpLAogCQlHRFRfRU5UUllfVExTX0VOVFJJRVMgKiA4KTsKIAotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZ2R0ICUwIiA6IDogIm0iIChjcHVfZ2R0X2Rlc2NyW2NwdV0pKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGlkdCAlMCIgOiA6ICJtIiAoaWR0X2Rlc2NyKSk7CisJbG9hZF9nZHQoJmNwdV9nZHRfZGVzY3JbY3B1XSk7CisJbG9hZF9pZHQoJmlkdF9kZXNjcik7CiAKIAkvKgogCSAqIERlbGV0ZSBOVApAQCAtNjQyLDEyICs2NDIsMTIgQEAKIAlhc20gdm9sYXRpbGUgKCJ4b3JsICVlYXgsICVlYXg7IG1vdmwgJWVheCwgJWZzOyBtb3ZsICVlYXgsICVncyIpOwogCiAJLyogQ2xlYXIgYWxsIDYgZGVidWcgcmVnaXN0ZXJzOiAqLwotCi0jZGVmaW5lIENEKHJlZ2lzdGVyKSBzZXRfZGVidWdyZWcoMCwgcmVnaXN0ZXIpCi0KLQlDRCgwKTsgQ0QoMSk7IENEKDIpOyBDRCgzKTsgLyogbm8gZGI0IGFuZCBkYjUgKi87IENEKDYpOyBDRCg3KTsKLQotI3VuZGVmIENECisJc2V0X2RlYnVncmVnKDAsIDApOworCXNldF9kZWJ1Z3JlZygwLCAxKTsKKwlzZXRfZGVidWdyZWcoMCwgMik7CisJc2V0X2RlYnVncmVnKDAsIDMpOworCXNldF9kZWJ1Z3JlZygwLCA2KTsKKwlzZXRfZGVidWdyZWcoMCwgNyk7CiAKIAkvKgogCSAqIEZvcmNlIEZQVSBpbml0aWFsaXphdGlvbjoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCmluZGV4IDYwYTllNTQuLjgyMmM4Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC01Nyw2ICs1OCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgYWNwaV9jcHVmcmVxX2RyaXZlcjsKIAorc3RhdGljIHVuc2lnbmVkIGludCBhY3BpX3BzdGF0ZV9zdHJpY3Q7CisKIHN0YXRpYyBpbnQKIGFjcGlfcHJvY2Vzc29yX3dyaXRlX3BvcnQoCiAJdTE2CXBvcnQsCkBAIC0xNjMsMzQgKzE2Niw0NCBAQAogCX0KIAogCS8qCi0JICogVGhlbiB3ZSByZWFkIHRoZSAnc3RhdHVzX3JlZ2lzdGVyJyBhbmQgY29tcGFyZSB0aGUgdmFsdWUgd2l0aCB0aGUKLQkgKiB0YXJnZXQgc3RhdGUncyAnc3RhdHVzJyB0byBtYWtlIHN1cmUgdGhlIHRyYW5zaXRpb24gd2FzIHN1Y2Nlc3NmdWwuCi0JICogTm90ZSB0aGF0IHdlJ2xsIHBvbGwgZm9yIHVwIHRvIDFtcyAoMTAwIGN5Y2xlcyBvZiAxMHVzKSBiZWZvcmUKLQkgKiBnaXZpbmcgdXAuCisJICogQXNzdW1lIHRoZSB3cml0ZSB3ZW50IHRocm91Z2ggd2hlbiBhY3BpX3BzdGF0ZV9zdHJpY3QgaXMgbm90IHVzZWQuCisJICogQXMgcmVhZCBzdGF0dXNfcmVnaXN0ZXIgaXMgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiBhbmQgdGhlcmUgCisJICogYXJlIG5vIHNwZWNpZmljIGVycm9yIGNhc2VzIHdoZXJlIGFuIElPIHBvcnQgd3JpdGUgd2lsbCBmYWlsLgogCSAqLworCWlmIChhY3BpX3BzdGF0ZV9zdHJpY3QpIHsKKwkJLyogVGhlbiB3ZSByZWFkIHRoZSAnc3RhdHVzX3JlZ2lzdGVyJyBhbmQgY29tcGFyZSB0aGUgdmFsdWUgCisJCSAqIHdpdGggdGhlIHRhcmdldCBzdGF0ZSdzICdzdGF0dXMnIHRvIG1ha2Ugc3VyZSB0aGUgCisJCSAqIHRyYW5zaXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisJCSAqIE5vdGUgdGhhdCB3ZSdsbCBwb2xsIGZvciB1cCB0byAxbXMgKDEwMCBjeWNsZXMgb2YgMTB1cykgCisJCSAqIGJlZm9yZSBnaXZpbmcgdXAuCisJCSAqLwogCi0JcG9ydCA9IGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuYWRkcmVzczsKLQliaXRfd2lkdGggPSBkYXRhLT5hY3BpX2RhdGEuc3RhdHVzX3JlZ2lzdGVyLmJpdF93aWR0aDsKKwkJcG9ydCA9IGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuYWRkcmVzczsKKwkJYml0X3dpZHRoID0gZGF0YS0+YWNwaV9kYXRhLnN0YXR1c19yZWdpc3Rlci5iaXRfd2lkdGg7CiAKLQlkcHJpbnRrKCJMb29raW5nIGZvciAweCUwOHggZnJvbSBwb3J0IDB4JTA0eFxuIiwKLQkJKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uc3RhdHVzLCBwb3J0KTsKKwkJZHByaW50aygiTG9va2luZyBmb3IgMHglMDh4IGZyb20gcG9ydCAweCUwNHhcbiIsCisJCQkodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW3N0YXRlXS5zdGF0dXMsIHBvcnQpOwogCi0JZm9yIChpPTA7IGk8MTAwOyBpKyspIHsKLQkJcmV0ID0gYWNwaV9wcm9jZXNzb3JfcmVhZF9wb3J0KHBvcnQsIGJpdF93aWR0aCwgJnZhbHVlKTsKLQkJaWYgKHJldCkgewkKLQkJCWRwcmludGsoIkludmFsaWQgcG9ydCB3aWR0aCAweCUwNHhcbiIsIGJpdF93aWR0aCk7Ci0JCQlyZXR2YWwgPSByZXQ7Ci0JCQlnb3RvIG1pZ3JhdGVfZW5kOworCQlmb3IgKGk9MDsgaTwxMDA7IGkrKykgeworCQkJcmV0ID0gYWNwaV9wcm9jZXNzb3JfcmVhZF9wb3J0KHBvcnQsIGJpdF93aWR0aCwgJnZhbHVlKTsKKwkJCWlmIChyZXQpIHsJCisJCQkJZHByaW50aygiSW52YWxpZCBwb3J0IHdpZHRoIDB4JTA0eFxuIiwgYml0X3dpZHRoKTsKKwkJCQlyZXR2YWwgPSByZXQ7CisJCQkJZ290byBtaWdyYXRlX2VuZDsKKwkJCX0KKwkJCWlmICh2YWx1ZSA9PSAodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW3N0YXRlXS5zdGF0dXMpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMTApOwogCQl9Ci0JCWlmICh2YWx1ZSA9PSAodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW3N0YXRlXS5zdGF0dXMpCi0JCQlicmVhazsKLQkJdWRlbGF5KDEwKTsKKwl9IGVsc2UgeworCQlpID0gMDsKKwkJdmFsdWUgPSAodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW3N0YXRlXS5zdGF0dXM7CiAJfQogCiAJLyogbm90aWZ5IGNwdWZyZXEgKi8KIAljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZjcHVmcmVxX2ZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOwogCi0JaWYgKHZhbHVlICE9ICh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbc3RhdGVdLnN0YXR1cykgeworCWlmICh1bmxpa2VseSh2YWx1ZSAhPSAodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW3N0YXRlXS5zdGF0dXMpKSB7CiAJCXVuc2lnbmVkIGludCB0bXAgPSBjcHVmcmVxX2ZyZXFzLm5ldzsKIAkJY3B1ZnJlcV9mcmVxcy5uZXcgPSBjcHVmcmVxX2ZyZXFzLm9sZDsKIAkJY3B1ZnJlcV9mcmVxcy5vbGQgPSB0bXA7CkBAIC01MzcsNiArNTUwLDggQEAKIAlyZXR1cm47CiB9CiAKK21vZHVsZV9wYXJhbShhY3BpX3BzdGF0ZV9zdHJpY3QsIHVpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhhY3BpX3BzdGF0ZV9zdHJpY3QsICJ2YWx1ZSAwIG9yIG5vbi16ZXJvLiBub24temVybyAtPiBzdHJpY3QgQUNQSSBjaGVja3MgYXJlIHBlcmZvcm1lZCBkdXJpbmcgZnJlcXVlbmN5IGNoYW5nZXMuIik7CiAKIGxhdGVfaW5pdGNhbGwoYWNwaV9jcHVmcmVxX2luaXQpOwogbW9kdWxlX2V4aXQoYWNwaV9jcHVmcmVxX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCmluZGV4IDA0ZTM1NjNkLi44ZWYzODU0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCkBAIC02NCw4ICs2NCw2IEBACiAjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgImxvbmdoYXVsIiwgbXNnKQogCiAKLSNkZWZpbmUgX19obHQoKSAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImhsdCI6IDogOiJtZW1vcnkiKQotCiAvKiBDbG9jayByYXRpb3MgbXVsdGlwbGllZCBieSAxMCAqLwogc3RhdGljIGludCBjbG9ja19yYXRpb1szMl07CiBzdGF0aWMgaW50IGVibGNyX3RhYmxlWzMyXTsKQEAgLTE2OCwxMSArMTY2LDkgQEAKIAlvdXRiKDB4RkUsMHgyMSk7CS8qIFRNUjAgb25seSAqLwogCW91dGIoMHhGRiwweDgwKTsJLyogZGVsYXkgKi8KIAotCWxvY2FsX2lycV9lbmFibGUoKTsKLQotCV9faGx0KCk7CisJc2FmZV9oYWx0KCk7CiAJd3Jtc3JsKE1TUl9WSUFfTE9OR0hBVUwsIGxvbmdoYXVsLT52YWwpOwotCV9faGx0KCk7CisJaGFsdCgpOwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIApAQCAtMjUxLDkgKzI0Nyw3IEBACiAJCWJjcjIuYml0cy5DTE9DS01VTCA9IGNsb2NrX3JhdGlvX2luZGV4OwogCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQl3cm1zcmwgKE1TUl9WSUFfQkNSMiwgYmNyMi52YWwpOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0KLQkJX19obHQoKTsKKwkJc2FmZV9oYWx0KCk7CiAKIAkJLyogRGlzYWJsZSBzb2Z0d2FyZSBjbG9jayBtdWx0aXBsaWVyICovCiAJCXJkbXNybCAoTVNSX1ZJQV9CQ1IyLCBiY3IyLnZhbCk7CkBAIC00NzMsMTEgKzQ2NywxMSBAQAogCX0KIAogCWlmICh2cm1yZXY9PTApIHsKLQkJZHByaW50ayAoIlZSTSA4LjUgXG4iKTsKKwkJZHByaW50ayAoIlZSTSA4LjVcbiIpOwogCQltZW1jcHkgKHZvbHRhZ2VfdGFibGUsIHZybTg1c2NhbGVzLCBzaXplb2Yodm9sdGFnZV90YWJsZSkpOwogCQludW12c2NhbGVzID0gKHZvbHRhZ2VfdGFibGVbbWF4dmlkXS12b2x0YWdlX3RhYmxlW21pbnZpZF0pLzI1OwogCX0gZWxzZSB7Ci0JCWRwcmludGsgKCJNb2JpbGUgVlJNIFxuIik7CisJCWRwcmludGsgKCJNb2JpbGUgVlJNXG4iKTsKIAkJbWVtY3B5ICh2b2x0YWdlX3RhYmxlLCBtb2JpbGV2cm1zY2FsZXMsIHNpemVvZih2b2x0YWdlX3RhYmxlKSk7CiAJCW51bXZzY2FsZXMgPSAodm9sdGFnZV90YWJsZVttYXh2aWRdLXZvbHRhZ2VfdGFibGVbbWludmlkXSkvNTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYwppbmRleCAzMjdhNTVkLi5jMzk3YjYyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKQEAgLTI1OSw3ICsyNTksNyBAQAogCiAJaWYgKG1vZGVsLT5vcF9wb2ludHMgPT0gTlVMTCkgewogCQkvKiBNYXRjaGVkIGEgbm9uLW1hdGNoICovCi0JCWRwcmludGsoS0VSTl9JTkZPIFBGWCAibm8gdGFibGUgc3VwcG9ydCBmb3IgQ1BVIG1vZGVsIFwiJXNcIjogXG4iLAorCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIm5vIHRhYmxlIHN1cHBvcnQgZm9yIENQVSBtb2RlbCBcIiVzXCJcbiIsCiAJCSAgICAgICBjcHUtPng4Nl9tb2RlbF9pZCk7CiAjaWZuZGVmIENPTkZJR19YODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkKIAkJZHByaW50ayhLRVJOX0lORk8gUEZYICJ0cnkgY29tcGlsaW5nIHdpdGggQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fQUNQSSBlbmFibGVkXG4iKTsKQEAgLTQwMiw3ICs0MDIsNyBAQAogCiAJZm9yIChpPTA7IGk8cC5zdGF0ZV9jb3VudDsgaSsrKSB7CiAJCWlmIChwLnN0YXRlc1tpXS5jb250cm9sICE9IHAuc3RhdGVzW2ldLnN0YXR1cykgewotCQkJZHByaW50aygiRGlmZmVyZW50IGNvbnRyb2wgKCV4KSBhbmQgc3RhdHVzIHZhbHVlcyAoJXgpXG4iLAorCQkJZHByaW50aygiRGlmZmVyZW50IGNvbnRyb2wgKCVsbHUpIGFuZCBzdGF0dXMgdmFsdWVzICglbGx1KVxuIiwKIAkJCQlwLnN0YXRlc1tpXS5jb250cm9sLCBwLnN0YXRlc1tpXS5zdGF0dXMpOwogCQkJcmVzdWx0ID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyX3VucmVnOwpAQCAtNDE1LDcgKzQxNSw3IEBACiAJCX0KIAogCQlpZiAocC5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgPiBwLnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSkgewotCQkJZHByaW50aygiUCV1IGhhcyBsYXJnZXIgZnJlcXVlbmN5ICgldSkgdGhhbiBQMCAoJXUpLCBza2lwcGluZ1xuIiwgaSwKKwkJCWRwcmludGsoIlAldSBoYXMgbGFyZ2VyIGZyZXF1ZW5jeSAoJWxsdSkgdGhhbiBQMCAoJWxsdSksIHNraXBwaW5nXG4iLCBpLAogCQkJCXAuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5LCBwLnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSk7CiAJCQlwLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSA9IDA7CiAJCQljb250aW51ZTsKQEAgLTQ5OCwxMyArNDk4LDYgQEAKIAlpZiAoY3B1LT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwgfHwgIWNwdV9oYXMoY3B1LCBYODZfRkVBVFVSRV9FU1QpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWZvciAoaSA9IDA7IGkgPCBOX0lEUzsgaSsrKQotCQlpZiAoY2VudHJpbm9fdmVyaWZ5X2NwdV9pZChjcHUsICZjcHVfaWRzW2ldKSkKLQkJCWJyZWFrOwotCi0JaWYgKGkgIT0gTl9JRFMpCi0JCWNlbnRyaW5vX2NwdVtwb2xpY3ktPmNwdV0gPSAmY3B1X2lkc1tpXTsKLQogCWlmIChpc19jb25zdF9sb29wc19jcHUocG9saWN5LT5jcHUpKSB7CiAJCWNlbnRyaW5vX2RyaXZlci5mbGFncyB8PSBDUFVGUkVRX0NPTlNUX0xPT1BTOwogCX0KQEAgLTUxMyw2ICs1MDYsMTMgQEAKIAkJaWYgKHBvbGljeS0+Y3B1ICE9IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAorCQlmb3IgKGkgPSAwOyBpIDwgTl9JRFM7IGkrKykKKwkJCWlmIChjZW50cmlub192ZXJpZnlfY3B1X2lkKGNwdSwgJmNwdV9pZHNbaV0pKQorCQkJCWJyZWFrOworCisJCWlmIChpICE9IE5fSURTKQorCQkJY2VudHJpbm9fY3B1W3BvbGljeS0+Y3B1XSA9ICZjcHVfaWRzW2ldOworCiAJCWlmICghY2VudHJpbm9fY3B1W3BvbGljeS0+Y3B1XSkgewogCQkJZHByaW50ayhLRVJOX0lORk8gUEZYICJmb3VuZCB1bnN1cHBvcnRlZCBDUFUgd2l0aCAiCiAJCQkiRW5oYW5jZWQgU3BlZWRTdGVwOiBzZW5kIC9wcm9jL2NwdWluZm8gdG8gIgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1zbWkuYwppbmRleCBiMjVmYjZiLi4yNzE4ZmI2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1zbWkuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1zbWkuYwpAQCAtOTksNyArOTksNyBAQAogCXUzMiBmdW5jdGlvbiA9IEdFVF9TUEVFRFNURVBfRlJFUVM7CiAKIAlpZiAoIShpc3RfaW5mby5ldmVudCAmIDB4RkZGRikpIHsKLQkJZHByaW50aygiYnVnICMxNDIyIC0tIGNhbid0IHJlYWQgZnJlcXMgZnJvbSBCSU9TXG4iLCByZXN1bHQpOworCQlkcHJpbnRrKCJidWcgIzE0MjIgLS0gY2FuJ3QgcmVhZCBmcmVxcyBmcm9tIEJJT1NcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2N5cml4LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jeXJpeC5jCmluZGV4IGJhNGIwMTEuLmZmODdjYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2N5cml4LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3lyaXguYwpAQCAtMTMyLDExICsxMzIsNyBAQAogCXNldEN4ODYoQ1g4Nl9DQ1IyLCBnZXRDeDg2KENYODZfQ0NSMikgJiB+MHgwNCk7CiAJLyogc2V0ICdOb3QgV3JpdGUtdGhyb3VnaCcgKi8KIAljcjAgPSAweDIwMDAwMDAwOwotCV9fYXNtX18oIm1vdmwgJSVjcjAsJSVlYXhcblx0IgotCQkib3JsICUwLCUlZWF4XG5cdCIKLQkJIm1vdmwgJSVlYXgsJSVjcjBcbiIKLQkJOiA6ICJyIiAoY3IwKQotCQk6ImF4Iik7CisJd3JpdGVfY3IwKHJlYWRfY3IwKCkgfCBjcjApOwogCS8qIENDUjIgYml0IDI6IGxvY2sgTlcgYml0IGFuZCBzZXQgV1QxICovCiAJc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSB8IDB4MTQgKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbC5jCmluZGV4IGEyYzMzYzEuLjQzNjAxZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYwpAQCAtODIsMTYgKzgyLDEzIEBACiAgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IG51bV9jcHVfY29yZXMoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewotCXVuc2lnbmVkIGludCBlYXg7CisJdW5zaWduZWQgaW50IGVheCwgZWJ4LCBlY3gsIGVkeDsKIAogCWlmIChjLT5jcHVpZF9sZXZlbCA8IDQpCiAJCXJldHVybiAxOwogCi0JX19hc21fXygiY3B1aWQiCi0JCTogIj1hIiAoZWF4KQotCQk6ICIwIiAoNCksICJjIiAoMCkKLQkJOiAiYngiLCAiZHgiKTsKLQorCS8qIEludGVsIGhhcyBhIG5vbi1zdGFuZGFyZCBkZXBlbmRlbmN5IG9uICVlY3ggZm9yIHRoaXMgQ1BVSUQgbGV2ZWwuICovCisJY3B1aWRfY291bnQoNCwgMCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CiAJaWYgKGVheCAmIDB4MWYpCiAJCXJldHVybiAoKGVheCA+PiAyNikgKyAxKTsKIAllbHNlCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCmluZGV4IDZjNTViNTAuLjllMGQ1ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCkBAIC0zMDUsNiArMzA1LDkgQEAKIHsKIAlzdHJ1Y3QgX2NwdWlkNF9pbmZvCSp0aGlzX2xlYWY7CiAJdW5zaWduZWQgbG9uZyBudW1fdGhyZWFkc19zaGFyaW5nOworI2lmZGVmIENPTkZJR19YODZfSFQKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YSArIGNwdTsKKyNlbmRpZgogCiAJdGhpc19sZWFmID0gQ1BVSUQ0X0lORk9fSURYKGNwdSwgaW5kZXgpOwogCW51bV90aHJlYWRzX3NoYXJpbmcgPSAxICsgdGhpc19sZWFmLT5lYXguc3BsaXQubnVtX3RocmVhZHNfc2hhcmluZzsKQEAgLTMxNCwxMCArMzE3LDEyIEBACiAjaWZkZWYgQ09ORklHX1g4Nl9IVAogCWVsc2UgaWYgKG51bV90aHJlYWRzX3NoYXJpbmcgPT0gc21wX251bV9zaWJsaW5ncykKIAkJdGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCA9IGNwdV9zaWJsaW5nX21hcFtjcHVdOwotI2VuZGlmCisJZWxzZSBpZiAobnVtX3RocmVhZHNfc2hhcmluZyA9PSAoYy0+eDg2X251bV9jb3JlcyAqIHNtcF9udW1fc2libGluZ3MpKQorCQl0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwID0gY3B1X2NvcmVfbWFwW2NwdV07CiAJZWxzZQotCQlwcmludGsoS0VSTl9JTkZPICJOdW1iZXIgb2YgQ1BVcyBzaGFyaW5nIGNhY2hlIGRpZG4ndCBtYXRjaCAiCisJCXByaW50ayhLRVJOX0RFQlVHICJOdW1iZXIgb2YgQ1BVcyBzaGFyaW5nIGNhY2hlIGRpZG4ndCBtYXRjaCAiCiAJCQkJImFueSBrbm93biBzZXQgb2YgQ1BVc1xuIik7CisjZW5kaWYKIH0KICNlbHNlCiBzdGF0aWMgdm9pZCBfX2luaXQgY2FjaGVfc2hhcmVkX2NwdV9tYXBfc2V0dXAodW5zaWduZWQgaW50IGNwdSwgaW50IGluZGV4KSB7fQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYwppbmRleCA3NjRjYWM2Li5kZDRlYmQ2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYwpAQCAtNTYxLDcgKzU2MSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbXRycl92YWx1ZSAqIG10cnJfc3RhdGU7CiAKLXN0YXRpYyBpbnQgbXRycl9zYXZlKHN0cnVjdCBzeXNfZGV2aWNlICogc3lzZGV2LCB1MzIgc3RhdGUpCitzdGF0aWMgaW50IG10cnJfc2F2ZShzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCWludCBpOwogCWludCBzaXplID0gbnVtX3Zhcl9yYW5nZXMgKiBzaXplb2Yoc3RydWN0IG10cnJfdmFsdWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcmFzaC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcmFzaC5jCmluZGV4IGU1ZmFiMTIuLjkxM2JlNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3Jhc2guYworKysgYi9hcmNoL2kzODYva2VybmVsL2NyYXNoLmMKQEAgLTE1Myw3ICsxNTMsNyBAQAogCWRpc2FibGVfbG9jYWxfQVBJQygpOwogCWF0b21pY19kZWMoJndhaXRpbmdfZm9yX2NyYXNoX2lwaSk7CiAJLyogQXNzdW1lIGhsdCB3b3JrcyAqLwotCV9fYXNtX18oImhsdCIpOworCWhhbHQoKTsKIAlmb3IoOzspOwogCiAJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMgYi9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMKaW5kZXggYTNjZGY4OS4uNTg1MTZlMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9kbWlfc2Nhbi5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZG1pX3NjYW4uYwpAQCAtNiwzMiArNiwyOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KIAogCi1zdHJ1Y3QgZG1pX2hlYWRlciB7Ci0JdTggdHlwZTsKLQl1OCBsZW5ndGg7Ci0JdTE2IGhhbmRsZTsKLX07Ci0KLSN1bmRlZiBETUlfREVCVUcKLQotI2lmZGVmIERNSV9ERUJVRwotI2RlZmluZSBkbWlfcHJpbnRrKHgpIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBkbWlfcHJpbnRrKHgpCi0jZW5kaWYKLQogc3RhdGljIGNoYXIgKiBfX2luaXQgZG1pX3N0cmluZyhzdHJ1Y3QgZG1pX2hlYWRlciAqZG0sIHU4IHMpCiB7CiAJdTggKmJwID0gKCh1OCAqKSBkbSkgKyBkbS0+bGVuZ3RoOworCWNoYXIgKnN0ciA9ICIiOwogCi0JaWYgKCFzKQotCQlyZXR1cm4gIiI7Ci0Jcy0tOwotCXdoaWxlIChzID4gMCAmJiAqYnApIHsKLQkJYnAgKz0gc3RybGVuKGJwKSArIDE7CisJaWYgKHMpIHsKIAkJcy0tOwotCX0KLQlyZXR1cm4gYnA7CisJCXdoaWxlIChzID4gMCAmJiAqYnApIHsKKwkJCWJwICs9IHN0cmxlbihicCkgKyAxOworCQkJcy0tOworCQl9CisKKwkJaWYgKCpicCAhPSAwKSB7CisJCQlzdHIgPSBhbGxvY19ib290bWVtKHN0cmxlbihicCkgKyAxKTsKKwkJCWlmIChzdHIgIT0gTlVMTCkKKwkJCQlzdHJjcHkoc3RyLCBicCk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fRVJSICJkbWlfc3RyaW5nOiBvdXQgb2YgbWVtb3J5LlxuIik7CisJCX0KKyAJfQorCisJcmV0dXJuIHN0cjsKIH0KIAogLyoKQEAgLTg0LDcgKzgwLDExMSBAQAogCXJldHVybiBzdW0gPT0gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZG1pX2l0ZXJhdGUodm9pZCAoKmRlY29kZSkoc3RydWN0IGRtaV9oZWFkZXIgKikpCitzdGF0aWMgY2hhciAqZG1pX2lkZW50W0RNSV9TVFJJTkdfTUFYXTsKK3N0YXRpYyBMSVNUX0hFQUQoZG1pX2RldmljZXMpOworCisvKgorICoJU2F2ZSBhIERNSSBzdHJpbmcKKyAqLworc3RhdGljIHZvaWQgX19pbml0IGRtaV9zYXZlX2lkZW50KHN0cnVjdCBkbWlfaGVhZGVyICpkbSwgaW50IHNsb3QsIGludCBzdHJpbmcpCit7CisJY2hhciAqcCwgKmQgPSAoY2hhciopIGRtOworCisJaWYgKGRtaV9pZGVudFtzbG90XSkKKwkJcmV0dXJuOworCisJcCA9IGRtaV9zdHJpbmcoZG0sIGRbc3RyaW5nXSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZG1pX2lkZW50W3Nsb3RdID0gcDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGRtaV9zYXZlX2RldmljZXMoc3RydWN0IGRtaV9oZWFkZXIgKmRtKQoreworCWludCBpLCBjb3VudCA9IChkbS0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBkbWlfaGVhZGVyKSkgLyAyOworCXN0cnVjdCBkbWlfZGV2aWNlICpkZXY7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQljaGFyICpkID0gKChjaGFyICopIGRtKSArIChpICogMik7CisKKwkJLyogU2tpcCBkaXNhYmxlZCBkZXZpY2UgKi8KKwkJaWYgKCgqZCAmIDB4ODApID09IDApCisJCQljb250aW51ZTsKKworCQlkZXYgPSBhbGxvY19ib290bWVtKHNpemVvZigqZGV2KSk7CisJCWlmICghZGV2KSB7CisJCQlwcmludGsoS0VSTl9FUlIgImRtaV9zYXZlX2RldmljZXM6IG91dCBvZiBtZW1vcnkuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGV2LT50eXBlID0gKmQrKyAmIDB4N2Y7CisJCWRldi0+bmFtZSA9IGRtaV9zdHJpbmcoZG0sICpkKTsKKwkJZGV2LT5kZXZpY2VfZGF0YSA9IE5VTEw7CisKKwkJbGlzdF9hZGQoJmRldi0+bGlzdCwgJmRtaV9kZXZpY2VzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkbWlfc2F2ZV9pcG1pX2RldmljZShzdHJ1Y3QgZG1pX2hlYWRlciAqZG0pCit7CisJc3RydWN0IGRtaV9kZXZpY2UgKmRldjsKKwl2b2lkICogZGF0YTsKKworCWRhdGEgPSBhbGxvY19ib290bWVtKGRtLT5sZW5ndGgpOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWlfc2F2ZV9pcG1pX2RldmljZTogb3V0IG9mIG1lbW9yeS5cbiIpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KGRhdGEsIGRtLCBkbS0+bGVuZ3RoKTsKKworCWRldiA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKCpkZXYpKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgImRtaV9zYXZlX2lwbWlfZGV2aWNlOiBvdXQgb2YgbWVtb3J5LlxuIik7CisJCXJldHVybjsKKwl9CisKKwlkZXYtPnR5cGUgPSBETUlfREVWX1RZUEVfSVBNSTsKKwlkZXYtPm5hbWUgPSAiSVBNSSBjb250cm9sbGVyIjsKKwlkZXYtPmRldmljZV9kYXRhID0gZGF0YTsKKworCWxpc3RfYWRkKCZkZXYtPmxpc3QsICZkbWlfZGV2aWNlcyk7Cit9CisKKy8qCisgKglQcm9jZXNzIGEgRE1JIHRhYmxlIGVudHJ5LiBSaWdodCBub3cgYWxsIHdlIGNhcmUgYWJvdXQgYXJlIHRoZSBCSU9TCisgKglhbmQgbWFjaGluZSBlbnRyaWVzLiBGb3IgMi41IHdlIHNob3VsZCBwdWxsIHRoZSBzbWJ1cyBjb250cm9sbGVyIGluZm8KKyAqCW91dCBvZiBoZXJlLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgZG1pX2RlY29kZShzdHJ1Y3QgZG1pX2hlYWRlciAqZG0pCit7CisJc3dpdGNoKGRtLT50eXBlKSB7CisJY2FzZSAwOgkJLyogQklPUyBJbmZvcm1hdGlvbiAqLworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JJT1NfVkVORE9SLCA0KTsKKwkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CSU9TX1ZFUlNJT04sIDUpOworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JJT1NfREFURSwgOCk7CisJCWJyZWFrOworCWNhc2UgMToJCS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAqLworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX1NZU19WRU5ET1IsIDQpOworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX1BST0RVQ1RfTkFNRSwgNSk7CisJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfUFJPRFVDVF9WRVJTSU9OLCA2KTsKKwkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9QUk9EVUNUX1NFUklBTCwgNyk7CisJCWJyZWFrOworCWNhc2UgMjoJCS8qIEJhc2UgQm9hcmQgSW5mb3JtYXRpb24gKi8KKwkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CT0FSRF9WRU5ET1IsIDQpOworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JPQVJEX05BTUUsIDUpOworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JPQVJEX1ZFUlNJT04sIDYpOworCQlicmVhazsKKwljYXNlIDEwOgkvKiBPbmJvYXJkIERldmljZXMgSW5mb3JtYXRpb24gKi8KKwkJZG1pX3NhdmVfZGV2aWNlcyhkbSk7CisJCWJyZWFrOworCWNhc2UgMzg6CS8qIElQTUkgRGV2aWNlIEluZm9ybWF0aW9uICovCisJCWRtaV9zYXZlX2lwbWlfZGV2aWNlKGRtKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IGRtaV9zY2FuX21hY2hpbmUodm9pZCkKIHsKIAl1OCBidWZbMTVdOwogCWNoYXIgX19pb21lbSAqcCwgKnE7CkBAIC05Niw3ICsxOTYsNyBAQAogCSAqLwogCXAgPSBpb3JlbWFwKDB4RjAwMDAsIDB4MTAwMDApOwogCWlmIChwID09IE5VTEwpCi0JCXJldHVybiAtMTsKKwkJZ290byBvdXQ7CiAKIAlmb3IgKHEgPSBwOyBxIDwgcCArIDB4MTAwMDA7IHEgKz0gMTYpIHsKIAkJbWVtY3B5X2Zyb21pbyhidWYsIHEsIDE1KTsKQEAgLTExNiw4MiArMjE2LDEyIEBACiAJCQllbHNlCiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1JIHByZXNlbnQuXG4iKTsKIAotCQkJZG1pX3ByaW50aygoS0VSTl9JTkZPICIlZCBzdHJ1Y3R1cmVzIG9jY3VweWluZyAlZCBieXRlcy5cbiIsCi0JCQkJbnVtLCBsZW4pKTsKLQkJCWRtaV9wcmludGsoKEtFUk5fSU5GTyAiRE1JIHRhYmxlIGF0IDB4JTA4WC5cbiIsIGJhc2UpKTsKLQotCQkJaWYgKGRtaV90YWJsZShiYXNlLGxlbiwgbnVtLCBkZWNvZGUpID09IDApCi0JCQkJcmV0dXJuIDA7CisJCQlpZiAoZG1pX3RhYmxlKGJhc2UsbGVuLCBudW0sIGRtaV9kZWNvZGUpID09IDApCisJCQkJcmV0dXJuOwogCQl9CiAJfQotCXJldHVybiAtMTsKLX0KIAotc3RhdGljIGNoYXIgKmRtaV9pZGVudFtETUlfU1RSSU5HX01BWF07Ci0KLS8qCi0gKglTYXZlIGEgRE1JIHN0cmluZwotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgZG1pX3NhdmVfaWRlbnQoc3RydWN0IGRtaV9oZWFkZXIgKmRtLCBpbnQgc2xvdCwgaW50IHN0cmluZykKLXsKLQljaGFyICpkID0gKGNoYXIqKWRtOwotCWNoYXIgKnAgPSBkbWlfc3RyaW5nKGRtLCBkW3N0cmluZ10pOwotCi0JaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSAwKQotCQlyZXR1cm47Ci0JaWYgKGRtaV9pZGVudFtzbG90XSkKLQkJcmV0dXJuOwotCi0JZG1pX2lkZW50W3Nsb3RdID0gYWxsb2NfYm9vdG1lbShzdHJsZW4ocCkgKyAxKTsKLQlpZihkbWlfaWRlbnRbc2xvdF0pCi0JCXN0cmNweShkbWlfaWRlbnRbc2xvdF0sIHApOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fRVJSICJkbWlfc2F2ZV9pZGVudDogb3V0IG9mIG1lbW9yeS5cbiIpOwotfQotCi0vKgotICoJUHJvY2VzcyBhIERNSSB0YWJsZSBlbnRyeS4gUmlnaHQgbm93IGFsbCB3ZSBjYXJlIGFib3V0IGFyZSB0aGUgQklPUwotICoJYW5kIG1hY2hpbmUgZW50cmllcy4gRm9yIDIuNSB3ZSBzaG91bGQgcHVsbCB0aGUgc21idXMgY29udHJvbGxlciBpbmZvCi0gKglvdXQgb2YgaGVyZS4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IGRtaV9kZWNvZGUoc3RydWN0IGRtaV9oZWFkZXIgKmRtKQotewotCXU4ICpkYXRhIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSA9ICh1OCAqKWRtOwotCQotCXN3aXRjaChkbS0+dHlwZSkgewotCWNhc2UgIDA6Ci0JCWRtaV9wcmludGsoKCJCSU9TIFZlbmRvcjogJXNcbiIsIGRtaV9zdHJpbmcoZG0sIGRhdGFbNF0pKSk7Ci0JCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfQklPU19WRU5ET1IsIDQpOwotCQlkbWlfcHJpbnRrKCgiQklPUyBWZXJzaW9uOiAlc1xuIiwgZG1pX3N0cmluZyhkbSwgZGF0YVs1XSkpKTsKLQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CSU9TX1ZFUlNJT04sIDUpOwotCQlkbWlfcHJpbnRrKCgiQklPUyBSZWxlYXNlOiAlc1xuIiwgZG1pX3N0cmluZyhkbSwgZGF0YVs4XSkpKTsKLQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CSU9TX0RBVEUsIDgpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWRtaV9wcmludGsoKCJTeXN0ZW0gVmVuZG9yOiAlc1xuIiwgZG1pX3N0cmluZyhkbSwgZGF0YVs0XSkpKTsKLQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9TWVNfVkVORE9SLCA0KTsKLQkJZG1pX3ByaW50aygoIlByb2R1Y3QgTmFtZTogJXNcbiIsIGRtaV9zdHJpbmcoZG0sIGRhdGFbNV0pKSk7Ci0JCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfUFJPRFVDVF9OQU1FLCA1KTsKLQkJZG1pX3ByaW50aygoIlZlcnNpb246ICVzXG4iLCBkbWlfc3RyaW5nKGRtLCBkYXRhWzZdKSkpOwotCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX1BST0RVQ1RfVkVSU0lPTiwgNik7Ci0JCWRtaV9wcmludGsoKCJTZXJpYWwgTnVtYmVyOiAlc1xuIiwgZG1pX3N0cmluZyhkbSwgZGF0YVs3XSkpKTsKLQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9QUk9EVUNUX1NFUklBTCwgNyk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJZG1pX3ByaW50aygoIkJvYXJkIFZlbmRvcjogJXNcbiIsIGRtaV9zdHJpbmcoZG0sIGRhdGFbNF0pKSk7Ci0JCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfQk9BUkRfVkVORE9SLCA0KTsKLQkJZG1pX3ByaW50aygoIkJvYXJkIE5hbWU6ICVzXG4iLCBkbWlfc3RyaW5nKGRtLCBkYXRhWzVdKSkpOwotCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JPQVJEX05BTUUsIDUpOwotCQlkbWlfcHJpbnRrKCgiQm9hcmQgVmVyc2lvbjogJXNcbiIsIGRtaV9zdHJpbmcoZG0sIGRhdGFbNl0pKSk7Ci0JCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfQk9BUkRfVkVSU0lPTiwgNik7Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBfX2luaXQgZG1pX3NjYW5fbWFjaGluZSh2b2lkKQotewotCWlmIChkbWlfaXRlcmF0ZShkbWlfZGVjb2RlKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1JIG5vdCBwcmVzZW50LlxuIik7CitvdXQ6CXByaW50ayhLRVJOX0lORk8gIkRNSSBub3QgcHJlc2VudC5cbiIpOwogfQogCiAKQEAgLTIxOCw5ICsyNDgsOSBAQAogCQkJLyogTm8gbWF0Y2ggKi8KIAkJCWdvdG8gZmFpbDsKIAkJfQorCQljb3VudCsrOwogCQlpZiAoZC0+Y2FsbGJhY2sgJiYgZC0+Y2FsbGJhY2soZCkpCiAJCQlicmVhazsKLQkJY291bnQrKzsKIGZhaWw6CQlkKys7CiAJfQogCkBAIC0yNDAsMyArMjcwLDMyIEBACiAJcmV0dXJuIGRtaV9pZGVudFtmaWVsZF07CiB9CiBFWFBPUlRfU1lNQk9MKGRtaV9nZXRfc3lzdGVtX2luZm8pOworCisvKioKKyAqCWRtaV9maW5kX2RldmljZSAtIGZpbmQgb25ib2FyZCBkZXZpY2UgYnkgdHlwZS9uYW1lCisgKglAdHlwZTogZGV2aWNlIHR5cGUgb3IgJURNSV9ERVZfVFlQRV9BTlkgdG8gbWF0Y2ggYWxsIGRldmljZSB0eXBlcworICoJQGRlc2M6IGRldmljZSBuYW1lIHN0cmluZyBvciAlTlVMTCB0byBtYXRjaCBhbGwKKyAqCUBmcm9tOiBwcmV2aW91cyBkZXZpY2UgZm91bmQgaW4gc2VhcmNoLCBvciAlTlVMTCBmb3IgbmV3IHNlYXJjaC4KKyAqCisgKglJdGVyYXRlcyB0aHJvdWdoIHRoZSBsaXN0IG9mIGtub3duIG9uYm9hcmQgZGV2aWNlcy4gSWYgYSBkZXZpY2UgaXMKKyAqCWZvdW5kIHdpdGggYSBtYXRjaGluZyBAdmVuZG9yIGFuZCBAZGV2aWNlLCBhIHBvaW50ZXIgdG8gaXRzIGRldmljZQorICoJc3RydWN0dXJlIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCAlTlVMTCBpcyByZXR1cm5lZC4KKyAqCUEgbmV3IHNlYXJjaCBpcyBpbml0aWF0ZWQgYnkgcGFzc2luZyAlTlVMTCB0byB0aGUgQGZyb20gYXJndW1lbnQuCisgKglJZiBAZnJvbSBpcyBub3QgJU5VTEwsIHNlYXJjaGVzIGNvbnRpbnVlIGZyb20gbmV4dCBkZXZpY2UuCisgKi8KK3N0cnVjdCBkbWlfZGV2aWNlICogZG1pX2ZpbmRfZGV2aWNlKGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICBzdHJ1Y3QgZG1pX2RldmljZSAqZnJvbSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpkLCAqaGVhZCA9IGZyb20gPyAmZnJvbS0+bGlzdCA6ICZkbWlfZGV2aWNlczsKKworCWZvcihkID0gaGVhZC0+bmV4dDsgZCAhPSAmZG1pX2RldmljZXM7IGQgPSBkLT5uZXh0KSB7CisJCXN0cnVjdCBkbWlfZGV2aWNlICpkZXYgPSBsaXN0X2VudHJ5KGQsIHN0cnVjdCBkbWlfZGV2aWNlLCBsaXN0KTsKKworCQlpZiAoKCh0eXBlID09IERNSV9ERVZfVFlQRV9BTlkpIHx8IChkZXYtPnR5cGUgPT0gdHlwZSkpICYmCisJCSAgICAoKG5hbWUgPT0gTlVMTCkgfHwgKHN0cmNtcChkZXYtPm5hbWUsIG5hbWUpID09IDApKSkKKwkJCXJldHVybiBkZXY7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGRtaV9maW5kX2RldmljZSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2RvdWJsZWZhdWx0LmMgYi9hcmNoL2kzODYva2VybmVsL2RvdWJsZWZhdWx0LmMKaW5kZXggNzg5YWYzZS4uNWVkYjFkMyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9kb3VibGVmYXVsdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZG91YmxlZmF1bHQuYwpAQCAtMjAsNyArMjAsNyBAQAogCXN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgZ2R0X2Rlc2MgPSB7MCwgMH07CiAJdW5zaWduZWQgbG9uZyBnZHQsIHRzczsKIAotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzZ2R0ICUwIjogIj1tIiAoZ2R0X2Rlc2MpOiA6Im1lbW9yeSIpOworCXN0b3JlX2dkdCgmZ2R0X2Rlc2MpOwogCWdkdCA9IGdkdF9kZXNjLmFkZHJlc3M7CiAKIAlwcmludGsoImRvdWJsZSBmYXVsdCwgZ2R0IGF0ICUwOGx4IFslZCBieXRlc11cbiIsIGdkdCwgZ2R0X2Rlc2Muc2l6ZSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2VmaS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9lZmkuYwppbmRleCAzODU4ODNlLi5lY2FkNTE5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2VmaS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZWZpLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAkgKiBkaXJlY3RvcnkuIElmIEkgaGF2ZSBQU0UsIEkganVzdCBuZWVkIHRvIGR1cGxpY2F0ZSBvbmUgZW50cnkgaW4KIAkgKiBwYWdlIGRpcmVjdG9yeS4KIAkgKi8KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlJWNyNCwgJTAiOiI9ciIoY3I0KSk7CisJY3I0ID0gcmVhZF9jcjQoKTsKIAogCWlmIChjcjQgJiBYODZfQ1I0X1BTRSkgewogCQllZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzBdLnBnZCA9CkBAIC0xMDQsOCArMTA0LDcgQEAKIAlsb2NhbF9mbHVzaF90bGIoKTsKIAogCWNwdV9nZHRfZGVzY3JbMF0uYWRkcmVzcyA9IF9fcGEoY3B1X2dkdF9kZXNjclswXS5hZGRyZXNzKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGdkdCAlMCI6Ij1tIgotCQkJICAgICgqKHN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgKikgX19wYSgmY3B1X2dkdF9kZXNjclswXSkpKTsKKwlsb2FkX2dkdCgoc3RydWN0IFhndF9kZXNjX3N0cnVjdCAqKSBfX3BhKCZjcHVfZ2R0X2Rlc2NyWzBdKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGVmaV9jYWxsX3BoeXNfZXBpbG9nKHZvaWQpCkBAIC0xMTQsOCArMTEzLDggQEAKIAogCWNwdV9nZHRfZGVzY3JbMF0uYWRkcmVzcyA9CiAJCSh1bnNpZ25lZCBsb25nKSBfX3ZhKGNwdV9nZHRfZGVzY3JbMF0uYWRkcmVzcyk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oImxnZHQgJTAiOiI9bSIoY3B1X2dkdF9kZXNjcikpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlY3I0LCAlMCI6Ij1yIihjcjQpKTsKKwlsb2FkX2dkdCgmY3B1X2dkdF9kZXNjclswXSk7CisJY3I0ID0gcmVhZF9jcjQoKTsKIAogCWlmIChjcjQgJiBYODZfQ1I0X1BTRSkgewogCQlzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMCldLnBnZCA9CkBAIC0yMzMsMjIgKzIzMiwyMyBAQAogewogCW1lbW1hcC5tYXAgPSBOVUxMOwogCi0JbWVtbWFwLm1hcCA9IChlZmlfbWVtb3J5X2Rlc2NfdCAqKQotCQlidF9pb3JlbWFwKCh1bnNpZ25lZCBsb25nKSBtZW1tYXAucGh5c19tYXAsCi0JCQkobWVtbWFwLm5yX21hcCAqIHNpemVvZihlZmlfbWVtb3J5X2Rlc2NfdCkpKTsKLQorCW1lbW1hcC5tYXAgPSBidF9pb3JlbWFwKCh1bnNpZ25lZCBsb25nKSBtZW1tYXAucGh5c19tYXAsCisJCQkobWVtbWFwLm5yX21hcCAqIG1lbW1hcC5kZXNjX3NpemUpKTsKIAlpZiAobWVtbWFwLm1hcCA9PSBOVUxMKQogCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgcmVtYXAgdGhlIEVGSSBtZW1tYXAhXG4iKTsKKworCW1lbW1hcC5tYXBfZW5kID0gbWVtbWFwLm1hcCArIChtZW1tYXAubnJfbWFwICogbWVtbWFwLmRlc2Nfc2l6ZSk7CiB9CiAKICNpZiBFRklfREVCVUcKIHN0YXRpYyB2b2lkIF9faW5pdCBwcmludF9lZmlfbWVtbWFwKHZvaWQpCiB7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCXZvaWQgKnA7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbWVtbWFwLm5yX21hcDsgaSsrKSB7Ci0JCW1kID0gJm1lbW1hcC5tYXBbaV07CisJZm9yIChwID0gbWVtbWFwLm1hcCwgaSA9IDA7IHAgPCBtZW1tYXAubWFwX2VuZDsgcCArPSBtZW1tYXAuZGVzY19zaXplLCBpKyspIHsKKwkJbWQgPSBwOwogCQlwcmludGsoS0VSTl9JTkZPICJtZW0lMDJ1OiB0eXBlPSV1LCBhdHRyPTB4JWxseCwgIgogCQkJInJhbmdlPVsweCUwMTZsbHgtMHglMDE2bGx4KSAoJWxsdU1CKVxuIiwKIAkJCWksIG1kLT50eXBlLCBtZC0+YXR0cmlidXRlLCBtZC0+cGh5c19hZGRyLApAQCAtMjcxLDEwICsyNzEsMTAgQEAKIAl9IHByZXYsIGN1cnI7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1kOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKLQlpbnQgaTsKKwl2b2lkICpwOwogCi0JZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgewotCQltZCA9ICZtZW1tYXAubWFwW2ldOworCWZvciAocCA9IG1lbW1hcC5tYXA7IHAgPCBtZW1tYXAubWFwX2VuZDsgcCArPSBtZW1tYXAuZGVzY19zaXplKSB7CisJCW1kID0gcDsKIAogCQlpZiAoKG1kLT5udW1fcGFnZXMgPT0gMCkgfHwgKCFpc19hdmFpbGFibGVfbWVtb3J5KG1kKSkpCiAJCQljb250aW51ZTsKQEAgLTMyNSw2ICszMjUsNyBAQAogCW1lbW1hcC5waHlzX21hcCA9IEVGSV9NRU1NQVA7CiAJbWVtbWFwLm5yX21hcCA9IEVGSV9NRU1NQVBfU0laRS9FRklfTUVNREVTQ19TSVpFOwogCW1lbW1hcC5kZXNjX3ZlcnNpb24gPSBFRklfTUVNREVTQ19WRVJTSU9OOworCW1lbW1hcC5kZXNjX3NpemUgPSBFRklfTUVNREVTQ19TSVpFOwogCiAJZWZpLnN5c3RhYiA9IChlZmlfc3lzdGVtX3RhYmxlX3QgKikKIAkJYm9vdF9pb3JlbWFwKCh1bnNpZ25lZCBsb25nKSBlZmlfcGh5cy5zeXN0YWIsCkBAIC00MjgsMjIgKzQyOSwzMCBAQAogCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgbWFwIHRoZSBydW50aW1lIHNlcnZpY2UgdGFibGUhXG4iKTsKIAogCS8qIE1hcCB0aGUgRUZJIG1lbW9yeSBtYXAgZm9yIHVzZSB1bnRpbCBwYWdpbmdfaW5pdCgpICovCi0KLQltZW1tYXAubWFwID0gKGVmaV9tZW1vcnlfZGVzY190ICopCi0JCWJvb3RfaW9yZW1hcCgodW5zaWduZWQgbG9uZykgRUZJX01FTU1BUCwgRUZJX01FTU1BUF9TSVpFKTsKLQorCW1lbW1hcC5tYXAgPSBib290X2lvcmVtYXAoKHVuc2lnbmVkIGxvbmcpIEVGSV9NRU1NQVAsIEVGSV9NRU1NQVBfU0laRSk7CiAJaWYgKG1lbW1hcC5tYXAgPT0gTlVMTCkKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGQgbm90IG1hcCB0aGUgRUZJIG1lbW9yeSBtYXAhXG4iKTsKIAotCWlmIChFRklfTUVNREVTQ19TSVpFICE9IHNpemVvZihlZmlfbWVtb3J5X2Rlc2NfdCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIldhcm5pbmchIEtlcm5lbC1kZWZpbmVkIG1lbWRlc2MgZG9lc24ndCAiCi0JCQkgICAibWF0Y2ggdGhlIG9uZSBmcm9tIEVGSSFcbiIpOwotCX0KKwltZW1tYXAubWFwX2VuZCA9IG1lbW1hcC5tYXAgKyAobWVtbWFwLm5yX21hcCAqIG1lbW1hcC5kZXNjX3NpemUpOworCiAjaWYgRUZJX0RFQlVHCiAJcHJpbnRfZWZpX21lbW1hcCgpOwogI2VuZGlmCiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgY2hlY2tfcmFuZ2VfZm9yX3N5c3RhYihlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpCit7CisJaWYgKCgodW5zaWduZWQgbG9uZyltZC0+cGh5c19hZGRyIDw9ICh1bnNpZ25lZCBsb25nKWVmaV9waHlzLnN5c3RhYikgJiYKKwkJKCh1bnNpZ25lZCBsb25nKWVmaV9waHlzLnN5c3RhYiA8IG1kLT5waHlzX2FkZHIgKworCQkoKHVuc2lnbmVkIGxvbmcpbWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkpKSB7CisJCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCQlhZGRyID0gbWQtPnZpcnRfYWRkciAtIG1kLT5waHlzX2FkZHIgKworCQkJKHVuc2lnbmVkIGxvbmcpZWZpX3BoeXMuc3lzdGFiOworCQllZmkuc3lzdGFiID0gKGVmaV9zeXN0ZW1fdGFibGVfdCAqKWFkZHI7CisJfQorfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiB3aWxsIHN3aXRjaCB0aGUgRUZJIHJ1bnRpbWUgc2VydmljZXMgdG8gdmlydHVhbCBtb2RlLgogICogRXNzZW50aWFsbHksIGxvb2sgdGhyb3VnaCB0aGUgRUZJIG1lbW1hcCBhbmQgbWFwIGV2ZXJ5IHJlZ2lvbiB0aGF0CkBAIC00NTcsNDMgKzQ2NiwzMiBAQAogewogCWVmaV9tZW1vcnlfZGVzY190ICptZDsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwotCWludCBpOworCXZvaWQgKnA7CiAKIAllZmkuc3lzdGFiID0gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBtZW1tYXAubnJfbWFwOyBpKyspIHsKLQkJbWQgPSAmbWVtbWFwLm1hcFtpXTsKKwlmb3IgKHAgPSBtZW1tYXAubWFwOyBwIDwgbWVtbWFwLm1hcF9lbmQ7IHAgKz0gbWVtbWFwLmRlc2Nfc2l6ZSkgeworCQltZCA9IHA7CiAKLQkJaWYgKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1JVTlRJTUUpIHsKLQkJCW1kLT52aXJ0X2FkZHIgPQotCQkJCSh1bnNpZ25lZCBsb25nKWlvcmVtYXAobWQtPnBoeXNfYWRkciwKLQkJCQkJbWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCk7Ci0JCQlpZiAoISh1bnNpZ25lZCBsb25nKW1kLT52aXJ0X2FkZHIpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJpb3JlbWFwIG9mIDB4JWxYIGZhaWxlZFxuIiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcpbWQtPnBoeXNfYWRkcik7Ci0JCQl9CisJCWlmICghKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1JVTlRJTUUpKQorCQkJY29udGludWU7CiAKLQkJCWlmICgoKHVuc2lnbmVkIGxvbmcpbWQtPnBoeXNfYWRkciA8PQotCQkJCQkodW5zaWduZWQgbG9uZyllZmlfcGh5cy5zeXN0YWIpICYmCi0JCQkJKCh1bnNpZ25lZCBsb25nKWVmaV9waHlzLnN5c3RhYiA8Ci0JCQkJCW1kLT5waHlzX2FkZHIgKwotCQkJCQkoKHVuc2lnbmVkIGxvbmcpbWQtPm51bV9wYWdlcyA8PAotCQkJCQkJRUZJX1BBR0VfU0hJRlQpKSkgewotCQkJCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQotCQkJCWFkZHIgPSBtZC0+dmlydF9hZGRyIC0gbWQtPnBoeXNfYWRkciArCi0JCQkJCQkodW5zaWduZWQgbG9uZyllZmlfcGh5cy5zeXN0YWI7Ci0JCQkJZWZpLnN5c3RhYiA9IChlZmlfc3lzdGVtX3RhYmxlX3QgKilhZGRyOwotCQkJfQorCQltZC0+dmlydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcChtZC0+cGh5c19hZGRyLAorCQkJbWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCk7CisJCWlmICghKHVuc2lnbmVkIGxvbmcpbWQtPnZpcnRfYWRkcikgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW9yZW1hcCBvZiAweCVsWCBmYWlsZWRcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpbWQtPnBoeXNfYWRkcik7CiAJCX0KKwkJLyogdXBkYXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIEVGSSBzeXN0ZW0gdGFibGUgKi8KKwkJY2hlY2tfcmFuZ2VfZm9yX3N5c3RhYihtZCk7CiAJfQogCiAJaWYgKCFlZmkuc3lzdGFiKQogCQlCVUcoKTsKIAogCXN0YXR1cyA9IHBoeXNfZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwKAotCQkJc2l6ZW9mKGVmaV9tZW1vcnlfZGVzY190KSAqIG1lbW1hcC5ucl9tYXAsCi0JCQlzaXplb2YoZWZpX21lbW9yeV9kZXNjX3QpLAorCQkJbWVtbWFwLmRlc2Nfc2l6ZSAqIG1lbW1hcC5ucl9tYXAsCisJCQltZW1tYXAuZGVzY19zaXplLAogCQkJbWVtbWFwLmRlc2NfdmVyc2lvbiwKIAkJICAgICAgIAltZW1tYXAucGh5c19tYXApOwogCkBAIC01MzMsMTAgKzUzMSwxMCBAQAogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWVmaV9tZW1vcnlfZGVzY190ICptZDsKLQlpbnQgaTsKKwl2b2lkICpwOwogCi0JZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgewotCQltZCA9ICZtZW1tYXAubWFwW2ldOworCWZvciAocCA9IG1lbW1hcC5tYXA7IHAgPCBtZW1tYXAubWFwX2VuZDsgcCArPSBtZW1tYXAuZGVzY19zaXplKSB7CisJCW1kID0gcDsKIAogCQlpZiAoKG1kLT5waHlzX2FkZHIgKyAobWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkpID4KIAkJICAgIDB4MTAwMDAwMDAwVUxMKQpAQCAtNjEzLDEwICs2MTEsMTAgQEAKIHUzMiBlZmlfbWVtX3R5cGUodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCiB7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1kOwotCWludCBpOworCXZvaWQgKnA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbWVtbWFwLm5yX21hcDsgaSsrKSB7Ci0JCW1kID0gJm1lbW1hcC5tYXBbaV07CisJZm9yIChwID0gbWVtbWFwLm1hcDsgcCA8IG1lbW1hcC5tYXBfZW5kOyBwICs9IG1lbW1hcC5kZXNjX3NpemUpIHsKKwkJbWQgPSBwOwogCQlpZiAoKG1kLT5waHlzX2FkZHIgPD0gcGh5c19hZGRyKSAmJiAocGh5c19hZGRyIDwKIAkJCShtZC0+cGh5c19hZGRyICsgKG1kLT4gbnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSkgKSkKIAkJCXJldHVybiBtZC0+dHlwZTsKQEAgLTYyNywxMCArNjI1LDEwIEBACiB1NjQgZWZpX21lbV9hdHRyaWJ1dGVzKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQogewogCWVmaV9tZW1vcnlfZGVzY190ICptZDsKLQlpbnQgaTsKKwl2b2lkICpwOwogCi0JZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgewotCQltZCA9ICZtZW1tYXAubWFwW2ldOworCWZvciAocCA9IG1lbW1hcC5tYXA7IHAgPCBtZW1tYXAubWFwX2VuZDsgcCArPSBtZW1tYXAuZGVzY19zaXplKSB7CisJCW1kID0gcDsKIAkJaWYgKChtZC0+cGh5c19hZGRyIDw9IHBoeXNfYWRkcikgJiYgKHBoeXNfYWRkciA8CiAJCQkobWQtPnBoeXNfYWRkciArIChtZC0+IG51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkpICkpCiAJCQlyZXR1cm4gbWQtPmF0dHJpYnV0ZTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUwppbmRleCBhOTkxZDRlLi4zYWFkMDM4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9lbnRyeS5TCkBAIC0yMDMsNyArMjAzLDcgQEAKIAlHRVRfVEhSRUFEX0lORk8oJWVicCkKIAogCS8qIE5vdGUsIF9USUZfU0VDQ09NUCBpcyBiaXQgbnVtYmVyIDgsIGFuZCBzbyBpdCBuZWVkcyB0ZXN0dyBhbmQgbm90IHRlc3RiICovCi0JdGVzdHcgJChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUfF9USUZfU0VDQ09NUCksVElfZmxhZ3MoJWVicCkKKwl0ZXN0dyAkKF9USUZfU1lTQ0FMTF9FTVV8X1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU0VDQ09NUHxfVElGX1NZU0NBTExfQVVESVQpLFRJX2ZsYWdzKCVlYnApCiAJam56IHN5c2NhbGxfdHJhY2VfZW50cnkKIAljbXBsICQobnJfc3lzY2FsbHMpLCAlZWF4CiAJamFlIHN5c2NhbGxfYmFkc3lzCkBAIC0yMjYsOSArMjI2LDkgQEAKIAlwdXNobCAlZWF4CQkJIyBzYXZlIG9yaWdfZWF4CiAJU0FWRV9BTEwKIAlHRVRfVEhSRUFEX0lORk8oJWVicCkKLQkJCQkJIyBzeXN0ZW0gY2FsbCB0cmFjaW5nIGluIG9wZXJhdGlvbgorCQkJCQkjIHN5c3RlbSBjYWxsIHRyYWNpbmcgaW4gb3BlcmF0aW9uIC8gZW11bGF0aW9uCiAJLyogTm90ZSwgX1RJRl9TRUNDT01QIGlzIGJpdCBudW1iZXIgOCwgYW5kIHNvIGl0IG5lZWRzIHRlc3R3IGFuZCBub3QgdGVzdGIgKi8KLQl0ZXN0dyAkKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVR8X1RJRl9TRUNDT01QKSxUSV9mbGFncyglZWJwKQorCXRlc3R3ICQoX1RJRl9TWVNDQUxMX0VNVXxfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TRUNDT01QfF9USUZfU1lTQ0FMTF9BVURJVCksVElfZmxhZ3MoJWVicCkKIAlqbnogc3lzY2FsbF90cmFjZV9lbnRyeQogCWNtcGwgJChucl9zeXNjYWxscyksICVlYXgKIAlqYWUgc3lzY2FsbF9iYWRzeXMKQEAgLTMzOCw2ICszMzgsOSBAQAogCW1vdmwgJWVzcCwgJWVheAogCXhvcmwgJWVkeCwlZWR4CiAJY2FsbCBkb19zeXNjYWxsX3RyYWNlCisJY21wbCAkMCwgJWVheAorCWpuZSByZXN1bWVfdXNlcnNwYWNlCQkjIHJldCAhPSAwIC0+IHJ1bm5pbmcgdW5kZXIgUFRSQUNFX1NZU0VNVSwKKwkJCQkJIyBzbyBtdXN0IHNraXAgYWN0dWFsIHN5c2NhbGwKIAltb3ZsIE9SSUdfRUFYKCVlc3ApLCAlZWF4CiAJY21wbCAkKG5yX3N5c2NhbGxzKSwgJWVheAogCWpuYWUgc3lzY2FsbF9jYWxsCkBAIC01MDQsNyArNTA3LDcgQEAKIAlwdXNobCAkX19LRVJORUxfQ1M7CQkJXAogCXB1c2hsICRzeXNlbnRlcl9wYXN0X2VzcAogCi1FTlRSWShkZWJ1ZykKK0tQUk9CRV9FTlRSWShkZWJ1ZykKIAljbXBsICRzeXNlbnRlcl9lbnRyeSwoJWVzcCkKIAlqbmUgZGVidWdfc3RhY2tfY29ycmVjdAogCUZJWF9TVEFDSygxMiwgZGVidWdfc3RhY2tfY29ycmVjdCwgZGVidWdfZXNwX2ZpeF9pbnNuKQpAQCAtNTE1LDcgKzUxOCw3IEBACiAJbW92bCAlZXNwLCVlYXgJCQkjIHB0X3JlZ3MgcG9pbnRlcgogCWNhbGwgZG9fZGVidWcKIAlqbXAgcmV0X2Zyb21fZXhjZXB0aW9uCi0KKwkucHJldmlvdXMgLnRleHQKIC8qCiAgKiBOTUkgaXMgZG91Ymx5IG5hc3R5LiBJdCBjYW4gaGFwcGVuIF93aGlsZV8gd2UncmUgaGFuZGxpbmcKICAqIGEgZGVidWcgZmF1bHQsIGFuZCB0aGUgZGVidWcgZmF1bHQgaGFzbid0IHlldCBiZWVuIGFibGUgdG8KQEAgLTU4OCwxMyArNTkxLDE0IEBACiAJLmxvbmcgMWIsaXJldF9leGMKIC5wcmV2aW91cwogCi1FTlRSWShpbnQzKQorS1BST0JFX0VOVFJZKGludDMpCiAJcHVzaGwgJC0xCQkJIyBtYXJrIHRoaXMgYXMgYW4gaW50CiAJU0FWRV9BTEwKIAl4b3JsICVlZHgsJWVkeAkJIyB6ZXJvIGVycm9yIGNvZGUKIAltb3ZsICVlc3AsJWVheAkJIyBwdF9yZWdzIHBvaW50ZXIKIAljYWxsIGRvX2ludDMKIAlqbXAgcmV0X2Zyb21fZXhjZXB0aW9uCisJLnByZXZpb3VzIC50ZXh0CiAKIEVOVFJZKG92ZXJmbG93KQogCXB1c2hsICQwCkBAIC02MjgsMTcgKzYzMiwxOSBAQAogCXB1c2hsICRkb19zdGFja19zZWdtZW50CiAJam1wIGVycm9yX2NvZGUKIAotRU5UUlkoZ2VuZXJhbF9wcm90ZWN0aW9uKQorS1BST0JFX0VOVFJZKGdlbmVyYWxfcHJvdGVjdGlvbikKIAlwdXNobCAkZG9fZ2VuZXJhbF9wcm90ZWN0aW9uCiAJam1wIGVycm9yX2NvZGUKKwkucHJldmlvdXMgLnRleHQKIAogRU5UUlkoYWxpZ25tZW50X2NoZWNrKQogCXB1c2hsICRkb19hbGlnbm1lbnRfY2hlY2sKIAlqbXAgZXJyb3JfY29kZQogCi1FTlRSWShwYWdlX2ZhdWx0KQorS1BST0JFX0VOVFJZKHBhZ2VfZmF1bHQpCiAJcHVzaGwgJGRvX3BhZ2VfZmF1bHQKIAlqbXAgZXJyb3JfY29kZQorCS5wcmV2aW91cyAudGV4dAogCiAjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKIEVOVFJZKG1hY2hpbmVfY2hlY2spCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2hlYWQuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCmluZGV4IDQ0NzdiYjEuLmU0MzdmYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAogLyoKQEAgLTc3LDYgKzc3LDMyIEBACiAJc3VibCAlZWRpLCVlY3gKIAlzaHJsICQyLCVlY3gKIAlyZXAgOyBzdG9zbAorLyoKKyAqIENvcHkgYm9vdHVwIHBhcmFtZXRlcnMgb3V0IG9mIHRoZSB3YXkuCisgKiBOb3RlOiAlZXNpIHN0aWxsIGhhcyB0aGUgcG9pbnRlciB0byB0aGUgcmVhbC1tb2RlIGRhdGEuCisgKiBXaXRoIHRoZSBrZXhlYyBhcyBib290IGxvYWRlciwgcGFyYW1ldGVyIHNlZ21lbnQgbWlnaHQgYmUgbG9hZGVkIGJleW9uZAorICoga2VybmVsIGltYWdlIGFuZCBtaWdodCBub3QgZXZlbiBiZSBhZGRyZXNzYWJsZSBieSBlYXJseSBib290IHBhZ2UgdGFibGVzLgorICogKGtleGVjIG9uIHBhbmljIGNhc2UpLiBIZW5jZSBjb3B5IG91dCB0aGUgcGFyYW1ldGVycyBiZWZvcmUgaW5pdGlhbGl6aW5nCisgKiBwYWdlIHRhYmxlcy4KKyAqLworCW1vdmwgJChib290X3BhcmFtcyAtIF9fUEFHRV9PRkZTRVQpLCVlZGkKKwltb3ZsICQoUEFSQU1fU0laRS80KSwlZWN4CisJY2xkCisJcmVwCisJbW92c2wKKwltb3ZsIGJvb3RfcGFyYW1zIC0gX19QQUdFX09GRlNFVCArIE5FV19DTF9QT0lOVEVSLCVlc2kKKwlhbmRsICVlc2ksJWVzaQorCWpueiAyZgkJCSMgTmV3IGNvbW1hbmQgbGluZSBwcm90b2NvbAorCWNtcHcgJChPTERfQ0xfTUFHSUMpLE9MRF9DTF9NQUdJQ19BRERSCisJam5lIDFmCisJbW92endsIE9MRF9DTF9PRkZTRVQsJWVzaQorCWFkZGwgJChPTERfQ0xfQkFTRV9BRERSKSwlZXNpCisyOgorCW1vdmwgJChzYXZlZF9jb21tYW5kX2xpbmUgLSBfX1BBR0VfT0ZGU0VUKSwlZWRpCisJbW92bCAkKENPTU1BTkRfTElORV9TSVpFLzQpLCVlY3gKKwlyZXAKKwltb3ZzbAorMToKIAogLyoKICAqIEluaXRpYWxpemUgcGFnZSB0YWJsZXMuICBUaGlzIGNyZWF0ZXMgYSBQREUgYW5kIGEgc2V0IG9mIHBhZ2UKQEAgLTIxNCwyOCArMjQwLDYgQEAKICAqLwogCWNhbGwgc2V0dXBfaWR0CiAKLS8qCi0gKiBDb3B5IGJvb3R1cCBwYXJhbWV0ZXJzIG91dCBvZiB0aGUgd2F5LgotICogTm90ZTogJWVzaSBzdGlsbCBoYXMgdGhlIHBvaW50ZXIgdG8gdGhlIHJlYWwtbW9kZSBkYXRhLgotICovCi0JbW92bCAkYm9vdF9wYXJhbXMsJWVkaQotCW1vdmwgJChQQVJBTV9TSVpFLzQpLCVlY3gKLQljbGQKLQlyZXAKLQltb3ZzbAotCW1vdmwgYm9vdF9wYXJhbXMrTkVXX0NMX1BPSU5URVIsJWVzaQotCWFuZGwgJWVzaSwlZXNpCi0Jam56IDJmCQkJIyBOZXcgY29tbWFuZCBsaW5lIHByb3RvY29sCi0JY21wdyAkKE9MRF9DTF9NQUdJQyksT0xEX0NMX01BR0lDX0FERFIKLQlqbmUgMWYKLQltb3Z6d2wgT0xEX0NMX09GRlNFVCwlZXNpCi0JYWRkbCAkKE9MRF9DTF9CQVNFX0FERFIpLCVlc2kKLTI6Ci0JbW92bCAkc2F2ZWRfY29tbWFuZF9saW5lLCVlZGkKLQltb3ZsICQoQ09NTUFORF9MSU5FX1NJWkUvNCksJWVjeAotCXJlcAotCW1vdnNsCi0xOgogY2hlY2tDUFV0eXBlOgogCiAJbW92bCAkLTEsWDg2X0NQVUlECQkjICAtMSBmb3Igbm8gQ1BVSUQgaW5pdGlhbGx5CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2k4MjM3LmMgYi9hcmNoL2kzODYva2VybmVsL2k4MjM3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM2ZDFjMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTgyMzcuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogaTgyMzcuYzogODIzN0EgRE1BIGNvbnRyb2xsZXIgc3VzcGVuZCBmdW5jdGlvbnMuCisgKgorICogV3JpdHRlbiBieSBQaWVycmUgT3NzbWFuLCAyMDA1LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKy8qCisgKiBUaGlzIG1vZHVsZSBqdXN0IGhhbmRsZXMgc3VzcGVuZC9yZXN1bWUgaXNzdWVzIHdpdGggdGhlCisgKiA4MjM3QSBETUEgY29udHJvbGxlciAodXNlZCBmb3IgSVNBIGFuZCBMUEMpLgorICogQWxsb2NhdGlvbiBpcyBoYW5kbGVkIGluIGtlcm5lbC9kbWEuYyBhbmQgbm9ybWFsIHVzYWdlIGlzCisgKiBpbiBhc20vZG1hLmguCisgKi8KKworc3RhdGljIGludCBpODIzN0FfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKworCWRtYV9vdXRiKERNQTFfUkVTRVRfUkVHLCAwKTsKKwlkbWFfb3V0YihETUEyX1JFU0VUX1JFRywgMCk7CisKKwlmb3IgKGkgPSAwO2kgPCA4O2krKykgeworCQlzZXRfZG1hX2FkZHIoaSwgMHgwMDAwMDApOworCQkvKiBETUEgY291bnQgaXMgYSBiaXQgd2VpcmQgc28gdGhpcyBpcyBub3QgMCAqLworCQlzZXRfZG1hX2NvdW50KGksIDEpOworCX0KKworCS8qIEVuYWJsZSBjYXNjYWRlIERNQSBvciBjaGFubmVsIDAtMyB3b24ndCB3b3JrICovCisJZW5hYmxlX2RtYSg0KTsKKworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgyMzdBX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBpODIzN19zeXNkZXZfY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgiaTgyMzciKSwKKwkuc3VzcGVuZCA9IGk4MjM3QV9zdXNwZW5kLAorCS5yZXN1bWUgPSBpODIzN0FfcmVzdW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGRldmljZV9pODIzN0EgPSB7CisJLmlkCT0gMCwKKwkuY2xzCT0gJmk4MjM3X3N5c2Rldl9jbGFzcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGk4MjM3QV9pbml0X3N5c2ZzKHZvaWQpCit7CisJaW50IGVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZpODIzN19zeXNkZXZfY2xhc3MpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfaTgyMzdBKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2RldmljZV9pbml0Y2FsbChpODIzN0FfaW5pdF9zeXNmcyk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDY1NzhmNDAuLjM1ZDNjZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CkBAIC03Nyw3ICs3OCw3IEBACiAJaW50IGFwaWMsIHBpbiwgbmV4dDsKIH0gaXJxXzJfcGluW1BJTl9NQVBfU0laRV07CiAKLWludCB2ZWN0b3JfaXJxW05SX1ZFQ1RPUlNdID0geyBbMCAuLi4gTlJfVkVDVE9SUyAtIDFdID0gLTF9OworaW50IHZlY3Rvcl9pcnFbTlJfVkVDVE9SU10gX19yZWFkX21vc3RseSA9IHsgWzAgLi4uIE5SX1ZFQ1RPUlMgLSAxXSA9IC0xfTsKICNpZmRlZiBDT05GSUdfUENJX01TSQogI2RlZmluZSB2ZWN0b3JfdG9faXJxKHZlY3RvcikgCVwKIAkocGxhdGZvcm1fbGVnYWN5X2lycSh2ZWN0b3IpID8gdmVjdG9yIDogdmVjdG9yX2lycVt2ZWN0b3JdKQpAQCAtMjIyLDEzICsyMjMsMjEgQEAKIAkJCWNsZWFyX0lPX0FQSUNfcGluKGFwaWMsIHBpbik7CiB9CiAKKyNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBzZXRfaW9hcGljX2FmZmluaXR5X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgY3B1bWFzaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBwaW47CiAJc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnkgPSBpcnFfMl9waW4gKyBpcnE7CiAJdW5zaWduZWQgaW50IGFwaWNpZF92YWx1ZTsKKwljcHVtYXNrX3QgdG1wOwogCQorCWNwdXNfYW5kKHRtcCwgY3B1bWFzaywgY3B1X29ubGluZV9tYXApOworCWlmIChjcHVzX2VtcHR5KHRtcCkpCisJCXRtcCA9IFRBUkdFVF9DUFVTOworCisJY3B1c19hbmQoY3B1bWFzaywgdG1wLCBDUFVfTUFTS19BTEwpOworCiAJYXBpY2lkX3ZhbHVlID0gY3B1X21hc2tfdG9fYXBpY2lkKGNwdW1hc2spOwogCS8qIFByZXBhcmUgdG8gZG8gdGhlIGlvX2FwaWNfd3JpdGUgKi8KIAlhcGljaWRfdmFsdWUgPSBhcGljaWRfdmFsdWUgPDwgMjQ7CkBAIC0yNDIsNiArMjUxLDcgQEAKIAkJCWJyZWFrOwogCQllbnRyeSA9IGlycV8yX3BpbiArIGVudHJ5LT5uZXh0OwogCX0KKwlzZXRfaXJxX2luZm8oaXJxLCBjcHVtYXNrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwogfQogCkBAIC0yNTksNyArMjY5LDYgQEAKICMgIGRlZmluZSBEcHJpbnRrKHguLi4pIAogIyBlbmRpZgogCi1jcHVtYXNrX3QgX19jYWNoZWxpbmVfYWxpZ25lZCBwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbTlJfSVJRU107CiAKICNkZWZpbmUgSVJRQkFMQU5DRV9DSEVDS19BUkNIIC05OTkKIHN0YXRpYyBpbnQgaXJxYmFsYW5jZV9kaXNhYmxlZCA9IElSUUJBTEFOQ0VfQ0hFQ0tfQVJDSDsKQEAgLTMyOCwxMiArMzM3LDcgQEAKIAljcHVzX2FuZChhbGxvd2VkX21hc2ssIGNwdV9vbmxpbmVfbWFwLCBpcnFfYWZmaW5pdHlbaXJxXSk7CiAJbmV3X2NwdSA9IG1vdmUoY3B1LCBhbGxvd2VkX21hc2ssIG5vdywgMSk7CiAJaWYgKGNwdSAhPSBuZXdfY3B1KSB7Ci0JCWlycV9kZXNjX3QgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotCQlwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbaXJxXSA9IGNwdW1hc2tfb2ZfY3B1KG5ld19jcHUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7CisJCXNldF9wZW5kaW5nX2lycShpcnEsIGNwdW1hc2tfb2ZfY3B1KG5ld19jcHUpKTsKIAl9CiB9CiAKQEAgLTUyOCwxNiArNTMyLDEyIEBACiAJY3B1c19hbmQodG1wLCB0YXJnZXRfY3B1X21hc2ssIGFsbG93ZWRfbWFzayk7CiAKIAlpZiAoIWNwdXNfZW1wdHkodG1wKSkgewotCQlpcnFfZGVzY190ICpkZXNjID0gaXJxX2Rlc2MgKyBzZWxlY3RlZF9pcnE7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJRHByaW50aygiaXJxID0gJWQgbW92ZWQgdG8gY3B1ID0gJWRcbiIsCiAJCQkJc2VsZWN0ZWRfaXJxLCBtaW5fbG9hZGVkKTsKIAkJLyogbWFyayBmb3IgY2hhbmdlIGRlc3RpbmF0aW9uICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7Ci0JCXBlbmRpbmdfaXJxX2JhbGFuY2VfY3B1bWFza1tzZWxlY3RlZF9pcnFdID0KLQkJCQkJY3B1bWFza19vZl9jcHUobWluX2xvYWRlZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwkJc2V0X3BlbmRpbmdfaXJxKHNlbGVjdGVkX2lycSwgY3B1bWFza19vZl9jcHUobWluX2xvYWRlZCkpOworCiAJCS8qIFNpbmNlIHdlIG1hZGUgYSBjaGFuZ2UsIGNvbWUgYmFjayBzb29uZXIgdG8gCiAJCSAqIGNoZWNrIGZvciBtb3JlIHZhcmlhdGlvbi4KIAkJICovCkBAIC01NjgsMTIgKzU2OCwxMiBAQAogCQogCS8qIHB1c2ggZXZlcnl0aGluZyB0byBDUFUgMCB0byBnaXZlIHVzIGEgc3RhcnRpbmcgcG9pbnQuICAqLwogCWZvciAoaSA9IDAgOyBpIDwgTlJfSVJRUyA7IGkrKykgewotCQlwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbaV0gPSBjcHVtYXNrX29mX2NwdSgwKTsKKwkJcGVuZGluZ19pcnFfY3B1bWFza1tpXSA9IGNwdW1hc2tfb2ZfY3B1KDApOworCQlzZXRfcGVuZGluZ19pcnEoaSwgY3B1bWFza19vZl9jcHUoMCkpOwogCX0KIAogCWZvciAoIDsgOyApIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJdGltZV9yZW1haW5pbmcgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVfcmVtYWluaW5nKTsKKwkJdGltZV9yZW1haW5pbmcgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZV9yZW1haW5pbmcpOwogCQl0cnlfdG9fZnJlZXplKCk7CiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCiAJCQkJcHJldl9iYWxhbmNlX3RpbWUrYmFsYW5jZWRfaXJxX2ludGVydmFsKSkgewpAQCAtNjQ3LDIwICs2NDcsOSBAQAogCiBfX3NldHVwKCJub2lycWJhbGFuY2UiLCBpcnFiYWxhbmNlX2Rpc2FibGUpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgbW92ZV9pcnEoaW50IGlycSkKLXsKLQkvKiBub3RlIC0gd2UgaG9sZCB0aGUgZGVzYy0+bG9jayAqLwotCWlmICh1bmxpa2VseSghY3B1c19lbXB0eShwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbaXJxXSkpKSB7Ci0JCXNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKGlycSwgcGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW2lycV0pOwotCQljcHVzX2NsZWFyKHBlbmRpbmdfaXJxX2JhbGFuY2VfY3B1bWFza1tpcnFdKTsKLQl9Ci19Ci0KIGxhdGVfaW5pdGNhbGwoYmFsYW5jZWRfaXJxX2luaXQpOwotCi0jZWxzZSAvKiAhQ09ORklHX0lSUUJBTEFOQ0UgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBtb3ZlX2lycShpbnQgaXJxKSB7IH0KICNlbmRpZiAvKiBDT05GSUdfSVJRQkFMQU5DRSAqLworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogI2lmbmRlZiBDT05GSUdfU01QCiB2b2lkIGZhc3RjYWxsIHNlbmRfSVBJX3NlbGYoaW50IHZlY3RvcikKQEAgLTgyMCw2ICs4MDksNyBAQAogICogd2UgbmVlZCB0byByZXByb2dyYW0gdGhlIGlvcmVkdGJscyB0byBjYXRlciBmb3IgdGhlIGNwdXMgd2hpY2ggaGF2ZSBjb21lIG9ubGluZQogICogc28gbWFzayBpbiBhbGwgY2FzZXMgc2hvdWxkIHNpbXBseSBiZSBUQVJHRVRfQ1BVUwogICovCisjaWZkZWYgQ09ORklHX1NNUAogdm9pZCBfX2luaXQgc2V0dXBfaW9hcGljX2Rlc3Qodm9pZCkKIHsKIAlpbnQgcGluLCBpb2FwaWMsIGlycSwgaXJxX2VudHJ5OwpAQCAtODM4LDYgKzgyOCw3IEBACiAKIAl9CiB9CisjZW5kaWYKIAogLyoKICAqIEVJU0EgRWRnZS9MZXZlbCBjb250cm9sIHJlZ2lzdGVyLCBFTENSCkBAIC0xMTI3LDcgKzExMTgsNyBAQAogfQogCiAvKiBpcnFfdmVjdG9ycyBpcyBpbmRleGVkIGJ5IHRoZSBzdW0gb2YgYWxsIFJURXMgaW4gYWxsIEkvTyBBUElDcy4gKi8KLXU4IGlycV92ZWN0b3JbTlJfSVJRX1ZFQ1RPUlNdID0geyBGSVJTVF9ERVZJQ0VfVkVDVE9SICwgMCB9OwordTggaXJxX3ZlY3RvcltOUl9JUlFfVkVDVE9SU10gX19yZWFkX21vc3RseSA9IHsgRklSU1RfREVWSUNFX1ZFQ1RPUiAsIDAgfTsKIAogaW50IGFzc2lnbl9pcnFfdmVjdG9yKGludCBpcnEpCiB7CkBAIC0xMjQ5LDYgKzEyNDAsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAkJaW9fYXBpY193cml0ZShhcGljLCAweDExKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSsxKSk7CiAJCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMCsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMCkpOworCQlzZXRfbmF0aXZlX2lycV9pbmZvKGlycSwgVEFSR0VUX0NQVVMpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwogCX0KIAl9CkBAIC0xNjQxLDkgKzE2MzMsOSBAQAogCWNsZWFyX0lPX0FQSUMoKTsKIAogCS8qCi0JICogSWYgdGhlIGk4MjU1OSBpcyByb3V0ZWQgdGhyb3VnaCBhbiBJT0FQSUMKKwkgKiBJZiB0aGUgaTgyNTkgaXMgcm91dGVkIHRocm91Z2ggYW4gSU9BUElDCiAJICogUHV0IHRoYXQgSU9BUElDIGluIHZpcnR1YWwgd2lyZSBtb2RlCi0JICogc28gbGVnYWN5IGludGVycnVwcyBjYW4gYmUgZGVsaXZlcmVkLgorCSAqIHNvIGxlZ2FjeSBpbnRlcnJ1cHRzIGNhbiBiZSBkZWxpdmVyZWQuCiAJICovCiAJcGluID0gZmluZF9pc2FfaXJxX3BpbigwLCBtcF9FeHRJTlQpOwogCWlmIChwaW4gIT0gLTEpIHsKQEAgLTE5NDQsNiArMTkzNiw3IEBACiB7CiAJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKIAorCW1vdmVfaXJxKHZlY3Rvcik7CiAJYWNrX2VkZ2VfaW9hcGljX2lycShpcnEpOwogfQogCkBAIC0xOTU4LDYgKzE5NTEsNyBAQAogewogCWludCBpcnEgPSB2ZWN0b3JfdG9faXJxKHZlY3Rvcik7CiAKKwltb3ZlX2lycSh2ZWN0b3IpOwogCWVuZF9sZXZlbF9pb2FwaWNfaXJxKGlycSk7CiB9CiAKQEAgLTE5NzUsMTQgKzE5NjksMTcgQEAKIAl1bm1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKIH0KIAorI2lmZGVmIENPTkZJR19TTVAKIHN0YXRpYyB2b2lkIHNldF9pb2FwaWNfYWZmaW5pdHlfdmVjdG9yICh1bnNpZ25lZCBpbnQgdmVjdG9yLAogCQkJCQljcHVtYXNrX3QgY3B1X21hc2spCiB7CiAJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKIAorCXNldF9uYXRpdmVfaXJxX2luZm8odmVjdG9yLCBjcHVfbWFzayk7CiAJc2V0X2lvYXBpY19hZmZpbml0eV9pcnEoaXJxLCBjcHVfbWFzayk7CiB9CiAjZW5kaWYKKyNlbmRpZgogCiAvKgogICogTGV2ZWwgYW5kIGVkZ2UgdHJpZ2dlcmVkIElPLUFQSUMgaW50ZXJydXB0cyBuZWVkIGRpZmZlcmVudCBoYW5kbGluZywKQEAgLTE5OTIsNyArMTk4OSw3IEBACiAgKiBlZGdlLXRyaWdnZXJlZCBoYW5kbGVyLCB3aXRob3V0IHJpc2tpbmcgSVJRIHN0b3JtcyBhbmQgb3RoZXIgdWdseQogICogcmFjZXMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW9hcGljX2VkZ2VfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW9hcGljX2VkZ2VfdHlwZSBfX3JlYWRfbW9zdGx5ID0gewogCS50eXBlbmFtZSAJPSAiSU8tQVBJQy1lZGdlIiwKIAkuc3RhcnR1cCAJPSBzdGFydHVwX2VkZ2VfaW9hcGljLAogCS5zaHV0ZG93biAJPSBzaHV0ZG93bl9lZGdlX2lvYXBpYywKQEAgLTIwMDAsMTAgKzE5OTcsMTIgQEAKIAkuZGlzYWJsZSAJPSBkaXNhYmxlX2VkZ2VfaW9hcGljLAogCS5hY2sgCQk9IGFja19lZGdlX2lvYXBpYywKIAkuZW5kIAkJPSBlbmRfZWRnZV9pb2FwaWMsCisjaWZkZWYgQ09ORklHX1NNUAogCS5zZXRfYWZmaW5pdHkgCT0gc2V0X2lvYXBpY19hZmZpbml0eSwKKyNlbmRpZgogfTsKIAotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpb2FwaWNfbGV2ZWxfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW9hcGljX2xldmVsX3R5cGUgX19yZWFkX21vc3RseSA9IHsKIAkudHlwZW5hbWUgCT0gIklPLUFQSUMtbGV2ZWwiLAogCS5zdGFydHVwIAk9IHN0YXJ0dXBfbGV2ZWxfaW9hcGljLAogCS5zaHV0ZG93biAJPSBzaHV0ZG93bl9sZXZlbF9pb2FwaWMsCkBAIC0yMDExLDcgKzIwMTAsOSBAQAogCS5kaXNhYmxlIAk9IGRpc2FibGVfbGV2ZWxfaW9hcGljLAogCS5hY2sgCQk9IG1hc2tfYW5kX2Fja19sZXZlbF9pb2FwaWMsCiAJLmVuZCAJCT0gZW5kX2xldmVsX2lvYXBpYywKKyNpZmRlZiBDT05GSUdfU01QCiAJLnNldF9hZmZpbml0eSAJPSBzZXRfaW9hcGljX2FmZmluaXR5LAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9JT19BUElDX3RyYXBzKHZvaWQpCkBAIC0yMDc0LDcgKzIwNzUsNyBAQAogCiBzdGF0aWMgdm9pZCBlbmRfbGFwaWNfaXJxICh1bnNpZ25lZCBpbnQgaSkgeyAvKiBub3RoaW5nICovIH0KIAotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBsYXBpY19pcnFfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgbGFwaWNfaXJxX3R5cGUgX19yZWFkX21vc3RseSA9IHsKIAkudHlwZW5hbWUgCT0gImxvY2FsLUFQSUMtZWRnZSIsCiAJLnN0YXJ0dXAgCT0gTlVMTCwgLyogc3RhcnR1cF9pcnEoKSBub3QgdXNlZCBmb3IgSVJRMCAqLwogCS5zaHV0ZG93biAJPSBOVUxMLCAvKiBzaHV0ZG93bl9pcnEoKSBub3QgdXNlZCBmb3IgSVJRMCAqLwpAQCAtMjQyMSw3ICsyNDIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSS1iYXNlZCBJT0FQSUMgQ29uZmlndXJhdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogCiBpbnQgX19pbml0IGlvX2FwaWNfZ2V0X3VuaXF1ZV9pZCAoaW50IGlvYXBpYywgaW50IGFwaWNfaWQpCiB7CkBAIC0yNTY5LDkgKzI1NzAsMTAgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAlpb19hcGljX3dyaXRlKGlvYXBpYywgMHgxMSsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMSkpOwogCWlvX2FwaWNfd3JpdGUoaW9hcGljLCAweDEwKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSswKSk7CisJc2V0X25hdGl2ZV9pcnFfaW5mbyh1c2VfcGNpX3ZlY3RvcigpID8gZW50cnkudmVjdG9yIDogaXJxLCBUQVJHRVRfQ1BVUyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLypDT05GSUdfQUNQSV9CT09UKi8KKyNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pb3BvcnQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9wb3J0LmMKaW5kZXggOGIyNTE2MC4uZjJiMzc2NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pb3BvcnQuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lvcG9ydC5jCkBAIC0xMzIsNiArMTMyLDcgQEAKIAl2b2xhdGlsZSBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgJnVudXNlZDsKIAl1bnNpZ25lZCBpbnQgbGV2ZWwgPSByZWdzLT5lYng7CiAJdW5zaWduZWQgaW50IG9sZCA9IChyZWdzLT5lZmxhZ3MgPj4gMTIpICYgMzsKKwlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCA9ICZjdXJyZW50LT50aHJlYWQ7CiAKIAlpZiAobGV2ZWwgPiAzKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0MCw4ICsxNDEsOCBAQAogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCiAJCQlyZXR1cm4gLUVQRVJNOwogCX0KLQlyZWdzLT5lZmxhZ3MgPSAocmVncy0+ZWZsYWdzICZ+IDB4MzAwMFVMKSB8IChsZXZlbCA8PCAxMik7Ci0JLyogTWFrZSBzdXJlIHdlIHJldHVybiB0aGUgbG9uZyB3YXkgKG5vdCBzeXNlbnRlcikgKi8KLQlzZXRfdGhyZWFkX2ZsYWcoVElGX0lSRVQpOworCXQtPmlvcGwgPSBsZXZlbCA8PCAxMjsKKwlyZWdzLT5lZmxhZ3MgPSAocmVncy0+ZWZsYWdzICYgflg4Nl9FRkxBR1NfSU9QTCkgfCB0LT5pb3BsOworCXNldF9pb3BsX21hc2sodC0+aW9wbCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGE2ZDhjNDUuLjYzNDViNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCkBAIC02MiwzMiArNjIsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGFyY2hfcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK2ludCBfX2twcm9iZXMgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXJldHVybiAwOwogfQogCi12b2lkIGFyY2hfY29weV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3ZvaWQgX19rcHJvYmVzIGFyY2hfY29weV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAltZW1jcHkocC0+YWluc24uaW5zbiwgcC0+YWRkciwgTUFYX0lOU05fU0laRSAqIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKIAlwLT5vcGNvZGUgPSAqcC0+YWRkcjsKIH0KIAotdm9pZCBhcmNoX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3ZvaWQgX19rcHJvYmVzIGFyY2hfYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCSpwLT5hZGRyID0gQlJFQUtQT0lOVF9JTlNUUlVDVElPTjsKIAlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIsCiAJCQkgICAodW5zaWduZWQgbG9uZykgcC0+YWRkciArIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKIH0KIAotdm9pZCBhcmNoX2Rpc2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3ZvaWQgX19rcHJvYmVzIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCSpwLT5hZGRyID0gcC0+b3Bjb2RlOwogCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZykgcC0+YWRkciwKIAkJCSAgICh1bnNpZ25lZCBsb25nKSBwLT5hZGRyICsgc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOwogfQogCi12b2lkIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBfX2twcm9iZXMgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiB9CiAKQEAgLTEyNyw3ICsxMjcsOCBAQAogCQlyZWdzLT5laXAgPSAodW5zaWduZWQgbG9uZykmcC0+YWluc24uaW5zbjsKIH0KIAotdm9pZCBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3ZvaWQgX19rcHJvYmVzIGFyY2hfcHJlcGFyZV9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnAsCisJCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyAqc2FyYSA9ICh1bnNpZ25lZCBsb25nICopJnJlZ3MtPmVzcDsKICAgICAgICAgc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CkBAIC0xNTAsNyArMTUxLDcgQEAKICAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IGFzIHRyYXAzIGlzIGFuIGludGVycnVwdCBnYXRlIGFuZCB0aGV5CiAgKiByZW1haW4gZGlzYWJsZWQgdGhvcm91Z2ggb3V0IHRoaXMgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyBpbnQga3Byb2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IF9fa3Byb2JlcyBrcHJvYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qga3Byb2JlICpwOwogCWludCByZXQgPSAwOwpAQCAtMTc2LDcgKzE3Nyw4IEBACiAJCSAgIERpc2FybSB0aGUgcHJvYmUgd2UganVzdCBoaXQsIGFuZCBpZ25vcmUgaXQuICovCiAJCXAgPSBnZXRfa3Byb2JlKGFkZHIpOwogCQlpZiAocCkgewotCQkJaWYgKGtwcm9iZV9zdGF0dXMgPT0gS1BST0JFX0hJVF9TUykgeworCQkJaWYgKGtwcm9iZV9zdGF0dXMgPT0gS1BST0JFX0hJVF9TUyAmJgorCQkJCSpwLT5haW5zbi5pbnNuID09IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT04pIHsKIAkJCQlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7CiAJCQkJcmVncy0+ZWZsYWdzIHw9IGtwcm9iZV9zYXZlZF9lZmxhZ3M7CiAJCQkJdW5sb2NrX2twcm9iZXMoKTsKQEAgLTIyMCw3ICsyMjIsMTAgQEAKIAkJCSAqIGVpdGhlciBhIHByb2JlcG9pbnQgb3IgYSBkZWJ1Z2dlciBicmVha3BvaW50CiAJCQkgKiBhdCB0aGlzIGFkZHJlc3MuICBJbiBlaXRoZXIgY2FzZSwgbm8gZnVydGhlcgogCQkJICogaGFuZGxpbmcgb2YgdGhpcyBpbnRlcnJ1cHQgaXMgYXBwcm9wcmlhdGUuCisJCQkgKiBCYWNrIHVwIG92ZXIgdGhlIChub3cgbWlzc2luZykgaW50MyBhbmQgcnVuCisJCQkgKiB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24uCiAJCQkgKi8KKwkJCXJlZ3MtPmVpcCAtPSBzaXplb2Yoa3Byb2JlX29wY29kZV90KTsKIAkJCXJldCA9IDE7CiAJCX0KIAkJLyogTm90IG9uZSBvZiBvdXJzOiBsZXQga2VybmVsIGhhbmRsZSBpdCAqLwpAQCAtMjU5LDcgKzI2NCw3IEBACiAvKgogICogQ2FsbGVkIHdoZW4gd2UgaGl0IHRoZSBwcm9iZSBwb2ludCBhdCBrcmV0cHJvYmVfdHJhbXBvbGluZQogICovCi1pbnQgdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IF9fa3Byb2JlcyB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAgICAgICAgIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpID0gTlVMTDsKICAgICAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CkBAIC0zMzgsNyArMzQzLDcgQEAKICAqIHRoYXQgaXMgYXRvcCB0aGUgc3RhY2sgaXMgdGhlIGFkZHJlc3MgZm9sbG93aW5nIHRoZSBjb3BpZWQgaW5zdHJ1Y3Rpb24uCiAgKiBXZSBuZWVkIHRvIG1ha2UgaXQgdGhlIGFkZHJlc3MgZm9sbG93aW5nIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbi4KICAqLwotc3RhdGljIHZvaWQgcmVzdW1lX2V4ZWN1dGlvbihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyByZXN1bWVfZXhlY3V0aW9uKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgKnRvcyA9ICh1bnNpZ25lZCBsb25nICopJnJlZ3MtPmVzcDsKIAl1bnNpZ25lZCBsb25nIG5leHRfZWlwID0gMDsKQEAgLTQ0NCw4ICs0NDksOCBAQAogLyoKICAqIFdyYXBwZXIgcm91dGluZSB0byBmb3IgaGFuZGxpbmcgZXhjZXB0aW9ucy4KICAqLwotaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgdmFsLAotCQkJICAgICB2b2lkICpkYXRhKQoraW50IF9fa3Byb2JlcyBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZGllX2FyZ3MgKmFyZ3MgPSAoc3RydWN0IGRpZV9hcmdzICopZGF0YTsKIAlzd2l0Y2ggKHZhbCkgewpAQCAtNDczLDcgKzQ3OCw3IEBACiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCi1pbnQgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IF9fa3Byb2JlcyBzZXRqbXBfcHJlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGpwcm9iZSAqanAgPSBjb250YWluZXJfb2YocCwgc3RydWN0IGpwcm9iZSwga3ApOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKQEAgLTQ5NSw3ICs1MDAsNyBAQAogCXJldHVybiAxOwogfQogCi12b2lkIGpwcm9iZV9yZXR1cm4odm9pZCkKK3ZvaWQgX19rcHJvYmVzIGpwcm9iZV9yZXR1cm4odm9pZCkKIHsKIAlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJYXNtIHZvbGF0aWxlICgiICAgICAgIHhjaGdsICAgJSVlYngsJSVlc3AgICAgIFxuIgpAQCAtNTA2LDcgKzUxMSw3IEBACiAJCSAgICAgIChqcHJvYmVfc2F2ZWRfZXNwKToibWVtb3J5Iik7CiB9CiAKLWludCBsb25nam1wX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitpbnQgX19rcHJvYmVzIGxvbmdqbXBfYnJlYWtfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1OCAqYWRkciA9ICh1OCAqKSAocmVncy0+ZWlwIC0gMSk7CiAJdW5zaWduZWQgbG9uZyBzdGFja19hZGRyID0gKHVuc2lnbmVkIGxvbmcpanByb2JlX3NhdmVkX2VzcDsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbGR0LmMgYi9hcmNoL2kzODYva2VybmVsL2xkdC5jCmluZGV4IGJiNTBhZmIuLmZlMWZmYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvbGR0LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9sZHQuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiBzdGF0aWMgaW50IHdyaXRlX2xkdCh2b2lkIF9fdXNlciAqIHB0ciwgdW5zaWduZWQgbG9uZyBieXRlY291bnQsIGludCBvbGRtb2RlKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSA9IGN1cnJlbnQtPm1tOwotCV9fdTMyIGVudHJ5XzEsIGVudHJ5XzIsICpscDsKKwlfX3UzMiBlbnRyeV8xLCBlbnRyeV8yOwogCWludCBlcnJvcjsKIAlzdHJ1Y3QgdXNlcl9kZXNjIGxkdF9pbmZvOwogCkBAIC0yMDUsOCArMjA1LDYgQEAKIAkJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlscCA9IChfX3UzMiAqKSAoKGxkdF9pbmZvLmVudHJ5X251bWJlciA8PCAzKSArIChjaGFyICopIG1tLT5jb250ZXh0LmxkdCk7Ci0KICAgIAkvKiBBbGxvdyBMRFRzIHRvIGJlIGNsZWFyZWQgYnkgdGhlIHVzZXIuICovCiAgICAJaWYgKGxkdF9pbmZvLmJhc2VfYWRkciA9PSAwICYmIGxkdF9pbmZvLmxpbWl0ID09IDApIHsKIAkJaWYgKG9sZG1vZGUgfHwgTERUX2VtcHR5KCZsZHRfaW5mbykpIHsKQEAgLTIyMyw4ICsyMjEsNyBAQAogCiAJLyogSW5zdGFsbCB0aGUgbmV3IGVudHJ5IC4uLiAgKi8KIGluc3RhbGw6Ci0JKmxwCT0gZW50cnlfMTsKLQkqKGxwKzEpCT0gZW50cnlfMjsKKwl3cml0ZV9sZHRfZW50cnkobW0tPmNvbnRleHQubGR0LCBsZHRfaW5mby5lbnRyeV9udW1iZXIsIGVudHJ5XzEsIGVudHJ5XzIpOwogCWVycm9yID0gMDsKIAogb3V0X3VubG9jazoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbWFjaGluZV9rZXhlYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKaW5kZXggY2I2OTlhMi4uYTkxMmZlZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTE3LDEzICsxNyw3IEBACiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX2NyMyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgY3IzOwotCWFzbSB2b2xhdGlsZSgibW92bCAlJWNyMywlMCI6ICI9ciIoY3IzKSk7Ci0JcmV0dXJuIGNyMzsKLX0KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNkZWZpbmUgUEFHRV9BTElHTkVEIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXyhQQUdFX1NJWkUpKSkKIApAQCAtOTksMTAgKzkzLDcgQEAKIAljdXJpZHQuc2l6ZSAgICA9IGxpbWl0OwogCWN1cmlkdC5hZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpbmV3aWR0OwogCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkibGlkdGwgJTBcbiIKLQkJOiA6ICJtIiAoY3VyaWR0KQotCQkpOworCWxvYWRfaWR0KCZjdXJpZHQpOwogfTsKIAogCkBAIC0xMTQsMTAgKzEwNSw3IEBACiAJY3VyZ2R0LnNpemUgICAgPSBsaW1pdDsKIAljdXJnZHQuYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKW5ld2dkdDsKIAotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJImxnZHRsICUwXG4iCi0JCTogOiAibSIgKGN1cmdkdCkKLQkJKTsKKwlsb2FkX2dkdCgmY3VyZ2R0KTsKIH07CiAKIHN0YXRpYyB2b2lkIGxvYWRfc2VnbWVudHModm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbWljcm9jb2RlLmMgYi9hcmNoL2kzODYva2VybmVsL21pY3JvY29kZS5jCmluZGV4IGE3N2M2MTIuLjE2NWYxMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvbWljcm9jb2RlLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYwpAQCAtMTY0LDcgKzE2NCw4IEBACiAJfQogCiAJd3Jtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCAwLCAwKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNwdWlkIiA6IDogOiAiYXgiLCAiYngiLCAiY3giLCAiZHgiKTsKKwkvKiBzZWUgbm90ZXMgYWJvdmUgZm9yIHJldmlzaW9uIDEuMDcuICBBcHBhcmVudCBjaGlwIGJ1ZyAqLworCXNlcmlhbGl6ZV9jcHUoKTsKIAkvKiBnZXQgdGhlIGN1cnJlbnQgcmV2aXNpb24gZnJvbSBNU1IgMHg4QiAqLwogCXJkbXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgdmFsWzBdLCB1Y2ktPnJldik7CiAJcHJfZGVidWcoIm1pY3JvY29kZTogY29sbGVjdF9jcHVfaW5mbyA6IHNpZz0weCV4LCBwZj0weCV4LCByZXY9MHgleFxuIiwKQEAgLTM3Nyw3ICszNzgsOSBAQAogCQkodW5zaWduZWQgbG9uZykgdWNpLT5tYy0+Yml0cyA+PiAxNiA+PiAxNik7CiAJd3Jtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCAwLCAwKTsKIAotCV9fYXNtX18gX192b2xhdGlsZV9fICgiY3B1aWQiIDogOiA6ICJheCIsICJieCIsICJjeCIsICJkeCIpOworCS8qIHNlZSBub3RlcyBhYm92ZSBmb3IgcmV2aXNpb24gMS4wNy4gIEFwcGFyZW50IGNoaXAgYnVnICovCisJc2VyaWFsaXplX2NwdSgpOworCiAJLyogZ2V0IHRoZSBjdXJyZW50IHJldmlzaW9uIGZyb20gTVNSIDB4OEIgKi8KIAlyZG1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIHZhbFswXSwgdmFsWzFdKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMgYi9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYwppbmRleCBjZTgzOGFiLi4xNTk0OWZkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYworKysgYi9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYwpAQCAtNjUsNiArNjUsOCBAQAogaW50IHBpY19tb2RlOwogdW5zaWduZWQgbG9uZyBtcF9sYXBpY19hZGRyOwogCit1bnNpZ25lZCBpbnQgZGVmX3RvX2JpZ3NtcCA9IDA7CisKIC8qIFByb2Nlc3NvciB0aGF0IGlzIGRvaW5nIHRoZSBib290IHVwICovCiB1bnNpZ25lZCBpbnQgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gLTFVOwogLyogSW50ZXJuYWwgcHJvY2Vzc29yIGNvdW50ICovCkBAIC0xMjEsNyArMTIzLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBNUF9wcm9jZXNzb3JfaW5mbyAoc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yICptKQogewogIAlpbnQgdmVyLCBhcGljaWQ7Ci0JcGh5c2lkX21hc2tfdCB0bXA7CisJcGh5c2lkX21hc2tfdCBwaHlzX2NwdTsKICAJCiAJaWYgKCEobS0+bXBjX2NwdWZsYWcgJiBDUFVfRU5BQkxFRCkpCiAJCXJldHVybjsKQEAgLTE5MiwyNyArMTk0LDM2IEBACiAJCQkiIFByb2Nlc3NvciBpZ25vcmVkLlxuIiwgbWF4Y3B1cyk7IAogCQlyZXR1cm47CiAJfQotCW51bV9wcm9jZXNzb3JzKys7CiAJdmVyID0gbS0+bXBjX2FwaWN2ZXI7CiAKIAlpZiAoIU1QX3ZhbGlkX2FwaWNpZChhcGljaWQsIHZlcikpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiUHJvY2Vzc29yICMlZCBJTlZBTElELiAoTWF4IElEOiAlZCkuXG4iLAogCQkJbS0+bXBjX2FwaWNpZCwgTUFYX0FQSUNTKTsKLQkJLS1udW1fcHJvY2Vzc29yczsKIAkJcmV0dXJuOwogCX0KIAotCXRtcCA9IGFwaWNpZF90b19jcHVfcHJlc2VudChhcGljaWQpOwotCXBoeXNpZHNfb3IocGh5c19jcHVfcHJlc2VudF9tYXAsIHBoeXNfY3B1X3ByZXNlbnRfbWFwLCB0bXApOwotCQorCWNwdV9zZXQobnVtX3Byb2Nlc3NvcnMsIGNwdV9wb3NzaWJsZV9tYXApOworCW51bV9wcm9jZXNzb3JzKys7CisJcGh5c19jcHUgPSBhcGljaWRfdG9fY3B1X3ByZXNlbnQoYXBpY2lkKTsKKwlwaHlzaWRzX29yKHBoeXNfY3B1X3ByZXNlbnRfbWFwLCBwaHlzX2NwdV9wcmVzZW50X21hcCwgcGh5c19jcHUpOworCiAJLyoKIAkgKiBWYWxpZGF0ZSB2ZXJzaW9uCiAJICovCiAJaWYgKHZlciA9PSAweDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQklPUyBidWcsIEFQSUMgdmVyc2lvbiBpcyAwIGZvciBDUFUjJWQhIGZpeGluZyB1cCB0byAweDEwLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIsIG0tPm1wY19hcGljaWQpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCSU9TIGJ1ZywgQVBJQyB2ZXJzaW9uIGlzIDAgZm9yIENQVSMlZCEgIgorCQkJCSJmaXhpbmcgdXAgdG8gMHgxMC4gKHRlbGwgeW91ciBodyB2ZW5kb3IpXG4iLAorCQkJCW0tPm1wY19hcGljaWQpOwogCQl2ZXIgPSAweDEwOwogCX0KIAlhcGljX3ZlcnNpb25bbS0+bXBjX2FwaWNpZF0gPSB2ZXI7CisJaWYgKChudW1fcHJvY2Vzc29ycyA+IDgpICYmCisJICAgIEFQSUNfWEFQSUModmVyKSAmJgorCSAgICAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpKQorCQlkZWZfdG9fYmlnc21wID0gMTsKKwllbHNlCisJCWRlZl90b19iaWdzbXAgPSAwOworCiAJYmlvc19jcHVfYXBpY2lkW251bV9wcm9jZXNzb3JzIC0gMV0gPSBtLT5tcGNfYXBpY2lkOwogfQogCkBAIC02NTMsOCArNjY0LDYgQEAKIAlzdHJ1Y3QgaW50ZWxfbXBfZmxvYXRpbmcgKm1wZiA9IG1wZl9mb3VuZDsKIAogCS8qCi0JICogQUNQSSBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGVudGlyZSBTTVAgY29uZmlndXJhdGlvbiBvciBqdXN0IHRvIAotCSAqIGVudW1lcmF0ZS9jb25maWd1cmUgcHJvY2Vzc29ycyAoQ09ORklHX0FDUElfQk9PVCkuICBOb3RlIHRoYXQgCiAJICogQUNQSSBzdXBwb3J0cyBib3RoIGxvZ2ljYWwgKGUuZy4gSHlwZXItVGhyZWFkaW5nKSBhbmQgcGh5c2ljYWwgCiAJICogcHJvY2Vzc29ycywgd2hlcmUgTVBTIG9ubHkgc3VwcG9ydHMgcGh5c2ljYWwuCiAJICovCkBAIC04MTAsNyArODE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJLWJhc2VkIE1QIENvbmZpZ3VyYXRpb24KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAogdm9pZCBfX2luaXQgbXBfcmVnaXN0ZXJfbGFwaWNfYWRkcmVzcyAoCiAJdTY0CQkJYWRkcmVzcykKQEAgLTg1Niw3ICs4NjUsNyBAQAogCU1QX3Byb2Nlc3Nvcl9pbmZvKCZwcm9jZXNzb3IpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIChkZWZpbmVkKENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJX0JPT1QpKQorI2lmZGVmCUNPTkZJR19YODZfSU9fQVBJQwogCiAjZGVmaW5lIE1QX0lTQV9CVVMJCTAKICNkZWZpbmUgTVBfTUFYX0lPQVBJQ19QSU4JMTI3CkBAIC0xMDcxLDExICsxMDgwLDkgQEAKIAkgKi8KIAlzdGF0aWMgaW50CQlnc2lfdG9faXJxW01BWF9HU0lfTlVNXTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JVUwogCS8qIERvbid0IHNldCB1cCB0aGUgQUNQSSBTQ0kgYmVjYXVzZSBpdCdzIGFscmVhZHkgc2V0IHVwICovCiAJaWYgKGFjcGlfZmFkdC5zY2lfaW50ID09IGdzaSkKIAkJcmV0dXJuIGdzaTsKLSNlbmRpZgogCiAJaW9hcGljID0gbXBfZmluZF9pb2FwaWMoZ3NpKTsKIAlpZiAoaW9hcGljIDwgMCkgewpAQCAtMTExOCwxMyArMTEyNSwxMSBAQAogCQlpZiAoZ3NpIDwgTUFYX0dTSV9OVU0pIHsKIAkJCWlmIChnc2kgPiAxNSkKIAkJCQlnc2kgPSBwY2lfaXJxKys7Ci0jaWZkZWYgQ09ORklHX0FDUElfQlVTCiAJCQkvKgogCQkJICogRG9uJ3QgYXNzaWduIElSUSB1c2VkIGJ5IEFDUEkgU0NJCiAJCQkgKi8KIAkJCWlmIChnc2kgPT0gYWNwaV9mYWR0LnNjaV9pbnQpCiAJCQkJZ3NpID0gcGNpX2lycSsrOwotI2VuZGlmCiAJCQlnc2lfdG9faXJxW2lycV0gPSBnc2k7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIkdTSSAldSBpcyB0b28gaGlnaFxuIiwgZ3NpKTsKQEAgLTExMzgsNSArMTE0Myw1IEBACiAJcmV0dXJuIGdzaTsKIH0KIAotI2VuZGlmIC8qQ09ORklHX1g4Nl9JT19BUElDICYmIChDT05GSUdfQUNQSV9JTlRFUlBSRVRFUiB8fCBDT05GSUdfQUNQSV9CT09UKSovCi0jZW5kaWYgLypDT05GSUdfQUNQSV9CT09UKi8KKyNlbmRpZiAvKiBDT05GSUdfWDg2X0lPX0FQSUMgKi8KKyNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9tc3IuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbXNyLmMKaW5kZXggYjJmMDNjMy4uMDMxMDBkNiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9tc3IuYworKysgYi9hcmNoL2kzODYva2VybmVsL21zci5jCkBAIC00NiwyMyArNDYsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqbXNyX2NsYXNzOwogCi0vKiBOb3RlOiAiZXJyIiBpcyBoYW5kbGVkIGluIGEgZnVubnkgd2F5IGJlbG93LiAgT3RoZXJ3aXNlIG9uZSB2ZXJzaW9uCi0gICBvZiBnY2Mgb3IgYW5vdGhlciBicmVha3MuICovCi0KIHN0YXRpYyBpbmxpbmUgaW50IHdybXNyX2Vpbyh1MzIgcmVnLCB1MzIgZWF4LCB1MzIgZWR4KQogewogCWludCBlcnI7CiAKLQlhc20gdm9sYXRpbGUgKCIxOgl3cm1zclxuIgotCQkgICAgICAiMjpcbiIKLQkJICAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKLQkJICAgICAgIjM6CW1vdmwgJTQsJTBcbiIKLQkJICAgICAgIglqbXAgMmJcbiIKLQkJICAgICAgIi5wcmV2aW91c1xuIgotCQkgICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCQkgICAgICAiCS5hbGlnbiA0XG4iICIJLmxvbmcgMWIsM2JcbiIgIi5wcmV2aW91cyI6Ij0mYkRTIiAoZXJyKQotCQkgICAgICA6ImEiKGVheCksICJkIihlZHgpLCAiYyIocmVnKSwgImkiKC1FSU8pLCAiMCIoMCkpOwotCisJZXJyID0gd3Jtc3Jfc2FmZShyZWcsIGVheCwgZWR4KTsKKwlpZiAoZXJyKQorCQllcnIgPSAtRUlPOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTcwLDE4ICs2MCw5IEBACiB7CiAJaW50IGVycjsKIAotCWFzbSB2b2xhdGlsZSAoIjE6CXJkbXNyXG4iCi0JCSAgICAgICIyOlxuIgotCQkgICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgotCQkgICAgICAiMzoJbW92bCAlNCwlMFxuIgotCQkgICAgICAiCWptcCAyYlxuIgotCQkgICAgICAiLnByZXZpb3VzXG4iCi0JCSAgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JCSAgICAgICIJLmFsaWduIDRcbiIKLQkJICAgICAgIgkubG9uZyAxYiwzYlxuIgotCQkgICAgICAiLnByZXZpb3VzIjoiPSZiRFMiIChlcnIpLCAiPWEiKCplYXgpLCAiPWQiKCplZHgpCi0JCSAgICAgIDoiYyIocmVnKSwgImkiKC1FSU8pLCAiMCIoMCkpOwotCisJZXJyID0gcmRtc3Jfc2FmZShyZWcsIGVheCwgZWR4KTsKKwlpZiAoZXJyKQorCQllcnIgPSAtRUlPOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMgYi9hcmNoL2kzODYva2VybmVsL25taS5jCmluZGV4IDhjMjQyYmIuLjAxNzg0NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYwpAQCAtNDc4LDYgKzQ3OCwxMSBAQAogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspCiAJCWFsZXJ0X2NvdW50ZXJbaV0gPSAwOworCisJLyoKKwkgKiBUaWNrbGUgdGhlIHNvZnRsb2NrdXAgZGV0ZWN0b3IgdG9vOgorCSAqLworCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKIH0KIAogZXh0ZXJuIHZvaWQgZGllX25taShzdHJ1Y3QgcHRfcmVncyAqLCBjb25zdCBjaGFyICptc2cpOwpAQCAtNTAxLDggKzUwNiwxMSBAQAogCQkgKi8KIAkJYWxlcnRfY291bnRlcltjcHVdKys7CiAJCWlmIChhbGVydF9jb3VudGVyW2NwdV0gPT0gNSpubWlfaHopCisJCQkvKgorCQkJICogZGllX25taSB3aWxsIHJldHVybiBPTkxZIGlmIE5PVElGWV9TVE9QIGhhcHBlbnMuLgorCQkJICovCiAJCQlkaWVfbm1pKHJlZ3MsICJOTUkgV2F0Y2hkb2cgZGV0ZWN0ZWQgTE9DS1VQIik7Ci0JfSBlbHNlIHsKKwogCQlsYXN0X2lycV9zdW1zW2NwdV0gPSBzdW07CiAJCWFsZXJ0X2NvdW50ZXJbY3B1XSA9IDA7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYwppbmRleCBlM2YzNjJlLi5iNDVjYmY5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJICovCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAl3aGlsZSAoMSkKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImhsdCI6OjoibWVtb3J5Iik7CisJCWhhbHQoKTsKIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgcGxheV9kZWFkKHZvaWQpCkBAIC0zMTMsMTYgKzMxMywxMiBAQAogCXByaW50aygiIERTOiAlMDR4IEVTOiAlMDR4XG4iLAogCQkweGZmZmYgJiByZWdzLT54ZHMsMHhmZmZmICYgcmVncy0+eGVzKTsKIAotCV9fYXNtX18oIm1vdmwgJSVjcjAsICUwIjogIj1yIiAoY3IwKSk7Ci0JX19hc21fXygibW92bCAlJWNyMiwgJTAiOiAiPXIiIChjcjIpKTsKLQlfX2FzbV9fKCJtb3ZsICUlY3IzLCAlMCI6ICI9ciIgKGNyMykpOwotCS8qIFRoaXMgY291bGQgZmF1bHQgaWYgJWNyNCBkb2VzIG5vdCBleGlzdCAqLwotCV9fYXNtX18oIjE6IG1vdmwgJSVjcjQsICUwCQlcbiIKLQkJIjI6CQkJCVxuIgotCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIglcbiIKLQkJIi5sb25nIDFiLDJiCQkJXG4iCi0JCSIucHJldmlvdXMJCQlcbiIKLQkJOiAiPXIiIChjcjQpOiAiMCIgKDApKTsKKwljcjAgPSByZWFkX2NyMCgpOworCWNyMiA9IHJlYWRfY3IyKCk7CisJY3IzID0gcmVhZF9jcjMoKTsKKwlpZiAoY3VycmVudF9jcHVfZGF0YS54ODYgPiA0KSB7CisJCWNyNCA9IHJlYWRfY3I0KCk7CisJfQogCXByaW50aygiQ1IwOiAlMDhseCBDUjI6ICUwOGx4IENSMzogJTA4bHggQ1I0OiAlMDhseFxuIiwgY3IwLCBjcjIsIGNyMywgY3I0KTsKIAlzaG93X3RyYWNlKE5VTEwsICZyZWdzLT5lc3ApOwogfQpAQCAtNjgyLDIzICs2NzgsMjggQEAKIAlfX3VubGF6eV9mcHUocHJldl9wKTsKIAogCS8qCi0JICogUmVsb2FkIGVzcDAsIExEVCBhbmQgdGhlIHBhZ2UgdGFibGUgcG9pbnRlcjoKKwkgKiBSZWxvYWQgZXNwMC4KIAkgKi8KIAlsb2FkX2VzcDAodHNzLCBuZXh0KTsKIAogCS8qCisJICogU2F2ZSBhd2F5ICVmcyBhbmQgJWdzLiBObyBuZWVkIHRvIHNhdmUgJWVzIGFuZCAlZHMsIGFzCisJICogdGhvc2UgYXJlIGFsd2F5cyBrZXJuZWwgc2VnbWVudHMgd2hpbGUgaW5zaWRlIHRoZSBrZXJuZWwuCisJICogRG9pbmcgdGhpcyBiZWZvcmUgc2V0dGluZyB0aGUgbmV3IFRMUyBkZXNjcmlwdG9ycyBhdm9pZHMKKwkgKiB0aGUgc2l0dWF0aW9uIHdoZXJlIHdlIHRlbXBvcmFyaWx5IGhhdmUgbm9uLXJlbG9hZGFibGUKKwkgKiBzZWdtZW50cyBpbiAlZnMgYW5kICVncy4gIFRoaXMgY291bGQgYmUgYW4gaXNzdWUgaWYgdGhlCisJICogTk1JIGhhbmRsZXIgZXZlciB1c2VkICVmcyBvciAlZ3MgKGl0IGRvZXMgbm90IHRvZGF5KSwgb3IKKwkgKiBpZiB0aGUga2VybmVsIGlzIHJ1bm5pbmcgaW5zaWRlIG9mIGEgaHlwZXJ2aXNvciBsYXllci4KKwkgKi8KKwlzYXZlc2VnbWVudChmcywgcHJldi0+ZnMpOworCXNhdmVzZWdtZW50KGdzLCBwcmV2LT5ncyk7CisKKwkvKgogCSAqIExvYWQgdGhlIHBlci10aHJlYWQgVGhyZWFkLUxvY2FsIFN0b3JhZ2UgZGVzY3JpcHRvci4KIAkgKi8KIAlsb2FkX1RMUyhuZXh0LCBjcHUpOwogCiAJLyoKLQkgKiBTYXZlIGF3YXkgJWZzIGFuZCAlZ3MuIE5vIG5lZWQgdG8gc2F2ZSAlZXMgYW5kICVkcywgYXMKLQkgKiB0aG9zZSBhcmUgYWx3YXlzIGtlcm5lbCBzZWdtZW50cyB3aGlsZSBpbnNpZGUgdGhlIGtlcm5lbC4KLQkgKi8KLQlhc20gdm9sYXRpbGUoIm1vdiAlJWZzLCUwIjoiPW0iIChwcmV2LT5mcykpOwotCWFzbSB2b2xhdGlsZSgibW92ICUlZ3MsJTAiOiI9bSIgKHByZXYtPmdzKSk7Ci0KLQkvKgogCSAqIFJlc3RvcmUgJWZzIGFuZCAlZ3MgaWYgbmVlZGVkLgogCSAqCiAJICogR2xpYmMgbm9ybWFsbHkgbWFrZXMgJWZzIGJlIHplcm8sIGFuZCAlZ3MgaXMgb25lIG9mCkBAIC03MTEsNiArNzEyLDEyIEBACiAJCWxvYWRzZWdtZW50KGdzLCBuZXh0LT5ncyk7CiAKIAkvKgorCSAqIFJlc3RvcmUgSU9QTCBpZiBuZWVkZWQuCisJICovCisJaWYgKHVubGlrZWx5KHByZXYtPmlvcGwgIT0gbmV4dC0+aW9wbCkpCisJCXNldF9pb3BsX21hc2sobmV4dC0+aW9wbCk7CisKKwkvKgogCSAqIE5vdyBtYXliZSByZWxvYWQgdGhlIGRlYnVnIHJlZ2lzdGVycwogCSAqLwogCWlmICh1bmxpa2VseShuZXh0LT5kZWJ1Z3JlZ1s3XSkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jCmluZGV4IDBkYTU5YjQuLjdiNjM2OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYwpAQCAtMjcxLDYgKzI3MSw4IEBACiB2b2lkIHB0cmFjZV9kaXNhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCiB7IAogCWNsZWFyX3NpbmdsZXN0ZXAoY2hpbGQpOworCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfRU1VKTsKIH0KIAogLyoKQEAgLTUwOSwxNSArNTExLDIwIEBACiAJCSAgfQogCQkgIGJyZWFrOwogCisJY2FzZSBQVFJBQ0VfU1lTRU1VOiAvKiBjb250aW51ZSBhbmQgc3RvcCBhdCBuZXh0IHN5c2NhbGwsIHdoaWNoIHdpbGwgbm90IGJlIGV4ZWN1dGVkICovCiAJY2FzZSBQVFJBQ0VfU1lTQ0FMTDoJLyogY29udGludWUgYW5kIHN0b3AgYXQgbmV4dCAocmV0dXJuIGZyb20pIHN5c2NhbGwgKi8KIAljYXNlIFBUUkFDRV9DT05UOgkvKiByZXN0YXJ0IGFmdGVyIHNpZ25hbC4gKi8KIAkJcmV0ID0gLUVJTzsKIAkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpCiAJCQlicmVhazsKLQkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0NBTEwpIHsKKwkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0VNVSkgeworCQkJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfRU1VKTsKKwkJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCQl9IGVsc2UgaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0NBTEwpIHsKIAkJCXNldF90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKLQkJfQotCQllbHNlIHsKKwkJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfRU1VKTsKKwkJfSBlbHNlIHsKKwkJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfRU1VKTsKIAkJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwogCQl9CiAJCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOwpAQCAtNTQyLDEwICs1NDksMTcgQEAKIAkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKIAkJYnJlYWs7CiAKKwljYXNlIFBUUkFDRV9TWVNFTVVfU0lOR0xFU1RFUDogLyogU2FtZSBhcyBTWVNFTVUsIGJ1dCBzaW5nbGVzdGVwIGlmIG5vdCBzeXNjYWxsICovCiAJY2FzZSBQVFJBQ0VfU0lOR0xFU1RFUDoJLyogc2V0IHRoZSB0cmFwIGZsYWcuICovCiAJCXJldCA9IC1FSU87CiAJCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQogCQkJYnJlYWs7CisKKwkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0VNVV9TSU5HTEVTVEVQKQorCQkJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfRU1VKTsKKwkJZWxzZQorCQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9FTVUpOworCiAJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwogCQlzZXRfc2luZ2xlc3RlcChjaGlsZCk7CiAJCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOwpAQCAtNjc4LDI3ICs2OTIsNTggQEAKICAqIC0gdHJpZ2dlcmVkIGJ5IGN1cnJlbnQtPndvcmsuc3lzY2FsbF90cmFjZQogICovCiBfX2F0dHJpYnV0ZV9fKChyZWdwYXJtKDMpKSkKLXZvaWQgZG9fc3lzY2FsbF90cmFjZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVudHJ5ZXhpdCkKK2ludCBkb19zeXNjYWxsX3RyYWNlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZW50cnlleGl0KQogewotCS8qIGRvIHRoZSBzZWN1cmUgY29tcHV0aW5nIGNoZWNrIGZpcnN0ICovCi0Jc2VjdXJlX2NvbXB1dGluZyhyZWdzLT5vcmlnX2VheCk7CisJaW50IGlzX3N5c2VtdSA9IHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfRU1VKTsKKwkvKgorCSAqIFdpdGggVElGX1NZU0NBTExfRU1VIHNldCB3ZSB3YW50IHRvIGlnbm9yZSBUSUZfU0lOR0xFU1RFUCBmb3Igc3lzY2FsbAorCSAqIGludGVyY2VwdGlvbgorCSAqLworCWludCBpc19zaW5nbGVzdGVwID0gIWlzX3N5c2VtdSAmJiB0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKTsKKwlpbnQgcmV0ID0gMDsKIAotCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSAmJiBlbnRyeWV4aXQpCi0JCWF1ZGl0X3N5c2NhbGxfZXhpdChjdXJyZW50LCBBVURJVFNDX1JFU1VMVChyZWdzLT5lYXgpLCByZWdzLT5lYXgpOworCS8qIGRvIHRoZSBzZWN1cmUgY29tcHV0aW5nIGNoZWNrIGZpcnN0ICovCisJaWYgKCFlbnRyeWV4aXQpCisJCXNlY3VyZV9jb21wdXRpbmcocmVncy0+b3JpZ19lYXgpOworCisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpKSB7CisJCWlmIChlbnRyeWV4aXQpCisJCQlhdWRpdF9zeXNjYWxsX2V4aXQoY3VycmVudCwgQVVESVRTQ19SRVNVTFQocmVncy0+ZWF4KSwKKwkJCQkJCXJlZ3MtPmVheCk7CisJCS8qIERlYnVnIHRyYXBzLCB3aGVuIHVzaW5nIFBUUkFDRV9TSU5HTEVTVEVQLCBtdXN0IGJlIHNlbnQgb25seQorCQkgKiBvbiB0aGUgc3lzY2FsbCBleGl0IHBhdGguIE5vcm1hbGx5LCB3aGVuIFRJRl9TWVNDQUxMX0FVRElUIGlzCisJCSAqIG5vdCB1c2VkLCBlbnRyeS5TIHdpbGwgY2FsbCB1cyBvbmx5IG9uIHN5c2NhbGwgZXhpdCwgbm90CisJCSAqIGVudHJ5OyBzbyB3aGVuIFRJRl9TWVNDQUxMX0FVRElUIGlzIHVzZWQgd2UgbXVzdCBhdm9pZAorCQkgKiBjYWxsaW5nIHNlbmRfc2lndHJhcCgpIG9uIHN5c2NhbGwgZW50cnkuCisJCSAqCisJCSAqIE5vdGUgdGhhdCB3aGVuIFBUUkFDRV9TWVNFTVVfU0lOR0xFU1RFUCBpcyB1c2VkLAorCQkgKiBpc19zaW5nbGVzdGVwIGlzIGZhbHNlLCBkZXNwaXRlIGhpcyBuYW1lLCBzbyB3ZSB3aWxsIHN0aWxsIGRvCisJCSAqIHRoZSBjb3JyZWN0IHRoaW5nLgorCQkgKi8KKwkJZWxzZSBpZiAoaXNfc2luZ2xlc3RlcCkKKwkJCWdvdG8gb3V0OworCX0KIAogCWlmICghKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKQogCQlnb3RvIG91dDsKIAorCS8qIElmIGEgcHJvY2VzcyBzdG9wcyBvbiB0aGUgMXN0IHRyYWNlcG9pbnQgd2l0aCBTWVNDQUxMX1RSQUNFCisJICogYW5kIHRoZW4gaXMgcmVzdW1lZCB3aXRoIFNZU0VNVV9TSU5HTEVTVEVQLCBpdCB3aWxsIGNvbWUgaW4KKwkgKiBoZXJlLiBXZSBoYXZlIHRvIGNoZWNrIHRoaXMgYW5kIHJldHVybiAqLworCWlmIChpc19zeXNlbXUgJiYgZW50cnlleGl0KQorCQlyZXR1cm4gMDsKKwogCS8qIEZha2UgYSBkZWJ1ZyB0cmFwICovCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKQorCWlmIChpc19zaW5nbGVzdGVwKQogCQlzZW5kX3NpZ3RyYXAoY3VycmVudCwgcmVncywgMCk7CiAKLQlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQorIAlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpICYmICFpc19zeXNlbXUpCiAJCWdvdG8gb3V0OwogCiAJLyogdGhlIDB4ODAgcHJvdmlkZXMgYSB3YXkgZm9yIHRoZSB0cmFjaW5nIHBhcmVudCB0byBkaXN0aW5ndWlzaAogCSAgIGJldHdlZW4gYSBzeXNjYWxsIHN0b3AgYW5kIFNJR1RSQVAgZGVsaXZlcnkgKi8KLQlwdHJhY2Vfbm90aWZ5KFNJR1RSQVAgfCAoKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFU1lTR09PRCkgPyAweDgwIDogMCkpOworCS8qIE5vdGUgdGhhdCB0aGUgZGVidWdnZXIgY291bGQgY2hhbmdlIHRoZSByZXN1bHQgb2YgdGVzdF90aHJlYWRfZmxhZyEqLworCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCB8ICgoY3VycmVudC0+cHRyYWNlICYgUFRfVFJBQ0VTWVNHT09EKSA/IDB4ODA6MCkpOwogCiAJLyoKIAkgKiB0aGlzIGlzbid0IHRoZSBzYW1lIGFzIGNvbnRpbnVpbmcgd2l0aCBhIHNpZ25hbCwgYnV0IGl0IHdpbGwgZG8KQEAgLTcwOSw5ICs3NTQsMTcgQEAKIAkJc2VuZF9zaWcoY3VycmVudC0+ZXhpdF9jb2RlLCBjdXJyZW50LCAxKTsKIAkJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKIAl9Ci0gb3V0OgorCXJldCA9IGlzX3N5c2VtdTsKK291dDoKIAlpZiAodW5saWtlbHkoY3VycmVudC0+YXVkaXRfY29udGV4dCkgJiYgIWVudHJ5ZXhpdCkKIAkJYXVkaXRfc3lzY2FsbF9lbnRyeShjdXJyZW50LCBBVURJVF9BUkNIX0kzODYsIHJlZ3MtPm9yaWdfZWF4LAogCQkJCSAgICByZWdzLT5lYngsIHJlZ3MtPmVjeCwgcmVncy0+ZWR4LCByZWdzLT5lc2kpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIDA7CiAKKwlyZWdzLT5vcmlnX2VheCA9IC0xOyAvKiBmb3JjZSBza2lwIG9mIHN5c2NhbGwgcmVzdGFydGluZyAqLworCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSkKKwkJYXVkaXRfc3lzY2FsbF9leGl0KGN1cnJlbnQsIEFVRElUU0NfUkVTVUxUKHJlZ3MtPmVheCksCisJCQkJcmVncy0+ZWF4KTsKKwlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL2kzODYva2VybmVsL3JlYm9vdC5jCmluZGV4IGM3MWZlZjMuLjFjYmI5YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgIm1hY2hfcmVib290LmgiCiAjaW5jbHVkZSA8bGludXgvcmVib290X2ZpeHVwcy5oPgogCkBAIC0yNDIsMTMgKzI0MywxMyBAQAogCiAJLyogU2V0IHVwIHRoZSBJRFQgZm9yIHJlYWwgbW9kZS4gKi8KIAotCV9fYXNtX18gX192b2xhdGlsZV9fICgibGlkdCAlMCIgOiA6ICJtIiAocmVhbF9tb2RlX2lkdCkpOworCWxvYWRfaWR0KCZyZWFsX21vZGVfaWR0KTsKIAogCS8qIFNldCB1cCBhIEdEVCBmcm9tIHdoaWNoIHdlIGNhbiBsb2FkIHNlZ21lbnQgZGVzY3JpcHRvcnMgZm9yIHJlYWwKIAkgICBtb2RlLiAgVGhlIEdEVCBpcyBub3QgdXNlZCBpbiByZWFsIG1vZGU7IGl0IGlzIGp1c3QgbmVlZGVkIGhlcmUgdG8KIAkgICBwcmVwYXJlIHRoZSBkZXNjcmlwdG9ycy4gKi8KIAotCV9fYXNtX18gX192b2xhdGlsZV9fICgibGdkdCAlMCIgOiA6ICJtIiAocmVhbF9tb2RlX2dkdCkpOworCWxvYWRfZ2R0KCZyZWFsX21vZGVfZ2R0KTsKIAogCS8qIExvYWQgdGhlIGRhdGEgc2VnbWVudCByZWdpc3RlcnMsIGFuZCB0aHVzIHRoZSBkZXNjcmlwdG9ycyByZWFkeSBmb3IKIAkgICByZWFsIG1vZGUuICBUaGUgYmFzZSBhZGRyZXNzIG9mIGVhY2ggc2VnbWVudCBpcyAweDEwMCwgMTYgdGltZXMgdGhlCkBAIC0zMTYsNyArMzE3LDcgQEAKIAlpZiAoIXJlYm9vdF90aHJ1X2Jpb3MpIHsKIAkJaWYgKGVmaV9lbmFibGVkKSB7CiAJCQllZmkucmVzZXRfc3lzdGVtKEVGSV9SRVNFVF9DT0xELCBFRklfU1VDQ0VTUywgMCwgTlVMTCk7Ci0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGlkdCAlMCI6IDoibSIgKG5vX2lkdCkpOworCQkJbG9hZF9pZHQoJm5vX2lkdCk7CiAJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW50MyIpOwogCQl9CiAJCS8qIHJlYm9vdGluZyBuZWVkcyB0byB0b3VjaCB0aGUgcGFnZSBhdCBhYnNvbHV0ZSBhZGRyIDAgKi8KQEAgLTMyNSw3ICszMjYsNyBAQAogCQkJbWFjaF9yZWJvb3RfZml4dXBzKCk7IC8qIGZvciBib2FyZCBzcGVjaWZpYyBmaXh1cHMgKi8KIAkJCW1hY2hfcmVib290KCk7CiAJCQkvKiBUaGF0IGRpZG4ndCB3b3JrIC0gZm9yY2UgYSB0cmlwbGUgZmF1bHQuLiAqLwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImxpZHQgJTAiOiA6Im0iIChub19pZHQpKTsKKwkJCWxvYWRfaWR0KCZub19pZHQpOwogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImludDMiKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2VtYXBob3JlLmMgYi9hcmNoL2kzODYva2VybmVsL3NlbWFwaG9yZS5jCmluZGV4IDQ2OWY0OTYuLjc0NTVhYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc2VtYXBob3JlLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zZW1hcGhvcmUuYwpAQCAtMTMsMTcxICsxMyw5IEBACiAgKiBydyBzZW1hcGhvcmVzIGltcGxlbWVudGVkIE5vdmVtYmVyIDE5OTkgYnkgQmVuamFtaW4gTGFIYWlzZSA8YmNybEBrdmFjay5vcmc+CiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKIC8qCi0gKiBTZW1hcGhvcmVzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhIHR3by13YXkgY291bnRlcjoKLSAqIFRoZSAiY291bnQiIHZhcmlhYmxlIGlzIGRlY3JlbWVudGVkIGZvciBlYWNoIHByb2Nlc3MKLSAqIHRoYXQgdHJpZXMgdG8gYWNxdWlyZSB0aGUgc2VtYXBob3JlLCB3aGlsZSB0aGUgInNsZWVwaW5nIgotICogdmFyaWFibGUgaXMgYSBjb3VudCBvZiBzdWNoIGFjcXVpcmVzLgotICoKLSAqIE5vdGFibHksIHRoZSBpbmxpbmUgInVwKCkiIGFuZCAiZG93bigpIiBmdW5jdGlvbnMgY2FuCi0gKiBlZmZpY2llbnRseSB0ZXN0IGlmIHRoZXkgbmVlZCB0byBkbyBhbnkgZXh0cmEgd29yayAodXAKLSAqIG5lZWRzIHRvIGRvIHNvbWV0aGluZyBvbmx5IGlmIGNvdW50IHdhcyBuZWdhdGl2ZSBiZWZvcmUKLSAqIHRoZSBpbmNyZW1lbnQgb3BlcmF0aW9uLgotICoKLSAqICJzbGVlcGluZyIgYW5kIHRoZSBjb250ZW50aW9uIHJvdXRpbmUgb3JkZXJpbmcgaXMgcHJvdGVjdGVkCi0gKiBieSB0aGUgc3BpbmxvY2sgaW4gdGhlIHNlbWFwaG9yZSdzIHdhaXRxdWV1ZSBoZWFkLgotICoKLSAqIE5vdGUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlcmUgaXMKLSAqIGNvbnRlbnRpb24gb24gdGhlIGxvY2ssIGFuZCBhcyBzdWNoIGFsbCB0aGlzIGlzIHRoZQotICogIm5vbi1jcml0aWNhbCIgcGFydCBvZiB0aGUgd2hvbGUgc2VtYXBob3JlIGJ1c2luZXNzLiBUaGUKLSAqIGNyaXRpY2FsIHBhcnQgaXMgdGhlIGlubGluZSBzdHVmZiBpbiA8YXNtL3NlbWFwaG9yZS5oPgotICogd2hlcmUgd2Ugd2FudCB0byBhdm9pZCBhbnkgZXh0cmEganVtcHMgYW5kIGNhbGxzLgotICovCi0KLS8qCi0gKiBMb2dpYzoKLSAqICAtIG9ubHkgb24gYSBib3VuZGFyeSBjb25kaXRpb24gZG8gd2UgbmVlZCB0byBjYXJlLiBXaGVuIHdlIGdvCi0gKiAgICBmcm9tIGEgbmVnYXRpdmUgY291bnQgdG8gYSBub24tbmVnYXRpdmUsIHdlIHdha2UgcGVvcGxlIHVwLgotICogIC0gd2hlbiB3ZSBnbyBmcm9tIGEgbm9uLW5lZ2F0aXZlIGNvdW50IHRvIGEgbmVnYXRpdmUgZG8gd2UKLSAqICAgIChhKSBzeW5jaHJvbml6ZSB3aXRoIHRoZSAic2xlZXBlciIgY291bnQgYW5kIChiKSBtYWtlIHN1cmUKLSAqICAgIHRoYXQgd2UncmUgb24gdGhlIHdha2V1cCBsaXN0IGJlZm9yZSB3ZSBzeW5jaHJvbml6ZSBzbyB0aGF0Ci0gKiAgICB3ZSBjYW5ub3QgbG9zZSB3YWtldXAgZXZlbnRzLgotICovCi0KLXN0YXRpYyBmYXN0Y2FsbCB2b2lkIF9fYXR0cmlidXRlX3VzZWRfXyAgX191cChzdHJ1Y3Qgc2VtYXBob3JlICpzZW0pCi17Ci0Jd2FrZV91cCgmc2VtLT53YWl0KTsKLX0KLQotc3RhdGljIGZhc3RjYWxsIHZvaWQgX19hdHRyaWJ1dGVfdXNlZF9fIF9fc2NoZWQgX19kb3duKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXRzay0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKLQlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmVfbG9ja2VkKCZzZW0tPndhaXQsICZ3YWl0KTsKLQotCXNlbS0+c2xlZXBlcnMrKzsKLQlmb3IgKDs7KSB7Ci0JCWludCBzbGVlcGVycyA9IHNlbS0+c2xlZXBlcnM7Ci0KLQkJLyoKLQkJICogQWRkICJldmVyeWJvZHkgZWxzZSIgaW50byBpdC4gVGhleSBhcmVuJ3QKLQkJICogcGxheWluZywgYmVjYXVzZSB3ZSBvd24gdGhlIHNwaW5sb2NrIGluCi0JCSAqIHRoZSB3YWl0X3F1ZXVlX2hlYWQuCi0JCSAqLwotCQlpZiAoIWF0b21pY19hZGRfbmVnYXRpdmUoc2xlZXBlcnMgLSAxLCAmc2VtLT5jb3VudCkpIHsKLQkJCXNlbS0+c2xlZXBlcnMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJc2VtLT5zbGVlcGVycyA9IDE7CS8qIHVzIC0gc2VlIC0xIGFib3ZlICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbS0+d2FpdC5sb2NrLCBmbGFncyk7Ci0KLQkJc2NoZWR1bGUoKTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKLQkJdHNrLT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOwotCX0KLQlyZW1vdmVfd2FpdF9xdWV1ZV9sb2NrZWQoJnNlbS0+d2FpdCwgJndhaXQpOwotCXdha2VfdXBfbG9ja2VkKCZzZW0tPndhaXQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbS0+d2FpdC5sb2NrLCBmbGFncyk7Ci0JdHNrLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLX0KLQotc3RhdGljIGZhc3RjYWxsIGludCBfX2F0dHJpYnV0ZV91c2VkX18gX19zY2hlZCBfX2Rvd25faW50ZXJydXB0aWJsZShzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQotewotCWludCByZXR2YWwgPSAwOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl0c2stPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCXNwaW5fbG9ja19pcnFzYXZlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOwotCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZV9sb2NrZWQoJnNlbS0+d2FpdCwgJndhaXQpOwotCi0Jc2VtLT5zbGVlcGVycysrOwotCWZvciAoOzspIHsKLQkJaW50IHNsZWVwZXJzID0gc2VtLT5zbGVlcGVyczsKLQotCQkvKgotCQkgKiBXaXRoIHNpZ25hbHMgcGVuZGluZywgdGhpcyB0dXJucyBpbnRvCi0JCSAqIHRoZSB0cnlsb2NrIGZhaWx1cmUgY2FzZSAtIHdlIHdvbid0IGJlCi0JCSAqIHNsZWVwaW5nLCBhbmQgd2UqIGNhbid0IGdldCB0aGUgbG9jayBhcwotCQkgKiBpdCBoYXMgY29udGVudGlvbi4gSnVzdCBjb3JyZWN0IHRoZSBjb3VudAotCQkgKiBhbmQgZXhpdC4KLQkJICovCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJcmV0dmFsID0gLUVJTlRSOwotCQkJc2VtLT5zbGVlcGVycyA9IDA7Ci0JCQlhdG9taWNfYWRkKHNsZWVwZXJzLCAmc2VtLT5jb3VudCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qCi0JCSAqIEFkZCAiZXZlcnlib2R5IGVsc2UiIGludG8gaXQuIFRoZXkgYXJlbid0Ci0JCSAqIHBsYXlpbmcsIGJlY2F1c2Ugd2Ugb3duIHRoZSBzcGlubG9jayBpbgotCQkgKiB3YWl0X3F1ZXVlX2hlYWQuIFRoZSAiLTEiIGlzIGJlY2F1c2Ugd2UncmUKLQkJICogc3RpbGwgaG9waW5nIHRvIGdldCB0aGUgc2VtYXBob3JlLgotCQkgKi8KLQkJaWYgKCFhdG9taWNfYWRkX25lZ2F0aXZlKHNsZWVwZXJzIC0gMSwgJnNlbS0+Y291bnQpKSB7Ci0JCQlzZW0tPnNsZWVwZXJzID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCXNlbS0+c2xlZXBlcnMgPSAxOwkvKiB1cyAtIHNlZSAtMSBhYm92ZSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOwotCi0JCXNjaGVkdWxlKCk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbS0+d2FpdC5sb2NrLCBmbGFncyk7Ci0JCXRzay0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JfQotCXJlbW92ZV93YWl0X3F1ZXVlX2xvY2tlZCgmc2VtLT53YWl0LCAmd2FpdCk7Ci0Jd2FrZV91cF9sb2NrZWQoJnNlbS0+d2FpdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKLQotCXRzay0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKLSAqIFRyeWxvY2sgZmFpbGVkIC0gbWFrZSBzdXJlIHdlIGNvcnJlY3QgZm9yCi0gKiBoYXZpbmcgZGVjcmVtZW50ZWQgdGhlIGNvdW50LgotICoKLSAqIFdlIGNvdWxkIGhhdmUgZG9uZSB0aGUgdHJ5bG9jayB3aXRoIGEKLSAqIHNpbmdsZSAiY21weGNoZyIgd2l0aG91dCBmYWlsdXJlIGNhc2VzLAotICogYnV0IHRoZW4gaXQgd291bGRuJ3Qgd29yayBvbiBhIDM4Ni4KLSAqLwotc3RhdGljIGZhc3RjYWxsIGludCBfX2F0dHJpYnV0ZV91c2VkX18gX19kb3duX3RyeWxvY2soc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKLXsKLQlpbnQgc2xlZXBlcnM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOwotCXNsZWVwZXJzID0gc2VtLT5zbGVlcGVycyArIDE7Ci0Jc2VtLT5zbGVlcGVycyA9IDA7Ci0KLQkvKgotCSAqIEFkZCAiZXZlcnlib2R5IGVsc2UiIGFuZCB1cyBpbnRvIGl0LiBUaGV5IGFyZW4ndAotCSAqIHBsYXlpbmcsIGJlY2F1c2Ugd2Ugb3duIHRoZSBzcGlubG9jayBpbiB0aGUKLQkgKiB3YWl0X3F1ZXVlX2hlYWQuCi0JICovCi0JaWYgKCFhdG9taWNfYWRkX25lZ2F0aXZlKHNsZWVwZXJzLCAmc2VtLT5jb3VudCkpIHsKLQkJd2FrZV91cF9sb2NrZWQoJnNlbS0+d2FpdCk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMTsKLX0KLQotCi0vKgogICogVGhlIHNlbWFwaG9yZSBvcGVyYXRpb25zIGhhdmUgYSBzcGVjaWFsIGNhbGxpbmcgc2VxdWVuY2UgdGhhdAogICogYWxsb3cgdXMgdG8gZG8gYSBzaW1wbGVyIGluLWxpbmUgdmVyc2lvbiBvZiB0aGVtLiBUaGVzZSByb3V0aW5lcwogICogbmVlZCB0byBjb252ZXJ0IHRoYXQgc2VxdWVuY2UgYmFjayBpbnRvIHRoZSBDIHNlcXVlbmNlIHdoZW4KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwppbmRleCBhZjRkZTU4Li5mM2Q4MDg0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCkBAIC04MiwxOSArODIsMTkgQEAKIC8qIGNwdSBkYXRhIGFzIGRldGVjdGVkIGJ5IHRoZSBhc3NlbWJseSBjb2RlIGluIGhlYWQuUyAqLwogc3RydWN0IGNwdWluZm9feDg2IG5ld19jcHVfZGF0YSBfX2luaXRkYXRhID0geyAwLCAwLCAwLCAwLCAtMSwgMSwgMCwgMCwgLTEgfTsKIC8qIGNvbW1vbiBjcHUgZGF0YSBmb3IgYWxsIGNwdXMgKi8KLXN0cnVjdCBjcHVpbmZvX3g4NiBib290X2NwdV9kYXRhID0geyAwLCAwLCAwLCAwLCAtMSwgMSwgMCwgMCwgLTEgfTsKK3N0cnVjdCBjcHVpbmZvX3g4NiBib290X2NwdV9kYXRhIF9fcmVhZF9tb3N0bHkgPSB7IDAsIDAsIDAsIDAsIC0xLCAxLCAwLCAwLCAtMSB9OwogRVhQT1JUX1NZTUJPTChib290X2NwdV9kYXRhKTsKIAogdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzOwogCi0jaWZkZWYJQ09ORklHX0FDUElfSU5URVJQUkVURVIKKyNpZmRlZglDT05GSUdfQUNQSQogCWludCBhY3BpX2Rpc2FibGVkID0gMDsKICNlbHNlCiAJaW50IGFjcGlfZGlzYWJsZWQgPSAxOwogI2VuZGlmCiBFWFBPUlRfU1lNQk9MKGFjcGlfZGlzYWJsZWQpOwogCi0jaWZkZWYJQ09ORklHX0FDUElfQk9PVAorI2lmZGVmCUNPTkZJR19BQ1BJCiBpbnQgX19pbml0ZGF0YSBhY3BpX2ZvcmNlID0gMDsKIGV4dGVybiBhY3BpX2ludGVycnVwdF9mbGFncwlhY3BpX3NjaV9mbGFnczsKICNlbmRpZgpAQCAtMTM5LDYgKzEzOSw3IEBACiAJdW5zaWduZWQgY2hhciB0YWJsZVswXTsKIH07CiBzdHJ1Y3QgZWRpZF9pbmZvIGVkaWRfaW5mbzsKK0VYUE9SVF9TWU1CT0xfR1BMKGVkaWRfaW5mbyk7CiBzdHJ1Y3QgaXN0X2luZm8gaXN0X2luZm87CiAjaWYgZGVmaW5lZChDT05GSUdfWDg2X1NQRUVEU1RFUF9TTUkpIHx8IFwKIAlkZWZpbmVkKENPTkZJR19YODZfU1BFRURTVEVQX1NNSV9NT0RVTEUpCkBAIC0zNzAsMTIgKzM3MSwxNiBAQAogCWludCBpOwogCiAJaWYgKGVmaV9lbmFibGVkKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBtZW1tYXAubnJfbWFwOyBpKyspIHsKLQkJCWN1cnJlbnRfYWRkciA9IG1lbW1hcC5tYXBbaV0ucGh5c19hZGRyICsKLQkJCQkgICAgICAgKG1lbW1hcC5tYXBbaV0ubnVtX3BhZ2VzIDw8IDEyKTsKLQkJCWlmIChtZW1tYXAubWFwW2ldLnR5cGUgPT0gRUZJX0NPTlZFTlRJT05BTF9NRU1PUlkpIHsKKwkJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCQl2b2lkICpwOworCisJCWZvciAocCA9IG1lbW1hcC5tYXAsIGkgPSAwOyBwIDwgbWVtbWFwLm1hcF9lbmQ7CisJCQlwICs9IG1lbW1hcC5kZXNjX3NpemUsIGkrKykgeworCQkJbWQgPSBwOworCQkJY3VycmVudF9hZGRyID0gbWQtPnBoeXNfYWRkciArIChtZC0+bnVtX3BhZ2VzIDw8IDEyKTsKKwkJCWlmIChtZC0+dHlwZSA9PSBFRklfQ09OVkVOVElPTkFMX01FTU9SWSkgewogCQkJCWlmIChjdXJyZW50X2FkZHIgPj0gc2l6ZSkgewotCQkJCQltZW1tYXAubWFwW2ldLm51bV9wYWdlcyAtPQorCQkJCQltZC0+bnVtX3BhZ2VzIC09CiAJCQkJCQkoKChjdXJyZW50X2FkZHItc2l6ZSkgKyBQQUdFX1NJWkUtMSkgPj4gUEFHRV9TSElGVCk7CiAJCQkJCW1lbW1hcC5ucl9tYXAgPSBpICsgMTsKIAkJCQkJcmV0dXJuOwpAQCAtNzk0LDcgKzc5OSw3IEBACiAJCX0KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVAorI2lmZGVmIENPTkZJR19BQ1BJCiAJCS8qICJhY3BpPW9mZiIgZGlzYWJsZXMgYm90aCBBQ1BJIHRhYmxlIHBhcnNpbmcgYW5kIGludGVycHJldGVyICovCiAJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGk9b2ZmIiwgOCkpIHsKIAkJCWRpc2FibGVfYWNwaSgpOwpAQCAtODUwLDcgKzg1NSw3IEBACiAJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgIm5vYXBpYyIsIDYpKQogCQkJZGlzYWJsZV9pb2FwaWNfc2V0dXAoKTsKICNlbmRpZiAvKiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KLSNlbmRpZiAvKiBDT05GSUdfQUNQSV9CT09UICovCisjZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KIAogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogCQkvKiBlbmFibGUgbG9jYWwgQVBJQyAqLwpAQCAtMTI5NSw3ICsxMzAwLDcgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IHJlZ2lzdGVyX21lbW9yeSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZ2Fwc3RhcnQsIGdhcHNpemU7CisJdW5zaWduZWQgbG9uZyBnYXBzdGFydCwgZ2Fwc2l6ZSwgcm91bmQ7CiAJdW5zaWduZWQgbG9uZyBsb25nIGxhc3Q7CiAJaW50CSAgICAgIGk7CiAKQEAgLTEzNDAsMTQgKzEzNDUsMTQgQEAKIAl9CiAKIAkvKgotCSAqIFN0YXJ0IGFsbG9jYXRpbmcgZHluYW1pYyBQQ0kgbWVtb3J5IGEgYml0IGludG8gdGhlIGdhcCwKLQkgKiBhbGlnbmVkIHVwIHRvIHRoZSBuZWFyZXN0IG1lZ2FieXRlLgotCSAqCi0JICogUXVlc3Rpb246IHNob3VsZCB3ZSB0cnkgdG8gcGFkIGl0IHVwIGEgYml0IChkbyBzb21ldGhpbmcKLQkgKiBsaWtlICIgKyAoZ2Fwc2l6ZSA+PiAzKSIgaW4gdGhlcmUgdG9vPykuIFdlIG5vdyBoYXZlIHRoZQotCSAqIHRlY2hub2xvZ3kuCisJICogU2VlIGhvdyBtdWNoIHdlIHdhbnQgdG8gcm91bmQgdXA6IHN0YXJ0IG9mZiB3aXRoCisJICogcm91bmRpbmcgdG8gdGhlIG5leHQgMU1CIGFyZWEuCiAJICovCi0JcGNpX21lbV9zdGFydCA9IChnYXBzdGFydCArIDB4ZmZmZmYpICYgfjB4ZmZmZmY7CisJcm91bmQgPSAweDEwMDAwMDsKKwl3aGlsZSAoKGdhcHNpemUgPj4gNCkgPiByb3VuZCkKKwkJcm91bmQgKz0gcm91bmQ7CisJLyogRnVuIHdpdGggdHdvJ3MgY29tcGxlbWVudCAqLworCXBjaV9tZW1fc3RhcnQgPSAoZ2Fwc3RhcnQgKyByb3VuZCkgJiAtcm91bmQ7CiAKIAlwcmludGsoIkFsbG9jYXRpbmcgUENJIHJlc291cmNlcyBzdGFydGluZyBhdCAlMDhseCAoZ2FwOiAlMDhseDolMDhseClcbiIsCiAJCXBjaV9tZW1fc3RhcnQsIGdhcHN0YXJ0LCBnYXBzaXplKTsKQEAgLTE1NzUsMTQgKzE1ODAsMjAgQEAKIAlpZiAoZWZpX2VuYWJsZWQpCiAJCWVmaV9tYXBfbWVtbWFwKCk7CiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAkvKgogCSAqIFBhcnNlIHRoZSBBQ1BJIHRhYmxlcyBmb3IgcG9zc2libGUgYm9vdC10aW1lIFNNUCBjb25maWd1cmF0aW9uLgogCSAqLwogCWFjcGlfYm9vdF90YWJsZV9pbml0KCk7CiAJYWNwaV9ib290X2luaXQoKTsKLSNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR19YODZfUEMpCisJaWYgKGRlZl90b19iaWdzbXApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1vcmUgdGhhbiA4IENQVXMgZGV0ZWN0ZWQgYW5kICIKKwkJCSJDT05GSUdfWDg2X1BDIGNhbm5vdCBoYW5kbGUgaXQuXG5Vc2UgIgorCQkJIkNPTkZJR19YODZfR0VORVJJQ0FSQ0ggb3IgQ09ORklHX1g4Nl9CSUdTTVAuXG4iKTsKKyNlbmRpZgorI2VuZGlmCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAJaWYgKHNtcF9mb3VuZF9jb25maWcpCiAJCWdldF9zbXBfY29uZmlnKCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NpZ2ZyYW1lLmggYi9hcmNoL2kzODYva2VybmVsL3NpZ2ZyYW1lLmgKaW5kZXggZDIxYjE0Zi4uMGIyMjIxNyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zaWdmcmFtZS5oCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2lnZnJhbWUuaApAQCAtMSw2ICsxLDYgQEAKIHN0cnVjdCBzaWdmcmFtZQogewotCWNoYXIgKnByZXRjb2RlOworCWNoYXIgX191c2VyICpwcmV0Y29kZTsKIAlpbnQgc2lnOwogCXN0cnVjdCBzaWdjb250ZXh0IHNjOwogCXN0cnVjdCBfZnBzdGF0ZSBmcHN0YXRlOwpAQCAtMTAsMTAgKzEwLDEwIEBACiAKIHN0cnVjdCBydF9zaWdmcmFtZQogewotCWNoYXIgKnByZXRjb2RlOworCWNoYXIgX191c2VyICpwcmV0Y29kZTsKIAlpbnQgc2lnOwotCXN0cnVjdCBzaWdpbmZvICpwaW5mbzsKLQl2b2lkICpwdWM7CisJc3RydWN0IHNpZ2luZm8gX191c2VyICpwaW5mbzsKKwl2b2lkIF9fdXNlciAqcHVjOwogCXN0cnVjdCBzaWdpbmZvIGluZm87CiAJc3RydWN0IHVjb250ZXh0IHVjOwogCXN0cnVjdCBfZnBzdGF0ZSBmcHN0YXRlOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMTQwZTM0MC4uNjFlYjBjOCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NpZ25hbC5jCkBAIC0yNzgsOSArMjc4LDkgQEAKIAlpbnQgdG1wLCBlcnIgPSAwOwogCiAJdG1wID0gMDsKLQlfX2FzbV9fKCJtb3ZsICUlZ3MsJTAiIDogIj1yIih0bXApOiAiMCIodG1wKSk7CisJc2F2ZXNlZ21lbnQoZ3MsIHRtcCk7CiAJZXJyIHw9IF9fcHV0X3VzZXIodG1wLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSZzYy0+Z3MpOwotCV9fYXNtX18oIm1vdmwgJSVmcywlMCIgOiAiPXIiKHRtcCk6ICIwIih0bXApKTsKKwlzYXZlc2VnbWVudChmcywgdG1wKTsKIAllcnIgfD0gX19wdXRfdXNlcih0bXAsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5mcyk7CiAKIAllcnIgfD0gX19wdXRfdXNlcihyZWdzLT54ZXMsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5lcyk7CkBAIC02MDQsNyArNjA0LDkgQEAKIAkgKiBXZSB3YW50IHRoZSBjb21tb24gY2FzZSB0byBnbyBmYXN0LCB3aGljaAogCSAqIGlzIHdoeSB3ZSBtYXkgaW4gY2VydGFpbiBjYXNlcyBnZXQgaGVyZSBmcm9tCiAJICoga2VybmVsIG1vZGUuIEp1c3QgcmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcKLQkgKiBpZiBzby4KKyAJICogaWYgc28uICB2bTg2IHJlZ3Mgc3dpdGNoZWQgb3V0IGJ5IGFzc2VtYmx5IGNvZGUKKyAJICogYmVmb3JlIHJlYWNoaW5nIGhlcmUsIHNvIHRlc3RpbmcgYWdhaW5zdCBrZXJuZWwKKyAJICogQ1Mgc3VmZmljZXMuCiAJICovCiAJaWYgKCF1c2VyX21vZGUocmVncykpCiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zbXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wLmMKaW5kZXggY2VjNGJkZS4uNDhiNTVkYiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NtcC5jCkBAIC01NzYsNyArNTc2LDcgQEAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCWRpc2FibGVfbG9jYWxfQVBJQygpOwogCWlmIChjcHVfZGF0YVtzbXBfcHJvY2Vzc29yX2lkKCldLmhsdF93b3Jrc19vaykKLQkJZm9yKDs7KSBfX2FzbV9fKCJobHQiKTsKKwkJZm9yKDs7KSBoYWx0KCk7CiAJZm9yICg7Oyk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKaW5kZXggOGFjOGU5Zi4uYzcwY2QyYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKQEAgLTg4LDYgKzg4LDggQEAKIGNwdW1hc2tfdCBjcHVfY2FsbGluX21hcDsKIGNwdW1hc2tfdCBjcHVfY2FsbG91dF9tYXA7CiBFWFBPUlRfU1lNQk9MKGNwdV9jYWxsb3V0X21hcCk7CitjcHVtYXNrX3QgY3B1X3Bvc3NpYmxlX21hcDsKK0VYUE9SVF9TWU1CT0woY3B1X3Bvc3NpYmxlX21hcCk7CiBzdGF0aWMgY3B1bWFza190IHNtcF9jb21tZW5jZWRfbWFzazsKIAogLyogVFNDJ3MgdXBwZXIgMzIgYml0cyBjYW4ndCBiZSB3cml0dGVuIGluIGVhcmlsZXIgQ1BVIChiZWZvcmUgcHJlc2NvdHQpLCB0aGVyZQpAQCAtMTAxNyw4ICsxMDE5LDggQEAKIAl0c2Nfc3luY19kaXNhYmxlZCA9IDE7CiAKIAkvKiBpbml0IGxvdyBtZW0gbWFwcGluZyAqLwotCW1lbWNweShzd2FwcGVyX3BnX2Rpciwgc3dhcHBlcl9wZ19kaXIgKyBVU0VSX1BHRF9QVFJTLAotCQkJc2l6ZW9mKHN3YXBwZXJfcGdfZGlyWzBdKSAqIEtFUk5FTF9QR0RfUFRSUyk7CisJY2xvbmVfcGdkX3JhbmdlKHN3YXBwZXJfcGdfZGlyLCBzd2FwcGVyX3BnX2RpciArIFVTRVJfUEdEX1BUUlMsCisJCQlLRVJORUxfUEdEX1BUUlMpOwogCWZsdXNoX3RsYl9hbGwoKTsKIAlzY2hlZHVsZV93b3JrKCZ0YXNrKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkb25lKTsKQEAgLTEyNjUsNiArMTI2Nyw3IEBACiAJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKIAljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X2NhbGxvdXRfbWFwKTsKIAljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X3ByZXNlbnRfbWFwKTsKKwljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X3Bvc3NpYmxlX21hcCk7CiAJcGVyX2NwdShjcHVfc3RhdGUsIHNtcF9wcm9jZXNzb3JfaWQoKSkgPSBDUFVfT05MSU5FOwogfQogCkBAIC0xMzI3LDggKzEzMzAsNyBAQAogCQkJcHJpbnRrICgiQ1BVICVkIGlzIG5vdyBvZmZsaW5lXG4iLCBjcHUpOwogCQkJcmV0dXJuOwogCQl9Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoSFovMTApOworCQltc2xlZXAoMTAwKTsKIAl9CiAgCXByaW50ayhLRVJOX0VSUiAiQ1BVICV1IGRpZG4ndCBkaWUuLi5cbiIsIGNwdSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCmluZGV4IDBlZTlkZWUuLjI4ODNhNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCkBAIC0xOTQsMTAgKzE5NCw3IEBACiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOwogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOwogCi0JdGltZV9hZGp1c3QgPSAwOwkJLyogc3RvcCBhY3RpdmUgYWRqdGltZSgpICovCi0JdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJbnRwX2NsZWFyKCk7CiAJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CiAJY2xvY2tfd2FzX3NldCgpOwogCXJldHVybiAwOwpAQCAtMjUyLDggKzI0OSw3IEBACiAgKiB0aW1lcl9pbnRlcnJ1cHQoKSBuZWVkcyB0byBrZWVwIHVwIHRoZSByZWFsLXRpbWUgY2xvY2ssCiAgKiBhcyB3ZWxsIGFzIGNhbGwgdGhlICJkb190aW1lcigpIiByb3V0aW5lIGV2ZXJ5IGNsb2NrdGljawogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZG9fdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKLQkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCWlmICh0aW1lcl9hY2spIHsKQEAgLTMwNyw3ICszMDMsNyBAQAogCiAJY3VyX3RpbWVyLT5tYXJrX29mZnNldCgpOwogIAotCWRvX3RpbWVyX2ludGVycnVwdChpcnEsIE5VTEwsIHJlZ3MpOworCWRvX3RpbWVyX2ludGVycnVwdChpcnEsIHJlZ3MpOwogCiAJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0zMzMsOCArMzI5LDcgQEAKIAogc3RhdGljIHZvaWQgc3luY19jbW9zX2Nsb2NrKHVuc2lnbmVkIGxvbmcgZHVtbXkpOwogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc3luY19jbW9zX3RpbWVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRVJfSU5JVElBTElaRVIoc3luY19jbW9zX2Nsb2NrLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoc3luY19jbW9zX3RpbWVyLCBzeW5jX2Ntb3NfY2xvY2ssIDAsIDApOwogCiBzdGF0aWMgdm9pZCBzeW5jX2Ntb3NfY2xvY2sodW5zaWduZWQgbG9uZyBkdW1teSkKIHsKQEAgLTM0OCw3ICszNDMsNyBAQAogCSAqIFRoaXMgY29kZSBpcyBydW4gb24gYSB0aW1lci4gIElmIHRoZSBjbG9jayBpcyBzZXQsIHRoYXQgdGltZXIKIAkgKiBtYXkgbm90IGV4cGlyZSBhdCB0aGUgY29ycmVjdCB0aW1lLiAgVGh1cywgd2UgYWRqdXN0Li4uCiAJICovCi0JaWYgKCh0aW1lX3N0YXR1cyAmIFNUQV9VTlNZTkMpICE9IDApCisJaWYgKCFudHBfc3luY2VkKCkpCiAJCS8qCiAJCSAqIE5vdCBzeW5jZWQsIGV4aXQsIGRvIG5vdCByZXN0YXJ0IGEgdGltZXIgKGlmIG9uZSBpcwogCQkgKiBydW5uaW5nLCBsZXQgaXQgcnVuIG91dCkuCkBAIC0zODMsNiArMzc4LDcgQEAKIAogc3RhdGljIGxvbmcgY2xvY2tfY21vc19kaWZmLCBzbGVlcF9zdGFydDsKIAorc3RhdGljIHN0cnVjdCB0aW1lcl9vcHRzICpsYXN0X3RpbWVyOwogc3RhdGljIGludCB0aW1lcl9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAkvKgpAQCAtMzkxLDYgKzM4NywxMCBAQAogCWNsb2NrX2Ntb3NfZGlmZiA9IC1nZXRfY21vc190aW1lKCk7CiAJY2xvY2tfY21vc19kaWZmICs9IGdldF9zZWNvbmRzKCk7CiAJc2xlZXBfc3RhcnQgPSBnZXRfY21vc190aW1lKCk7CisJbGFzdF90aW1lciA9IGN1cl90aW1lcjsKKwljdXJfdGltZXIgPSAmdGltZXJfbm9uZTsKKwlpZiAobGFzdF90aW1lci0+c3VzcGVuZCkKKwkJbGFzdF90aW1lci0+c3VzcGVuZChzdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwNCw2ICs0MDQsNyBAQAogCWlmIChpc19ocGV0X2VuYWJsZWQoKSkKIAkJaHBldF9yZWVuYWJsZSgpOwogI2VuZGlmCisJc2V0dXBfcGl0X3RpbWVyKCk7CiAJc2VjID0gZ2V0X2Ntb3NfdGltZSgpICsgY2xvY2tfY21vc19kaWZmOwogCXNsZWVwX2xlbmd0aCA9IChnZXRfY21vc190aW1lKCkgLSBzbGVlcF9zdGFydCkgKiBIWjsKIAl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKQEAgLTQxMiw2ICs0MTMsMTEgQEAKIAl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwogCWppZmZpZXMgKz0gc2xlZXBfbGVuZ3RoOwogCXdhbGxfamlmZmllcyArPSBzbGVlcF9sZW5ndGg7CisJaWYgKGxhc3RfdGltZXItPnJlc3VtZSkKKwkJbGFzdF90aW1lci0+cmVzdW1lKCk7CisJY3VyX3RpbWVyID0gbGFzdF90aW1lcjsKKwlsYXN0X3RpbWVyID0gTlVMTDsKKwl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2hwZXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2hwZXQuYwppbmRleCBlZjhkYWM1Li5kOTczYThiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfaHBldC5jCkBAIC0xOCw4ICsxOCw4IEBACiAjaW5jbHVkZSAibWFjaF90aW1lci5oIgogI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9fcmVhZF9tb3N0bHkgaHBldF91c2VjX3F1b3RpZW50OwkvKiBjb252ZXJ0IGhwZXQgY2xrcyB0byB1c2VjICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB0c2NfaHBldF9xdW90aWVudDsJCS8qIGNvbnZlcnQgdHNjIHRvIGhwZXQgY2xrcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF91c2VjX3F1b3RpZW50IF9fcmVhZF9tb3N0bHk7CS8qIGNvbnZlcnQgaHBldCBjbGtzIHRvIHVzZWMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRzY19ocGV0X3F1b3RpZW50IF9fcmVhZF9tb3N0bHk7CS8qIGNvbnZlcnQgdHNjIHRvIGhwZXQgY2xrcyAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9sYXN0OyAJLyogaHBldCBjb3VudGVyIHZhbHVlIGF0IGxhc3QgdGljayovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19sb3c7CS8qIGxzYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF90c2NfaGlnaDsgCS8qIG1zYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLwpAQCAtMTM2LDYgKzEzNiw4IEBACiAJfSB3aGlsZSAoKGhwZXRfZW5kIC0gaHBldF9zdGFydCkgPCAobG9vcHMpKTsKIH0KIAorc3RhdGljIHN0cnVjdCB0aW1lcl9vcHRzIHRpbWVyX2hwZXQ7CisKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfaHBldChjaGFyKiBvdmVycmlkZSkKIHsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdCwgcmVtYWluOwpAQCAtMTYzLDYgKzE2NSw4IEBACiAJCQl9CiAJCQlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHovMTAwMCk7CiAJCX0KKwkJLyogc2V0IHRoaXMgb25seSB3aGVuIGNwdV9oYXNfdHNjICovCisJCXRpbWVyX2hwZXQucmVhZF90aW1lciA9IHJlYWRfdGltZXJfdHNjOwogCX0KIAogCS8qCkBAIC0xNzcsNiArMTgxLDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaHBldF9yZXN1bWUodm9pZCkKK3sKKwl3cml0ZV9zZXFsb2NrKCZtb25vdG9uaWNfbG9jayk7CisJLyogQXNzdW1lIHRoaXMgaXMgdGhlIGxhc3QgbWFyayBvZmZzZXQgdGltZSAqLworCXJkdHNjKGxhc3RfdHNjX2xvdywgbGFzdF90c2NfaGlnaCk7CisKKwlpZiAoaHBldF91c2VfdGltZXIpCisJCWhwZXRfbGFzdCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApIC0gaHBldF90aWNrOworCWVsc2UKKwkJaHBldF9sYXN0ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCXdyaXRlX3NlcXVubG9jaygmbW9ub3RvbmljX2xvY2spOworCXJldHVybiAwOworfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogdHNjIHRpbWVyX29wdHMgc3RydWN0ICovCkBAIC0xODYsNyArMjAzLDcgQEAKIAkuZ2V0X29mZnNldCA9CQlnZXRfb2Zmc2V0X2hwZXQsCiAJLm1vbm90b25pY19jbG9jayA9CW1vbm90b25pY19jbG9ja19ocGV0LAogCS5kZWxheSA9IAkJZGVsYXlfaHBldCwKLQkucmVhZF90aW1lciA9IAkJcmVhZF90aW1lcl90c2MsCisJLnJlc3VtZQk9CQlocGV0X3Jlc3VtZSwKIH07CiAKIHN0cnVjdCBpbml0X3RpbWVyX29wdHMgX19pbml0ZGF0YSB0aW1lcl9ocGV0X2luaXQgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9waXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3BpdC5jCmluZGV4IDA2ZGUwMzYuLmVkZGI2NDAgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3BpdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3BpdC5jCkBAIC0xNzUsMzAgKzE3NSwzIEBACiAJb3V0YihMQVRDSCA+PiA4ICwgUElUX0NIMCk7CS8qIE1TQiAqLwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKIH0KLQotc3RhdGljIGludCB0aW1lcl9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKLXsKLQlzZXR1cF9waXRfdGltZXIoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgdGltZXJfc3lzY2xhc3MgPSB7Ci0Jc2V0X2tzZXRfbmFtZSgidGltZXJfcGl0IiksCi0JLnJlc3VtZQk9IHRpbWVyX3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfdGltZXIgPSB7Ci0JLmlkCT0gMCwKLQkuY2xzCT0gJnRpbWVyX3N5c2NsYXNzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdF90aW1lcl9zeXNmcyh2b2lkKQotewotCWludCBlcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmdGltZXJfc3lzY2xhc3MpOwotCWlmICghZXJyb3IpCi0JCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfdGltZXIpOwotCXJldHVybiBlcnJvcjsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGluaXRfdGltZXJfc3lzZnMpOwotCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9wbS5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcG0uYwppbmRleCA0ZWYyMGU2Li4yNjRlZGFhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9wbS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3BtLmMKQEAgLTE4Niw2ICsxODYsMTQgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgcG10bXJfcmVzdW1lKHZvaWQpCit7CisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCS8qIEFzc3VtZSB0aGlzIGlzIHRoZSBsYXN0IG1hcmsgb2Zmc2V0IHRpbWUgKi8KKwlvZmZzZXRfdGljayA9IHJlYWRfcG10bXIoKTsKKwl3cml0ZV9zZXF1bmxvY2soJm1vbm90b25pY19sb2NrKTsKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2tfcG10bXIodm9pZCkKIHsKQEAgLTI0Nyw2ICsyNTUsNyBAQAogCS5tb25vdG9uaWNfY2xvY2sgCT0gbW9ub3RvbmljX2Nsb2NrX3BtdG1yLAogCS5kZWxheSAJCQk9IGRlbGF5X3BtdG1yLAogCS5yZWFkX3RpbWVyIAkJPSByZWFkX3RpbWVyX3RzYywKKwkucmVzdW1lCQkJPSBwbXRtcl9yZXN1bWUsCiB9OwogCiBzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIF9faW5pdGRhdGEgdGltZXJfcG10bXJfaW5pdCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3RzYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMKaW5kZXggOGY0ZTRkNS4uNmRkNDcwYyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMKQEAgLTU0Myw2ICs1NDMsMTkgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAorc3RhdGljIGludCB0c2NfcmVzdW1lKHZvaWQpCit7CisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCS8qIEFzc3VtZSB0aGlzIGlzIHRoZSBsYXN0IG1hcmsgb2Zmc2V0IHRpbWUgKi8KKwlyZHRzYyhsYXN0X3RzY19sb3csIGxhc3RfdHNjX2hpZ2gpOworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisJaWYgKGlzX2hwZXRfZW5hYmxlZCgpICYmIGhwZXRfdXNlX3RpbWVyKQorCQlocGV0X2xhc3QgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisjZW5kaWYKKwl3cml0ZV9zZXF1bmxvY2soJm1vbm90b25pY19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwogI2lmbmRlZiBDT05GSUdfWDg2X1RTQwogLyogZGlzYWJsZSBmbGFnIGZvciB0c2MuICBUYWtlcyBlZmZlY3QgYnkgY2xlYXJpbmcgdGhlIFRTQyBjcHUgZmxhZwogICogaW4gY3B1L2NvbW1vbi5jICovCkBAIC01NzMsNiArNTg2LDcgQEAKIAkubW9ub3RvbmljX2Nsb2NrID0gbW9ub3RvbmljX2Nsb2NrX3RzYywKIAkuZGVsYXkgPSBkZWxheV90c2MsCiAJLnJlYWRfdGltZXIgPSByZWFkX3RpbWVyX3RzYywKKwkucmVzdW1lCT0gdHNjX3Jlc3VtZSwKIH07CiAKIHN0cnVjdCBpbml0X3RpbWVyX29wdHMgX19pbml0ZGF0YSB0aW1lcl90c2NfaW5pdCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYwppbmRleCBjZDJkNWQ1Li4wOWE1OGNiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCkBAIC0yMTAsNyArMjEwLDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBzczsKIAogCWVzcCA9ICh1bnNpZ25lZCBsb25nKSAoJnJlZ3MtPmVzcCk7Ci0Jc3MgPSBfX0tFUk5FTF9EUzsKKwlzYXZlc2VnbWVudChzcywgc3MpOwogCWlmICh1c2VyX21vZGUocmVncykpIHsKIAkJaW5fa2VybmVsID0gMDsKIAkJZXNwID0gcmVncy0+ZXNwOwpAQCAtMjY3LDkgKzI2Nyw2IEBACiAJY2hhciBjOwogCXVuc2lnbmVkIGxvbmcgZWlwOwogCi0JaWYgKHVzZXJfbW9kZShyZWdzKSkKLQkJZ290byBub19idWc7CQkvKiBOb3QgaW4ga2VybmVsICovCi0KIAllaXAgPSByZWdzLT5laXA7CiAKIAlpZiAoZWlwIDwgUEFHRV9PRkZTRVQpCkBAIC0zNjYsOCArMzYzLDkgQEAKIAkJZGllKHN0ciwgcmVncywgZXJyKTsKIH0KIAotc3RhdGljIHZvaWQgZG9fdHJhcChpbnQgdHJhcG5yLCBpbnQgc2lnbnIsIGNoYXIgKnN0ciwgaW50IHZtODYsCi0JCQkgICBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSwgc2lnaW5mb190ICppbmZvKQorc3RhdGljIHZvaWQgX19rcHJvYmVzIGRvX3RyYXAoaW50IHRyYXBuciwgaW50IHNpZ25yLCBjaGFyICpzdHIsIGludCB2bTg2LAorCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUsCisJCQkgICAgICBzaWdpbmZvX3QgKmluZm8pCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwpAQCAtNDYzLDcgKzQ2MSw4IEBACiBET19FUlJPUl9JTkZPKDE3LCBTSUdCVVMsICJhbGlnbm1lbnQgY2hlY2siLCBhbGlnbm1lbnRfY2hlY2ssIEJVU19BRFJBTE4sIDApCiBET19FUlJPUl9JTkZPKDMyLCBTSUdTRUdWLCAiaXJldCBleGNlcHRpb24iLCBpcmV0X2Vycm9yLCBJTExfQkFEU1RLLCAwKQogCi1mYXN0Y2FsbCB2b2lkIGRvX2dlbmVyYWxfcHJvdGVjdGlvbihzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK2Zhc3RjYWxsIHZvaWQgX19rcHJvYmVzIGRvX2dlbmVyYWxfcHJvdGVjdGlvbihzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsCisJCQkJCSAgICAgIGxvbmcgZXJyb3JfY29kZSkKIHsKIAlpbnQgY3B1ID0gZ2V0X2NwdSgpOwogCXN0cnVjdCB0c3Nfc3RydWN0ICp0c3MgPSAmcGVyX2NwdShpbml0X3RzcywgY3B1KTsKQEAgLTU2OCw2ICs1NjcsMTAgQEAKIAogdm9pZCBkaWVfbm1pIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgY29uc3QgY2hhciAqbXNnKQogeworCWlmIChub3RpZnlfZGllKERJRV9OTUlXQVRDSERPRywgbXNnLCByZWdzLCAwLCAwLCBTSUdJTlQpID09CisJICAgIE5PVElGWV9TVE9QKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2soJm5taV9wcmludF9sb2NrKTsKIAkvKgogCSogV2UgYXJlIGluIHRyb3VibGUgYW55d2F5LCBsZXRzIGF0IGxlYXN0IHRyeQpAQCAtNjU2LDcgKzY1OSw3IEBACiAKIAkrK25taV9jb3VudChjcHUpOwogCi0JaWYgKCFubWlfY2FsbGJhY2socmVncywgY3B1KSkKKwlpZiAoIXJjdV9kZXJlZmVyZW5jZShubWlfY2FsbGJhY2spKHJlZ3MsIGNwdSkpCiAJCWRlZmF1bHRfZG9fbm1pKHJlZ3MpOwogCiAJbm1pX2V4aXQoKTsKQEAgLTY2NCw3ICs2NjcsNyBAQAogCiB2b2lkIHNldF9ubWlfY2FsbGJhY2sobm1pX2NhbGxiYWNrX3QgY2FsbGJhY2spCiB7Ci0Jbm1pX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5taV9jYWxsYmFjaywgY2FsbGJhY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2V0X25taV9jYWxsYmFjayk7CiAKQEAgLTY3NSw3ICs2NzgsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwodW5zZXRfbm1pX2NhbGxiYWNrKTsKIAogI2lmZGVmIENPTkZJR19LUFJPQkVTCi1mYXN0Y2FsbCB2b2lkIGRvX2ludDMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK2Zhc3RjYWxsIHZvaWQgX19rcHJvYmVzIGRvX2ludDMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKIHsKIAlpZiAobm90aWZ5X2RpZShESUVfSU5UMywgImludDMiLCByZWdzLCBlcnJvcl9jb2RlLCAzLCBTSUdUUkFQKQogCQkJPT0gTk9USUZZX1NUT1ApCkBAIC03MDksNyArNzEyLDcgQEAKICAqIGZpbmQgZXZlcnkgb2NjdXJyZW5jZSBvZiB0aGUgVEYgYml0IHRoYXQgY291bGQgYmUgc2F2ZWQgYXdheSBldmVuCiAgKiBieSB1c2VyIGNvZGUpCiAgKi8KLWZhc3RjYWxsIHZvaWQgZG9fZGVidWcoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCitmYXN0Y2FsbCB2b2lkIF9fa3Byb2JlcyBkb19kZWJ1ZyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKIHsKIAl1bnNpZ25lZCBpbnQgY29uZGl0aW9uOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKQEAgLTEwMDgsNyArMTAxMSw3IEBACiAJICogaXQgdXNlcyB0aGUgcmVhZC1vbmx5IG1hcHBlZCB2aXJ0dWFsIGFkZHJlc3MuCiAJICovCiAJaWR0X2Rlc2NyLmFkZHJlc3MgPSBmaXhfdG9fdmlydChGSVhfRjAwRl9JRFQpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsaWR0ICUwIiA6IDogIm0iIChpZHRfZGVzY3IpKTsKKwlsb2FkX2lkdCgmaWR0X2Rlc2NyKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZtODYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jCmluZGV4IGVjMGY2OGMuLjE2YjQ4NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jCkBAIC0yOTQsOCArMjk0LDggQEAKICAqLwogCWluZm8tPnJlZ3MzMi0+ZWF4ID0gMDsKIAl0c2stPnRocmVhZC5zYXZlZF9lc3AwID0gdHNrLT50aHJlYWQuZXNwMDsKLQlhc20gdm9sYXRpbGUoIm1vdiAlJWZzLCUwIjoiPW0iICh0c2stPnRocmVhZC5zYXZlZF9mcykpOwotCWFzbSB2b2xhdGlsZSgibW92ICUlZ3MsJTAiOiI9bSIgKHRzay0+dGhyZWFkLnNhdmVkX2dzKSk7CisJc2F2ZXNlZ21lbnQoZnMsIHRzay0+dGhyZWFkLnNhdmVkX2ZzKTsKKwlzYXZlc2VnbWVudChncywgdHNrLT50aHJlYWQuc2F2ZWRfZ3MpOwogCiAJdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGdldF9jcHUoKSk7CiAJdHNrLT50aHJlYWQuZXNwMCA9ICh1bnNpZ25lZCBsb25nKSAmaW5mby0+Vk04Nl9UU1NfRVNQMDsKQEAgLTU0Miw3ICs1NDIsNyBAQAogCXVuc2lnbmVkIGNoYXIgb3Bjb2RlOwogCXVuc2lnbmVkIGNoYXIgX191c2VyICpjc3A7CiAJdW5zaWduZWQgY2hhciBfX3VzZXIgKnNzcDsKLQl1bnNpZ25lZCBzaG9ydCBpcCwgc3A7CisJdW5zaWduZWQgc2hvcnQgaXAsIHNwLCBvcmlnX2ZsYWdzOwogCWludCBkYXRhMzIsIHByZWZfZG9uZTsKIAogI2RlZmluZSBDSEVDS19JRl9JTl9UUkFQIFwKQEAgLTU1MSw4ICs1NTEsMTIgQEAKICNkZWZpbmUgVk04Nl9GQVVMVF9SRVRVUk4gZG8geyBcCiAJaWYgKFZNUEkuZm9yY2VfcmV0dXJuX2Zvcl9waWMgICYmIChWRUZMQUdTICYgKElGX01BU0sgfCBWSUZfTUFTSykpKSBcCiAJCXJldHVybl90b18zMmJpdChyZWdzLCBWTTg2X1BJQ1JFVFVSTik7IFwKKwlpZiAob3JpZ19mbGFncyAmIFRGX01BU0spIFwKKwkJaGFuZGxlX3ZtODZfdHJhcChyZWdzLCAwLCAxKTsgXAogCXJldHVybjsgfSB3aGlsZSAoMCkKIAorCW9yaWdfZmxhZ3MgPSAqKHVuc2lnbmVkIHNob3J0ICopJnJlZ3MtPmVmbGFnczsKKwogCWNzcCA9ICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKSAocmVncy0+Y3MgPDwgNCk7CiAJc3NwID0gKHVuc2lnbmVkIGNoYXIgX191c2VyICopIChyZWdzLT5zcyA8PCA0KTsKIAlzcCA9IFNQKHJlZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDc2MTk3MmYuLjQ3MTAxOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2kzODYva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTIyLDYgKzIyLDcgQEAKIAkqKC50ZXh0KQogCVNDSEVEX1RFWFQKIAlMT0NLX1RFWFQKKwlLUFJPQkVTX1RFWFQKIAkqKC5maXh1cCkKIAkqKC5nbnUud2FybmluZykKIAl9ID0gMHg5MDkwCkBAIC0xNDMsMTIgKzE0NCw3IEBACiAJKiguZXhpdGNhbGwuZXhpdCkKIAl9CiAKLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9CisgIFNUQUJTX0RFQlVHCisKKyAgRFdBUkZfREVCVUcKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc2lncmV0dXJuLlMgYi9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLXNpZ3JldHVybi5TCmluZGV4IGM4ZmNmNzUuLmZhZGI1YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc2lncmV0dXJuLlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1zaWdyZXR1cm4uUwpAQCAtNyw3ICs3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAKIC8qIFhYWApAQCAtMTUsNyArMTUsNyBAQAogKi8KIAogCS50ZXh0Ci0JLm9yZwlfX2tlcm5lbF92c3lzY2FsbCszMgorCS5vcmcgX19rZXJuZWxfdnN5c2NhbGwrMzIsMHg5MAogCS5nbG9ibCBfX2tlcm5lbF9zaWdyZXR1cm4KIAkudHlwZSBfX2tlcm5lbF9zaWdyZXR1cm4sQGZ1bmN0aW9uCiBfX2tlcm5lbF9zaWdyZXR1cm46CkBAIC0zNSw2ICszNSw3IEBACiAJaW50ICQweDgwCiAuTEVORF9ydF9zaWdyZXR1cm46CiAJLnNpemUgX19rZXJuZWxfcnRfc2lncmV0dXJuLC4tLkxTVEFSVF9ydF9zaWdyZXR1cm4KKwkuYmFsaWduIDMyCiAJLnByZXZpb3VzCiAKIAkuc2VjdGlvbiAuZWhfZnJhbWUsImEiLEBwcm9nYml0cwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC5sZHMuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwubGRzLlMKaW5kZXggYTc5Nzc3MC4uOTg2OTljYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC5sZHMuUworKysgYi9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLmxkcy5TCkBAIC0zLDcgKzMsNyBAQAogICogb2JqZWN0IHByZWxpbmtlZCB0byBpdHMgdmlydHVhbCBhZGRyZXNzLCBhbmQgd2l0aCBvbmx5IG9uZSByZWFkLW9ubHkKICAqIHNlZ21lbnQgKHRoYXQgZml0cyBpbiBvbmUgcGFnZSkuICBUaGlzIHNjcmlwdCBjb250cm9scyBpdHMgbGF5b3V0LgogICovCi0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIFNFQ1RJT05TCiB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3RvcG9sb2d5LmMgYi9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3RvcG9sb2d5LmMKaW5kZXggMjMzOTVmZi4uYjY0MzE0MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC90b3BvbG9neS5jCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvdG9wb2xvZ3kuYwpAQCAtNzYsNyArNzYsNyBAQAogCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpCiAJCWFyY2hfcmVnaXN0ZXJfbm9kZShpKTsKIAotCWZvcl9lYWNoX2NwdShpKQorCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpCiAJCWFyY2hfcmVnaXN0ZXJfY3B1KGkpOwogCXJldHVybiAwOwogfQpAQCAtODcsNyArODcsNyBAQAogewogCWludCBpOwogCi0JZm9yX2VhY2hfY3B1KGkpCisJZm9yX2VhY2hfcHJlc2VudF9jcHUoaSkKIAkJYXJjaF9yZWdpc3Rlcl9jcHUoaSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwLmggYi9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwLmgKaW5kZXggNzA2OTFmMC4uODk4ZWQ5MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21hY2gtZXM3MDAwL2VzNzAwMC5oCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9lczcwMDAuaApAQCAtMTA0LDcgKzEwNCw4IEBACiAjZGVmaW5lCU1JUF9TV19BUElDCQkweDEwMjBiCiAjZGVmaW5lCU1JUF9GVU5DKFZBTFVFKSAJKFZBTFVFICYgMHhmZikKIAotZXh0ZXJuIGludCBwYXJzZV91bmlzeXNfb2VtIChjaGFyICpvZW1wdHIsIGludCBvZW1fZW50cmllcyk7Ci1leHRlcm4gaW50IGZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgKm9lbV9hZGRyLCBpbnQgKmxlbmd0aCk7CitleHRlcm4gaW50IHBhcnNlX3VuaXN5c19vZW0gKGNoYXIgKm9lbXB0cik7CitleHRlcm4gaW50IGZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgKm9lbV9hZGRyKTsKK2V4dGVybiB2b2lkIHNldHVwX3VuaXN5cyAoKTsKIGV4dGVybiBpbnQgZXM3MDAwX3N0YXJ0X2NwdShpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGVpcCk7CiBleHRlcm4gdm9pZCBlczcwMDBfc3dfYXBpYyh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9lczcwMDBwbGF0LmMgYi9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwcGxhdC5jCmluZGV4IGQ1OTM2ZDUuLmRjNjY2MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9lczcwMDBwbGF0LmMKKysrIGIvYXJjaC9pMzg2L21hY2gtZXM3MDAwL2VzNzAwMHBsYXQuYwpAQCAtNTEsNyArNTEsNyBAQAogaW50IAkJCW1pcF9wb3J0OwogdW5zaWduZWQgbG9uZwkJbWlwX2FkZHIsIGhvc3RfYWRkcjsKIAotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9JT19BUElDKSAmJiAoZGVmaW5lZChDT05GSUdfQUNQSV9JTlRFUlBSRVRFUikgfHwgZGVmaW5lZChDT05GSUdfQUNQSV9CT09UKSkKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfSU9fQVBJQykgJiYgZGVmaW5lZChDT05GSUdfQUNQSSkKIAogLyoKICAqIEdTSSBvdmVycmlkZSBmb3IgRVM3MDAwIHBsYXRmb3Jtcy4KQEAgLTczLDE0ICs3MywzMSBAQAogCXJldHVybiBnc2k7CiB9CiAKLSNlbmRpZiAvLyAoQ09ORklHX1g4Nl9JT19BUElDKSAmJiAoQ09ORklHX0FDUElfSU5URVJQUkVURVIgfHwgQ09ORklHX0FDUElfQk9PVCkKKyNlbmRpZgkvKiAoQ09ORklHX1g4Nl9JT19BUElDKSAmJiAoQ09ORklHX0FDUEkpICovCisKK3ZvaWQgX19pbml0CitzZXR1cF91bmlzeXMgKCkKK3sKKwkvKgorCSAqIERldGVybWluZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgRVM3MDAwIGN1cnJlbnRseSBydW5uaW5nLgorCSAqCisJICogZXM3MDAwX3BsYXQgPSAxIGlmIHRoZSBtYWNoaW5lIGlzIGEgNXh4IEVTNzAwMCBib3gKKwkgKiBlczcwMDBfcGxhdCA9IDIgaWYgdGhlIG1hY2hpbmUgaXMgYSB4ODZfNjQgRVM3MDAwIGJveAorCSAqCisJICovCisJaWYgKCEoYm9vdF9jcHVfZGF0YS54ODYgPD0gMTUgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPD0gMikpCisJCWVzNzAwMF9wbGF0ID0gMjsKKwllbHNlCisJCWVzNzAwMF9wbGF0ID0gMTsKKwlpb2FwaWNfcmVudW1iZXJfaXJxID0gZXM3MDAwX3JlbmFtZV9nc2k7Cit9CiAKIC8qCiAgKiBQYXJzZSB0aGUgT0VNIFRhYmxlCiAgKi8KIAogaW50IF9faW5pdAotcGFyc2VfdW5pc3lzX29lbSAoY2hhciAqb2VtcHRyLCBpbnQgb2VtX2VudHJpZXMpCitwYXJzZV91bmlzeXNfb2VtIChjaGFyICpvZW1wdHIpCiB7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgaTsKIAlpbnQgCQkJc3VjY2VzcyA9IDA7CkBAIC05NSw3ICsxMTIsNyBAQAogCiAJdHAgKz0gODsKIAotCWZvciAoaT0wOyBpIDw9IG9lbV9lbnRyaWVzOyBpKyspIHsKKwlmb3IgKGk9MDsgaSA8PSA2OyBpKyspIHsKIAkJdHlwZSA9ICp0cCsrOwogCQlzaXplID0gKnRwKys7CiAJCXRwIC09IDI7CkBAIC0xMzAsMzQgKzE0NywxOCBAQAogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKGkgPT0gNikgYnJlYWs7CiAJCXRwICs9IHNpemU7CiAJfQogCiAJaWYgKHN1Y2Nlc3MgPCAyKSB7CiAJCWVzNzAwMF9wbGF0ID0gMDsKLQl9IGVsc2UgewotCQlwcmludGsoIlxuRW5hYmxpbmcgRVM3MDAwIHNwZWNpZmljIGZlYXR1cmVzLi4uXG4iKTsKLQkJLyoKLQkJICogRGV0ZXJtaW5lIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBFUzcwMDAgY3VycmVudGx5IHJ1bm5pbmcuCi0JCSAqCi0JCSAqIGVzNzAwMF9wbGF0ID0gMCBpZiB0aGUgbWFjaGluZSBpcyBOT1QgYSBVbmlzeXMgRVM3MDAwIGJveAotCQkgKiBlczcwMDBfcGxhdCA9IDEgaWYgdGhlIG1hY2hpbmUgaXMgYSA1eHggRVM3MDAwIGJveAotCQkgKiBlczcwMDBfcGxhdCA9IDIgaWYgdGhlIG1hY2hpbmUgaXMgYSB4ODZfNjQgRVM3MDAwIGJveAotCQkgKgotCQkgKi8KLQkJaWYgKCEoYm9vdF9jcHVfZGF0YS54ODYgPD0gMTUgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPD0gMikpCi0JCQllczcwMDBfcGxhdCA9IDI7Ci0JCWVsc2UKLQkJCWVzNzAwMF9wbGF0ID0gMTsKLQotCQlpb2FwaWNfcmVudW1iZXJfaXJxID0gZXM3MDAwX3JlbmFtZV9nc2k7Ci0JfQorCX0gZWxzZQorCQlzZXR1cF91bmlzeXMoKTsKIAlyZXR1cm4gZXM3MDAwX3BsYXQ7CiB9CiAKIGludCBfX2luaXQKLWZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgKm9lbV9hZGRyLCBpbnQgKmxlbmd0aCkKK2ZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgKm9lbV9hZGRyKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX3JzZHAJCSpyc2RwID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nCQkJcnNkcF9waHlzID0gMDsKQEAgLTIwMSwxMyArMjAyLDExIEBACiAJCQkJYWNwaV90YWJsZV9wcmludChoZWFkZXIsIHNkdC5lbnRyeVtpXS5wYSk7CiAJCQkJdCA9IChzdHJ1Y3Qgb2VtX3RhYmxlICopIF9fYWNwaV9tYXBfdGFibGUoc2R0LmVudHJ5W2ldLnBhLCBoZWFkZXItPmxlbmd0aCk7CiAJCQkJYWRkciA9ICh2b2lkICopIF9fYWNwaV9tYXBfdGFibGUodC0+T0VNVGFibGVBZGRyLCB0LT5PRU1UYWJsZVNpemUpOwotCQkJCSpsZW5ndGggPSBoZWFkZXItPmxlbmd0aDsKIAkJCQkqb2VtX2FkZHIgPSAodW5zaWduZWQgbG9uZykgYWRkcjsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQogCX0KLQlEcHJpbnRrKCJFUzcwMDA6IGRpZCBub3QgZmluZCBVbmlzeXMgQUNQSSBPRU0gdGFibGUhXG4iKTsKIAlyZXR1cm4gLTE7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvYmlnc21wLmMgYi9hcmNoL2kzODYvbWFjaC1nZW5lcmljL2JpZ3NtcC5jCmluZGV4IDI1ODgzYjQuLjAzN2IyYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvYmlnc21wLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9iaWdzbXAuYwpAQCAtNDcsNyArNDcsMTAgQEAKIAogc3RhdGljIF9faW5pdCBpbnQgcHJvYmVfYmlnc21wKHZvaWQpCiB7IAotCWRtaV9jaGVja19zeXN0ZW0oYmlnc21wX2RtaV90YWJsZSk7CisJaWYgKGRlZl90b19iaWdzbXApCisgICAgICAgIAlkbWlfYmlnc21wID0gMTsKKwllbHNlCisJCWRtaV9jaGVja19zeXN0ZW0oYmlnc21wX2RtaV90YWJsZSk7CiAJcmV0dXJuIGRtaV9iaWdzbXA7IAogfSAKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9wcm9iZS5jIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9wcm9iZS5jCmluZGV4IDU0OTdjNjUuLmNlYTViM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvcHJvYmUuYworKysgYi9hcmNoL2kzODYvbWFjaC1nZW5lcmljL3Byb2JlLmMKQEAgLTMwLDYgKzMwLDI1IEBACiAJTlVMTCwKIH07CiAKK3N0YXRpYyBpbnQgY21kbGluZV9hcGljOworCit2b2lkIF9faW5pdCBnZW5lcmljX2JpZ3NtcF9wcm9iZSh2b2lkKQoreworCS8qCisJICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gc3dpdGNoIHRvIGJpZ3NtcCBtb2RlIHdoZW4KKwkgKiAtIFRoZXJlIGlzIG5vIGFwaWM9IG9wdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKKwkgKiAtIGdlbmVyaWNfYXBpY19wcm9iZSgpIGhhcyBjaG9vc2VuIGFwaWNfZGVmYXVsdCBhcyB0aGUgc3ViX2FyY2gKKwkgKiAtIHdlIGZpbmQgbW9yZSB0aGFuIDggQ1BVcyBpbiBhY3BpIExBUElDIGxpc3Rpbmcgd2l0aCB4QVBJQyBzdXBwb3J0CisJICovCisKKwlpZiAoIWNtZGxpbmVfYXBpYyAmJiBnZW5hcGljID09ICZhcGljX2RlZmF1bHQpCisJCWlmIChhcGljX2JpZ3NtcC5wcm9iZSgpKSB7CisJCQlnZW5hcGljID0gJmFwaWNfYmlnc21wOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiT3ZlcnJpZGluZyBBUElDIGRyaXZlciB3aXRoICVzXG4iLAorCQkJICAgICAgIGdlbmFwaWMtPm5hbWUpOworCQl9Cit9CisKIHZvaWQgX19pbml0IGdlbmVyaWNfYXBpY19wcm9iZShjaGFyICpjb21tYW5kX2xpbmUpIAogeyAKIAljaGFyICpzOwpAQCAtNTIsNiArNzEsNyBAQAogCQlpZiAoIWNoYW5nZWQpCiAJCQlwcmludGsoS0VSTl9FUlIgIlVua25vd24gZ2VuYXBpYyBgJXMnIHNwZWNpZmllZC5cbiIsIHMpOwogCQkqcCA9IG9sZDsKKwkJY21kbGluZV9hcGljID0gY2hhbmdlZDsKIAl9IAogCWZvciAoaSA9IDA7ICFjaGFuZ2VkICYmIGFwaWNfcHJvYmVbaV07IGkrKykgeyAKIAkJaWYgKGFwaWNfcHJvYmVbaV0tPnByb2JlKCkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9iYXNpYy5jIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2Jhc2ljLmMKaW5kZXggYzYzODQwNi4uY2M2OTg3NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2Jhc2ljLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2Jhc2ljLmMKQEAgLTIzNCwxMCArMjM0LDkgQEAKICNlbmRpZgogCX0KIAkvKiBhbmQgd2FpdCBmb3IgaXQgdG8gaGFwcGVuICovCi0JZm9yKDs7KSB7Ci0JCV9fYXNtKCJjbGkiKTsKLQkJX19hc20oImhsdCIpOwotCX0KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWZvcig7OykKKwkJaGFsdCgpOwogfQogCiAvKiBjb3BpZWQgZnJvbSBwcm9jZXNzLmMgKi8KQEAgLTI3OCwxMCArMjc3LDkgQEAKIAkJb3V0YihiYXNlYmQgfCAweDA4LCBWT1lBR0VSX01DX1NFVFVQKTsKIAkJb3V0YigweDAyLCBjYXRiYXNlICsgMHgyMSk7CiAJfQotCWZvcig7OykgewotCQlhc20oImNsaSIpOwotCQlhc20oImhsdCIpOwotCX0KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWZvcig7OykKKwkJaGFsdCgpOwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMKaW5kZXggMGUxZjQyMC4uNDZiMGNmNCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX3NtcC5jCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9zbXAuYwpAQCAtMjQyLDYgKzI0Miw4IEBACiBjcHVtYXNrX3QgY3B1X2NhbGxpbl9tYXAgPSBDUFVfTUFTS19OT05FOwogY3B1bWFza190IGNwdV9jYWxsb3V0X21hcCA9IENQVV9NQVNLX05PTkU7CiBFWFBPUlRfU1lNQk9MKGNwdV9jYWxsb3V0X21hcCk7CitjcHVtYXNrX3QgY3B1X3Bvc3NpYmxlX21hcCA9IENQVV9NQVNLX0FMTDsKK0VYUE9SVF9TWU1CT0woY3B1X3Bvc3NpYmxlX21hcCk7CiAKIC8qIFRoZSBwZXIgcHJvY2Vzc29yIElSUSBtYXNrcyAodGhlc2UgYXJlIHVzdWFsbHkga2VwdCBpbiBzeW5jKSAqLwogc3RhdGljIF9fdTE2IHZpY19pcnFfbWFza1tOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOwpAQCAtMTAxNSw3ICsxMDE3LDcgQEAKIAljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlmb3IoOzspCi0JICAgICAgIF9fYXNtX18oImhsdCIpOworCQloYWx0KCk7CiB9CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2FsbF9sb2NrKTsKQEAgLTE5MTAsNiArMTkxMiw3IEBACiB7CiAJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKIAljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X2NhbGxvdXRfbWFwKTsKKwljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X3Bvc3NpYmxlX21hcCk7CiB9CiAKIGludCBfX2RldmluaXQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9nZXRfYWRkcmVzcy5jIGIvYXJjaC9pMzg2L21hdGgtZW11L2dldF9hZGRyZXNzLmMKaW5kZXggOTExNzU3My4uOTgxOWI3MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21hdGgtZW11L2dldF9hZGRyZXNzLmMKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2dldF9hZGRyZXNzLmMKQEAgLTE1NSw3ICsxNTUsNiBAQAogeyAKICAgc3RydWN0IGRlc2Nfc3RydWN0IGRlc2NyaXB0b3I7CiAgIHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyZXNzLCBsaW1pdCwgYWRkcmVzcywgc2VnX3RvcDsKLSAgdW5zaWduZWQgc2hvcnQgc2VsZWN0b3I7CiAKICAgc2VnbWVudC0tOwogCkBAIC0xNzMsMTcgKzE3MiwxMSBAQAogICAgICAgLyogZnMgYW5kIGdzIGFyZW4ndCB1c2VkIGJ5IHRoZSBrZXJuZWwsIHNvIHRoZXkgc3RpbGwgaGF2ZSB0aGVpcgogCSB1c2VyLXNwYWNlIHZhbHVlcy4gKi8KICAgICBjYXNlIFBSRUZJWF9GU18tMToKLSAgICAgIC8qIFRoZSBjYXN0IGlzIG5lZWRlZCBoZXJlIHRvIGdldCBnY2MgMi44LjAgdG8gdXNlIGEgMTYgYml0IHJlZ2lzdGVyCi0JIGluIHRoZSBhc3NlbWJsZXIgc3RhdGVtZW50LiAqLwotCi0gICAgICBfX2FzbV9fKCJtb3YgJSVmcywlMCI6Ij1yIiAoc2VsZWN0b3IpKTsKLSAgICAgIGFkZHItPnNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICAvKiBOLkIuIC0gbW92bCAlc2VnLCBtZW0gaXMgYSAyIGJ5dGUgd3JpdGUgcmVnYXJkbGVzcyBvZiBwcmVmaXggKi8KKyAgICAgIHNhdmVzZWdtZW50KGZzLCBhZGRyLT5zZWxlY3Rvcik7CiAgICAgICBicmVhazsKICAgICBjYXNlIFBSRUZJWF9HU18tMToKLSAgICAgIC8qIFRoZSBjYXN0IGlzIG5lZWRlZCBoZXJlIHRvIGdldCBnY2MgMi44LjAgdG8gdXNlIGEgMTYgYml0IHJlZ2lzdGVyCi0JIGluIHRoZSBhc3NlbWJsZXIgc3RhdGVtZW50LiAqLwotICAgICAgX19hc21fXygibW92ICUlZ3MsJTAiOiI9ciIgKHNlbGVjdG9yKSk7Ci0gICAgICBhZGRyLT5zZWxlY3RvciA9IHNlbGVjdG9yOworICAgICAgc2F2ZXNlZ21lbnQoZ3MsIGFkZHItPnNlbGVjdG9yKTsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBhZGRyLT5zZWxlY3RvciA9IFBNX1JFR18oc2VnbWVudCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vZGlzY29udGlnLmMgYi9hcmNoL2kzODYvbW0vZGlzY29udGlnLmMKaW5kZXggNjcxMWNlMy4uMjQ0ZDhlYyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2Rpc2NvbnRpZy5jCisrKyBiL2FyY2gvaTM4Ni9tbS9kaXNjb250aWcuYwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KICNpbmNsdWRlIDxiaW9zX2ViZGEuaD4KIAotc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbTUFYX05VTU5PREVTXTsKK3N0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW01BWF9OVU1OT0RFU10gX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0wobm9kZV9kYXRhKTsKIGJvb3RtZW1fZGF0YV90IG5vZGUwX2JkYXRhOwogCkBAIC00OSw4ICs0OSw4IEBACiAgKiAyKSBub2RlX3N0YXJ0X3BmbiAgIC0gdGhlIHN0YXJ0aW5nIHBhZ2UgZnJhbWUgbnVtYmVyIGZvciBhIG5vZGUKICAqIDMpIG5vZGVfZW5kX3BmbiAgICAgLSB0aGUgZW5kaW5nIHBhZ2UgZnJhbSBudW1iZXIgZm9yIGEgbm9kZQogICovCi11bnNpZ25lZCBsb25nIG5vZGVfc3RhcnRfcGZuW01BWF9OVU1OT0RFU107Ci11bnNpZ25lZCBsb25nIG5vZGVfZW5kX3BmbltNQVhfTlVNTk9ERVNdOwordW5zaWduZWQgbG9uZyBub2RlX3N0YXJ0X3BmbltNQVhfTlVNTk9ERVNdIF9fcmVhZF9tb3N0bHk7Cit1bnNpZ25lZCBsb25nIG5vZGVfZW5kX3BmbltNQVhfTlVNTk9ERVNdIF9fcmVhZF9tb3N0bHk7CiAKIAogI2lmZGVmIENPTkZJR19ESVNDT05USUdNRU0KQEAgLTY2LDcgKzY2LDcgQEAKICAqICAgICBwaHlzbm9kZV9tYXBbNC03XSA9IDE7CiAgKiAgICAgcGh5c25vZGVfbWFwWzgtIF0gPSAtMTsKICAqLwotczggcGh5c25vZGVfbWFwW01BWF9FTEVNRU5UU10gPSB7IFswIC4uLiAoTUFYX0VMRU1FTlRTIC0gMSldID0gLTF9OworczggcGh5c25vZGVfbWFwW01BWF9FTEVNRU5UU10gX19yZWFkX21vc3RseSA9IHsgWzAgLi4uIChNQVhfRUxFTUVOVFMgLSAxKV0gPSAtMX07CiBFWFBPUlRfU1lNQk9MKHBoeXNub2RlX21hcCk7CiAKIHZvaWQgbWVtb3J5X3ByZXNlbnQoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vZmF1bHQuYyBiL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCmluZGV4IDhlOTAzMzkuLjllZGQ0NDggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCisrKyBiL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgkJLyogRm9yIHVuYmxhbmtfc2NyZWVuKCkgKi8KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0xOTksNiArMjAwLDE4IEBACiAJcmV0dXJuIDA7CiB9IAogCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBmb3JjZV9zaWdfaW5mb19mYXVsdChpbnQgc2lfc2lnbm8sIGludCBzaV9jb2RlLAorCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc2lnaW5mb190IGluZm87CisKKwlpbmZvLnNpX3NpZ25vID0gc2lfc2lnbm87CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gc2lfY29kZTsKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilhZGRyZXNzOworCWZvcmNlX3NpZ19pbmZvKHNpX3NpZ25vLCAmaW5mbywgdHNrKTsKK30KKwogZmFzdGNhbGwgdm9pZCBkb19pbnZhbGlkX29wKHN0cnVjdCBwdF9yZWdzICosIHVuc2lnbmVkIGxvbmcpOwogCiAvKgpAQCAtMjExLDE4ICsyMjQsMTggQEAKICAqCWJpdCAxID09IDAgbWVhbnMgcmVhZCwgMSBtZWFucyB3cml0ZQogICoJYml0IDIgPT0gMCBtZWFucyBrZXJuZWwsIDEgbWVhbnMgdXNlci1tb2RlCiAgKi8KLWZhc3RjYWxsIHZvaWQgZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQorZmFzdGNhbGwgdm9pZCBfX2twcm9iZXMgZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW07CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hOwogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKIAl1bnNpZ25lZCBsb25nIHBhZ2U7Ci0JaW50IHdyaXRlOwotCXNpZ2luZm9fdCBpbmZvOworCWludCB3cml0ZSwgc2lfY29kZTsKIAogCS8qIGdldCB0aGUgYWRkcmVzcyAqLwotCV9fYXNtX18oIm1vdmwgJSVjcjIsJTAiOiI9ciIgKGFkZHJlc3MpKTsKKyAgICAgICAgYWRkcmVzcyA9IHJlYWRfY3IyKCk7CiAKIAlpZiAobm90aWZ5X2RpZShESUVfUEFHRV9GQVVMVCwgInBhZ2UgZmF1bHQiLCByZWdzLCBlcnJvcl9jb2RlLCAxNCwKIAkJCQkJU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCkBAIC0yMzMsNyArMjQ2LDcgQEAKIAogCXRzayA9IGN1cnJlbnQ7CiAKLQlpbmZvLnNpX2NvZGUgPSBTRUdWX01BUEVSUjsKKwlzaV9jb2RlID0gU0VHVl9NQVBFUlI7CiAKIAkvKgogCSAqIFdlIGZhdWx0LWluIGtlcm5lbC1zcGFjZSB2aXJ0dWFsIG1lbW9yeSBvbi1kZW1hbmQuIFRoZQpAQCAtMzEzLDcgKzMyNiw3IEBACiAgKiB3ZSBjYW4gaGFuZGxlIGl0Li4KICAqLwogZ29vZF9hcmVhOgotCWluZm8uc2lfY29kZSA9IFNFR1ZfQUNDRVJSOworCXNpX2NvZGUgPSBTRUdWX0FDQ0VSUjsKIAl3cml0ZSA9IDA7CiAJc3dpdGNoIChlcnJvcl9jb2RlICYgMykgewogCQlkZWZhdWx0OgkvKiAzOiB3cml0ZSwgcHJlc2VudCAqLwpAQCAtMzg3LDExICs0MDAsNyBAQAogCQkvKiBLZXJuZWwgYWRkcmVzc2VzIGFyZSBhbHdheXMgcHJvdGVjdGlvbiBmYXVsdHMgKi8KIAkJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGUgfCAoYWRkcmVzcyA+PSBUQVNLX1NJWkUpOwogCQl0c2stPnRocmVhZC50cmFwX25vID0gMTQ7Ci0JCWluZm8uc2lfc2lnbm8gPSBTSUdTRUdWOwotCQlpbmZvLnNpX2Vycm5vID0gMDsKLQkJLyogaW5mby5zaV9jb2RlIGhhcyBiZWVuIHNldCBhYm92ZSAqLwotCQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilhZGRyZXNzOwotCQlmb3JjZV9zaWdfaW5mbyhTSUdTRUdWLCAmaW5mbywgdHNrKTsKKwkJZm9yY2Vfc2lnX2luZm9fZmF1bHQoU0lHU0VHViwgc2lfY29kZSwgYWRkcmVzcywgdHNrKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDQ2LDcgKzQ1NSw3IEBACiAJcHJpbnRrKCIgYXQgdmlydHVhbCBhZGRyZXNzICUwOGx4XG4iLGFkZHJlc3MpOwogCXByaW50ayhLRVJOX0FMRVJUICIgcHJpbnRpbmcgZWlwOlxuIik7CiAJcHJpbnRrKCIlMDhseFxuIiwgcmVncy0+ZWlwKTsKLQlhc20oIm1vdmwgJSVjcjMsJTAiOiI9ciIgKHBhZ2UpKTsKKwlwYWdlID0gcmVhZF9jcjMoKTsKIAlwYWdlID0gKCh1bnNpZ25lZCBsb25nICopIF9fdmEocGFnZSkpW2FkZHJlc3MgPj4gMjJdOwogCXByaW50ayhLRVJOX0FMRVJUICIqcGRlID0gJTA4bHhcbiIsIHBhZ2UpOwogCS8qCkBAIC01MDAsMTEgKzUwOSw3IEBACiAJdHNrLT50aHJlYWQuY3IyID0gYWRkcmVzczsKIAl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKIAl0c2stPnRocmVhZC50cmFwX25vID0gMTQ7Ci0JaW5mby5zaV9zaWdubyA9IFNJR0JVUzsKLQlpbmZvLnNpX2Vycm5vID0gMDsKLQlpbmZvLnNpX2NvZGUgPSBCVVNfQURSRVJSOwotCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKWFkZHJlc3M7Ci0JZm9yY2Vfc2lnX2luZm8oU0lHQlVTLCAmaW5mbywgdHNrKTsKKwlmb3JjZV9zaWdfaW5mb19mYXVsdChTSUdCVVMsIEJVU19BRFJFUlIsIGFkZHJlc3MsIHRzayk7CiAJcmV0dXJuOwogCiB2bWFsbG9jX2ZhdWx0OgpAQCAtNTIzLDcgKzUyOCw3IEBACiAJCXBtZF90ICpwbWQsICpwbWRfazsKIAkJcHRlX3QgKnB0ZV9rOwogCi0JCWFzbSgibW92bCAlJWNyMywlMCI6Ij1yIiAocGdkX3BhZGRyKSk7CisJCXBnZF9wYWRkciA9IHJlYWRfY3IzKCk7CiAJCXBnZCA9IGluZGV4ICsgKHBnZF90ICopX192YShwZ2RfcGFkZHIpOwogCQlwZ2RfayA9IGluaXRfbW0ucGdkICsgaW5kZXg7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9odWdldGxicGFnZS5jIGIvYXJjaC9pMzg2L21tL2h1Z2V0bGJwYWdlLmMKaW5kZXggM2IwOTlmMy4uZDUyNDEyNyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9pMzg2L21tL2h1Z2V0bGJwYWdlLmMKQEAgLTIyLDEyICsyMiwxNSBAQAogewogCXBnZF90ICpwZ2Q7CiAJcHVkX3QgKnB1ZDsKLQlwbWRfdCAqcG1kID0gTlVMTDsKKwlwdGVfdCAqcHRlID0gTlVMTDsKIAogCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpOwogCXB1ZCA9IHB1ZF9hbGxvYyhtbSwgcGdkLCBhZGRyKTsKLQlwbWQgPSBwbWRfYWxsb2MobW0sIHB1ZCwgYWRkcik7Ci0JcmV0dXJuIChwdGVfdCAqKSBwbWQ7CisJaWYgKHB1ZCkKKwkJcHRlID0gKHB0ZV90ICopIHBtZF9hbGxvYyhtbSwgcHVkLCBhZGRyKTsKKwlCVUdfT04ocHRlICYmICFwdGVfbm9uZSgqcHRlKSAmJiAhcHRlX2h1Z2UoKnB0ZSkpOworCisJcmV0dXJuIHB0ZTsKIH0KIAogcHRlX3QgKmh1Z2VfcHRlX29mZnNldChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQpAQCAtMzcsOCArNDAsMTEgQEAKIAlwbWRfdCAqcG1kID0gTlVMTDsKIAogCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpOwotCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyKTsKLQlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CisJaWYgKHBnZF9wcmVzZW50KCpwZ2QpKSB7CisJCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyKTsKKwkJaWYgKHB1ZF9wcmVzZW50KCpwdWQpKQorCQkJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOworCX0KIAlyZXR1cm4gKHB0ZV90ICopIHBtZDsKIH0KIApAQCAtMTE4LDE3ICsxMjQsNiBAQAogfQogI2VuZGlmCiAKLXZvaWQgaHVnZXRsYl9jbGVhbl9zdGFsZV9wZ3RhYmxlKHB0ZV90ICpwdGUpCi17Ci0JcG1kX3QgKnBtZCA9IChwbWRfdCAqKSBwdGU7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KLQlwYWdlID0gcG1kX3BhZ2UoKnBtZCk7Ci0JcG1kX2NsZWFyKHBtZCk7Ci0JZGVjX3BhZ2Vfc3RhdGUobnJfcGFnZV90YWJsZV9wYWdlcyk7Ci0JcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotfQotCiAvKiB4ODZfNjQgYWxzbyB1c2VzIHRoaXMgZmlsZSAqLwogCiAjaWZkZWYgSEFWRV9BUkNIX0hVR0VUTEJfVU5NQVBQRURfQVJFQQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2luaXQuYyBiL2FyY2gvaTM4Ni9tbS9pbml0LmMKaW5kZXggMTIyMTZiNS4uMmViYWY3NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2luaXQuYworKysgYi9hcmNoL2kzODYvbW0vaW5pdC5jCkBAIC0xOTgsOSArMTk4LDEwIEBACiAKIAlpZiAoZWZpX2VuYWJsZWQpIHsKIAkJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCQl2b2lkICpwOwogCi0JCWZvciAoaSA9IDA7IGkgPCBtZW1tYXAubnJfbWFwOyBpKyspIHsKLQkJCW1kID0gJm1lbW1hcC5tYXBbaV07CisJCWZvciAocCA9IG1lbW1hcC5tYXA7IHAgPCBtZW1tYXAubWFwX2VuZDsgcCArPSBtZW1tYXAuZGVzY19zaXplKSB7CisJCQltZCA9IHA7CiAJCQlpZiAoIWlzX2F2YWlsYWJsZV9tZW1vcnkobWQpKQogCQkJCWNvbnRpbnVlOwogCQkJYWRkciA9IChtZC0+cGh5c19hZGRyK1BBR0VfU0laRS0xKSA+PiBQQUdFX1NISUZUOwpAQCAtMzQ4LDcgKzM0OSw3IEBACiAJICogQWxsIHVzZXItc3BhY2UgbWFwcGluZ3MgYXJlIGV4cGxpY2l0bHkgY2xlYXJlZCBhZnRlcgogCSAqIFNNUCBzdGFydHVwLgogCSAqLwotCXBnZF9iYXNlWzBdID0gcGdkX2Jhc2VbVVNFUl9QVFJTX1BFUl9QR0RdOworCXNldF9wZ2QoJnBnZF9iYXNlWzBdLCBwZ2RfYmFzZVtVU0VSX1BUUlNfUEVSX1BHRF0pOwogI2VuZGlmCiB9CiAKQEAgLTM5Miw3ICszOTMsNyBAQAogfQogCiBzdGF0aWMgaW50IGRpc2FibGVfbnggX19pbml0ZGF0YSA9IDA7Ci11NjQgX19zdXBwb3J0ZWRfcHRlX21hc2sgPSB+X1BBR0VfTlg7Cit1NjQgX19zdXBwb3J0ZWRfcHRlX21hc2sgX19yZWFkX21vc3RseSA9IH5fUEFHRV9OWDsKIAogLyoKICAqIG5vZXhlYyA9IG9ufG9mZgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMgYi9hcmNoL2kzODYvbW0vcGFnZWF0dHIuYwppbmRleCBjYjNkYTZiLi5mNjAwZmMyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbW0vcGFnZWF0dHIuYworKysgYi9hcmNoL2kzODYvbW0vcGFnZWF0dHIuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3BhX2xvY2spOwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgZGZfbGlzdCA9IExJU1RfSEVBRF9JTklUKGRmX2xpc3QpOwpAQCAtNTIsOCArNTMsOCBAQAogCWFkZHIgPSBhZGRyZXNzICYgTEFSR0VfUEFHRV9NQVNLOyAKIAlwYmFzZSA9IChwdGVfdCAqKXBhZ2VfYWRkcmVzcyhiYXNlKTsKIAlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfUFRFOyBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKSB7Ci0JCXBiYXNlW2ldID0gcGZuX3B0ZShhZGRyID4+IFBBR0VfU0hJRlQsIAotCQkJCSAgIGFkZHIgPT0gYWRkcmVzcyA/IHByb3QgOiBQQUdFX0tFUk5FTCk7CisgICAgICAgICAgICAgICBzZXRfcHRlKCZwYmFzZVtpXSwgcGZuX3B0ZShhZGRyID4+IFBBR0VfU0hJRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyID09IGFkZHJlc3MgPyBwcm90IDogUEFHRV9LRVJORUwpKTsKIAl9CiAJcmV0dXJuIGJhc2U7CiB9IApAQCAtNjIsNyArNjMsNyBAQAogeyAKIAkvKiBDb3VsZCB1c2UgQ0xGTFVTSCBoZXJlIGlmIHRoZSBDUFUgc3VwcG9ydHMgaXQgKEhhbW1lcixQNCkgKi8KIAlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPj0gNCkgCi0JCWFzbSB2b2xhdGlsZSgid2JpbnZkIjo6OiJtZW1vcnkiKTsgCisJCXdiaW52ZCgpOwogCS8qIEZsdXNoIGFsbCB0byB3b3JrIGFyb3VuZCBFcnJhdGEgaW4gZWFybHkgYXRobG9ucyByZWdhcmRpbmcgCiAJICogbGFyZ2UgcGFnZSBmbHVzaGluZy4gCiAJICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vcGd0YWJsZS5jIGIvYXJjaC9pMzg2L21tL3BndGFibGUuYwppbmRleCBiZDJmN2FmLi5kY2RjZTJjIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvaTM4Ni9tbS9wZ3RhYmxlLmMKQEAgLTIwNywxOSArMjA3LDE5IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChQVFJTX1BFUl9QTUQgPT0gMSkKKwlpZiAoUFRSU19QRVJfUE1EID09IDEpIHsKKwkJbWVtc2V0KHBnZCwgMCwgVVNFUl9QVFJTX1BFUl9QR0Qqc2l6ZW9mKHBnZF90KSk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwZ2RfbG9jaywgZmxhZ3MpOworCX0KIAotCW1lbWNweSgocGdkX3QgKilwZ2QgKyBVU0VSX1BUUlNfUEVSX1BHRCwKKwljbG9uZV9wZ2RfcmFuZ2UoKHBnZF90ICopcGdkICsgVVNFUl9QVFJTX1BFUl9QR0QsCiAJCQlzd2FwcGVyX3BnX2RpciArIFVTRVJfUFRSU19QRVJfUEdELAotCQkJKFBUUlNfUEVSX1BHRCAtIFVTRVJfUFRSU19QRVJfUEdEKSAqIHNpemVvZihwZ2RfdCkpOwotCisJCQlLRVJORUxfUEdEX1BUUlMpOwogCWlmIChQVFJTX1BFUl9QTUQgPiAxKQogCQlyZXR1cm47CiAKIAlwZ2RfbGlzdF9hZGQocGdkKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZ2RfbG9jaywgZmxhZ3MpOwotCW1lbXNldChwZ2QsIDAsIFVTRVJfUFRSU19QRVJfUEdEKnNpemVvZihwZ2RfdCkpOwogfQogCiAvKiBuZXZlciBjYWxsZWQgd2hlbiBQVFJTX1BFUl9QTUQgPiAxICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvaW5pdC5jIGIvYXJjaC9pMzg2L29wcm9maWxlL2luaXQuYwppbmRleCBjOTAzMzJkLi41MzQxZDQ4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvb3Byb2ZpbGUvaW5pdC5jCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9pbml0LmMKQEAgLTE1LDkgKzE1LDkgQEAKICAqIHdpdGggdGhlIE5NSSBtb2RlIGRyaXZlci4KICAqLwogIAotZXh0ZXJuIGludCBubWlfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqIG9wcyk7Ci1leHRlcm4gaW50IG5taV90aW1lcl9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICogb3BzKTsKLWV4dGVybiB2b2lkIG5taV9leGl0KHZvaWQpOworZXh0ZXJuIGludCBvcF9ubWlfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqIG9wcyk7CitleHRlcm4gaW50IG9wX25taV90aW1lcl9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICogb3BzKTsKK2V4dGVybiB2b2lkIG9wX25taV9leGl0KHZvaWQpOwogZXh0ZXJuIHZvaWQgeDg2X2JhY2t0cmFjZShzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsIHVuc2lnbmVkIGludCBkZXB0aCk7CiAKIApAQCAtMjgsMTEgKzI4LDExIEBACiAJcmV0ID0gLUVOT0RFVjsKIAogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCXJldCA9IG5taV9pbml0KG9wcyk7CisJcmV0ID0gb3Bfbm1pX2luaXQob3BzKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCWlmIChyZXQgPCAwKQotCQlyZXQgPSBubWlfdGltZXJfaW5pdChvcHMpOworCQlyZXQgPSBvcF9ubWlfdGltZXJfaW5pdChvcHMpOwogI2VuZGlmCiAJb3BzLT5iYWNrdHJhY2UgPSB4ODZfYmFja3RyYWNlOwogCkBAIC00Myw2ICs0Myw2IEBACiB2b2lkIG9wcm9maWxlX2FyY2hfZXhpdCh2b2lkKQogewogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCW5taV9leGl0KCk7CisJb3Bfbm1pX2V4aXQoKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L29wcm9maWxlL25taV9pbnQuYyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfaW50LmMKaW5kZXggMjU1ZTQ3MC4uMDQ5M2U4YiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L29wcm9maWxlL25taV9pbnQuYworKysgYi9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX2ludC5jCkBAIC0zNTUsNyArMzU1LDcgQEAKIC8qIGluIG9yZGVyIHRvIGdldCBkcml2ZXJmcyByaWdodCAqLwogc3RhdGljIGludCB1c2luZ19ubWk7CiAKLWludCBfX2luaXQgbm1pX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcykKK2ludCBfX2luaXQgb3Bfbm1pX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcykKIHsKIAlfX3U4IHZlbmRvciA9IGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcjsKIAlfX3U4IGZhbWlseSA9IGJvb3RfY3B1X2RhdGEueDg2OwpAQCAtNDIwLDcgKzQyMCw3IEBACiB9CiAKIAotdm9pZCBubWlfZXhpdCh2b2lkKQordm9pZCBvcF9ubWlfZXhpdCh2b2lkKQogewogCWlmICh1c2luZ19ubWkpCiAJCWV4aXRfZHJpdmVyZnMoKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMgYi9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX3RpbWVyX2ludC5jCmluZGV4IGM1OGQwYzEuLmFkOTNjZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL25taV90aW1lcl9pbnQuYwpAQCAtNDAsNyArNDAsNyBAQAogfQogCiAKLWludCBfX2luaXQgbm1pX3RpbWVyX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKiBvcHMpCitpbnQgX19pbml0IG9wX25taV90aW1lcl9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICogb3BzKQogewogCWV4dGVybiBpbnQgbm1pX2FjdGl2ZTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9wY2kvTWFrZWZpbGUKaW5kZXggMWJmZjAzZi4uZWFkNjEyMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYvcGNpL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogb2JqLSQoQ09ORklHX1BDSV9ESVJFQ1QpCSs9IGRpcmVjdC5vCiAKIHBjaS15CQkJCTo9IGZpeHVwLm8KLXBjaS0kKENPTkZJR19BQ1BJX1BDSSkJCSs9IGFjcGkubworcGNpLSQoQ09ORklHX0FDUEkpCQkrPSBhY3BpLm8KIHBjaS15CQkJCSs9IGxlZ2FjeS5vIGlycS5vCiAKIHBjaS0kKENPTkZJR19YODZfVklTV1MpCQk6PSB2aXN3cy5vIGZpeHVwLm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvY29tbW9uLmMgYi9hcmNoL2kzODYvcGNpL2NvbW1vbi5jCmluZGV4IGFkZTViYzUuLmM5NmJlYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvY29tbW9uLmMKKysrIGIvYXJjaC9pMzg2L3BjaS9jb21tb24uYwpAQCAtMTY1LDcgKzE2NSw2IEBACiAJaWYgKChwY2lfcHJvYmUgJiBQQ0lfQklPU19TT1JUKSAmJiAhKHBjaV9wcm9iZSAmIFBDSV9OT19TT1JUKSkKIAkJcGNpYmlvc19zb3J0KCk7CiAjZW5kaWYKLQlwY2lfYXNzaWduX3VuYXNzaWduZWRfcmVzb3VyY2VzKCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jIGIvYXJjaC9pMzg2L3BjaS9pMzg2LmMKaW5kZXggOTNhMzY0Yy4uNmQ2MzM4NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9pMzg2LmMKKysrIGIvYXJjaC9pMzg2L3BjaS9pMzg2LmMKQEAgLTE3MCw0MyArMTcwLDI2IEBACiBzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2Fzc2lnbl9yZXNvdXJjZXModm9pZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlpbnQgaWR4OwotCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIsICpwcjsKIAotCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7Ci0JCWludCBjbGFzcyA9IGRldi0+Y2xhc3MgPj4gODsKLQotCQkvKiBEb24ndCB0b3VjaCBjbGFzc2xlc3MgZGV2aWNlcyBhbmQgaG9zdCBicmlkZ2VzICovCi0JCWlmICghY2xhc3MgfHwgY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUKQotCQkJY29udGludWU7Ci0KLQkJZm9yKGlkeD0wOyBpZHg8NjsgaWR4KyspIHsKLQkJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwotCi0JCQkvKgotCQkJICogIERvbid0IHRvdWNoIElERSBjb250cm9sbGVycyBhbmQgSS9PIHBvcnRzIG9mIHZpZGVvIGNhcmRzIQotCQkJICovCi0JCQlpZiAoKGNsYXNzID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSAmJiBpZHggPCA0KSB8fAotCQkJICAgIChjbGFzcyA9PSBQQ0lfQ0xBU1NfRElTUExBWV9WR0EgJiYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykpKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvKgotCQkJICogIFdlIHNoYWxsIGFzc2lnbiBhIG5ldyBhZGRyZXNzIHRvIHRoaXMgcmVzb3VyY2UsIGVpdGhlciBiZWNhdXNlCi0JCQkgKiAgdGhlIEJJT1MgZm9yZ290IHRvIGRvIHNvIG9yIGJlY2F1c2Ugd2UgaGF2ZSBkZWNpZGVkIHRoZSBvbGQKLQkJCSAqICBhZGRyZXNzIHdhcyB1bnVzYWJsZSBmb3Igc29tZSByZWFzb24uCi0JCQkgKi8KLQkJCWlmICghci0+c3RhcnQgJiYgci0+ZW5kKQotCQkJCXBjaV9hc3NpZ25fcmVzb3VyY2UoZGV2LCBpZHgpOwotCQl9Ci0KLQkJaWYgKHBjaV9wcm9iZSAmIFBDSV9BU1NJR05fUk9NUykgeworCWlmICghKHBjaV9wcm9iZSAmIFBDSV9BU1NJR05fUk9NUykpIHsKKwkJLyogVHJ5IHRvIHVzZSBCSU9TIHNldHRpbmdzIGZvciBST01zLCBvdGhlcndpc2UgbGV0CisJCSAgIHBjaV9hc3NpZ25fdW5hc3NpZ25lZF9yZXNvdXJjZXMoKSBhbGxvY2F0ZSB0aGUgbmV3CisJCSAgIGFkZHJlc3Nlcy4gKi8KKwkJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKIAkJCXIgPSAmZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXTsKLQkJCXItPmVuZCAtPSByLT5zdGFydDsKLQkJCXItPnN0YXJ0ID0gMDsKLQkJCWlmIChyLT5lbmQpCi0JCQkJcGNpX2Fzc2lnbl9yZXNvdXJjZShkZXYsIFBDSV9ST01fUkVTT1VSQ0UpOworCQkJaWYgKCFyLT5mbGFncyB8fCAhci0+c3RhcnQpCisJCQkJY29udGludWU7CisJCQlwciA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShkZXYsIHIpOworCQkJaWYgKCFwciB8fCByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApIHsKKwkJCQlyLT5lbmQgLT0gci0+c3RhcnQ7CisJCQkJci0+c3RhcnQgPSAwOworCQkJfQogCQl9CiAJfQorCisJcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jlc291cmNlcygpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwMCw5ICsyODMsOSBAQAogCS8qIFdyaXRlLWNvbWJpbmUgc2V0dGluZyBpcyBpZ25vcmVkLCBpdCBpcyBjaGFuZ2VkIHZpYSB0aGUgbXRycgogCSAqIGludGVyZmFjZXMgb24gdGhpcyBwbGF0Zm9ybS4KIAkgKi8KLQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29mZiwKLQkJCSAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAotCQkJICAgICB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmYsCisJCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkJICAgICAgIHZtYS0+dm1fcGFnZV9wcm90KSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvaXJxLmMgYi9hcmNoL2kzODYvcGNpL2lycS5jCmluZGV4IDg2MzQ4YjYuLjMyNmEyZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvaXJxLmMKKysrIGIvYXJjaC9pMzg2L3BjaS9pcnEuYwpAQCAtMTA3NSw3ICsxMDc1LDcgQEAKIAogdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKLSNpZmRlZiBDT05GSUdfQUNQSV9QQ0kKKyNpZmRlZiBDT05GSUdfQUNQSQogCWlmICghYWNwaV9ub2lycSkKIAkJYWNwaV9wZW5hbGl6ZV9pc2FfaXJxKGlycSwgYWN0aXZlKTsKIAllbHNlCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcG93ZXIvY3B1LmMgYi9hcmNoL2kzODYvcG93ZXIvY3B1LmMKaW5kZXggYzU0N2MxYS4uN2IwYjlhZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3Bvd2VyL2NwdS5jCisrKyBiL2FyY2gvaTM4Ni9wb3dlci9jcHUuYwpAQCAtNDIsMjUgKzQyLDI1IEBACiAJLyoKIAkgKiBkZXNjcmlwdG9yIHRhYmxlcwogCSAqLwotCWFzbSB2b2xhdGlsZSAoInNnZHQgJTAiIDogIj1tIiAoY3R4dC0+Z2R0X2xpbWl0KSk7Ci0JYXNtIHZvbGF0aWxlICgic2lkdCAlMCIgOiAiPW0iIChjdHh0LT5pZHRfbGltaXQpKTsKLQlhc20gdm9sYXRpbGUgKCJzdHIgJTAiICA6ICI9bSIgKGN0eHQtPnRyKSk7CisgCXN0b3JlX2dkdCgmY3R4dC0+Z2R0X2xpbWl0KTsKKyAJc3RvcmVfaWR0KCZjdHh0LT5pZHRfbGltaXQpOworIAlzdG9yZV90cihjdHh0LT50cik7CiAKIAkvKgogCSAqIHNlZ21lbnQgcmVnaXN0ZXJzCiAJICovCi0JYXNtIHZvbGF0aWxlICgibW92dyAlJWVzLCAlMCIgOiAiPW0iIChjdHh0LT5lcykpOwotCWFzbSB2b2xhdGlsZSAoIm1vdncgJSVmcywgJTAiIDogIj1tIiAoY3R4dC0+ZnMpKTsKLQlhc20gdm9sYXRpbGUgKCJtb3Z3ICUlZ3MsICUwIiA6ICI9bSIgKGN0eHQtPmdzKSk7Ci0JYXNtIHZvbGF0aWxlICgibW92dyAlJXNzLCAlMCIgOiAiPW0iIChjdHh0LT5zcykpOworIAlzYXZlc2VnbWVudChlcywgY3R4dC0+ZXMpOworIAlzYXZlc2VnbWVudChmcywgY3R4dC0+ZnMpOworIAlzYXZlc2VnbWVudChncywgY3R4dC0+Z3MpOworIAlzYXZlc2VnbWVudChzcywgY3R4dC0+c3MpOwogCiAJLyoKIAkgKiBjb250cm9sIHJlZ2lzdGVycyAKIAkgKi8KLQlhc20gdm9sYXRpbGUgKCJtb3ZsICUlY3IwLCAlMCIgOiAiPXIiIChjdHh0LT5jcjApKTsKLQlhc20gdm9sYXRpbGUgKCJtb3ZsICUlY3IyLCAlMCIgOiAiPXIiIChjdHh0LT5jcjIpKTsKLQlhc20gdm9sYXRpbGUgKCJtb3ZsICUlY3IzLCAlMCIgOiAiPXIiIChjdHh0LT5jcjMpKTsKLQlhc20gdm9sYXRpbGUgKCJtb3ZsICUlY3I0LCAlMCIgOiAiPXIiIChjdHh0LT5jcjQpKTsKKwljdHh0LT5jcjAgPSByZWFkX2NyMCgpOworCWN0eHQtPmNyMiA9IHJlYWRfY3IyKCk7CisJY3R4dC0+Y3IzID0gcmVhZF9jcjMoKTsKKwljdHh0LT5jcjQgPSByZWFkX2NyNCgpOwogfQogCiB2b2lkIHNhdmVfcHJvY2Vzc29yX3N0YXRlKHZvaWQpCkBAIC04NCw3ICs4NCw2IEBACiAJc3RydWN0IHRzc19zdHJ1Y3QgKiB0ID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CiAKIAlzZXRfdHNzX2Rlc2MoY3B1LHQpOwkvKiBUaGlzIGp1c3QgbW9kaWZpZXMgbWVtb3J5OyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeS4gQnV0Li4uIFRoaXMgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIDM4NiBoYXJkd2FyZSBoYXMgY29uY2VwdCBvZiBidXN5IFRTUyBvciBzb21lIHNpbWlsYXIgc3R1cGlkaXR5LiAqLwotICAgICAgICBwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGNwdSlbR0RUX0VOVFJZX1RTU10uYiAmPSAweGZmZmZmZGZmOwogCiAJbG9hZF9UUl9kZXNjKCk7CQkJCS8qIFRoaXMgZG9lcyBsdHIgKi8KIAlsb2FkX0xEVCgmY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0KTsJLyogVGhpcyBkb2VzIGxsZHQgKi8KQEAgLTEwOSwyNSArMTA4LDI1IEBACiAJLyoKIAkgKiBjb250cm9sIHJlZ2lzdGVycwogCSAqLwotCWFzbSB2b2xhdGlsZSAoIm1vdmwgJTAsICUlY3I0IiA6OiAiciIgKGN0eHQtPmNyNCkpOwotCWFzbSB2b2xhdGlsZSAoIm1vdmwgJTAsICUlY3IzIiA6OiAiciIgKGN0eHQtPmNyMykpOwotCWFzbSB2b2xhdGlsZSAoIm1vdmwgJTAsICUlY3IyIiA6OiAiciIgKGN0eHQtPmNyMikpOwotCWFzbSB2b2xhdGlsZSAoIm1vdmwgJTAsICUlY3IwIiA6OiAiciIgKGN0eHQtPmNyMCkpOworCXdyaXRlX2NyNChjdHh0LT5jcjQpOworCXdyaXRlX2NyMyhjdHh0LT5jcjMpOworCXdyaXRlX2NyMihjdHh0LT5jcjIpOworCXdyaXRlX2NyMihjdHh0LT5jcjApOwogCiAJLyoKIAkgKiBub3cgcmVzdG9yZSB0aGUgZGVzY3JpcHRvciB0YWJsZXMgdG8gdGhlaXIgcHJvcGVyIHZhbHVlcwogCSAqIGx0ciBpcyBkb25lIGkgZml4X3Byb2Nlc3Nvcl9jb250ZXh0KCkuCiAJICovCi0JYXNtIHZvbGF0aWxlICgibGdkdCAlMCIgOjogIm0iIChjdHh0LT5nZHRfbGltaXQpKTsKLQlhc20gdm9sYXRpbGUgKCJsaWR0ICUwIiA6OiAibSIgKGN0eHQtPmlkdF9saW1pdCkpOworIAlsb2FkX2dkdCgmY3R4dC0+Z2R0X2xpbWl0KTsKKyAJbG9hZF9pZHQoJmN0eHQtPmlkdF9saW1pdCk7CiAKIAkvKgogCSAqIHNlZ21lbnQgcmVnaXN0ZXJzCiAJICovCi0JYXNtIHZvbGF0aWxlICgibW92dyAlMCwgJSVlcyIgOjogInIiIChjdHh0LT5lcykpOwotCWFzbSB2b2xhdGlsZSAoIm1vdncgJTAsICUlZnMiIDo6ICJyIiAoY3R4dC0+ZnMpKTsKLQlhc20gdm9sYXRpbGUgKCJtb3Z3ICUwLCAlJWdzIiA6OiAiciIgKGN0eHQtPmdzKSk7Ci0JYXNtIHZvbGF0aWxlICgibW92dyAlMCwgJSVzcyIgOjogInIiIChjdHh0LT5zcykpOworIAlsb2Fkc2VnbWVudChlcywgY3R4dC0+ZXMpOworIAlsb2Fkc2VnbWVudChmcywgY3R4dC0+ZnMpOworIAlsb2Fkc2VnbWVudChncywgY3R4dC0+Z3MpOworIAlsb2Fkc2VnbWVudChzcywgY3R4dC0+c3MpOwogCiAJLyoKIAkgKiBzeXNlbnRlciBNU1JzCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcG93ZXIvc3dzdXNwLlMgYi9hcmNoL2kzODYvcG93ZXIvc3dzdXNwLlMKaW5kZXggYzQxMDUyOC4uYzg5M2I4OSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3Bvd2VyL3N3c3VzcC5TCisrKyBiL2FyY2gvaTM4Ni9wb3dlci9zd3N1c3AuUwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIAkudGV4dAogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvS2NvbmZpZyBiL2FyY2gvaWE2NC9LY29uZmlnCmluZGV4IDgwOTg4MTMuLmVkMjVkNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9LY29uZmlnCisrKyBiL2FyY2gvaWE2NC9LY29uZmlnCkBAIC02MCw2ICs2MCw3IEBACiAKIGNvbmZpZyBJQTY0X0dFTkVSSUMKIAlib29sICJnZW5lcmljIgorCXNlbGVjdCBBQ1BJCiAJc2VsZWN0IE5VTUEKIAlzZWxlY3QgQUNQSV9OVU1BCiAJc2VsZWN0IFZJUlRVQUxfTUVNX01BUApAQCAtMzM4LDExICszMzksNiBAQAogCSAgVG8gdXNlIHRoaXMgb3B0aW9uLCB5b3UgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgIi9wcm9jIGZpbGUgc3lzdGVtCiAJICBzdXBwb3J0IiAoQ09ORklHX1BST0NfRlMpIGlzIGVuYWJsZWQsIHRvby4KIAotY29uZmlnIEFDUElfREVBTExPQ0FURV9JUlEKLQlib29sCi0JZGVwZW5kcyBvbiBJT1NBUElDICYmIEVYUEVSSU1FTlRBTAotCWRlZmF1bHQgeQotCiBzb3VyY2UgImRyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyIKIAogc291cmNlICJmcy9LY29uZmlnLmJpbmZtdCIKQEAgLTM1MSwzNiArMzQ3LDE0IEBACiAKIG1lbnUgIlBvd2VyIG1hbmFnZW1lbnQgYW5kIEFDUEkiCiAKLWNvbmZpZyBQTQotCWJvb2wgIlBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFJQTY0X0hQX1NJTQotCWRlZmF1bHQgeQotCWhlbHAKLQkgICJQb3dlciBNYW5hZ2VtZW50IiBtZWFucyB0aGF0IHBhcnRzIG9mIHlvdXIgY29tcHV0ZXIgYXJlIHNodXQKLQkgIG9mZiBvciBwdXQgaW50byBhIHBvd2VyIGNvbnNlcnZpbmcgInNsZWVwIiBtb2RlIGlmIHRoZXkgYXJlIG5vdAotCSAgYmVpbmcgdXNlZC4gIFRoZXJlIGFyZSB0d28gY29tcGV0aW5nIHN0YW5kYXJkcyBmb3IgZG9pbmcgdGhpczogQVBNCi0JICBhbmQgQUNQSS4gIElmIHlvdSB3YW50IHRvIHVzZSBlaXRoZXIgb25lLCBzYXkgWSBoZXJlIGFuZCB0aGVuIGFsc28KLQkgIHRvIHRoZSByZXF1aXNpdGUgc3VwcG9ydCBiZWxvdy4KLQotCSAgUG93ZXIgTWFuYWdlbWVudCBpcyBtb3N0IGltcG9ydGFudCBmb3IgYmF0dGVyeSBwb3dlcmVkIGxhcHRvcAotCSAgY29tcHV0ZXJzOyBpZiB5b3UgaGF2ZSBhIGxhcHRvcCwgY2hlY2sgb3V0IHRoZSBMaW51eCBMYXB0b3AgaG9tZQotCSAgcGFnZSBvbiB0aGUgV1dXIGF0IDxodHRwOi8vd3d3LmxpbnV4LW9uLWxhcHRvcHMuY29tLz4gYW5kIHRoZQotCSAgQmF0dGVyeSBQb3dlcmVkIExpbnV4IG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgotCi0JICBOb3RlIHRoYXQsIGV2ZW4gaWYgeW91IHNheSBOIGhlcmUsIExpbnV4IG9uIHRoZSB4ODYgYXJjaGl0ZWN0dXJlCi0JICB3aWxsIGlzc3VlIHRoZSBobHQgaW5zdHJ1Y3Rpb24gaWYgbm90aGluZyBpcyB0byBiZSBkb25lLCB0aGVyZWJ5Ci0JICBzZW5kaW5nIHRoZSBwcm9jZXNzb3IgdG8gc2xlZXAgYW5kIHNhdmluZyBwb3dlci4KLQotY29uZmlnIEFDUEkKLQlib29sCi0JZGVwZW5kcyBvbiAhSUE2NF9IUF9TSU0KLQlkZWZhdWx0IHkKLQotaWYgIUlBNjRfSFBfU0lNCitzb3VyY2UgImtlcm5lbC9wb3dlci9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvYWNwaS9LY29uZmlnIgogCitpZiBQTQorCitzb3VyY2UgImFyY2gvaWE2NC9rZXJuZWwvY3B1ZnJlcS9LY29uZmlnIgorCiBlbmRpZgogCiBlbmRtZW51CkBAIC00MjgsNiArNDAyLDExIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgR0VORVJJQ19QRU5ESU5HX0lSUQorCWJvb2wKKwlkZXBlbmRzIG9uIEdFTkVSSUNfSEFSRElSUVMgJiYgU01QCisJZGVmYXVsdCB5CisKIHNvdXJjZSAiYXJjaC9pYTY0L2hwL3NpbS9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvaWE2NC9vcHJvZmlsZS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L01ha2VmaWxlIGIvYXJjaC9pYTY0L01ha2VmaWxlCmluZGV4IGY5YmQ4OGEuLjdlZDY3OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9NYWtlZmlsZQorKysgYi9hcmNoL2lhNjQvTWFrZWZpbGUKQEAgLTgyLDI1ICs4MiwxOCBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20taWE2NC8ub2Zmc2V0cy5oLnN0YW1wIHZtbGludXguZ3ogYm9vdGxvYWRlcgotCi1NUlBST1BFUl9GSUxFUyArPSBpbmNsdWRlL2FzbS1pYTY0L29mZnNldHMuaAotCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS1pYTY0L29mZnNldHMuaAotCi1hcmNoL2lhNjQva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIGluY2x1ZGUvY29uZmlnL01BUktFUgotCi1pbmNsdWRlL2FzbS1pYTY0L29mZnNldHMuaDogYXJjaC9pYTY0L2tlcm5lbC9hc20tb2Zmc2V0cy5zCi0JJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXRzKQotCi1hcmNoL2lhNjQva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtLWlhNjQvLm9mZnNldHMuaC5zdGFtcAorcHJlcGFyZTogIGluY2x1ZGUvYXNtLWlhNjQvLm9mZnNldHMuaC5zdGFtcAogCiBpbmNsdWRlL2FzbS1pYTY0Ly5vZmZzZXRzLmguc3RhbXA6CiAJbWtkaXIgLXAgaW5jbHVkZS9hc20taWE2NAotCVsgLXMgaW5jbHVkZS9hc20taWE2NC9vZmZzZXRzLmggXSBcCi0JIHx8IGVjaG8gIiNkZWZpbmUgSUE2NF9UQVNLX1NJWkUgMCIgPiBpbmNsdWRlL2FzbS1pYTY0L29mZnNldHMuaAorCVsgLXMgaW5jbHVkZS9hc20taWE2NC9hc20tb2Zmc2V0cy5oIF0gXAorCXx8IGVjaG8gIiNkZWZpbmUgSUE2NF9UQVNLX1NJWkUgMCIgPiBpbmNsdWRlL2FzbS1pYTY0L2FzbS1vZmZzZXRzLmgKIAl0b3VjaCAkQAogCisKKworQ0xFQU5fRklMRVMgKz0gdm1saW51eC5neiBib290bG9hZGVyIGluY2x1ZGUvYXNtLWlhNjQvLm9mZnNldHMuaC5zdGFtcAorCiBib290OglsaWIvbGliLmEgdm1saW51eAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgJEAKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MvYmlnc3VyX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL2JpZ3N1cl9kZWZjb25maWcKaW5kZXggYjk1ZmNmOC4uM2I2NWNiYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3MvYmlnc3VyX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy9iaWdzdXJfZGVmY29uZmlnCkBAIC0xMDcsMTggKzEwNywxMiBAQAogIwogIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKICMKLUNPTkZJR19BQ1BJX0JPT1Q9eQotQ09ORklHX0FDUElfSU5URVJQUkVURVI9eQogQ09ORklHX0FDUElfQlVUVE9OPW0KLUNPTkZJR19BQ1BJX1ZJREVPPW0KIENPTkZJR19BQ1BJX0ZBTj1tCiBDT05GSUdfQUNQSV9QUk9DRVNTT1I9bQogQ09ORklHX0FDUElfVEhFUk1BTD1tCi1DT05GSUdfQUNQSV9CTEFDS0xJU1RfWUVBUj0wCiAjIENPTkZJR19BQ1BJX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19BQ1BJX0JVUz15CiBDT05GSUdfQUNQSV9QT1dFUj15Ci1DT05GSUdfQUNQSV9QQ0k9eQogQ09ORklHX0FDUElfU1lTVEVNPXkKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3Mvc24yX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3NuMl9kZWZjb25maWcKaW5kZXggZGNjZjM1Yy4uMDgxMTJhYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3Mvc24yX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy9zbjJfZGVmY29uZmlnCkBAIC0xMTEsNyArMTExLDYgQEAKIENPTkZJR19JQTY0X01DQV9SRUNPVkVSWT15CiBDT05GSUdfUEVSRk1PTj15CiBDT05GSUdfSUE2NF9QQUxJTkZPPXkKLUNPTkZJR19BQ1BJX0RFQUxMT0NBVEVfSVJRPXkKIAogIwogIyBGaXJtd2FyZSBEcml2ZXJzCkBAIC0xMzAsMTkgKzEyOSwxMiBAQAogIwogIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKICMKLUNPTkZJR19BQ1BJX0JPT1Q9eQotQ09ORklHX0FDUElfSU5URVJQUkVURVI9eQogIyBDT05GSUdfQUNQSV9CVVRUT04gaXMgbm90IHNldAotQ09ORklHX0FDUElfVklERU89bQotQ09ORklHX0FDUElfSE9US0VZPW0KICMgQ09ORklHX0FDUElfRkFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0FDUElfUFJPQ0VTU09SIGlzIG5vdCBzZXQKIENPTkZJR19BQ1BJX05VTUE9eQotQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVI9MAogIyBDT05GSUdfQUNQSV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfQUNQSV9CVVM9eQogQ09ORklHX0FDUElfUE9XRVI9eQotQ09ORklHX0FDUElfUENJPXkKIENPTkZJR19BQ1BJX1NZU1RFTT15CiAjIENPTkZJR19BQ1BJX0NPTlRBSU5FUiBpcyBub3Qgc2V0CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZwppbmRleCBjODUzY2ZjLi5kNDUyZTE4IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy90aWdlcl9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3MvdGlnZXJfZGVmY29uZmlnCkBAIC0xMDksNyArMTA5LDYgQEAKIENPTkZJR19JQTY0X01DQV9SRUNPVkVSWT15CiBDT05GSUdfUEVSRk1PTj15CiBDT05GSUdfSUE2NF9QQUxJTkZPPXkKLUNPTkZJR19BQ1BJX0RFQUxMT0NBVEVfSVJRPXkKIAogIwogIyBGaXJtd2FyZSBEcml2ZXJzCkBAIC0xMjgsMjAgKzEyNywxMyBAQAogIwogIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKICMKLUNPTkZJR19BQ1BJX0JPT1Q9eQotQ09ORklHX0FDUElfSU5URVJQUkVURVI9eQogQ09ORklHX0FDUElfQlVUVE9OPW0KLSMgQ09ORklHX0FDUElfVklERU8gaXMgbm90IHNldAotIyBDT05GSUdfQUNQSV9IT1RLRVkgaXMgbm90IHNldAogQ09ORklHX0FDUElfRkFOPW0KIENPTkZJR19BQ1BJX1BST0NFU1NPUj1tCiAjIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKIENPTkZJR19BQ1BJX1RIRVJNQUw9bQotQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVI9MAogIyBDT05GSUdfQUNQSV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfQUNQSV9CVVM9eQogQ09ORklHX0FDUElfUE9XRVI9eQotQ09ORklHX0FDUElfUENJPXkKIENPTkZJR19BQ1BJX1NZU1RFTT15CiAjIENPTkZJR19BQ1BJX0NPTlRBSU5FUiBpcyBub3Qgc2V0CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3p4MV9kZWZjb25maWcgYi9hcmNoL2lhNjQvY29uZmlncy96eDFfZGVmY29uZmlnCmluZGV4IDg4ZTg4NjcuLjgwYjBlOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9jb25maWdzL3p4MV9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZwpAQCAtMTA5LDcgKzEwOSw2IEBACiBDT05GSUdfSUE2NF9NQ0FfUkVDT1ZFUlk9eQogQ09ORklHX1BFUkZNT049eQogQ09ORklHX0lBNjRfUEFMSU5GTz15Ci1DT05GSUdfQUNQSV9ERUFMTE9DQVRFX0lSUT15CiAKICMKICMgRmlybXdhcmUgRHJpdmVycwpAQCAtMTI4LDE5ICsxMjcsMTIgQEAKICMKICMgQUNQSSAoQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlKSBTdXBwb3J0CiAjCi1DT05GSUdfQUNQSV9CT09UPXkKLUNPTkZJR19BQ1BJX0lOVEVSUFJFVEVSPXkKIENPTkZJR19BQ1BJX0JVVFRPTj15Ci1DT05GSUdfQUNQSV9WSURFTz1tCi1DT05GSUdfQUNQSV9IT1RLRVk9bQogQ09ORklHX0FDUElfRkFOPXkKIENPTkZJR19BQ1BJX1BST0NFU1NPUj15CiBDT05GSUdfQUNQSV9USEVSTUFMPXkKLUNPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSPTAKICMgQ09ORklHX0FDUElfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0FDUElfQlVTPXkKIENPTkZJR19BQ1BJX1BPV0VSPXkKLUNPTkZJR19BQ1BJX1BDST15CiBDT05GSUdfQUNQSV9TWVNURU09eQogIyBDT05GSUdfQUNQSV9DT05UQUlORVIgaXMgbm90IHNldAogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvZGVmY29uZmlnIGIvYXJjaC9pYTY0L2RlZmNvbmZpZwppbmRleCA4NDQ0YWRkLi41ZGEyMDgxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9kZWZjb25maWcKQEAgLTk5LDcgKzk5LDYgQEAKIENPTkZJR19JQTY0X01DQV9SRUNPVkVSWT15CiBDT05GSUdfUEVSRk1PTj15CiBDT05GSUdfSUE2NF9QQUxJTkZPPXkKLUNPTkZJR19BQ1BJX0RFQUxMT0NBVEVfSVJRPXkKIAogIwogIyBGaXJtd2FyZSBEcml2ZXJzCkBAIC0xMTgsMjAgKzExNywxNCBAQAogIwogIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKICMKLUNPTkZJR19BQ1BJX0JPT1Q9eQotQ09ORklHX0FDUElfSU5URVJQUkVURVI9eQogQ09ORklHX0FDUElfQlVUVE9OPW0KLUNPTkZJR19BQ1BJX1ZJREVPPW0KIENPTkZJR19BQ1BJX0ZBTj1tCiBDT05GSUdfQUNQSV9QUk9DRVNTT1I9bQogQ09ORklHX0FDUElfSE9UUExVR19DUFU9eQogQ09ORklHX0FDUElfVEhFUk1BTD1tCiBDT05GSUdfQUNQSV9OVU1BPXkKLUNPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSPTAKICMgQ09ORklHX0FDUElfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0FDUElfQlVTPXkKIENPTkZJR19BQ1BJX1BPV0VSPXkKLUNPTkZJR19BQ1BJX1BDST15CiBDT05GSUdfQUNQSV9TWVNURU09eQogQ09ORklHX0FDUElfQ09OVEFJTkVSPW0KIApAQCAtMzQxLDcgKzMzNCw3IEBACiBDT05GSUdfU0NTSV9TWU01M0M4WFhfTUFYX1RBR1M9NjQKICMgQ09ORklHX1NDU0lfU1lNNTNDOFhYX0lPTUFQUEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1FMT0dJQ19GQz15CisjIENPTkZJR19TQ1NJX1FMT0dJQ19GQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ19GQ19GSVJNV0FSRSBpcyBub3Qgc2V0CiBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MD15CiAjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwXzEwNDAgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL3NpbS9ib290L2Z3LWVtdS5jIGIvYXJjaC9pYTY0L2hwL3NpbS9ib290L2Z3LWVtdS5jCmluZGV4IDVjNDY5MjguLjMwZmRmYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9zaW0vYm9vdC9mdy1lbXUuYworKysgYi9hcmNoL2lhNjQvaHAvc2ltL2Jvb3QvZnctZW11LmMKQEAgLTIzNywxNyArMjM3LDYgQEAKIAlyZXR1cm4gKChzdHJ1Y3Qgc2FsX3JldF92YWx1ZXMpIHtzdGF0dXMsIHI5LCByMTAsIHIxMX0pOwogfQogCi0KLS8qCi0gKiBUaGlzIGlzIGhlcmUgdG8gd29yayBhcm91bmQgYSBidWcgaW4gZWdjcy0xLjEuMWIgdGhhdCBjYXVzZXMgdGhlCi0gKiBjb21waWxlciB0byBjcmFzaCAoc2VlbXMgbGlrZSBhIGJ1ZyBpbiB0aGUgbmV3IGFsaWFzIGFuYWx5c2lzIGNvZGUuCi0gKi8KLXZvaWQgKgotaWQgKGxvbmcgYWRkcikKLXsKLQlyZXR1cm4gKHZvaWQgKikgYWRkcjsKLX0KLQogc3RydWN0IGlhNjRfYm9vdF9wYXJhbSAqCiBzeXNfZndfaW5pdCAoY29uc3QgY2hhciAqYXJncywgaW50IGFyZ2xlbikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCmluZGV4IDdkY2I4NTguLmI0MmVjMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKKysrIGIvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAKIHN0YXRpYyB2b2lkIHJzX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0jaWYgU0lNU0VSSUFMX0RFQlVHCisjaWZkZWYgU0lNU0VSSUFMX0RFQlVHCiAJcHJpbnRrKCJyc19zdGFydDogdHR5LT5zdG9wcGVkPSVkIHR0eS0+aHdfc3RvcHBlZD0lZCB0dHktPmZsb3dfc3RvcHBlZD0lZFxuIiwKIAkJdHR5LT5zdG9wcGVkLCB0dHktPmh3X3N0b3BwZWQsIHR0eS0+Zmxvd19zdG9wcGVkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TIGIvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TCmluZGV4IDgyOWE2ZDguLjQ5NGZhZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUworKysgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMKQEAgLTEsNiArMSw2IEBACiAjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+CiAjaW5jbHVkZSA8YXNtL2lhMzIuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KIApAQCAtMjE1LDcgKzIxNSw3IEBACiAJZGF0YTggc3lzMzJfZm9yawogCWRhdGE4IHN5c19yZWFkCiAJZGF0YTggc3lzX3dyaXRlCi0JZGF0YTggc3lzMzJfb3BlbgkgIC8qIDUgKi8KKwlkYXRhOCBjb21wYXRfc3lzX29wZW4JICAvKiA1ICovCiAJZGF0YTggc3lzX2Nsb3NlCiAJZGF0YTggc3lzMzJfd2FpdHBpZAogCWRhdGE4IHN5c19jcmVhdApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9zaWduYWwuYyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfc2lnbmFsLmMKaW5kZXggZWJiODliZS4uYWE4OTFjOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9zaWduYWwuYworKysgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX3NpZ25hbC5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcnNlLmg+CiAjaW5jbHVkZSA8YXNtL3NpZ2NvbnRleHQuaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogCiAjaW5jbHVkZSAiaWEzMnByaXYuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYyBiL2FyY2gvaWE2NC9pYTMyL3N5c19pYTMyLmMKaW5kZXggYzFlMjBkNi4uZTI5YThhNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYworKysgYi9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jCkBAIC0yMzU5LDM3ICsyMzU5LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogRXhhY3RseSBsaWtlIGZzL29wZW4uYzpzeXNfb3BlbigpLCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IHNldCB0aGUgT19MQVJHRUZJTEUgZmxhZy4KLSAqLwotYXNtbGlua2FnZSBsb25nCi1zeXMzMl9vcGVuIChjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQotewotCWNoYXIgKiB0bXA7Ci0JaW50IGZkLCBlcnJvcjsKLQotCXRtcCA9IGdldG5hbWUoZmlsZW5hbWUpOwotCWZkID0gUFRSX0VSUih0bXApOwotCWlmICghSVNfRVJSKHRtcCkpIHsKLQkJZmQgPSBnZXRfdW51c2VkX2ZkKCk7Ci0JCWlmIChmZCA+PSAwKSB7Ci0JCQlzdHJ1Y3QgZmlsZSAqZiA9IGZpbHBfb3Blbih0bXAsIGZsYWdzLCBtb2RlKTsKLQkJCWVycm9yID0gUFRSX0VSUihmKTsKLQkJCWlmIChJU19FUlIoZikpCi0JCQkJZ290byBvdXRfZXJyb3I7Ci0JCQlmZF9pbnN0YWxsKGZkLCBmKTsKLQkJfQotb3V0OgotCQlwdXRuYW1lKHRtcCk7Ci0JfQotCXJldHVybiBmZDsKLQotb3V0X2Vycm9yOgotCXB1dF91bnVzZWRfZmQoZmQpOwotCWZkID0gZXJyb3I7Ci0JZ290byBvdXQ7Ci19Ci0KIC8qIFN0cnVjdHVyZSBmb3IgaWEzMiBlbXVsYXRpb24gb24gaWE2NCAqLwogc3RydWN0IGVwb2xsX2V2ZW50MzIKIHsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2lhNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGUxZmI2OGQuLjMwNzUxNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTYsMTAgKzE2LDExIEBACiBvYmotJChDT05GSUdfSUE2NF9QQUxJTkZPKQkrPSBwYWxpbmZvLm8KIG9iai0kKENPTkZJR19JT1NBUElDKQkJKz0gaW9zYXBpYy5vCiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IG1vZHVsZS5vCi1vYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8gc21wYm9vdC5vIGRvbWFpbi5vCitvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8gc21wYm9vdC5vCiBvYmotJChDT05GSUdfTlVNQSkJCSs9IG51bWEubwogb2JqLSQoQ09ORklHX1BFUkZNT04pCQkrPSBwZXJmbW9uX2RlZmF1bHRfc21wbC5vCiBvYmotJChDT05GSUdfSUE2NF9DWUNMT05FKQkrPSBjeWNsb25lLm8KK29iai0kKENPTkZJR19DUFVfRlJFUSkJCSs9IGNwdWZyZXEvCiBvYmotJChDT05GSUdfSUE2NF9NQ0FfUkVDT1ZFUlkpCSs9IG1jYV9yZWNvdmVyeS5vCiBvYmotJChDT05GSUdfS1BST0JFUykJCSs9IGtwcm9iZXMubyBqcHJvYmVzLm8KIG9iai0kKENPTkZJR19JQTY0X1VOQ0FDSEVEX0FMTE9DQVRPUikJKz0gdW5jYWNoZWQubwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLWV4dC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLWV4dC5jCmluZGV4IDI2MjNkZjUuLjEzYTViM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS1leHQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FjcGktZXh0LmMKQEAgLTE3LDIwICsxNywyMCBAQAogI2luY2x1ZGUgPGFzbS9hY3BpLWV4dC5oPgogCiBzdHJ1Y3QgYWNwaV92ZW5kb3JfZGVzY3JpcHRvciB7Ci0JdTgJCQkJZ3VpZF9pZDsKLQllZmlfZ3VpZF90CQkJZ3VpZDsKKwl1OCBndWlkX2lkOworCWVmaV9ndWlkX3QgZ3VpZDsKIH07CiAKIHN0cnVjdCBhY3BpX3ZlbmRvcl9pbmZvIHsKLQlzdHJ1Y3QgYWNwaV92ZW5kb3JfZGVzY3JpcHRvcgkqZGVzY3JpcHRvcjsKLQl1OAkJCQkqZGF0YTsKLQl1MzIJCQkJbGVuZ3RoOworCXN0cnVjdCBhY3BpX3ZlbmRvcl9kZXNjcmlwdG9yICpkZXNjcmlwdG9yOworCXU4ICpkYXRhOworCXUzMiBsZW5ndGg7CiB9OwogCiBhY3BpX3N0YXR1cwogYWNwaV92ZW5kb3JfcmVzb3VyY2VfbWF0Y2goc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLCB2b2lkICpjb250ZXh0KQogewotCXN0cnVjdCBhY3BpX3ZlbmRvcl9pbmZvICppbmZvID0gKHN0cnVjdCBhY3BpX3ZlbmRvcl9pbmZvICopIGNvbnRleHQ7CisJc3RydWN0IGFjcGlfdmVuZG9yX2luZm8gKmluZm8gPSAoc3RydWN0IGFjcGlfdmVuZG9yX2luZm8gKiljb250ZXh0OwogCXN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvciAqdmVuZG9yOwogCXN0cnVjdCBhY3BpX3ZlbmRvcl9kZXNjcmlwdG9yICpkZXNjcmlwdG9yOwogCXUzMiBsZW5ndGg7CkBAIC0zOCw4ICszOCw4IEBACiAJaWYgKHJlc291cmNlLT5pZCAhPSBBQ1BJX1JTVFlQRV9WRU5ET1IpCiAJCXJldHVybiBBRV9PSzsKIAotCXZlbmRvciA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IgKikgJnJlc291cmNlLT5kYXRhOwotCWRlc2NyaXB0b3IgPSAoc3RydWN0IGFjcGlfdmVuZG9yX2Rlc2NyaXB0b3IgKikgdmVuZG9yLT5yZXNlcnZlZDsKKwl2ZW5kb3IgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yICopJnJlc291cmNlLT5kYXRhOworCWRlc2NyaXB0b3IgPSAoc3RydWN0IGFjcGlfdmVuZG9yX2Rlc2NyaXB0b3IgKil2ZW5kb3ItPnJlc2VydmVkOwogCWlmICh2ZW5kb3ItPmxlbmd0aCA8PSBzaXplb2YoKmluZm8tPmRlc2NyaXB0b3IpIHx8CiAJICAgIGRlc2NyaXB0b3ItPmd1aWRfaWQgIT0gaW5mby0+ZGVzY3JpcHRvci0+Z3VpZF9pZCB8fAogCSAgICBlZmlfZ3VpZGNtcChkZXNjcmlwdG9yLT5ndWlkLCBpbmZvLT5kZXNjcmlwdG9yLT5ndWlkKSkKQEAgLTUwLDIxICs1MCwyNCBAQAogCWlmICghaW5mby0+ZGF0YSkKIAkJcmV0dXJuIEFFX05PX01FTU9SWTsKIAotCW1lbWNweShpbmZvLT5kYXRhLCB2ZW5kb3ItPnJlc2VydmVkICsgc2l6ZW9mKHN0cnVjdCBhY3BpX3ZlbmRvcl9kZXNjcmlwdG9yKSwgbGVuZ3RoKTsKKwltZW1jcHkoaW5mby0+ZGF0YSwKKwkgICAgICAgdmVuZG9yLT5yZXNlcnZlZCArIHNpemVvZihzdHJ1Y3QgYWNwaV92ZW5kb3JfZGVzY3JpcHRvciksCisJICAgICAgIGxlbmd0aCk7CiAJaW5mby0+bGVuZ3RoID0gbGVuZ3RoOwogCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKIH0KIAogYWNwaV9zdGF0dXMKLWFjcGlfZmluZF92ZW5kb3JfcmVzb3VyY2UoYWNwaV9oYW5kbGUgb2JqLCBzdHJ1Y3QgYWNwaV92ZW5kb3JfZGVzY3JpcHRvciAqaWQsCi0JCXU4ICoqZGF0YSwgdTMyICpsZW5ndGgpCithY3BpX2ZpbmRfdmVuZG9yX3Jlc291cmNlKGFjcGlfaGFuZGxlIG9iaiwgc3RydWN0IGFjcGlfdmVuZG9yX2Rlc2NyaXB0b3IgKiBpZCwKKwkJCSAgdTggKiogZGF0YSwgdTMyICogbGVuZ3RoKQogewogCXN0cnVjdCBhY3BpX3ZlbmRvcl9pbmZvIGluZm87CiAKIAlpbmZvLmRlc2NyaXB0b3IgPSBpZDsKIAlpbmZvLmRhdGEgPSBOVUxMOwogCi0JYWNwaV93YWxrX3Jlc291cmNlcyhvYmosIE1FVEhPRF9OQU1FX19DUlMsIGFjcGlfdmVuZG9yX3Jlc291cmNlX21hdGNoLCAmaW5mbyk7CisJYWNwaV93YWxrX3Jlc291cmNlcyhvYmosIE1FVEhPRF9OQU1FX19DUlMsIGFjcGlfdmVuZG9yX3Jlc291cmNlX21hdGNoLAorCQkJICAgICZpbmZvKTsKIAlpZiAoIWluZm8uZGF0YSkKIAkJcmV0dXJuIEFFX05PVF9GT1VORDsKIApAQCAtNzUsMTcgKzc4LDE5IEBACiAKIHN0cnVjdCBhY3BpX3ZlbmRvcl9kZXNjcmlwdG9yIGhwX2Njc3JfZGVzY3JpcHRvciA9IHsKIAkuZ3VpZF9pZCA9IDIsCi0JLmd1aWQgICAgPSBFRklfR1VJRCgweDY5ZTlhZGY5LCAweDkyNGYsIDB4YWI1ZiwgMHhmNiwgMHg0YSwgMHgyNCwgMHhkMiwgMHgwMSwgMHgzNywgMHgwZSwgMHhhZCkKKwkuZ3VpZCA9CisJICAgIEVGSV9HVUlEKDB4NjllOWFkZjksIDB4OTI0ZiwgMHhhYjVmLCAweGY2LCAweDRhLCAweDI0LCAweGQyLCAweDAxLAorCQkgICAgIDB4MzcsIDB4MGUsIDB4YWQpCiB9OwogCi1hY3BpX3N0YXR1cwotaHBfYWNwaV9jc3Jfc3BhY2UoYWNwaV9oYW5kbGUgb2JqLCB1NjQgKmNzcl9iYXNlLCB1NjQgKmNzcl9sZW5ndGgpCithY3BpX3N0YXR1cyBocF9hY3BpX2Nzcl9zcGFjZShhY3BpX2hhbmRsZSBvYmosIHU2NCAqIGNzcl9iYXNlLCB1NjQgKiBjc3JfbGVuZ3RoKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAl1OCAqZGF0YTsKIAl1MzIgbGVuZ3RoOwogCi0Jc3RhdHVzID0gYWNwaV9maW5kX3ZlbmRvcl9yZXNvdXJjZShvYmosICZocF9jY3NyX2Rlc2NyaXB0b3IsICZkYXRhLCAmbGVuZ3RoKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2ZpbmRfdmVuZG9yX3Jlc291cmNlKG9iaiwgJmhwX2Njc3JfZGVzY3JpcHRvciwgJmRhdGEsICZsZW5ndGgpOwogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8IGxlbmd0aCAhPSAxNikKIAkJcmV0dXJuIEFFX05PVF9GT1VORDsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKaW5kZXggOTYwOWYyNC4uMjhhNDUyOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKQEAgLTc0LDEyICs3NCwxMSBAQAogdW5zaWduZWQgaW50IGFjcGlfY3BlaV9waHlzX2NwdWlkOwogCiAjZGVmaW5lIE1BWF9TQVBJQ1MgMjU2Ci11MTYgaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtNQVhfU0FQSUNTXSA9Ci0JeyBbMCAuLi4gTUFYX1NBUElDUyAtIDFdID0gLTEgfTsKK3UxNiBpYTY0X2FjcGlpZF90b19zYXBpY2lkW01BWF9TQVBJQ1NdID0ge1swIC4uLiBNQVhfU0FQSUNTIC0gMV0gPSAtMSB9OworCiBFWFBPUlRfU1lNQk9MKGlhNjRfYWNwaWlkX3RvX3NhcGljaWQpOwogCi1jb25zdCBjaGFyICoKLWFjcGlfZ2V0X3N5c25hbWUgKHZvaWQpCitjb25zdCBjaGFyICphY3BpX2dldF9zeXNuYW1lKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX0lBNjRfR0VORVJJQwogCXVuc2lnbmVkIGxvbmcgcnNkcF9waHlzOwpAQCAtODksMjcgKzg4LDI5IEBACiAKIAlyc2RwX3BoeXMgPSBhY3BpX2ZpbmRfcnNkcCgpOwogCWlmICghcnNkcF9waHlzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQUNQSSAyLjAgUlNEUCBub3QgZm91bmQsIGRlZmF1bHQgdG8gXCJkaWdcIlxuIik7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIkFDUEkgMi4wIFJTRFAgbm90IGZvdW5kLCBkZWZhdWx0IHRvIFwiZGlnXCJcbiIpOwogCQlyZXR1cm4gImRpZyI7CiAJfQogCi0JcnNkcCA9IChzdHJ1Y3QgYWNwaTIwX3RhYmxlX3JzZHAgKikgX192YShyc2RwX3BoeXMpOworCXJzZHAgPSAoc3RydWN0IGFjcGkyMF90YWJsZV9yc2RwICopX192YShyc2RwX3BoeXMpOwogCWlmIChzdHJuY21wKHJzZHAtPnNpZ25hdHVyZSwgUlNEUF9TSUcsIHNpemVvZihSU0RQX1NJRykgLSAxKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkFDUEkgMi4wIFJTRFAgc2lnbmF0dXJlIGluY29ycmVjdCwgZGVmYXVsdCB0byBcImRpZ1wiXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiQUNQSSAyLjAgUlNEUCBzaWduYXR1cmUgaW5jb3JyZWN0LCBkZWZhdWx0IHRvIFwiZGlnXCJcbiIpOwogCQlyZXR1cm4gImRpZyI7CiAJfQogCi0JeHNkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV94c2R0ICopIF9fdmEocnNkcC0+eHNkdF9hZGRyZXNzKTsKKwl4c2R0ID0gKHN0cnVjdCBhY3BpX3RhYmxlX3hzZHQgKilfX3ZhKHJzZHAtPnhzZHRfYWRkcmVzcyk7CiAJaGRyID0gJnhzZHQtPmhlYWRlcjsKIAlpZiAoc3RybmNtcChoZHItPnNpZ25hdHVyZSwgWFNEVF9TSUcsIHNpemVvZihYU0RUX1NJRykgLSAxKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkFDUEkgMi4wIFhTRFQgc2lnbmF0dXJlIGluY29ycmVjdCwgZGVmYXVsdCB0byBcImRpZ1wiXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiQUNQSSAyLjAgWFNEVCBzaWduYXR1cmUgaW5jb3JyZWN0LCBkZWZhdWx0IHRvIFwiZGlnXCJcbiIpOwogCQlyZXR1cm4gImRpZyI7CiAJfQogCiAJaWYgKCFzdHJjbXAoaGRyLT5vZW1faWQsICJIUCIpKSB7CiAJCXJldHVybiAiaHB6eDEiOwotCX0KLQllbHNlIGlmICghc3RyY21wKGhkci0+b2VtX2lkLCAiU0dJIikpIHsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoaGRyLT5vZW1faWQsICJTR0kiKSkgewogCQlyZXR1cm4gInNuMiI7CiAJfQogCkBAIC0xMzEsNyArMTMyLDcgQEAKICNlbmRpZgogfQogCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVAorI2lmZGVmIENPTkZJR19BQ1BJCiAKICNkZWZpbmUgQUNQSV9NQVhfUExBVEZPUk1fSU5URVJSVVBUUwkyNTYKIApAQCAtMTQ2LDggKzE0Nyw3IEBACiAgKiBJbnRlcnJ1cHQgcm91dGluZyBBUEkgZm9yIGRldmljZSBkcml2ZXJzLiAgUHJvdmlkZXMgaW50ZXJydXB0IHZlY3RvciBmb3IKICAqIGEgZ2VuZXJpYyBwbGF0Zm9ybSBldmVudC4gIEN1cnJlbnRseSBvbmx5IENQRUkgaXMgaW1wbGVtZW50ZWQuCiAgKi8KLWludAotYWNwaV9yZXF1ZXN0X3ZlY3RvciAodTMyIGludF90eXBlKQoraW50IGFjcGlfcmVxdWVzdF92ZWN0b3IodTMyIGludF90eXBlKQogewogCWludCB2ZWN0b3IgPSAtMTsKIApAQCAtMTU1LDEyICsxNTUsMTIgQEAKIAkJLyogY29ycmVjdGVkIHBsYXRmb3JtIGVycm9yIGludGVycnVwdCAqLwogCQl2ZWN0b3IgPSBwbGF0Zm9ybV9pbnRyX2xpc3RbaW50X3R5cGVdOwogCX0gZWxzZQotCQlwcmludGsoS0VSTl9FUlIgImFjcGlfcmVxdWVzdF92ZWN0b3IoKTogaW52YWxpZCBpbnRlcnJ1cHQgdHlwZVxuIik7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImFjcGlfcmVxdWVzdF92ZWN0b3IoKTogaW52YWxpZCBpbnRlcnJ1cHQgdHlwZVxuIik7CiAJcmV0dXJuIHZlY3RvcjsKIH0KIAotY2hhciAqCi1fX2FjcGlfbWFwX3RhYmxlICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQorY2hhciAqX19hY3BpX21hcF90YWJsZSh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJldHVybiBfX3ZhKHBoeXNfYWRkcik7CiB9CkBAIC0xNjksMTkgKzE2OSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3QtdGltZSBUYWJsZSBQYXJzaW5nCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50CQkJdG90YWxfY3B1cyBfX2luaXRkYXRhOwotc3RhdGljIGludAkJCWF2YWlsYWJsZV9jcHVzIF9faW5pdGRhdGE7Ci1zdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICoJYWNwaV9tYWR0IF9faW5pdGRhdGE7Ci1zdGF0aWMgdTgJCQloYXNfODI1OTsKLQorc3RhdGljIGludCB0b3RhbF9jcHVzIF9faW5pdGRhdGE7CitzdGF0aWMgaW50IGF2YWlsYWJsZV9jcHVzIF9faW5pdGRhdGE7CitzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICphY3BpX21hZHQgX19pbml0ZGF0YTsKK3N0YXRpYyB1OCBoYXNfODI1OTsKIAogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIgKAotCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQorYWNwaV9wYXJzZV9sYXBpY19hZGRyX292cihhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwKKwkJCSAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfYWRkcl9vdnIgKmxhcGljOwogCi0JbGFwaWMgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfYWRkcl9vdnIgKikgaGVhZGVyOworCWxhcGljID0gKHN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX2FkZHJfb3ZyICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKGxhcGljLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE5MywyMiArMTkyLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfbHNhcGljIChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfbHNhcGljKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9sc2FwaWMgKmxzYXBpYzsKIAotCWxzYXBpYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sc2FwaWMgKikgaGVhZGVyOworCWxzYXBpYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sc2FwaWMgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkobHNhcGljLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChsc2FwaWMtPmZsYWdzLmVuYWJsZWQpIHsKICNpZmRlZiBDT05GSUdfU01QCi0JCXNtcF9ib290X2RhdGEuY3B1X3BoeXNfaWRbYXZhaWxhYmxlX2NwdXNdID0gKGxzYXBpYy0+aWQgPDwgOCkgfCBsc2FwaWMtPmVpZDsKKwkJc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFthdmFpbGFibGVfY3B1c10gPQorCQkgICAgKGxzYXBpYy0+aWQgPDwgOCkgfCBsc2FwaWMtPmVpZDsKICNlbmRpZgotCQlpYTY0X2FjcGlpZF90b19zYXBpY2lkW2xzYXBpYy0+YWNwaV9pZF0gPSAobHNhcGljLT5pZCA8PCA4KSB8IGxzYXBpYy0+ZWlkOworCQlpYTY0X2FjcGlpZF90b19zYXBpY2lkW2xzYXBpYy0+YWNwaV9pZF0gPQorCQkgICAgKGxzYXBpYy0+aWQgPDwgOCkgfCBsc2FwaWMtPmVpZDsKIAkJKythdmFpbGFibGVfY3B1czsKIAl9CiAKQEAgLTIxNiwxMyArMjE2LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfbGFwaWNfbm1pIChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfbGFwaWNfbm1pKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19ubWkgKmxhY3BpX25taTsKIAotCWxhY3BpX25taSA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19ubWkqKSBoZWFkZXI7CisJbGFjcGlfbm1pID0gKHN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX25taSAqKWhlYWRlcjsKIAogCWlmIChCQURfTUFEVF9FTlRSWShsYWNwaV9ubWksIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjMxLDEzICsyMzAsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9pb3NhcGljIChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfaW9zYXBpYyhhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfaW9zYXBpYyAqaW9zYXBpYzsKIAotCWlvc2FwaWMgPSAoc3RydWN0IGFjcGlfdGFibGVfaW9zYXBpYyAqKSBoZWFkZXI7CisJaW9zYXBpYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9pb3NhcGljICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKGlvc2FwaWMsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjQ1LDE1ICsyNDMsMTQgQEAKIAlyZXR1cm4gaW9zYXBpY19pbml0KGlvc2FwaWMtPmFkZHJlc3MsIGlvc2FwaWMtPmdsb2JhbF9pcnFfYmFzZSk7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfcGxhdF9pbnRfc3JjICgKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfcGxhdF9pbnRfc3JjKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLAorCQkJY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfcGxhdF9pbnRfc3JjICpwbGludHNyYzsKIAlpbnQgdmVjdG9yOwogCi0JcGxpbnRzcmMgPSAoc3RydWN0IGFjcGlfdGFibGVfcGxhdF9pbnRfc3JjICopIGhlYWRlcjsKKwlwbGludHNyYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9wbGF0X2ludF9zcmMgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkocGxpbnRzcmMsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjY3LDggKzI2NCwxMiBAQAogCQkJCQkJcGxpbnRzcmMtPmlvc2FwaWNfdmVjdG9yLAogCQkJCQkJcGxpbnRzcmMtPmVpZCwKIAkJCQkJCXBsaW50c3JjLT5pZCwKLQkJCQkJCShwbGludHNyYy0+ZmxhZ3MucG9sYXJpdHkgPT0gMSkgPyBJT1NBUElDX1BPTF9ISUdIIDogSU9TQVBJQ19QT0xfTE9XLAotCQkJCQkJKHBsaW50c3JjLT5mbGFncy50cmlnZ2VyID09IDEpID8gSU9TQVBJQ19FREdFIDogSU9TQVBJQ19MRVZFTCk7CisJCQkJCQkocGxpbnRzcmMtPmZsYWdzLnBvbGFyaXR5ID09CisJCQkJCQkgMSkgPyBJT1NBUElDX1BPTF9ISUdIIDoKKwkJCQkJCUlPU0FQSUNfUE9MX0xPVywKKwkJCQkJCShwbGludHNyYy0+ZmxhZ3MudHJpZ2dlciA9PQorCQkJCQkJIDEpID8gSU9TQVBJQ19FREdFIDoKKwkJCQkJCUlPU0FQSUNfTEVWRUwpOwogCiAJcGxhdGZvcm1faW50cl9saXN0W3BsaW50c3JjLT50eXBlXSA9IHZlY3RvcjsKIAlpZiAoYWNwaV9tYWR0X3JldiA+IDEpIHsKQEAgLTI4Myw3ICsyODQsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHVuc2lnbmVkIGludCBjYW5fY3BlaV9yZXRhcmdldCh2b2lkKQogewogCWV4dGVybiBpbnQgY3BlX3ZlY3RvcjsKQEAgLTMyMiwyOSArMzIyLDMwIEBACiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX2ludF9zcmNfb3ZyICgKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfaW50X3NyY19vdnIoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9pbnRfc3JjX292ciAqcDsKIAotCXAgPSAoc3RydWN0IGFjcGlfdGFibGVfaW50X3NyY19vdnIgKikgaGVhZGVyOworCXAgPSAoc3RydWN0IGFjcGlfdGFibGVfaW50X3NyY19vdnIgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkocCwgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpb3NhcGljX292ZXJyaWRlX2lzYV9pcnEocC0+YnVzX2lycSwgcC0+Z2xvYmFsX2lycSwKLQkJCQkgKHAtPmZsYWdzLnBvbGFyaXR5ID09IDEpID8gSU9TQVBJQ19QT0xfSElHSCA6IElPU0FQSUNfUE9MX0xPVywKLQkJCQkgKHAtPmZsYWdzLnRyaWdnZXIgPT0gMSkgPyBJT1NBUElDX0VER0UgOiBJT1NBUElDX0xFVkVMKTsKKwkJCQkgKHAtPmZsYWdzLnBvbGFyaXR5ID09CisJCQkJICAxKSA/IElPU0FQSUNfUE9MX0hJR0ggOiBJT1NBUElDX1BPTF9MT1csCisJCQkJIChwLT5mbGFncy50cmlnZ2VyID09CisJCQkJICAxKSA/IElPU0FQSUNfRURHRSA6IElPU0FQSUNfTEVWRUwpOwogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX25taV9zcmMgKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQorYWNwaV9wYXJzZV9ubWlfc3JjKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9ubWlfc3JjICpubWlfc3JjOwogCi0Jbm1pX3NyYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9ubWlfc3JjKikgaGVhZGVyOworCW5taV9zcmMgPSAoc3RydWN0IGFjcGlfdGFibGVfbm1pX3NyYyAqKWhlYWRlcjsKIAogCWlmIChCQURfTUFEVF9FTlRSWShubWlfc3JjLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM1MywxMSArMzU0LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0Ci1hY3BpX21hZHRfb2VtX2NoZWNrIChjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQogewotCWlmICghc3RybmNtcChvZW1faWQsICJJQk0iLCAzKSAmJgotCSAgICAoIXN0cm5jbXAob2VtX3RhYmxlX2lkLCAiU0VSTU9XIiwgNikpKSB7CisJaWYgKCFzdHJuY21wKG9lbV9pZCwgIklCTSIsIDMpICYmICghc3RybmNtcChvZW1fdGFibGVfaWQsICJTRVJNT1ciLCA2KSkpIHsKIAogCQkvKgogCQkgKiBVbmZvcnR1bmF0ZWx5IElUQ19EUklGVCBpcyBub3QgeWV0IHBhcnQgb2YgdGhlCkBAIC0zNzAsMTkgKzM2OSwxOCBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfbWFkdCAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2VfbWFkdCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWFjcGlfbWFkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICopIF9fdmEocGh5c19hZGRyKTsKKwlhY3BpX21hZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqKV9fdmEocGh5c19hZGRyKTsKIAogCWFjcGlfbWFkdF9yZXYgPSBhY3BpX21hZHQtPmhlYWRlci5yZXZpc2lvbjsKIAogCS8qIHJlbWVtYmVyIHRoZSB2YWx1ZSBmb3IgcmVmZXJlbmNlIGFmdGVyIGZyZWVfaW5pdG1lbSgpICovCiAjaWZkZWYgQ09ORklHX0lUQU5JVU0KLQloYXNfODI1OSA9IDE7IC8qIEZpcm13YXJlIG9uIG9sZCBJdGFuaXVtIHN5c3RlbXMgaXMgYnJva2VuICovCisJaGFzXzgyNTkgPSAxOwkJLyogRmlybXdhcmUgb24gb2xkIEl0YW5pdW0gc3lzdGVtcyBpcyBicm9rZW4gKi8KICNlbHNlCiAJaGFzXzgyNTkgPSBhY3BpX21hZHQtPmZsYWdzLnBjYXRfY29tcGF0OwogI2VuZGlmCkBAIC0zOTYsMTkgKzM5NCwxOCBAQAogCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJMb2NhbCBBUElDIGFkZHJlc3MgJXBcbiIsIGlwaV9iYXNlX2FkZHIpOwogCiAJYWNwaV9tYWR0X29lbV9jaGVjayhhY3BpX21hZHQtPmhlYWRlci5vZW1faWQsCi0JCWFjcGlfbWFkdC0+aGVhZGVyLm9lbV90YWJsZV9pZCk7CisJCQkgICAgYWNwaV9tYWR0LT5oZWFkZXIub2VtX3RhYmxlX2lkKTsKIAogCXJldHVybiAwOwogfQogCi0KICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiAKICN1bmRlZiBTTElUX0RFQlVHCiAKICNkZWZpbmUgUFhNX0ZMQUdfTEVOICgoTUFYX1BYTV9ET01BSU5TICsgMSkvMzIpCiAKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBzcmF0X251bV9jcHVzOwkJCS8qIG51bWJlciBvZiBjcHVzICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgc3JhdF9udW1fY3B1czsJLyogbnVtYmVyIG9mIGNwdXMgKi8KIHN0YXRpYyB1MzIgX19kZXZpbml0ZGF0YSBweG1fZmxhZ1tQWE1fRkxBR19MRU5dOwogI2RlZmluZSBweG1fYml0X3NldChiaXQpCShzZXRfYml0KGJpdCwodm9pZCAqKXB4bV9mbGFnKSkKICNkZWZpbmUgcHhtX2JpdF90ZXN0KGJpdCkJKHRlc3RfYml0KGJpdCwodm9pZCAqKXB4bV9mbGFnKSkKQEAgLTQyMSwxNSArNDE4LDE1IEBACiAgKiBBQ1BJIDIuMCBTTElUIChTeXN0ZW0gTG9jYWxpdHkgSW5mb3JtYXRpb24gVGFibGUpCiAgKiBodHRwOi8vZGV2cmVzb3VyY2UuaHAuY29tL2RldnJlc291cmNlL0RvY3MvVGVjaFBhcGVycy9JQTY0L3NsaXQucGRmCiAgKi8KLXZvaWQgX19pbml0Ci1hY3BpX251bWFfc2xpdF9pbml0IChzdHJ1Y3QgYWNwaV90YWJsZV9zbGl0ICpzbGl0KQordm9pZCBfX2luaXQgYWNwaV9udW1hX3NsaXRfaW5pdChzdHJ1Y3QgYWNwaV90YWJsZV9zbGl0ICpzbGl0KQogewogCXUzMiBsZW47CiAKIAlsZW4gPSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSArIDgKLQkJKyBzbGl0LT5sb2NhbGl0aWVzICogc2xpdC0+bG9jYWxpdGllczsKKwkgICAgKyBzbGl0LT5sb2NhbGl0aWVzICogc2xpdC0+bG9jYWxpdGllczsKIAlpZiAoc2xpdC0+aGVhZGVyLmxlbmd0aCAhPSBsZW4pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJBQ1BJIDIuMCBTTElUOiBzaXplIG1pc21hdGNoOiAlZCBleHBlY3RlZCwgJWQgYWN0dWFsXG4iLAorCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJBQ1BJIDIuMCBTTElUOiBzaXplIG1pc21hdGNoOiAlZCBleHBlY3RlZCwgJWQgYWN0dWFsXG4iLAogCQkgICAgICAgbGVuLCBzbGl0LT5oZWFkZXIubGVuZ3RoKTsKIAkJbWVtc2V0KG51bWFfc2xpdCwgMTAsIHNpemVvZihudW1hX3NsaXQpKTsKIAkJcmV0dXJuOwpAQCAtNDM4LDE5ICs0MzUsMjAgQEAKIH0KIAogdm9pZCBfX2luaXQKLWFjcGlfbnVtYV9wcm9jZXNzb3JfYWZmaW5pdHlfaW5pdCAoc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5ICpwYSkKK2FjcGlfbnVtYV9wcm9jZXNzb3JfYWZmaW5pdHlfaW5pdChzdHJ1Y3QgYWNwaV90YWJsZV9wcm9jZXNzb3JfYWZmaW5pdHkgKnBhKQogewogCS8qIHJlY29yZCB0aGlzIG5vZGUgaW4gcHJveGltaXR5IGJpdG1hcCAqLwogCXB4bV9iaXRfc2V0KHBhLT5wcm94aW1pdHlfZG9tYWluKTsKIAotCW5vZGVfY3B1aWRbc3JhdF9udW1fY3B1c10ucGh5c19pZCA9IChwYS0+YXBpY19pZCA8PCA4KSB8IChwYS0+bHNhcGljX2VpZCk7CisJbm9kZV9jcHVpZFtzcmF0X251bV9jcHVzXS5waHlzX2lkID0KKwkgICAgKHBhLT5hcGljX2lkIDw8IDgpIHwgKHBhLT5sc2FwaWNfZWlkKTsKIAkvKiBuaWQgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYXMgbG9naWNhbCBub2RlIGlkIGxhdGVyICovCiAJbm9kZV9jcHVpZFtzcmF0X251bV9jcHVzXS5uaWQgPSBwYS0+cHJveGltaXR5X2RvbWFpbjsKIAlzcmF0X251bV9jcHVzKys7CiB9CiAKIHZvaWQgX19pbml0Ci1hY3BpX251bWFfbWVtb3J5X2FmZmluaXR5X2luaXQgKHN0cnVjdCBhY3BpX3RhYmxlX21lbW9yeV9hZmZpbml0eSAqbWEpCithY3BpX251bWFfbWVtb3J5X2FmZmluaXR5X2luaXQoc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICptYSkKIHsKIAl1bnNpZ25lZCBsb25nIHBhZGRyLCBzaXplOwogCXU4IHB4bTsKQEAgLTQ4Nyw4ICs0ODUsNyBAQAogCW51bV9ub2RlX21lbWJsa3MrKzsKIH0KIAotdm9pZCBfX2luaXQKLWFjcGlfbnVtYV9hcmNoX2ZpeHVwICh2b2lkKQordm9pZCBfX2luaXQgYWNwaV9udW1hX2FyY2hfZml4dXAodm9pZCkKIHsKIAlpbnQgaSwgaiwgbm9kZV9mcm9tLCBub2RlX3RvOwogCkBAIC01MzQsMjEgKzUzMSwyNCBAQAogCWZvciAoaSA9IDA7IGkgPCBzcmF0X251bV9jcHVzOyBpKyspCiAJCW5vZGVfY3B1aWRbaV0ubmlkID0gcHhtX3RvX25pZF9tYXBbbm9kZV9jcHVpZFtpXS5uaWRdOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiTnVtYmVyIG9mIGxvZ2ljYWwgbm9kZXMgaW4gc3lzdGVtID0gJWRcbiIsIG51bV9vbmxpbmVfbm9kZXMoKSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiTnVtYmVyIG9mIG1lbW9yeSBjaHVua3MgaW4gc3lzdGVtID0gJWRcbiIsIG51bV9ub2RlX21lbWJsa3MpOworCXByaW50ayhLRVJOX0lORk8gIk51bWJlciBvZiBsb2dpY2FsIG5vZGVzIGluIHN5c3RlbSA9ICVkXG4iLAorCSAgICAgICBudW1fb25saW5lX25vZGVzKCkpOworCXByaW50ayhLRVJOX0lORk8gIk51bWJlciBvZiBtZW1vcnkgY2h1bmtzIGluIHN5c3RlbSA9ICVkXG4iLAorCSAgICAgICBudW1fbm9kZV9tZW1ibGtzKTsKIAotCWlmICghc2xpdF90YWJsZSkgcmV0dXJuOworCWlmICghc2xpdF90YWJsZSkKKwkJcmV0dXJuOwogCW1lbXNldChudW1hX3NsaXQsIC0xLCBzaXplb2YobnVtYV9zbGl0KSk7Ci0JZm9yIChpPTA7IGk8c2xpdF90YWJsZS0+bG9jYWxpdGllczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHNsaXRfdGFibGUtPmxvY2FsaXRpZXM7IGkrKykgewogCQlpZiAoIXB4bV9iaXRfdGVzdChpKSkKIAkJCWNvbnRpbnVlOwogCQlub2RlX2Zyb20gPSBweG1fdG9fbmlkX21hcFtpXTsKLQkJZm9yIChqPTA7IGo8c2xpdF90YWJsZS0+bG9jYWxpdGllczsgaisrKSB7CisJCWZvciAoaiA9IDA7IGogPCBzbGl0X3RhYmxlLT5sb2NhbGl0aWVzOyBqKyspIHsKIAkJCWlmICghcHhtX2JpdF90ZXN0KGopKQogCQkJCWNvbnRpbnVlOwogCQkJbm9kZV90byA9IHB4bV90b19uaWRfbWFwW2pdOwogCQkJbm9kZV9kaXN0YW5jZShub2RlX2Zyb20sIG5vZGVfdG8pID0KLQkJCQlzbGl0X3RhYmxlLT5lbnRyeVtpKnNsaXRfdGFibGUtPmxvY2FsaXRpZXMgKyBqXTsKKwkJCSAgICBzbGl0X3RhYmxlLT5lbnRyeVtpICogc2xpdF90YWJsZS0+bG9jYWxpdGllcyArIGpdOwogCQl9CiAJfQogCkBAIC01NTYsMzYgKzU1Niw0MSBAQAogCXByaW50aygiQUNQSSAyLjAgU0xJVCBsb2NhbGl0eSB0YWJsZTpcbiIpOwogCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpIHsKIAkJZm9yX2VhY2hfb25saW5lX25vZGUoaikKLQkJCXByaW50aygiJTAzZCAiLCBub2RlX2Rpc3RhbmNlKGksaikpOworCQkgICAgcHJpbnRrKCIlMDNkICIsIG5vZGVfZGlzdGFuY2UoaSwgaikpOwogCQlwcmludGsoIlxuIik7CiAJfQogI2VuZGlmCiB9Ci0jZW5kaWYgLyogQ09ORklHX0FDUElfTlVNQSAqLworI2VuZGlmCQkJCS8qIENPTkZJR19BQ1BJX05VTUEgKi8KIAotdW5zaWduZWQgaW50Ci1hY3BpX3JlZ2lzdGVyX2dzaSAodTMyIGdzaSwgaW50IGVkZ2VfbGV2ZWwsIGludCBhY3RpdmVfaGlnaF9sb3cpCisvKgorICogc3VjY2VzczogcmV0dXJuIElSUSBudW1iZXIgKD49MCkKKyAqIGZhaWx1cmU6IHJldHVybiA8IDAKKyAqLworaW50IGFjcGlfcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCBlZGdlX2xldmVsLCBpbnQgYWN0aXZlX2hpZ2hfbG93KQogewogCWlmIChoYXNfODI1OSAmJiBnc2kgPCAxNikKIAkJcmV0dXJuIGlzYV9pcnFfdG9fdmVjdG9yKGdzaSk7CiAKIAlyZXR1cm4gaW9zYXBpY19yZWdpc3Rlcl9pbnRyKGdzaSwKLQkJCShhY3RpdmVfaGlnaF9sb3cgPT0gQUNQSV9BQ1RJVkVfSElHSCkgPyBJT1NBUElDX1BPTF9ISUdIIDogSU9TQVBJQ19QT0xfTE9XLAotCQkJKGVkZ2VfbGV2ZWwgPT0gQUNQSV9FREdFX1NFTlNJVElWRSkgPyBJT1NBUElDX0VER0UgOiBJT1NBUElDX0xFVkVMKTsKKwkJCQkgICAgIChhY3RpdmVfaGlnaF9sb3cgPT0KKwkJCQkgICAgICBBQ1BJX0FDVElWRV9ISUdIKSA/IElPU0FQSUNfUE9MX0hJR0ggOgorCQkJCSAgICAgSU9TQVBJQ19QT0xfTE9XLAorCQkJCSAgICAgKGVkZ2VfbGV2ZWwgPT0KKwkJCQkgICAgICBBQ1BJX0VER0VfU0VOU0lUSVZFKSA/IElPU0FQSUNfRURHRSA6CisJCQkJICAgICBJT1NBUElDX0xFVkVMKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX3JlZ2lzdGVyX2dzaSk7CiAKLSNpZmRlZiBDT05GSUdfQUNQSV9ERUFMTE9DQVRFX0lSUQotdm9pZAotYWNwaV91bnJlZ2lzdGVyX2dzaSAodTMyIGdzaSkKK3ZvaWQgYWNwaV91bnJlZ2lzdGVyX2dzaSh1MzIgZ3NpKQogewogCWlvc2FwaWNfdW5yZWdpc3Rlcl9pbnRyKGdzaSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfdW5yZWdpc3Rlcl9nc2kpOwotI2VuZGlmIC8qIENPTkZJR19BQ1BJX0RFQUxMT0NBVEVfSVJRICovCiAKLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX2ZhZHQgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCitFWFBPUlRfU1lNQk9MKGFjcGlfdW5yZWdpc3Rlcl9nc2kpOworCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX2ZhZHQodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmZhZHRfaGVhZGVyOwogCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqZmFkdDsKQEAgLTU5MywxMSArNTk4LDExIEBACiAJaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZmFkdF9oZWFkZXIgPSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICopIF9fdmEocGh5c19hZGRyKTsKKwlmYWR0X2hlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKilfX3ZhKHBoeXNfYWRkcik7CiAJaWYgKGZhZHRfaGVhZGVyLT5yZXZpc2lvbiAhPSAzKQotCQlyZXR1cm4gLUVOT0RFVjsJCS8qIE9ubHkgZGVhbCB3aXRoIEFDUEkgMi4wIEZBRFQgKi8KKwkJcmV0dXJuIC1FTk9ERVY7CS8qIE9ubHkgZGVhbCB3aXRoIEFDUEkgMi4wIEZBRFQgKi8KIAotCWZhZHQgPSAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICopIGZhZHRfaGVhZGVyOworCWZhZHQgPSAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICopZmFkdF9oZWFkZXI7CiAKIAlpZiAoIShmYWR0LT5pYXBjX2Jvb3RfYXJjaCAmIEJBRl84MDQyX0tFWUJPQVJEX0NPTlRST0xMRVIpKQogCQlhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQgPSAwOwpAQCAtNjA5LDIyICs2MTQsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi11bnNpZ25lZCBsb25nIF9faW5pdAotYWNwaV9maW5kX3JzZHAgKHZvaWQpCit1bnNpZ25lZCBsb25nIF9faW5pdCBhY3BpX2ZpbmRfcnNkcCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgcnNkcF9waHlzID0gMDsKIAogCWlmIChlZmkuYWNwaTIwKQogCQlyc2RwX3BoeXMgPSBfX3BhKGVmaS5hY3BpMjApOwogCWVsc2UgaWYgKGVmaS5hY3BpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAidjEuMC9yMC43MSB0YWJsZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCSAgICAgICAidjEuMC9yMC43MSB0YWJsZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIik7CiAJcmV0dXJuIHJzZHBfcGh5czsKIH0KIAotCi1pbnQgX19pbml0Ci1hY3BpX2Jvb3RfaW5pdCAodm9pZCkKK2ludCBfX2luaXQgYWNwaV9ib290X2luaXQodm9pZCkKIHsKIAogCS8qCkBAIC02NDIsMzEgKzY0NCw0MyBAQAogCiAJLyogTG9jYWwgQVBJQyAqLwogCi0JaWYgKGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTEFQSUNfQUREUl9PVlIsIGFjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIsIDApIDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBMQVBJQyBhZGRyZXNzIG92ZXJyaWRlIGVudHJ5XG4iKTsKKwlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0CisJICAgIChBQ1BJX01BRFRfTEFQSUNfQUREUl9PVlIsIGFjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIsIDApIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkgICAgICAgIkVycm9yIHBhcnNpbmcgTEFQSUMgYWRkcmVzcyBvdmVycmlkZSBlbnRyeVxuIik7CiAKLQlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MU0FQSUMsIGFjcGlfcGFyc2VfbHNhcGljLCBOUl9DUFVTKSA8IDEpCi0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTUFEVCAtIG5vIExBUElDIGVudHJpZXNcbiIpOworCWlmIChhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0xTQVBJQywgYWNwaV9wYXJzZV9sc2FwaWMsIE5SX0NQVVMpCisJICAgIDwgMSkKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkgICAgICAgIkVycm9yIHBhcnNpbmcgTUFEVCAtIG5vIExBUElDIGVudHJpZXNcbiIpOwogCi0JaWYgKGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTEFQSUNfTk1JLCBhY3BpX3BhcnNlX2xhcGljX25taSwgMCkgPCAwKQorCWlmIChhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0xBUElDX05NSSwgYWNwaV9wYXJzZV9sYXBpY19ubWksIDApCisJICAgIDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBMQVBJQyBOTUkgZW50cnlcbiIpOwogCiAJLyogSS9PIEFQSUMgKi8KIAotCWlmIChhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0lPU0FQSUMsIGFjcGlfcGFyc2VfaW9zYXBpYywgTlJfSU9TQVBJQ1MpIDwgMSkKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBNQURUIC0gbm8gSU9TQVBJQyBlbnRyaWVzXG4iKTsKKwlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0CisJICAgIChBQ1BJX01BRFRfSU9TQVBJQywgYWNwaV9wYXJzZV9pb3NhcGljLCBOUl9JT1NBUElDUykgPCAxKQorCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCisJCSAgICAgICAiRXJyb3IgcGFyc2luZyBNQURUIC0gbm8gSU9TQVBJQyBlbnRyaWVzXG4iKTsKIAogCS8qIFN5c3RlbS1MZXZlbCBJbnRlcnJ1cHQgUm91dGluZyAqLwogCi0JaWYgKGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfUExBVF9JTlRfU1JDLCBhY3BpX3BhcnNlX3BsYXRfaW50X3NyYywgQUNQSV9NQVhfUExBVEZPUk1fSU5URVJSVVBUUykgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBwYXJzaW5nIHBsYXRmb3JtIGludGVycnVwdCBzb3VyY2UgZW50cnlcbiIpOworCWlmIChhY3BpX3RhYmxlX3BhcnNlX21hZHQKKwkgICAgKEFDUElfTUFEVF9QTEFUX0lOVF9TUkMsIGFjcGlfcGFyc2VfcGxhdF9pbnRfc3JjLAorCSAgICAgQUNQSV9NQVhfUExBVEZPUk1fSU5URVJSVVBUUykgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCisJCSAgICAgICAiRXJyb3IgcGFyc2luZyBwbGF0Zm9ybSBpbnRlcnJ1cHQgc291cmNlIGVudHJ5XG4iKTsKIAotCWlmIChhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0lOVF9TUkNfT1ZSLCBhY3BpX3BhcnNlX2ludF9zcmNfb3ZyLCAwKSA8IDApCi0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgaW50ZXJydXB0IHNvdXJjZSBvdmVycmlkZXMgZW50cnlcbiIpOworCWlmIChhY3BpX3RhYmxlX3BhcnNlX21hZHQKKwkgICAgKEFDUElfTUFEVF9JTlRfU1JDX09WUiwgYWNwaV9wYXJzZV9pbnRfc3JjX292ciwgMCkgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCisJCSAgICAgICAiRXJyb3IgcGFyc2luZyBpbnRlcnJ1cHQgc291cmNlIG92ZXJyaWRlcyBlbnRyeVxuIik7CiAKIAlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9OTUlfU1JDLCBhY3BpX3BhcnNlX25taV9zcmMsIDApIDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBOTUkgU1JDIGVudHJ5XG4iKTsKLSAgc2tpcF9tYWR0OgorICAgICAgc2tpcF9tYWR0OgogCiAJLyoKIAkgKiBGQURUIHNheXMgd2hldGhlciBhIGxlZ2FjeSBrZXlib2FyZCBjb250cm9sbGVyIGlzIHByZXNlbnQuCkBAIC02ODEsOCArNjk1LDkgQEAKIAlpZiAoYXZhaWxhYmxlX2NwdXMgPT0gMCkgewogCQlwcmludGsoS0VSTl9JTkZPICJBQ1BJOiBGb3VuZCAwIENQVVM7IGFzc3VtaW5nIDFcbiIpOwogCQlwcmludGsoS0VSTl9JTkZPICJDUFUgMCAoMHglMDR4KSIsIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQkJc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFthdmFpbGFibGVfY3B1c10gPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKLQkJYXZhaWxhYmxlX2NwdXMgPSAxOyAvKiBXZSd2ZSBnb3QgYXQgbGVhc3Qgb25lIG9mIHRoZXNlLCBubz8gKi8KKwkJc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFthdmFpbGFibGVfY3B1c10gPQorCQkgICAgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisJCWF2YWlsYWJsZV9jcHVzID0gMTsJLyogV2UndmUgZ290IGF0IGxlYXN0IG9uZSBvZiB0aGVzZSwgbm8/ICovCiAJfQogCXNtcF9ib290X2RhdGEuY3B1X2NvdW50ID0gYXZhaWxhYmxlX2NwdXM7CiAKQEAgLTY5MSw4ICs3MDYsMTAgQEAKIAlpZiAoc3JhdF9udW1fY3B1cyA9PSAwKSB7CiAJCWludCBjcHUsIGkgPSAxOwogCQlmb3IgKGNwdSA9IDA7IGNwdSA8IHNtcF9ib290X2RhdGEuY3B1X2NvdW50OyBjcHUrKykKLQkJCWlmIChzbXBfYm9vdF9kYXRhLmNwdV9waHlzX2lkW2NwdV0gIT0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkpCi0JCQkJbm9kZV9jcHVpZFtpKytdLnBoeXNfaWQgPSBzbXBfYm9vdF9kYXRhLmNwdV9waHlzX2lkW2NwdV07CisJCQlpZiAoc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFtjcHVdICE9CisJCQkgICAgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkpCisJCQkJbm9kZV9jcHVpZFtpKytdLnBoeXNfaWQgPQorCQkJCSAgICBzbXBfYm9vdF9kYXRhLmNwdV9waHlzX2lkW2NwdV07CiAJfQogIyBlbmRpZgogI2VuZGlmCkBAIC03MDAsMTIgKzcxNywxMiBAQAogCWJ1aWxkX2NwdV90b19ub2RlX21hcCgpOwogI2VuZGlmCiAJLyogTWFrZSBib290LXVwIGxvb2sgcHJldHR5ICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiJWQgQ1BVcyBhdmFpbGFibGUsICVkIENQVXMgdG90YWxcbiIsIGF2YWlsYWJsZV9jcHVzLCB0b3RhbF9jcHVzKTsKKwlwcmludGsoS0VSTl9JTkZPICIlZCBDUFVzIGF2YWlsYWJsZSwgJWQgQ1BVcyB0b3RhbFxuIiwgYXZhaWxhYmxlX2NwdXMsCisJICAgICAgIHRvdGFsX2NwdXMpOwogCXJldHVybiAwOwogfQogCi1pbnQKLWFjcGlfZ3NpX3RvX2lycSAodTMyIGdzaSwgdW5zaWduZWQgaW50ICppcnEpCitpbnQgYWNwaV9nc2lfdG9faXJxKHUzMiBnc2ksIHVuc2lnbmVkIGludCAqaXJxKQogewogCWludCB2ZWN0b3I7CiAKQEAgLTcyNiwxMSArNzQzLDEwIEBACiAgKi8KICNpZmRlZiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVQogc3RhdGljCi1pbnQKLWFjcGlfbWFwX2NwdTJub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGNwdSwgbG9uZyBwaHlzaWQpCitpbnQgYWNwaV9tYXBfY3B1Mm5vZGUoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgY3B1LCBsb25nIHBoeXNpZCkKIHsKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCi0JaW50IAkJCXB4bV9pZDsKKwlpbnQgcHhtX2lkOwogCiAJcHhtX2lkID0gYWNwaV9nZXRfcHhtKGhhbmRsZSk7CiAKQEAgLTczOCwzMSArNzU0LDI4IEBACiAJICogQXNzdW1pbmcgdGhhdCB0aGUgY29udGFpbmVyIGRyaXZlciB3b3VsZCBoYXZlIHNldCB0aGUgcHJveGltaXR5CiAJICogZG9tYWluIGFuZCB3b3VsZCBoYXZlIGluaXRpYWxpemVkIHB4bV90b19uaWRfbWFwW3B4bV9pZF0gJiYgcHhtX2ZsYWcKIAkgKi8KLQlub2RlX2NwdWlkW2NwdV0ubmlkID0gKHB4bV9pZCA8IDApID8gMDoKLQkJCXB4bV90b19uaWRfbWFwW3B4bV9pZF07CisJbm9kZV9jcHVpZFtjcHVdLm5pZCA9IChweG1faWQgPCAwKSA/IDAgOiBweG1fdG9fbmlkX21hcFtweG1faWRdOwogCi0Jbm9kZV9jcHVpZFtjcHVdLnBoeXNfaWQgPSAgcGh5c2lkOworCW5vZGVfY3B1aWRbY3B1XS5waHlzX2lkID0gcGh5c2lkOwogI2VuZGlmCi0JcmV0dXJuKDApOworCXJldHVybiAoMCk7CiB9CiAKLQotaW50Ci1hY3BpX21hcF9sc2FwaWMoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKnBjcHUpCitpbnQgYWNwaV9tYXBfbHNhcGljKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50ICpwY3B1KQogewotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9sc2FwaWMgKmxzYXBpYzsKIAljcHVtYXNrX3QgdG1wX21hcDsKIAlsb25nIHBoeXNpZDsKIAlpbnQgY3B1OwotIAorCiAJaWYgKEFDUElfRkFJTFVSRShhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsICJfTUFUIiwgTlVMTCwgJmJ1ZmZlcikpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghYnVmZmVyLmxlbmd0aCB8fCAgIWJ1ZmZlci5wb2ludGVyKQorCWlmICghYnVmZmVyLmxlbmd0aCB8fCAhYnVmZmVyLnBvaW50ZXIpCiAJCXJldHVybiAtRUlOVkFMOwotIAorCiAJb2JqID0gYnVmZmVyLnBvaW50ZXI7CiAJaWYgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfQlVGRkVSIHx8CiAJICAgIG9iai0+YnVmZmVyLmxlbmd0aCA8IHNpemVvZigqbHNhcGljKSkgewpAQCAtNzc4LDcgKzc5MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXBoeXNpZCA9ICgobHNhcGljLT5pZCA8PDgpIHwgKGxzYXBpYy0+ZWlkKSk7CisJcGh5c2lkID0gKChsc2FwaWMtPmlkIDw8IDgpIHwgKGxzYXBpYy0+ZWlkKSk7CiAKIAlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX0FMTE9DQVRFX0JVRkZFUjsKQEAgLTc4Niw1MCArNzk5LDQ5IEBACiAKIAljcHVzX2NvbXBsZW1lbnQodG1wX21hcCwgY3B1X3ByZXNlbnRfbWFwKTsKIAljcHUgPSBmaXJzdF9jcHUodG1wX21hcCk7Ci0JaWYoY3B1ID49IE5SX0NQVVMpCisJaWYgKGNwdSA+PSBOUl9DUFVTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWFjcGlfbWFwX2NwdTJub2RlKGhhbmRsZSwgY3B1LCBwaHlzaWQpOwogCi0gCWNwdV9zZXQoY3B1LCBjcHVfcHJlc2VudF9tYXApOworCWNwdV9zZXQoY3B1LCBjcHVfcHJlc2VudF9tYXApOwogCWlhNjRfY3B1X3RvX3NhcGljaWRbY3B1XSA9IHBoeXNpZDsKIAlpYTY0X2FjcGlpZF90b19zYXBpY2lkW2xzYXBpYy0+YWNwaV9pZF0gPSBpYTY0X2NwdV90b19zYXBpY2lkW2NwdV07CiAKIAkqcGNwdSA9IGNwdTsKLQlyZXR1cm4oMCk7CisJcmV0dXJuICgwKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX21hcF9sc2FwaWMpOwogCi0KLWludAotYWNwaV91bm1hcF9sc2FwaWMoaW50IGNwdSkKK2ludCBhY3BpX3VubWFwX2xzYXBpYyhpbnQgY3B1KQogewogCWludCBpOwogCi0JZm9yIChpPTA7IGk8TUFYX1NBUElDUzsgaSsrKSB7Ci0gCQlpZiAoaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtpXSA9PSBpYTY0X2NwdV90b19zYXBpY2lkW2NwdV0pIHsKLSAJCQlpYTY0X2FjcGlpZF90b19zYXBpY2lkW2ldID0gLTE7Ci0gCQkJYnJlYWs7Ci0gCQl9Ci0gCX0KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NBUElDUzsgaSsrKSB7CisJCWlmIChpYTY0X2FjcGlpZF90b19zYXBpY2lkW2ldID09IGlhNjRfY3B1X3RvX3NhcGljaWRbY3B1XSkgeworCQkJaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtpXSA9IC0xOworCQkJYnJlYWs7CisJCX0KKwl9CiAJaWE2NF9jcHVfdG9fc2FwaWNpZFtjcHVdID0gLTE7Ci0JY3B1X2NsZWFyKGNwdSxjcHVfcHJlc2VudF9tYXApOworCWNwdV9jbGVhcihjcHUsIGNwdV9wcmVzZW50X21hcCk7CiAKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiAJLyogTlVNQSBzcGVjaWZpYyBjbGVhbnVwJ3MgKi8KICNlbmRpZgogCi0JcmV0dXJuKDApOworCXJldHVybiAoMCk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV91bm1hcF9sc2FwaWMpOwotI2VuZGlmIC8qIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVICovCi0gCisjZW5kaWYJCQkJLyogQ09ORklHX0FDUElfSE9UUExVR19DUFUgKi8KIAogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKIGFjcGlfc3RhdHVzIF9fZGV2aW5pdAotYWNwaV9tYXBfaW9zYXBpYyAoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZGVwdGgsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXQpCithY3BpX21hcF9pb3NhcGljKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGRlcHRoLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0KQogewotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9pb3NhcGljICppb3NhcGljOwogCXVuc2lnbmVkIGludCBnc2lfYmFzZTsKQEAgLTg3OCwxMCArODkwLDkgQEAKIAltYXBfaW9zYXBpY190b19ub2RlKGdzaV9iYXNlLCBub2RlKTsKIAlyZXR1cm4gQUVfT0s7CiB9Ci0jZW5kaWYgLyogQ09ORklHX05VTUEgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfTlVNQSAqLwogCi1pbnQKLWFjcGlfcmVnaXN0ZXJfaW9hcGljIChhY3BpX2hhbmRsZSBoYW5kbGUsIHU2NCBwaHlzX2FkZHIsIHUzMiBnc2lfYmFzZSkKK2ludCBhY3BpX3JlZ2lzdGVyX2lvYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIHU2NCBwaHlzX2FkZHIsIHUzMiBnc2lfYmFzZSkKIHsKIAlpbnQgZXJyOwogCkBAIC04OTAsMTcgKzkwMSwxOCBAQAogCiAjaWYgQ09ORklHX0FDUElfTlVNQQogCWFjcGlfbWFwX2lvc2FwaWMoaGFuZGxlLCAwLCBOVUxMLCBOVUxMKTsKLSNlbmRpZiAvKiBDT05GSUdfQUNQSV9OVU1BICovCisjZW5kaWYJCQkJLyogQ09ORklHX0FDUElfTlVNQSAqLwogCiAJcmV0dXJuIDA7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9yZWdpc3Rlcl9pb2FwaWMpOwogCi1pbnQKLWFjcGlfdW5yZWdpc3Rlcl9pb2FwaWMgKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGdzaV9iYXNlKQoraW50IGFjcGlfdW5yZWdpc3Rlcl9pb2FwaWMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZ3NpX2Jhc2UpCiB7CiAJcmV0dXJuIGlvc2FwaWNfcmVtb3ZlKGdzaV9iYXNlKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX3VucmVnaXN0ZXJfaW9hcGljKTsKIAotI2VuZGlmIC8qIENPTkZJR19BQ1BJX0JPT1QgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDdkMWFlMjkuLmY2YTIzNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTIxMSwxNyArMjExLDQxIEBACiAjZW5kaWYKIAogCUJMQU5LKCk7Ci0JREVGSU5FKElBNjRfTUNBX0NQVV9QUk9DX1NUQVRFX0RVTVBfT0ZGU0VULAotCSAgICAgICBvZmZzZXRvZiAoc3RydWN0IGlhNjRfbWNhX2NwdSwgcHJvY19zdGF0ZV9kdW1wKSk7Ci0JREVGSU5FKElBNjRfTUNBX0NQVV9TVEFDS19PRkZTRVQsCi0JICAgICAgIG9mZnNldG9mIChzdHJ1Y3QgaWE2NF9tY2FfY3B1LCBzdGFjaykpOwotCURFRklORShJQTY0X01DQV9DUFVfU1RBQ0tGUkFNRV9PRkZTRVQsCi0JICAgICAgIG9mZnNldG9mIChzdHJ1Y3QgaWE2NF9tY2FfY3B1LCBzdGFja2ZyYW1lKSk7Ci0JREVGSU5FKElBNjRfTUNBX0NQVV9SQlNUT1JFX09GRlNFVCwKLQkgICAgICAgb2Zmc2V0b2YgKHN0cnVjdCBpYTY0X21jYV9jcHUsIHJic3RvcmUpKTsKKwlERUZJTkUoSUE2NF9NQ0FfQ1BVX01DQV9TVEFDS19PRkZTRVQsCisJICAgICAgIG9mZnNldG9mIChzdHJ1Y3QgaWE2NF9tY2FfY3B1LCBtY2Ffc3RhY2spKTsKIAlERUZJTkUoSUE2NF9NQ0FfQ1BVX0lOSVRfU1RBQ0tfT0ZGU0VULAogCSAgICAgICBvZmZzZXRvZiAoc3RydWN0IGlhNjRfbWNhX2NwdSwgaW5pdF9zdGFjaykpOwogCUJMQU5LKCk7CisJREVGSU5FKElBNjRfU0FMX09TX1NUQVRFX0NPTU1PTl9PRkZTRVQsCisJICAgICAgIG9mZnNldG9mIChzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUsIHNhbF9yYSkpOworCURFRklORShJQTY0X1NBTF9PU19TVEFURV9PU19HUF9PRkZTRVQsCisJICAgICAgIG9mZnNldG9mIChzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUsIG9zX2dwKSk7CisJREVGSU5FKElBNjRfU0FMX09TX1NUQVRFX1BBTF9NSU5fU1RBVEVfT0ZGU0VULAorCSAgICAgICBvZmZzZXRvZiAoc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlLCBwYWxfbWluX3N0YXRlKSk7CisJREVGSU5FKElBNjRfU0FMX09TX1NUQVRFX1BST0NfU1RBVEVfUEFSQU1fT0ZGU0VULAorCSAgICAgICBvZmZzZXRvZiAoc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlLCBwcm9jX3N0YXRlX3BhcmFtKSk7CisJREVGSU5FKElBNjRfU0FMX09TX1NUQVRFX1NJWkUsCisJICAgICAgIHNpemVvZiAoc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlKSk7CisJREVGSU5FKElBNjRfUE1TQV9HUl9PRkZTRVQsCisJICAgICAgIG9mZnNldG9mIChzdHJ1Y3QgcGFsX21pbl9zdGF0ZV9hcmVhX3MsIHBtc2FfZ3IpKTsKKwlERUZJTkUoSUE2NF9QTVNBX0JBTksxX0dSX09GRlNFVCwKKwkgICAgICAgb2Zmc2V0b2YgKHN0cnVjdCBwYWxfbWluX3N0YXRlX2FyZWFfcywgcG1zYV9iYW5rMV9ncikpOworCURFRklORShJQTY0X1BNU0FfUFJfT0ZGU0VULAorCSAgICAgICBvZmZzZXRvZiAoc3RydWN0IHBhbF9taW5fc3RhdGVfYXJlYV9zLCBwbXNhX3ByKSk7CisJREVGSU5FKElBNjRfUE1TQV9CUjBfT0ZGU0VULAorCSAgICAgICBvZmZzZXRvZiAoc3RydWN0IHBhbF9taW5fc3RhdGVfYXJlYV9zLCBwbXNhX2JyMCkpOworCURFRklORShJQTY0X1BNU0FfUlNDX09GRlNFVCwKKwkgICAgICAgb2Zmc2V0b2YgKHN0cnVjdCBwYWxfbWluX3N0YXRlX2FyZWFfcywgcG1zYV9yc2MpKTsKKwlERUZJTkUoSUE2NF9QTVNBX0lJUF9PRkZTRVQsCisJICAgICAgIG9mZnNldG9mIChzdHJ1Y3QgcGFsX21pbl9zdGF0ZV9hcmVhX3MsIHBtc2FfaWlwKSk7CisJREVGSU5FKElBNjRfUE1TQV9JUFNSX09GRlNFVCwKKwkgICAgICAgb2Zmc2V0b2YgKHN0cnVjdCBwYWxfbWluX3N0YXRlX2FyZWFfcywgcG1zYV9pcHNyKSk7CisJREVGSU5FKElBNjRfUE1TQV9JRlNfT0ZGU0VULAorCSAgICAgICBvZmZzZXRvZiAoc3RydWN0IHBhbF9taW5fc3RhdGVfYXJlYV9zLCBwbXNhX2lmcykpOworCURFRklORShJQTY0X1BNU0FfWElQX09GRlNFVCwKKwkgICAgICAgb2Zmc2V0b2YgKHN0cnVjdCBwYWxfbWluX3N0YXRlX2FyZWFfcywgcG1zYV94aXApKTsKKwlCTEFOSygpOworCiAJLyogdXNlZCBieSBmc3lzX2dldHRpbWVvZmRheSBpbiBhcmNoL2lhNjQva2VybmVsL2ZzeXMuUyAqLwogCURFRklORShJQTY0X1RJTUVfSU5URVJQT0xBVE9SX0FERFJFU1NfT0ZGU0VULCBvZmZzZXRvZiAoc3RydWN0IHRpbWVfaW50ZXJwb2xhdG9yLCBhZGRyKSk7CiAJREVGSU5FKElBNjRfVElNRV9JTlRFUlBPTEFUT1JfU09VUkNFX09GRlNFVCwgb2Zmc2V0b2YgKHN0cnVjdCB0aW1lX2ludGVycG9sYXRvciwgc291cmNlKSk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2NwdWZyZXEvS2NvbmZpZyBiL2FyY2gvaWE2NC9rZXJuZWwvY3B1ZnJlcS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOWQ1MjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2lhNjQva2VybmVsL2NwdWZyZXEvS2NvbmZpZwpAQCAtMCwwICsxLDI5IEBACisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisKK21lbnUgIkNQVSBGcmVxdWVuY3kgc2NhbGluZyIKKworc291cmNlICJkcml2ZXJzL2NwdWZyZXEvS2NvbmZpZyIKKworaWYgQ1BVX0ZSRVEKKworY29tbWVudCAiQ1BVRnJlcSBwcm9jZXNzb3IgZHJpdmVycyIKKworY29uZmlnIElBNjRfQUNQSV9DUFVGUkVRCisJdHJpc3RhdGUgIkFDUEkgUHJvY2Vzc29yIFAtU3RhdGVzIGRyaXZlciIKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKKwlkZXBlbmRzIG9uIEFDUElfUFJPQ0VTU09SCisJaGVscAorCVRoaXMgZHJpdmVyIGFkZHMgYSBDUFVGcmVxIGRyaXZlciB3aGljaCB1dGlsaXplcyB0aGUgQUNQSQorCVByb2Nlc3NvciBQZXJmb3JtYW5jZSBTdGF0ZXMuCisKKwlGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJSWYgaW4gZG91YnQsIHNheSBOLgorCitlbmRpZiAgICMgQ1BVX0ZSRVEKKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2NwdWZyZXEvTWFrZWZpbGUgYi9hcmNoL2lhNjQva2VybmVsL2NwdWZyZXEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc0OGQzNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvY3B1ZnJlcS9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfSUE2NF9BQ1BJX0NQVUZSRVEpCQkrPSBhY3BpLWNwdWZyZXEubwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNGQ1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2lhNjQva2VybmVsL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKQEAgLTAsMCArMSw0OTkgQEAKKy8qCisgKiBhcmNoL2lhNjQva2VybmVsL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgQUNQSSBiYXNlZCBQLXN0YXRlIHN1cHBvcnQuIFRoaXMKKyAqIG1vZHVsZSB3b3JrcyB3aXRoIGdlbmVyaWMgY3B1ZnJlcSBpbmZyYXN0cnVjdHVyZS4gTW9zdCBvZgorICogdGhlIGNvZGUgaXMgYmFzZWQgb24gaTM4NiB2ZXJzaW9uCisgKiAoYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYykKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSW50ZWwgQ29ycAorICogICAgICBWZW5rYXRlc2ggUGFsbGlwYWRpIDx2ZW5rYXRlc2gucGFsbGlwYWRpQGludGVsLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgorCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgImFjcGktY3B1ZnJlcSIsIG1zZykKKworTU9EVUxFX0FVVEhPUigiVmVua2F0ZXNoIFBhbGxpcGFkaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIFByb2Nlc3NvciBQLVN0YXRlcyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvIHsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UJYWNwaV9kYXRhOworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZQkJKmZyZXFfdGFibGU7CisJdW5zaWduZWQgaW50CQkJCXJlc3VtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvCSphY3BpX2lvX2RhdGFbTlJfQ1BVU107CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgYWNwaV9jcHVmcmVxX2RyaXZlcjsKKworCitzdGF0aWMgaW50Citwcm9jZXNzb3Jfc2V0X3BzdGF0ZSAoCisJdTMyCXZhbHVlKQoreworCXM2NCByZXR2YWw7CisKKwlkcHJpbnRrKCJwcm9jZXNzb3Jfc2V0X3BzdGF0ZVxuIik7CisKKwlyZXR2YWwgPSBpYTY0X3BhbF9zZXRfcHN0YXRlKCh1NjQpdmFsdWUpOworCisJaWYgKHJldHZhbCkgeworCQlkcHJpbnRrKCJGYWlsZWQgdG8gc2V0IGZyZXEgdG8gMHgleCwgd2l0aCBlcnJvciAweCV4XG4iLAorCQkgICAgICAgIHZhbHVlLCByZXR2YWwpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIChpbnQpcmV0dmFsOworfQorCisKK3N0YXRpYyBpbnQKK3Byb2Nlc3Nvcl9nZXRfcHN0YXRlICgKKwl1MzIJKnZhbHVlKQoreworCXU2NAlwc3RhdGVfaW5kZXggPSAwOworCXM2NCAJcmV0dmFsOworCisJZHByaW50aygicHJvY2Vzc29yX2dldF9wc3RhdGVcbiIpOworCisJcmV0dmFsID0gaWE2NF9wYWxfZ2V0X3BzdGF0ZSgmcHN0YXRlX2luZGV4KTsKKwkqdmFsdWUgPSAodTMyKSBwc3RhdGVfaW5kZXg7CisKKwlpZiAocmV0dmFsKQorCQlkcHJpbnRrKCJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgZnJlcSB3aXRoICIKKwkJICAgICAgICAiZXJyb3IgMHgleCwgaWR4IDB4JXhcbiIsIHJldHZhbCwgKnZhbHVlKTsKKworCXJldHVybiAoaW50KXJldHZhbDsKK30KKworCisvKiBUbyBiZSB1c2VkIG9ubHkgYWZ0ZXIgZGF0YS0+YWNwaV9kYXRhIGlzIGluaXRpYWxpemVkICovCitzdGF0aWMgdW5zaWduZWQKK2V4dHJhY3RfY2xvY2sgKAorCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8gKmRhdGEsCisJdW5zaWduZWQgdmFsdWUsCisJdW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlkcHJpbnRrKCJleHRyYWN0X2Nsb2NrXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQ7IGkrKykgeworCQlpZiAodmFsdWUgPj0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb250cm9sKQorCQkJcmV0dXJuIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3k7CisJfQorCXJldHVybiBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ktMV0uY29yZV9mcmVxdWVuY3k7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludAorcHJvY2Vzc29yX2dldF9mcmVxICgKKwlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvCSpkYXRhLAorCXVuc2lnbmVkIGludAkJY3B1KQoreworCWludAkJCXJldCA9IDA7CisJdTMyCQkJdmFsdWUgPSAwOworCWNwdW1hc2tfdAkJc2F2ZWRfbWFzazsKKwl1bnNpZ25lZCBsb25nIAkJY2xvY2tfZnJlcTsKKworCWRwcmludGsoInByb2Nlc3Nvcl9nZXRfZnJlcVxuIik7CisKKwlzYXZlZF9tYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoY3B1KSk7CisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBjcHUpIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBtaWdyYXRlX2VuZDsKKwl9CisKKwkvKgorCSAqIHByb2Nlc3Nvcl9nZXRfcHN0YXRlIGdldHMgdGhlIGF2ZXJhZ2UgZnJlcXVlbmN5IHNpbmNlIHRoZQorCSAqIGxhc3QgZ2V0LiBTbywgZG8gdHdvIFBBTF9nZXRfZnJlcSgpLi4uCisJICovCisJcmV0ID0gcHJvY2Vzc29yX2dldF9wc3RhdGUoJnZhbHVlKTsKKwlyZXQgPSBwcm9jZXNzb3JfZ2V0X3BzdGF0ZSgmdmFsdWUpOworCisJaWYgKHJldCkgeworCQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVkX21hc2spOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJnZXQgcGVyZm9ybWFuY2UgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCisJCSAgICAgICByZXQpOworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIG1pZ3JhdGVfZW5kOworCX0KKwljbG9ja19mcmVxID0gZXh0cmFjdF9jbG9jayhkYXRhLCB2YWx1ZSwgY3B1KTsKKwlyZXQgPSAoY2xvY2tfZnJlcSoxMDAwKTsKKworbWlncmF0ZV9lbmQ6CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQKK3Byb2Nlc3Nvcl9zZXRfZnJlcSAoCisJc3RydWN0IGNwdWZyZXFfYWNwaV9pbwkqZGF0YSwKKwl1bnNpZ25lZCBpbnQJCWNwdSwKKwlpbnQJCQlzdGF0ZSkKK3sKKwlpbnQJCQlyZXQgPSAwOworCXUzMgkJCXZhbHVlID0gMDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAgICBjcHVmcmVxX2ZyZXFzOworCWNwdW1hc2tfdAkJc2F2ZWRfbWFzazsKKwlpbnQJCQlyZXR2YWw7CisKKwlkcHJpbnRrKCJwcm9jZXNzb3Jfc2V0X2ZyZXFcbiIpOworCisJc2F2ZWRfbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGNwdSkpOworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gY3B1KSB7CisJCXJldHZhbCA9IC1FQUdBSU47CisJCWdvdG8gbWlncmF0ZV9lbmQ7CisJfQorCisJaWYgKHN0YXRlID09IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZSkgeworCQlpZiAodW5saWtlbHkoZGF0YS0+cmVzdW1lKSkgeworCQkJZHByaW50aygiQ2FsbGVkIGFmdGVyIHJlc3VtZSwgcmVzZXR0aW5nIHRvIFAlZFxuIiwgc3RhdGUpOworCQkJZGF0YS0+cmVzdW1lID0gMDsKKwkJfSBlbHNlIHsKKwkJCWRwcmludGsoIkFscmVhZHkgYXQgdGFyZ2V0IHN0YXRlIChQJWQpXG4iLCBzdGF0ZSk7CisJCQlyZXR2YWwgPSAwOworCQkJZ290byBtaWdyYXRlX2VuZDsKKwkJfQorCX0KKworCWRwcmludGsoIlRyYW5zaXRpb25pbmcgZnJvbSBQJWQgdG8gUCVkXG4iLAorCQlkYXRhLT5hY3BpX2RhdGEuc3RhdGUsIHN0YXRlKTsKKworCS8qIGNwdWZyZXEgZnJlcXVlbmN5IHN0cnVjdCAqLworCWNwdWZyZXFfZnJlcXMuY3B1ID0gY3B1OworCWNwdWZyZXFfZnJlcXMub2xkID0gZGF0YS0+ZnJlcV90YWJsZVtkYXRhLT5hY3BpX2RhdGEuc3RhdGVdLmZyZXF1ZW5jeTsKKwljcHVmcmVxX2ZyZXFzLm5ldyA9IGRhdGEtPmZyZXFfdGFibGVbc3RhdGVdLmZyZXF1ZW5jeTsKKworCS8qIG5vdGlmeSBjcHVmcmVxICovCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmY3B1ZnJlcV9mcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJLyoKKwkgKiBGaXJzdCB3ZSB3cml0ZSB0aGUgdGFyZ2V0IHN0YXRlJ3MgJ2NvbnRyb2wnIHZhbHVlIHRvIHRoZQorCSAqIGNvbnRyb2xfcmVnaXN0ZXIuCisJICovCisKKwl2YWx1ZSA9ICh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbc3RhdGVdLmNvbnRyb2w7CisKKwlkcHJpbnRrKCJUcmFuc2l0aW9uaW5nIHRvIHN0YXRlOiAweCUwOHhcbiIsIHZhbHVlKTsKKworCXJldCA9IHByb2Nlc3Nvcl9zZXRfcHN0YXRlKHZhbHVlKTsKKwlpZiAocmV0KSB7CisJCXVuc2lnbmVkIGludCB0bXAgPSBjcHVmcmVxX2ZyZXFzLm5ldzsKKwkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmY3B1ZnJlcV9mcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKwkJY3B1ZnJlcV9mcmVxcy5uZXcgPSBjcHVmcmVxX2ZyZXFzLm9sZDsKKwkJY3B1ZnJlcV9mcmVxcy5vbGQgPSB0bXA7CisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmNwdWZyZXFfZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKwkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmY3B1ZnJlcV9mcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVHJhbnNpdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgcmV0KTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBtaWdyYXRlX2VuZDsKKwl9CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZjcHVmcmVxX2ZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJZGF0YS0+YWNwaV9kYXRhLnN0YXRlID0gc3RhdGU7CisKKwlyZXR2YWwgPSAwOworCittaWdyYXRlX2VuZDoKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVkX21hc2spOworCXJldHVybiAocmV0dmFsKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50CithY3BpX2NwdWZyZXFfZ2V0ICgKKwl1bnNpZ25lZCBpbnQJCWNwdSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvICpkYXRhID0gYWNwaV9pb19kYXRhW2NwdV07CisKKwlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfZ2V0XG4iKTsKKworCXJldHVybiBwcm9jZXNzb3JfZ2V0X2ZyZXEoZGF0YSwgY3B1KTsKK30KKworCitzdGF0aWMgaW50CithY3BpX2NwdWZyZXFfdGFyZ2V0ICgKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5LAorCXVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwl1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJc3RydWN0IGNwdWZyZXFfYWNwaV9pbyAqZGF0YSA9IGFjcGlfaW9fZGF0YVtwb2xpY3ktPmNwdV07CisJdW5zaWduZWQgaW50IG5leHRfc3RhdGUgPSAwOworCXVuc2lnbmVkIGludCByZXN1bHQgPSAwOworCisJZHByaW50aygiYWNwaV9jcHVmcmVxX3NldHBvbGljeVxuIik7CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LAorCQkJZGF0YS0+ZnJlcV90YWJsZSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV4dF9zdGF0ZSk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIChyZXN1bHQpOworCisJcmVzdWx0ID0gcHJvY2Vzc29yX3NldF9mcmVxKGRhdGEsIHBvbGljeS0+Y3B1LCBuZXh0X3N0YXRlKTsKKworCXJldHVybiAocmVzdWx0KTsKK30KKworCitzdGF0aWMgaW50CithY3BpX2NwdWZyZXFfdmVyaWZ5ICgKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCByZXN1bHQgPSAwOworCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8gKmRhdGEgPSBhY3BpX2lvX2RhdGFbcG9saWN5LT5jcHVdOworCisJZHByaW50aygiYWNwaV9jcHVmcmVxX3ZlcmlmeVxuIik7CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LAorCQkJZGF0YS0+ZnJlcV90YWJsZSk7CisKKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKKworLyoKKyAqIHByb2Nlc3Nvcl9pbml0X3BkYyAtIGxldCBCSU9TIGtub3cgYWJvdXQgdGhlIFNNUCBjYXBhYmlsaXRpZXMKKyAqIG9mIHRoaXMgZHJpdmVyCisgKiBAcGVyZjogcHJvY2Vzc29yLXNwZWNpZmljIGFjcGlfaW9fZGF0YSBzdHJ1Y3QKKyAqIEBjcHU6IENQVSBiZWluZyBpbml0aWFsaXplZAorICoKKyAqIFRvIGF2b2lkIGlzc3VlcyB3aXRoIGxlZ2FjeSBPU2VzLCBzb21lIEJJT1NlcyByZXF1aXJlIHRvIGJlIGluZm9ybWVkIG9mCisgKiB0aGUgU01QIGNhcGFiaWxpdGllcyBvZiBPUyBQLXN0YXRlIGRyaXZlci4gSGVyZSB3ZSBzZXQgdGhlIGJpdHMgaW4gX1BEQworICogYWNjb3JkaW5nbHkuIEFjdHVhbCBjYWxsIHRvIF9QREMgaXMgZG9uZSBpbiBkcml2ZXIvYWNwaS9wcm9jZXNzb3IuYworICovCitzdGF0aWMgdm9pZAorcHJvY2Vzc29yX2luaXRfcGRjICgKKwkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICpwZXJmLAorCQl1bnNpZ25lZCBpbnQgY3B1LAorCQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqb2JqX2xpc3QKKwkJKQoreworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJdTMyICpidWY7CisKKwlkcHJpbnRrKCJwcm9jZXNzb3JfaW5pdF9wZGNcbiIpOworCisJcGVyZi0+cGRjID0gTlVMTDsKKwkvKiBJbml0aWFsaXplIHBkYy4gSXQgd2lsbCBiZSB1c2VkIGxhdGVyLiAqLworCWlmICghb2JqX2xpc3QpCisJCXJldHVybjsKKworCWlmICghKG9ial9saXN0LT5jb3VudCAmJiBvYmpfbGlzdC0+cG9pbnRlcikpCisJCXJldHVybjsKKworCW9iaiA9IG9ial9saXN0LT5wb2ludGVyOworCWlmICgob2JqLT5idWZmZXIubGVuZ3RoID09IDEyKSAmJiBvYmotPmJ1ZmZlci5wb2ludGVyKSB7CisJCWJ1ZiA9ICh1MzIgKilvYmotPmJ1ZmZlci5wb2ludGVyOworICAgICAgIAkJYnVmWzBdID0gQUNQSV9QRENfUkVWSVNJT05fSUQ7CisgICAgICAgCQlidWZbMV0gPSAxOworICAgICAgIAkJYnVmWzJdID0gQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QOworCQlwZXJmLT5wZGMgPSBvYmpfbGlzdDsKKwl9CisJcmV0dXJuOworfQorCisKK3N0YXRpYyBpbnQKK2FjcGlfY3B1ZnJlcV9jcHVfaW5pdCAoCisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICAgKnBvbGljeSkKK3sKKwl1bnNpZ25lZCBpbnQJCWk7CisJdW5zaWduZWQgaW50CQljcHUgPSBwb2xpY3ktPmNwdTsKKwlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvCSpkYXRhOworCXVuc2lnbmVkIGludAkJcmVzdWx0ID0gMDsKKworCXVuaW9uIGFjcGlfb2JqZWN0CQlhcmcwID0ge0FDUElfVFlQRV9CVUZGRVJ9OworCXUzMgkJCQlhcmcwX2J1ZlszXTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAJYXJnX2xpc3QgPSB7MSwgJmFyZzB9OworCisJZHByaW50aygiYWNwaV9jcHVmcmVxX2NwdV9pbml0XG4iKTsKKwkvKiBzZXR1cCBhcmdfbGlzdCBmb3IgX1BEQyBzZXR0aW5ncyAqLworICAgICAgICBhcmcwLmJ1ZmZlci5sZW5ndGggPSAxMjsKKyAgICAgICAgYXJnMC5idWZmZXIucG9pbnRlciA9ICh1OCAqKSBhcmcwX2J1ZjsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gKC1FTk9NRU0pOworCisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvKSk7CisKKwlhY3BpX2lvX2RhdGFbY3B1XSA9IGRhdGE7CisKKwlwcm9jZXNzb3JfaW5pdF9wZGMoJmRhdGEtPmFjcGlfZGF0YSwgY3B1LCAmYXJnX2xpc3QpOworCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKCZkYXRhLT5hY3BpX2RhdGEsIGNwdSk7CisJZGF0YS0+YWNwaV9kYXRhLnBkYyA9IE5VTEw7CisKKwlpZiAocmVzdWx0KQorCQlnb3RvIGVycl9mcmVlOworCisJLyogY2FwYWJpbGl0eSBjaGVjayAqLworCWlmIChkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQgPD0gMSkgeworCQlkcHJpbnRrKCJObyBQLVN0YXRlc1xuIik7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3VucmVnOworCX0KKworCWlmICgoZGF0YS0+YWNwaV9kYXRhLmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQgIT0KKwkJCQkJQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpIHx8CisJICAgIChkYXRhLT5hY3BpX2RhdGEuc3RhdHVzX3JlZ2lzdGVyLnNwYWNlX2lkICE9CisJCQkJCUFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSkgeworCQlkcHJpbnRrKCJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlIFslZCwgJWRdXG4iLAorCQkJKHUzMikgKGRhdGEtPmFjcGlfZGF0YS5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkKSwKKwkJCSh1MzIpIChkYXRhLT5hY3BpX2RhdGEuc3RhdHVzX3JlZ2lzdGVyLnNwYWNlX2lkKSk7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3VucmVnOworCX0KKworCS8qIGFsbG9jIGZyZXFfdGFibGUgKi8KKwlkYXRhLT5mcmVxX3RhYmxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKSAqCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCArIDEpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOworCWlmICghZGF0YS0+ZnJlcV90YWJsZSkgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bnJlZzsKKwl9CisKKwkvKiBkZXRlY3QgdHJhbnNpdGlvbiBsYXRlbmN5ICovCisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDA7CisJZm9yIChpPTA7IGk8ZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50OyBpKyspIHsKKwkJaWYgKChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLnRyYW5zaXRpb25fbGF0ZW5jeSAqIDEwMDApID4KKwkJICAgIHBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kpIHsKKwkJCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPQorCQkJICAgIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5ICogMTAwMDsKKwkJfQorCX0KKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCisJcG9saWN5LT5jdXIgPSBwcm9jZXNzb3JfZ2V0X2ZyZXEoZGF0YSwgcG9saWN5LT5jcHUpOworCisJLyogdGFibGUgaW5pdCAqLworCWZvciAoaSA9IDA7IGkgPD0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50OyBpKyspCisJeworCQlkYXRhLT5mcmVxX3RhYmxlW2ldLmluZGV4ID0gaTsKKwkJaWYgKGkgPCBkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQpIHsKKwkJCWRhdGEtPmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID0KKwkJCSAgICAgIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOworCQl9IGVsc2UgeworCQkJZGF0YS0+ZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwkJfQorCX0KKworCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBkYXRhLT5mcmVxX3RhYmxlKTsKKwlpZiAocmVzdWx0KSB7CisJCWdvdG8gZXJyX2ZyZXFmcmVlOworCX0KKworCS8qIG5vdGlmeSBCSU9TIHRoYXQgd2UgZXhpc3QgKi8KKwlhY3BpX3Byb2Nlc3Nvcl9ub3RpZnlfc21tKFRISVNfTU9EVUxFKTsKKworCXByaW50ayhLRVJOX0lORk8gImFjcGktY3B1ZnJlcTogQ1BVJXUgLSBBQ1BJIHBlcmZvcm1hbmNlIG1hbmFnZW1lbnQgIgorCSAgICAgICAiYWN0aXZhdGVkLlxuIiwgY3B1KTsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQ7IGkrKykKKwkJZHByaW50aygiICAgICAlY1AlZDogJWQgTUh6LCAlZCBtVywgJWQgdVMsICVkIHVTLCAweCV4IDB4JXhcbiIsCisJCQkoaSA9PSBkYXRhLT5hY3BpX2RhdGEuc3RhdGU/JyonOicgJyksIGksCisJCQkodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5LAorCQkJKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5wb3dlciwKKwkJCSh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5LAorCQkJKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5idXNfbWFzdGVyX2xhdGVuY3ksCisJCQkodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLnN0YXR1cywKKwkJCSh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0uY29udHJvbCk7CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihkYXRhLT5mcmVxX3RhYmxlLCBwb2xpY3ktPmNwdSk7CisKKwkvKiB0aGUgZmlyc3QgY2FsbCB0byAtPnRhcmdldCgpIHNob3VsZCByZXN1bHQgaW4gdXMgYWN0dWFsbHkKKwkgKiB3cml0aW5nIHNvbWV0aGluZyB0byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXJzLiAqLworCWRhdGEtPnJlc3VtZSA9IDE7CisKKwlyZXR1cm4gKHJlc3VsdCk7CisKKyBlcnJfZnJlcWZyZWU6CisJa2ZyZWUoZGF0YS0+ZnJlcV90YWJsZSk7CisgZXJyX3VucmVnOgorCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoJmRhdGEtPmFjcGlfZGF0YSwgY3B1KTsKKyBlcnJfZnJlZToKKwlrZnJlZShkYXRhKTsKKwlhY3BpX2lvX2RhdGFbY3B1XSA9IE5VTEw7CisKKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKKworc3RhdGljIGludAorYWNwaV9jcHVmcmVxX2NwdV9leGl0ICgKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5KQoreworCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8gKmRhdGEgPSBhY3BpX2lvX2RhdGFbcG9saWN5LT5jcHVdOworCisJZHByaW50aygiYWNwaV9jcHVmcmVxX2NwdV9leGl0XG4iKTsKKworCWlmIChkYXRhKSB7CisJCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKKwkJYWNwaV9pb19kYXRhW3BvbGljeS0+Y3B1XSA9IE5VTEw7CisJCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoJmRhdGEtPmFjcGlfZGF0YSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3ktPmNwdSk7CisJCWtmcmVlKGRhdGEpOworCX0KKworCXJldHVybiAoMCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIGFjcGlfY3B1ZnJlcV9hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgYWNwaV9jcHVmcmVxX2RyaXZlciA9IHsKKwkudmVyaWZ5IAk9IGFjcGlfY3B1ZnJlcV92ZXJpZnksCisJLnRhcmdldCAJPSBhY3BpX2NwdWZyZXFfdGFyZ2V0LAorCS5nZXQgCQk9IGFjcGlfY3B1ZnJlcV9nZXQsCisJLmluaXQJCT0gYWNwaV9jcHVmcmVxX2NwdV9pbml0LAorCS5leGl0CQk9IGFjcGlfY3B1ZnJlcV9jcHVfZXhpdCwKKwkubmFtZQkJPSAiYWNwaS1jcHVmcmVxIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIgICAgICAgICAgID0gYWNwaV9jcHVmcmVxX2F0dHIsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0CithY3BpX2NwdWZyZXFfaW5pdCAodm9pZCkKK3sKKwlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfaW5pdFxuIik7CisKKyAJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2NwdWZyZXFfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQKK2FjcGlfY3B1ZnJlcV9leGl0ICh2b2lkKQoreworCWRwcmludGsoImFjcGlfY3B1ZnJlcV9leGl0XG4iKTsKKworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfY3B1ZnJlcV9kcml2ZXIpOworCXJldHVybjsKK30KKworCitsYXRlX2luaXRjYWxsKGFjcGlfY3B1ZnJlcV9pbml0KTsKK21vZHVsZV9leGl0KGFjcGlfY3B1ZnJlcV9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9kb21haW4uYyBiL2FyY2gvaWE2NC9rZXJuZWwvZG9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYjhlZmUuLjAwMDAwMDAKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9kb21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vKgotICogYXJjaC9pYTY0L2tlcm5lbC9kb21haW4uYwotICogQXJjaGl0ZWN0dXJlIHNwZWNpZmljIHNjaGVkLWRvbWFpbnMgYnVpbGRlci4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVzc2UgQmFybmVzCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KLQotI2RlZmluZSBTRF9OT0RFU19QRVJfRE9NQUlOIDE2Ci0KLSNpZmRlZiBDT05GSUdfTlVNQQotLyoqCi0gKiBmaW5kX25leHRfYmVzdF9ub2RlIC0gZmluZCB0aGUgbmV4dCBub2RlIHRvIGluY2x1ZGUgaW4gYSBzY2hlZF9kb21haW4KLSAqIEBub2RlOiBub2RlIHdob3NlIHNjaGVkX2RvbWFpbiB3ZSdyZSBidWlsZGluZwotICogQHVzZWRfbm9kZXM6IG5vZGVzIGFscmVhZHkgaW4gdGhlIHNjaGVkX2RvbWFpbgotICoKLSAqIEZpbmQgdGhlIG5leHQgbm9kZSB0byBpbmNsdWRlIGluIGEgZ2l2ZW4gc2NoZWR1bGluZyBkb21haW4uICBTaW1wbHkKLSAqIGZpbmRzIHRoZSBjbG9zZXN0IG5vZGUgbm90IGFscmVhZHkgaW4gdGhlIEB1c2VkX25vZGVzIG1hcC4KLSAqCi0gKiBTaG91bGQgdXNlIG5vZGVtYXNrX3QuCi0gKi8KLXN0YXRpYyBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyAqdXNlZF9ub2RlcykKLXsKLQlpbnQgaSwgbiwgdmFsLCBtaW5fdmFsLCBiZXN0X25vZGUgPSAwOwotCi0JbWluX3ZhbCA9IElOVF9NQVg7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKLQkJLyogU3RhcnQgYXQgQG5vZGUgKi8KLQkJbiA9IChub2RlICsgaSkgJSBNQVhfTlVNTk9ERVM7Ci0KLQkJaWYgKCFucl9jcHVzX25vZGUobikpCi0JCQljb250aW51ZTsKLQotCQkvKiBTa2lwIGFscmVhZHkgdXNlZCBub2RlcyAqLwotCQlpZiAodGVzdF9iaXQobiwgdXNlZF9ub2RlcykpCi0JCQljb250aW51ZTsKLQotCQkvKiBTaW1wbGUgbWluIGRpc3RhbmNlIHNlYXJjaCAqLwotCQl2YWwgPSBub2RlX2Rpc3RhbmNlKG5vZGUsIG4pOwotCi0JCWlmICh2YWwgPCBtaW5fdmFsKSB7Ci0JCQltaW5fdmFsID0gdmFsOwotCQkJYmVzdF9ub2RlID0gbjsKLQkJfQotCX0KLQotCXNldF9iaXQoYmVzdF9ub2RlLCB1c2VkX25vZGVzKTsKLQlyZXR1cm4gYmVzdF9ub2RlOwotfQotCi0vKioKLSAqIHNjaGVkX2RvbWFpbl9ub2RlX3NwYW4gLSBnZXQgYSBjcHVtYXNrIGZvciBhIG5vZGUncyBzY2hlZF9kb21haW4KLSAqIEBub2RlOiBub2RlIHdob3NlIGNwdW1hc2sgd2UncmUgY29uc3RydWN0aW5nCi0gKiBAc2l6ZTogbnVtYmVyIG9mIG5vZGVzIHRvIGluY2x1ZGUgaW4gdGhpcyBzcGFuCi0gKgotICogR2l2ZW4gYSBub2RlLCBjb25zdHJ1Y3QgYSBnb29kIGNwdW1hc2sgZm9yIGl0cyBzY2hlZF9kb21haW4gdG8gc3Bhbi4gIEl0Ci0gKiBzaG91bGQgYmUgb25lIHRoYXQgcHJldmVudHMgdW5uZWNlc3NhcnkgYmFsYW5jaW5nLCBidXQgYWxzbyBzcHJlYWRzIHRhc2tzCi0gKiBvdXQgb3B0aW1hbGx5LgotICovCi1zdGF0aWMgY3B1bWFza190IHNjaGVkX2RvbWFpbl9ub2RlX3NwYW4oaW50IG5vZGUpCi17Ci0JaW50IGk7Ci0JY3B1bWFza190IHNwYW4sIG5vZGVtYXNrOwotCURFQ0xBUkVfQklUTUFQKHVzZWRfbm9kZXMsIE1BWF9OVU1OT0RFUyk7Ci0KLQljcHVzX2NsZWFyKHNwYW4pOwotCWJpdG1hcF96ZXJvKHVzZWRfbm9kZXMsIE1BWF9OVU1OT0RFUyk7Ci0KLQlub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhub2RlKTsKLQljcHVzX29yKHNwYW4sIHNwYW4sIG5vZGVtYXNrKTsKLQlzZXRfYml0KG5vZGUsIHVzZWRfbm9kZXMpOwotCi0JZm9yIChpID0gMTsgaSA8IFNEX05PREVTX1BFUl9ET01BSU47IGkrKykgewotCQlpbnQgbmV4dF9ub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCB1c2VkX25vZGVzKTsKLQkJbm9kZW1hc2sgPSBub2RlX3RvX2NwdW1hc2sobmV4dF9ub2RlKTsKLQkJY3B1c19vcihzcGFuLCBzcGFuLCBub2RlbWFzayk7Ci0JfQotCi0JcmV0dXJuIHNwYW47Ci19Ci0jZW5kaWYKLQotLyoKLSAqIEF0IHRoZSBtb21lbnQsIENPTkZJR19TQ0hFRF9TTVQgaXMgbmV2ZXIgZGVmaW5lZCwgYnV0IGxlYXZlIGl0IGluIHNvIHdlCi0gKiBjYW4gc3dpdGNoIGl0IG9uIGVhc2lseSBpZiBuZWVkZWQuCi0gKi8KLSNpZmRlZiBDT05GSUdfU0NIRURfU01UCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiwgY3B1X2RvbWFpbnMpOwotc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCBzY2hlZF9ncm91cF9jcHVzW05SX0NQVVNdOwotc3RhdGljIGludCBjcHVfdG9fY3B1X2dyb3VwKGludCBjcHUpCi17Ci0JcmV0dXJuIGNwdTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiwgcGh5c19kb21haW5zKTsKLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgc2NoZWRfZ3JvdXBfcGh5c1tOUl9DUFVTXTsKLXN0YXRpYyBpbnQgY3B1X3RvX3BoeXNfZ3JvdXAoaW50IGNwdSkKLXsKLSNpZmRlZiBDT05GSUdfU0NIRURfU01UCi0JcmV0dXJuIGZpcnN0X2NwdShjcHVfc2libGluZ19tYXBbY3B1XSk7Ci0jZWxzZQotCXJldHVybiBjcHU7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIENPTkZJR19OVU1BCi0vKgotICogVGhlIGluaXRfc2NoZWRfYnVpbGRfZ3JvdXBzIGNhbid0IGhhbmRsZSB3aGF0IHdlIHdhbnQgdG8gZG8gd2l0aCBub2RlCi0gKiBncm91cHMsIHNvIHJvbGwgb3VyIG93bi4gTm93IGVhY2ggbm9kZSBoYXMgaXRzIG93biBsaXN0IG9mIGdyb3VwcyB3aGljaAotICogZ2V0cyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuCi0gKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluLCBub2RlX2RvbWFpbnMpOwotc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCAqc2NoZWRfZ3JvdXBfbm9kZXNbTUFYX05VTU5PREVTXTsKLQotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4sIGFsbG5vZGVzX2RvbWFpbnMpOwotc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCBzY2hlZF9ncm91cF9hbGxub2Rlc1tNQVhfTlVNTk9ERVNdOwotCi1zdGF0aWMgaW50IGNwdV90b19hbGxub2Rlc19ncm91cChpbnQgY3B1KQotewotCXJldHVybiBjcHVfdG9fbm9kZShjcHUpOwotfQotI2VuZGlmCi0KLS8qCi0gKiBCdWlsZCBzY2hlZCBkb21haW5zIGZvciBhIGdpdmVuIHNldCBvZiBjcHVzIGFuZCBhdHRhY2ggdGhlIHNjaGVkIGRvbWFpbnMKLSAqIHRvIHRoZSBpbmRpdmlkdWFsIGNwdXMKLSAqLwotdm9pZCBidWlsZF9zY2hlZF9kb21haW5zKGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCkKLXsKLQlpbnQgaTsKLQotCS8qCi0JICogU2V0IHVwIGRvbWFpbnMgZm9yIGNwdXMgc3BlY2lmaWVkIGJ5IHRoZSBjcHVfbWFwLgotCSAqLwotCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjcHVfbWFwKSB7Ci0JCWludCBncm91cDsKLQkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSBOVUxMLCAqcDsKLQkJY3B1bWFza190IG5vZGVtYXNrID0gbm9kZV90b19jcHVtYXNrKGNwdV90b19ub2RlKGkpKTsKLQotCQljcHVzX2FuZChub2RlbWFzaywgbm9kZW1hc2ssICpjcHVfbWFwKTsKLQotI2lmZGVmIENPTkZJR19OVU1BCi0JCWlmIChudW1fb25saW5lX2NwdXMoKQotCQkJCT4gU0RfTk9ERVNfUEVSX0RPTUFJTipjcHVzX3dlaWdodChub2RlbWFzaykpIHsKLQkJCXNkID0gJnBlcl9jcHUoYWxsbm9kZXNfZG9tYWlucywgaSk7Ci0JCQkqc2QgPSBTRF9BTExOT0RFU19JTklUOwotCQkJc2QtPnNwYW4gPSAqY3B1X21hcDsKLQkJCWdyb3VwID0gY3B1X3RvX2FsbG5vZGVzX2dyb3VwKGkpOwotCQkJc2QtPmdyb3VwcyA9ICZzY2hlZF9ncm91cF9hbGxub2Rlc1tncm91cF07Ci0JCQlwID0gc2Q7Ci0JCX0gZWxzZQotCQkJcCA9IE5VTEw7Ci0KLQkJc2QgPSAmcGVyX2NwdShub2RlX2RvbWFpbnMsIGkpOwotCQkqc2QgPSBTRF9OT0RFX0lOSVQ7Ci0JCXNkLT5zcGFuID0gc2NoZWRfZG9tYWluX25vZGVfc3BhbihjcHVfdG9fbm9kZShpKSk7Ci0JCXNkLT5wYXJlbnQgPSBwOwotCQljcHVzX2FuZChzZC0+c3Bhbiwgc2QtPnNwYW4sICpjcHVfbWFwKTsKLSNlbmRpZgotCi0JCXAgPSBzZDsKLQkJc2QgPSAmcGVyX2NwdShwaHlzX2RvbWFpbnMsIGkpOwotCQlncm91cCA9IGNwdV90b19waHlzX2dyb3VwKGkpOwotCQkqc2QgPSBTRF9DUFVfSU5JVDsKLQkJc2QtPnNwYW4gPSBub2RlbWFzazsKLQkJc2QtPnBhcmVudCA9IHA7Ci0JCXNkLT5ncm91cHMgPSAmc2NoZWRfZ3JvdXBfcGh5c1tncm91cF07Ci0KLSNpZmRlZiBDT05GSUdfU0NIRURfU01UCi0JCXAgPSBzZDsKLQkJc2QgPSAmcGVyX2NwdShjcHVfZG9tYWlucywgaSk7Ci0JCWdyb3VwID0gY3B1X3RvX2NwdV9ncm91cChpKTsKLQkJKnNkID0gU0RfU0lCTElOR19JTklUOwotCQlzZC0+c3BhbiA9IGNwdV9zaWJsaW5nX21hcFtpXTsKLQkJY3B1c19hbmQoc2QtPnNwYW4sIHNkLT5zcGFuLCAqY3B1X21hcCk7Ci0JCXNkLT5wYXJlbnQgPSBwOwotCQlzZC0+Z3JvdXBzID0gJnNjaGVkX2dyb3VwX2NwdXNbZ3JvdXBdOwotI2VuZGlmCi0JfQotCi0jaWZkZWYgQ09ORklHX1NDSEVEX1NNVAotCS8qIFNldCB1cCBDUFUgKHNpYmxpbmcpIGdyb3VwcyAqLwotCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjcHVfbWFwKSB7Ci0JCWNwdW1hc2tfdCB0aGlzX3NpYmxpbmdfbWFwID0gY3B1X3NpYmxpbmdfbWFwW2ldOwotCQljcHVzX2FuZCh0aGlzX3NpYmxpbmdfbWFwLCB0aGlzX3NpYmxpbmdfbWFwLCAqY3B1X21hcCk7Ci0JCWlmIChpICE9IGZpcnN0X2NwdSh0aGlzX3NpYmxpbmdfbWFwKSkKLQkJCWNvbnRpbnVlOwotCi0JCWluaXRfc2NoZWRfYnVpbGRfZ3JvdXBzKHNjaGVkX2dyb3VwX2NwdXMsIHRoaXNfc2libGluZ19tYXAsCi0JCQkJCQkmY3B1X3RvX2NwdV9ncm91cCk7Ci0JfQotI2VuZGlmCi0KLQkvKiBTZXQgdXAgcGh5c2ljYWwgZ3JvdXBzICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7Ci0JCWNwdW1hc2tfdCBub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhpKTsKLQotCQljcHVzX2FuZChub2RlbWFzaywgbm9kZW1hc2ssICpjcHVfbWFwKTsKLQkJaWYgKGNwdXNfZW1wdHkobm9kZW1hc2spKQotCQkJY29udGludWU7Ci0KLQkJaW5pdF9zY2hlZF9idWlsZF9ncm91cHMoc2NoZWRfZ3JvdXBfcGh5cywgbm9kZW1hc2ssCi0JCQkJCQkmY3B1X3RvX3BoeXNfZ3JvdXApOwotCX0KLQotI2lmZGVmIENPTkZJR19OVU1BCi0JaW5pdF9zY2hlZF9idWlsZF9ncm91cHMoc2NoZWRfZ3JvdXBfYWxsbm9kZXMsICpjcHVfbWFwLAotCQkJCSZjcHVfdG9fYWxsbm9kZXNfZ3JvdXApOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7Ci0JCS8qIFNldCB1cCBub2RlIGdyb3VwcyAqLwotCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnLCAqcHJldjsKLQkJY3B1bWFza190IG5vZGVtYXNrID0gbm9kZV90b19jcHVtYXNrKGkpOwotCQljcHVtYXNrX3QgZG9tYWluc3BhbjsKLQkJY3B1bWFza190IGNvdmVyZWQgPSBDUFVfTUFTS19OT05FOwotCQlpbnQgajsKLQotCQljcHVzX2FuZChub2RlbWFzaywgbm9kZW1hc2ssICpjcHVfbWFwKTsKLQkJaWYgKGNwdXNfZW1wdHkobm9kZW1hc2spKQotCQkJY29udGludWU7Ci0KLQkJZG9tYWluc3BhbiA9IHNjaGVkX2RvbWFpbl9ub2RlX3NwYW4oaSk7Ci0JCWNwdXNfYW5kKGRvbWFpbnNwYW4sIGRvbWFpbnNwYW4sICpjcHVfbWFwKTsKLQotCQlzZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2hlZF9ncm91cCksIEdGUF9LRVJORUwpOwotCQlzY2hlZF9ncm91cF9ub2Rlc1tpXSA9IHNnOwotCQlmb3JfZWFjaF9jcHVfbWFzayhqLCBub2RlbWFzaykgewotCQkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7Ci0JCQlzZCA9ICZwZXJfY3B1KG5vZGVfZG9tYWlucywgaik7Ci0JCQlzZC0+Z3JvdXBzID0gc2c7Ci0JCQlpZiAoc2QtPmdyb3VwcyA9PSBOVUxMKSB7Ci0JCQkJLyogVHVybiBvZmYgYmFsYW5jaW5nIGlmIHdlIGhhdmUgbm8gZ3JvdXBzICovCi0JCQkJc2QtPmZsYWdzID0gMDsKLQkJCX0KLQkJfQotCQlpZiAoIXNnKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkiQ2FuIG5vdCBhbGxvYyBkb21haW4gZ3JvdXAgZm9yIG5vZGUgJWRcbiIsIGkpOwotCQkJY29udGludWU7Ci0JCX0KLQkJc2ctPmNwdV9wb3dlciA9IDA7Ci0JCXNnLT5jcHVtYXNrID0gbm9kZW1hc2s7Ci0JCWNwdXNfb3IoY292ZXJlZCwgY292ZXJlZCwgbm9kZW1hc2spOwotCQlwcmV2ID0gc2c7Ci0KLQkJZm9yIChqID0gMDsgaiA8IE1BWF9OVU1OT0RFUzsgaisrKSB7Ci0JCQljcHVtYXNrX3QgdG1wLCBub3Rjb3ZlcmVkOwotCQkJaW50IG4gPSAoaSArIGopICUgTUFYX05VTU5PREVTOwotCi0JCQljcHVzX2NvbXBsZW1lbnQobm90Y292ZXJlZCwgY292ZXJlZCk7Ci0JCQljcHVzX2FuZCh0bXAsIG5vdGNvdmVyZWQsICpjcHVfbWFwKTsKLQkJCWNwdXNfYW5kKHRtcCwgdG1wLCBkb21haW5zcGFuKTsKLQkJCWlmIChjcHVzX2VtcHR5KHRtcCkpCi0JCQkJYnJlYWs7Ci0KLQkJCW5vZGVtYXNrID0gbm9kZV90b19jcHVtYXNrKG4pOwotCQkJY3B1c19hbmQodG1wLCB0bXAsIG5vZGVtYXNrKTsKLQkJCWlmIChjcHVzX2VtcHR5KHRtcCkpCi0JCQkJY29udGludWU7Ci0KLQkJCXNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjaGVkX2dyb3VwKSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXNnKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSJDYW4gbm90IGFsbG9jIGRvbWFpbiBncm91cCBmb3Igbm9kZSAlZFxuIiwgaik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzZy0+Y3B1X3Bvd2VyID0gMDsKLQkJCXNnLT5jcHVtYXNrID0gdG1wOwotCQkJY3B1c19vcihjb3ZlcmVkLCBjb3ZlcmVkLCB0bXApOwotCQkJcHJldi0+bmV4dCA9IHNnOwotCQkJcHJldiA9IHNnOwotCQl9Ci0JCXByZXYtPm5leHQgPSBzY2hlZF9ncm91cF9ub2Rlc1tpXTsKLQl9Ci0jZW5kaWYKLQotCS8qIENhbGN1bGF0ZSBDUFUgcG93ZXIgZm9yIHBoeXNpY2FsIHBhY2thZ2VzIGFuZCBub2RlcyAqLwotCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjcHVfbWFwKSB7Ci0JCWludCBwb3dlcjsKLQkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7Ci0jaWZkZWYgQ09ORklHX1NDSEVEX1NNVAotCQlzZCA9ICZwZXJfY3B1KGNwdV9kb21haW5zLCBpKTsKLQkJcG93ZXIgPSBTQ0hFRF9MT0FEX1NDQUxFOwotCQlzZC0+Z3JvdXBzLT5jcHVfcG93ZXIgPSBwb3dlcjsKLSNlbmRpZgotCi0JCXNkID0gJnBlcl9jcHUocGh5c19kb21haW5zLCBpKTsKLQkJcG93ZXIgPSBTQ0hFRF9MT0FEX1NDQUxFICsgU0NIRURfTE9BRF9TQ0FMRSAqCi0JCQkJKGNwdXNfd2VpZ2h0KHNkLT5ncm91cHMtPmNwdW1hc2spLTEpIC8gMTA7Ci0JCXNkLT5ncm91cHMtPmNwdV9wb3dlciA9IHBvd2VyOwotCi0jaWZkZWYgQ09ORklHX05VTUEKLQkJc2QgPSAmcGVyX2NwdShhbGxub2Rlc19kb21haW5zLCBpKTsKLQkJaWYgKHNkLT5ncm91cHMpIHsKLQkJCXBvd2VyID0gU0NIRURfTE9BRF9TQ0FMRSArIFNDSEVEX0xPQURfU0NBTEUgKgotCQkJCShjcHVzX3dlaWdodChzZC0+Z3JvdXBzLT5jcHVtYXNrKS0xKSAvIDEwOwotCQkJc2QtPmdyb3Vwcy0+Y3B1X3Bvd2VyID0gcG93ZXI7Ci0JCX0KLSNlbmRpZgotCX0KLQotI2lmZGVmIENPTkZJR19OVU1BCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7Ci0JCXN0cnVjdCBzY2hlZF9ncm91cCAqc2cgPSBzY2hlZF9ncm91cF9ub2Rlc1tpXTsKLQkJaW50IGo7Ci0KLQkJaWYgKHNnID09IE5VTEwpCi0JCQljb250aW51ZTsKLW5leHRfc2c6Ci0JCWZvcl9lYWNoX2NwdV9tYXNrKGosIHNnLT5jcHVtYXNrKSB7Ci0JCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKLQkJCWludCBwb3dlcjsKLQotCQkJc2QgPSAmcGVyX2NwdShwaHlzX2RvbWFpbnMsIGopOwotCQkJaWYgKGogIT0gZmlyc3RfY3B1KHNkLT5ncm91cHMtPmNwdW1hc2spKSB7Ci0JCQkJLyoKLQkJCQkgKiBPbmx5IGFkZCAicG93ZXIiIG9uY2UgZm9yIGVhY2gKLQkJCQkgKiBwaHlzaWNhbCBwYWNrYWdlLgotCQkJCSAqLwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcG93ZXIgPSBTQ0hFRF9MT0FEX1NDQUxFICsgU0NIRURfTE9BRF9TQ0FMRSAqCi0JCQkJKGNwdXNfd2VpZ2h0KHNkLT5ncm91cHMtPmNwdW1hc2spLTEpIC8gMTA7Ci0KLQkJCXNnLT5jcHVfcG93ZXIgKz0gcG93ZXI7Ci0JCX0KLQkJc2cgPSBzZy0+bmV4dDsKLQkJaWYgKHNnICE9IHNjaGVkX2dyb3VwX25vZGVzW2ldKQotCQkJZ290byBuZXh0X3NnOwotCX0KLSNlbmRpZgotCi0JLyogQXR0YWNoIHRoZSBkb21haW5zICovCi0JZm9yX2VhY2hfY3B1X21hc2soaSwgKmNwdV9tYXApIHsKLQkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7Ci0jaWZkZWYgQ09ORklHX1NDSEVEX1NNVAotCQlzZCA9ICZwZXJfY3B1KGNwdV9kb21haW5zLCBpKTsKLSNlbHNlCi0JCXNkID0gJnBlcl9jcHUocGh5c19kb21haW5zLCBpKTsKLSNlbmRpZgotCQljcHVfYXR0YWNoX2RvbWFpbihzZCwgaSk7Ci0JfQotfQotLyoKLSAqIFNldCB1cCBzY2hlZHVsZXIgZG9tYWlucyBhbmQgZ3JvdXBzLiAgQ2FsbGVycyBtdXN0IGhvbGQgdGhlIGhvdHBsdWcgbG9jay4KLSAqLwotdm9pZCBhcmNoX2luaXRfc2NoZWRfZG9tYWlucyhjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXApCi17Ci0JY3B1bWFza190IGNwdV9kZWZhdWx0X21hcDsKLQotCS8qCi0JICogU2V0dXAgbWFzayBmb3IgY3B1cyB3aXRob3V0IHNwZWNpYWwgY2FzZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cy4KLQkgKiBGb3Igbm93IHRoaXMganVzdCBleGNsdWRlcyBpc29sYXRlZCBjcHVzLCBidXQgY291bGQgYmUgdXNlZCB0bwotCSAqIGV4Y2x1ZGUgb3RoZXIgc3BlY2lhbCBjYXNlcyBpbiB0aGUgZnV0dXJlLgotCSAqLwotCWNwdXNfYW5kbm90KGNwdV9kZWZhdWx0X21hcCwgKmNwdV9tYXAsIGNwdV9pc29sYXRlZF9tYXApOwotCi0JYnVpbGRfc2NoZWRfZG9tYWlucygmY3B1X2RlZmF1bHRfbWFwKTsKLX0KLQotdm9pZCBhcmNoX2Rlc3Ryb3lfc2NoZWRfZG9tYWlucyhjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXApCi17Ci0jaWZkZWYgQ09ORklHX05VTUEKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKLQkJY3B1bWFza190IG5vZGVtYXNrID0gbm9kZV90b19jcHVtYXNrKGkpOwotCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKm9sZHNnLCAqc2cgPSBzY2hlZF9ncm91cF9ub2Rlc1tpXTsKLQotCQljcHVzX2FuZChub2RlbWFzaywgbm9kZW1hc2ssICpjcHVfbWFwKTsKLQkJaWYgKGNwdXNfZW1wdHkobm9kZW1hc2spKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHNnID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJc2cgPSBzZy0+bmV4dDsKLW5leHRfc2c6Ci0JCW9sZHNnID0gc2c7Ci0JCXNnID0gc2ctPm5leHQ7Ci0JCWtmcmVlKG9sZHNnKTsKLQkJaWYgKG9sZHNnICE9IHNjaGVkX2dyb3VwX25vZGVzW2ldKQotCQkJZ290byBuZXh0X3NnOwotCQlzY2hlZF9ncm91cF9ub2Rlc1tpXSA9IE5VTEw7Ci0JfQotI2VuZGlmCi19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwppbmRleCA5YmU1M2UxLi5iYTBiNmExIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2tyZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wZXJjcHUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC0yMDQsOSArMjA0LDYgQEAKIChwNikJYnIuY29uZC5kcG50IC5tYXAKIAk7OwogLmRvbmU6Ci0ocDYpCXNzbSBwc3IuaWMJCQkvLyBpZiB3ZSBoYWQgdG8gbWFwLCByZWVuYWJsZSB0aGUgcHNyLmljIGJpdCBGSVJTVCEhIQotCTs7Ci0ocDYpCXNybHouZAogCWxkOCBzcD1bcjIxXQkJCS8vIGxvYWQga2VybmVsIHN0YWNrIHBvaW50ZXIgb2YgbmV3IHRhc2sKIAltb3YgSUE2NF9LUihDVVJSRU5UKT1pbjAJLy8gdXBkYXRlICJjdXJyZW50IiBhcHBsaWNhdGlvbiByZWdpc3RlcgogCW1vdiByOD1yMTMJCQkvLyByZXR1cm4gcG9pbnRlciB0byBwcmV2aW91c2x5IHJ1bm5pbmcgdGFzawpAQCAtMjM0LDYgKzIzMSw5IEBACiAJbW92IElBNjRfS1IoQ1VSUkVOVF9TVEFDSyk9cjI2CS8vIHJlbWVtYmVyIGxhc3QgcGFnZSB3ZSBtYXBwZWQuLi4KIAk7OwogCWl0ci5kIGR0cltyMjVdPXIyMwkJLy8gd2lyZSBpbiBuZXcgbWFwcGluZy4uLgorCXNzbSBwc3IuaWMJCQkvLyByZWVuYWJsZSB0aGUgcHNyLmljIGJpdAorCTs7CisJc3Jsei5kCiAJYnIuY29uZC5zcHRrIC5kb25lCiBFTkQoaWE2NF9zd2l0Y2hfdG8pCiAKQEAgLTQ3MCw2ICs0NzAsMjkgQEAKIAlici5jb25kLnNwdGsubWFueSBiNwogRU5EKGxvYWRfc3dpdGNoX3N0YWNrKQogCitHTE9CQUxfRU5UUlkocHJlZmV0Y2hfc3RhY2spCisJYWRkIHIxNCA9IC1JQTY0X1NXSVRDSF9TVEFDS19TSVpFLCBzcAorCWFkZCByMTUgPSBJQTY0X1RBU0tfVEhSRUFEX0tTUF9PRkZTRVQsIGluMAorCTs7CisJbGQ4IHIxNiA9IFtyMTVdCQkJCS8vIGxvYWQgbmV4dCdzIHN0YWNrIHBvaW50ZXIKKwlsZmV0Y2guZmF1bHQuZXhjbCBbcjE0XSwgMTI4CisJOzsKKwlsZmV0Y2guZmF1bHQuZXhjbCBbcjE0XSwgMTI4CisJbGZldGNoLmZhdWx0IFtyMTZdLCAxMjgKKwk7OworCWxmZXRjaC5mYXVsdC5leGNsIFtyMTRdLCAxMjgKKwlsZmV0Y2guZmF1bHQgW3IxNl0sIDEyOAorCTs7CisJbGZldGNoLmZhdWx0LmV4Y2wgW3IxNF0sIDEyOAorCWxmZXRjaC5mYXVsdCBbcjE2XSwgMTI4CisJOzsKKwlsZmV0Y2guZmF1bHQuZXhjbCBbcjE0XSwgMTI4CisJbGZldGNoLmZhdWx0IFtyMTZdLCAxMjgKKwk7OworCWxmZXRjaC5mYXVsdCBbcjE2XSwgMTI4CisJYnIucmV0LnNwdGsubWFueSBycAorRU5EKHByZWZldGNoX3N3aXRjaF9zdGFjaykKKwogR0xPQkFMX0VOVFJZKGV4ZWN2ZSkKIAltb3YgcjE1PV9fTlJfZXhlY3ZlCQkJLy8gcHV0IHN5c2NhbGwgbnVtYmVyIGluIHBsYWNlCiAJYnJlYWsgX19CUkVBS19TWVNDQUxMCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TCmluZGV4IDdkNzY4NGEuLjJkZGJhYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TCkBAIC0xNCw3ICsxNCw3IEBACiAKICNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wZXJjcHUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vc2FsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2dhdGUuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZ2F0ZS5TCmluZGV4IDg2OTQ4Y2UuLjg2MDY0Y2EgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZ2F0ZS5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZ2F0ZS5TCkBAIC0xMCw3ICsxMCw3IEBACiAKICNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaGVhZC5TIGIvYXJjaC9pYTY0L2tlcm5lbC9oZWFkLlMKaW5kZXggOGQzYTkyOS4uYmZlNjViMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9oZWFkLlMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxhc20vZnB1Lmg+CiAjaW5jbHVkZSA8YXNtL2tyZWdzLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGFsLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lvc2FwaWMuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jCmluZGV4IDc5MzZiNjIuLjU3NDA4NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jCkBAIC01NjEsNyArNTYxLDcgQEAKIAlyZXR1cm4gKGlvc2FwaWNfaW50cl9pbmZvW3ZlY3Rvcl0uY291bnQgPiAxKTsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIHJlZ2lzdGVyX2ludHIgKHVuc2lnbmVkIGludCBnc2ksIGludCB2ZWN0b3IsIHVuc2lnbmVkIGNoYXIgZGVsaXZlcnksCiAJICAgICAgIHVuc2lnbmVkIGxvbmcgcG9sYXJpdHksIHVuc2lnbmVkIGxvbmcgdHJpZ2dlcikKIHsKQEAgLTU3Niw3ICs1NzYsNyBAQAogCWluZGV4ID0gZmluZF9pb3NhcGljKGdzaSk7CiAJaWYgKGluZGV4IDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gSU9TQVBJQyBmb3IgR1NJICV1XG4iLCBfX0ZVTkNUSU9OX18sIGdzaSk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaW9zYXBpY19hZGRyZXNzID0gaW9zYXBpY19saXN0c1tpbmRleF0uYWRkcjsKQEAgLTU4Nyw3ICs1ODcsNyBAQAogCQlydGUgPSBpb3NhcGljX2FsbG9jX3J0ZSgpOwogCQlpZiAoIXJ0ZSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlyZXR1cm47CisJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCiAJCXJ0ZV9pbmRleCA9IGdzaSAtIGdzaV9iYXNlOwpAQCAtNjAzLDcgKzYwMyw3IEBACiAJCXN0cnVjdCBpb3NhcGljX2ludHJfaW5mbyAqaW5mbyA9ICZpb3NhcGljX2ludHJfaW5mb1t2ZWN0b3JdOwogCQlpZiAoaW5mby0+dHJpZ2dlciAhPSB0cmlnZ2VyIHx8IGluZm8tPnBvbGFyaXR5ICE9IHBvbGFyaXR5KSB7CiAJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGNhbm5vdCBvdmVycmlkZSB0aGUgaW50ZXJydXB0XG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKQEAgLTYyMyw2ICs2MjMsNyBAQAogCQkJICAgICAgIF9fRlVOQ1RJT05fXywgdmVjdG9yLCBpZGVzYy0+aGFuZGxlci0+dHlwZW5hbWUsIGlycV90eXBlLT50eXBlbmFtZSk7CiAJCWlkZXNjLT5oYW5kbGVyID0gaXJxX3R5cGU7CiAJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC03MTAsNyArNzExLDcgQEAKIGlvc2FwaWNfcmVnaXN0ZXJfaW50ciAodW5zaWduZWQgaW50IGdzaSwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgcG9sYXJpdHksIHVuc2lnbmVkIGxvbmcgdHJpZ2dlcikKIHsKLQlpbnQgdmVjdG9yLCBtYXNrID0gMTsKKwlpbnQgdmVjdG9yLCBtYXNrID0gMSwgZXJyOwogCXVuc2lnbmVkIGludCBkZXN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGlvc2FwaWNfcnRlX2luZm8gKnJ0ZTsKQEAgLTczNyw4ICs3MzgsOCBAQAogCXZlY3RvciA9IGFzc2lnbl9pcnFfdmVjdG9yKEFVVE9fQVNTSUdOKTsKIAlpZiAodmVjdG9yIDwgMCkgewogCQl2ZWN0b3IgPSBpb3NhcGljX2ZpbmRfc2hhcmFibGVfdmVjdG9yKHRyaWdnZXIsIHBvbGFyaXR5KTsKLQkJaWYgKHZlY3RvciA8IDApCi0JCQlwYW5pYygiJXM6IG91dCBvZiBpbnRlcnJ1cHQgdmVjdG9ycyFcbiIsIF9fRlVOQ1RJT05fXyk7CisgIAkJaWYgKHZlY3RvciA8IDApCisJCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2Rlc2NwKHZlY3RvciktPmxvY2ssIGZsYWdzKTsKQEAgLTc1Myw4ICs3NTQsMTMgQEAKIAkJfQogCiAJCWRlc3QgPSBnZXRfdGFyZ2V0X2NwdShnc2ksIHZlY3Rvcik7Ci0JCXJlZ2lzdGVyX2ludHIoZ3NpLCB2ZWN0b3IsIElPU0FQSUNfTE9XRVNUX1BSSU9SSVRZLAorCQllcnIgPSByZWdpc3Rlcl9pbnRyKGdzaSwgdmVjdG9yLCBJT1NBUElDX0xPV0VTVF9QUklPUklUWSwKIAkJCSAgICAgIHBvbGFyaXR5LCB0cmlnZ2VyKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXNwaW5fdW5sb2NrKCZpb3NhcGljX2xvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2Rlc2NwKHZlY3RvciktPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiBlcnI7CisJCX0KIAogCQkvKgogCQkgKiBJZiB0aGUgdmVjdG9yIGlzIHNoYXJlZCBhbmQgYWxyZWFkeSB1bm1hc2tlZCBmb3IKQEAgLTc3Niw3ICs3ODIsNiBAQAogCXJldHVybiB2ZWN0b3I7CiB9CiAKLSNpZmRlZiBDT05GSUdfQUNQSV9ERUFMTE9DQVRFX0lSUQogdm9pZAogaW9zYXBpY191bnJlZ2lzdGVyX2ludHIgKHVuc2lnbmVkIGludCBnc2kpCiB7CkBAIC04NTksNyArODY0LDYgQEAKIAlzcGluX3VubG9jaygmaW9zYXBpY19sb2NrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVzYy0+bG9jaywgZmxhZ3MpOwogfQotI2VuZGlmIC8qIENPTkZJR19BQ1BJX0RFQUxMT0NBVEVfSVJRICovCiAKIC8qCiAgKiBBQ1BJIGNhbGxzIHRoaXMgd2hlbiBpdCBmaW5kcyBhbiBlbnRyeSBmb3IgYSBwbGF0Zm9ybSBpbnRlcnJ1cHQuCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lycS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnEuYwppbmRleCAyOGYyYWFkLi4yMDVkOTgwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxLmMKQEAgLTkxLDIzICs5MSw4IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi0vKgotICogVGhpcyBpcyB1cGRhdGVkIHdoZW4gdGhlIHVzZXIgc2V0cyBpcnEgYWZmaW5pdHkgdmlhIC9wcm9jCi0gKi8KLXN0YXRpYyBjcHVtYXNrX3QgX19jYWNoZWxpbmVfYWxpZ25lZCBwZW5kaW5nX2lycV9jcHVtYXNrW05SX0lSUVNdOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVuZGluZ19pcnFfcmVkaXJbQklUU19UT19MT05HUyhOUl9JUlFTKV07Ci0KIHN0YXRpYyBjaGFyIGlycV9yZWRpciBbTlJfSVJRU107IC8vID0geyBbMCAuLi4gTlJfSVJRUy0xXSA9IDEgfTsKIAotLyoKLSAqIEFyY2ggc3BlY2lmaWMgcm91dGluZSBmb3IgZGVmZXJyZWQgd3JpdGUgdG8gaW9zYXBpYyBydGUgdG8gcmVwcm9ncmFtCi0gKiBpbnRyIGRlc3RpbmF0aW9uLgotICovCi12b2lkIHByb2Nfc2V0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFza192YWwpCi17Ci0JcGVuZGluZ19pcnFfY3B1bWFza1tpcnFdID0gbWFza192YWw7Ci19Ci0KIHZvaWQgc2V0X2lycV9hZmZpbml0eV9pbmZvICh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgaHdpZCwgaW50IHJlZGlyKQogewogCWNwdW1hc2tfdCBtYXNrID0gQ1BVX01BU0tfTk9ORTsKQEAgLTExNiwzMiArMTAxLDEwIEBACiAKIAlpZiAoaXJxIDwgTlJfSVJRUykgewogCQlpcnFfYWZmaW5pdHlbaXJxXSA9IG1hc2s7CisJCXNldF9pcnFfaW5mbyhpcnEsIG1hc2spOwogCQlpcnFfcmVkaXJbaXJxXSA9IChjaGFyKSAocmVkaXIgJiAweGZmKTsKIAl9CiB9Ci0KLQotdm9pZCBtb3ZlX2lycShpbnQgaXJxKQotewotCS8qIG5vdGUgLSB3ZSBob2xkIGRlc2MtPmxvY2sgKi8KLQljcHVtYXNrX3QgdG1wOwotCWlycV9kZXNjX3QgKmRlc2MgPSBpcnFfZGVzY3AoaXJxKTsKLQlpbnQgcmVkaXIgPSB0ZXN0X2JpdChpcnEsIHBlbmRpbmdfaXJxX3JlZGlyKTsKLQotCWlmICh1bmxpa2VseSghZGVzYy0+aGFuZGxlci0+c2V0X2FmZmluaXR5KSkKLQkJcmV0dXJuOwotCi0JaWYgKCFjcHVzX2VtcHR5KHBlbmRpbmdfaXJxX2NwdW1hc2tbaXJxXSkpIHsKLQkJY3B1c19hbmQodG1wLCBwZW5kaW5nX2lycV9jcHVtYXNrW2lycV0sIGNwdV9vbmxpbmVfbWFwKTsKLQkJaWYgKHVubGlrZWx5KCFjcHVzX2VtcHR5KHRtcCkpKSB7Ci0JCQlkZXNjLT5oYW5kbGVyLT5zZXRfYWZmaW5pdHkoaXJxIHwgKHJlZGlyID8gSUE2NF9JUlFfUkVESVJFQ1RFRCA6IDApLAotCQkJCQkJICAgIHBlbmRpbmdfaXJxX2NwdW1hc2tbaXJxXSk7Ci0JCX0KLQkJY3B1c19jbGVhcihwZW5kaW5nX2lycV9jcHVtYXNrW2lycV0pOwotCX0KLX0KLQotCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2l2dC5TIGIvYXJjaC9pYTY0L2tlcm5lbC9pdnQuUwppbmRleCAzYmIzYTEzLi5jMTNjYTBkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2l2dC5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaXZ0LlMKQEAgLTQ0LDcgKzQ0LDcgQEAKICNpbmNsdWRlIDxhc20vYnJlYWsuaD4KICNpbmNsdWRlIDxhc20vaWEzMi5oPgogI2luY2x1ZGUgPGFzbS9rcmVncy5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgpAQCAtNjksNyArNjksNiBAQAogIyBkZWZpbmUgREJHX0ZBVUxUKGkpCiAjZW5kaWYKIAotI2RlZmluZSBNSU5TVEFURV9WSVJUCS8qIG5lZWRlZCBieSBtaW5zdGF0ZS5oICovCiAjaW5jbHVkZSAibWluc3RhdGUuaCIKIAogI2RlZmluZSBGQVVMVChuKQkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvanByb2Jlcy5TIGIvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMKaW5kZXggYjdmYTNjYy4uMjMyMzM3NyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMKQEAgLTQ5LDYgKzQ5LDcgQEAKIAkvKgogCSAqIHZvaWQganByb2JlX2JyZWFrKHZvaWQpCiAJICovCisJLnNlY3Rpb24gLmtwcm9iZXMudGV4dCwgImF4IgogRU5UUlkoanByb2JlX2JyZWFrKQogCWJyZWFrLm0gMHg4MDMwMAogRU5EKGpwcm9iZV9icmVhaykKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggODg0ZjVjZC4uNDcxMDg2YiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTg3LDEyICs4NywyNSBAQAogICogaXMgSVAgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gYW5kIHVwZGF0ZSB0aGUga3Byb2JlCiAgKiBpbnN0IGZsYWcgYWNjb3JkaW5nbHkKICAqLwotc3RhdGljIHZvaWQgdXBkYXRlX2twcm9iZV9pbnN0X2ZsYWcodWludCB0ZW1wbGF0ZSwgdWludCAgc2xvdCwgdWludCBtYWpvcl9vcGNvZGUsCi0JdW5zaWduZWQgbG9uZyBrcHJvYmVfaW5zdCwgc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyB1cGRhdGVfa3Byb2JlX2luc3RfZmxhZyh1aW50IHRlbXBsYXRlLCB1aW50ICBzbG90LAorCQkJCQkgICAgICB1aW50IG1ham9yX29wY29kZSwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBrcHJvYmVfaW5zdCwKKwkJCQkJICAgICAgc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlwLT5haW5zbi5pbnN0X2ZsYWcgPSAwOwogCXAtPmFpbnNuLnRhcmdldF9icl9yZWcgPSAwOwogCisJLyogQ2hlY2sgZm9yIEJyZWFrIGluc3RydWN0aW9uCisgCSAqIEJpdHMgMzc6NDAgTWFqb3Igb3Bjb2RlIHRvIGJlIHplcm8KKwkgKiBCaXRzIDI3OjMyIFg2IHRvIGJlIHplcm8KKwkgKiBCaXRzIDMyOjM1IFgzIHRvIGJlIHplcm8KKwkgKi8KKwlpZiAoKCFtYWpvcl9vcGNvZGUpICYmICghKChrcHJvYmVfaW5zdCA+PiAyNykgJiAweDFGRikpICkgeworCQkvKiBpcyBhIGJyZWFrIGluc3RydWN0aW9uICovCisJIAlwLT5haW5zbi5pbnN0X2ZsYWcgfD0gSU5TVF9GTEFHX0JSRUFLX0lOU1Q7CisJCXJldHVybjsKKwl9CisKIAlpZiAoYnVuZGxlX2VuY29kaW5nW3RlbXBsYXRlXVtzbG90XSA9PSBCKSB7CiAJCXN3aXRjaCAobWFqb3Jfb3Bjb2RlKSB7CiAJCSAgY2FzZSBJTkRJUkVDVF9DQUxMX09QQ09ERToKQEAgLTEyNiw4ICsxMzksMTAgQEAKICAqIFJldHVybnMgMCBpZiBzdXBwb3J0ZWQKICAqIFJldHVybnMgLUVJTlZBTCBpZiB1bnN1cHBvcnRlZAogICovCi1zdGF0aWMgaW50IHVuc3VwcG9ydGVkX2luc3QodWludCB0ZW1wbGF0ZSwgdWludCAgc2xvdCwgdWludCBtYWpvcl9vcGNvZGUsCi0JdW5zaWduZWQgbG9uZyBrcHJvYmVfaW5zdCwgc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyBpbnQgX19rcHJvYmVzIHVuc3VwcG9ydGVkX2luc3QodWludCB0ZW1wbGF0ZSwgdWludCAgc2xvdCwKKwkJCQkgICAgICB1aW50IG1ham9yX29wY29kZSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGtwcm9iZV9pbnN0LAorCQkJCSAgICAgIHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcC0+YWRkcjsKIApAQCAtMTY4LDggKzE4Myw5IEBACiAgKiBvbiB3aGljaCB3ZSBhcmUgaW5zZXJ0aW5nIGtwcm9iZSBpcyBjbXAgaW5zdHJ1Y3Rpb24KICAqIHdpdGggY3R5cGUgYXMgdW5jLgogICovCi1zdGF0aWMgdWludCBpc19jbXBfY3R5cGVfdW5jX2luc3QodWludCB0ZW1wbGF0ZSwgdWludCBzbG90LCB1aW50IG1ham9yX29wY29kZSwKLXVuc2lnbmVkIGxvbmcga3Byb2JlX2luc3QpCitzdGF0aWMgdWludCBfX2twcm9iZXMgaXNfY21wX2N0eXBlX3VuY19pbnN0KHVpbnQgdGVtcGxhdGUsIHVpbnQgc2xvdCwKKwkJCQkJICAgIHVpbnQgbWFqb3Jfb3Bjb2RlLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBrcHJvYmVfaW5zdCkKIHsKIAljbXBfaW5zdF90IGNtcF9pbnN0OwogCXVpbnQgY3R5cGVfdW5jID0gMDsKQEAgLTIwMSw4ICsyMTcsMTAgQEAKICAqIEluIHRoaXMgZnVuY3Rpb24gd2Ugb3ZlcnJpZGUgdGhlIGJ1bmRsZSB3aXRoCiAgKiB0aGUgYnJlYWsgaW5zdHJ1Y3Rpb24gYXQgdGhlIGdpdmVuIHNsb3QuCiAgKi8KLXN0YXRpYyB2b2lkIHByZXBhcmVfYnJlYWtfaW5zdCh1aW50IHRlbXBsYXRlLCB1aW50ICBzbG90LCB1aW50IG1ham9yX29wY29kZSwKLQl1bnNpZ25lZCBsb25nIGtwcm9iZV9pbnN0LCBzdHJ1Y3Qga3Byb2JlICpwKQorc3RhdGljIHZvaWQgX19rcHJvYmVzIHByZXBhcmVfYnJlYWtfaW5zdCh1aW50IHRlbXBsYXRlLCB1aW50ICBzbG90LAorCQkJCQkgdWludCBtYWpvcl9vcGNvZGUsCisJCQkJCSB1bnNpZ25lZCBsb25nIGtwcm9iZV9pbnN0LAorCQkJCQkgc3RydWN0IGtwcm9iZSAqcCkKIHsKIAl1bnNpZ25lZCBsb25nIGJyZWFrX2luc3QgPSBCUkVBS19JTlNUOwogCWJ1bmRsZV90ICpidW5kbGUgPSAmcC0+YWluc24uaW5zbi5idW5kbGU7CkBAIC0yNzEsNyArMjg5LDggQEAKIAkJJiYgYWRkciA8ICh1bnNpZ25lZCBsb25nKV9fZW5kX2l2dF90ZXh0KTsKIH0KIAotc3RhdGljIGludCB2YWxpZF9rcHJvYmVfYWRkcihpbnQgdGVtcGxhdGUsIGludCBzbG90LCB1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgaW50IF9fa3Byb2JlcyB2YWxpZF9rcHJvYmVfYWRkcihpbnQgdGVtcGxhdGUsIGludCBzbG90LAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJaWYgKChzbG90ID4gMikgfHwgKChidW5kbGVfZW5jb2RpbmdbdGVtcGxhdGVdWzFdID09IEwpICYmIHNsb3QgPiAxKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJBdHRlbXB0aW5nIHRvIGluc2VydCB1bmFsaWduZWQga3Byb2JlICIKQEAgLTMyMyw3ICszNDIsNyBAQAogICogICAgLSBjbGVhbnVwIGJ5IG1hcmtpbmcgdGhlIGluc3RhbmNlIGFzIHVudXNlZAogICogICAgLSBsb25nIGp1bXAgYmFjayB0byB0aGUgb3JpZ2luYWwgcmV0dXJuIGFkZHJlc3MKICAqLwotaW50IHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpID0gTlVMTDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKQEAgLTM4MSw3ICs0MDAsOCBAQAogICAgICAgICByZXR1cm4gMTsKIH0KIAotdm9pZCBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3ZvaWQgX19rcHJvYmVzIGFyY2hfcHJlcGFyZV9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnAsCisJCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CiAKQEAgLTM5OSw3ICs0MTksNyBAQAogCX0KIH0KIAotaW50IGFyY2hfcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK2ludCBfX2twcm9iZXMgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKSBwLT5hZGRyOwogCXVuc2lnbmVkIGxvbmcgKmtwcm9iZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcgKikoYWRkciAmIH4weEZVTEwpOwpAQCAtNDMwLDcgKzQ1MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyOwogCXVuc2lnbmVkIGxvbmcgYXJtX2FkZHIgPSBhZGRyICYgfjB4RlVMTDsKQEAgLTQzOSw3ICs0NTksNyBAQAogCWZsdXNoX2ljYWNoZV9yYW5nZShhcm1fYWRkciwgYXJtX2FkZHIgKyBzaXplb2YoYnVuZGxlX3QpKTsKIH0KIAotdm9pZCBhcmNoX2Rpc2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3ZvaWQgX19rcHJvYmVzIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHI7CiAJdW5zaWduZWQgbG9uZyBhcm1fYWRkciA9IGFkZHIgJiB+MHhGVUxMOwpAQCAtNDQ5LDcgKzQ2OSw3IEBACiAJZmx1c2hfaWNhY2hlX3JhbmdlKGFybV9hZGRyLCBhcm1fYWRkciArIHNpemVvZihidW5kbGVfdCkpOwogfQogCi12b2lkIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBfX2twcm9iZXMgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiB9CiAKQEAgLTQ2MSw3ICs0ODEsNyBAQAogICogdG8gb3JpZ2luYWwgc3RhY2sgYWRkcmVzcywgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gZml4dXAgdGhlCiAgKiByZWxhdGl2ZSBJUCBhZGRyZXNzIGFuZC9vciBmaXh1cCBicmFuY2ggcmVnaXN0ZXIuCiAgKi8KLXN0YXRpYyB2b2lkIHJlc3VtZV9leGVjdXRpb24oc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgcmVzdW1lX2V4ZWN1dGlvbihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKICAgCXVuc2lnbmVkIGxvbmcgYnVuZGxlX2FkZHIgPSAoKHVuc2lnbmVkIGxvbmcpICgmcC0+b3Bjb2RlLmJ1bmRsZSkpICYgfjB4RlVMTDsKICAgCXVuc2lnbmVkIGxvbmcgcmVzdW1lX2FkZHIgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyICYgfjB4RlVMTDsKQEAgLTUyOCwxMyArNTQ4LDE2IEBACiAgIAlpYTY0X3BzcihyZWdzKS0+c3MgPSAwOwogfQogCi1zdGF0aWMgdm9pZCBwcmVwYXJlX3NzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19rcHJvYmVzIHByZXBhcmVfc3Moc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBidW5kbGVfYWRkciA9ICh1bnNpZ25lZCBsb25nKSAmcC0+b3Bjb2RlLmJ1bmRsZTsKIAl1bnNpZ25lZCBsb25nIHNsb3QgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyICYgMHhmOwogCi0JLyogVXBkYXRlIGluc3RydWN0aW9uIHBvaW50ZXIgKElJUCkgYW5kIHNsb3QgbnVtYmVyIChJUFNSLnJpKSAqLwotCXJlZ3MtPmNyX2lpcCA9IGJ1bmRsZV9hZGRyICYgfjB4RlVMTDsKKwkvKiBzaW5nbGUgc3RlcCBpbmxpbmUgaWYgYnJlYWsgaW5zdHJ1Y3Rpb24gKi8KKwlpZiAocC0+YWluc24uaW5zdF9mbGFnID09IElOU1RfRkxBR19CUkVBS19JTlNUKQorCQlyZWdzLT5jcl9paXAgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyICYgfjB4RlVMTDsKKwllbHNlCisJCXJlZ3MtPmNyX2lpcCA9IGJ1bmRsZV9hZGRyICYgfjB4RlVMTDsKIAogCWlmIChzbG90ID4gMikKIAkJc2xvdCA9IDA7CkBAIC01NDUsNyArNTY4LDM5IEBACiAJaWE2NF9wc3IocmVncyktPnNzID0gMTsKIH0KIAotc3RhdGljIGludCBwcmVfa3Byb2Jlc19oYW5kbGVyKHN0cnVjdCBkaWVfYXJncyAqYXJncykKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGlzX2lhNjRfYnJlYWtfaW5zdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgc2xvdCA9IGlhNjRfcHNyKHJlZ3MpLT5yaTsKKwl1bnNpZ25lZCBpbnQgdGVtcGxhdGUsIG1ham9yX29wY29kZTsKKwl1bnNpZ25lZCBsb25nIGtwcm9iZV9pbnN0OworCXVuc2lnbmVkIGxvbmcgKmtwcm9iZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5jcl9paXA7CisJYnVuZGxlX3QgYnVuZGxlOworCisJbWVtY3B5KCZidW5kbGUsIGtwcm9iZV9hZGRyLCBzaXplb2YoYnVuZGxlX3QpKTsKKwl0ZW1wbGF0ZSA9IGJ1bmRsZS5xdWFkMC50ZW1wbGF0ZTsKKworCS8qIE1vdmUgdG8gc2xvdCAyLCBpZiBidW5kbGUgaXMgTUxYIHR5cGUgYW5kIGtwcm9iZSBzbG90IGlzIDEgKi8KKwlpZiAoc2xvdCA9PSAxICYmIGJ1bmRsZV9lbmNvZGluZ1t0ZW1wbGF0ZV1bMV0gPT0gTCkKKyAgCQlzbG90Kys7CisKKwkvKiBHZXQgS3Byb2JlIHByb2JlIGluc3RydWN0aW9uIGF0IGdpdmVuIHNsb3QqLworCWdldF9rcHJvYmVfaW5zdCgmYnVuZGxlLCBzbG90LCAma3Byb2JlX2luc3QsICZtYWpvcl9vcGNvZGUpOworCisJLyogRm9yIGJyZWFrIGluc3RydWN0aW9uLAorCSAqIEJpdHMgMzc6NDAgTWFqb3Igb3Bjb2RlIHRvIGJlIHplcm8KKwkgKiBCaXRzIDI3OjMyIFg2IHRvIGJlIHplcm8KKwkgKiBCaXRzIDMyOjM1IFgzIHRvIGJlIHplcm8KKwkgKi8KKwlpZiAobWFqb3Jfb3Bjb2RlIHx8ICgoa3Byb2JlX2luc3QgPj4gMjcpICYgMHgxRkYpICkgeworCQkvKiBOb3QgYSBicmVhayBpbnN0cnVjdGlvbiAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBJcyBhIGJyZWFrIGluc3RydWN0aW9uICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19rcHJvYmVzIHByZV9rcHJvYmVzX2hhbmRsZXIoc3RydWN0IGRpZV9hcmdzICphcmdzKQogewogCXN0cnVjdCBrcHJvYmUgKnA7CiAJaW50IHJldCA9IDA7CkBAIC01NTgsNyArNjEzLDkgQEAKIAlpZiAoa3Byb2JlX3J1bm5pbmcoKSkgewogCQlwID0gZ2V0X2twcm9iZShhZGRyKTsKIAkJaWYgKHApIHsKLQkJCWlmIChrcHJvYmVfc3RhdHVzID09IEtQUk9CRV9ISVRfU1MpIHsKKwkJCWlmICggKGtwcm9iZV9zdGF0dXMgPT0gS1BST0JFX0hJVF9TUykgJiYKKwkgCQkgICAgIChwLT5haW5zbi5pbnN0X2ZsYWcgPT0gSU5TVF9GTEFHX0JSRUFLX0lOU1QpKSB7CisgIAkJCQlpYTY0X3BzcihyZWdzKS0+c3MgPSAwOwogCQkJCXVubG9ja19rcHJvYmVzKCk7CiAJCQkJZ290byBub19rcHJvYmU7CiAJCQl9CkBAIC01OTIsNiArNjQ5LDE5IEBACiAJcCA9IGdldF9rcHJvYmUoYWRkcik7CiAJaWYgKCFwKSB7CiAJCXVubG9ja19rcHJvYmVzKCk7CisJCWlmICghaXNfaWE2NF9icmVha19pbnN0KHJlZ3MpKSB7CisJCQkvKgorCQkJICogVGhlIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gd2FzIHJlbW92ZWQgcmlnaHQKKwkJCSAqIGFmdGVyIHdlIGhpdCBpdC4gIEFub3RoZXIgY3B1IGhhcyByZW1vdmVkCisJCQkgKiBlaXRoZXIgYSBwcm9iZXBvaW50IG9yIGEgZGVidWdnZXIgYnJlYWtwb2ludAorCQkJICogYXQgdGhpcyBhZGRyZXNzLiAgSW4gZWl0aGVyIGNhc2UsIG5vIGZ1cnRoZXIKKwkJCSAqIGhhbmRsaW5nIG9mIHRoaXMgaW50ZXJydXB0IGlzIGFwcHJvcHJpYXRlLgorCQkJICovCisJCQlyZXQgPSAxOworCisJCX0KKworCQkvKiBOb3Qgb25lIG9mIG91ciBicmVhaywgbGV0IGtlcm5lbCBoYW5kbGUgaXQgKi8KIAkJZ290byBub19rcHJvYmU7CiAJfQogCkBAIC02MTYsNyArNjg2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHBvc3Rfa3Byb2Jlc19oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBfX2twcm9iZXMgcG9zdF9rcHJvYmVzX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaWYgKCFrcHJvYmVfcnVubmluZygpKQogCQlyZXR1cm4gMDsKQEAgLTY0MSw3ICs3MTEsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGtwcm9iZXNfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHRyYXBucikKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGtwcm9iZXNfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHRyYXBucikKIHsKIAlpZiAoIWtwcm9iZV9ydW5uaW5nKCkpCiAJCXJldHVybiAwOwpAQCAtNjU5LDggKzcyOSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIHZhbCwKLQkJCSAgICAgdm9pZCAqZGF0YSkKK2ludCBfX2twcm9iZXMga3Byb2JlX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGRpZV9hcmdzICphcmdzID0gKHN0cnVjdCBkaWVfYXJncyAqKWRhdGE7CiAJc3dpdGNoKHZhbCkgewpAQCAtNjgxLDcgKzc1MSw3IEBACiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCi1pbnQgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IF9fa3Byb2JlcyBzZXRqbXBfcHJlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGpwcm9iZSAqanAgPSBjb250YWluZXJfb2YocCwgc3RydWN0IGpwcm9iZSwga3ApOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9ICgoc3RydWN0IGZucHRyICopKGpwLT5lbnRyeSkpLT5pcDsKQEAgLTcwMyw3ICs3NzMsNyBAQAogCXJldHVybiAxOwogfQogCi1pbnQgbG9uZ2ptcF9icmVha19oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IF9fa3Byb2JlcyBsb25nam1wX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJKnJlZ3MgPSBqcHJvYmVfc2F2ZWRfcmVnczsKIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCmluZGV4IDRlYmJmMzkuLjZkYzcyNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwpAQCAtNDgsNiArNDgsOSBAQAogICogICAgICAgICAgICBEZWxldGUgZGVhZCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucy4KICAqICAgICAgICAgICAgUmVvcmRlciB0byByZW1vdmUgdGhlIG5lZWQgZm9yIGZvcndhcmQgZGVjbGFyYXRpb25zIGFuZCB0byBjb25zb2xpZGF0ZQogICogICAgICAgICAgICByZWxhdGVkIGNvZGUuCisgKgorICogMjAwNS0wOC0xMiBLZWl0aCBPd2VucyA8a2Fvc0BzZ2kuY29tPgorICoJICAgICAgQ29udmVydCBNQ0EvSU5JVCBoYW5kbGVycyB0byB1c2UgcGVyIGV2ZW50IHN0YWNrcyBhbmQgU0FML09TIHN0YXRlLgogICovCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTc3LDYgKzgwLDggQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogCisjaW5jbHVkZSAiZW50cnkuaCIKKwogI2lmIGRlZmluZWQoSUE2NF9NQ0FfREVCVUdfSU5GTykKICMgZGVmaW5lIElBNjRfTUNBX0RFQlVHKGZtdC4uLikJcHJpbnRrKGZtdCkKICNlbHNlCkBAIC04NCw5ICs4OSw3IEBACiAjZW5kaWYKIAogLyogVXNlZCBieSBtY2FfYXNtLlMgKi8KLWlhNjRfbWNhX3NhbF90b19vc19zdGF0ZV90CWlhNjRfc2FsX3RvX29zX2hhbmRvZmZfc3RhdGU7Ci1pYTY0X21jYV9vc190b19zYWxfc3RhdGVfdAlpYTY0X29zX3RvX3NhbF9oYW5kb2ZmX3N0YXRlOwotdTY0CQkJCWlhNjRfbWNhX3NlcmlhbGl6ZTsKK3UzMgkJCQlpYTY0X21jYV9zZXJpYWxpemU7CiBERUZJTkVfUEVSX0NQVSh1NjQsIGlhNjRfbWNhX2RhdGEpOyAvKiA9PSBfX3Blcl9jcHVfbWNhW3NtcF9wcm9jZXNzb3JfaWQoKV0gKi8KIERFRklORV9QRVJfQ1BVKHU2NCwgaWE2NF9tY2FfcGVyX2NwdV9wdGUpOyAvKiBQVEUgdG8gbWFwIHBlci1DUFUgYXJlYSAqLwogREVGSU5FX1BFUl9DUFUodTY0LCBpYTY0X21jYV9wYWxfcHRlKTsJICAgIC8qIFBURSB0byBtYXAgUEFMIGNvZGUgKi8KQEAgLTk1LDggKzk4LDEwIEBACiB1bnNpZ25lZCBsb25nIF9fcGVyX2NwdV9tY2FbTlJfQ1BVU107CiAKIC8qIEluIG1jYV9hc20uUyAqLwotZXh0ZXJuIHZvaWQJCQlpYTY0X21vbmFyY2hfaW5pdF9oYW5kbGVyICh2b2lkKTsKLWV4dGVybiB2b2lkCQkJaWE2NF9zbGF2ZV9pbml0X2hhbmRsZXIgKHZvaWQpOworZXh0ZXJuIHZvaWQJCQlpYTY0X29zX2luaXRfZGlzcGF0Y2hfbW9uYXJjaCAodm9pZCk7CitleHRlcm4gdm9pZAkJCWlhNjRfb3NfaW5pdF9kaXNwYXRjaF9zbGF2ZSAodm9pZCk7CisKK3N0YXRpYyBpbnQgbW9uYXJjaF9jcHUgPSAtMTsKIAogc3RhdGljIGlhNjRfbWNfaW5mb190CQlpYTY0X21jX2luZm87CiAKQEAgLTIzNCw3ICsyMzksOCBAQAogICogIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIGEgc3BlY2lmaWVkIGVycm9yIHJlY29yZCB0eXBlIGZyb20gU0FMCiAgKiAgYW5kIHdha2VzIHVwIGFueSBwcm9jZXNzZXMgd2FpdGluZyBmb3IgZXJyb3IgcmVjb3Jkcy4KICAqCi0gKiAgSW5wdXRzICA6ICAgc2FsX2luZm9fdHlwZSAgIChUeXBlIG9mIGVycm9yIHJlY29yZCBNQ0EvQ01DL0NQRS9JTklUKQorICogIElucHV0cyAgOiAgIHNhbF9pbmZvX3R5cGUgICAoVHlwZSBvZiBlcnJvciByZWNvcmQgTUNBL0NNQy9DUEUpCisgKiAgICAgICAgICAgICAgRklYTUU6IHJlbW92ZSBNQ0EgYW5kIGlycV9zYWZlLgogICovCiBzdGF0aWMgdm9pZAogaWE2NF9tY2FfbG9nX3NhbF9lcnJvcl9yZWNvcmQoaW50IHNhbF9pbmZvX3R5cGUpCkBAIC0yNDIsNyArMjQ4LDcgQEAKIAl1OCAqYnVmZmVyOwogCXNhbF9sb2dfcmVjb3JkX2hlYWRlcl90ICpyaDsKIAl1NjQgc2l6ZTsKLQlpbnQgaXJxX3NhZmUgPSBzYWxfaW5mb190eXBlICE9IFNBTF9JTkZPX1RZUEVfTUNBICYmIHNhbF9pbmZvX3R5cGUgIT0gU0FMX0lORk9fVFlQRV9JTklUOworCWludCBpcnFfc2FmZSA9IHNhbF9pbmZvX3R5cGUgIT0gU0FMX0lORk9fVFlQRV9NQ0E7CiAjaWZkZWYgSUE2NF9NQ0FfREVCVUdfSU5GTwogCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmVjX25hbWVbXSA9IHsgIk1DQSIsICJJTklUIiwgIkNNQyIsICJDUEUiIH07CiAjZW5kaWYKQEAgLTMzMCwxOTEgKzMzNiw2IEBACiAKICNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwogCi1zdGF0aWMgdm9pZAotc2hvd19taW5fc3RhdGUgKHBhbF9taW5fc3RhdGVfYXJlYV90ICptaW5zdGF0ZSkKLXsKLQl1NjQgaWlwID0gbWluc3RhdGUtPnBtc2FfaWlwICsgKChzdHJ1Y3QgaWE2NF9wc3IgKikoJm1pbnN0YXRlLT5wbXNhX2lwc3IpKS0+cmk7Ci0JdTY0IHhpcCA9IG1pbnN0YXRlLT5wbXNhX3hpcCArICgoc3RydWN0IGlhNjRfcHNyICopKCZtaW5zdGF0ZS0+cG1zYV94cHNyKSktPnJpOwotCi0JcHJpbnRrKCJOYVQgYml0c1x0JTAxNmx4XG4iLCBtaW5zdGF0ZS0+cG1zYV9uYXRfYml0cyk7Ci0JcHJpbnRrKCJwclx0XHQlMDE2bHhcbiIsIG1pbnN0YXRlLT5wbXNhX3ByKTsKLQlwcmludGsoImIwXHRcdCUwMTZseCAiLCBtaW5zdGF0ZS0+cG1zYV9icjApOyBwcmludF9zeW1ib2woIiVzXG4iLCBtaW5zdGF0ZS0+cG1zYV9icjApOwotCXByaW50aygiYXIucnNjXHRcdCUwMTZseFxuIiwgbWluc3RhdGUtPnBtc2FfcnNjKTsKLQlwcmludGsoImNyLmlpcFx0XHQlMDE2bHggIiwgaWlwKTsgcHJpbnRfc3ltYm9sKCIlc1xuIiwgaWlwKTsKLQlwcmludGsoImNyLmlwc3JcdFx0JTAxNmx4XG4iLCBtaW5zdGF0ZS0+cG1zYV9pcHNyKTsKLQlwcmludGsoImNyLmlmc1x0XHQlMDE2bHhcbiIsIG1pbnN0YXRlLT5wbXNhX2lmcyk7Ci0JcHJpbnRrKCJ4aXBcdFx0JTAxNmx4ICIsIHhpcCk7IHByaW50X3N5bWJvbCgiJXNcbiIsIHhpcCk7Ci0JcHJpbnRrKCJ4cHNyXHRcdCUwMTZseFxuIiwgbWluc3RhdGUtPnBtc2FfeHBzcik7Ci0JcHJpbnRrKCJ4ZnNcdFx0JTAxNmx4XG4iLCBtaW5zdGF0ZS0+cG1zYV94ZnMpOwotCXByaW50aygiYjFcdFx0JTAxNmx4ICIsIG1pbnN0YXRlLT5wbXNhX2JyMSk7Ci0JcHJpbnRfc3ltYm9sKCIlc1xuIiwgbWluc3RhdGUtPnBtc2FfYnIxKTsKLQotCXByaW50aygiXG5zdGF0aWMgcmVnaXN0ZXJzIHIwLXIxNTpcbiIpOwotCXByaW50aygiIHIwLSAzICUwMTZseCAlMDE2bHggJTAxNmx4ICUwMTZseFxuIiwKLQkgICAgICAgMFVMLCBtaW5zdGF0ZS0+cG1zYV9nclswXSwgbWluc3RhdGUtPnBtc2FfZ3JbMV0sIG1pbnN0YXRlLT5wbXNhX2dyWzJdKTsKLQlwcmludGsoIiByNC0gNyAlMDE2bHggJTAxNmx4ICUwMTZseCAlMDE2bHhcbiIsCi0JICAgICAgIG1pbnN0YXRlLT5wbXNhX2dyWzNdLCBtaW5zdGF0ZS0+cG1zYV9ncls0XSwKLQkgICAgICAgbWluc3RhdGUtPnBtc2FfZ3JbNV0sIG1pbnN0YXRlLT5wbXNhX2dyWzZdKTsKLQlwcmludGsoIiByOC0xMSAlMDE2bHggJTAxNmx4ICUwMTZseCAlMDE2bHhcbiIsCi0JICAgICAgIG1pbnN0YXRlLT5wbXNhX2dyWzddLCBtaW5zdGF0ZS0+cG1zYV9ncls4XSwKLQkgICAgICAgbWluc3RhdGUtPnBtc2FfZ3JbOV0sIG1pbnN0YXRlLT5wbXNhX2dyWzEwXSk7Ci0JcHJpbnRrKCJyMTItMTUgJTAxNmx4ICUwMTZseCAlMDE2bHggJTAxNmx4XG4iLAotCSAgICAgICBtaW5zdGF0ZS0+cG1zYV9nclsxMV0sIG1pbnN0YXRlLT5wbXNhX2dyWzEyXSwKLQkgICAgICAgbWluc3RhdGUtPnBtc2FfZ3JbMTNdLCBtaW5zdGF0ZS0+cG1zYV9nclsxNF0pOwotCi0JcHJpbnRrKCJcbmJhbmsgMDpcbiIpOwotCXByaW50aygicjE2LTE5ICUwMTZseCAlMDE2bHggJTAxNmx4ICUwMTZseFxuIiwKLQkgICAgICAgbWluc3RhdGUtPnBtc2FfYmFuazBfZ3JbMF0sIG1pbnN0YXRlLT5wbXNhX2JhbmswX2dyWzFdLAotCSAgICAgICBtaW5zdGF0ZS0+cG1zYV9iYW5rMF9nclsyXSwgbWluc3RhdGUtPnBtc2FfYmFuazBfZ3JbM10pOwotCXByaW50aygicjIwLTIzICUwMTZseCAlMDE2bHggJTAxNmx4ICUwMTZseFxuIiwKLQkgICAgICAgbWluc3RhdGUtPnBtc2FfYmFuazBfZ3JbNF0sIG1pbnN0YXRlLT5wbXNhX2JhbmswX2dyWzVdLAotCSAgICAgICBtaW5zdGF0ZS0+cG1zYV9iYW5rMF9ncls2XSwgbWluc3RhdGUtPnBtc2FfYmFuazBfZ3JbN10pOwotCXByaW50aygicjI0LTI3ICUwMTZseCAlMDE2bHggJTAxNmx4ICUwMTZseFxuIiwKLQkgICAgICAgbWluc3RhdGUtPnBtc2FfYmFuazBfZ3JbOF0sIG1pbnN0YXRlLT5wbXNhX2JhbmswX2dyWzldLAotCSAgICAgICBtaW5zdGF0ZS0+cG1zYV9iYW5rMF9nclsxMF0sIG1pbnN0YXRlLT5wbXNhX2JhbmswX2dyWzExXSk7Ci0JcHJpbnRrKCJyMjgtMzEgJTAxNmx4ICUwMTZseCAlMDE2bHggJTAxNmx4XG4iLAotCSAgICAgICBtaW5zdGF0ZS0+cG1zYV9iYW5rMF9nclsxMl0sIG1pbnN0YXRlLT5wbXNhX2JhbmswX2dyWzEzXSwKLQkgICAgICAgbWluc3RhdGUtPnBtc2FfYmFuazBfZ3JbMTRdLCBtaW5zdGF0ZS0+cG1zYV9iYW5rMF9nclsxNV0pOwotCi0JcHJpbnRrKCJcbmJhbmsgMTpcbiIpOwotCXByaW50aygicjE2LTE5ICUwMTZseCAlMDE2bHggJTAxNmx4ICUwMTZseFxuIiwKLQkgICAgICAgbWluc3RhdGUtPnBtc2FfYmFuazFfZ3JbMF0sIG1pbnN0YXRlLT5wbXNhX2JhbmsxX2dyWzFdLAotCSAgICAgICBtaW5zdGF0ZS0+cG1zYV9iYW5rMV9nclsyXSwgbWluc3RhdGUtPnBtc2FfYmFuazFfZ3JbM10pOwotCXByaW50aygicjIwLTIzICUwMTZseCAlMDE2bHggJTAxNmx4ICUwMTZseFxuIiwKLQkgICAgICAgbWluc3RhdGUtPnBtc2FfYmFuazFfZ3JbNF0sIG1pbnN0YXRlLT5wbXNhX2JhbmsxX2dyWzVdLAotCSAgICAgICBtaW5zdGF0ZS0+cG1zYV9iYW5rMV9ncls2XSwgbWluc3RhdGUtPnBtc2FfYmFuazFfZ3JbN10pOwotCXByaW50aygicjI0LTI3ICUwMTZseCAlMDE2bHggJTAxNmx4ICUwMTZseFxuIiwKLQkgICAgICAgbWluc3RhdGUtPnBtc2FfYmFuazFfZ3JbOF0sIG1pbnN0YXRlLT5wbXNhX2JhbmsxX2dyWzldLAotCSAgICAgICBtaW5zdGF0ZS0+cG1zYV9iYW5rMV9nclsxMF0sIG1pbnN0YXRlLT5wbXNhX2JhbmsxX2dyWzExXSk7Ci0JcHJpbnRrKCJyMjgtMzEgJTAxNmx4ICUwMTZseCAlMDE2bHggJTAxNmx4XG4iLAotCSAgICAgICBtaW5zdGF0ZS0+cG1zYV9iYW5rMV9nclsxMl0sIG1pbnN0YXRlLT5wbXNhX2JhbmsxX2dyWzEzXSwKLQkgICAgICAgbWluc3RhdGUtPnBtc2FfYmFuazFfZ3JbMTRdLCBtaW5zdGF0ZS0+cG1zYV9iYW5rMV9nclsxNV0pOwotfQotCi1zdGF0aWMgdm9pZAotZmV0Y2hfbWluX3N0YXRlIChwYWxfbWluX3N0YXRlX2FyZWFfdCAqbXMsIHN0cnVjdCBwdF9yZWdzICpwdCwgc3RydWN0IHN3aXRjaF9zdGFjayAqc3cpCi17Ci0JdTY0ICpkc3RfYmFua2VkLCAqc3JjX2JhbmtlZCwgYml0LCBzaGlmdCwgbmF0X2JpdHM7Ci0JaW50IGk7Ci0KLQkvKgotCSAqIEZpcnN0LCB1cGRhdGUgdGhlIHB0LXJlZ3MgYW5kIHN3aXRjaC1zdGFjayBzdHJ1Y3R1cmVzIHdpdGggdGhlIGNvbnRlbnRzIHN0b3JlZAotCSAqIGluIHRoZSBtaW4tc3RhdGUgYXJlYToKLQkgKi8KLQlpZiAoKChzdHJ1Y3QgaWE2NF9wc3IgKikgJm1zLT5wbXNhX2lwc3IpLT5pYyA9PSAwKSB7Ci0JCXB0LT5jcl9pcHNyID0gbXMtPnBtc2FfeHBzcjsKLQkJcHQtPmNyX2lpcCA9IG1zLT5wbXNhX3hpcDsKLQkJcHQtPmNyX2lmcyA9IG1zLT5wbXNhX3hmczsKLQl9IGVsc2UgewotCQlwdC0+Y3JfaXBzciA9IG1zLT5wbXNhX2lwc3I7Ci0JCXB0LT5jcl9paXAgPSBtcy0+cG1zYV9paXA7Ci0JCXB0LT5jcl9pZnMgPSBtcy0+cG1zYV9pZnM7Ci0JfQotCXB0LT5hcl9yc2MgPSBtcy0+cG1zYV9yc2M7Ci0JcHQtPnByID0gbXMtPnBtc2FfcHI7Ci0JcHQtPnIxID0gbXMtPnBtc2FfZ3JbMF07Ci0JcHQtPnIyID0gbXMtPnBtc2FfZ3JbMV07Ci0JcHQtPnIzID0gbXMtPnBtc2FfZ3JbMl07Ci0Jc3ctPnI0ID0gbXMtPnBtc2FfZ3JbM107Ci0Jc3ctPnI1ID0gbXMtPnBtc2FfZ3JbNF07Ci0Jc3ctPnI2ID0gbXMtPnBtc2FfZ3JbNV07Ci0Jc3ctPnI3ID0gbXMtPnBtc2FfZ3JbNl07Ci0JcHQtPnI4ID0gbXMtPnBtc2FfZ3JbN107Ci0JcHQtPnI5ID0gbXMtPnBtc2FfZ3JbOF07Ci0JcHQtPnIxMCA9IG1zLT5wbXNhX2dyWzldOwotCXB0LT5yMTEgPSBtcy0+cG1zYV9nclsxMF07Ci0JcHQtPnIxMiA9IG1zLT5wbXNhX2dyWzExXTsKLQlwdC0+cjEzID0gbXMtPnBtc2FfZ3JbMTJdOwotCXB0LT5yMTQgPSBtcy0+cG1zYV9nclsxM107Ci0JcHQtPnIxNSA9IG1zLT5wbXNhX2dyWzE0XTsKLQlkc3RfYmFua2VkID0gJnB0LT5yMTY7CQkvKiByMTYtcjMxIGFyZSBjb250aWd1b3VzIGluIHN0cnVjdCBwdF9yZWdzICovCi0Jc3JjX2JhbmtlZCA9IG1zLT5wbXNhX2JhbmsxX2dyOwotCWZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQotCQlkc3RfYmFua2VkW2ldID0gc3JjX2JhbmtlZFtpXTsKLQlwdC0+YjAgPSBtcy0+cG1zYV9icjA7Ci0Jc3ctPmIxID0gbXMtPnBtc2FfYnIxOwotCi0JLyogY29uc3RydWN0IHRoZSBOYVQgYml0cyBmb3IgdGhlIHB0LXJlZ3Mgc3RydWN0dXJlOiAqLwotIwlkZWZpbmUgUFVUX05BVF9CSVQoZHN0LCBhZGRyKQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJYml0ID0gbmF0X2JpdHMgJiAxOyBuYXRfYml0cyA+Pj0gMTsJCQlcCi0JCXNoaWZ0ID0gKCh1bnNpZ25lZCBsb25nKSBhZGRyID4+IDMpICYgMHgzZjsJCVwKLQkJZHN0ID0gKChkc3QpICYgfigxVUwgPDwgc2hpZnQpKSB8IChiaXQgPDwgc2hpZnQpOwlcCi0JfSB3aGlsZSAoMCkKLQotCS8qIFJvdGF0ZSB0aGUgc2F2ZWQgTmFUIGJpdHMgc3VjaCB0aGF0IGJpdCAwIGNvcnJlc3BvbmRzIHRvIHBtc2FfZ3JbMF06ICovCi0Jc2hpZnQgPSAoKHVuc2lnbmVkIGxvbmcpICZtcy0+cG1zYV9nclswXSA+PiAzKSAmIDB4M2Y7Ci0JbmF0X2JpdHMgPSAobXMtPnBtc2FfbmF0X2JpdHMgPj4gc2hpZnQpIHwgKG1zLT5wbXNhX25hdF9iaXRzIDw8ICg2NCAtIHNoaWZ0KSk7Ci0KLQlQVVRfTkFUX0JJVChzdy0+Y2FsbGVyX3VuYXQsICZwdC0+cjEpOwotCVBVVF9OQVRfQklUKHN3LT5jYWxsZXJfdW5hdCwgJnB0LT5yMik7Ci0JUFVUX05BVF9CSVQoc3ctPmNhbGxlcl91bmF0LCAmcHQtPnIzKTsKLQlQVVRfTkFUX0JJVChzdy0+YXJfdW5hdCwgJnN3LT5yNCk7Ci0JUFVUX05BVF9CSVQoc3ctPmFyX3VuYXQsICZzdy0+cjUpOwotCVBVVF9OQVRfQklUKHN3LT5hcl91bmF0LCAmc3ctPnI2KTsKLQlQVVRfTkFUX0JJVChzdy0+YXJfdW5hdCwgJnN3LT5yNyk7Ci0JUFVUX05BVF9CSVQoc3ctPmNhbGxlcl91bmF0LCAmcHQtPnI4KTsJUFVUX05BVF9CSVQoc3ctPmNhbGxlcl91bmF0LCAmcHQtPnI5KTsKLQlQVVRfTkFUX0JJVChzdy0+Y2FsbGVyX3VuYXQsICZwdC0+cjEwKTsJUFVUX05BVF9CSVQoc3ctPmNhbGxlcl91bmF0LCAmcHQtPnIxMSk7Ci0JUFVUX05BVF9CSVQoc3ctPmNhbGxlcl91bmF0LCAmcHQtPnIxMik7CVBVVF9OQVRfQklUKHN3LT5jYWxsZXJfdW5hdCwgJnB0LT5yMTMpOwotCVBVVF9OQVRfQklUKHN3LT5jYWxsZXJfdW5hdCwgJnB0LT5yMTQpOwlQVVRfTkFUX0JJVChzdy0+Y2FsbGVyX3VuYXQsICZwdC0+cjE1KTsKLQluYXRfYml0cyA+Pj0gMTY7CS8qIHNraXAgb3ZlciBiYW5rMCBOYVQgYml0cyAqLwotCVBVVF9OQVRfQklUKHN3LT5jYWxsZXJfdW5hdCwgJnB0LT5yMTYpOwlQVVRfTkFUX0JJVChzdy0+Y2FsbGVyX3VuYXQsICZwdC0+cjE3KTsKLQlQVVRfTkFUX0JJVChzdy0+Y2FsbGVyX3VuYXQsICZwdC0+cjE4KTsJUFVUX05BVF9CSVQoc3ctPmNhbGxlcl91bmF0LCAmcHQtPnIxOSk7Ci0JUFVUX05BVF9CSVQoc3ctPmNhbGxlcl91bmF0LCAmcHQtPnIyMCk7CVBVVF9OQVRfQklUKHN3LT5jYWxsZXJfdW5hdCwgJnB0LT5yMjEpOwotCVBVVF9OQVRfQklUKHN3LT5jYWxsZXJfdW5hdCwgJnB0LT5yMjIpOwlQVVRfTkFUX0JJVChzdy0+Y2FsbGVyX3VuYXQsICZwdC0+cjIzKTsKLQlQVVRfTkFUX0JJVChzdy0+Y2FsbGVyX3VuYXQsICZwdC0+cjI0KTsJUFVUX05BVF9CSVQoc3ctPmNhbGxlcl91bmF0LCAmcHQtPnIyNSk7Ci0JUFVUX05BVF9CSVQoc3ctPmNhbGxlcl91bmF0LCAmcHQtPnIyNik7CVBVVF9OQVRfQklUKHN3LT5jYWxsZXJfdW5hdCwgJnB0LT5yMjcpOwotCVBVVF9OQVRfQklUKHN3LT5jYWxsZXJfdW5hdCwgJnB0LT5yMjgpOwlQVVRfTkFUX0JJVChzdy0+Y2FsbGVyX3VuYXQsICZwdC0+cjI5KTsKLQlQVVRfTkFUX0JJVChzdy0+Y2FsbGVyX3VuYXQsICZwdC0+cjMwKTsJUFVUX05BVF9CSVQoc3ctPmNhbGxlcl91bmF0LCAmcHQtPnIzMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbml0X2hhbmRsZXJfcGxhdGZvcm0gKHBhbF9taW5fc3RhdGVfYXJlYV90ICptcywKLQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpwdCwgc3RydWN0IHN3aXRjaF9zdGFjayAqc3cpCi17Ci0Jc3RydWN0IHVud19mcmFtZV9pbmZvIGluZm87Ci0KLQkvKiBpZiBhIGtlcm5lbCBkZWJ1Z2dlciBpcyBhdmFpbGFibGUgY2FsbCBpdCBoZXJlIGVsc2UganVzdCBkdW1wIHRoZSByZWdpc3RlcnMgKi8KLQotCS8qCi0JICogV2FpdCBmb3IgYSBiaXQuICBPbiBzb21lIG1hY2hpbmVzIChlLmcuLCBIUCdzIHp4MjAwMCBhbmQgeng2MDAwLCBJTklUIGNhbiBiZQotCSAqIGdlbmVyYXRlZCB2aWEgdGhlIEJNQydzIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UsIGJ1dCBzaW5jZSB0aGUgY29uc29sZSBpcyBvbiB0aGUKLQkgKiBzYW1lIHNlcmlhbCBsaW5lLCB0aGUgdXNlciB3aWxsIG5lZWQgc29tZSB0aW1lIHRvIHN3aXRjaCBvdXQgb2YgdGhlIEJNQyBiZWZvcmUKLQkgKiB0aGUgZHVtcCBiZWdpbnMuCi0JICovCi0JcHJpbnRrKCJEZWxheWluZyBmb3IgNSBzZWNvbmRzLi4uXG4iKTsKLQl1ZGVsYXkoNSoxMDAwMDAwKTsKLQlzaG93X21pbl9zdGF0ZShtcyk7Ci0KLQlwcmludGsoIkJhY2t0cmFjZSBvZiBjdXJyZW50IHRhc2sgKHBpZCAlZCwgJXMpXG4iLCBjdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0pOwotCWZldGNoX21pbl9zdGF0ZShtcywgcHQsIHN3KTsKLQl1bndfaW5pdF9mcm9tX2ludGVycnVwdGlvbigmaW5mbywgY3VycmVudCwgcHQsIHN3KTsKLQlpYTY0X2RvX3Nob3dfc3RhY2soJmluZm8sIE5VTEwpOwotCi0jaWZkZWYgQ09ORklHX1NNUAotCS8qIHJlYWRfdHJ5bG9jaygpIHdvdWxkIGJlIGhhbmR5Li4uICovCi0JaWYgKCF0YXNrbGlzdF9sb2NrLndyaXRlX2xvY2spCi0JCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0jZW5kaWYKLQl7Ci0JCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnQ7Ci0JCWRvX2VhY2hfdGhyZWFkIChnLCB0KSB7Ci0JCQlpZiAodCA9PSBjdXJyZW50KQotCQkJCWNvbnRpbnVlOwotCi0JCQlwcmludGsoIlxuQmFja3RyYWNlIG9mIHBpZCAlZCAoJXMpXG4iLCB0LT5waWQsIHQtPmNvbW0pOwotCQkJc2hvd19zdGFjayh0LCBOVUxMKTsKLQkJfSB3aGlsZV9lYWNoX3RocmVhZCAoZywgdCk7Ci0JfQotI2lmZGVmIENPTkZJR19TTVAKLQlpZiAoIXRhc2tsaXN0X2xvY2sud3JpdGVfbG9jaykKLQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotI2VuZGlmCi0KLQlwcmludGsoIlxuSU5JVCBkdW1wIGNvbXBsZXRlLiAgUGxlYXNlIHJlYm9vdCBub3cuXG4iKTsKLQl3aGlsZSAoMSk7CQkJLyogaGFuZyBjaXR5IGlmIG5vIGRlYnVnZ2VyICovCi19Ci0KICNpZmRlZiBDT05GSUdfQUNQSQogLyoKICAqIGlhNjRfbWNhX3JlZ2lzdGVyX2NwZXYKQEAgLTY1Nyw0MiArNDc4LDYgQEAKIH0KIAogLyoKLSAqIGlhNjRfbWNhX3dha2V1cF9pcGlfd2FpdAotICoKLSAqCVdhaXQgZm9yIHRoZSBpbnRlci1jcHUgaW50ZXJydXB0IHRvIGJlIHNlbnQgYnkgdGhlCi0gKgltb25hcmNoIHByb2Nlc3NvciBvbmNlIGl0IGlzIGRvbmUgd2l0aCBoYW5kbGluZyB0aGUKLSAqCU1DQS4KLSAqCi0gKiAgSW5wdXRzICA6ICAgTm9uZQotICogIE91dHB1dHMgOiAgIE5vbmUKLSAqLwotc3RhdGljIHZvaWQKLWlhNjRfbWNhX3dha2V1cF9pcGlfd2FpdCh2b2lkKQotewotCWludAlpcnJfbnVtID0gKElBNjRfTUNBX1dBS0VVUF9WRUNUT1IgPj4gNik7Ci0JaW50CWlycl9iaXQgPSAoSUE2NF9NQ0FfV0FLRVVQX1ZFQ1RPUiAmIDB4M2YpOwotCXU2NAlpcnIgPSAwOwotCi0JZG8gewotCQlzd2l0Y2goaXJyX251bSkgewotCQkgICAgICBjYXNlIDA6Ci0JCQlpcnIgPSBpYTY0X2dldHJlZyhfSUE2NF9SRUdfQ1JfSVJSMCk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAxOgotCQkJaXJyID0gaWE2NF9nZXRyZWcoX0lBNjRfUkVHX0NSX0lSUjEpOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgMjoKLQkJCWlyciA9IGlhNjRfZ2V0cmVnKF9JQTY0X1JFR19DUl9JUlIyKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIDM6Ci0JCQlpcnIgPSBpYTY0X2dldHJlZyhfSUE2NF9SRUdfQ1JfSVJSMyk7Ci0JCQlicmVhazsKLQkJfQotCQljcHVfcmVsYXgoKTsKLQl9IHdoaWxlICghKGlyciAmICgxVUwgPDwgaXJyX2JpdCkpKSA7Ci19Ci0KLS8qCiAgKiBpYTY0X21jYV93YWtldXAKICAqCiAgKglTZW5kIGFuIGludGVyLWNwdSBpbnRlcnJ1cHQgdG8gd2FrZS11cCBhIHBhcnRpY3VsYXIgY3B1CkBAIC03NTcsMTEgKzU0Miw5IEBACiAJICovCiAJaWE2NF9zYWxfbWNfcmVuZGV6KCk7CiAKLQkvKiBXYWl0IGZvciB0aGUgd2FrZXVwIElQSSBmcm9tIHRoZSBtb25hcmNoCi0JICogVGhpcyB3YWl0aW5nIGlzIGRvbmUgYnkgcG9sbGluZyBvbiB0aGUgd2FrZXVwLWludGVycnVwdAotCSAqIHZlY3RvciBiaXQgaW4gdGhlIHByb2Nlc3NvcidzIElSUnMKLQkgKi8KLQlpYTY0X21jYV93YWtldXBfaXBpX3dhaXQoKTsKKwkvKiBXYWl0IGZvciB0aGUgbW9uYXJjaCBjcHUgdG8gZXhpdC4gKi8KKwl3aGlsZSAobW9uYXJjaF9jcHUgIT0gLTEpCisJICAgICAgIGNwdV9yZWxheCgpOwkvKiBzcGluIHVudGlsIG1vbmFyY2ggbGVhdmVzICovCiAKIAkvKiBFbmFibGUgYWxsIGludGVycnVwdHMgKi8KIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CkBAIC03ODksNTMgKzU3MiwxMyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotLyoKLSAqIGlhNjRfcmV0dXJuX3RvX3NhbF9jaGVjawotICoKLSAqCVRoaXMgaXMgZnVuY3Rpb24gY2FsbGVkIGJlZm9yZSBnb2luZyBiYWNrIGZyb20gdGhlIE9TX01DQSBoYW5kbGVyCi0gKgl0byB0aGUgT1NfTUNBIGRpc3BhdGNoIGNvZGUgd2hpY2ggZmluYWxseSB0YWtlcyB0aGUgY29udHJvbCBiYWNrCi0gKgl0byB0aGUgU0FMLgotICoJVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIHJvdXRpbmUgaXMgdG8gc2V0dXAgdGhlIE9TX01DQSB0byBTQUwKLSAqCXJldHVybiBzdGF0ZSB3aGljaCBjYW4gYmUgdXNlZCBieSB0aGUgT1NfTUNBIGRpc3BhdGNoIGNvZGUKLSAqCWp1c3QgYmVmb3JlIGdvaW5nIGJhY2sgdG8gU0FMLgotICoKLSAqICBJbnB1dHMgIDogICBOb25lCi0gKiAgT3V0cHV0cyA6ICAgTm9uZQotICovCi0KLXN0YXRpYyB2b2lkCi1pYTY0X3JldHVybl90b19zYWxfY2hlY2soaW50IHJlY292ZXIpCi17Ci0KLQkvKiBDb3B5IG92ZXIgc29tZSByZWxldmFudCBzdHVmZiBmcm9tIHRoZSBzYWxfdG9fb3NfbWNhX2hhbmRvZmYKLQkgKiBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGF0IHRoZSB0aW1lIG9mIG9zX21jYV90b19zYWxfaGFuZG9mZgotCSAqLwotCWlhNjRfb3NfdG9fc2FsX2hhbmRvZmZfc3RhdGUuaW1vdHNfc2FsX2dwID0KLQkJaWE2NF9zYWxfdG9fb3NfaGFuZG9mZl9zdGF0ZS5pbXN0b19zYWxfZ3A7Ci0KLQlpYTY0X29zX3RvX3NhbF9oYW5kb2ZmX3N0YXRlLmltb3RzX3NhbF9jaGVja19yYSA9Ci0JCWlhNjRfc2FsX3RvX29zX2hhbmRvZmZfc3RhdGUuaW1zdG9fc2FsX2NoZWNrX3JhOwotCi0JaWYgKHJlY292ZXIpCi0JCWlhNjRfb3NfdG9fc2FsX2hhbmRvZmZfc3RhdGUuaW1vdHNfb3Nfc3RhdHVzID0gSUE2NF9NQ0FfQ09SUkVDVEVEOwotCWVsc2UKLQkJaWE2NF9vc190b19zYWxfaGFuZG9mZl9zdGF0ZS5pbW90c19vc19zdGF0dXMgPSBJQTY0X01DQV9DT0xEX0JPT1Q7Ci0KLQkvKiBEZWZhdWx0ID0gdGVsbCBTQUwgdG8gcmV0dXJuIHRvIHNhbWUgY29udGV4dCAqLwotCWlhNjRfb3NfdG9fc2FsX2hhbmRvZmZfc3RhdGUuaW1vdHNfY29udGV4dCA9IElBNjRfTUNBX1NBTUVfQ09OVEVYVDsKLQotCWlhNjRfb3NfdG9fc2FsX2hhbmRvZmZfc3RhdGUuaW1vdHNfbmV3X21pbl9zdGF0ZSA9Ci0JCSh1NjQgKilpYTY0X3NhbF90b19vc19oYW5kb2ZmX3N0YXRlLnBhbF9taW5fc3RhdGU7Ci0KLX0KLQogLyogRnVuY3Rpb24gcG9pbnRlciBmb3IgZXh0cmEgTUNBIHJlY292ZXJ5ICovCiBpbnQgKCppYTY0X21jYV91Y21jX2V4dGVuc2lvbikKLQkodm9pZCosaWE2NF9tY2Ffc2FsX3RvX29zX3N0YXRlX3QqLGlhNjRfbWNhX29zX3RvX3NhbF9zdGF0ZV90KikKKwkodm9pZCosc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlKikKIAk9IE5VTEw7CiAKIGludAotaWE2NF9yZWdfTUNBX2V4dGVuc2lvbih2b2lkICpmbikKK2lhNjRfcmVnX01DQV9leHRlbnNpb24oaW50ICgqZm4pKHZvaWQgKiwgc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlICopKQogewogCWlmIChpYTY0X21jYV91Y21jX2V4dGVuc2lvbikKIAkJcmV0dXJuIDE7CkBAIC04NTQsOCArNTk3LDMyMSBAQAogRVhQT1JUX1NZTUJPTChpYTY0X3JlZ19NQ0FfZXh0ZW5zaW9uKTsKIEVYUE9SVF9TWU1CT0woaWE2NF91bnJlZ19NQ0FfZXh0ZW5zaW9uKTsKIAorCitzdGF0aWMgaW5saW5lIHZvaWQKK2NvcHlfcmVnKGNvbnN0IHU2NCAqZnIsIHU2NCBmbmF0LCB1NjQgKnRyLCB1NjQgKnRuYXQpCit7CisJdTY0IGZzbG90LCB0c2xvdCwgbmF0OworCSp0ciA9ICpmcjsKKwlmc2xvdCA9ICgodW5zaWduZWQgbG9uZylmciA+PiAzKSAmIDYzOworCXRzbG90ID0gKCh1bnNpZ25lZCBsb25nKXRyID4+IDMpICYgNjM7CisJKnRuYXQgJj0gfigxVUwgPDwgdHNsb3QpOworCW5hdCA9IChmbmF0ID4+IGZzbG90KSAmIDE7CisJKnRuYXQgfD0gKG5hdCA8PCB0c2xvdCk7Cit9CisKKy8qIE9uIGVudHJ5IHRvIHRoaXMgcm91dGluZSwgd2UgYXJlIHJ1bm5pbmcgb24gdGhlIHBlciBjcHUgc3RhY2ssIHNlZQorICogbWNhX2FzbS5oLiAgVGhlIG9yaWdpbmFsIHN0YWNrIGhhcyBub3QgYmVlbiB0b3VjaGVkIGJ5IHRoaXMgZXZlbnQuICBTb21lIG9mCisgKiB0aGUgb3JpZ2luYWwgc3RhY2sncyByZWdpc3RlcnMgd2lsbCBiZSBpbiB0aGUgUkJTIG9uIHRoaXMgc3RhY2suICBUaGlzIHN0YWNrCisgKiBhbHNvIGNvbnRhaW5zIGEgcGFydGlhbCBwdF9yZWdzIGFuZCBzd2l0Y2hfc3RhY2ssIHRoZSByZXN0IG9mIHRoZSBkYXRhIGlzIGluCisgKiBQQUwgbWluc3RhdGUuCisgKgorICogVGhlIGZpcnN0IHRoaW5nIHRvIGRvIGlzIG1vZGlmeSB0aGUgb3JpZ2luYWwgc3RhY2sgdG8gbG9vayBsaWtlIGEgYmxvY2tlZAorICogdGFzayBzbyB3ZSBjYW4gcnVuIGJhY2t0cmFjZSBvbiB0aGUgb3JpZ2luYWwgdGFzay4gIEFsc28gbWFyayB0aGUgcGVyIGNwdQorICogc3RhY2sgYXMgY3VycmVudCB0byBlbnN1cmUgdGhhdCB3ZSB1c2UgdGhlIGNvcnJlY3QgdGFzayBzdGF0ZSwgaXQgYWxzbyBtZWFucworICogdGhhdCB3ZSBjYW4gZG8gYmFja3RyYWNlIG9uIHRoZSBNQ0EvSU5JVCBoYW5kbGVyIGNvZGUgaXRzZWxmLgorICovCisKK3N0YXRpYyB0YXNrX3QgKgoraWE2NF9tY2FfbW9kaWZ5X29yaWdpbmFsX3N0YWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQljb25zdCBzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpzdywKKwkJc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlICpzb3MsCisJCWNvbnN0IGNoYXIgKnR5cGUpCit7CisJY2hhciAqcCwgY29tbVtzaXplb2YoY3VycmVudC0+Y29tbSldOworCWlhNjRfdmEgdmE7CisJZXh0ZXJuIGNoYXIgaWE2NF9sZWF2ZV9rZXJuZWxbXTsJLyogTmVlZCBhc20gYWRkcmVzcywgbm90IGZ1bmN0aW9uIGRlc2NyaXB0b3IgKi8KKwljb25zdCBwYWxfbWluX3N0YXRlX2FyZWFfdCAqbXMgPSBzb3MtPnBhbF9taW5fc3RhdGU7CisJdGFza190ICpwcmV2aW91c19jdXJyZW50OworCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVnczsKKwlzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpvbGRfc3c7CisJdW5zaWduZWQgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcHRfcmVncykgKworCQkJc2l6ZW9mKHN0cnVjdCBzd2l0Y2hfc3RhY2spICsgMTY7CisJdTY0ICpvbGRfYnNwc3RvcmUsICpvbGRfYnNwOworCXU2NCAqbmV3X2JzcHN0b3JlLCAqbmV3X2JzcDsKKwl1NjQgb2xkX3VuYXQsIG9sZF9ybmF0LCBuZXdfcm5hdCwgbmF0OworCXU2NCBzbG90cywgbG9hZHJzID0gcmVncy0+bG9hZHJzOworCXU2NCByMTIgPSBtcy0+cG1zYV9nclsxMi0xXSwgcjEzID0gbXMtPnBtc2FfZ3JbMTMtMV07CisJdTY0IGFyX2JzcHN0b3JlID0gcmVncy0+YXJfYnNwc3RvcmU7CisJdTY0IGFyX2JzcCA9IHJlZ3MtPmFyX2JzcHN0b3JlICsgKGxvYWRycyA+PiAxNik7CisJY29uc3QgdTY0ICpiYW5rOworCWNvbnN0IGNoYXIgKm1zZzsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJcHJldmlvdXNfY3VycmVudCA9IGN1cnJfdGFzayhjcHUpOworCXNldF9jdXJyX3Rhc2soY3B1LCBjdXJyZW50KTsKKwlpZiAoKHAgPSBzdHJjaHIoY3VycmVudC0+Y29tbSwgJyAnKSkpCisJCSpwID0gJ1wwJzsKKworCS8qIEJlc3QgZWZmb3J0IGF0dGVtcHQgdG8gY29wZSB3aXRoIE1DQS9JTklUIGRlbGl2ZXJlZCB3aGlsZSBpbgorCSAqIHBoeXNpY2FsIG1vZGUuCisJICovCisJcmVncy0+Y3JfaXBzciA9IG1zLT5wbXNhX2lwc3I7CisJaWYgKGlhNjRfcHNyKHJlZ3MpLT5kdCA9PSAwKSB7CisJCXZhLmwgPSByMTI7CisJCWlmICh2YS5mLnJlZyA9PSAwKSB7CisJCQl2YS5mLnJlZyA9IDc7CisJCQlyMTIgPSB2YS5sOworCQl9CisJCXZhLmwgPSByMTM7CisJCWlmICh2YS5mLnJlZyA9PSAwKSB7CisJCQl2YS5mLnJlZyA9IDc7CisJCQlyMTMgPSB2YS5sOworCQl9CisJfQorCWlmIChpYTY0X3BzcihyZWdzKS0+cnQgPT0gMCkgeworCQl2YS5sID0gYXJfYnNwc3RvcmU7CisJCWlmICh2YS5mLnJlZyA9PSAwKSB7CisJCQl2YS5mLnJlZyA9IDc7CisJCQlhcl9ic3BzdG9yZSA9IHZhLmw7CisJCX0KKwkJdmEubCA9IGFyX2JzcDsKKwkJaWYgKHZhLmYucmVnID09IDApIHsKKwkJCXZhLmYucmVnID0gNzsKKwkJCWFyX2JzcCA9IHZhLmw7CisJCX0KKwl9CisKKwkvKiBtY2FfYXNtLlMgaWE2NF9vbGRfc3RhY2soKSBjYW5ub3QgYXNzdW1lIHRoYXQgdGhlIGRpcnR5IHJlZ2lzdGVycworCSAqIGhhdmUgYmVlbiBjb3BpZWQgdG8gdGhlIG9sZCBzdGFjaywgdGhlIG9sZCBzdGFjayBtYXkgZmFpbCB0aGUKKwkgKiB2YWxpZGF0aW9uIHRlc3RzIGJlbG93LiAgU28gaWE2NF9vbGRfc3RhY2soKSBtdXN0IHJlc3RvcmUgdGhlIGRpcnR5CisJICogcmVnaXN0ZXJzIGZyb20gdGhlIG5ldyBzdGFjay4gIFRoZSBvbGQgYW5kIG5ldyBic3BzdG9yZSBwcm9iYWJseQorCSAqIGhhdmUgZGlmZmVyZW50IGFsaWdubWVudHMsIHNvIGxvYWRycyBjYWxjdWxhdGVkIG9uIHRoZSBvbGQgYnNwCisJICogY2Fubm90IGJlIHVzZWQgdG8gcmVzdG9yZSBmcm9tIHRoZSBuZXcgYnNwLiAgQ2FsY3VsYXRlIGEgc3VpdGFibGUKKwkgKiBsb2FkcnMgZm9yIHRoZSBuZXcgc3RhY2sgYW5kIHNhdmUgaXQgaW4gdGhlIG5ldyBwdF9yZWdzLCB3aGVyZQorCSAqIGlhNjRfb2xkX3N0YWNrKCkgY2FuIGdldCBpdC4KKwkgKi8KKwlvbGRfYnNwc3RvcmUgPSAodTY0ICopYXJfYnNwc3RvcmU7CisJb2xkX2JzcCA9ICh1NjQgKilhcl9ic3A7CisJc2xvdHMgPSBpYTY0X3JzZV9udW1fcmVncyhvbGRfYnNwc3RvcmUsIG9sZF9ic3ApOworCW5ld19ic3BzdG9yZSA9ICh1NjQgKikoKHU2NCljdXJyZW50ICsgSUE2NF9SQlNfT0ZGU0VUKTsKKwluZXdfYnNwID0gaWE2NF9yc2Vfc2tpcF9yZWdzKG5ld19ic3BzdG9yZSwgc2xvdHMpOworCXJlZ3MtPmxvYWRycyA9IChuZXdfYnNwIC0gbmV3X2JzcHN0b3JlKSAqIDggPDwgMTY7CisKKwkvKiBWZXJpZnkgdGhlIHByZXZpb3VzIHN0YWNrIHN0YXRlIGJlZm9yZSB3ZSBjaGFuZ2UgaXQgKi8KKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCW1zZyA9ICJvY2N1cnJlZCBpbiB1c2VyIHNwYWNlIjsKKwkJZ290byBub19tb2Q7CisJfQorCWlmIChyMTMgIT0gc29zLT5wcmV2X0lBNjRfS1JfQ1VSUkVOVCkgeworCQltc2cgPSAiaW5jb25zaXN0ZW50IHByZXZpb3VzIGN1cnJlbnQgYW5kIHIxMyI7CisJCWdvdG8gbm9fbW9kOworCX0KKwlpZiAoKHIxMiAtIHIxMykgPj0gS0VSTkVMX1NUQUNLX1NJWkUpIHsKKwkJbXNnID0gImluY29uc2lzdGVudCByMTIgYW5kIHIxMyI7CisJCWdvdG8gbm9fbW9kOworCX0KKwlpZiAoKGFyX2JzcHN0b3JlIC0gcjEzKSA+PSBLRVJORUxfU1RBQ0tfU0laRSkgeworCQltc2cgPSAiaW5jb25zaXN0ZW50IGFyLmJzcHN0b3JlIGFuZCByMTMiOworCQlnb3RvIG5vX21vZDsKKwl9CisJdmEucCA9IG9sZF9ic3BzdG9yZTsKKwlpZiAodmEuZi5yZWcgPCA1KSB7CisJCW1zZyA9ICJvbGRfYnNwc3RvcmUgaXMgaW4gdGhlIHdyb25nIHJlZ2lvbiI7CisJCWdvdG8gbm9fbW9kOworCX0KKwlpZiAoKGFyX2JzcCAtIHIxMykgPj0gS0VSTkVMX1NUQUNLX1NJWkUpIHsKKwkJbXNnID0gImluY29uc2lzdGVudCBhci5ic3AgYW5kIHIxMyI7CisJCWdvdG8gbm9fbW9kOworCX0KKwlzaXplICs9IChpYTY0X3JzZV9za2lwX3JlZ3Mob2xkX2JzcHN0b3JlLCBzbG90cykgLSBvbGRfYnNwc3RvcmUpICogODsKKwlpZiAoYXJfYnNwc3RvcmUgKyBzaXplID4gcjEyKSB7CisJCW1zZyA9ICJubyByb29tIGZvciBibG9ja2VkIHN0YXRlIjsKKwkJZ290byBub19tb2Q7CisJfQorCisJLyogQ2hhbmdlIHRoZSBjb21tIGZpZWxkIG9uIHRoZSBNQ0EvSU5UIHRhc2sgdG8gaW5jbHVkZSB0aGUgcGlkIHRoYXQKKwkgKiB3YXMgaW50ZXJydXB0ZWQsIGl0IG1ha2VzIGZvciBlYXNpZXIgZGVidWdnaW5nLiAgSWYgdGhhdCBwaWQgd2FzIDAKKwkgKiAoc3dhcHBlciBvciBuZXN0ZWQgTUNBL0lOSVQpIHRoZW4gdXNlIHRoZSBzdGFydCBvZiB0aGUgcHJldmlvdXMgY29tbQorCSAqIGZpZWxkIHN1ZmZpeGVkIHdpdGggaXRzIGNwdS4KKwkgKi8KKwlpZiAocHJldmlvdXNfY3VycmVudC0+cGlkKQorCQlzbnByaW50Zihjb21tLCBzaXplb2YoY29tbSksICIlcyAlZCIsCisJCQljdXJyZW50LT5jb21tLCBwcmV2aW91c19jdXJyZW50LT5waWQpOworCWVsc2UgeworCQlpbnQgbDsKKwkJaWYgKChwID0gc3RyY2hyKHByZXZpb3VzX2N1cnJlbnQtPmNvbW0sICcgJykpKQorCQkJbCA9IHAgLSBwcmV2aW91c19jdXJyZW50LT5jb21tOworCQllbHNlCisJCQlsID0gc3RybGVuKHByZXZpb3VzX2N1cnJlbnQtPmNvbW0pOworCQlzbnByaW50Zihjb21tLCBzaXplb2YoY29tbSksICIlcyAlKnMgJWQiLAorCQkJY3VycmVudC0+Y29tbSwgbCwgcHJldmlvdXNfY3VycmVudC0+Y29tbSwKKwkJCXByZXZpb3VzX2N1cnJlbnQtPnRocmVhZF9pbmZvLT5jcHUpOworCX0KKwltZW1jcHkoY3VycmVudC0+Y29tbSwgY29tbSwgc2l6ZW9mKGN1cnJlbnQtPmNvbW0pKTsKKworCS8qIE1ha2UgdGhlIG9yaWdpbmFsIHRhc2sgbG9vayBibG9ja2VkLiAgRmlyc3Qgc3RhY2sgYSBzdHJ1Y3QgcHRfcmVncywKKwkgKiBkZXNjcmliaW5nIHRoZSBzdGF0ZSBhdCB0aGUgdGltZSBvZiBpbnRlcnJ1cHQuICBtY2FfYXNtLlMgYnVpbHQgYQorCSAqIHBhcnRpYWwgcHRfcmVncywgY29weSBpdCBhbmQgZmlsbCBpbiB0aGUgYmxhbmtzIHVzaW5nIG1pbnN0YXRlLgorCSAqLworCXAgPSAoY2hhciAqKXIxMiAtIHNpemVvZigqcmVncyk7CisJb2xkX3JlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKilwOworCW1lbWNweShvbGRfcmVncywgcmVncywgc2l6ZW9mKCpyZWdzKSk7CisJLyogSWYgaXBzci5pYyB0aGVuIHVzZSBwbXNhX3tpaXAsaXBzcixpZnN9LCBlbHNlIHVzZQorCSAqIHBtc2Ffe3hpcCx4cHNyLHhmc30KKwkgKi8KKwlpZiAoaWE2NF9wc3IocmVncyktPmljKSB7CisJCW9sZF9yZWdzLT5jcl9paXAgPSBtcy0+cG1zYV9paXA7CisJCW9sZF9yZWdzLT5jcl9pcHNyID0gbXMtPnBtc2FfaXBzcjsKKwkJb2xkX3JlZ3MtPmNyX2lmcyA9IG1zLT5wbXNhX2lmczsKKwl9IGVsc2UgeworCQlvbGRfcmVncy0+Y3JfaWlwID0gbXMtPnBtc2FfeGlwOworCQlvbGRfcmVncy0+Y3JfaXBzciA9IG1zLT5wbXNhX3hwc3I7CisJCW9sZF9yZWdzLT5jcl9pZnMgPSBtcy0+cG1zYV94ZnM7CisJfQorCW9sZF9yZWdzLT5wciA9IG1zLT5wbXNhX3ByOworCW9sZF9yZWdzLT5iMCA9IG1zLT5wbXNhX2JyMDsKKwlvbGRfcmVncy0+bG9hZHJzID0gbG9hZHJzOworCW9sZF9yZWdzLT5hcl9yc2MgPSBtcy0+cG1zYV9yc2M7CisJb2xkX3VuYXQgPSBvbGRfcmVncy0+YXJfdW5hdDsKKwljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMS0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjEsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJm1zLT5wbXNhX2dyWzItMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmb2xkX3JlZ3MtPnIyLCAmb2xkX3VuYXQpOworCWNvcHlfcmVnKCZtcy0+cG1zYV9nclszLTFdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMywgJm9sZF91bmF0KTsKKwljb3B5X3JlZygmbXMtPnBtc2FfZ3JbOC0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjgsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJm1zLT5wbXNhX2dyWzktMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmb2xkX3JlZ3MtPnI5LCAmb2xkX3VuYXQpOworCWNvcHlfcmVnKCZtcy0+cG1zYV9nclsxMC0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjEwLCAmb2xkX3VuYXQpOworCWNvcHlfcmVnKCZtcy0+cG1zYV9nclsxMS0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjExLCAmb2xkX3VuYXQpOworCWNvcHlfcmVnKCZtcy0+cG1zYV9nclsxMi0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjEyLCAmb2xkX3VuYXQpOworCWNvcHlfcmVnKCZtcy0+cG1zYV9nclsxMy0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjEzLCAmb2xkX3VuYXQpOworCWNvcHlfcmVnKCZtcy0+cG1zYV9nclsxNC0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjE0LCAmb2xkX3VuYXQpOworCWNvcHlfcmVnKCZtcy0+cG1zYV9nclsxNS0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjE1LCAmb2xkX3VuYXQpOworCWlmIChpYTY0X3BzcihvbGRfcmVncyktPmJuKQorCQliYW5rID0gbXMtPnBtc2FfYmFuazFfZ3I7CisJZWxzZQorCQliYW5rID0gbXMtPnBtc2FfYmFuazBfZ3I7CisJY29weV9yZWcoJmJhbmtbMTYtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMTYsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMTctMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMTcsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMTgtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMTgsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMTktMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMTksICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMjAtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMjAsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMjEtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMjEsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMjItMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMjIsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMjMtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMjMsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMjQtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMjQsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMjUtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMjUsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMjYtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMjYsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMjctMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMjcsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMjgtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMjgsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMjktMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMjksICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMzAtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMzAsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJmJhbmtbMzEtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMzEsICZvbGRfdW5hdCk7CisKKwkvKiBOZXh0IHN0YWNrIGEgc3RydWN0IHN3aXRjaF9zdGFjay4gIG1jYV9hc20uUyBidWlsdCBhIHBhcnRpYWwKKwkgKiBzd2l0Y2hfc3RhY2ssIGNvcHkgaXQgYW5kIGZpbGwgaW4gdGhlIGJsYW5rcyB1c2luZyBwdF9yZWdzIGFuZAorCSAqIG1pbnN0YXRlLgorCSAqCisJICogSW4gdGhlIHN5bnRoZXNpemVkIHN3aXRjaF9zdGFjaywgYjAgcG9pbnRzIHRvIGlhNjRfbGVhdmVfa2VybmVsLAorCSAqIGFyLnBmcyBpcyBzZXQgdG8gMC4KKwkgKgorCSAqIHVud2luZC5jOjp1bndfdW53aW5kKCkgZG9lcyBzcGVjaWFsIHByb2Nlc3NpbmcgZm9yIGludGVycnVwdCBmcmFtZXMuCisJICogSXQgY2hlY2tzIGlmIHRoZSBQUkVEX05PTl9TWVNDQUxMIHByZWRpY2F0ZSBpcyBzZXQsIGlmIHRoZSBwcmVkaWNhdGUKKwkgKiBpcyBjbGVhciB0aGVuIHVud191bndpbmQoKSBkb2VzIF9ub3RfIGFkanVzdCBic3Agb3ZlciBwdF9yZWdzLiAgTm90CisJICogdGhhdCB0aGlzIGlzIGRvY3VtZW50ZWQsIG9mIGNvdXJzZS4gIFNldCBQUkVEX05PTl9TWVNDQUxMIGluIHRoZQorCSAqIHN3aXRjaF9zdGFjayBvbiB0aGUgb3JpZ2luYWwgc3RhY2sgc28gaXQgd2lsbCB1bndpbmQgY29ycmVjdGx5IHdoZW4KKwkgKiB1bndpbmQuYyByZWFkcyBwdF9yZWdzLgorCSAqCisJICogdGhyZWFkLmtzcCBpcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBzeW50aGVzaXplZCBzd2l0Y2hfc3RhY2suCisJICovCisJcCAtPSBzaXplb2Yoc3RydWN0IHN3aXRjaF9zdGFjayk7CisJb2xkX3N3ID0gKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKilwOworCW1lbWNweShvbGRfc3csIHN3LCBzaXplb2YoKnN3KSk7CisJb2xkX3N3LT5jYWxsZXJfdW5hdCA9IG9sZF91bmF0OworCW9sZF9zdy0+YXJfZnBzciA9IG9sZF9yZWdzLT5hcl9mcHNyOworCWNvcHlfcmVnKCZtcy0+cG1zYV9ncls0LTFdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9zdy0+cjQsICZvbGRfdW5hdCk7CisJY29weV9yZWcoJm1zLT5wbXNhX2dyWzUtMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmb2xkX3N3LT5yNSwgJm9sZF91bmF0KTsKKwljb3B5X3JlZygmbXMtPnBtc2FfZ3JbNi0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfc3ctPnI2LCAmb2xkX3VuYXQpOworCWNvcHlfcmVnKCZtcy0+cG1zYV9ncls3LTFdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9zdy0+cjcsICZvbGRfdW5hdCk7CisJb2xkX3N3LT5iMCA9ICh1NjQpaWE2NF9sZWF2ZV9rZXJuZWw7CisJb2xkX3N3LT5iMSA9IG1zLT5wbXNhX2JyMTsKKwlvbGRfc3ctPmFyX3BmcyA9IDA7CisJb2xkX3N3LT5hcl91bmF0ID0gb2xkX3VuYXQ7CisJb2xkX3N3LT5wciA9IG9sZF9yZWdzLT5wciB8ICgxVUwgPDwgUFJFRF9OT05fU1lTQ0FMTCk7CisJcHJldmlvdXNfY3VycmVudC0+dGhyZWFkLmtzcCA9ICh1NjQpcCAtIDE2OworCisJLyogRmluYWxseSBjb3B5IHRoZSBvcmlnaW5hbCBzdGFjaydzIHJlZ2lzdGVycyBiYWNrIHRvIGl0cyBSQlMuCisJICogUmVnaXN0ZXJzIGZyb20gYXIuYnNwc3RvcmUgdGhyb3VnaCBhci5ic3AgYXQgdGhlIHRpbWUgb2YgdGhlIGV2ZW50CisJICogYXJlIGluIHRoZSBjdXJyZW50IFJCUywgY29weSB0aGVtIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHN0YWNrLiAgVGhlCisJICogY29weSBtdXN0IGJlIGRvbmUgcmVnaXN0ZXIgYnkgcmVnaXN0ZXIgYmVjYXVzZSB0aGUgb3JpZ2luYWwgYnNwc3RvcmUKKwkgKiBhbmQgdGhlIGN1cnJlbnQgb25lIGhhdmUgZGlmZmVyZW50IGFsaWdubWVudHMsIHNvIHRoZSBzYXZlZCBSTkFUCisJICogZGF0YSBvY2N1cnMgYXQgZGlmZmVyZW50IHBsYWNlcy4KKwkgKgorCSAqIG1jYV9hc20gZG9lcyBjb3Zlciwgc28gdGhlIG9sZF9ic3AgYWxyZWFkeSBpbmNsdWRlcyBhbGwgcmVnaXN0ZXJzIGF0CisJICogdGhlIHRpbWUgb2YgTUNBL0lOSVQuICBJdCBhbHNvIGRvZXMgZmx1c2hycywgc28gYWxsIHJlZ2lzdGVycyBiZWZvcmUKKwkgKiB0aGlzIGZ1bmN0aW9uIGhhdmUgYmVlbiB3cml0dGVuIHRvIGJhY2tpbmcgc3RvcmUgb24gdGhlIE1DQS9JTklUCisJICogc3RhY2suCisJICovCisJbmV3X3JuYXQgPSBpYTY0X2dldF9ybmF0KGlhNjRfcnNlX3JuYXRfYWRkcihuZXdfYnNwc3RvcmUpKTsKKwlvbGRfcm5hdCA9IHJlZ3MtPmFyX3JuYXQ7CisJd2hpbGUgKHNsb3RzLS0pIHsKKwkJaWYgKGlhNjRfcnNlX2lzX3JuYXRfc2xvdChuZXdfYnNwc3RvcmUpKSB7CisJCQluZXdfcm5hdCA9IGlhNjRfZ2V0X3JuYXQobmV3X2JzcHN0b3JlKyspOworCQl9CisJCWlmIChpYTY0X3JzZV9pc19ybmF0X3Nsb3Qob2xkX2JzcHN0b3JlKSkgeworCQkJKm9sZF9ic3BzdG9yZSsrID0gb2xkX3JuYXQ7CisJCQlvbGRfcm5hdCA9IDA7CisJCX0KKwkJbmF0ID0gKG5ld19ybmF0ID4+IGlhNjRfcnNlX3Nsb3RfbnVtKG5ld19ic3BzdG9yZSkpICYgMVVMOworCQlvbGRfcm5hdCAmPSB+KDFVTCA8PCBpYTY0X3JzZV9zbG90X251bShvbGRfYnNwc3RvcmUpKTsKKwkJb2xkX3JuYXQgfD0gKG5hdCA8PCBpYTY0X3JzZV9zbG90X251bShvbGRfYnNwc3RvcmUpKTsKKwkJKm9sZF9ic3BzdG9yZSsrID0gKm5ld19ic3BzdG9yZSsrOworCX0KKwlvbGRfc3ctPmFyX2JzcHN0b3JlID0gKHVuc2lnbmVkIGxvbmcpb2xkX2JzcHN0b3JlOworCW9sZF9zdy0+YXJfcm5hdCA9IG9sZF9ybmF0OworCisJc29zLT5wcmV2X3Rhc2sgPSBwcmV2aW91c19jdXJyZW50OworCXJldHVybiBwcmV2aW91c19jdXJyZW50OworCitub19tb2Q6CisJcHJpbnRrKEtFUk5fSU5GTyAiY3B1ICVkLCAlcyAlcywgb3JpZ2luYWwgc3RhY2sgbm90IG1vZGlmaWVkXG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCB0eXBlLCBtc2cpOworCXJldHVybiBwcmV2aW91c19jdXJyZW50OworfQorCisvKiBUaGUgbW9uYXJjaC9zbGF2ZSBpbnRlcmFjdGlvbiBpcyBiYXNlZCBvbiBtb25hcmNoX2NwdSBhbmQgcmVxdWlyZXMgdGhhdCBhbGwKKyAqIHNsYXZlcyBoYXZlIGVudGVyZWQgcmVuZGV6dm91cyBiZWZvcmUgdGhlIG1vbmFyY2ggbGVhdmVzLiAgSWYgYW55IGNwdSBoYXMKKyAqIG5vdCBlbnRlcmVkIHJlbmRlenZvdXMgeWV0IHRoZW4gd2FpdCBhIGJpdC4gIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgYW55CisgKiBzbGF2ZSB0aGF0IGhhcyBub3QgcmVuZGV6dm91c2VkIGFmdGVyIGEgcmVhc29uYWJsZSB0aW1lIGlzIG5ldmVyIGdvaW5nIHRvIGRvCisgKiBzby4gIEluIHRoaXMgY29udGV4dCwgc2xhdmUgaW5jbHVkZXMgY3B1cyB0aGF0IHJlc3BvbmQgdG8gdGhlIE1DQSByZW5kZXp2b3VzCisgKiBpbnRlcnJ1cHQsIGFzIHdlbGwgYXMgY3B1cyB0aGF0IHJlY2VpdmUgdGhlIElOSVQgc2xhdmUgZXZlbnQuCisgKi8KKworc3RhdGljIHZvaWQKK2lhNjRfd2FpdF9mb3Jfc2xhdmVzKGludCBtb25hcmNoKQoreworCWludCBjLCB3YWl0ID0gMDsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGMpIHsKKwkJaWYgKGMgPT0gbW9uYXJjaCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaWE2NF9tY19pbmZvLmltaV9yZW5kZXpfY2hlY2tpbltjXSA9PSBJQTY0X01DQV9SRU5ERVpfQ0hFQ0tJTl9OT1RET05FKSB7CisJCQl1ZGVsYXkoMTAwMCk7CQkvKiBzaG9ydCB3YWl0IGZpcnN0ICovCisJCQl3YWl0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghd2FpdCkKKwkJcmV0dXJuOworCWZvcl9lYWNoX29ubGluZV9jcHUoYykgeworCQlpZiAoYyA9PSBtb25hcmNoKQorCQkJY29udGludWU7CisJCWlmIChpYTY0X21jX2luZm8uaW1pX3JlbmRlel9jaGVja2luW2NdID09IElBNjRfTUNBX1JFTkRFWl9DSEVDS0lOX05PVERPTkUpIHsKKwkJCXVkZWxheSg1KjEwMDAwMDApOwkvKiB3YWl0IDUgc2Vjb25kcyBmb3Igc2xhdmVzIChhcmJpdHJhcnkpICovCisJCQlicmVhazsKKwkJfQorCX0KK30KKwogLyoKLSAqIGlhNjRfbWNhX3VjbWNfaGFuZGxlcgorICogaWE2NF9tY2FfaGFuZGxlcgogICoKICAqCVRoaXMgaXMgdW5jb3JyZWN0YWJsZSBtYWNoaW5lIGNoZWNrIGhhbmRsZXIgY2FsbGVkIGZyb20gT1NfTUNBCiAgKglkaXNwYXRjaCBjb2RlIHdoaWNoIGlzIGluIHR1cm4gY2FsbGVkIGZyb20gU0FMX0NIRUNLKCkuCkBAIC04NjYsMTYgKzkyMiwyOCBAQAogICoJZnVydGhlciBNQ0EgbG9nZ2luZyBpcyBlbmFibGVkIGJ5IGNsZWFyaW5nIGxvZ3MuCiAgKglNb25hcmNoIGFsc28gaGFzIHRoZSBkdXR5IG9mIHNlbmRpbmcgd2FrZXVwLUlQSXMgdG8gcHVsbCB0aGUKICAqCXNsYXZlIHByb2Nlc3NvcnMgb3V0IG9mIHJlbmRlenZvdXMgc3Bpbmxvb3AuCi0gKgotICogIElucHV0cyAgOiAgIE5vbmUKLSAqICBPdXRwdXRzIDogICBOb25lCiAgKi8KIHZvaWQKLWlhNjRfbWNhX3VjbWNfaGFuZGxlcih2b2lkKQoraWE2NF9tY2FfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHN3aXRjaF9zdGFjayAqc3csCisJCSBzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUgKnNvcykKIHsKIAlwYWxfcHJvY2Vzc29yX3N0YXRlX2luZm9fdCAqcHNwID0gKHBhbF9wcm9jZXNzb3Jfc3RhdGVfaW5mb190ICopCi0JCSZpYTY0X3NhbF90b19vc19oYW5kb2ZmX3N0YXRlLnByb2Nfc3RhdGVfcGFyYW07Ci0JaW50IHJlY292ZXI7IAorCQkmc29zLT5wcm9jX3N0YXRlX3BhcmFtOworCWludCByZWNvdmVyLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdGFza190ICpwcmV2aW91c19jdXJyZW50OworCisJb29wc19pbl9wcm9ncmVzcyA9IDE7CS8qIEZJWE1FOiBtYWtlIHByaW50ayBOTUkvTUNBL0lOSVQgc2FmZSAqLworCXByZXZpb3VzX2N1cnJlbnQgPSBpYTY0X21jYV9tb2RpZnlfb3JpZ2luYWxfc3RhY2socmVncywgc3csIHNvcywgIk1DQSIpOworCW1vbmFyY2hfY3B1ID0gY3B1OworCWlhNjRfd2FpdF9mb3Jfc2xhdmVzKGNwdSk7CisKKwkvKiBXYWtldXAgYWxsIHRoZSBwcm9jZXNzb3JzIHdoaWNoIGFyZSBzcGlubmluZyBpbiB0aGUgcmVuZGV6dm91cyBsb29wLgorCSAqIFRoZXkgd2lsbCBsZWF2ZSBTQUwsIHRoZW4gc3BpbiBpbiB0aGUgT1Mgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkCisJICogdW50aWwgdGhpcyBtb25hcmNoIGNwdSBsZWF2ZXMgdGhlIE1DQSBoYW5kbGVyLiAgVGhhdCBnZXRzIGNvbnRyb2wKKwkgKiBiYWNrIHRvIHRoZSBPUyBzbyB3ZSBjYW4gYmFja3RyYWNlIHRoZSBvdGhlciBjcHVzLCBiYWNrdHJhY2Ugd2hlbgorCSAqIHNwaW5uaW5nIGluIFNBTCBkb2VzIG5vdCB3b3JrLgorCSAqLworCWlhNjRfbWNhX3dha2V1cF9hbGwoKTsKIAogCS8qIEdldCB0aGUgTUNBIGVycm9yIHJlY29yZCBhbmQgbG9nIGl0ICovCiAJaWE2NF9tY2FfbG9nX3NhbF9lcnJvcl9yZWNvcmQoU0FMX0lORk9fVFlQRV9NQ0EpOwpAQCAtODgzLDI1ICs5NTEsMjAgQEAKIAkvKiBUTEIgZXJyb3IgaXMgb25seSBleGlzdCBpbiB0aGlzIFNBTCBlcnJvciByZWNvcmQgKi8KIAlyZWNvdmVyID0gKHBzcC0+dGMgJiYgIShwc3AtPmNjIHx8IHBzcC0+YmMgfHwgcHNwLT5yYyB8fCBwc3AtPnVjKSkKIAkvKiBvdGhlciBlcnJvciByZWNvdmVyeSAqLwotCSAgIHx8IChpYTY0X21jYV91Y21jX2V4dGVuc2lvbiAKKwkgICB8fCAoaWE2NF9tY2FfdWNtY19leHRlbnNpb24KIAkJJiYgaWE2NF9tY2FfdWNtY19leHRlbnNpb24oCiAJCQlJQTY0X0xPR19DVVJSX0JVRkZFUihTQUxfSU5GT19UWVBFX01DQSksCi0JCQkmaWE2NF9zYWxfdG9fb3NfaGFuZG9mZl9zdGF0ZSwKLQkJCSZpYTY0X29zX3RvX3NhbF9oYW5kb2ZmX3N0YXRlKSk7IAorCQkJc29zKSk7CiAKIAlpZiAocmVjb3ZlcikgewogCQlzYWxfbG9nX3JlY29yZF9oZWFkZXJfdCAqcmggPSBJQTY0X0xPR19DVVJSX0JVRkZFUihTQUxfSU5GT19UWVBFX01DQSk7CiAJCXJoLT5zZXZlcml0eSA9IHNhbF9sb2dfc2V2ZXJpdHlfY29ycmVjdGVkOwogCQlpYTY0X3NhbF9jbGVhcl9zdGF0ZV9pbmZvKFNBTF9JTkZPX1RZUEVfTUNBKTsKKwkJc29zLT5vc19zdGF0dXMgPSBJQTY0X01DQV9DT1JSRUNURUQ7CiAJfQotCS8qCi0JICogIFdha2V1cCBhbGwgdGhlIHByb2Nlc3NvcnMgd2hpY2ggYXJlIHNwaW5uaW5nIGluIHRoZSByZW5kZXp2b3VzCi0JICogIGxvb3AuCi0JICovCi0JaWE2NF9tY2Ffd2FrZXVwX2FsbCgpOwogCi0JLyogUmV0dXJuIHRvIFNBTCAqLwotCWlhNjRfcmV0dXJuX3RvX3NhbF9jaGVjayhyZWNvdmVyKTsKKwlzZXRfY3Vycl90YXNrKGNwdSwgcHJldmlvdXNfY3VycmVudCk7CisJbW9uYXJjaF9jcHUgPSAtMTsKIH0KIAogc3RhdGljIERFQ0xBUkVfV09SSyhjbWNfZGlzYWJsZV93b3JrLCBpYTY0X21jYV9jbWNfdmVjdG9yX2Rpc2FibGVfa2V2ZW50ZCwgTlVMTCk7CkBAIC0xMTI1LDM0ICsxMTg4LDExNCBAQAogLyoKICAqIEMgcG9ydGlvbiBvZiB0aGUgT1MgSU5JVCBoYW5kbGVyCiAgKgotICogQ2FsbGVkIGZyb20gaWE2NF9tb25hcmNoX2luaXRfaGFuZGxlcgorICogQ2FsbGVkIGZyb20gaWE2NF9vc19pbml0X2Rpc3BhdGNoCiAgKgotICogSW5wdXRzOiBwb2ludGVyIHRvIHB0X3JlZ3Mgd2hlcmUgcHJvY2Vzc29yIGluZm8gd2FzIHNhdmVkLgorICogSW5wdXRzOiBwb2ludGVyIHRvIHB0X3JlZ3Mgd2hlcmUgcHJvY2Vzc29yIGluZm8gd2FzIHNhdmVkLiAgU0FML09TIHN0YXRlIGZvcgorICogdGhpcyBldmVudC4gIFRoaXMgY29kZSBpcyB1c2VkIGZvciBib3RoIG1vbmFyY2ggYW5kIHNsYXZlIElOSVQgZXZlbnRzLCBzZWUKKyAqIHNvcy0+bW9uYXJjaC4KICAqCi0gKiBSZXR1cm5zOgotICogICAwIGlmIFNBTCBtdXN0IHdhcm0gYm9vdCB0aGUgU3lzdGVtCi0gKiAgIDEgaWYgU0FMIG11c3QgcmV0dXJuIHRvIGludGVycnVwdGVkIGNvbnRleHQgdXNpbmcgUEFMX01DX1JFU1VNRQotICoKKyAqIEFsbCBJTklUIGV2ZW50cyBzd2l0Y2ggdG8gdGhlIElOSVQgc3RhY2sgYW5kIGNoYW5nZSB0aGUgcHJldmlvdXMgcHJvY2VzcyB0bworICogYmxvY2tlZCBzdGF0dXMuICBJZiBvbmUgb2YgdGhlIElOSVQgZXZlbnRzIGlzIHRoZSBtb25hcmNoIHRoZW4gd2UgYXJlCisgKiBwcm9iYWJseSBwcm9jZXNzaW5nIHRoZSBubWkgYnV0dG9uL2NvbW1hbmQuICBVc2UgdGhlIG1vbmFyY2ggY3B1IHRvIGR1bXAgYWxsCisgKiB0aGUgcHJvY2Vzc2VzLiAgVGhlIHNsYXZlIElOSVQgZXZlbnRzIGFsbCBzcGluIHVudGlsIHRoZSBtb25hcmNoIGNwdQorICogcmV0dXJucy4gIFdlIGNhbiBhbHNvIGdldCBJTklUIHNsYXZlIGV2ZW50cyBmb3IgTUNBLCBpbiB3aGljaCBjYXNlIHRoZSBNQ0EKKyAqIHByb2Nlc3MgaXMgdGhlIG1vbmFyY2guCiAgKi8KLXZvaWQKLWlhNjRfaW5pdF9oYW5kbGVyIChzdHJ1Y3QgcHRfcmVncyAqcHQsIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3KQotewotCXBhbF9taW5fc3RhdGVfYXJlYV90ICptczsKIAotCW9vcHNfaW5fcHJvZ3Jlc3MgPSAxOwkvKiBhdm9pZCBkZWFkbG9jayBpbiBwcmludGssIGJ1dCBpdCBtYWtlcyByZWNvdmVyeSBkb2RneSAqLwordm9pZAoraWE2NF9pbml0X2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3LAorCQkgIHN0cnVjdCBpYTY0X3NhbF9vc19zdGF0ZSAqc29zKQoreworCXN0YXRpYyBhdG9taWNfdCBzbGF2ZXM7CisJc3RhdGljIGF0b21pY190IG1vbmFyY2hzOworCXRhc2tfdCAqcHJldmlvdXNfY3VycmVudDsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpLCBjOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnQ7CisKKwlvb3BzX2luX3Byb2dyZXNzID0gMTsJLyogRklYTUU6IG1ha2UgcHJpbnRrIE5NSS9NQ0EvSU5JVCBzYWZlICovCiAJY29uc29sZV9sb2dsZXZlbCA9IDE1OwkvKiBtYWtlIHN1cmUgcHJpbnRrcyBtYWtlIGl0IHRvIGNvbnNvbGUgKi8KIAotCXByaW50ayhLRVJOX0lORk8gIkVudGVyZWQgT1MgSU5JVCBoYW5kbGVyLiBQU1A9JWx4XG4iLAotCQlpYTY0X3NhbF90b19vc19oYW5kb2ZmX3N0YXRlLnByb2Nfc3RhdGVfcGFyYW0pOworCXByaW50ayhLRVJOX0lORk8gIkVudGVyZWQgT1MgSU5JVCBoYW5kbGVyLiBQU1A9JWx4IGNwdT0lZCBtb25hcmNoPSVsZFxuIiwKKwkJc29zLT5wcm9jX3N0YXRlX3BhcmFtLCBjcHUsIHNvcy0+bW9uYXJjaCk7CisJc2FsaW5mb19sb2dfd2FrZXVwKFNBTF9JTkZPX1RZUEVfSU5JVCwgTlVMTCwgMCwgMCk7CisKKwlwcmV2aW91c19jdXJyZW50ID0gaWE2NF9tY2FfbW9kaWZ5X29yaWdpbmFsX3N0YWNrKHJlZ3MsIHN3LCBzb3MsICJJTklUIik7CisJc29zLT5vc19zdGF0dXMgPSBJQTY0X0lOSVRfUkVTVU1FOworCisJLyogRklYTUU6IFdvcmthcm91bmQgZm9yIGJyb2tlbiBwcm9tcyB0aGF0IGRyaXZlIGFsbCBJTklUIGV2ZW50cyBhcworCSAqIHNsYXZlcy4gIFRoZSBsYXN0IHNsYXZlIHRoYXQgZW50ZXJzIGlzIHByb21vdGVkIHRvIGJlIGEgbW9uYXJjaC4KKwkgKiBSZW1vdmUgdGhpcyBjb2RlIGluIFNlcHRlbWJlciAyMDA2LCB0aGF0IGdpdmVzIHBsYXRmb3JtcyBhIHllYXIgdG8KKwkgKiBmaXggdGhlaXIgcHJvbXMgYW5kIGdldCB0aGVpciBjdXN0b21lcnMgdXBkYXRlZC4KKwkgKi8KKwlpZiAoIXNvcy0+bW9uYXJjaCAmJiBhdG9taWNfYWRkX3JldHVybigxLCAmc2xhdmVzKSA9PSBudW1fb25saW5lX2NwdXMoKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUHJvbW90aW5nIGNwdSAlZCB0byBtb25hcmNoLlxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgY3B1KTsKKwkJYXRvbWljX2RlYygmc2xhdmVzKTsKKwkJc29zLT5tb25hcmNoID0gMTsKKwl9CisKKwkvKiBGSVhNRTogV29ya2Fyb3VuZCBmb3IgYnJva2VuIHByb21zIHRoYXQgZHJpdmUgYWxsIElOSVQgZXZlbnRzIGFzCisJICogbW9uYXJjaHMuICBTZWNvbmQgYW5kIHN1YnNlcXVlbnQgbW9uYXJjaHMgYXJlIGRlbW90ZWQgdG8gc2xhdmVzLgorCSAqIFJlbW92ZSB0aGlzIGNvZGUgaW4gU2VwdGVtYmVyIDIwMDYsIHRoYXQgZ2l2ZXMgcGxhdGZvcm1zIGEgeWVhciB0bworCSAqIGZpeCB0aGVpciBwcm9tcyBhbmQgZ2V0IHRoZWlyIGN1c3RvbWVycyB1cGRhdGVkLgorCSAqLworCWlmIChzb3MtPm1vbmFyY2ggJiYgYXRvbWljX2FkZF9yZXR1cm4oMSwgJm1vbmFyY2hzKSA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IERlbW90aW5nIGNwdSAlZCB0byBzbGF2ZS5cbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBjcHUpOworCQlhdG9taWNfZGVjKCZtb25hcmNocyk7CisJCXNvcy0+bW9uYXJjaCA9IDA7CisJfQorCisJaWYgKCFzb3MtPm1vbmFyY2gpIHsKKwkJaWE2NF9tY19pbmZvLmltaV9yZW5kZXpfY2hlY2tpbltjcHVdID0gSUE2NF9NQ0FfUkVOREVaX0NIRUNLSU5fSU5JVDsKKwkJd2hpbGUgKG1vbmFyY2hfY3B1ID09IC0xKQorCQkgICAgICAgY3B1X3JlbGF4KCk7CS8qIHNwaW4gdW50aWwgbW9uYXJjaCBlbnRlcnMgKi8KKwkJd2hpbGUgKG1vbmFyY2hfY3B1ICE9IC0xKQorCQkgICAgICAgY3B1X3JlbGF4KCk7CS8qIHNwaW4gdW50aWwgbW9uYXJjaCBsZWF2ZXMgKi8KKwkJcHJpbnRrKCJTbGF2ZSBvbiBjcHUgJWQgcmV0dXJuaW5nIHRvIG5vcm1hbCBzZXJ2aWNlLlxuIiwgY3B1KTsKKwkJc2V0X2N1cnJfdGFzayhjcHUsIHByZXZpb3VzX2N1cnJlbnQpOworCQlpYTY0X21jX2luZm8uaW1pX3JlbmRlel9jaGVja2luW2NwdV0gPSBJQTY0X01DQV9SRU5ERVpfQ0hFQ0tJTl9OT1RET05FOworCQlhdG9taWNfZGVjKCZzbGF2ZXMpOworCQlyZXR1cm47CisJfQorCisJbW9uYXJjaF9jcHUgPSBjcHU7CiAKIAkvKgotCSAqIEFkZHJlc3Mgb2YgbWluc3RhdGUgYXJlYSBwcm92aWRlZCBieSBQQUwgaXMgcGh5c2ljYWwsCi0JICogdW5jYWNoZWFibGUgKGJpdCA2MyBzZXQpLiBDb252ZXJ0IHRvIExpbnV4IHZpcnR1YWwKLQkgKiBhZGRyZXNzIGluIHJlZ2lvbiA2LgorCSAqIFdhaXQgZm9yIGEgYml0LiAgT24gc29tZSBtYWNoaW5lcyAoZS5nLiwgSFAncyB6eDIwMDAgYW5kIHp4NjAwMCwgSU5JVCBjYW4gYmUKKwkgKiBnZW5lcmF0ZWQgdmlhIHRoZSBCTUMncyBjb21tYW5kLWxpbmUgaW50ZXJmYWNlLCBidXQgc2luY2UgdGhlIGNvbnNvbGUgaXMgb24gdGhlCisJICogc2FtZSBzZXJpYWwgbGluZSwgdGhlIHVzZXIgd2lsbCBuZWVkIHNvbWUgdGltZSB0byBzd2l0Y2ggb3V0IG9mIHRoZSBCTUMgYmVmb3JlCisJICogdGhlIGR1bXAgYmVnaW5zLgogCSAqLwotCW1zID0gKHBhbF9taW5fc3RhdGVfYXJlYV90ICopKGlhNjRfc2FsX3RvX29zX2hhbmRvZmZfc3RhdGUucGFsX21pbl9zdGF0ZSB8ICg2dWw8PDYxKSk7Ci0KLQlpbml0X2hhbmRsZXJfcGxhdGZvcm0obXMsIHB0LCBzdyk7CS8qIGNhbGwgcGxhdGZvcm0gc3BlY2lmaWMgcm91dGluZXMgKi8KKwlwcmludGsoIkRlbGF5aW5nIGZvciA1IHNlY29uZHMuLi5cbiIpOworCXVkZWxheSg1KjEwMDAwMDApOworCWlhNjRfd2FpdF9mb3Jfc2xhdmVzKGNwdSk7CisJcHJpbnRrKEtFUk5fRVJSICJQcm9jZXNzZXMgaW50ZXJydXB0ZWQgYnkgSU5JVCAtIik7CisJZm9yX2VhY2hfb25saW5lX2NwdShjKSB7CisJCXN0cnVjdCBpYTY0X3NhbF9vc19zdGF0ZSAqczsKKwkJdCA9IF9fdmEoX19wZXJfY3B1X21jYVtjXSArIElBNjRfTUNBX0NQVV9JTklUX1NUQUNLX09GRlNFVCk7CisJCXMgPSAoc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlICopKChjaGFyICopdCArIE1DQV9TT1NfT0ZGU0VUKTsKKwkJZyA9IHMtPnByZXZfdGFzazsKKwkJaWYgKGcpIHsKKwkJCWlmIChnLT5waWQpCisJCQkJcHJpbnRrKCIgJWQiLCBnLT5waWQpOworCQkJZWxzZQorCQkJCXByaW50aygiICVkIChjcHUgJWQgdGFzayAweCVwKSIsIGctPnBpZCwgdGFza19jcHUoZyksIGcpOworCQl9CisJfQorCXByaW50aygiXG5cbiIpOworCWlmIChyZWFkX3RyeWxvY2soJnRhc2tsaXN0X2xvY2spKSB7CisJCWRvX2VhY2hfdGhyZWFkIChnLCB0KSB7CisJCQlwcmludGsoIlxuQmFja3RyYWNlIG9mIHBpZCAlZCAoJXMpXG4iLCB0LT5waWQsIHQtPmNvbW0pOworCQkJc2hvd19zdGFjayh0LCBOVUxMKTsKKwkJfSB3aGlsZV9lYWNoX3RocmVhZCAoZywgdCk7CisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwl9CisJcHJpbnRrKCJcbklOSVQgZHVtcCBjb21wbGV0ZS4gIE1vbmFyY2ggb24gY3B1ICVkIHJldHVybmluZyB0byBub3JtYWwgc2VydmljZS5cbiIsIGNwdSk7CisJYXRvbWljX2RlYygmbW9uYXJjaHMpOworCXNldF9jdXJyX3Rhc2soY3B1LCBwcmV2aW91c19jdXJyZW50KTsKKwltb25hcmNoX2NwdSA9IC0xOworCXJldHVybjsKIH0KIAogc3RhdGljIGludCBfX2luaXQKQEAgLTEyMDIsNiArMTM0NSwzNCBAQAogfTsKICNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwogCisvKiBNaW5pbWFsIGZvcm1hdCBvZiB0aGUgTUNBL0lOSVQgc3RhY2tzLiAgVGhlIHBzZXVkbyBwcm9jZXNzZXMgdGhhdCBydW4gb24KKyAqIHRoZXNlIHN0YWNrcyBjYW4gbmV2ZXIgc2xlZXAsIHRoZXkgY2Fubm90IHJldHVybiBmcm9tIHRoZSBrZXJuZWwgdG8gdXNlcgorICogc3BhY2UsIHRoZXkgZG8gbm90IGFwcGVhciBpbiBhIG5vcm1hbCBwcyBsaXN0aW5nLiAgU28gdGhlcmUgaXMgbm8gbmVlZCB0bworICogZm9ybWF0IG1vc3Qgb2YgdGhlIGZpZWxkcy4KKyAqLworCitzdGF0aWMgdm9pZAorZm9ybWF0X21jYV9pbml0X3N0YWNrKHZvaWQgKm1jYV9kYXRhLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJY29uc3QgY2hhciAqdHlwZSwgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSAoc3RydWN0IHRhc2tfc3RydWN0ICopKChjaGFyICopbWNhX2RhdGEgKyBvZmZzZXQpOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGk7CisJbWVtc2V0KHAsIDAsIEtFUk5FTF9TVEFDS19TSVpFKTsKKwl0aSA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikoKGNoYXIgKilwICsgSUE2NF9UQVNLX1NJWkUpOworCXRpLT5mbGFncyA9IF9USUZfTUNBX0lOSVQ7CisJdGktPnByZWVtcHRfY291bnQgPSAxOworCXRpLT50YXNrID0gcDsKKwl0aS0+Y3B1ID0gY3B1OworCXAtPnRocmVhZF9pbmZvID0gdGk7CisJcC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKKwlfX3NldF9iaXQoY3B1LCAmcC0+Y3B1c19hbGxvd2VkKTsKKwlJTklUX0xJU1RfSEVBRCgmcC0+dGFza3MpOworCXAtPnBhcmVudCA9IHAtPnJlYWxfcGFyZW50ID0gcC0+Z3JvdXBfbGVhZGVyID0gcDsKKwlJTklUX0xJU1RfSEVBRCgmcC0+Y2hpbGRyZW4pOworCUlOSVRfTElTVF9IRUFEKCZwLT5zaWJsaW5nKTsKKwlzdHJuY3B5KHAtPmNvbW0sIHR5cGUsIHNpemVvZihwLT5jb21tKS0xKTsKK30KKwogLyogRG8gcGVyLUNQVSBNQ0EtcmVsYXRlZCBpbml0aWFsaXphdGlvbi4gICovCiAKIHZvaWQgX19kZXZpbml0CkBAIC0xMjE0LDE5ICsxMzg1LDI4IEBACiAJCWludCBjcHU7CiAKIAkJbWNhX2RhdGEgPSBhbGxvY19ib290bWVtKHNpemVvZihzdHJ1Y3QgaWE2NF9tY2FfY3B1KQotCQkJCQkgKiBOUl9DUFVTKTsKKwkJCQkJICogTlJfQ1BVUyArIEtFUk5FTF9TVEFDS19TSVpFKTsKKwkJbWNhX2RhdGEgPSAodm9pZCAqKSgoKHVuc2lnbmVkIGxvbmcpbWNhX2RhdGEgKworCQkJCQlLRVJORUxfU1RBQ0tfU0laRSAtIDEpICYKKwkJCQkoLUtFUk5FTF9TVEFDS19TSVpFKSk7CiAJCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKKwkJCWZvcm1hdF9tY2FfaW5pdF9zdGFjayhtY2FfZGF0YSwKKwkJCQkJb2Zmc2V0b2Yoc3RydWN0IGlhNjRfbWNhX2NwdSwgbWNhX3N0YWNrKSwKKwkJCQkJIk1DQSIsIGNwdSk7CisJCQlmb3JtYXRfbWNhX2luaXRfc3RhY2sobWNhX2RhdGEsCisJCQkJCW9mZnNldG9mKHN0cnVjdCBpYTY0X21jYV9jcHUsIGluaXRfc3RhY2spLAorCQkJCQkiSU5JVCIsIGNwdSk7CiAJCQlfX3Blcl9jcHVfbWNhW2NwdV0gPSBfX3BhKG1jYV9kYXRhKTsKIAkJCW1jYV9kYXRhICs9IHNpemVvZihzdHJ1Y3QgaWE2NF9tY2FfY3B1KTsKIAkJfQogCX0KIAotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgTUNBIGluZm8gc3RydWN0dXJlIHdhcyBhbGxvY2F0ZWQgZWFybGllciBhbmQgaXRzCi0gICAgICAgICAqIHBoeXNpY2FsIGFkZHJlc3Mgc2F2ZWQgaW4gX19wZXJfY3B1X21jYVtjcHVdLiAgQ29weSB0aGF0Ci0gICAgICAgICAqIGFkZHJlc3MgKiB0byBpYTY0X21jYV9kYXRhIHNvIHdlIGNhbiBhY2Nlc3MgaXQgYXMgYSBwZXItQ1BVCi0gICAgICAgICAqIHZhcmlhYmxlLgotICAgICAgICAgKi8KKwkvKgorCSAqIFRoZSBNQ0EgaW5mbyBzdHJ1Y3R1cmUgd2FzIGFsbG9jYXRlZCBlYXJsaWVyIGFuZCBpdHMKKwkgKiBwaHlzaWNhbCBhZGRyZXNzIHNhdmVkIGluIF9fcGVyX2NwdV9tY2FbY3B1XS4gIENvcHkgdGhhdAorCSAqIGFkZHJlc3MgKiB0byBpYTY0X21jYV9kYXRhIHNvIHdlIGNhbiBhY2Nlc3MgaXQgYXMgYSBwZXItQ1BVCisJICogdmFyaWFibGUuCisJICovCiAJX19nZXRfY3B1X3ZhcihpYTY0X21jYV9kYXRhKSA9IF9fcGVyX2NwdV9tY2Fbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKIAogCS8qCkBAIC0xMjM2LDExICsxNDE2LDExIEBACiAJX19nZXRfY3B1X3ZhcihpYTY0X21jYV9wZXJfY3B1X3B0ZSkgPQogCQlwdGVfdmFsKG1rX3B0ZV9waHlzKF9fcGEoY3B1X2RhdGEpLCBQQUdFX0tFUk5FTCkpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFsc28sIHN0YXNoIGF3YXkgYSBjb3B5IG9mIHRoZSBQQUwgYWRkcmVzcyBhbmQgdGhlIFBURQotICAgICAgICAgKiBuZWVkZWQgdG8gbWFwIGl0LgotICAgICAgICAgKi8KLSAgICAgICAgcGFsX3ZhZGRyID0gZWZpX2dldF9wYWxfYWRkcigpOworCS8qCisJICogQWxzbywgc3Rhc2ggYXdheSBhIGNvcHkgb2YgdGhlIFBBTCBhZGRyZXNzIGFuZCB0aGUgUFRFCisJICogbmVlZGVkIHRvIG1hcCBpdC4KKwkgKi8KKwlwYWxfdmFkZHIgPSBlZmlfZ2V0X3BhbF9hZGRyKCk7CiAJaWYgKCFwYWxfdmFkZHIpCiAJCXJldHVybjsKIAlfX2dldF9jcHVfdmFyKGlhNjRfbWNhX3BhbF9iYXNlKSA9CkBAIC0xMjcyLDggKzE0NTIsOCBAQAogdm9pZCBfX2luaXQKIGlhNjRfbWNhX2luaXQodm9pZCkKIHsKLQlpYTY0X2ZwdHJfdCAqbW9uX2luaXRfcHRyID0gKGlhNjRfZnB0cl90ICopaWE2NF9tb25hcmNoX2luaXRfaGFuZGxlcjsKLQlpYTY0X2ZwdHJfdCAqc2xhdmVfaW5pdF9wdHIgPSAoaWE2NF9mcHRyX3QgKilpYTY0X3NsYXZlX2luaXRfaGFuZGxlcjsKKwlpYTY0X2ZwdHJfdCAqaW5pdF9obGRscl9wdHJfbW9uYXJjaCA9IChpYTY0X2ZwdHJfdCAqKWlhNjRfb3NfaW5pdF9kaXNwYXRjaF9tb25hcmNoOworCWlhNjRfZnB0cl90ICppbml0X2hsZGxyX3B0cl9zbGF2ZSA9IChpYTY0X2ZwdHJfdCAqKWlhNjRfb3NfaW5pdF9kaXNwYXRjaF9zbGF2ZTsKIAlpYTY0X2ZwdHJfdCAqbWNhX2hsZGxyX3B0ciA9IChpYTY0X2ZwdHJfdCAqKWlhNjRfb3NfbWNhX2Rpc3BhdGNoOwogCWludCBpOwogCXM2NCByYzsKQEAgLTEzNTEsOSArMTUzMSw5IEBACiAJICogWFhYIC0gZGlzYWJsZSBTQUwgY2hlY2tzdW0gYnkgc2V0dGluZyBzaXplIHRvIDAsIHNob3VsZCBiZQogCSAqIHNpemUgb2YgdGhlIGFjdHVhbCBpbml0IGhhbmRsZXIgaW4gbWNhX2FzbS5TLgogCSAqLwotCWlhNjRfbWNfaW5mby5pbWlfbW9uYXJjaF9pbml0X2hhbmRsZXIJCT0gaWE2NF90cGEobW9uX2luaXRfcHRyLT5mcCk7CisJaWE2NF9tY19pbmZvLmltaV9tb25hcmNoX2luaXRfaGFuZGxlcgkJPSBpYTY0X3RwYShpbml0X2hsZGxyX3B0cl9tb25hcmNoLT5mcCk7CiAJaWE2NF9tY19pbmZvLmltaV9tb25hcmNoX2luaXRfaGFuZGxlcl9zaXplCT0gMDsKLQlpYTY0X21jX2luZm8uaW1pX3NsYXZlX2luaXRfaGFuZGxlcgkJPSBpYTY0X3RwYShzbGF2ZV9pbml0X3B0ci0+ZnApOworCWlhNjRfbWNfaW5mby5pbWlfc2xhdmVfaW5pdF9oYW5kbGVyCQk9IGlhNjRfdHBhKGluaXRfaGxkbHJfcHRyX3NsYXZlLT5mcCk7CiAJaWE2NF9tY19pbmZvLmltaV9zbGF2ZV9pbml0X2hhbmRsZXJfc2l6ZQk9IDA7CiAKIAlJQTY0X01DQV9ERUJVRygiJXM6IE9TIElOSVQgaGFuZGxlciBhdCAlbHhcbiIsIF9fRlVOQ1RJT05fXywKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2FzbS5TIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2FfYXNtLlMKaW5kZXggZWYzZmQ3Mi4uNDk5YTA2NSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9tY2FfYXNtLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2FfYXNtLlMKQEAgLTE2LDYgKzE2LDkgQEAKIC8vIDA0LzExLzEyIFJ1c3MgQW5kZXJzb24gPHJqYUBzZ2kuY29tPgogLy8JCSAgIEFkZGVkIHBlciBjcHUgTUNBL0lOSVQgc3RhY2sgc2F2ZSBhcmVhcy4KIC8vCisvLyAxMi8wOC8wNSBLZWl0aCBPd2VucyA8a2Fvc0BzZ2kuY29tPgorLy8JCSAgIFVzZSBwZXIgY3B1IE1DQS9JTklUIHN0YWNrcyBmb3IgYWxsIGRhdGEuCisvLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KIApAQCAtMjUsOTYgKzI4LDIzIEBACiAjaW5jbHVkZSA8YXNtL21jYV9hc20uaD4KICNpbmNsdWRlIDxhc20vbWNhLmg+CiAKLS8qCi0gKiBXaGVuIHdlIGdldCBhIG1hY2hpbmUgY2hlY2ssIHRoZSBrZXJuZWwgc3RhY2sgcG9pbnRlciBpcyBubyBsb25nZXIKLSAqIHZhbGlkLCBzbyB3ZSBuZWVkIHRvIHNldCBhIG5ldyBzdGFjayBwb2ludGVyLgotICovCi0jZGVmaW5lCU1JTlNUQVRFX1BIWVMJLyogTWFrZSBzdXJlIHN0YWNrIGFjY2VzcyBpcyBwaHlzaWNhbCBmb3IgTUlOU1RBVEUgKi8KLQotLyoKLSAqIE5lZWRlZCBmb3IgcmV0dXJuIGNvbnRleHQgdG8gU0FMCi0gKi8KLSNkZWZpbmUgSUE2NF9NQ0FfU0FNRV9DT05URVhUCTAKLSNkZWZpbmUgSUE2NF9NQ0FfQ09MRF9CT09UCS0yCi0KLSNpbmNsdWRlICJtaW5zdGF0ZS5oIgotCi0vKgotICogU0FMX1RPX09TX01DQV9IQU5ET0ZGX1NUQVRFIChTQUwgMy4wIHNwZWMpCi0gKgkJMS4gR1IxID0gT1MgR1AKLSAqCQkyLiBHUjggPSBQQUxfUFJPQyBwaHlzaWNhbCBhZGRyZXNzCi0gKgkJMy4gR1I5ID0gU0FMX1BST0MgcGh5c2ljYWwgYWRkcmVzcwotICoJCTQuIEdSMTAgPSBTQUwgR1AgKHBoeXNpY2FsKQotICoJCTUuIEdSMTEgPSBSZW5kZXogc3RhdGUKLSAqCQk2LiBHUjEyID0gUmV0dXJuIGFkZHJlc3MgdG8gbG9jYXRpb24gd2l0aGluIFNBTF9DSEVDSwotICovCi0jZGVmaW5lIFNBTF9UT19PU19NQ0FfSEFORE9GRl9TVEFURV9TQVZFKF90bXApCQlcCi0JTE9BRF9QSFlTSUNBTChwMCwgX3RtcCwgaWE2NF9zYWxfdG9fb3NfaGFuZG9mZl9zdGF0ZSk7OyBcCi0Jc3Q4CVtfdG1wXT1yMSwweDA4OzsJCQlcCi0Jc3Q4CVtfdG1wXT1yOCwweDA4OzsJCQlcCi0Jc3Q4CVtfdG1wXT1yOSwweDA4OzsJCQlcCi0Jc3Q4CVtfdG1wXT1yMTAsMHgwODs7CQkJXAotCXN0OAlbX3RtcF09cjExLDB4MDg7OwkJCVwKLQlzdDgJW190bXBdPXIxMiwweDA4OzsJCQlcCi0Jc3Q4CVtfdG1wXT1yMTcsMHgwODs7CQkJXAotCXN0OAlbX3RtcF09cjE4LDB4MDgKLQotLyoKLSAqIE9TX01DQV9UT19TQUxfSEFORE9GRl9TVEFURSAoU0FMIDMuMCBzcGVjKQotICogKHA2KSBpcyBleGVjdXRlZCBpZiB3ZSBuZXZlciBlbnRlcmVkIHZpcnR1YWwgbW9kZSAoVExCIGVycm9yKQotICogKHA3KSBpcyBleGVjdXRlZCBpZiB3ZSBlbnRlcmVkIHZpcnR1YWwgbW9kZSBhcyBleHBlY3RlZCAobm9ybWFsIGNhc2UpCi0gKgkxLiBHUjggPSBPU19NQ0EgcmV0dXJuIHN0YXR1cwotICoJMi4gR1I5ID0gU0FMIEdQIChwaHlzaWNhbCkKLSAqCTMuIEdSMTAgPSAwLzEgcmV0dXJuaW5nIHNhbWUvbmV3IGNvbnRleHQKLSAqCTQuIEdSMjIgPSBOZXcgbWluIHN0YXRlIHNhdmUgYXJlYSBwb2ludGVyCi0gKglyZXR1cm5zIHB0ciB0byBTQUwgcnRuIHNhdmUgbG9jIGluIF90bXAKLSAqLwotI2RlZmluZSBPU19NQ0FfVE9fU0FMX0hBTkRPRkZfU1RBVEVfUkVTVE9SRShfdG1wKQlcCi0JbW92bAlfdG1wPWlhNjRfb3NfdG9fc2FsX2hhbmRvZmZfc3RhdGU7OwlcCi0JREFUQV9WQV9UT19QQShfdG1wKTs7CQkJCVwKLQlsZDgJcjg9W190bXBdLDB4MDg7OwkJCVwKLQlsZDgJcjk9W190bXBdLDB4MDg7OwkJCVwKLQlsZDgJcjEwPVtfdG1wXSwweDA4OzsJCQlcCi0JbGQ4CXIyMj1bX3RtcF0sMHgwODs7Ci0JLy8gbm93IF90bXAgaXMgcG9pbnRpbmcgdG8gU0FMIHJ0biBzYXZlIGxvY2F0aW9uCi0KLS8qCi0gKiBDT0xEX0JPT1RfSEFORE9GRl9TVEFURSgpIHNldHMgaWE2NF9tY2Ffb3NfdG9fc2FsX3N0YXRlCi0gKglpbW90c19vc19zdGF0dXM9SUE2NF9NQ0FfQ09MRF9CT09UCi0gKglpbW90c19zYWxfZ3A9U0FMIEdQCi0gKglpbW90c19jb250ZXh0PUlBNjRfTUNBX1NBTUVfQ09OVEVYVAotICoJaW1vdHNfbmV3X21pbl9zdGF0ZT1NaW4gc3RhdGUgc2F2ZSBhcmVhIHBvaW50ZXIKLSAqCWltb3RzX3NhbF9jaGVja19yYT1SZXR1cm4gYWRkcmVzcyB0byBsb2NhdGlvbiB3aXRoaW4gU0FMX0NIRUNLCi0gKgotICovCi0jZGVmaW5lIENPTERfQk9PVF9IQU5ET0ZGX1NUQVRFKHNhbF90b19vc19oYW5kb2ZmLG9zX3RvX3NhbF9oYW5kb2ZmLHRtcClcCi0JbW92bAl0bXA9SUE2NF9NQ0FfQ09MRF9CT09UOwkJCQkJXAotCW1vdmwJc2FsX3RvX29zX2hhbmRvZmY9X19wYShpYTY0X3NhbF90b19vc19oYW5kb2ZmX3N0YXRlKTsJXAotCW1vdmwJb3NfdG9fc2FsX2hhbmRvZmY9X19wYShpYTY0X29zX3RvX3NhbF9oYW5kb2ZmX3N0YXRlKTs7CVwKLQlzdDgJW29zX3RvX3NhbF9oYW5kb2ZmXT10bXAsODs7CQkJCVwKLQlsZDgJdG1wPVtzYWxfdG9fb3NfaGFuZG9mZl0sNDg7OwkJCQlcCi0Jc3Q4CVtvc190b19zYWxfaGFuZG9mZl09dG1wLDg7OwkJCQlcCi0JbW92bAl0bXA9SUE2NF9NQ0FfU0FNRV9DT05URVhUOzsJCQkJXAotCXN0OAlbb3NfdG9fc2FsX2hhbmRvZmZdPXRtcCw4OzsJCQkJXAotCWxkOAl0bXA9W3NhbF90b19vc19oYW5kb2ZmXSwtODs7CQkJCVwKLQlzdDggICAgIFtvc190b19zYWxfaGFuZG9mZl09dG1wLDg7OwkJCQlcCi0JbGQ4CXRtcD1bc2FsX3RvX29zX2hhbmRvZmZdOzsJCQkJXAotCXN0OCAgICAgW29zX3RvX3NhbF9oYW5kb2ZmXT10bXA7OworI2luY2x1ZGUgImVudHJ5LmgiCiAKICNkZWZpbmUgR0VUX0lBNjRfTUNBX0RBVEEocmVnKQkJCQkJCVwKIAlHRVRfVEhJU19QQUREUihyZWcsIGlhNjRfbWNhX2RhdGEpCQkJCVwKIAk7OwkJCQkJCQkJXAogCWxkOCByZWc9W3JlZ10KIAotCS5nbG9iYWwgaWE2NF9vc19tY2FfZGlzcGF0Y2gKLQkuZ2xvYmFsIGlhNjRfb3NfbWNhX2Rpc3BhdGNoX2VuZAotCS5nbG9iYWwgaWE2NF9zYWxfdG9fb3NfaGFuZG9mZl9zdGF0ZQotCS5nbG9iYWwJaWE2NF9vc190b19zYWxfaGFuZG9mZl9zdGF0ZQogCS5nbG9iYWwgaWE2NF9kb190bGJfcHVyZ2UKKwkuZ2xvYmFsIGlhNjRfb3NfbWNhX2Rpc3BhdGNoCisJLmdsb2JhbCBpYTY0X29zX2luaXRfZGlzcGF0Y2hfbW9uYXJjaAorCS5nbG9iYWwgaWE2NF9vc19pbml0X2Rpc3BhdGNoX3NsYXZlCiAKIAkudGV4dAogCS5hbGlnbiAxNgogCisvL1N0YXJ0TWFpbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKIC8qCiAgKiBKdXN0IHRoZSBUTEIgcHVyZ2UgcGFydCBpcyBtb3ZlZCB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uCiAgKiBzbyB3ZSBjYW4gcmUtdXNlIHRoZSBjb2RlIGZvciBjcHUgaG90cGx1ZyBjb2RlIGFzIHdlbGwKQEAgLTIwNywzNCArMTM3LDMxIEBACiAJYnIuc3B0ay5tYW55IGIxCiAJOzsKIAotaWE2NF9vc19tY2FfZGlzcGF0Y2g6CisvL0VuZE1haW4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKKy8vU3RhcnRNYWluLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaWE2NF9vc19tY2FfZGlzcGF0Y2g6CiAJLy8gU2VyaWFsaXplIGFsbCBNQ0EgcHJvY2Vzc2luZwogCW1vdglyMz0xOzsKIAlMT0FEX1BIWVNJQ0FMKHAwLHIyLGlhNjRfbWNhX3NlcmlhbGl6ZSk7OwogaWE2NF9vc19tY2Ffc3BpbjoKLQl4Y2hnOAlyND1bcjJdLHIzOzsKKwl4Y2hnNAlyND1bcjJdLHIzOzsKIAljbXAubmUJcDYscDA9cjQscjAKIChwNikJYnIgaWE2NF9vc19tY2Ffc3BpbgogCi0JLy8gU2F2ZSB0aGUgU0FMIHRvIE9TIE1DQSBoYW5kb2ZmIHN0YXRlIGFzIGRlZmluZWQKLQkvLyBieSBTQUwgU1BFQyAzLjAKLQkvLyBOT1RFIDogVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBzdGF0ZSBnZXRzIHNhdmVkCi0JLy8JICBpcyBkZXBlbmRlbnQgb24gdGhlIHdheSB0aGUgQy1zdHJ1Y3R1cmUKLQkvLwkgIGZvciBpYTY0X21jYV9zYWxfdG9fb3Nfc3RhdGVfdCBoYXMgYmVlbgotCS8vCSAgZGVmaW5lZCBpbiBpbmNsdWRlL2FzbS9tY2EuaAotCVNBTF9UT19PU19NQ0FfSEFORE9GRl9TVEFURV9TQVZFKHIyKQorCW1vdiByMz1JQTY0X01DQV9DUFVfTUNBX1NUQUNLX09GRlNFVAkvLyB1c2UgdGhlIE1DQSBzdGFjaworCUxPQURfUEhZU0lDQUwocDAscjIsMWYpCQkJLy8gcmV0dXJuIGFkZHJlc3MKKwltb3YgcjE5PTEJCQkJLy8gQWxsIE1DQSBldmVudHMgYXJlIHRyZWF0ZWQgYXMgbW9uYXJjaCAoZm9yIG5vdykKKwlici5zcHRrIGlhNjRfc3RhdGVfc2F2ZQkJCS8vIHNhdmUgdGhlIHN0YXRlIHRoYXQgaXMgbm90IGluIG1pbnN0YXRlCisxOgorCisJR0VUX0lBNjRfTUNBX0RBVEEocjIpCisJLy8gVXNpbmcgTUNBIHN0YWNrLCBzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUsIHZhcmlhYmxlIHByb2Nfc3RhdGVfcGFyYW0KIAk7OwotCi0JLy8gTE9HIFBST0NFU1NPUiBTVEFURSBJTkZPIEZST00gSEVSRSBPTi4uCi1iZWdpbl9vc19tY2FfZHVtcDoKLQlicglpYTY0X29zX21jYV9wcm9jX3N0YXRlX2R1bXA7OwotCi1pYTY0X29zX21jYV9kb25lX2R1bXA6Ci0KLQlMT0FEX1BIWVNJQ0FMKHAwLHIxNixpYTY0X3NhbF90b19vc19oYW5kb2ZmX3N0YXRlKzU2KQorCWFkZCByMz1JQTY0X01DQV9DUFVfTUNBX1NUQUNLX09GRlNFVCtNQ0FfU09TX09GRlNFVCtJQTY0X1NBTF9PU19TVEFURV9QUk9DX1NUQVRFX1BBUkFNX09GRlNFVCwgcjIKIAk7OwotCWxkOCByMTg9W3IxNl0JCS8vIEdldCBwcm9jZXNzb3Igc3RhdGUgcGFyYW1ldGVyIG9uIGV4aXN0aW5nIFBBTEVfQ0hFQ0suCisJbGQ4IHIxOD1bcjNdCQkJCS8vIEdldCBwcm9jZXNzb3Igc3RhdGUgcGFyYW1ldGVyIG9uIGV4aXN0aW5nIFBBTEVfQ0hFQ0suCiAJOzsKIAl0Yml0Lm56IHA2LHA3PXIxOCw2MAogKHA3KQlici5zcG50IGRvbmVfdGxiX3B1cmdlX2FuZF9yZWxvYWQKQEAgLTMyMyw2MjQgKzI1MCw3NzUgQEAKIAlpdHIuZCBkdHJbcjIwXT1yMTYKIAk7OwogCXNybHouZAotCTs7Ci0JYnIuc3B0ay5tYW55IGRvbmVfdGxiX3B1cmdlX2FuZF9yZWxvYWQKLWVycjoKLQlDT0xEX0JPT1RfSEFORE9GRl9TVEFURShyMjAscjIxLHIyMikKLQlici5zcHRrLm1hbnkgaWE2NF9vc19tY2FfZG9uZV9yZXN0b3JlCiAKIGRvbmVfdGxiX3B1cmdlX2FuZF9yZWxvYWQ6CiAKLQkvLyBTZXR1cCBuZXcgc3RhY2sgZnJhbWUgZm9yIE9TX01DQSBoYW5kbGluZwotCUdFVF9JQTY0X01DQV9EQVRBKHIyKQotCTs7Ci0JYWRkIHIzID0gSUE2NF9NQ0FfQ1BVX1NUQUNLRlJBTUVfT0ZGU0VULCByMgotCWFkZCByMiA9IElBNjRfTUNBX0NQVV9SQlNUT1JFX09GRlNFVCwgcjIKLQk7OwotCXJzZV9zd2l0Y2hfY29udGV4dChyNixyMyxyMik7OwkvLyBSU0MgbWFuYWdlbWVudCBpbiB0aGlzIG5ldyBjb250ZXh0CisJLy8gc3dpdGNoIHRvIHBlciBjcHUgTUNBIHN0YWNrCisJbW92IHIzPUlBNjRfTUNBX0NQVV9NQ0FfU1RBQ0tfT0ZGU0VUCS8vIHVzZSB0aGUgTUNBIHN0YWNrCisJTE9BRF9QSFlTSUNBTChwMCxyMiwxZikJCQkvLyByZXR1cm4gYWRkcmVzcworCWJyLnNwdGsgaWE2NF9uZXdfc3RhY2sKKzE6CiAKKwkvLyBldmVyeXRoaW5nIHNhdmVkLCBub3cgd2UgY2FuIHNldCB0aGUga2VybmVsIHJlZ2lzdGVycworCW1vdiByMz1JQTY0X01DQV9DUFVfTUNBX1NUQUNLX09GRlNFVAkvLyB1c2UgdGhlIE1DQSBzdGFjaworCUxPQURfUEhZU0lDQUwocDAscjIsMWYpCQkJLy8gcmV0dXJuIGFkZHJlc3MKKwlici5zcHRrIGlhNjRfc2V0X2tlcm5lbF9yZWdpc3RlcnMKKzE6CisKKwkvLyBUaGlzIG11c3QgYmUgZG9uZSBpbiBwaHlzaWNhbCBtb2RlCiAJR0VUX0lBNjRfTUNBX0RBVEEocjIpCiAJOzsKLQlhZGQgcjIgPSBJQTY0X01DQV9DUFVfU1RBQ0tfT0ZGU0VUK0lBNjRfTUNBX1NUQUNLX1NJWkUtMTYsIHIyCi0JOzsKLQltb3YgcjEyPXIyCQkvLyBlc3RhYmxpc2ggbmV3IHN0YWNrLXBvaW50ZXIKKwltb3Ygcjc9cjIKIAogICAgICAgICAvLyBFbnRlciB2aXJ0dWFsIG1vZGUgZnJvbSBwaHlzaWNhbCBtb2RlCiAJVklSVFVBTF9NT0RFX0VOVEVSKHIyLCByMywgaWE2NF9vc19tY2FfdmlydHVhbF9iZWdpbiwgcjQpCi1pYTY0X29zX21jYV92aXJ0dWFsX2JlZ2luOgorCisJLy8gVGhpcyBjb2RlIHJldHVybnMgdG8gU0FMIHZpYSBTT1MgcjIsIGluIGdlbmVyYWwgU0FMIGhhcyBubyB1bndpbmQKKwkvLyBkYXRhLiAgVG8gZ2V0IGEgY2xlYW4gdGVybWluYXRpb24gd2hlbiBiYWNrdHJhY2luZyB0aGUgQyBNQ0EvSU5JVAorCS8vIGhhbmRsZXIsIHNldCBhIGR1bW15IHJldHVybiBhZGRyZXNzIG9mIDAgaW4gdGhpcyByb3V0aW5lLiAgVGhhdAorCS8vIHJlcXVpcmVzIHRoYXQgaWE2NF9vc19tY2FfdmlydHVhbF9iZWdpbiBiZSBhIGdsb2JhbCBmdW5jdGlvbi4KK0VOVFJZKGlhNjRfb3NfbWNhX3ZpcnR1YWxfYmVnaW4pCisJLnByb2xvZ3VlCisJLnNhdmUgcnAscjAKKwkuYm9keQorCisJbW92IGFyLnJzYz0zCQkJCS8vIHNldCBlYWdlciBtb2RlIGZvciBDIGhhbmRsZXIKKwltb3YgcjI9cjcJCQkJLy8gc2VlIEdFVF9JQTY0X01DQV9EQVRBIGFib3ZlCisJOzsKIAogCS8vIENhbGwgdmlydHVhbCBtb2RlIGhhbmRsZXIKLQltb3ZsCQlyMj1pYTY0X21jYV91Y21jX2hhbmRsZXI7OwotCW1vdgkJYjY9cjI7OwotCWJyLmNhbGwuc3B0ay5tYW55ICAgIGIwPWI2OzsKLS5yZXQwOgorCWFsbG9jIHIxND1hci5wZnMsMCwwLDMsMAorCTs7CisJREFUQV9QQV9UT19WQShyMixyNykKKwk7OworCWFkZCBvdXQwPUlBNjRfTUNBX0NQVV9NQ0FfU1RBQ0tfT0ZGU0VUK01DQV9QVF9SRUdTX09GRlNFVCwgcjIKKwlhZGQgb3V0MT1JQTY0X01DQV9DUFVfTUNBX1NUQUNLX09GRlNFVCtNQ0FfU1dJVENIX1NUQUNLX09GRlNFVCwgcjIKKwlhZGQgb3V0Mj1JQTY0X01DQV9DUFVfTUNBX1NUQUNLX09GRlNFVCtNQ0FfU09TX09GRlNFVCwgcjIKKwlici5jYWxsLnNwdGsubWFueSAgICBiMD1pYTY0X21jYV9oYW5kbGVyCisKIAkvLyBSZXZlcnQgYmFjayB0byBwaHlzaWNhbCBtb2RlIGJlZm9yZSBnb2luZyBiYWNrIHRvIFNBTAogCVBIWVNJQ0FMX01PREVfRU5URVIocjIsIHIzLCBpYTY0X29zX21jYV92aXJ0dWFsX2VuZCwgcjQpCiBpYTY0X29zX21jYV92aXJ0dWFsX2VuZDoKIAotCS8vIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHN0YWNrIGZyYW1lIGhlcmUKLQlHRVRfSUE2NF9NQ0FfREFUQShyMikKLQk7OwotCWFkZCByMiA9IElBNjRfTUNBX0NQVV9TVEFDS0ZSQU1FX09GRlNFVCwgcjIKLQk7OwotCW1vdmwgICAgcjQ9SUE2NF9QU1JfTUMKLQk7OwotCXJzZV9yZXR1cm5fY29udGV4dChyNCxyMyxyMikJLy8gc3dpdGNoIGZyb20gaW50ZXJydXB0IGNvbnRleHQgZm9yIFJTRQorRU5EKGlhNjRfb3NfbWNhX3ZpcnR1YWxfYmVnaW4pCiAKLQkvLyBsZXQgdXMgcmVzdG9yZSBhbGwgdGhlIHJlZ2lzdGVycyBmcm9tIG91ciBQU0kgc3RydWN0dXJlCi0JbW92CXI4PWdwCi0JOzsKLWJlZ2luX29zX21jYV9yZXN0b3JlOgotCWJyCWlhNjRfb3NfbWNhX3Byb2Nfc3RhdGVfcmVzdG9yZTs7CisJLy8gc3dpdGNoIGJhY2sgdG8gcHJldmlvdXMgc3RhY2sKKwlhbGxvYyByMTQ9YXIucGZzLDAsMCwwLDAJCS8vIHJlbW92ZSB0aGUgTUNBIGhhbmRsZXIgZnJhbWUKKwltb3YgcjM9SUE2NF9NQ0FfQ1BVX01DQV9TVEFDS19PRkZTRVQJLy8gdXNlIHRoZSBNQ0Egc3RhY2sKKwlMT0FEX1BIWVNJQ0FMKHAwLHIyLDFmKQkJCS8vIHJldHVybiBhZGRyZXNzCisJYnIuc3B0ayBpYTY0X29sZF9zdGFjaworMToKIAotaWE2NF9vc19tY2FfZG9uZV9yZXN0b3JlOgotCU9TX01DQV9UT19TQUxfSEFORE9GRl9TVEFURV9SRVNUT1JFKHIyKTs7Ci0JLy8gYnJhbmNoIGJhY2sgdG8gU0FMRV9DSEVDSwotCWxkOAkJcjM9W3IyXTs7Ci0JbW92CQliMD1yMzs7CQkvLyBTQUxfQ0hFQ0sgcmV0dXJuIGFkZHJlc3MKKwltb3YgcjM9SUE2NF9NQ0FfQ1BVX01DQV9TVEFDS19PRkZTRVQJLy8gdXNlIHRoZSBNQ0Egc3RhY2sKKwlMT0FEX1BIWVNJQ0FMKHAwLHIyLDFmKQkJCS8vIHJldHVybiBhZGRyZXNzCisJYnIuc3B0ayBpYTY0X3N0YXRlX3Jlc3RvcmUJCS8vIHJlc3RvcmUgdGhlIFNBTCBzdGF0ZQorMToKKworCW1vdgkJYjA9cjEyCQkJLy8gU0FMX0NIRUNLIHJldHVybiBhZGRyZXNzCiAKIAkvLyByZWxlYXNlIGxvY2sKLQltb3ZsCQlyMz1pYTY0X21jYV9zZXJpYWxpemU7OwotCURBVEFfVkFfVE9fUEEocjMpOzsKLQlzdDgucmVsCQlbcjNdPXIwCisJTE9BRF9QSFlTSUNBTChwMCxyMyxpYTY0X21jYV9zZXJpYWxpemUpOzsKKwlzdDQucmVsCQlbcjNdPXIwCiAKIAlicgkJYjAKLQk7OwotaWE2NF9vc19tY2FfZGlzcGF0Y2hfZW5kOgorCiAvL0VuZE1haW4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKKy8vU3RhcnRNYWluLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotLy8rKwotLy8gTmFtZToKLS8vICAgICAgaWE2NF9vc19tY2FfcHJvY19zdGF0ZV9kdW1wKCkKIC8vCi0vLyBTdHViIERlc2NyaXB0aW9uOgorLy8gU0FMIHRvIE9TIGVudHJ5IHBvaW50IGZvciBJTklUIG9uIGFsbCBwcm9jZXNzb3JzLiAgVGhpcyBoYXMgYmVlbiBkZWZpbmVkIGZvcgorLy8gcmVnaXN0cmF0aW9uIHB1cnBvc2VzIHdpdGggU0FMIGFzIGEgcGFydCBvZiBpYTY0X21jYV9pbml0LiAgTW9uYXJjaCBhbmQKKy8vIHNsYXZlIElOSVQgaGF2ZSBpZGVudGljYWwgcHJvY2Vzc2luZywgZXhjZXB0IGZvciB0aGUgdmFsdWUgb2YgdGhlCisvLyBzb3MtPm1vbmFyY2ggZmxhZyBpbiByMTkuCiAvLwotLy8gICAgICAgVGhpcyBzdHViIGR1bXBzIHRoZSBwcm9jZXNzb3Igc3RhdGUgZHVyaW5nIE1DSEsgdG8gYSBkYXRhIGFyZWEKLS8vCi0vLy0tCiAKLWlhNjRfb3NfbWNhX3Byb2Nfc3RhdGVfZHVtcDoKLS8vIFNhdmUgYmFuayAxIEdScyAxNi0zMSB3aGljaCB3aWxsIGJlIHVzZWQgYnkgYy1sYW5ndWFnZSBjb2RlIHdoZW4gd2Ugc3dpdGNoCi0vLyAgdG8gdmlydHVhbCBhZGRyZXNzaW5nIG1vZGUuCitpYTY0X29zX2luaXRfZGlzcGF0Y2hfbW9uYXJjaDoKKwltb3YgcjE5PTEJCQkJLy8gQm93LCBib3csIHllIGxvd2VyIG1pZGRsZSBjbGFzc2VzIQorCWJyLnNwdGsgaWE2NF9vc19pbml0X2Rpc3BhdGNoCisKK2lhNjRfb3NfaW5pdF9kaXNwYXRjaF9zbGF2ZToKKwltb3YgcjE5PTAJCQkJLy8gPGlnb3I+eWV0aCwgbWF0aHRlcjwvaWdvcj4KKworaWE2NF9vc19pbml0X2Rpc3BhdGNoOgorCisJbW92IHIzPUlBNjRfTUNBX0NQVV9JTklUX1NUQUNLX09GRlNFVAkvLyB1c2UgdGhlIElOSVQgc3RhY2sKKwlMT0FEX1BIWVNJQ0FMKHAwLHIyLDFmKQkJCS8vIHJldHVybiBhZGRyZXNzCisJYnIuc3B0ayBpYTY0X3N0YXRlX3NhdmUJCQkvLyBzYXZlIHRoZSBzdGF0ZSB0aGF0IGlzIG5vdCBpbiBtaW5zdGF0ZQorMToKKworCS8vIHN3aXRjaCB0byBwZXIgY3B1IElOSVQgc3RhY2sKKwltb3YgcjM9SUE2NF9NQ0FfQ1BVX0lOSVRfU1RBQ0tfT0ZGU0VUCS8vIHVzZSB0aGUgSU5JVCBzdGFjaworCUxPQURfUEhZU0lDQUwocDAscjIsMWYpCQkJLy8gcmV0dXJuIGFkZHJlc3MKKwlici5zcHRrIGlhNjRfbmV3X3N0YWNrCisxOgorCisJLy8gZXZlcnl0aGluZyBzYXZlZCwgbm93IHdlIGNhbiBzZXQgdGhlIGtlcm5lbCByZWdpc3RlcnMKKwltb3YgcjM9SUE2NF9NQ0FfQ1BVX0lOSVRfU1RBQ0tfT0ZGU0VUCS8vIHVzZSB0aGUgSU5JVCBzdGFjaworCUxPQURfUEhZU0lDQUwocDAscjIsMWYpCQkJLy8gcmV0dXJuIGFkZHJlc3MKKwlici5zcHRrIGlhNjRfc2V0X2tlcm5lbF9yZWdpc3RlcnMKKzE6CisKKwkvLyBUaGlzIG11c3QgYmUgZG9uZSBpbiBwaHlzaWNhbCBtb2RlCiAJR0VUX0lBNjRfTUNBX0RBVEEocjIpCiAJOzsKLQlhZGQgcjIgPSBJQTY0X01DQV9DUFVfUFJPQ19TVEFURV9EVU1QX09GRlNFVCwgcjIKLQk7OwotLy8gc2F2ZSBhci5OYVQKLQltb3YJCXI1PWFyLnVuYXQgICAgICAgICAgICAgICAgICAvLyBhci51bmF0CisJbW92IHI3PXIyCiAKLS8vIHNhdmUgYmFua2VkIEdScyAxNi0zMSBhbG9uZyB3aXRoIE5hVCBiaXRzCi0JYnN3LjE7OwotCXN0OC5zcGlsbAlbcjJdPXIxNiw4OzsKLQlzdDguc3BpbGwJW3IyXT1yMTcsODs7Ci0Jc3Q4LnNwaWxsCVtyMl09cjE4LDg7OwotCXN0OC5zcGlsbAlbcjJdPXIxOSw4OzsKLQlzdDguc3BpbGwJW3IyXT1yMjAsODs7Ci0Jc3Q4LnNwaWxsCVtyMl09cjIxLDg7OwotCXN0OC5zcGlsbAlbcjJdPXIyMiw4OzsKLQlzdDguc3BpbGwJW3IyXT1yMjMsODs7Ci0Jc3Q4LnNwaWxsCVtyMl09cjI0LDg7OwotCXN0OC5zcGlsbAlbcjJdPXIyNSw4OzsKLQlzdDguc3BpbGwJW3IyXT1yMjYsODs7Ci0Jc3Q4LnNwaWxsCVtyMl09cjI3LDg7OwotCXN0OC5zcGlsbAlbcjJdPXIyOCw4OzsKLQlzdDguc3BpbGwJW3IyXT1yMjksODs7Ci0Jc3Q4LnNwaWxsCVtyMl09cjMwLDg7OwotCXN0OC5zcGlsbAlbcjJdPXIzMSw4OzsKKyAgICAgICAgLy8gRW50ZXIgdmlydHVhbCBtb2RlIGZyb20gcGh5c2ljYWwgbW9kZQorCVZJUlRVQUxfTU9ERV9FTlRFUihyMiwgcjMsIGlhNjRfb3NfaW5pdF92aXJ0dWFsX2JlZ2luLCByNCkKIAotCW1vdgkJcjQ9YXIudW5hdDs7Ci0Jc3Q4CQlbcjJdPXI0LDggICAgICAgICAgICAgICAgLy8gc2F2ZSBVc2VyIE5hVCBiaXRzIGZvciByMTYtcjMxCi0JbW92CQlhci51bmF0PXI1ICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBvcmlnaW5hbCB1bmF0Ci0JYnN3LjA7OwotCi0vL3NhdmUgQlJzCi0JYWRkCQlyND04LHIyICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIHIyIGluIHI0Ci0JYWRkCQlyNj0yKjgscjIgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIHIyIGluIHI0Ci0KLQltb3YJCXIzPWIwCi0JbW92CQlyNT1iMQotCW1vdgkJcjc9YjI7OwotCXN0OAkJW3IyXT1yMywzKjgKLQlzdDgJCVtyNF09cjUsMyo4Ci0Jc3Q4CQlbcjZdPXI3LDMqODs7Ci0KLQltb3YJCXIzPWIzCi0JbW92CQlyNT1iNAotCW1vdgkJcjc9YjU7OwotCXN0OAkJW3IyXT1yMywzKjgKLQlzdDgJCVtyNF09cjUsMyo4Ci0Jc3Q4CQlbcjZdPXI3LDMqODs7Ci0KLQltb3YJCXIzPWI2Ci0JbW92CQlyNT1iNzs7Ci0Jc3Q4CQlbcjJdPXIzLDIqOAotCXN0OAkJW3I0XT1yNSwyKjg7OwotCi1jU2F2ZUNSczoKLS8vIHNhdmUgQ1JzCi0JYWRkCQlyND04LHIyICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIHIyIGluIHI0Ci0JYWRkCQlyNj0yKjgscjIgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIHIyIGluIHI0Ci0KLQltb3YJCXIzPWNyLmRjcgotCW1vdgkJcjU9Y3IuaXRtCi0JbW92CQlyNz1jci5pdmE7OwotCi0Jc3Q4CQlbcjJdPXIzLDgqOAotCXN0OAkJW3I0XT1yNSwzKjgKLQlzdDgJCVtyNl09cjcsMyo4OzsgICAgICAgICAgICAvLyA0OCBieXRlIHJlbWVudHMKLQotCW1vdgkJcjM9Y3IucHRhOzsKLQlzdDgJCVtyMl09cjMsOCo4OzsgICAgICAgICAgICAvLyA2NCBieXRlIHJlbWVudHMKLQotLy8gaWYgUFNSLmljPTAsIHJlYWRpbmcgaW50ZXJydXB0aW9uIHJlZ2lzdGVycyBjYXVzZXMgYW4gaWxsZWdhbCBvcGVyYXRpb24gZmF1bHQKLQltb3YJCXIzPXBzcjs7Ci0JdGJpdC5uei51bmMJcDYscDA9cjMsUFNSX0lDOzsgICAgICAgICAgIC8vIFBTSSBWYWxpZCBMb2cgYml0IHBvcy4gdGVzdAotKHA2KSAgICBzdDggICAgIFtyMl09cjAsOSo4KzE2MCAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgYnkgMjMyIGJ5dGUgaW5jLgotYmVnaW5fc2tpcF9pbnRyX3JlZ3M6Ci0ocDYpCWJyCQlTa2lwSW50clJlZ3M7OwotCi0JYWRkCQlyND04LHIyICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIHIyIGluIHI0Ci0JYWRkCQlyNj0yKjgscjIgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIHIyIGluIHI2Ci0KLQltb3YJCXIzPWNyLmlwc3IKLQltb3YJCXI1PWNyLmlzcgotCW1vdgkJcjc9cjA7OwotCXN0OAkJW3IyXT1yMywzKjgKLQlzdDgJCVtyNF09cjUsMyo4Ci0Jc3Q4CQlbcjZdPXI3LDMqODs7Ci0KLQltb3YJCXIzPWNyLmlpcAotCW1vdgkJcjU9Y3IuaWZhCi0JbW92CQlyNz1jci5pdGlyOzsKLQlzdDgJCVtyMl09cjMsMyo4Ci0Jc3Q4CQlbcjRdPXI1LDMqOAotCXN0OAkJW3I2XT1yNywzKjg7OwotCi0JbW92CQlyMz1jci5paXBhCi0JbW92CQlyNT1jci5pZnMKLQltb3YJCXI3PWNyLmlpbTs7Ci0Jc3Q4CQlbcjJdPXIzLDMqOAotCXN0OAkJW3I0XT1yNSwzKjgKLQlzdDgJCVtyNl09cjcsMyo4OzsKLQotCW1vdgkJcjM9Y3IyNTs7ICAgICAgICAgICAgICAgICAgIC8vIGNyLmloYQotCXN0OAkJW3IyXT1yMywxNjA7OyAgICAgICAgICAgICAgIC8vIDE2MCBieXRlIHJlbWVudAotCi1Ta2lwSW50clJlZ3M6Ci0Jc3Q4CQlbcjJdPXIwLDE1Mjs7ICAgICAgICAgICAgICAgLy8gYW5vdGhlciAxNTIgYnl0ZSAuCi0KLQlhZGQJCXI0PTgscjIgICAgICAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgcjIgaW4gcjQKLQlhZGQJCXI2PTIqOCxyMiAgICAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgcjIgaW4gcjYKLQotCW1vdgkJcjM9Y3IubGlkCi0vLwltb3YJCXI1PWNyLml2ciAgICAgICAgICAgICAgICAgICAgIC8vIGNyLml2ciwgZG9uJ3QgcmVhZCBpdAotCW1vdgkJcjc9Y3IudHByOzsKLQlzdDgJCVtyMl09cjMsMyo4Ci0Jc3Q4CQlbcjRdPXI1LDMqOAotCXN0OAkJW3I2XT1yNywzKjg7OwotCi0JbW92CQlyMz1yMCAgICAgICAgICAgICAgICAgICAgICAgLy8gY3IuZW9pID0+IGNyNjcKLQltb3YJCXI1PXIwICAgICAgICAgICAgICAgICAgICAgICAvLyBjci5pcnIwID0+IGNyNjgKLQltb3YJCXI3PXIwOzsgICAgICAgICAgICAgICAgICAgICAvLyBjci5pcnIxID0+IGNyNjkKLQlzdDgJCVtyMl09cjMsMyo4Ci0Jc3Q4CQlbcjRdPXI1LDMqOAotCXN0OAkJW3I2XT1yNywzKjg7OwotCi0JbW92CQlyMz1yMCAgICAgICAgICAgICAgICAgICAgICAgLy8gY3IuaXJyMiA9PiBjcjcwCi0JbW92CQlyNT1yMCAgICAgICAgICAgICAgICAgICAgICAgLy8gY3IuaXJyMyA9PiBjcjcxCi0JbW92CQlyNz1jci5pdHY7OwotCXN0OAkJW3IyXT1yMywzKjgKLQlzdDgJCVtyNF09cjUsMyo4Ci0Jc3Q4CQlbcjZdPXI3LDMqODs7Ci0KLQltb3YJCXIzPWNyLnBtdgotCW1vdgkJcjU9Y3IuY21jdjs7Ci0Jc3Q4CQlbcjJdPXIzLDcqOAotCXN0OAkJW3I0XT1yNSw3Kjg7OwotCi0JbW92CQlyMz1yMCAgICAgICAgICAgICAgICAgICAgICAgLy8gY3IubHJyMCA9PiBjcjgwCi0JbW92CQlyNT1yMDs7ICAgICAgICAgICAgICAgICAgICAgLy8gY3IubHJyMSA9PiBjcjgxCi0Jc3Q4CQlbcjJdPXIzLDIzKjgKLQlzdDgJCVtyNF09cjUsMjMqODs7Ci0KLQlhZGRzCQlyMj0yNSo4LHIyOzsKLQotY1NhdmVBUnM6Ci0vLyBzYXZlIEFScwotCWFkZAkJcjQ9OCxyMiAgICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSByMiBpbiByNAotCWFkZAkJcjY9Mio4LHIyICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSByMiBpbiByNgotCi0JbW92CQlyMz1hci5rMAotCW1vdgkJcjU9YXIuazEKLQltb3YJCXI3PWFyLmsyOzsKLQlzdDgJCVtyMl09cjMsMyo4Ci0Jc3Q4CQlbcjRdPXI1LDMqOAotCXN0OAkJW3I2XT1yNywzKjg7OwotCi0JbW92CQlyMz1hci5rMwotCW1vdgkJcjU9YXIuazQKLQltb3YJCXI3PWFyLms1OzsKLQlzdDgJCVtyMl09cjMsMyo4Ci0Jc3Q4CQlbcjRdPXI1LDMqOAotCXN0OAkJW3I2XT1yNywzKjg7OwotCi0JbW92CQlyMz1hci5rNgotCW1vdgkJcjU9YXIuazcKLQltb3YJCXI3PXIwOzsgICAgICAgICAgICAgICAgICAgICAvLyBhci5rcjgKLQlzdDgJCVtyMl09cjMsMTAqOAotCXN0OAkJW3I0XT1yNSwxMCo4Ci0Jc3Q4CQlbcjZdPXI3LDEwKjg7OyAgICAgICAgICAgLy8gcmVtZW50IGJ5IDcyIGJ5dGVzCi0KLQltb3YJCXIzPWFyLnJzYwotCW1vdgkJYXIucnNjPXIwCQkJICAgIC8vIHB1dCBSU0UgaW4gZW5mb3JjZWQgbGF6eSBtb2RlCi0JbW92CQlyNT1hci5ic3AKLQk7OwotCW1vdgkJcjc9YXIuYnNwc3RvcmU7OwotCXN0OAkJW3IyXT1yMywzKjgKLQlzdDgJCVtyNF09cjUsMyo4Ci0Jc3Q4CQlbcjZdPXI3LDMqODs7Ci0KLQltb3YJCXIzPWFyLnJuYXQ7OwotCXN0OAkJW3IyXT1yMyw4KjEzICAgICAgICAgICAgIC8vIGluY3JlbWVudCBieSAxM3g4IGJ5dGVzCi0KLQltb3YJCXIzPWFyLmNjdjs7Ci0Jc3Q4CQlbcjJdPXIzLDgqNAotCi0JbW92CQlyMz1hci51bmF0OzsKLQlzdDgJCVtyMl09cjMsOCo0Ci0KLQltb3YJCXIzPWFyLmZwc3I7OwotCXN0OAkJW3IyXT1yMyw4KjQKLQotCW1vdgkJcjM9YXIuaXRjOzsKLQlzdDgJCVtyMl09cjMsMTYwICAgICAgICAgICAgICAgICAvLyAxNjAKLQotCW1vdgkJcjM9YXIucGZzOzsKLQlzdDgJCVtyMl09cjMsOAotCi0JbW92CQlyMz1hci5sYzs7Ci0Jc3Q4CQlbcjJdPXIzLDgKLQotCW1vdgkJcjM9YXIuZWM7OwotCXN0OAkJW3IyXT1yMwotCWFkZAkJcjI9OCo2MixyMiAgICAgICAgICAgICAgIC8vcGFkZGluZwotCi0vLyBzYXZlIFJScwotCW1vdgkJYXIubGM9MHgwOC0xCi0JbW92bAkJcjQ9MHgwMDs7Ci0KLWNTdFJSOgotCWRlcC56CQlyNT1yNCw2MSwzOzsKLQltb3YJCXIzPXJyW3I1XTs7Ci0Jc3Q4CQlbcjJdPXIzLDgKLQlhZGQJCXI0PTEscjQKLQlici5jbG9vcC5zcHRrLmZldwljU3RSUgotCTs7Ci1lbmRfb3NfbWNhX2R1bXA6Ci0JYnIJaWE2NF9vc19tY2FfZG9uZV9kdW1wOzsKLQotLy9FbmRTdHViLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLS8vKysKLS8vIE5hbWU6Ci0vLyAgICAgICBpYTY0X29zX21jYV9wcm9jX3N0YXRlX3Jlc3RvcmUoKQotLy8KLS8vIFN0dWIgRGVzY3JpcHRpb246Ci0vLwotLy8gICAgICAgVGhpcyBpcyBhIHN0dWIgdG8gcmVzdG9yZSB0aGUgc2F2ZWQgcHJvY2Vzc29yIHN0YXRlIGR1cmluZyBNQ0hLCi0vLwotLy8tLQotCi1pYTY0X29zX21jYV9wcm9jX3N0YXRlX3Jlc3RvcmU6Ci0KLS8vIFJlc3RvcmUgYmFuazEgR1IxNi0zMQotCUdFVF9JQTY0X01DQV9EQVRBKHIyKQotCTs7Ci0JYWRkIHIyID0gSUE2NF9NQ0FfQ1BVX1BST0NfU1RBVEVfRFVNUF9PRkZTRVQsIHIyCi0KLXJlc3RvcmVfR1JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgYmFuay0xIEdScyAxNi0zMQotCWJzdy4xOzsKLQlhZGQJCXIzPTE2KjgscjI7OyAgICAgICAgICAgICAgICAvLyB0byBnZXQgdG8gTmFUIG9mIEdSIDE2LTMxCi0JbGQ4CQlyMz1bcjNdOzsKLQltb3YJCWFyLnVuYXQ9cjM7OyAgICAgICAgICAgICAgICAvLyBmaXJzdCByZXN0b3JlIE5hVAotCi0JbGQ4LmZpbGwJcjE2PVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjE3PVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjE4PVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjE5PVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjIwPVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjIxPVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjIyPVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjIzPVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjI0PVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjI1PVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjI2PVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjI3PVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjI4PVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjI5PVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjMwPVtyMl0sODs7Ci0JbGQ4LmZpbGwJcjMxPVtyMl0sODs7Ci0KLQlsZDgJCXIzPVtyMl0sODs7ICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgdG8gc2tpcCBOYVQKLQlic3cuMDs7Ci0KLXJlc3RvcmVfQlJzOgotCWFkZAkJcjQ9OCxyMiAgICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSByMiBpbiByNAotCWFkZAkJcjY9Mio4LHIyOzsgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSByMiBpbiByNAotCi0JbGQ4CQlyMz1bcjJdLDMqOAotCWxkOAkJcjU9W3I0XSwzKjgKLQlsZDgJCXI3PVtyNl0sMyo4OzsKLQltb3YJCWIwPXIzCi0JbW92CQliMT1yNQotCW1vdgkJYjI9cjc7OwotCi0JbGQ4CQlyMz1bcjJdLDMqOAotCWxkOAkJcjU9W3I0XSwzKjgKLQlsZDgJCXI3PVtyNl0sMyo4OzsKLQltb3YJCWIzPXIzCi0JbW92CQliND1yNQotCW1vdgkJYjU9cjc7OwotCi0JbGQ4CQlyMz1bcjJdLDIqOAotCWxkOAkJcjU9W3I0XSwyKjg7OwotCW1vdgkJYjY9cjMKLQltb3YJCWI3PXI1OzsKLQotcmVzdG9yZV9DUnM6Ci0JYWRkCQlyND04LHIyICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIHIyIGluIHI0Ci0JYWRkCQlyNj0yKjgscjI7OyAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIHIyIGluIHI0Ci0KLQlsZDgJCXIzPVtyMl0sOCo4Ci0JbGQ4CQlyNT1bcjRdLDMqOAotCWxkOAkJcjc9W3I2XSwzKjg7OyAgICAgICAgICAgIC8vIDQ4IGJ5dGUgaW5jcmVtZW50cwotCW1vdgkJY3IuZGNyPXIzCi0JbW92CQljci5pdG09cjUKLQltb3YJCWNyLml2YT1yNzs7Ci0KLQlsZDgJCXIzPVtyMl0sOCo4OzsgICAgICAgICAgICAvLyA2NCBieXRlIGluY3JlbWVudHMKLS8vICAgICAgbW92CQljci5wdGE9cjMKLQotCi0vLyBpZiBQU1IuaWM9MSwgcmVhZGluZyBpbnRlcnJ1cHRpb24gcmVnaXN0ZXJzIGNhdXNlcyBhbiBpbGxlZ2FsIG9wZXJhdGlvbiBmYXVsdAotCW1vdgkJcjM9cHNyOzsKLQl0Yml0Lm56LnVuYwlwNixwMD1yMyxQU1JfSUM7OyAgICAgICAgICAgLy8gUFNJIFZhbGlkIExvZyBiaXQgcG9zLiB0ZXN0Ci0ocDYpICAgIHN0OCAgICAgW3IyXT1yMCw5KjgrMTYwICAgICAgICAgICAgIC8vIGluY3JlbWVudCBieSAyMzIgYnl0ZSBpbmMuCi0KLWJlZ2luX3Jza2lwX2ludHJfcmVnczoKLShwNikJYnIJCXJTa2lwSW50clJlZ3M7OwotCi0JYWRkCQlyND04LHIyICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIHIyIGluIHI0Ci0JYWRkCQlyNj0yKjgscjI7OyAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIHIyIGluIHI0Ci0KLQlsZDgJCXIzPVtyMl0sMyo4Ci0JbGQ4CQlyNT1bcjRdLDMqOAotCWxkOAkJcjc9W3I2XSwzKjg7OwotCW1vdgkJY3IuaXBzcj1yMwotLy8JbW92CQljci5pc3I9cjUgICAgICAgICAgICAgICAgICAgLy8gY3IuaXNyIGlzIHJlYWQgb25seQotCi0JbGQ4CQlyMz1bcjJdLDMqOAotCWxkOAkJcjU9W3I0XSwzKjgKLQlsZDgJCXI3PVtyNl0sMyo4OzsKLQltb3YJCWNyLmlpcD1yMwotCW1vdgkJY3IuaWZhPXI1Ci0JbW92CQljci5pdGlyPXI3OzsKLQotCWxkOAkJcjM9W3IyXSwzKjgKLQlsZDgJCXI1PVtyNF0sMyo4Ci0JbGQ4CQlyNz1bcjZdLDMqODs7Ci0JbW92CQljci5paXBhPXIzCi0JbW92CQljci5pZnM9cjUKLQltb3YJCWNyLmlpbT1yNwotCi0JbGQ4CQlyMz1bcjJdLDE2MDs7ICAgICAgICAgICAgICAgLy8gMTYwIGJ5dGUgaW5jcmVtZW50Ci0JbW92CQljci5paGE9cjMKLQotclNraXBJbnRyUmVnczoKLQlsZDgJCXIzPVtyMl0sMTUyOzsgICAgICAgICAgICAgICAvLyBhbm90aGVyIDE1MiBieXRlIGluYy4KLQotCWFkZAkJcjQ9OCxyMiAgICAgICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSByMiBpbiByNAotCWFkZAkJcjY9Mio4LHIyOzsgICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSByMiBpbiByNgotCi0JbGQ4CQlyMz1bcjJdLDgqMwotCWxkOAkJcjU9W3I0XSw4KjMKLQlsZDgJCXI3PVtyNl0sOCozOzsKLQltb3YJCWNyLmxpZD1yMwotLy8JbW92CQljci5pdnI9cjUgICAgICAgICAgICAgICAgICAgLy8gY3IuaXZyIGlzIHJlYWQgb25seQotCW1vdgkJY3IudHByPXI3OzsKLQotCWxkOAkJcjM9W3IyXSw4KjMKLQlsZDgJCXI1PVtyNF0sOCozCi0JbGQ4CQlyNz1bcjZdLDgqMzs7Ci0vLwltb3YJCWNyLmVvaT1yMwotLy8JbW92CQljci5pcnIwPXI1ICAgICAgICAgICAgICAgICAgLy8gY3IuaXJyMCBpcyByZWFkIG9ubHkKLS8vCW1vdgkJY3IuaXJyMT1yNzs7ICAgICAgICAgICAgICAgIC8vIGNyLmlycjEgaXMgcmVhZCBvbmx5Ci0KLQlsZDgJCXIzPVtyMl0sOCozCi0JbGQ4CQlyNT1bcjRdLDgqMwotCWxkOAkJcjc9W3I2XSw4KjM7OwotLy8JbW92CQljci5pcnIyPXIzICAgICAgICAgICAgICAgICAgLy8gY3IuaXJyMiBpcyByZWFkIG9ubHkKLS8vCW1vdgkJY3IuaXJyMz1yNSAgICAgICAgICAgICAgICAgIC8vIGNyLmlycjMgaXMgcmVhZCBvbmx5Ci0JbW92CQljci5pdHY9cjc7OwotCi0JbGQ4CQlyMz1bcjJdLDgqNwotCWxkOAkJcjU9W3I0XSw4Kjc7OwotCW1vdgkJY3IucG12PXIzCi0JbW92CQljci5jbWN2PXI1OzsKLQotCWxkOAkJcjM9W3IyXSw4KjIzCi0JbGQ4CQlyNT1bcjRdLDgqMjM7OwotCWFkZHMJCXIyPTgqMjMscjIKLQlhZGRzCQlyND04KjIzLHI0OzsKLS8vCW1vdgkJY3IubHJyMD1yMwotLy8JbW92CQljci5scnIxPXI1Ci0KLQlhZGRzCQlyMj04KjIscjI7OwotCi1yZXN0b3JlX0FSczoKLQlhZGQJCXI0PTgscjIgICAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgcjIgaW4gcjQKLQlhZGQJCXI2PTIqOCxyMjs7ICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgcjIgaW4gcjQKLQotCWxkOAkJcjM9W3IyXSwzKjgKLQlsZDgJCXI1PVtyNF0sMyo4Ci0JbGQ4CQlyNz1bcjZdLDMqODs7Ci0JbW92CQlhci5rMD1yMwotCW1vdgkJYXIuazE9cjUKLQltb3YJCWFyLmsyPXI3OzsKLQotCWxkOAkJcjM9W3IyXSwzKjgKLQlsZDgJCXI1PVtyNF0sMyo4Ci0JbGQ4CQlyNz1bcjZdLDMqODs7Ci0JbW92CQlhci5rMz1yMwotCW1vdgkJYXIuazQ9cjUKLQltb3YJCWFyLms1PXI3OzsKLQotCWxkOAkJcjM9W3IyXSwxMCo4Ci0JbGQ4CQlyNT1bcjRdLDEwKjgKLQlsZDgJCXI3PVtyNl0sMTAqODs7Ci0JbW92CQlhci5rNj1yMwotCW1vdgkJYXIuazc9cjUKLQk7OwotCi0JbGQ4CQlyMz1bcjJdLDMqOAotCWxkOAkJcjU9W3I0XSwzKjgKLQlsZDgJCXI3PVtyNl0sMyo4OzsKLS8vCW1vdgkJYXIucnNjPXIzCi0vLwltb3YJCWFyLmJzcD1yNSAgICAgICAgICAgICAgICAgICAvLyBhci5ic3AgaXMgcmVhZCBvbmx5Ci0JbW92CQlhci5yc2M9cjAJCQkgICAgLy8gbWFrZSBzdXJlIHRoYXQgUlNFIGlzIGluIGVuZm9yY2VkIGxhenkgbW9kZQotCTs7Ci0JbW92CQlhci5ic3BzdG9yZT1yNzs7Ci0KLQlsZDgJCXI5PVtyMl0sOCoxMzs7Ci0JbW92CQlhci5ybmF0PXI5Ci0KLQltb3YJCWFyLnJzYz1yMwotCWxkOAkJcjM9W3IyXSw4KjQ7OwotCW1vdgkJYXIuY2N2PXIzCi0KLQlsZDgJCXIzPVtyMl0sOCo0OzsKLQltb3YJCWFyLnVuYXQ9cjMKLQotCWxkOAkJcjM9W3IyXSw4KjQ7OwotCW1vdgkJYXIuZnBzcj1yMwotCi0JbGQ4CQlyMz1bcjJdLDE2MDs7ICAgICAgICAgICAgICAgLy8gMTYwCi0vLyAgICAgIG1vdgkJYXIuaXRjPXIzCi0KLQlsZDgJCXIzPVtyMl0sODs7Ci0JbW92CQlhci5wZnM9cjMKLQotCWxkOAkJcjM9W3IyXSw4OzsKLQltb3YJCWFyLmxjPXIzCi0KLQlsZDgJCXIzPVtyMl07OwotCW1vdgkJYXIuZWM9cjMKLQlhZGQJCXIyPTgqNjIscjI7OyAgICAgICAgICAgICAvLyBwYWRkaW5nCi0KLXJlc3RvcmVfUlJzOgotCW1vdgkJcjU9YXIubGMKLQltb3YJCWFyLmxjPTB4MDgtMQotCW1vdmwJCXI0PTB4MDA7OwotY1N0UlJyOgotCWRlcC56CQlyNz1yNCw2MSwzCi0JbGQ4CQlyMz1bcjJdLDg7OwotCW1vdgkJcnJbcjddPXIzICAgICAgICAgICAgICAgICAgIC8vIHdoYXQgYXJlIGl0cyBhY2Nlc3MgcHJldmlsZWRnZXM/Ci0JYWRkCQlyND0xLHI0Ci0JYnIuY2xvb3Auc3B0ay5mZXcJY1N0UlJyCi0JOzsKLQltb3YJCWFyLmxjPXI1Ci0JOzsKLWVuZF9vc19tY2FfcmVzdG9yZToKLQlicglpYTY0X29zX21jYV9kb25lX3Jlc3RvcmU7OwotCi0vL0VuZFN0dWIvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotLy8gb2ssIHRoZSBpc3N1ZSBoZXJlIGlzIHRoYXQgd2UgbmVlZCB0byBzYXZlIHN0YXRlIGluZm9ybWF0aW9uIHNvCi0vLyBpdCBjYW4gYmUgdXNlYWJsZSBieSB0aGUga2VybmVsIGRlYnVnZ2VyIGFuZCBzaG93IHJlZ3Mgcm91dGluZXMuCi0vLyBJbiBvcmRlciB0byBkbyB0aGlzLCBvdXIgYmVzdCBiZXQgaXMgc2F2ZSB0aGUgY3VycmVudCBzdGF0ZSAocGx1cwotLy8gdGhlIHN0YXRlIGluZm9ybWF0aW9uIG9idGFpbiBmcm9tIHRoZSBNSU5fU1RBVEVfQVJFQSkgaW50byBhIHB0X3JlZ3MKLS8vIGZvcm1hdC4gIFRoaXMgd2F5IHdlIGNhbiBwYXNzIGl0IG9uIGluIGEgdXNlYWJsZSBmb3JtYXQuCi0vLwotCi0vLwotLy8gU0FMIHRvIE9TIGVudHJ5IHBvaW50IGZvciBJTklUIG9uIHRoZSBtb25hcmNoIHByb2Nlc3NvcgotLy8gVGhpcyBoYXMgYmVlbiBkZWZpbmVkIGZvciByZWdpc3RyYXRpb24gcHVycG9zZXMgd2l0aCBTQUwKLS8vIGFzIGEgcGFydCBvZiBpYTY0X21jYV9pbml0LgotLy8KLS8vIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzIGhhdmUgYmVlbgotLy8gc2V0IGJ5IHRoZSBTQUwgZm9yIG91ciB1c2UKLS8vCi0vLwkJMS4gR1IxID0gT1MgSU5JVCBHUAotLy8JCTIuIEdSOCA9IFBBTF9QUk9DIHBoeXNpY2FsIGFkZHJlc3MKLS8vCQkzLiBHUjkgPSBTQUxfUFJPQyBwaHlzaWNhbCBhZGRyZXNzCi0vLwkJNC4gR1IxMCA9IFNBTCBHUCAocGh5c2ljYWwpCi0vLwkJNS4gR1IxMSA9IEluaXQgUmVhc29uCi0vLwkJCTAgPSBSZWNlaXZlZCBJTklUIGZvciBldmVudCBvdGhlciB0aGFuIGNyYXNoIGR1bXAgc3dpdGNoCi0vLwkJCTEgPSBSZWNlaXZlZCB3YWtldXAgYXQgdGhlIGVuZCBvZiBhbiBPU19NQ0EgY29ycmVjdGVkIG1hY2hpbmUgY2hlY2sKLS8vCQkJMiA9IFJlY2VpdmVkIElOSVQgZHVkZSB0byBDcmFzaER1bXAgc3dpdGNoIGFzc2VydGlvbgotLy8KLS8vCQk2LiBHUjEyID0gUmV0dXJuIGFkZHJlc3MgdG8gbG9jYXRpb24gd2l0aGluIFNBTF9JTklUIHByb2NlZHVyZQotCi0KLUdMT0JBTF9FTlRSWShpYTY0X21vbmFyY2hfaW5pdF9oYW5kbGVyKQorCS8vIFRoaXMgY29kZSByZXR1cm5zIHRvIFNBTCB2aWEgU09TIHIyLCBpbiBnZW5lcmFsIFNBTCBoYXMgbm8gdW53aW5kCisJLy8gZGF0YS4gIFRvIGdldCBhIGNsZWFuIHRlcm1pbmF0aW9uIHdoZW4gYmFja3RyYWNpbmcgdGhlIEMgTUNBL0lOSVQKKwkvLyBoYW5kbGVyLCBzZXQgYSBkdW1teSByZXR1cm4gYWRkcmVzcyBvZiAwIGluIHRoaXMgcm91dGluZS4gIFRoYXQKKwkvLyByZXF1aXJlcyB0aGF0IGlhNjRfb3NfaW5pdF92aXJ0dWFsX2JlZ2luIGJlIGEgZ2xvYmFsIGZ1bmN0aW9uLgorRU5UUlkoaWE2NF9vc19pbml0X3ZpcnR1YWxfYmVnaW4pCiAJLnByb2xvZ3VlCi0JLy8gc3Rhc2ggdGhlIGluZm9ybWF0aW9uIHRoZSBTQUwgcGFzc2VkIHRvIG9zCi0JU0FMX1RPX09TX01DQV9IQU5ET0ZGX1NUQVRFX1NBVkUocjIpCi0JOzsKLQlTQVZFX01JTl9XSVRIX0NPVkVSCi0JOzsKLQltb3Ygcjg9Y3IuaWZhCi0JbW92IHI5PWNyLmlzcgotCWFkZHMgcjM9OCxyMgkJCQkvLyBzZXQgdXAgc2Vjb25kIGJhc2UgcG9pbnRlcgotCTs7Ci0JU0FWRV9SRVNUCi0KLS8vIG9rLCBlbm91Z2ggc2hvdWxkIGJlIHNhdmVkIGF0IHRoaXMgcG9pbnQgdG8gYmUgZGFuZ2Vyb3VzLCBhbmQgc3VwcGx5Ci0vLyBpbmZvcm1hdGlvbiBmb3IgYSBkdW1wCi0vLyBXZSBuZWVkIHRvIHN3aXRjaCB0byBWaXJ0dWFsIG1vZGUgYmVmb3JlIGhpdHRpbmcgdGhlIEMgZnVuY3Rpb25zLgotCi0JbW92bAlyMj1JQTY0X1BTUl9JVHxJQTY0X1BTUl9JQ3xJQTY0X1BTUl9EVHxJQTY0X1BTUl9SVHxJQTY0X1BTUl9ERkh8SUE2NF9QU1JfQk4KLQltb3YJcjM9cHNyCS8vIGdldCB0aGUgY3VycmVudCBwc3IsIG1pbmltdW0gZW5hYmxlZCBhdCB0aGlzIHBvaW50Ci0JOzsKLQlvcglyMj1yMixyMwotCTs7Ci0JbW92bAlyMz1JVmlydHVhbF9Td2l0Y2gKLQk7OwotCW1vdgljci5paXA9cjMJLy8gc2hvcnQgcmV0dXJuIHRvIHNldCB0aGUgYXBwcm9wcmlhdGUgYml0cwotCW1vdgljci5pcHNyPXIyCS8vIG5lZWQgdG8gZG8gYW4gcmZpIHRvIHNldCBhcHByb3ByaWF0ZSBiaXRzCi0JOzsKLQlyZmkKLQk7OwotSVZpcnR1YWxfU3dpdGNoOgotCS8vCi0JLy8gV2Ugc2hvdWxkIG5vdyBiZSBydW5uaW5nIHZpcnR1YWwKLQkvLwotCS8vIExldCdzIGNhbGwgdGhlIEMgaGFuZGxlciB0byBnZXQgdGhlIHJlc3Qgb2YgdGhlIHN0YXRlIGluZm8KLQkvLwotCWFsbG9jIHIxND1hci5wZnMsMCwwLDIsMAkJLy8gbm93IGl0J3Mgc2FmZSAobXVzdCBiZSBmaXJzdCBpbiBpbnNuIGdyb3VwISkKLQk7OwotCWFkZHMgb3V0MD0xNixzcAkJCQkvLyBvdXQwID0gcG9pbnRlciB0byBwdF9yZWdzCi0JOzsKLQlET19TQVZFX1NXSVRDSF9TVEFDSworCS5zYXZlIHJwLHIwCiAJLmJvZHkKLQlhZGRzIG91dDE9MTYsc3AJCQkJLy8gb3V0MCA9IHBvaW50ZXIgdG8gc3dpdGNoX3N0YWNrCiAKLQlici5jYWxsLnNwdGsubWFueSBycD1pYTY0X2luaXRfaGFuZGxlcgotLnJldDE6CisJbW92IGFyLnJzYz0zCQkJCS8vIHNldCBlYWdlciBtb2RlIGZvciBDIGhhbmRsZXIKKwltb3YgcjI9cjcJCQkJLy8gc2VlIEdFVF9JQTY0X01DQV9EQVRBIGFib3ZlCisJOzsKIAotcmV0dXJuX2Zyb21faW5pdDoKLQlici5zcHRrIHJldHVybl9mcm9tX2luaXQKLUVORChpYTY0X21vbmFyY2hfaW5pdF9oYW5kbGVyKQorCS8vIENhbGwgdmlydHVhbCBtb2RlIGhhbmRsZXIKKwlhbGxvYyByMTQ9YXIucGZzLDAsMCwzLDAKKwk7OworCURBVEFfUEFfVE9fVkEocjIscjcpCisJOzsKKwlhZGQgb3V0MD1JQTY0X01DQV9DUFVfSU5JVF9TVEFDS19PRkZTRVQrTUNBX1BUX1JFR1NfT0ZGU0VULCByMgorCWFkZCBvdXQxPUlBNjRfTUNBX0NQVV9JTklUX1NUQUNLX09GRlNFVCtNQ0FfU1dJVENIX1NUQUNLX09GRlNFVCwgcjIKKwlhZGQgb3V0Mj1JQTY0X01DQV9DUFVfSU5JVF9TVEFDS19PRkZTRVQrTUNBX1NPU19PRkZTRVQsIHIyCisJYnIuY2FsbC5zcHRrLm1hbnkgICAgYjA9aWE2NF9pbml0X2hhbmRsZXIKIAorCS8vIFJldmVydCBiYWNrIHRvIHBoeXNpY2FsIG1vZGUgYmVmb3JlIGdvaW5nIGJhY2sgdG8gU0FMCisJUEhZU0lDQUxfTU9ERV9FTlRFUihyMiwgcjMsIGlhNjRfb3NfaW5pdF92aXJ0dWFsX2VuZCwgcjQpCitpYTY0X29zX2luaXRfdmlydHVhbF9lbmQ6CisKK0VORChpYTY0X29zX2luaXRfdmlydHVhbF9iZWdpbikKKworCW1vdiByMz1JQTY0X01DQV9DUFVfSU5JVF9TVEFDS19PRkZTRVQJLy8gdXNlIHRoZSBJTklUIHN0YWNrCisJTE9BRF9QSFlTSUNBTChwMCxyMiwxZikJCQkvLyByZXR1cm4gYWRkcmVzcworCWJyLnNwdGsgaWE2NF9zdGF0ZV9yZXN0b3JlCQkvLyByZXN0b3JlIHRoZSBTQUwgc3RhdGUKKzE6CisKKwkvLyBzd2l0Y2ggYmFjayB0byBwcmV2aW91cyBzdGFjaworCWFsbG9jIHIxND1hci5wZnMsMCwwLDAsMAkJLy8gcmVtb3ZlIHRoZSBJTklUIGhhbmRsZXIgZnJhbWUKKwltb3YgcjM9SUE2NF9NQ0FfQ1BVX0lOSVRfU1RBQ0tfT0ZGU0VUCS8vIHVzZSB0aGUgSU5JVCBzdGFjaworCUxPQURfUEhZU0lDQUwocDAscjIsMWYpCQkJLy8gcmV0dXJuIGFkZHJlc3MKKwlici5zcHRrIGlhNjRfb2xkX3N0YWNrCisxOgorCisJbW92CQliMD1yMTIJCQkvLyBTQUxfQ0hFQ0sgcmV0dXJuIGFkZHJlc3MKKwlicgkJYjAKKworLy9FbmRNYWluLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBjb21tb24gZGVmaW5lcyBmb3IgdGhlIHN0dWJzCisjZGVmaW5lCW1zCQlyNAorI2RlZmluZQlyZWdzCQlyNQorI2RlZmluZQl0ZW1wMQkJcjIJLyogY2FyZWZ1bCwgaXQgb3ZlcmxhcHMgd2l0aCBpbnB1dCByZWdpc3RlcnMgKi8KKyNkZWZpbmUJdGVtcDIJCXIzCS8qIGNhcmVmdWwsIGl0IG92ZXJsYXBzIHdpdGggaW5wdXQgcmVnaXN0ZXJzICovCisjZGVmaW5lCXRlbXAzCQlyNworI2RlZmluZQl0ZW1wNAkJcjE0CisKKworLy8rKworLy8gTmFtZToKKy8vCWlhNjRfc3RhdGVfc2F2ZSgpCiAvLwotLy8gU0FMIHRvIE9TIGVudHJ5IHBvaW50IGZvciBJTklUIG9uIHRoZSBzbGF2ZSBwcm9jZXNzb3IKLS8vIFRoaXMgaGFzIGJlZW4gZGVmaW5lZCBmb3IgcmVnaXN0cmF0aW9uIHB1cnBvc2VzIHdpdGggU0FMCi0vLyBhcyBhIHBhcnQgb2YgaWE2NF9tY2FfaW5pdC4KKy8vIFN0dWIgRGVzY3JpcHRpb246CiAvLworLy8JU2F2ZSB0aGUgc3RhdGUgdGhhdCBpcyBub3QgaW4gbWluc3RhdGUuICBUaGlzIGlzIHNlbnNpdGl2ZSB0byB0aGUgbGF5b3V0IG9mCisvLwlzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUgaW4gbWNhLmguCisvLworLy8JcjIgY29udGFpbnMgdGhlIHJldHVybiBhZGRyZXNzLCByMyBjb250YWlucyBlaXRoZXIKKy8vCUlBNjRfTUNBX0NQVV9NQ0FfU1RBQ0tfT0ZGU0VUIG9yIElBNjRfTUNBX0NQVV9JTklUX1NUQUNLX09GRlNFVC4KKy8vCisvLwlUaGUgT1MgdG8gU0FMIHNlY3Rpb24gb2Ygc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlIGlzIHNldCB0byBhIGRlZmF1bHQKKy8vCXZhbHVlIG9mIGNvbGQgYm9vdCAoTUNBKSBvciB3YXJtIGJvb3QgKElOSVQpIGFuZCByZXR1cm4gdG8gdGhlIHNhbWUKKy8vCWNvbnRleHQuICBpYTY0X3NhbF9vc19zdGF0ZSBpcyBhbHNvIHVzZWQgdG8gaG9sZCBzb21lIHJlZ2lzdGVycyB0aGF0CisvLwluZWVkIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgdGhlIHN0YWNrIHN3aXRjaGVzLgorLy8KKy8vCU1vc3QgaW5wdXQgcmVnaXN0ZXJzIHRvIHRoaXMgc3R1YiBjb21lIGZyb20gUEFML1NBTAorLy8JcjEgIG9zIGdwLCBwaHlzaWNhbAorLy8JcjggIHBhbF9wcm9jIGVudHJ5IHBvaW50CisvLwlyOSAgc2FsX3Byb2MgZW50cnkgcG9pbnQKKy8vCXIxMCBzYWwgZ3AKKy8vCXIxMSBNQ0EgLSByZW5kZXZ6b3VzIHN0YXRlLCBJTklUIC0gcmVhc29uIGNvZGUKKy8vCXIxMiBzYWwgcmV0dXJuIGFkZHJlc3MKKy8vCXIxNyBwYWwgbWluX3N0YXRlCisvLwlyMTggcHJvY2Vzc29yIHN0YXRlIHBhcmFtZXRlcgorLy8JcjE5IG1vbmFyY2ggZmxhZywgc2V0IGJ5IHRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lCisvLworLy8JSW4gYWRkaXRpb24gdG8gdGhlIFNBTCB0byBPUyBzdGF0ZSwgdGhpcyByb3V0aW5lIHNhdmVzIGFsbCB0aGUKKy8vCXJlZ2lzdGVycyB0aGF0IGFwcGVhciBpbiBzdHJ1Y3QgcHRfcmVncyBhbmQgc3RydWN0IHN3aXRjaF9zdGFjaywKKy8vCWV4Y2x1ZGluZyB0aG9zZSB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBQQUwgbWluc3RhdGUgYXJlYS4gIFRoaXMKKy8vCXJlc3VsdHMgaW4gYSBwYXJ0aWFsIHB0X3JlZ3MgYW5kIHN3aXRjaF9zdGFjaywgdGhlIEMgY29kZSBjb3BpZXMgdGhlCisvLwlyZW1haW5pbmcgcmVnaXN0ZXJzIGZyb20gUEFMIG1pbnN0YXRlIHRvIHB0X3JlZ3MgYW5kIHN3aXRjaF9zdGFjay4gIFRoZQorLy8JcmVzdWx0aW5nIHN0cnVjdHVyZXMgY29udGFpbiBhbGwgdGhlIHN0YXRlIG9mIHRoZSBvcmlnaW5hbCBwcm9jZXNzIHdoZW4KKy8vCU1DQS9JTklUIG9jY3VycmVkLgorLy8KKy8vLS0KIAotR0xPQkFMX0VOVFJZKGlhNjRfc2xhdmVfaW5pdF9oYW5kbGVyKQotMToJYnIuc3B0ayAxYgotRU5EKGlhNjRfc2xhdmVfaW5pdF9oYW5kbGVyKQoraWE2NF9zdGF0ZV9zYXZlOgorCWFkZCByZWdzPU1DQV9TT1NfT0ZGU0VULCByMworCWFkZCBtcz1NQ0FfU09TX09GRlNFVCs4LCByMworCW1vdiBiMD1yMgkJLy8gc2F2ZSByZXR1cm4gYWRkcmVzcworCWNtcC5lcSBwMSxwMj1JQTY0X01DQV9DUFVfTUNBX1NUQUNLX09GRlNFVCwgcjMKKwk7OworCUdFVF9JQTY0X01DQV9EQVRBKHRlbXAyKQorCTs7CisJYWRkIHRlbXAxPXRlbXAyLCByZWdzCS8vIHN0cnVjdCBpYTY0X3NhbF9vc19zdGF0ZSBvbiBNQ0Egb3IgSU5JVCBzdGFjaworCWFkZCB0ZW1wMj10ZW1wMiwgbXMJLy8gc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlKzggb24gTUNBIG9yIElOSVQgc3RhY2sKKwk7OworCW1vdiByZWdzPXRlbXAxCQkvLyBzYXZlIHRoZSBzdGFydCBvZiBzb3MKKwlzdDggW3RlbXAxXT1yMSwxNgkvLyBvc19ncAorCXN0OCBbdGVtcDJdPXI4LDE2CS8vIHBhbF9wcm9jCisJOzsKKwlzdDggW3RlbXAxXT1yOSwxNgkvLyBzYWxfcHJvYworCXN0OCBbdGVtcDJdPXIxMSwxNgkvLyBydl9yYworCW1vdiByMTE9Y3IuaWlwYQorCTs7CisJc3Q4IFt0ZW1wMV09cjE4LDE2CS8vIHByb2Nfc3RhdGVfcGFyYW0KKwlzdDggW3RlbXAyXT1yMTksMTYJLy8gbW9uYXJjaAorCW1vdiByNj1JQTY0X0tSKENVUlJFTlQpCisJOzsKKwlzdDggW3RlbXAxXT1yMTIsMTYJLy8gc2FsX3JhCisJc3Q4IFt0ZW1wMl09cjEwLDE2CS8vIHNhbF9ncAorCW1vdiByMTI9Y3IuaXNyCisJOzsKKwlzdDggW3RlbXAxXT1yMTcsMTYJLy8gcGFsX21pbl9zdGF0ZQorCXN0OCBbdGVtcDJdPXI2LDE2CS8vIHByZXZfSUE2NF9LUl9DVVJSRU5UCisJbW92IHI2PWNyLmlmYQorCTs7CisJc3Q4IFt0ZW1wMV09cjAsMTYJLy8gcHJldl90YXNrLCBzdGFydHMgb2ZmIGFzIE5VTEwKKwlzdDggW3RlbXAyXT1yMTIsMTYJLy8gY3IuaXNyCisJbW92IHIxMj1jci5pdGlyCisJOzsKKwlzdDggW3RlbXAxXT1yNiwxNgkvLyBjci5pZmEKKwlzdDggW3RlbXAyXT1yMTIsMTYJLy8gY3IuaXRpcgorCW1vdiByMTI9Y3IuaWltCisJOzsKKwlzdDggW3RlbXAxXT1yMTEsMTYJLy8gY3IuaWlwYQorCXN0OCBbdGVtcDJdPXIxMiwxNgkvLyBjci5paW0KKwltb3YgcjY9Y3IuaWhhCisocDEpCW1vdiByMTI9SUE2NF9NQ0FfQ09MRF9CT09UCisocDIpCW1vdiByMTI9SUE2NF9JTklUX1dBUk1fQk9PVAorCTs7CisJc3Q4IFt0ZW1wMV09cjYsMTYJLy8gY3IuaWhhCisJc3Q4IFt0ZW1wMl09cjEyCQkvLyBvc19zdGF0dXMsIGRlZmF1bHQgaXMgY29sZCBib290CisJbW92IHI2PUlBNjRfTUNBX1NBTUVfQ09OVEVYVAorCTs7CisJc3Q4IFt0ZW1wMV09cjYJCS8vIGNvbnRleHQsIGRlZmF1bHQgaXMgc2FtZSBjb250ZXh0CisKKwkvLyBTYXZlIHRoZSBwdF9yZWdzIGRhdGEgdGhhdCBpcyBub3QgaW4gbWluc3RhdGUuICBUaGUgcHJldmlvdXMgY29kZQorCS8vIGxlZnQgcmVncyBhdCBzb3MuCisJYWRkIHJlZ3M9TUNBX1BUX1JFR1NfT0ZGU0VULU1DQV9TT1NfT0ZGU0VULCByZWdzCisJOzsKKwlhZGQgdGVtcDE9UFQoQjYpLCByZWdzCisJbW92IHRlbXAzPWI2CisJbW92IHRlbXA0PWI3CisJYWRkIHRlbXAyPVBUKEI3KSwgcmVncworCTs7CisJc3Q4IFt0ZW1wMV09dGVtcDMsUFQoQVJfQ1NEKS1QVChCNikJCS8vIHNhdmUgYjYKKwlzdDggW3RlbXAyXT10ZW1wNCxQVChBUl9TU0QpLVBUKEI3KQkJLy8gc2F2ZSBiNworCW1vdiB0ZW1wMz1hci5jc2QKKwltb3YgdGVtcDQ9YXIuc3NkCisJY292ZXIJCQkJCQkvLyBtdXN0IGJlIGxhc3QgaW4gZ3JvdXAKKwk7OworCXN0OCBbdGVtcDFdPXRlbXAzLFBUKEFSX1VOQVQpLVBUKEFSX0NTRCkJLy8gc2F2ZSBhci5jc2QKKwlzdDggW3RlbXAyXT10ZW1wNCxQVChBUl9QRlMpLVBUKEFSX1NTRCkJCS8vIHNhdmUgYXIuc3NkCisJbW92IHRlbXAzPWFyLnVuYXQKKwltb3YgdGVtcDQ9YXIucGZzCisJOzsKKwlzdDggW3RlbXAxXT10ZW1wMyxQVChBUl9STkFUKS1QVChBUl9VTkFUKQkvLyBzYXZlIGFyLnVuYXQKKwlzdDggW3RlbXAyXT10ZW1wNCxQVChBUl9CU1BTVE9SRSktUFQoQVJfUEZTKQkvLyBzYXZlIGFyLnBmcworCW1vdiB0ZW1wMz1hci5ybmF0CisJbW92IHRlbXA0PWFyLmJzcHN0b3JlCisJOzsKKwlzdDggW3RlbXAxXT10ZW1wMyxQVChMT0FEUlMpLVBUKEFSX1JOQVQpCS8vIHNhdmUgYXIucm5hdAorCXN0OCBbdGVtcDJdPXRlbXA0LFBUKEFSX0ZQU1IpLVBUKEFSX0JTUFNUT1JFKQkvLyBzYXZlIGFyLmJzcHN0b3JlCisJbW92IHRlbXAzPWFyLmJzcAorCTs7CisJc3ViIHRlbXAzPXRlbXAzLCB0ZW1wNAkvLyBhci5ic3AgLSBhci5ic3BzdG9yZQorCW1vdiB0ZW1wND1hci5mcHNyCisJOzsKKwlzaGwgdGVtcDM9dGVtcDMsMTYJLy8gY29tcHV0ZSBhci5yc2MgdG8gYmUgdXNlZCBmb3IgImxvYWRycyIKKwk7OworCXN0OCBbdGVtcDFdPXRlbXAzLFBUKEFSX0NDViktUFQoTE9BRFJTKQkJLy8gc2F2ZSBsb2FkcnMKKwlzdDggW3RlbXAyXT10ZW1wNCxQVChGNiktUFQoQVJfRlBTUikJCS8vIHNhdmUgYXIuZnBzcgorCW1vdiB0ZW1wMz1hci5jY3YKKwk7OworCXN0OCBbdGVtcDFdPXRlbXAzLFBUKEY3KS1QVChBUl9DQ1YpCQkvLyBzYXZlIGFyLmNjdgorCXN0Zi5zcGlsbCBbdGVtcDJdPWY2LFBUKEY4KS1QVChGNikKKwk7OworCXN0Zi5zcGlsbCBbdGVtcDFdPWY3LFBUKEY5KS1QVChGNykKKwlzdGYuc3BpbGwgW3RlbXAyXT1mOCxQVChGMTApLVBUKEY4KQorCTs7CisJc3RmLnNwaWxsIFt0ZW1wMV09ZjksUFQoRjExKS1QVChGOSkKKwlzdGYuc3BpbGwgW3RlbXAyXT1mMTAKKwk7OworCXN0Zi5zcGlsbCBbdGVtcDFdPWYxMQorCisJLy8gU2F2ZSB0aGUgc3dpdGNoX3N0YWNrIGRhdGEgdGhhdCBpcyBub3QgaW4gbWluc3RhdGUgbm9yIHB0X3JlZ3MuICBUaGUKKwkvLyBwcmV2aW91cyBjb2RlIGxlZnQgcmVncyBhdCBwdF9yZWdzLgorCWFkZCByZWdzPU1DQV9TV0lUQ0hfU1RBQ0tfT0ZGU0VULU1DQV9QVF9SRUdTX09GRlNFVCwgcmVncworCTs7CisJYWRkIHRlbXAxPVNXKEYyKSwgcmVncworCWFkZCB0ZW1wMj1TVyhGMyksIHJlZ3MKKwk7OworCXN0Zi5zcGlsbCBbdGVtcDFdPWYyLDMyCisJc3RmLnNwaWxsIFt0ZW1wMl09ZjMsMzIKKwk7OworCXN0Zi5zcGlsbCBbdGVtcDFdPWY0LDMyCisJc3RmLnNwaWxsIFt0ZW1wMl09ZjUsMzIKKwk7OworCXN0Zi5zcGlsbCBbdGVtcDFdPWYxMiwzMgorCXN0Zi5zcGlsbCBbdGVtcDJdPWYxMywzMgorCTs7CisJc3RmLnNwaWxsIFt0ZW1wMV09ZjE0LDMyCisJc3RmLnNwaWxsIFt0ZW1wMl09ZjE1LDMyCisJOzsKKwlzdGYuc3BpbGwgW3RlbXAxXT1mMTYsMzIKKwlzdGYuc3BpbGwgW3RlbXAyXT1mMTcsMzIKKwk7OworCXN0Zi5zcGlsbCBbdGVtcDFdPWYxOCwzMgorCXN0Zi5zcGlsbCBbdGVtcDJdPWYxOSwzMgorCTs7CisJc3RmLnNwaWxsIFt0ZW1wMV09ZjIwLDMyCisJc3RmLnNwaWxsIFt0ZW1wMl09ZjIxLDMyCisJOzsKKwlzdGYuc3BpbGwgW3RlbXAxXT1mMjIsMzIKKwlzdGYuc3BpbGwgW3RlbXAyXT1mMjMsMzIKKwk7OworCXN0Zi5zcGlsbCBbdGVtcDFdPWYyNCwzMgorCXN0Zi5zcGlsbCBbdGVtcDJdPWYyNSwzMgorCTs7CisJc3RmLnNwaWxsIFt0ZW1wMV09ZjI2LDMyCisJc3RmLnNwaWxsIFt0ZW1wMl09ZjI3LDMyCisJOzsKKwlzdGYuc3BpbGwgW3RlbXAxXT1mMjgsMzIKKwlzdGYuc3BpbGwgW3RlbXAyXT1mMjksMzIKKwk7OworCXN0Zi5zcGlsbCBbdGVtcDFdPWYzMCxTVyhCMiktU1coRjMwKQorCXN0Zi5zcGlsbCBbdGVtcDJdPWYzMSxTVyhCMyktU1coRjMxKQorCW1vdiB0ZW1wMz1iMgorCW1vdiB0ZW1wND1iMworCTs7CisJc3Q4IFt0ZW1wMV09dGVtcDMsMTYJLy8gc2F2ZSBiMgorCXN0OCBbdGVtcDJdPXRlbXA0LDE2CS8vIHNhdmUgYjMKKwltb3YgdGVtcDM9YjQKKwltb3YgdGVtcDQ9YjUKKwk7OworCXN0OCBbdGVtcDFdPXRlbXAzLFNXKEFSX0xDKS1TVyhCNCkJLy8gc2F2ZSBiNAorCXN0OCBbdGVtcDJdPXRlbXA0CS8vIHNhdmUgYjUKKwltb3YgdGVtcDM9YXIubGMKKwk7OworCXN0OCBbdGVtcDFdPXRlbXAzCS8vIHNhdmUgYXIubGMKKworCS8vIEZJWE1FOiBTb21lIHByb21zIGFyZSBpbmNvcnJlY3RseSBhY2Nlc3NpbmcgdGhlIG1pbnN0YXRlIGFyZWEgYXMKKwkvLyBjYWNoZWQgZGF0YS4gIFRoZSBDIGNvZGUgdXNlcyByZWdpb24gNiwgdW5jYWNoZWQgdmlydHVhbC4gIEVuc3VyZQorCS8vIHRoYXQgdGhlcmUgaXMgbm8gY2FjaGUgZGF0YSBseWluZyBhcm91bmQgZm9yIHRoZSBmaXJzdCAxSyBvZiB0aGUKKwkvLyBtaW5zdGF0ZSBhcmVhLgorCS8vIFJlbW92ZSB0aGlzIGNvZGUgaW4gU2VwdGVtYmVyIDIwMDYsIHRoYXQgZ2l2ZXMgcGxhdGZvcm1zIGEgeWVhciB0bworCS8vIGZpeCB0aGVpciBwcm9tcyBhbmQgZ2V0IHRoZWlyIGN1c3RvbWVycyB1cGRhdGVkLgorCisJYWRkIHIxPTMyKjEscjE3CisJYWRkIHIyPTMyKjIscjE3CisJYWRkIHIzPTMyKjMscjE3CisJYWRkIHI0PTMyKjQscjE3CisJYWRkIHI1PTMyKjUscjE3CisJYWRkIHI2PTMyKjYscjE3CisJYWRkIHI3PTMyKjcscjE3CisJOzsKKwlmYyByMTcKKwlmYyByMQorCWZjIHIyCisJZmMgcjMKKwlmYyByNAorCWZjIHI1CisJZmMgcjYKKwlmYyByNworCWFkZCByMTc9MzIqOCxyMTcKKwlhZGQgcjE9MzIqOCxyMQorCWFkZCByMj0zMio4LHIyCisJYWRkIHIzPTMyKjgscjMKKwlhZGQgcjQ9MzIqOCxyNAorCWFkZCByNT0zMio4LHI1CisJYWRkIHI2PTMyKjgscjYKKwlhZGQgcjc9MzIqOCxyNworCTs7CisJZmMgcjE3CisJZmMgcjEKKwlmYyByMgorCWZjIHIzCisJZmMgcjQKKwlmYyByNQorCWZjIHI2CisJZmMgcjcKKwlhZGQgcjE3PTMyKjgscjE3CisJYWRkIHIxPTMyKjgscjEKKwlhZGQgcjI9MzIqOCxyMgorCWFkZCByMz0zMio4LHIzCisJYWRkIHI0PTMyKjgscjQKKwlhZGQgcjU9MzIqOCxyNQorCWFkZCByNj0zMio4LHI2CisJYWRkIHI3PTMyKjgscjcKKwk7OworCWZjIHIxNworCWZjIHIxCisJZmMgcjIKKwlmYyByMworCWZjIHI0CisJZmMgcjUKKwlmYyByNgorCWZjIHI3CisJYWRkIHIxNz0zMio4LHIxNworCWFkZCByMT0zMio4LHIxCisJYWRkIHIyPTMyKjgscjIKKwlhZGQgcjM9MzIqOCxyMworCWFkZCByND0zMio4LHI0CisJYWRkIHI1PTMyKjgscjUKKwlhZGQgcjY9MzIqOCxyNgorCWFkZCByNz0zMio4LHI3CisJOzsKKwlmYyByMTcKKwlmYyByMQorCWZjIHIyCisJZmMgcjMKKwlmYyByNAorCWZjIHI1CisJZmMgcjYKKwlmYyByNworCisJYnIuc3B0ayBiMAorCisvL0VuZFN0dWIvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworLy8rKworLy8gTmFtZToKKy8vCWlhNjRfc3RhdGVfcmVzdG9yZSgpCisvLworLy8gU3R1YiBEZXNjcmlwdGlvbjoKKy8vCisvLwlSZXN0b3JlIHRoZSBTQUwvT1Mgc3RhdGUuICBUaGlzIGlzIHNlbnNpdGl2ZSB0byB0aGUgbGF5b3V0IG9mIHN0cnVjdAorLy8JaWE2NF9zYWxfb3Nfc3RhdGUgaW4gbWNhLmguCisvLworLy8JcjIgY29udGFpbnMgdGhlIHJldHVybiBhZGRyZXNzLCByMyBjb250YWlucyBlaXRoZXIKKy8vCUlBNjRfTUNBX0NQVV9NQ0FfU1RBQ0tfT0ZGU0VUIG9yIElBNjRfTUNBX0NQVV9JTklUX1NUQUNLX09GRlNFVC4KKy8vCisvLwlJbiBhZGRpdGlvbiB0byB0aGUgU0FMIHRvIE9TIHN0YXRlLCB0aGlzIHJvdXRpbmUgcmVzdG9yZXMgYWxsIHRoZQorLy8JcmVnaXN0ZXJzIHRoYXQgYXBwZWFyIGluIHN0cnVjdCBwdF9yZWdzIGFuZCBzdHJ1Y3Qgc3dpdGNoX3N0YWNrLAorLy8JZXhjbHVkaW5nIHRob3NlIGluIHRoZSBQQUwgbWluc3RhdGUgYXJlYS4KKy8vCisvLy0tCisKK2lhNjRfc3RhdGVfcmVzdG9yZToKKwkvLyBSZXN0b3JlIHRoZSBzd2l0Y2hfc3RhY2sgZGF0YSB0aGF0IGlzIG5vdCBpbiBtaW5zdGF0ZSBub3IgcHRfcmVncy4KKwlhZGQgcmVncz1NQ0FfU1dJVENIX1NUQUNLX09GRlNFVCwgcjMKKwltb3YgYjA9cjIJCS8vIHNhdmUgcmV0dXJuIGFkZHJlc3MKKwk7OworCUdFVF9JQTY0X01DQV9EQVRBKHRlbXAyKQorCTs7CisJYWRkIHJlZ3M9dGVtcDIsIHJlZ3MKKwk7OworCWFkZCB0ZW1wMT1TVyhGMiksIHJlZ3MKKwlhZGQgdGVtcDI9U1coRjMpLCByZWdzCisJOzsKKwlsZGYuZmlsbCBmMj1bdGVtcDFdLDMyCisJbGRmLmZpbGwgZjM9W3RlbXAyXSwzMgorCTs7CisJbGRmLmZpbGwgZjQ9W3RlbXAxXSwzMgorCWxkZi5maWxsIGY1PVt0ZW1wMl0sMzIKKwk7OworCWxkZi5maWxsIGYxMj1bdGVtcDFdLDMyCisJbGRmLmZpbGwgZjEzPVt0ZW1wMl0sMzIKKwk7OworCWxkZi5maWxsIGYxND1bdGVtcDFdLDMyCisJbGRmLmZpbGwgZjE1PVt0ZW1wMl0sMzIKKwk7OworCWxkZi5maWxsIGYxNj1bdGVtcDFdLDMyCisJbGRmLmZpbGwgZjE3PVt0ZW1wMl0sMzIKKwk7OworCWxkZi5maWxsIGYxOD1bdGVtcDFdLDMyCisJbGRmLmZpbGwgZjE5PVt0ZW1wMl0sMzIKKwk7OworCWxkZi5maWxsIGYyMD1bdGVtcDFdLDMyCisJbGRmLmZpbGwgZjIxPVt0ZW1wMl0sMzIKKwk7OworCWxkZi5maWxsIGYyMj1bdGVtcDFdLDMyCisJbGRmLmZpbGwgZjIzPVt0ZW1wMl0sMzIKKwk7OworCWxkZi5maWxsIGYyND1bdGVtcDFdLDMyCisJbGRmLmZpbGwgZjI1PVt0ZW1wMl0sMzIKKwk7OworCWxkZi5maWxsIGYyNj1bdGVtcDFdLDMyCisJbGRmLmZpbGwgZjI3PVt0ZW1wMl0sMzIKKwk7OworCWxkZi5maWxsIGYyOD1bdGVtcDFdLDMyCisJbGRmLmZpbGwgZjI5PVt0ZW1wMl0sMzIKKwk7OworCWxkZi5maWxsIGYzMD1bdGVtcDFdLFNXKEIyKS1TVyhGMzApCisJbGRmLmZpbGwgZjMxPVt0ZW1wMl0sU1coQjMpLVNXKEYzMSkKKwk7OworCWxkOCB0ZW1wMz1bdGVtcDFdLDE2CS8vIHJlc3RvcmUgYjIKKwlsZDggdGVtcDQ9W3RlbXAyXSwxNgkvLyByZXN0b3JlIGIzCisJOzsKKwltb3YgYjI9dGVtcDMKKwltb3YgYjM9dGVtcDQKKwlsZDggdGVtcDM9W3RlbXAxXSxTVyhBUl9MQyktU1coQjQpCS8vIHJlc3RvcmUgYjQKKwlsZDggdGVtcDQ9W3RlbXAyXQkvLyByZXN0b3JlIGI1CisJOzsKKwltb3YgYjQ9dGVtcDMKKwltb3YgYjU9dGVtcDQKKwlsZDggdGVtcDM9W3RlbXAxXQkvLyByZXN0b3JlIGFyLmxjCisJOzsKKwltb3YgYXIubGM9dGVtcDMKKworCS8vIFJlc3RvcmUgdGhlIHB0X3JlZ3MgZGF0YSB0aGF0IGlzIG5vdCBpbiBtaW5zdGF0ZS4gIFRoZSBwcmV2aW91cyBjb2RlCisJLy8gbGVmdCByZWdzIGF0IHN3aXRjaF9zdGFjay4KKwlhZGQgcmVncz1NQ0FfUFRfUkVHU19PRkZTRVQtTUNBX1NXSVRDSF9TVEFDS19PRkZTRVQsIHJlZ3MKKwk7OworCWFkZCB0ZW1wMT1QVChCNiksIHJlZ3MKKwlhZGQgdGVtcDI9UFQoQjcpLCByZWdzCisJOzsKKwlsZDggdGVtcDM9W3RlbXAxXSxQVChBUl9DU0QpLVBUKEI2KQkJLy8gcmVzdG9yZSBiNgorCWxkOCB0ZW1wND1bdGVtcDJdLFBUKEFSX1NTRCktUFQoQjcpCQkvLyByZXN0b3JlIGI3CisJOzsKKwltb3YgYjY9dGVtcDMKKwltb3YgYjc9dGVtcDQKKwlsZDggdGVtcDM9W3RlbXAxXSxQVChBUl9VTkFUKS1QVChBUl9DU0QpCS8vIHJlc3RvcmUgYXIuY3NkCisJbGQ4IHRlbXA0PVt0ZW1wMl0sUFQoQVJfUEZTKS1QVChBUl9TU0QpCQkvLyByZXN0b3JlIGFyLnNzZAorCTs7CisJbW92IGFyLmNzZD10ZW1wMworCW1vdiBhci5zc2Q9dGVtcDQKKwlsZDggdGVtcDM9W3RlbXAxXQkJCQkvLyByZXN0b3JlIGFyLnVuYXQKKwlhZGQgdGVtcDE9UFQoQVJfQ0NWKS1QVChBUl9VTkFUKSwgdGVtcDEKKwlsZDggdGVtcDQ9W3RlbXAyXSxQVChBUl9GUFNSKS1QVChBUl9QRlMpCS8vIHJlc3RvcmUgYXIucGZzCisJOzsKKwltb3YgYXIudW5hdD10ZW1wMworCW1vdiBhci5wZnM9dGVtcDQKKwkvLyBhci5ybmF0LCBhci5ic3BzdG9yZSwgbG9hZHJzIGFyZSByZXN0b3JlIGluIGlhNjRfb2xkX3N0YWNrLgorCWxkOCB0ZW1wMz1bdGVtcDFdLFBUKEY2KS1QVChBUl9DQ1YpCQkvLyByZXN0b3JlIGFyLmNjdgorCWxkOCB0ZW1wND1bdGVtcDJdLFBUKEY3KS1QVChBUl9GUFNSKQkJLy8gcmVzdG9yZSBhci5mcHNyCisJOzsKKwltb3YgYXIuY2N2PXRlbXAzCisJbW92IGFyLmZwc3I9dGVtcDQKKwlsZGYuZmlsbCBmNj1bdGVtcDFdLFBUKEY4KS1QVChGNikKKwlsZGYuZmlsbCBmNz1bdGVtcDJdLFBUKEY5KS1QVChGNykKKwk7OworCWxkZi5maWxsIGY4PVt0ZW1wMV0sUFQoRjEwKS1QVChGOCkKKwlsZGYuZmlsbCBmOT1bdGVtcDJdLFBUKEYxMSktUFQoRjkpCisJOzsKKwlsZGYuZmlsbCBmMTA9W3RlbXAxXQorCWxkZi5maWxsIGYxMT1bdGVtcDJdCisKKwkvLyBSZXN0b3JlIHRoZSBTQUwgdG8gT1Mgc3RhdGUuIFRoZSBwcmV2aW91cyBjb2RlIGxlZnQgcmVncyBhdCBwdF9yZWdzLgorCWFkZCByZWdzPU1DQV9TT1NfT0ZGU0VULU1DQV9QVF9SRUdTX09GRlNFVCwgcmVncworCTs7CisJYWRkIHRlbXAxPUlBNjRfU0FMX09TX1NUQVRFX0NPTU1PTl9PRkZTRVQsIHJlZ3MKKwlhZGQgdGVtcDI9SUE2NF9TQUxfT1NfU1RBVEVfQ09NTU9OX09GRlNFVCs4LCByZWdzCisJOzsKKwlsZDggcjEyPVt0ZW1wMV0sMTYJLy8gc2FsX3JhCisJbGQ4IHI5PVt0ZW1wMl0sMTYJLy8gc2FsX2dwCisJOzsKKwlsZDggcjIyPVt0ZW1wMV0sMjQJLy8gcGFsX21pbl9zdGF0ZSwgdmlydHVhbC4gIHNraXAgcHJldl90YXNrCisJbGQ4IHIyMT1bdGVtcDJdLDE2CS8vIHByZXZfSUE2NF9LUl9DVVJSRU5UCisJOzsKKwlsZDggdGVtcDM9W3RlbXAxXSwxNgkvLyBjci5pc3IKKwlsZDggdGVtcDQ9W3RlbXAyXSwxNgkvLyBjci5pZmEKKwk7OworCW1vdiBjci5pc3I9dGVtcDMKKwltb3YgY3IuaWZhPXRlbXA0CisJbGQ4IHRlbXAzPVt0ZW1wMV0sMTYJLy8gY3IuaXRpcgorCWxkOCB0ZW1wND1bdGVtcDJdLDE2CS8vIGNyLmlpcGEKKwk7OworCW1vdiBjci5pdGlyPXRlbXAzCisJbW92IGNyLmlpcGE9dGVtcDQKKwlsZDggdGVtcDM9W3RlbXAxXSwxNgkvLyBjci5paW0KKwlsZDggdGVtcDQ9W3RlbXAyXSwxNgkvLyBjci5paGEKKwk7OworCW1vdiBjci5paW09dGVtcDMKKwltb3YgY3IuaWhhPXRlbXA0CisJZGVwIHIyMj0wLHIyMiw2MiwyCS8vIHBhbF9taW5fc3RhdGUsIHBoeXNpY2FsLCB1bmNhY2hlZAorCW1vdiBJQTY0X0tSKENVUlJFTlQpPXIyMQorCWxkOCByOD1bdGVtcDFdCQkvLyBvc19zdGF0dXMKKwlsZDggcjEwPVt0ZW1wMl0JCS8vIGNvbnRleHQKKworCWJyLnNwdGsgYjAKKworLy9FbmRTdHViLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKy8vKysKKy8vIE5hbWU6CisvLwlpYTY0X25ld19zdGFjaygpCisvLworLy8gU3R1YiBEZXNjcmlwdGlvbjoKKy8vCisvLwlTd2l0Y2ggdG8gdGhlIE1DQS9JTklUIHN0YWNrLgorLy8KKy8vCXIyIGNvbnRhaW5zIHRoZSByZXR1cm4gYWRkcmVzcywgcjMgY29udGFpbnMgZWl0aGVyCisvLwlJQTY0X01DQV9DUFVfTUNBX1NUQUNLX09GRlNFVCBvciBJQTY0X01DQV9DUFVfSU5JVF9TVEFDS19PRkZTRVQuCisvLworLy8JT24gZW50cnkgUkJTIGlzIHN0aWxsIG9uIHRoZSBvcmlnaW5hbCBzdGFjaywgdGhpcyByb3V0aW5lIHN3aXRjaGVzIFJCUworLy8JdG8gdXNlIHRoZSBNQ0EvSU5JVCBzdGFjay4KKy8vCisvLwlPbiBlbnRyeSwgc29zLT5wYWxfbWluX3N0YXRlIGlzIHBoeXNpY2FsLCBvbiBleGl0IGl0IGlzIHZpcnR1YWwuCisvLworLy8tLQorCitpYTY0X25ld19zdGFjazoKKwlhZGQgcmVncz1NQ0FfUFRfUkVHU19PRkZTRVQsIHIzCisJYWRkIHRlbXAyPU1DQV9TT1NfT0ZGU0VUK0lBNjRfU0FMX09TX1NUQVRFX1BBTF9NSU5fU1RBVEVfT0ZGU0VULCByMworCW1vdiBiMD1yMgkJCS8vIHNhdmUgcmV0dXJuIGFkZHJlc3MKKwlHRVRfSUE2NF9NQ0FfREFUQSh0ZW1wMSkKKwlpbnZhbGEKKwk7OworCWFkZCB0ZW1wMj10ZW1wMiwgdGVtcDEJCS8vIHN0cnVjdCBpYTY0X3NhbF9vc19zdGF0ZS5wYWxfbWluX3N0YXRlIG9uIE1DQSBvciBJTklUIHN0YWNrCisJYWRkIHJlZ3M9cmVncywgdGVtcDEJCS8vIHN0cnVjdCBwdF9yZWdzIG9uIE1DQSBvciBJTklUIHN0YWNrCisJOzsKKwkvLyBBZGRyZXNzIG9mIG1pbnN0YXRlIGFyZWEgcHJvdmlkZWQgYnkgUEFMIGlzIHBoeXNpY2FsLCB1bmNhY2hlYWJsZS4KKwkvLyBDb252ZXJ0IHRvIExpbnV4IHZpcnR1YWwgYWRkcmVzcyBpbiByZWdpb24gNiBmb3IgQyBjb2RlLgorCWxkOCBtcz1bdGVtcDJdCQkJLy8gcGFsX21pbl9zdGF0ZSwgcGh5c2ljYWwKKwk7OworCWRlcCB0ZW1wMT0tMSxtcyw2MiwyCQkvLyBzZXQgcmVnaW9uIDYKKwltb3YgdGVtcDM9SUE2NF9SQlNfT0ZGU0VULU1DQV9QVF9SRUdTX09GRlNFVAorCTs7CisJc3Q4IFt0ZW1wMl09dGVtcDEJCS8vIHBhbF9taW5fc3RhdGUsIHZpcnR1YWwKKworCWFkZCB0ZW1wND10ZW1wMywgcmVncwkJLy8gc3RhcnQgb2YgYnNwc3RvcmUgb24gbmV3IHN0YWNrCisJOzsKKwltb3YgYXIuYnNwc3RvcmU9dGVtcDQJCS8vIHN3aXRjaCBSQlMgdG8gTUNBL0lOSVQgc3RhY2sKKwk7OworCWZsdXNocnMJCQkJLy8gbXVzdCBiZSBmaXJzdCBpbiBncm91cAorCWJyLnNwdGsgYjAKKworLy9FbmRTdHViLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKy8vKysKKy8vIE5hbWU6CisvLwlpYTY0X29sZF9zdGFjaygpCisvLworLy8gU3R1YiBEZXNjcmlwdGlvbjoKKy8vCisvLwlTd2l0Y2ggdG8gdGhlIG9sZCBzdGFjay4KKy8vCisvLwlyMiBjb250YWlucyB0aGUgcmV0dXJuIGFkZHJlc3MsIHIzIGNvbnRhaW5zIGVpdGhlcgorLy8JSUE2NF9NQ0FfQ1BVX01DQV9TVEFDS19PRkZTRVQgb3IgSUE2NF9NQ0FfQ1BVX0lOSVRfU1RBQ0tfT0ZGU0VULgorLy8KKy8vCU9uIGVudHJ5LCBwYWxfbWluX3N0YXRlIGlzIHZpcnR1YWwsIG9uIGV4aXQgaXQgaXMgcGh5c2ljYWwuCisvLworLy8JT24gZW50cnkgUkJTIGlzIG9uIHRoZSBNQ0EvSU5JVCBzdGFjaywgdGhpcyByb3V0aW5lIHN3aXRjaGVzIFJCUworLy8JYmFjayB0byB0aGUgcHJldmlvdXMgc3RhY2suCisvLworLy8JVGhlIHBzciBpcyBzZXQgdG8gYWxsIHplcm9lcy4gIFNBTCByZXR1cm4gcmVxdWlyZXMgZWl0aGVyIGFsbCB6ZXJvZXMgb3IKKy8vCWp1c3QgcHNyLm1jIHNldC4gIExlYXZpbmcgcHNyLm1jIG9mZiBhbGxvd3MgSU5JVCB0byBiZSBpc3N1ZWQgaWYgdGhpcworLy8JY29kZSBkb2VzIG5vdCBwZXJmb3JtIGNvcnJlY3RseS4KKy8vCisvLwlUaGUgZGlydHkgcmVnaXN0ZXJzIGF0IHRoZSB0aW1lIG9mIHRoZSBldmVudCB3ZXJlIGZsdXNoZWQgdG8gdGhlCisvLwlNQ0EvSU5JVCBzdGFjayBpbiBpYTY0X3B0X3JlZ3Nfc2F2ZSgpLiAgUmVzdG9yZSB0aGUgZGlydHkgcmVnaXN0ZXJzCisvLwliZWZvcmUgcmV2ZXJ0aW5nIHRvIHRoZSBwcmV2aW91cyBic3BzdG9yZS4KKy8vLS0KKworaWE2NF9vbGRfc3RhY2s6CisJYWRkIHJlZ3M9TUNBX1BUX1JFR1NfT0ZGU0VULCByMworCW1vdiBiMD1yMgkJCS8vIHNhdmUgcmV0dXJuIGFkZHJlc3MKKwlHRVRfSUE2NF9NQ0FfREFUQSh0ZW1wMikKKwlMT0FEX1BIWVNJQ0FMKHAwLHRlbXAxLDFmKQorCTs7CisJbW92IGNyLmlwc3I9cjAKKwltb3YgY3IuaWZzPXIwCisJbW92IGNyLmlpcD10ZW1wMQorCTs7CisJaW52YWxhCisJcmZpCisxOgorCisJYWRkIHJlZ3M9cmVncywgdGVtcDIJCS8vIHN0cnVjdCBwdF9yZWdzIG9uIE1DQSBvciBJTklUIHN0YWNrCisJOzsKKwlhZGQgdGVtcDE9UFQoTE9BRFJTKSwgcmVncworCTs7CisJbGQ4IHRlbXAyPVt0ZW1wMV0sUFQoQVJfQlNQU1RPUkUpLVBUKExPQURSUykJLy8gcmVzdG9yZSBsb2FkcnMKKwk7OworCWxkOCB0ZW1wMz1bdGVtcDFdLFBUKEFSX1JOQVQpLVBUKEFSX0JTUFNUT1JFKQkvLyByZXN0b3JlIGFyLmJzcHN0b3JlCisJbW92IGFyLnJzYz10ZW1wMgorCTs7CisJbG9hZHJzCisJbGQ4IHRlbXA0PVt0ZW1wMV0JCS8vIHJlc3RvcmUgYXIucm5hdAorCTs7CisJbW92IGFyLmJzcHN0b3JlPXRlbXAzCQkvLyBiYWNrIHRvIG9sZCBzdGFjaworCTs7CisJbW92IGFyLnJuYXQ9dGVtcDQKKwk7OworCisJYnIuc3B0ayBiMAorCisvL0VuZFN0dWIvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworLy8rKworLy8gTmFtZToKKy8vCWlhNjRfc2V0X2tlcm5lbF9yZWdpc3RlcnMoKQorLy8KKy8vIFN0dWIgRGVzY3JpcHRpb246CisvLworLy8JU2V0IHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIEMgY29kZSBpbiBvcmRlciB0byBydW4gb24gYW4KKy8vCU1DQS9JTklUIHN0YWNrLgorLy8KKy8vCXIyIGNvbnRhaW5zIHRoZSByZXR1cm4gYWRkcmVzcywgcjMgY29udGFpbnMgZWl0aGVyCisvLwlJQTY0X01DQV9DUFVfTUNBX1NUQUNLX09GRlNFVCBvciBJQTY0X01DQV9DUFVfSU5JVF9TVEFDS19PRkZTRVQuCisvLworLy8tLQorCitpYTY0X3NldF9rZXJuZWxfcmVnaXN0ZXJzOgorCWFkZCB0ZW1wMz1NQ0FfU1BfT0ZGU0VULCByMworCWFkZCB0ZW1wND1NQ0FfU09TX09GRlNFVCtJQTY0X1NBTF9PU19TVEFURV9PU19HUF9PRkZTRVQsIHIzCisJbW92IGIwPXIyCQkvLyBzYXZlIHJldHVybiBhZGRyZXNzCisJR0VUX0lBNjRfTUNBX0RBVEEodGVtcDEpCisJOzsKKwlhZGQgdGVtcDQ9dGVtcDQsIHRlbXAxCS8vICZzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUub3NfZ3AKKwlhZGQgcjEyPXRlbXAxLCB0ZW1wMwkvLyBrZXJuZWwgc3RhY2sgcG9pbnRlciBvbiBNQ0EvSU5JVCBzdGFjaworCWFkZCByMTM9dGVtcDEsIHIzCS8vIHNldCBjdXJyZW50IHRvIHN0YXJ0IG9mIE1DQS9JTklUIHN0YWNrCisJOzsKKwlsZDggcjE9W3RlbXA0XQkJLy8gT1MgR1AgZnJvbSBTQUwgT1Mgc3RhdGUKKwk7OworCURBVEFfUEFfVE9fVkEocjEsdGVtcDEpCisJREFUQV9QQV9UT19WQShyMTIsdGVtcDIpCisJREFUQV9QQV9UT19WQShyMTMsdGVtcDMpCisJOzsKKwltb3YgSUE2NF9LUihDVVJSRU5UKT1yMTMKKworCS8vIEZJWE1FOiBkbyBJIG5lZWQgdG8gd2lyZSBJQTY0X0tSX0NVUlJFTlRfU1RBQ0sgYW5kIElBNjRfVFJfQ1VSUkVOVF9TVEFDSz8KKworCWJyLnNwdGsgYjAKKworLy9FbmRTdHViLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjdW5kZWYJbXMKKyN1bmRlZglyZWdzCisjdW5kZWYJdGVtcDEKKyN1bmRlZgl0ZW1wMgorI3VuZGVmCXRlbXAzCisjdW5kZWYJdGVtcDQKKworCisvLyBTdXBwb3J0IGZ1bmN0aW9uIGZvciBtY2EuYywgaXQgaXMgaGVyZSB0byBhdm9pZCB1c2luZyBpbmxpbmUgYXNtLiAgR2l2ZW4gdGhlCisvLyBhZGRyZXNzIG9mIGFuIHJuYXQgc2xvdCwgaWYgdGhhdCBhZGRyZXNzIGlzIGJlbG93IHRoZSBjdXJyZW50IGFyLmJzcHN0b3JlCisvLyB0aGVuIHJldHVybiB0aGUgY29udGVudHMgb2YgdGhhdCBzbG90LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBjb250ZW50cyBvZgorLy8gYXIucm5hdC4KK0dMT0JBTF9FTlRSWShpYTY0X2dldF9ybmF0KQorCWFsbG9jIHIxND1hci5wZnMsMSwwLDAsMAorCW1vdiBhci5yc2M9MAorCTs7CisJbW92IHIxND1hci5ic3BzdG9yZQorCTs7CisJY21wLmx0IHA2LHA3PWluMCxyMTQKKwk7OworKHA2KQlsZDggcjg9W2luMF0KKyhwNykJbW92IHI4PWFyLnJuYXQKKwltb3YgYXIucnNjPTMKKwlici5yZXQuc3B0ay5tYW55IHJwCitFTkQoaWE2NF9nZXRfcm5hdCkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2Rydi5jIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2FfZHJ2LmMKaW5kZXggYWJjMDExMy4uNmU2ODM3NCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9tY2FfZHJ2LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2FfZHJ2LmMKQEAgLTQsNiArNCw4IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA0IEZVSklUU1UgTElNSVRFRAogICogQ29weXJpZ2h0IChDKSBIaWRldG9zaGkgU2V0byAoc2V0by5oaWRldG9zaGlAanAuZnVqaXRzdS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgS2VpdGggT3dlbnMgPGthb3NAc2dpLmNvbT4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0zOCwxMCArNDAsNiBAQAogLyogbWF4IHNpemUgb2YgU0FMIGVycm9yIHJlY29yZCAoZGVmYXVsdCkgKi8KIHN0YXRpYyBpbnQgc2FsX3JlY19tYXggPSAxMDAwMDsKIAotLyogZnJvbSBtY2EuYyAqLwotc3RhdGljIGlhNjRfbWNhX3NhbF90b19vc19zdGF0ZV90ICpzYWxfdG9fb3NfaGFuZG9mZl9zdGF0ZTsKLXN0YXRpYyBpYTY0X21jYV9vc190b19zYWxfc3RhdGVfdCAqb3NfdG9fc2FsX2hhbmRvZmZfc3RhdGU7Ci0KIC8qIGZyb20gbWNhX2Rydl9hc20uUyAqLwogZXh0ZXJuIHZvaWQgKm1jYV9oYW5kbGVyX2JoaG9vayh2b2lkKTsKIApAQCAtMzE2LDcgKzMxNCw4IEBACiAgKi8KIAogc3RhdGljIG1jYV90eXBlX3QKLWlzX21jYV9nbG9iYWwocGVpZHhfdGFibGVfdCAqcGVpZHgsIHBhbF9idXNfY2hlY2tfaW5mb190ICpwYmNpKQoraXNfbWNhX2dsb2JhbChwZWlkeF90YWJsZV90ICpwZWlkeCwgcGFsX2J1c19jaGVja19pbmZvX3QgKnBiY2ksCisJICAgICAgc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlICpzb3MpCiB7CiAJcGFsX3Byb2Nlc3Nvcl9zdGF0ZV9pbmZvX3QgKnBzcCA9IChwYWxfcHJvY2Vzc29yX3N0YXRlX2luZm9fdCopcGVpZHhfcHNwKHBlaWR4KTsKIApAQCAtMzI3LDcgKzMyNiw3IEBACiAJICogVGhlcmVmb3JlIGl0IGlzIGxvY2FsIE1DQSB3aGVuIHJlbmRlenZvdXMgaGFzIG5vdCBiZWVuIHJlcXVlc3RlZC4KIAkgKiBGYWlsZWQgdG8gcmVuZGV6dm91cywgdGhlIHN5c3RlbSBtdXN0IGJlIGRvd24uCiAJICovCi0Jc3dpdGNoIChzYWxfdG9fb3NfaGFuZG9mZl9zdGF0ZS0+aW1zdG9fcmVuZGV6X3N0YXRlKSB7CisJc3dpdGNoIChzb3MtPnJ2X3JjKSB7CiAJCWNhc2UgLTE6IC8qIFNBTCByZW5kZXp2b3VzIHVuc3VjY2Vzc2Z1bCAqLwogCQkJcmV0dXJuIE1DQV9JU19HTE9CQUw7CiAJCWNhc2UgIDA6IC8qIFNBTCByZW5kZXp2b3VzIG5vdCByZXF1aXJlZCAqLwpAQCAtMzg4LDcgKzM4Nyw4IEBACiAgKi8KIAogc3RhdGljIGludAotcmVjb3Zlcl9mcm9tX3JlYWRfZXJyb3Ioc2xpZHhfdGFibGVfdCAqc2xpZHgsIHBlaWR4X3RhYmxlX3QgKnBlaWR4LCBwYWxfYnVzX2NoZWNrX2luZm9fdCAqcGJjaSkKK3JlY292ZXJfZnJvbV9yZWFkX2Vycm9yKHNsaWR4X3RhYmxlX3QgKnNsaWR4LCBwZWlkeF90YWJsZV90ICpwZWlkeCwgcGFsX2J1c19jaGVja19pbmZvX3QgKnBiY2ksCisJCQlzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUgKnNvcykKIHsKIAlzYWxfbG9nX21vZF9lcnJvcl9pbmZvX3QgKnNtZWk7CiAJcGFsX21pbl9zdGF0ZV9hcmVhX3QgKnBtc2E7CkBAIC00MjYsNyArNDI2LDcgQEAKIAkJCSAqICBzZXR1cCBmb3IgcmVzdW1lIHRvIGJvdHRvbSBoYWxmIG9mIE1DQSwKIAkJCSAqICJtY2FfaGFuZGxlcl9iaGhvb2siCiAJCQkgKi8KLQkJCXBtc2EgPSAocGFsX21pbl9zdGF0ZV9hcmVhX3QgKikoc2FsX3RvX29zX2hhbmRvZmZfc3RhdGUtPnBhbF9taW5fc3RhdGUgfCAoNnVsPDw2MSkpOworCQkJcG1zYSA9IHNvcy0+cGFsX21pbl9zdGF0ZTsKIAkJCS8qIHBhc3MgdG8gYmhob29rIGFzIDFzdCBhcmd1bWVudCAoZ3I4KSAqLwogCQkJcG1zYS0+cG1zYV9ncls4LTFdID0gc21laS0+dGFyZ2V0X2lkZW50aWZpZXI7CiAJCQkvKiBzZXQgaW50ZXJydXB0ZWQgcmV0dXJuIGFkZHJlc3MgKGJ1dCBubyB1c2UpICovCkBAIC00NTksNyArNDU5LDggQEAKICAqLwogCiBzdGF0aWMgaW50Ci1yZWNvdmVyX2Zyb21fcGxhdGZvcm1fZXJyb3Ioc2xpZHhfdGFibGVfdCAqc2xpZHgsIHBlaWR4X3RhYmxlX3QgKnBlaWR4LCBwYWxfYnVzX2NoZWNrX2luZm9fdCAqcGJjaSkKK3JlY292ZXJfZnJvbV9wbGF0Zm9ybV9lcnJvcihzbGlkeF90YWJsZV90ICpzbGlkeCwgcGVpZHhfdGFibGVfdCAqcGVpZHgsIHBhbF9idXNfY2hlY2tfaW5mb190ICpwYmNpLAorCQkJICAgIHN0cnVjdCBpYTY0X3NhbF9vc19zdGF0ZSAqc29zKQogewogCWludCBzdGF0dXMgPSAwOwogCXBhbF9wcm9jZXNzb3Jfc3RhdGVfaW5mb190ICpwc3AgPSAocGFsX3Byb2Nlc3Nvcl9zdGF0ZV9pbmZvX3QqKXBlaWR4X3BzcChwZWlkeCk7CkBAIC00NjksNyArNDcwLDcgQEAKIAkJY2FzZSAxOiAvKiBwYXJ0aWFsIHJlYWQgKi8KIAkJY2FzZSAzOiAvKiBmdWxsIGxpbmUoY3B1KSByZWFkICovCiAJCWNhc2UgOTogLyogSS9PIHNwYWNlIHJlYWQgKi8KLQkJCXN0YXR1cyA9IHJlY292ZXJfZnJvbV9yZWFkX2Vycm9yKHNsaWR4LCBwZWlkeCwgcGJjaSk7CisJCQlzdGF0dXMgPSByZWNvdmVyX2Zyb21fcmVhZF9lcnJvcihzbGlkeCwgcGVpZHgsIHBiY2ksIHNvcyk7CiAJCQlicmVhazsKIAkJY2FzZSAwOiAvKiB1bmtub3duICovCiAJCWNhc2UgMjogLyogcGFydGlhbCB3cml0ZSAqLwpAQCAtNTA4LDcgKzUwOSw4IEBACiAgKi8KIAogc3RhdGljIGludAotcmVjb3Zlcl9mcm9tX3Byb2Nlc3Nvcl9lcnJvcihpbnQgcGxhdGZvcm0sIHNsaWR4X3RhYmxlX3QgKnNsaWR4LCBwZWlkeF90YWJsZV90ICpwZWlkeCwgcGFsX2J1c19jaGVja19pbmZvX3QgKnBiY2kpCityZWNvdmVyX2Zyb21fcHJvY2Vzc29yX2Vycm9yKGludCBwbGF0Zm9ybSwgc2xpZHhfdGFibGVfdCAqc2xpZHgsIHBlaWR4X3RhYmxlX3QgKnBlaWR4LCBwYWxfYnVzX2NoZWNrX2luZm9fdCAqcGJjaSwKKwkJCSAgICAgc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlICpzb3MpCiB7CiAJcGFsX3Byb2Nlc3Nvcl9zdGF0ZV9pbmZvX3QgKnBzcCA9IChwYWxfcHJvY2Vzc29yX3N0YXRlX2luZm9fdCopcGVpZHhfcHNwKHBlaWR4KTsKIApAQCAtNTQ1LDcgKzU0Nyw3IEBACiAJICogVGhpcyBtZWFucyAidGhlcmUgYXJlIHNvbWUgcGxhdGZvcm0gZXJyb3JzIi4KIAkgKi8KIAlpZiAocGxhdGZvcm0pIAotCQlyZXR1cm4gcmVjb3Zlcl9mcm9tX3BsYXRmb3JtX2Vycm9yKHNsaWR4LCBwZWlkeCwgcGJjaSk7CisJCXJldHVybiByZWNvdmVyX2Zyb21fcGxhdGZvcm1fZXJyb3Ioc2xpZHgsIHBlaWR4LCBwYmNpLCBzb3MpOwogCS8qIAogCSAqIE9uIGFjY291bnQgb2Ygc3RyYW5nZSBTQUwgZXJyb3IgcmVjb3JkLCB3ZSBjYW5ub3QgcmVjb3Zlci4gCiAJICovCkBAIC01NjIsOCArNTY0LDcgQEAKIAogc3RhdGljIGludAogbWNhX3RyeV90b19yZWNvdmVyKHZvaWQgKnJlYywgCi0JaWE2NF9tY2Ffc2FsX3RvX29zX3N0YXRlX3QgKnNhbF90b19vc19zdGF0ZSwKLQlpYTY0X21jYV9vc190b19zYWxfc3RhdGVfdCAqb3NfdG9fc2FsX3N0YXRlKQorCXN0cnVjdCBpYTY0X3NhbF9vc19zdGF0ZSAqc29zKQogewogCWludCBwbGF0Zm9ybV9lcnI7CiAJaW50IG5fcHJvY19lcnI7CkBAIC01NzEsMTAgKzU3Miw2IEBACiAJcGVpZHhfdGFibGVfdCBwZWlkeDsKIAlwYWxfYnVzX2NoZWNrX2luZm9fdCBwYmNpOwogCi0JLyogaGFuZG9mZiBzdGF0ZSBmcm9tL3RvIG1jYS5jICovCi0Jc2FsX3RvX29zX2hhbmRvZmZfc3RhdGUgPSBzYWxfdG9fb3Nfc3RhdGU7Ci0Jb3NfdG9fc2FsX2hhbmRvZmZfc3RhdGUgPSBvc190b19zYWxfc3RhdGU7Ci0KIAkvKiBNYWtlIGluZGV4IG9mIFNBTCBlcnJvciByZWNvcmQgKi8KIAlwbGF0Zm9ybV9lcnIgPSBtY2FfbWFrZV9zbGlkeChyZWMsICZzbGlkeCk7CiAKQEAgLTU5NywxMSArNTk0LDExIEBACiAJKigodTY0KikmcGJjaSkgPSBwZWlkeF9jaGVja19pbmZvKCZwZWlkeCwgYnVzX2NoZWNrLCAwKTsKIAogCS8qIENoZWNrIHdoZXRoZXIgTUNBIGlzIGdsb2JhbCBvciBub3QgKi8KLQlpZiAoaXNfbWNhX2dsb2JhbCgmcGVpZHgsICZwYmNpKSkKKwlpZiAoaXNfbWNhX2dsb2JhbCgmcGVpZHgsICZwYmNpLCBzb3MpKQogCQlyZXR1cm4gMDsKIAkKIAkvKiBUcnkgdG8gcmVjb3ZlciBhIHByb2Nlc3NvciBlcnJvciAqLwotCXJldHVybiByZWNvdmVyX2Zyb21fcHJvY2Vzc29yX2Vycm9yKHBsYXRmb3JtX2VyciwgJnNsaWR4LCAmcGVpZHgsICZwYmNpKTsKKwlyZXR1cm4gcmVjb3Zlcl9mcm9tX3Byb2Nlc3Nvcl9lcnJvcihwbGF0Zm9ybV9lcnIsICZzbGlkeCwgJnBlaWR4LCAmcGJjaSwgc29zKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWluc3RhdGUuaCBiL2FyY2gvaWE2NC9rZXJuZWwvbWluc3RhdGUuaAppbmRleCBmNmQ4YTAxLi44NWVkNTQxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21pbnN0YXRlLmgKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9taW5zdGF0ZS5oCkBAIC01LDczICs1LDYgQEAKICNpbmNsdWRlICJlbnRyeS5oIgogCiAvKgotICogRm9yIGl2dC5zIHdlIHdhbnQgdG8gYWNjZXNzIHRoZSBzdGFjayB2aXJ0dWFsbHkgc28gd2UgZG9uJ3QgaGF2ZSB0byBkaXNhYmxlIHRyYW5zbGF0aW9uCi0gKiBvbiBpbnRlcnJ1cHRzLgotICoKLSAqICBPbiBlbnRyeToKLSAqCXIxOglwb2ludGVyIHRvIGN1cnJlbnQgdGFzayAoYXIuazYpCi0gKi8KLSNkZWZpbmUgTUlOU1RBVEVfU1RBUlRfU0FWRV9NSU5fVklSVAkJCQkJCQkJXAotKHBVU3RrKQltb3YgYXIucnNjPTA7CQkvKiBzZXQgZW5mb3JjZWQgbGF6eSBtb2RlLCBwbCAwLCBsaXR0bGUtZW5kaWFuLCBsb2FkcnM9MCAqLwlcCi0JOzsJCQkJCQkJCQkJCVwKLShwVVN0aykJbW92Lm0gcjI0PWFyLnJuYXQ7CQkJCQkJCQkJXAotKHBVU3RrKQlhZGRsIHIyMj1JQTY0X1JCU19PRkZTRVQscjE7CQkJLyogY29tcHV0ZSBiYXNlIG9mIFJCUyAqLwkJXAotKHBLU3RrKSBtb3YgcjE9c3A7CQkJCQkvKiBnZXQgc3AgICovCQkJCVwKLQk7OwkJCQkJCQkJCQkJXAotKHBVU3RrKSBsZmV0Y2guZmF1bHQuZXhjbC5udDEgW3IyMl07CQkJCQkJCQlcCi0ocFVTdGspCWFkZGwgcjE9SUE2NF9TVEtfT0ZGU0VULUlBNjRfUFRfUkVHU19TSVpFLHIxOwkvKiBjb21wdXRlIGJhc2Ugb2YgbWVtb3J5IHN0YWNrICovCVwKLShwVVN0aykJbW92IHIyMz1hci5ic3BzdG9yZTsJCQkJLyogc2F2ZSBhci5ic3BzdG9yZSAqLwkJCVwKLQk7OwkJCQkJCQkJCQkJXAotKHBVU3RrKQltb3YgYXIuYnNwc3RvcmU9cjIyOwkJCQkvKiBzd2l0Y2ggdG8ga2VybmVsIFJCUyAqLwkJXAotKHBLU3RrKSBhZGRsIHIxPS1JQTY0X1BUX1JFR1NfU0laRSxyMTsJCQkvKiBpZiBpbiBrZXJuZWwgbW9kZSwgdXNlIHNwIChyMTIpICovCVwKLQk7OwkJCQkJCQkJCQkJXAotKHBVU3RrKQltb3YgcjE4PWFyLmJzcDsJCQkJCQkJCQkJXAotKHBVU3RrKQltb3YgYXIucnNjPTB4MzsJCS8qIHNldCBlYWdlciBtb2RlLCBwbCAwLCBsaXR0bGUtZW5kaWFuLCBsb2FkcnM9MCAqLwotCi0jZGVmaW5lIE1JTlNUQVRFX0VORF9TQVZFX01JTl9WSVJUCQkJCQkJCQlcCi0JYnN3LjE7CQkJLyogc3dpdGNoIGJhY2sgdG8gYmFuayAxIChtdXN0IGJlIGxhc3QgaW4gaW5zbiBncm91cCkgKi8JXAotCTs7Ci0KLS8qCi0gKiBGb3IgbWNhX2FzbS5TIHdlIHdhbnQgdG8gYWNjZXNzIHRoZSBzdGFjayBwaHlzaWNhbGx5IHNpbmNlIHRoZSBzdGF0ZSBpcyBzYXZlZCBiZWZvcmUgd2UKLSAqIGdvIHZpcnR1YWwgYW5kIGRvbid0IHdhbnQgdG8gZGVzdHJveSB0aGUgaWlwIG9yIGlwc3IuCi0gKi8KLSNkZWZpbmUgTUlOU1RBVEVfU1RBUlRfU0FWRV9NSU5fUEhZUwkJCQkJCQkJXAotKHBLU3RrKSBtb3YgcjM9SUE2NF9LUihQRVJfQ1BVX0RBVEEpOzsJCQkJCQkJCVwKLShwS1N0aykgYWRkbCByMz1USElTX0NQVShpYTY0X21jYV9kYXRhKSxyMzs7CQkJCQkJCVwKLShwS1N0aykgbGQ4IHIzID0gW3IzXTs7CQkJCQkJCQkJCVwKLShwS1N0aykgYWRkbCByMz1JQTY0X01DQV9DUFVfSU5JVF9TVEFDS19PRkZTRVQscjM7OwkJCQkJCVwKLShwS1N0aykgYWRkbCByMT1JQTY0X1NUS19PRkZTRVQtSUE2NF9QVF9SRUdTX1NJWkUscjM7CQkJCQkJXAotKHBVU3RrKQltb3YgYXIucnNjPTA7CQkvKiBzZXQgZW5mb3JjZWQgbGF6eSBtb2RlLCBwbCAwLCBsaXR0bGUtZW5kaWFuLCBsb2FkcnM9MCAqLwlcCi0ocFVTdGspCWFkZGwgcjIyPUlBNjRfUkJTX09GRlNFVCxyMTsJCS8qIGNvbXB1dGUgYmFzZSBvZiByZWdpc3RlciBiYWNraW5nIHN0b3JlICovCVwKLQk7OwkJCQkJCQkJCQkJXAotKHBVU3RrKQltb3YgcjI0PWFyLnJuYXQ7CQkJCQkJCQkJXAotKHBVU3RrKQlhZGRsIHIxPUlBNjRfU1RLX09GRlNFVC1JQTY0X1BUX1JFR1NfU0laRSxyMTsJLyogY29tcHV0ZSBiYXNlIG9mIG1lbW9yeSBzdGFjayAqLwlcCi0ocFVTdGspCW1vdiByMjM9YXIuYnNwc3RvcmU7CQkJCS8qIHNhdmUgYXIuYnNwc3RvcmUgKi8JCQlcCi0ocFVTdGspCWRlcCByMjI9LTEscjIyLDYxLDM7CQkJLyogY29tcHV0ZSBrZXJuZWwgdmlydHVhbCBhZGRyIG9mIFJCUyAqLwlcCi0JOzsJCQkJCQkJCQkJCVwKLShwVVN0aykJbW92IGFyLmJzcHN0b3JlPXIyMjsJCQkvKiBzd2l0Y2ggdG8ga2VybmVsIFJCUyAqLwkJCVwKLQk7OwkJCQkJCQkJCQkJXAotKHBVU3RrKQltb3YgcjE4PWFyLmJzcDsJCQkJCQkJCQkJXAotKHBVU3RrKQltb3YgYXIucnNjPTB4MzsJCS8qIHNldCBlYWdlciBtb2RlLCBwbCAwLCBsaXR0bGUtZW5kaWFuLCBsb2FkcnM9MCAqLwkJXAotCi0jZGVmaW5lIE1JTlNUQVRFX0VORF9TQVZFX01JTl9QSFlTCQkJCQkJCQlcCi0JZGVwIHIxMj0tMSxyMTIsNjEsMzsJCS8qIG1ha2Ugc3AgYSBrZXJuZWwgdmlydHVhbCBhZGRyZXNzICovCQkJXAotCTs7Ci0KLSNpZmRlZiBNSU5TVEFURV9WSVJUCi0jIGRlZmluZSBNSU5TVEFURV9HRVRfQ1VSUkVOVChyZWcpCW1vdiByZWc9SUE2NF9LUihDVVJSRU5UKQotIyBkZWZpbmUgTUlOU1RBVEVfU1RBUlRfU0FWRV9NSU4JTUlOU1RBVEVfU1RBUlRfU0FWRV9NSU5fVklSVAotIyBkZWZpbmUgTUlOU1RBVEVfRU5EX1NBVkVfTUlOCQlNSU5TVEFURV9FTkRfU0FWRV9NSU5fVklSVAotI2VuZGlmCi0KLSNpZmRlZiBNSU5TVEFURV9QSFlTCi0jIGRlZmluZSBNSU5TVEFURV9HRVRfQ1VSUkVOVChyZWcpCW1vdiByZWc9SUE2NF9LUihDVVJSRU5UKTs7IHRwYSByZWc9cmVnCi0jIGRlZmluZSBNSU5TVEFURV9TVEFSVF9TQVZFX01JTglNSU5TVEFURV9TVEFSVF9TQVZFX01JTl9QSFlTCi0jIGRlZmluZSBNSU5TVEFURV9FTkRfU0FWRV9NSU4JCU1JTlNUQVRFX0VORF9TQVZFX01JTl9QSFlTCi0jZW5kaWYKLQotLyoKICAqIERPX1NBVkVfTUlOIHN3aXRjaGVzIHRvIHRoZSBrZXJuZWwgc3RhY2tzIChpZiBuZWNlc3NhcnkpIGFuZCBzYXZlcwogICogdGhlIG1pbmltdW0gc3RhdGUgbmVjZXNzYXJ5IHRoYXQgYWxsb3dzIHVzIHRvIHR1cm4gcHNyLmljIGJhY2sKICAqIG9uLgpAQCAtOTcsNyArMzAsNyBAQAogICogd2UgY2FuIHBhc3MgaW50ZXJydXB0aW9uIHN0YXRlIGFzIGFyZ3VtZW50cyB0byBhIGhhbmRsZXIuCiAgKi8KICNkZWZpbmUgRE9fU0FWRV9NSU4oQ09WRVIsU0FWRV9JRlMsRVhUUkEpCQkJCQkJCVwKLQlNSU5TVEFURV9HRVRfQ1VSUkVOVChyMTYpOwkvKiBNIChvciBNOztJKSAqLwkJCQkJXAorCW1vdiByMTY9SUE2NF9LUihDVVJSRU5UKTsJLyogTSAqLwkJCQkJCQlcCiAJbW92IHIyNz1hci5yc2M7CQkJLyogTSAqLwkJCQkJCQlcCiAJbW92IHIyMD1yMTsJCQkvKiBBICovCQkJCQkJCVwKIAltb3YgcjI1PWFyLnVuYXQ7CQkvKiBNICovCQkJCQkJCVwKQEAgLTExOCw3ICs1MSwyMSBAQAogCVNBVkVfSUZTOwkJCQkJCQkJCQlcCiAJY21wLmVxIHBLU3RrLHBVU3RrPXIwLHIxNzsJCS8qIGFyZSB3ZSBpbiBrZXJuZWwgbW9kZSBhbHJlYWR5PyAqLwkJXAogCTs7CQkJCQkJCQkJCQlcCi0JTUlOU1RBVEVfU1RBUlRfU0FWRV9NSU4JCQkJCQkJCQlcCisocFVTdGspCW1vdiBhci5yc2M9MDsJCS8qIHNldCBlbmZvcmNlZCBsYXp5IG1vZGUsIHBsIDAsIGxpdHRsZS1lbmRpYW4sIGxvYWRycz0wICovCVwKKwk7OwkJCQkJCQkJCQkJXAorKHBVU3RrKQltb3YubSByMjQ9YXIucm5hdDsJCQkJCQkJCQlcCisocFVTdGspCWFkZGwgcjIyPUlBNjRfUkJTX09GRlNFVCxyMTsJCQkvKiBjb21wdXRlIGJhc2Ugb2YgUkJTICovCQlcCisocEtTdGspIG1vdiByMT1zcDsJCQkJCS8qIGdldCBzcCAgKi8JCQkJXAorCTs7CQkJCQkJCQkJCQlcCisocFVTdGspIGxmZXRjaC5mYXVsdC5leGNsLm50MSBbcjIyXTsJCQkJCQkJCVwKKyhwVVN0aykJYWRkbCByMT1JQTY0X1NUS19PRkZTRVQtSUE2NF9QVF9SRUdTX1NJWkUscjE7CS8qIGNvbXB1dGUgYmFzZSBvZiBtZW1vcnkgc3RhY2sgKi8JXAorKHBVU3RrKQltb3YgcjIzPWFyLmJzcHN0b3JlOwkJCQkvKiBzYXZlIGFyLmJzcHN0b3JlICovCQkJXAorCTs7CQkJCQkJCQkJCQlcCisocFVTdGspCW1vdiBhci5ic3BzdG9yZT1yMjI7CQkJCS8qIHN3aXRjaCB0byBrZXJuZWwgUkJTICovCQlcCisocEtTdGspIGFkZGwgcjE9LUlBNjRfUFRfUkVHU19TSVpFLHIxOwkJCS8qIGlmIGluIGtlcm5lbCBtb2RlLCB1c2Ugc3AgKHIxMikgKi8JXAorCTs7CQkJCQkJCQkJCQlcCisocFVTdGspCW1vdiByMTg9YXIuYnNwOwkJCQkJCQkJCQlcCisocFVTdGspCW1vdiBhci5yc2M9MHgzOwkJLyogc2V0IGVhZ2VyIG1vZGUsIHBsIDAsIGxpdHRsZS1lbmRpYW4sIGxvYWRycz0wICovCQlcCiAJYWRkcyByMTc9MipMMV9DQUNIRV9CWVRFUyxyMTsJCS8qIHJlYWxseTogYmlnZ2VzdCBjYWNoZS1saW5lIHNpemUgKi8JCVwKIAlhZGRzIHIxNj1QVChDUl9JUFNSKSxyMTsJCQkJCQkJCVwKIAk7OwkJCQkJCQkJCQkJXApAQCAtMTgxLDcgKzEyOCw4IEBACiAJRVhUUkE7CQkJCQkJCQkJCQlcCiAJbW92bCByMT1fX2dwOwkJLyogZXN0YWJsaXNoIGtlcm5lbCBnbG9iYWwgcG9pbnRlciAqLwkJCQlcCiAJOzsJCQkJCQkJCQkJCVwKLQlNSU5TVEFURV9FTkRfU0FWRV9NSU4KKwlic3cuMTsJCQkvKiBzd2l0Y2ggYmFjayB0byBiYW5rIDEgKG11c3QgYmUgbGFzdCBpbiBpbnNuIGdyb3VwKSAqLwlcCisJOzsKIAogLyoKICAqIFNBVkVfUkVTVCBzYXZlcyB0aGUgcmVtYWluZGVyIG9mIHB0X3JlZ3MgKHdpdGggcHNyLmljIG9uKS4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jIGIvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKaW5kZXggZjEyMDFhYy4uMTY1MDM1MyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogCiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2ludHJpbnNpY3MuaD4KQEAgLTQ5Niw3ICs0OTcsNyBAQAogc3RhdGljIHBmbV9zdGF0c190CQlwZm1fc3RhdHNbTlJfQ1BVU107CiBzdGF0aWMgcGZtX3Nlc3Npb25fdAkJcGZtX3Nlc3Npb25zOwkvKiBnbG9iYWwgc2Vzc2lvbnMgaW5mb3JtYXRpb24gKi8KIAotc3RhdGljIHNwaW5sb2NrX3QgcGZtX2FsdF9pbnN0YWxsX2NoZWNrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhwZm1fYWx0X2luc3RhbGxfY2hlY2spOwogc3RhdGljIHBmbV9pbnRyX2hhbmRsZXJfZGVzY190ICAqcGZtX2FsdF9pbnRyX2hhbmRsZXI7CiAKIHN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgCSpwZXJmbW9uX2RpcjsKQEAgLTIyMTcsMTUgKzIyMTgsMTcgQEAKIHBmbV9mcmVlX2ZkKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CiAKIAkvKiAKIAkgKiB0aGVyZSBpZSBubyBmZF91bmluc3RhbGwoKSwgc28gd2UgZG8gaXQgaGVyZQogCSAqLwogCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0gICAgICAgIGZpbGVzLT5mZFtmZF0gPSBOVUxMOworCXJjdV9hc3NpZ25fcG9pbnRlcihmZHQtPmZkW2ZkXSwgTlVMTCk7CiAJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwogCi0JaWYgKGZpbGUpIHB1dF9maWxwKGZpbGUpOworCWlmIChmaWxlKQorCQlwdXRfZmlscChmaWxlKTsKIAlwdXRfdW51c2VkX2ZkKGZkKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zYWxpbmZvLmMgYi9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYwppbmRleCA2ZjBjYzdhLi5jYTY4ZTZlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYwpAQCAtMjIsNiArMjIsMTEgQEAKICAqCiAgKiBEZWMgIDUgMjAwNAlrYW9zQHNnaS5jb20KICAqICAgU3RhbmRhcmRpemUgd2hpY2ggcmVjb3JkcyBhcmUgY2xlYXJlZCBhdXRvbWF0aWNhbGx5LgorICoKKyAqIEF1ZyAxOCAyMDA1CWthb3NAc2dpLmNvbQorICogICBtY2EuYyBtYXkgbm90IHBhc3MgYSBidWZmZXIsIGEgTlVMTCBidWZmZXIganVzdCBpbmRpY2F0ZXMgdGhhdCBhIG5ldworICogICByZWNvcmQgaXMgYXZhaWxhYmxlIGluIFNBTC4KKyAqICAgUmVwbGFjZSBzb21lIE5SX0NQVVMgYnkgY3B1c19vbmxpbmUsIGZvciBob3RwbHVnIGNwdS4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTE5Myw3ICsxOTgsNyBAQAogICogVGhlIGJ1ZmZlciBwYXNzZWQgZnJvbSBtY2EuYyBwb2ludHMgdG8gdGhlIG91dHB1dCBmcm9tIGlhNjRfbG9nX2dldC4gVGhpcyBpcwogICogYSBwZXJzaXN0ZW50IGJ1ZmZlciBidXQgaXRzIGNvbnRlbnRzIGNhbiBjaGFuZ2UgYmV0d2VlbiB0aGUgaW50ZXJydXB0IGFuZAogICogd2hlbiB1c2VyIHNwYWNlIHByb2Nlc3NlcyB0aGUgcmVjb3JkLiAgU2F2ZSB0aGUgcmVjb3JkIGlkIHRvIGlkZW50aWZ5Ci0gKiBjaGFuZ2VzLgorICogY2hhbmdlcy4gIElmIHRoZSBidWZmZXIgaXMgTlVMTCB0aGVuIGp1c3QgdXBkYXRlIHRoZSBiaXRtYXAuCiAgKi8KIHZvaWQKIHNhbGluZm9fbG9nX3dha2V1cChpbnQgdHlwZSwgdTggKmJ1ZmZlciwgdTY0IHNpemUsIGludCBpcnFzYWZlKQpAQCAtMjA2LDI3ICsyMTEsMjkgQEAKIAogCUJVR19PTih0eXBlID49IEFSUkFZX1NJWkUoc2FsaW5mb19sb2dfbmFtZSkpOwogCi0JaWYgKGlycXNhZmUpCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSAwLCBkYXRhX3NhdmVkID0gZGF0YS0+ZGF0YV9zYXZlZDsgaSA8IHNhdmVkX3NpemU7ICsraSwgKytkYXRhX3NhdmVkKSB7Ci0JCWlmICghZGF0YV9zYXZlZC0+YnVmZmVyKQotCQkJYnJlYWs7CisJaWYgKGJ1ZmZlcikgeworCQlpZiAoaXJxc2FmZSkKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJZm9yIChpID0gMCwgZGF0YV9zYXZlZCA9IGRhdGEtPmRhdGFfc2F2ZWQ7IGkgPCBzYXZlZF9zaXplOyArK2ksICsrZGF0YV9zYXZlZCkgeworCQkJaWYgKCFkYXRhX3NhdmVkLT5idWZmZXIpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gc2F2ZWRfc2l6ZSkgeworCQkJaWYgKCFkYXRhLT5zYXZlZF9udW0pIHsKKwkJCQlzaGlmdDFfZGF0YV9zYXZlZChkYXRhLCAwKTsKKwkJCQlkYXRhX3NhdmVkID0gZGF0YS0+ZGF0YV9zYXZlZCArIHNhdmVkX3NpemUgLSAxOworCQkJfSBlbHNlCisJCQkJZGF0YV9zYXZlZCA9IE5VTEw7CisJCX0KKwkJaWYgKGRhdGFfc2F2ZWQpIHsKKwkJCWRhdGFfc2F2ZWQtPmNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJCWRhdGFfc2F2ZWQtPmlkID0gKChzYWxfbG9nX3JlY29yZF9oZWFkZXJfdCAqKWJ1ZmZlciktPmlkOworCQkJZGF0YV9zYXZlZC0+c2l6ZSA9IHNpemU7CisJCQlkYXRhX3NhdmVkLT5idWZmZXIgPSBidWZmZXI7CisJCX0KKwkJaWYgKGlycXNhZmUpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKIAl9Ci0JaWYgKGkgPT0gc2F2ZWRfc2l6ZSkgewotCQlpZiAoIWRhdGEtPnNhdmVkX251bSkgewotCQkJc2hpZnQxX2RhdGFfc2F2ZWQoZGF0YSwgMCk7Ci0JCQlkYXRhX3NhdmVkID0gZGF0YS0+ZGF0YV9zYXZlZCArIHNhdmVkX3NpemUgLSAxOwotCQl9IGVsc2UKLQkJCWRhdGFfc2F2ZWQgPSBOVUxMOwotCX0KLQlpZiAoZGF0YV9zYXZlZCkgewotCQlkYXRhX3NhdmVkLT5jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCWRhdGFfc2F2ZWQtPmlkID0gKChzYWxfbG9nX3JlY29yZF9oZWFkZXJfdCAqKWJ1ZmZlciktPmlkOwotCQlkYXRhX3NhdmVkLT5zaXplID0gc2l6ZTsKLQkJZGF0YV9zYXZlZC0+YnVmZmVyID0gYnVmZmVyOwotCX0KLQlpZiAoaXJxc2FmZSkKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CiAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCAmZGF0YS0+Y3B1X2V2ZW50KSkgewogCQlpZiAoaXJxc2FmZSkKQEAgLTI0NCw3ICsyNTEsNyBAQAogCWludCBpOwogCWlmICghZGF0YS0+b3BlbikKIAkJcmV0dXJuOwotCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyArK2kpIHsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKIAkJaWYgKHRlc3RfYml0KGksICZkYXRhLT5jcHVfZXZlbnQpKSB7CiAJCQkvKiBkb3VibGUgdXAoKSBpcyBub3QgYSBwcm9ibGVtLCB1c2VyIHNwYWNlIHdpbGwgc2VlIG5vCiAJCQkgKiByZWNvcmRzIGZvciB0aGUgYWRkaXRpb25hbCAiZXZlbnRzIi4KQEAgLTI5MSw3ICsyOTgsNyBAQAogCiAJbiA9IGRhdGEtPmNwdV9jaGVjazsKIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmICh0ZXN0X2JpdChuLCAmZGF0YS0+Y3B1X2V2ZW50KSkgeworCQlpZiAodGVzdF9iaXQobiwgJmRhdGEtPmNwdV9ldmVudCkgJiYgY3B1X29ubGluZShuKSkgewogCQkJY3B1ID0gbjsKIAkJCWJyZWFrOwogCQl9CkBAIC01ODUsMTEgKzU5MiwxMCBAQAogCiAJCS8qIHdlIG1pc3NlZCBhbnkgZXZlbnRzIGJlZm9yZSBub3cgKi8KIAkJb25saW5lID0gMDsKLQkJZm9yIChqID0gMDsgaiA8IE5SX0NQVVM7IGorKykKLQkJCWlmIChjcHVfb25saW5lKGopKSB7Ci0JCQkJc2V0X2JpdChqLCAmZGF0YS0+Y3B1X2V2ZW50KTsKLQkJCQkrK29ubGluZTsKLQkJCX0KKwkJZm9yX2VhY2hfb25saW5lX2NwdShqKSB7CisJCQlzZXRfYml0KGosICZkYXRhLT5jcHVfZXZlbnQpOworCQkJKytvbmxpbmU7CisJCX0KIAkJc2VtYV9pbml0KCZkYXRhLT5zZW0sIG9ubGluZSk7CiAKIAkJKnNkaXIrKyA9IGRpcjsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYwppbmRleCA4NGY4OWRhLi4xZjVjMjZkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCkBAIC0zODQsNyArMzg0LDcgQEAKIAlpZiAoZWFybHlfY29uc29sZV9zZXR1cCgqY21kbGluZV9wKSA9PSAwKQogCQltYXJrX2JzcF9vbmxpbmUoKTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogCS8qIEluaXRpYWxpemUgdGhlIEFDUEkgYm9vdC10aW1lIHRhYmxlIHBhcnNlciAqLwogCWFjcGlfdGFibGVfaW5pdCgpOwogIyBpZmRlZiBDT05GSUdfQUNQSV9OVU1BCkBAIC00MjAsNyArNDIwLDcgQEAKIAogCWNwdV9pbml0KCk7CS8qIGluaXRpYWxpemUgdGhlIGJvb3RzdHJhcCBDUFUgKi8KIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogCWFjcGlfYm9vdF9pbml0KCk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zeXNfaWE2NC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zeXNfaWE2NC5jCmluZGV4IDc3MGZhYjMuLmYyZGJjZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc3lzX2lhNjQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3N5c19pYTY0LmMKQEAgLTM1LDcgKzM1LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKICNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCi0JaWYgKFJFR0lPTl9OVU1CRVIoYWRkcikgPT0gUkVHSU9OX0hQQUdFKQorCWlmIChSRUdJT05fTlVNQkVSKGFkZHIpID09IFJHTl9IUEFHRSkKIAkJYWRkciA9IDA7CiAjZW5kaWYKIAlpZiAoIWFkZHIpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMKaW5kZXggOTJmZjQ2YS4uNzA2Yjc3MyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMzYsNyArMzYsNyBAQAogCXBhcmVudCA9ICZzeXNmc19ub2Rlc1tjcHVfdG9fbm9kZShudW0pXTsKICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwogCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVAorI2lmZGVmIENPTkZJR19BQ1BJCiAJLyoKIAkgKiBJZiBDUEVJIGNhbm5vdCBiZSByZS10YXJnZXR0ZWQsIGFuZCB0aGlzIGlzCiAJICogQ1BFSSB0YXJnZXQsIHRoZW4gZG9udCBjcmVhdGUgdGhlIGNvbnRyb2wgZmlsZQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCmluZGV4IDQ0NDBjODMuLmY5NzAzNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CQkvKiBGb3IgdW5ibGFua19zY3JlZW4oKSAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPiAgICAgICAvKiBmb3IgRVhQT1JUX1NZTUJPTCAqLwogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAKICNpbmNsdWRlIDxhc20vZnBzd2EuaD4KICNpbmNsdWRlIDxhc20vaWEzMi5oPgpAQCAtMTIyLDcgKzEyMyw3IEBACiB9CiAKIHZvaWQKLWlhNjRfYmFkX2JyZWFrICh1bnNpZ25lZCBsb25nIGJyZWFrX251bSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitfX2twcm9iZXMgaWE2NF9iYWRfYnJlYWsgKHVuc2lnbmVkIGxvbmcgYnJlYWtfbnVtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzaWdpbmZvX3Qgc2lnaW5mbzsKIAlpbnQgc2lnLCBjb2RlOwpAQCAtNDQ0LDcgKzQ0NSw3IEBACiAJcmV0dXJuIHJ2OwogfQogCi12b2lkCit2b2lkIF9fa3Byb2JlcwogaWE2NF9mYXVsdCAodW5zaWduZWQgbG9uZyB2ZWN0b3IsIHVuc2lnbmVkIGxvbmcgaXNyLCB1bnNpZ25lZCBsb25nIGlmYSwKIAkgICAgdW5zaWduZWQgbG9uZyBpaW0sIHVuc2lnbmVkIGxvbmcgaXRpciwgbG9uZyBhcmc1LCBsb25nIGFyZzYsCiAJICAgIGxvbmcgYXJnNywgc3RydWN0IHB0X3JlZ3MgcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdW5jYWNoZWQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdW5jYWNoZWQuYwppbmRleCA0OTBkZmM5Li40ZTlkMDZjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3VuY2FjaGVkLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC91bmNhY2hlZC5jCkBAIC0xODQsNyArMTg0LDcgQEAKIHsKIAlpbnQgbm9kZTsKIAotCW5vZGUgPSBuYXNpZF90b19jbm9kZWlkKE5BU0lEX0dFVChtYWRkcikpOworCW5vZGUgPSBwYWRkcl90b19uaWQobWFkZHIgLSBfX0lBNjRfVU5DQUNIRURfT0ZGU0VUKTsKIAogCWRwcmludGsoS0VSTl9ERUJVRyAidW5jYWNoZWRfZnJlZV9wYWdlKCVseCkgb24gbm9kZSAlaVxuIiwgbWFkZHIsIG5vZGUpOwogCkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCW1lbXNldCgoY2hhciAqKXZzdGFydCwgMCwgbGVuZ3RoKTsKIAotCW5vZGUgPSBuYXNpZF90b19jbm9kZWlkKE5BU0lEX0dFVChzdGFydCkpOworCW5vZGUgPSBwYWRkcl90b19uaWQoc3RhcnQpOwogCiAJZm9yICg7IHZzdGFydCA8IHZlbmQgOyB2c3RhcnQgKz0gUEFHRV9TSVpFKSB7CiAJCWRwcmludGsoS0VSTl9JTkZPICJzdGlja2luZyAlbHggaW50byB0aGUgcG9vbCFcbiIsIHZzdGFydCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3Vud2luZC5jIGIvYXJjaC9pYTY0L2tlcm5lbC91bndpbmQuYwppbmRleCAzMjg4YmU0Li45M2Q1YTNiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3Vud2luZC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdW53aW5kLmMKQEAgLTIwMjAsMjggKzIwMjAsNiBAQAogfQogCiB2b2lkCi11bndfaW5pdF9mcm9tX2ludGVycnVwdGlvbiAoc3RydWN0IHVud19mcmFtZV9pbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsCi0JCQkgICAgc3RydWN0IHB0X3JlZ3MgKnB0LCBzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpzdykKLXsKLQl1bnNpZ25lZCBsb25nIHNvZjsKLQotCWluaXRfZnJhbWVfaW5mbyhpbmZvLCB0LCBzdywgcHQtPnIxMik7Ci0JaW5mby0+Y2ZtX2xvYyA9ICZwdC0+Y3JfaWZzOwotCWluZm8tPnVuYXRfbG9jID0gJnB0LT5hcl91bmF0OwotCWluZm8tPnBmc19sb2MgPSAmcHQtPmFyX3BmczsKLQlzb2YgPSAqaW5mby0+Y2ZtX2xvYyAmIDB4N2Y7Ci0JaW5mby0+YnNwID0gKHVuc2lnbmVkIGxvbmcpIGlhNjRfcnNlX3NraXBfcmVncygodW5zaWduZWQgbG9uZyAqKSBpbmZvLT5yZWdzdGsudG9wLCAtc29mKTsKLQlpbmZvLT5pcCA9IHB0LT5jcl9paXAgKyBpYTY0X3BzcihwdCktPnJpOwotCWluZm8tPnB0ID0gKHVuc2lnbmVkIGxvbmcpIHB0OwotCVVOV19EUFJJTlQoMywgInVud2luZC4lczpcbiIKLQkJICAgIiAgYnNwICAgIDB4JWx4XG4iCi0JCSAgICIgIHNvZiAgICAweCVseFxuIgotCQkgICAiICBpcCAgICAgMHglbHhcbiIsCi0JCSAgIF9fRlVOQ1RJT05fXywgaW5mby0+YnNwLCBzb2YsIGluZm8tPmlwKTsKLQlmaW5kX3NhdmVfbG9jcyhpbmZvKTsKLX0KLQotdm9pZAogdW53X2luaXRfZnJhbWVfaW5mbyAoc3RydWN0IHVud19mcmFtZV9pbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3KQogewogCXVuc2lnbmVkIGxvbmcgc29sOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGE2NzZlNzkuLjMwZDg1NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTQ4LDYgKzQ4LDcgQEAKIAkqKC50ZXh0KQogCVNDSEVEX1RFWFQKIAlMT0NLX1RFWFQKKwlLUFJPQkVTX1RFWFQKIAkqKC5nbnUubGlua29uY2UudCopCiAgICAgfQogICAudGV4dDIgOiBBVChBRERSKC50ZXh0MikgLSBMT0FEX09GRlNFVCkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9saWIvTWFrZWZpbGUgYi9hcmNoL2lhNjQvbGliL01ha2VmaWxlCmluZGV4IDE5MDJjM2MuLjc5OTQwN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9pYTY0L2xpYi9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAKIAogbGliLXkgOj0gX19kaXZzaTMubyBfX3VkaXZzaTMubyBfX21vZHNpMy5vIF9fdW1vZHNpMy5vCQkJXAogCV9fZGl2ZGkzLm8gX191ZGl2ZGkzLm8gX19tb2RkaTMubyBfX3Vtb2RkaTMubwkJCVwKLQliaXRvcC5vIGNoZWNrc3VtLm8gY2xlYXJfcGFnZS5vIGNzdW1fcGFydGlhbF9jb3B5Lm8gY29weV9wYWdlLm8JXAorCWJpdG9wLm8gY2hlY2tzdW0ubyBjbGVhcl9wYWdlLm8gY3N1bV9wYXJ0aWFsX2NvcHkubwkJXAogCWNsZWFyX3VzZXIubyBzdHJuY3B5X2Zyb21fdXNlci5vIHN0cmxlbl91c2VyLm8gc3Rybmxlbl91c2VyLm8JXAogCWZsdXNoLm8gaXBfZmFzdF9jc3VtLm8gZG9fY3N1bS5vCQkJCVwKIAltZW1zZXQubyBzdHJsZW4ubyBzd2lvdGxiLm8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9saWIvZmx1c2guUyBiL2FyY2gvaWE2NC9saWIvZmx1c2guUwppbmRleCAzZTJjZmEyLi4yYTBkMjdmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL2ZsdXNoLlMKKysrIGIvYXJjaC9pYTY0L2xpYi9mbHVzaC5TCkBAIC0yMCw2ICsyMCw3IEBACiAJICoKIAkgKglOb3RlOiAiaW4wIiBhbmQgImluMSIgYXJlIHByZXNlcnZlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgogCSAqLworCS5zZWN0aW9uIC5rcHJvYmVzLnRleHQsImF4IgogR0xPQkFMX0VOVFJZKGZsdXNoX2ljYWNoZV9yYW5nZSkKIAogCS5wcm9sb2d1ZQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2xpYi9tZW1jcHlfbWNrLlMgYi9hcmNoL2lhNjQvbGliL21lbWNweV9tY2suUwppbmRleCA2ZjMwOGU2Li40NmM5MzMxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL21lbWNweV9tY2suUworKysgYi9hcmNoL2lhNjQvbGliL21lbWNweV9tY2suUwpAQCAtNjI1LDggKzYyNSwxMSBAQAogCWNscnJyYgogCTs7CiAJYWxsb2MJc2F2ZWRfcGZzX3N0YWNrPWFyLnBmcywzLDMsMywwCisJY21wLmx0CXA4LHAwPUEscjAKIAlzdWIJQiA9IGRzdDAsIHNhdmVkX2luMAkvLyBob3cgbWFueSBieXRlIGNvcGllZCBzbyBmYXIKIAk7OworKHA4KQltb3YJQSA9IDA7CQkJLy8gQSBzaG91bGRuJ3QgYmUgbmVnYXRpdmUsIGNhcCBpdAorCTs7CiAJc3ViCUMgPSBBLCBCCiAJc3ViCUQgPSBzYXZlZF9pbjIsIEEKIAk7OwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2xpYi9zd2lvdGxiLmMgYi9hcmNoL2lhNjQvbGliL3N3aW90bGIuYwppbmRleCBhYjdiM2FkLi5kYmMwYjNlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL3N3aW90bGIuYworKysgYi9hcmNoL2lhNjQvbGliL3N3aW90bGIuYwpAQCAtOTMsOCArOTMsNyBAQAogc2V0dXBfaW9fdGxiX25wYWdlcyhjaGFyICpzdHIpCiB7CiAJaWYgKGlzZGlnaXQoKnN0cikpIHsKLQkJaW9fdGxiX25zbGFicyA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgJnN0ciwgMCkgPDwKLQkJCShQQUdFX1NISUZUIC0gSU9fVExCX1NISUZUKTsKKwkJaW9fdGxiX25zbGFicyA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgJnN0ciwgMCk7CiAJCS8qIGF2b2lkIHRhaWwgc2VnbWVudCBvZiBzaXplIDwgSU9fVExCX1NFR1NJWkUgKi8KIAkJaW9fdGxiX25zbGFicyA9IEFMSUdOKGlvX3RsYl9uc2xhYnMsIElPX1RMQl9TRUdTSVpFKTsKIAl9CkBAIC0xMTcsNyArMTE2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGk7CiAKIAlpZiAoIWlvX3RsYl9uc2xhYnMpIHsKLQkJaW9fdGxiX25zbGFicyA9IChkZWZhdWx0X3NpemUgPj4gUEFHRV9TSElGVCk7CisJCWlvX3RsYl9uc2xhYnMgPSAoZGVmYXVsdF9zaXplID4+IElPX1RMQl9TSElGVCk7CiAJCWlvX3RsYl9uc2xhYnMgPSBBTElHTihpb190bGJfbnNsYWJzLCBJT19UTEJfU0VHU0laRSk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vZmF1bHQuYyBiL2FyY2gvaWE2NC9tbS9mYXVsdC5jCmluZGV4IGZmNjI1NTEuLjNjMzJhZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvaWE2NC9tbS9mYXVsdC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTc2LDcgKzc3LDcgQEAKIAlyZXR1cm4gcHRlX3ByZXNlbnQocHRlKTsKIH0KIAotdm9pZAordm9pZCBfX2twcm9iZXMKIGlhNjRfZG9fcGFnZV9mYXVsdCAodW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGlzciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IHNpZ25hbCA9IFNJR1NFR1YsIGNvZGUgPSBTRUdWX01BUEVSUjsKQEAgLTIyOSw5ICsyMzAsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGlhNjRfZG9uZV93aXRoX2V4Y2VwdGlvbihyZWdzKSkKLQkJcmV0dXJuOwotCiAJLyoKIAkgKiBTaW5jZSB3ZSBoYXZlIG5vIHZtYSdzIGZvciByZWdpb24gNSwgd2UgbWlnaHQgZ2V0IGhlcmUgZXZlbiBpZiB0aGUgYWRkcmVzcyBpcwogCSAqIHZhbGlkLCBkdWUgdG8gdGhlIFZIUFQgd2Fsa2VyIGluc2VydGluZyBhIG5vbiBwcmVzZW50IHRyYW5zbGF0aW9uIHRoYXQgYmVjb21lcwpAQCAtMjQyLDYgKzI0MCw5IEBACiAJaWYgKFJFR0lPTl9OVU1CRVIoYWRkcmVzcykgPT0gNSAmJiBtYXBwZWRfa2VybmVsX3BhZ2VfaXNfcHJlc2VudChhZGRyZXNzKSkKIAkJcmV0dXJuOwogCisJaWYgKGlhNjRfZG9uZV93aXRoX2V4Y2VwdGlvbihyZWdzKSkKKwkJcmV0dXJuOworCiAJLyoKIAkgKiBPb3BzLiBUaGUga2VybmVsIHRyaWVkIHRvIGFjY2VzcyBzb21lIGJhZCBwYWdlLiBXZSdsbCBoYXZlIHRvIHRlcm1pbmF0ZSB0aGluZ3MKIAkgKiB3aXRoIGV4dHJlbWUgcHJlanVkaWNlLgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL2lhNjQvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCBlMGE3NzZhLi4yZDEzODg5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL2lhNjQvbW0vaHVnZXRsYnBhZ2UuYwpAQCAtNzYsNyArNzYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoYWRkciAmIH5IUEFHRV9NQVNLKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoUkVHSU9OX05VTUJFUihhZGRyKSAhPSBSRUdJT05fSFBBR0UpCisJaWYgKFJFR0lPTl9OVU1CRVIoYWRkcikgIT0gUkdOX0hQQUdFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiAwOwpAQCAtODcsNyArODcsNyBAQAogCXN0cnVjdCBwYWdlICpwYWdlOwogCXB0ZV90ICpwdGVwOwogCi0JaWYgKFJFR0lPTl9OVU1CRVIoYWRkcikgIT0gUkVHSU9OX0hQQUdFKQorCWlmIChSRUdJT05fTlVNQkVSKGFkZHIpICE9IFJHTl9IUEFHRSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlwdGVwID0gaHVnZV9wdGVfb2Zmc2V0KG1tLCBhZGRyKTsKQEAgLTE0Miw4ICsxNDIsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlpZiAobGVuICYgfkhQQUdFX01BU0spCiAJCXJldHVybiAtRUlOVkFMOwotCS8qIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgUkVHSU9OX0hQQUdFICE9IDAuICovCi0JaWYgKChSRUdJT05fTlVNQkVSKGFkZHIpICE9IFJFR0lPTl9IUEFHRSkgfHwgKGFkZHIgJiAoSFBBR0VfU0laRSAtIDEpKSkKKwkvKiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IFJHTl9IUEFHRSAhPSAwLiAqLworCWlmICgoUkVHSU9OX05VTUJFUihhZGRyKSAhPSBSR05fSFBBR0UpIHx8IChhZGRyICYgKEhQQUdFX1NJWkUgLSAxKSkpCiAJCWFkZHIgPSBIUEFHRV9SRUdJT05fQkFTRTsKIAllbHNlCiAJCWFkZHIgPSBBTElHTihhZGRyLCBIUEFHRV9TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9wY2kvcGNpLmMgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCmluZGV4IGY5NDcyYzUuLjliNWRlNTggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9wY2kvcGNpLmMKKysrIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwpAQCAtMjQsNyArMjQsNiBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zYWwuaD4KQEAgLTQ5OSwxMyArNDk4LDExIEBACiAJcmV0dXJuIGFjcGlfcGNpX2lycV9lbmFibGUoZGV2KTsKIH0KIAotI2lmZGVmIENPTkZJR19BQ1BJX0RFQUxMT0NBVEVfSVJRCiB2b2lkCiBwY2liaW9zX2Rpc2FibGVfZGV2aWNlIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWFjcGlfcGNpX2lycV9kaXNhYmxlKGRldik7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0FDUElfREVBTExPQ0FURV9JUlEgKi8KIAogdm9pZAogcGNpYmlvc19hbGlnbl9yZXNvdXJjZSAodm9pZCAqZGF0YSwgc3RydWN0IHJlc291cmNlICpyZXMsCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vaW5jbHVkZS90aW8uaCBiL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3Rpby5oCmluZGV4IDAxMzkxMjQuLjZiMmU3YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3Rpby5oCisrKyBiL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3Rpby5oCkBAIC0zLDcgKzMsNyBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKi8KIAogI2lmbmRlZiBfQVNNX0lBNjRfU05fVElPX0gKQEAgLTI2LDYgKzI2LDEwIEBACiAjZGVmaW5lIFRJT19JVFRFX1ZBTElEX01BU0sJMHgxCiAjZGVmaW5lIFRJT19JVFRFX1ZBTElEX1NISUZUCTE2CiAKKyNkZWZpbmUgVElPX0lUVEVfV0lER0VUKGl0dGUpIFwKKwkoKChpdHRlKSA+PiBUSU9fSVRURV9XSURHRVRfU0hJRlQpICYgVElPX0lUVEVfV0lER0VUX01BU0spCisjZGVmaW5lIFRJT19JVFRFX1ZBTElEKGl0dGUpIFwKKwkoKChpdHRlKSA+PiBUSU9fSVRURV9WQUxJRF9TSElGVCkgJiBUSU9fSVRURV9WQUxJRF9NQVNLKQogCiAjZGVmaW5lIFRJT19JVFRFX1BVVChuYXNpZCwgYmlnd2luLCB3aWRnZXQsIGFkZHIsIHZhbGlkKSBcCiAgICAgICAgIFJFTU9URV9IVUJfUygobmFzaWQpLCBUSU9fSVRURShiaWd3aW4pLCBcCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay9odWJkZXYuaCBiL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCmluZGV4IDU4MGExYzAuLjcxYzJiMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCisrKyBiL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCkBAIC0zLDcgKzMsNyBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTIgLSAxOTk3LCAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAxOTkyIC0gMTk5NywgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogI2lmbmRlZiBfQVNNX0lBNjRfU05fWFRBTEtfSFVCREVWX0gKICNkZWZpbmUgX0FTTV9JQTY0X1NOX1hUQUxLX0hVQkRFVl9ICkBAIC0xNiw2ICsxNiw5IEBACiAjZGVmaW5lIElJT19JVFRFX1dJREdFVF9NQVNLICAgICgoMTw8SUlPX0lUVEVfV0lER0VUX0JJVFMpLTEpCiAjZGVmaW5lIElJT19JVFRFX1dJREdFVF9TSElGVCAgIDgKIAorI2RlZmluZSBJSU9fSVRURV9XSURHRVQoaXR0ZSkJXAorCSgoKGl0dGUpID4+IElJT19JVFRFX1dJREdFVF9TSElGVCkgJiBJSU9fSVRURV9XSURHRVRfTUFTSykKKwogLyoKICAqIFVzZSB0aGUgdG9wIGJpZyB3aW5kb3cgYXMgYSBzdXJyb2dhdGUgZm9yIHRoZSBmaXJzdCBzbWFsbCB3aW5kb3cKICAqLwpAQCAtMzQsNyArMzcsOCBAQAogCXVuc2lnbmVkIGxvbmcgc2ZkbF9mb3JjZV9pbnRfYWRkcjsKIAl1bnNpZ25lZCBsb25nIHNmZGxfZmx1c2hfdmFsdWU7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqc2ZkbF9mbHVzaF9hZGRyOwotCXVpbnQ2NF90IHNmZGxfcGVyc2lzdGVudF9idXNudW07CisJdWludDMyX3Qgc2ZkbF9wZXJzaXN0ZW50X2J1c251bTsKKwl1aW50MzJfdCBzZmRsX3BlcnNpc3RlbnRfc2VnbWVudDsKIAlzdHJ1Y3QgcGNpYnVzX2luZm8gKnNmZGxfcGNpYnVzX2luZm87CiAJc3BpbmxvY2tfdCBzZmRsX2ZsdXNoX2xvY2s7CiB9OwpAQCAtNTgsNyArNjIsOCBAQAogCiAJdm9pZAkJCQkqaGRpX25vZGVwZGE7CiAJdm9pZAkJCQkqaGRpX25vZGVfdmVydGV4OwotCXZvaWQJCQkJKmhkaV94dGFsa192ZXJ0ZXg7CisJdWludDMyX3QJCQltYXhfc2VnbWVudF9udW1iZXI7CisJdWludDMyX3QJCQltYXhfcGNpYnVzX251bWJlcjsKIH07CiAKIGV4dGVybiB2b2lkIGh1YmRldl9pbml0X25vZGUobm9kZXBkYV90ICosIGNub2RlaWRfdCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2J0ZS5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9idGUuYwppbmRleCA2NDdkZWFlLi40NTg1NGM2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2J0ZS5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvYnRlLmMKQEAgLTI5LDE2ICsyOSwzMCBAQAogCiAvKiB0d28gaW50ZXJmYWNlcyBvbiB0d28gYnRlcyAqLwogI2RlZmluZSBNQVhfSU5URVJGQUNFU19UT19UUlkJCTQKKyNkZWZpbmUgTUFYX05PREVTX1RPX1RSWQkJMgogCiBzdGF0aWMgc3RydWN0IGJ0ZWluZm9fcyAqYnRlX2lmX29uX25vZGUobmFzaWRfdCBuYXNpZCwgaW50IGludGVyZmFjZSkKIHsKIAlub2RlcGRhX3QgKnRtcF9ub2RlcGRhOwogCisJaWYgKG5hc2lkX3RvX2Nub2RlaWQobmFzaWQpID09IC0xKQorCQlyZXR1cm4gKHN0cnVjdCBidGVpbmZvX3MgKilOVUxMOzsKKwogCXRtcF9ub2RlcGRhID0gTk9ERVBEQShuYXNpZF90b19jbm9kZWlkKG5hc2lkKSk7CiAJcmV0dXJuICZ0bXBfbm9kZXBkYS0+YnRlX2lmW2ludGVyZmFjZV07CiAKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGJ0ZV9zdGFydF90cmFuc2ZlcihzdHJ1Y3QgYnRlaW5mb19zICpidGUsIHU2NCBsZW4sIHU2NCBtb2RlKQoreworCWlmIChpc19zaHViMigpKSB7CisJCUJURV9DVFJMX1NUT1JFKGJ0ZSwgKElCTFNfQlVTWSB8ICgobGVuKSB8IChtb2RlKSA8PCAyNCkpKTsKKwl9IGVsc2UgeworCQlCVEVfTE5TVEFUX1NUT1JFKGJ0ZSwgbGVuKTsKKwkJQlRFX0NUUkxfU1RPUkUoYnRlLCBtb2RlKTsKKwl9Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEJsb2NrIFRyYW5zZmVyIEVuZ2luZSBjb3B5IHJlbGF0ZWQgZnVuY3Rpb25zLgogICoKQEAgLTY3LDEzICs4MSwxNSBAQAogewogCXU2NCB0cmFuc2Zlcl9zaXplOwogCXU2NCB0cmFuc2Zlcl9zdGF0OworCXU2NCBub3RpZl9waHlzX2FkZHI7CiAJc3RydWN0IGJ0ZWluZm9fcyAqYnRlOwogCWJ0ZV9yZXN1bHRfdCBidGVfc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwogCXVuc2lnbmVkIGxvbmcgaXRjX2VuZCA9IDA7Ci0Jc3RydWN0IGJ0ZWluZm9fcyAqYnRlc190b190cnlbTUFYX0lOVEVSRkFDRVNfVE9fVFJZXTsKLQlpbnQgYnRlX2lmX2luZGV4OwotCWludCBidGVfcHJpLCBidGVfc2VjOworCWludCBuYXNpZF90b190cnlbTUFYX05PREVTX1RPX1RSWV07CisJaW50IG15X25hc2lkID0gZ2V0X25hc2lkKCk7CisJaW50IGJ0ZV9pZl9pbmRleCwgbmFzaWRfaW5kZXg7CisJaW50IGJ0ZV9maXJzdCwgYnRlc19wZXJfbm9kZSA9IEJURVNfUEVSX05PREU7CiAKIAlCVEVfUFJJTlRLKCgiYnRlX2NvcHkoMHglbHgsIDB4JWx4LCAweCVseCwgMHglbHgsIDB4JXApXG4iLAogCQkgICAgc3JjLCBkZXN0LCBsZW4sIG1vZGUsIG5vdGlmaWNhdGlvbikpOwpAQCAtODYsMzYgKzEwMiwyNiBAQAogCQkgKHNyYyAmIEwxX0NBQ0hFX01BU0spIHx8IChkZXN0ICYgTDFfQ0FDSEVfTUFTSykpOwogCUJVR19PTighKGxlbiA8ICgoQlRFX0xFTl9NQVNLICsgMSkgPDwgTDFfQ0FDSEVfU0hJRlQpKSk7CiAKLQkvKiBDUFUgMCAocGVyIG5vZGUpIHRyaWVzIGJ0ZTAgZmlyc3QsIENQVSAxIHRyeSBidGUxIGZpcnN0ICovCi0JaWYgKGNwdWlkX3RvX3N1Ym5vZGUoc21wX3Byb2Nlc3Nvcl9pZCgpKSA9PSAwKSB7Ci0JCWJ0ZV9wcmkgPSAwOwotCQlidGVfc2VjID0gMTsKLQl9IGVsc2UgewotCQlidGVfcHJpID0gMTsKLQkJYnRlX3NlYyA9IDA7Ci0JfQorCS8qCisJICogU3RhcnQgd2l0aCBpbnRlcmZhY2UgY29ycmVzcG9uZGluZyB0byBjcHUgbnVtYmVyCisJICovCisJYnRlX2ZpcnN0ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSAlIGJ0ZXNfcGVyX25vZGU7CiAKIAlpZiAobW9kZSAmIEJURV9VU0VfREVTVCkgewogCQkvKiB0cnkgcmVtb3RlIHRoZW4gbG9jYWwgKi8KLQkJYnRlc190b190cnlbMF0gPSBidGVfaWZfb25fbm9kZShOQVNJRF9HRVQoZGVzdCksIGJ0ZV9wcmkpOwotCQlidGVzX3RvX3RyeVsxXSA9IGJ0ZV9pZl9vbl9ub2RlKE5BU0lEX0dFVChkZXN0KSwgYnRlX3NlYyk7CisJCW5hc2lkX3RvX3RyeVswXSA9IE5BU0lEX0dFVChkZXN0KTsKIAkJaWYgKG1vZGUgJiBCVEVfVVNFX0FOWSkgewotCQkJYnRlc190b190cnlbMl0gPSBidGVfaWZfb25fbm9kZShnZXRfbmFzaWQoKSwgYnRlX3ByaSk7Ci0JCQlidGVzX3RvX3RyeVszXSA9IGJ0ZV9pZl9vbl9ub2RlKGdldF9uYXNpZCgpLCBidGVfc2VjKTsKKwkJCW5hc2lkX3RvX3RyeVsxXSA9IG15X25hc2lkOwogCQl9IGVsc2UgewotCQkJYnRlc190b190cnlbMl0gPSBOVUxMOwotCQkJYnRlc190b190cnlbM10gPSBOVUxMOworCQkJbmFzaWRfdG9fdHJ5WzFdID0gKGludClOVUxMOwogCQl9CiAJfSBlbHNlIHsKIAkJLyogdHJ5IGxvY2FsIHRoZW4gcmVtb3RlICovCi0JCWJ0ZXNfdG9fdHJ5WzBdID0gYnRlX2lmX29uX25vZGUoZ2V0X25hc2lkKCksIGJ0ZV9wcmkpOwotCQlidGVzX3RvX3RyeVsxXSA9IGJ0ZV9pZl9vbl9ub2RlKGdldF9uYXNpZCgpLCBidGVfc2VjKTsKKwkJbmFzaWRfdG9fdHJ5WzBdID0gbXlfbmFzaWQ7CiAJCWlmIChtb2RlICYgQlRFX1VTRV9BTlkpIHsKLQkJCWJ0ZXNfdG9fdHJ5WzJdID0gYnRlX2lmX29uX25vZGUoTkFTSURfR0VUKGRlc3QpLCBidGVfcHJpKTsKLQkJCWJ0ZXNfdG9fdHJ5WzNdID0gYnRlX2lmX29uX25vZGUoTkFTSURfR0VUKGRlc3QpLCBidGVfc2VjKTsKKwkJCW5hc2lkX3RvX3RyeVsxXSA9IE5BU0lEX0dFVChkZXN0KTsKIAkJfSBlbHNlIHsKLQkJCWJ0ZXNfdG9fdHJ5WzJdID0gTlVMTDsKLQkJCWJ0ZXNfdG9fdHJ5WzNdID0gTlVMTDsKKwkJCW5hc2lkX3RvX3RyeVsxXSA9IChpbnQpTlVMTDsKIAkJfQogCX0KIApAQCAtMTIzLDExICsxMjksMTIgQEAKIAlkbyB7CiAJCWxvY2FsX2lycV9zYXZlKGlycV9mbGFncyk7CiAKLQkJYnRlX2lmX2luZGV4ID0gMDsKKwkJYnRlX2lmX2luZGV4ID0gYnRlX2ZpcnN0OworCQluYXNpZF9pbmRleCA9IDA7CiAKIAkJLyogQXR0ZW1wdCB0byBsb2NrIG9uZSBvZiB0aGUgQlRFIGludGVyZmFjZXMuICovCi0JCXdoaWxlIChidGVfaWZfaW5kZXggPCBNQVhfSU5URVJGQUNFU19UT19UUlkpIHsKLQkJCWJ0ZSA9IGJ0ZXNfdG9fdHJ5W2J0ZV9pZl9pbmRleCsrXTsKKwkJd2hpbGUgKG5hc2lkX2luZGV4IDwgTUFYX05PREVTX1RPX1RSWSkgeworCQkJYnRlID0gYnRlX2lmX29uX25vZGUobmFzaWRfdG9fdHJ5W25hc2lkX2luZGV4XSxidGVfaWZfaW5kZXgpOwogCiAJCQlpZiAoYnRlID09IE5VTEwpIHsKIAkJCQljb250aW51ZTsKQEAgLTE0Myw2ICsxNTAsMTUgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQorCisJCQlidGVfaWZfaW5kZXggPSAoYnRlX2lmX2luZGV4ICsgMSkgJSBidGVzX3Blcl9ub2RlOyAvKiBOZXh0IGludGVyZmFjZSAqLworCQkJaWYgKGJ0ZV9pZl9pbmRleCA9PSBidGVfZmlyc3QpIHsKKwkJCQkvKgorCQkJCSAqIFdlJ3ZlIHRyaWVkIGFsbCBpbnRlcmZhY2VzIG9uIHRoaXMgbm9kZQorCQkJCSAqLworCQkJCW5hc2lkX2luZGV4Kys7CisJCQl9CisKIAkJCWJ0ZSA9IE5VTEw7CiAJCX0KIApAQCAtMTY5LDcgKzE4NSwxMyBAQAogCiAJLyogSW5pdGlhbGl6ZSB0aGUgbm90aWZpY2F0aW9uIHRvIGEga25vd24gdmFsdWUuICovCiAJKmJ0ZS0+bW9zdF9yY250X25hID0gQlRFX1dPUkRfQlVTWTsKKwlub3RpZl9waHlzX2FkZHIgPSBUT19QSFlTKGlhNjRfdHBhKCh1bnNpZ25lZCBsb25nKWJ0ZS0+bW9zdF9yY250X25hKSk7CiAKKwlpZiAoaXNfc2h1YjIoKSkgeworCQlzcmMgPSBTSDJfVElPX1BIWVNfVE9fRE1BKHNyYyk7CisJCWRlc3QgPSBTSDJfVElPX1BIWVNfVE9fRE1BKGRlc3QpOworCQlub3RpZl9waHlzX2FkZHIgPSBTSDJfVElPX1BIWVNfVE9fRE1BKG5vdGlmX3BoeXNfYWRkcik7CisJfQogCS8qIFNldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiByZWdpc3RlcnMgKi8KIAlCVEVfUFJJTlRLVigoIklCU0EgPSAweCVseClcbiIsIChUT19QSFlTKHNyYykpKSk7CiAJQlRFX1NSQ19TVE9SRShidGUsIFRPX1BIWVMoc3JjKSk7CkBAIC0xNzcsMTQgKzE5OSwxMiBAQAogCUJURV9ERVNUX1NUT1JFKGJ0ZSwgVE9fUEhZUyhkZXN0KSk7CiAKIAkvKiBTZXQgdGhlIG5vdGlmaWNhdGlvbiByZWdpc3RlciAqLwotCUJURV9QUklOVEtWKCgiSUJOQSA9IDB4JWx4KVxuIiwKLQkJICAgICBUT19QSFlTKGlhNjRfdHBhKCh1bnNpZ25lZCBsb25nKWJ0ZS0+bW9zdF9yY250X25hKSkpKTsKLQlCVEVfTk9USUZfU1RPUkUoYnRlLAotCQkJVE9fUEhZUyhpYTY0X3RwYSgodW5zaWduZWQgbG9uZylidGUtPm1vc3RfcmNudF9uYSkpKTsKKwlCVEVfUFJJTlRLVigoIklCTkEgPSAweCVseClcbiIsIG5vdGlmX3BoeXNfYWRkcikpOworCUJURV9OT1RJRl9TVE9SRShidGUsIG5vdGlmX3BoeXNfYWRkcik7CiAKIAkvKiBJbml0aWF0ZSB0aGUgdHJhbnNmZXIgKi8KIAlCVEVfUFJJTlRLKCgiSUJDVCA9IDB4JWx4KVxuIiwgQlRFX1ZBTElEX01PREUobW9kZSkpKTsKLQlCVEVfU1RBUlRfVFJBTlNGRVIoYnRlLCB0cmFuc2Zlcl9zaXplLCBCVEVfVkFMSURfTU9ERShtb2RlKSk7CisJYnRlX3N0YXJ0X3RyYW5zZmVyKGJ0ZSwgdHJhbnNmZXJfc2l6ZSwgQlRFX1ZBTElEX01PREUobW9kZSkpOwogCiAJaXRjX2VuZCA9IGlhNjRfZ2V0X2l0YygpICsgKDQwMDAwMDAwICogbG9jYWxfY3B1X2RhdGEtPmN5Y19wZXJfdXNlYyk7CiAKQEAgLTE5NSw2ICsyMTUsNyBAQAogCX0KIAogCXdoaWxlICgodHJhbnNmZXJfc3RhdCA9ICpidGUtPm1vc3RfcmNudF9uYSkgPT0gQlRFX1dPUkRfQlVTWSkgeworCQljcHVfcmVsYXgoKTsKIAkJaWYgKGlhNjRfZ2V0X2l0YygpID4gaXRjX2VuZCkgewogCQkJQlRFX1BSSU5USygoIkJURSB0aW1lb3V0IG5hc2lkIDB4JXggYnRlJWQgSUJMUyA9IDB4JWx4IG5hIDB4JWx4XG4iLAogCQkJCU5BU0lEX0dFVChidGUtPmJ0ZV9iYXNlX2FkZHIpLCBidGUtPmJ0ZV9udW0sCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2h1YmVycm9yLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2h1YmVycm9yLmMKaW5kZXggNWMzOWI0My4uNWM1ZWIwMSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9odWJlcnJvci5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaHViZXJyb3IuYwpAQCAtNzYsNyArNzYsNyBAQAogCSAqLwogCVJFTU9URV9IVUJfUyhodWJkZXZfaW5mby0+aGRpX25hc2lkLCBJSU9fSUNEUiwgKElJT19JQ0RSX1BORCB8IGNyYm51bSkpOwogCXdoaWxlIChSRU1PVEVfSFVCX0woaHViZGV2X2luZm8tPmhkaV9uYXNpZCwgSUlPX0lDRFIpICYgSUlPX0lDRFJfUE5EKQotCQl1ZGVsYXkoMSk7CisJCWNwdV9yZWxheCgpOwogCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKaW5kZXggNDE0Y2RmMi4uOTA2NjIyZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxhc20vc24vc2ltdWxhdG9yLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgogI2luY2x1ZGUgPGFzbS9zbi90aW9jYV9wcm92aWRlci5oPgorI2luY2x1ZGUgPGFzbS9zbi90aW9jZV9wcm92aWRlci5oPgogI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgogI2luY2x1ZGUgInh0YWxrL3h3aWRnZXRkZXYuaCIKIApAQCAtNDQsNiArNDUsOSBAQAogCiBzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpzbl9wY2lfcHJvdmlkZXJbUENJSU9fQVNJQ19NQVhfVFlQRVNdOwkvKiBpbmRleGVkIGJ5IGFzaWMgdHlwZSAqLwogCitzdGF0aWMgaW50IG1heF9zZWdtZW50X251bWJlciA9IDA7IC8qIERlZmF1bHQgaGlnaGVzdCBzZWdtZW50IG51bWJlciAqLworc3RhdGljIGludCBtYXhfcGNpYnVzX251bWJlciA9IDI1NTsgLyogRGVmYXVsdCBoaWdoZXN0IHBjaSBidXMgbnVtYmVyICovCisKIC8qCiAgKiBIb29rcyBhbmQgc3RydWN0IGZvciB1bnN1cHBvcnRlZCBwY2kgcHJvdmlkZXJzCiAgKi8KQEAgLTE1NywxMyArMTYxLDI4IEBACiAJdWludDY0X3QgbmFzaWQ7CiAJaW50IGksIHdpZGdldDsKIAorCS8qCisJICogR2V0IFNHSSBTcGVjaWZpYyBIVUIgY2hpcHNldCBpbmZvcm1hdGlvbi4KKwkgKiBJbmZvcm0gUHJvbSB0aGF0IHRoaXMga2VybmVsIGNhbiBzdXBwb3J0IGRvbWFpbiBidXMgbnVtYmVyaW5nLgorCSAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1pb25vZGVzOyBpKyspIHsKIAkJaHViZGV2ID0gKHN0cnVjdCBodWJkZXZfaW5mbyAqKShOT0RFUERBKGkpLT5wZGluZm8pOwogCQluYXNpZCA9IGNub2RlaWRfdG9fbmFzaWQoaSk7CisJCWh1YmRldi0+bWF4X3NlZ21lbnRfbnVtYmVyID0gMHhmZmZmZmZmZjsKKwkJaHViZGV2LT5tYXhfcGNpYnVzX251bWJlciA9IDB4ZmY7CiAJCXN0YXR1cyA9IHNhbF9nZXRfaHViZGV2X2luZm8obmFzaWQsICh1aW50NjRfdCkgX19wYShodWJkZXYpKTsKIAkJaWYgKHN0YXR1cykKIAkJCWNvbnRpbnVlOwogCisJCS8qIFNhdmUgdGhlIGxhcmdlc3QgRG9tYWluIGFuZCBwY2lidXMgbnVtYmVycyBmb3VuZC4gKi8KKwkJaWYgKGh1YmRldi0+bWF4X3NlZ21lbnRfbnVtYmVyKSB7CisJCQkvKgorCQkJICogRGVhbGluZyB3aXRoIGEgUHJvbSB0aGF0IHN1cHBvcnRzIHNlZ21lbnRzLgorCQkJICovCisJCQltYXhfc2VnbWVudF9udW1iZXIgPSBodWJkZXYtPm1heF9zZWdtZW50X251bWJlcjsKKwkJCW1heF9wY2lidXNfbnVtYmVyID0gaHViZGV2LT5tYXhfcGNpYnVzX251bWJlcjsKKwkJfQorCiAJCS8qIEF0dGFjaCB0aGUgZXJyb3IgaW50ZXJydXB0IGhhbmRsZXJzICovCiAJCWlmIChuYXNpZCAmIDEpCiAJCQlpY2VfZXJyb3JfaW5pdChodWJkZXYpOwpAQCAtMjMwLDcgKzI0OSw3IEBACiB2b2lkIHNuX3BjaV9maXh1cF9zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IGlkeDsKLQlpbnQgc2VnbWVudCA9IDA7CisJaW50IHNlZ21lbnQgPSBwY2lfZG9tYWluX25yKGRldi0+YnVzKTsKIAlpbnQgc3RhdHVzID0gMDsKIAlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKmJzOwogIAlzdHJ1Y3QgcGNpX2J1cyAqaG9zdF9wY2lfYnVzOwpAQCAtMjgzLDkgKzMwMiw5IEBACiAgCSAqIFBDSSBob3N0X3BjaV9kZXYgc3RydWN0IGFuZCBzZXQgdXAgaG9zdCBidXMgbGlua2FnZXMKICAJICovCiAKLSAJYnVzX25vID0gU05fUENJREVWX0lORk8oZGV2KS0+cGRpX3Nsb3RfaG9zdF9oYW5kbGUgPj4gMzI7CisgCWJ1c19ubyA9IChTTl9QQ0lERVZfSU5GTyhkZXYpLT5wZGlfc2xvdF9ob3N0X2hhbmRsZSA+PiAzMikgJiAweGZmOwogIAlkZXZmbiA9IFNOX1BDSURFVl9JTkZPKGRldiktPnBkaV9zbG90X2hvc3RfaGFuZGxlICYgMHhmZmZmZmZmZjsKLSAJaG9zdF9wY2lfYnVzID0gcGNpX2ZpbmRfYnVzKHBjaV9kb21haW5fbnIoZGV2LT5idXMpLCBidXNfbm8pOworIAlob3N0X3BjaV9idXMgPSBwY2lfZmluZF9idXMoc2VnbWVudCwgYnVzX25vKTsKICAJaG9zdF9wY2lfZGV2ID0gcGNpX2dldF9zbG90KGhvc3RfcGNpX2J1cywgZGV2Zm4pOwogCiAJU05fUENJREVWX0lORk8oZGV2KS0+aG9zdF9wY2lfZGV2ID0gaG9zdF9wY2lfZGV2OwpAQCAtMzMzLDYgKzM1Miw3IEBACiAJcHJvbV9idXNzb2Z0X3B0ciA9IF9fdmEocHJvbV9idXNzb2Z0X3B0cik7CiAKICAJY29udHJvbGxlciA9IGtjYWxsb2MoMSxzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7CisJY29udHJvbGxlci0+c2VnbWVudCA9IHNlZ21lbnQ7CiAgCWlmICghY29udHJvbGxlcikKICAJCUJVRygpOwogCkBAIC0zOTAsNyArNDEwLDcgQEAKIAlpZiAoY29udHJvbGxlci0+bm9kZSA+PSBudW1fb25saW5lX25vZGVzKCkpIHsKIAkJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpiID0gU05fUENJQlVTX0JVU1NPRlQoYnVzKTsKIAotCQlwcmludGsoS0VSTl9XQVJOSU5HICJEZXZpY2UgQVNJQz0ldSBYSUQ9JXUgUEJVU05VTT0lbHUiCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRldmljZSBBU0lDPSV1IFhJRD0ldSBQQlVTTlVNPSV1IgogCQkJCSAgICAiTF9JTz0lbHggTF9NRU09JWx4IEJBU0U9JWx4XG4iLAogCQkJYi0+YnNfYXNpY190eXBlLCBiLT5ic194aWQsIGItPmJzX3BlcnNpc3RfYnVzbnVtLAogCQkJYi0+YnNfbGVnYWN5X2lvLCBiLT5ic19sZWdhY3lfbWVtLCBiLT5ic19iYXNlKTsKQEAgLTQxMSw3ICs0MzEsNyBAQAogewogCXN0cnVjdCBzeXNkYXRhX2VsICplbGVtZW50OwogCi0JZWxlbWVudCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzeXNkYXRhX2VsKSwgR0ZQX0tFUk5FTCk7CisJZWxlbWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzeXNkYXRhX2VsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbGVtZW50KSB7CiAJCWRldl9kYmcoZGV2LCAiJXM6IG91dCBvZiBtZW1vcnkhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm47CkBAIC00NDUsNiArNDY1LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IHNuX3BjaV9pbml0KHZvaWQpCiB7CiAJaW50IGkgPSAwOworCWludCBqID0gMDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CiAJZXh0ZXJuIHZvaWQgc25faW5pdF9jcGVpX3RpbWVyKHZvaWQpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCkBAIC00NjQsNiArNDg1LDcgQEAKIAogCXBjaWJyX2luaXRfcHJvdmlkZXIoKTsKIAl0aW9jYV9pbml0X3Byb3ZpZGVyKCk7CisJdGlvY2VfaW5pdF9wcm92aWRlcigpOwogCiAJLyoKIAkgKiBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCBib3VuY2UgbGltaXQgY2hlY2tzIGluIHRoZSBibGsgbGF5ZXIKQEAgLTQ3OSw4ICs1MDEsOSBAQAogI2VuZGlmCiAKIAkvKiBidXNzZXMgYXJlIG5vdCBrbm93biB5ZXQgLi4uICovCi0JZm9yIChpID0gMDsgaSA8IFBDSV9CVVNFU19UT19TQ0FOOyBpKyspCi0JCXNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKDAsIGksIE5VTEwpOworCWZvciAoaSA9IDA7IGkgPD0gbWF4X3NlZ21lbnRfbnVtYmVyOyBpKyspCisJCWZvciAoaiA9IDA7IGogPD0gbWF4X3BjaWJ1c19udW1iZXI7IGorKykKKwkJCXNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKGksIGosIE5VTEwpOwogCiAJLyoKIAkgKiBHZW5lcmljIExpbnV4IFBDSSBMYXllciBoYXMgY3JlYXRlZCB0aGUgcGNpX2J1cyBhbmQgcGNpX2RldiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCmluZGV4IDg0ZDI3NmEuLjAxZDE4YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYwpAQCAtNSw3ICs1LDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgpAQCAtMjMsNyArMjMsNyBAQAogc3RhdGljIHZvaWQgcmVnaXN0ZXJfaW50cl9wZGEoc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbyk7CiBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX2ludHJfcGRhKHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pOwogCi1leHRlcm4gaW50IHNuX2ZvcmNlX2ludGVycnVwdF9mbGFnOworaW50IHNuX2ZvcmNlX2ludGVycnVwdF9mbGFnID0gMTsKIGV4dGVybiBpbnQgc25faW9pZl9pbml0ZWQ7CiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqKnNuX2lycV9saDsKIHN0YXRpYyBzcGlubG9ja190IHNuX2lycV9pbmZvX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IC8qIG5vbi1JUlEgbG9jayAqLwpAQCAtNzYsMTYgKzc2LDE0IEBACiAKIHN0YXRpYyB2b2lkIHNuX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1aW50NjRfdCBldmVudF9vY2N1cnJlZCwgbWFzayA9IDA7Ci0JaW50IG5hc2lkOworCXU2NCBldmVudF9vY2N1cnJlZCwgbWFzayA9IDA7CiAKIAlpcnEgPSBpcnEgJiAweGZmOwotCW5hc2lkID0gZ2V0X25hc2lkKCk7CiAJZXZlbnRfb2NjdXJyZWQgPQotCSAgICBIVUJfTCgodWludDY0X3QgKikgR0xPQkFMX01NUl9BRERSKG5hc2lkLCBTSF9FVkVOVF9PQ0NVUlJFRCkpOworCSAgICBIVUJfTCgodTY0KilMT0NBTF9NTVJfQUREUihTSF9FVkVOVF9PQ0NVUlJFRCkpOwogCW1hc2sgPSBldmVudF9vY2N1cnJlZCAmIFNIX0FMTF9JTlRfTUFTSzsKLQlIVUJfUygodWludDY0X3QgKikgR0xPQkFMX01NUl9BRERSKG5hc2lkLCBTSF9FVkVOVF9PQ0NVUlJFRF9BTElBUyksCi0JCSBtYXNrKTsKKwlIVUJfUygodTY0KilMT0NBTF9NTVJfQUREUihTSF9FVkVOVF9PQ0NVUlJFRF9BTElBUyksCisJICAgICAgbWFzayk7CiAJX19zZXRfYml0KGlycSwgKHZvbGF0aWxlIHZvaWQgKilwZGEtPnNuX2luX3NlcnZpY2VfaXZlY3MpOwogCiAJbW92ZV9pcnEoaXJxKTsKQEAgLTkzLDE1ICs5MSwxMiBAQAogCiBzdGF0aWMgdm9pZCBzbl9lbmRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaW50IG5hc2lkOwogCWludCBpdmVjOwotCXVpbnQ2NF90IGV2ZW50X29jY3VycmVkOworCXU2NCBldmVudF9vY2N1cnJlZDsKIAogCWl2ZWMgPSBpcnEgJiAweGZmOwogCWlmIChpdmVjID09IFNHSV9VQVJUX1ZFQ1RPUikgewotCQluYXNpZCA9IGdldF9uYXNpZCgpOwotCQlldmVudF9vY2N1cnJlZCA9IEhVQl9MKCh1aW50NjRfdCAqKSBHTE9CQUxfTU1SX0FERFIKLQkJCQkgICAgICAgKG5hc2lkLCBTSF9FVkVOVF9PQ0NVUlJFRCkpOworCQlldmVudF9vY2N1cnJlZCA9IEhVQl9MKCh1NjQqKUxPQ0FMX01NUl9BRERSIChTSF9FVkVOVF9PQ0NVUlJFRCkpOwogCQkvKiBJZiB0aGUgVUFSVCBiaXQgaXMgc2V0IGhlcmUsIHdlIG1heSBoYXZlIHJlY2VpdmVkIGFuCiAJCSAqIGludGVycnVwdCBmcm9tIHRoZSBVQVJUIHRoYXQgdGhlIGRyaXZlciBtaXNzZWQuICBUbwogCQkgKiBtYWtlIHN1cmUsIHdlIElQSSBvdXJzZWx2ZXMgdG8gZm9yY2UgdXMgdG8gbG9vayBhZ2Fpbi4KQEAgLTEzMiw2ICsxMjcsNyBAQAogCQlpbnQgbG9jYWxfd2lkZ2V0LCBzdGF0dXM7CiAJCW5hc2lkX3QgbG9jYWxfbmFzaWQ7CiAJCXN0cnVjdCBzbl9pcnFfaW5mbyAqbmV3X2lycV9pbmZvOworCQlzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpwY2lfcHJvdmlkZXI7CiAKIAkJbmV3X2lycV9pbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNuX2lycV9pbmZvKSwgR0ZQX0FUT01JQyk7CiAJCWlmIChuZXdfaXJxX2luZm8gPT0gTlVMTCkKQEAgLTE3MSw4ICsxNjcsOSBAQAogCQluZXdfaXJxX2luZm8tPmlycV9jcHVpZCA9IGNwdWlkOwogCQlyZWdpc3Rlcl9pbnRyX3BkYShuZXdfaXJxX2luZm8pOwogCi0JCWlmIChJU19QQ0lfQlJJREdFX0FTSUMobmV3X2lycV9pbmZvLT5pcnFfYnJpZGdlX3R5cGUpKQotCQkJcGNpYnJfY2hhbmdlX2RldmljZXNfaXJxKG5ld19pcnFfaW5mbyk7CisJCXBjaV9wcm92aWRlciA9IHNuX3BjaV9wcm92aWRlcltuZXdfaXJxX2luZm8tPmlycV9icmlkZ2VfdHlwZV07CisJCWlmIChwY2lfcHJvdmlkZXIgJiYgcGNpX3Byb3ZpZGVyLT50YXJnZXRfaW50ZXJydXB0KQorCQkJKHBjaV9wcm92aWRlci0+dGFyZ2V0X2ludGVycnVwdCkobmV3X2lycV9pbmZvKTsKIAogCQlzcGluX2xvY2soJnNuX2lycV9pbmZvX2xvY2spOwogCQlsaXN0X3JlcGxhY2VfcmN1KCZzbl9pcnFfaW5mby0+bGlzdCwgJm5ld19pcnFfaW5mby0+bGlzdCk7CkBAIC0zMTcsNiArMzE0LDE2IEBACiAJcGNpX2Rldl9wdXQocGNpX2Rldik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAorc25fY2FsbF9mb3JjZV9pbnRyX3Byb3ZpZGVyKHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pCit7CisJc3RydWN0IHNuX3BjaWJ1c19wcm92aWRlciAqcGNpX3Byb3ZpZGVyOworCisJcGNpX3Byb3ZpZGVyID0gc25fcGNpX3Byb3ZpZGVyW3NuX2lycV9pbmZvLT5pcnFfYnJpZGdlX3R5cGVdOworCWlmIChwY2lfcHJvdmlkZXIgJiYgcGNpX3Byb3ZpZGVyLT5mb3JjZV9pbnRlcnJ1cHQpCisJCSgqcGNpX3Byb3ZpZGVyLT5mb3JjZV9pbnRlcnJ1cHQpKHNuX2lycV9pbmZvKTsKK30KKwogc3RhdGljIHZvaWQgZm9yY2VfaW50ZXJydXB0KGludCBpcnEpCiB7CiAJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKQEAgLTMyNSwxMSArMzMyLDkgQEAKIAkJcmV0dXJuOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNuX2lycV9pbmZvLCBzbl9pcnFfbGhbaXJxXSwgbGlzdCkgewotCQlpZiAoSVNfUENJX0JSSURHRV9BU0lDKHNuX2lycV9pbmZvLT5pcnFfYnJpZGdlX3R5cGUpICYmCi0JCSAgICAoc25faXJxX2luZm8tPmlycV9icmlkZ2UgIT0gTlVMTCkpCi0JCQlwY2licl9mb3JjZV9pbnRlcnJ1cHQoc25faXJxX2luZm8pOwotCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzbl9pcnFfaW5mbywgc25faXJxX2xoW2lycV0sIGxpc3QpCisJCXNuX2NhbGxfZm9yY2VfaW50cl9wcm92aWRlcihzbl9pcnFfaW5mbyk7CisKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIApAQCAtMzUxLDYgKzM1NiwxNCBAQAogCXN0cnVjdCBwY2lkZXZfaW5mbyAqcGNpZGV2X2luZm87CiAJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKIAorCS8qCisJICogQnJpZGdlIHR5cGVzIGF0dGFjaGVkIHRvIFRJTyAoYW55dGhpbmcgYnV0IFBJQykgZG8gbm90IG5lZWQgdGhpcyBXQVIKKwkgKiBzaW5jZSB0aGV5IGRvIG5vdCB0YXJnZXQgU2h1YiBJSSBpbnRlcnJ1cHQgcmVnaXN0ZXJzLiAgSWYgdGhhdAorCSAqIGV2ZXIgY2hhbmdlcywgdGhpcyBjaGVjayBuZWVkcyB0byBhY2NvbW9kYXRlLgorCSAqLworCWlmIChzbl9pcnFfaW5mby0+aXJxX2JyaWRnZV90eXBlICE9IFBDSUlPX0FTSUNfVFlQRV9QSUMpCisJCXJldHVybjsKKwogCXBjaWRldl9pbmZvID0gKHN0cnVjdCBwY2lkZXZfaW5mbyAqKXNuX2lycV9pbmZvLT5pcnFfcGNpaW9pbmZvOwogCWlmICghcGNpZGV2X2luZm8pCiAJCXJldHVybjsKQEAgLTM3NywxNiArMzkwLDEyIEBACiAJCWJyZWFrOwogCX0KIAlpZiAoIXRlc3RfYml0KGlycl9iaXQsICZpcnJfcmVnKSkgewotCQlpZiAoIXRlc3RfYml0KGlycSwgcGRhLT5zbl9zb2Z0X2lycikpIHsKLQkJCWlmICghdGVzdF9iaXQoaXJxLCBwZGEtPnNuX2luX3NlcnZpY2VfaXZlY3MpKSB7Ci0JCQkJcmVndmFsICY9IDB4ZmY7Ci0JCQkJaWYgKHNuX2lycV9pbmZvLT5pcnFfaW50X2JpdCAmIHJlZ3ZhbCAmCi0JCQkJICAgIHNuX2lycV9pbmZvLT5pcnFfbGFzdF9pbnRyKSB7Ci0JCQkJCXJlZ3ZhbCAmPQotCQkJCQkgICAgfihzbl9pcnFfaW5mby0+Ci0JCQkJCSAgICAgIGlycV9pbnRfYml0ICYgcmVndmFsKTsKLQkJCQkJcGNpYnJfZm9yY2VfaW50ZXJydXB0KHNuX2lycV9pbmZvKTsKLQkJCQl9CisJCWlmICghdGVzdF9iaXQoaXJxLCBwZGEtPnNuX2luX3NlcnZpY2VfaXZlY3MpKSB7CisJCQlyZWd2YWwgJj0gMHhmZjsKKwkJCWlmIChzbl9pcnFfaW5mby0+aXJxX2ludF9iaXQgJiByZWd2YWwgJgorCQkJICAgIHNuX2lycV9pbmZvLT5pcnFfbGFzdF9pbnRyKSB7CisJCQkJcmVndmFsICY9IH4oc25faXJxX2luZm8tPmlycV9pbnRfYml0ICYgcmVndmFsKTsKKwkJCQlzbl9jYWxsX2ZvcmNlX2ludHJfcHJvdmlkZXIoc25faXJxX2luZm8pOwogCQkJfQogCQl9CiAJfQpAQCAtNDA0LDEzICs0MTMsNyBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKGkgPSBwZGEtPnNuX2ZpcnN0X2lycTsgaSA8PSBwZGEtPnNuX2xhc3RfaXJxOyBpKyspIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc25faXJxX2luZm8sIHNuX2lycV9saFtpXSwgbGlzdCkgewotCQkJLyoKLQkJCSAqIE9ubHkgY2FsbCBmb3IgUENJIGJyaWRnZXMgdGhhdCBhcmUgZnVsbHkKLQkJCSAqIGluaXRpYWxpemVkLgotCQkJICovCi0JCQlpZiAoSVNfUENJX0JSSURHRV9BU0lDKHNuX2lycV9pbmZvLT5pcnFfYnJpZGdlX3R5cGUpICYmCi0JCQkgICAgKHNuX2lycV9pbmZvLT5pcnFfYnJpZGdlICE9IE5VTEwpKQotCQkJCXNuX2NoZWNrX2ludHIoaSwgc25faXJxX2luZm8pOworCQkJc25fY2hlY2tfaW50cihpLCBzbl9pcnFfaW5mbyk7CiAJCX0KIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3NldHVwLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3NldHVwLmMKaW5kZXggN2M3ZmU0NC4uMTQ5MDhhZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYwpAQCAtNTYsNyArNTYsNyBAQAogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGRhX3MsIHBkYV9wZXJjcHUpOwogCi0jZGVmaW5lIE1BWF9QSFlTX01FTU9SWQkJKDFVTCA8PCA0OSkJLyogMSBUQiAqLworI2RlZmluZSBNQVhfUEhZU19NRU1PUlkJCSgxVUwgPDwgSUE2NF9NQVhfUEhZU19CSVRTKQkvKiBNYXggcGh5c2ljYWwgYWRkcmVzcyBzdXBwb3J0ZWQgKi8KIAogbGJvYXJkX3QgKnJvb3RfbGJvYXJkW01BWF9DT01QQUNUX05PREVTXTsKIApAQCAtODAsOCArODAsNiBAQAogREVGSU5FX1BFUl9DUFUoc3RydWN0IG5vZGVwZGFfcyAqLCBfX3NuX25vZGVwZGEpOwogRVhQT1JUX1BFUl9DUFVfU1lNQk9MKF9fc25fbm9kZXBkYSk7CiAKLXBhcnRpZF90IHNuX3BhcnRpZCA9IC0xOwotRVhQT1JUX1NZTUJPTChzbl9wYXJ0aWQpOwogY2hhciBzbl9zeXN0ZW1fc2VyaWFsX251bWJlcl9zdHJpbmdbMTI4XTsKIEVYUE9SVF9TWU1CT0woc25fc3lzdGVtX3NlcmlhbF9udW1iZXJfc3RyaW5nKTsKIHU2NCBzbl9wYXJ0aXRpb25fc2VyaWFsX251bWJlcjsKQEAgLTQwMyw2ICs0MDEsNyBAQAogCQltZW1zZXQobm9kZXBkYWluZHJbY25vZGVdLCAwLCBzaXplb2Yobm9kZXBkYV90KSk7CiAJCW1lbXNldChub2RlcGRhaW5kcltjbm9kZV0tPnBoeXNfY3B1aWQsIC0xLAogCQkgICAgc2l6ZW9mKG5vZGVwZGFpbmRyW2Nub2RlXS0+cGh5c19jcHVpZCkpOworCQlzcGluX2xvY2tfaW5pdCgmbm9kZXBkYWluZHJbY25vZGVdLT5wdGNfbG9jayk7CiAJfQogCiAJLyoKQEAgLTUzMiw4ICs1MzEsOCBAQAogCSAqLwogCXsKIAkJdTY0IHBpbzFbXSA9IHtTSDFfUElPX1dSSVRFX1NUQVRVU18wLCAwLCBTSDFfUElPX1dSSVRFX1NUQVRVU18xLCAwfTsKLQkJdTY0IHBpbzJbXSA9IHtTSDJfUElPX1dSSVRFX1NUQVRVU18wLCBTSDJfUElPX1dSSVRFX1NUQVRVU18xLAotCQkJU0gyX1BJT19XUklURV9TVEFUVVNfMiwgU0gyX1BJT19XUklURV9TVEFUVVNfM307CisJCXU2NCBwaW8yW10gPSB7U0gyX1BJT19XUklURV9TVEFUVVNfMCwgU0gyX1BJT19XUklURV9TVEFUVVNfMiwKKwkJCVNIMl9QSU9fV1JJVEVfU1RBVFVTXzEsIFNIMl9QSU9fV1JJVEVfU1RBVFVTXzN9OwogCQl1NjQgKnBpbzsKIAkJcGlvID0gaXNfc2h1YjEoKSA/IHBpbzEgOiBwaW8yOwogCQlwZGEtPnBpb193cml0ZV9zdGF0dXNfYWRkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIExPQ0FMX01NUl9BRERSKHBpb1tzbGljZV0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvcHRjX2RlYWRsb2NrLlMgYi9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9wdGNfZGVhZGxvY2suUwppbmRleCA5NmNiNzFkLi4zZmE5NTA2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9wdGNfZGVhZGxvY2suUworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9wdGNfZGVhZGxvY2suUwpAQCAtMyw3ICszLDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KQEAgLTExLDcgKzExLDcgQEAKIAogI2RlZmluZSBERUFETE9DS0JJVAlTSF9QSU9fV1JJVEVfU1RBVFVTX1dSSVRFX0RFQURMT0NLX1NIRlQKICNkZWZpbmUgV1JJVEVDT1VOVE1BU0sJU0hfUElPX1dSSVRFX1NUQVRVU19QRU5ESU5HX1dSSVRFX0NPVU5UX01BU0sKLSNkZWZpbmUgQUxJQVNfT0ZGU0VUCShTSDFfUElPX1dSSVRFX1NUQVRVU18wX0FMSUFTLVNIMV9QSU9fV1JJVEVfU1RBVFVTXzApCisjZGVmaW5lIEFMSUFTX09GRlNFVAk4CiAKIAogCS5nbG9iYWwJc24yX3B0Y19kZWFkbG9ja19yZWNvdmVyeV9jb3JlCkBAIC0zNiwxMyArMzYsMTUgQEAKIAlleHRyLnUJcGlvd2NwaHk9cGlvd2MsMCw2MTs7CS8vIENvbnZlcnQgcGlvd2MgdG8gdW5jYWNoZWQgcGh5c2ljYWwgYWRkcmVzcwogCWRlcAlwaW93Y3BoeT0tMSxwaW93Y3BoeSw2MywxCiAJbW92bAltYXNrPVdSSVRFQ09VTlRNQVNLCisJbW92CXI4PXIwCiAKIDE6CiAJYWRkCXNjcjI9QUxJQVNfT0ZGU0VULHBpb3djCS8vIEFkZHJlc3Mgb2YgV1JJVEVfU1RBVFVTIGFsaWFzIHJlZ2lzdGVyIAotCW1vdglzY3IxPTc7OwkJLy8gQ2xlYXIgREVBRExPQ0ssIFdSSVRFX0VSUk9SLCBNVUxUSV9XUklURV9FUlJPUgotCXN0OC5yZWwJW3NjcjJdPXNjcjE7OworCTs7CisJbGQ4LmFjcQlzY3IxPVtzY3IyXTs7CiAKIDU6CWxkOC5hY3EJc2NyMT1bcGlvd2NdOzsJCS8vIFdhaXQgZm9yIFBJT3MgdG8gY29tcGxldGUuCisJaGludAlAcGF1c2UKIAlhbmQJc2NyMj1zY3IxLG1hc2s7OwkvLyBtYXNrIG9mIHdyaXRlY291bnQgYml0cwogCWNtcC5uZQlwNixwMD16ZXJvdmFsLHNjcjIKIChwNikJYnIuY29uZC5zcHRrIDViCkBAIC01Nyw2ICs1OSw3IEBACiAJc3Q4LnJlbCBbcHRjMF09ZGF0YTAJCS8vIFdyaXRlIFBUQzAgJiB3YWl0IGZvciBjb21wbGV0aW9uLgogCiA1OglsZDguYWNxCXNjcjE9W3Bpb3djcGh5XTs7CS8vIFdhaXQgZm9yIFBJT3MgdG8gY29tcGxldGUuCisJaGludAlAcGF1c2UKIAlhbmQJc2NyMj1zY3IxLG1hc2s7OwkvLyBtYXNrIG9mIHdyaXRlY291bnQgYml0cwogCWNtcC5uZQlwNixwMD16ZXJvdmFsLHNjcjIKIChwNikJYnIuY29uZC5zcHRrIDViOzsKQEAgLTY3LDYgKzcwLDcgQEAKIChwNykJc3Q4LnJlbCBbcHRjMV09ZGF0YTE7OwkJLy8gTm93IHdyaXRlIFBUQzEuCiAKIDU6CWxkOC5hY3EJc2NyMT1bcGlvd2NwaHldOzsJLy8gV2FpdCBmb3IgUElPcyB0byBjb21wbGV0ZS4KKwloaW50CUBwYXVzZQogCWFuZAlzY3IyPXNjcjEsbWFzazs7CS8vIG1hc2sgb2Ygd3JpdGVjb3VudCBiaXRzCiAJY21wLm5lCXA2LHAwPXplcm92YWwsc2NyMgogKHA2KQlici5jb25kLnNwdGsgNWIKQEAgLTc3LDYgKzgxLDcgQEAKIAlzcmx6Lmk7OwogCS8vLy8vLy8vLy8vLy8vIEVORCAgIFBIWVNJQ0FMIE1PREUgLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAorKHA4KQlhZGQJcjg9MSxyOAogKHA4KQlici5jb25kLnNwbnQgMWI7OwkJLy8gUmVwZWF0IGlmIERFQURMT0NLIG9jY3VycmVkLgogCiAJYnIucmV0LnNwdGsJcnAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuMl9zbXAuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuMl9zbXAuYwppbmRleCA3YWYwNWE3Li4wYTRlZTUwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9zbjJfc21wLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc24yX3NtcC5jCkBAIC01LDcgKzUsNyBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTM5LDEyICs0MSwxMjAgQEAKICNpbmNsdWRlIDxhc20vc24vbm9kZXBkYS5oPgogI2luY2x1ZGUgPGFzbS9zbi9yd19tbXIuaD4KIAotdm9pZCBzbjJfcHRjX2RlYWRsb2NrX3JlY292ZXJ5KHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyBkYXRhMCwgCi0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nIGRhdGExKTsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBwdGNfc3RhdHMsIHB0Y3N0YXRzKTsKK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgcHRjX3N0YXRzLCBwdGNzdGF0cyk7CiAKIHN0YXRpYyAgX19jYWNoZWxpbmVfYWxpZ25lZCBERUZJTkVfU1BJTkxPQ0soc24yX2dsb2JhbF9wdGNfbG9jayk7CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNuMl9wdGNfZGVhZGxvY2tfY291bnQ7Cit2b2lkIHNuMl9wdGNfZGVhZGxvY2tfcmVjb3Zlcnkoc2hvcnQgKiwgc2hvcnQsIGludCwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nIGRhdGEwLAorCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyBkYXRhMSk7CisKKyNpZmRlZiBERUJVR19QVEMKKy8qCisgKiBwdGN0ZXN0OgorICoKKyAqIAl4eXogLSAzIGRpZ2l0IGhleCBudW1iZXI6CisgKiAJCXggLSBGb3JjZSBQVEMgcHVyZ2VzIHRvIHVzZSBzaHViOgorICogCQkJMCAtIG5vIGZvcmNlCisgKiAJCQkxIC0gZm9yY2UKKyAqIAkJeSAtIGludGVydXB0IGVuYWJsZQorICogCQkJMCAtIGRpc2FibGUgaW50ZXJydXB0cworICogCQkJMSAtIGxlYXZlIGludGVydXVwdHMgZW5hYmxlZAorICogCQl6IC0gdHlwZSBvZiBsb2NrOgorICogCQkJMCAtIGdsb2JhbCBsb2NrCisgKiAJCQkxIC0gbm9kZSBsb2NhbCBsb2NrCisgKiAJCQkyIC0gbm8gbG9jaworICoKKyAqICAgCU5vdGU6IG9uIHNodWIxLCBvbmx5IHB0Y3Rlc3QgPT0gMCBpcyBzdXBwb3J0ZWQuIERvbid0IHRyeSBvdGhlciB2YWx1ZXMhCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBzbjJfcHRjdGVzdCA9IDA7CisKK3N0YXRpYyBpbnQgX19pbml0IHB0Y190ZXN0KGNoYXIgKnN0cikKK3sKKwlnZXRfb3B0aW9uKCZzdHIsICZzbjJfcHRjdGVzdCk7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJwdGN0ZXN0PSIsIHB0Y190ZXN0KTsKKworc3RhdGljIGlubGluZSBpbnQgcHRjX2xvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3ApCit7CisJdW5zaWduZWQgbG9uZyBvcHQgPSBzbjJfcHRjdGVzdCAmIDI1NTsKKworCXN3aXRjaCAob3B0KSB7CisJY2FzZSAweDAwOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc24yX2dsb2JhbF9wdGNfbG9jaywgKmZsYWdwKTsKKwkJYnJlYWs7CisJY2FzZSAweDAxOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc25fbm9kZXBkYS0+cHRjX2xvY2ssICpmbGFncCk7CisJCWJyZWFrOworCWNhc2UgMHgwMjoKKwkJbG9jYWxfaXJxX3NhdmUoKmZsYWdwKTsKKwkJYnJlYWs7CisJY2FzZSAweDEwOgorCQlzcGluX2xvY2soJnNuMl9nbG9iYWxfcHRjX2xvY2spOworCQlicmVhazsKKwljYXNlIDB4MTE6CisJCXNwaW5fbG9jaygmc25fbm9kZXBkYS0+cHRjX2xvY2spOworCQlicmVhazsKKwljYXNlIDB4MTI6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwlyZXR1cm4gb3B0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHRjX3VubG9jayh1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgb3B0KQoreworCXN3aXRjaCAob3B0KSB7CisJY2FzZSAweDAwOgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbjJfZ2xvYmFsX3B0Y19sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgMHgwMToKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc25fbm9kZXBkYS0+cHRjX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSAweDAyOgorCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWJyZWFrOworCWNhc2UgMHgxMDoKKwkJc3Bpbl91bmxvY2soJnNuMl9nbG9iYWxfcHRjX2xvY2spOworCQlicmVhazsKKwljYXNlIDB4MTE6CisJCXNwaW5fdW5sb2NrKCZzbl9ub2RlcGRhLT5wdGNfbG9jayk7CisJCWJyZWFrOworCWNhc2UgMHgxMjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorI2Vsc2UKKworI2RlZmluZSBzbjJfcHRjdGVzdAkwCisKK3N0YXRpYyBpbmxpbmUgaW50IHB0Y19sb2NrKHVuc2lnbmVkIGxvbmcgKmZsYWdwKQoreworCXNwaW5fbG9ja19pcnFzYXZlKCZzbjJfZ2xvYmFsX3B0Y19sb2NrLCAqZmxhZ3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHRjX3VubG9jayh1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgb3B0KQoreworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNuMl9nbG9iYWxfcHRjX2xvY2ssIGZsYWdzKTsKK30KKyNlbmRpZgorCitzdHJ1Y3QgcHRjX3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIHB0Y19sOworCXVuc2lnbmVkIGxvbmcgY2hhbmdlX3JpZDsKKwl1bnNpZ25lZCBsb25nIHNodWJfcHRjX2ZsdXNoZXM7CisJdW5zaWduZWQgbG9uZyBub2Rlc19mbHVzaGVkOworCXVuc2lnbmVkIGxvbmcgZGVhZGxvY2tzOworCXVuc2lnbmVkIGxvbmcgbG9ja19pdGNfY2xvY2tzOworCXVuc2lnbmVkIGxvbmcgc2h1Yl9pdGNfY2xvY2tzOworCXVuc2lnbmVkIGxvbmcgc2h1Yl9pdGNfY2xvY2tzX21heDsKK307CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB3YWl0X3Bpb3djKHZvaWQpCiB7CkBAIC04OSw5ICsxOTksOSBAQAogc24yX2dsb2JhbF90bGJfcHVyZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCiAJCSAgICAgdW5zaWduZWQgbG9uZyBuYml0cykKIHsKLQlpbnQgaSwgc2h1YjEsIGNub2RlLCBteW5hc2lkLCBjcHUsIGxjcHUgPSAwLCBuYXNpZCwgZmx1c2hlZCA9IDA7CisJaW50IGksIG9wdCwgc2h1YjEsIGNub2RlLCBteW5hc2lkLCBjcHUsIGxjcHUgPSAwLCBuYXNpZCwgZmx1c2hlZCA9IDA7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcHRjMCwgKnB0YzE7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDAsIGRhdGEwID0gMCwgZGF0YTEgPSAwOworCXVuc2lnbmVkIGxvbmcgaXRjLCBpdGMyLCBmbGFncywgZGF0YTAgPSAwLCBkYXRhMSA9IDA7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5hY3RpdmVfbW07CiAJc2hvcnQgbmFzaWRzW01BWF9OVU1OT0RFU10sIG5peDsKIAlub2RlbWFza190IG5vZGVzX2ZsdXNoZWQ7CkBAIC0xMTQsMTYgKzIyNCwxOSBAQAogCQkJc3RhcnQgKz0gKDFVTCA8PCBuYml0cyk7CiAJCX0gd2hpbGUgKHN0YXJ0IDwgZW5kKTsKIAkJaWE2NF9zcmx6X2koKTsKKwkJX19nZXRfY3B1X3ZhcihwdGNzdGF0cykucHRjX2wrKzsKIAkJcHJlZW1wdF9lbmFibGUoKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSA9PSAxKSB7CiAJCWZsdXNoX3RsYl9tbShtbSk7CisJCV9fZ2V0X2NwdV92YXIocHRjc3RhdHMpLmNoYW5nZV9yaWQrKzsKIAkJcHJlZW1wdF9lbmFibGUoKTsKIAkJcmV0dXJuOwogCX0KIAorCWl0YyA9IGlhNjRfZ2V0X2l0YygpOwogCW5peCA9IDA7CiAJZm9yX2VhY2hfbm9kZV9tYXNrKGNub2RlLCBub2Rlc19mbHVzaGVkKQogCQluYXNpZHNbbml4KytdID0gY25vZGVpZF90b19uYXNpZChjbm9kZSk7CkBAIC0xNDgsNyArMjYxLDEyIEBACiAKIAlteW5hc2lkID0gZ2V0X25hc2lkKCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc24yX2dsb2JhbF9wdGNfbG9jaywgZmxhZ3MpOworCWl0YyA9IGlhNjRfZ2V0X2l0YygpOworCW9wdCA9IHB0Y19sb2NrKCZmbGFncyk7CisJaXRjMiA9IGlhNjRfZ2V0X2l0YygpOworCV9fZ2V0X2NwdV92YXIocHRjc3RhdHMpLmxvY2tfaXRjX2Nsb2NrcyArPSBpdGMyIC0gaXRjOworCV9fZ2V0X2NwdV92YXIocHRjc3RhdHMpLnNodWJfcHRjX2ZsdXNoZXMrKzsKKwlfX2dldF9jcHVfdmFyKHB0Y3N0YXRzKS5ub2Rlc19mbHVzaGVkICs9IG5peDsKIAogCWRvIHsKIAkJaWYgKHNodWIxKQpAQCAtMTU3LDcgKzI3NSw3IEBACiAJCQlkYXRhMCA9IChkYXRhMCAmIH5TSDJfUFRDX0FERFJfTUFTSykgfCAoc3RhcnQgJiBTSDJfUFRDX0FERFJfTUFTSyk7CiAJCWZvciAoaSA9IDA7IGkgPCBuaXg7IGkrKykgewogCQkJbmFzaWQgPSBuYXNpZHNbaV07Ci0JCQlpZiAodW5saWtlbHkobmFzaWQgPT0gbXluYXNpZCkpIHsKKwkJCWlmICgoIShzbjJfcHRjdGVzdCAmIDMpKSAmJiB1bmxpa2VseShuYXNpZCA9PSBteW5hc2lkKSkgewogCQkJCWlhNjRfcHRjZ2Eoc3RhcnQsIG5iaXRzIDw8IDIpOwogCQkJCWlhNjRfc3Jsel9pKCk7CiAJCQl9IGVsc2UgewpAQCAtMTY5LDE4ICsyODcsMjIgQEAKIAkJCQlmbHVzaGVkID0gMTsKIAkJCX0KIAkJfQotCiAJCWlmIChmbHVzaGVkCiAJCSAgICAmJiAod2FpdF9waW93YygpICYKLQkJCVNIX1BJT19XUklURV9TVEFUVVNfV1JJVEVfREVBRExPQ0tfTUFTSykpIHsKLQkJCXNuMl9wdGNfZGVhZGxvY2tfcmVjb3ZlcnkocHRjMCwgZGF0YTAsIHB0YzEsIGRhdGExKTsKKwkJCQkoU0hfUElPX1dSSVRFX1NUQVRVU19XUklURV9ERUFETE9DS19NQVNLKSkpIHsKKwkJCXNuMl9wdGNfZGVhZGxvY2tfcmVjb3ZlcnkobmFzaWRzLCBuaXgsIG15bmFzaWQsIHB0YzAsIGRhdGEwLCBwdGMxLCBkYXRhMSk7CiAJCX0KIAogCQlzdGFydCArPSAoMVVMIDw8IG5iaXRzKTsKIAogCX0gd2hpbGUgKHN0YXJ0IDwgZW5kKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNuMl9nbG9iYWxfcHRjX2xvY2ssIGZsYWdzKTsKKwlpdGMyID0gaWE2NF9nZXRfaXRjKCkgLSBpdGMyOworCV9fZ2V0X2NwdV92YXIocHRjc3RhdHMpLnNodWJfaXRjX2Nsb2NrcyArPSBpdGMyOworCWlmIChpdGMyID4gX19nZXRfY3B1X3ZhcihwdGNzdGF0cykuc2h1Yl9pdGNfY2xvY2tzX21heCkKKwkJX19nZXRfY3B1X3ZhcihwdGNzdGF0cykuc2h1Yl9pdGNfY2xvY2tzX21heCA9IGl0YzI7CisKKwlwdGNfdW5sb2NrKGZsYWdzLCBvcHQpOwogCiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KQEAgLTE5MiwzMSArMzE0LDI5IEBACiAgKiBUTEIgZmx1c2ggdHJhbnNhY3Rpb24uICBUaGUgcmVjb3Zlcnkgc2VxdWVuY2UgaXMgc29tZXdoYXQgdHJpY2t5ICYgaXMKICAqIGNvZGVkIGluIGFzc2VtYmx5IGxhbmd1YWdlLgogICovCi12b2lkIHNuMl9wdGNfZGVhZGxvY2tfcmVjb3Zlcnkodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcHRjMCwgdW5zaWduZWQgbG9uZyBkYXRhMCwKK3ZvaWQgc24yX3B0Y19kZWFkbG9ja19yZWNvdmVyeShzaG9ydCAqbmFzaWRzLCBzaG9ydCBuaXgsIGludCBteW5hc2lkLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwdGMwLCB1bnNpZ25lZCBsb25nIGRhdGEwLAogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnB0YzEsIHVuc2lnbmVkIGxvbmcgZGF0YTEpCiB7CiAJZXh0ZXJuIHZvaWQgc24yX3B0Y19kZWFkbG9ja19yZWNvdmVyeV9jb3JlKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZywKIAkgICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZywgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nKTsKLQlpbnQgY25vZGUsIG15Y25vZGUsIG5hc2lkOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnBpb3dzOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgemVyb3ZhbDsKKwlzaG9ydCBuYXNpZCwgaTsKKwl1bnNpZ25lZCBsb25nICpwaW93cywgemVyb3ZhbDsKIAotCXNuMl9wdGNfZGVhZGxvY2tfY291bnQrKzsKKwlfX2dldF9jcHVfdmFyKHB0Y3N0YXRzKS5kZWFkbG9ja3MrKzsKIAotCXBpb3dzID0gcGRhLT5waW9fd3JpdGVfc3RhdHVzX2FkZHI7CisJcGlvd3MgPSAodW5zaWduZWQgbG9uZyAqKSBwZGEtPnBpb193cml0ZV9zdGF0dXNfYWRkcjsKIAl6ZXJvdmFsID0gcGRhLT5waW9fd3JpdGVfc3RhdHVzX3ZhbDsKIAotCW15Y25vZGUgPSBudW1hX25vZGVfaWQoKTsKLQotCWZvcl9lYWNoX29ubGluZV9ub2RlKGNub2RlKSB7Ci0JCWlmIChpc19oZWFkbGVzc19ub2RlKGNub2RlKSB8fCBjbm9kZSA9PSBteWNub2RlKQorCWZvciAoaT0wOyBpIDwgbml4OyBpKyspIHsKKwkJbmFzaWQgPSBuYXNpZHNbaV07CisJCWlmICghKHNuMl9wdGN0ZXN0ICYgMykgJiYgbmFzaWQgPT0gbXluYXNpZCkKIAkJCWNvbnRpbnVlOwotCQluYXNpZCA9IGNub2RlaWRfdG9fbmFzaWQoY25vZGUpOwogCQlwdGMwID0gQ0hBTkdFX05BU0lEKG5hc2lkLCBwdGMwKTsKIAkJaWYgKHB0YzEpCiAJCQlwdGMxID0gQ0hBTkdFX05BU0lEKG5hc2lkLCBwdGMxKTsKIAkJc24yX3B0Y19kZWFkbG9ja19yZWNvdmVyeV9jb3JlKHB0YzAsIGRhdGEwLCBwdGMxLCBkYXRhMSwgcGlvd3MsIHplcm92YWwpOwogCX0KKwogfQogCiAvKioKQEAgLTI5MywzICs0MTMsOTMgQEAKIAogCXNuX3NlbmRfSVBJX3BoeXMobmFzaWQsIHBoeXNpZCwgdmVjdG9yLCBkZWxpdmVyeV9tb2RlKTsKIH0KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKKyNkZWZpbmUgUFRDX0JBU0VOQU1FCSJzZ2lfc24vcHRjX3N0YXRpc3RpY3MiCisKK3N0YXRpYyB2b2lkICpzbjJfcHRjX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKmZpbGUsIGxvZmZfdCAqIG9mZnNldCkKK3sKKwlpZiAoKm9mZnNldCA8IE5SX0NQVVMpCisJCXJldHVybiBvZmZzZXQ7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpzbjJfcHRjX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqZmlsZSwgdm9pZCAqZGF0YSwgbG9mZl90ICogb2Zmc2V0KQoreworCSgqb2Zmc2V0KSsrOworCWlmICgqb2Zmc2V0IDwgTlJfQ1BVUykKKwkJcmV0dXJuIG9mZnNldDsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc24yX3B0Y19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKmZpbGUsIHZvaWQgKmRhdGEpCit7Cit9CisKK3N0YXRpYyBpbnQgc24yX3B0Y19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmZpbGUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHB0Y19zdGF0cyAqc3RhdDsKKwlpbnQgY3B1OworCisJY3B1ID0gKihsb2ZmX3QgKikgZGF0YTsKKworCWlmICghY3B1KSB7CisJCXNlcV9wcmludGYoZmlsZSwgIiMgcHRjX2wgY2hhbmdlX3JpZCBzaHViX3B0Y19mbHVzaGVzIHNodWJfbm9kZXNfZmx1c2hlZCBkZWFkbG9ja3MgbG9ja19uc2VjIHNodWJfbnNlYyBzaHViX25zZWNfbWF4XG4iKTsKKwkJc2VxX3ByaW50ZihmaWxlLCAiIyBwdGN0ZXN0ICVkXG4iLCBzbjJfcHRjdGVzdCk7CisJfQorCisJaWYgKGNwdSA8IE5SX0NQVVMgJiYgY3B1X29ubGluZShjcHUpKSB7CisJCXN0YXQgPSAmcGVyX2NwdShwdGNzdGF0cywgY3B1KTsKKwkJc2VxX3ByaW50ZihmaWxlLCAiY3B1ICVkICVsZCAlbGQgJWxkICVsZCAlbGQgJWxkICVsZCAlbGRcbiIsIGNwdSwgc3RhdC0+cHRjX2wsCisJCQkJc3RhdC0+Y2hhbmdlX3JpZCwgc3RhdC0+c2h1Yl9wdGNfZmx1c2hlcywgc3RhdC0+bm9kZXNfZmx1c2hlZCwKKwkJCQlzdGF0LT5kZWFkbG9ja3MsCisJCQkJMTAwMCAqIHN0YXQtPmxvY2tfaXRjX2Nsb2NrcyAvIHBlcl9jcHUoY3B1X2luZm8sIGNwdSkuY3ljX3Blcl91c2VjLAorCQkJCTEwMDAgKiBzdGF0LT5zaHViX2l0Y19jbG9ja3MgLyBwZXJfY3B1KGNwdV9pbmZvLCBjcHUpLmN5Y19wZXJfdXNlYywKKwkJCQkxMDAwICogc3RhdC0+c2h1Yl9pdGNfY2xvY2tzX21heCAvIHBlcl9jcHUoY3B1X2luZm8sIGNwdSkuY3ljX3Blcl91c2VjKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzbjJfcHRjX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gc24yX3B0Y19zZXFfc3RhcnQsCisJLm5leHQgPSBzbjJfcHRjX3NlcV9uZXh0LAorCS5zdG9wID0gc24yX3B0Y19zZXFfc3RvcCwKKwkuc2hvdyA9IHNuMl9wdGNfc2VxX3Nob3cKK307CisKK2ludCBzbjJfcHRjX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnNuMl9wdGNfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc24yX3B0Y19vcGVyYXRpb25zID0geworCS5vcGVuID0gc24yX3B0Y19wcm9jX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3NuMl9wdGM7CisKK3N0YXRpYyBpbnQgX19pbml0IHNuMl9wdGNfaW5pdCh2b2lkKQoreworCWlmICghKHByb2Nfc24yX3B0YyA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBUQ19CQVNFTkFNRSwgMDQ0NCwgTlVMTCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGNyZWF0ZSAlcyBwcm9jIGVudHJ5IiwgUFRDX0JBU0VOQU1FKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXByb2Nfc24yX3B0Yy0+cHJvY19mb3BzID0gJnByb2Nfc24yX3B0Y19vcGVyYXRpb25zOworCXNwaW5fbG9ja19pbml0KCZzbjJfZ2xvYmFsX3B0Y19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNuMl9wdGNfZXhpdCh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KFBUQ19CQVNFTkFNRSwgTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KHNuMl9wdGNfaW5pdCk7Cittb2R1bGVfZXhpdChzbjJfcHRjX2V4aXQpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKaW5kZXggODMzZTcwMC4uMDUxM2FhYyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxhc20vdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc2FsLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2lvLmg+CkBAIC01OSw3ICs1OCw3IEBACiAJc3RydWN0IHNuX2h3cGVyZl9vYmplY3RfaW5mbyAqb2JqYnVmID0gTlVMTDsKIAogCWlmICgoZSA9IHNuX2h3cGVyZl9pbml0KCkpIDwgMCkgewotCQlwcmludGsoInNuX2h3cGVyZl9pbml0IGZhaWxlZDogZXJyICVkXG4iLCBlKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJzbl9od3BlcmZfaW5pdCBmYWlsZWQ6IGVyciAlZFxuIiwgZSk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTExLDcgKzExMCw3IEBACiAJaWYgKHNuX2h3cGVyZl9sb2NhdGlvbl90b19icG9zKGxvY2F0aW9uLCAmcmFjaywgJmJheSwgJnNsb3QsICZzbGFiKSkKIAkJcmV0dXJuIC0xOwogCi0JZm9yIChjbm9kZSA9IDA7IGNub2RlIDwgbnVtaW9ub2RlczsgY25vZGUrKykgeworCWZvcl9lYWNoX25vZGUoY25vZGUpIHsKIAkJZ2VvaWQgPSBjbm9kZWlkX2dldF9nZW9pZChjbm9kZSk7CiAJCW1vZHVsZV9pZCA9IGdlb19tb2R1bGUoZ2VvaWQpOwogCQl0aGlzX3JhY2sgPSBNT0RVTEVfR0VUX1JBQ0sobW9kdWxlX2lkKTsKQEAgLTEyNCwxMSArMTIzLDEzIEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gY25vZGUgPCBudW1pb25vZGVzID8gY25vZGUgOiAtMTsKKwlyZXR1cm4gbm9kZV9wb3NzaWJsZShjbm9kZSkgPyBjbm9kZSA6IC0xOwogfQogCiBzdGF0aWMgaW50IHNuX2h3cGVyZl9vYmpfdG9fY25vZGUoc3RydWN0IHNuX2h3cGVyZl9vYmplY3RfaW5mbyAqIG9iaikKIHsKKwlpZiAoIVNOX0hXUEVSRl9JU19OT0RFKG9iaikgJiYgIVNOX0hXUEVSRl9JU19JT05PREUob2JqKSkKKwkJQlVHKCk7CiAJaWYgKCFvYmotPnNuX2h3cF90aGlzX3BhcnQpCiAJCXJldHVybiAtMTsKIAlyZXR1cm4gc25faHdwZXJmX2dlb2lkX3RvX2Nub2RlKG9iai0+bG9jYXRpb24pOwpAQCAtMTc0LDMxICsxNzUsMTk5IEBACiAJcmV0dXJuIHNsYWJuYW1lOwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9wY2lfdG9wb2xvZ3koc3RydWN0IHNlcV9maWxlICpzLAotCXN0cnVjdCBzbl9od3BlcmZfb2JqZWN0X2luZm8gKm9iaiwgaW50ICpvcmRpbmFsLAotCXU2NCByYWNrLCB1NjQgYmF5LCB1NjQgc2xvdCwgdTY0IHNsYWIpCitzdGF0aWMgdm9pZCBwcmludF9wY2lfdG9wb2xvZ3koc3RydWN0IHNlcV9maWxlICpzKQogewotCWNoYXIgKnAxOwotCWNoYXIgKnAyOwotCWNoYXIgKnBnOworCWNoYXIgKnA7CisJc2l6ZV90IHN6OworCWludCBlOwogCi0JaWYgKCEocGcgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKSkpCi0JCXJldHVybjsgLyogaWdub3JlICovCi0JaWYgKGlhNjRfc25faW9pZl9nZXRfcGNpX3RvcG9sb2d5KHJhY2ssIGJheSwgc2xvdCwgc2xhYiwKLQkJX19wYShwZyksIFBBR0VfU0laRSkgPT0gU05fSFdQRVJGX09QX09LKSB7Ci0JCWZvciAocDE9cGc7ICpwMSAmJiBwMSA8IHBnICsgUEFHRV9TSVpFOykgewotCQkJaWYgKCEocDIgPSBzdHJjaHIocDEsICdcbicpKSkKLQkJCQlicmVhazsKLQkJCSpwMiA9ICdcMCc7Ci0JCQlzZXFfcHJpbnRmKHMsICJwY2lidXMgJWQgJXMtJXNcbiIsCi0JCQkJKm9yZGluYWwsIG9iai0+bG9jYXRpb24sIHAxKTsKLQkJCSgqb3JkaW5hbCkrKzsKLQkJCXAxID0gcDIgKyAxOworCWZvciAoc3ogPSBQQUdFX1NJWkU7IHN6IDwgMTYgKiBQQUdFX1NJWkU7IHN6ICs9IFBBR0VfU0laRSkgeworCQlpZiAoIShwID0gKGNoYXIgKilrbWFsbG9jKHN6LCBHRlBfS0VSTkVMKSkpCisJCQlicmVhazsKKwkJZSA9IGlhNjRfc25faW9pZl9nZXRfcGNpX3RvcG9sb2d5KF9fcGEocCksIHN6KTsKKwkJaWYgKGUgPT0gU0FMUkVUX09LKQorCQkJc2VxX3B1dHMocywgcCk7CisJCWtmcmVlKHApOworCQlpZiAoZSA9PSBTQUxSRVRfT0sgfHwgZSA9PSBTQUxSRVRfTk9UX0lNUExFTUVOVEVEKQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBzbl9od3BlcmZfaGFzX2NwdXMoY25vZGVpZF90IG5vZGUpCit7CisJcmV0dXJuIG5vZGVfb25saW5lKG5vZGUpICYmIG5yX2NwdXNfbm9kZShub2RlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc25faHdwZXJmX2hhc19tZW0oY25vZGVpZF90IG5vZGUpCit7CisJcmV0dXJuIG5vZGVfb25saW5lKG5vZGUpICYmIE5PREVfREFUQShub2RlKS0+bm9kZV9wcmVzZW50X3BhZ2VzOworfQorCitzdGF0aWMgc3RydWN0IHNuX2h3cGVyZl9vYmplY3RfaW5mbyAqCitzbl9od3BlcmZfZmluZG9ial9pZChzdHJ1Y3Qgc25faHdwZXJmX29iamVjdF9pbmZvICpvYmpidWYsCisJaW50IG5vYmosIGludCBpZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc25faHdwZXJmX29iamVjdF9pbmZvICpwID0gb2JqYnVmOworCisJZm9yIChpPTA7IGkgPCBub2JqOyBpKyssIHArKykgeworCQlpZiAocC0+aWQgPT0gaWQpCisJCQlyZXR1cm4gcDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKKworfQorCitzdGF0aWMgaW50IHNuX2h3cGVyZl9nZXRfbmVhcmVzdF9ub2RlX29iamRhdGEoc3RydWN0IHNuX2h3cGVyZl9vYmplY3RfaW5mbyAqb2JqYnVmLAorCWludCBub2JqLCBjbm9kZWlkX3Qgbm9kZSwgY25vZGVpZF90ICpuZWFyX21lbV9ub2RlLCBjbm9kZWlkX3QgKm5lYXJfY3B1X25vZGUpCit7CisJaW50IGU7CisJc3RydWN0IHNuX2h3cGVyZl9vYmplY3RfaW5mbyAqbm9kZW9iaiA9IE5VTEw7CisJc3RydWN0IHNuX2h3cGVyZl9vYmplY3RfaW5mbyAqb3A7CisJc3RydWN0IHNuX2h3cGVyZl9vYmplY3RfaW5mbyAqZGVzdDsKKwlzdHJ1Y3Qgc25faHdwZXJmX29iamVjdF9pbmZvICpyb3V0ZXI7CisJc3RydWN0IHNuX2h3cGVyZl9wb3J0X2luZm8gcHRkYXRhWzE2XTsKKwlpbnQgc3osIGksIGo7CisJY25vZGVpZF90IGM7CisJaW50IGZvdW5kX21lbSA9IDA7CisJaW50IGZvdW5kX2NwdSA9IDA7CisKKwlpZiAoIW5vZGVfcG9zc2libGUobm9kZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNuX2h3cGVyZl9oYXNfY3B1cyhub2RlKSkgeworCQlpZiAobmVhcl9jcHVfbm9kZSkKKwkJCSpuZWFyX2NwdV9ub2RlID0gbm9kZTsKKwkJZm91bmRfY3B1Kys7CisJfQorCisJaWYgKHNuX2h3cGVyZl9oYXNfbWVtKG5vZGUpKSB7CisJCWlmIChuZWFyX21lbV9ub2RlKQorCQkJKm5lYXJfbWVtX25vZGUgPSBub2RlOworCQlmb3VuZF9tZW0rKzsKKwl9CisKKwlpZiAoZm91bmRfY3B1ICYmIGZvdW5kX21lbSkKKwkJcmV0dXJuIDA7IC8qIHRyaXZpYWxseSBzdWNjZXNzZnVsICovCisKKwkvKiBmaW5kIHRoZSBhcmd1bWVudCBub2RlIG9iamVjdCAqLworCWZvciAoaT0wLCBvcD1vYmpidWY7IGkgPCBub2JqOyBpKyssIG9wKyspIHsKKwkJaWYgKCFTTl9IV1BFUkZfSVNfTk9ERShvcCkgJiYgIVNOX0hXUEVSRl9JU19JT05PREUob3ApKQorCQkJY29udGludWU7CisJCWlmIChub2RlID09IHNuX2h3cGVyZl9vYmpfdG9fY25vZGUob3ApKSB7CisJCQlub2Rlb2JqID0gb3A7CisJCQlicmVhazsKIAkJfQogCX0KLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGcpOworCWlmICghbm9kZW9iaikgeworCQllID0gLUVOT0VOVDsKKwkJZ290byBlcnI7CisJfQorCisJLyogZ2V0IGl0J3MgaW50ZXJjb25uZWN0IHRvcG9sb2d5ICovCisJc3ogPSBvcC0+cG9ydHMgKiBzaXplb2Yoc3RydWN0IHNuX2h3cGVyZl9wb3J0X2luZm8pOworCWlmIChzeiA+IHNpemVvZihwdGRhdGEpKQorCQlCVUcoKTsKKwllID0gaWE2NF9zbl9od3BlcmZfb3Aoc25faHdwZXJmX21hc3Rlcl9uYXNpZCwKKwkJCSAgICAgIFNOX0hXUEVSRl9FTlVNX1BPUlRTLCBub2Rlb2JqLT5pZCwgc3osCisJCQkgICAgICAodTY0KSZwdGRhdGEsIDAsIDAsIE5VTEwpOworCWlmIChlICE9IFNOX0hXUEVSRl9PUF9PSykgeworCQllID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJLyogZmluZCBuZWFyZXN0IG5vZGUgd2l0aCBjcHVzIGFuZCBuZWFyZXN0IG1lbW9yeSAqLworCWZvciAocm91dGVyPU5VTEwsIGo9MDsgaiA8IG9wLT5wb3J0czsgaisrKSB7CisJCWRlc3QgPSBzbl9od3BlcmZfZmluZG9ial9pZChvYmpidWYsIG5vYmosIHB0ZGF0YVtqXS5jb25uX2lkKTsKKwkJaWYgKCFkZXN0IHx8IFNOX0hXUEVSRl9GT1JFSUdOKGRlc3QpIHx8CisJCSAgICAhU05fSFdQRVJGX0lTX05PREUoZGVzdCkgfHwgU05fSFdQRVJGX0lTX0lPTk9ERShkZXN0KSkgeworCQkJY29udGludWU7CisJCX0KKwkJYyA9IHNuX2h3cGVyZl9vYmpfdG9fY25vZGUoZGVzdCk7CisJCWlmICghZm91bmRfY3B1ICYmIHNuX2h3cGVyZl9oYXNfY3B1cyhjKSkgeworCQkJaWYgKG5lYXJfY3B1X25vZGUpCisJCQkJKm5lYXJfY3B1X25vZGUgPSBjOworCQkJZm91bmRfY3B1Kys7CisJCX0KKwkJaWYgKCFmb3VuZF9tZW0gJiYgc25faHdwZXJmX2hhc19tZW0oYykpIHsKKwkJCWlmIChuZWFyX21lbV9ub2RlKQorCQkJCSpuZWFyX21lbV9ub2RlID0gYzsKKwkJCWZvdW5kX21lbSsrOworCQl9CisJCWlmIChTTl9IV1BFUkZfSVNfUk9VVEVSKGRlc3QpKQorCQkJcm91dGVyID0gZGVzdDsKKwl9CisKKwlpZiAocm91dGVyICYmICghZm91bmRfY3B1IHx8ICFmb3VuZF9tZW0pKSB7CisJCS8qIHNlYXJjaCBmb3IgYSBub2RlIGNvbm5lY3RlZCB0byB0aGUgc2FtZSByb3V0ZXIgKi8KKwkJc3ogPSByb3V0ZXItPnBvcnRzICogc2l6ZW9mKHN0cnVjdCBzbl9od3BlcmZfcG9ydF9pbmZvKTsKKwkJaWYgKHN6ID4gc2l6ZW9mKHB0ZGF0YSkpCisJCQlCVUcoKTsKKwkJZSA9IGlhNjRfc25faHdwZXJmX29wKHNuX2h3cGVyZl9tYXN0ZXJfbmFzaWQsCisJCQkJICAgICAgU05fSFdQRVJGX0VOVU1fUE9SVFMsIHJvdXRlci0+aWQsIHN6LAorCQkJCSAgICAgICh1NjQpJnB0ZGF0YSwgMCwgMCwgTlVMTCk7CisJCWlmIChlICE9IFNOX0hXUEVSRl9PUF9PSykgeworCQkJZSA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQlmb3IgKGo9MDsgaiA8IHJvdXRlci0+cG9ydHM7IGorKykgeworCQkJZGVzdCA9IHNuX2h3cGVyZl9maW5kb2JqX2lkKG9iamJ1Ziwgbm9iaiwKKwkJCQlwdGRhdGFbal0uY29ubl9pZCk7CisJCQlpZiAoIWRlc3QgfHwgZGVzdC0+aWQgPT0gbm9kZSB8fAorCQkJICAgIFNOX0hXUEVSRl9GT1JFSUdOKGRlc3QpIHx8CisJCQkgICAgIVNOX0hXUEVSRl9JU19OT0RFKGRlc3QpIHx8CisJCQkgICAgU05fSFdQRVJGX0lTX0lPTk9ERShkZXN0KSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYyA9IHNuX2h3cGVyZl9vYmpfdG9fY25vZGUoZGVzdCk7CisJCQlpZiAoIWZvdW5kX2NwdSAmJiBzbl9od3BlcmZfaGFzX2NwdXMoYykpIHsKKwkJCQlpZiAobmVhcl9jcHVfbm9kZSkKKwkJCQkJKm5lYXJfY3B1X25vZGUgPSBjOworCQkJCWZvdW5kX2NwdSsrOworCQkJfQorCQkJaWYgKCFmb3VuZF9tZW0gJiYgc25faHdwZXJmX2hhc19tZW0oYykpIHsKKwkJCQlpZiAobmVhcl9tZW1fbm9kZSkKKwkJCQkJKm5lYXJfbWVtX25vZGUgPSBjOworCQkJCWZvdW5kX21lbSsrOworCQkJfQorCQkJaWYgKGZvdW5kX2NwdSAmJiBmb3VuZF9tZW0pCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kX2NwdSB8fCAhZm91bmRfbWVtKSB7CisJCS8qIHJlc29ydCB0byBfYW55XyBub2RlIHdpdGggQ1BVcyBhbmQgbWVtb3J5ICovCisJCWZvciAoaT0wLCBvcD1vYmpidWY7IGkgPCBub2JqOyBpKyssIG9wKyspIHsKKwkJCWlmIChTTl9IV1BFUkZfRk9SRUlHTihvcCkgfHwKKwkJCSAgICBTTl9IV1BFUkZfSVNfSU9OT0RFKG9wKSB8fAorCQkJICAgICFTTl9IV1BFUkZfSVNfTk9ERShvcCkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWMgPSBzbl9od3BlcmZfb2JqX3RvX2Nub2RlKG9wKTsKKwkJCWlmICghZm91bmRfY3B1ICYmIHNuX2h3cGVyZl9oYXNfY3B1cyhjKSkgeworCQkJCWlmIChuZWFyX2NwdV9ub2RlKQorCQkJCQkqbmVhcl9jcHVfbm9kZSA9IGM7CisJCQkJZm91bmRfY3B1Kys7CisJCQl9CisJCQlpZiAoIWZvdW5kX21lbSAmJiBzbl9od3BlcmZfaGFzX21lbShjKSkgeworCQkJCWlmIChuZWFyX21lbV9ub2RlKQorCQkJCQkqbmVhcl9tZW1fbm9kZSA9IGM7CisJCQkJZm91bmRfbWVtKys7CisJCQl9CisJCQlpZiAoZm91bmRfY3B1ICYmIGZvdW5kX21lbSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZm91bmRfY3B1IHx8ICFmb3VuZF9tZW0pCisJCWUgPSAtRU5PREFUQTsKKworZXJyOgorCXJldHVybiBlOwogfQogCisKIHN0YXRpYyBpbnQgc25fdG9wb2xvZ3lfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKmQpCiB7CiAJaW50IHN6OwpAQCAtMjE1LDcgKzM4NCw2IEBACiAJc3RydWN0IHNuX2h3cGVyZl9vYmplY3RfaW5mbyAqcDsKIAlzdHJ1Y3Qgc25faHdwZXJmX29iamVjdF9pbmZvICpvYmogPSBkOwkvKiB0aGlzIG9iamVjdCAqLwogCXN0cnVjdCBzbl9od3BlcmZfb2JqZWN0X2luZm8gKm9ianMgPSBzLT5wcml2YXRlOyAvKiBhbGwgb2JqZWN0cyAqLwotCWludCByYWNrLCBiYXksIHNsb3QsIHNsYWI7CiAJdTggc2h1YnR5cGU7CiAJdTggc3lzdGVtX3NpemU7CiAJdTggc2hhcmluZ19zaXplOwpAQCAtMjI1LDcgKzM5Myw2IEBACiAJdTggcmVnaW9uX3NpemU7CiAJdTE2IG5hc2lkX21hc2s7CiAJaW50IG5hc2lkX21zYjsKLQlpbnQgcGNpX2J1c19vcmRpbmFsID0gMDsKIAogCWlmIChvYmogPT0gb2JqcykgewogCQlzZXFfcHJpbnRmKHMsICIjIHNuX3RvcG9sb2d5IHZlcnNpb24gMlxuIik7CkBAIC0yNTMsNiArNDIwLDggQEAKIAkJCXNodWJ0eXBlID8gInNodWIyIiA6ICJzaHViMSIsIAogCQkJKHU2NCluYXNpZF9tYXNrIDw8IG5hc2lkX3NoaWZ0LCBuYXNpZF9tc2IsIG5hc2lkX3NoaWZ0LAogCQkJc3lzdGVtX3NpemUsIHNoYXJpbmdfc2l6ZSwgY29oZXIsIHJlZ2lvbl9zaXplKTsKKworCQlwcmludF9wY2lfdG9wb2xvZ3kocyk7CiAJfQogCiAJaWYgKFNOX0hXUEVSRl9GT1JFSUdOKG9iaikpIHsKQEAgLTI3MiwxMSArNDQxLDI0IEBACiAJaWYgKCFTTl9IV1BFUkZfSVNfTk9ERShvYmopICYmICFTTl9IV1BFUkZfSVNfSU9OT0RFKG9iaikpCiAJCXNlcV9wdXRjKHMsICdcbicpOwogCWVsc2UgeworCQljbm9kZWlkX3QgbmVhcl9tZW0gPSAtMTsKKwkJY25vZGVpZF90IG5lYXJfY3B1ID0gLTE7CisKIAkJc2VxX3ByaW50ZihzLCAiLCBuYXNpZCAweCV4IiwgY25vZGVpZF90b19uYXNpZChvcmRpbmFsKSk7Ci0JCWZvciAoaT0wOyBpIDwgbnVtaW9ub2RlczsgaSsrKSB7Ci0JCQlzZXFfcHJpbnRmKHMsIGkgPyAiOiVkIiA6ICIsIGRpc3QgJWQiLAotCQkJCW5vZGVfZGlzdGFuY2Uob3JkaW5hbCwgaSkpOworCisJCWlmIChzbl9od3BlcmZfZ2V0X25lYXJlc3Rfbm9kZV9vYmpkYXRhKG9ianMsIHNuX2h3cGVyZl9vYmpfY250LAorCQkJb3JkaW5hbCwgJm5lYXJfbWVtLCAmbmVhcl9jcHUpID09IDApIHsKKwkJCXNlcV9wcmludGYocywgIiwgbmVhcl9tZW1fbm9kZWlkICVkLCBuZWFyX2NwdV9ub2RlaWQgJWQiLAorCQkJCW5lYXJfbWVtLCBuZWFyX2NwdSk7CiAJCX0KKworCQlpZiAoIVNOX0hXUEVSRl9JU19JT05PREUob2JqKSkgeworCQkJZm9yX2VhY2hfb25saW5lX25vZGUoaSkgeworCQkJCXNlcV9wcmludGYocywgaSA/ICI6JWQiIDogIiwgZGlzdCAlZCIsCisJCQkJCW5vZGVfZGlzdGFuY2Uob3JkaW5hbCwgaSkpOworCQkJfQorCQl9CisKIAkJc2VxX3B1dGMocywgJ1xuJyk7CiAKIAkJLyoKQEAgLTMwMCwxNyArNDgyLDYgQEAKIAkJCQlzZXFfcHV0YyhzLCAnXG4nKTsKIAkJCX0KIAkJfQotCi0JCS8qCi0JCSAqIFBDSSBidXNzZXMgYXR0YWNoZWQgdG8gdGhpcyBub2RlLCBpZiBhbnkKLQkJICovCi0JCWlmIChzbl9od3BlcmZfbG9jYXRpb25fdG9fYnBvcyhvYmotPmxvY2F0aW9uLAotCQkJJnJhY2ssICZiYXksICZzbG90LCAmc2xhYikpIHsKLQkJCS8qIGV4cG9ydCBwY2kgYnVzIGluZm8gKi8KLQkJCXByaW50X3BjaV90b3BvbG9neShzLCBvYmosICZwY2lfYnVzX29yZGluYWwsCi0JCQkJcmFjaywgYmF5LCBzbG90LCBzbGFiKTsKLQotCQl9CiAJfQogCiAJaWYgKG9iai0+cG9ydHMpIHsKQEAgLTU3Miw2ICs3NDMsOCBAQAogCQlpZiAoKHIgPSBzbl9od3BlcmZfZW51bV9vYmplY3RzKCZub2JqLCAmb2JqcykpID09IDApIHsKIAkJCW1lbXNldChwLCAwLCBhLnN6KTsKIAkJCWZvciAoaSA9IDA7IGkgPCBub2JqOyBpKyspIHsKKwkJCQlpZiAoIVNOX0hXUEVSRl9JU19OT0RFKG9ianMgKyBpKSkKKwkJCQkJY29udGludWU7CiAJCQkJbm9kZSA9IHNuX2h3cGVyZl9vYmpfdG9fY25vZGUob2JqcyArIGkpOwogCQkJCWZvcl9lYWNoX29ubGluZV9jcHUoaikgewogCQkJCQlpZiAobm9kZSAhPSBjcHVfdG9fbm9kZShqKSkKQEAgLTU5OCw3ICs3NzEsNyBAQAogCiAJY2FzZSBTTl9IV1BFUkZfR0VUX05PREVfTkFTSUQ6CiAJCWlmIChhLnN6ICE9IHNpemVvZih1NjQpIHx8Ci0JCSAgIChub2RlID0gYS5hcmcpIDwgMCB8fCBub2RlID49IG51bWlvbm9kZXMpIHsKKwkJICAgKG5vZGUgPSBhLmFyZykgPCAwIHx8ICFub2RlX3Bvc3NpYmxlKG5vZGUpKSB7CiAJCQlyID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KQEAgLTYyNyw2ICs4MDAsMTQgQEAKIAkJCQl2ZnJlZShvYmpzKTsKIAkJCQlnb3RvIGVycm9yOwogCQkJfQorCisJCQlpZiAoIVNOX0hXUEVSRl9JU19OT0RFKG9ianMgKyBpKSAmJgorCQkJICAgICFTTl9IV1BFUkZfSVNfSU9OT0RFKG9ianMgKyBpKSkgeworCQkJICAgIAlyID0gLUVOT0VOVDsKKwkJCQl2ZnJlZShvYmpzKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCiAJCQkqKHU2NCAqKXAgPSAodTY0KXNuX2h3cGVyZl9vYmpfdG9fY25vZGUob2JqcyArIGkpOwogCQkJdmZyZWUob2Jqcyk7CiAJCX0KQEAgLTY5Miw2ICs4NzMsNyBAQAogCiAJLyogc2luZ2xlIHRocmVhZGVkLCBvbmNlLW9ubHkgaW5pdGlhbGl6YXRpb24gKi8KIAlkb3duKCZzbl9od3BlcmZfaW5pdF9tdXRleCk7CisKIAlpZiAoc25faHdwZXJmX3NhbGhlYXApIHsKIAkJdXAoJnNuX2h3cGVyZl9pbml0X211dGV4KTsKIAkJcmV0dXJuIGU7CkBAIC03NDIsMTkgKzkyNCw2IEBACiAJCXNuX2h3cGVyZl9zYWxoZWFwID0gTlVMTDsKIAkJc25faHdwZXJmX29ial9jbnQgPSAwOwogCX0KLQotCWlmICghZSkgewotCQkvKgotCQkgKiBSZWdpc3RlciBhIGR5bmFtaWMgbWlzYyBkZXZpY2UgZm9yIGlvY3RsLiBQbGF0Zm9ybXMKLQkJICogc3VwcG9ydGluZyBob3RwbHVnIHdpbGwgY3JlYXRlIC9kZXYvc25faHdwZXJmLCBlbHNlCi0JCSAqIHVzZXIgY2FuIHRvIGxvb2sgdXAgdGhlIG1pbm9yIG51bWJlciBpbiAvcHJvYy9taXNjLgotCQkgKi8KLQkJaWYgKChlID0gbWlzY19yZWdpc3Rlcigmc25faHdwZXJmX2RldikpICE9IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAic25faHdwZXJmX2luaXQ6IG1pc2MgcmVnaXN0ZXIgIgotCQkJICAgICAgICJmb3IgXCJzbl9od3BlcmZcIiBmYWlsZWQsIGVyciAlZFxuIiwgZSk7Ci0JCX0KLQl9Ci0KIAl1cCgmc25faHdwZXJmX2luaXRfbXV0ZXgpOwogCXJldHVybiBlOwogfQpAQCAtNzgyLDMgKzk1MSw0MSBAQAogCXZmcmVlKHNlcS0+cHJpdmF0ZSk7CiAJcmV0dXJuIHNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKIH0KKworaW50IHNuX2h3cGVyZl9nZXRfbmVhcmVzdF9ub2RlKGNub2RlaWRfdCBub2RlLAorCWNub2RlaWRfdCAqbmVhcl9tZW1fbm9kZSwgY25vZGVpZF90ICpuZWFyX2NwdV9ub2RlKQoreworCWludCBlOworCWludCBub2JqOworCXN0cnVjdCBzbl9od3BlcmZfb2JqZWN0X2luZm8gKm9iamJ1ZjsKKworCWlmICgoZSA9IHNuX2h3cGVyZl9lbnVtX29iamVjdHMoJm5vYmosICZvYmpidWYpKSA9PSAwKSB7CisJCWUgPSBzbl9od3BlcmZfZ2V0X25lYXJlc3Rfbm9kZV9vYmpkYXRhKG9iamJ1Ziwgbm9iaiwKKwkJCW5vZGUsIG5lYXJfbWVtX25vZGUsIG5lYXJfY3B1X25vZGUpOworCQl2ZnJlZShvYmpidWYpOworCX0KKworCXJldHVybiBlOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbl9od3BlcmZfbWlzY19yZWdpc3Rlcl9pbml0KHZvaWQpCit7CisJaW50IGU7CisKKwlzbl9od3BlcmZfaW5pdCgpOworCisJLyoKKwkgKiBSZWdpc3RlciBhIGR5bmFtaWMgbWlzYyBkZXZpY2UgZm9yIGh3cGVyZiBpb2N0bHMuIFBsYXRmb3JtcworCSAqIHN1cHBvcnRpbmcgaG90cGx1ZyB3aWxsIGNyZWF0ZSAvZGV2L3NuX2h3cGVyZiwgZWxzZSB1c2VyCisJICogY2FuIHRvIGxvb2sgdXAgdGhlIG1pbm9yIG51bWJlciBpbiAvcHJvYy9taXNjLgorCSAqLworCWlmICgoZSA9IG1pc2NfcmVnaXN0ZXIoJnNuX2h3cGVyZl9kZXYpKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAic25faHdwZXJmX21pc2NfcmVnaXN0ZXJfaW5pdDogZmFpbGVkIHRvICIKKwkJInJlZ2lzdGVyIG1pc2MgZGV2aWNlIGZvciBcIiVzXCJcbiIsIHNuX2h3cGVyZl9kZXYubmFtZSk7CisJfQorCisJcmV0dXJuIGU7Cit9CisKK2RldmljZV9pbml0Y2FsbChzbl9od3BlcmZfbWlzY19yZWdpc3Rlcl9pbml0KTsgLyogYWZ0ZXIgbWlzY19pbml0KCkgKi8KK0VYUE9SVF9TWU1CT0woc25faHdwZXJmX2dldF9uZWFyZXN0X25vZGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25fcHJvY19mcy5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25fcHJvY19mcy5jCmluZGV4IDZhODBmY2EuLmEwNjcxOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX3Byb2NfZnMuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9zbl9wcm9jX2ZzLmMKQEAgLTMsNyArMyw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0xNSw3ICsxNSw3IEBACiAKIHN0YXRpYyBpbnQgcGFydGl0aW9uX2lkX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQogewotCXNlcV9wcmludGYocywgIiVkXG4iLCBzbl9sb2NhbF9wYXJ0aWQoKSk7CisJc2VxX3ByaW50ZihzLCAiJWRcbiIsIHNuX3BhcnRpdGlvbl9pZCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUyLDcgKzUyLDcgQEAKICAqIHRoZSBicmlkZ2UgY2hpcC4gIFRoZSBoYXJkd2FyZSB3aWxsIHRoZW4gc2VuZCBhbiBpbnRlcnJ1cHQgbWVzc2FnZSBpZiB0aGUKICAqIGludGVycnVwdCBsaW5lIGlzIGFjdGl2ZS4gIFRoaXMgbWltaWNzIGEgbGV2ZWwgc2Vuc2l0aXZlIGludGVycnVwdC4KICAqLwotaW50IHNuX2ZvcmNlX2ludGVycnVwdF9mbGFnID0gMTsKK2V4dGVybiBpbnQgc25fZm9yY2VfaW50ZXJydXB0X2ZsYWc7CiAKIHN0YXRpYyBpbnQgc25fZm9yY2VfaW50ZXJydXB0X3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvdGltZXJfaW50ZXJydXB0LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3NuMi90aW1lcl9pbnRlcnJ1cHQuYwppbmRleCBjZGU3Mzc1Li5hZGY1ZGIyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi90aW1lcl9pbnRlcnJ1cHQuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3NuMi90aW1lcl9pbnRlcnJ1cHQuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCkBAIC01MCwxNCArNTAsMTYgQEAKIAkJCSAgICAgTEVEX0NQVV9IRUFSVEJFQVQsIExFRF9DUFVfSEVBUlRCRUFUKTsKIAl9CiAKLQlpZiAoZW5hYmxlX3NodWJfd2Fyc18xXzEoKSkgewotCQkvKiBCdWdmaXggY29kZSBmb3IgU0hVQiAxLjEgKi8KLQkJaWYgKHBkYS0+cGlvX3NodWJfd2FyX2NhbV9hZGRyKQotCQkJKnBkYS0+cGlvX3NodWJfd2FyX2NhbV9hZGRyID0gMHg4MDAwMDAwMDAwMDAwMDEwVUw7CisJaWYgKGlzX3NodWIxKCkpIHsKKwkJaWYgKGVuYWJsZV9zaHViX3dhcnNfMV8xKCkpIHsKKwkJCS8qIEJ1Z2ZpeCBjb2RlIGZvciBTSFVCIDEuMSAqLworCQkJaWYgKHBkYS0+cGlvX3NodWJfd2FyX2NhbV9hZGRyKQorCQkJCSpwZGEtPnBpb19zaHViX3dhcl9jYW1fYWRkciA9IDB4ODAwMDAwMDAwMDAwMDAxMFVMOworCQl9CisJCWlmIChwZGEtPnNuX2xiX2ludF93YXJfdGlja3MgPT0gMCkKKwkJCXNuX2xiX2ludF93YXJfY2hlY2soKTsKKwkJcGRhLT5zbl9sYl9pbnRfd2FyX3RpY2tzKys7CisJCWlmIChwZGEtPnNuX2xiX2ludF93YXJfdGlja3MgPj0gU05fTEJfSU5UX1dBUl9JTlRFUlZBTCkKKwkJCXBkYS0+c25fbGJfaW50X3dhcl90aWNrcyA9IDA7CiAJfQotCWlmIChwZGEtPnNuX2xiX2ludF93YXJfdGlja3MgPT0gMCkKLQkJc25fbGJfaW50X3dhcl9jaGVjaygpOwotCXBkYS0+c25fbGJfaW50X3dhcl90aWNrcysrOwotCWlmIChwZGEtPnNuX2xiX2ludF93YXJfdGlja3MgPj0gU05fTEJfSU5UX1dBUl9JTlRFUlZBTCkKLQkJcGRhLT5zbl9sYl9pbnRfd2FyX3RpY2tzID0gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYwppbmRleCAyNTRmZTE1Li5iNDVkYjUxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIHsKIAlzdHJ1Y3QgY3hfZGV2ICpjeF9kZXY7CiAKLQljeF9kZXYgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgY3hfZGV2KSwgR0ZQX0tFUk5FTCk7CisJY3hfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGN4X2RldiksIEdGUF9LRVJORUwpOwogCURCRygiY3hfZGV2PSAweCVwXG4iLCBjeF9kZXYpOwogCWlmIChjeF9kZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3hwY19tYWluLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwY19tYWluLmMKaW5kZXggYmIxZDVjZi4uZWQ3YzIxNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX21haW4uYwpAQCAtODg1LDYgKzg4NSwxMCBAQAogCXBpZF90IHBpZDsKIAogCisJaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAkvKgogCSAqIHhwY19yZW1vdGVfY29weV9idWZmZXIgaXMgdXNlZCBhcyBhIHRlbXBvcmFyeSBidWZmZXIgZm9yIGJ0ZV9jb3B5J25nCiAJICogYm90aCBhIHBhcnRpdGlvbidzIHJlc2VydmVkIHBhZ2UgYW5kIGl0cyBYUEMgdmFyaWFibGVzLiBJdHMgc2l6ZSB3YXMKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBuZXQuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBuZXQuYwppbmRleCA3OGMxM2Q2Li5lNWM2ZDNjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3hwbmV0LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cG5ldC5jCkBAIC0xMzAsNyArMTMwLDcgQEAKICAqLwogc3RhdGljIHU2NCB4cG5ldF9icm9hZGNhc3RfcGFydGl0aW9uczsKIC8qIHByb3RlY3QgYWJvdmUgKi8KLXN0YXRpYyBzcGlubG9ja190IHhwbmV0X2Jyb2FkY2FzdF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyh4cG5ldF9icm9hZGNhc3RfbG9jayk7CiAKIC8qCiAgKiBTaW5jZSB0aGUgQmxvY2sgVHJhbnNmZXIgRW5naW5lIChCVEUpIGlzIGJlaW5nIHVzZWQgZm9yIHRoZSB0cmFuc2ZlcgpAQCAtNjM2LDYgKzYzNiwxMCBAQAogCWludCByZXN1bHQgPSAtRU5PTUVNOwogCiAKKwlpZiAoIWlhNjRfcGxhdGZvcm1faXMoInNuMiIpKSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCWRldl9pbmZvKHhwbmV0LCAicmVnaXN0ZXJpbmcgbmV0d29yayBkZXZpY2UgJXNcbiIsIFhQTkVUX0RFVklDRV9OQU1FKTsKIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL01ha2VmaWxlIGIvYXJjaC9pYTY0L3NuL3BjaS9NYWtlZmlsZQppbmRleCAyZjkxNWJjLi4zMjE1NzZiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL01ha2VmaWxlCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvTWFrZWZpbGUKQEAgLTcsNCArNyw0IEBACiAjCiAjIE1ha2VmaWxlIGZvciB0aGUgc24gcGNpIGdlbmVyYWwgcm91dGluZXMuCiAKLW9iai15IDo9IHBjaV9kbWEubyB0aW9jYV9wcm92aWRlci5vIHBjaWJyLyAKK29iai15IDo9IHBjaV9kbWEubyB0aW9jYV9wcm92aWRlci5vIHRpb2NlX3Byb3ZpZGVyLm8gcGNpYnIvCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2RtYS5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYwppbmRleCBiMDU4ZGMyLi4zNDA5MzQ3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2RtYS5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMKQEAgLTMsNyArMyw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTIxNSw4ICsyMTUsOCBAQAogCWludCBpc190aW87CiAJaW50IHdpZF9udW07CiAJaW50IGksIGo7Ci0JaW50IGJ3aW47CiAJdWludDY0X3QgZmxhZ3M7CisJdWludDY0X3QgaXR0ZTsKIAlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmluZm87CiAJdm9sYXRpbGUgc3RydWN0IHNuX2ZsdXNoX2RldmljZV9saXN0ICpwOwogCXN0cnVjdCBzbl9mbHVzaF9uYXNpZF9lbnRyeSAqZmx1c2hfbmFzaWRfbGlzdDsKQEAgLTIzMywzMSArMjMzLDM2IEBACiAJaWYgKCFodWJpbmZvKSB7CiAJCUJVRygpOwogCX0KLQlpc190aW8gPSAobmFzaWQgJiAxKTsKLQlpZiAoaXNfdGlvKSB7Ci0JCXdpZF9udW0gPSBUSU9fU1dJTl9XSURHRVROVU0oYWRkcik7Ci0JCWJ3aW4gPSBUSU9fQldJTl9XSU5ET1dOVU0oYWRkcik7Ci0JfSBlbHNlIHsKLQkJd2lkX251bSA9IFNXSU5fV0lER0VUTlVNKGFkZHIpOwotCQlid2luID0gQldJTl9XSU5ET1dOVU0oYWRkcik7Ci0JfQogCiAJZmx1c2hfbmFzaWRfbGlzdCA9ICZodWJpbmZvLT5oZGlfZmx1c2hfbmFzaWRfbGlzdDsKIAlpZiAoZmx1c2hfbmFzaWRfbGlzdC0+d2lkZ2V0X3AgPT0gTlVMTCkKIAkJcmV0dXJuOwotCWlmIChid2luID4gMCkgewotCQl1aW50NjRfdCBpdHRlID0gZmx1c2hfbmFzaWRfbGlzdC0+aWlvX2l0dGVbYndpbl07CiAKLQkJaWYgKGlzX3RpbykgewotCQkJd2lkX251bSA9IChpdHRlID4+IFRJT19JVFRFX1dJREdFVF9TSElGVCkgJgotCQkJICAgIFRJT19JVFRFX1dJREdFVF9NQVNLOwotCQl9IGVsc2UgewotCQkJd2lkX251bSA9IChpdHRlID4+IElJT19JVFRFX1dJREdFVF9TSElGVCkgJgotCQkJICAgIElJT19JVFRFX1dJREdFVF9NQVNLOwotCQl9CisJaXNfdGlvID0gKG5hc2lkICYgMSk7CisJaWYgKGlzX3RpbykgeworCQlpbnQgaXR0ZV9pbmRleDsKKworCQlpZiAoVElPX0hXSU4oYWRkcikpCisJCQlpdHRlX2luZGV4ID0gMDsKKwkJZWxzZSBpZiAoVElPX0JXSU5fV0lORE9XTlVNKGFkZHIpKQorCQkJaXR0ZV9pbmRleCA9IFRJT19CV0lOX1dJTkRPV05VTShhZGRyKTsKKwkJZWxzZQorCQkJaXR0ZV9pbmRleCA9IC0xOworCisJCWlmIChpdHRlX2luZGV4ID49IDApIHsKKwkJCWl0dGUgPSBmbHVzaF9uYXNpZF9saXN0LT5paW9faXR0ZVtpdHRlX2luZGV4XTsKKwkJCWlmICghIFRJT19JVFRFX1ZBTElEKGl0dGUpKQorCQkJCXJldHVybjsKKwkJCXdpZF9udW0gPSBUSU9fSVRURV9XSURHRVQoaXR0ZSk7CisJCX0gZWxzZQorCQkJd2lkX251bSA9IFRJT19TV0lOX1dJREdFVE5VTShhZGRyKTsKKwl9IGVsc2UgeworCQlpZiAoQldJTl9XSU5ET1dOVU0oYWRkcikpIHsKKwkJCWl0dGUgPSBmbHVzaF9uYXNpZF9saXN0LT5paW9faXR0ZVtCV0lOX1dJTkRPV05VTShhZGRyKV07CisJCQl3aWRfbnVtID0gSUlPX0lUVEVfV0lER0VUKGl0dGUpOworCQl9IGVsc2UKKwkJCXdpZF9udW0gPSBTV0lOX1dJREdFVE5VTShhZGRyKTsKIAl9Ci0JaWYgKGZsdXNoX25hc2lkX2xpc3QtPndpZGdldF9wID09IE5VTEwpCi0JCXJldHVybjsKIAlpZiAoZmx1c2hfbmFzaWRfbGlzdC0+d2lkZ2V0X3Bbd2lkX251bV0gPT0gTlVMTCkKIAkJcmV0dXJuOwogCXAgPSAmZmx1c2hfbmFzaWRfbGlzdC0+d2lkZ2V0X3Bbd2lkX251bV1bMF07CkBAIC0yODMsMTAgKzI4OCwxNiBAQAogCS8qCiAJICogRm9yIFRJT0NQIHVzZSB0aGUgRGV2aWNlKHgpIFdyaXRlIFJlcXVlc3QgQnVmZmVyIEZsdXNoIEJyaWRnZQogCSAqIHJlZ2lzdGVyIHNpbmNlIGl0IGVuc3VyZXMgdGhlIGRhdGEgaGFzIGVudGVyZWQgdGhlIGNvaGVyZW5jZQotCSAqIGRvbWFpbiwgdW5saWtlIFBJQworCSAqIGRvbWFpbiwgdW5saWtlIFBJQy4KIAkgKi8KIAlpZiAoaXNfdGlvKSB7Ci0JCXVpbnQzMl90IHRpb19pZCA9IFJFTU9URV9IVUJfTChuYXNpZCwgVElPX05PREVfSUQpOworCQkvKgorCSAJICogTm90ZTogIGRldmljZXMgYmVoaW5kIFRJT0NFIHNob3VsZCBuZXZlciBiZSBtYXRjaGVkIGluIHRoZQorCQkgKiBhYm92ZSBjb2RlLCBhbmQgc28gdGhlIGZvbGxvd2luZyBjb2RlIGlzIFBJQy9DUCBjZW50cmljLgorCQkgKiBJZiBDRSBldmVyIG5lZWRzIHRoZSBzbl9kbWFfZmx1c2ggbWVjaGFuaXNtLCB3ZSB3aWxsIGhhdmUKKwkJICogdG8gYWNjb3VudCBmb3IgdGhhdCBoZXJlIGFuZCBpbiB0aW9jZV9idXNfZml4dXAoKS4KKwkgCSAqLworCQl1aW50MzJfdCB0aW9faWQgPSBIVUJfTChUSU9fSU9TUEFDRV9BRERSKG5hc2lkLCBUSU9fTk9ERV9JRCkpOwogCQl1aW50MzJfdCByZXZudW0gPSBYV0lER0VUX1BBUlRfUkVWX05VTSh0aW9faWQpOwogCiAJCS8qIFRJT0NQIEJSSU5HVVAgV0FSIChQVjkwNzUxNik6IERvbid0IHdyaXRlIGJ1ZmZlciBmbHVzaCByZWcgKi8KQEAgLTMwNiw3ICszMTcsOCBAQAogCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKHAtPnNmZGxfZm9yY2VfaW50X2FkZHIpID0gMTsKIAogCQkvKiB3YWl0IGZvciB0aGUgaW50ZXJydXB0IHRvIGNvbWUgYmFjay4gKi8KLQkJd2hpbGUgKCoocC0+c2ZkbF9mbHVzaF9hZGRyKSAhPSAweDEwZikgOworCQl3aGlsZSAoKihwLT5zZmRsX2ZsdXNoX2FkZHIpICE9IDB4MTBmKQorCQkJY3B1X3JlbGF4KCk7CiAKIAkJLyogb2theSwgZXZlcnl0aGluZyBpcyBzeW5jaGVkIHVwLiAqLwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKChzcGlubG9ja190ICopJnAtPnNmZGxfZmx1c2hfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCmluZGV4IGI5NWU5MjguLjdiMDNiODAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbjIvc25faHdwZXJmLmg+CiAjaW5jbHVkZSAieHRhbGsveHdpZGdldGRldi5oIgogI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgogCkBAIC02MCw3ICs2MSw3IEBACiAJcmV0X3N0dWZmLnN0YXR1cyA9IDA7CiAJcmV0X3N0dWZmLnYwID0gMDsKIAotCXNlZ21lbnQgPSAwOworCXNlZ21lbnQgPSBzb2Z0LT5wYmlfYnVzY29tbW9uLmJzX3BlcnNpc3Rfc2VnbWVudDsKIAlidXNudW0gPSBzb2Z0LT5wYmlfYnVzY29tbW9uLmJzX3BlcnNpc3RfYnVzbnVtOwogCVNBTF9DQUxMX05PTE9DSyhyZXRfc3R1ZmYsCiAJCQkodTY0KSBTTl9TQUxfSU9JRl9FUlJPUl9JTlRFUlJVUFQsCkBAIC04OCw2ICs4OSw3IEBACiBwY2licl9idXNfZml4dXAoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpwcm9tX2J1c3NvZnQsIHN0cnVjdCBwY2lfY29udHJvbGxlciAqY29udHJvbGxlcikKIHsKIAlpbnQgbmFzaWQsIGNub2RlLCBqOworCWNub2RlaWRfdCBuZWFyX2Nub2RlOwogCXN0cnVjdCBodWJkZXZfaW5mbyAqaHViZGV2X2luZm87CiAJc3RydWN0IHBjaWJ1c19pbmZvICpzb2Z0OwogCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfbGlzdCAqc25fZmx1c2hfZGV2aWNlX2xpc3Q7CkBAIC0xMTUsNyArMTE3LDcgQEAKIAkvKgogCSAqIHJlZ2lzdGVyIHRoZSBicmlkZ2UncyBlcnJvciBpbnRlcnJ1cHQgaGFuZGxlcgogCSAqLwotCWlmIChyZXF1ZXN0X2lycShTR0lfUENJQlJfRVJST1IsICh2b2lkICopcGNpYnJfZXJyb3JfaW50cl9oYW5kbGVyLAorCWlmIChyZXF1ZXN0X2lycShTR0lfUENJQVNJQ19FUlJPUiwgKHZvaWQgKilwY2licl9lcnJvcl9pbnRyX2hhbmRsZXIsCiAJCQlTQV9TSElSUSwgIlBDSUJSIGVycm9yIiwgKHZvaWQgKikoc29mdCkpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJwY2liciBjYW5ub3QgYWxsb2NhdGUgaW50ZXJydXB0IGZvciBlcnJvciBoYW5kbGVyXG4iKTsKQEAgLTE0Miw5ICsxNDQsMTIgQEAKIAkJCSAgICAgaisrLCBzbl9mbHVzaF9kZXZpY2VfbGlzdCsrKSB7CiAJCQkJaWYgKHNuX2ZsdXNoX2RldmljZV9saXN0LT5zZmRsX3Nsb3QgPT0gLTEpCiAJCQkJCWNvbnRpbnVlOwotCQkJCWlmIChzbl9mbHVzaF9kZXZpY2VfbGlzdC0+Ci0JCQkJICAgIHNmZGxfcGVyc2lzdGVudF9idXNudW0gPT0KLQkJCQkgICAgc29mdC0+cGJpX2J1c2NvbW1vbi5ic19wZXJzaXN0X2J1c251bSkKKwkJCQlpZiAoKHNuX2ZsdXNoX2RldmljZV9saXN0LT4KKwkJCQkgICAgIHNmZGxfcGVyc2lzdGVudF9zZWdtZW50ID09CisJCQkJICAgICBzb2Z0LT5wYmlfYnVzY29tbW9uLmJzX3BlcnNpc3Rfc2VnbWVudCkgJiYKKwkJCQkgICAgIChzbl9mbHVzaF9kZXZpY2VfbGlzdC0+CisJCQkJICAgICBzZmRsX3BlcnNpc3RlbnRfYnVzbnVtID09CisJCQkJICAgICBzb2Z0LT5wYmlfYnVzY29tbW9uLmJzX3BlcnNpc3RfYnVzbnVtKSkKIAkJCQkJc25fZmx1c2hfZGV2aWNlX2xpc3QtPnNmZGxfcGNpYnVzX2luZm8gPQogCQkJCQkgICAgc29mdDsKIAkJCX0KQEAgLTE1OCwxMiArMTYzLDE4IEBACiAJbWVtc2V0KHNvZnQtPnBiaV9pbnRfYXRlX3Jlc291cmNlLmF0ZSwgMCwKICAJICAgICAgIChzb2Z0LT5wYmlfaW50X2F0ZV9zaXplICogc2l6ZW9mKHVpbnQ2NF90KSkpOwogCi0JaWYgKHByb21fYnVzc29mdC0+YnNfYXNpY190eXBlID09IFBDSUlPX0FTSUNfVFlQRV9USU9DUCkKLQkJLyoKLQkJICogVElPIFBDSSBCcmlkZ2Ugd2l0aCBubyBjbG9zZXN0IG5vZGUgaW5mb3JtYXRpb24uCi0JCSAqIEZJWE1FOiBGaW5kIGFub3RoZXIgd2F5IHRvIGRldGVybWluZSB0aGUgY2xvc2VzdCBub2RlCi0JCSAqLwotCQljb250cm9sbGVyLT5ub2RlID0gLTE7CisJaWYgKHByb21fYnVzc29mdC0+YnNfYXNpY190eXBlID09IFBDSUlPX0FTSUNfVFlQRV9USU9DUCkgeworCQkvKiBUSU8gUENJIEJyaWRnZTogZmluZCBuZWFyZXN0IG5vZGUgd2l0aCBDUFVzICovCisJCWludCBlID0gc25faHdwZXJmX2dldF9uZWFyZXN0X25vZGUoY25vZGUsIE5VTEwsICZuZWFyX2Nub2RlKTsKKworCQlpZiAoZSA8IDApIHsKKwkJCW5lYXJfY25vZGUgPSAoY25vZGVpZF90KS0xOyAvKiB1c2UgYW55IG5vZGUgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBjaWJyX2J1c19maXh1cDogZmFpbGVkIHRvIGZpbmQgIgorCQkJCSJuZWFyIG5vZGUgd2l0aCBDUFVzIHRvIFRJTyBub2RlICVkLCBlcnI9JWRcbiIsCisJCQkJY25vZGUsIGUpOworCQl9CisJCWNvbnRyb2xsZXItPm5vZGUgPSBuZWFyX2Nub2RlOworCX0KIAllbHNlCiAJCWNvbnRyb2xsZXItPm5vZGUgPSBjbm9kZTsKIAlyZXR1cm4gc29mdDsKQEAgLTE3NSw2ICsxODYsOSBAQAogCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm87CiAJaW50IGJpdCA9IHNuX2lycV9pbmZvLT5pcnFfaW50X2JpdDsKIAorCWlmICghIHNuX2lycV9pbmZvLT5pcnFfYnJpZGdlKQorCQlyZXR1cm47CisKIAlwY2lkZXZfaW5mbyA9IChzdHJ1Y3QgcGNpZGV2X2luZm8gKilzbl9pcnFfaW5mby0+aXJxX3BjaWlvaW5mbzsKIAlpZiAocGNpZGV2X2luZm8pIHsKIAkJcGNpYnVzX2luZm8gPQpAQCAtMTg0LDcgKzE5OCw3IEBACiAJfQogfQogCi12b2lkIHBjaWJyX2NoYW5nZV9kZXZpY2VzX2lycShzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvKQordm9pZCBwY2licl90YXJnZXRfaW50ZXJydXB0KHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pCiB7CiAJc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXZfaW5mbzsKIAlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOwpAQCAtMjE5LDYgKzIzMyw4IEBACiAJLmRtYV9tYXBfY29uc2lzdGVudCA9IHBjaWJyX2RtYV9tYXBfY29uc2lzdGVudCwKIAkuZG1hX3VubWFwID0gcGNpYnJfZG1hX3VubWFwLAogCS5idXNfZml4dXAgPSBwY2licl9idXNfZml4dXAsCisJLmZvcmNlX2ludGVycnVwdCA9IHBjaWJyX2ZvcmNlX2ludGVycnVwdCwKKwkudGFyZ2V0X2ludGVycnVwdCA9IHBjaWJyX3RhcmdldF9pbnRlcnJ1cHQKIH07CiAKIGludApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jIGIvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jCmluZGV4IDVkNzZhNzUuLjE5YmNlZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3Rpb2NhX3Byb3ZpZGVyLmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCXRpb2NhX2tlcm4tPmNhX3BjaWdhcnRfZW50cmllcyA9CiAJICAgIHRpb2NhX2tlcm4tPmNhX3BjaWFwX3NpemUgLyB0aW9jYV9rZXJuLT5jYV9hcF9wYWdlc2l6ZTsKIAl0aW9jYV9rZXJuLT5jYV9wY2lnYXJ0X3BhZ2VtYXAgPQotCSAgICBrY2FsbG9jKDEsIHRpb2NhX2tlcm4tPmNhX3BjaWdhcnRfZW50cmllcyAvIDgsIEdGUF9LRVJORUwpOworCSAgICBremFsbG9jKHRpb2NhX2tlcm4tPmNhX3BjaWdhcnRfZW50cmllcyAvIDgsIEdGUF9LRVJORUwpOwogCWlmICghdGlvY2Ffa2Vybi0+Y2FfcGNpZ2FydF9wYWdlbWFwKSB7CiAJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdGlvY2Ffa2Vybi0+Y2FfZ2FydCwKIAkJCSAgIGdldF9vcmRlcih0aW9jYV9rZXJuLT5jYV9nYXJ0X3NpemUpKTsKQEAgLTM5Miw3ICszOTIsNyBAQAogCSAqIGFsbG9jYXRlIGEgbWFwIHN0cnVjdAogCSAqLwogCi0JY2FfZG1hbWFwID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRpb2NhX2RtYW1hcCksIEdGUF9BVE9NSUMpOworCWNhX2RtYW1hcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW9jYV9kbWFtYXApLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWNhX2RtYW1hcCkKIAkJZ290byBtYXBfcmV0dXJuOwogCkBAIC01NTksNyArNTU5LDcgQEAKIAlyZXRfc3R1ZmYuc3RhdHVzID0gMDsKIAlyZXRfc3R1ZmYudjAgPSAwOwogCi0Jc2VnbWVudCA9IDA7CisJc2VnbWVudCA9IHNvZnQtPmNhX2NvbW1vbi5ic19wZXJzaXN0X3NlZ21lbnQ7CiAJYnVzbnVtID0gc29mdC0+Y2FfY29tbW9uLmJzX3BlcnNpc3RfYnVzbnVtOwogCiAJU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwKQEAgLTYwMCw3ICs2MDAsNyBAQAogCSAqIEFsbG9jYXRlIGtlcm5lbCBidXMgc29mdCBhbmQgY29weSBmcm9tIHByb20uCiAJICovCiAKLQl0aW9jYV9jb21tb24gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdGlvY2FfY29tbW9uKSwgR0ZQX0tFUk5FTCk7CisJdGlvY2FfY29tbW9uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRpb2NhX2NvbW1vbiksIEdGUF9LRVJORUwpOwogCWlmICghdGlvY2FfY29tbW9uKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtNjA5LDcgKzYwOSw3IEBACiAKIAkvKiBpbml0IGtlcm5lbC1wcml2YXRlIGFyZWEgKi8KIAotCXRpb2NhX2tlcm4gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdGlvY2Ffa2VybmVsKSwgR0ZQX0tFUk5FTCk7CisJdGlvY2Ffa2VybiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW9jYV9rZXJuZWwpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRpb2NhX2tlcm4pIHsKIAkJa2ZyZWUodGlvY2FfY29tbW9uKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC02MjIsNyArNjIyLDggQEAKIAkgICAgbmFzaWRfdG9fY25vZGVpZCh0aW9jYV9jb21tb24tPmNhX2Nsb3Nlc3RfbmFzaWQpOwogCXRpb2NhX2NvbW1vbi0+Y2Ffa2VybmVsX3ByaXZhdGUgPSAodWludDY0X3QpIHRpb2NhX2tlcm47CiAKLQlidXMgPSBwY2lfZmluZF9idXMoMCwgdGlvY2FfY29tbW9uLT5jYV9jb21tb24uYnNfcGVyc2lzdF9idXNudW0pOworCWJ1cyA9IHBjaV9maW5kX2J1cyh0aW9jYV9jb21tb24tPmNhX2NvbW1vbi5ic19wZXJzaXN0X3NlZ21lbnQsCisJCXRpb2NhX2NvbW1vbi0+Y2FfY29tbW9uLmJzX3BlcnNpc3RfYnVzbnVtKTsKIAlCVUdfT04oIWJ1cyk7CiAJdGlvY2Ffa2Vybi0+Y2FfZGV2aWNlcyA9ICZidXMtPmRldmljZXM7CiAKQEAgLTY1Niw2ICs2NTcsOCBAQAogCS5kbWFfbWFwX2NvbnNpc3RlbnQgPSB0aW9jYV9kbWFfbWFwLAogCS5kbWFfdW5tYXAgPSB0aW9jYV9kbWFfdW5tYXAsCiAJLmJ1c19maXh1cCA9IHRpb2NhX2J1c19maXh1cCwKKwkuZm9yY2VfaW50ZXJydXB0ID0gTlVMTCwKKwkudGFyZ2V0X2ludGVycnVwdCA9IE5VTEwKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS90aW9jZV9wcm92aWRlci5jIGIvYXJjaC9pYTY0L3NuL3BjaS90aW9jZV9wcm92aWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNzVkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2lhNjQvc24vcGNpL3Rpb2NlX3Byb3ZpZGVyLmMKQEAgLTAsMCArMSw3NzEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KKyNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CisjaW5jbHVkZSA8YXNtL3NuL3Rpb2NlX3Byb3ZpZGVyLmg+CisKKy8qKgorICogQnVzIGFkZHJlc3MgcmFuZ2VzIGZvciB0aGUgNSBmbGF2b3JzIG9mIFRJT0NFIERNQQorICovCisKKyNkZWZpbmUgVElPQ0VfRDY0X01JTgkweDgwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBUSU9DRV9ENjRfTUFYCTB4ZmZmZmZmZmZmZmZmZmZmZlVMCisjZGVmaW5lIFRJT0NFX0Q2NF9BRERSKGEpCSgoYSkgPj0gVElPQ0VfRDY0X01JTikKKworI2RlZmluZSBUSU9DRV9EMzJfTUlOCTB4MDAwMDAwMDA4MDAwMDAwMFVMCisjZGVmaW5lIFRJT0NFX0QzMl9NQVgJMHgwMDAwMDAwMGZmZmZmZmZmVUwKKyNkZWZpbmUgVElPQ0VfRDMyX0FERFIoYSkJKChhKSA+PSBUSU9DRV9EMzJfTUlOICYmIChhKSA8PSBUSU9DRV9EMzJfTUFYKQorCisjZGVmaW5lIFRJT0NFX00zMl9NSU4JMHgwMDAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVElPQ0VfTTMyX01BWAkweDAwMDAwMDAwN2ZmZmZmZmZVTAorI2RlZmluZSBUSU9DRV9NMzJfQUREUihhKQkoKGEpID49IFRJT0NFX00zMl9NSU4gJiYgKGEpIDw9IFRJT0NFX00zMl9NQVgpCisKKyNkZWZpbmUgVElPQ0VfTTQwX01JTgkweDAwMDAwMDQwMDAwMDAwMDBVTAorI2RlZmluZSBUSU9DRV9NNDBfTUFYCTB4MDAwMDAwN2ZmZmZmZmZmZlVMCisjZGVmaW5lIFRJT0NFX000MF9BRERSKGEpCSgoYSkgPj0gVElPQ0VfTTQwX01JTiAmJiAoYSkgPD0gVElPQ0VfTTQwX01BWCkKKworI2RlZmluZSBUSU9DRV9NNDBTX01JTgkweDAwMDAwMDgwMDAwMDAwMDBVTAorI2RlZmluZSBUSU9DRV9NNDBTX01BWAkweDAwMDAwMGZmZmZmZmZmZmZVTAorI2RlZmluZSBUSU9DRV9NNDBTX0FERFIoYSkJKChhKSA+PSBUSU9DRV9NNDBTX01JTiAmJiAoYSkgPD0gVElPQ0VfTTQwU19NQVgpCisKKy8qCisgKiBBVEUgbWFuaXB1bGF0aW9uIG1hY3Jvcy4KKyAqLworCisjZGVmaW5lIEFURV9QQUdFU0hJRlQocHMpCShfX2ZmcyhwcykpCisjZGVmaW5lIEFURV9QQUdFTUFTSyhwcykJKChwcyktMSkKKworI2RlZmluZSBBVEVfUEFHRSh4LCBwcykgKCh4KSA+PiBBVEVfUEFHRVNISUZUKHBzKSkKKyNkZWZpbmUgQVRFX05QQUdFUyhzdGFydCwgbGVuLCBwYWdlc2l6ZSkgXAorCShBVEVfUEFHRSgoc3RhcnQpKyhsZW4pLTEsIHBhZ2VzaXplKSAtIEFURV9QQUdFKHN0YXJ0LCBwYWdlc2l6ZSkgKyAxKQorCisjZGVmaW5lIEFURV9WQUxJRChhdGUpCSgoYXRlKSAmICgxVUwgPDwgNjMpKQorI2RlZmluZSBBVEVfTUFLRShhZGRyLCBwcykgKCgoYWRkcikgJiB+QVRFX1BBR0VNQVNLKHBzKSkgfCAoMVVMIDw8IDYzKSkKKworLyoKKyAqIEZsYXZvcnMgb2YgYXRlLWJhc2VkIG1hcHBpbmcgc3VwcG9ydGVkIGJ5IHRpb2NlX2FsbG9jX21hcCgpCisgKi8KKworI2RlZmluZSBUSU9DRV9BVEVfTTMyCTEKKyNkZWZpbmUgVElPQ0VfQVRFX000MAkyCisjZGVmaW5lIFRJT0NFX0FURV9NNDBTCTMKKworI2RlZmluZSBLQih4KQkoKHgpIDw8IDEwKQorI2RlZmluZSBNQih4KQkoKHgpIDw8IDIwKQorI2RlZmluZSBHQih4KQkoKHgpIDw8IDMwKQorCisvKioKKyAqIHRpb2NlX2RtYV9kNjQgLSBjcmVhdGUgYSBETUEgbWFwcGluZyB1c2luZyA2NC1iaXQgZGlyZWN0IG1vZGUKKyAqIEBjdF9hZGRyOiBzeXN0ZW0gY29yZXRhbGsgYWRkcmVzcworICoKKyAqIE1hcCBAY3RfYWRkciBpbnRvIDY0LWJpdCBDRSBidXMgc3BhY2UuICBObyBkZXZpY2UgY29udGV4dCBpcyBuZWNlc3NhcnkKKyAqIGFuZCBubyBDRSBtYXBwaW5nIGFyZSBjb25zdW1lZC4KKyAqCisgKiBCaXRzIDUzOjAgY29tZSBmcm9tIHRoZSBjb3JldGFsayBhZGRyZXNzLiAgVGhlIHJlbWFpbmluZyBiaXRzIGFyZSBzZXQgYXMKKyAqIGZvbGxvd3M6CisgKgorICogNjMgICAgLSBtdXN0IGJlIDEgdG8gaW5kaWNhdGUgZDY0IG1vZGUgdG8gQ0UgaGFyZHdhcmUKKyAqIDYyICAgIC0gYmFycmllciBiaXQgLi4uIGNvbnRyb2xsZWQgd2l0aCB0aW9jZV9kbWFfYmFycmllcigpCisgKiA2MSAgICAtIDAgc2luY2UgdGhpcyBpcyBub3QgYW4gTVNJIHRyYW5zYWN0aW9uCisgKiA2MDo1NCAtIHJlc2VydmVkLCBNQloKKyAqLworc3RhdGljIHVpbnQ2NF90Cit0aW9jZV9kbWFfZDY0KHVuc2lnbmVkIGxvbmcgY3RfYWRkcikKK3sKKwl1aW50NjRfdCBidXNfYWRkcjsKKworCWJ1c19hZGRyID0gY3RfYWRkciB8ICgxVUwgPDwgNjMpOworCisJcmV0dXJuIGJ1c19hZGRyOworfQorCisvKioKKyAqIHBjaWRldl90b190aW9jZSAtIHJldHVybiBtaXNjIGNlIHJlbGF0ZWQgcG9pbnRlcnMgZ2l2ZW4gYSBwY2lfZGV2CisgKiBAcGNpX2RldjogcGNpIGRldmljZSBjb250ZXh0CisgKiBAYmFzZTogcHRyIHRvIHN0b3JlIHN0cnVjdCB0aW9jZV9tbXIgKiBmb3IgdGhlIENFIGhvbGRpbmcgdGhpcyBkZXZpY2UKKyAqIEBrZXJuZWw6IHB0ciB0byBzdG9yZSBzdHJ1Y3QgdGlvY2Vfa2VybmVsICogZm9yIHRoZSBDRSBob2xkaW5nIHRoaXMgZGV2aWNlCisgKiBAcG9ydDogcHRyIHRvIHN0b3JlIHRoZSBDRSBwb3J0IG51bWJlciB0aGF0IHRoaXMgZGV2aWNlIGlzIG9uCisgKgorICogUmV0dXJuIHBvaW50ZXJzIHRvIHZhcmlvdXMgQ0UtcmVsYXRlZCBzdHJ1Y3R1cmVzIGZvciB0aGUgQ0UgdXBzdHJlYW0gb2YKKyAqIEBwY2lfZGV2LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3BjaWRldl90b190aW9jZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHRpb2NlICoqYmFzZSwKKwkJc3RydWN0IHRpb2NlX2tlcm5lbCAqKmtlcm5lbCwgaW50ICpwb3J0KQoreworCXN0cnVjdCBwY2lkZXZfaW5mbyAqcGNpZGV2X2luZm87CisJc3RydWN0IHRpb2NlX2NvbW1vbiAqY2VfY29tbW9uOworCXN0cnVjdCB0aW9jZV9rZXJuZWwgKmNlX2tlcm5lbDsKKworCXBjaWRldl9pbmZvID0gU05fUENJREVWX0lORk8ocGRldik7CisJY2VfY29tbW9uID0gKHN0cnVjdCB0aW9jZV9jb21tb24gKilwY2lkZXZfaW5mby0+cGRpX3BjaWJ1c19pbmZvOworCWNlX2tlcm5lbCA9IChzdHJ1Y3QgdGlvY2Vfa2VybmVsICopY2VfY29tbW9uLT5jZV9rZXJuZWxfcHJpdmF0ZTsKKworCWlmIChiYXNlKQorCQkqYmFzZSA9IChzdHJ1Y3QgdGlvY2UgKiljZV9jb21tb24tPmNlX3BjaWJ1cy5ic19iYXNlOworCWlmIChrZXJuZWwpCisJCSprZXJuZWwgPSBjZV9rZXJuZWw7CisKKwkvKgorCSAqIHdlIHVzZSBwb3J0IGFzIGEgemVyby1iYXNlZCB2YWx1ZSBpbnRlcm5hbGx5LCBldmVuIHRob3VnaCB0aGUKKwkgKiBkb2N1bWVudGF0aW9uIGlzIDEtYmFzZWQuCisJICovCisJaWYgKHBvcnQpCisJCSpwb3J0ID0KKwkJICAgIChwZGV2LT5idXMtPm51bWJlciA8IGNlX2tlcm5lbC0+Y2VfcG9ydDFfc2Vjb25kYXJ5KSA/IDAgOiAxOworfQorCisvKioKKyAqIHRpb2NlX2FsbG9jX21hcCAtIEdpdmVuIGEgY29yZXRhbGsgYWRkcmVzcywgbWFwIGl0IHRvIHBjaWUgYnVzIGFkZHJlc3MKKyAqIHNwYWNlIHVzaW5nIG9uZSBvZiB0aGUgdmFyaW91cyBBVEUtYmFzZWQgYWRkcmVzcyBtb2Rlcy4KKyAqIEBjZV9rZXJuOiB0aW9jZSBjb250ZXh0CisgKiBAdHlwZTogbWFwIG1vZGUgdG8gdXNlCisgKiBAcG9ydDogMC1iYXNlZCBwb3J0IHRoYXQgdGhlIHJlcXVlc3RpbmcgZGV2aWNlIGlzIGRvd25zdHJlYW0gb2YKKyAqIEBjdF9hZGRyOiB0aGUgY29yZXRhbGsgYWRkcmVzcyB0byBtYXAKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byBtYXAKKyAqCisgKiBHaXZlbiB0aGUgYWRkcmVzc2luZyB0eXBlLCBzZXQgdXAgdmFyaW91cyBwYXJhbWF0ZXJzIHRoYXQgZGVmaW5lIHRoZQorICogQVRFIHBvb2wgdG8gdXNlLiAgU2VhcmNoIGZvciBhIGNvbnRpZ3VvdXMgYmxvY2sgb2YgZW50cmllcyB0byBjb3ZlciB0aGUKKyAqIGxlbmd0aCwgYW5kIGlmIGVub3VnaCByZXNvdXJjZXMgZXhpc3QsIGZpbGwgaW4gdGhlIEFURSdzIGFuZCBjb25zdHJ1Y3QgYQorICogdGlvY2VfZG1hbWFwIHN0cnVjdCB0byB0cmFjayB0aGUgbWFwcGluZy4KKyAqLworc3RhdGljIHVpbnQ2NF90Cit0aW9jZV9hbGxvY19tYXAoc3RydWN0IHRpb2NlX2tlcm5lbCAqY2Vfa2VybiwgaW50IHR5cGUsIGludCBwb3J0LAorCQl1aW50NjRfdCBjdF9hZGRyLCBpbnQgbGVuKQoreworCWludCBpOworCWludCBqOworCWludCBmaXJzdDsKKwlpbnQgbGFzdDsKKwlpbnQgZW50cmllczsKKwlpbnQgbmF0ZXM7CisJaW50IHBhZ2VzaXplOworCXVpbnQ2NF90ICphdGVfc2hhZG93OworCXVpbnQ2NF90ICphdGVfcmVnOworCXVpbnQ2NF90IGFkZHI7CisJc3RydWN0IHRpb2NlICpjZV9tbXI7CisJdWludDY0X3QgYnVzX2Jhc2U7CisJc3RydWN0IHRpb2NlX2RtYW1hcCAqbWFwOworCisJY2VfbW1yID0gKHN0cnVjdCB0aW9jZSAqKWNlX2tlcm4tPmNlX2NvbW1vbi0+Y2VfcGNpYnVzLmJzX2Jhc2U7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFRJT0NFX0FURV9NMzI6CisJCS8qCisJCSAqIFRoZSBmaXJzdCA2NCBlbnRyaWVzIG9mIHRoZSBhdGUzMjQwIHBvb2wgYXJlIGRlZGljYXRlZCB0bworCQkgKiBzdXBlci1wYWdlIChUSU9DRV9BVEVfTTQwUykgbW9kZS4KKwkJICovCisJCWZpcnN0ID0gNjQ7CisJCWVudHJpZXMgPSBUSU9DRV9OVU1fTTMyNDBfQVRFUyAtIDY0OworCQlhdGVfc2hhZG93ID0gY2Vfa2Vybi0+Y2VfYXRlMzI0MF9zaGFkb3c7CisJCWF0ZV9yZWcgPSBjZV9tbXItPmNlX3VyZV9hdGUzMjQwOworCQlwYWdlc2l6ZSA9IGNlX2tlcm4tPmNlX2F0ZTMyNDBfcGFnZXNpemU7CisJCWJ1c19iYXNlID0gVElPQ0VfTTMyX01JTjsKKwkJYnJlYWs7CisJY2FzZSBUSU9DRV9BVEVfTTQwOgorCQlmaXJzdCA9IDA7CisJCWVudHJpZXMgPSBUSU9DRV9OVU1fTTQwX0FURVM7CisJCWF0ZV9zaGFkb3cgPSBjZV9rZXJuLT5jZV9hdGU0MF9zaGFkb3c7CisJCWF0ZV9yZWcgPSBjZV9tbXItPmNlX3VyZV9hdGU0MDsKKwkJcGFnZXNpemUgPSBNQig2NCk7CisJCWJ1c19iYXNlID0gVElPQ0VfTTQwX01JTjsKKwkJYnJlYWs7CisJY2FzZSBUSU9DRV9BVEVfTTQwUzoKKwkJLyoKKwkJICogYXRlMzI0MCBlbnRyaWVzIDAtMzEgYXJlIGRlZGljYXRlZCB0byBwb3J0MSBzdXBlci1wYWdlCisJCSAqIG1hcHBpbmdzLiAgYXRlMzI0MCBlbnRyaWVzIDMyLTYzIGFyZSBkZWRpY2F0ZWQgdG8gcG9ydDIuCisJCSAqLworCQlmaXJzdCA9IHBvcnQgKiAzMjsKKwkJZW50cmllcyA9IDMyOworCQlhdGVfc2hhZG93ID0gY2Vfa2Vybi0+Y2VfYXRlMzI0MF9zaGFkb3c7CisJCWF0ZV9yZWcgPSBjZV9tbXItPmNlX3VyZV9hdGUzMjQwOworCQlwYWdlc2l6ZSA9IEdCKDE2KTsKKwkJYnVzX2Jhc2UgPSBUSU9DRV9NNDBTX01JTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJbmF0ZXMgPSBBVEVfTlBBR0VTKGN0X2FkZHIsIGxlbiwgcGFnZXNpemUpOworCWlmIChuYXRlcyA+IGVudHJpZXMpCisJCXJldHVybiAwOworCisJbGFzdCA9IGZpcnN0ICsgZW50cmllcyAtIG5hdGVzOworCWZvciAoaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgeworCQlpZiAoQVRFX1ZBTElEKGF0ZV9zaGFkb3dbaV0pKQorCQkJY29udGludWU7CisKKwkJZm9yIChqID0gaTsgaiA8IGkgKyBuYXRlczsgaisrKQorCQkJaWYgKEFURV9WQUxJRChhdGVfc2hhZG93W2pdKSkKKwkJCQlicmVhazsKKworCQlpZiAoaiA+PSBpICsgbmF0ZXMpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA+IGxhc3QpCisJCXJldHVybiAwOworCisJbWFwID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRpb2NlX2RtYW1hcCksIEdGUF9BVE9NSUMpOworCWlmICghbWFwKQorCQlyZXR1cm4gMDsKKworCWFkZHIgPSBjdF9hZGRyOworCWZvciAoaiA9IDA7IGogPCBuYXRlczsgaisrKSB7CisJCXVpbnQ2NF90IGF0ZTsKKworCQlhdGUgPSBBVEVfTUFLRShhZGRyLCBwYWdlc2l6ZSk7CisJCWF0ZV9zaGFkb3dbaSArIGpdID0gYXRlOworCQlhdGVfcmVnW2kgKyBqXSA9IGF0ZTsKKwkJYWRkciArPSBwYWdlc2l6ZTsKKwl9CisKKwltYXAtPnJlZmNudCA9IDE7CisJbWFwLT5uYnl0ZXMgPSBuYXRlcyAqIHBhZ2VzaXplOworCW1hcC0+Y3Rfc3RhcnQgPSBjdF9hZGRyICYgfkFURV9QQUdFTUFTSyhwYWdlc2l6ZSk7CisJbWFwLT5wY2lfc3RhcnQgPSBidXNfYmFzZSArIChpICogcGFnZXNpemUpOworCW1hcC0+YXRlX2h3ID0gJmF0ZV9yZWdbaV07CisJbWFwLT5hdGVfc2hhZG93ID0gJmF0ZV9zaGFkb3dbaV07CisJbWFwLT5hdGVfY291bnQgPSBuYXRlczsKKworCWxpc3RfYWRkKCZtYXAtPmNlX2RtYW1hcF9saXN0LCAmY2Vfa2Vybi0+Y2VfZG1hbWFwX2xpc3QpOworCisJcmV0dXJuIChtYXAtPnBjaV9zdGFydCArIChjdF9hZGRyIC0gbWFwLT5jdF9zdGFydCkpOworfQorCisvKioKKyAqIHRpb2NlX2RtYV9kMzIgLSBjcmVhdGUgYSBETUEgbWFwcGluZyB1c2luZyAzMi1iaXQgZGlyZWN0IG1vZGUKKyAqIEBwZGV2OiBsaW51eCBwY2lfZGV2IHJlcHJlc2VudGluZyB0aGUgZnVuY3Rpb24KKyAqIEBwYWRkcjogc3lzdGVtIHBoeXNpY2FsIGFkZHJlc3MKKyAqCisgKiBNYXAgQHBhZGRyIGludG8gMzItYml0IGJ1cyBzcGFjZSBvZiB0aGUgQ0UgYXNzb2NpYXRlZCB3aXRoIEBwY2lkZXZfaW5mby4KKyAqLworc3RhdGljIHVpbnQ2NF90Cit0aW9jZV9kbWFfZDMyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1aW50NjRfdCBjdF9hZGRyKQoreworCWludCBkbWFfb2s7CisJaW50IHBvcnQ7CisJc3RydWN0IHRpb2NlICpjZV9tbXI7CisJc3RydWN0IHRpb2NlX2tlcm5lbCAqY2Vfa2VybjsKKwl1aW50NjRfdCBjdF91cHBlcjsKKwl1aW50NjRfdCBjdF9sb3dlcjsKKwlkbWFfYWRkcl90IGJ1c19hZGRyOworCisJY3RfdXBwZXIgPSBjdF9hZGRyICYgfjB4M2ZmZmZmZmZVTDsKKwljdF9sb3dlciA9IGN0X2FkZHIgJiAweDNmZmZmZmZmVUw7CisKKwlwY2lkZXZfdG9fdGlvY2UocGRldiwgJmNlX21tciwgJmNlX2tlcm4sICZwb3J0KTsKKworCWlmIChjZV9rZXJuLT5jZV9wb3J0W3BvcnRdLmRpcm1hcF9yZWZjbnQgPT0gMCkgeworCQl2b2xhdGlsZSB1aW50NjRfdCB0bXA7CisKKwkJY2Vfa2Vybi0+Y2VfcG9ydFtwb3J0XS5kaXJtYXBfc2hhZG93ID0gY3RfdXBwZXI7CisJCWNlX21tci0+Y2VfdXJlX2Rpcl9tYXBbcG9ydF0gPSBjdF91cHBlcjsKKwkJdG1wID0gY2VfbW1yLT5jZV91cmVfZGlyX21hcFtwb3J0XTsKKwkJZG1hX29rID0gMTsKKwl9IGVsc2UKKwkJZG1hX29rID0gKGNlX2tlcm4tPmNlX3BvcnRbcG9ydF0uZGlybWFwX3NoYWRvdyA9PSBjdF91cHBlcik7CisKKwlpZiAoZG1hX29rKSB7CisJCWNlX2tlcm4tPmNlX3BvcnRbcG9ydF0uZGlybWFwX3JlZmNudCsrOworCQlidXNfYWRkciA9IFRJT0NFX0QzMl9NSU4gKyBjdF9sb3dlcjsKKwl9IGVsc2UKKwkJYnVzX2FkZHIgPSAwOworCisJcmV0dXJuIGJ1c19hZGRyOworfQorCisvKioKKyAqIHRpb2NlX2RtYV9iYXJyaWVyIC0gc3dpenpsZSBhIFRJT0NFIGJ1cyBhZGRyZXNzIHRvIGluY2x1ZGUgb3IgZXhjbHVkZQorICogdGhlIGJhcnJpZXIgYml0LgorICogQGJ1c19hZGRyOiAgYnVzIGFkZHJlc3MgdG8gc3dpenpsZQorICoKKyAqIEdpdmVuIGEgVElPQ0UgYnVzIGFkZHJlc3MsIHNldCB0aGUgYXBwcm9wcmlhdGUgYml0IHRvIGluZGljYXRlIGJhcnJpZXIKKyAqIGF0dHJpYnV0ZXMuCisgKi8KK3N0YXRpYyB1aW50NjRfdAordGlvY2VfZG1hX2JhcnJpZXIodWludDY0X3QgYnVzX2FkZHIsIGludCBvbikKK3sKKwl1aW50NjRfdCBiYXJyaWVyX2JpdDsKKworCS8qIGJhcnJpZXIgbm90IHN1cHBvcnRlZCBpbiBNNDAvTTQwUyBtb2RlICovCisJaWYgKFRJT0NFX000MF9BRERSKGJ1c19hZGRyKSB8fCBUSU9DRV9NNDBTX0FERFIoYnVzX2FkZHIpKQorCQlyZXR1cm4gYnVzX2FkZHI7CisKKwlpZiAoVElPQ0VfRDY0X0FERFIoYnVzX2FkZHIpKQorCQliYXJyaWVyX2JpdCA9ICgxVUwgPDwgNjIpOworCWVsc2UJCQkvKiBtdXN0IGJlIG0zMiBvciBkMzIgKi8KKwkJYmFycmllcl9iaXQgPSAoMVVMIDw8IDMwKTsKKworCXJldHVybiAob24pID8gKGJ1c19hZGRyIHwgYmFycmllcl9iaXQpIDogKGJ1c19hZGRyICYgfmJhcnJpZXJfYml0KTsKK30KKworLyoqCisgKiB0aW9jZV9kbWFfdW5tYXAgLSByZWxlYXNlIENFIG1hcHBpbmcgcmVzb3VyY2VzCisgKiBAcGRldjogbGludXggcGNpX2RldiByZXByZXNlbnRpbmcgdGhlIGZ1bmN0aW9uCisgKiBAYnVzX2FkZHI6IGJ1cyBhZGRyZXNzIHJldHVybmVkIGJ5IGFuIGVhcmxpZXIgdGlvY2VfZG1hX21hcAorICogQGRpcjogbWFwcGluZyBkaXJlY3Rpb24gKHVudXNlZCkKKyAqCisgKiBMb2NhdGUgbWFwcGluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIEBidXNfYWRkciBhbmQgcmVsZWFzZSB0aGVtLgorICogRm9yIG1hcHBpbmdzIGNyZWF0ZWQgdXNpbmcgdGhlIGRpcmVjdCBtb2RlcyB0aGVyZSBhcmUgbm8gcmVzb3VyY2VzCisgKiB0byByZWxlYXNlLgorICovCit2b2lkCit0aW9jZV9kbWFfdW5tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGRtYV9hZGRyX3QgYnVzX2FkZHIsIGludCBkaXIpCit7CisJaW50IGk7CisJaW50IHBvcnQ7CisJc3RydWN0IHRpb2NlX2tlcm5lbCAqY2Vfa2VybjsKKwlzdHJ1Y3QgdGlvY2UgKmNlX21tcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYnVzX2FkZHIgPSB0aW9jZV9kbWFfYmFycmllcihidXNfYWRkciwgMCk7CisJcGNpZGV2X3RvX3Rpb2NlKHBkZXYsICZjZV9tbXIsICZjZV9rZXJuLCAmcG9ydCk7CisKKwkvKiBub3RoaW5nIHRvIGRvIGZvciBENjQgKi8KKworCWlmIChUSU9DRV9ENjRfQUREUihidXNfYWRkcikpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjZV9rZXJuLT5jZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoVElPQ0VfRDMyX0FERFIoYnVzX2FkZHIpKSB7CisJCWlmICgtLWNlX2tlcm4tPmNlX3BvcnRbcG9ydF0uZGlybWFwX3JlZmNudCA9PSAwKSB7CisJCQljZV9rZXJuLT5jZV9wb3J0W3BvcnRdLmRpcm1hcF9zaGFkb3cgPSAwOworCQkJY2VfbW1yLT5jZV91cmVfZGlyX21hcFtwb3J0XSA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgdGlvY2VfZG1hbWFwICptYXA7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXAsICZjZV9rZXJuLT5jZV9kbWFtYXBfbGlzdCwKKwkJCQkgICAgY2VfZG1hbWFwX2xpc3QpIHsKKwkJCXVpbnQ2NF90IGxhc3Q7CisKKwkJCWxhc3QgPSBtYXAtPnBjaV9zdGFydCArIG1hcC0+bmJ5dGVzIC0gMTsKKwkJCWlmIChidXNfYWRkciA+PSBtYXAtPnBjaV9zdGFydCAmJiBidXNfYWRkciA8PSBsYXN0KQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKCZtYXAtPmNlX2RtYW1hcF9saXN0ID09ICZjZV9rZXJuLT5jZV9kbWFtYXBfbGlzdCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogICVzIC0gbm8gbWFwIGZvdW5kIGZvciBidXNfYWRkciAweCVseFxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHBjaV9uYW1lKHBkZXYpLCBidXNfYWRkcik7CisJCX0gZWxzZSBpZiAoLS1tYXAtPnJlZmNudCA9PSAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbWFwLT5hdGVfY291bnQ7IGkrKykgeworCQkJCW1hcC0+YXRlX3NoYWRvd1tpXSA9IDA7CisJCQkJbWFwLT5hdGVfaHdbaV0gPSAwOworCQkJfQorCisJCQlsaXN0X2RlbCgmbWFwLT5jZV9kbWFtYXBfbGlzdCk7CisJCQlrZnJlZShtYXApOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2Vfa2Vybi0+Y2VfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHRpb2NlX2RvX2RtYV9tYXAgLSBtYXAgcGFnZXMgZm9yIFBDSSBETUEKKyAqIEBwZGV2OiBsaW51eCBwY2lfZGV2IHJlcHJlc2VudGluZyB0aGUgZnVuY3Rpb24KKyAqIEBwYWRkcjogaG9zdCBwaHlzaWNhbCBhZGRyZXNzIHRvIG1hcAorICogQGJ5dGVfY291bnQ6IGJ5dGVzIHRvIG1hcAorICoKKyAqIFRoaXMgaXMgdGhlIG1haW4gd3JhcHBlciBmb3IgbWFwcGluZyBob3N0IHBoeXNpY2FsIHBhZ2VzIHRvIENFIFBDSSBzcGFjZS4KKyAqIFRoZSBtYXBwaW5nIG1vZGUgdXNlZCBpcyBiYXNlZCBvbiB0aGUgZGV2aWNlJ3MgZG1hX21hc2suCisgKi8KK3N0YXRpYyB1aW50NjRfdAordGlvY2VfZG9fZG1hX21hcChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDY0X3QgcGFkZHIsIHNpemVfdCBieXRlX2NvdW50LAorCQkgaW50IGJhcnJpZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1aW50NjRfdCBjdF9hZGRyOworCXVpbnQ2NF90IG1hcGFkZHIgPSAwOworCXN0cnVjdCB0aW9jZV9rZXJuZWwgKmNlX2tlcm47CisJc3RydWN0IHRpb2NlX2RtYW1hcCAqbWFwOworCWludCBwb3J0OworCXVpbnQ2NF90IGRtYV9tYXNrOworCisJZG1hX21hc2sgPSAoYmFycmllcikgPyBwZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgOiBwZGV2LT5kbWFfbWFzazsKKworCS8qIGNhcmRzIG11c3QgYmUgYWJsZSB0byBhZGRyZXNzIGF0IGxlYXN0IDMxIGJpdHMgKi8KKwlpZiAoZG1hX21hc2sgPCAweDdmZmZmZmZmVUwpCisJCXJldHVybiAwOworCisJY3RfYWRkciA9IFBIWVNfVE9fVElPRE1BKHBhZGRyKTsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBjYW4gZ2VuZXJhdGUgNjQgYml0IGFkZHJlc3NlcywgY3JlYXRlIGEgRDY0IG1hcC4KKwkgKiBTaW5jZSB0aGlzIHNob3VsZCBuZXZlciBmYWlsLCBieXBhc3MgdGhlIHJlc3Qgb2YgdGhlIGNoZWNrcy4KKwkgKi8KKwlpZiAoZG1hX21hc2sgPT0gfjBVTCkgeworCQltYXBhZGRyID0gdGlvY2VfZG1hX2Q2NChjdF9hZGRyKTsKKwkJZ290byBkbWFfbWFwX2RvbmU7CisJfQorCisJcGNpZGV2X3RvX3Rpb2NlKHBkZXYsIE5VTEwsICZjZV9rZXJuLCAmcG9ydCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2Vfa2Vybi0+Y2VfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBENjQgZGlkbid0IHdvcmsgLi4uIFNlZSBpZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIG1hcCB0aGF0IGNvdmVycworCSAqIHRoaXMgYWRkcmVzcyByYW5nZS4gIE11c3QgYWNjb3VudCBmb3IgZGV2aWNlcyBkbWFfbWFzayBoZXJlIHNpbmNlCisJICogYW4gZXhpc3RpbmcgbWFwIG1pZ2h0IGhhdmUgYmVlbiBkb25lIGluIGEgbW9kZSB1c2luZyBtb3JlIHBjaQorCSAqIGFkZHJlc3MgYml0cyB0aGFuIHRoaXMgZGV2aWNlIGNhbiBzdXBwb3J0LgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkobWFwLCAmY2Vfa2Vybi0+Y2VfZG1hbWFwX2xpc3QsIGNlX2RtYW1hcF9saXN0KSB7CisJCXVpbnQ2NF90IGxhc3Q7CisKKwkJbGFzdCA9IG1hcC0+Y3Rfc3RhcnQgKyBtYXAtPm5ieXRlcyAtIDE7CisJCWlmIChjdF9hZGRyID49IG1hcC0+Y3Rfc3RhcnQgJiYKKwkJICAgIGN0X2FkZHIgKyBieXRlX2NvdW50IC0gMSA8PSBsYXN0ICYmCisJCSAgICBtYXAtPnBjaV9zdGFydCA8PSBkbWFfbWFzaykgeworCQkJbWFwLT5yZWZjbnQrKzsKKwkJCW1hcGFkZHIgPSBtYXAtPnBjaV9zdGFydCArIChjdF9hZGRyIC0gbWFwLT5jdF9zdGFydCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIG1hcCB5ZXQsIGFuZCB0aGUgY2FyZCBjYW4gZ2VuZXJhdGUgNDAKKwkgKiBiaXQgYWRkcmVzc2VzLCB0cnkgdGhlIE00MC9NNDBTIG1vZGVzLiAgTm90ZSB0aGVzZSBtb2RlcyBkbyBub3QKKwkgKiBzdXBwb3J0IGEgYmFycmllciBiaXQsIHNvIGlmIHdlIG5lZWQgYSBjb25zaXN0ZW50IG1hcCB0aGVzZQorCSAqIHdvbid0IHdvcmsuCisJICovCisJaWYgKCFtYXBhZGRyICYmICFiYXJyaWVyICYmIGRtYV9tYXNrID49IDB4ZmZmZmZmZmZmZlVMKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgdHdvIG9wdGlvbnMgZm9yIDQwLWJpdCBtYXBwaW5nczogIDE2R0IgInN1cGVyIiBBVEUncworCQkgKiBhbmQgNjRNQiAicmVndWxhciIgQVRFJ3MuICBXZSdsbCB0cnkgYm90aCBpZiBuZWVkZWQgZm9yIGEKKwkJICogZ2l2ZW4gbWFwcGluZyBidXQgd2hpY2ggb25lIHdlIHRyeSBmaXJzdCBkZXBlbmRzIG9uIHRoZQorCQkgKiBzaXplLiAgRm9yIHJlcXVlc3RzID42NE1CLCBwcmVmZXIgdG8gdXNlIGEgc3VwZXIgcGFnZSB3aXRoCisJCSAqIHJlZ3VsYXIgYXMgdGhlIGZhbGxiYWNrLiBPdGhlcndpc2UsIHRyeSBpbiB0aGUgcmV2ZXJzZSBvcmRlci4KKwkJICovCisKKwkJaWYgKGJ5dGVfY291bnQgPiBNQig2NCkpIHsKKwkJCW1hcGFkZHIgPSB0aW9jZV9hbGxvY19tYXAoY2Vfa2VybiwgVElPQ0VfQVRFX000MFMsCisJCQkJCQkgIHBvcnQsIGN0X2FkZHIsIGJ5dGVfY291bnQpOworCQkJaWYgKCFtYXBhZGRyKQorCQkJCW1hcGFkZHIgPQorCQkJCSAgICB0aW9jZV9hbGxvY19tYXAoY2Vfa2VybiwgVElPQ0VfQVRFX000MCwgLTEsCisJCQkJCQkgICAgY3RfYWRkciwgYnl0ZV9jb3VudCk7CisJCX0gZWxzZSB7CisJCQltYXBhZGRyID0gdGlvY2VfYWxsb2NfbWFwKGNlX2tlcm4sIFRJT0NFX0FURV9NNDAsIC0xLAorCQkJCQkJICBjdF9hZGRyLCBieXRlX2NvdW50KTsKKwkJCWlmICghbWFwYWRkcikKKwkJCQltYXBhZGRyID0KKwkJCQkgICAgdGlvY2VfYWxsb2NfbWFwKGNlX2tlcm4sIFRJT0NFX0FURV9NNDBTLAorCQkJCQkJICAgIHBvcnQsIGN0X2FkZHIsIGJ5dGVfY291bnQpOworCQl9CisJfQorCisJLyoKKwkgKiAzMi1iaXQgZGlyZWN0IGlzIHRoZSBuZXh0IG1vZGUgdG8gdHJ5CisJICovCisJaWYgKCFtYXBhZGRyICYmIGRtYV9tYXNrID49IDB4ZmZmZmZmZmZVTCkKKwkJbWFwYWRkciA9IHRpb2NlX2RtYV9kMzIocGRldiwgY3RfYWRkcik7CisKKwkvKgorCSAqIExhc3QgcmVzb3J0LCB0cnkgMzItYml0IEFURS1iYXNlZCBtYXAuCisJICovCisJaWYgKCFtYXBhZGRyKQorCQltYXBhZGRyID0KKwkJICAgIHRpb2NlX2FsbG9jX21hcChjZV9rZXJuLCBUSU9DRV9BVEVfTTMyLCAtMSwgY3RfYWRkciwKKwkJCQkgICAgYnl0ZV9jb3VudCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjZV9rZXJuLT5jZV9sb2NrLCBmbGFncyk7CisKK2RtYV9tYXBfZG9uZToKKwlpZiAobWFwYWRkciAmIGJhcnJpZXIpCisJCW1hcGFkZHIgPSB0aW9jZV9kbWFfYmFycmllcihtYXBhZGRyLCAxKTsKKworCXJldHVybiBtYXBhZGRyOworfQorCisvKioKKyAqIHRpb2NlX2RtYSAtIHN0YW5kYXJkIHBjaSBkbWEgbWFwIGludGVyZmFjZQorICogQHBkZXY6IHBjaSBkZXZpY2UgcmVxdWVzdGluZyB0aGUgbWFwCisgKiBAcGFkZHI6IHN5c3RlbSBwaHlzaWNhbCBhZGRyZXNzIHRvIG1hcCBpbnRvIHBjaSBzcGFjZQorICogQGJ5dGVfY291bnQ6ICMgYnl0ZXMgdG8gbWFwCisgKgorICogU2ltcGx5IGNhbGwgdGlvY2VfZG9fZG1hX21hcCgpIHRvIGNyZWF0ZSBhIG1hcCB3aXRoIHRoZSBiYXJyaWVyIGJpdCBjbGVhcgorICogaW4gdGhlIGFkZHJlc3MuCisgKi8KK3N0YXRpYyB1aW50NjRfdAordGlvY2VfZG1hKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1aW50NjRfdCBwYWRkciwgc2l6ZV90IGJ5dGVfY291bnQpCit7CisJcmV0dXJuIHRpb2NlX2RvX2RtYV9tYXAocGRldiwgcGFkZHIsIGJ5dGVfY291bnQsIDApOworfQorCisvKioKKyAqIHRpb2NlX2RtYV9jb25zaXN0ZW50IC0gY29uc2lzdGVudCBwY2kgZG1hIG1hcCBpbnRlcmZhY2UKKyAqIEBwZGV2OiBwY2kgZGV2aWNlIHJlcXVlc3RpbmcgdGhlIG1hcAorICogQHBhZGRyOiBzeXN0ZW0gcGh5c2ljYWwgYWRkcmVzcyB0byBtYXAgaW50byBwY2kgc3BhY2UKKyAqIEBieXRlX2NvdW50OiAjIGJ5dGVzIHRvIG1hcAorICoKKyAqIFNpbXBseSBjYWxsIHRpb2NlX2RvX2RtYV9tYXAoKSB0byBjcmVhdGUgYSBtYXAgd2l0aCB0aGUgYmFycmllciBiaXQgc2V0CisgKiBpbiB0aGUgYWRkcmVzcy4KKyAqLyBzdGF0aWMgdWludDY0X3QKK3Rpb2NlX2RtYV9jb25zaXN0ZW50KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1aW50NjRfdCBwYWRkciwgc2l6ZV90IGJ5dGVfY291bnQpCit7CisJcmV0dXJuIHRpb2NlX2RvX2RtYV9tYXAocGRldiwgcGFkZHIsIGJ5dGVfY291bnQsIDEpOworfQorCisvKioKKyAqIHRpb2NlX2Vycm9yX2ludHJfaGFuZGxlciAtIFNHSSBUSU8gQ0UgZXJyb3IgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpcnE6IHVudXNlZAorICogQGFyZzogcG9pbnRlciB0byB0aW9jZV9jb21tb24gc3RydWN0IGZvciB0aGUgZ2l2ZW4gQ0UKKyAqIEBwdDogdW51c2VkCisgKgorICogSGFuZGxlIGEgQ0UgZXJyb3IgaW50ZXJydXB0LiAgU2ltcGx5IGEgd3JhcHBlciBhcm91bmQgYSBTQUwgY2FsbCB3aGljaAorICogZGVmZXJzIHByb2Nlc3NpbmcgdG8gdGhlIFNHSSBwcm9tLgorICovIHN0YXRpYyBpcnFyZXR1cm5fdAordGlvY2VfZXJyb3JfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZywgc3RydWN0IHB0X3JlZ3MgKnB0KQoreworCXN0cnVjdCB0aW9jZV9jb21tb24gKnNvZnQgPSBhcmc7CisJc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7CisJcmV0X3N0dWZmLnN0YXR1cyA9IDA7CisJcmV0X3N0dWZmLnYwID0gMDsKKworCVNBTF9DQUxMX05PTE9DSyhyZXRfc3R1ZmYsICh1NjQpIFNOX1NBTF9JT0lGX0VSUk9SX0lOVEVSUlVQVCwKKwkJCXNvZnQtPmNlX3BjaWJ1cy5ic19wZXJzaXN0X3NlZ21lbnQsCisJCQlzb2Z0LT5jZV9wY2lidXMuYnNfcGVyc2lzdF9idXNudW0sIDAsIDAsIDAsIDAsIDApOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIHRpb2NlX2tlcm5faW5pdCAtIGluaXQga2VybmVsIHN0cnVjdHVyZXMgcmVsYXRlZCB0byBhIGdpdmVuIFRJT0NFCisgKiBAdGlvY2VfY29tbW9uOiBwdHIgdG8gYSBjYWNoZWQgdGlvY2VfY29tbW9uIHN0cnVjdCB0aGF0IG9yaWdpbmF0ZWQgaW4gcHJvbQorICovIHN0YXRpYyBzdHJ1Y3QgdGlvY2Vfa2VybmVsICoKK3Rpb2NlX2tlcm5faW5pdChzdHJ1Y3QgdGlvY2VfY29tbW9uICp0aW9jZV9jb21tb24pCit7CisJaW50IGk7CisJdWludDMyX3QgdG1wOworCXN0cnVjdCB0aW9jZSAqdGlvY2VfbW1yOworCXN0cnVjdCB0aW9jZV9rZXJuZWwgKnRpb2NlX2tlcm47CisKKwl0aW9jZV9rZXJuID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRpb2NlX2tlcm5lbCksIEdGUF9LRVJORUwpOworCWlmICghdGlvY2Vfa2VybikgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl0aW9jZV9rZXJuLT5jZV9jb21tb24gPSB0aW9jZV9jb21tb247CisJc3Bpbl9sb2NrX2luaXQoJnRpb2NlX2tlcm4tPmNlX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZ0aW9jZV9rZXJuLT5jZV9kbWFtYXBfbGlzdCk7CisJdGlvY2VfY29tbW9uLT5jZV9rZXJuZWxfcHJpdmF0ZSA9ICh1aW50NjRfdCkgdGlvY2Vfa2VybjsKKworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBzZWNvbmRhcnkgYnVzIG51bWJlciBvZiB0aGUgcG9ydDIgbG9naWNhbCBQUEIuCisJICogVGhpcyBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIGEgZ2l2ZW4gcGNpIGRldmljZSByZXNpZGVzIG9uCisJICogcG9ydDEgb3IgcG9ydDIuICBOb3RlOiAgV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggcGx1bWJpbmcgc2V0IHVwCisJICogaGVyZSB0byB1c2UgcGNpX3JlYWRfY29uZmlnX3h4eCgpIHNvIHVzZSB0aGUgcmF3X3BjaV9vcHMgdmVjdG9yLgorCSAqLworCisJcmF3X3BjaV9vcHMtPnJlYWQodGlvY2VfY29tbW9uLT5jZV9wY2lidXMuYnNfcGVyc2lzdF9zZWdtZW50LAorCQkJICB0aW9jZV9jb21tb24tPmNlX3BjaWJ1cy5ic19wZXJzaXN0X2J1c251bSwKKwkJCSAgUENJX0RFVkZOKDIsIDApLCBQQ0lfU0VDT05EQVJZX0JVUywgMSwgJnRtcCk7CisJdGlvY2Vfa2Vybi0+Y2VfcG9ydDFfc2Vjb25kYXJ5ID0gKHVpbnQ4X3QpIHRtcDsKKworCS8qCisJICogU2V0IFBNVSBwYWdlc2l6ZSB0byB0aGUgbGFyZ2VzdCBzaXplIGF2YWlsYWJsZSwgYW5kIHplcm8gb3V0CisJICogdGhlIGF0ZSdzLgorCSAqLworCisJdGlvY2VfbW1yID0gKHN0cnVjdCB0aW9jZSAqKXRpb2NlX2NvbW1vbi0+Y2VfcGNpYnVzLmJzX2Jhc2U7CisJdGlvY2VfbW1yLT5jZV91cmVfcGFnZV9tYXAgJj0gfkNFX1VSRV9QQUdFU0laRV9NQVNLOworCXRpb2NlX21tci0+Y2VfdXJlX3BhZ2VfbWFwIHw9IENFX1VSRV8yNTZLX1BBR0VTSVpFOworCXRpb2NlX2tlcm4tPmNlX2F0ZTMyNDBfcGFnZXNpemUgPSBLQigyNTYpOworCisJZm9yIChpID0gMDsgaSA8IFRJT0NFX05VTV9NNDBfQVRFUzsgaSsrKSB7CisJCXRpb2NlX2tlcm4tPmNlX2F0ZTQwX3NoYWRvd1tpXSA9IDA7CisJCXRpb2NlX21tci0+Y2VfdXJlX2F0ZTQwW2ldID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVElPQ0VfTlVNX00zMjQwX0FURVM7IGkrKykgeworCQl0aW9jZV9rZXJuLT5jZV9hdGUzMjQwX3NoYWRvd1tpXSA9IDA7CisJCXRpb2NlX21tci0+Y2VfdXJlX2F0ZTMyNDBbaV0gPSAwOworCX0KKworCXJldHVybiB0aW9jZV9rZXJuOworfQorCisvKioKKyAqIHRpb2NlX2ZvcmNlX2ludGVycnVwdCAtIGltcGxlbWVudCBhbHRpeCBmb3JjZV9pbnRlcnJ1cHQoKSBiYWNrZW5kIGZvciBDRQorICogQHNuX2lycV9pbmZvOiBzbiBhc2ljIGlycSB0aGF0IHdlIG5lZWQgYW4gaW50ZXJydXB0IGdlbmVyYXRlZCBmb3IKKyAqCisgKiBHaXZlbiBhbiBzbl9pcnFfaW5mbyBzdHJ1Y3QsIHNldCB0aGUgcHJvcGVyIGJpdCBpbiBjZV9hZG1fZm9yY2VfaW50IHRvCisgKiBmb3JjZSBhIHNlY29uZGFyeSBpbnRlcnJ1cHQgdG8gYmUgZ2VuZXJhdGVkLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBhbgorICogYXNpYyBpc3N1ZSB3aGVyZSB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBvZiBvcHBvcnR1bml0eSBmb3IgYSBsZWdhY3kgZGV2aWNlCisgKiBpbnRlcnJ1cHQgdG8gYmUgbG9zdC4KKyAqLworc3RhdGljIHZvaWQKK3Rpb2NlX2ZvcmNlX2ludGVycnVwdChzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvKQoreworCXN0cnVjdCBwY2lkZXZfaW5mbyAqcGNpZGV2X2luZm87CisJc3RydWN0IHRpb2NlX2NvbW1vbiAqY2VfY29tbW9uOworCXN0cnVjdCB0aW9jZSAqY2VfbW1yOworCXVpbnQ2NF90IGZvcmNlX2ludF92YWw7CisKKwlpZiAoIXNuX2lycV9pbmZvLT5pcnFfYnJpZGdlKQorCQlyZXR1cm47CisKKwlpZiAoc25faXJxX2luZm8tPmlycV9icmlkZ2VfdHlwZSAhPSBQQ0lJT19BU0lDX1RZUEVfVElPQ0UpCisJCXJldHVybjsKKworCXBjaWRldl9pbmZvID0gKHN0cnVjdCBwY2lkZXZfaW5mbyAqKXNuX2lycV9pbmZvLT5pcnFfcGNpaW9pbmZvOworCWlmICghcGNpZGV2X2luZm8pCisJCXJldHVybjsKKworCWNlX2NvbW1vbiA9IChzdHJ1Y3QgdGlvY2VfY29tbW9uICopcGNpZGV2X2luZm8tPnBkaV9wY2lidXNfaW5mbzsKKwljZV9tbXIgPSAoc3RydWN0IHRpb2NlICopY2VfY29tbW9uLT5jZV9wY2lidXMuYnNfYmFzZTsKKworCS8qCisJICogaXJxX2ludF9iaXQgaXMgb3JpZ2luYWxseSBzZXQgdXAgYnkgcHJvbSwgYW5kIGhvbGRzIHRoZSBpbnRlcnJ1cHQKKwkgKiBiaXQgc2hpZnQgKG5vdCBtYXNrKSBhcyBkZWZpbmVkIGJ5IHRoZSBiaXQgZGVmaW5pdGlvbnMgaW4gdGhlCisJICogY2VfYWRtX2ludCBtbXIuICBUaGVzZSBzaGlmdHMgYXJlIG5vdCB0aGUgc2FtZSBmb3IgdGhlCisJICogY2VfYWRtX2ZvcmNlX2ludCByZWdpc3Rlciwgc28gZG8gYW4gZXhwbGljaXQgbWFwcGluZyBoZXJlIHRvIG1ha2UKKwkgKiB0aGluZ3MgY2xlYXJlci4KKwkgKi8KKworCXN3aXRjaCAoc25faXJxX2luZm8tPmlycV9pbnRfYml0KSB7CisJY2FzZSBDRV9BRE1fSU5UX1BDSUVfUE9SVDFfREVWX0FfU0hGVDoKKwkJZm9yY2VfaW50X3ZhbCA9IDFVTCA8PCBDRV9BRE1fRk9SQ0VfSU5UX1BDSUVfUE9SVDFfREVWX0FfU0hGVDsKKwkJYnJlYWs7CisJY2FzZSBDRV9BRE1fSU5UX1BDSUVfUE9SVDFfREVWX0JfU0hGVDoKKwkJZm9yY2VfaW50X3ZhbCA9IDFVTCA8PCBDRV9BRE1fRk9SQ0VfSU5UX1BDSUVfUE9SVDFfREVWX0JfU0hGVDsKKwkJYnJlYWs7CisJY2FzZSBDRV9BRE1fSU5UX1BDSUVfUE9SVDFfREVWX0NfU0hGVDoKKwkJZm9yY2VfaW50X3ZhbCA9IDFVTCA8PCBDRV9BRE1fRk9SQ0VfSU5UX1BDSUVfUE9SVDFfREVWX0NfU0hGVDsKKwkJYnJlYWs7CisJY2FzZSBDRV9BRE1fSU5UX1BDSUVfUE9SVDFfREVWX0RfU0hGVDoKKwkJZm9yY2VfaW50X3ZhbCA9IDFVTCA8PCBDRV9BRE1fRk9SQ0VfSU5UX1BDSUVfUE9SVDFfREVWX0RfU0hGVDsKKwkJYnJlYWs7CisJY2FzZSBDRV9BRE1fSU5UX1BDSUVfUE9SVDJfREVWX0FfU0hGVDoKKwkJZm9yY2VfaW50X3ZhbCA9IDFVTCA8PCBDRV9BRE1fRk9SQ0VfSU5UX1BDSUVfUE9SVDJfREVWX0FfU0hGVDsKKwkJYnJlYWs7CisJY2FzZSBDRV9BRE1fSU5UX1BDSUVfUE9SVDJfREVWX0JfU0hGVDoKKwkJZm9yY2VfaW50X3ZhbCA9IDFVTCA8PCBDRV9BRE1fRk9SQ0VfSU5UX1BDSUVfUE9SVDJfREVWX0JfU0hGVDsKKwkJYnJlYWs7CisJY2FzZSBDRV9BRE1fSU5UX1BDSUVfUE9SVDJfREVWX0NfU0hGVDoKKwkJZm9yY2VfaW50X3ZhbCA9IDFVTCA8PCBDRV9BRE1fRk9SQ0VfSU5UX1BDSUVfUE9SVDJfREVWX0NfU0hGVDsKKwkJYnJlYWs7CisJY2FzZSBDRV9BRE1fSU5UX1BDSUVfUE9SVDJfREVWX0RfU0hGVDoKKwkJZm9yY2VfaW50X3ZhbCA9IDFVTCA8PCBDRV9BRE1fRk9SQ0VfSU5UX1BDSUVfUE9SVDJfREVWX0RfU0hGVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKwljZV9tbXItPmNlX2FkbV9mb3JjZV9pbnQgPSBmb3JjZV9pbnRfdmFsOworfQorCisvKioKKyAqIHRpb2NlX3RhcmdldF9pbnRlcnJ1cHQgLSBpbXBsZW1lbnQgc2V0X2lycV9hZmZpbml0eSBmb3IgdGlvY2UgcmVzaWRlbnQKKyAqIGZ1bmN0aW9ucy4gIE5vdGU6ICBvbmx5IGFwcGxpZXMgdG8gbGluZSBpbnRlcnJ1cHRzLCBub3QgTVNJJ3MuCisgKgorICogQHNuX2lycV9pbmZvOiBTTiBJUlEgY29udGV4dAorICoKKyAqIEdpdmVuIGFuIHNuX2lycV9pbmZvLCBzZXQgdGhlIGFzc29jaWF0ZWQgQ0UgZGV2aWNlJ3MgaW50ZXJydXB0IGRlc3RpbmF0aW9uCisgKiByZWdpc3Rlci4gIFNpbmNlIHRoZSBpbnRlcnJ1cHQgZGVzdGluYXRpb24gcmVnaXN0ZXJzIGFyZSBvbiBhIHBlci1jZS1zbG90CisgKiBiYXNpcywgdGhpcyB3aWxsIHJldGFyZ2V0IGxpbmUgaW50ZXJydXB0cyBmb3IgYWxsIGZ1bmN0aW9ucyBkb3duc3RyZWFtIG9mCisgKiB0aGUgc2xvdC4KKyAqLworc3RhdGljIHZvaWQKK3Rpb2NlX3RhcmdldF9pbnRlcnJ1cHQoc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbykKK3sKKwlzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9pbmZvOworCXN0cnVjdCB0aW9jZV9jb21tb24gKmNlX2NvbW1vbjsKKwlzdHJ1Y3QgdGlvY2UgKmNlX21tcjsKKwlpbnQgYml0OworCisJcGNpZGV2X2luZm8gPSAoc3RydWN0IHBjaWRldl9pbmZvICopc25faXJxX2luZm8tPmlycV9wY2lpb2luZm87CisJaWYgKCFwY2lkZXZfaW5mbykKKwkJcmV0dXJuOworCisJY2VfY29tbW9uID0gKHN0cnVjdCB0aW9jZV9jb21tb24gKilwY2lkZXZfaW5mby0+cGRpX3BjaWJ1c19pbmZvOworCWNlX21tciA9IChzdHJ1Y3QgdGlvY2UgKiljZV9jb21tb24tPmNlX3BjaWJ1cy5ic19iYXNlOworCisJYml0ID0gc25faXJxX2luZm8tPmlycV9pbnRfYml0OworCisJY2VfbW1yLT5jZV9hZG1faW50X21hc2sgfD0gKDFVTCA8PCBiaXQpOworCWNlX21tci0+Y2VfYWRtX2ludF9kZXN0W2JpdF0gPQorCQkoKHVpbnQ2NF90KXNuX2lycV9pbmZvLT5pcnFfaXJxIDw8IElOVFJfVkVDVE9SX1NIRlQpIHwKKwkJCSAgIHNuX2lycV9pbmZvLT5pcnFfeHRhbGthZGRyOworCWNlX21tci0+Y2VfYWRtX2ludF9tYXNrICY9IH4oMVVMIDw8IGJpdCk7CisKKwl0aW9jZV9mb3JjZV9pbnRlcnJ1cHQoc25faXJxX2luZm8pOworfQorCisvKioKKyAqIHRpb2NlX2J1c19maXh1cCAtIHBlcmZvcm0gZmluYWwgUENJIGZpeHVwIGZvciBhIFRJTyBDRSBidXMKKyAqIEBwcm9tX2J1c3NvZnQ6IENvbW1vbiBwcm9tL2tlcm5lbCBzdHJ1Y3QgcmVwcmVzZW50aW5nIHRoZSBidXMKKyAqCisgKiBSZXBsaWNhdGVzIHRoZSB0aW9jZV9jb21tb24gcG9pbnRlZCB0byBieSBAcHJvbV9idXNzb2Z0IGluIGtlcm5lbAorICogc3BhY2UuICBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGEga2VybmVsLW9ubHkgYXJlYSBmb3IgYSBnaXZlbiBDRSwKKyAqIGFuZCBzZXRzIHVwIGFuIGlycSBmb3IgaGFuZGxpbmcgQ0UgZXJyb3IgaW50ZXJydXB0cy4KKyAqCisgKiBPbiBzdWNjZXNzZnVsIHNldHVwLCByZXR1cm5zIHRoZSBrZXJuZWwgdmVyc2lvbiBvZiB0aW9jZV9jb21tb24gYmFjayB0bworICogdGhlIGNhbGxlci4KKyAqLworc3RhdGljIHZvaWQgKgordGlvY2VfYnVzX2ZpeHVwKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqcHJvbV9idXNzb2Z0LCBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCit7CisJc3RydWN0IHRpb2NlX2NvbW1vbiAqdGlvY2VfY29tbW9uOworCisJLyoKKwkgKiBBbGxvY2F0ZSBrZXJuZWwgYnVzIHNvZnQgYW5kIGNvcHkgZnJvbSBwcm9tLgorCSAqLworCisJdGlvY2VfY29tbW9uID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRpb2NlX2NvbW1vbiksIEdGUF9LRVJORUwpOworCWlmICghdGlvY2VfY29tbW9uKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweSh0aW9jZV9jb21tb24sIHByb21fYnVzc29mdCwgc2l6ZW9mKHN0cnVjdCB0aW9jZV9jb21tb24pKTsKKwl0aW9jZV9jb21tb24tPmNlX3BjaWJ1cy5ic19iYXNlIHw9IF9fSUE2NF9VTkNBQ0hFRF9PRkZTRVQ7CisKKwlpZiAodGlvY2Vfa2Vybl9pbml0KHRpb2NlX2NvbW1vbikgPT0gTlVMTCkgeworCQlrZnJlZSh0aW9jZV9jb21tb24pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoU0dJX1BDSUFTSUNfRVJST1IsCisJCQl0aW9jZV9lcnJvcl9pbnRyX2hhbmRsZXIsCisJCQlTQV9TSElSUSwgIlRJT0NFIGVycm9yIiwgKHZvaWQgKil0aW9jZV9jb21tb24pKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6ICBVbmFibGUgdG8gZ2V0IGlycSAlZC4gICIKKwkJICAgICAgICJFcnJvciBpbnRlcnJ1cHRzIHdvbid0IGJlIHJvdXRlZCBmb3IgIgorCQkgICAgICAgIlRJT0NFIGJ1cyAlMDR4OiUwMnhcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIFNHSV9QQ0lBU0lDX0VSUk9SLAorCQkgICAgICAgdGlvY2VfY29tbW9uLT5jZV9wY2lidXMuYnNfcGVyc2lzdF9zZWdtZW50LAorCQkgICAgICAgdGlvY2VfY29tbW9uLT5jZV9wY2lidXMuYnNfcGVyc2lzdF9idXNudW0pOworCisJcmV0dXJuIHRpb2NlX2NvbW1vbjsKK30KKworc3RhdGljIHN0cnVjdCBzbl9wY2lidXNfcHJvdmlkZXIgdGlvY2VfcGNpX2ludGVyZmFjZXMgPSB7CisJLmRtYV9tYXAgPSB0aW9jZV9kbWEsCisJLmRtYV9tYXBfY29uc2lzdGVudCA9IHRpb2NlX2RtYV9jb25zaXN0ZW50LAorCS5kbWFfdW5tYXAgPSB0aW9jZV9kbWFfdW5tYXAsCisJLmJ1c19maXh1cCA9IHRpb2NlX2J1c19maXh1cCwKKwkuZm9yY2VfaW50ZXJydXB0ID0gdGlvY2VfZm9yY2VfaW50ZXJydXB0LAorCS50YXJnZXRfaW50ZXJydXB0ID0gdGlvY2VfdGFyZ2V0X2ludGVycnVwdAorfTsKKworLyoqCisgKiB0aW9jZV9pbml0X3Byb3ZpZGVyIC0gaW5pdCBTTiBQQ0kgcHJvdmlkZXIgb3BzIGZvciBUSU8gQ0UKKyAqLworaW50Cit0aW9jZV9pbml0X3Byb3ZpZGVyKHZvaWQpCit7CisJc25fcGNpX3Byb3ZpZGVyW1BDSUlPX0FTSUNfVFlQRV9USU9DRV0gPSAmdGlvY2VfcGNpX2ludGVyZmFjZXM7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL20zMnIvS2NvbmZpZyBiL2FyY2gvbTMyci9LY29uZmlnCmluZGV4IDc2MjJkNGUuLjFlZjM5ODcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9LY29uZmlnCisrKyBiL2FyY2gvbTMyci9LY29uZmlnCkBAIC0yNDIsOCArMjQyLDggQEAKIAkgIFkgdG8gIkVuaGFuY2VkIFJlYWwgVGltZSBDbG9jayBTdXBwb3J0IiwgYmVsb3cuIFRoZSAiQWR2YW5jZWQgUG93ZXIKIAkgIE1hbmFnZW1lbnQiIGNvZGUgd2lsbCBiZSBkaXNhYmxlZCBpZiB5b3Ugc2F5IFkgaGVyZS4KIAotCSAgU2VlIGFsc28gdGhlIDxmaWxlOkRvY3VtZW50YXRpb24vc21wLnRleD4sCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NtcC50eHQ+IGFuZCB0aGUgU01QLUhPV1RPIGF2YWlsYWJsZSBhdAorCSAgU2VlIGFsc28gdGhlIDxmaWxlOkRvY3VtZW50YXRpb24vc21wLnR4dD4sCisJICBhbmQgdGhlIFNNUC1IT1dUTyBhdmFpbGFibGUgYXQKIAkgIDxodHRwOi8vd3d3LmxpbnV4ZG9jLm9yZy9kb2NzLmh0bWwjaG93dG8+LgogCiAJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9tMzJyL2tlcm5lbC9hc20tb2Zmc2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjYzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL20zMnIva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTAsMCArMSBAQAorLyogRHVtbXkgYXNtLW9mZnNldHMuYyBmaWxlLiBSZXF1aXJlZCBieSBrYnVpbGQgYW5kIHJlYWR5IHRvIGJlIHVzZWQgLSBoaW50ISAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zbXAuYyBiL2FyY2gvbTMyci9rZXJuZWwvc21wLmMKaW5kZXggNDhiMTg3Zi4uYTQ1NzZhYyAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL20zMnIva2VybmVsL3NtcC5jCkBAIC04OTIsNyArODkyLDYgQEAKIAlpbnQgdHJ5KQogewogCXNwaW5sb2NrX3QgKmlwaWxvY2s7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqaXBpY3JfYWRkcjsKIAl1bnNpZ25lZCBsb25nIGlwaWNyX3ZhbDsKIAl1bnNpZ25lZCBsb25nIG15X3BoeXNpZF9tYXNrOwpAQCAtOTE2LDUwICs5MTUsMjcgQEAKIAkgKiB3cml0ZSBJUElDUmkgKHNlbmQgSVBJaSkKIAkgKiB1bmxvY2sgaXBpX2xvY2tbaV0KIAkgKi8KKwlzcGluX2xvY2soaXBpbG9jayk7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkiOzsgTE9DSyBpcGlfbG9ja1tpXQkJXG5cdCIKLQkJIi5maWxsaW5zbgkJCVxuIgotCQkiMToJCQkJXG5cdCIKLQkJIm12ZmMJJTEsIHBzdyAJCVxuXHQiCi0JCSJjbHJwc3cJIzB4NDAgLT4gbm9wCQlcblx0IgotCQlEQ0FDSEVfQ0xFQVIoInI0IiwgInI1IiwgIiUyIikKLQkJImxvY2sJcjQsIEAlMgkJCVxuXHQiCi0JCSJhZGRpCXI0LCAjLTEJCQlcblx0IgotCQkidW5sb2NrCXI0LCBAJTIJCQlcblx0IgotCQkibXZ0YwklMSwgcHN3CQkJXG5cdCIKLQkJImJuZXoJcjQsIDJmCQkJXG5cdCIKLQkJTE9DS19TRUNUSU9OX1NUQVJUKCIuYmFsaWduIDQgXG5cdCIpCi0JCSIuZmlsbGluc24JCQlcbiIKLQkJIjI6CQkJCVxuXHQiCi0JCSJsZAlyNCwgQCUyCQkJXG5cdCIKLQkJImJsZXoJcjQsIDJiCQkJXG5cdCIKLQkJImJyYQkxYgkJCVxuXHQiCi0JCUxPQ0tfU0VDVElPTl9FTkQKIAkJIjs7IENIRUNLIElQSUNSaSA9PSAwCQlcblx0IgogCQkiLmZpbGxpbnNuCQkJXG4iCi0JCSIzOgkJCQlcblx0IgotCQkibGQJJTAsIEAlMwkJCVxuXHQiCi0JCSJhbmQJJTAsICU2CQkJXG5cdCIKLQkJImJlcXoJJTAsIDRmCQkJXG5cdCIKLQkJImJuZXoJJTUsIDVmCQkJXG5cdCIKLQkJImJyYQkzYgkJCVxuXHQiCisJCSIxOgkJCQlcblx0IgorCQkibGQJJTAsIEAlMQkJCVxuXHQiCisJCSJhbmQJJTAsICU0CQkJXG5cdCIKKwkJImJlcXoJJTAsIDJmCQkJXG5cdCIKKwkJImJuZXoJJTMsIDNmCQkJXG5cdCIKKwkJImJyYQkxYgkJCVxuXHQiCiAJCSI7OyBXUklURSBJUElDUmkgKHNlbmQgSVBJaSkJXG5cdCIKIAkJIi5maWxsaW5zbgkJCVxuIgotCQkiNDoJCQkJXG5cdCIKLQkJInN0CSU0LCBAJTMJCQlcblx0IgotCQkiOzsgVU5MT0NLIGlwaV9sb2NrW2ldCQlcblx0IgorCQkiMjoJCQkJXG5cdCIKKwkJInN0CSUyLCBAJTEJCQlcblx0IgogCQkiLmZpbGxpbnNuCQkJXG4iCi0JCSI1OgkJCQlcblx0IgotCQkibGRpCXI0LCAjMQkJCVxuXHQiCi0JCSJzdAlyNCwgQCUyCQkJXG5cdCIKKwkJIjM6CQkJCVxuXHQiCiAJCTogIj0mciIoaXBpY3JfdmFsKQotCQk6ICJyIihmbGFncyksICJyIigmaXBpbG9jay0+c2xvY2spLCAiciIoaXBpY3JfYWRkciksCi0JCSAgInIiKG1hc2spLCAiciIodHJ5KSwgInIiKG15X3BoeXNpZF9tYXNrKQotCQk6ICJtZW1vcnkiLCAicjQiCi0jaWZkZWYgQ09ORklHX0NISVBfTTMyNzAwX1RTMQotCQksICJyNSIKLSNlbmRpZgkvKiBDT05GSUdfQ0hJUF9NMzI3MDBfVFMxICovCisJCTogInIiKGlwaWNyX2FkZHIpLCAiciIobWFzayksICJyIih0cnkpLCAiciIobXlfcGh5c2lkX21hc2spCisJCTogIm1lbW9yeSIKIAkpOworCXNwaW5fdW5sb2NrKGlwaWxvY2spOwogCiAJcmV0dXJuIGlwaWNyX3ZhbDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvdGltZS5jIGIvYXJjaC9tMzJyL2tlcm5lbC90aW1lLmMKaW5kZXggOGEyYjc3Yi4uNTM5YzU2MiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC90aW1lLmMKQEAgLTE3MSwxMCArMTcxLDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAKQEAgLTIyMSw3ICsyMTgsNyBAQAogCSAqIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byA1MDAgbXMgYmVmb3JlIHRoZSBuZXcgc2Vjb25kIHN0YXJ0cy4KIAkgKi8KIAl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKLQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMAorCWlmIChudHBfc3luY2VkKCkKIAkJJiYgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwCiAJCSYmICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPj0gNTAwMDAwIC0gKCh1bnNpZ25lZClUSUNLX1NJWkUpIC8gMgogCQkmJiAoeHRpbWUudHZfbnNlYyAvIDEwMDApIDw9IDUwMDAwMCArICgodW5zaWduZWQpVElDS19TSVpFKSAvIDIpCmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZyBiL2FyY2gvbTY4ay9LY29uZmlnCmluZGV4IDE3OGM0YTMuLmJhOTYwYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnCkBAIC0yNSw2ICsyNSwxMSBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJYm9vbAorCWRlcGVuZHMgb24gUTQwIHx8IChCUk9LRU4gJiYgU1VOM1gpCisJZGVmYXVsdCB5CisKIG1haW5tZW51ICJMaW51eC82OGsgS2VybmVsIENvbmZpZ3VyYXRpb24iCiAKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL01ha2VmaWxlIGIvYXJjaC9tNjhrL01ha2VmaWxlCmluZGV4IDQ2NmU3NDAuLjM0ZDgyNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9NYWtlZmlsZQorKysgYi9hcmNoL202OGsvTWFrZWZpbGUKQEAgLTExMywxNCArMTEzLDUgQEAKIAliemlwMiAtMWMgdm1saW51eCA+dm1saW51eC5iejIKIGVuZGlmCiAKLXByZXBhcmU6IGluY2x1ZGUvYXNtLSQoQVJDSCkvb2Zmc2V0cy5oCi1DTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS0kKEFSQ0gpL29mZnNldHMuaAotCi1hcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLQkJCQkgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKLQotaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXRzLmg6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKLQogYXJjaGNsZWFuOgogCXJtIC1mIHZtbGludXguZ3ogdm1saW51eC5iejIKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hbWlnYS9hbWlzb3VuZC5jIGIvYXJjaC9tNjhrL2FtaWdhL2FtaXNvdW5kLmMKaW5kZXggY2I1ZDkzNi4uYmQ1ZDEzNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2FtaXNvdW5kLmMKKysrIGIvYXJjaC9tNjhrL2FtaWdhL2FtaXNvdW5kLmMKQEAgLTYzLDcgKzYzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgbm9zb3VuZCggdW5zaWduZWQgbG9uZyBpZ25vcmVkICk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc291bmRfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihub3NvdW5kLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoc291bmRfdGltZXIsIG5vc291bmQsIDAsIDApOwogCiB2b2lkIGFtaWdhX21rc291bmQoIHVuc2lnbmVkIGludCBoeiwgdW5zaWduZWQgaW50IHRpY2tzICkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9idm1lNjAwMC9ydGMuYyBiL2FyY2gvbTY4ay9idm1lNjAwMC9ydGMuYwppbmRleCBjNmIyYTQxLi5lYjYzY2E2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvYnZtZTYwMDAvcnRjLmMKKysrIGIvYXJjaC9tNjhrL2J2bWU2MDAwL3J0Yy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CS8qIEZvciBzdHJ1Y3QgcnRjX3RpbWUgYW5kIGlvY3RscywgZXRjICovCiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxhc20vYnZtZTYwMDBody5oPgpAQCAtMTcxLDcgKzE3Miw3IEBACiAJLmZvcHMgPQkJJnJ0Y19mb3BzCiB9OwogCi1pbnQgX19pbml0IHJ0Y19EUDg1NzBBX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHJ0Y19EUDg1NzBBX2luaXQodm9pZCkKIHsKIAlpZiAoIU1BQ0hfSVNfQlZNRTYwMDApCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTc5LDQgKzE4MCw0IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiRFA4NTcwQSBSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyIHYlc1xuIiwgUlRDX1ZFUlNJT04pOwogCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZydGNfZGV2KTsKIH0KLQorbW9kdWxlX2luaXQocnRjX0RQODU3MEFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvZnBzcDA0MC9za2VsZXRvbi5TIGIvYXJjaC9tNjhrL2Zwc3AwNDAvc2tlbGV0b24uUwppbmRleCBkYmMxMjU1Li45NTcxYTIxIDEwMDY0NAotLS0gYS9hcmNoL202OGsvZnBzcDA0MC9za2VsZXRvbi5TCisrKyBiL2FyY2gvbTY4ay9mcHNwMDQwL3NrZWxldG9uLlMKQEAgLTQwLDcgKzQwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vZW50cnkuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiB8U0tFTEVUT04JaWRudCAgICAyLDEgfCBNb3Rvcm9sYSAwNDAgRmxvYXRpbmcgUG9pbnQgU29mdHdhcmUgUGFja2FnZQogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaWZwc3AwNjAvaXNrZWxldG9uLlMgYi9hcmNoL202OGsvaWZwc3AwNjAvaXNrZWxldG9uLlMKaW5kZXggODAzYTZlYy4uNGJhMmM3NCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2lmcHNwMDYwL2lza2VsZXRvbi5TCisrKyBiL2FyY2gvbTY4ay9pZnBzcDA2MC9pc2tlbGV0b24uUwpAQCAtMzYsNyArMzYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9lbnRyeS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIAogfCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2VudHJ5LlMgYi9hcmNoL202OGsva2VybmVsL2VudHJ5LlMKaW5kZXggZTk2NDAxNS4uMjNjYTYwYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvZW50cnkuUwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIC5nbG9ibCBzeXN0ZW1fY2FsbCwgYnVzZXJyLCB0cmFwCiAuZ2xvYmwgcmVzdW1lLCByZXRfZnJvbV9leGNlcHRpb24KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvaGVhZC5TIGIvYXJjaC9tNjhrL2tlcm5lbC9oZWFkLlMKaW5kZXggN2NkNmRlMS4uZDQzMzZkOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9oZWFkLlMKQEAgLTI2Myw3ICsyNjMsNyBAQAogI2luY2x1ZGUgPGFzbS9lbnRyeS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjaWZkZWYgQ09ORklHX01BQwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL202OGtfa3N5bXMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCmluZGV4IGZlODM3ZTMuLjczZTJmNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCkBAIC03NCwxMCArNzQsNiBAQAogRVhQT1JUX1NZTUJPTChfX2FzaGxkaTMpOwogRVhQT1JUX1NZTUJPTChfX2FzaHJkaTMpOwogRVhQT1JUX1NZTUJPTChfX2xzaHJkaTMpOwotRVhQT1JUX1NZTUJPTChtZW1jcHkpOwotRVhQT1JUX1NZTUJPTChtZW1zZXQpOwotRVhQT1JUX1NZTUJPTChtZW1jbXApOwotRVhQT1JUX1NZTUJPTChtZW1zY2FuKTsKIEVYUE9SVF9TWU1CT0woX19tdWxkaTMpOwogCiBFWFBPUlRfU1lNQk9MKF9fZG93bl9mYWlsZWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbTY4ay9rZXJuZWwvcHRyYWNlLmMKaW5kZXggZjRlMWU1ZS4uOGVkMWIwMSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL202OGsva2VybmVsL3B0cmFjZS5jCkBAIC05NSw3ICs5NSw3IEBACiAJaWYgKHJlZ25vID09IFBUX1VTUCkKIAkJYWRkciA9ICZ0YXNrLT50aHJlYWQudXNwOwogCWVsc2UgaWYgKHJlZ25vIDwgc2l6ZW9mKHJlZ29mZikvc2l6ZW9mKHJlZ29mZlswXSkpCi0JCWFkZHIgPSAodW5zaWduZWQgbG9uZyAqKSAodGFzay0+dGhyZWFkLmVzcDAgKyByZWdvZmZbcmVnbm9dKTsKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nICopKHRhc2stPnRocmVhZC5lc3AwICsgcmVnb2ZmW3JlZ25vXSk7CiAJZWxzZQogCQlyZXR1cm4gLTE7CiAJKmFkZHIgPSBkYXRhOwpAQCAtMTAzLDQ4ICsxMDMsNTYgQEAKIH0KIAogLyoKLSAqIENhbGxlZCBieSBrZXJuZWwvcHRyYWNlLmMgd2hlbiBkZXRhY2hpbmcuLgotICoKICAqIE1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuCiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzaW5nbGVzdGVwX2Rpc2FibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcCA9IGdldF9yZWcoY2hpbGQsIFBUX1NSKSAmIH4oVFJBQ0VfQklUUyA8PCAxNik7CisJcHV0X3JlZyhjaGlsZCwgUFRfU1IsIHRtcCk7CisJY2hpbGQtPnRocmVhZC53b3JrLmRlbGF5ZWRfdHJhY2UgPSAwOworfQorCisvKgorICogQ2FsbGVkIGJ5IGtlcm5lbC9wdHJhY2UuYyB3aGVuIGRldGFjaGluZy4uCisgKi8KIHZvaWQgcHRyYWNlX2Rpc2FibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQkvKiBtYWtlIHN1cmUgdGhlIHNpbmdsZSBzdGVwIGJpdCBpcyBub3Qgc2V0LiAqLwotCXRtcCA9IGdldF9yZWcoY2hpbGQsIFBUX1NSKSAmIH4oVFJBQ0VfQklUUyA8PCAxNik7Ci0JcHV0X3JlZyhjaGlsZCwgUFRfU1IsIHRtcCk7Ci0JY2hpbGQtPnRocmVhZC53b3JrLmRlbGF5ZWRfdHJhY2UgPSAwOworCXNpbmdsZXN0ZXBfZGlzYWJsZShjaGlsZCk7CiAJY2hpbGQtPnRocmVhZC53b3JrLnN5c2NhbGxfdHJhY2UgPSAwOwogfQogCiBhc21saW5rYWdlIGludCBzeXNfcHRyYWNlKGxvbmcgcmVxdWVzdCwgbG9uZyBwaWQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQ7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgaSwgcmV0ID0gMDsKIAogCWxvY2tfa2VybmVsKCk7Ci0JcmV0ID0gLUVQRVJNOwogCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9UUkFDRU1FKSB7CiAJCS8qIGFyZSB3ZSBhbHJlYWR5IGJlaW5nIHRyYWNlZD8gKi8KLQkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpCisJCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSB7CisJCQlyZXQgPSAtRVBFUk07CiAJCQlnb3RvIG91dDsKKwkJfQogCQkvKiBzZXQgdGhlIHB0cmFjZSBiaXQgaW4gdGhlIHByb2Nlc3MgZmxhZ3MuICovCiAJCWN1cnJlbnQtPnB0cmFjZSB8PSBQVF9QVFJBQ0VEOwotCQlyZXQgPSAwOwogCQlnb3RvIG91dDsKIAl9Ci0JcmV0ID0gLUVTUkNIOwogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJY2hpbGQgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7CiAJaWYgKGNoaWxkKQogCQlnZXRfdGFza19zdHJ1Y3QoY2hpbGQpOwogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQlpZiAoIWNoaWxkKQorCWlmICh1bmxpa2VseSghY2hpbGQpKSB7CisJCXJldCA9IC1FU1JDSDsKIAkJZ290byBvdXQ7CisJfQogCi0JcmV0ID0gLUVQRVJNOwotCWlmIChwaWQgPT0gMSkJCS8qIHlvdSBtYXkgbm90IG1lc3Mgd2l0aCBpbml0ICovCisJLyogeW91IG1heSBub3QgbWVzcyB3aXRoIGluaXQgKi8KKwlpZiAodW5saWtlbHkocGlkID09IDEpKSB7CisJCXJldCA9IC1FUEVSTTsKIAkJZ290byBvdXRfdHNrOworCX0KIAogCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9BVFRBQ0gpIHsKIAkJcmV0ID0gcHRyYWNlX2F0dGFjaChjaGlsZCk7CkBAIC0xNTIsMjI3ICsxNjAsMTcxIEBACiAJfQogCiAJcmV0ID0gcHRyYWNlX2NoZWNrX2F0dGFjaChjaGlsZCwgcmVxdWVzdCA9PSBQVFJBQ0VfS0lMTCk7Ci0JaWYgKHJldCA8IDApCisJaWYgKHJldCkKIAkJZ290byBvdXRfdHNrOwogCiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwotCQljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJCWludCBjb3BpZWQ7Ci0KLQkJCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCQlyZXQgPSAtRUlPOwotCQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCQlicmVhazsKLQkJCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKLQkJCWJyZWFrOwotCQl9CisJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6CS8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLworCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlpID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKKwkJaWYgKGkgIT0gc2l6ZW9mKHRtcCkpCisJCQlnb3RvIG91dF9laW87CisJCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgKilkYXRhKTsKKwkJYnJlYWs7CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KLQkJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewotCQkJdW5zaWduZWQgbG9uZyB0bXA7CisJY2FzZSBQVFJBQ0VfUEVFS1VTUjoKKwkJaWYgKGFkZHIgJiAzKQorCQkJZ290byBvdXRfZWlvOworCQlhZGRyID4+PSAyOwkvKiB0ZW1wb3JhcnkgaGFjay4gKi8KIAotCQkJcmV0ID0gLUVJTzsKLQkJCWlmICgoYWRkciAmIDMpIHx8IGFkZHIgPCAwIHx8Ci0JCQkgICAgYWRkciA+IHNpemVvZihzdHJ1Y3QgdXNlcikgLSAzKQotCQkJCWJyZWFrOwotCi0JCQl0bXAgPSAwOyAgLyogRGVmYXVsdCByZXR1cm4gY29uZGl0aW9uICovCi0JCQlhZGRyID0gYWRkciA+PiAyOyAvKiB0ZW1wb3JhcnkgaGFjay4gKi8KLQkJCXJldCA9IC1FSU87Ci0JCQlpZiAoYWRkciA8IDE5KSB7Ci0JCQkJdG1wID0gZ2V0X3JlZyhjaGlsZCwgYWRkcik7Ci0JCQkJaWYgKGFkZHIgPT0gUFRfU1IpCi0JCQkJCXRtcCA+Pj0gMTY7Ci0JCQl9IGVsc2UgaWYgKGFkZHIgPj0gMjEgJiYgYWRkciA8IDQ5KSB7Ci0JCQkJdG1wID0gY2hpbGQtPnRocmVhZC5mcFthZGRyIC0gMjFdOwotI2lmZGVmIENPTkZJR19NNjhLRlBVX0VNVQotCQkJCS8qIENvbnZlcnQgaW50ZXJuYWwgZnB1IHJlZyByZXByZXNlbnRhdGlvbgotCQkJCSAqIGludG8gbG9uZyBkb3VibGUgZm9ybWF0Ci0JCQkJICovCi0JCQkJaWYgKEZQVV9JU19FTVUgJiYgKGFkZHIgPCA0NSkgJiYgIShhZGRyICUgMykpCi0JCQkJCXRtcCA9ICgodG1wICYgMHhmZmZmMDAwMCkgPDwgMTUpIHwKLQkJCQkJICAgICAgKCh0bXAgJiAweDAwMDBmZmZmKSA8PCAxNik7Ci0jZW5kaWYKLQkJCX0gZWxzZQotCQkJCWJyZWFrOwotCQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOwotCQkJYnJlYWs7Ci0JCX0KLQotICAgICAgLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCi0JCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJCXJldCA9IDA7Ci0JCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCQlicmVhazsKLQkJCXJldCA9IC1FSU87Ci0JCQlicmVhazsKLQotCQljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KLQkJCXJldCA9IC1FSU87Ci0JCQlpZiAoKGFkZHIgJiAzKSB8fCBhZGRyIDwgMCB8fAotCQkJICAgIGFkZHIgPiBzaXplb2Yoc3RydWN0IHVzZXIpIC0gMykKLQkJCQlicmVhazsKLQotCQkJYWRkciA9IGFkZHIgPj4gMjsgLyogdGVtcG9yYXJ5IGhhY2suICovCi0KLQkJCWlmIChhZGRyID09IFBUX1NSKSB7Ci0JCQkJZGF0YSAmPSBTUl9NQVNLOwotCQkJCWRhdGEgPDw9IDE2OwotCQkJCWRhdGEgfD0gZ2V0X3JlZyhjaGlsZCwgUFRfU1IpICYgfihTUl9NQVNLIDw8IDE2KTsKLQkJCX0KLQkJCWlmIChhZGRyIDwgMTkpIHsKLQkJCQlpZiAocHV0X3JlZyhjaGlsZCwgYWRkciwgZGF0YSkpCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoYWRkciA+PSAyMSAmJiBhZGRyIDwgNDgpCi0JCQl7Ci0jaWZkZWYgQ09ORklHX002OEtGUFVfRU1VCi0JCQkJLyogQ29udmVydCBsb25nIGRvdWJsZSBmb3JtYXQKLQkJCQkgKiBpbnRvIGludGVybmFsIGZwdSByZWcgcmVwcmVzZW50YXRpb24KLQkJCQkgKi8KLQkJCQlpZiAoRlBVX0lTX0VNVSAmJiAoYWRkciA8IDQ1KSAmJiAhKGFkZHIgJSAzKSkgewotCQkJCQlkYXRhID0gKHVuc2lnbmVkIGxvbmcpZGF0YSA8PCAxNTsKLQkJCQkJZGF0YSA9IChkYXRhICYgMHhmZmZmMDAwMCkgfAotCQkJCQkgICAgICAgKChkYXRhICYgMHgwMDAwZmZmZikgPj4gMSk7Ci0JCQkJfQotI2VuZGlmCi0JCQkJY2hpbGQtPnRocmVhZC5mcFthZGRyIC0gMjFdID0gZGF0YTsKLQkJCQlyZXQgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQVFJBQ0VfU1lTQ0FMTDogLyogY29udGludWUgYW5kIHN0b3AgYXQgbmV4dCAocmV0dXJuIGZyb20pIHN5c2NhbGwgKi8KLQkJY2FzZSBQVFJBQ0VfQ09OVDogeyAvKiByZXN0YXJ0IGFmdGVyIHNpZ25hbC4gKi8KLQkJCWxvbmcgdG1wOwotCi0JCQlyZXQgPSAtRUlPOwotCQkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfU1lTQ0FMTCkgewotCQkJCQljaGlsZC0+dGhyZWFkLndvcmsuc3lzY2FsbF90cmFjZSA9IH4wOwotCQkJfSBlbHNlIHsKLQkJCQkJY2hpbGQtPnRocmVhZC53b3JrLnN5c2NhbGxfdHJhY2UgPSAwOwotCQkJfQotCQkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7Ci0JCQkvKiBtYWtlIHN1cmUgdGhlIHNpbmdsZSBzdGVwIGJpdCBpcyBub3Qgc2V0LiAqLwotCQkJdG1wID0gZ2V0X3JlZyhjaGlsZCwgUFRfU1IpICYgfihUUkFDRV9CSVRTIDw8IDE2KTsKLQkJCXB1dF9yZWcoY2hpbGQsIFBUX1NSLCB0bXApOwotCQkJY2hpbGQtPnRocmVhZC53b3JrLmRlbGF5ZWRfdHJhY2UgPSAwOwotCQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0vKgotICogbWFrZSB0aGUgY2hpbGQgZXhpdC4gIEJlc3QgSSBjYW4gZG8gaXMgc2VuZCBpdCBhIHNpZ2tpbGwuCi0gKiBwZXJoYXBzIGl0IHNob3VsZCBiZSBwdXQgaW4gdGhlIHN0YXR1cyB0aGF0IGl0IHdhbnRzIHRvCi0gKiBleGl0LgotICovCi0JCWNhc2UgUFRSQUNFX0tJTEw6IHsKLQkJCWxvbmcgdG1wOwotCi0JCQlyZXQgPSAwOwotCQkJaWYgKGNoaWxkLT5leGl0X3N0YXRlID09IEVYSVRfWk9NQklFKSAvKiBhbHJlYWR5IGRlYWQgKi8KLQkJCQlicmVhazsKLQkJCWNoaWxkLT5leGl0X2NvZGUgPSBTSUdLSUxMOwotCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuICovCi0JCQl0bXAgPSBnZXRfcmVnKGNoaWxkLCBQVF9TUikgJiB+KFRSQUNFX0JJVFMgPDwgMTYpOwotCQkJcHV0X3JlZyhjaGlsZCwgUFRfU1IsIHRtcCk7Ci0JCQljaGlsZC0+dGhyZWFkLndvcmsuZGVsYXllZF90cmFjZSA9IDA7Ci0JCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIFBUUkFDRV9TSU5HTEVTVEVQOiB7ICAvKiBzZXQgdGhlIHRyYXAgZmxhZy4gKi8KLQkJCWxvbmcgdG1wOwotCi0JCQlyZXQgPSAtRUlPOwotCQkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpCi0JCQkJYnJlYWs7Ci0JCQljaGlsZC0+dGhyZWFkLndvcmsuc3lzY2FsbF90cmFjZSA9IDA7Ci0JCQl0bXAgPSBnZXRfcmVnKGNoaWxkLCBQVF9TUikgfCAoVFJBQ0VfQklUUyA8PCAxNik7Ci0JCQlwdXRfcmVnKGNoaWxkLCBQVF9TUiwgdG1wKTsKLQkJCWNoaWxkLT50aHJlYWQud29yay5kZWxheWVkX3RyYWNlID0gMTsKLQotCQkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7Ci0JLyogZ2l2ZSBpdCBhIGNoYW5jZSB0byBydW4uICovCi0JCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOwotCQkJcmV0ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSBQVFJBQ0VfREVUQUNIOgkvKiBkZXRhY2ggYSBwcm9jZXNzIHRoYXQgd2FzIGF0dGFjaGVkLiAqLwotCQkJcmV0ID0gcHRyYWNlX2RldGFjaChjaGlsZCwgZGF0YSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBhbGwgZ3AgcmVncyBmcm9tIHRoZSBjaGlsZC4gKi8KLQkJCWludCBpOwotCQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMTk7IGkrKykgewotCQkJICAgIHRtcCA9IGdldF9yZWcoY2hpbGQsIGkpOwotCQkJICAgIGlmIChpID09IFBUX1NSKQorCQlpZiAoYWRkciA+PSAwICYmIGFkZHIgPCAxOSkgeworCQkJdG1wID0gZ2V0X3JlZyhjaGlsZCwgYWRkcik7CisJCQlpZiAoYWRkciA9PSBQVF9TUikKIAkJCQl0bXAgPj49IDE2OwotCQkJICAgIGlmIChwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nICopIGRhdGEpKSB7Ci0JCQkJcmV0ID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCSAgICB9Ci0JCQkgICAgZGF0YSArPSBzaXplb2YobG9uZyk7Ci0JCQl9Ci0JCQlyZXQgPSAwOworCQl9IGVsc2UgaWYgKGFkZHIgPj0gMjEgJiYgYWRkciA8IDQ5KSB7CisJCQl0bXAgPSBjaGlsZC0+dGhyZWFkLmZwW2FkZHIgLSAyMV07CisJCQkvKiBDb252ZXJ0IGludGVybmFsIGZwdSByZWcgcmVwcmVzZW50YXRpb24KKwkJCSAqIGludG8gbG9uZyBkb3VibGUgZm9ybWF0CisJCQkgKi8KKwkJCWlmIChGUFVfSVNfRU1VICYmIChhZGRyIDwgNDUpICYmICEoYWRkciAlIDMpKQorCQkJCXRtcCA9ICgodG1wICYgMHhmZmZmMDAwMCkgPDwgMTUpIHwKKwkJCQkgICAgICAoKHRtcCAmIDB4MDAwMGZmZmYpIDw8IDE2KTsKKwkJfSBlbHNlCiAJCQlicmVhazsKLQkJfQorCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nICopZGF0YSk7CisJCWJyZWFrOwogCi0JCWNhc2UgUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IGFsbCBncCByZWdzIGluIHRoZSBjaGlsZC4gKi8KLQkJCWludCBpOwotCQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMTk7IGkrKykgewotCQkJICAgIGlmIChnZXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nICopIGRhdGEpKSB7Ci0JCQkJcmV0ID0gLUVGQVVMVDsKKwkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KKwljYXNlIFBUUkFDRV9QT0tFVEVYVDoJLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KKwljYXNlIFBUUkFDRV9QT0tFREFUQToKKwkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSAhPSBzaXplb2YoZGF0YSkpCisJCQlnb3RvIG91dF9laW87CisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfUE9LRVVTUjoJLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhICovCisJCWlmIChhZGRyICYgMykKKwkJCWdvdG8gb3V0X2VpbzsKKwkJYWRkciA+Pj0gMjsJLyogdGVtcG9yYXJ5IGhhY2suICovCisKKwkJaWYgKGFkZHIgPT0gUFRfU1IpIHsKKwkJCWRhdGEgJj0gU1JfTUFTSzsKKwkJCWRhdGEgPDw9IDE2OworCQkJZGF0YSB8PSBnZXRfcmVnKGNoaWxkLCBQVF9TUikgJiB+KFNSX01BU0sgPDwgMTYpOworCQl9IGVsc2UgaWYgKGFkZHIgPj0gMCAmJiBhZGRyIDwgMTkpIHsKKwkJCWlmIChwdXRfcmVnKGNoaWxkLCBhZGRyLCBkYXRhKSkKKwkJCQlnb3RvIG91dF9laW87CisJCX0gZWxzZSBpZiAoYWRkciA+PSAyMSAmJiBhZGRyIDwgNDgpIHsKKwkJCS8qIENvbnZlcnQgbG9uZyBkb3VibGUgZm9ybWF0CisJCQkgKiBpbnRvIGludGVybmFsIGZwdSByZWcgcmVwcmVzZW50YXRpb24KKwkJCSAqLworCQkJaWYgKEZQVV9JU19FTVUgJiYgKGFkZHIgPCA0NSkgJiYgIShhZGRyICUgMykpIHsKKwkJCQlkYXRhID0gKHVuc2lnbmVkIGxvbmcpZGF0YSA8PCAxNTsKKwkJCQlkYXRhID0gKGRhdGEgJiAweGZmZmYwMDAwKSB8CisJCQkJICAgICAgICgoZGF0YSAmIDB4MDAwMGZmZmYpID4+IDEpOworCQkJfQorCQkJY2hpbGQtPnRocmVhZC5mcFthZGRyIC0gMjFdID0gZGF0YTsKKwkJfSBlbHNlCisJCQlnb3RvIG91dF9laW87CisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfU1lTQ0FMTDoJLyogY29udGludWUgYW5kIHN0b3AgYXQgbmV4dCAocmV0dXJuIGZyb20pIHN5c2NhbGwgKi8KKwljYXNlIFBUUkFDRV9DT05UOgkvKiByZXN0YXJ0IGFmdGVyIHNpZ25hbC4gKi8KKwkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpCisJCQlnb3RvIG91dF9laW87CisKKwkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0NBTEwpCisJCQljaGlsZC0+dGhyZWFkLndvcmsuc3lzY2FsbF90cmFjZSA9IH4wOworCQllbHNlCisJCQljaGlsZC0+dGhyZWFkLndvcmsuc3lzY2FsbF90cmFjZSA9IDA7CisJCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOworCQlzaW5nbGVzdGVwX2Rpc2FibGUoY2hpbGQpOworCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQlicmVhazsKKworCS8qCisJICogbWFrZSB0aGUgY2hpbGQgZXhpdC4gIEJlc3QgSSBjYW4gZG8gaXMgc2VuZCBpdCBhIHNpZ2tpbGwuCisJICogcGVyaGFwcyBpdCBzaG91bGQgYmUgcHV0IGluIHRoZSBzdGF0dXMgdGhhdCBpdCB3YW50cyB0bworCSAqIGV4aXQuCisJICovCisJY2FzZSBQVFJBQ0VfS0lMTDoKKwkJaWYgKGNoaWxkLT5leGl0X3N0YXRlID09IEVYSVRfWk9NQklFKSAvKiBhbHJlYWR5IGRlYWQgKi8KKwkJCWJyZWFrOworCQljaGlsZC0+ZXhpdF9jb2RlID0gU0lHS0lMTDsKKwkJc2luZ2xlc3RlcF9kaXNhYmxlKGNoaWxkKTsKKwkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKKwkJYnJlYWs7CisKKwljYXNlIFBUUkFDRV9TSU5HTEVTVEVQOgkvKiBzZXQgdGhlIHRyYXAgZmxhZy4gKi8KKwkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpCisJCQlnb3RvIG91dF9laW87CisKKwkJY2hpbGQtPnRocmVhZC53b3JrLnN5c2NhbGxfdHJhY2UgPSAwOworCQl0bXAgPSBnZXRfcmVnKGNoaWxkLCBQVF9TUikgfCAoVFJBQ0VfQklUUyA8PCAxNik7CisJCXB1dF9yZWcoY2hpbGQsIFBUX1NSLCB0bXApOworCQljaGlsZC0+dGhyZWFkLndvcmsuZGVsYXllZF90cmFjZSA9IDE7CisKKwkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7CisJCS8qIGdpdmUgaXQgYSBjaGFuY2UgdG8gcnVuLiAqLworCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQlicmVhazsKKworCWNhc2UgUFRSQUNFX0RFVEFDSDoJLyogZGV0YWNoIGEgcHJvY2VzcyB0aGF0IHdhcyBhdHRhY2hlZC4gKi8KKwkJcmV0ID0gcHRyYWNlX2RldGFjaChjaGlsZCwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfR0VUUkVHUzoJLyogR2V0IGFsbCBncCByZWdzIGZyb20gdGhlIGNoaWxkLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTk7IGkrKykgeworCQkJdG1wID0gZ2V0X3JlZyhjaGlsZCwgaSk7CisJCQlpZiAoaSA9PSBQVF9TUikKKwkJCQl0bXAgPj49IDE2OworCQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKWRhdGEpOworCQkJaWYgKHJldCkKIAkJCQlicmVhazsKLQkJCSAgICB9Ci0JCQkgICAgaWYgKGkgPT0gUFRfU1IpIHsKKwkJCWRhdGEgKz0gc2l6ZW9mKGxvbmcpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfU0VUUkVHUzoJLyogU2V0IGFsbCBncCByZWdzIGluIHRoZSBjaGlsZC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDE5OyBpKyspIHsKKwkJCXJldCA9IGdldF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgKilkYXRhKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCQlpZiAoaSA9PSBQVF9TUikgewogCQkJCXRtcCAmPSBTUl9NQVNLOwogCQkJCXRtcCA8PD0gMTY7CiAJCQkJdG1wIHw9IGdldF9yZWcoY2hpbGQsIFBUX1NSKSAmIH4oU1JfTUFTSyA8PCAxNik7Ci0JCQkgICAgfQotCQkJICAgIHB1dF9yZWcoY2hpbGQsIGksIHRtcCk7Ci0JCQkgICAgZGF0YSArPSBzaXplb2YobG9uZyk7CiAJCQl9Ci0JCQlyZXQgPSAwOwotCQkJYnJlYWs7CisJCQlwdXRfcmVnKGNoaWxkLCBpLCB0bXApOworCQkJZGF0YSArPSBzaXplb2YobG9uZyk7CiAJCX0KKwkJYnJlYWs7CiAKLQkJY2FzZSBQVFJBQ0VfR0VURlBSRUdTOiB7IC8qIEdldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLwotCQkJcmV0ID0gMDsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilkYXRhLCAmY2hpbGQtPnRocmVhZC5mcCwKLQkJCQkJIHNpemVvZihzdHJ1Y3QgdXNlcl9tNjhrZnBfc3RydWN0KSkpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9CisJY2FzZSBQVFJBQ0VfR0VURlBSRUdTOgkvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWRhdGEsICZjaGlsZC0+dGhyZWFkLmZwLAorCQkJCSBzaXplb2Yoc3RydWN0IHVzZXJfbTY4a2ZwX3N0cnVjdCkpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CiAKLQkJY2FzZSBQVFJBQ0VfU0VURlBSRUdTOiB7IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLwotCQkJcmV0ID0gMDsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmY2hpbGQtPnRocmVhZC5mcCwgKHZvaWQgKilkYXRhLAotCQkJCQkgICBzaXplb2Yoc3RydWN0IHVzZXJfbTY4a2ZwX3N0cnVjdCkpKQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQorCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzoJLyogU2V0IHRoZSBjaGlsZCBGUFUgc3RhdGUuICovCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2hpbGQtPnRocmVhZC5mcCwgKHZvaWQgKilkYXRhLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgdXNlcl9tNjhrZnBfc3RydWN0KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKIAotCQlkZWZhdWx0OgotCQkJcmV0ID0gcHRyYWNlX3JlcXVlc3QoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOwotCQkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gcHRyYWNlX3JlcXVlc3QoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOworCQlicmVhazsKIAl9CiBvdXRfdHNrOgogCXB1dF90YXNrX3N0cnVjdChjaGlsZCk7CiBvdXQ6CiAJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiByZXQ7CitvdXRfZWlvOgorCXJldCA9IC1FSU87CisJZ290byBvdXRfdHNrOwogfQogCiBhc21saW5rYWdlIHZvaWQgc3lzY2FsbF90cmFjZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC90aW1lLmMgYi9hcmNoL202OGsva2VybmVsL3RpbWUuYwppbmRleCBlNDdlMTk1Li40ZWM5NWUzIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3RpbWUuYworKysgYi9hcmNoL202OGsva2VybmVsL3RpbWUuYwpAQCAtMTY2LDEwICsxNjYsNyBAQAogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ4dGltZSwgc2VjLCBuc2VjKTsKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsIHd0bV9zZWMsIHd0bV9uc2VjKTsKIAotCXRpbWVfYWRqdXN0ID0gMDsJCS8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLwotCXRpbWVfc3RhdHVzIHw9IFNUQV9VTlNZTkM7Ci0JdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKLQl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworCW50cF9jbGVhcigpOwogCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOwogCWNsb2NrX3dhc19zZXQoKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9saWIvTWFrZWZpbGUgYi9hcmNoL202OGsvbGliL01ha2VmaWxlCmluZGV4IDM0YjZkYmMuLmViZTUxYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9tNjhrL2xpYi9NYWtlZmlsZQpAQCAtNSw0ICs1LDQgQEAKIEVYVFJBX0FGTEFHUyA6PSAtdHJhZGl0aW9uYWwKIAogbGliLXkJCTo9IGFzaGxkaTMubyBhc2hyZGkzLm8gbHNocmRpMy5vIG11bGRpMy5vIFwKLQkJCWNoZWNrc3VtLm8gbWVtY21wLm8gbWVtY3B5Lm8gbWVtc2V0Lm8gc2VtYXBob3JlLm8KKwkJCWNoZWNrc3VtLm8gc3RyaW5nLm8gc2VtYXBob3JlLm8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9saWIvbWVtY21wLmMgYi9hcmNoL202OGsvbGliL21lbWNtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDc5NmZlLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9saWIvbWVtY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotaW50IG1lbWNtcChjb25zdCB2b2lkICogY3MsY29uc3Qgdm9pZCAqIGN0LHNpemVfdCBjb3VudCkKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3UxLCAqc3UyOwotCi0gIGZvciggc3UxID0gY3MsIHN1MiA9IGN0OyAwIDwgY291bnQ7ICsrc3UxLCArK3N1MiwgY291bnQtLSkKLSAgICBpZiAoKnN1MSAhPSAqc3UyKQotICAgICAgcmV0dXJuKCgqc3UxIDwgKnN1MikgPyAtMSA6ICsxKTsKLSAgcmV0dXJuKDApOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2xpYi9tZW1jcHkuYyBiL2FyY2gvbTY4ay9saWIvbWVtY3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZTE4MTguLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrL2xpYi9tZW1jcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi12b2lkICogbWVtY3B5KHZvaWQgKiB0bywgY29uc3Qgdm9pZCAqIGZyb20sIHNpemVfdCBuKQotewotICB2b2lkICp4dG8gPSB0bzsKLSAgc2l6ZV90IHRlbXAsIHRlbXAxOwotCi0gIGlmICghbikKLSAgICByZXR1cm4geHRvOwotICBpZiAoKGxvbmcpIHRvICYgMSkKLSAgICB7Ci0gICAgICBjaGFyICpjdG8gPSB0bzsKLSAgICAgIGNvbnN0IGNoYXIgKmNmcm9tID0gZnJvbTsKLSAgICAgICpjdG8rKyA9ICpjZnJvbSsrOwotICAgICAgdG8gPSBjdG87Ci0gICAgICBmcm9tID0gY2Zyb207Ci0gICAgICBuLS07Ci0gICAgfQotICBpZiAobiA+IDIgJiYgKGxvbmcpIHRvICYgMikKLSAgICB7Ci0gICAgICBzaG9ydCAqc3RvID0gdG87Ci0gICAgICBjb25zdCBzaG9ydCAqc2Zyb20gPSBmcm9tOwotICAgICAgKnN0bysrID0gKnNmcm9tKys7Ci0gICAgICB0byA9IHN0bzsKLSAgICAgIGZyb20gPSBzZnJvbTsKLSAgICAgIG4gLT0gMjsKLSAgICB9Ci0gIHRlbXAgPSBuID4+IDI7Ci0gIGlmICh0ZW1wKQotICAgIHsKLSAgICAgIGxvbmcgKmx0byA9IHRvOwotICAgICAgY29uc3QgbG9uZyAqbGZyb20gPSBmcm9tOwotCi0gICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ZWwgJTIsJTNcblx0IgotCQkJICAgImFuZHcgICM3LCUzXG5cdCIKLQkJCSAgICJsc3JsICAjMywlMlxuXHQiCi0JCQkgICAibmVndyAgJTNcblx0IgotCQkJICAgImptcCAgICUlcGNAKDFmLCUzOnc6Milcblx0IgotCQkJICAgIjQ6XHQiCi0JCQkgICAibW92ZWwgJTBAKywlMUArXG5cdCIKLQkJCSAgICJtb3ZlbCAlMEArLCUxQCtcblx0IgotCQkJICAgIm1vdmVsICUwQCssJTFAK1xuXHQiCi0JCQkgICAibW92ZWwgJTBAKywlMUArXG5cdCIKLQkJCSAgICJtb3ZlbCAlMEArLCUxQCtcblx0IgotCQkJICAgIm1vdmVsICUwQCssJTFAK1xuXHQiCi0JCQkgICAibW92ZWwgJTBAKywlMUArXG5cdCIKLQkJCSAgICJtb3ZlbCAlMEArLCUxQCtcblx0IgotCQkJICAgIjE6XHQiCi0JCQkgICAiZGJyYSAgJTIsNGJcblx0IgotCQkJICAgImNscncgICUyXG5cdCIKLQkJCSAgICJzdWJxbCAjMSwlMlxuXHQiCi0JCQkgICAianBsICAgNGJcblx0IgotCQkJICAgOiAiPWEiIChsZnJvbSksICI9YSIgKGx0byksICI9ZCIgKHRlbXApLAotCQkJICAgIj0mZCIgKHRlbXAxKQotCQkJICAgOiAiMCIgKGxmcm9tKSwgIjEiIChsdG8pLCAiMiIgKHRlbXApCi0JCQkgICApOwotICAgICAgdG8gPSBsdG87Ci0gICAgICBmcm9tID0gbGZyb207Ci0gICAgfQotICBpZiAobiAmIDIpCi0gICAgewotICAgICAgc2hvcnQgKnN0byA9IHRvOwotICAgICAgY29uc3Qgc2hvcnQgKnNmcm9tID0gZnJvbTsKLSAgICAgICpzdG8rKyA9ICpzZnJvbSsrOwotICAgICAgdG8gPSBzdG87Ci0gICAgICBmcm9tID0gc2Zyb207Ci0gICAgfQotICBpZiAobiAmIDEpCi0gICAgewotICAgICAgY2hhciAqY3RvID0gdG87Ci0gICAgICBjb25zdCBjaGFyICpjZnJvbSA9IGZyb207Ci0gICAgICAqY3RvID0gKmNmcm9tOwotICAgIH0KLSAgcmV0dXJuIHh0bzsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9saWIvbWVtc2V0LmMgYi9hcmNoL202OGsvbGliL21lbXNldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTVmZGIyLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9saWIvbWVtc2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotdm9pZCAqIG1lbXNldCh2b2lkICogcywgaW50IGMsIHNpemVfdCBjb3VudCkKLXsKLSAgdm9pZCAqeHMgPSBzOwotICBzaXplX3QgdGVtcCwgdGVtcDE7Ci0KLSAgaWYgKCFjb3VudCkKLSAgICByZXR1cm4geHM7Ci0gIGMgJj0gMHhmZjsKLSAgYyB8PSBjIDw8IDg7Ci0gIGMgfD0gYyA8PCAxNjsKLSAgaWYgKChsb25nKSBzICYgMSkKLSAgICB7Ci0gICAgICBjaGFyICpjcyA9IHM7Ci0gICAgICAqY3MrKyA9IGM7Ci0gICAgICBzID0gY3M7Ci0gICAgICBjb3VudC0tOwotICAgIH0KLSAgaWYgKGNvdW50ID4gMiAmJiAobG9uZykgcyAmIDIpCi0gICAgewotICAgICAgc2hvcnQgKnNzID0gczsKLSAgICAgICpzcysrID0gYzsKLSAgICAgIHMgPSBzczsKLSAgICAgIGNvdW50IC09IDI7Ci0gICAgfQotICB0ZW1wID0gY291bnQgPj4gMjsKLSAgaWYgKHRlbXApCi0gICAgewotICAgICAgbG9uZyAqbHMgPSBzOwotCi0gICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ZWwgJTEsJTJcblx0IgotCQkJICAgImFuZHcgICM3LCUyXG5cdCIKLQkJCSAgICJsc3JsICAjMywlMVxuXHQiCi0JCQkgICAibmVndyAgJTJcblx0IgotCQkJICAgImptcCAgICUlcGNAKDJmLCUyOnc6Milcblx0IgotCQkJICAgIjE6XHQiCi0JCQkgICAibW92ZWwgJTMsJTBAK1xuXHQiCi0JCQkgICAibW92ZWwgJTMsJTBAK1xuXHQiCi0JCQkgICAibW92ZWwgJTMsJTBAK1xuXHQiCi0JCQkgICAibW92ZWwgJTMsJTBAK1xuXHQiCi0JCQkgICAibW92ZWwgJTMsJTBAK1xuXHQiCi0JCQkgICAibW92ZWwgJTMsJTBAK1xuXHQiCi0JCQkgICAibW92ZWwgJTMsJTBAK1xuXHQiCi0JCQkgICAibW92ZWwgJTMsJTBAK1xuXHQiCi0JCQkgICAiMjpcdCIKLQkJCSAgICJkYnJhICAlMSwxYlxuXHQiCi0JCQkgICAiY2xydyAgJTFcblx0IgotCQkJICAgInN1YnFsICMxLCUxXG5cdCIKLQkJCSAgICJqcGwgICAxYlxuXHQiCi0JCQkgICA6ICI9YSIgKGxzKSwgIj1kIiAodGVtcCksICI9JmQiICh0ZW1wMSkKLQkJCSAgIDogImQiIChjKSwgIjAiIChscyksICIxIiAodGVtcCkKLQkJCSAgICk7Ci0gICAgICBzID0gbHM7Ci0gICAgfQotICBpZiAoY291bnQgJiAyKQotICAgIHsKLSAgICAgIHNob3J0ICpzcyA9IHM7Ci0gICAgICAqc3MrKyA9IGM7Ci0gICAgICBzID0gc3M7Ci0gICAgfQotICBpZiAoY291bnQgJiAxKQotICAgIHsKLSAgICAgIGNoYXIgKmNzID0gczsKLSAgICAgICpjcyA9IGM7Ci0gICAgfQotICByZXR1cm4geHM7Ci19CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL3N0cmluZy5jIGIvYXJjaC9tNjhrL2xpYi9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTJiODllCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrL2xpYi9zdHJpbmcuYwpAQCAtMCwwICsxLDIzNyBAQAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwordm9pZCAqbWVtc2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3QgY291bnQpCit7CisJdm9pZCAqeHMgPSBzOworCXNpemVfdCB0ZW1wLCB0ZW1wMTsKKworCWlmICghY291bnQpCisJCXJldHVybiB4czsKKwljICY9IDB4ZmY7CisJYyB8PSBjIDw8IDg7CisJYyB8PSBjIDw8IDE2OworCWlmICgobG9uZylzICYgMSkgeworCQljaGFyICpjcyA9IHM7CisJCSpjcysrID0gYzsKKwkJcyA9IGNzOworCQljb3VudC0tOworCX0KKwlpZiAoY291bnQgPiAyICYmIChsb25nKXMgJiAyKSB7CisJCXNob3J0ICpzcyA9IHM7CisJCSpzcysrID0gYzsKKwkJcyA9IHNzOworCQljb3VudCAtPSAyOworCX0KKwl0ZW1wID0gY291bnQgPj4gMjsKKwlpZiAodGVtcCkgeworCQlsb25nICpscyA9IHM7CisKKwkJYXNtIHZvbGF0aWxlICgKKwkJCSIJbW92ZWwgJTEsJTJcbiIKKwkJCSIJYW5kdyAgIzcsJTJcbiIKKwkJCSIJbHNybCAgIzMsJTFcbiIKKwkJCSIJbmVndyAgJTJcbiIKKwkJCSIJam1wICAgJSVwY0AoMmYsJTI6dzoyKVxuIgorCQkJIjE6CW1vdmVsICUzLCUwQCtcbiIKKwkJCSIJbW92ZWwgJTMsJTBAK1xuIgorCQkJIgltb3ZlbCAlMywlMEArXG4iCisJCQkiCW1vdmVsICUzLCUwQCtcbiIKKwkJCSIJbW92ZWwgJTMsJTBAK1xuIgorCQkJIgltb3ZlbCAlMywlMEArXG4iCisJCQkiCW1vdmVsICUzLCUwQCtcbiIKKwkJCSIJbW92ZWwgJTMsJTBAK1xuIgorCQkJIjI6CWRicmEgICUxLDFiXG4iCisJCQkiCWNscncgICUxXG4iCisJCQkiCXN1YnFsICMxLCUxXG4iCisJCQkiCWpwbCAgIDFiIgorCQkJOiAiPWEiIChscyksICI9ZCIgKHRlbXApLCAiPSZkIiAodGVtcDEpCisJCQk6ICJkIiAoYyksICIwIiAobHMpLCAiMSIgKHRlbXApKTsKKwkJcyA9IGxzOworCX0KKwlpZiAoY291bnQgJiAyKSB7CisJCXNob3J0ICpzcyA9IHM7CisJCSpzcysrID0gYzsKKwkJcyA9IHNzOworCX0KKwlpZiAoY291bnQgJiAxKSB7CisJCWNoYXIgKmNzID0gczsKKwkJKmNzID0gYzsKKwl9CisJcmV0dXJuIHhzOworfQorRVhQT1JUX1NZTUJPTChtZW1zZXQpOworCit2b2lkICptZW1jcHkodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBuKQoreworCXZvaWQgKnh0byA9IHRvOworCXNpemVfdCB0ZW1wLCB0ZW1wMTsKKworCWlmICghbikKKwkJcmV0dXJuIHh0bzsKKwlpZiAoKGxvbmcpdG8gJiAxKSB7CisJCWNoYXIgKmN0byA9IHRvOworCQljb25zdCBjaGFyICpjZnJvbSA9IGZyb207CisJCSpjdG8rKyA9ICpjZnJvbSsrOworCQl0byA9IGN0bzsKKwkJZnJvbSA9IGNmcm9tOworCQluLS07CisJfQorCWlmIChuID4gMiAmJiAobG9uZyl0byAmIDIpIHsKKwkJc2hvcnQgKnN0byA9IHRvOworCQljb25zdCBzaG9ydCAqc2Zyb20gPSBmcm9tOworCQkqc3RvKysgPSAqc2Zyb20rKzsKKwkJdG8gPSBzdG87CisJCWZyb20gPSBzZnJvbTsKKwkJbiAtPSAyOworCX0KKwl0ZW1wID0gbiA+PiAyOworCWlmICh0ZW1wKSB7CisJCWxvbmcgKmx0byA9IHRvOworCQljb25zdCBsb25nICpsZnJvbSA9IGZyb207CisKKwkJYXNtIHZvbGF0aWxlICgKKwkJCSIJbW92ZWwgJTIsJTNcbiIKKwkJCSIJYW5kdyAgIzcsJTNcbiIKKwkJCSIJbHNybCAgIzMsJTJcbiIKKwkJCSIJbmVndyAgJTNcbiIKKwkJCSIJam1wICAgJSVwY0AoMWYsJTM6dzoyKVxuIgorCQkJIjQ6CW1vdmVsICUwQCssJTFAK1xuIgorCQkJIgltb3ZlbCAlMEArLCUxQCtcbiIKKwkJCSIJbW92ZWwgJTBAKywlMUArXG4iCisJCQkiCW1vdmVsICUwQCssJTFAK1xuIgorCQkJIgltb3ZlbCAlMEArLCUxQCtcbiIKKwkJCSIJbW92ZWwgJTBAKywlMUArXG4iCisJCQkiCW1vdmVsICUwQCssJTFAK1xuIgorCQkJIgltb3ZlbCAlMEArLCUxQCtcbiIKKwkJCSIxOglkYnJhICAlMiw0YlxuIgorCQkJIgljbHJ3ICAlMlxuIgorCQkJIglzdWJxbCAjMSwlMlxuIgorCQkJIglqcGwgICA0YiIKKwkJCTogIj1hIiAobGZyb20pLCAiPWEiIChsdG8pLCAiPWQiICh0ZW1wKSwgIj0mZCIgKHRlbXAxKQorCQkJOiAiMCIgKGxmcm9tKSwgIjEiIChsdG8pLCAiMiIgKHRlbXApKTsKKwkJdG8gPSBsdG87CisJCWZyb20gPSBsZnJvbTsKKwl9CisJaWYgKG4gJiAyKSB7CisJCXNob3J0ICpzdG8gPSB0bzsKKwkJY29uc3Qgc2hvcnQgKnNmcm9tID0gZnJvbTsKKwkJKnN0bysrID0gKnNmcm9tKys7CisJCXRvID0gc3RvOworCQlmcm9tID0gc2Zyb207CisJfQorCWlmIChuICYgMSkgeworCQljaGFyICpjdG8gPSB0bzsKKwkJY29uc3QgY2hhciAqY2Zyb20gPSBmcm9tOworCQkqY3RvID0gKmNmcm9tOworCX0KKwlyZXR1cm4geHRvOworfQorRVhQT1JUX1NZTUJPTChtZW1jcHkpOworCit2b2lkICptZW1tb3ZlKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCit7CisJdm9pZCAqeGRlc3QgPSBkZXN0OworCXNpemVfdCB0ZW1wOworCisJaWYgKCFuKQorCQlyZXR1cm4geGRlc3Q7CisKKwlpZiAoZGVzdCA8IHNyYykgeworCQlpZiAoKGxvbmcpZGVzdCAmIDEpIHsKKwkJCWNoYXIgKmNkZXN0ID0gZGVzdDsKKwkJCWNvbnN0IGNoYXIgKmNzcmMgPSBzcmM7CisJCQkqY2Rlc3QrKyA9ICpjc3JjKys7CisJCQlkZXN0ID0gY2Rlc3Q7CisJCQlzcmMgPSBjc3JjOworCQkJbi0tOworCQl9CisJCWlmIChuID4gMiAmJiAobG9uZylkZXN0ICYgMikgeworCQkJc2hvcnQgKnNkZXN0ID0gZGVzdDsKKwkJCWNvbnN0IHNob3J0ICpzc3JjID0gc3JjOworCQkJKnNkZXN0KysgPSAqc3NyYysrOworCQkJZGVzdCA9IHNkZXN0OworCQkJc3JjID0gc3NyYzsKKwkJCW4gLT0gMjsKKwkJfQorCQl0ZW1wID0gbiA+PiAyOworCQlpZiAodGVtcCkgeworCQkJbG9uZyAqbGRlc3QgPSBkZXN0OworCQkJY29uc3QgbG9uZyAqbHNyYyA9IHNyYzsKKwkJCXRlbXAtLTsKKwkJCWRvCisJCQkJKmxkZXN0KysgPSAqbHNyYysrOworCQkJd2hpbGUgKHRlbXAtLSk7CisJCQlkZXN0ID0gbGRlc3Q7CisJCQlzcmMgPSBsc3JjOworCQl9CisJCWlmIChuICYgMikgeworCQkJc2hvcnQgKnNkZXN0ID0gZGVzdDsKKwkJCWNvbnN0IHNob3J0ICpzc3JjID0gc3JjOworCQkJKnNkZXN0KysgPSAqc3NyYysrOworCQkJZGVzdCA9IHNkZXN0OworCQkJc3JjID0gc3NyYzsKKwkJfQorCQlpZiAobiAmIDEpIHsKKwkJCWNoYXIgKmNkZXN0ID0gZGVzdDsKKwkJCWNvbnN0IGNoYXIgKmNzcmMgPSBzcmM7CisJCQkqY2Rlc3QgPSAqY3NyYzsKKwkJfQorCX0gZWxzZSB7CisJCWRlc3QgPSAoY2hhciAqKWRlc3QgKyBuOworCQlzcmMgPSAoY29uc3QgY2hhciAqKXNyYyArIG47CisJCWlmICgobG9uZylkZXN0ICYgMSkgeworCQkJY2hhciAqY2Rlc3QgPSBkZXN0OworCQkJY29uc3QgY2hhciAqY3NyYyA9IHNyYzsKKwkJCSotLWNkZXN0ID0gKi0tY3NyYzsKKwkJCWRlc3QgPSBjZGVzdDsKKwkJCXNyYyA9IGNzcmM7CisJCQluLS07CisJCX0KKwkJaWYgKG4gPiAyICYmIChsb25nKWRlc3QgJiAyKSB7CisJCQlzaG9ydCAqc2Rlc3QgPSBkZXN0OworCQkJY29uc3Qgc2hvcnQgKnNzcmMgPSBzcmM7CisJCQkqLS1zZGVzdCA9ICotLXNzcmM7CisJCQlkZXN0ID0gc2Rlc3Q7CisJCQlzcmMgPSBzc3JjOworCQkJbiAtPSAyOworCQl9CisJCXRlbXAgPSBuID4+IDI7CisJCWlmICh0ZW1wKSB7CisJCQlsb25nICpsZGVzdCA9IGRlc3Q7CisJCQljb25zdCBsb25nICpsc3JjID0gc3JjOworCQkJdGVtcC0tOworCQkJZG8KKwkJCQkqLS1sZGVzdCA9ICotLWxzcmM7CisJCQl3aGlsZSAodGVtcC0tKTsKKwkJCWRlc3QgPSBsZGVzdDsKKwkJCXNyYyA9IGxzcmM7CisJCX0KKwkJaWYgKG4gJiAyKSB7CisJCQlzaG9ydCAqc2Rlc3QgPSBkZXN0OworCQkJY29uc3Qgc2hvcnQgKnNzcmMgPSBzcmM7CisJCQkqLS1zZGVzdCA9ICotLXNzcmM7CisJCQlkZXN0ID0gc2Rlc3Q7CisJCQlzcmMgPSBzc3JjOworCQl9CisJCWlmIChuICYgMSkgeworCQkJY2hhciAqY2Rlc3QgPSBkZXN0OworCQkJY29uc3QgY2hhciAqY3NyYyA9IHNyYzsKKwkJCSotLWNkZXN0ID0gKi0tY3NyYzsKKwkJfQorCX0KKwlyZXR1cm4geGRlc3Q7Cit9CitFWFBPUlRfU1lNQk9MKG1lbW1vdmUpOworCitpbnQgbWVtY21wKGNvbnN0IHZvaWQgKmNzLCBjb25zdCB2b2lkICpjdCwgc2l6ZV90IGNvdW50KQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnN1MSwgKnN1MjsKKworCWZvciAoc3UxID0gY3MsIHN1MiA9IGN0OyBjb3VudCA+IDA7ICsrc3UxLCArK3N1MiwgY291bnQtLSkKKwkJaWYgKCpzdTEgIT0gKnN1MikKKwkJCXJldHVybiAqc3UxIDwgKnN1MiA/IC0xIDogKzE7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG1lbWNtcCk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL21hY2JvaW5nLmMgYi9hcmNoL202OGsvbWFjL21hY2JvaW5nLmMKaW5kZXggNDRjNWNkMi4uOGYwNjQwOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9tYWNib2luZy5jCisrKyBiL2FyY2gvbTY4ay9tYWMvbWFjYm9pbmcuYwpAQCAtNTYsOCArNTYsNyBAQAogLyoKICAqIG91ciB0aW1lciB0byBzdGFydC9jb250aW51ZS9zdG9wIHRoZSBiZWxsCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBtYWNfc291bmRfdGltZXIgPQotCQlUSU1FUl9JTklUSUFMSVpFUihtYWNfbm9zb3VuZCwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKG1hY19zb3VuZF90aW1lciwgbWFjX25vc291bmQsIDAsIDApOwogCiAvKgogICogU29ydCBvZiBpbml0aWFsaXplIHRoZSBzb3VuZCBjaGlwIChjYWxsZWQgZnJvbSBtYWNfbWtzb3VuZCBvbiB0aGUgZmlyc3QKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYXRoLWVtdS9mcF9lbXUuaCBiL2FyY2gvbTY4ay9tYXRoLWVtdS9mcF9lbXUuaAppbmRleCAxZDZlZGM5Li5jMWVjZmVmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWF0aC1lbXUvZnBfZW11LmgKKysrIGIvYXJjaC9tNjhrL21hdGgtZW11L2ZwX2VtdS5oCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIF9GUF9FTVVfSAogCiAjaWZkZWYgX19BU1NFTUJMWV9fCi0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNlbmRpZgogI2luY2x1ZGUgPGFzbS9tYXRoLWVtdS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0vTWFrZWZpbGUgYi9hcmNoL202OGsvbW0vTWFrZWZpbGUKaW5kZXggOTBmMWM3My4uNWVhYTQzYyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL01ha2VmaWxlCisrKyBiL2FyY2gvbTY4ay9tbS9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBtNjhrLXNwZWNpZmljIHBhcnRzIG9mIHRoZSBtZW1vcnkgbWFuYWdlci4KICMKIAotb2JqLXkJCTo9IGluaXQubyBmYXVsdC5vIGh3dGVzdC5vCitvYmoteQkJOj0gY2FjaGUubyBpbml0Lm8gZmF1bHQubyBod3Rlc3QubwogCiBvYmotJChDT05GSUdfTU1VX01PVE9ST0xBKQkrPSBrbWFwLm8gbWVtb3J5Lm8gbW90b3JvbGEubwogb2JqLSQoQ09ORklHX01NVV9TVU4zKQkJKz0gc3VuM2ttYXAubyBzdW4zbW11Lm8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tbS9jYWNoZS5jIGIvYXJjaC9tNjhrL21tL2NhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzN2ZmZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4ay9tbS9jYWNoZS5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogIGxpbnV4L2FyY2gvbTY4ay9tbS9jYWNoZS5jCisgKgorICogIEluc3RydWN0aW9uIGNhY2hlIGhhbmRsaW5nCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSAgSGFtaXNoIE1hY2RvbmFsZAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZpcnRfdG9fcGh5c19zbG93KHVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJaWYgKENQVV9JU18wNjApIHsKKwkJdW5zaWduZWQgbG9uZyBwYWRkcjsKKworCQkvKiBUaGUgUExQQVIgaW5zdHJ1Y3Rpb24gY2F1c2VzIGFuIGFjY2VzcyBlcnJvciBpZiB0aGUgdHJhbnNsYXRpb24KKwkJICogaXMgbm90IHBvc3NpYmxlLiBUbyBjYXRjaCB0aGlzIHdlIHVzZSB0aGUgc2FtZSBleGNlcHRpb24gbWVjaGFuaXNtCisJCSAqIGFzIGZvciB1c2VyIHNwYWNlIGFjY2Vzc2VzIGluIDxhc20vdWFjY2Vzcy5oPi4gKi8KKwkJYXNtIHZvbGF0aWxlICgiLmNoaXAgNjgwNjBcbiIKKwkJCSAgICAgICIxOiBwbHBhciAoJTApXG4iCisJCQkgICAgICAiLmNoaXAgNjhrXG4iCisJCQkgICAgICAiMjpcbiIKKwkJCSAgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJCQkgICAgICAiICAgLmV2ZW5cbiIKKwkJCSAgICAgICIzOiBzdWIubCAlMCwlMFxuIgorCQkJICAgICAgIiAgIGpyYSAyYlxuIgorCQkJICAgICAgIi5wcmV2aW91c1xuIgorCQkJICAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkJCSAgICAgICIgICAuYWxpZ24gNFxuIgorCQkJICAgICAgIiAgIC5sb25nIDFiLDNiXG4iCisJCQkgICAgICAiLnByZXZpb3VzIgorCQkJICAgICAgOiAiPWEiIChwYWRkcikKKwkJCSAgICAgIDogIjAiICh2YWRkcikpOworCQlyZXR1cm4gcGFkZHI7CisJfSBlbHNlIGlmIChDUFVfSVNfMDQwKSB7CisJCXVuc2lnbmVkIGxvbmcgbW11c3I7CisKKwkJYXNtIHZvbGF0aWxlICgiLmNoaXAgNjgwNDBcblx0IgorCQkJICAgICAgInB0ZXN0ciAoJTEpXG5cdCIKKwkJCSAgICAgICJtb3ZlYyAlJW1tdXNyLCAlMFxuXHQiCisJCQkgICAgICAiLmNoaXAgNjhrIgorCQkJICAgICAgOiAiPXIiIChtbXVzcikKKwkJCSAgICAgIDogImEiICh2YWRkcikpOworCisJCWlmIChtbXVzciAmIE1NVV9SXzA0MCkKKwkJCXJldHVybiAobW11c3IgJiBQQUdFX01BU0spIHwgKHZhZGRyICYgflBBR0VfTUFTSyk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgc2hvcnQgbW11c3I7CisJCXVuc2lnbmVkIGxvbmcgKmRlc2NhZGRyOworCisJCWFzbSB2b2xhdGlsZSAoInB0ZXN0ciAlMywlMkAsIzcsJTBcblx0IgorCQkJICAgICAgInBtb3ZlICUlcHNyLCUxQCIKKwkJCSAgICAgIDogIj1hJiIgKGRlc2NhZGRyKQorCQkJICAgICAgOiAiYSIgKCZtbXVzciksICJhIiAodmFkZHIpLCAiZCIgKGdldF9mcygpLnNlZykpOworCQlpZiAobW11c3IgJiAoTU1VX0l8TU1VX0J8TU1VX0wpKQorCQkJcmV0dXJuIDA7CisJCWRlc2NhZGRyID0gcGh5c190b192aXJ0KCh1bnNpZ25lZCBsb25nKWRlc2NhZGRyKTsKKwkJc3dpdGNoIChtbXVzciAmIE1NVV9OVU0pIHsKKwkJY2FzZSAxOgorCQkJcmV0dXJuICgqZGVzY2FkZHIgJiAweGZlMDAwMDAwKSB8ICh2YWRkciAmIDB4MDFmZmZmZmYpOworCQljYXNlIDI6CisJCQlyZXR1cm4gKCpkZXNjYWRkciAmIDB4ZmZmYzAwMDApIHwgKHZhZGRyICYgMHgwMDAzZmZmZik7CisJCWNhc2UgMzoKKwkJCXJldHVybiAoKmRlc2NhZGRyICYgUEFHRV9NQVNLKSB8ICh2YWRkciAmIH5QQUdFX01BU0spOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBQdXNoIG4gcGFnZXMgYXQga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBhbmQgY2xlYXIgdGhlIGljYWNoZSAqLworLyogUlo6IHVzZSBjcHVzaCAlYmMgaW5zdGVhZCBvZiBjcHVzaCAlZGMsIGNpbnYgJWljICovCit2b2lkIGZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kYWRkcikKK3sKKworCWlmIChDUFVfSVNfMDQwX09SXzA2MCkgeworCQlhZGRyZXNzICY9IFBBR0VfTUFTSzsKKworCQlkbyB7CisJCQlhc20gdm9sYXRpbGUgKCJub3Bcblx0IgorCQkJCSAgICAgICIuY2hpcCA2ODA0MFxuXHQiCisJCQkJICAgICAgImNwdXNocCAlJWJjLCglMClcblx0IgorCQkJCSAgICAgICIuY2hpcCA2OGsiCisJCQkJICAgICAgOiA6ICJhIiAodmlydF90b19waHlzX3Nsb3coYWRkcmVzcykpKTsKKwkJCWFkZHJlc3MgKz0gUEFHRV9TSVpFOworCQl9IHdoaWxlIChhZGRyZXNzIDwgZW5kYWRkcik7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisJCWFzbSB2b2xhdGlsZSAoIm1vdmVjICUlY2FjciwlMFxuXHQiCisJCQkgICAgICAib3J3ICUxLCUwXG5cdCIKKwkJCSAgICAgICJtb3ZlYyAlMCwlJWNhY3IiCisJCQkgICAgICA6ICI9JmQiICh0bXApCisJCQkgICAgICA6ICJkaSIgKEZMVVNIX0kpKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGZsdXNoX2ljYWNoZV9yYW5nZSk7CisKK3ZvaWQgZmx1c2hfaWNhY2hlX3VzZXJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIGludCBsZW4pCit7CisJaWYgKENQVV9JU18wNDBfT1JfMDYwKSB7CisJCWFzbSB2b2xhdGlsZSAoIm5vcFxuXHQiCisJCQkgICAgICAiLmNoaXAgNjgwNDBcblx0IgorCQkJICAgICAgImNwdXNocCAlJWJjLCglMClcblx0IgorCQkJICAgICAgIi5jaGlwIDY4ayIKKwkJCSAgICAgIDogOiAiYSIgKHBhZ2VfdG9fcGh5cyhwYWdlKSkpOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQlhc20gdm9sYXRpbGUgKCJtb3ZlYyAlJWNhY3IsJTBcblx0IgorCQkJICAgICAgIm9ydyAlMSwlMFxuXHQiCisJCQkgICAgICAibW92ZWMgJTAsJSVjYWNyIgorCQkJICAgICAgOiAiPSZkIiAodG1wKQorCQkJICAgICAgOiAiZGkiIChGTFVTSF9JKSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0vbWVtb3J5LmMgYi9hcmNoL202OGsvbW0vbWVtb3J5LmMKaW5kZXggMTQ1M2E2MC4uNTU5OTQyYyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL21lbW9yeS5jCisrKyBiL2FyY2gvbTY4ay9tbS9tZW1vcnkuYwpAQCAtMzU0LDExMCArMzU0LDYgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX3BoeXNfc2xvdyh1bnNpZ25lZCBsb25nIHZhZGRyKQotewotCWlmIChDUFVfSVNfMDYwKSB7Ci0JCW1tX3NlZ21lbnRfdCBmcyA9IGdldF9mcygpOwotCQl1bnNpZ25lZCBsb25nIHBhZGRyOwotCi0JCXNldF9mcyhnZXRfZHMoKSk7Ci0KLQkJLyogVGhlIFBMUEFSIGluc3RydWN0aW9uIGNhdXNlcyBhbiBhY2Nlc3MgZXJyb3IgaWYgdGhlIHRyYW5zbGF0aW9uCi0JCSAqIGlzIG5vdCBwb3NzaWJsZS4gVG8gY2F0Y2ggdGhpcyB3ZSB1c2UgdGhlIHNhbWUgZXhjZXB0aW9uIG1lY2hhbmlzbQotCQkgKiBhcyBmb3IgdXNlciBzcGFjZSBhY2Nlc3NlcyBpbiA8YXNtL3VhY2Nlc3MuaD4uICovCi0JCWFzbSB2b2xhdGlsZSAoIi5jaGlwIDY4MDYwXG4iCi0JCQkgICAgICAiMTogcGxwYXIgKCUwKVxuIgotCQkJICAgICAgIi5jaGlwIDY4a1xuIgotCQkJICAgICAgIjI6XG4iCi0JCQkgICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgotCQkJICAgICAgIiAgIC5ldmVuXG4iCi0JCQkgICAgICAiMzogc3ViLmwgJTAsJTBcbiIKLQkJCSAgICAgICIgICBqcmEgMmJcbiIKLQkJCSAgICAgICIucHJldmlvdXNcbiIKLQkJCSAgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JCQkgICAgICAiICAgLmFsaWduIDRcbiIKLQkJCSAgICAgICIgICAubG9uZyAxYiwzYlxuIgotCQkJICAgICAgIi5wcmV2aW91cyIKLQkJCSAgICAgIDogIj1hIiAocGFkZHIpCi0JCQkgICAgICA6ICIwIiAodmFkZHIpKTsKLQkJc2V0X2ZzKGZzKTsKLQkJcmV0dXJuIHBhZGRyOwotCX0gZWxzZSBpZiAoQ1BVX0lTXzA0MCkgewotCQltbV9zZWdtZW50X3QgZnMgPSBnZXRfZnMoKTsKLQkJdW5zaWduZWQgbG9uZyBtbXVzcjsKLQotCQlzZXRfZnMoZ2V0X2RzKCkpOwotCi0JCWFzbSB2b2xhdGlsZSAoIi5jaGlwIDY4MDQwXG5cdCIKLQkJCSAgICAgICJwdGVzdHIgKCUxKVxuXHQiCi0JCQkgICAgICAibW92ZWMgJSVtbXVzciwgJTBcblx0IgotCQkJICAgICAgIi5jaGlwIDY4ayIKLQkJCSAgICAgIDogIj1yIiAobW11c3IpCi0JCQkgICAgICA6ICJhIiAodmFkZHIpKTsKLQkJc2V0X2ZzKGZzKTsKLQotCQlpZiAobW11c3IgJiBNTVVfUl8wNDApCi0JCQlyZXR1cm4gKG1tdXNyICYgUEFHRV9NQVNLKSB8ICh2YWRkciAmIH5QQUdFX01BU0spOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIHNob3J0IG1tdXNyOwotCQl1bnNpZ25lZCBsb25nICpkZXNjYWRkcjsKLQotCQlhc20gdm9sYXRpbGUgKCJwdGVzdHIgIzUsJTJALCM3LCUwXG5cdCIKLQkJCSAgICAgICJwbW92ZSAlJXBzciwlMUAiCi0JCQkgICAgICA6ICI9YSYiIChkZXNjYWRkcikKLQkJCSAgICAgIDogImEiICgmbW11c3IpLCAiYSIgKHZhZGRyKSk7Ci0JCWlmIChtbXVzciAmIChNTVVfSXxNTVVfQnxNTVVfTCkpCi0JCQlyZXR1cm4gMDsKLQkJZGVzY2FkZHIgPSBwaHlzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpZGVzY2FkZHIpOwotCQlzd2l0Y2ggKG1tdXNyICYgTU1VX05VTSkgewotCQljYXNlIDE6Ci0JCQlyZXR1cm4gKCpkZXNjYWRkciAmIDB4ZmUwMDAwMDApIHwgKHZhZGRyICYgMHgwMWZmZmZmZik7Ci0JCWNhc2UgMjoKLQkJCXJldHVybiAoKmRlc2NhZGRyICYgMHhmZmZjMDAwMCkgfCAodmFkZHIgJiAweDAwMDNmZmZmKTsKLQkJY2FzZSAzOgotCQkJcmV0dXJuICgqZGVzY2FkZHIgJiBQQUdFX01BU0spIHwgKHZhZGRyICYgflBBR0VfTUFTSyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFB1c2ggbiBwYWdlcyBhdCBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIGFuZCBjbGVhciB0aGUgaWNhY2hlICovCi0vKiBSWjogdXNlIGNwdXNoICViYyBpbnN0ZWFkIG9mIGNwdXNoICVkYywgY2ludiAlaWMgKi8KLXZvaWQgZmx1c2hfaWNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmRhZGRyKQotewotCWlmIChDUFVfSVNfMDQwX09SXzA2MCkgewotCQlhZGRyZXNzICY9IFBBR0VfTUFTSzsKLQotCQlpZiAoYWRkcmVzcyA+PSBQQUdFX09GRlNFVCAmJiBhZGRyZXNzIDwgKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkpIHsKLQkJCWRvIHsKLQkJCQlhc20gdm9sYXRpbGUgKCJub3Bcblx0IgotCQkJCQkgICAgICAiLmNoaXAgNjgwNDBcblx0IgotCQkJCQkgICAgICAiY3B1c2hwICUlYmMsKCUwKVxuXHQiCi0JCQkJCSAgICAgICIuY2hpcCA2OGsiCi0JCQkJCSAgICAgIDogOiAiYSIgKHZpcnRfdG9fcGh5cygodm9pZCAqKWFkZHJlc3MpKSk7Ci0JCQkJYWRkcmVzcyArPSBQQUdFX1NJWkU7Ci0JCQl9IHdoaWxlIChhZGRyZXNzIDwgZW5kYWRkcik7Ci0JCX0gZWxzZSB7Ci0JCQlkbyB7Ci0JCQkJYXNtIHZvbGF0aWxlICgibm9wXG5cdCIKLQkJCQkJICAgICAgIi5jaGlwIDY4MDQwXG5cdCIKLQkJCQkJICAgICAgImNwdXNocCAlJWJjLCglMClcblx0IgotCQkJCQkgICAgICAiLmNoaXAgNjhrIgotCQkJCQkgICAgICA6IDogImEiICh2aXJ0X3RvX3BoeXNfc2xvdyhhZGRyZXNzKSkpOwotCQkJCWFkZHJlc3MgKz0gUEFHRV9TSVpFOwotCQkJfSB3aGlsZSAoYWRkcmVzcyA8IGVuZGFkZHIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCWFzbSB2b2xhdGlsZSAoIm1vdmVjICUlY2FjciwlMFxuXHQiCi0JCQkgICAgICAib3J3ICUxLCUwXG5cdCIKLQkJCSAgICAgICJtb3ZlYyAlMCwlJWNhY3IiCi0JCQkgICAgICA6ICI9JmQiICh0bXApCi0JCQkgICAgICA6ICJkaSIgKEZMVVNIX0kpKTsKLQl9Ci19Ci0KLQogI2lmbmRlZiBDT05GSUdfU0lOR0xFX01FTU9SWV9DSFVOSwogaW50IG1tX2VuZF9vZl9jaHVuayAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbGVuKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL212bWUxNngvcnRjLmMgYi9hcmNoL202OGsvbXZtZTE2eC9ydGMuYwppbmRleCA4YTI0MjUwLi43OTc3ZWFlIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbXZtZTE2eC9ydGMuYworKysgYi9hcmNoL202OGsvbXZtZTE2eC9ydGMuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiAJLmZvcHMgPQkJJnJ0Y19mb3BzCiB9OwogCi1pbnQgX19pbml0IHJ0Y19NSzQ4VDA4X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHJ0Y19NSzQ4VDA4X2luaXQodm9pZCkKIHsKIAlpZiAoIU1BQ0hfSVNfTVZNRTE2eCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xNjksNCArMTY5LDQgQEAKIAlwcmludGsoS0VSTl9JTkZPICJNSzQ4VDA4IFJlYWwgVGltZSBDbG9jayBEcml2ZXIgdiVzXG4iLCBSVENfVkVSU0lPTik7CiAJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnJ0Y19kZXYpOwogfQotCittb2R1bGVfaW5pdChydGNfTUs0OFQwOF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L0tjb25maWcgYi9hcmNoL202OGtub21tdS9LY29uZmlnCmluZGV4IDExN2YxODMuLjg1MjBkZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L0tjb25maWcKKysrIGIvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZwpAQCAtNzEsMjEgKzcxLDMxIEBACiAJaGVscAogCSAgTW90b3JvbGEgQ29sZEZpcmUgNTIwNmUgcHJvY2Vzc29yIHN1cHBvcnQuCiAKK2NvbmZpZyBNNTIzeAorCWJvb2wgIk1DRjUyM3giCisJaGVscAorCSAgRnJlZXNjYWxlIENvbGRmaXJlIDUyMzAvMS8yLzQvNSBwcm9jZXNzb3Igc3VwcG9ydAorCiBjb25maWcgTTUyNDkKIAlib29sICJNQ0Y1MjQ5IgogCWhlbHAKIAkgIE1vdG9yb2xhIENvbGRGaXJlIDUyNDkgcHJvY2Vzc29yIHN1cHBvcnQuCiAKLWNvbmZpZyBNNTI3eAotCWJvb2wgIk1DRjUyN3giCitjb25maWcgTTUyNzEKKwlib29sICJNQ0Y1MjcxIgogCWhlbHAKLQkgIEZyZWVzY2FsZSAoTW90b3JvbGEpIENvbGRGaXJlIDUyNzAvNTI3MS81Mjc0LzUyNzUgcHJvY2Vzc29yIHN1cHBvcnQuCisJICBGcmVlc2NhbGUgKE1vdG9yb2xhKSBDb2xkRmlyZSA1MjcwLzUyNzEgcHJvY2Vzc29yIHN1cHBvcnQuCiAKIGNvbmZpZyBNNTI3MgogCWJvb2wgIk1DRjUyNzIiCiAJaGVscAogCSAgTW90b3JvbGEgQ29sZEZpcmUgNTI3MiBwcm9jZXNzb3Igc3VwcG9ydC4KIAorY29uZmlnIE01Mjc1CisJYm9vbCAiTUNGNTI3NSIKKwloZWxwCisJICBGcmVlc2NhbGUgKE1vdG9yb2xhKSBDb2xkRmlyZSA1Mjc0LzUyNzUgcHJvY2Vzc29yIHN1cHBvcnQuCisKIGNvbmZpZyBNNTI4eAogCWJvb2wgIk1DRjUyOHgiCiAJaGVscApAQCAtMTAzLDkgKzExMywxNCBAQAogCiBlbmRjaG9pY2UKIAorY29uZmlnIE01Mjd4CisJYm9vbAorCWRlcGVuZHMgb24gKE01MjcxIHx8IE01Mjc1KQorCWRlZmF1bHQgeQorCiBjb25maWcgQ09MREZJUkUKIAlib29sCi0JZGVwZW5kcyBvbiAoTTUyMDYgfHwgTTUyMDZlIHx8IE01MjQ5IHx8IE01Mjd4IHx8IE01MjcyIHx8IE01Mjh4IHx8IE01MzA3IHx8IE01NDA3KQorCWRlcGVuZHMgb24gKE01MjA2IHx8IE01MjA2ZSB8fCBNNTIzeCB8fCBNNTI0OSB8fCBNNTI3eCB8fCBNNTI3MiB8fCBNNTI4eCB8fCBNNTMwNyB8fCBNNTQwNykKIAlkZWZhdWx0IHkKIAogY2hvaWNlCkBAIC0xODMsNiArMTk4LDExIEBACiAJaGVscAogCSAgU2VsZWN0IGEgNjBNSHogQ1BVIGNsb2NrIGZyZXF1ZW5jeS4KIAorY29uZmlnIENMT0NLXzYyXzVNSHoKKwlib29sICI2Mi41TUh6IgorCWhlbHAKKwkgIFNlbGVjdCBhIDYyLjVNSHogQ1BVIGNsb2NrIGZyZXF1ZW5jeS4KKwogY29uZmlnIENMT0NLXzY0TUh6CiAJYm9vbCAiNjRNSHoiCiAJaGVscApAQCAtMzAyLDYgKzMyMiwxMiBAQAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBNb3Rvcm9sYSBNNTIwNmVMSVRFIGJvYXJkLgogCitjb25maWcgTTUyMzVFVkIKKwlib29sICJGcmVlc2NhbGUgTTUyMzVFVkIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE01MjN4CisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIEZyZWVzY2FsZSBNNTIzNUVWQiBib2FyZC4KKwogY29uZmlnIE01MjQ5QzMKIAlib29sICJNb3Rvcm9sYSBNNTI0OUMzIGJvYXJkIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNNTI0OQpAQCAtMzEwLDEzICszMzYsMTMgQEAKIAogY29uZmlnIE01MjcxRVZCCiAJYm9vbCAiRnJlZXNjYWxlIChNb3Rvcm9sYSkgTTUyNzFFVkIgYm9hcmQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE01Mjd4CisJZGVwZW5kcyBvbiBNNTI3MQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBGcmVlc2NhbGUgKE1vdG9yb2xhKSBNNTI3MUVWQiBib2FyZC4KIAogY29uZmlnIE01Mjc1RVZCCiAJYm9vbCAiRnJlZXNjYWxlIChNb3Rvcm9sYSkgTTUyNzVFVkIgYm9hcmQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE01Mjd4CisJZGVwZW5kcyBvbiBNNTI3NQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBGcmVlc2NhbGUgKE1vdG9yb2xhKSBNNTI3NUVWQiBib2FyZC4KIApAQCAtMzQzLDYgKzM2OSwxMiBAQAogCWRlcGVuZHMgb24gTTUyOHgKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgc2VuVGVjIENPQlJBNTI4MiBib2FyZC4KKwkgIAorY29uZmlnIFNPTTUyODJFTQorCWJvb2wgIkVNQUMuSW5jIFNPTTUyODJFTSBib2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTTUyOHgKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgRU1BQy5JbmMgU09NNTI4MkVNIG1vZHVsZS4gIAogCiBjb25maWcgQVJONTMwNwogCWJvb2wgIkFybmV3c2ggNTMwNyBib2FyZCBzdXBwb3J0IgpAQCAtNDEwLDYgKzQ0MiwxMiBAQAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBTTkVIQSBDUFUxNkIgYm9hcmQuCiAKK2NvbmZpZyBNT0Q1MjcyCisJYm9vbCAiTmV0YnVybmVyIE1PRC01MjcyIGJvYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNNTI3MgorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBOZXRidXJuZXIgTU9ELTUyNzIgYm9hcmQuCisKIGNvbmZpZyBST01GU19GUk9NX1JPTQogCWJvb2wgIiAgUk9NRlMgaW1hZ2Ugbm90IFJBTSByZXNpZGVudCIKIAlkZXBlbmRzIG9uIChORVR0ZWwgfHwgU05BUEdFQVIpCkBAIC00MzAsNyArNDY4LDcgQEAKIGNvbmZpZyBNT1RPUk9MQQogCWJvb2wKIAlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIChNNTIwNmVDMyB8fCBNNTI0OUMzIHx8IE01MjcxRVZCIHx8IE01MjcyQzMgfHwgTTUyNzVFVkIgfHwgTTUyODJFVkIgfHwgTTUzMDdDMyB8fCBNNTQwN0MzKQorCWRlcGVuZHMgb24gKE01MjA2ZUMzIHx8IE01MjM1RVZCIHx8IE01MjQ5QzMgfHwgTTUyNzFFVkIgfHwgTTUyNzJDMyB8fCBNNTI3NUVWQiB8fCBNNTI4MkVWQiB8fCBNNTMwN0MzIHx8IE01NDA3QzMpCiAKIGNvbmZpZyBIV19GRUlUSAogCWJvb2wKQEAgLTQ0MSw2ICs0NzksMTEgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAJZGVwZW5kcyBvbiAoQ09CUkE1MjcyIHx8IENPQlJBNTI4MikKKwkKK2NvbmZpZyBFTUFDX0lOQworCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIChTT001MjgyRU0pCiAKIGNvbmZpZyBTTkVIQQogICAgICAgICBib29sCkBAIC00NTUsNiArNDk4LDE1IEBACiAJICBhIGxvdCBvZiBSQU0sIGFuZCB5b3UgbmVlZCB0byBhYmxlIHRvIGFsbG9jYXRlIHZlcnkgbGFyZ2UKIAkgIGNvbnRpZ3VvdXMgY2h1bmtzLiBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgNEtTVEFDS1MKKwlib29sICJVc2UgNEtiIGZvciBrZXJuZWwgc3RhY2tzIGluc3RlYWQgb2YgOEtiIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHRoZSBrZXJuZWwgd2lsbCB1c2UgYSA0S2Igc3RhY2tzaXplIGZvciB0aGUKKwkgIGtlcm5lbCBzdGFjayBhdHRhY2hlZCB0byBlYWNoIHByb2Nlc3MvdGhyZWFkLiBUaGlzIGZhY2lsaXRhdGVzCisJICBydW5uaW5nIG1vcmUgdGhyZWFkcyBvbiBhIHN5c3RlbSBhbmQgYWxzbyByZWR1Y2VzIHRoZSBwcmVzc3VyZQorCSAgb24gdGhlIFZNIHN1YnN5c3RlbSBmb3IgaGlnaGVyIG9yZGVyIGFsbG9jYXRpb25zLgorCiBjaG9pY2UKIAlwcm9tcHQgIlJBTSBzaXplIgogCWRlZmF1bHQgQVVUTwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvTWFrZWZpbGUgYi9hcmNoL202OGtub21tdS9NYWtlZmlsZQppbmRleCBhMjU0YWE5Li5iOGZkZjE5IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9NYWtlZmlsZQorKysgYi9hcmNoL202OGtub21tdS9NYWtlZmlsZQpAQCAtMTQsNiArMTQsNyBAQAogcGxhdGZvcm0tJChDT05GSUdfTTY4MzYwKQk6PSA2ODM2MAogcGxhdGZvcm0tJChDT05GSUdfTTUyMDYpCTo9IDUyMDYKIHBsYXRmb3JtLSQoQ09ORklHX001MjA2ZSkJOj0gNTIwNmUKK3BsYXRmb3JtLSQoQ09ORklHX001MjN4KQk6PSA1MjN4CiBwbGF0Zm9ybS0kKENPTkZJR19NNTI0OSkJOj0gNTI0OQogcGxhdGZvcm0tJChDT05GSUdfTTUyN3gpCTo9IDUyN3gKIHBsYXRmb3JtLSQoQ09ORklHX001MjcyKQk6PSA1MjcyCkBAIC0yOSw2ICszMCw3IEBACiBib2FyZC0kKENPTkZJR19EUkFHRU4yKQkJOj0gZGUyCiBib2FyZC0kKENPTkZJR19BUk5FV1NIKQkJOj0gQVJORVdTSAogYm9hcmQtJChDT05GSUdfTU9UT1JPTEEpCTo9IE1PVE9ST0xBCitib2FyZC0kKENPTkZJR19NNTIzNUVWQikJOj0gTTUyMzVFVkIKIGJvYXJkLSQoQ09ORklHX001MjcxRVZCKQk6PSBNNTI3MUVWQgogYm9hcmQtJChDT05GSUdfTTUyNzVFVkIpCTo9IE01Mjc1RVZCCiBib2FyZC0kKENPTkZJR19NNTI4MkVWQikJOj0gTTUyODJFVkIKQEAgLTM5LDYgKzQxLDcgQEAKIGJvYXJkLSQoQ09ORklHX0NMRU9QQVRSQSkJOj0gQ0xFT1BBVFJBCiBib2FyZC0kKENPTkZJR19zZW5UZWMpCQk6PSBzZW5UZWMKIGJvYXJkLSQoQ09ORklHX1NORUhBKSAJICAgICAgICA6PSBTTkVIQQorYm9hcmQtJChDT05GSUdfTU9ENTI3MikJCTo9IE1PRDUyNzIKIEJPQVJEIDo9ICQoYm9hcmQteSkKIAogbW9kZWwtJChDT05GSUdfUkFNS0VSTkVMKQk6PSByYW0KQEAgLTUzLDYgKzU2LDcgQEAKICMKIGNwdWNsYXNzLSQoQ09ORklHX001MjA2KQk6PSA1MzA3CiBjcHVjbGFzcy0kKENPTkZJR19NNTIwNmUpCTo9IDUzMDcKK2NwdWNsYXNzLSQoQ09ORklHX001MjN4KQk6PSA1MzA3CiBjcHVjbGFzcy0kKENPTkZJR19NNTI0OSkJOj0gNTMwNwogY3B1Y2xhc3MtJChDT05GSUdfTTUyN3gpCTo9IDUzMDcKIGNwdWNsYXNzLSQoQ09ORklHX001MjcyKQk6PSA1MzA3CkBAIC03Niw2ICs4MCw3IEBACiAjCiBjZmxhZ3MtJChDT05GSUdfTTUyMDYpCQk6PSAtbTUyMDAgLVdhLC1TIC1XYSwtbTUyMDAKIGNmbGFncy0kKENPTkZJR19NNTIwNmUpCQk6PSAtbTUyMDAgLVdhLC1TIC1XYSwtbTUyMDAKK2NmbGFncy0kKENPTkZJR19NNTIzeCkJCTo9IC1tNTMwNyAtV2EsLVMgLVdhLC1tNTMwNwogY2ZsYWdzLSQoQ09ORklHX001MjQ5KQkJOj0gLW01MjAwIC1XYSwtUyAtV2EsLW01MjAwCiBjZmxhZ3MtJChDT05GSUdfTTUyN3gpCQk6PSAtbTUzMDcgLVdhLC1TIC1XYSwtbTUzMDcKIGNmbGFncy0kKENPTkZJR19NNTI3MikJCTo9IC1tNTMwNyAtV2EsLVMgLVdhLC1tNTMwNwpAQCAtOTcsMjEgKzEwMiwxMSBAQAogCiBoZWFkLXkgOj0gYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vJChjcHVjbGFzcy15KS9oZWFkLm8KIAotQ0xFQU5fRklMRVMgOj0gaW5jbHVkZS9hc20tJChBUkNIKS9hc20tb2Zmc2V0cy5oIFwKLQkgICAgICAgYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zCi0KIGNvcmUteQkrPSBhcmNoL202OGtub21tdS9rZXJuZWwvIFwKIAkgICBhcmNoL202OGtub21tdS9tbS8gXAogCSAgICQoQ0xBU1NESVIpIFwKIAkgICBhcmNoL202OGtub21tdS9wbGF0Zm9ybS8kKFBMQVRGT1JNKS8KIGxpYnMteQkrPSBhcmNoL202OGtub21tdS9saWIvCiAKLXByZXBhcmU6IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtLW9mZnNldHMuaAotCiBhcmNoY2xlYW46Ci0JJChjYWxsIGRlc2NlbmQgYXJjaC8kKEFSQ0gpL2Jvb3QsIHN1YmRpcmNsZWFuKQotCi1pbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbS1vZmZzZXRzLmg6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucyBcCi0JCQkJICAgaW5jbHVkZS9hc20gaW5jbHVkZS9saW51eC92ZXJzaW9uLmggXAotCQkJCSAgIGluY2x1ZGUvY29uZmlnL01BUktFUgotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT1hcmNoL202OGtub21tdS9ib290CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9kZWZjb25maWcgYi9hcmNoL202OGtub21tdS9kZWZjb25maWcKaW5kZXggZTRiZDMxYi4uODdmMmQ2NSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4a25vbW11L2RlZmNvbmZpZwpAQCAtMSwyNCArMSw0OCBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXVjMAorIyBXZWQgQXVnIDMxIDE1OjAzOjI2IDIwMDUKICMKK0NPTkZJR19NNjhLTk9NTVU9eQogIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZQVSBpcyBub3Qgc2V0CiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogIyBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0gaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKICMKIENPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogCiAjCiAjIEdlbmVyYWwgc2V0dXAKICMKLSMgQ09ORklHX1NZU1ZJUEMgaXMgbm90IHNldAorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfU1lTQ1RMIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tPQkpFQ1RfVUVWRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CisjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CisjIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCitDT05GSUdfQkFTRV9TTUFMTD0wCiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTM0LDkgKzU4LDExIEBACiAjIENPTkZJR19NNjgzNjAgaXMgbm90IHNldAogIyBDT05GSUdfTTUyMDYgaXMgbm90IHNldAogIyBDT05GSUdfTTUyMDZlIGlzIG5vdCBzZXQKKyMgQ09ORklHX001MjN4IGlzIG5vdCBzZXQKICMgQ09ORklHX001MjQ5IGlzIG5vdCBzZXQKLSMgQ09ORklHX001Mjd4IGlzIG5vdCBzZXQKKyMgQ09ORklHX001MjcxIGlzIG5vdCBzZXQKIENPTkZJR19NNTI3Mj15CisjIENPTkZJR19NNTI3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19NNTI4eCBpcyBub3Qgc2V0CiAjIENPTkZJR19NNTMwNyBpcyBub3Qgc2V0CiAjIENPTkZJR19NNTQwNyBpcyBub3Qgc2V0CkBAIC01NCw2ICs4MCw4IEBACiAjIENPTkZJR19DTE9DS181ME1IeiBpcyBub3Qgc2V0CiAjIENPTkZJR19DTE9DS181NE1IeiBpcyBub3Qgc2V0CiAjIENPTkZJR19DTE9DS182ME1IeiBpcyBub3Qgc2V0CisjIENPTkZJR19DTE9DS182Ml81TUh6IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NMT0NLXzY0TUh6IGlzIG5vdCBzZXQKIENPTkZJR19DTE9DS182Nk1Iej15CiAjIENPTkZJR19DTE9DS183ME1IeiBpcyBub3Qgc2V0CiAjIENPTkZJR19DTE9DS18xMDBNSHogaXMgbm90IHNldApAQCAtNjUsMTMgKzkzLDE5IEBACiAjIFBsYXRmb3JtCiAjCiBDT05GSUdfTTUyNzJDMz15CisjIENPTkZJR19DT0JSQTUyNzIgaXMgbm90IHNldAorIyBDT05GSUdfQ0FOQ2FtIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDQUxFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVR0ZWwgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVMTZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRDUyNzIgaXMgbm90IHNldAogQ09ORklHX01PVE9ST0xBPXkKICMgQ09ORklHX0xBUkdFX0FMTE9DUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQU1BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR180S1NUQUNLUz15CitDT05GSUdfUkFNQVVUTz15CiAjIENPTkZJR19SQU00TUIgaXMgbm90IHNldAogIyBDT05GSUdfUkFNOE1CIGlzIG5vdCBzZXQKLUNPTkZJR19SQU0xNk1CPXkKKyMgQ09ORklHX1JBTTE2TUIgaXMgbm90IHNldAogIyBDT05GSUdfUkFNMzJNQiBpcyBub3Qgc2V0CiBDT05GSUdfUkFNQVVUT0JJVD15CiAjIENPTkZJR19SQU04QklUIGlzIG5vdCBzZXQKQEAgLTc5LDIwICsxMTMsMzQgQEAKICMgQ09ORklHX1JBTTMyQklUIGlzIG5vdCBzZXQKIENPTkZJR19SQU1LRVJORUw9eQogIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJTUVNS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKIAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQogIwogIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgUENJIEhvdHBsdWcgU3VwcG9ydAorIwogCiAjCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCiAjCi1DT05GSUdfS0NPUkVfQU9VVD15CiBDT05GSUdfQklORk1UX0ZMQVQ9eQogIyBDT05GSUdfQklORk1UX1pGTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCkBAIC0xMDAsMTIgKzE0OCw4MiBAQAogIyBDT05GSUdfUE0gaXMgbm90IHNldAogCiAjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKKyMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKICMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQogIwogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAotQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKIApAQCAtMTE2LDM1ICsyMzQsNTAgQEAKIENPTkZJR19NVERfQkxPQ0s9eQogIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAogCiAjCiAjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCiAjCiAjIENPTkZJR19NVERfQ0ZJIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKIENPTkZJR19NVERfUkFNPXkKICMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAogCiAjCiAjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKICMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfVUNMSU5VWD15CisjIENPTkZJR19NVERfU05BUEdFQVJ1QyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKICMKICMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCiAjCiAjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKIAogIwogIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKICMKLSMgQ09ORklHX01URF9ET0MxMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CiAKICMKICMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycwpAQCAtMTU5LDIxICsyOTIsMzIgQEAKICMKICMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CiAjCi0jIENPTkZJR19QTlAgaXMgbm90IHNldAogCiAjCiAjIEJsb2NrIGRldmljZXMKICMKICMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CiAjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0JMS01FTSBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAKICMKLSMgQVRBL0lERS9NRk0vUkxMIHN1cHBvcnQKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CiAjCiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCkBAIC0xOTAsOTEgKzMzNCw0NyBAQAogIwogIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CiAjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKIAogIwogIyBJMk8gZGV2aWNlIHN1cHBvcnQKICMKIAogIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi1DT05GSUdfUEFDS0VUPXkKLSMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GSUxURVIgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci0jIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VDTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLUNPTkZJR19JUFY2X1NDVFBfXz15Ci0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0hXX0ZMT1dDT05UUk9MIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVEhFUlRBUCBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCiAjCiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKICMgQ09ORklHX01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORTIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BDSSBpcyBub3Qgc2V0CiBDT05GSUdfRkVDPXkKKyMgQ09ORklHX0ZFQzIgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwIE1iaXQpCiAjCi1DT05GSUdfUFBQPXkKLSMgQ09ORklHX1BQUF9NVUxUSUxJTksgaXMgbm90IHNldAotIyBDT05GSUdfUFBQX0FTWU5DIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUF9TWU5DX1RUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfREVGTEFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfQlNEQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKIAogIwogIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKQEAgLTI4MiwyOSArMzgyLDI3IEBACiAjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAogCiAjCi0jIFRva2VuIFJpbmcgZGV2aWNlcyAoZGVwZW5kcyBvbiBMTEM9eSkKLSMKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0KLSMKICMgV2FuIGludGVyZmFjZXMKICMKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQW1hdGV1ciBSYWRpbyBzdXBwb3J0Ci0jCi0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSXJEQSAoaW5mcmFyZWQpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAorQ09ORklHX1BQUD15CisjIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfUFBQX0FTWU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9TWU5DX1RUWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfQlNEQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CiAKICMKICMgSVNETiBzdWJzeXN0ZW0KICMKLSMgQ09ORklHX0lTRE5fQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKIAogIwogIyBUZWxlcGhvbnkgU3VwcG9ydApAQCAtMzE0LDUwICs0MTIsMjAgQEAKICMKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKLUNPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0CiAKICMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcworIyBIYXJkd2FyZSBJL08gcG9ydHMKICMKLUNPTkZJR19JTlBVVF9NT1VTRURFVj15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKLSMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgSS9PIGRyaXZlcnMKLSMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci1DT05GSUdfU0VSSU89eQotQ09ORklHX1NFUklPX0k4MDQyPXkKLUNPTkZJR19TRVJJT19TRVJQT1JUPXkKLSMgQ09ORklHX1NFUklPX0NUODJDNzEwIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKLSMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIAogIwogIyBDaGFyYWN0ZXIgZGV2aWNlcwogIwogIyBDT05GSUdfVlQgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRE1BTiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRVNFVFNXSVRDSCBpcyBub3Qgc2V0CiAKICMKQEAgLTM3MCwyNSArNDM4LDggQEAKICMKIENPTkZJR19TRVJJQUxfQ09MREZJUkU9eQogIyBDT05GSUdfVU5JWDk4X1BUWVMgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIEkyQyBIYXJkd2FyZSBTZW5zb3JzIE1haW5ib2FyZCBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJDIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0Ci0jCi0KLSMKLSMgTWljZQotIwotIyBDT05GSUdfQlVTTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfUUlDMDJfVEFQRSBpcyBub3Qgc2V0CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CiAKICMKICMgSVBNSQpAQCAtMzk5LDIxICs0NTAsNDIgQEAKICMgV2F0Y2hkb2cgQ2FyZHMKICMKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01DRldBVENIRE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CiAjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAogCiAjCiAjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgogIwotIyBDT05GSUdfRlRBUEUgaXMgbm90IHNldAotIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTkdDSEVDS19USU1FUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX01DRl9RU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX000MVQxMU02IGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TRU5TT1IgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKQEAgLTQyMSwxOCArNDkzLDcxIEBACiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogCiAjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNQSSBzdXBwb3J0CisjCisjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKworIworIyBTTiBEZXZpY2VzCisjCisKKyMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15CiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogQ09ORklHX1JPTUZTX0ZTPXkKK0NPTkZJR19NQUdJQ19ST01fUFRSPXkKKyMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CiAKQEAgLTQ0NSwxNSArNTcwLDE3IEBACiAjCiAjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKICMKLSMgQ09ORklHX0ZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAogCiAjCiAjIFBzZXVkbyBmaWxlc3lzdGVtcwogIwogQ09ORklHX1BST0NfRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTPXkKICMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQogCiAjCkBAIC00NjIsNiArNTg5LDcgQEAKICMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldApAQCAtNDc5LDEyICs2MDcsMTAgQEAKICMKICMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYUE9SVEZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOVEVSTUVaWk9fRlMgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKIAogIwpAQCAtNDk0LDMwICs2MjAsMTkgQEAKIENPTkZJR19NU0RPU19QQVJUSVRJT049eQogCiAjCi0jIEdyYXBoaWNzIHN1cHBvcnQKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICMKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi0KLSMKLSMgQmx1ZXRvb3RoIHN1cHBvcnQKLSMKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfRlVMTERFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJR0hQUk9GSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RQQVJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1QVE9GTEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19OT19LRVJORUxfTVNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JETV9ESVNBQkxFIGlzIG5vdCBzZXQKQEAgLTUyNSw2ICs2NDAsNyBAQAogIwogIyBTZWN1cml0eSBvcHRpb25zCiAjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKIAogIwpAQCAtNTMzLDYgKzY0OSwxMiBAQAogIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKIAogIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCiAjIExpYnJhcnkgcm91dGluZXMKICMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMzMiBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc2V0dXAuYwppbmRleCA1NTcyMzg1Li5hMjIwMzQ1IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc2V0dXAuYwpAQCAtNiw3ICs2LDcgQEAKICAqICBDb3B5bGVmdCAgKCkpIDIwMDAgICAgICAgSmFtZXMgRC4gU2NoZXR0aW5lIHtqYW1lc0B0ZWxvcy1zeXN0ZW1zLmNvbX0KICAqICBDb3B5cmlnaHQgKEMpIDE5OTggICAgICAgS2VubmV0aCBBbGJhbm93c2tpIDxramFoZHNAa2phaGRzLmNvbT4KICAqICBDb3B5cmlnaHQgKEMpIDE5OTUgICAgICAgSGFtaXNoIE1hY2RvbmFsZAotICogIENvcHlyaWdodCAoQykgMjAwMCAgICAgICBMaW5lbyBJbmMuICh3d3cubGluZW8uY29tKSAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgICAgICAgTGluZW8gSW5jLiAod3d3LmxpbmVvLmNvbSkKICAqICBDb3B5cmlnaHQgKEMpIDIwMDEgCSAgICAgTGluZW8sIEluYy4gPHd3dy5saW5lby5jb20+CiAgKgogICogIDY4VlozMjggRml4ZXMvc3VwcG9ydCAgICBFdmFuIFN0YXdueWN6eSA8ZUBsaW5lby5jYT4KQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTQ1LDYgKzQ2LDkgQEAKIHVuc2lnbmVkIGxvbmcgbWVtb3J5X3N0YXJ0OwogdW5zaWduZWQgbG9uZyBtZW1vcnlfZW5kOwogCitFWFBPUlRfU1lNQk9MKG1lbW9yeV9zdGFydCk7CitFWFBPUlRfU1lNQk9MKG1lbW9yeV9lbmQpOworCiBjaGFyIGNvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CiAKIC8qIHNldHVwIHNvbWUgZHVtbXkgcm91dGluZXMgKi8KQEAgLTEwMywxNSArMTA3LDIxIEBACiAjaWYgZGVmaW5lZChDT05GSUdfTTUyMDZlKQogCSNkZWZpbmUJQ1BVICJDT0xERklSRShtNTIwNmUpIgogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfTTUyM3gpCisJI2RlZmluZSBDUFUgIkNPTERGSVJFKG01MjN4KSIKKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX001MjQ5KQogCSNkZWZpbmUgQ1BVICJDT0xERklSRShtNTI0OSkiCiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19NNTI3eCkKLQkjZGVmaW5lIENQVSAiQ09MREZJUkUobTUyNzAvNTI3MS81Mjc0LzUyNzUpIgorI2lmIGRlZmluZWQoQ09ORklHX001MjcxKQorCSNkZWZpbmUgQ1BVICJDT0xERklSRShtNTI3MC81MjcxKSIKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX001MjcyKQogCSNkZWZpbmUgQ1BVICJDT0xERklSRShtNTI3MikiCiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NNTI3NSkKKwkjZGVmaW5lIENQVSAiQ09MREZJUkUobTUyNzQvNTI3NSkiCisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19NNTI4eCkKIAkjZGVmaW5lIENQVSAiQ09MREZJUkUobTUyODAvNTI4MikiCiAjZW5kaWYKQEAgLTE1Miw3ICsxNjIsNyBAQAogCWluaXRfbW0uc3RhcnRfY29kZSA9ICh1bnNpZ25lZCBsb25nKSAmX3N0ZXh0OwogCWluaXRfbW0uZW5kX2NvZGUgPSAodW5zaWduZWQgbG9uZykgJl9ldGV4dDsKIAlpbml0X21tLmVuZF9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZfZWRhdGE7Ci0JaW5pdF9tbS5icmsgPSAodW5zaWduZWQgbG9uZykgMDsgCisJaW5pdF9tbS5icmsgPSAodW5zaWduZWQgbG9uZykgMDsKIAogCWNvbmZpZ19CU1AoJmNvbW1hbmRfbGluZVswXSwgc2l6ZW9mKGNvbW1hbmRfbGluZSkpOwogCkBAIC0xNzEsNyArMTgxLDcgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19FTElURQogCXByaW50ayhLRVJOX0lORk8gIk1vZGlmaWVkIGZvciBNNTIwNmVMSVRFIGJ5IFJvYiBTY290dCwgcnNjb3R0QG10cm9iLmZkbnMubmV0XG4iKTsKLSNlbmRpZiAgCisjZW5kaWYKICNpZmRlZiBDT05GSUdfVEVMT1MKIAlwcmludGsoS0VSTl9JTkZPICJNb2RpZmllZCBmb3IgT21uaWEgVG9vbFZveCBieSBKYW1lcyBELiBTY2hldHRpbmUsIGphbWVzQHRlbG9zLXN5c3RlbXMuY29tXG4iKTsKICNlbmRpZgpAQCAtMjAwLDYgKzIxMCw5IEBACiAjaWZkZWYgQ09ORklHX0RSQUdFTjIKIAlwcmludGsoS0VSTl9JTkZPICJEcmFnb25FbmdpbmUgSUkgYm9hcmQgc3VwcG9ydCBieSBHZW9yZ2VzIE1lbmllXG4iKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19NNTIzNUVWQgorCXByaW50ayhLRVJOX0lORk8gIk1vdG9yb2xhIE01MjM1RVZCIHN1cHBvcnQgKEMpMjAwNSBTeW4tdGVjaCBTeXN0ZW1zLCBJbmMuIChKYXRlIFN1amphdmFuaWNoKSIpOworI2VuZGlmCiAKICNpZmRlZiBERUJVRwogCXByaW50ayhLRVJOX0RFQlVHICJLRVJORUwgLT4gVEVYVD0weCUwNngtMHglMDZ4IERBVEE9MHglMDZ4LTB4JTA2eCAiCkBAIC0yMjMsNyArMjM2LDcgQEAKIAlzYXZlZF9jb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkUtMV0gPSAwOwogCiAjaWZkZWYgREVCVUcKLQlpZiAoc3RybGVuKCpjbWRsaW5lX3ApKSAKKwlpZiAoc3RybGVuKCpjbWRsaW5lX3ApKQogCQlwcmludGsoS0VSTl9ERUJVRyAiQ29tbWFuZCBsaW5lOiAnJXMnXG4iLCAqY21kbGluZV9wKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvdGltZS5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RpbWUuYwppbmRleCA1YzNjYTY3Li5iMTdjMWVjIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC90aW1lLmMKQEAgLTY4LDcgKzY4LDcgQEAKIAkgKiBDTU9TIGNsb2NrIGFjY29yZGluZ2x5IGV2ZXJ5IH4xMSBtaW51dGVzLiBTZXRfcnRjX21tc3MoKSBoYXMgdG8gYmUKIAkgKiBjYWxsZWQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gNTAwIG1zIGJlZm9yZSB0aGUgbmV3IHNlY29uZCBzdGFydHMuCiAJICovCi0JaWYgKCh0aW1lX3N0YXR1cyAmIFNUQV9VTlNZTkMpID09IDAgJiYKKwlpZiAobnRwX3N5bmNlZCgpICYmCiAJICAgIHh0aW1lLnR2X3NlYyA+IGxhc3RfcnRjX3VwZGF0ZSArIDY2MCAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApID49IDUwMDAwMCAtICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyICYmCiAJICAgICh4dGltZS50dl9uc2VjICAvIDEwMDApIDw9IDUwMDAwMCArICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyKSB7CkBAIC0xNzgsMTAgKzE3OCw3IEBACiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOwogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOwogCi0JdGltZV9hZGp1c3QgPSAwOwkJLyogc3RvcCBhY3RpdmUgYWRqdGltZSgpICovCi0JdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJbnRwX2NsZWFyKCk7CiAJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CiAJY2xvY2tfd2FzX3NldCgpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvdHJhcHMuYwppbmRleCBhZDdkYzYzLi41YmMwNjg0IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvdHJhcHMuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KQEAgLTM4LDcgKzM5LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9zaWdpbmZvLmg+CiAKLXN0YXRpYyBjaGFyICp2ZWNfbmFtZXNbXSA9IHsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgdmVjX25hbWVzW10gPSB7CiAJIlJFU0VUIFNQIiwgIlJFU0VUIFBDIiwgIkJVUyBFUlJPUiIsICJBRERSRVNTIEVSUk9SIiwKIAkiSUxMRUdBTCBJTlNUUlVDVElPTiIsICJaRVJPIERJVklERSIsICJDSEsiLCAiVFJBUGNjIiwKIAkiUFJJVklMRUdFIFZJT0xBVElPTiIsICJUUkFDRSIsICJMSU5FIDEwMTAiLCAiTElORSAxMTExIiwKQEAgLTEwNiwxNyArMTA3LDIwIEBACiAKIGludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQgPSA0ODsKIAotdm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqZXNwKQordm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3RhY2spCiB7Ci0JdW5zaWduZWQgbG9uZyAqc3RhY2ssICplbmRzdGFjaywgYWRkcjsKKwl1bnNpZ25lZCBsb25nICplbmRzdGFjaywgYWRkcjsKIAlleHRlcm4gY2hhciBfc3RhcnQsIF9ldGV4dDsKIAlpbnQgaTsKIAotCWlmIChlc3AgPT0gTlVMTCkKLQkJZXNwID0gKHVuc2lnbmVkIGxvbmcgKikgJmVzcDsKKwlpZiAoIXN0YWNrKSB7CisJCWlmICh0YXNrKQorCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5rc3A7CisJCWVsc2UKKwkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikmc3RhY2s7CisJfQogCi0Jc3RhY2sgPSBlc3A7Ci0JYWRkciA9ICh1bnNpZ25lZCBsb25nKSBlc3A7CisJYWRkciA9ICh1bnNpZ25lZCBsb25nKSBzdGFjazsKIAllbmRzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIFBBR0VfQUxJR04oYWRkcik7CiAKIAlwcmludGsoS0VSTl9FTUVSRyAiU3RhY2sgZnJvbSAlMDhseDoiLCAodW5zaWduZWQgbG9uZylzdGFjayk7CkBAIC0zMDYsNiArMzEwLDggQEAKIAlzaG93X3N0YWNrKGN1cnJlbnQsICZzdGFjayk7CiB9CiAKK0VYUE9SVF9TWU1CT0woZHVtcF9zdGFjayk7CisKICNpZmRlZiBDT05GSUdfTTY4S0ZQVV9FTVUKIGFzbWxpbmthZ2Ugdm9pZCBmcGVtdV9zaWduYWwoaW50IHNpZ25hbCwgaW50IGNvZGUsIHZvaWQgKmFkZHIpCiB7CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDMxY2IxMjguLjQ3ZjA2NzggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xMDcsNyArMTA3LDcgQEAKICAqLwogI2lmIGRlZmluZWQoQ09ORklHX0VMSVRFKQogI2RlZmluZQlSQU1fU1RBUlQJMHgzMDAyMDAwMAotI2RlZmluZQlSQU1fRU5ECQkweGUwMDAwCisjZGVmaW5lCVJBTV9MRU5HVEgJMHhlMDAwMAogI2VuZGlmCiAKIC8qCkBAIC0xMTgsNyArMTE4LDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19NNTIwNmVDMykgfHwgZGVmaW5lZChDT05GSUdfTTUyNDlDMykgfHwgXAogICAgIGRlZmluZWQoQ09ORklHX001MjcyQzMpIHx8IGRlZmluZWQoQ09ORklHX001MzA3QzMpIHx8IFwKICAgICBkZWZpbmVkKENPTkZJR19BUk41MzA3KSB8fCBkZWZpbmVkKENPTkZJR19NNTQwN0MzKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfTTUyNzFFVkIpIHx8IGRlZmluZWQoQ09ORklHX001Mjc1RVZCKQorICAgIGRlZmluZWQoQ09ORklHX001MjcxRVZCKSB8fCBkZWZpbmVkKENPTkZJR19NNTI3NUVWQikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX001MjM1RVZCKQogI2RlZmluZQlSQU1fU1RBUlQJMHgyMDAwMAogI2RlZmluZQlSQU1fTEVOR1RICTB4M2UwMDAwCiAjZW5kaWYKQEAgLTE0NSw2ICsxNDYsMTYgQEAKICNkZWZpbmUgIFJBTV9MRU5HVEggIDB4M2YwMDAwCiAjZW5kaWYKIAorCisvKgorICoJVGhlIEVNQUMgU29NLTUyODJFTSBtb2R1bGUuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TT001MjgyRU0pCisjZGVmaW5lICBSQU1fU1RBUlQgICAweDEwMDAwCisjZGVmaW5lICBSQU1fTEVOR1RIICAweGZmMDAwMAorI2VuZGlmCisKKwogLyoKICAqCVRoZXNlIGZsYXNoIGJvb3QgYm9hcmRzIHVzZSBhbGwgb2YgcmFtIGZvciBvcGVyYXRpb24uIEFnYWluIHRoZQogICoJYWN0dWFsIG1lbW9yeSBzaXplIGlzIG5vdCBpbXBvcnRhbnQgaGVyZSwgYXNzdW1lIGF0IGxlYXN0IDRNaUIuCkBAIC0xNTgsNyArMTY5LDcgQEAKICNlbmRpZgogCiAvKgotICoJU25laGEgQm9hcmRzIG1pbWltdW4gbWVtbW9yeQorICoJU25laGEgQm9hcmRzIG1pbWltdW4gbWVtb3J5CiAgKglUaGUgZW5kIG9mIFJBTSB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIHJhbSBpcyBmaXR0ZWQsCiAgKglidXQgdGhpcyBpc24ndCBpbXBvcnRhbnQgaGVyZSwgd2UgYXNzdW1lIGF0IGxlYXN0IDRNaUIuCiAgKi8KQEAgLTE2Nyw2ICsxNzgsMTIgQEAKICNkZWZpbmUJUkFNX0xFTkdUSAkweDNlMDAwMAogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19NT0Q1MjcyKQorI2RlZmluZSBSQU1fU1RBUlQJMHgwMjAwMDAwMAorI2RlZmluZSBSQU1fTEVOR1RICTB4MDA4MDAwMDAKKyNkZWZpbmUgUkFNVkVDX1NUQVJUCTB4MjAwMDAwMDAKKyNkZWZpbmUgUkFNVkVDX0xFTkdUSAkweDAwMDAwNDAwCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1JBTUtFUk5FTCkKICNkZWZpbmUJVEVYVAkJcmFtCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MjN4L01ha2VmaWxlIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIzeC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTU3OGIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIzeC9NYWtlZmlsZQpAQCAtMCwwICsxLDE5IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbTY4a25vbW11IGxpbnV4IGtlcm5lbC4KKyMKKworIworIyBJZiB5b3Ugd2FudCB0byBwbGF5IHdpdGggdGhlIEhXIGJyZWFrcG9pbnRzIHRoZW4geW91IHdpbGwKKyMgbmVlZCB0byBhZGQgZGVmaW5lIHRoaXMsICB3aGljaCB3aWxsIGdpdmUgeW91IGEgc3RhY2sgYmFja3RyYWNlCisjIG9uIHRoZSBjb25zb2xlIHBvcnQgd2hlbmV2ZXIgYSBEQkcgaW50ZXJydXB0IG9jY3Vycy4gIFlvdSBoYXZlIHRvCisjIHNldCB1cCB5b3UgSFcgYnJlYWtwb2ludHMgdG8gdHJpZ2dlciBhIERCRyBpbnRlcnJ1cHQ6CisjCisjIEVYVFJBX0NGTEFHUyArPSAtRFRSQVBfREJHX0lOVEVSUlVQVAorIyBFWFRSQV9BRkxBR1MgKz0gLURUUkFQX0RCR19JTlRFUlJVUFQKKyMKKworaWZkZWYgQ09ORklHX0ZVTExERUJVRworQUZMQUdTICs9IC1EREVCVUdHRVJfQ09NUEFUSUJMRV9DQUNIRT0xCitlbmRpZgorCitvYmoteSA6PSBjb25maWcubwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIzeC9jb25maWcuYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyM3gvY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3NjdjZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyM3gvY29uZmlnLmMKQEAgLTAsMCArMSw4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCWxpbnV4L2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyM3gvY29uZmlnLmMKKyAqCisgKglTdWItYXJjaGl0Y3R1cmUgZGVwZW5kYW50IGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHRoZSBGcmVlc2NhbGUKKyAqCTUyM3ggQ1BVcy4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSwgR3JlZyBVbmdlcmVyIChnZXJnQHNuYXBnZWFyLmNvbSkKKyAqCUNvcHlyaWdodCAoQykgMjAwMS0yMDAzLCBTbmFwR2VhciBJbmMuICh3d3cuc25hcGdlYXIuY29tKQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9jb2xkZmlyZS5oPgorI2luY2x1ZGUgPGFzbS9tY2ZzaW0uaD4KKyNpbmNsdWRlIDxhc20vbWNmZG1hLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29sZGZpcmVfcGl0X3RpY2sodm9pZCk7Cit2b2lkIGNvbGRmaXJlX3BpdF9pbml0KGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKK3Vuc2lnbmVkIGxvbmcgY29sZGZpcmVfcGl0X29mZnNldCh2b2lkKTsKK3ZvaWQgY29sZGZpcmVfdHJhcF9pbml0KHZvaWQpOwordm9pZCBjb2xkZmlyZV9yZXNldCh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURNQSBjaGFubmVsIGJhc2UgYWRkcmVzcyB0YWJsZS4KKyAqLwordW5zaWduZWQgaW50ICAgZG1hX2Jhc2VfYWRkcltNQVhfTTY4S19ETUFfQ0hBTk5FTFNdID0geworICAgICAgICBNQ0ZfTUJBUiArIE1DRkRNQV9CQVNFMCwKK307CisKK3Vuc2lnbmVkIGludCBkbWFfZGV2aWNlX2FkZHJlc3NbTUFYX002OEtfRE1BX0NIQU5ORUxTXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBtY2ZfZGlzYWJsZWFsbCh2b2lkKQoreworCSooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKE1DRl9JUFNCQVIgKyBNQ0ZJQ01fSU5UQzAgKyBNQ0ZJTlRDX0lNUkgpKSA9IDB4ZmZmZmZmZmY7CisJKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoTUNGX0lQU0JBUiArIE1DRklDTV9JTlRDMCArIE1DRklOVENfSU1STCkpID0gMHhmZmZmZmZmZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBtY2ZfYXV0b3ZlY3Rvcih1bnNpZ25lZCBpbnQgdmVjKQoreworCS8qIEV2ZXJ5dGhpbmcgaXMgYXV0by12ZWN0b3JlZCBvbiB0aGUgNTI3MiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGNvbmZpZ19CU1AoY2hhciAqY29tbWFuZHAsIGludCBzaXplKQoreworCW1jZl9kaXNhYmxlYWxsKCk7CisKKyNpZmRlZiBDT05GSUdfQk9PVFBBUkFNCisJc3RybmNweShjb21tYW5kcCwgQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcsIHNpemUpOworCWNvbW1hbmRwW3NpemUtMV0gPSAwOworI2Vsc2UKKwltZW1zZXQoY29tbWFuZHAsIDAsIHNpemUpOworI2VuZGlmCisKKwltYWNoX3NjaGVkX2luaXQgPSBjb2xkZmlyZV9waXRfaW5pdDsKKwltYWNoX3RpY2sgPSBjb2xkZmlyZV9waXRfdGljazsKKwltYWNoX2dldHRpbWVvZmZzZXQgPSBjb2xkZmlyZV9waXRfb2Zmc2V0OworCW1hY2hfdHJhcF9pbml0ID0gY29sZGZpcmVfdHJhcF9pbml0OworCW1hY2hfcmVzZXQgPSBjb2xkZmlyZV9yZXNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyNzIvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MjcyL2NvbmZpZy5jCmluZGV4IDVjYjI4NjkuLmNmMzZlN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyNzIvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTI3Mi9jb25maWcuYwpAQCAtMTA0LDExICsxMDQsMTEgQEAKIAogdm9pZCBjb25maWdfQlNQKGNoYXIgKmNvbW1hbmRwLCBpbnQgc2l6ZSkKIHsKLSNpZiAwCi0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZwkqcGl2cnA7CisjaWYgZGVmaW5lZCAoQ09ORklHX01PRDUyNzIpCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqcGl2cnA7CiAKIAkvKiBTZXQgYmFzZSBvZiBkZXZpY2UgdmVjdG9ycyB0byBiZSA2NCAqLwotCXBpdnJwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKE1DRl9NQkFSICsgTUNGU0lNX1BJVlIpOworCXBpdnJwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKE1DRl9NQkFSICsgTUNGU0lNX1BJVlIpOwogCSpwaXZycCA9IDB4NDA7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9NYWtlZmlsZSBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvTWFrZWZpbGUKaW5kZXggODRiNmI3MC4uNmZlNWEyYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9NYWtlZmlsZQorKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L01ha2VmaWxlCkBAIC0xOSw2ICsxOSw3IEBACiBvYmotJChDT05GSUdfQ09MREZJUkUpCSs9IGVudHJ5Lm8gdmVjdG9ycy5vIGludHMubwogb2JqLSQoQ09ORklHX001MjA2KQkrPSB0aW1lcnMubwogb2JqLSQoQ09ORklHX001MjA2ZSkJKz0gdGltZXJzLm8KK29iai0kKENPTkZJR19NNTIzeCkJKz0gcGl0Lm8KIG9iai0kKENPTkZJR19NNTI0OSkJKz0gdGltZXJzLm8KIG9iai0kKENPTkZJR19NNTI3eCkgICAgICs9IHBpdC5vCiBvYmotJChDT05GSUdfTTUyNzIpCSs9IHRpbWVycy5vCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L2hlYWQuUyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvaGVhZC5TCmluZGV4IGM3ZDdhMzkuLjdmNGJhODMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvaGVhZC5TCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvaGVhZC5TCkBAIC0zOSwxNCArMzksMTggQEAKICAqCU1lbW9yeSBzaXplIGV4Y2VwdGlvbnMgZm9yIHNwZWNpYWwgY2FzZXMuIFNvbWUgYm9hcmRzIG1heSBiZSBzZXQKICAqCWZvciBhdXRvIG1lbW9yeSBzaXppbmcsIGJ1dCB3ZSBjYW4ndCBkbyBpdCB0aGF0IHdheSBmb3Igc29tZSByZWFzb24uCiAgKglGb3IgZXhhbXBsZSB0aGUgNTIwNmVMSVRFIGJvYXJkIGhhcyBzdGF0aWMgUkFNLCBhbmQgYXV0by1kZXRlY3RpbmcKLSAqCXRoZSBTRFJBTSB3aWxsIGRvIHlvdSBubyBnb29kIGF0IGFsbC4KKyAqCXRoZSBTRFJBTSB3aWxsIGRvIHlvdSBubyBnb29kIGF0IGFsbC4gU2FtZSBnb2VzIGZvciB0aGUgTU9ENTI3Mi4KICAqLwogI2lmZGVmIENPTkZJR19SQU1BVVRPCiAjaWYgZGVmaW5lZChDT05GSUdfTTUyMDZlTElURSkKLSNkZWZpbmUJTUVNX1NJWkUJMHgwMDEwMDAwMAkJLyogMU1pQiBkZWZhdWx0IG1lbW9yeSAqLworI2RlZmluZQlNRU1fU0laRQkweDAwMTAwMDAwCS8qIDFNaUIgZGVmYXVsdCBtZW1vcnkgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01PRDUyNzIpCisjZGVmaW5lIE1FTV9TSVpFCTB4MDA4MDAwMDAJLyogOE1pQiBkZWZhdWx0IG1lbW9yeSAqLwogI2VuZGlmCiAjZW5kaWYgLyogQ09ORklHX1JBTUFVVE8gKi8KIAorCiAvKgogICoJSWYgd2UgZG9uJ3QgaGF2ZSBhIGZpeGVkIG1lbW9yeSBzaXplIG5vdywgdGhlbiBsZXRzIGJ1aWxkIGluIGNvZGUKICAqCXRvIGF1dG8gZGV0ZWN0IHRoZSBEUkFNIHNpemUuIE9idmlvdXNseSB0aGlzIGlzIHRoZSBwcmVmZXJlZApAQCAtMTAwLDExICsxMDQsMTUgQEAKIAogLyoKICAqCU1vc3QgQ29sZEZpcmUgYm9hcmRzIGhhdmUgdGhlaXIgRFJBTSBzdGFydGluZyBhdCBhZGRyZXNzIDAuCi0gKglOb3RhYmxlIGV4Y2VwdGlvbiBpcyB0aGUgNTIwNmVMSVRFIGJvYXJkLgorICoJTm90YWJsZSBleGNlcHRpb24gaXMgdGhlIDUyMDZlTElURSBib2FyZCwgYW5vdGhlciBpcyB0aGUgTU9ENTI3Mi4KICAqLwogI2lmIGRlZmluZWQoQ09ORklHX001MjA2ZUxJVEUpCiAjZGVmaW5lCU1FTV9CQVNFCTB4MzAwMDAwMDAKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01PRDUyNzIpCisjZGVmaW5lIE1FTV9CQVNFCTB4MDIwMDAwMDAKKyNkZWZpbmUgVkJSX0JBU0UJMHgyMDAwMDAwMAkvKiB2ZWN0b3JzIGluIFNSQU0gKi8KKyNlbmRpZgogCiAjaWZuZGVmIE1FTV9CQVNFCiAjZGVmaW5lCU1FTV9CQVNFCTB4MDAwMDAwMDAJLyogbWVtb3J5IGJhc2UgYXQgYWRkcmVzcyAwICovCkBAIC0xODgsNiArMTk2LDcgQEAKIAltb3ZlbAklYTcsX3JhbWJhc2UKIAogCUdFVF9NRU1fU0laRQkJCQkvKiBtYWNybyBjb2RlIGRldGVybWluZXMgc2l6ZSAqLworCWFkZGwJJWE3LCVkMAogCW1vdmVsCSVkMCxfcmFtZW5kCQkJLyogc2V0IGVuZCByYW0gYWRkciAqLwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzI4L2NvbmZpZy5jIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvY29uZmlnLmMKaW5kZXggZmQ3YzkzZi4uYmNmYTVkNyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvY29uZmlnLmMKQEAgLTEsNSArMSw3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAvKgotICogIGxpbnV4L2FyY2gvJChBUkNIKS9wbGF0Zm9ybS8kKFBMQVRGT1JNKS9jb25maWcuYworICogIGxpbnV4L2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzI4L2NvbmZpZy5jCiAgKgogICogIENvcHlyaWdodCAoQykgMTk5MyBIYW1pc2ggTWFjZG9uYWxkCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk5IEQuIEplZmYgRGlvbm5lCkBAIC0xMSw2ICsxMyw4IEBACiAgKiBWWiBTdXBwb3J0L0ZpeGVzICAgICAgICAgICAgIEV2YW4gU3Rhd255Y3p5IDxlQGxpbmVvLmNhPgogICovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpbmNsdWRlIDxhc20vZGJnLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC0yOSw3NiArMzMsMTYgQEAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9NQzY4MzI4Lmg+CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgQlNQX3NjaGVkX2luaXQoaXJxcmV0dXJuX3QgKCp0aW1lcl9yb3V0aW5lKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpCi17Cit2b2lkIG02ODMyOF90aW1lcl9pbml0KGlycXJldHVybl90ICgqdGltZXJfcm91dGluZSkgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSk7Cit2b2lkIG02ODMyOF90aW1lcl90aWNrKHZvaWQpOwordW5zaWduZWQgbG9uZyBtNjgzMjhfdGltZXJfZ2V0dGltZW9mZnNldCh2b2lkKTsKK3ZvaWQgbTY4MzI4X3RpbWVyX2dldHRvZChpbnQgKnllYXIsIGludCAqbW9uLCBpbnQgKmRheSwgaW50ICpob3VyLCBpbnQgKm1pbiwgaW50ICpzZWMpOwogCi0jaWZkZWYgQ09ORklHX1hDT1BJTE9UX0JVR1MKLSAgLyoKLSAgICogVGhlIG9ubHkgdGhpbmcgSSBrbm93IGlzIHRoYXQgQ0xLMzIgaXMgbm90IGF2YWlsYWJsZSBvbiBYY29waWxvdAotICAgKiBJIGhhdmUgbGl0dGxlIGlkZWEgYWJvdXQgd2hhdCBmcmVxdWVuY3kgU1lTQ0xLIGhhcyBvbiBYY29waWxvdC4gCi0gICAqIFRoZSB2YWx1ZXMgZm9yIHByZXNjYWxlciBhbmQgY29tcGFyZSByZWdpc3RlcnMgd2VyZSBzaW1wbHkgCi0gICAqIHRha2VuIGZyb20gdGhlIG9yaWdpbmFsIHNvdXJjZQotICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgLyogUmVzdGFydCBtb2RlLCBFbmFibGUgaW50LCBTWVNDTEssIEVuYWJsZSB0aW1lciAqLwotICBUQ1RMMiA9IFRDVExfT00gfCBUQ1RMX0lSUUVOIHwgVENUTF9DTEtTT1VSQ0VfU1lTQ0xLIHwgVENUTF9URU47Ci0gIC8qIFNldCBwcmVzY2FsZXIgKi8KLSAgVFBSRVIyID0gMjsKLSAgLyogU2V0IGNvbXBhcmUgcmVnaXN0ZXIgKi8KLSAgVENNUDIgPSAweGQ3ZTQ7Ci0jZWxzZQotICAvKiBSZXN0YXJ0IG1vZGUsIEVuYWJsZSBpbnQsIDMyS0h6LCBFbmFibGUgdGltZXIgKi8KLSAgVENUTDIgPSBUQ1RMX09NIHwgVENUTF9JUlFFTiB8IFRDVExfQ0xLU09VUkNFXzMyS0haIHwgVENUTF9URU47Ci0gIC8qIFNldCBwcmVzY2FsZXIgKERpdmlkZSAzMktIeiBieSAzMikqLwotICBUUFJFUjIgPSAzMTsKLSAgLyogU2V0IGNvbXBhcmUgcmVnaXN0ZXIgIDMyS2h6IC8gMzIgLyAxMCA9IDEwMCAqLwotICBUQ01QMiA9IDEwOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICByZXF1ZXN0X2lycShUTVIyX0lSUV9OVU0sIHRpbWVyX3JvdXRpbmUsIElSUV9GTEdfTE9DSywgInRpbWVyIiwgTlVMTCk7Ci19Ci0KLXZvaWQgQlNQX3RpY2sodm9pZCkKLXsKLSAgLyogUmVzZXQgVGltZXIyICovCi0gIFRTVEFUMiAmPSAwOwotfQotCi11bnNpZ25lZCBsb25nIEJTUF9nZXR0aW1lb2Zmc2V0ICh2b2lkKQotewotICByZXR1cm4gMDsKLX0KLQotdm9pZCBCU1BfZ2V0dG9kIChpbnQgKnllYXJwLCBpbnQgKm1vbnAsIGludCAqZGF5cCwKLQkJICAgaW50ICpob3VycCwgaW50ICptaW5wLCBpbnQgKnNlY3ApCi17Ci19Ci0KLWludCBCU1BfaHdjbGsoaW50IG9wLCBzdHJ1Y3QgaHdjbGtfdGltZSAqdCkKLXsKLSAgaWYgKCFvcCkgewotICAgIC8qIHJlYWQgKi8KLSAgfSBlbHNlIHsKLSAgICAvKiB3cml0ZSAqLwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQgQlNQX3NldF9jbG9ja19tbXNzICh1bnNpZ25lZCBsb25nIG5vd3RpbWUpCi17Ci0jaWYgMAotICBzaG9ydCByZWFsX3NlY29uZHMgPSBub3d0aW1lICUgNjAsIHJlYWxfbWludXRlcyA9IChub3d0aW1lIC8gNjApICUgNjA7Ci0KLSAgdG9kLT5zZWNvbmQxID0gcmVhbF9zZWNvbmRzIC8gMTA7Ci0gIHRvZC0+c2Vjb25kMiA9IHJlYWxfc2Vjb25kcyAlIDEwOwotICB0b2QtPm1pbnV0ZTEgPSByZWFsX21pbnV0ZXMgLyAxMDsKLSAgdG9kLT5taW51dGUyID0gcmVhbF9taW51dGVzICUgMTA7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQlNQX3Jlc2V0ICh2b2lkKQordm9pZCBtNjgzMjhfcmVzZXQgKHZvaWQpCiB7CiAgIGxvY2FsX2lycV9kaXNhYmxlKCk7CiAgIGFzbSB2b2xhdGlsZSAoIm1vdmVhbCAjMHgxMGMwMDAwMCwgJWEwO1xuXHQiCkBAIC0xMDgsMTggKzUyLDIyIEBACiAJCSJqbXAgKCVhMCk7Iik7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHZvaWQgY29uZmlnX0JTUChjaGFyICpjb21tYW5kLCBpbnQgbGVuKQogewogICBwcmludGsoS0VSTl9JTkZPICJcbjY4MzI4IHN1cHBvcnQgRC4gSmVmZiBEaW9ubmUgPGplZmZAdWNsaW51eC5vcmc+XG4iKTsKICAgcHJpbnRrKEtFUk5fSU5GTyAiNjgzMjggc3VwcG9ydCBLZW5uZXRoIEFsYmFub3dza2kgPGtqYWhkc0BranNoZHMuY29tPlxuIik7CiAgIHByaW50ayhLRVJOX0lORk8gIjY4MzI4L1BpbG90IHN1cHBvcnQgQmVybmhhcmQgS3VobiA8a3VobkBscHIuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPlxuIik7CiAKLSAgbWFjaF9zY2hlZF9pbml0ICAgICAgPSBCU1Bfc2NoZWRfaW5pdDsKLSAgbWFjaF90aWNrICAgICAgICAgICAgPSBCU1BfdGljazsKLSAgbWFjaF9nZXR0aW1lb2Zmc2V0ICAgPSBCU1BfZ2V0dGltZW9mZnNldDsKLSAgbWFjaF9nZXR0b2QgICAgICAgICAgPSBCU1BfZ2V0dG9kOworICBtYWNoX3NjaGVkX2luaXQgICAgICA9IG02ODMyOF90aW1lcl9pbml0OworICBtYWNoX3RpY2sgICAgICAgICAgICA9IG02ODMyOF90aW1lcl90aWNrOworICBtYWNoX2dldHRpbWVvZmZzZXQgICA9IG02ODMyOF90aW1lcl9nZXR0aW1lb2Zmc2V0OworICBtYWNoX2dldHRvZCAgICAgICAgICA9IG02ODMyOF90aW1lcl9nZXR0b2Q7CiAgIG1hY2hfaHdjbGsgICAgICAgICAgID0gTlVMTDsKICAgbWFjaF9zZXRfY2xvY2tfbW1zcyAgPSBOVUxMOwotICBtYWNoX3Jlc2V0ICAgICAgICAgICA9IEJTUF9yZXNldDsKKyAgbWFjaF9yZXNldCAgICAgICAgICAgPSBtNjgzMjhfcmVzZXQ7CiAgICpjb21tYW5kID0gJ1wwJzsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzI4L2VudHJ5LlMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC9lbnRyeS5TCmluZGV4IDBmNWQxZmUuLjdkODk5MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzI4L2VudHJ5LlMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvZW50cnkuUwpAQCAtNzksNyArNzksNyBAQAogCW1vdmVsCSVzcEAoUFRfT1JJR19EMCksJWQwCiAKIAltb3ZlbAklc3AsJWQxCQkJLyogZ2V0IHRocmVhZF9pbmZvIHBvaW50ZXIgKi8KLQlhbmRsCSMweGZmZmZlMDAwLCVkMQorCWFuZGwJIy1USFJFQURfU0laRSwlZDEKIAltb3ZlbAklZDEsJWEyCiAJYnRzdCAgICAjVElGX1NZU0NBTExfVFJBQ0UsJWEyQChUSV9GTEFHUykKIAlqbmUJZG9fdHJhY2UKQEAgLTEwNSw3ICsxMDUsNyBAQAogCWFuZHcJI0FMTE9XSU5ULCVzcgogCiAJbW92ZWwJJXNwLCVkMQkJCS8qIGdldCB0aHJlYWRfaW5mbyBwb2ludGVyICovCi0JYW5kbAkjMHhmZmZmZTAwMCwlZDEKKwlhbmRsCSMtVEhSRUFEX1NJWkUsJWQxCiAJbW92ZWwJJWQxLCVhMgogCW1vdmUJJWEyQChUSV9GTEFHUyksJWQxCS8qIHRocmVhZF9pbmZvLT5mbGFncyAqLwogCWFuZGwJI19USUZfV09SS19NQVNLLCVkMQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvdGltZXJzLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC90aW1lcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGMyY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvdGltZXJzLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAgbGludXgvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvdGltZXJzLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzIEhhbWlzaCBNYWNkb25hbGQKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgRC4gSmVmZiBEaW9ubmUKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgR2VvcmdlcyBNZW5pZSwgS2VuIERlc21ldAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9NQzY4VlozMjguaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0RSQUdFTjIpCisvKiB3aXRoIGEgMzMuMTYgTUh6IGNsb2NrLCB0aGlzIHdpbGwgZ2l2ZSB1c2VjIHJlc29sdXRpb24gdG8gdGhlIHRpbWUgZnVuY3Rpb25zICovCisjZGVmaW5lIENMT0NLX1NPVVJDRQlUQ1RMX0NMS1NPVVJDRV9TWVNDTEsKKyNkZWZpbmUgQ0xPQ0tfUFJFCTcKKyNkZWZpbmUgVElDS1NfUEVSX0pJRkZZCTQxNDUwCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1hDT1BJTE9UX0JVR1MpCisvKgorICogVGhlIG9ubHkgdGhpbmcgSSBrbm93IGlzIHRoYXQgQ0xLMzIgaXMgbm90IGF2YWlsYWJsZSBvbiBYY29waWxvdAorICogSSBoYXZlIGxpdHRsZSBpZGVhIGFib3V0IHdoYXQgZnJlcXVlbmN5IFNZU0NMSyBoYXMgb24gWGNvcGlsb3QuCisgKiBUaGUgdmFsdWVzIGZvciBwcmVzY2FsZXIgYW5kIGNvbXBhcmUgcmVnaXN0ZXJzIHdlcmUgc2ltcGx5CisgKiB0YWtlbiBmcm9tIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqLworI2RlZmluZSBDTE9DS19TT1VSQ0UJVENUTF9DTEtTT1VSQ0VfU1lTQ0xLCisjZGVmaW5lIENMT0NLX1BSRQkyCisjZGVmaW5lIFRJQ0tTX1BFUl9KSUZGWQkweGQ3ZTQKKworI2Vsc2UKKy8qIGRlZmF1bHQgdG8gdXNpbmcgdGhlIDMyS2h6IGNsb2NrICovCisjZGVmaW5lIENMT0NLX1NPVVJDRQlUQ1RMX0NMS1NPVVJDRV8zMktIWgorI2RlZmluZSBDTE9DS19QUkUJMzEKKyNkZWZpbmUgVElDS1NfUEVSX0pJRkZZCTEwCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBtNjgzMjhfdGltZXJfaW5pdChpcnFyZXR1cm5fdCAoKnRpbWVyX3JvdXRpbmUpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpCit7CisJLyogZGlzYWJsZSB0aW1lciAxICovCisJVENUTCA9IDA7CisKKwkvKiBzZXQgSVNSICovCisJaWYgKHJlcXVlc3RfaXJxKFRNUl9JUlFfTlVNLCB0aW1lcl9yb3V0aW5lLCBJUlFfRkxHX0xPQ0ssICJ0aW1lciIsIE5VTEwpKSAKKwkJcGFuaWMoIlVuYWJsZSB0byBhdHRhY2ggdGltZXIgaW50ZXJydXB0XG4iKTsKKworCS8qIFJlc3RhcnQgbW9kZSwgRW5hYmxlIGludCwgU2V0IGNsb2NrIHNvdXJjZSAqLworCVRDVEwgPSBUQ1RMX09NIHwgVENUTF9JUlFFTiB8IENMT0NLX1NPVVJDRTsKKwlUUFJFUiA9IENMT0NLX1BSRTsKKwlUQ01QID0gVElDS1NfUEVSX0pJRkZZOworCisJLyogRW5hYmxlIHRpbWVyIDEgKi8KKwlUQ1RMIHw9IFRDVExfVEVOOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIG02ODMyOF90aW1lcl90aWNrKHZvaWQpCit7CisJLyogUmVzZXQgVGltZXIxICovCisJVFNUQVQgJj0gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Vuc2lnbmVkIGxvbmcgbTY4MzI4X3RpbWVyX2dldHRpbWVvZmZzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpY2tzID0gVENOLCBvZmZzZXQgPSAwOworCisJLyogY2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0ICovCisJaWYgKHRpY2tzIDwgKFRJQ0tTX1BFUl9KSUZGWSA+PiAxKSAmJiAoSVNSICYgKDEgPDwgVE1SX0lSUV9OVU0pKSkKKwkJb2Zmc2V0ID0gMTAwMDAwMCAvIEhaOworCXRpY2tzID0gKHRpY2tzICogMTAwMDAwMCAvIEhaKSAvIFRJQ0tTX1BFUl9KSUZGWTsKKwlyZXR1cm4gdGlja3MgKyBvZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgbTY4MzI4X3RpbWVyX2dldHRvZChpbnQgKnllYXIsIGludCAqbW9uLCBpbnQgKmRheSwgaW50ICpob3VyLCBpbnQgKm1pbiwgaW50ICpzZWMpCit7CisJbG9uZyBub3cgPSBSVENUSU1FOworCisJKnllYXIgPSAqbW9uID0gKmRheSA9IDE7CisJKmhvdXIgPSAobm93ID4+IDI0KSAlIDI0OworCSptaW4gPSAobm93ID4+IDE2KSAlIDYwOworCSpzZWMgPSBub3cgJSA2MDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzYwL2VudHJ5LlMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODM2MC9lbnRyeS5TCmluZGV4IGY3YmM4MGEuLjhmZjQ4YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzYwL2VudHJ5LlMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvZW50cnkuUwpAQCAtOTYsNyArOTYsNyBAQAogCWFuZHcJI0FMTE9XSU5ULCVzcgogCiAJbW92ZWwJJXNwLCVkMQkJCS8qIGdldCB0aHJlYWRfaW5mbyBwb2ludGVyICovCi0JYW5kbAkjMHhmZmZmZTAwMCwlZDEKKwlhbmRsCSMtVEhSRUFEX1NJWkUsJWQxCiAJbW92ZWwJJWQxLCVhMgogCW1vdmUJJWEyQChUSV9GTEFHUyksJWQxCS8qIHRocmVhZF9pbmZvLT5mbGFncyAqLwogCWFuZGwJI19USUZfV09SS19NQVNLLCVkMQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhFWjMyOC9jb25maWcuYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4RVozMjgvY29uZmlnLmMKaW5kZXggYzIxOTcxOS4uZDhkNTZlNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhFWjMyOC9jb25maWcuYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OEVaMzI4L2NvbmZpZy5jCkBAIC0xLDUgKzEsNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogLyoKLSAqICBsaW51eC9hcmNoLyQoQVJDSCkvcGxhdGZvcm0vJChQTEFURk9STSkvY29uZmlnLmMKKyAqICBsaW51eC9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OEVaMzI4L2NvbmZpZy5jCiAgKgogICogIENvcHlyaWdodCAoQykgMTk5MyBIYW1pc2ggTWFjZG9uYWxkCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk5IEQuIEplZmYgRGlvbm5lCkBAIC05LDYgKzExLDggQEAKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0yMCw2OCArMjQsMjIgQEAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vTUM2OEVaMzI4Lmg+CiAjaWZkZWYgQ09ORklHX1VDU0lNTQogI2luY2x1ZGUgPGFzbS9ib290c3RkLmg+CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfUElMT1QKLSNpbmNsdWRlICJQYWxtVi9yb21mcy5oIgotI2VuZGlmCiAKLXZvaWQgQlNQX3NjaGVkX2luaXQodm9pZCAoKnRpbWVyX3JvdXRpbmUpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSkKLXsKLSAgLyogUmVzdGFydCBtb2RlLCBFbmFibGUgaW50LCAzMktIeiwgRW5hYmxlIHRpbWVyICovCi0gIFRDVEwgPSBUQ1RMX09NIHwgVENUTF9JUlFFTiB8IFRDVExfQ0xLU09VUkNFXzMyS0haIHwgVENUTF9URU47Ci0gIC8qIFNldCBwcmVzY2FsZXIgKERpdmlkZSAzMktIeiBieSAzMikqLwotICBUUFJFUiA9IDMxOwotICAvKiBTZXQgY29tcGFyZSByZWdpc3RlciAgMzJLaHogLyAzMiAvIDEwID0gMTAwICovCi0gIFRDTVAgPSAxMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICByZXF1ZXN0X2lycShUTVJfSVJRX05VTSwgdGltZXJfcm91dGluZSwgSVJRX0ZMR19MT0NLLCAidGltZXIiLCBOVUxMKTsKLX0KK3ZvaWQgbTY4MzI4X3RpbWVyX2luaXQoaXJxcmV0dXJuX3QgKCp0aW1lcl9yb3V0aW5lKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKK3ZvaWQgbTY4MzI4X3RpbWVyX3RpY2sodm9pZCk7Cit1bnNpZ25lZCBsb25nIG02ODMyOF90aW1lcl9nZXR0aW1lb2Zmc2V0KHZvaWQpOwordm9pZCBtNjgzMjhfdGltZXJfZ2V0dG9kKGludCAqeWVhciwgaW50ICptb24sIGludCAqZGF5LCBpbnQgKmhvdXIsIGludCAqbWluLCBpbnQgKnNlYyk7CiAKLXZvaWQgQlNQX3RpY2sodm9pZCkKLXsKLSAgCS8qIFJlc2V0IFRpbWVyMSAqLwotCVRTVEFUICY9IDA7Ci19CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bnNpZ25lZCBsb25nIEJTUF9nZXR0aW1lb2Zmc2V0ICh2b2lkKQotewotICByZXR1cm4gMDsKLX0KLQotdm9pZCBCU1BfZ2V0dG9kIChpbnQgKnllYXJwLCBpbnQgKm1vbnAsIGludCAqZGF5cCwKLQkJICAgaW50ICpob3VycCwgaW50ICptaW5wLCBpbnQgKnNlY3ApCi17Ci19Ci0KLWludCBCU1BfaHdjbGsoaW50IG9wLCBzdHJ1Y3QgaHdjbGtfdGltZSAqdCkKLXsKLSAgaWYgKCFvcCkgewotICAgIC8qIHJlYWQgKi8KLSAgfSBlbHNlIHsKLSAgICAvKiB3cml0ZSAqLwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQgQlNQX3NldF9jbG9ja19tbXNzICh1bnNpZ25lZCBsb25nIG5vd3RpbWUpCi17Ci0jaWYgMAotICBzaG9ydCByZWFsX3NlY29uZHMgPSBub3d0aW1lICUgNjAsIHJlYWxfbWludXRlcyA9IChub3d0aW1lIC8gNjApICUgNjA7Ci0KLSAgdG9kLT5zZWNvbmQxID0gcmVhbF9zZWNvbmRzIC8gMTA7Ci0gIHRvZC0+c2Vjb25kMiA9IHJlYWxfc2Vjb25kcyAlIDEwOwotICB0b2QtPm1pbnV0ZTEgPSByZWFsX21pbnV0ZXMgLyAxMDsKLSAgdG9kLT5taW51dGUyID0gcmVhbF9taW51dGVzICUgMTA7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQlNQX3Jlc2V0ICh2b2lkKQordm9pZCBtNjhlejMyOF9yZXNldCh2b2lkKQogewogICBsb2NhbF9pcnFfZGlzYWJsZSgpOwogICBhc20gdm9sYXRpbGUgKCIKQEAgLTkzLDYgKzUxLDggQEAKICAgICAiKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdW5zaWduZWQgY2hhciAqY3M4OTAwYV9od2FkZHI7CiBzdGF0aWMgaW50IGVycm5vOwogCkBAIC0xMTksMTEgKzc5LDEzIEBACiAgIGVsc2UgY29tbWFuZFswXSA9IDA7CiAjZW5kaWYKICAKLSAgbWFjaF9zY2hlZF9pbml0ICAgICAgPSBCU1Bfc2NoZWRfaW5pdDsKLSAgbWFjaF90aWNrICAgICAgICAgICAgPSBCU1BfdGljazsKLSAgbWFjaF9nZXR0aW1lb2Zmc2V0ICAgPSBCU1BfZ2V0dGltZW9mZnNldDsKLSAgbWFjaF9nZXR0b2QgICAgICAgICAgPSBCU1BfZ2V0dG9kOworICBtYWNoX3NjaGVkX2luaXQgICAgICA9IG02ODMyOF90aW1lcl9pbml0OworICBtYWNoX3RpY2sgICAgICAgICAgICA9IG02ODMyOF90aW1lcl90aWNrOworICBtYWNoX2dldHRpbWVvZmZzZXQgICA9IG02ODMyOF90aW1lcl9nZXR0aW1lb2Zmc2V0OworICBtYWNoX2dldHRvZCAgICAgICAgICA9IG02ODMyOF90aW1lcl9nZXR0b2Q7CiAgIG1hY2hfaHdjbGsgICAgICAgICAgID0gTlVMTDsKICAgbWFjaF9zZXRfY2xvY2tfbW1zcyAgPSBOVUxMOwotICBtYWNoX3Jlc2V0ICAgICAgICAgICA9IEJTUF9yZXNldDsKKyAgbWFjaF9yZXNldCAgICAgICAgICAgPSBtNjhlejMyOF9yZXNldDsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4VlozMjgvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OFZaMzI4L2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MjY1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OFZaMzI4L2NvbmZpZy5jCkBAIC0wLDAgKzEsMjEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogIGxpbnV4L2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4VlozMjgvY29uZmlnLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzIEhhbWlzaCBNYWNkb25hbGQKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgRC4gSmVmZiBEaW9ubmUKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgR2VvcmdlcyBNZW5pZSwgS2VuIERlc21ldAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL01DNjhWWjMyOC5oPgorI2luY2x1ZGUgPGFzbS9ib290c3RkLmg+CisKKyNpZmRlZiBDT05GSUdfSU5JVF9MQ0QKKyNpbmNsdWRlICJib290bG9nby5oIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgbTY4MzI4X3RpbWVyX2luaXQoaXJxcmV0dXJuX3QgKCp0aW1lcl9yb3V0aW5lKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKK3ZvaWQgbTY4MzI4X3RpbWVyX3RpY2sodm9pZCk7Cit1bnNpZ25lZCBsb25nIG02ODMyOF90aW1lcl9nZXR0aW1lb2Zmc2V0KHZvaWQpOwordm9pZCBtNjgzMjhfdGltZXJfZ2V0dG9kKGludCAqeWVhciwgaW50ICptb24sIGludCAqZGF5LCBpbnQgKmhvdXIsIGludCAqbWluLCBpbnQgKnNlYyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIEluaXQgRHJhbmdvbiBFbmdpbmUgaGFyZHdhcmUgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKENPTkZJR19EUkFHRU4yKQorCitzdGF0aWMgdm9pZCBtNjh2ejMyOF9yZXNldCh2b2lkKQoreworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKyNpZmRlZiBDT05GSUdfSU5JVF9MQ0QKKwlQQkRBVEEgfD0gMHgyMDsJCQkJLyogZGlzYWJsZSBDQ0ZMIGxpZ2h0ICovCisJUEtEQVRBIHw9IDB4NDsJCQkJLyogZGlzYWJsZSBMQ0QgY29udHJvbGxlciAqLworCUxDS0NPTiA9IDA7CisjZW5kaWYKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkicmVzZXRcblx0IgorCQkibW92ZWFsICMweDA0MDAwMDAwLCAlYTBcblx0IgorCQkibW92ZWFsIDAoJWEwKSwgJXNwXG5cdCIKKwkJIm1vdmVhbCA0KCVhMCksICVhMFxuXHQiCisJCSJqbXAgKCVhMCkiCisJKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9oYXJkd2FyZShjaGFyICpjb21tYW5kLCBpbnQgc2l6ZSkKK3sKKyNpZmRlZiBDT05GSUdfRElSRUNUX0lPX0FDQ0VTUworCVNDUiA9IDB4MTA7CQkJCQkvKiBhbGxvdyB1c2VyIGFjY2VzcyB0byBpbnRlcm5hbCByZWdpc3RlcnMgKi8KKyNlbmRpZgorCisJLyogQ1NHQiBJbml0ICovCisJQ1NHQkIgPSAweDQwMDA7CisJQ1NCID0gMHgxYTE7CisKKwkvKiBDUzg5MDAgaW5pdCAqLworCS8qIFBLMzogaGFyZHdhcmUgc2xlZXAgZnVuY3Rpb24gcGluLCBhY3RpdmUgbG93ICovCisJUEtTRUwgfD0gUEsoMyk7CQkJCS8qIHNlbGVjdCBwaW4gYXMgSS9PICovCisJUEtESVIgfD0gUEsoMyk7CQkJCS8qIHNlbGVjdCBwaW4gYXMgb3V0cHV0ICovCisJUEtEQVRBIHw9IFBLKDMpOwkJCS8qIHNldCBwaW4gaGlnaCAqLworCisJLyogUEY1OiBoYXJkd2FyZSByZXNldCBmdW5jdGlvbiBwaW4sIGFjdGl2ZSBoaWdoICovCisJUEZTRUwgfD0gUEYoNSk7CQkJCS8qIHNlbGVjdCBwaW4gYXMgSS9PICovCisJUEZESVIgfD0gUEYoNSk7CQkJCS8qIHNlbGVjdCBwaW4gYXMgb3V0cHV0ICovCisJUEZEQVRBICY9IH5QRig1KTsJCQkvKiBzZXQgcGluIGxvdyAqLworCisJLyogY3M4OTAwIGhhcmR3YXJlIHJlc2V0ICovCisJUEZEQVRBIHw9IFBGKDUpOworCXsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAzMjAwMDsgKytpKTsgfQorCVBGREFUQSAmPSB+UEYoNSk7CisKKwkvKiBJTlQxIGVuYWJsZSAoY3M4OTAwIElSUSkgKi8KKwlQRFBPTCAmPSB+UEQoMSk7CQkJLyogYWN0aXZlIGhpZ2ggc2lnbmFsICovCisJUERJUUVHICY9IH5QRCgxKTsKKwlQRElSUUVOIHw9IFBEKDEpOwkJCS8qIElSUSBlbmFibGVkICovCisKKyNpZmRlZiBDT05GSUdfNjgzMjhfU0VSSUFMX1VBUlQyCisJLyogRW5hYmxlIFJYRCBUWEQgcG9ydCBiaXRzIHRvIGVuYWJsZSBVQVJUMiAqLworCVBKU0VMICY9IH4oUEooNSkgfCBQSig0KSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JTklUX0xDRAorCS8qIGluaXRpYWxpemUgTENEIGNvbnRyb2xsZXIgKi8KKwlMU1NBID0gKGxvbmcpIHNjcmVlbl9iaXRzOworCUxWUFcgPSAweDE0OworCUxYTUFYID0gMHgxNDA7CisJTFlNQVggPSAweGVmOworCUxSUkEgPSAwOworCUxQWENEID0gMzsKKwlMUElDRiA9IDB4MDg7CisJTFBPTENGID0gMDsKKwlMQ0tDT04gPSAweDgwOworCVBDUERFTiA9IDB4ZmY7CisJUENTRUwgPSAwOworCisJLyogRW5hYmxlIExDRCBjb250cm9sbGVyICovCisJUEtESVIgfD0gMHg0OworCVBLU0VMIHw9IDB4NDsKKwlQS0RBVEEgJj0gfjB4NDsKKworCS8qIEVuYWJsZSBDQ0ZMIGJhY2tsaWdodGluZyBjaXJjdWl0ICovCisJUEJESVIgfD0gMHgyMDsKKwlQQlNFTCB8PSAweDIwOworCVBCREFUQSAmPSB+MHgyMDsKKworCS8qIGNvbnRyYXN0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlQRkRJUiB8PSAweDE7CisJUEZTRUwgJj0gfjB4MTsKKwlQV01SID0gMHgwMzdGOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICBJbml0IFJULUNvbnRyb2wgdUNkaW1tIGhhcmR3YXJlICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbGlmIGRlZmluZWQoQ09ORklHX1VDRElNTSkKKworc3RhdGljIHZvaWQgbTY4dnozMjhfcmVzZXQodm9pZCkKK3sKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWFzbSB2b2xhdGlsZSAoIgorCQltb3ZlYWwgIzB4MTBjMDAwMDAsICVhMDsKKwkJbW92ZWIgIzAsIDB4RkZGRkYzMDA7CisJCW1vdmVhbCAwKCVhMCksICVzcDsKKwkJbW92ZWFsIDQoJWEwKSwgJWEwOworCQlqbXAgKCVhMCk7CisJIik7Cit9CisKK3Vuc2lnbmVkIGNoYXIgKmNzODkwMGFfaHdhZGRyOworc3RhdGljIGludCBlcnJubzsKKworX2JzYzAoY2hhciAqLCBnZXRzZXJpYWxudW0pCitfYnNjMSh1bnNpZ25lZCBjaGFyICosIGdldGh3YWRkciwgaW50LCBhKQorX2JzYzEoY2hhciAqLCBnZXRiZW52LCBjaGFyICosIGEpCisKK3N0YXRpYyB2b2lkIGluaXRfaGFyZHdhcmUoY2hhciAqY29tbWFuZCwgaW50IHNpemUpCit7CisJY2hhciAqcDsKKworCXByaW50ayhLRVJOX0lORk8gInVDZGltbSBzZXJpYWwgc3RyaW5nIFslc11cbiIsIGdldHNlcmlhbG51bSgpKTsKKwlwID0gY3M4OTAwYV9od2FkZHIgPSBnZXRod2FkZHIoMCk7CisJcHJpbnRrKEtFUk5fSU5GTyAidUNkaW1tIGh3YWRkciAlLjJ4OiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeFxuIiwKKwkJcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSk7CisJcCA9IGdldGJlbnYoIkFQUEVORCIpOworCWlmIChwKQorCQlzdHJjcHkocCwgY29tbWFuZCk7CisJZWxzZQorCQljb21tYW5kWzBdID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbHNlCisKK3N0YXRpYyB2b2lkIG02OHZ6MzI4X3Jlc2V0KHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfaGFyZHdhcmUoY2hhciAqY29tbWFuZCwgaW50IHNpemUpCit7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29uZmlnX0JTUChjaGFyICpjb21tYW5kLCBpbnQgc2l6ZSkKK3sKKwlwcmludGsoS0VSTl9JTkZPICI2OFZaMzI4IERyYWdvbkJhbGxWWiBzdXBwb3J0IChjKSAyMDAxIExpbmVvLCBJbmMuXG4iKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQQVJBTSkKKwlzdHJuY3B5KGNvbW1hbmQsIENPTkZJR19CT09UUEFSQU1fU1RSSU5HLCBzaXplKTsKKwljb21tYW5kW3NpemUtMV0gPSAwOworI2Vsc2UKKwltZW1zZXQoY29tbWFuZCwgMCwgc2l6ZSk7CisjZW5kaWYKKworCWluaXRfaGFyZHdhcmUoY29tbWFuZCwgc2l6ZSk7CisKKwltYWNoX3NjaGVkX2luaXQgPSAodm9pZCAqKSBtNjgzMjhfdGltZXJfaW5pdDsKKwltYWNoX3RpY2sgPSBtNjgzMjhfdGltZXJfdGljazsKKwltYWNoX2dldHRpbWVvZmZzZXQgPSBtNjgzMjhfdGltZXJfZ2V0dGltZW9mZnNldDsKKwltYWNoX2dldHRvZCA9IG02ODMyOF90aW1lcl9nZXR0b2Q7CisJbWFjaF9yZXNldCA9IG02OHZ6MzI4X3Jlc2V0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhWWjMyOC9kZTIvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OFZaMzI4L2RlMi9jb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1ODYxOS4uMDAwMDAwMAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OFZaMzI4L2RlMi9jb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvbTY4a25vbW11L3BsYXRmb3JtL01DNjhWWjMyOC9kZTIvY29uZmlnLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTkzIEhhbWlzaCBNYWNkb25hbGQKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTkgRC4gSmVmZiBEaW9ubmUKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEgR2VvcmdlcyBNZW5pZSwgS2VuIERlc21ldAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL01DNjhWWjMyOC5oPgotCi0jaWZkZWYgQ09ORklHX0lOSVRfTENECi0jaW5jbHVkZSAic2NyZWVuLmgiCi0jZW5kaWYKLQotLyogd2l0aCBhIDMzLjE2IE1IeiBjbG9jaywgdGhpcyB3aWxsIGdpdmUgdXNlYyByZXNvbHV0aW9uIHRvIHRoZSB0aW1lIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBDTE9DS19TT1VSQ0UgVENUTF9DTEtTT1VSQ0VfU1lTQ0xLCi0jZGVmaW5lIENMT0NLX1BSRSA3Ci0jZGVmaW5lIFRJQ0tTX1BFUl9KSUZGWSA0MTQ1MAotCi1zdGF0aWMgdm9pZAotZHJhZ2VuMl9zY2hlZF9pbml0KGlycXJldHVybl90ICgqdGltZXJfcm91dGluZSkgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSkKLXsKLQkvKiBkaXNhYmxlIHRpbWVyIDEgKi8KLQlUQ1RMID0gMDsKLQotCS8qIHNldCBJU1IgKi8KLQlpZiAocmVxdWVzdF9pcnEoVE1SX0lSUV9OVU0sIHRpbWVyX3JvdXRpbmUsIElSUV9GTEdfTE9DSywgInRpbWVyIiwgTlVMTCkpIAotCQlwYW5pYygiVW5hYmxlIHRvIGF0dGFjaCB0aW1lciBpbnRlcnJ1cHRcbiIpOwotCi0JLyogUmVzdGFydCBtb2RlLCBFbmFibGUgaW50LCBTZXQgY2xvY2sgc291cmNlICovCi0JVENUTCA9IFRDVExfT00gfCBUQ1RMX0lSUUVOIHwgQ0xPQ0tfU09VUkNFOwotCVRQUkVSID0gQ0xPQ0tfUFJFOwotCVRDTVAgPSBUSUNLU19QRVJfSklGRlk7Ci0KLQkvKiBFbmFibGUgdGltZXIgMSAqLwotCVRDVEwgfD0gVENUTF9URU47Ci19Ci0KLXN0YXRpYyB2b2lkIGRyYWdlbjJfdGljayh2b2lkKQotewotCS8qIFJlc2V0IFRpbWVyMSAqLwotCVRTVEFUICY9IDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRyYWdlbjJfZ2V0dGltZW9mZnNldCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdGlja3MgPSBUQ04sIG9mZnNldCA9IDA7Ci0KLQkvKiBjaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHQgKi8KLQlpZiAodGlja3MgPCAoVElDS1NfUEVSX0pJRkZZID4+IDEpICYmIChJU1IgJiAoMSA8PCBUTVJfSVJRX05VTSkpKQotCQlvZmZzZXQgPSAxMDAwMDAwIC8gSFo7Ci0KLQl0aWNrcyA9ICh0aWNrcyAqIDEwMDAwMDAgLyBIWikgLyBUSUNLU19QRVJfSklGRlk7Ci0KLQlyZXR1cm4gdGlja3MgKyBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGRyYWdlbjJfZ2V0dG9kKGludCAqeWVhciwgaW50ICptb24sIGludCAqZGF5LCBpbnQgKmhvdXIsCi0JCQkJCQkgICBpbnQgKm1pbiwgaW50ICpzZWMpCi17Ci0JbG9uZyBub3cgPSBSVENUSU1FOwotCi0JKnllYXIgPSAqbW9uID0gKmRheSA9IDE7Ci0JKmhvdXIgPSAobm93ID4+IDI0KSAlIDI0OwotCSptaW4gPSAobm93ID4+IDE2KSAlIDYwOwotCSpzZWMgPSBub3cgJSA2MDsKLX0KLQotc3RhdGljIHZvaWQgZHJhZ2VuMl9yZXNldCh2b2lkKQotewotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0KLSNpZmRlZiBDT05GSUdfSU5JVF9MQ0QKLQlQQkRBVEEgfD0gMHgyMDsJCQkJLyogZGlzYWJsZSBDQ0ZMIGxpZ2h0ICovCi0JUEtEQVRBIHw9IDB4NDsJCQkJLyogZGlzYWJsZSBMQ0QgY29udHJvbGxlciAqLwotCUxDS0NPTiA9IDA7Ci0jZW5kaWYKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkicmVzZXRcblx0IgotCQkibW92ZWFsICMweDA0MDAwMDAwLCAlYTBcblx0IgotCQkibW92ZWFsIDAoJWEwKSwgJXNwXG5cdCIKLQkJIm1vdmVhbCA0KCVhMCksICVhMFxuXHQiCi0JCSJqbXAgKCVhMCkiCi0JKTsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9oYXJkd2FyZSh2b2lkKQotewotI2lmZGVmIENPTkZJR19ESVJFQ1RfSU9fQUNDRVNTCi0JU0NSID0gMHgxMDsJCQkJCS8qIGFsbG93IHVzZXIgYWNjZXNzIHRvIGludGVybmFsIHJlZ2lzdGVycyAqLwotI2VuZGlmCi0KLQkvKiBDU0dCIEluaXQgKi8KLQlDU0dCQiA9IDB4NDAwMDsKLQlDU0IgPSAweDFhMTsKLQotCS8qIENTODkwMCBpbml0ICovCi0JLyogUEszOiBoYXJkd2FyZSBzbGVlcCBmdW5jdGlvbiBwaW4sIGFjdGl2ZSBsb3cgKi8KLQlQS1NFTCB8PSBQSygzKTsJCQkJLyogc2VsZWN0IHBpbiBhcyBJL08gKi8KLQlQS0RJUiB8PSBQSygzKTsJCQkJLyogc2VsZWN0IHBpbiBhcyBvdXRwdXQgKi8KLQlQS0RBVEEgfD0gUEsoMyk7CQkJLyogc2V0IHBpbiBoaWdoICovCi0KLQkvKiBQRjU6IGhhcmR3YXJlIHJlc2V0IGZ1bmN0aW9uIHBpbiwgYWN0aXZlIGhpZ2ggKi8KLQlQRlNFTCB8PSBQRig1KTsJCQkJLyogc2VsZWN0IHBpbiBhcyBJL08gKi8KLQlQRkRJUiB8PSBQRig1KTsJCQkJLyogc2VsZWN0IHBpbiBhcyBvdXRwdXQgKi8KLQlQRkRBVEEgJj0gflBGKDUpOwkJCS8qIHNldCBwaW4gbG93ICovCi0KLQkvKiBjczg5MDAgaGFyZHdhcmUgcmVzZXQgKi8KLQlQRkRBVEEgfD0gUEYoNSk7Ci0JeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDMyMDAwOyArK2kpOyB9Ci0JUEZEQVRBICY9IH5QRig1KTsKLQotCS8qIElOVDEgZW5hYmxlIChjczg5MDAgSVJRKSAqLwotCVBEUE9MICY9IH5QRCgxKTsJCQkvKiBhY3RpdmUgaGlnaCBzaWduYWwgKi8KLQlQRElRRUcgJj0gflBEKDEpOwotCVBESVJRRU4gfD0gUEQoMSk7CQkJLyogSVJRIGVuYWJsZWQgKi8KLQotI2lmZGVmIENPTkZJR182ODMyOF9TRVJJQUxfVUFSVDIKLQkvKiBFbmFibGUgUlhEIFRYRCBwb3J0IGJpdHMgdG8gZW5hYmxlIFVBUlQyICovCi0JUEpTRUwgJj0gfihQSig1KSB8IFBKKDQpKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0lOSVRfTENECi0JLyogaW5pdGlhbGl6ZSBMQ0QgY29udHJvbGxlciAqLwotCUxTU0EgPSAobG9uZykgc2NyZWVuX2JpdHM7Ci0JTFZQVyA9IDB4MTQ7Ci0JTFhNQVggPSAweDE0MDsKLQlMWU1BWCA9IDB4ZWY7Ci0JTFJSQSA9IDA7Ci0JTFBYQ0QgPSAzOwotCUxQSUNGID0gMHgwODsKLQlMUE9MQ0YgPSAwOwotCUxDS0NPTiA9IDB4ODA7Ci0JUENQREVOID0gMHhmZjsKLQlQQ1NFTCA9IDA7Ci0KLQkvKiBFbmFibGUgTENEIGNvbnRyb2xsZXIgKi8KLQlQS0RJUiB8PSAweDQ7Ci0JUEtTRUwgfD0gMHg0OwotCVBLREFUQSAmPSB+MHg0OwotCi0JLyogRW5hYmxlIENDRkwgYmFja2xpZ2h0aW5nIGNpcmN1aXQgKi8KLQlQQkRJUiB8PSAweDIwOwotCVBCU0VMIHw9IDB4MjA7Ci0JUEJEQVRBICY9IH4weDIwOwotCi0JLyogY29udHJhc3QgY29udHJvbCByZWdpc3RlciAqLwotCVBGRElSIHw9IDB4MTsKLQlQRlNFTCAmPSB+MHgxOwotCVBXTVIgPSAweDAzN0Y7Ci0jZW5kaWYKLX0KLQotdm9pZCBjb25maWdfQlNQKGNoYXIgKmNvbW1hbmQsIGludCBzaXplKQotewotCXByaW50ayhLRVJOX0lORk8gIjY4VlozMjggRHJhZ29uQmFsbFZaIHN1cHBvcnQgKGMpIDIwMDEgTGluZW8sIEluYy5cbiIpOwotCi0jaWYgZGVmaW5lZChDT05GSUdfQk9PVFBBUkFNKQotCXN0cm5jcHkoY29tbWFuZCwgQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcsIHNpemUpOwotCWNvbW1hbmRbc2l6ZS0xXSA9IDA7Ci0jZWxzZQotCW1lbXNldChjb21tYW5kLCAwLCBzaXplKTsKLSNlbmRpZgotCi0JaW5pdF9oYXJkd2FyZSgpOwotCi0JbWFjaF9zY2hlZF9pbml0ID0gKHZvaWQgKilkcmFnZW4yX3NjaGVkX2luaXQ7Ci0JbWFjaF90aWNrID0gZHJhZ2VuMl90aWNrOwotCW1hY2hfZ2V0dGltZW9mZnNldCA9IGRyYWdlbjJfZ2V0dGltZW9mZnNldDsKLQltYWNoX3Jlc2V0ID0gZHJhZ2VuMl9yZXNldDsKLQltYWNoX2dldHRvZCA9IGRyYWdlbjJfZ2V0dG9kOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhWWjMyOC91Y2RpbW0vY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OFZaMzI4L3VjZGltbS9jb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlYWRhZi4uMDAwMDAwMAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OFZaMzI4L3VjZGltbS9jb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4VlozMjgvdWNkaW1tL2NvbmZpZy5jCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5MyBIYW1pc2ggTWFjZG9uYWxkCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk5IEQuIEplZmYgRGlvbm5lCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL01DNjhWWjMyOC5oPgotI2luY2x1ZGUgPGFzbS9ib290c3RkLmg+Ci0KLXZvaWQgQlNQX3NjaGVkX2luaXQodm9pZCAoKnRpbWVyX3JvdXRpbmUpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSkKLXsKLQkvKiBSZXN0YXJ0IG1vZGUsIEVuYWJsZSBpbnQsIDMyS0h6LCBFbmFibGUgdGltZXIgKi8KLQlUQ1RMID0gVENUTF9PTSB8IFRDVExfSVJRRU4gfCBUQ1RMX0NMS1NPVVJDRV8zMktIWiB8IFRDVExfVEVOOwotCS8qIFNldCBwcmVzY2FsZXIgKERpdmlkZSAzMktIeiBieSAzMikqLwotCVRQUkVSID0gMzE7Ci0JLyogU2V0IGNvbXBhcmUgcmVnaXN0ZXIgIDMyS2h6IC8gMzIgLyAxMCA9IDEwMCAqLwotCVRDTVAgPSAxMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JcmVxdWVzdF9pcnEoVE1SX0lSUV9OVU0sIHRpbWVyX3JvdXRpbmUsIElSUV9GTEdfTE9DSywgInRpbWVyIiwgTlVMTCk7Ci19Ci0KLXZvaWQgQlNQX3RpY2sodm9pZCkKLXsKLSAgCS8qIFJlc2V0IFRpbWVyMSAqLwotCVRTVEFUICY9IDA7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgQlNQX2dldHRpbWVvZmZzZXQgKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQlNQX2dldHRvZCAoaW50ICp5ZWFycCwgaW50ICptb25wLCBpbnQgKmRheXAsCi0JCSAgIGludCAqaG91cnAsIGludCAqbWlucCwgaW50ICpzZWNwKQotewotfQotCi1pbnQgQlNQX2h3Y2xrKGludCBvcCwgc3RydWN0IGh3Y2xrX3RpbWUgKnQpCi17Ci0JaWYgKCFvcCkgewotCQkvKiByZWFkICovCi0JfSBlbHNlIHsKLQkJLyogd3JpdGUgKi8KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBCU1Bfc2V0X2Nsb2NrX21tc3MgKHVuc2lnbmVkIGxvbmcgbm93dGltZSkKLXsKLSNpZiAwCi0Jc2hvcnQgcmVhbF9zZWNvbmRzID0gbm93dGltZSAlIDYwLCByZWFsX21pbnV0ZXMgPSAobm93dGltZSAvIDYwKSAlIDYwOwotCi0JdG9kLT5zZWNvbmQxID0gcmVhbF9zZWNvbmRzIC8gMTA7Ci0JdG9kLT5zZWNvbmQyID0gcmVhbF9zZWNvbmRzICUgMTA7Ci0JdG9kLT5taW51dGUxID0gcmVhbF9taW51dGVzIC8gMTA7Ci0JdG9kLT5taW51dGUyID0gcmVhbF9taW51dGVzICUgMTA7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBCU1BfcmVzZXQgKHZvaWQpCi17Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlhc20gdm9sYXRpbGUgKCIKLQkJbW92ZWFsICMweDEwYzAwMDAwLCAlYTA7Ci0JCW1vdmViICMwLCAweEZGRkZGMzAwOwotCQltb3ZlYWwgMCglYTApLCAlc3A7Ci0JCW1vdmVhbCA0KCVhMCksICVhMDsKLQkJam1wICglYTApOwotCSIpOwotfQotCi11bnNpZ25lZCBjaGFyICpjczg5MDBhX2h3YWRkcjsKLXN0YXRpYyBpbnQgZXJybm87Ci0KLV9ic2MwKGNoYXIgKiwgZ2V0c2VyaWFsbnVtKQotX2JzYzEodW5zaWduZWQgY2hhciAqLCBnZXRod2FkZHIsIGludCwgYSkKLV9ic2MxKGNoYXIgKiwgZ2V0YmVudiwgY2hhciAqLCBhKQotCi12b2lkIGNvbmZpZ19CU1AoY2hhciAqY29tbWFuZCwgaW50IGxlbikKLXsKLQl1bnNpZ25lZCBjaGFyICpwOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiXG42OFZaMzI4IERyYWdvbkJhbGxWWiBzdXBwb3J0IChjKSAyMDAxIExpbmVvLCBJbmMuXG4iKTsKLQotCXByaW50ayhLRVJOX0lORk8gInVDZGltbSBzZXJpYWwgc3RyaW5nIFslc11cbiIsZ2V0c2VyaWFsbnVtKCkpOwotCXAgPSBjczg5MDBhX2h3YWRkciA9IGdldGh3YWRkcigwKTsKLQlwcmludGsoS0VSTl9JTkZPICJ1Q2RpbW0gaHdhZGRyICUuMng6JS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4XG4iLAotCQlwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdKTsKLQlwID0gZ2V0YmVudigiQVBQRU5EIik7Ci0JaWYgKHApIHN0cmNweShwLGNvbW1hbmQpOwotCWVsc2UgY29tbWFuZFswXSA9IDA7Ci0gCi0JbWFjaF9zY2hlZF9pbml0ICAgICAgPSBCU1Bfc2NoZWRfaW5pdDsKLQltYWNoX3RpY2sgICAgICAgICAgICA9IEJTUF90aWNrOwotCW1hY2hfZ2V0dGltZW9mZnNldCAgID0gQlNQX2dldHRpbWVvZmZzZXQ7Ci0JbWFjaF9nZXR0b2QgICAgICAgICAgPSBCU1BfZ2V0dG9kOwotCW1hY2hfcmVzZXQgICAgICAgICAgID0gQlNQX3Jlc2V0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCA4OThkZTJkLi4wZWI3MWFjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtNCwyNyArNCw1MiBAQAogCSMgSG9ycmlibGUgc291cmNlIG9mIGNvbmZ1c2lvbi4gIERpZSwgZGllLCBkaWUgLi4uCiAJc2VsZWN0IEVNQkVEREVECiAKLWNvbmZpZyBNSVBTNjQKLQlib29sICI2NC1iaXQga2VybmVsIgotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBidWlsZCBhIDY0LWJpdCBrZXJuZWwuICBZb3Ugc2hvdWxkCi0JICBvbmx5IHNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBoYXJkd2FyZSB0aGF0IGFjdHVhbGx5IGhhcyBhCi0JICA2NC1iaXQgcHJvY2Vzc29yIGFuZCBpZiB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgYWN0dWFsbHkgYmVuZWZpdCBmcm9tCi0JICA2NC1iaXQgcHJvY2Vzc2luZywgb3RoZXJ3aXNlIHNheSBOLiAgWW91IG11c3Qgc2F5IFkgZm9yIGtlcm5lbHMgZm9yCi0JICBTR0kgSVAyNyAoT3JpZ2luIDIwMCBhbmQgMjAwMCkgYW5kIFNHSSBJUDMyIChPMikuICBJZiBpbiBkb3VidCBzYXkgTi4KLQotY29uZmlnIDY0QklUCi0JZGVmX2Jvb2wgTUlQUzY0Ci0KLWNvbmZpZyBNSVBTMzIKKyMgc2hvdWxkbid0IGl0IGJlIHBlci1zdWJhcmNoaXRlY3R1cmU/Citjb25maWcgQVJDSF9NQVlfSEFWRV9QQ19GREMKIAlib29sCi0JZGVwZW5kcyBvbiBNSVBTNjQgPSAnbicKIAlkZWZhdWx0IHkKIAogbWFpbm1lbnUgIkxpbnV4L01JUFMgS2VybmVsIENvbmZpZ3VyYXRpb24iCiAKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCitjb25maWcgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCWJvb2wKK2NvbmZpZyBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCisJYm9vbAorY29uZmlnIENQVV9TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlib29sCitjb25maWcgQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTAorCWJvb2wKKworbWVudSAiS2VybmVsIHR5cGUiCisKK2Nob2ljZQorCisJcHJvbXB0ICJLZXJuZWwgY29kZSBtb2RlbCIKKwloZWxwCisJICBZb3Ugc2hvdWxkIG9ubHkgc2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgd29ya2xvYWQgdGhhdAorCSAgYWN0dWFsbHkgYmVuZWZpdHMgZnJvbSA2NC1iaXQgcHJvY2Vzc2luZyBvciBpZiB5b3VyIG1hY2hpbmUgaGFzCisJICBsYXJnZSBtZW1vcnkuICBZb3Ugd2lsbCBvbmx5IGJlIHByZXNlbnRlZCBhIHNpbmdsZSBvcHRpb24gaW4gdGhpcworCSAgbWVudSBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGJvdGggMzItYml0IGFuZCA2NC1iaXQga2VybmVscy4KKworY29uZmlnIDMyQklUCisJYm9vbCAiMzItYml0IGtlcm5lbCIKKwlkZXBlbmRzIG9uIENQVV9TVVBQT1JUU18zMkJJVF9LRVJORUwgJiYgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBUUkFEX1NJR05BTFMKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gYnVpbGQgYSAzMi1iaXQga2VybmVsLgorCitjb25maWcgNjRCSVQKKwlib29sICI2NC1iaXQga2VybmVsIgorCWRlcGVuZHMgb24gQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTCAmJiBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgNjQtYml0IGtlcm5lbC4KKworZW5kY2hvaWNlCisKK2VuZG1lbnUKKwogbWVudSAiTWFjaGluZSBzZWxlY3Rpb24iCiAKIGNvbmZpZyBNQUNIX0pBWloKQEAgLTM0LDYgKzU5LDggQEAKIAlzZWxlY3QgR0VORVJJQ19JU0FfRE1BCiAJc2VsZWN0IEk4MjU5CiAJc2VsZWN0IElTQQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwgaWYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSBUaGlzIGEgZmFtaWx5IG9mIG1hY2hpbmVzIGJhc2VkIG9uIHRoZSBNSVBTIFI0MDMwIGNoaXBzZXQgd2hpY2ggd2FzCiAJIHVzZWQgYnkgc2V2ZXJhbCB2ZW5kb3JzIHRvIGJ1aWxkIFJJU0Mvb3MgYW5kIFdpbmRvd3MgTlQgd29ya3N0YXRpb25zLgpAQCAtNzEsNyArOTgsOSBAQAogCSAgPGh0dHA6Ly93d3cubGludXgtbWlwcy5vcmcvPi4KIAogY29uZmlnIE1BQ0hfVlI0MVhYCi0JYm9vbCAiU3VwcG9ydCBmb3IgTkVDIFZSNDFYWC1iYXNlZCBtYWNoaW5lcyIKKwlib29sICJTdXBwb3J0IGZvciBORUMgVlI0MTAwIHNlcmllcyBiYXNlZCBtYWNoaW5lcyIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMIGlmIEVYUEVSSU1FTlRBTAogCiBjb25maWcgTkVDX0NNQlZSNDEzMwogCWJvb2wgIlN1cHBvcnQgZm9yIE5FQyBDTUItVlI0MTMzIgpAQCAtODAsNyArMTA5LDYgQEAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IElSUV9DUFUKIAlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBQQ0lfVlI0MVhYCiAKIGNvbmZpZyBST0NLSE9QUEVSCiAJYm9vbCAiU3VwcG9ydCBmb3IgUm9ja2hvcHBlciBiYXNlYm9hcmQiCkBAIC05MSw2ICsxMTksNyBAQAogY29uZmlnIENBU0lPX0U1NQogCWJvb2wgIlN1cHBvcnQgZm9yIENBU0lPIENBU1NJT1BFSUEgRS0xMC8xNS81NS82NSIKIAlkZXBlbmRzIG9uIE1BQ0hfVlI0MVhYCisJc2VsZWN0IENQVV9MSVRUTEVfRU5ESUFOCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBJUlFfQ1BVCiAJc2VsZWN0IElTQQpAQCAtOTgsNTMgKzEyNyw2MSBAQAogY29uZmlnIElCTV9XT1JLUEFECiAJYm9vbCAiU3VwcG9ydCBmb3IgSUJNIFdvcmtQYWQgejUwIgogCWRlcGVuZHMgb24gTUFDSF9WUjQxWFgKKwlzZWxlY3QgQ1BVX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IElSUV9DUFUKIAlzZWxlY3QgSVNBCiAKLWNvbmZpZyBUQU5CQUNfVEIwMjI2Ci0JYm9vbCAiU3VwcG9ydCBmb3IgVEFOQkFDIFRCMDIyNiAoTWJhc2UpIgorY29uZmlnIFRBTkJBQ19UQjAyMlgKKwlib29sICJTdXBwb3J0IGZvciBUQU5CQUMgVlI0MTMxIG11bHRpY2hpcCBtb2R1bGUgYW5kIFRBTkJBQyBWUjQxMzFESU1NIgogCWRlcGVuZHMgb24gTUFDSF9WUjQxWFgKKwlzZWxlY3QgQ1BVX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgSVJRX0NQVQorCXNlbGVjdCBIV19IQVNfUENJCiAJaGVscAotCSAgVGhlIFRBTkJBQyBUQjAyMjYgKE1iYXNlKSBpcyBhIE1JUFMtYmFzZWQgcGxhdGZvcm0gbWFudWZhY3R1cmVkIGJ5IFRBTkJBQy4KKwkgIFRoZSBUQU5CQUMgVlI0MTMxIG11bHRpY2hpcCBtb2R1bGUoVEIwMjI1KSBhbmQKKwkgIHRoZSBUQU5CQUMgVlI0MTMxRElNTShUQjAyMjkpIGFyZSBNSVBTLWJhc2VkIHBsYXRmb3JtcworCSAgbWFudWZhY3R1cmVkIGJ5IFRBTkJBQy4KKwkgIFBsZWFzZSByZWZlciB0byA8aHR0cDovL3d3dy50YW5iYWMuY28uanAvPgorCSAgYWJvdXQgVlI0MTMxIG11bHRpY2hpcCBtb2R1bGUgYW5kIFZSNDEzMURJTU0uCisKK2NvbmZpZyBUQU5CQUNfVEIwMjI2CisJYm9vbCAiU3VwcG9ydCBmb3IgVEFOQkFDIE1iYXNlKFRCMDIyNikiCisJZGVwZW5kcyBvbiBUQU5CQUNfVEIwMjJYCisJc2VsZWN0IEdQSU9fVlI0MVhYCisJaGVscAorCSAgVGhlIFRBTkJBQyBNYmFzZShUQjAyMjYpIGlzIGEgTUlQUy1iYXNlZCBwbGF0Zm9ybSBtYW51ZmFjdHVyZWQgYnkgVEFOQkFDLgogCSAgUGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vd3d3LnRhbmJhYy5jby5qcC8+IGFib3V0IE1iYXNlLgogCi1jb25maWcgVEFOQkFDX1RCMDIyOQotCWJvb2wgIlN1cHBvcnQgZm9yIFRBTkJBQyBUQjAyMjkgKFZSNDEzMURJTU0pIgotCWRlcGVuZHMgb24gTUFDSF9WUjQxWFgKLQlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IEhXX0hBU19QQ0kKLQlzZWxlY3QgSVJRX0NQVQorY29uZmlnIFRBTkJBQ19UQjAyODcKKwlib29sICJTdXBwb3J0IGZvciBUQU5CQUMgTWluaS1JVFggRElNTSBiYXNlKFRCMDI4NykiCisJZGVwZW5kcyBvbiBUQU5CQUNfVEIwMjJYCiAJaGVscAotCSAgVGhlIFRBTkJBQyBUQjAyMjkgKFZSNDEzMURJTU0pIGlzIGEgTUlQUy1iYXNlZCBwbGF0Zm9ybSBtYW51ZmFjdHVyZWQgYnkgVEFOQkFDLgotCSAgUGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vd3d3LnRhbmJhYy5jby5qcC8+IGFib3V0IFZSNDEzMURJTU0uCisJICBUaGUgVEFOQkFDIE1pbmktSVRYIERJTU0gYmFzZShUQjAyODcpIGlzIGEgTUlQUy1iYXNlZCBwbGF0Zm9ybSBtYW51ZmFjdHVyZWQgYnkgVEFOQkFDLgorCSAgUGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vd3d3LnRhbmJhYy5jby5qcC8+IGFib3V0IE1pbmktSVRYIERJTU0gYmFzZS4KIAogY29uZmlnIFZJQ1RPUl9NUEMzMFgKIAlib29sICJTdXBwb3J0IGZvciBWaWN0b3IgTVAtQzMwMy8zMDQiCi0Jc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBIV19IQVNfUENJCi0Jc2VsZWN0IElSUV9DUFUKIAlkZXBlbmRzIG9uIE1BQ0hfVlI0MVhYCisJc2VsZWN0IENQVV9MSVRUTEVfRU5ESUFOCisJc2VsZWN0IERNQV9OT05DT0hFUkVOVAorCXNlbGVjdCBJUlFfQ1BVCisJc2VsZWN0IEhXX0hBU19QQ0kKIAogY29uZmlnIFpBT19DQVBDRUxMQQogCWJvb2wgIlN1cHBvcnQgZm9yIFpBTyBOZXR3b3JrcyBDYXBjZWxsYSIKIAlkZXBlbmRzIG9uIE1BQ0hfVlI0MVhYCisJc2VsZWN0IENQVV9MSVRUTEVfRU5ESUFOCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IElSUV9DUFUKKwlzZWxlY3QgSFdfSEFTX1BDSQogCiBjb25maWcgUENJX1ZSNDFYWAogCWJvb2wgIkFkZCBQQ0kgY29udHJvbCB1bml0IHN1cHBvcnQgb2YgTkVDIFZSNDEwMCBzZXJpZXMiCi0JZGVwZW5kcyBvbiBNQUNIX1ZSNDFYWCAmJiBQQ0kKLQotY29uZmlnIFZSQzQxNzEKLQl0cmlzdGF0ZSAiQWRkIE5FQyBWUkM0MTcxIGNvbXBhbmlvbiBjaGlwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNQUNIX1ZSNDFYWCAmJiBJU0EKLQktLS1oZWxwLS0tCi0JICBUaGUgTkVDIFZSQzQxNzEvNDE3MUEgaXMgYSBjb21wYW5pb24gY2hpcCBmb3IgTkVDIFZSNDExMS9WUjQxMjEuCisJZGVwZW5kcyBvbiBNQUNIX1ZSNDFYWCAmJiBIV19IQVNfUENJCisJZGVmYXVsdCB5CisJc2VsZWN0IFBDSQogCiBjb25maWcgVlJDNDE3MwogCXRyaXN0YXRlICJBZGQgTkVDIFZSQzQxNzMgY29tcGFuaW9uIGNoaXAgc3VwcG9ydCIKQEAgLTE1NCwyNSArMTkxLDI4IEBACiAKIGNvbmZpZyBUT1NISUJBX0pNUjM5MjcKIAlib29sICJTdXBwb3J0IGZvciBUb3NoaWJhIEpNUi1UWDM5MjcgYm9hcmQiCi0JZGVwZW5kcyBvbiBNSVBTMzIKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAKIGNvbmZpZyBNSVBTX0NPQkFMVAotCWJvb2wgIlN1cHBvcnQgZm9yIENvYmFsdCBTZXJ2ZXIgKEVYUEVSSU1FTlRBTCkiCisJYm9vbCAiU3VwcG9ydCBmb3IgQ29iYWx0IFNlcnZlciIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBJODI1OQogCXNlbGVjdCBJUlFfQ1BVCisJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTCBpZiBFWFBFUklNRU5UQUwKIAogY29uZmlnIE1BQ0hfREVDU1RBVElPTgogCWJvb2wgIlN1cHBvcnQgZm9yIERFQ3N0YXRpb25zIgogCXNlbGVjdCBCT09UX0VMRjMyCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBJUlFfQ1BVCi0JZGVwZW5kcyBvbiBNSVBTMzIgfHwgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTCBpZiBFWFBFUklNRU5UQUwKIAktLS1oZWxwLS0tCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgREVDJ3MgTUlQUyBiYXNlZCB3b3Jrc3RhdGlvbnMuICBGb3IgZGV0YWlscwogCSAgc2VlIHRoZSBMaW51eC9NSVBTIEZBUSBvbiA8aHR0cDovL3d3dy5saW51eC1taXBzLm9yZy8+IGFuZCB0aGUKQEAgLTE5NCw2ICsyMzQsOCBAQAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBNSVBTX0dUNjQxMjAKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAJaGVscAogCSAgVGhpcyBpcyBhbiBldmFsdWF0aW9uIGJvYXJkIGJhc2VkIG9uIHRoZSBHYWxpbGVvIEdULTY0MTIwCiAJICBzaW5nbGUtY2hpcCBzeXN0ZW0gY29udHJvbGxlciB0aGF0IGNvbnRhaW5zIGEgTUlQUyBSNTAwMCBjb21wYXRpYmxlCkBAIC0yMTQsNiArMjU2LDggQEAKIAlzZWxlY3QgTUlQU19HVDk2MTAwCiAJc2VsZWN0IFJNNzAwMF9DUFVfU0NBQ0hFCiAJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAJaGVscAogCSAgVGhpcyBpcyBhbiBldmFsdWF0aW9uIGJvYXJkIGJhc2VkIG9uIHRoZSBHYWxpbGVvIEdULTk2MTAwIExBTi9XQU4KIAkgIGNvbW11bmljYXRpb25zIGNvbnRyb2xsZXJzIGNvbnRhaW5pbmcgYSBNSVBTIFI1MDAwIGNvbXBhdGlibGUgY29yZQpAQCAtMjI0LDYgKzI2OCw4IEBACiAJYm9vbCAiU3VwcG9ydCBmb3IgR2xvYmVzcGFuIElWUiBib2FyZCIKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMIGlmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIFRoaXMgaXMgYW4gZXZhbHVhdGlvbiBib2FyZCBidWlsdCBieSBHbG9iZXNwYW4gdG8gc2hvd2Nhc2UgdGhpcgogCSAgaVZSIChJbnRlcm5ldCBWaWRlbyBSZWNvcmRlcikgZGVzaWduLiBJdCB1dGlsaXplcyBhIFFFRCBSTTUyMzEKQEAgLTIzNyw2ICsyODMsOCBAQAogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IE1JUFNfR1Q2NDEyMAogCXNlbGVjdCBSNTAwMF9DUFVfU0NBQ0hFCisJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTCBpZiBFWFBFUklNRU5UQUwKIAogY29uZmlnIFBJQ1ZVRQogCXRyaXN0YXRlICJQSUNWVUUgTENEIGRpc3BsYXkgZHJpdmVyIgpAQCAtMjU4LDYgKzMwNiw4IEBACiAJYm9vbCAiU3VwcG9ydCBmb3IgSVRFIDgxNzJHIGJvYXJkIgogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwgaWYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgVGhzIGlzIGFuIGV2YWx1YXRpb24gYm9hcmQgbWFkZSBieSBJVEUgPGh0dHA6Ly93d3cuaXRlLmNvbS50dy8+CiAJICB3aXRoIEFUWCBmb3JtIGZhY3RvciB0aGF0IHV0aWxpemVzIGEgTUlQUyBSNTAwMCB0byB3b3JrIHdpdGggaXRzCkBAIC0yODEsNiArMzMxLDggQEAKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBNSVBTX0dUNjQxMjAKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFFFRCBSNTIzMS1iYXNlZCBNSVBTIEF0bGFzIGV2YWx1YXRpb24KIAkgIGJvYXJkLgpAQCAtMjk1LDYgKzM0Nyw4IEBACiAJc2VsZWN0IEk4MjU5CiAJc2VsZWN0IE1JUFNfR1Q2NDEyMAogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCisJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgVlI1MDAwLWJhc2VkIE1JUFMgTWFsdGEgZXZhbHVhdGlvbgogCSAgYm9hcmQuCkBAIC0zMDQsNiArMzU4LDggQEAKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBJUlFfQ1BVCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKIAogY29uZmlnIE1PTUVOQ09fT0NFTE9UCiAJYm9vbCAiU3VwcG9ydCBmb3IgTW9tZW50dW0gT2NlbG90IGJvYXJkIgpAQCAtMzE0LDYgKzM3MCw4IEBACiAJc2VsZWN0IE1JUFNfR1Q2NDEyMAogCXNlbGVjdCBSTTcwMDBfQ1BVX1NDQUNIRQogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCisJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCWhlbHAKIAkgIFRoZSBPY2Vsb3QgaXMgYSBNSVBTLWJhc2VkIFNpbmdsZSBCb2FyZCBDb21wdXRlciAoU0JDKSBtYWRlIGJ5CiAJICBNb21lbnR1bSBDb21wdXRlciA8aHR0cDovL3d3dy5tb21lbmNvLmNvbS8+LgpAQCAtMzI3LDYgKzM4NSw4IEBACiAJc2VsZWN0IFBDSV9NQVJWRUxMCiAJc2VsZWN0IFJNNzAwMF9DUFVfU0NBQ0hFCiAJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAJaGVscAogCSAgVGhlIE9jZWxvdCBpcyBhIE1JUFMtYmFzZWQgU2luZ2xlIEJvYXJkIENvbXB1dGVyIChTQkMpIG1hZGUgYnkKIAkgIE1vbWVudHVtIENvbXB1dGVyIDxodHRwOi8vd3d3Lm1vbWVuY28uY29tLz4uCkBAIC0zNDAsNiArNDAwLDggQEAKIAlzZWxlY3QgUENJX01BUlZFTEwKIAlzZWxlY3QgUk03MDAwX0NQVV9TQ0FDSEUKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKIAloZWxwCiAJICBUaGUgT2NlbG90IGlzIGEgTUlQUy1iYXNlZCBTaW5nbGUgQm9hcmQgQ29tcHV0ZXIgKFNCQykgbWFkZSBieQogCSAgTW9tZW50dW0gQ29tcHV0ZXIgPGh0dHA6Ly93d3cubW9tZW5jby5jb20vPi4KQEAgLTM1NSw2ICs0MTcsOCBAQAogCXNlbGVjdCBQQ0lfTUFSVkVMTAogCXNlbGVjdCBSTTcwMDBfQ1BVX1NDQUNIRQogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCisJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCWhlbHAKIAkgIFRoZSBPY2Vsb3QtMyBpcyBiYXNlZCBvZmYgRGlzY292ZXJ5IElJSSBTeXN0ZW0gQ29udHJvbGxlciBhbmQKIAkgIFBNQy1TaWVycmEgUm03OTAwMCBjb3JlLgpAQCAtMzcxLDYgKzQzNSw4IEBACiAJc2VsZWN0IFBDSV9NQVJWRUxMCiAJc2VsZWN0IFJNNzAwMF9DUFVfU0NBQ0hFCiAJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAJaGVscAogCSAgVGhlIEphZ3VhciBBVFggaXMgYSBNSVBTLWJhc2VkIFNpbmdsZSBCb2FyZCBDb21wdXRlciAoU0JDKSBtYWRlIGJ5CiAJICBNb21lbnR1bSBDb21wdXRlciA8aHR0cDovL3d3dy5tb21lbmNvLmNvbS8+LgpAQCAtMzkwLDYgKzQ1Niw4IEBACiAJc2VsZWN0IElSUV9DUFVfUk03SwogCXNlbGVjdCBJUlFfQ1BVX1JNOUsKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKIAloZWxwCiAJICBZb3NlbWl0ZSBpcyBhbiBldmFsdWF0aW9uIGJvYXJkIGZvciB0aGUgUk05MDAweDIgcHJvY2Vzc29yCiAJICBtYW51ZmFjdHVyZWQgYnkgUE1DLVNpZXJyYQpAQCAtNDA3LDYgKzQ3NSw4IEBACiAJc2VsZWN0IElSUV9DUFUKIAlzZWxlY3QgSTgyNTkKIAlzZWxlY3QgSVNBCisJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgVlI1MDAwLWJhc2VkIE5FQyBEREIgVnJjLTUwNzQKIAkgIGV2YWx1YXRpb24gYm9hcmQuCkBAIC00MTksNiArNDg5LDggQEAKIAlzZWxlY3QgSVJRX0NQVQogCXNlbGVjdCBJODI1OQogCXNlbGVjdCBJU0EKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMIGlmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUjU0MzItYmFzZWQgTkVDIEREQiBWcmMtNTQ3NgogCSAgZXZhbHVhdGlvbiBib2FyZC4KQEAgLTQzMyw2ICs1MDUsOCBAQAogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IEk4MjU5CiAJc2VsZWN0IElSUV9DUFUKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMIGlmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUjU0MzItYmFzZWQgTkVDIEREQiBWcmMtNTQ3NywKIAkgIG9yIFJvY2tob3BwZXIvU29sdXRpb25HZWFyIGJvYXJkcyB3aXRoIFI1NDMyL1I1NTAwIENQVXMuCkBAIC00NDUsMTAgKzUxOSwyMyBAQAogCWRlcGVuZHMgb24gRERCNTQ3NwogCWRlZmF1bHQgMAogCi1jb25maWcgTkVDX09TUFJFWQotCWJvb2wgIlN1cHBvcnQgZm9yIE5FQyBPc3ByZXkgYm9hcmQiCi0Jc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBJUlFfQ1BVCitjb25maWcgUUVNVQorCWJvb2wgIlN1cHBvcnQgZm9yIFFlbXUiCisJc2VsZWN0IERNQV9DT0hFUkVOVAorCXNlbGVjdCBHRU5FUklDX0lTQV9ETUEKKwlzZWxlY3QgSEFWRV9TVERfUENfU0VSSUFMX1BPUlQKKwlzZWxlY3QgSTgyNTkKKwlzZWxlY3QgSVNBCisJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgorCWhlbHAKKwkgUWVtdSBpcyBhIHNvZnR3YXJlIGVtdWxhdG9yIHdoaWNoIGFtb25nIG90aGVyIGFyY2hpdGVjdHVyZXMgYWxzbworCSBjYW4gc2ltdWxhdGUgYSBNSVBTMzIgNEtjIHN5c3RlbS4gIFRoaXMgcGF0Y2ggYWRkcyBzdXBwb3J0IGZvciB0aGUKKwkgc3lzdGVtIGFyY2hpdGVjdHVyZSB0aGF0IGN1cnJlbnRseSBpcyBiZWluZyBzaW11bGF0ZWQgYnkgUWVtdS4gIEl0CisJIHdpbGwgZXZlbnR1YWxseSBiZSByZW1vdmVkIGFnYWluIHdoZW4gUWVtdSBoYXMgdGhlIGNhcGFiaWxpdHkgdG8KKwkgc2ltdWxhdGUgYWN0dWFsIE1JUFMgaGFyZHdhcmUgcGxhdGZvcm1zLiAgTW9yZSBpbmZvcm1hdGlvbiBvbiBRZW11CisJIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vd3d3LmxpbnV4LW1pcHMub3JnL3dpa2kvUWVtdS4KIAogY29uZmlnIFNHSV9JUDIyCiAJYm9vbCAiU3VwcG9ydCBmb3IgU0dJIElQMjIgKEluZHkvSW5kaWdvMikiCkBAIC00NTksNiArNTQ2LDggQEAKIAlzZWxlY3QgSVAyMl9DUFVfU0NBQ0hFCiAJc2VsZWN0IElSUV9DUFUKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKIAloZWxwCiAJICBUaGlzIGFyZSB0aGUgU0dJIEluZHksIENoYWxsZW5nZSBTIGFuZCBJbmRpZ28yLCBhcyB3ZWxsIGFzIGNlcnRhaW4KIAkgIE9FTSB2YXJpYW50cyBsaWtlIHRoZSBUYW5kZW0gQ01OIEIwMDZTLiBUbyBjb21waWxlIGEgTGludXgga2VybmVsCkBAIC00NjYsMTIgKzU1NSwxMiBAQAogCiBjb25maWcgU0dJX0lQMjcKIAlib29sICJTdXBwb3J0IGZvciBTR0kgSVAyNyAoT3JpZ2luMjAwLzIwMDApIgotCWRlcGVuZHMgb24gTUlQUzY0CiAJc2VsZWN0IEFSQwogCXNlbGVjdCBBUkM2NAogCXNlbGVjdCBETUFfSVAyNwogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IFBDSV9ET01BSU5TCisJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKIAloZWxwCiAJICBUaGlzIGFyZSB0aGUgU0dJIE9yaWdpbiAyMDAsIE9yaWdpbiAyMDAwIGFuZCBPbnl4IDIgR3JhcGhpY3MKIAkgIHdvcmtzdGF0aW9ucy4gIFRvIGNvbXBpbGUgYSBMaW51eCBrZXJuZWwgdGhhdCBydW5zIG9uIHRoZXNlLCBzYXkgWQpAQCAtNTM0LDcgKzYyMyw3IEBACiAKIGNvbmZpZyBTR0lfSVAzMgogCWJvb2wgIlN1cHBvcnQgZm9yIFNHSSBJUDMyIChPMikgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBNSVBTNjQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgQVJDCiAJc2VsZWN0IEFSQzMyCiAJc2VsZWN0IEJPT1RfRUxGMzIKQEAgLTU0NCwxMiArNjMzLDEzIEBACiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgUjUwMDBfQ1BVX1NDQUNIRQogCXNlbGVjdCBSTTcwMDBfQ1BVX1NDQUNIRQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAJaGVscAogCSAgSWYgeW91IHdhbnQgdGhpcyBrZXJuZWwgdG8gcnVuIG9uIFNHSSBPMiB3b3Jrc3RhdGlvbiwgc2F5IFkgaGVyZS4KIAogY29uZmlnIFNPQ19BVTFYMDAKLQlkZXBlbmRzIG9uIE1JUFMzMgogCWJvb2wgIlN1cHBvcnQgZm9yIEFNRC9BbGNoZW15IEF1MVgwMCBTT0NzIgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAKIGNob2ljZQogCXByb21wdCAiQXUxWDAwIFNPQyBUeXBlIgpAQCAtNjYxLDYgKzc1MSw4IEBACiAJc2VsZWN0IEJPT1RfRUxGMzIKIAlzZWxlY3QgRE1BX0NPSEVSRU5UCiAJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAKIGNob2ljZQogCXByb21wdCAiQkNNMXh4eCBTT0MtYmFzZWQgYm9hcmQiCkBAIC04ODAsNiArOTcyLDggQEAKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBJODI1OQogCXNlbGVjdCBJU0EKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMIGlmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIFRoZSBTTkkgUk0yMDAgUENJIHdhcyBhIE1JUFMtYmFzZWQgcGxhdGZvcm0gbWFudWZhY3R1cmVkIGJ5IFNpZW1lbnMKIAkgIE5peGRvcmYgSW5mb3JtYXRpb25zc3lzdGVtZSAoU05JKSwgcGFyZW50IGNvbXBhbnkgb2YgUHlyYW1pZApAQCAtODg4LDEzICs5ODIsMTQgQEAKIAogY29uZmlnIFRPU0hJQkFfUkJUWDQ5MjcKIAlib29sICJTdXBwb3J0IGZvciBUb3NoaWJhIFRCVFg0OVsyM103IGJvYXJkIgotCWRlcGVuZHMgb24gTUlQUzMyCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIQVNfVFhYOV9TRVJJQUwKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBJODI1OQogCXNlbGVjdCBJU0EKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKIAloZWxwCiAJICBUaGlzIFRvc2hpYmEgYm9hcmQgaXMgYmFzZWQgb24gdGhlIFRYNDkyNyBwcm9jZXNzb3IuIFNheSBZIGhlcmUgdG8KIAkgIHN1cHBvcnQgdGhpcyBtYWNoaW5lIHR5cGUKQEAgLTkyNiwxMyArMTAyMSwyMSBAQAogCWRlcGVuZHMgb24gU05JX1JNMjAwX1BDSSB8fCBTR0lfSVAzMiB8fCBTR0lfSVAyNyB8fCBTR0lfSVAyMiB8fCBNSVBTX01BR05VTV80MDAwIHx8IE9MSVZFVFRJX003MDAgfHwgQUNFUl9QSUNBXzYxCiAJZGVmYXVsdCB5CiAKLWNvbmZpZwlETUFfQ09IRVJFTlQKK2NvbmZpZyBETUFfQ09IRVJFTlQKIAlib29sCiAKLWNvbmZpZwlETUFfSVAyNworY29uZmlnIERNQV9JUDI3CiAJYm9vbAogCi1jb25maWcJRE1BX05PTkNPSEVSRU5UCitjb25maWcgRE1BX0lQMzIKKwlib29sCisJc2VsZWN0IERNQV9ORUVEX1BDSV9NQVBfU1RBVEUKKworY29uZmlnIERNQV9OT05DT0hFUkVOVAorCWJvb2wKKwlzZWxlY3QgRE1BX05FRURfUENJX01BUF9TVEFURQorCitjb25maWcgRE1BX05FRURfUENJX01BUF9TVEFURQogCWJvb2wKIAogY29uZmlnIEVBUkxZX1BSSU5USwpAQCAtOTc0LDcgKzEwNzcsNyBAQAogCiBjb25maWcgQ1BVX0xJVFRMRV9FTkRJQU4KIAlib29sICJHZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIGNvZGUiCi0JZGVmYXVsdCB5IGlmIEFDRVJfUElDQV82MSB8fCBDQVNJT19FNTUgfHwgRERCNTA3NCB8fCBEREI1NDc2IHx8IEREQjU0NzcgfHwgTUFDSF9ERUNTVEFUSU9OIHx8IElCTV9XT1JLUEFEIHx8IExBU0FUIHx8IE1JUFNfQ09CQUxUIHx8IE1JUFNfSVRFODE3MiB8fCBNSVBTX0lWUiB8fCBTT0NfQVUxWDAwIHx8IE5FQ19PU1BSRVkgfHwgT0xJVkVUVElfTTcwMCB8fCBTTklfUk0yMDBfUENJIHx8IFZJQ1RPUl9NUEMzMFggfHwgWkFPX0NBUENFTExBCisJZGVmYXVsdCB5IGlmIEFDRVJfUElDQV82MSB8fCBDQVNJT19FNTUgfHwgRERCNTA3NCB8fCBEREI1NDc2IHx8IEREQjU0NzcgfHwgTUFDSF9ERUNTVEFUSU9OIHx8IElCTV9XT1JLUEFEIHx8IExBU0FUIHx8IE1JUFNfQ09CQUxUIHx8IE1JUFNfSVRFODE3MiB8fCBNSVBTX0lWUiB8fCBTT0NfQVUxWDAwIHx8IE9MSVZFVFRJX003MDAgfHwgU05JX1JNMjAwX1BDSSB8fCBWSUNUT1JfTVBDMzBYIHx8IFpBT19DQVBDRUxMQQogCWRlZmF1bHQgbiBpZiBNSVBTX0VWNjQxMjAgfHwgTUlQU19FVjk2MTAwIHx8IE1PTUVOQ09fT0NFTE9UIHx8IE1PTUVOQ09fT0NFTE9UX0cgfHwgU0dJX0lQMjIgfHwgU0dJX0lQMjcgfHwgU0dJX0lQMzIgfHwgVE9TSElCQV9KTVIzOTI3CiAJaGVscAogCSAgU29tZSBNSVBTIG1hY2hpbmVzIGNhbiBiZSBjb25maWd1cmVkIGZvciBlaXRoZXIgbGl0dGxlIG9yIGJpZyBlbmRpYW4KQEAgLTEwOTEsMTEgKzExOTQsNiBAQAogY29uZmlnIEhBVkVfU1REX1BDX1NFUklBTF9QT1JUCiAJYm9vbAogCi1jb25maWcgVlI0MTgxCi0JYm9vbAotCWRlcGVuZHMgb24gTkVDX09TUFJFWQotCWRlZmF1bHQgeQotCiBjb25maWcgQVJDX0NPTlNPTEUKIAlib29sICJBUkMgY29uc29sZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gU0dJX0lQMjIgfHwgU05JX1JNMjAwX1BDSQpAQCAtMTE0NSwxMyArMTI0MywxNiBAQAogCiBjb25maWcgQ1BVX01JUFMzMgogCWJvb2wgIk1JUFMzMiIKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCiBjb25maWcgQ1BVX01JUFM2NAogCWJvb2wgIk1JUFM2NCIKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBDUFVfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAKIGNvbmZpZyBDUFVfUjMwMDAKIAlib29sICJSMzAwMCIKLQlkZXBlbmRzIG9uIE1JUFMzMgorCXNlbGVjdCBDUFVfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAJaGVscAogCSAgUGxlYXNlIG1ha2Ugc3VyZSB0byBwaWNrIHRoZSByaWdodCBDUFUgdHlwZS4gTGludXgvTUlQUyBpcyBub3QKIAkgIGRlc2lnbmVkIHRvIGJlIGdlbmVyaWMsIGkuZS4gS2VybmVscyBjb21waWxlZCBmb3IgUjMwMDAgQ1BVcyB3aWxsCkBAIC0xMTYyLDEwICsxMjYzLDEyIEBACiAKIGNvbmZpZyBDUFVfVFgzOVhYCiAJYm9vbCAiUjM5WFgiCi0JZGVwZW5kcyBvbiBNSVBTMzIKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCiBjb25maWcgQ1BVX1ZSNDFYWAogCWJvb2wgIlI0MXh4IgorCXNlbGVjdCBDUFVfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IENQVV9TVVBQT1JUU182NEJJVF9LRVJORUwKIAloZWxwCiAJICBUaGUgb3B0aW9ucyBzZWxlY3RzIHN1cHBvcnQgZm9yIHRoZSBORUMgVlI0MXh4IHNlcmllcyBvZiBwcm9jZXNzb3JzLgogCSAgT25seSBjaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgb25lIG9mIHRoZXNlIHByb2Nlc3NvcnMgYXMgYQpAQCAtMTE3NCwyMCArMTI3NywyOCBAQAogCiBjb25maWcgQ1BVX1I0MzAwCiAJYm9vbCAiUjQzMDAiCisJc2VsZWN0IENQVV9TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCWhlbHAKIAkgIE1JUFMgVGVjaG5vbG9naWVzIFI0MzAwLXNlcmllcyBwcm9jZXNzb3JzLgogCiBjb25maWcgQ1BVX1I0WDAwCiAJYm9vbCAiUjR4MDAiCisJc2VsZWN0IENQVV9TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCWhlbHAKIAkgIE1JUFMgVGVjaG5vbG9naWVzIFI0MDAwLXNlcmllcyBwcm9jZXNzb3JzIG90aGVyIHRoYW4gNDMwMCwgaW5jbHVkaW5nCiAJICB0aGUgUjQwMDAsIFI0NDAwLCBSNDYwMCwgYW5kIDQ3MDAuCiAKIGNvbmZpZyBDUFVfVFg0OVhYCiAJYm9vbCAiUjQ5WFgiCisJc2VsZWN0IENQVV9TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCiBjb25maWcgQ1BVX1I1MDAwCiAJYm9vbCAiUjUwMDAiCisJc2VsZWN0IENQVV9TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCWhlbHAKIAkgIE1JUFMgVGVjaG5vbG9naWVzIFI1MDAwLXNlcmllcyBwcm9jZXNzb3JzIG90aGVyIHRoYW4gdGhlIE5ldmFkYS4KIApAQCAtMTE5NiwzNiArMTMwNyw0OCBAQAogCiBjb25maWcgQ1BVX1I2MDAwCiAJYm9vbCAiUjYwMDAiCi0JZGVwZW5kcyBvbiBNSVBTMzIgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCWhlbHAKIAkgIE1JUFMgVGVjaG5vbG9naWVzIFI2MDAwIGFuZCBSNjAwMEEgc2VyaWVzIHByb2Nlc3NvcnMuICBOb3RlIHRoZXNlCiAJICBwcm9jZXNzb3JzIGFyZSBleHRyZW1seSByYXJlIGFuZCB0aGUgc3VwcG9ydCBmb3IgdGhlbSBpcyBpbmNvbXBsZXRlLgogCiBjb25maWcgQ1BVX05FVkFEQQogCWJvb2wgIlJNNTJ4eCIKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBDUFVfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAJaGVscAogCSAgUUVEIC8gUE1DLVNpZXJyYSBSTTUyeHgtc2VyaWVzICgiTmV2YWRhIikgcHJvY2Vzc29ycy4KIAogY29uZmlnIENQVV9SODAwMAogCWJvb2wgIlI4MDAwIgotCWRlcGVuZHMgb24gTUlQUzY0ICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJc2VsZWN0IENQVV9TVVBQT1JUU182NEJJVF9LRVJORUwKIAloZWxwCiAJICBNSVBTIFRlY2hub2xvZ2llcyBSODAwMCBwcm9jZXNzb3JzLiAgTm90ZSB0aGVzZSBwcm9jZXNzb3JzIGFyZQogCSAgdW5jb21tb24gYW5kIHRoZSBzdXBwb3J0IGZvciB0aGVtIGlzIGluY29tcGxldGUuCiAKIGNvbmZpZyBDUFVfUjEwMDAwCiAJYm9vbCAiUjEwMDAwIgorCXNlbGVjdCBDUFVfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IENQVV9TVVBQT1JUU182NEJJVF9LRVJORUwKIAloZWxwCiAJICBNSVBTIFRlY2hub2xvZ2llcyBSMTAwMDAtc2VyaWVzIHByb2Nlc3NvcnMuCiAKIGNvbmZpZyBDUFVfUk03MDAwCiAJYm9vbCAiUk03MDAwIgorCXNlbGVjdCBDUFVfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IENQVV9TVVBQT1JUU182NEJJVF9LRVJORUwKIAogY29uZmlnIENQVV9STTkwMDAKIAlib29sICJSTTkwMDAiCisJc2VsZWN0IENQVV9TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCiBjb25maWcgQ1BVX1NCMQogCWJvb2wgIlNCMSIKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBDUFVfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAKIGVuZGNob2ljZQogCkBAIC0xMzIxLDExICsxNDQ0LDExIEBACiAKIGNvbmZpZyA2NEJJVF9QSFlTX0FERFIKIAlib29sICJTdXBwb3J0IGZvciA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSIKLQlkZXBlbmRzIG9uIChDUFVfUjRYMDAgfHwgQ1BVX1I1MDAwIHx8IENQVV9STTcwMDAgfHwgQ1BVX1JNOTAwMCB8fCBDUFVfUjEwMDAwIHx8IENQVV9TQjEgfHwgQ1BVX01JUFMzMiB8fCBDUFVfTUlQUzY0KSAmJiBNSVBTMzIKKwlkZXBlbmRzIG9uIChDUFVfUjRYMDAgfHwgQ1BVX1I1MDAwIHx8IENQVV9STTcwMDAgfHwgQ1BVX1JNOTAwMCB8fCBDUFVfUjEwMDAwIHx8IENQVV9TQjEgfHwgQ1BVX01JUFMzMiB8fCBDUFVfTUlQUzY0KSAmJiAzMkJJVAogCiBjb25maWcgQ1BVX0FEVkFOQ0VECiAJYm9vbCAiT3ZlcnJpZGUgQ1BVIE9wdGlvbnMiCi0JZGVwZW5kcyBvbiBNSVBTMzIKKwlkZXBlbmRzIG9uIDMyQklUCiAJaGVscAogCSAgU2F5aW5nIHllcyBoZXJlIGFsbG93cyB5b3UgdG8gc2VsZWN0IHN1cHBvcnQgZm9yIHZhcmlvdXMgZmVhdHVyZXMKIAkgIHlvdXIgQ1BVIG1heSBvciBtYXkgbm90IGhhdmUuICBNb3N0IHBlb3BsZSBzaG91bGQgc2F5IE4gaGVyZS4KQEAgLTEzNzksNyArMTUwMiw3IEBACiAjCiBjb25maWcgSElHSE1FTQogCWJvb2wgIkhpZ2ggTWVtb3J5IFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNSVBTMzIgJiYgKENQVV9SMzAwMCB8fCBDUFVfU0IxIHx8IENQVV9SNzAwMCB8fCBDUFVfUk05MDAwIHx8IENQVV9SMTAwMDApICYmICEoTUFDSF9ERUNTVEFUSU9OIHx8IE1PTUVOQ09fSkFHVUFSX0FUWCkKKwlkZXBlbmRzIG9uIDMyQklUICYmIChDUFVfUjMwMDAgfHwgQ1BVX1NCMSB8fCBDUFVfUjcwMDAgfHwgQ1BVX1JNOTAwMCB8fCBDUFVfUjEwMDAwKSAmJiAhKE1BQ0hfREVDU1RBVElPTiB8fCBNT01FTkNPX0pBR1VBUl9BVFgpCiAKIGNvbmZpZyBBUkNIX0ZMQVRNRU1fRU5BQkxFCiAJZGVmX2Jvb2wgeQpAQCAtMTQzOSw3ICsxNTYyLDcgQEAKIAogY29uZmlnIE1JUFNfSU5TQU5FX0xBUkdFCiAJYm9vbCAiU3VwcG9ydCBmb3IgbGFyZ2UgNjQtYml0IGNvbmZpZ3VyYXRpb25zIgotCWRlcGVuZHMgb24gQ1BVX1IxMDAwMCAmJiBNSVBTNjQKKwlkZXBlbmRzIG9uIENQVV9SMTAwMDAgJiYgNjRCSVQKIAloZWxwCiAJICBNSVBTIFIxMDAwMCBkb2VzIHN1cHBvcnQgYSA0NCBiaXQgLyAxNlRCIGFkZHJlc3Mgc3BhY2UgYXMgb3Bwb3NlZCB0bwogCSAgcHJldmlvdXMgNjQtYml0IHByb2Nlc3NvcnMgd2hpY2ggb25seSBzdXBwb3J0ZWQgNDAgYml0IC8gMVRCLiBJZiB5b3UKQEAgLTE1NDAsMTEgKzE2NjMsMTEgQEAKIAogY29uZmlnIFRSQURfU0lHTkFMUwogCWJvb2wKLQlkZWZhdWx0IHkgaWYgTUlQUzMyCisJZGVmYXVsdCB5IGlmIDMyQklUCiAKIGNvbmZpZyBCVUlMRF9FTEY2NAogCWJvb2wgIlVzZSA2NC1iaXQgRUxGIGZvcm1hdCBmb3IgYnVpbGRpbmciCi0JZGVwZW5kcyBvbiBNSVBTNjQKKwlkZXBlbmRzIG9uIDY0QklUCiAJaGVscAogCSAgQSA2NC1iaXQga2VybmVsIGlzIHVzdWFsbHkgYnVpbHQgdXNpbmcgdGhlIDY0LWJpdCBFTEYgYmluYXJ5IG9iamVjdAogCSAgZm9ybWF0IGFzIGl0J3Mgb25lIHRoYXQgYWxsb3dzIGFyYml0cmFyeSA2NC1iaXQgY29uc3RydWN0cy4gIEZvcgpAQCAtMTU1OSwxMSArMTY4MiwxMSBAQAogCiBjb25maWcgQklORk1UX0lSSVgKIAlib29sICJJbmNsdWRlIElSSVggYmluYXJ5IGNvbXBhdGliaWxpdHkiCi0JZGVwZW5kcyBvbiAhQ1BVX0xJVFRMRV9FTkRJQU4gJiYgTUlQUzMyICYmIEJST0tFTgorCWRlcGVuZHMgb24gIUNQVV9MSVRUTEVfRU5ESUFOICYmIDMyQklUICYmIEJST0tFTgogCiBjb25maWcgTUlQUzMyX0NPTVBBVAogCWJvb2wgIktlcm5lbCBzdXBwb3J0IGZvciBMaW51eC9NSVBTIDMyLWJpdCBiaW5hcnkgY29tcGF0aWJpbGl0eSIKLQlkZXBlbmRzIG9uIE1JUFM2NAorCWRlcGVuZHMgb24gNjRCSVQKIAloZWxwCiAJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgTGludXgvTUlQUyAzMi1iaXQgYmluYXJ5CiAJICBjb21wYXRpYmlsaXR5LiBTaW5jZSBhbGwgc29mdHdhcmUgYXZhaWxhYmxlIGZvciBMaW51eC9NSVBTIGlzCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvTWFrZWZpbGUgYi9hcmNoL21pcHMvTWFrZWZpbGUKaW5kZXggYmMxYzQ0Mi4uMzQ2ZTgwMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9NYWtlZmlsZQpAQCAtMzcsMTIgKzM3LDEyIEBACiA2NGJpdC1lbXVsCQk9IGVsZjY0YnRzbWlwCiBlbmRpZgogCi1pZmRlZiBDT05GSUdfTUlQUzMyCitpZmRlZiBDT05GSUdfMzJCSVQKIGdjYy1hYmkJCQk9IDMyCiB0b29sLXByZWZpeAkJPSAkKDMyYml0LXRvb2wtcHJlZml4KQogVVRTX01BQ0hJTkUJCTo9IG1pcHMKIGVuZGlmCi1pZmRlZiBDT05GSUdfTUlQUzY0CitpZmRlZiBDT05GSUdfNjRCSVQKIGdjYy1hYmkJCQk9IDY0CiB0b29sLXByZWZpeAkJPSAkKDY0Yml0LXRvb2wtcHJlZml4KQogVVRTX01BQ0hJTkUJCTo9IG1pcHM2NApAQCAtNjMsNyArNjMsNyBAQAogdm1saW51eC0zMgkJPSB2bWxpbnV4CiB2bWxpbnV4LTY0CQk9IHZtbGludXguNjQKIAotY2ZsYWdzLSQoQ09ORklHX01JUFM2NCkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbW5vLWV4cGxpY2l0LXJlbG9jcykKK2NmbGFncy0kKENPTkZJR182NEJJVCkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbW5vLWV4cGxpY2l0LXJlbG9jcykKIGVuZGlmCiAKICMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiBjZmxhZ3MtJChDT05GSUdfQ1BVX1I1MDAwKQkrPSBcCiAJCQkkKGNhbGwgc2V0X2djY2ZsYWdzLHI1MDAwLG1pcHM0LHI1MDAwLG1pcHM0LG1pcHMyKSBcCi0JCQktV2EsLS10cmFwIAorCQkJLVdhLC0tdHJhcAogCiBjZmxhZ3MtJChDT05GSUdfQ1BVX1I1NDMyKQkrPSBcCiAJCQkkKGNhbGwgc2V0X2djY2ZsYWdzLHI1NDAwLG1pcHM0LHI1MDAwLG1pcHM0LG1pcHMyKSBcCkBAIC00MjMsNiArNDIzLDEyIEBACiBjZmxhZ3MtJChDT05GSUdfUE1DX1lPU0VNSVRFKQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC15b3NlbWl0ZQogbG9hZC0kKENPTkZJR19QTUNfWU9TRU1JVEUpCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCisjIFFlbXUgc2ltdWxhdGluZyBNSVBTMzIgNEtjCisjCitjb3JlLSQoQ09ORklHX1FFTVUpCQkrPSBhcmNoL21pcHMvcWVtdS8KK2NmbGFncy0kKENPTkZJR19RRU1VKQkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtcWVtdQorbG9hZC0kKENPTkZJR19RRU1VKQkJKz0gMHhmZmZmZmZmZjgwMDEwMDAwCisKICMKICMgTW9tZW50dW0gT2NlbG90LTMKICMKQEAgLTQ2OSwxMyArNDc1LDYgQEAKIGxvYWQtJChDT05GSUdfTEFTQVQpCQkrPSAweGZmZmZmZmZmODAwMDAwMDAKIAogIwotIyBORUMgT3NwcmV5ICh2cjQxODEpIGJvYXJkCi0jCi1jb3JlLSQoQ09ORklHX05FQ19PU1BSRVkpCSs9IGFyY2gvbWlwcy92cjQxODEvY29tbW9uLyBcCi0JCQkJICAgYXJjaC9taXBzL3ZyNDE4MS9vc3ByZXkvCi1sb2FkLSQoQ09ORklHX05FQ19PU1BSRVkpCSs9IDB4ZmZmZmZmZmY4MDAwMjAwMAotCi0jCiAjIENvbW1vbiBWUjQxeHgKICMKIGNvcmUtJChDT05GSUdfTUFDSF9WUjQxWFgpCSs9IGFyY2gvbWlwcy92cjQxeHgvY29tbW9uLwpAQCAtNDkwLDEzICs0ODksMTEgQEAKICMKICMgWkFPIE5ldHdvcmtzIENhcGNlbGxhIChWUjQxMzEpCiAjCi1jb3JlLSQoQ09ORklHX1pBT19DQVBDRUxMQSkJKz0gYXJjaC9taXBzL3ZyNDF4eC96YW8tY2FwY2VsbGEvCiBsb2FkLSQoQ09ORklHX1pBT19DQVBDRUxMQSkJKz0gMHhmZmZmZmZmZjgwMDAwMDAwCiAKICMKICMgVmljdG9yIE1QLUMzMDMvMzA0IChWUjQxMjIpCiAjCi1jb3JlLSQoQ09ORklHX1ZJQ1RPUl9NUEMzMFgpCSs9IGFyY2gvbWlwcy92cjQxeHgvdmljdG9yLW1wYzMweC8KIGxvYWQtJChDT05GSUdfVklDVE9SX01QQzMwWCkJKz0gMHhmZmZmZmZmZjgwMDAxMDAwCiAKICMKQEAgLTUxMiwxNiArNTA5LDkgQEAKIGxvYWQtJChDT05GSUdfQ0FTSU9fRTU1KQkrPSAweGZmZmZmZmZmODAwMDQwMDAKIAogIwotIyBUQU5CQUMgVEIwMjI2IE1iYXNlIChWUjQxMzEpCisjIFRBTkJBQyBWUjQxMzEgbXVsdGljaGlwIG1vZHVsZShUQjAyMjUpIGFuZCBUQU5CQUMgVlI0MTMxRElNTShUQjAyMjkpIChWUjQxMzEpCiAjCi1jb3JlLSQoQ09ORklHX1RBTkJBQ19UQjAyMjYpCSs9IGFyY2gvbWlwcy92cjQxeHgvdGFuYmFjLXRiMDIyNi8KLWxvYWQtJChDT05GSUdfVEFOQkFDX1RCMDIyNikJKz0gMHhmZmZmZmZmZjgwMDAwMDAwCi0KLSMKLSMgVEFOQkFDIFRCMDIyOSBWUjQxMzFESU1NIChWUjQxMzEpCi0jCi1jb3JlLSQoQ09ORklHX1RBTkJBQ19UQjAyMjkpCSs9IGFyY2gvbWlwcy92cjQxeHgvdGFuYmFjLXRiMDIyOS8KLWxvYWQtJChDT05GSUdfVEFOQkFDX1RCMDIyOSkJKz0gMHhmZmZmZmZmZjgwMDAwMDAwCitsb2FkLSQoQ09ORklHX1RBTkJBQ19UQjAyMlgpCSs9IDB4ZmZmZmZmZmY4MDAwMDAwMAogCiAjCiAjIFNHSSBJUDIyIChJbmR5L0luZGlnbzIpCkBAIC01MzQsMTAgKzUyNCwxMCBAQAogIwogY29yZS0kKENPTkZJR19TR0lfSVAyMikJCSs9IGFyY2gvbWlwcy9zZ2ktaXAyMi8KIGNmbGFncy0kKENPTkZJR19TR0lfSVAyMikJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyMgotaWZkZWYgQ09ORklHX01JUFMzMgoraWZkZWYgQ09ORklHXzMyQklUCiBsb2FkLSQoQ09ORklHX1NHSV9JUDIyKQkJKz0gMHhmZmZmZmZmZjg4MDAyMDAwCiBlbmRpZgotaWZkZWYgQ09ORklHX01JUFM2NAoraWZkZWYgQ09ORklHXzY0QklUCiBsb2FkLSQoQ09ORklHX1NHSV9JUDIyKQkJKz0gMHhmZmZmZmZmZjg4MDA0MDAwCiBlbmRpZgogCkBAIC02NDIsNyArNjMyLDcgQEAKIGNmbGFncy15CQkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYwogZHJpdmVycy0kKENPTkZJR19QQ0kpCQkrPSBhcmNoL21pcHMvcGNpLwogCi1pZmRlZiBDT05GSUdfTUlQUzMyCitpZmRlZiBDT05GSUdfMzJCSVQKIGlmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgogSklGRklFUwkJCT0gamlmZmllc182NAogZWxzZQpAQCAtNjc0LDggKzY2NCw4IEBACiBoZWFkLXkgOj0gYXJjaC9taXBzL2tlcm5lbC9oZWFkLm8gYXJjaC9taXBzL2tlcm5lbC9pbml0X3Rhc2subwogCiBsaWJzLXkJCQkrPSBhcmNoL21pcHMvbGliLwotbGlicy0kKENPTkZJR19NSVBTMzIpCSs9IGFyY2gvbWlwcy9saWItMzIvCi1saWJzLSQoQ09ORklHX01JUFM2NCkJKz0gYXJjaC9taXBzL2xpYi02NC8KK2xpYnMtJChDT05GSUdfMzJCSVQpCSs9IGFyY2gvbWlwcy9saWItMzIvCitsaWJzLSQoQ09ORklHXzY0QklUKQkrPSBhcmNoL21pcHMvbGliLTY0LwogCiBjb3JlLXkJCQkrPSBhcmNoL21pcHMva2VybmVsLyBhcmNoL21pcHMvbW0vIGFyY2gvbWlwcy9tYXRoLWVtdS8KIApAQCAtNjgzLDcgKzY3Myw3IEBACiAKIGlmZGVmIENPTkZJR19MQVNBVAogcm9tLmJpbiByb20uc3c6IHZtbGludXgKLQkkKGNhbGwgZGVzY2VuZCxhcmNoL21pcHMvbGFzYXQvaW1hZ2UsJEApCisJJChRKSQoTUFLRSkgJChidWlsZCk9YXJjaC9taXBzL2xhc2F0L2ltYWdlICRACiBlbmRpZgogCiAjCkBAIC03MzAsMzggKzcyMCw3IEBACiAJQCQoTUFLRSkgJChjbGVhbik9YXJjaC9taXBzL2Jvb3QKIAlAJChNQUtFKSAkKGNsZWFuKT1hcmNoL21pcHMvbGFzYXQKIAotIyBHZW5lcmF0ZSA8YXNtL29mZnNldC5oIAotIwotIyBUaGUgZGVmYXVsdCBydWxlIGlzIHN1ZmZlcmluZyBmcm9tIGZ1bm55IHByb2JsZW1zIG9uIE1JUFMgc28gd2UgdXNpbmcgb3VyCi0jIG93biAuLi4KLSMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWRlZmluZSBmaWxlY2hrX2dlbi1hc20tb2Zmc2V0LmgKLQkoc2V0IC1lOyBcCi0JIGVjaG8gIiNpZm5kZWYgX0FTTV9PRkZTRVRfSCI7IFwKLQkgZWNobyAiI2RlZmluZSBfQVNNX09GRlNFVF9IIjsgXAotCSBlY2hvICIvKiI7IFwKLQkgZWNobyAiICogRE8gTk9UIE1PRElGWS4iOyBcCi0JIGVjaG8gIiAqIjsgXAotCSBlY2hvICIgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhcmNoLyQoQVJDSCkvTWFrZWZpbGUiOyBcCi0JIGVjaG8gIiAqIjsgXAotCSBlY2hvICIgKi8iOyBcCi0JIGVjaG8gIiI7IFwKLQkgc2VkIC1uZSAiL15AQEAvcy8vL3AiOyBcCi0JIGVjaG8gIiNlbmRpZiAvKiBfQVNNX09GRlNFVF9IICovIiApCi1lbmRlZgotCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS0kKEFSQ0gpL29mZnNldC5oCi0KLWFyY2gvJChBUkNIKS9rZXJuZWwvb2Zmc2V0LnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLQkJCQkgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKLQotaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXQuaDogYXJjaC8kKEFSQ0gpL2tlcm5lbC9vZmZzZXQucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0LmgpCi0KLUNMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLSQoQVJDSCkvb2Zmc2V0LmgudG1wIFwKLQkgICAgICAgaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXQuaCBcCi0JICAgICAgIHZtbGludXguMzIgXAorQ0xFQU5fRklMRVMgKz0gdm1saW51eC4zMiBcCiAJICAgICAgIHZtbGludXguNjQgXAogCSAgICAgICB2bWxpbnV4LmVjb2ZmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9wY2kuYyBiL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3BjaS5jCmluZGV4IDUzMzcyMWUuLjRlNWE2ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3BjaS5jCisrKyBiL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3BjaS5jCkBAIC00MCwxNCArNDAsMTQgQEAKIAogLyogVEJEICovCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHBjaV9pb19yZXNvdXJjZSA9IHsKLQkicGNpIElPIHNwYWNlIiwgCisJInBjaSBJTyBzcGFjZSIsCiAJKHUzMilQQ0lfSU9fU1RBUlQsCiAJKHUzMilQQ0lfSU9fRU5ELAogCUlPUkVTT1VSQ0VfSU8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGNpX21lbV9yZXNvdXJjZSA9IHsKLQkicGNpIG1lbW9yeSBzcGFjZSIsIAorCSJwY2kgbWVtb3J5IHNwYWNlIiwKIAkodTMyKVBDSV9NRU1fU1RBUlQsCiAJKHUzMilQQ0lfTUVNX0VORCwKIAlJT1JFU09VUkNFX01FTQpAQCAtNjgsNyArNjgsNyBAQAogc3RhdGljIGludCBfX2luaXQgYXUxeF9wY2lfc2V0dXAodm9pZCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxNTAwKSB8fCBkZWZpbmVkKENPTkZJR19TT0NfQVUxNTUwKQotCXZpcnRfaW9fYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoQXUxNTAwX1BDSV9JT19TVEFSVCwgCisJdmlydF9pb19hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcChBdTE1MDBfUENJX0lPX1NUQVJULAogCQkJQXUxNTAwX1BDSV9JT19FTkQgLSBBdTE1MDBfUENJX0lPX1NUQVJUICsgMSk7CiAKIAlpZiAoIXZpcnRfaW9fYWRkcikgewpAQCAtNzcsNyArNzcsNyBAQAogCX0KIAogI2lmZGVmIENPTkZJR19ETUFfTk9OQ09IRVJFTlQKLQkvKiAKKwkvKgogICAgICAgICAgKiAgU2V0IHRoZSBOQyBiaXQgaW4gY29udHJvbGxlciBmb3IgQXUxNTAwIHByZS1BQyBzaWxpY29uCiAJICovCiAJdTMyIHByaWQgPSByZWFkX2MwX3ByaWQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3NldHVwLmMgYi9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9zZXR1cC5jCmluZGV4IGRiYzhiMWIuLmVmZjg5ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vc2V0dXAuYwpAQCAtOTcsNyArOTcsNyBAQAogCQlhcmdwdHIgPSBwcm9tX2dldGNtZGxpbmUoKTsKIAkJc3RyY2F0KGFyZ3B0ciwgIiBjb25zb2xlPXR0eVMwLDExNTIwMCIpOwogCX0KLSNlbmRpZgkgIAorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRkJfQVUxMTAwCiAgICAgaWYgKChhcmdwdHIgPSBzdHJzdHIoYXJncHRyLCAidmlkZW89IikpID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3RpbWUuYyBiL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3RpbWUuYwppbmRleCBmZTQxOGYxLi41NzY3NWI0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi90aW1lLmMKKysrIGIvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vdGltZS5jCkBAIC0yODEsNyArMjgxLDcgQEAKIAkJCWNwdV9zcGVlZCA9IGNvdW50ICogMjsKIAkJfQogI2Vsc2UKLQkJY3B1X3NwZWVkID0gKGF1X3JlYWRsKFNZU19DUFVQTEwpICYgMHgwMDAwMDAzZikgKiAKKwkJY3B1X3NwZWVkID0gKGF1X3JlYWRsKFNZU19DUFVQTEwpICYgMHgwMDAwMDAzZikgKgogCQkJQVUxMDAwX1NSQ19DTEs7CiAJCWNvdW50ID0gY3B1X3NwZWVkIC8gMjsKICNlbmRpZgpAQCAtMzU2LDcgKzM1Niw3IEBACiAJCTogImhpIiwgImxvIiwgR0NDX1JFR19BQ0NVTSk7CiAKIAkvKgotIAkgKiBEdWUgdG8gcG9zc2libGUgamlmZmllcyBpbmNvbnNpc3RlbmNpZXMsIHdlIG5lZWQgdG8gY2hlY2sgCisgCSAqIER1ZSB0byBwb3NzaWJsZSBqaWZmaWVzIGluY29uc2lzdGVuY2llcywgd2UgbmVlZCB0byBjaGVjawogCSAqIHRoZSByZXN1bHQgc28gdGhhdCB3ZSdsbCBnZXQgYSB0aW1lciB0aGF0IGlzIG1vbm90b25pYy4KIAkgKi8KIAlpZiAocmVzID49IFVTRUNTX1BFUl9KSUZGWSkKQEAgLTM3NSw4ICszNzUsOCBAQAogCWF1X3N5bmMoKTsKIAlvZmZzZXQgPSBwYzAgLSBsYXN0X3BjMDsKIAlpZiAob2Zmc2V0ID4gMipNQVRDSDIwX0lOQykgewotCQlwcmludGsoImh1Z2Ugb2Zmc2V0ICV4LCBsYXN0X3BjMCAleCBsYXN0X21hdGNoMjAgJXggcGMwICV4XG4iLCAKLQkJCQkodW5zaWduZWQpb2Zmc2V0LCAodW5zaWduZWQpbGFzdF9wYzAsIAorCQlwcmludGsoImh1Z2Ugb2Zmc2V0ICV4LCBsYXN0X3BjMCAleCBsYXN0X21hdGNoMjAgJXggcGMwICV4XG4iLAorCQkJCSh1bnNpZ25lZClvZmZzZXQsICh1bnNpZ25lZClsYXN0X3BjMCwKIAkJCQkodW5zaWduZWQpbGFzdF9tYXRjaDIwLCAodW5zaWduZWQpcGMwKTsKIAl9CiAJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpKChvZmZzZXQgKiAzMDUpIC8gMTApOwpAQCAtMzk0LDExICszOTQsMTEgQEAKIAlyNGtfb2Zmc2V0ID0gY2FsX3I0a29mZigpOwogCXByaW50aygiJTA4bHgoJWQpXG4iLCByNGtfb2Zmc2V0LCAoaW50KSByNGtfb2Zmc2V0KTsKIAotCS8vZXN0X2ZyZXEgPSAyKnI0a19vZmZzZXQqSFo7CQotCWVzdF9mcmVxID0gcjRrX29mZnNldCpIWjsJCisJLy9lc3RfZnJlcSA9IDIqcjRrX29mZnNldCpIWjsKKwllc3RfZnJlcSA9IHI0a19vZmZzZXQqSFo7CiAJZXN0X2ZyZXEgKz0gNTAwMDsgICAgLyogcm91bmQgKi8KIAllc3RfZnJlcSAtPSBlc3RfZnJlcSUxMDAwMDsKLQlwcmludGsoIkNQVSBmcmVxdWVuY3kgJWQuJTAyZCBNSHpcbiIsIGVzdF9mcmVxLzEwMDAwMDAsIAorCXByaW50aygiQ1BVIGZyZXF1ZW5jeSAlZC4lMDJkIE1IelxuIiwgZXN0X2ZyZXEvMTAwMDAwMCwKIAkgICAgICAgKGVzdF9mcmVxJTEwMDAwMDApKjEwMC8xMDAwMDAwKTsKICAJc2V0X2F1MXgwMF9zcGVlZChlc3RfZnJlcSk7CiAgCXNldF9hdTF4MDBfbGNkX2Nsb2NrKCk7IC8vIHByb2dyYW0gdGhlIExDRCBjbG9jawpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9jc2IyNTAvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hdTEwMDAvY3NiMjUwL2JvYXJkX3NldHVwLmMKaW5kZXggOTA0MjZlYS4uMWM1NWM1ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2F1MTAwMC9jc2IyNTAvYm9hcmRfc2V0dXAuYworKysgYi9hcmNoL21pcHMvYXUxMDAwL2NzYjI1MC9ib2FyZF9zZXR1cC5jCkBAIC0xODIsNyArMTgyLDcgQEAKIAlhdV93cml0ZWwoMHhmMDAwMDAwMCwgQXUxNTAwX1BDSV9NV01BU0tfREVWKTsKIAlhdV93cml0ZWwoMCwgQXUxNTAwX1BDSV9NV0JBU0VfUkVWX0NDTCk7CiAJYXVfd3JpdGVsKDB4MDJhMDAzNTYsIEF1MTUwMF9QQ0lfU1RBVENNRCk7Ci0JYXVfd3JpdGVsKDB4MDAwMDNjMDQsIEF1MTUwMF9QQ0lfSERSVFlQRSk7CQorCWF1X3dyaXRlbCgweDAwMDAzYzA0LCBBdTE1MDBfUENJX0hEUlRZUEUpOwogCWF1X3dyaXRlbCgweDAwMDAwMDA4LCBBdTE1MDBfUENJX01CQVIpOwogCWF1X3N5bmMoKTsKIApAQCAtMjE2LDcgKzIxNiw3IEBACiAJdW5zaWduZWQgaW50CWdwaW8yX3BpbnM7CiAKIAlyZXR2YWwgPSAxOwotCQorCiAJLyogRmlyc3QsIGRpc2FibGUgYm90aCBzZWxlY3RzLCB0aGVuIGFzc2VydCB0aGUgb25lIHJlcXVlc3RlZC4KIAkqLwogCWF1X3dyaXRlbCgweGMwMDBjMDAwLCBHUElPMl9PVVRQVVQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9jc2IyNTAvaW5pdC5jIGIvYXJjaC9taXBzL2F1MTAwMC9jc2IyNTAvaW5pdC5jCmluZGV4IDQzMjAwNTcuLmJkOTk3MzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hdTEwMDAvY3NiMjUwL2luaXQuYworKysgYi9hcmNoL21pcHMvYXUxMDAwL2NzYjI1MC9pbml0LmMKQEAgLTgxLDcgKzgxLDcgQEAKIAljc2JfZW52WzBdID0gZW52MTsKIAogCW1pcHNfbWFjaGdyb3VwID0gTUFDSF9HUk9VUF9BTENIRU1ZOwotCW1pcHNfbWFjaHR5cGUgPSBNQUNIX0NTQjI1MDsgIAorCW1pcHNfbWFjaHR5cGUgPSBNQUNIX0NTQjI1MDsKIAogCXByb21faW5pdF9jbWRsaW5lKCk7CiAJbWVtc2l6ZV9zdHIgPSBwcm9tX2dldGVudigibWVtc2l6ZSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9kYjF4MDAvaW5pdC5jIGIvYXJjaC9taXBzL2F1MTAwMC9kYjF4MDAvaW5pdC5jCmluZGV4IDUxZWVlOTQuLjRiOWQ1ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hdTEwMDAvZGIxeDAwL2luaXQuYworKysgYi9hcmNoL21pcHMvYXUxMDAwL2RiMXgwMC9pbml0LmMKQEAgLTYxLDcgKzYxLDcgQEAKIAlwcm9tX2VudnAgPSAoY2hhciAqKikgZndfYXJnMjsKIAogCW1pcHNfbWFjaGdyb3VwID0gTUFDSF9HUk9VUF9BTENIRU1ZOwotCW1pcHNfbWFjaHR5cGUgPSBNQUNIX0RCMTAwMDsJLyogc2V0IHRoZSBwbGF0Zm9ybSAjICovICAgCisJbWlwc19tYWNodHlwZSA9IE1BQ0hfREIxMDAwOwkvKiBzZXQgdGhlIHBsYXRmb3JtICMgKi8KIAogCXByb21faW5pdF9jbWRsaW5lKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvaHlkcm9nZW4zL2luaXQuYyBiL2FyY2gvbWlwcy9hdTEwMDAvaHlkcm9nZW4zL2luaXQuYwppbmRleCBlZWU0YWRmLi44Y2M5ODc5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYXUxMDAwL2h5ZHJvZ2VuMy9pbml0LmMKKysrIGIvYXJjaC9taXBzL2F1MTAwMC9oeWRyb2dlbjMvaW5pdC5jCkBAIC02Myw3ICs2Myw3IEBACiAJcHJvbV9lbnZwID0gZW52cDsKIAogCW1pcHNfbWFjaGdyb3VwID0gTUFDSF9HUk9VUF9BTENIRU1ZOwotCW1pcHNfbWFjaHR5cGUgPSBNQUNIX0RCMTAwMDsJLyogc2V0IHRoZSBwbGF0Zm9ybSAjICovICAgCisJbWlwc19tYWNodHlwZSA9IE1BQ0hfREIxMDAwOwkvKiBzZXQgdGhlIHBsYXRmb3JtICMgKi8KIAlwcm9tX2luaXRfY21kbGluZSgpOwogCiAJbWVtc2l6ZV9zdHIgPSBwcm9tX2dldGVudigibWVtc2l6ZSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9wYjEwMDAvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hdTEwMDAvcGIxMDAwL2JvYXJkX3NldHVwLmMKaW5kZXggMmZhMjExYi4uMGI0ODA3ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2F1MTAwMC9wYjEwMDAvYm9hcmRfc2V0dXAuYworKysgYi9hcmNoL21pcHMvYXUxMDAwL3BiMTAwMC9ib2FyZF9zZXR1cC5jCkBAIC0xNzQsNyArMTc0LDcgQEAKIAljYXNlIDB4MDI6IC8qIEhCICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6ICAvKiBIQyBhbmQgbmV3ZXIgKi8KLQkJLyogRW5hYmxlIHN5cyBidXMgY2xvY2sgZGl2aWRlciB3aGVuIElETEUgc3RhdGUgb3Igbm8gYnVzIAorCQkvKiBFbmFibGUgc3lzIGJ1cyBjbG9jayBkaXZpZGVyIHdoZW4gSURMRSBzdGF0ZSBvciBubyBidXMKIAkJICAgYWN0aXZpdHkuICovCiAJCWF1X3dyaXRlbChhdV9yZWFkbChTWVNfUE9XRVJDVFJMKSB8ICgweDMgPDwgNSksIFNZU19QT1dFUkNUUkwpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAveHhzMTUwMC9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2F1MTAwMC94eHMxNTAwL2JvYXJkX3NldHVwLmMKaW5kZXggOWRhZGM4Mi4uMWU1OTQzMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2F1MTAwMC94eHMxNTAwL2JvYXJkX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2F1MTAwMC94eHMxNTAwL2JvYXJkX3NldHVwLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIHZvaWQgX19pbml0IGJvYXJkX3NldHVwKHZvaWQpCiB7CiAJdTMyIHBpbl9mdW5jOwotCQorCiAJLy8gc2V0IG11bHRpcGxlIHVzZSBwaW5zIChVQVJUMy9HUElPKSB0byBVQVJUIChpdCdzIHVzZWQgYXMgVUFSVCB0b28pCiAJcGluX2Z1bmMgPSBhdV9yZWFkbChTWVNfUElORlVOQykgJiAodTMyKSh+U1lTX1BGX1VSMyk7CiAJcGluX2Z1bmMgfD0gU1lTX1BGX1VSMzsKQEAgLTc1LDExICs3NSwxMSBAQAogCWF1X3dyaXRlbCgxLCBHUElPMl9FTkFCTEUpOwogCS8qIGdwaW8yIDIwOC85LzEwLzExIGFyZSBpbnB1dHMgKi8KIAlhdV93cml0ZWwoKDE8PDgpIHwgKDE8PDkpIHwgKDE8PDEwKSB8ICgxPDwxMSksIEdQSU8yX0RJUik7Ci0JCisKIAkvKiB0dXJuIG9mZiBwb3dlciAqLwogCWF1X3dyaXRlbCgoYXVfcmVhZGwoR1BJTzJfUElOU1RBVEUpICYgfigxPDwxNCkpfCgxPDwzMCksIEdQSU8yX09VVFBVVCk7CiAjZW5kaWYKLQkKKwogCiAjaWZkZWYgQ09ORklHX1BDSQogI2lmIGRlZmluZWQoX19NSVBTRUJfXykKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAveHhzMTUwMC9pbml0LmMgYi9hcmNoL21pcHMvYXUxMDAwL3h4czE1MDAvaW5pdC5jCmluZGV4IDAzZjc1NTIuLmYxYzc2NTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hdTEwMDAveHhzMTUwMC9pbml0LmMKKysrIGIvYXJjaC9taXBzL2F1MTAwMC94eHMxNTAwL2luaXQuYwpAQCAtNTUsNyArNTUsNyBAQAogCXByb21fZW52cCA9IChjaGFyICoqKSBmd19hcmcyOwogCiAJbWlwc19tYWNoZ3JvdXAgPSBNQUNIX0dST1VQX0FMQ0hFTVk7Ci0JbWlwc19tYWNodHlwZSA9IE1BQ0hfWFhTMTUwMDsJLyogc2V0IHRoZSBwbGF0Zm9ybSAjICovICAgCisJbWlwc19tYWNodHlwZSA9IE1BQ0hfWFhTMTUwMDsJLyogc2V0IHRoZSBwbGF0Zm9ybSAjICovCiAKIAlwcm9tX2luaXRfY21kbGluZSgpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL3h4czE1MDAvaXJxbWFwLmMgYi9hcmNoL21pcHMvYXUxMDAwL3h4czE1MDAvaXJxbWFwLmMKaW5kZXggOTU0ODAwYS4uNTJmMmY3ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2F1MTAwMC94eHMxNTAwL2lycW1hcC5jCisrKyBiL2FyY2gvbWlwcy9hdTEwMDAveHhzMTUwMC9pcnFtYXAuYwpAQCAtNTYsNyArNTYsNyBAQAogCXsgQVUxNTAwX0dQSU9fMjA3LCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKIAogCXsgQVUxMDAwX0dQSU9fMCwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfR1BJT18xLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwgCisJeyBBVTEwMDBfR1BJT18xLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKIAl7IEFVMTAwMF9HUElPXzIsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAogCXsgQVUxMDAwX0dQSU9fMywgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCiAJeyBBVTEwMDBfR1BJT180LCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwgLyogQ0YgaW50ZXJydXB0ICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9hdGxhc19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9hdGxhc19kZWZjb25maWcKaW5kZXggY2FhZDdjYS4uMzEyMGEwMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvYXRsYXNfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2F0bGFzX2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo0OTowMCAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtODgsNiArODgsNyBAQAogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQogQ09ORklHX01JUFNfQk9OSVRPNjQ9eQogQ09ORklHX01JUFNfTVNDPXkKICMgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2NhcGNlbGxhX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2NhcGNlbGxhX2RlZmNvbmZpZwppbmRleCAxYjdmOGE3Li4xNThlNzE2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9jYXBjZWxsYV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvY2FwY2VsbGFfZGVmY29uZmlnCkBAIC00LDkgKzQsOSBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjAwIDIwMDUKICMKIENPTkZJR19NSVBTPXkKLSMgQ09ORklHX01JUFM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlQUzMyPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR18zMkJJVD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC05Nyw2ICs5Nyw3IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX0lSUV9DUFU9eQogQ09ORklHX01JUFNfTDFfQ0FDSEVfU0hJRlQ9NQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvY29iYWx0X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2NvYmFsdF9kZWZjb25maWcKaW5kZXggODg2MTg1NC4uNDMwMmM2ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvY29iYWx0X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9jb2JhbHRfZGVmY29uZmlnCkBAIC00LDkgKzQsOSBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjAwIDIwMDUKICMKIENPTkZJR19NSVBTPXkKLSMgQ09ORklHX01JUFM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlQUzMyPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR18zMkJJVD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC04Miw2ICs4Miw3IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfSTgyNTk9eQogQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKIENPTkZJR19JUlFfQ1BVPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2RiMTAwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9kYjEwMDBfZGVmY29uZmlnCmluZGV4IDE5Y2FjMWIuLjk2MmZjMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2RiMTAwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMDAwX2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo0OTowMSAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtMTA0LDYgKzEwNCw3IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX01JUFNfTDFfQ0FDSEVfU0hJRlQ9NQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kYjExMDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMTAwX2RlZmNvbmZpZwppbmRleCAwMzVhYzk1Li42YTUyOGQ0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9kYjExMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTEwMF9kZWZjb25maWcKQEAgLTQsOSArNCw5IEBACiAjIFdlZCBKYW4gMjYgMDI6NDk6MDEgMjAwNQogIwogQ09ORklHX01JUFM9eQotIyBDT05GSUdfTUlQUzY0IGlzIG5vdCBzZXQKICMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19NSVBTMzI9eQorIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAorQ09ORklHXzMyQklUPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTEwNCw2ICsxMDQsNyBAQAogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQogQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKIENPTkZJR19NSVBTX0wxX0NBQ0hFX1NISUZUPTUKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTUwMF9kZWZjb25maWcKaW5kZXggYzM4YzRlZC4uZmVkNmYyZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kYjE1MDBfZGVmY29uZmlnCkBAIC00LDkgKzQsOSBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjAxIDIwMDUKICMKIENPTkZJR19NSVBTPXkKLSMgQ09ORklHX01JUFM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlQUzMyPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR18zMkJJVD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kYjE1NTBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTUwX2RlZmNvbmZpZwppbmRleCBlZTgxMzA5Li4xNzhjMGFkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9kYjE1NTBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTU1MF9kZWZjb25maWcKQEAgLTQsOSArNCw5IEBACiAjIFdlZCBKYW4gMjYgMDI6NDk6MDIgMjAwNQogIwogQ09ORklHX01JUFM9eQotIyBDT05GSUdfTUlQUzY0IGlzIG5vdCBzZXQKICMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19NSVBTMzI9eQorIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAorQ09ORklHXzMyQklUPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2RkYjU0NzZfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGRiNTQ3Nl9kZWZjb25maWcKaW5kZXggZDQzZWQ1Ny4uNzBhZGRjNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGRiNTQ3Nl9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGRiNTQ3Nl9kZWZjb25maWcKQEAgLTQsOSArNCw5IEBACiAjIFdlZCBKYW4gMjYgMDI6NDk6MDIgMjAwNQogIwogQ09ORklHX01JUFM9eQotIyBDT05GSUdfTUlQUzY0IGlzIG5vdCBzZXQKICMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19NSVBTMzI9eQorIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAorQ09ORklHXzMyQklUPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTgyLDYgKzgyLDcgQEAKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfSEFWRV9ERUNfTE9DSz15CiBDT05GSUdfRE1BX05PTkNPSEVSRU5UPXkKK0NPTkZJR19ETUFfTkVFRF9QQ0lfTUFQX1NUQVRFPXkKIENPTkZJR19JODI1OT15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX0lSUV9DUFU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGRiNTQ3N19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9kZGI1NDc3X2RlZmNvbmZpZwppbmRleCA1YTAzMmNkLi42MDI5MjgwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9kZGI1NDc3X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kZGI1NDc3X2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo0OTowMiAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtODMsNiArODMsNyBAQAogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQogQ09ORklHX0k4MjU5PXkKIENPTkZJR19DUFVfTElUVExFX0VORElBTj15CiBDT05GSUdfSVJRX0NQVT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kZWNzdGF0aW9uX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RlY3N0YXRpb25fZGVmY29uZmlnCmluZGV4IDMyYWRhNzkuLjY2ZWMxZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2RlY3N0YXRpb25fZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2RlY3N0YXRpb25fZGVmY29uZmlnCkBAIC00LDkgKzQsOSBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjAzIDIwMDUKICMKIENPTkZJR19NSVBTPXkKLSMgQ09ORklHX01JUFM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlQUzMyPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR18zMkJJVD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC04OCw2ICs4OCw3IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DUFVfTElUVExFX0VORElBTj15CiBDT05GSUdfSVJRX0NQVT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9lNTVfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZTU1X2RlZmNvbmZpZwppbmRleCA1MjA3NGEyMC4uYmEyZWMwMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZTU1X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9lNTVfZGVmY29uZmlnCkBAIC00LDkgKzQsOSBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjAzIDIwMDUKICMKIENPTkZJR19NSVBTPXkKLSMgQ09ORklHX01JUFM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlQUzMyPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR18zMkJJVD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC05Niw2ICs5Niw3IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX0lSUV9DUFU9eQogQ09ORklHX01JUFNfTDFfQ0FDSEVfU0hJRlQ9NQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZXY2NDEyMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9ldjY0MTIwX2RlZmNvbmZpZwppbmRleCAzNjBlODQyLi4xN2U4N2Y3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9ldjY0MTIwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9ldjY0MTIwX2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo0OTowMyAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtODksNiArODksNyBAQAogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQogIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAogQ09ORklHX01JUFNfR1Q2NDEyMD15CiAjIENPTkZJR19TWVNDTEtfNzUgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZXY5NjEwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9ldjk2MTAwX2RlZmNvbmZpZwppbmRleCA2NTdhOTUwLi45ZGE0MTQwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9ldjk2MTAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9ldjk2MTAwX2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo0OTowMyAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtODgsNiArODgsNyBAQAogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQogIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAogQ09ORklHX0lSUV9DUFU9eQogQ09ORklHX01JUFNfR1Q2NDEyMD15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9pcDIyX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2lwMjJfZGVmY29uZmlnCmluZGV4IDNmYjEwMmUuLjE3ZmE1YzQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2lwMjJfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2lwMjJfZGVmY29uZmlnCkBAIC00LDkgKzQsOSBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjA0IDIwMDUKICMKIENPTkZJR19NSVBTPXkKLSMgQ09ORklHX01JUFM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlQUzMyPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR18zMkJJVD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC05MCw2ICs5MCw3IEBACiBDT05GSUdfSEFWRV9ERUNfTE9DSz15CiBDT05GSUdfQVJDPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQogIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAogQ09ORklHX0lSUV9DUFU9eQogQ09ORklHX1NXQVBfSU9fU1BBQ0U9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvaXAyN19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9pcDI3X2RlZmNvbmZpZwppbmRleCBiNWJhYjNhLi5iMmE2N2RhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9pcDI3X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9pcDI3X2RlZmNvbmZpZwpAQCAtNCw3ICs0LDcgQEAKICMgV2VkIEphbiAyNiAwMjo0OTowNCAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci1DT05GSUdfTUlQUzY0PXkKK0NPTkZJR182NEJJVD15CiBDT05GSUdfNjRCSVQ9eQogCiAjCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9pcDMyX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2lwMzJfZGVmY29uZmlnCmluZGV4IGJkZjE0MTUuLmIyNmUxMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2lwMzJfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2lwMzJfZGVmY29uZmlnCkBAIC00LDcgKzQsNyBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjA0IDIwMDUKICMKIENPTkZJR19NSVBTPXkKLUNPTkZJR19NSVBTNjQ9eQorQ09ORklHXzY0QklUPXkKIENPTkZJR182NEJJVD15CiAKICMKQEAgLTg0LDYgKzg0LDcgQEAKIENPTkZJR19ETUFfSVAzMj15CiBDT05GSUdfT1dOX0RNQT15CiBDT05GSUdfRE1BX05PTkNPSEVSRU5UPXkKK0NPTkZJR19ETUFfTkVFRF9QQ0lfTUFQX1NUQVRFPXkKICMgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19BUkMzMj15CiBDT05GSUdfQk9PVF9FTEYzMj15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9pdDgxNzJfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvaXQ4MTcyX2RlZmNvbmZpZwppbmRleCAxY2E3NzQ2Li4wOGJkM2FkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9pdDgxNzJfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2l0ODE3Ml9kZWZjb25maWcKQEAgLTQsOSArNCw5IEBACiAjIFdlZCBKYW4gMjYgMDI6NDk6MDUgMjAwNQogIwogQ09ORklHX01JUFM9eQotIyBDT05GSUdfTUlQUzY0IGlzIG5vdCBzZXQKICMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19NSVBTMzI9eQorIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAorQ09ORklHXzMyQklUPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTkwLDYgKzkwLDcgQEAKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfSEFWRV9ERUNfTE9DSz15CiBDT05GSUdfRE1BX05PTkNPSEVSRU5UPXkKK0NPTkZJR19ETUFfTkVFRF9QQ0lfTUFQX1NUQVRFPXkKIENPTkZJR19DUFVfTElUVExFX0VORElBTj15CiBDT05GSUdfSVRFX0JPQVJEX0dFTj15CiBDT05GSUdfSVQ4MTcyX0NJUj15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9pdnJfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvaXZyX2RlZmNvbmZpZwppbmRleCBjNmVlZjcwLi41ODNlZjVjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9pdnJfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2l2cl9kZWZjb25maWcKQEAgLTQsOSArNCw5IEBACiAjIFdlZCBKYW4gMjYgMDI6NDk6MDUgMjAwNQogIwogQ09ORklHX01JUFM9eQotIyBDT05GSUdfTUlQUzY0IGlzIG5vdCBzZXQKICMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19NSVBTMzI9eQorIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAorQ09ORklHXzMyQklUPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTg5LDYgKzg5LDcgQEAKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfSEFWRV9ERUNfTE9DSz15CiBDT05GSUdfRE1BX05PTkNPSEVSRU5UPXkKK0NPTkZJR19ETUFfTkVFRF9QQ0lfTUFQX1NUQVRFPXkKIENPTkZJR19DUFVfTElUVExFX0VORElBTj15CiBDT05GSUdfSVRFX0JPQVJEX0dFTj15CiBDT05GSUdfSVQ4MTcyX0NJUj15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9qYWd1YXItYXR4X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2phZ3Vhci1hdHhfZGVmY29uZmlnCmluZGV4IDc1N2M0ZTguLjhhYmI1YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2phZ3Vhci1hdHhfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2phZ3Vhci1hdHhfZGVmY29uZmlnCkBAIC00LDkgKzQsOSBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjA1IDIwMDUKICMKIENPTkZJR19NSVBTPXkKLSMgQ09ORklHX01JUFM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlQUzMyPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR18zMkJJVD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC04MSw2ICs4MSw3IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfTElNSVRFRF9ETUE9eQogIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAogQ09ORklHX0lSUV9DUFU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvam1yMzkyN19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZwppbmRleCBlNWE2MTM5Li5kYTVkOWVlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo0OTowNiAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtODIsNiArODIsNyBAQAogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQogIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAogQ09ORklHX01JUFNfVFgzOTI3PXkKIENPTkZJR19TV0FQX0lPX1NQQUNFPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2xhc2F0MjAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2xhc2F0MjAwX2RlZmNvbmZpZwppbmRleCAxZTc2OTc4Li44ZDYwMGFlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9sYXNhdDIwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbGFzYXQyMDBfZGVmY29uZmlnCkBAIC00LDkgKzQsOSBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjA2IDIwMDUKICMKIENPTkZJR19NSVBTPXkKLSMgQ09ORklHX01JUFM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlQUzMyPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR18zMkJJVD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC05Miw2ICs5Miw3IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfTUlQU19OSUxFND15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX01JUFNfR1Q2NDEyMD15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9kZWZjb25maWcKaW5kZXggNjFmYjlmYi4uNzk1MTlhYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo1MzoxNCAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtODgsNiArODgsNyBAQAogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQogQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15CiBDT05GSUdfSTgyNTk9eQogQ09ORklHX01JUFNfQk9OSVRPNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbXBjMzB4X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL21wYzMweF9kZWZjb25maWcKaW5kZXggMzFiOGYyYS4uMGZlYTU3ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbXBjMzB4X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9tcGMzMHhfZGVmY29uZmlnCkBAIC00LDkgKzQsOSBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjA3IDIwMDUKICMKIENPTkZJR19NSVBTPXkKLSMgQ09ORklHX01JUFM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlQUzMyPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR18zMkJJVD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC05Nyw2ICs5Nyw3IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX0lSUV9DUFU9eQogQ09ORklHX01JUFNfTDFfQ0FDSEVfU0hJRlQ9NQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90XzNfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90XzNfZGVmY29uZmlnCmluZGV4IDJjY2U2ODIuLmI0Y2Y5N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF8zX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfM19kZWZjb25maWcKQEAgLTQsOSArNCw5IEBACiAjIFdlZCBKYW4gMjYgMDI6NDk6MDcgMjAwNQogIwogQ09ORklHX01JUFM9eQotIyBDT05GSUdfTUlQUzY0IGlzIG5vdCBzZXQKICMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19NSVBTMzI9eQorIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAorQ09ORklHXzMyQklUPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTg5LDYgKzg5LDcgQEAKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfSEFWRV9ERUNfTE9DSz15CiBDT05GSUdfRE1BX05PTkNPSEVSRU5UPXkKK0NPTkZJR19ETUFfTkVFRF9QQ0lfTUFQX1NUQVRFPXkKICMgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19JUlFfQ1BVPXkKIENPTkZJR19JUlFfQ1BVX1JNN0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2NfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2NfZGVmY29uZmlnCmluZGV4IDBjYmY0OGEuLmEzODkwM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9jX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfY19kZWZjb25maWcKQEAgLTQsNyArNCw3IEBACiAjIFdlZCBKYW4gMjYgMDI6NDk6MDcgMjAwNQogIwogQ09ORklHX01JUFM9eQotQ09ORklHX01JUFM2ND15CitDT05GSUdfNjRCSVQ9eQogQ09ORklHXzY0QklUPXkKIAogIwpAQCAtODAsNiArODAsNyBAQAogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQogIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAogQ09ORklHX0lSUV9DUFU9eQogQ09ORklHX0lSUV9NVjY0MzQwPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfZGVmY29uZmlnCmluZGV4IDQwNDM5NTAuLjkyMGQ1OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo0OTowOCAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtODIsNiArODIsNyBAQAogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQogIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAogQ09ORklHX0lSUV9DUFU9eQogQ09ORklHX0lSUV9DUFVfUk03Sz15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfZ19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfZ19kZWZjb25maWcKaW5kZXggMzg3MGFmNC4uZWY1ZWE1MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2dfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9nX2RlZmNvbmZpZwpAQCAtNCw3ICs0LDcgQEAKICMgV2VkIEphbiAyNiAwMjo0OTowOCAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci1DT05GSUdfTUlQUzY0PXkKK0NPTkZJR182NEJJVD15CiBDT05GSUdfNjRCSVQ9eQogCiAjCkBAIC04MCw2ICs4MCw3IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiAjIENPTkZJR19DUFVfTElUVExFX0VORElBTiBpcyBub3Qgc2V0CiBDT05GSUdfSVJRX0NQVT15CiBDT05GSUdfSVJRX0NQVV9STTdLPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3BiMTEwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9wYjExMDBfZGVmY29uZmlnCmluZGV4IDZjZGFiZDUuLjgxM2UzYTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3BiMTEwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvcGIxMTAwX2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo0OTowOCAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtMTA0LDYgKzEwNCw3IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX1NXQVBfSU9fU1BBQ0U9eQogIyBDT05GSUdfQVUxWDAwX1VTQl9ERVZJQ0UgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3BiMTUwMF9kZWZjb25maWcKaW5kZXggMmFlYmJkMi4uNDllNTI4MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3BiMTUwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTAwX2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo0OTowOSAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTUwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3BiMTU1MF9kZWZjb25maWcKaW5kZXggOWUyMWVkYy4uOGU0MjY3NyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTUwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9wYjE1NTBfZGVmY29uZmlnCkBAIC00LDkgKzQsOSBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjA5IDIwMDUKICMKIENPTkZJR19NSVBTPXkKLSMgQ09ORklHX01JUFM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlQUzMyPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR18zMkJJVD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9vc3ByZXlfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvcWVtdV9kZWZjb25maWcKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2NvbmZpZ3Mvb3NwcmV5X2RlZmNvbmZpZwpyZW5hbWUgdG8gYXJjaC9taXBzL2NvbmZpZ3MvcWVtdV9kZWZjb25maWcKaW5kZXggOTg5Y2I5ZS4uYjY1NjhlNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL29zcHJleV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvcWVtdV9kZWZjb25maWcKQEAgLTEsMTA4ICsxLDEzMyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjExLXJjMgotIyBXZWQgSmFuIDI2IDAyOjQ5OjA4IDIwMDUKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMy1yYzYKKyMgTW9uIEF1ZyAgOCAxMTo0OTo1NCAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAotIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCiAjCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKKyMgQ09ORklHX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0CiBDT05GSUdfQ0xFQU5fQ09NUElMRT15CiBDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiAKICMKICMgR2VuZXJhbCBzZXR1cAogIwogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgotQ09ORklHX1NXQVA9eQotQ09ORklHX1NZU1ZJUEM9eQotIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVklQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfU1lTQ1RMIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKIENPTkZJR19LT0JKRUNUX1VFVkVOVD15CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfRU1CRURERUQ9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15CitDT05GSUdfUFJJTlRLPXkKKyMgQ09ORklHX0JVRyBpcyBub3Qgc2V0CisjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAorIyBDT05GSUdfRlVURVggaXMgbm90IHNldAorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAotQ09ORklHX1NITUVNPXkKKyMgQ09ORklHX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAogQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCiBDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAogQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX1RJTllfU0hNRU09eQorQ09ORklHX0JBU0VfU01BTEw9MQogCiAjCiAjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CiAjCi1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKLUNPTkZJR19NT0RWRVJTSU9OUz15Ci1DT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMPXkKLUNPTkZJR19LTU9EPXkKKyMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAogCiAjCiAjIE1hY2hpbmUgc2VsZWN0aW9uCiAjCi0jIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9WUjQxWFggaXMgbm90IHNldAotIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfTVRYMSBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX0JPU1BPUlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfUEIxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfUEIxMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfUEIxNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfUEIxNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfUEIxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfREIxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfREIxMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfREIxNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfREIxNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfREIxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfTUlSQUdFIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBU0FUIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldAorIyBDT05GSUdfTEFTQVQgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19BVExBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX01BTFRBIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfU0VBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT01FTkNPX09DRUxPVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT01FTkNPX09DRUxPVF9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PTUVOQ09fT0NFTE9UX0MgaXMgbm90IHNldAotIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfMyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT01FTkNPX0pBR1VBUl9BVFggaXMgbm90IHNldAotIyBDT05GSUdfUE1DX1lPU0VNSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PTUVOQ09fT0NFTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PTUVOQ09fT0NFTE9UXzMgaXMgbm90IHNldAorIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfQyBpcyBub3Qgc2V0CisjIENPTkZJR19NT01FTkNPX09DRUxPVF9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfWFhTMTUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QTlg4NTUwX1YyUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BOWDg1NTBfSkJTIGlzIG5vdCBzZXQKICMgQ09ORklHX0REQjUwNzQgaXMgbm90IHNldAogIyBDT05GSUdfRERCNTQ3NiBpcyBub3Qgc2V0CiAjIENPTkZJR19EREI1NDc3IGlzIG5vdCBzZXQKLUNPTkZJR19ORUNfT1NQUkVZPXkKKyMgQ09ORklHX01BQ0hfVlI0MVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNQ19ZT1NFTUlURSBpcyBub3Qgc2V0CitDT05GSUdfUUVNVT15CiAjIENPTkZJR19TR0lfSVAyMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT0NfQVUxWDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJQllURV9TQjF4eHhfU09DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JUDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJQllURV9TV0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfU0VOVE9TQSBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfUkhPTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0lCWVRFX0NBUk1FTCBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfUFRTV0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldAogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKLUNPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQotQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKLUNPTkZJR19JUlFfQ1BVPXkKK0NPTkZJR19ETUFfQ09IRVJFTlQ9eQorQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15CitDT05GSUdfSTgyNTk9eQorQ09ORklHX0NQVV9CSUdfRU5ESUFOPXkKKyMgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNfU1VQUE9SVFNfQklHX0VORElBTj15CitDT05GSUdfU1dBUF9JT19TUEFDRT15CiBDT05GSUdfTUlQU19MMV9DQUNIRV9TSElGVD01Ci1DT05GSUdfVlI0MTgxPXkKK0NPTkZJR19IQVZFX1NURF9QQ19TRVJJQUxfUE9SVD15CiAKICMKICMgQ1BVIHNlbGVjdGlvbgogIwotIyBDT05GSUdfQ1BVX01JUFMzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfTUlQUzY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9NSVBTMzJfUjEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX01JUFMzMl9SMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfTUlQUzY0X1IxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9NSVBTNjRfUjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1IzMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9UWDM5WFggaXMgbm90IHNldAotQ09ORklHX0NQVV9WUjQxWFg9eQorIyBDT05GSUdfQ1BVX1ZSNDFYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfUjQzMDAgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I0WDAwIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfUjRYMDA9eQogIyBDT05GSUdfQ1BVX1RYNDlYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfUjUwMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1I1NDMyIGlzIG5vdCBzZXQKQEAgLTExMywxNyArMTM4LDM2IEBACiAjIENPTkZJR19DUFVfUk03MDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9STTkwMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NCMSBpcyBub3Qgc2V0CitDT05GSUdfU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTD15CitDT05GSUdfQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTD15CitDT05GSUdfQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTD15CisKKyMKKyMgS2VybmVsIHR5cGUKKyMKK0NPTkZJR18zMkJJVD15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfUEFHRV9TSVpFXzRLQj15CiAjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfU0laRV8xNktCIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfTVQgaXMgbm90IHNldAorIyBDT05GSUdfNjRCSVRfUEhZU19BRERSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0hBU19MTFNDPXkKK0NPTkZJR19DUFVfSEFTX0xMRFNDRD15CiBDT05GSUdfQ1BVX0hBU19TWU5DPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgSVNBLCBUQykKICMKK0NPTkZJR19JU0E9eQogQ09ORklHX01NVT15CiAKICMKQEAgLTEzMiwxMCArMTc2LDYgQEAKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKICMKLSMgUEMtY2FyZCBicmlkZ2VzCi0jCi0KLSMKICMgUENJIEhvdHBsdWcgU3VwcG9ydAogIwogCkBAIC0xNDcsNiArMTg3LDU2IEBACiBDT05GSUdfVFJBRF9TSUdOQUxTPXkKIAogIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9UQ1BESUFHPXkKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKworIwogIyBEZXZpY2UgRHJpdmVycwogIwogCkBAIC0xNTQsNyArMjQ0LDcgQEAKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogCiAjCkBAIC0xNzAsNiArMjYwLDcgQEAKICMKICMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CiAjCisjIENPTkZJR19QTlAgaXMgbm90IHNldAogCiAjCiAjIEJsb2NrIGRldmljZXMKQEAgLTE4MSwxOSArMjcyLDE2IEBACiAjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi0jIENPTkZJR19MQkQgaXMgbm90IHNldAotQ09ORklHX0NEUk9NX1BLVENEVkQ9bQotQ09ORklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz04Ci0jIENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCiAjCiBDT05GSUdfSU9TQ0hFRF9OT09QPXkKLUNPTkZJR19JT1NDSEVEX0FTPXkKLUNPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKLUNPTkZJR19JT1NDSEVEX0NGUT15Ci1DT05GSUdfQVRBX09WRVJfRVRIPW0KKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAogCiAjCiAjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKQEAgLTIwNiw2ICsyOTQsMTEgQEAKICMgQ09ORklHX1NDU0kgaXMgbm90IHNldAogCiAjCisjIE9sZCBDRC1ST00gZHJpdmVycyAobm90IFNDU0ksIG5vdCBJREUpCisjCisjIENPTkZJR19DRF9OT19JREVTQ1NJIGlzIG5vdCBzZXQKKworIwogIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQogIwogIyBDT05GSUdfTUQgaXMgbm90IHNldApAQCAtMjEzLDYgKzMwNiw3IEBACiAjCiAjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKICMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CiAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydApAQCAtMjIzLDg0ICszMTcsNDEgQEAKICMKIAogIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi1DT05GSUdfUEFDS0VUPXkKLSMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRMSU5LX0RFVj15Ci1DT05GSUdfVU5JWD15Ci1DT05GSUdfTkVUX0tFWT15Ci1DT05GSUdfSU5FVD15Ci0jIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlA9eQotIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUF9CT09UUD15Ci0jIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX1RVTk5FTD1tCi1DT05GSUdfSVBfVENQRElBRz1tCi0jIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotQ09ORklHX1hGUk09eQotQ09ORklHX1hGUk1fVVNFUj1tCi0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVEhFUlRBUCBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCiAjCiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKLSMgQ09ORklHX01JSSBpcyBub3Qgc2V0CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1JBQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfSVNBPXkKKyMgQ09ORklHX0UyMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VXUkszIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFWFBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFWFBSRVNTX1BSTyBpcyBub3Qgc2V0CisjIENPTkZJR19IUExBTl9QTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xQNDg2RSBpcyBub3Qgc2V0CisjIENPTkZJR19FVEgxNkkgaXMgbm90IHNldAorQ09ORklHX05FMjAwMD15CisjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0NLRVQgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwIE1iaXQpCkBAIC0zMTMsNiArMzY0LDcgQEAKICMKICMgVG9rZW4gUmluZyBkZXZpY2VzCiAjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CiAKICMKICMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCkBAIC0zMjUsOCArMzc3LDggQEAKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAogCiAjCiAjIElTRE4gc3Vic3lzdGVtCkBAIC0zNDYsMjggKzM5OCwxMyBAQAogIwogIyBVc2VybGFuZCBpbnRlcmZhY2VzCiAjCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAogCiAjCi0jIElucHV0IEkvTyBkcml2ZXJzCi0jCi0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotQ09ORklHX1NFUklPPXkKLSMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJT19TRVJQT1JUPXkKLSMgQ09ORklHX1NFUklPX0NUODJDNzEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX0xJQlBTMiBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSU9fUkFXPW0KLQotIwogIyBJbnB1dCBEZXZpY2UgRHJpdmVycwogIwogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldApAQCAtMzc3LDYgKzQxNCwxMiBAQAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKICMgQ2hhcmFjdGVyIGRldmljZXMKICMKIENPTkZJR19WVD15CkBAIC0zOTcsOSArNDQwLDggQEAKICMKIENPTkZJR19TRVJJQUxfQ09SRT15CiBDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorIyBDT05GSUdfVU5JWDk4X1BUWVMgaXMgbm90IHNldAorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAogCiAjCiAjIElQTUkKQEAgLTQxOCwxMyArNDYwLDE3IEBACiAjCiAjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgogIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCisjIFRQTSBkZXZpY2VzCisjCisKKyMKICMgSTJDIHN1cHBvcnQKICMKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0VOU09SIGlzIG5vdCBzZXQKIAogIwogIyBEYWxsYXMncyAxLXdpcmUgYnVzCkBAIC00MzIsNiArNDc4LDExIEBACiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAKICMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisKKyMKICMgTWlzYyBkZXZpY2VzCiAjCiAKQEAgLTQ1Myw5ICs1MDQsOSBAQAogIwogIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKICMKLSMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19WR0FfQ09OU09MRT15CisjIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVlfQ09OU09MRT15Ci0jIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAogCiAjCiAjIFNvdW5kCkBAIC00NjksMTAgKzUyMCw2IEBACiAjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CiAKICMKLSMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCi0jCi0KLSMKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKQEAgLTQ4OCwxOSArNTM1LDI4IEBACiAjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKIAogIworIyBTTiBEZXZpY2VzCisjCisKKyMKICMgRmlsZSBzeXN0ZW1zCiAjCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KQkQgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisKKyMKKyMgWEZTIHN1cHBvcnQKKyMKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE5PVElGWT15CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKIApAQCAtNTIwLDEyICs1NzYsOCBAQAogIwogIyBQc2V1ZG8gZmlsZXN5c3RlbXMKICMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19QUk9DX0tDT1JFPXkKLUNPTkZJR19TWVNGUz15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUFRTX0ZTX1hBVFRSPXkKLUNPTkZJR19ERVZQVFNfRlNfU0VDVVJJVFk9eQorIyBDT05GSUdfUFJPQ19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKQEAgLTUzMywxMyArNTg1LDcgQEAKICMKICMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwogIwotIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKQEAgLTU1MSwyMyArNTk3LDE4IEBACiAjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCiAjCiBDT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKLUNPTkZJR19ORlNEPXkKLSMgQ09ORklHX05GU0RfVjMgaXMgbm90IHNldAotIyBDT05GSUdfTkZTRF9UQ1AgaXMgbm90IHNldAorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAogQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19MT0NLRD15Ci1DT05GSUdfRVhQT1JURlM9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NJRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBQYXJ0aXRpb24gVHlwZXMKQEAgLTU4MSwyMiArNjIyLDE4IEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCi0jIFByb2ZpbGluZyBzdXBwb3J0Ci0jCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotCi0jCiAjIEtlcm5lbCBoYWNraW5nCiAjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19DUk9TU0NPTVBJTEU9eQotQ09ORklHX0NNRExJTkU9ImlwPWJvb3RwIGV0aGVyPTQ2LDB4MDNmZTAzMDAsZXRoMCIKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVMwIGRlYnVnIGlwPTE3Mi4yMC4wLjI6MTcyLjIwLjAuMTo6MjU1LjI1NS4wLjAiCiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwogIwotQ09ORklHX0tFWVM9eQotQ09ORklHX0tFWVNfREVCVUdfUFJPQ19LRVlTPXkKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAogCiAjCkBAIC02MTIsNyArNjQ5LDcgQEAKICMgTGlicmFyeSByb3V0aW5lcwogIwogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKLUNPTkZJR19MSUJDUkMzMkM9bQorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvcm0yMDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3Mvcm0yMDBfZGVmY29uZmlnCmluZGV4IGQwYzg1YTQuLjE3ZDRmY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3JtMjAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9ybTIwMF9kZWZjb25maWcKQEAgLTQsOSArNCw5IEBACiAjIFdlZCBKYW4gMjYgMDI6NDk6MDkgMjAwNQogIwogQ09ORklHX01JUFM9eQotIyBDT05GSUdfTUlQUzY0IGlzIG5vdCBzZXQKICMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19NSVBTMzI9eQorIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAorQ09ORklHXzMyQklUPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTkxLDYgKzkxLDcgQEAKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19BUkM9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKIENPTkZJR19JODI1OT15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvc2IxMjUwLXN3YXJtX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3NiMTI1MC1zd2FybV9kZWZjb25maWcKaW5kZXggODQ5NzhiNy4uMWRjOTM1ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3NiMTI1MC1zd2FybV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3Mvc2IxMjUwLXN3YXJtX2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo0OToxMCAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvc2VhZF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9zZWFkX2RlZmNvbmZpZwppbmRleCA3YzcxOGE0Li5kZDA3ZTg2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9zZWFkX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9zZWFkX2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo0OToxMCAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtODAsNiArODAsNyBAQAogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQogQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKIENPTkZJR19JUlFfQ1BVPXkKIENPTkZJR19NSVBTX0JPQVJEU19HRU49eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjI2X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3RiMDIyNl9kZWZjb25maWcKaW5kZXggZTAxNzI3Yy4uYzlkM2Y4MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjI2X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy90YjAyMjZfZGVmY29uZmlnCkBAIC00LDkgKzQsOSBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjEyIDIwMDUKICMKIENPTkZJR19NSVBTPXkKLSMgQ09ORklHX01JUFM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlQUzMyPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR18zMkJJVD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC05NSw2ICs5NSw3IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX0lSUV9DUFU9eQogQ09ORklHX01JUFNfTDFfQ0FDSEVfU0hJRlQ9NQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjI5X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3RiMDIyOV9kZWZjb25maWcKaW5kZXggYzZiYTNkZTIuLjJjYjY2OTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3RiMDIyOV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjI5X2RlZmNvbmZpZwpAQCAtNCw5ICs0LDkgQEAKICMgV2VkIEphbiAyNiAwMjo0OToxMiAyMDA1CiAjCiBDT05GSUdfTUlQUz15Ci0jIENPTkZJR19NSVBTNjQgaXMgbm90IHNldAogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX01JUFMzMj15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfMzJCSVQ9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtOTgsNiArOTgsNyBAQAogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQogQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKIENPTkZJR19JUlFfQ1BVPXkKIENPTkZJR19NSVBTX0wxX0NBQ0hFX1NISUZUPTUKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3RiMDI4N19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy90YjAyODdfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YjlmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY29uZmlncy90YjAyODdfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTA0MSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLW1tMQorIyBUaHUgU2VwICAxIDIyOjU4OjM0IDIwMDUKKyMKK0NPTkZJR19NSVBTPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorQ09ORklHX01PRFZFUlNJT05TPXkKK0NPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEw9eQorQ09ORklHX0tNT0Q9eQorQ09ORklHX1NZU19TVVBQT1JUU18zMkJJVF9LRVJORUw9eQorQ09ORklHX1NZU19TVVBQT1JUU182NEJJVF9LRVJORUw9eQorQ09ORklHX0NQVV9TVVBQT1JUU18zMkJJVF9LRVJORUw9eQorQ09ORklHX0NQVV9TVVBQT1JUU182NEJJVF9LRVJORUw9eQorCisjCisjIEtlcm5lbCB0eXBlCisjCitDT05GSUdfMzJCSVQ9eQorIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAorCisjCisjIE1hY2hpbmUgc2VsZWN0aW9uCisjCisjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldAorQ09ORklHX01BQ0hfVlI0MVhYPXkKKyMgQ09ORklHX05FQ19DTUJWUjQxMzMgaXMgbm90IHNldAorIyBDT05GSUdfQ0FTSU9fRTU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9XT1JLUEFEIGlzIG5vdCBzZXQKK0NPTkZJR19UQU5CQUNfVEIwMjJYPXkKKyMgQ09ORklHX1RBTkJBQ19UQjAyMjYgaXMgbm90IHNldAorQ09ORklHX1RBTkJBQ19UQjAyODc9eQorIyBDT05GSUdfVklDVE9SX01QQzMwWCBpcyBub3Qgc2V0CisjIENPTkZJR19aQU9fQ0FQQ0VMTEEgaXMgbm90IHNldAorQ09ORklHX1BDSV9WUjQxWFg9eQorIyBDT05GSUdfVlJDNDE3MyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAorIyBDT05GSUdfTEFTQVQgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfQVRMQVMgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19NQUxUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX1NFQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9NRU5DT19PQ0VMT1QgaXMgbm90IHNldAorIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfRyBpcyBub3Qgc2V0CisjIENPTkZJR19NT01FTkNPX09DRUxPVF9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PTUVOQ09fT0NFTE9UXzMgaXMgbm90IHNldAorIyBDT05GSUdfTU9NRU5DT19KQUdVQVJfQVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNQ19ZT1NFTUlURSBpcyBub3Qgc2V0CisjIENPTkZJR19EREI1MDc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0REQjU0NzYgaXMgbm90IHNldAorIyBDT05GSUdfRERCNTQ3NyBpcyBub3Qgc2V0CisjIENPTkZJR19RRU1VIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JUDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JUDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPQ19BVTFYMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0lCWVRFX1NCMXh4eF9TT0MgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfSEFWRV9ERUNfTE9DSz15CitDT05GSUdfRE1BX05PTkNPSEVSRU5UPXkKK0NPTkZJR19ETUFfTkVFRF9QQ0lfTUFQX1NUQVRFPXkKK0NPTkZJR19DUFVfTElUVExFX0VORElBTj15CitDT05GSUdfSVJRX0NQVT15CitDT05GSUdfTUlQU19MMV9DQUNIRV9TSElGVD01CisKKyMKKyMgQ1BVIHNlbGVjdGlvbgorIworIyBDT05GSUdfQ1BVX01JUFMzMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfTUlQUzY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9SMzAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfVFgzOVhYIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfVlI0MVhYPXkKKyMgQ09ORklHX0NQVV9SNDMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjRYMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1RYNDlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjUwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1I1NDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9SNjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfTkVWQURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9SODAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjEwMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9STTcwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1JNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU0IxIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFX1NJWkVfNEtCPXkKKyMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzE2S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfSEFTX1NZTkM9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKworIworIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIElTQSwgVEMpCisjCitDT05GSUdfSFdfSEFTX1BDST15CitDT05GSUdfUENJPXkKKyMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0CitDT05GSUdfTU1VPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorQ09ORklHX1RSQURfU0lHTkFMUz15CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKK0NPTkZJR19YRlJNX1VTRVI9bQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUz15CitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIPXkKKyMgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQgaXMgbm90IHNldAorQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0U9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfSVBJUD1tCitDT05GSUdfTkVUX0lQR1JFPW0KKyMgQ09ORklHX05FVF9JUEdSRV9CUk9BRENBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorQ09ORklHX0lORVRfVFVOTkVMPW0KK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEPXkKKworIworIyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sCisjCitDT05GSUdfVENQX0NPTkdfQklDPXkKK0NPTkZJR19UQ1BfQ09OR19XRVNUV09PRD1tCitDT05GSUdfVENQX0NPTkdfSFRDUD1tCisjIENPTkZJR19UQ1BfQ09OR19IU1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19IWUJMQSBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19WRUdBUyBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19TQ0FMQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9bQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX05CRD1tCisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9eQorQ09ORklHX0JMS19ERVZfSURFPXkKKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz15CisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCitDT05GSUdfSURFX0dFTkVSSUM9eQorQ09ORklHX0JMS19ERVZfSURFUENJPXkKKyMgQ09ORklHX0lERVBDSV9TSEFSRV9JUlEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQV9QQ0k9eQorIyBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9QQ0lfQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfU0lJTUFHRT15CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAorIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9RTEEyWFhYPXkKKyMgQ09ORklHX1NDU0lfUUxBMjFYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIyWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjMyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTYzMTIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCitDT05GSUdfSUVFRTEzOTQ9bQorCisjCisjIFN1YnN5c3RlbSBPcHRpb25zCisjCisjIENPTkZJR19JRUVFMTM5NF9WRVJCT1NFREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTEzOTRfT1VJX0RCIGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFMTM5NF9FWFRSQV9DT05GSUdfUk9NUz15CitDT05GSUdfSUVFRTEzOTRfQ09ORklHX1JPTV9JUDEzOTQ9eQorIyBDT05GSUdfSUVFRTEzOTRfRVhQT1JUX0ZVTExfQVBJIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIFRleGFzIEluc3RydW1lbnRzIFBDSUx5bnggcmVxdWlyZXMgSTJDCisjCitDT05GSUdfSUVFRTEzOTRfT0hDSTEzOTQ9bQorCisjCisjIFByb3RvY29sIERyaXZlcnMKKyMKK0NPTkZJR19JRUVFMTM5NF9WSURFTzEzOTQ9bQorQ09ORklHX0lFRUUxMzk0X1NCUDI9bQorIyBDT05GSUdfSUVFRTEzOTRfU0JQMl9QSFlTX0RNQSBpcyBub3Qgc2V0CitDT05GSUdfSUVFRTEzOTRfRVRIMTM5ND1tCitDT05GSUdfSUVFRTEzOTRfRFYxMzk0PW0KK0NPTkZJR19JRUVFMTM5NF9SQVdJTz1tCitDT05GSUdfSUVFRTEzOTRfQ01QPW0KK0NPTkZJR19JRUVFMTM5NF9BTURUUD1tCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19EVU1NWT1tCisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CitDT05GSUdfUjgxNjk9eQorIyBDT05GSUdfUjgxNjlfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tHREJPRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTExfUlggaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTF9UUkFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX1ZSNDFYWD15CitDT05GSUdfU0VSSUFMX1ZSNDFYWF9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfVlI0MVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorIyBDT05GSUdfVEFOQkFDX1RCMDIxOSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorQ09ORklHX0dQSU9fVlI0MVhYPXkKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKworIworIyBTcGVha3VwIGNvbnNvbGUgc3BlZWNoCisjCisjIENPTkZJR19TUEVBS1VQIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQj1tCisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKKyMgQ09ORklHX1VTQl9ERVZJQ0VGUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKK0NPTkZJR19VU0JfRUhDSV9IQ0Q9bQorIyBDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPW0KKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0JMVUVUT09USF9UVFkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCitDT05GSUdfVVNCX1NUT1JBR0U9bQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCitDT05GSUdfVVNCX0hJRD1tCitDT05GSUdfVVNCX0hJRElOUFVUPXkKKyMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAorCisjCisjIFZpZGVvNExpbnV4IHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgTXVsdGltZWRpYSBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR09URU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUU0VSVk8gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NJU1VTQlZHQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorCisjCisjIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAorIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIFNOIERldmljZXMKKyMKKworIworIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKKyMKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworQ09ORklHX1hGU19GUz15CisjIENPTkZJR19YRlNfUlQgaXMgbm90IHNldAorQ09ORklHX1hGU19RVU9UQT15CisjIENPTkZJR19YRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX1hGU19QT1NJWF9BQ0w9eQorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorQ09ORklHX1JPTUZTX0ZTPW0KK0NPTkZJR19JTk9USUZZPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19RVU9UQUNUTD15CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfQVVUT0ZTNF9GUz15CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVNGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz1tCisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfQ1JPU1NDT01QSUxFPXkKK0NPTkZJR19DTURMSU5FPSJtZW09NjRNIGNvbnNvbGU9dHR5VlIwLDExNTIwMCBpcD1hbnkgcm9vdD0vZGV2L25mcyIKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCitDT05GSUdfS0VZUz15CitDT05GSUdfS0VZU19ERUJVR19QUk9DX0tFWVM9eQorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9bQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy93b3JrcGFkX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3dvcmtwYWRfZGVmY29uZmlnCmluZGV4IDkxNWM0M2IuLjE2ZTA3ZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3dvcmtwYWRfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3dvcmtwYWRfZGVmY29uZmlnCkBAIC00LDkgKzQsOSBAQAogIyBXZWQgSmFuIDI2IDAyOjQ5OjEyIDIwMDUKICMKIENPTkZJR19NSVBTPXkKLSMgQ09ORklHX01JUFM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlQUzMyPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR18zMkJJVD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC05Niw2ICs5Niw3IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0hBVkVfREVDX0xPQ0s9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX0lSUV9DUFU9eQogQ09ORklHX01JUFNfTDFfQ0FDSEVfU0hJRlQ9NQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MveW9zZW1pdGVfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MveW9zZW1pdGVfZGVmY29uZmlnCmluZGV4IDU2MmYyYjguLjZkMjI5MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3lvc2VtaXRlX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy95b3NlbWl0ZV9kZWZjb25maWcKQEAgLTQsOSArNCw5IEBACiAjIFdlZCBKYW4gMjYgMDI6NDk6MTMgMjAwNQogIwogQ09ORklHX01JUFM9eQotIyBDT05GSUdfTUlQUzY0IGlzIG5vdCBzZXQKICMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19NSVBTMzI9eQorIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAorQ09ORklHXzMyQklUPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9kZGI1eHh4L2RkYjU0NzcvaXJxLmMgYi9hcmNoL21pcHMvZGRiNXh4eC9kZGI1NDc3L2lycS5jCmluZGV4IDVmMDI3YmYuLjlmZmUxYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9kZGI1eHh4L2RkYjU0NzcvaXJxLmMKKysrIGIvYXJjaC9taXBzL2RkYjV4eHgvZGRiNTQ3Ny9pcnEuYwpAQCAtNzYsNyArNzYsNyBAQAogZXh0ZXJuIHZvaWQgdnJjNTQ3N19pcnFfaW5pdCh1MzIgYmFzZSk7CiBleHRlcm4gdm9pZCBtaXBzX2NwdV9pcnFfaW5pdCh1MzIgYmFzZSk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGRkYjU0NzdfaGFuZGxlX2ludCh2b2lkKTsKLWV4dGVybiBpbnQgc2V0dXBfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFhY3Rpb24gKmlycWFjdGlvbik7ICAKK2V4dGVybiBpbnQgc2V0dXBfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFhY3Rpb24gKmlycWFjdGlvbik7CiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnFfY2FzY2FkZSA9IHsgbm9fYWN0aW9uLCAwLCBDUFVfTUFTS19OT05FLCAiY2FzY2FkZSIsIE5VTEwsIE5VTEwgfTsKIAogdm9pZCBfX2luaXQgYXJjaF9pbml0X2lycSh2b2lkKQpAQCAtOTQsNyArOTQsNyBAQAogCS8qIHNldHVwIFBDSSBpbnRlcnJ1cHQgYXR0cmlidXRlcyAqLwogCXNldF9wY2lfaW50X2F0dHIoUENJMCwgSU5UQSwgQUNUSVZFX0xPVywgTEVWRUxfU0VOU0UpOwogCXNldF9wY2lfaW50X2F0dHIoUENJMCwgSU5UQiwgQUNUSVZFX0xPVywgTEVWRUxfU0VOU0UpOwotCWlmIChtaXBzX21hY2h0eXBlID09IE1BQ0hfTkVDX1JPQ0tIT1BQRVJJSSkgCisJaWYgKG1pcHNfbWFjaHR5cGUgPT0gTUFDSF9ORUNfUk9DS0hPUFBFUklJKQogCQlzZXRfcGNpX2ludF9hdHRyKFBDSTAsIElOVEMsIEFDVElWRV9ISUdILCBMRVZFTF9TRU5TRSk7CiAJZWxzZQogCQlzZXRfcGNpX2ludF9hdHRyKFBDSTAsIElOVEMsIEFDVElWRV9MT1csIExFVkVMX1NFTlNFKTsKQEAgLTEzNCw3ICsxMzQsNyBAQAogCiAJLyogc2V0dXAgY2FzY2FkZSBpbnRlcnJ1cHRzICovCiAJc2V0dXBfaXJxKFZSQzU0NzdfSVJRX0JBU0UgKyBWUkM1NDc3X0k4MjU5X0NBU0NBREUsICZpcnFfY2FzY2FkZSk7Ci0Jc2V0dXBfaXJxKENQVV9JUlFfQkFTRSArIENQVV9WUkM1NDc3X0NBU0NBREUsICZpcnFfY2FzY2FkZSk7ICAgICAgCisJc2V0dXBfaXJxKENQVV9JUlFfQkFTRSArIENQVV9WUkM1NDc3X0NBU0NBREUsICZpcnFfY2FzY2FkZSk7CiAKIAkvKiBob29rIHVwIHRoZSBmaXJzdC1sZXZlbCBpbnRlcnJ1cHQgaGFuZGxlciAqLwogCXNldF9leGNlcHRfdmVjdG9yKDAsIGRkYjU0NzdfaGFuZGxlX2ludCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZGRiNXh4eC9kZGI1NDc3L3NldHVwLmMgYi9hcmNoL21pcHMvZGRiNXh4eC9kZGI1NDc3L3NldHVwLmMKaW5kZXggMTVjNmU1NC4uZDYyZjVhNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2RkYjV4eHgvZGRiNTQ3Ny9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9kZGI1eHh4L2RkYjU0Nzcvc2V0dXAuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAKIAkvKiBtaXBzX2hwdF9mcmVxdWVuY3kgaXMgMS8yIG9mIHRoZSBjcHUgY29yZSBmcmVxICovCiAJaSA9ICAocmVhZF9jMF9jb25maWcoKSA+PiAyOCApICYgNzsKLQlpZiAoKGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfUjU0MzIpICYmIChpID09IDMpKSAKKwlpZiAoKGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfUjU0MzIpICYmIChpID09IDMpKQogCQlpID0gNDsKIAltaXBzX2hwdF9mcmVxdWVuY3kgPSBidXNfZnJlcXVlbmN5KihpKzQpLzQ7CiB9CkBAIC0yOTgsMTEgKzI5OCwxMSBAQAogCiAJaWYgKG1pcHNfbWFjaHR5cGUgPT0gTUFDSF9ORUNfUk9DS0hPUFBFUgogCSAgIHx8ICBtaXBzX21hY2h0eXBlID09IE1BQ0hfTkVDX1JPQ0tIT1BQRVJJSSkgewotCQkvKiBEaXNhYmxlIGJ1cyBkaWFnbm9zdGljcy4gKi8gCisJCS8qIERpc2FibGUgYnVzIGRpYWdub3N0aWNzLiAqLwogCQlkZGJfb3V0MzIoRERCX1BDSUNUTDBfTCwgMCk7CiAJCWRkYl9vdXQzMihEREJfUENJQ1RMMF9ILCAwKTsKIAkJZGRiX291dDMyKEREQl9QQ0lDVEwxX0wsIDApOwotCQlkZGJfb3V0MzIoRERCX1BDSUNUTDFfSCwgMCk7ICAgICAgICAgCisJCWRkYl9vdXQzMihEREJfUENJQ1RMMV9ILCAwKTsKIAl9CiAKIAlpZiAobWlwc19tYWNodHlwZSA9PSBNQUNIX05FQ19ST0NLSE9QUEVSKSB7CkBAIC0zNTQsNyArMzU0LDcgQEAKIAkJICovCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZSgmZGV2X20xNTMzLCAweDU4LCAweDc0KTsKIAotCQkvKiAKKwkJLyoKIAkJICogcG9zaXRpdmUgZGVjb2RlIChiaXQ2IC0wKQogCQkgKiBlbmFibGUgSURFIGNvbnRyb2xlciBpbnRlcnJ1cHQgKGJpdCA0IC0xKQogCQkgKiBzZXR1cCBTSVJRIHRvIHBvaW50IHRvIElSUSAxNCAoYml0IDM6MCAtIDExMDEpCkBAIC0zNjQsMzEgKzM2NCwzMSBAQAogCQkvKiBTZXR1cCBNNTIyOSByZWdpc3RlcnMgKi8KIAkJZGV2X201MjI5LmJ1cyA9ICZidXM7CiAJCWRldl9tNTIyOS5zeXNkYXRhID0gTlVMTDsKLQkJZGV2X201MjI5LmRldmZuID0gNCo4OyAgCS8vIHNsb3QgNCAoQUQxNSk6IE01MjI5IElERSAKKwkJZGV2X201MjI5LmRldmZuID0gNCo4OyAgCS8vIHNsb3QgNCAoQUQxNSk6IE01MjI5IElERQogCiAJCS8qCiAJCSAqIGVuYWJsZSBJREUgaW4gdGhlIE01MjI5IGNvbmZpZyByZWdpc3RlciAweDUwIChiaXQgMCAtIDEpCi0JCSAqIE01MjI5IElEU0VMIGlzIGFkZHI6MTU7IHNlZSBhYm92ZSBzZXR0aW5nIAorCQkgKiBNNTIyOSBJRFNFTCBpcyBhZGRyOjE1OyBzZWUgYWJvdmUgc2V0dGluZwogCQkgKi8KIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoJmRldl9tNTIyOSwgMHg1MCwgJnRlbXA4KTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKCZkZXZfbTUyMjksIDB4NTAsIHRlbXA4IHwgMHgxKTsKIAotCQkvKiAKLQkJICogZW5hYmxlIGJ1cyBtYXN0ZXIgKGJpdCAyKSAgYW5kIElPIGRlY29kaW5nICAoYml0IDApIAorCQkvKgorCQkgKiBlbmFibGUgYnVzIG1hc3RlciAoYml0IDIpICBhbmQgSU8gZGVjb2RpbmcgIChiaXQgMCkKIAkJICovCiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKCZkZXZfbTUyMjksIDB4MDQsICZ0ZW1wOCk7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZSgmZGV2X201MjI5LCAweDA0LCB0ZW1wOCB8IDB4NSk7CiAKIAkJLyoKIAkJICogZW5hYmxlIG5hdGl2ZSwgY29waWVkIGZyb20gYXJjaC9wcGMvazJib290L2hlYWQuUwotCQkgKiBUT0RPIC0gbmVlZCB2b2xhdGlsZSwgbmVlZCB0byBiZSBwb3J0YWJsZSAKKwkJICogVE9ETyAtIG5lZWQgdm9sYXRpbGUsIG5lZWQgdG8gYmUgcG9ydGFibGUKIAkJICovCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZSgmZGV2X201MjI5LCAweDA5LCAweGVmKTsKIAotCQkvKiBTZXQgUHJpbWFyeSBDaGFubmVsIENvbW1hbmQgQmxvY2sgVGltaW5nICovIAorCQkvKiBTZXQgUHJpbWFyeSBDaGFubmVsIENvbW1hbmQgQmxvY2sgVGltaW5nICovCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZSgmZGV2X201MjI5LCAweDU5LCAweDMxKTsKIAotCQkvKiAKKwkJLyoKIAkJICogRW5hYmxlIHByaW1hcnkgY2hhbm5lbCA0MC1waW4gY2FibGUKIAkJICogTTUyMjkgcmVnaXN0ZXIgMHg0YSAoYml0IDApCiAJCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy9lY2MtYmVyci5jIGIvYXJjaC9taXBzL2RlYy9lY2MtYmVyci5jCmluZGV4IDEzM2ZiN2MuLjZkYmNlOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9kZWMvZWNjLWJlcnIuYworKysgYi9hcmNoL21pcHMvZGVjL2VjYy1iZXJyLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogCiAJa24weF9lcnJhZGRyID0gKHZvaWQgKikoS04wM19TTE9UX0JBU0UgKyBJT0FTSUNfRVJSQUREUik7CiAJa24weF9jaGtzeW4gPSAodm9pZCAqKShLTjAzX1NMT1RfQkFTRSArIElPQVNJQ19DSEtTWU4pOwotCQkJCisKIAkvKgogCSAqIFNldCBub3JtYWwgRUNDIGRldGVjdGlvbiBhbmQgZ2VuZXJhdGlvbiwgZW5hYmxlIEVDQyBjb3JyZWN0aW9uLgogCSAqIEZvciBLTjA1IHdlIGFsc28gbmVlZCB0byBtYWtlIHN1cmUgRUUgKD8pIGlzIGVuYWJsZWQgaW4gdGhlIE1CLgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy9pbnQtaGFuZGxlci5TIGIvYXJjaC9taXBzL2RlYy9pbnQtaGFuZGxlci5TCmluZGV4IDNiMzc5MDkuLmM4OTc2OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9kZWMvaW50LWhhbmRsZXIuUworKysgYi9hcmNoL21pcHMvZGVjL2ludC1oYW5kbGVyLlMKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQkgKi8KIAkJbWZjMAl0MCxDUDBfQ0FVU0UJCSMgZ2V0IHBlbmRpbmcgaW50ZXJydXB0cwogCQltZmMwCXQxLENQMF9TVEFUVVMKLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAJCWx3CXQyLGNwdV9mcHVfbWFzawogI2VuZGlmCiAJCWFuZGkJdDAsU1QwX0lNCQkjIENBVVNFLkNFIG1heSBiZSBub24temVybyEKQEAgLTE0MSw3ICsxNDEsNyBAQAogCiAJCWJlcXoJdDAsc3B1cmlvdXMKIAotI2lmZGVmIENPTkZJR19NSVBTMzIKKyNpZmRlZiBDT05GSUdfMzJCSVQKIAkJIGFuZAl0Mix0MAogCQlibmV6CXQyLGZwdQkJCSMgaGFuZGxlIEZQVSBpbW1lZGlhdGVseQogI2VuZGlmCkBAIC0yNzEsNyArMjcxLDcgQEAKIAkJaglyZXRfZnJvbV9pcnEKIAkJIG5vcAogCi0jaWZkZWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogZnB1OgogCQlqCWhhbmRsZV9mcGVfaW50CiAJCSBub3AKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9kZWMvcHJvbS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9kZWMvcHJvbS9NYWtlZmlsZQppbmRleCAzNzM4MjJlLi5iY2QwMjQ3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZGVjL3Byb20vTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2RlYy9wcm9tL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogCiBsaWIteQkJCSs9IGluaXQubyBtZW1vcnkubyBjbWRsaW5lLm8gaWRlbnRpZnkubyBjb25zb2xlLm8KIAotbGliLSQoQ09ORklHX01JUFMzMikJKz0gbG9jb3JlLm8KLWxpYi0kKENPTkZJR19NSVBTNjQpCSs9IGNhbGxfbzMyLm8KK2xpYi0kKENPTkZJR18zMkJJVCkJKz0gbG9jb3JlLm8KK2xpYi0kKENPTkZJR182NEJJVCkJKz0gY2FsbF9vMzIubwogCiBFWFRSQV9BRkxBR1MgOj0gJChDRkxBR1MpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZGVmY29uZmlnIGIvYXJjaC9taXBzL2RlZmNvbmZpZwppbmRleCBkNTVmZTY2Li4yMGY4NGIxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9kZWZjb25maWcKQEAgLTQsOSArNCw5IEBACiAjIFdlZCBKYW4gMjYgMDI6NDg6NTkgMjAwNQogIwogQ09ORklHX01JUFM9eQotIyBDT05GSUdfTUlQUzY0IGlzIG5vdCBzZXQKICMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19NSVBTMzI9eQorIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAorQ09ORklHXzMyQklUPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTkwLDYgKzkwLDcgQEAKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19BUkM9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiAjIENPTkZJR19DUFVfTElUVExFX0VORElBTiBpcyBub3Qgc2V0CiBDT05GSUdfSVJRX0NQVT15CiBDT05GSUdfU1dBUF9JT19TUEFDRT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaXRlLWJvYXJkcy9nZW5lcmljL2l0ODE3Ml9zZXR1cC5jIGIvYXJjaC9taXBzL2l0ZS1ib2FyZHMvZ2VuZXJpYy9pdDgxNzJfc2V0dXAuYwppbmRleCBkODA4YTY3Li5hNWY2ZDg0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaXRlLWJvYXJkcy9nZW5lcmljL2l0ODE3Ml9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9pdGUtYm9hcmRzL2dlbmVyaWMvaXQ4MTcyX3NldHVwLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCiAJLyoKIAkgKiBJTy9NRU0gcmVzb3VyY2VzLgotCSAqIAorCSAqCiAJICogcmV2aXNpdCB0aGlzIGFyZWEuCiAJICovCiAJc2V0X2lvX3BvcnRfYmFzZShLU0VHMSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaXRlLWJvYXJkcy9nZW5lcmljL3RpbWUuYyBiL2FyY2gvbWlwcy9pdGUtYm9hcmRzL2dlbmVyaWMvdGltZS5jCmluZGV4IDMwYTZjMGQuLmY1ZDY3ZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pdGUtYm9hcmRzL2dlbmVyaWMvdGltZS5jCisrKyBiL2FyY2gvbWlwcy9pdGUtYm9hcmRzL2dlbmVyaWMvdGltZS5jCkBAIC03Miw3ICs3Miw3IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIKIGJpbl90b19odyh1bnNpZ25lZCBjaGFyIGMpCiB7Ci0JaWYgKHJ0Y19kbV9iaW5hcnkoKSkgCisJaWYgKHJ0Y19kbV9iaW5hcnkoKSkKIAkJcmV0dXJuIGM7CiAJZWxzZQogCQlyZXR1cm4gKChjLzEwKSA8PCA0KSArIChjJTEwKTsKQEAgLTkxLDkgKzkxLDkgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhcgogaG91cl9iaW5fdG9faHcodW5zaWduZWQgY2hhciBjKQogewotCWlmIChydGNfMjRoKCkpIAorCWlmIChydGNfMjRoKCkpCiAJCXJldHVybiBiaW5fdG9faHcoYyk7Ci0JaWYgKGMgPj0gMTIpIAorCWlmIChjID49IDEyKQogCQlyZXR1cm4gMHg4MCB8IGJpbl90b19odygoYz09MTIpPzEyOmMtMTIpOyAgLyogMTIgaXMgMTJwbSAqLwogCWVsc2UKIAkJcmV0dXJuIGJpbl90b19odygoYz09MCk/MTI6Yyk7CS8qIDAgaXMgMTIgQU0sIG5vdCAwIGFtICovCkBAIC0xMDUsOSArMTA1LDkgQEAKIAl1bnNpZ25lZCBjaGFyIHRtcCA9IGh3X3RvX2JpbihjJjB4M2YpOwogCWlmIChydGNfMjRoKCkpCiAJCXJldHVybiB0bXA7Ci0JaWYgKGMgJiAweDgwKSAKKwlpZiAoYyAmIDB4ODApCiAJCXJldHVybiAodG1wPT0xMik/MTI6dG1wKzEyOyAgCS8qIDEycG0gaXMgMTIsIG5vdCAyNCAqLwotCWVsc2UgCisJZWxzZQogCQlyZXR1cm4gKHRtcD09MTIpPzA6dG1wOwkJLyogMTJhbSBpcyAwICovCiB9CiAKQEAgLTE0NSw3ICsxNDUsNyBAQAogCXJldHVybiAobWlwc19ocHRfZnJlcXVlbmN5IC8gSFopOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAKK3N0YXRpYyB1bnNpZ25lZCBsb25nCiBpdDgxNzJfcnRjX2dldF90aW1lKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYzsKQEAgLTE2NiwxMiArMTY2LDEyIEBACiAJaG91ciA9IGhvdXJfaHdfdG9fYmluKENNT1NfUkVBRChSVENfSE9VUlMpKTsKIAlkYXkgPSBod190b19iaW4oQ01PU19SRUFEKFJUQ19EQVlfT0ZfTU9OVEgpKTsKIAltb24gPSBod190b19iaW4oQ01PU19SRUFEKFJUQ19NT05USCkpOwotCXllYXIgPSBod190b19iaW4oQ01PU19SRUFEKFJUQ19ZRUFSKSkgKyAKKwl5ZWFyID0gaHdfdG9fYmluKENNT1NfUkVBRChSVENfWUVBUikpICsKIAkJaHdfdG9fYmluKCpydGNfY2VudHVyeV9yZWcpICogMTAwOwogCiAJLyogcmVzdG9yZSBpbnRlcnJ1cHRzICovCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQkKKwogCXJldHVybiBta3RpbWUoeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggYTAyMzBlZS4uZDMzMDM1OCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCkBAIC0xMyw4ICsxMyw4IEBACiAKIGlmZGVmIENPTkZJR19NT0RVTEVTCiBvYmoteQkJCQkrPSBtaXBzX2tzeW1zLm8gbW9kdWxlLm8KLW9iai0kKENPTkZJR19NSVBTMzIpCQkrPSBtb2R1bGUtZWxmMzIubwotb2JqLSQoQ09ORklHX01JUFM2NCkJCSs9IG1vZHVsZS1lbGY2NC5vCitvYmotJChDT05GSUdfMzJCSVQpCQkrPSBtb2R1bGUtZWxmMzIubworb2JqLSQoQ09ORklHXzY0QklUKQkJKz0gbW9kdWxlLWVsZjY0Lm8KIGVuZGlmCiAKIG9iai0kKENPTkZJR19DUFVfUjMwMDApCQkrPSByMjMwMF9mcHUubyByMjMwMF9zd2l0Y2gubwpAQCAtNDUsOCArNDUsOCBAQAogb2JqLSQoQ09ORklHX0lSUV9DUFVfUk05SykJKz0gaXJxLXJtOTAwMC5vCiBvYmotJChDT05GSUdfSVJRX01WNjQzNDApCSs9IGlycS1tdjY0MzR4Lm8KIAotb2JqLSQoQ09ORklHX01JUFMzMikJCSs9IHNjYWxsMzItbzMyLm8KLW9iai0kKENPTkZJR19NSVBTNjQpCQkrPSBzY2FsbDY0LTY0Lm8KK29iai0kKENPTkZJR18zMkJJVCkJCSs9IHNjYWxsMzItbzMyLm8KK29iai0kKENPTkZJR182NEJJVCkJCSs9IHNjYWxsNjQtNjQubwogb2JqLSQoQ09ORklHX0JJTkZNVF9JUklYKQkrPSBiaW5mbXRfaXJpeC5vCiBvYmotJChDT05GSUdfTUlQUzMyX0NPTVBBVCkJKz0gaW9jdGwzMi5vIGxpbnV4MzIubyBzaWduYWwzMi5vCiBvYmotJChDT05GSUdfTUlQUzMyX04zMikJKz0gYmluZm10X2VsZm4zMi5vIHNjYWxsNjQtbjMyLm8gc2lnbmFsX24zMi5vCkBAIC01NSw3ICs1NSw3IEBACiBvYmotJChDT05GSUdfS0dEQikJCSs9IGdkYi1sb3cubyBnZGItc3R1Yi5vCiBvYmotJChDT05GSUdfUFJPQ19GUykJCSs9IHByb2MubwogCi1vYmotJChDT05GSUdfTUlQUzY0KQkJKz0gY3B1LWJ1Z3M2NC5vCitvYmotJChDT05GSUdfNjRCSVQpCQkrPSBjcHUtYnVnczY0Lm8KIAogb2JqLSQoQ09ORklHX0dFTl9SVEMpCQkrPSBnZW5ydGMubwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2JpbmZtdF9lbGZuMzIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvYmluZm10X2VsZm4zMi5jCmluZGV4IGVkNDcwNDEuLjZiNjQ1ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvYmluZm10X2VsZm4zMi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvYmluZm10X2VsZm4zMi5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAkgKiBDb252ZXJ0IGppZmZpZXMgdG8gbmFub3NlY29uZHMgYW5kIHNlcGVyYXRlIHdpdGgKIAkgKiBvbmUgZGl2aWRlLgogCSAqLwotCXU2NCBuc2VjID0gKHU2NClqaWZmaWVzICogVElDS19OU0VDOyAKKwl1NjQgbnNlYyA9ICh1NjQpamlmZmllcyAqIFRJQ0tfTlNFQzsKIAl2YWx1ZS0+dHZfc2VjID0gZGl2X2xvbmdfbG9uZ19yZW0obnNlYywgTlNFQ19QRVJfU0VDLCAmdmFsdWUtPnR2X3VzZWMpOwogCXZhbHVlLT50dl91c2VjIC89IE5TRUNfUEVSX1VTRUM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2JpbmZtdF9lbGZvMzIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvYmluZm10X2VsZm8zMi5jCmluZGV4IGVlMjFiMTguLmI0MDc1ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvYmluZm10X2VsZm8zMi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvYmluZm10X2VsZm8zMi5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkgKiBDb252ZXJ0IGppZmZpZXMgdG8gbmFub3NlY29uZHMgYW5kIHNlcGVyYXRlIHdpdGgKIAkgKiBvbmUgZGl2aWRlLgogCSAqLwotCXU2NCBuc2VjID0gKHU2NClqaWZmaWVzICogVElDS19OU0VDOyAKKwl1NjQgbnNlYyA9ICh1NjQpamlmZmllcyAqIFRJQ0tfTlNFQzsKIAl2YWx1ZS0+dHZfc2VjID0gZGl2X2xvbmdfbG9uZ19yZW0obnNlYywgTlNFQ19QRVJfU0VDLCAmdmFsdWUtPnR2X3VzZWMpOwogCXZhbHVlLT50dl91c2VjIC89IE5TRUNfUEVSX1VTRUM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NwdS1idWdzNjQuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LWJ1Z3M2NC5jCmluZGV4IDExZWJlNWQuLjQ3YTA4N2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LWJ1Z3M2NC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LWJ1Z3M2NC5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQlpZiAodjFbaV0gIT0gd1tpXSkKIAkJCWJ1ZyA9IDE7Ci0JCQorCiAJaWYgKGJ1ZyA9PSAwKSB7CiAJCXByaW50aygibm8uXG4iKTsKIAkJcmV0dXJuOwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJaWYgKHYyW2ldICE9IHdbaV0pCiAJCQlmaXggPSAwOwotCQkKKwogCWlmIChmaXggPT0gMSkgewogCQlwcmludGsoInllcy5cbiIpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYwppbmRleCA0YmI4NDk1Li43Njg1ZjhiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKQEAgLTIyOSwxNSArMjI5LDkgQEAKIAkJYnJlYWs7CiAJY2FzZSBQUklEX0lNUF9WUjQxWFg6CiAJCXN3aXRjaCAoYy0+cHJvY2Vzc29yX2lkICYgMHhmMCkgewotI2lmbmRlZiBDT05GSUdfVlI0MTgxCiAJCWNhc2UgUFJJRF9SRVZfVlI0MTExOgogCQkJYy0+Y3B1dHlwZSA9IENQVV9WUjQxMTE7CiAJCQlicmVhazsKLSNlbHNlCi0JCWNhc2UgUFJJRF9SRVZfVlI0MTgxOgotCQkJYy0+Y3B1dHlwZSA9IENQVV9WUjQxODE7Ci0JCQlicmVhazsKLSNlbmRpZgogCQljYXNlIFBSSURfUkVWX1ZSNDEyMToKIAkJCWMtPmNwdXR5cGUgPSBDUFVfVlI0MTIxOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2dkYi1sb3cuUyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2RiLWxvdy5TCmluZGV4IGVjZTZkZGEuLjUxMmJlZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvZ2RiLWxvdy5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2RiLWxvdy5TCkBAIC0xMywxMyArMTMsMTMgQEAKICNpbmNsdWRlIDxhc20vc3RhY2tmcmFtZS5oPgogI2luY2x1ZGUgPGFzbS9nZGItc3R1Yi5oPgogCi0jaWZkZWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogI2RlZmluZSBETUZDMAltZmMwCiAjZGVmaW5lIERNVEMwCW10YzAKICNkZWZpbmUgTERDMQlsd2MxCiAjZGVmaW5lIFNEQzEJbHdjMQogI2VuZGlmCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogI2RlZmluZSBETUZDMAlkbWZjMAogI2RlZmluZSBETVRDMAlkbXRjMAogI2RlZmluZSBMREMxCWxkYzEKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvZ2RiLXN0dWIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2RiLXN0dWIuYwppbmRleCAyNjk4ODkzLi5kM2ZkMWFiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2dkYi1zdHViLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9nZGItc3R1Yi5jCkBAIC02ODcsOCArNjg3LDggQEAKIAkgKiBhY3F1aXJlIHRoZSBiaWcga2dkYiBzcGlubG9jawogCSAqLwogCWlmICghc3Bpbl90cnlsb2NrKCZrZ2RiX2xvY2spKSB7Ci0JCS8qIAotCQkgKiBzb21lIG90aGVyIENQVSBoYXMgdGhlIGxvY2ssIHdlIHNob3VsZCBnbyBiYWNrIHRvIAorCQkvKgorCQkgKiBzb21lIG90aGVyIENQVSBoYXMgdGhlIGxvY2ssIHdlIHNob3VsZCBnbyBiYWNrIHRvCiAJCSAqIHJlY2VpdmUgdGhlIGdkYl93YWl0IElQQwogCQkgKi8KIAkJcmV0dXJuOwpAQCAtNzAzLDcgKzcwMyw3IEBACiAJCWFzeW5jX2JwLmFkZHIgPSAwOwogCX0KIAotCS8qIAorCS8qCiAJICogYWNxdWlyZSB0aGUgQ1BVIHNwaW5sb2NrcwogCSAqLwogCWZvciAoaSA9IG51bV9vbmxpbmVfY3B1cygpLTE7IGkgPj0gMDsgaS0tKQpAQCAtODk0LDcgKzg5NCw3IEBACiAJCQlwdHIgPSAmaW5wdXRfYnVmZmVyWzFdOwogCQkJaWYgKGhleFRvTG9uZygmcHRyLCAmYWRkcikpCiAJCQkJcmVncy0+Y3AwX2VwYyA9IGFkZHI7Ci0JICAKKwogCQkJZ290byBleGl0X2tnZGJfZXhjZXB0aW9uOwogCQkJYnJlYWs7CiAKQEAgLTEwMDEsNyArMTAwMSw3IEBACiAJCXJldHVybjsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIi5nbG9ibAlicmVha2luc3Rcblx0IiAKKwkJCSIuZ2xvYmwJYnJlYWtpbnN0XG5cdCIKIAkJCSIuc2V0XHRub3Jlb3JkZXJcblx0IgogCQkJIm5vcFxuIgogCQkJImJyZWFraW5zdDpcdGJyZWFrXG5cdCIKQEAgLTEwMTQsNyArMTAxNCw3IEBACiB2b2lkIGFzeW5jX2JyZWFrcG9pbnQodm9pZCkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJCSIuZ2xvYmwJYXN5bmNfYnJlYWtpbnN0XG5cdCIgCisJCQkiLmdsb2JsCWFzeW5jX2JyZWFraW5zdFxuXHQiCiAJCQkiLnNldFx0bm9yZW9yZGVyXG5cdCIKIAkJCSJub3BcbiIKIAkJCSJhc3luY19icmVha2luc3Q6XHRicmVha1xuXHQiCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMgYi9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMKaW5kZXggYTViMGEzOC4uZTdmNmMxYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUwpAQCAtNTQsNyArNTQsNyBAQAogI2VuZGlmCiAJbWZjMAlrMSwgQ1AwX0NBVVNFCiAJYW5kaQlrMSwgazEsIDB4N2MKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJZHNsbAlrMSwgazEsIDEKICNlbmRpZgogCVBUUl9MCWswLCBleGNlcHRpb25faGFuZGxlcnMoazEpCkBAIC04MSw3ICs4MSw3IEBACiAJYmVxCWsxLCBrMCwgaGFuZGxlX3ZjZWQKIAkgbGkJazAsIDE0PDwyCiAJYmVxCWsxLCBrMCwgaGFuZGxlX3ZjZWkKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJZHNsbAlrMSwgazEsIDEKICNlbmRpZgogCS5zZXQJcG9wCkBAIC0yNDQsMTIgKzI0NCwxMiBAQAogCSAgIHN0YXJ0IHdpdGggYW4gbiBhbmQgZ2FzIHdpbGwgYmVsaWV2ZSBcbiBpcyBvayAuLi4gICovCiAJLm1hY3JvCV9fQlVJTERfdmVyYm9zZQluZXhjZXB0aW9uCiAJTE9OR19MCWExLCBQVF9FUEMoc3ApCi0jaWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogCVBSSU5UKCJHb3QgXG5leGNlcHRpb24gYXQgJTA4bHhcMDEyIikKLSNlbmRpZgkKLSNpZiBDT05GSUdfTUlQUzY0CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAlQUklOVCgiR290IFxuZXhjZXB0aW9uIGF0ICUwMTZseFwwMTIiKQotI2VuZGlmCQorI2VuZGlmCiAJLmVuZG0KIAogCS5tYWNybwlfX0JVSUxEX2NvdW50IGV4Y2VwdGlvbgpAQCAtMjkzLDcgKzI5Myw3IEBACiAJQlVJTERfSEFORExFUiBtY2hlY2sgbWNoZWNrIGNsaSB2ZXJib3NlCQkvKiAjMjQgKi8KIAlCVUlMRF9IQU5ETEVSIHJlc2VydmVkIHJlc2VydmVkIHN0aSB2ZXJib3NlCS8qIG90aGVycyAqLwogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogLyogQSB0ZW1wb3Jhcnkgb3ZlcmZsb3cgaGFuZGxlciB1c2VkIGJ5IGNoZWNrX2RhZGRpKCkuICovCiAKIAlfX0lOSVQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvZ2VucnRjLmMgYi9hcmNoL21pcHMva2VybmVsL2dlbnJ0Yy5jCmluZGV4IDI4OGJmNTEuLjcxNDE2ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvZ2VucnRjLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9nZW5ydGMuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS9ydGMuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogCi1zdGF0aWMgc3BpbmxvY2tfdCBtaXBzX3J0Y19sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhtaXBzX3J0Y19sb2NrKTsKIAogdW5zaWduZWQgaW50IGdldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCiB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2hlYWQuUyBiL2FyY2gvbWlwcy9rZXJuZWwvaGVhZC5TCmluZGV4IGE2NGU4N2QuLjJhMWI0NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaGVhZC5TCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkuZW5kbQogCiAJLm1hY3JvCXNldHVwX2MwX3N0YXR1c19wcmkKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJc2V0dXBfYzBfc3RhdHVzIFNUMF9LWCAwCiAjZWxzZQogCXNldHVwX2MwX3N0YXR1cyAwIDAKQEAgLTExNSw3ICsxMTUsNyBAQAogCS5lbmRtCiAKIAkubWFjcm8Jc2V0dXBfYzBfc3RhdHVzX3NlYwotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAlzZXR1cF9jMF9zdGF0dXMgU1QwX0tYIFNUMF9CRVYKICNlbHNlCiAJc2V0dXBfYzBfc3RhdHVzIDAgU1QwX0JFVgpAQCAtMjE1LDcgKzIxNSw3IEBACiAJICogc2xpZ2h0bHkgZGlmZmVyZW50IGxheW91dCAuLi4KIAkgKi8KIAlwYWdlCXN3YXBwZXJfcGdfZGlyLCBfUEdEX09SREVSCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCXBhZ2UJaW52YWxpZF9wbWRfdGFibGUsIF9QTURfT1JERVIKICNlbmRpZgogCXBhZ2UJaW52YWxpZF9wdGVfdGFibGUsIF9QVEVfT1JERVIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYwppbmRleCA3ZWVjNzU2Li40NDc3NTkyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jCkBAIC0zMSw3ICszMSw3IEBACiAgKiBtb3ZlcyB0byBhcmNoIGluZGVwZW5kZW50IGxhbmQKICAqLwogCi1zcGlubG9ja190IGk4MjU5QV9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3BpbmxvY2tfdCBERUZJTkVfU1BJTkxPQ0soaTgyNTlBX2xvY2spOwogCiBzdGF0aWMgdm9pZCBlbmRfODI1OUFfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pb2N0bDMyLmMgYi9hcmNoL21pcHMva2VybmVsL2lvY3RsMzIuYwppbmRleCA1MTljZDVkLi5jMDY5NzE5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lvY3RsMzIuYworKysgYi9hcmNoL21pcHMva2VybmVsL2lvY3RsMzIuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgImNvbXBhdF9pb2N0bC5jIgogCiB0eXBlZGVmIGludCAoKiBpb2N0bDMyX2hhbmRsZXJfdCkodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBmaWxlICopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwogI2RlZmluZSBDT01QQVRJQkxFX0lPQ1RMKGNtZCkJCUhBTkRMRV9JT0NUTCgoY21kKSxzeXNfaW9jdGwpCiAjZGVmaW5lIEhBTkRMRV9JT0NUTChjbWQsaGFuZGxlcikJeyAoY21kKSwgKGlvY3RsMzJfaGFuZGxlcl90KShoYW5kbGVyKSwgTlVMTCB9LAogI2RlZmluZSBJT0NUTF9UQUJMRV9TVEFSVCBcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lyaXhpb2N0bC5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcml4aW9jdGwuYwppbmRleCA0Y2QzZDM4Li4zY2RjMjIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lyaXhpb2N0bC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJpeGlvY3RsLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW9jdGwuaD4KQEAgLTMzLDcgKzM0LDcgQEAKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5cCA9IE5VTEw7CiAKLQlzcGluX2xvY2soJmN1cnJlbnQtPmZpbGVzLT5maWxlX2xvY2spOworCXJjdV9yZWFkX2xvY2soKTsKIAlmaWxwID0gZmNoZWNrKGZkKTsKIAlpZihmaWxwICYmIGZpbHAtPnByaXZhdGVfZGF0YSkgewogCQl0dHlwID0gKHN0cnVjdCB0dHlfc3RydWN0ICopIGZpbHAtPnByaXZhdGVfZGF0YTsKQEAgLTQxLDcgKzQyLDcgQEAKIAkJaWYodHR5cC0+bWFnaWMgIT0gVFRZX01BR0lDKQogCQkJdHR5cCA9TlVMTDsKIAl9Ci0Jc3Bpbl91bmxvY2soJmN1cnJlbnQtPmZpbGVzLT5maWxlX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiB0dHlwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lyaXhzaWcuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJpeHNpZy5jCmluZGV4IDRjMTE0YWUuLmVmZjg5MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaXJpeHNpZy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJpeHNpZy5jCkBAIC00NDAsMTggKzQ0MCw2IEBACiAJfSBzdHVmZjsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aW1lc3BlY3RvamlmZmllcyhzdHJ1Y3QgdGltZXNwZWMgKnZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgc2VjID0gKHVuc2lnbmVkKSB2YWx1ZS0+dHZfc2VjOwotCWxvbmcgbnNlYyA9IHZhbHVlLT50dl9uc2VjOwotCi0JaWYgKHNlYyA+IChMT05HX01BWCAvIEhaKSkKLQkJcmV0dXJuIExPTkdfTUFYOwotCW5zZWMgKz0gMTAwMDAwMDAwMEwgLyBIWiAtIDE7Ci0JbnNlYyAvPSAxMDAwMDAwMDAwTCAvIEhaOwotCXJldHVybiBIWiAqIHNlYyArIG5zZWM7Ci19Ci0KIGFzbWxpbmthZ2UgaW50IGlyaXhfc2lncG9sbF9zeXModW5zaWduZWQgbG9uZyAqc2V0LCBzdHJ1Y3QgaXJpeDVfc2lnaW5mbyAqaW5mbywKIAkJCQlzdHJ1Y3QgdGltZXNwZWMgKnRwKQogewpAQCAtNDg5LDE0ICs0NzcsMTMgQEAKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWV4cGlyZSA9IHRpbWVzcGVjdG9qaWZmaWVzKHRwKSsodHAtPnR2X3NlY3x8dHAtPnR2X25zZWMpOworCQlleHBpcmUgPSB0aW1lc3BlY190b19qaWZmaWVzKHRwKSArICh0cC0+dHZfc2VjfHx0cC0+dHZfbnNlYyk7CiAJfQogCiAJd2hpbGUoMSkgewogCQlsb25nIHRtcCA9IDA7CiAKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCWV4cGlyZSA9IHNjaGVkdWxlX3RpbWVvdXQoZXhwaXJlKTsKKwkJZXhwaXJlID0gc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGV4cGlyZSk7CiAKIAkJZm9yIChpPTA7IGk8PTQ7IGkrKykKIAkJCXRtcCB8PSAoY3VycmVudC0+cGVuZGluZy5zaWduYWwuc2lnW2ldICYga3NldC5zaWdbaV0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pcnEuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLmMKaW5kZXggNDQxMTU3YS4uN2Q5Mzk5MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL21pcHMva2VybmVsL2lycS5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJaWYgKGkgPCBOUl9JUlFTKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfZGVzY1tpXS5sb2NrLCBmbGFncyk7CiAJCWFjdGlvbiA9IGlycV9kZXNjW2ldLmFjdGlvbjsKLQkJaWYgKCFhY3Rpb24pIAorCQlpZiAoIWFjdGlvbikKIAkJCWdvdG8gc2tpcDsKIAkJc2VxX3ByaW50ZihwLCAiJTNkOiAiLGkpOwogI2lmbmRlZiBDT05GSUdfU01QCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvbGludXgzMi5jCmluZGV4IDk5M2FiYzguLmVjZTQ1NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvbGludXgzMi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvbGludXgzMi5jCkBAIC0zMTMsNyArMzEzLDcgQEAKIAlzdHJ1Y3Qgc3lzaW5mbyBzOwogCWludCByZXQsIGVycjsKIAltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzICgpOwotCQorCiAJc2V0X2ZzIChLRVJORUxfRFMpOwogCXJldCA9IHN5c19zeXNpbmZvKCZzKTsKIAlzZXRfZnMgKG9sZF9mcyk7CkBAIC01NDYsMjEgKzU0NiwyMSBAQAogc3RydWN0IGlwY19wZXJtMzIKIHsKIAlrZXlfdCAgICAJICBrZXk7Ci0gICAgICAgIGNvbXBhdF91aWRfdCAgdWlkOwotICAgICAgICBjb21wYXRfZ2lkX3QgIGdpZDsKLSAgICAgICAgY29tcGF0X3VpZF90ICBjdWlkOwotICAgICAgICBjb21wYXRfZ2lkX3QgIGNnaWQ7CisgICAgICAgIF9fY29tcGF0X3VpZF90ICB1aWQ7CisgICAgICAgIF9fY29tcGF0X2dpZF90ICBnaWQ7CisgICAgICAgIF9fY29tcGF0X3VpZF90ICBjdWlkOworICAgICAgICBfX2NvbXBhdF9naWRfdCAgY2dpZDsKICAgICAgICAgY29tcGF0X21vZGVfdAltb2RlOwogICAgICAgICB1bnNpZ25lZCBzaG9ydCAgc2VxOwogfTsKIAogc3RydWN0IGlwYzY0X3Blcm0zMiB7CiAJa2V5X3Qga2V5OwotCWNvbXBhdF91aWRfdCB1aWQ7Ci0JY29tcGF0X2dpZF90IGdpZDsKLQljb21wYXRfdWlkX3QgY3VpZDsKLQljb21wYXRfZ2lkX3QgY2dpZDsKLQljb21wYXRfbW9kZV90CW1vZGU7IAorCV9fY29tcGF0X3VpZF90IHVpZDsKKwlfX2NvbXBhdF9naWRfdCBnaWQ7CisJX19jb21wYXRfdWlkX3QgY3VpZDsKKwlfX2NvbXBhdF9naWRfdCBjZ2lkOworCWNvbXBhdF9tb2RlX3QJbW9kZTsKIAl1bnNpZ25lZCBzaG9ydAlzZXE7CiAJdW5zaWduZWQgc2hvcnQgX19wYWQxOwogCXVuc2lnbmVkIGludCBfX3VudXNlZDE7CkBAIC0xMzM0LDE3ICsxMzM0LDE3IEBACiAJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOwogCWludCByZXQ7CiAJb2ZmX3Qgb2Y7Ci0JCisKIAlpZiAob2Zmc2V0ICYmIGdldF91c2VyKG9mLCBvZmZzZXQpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQkJCisKIAlzZXRfZnMoS0VSTkVMX0RTKTsKIAlyZXQgPSBzeXNfc2VuZGZpbGUob3V0X2ZkLCBpbl9mZCwgb2Zmc2V0ID8gJm9mIDogTlVMTCwgY291bnQpOwogCXNldF9mcyhvbGRfZnMpOwotCQorCiAJaWYgKG9mZnNldCAmJiBwdXRfdXNlcihvZiwgb2Zmc2V0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTM2MiwxMSArMTM2MiwxMSBAQAogI3VuZGVmIEFMCiAKIC8qCi0gKglTeXN0ZW0gY2FsbCB2ZWN0b3JzLiAKKyAqCVN5c3RlbSBjYWxsIHZlY3RvcnMuCiAgKgogICoJQXJndW1lbnQgY2hlY2tpbmcgY2xlYW5lZCB1cC4gU2F2ZWQgMjAlIGluIHNpemUuCiAgKiAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IG5lZWQgdG8gc2V0IHRoZSBrZXJuZWwgbG9jayBiZWNhdXNlCi0gKiAgaXQgaXMgc2V0IGJ5IHRoZSBjYWxsZWVzLiAKKyAqICBpdCBpcyBzZXQgYnkgdGhlIGNhbGxlZXMuCiAgKi8KIAogYXNtbGlua2FnZSBsb25nIHN5czMyX3NvY2tldGNhbGwoaW50IGNhbGwsIHVuc2lnbmVkIGludCAqYXJnczMyKQpAQCAtMTQwMiwxMSArMTQwMiwxMSBAQAogCS8qIGNvcHlfZnJvbV91c2VyIHNob3VsZCBiZSBTTVAgc2FmZS4gKi8KIAlpZiAoY29weV9mcm9tX3VzZXIoYSwgYXJnczMyLCBzb2NrZXRjYWxsX25hcmdzW2NhbGxdKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQorCiAJYTA9YVswXTsKIAlhMT1hWzFdOwotCQotCXN3aXRjaChjYWxsKSAKKworCXN3aXRjaChjYWxsKQogCXsKIAkJY2FzZSBTWVNfU09DS0VUOgogCQkJZXJyID0gc3lzX3NvY2tldChhMCxhMSxhWzJdKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvbWlwc19rc3ltcy5jIGIvYXJjaC9taXBzL2tlcm5lbC9taXBzX2tzeW1zLmMKaW5kZXggZWVkMjlmYy4uODZlNDJjNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9taXBzX2tzeW1zLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9taXBzX2tzeW1zLmMKQEAgLTM1LDcgKzM1LDcgQEAKIEVYUE9SVF9TWU1CT0wobWVtbW92ZSk7CiBFWFBPUlRfU1lNQk9MKHN0cmNhdCk7CiBFWFBPUlRfU1lNQk9MKHN0cmNocik7Ci0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogRVhQT1JUX1NZTUJPTChzdHJuY21wKTsKICNlbmRpZgogRVhQT1JUX1NZTUJPTChzdHJsZW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYwppbmRleCA2ZTcwYzQyLi5lNGYyZjgwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYwpAQCAtNzAsNyArNzAsNyBAQAogCiAJLyogTmV3IHRocmVhZCBsb3NlcyBrZXJuZWwgcHJpdmlsZWdlcy4gKi8KIAlzdGF0dXMgPSByZWdzLT5jcDBfc3RhdHVzICYgfihTVDBfQ1UwfFNUMF9DVTF8S1VfTUFTSyk7Ci0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCXN0YXR1cyAmPSB+U1QwX0ZSOwogCXN0YXR1cyB8PSAoY3VycmVudC0+dGhyZWFkLm1mbGFncyAmIE1GXzMyQklUX1JFR1MpID8gMCA6IFNUMF9GUjsKICNlbmRpZgpAQCAtMjM2LDEwICsyMzYsMTAgQEAKIAkJCWJyZWFrOwogCiAJCWlmICgKLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAJCSAgICBpcC0+aV9mb3JtYXQub3Bjb2RlID09IHN3X29wICYmCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJCSAgICBpcC0+aV9mb3JtYXQub3Bjb2RlID09IHNkX29wICYmCiAjZW5kaWYKIAkJICAgIGlwLT5pX2Zvcm1hdC5ycyA9PSAyOSkKQEAgLTM1Myw3ICszNTMsNyBAQAogCiBvdXQ6CiAKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJaWYgKGN1cnJlbnQtPnRocmVhZC5tZmxhZ3MgJiBNRl8zMkJJVF9SRUdTKSAvKiBLbHVkZ2UgZm9yIDMyLWJpdCBwcyAgKi8KIAkJcGMgJj0gMHhmZmZmZmZmZlVMOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYwppbmRleCA5MmU3MGNhLi4wYjU3MWE1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJaWYgKHRza191c2VkX21hdGgoY2hpbGQpKSB7CiAJCQkJZnB1cmVnX3QgKmZyZWdzID0gZ2V0X2ZwdV9yZWdzKGNoaWxkKTsKIAotI2lmZGVmIENPTkZJR19NSVBTMzIKKyNpZmRlZiBDT05GSUdfMzJCSVQKIAkJCQkvKgogCQkJCSAqIFRoZSBvZGQgcmVnaXN0ZXJzIGFyZSBhY3R1YWxseSB0aGUgaGlnaAogCQkJCSAqIG9yZGVyIGJpdHMgb2YgdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIGV2ZW4KQEAgLTEzNSw3ICsxMzUsNyBAQAogCQkJCWVsc2UKIAkJCQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIChmcmVnc1soYWRkciAtIDMyKV0gJiAweGZmZmZmZmZmKTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAkJCQl0bXAgPSBmcmVnc1thZGRyIC0gRlBSX0JBU0VdOwogI2VuZGlmCiAJCQl9IGVsc2UgewpAQCAtMjEzLDcgKzIxMyw3IEBACiAJCQkJICAgICAgIHNpemVvZihjaGlsZC0+dGhyZWFkLmZwdS5oYXJkKSk7CiAJCQkJY2hpbGQtPnRocmVhZC5mcHUuaGFyZC5mY3IzMSA9IDA7CiAJCQl9Ci0jaWZkZWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogCQkJLyoKIAkJCSAqIFRoZSBvZGQgcmVnaXN0ZXJzIGFyZSBhY3R1YWxseSB0aGUgaGlnaCBvcmRlciBiaXRzCiAJCQkgKiBvZiB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgZXZlbiByZWdpc3RlcnMgLSB1bmxlc3MKQEAgLTIyNyw3ICsyMjcsNyBAQAogCQkJCWZyZWdzW2FkZHIgLSBGUFJfQkFTRV0gfD0gZGF0YTsKIAkJCX0KICNlbmRpZgotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAkJCWZyZWdzW2FkZHIgLSBGUFJfQkFTRV0gPSBkYXRhOwogI2VuZGlmCiAJCQlicmVhazsKQEAgLTMwNCwxNCArMzA0LDE0IEBACiBzdGF0aWMgaW5saW5lIGludCBhdWRpdF9hcmNoKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCWlmICghKGN1cnJlbnQtPnRocmVhZC5tZmxhZ3MgJiBNRl8zMkJJVF9SRUdTKSkKIAkJcmV0dXJuIEFVRElUX0FSQ0hfTUlQU0VMNjQ7CiAjZW5kaWYgLyogTUlQUzY0ICovCiAJcmV0dXJuIEFVRElUX0FSQ0hfTUlQU0VMOwogCiAjZWxzZSAvKiBiaWcgZW5kaWFuLi4uICovCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCWlmICghKGN1cnJlbnQtPnRocmVhZC5tZmxhZ3MgJiBNRl8zMkJJVF9SRUdTKSkKIAkJcmV0dXJuIEFVRElUX0FSQ0hfTUlQUzY0OwogI2VuZGlmIC8qIE1JUFM2NCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yMjMwMF9mcHUuUyBiL2FyY2gvbWlwcy9rZXJuZWwvcjIzMDBfZnB1LlMKaW5kZXggZjgzYzMxZi4uYWM2OGU2OCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9yMjMwMF9mcHUuUworKysgYi9hcmNoL21pcHMva2VybmVsL3IyMzAwX2ZwdS5TCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2ZwcmVnZGVmLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KIAogI2RlZmluZSBFWChhLGIpCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcjIzMDBfc3dpdGNoLlMgYi9hcmNoL21pcHMva2VybmVsL3IyMzAwX3N3aXRjaC5TCmluZGV4IDI0M2U3YjYuLjBkOWM0YTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcjIzMDBfc3dpdGNoLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9yMjMwMF9zd2l0Y2guUwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWN0bC5oPgogI2luY2x1ZGUgPGFzbS9mcHJlZ2RlZi5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vc3RhY2tmcmFtZS5oPgpAQCAtMzUsNyArMzUsNyBAQAogLyoKICAqIEZQVSBjb250ZXh0IGlzIHNhdmVkIGlmZiB0aGUgcHJvY2VzcyBoYXMgdXNlZCBpdCdzIEZQVSBpbiB0aGUgY3VycmVudAogICogdGltZSBzbGljZSBhcyBpbmRpY2F0ZWQgYnkgVElGX1VTRURGUFUuICBJbiBhbnkgY2FzZSwgdGhlIENVMSBiaXQgZm9yIHVzZXIKLSAqIHNwYWNlIFNUQVRVUyByZWdpc3RlciBzaG91bGQgYmUgMCwgc28gdGhhdCBhIHByb2Nlc3MgKmFsd2F5cyogc3RhcnRzIGl0cyAKKyAqIHNwYWNlIFNUQVRVUyByZWdpc3RlciBzaG91bGQgYmUgMCwgc28gdGhhdCBhIHByb2Nlc3MgKmFsd2F5cyogc3RhcnRzIGl0cwogICogdXNlcmxhbmQgd2l0aCBGUFUgZGlzYWJsZWQgYWZ0ZXIgZWFjaCBjb250ZXh0IHN3aXRjaC4KICAqCiAgKiBGUFUgd2lsbCBiZSBlbmFibGVkIGFzIHNvb24gYXMgdGhlIHByb2Nlc3MgYWNjZXNzZXMgRlBVIGFnYWluLCB0aHJvdWdoCkBAIC01NSw3ICs1NSw3IEBACiAJY3B1X3NhdmVfbm9uc2NyYXRjaCBhMAogCXN3CXJhLCBUSFJFQURfUkVHMzEoYTApCiAKLQkvKiAKKwkvKgogCSAqIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2F2ZSBGUFUgcmVnaXN0ZXJzCiAJICovCiAJbHcJdDMsIFRBU0tfVEhSRUFEX0lORk8oYTApCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3I0a19mcHUuUyBiL2FyY2gvbWlwcy9rZXJuZWwvcjRrX2ZwdS5TCmluZGV4IGViYjY0M2QuLjFhMTRjNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcjRrX2ZwdS5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcjRrX2ZwdS5TCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2ZwcmVnZGVmLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KIAogCS5tYWNybwlFWCBpbnNuLCByZWcsIHNyYwpAQCAtMzYsNyArMzYsNyBAQAogTEVBRihfc2F2ZV9mcF9jb250ZXh0KQogCWNmYzEJdDEsIGZjcjMxCiAKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJLyogU3RvcmUgdGhlIDE2IG9kZCBkb3VibGUgcHJlY2lzaW9uIHJlZ2lzdGVycyAqLwogCUVYCXNkYzEgJGYxLCBTQ19GUFJFR1MrOChhMCkKIAlFWAlzZGMxICRmMywgU0NfRlBSRUdTKzI0KGEwKQpAQCAtMTE4LDcgKzExOCw3IEBACiAgKi8KIExFQUYoX3Jlc3RvcmVfZnBfY29udGV4dCkKIAlFWAlsdyB0MCwgU0NfRlBDX0NTUihhMCkKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJRVgJbGRjMSAkZjEsIFNDX0ZQUkVHUys4KGEwKQogCUVYCWxkYzEgJGYzLCBTQ19GUFJFR1MrMjQoYTApCiAJRVgJbGRjMSAkZjUsIFNDX0ZQUkVHUys0MChhMCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcjRrX3N3aXRjaC5TIGIvYXJjaC9taXBzL2tlcm5lbC9yNGtfc3dpdGNoLlMKaW5kZXggMWZjM2IyZS4uZDJhZmJkMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9yNGtfc3dpdGNoLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9yNGtfc3dpdGNoLlMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVjdGwuaD4KICNpbmNsdWRlIDxhc20vZnByZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1iaXRzLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgpAQCAtMzMsNyArMzMsNyBAQAogLyoKICAqIEZQVSBjb250ZXh0IGlzIHNhdmVkIGlmZiB0aGUgcHJvY2VzcyBoYXMgdXNlZCBpdCdzIEZQVSBpbiB0aGUgY3VycmVudAogICogdGltZSBzbGljZSBhcyBpbmRpY2F0ZWQgYnkgX1RJRl9VU0VERlBVLiAgSW4gYW55IGNhc2UsIHRoZSBDVTEgYml0IGZvciB1c2VyCi0gKiBzcGFjZSBTVEFUVVMgcmVnaXN0ZXIgc2hvdWxkIGJlIDAsIHNvIHRoYXQgYSBwcm9jZXNzICphbHdheXMqIHN0YXJ0cyBpdHMgCisgKiBzcGFjZSBTVEFUVVMgcmVnaXN0ZXIgc2hvdWxkIGJlIDAsIHNvIHRoYXQgYSBwcm9jZXNzICphbHdheXMqIHN0YXJ0cyBpdHMKICAqIHVzZXJsYW5kIHdpdGggRlBVIGRpc2FibGVkIGFmdGVyIGVhY2ggY29udGV4dCBzd2l0Y2guCiAgKgogICogRlBVIHdpbGwgYmUgZW5hYmxlZCBhcyBzb29uIGFzIHRoZSBwcm9jZXNzIGFjY2Vzc2VzIEZQVSBhZ2FpbiwgdGhyb3VnaApAQCAtMTA1LDcgKzEwNSw3IEBACiAgKiBTYXZlIGEgdGhyZWFkJ3MgZnAgY29udGV4dC4KICAqLwogTEVBRihfc2F2ZV9mcCkKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJbWZjMAl0MSwgQ1AwX1NUQVRVUwogI2VuZGlmCiAJZnB1X3NhdmVfZG91YmxlIGEwIHQxIHQwIHQyCQkjIGNsb2JiZXJzIHQxCkBAIC0xNDIsNyArMTQyLDcgQEAKIAogCWxpCXQxLCAtMQkJCQkjIFNOYU4KIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAlzbGwJdDAsIHQwLCA1CiAJYmdlegl0MCwgMWYJCQkJIyAxNiAvIDMyIHJlZ2lzdGVyIG1vZGU/CiAKQEAgLTE2NCw3ICsxNjQsNyBAQAogCWRtdGMxCXQxLCAkZjMxCiAxOgogI2VuZGlmCi0JCisKICNpZmRlZiBDT05GSUdfQ1BVX01JUFMzMgogCW10YzEJdDEsICRmMAogCW10YzEJdDEsICRmMQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yNjAwMF9mcHUuUyBiL2FyY2gvbWlwcy9rZXJuZWwvcjYwMDBfZnB1LlMKaW5kZXggZDhkM2IxMy4uNDNjZGE1MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9yNjAwMF9mcHUuUworKysgYi9hcmNoL21pcHMva2VybmVsL3I2MDAwX2ZwdS5TCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8YXNtL2FzbS5oPgogI2luY2x1ZGUgPGFzbS9mcHJlZ2RlZi5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CiAKIAkuc2V0CW5vcmVvcmRlcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCmluZGV4IDM0NGYyZTIuLjE3YjUwMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUworKysgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNtL3dhci5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogLyogSGlnaGVzdCBzeXNjYWxsIHVzZWQgb2YgYW55IHN5c2NhbGwgZmxhdm91ciAqLwogI2RlZmluZSBNQVhfU1lTQ0FMTF9OTwlfX05SX08zMl9MaW51eCArIF9fTlJfTzMyX0xpbnV4X3N5c2NhbGxzCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtNjQuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TCmluZGV4IDMyZWZiODguLmZmYjIyYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgogI2luY2x1ZGUgPGFzbS9zdGFja2ZyYW1lLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9zeXNtaXBzLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCmluZGV4IDNhMjQwZTMuLjEyYjUzMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKQEAgLTI0MSw3ICsyNDEsNyBAQAogCWlmICgqdG1wKQogCQlzdHJjYXQoY29tbWFuZF9saW5lLCB0bXApOwogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCS8qIEhBQ0s6IEd1ZXNzIGlmIHRoZSBzaWduIGV4dGVuc2lvbiB3YXMgZm9yZ290dGVuICovCiAJaWYgKHN0YXJ0ID4gMHgwMDAwMDAwMDgwMDAwMDAwICYmIHN0YXJ0IDwgMHgwMDAwMDAwMGZmZmZmZmZmKQogCQlzdGFydCB8PSAweGZmZmZmZmZmMDAwMDAwMDA7CkBAIC00NDYsNyArNDQ2LDcgQEAKIHsKIAlpbnQgaTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01JUFM2NCkgJiYgIWRlZmluZWQoQ09ORklHX0JVSUxEX0VMRjY0KQorI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSAmJiAhZGVmaW5lZChDT05GSUdfQlVJTERfRUxGNjQpCiAJLyoKIAkgKiBUaGUgNjRiaXQgY29kZSBpbiAzMmJpdCBvYmplY3QgZm9ybWF0IHRyaWNrIGNhbid0IHJlcHJlc2VudAogCSAqIDY0Yml0IHdpZGUgcmVsb2NhdGlvbnMgZm9yIGxpbmtlciBzY3JpcHQgc3ltYm9scy4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsMzIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsMzIuYwppbmRleCBmNjg3NWYwLi44ZGRmYmQ4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbDMyLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwzMi5jCkBAIC01NTgsNyArNTU4LDcgQEAKIAlpZiAoIXVzZWRfbWF0aCgpKQogCQlnb3RvIG91dDsKIAotCS8qIAorCS8qCiAJICogU2F2ZSBGUFUgc3RhdGUgdG8gc2lnbmFsIGNvbnRleHQuICBTaWduYWwgaGFuZGxlciB3aWxsICJpbmhlcml0IgogCSAqIGN1cnJlbnQgRlBVIHN0YXRlLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwppbmRleCBhZTJhMTMxLi4yMWUzZTEzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYworKysgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWN0bC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2lwYy5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CiAjaW5jbHVkZSA8YXNtL3NpbS5oPgogI2luY2x1ZGUgPGFzbS9zaG1wYXJhbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zeXNpcml4LmMgYi9hcmNoL21pcHMva2VybmVsL3N5c2lyaXguYwppbmRleCBmM2JmMGU0Li40ZGUxNTU2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3N5c2lyaXguYworKysgYi9hcmNoL21pcHMva2VybmVsL3N5c2lyaXguYwpAQCAtNjMyLDEwICs2MzIsNyBAQAogCXdyaXRlX3NlcWxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAl4dGltZS50dl9zZWMgPSB2YWx1ZTsKIAl4dGltZS50dl9uc2VjID0gMDsKLQl0aW1lX2FkanVzdCA9IDA7CQkJLyogc3RvcCBhY3RpdmUgYWRqdGltZSgpICovCi0JdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJbnRwX2NsZWFyKCk7CiAJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CiAKIAlyZXR1cm4gMDsKQEAgLTEwMzUsOCArMTAzMiw3IEBACiAKIGFzbWxpbmthZ2UgaW50IGlyaXhfc2dpbmFwKGludCB0aWNrcykKIHsKLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQlzY2hlZHVsZV90aW1lb3V0KHRpY2tzKTsKKwlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGlja3MpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3RpbWUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jCmluZGV4IDY0OGM4MjIuLjBkZDBkZjdhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL21pcHMva2VybmVsL3RpbWUuYwpAQCAtMjIzLDEwICsyMjMsNyBAQAogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ4dGltZSwgc2VjLCBuc2VjKTsKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsIHd0bV9zZWMsIHd0bV9uc2VjKTsKIAotCXRpbWVfYWRqdXN0ID0gMDsJCQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAogCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOwogCWNsb2NrX3dhc19zZXQoKTsKQEAgLTQ0Miw3ICs0MzksNyBAQAogCSAqIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byA1MDAgbXMgYmVmb3JlIHRoZSBuZXcgc2Vjb25kIHN0YXJ0cy4KIAkgKi8KIAl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKLQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorCWlmIChudHBfc3luY2VkKCkgJiYKIAkgICAgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPj0gNTAwMDAwIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA8PSA1MDAwMDAgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMikgewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCmluZGV4IDU2YzM2ZTQuLmE1M2IxZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKQEAgLTkyNCw3ICs5MjQsNyBAQAogCSAqIGZsYWcgdGhhdCBzb21lIGZpcm13YXJlIG1heSBoYXZlIGxlZnQgc2V0IGFuZCB0aGUgVFMgYml0IChmb3IKIAkgKiBJUDI3KS4gIFNldCBYWCBmb3IgSVNBIElWIGNvZGUgdG8gd29yay4KIAkgKi8KLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJc3RhdHVzX3NldCB8PSBTVDBfRlJ8U1QwX0tYfFNUMF9TWHxTVDBfVVg7CiAjZW5kaWYKIAlpZiAoY3VycmVudF9jcHVfZGF0YS5pc2FfbGV2ZWwgPT0gTUlQU19DUFVfSVNBX0lWKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC91bmFsaWduZWQuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdW5hbGlnbmVkLmMKaW5kZXggM2YyNGExZC4uMzZjNTIxMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC91bmFsaWduZWQuYworKysgYi9hcmNoL21pcHMva2VybmVsL3VuYWxpZ25lZC5jCkBAIC0yNDAsNyArMjQwLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIGx3dV9vcDoKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJCS8qCiAJCSAqIEEgMzItYml0IGtlcm5lbCBtaWdodCBiZSBydW5uaW5nIG9uIGEgNjQtYml0IHByb2Nlc3Nvci4gIEJ1dAogCQkgKiBpZiB3ZSdyZSBvbiBhIDMyLWJpdCBwcm9jZXNzb3IgYW5kIGFuIGktY2FjaGUgaW5jb2hlcmVuY3kKQEAgLTI3OCwxMyArMjc4LDEzIEBACiAJCSpuZXd2YWx1ZSA9IHZhbHVlOwogCQkqcmVncHRyID0gJnJlZ3MtPnJlZ3NbaW5zbi5pX2Zvcm1hdC5ydF07CiAJCWJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19NSVBTNjQgKi8KKyNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAogCQkvKiBDYW5ub3QgaGFuZGxlIDY0LWJpdCBpbnN0cnVjdGlvbnMgaW4gMzItYml0IGtlcm5lbCAqLwogCQlnb3RvIHNpZ2lsbDsKIAogCWNhc2UgbGRfb3A6Ci0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCQkvKgogCQkgKiBBIDMyLWJpdCBrZXJuZWwgbWlnaHQgYmUgcnVubmluZyBvbiBhIDY0LWJpdCBwcm9jZXNzb3IuICBCdXQKIAkJICogaWYgd2UncmUgb24gYSAzMi1iaXQgcHJvY2Vzc29yIGFuZCBhbiBpLWNhY2hlIGluY29oZXJlbmN5CkBAIC0zMjAsNyArMzIwLDcgQEAKIAkJKm5ld3ZhbHVlID0gdmFsdWU7CiAJCSpyZWdwdHIgPSAmcmVncy0+cmVnc1tpbnNuLmlfZm9ybWF0LnJ0XTsKIAkJYnJlYWs7Ci0jZW5kaWYgLyogQ09ORklHX01JUFM2NCAqLworI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCiAJCS8qIENhbm5vdCBoYW5kbGUgNjQtYml0IGluc3RydWN0aW9ucyBpbiAzMi1iaXQga2VybmVsICovCiAJCWdvdG8gc2lnaWxsOwpAQCAtMzkyLDcgKzM5Miw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBzZF9vcDoKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJCS8qCiAJCSAqIEEgMzItYml0IGtlcm5lbCBtaWdodCBiZSBydW5uaW5nIG9uIGEgNjQtYml0IHByb2Nlc3Nvci4gIEJ1dAogCQkgKiBpZiB3ZSdyZSBvbiBhIDMyLWJpdCBwcm9jZXNzb3IgYW5kIGFuIGktY2FjaGUgaW5jb2hlcmVuY3kKQEAgLTQyOCw3ICs0MjgsNyBAQAogCQlpZiAocmVzKQogCQkJZ290byBmYXVsdDsKIAkJYnJlYWs7Ci0jZW5kaWYgLyogQ09ORklHX01JUFM2NCAqLworI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCiAJCS8qIENhbm5vdCBoYW5kbGUgNjQtYml0IGluc3RydWN0aW9ucyBpbiAzMi1iaXQga2VybmVsICovCiAJCWdvdG8gc2lnaWxsOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9taXBzL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGU4MzBkNzguLjQ4MmFjMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL21pcHMva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTE1LDcgKzE1LDcgQEAKICAgLyogVGhpcyBpcyB0aGUgdmFsdWUgZm9yIGFuIE9yaWdpbiBrZXJuZWwsIHRha2VuIGZyb20gYW4gSVJJWCBrZXJuZWwuICAqLwogICAvKiAuID0gMHhjMDAwMDAwMDAwMDFjMDAwOyAqLwogCi0gIC8qIFNldCB0aGUgdmFkZHIgZm9yIHRoZSB0ZXh0IHNlZ21lbnQgdG8gYSB2YWx1ZSAKKyAgLyogU2V0IHRoZSB2YWRkciBmb3IgdGhlIHRleHQgc2VnbWVudCB0byBhIHZhbHVlCiAgICAgICAgID49IDB4YTgwMCAwMDAwIDAwMDEgOTAwMCBpZiBubyBzeW1tb24gaXMgZ29pbmcgdG8gY29uZmlndXJlZAogICAgICAgICA+PSAweGE4MDAgMDAwMCAwMDMwIDAwMDAgb3RoZXJ3aXNlICAqLwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFzYXQvYXQ5M2MuYyBiL2FyY2gvbWlwcy9sYXNhdC9hdDkzYy5jCmluZGV4IGY2YWRkMDQuLmNhMjZlNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sYXNhdC9hdDkzYy5jCisrKyBiL2FyY2gvbWlwcy9sYXNhdC9hdDkzYy5jCkBAIC0xLDcgKzEsNyBAQAotLyogCisvKgogICogQXRtZWwgQVQ5M0M0NiBzZXJpYWwgZWVwcm9tIGRyaXZlcgogICoKLSAqIEJyaWFuIE11cnBoeSA8YnJpYW4ubXVycGh5QGVpY29uLmNvbT4gCisgKiBCcmlhbiBNdXJwaHkgPGJyaWFuLm11cnBoeUBlaWNvbi5jb20+CiAgKgogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0yMSwxMiArMjEsMTIgQEAKIAogc3RydWN0IGF0OTNjX2RlZnMgKmF0OTNjOwogCi1zdGF0aWMgdm9pZCBhdDkzY19yZWdfd3JpdGUodTMyIHZhbCkgCitzdGF0aWMgdm9pZCBhdDkzY19yZWdfd3JpdGUodTMyIHZhbCkKIHsKIAkqYXQ5M2MtPnJlZyA9IHZhbDsKIH0KIAotc3RhdGljIHUzMiBhdDkzY19yZWdfcmVhZCh2b2lkKSAKK3N0YXRpYyB1MzIgYXQ5M2NfcmVnX3JlYWQodm9pZCkKIHsKIAl1MzIgdG1wID0gKmF0OTNjLT5yZWc7CiAJcmV0dXJuIHRtcDsKQEAgLTgxLDcgKzgxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgYXQ5M2Nfd3JpdGVfYml0cyh1MzIgZGF0YSwgaW50IHNpemUpCi17ICAgICAgICAgICAgICAgCit7CiAJaW50IGk7CiAJaW50IHNoaWZ0ID0gc2l6ZSAtIDE7CiAJdTMyIG1hc2sgPSAoMSA8PCBzaGlmdCk7CkBAIC05MCw3ICs5MCw3IEBACiAJCWF0OTNjX3dyaXRlX2RhdGFiaXQoKGRhdGEgJiBtYXNrKSA+PiBzaGlmdCk7CiAJCWRhdGEgPDw9IDE7CiAJfQotfSAgICAgICAKK30KIAogc3RhdGljIHZvaWQgYXQ5M2NfaW5pdF9vcCh2b2lkKQogewpAQCAtMTA0LDggKzEwNCw4IEBACiAJbGFzYXRfbmRlbGF5KDI1MCk7CiB9CiAKLXN0YXRpYyB2b2lkIGF0OTNjX3dhaXQodm9pZCkgCi17IAorc3RhdGljIHZvaWQgYXQ5M2Nfd2FpdCh2b2lkKQorewogCWF0OTNjX2luaXRfb3AoKTsKIAl3aGlsZSAoIWF0OTNjX3JlYWRfZGF0YWJpdCgpKQogCQk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFzYXQvYXQ5M2MuaCBiL2FyY2gvbWlwcy9sYXNhdC9hdDkzYy5oCmluZGV4IGE5MTJhYzIuLmNmZTJmOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sYXNhdC9hdDkzYy5oCisrKyBiL2FyY2gvbWlwcy9sYXNhdC9hdDkzYy5oCkBAIC0xLDcgKzEsNyBAQAotLyogCisvKgogICogQXRtZWwgQVQ5M0M0NiBzZXJpYWwgZWVwcm9tIGRyaXZlcgogICoKLSAqIEJyaWFuIE11cnBoeSA8YnJpYW4ubXVycGh5QGVpY29uLmNvbT4gCisgKiBCcmlhbiBNdXJwaHkgPGJyaWFuLm11cnBoeUBlaWNvbi5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYXNhdC9kczE2MDMuYyBiL2FyY2gvbWlwcy9sYXNhdC9kczE2MDMuYwppbmRleCA3YmJmNmNmLi45ZDc4MTJlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGFzYXQvZHMxNjAzLmMKKysrIGIvYXJjaC9taXBzL2xhc2F0L2RzMTYwMy5jCkBAIC0xLDcgKzEsNyBAQAotLyogCi0gKiBEYWxsYXMgU2VtaWNvbmR1Y3RvcnMgMTYwMyBSVEMgZHJpdmVyIAorLyoKKyAqIERhbGxhcyBTZW1pY29uZHVjdG9ycyAxNjAzIFJUQyBkcml2ZXIKICAqCi0gKiBCcmlhbiBNdXJwaHkgPGJyaWFuQG11cnBoeS5kaz4gCisgKiBCcmlhbiBNdXJwaHkgPGJyaWFuQG11cnBoeS5kaz4KICAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTIwLDEyICsyMCwxMiBAQAogc3RydWN0IGRzX2RlZnMgKmRzMTYwMyA9IE5VTEw7CiAKIC8qIEhXIHNwZWNpZmljIHJlZ2lzdGVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgcnRjX3JlZ193cml0ZSh1bnNpZ25lZCBsb25nIHZhbCkgCitzdGF0aWMgdm9pZCBydGNfcmVnX3dyaXRlKHVuc2lnbmVkIGxvbmcgdmFsKQogewogCSpkczE2MDMtPnJlZyA9IHZhbDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjX3JlZ19yZWFkKHZvaWQpIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjX3JlZ19yZWFkKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAgPSAqZHMxNjAzLT5yZWc7CiAJcmV0dXJuIHRtcDsKQEAgLTgwLDcgKzgwLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgZGF0YTsKIAotCWRhdGEgPSAocnRjX2RhdGFyZWdfcmVhZCgpICYgKDEgPDwgZHMxNjAzLT5kYXRhX3JlYWRfc2hpZnQpKSAKKwlkYXRhID0gKHJ0Y19kYXRhcmVnX3JlYWQoKSAmICgxIDw8IGRzMTYwMy0+ZGF0YV9yZWFkX3NoaWZ0KSkKIAkJPj4gZHMxNjAzLT5kYXRhX3JlYWRfc2hpZnQ7CiAJcnRjX2N5Y2xlX2Nsb2NrKHJ0Y19yZWdfcmVhZCgpKTsKIAlyZXR1cm4gZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYXNhdC9kczE2MDMuaCBiL2FyY2gvbWlwcy9sYXNhdC9kczE2MDMuaAppbmRleCA1NWYzYjA0Li5jMmU1Yzc2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGFzYXQvZHMxNjAzLmgKKysrIGIvYXJjaC9taXBzL2xhc2F0L2RzMTYwMy5oCkBAIC0xLDcgKzEsNyBAQAotLyogCi0gKiBEYWxsYXMgU2VtaWNvbmR1Y3RvcnMgMTYwMyBSVEMgZHJpdmVyIAorLyoKKyAqIERhbGxhcyBTZW1pY29uZHVjdG9ycyAxNjAzIFJUQyBkcml2ZXIKICAqCi0gKiBCcmlhbiBNdXJwaHkgPGJyaWFuQG11cnBoeS5kaz4gCisgKiBCcmlhbiBNdXJwaHkgPGJyaWFuQG11cnBoeS5kaz4KICAqCiAgKi8KICNpZm5kZWYgX19EUzE2MDNfSApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhc2F0L2ltYWdlL01ha2VmaWxlIGIvYXJjaC9taXBzL2xhc2F0L2ltYWdlL01ha2VmaWxlCmluZGV4IDE4YjY0MzAuLjM1ZWNkNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sYXNhdC9pbWFnZS9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbGFzYXQvaW1hZ2UvTWFrZWZpbGUKQEAgLTIxLDcgKzIxLDcgQEAKIEhFQURfREVGSU5FUyA6PSAtRF9rZXJuZWxfc3RhcnQ9MHgkKEtFUk5FTF9TVEFSVCkgXAogCQktRF9rZXJuZWxfZW50cnk9MHgkKEtFUk5FTF9FTlRSWSkgXAogCQktRCBWRVJTSU9OPSJcIiQoVmVyc2lvbilcIiIgXAotCQktRCBUSU1FU1RBTVA9JChzaGVsbCBkYXRlICslcykgCisJCS1EIFRJTUVTVEFNUD0kKHNoZWxsIGRhdGUgKyVzKQogCiAkKG9iaikvaGVhZC5vOiAkKG9iaikvaGVhZC5TICQoS0VSTkVMX0lNQUdFKQogCSQoQ0MpIC1mbm8tcGljICQoSEVBRF9ERUZJTkVTKSAtSSQoVE9QRElSKS9pbmNsdWRlIC1jIC1vICRAICQ8CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFzYXQvaW1hZ2UvaGVhZC5TIGIvYXJjaC9taXBzL2xhc2F0L2ltYWdlL2hlYWQuUwppbmRleCA0MjZiZDdkLi5lZmI5NWYyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGFzYXQvaW1hZ2UvaGVhZC5TCisrKyBiL2FyY2gvbWlwcy9sYXNhdC9pbWFnZS9oZWFkLlMKQEAgLTI3LDUgKzI3LDUgQEAKIAkud29yZAlUSU1FU1RBTVAKIAogCS5vcmcJMHg1MAotcmVsZWFzZToJCityZWxlYXNlOgogCS5zdHJpbmcgVkVSU0lPTgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhc2F0L2ludGVycnVwdC5jIGIvYXJjaC9taXBzL2xhc2F0L2ludGVycnVwdC5jCmluZGV4IDExNDhhMmQuLmM5MGRhMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sYXNhdC9pbnRlcnJ1cHQuYworKysgYi9hcmNoL21pcHMvbGFzYXQvaW50ZXJydXB0LmMKQEAgLTE1LDcgKzE1LDcgQEAKICAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAogICogIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqCi0gKiBSb3V0aW5lcyBmb3IgZ2VuZXJpYyBtYW5pcHVsYXRpb24gb2YgdGhlIGludGVycnVwdHMgZm91bmQgb24gdGhlIAorICogUm91dGluZXMgZm9yIGdlbmVyaWMgbWFuaXB1bGF0aW9uIG9mIHRoZSBpbnRlcnJ1cHRzIGZvdW5kIG9uIHRoZQogICogTGFzYXQgYm9hcmRzLgogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTAxLDcgKzEwMSw3IEBACiAJcmV0dXJuICpsYXNhdF9pbnRfc3RhdHVzICYgKmxhc2F0X2ludF9tYXNrOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfaW50X3N0YXR1c18yMDAodm9pZCkgCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfaW50X3N0YXR1c18yMDAodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGludF9zdGF0dXM7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYXNhdC9sYXNhdF9ib2FyZC5jIGIvYXJjaC9taXBzL2xhc2F0L2xhc2F0X2JvYXJkLmMKaW5kZXggOGM3ODRiYy4uZmM5YjBlMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xhc2F0L2xhc2F0X2JvYXJkLmMKKysrIGIvYXJjaC9taXBzL2xhc2F0L2xhc2F0X2JvYXJkLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAogCWlmIChtaXBzX21hY2h0eXBlID09IE1BQ0hfTEFTQVRfMTAwKSB7CiAJCWxhc2F0X2JvYXJkX2luZm8ubGlfZmxhc2hfYmFzZSA9IDB4MWUwMDAwMDA7Ci0JCQorCiAJCWxiW0xBU0FUX01URF9CT09UTE9BREVSXSA9IDB4MWU0MDAwMDA7CiAKIAkJaWYgKGxhc2F0X2JvYXJkX2luZm8ubGlfZmxhc2hfc2l6ZSA+IDB4MjAwMDAwKSB7CkBAIC0xMDMsNyArMTAzLDcgQEAKIAltZW1zZXQoJmxhc2F0X2JvYXJkX2luZm8sIDAsIHNpemVvZihsYXNhdF9ib2FyZF9pbmZvKSk7CiAKIAkvKiBGaXJzdCByZWFkIHRoZSBFRVBST00gaW5mbyAqLwotCUVFUFJPTVJlYWQoMCwgKHVuc2lnbmVkIGNoYXIgKikmbGFzYXRfYm9hcmRfaW5mby5saV9lZXByb21faW5mbywgCisJRUVQUk9NUmVhZCgwLCAodW5zaWduZWQgY2hhciAqKSZsYXNhdF9ib2FyZF9pbmZvLmxpX2VlcHJvbV9pbmZvLAogCQkgICBzaXplb2Yoc3RydWN0IGxhc2F0X2VlcHJvbV9zdHJ1Y3QpKTsKIAogCS8qIENoZWNrIHRoZSBDUkMgKi8KQEAgLTE4OCw3ICsxODgsNyBAQAogCWNhc2UgMHgxOgogCQlsYXNhdF9ib2FyZF9pbmZvLmxpX2NwdV9oeiA9CiAJCQlsYXNhdF9ib2FyZF9pbmZvLmxpX2J1c19oeiArCi0JCQkobGFzYXRfYm9hcmRfaW5mby5saV9idXNfaHogPj4gMSk7CQorCQkJKGxhc2F0X2JvYXJkX2luZm8ubGlfYnVzX2h6ID4+IDEpOwogCQlicmVhazsKIAljYXNlIDB4MjoKIAkJbGFzYXRfYm9hcmRfaW5mby5saV9jcHVfaHogPQpAQCAtMjcxLDcgKzI3MSw3IEBACiAJbGFzYXRfYm9hcmRfaW5mby5saV9lZXByb21faW5mby5jcmMzMiA9IGNyYzsKIAogCS8qIFdyaXRlIHRoZSBFRVBST00gaW5mbyAqLwotCUVFUFJPTVdyaXRlKDAsICh1bnNpZ25lZCBjaGFyICopJmxhc2F0X2JvYXJkX2luZm8ubGlfZWVwcm9tX2luZm8sIAorCUVFUFJPTVdyaXRlKDAsICh1bnNpZ25lZCBjaGFyICopJmxhc2F0X2JvYXJkX2luZm8ubGlfZWVwcm9tX2luZm8sCiAJCSAgICBzaXplb2Yoc3RydWN0IGxhc2F0X2VlcHJvbV9zdHJ1Y3QpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhc2F0L3BpY3Z1ZS5jIGIvYXJjaC9taXBzL2xhc2F0L3BpY3Z1ZS5jCmluZGV4IDU2MzdjZDEuLjlhZTgyYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sYXNhdC9waWN2dWUuYworKysgYi9hcmNoL21pcHMvbGFzYXQvcGljdnVlLmMKQEAgLTEsNyArMSw3IEBACi0vKiAKKy8qCiAgKiBQaWN2dWUgUFZDMTYwMjA2IGRpc3BsYXkgZHJpdmVyCiAgKgotICogQnJpYW4gTXVycGh5IDxicmlhbkBtdXJwaHkuZGs+IAorICogQnJpYW4gTXVycGh5IDxicmlhbkBtdXJwaHkuZGs+CiAgKgogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0yNCwxMiArMjQsMTIgQEAKIAogREVDTEFSRV9NVVRFWChwdmNfc2VtKTsKIAotc3RhdGljIHZvaWQgcHZjX3JlZ193cml0ZSh1MzIgdmFsKSAKK3N0YXRpYyB2b2lkIHB2Y19yZWdfd3JpdGUodTMyIHZhbCkKIHsKIAkqcGljdnVlLT5yZWcgPSB2YWw7CiB9CiAKLXN0YXRpYyB1MzIgcHZjX3JlZ19yZWFkKHZvaWQpIAorc3RhdGljIHUzMiBwdmNfcmVnX3JlYWQodm9pZCkKIHsKIAl1MzIgdG1wID0gKnBpY3Z1ZS0+cmVnOwogCXJldHVybiB0bXA7CkBAIC02NSwxMiArNjUsMTIgQEAKIHsKIAl1MzIgZGF0YSA9IHB2Y19yZWdfcmVhZCgpOwogCXU4IGJ5dGU7Ci0JZGF0YSB8PSBwaWN2dWUtPnJ3OyAKKwlkYXRhIHw9IHBpY3Z1ZS0+cnc7CiAJZGF0YSAmPSB+cGljdnVlLT5yczsKIAlwdmNfcmVnX3dyaXRlKGRhdGEpOwogCW5kZWxheSg0MCk7CiAJYnl0ZSA9IHB2Y19yZWFkX2J5dGUoZGF0YSk7Ci0JZGF0YSB8PSBwaWN2dWUtPnJzOyAKKwlkYXRhIHw9IHBpY3Z1ZS0+cnM7CiAJcHZjX3JlZ193cml0ZShkYXRhKTsKIAlyZXR1cm4gYnl0ZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYXNhdC9waWN2dWUuaCBiL2FyY2gvbWlwcy9sYXNhdC9waWN2dWUuaAppbmRleCA3NGEzOTAzLi4yYTk2YmY5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGFzYXQvcGljdnVlLmgKKysrIGIvYXJjaC9taXBzL2xhc2F0L3BpY3Z1ZS5oCkBAIC0xLDcgKzEsNyBAQAotLyogCisvKgogICogUGljdnVlIFBWQzE2MDIwNiBkaXNwbGF5IGRyaXZlcgogICoKLSAqIEJyaWFuIE11cnBoeSA8YnJpYW4ubXVycGh5QGVpY29uLmNvbT4gCisgKiBCcmlhbiBNdXJwaHkgPGJyaWFuLm11cnBoeUBlaWNvbi5jb20+CiAgKgogICovCiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhc2F0L3BpY3Z1ZV9wcm9jLmMgYi9hcmNoL21pcHMvbGFzYXQvcGljdnVlX3Byb2MuYwppbmRleCBlYWEyYjQ2Li5jY2U3Y2RkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGFzYXQvcGljdnVlX3Byb2MuYworKysgYi9hcmNoL21pcHMvbGFzYXQvcGljdnVlX3Byb2MuYwpAQCAtMSw3ICsxLDcgQEAKLS8qIAorLyoKICAqIFBpY3Z1ZSBQVkMxNjAyMDYgZGlzcGxheSBkcml2ZXIKICAqCi0gKiBCcmlhbiBNdXJwaHkgPGJyaWFuLm11cnBoeUBlaWNvbi5jb20+IAorICogQnJpYW4gTXVycGh5IDxicmlhbi5tdXJwaHlAZWljb24uY29tPgogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNTEsMTAgKzUxLDEwIEBACiAgICAgICAgIHBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiJXNcbiIsIHB2Y19saW5lc1tsaW5lbm9dKTsKIAl1cCgmcHZjX3NlbSk7CiAKLSAgICAgICAgcmV0dXJuIHBhZ2UgLSBvcmlncGFnZTsgCisgICAgICAgIHJldHVybiBwYWdlIC0gb3JpZ3BhZ2U7CiB9CiAKLXN0YXRpYyBpbnQgcHZjX3Byb2Nfd3JpdGVfbGluZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLCAgICAgICAgICAgIAorc3RhdGljIGludCBwdmNfcHJvY193cml0ZV9saW5lKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewogICAgICAgICBpbnQgb3JpZ2NvdW50ID0gY291bnQ7CkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICAgcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgc2Nyb2xsX2RpciAqIHNjcm9sbF9pbnRlcnZhbCk7CiAJdXAoJnB2Y19zZW0pOwogCi0gICAgICAgIHJldHVybiBwYWdlIC0gb3JpZ3BhZ2U7IAorICAgICAgICByZXR1cm4gcGFnZSAtIG9yaWdwYWdlOwogfQogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYXNhdC9wcm9tLmMgYi9hcmNoL21pcHMvbGFzYXQvcHJvbS5jCmluZGV4IGNhNjI4ODEuLjg4YzdhYjggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sYXNhdC9wcm9tLmMKKysrIGIvYXJjaC9taXBzL2xhc2F0L3Byb20uYwpAQCAtNDIsNyArNDIsNyBAQAogLyogdGhlc2UgYXJlIGZ1bmN0aW9ucyBwcm92aWRlZCBieSB0aGUgYm9vdGxvYWRlciAqLwogc3RhdGljIHZvaWQgKCogcHJvbV9wdXRjKShjaGFyIGMpID0gbnVsbF9wcm9tX3B1dGM7CiB2b2lkICgqIHByb21fcHJpbnRmKShjb25zdCBjaGFyICogZm10LCAuLi4pID0gbnVsbF9wcm9tX3ByaW50ZjsKLXZvaWQgKCogcHJvbV9kaXNwbGF5KShjb25zdCBjaGFyICpzdHJpbmcsIGludCBwb3MsIGludCBjbGVhcikgPSAKK3ZvaWQgKCogcHJvbV9kaXNwbGF5KShjb25zdCBjaGFyICpzdHJpbmcsIGludCBwb3MsIGludCBjbGVhcikgPQogCQludWxsX3Byb21fZGlzcGxheTsKIHZvaWQgKCogcHJvbV9tb25pdG9yKSh2b2lkKSA9IG51bGxfcHJvbV9tb25pdG9yOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFzYXQvcmVzZXQuYyBiL2FyY2gvbWlwcy9sYXNhdC9yZXNldC5jCmluZGV4IDM3ZTQ5MTIuLjhkN2Q3YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sYXNhdC9yZXNldC5jCisrKyBiL2FyY2gvbWlwcy9sYXNhdC9yZXNldC5jCkBAIC0xLDQgKzEsNCBAQAotLyogCisvKgogICogVGhvbWFzIEhvcnN0ZW4gPHRoaEBsYXNhdC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTEFTQVQgTmV0d29ya3MgQS9TLgogICoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYXNhdC9zZXR1cC5jIGIvYXJjaC9taXBzL2xhc2F0L3NldHVwLmMKaW5kZXggZTM3MWVkNS4uZjI2MDRmYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xhc2F0L3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2xhc2F0L3NldHVwLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBsYXNhdF9wYW5pY19ibG9ja1tdID0gCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGxhc2F0X3BhbmljX2Jsb2NrW10gPQogewogCXsgbGFzYXRfcGFuaWNfZGlzcGxheSwgTlVMTCwgSU5UX01BWCB9LAogCXsgbGFzYXRfcGFuaWNfcHJvbV9tb25pdG9yLCBOVUxMLCBJTlRfTUlOIH0KQEAgLTEyMCw3ICsxMjAsNyBAQAogewogCiAJd3JpdGVfYzBfY29tcGFyZSgKLQkJcmVhZF9jMF9jb3VudCgpICsgCisJCXJlYWRfYzBfY291bnQoKSArCiAJCW1pcHNfaHB0X2ZyZXF1ZW5jeSAvIEhaKTsKIAljaGFuZ2VfYzBfc3RhdHVzKFNUMF9JTSwgSUVfSVJRMCB8IElFX0lSUTUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhc2F0L3N5c2N0bC5jIGIvYXJjaC9taXBzL2xhc2F0L3N5c2N0bC5jCmluZGV4IDFjMGNjNjIuLjhmZjQzYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sYXNhdC9zeXNjdGwuYworKysgYi9hcmNoL21pcHMvbGFzYXQvc3lzY3RsLmMKQEAgLTM3LDE0ICszNywxNCBAQAogCiBzdGF0aWMgREVDTEFSRV9NVVRFWChsYXNhdF9pbmZvX3NlbSk7CiAKLS8qIFN0cmF0ZWd5IGZ1bmN0aW9uIHRvIHdyaXRlIEVFUFJPTSBhZnRlciBjaGFuZ2luZyBzdHJpbmcgZW50cnkgKi8gCisvKiBTdHJhdGVneSBmdW5jdGlvbiB0byB3cml0ZSBFRVBST00gYWZ0ZXIgY2hhbmdpbmcgc3RyaW5nIGVudHJ5ICovCiBpbnQgc3lzY3RsX2xhc2F0c3RyaW5nKGN0bF90YWJsZSAqdGFibGUsIGludCAqbmFtZSwgaW50IG5sZW4sCiAJCXZvaWQgKm9sZHZhbCwgc2l6ZV90ICpvbGRsZW5wLAogCQl2b2lkICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQogewogCWludCByOwogCWRvd24oJmxhc2F0X2luZm9fc2VtKTsKLQlyID0gc3lzY3RsX3N0cmluZyh0YWJsZSwgbmFtZSwgCisJciA9IHN5c2N0bF9zdHJpbmcodGFibGUsIG5hbWUsCiAJCQkgIG5sZW4sIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4sIGNvbnRleHQpOwogCWlmIChyIDwgMCkgewogCQl1cCgmbGFzYXRfaW5mb19zZW0pOwpAQCAtNzQsNyArNzQsNyBAQAogCXJldHVybiAwOwogfQogCi0vKiBwcm9jIGZ1bmN0aW9uIHRvIHdyaXRlIEVFUFJPTSBhZnRlciBjaGFuZ2luZyBpbnQgZW50cnkgKi8gCisvKiBwcm9jIGZ1bmN0aW9uIHRvIHdyaXRlIEVFUFJPTSBhZnRlciBjaGFuZ2luZyBpbnQgZW50cnkgKi8KIGludCBwcm9jX2RvbGFzYXRpbnQoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC05Myw3ICs5Myw3IEBACiBzdGF0aWMgaW50IHJ0Y3RtcDsKIAogI2lmZGVmIENPTkZJR19EUzE2MDMKLS8qIHByb2MgZnVuY3Rpb24gdG8gcmVhZC93cml0ZSBSZWFsVGltZSBDbG9jayAqLyAKKy8qIHByb2MgZnVuY3Rpb24gdG8gcmVhZC93cml0ZSBSZWFsVGltZSBDbG9jayAqLwogaW50IHByb2NfZG9sYXNhdHJ0YyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTE2NSw5ICsxNjUsOSBAQAogdm9pZCB1cGRhdGVfYmNhc3RhZGRyKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGlwOwotCQotCWlwID0gKGxhc2F0X2JvYXJkX2luZm8ubGlfZWVwcm9tX2luZm8uaXBhZGRyICYgCi0JCWxhc2F0X2JvYXJkX2luZm8ubGlfZWVwcm9tX2luZm8ubmV0bWFzaykgfCAKKworCWlwID0gKGxhc2F0X2JvYXJkX2luZm8ubGlfZWVwcm9tX2luZm8uaXBhZGRyICYKKwkJbGFzYXRfYm9hcmRfaW5mby5saV9lZXByb21faW5mby5uZXRtYXNrKSB8CiAJCX5sYXNhdF9ib2FyZF9pbmZvLmxpX2VlcHJvbV9pbmZvLm5ldG1hc2s7CiAKIAlzcHJpbnRmKGxhc2F0X2JjYXN0YWRkciwgIiVkLiVkLiVkLiVkIiwKQEAgLTIwNSw3ICsyMDUsNyBAQAogCQkJCWJyZWFrOwogCQkJbGVuKys7CiAJCX0KLQkJaWYgKGxlbiA+PSBzaXplb2YocHJvY19sYXNhdF9pcGJ1ZiktMSkgCisJCWlmIChsZW4gPj0gc2l6ZW9mKHByb2NfbGFzYXRfaXBidWYpLTEpCiAJCQlsZW4gPSBzaXplb2YocHJvY19sYXNhdF9pcGJ1ZikgLSAxOwogCQlpZiAoY29weV9mcm9tX3VzZXIocHJvY19sYXNhdF9pcGJ1ZiwgYnVmZmVyLCBsZW4pKQogCQl7CkBAIC0yNDksOCArMjQ5LDggQEAKIH0KICNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19JTkVUKSAqLwogCi1zdGF0aWMgaW50IHN5c2N0bF9sYXNhdF9lZXByb21fdmFsdWUoY3RsX3RhYmxlICp0YWJsZSwgaW50ICpuYW1lLCBpbnQgbmxlbiwgCi0JCQkJICAgICB2b2lkICpvbGR2YWwsIHNpemVfdCAqb2xkbGVucCwgCitzdGF0aWMgaW50IHN5c2N0bF9sYXNhdF9lZXByb21fdmFsdWUoY3RsX3RhYmxlICp0YWJsZSwgaW50ICpuYW1lLCBpbnQgbmxlbiwKKwkJCQkgICAgIHZvaWQgKm9sZHZhbCwgc2l6ZV90ICpvbGRsZW5wLAogCQkJCSAgICAgdm9pZCAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLAogCQkJCSAgICAgdm9pZCAqKmNvbnRleHQpCiB7CkBAIC0yOTMsNyArMjkzLDcgQEAKIAkJaWYgKCFzdHJjbXAoZmlscC0+Zl9kZW50cnktPmRfbmFtZS5uYW1lLCAiZGVidWdhY2Nlc3MiKSkKIAkJCWxhc2F0X2JvYXJkX2luZm8ubGlfZWVwcm9tX2luZm8uZGVidWdhY2Nlc3MgPSBsYXNhdF9ib2FyZF9pbmZvLmxpX2RlYnVnYWNjZXNzOwogCX0KLQlsYXNhdF93cml0ZV9lZXByb21faW5mbygpOwkKKwlsYXNhdF93cml0ZV9lZXByb21faW5mbygpOwogCXVwKCZsYXNhdF9pbmZvX3NlbSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMTYsOCArMzE2LDggQEAKIAkgMDY0NCwgTlVMTCwgJnByb2NfbGFzYXRfaXAsICZzeXNjdGxfbGFzYXRfaW50dmVjfSwKIAl7TEFTQVRfTkVUTUFTSywgIm5ldG1hc2siLCAmbGFzYXRfYm9hcmRfaW5mby5saV9lZXByb21faW5mby5uZXRtYXNrLCBzaXplb2YoaW50KSwKIAkgMDY0NCwgTlVMTCwgJnByb2NfbGFzYXRfaXAsICZzeXNjdGxfbGFzYXRfaW50dmVjfSwKLQl7TEFTQVRfQkNBU1QsICJiY2FzdGFkZHIiLCAmbGFzYXRfYmNhc3RhZGRyLCAKLQkJc2l6ZW9mKGxhc2F0X2JjYXN0YWRkciksIDA2MDAsIE5VTEwsIAorCXtMQVNBVF9CQ0FTVCwgImJjYXN0YWRkciIsICZsYXNhdF9iY2FzdGFkZHIsCisJCXNpemVvZihsYXNhdF9iY2FzdGFkZHIpLCAwNjAwLCBOVUxMLAogCQkmcHJvY19kb3N0cmluZywgJnN5c2N0bF9zdHJpbmd9LAogI2VuZGlmCiAJe0xBU0FUX1BBU1NXT1JELCAicGFzc3dkX2hhc2giLCAmbGFzYXRfYm9hcmRfaW5mby5saV9lZXByb21faW5mby5wYXNzd2RfaGFzaCwgc2l6ZW9mKGxhc2F0X2JvYXJkX2luZm8ubGlfZWVwcm9tX2luZm8ucGFzc3dkX2hhc2gpLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi0zMi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9saWItMzIvTWFrZWZpbGUKaW5kZXggZmQ2YTJiYS4uYWQyODU3OCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xpYi0zMi9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbGliLTMyL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgTUlQUy1zcGVjaWZpYyBsaWJyYXJ5IGZpbGVzLi4KICMKIAotbGliLXkJKz0gY3N1bV9wYXJ0aWFsLm8gbWVtc2V0Lm8gd2F0Y2gubyAKK2xpYi15CSs9IGNzdW1fcGFydGlhbC5vIG1lbXNldC5vIHdhdGNoLm8KIAogb2JqLSQoQ09ORklHX0NQVV9NSVBTMzIpCSs9IGR1bXBfdGxiLm8KIG9iai0kKENPTkZJR19DUFVfTUlQUzY0KQkrPSBkdW1wX3RsYi5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliLTMyL21lbXNldC5TIGIvYXJjaC9taXBzL2xpYi0zMi9tZW1zZXQuUwppbmRleCBhZDlmZjQwLi4xOTgxNDg1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliLTMyL21lbXNldC5TCisrKyBiL2FyY2gvbWlwcy9saWItMzIvbWVtc2V0LlMKQEAgLTcsNyArNyw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICovCiAjaW5jbHVkZSA8YXNtL2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CiAKICNkZWZpbmUgRVgoaW5zbixyZWcsYWRkcixoYW5kbGVyKQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWItNjQvTWFrZWZpbGUgYi9hcmNoL21pcHMvbGliLTY0L01ha2VmaWxlCmluZGV4IGZkNmEyYmEuLmFkMjg1NzggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9saWItNjQvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2xpYi02NC9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIE1JUFMtc3BlY2lmaWMgbGlicmFyeSBmaWxlcy4uCiAjCiAKLWxpYi15CSs9IGNzdW1fcGFydGlhbC5vIG1lbXNldC5vIHdhdGNoLm8gCitsaWIteQkrPSBjc3VtX3BhcnRpYWwubyBtZW1zZXQubyB3YXRjaC5vCiAKIG9iai0kKENPTkZJR19DUFVfTUlQUzMyKQkrPSBkdW1wX3RsYi5vCiBvYmotJChDT05GSUdfQ1BVX01JUFM2NCkJKz0gZHVtcF90bGIubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi02NC9tZW1zZXQuUyBiL2FyY2gvbWlwcy9saWItNjQvbWVtc2V0LlMKaW5kZXggMjQyZjE5Ny4uZTJjNDJjOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xpYi02NC9tZW1zZXQuUworKysgYi9hcmNoL21pcHMvbGliLTY0L21lbXNldC5TCkBAIC03LDcgKzcsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KICAqLwogI2luY2x1ZGUgPGFzbS9hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgogCiAjZGVmaW5lIEVYKGluc24scmVnLGFkZHIsaGFuZGxlcikJCQlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL2RlY19hbmRfbG9jay5jIGIvYXJjaC9taXBzL2xpYi9kZWNfYW5kX2xvY2suYwppbmRleCBlNDRlOTU3Li5mZDgyYzg0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL2RlY19hbmRfbG9jay5jCisrKyBiL2FyY2gvbWlwcy9saWIvZGVjX2FuZF9sb2NrLmMKQEAgLTIwLDE0ICsyMCw3IEBACiAgKiBoYXMgYSBjbXB4Y2hnLCBhbmQgd2hlcmUgYXRvbWljLT52YWx1ZSBpcyBhbiBpbnQgaG9sZGluZwogICogdGhlIHZhbHVlIG9mIHRoZSBhdG9taWMgKGkuZS4gdGhlIGhpZ2ggYml0cyBhcmVuJ3QgdXNlZAogICogZm9yIGEgbG9jayBvciBhbnl0aGluZyBsaWtlIHRoYXQpLgotICoKLSAqIE4uQi4gQVRPTUlDX0RFQ19BTkRfTE9DSyBnZXRzIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9zcGlubG9jay5oCi0gKiBpZiBzcGlubG9ja3MgYXJlIGVtcHR5IGFuZCB0aHVzIGF0b21pY19kZWNfYW5kX2xvY2sgaXMgZGVmaW5lZAotICogdG8gYmUgYXRvbWljX2RlY19hbmRfdGVzdCAtIGluIHRoYXQgY2FzZSB3ZSBkb24ndCBuZWVkIGl0Ci0gKiBkZWZpbmVkIGhlcmUgYXMgd2VsbC4KICAqLwotCi0jaWZuZGVmIEFUT01JQ19ERUNfQU5EX0xPQ0sKIGludCBfYXRvbWljX2RlY19hbmRfbG9jayhhdG9taWNfdCAqYXRvbWljLCBzcGlubG9ja190ICpsb2NrKQogewogCWludCBjb3VudGVyOwpAQCAtNTIsNCArNDUsMyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKF9hdG9taWNfZGVjX2FuZF9sb2NrKTsKLSNlbmRpZiAvKiBBVE9NSUNfREVDX0FORF9MT0NLICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL21lbWNweS5TIGIvYXJjaC9taXBzL2xpYi9tZW1jcHkuUwppbmRleCBhZmE4ZWFlLi5hNzg4NjVmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL21lbWNweS5TCisrKyBiL2FyY2gvbWlwcy9saWIvbWVtY3B5LlMKQEAgLTE0LDcgKzE0LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS9hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgogCiAjZGVmaW5lIGRzdCBhMApAQCAtNzksNyArNzksNyBAQAogLyoKICAqIE9ubHkgb24gdGhlIDY0LWJpdCBrZXJuZWwgd2UgY2FuIG1hZGUgdXNlIG9mIDY0LWJpdCByZWdpc3RlcnMuCiAgKi8KLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAjZGVmaW5lIFVTRV9ET1VCTEUKICNlbmRpZgogCkBAIC0xMDEsNyArMTAxLDcgQEAKICNkZWZpbmUgTkJZVEVTIDgKICNkZWZpbmUgTE9HX05CWVRFUyAzCiAKLS8qIAorLyoKICAqIEFzIHdlIGFyZSBzaGFyaW5nIGNvZGUgYmFzZSB3aXRoIHRoZSBtaXBzMzIgdHJlZSAod2hpY2ggdXNlIHRoZSBvMzIgQUJJCiAgKiByZWdpc3RlciBkZWZpbml0aW9ucykuIFdlIG5lZWQgdG8gcmVkZWZpbmUgdGhlIHJlZ2lzdGVyIGRlZmluaXRpb25zIGZyb20KICAqIHRoZSBuNjQgQUJJIHJlZ2lzdGVyIG5hbWluZyB0byB0aGUgbzMyIEFCSSByZWdpc3RlciBuYW1pbmcuCkBAIC0xMTgsNyArMTE4LDcgQEAKICNkZWZpbmUgdDUJJDEzCiAjZGVmaW5lIHQ2CSQxNAogI2RlZmluZSB0NwkkMTUKLQkKKwogI2Vsc2UKIAogI2RlZmluZSBMT0FEICAgbHcKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWIvc3RybGVuX3VzZXIuUyBiL2FyY2gvbWlwcy9saWIvc3RybGVuX3VzZXIuUwppbmRleCAwNzY2MGU4Li5lY2E1NThkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL3N0cmxlbl91c2VyLlMKKysrIGIvYXJjaC9taXBzL2xpYi9zdHJsZW5fdXNlci5TCkBAIC03LDcgKzcsNyBAQAogICogQ29weXJpZ2h0IChjKSAxOTk5IFNpbGljb24gR3JhcGhpY3MsIEluYy4KICAqLwogI2luY2x1ZGUgPGFzbS9hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgogCiAjZGVmaW5lIEVYKGluc24scmVnLGFkZHIsaGFuZGxlcikJCQlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL3N0cm5jcHlfdXNlci5TIGIvYXJjaC9taXBzL2xpYi9zdHJuY3B5X3VzZXIuUwppbmRleCAxNGJlZDE3Li5kMTZjNzZmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL3N0cm5jcHlfdXNlci5TCisrKyBiL2FyY2gvbWlwcy9saWIvc3RybmNweV91c2VyLlMKQEAgLTcsNyArNyw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgogCiAjZGVmaW5lIEVYKGluc24scmVnLGFkZHIsaGFuZGxlcikJCQlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL3N0cm5sZW5fdXNlci5TIGIvYXJjaC9taXBzL2xpYi9zdHJubGVuX3VzZXIuUwppbmRleCA2ZTdhOGVlLi5jMGVhMTUxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL3N0cm5sZW5fdXNlci5TCisrKyBiL2FyY2gvbWlwcy9saWIvc3Rybmxlbl91c2VyLlMKQEAgLTcsNyArNyw3IEBACiAgKiBDb3B5cmlnaHQgKGMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICovCiAjaW5jbHVkZSA8YXNtL2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CiAKICNkZWZpbmUgRVgoaW5zbixyZWcsYWRkcixoYW5kbGVyKQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tYXRoLWVtdS9jcDFlbXUuYyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9jcDFlbXUuYwppbmRleCAyMGE1NTJiLi45OWM1NTA2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWF0aC1lbXUvY3AxZW11LmMKKysrIGIvYXJjaC9taXBzL21hdGgtZW11L2NwMWVtdS5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAljYXNlIGNvcDFfb3A6CiAJCXN3aXRjaCAoTUlQU0luc3RfUlMoaXIpKSB7CiAKLSNpZiBfX21pcHM2NCAmJiAhZGVmaW5lZChTSU5HTEVfT05MWV9GUFUpCisjaWYgZGVmaW5lZChfX21pcHM2NCkgJiYgIWRlZmluZWQoU0lOR0xFX09OTFlfRlBVKQogCQljYXNlIGRtZmNfb3A6CiAJCQkvKiBjb3ByZWdpc3RlciBmcyAtPiBncHJbcnRdICovCiAJCQlpZiAoTUlQU0luc3RfUlQoaXIpICE9IDApIHsKQEAgLTgwNSw3ICs4MDUsNyBAQAogCQlpZWVlNzU0ZHAgZDsKIAkJaWVlZTc1NHNwIHM7CiAJCWludCB3OwotI2lmIF9fbWlwczY0CisjaWZkZWYgX19taXBzNjQKIAkJczY0IGw7CiAjZW5kaWYKIAl9IHJ2OwkJCS8qIHJlc3VsdGluZyB2YWx1ZSAqLwpAQCAtOTUwLDcgKzk1MCw3IEBACiAJCX0KICNlbmRpZiAvKiBfX21pcHMgPj0gMiAqLwogCi0jaWYgX19taXBzNjQgJiYgIWRlZmluZWQoU0lOR0xFX09OTFlfRlBVKQorI2lmIGRlZmluZWQoX19taXBzNjQpICYmICFkZWZpbmVkKFNJTkdMRV9PTkxZX0ZQVSkKIAkJY2FzZSBmY3Z0bF9vcDp7CiAJCQlpZWVlNzU0c3AgZnM7CiAKQEAgLTExMjUsNyArMTEyNSw3IEBACiAJCX0KICNlbmRpZgogCi0jaWYgX19taXBzNjQgJiYgIWRlZmluZWQoU0lOR0xFX09OTFlfRlBVKQorI2lmIGRlZmluZWQoX19taXBzNjQpICYmICFkZWZpbmVkKFNJTkdMRV9PTkxZX0ZQVSkKIAkJY2FzZSBmY3Z0bF9vcDp7CiAJCQlpZWVlNzU0ZHAgZnM7CiAKQEAgLTEyMDMsNyArMTIwMyw3IEBACiAJCWJyZWFrOwogCX0KIAotI2lmIF9fbWlwczY0ICYmICFkZWZpbmVkKFNJTkdMRV9PTkxZX0ZQVSkKKyNpZiBkZWZpbmVkKF9fbWlwczY0KSAmJiAhZGVmaW5lZChTSU5HTEVfT05MWV9GUFUpCiAJY2FzZSBsX2ZtdDp7CiAJCXN3aXRjaCAoTUlQU0luc3RfRlVOQyhpcikpIHsKIAkJY2FzZSBmY3Z0c19vcDoKQEAgLTEyNjcsNyArMTI2Nyw3IEBACiAJY2FzZSB3X2ZtdDoKIAkJU0lUT1JFRyhydi53LCBNSVBTSW5zdF9GRChpcikpOwogCQlicmVhazsKLSNpZiBfX21pcHM2NCAmJiAhZGVmaW5lZChTSU5HTEVfT05MWV9GUFUpCisjaWYgZGVmaW5lZChfX21pcHM2NCkgJiYgIWRlZmluZWQoU0lOR0xFX09OTFlfRlBVKQogCWNhc2UgbF9mbXQ6CiAJCURJVE9SRUcocnYubCwgTUlQU0luc3RfRkQoaXIpKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWF0aC1lbXUva2VybmVsX2xpbmthZ2UuYyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9rZXJuZWxfbGlua2FnZS5jCmluZGV4IDA0Mzk3ZmVjLi40MDAyZjBjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWF0aC1lbXUva2VybmVsX2xpbmthZ2UuYworKysgYi9hcmNoL21pcHMvbWF0aC1lbXUva2VybmVsX2xpbmthZ2UuYwpAQCAtODYsNyArODYsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAvKgogICogVGhpcyBpcyB0aGUgbzMyIHZlcnNpb24KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2F0bGFzL2F0bGFzX2ludC5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2F0bGFzL2F0bGFzX2ludC5jCmluZGV4IDhmMWQ4NzUuLjE5ZDRiMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9hdGxhcy9hdGxhc19pbnQuYworKysgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvYXRsYXMvYXRsYXNfaW50LmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCWludCBpOwogCiAJYXRsYXNfaHcwX2ljcmVncyA9IChzdHJ1Y3QgYXRsYXNfaWN0cmxfcmVncyAqKWlvcmVtYXAgKEFUTEFTX0lDVFJMX1JFR1NfQkFTRSwgc2l6ZW9mKHN0cnVjdCBhdGxhc19pY3RybF9yZWdzICopKTsKLQkKKwogCS8qCiAJICogTWFzayBvdXQgYWxsIGludGVycnVwdCBieSB3cml0aW5nICIxIiB0byBhbGwgYml0IHBvc2l0aW9uIGluCiAJICogdGhlIGludGVycnVwdCByZXNldCByZWcuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy9pbml0LmMgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy9pbml0LmMKaW5kZXggMzFjYWYwNi4uMzExMTU1ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvaW5pdC5jCisrKyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL2luaXQuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJCQlnZW5lcmljX3B1dERlYnVnQ2hhciA9IHNhYTk3MzBfcHV0RGVidWdDaGFyOwogCQkJZ2VuZXJpY19nZXREZWJ1Z0NoYXIgPSBzYWE5NzMwX2dldERlYnVnQ2hhcjsKIAkJfQotCQllbHNlIAorCQllbHNlCiAjZW5kaWYKIAkJewogCQkJc3BlZWQgPSByc19rZ2RiX2hvb2sobGluZSwgc3BlZWQpOwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJbWlwc19yZXZpc2lvbl9jb3JpZCA9IE1JUFNfUkVWSVNJT05fQ09SSUQ7CiAKIAlpZiAobWlwc19yZXZpc2lvbl9jb3JpZCA9PSBNSVBTX1JFVklTSU9OX0NPUklEX0NPUkVfRU1VTCkgewotCQlpZiAoQk9OSVRPX1BDSURJRCA9PSAweDAwMDFkZjUzIHx8IAorCQlpZiAoQk9OSVRPX1BDSURJRCA9PSAweDAwMDFkZjUzIHx8CiAJCSAgICBCT05JVE9fUENJRElEID09IDB4MDAwM2RmNTMpCiAJCQltaXBzX3JldmlzaW9uX2NvcmlkID0gTUlQU19SRVZJU0lPTl9DT1JJRF9DT1JFX0VNVUxfQk9OOwogCQllbHNlCkBAIC0zMTAsNyArMzEwLDcgQEAKIAljYXNlIE1JUFNfUkVWSVNJT05fQ09SSURfQ09SRV9NU0M6CiAJY2FzZSBNSVBTX1JFVklTSU9OX0NPUklEX0NPUkVfRlBHQTI6CiAJY2FzZSBNSVBTX1JFVklTSU9OX0NPUklEX0NPUkVfRU1VTF9NU0M6Ci0JCV9wY2ljdHJsX21zYyA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoTUlQU19NU0MwMV9QQ0lfUkVHX0JBU0UsIDB4MjAwMCk7IAorCQlfcGNpY3RybF9tc2MgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKE1JUFNfTVNDMDFfUENJX1JFR19CQVNFLCAweDIwMDApOwogCiAjaWZkZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCiAJCU1TQ19XUklURShNU0MwMV9QQ0lfU1dBUCwgTVNDMDFfUENJX1NXQVBfTk9TV0FQKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3RpbWUuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3RpbWUuYwppbmRleCBmZTdmYzE3Li4xNjMxNTQ0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy90aW1lLmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvdGltZS5jCkBAIC04OSw3ICs4OSw3IEBACiAJICogcmVhbGx5IGNhbGN1bGF0ZSB0aGUgdGltZXIgZnJlcXVlbmN5CiAJICogRm9yIG5vdyB3ZSBoYXJkd2lyZSB0aGUgU0VBRCBib2FyZCBmcmVxdWVuY3kgdG8gMTJNSHouCiAJICovCi0JCisKIAlpZiAoKHByaWQgPT0gKFBSSURfQ09NUF9NSVBTIHwgUFJJRF9JTVBfMjBLQykpIHx8CiAJICAgIChwcmlkID09IChQUklEX0NPTVBfTUlQUyB8IFBSSURfSU1QXzI1S0YpKSkKIAkJY291bnQgPSAxMjAwMDAwMDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL21hbHRhX3NldHVwLmMKaW5kZXggMzM3N2U2Ni4uZGY2ZGI2NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL21hbHRhX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL21hbHRhX3NldHVwLmMKQEAgLTE0OSwxNSArMTQ5LDE1IEBACiAJCQlhcmdwdHIgPSBwcm9tX2dldGNtZGxpbmUoKTsKIAkJCWlmIChzdHJzdHIoYXJncHRyLCAiaW9iY3VuY2FjaGVkIikpIHsKIAkJCQlCT05JVE9fUENJQ0FDSEVDVFJMICY9IH5CT05JVE9fUENJQ0FDSEVDVFJMX0lPQkNDT0hfRU47Ci0JCQkJQk9OSVRPX1BDSU1FTUJBU0VDRkcgPSBCT05JVE9fUENJTUVNQkFTRUNGRyAmIAorCQkJCUJPTklUT19QQ0lNRU1CQVNFQ0ZHID0gQk9OSVRPX1BDSU1FTUJBU0VDRkcgJgogCQkJCQl+KEJPTklUT19QQ0lNRU1CQVNFQ0ZHX01FTUJBU0UwX0NBQ0hFRCB8CiAJCQkJCSAgQk9OSVRPX1BDSU1FTUJBU0VDRkdfTUVNQkFTRTFfQ0FDSEVEKTsKIAkJCQlwcmludGsoIkRpc2FibGVkIEJvbml0byBJT0JDIGNvaGVyZW5jeVxuIik7CiAJCQl9CiAJCQllbHNlIHsKIAkJCQlCT05JVE9fUENJQ0FDSEVDVFJMIHw9IEJPTklUT19QQ0lDQUNIRUNUUkxfSU9CQ0NPSF9FTjsKLQkJCQlCT05JVE9fUENJTUVNQkFTRUNGRyB8PSAKLQkJCQkJKEJPTklUT19QQ0lNRU1CQVNFQ0ZHX01FTUJBU0UwX0NBQ0hFRCB8IAorCQkJCUJPTklUT19QQ0lNRU1CQVNFQ0ZHIHw9CisJCQkJCShCT05JVE9fUENJTUVNQkFTRUNGR19NRU1CQVNFMF9DQUNIRUQgfAogCQkJCQkgQk9OSVRPX1BDSU1FTUJBU0VDRkdfTUVNQkFTRTFfQ0FDSEVEKTsKIAkJCQlwcmludGsoIkRpc2FibGVkIEJvbml0byBJT0JDIGNvaGVyZW5jeVxuIik7CiAJCQl9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vTWFrZWZpbGUgYi9hcmNoL21pcHMvbW0vTWFrZWZpbGUKaW5kZXggZjYxZTAzOC4uYjU2YTBhYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9tbS9NYWtlZmlsZQpAQCAtNSw4ICs1LDggQEAKIG9iai15CQkJCSs9IGNhY2hlLm8gZXh0YWJsZS5vIGZhdWx0Lm8gaW5pdC5vIHBndGFibGUubyBcCiAJCQkJICAgdGxiZXgubyB0bGJleC1mYXVsdC5vCiAKLW9iai0kKENPTkZJR19NSVBTMzIpCQkrPSBpb3JlbWFwLm8gcGd0YWJsZS0zMi5vCi1vYmotJChDT05GSUdfTUlQUzY0KQkJKz0gcGd0YWJsZS02NC5vCitvYmotJChDT05GSUdfMzJCSVQpCQkrPSBpb3JlbWFwLm8gcGd0YWJsZS0zMi5vCitvYmotJChDT05GSUdfNjRCSVQpCQkrPSBwZ3RhYmxlLTY0Lm8KIG9iai0kKENPTkZJR19ISUdITUVNKQkJKz0gaGlnaG1lbS5vCiAKIG9iai0kKENPTkZJR19DUFVfTUlQUzMyKQkrPSBjLXI0ay5vIGNleC1nZW4ubyBwZy1yNGsubyB0bGItcjRrLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jLXI0ay5jIGIvYXJjaC9taXBzL21tL2MtcjRrLmMKaW5kZXggYTAzZWJiMi4uNWVhODRiYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2MtcjRrLmMKKysrIGIvYXJjaC9taXBzL21tL2MtcjRrLmMKQEAgLTEyNiwxMyArMTI2LDEzIEBACiAKIAlDQUNIRTMyX1VOUk9MTDMyX0FMSUdOMjsKIAkvKiBJJ20gaW4gZXZlbiBjaHVuay4gIGJsYXN0IG9kZCBjaHVua3MgKi8KLQlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykgCi0JCWZvciAoYWRkciA9IHN0YXJ0ICsgMHg0MDA7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHg0MDAgKiAyKSAKKwlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKKwkJZm9yIChhZGRyID0gc3RhcnQgKyAweDQwMDsgYWRkciA8IGVuZDsgYWRkciArPSAweDQwMCAqIDIpCiAJCQljYWNoZTMyX3Vucm9sbDMyKGFkZHJ8d3MsSW5kZXhfSW52YWxpZGF0ZV9JKTsKIAlDQUNIRTMyX1VOUk9MTDMyX0FMSUdOOwogCS8qIEknbSBpbiBvZGQgY2h1bmsuICBibGFzdCBldmVuIGNodW5rcyAqLwotCWZvciAod3MgPSAwOyB3cyA8IHdzX2VuZDsgd3MgKz0gd3NfaW5jKSAKLQkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHg0MDAgKiAyKSAKKwlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKKwkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHg0MDAgKiAyKQogCQkJY2FjaGUzMl91bnJvbGwzMihhZGRyfHdzLEluZGV4X0ludmFsaWRhdGVfSSk7CiB9CiAKQEAgLTE1NiwxMyArMTU2LDEzIEBACiAKIAlDQUNIRTMyX1VOUk9MTDMyX0FMSUdOMjsKIAkvKiBJJ20gaW4gZXZlbiBjaHVuay4gIGJsYXN0IG9kZCBjaHVua3MgKi8KLQlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykgCi0JCWZvciAoYWRkciA9IHN0YXJ0ICsgMHg0MDA7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHg0MDAgKiAyKSAKKwlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKKwkJZm9yIChhZGRyID0gc3RhcnQgKyAweDQwMDsgYWRkciA8IGVuZDsgYWRkciArPSAweDQwMCAqIDIpCiAJCQljYWNoZTMyX3Vucm9sbDMyKGFkZHJ8d3MsSW5kZXhfSW52YWxpZGF0ZV9JKTsKIAlDQUNIRTMyX1VOUk9MTDMyX0FMSUdOOwogCS8qIEknbSBpbiBvZGQgY2h1bmsuICBibGFzdCBldmVuIGNodW5rcyAqLwotCWZvciAod3MgPSAwOyB3cyA8IHdzX2VuZDsgd3MgKz0gd3NfaW5jKSAKLQkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHg0MDAgKiAyKSAKKwlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKKwkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHg0MDAgKiAyKQogCQkJY2FjaGUzMl91bnJvbGwzMihhZGRyfHdzLEluZGV4X0ludmFsaWRhdGVfSSk7CiB9CiAKQEAgLTcyMywxMCArNzIzLDEwIEBACiAJCQkiLnNldCBwdXNoXG5cdCIKIAkJCSIuc2V0IG5vYXRcblx0IgogCQkJIi5zZXQgbWlwczNcblx0IgotI2lmZGVmIENPTkZJR19NSVBTMzIKKyNpZmRlZiBDT05GSUdfMzJCSVQKIAkJCSJsYQkkYXQsMWZcblx0IgogI2VuZGlmCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCQkJImRsYQkkYXQsMWZcblx0IgogI2VuZGlmCiAJCQkiY2FjaGUJJTAsKCRhdClcblx0IgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2Mtc2IxLmMgYi9hcmNoL21pcHMvbW0vYy1zYjEuYwppbmRleCBhYjMwYWZkLi41MDJmNjhjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vYy1zYjEuYworKysgYi9hcmNoL21pcHMvbW0vYy1zYjEuYwpAQCAtMjcwLDcgKzI3MCw3IEBACiAJCV9fc2IxX3dyaXRlYmFja19pbnZfZGNhY2hlX2FsbCgpOwogCWVsc2UKIAkJX19zYjFfd3JpdGViYWNrX2ludl9kY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCk7Ci0JCisKIAkvKiBKdXN0IGZsdXNoIHRoZSB3aG9sZSBpY2FjaGUgaWYgdGhlIHJhbmdlIGlzIGJpZyBlbm91Z2ggKi8KIAlpZiAoKGVuZCAtIHN0YXJ0KSA+IGljYWNoZV9yYW5nZV9jdXRvZmYpCiAJCV9fc2IxX2ZsdXNoX2ljYWNoZV9hbGwoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jZXJyLXNiMS5jIGIvYXJjaC9taXBzL21tL2NlcnItc2IxLmMKaW5kZXggMTNkOTZkNi4uNzE2NmZmZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2NlcnItc2IxLmMKKysrIGIvYXJjaC9taXBzL21tL2NlcnItc2IxLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9yZWdzLmg+CiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfc2NkLmg+CiAjZW5kaWYKLSAKKwogLyogU0IxIGRlZmluaXRpb25zICovCiAKIC8qIFhYWCBzaG91bGQgY29tZSBmcm9tIGNvbmZpZzEgWFhYICovCkBAIC0xMzYsMTQgKzEzNiwxNCBAQAogCiAjaWZuZGVmIENPTkZJR19TSUJZVEVfQlVTX1dBVENIRVIKIAotc3RhdGljIHZvaWQgY2hlY2tfYnVzX3dhdGNoZXIodm9pZCkgICAgICAgICAgICAgIAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0YXRpYyB2b2lkIGNoZWNrX2J1c193YXRjaGVyKHZvaWQpCit7CiAJdWludDMyX3Qgc3RhdHVzLCBsMl9lcnIsIG1lbWlvX2VycjsKIAogCS8qIERlc3RydWN0aXZlIHJlYWQsIGNsZWFycyByZWdpc3RlciBhbmQgaW50ZXJydXB0ICovCiAJc3RhdHVzID0gY3NyX2luMzIoSU9BRERSKEFfU0NEX0JVU19FUlJfU1RBVFVTKSk7CiAJLyogQml0IDMxIGlzIGFsd2F5cyBvbiwgYnV0IHRoZXJlJ3Mgbm8gI2RlZmluZSBmb3IgdGhhdCAqLwotCWlmIChzdGF0dXMgJiB+KDFVTCA8PCAzMSkpIHsgIAorCWlmIChzdGF0dXMgJiB+KDFVTCA8PCAzMSkpIHsKIAkJbDJfZXJyID0gY3NyX2luMzIoSU9BRERSKEFfQlVTX0wyX0VSUk9SUykpOwogCQltZW1pb19lcnIgPSBjc3JfaW4zMihJT0FERFIoQV9CVVNfTUVNX0lPX0VSUk9SUykpOwogCQlwcm9tX3ByaW50ZigiQnVzIHdhdGNoZXIgZXJyb3IgY291bnRlcnM6ICUwOHggJTA4eFxuIiwgbDJfZXJyLCBtZW1pb19lcnIpOwpAQCAtMTUzLDE0ICsxNTMsMTQgQEAKIAkJICAgICAgIChpbnQpKEdfU0NEX0JFUlJfVElEKHN0YXR1cykgPj4gNiksCiAJCSAgICAgICAoaW50KUdfU0NEX0JFUlJfUklEKHN0YXR1cyksCiAJCSAgICAgICAoaW50KUdfU0NEX0JFUlJfRENPREUoc3RhdHVzKSk7Ci0JfSBlbHNlIHsJCQotCQlwcm9tX3ByaW50ZigiQnVzIHdhdGNoZXIgaW5kaWNhdGVzIG5vIGVycm9yXG4iKTsgCi0JfQkJCQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1leHRlcm4gdm9pZCBjaGVja19idXNfd2F0Y2hlcih2b2lkKTsgICAgCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJfSBlbHNlIHsKKwkJcHJvbV9wcmludGYoIkJ1cyB3YXRjaGVyIGluZGljYXRlcyBubyBlcnJvclxuIik7CisJfQorfQorI2Vsc2UKK2V4dGVybiB2b2lkIGNoZWNrX2J1c193YXRjaGVyKHZvaWQpOworI2VuZGlmCisKIGFzbWxpbmthZ2Ugdm9pZCBzYjFfY2FjaGVfZXJyb3Iodm9pZCkKIHsKIAl1aW50NjRfdCBjZXJyX2RwYTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9kbWEtbm9uY29oZXJlbnQuYyBiL2FyY2gvbWlwcy9tbS9kbWEtbm9uY29oZXJlbnQuYwppbmRleCA5ODk1ZTMyLi41OWU1NGYxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vZG1hLW5vbmNvaGVyZW50LmMKKysrIGIvYXJjaC9taXBzL21tL2RtYS1ub25jb2hlcmVudC5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrLCBzZysrKSB7CiAJCXVuc2lnbmVkIGxvbmcgYWRkcjsKLSAKKwogCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHBhZ2VfYWRkcmVzcyhzZy0+cGFnZSk7CiAJCWlmIChhZGRyKQogCQkJX19kbWFfc3luYyhhZGRyICsgc2ctPm9mZnNldCwgc2ctPmxlbmd0aCwgZGlyZWN0aW9uKTsKQEAgLTIzMCw5ICsyMzAsOSBAQAogCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwotIAorCiAJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7Ci0gCisKIAlhZGRyID0gZG1hX2hhbmRsZSArIFBBR0VfT0ZGU0VUOwogCV9fZG1hX3N5bmMoYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKIH0KQEAgLTI4Miw5ICsyODIsOSBAQAogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKIAlpbnQgaTsKLSAKKwogCUJVR19PTihkaXJlY3Rpb24gPT0gRE1BX05PTkUpOwotIAorCiAJLyogTWFrZSBzdXJlIHRoYXQgZ2NjIGRvZXNuJ3QgbGVhdmUgdGhlIGVtcHR5IGxvb3AgYm9keS4gICovCiAJZm9yIChpID0gMDsgaSA8IG5lbGVtczsgaSsrLCBzZysrKQogCQlfX2RtYV9zeW5jKCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhzZy0+cGFnZSksCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vaW5pdC5jIGIvYXJjaC9taXBzL21tL2luaXQuYwppbmRleCA5YzlhMjcxLi5kYzY4MzBiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vaW5pdC5jCisrKyBiL2FyY2gvbWlwcy9tbS9pbml0LmMKQEAgLTk2LDcgKzk2LDcgQEAKIAlrbWFwX3Byb3QgPSBQQUdFX0tFUk5FTDsKIH0KIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIHN0YXRpYyB2b2lkIF9faW5pdCBmaXhyYW5nZV9pbml0KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAogCXBnZF90ICpwZ2RfYmFzZSkKIHsKQEAgLTEyNSw3ICsxMjUsNyBAQAogCQlqID0gMDsKIAl9CiB9Ci0jZW5kaWYgLyogQ09ORklHX01JUFM2NCAqLworI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogI2VuZGlmIC8qIENPTkZJR19ISUdITUVNICovCiAKICNpZm5kZWYgQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVMKQEAgLTI1OCw3ICsyNTgsNyBAQAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogdm9pZCBmcmVlX2luaXRyZF9tZW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCS8qIFN3aXRjaCBmcm9tIEtTRUcwIHRvIFhLUEhZUyBhZGRyZXNzZXMgKi8KIAlzdGFydCA9ICh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChDUEhZU0FERFIoc3RhcnQpKTsKIAllbmQgPSAodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQoQ1BIWVNBRERSKGVuZCkpOwpAQCAtMjg2LDcgKzI4Niw3IEBACiAKIAlhZGRyID0gKHVuc2lnbmVkIGxvbmcpICZfX2luaXRfYmVnaW47CiAJd2hpbGUgKGFkZHIgPCAodW5zaWduZWQgbG9uZykgJl9faW5pdF9lbmQpIHsKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJCXBhZ2UgPSBQQUdFX09GRlNFVCB8IENQSFlTQUREUihhZGRyKTsKICNlbHNlCiAJCXBhZ2UgPSBhZGRyOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3BnLXNiMS5jIGIvYXJjaC9taXBzL21tL3BnLXNiMS5jCmluZGV4IDU5ZDEzMWIuLjFiNmRmNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9wZy1zYjEuYworKysgYi9hcmNoL21pcHMvbW0vcGctc2IxLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCSIJcHJlZgkiIFNCMV9QUkVGX1NUT1JFX1NUUkVBTUVEX0hJTlQgIiwgIC02NCglMSlcbiIKIAkiCXByZWYJIiBTQjFfUFJFRl9MT0FEX1NUUkVBTUVEX0hJTlQgICIsICAtMzIoJTApXG4iCiAJIjE6CXByZWYJIiBTQjFfUFJFRl9TVE9SRV9TVFJFQU1FRF9ISU5UICIsICAtMzIoJTEpXG4iCi0jIGlmZGVmIENPTkZJR19NSVBTNjQKKyMgaWZkZWYgQ09ORklHXzY0QklUCiAJIglsZAkkOCwgLTEyOCglMCkJXG4iICAvKiBCbG9jayBjb3B5IGEgY2FjaGVsaW5lICovCiAJIglsZAkkOSwgLTEyMCglMCkJXG4iCiAJIglsZAkkMTAsIC0xMTIoJTApCVxuIgpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJIglkYWRkaXUJJTAsICUwLCAtMTI4CVxuIgogCSIJZGFkZGl1CSUxLCAlMSwgLTEyOAlcbiIKICNlbmRpZgotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAkiCWxkCSQ4LCAwKCUwKQlcbiIgIC8qIEJsb2NrIGNvcHkgYSBjYWNoZWxpbmUgKi8KIAkiMToJbGQJJDksIDgoJTApCVxuIgogCSIJbGQJJDEwLCAxNiglMCkJXG4iCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkiCWRhZGRpdQklMCwgJTAsIDMyCVxuIgogCSIJZGFkZGl1CSUxLCAlMSwgMzIJXG4iCiAJIglibmVsCSUwLCAlMiwgMWIJXG4iCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCSIJIGxkCSQ4LCAwKCUwKQlcbiIKICNlbHNlCiAJIgkgbHcJJDIsIDAoJTApCVxuIgpAQCAtMTg2LDcgKzE4Niw3IEBACiAJIgkuc2V0CXBvcAkJXG4iCiAJOiAiK3IiIChzcmMpLCAiK3IiIChkc3QpCiAJOiAiciIgKGVuZCkKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJOiAiJDgiLCIkOSIsIiQxMCIsIiQxMSIsIm1lbW9yeSIpOwogI2Vsc2UKIAk6ICIkMiIsIiQzIiwiJDYiLCIkNyIsIiQ4IiwiJDkiLCIkMTAiLCIkMTEiLCJtZW1vcnkiKTsKQEAgLTE5OCw3ICsxOTgsNyBAQAogCiAvKgogICogUGFkIGRlc2NyaXB0b3JzIHRvIGNhY2hlbGluZSwgc2luY2UgZWFjaCBpcyBleGNsdXNpdmVseSBvd25lZCBieSBhCi0gKiBwYXJ0aWN1bGFyIENQVS4gCisgKiBwYXJ0aWN1bGFyIENQVS4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgZG1hZHNjcl9zIHsKIAl1NjQgZHNjcl9hOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3RsYmV4LmMgYi9hcmNoL21pcHMvbW0vdGxiZXguYwppbmRleCA4N2UyMjlmLi42NTY5YmUzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vdGxiZXguYworKysgYi9hcmNoL21pcHMvbW0vdGxiZXguYwpAQCAtNDQ4LDcgKzQ0OCw3IEBACiBMX0xBKF9yMzAwMF93cml0ZV9wcm9iZV9vaykKIAogLyogY29udmVuaWVuY2UgbWFjcm9zIGZvciBpbnN0cnVjdGlvbnMgKi8KLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAjIGRlZmluZSBpX0xXKGJ1ZiwgcnMsIHJ0LCBvZmYpIGlfbGQoYnVmLCBycywgcnQsIG9mZikKICMgZGVmaW5lIGlfU1coYnVmLCBycywgcnQsIG9mZikgaV9zZChidWYsIHJzLCBydCwgb2ZmKQogIyBkZWZpbmUgaV9TTEwoYnVmLCBycywgcnQsIHNoKSBpX2RzbGwoYnVmLCBycywgcnQsIHNoKQpAQCAtNDg2LDcgKzQ4Niw3IEBACiAjZGVmaW5lIGlfc3Nub3AoYnVmKSBpX3NsbChidWYsIDAsIDAsIDEpCiAjZGVmaW5lIGlfZWhiKGJ1ZikgaV9zbGwoYnVmLCAwLCAwLCAzKQogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogc3RhdGljIF9faW5pdCBpbnQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgaW5fY29tcGF0X3NwYWNlX3AobG9uZyBhZGRyKQogewogCS8qIElzIHRoaXMgYWRkcmVzcyBpbiAzMmJpdCBjb21wYXQgc3BhY2U/ICovCkBAIC01MTYsNyArNTE2LDcgQEAKIAogc3RhdGljIF9faW5pdCB2b2lkIGlfTEFfbW9zdGx5KHUzMiAqKmJ1ZiwgdW5zaWduZWQgaW50IHJzLCBsb25nIGFkZHIpCiB7Ci0jaWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCWlmICghaW5fY29tcGF0X3NwYWNlX3AoYWRkcikpIHsKIAkJaV9sdWkoYnVmLCBycywgcmVsX2hpZ2hlc3QoYWRkcikpOwogCQlpZiAocmVsX2hpZ2hlcihhZGRyKSkKQEAgLTY4Miw3ICs2ODIsNyBAQAogI2RlZmluZSBDMF9FUEMJCTE0CiAjZGVmaW5lIEMwX1hDT05URVhUCTIwCiAKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAjIGRlZmluZSBHRVRfQ09OVEVYVChidWYsIHJlZykgaV9NRkMwKGJ1ZiwgcmVnLCBDMF9YQ09OVEVYVCkKICNlbHNlCiAjIGRlZmluZSBHRVRfQ09OVEVYVChidWYsIHJlZykgaV9NRkMwKGJ1ZiwgcmVnLCBDMF9DT05URVhUKQpAQCAtOTIzLDcgKzkyMyw3IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogLyoKICAqIFRNUCBhbmQgUFRSIGFyZSBzY3JhdGNoLgogICogVE1QIHdpbGwgYmUgY2xvYmJlcmVkLCBQVFIgd2lsbCBob2xkIHRoZSBwbWQgZW50cnkuCkBAIC0xMDEwLDcgKzEwMTAsNyBAQAogCX0KIH0KIAotI2Vsc2UgLyogIUNPTkZJR19NSVBTNjQgKi8KKyNlbHNlIC8qICFDT05GSUdfNjRCSVQgKi8KIAogLyoKICAqIFRNUCBhbmQgUFRSIGFyZSBzY3JhdGNoLgpAQCAtMTAzOCw3ICsxMDM4LDcgQEAKIAlpX2FkZHUocCwgcHRyLCBwdHIsIHRtcCk7IC8qIGFkZCBpbiBwZ2Qgb2Zmc2V0ICovCiB9CiAKLSNlbmRpZiAvKiAhQ09ORklHX01JUFM2NCAqLworI2VuZGlmIC8qICFDT05GSUdfNjRCSVQgKi8KIAogc3RhdGljIF9faW5pdCB2b2lkIGJ1aWxkX2FkanVzdF9jb250ZXh0KHUzMiAqKnAsIHVuc2lnbmVkIGludCBjdHgpCiB7CkBAIC0xMTU5LDcgKzExNTksNyBAQAogCQkvKiBObyBuZWVkIGZvciBpX25vcCAqLwogCX0KIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAlidWlsZF9nZXRfcG1kZTY0KCZwLCAmbCwgJnIsIEswLCBLMSk7IC8qIGdldCBwbWQgaW4gSzEgKi8KICNlbHNlCiAJYnVpbGRfZ2V0X3BnZGUzMigmcCwgSzAsIEsxKTsgLyogZ2V0IHBnZCBpbiBLMSAqLwpAQCAtMTE3MSw3ICsxMTcxLDcgQEAKIAlsX2xlYXZlKCZsLCBwKTsKIAlpX2VyZXQoJnApOyAvKiByZXR1cm4gZnJvbSB0cmFwICovCiAKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJYnVpbGRfZ2V0X3BnZF92bWFsbG9jNjQoJnAsICZsLCAmciwgSzAsIEsxKTsKICNlbmRpZgogCkBAIC0xMTgyLDcgKzExODIsNyBAQAogCSAqIG5lZWQgdGhyZWUsIHdpdGggdGhlIHRoZSBzZWNvbmQgbm9wJ2VkIGFuZCB0aGUgdGhpcmQgYmVpbmcKIAkgKiB1bnVzZWQuCiAJICovCi0jaWZkZWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogCWlmICgocCAtIHRsYl9oYW5kbGVyKSA+IDY0KQogCQlwYW5pYygiVExCIHJlZmlsbCBoYW5kbGVyIHNwYWNlIGV4Y2VlZGVkIik7CiAjZWxzZQpAQCAtMTE5NSwxMiArMTE5NSwxMiBAQAogCS8qCiAJICogTm93IGZvbGQgdGhlIGhhbmRsZXIgaW4gdGhlIFRMQiByZWZpbGwgaGFuZGxlciBzcGFjZS4KIAkgKi8KLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAJZiA9IGZpbmFsX2hhbmRsZXI7CiAJLyogU2ltcGxlc3QgY2FzZSwganVzdCBjb3B5IHRoZSBoYW5kbGVyLiAqLwogCWNvcHlfaGFuZGxlcihyZWxvY3MsIGxhYmVscywgdGxiX2hhbmRsZXIsIHAsIGYpOwogCWZpbmFsX2xlbiA9IHAgLSB0bGJfaGFuZGxlcjsKLSNlbHNlIC8qIENPTkZJR19NSVBTNjQgKi8KKyNlbHNlIC8qIENPTkZJR182NEJJVCAqLwogCWYgPSBmaW5hbF9oYW5kbGVyICsgMzI7CiAJaWYgKChwIC0gdGxiX2hhbmRsZXIpIDw9IDMyKSB7CiAJCS8qIEp1c3QgY29weSB0aGUgaGFuZGxlci4gKi8KQEAgLTEyMzUsNyArMTIzNSw3IEBACiAJCWNvcHlfaGFuZGxlcihyZWxvY3MsIGxhYmVscywgc3BsaXQsIHAsIGZpbmFsX2hhbmRsZXIpOwogCQlmaW5hbF9sZW4gPSAoZiAtIChmaW5hbF9oYW5kbGVyICsgMzIpKSArIChwIC0gc3BsaXQpOwogCX0KLSNlbmRpZiAvKiBDT05GSUdfTUlQUzY0ICovCisjZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAKIAlyZXNvbHZlX3JlbG9jcyhyZWxvY3MsIGxhYmVscyk7CiAJcHJpbnRrKCJTeW50aGVzaXplZCBUTEIgcmVmaWxsIGhhbmRsZXIgKCV1IGluc3RydWN0aW9ucykuXG4iLApAQCAtMTYwNSw3ICsxNjA1LDcgQEAKIAkJCQkgICBzdHJ1Y3QgcmVsb2MgKipyLCB1bnNpZ25lZCBpbnQgcHRlLAogCQkJCSAgIHVuc2lnbmVkIGludCBwdHIpCiB7Ci0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCWJ1aWxkX2dldF9wbWRlNjQocCwgbCwgciwgcHRlLCBwdHIpOyAvKiBnZXQgcG1kIGluIHB0ciAqLwogI2Vsc2UKIAlidWlsZF9nZXRfcGdkZTMyKHAsIHB0ZSwgcHRyKTsgLyogZ2V0IHBnZCBpbiBwdHIgKi8KQEAgLTE2MzYsNyArMTYzNiw3IEBACiAJbF9sZWF2ZShsLCAqcCk7CiAJaV9lcmV0KHApOyAvKiByZXR1cm4gZnJvbSB0cmFwICovCiAKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJYnVpbGRfZ2V0X3BnZF92bWFsbG9jNjQocCwgbCwgciwgdG1wLCBwdHIpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9pbnQtaGFuZGxlci5TIGIvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvaW50LWhhbmRsZXIuUwppbmRleCA0M2ZkNWE1Li41NWJjNzg5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9pbnQtaGFuZGxlci5TCisrKyBiL2FyY2gvbWlwcy9tb21lbnR1bS9qYWd1YXJfYXR4L2ludC1oYW5kbGVyLlMKQEAgLTI3LDExICsyNywxMSBAQAogCQlTQVZFX0FMTAogCQlDTEkKIAkJLnNldAlhdAotCQltZmMwCXQwLCBDUDBfQ0FVU0UgIAorCQltZmMwCXQwLCBDUDBfQ0FVU0UKIAkJbWZjMAl0MiwgQ1AwX1NUQVRVUwogCiAJCWFuZAl0MCwgdDIKLSAgICAgICAgCisKIAkJYW5kaQl0MSwgdDAsIFNUQVRVU0ZfSVAwCS8qIHN3MCBzb2Z0d2FyZSBpbnRlcnJ1cHQgKi8KIAkJYm5legl0MSwgbGxfc3cwX2lycQogCQlhbmRpCXQxLCB0MCwgU1RBVFVTRl9JUDEJLyogc3cxIHNvZnR3YXJlIGludGVycnVwdCAqLwpAQCAtMTAzLDI1ICsxMDMsMjUgQEAKIAkJbW92ZQlhMSwgc3AKIAkJamFsCWRvX0lSUQogCQlqCXJldF9mcm9tX2lycQotCQorCiBsbF9wY2liX2lycToKIAkJbGkJYTAsIDUKIAkJbW92ZQlhMSwgc3AKIAkJamFsCWRvX0lSUQogCQlqCXJldF9mcm9tX2lycQotCQorCiBsbF91YXJ0X2lycToKIAkJbGkJYTAsIDYKIAkJbW92ZQlhMSwgc3AKIAkJamFsCWRvX0lSUQogCQlqCXJldF9mcm9tX2lycQotCQorCiBsbF9jcHV0aW1lcl9pcnE6CiAJCWxpCWEwLCA3CiAJCW1vdmUJYTEsIHNwCiAJCWphbAlsbF90aW1lcl9pbnRlcnJ1cHQKIAkJaglyZXRfZnJvbV9pcnEKLQkKKwogbGxfbXY2NDM0MF9kZWNvZGVfaXJxOgogCQltb3ZlCWEwLCBzcAogCQlqYWwJbGxfbXY2NDM0MF9pcnEKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9qYWd1YXJfYXR4L3Byb20uYyBiL2FyY2gvbWlwcy9tb21lbnR1bS9qYWd1YXJfYXR4L3Byb20uYwppbmRleCBmYTU5ODJhLi4xNGFlMmU3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9wcm9tLmMKKysrIGIvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvcHJvbS5jCkBAIC02NCw3ICs2NCw3IEBACiAKIAkvKiB0dXJuIHRoZSBjbG9jayBvZmYgYW5kIHJlYWQtc3Ryb2JlICovCiAJSkFHVUFSX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzIHwgMHgxMCwgRUVQUk9NX01PREUpOwotCQorCiAJLyogcmV0dXJuIHRoZSBkYXRhICovCiAJcmV0dXJuICgoSkFHVUFSX0ZQR0FfUkVBRChFRVBST01fTU9ERSkgPj4gMykgJiAweDEpOwogfQpAQCAtOTAsNyArOTAsNyBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAKIHVuc2lnbmVkIGxvbmcgc2lnbmV4dCh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CkBAIC0xNDMsNyArMTQzLDcgQEAKIAogCXJldHVybiBwOwogfQotI2VuZGlmICAvKiBDT05GSUdfTUlQUzY0ICovCisjZW5kaWYgIC8qIENPTkZJR182NEJJVCAqLwogCiAvKiBQTU9OIHBhc3NlcyBhcmd1bWVudHMgaW4gQyBtYWluKCkgc3R5bGUgKi8KIHZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQpAQCAtMTU4LDcgKzE1OCw3IEBACiAvLwlqYV9zZXR1cF9jb25zb2xlKCk7CS8qIFRoZSB2ZXJ5IGZpcnN0IHRoaW5nLiAgKi8KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCWNoYXIgKnB0cjsKIAogCXByaW50aygiTWlwczY0IEphZ3Vhci1BVFhcbiIpOwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJfQogCXByaW50aygiYXJjc19jbWRsaW5lOiAlc1xuIiwgYXJjc19jbWRsaW5lKTsKIAotI2Vsc2UgICAvKiBDT05GSUdfTUlQUzY0ICovCisjZWxzZSAgIC8qIENPTkZJR182NEJJVCAqLwogCS8qIHNhdmUgdGhlIFBST00gdmVjdG9ycyBmb3IgZGVidWdnaW5nIHVzZSAqLwogCWRlYnVnX3ZlY3RvcnMgPSBjdjsKIApAQCAtMjI2LDcgKzIyNiw3IEBACiAJCX0KIAkJZW52Kys7CiAJfQotI2VuZGlmIC8qIENPTkZJR19NSVBTNjQgKi8KKyNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAltaXBzX21hY2hncm91cCA9IE1BQ0hfR1JPVVBfTU9NRU5DTzsKIAltaXBzX21hY2h0eXBlID0gTUFDSF9NT01FTkNPX0pBR1VBUl9BVFg7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9qYWd1YXJfYXR4L3Jlc2V0LmMgYi9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9yZXNldC5jCmluZGV4IDQ4MDM5NDguLmM0MjM2YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9qYWd1YXJfYXR4L3Jlc2V0LmMKKysrIGIvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvcmVzZXQuYwpAQCAtMjcsNyArMjcsNyBAQAogdm9pZCBtb21lbmNvX2phZ3Vhcl9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpCiB7CiAJLyogYmFzZSBhZGRyZXNzIG9mIHRpbWVrZWVwZXIgcG9ydGlvbiBvZiBwYXJ0ICovCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCXZvaWQgKm52cmFtID0gKHZvaWQqKSAweGZmZmZmZmZmZmM4MDcwMDA7CiAjZWxzZQogCXZvaWQgKm52cmFtID0gKHZvaWQqKSAweGZjODA3MDAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvc2V0dXAuYyBiL2FyY2gvbWlwcy9tb21lbnR1bS9qYWd1YXJfYXR4L3NldHVwLmMKaW5kZXggMzA0NjJlNy4uOTAyODhjZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvc2V0dXAuYworKysgYi9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9zZXR1cC5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAogc3RhdGljIF9faW5pdCB2b2lkIHdpcmVfc3R1cGlkaXR5X2ludG9fdGxiKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogCXdyaXRlX2MwX3dpcmVkKDApOwogCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKIApAQCAtNDUxLDcgKzQ1MSw3IEBACiAjaWZkZWYgR0VNREVCVUdfVFJBQ0VCVUZGRVIKIAl7CiAJICB1bnNpZ25lZCBpbnQgdGJDb250cm9sOwotCSAgdGJDb250cm9sID0gCisJICB0YkNvbnRyb2wgPQogCSAgICAwIDw8IDI2IHwgIC8qIHBvc3QgdHJpZ2dlciBkZWxheSAwICovCiAJICAgIAkgICAgMHgyIDw8IDE2IHwJCS8qIHNlcXVlbnRpYWwgdHJhY2UgbW9kZSAqLwogCSAgICAvLwkgICAgMHgwIDw8IDE2IHwJCS8qIG5vbi1zZXF1ZW50aWFsIHRyYWNlIG1vZGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfMy9wcm9tLmMgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvcHJvbS5jCmluZGV4IDg5YzE3YTAuLmM0ZmE5YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfMy9wcm9tLmMKKysrIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL3Byb20uYwpAQCAtOTMsNyArOTMsNyBAQAogI2VuZGlmCiAKIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAogdW5zaWduZWQgbG9uZyBzaWduZXh0KHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiAJcmV0dXJuIHA7CiB9Ci0jZW5kaWYgIC8qIENPTkZJR19NSVBTNjQgKi8KKyNlbmRpZiAgLyogQ09ORklHXzY0QklUICovCiAKIHZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQogewpAQCAtMTU1LDcgKzE1NSw3IEBACiAJc3RydWN0IGNhbGx2ZWN0b3JzICpjdiA9IChzdHJ1Y3QgY2FsbHZlY3RvcnMgKikgZndfYXJnMzsKIAlpbnQgaTsKIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAljaGFyICpwdHI7CiAJcHJpbnRrKCJwcm9tX2luaXQgLSBNSVBTNjRcbiIpOwogCkBAIC0xOTgsNyArMTk4LDcgQEAKIAl9CiAJcHJpbnRrKCJhcmNzX2NtZGxpbmU6ICVzXG4iLCBhcmNzX2NtZGxpbmUpOwogCi0jZWxzZSAgIC8qIENPTkZJR19NSVBTNjQgKi8KKyNlbHNlICAgLyogQ09ORklHXzY0QklUICovCiAKIAkvKiBzYXZlIHRoZSBQUk9NIHZlY3RvcnMgZm9yIGRlYnVnZ2luZyB1c2UgKi8KIAlkZWJ1Z192ZWN0b3JzID0gY3Y7CkBAIC0yMjQsNyArMjI0LDcgQEAKIAkJfQogCQllbnYrKzsKIAl9Ci0jZW5kaWYgLyogQ09ORklHX01JUFM2NCAqLworI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCiAJbWlwc19tYWNoZ3JvdXAgPSBNQUNIX0dST1VQX01PTUVOQ087CiAJbWlwc19tYWNodHlwZSA9IE1BQ0hfTU9NRU5DT19PQ0VMT1RfMzsKQEAgLTIzNCw3ICsyMzQsNyBAQAogCWdldF9tYWMocHJvbV9tYWNfYWRkcl9iYXNlKTsKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19NSVBTNjQKKyNpZm5kZWYgQ09ORklHXzY0QklUCiAJZGVidWdfdmVjdG9ycy0+cHJpbnRmKCJCb290aW5nIExpbnV4IGtlcm5lbC4uLlxuIik7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9pbnQtaGFuZGxlci5TIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL2ludC1oYW5kbGVyLlMKaW5kZXggMmYyNDMwNi4uNTIzNDlkOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL2ludC1oYW5kbGVyLlMKKysrIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL2ludC1oYW5kbGVyLlMKQEAgLTI3LDExICsyNywxMSBAQAogCQlTQVZFX0FMTAogCQlDTEkKIAkJLnNldAlhdAotCQltZmMwCXQwLCBDUDBfQ0FVU0UgIAorCQltZmMwCXQwLCBDUDBfQ0FVU0UKIAkJbWZjMAl0MiwgQ1AwX1NUQVRVUwogCiAJCWFuZAl0MCwgdDIKLSAgICAgICAgCisKIAkJYW5kaQl0MSwgdDAsIFNUQVRVU0ZfSVAwCS8qIHN3MCBzb2Z0d2FyZSBpbnRlcnJ1cHQgKi8KIAkJYm5legl0MSwgbGxfc3cwX2lycQogCQlhbmRpCXQxLCB0MCwgU1RBVFVTRl9JUDEJLyogc3cxIHNvZnR3YXJlIGludGVycnVwdCAqLwpAQCAtODMsNyArODMsNyBAQAogCQltb3ZlCWExLCBzcAogCQlqYWwJZG9fSVJRCiAJCWoJcmV0X2Zyb21faXJxCi0JCisKIGxsX2NwY2lfZGVjb2RlX2lycToKIAkJbW92ZQlhMCwgc3AKIAkJamFsCWxsX2NwY2lfaXJxCkBAIC05OSw0ICs5OSw0IEBACiAJCW1vdmUJYTEsIHNwCiAJCWphbAlkb19JUlEKIAkJaglyZXRfZnJvbV9pcnEKLQkKKwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL29jZWxvdF9jX2ZwZ2EuaCBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9vY2Vsb3RfY19mcGdhLmgKaW5kZXggYTZjZjdhNy4uOTdmYjc3ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL29jZWxvdF9jX2ZwZ2EuaAorKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2Mvb2NlbG90X2NfZnBnYS5oCkBAIC0zMiw3ICszMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKICNkZWZpbmUgT0NFTE9UX0NfQ1MwX0FERFIgICAgICAgKDB4ZmZmZmZmZmZmYzAwMDAwMCkKICNlbHNlCiAjZGVmaW5lIE9DRUxPVF9DX0NTMF9BRERSICAgICAgICAgICAgICAgKDB4ZmMwMDAwMDApCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvcHJvbS5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL3Byb20uYwppbmRleCA0OWFjMzAyLi41YjY4MDk3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvcHJvbS5jCisrKyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9wcm9tLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAogCS8qIHR1cm4gdGhlIGNsb2NrIG9mZiBhbmQgcmVhZC1zdHJvYmUgKi8KIAlPQ0VMT1RfRlBHQV9XUklURSgodmFsIDw8IDIpIHwgY3MgfCAweDEwLCBFRVBST01fTU9ERSk7Ci0JCisKIAkvKiByZXR1cm4gdGhlIGRhdGEgKi8KIAlyZXR1cm4gKChPQ0VMT1RfRlBHQV9SRUFEKEVFUFJPTV9NT0RFKSA+PiAzKSAmIDB4MSk7CiB9CkBAIC05NCw3ICs5NCw3IEBACiAjZW5kaWYKIAogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCiB1bnNpZ25lZCBsb25nIHNpZ25leHQodW5zaWduZWQgbG9uZyBhZGRyKQogewpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgIHAgPSAoY2hhciAqKWdldF9hcmcoYXJncywgYXJnX2luZGV4KTsKICAgcmV0dXJuIHA7CiB9Ci0jZW5kaWYgIC8qIENPTkZJR19NSVBTNjQgKi8KKyNlbmRpZiAgLyogQ09ORklHXzY0QklUICovCiAKIAogdm9pZCBfX2luaXQgcHJvbV9pbml0KHZvaWQpCkBAIC0xNTUsNyArMTU1LDcgQEAKIAlzdHJ1Y3QgY2FsbHZlY3RvcnMgKmN2ID0gKHN0cnVjdCBjYWxsdmVjdG9ycyAqKSBmd19hcmczOwogCWludCBpOwogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCWNoYXIgKnB0cjsKIAogCXByaW50aygicHJvbV9pbml0IC0gTUlQUzY0XG4iKTsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCX0KIAlwcmludGsoImFyY3NfY21kbGluZTogJXNcbiIsIGFyY3NfY21kbGluZSk7CiAKLSNlbHNlICAgLyogQ09ORklHX01JUFM2NCAqLworI2Vsc2UgICAvKiBDT05GSUdfNjRCSVQgKi8KIAkvKiBzYXZlIHRoZSBQUk9NIHZlY3RvcnMgZm9yIGRlYnVnZ2luZyB1c2UgKi8KIAlkZWJ1Z192ZWN0b3JzID0gY3Y7CiAKQEAgLTIyMiw3ICsyMjIsNyBAQAogCQl9CiAJCWVudisrOwogCX0KLSNlbmRpZiAvKiBDT05GSUdfTUlQUzY0ICovCisjZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAKIAltaXBzX21hY2hncm91cCA9IE1BQ0hfR1JPVVBfTU9NRU5DTzsKIAltaXBzX21hY2h0eXBlID0gTUFDSF9NT01FTkNPX09DRUxPVF9DOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJZ2V0X21hYyhwcm9tX21hY19hZGRyX2Jhc2UpOwogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX01JUFM2NAorI2lmbmRlZiBDT05GSUdfNjRCSVQKIAlkZWJ1Z192ZWN0b3JzLT5wcmludGYoIkJvb3RpbmcgTGludXgga2VybmVsLi4uXG4iKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL3Jlc2V0LmMgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvcmVzZXQuYwppbmRleCAxZjJiNDI2Li42YTI0ODlmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvcmVzZXQuYworKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvcmVzZXQuYwpAQCAtMjgsNyArMjgsNyBAQAogewogCS8qIGJhc2UgYWRkcmVzcyBvZiB0aW1la2VlcGVyIHBvcnRpb24gb2YgcGFydCAqLwogCXZvaWQgKm52cmFtID0gKHZvaWQgKikKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJCTB4ZmZmZmZmZmZmYzgwNzAwMDsKICNlbHNlCiAJCTB4ZmM4MDcwMDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2Mvc2V0dXAuYyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9zZXR1cC5jCmluZGV4IDAyMWMwMGUuLjg0NGRkZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9zZXR1cC5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAkqLwogICBwcmludGsoIlBNT05fdjJfc2V0dXBcbiIpOwogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCS8qIG1hcnZlbGwgYW5kIGV4dHJhIHNwYWNlICovCiAJYWRkX3dpcmVkX2VudHJ5KEVOVFJZTE8oMHhmNDAwMDAwMCksIEVOVFJZTE8oMHhmNDAxMDAwMCksIDB4ZmZmZmZmZmZmNDAwMDAwMCwgUE1fNjRLKTsKIAkvKiBmcGdhLCBydGMsIGFuZCB1YXJ0ICovCkBAIC0xMzQsNyArMTM0LDcgQEAKIAogdW5zaWduZWQgbG9uZyBtNDh0Mzd5X2dldF90aW1lKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCXVuc2lnbmVkIGNoYXIgKnJ0Y19iYXNlID0gKHVuc2lnbmVkIGNoYXIqKTB4ZmZmZmZmZmZmYzgwMDAwMDsKICNlbHNlCiAJdW5zaWduZWQgY2hhciogcnRjX2Jhc2UgPSAodW5zaWduZWQgY2hhciopMHhmYzgwMDAwMDsKQEAgLTE2Myw3ICsxNjMsNyBAQAogCiBpbnQgbTQ4dDM3eV9zZXRfdGltZSh1bnNpZ25lZCBsb25nIHNlYykKIHsKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJdW5zaWduZWQgY2hhciogcnRjX2Jhc2UgPSAodW5zaWduZWQgY2hhciopMHhmZmZmZmZmZmZjODAwMDAwOwogI2Vsc2UKIAl1bnNpZ25lZCBjaGFyKiBydGNfYmFzZSA9ICh1bnNpZ25lZCBjaGFyKikweGZjODAwMDAwOwpAQCAtMzQyLDcgKzM0Miw3IEBACiAKIGVhcmx5X2luaXRjYWxsKG1vbWVuY29fb2NlbG90X2Nfc2V0dXApOwogCi0jaWZuZGVmIENPTkZJR19NSVBTNjQKKyNpZm5kZWYgQ09ORklHXzY0QklUCiAvKiBUaGlzIG5lZWRzIHRvIGJlIG9uZSBvZiB0aGUgZmlyc3QgaW5pdGNhbGxzLCBiZWNhdXNlIG5vIEkvTyBwb3J0IGFjY2VzcwogICAgY2FuIHdvcmsgYmVmb3JlIHRoaXMgKi8KIHN0YXRpYyBpbnQgaW9fYmFzZV9pb3JlbWFwKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL01ha2VmaWxlIGIvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQppbmRleCBjNTNlNGNiLi44M2Q4MWM5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKQEAgLTQ4LDYgKzQ4LDcgQEAKIG9iai0kKENPTkZJR19TTklfUk0yMDBfUENJKQkrPSBmaXh1cC1zbmkubyBvcHMtc25pLm8KIG9iai0kKENPTkZJR19UQU5CQUNfVEIwMjE5KQkrPSBmaXh1cC10YjAyMTkubwogb2JqLSQoQ09ORklHX1RBTkJBQ19UQjAyMjYpCSs9IGZpeHVwLXRiMDIyNi5vCitvYmotJChDT05GSUdfVEFOQkFDX1RCMDI4NykJKz0gZml4dXAtdGIwMjg3Lm8KIG9iai0kKENPTkZJR19UT1NISUJBX0pNUjM5MjcpCSs9IGZpeHVwLWptcjM5MjcubyBwY2ktam1yMzkyNy5vCiBvYmotJChDT05GSUdfVE9TSElCQV9SQlRYNDkyNykJKz0gZml4dXAtcmJ0eDQ5MjcubyBvcHMtdHg0OTI3Lm8KIG9iai0kKENPTkZJR19WSUNUT1JfTVBDMzBYKQkrPSBmaXh1cC1tcGMzMHgubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9maXh1cC1kZGI1MDc0LmMgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLWRkYjUwNzQuYwppbmRleCBiMzQ1ZTUyLi41YTRhN2MyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWRkYjUwNzQuYworKysgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLWRkYjUwNzQuYwpAQCAtNSw3ICs1LDcgQEAKIHsKIAlleHRlcm4gc3RydWN0IHBjaV9kZXYgKnBjaV9wbXU7CiAJdTggdDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKIAlwY2lfcG11ID0gZGV2OyAgLyogZm9yIExFRHMgRDIgYW5kIEQzICovCiAJLyogUHJvZ3JhbSB0aGUgbGluZXMgZm9yIExFRHMgRDIgYW5kIEQzIHRvIG91dHB1dCAqLwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg3ZCwgJnQ4KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvZml4dXAtZGRiNTQ3Ny5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1kZGI1NDc3LmMKaW5kZXggNmFiZGM4OC4uMmYxNDQ0ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9maXh1cC1kZGI1NDc3LmMKKysrIGIvYXJjaC9taXBzL3BjaS9maXh1cC1kZGI1NDc3LmMKQEAgLTY1LDcgKzY1LDcgQEAKIAlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKIAogCWludyhpb2FkZHIgKyBQQ05FVDMyX1dJT19SRVNFVCk7CS8qIHJlc2V0IGNoaXAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKIAkvKiBiY3JfMTggfD0gMHgwODAwICovCiAJb3V0dygxOCwgaW9hZGRyICsgUENORVQzMl9XSU9fUkFQKTsKIAl0ZW1wID0gaW53KGlvYWRkciArIFBDTkVUMzJfV0lPX0JEUCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLW1hbHRhLmMgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLW1hbHRhLmMKaW5kZXggYjkyOTZkOS4uYmYyYzQxZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9maXh1cC1tYWx0YS5jCisrKyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtbWFsdGEuYwpAQCAtNTYsNyArNTYsNyBAQAogCQkwLCAgMCwgCTAsICAzLAogCQk0LCAgNSwgIDYsICA3LAogCQkwLCAgOSwgMTAsIDExLAotCQkxMiwgMCwgMTQsIDE1IAorCQkxMiwgMCwgMTQsIDE1CiAJfTsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9maXh1cC1yYnR4NDkyNy5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1yYnR4NDkyNy5jCmluZGV4IGRlNGU0NDMuLmNlZWIxODYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvZml4dXAtcmJ0eDQ5MjcuYworKysgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLXJidHg0OTI3LmMKQEAgLTcsNyArNyw3IEBACiAgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KICAqICAgICAgICAgICAgICBwcG9wb3ZAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFRvc2hpYmEgQ29ycG9yYXRpb24gCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBUb3NoaWJhIENvcnBvcmF0aW9uCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgogICogQXV0aG9yOiBNYW5pc2ggTGFjaHdhbmkgKG1sYWNod2FuaUBtdmlzdGEuY29tKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9maXh1cC1zbmkuYyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtc25pLmMKaW5kZXggYzhlZjAxYS4uYTE3NmYyYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9maXh1cC1zbmkuYworKysgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLXNuaS5jCkBAIC0zMiw3ICszMiw3IEBACiAgKiBEZXZpY2UgNDogVW51c2VkCiAgKiBEZXZpY2UgNTogU2xvdCAyCiAgKiBEZXZpY2UgNjogU2xvdCAzCi0gKiBEZXZpY2UgNzogU2xvdCA0CQorICogRGV2aWNlIDc6IFNsb3QgNAogICoKICAqIERvY3VtZW50YXRpb24gc2F5cyB0aGUgVkdBIGlzIGRldmljZSA1IGFuZCBkZXZpY2UgMyBpcyB1bnVzZWQgYnV0IHRoYXQKICAqIHNlZW0gdG8gYmUgYSBkb2N1bWVudGF0aW9uIGVycm9yLiAgQXQgbGVhc3Qgb24gbXkgUk0yMDBDIHRoZSBDaXJydXMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvZml4dXAtdGIwMjE5LmMgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLXRiMDIxOS5jCmluZGV4IDg1MGE5MDAuLmJjNTViMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvZml4dXAtdGIwMjE5LmMKKysrIGIvYXJjaC9taXBzL3BjaS9maXh1cC10YjAyMTkuYwpAQCAtMjksMjcgKzI5LDEyIEBACiAKIAlzd2l0Y2ggKHNsb3QpIHsKIAljYXNlIDEyOgotCQl2cjQxeHhfc2V0X2lycV90cmlnZ2VyKFRCMDIxOV9QQ0lfU0xPVDFfUElOLAotCQkJCSAgICAgICBUUklHR0VSX0xFVkVMLAotCQkJCSAgICAgICBTSUdOQUxfVEhST1VHSCk7Ci0JCXZyNDF4eF9zZXRfaXJxX2xldmVsKFRCMDIxOV9QQ0lfU0xPVDFfUElOLAotCQkJCSAgICAgTEVWRUxfTE9XKTsKIAkJaXJxID0gVEIwMjE5X1BDSV9TTE9UMV9JUlE7CiAJCWJyZWFrOwogCWNhc2UgMTM6Ci0JCXZyNDF4eF9zZXRfaXJxX3RyaWdnZXIoVEIwMjE5X1BDSV9TTE9UMl9QSU4sCi0JCQkJICAgICAgIFRSSUdHRVJfTEVWRUwsCi0JCQkJICAgICAgIFNJR05BTF9USFJPVUdIKTsKLQkJdnI0MXh4X3NldF9pcnFfbGV2ZWwoVEIwMjE5X1BDSV9TTE9UMl9QSU4sCi0JCQkJICAgICBMRVZFTF9MT1cpOwogCQlpcnEgPSBUQjAyMTlfUENJX1NMT1QyX0lSUTsKIAkJYnJlYWs7CiAJY2FzZSAxNDoKLQkJdnI0MXh4X3NldF9pcnFfdHJpZ2dlcihUQjAyMTlfUENJX1NMT1QzX1BJTiwKLQkJCQkgICAgICAgVFJJR0dFUl9MRVZFTCwKLQkJCQkgICAgICAgU0lHTkFMX1RIUk9VR0gpOwotCQl2cjQxeHhfc2V0X2lycV9sZXZlbChUQjAyMTlfUENJX1NMT1QzX1BJTiwKLQkJCQkgICAgIExFVkVMX0xPVyk7CiAJCWlycSA9IFRCMDIxOV9QQ0lfU0xPVDNfSVJROwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9maXh1cC10YjAyODcuYyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtdGIwMjg3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzNmQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtdGIwMjg3LmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqICBmaXh1cC10YjAyODcuYywgVGhlIFRBTkJBQyBUQjAyODcgc3BlY2lmaWMgUENJIGZpeHVwcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3ZyNDF4eC90YjAyODcuaD4KKworaW50IF9faW5pdCBwY2liaW9zX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCXVuc2lnbmVkIGNoYXIgYnVzOworCWludCBpcnEgPSAtMTsKKworCWJ1cyA9IGRldi0+YnVzLT5udW1iZXI7CisJaWYgKGJ1cyA9PSAwKSB7CisJCXN3aXRjaCAoc2xvdCkgeworCQljYXNlIDE2OgorCQkJaXJxID0gVEIwMjg3X1NNNTAxX0lSUTsKKwkJCWJyZWFrOworCQljYXNlIDE3OgorCQkJaXJxID0gVEIwMjg3X1NJTDY4MEFfSVJROworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoYnVzID09IDEpIHsKKwkJc3dpdGNoIChQQ0lfU0xPVChkZXYtPmRldmZuKSkgeworCQljYXNlIDA6CisJCQlpcnEgPSBUQjAyODdfUENJX1NMT1RfSVJROworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQkJaXJxID0gVEIwMjg3X1JUTDgxMTBfSVJROworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoYnVzID4gMSkgeworCQlpcnEgPSBUQjAyODdfUENJX1NMT1RfSVJROworCX0KKworCXJldHVybiBpcnE7Cit9CisKKy8qIERvIHBsYXRmb3JtIHNwZWNpZmljIGRldmljZSBpbml0aWFsaXphdGlvbiBhdCBwY2lfZW5hYmxlX2RldmljZSgpIHRpbWUgKi8KK2ludCBwY2liaW9zX3BsYXRfZGV2X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvb3BzLWRkYjU0NzcuYyBiL2FyY2gvbWlwcy9wY2kvb3BzLWRkYjU0NzcuYwppbmRleCBlOTU1NDQzLi4wNDA2YjUwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL29wcy1kZGI1NDc3LmMKKysrIGIvYXJjaC9taXBzL3BjaS9vcHMtZGRiNTQ3Ny5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIH0KIAogc3RhdGljIGludCByZWFkX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2NvbmZpZ19zd2FwICpzd2FwLAotCQkJICAgICBzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1MzIgZGV2Zm4sIHUzMiB3aGVyZSwgCisJCQkgICAgIHN0cnVjdCBwY2lfYnVzICpidXMsIHUzMiBkZXZmbiwgdTMyIHdoZXJlLAogCQkJICAgICB1MzIgKiB2YWwpCiB7CiAJdTMyIGJ1c19udW0sIHNsb3RfbnVtLCBmdW5jX251bTsKQEAgLTE1Myw3ICsxNTMsNyBAQAogfQogCiBzdGF0aWMgaW50IHJlYWRfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9jb25maWdfc3dhcCAqc3dhcCwKLQkJCSAgICBzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1MzIgZGV2Zm4sIHUzMiB3aGVyZSwgCisJCQkgICAgc3RydWN0IHBjaV9idXMgKmJ1cywgdTMyIGRldmZuLCB1MzIgd2hlcmUsCiAJCQkgICAgdTE2ICogdmFsKQogewogCWludCBzdGF0dXM7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL29wcy10eDQ5MjcuYyBiL2FyY2gvbWlwcy9wY2kvb3BzLXR4NDkyNy5jCmluZGV4IDJhOWQ3MjIuLjc2ODhiNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvb3BzLXR4NDkyNy5jCisrKyBiL2FyY2gvbWlwcy9wY2kvb3BzLXR4NDkyNy5jCkBAIC0xLDE2ICsxLDE2IEBACiAvKgogICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCiAgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqICAgICAgICAgICAgICBhaGVubmVzc3lAbXZpc3RhLmNvbSAgICAgICAKKyAqICAgICAgICAgICAgICBhaGVubmVzc3lAbXZpc3RhLmNvbQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFRvc2hpYmEgQ29ycG9yYXRpb24gCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBUb3NoaWJhIENvcnBvcmF0aW9uCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQogICoKICAqIEJhc2VkIG9uIGFyY2gvbWlwcy9kZGI1eHh4L2RkYjU0NzcvcGNpX29wcy5jCiAgKgogICogICAgIERlZmluZSB0aGUgcGNpX29wcyBmb3IgdGhlIFRvc2hpYmEgcmJ0eDQ5MjcKICAqCi0gKiBNdWNoIG9mIHRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgb3JpZ2luYWwgRERCNTA3NCBwb3J0IGJ5IAorICogTXVjaCBvZiB0aGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsIEREQjUwNzQgcG9ydCBieQogICogR2VlcnQgVXl0dGVyaG9ldmVuIDxnZWVydEBzb255Y29tLmNvbT4KICAqCiAgKiBDb3B5cmlnaHQgMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWRkYjU0NzcuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLWRkYjU0NzcuYwppbmRleCA0ZGRkNTNlLi44MjZkNjUzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS1kZGI1NDc3LmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2ktZGRiNTQ3Ny5jCkBAIC03Niw3ICs3Niw3IEBACiAgKi8KIAogLyoKLSAqIGlycSBtYXBwaW5nIDogZGV2aWNlIC0+IHBjaSBpbnQgIyAtPiB2cmM0Mzc3IGlycSMgLCAKKyAqIGlycSBtYXBwaW5nIDogZGV2aWNlIC0+IHBjaSBpbnQgIyAtPiB2cmM0Mzc3IGlycSMgLAogICogZGRiNTQ3NyBib2FyZCBtYW51YWwgcGFnZSA0ICBhbmQgdnJjNTQ3NyBtYW51YWwgcGFnZSA0NgogICovCiAKQEAgLTEzNyw5ICsxMzcsOSBAQAogCXVuc2lnbmVkIGNoYXIgKnNsb3RfaXJxX21hcDsKIAl1bnNpZ25lZCBjaGFyIGlycTsKIAotCS8qIAorCS8qCiAJICogV2UgaWdub3JlIHRoZSBzd2l6emxlZCBzbG90IGFuZCBwaW4gdmFsdWVzLiAgVGhlIG9yaWdpbmFsCi0JICogcGNpX2ZpeHVwX2lycSgpIGNvZGVzIGxhcmdlbHkgYmFzZSBpcnEgbnVtYmVyIG9uIHRoZSBkZXYgc2xvdCAKKwkgKiBwY2lfZml4dXBfaXJxKCkgY29kZXMgbGFyZ2VseSBiYXNlIGlycSBudW1iZXIgb24gdGhlIGRldiBzbG90CiAJICogbnVtYmVycyBiZWNhdXNlIGV4Y2VwdCBmb3Igb25lIGNhc2UgdGhleSBhcmUgdW5pcXVlIGV2ZW4KIAkgKiB0aG91Z2ggdGhlcmUgYXJlIG11bHRpcGxlIHBjaSBidXNlcy4KIAkgKi8KQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAJaWYgKG1pcHNfbWFjaHR5cGUgPT0gTUFDSF9ORUNfUk9DS0hPUFBFUklJKSB7CiAJCS8qIGhhY2sgdG8gZGlzdGlucXVpc2ggb3ZlcmxhcHBpbmcgc2xvdCAyMHMsIG9uZQotCQkgKiBvbiBidXMgMCAoQUxJIFVTQiBvbiB0aGUgTTE1MzUgb24gdGhlIGJhY2twbGFuZSksIAorCQkgKiBvbiBidXMgMCAoQUxJIFVTQiBvbiB0aGUgTTE1MzUgb24gdGhlIGJhY2twbGFuZSksCiAJCSAqIGFuZCBvbmUgb24gYnVzIDIgKE5FQyBVU0IgY29udHJvbGxlciBvbiB0aGUgQ1BVIGJvYXJkKQogCQkgKiBNYWtlIHRoZSBNMTUzNSBVU0IgLSBJU0EgSVJRIG51bWJlciA5LgogCQkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWlwMzIuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLWlwMzIuYwppbmRleCAxZmFlYjAzLi4wMDBkYzZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS1pcDMyLmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2ktaXAzMi5jCkBAIC04NCw3ICs4NCw3IEBACiAKIAogZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIG1hY2VfcGNpX29wczsKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIG1hY2VfcGNpX21lbV9yZXNvdXJjZSA9IHsKIAkubmFtZQk9ICJTR0kgTzIgUENJIE1FTSIsCiAJLnN0YXJ0CT0gTUFDRVBDSV9ISV9NRU1PUlksCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS5jIGIvYXJjaC9taXBzL3BjaS9wY2kuYwppbmRleCA4MTQxZGZmLi5hOGQ0OTliIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS5jCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCQlob3NlLT5uZWVkX2RvbWFpbl9pbmZvID0gbmVlZF9kb21haW5faW5mbzsKIAkJbmV4dF9idXNubyA9IGJ1cy0+c3Vib3JkaW5hdGUgKyAxOwogCQkvKiBEb24ndCBhbGxvdyA4LWJpdCBidXMgbnVtYmVyIG92ZXJmbG93IGluc2lkZSB0aGUgaG9zZSAtCi0JCSAgIHJlc2VydmUgc29tZSBzcGFjZSBmb3IgYnJpZGdlcy4gKi8gCisJCSAgIHJlc2VydmUgc29tZSBzcGFjZSBmb3IgYnJpZGdlcy4gKi8KIAkJaWYgKG5leHRfYnVzbm8gPiAyMjQpIHsKIAkJCW5leHRfYnVzbm8gPSAwOwogCQkJbmVlZF9kb21haW5faW5mbyA9IDE7CkBAIC0yNjAsNyArMjYwLDcgQEAKIAkJICAgKGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9QQ0kpIHsKIAkJcGNpX3JlYWRfYnJpZGdlX2Jhc2VzKGJ1cyk7CiAJCXBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhkZXYsIGJ1cyk7Ci0JfSAKKwl9CiAKIAlmb3IgKGxuID0gYnVzLT5kZXZpY2VzLm5leHQ7IGxuICE9ICZidXMtPmRldmljZXM7IGxuID0gbG4tPm5leHQpIHsKIAkJc3RydWN0IHBjaV9kZXYgKmRldiA9IHBjaV9kZXZfYihsbik7CkBAIC0yOTIsOCArMjkyLDI1IEBACiAJcmVnaW9uLT5lbmQgPSByZXMtPmVuZCAtIG9mZnNldDsKIH0KIAordm9pZCBfX2RldmluaXQKK3BjaWJpb3NfYnVzX3RvX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24pCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gKHN0cnVjdCBwY2lfY29udHJvbGxlciAqKWRldi0+c3lzZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCW9mZnNldCA9IGhvc2UtPmlvX29mZnNldDsKKwllbHNlIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCW9mZnNldCA9IGhvc2UtPm1lbV9vZmZzZXQ7CisKKwlyZXMtPnN0YXJ0ID0gcmVnaW9uLT5zdGFydCArIG9mZnNldDsKKwlyZXMtPmVuZCA9IHJlZ2lvbi0+ZW5kICsgb2Zmc2V0OworfQorCiAjaWZkZWYgQ09ORklHX0hPVFBMVUcKIEVYUE9SVF9TWU1CT0wocGNpYmlvc19yZXNvdXJjZV90b19idXMpOworRVhQT1JUX1NZTUJPTChwY2liaW9zX2J1c190b19yZXNvdXJjZSk7CiBFWFBPUlRfU1lNQk9MKFBDSUJJT1NfTUlOX0lPKTsKIEVYUE9SVF9TWU1CT0woUENJQklPU19NSU5fTUVNKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvYXRtZWxfcmVhZF9lZXByb20uYyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2F0bWVsX3JlYWRfZWVwcm9tLmMKaW5kZXggYjA2Nzk4OC4uOTc4NjJmNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvYXRtZWxfcmVhZF9lZXByb20uYworKysgYi9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9hdG1lbF9yZWFkX2VlcHJvbS5jCkBAIC0zMCw3ICszMCw3IEBACiAgKgogICogVGhpcyBjb2RlIHJlYWRzIHRoZSBBVE1FTCAyNENYWCBFRVBST00uIFRoZSBQTUMtU2llcnJhIFlvc2VtaXRlIGJvYXJkIHVzZXMgdGhlIEFUTUVMCiAgKiAyNEMzMi8yNEM2NCB3aGljaCB1c2VzIHR3byBieXRlIGFkZHJlc3NpbmcgYXMgY29tcGFyZWQgdG8gMjRDMTYuIE5vdGUgdGhhdCB0aGlzIHByb2dyYW0KLSAqIHVzZXMgdGhlIHNlcmlhbCBwb3J0IGxpa2UgL2Rldi90dHlTMCwgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgRUVQUk9NLiBIZW5jZSwgeW91IGFyZSAKKyAqIHVzZXMgdGhlIHNlcmlhbCBwb3J0IGxpa2UgL2Rldi90dHlTMCwgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgRUVQUk9NLiBIZW5jZSwgeW91IGFyZQogICogZXhwZWN0ZWQgdG8gaGF2ZSBhIGNvbm5lY3Rpdml0eSBmcm9tIHRoZSBFRVBST00gdG8gdGhlIHNlcmlhbCBwb3J0LiBUaGlzIHByb2dyYW0gZG9lcwogICogX19ub3RfXyBjb21tdW5pY2F0ZSB1c2luZyB0aGUgSTJDIHByb3RvY29sCiAgKi8KQEAgLTY0LDE0ICs2NCwxNCBAQAogc3RhdGljIHZvaWQgc2VuZF9ieXRlKHVuc2lnbmVkIGNoYXIgYnl0ZSkKIHsKIAlpbnQJaSA9IDA7Ci0JCi0JZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIAorCisJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pCiAJCXNlbmRfYml0KChieXRlID4+IGkpICYgMHgwMSk7CiB9Ci0JCisKIHN0YXRpYyB2b2lkIHNlbmRfc3RhcnQodm9pZCkKIHsKLQlzZGFfaGk7IAorCXNkYV9oaTsKIAlkZWxheShUWFgpOwogCXNjbF9oaTsKIAlkZWxheShUWFgpOwpAQCAtMTE0LDkgKzExNCw5IEBACiAgICAgICAgIGludCBpOwogICAgICAgICB1bnNpZ25lZCBjaGFyIGJ5dGU9MDsKIAotICAgICAgICBmb3IgKGk9NztpPj0wO2ktLSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBmb3IgKGk9NztpPj0wO2ktLSkKICAgICAgICAgICAgICAgICBieXRlIHw9IChyZWN2X2JpdCgpIDw8IGkpOwotIAorCiAgICAgICAgIHJldHVybiBieXRlOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9hdG1lbF9yZWFkX2VlcHJvbS5oIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvYXRtZWxfcmVhZF9lZXByb20uaAppbmRleCBkMjc1NjZkLi5jMTlmMDFhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9hdG1lbF9yZWFkX2VlcHJvbS5oCisrKyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2F0bWVsX3JlYWRfZWVwcm9tLmgKQEAgLTI3LDcgKzI3LDcgQEAKICAqLwogCiAvKgotICogSGVhZGVyIGZpbGUgZm9yIGF0bWVsX3JlYWRfZWVwcm9tLmMgCisgKiBIZWFkZXIgZmlsZSBmb3IgYXRtZWxfcmVhZF9lZXByb20uYwogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtNDYsNyArNDYsNyBAQAogI2RlZmluZQlERUZBVUxUX1BPUlQgCSIvZGV2L3R0eVMwIgkvKiBQb3J0IHRvIG9wZW4gKi8KICNkZWZpbmUJVFhYCQkwIAkJLyogRHVtbXkgbG9vcCBmb3Igc3Bpbm5pbmcgKi8KIAotI2RlZmluZQlCTE9DS19TRUwJMHgwMAkJCisjZGVmaW5lCUJMT0NLX1NFTAkweDAwCiAjZGVmaW5lCVNMQVZFX0FERFIJMHhhMAogI2RlZmluZQlSRUFEX0JJVAkweDAxCiAjZGVmaW5lCVdSSVRFX0JJVAkweDAwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcWVtdS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9xZW11L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNDk0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcWVtdS9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFFlbXUgc3BlY2lmaWMga2VybmVsIGludGVyZmFjZSByb3V0aW5lcyB1bmRlciBMaW51eC4KKyMKKworb2JqLXkJCT0gcS1maXJtd2FyZS5vIHEtaW50Lm8gcS1pcnEubyBxLW1lbS5vIHEtc2V0dXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3FlbXUvcS1maXJtd2FyZS5jIGIvYXJjaC9taXBzL3FlbXUvcS1maXJtd2FyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODBmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcWVtdS9xLWZpcm13YXJlLmMKQEAgLTAsMCArMSw3IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorCit2b2lkIF9faW5pdCBwcm9tX2luaXQodm9pZCkKK3sKKwlhZGRfbWVtb3J5X3JlZ2lvbigweDA8PDIwLCAweDEwPDwyMCwgQk9PVF9NRU1fUkFNKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9xZW11L3EtaW50LlMgYi9hcmNoL21pcHMvcWVtdS9xLWludC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlM2RmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcWVtdS9xLWludC5TCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBRZW11IGludGVycnVwdCBoYW5kbGVyIGNvZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IFJhbGYgQmFlY2hsZQorICovCisjaW5jbHVkZSA8YXNtL2FzbS5oPgorI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KKyNpbmNsdWRlIDxhc20vc3RhY2tmcmFtZS5oPgorCisJLmFsaWduCTUKKwlORVNURUQocWVtdV9oYW5kbGVfaW50LCBQVF9TSVpFLCBzcCkKKwlTQVZFX0FMTAorCUNMSQorCW1vdmUJYTAsIHNwCisJUFRSX0xBCXJhLCByZXRfZnJvbV9pcnEKKwlqCWRvX3FlbXVfaW50CisJRU5EKHFlbXVfaGFuZGxlX2ludCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9xZW11L3EtaXJxLmMgYi9hcmNoL21pcHMvcWVtdS9xLWlycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNGUwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcWVtdS9xLWlycS5jCkBAIC0wLDAgKzEsMzcgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorCisjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CisjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CisjaW5jbHVkZSA8YXNtL3FlbXUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBxZW11X2hhbmRsZV9pbnQodm9pZCk7CisKK2FzbWxpbmthZ2Ugdm9pZCBkb19xZW11X2ludChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgcGVuZGluZyA9IHJlYWRfYzBfc3RhdHVzKCkgJiByZWFkX2MwX2NhdXNlKCk7CisKKwlpZiAocGVuZGluZyAmIDB4ODAwMCkgeworCQlsbF90aW1lcl9pbnRlcnJ1cHQoUV9DT1VOVF9DT01QQVJFX0lSUSwgcmVncyk7CisJCXJldHVybjsKKwl9CisJaWYgKHBlbmRpbmcgJiAweDA0MDApIHsKKwkJaW50IGlycSA9IGk4MjU5X2lycSgpOworCisJCWlmIChsaWtlbHkoaXJxID49IDApKQorCQkJZG9fSVJRKGlycSwgcmVncyk7CisKKwkJcmV0dXJuOworCX0KK30KKwordm9pZCBfX2luaXQgYXJjaF9pbml0X2lycSh2b2lkKQoreworCXNldF9leGNlcHRfdmVjdG9yKDAsIHFlbXVfaGFuZGxlX2ludCk7CisJbWlwc19ocHRfZnJlcXVlbmN5ID0gUUVNVV9DMF9DT1VOVEVSX0NMT0NLOwkJLyogMTAwTUh6ICovCisKKwlpbml0X2k4MjU5X2lycXMoKTsKKwlzZXRfYzBfc3RhdHVzKDB4ODQwMCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcWVtdS9xLW1lbS5jIGIvYXJjaC9taXBzL3FlbXUvcS1tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTc0ZmFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3FlbXUvcS1tZW0uYwpAQCAtMCwwICsxLDYgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKK3Vuc2lnbmVkIGxvbmcgX19pbml0IHByb21fZnJlZV9wcm9tX21lbW9yeSh2b2lkKQoreworCXJldHVybiAwVUw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcWVtdS9xLXNldHVwLmMgYi9hcmNoL21pcHMvcWVtdS9xLXNldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE4MGVlZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9xZW11L3Etc2V0dXAuYwpAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisKKyNkZWZpbmUgUUVNVV9QT1JUX0JBU0UgMHhiNDAwMDAwMAorCitzdGF0aWMgdm9pZCBfX2luaXQgcWVtdV90aW1lcl9zZXR1cChzdHJ1Y3QgaXJxYWN0aW9uICppcnEpCit7CisJLyogc2V0IHRoZSBjbG9jayB0byAxMDAgSHogKi8KKwlvdXRiX3AoMHgzNCwweDQzKTsJCS8qIGJpbmFyeSwgbW9kZSAyLCBMU0IvTVNCLCBjaCAwICovCisJb3V0Yl9wKExBVENIICYgMHhmZiAsIDB4NDApOwkvKiBMU0IgKi8KKwlvdXRiKExBVENIID4+IDggLCAweDQwKTsJLyogTVNCICovCisJc2V0dXBfaXJxKDAsIGlycSk7Cit9CisKK3ZvaWQgX19pbml0IHBsYXRfc2V0dXAodm9pZCkKK3sKKwlzZXRfaW9fcG9ydF9iYXNlKFFFTVVfUE9SVF9CQVNFKTsKKwlib2FyZF90aW1lcl9zZXR1cCA9IHFlbXVfdGltZXJfc2V0dXA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1laXNhLmMgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1laXNhLmMKaW5kZXggMGFiNGFiZi4uZmEwZTcxOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItZWlzYS5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWVpc2EuYwpAQCAtMjQyLDcgKzI0Miw3IEBACiAJaW50IGksIGM7CiAJY2hhciAqc3RyOwogCXU4ICpzbG90X2FkZHI7Ci0JCisKIAlpZiAoIShzZ2ltYy0+c3lzdGVtaWQgJiBTR0lNQ19TWVNJRF9FUFJFU0VOVCkpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRUlTQTogYnVzIG5vdCBwcmVzZW50LlxuIik7CiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItaHBjLmMgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1ocGMuYwppbmRleCBjMGFmZWNjLi41YzAwY2RkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1ocGMuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1ocGMuYwpAQCAtNDksNyArNDksNyBAQAogCQlzZ2ludCA9ICZzZ2lvYy0+aW50MzsKIAkJc3lzdGVtX3R5cGUgPSAiU0dJIEluZHkiOwogCX0KLQkKKwogCXNnaV9pb2NfcmVzZXQgPSAoU0dJT0NfUkVTRVRfUFBPUlQgfCBTR0lPQ19SRVNFVF9LQkRNT1VTRSB8CiAJCQkgU0dJT0NfUkVTRVRfRUlTQSB8IFNHSU9DX1JFU0VUX0lTRE4gfAogCQkJIFNHSU9DX1JFU0VUX0xDME9GRik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1pbnQuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWludC5jCmluZGV4IGVhMjg0NGQuLmQxNmZiNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWludC5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWludC5jCkBAIC0yOCw3ICsyOCw3IEBACiAvKiAjZGVmaW5lIERFQlVHX1NHSU5UICovCiAKIC8qIFNvIGZhciBub3RoaW5nIGhhbmdzIGhlcmUgKi8KLSN1bmRlZiBVU0VfTElPM19JUlEgCisjdW5kZWYgVVNFX0xJTzNfSVJRCiAKIHN0cnVjdCBzZ2ludF9yZWdzICpzZ2ludDsKIApAQCAtMjcyLDMyICsyNzIsMzIgQEAKIAlpcnFfZXhpdCgpOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBsb2NhbDBfY2FzY2FkZSA9IHsgCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBsb2NhbDBfY2FzY2FkZSA9IHsKIAkuaGFuZGxlcgk9IG5vX2FjdGlvbiwKIAkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAogCS5uYW1lCQk9ICJsb2NhbDAgY2FzY2FkZSIsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBsb2NhbDFfY2FzY2FkZSA9IHsgCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBsb2NhbDFfY2FzY2FkZSA9IHsKIAkuaGFuZGxlcgk9IG5vX2FjdGlvbiwKIAkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAogCS5uYW1lCQk9ICJsb2NhbDEgY2FzY2FkZSIsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBidXNlcnIgPSB7IAorc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gYnVzZXJyID0gewogCS5oYW5kbGVyCT0gbm9fYWN0aW9uLAogCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCiAJLm5hbWUJCT0gIkJ1cyBFcnJvciIsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtYXAwX2Nhc2NhZGUgPSB7IAorc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWFwMF9jYXNjYWRlID0gewogCS5oYW5kbGVyCT0gbm9fYWN0aW9uLAogCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCiAJLm5hbWUJCT0gIm1hcGFibGUwIGNhc2NhZGUiLAogfTsKIAogI2lmZGVmIFVTRV9MSU8zX0lSUQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWFwMV9jYXNjYWRlID0geyAKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG1hcDFfY2FzY2FkZSA9IHsKIAkuaGFuZGxlcgk9IG5vX2FjdGlvbiwKIAkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAogCS5uYW1lCQk9ICJtYXBhYmxlMSBjYXNjYWRlIiwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLW52cmFtLmMgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1udnJhbS5jCmluZGV4IGRlNDNlODYuLmZkMjlmZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLW52cmFtLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItbnZyYW0uYwpAQCAtMzksNyArMzksNyBAQAogCSpwdHIgfD0gRUVQUk9NX0NTRUw7CVwKIAkqcHRyIHw9IEVFUFJPTV9FQ0xLOyB9KQogCi0JCQorCiAjZGVmaW5lIGVlcHJvbV9jc19vZmYocHRyKSAoewlcCiAJKnB0ciAmPSB+RUVQUk9NX0VDTEs7CVwKIAkqcHRyICY9IH5FRVBST01fQ1NFTDsJXApAQCAtNTAsNyArNTAsNyBAQAogLyoKICAqIGNsb2NrIGluIHRoZSBudnJhbSBjb21tYW5kIGFuZCB0aGUgcmVnaXN0ZXIgbnVtYmVyLiBGb3IgdGhlCiAgKiBuYXRpb25hbCBzZW1pY29uZHVjdG9yIG52IHJhbSBjaGlwIHRoZSBvcCBjb2RlIGlzIDMgYml0cyBhbmQKLSAqIHRoZSBhZGRyZXNzIGlzIDYvOCBiaXRzLiAKKyAqIHRoZSBhZGRyZXNzIGlzIDYvOCBiaXRzLgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZWVwcm9tX2NtZCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmN0cmwsIHVuc2lnbmVkIGNtZCwKIAkJCSAgICAgIHVuc2lnbmVkIHJlZykKQEAgLTkwLDcgKzkwLDcgQEAKIAkJaWYgKCpjdHJsICYgRUVQUk9NX0RBVEkpCiAJCQlyZXMgfD0gMTsKIAl9Ci0JCQorCiAJZWVwcm9tX2NzX29mZihjdHJsKTsKIAogCXJldHVybiByZXM7CkBAIC0xMTMsNyArMTEzLDcgQEAKIAkJcmVnIDw8PSAxOwogCQl0bXAgPSBocGMzYzAtPmJicmFtW3JlZysrXSAmIDB4ZmY7CiAJCXJldHVybiAodG1wIDw8IDgpIHwgKGhwYzNjMC0+YmJyYW1bcmVnXSAmIDB4ZmYpOwotCX0JCQorCX0KIH0KIAogRVhQT1JUX1NZTUJPTChpcDIyX252cmFtX3JlYWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItcmVzZXQuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXJlc2V0LmMKaW5kZXggZWQ1YzYwYS4uMjE0ZmZkMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItcmVzZXQuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1yZXNldC5jCkBAIC0xODUsNyArMTg1LDcgQEAKIAkJYWRkX3RpbWVyKCZkZWJvdW5jZV90aW1lcik7CiAJfQogCi0JLyogUG93ZXIgYnV0dG9uIHdhcyBwcmVzc2VkIAorCS8qIFBvd2VyIGJ1dHRvbiB3YXMgcHJlc3NlZAogCSAqIGlvYy5wcyBwYWdlIDIyOiAiVGhlIFBhbmVsIFJlZ2lzdGVyIGlzIGNhbGxlZCBQb3dlciBDb250cm9sIGJ5IEZ1bGwKIAkgKiBIb3VzZS4gT25seSBsb3dlc3QgMiBiaXRzIGFyZSB1c2VkLiBHdWluZXNzIHVzZXMgdXBwZXIgZm91ciBiaXRzCiAJICogZm9yIHZvbHVtZSBjb250cm9sIi4gVGhpcyBpcyBub3QgdHJ1ZSwgYWxsIGJpdHMgYXJlIHB1bGxlZCBoaWdoCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi10aW1lLmMgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi10aW1lLmMKaW5kZXggMTczZjc2OC4uZGY5YjU2OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItdGltZS5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXRpbWUuYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAJdW5zaWduZWQgbG9uZyByNGtfdGlja3NbM107CiAJdW5zaWduZWQgbG9uZyByNGtfdGljazsKIAotCS8qIAorCS8qCiAJICogRmlndXJlIG91dCB0aGUgcjRrIG9mZnNldCwgdGhlIGFsZ29yaXRobSBpcyB2ZXJ5IHNpbXBsZSBhbmQgd29ya3MgaW4KIAkgKiBfYWxsXyBjYXNlcyBhcyBsb25nIGFzIHRoZSA4MjU0IGNvdW50ZXIgcmVnaXN0ZXIgaXRzZWxmIHdvcmtzIG9rIChhcwogCSAqIGFuIGludGVycnVwdCBkcml2aW5nIHRpbWVyIGl0IGRvZXMgbm90IGJlY2F1c2Ugb2YgYnVnLCB0aGlzIGlzIHdoeQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctbWVtb3J5LmMgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1tZW1vcnkuYwppbmRleCBhMTYwZDA0Li5lZjIwZDlhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1tZW1vcnkuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1tZW1vcnkuYwpAQCAtNTM4LDcgKzUzOCw3IEBACiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgewogCQl1bnNpZ25lZCBzbG90LCBudW1zbG90czsKIAkJc3RydWN0IHBhZ2UgKmVuZCwgKnA7Ci0JCisKIAkJLyoKIAkgCSAqIFRoaXMgd2lsbCBmcmVlIHVwIHRoZSBib290bWVtLCBpZSwgc2xvdCAwIG1lbW9yeS4KIAkgCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXRpbWVyLmMKaW5kZXggOGMxYjk2Zi4uY2RkZjFjZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy10aW1lci5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAkgKiBSVEMgY2xvY2sgYWNjb3JkaW5nbHkgZXZlcnkgfjExIG1pbnV0ZXMuIFNldF9ydGNfbW1zcygpIGhhcyB0byBiZQogCSAqIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB3aGVuIGEgc2Vjb25kIHN0YXJ0cy4KIAkgKi8KLQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorCWlmIChudHBfc3luY2VkKCkgJiYKIAkgICAgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPj0gNTAwMDAwIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA8PSA1MDAwMDAgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMikgewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDMyL2lwMzItcmVzZXQuYyBiL2FyY2gvbWlwcy9zZ2ktaXAzMi9pcDMyLXJlc2V0LmMKaW5kZXggMjgxZjA5MC4uODhlMWY1MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDMyL2lwMzItcmVzZXQuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1yZXNldC5jCkBAIC0xNDAsNyArMTQwLDcgQEAKIAogCXJlZ19jID0gQ01PU19SRUFEKFJUQ19JTlRSX0ZMQUdTKTsKIAlpZiAoIShyZWdfYyAmIFJUQ19JUlFGKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIAorCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkiJXM6IFJUQyBJUlEgd2l0aG91dCBSVENfSVJRRlxuIiwgX19GVU5DVElPTl9fKTsKIAl9CiAJLyogV2FpdCB1bnRpbCBpbnRlcnJ1cHQgZ29lcyBhd2F5ICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL2NmZS9jZmVfZXJyb3IuaCBiL2FyY2gvbWlwcy9zaWJ5dGUvY2ZlL2NmZV9lcnJvci5oCmluZGV4IDc3ZWI0OTMuLjk3NWYwMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvY2ZlL2NmZV9lcnJvci5oCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvY2ZlL2NmZV9lcnJvci5oCkBAIC0xNywxNSArMTcsMTUgQEAKICAqLwogCiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKiAgCisgICAgKgogICAgICogIEJyb2FkY29tIENvbW1vbiBGaXJtd2FyZSBFbnZpcm9ubWVudCAoQ0ZFKQotICAgICogIAorICAgICoKICAgICAqICBFcnJvciBjb2RlcwkJCQlGaWxlOiBjZmVfZXJyb3IuaAotICAgICogIAorICAgICoKICAgICAqICBDRkUncyBnbG9iYWwgZXJyb3IgY29kZSBsaXN0IGlzIGhlcmUuCi0gICAgKiAgCisgICAgKgogICAgICogIEF1dGhvcjogIE1pdGNoIExpY2h0ZW5iZXJnCi0gICAgKiAgCisgICAgKgogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvY2ZlL2NvbnNvbGUuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvY2ZlL2NvbnNvbGUuYwppbmRleCA1M2E1YzFlLi43NzIxMTAwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL2NmZS9jb25zb2xlLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9jZmUvY29uc29sZS5jCkBAIC0zOCw3ICszOCw3IEBACiAJCQlsYXN0ICs9IHdyaXR0ZW47CiAJCX0gd2hpbGUgKGxhc3QgPCBjb3VudCk7CiAJfQotCQkJCisKIH0KIAogc3RhdGljIGludCBjZmVfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY29ucywgY2hhciAqc3RyKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9jZmUvc2V0dXAuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvY2ZlL3NldHVwLmMKaW5kZXggZDZkMDM2NC4uN2EyYzdhOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9jZmUvc2V0dXAuYworKysgYi9hcmNoL21pcHMvc2lieXRlL2NmZS9zZXR1cC5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSAiY2ZlX2Vycm9yLmgiCiAKIC8qIE1heCByYW0gYWRkcmVzc2FibGUgaW4gMzItYml0IHNlZ21lbnRzICovCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogI2RlZmluZSBNQVhfUkFNX1NJWkUgKH4wVUxMKQogI2Vsc2UKICNpZmRlZiBDT05GSUdfSElHSE1FTQpAQCAtMjg1LDcgKzI4NSw3IEBACiAJCXdoaWxlICgxKSA7CiAJfQogCWNmZV9pbml0KGNmZV9oYW5kbGUsIGNmZV9lcHQpOwotCS8qIAorCS8qCiAJICogR2V0IHRoZSBoYW5kbGUgZm9yIChhdCBsZWFzdCkgcHJvbV9wdXRjaGFyLCBwb3NzaWJseSBmb3IKIAkgKiBib290IGNvbnNvbGUKIAkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvY2ZlL3NtcC5jIGIvYXJjaC9taXBzL3NpYnl0ZS9jZmUvc21wLmMKaW5kZXggNzMzOTIxOS4uZTQ0Y2UxYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9jZmUvc21wLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9jZmUvc21wLmMKQEAgLTU3LDcgKzU3LDcgQEAKIHZvaWQgcHJvbV9ib290X3NlY29uZGFyeShpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCiB7CiAJaW50IHJldHZhbDsKLQkKKwogCXJldHZhbCA9IGNmZV9jcHVfc3RhcnQoY3B1X2xvZ2ljYWxfbWFwKGNwdSksICZzbXBfYm9vdHN0cmFwLAogCQkJICAgICAgIF9fS1NUS19UT1MoaWRsZSksCiAJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaWRsZS0+dGhyZWFkX2luZm8sIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvYnVzX3dhdGNoZXIuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2J1c193YXRjaGVyLmMKaW5kZXggMTgyYTE2Zi4uMWE5N2UzMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvYnVzX3dhdGNoZXIuYworKysgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9idXNfd2F0Y2hlci5jCkBAIC0xMCwxMyArMTAsMTMgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogCisgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KICAqLwogCi0vKiAKKy8qCiAgKiBUaGUgQnVzIFdhdGNoZXIgbW9uaXRvcnMgaW50ZXJuYWwgYnVzIHRyYW5zYWN0aW9ucyBhbmQgbWFpbnRhaW5zCiAgKiBjb3VudHMgb2YgdHJhbnNhY3Rpb25zIHdpdGggZXJyb3Igc3RhdHVzLCBsb2dnaW5nIGRldGFpbHMgYW5kCiAgKiBjYXVzaW5nIG9uZSBvZiBzZXZlcmFsIGludGVycnVwdHMuICBUaGlzIGRyaXZlciBwcm92aWRlcyBhIGhhbmRsZXIKQEAgLTE1NSw3ICsxNTUsNyBAQAogc3RhdGljIHZvaWQgY3JlYXRlX3Byb2NfZGVjb2RlcihzdHJ1Y3QgYndfc3RhdHNfc3RydWN0ICpzdGF0cykKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKLQkKKwogCWVudCA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImJ1c193YXRjaGVyIiwgU19JV1VTUiB8IFNfSVJVR08sIE5VTEwsCiAJCQkJICAgICBid19yZWFkX3Byb2MsIHN0YXRzKTsKIAlpZiAoIWVudCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9pcnEuYwppbmRleCAyNzI4YWJiLi4yNzI1YjI2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9pcnEuYworKysgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9pcnEuYwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAKIAkvKgogCSAqIE5vdGUgdGhhdCB0aGUgdGltZXIgaW50ZXJydXB0cyBhcmUgYWxzbyBtYXBwZWQsIGJ1dCB0aGlzIGlzCi0JICogZG9uZSBpbiBzYjEyNTBfdGltZV9pbml0KCkuICBBbHNvLCB0aGUgcHJvZmlsaW5nIGRyaXZlciAKKwkgKiBkb25lIGluIHNiMTI1MF90aW1lX2luaXQoKS4gIEFsc28sIHRoZSBwcm9maWxpbmcgZHJpdmVyCiAJICogZG9lcyBpdHMgb3duIG1hbmFnZW1lbnQgb2YgSVA3LgogCSAqLwogCkBAIC0zOTIsNyArMzkyLDcgQEAKIAlpZiAoa2dkYl9mbGFnKSB7CiAJCWtnZGJfaXJxID0gS19JTlRfVUFSVF8wICsga2dkYl9wb3J0OwogCi0jaWZkZWYgQ09ORklHX1NJQllURV9TQjEyNTBfRFVBUlQJCisjaWZkZWYgQ09ORklHX1NJQllURV9TQjEyNTBfRFVBUlQKIAkJc2IxMjUwX2R1YXJ0X3ByZXNlbnRba2dkYl9wb3J0XSA9IDA7CiAjZW5kaWYKIAkJLyogU2V0dXAgdWFydCAxIHNldHRpbmdzLCBtYXBwZXIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc3dhcm0vcnRjX200MXQ4MS5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zd2FybS9ydGNfbTQxdDgxLmMKaW5kZXggMGU2MzNlZS4uYTY4NmJiNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zd2FybS9ydGNfbTQxdDgxLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9zd2FybS9ydGNfbTQxdDgxLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogCQkvKiBDbGVhciBlcnJvciBiaXQgYnkgd3JpdGluZyBhIDEgKi8KIAkJYnVzX3dyaXRlcShNX1NNQl9FUlJPUiwgU01CX0NTUihSX1NNQl9TVEFUVVMpKTsKIAkJcmV0dXJuIC0xOwotCX0gCisJfQogCiAJLyogcmVhZCB0aGUgc2FtZSBieXRlIGFnYWluIHRvIG1ha2Ugc3VyZSBpdCBpcyB3cml0dGVuICovCiAJYnVzX3dyaXRlcShWX1NNQl9BRERSKE00MVQ4MV9DQ1JfQUREUkVTUykgfCBWX1NNQl9UVF9SRDFCWVRFLApAQCAtMTM2LDcgKzEzNiw3IEBACiAKIAl3aGlsZSAoYnVzX3JlYWRxKFNNQl9DU1IoUl9TTUJfU1RBVFVTKSkgJiBNX1NNQl9CVVNZKQogCQk7Ci0JCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ4LDEzICsxNDgsMTMgQEAKIAogCS8qCiAJICogTm90ZSB0aGUgd3JpdGUgb3JkZXIgbWF0dGVycyBhcyBpdCBlbnN1cmVzIHRoZSBjb3JyZWN0bmVzcy4KLQkgKiBXaGVuIHdlIHdyaXRlIHNlYywgMTB0aCBzZWMgaXMgY2xlYXIuICBJdCBpcyByZWFzb25hYmxlIHRvIAorCSAqIFdoZW4gd2Ugd3JpdGUgc2VjLCAxMHRoIHNlYyBpcyBjbGVhci4gIEl0IGlzIHJlYXNvbmFibGUgdG8KIAkgKiBiZWxpZXZlIHdlIHNob3VsZCBmaW5pc2ggd3JpdGluZyBtaW4gd2l0aGluIGEgc2Vjb25kLgogCSAqLwogCiAJdG0udG1fc2VjID0gQklOMkJDRCh0bS50bV9zZWMpOwogCW00MXQ4MV93cml0ZShNNDFUODFSRUdfU0MsIHRtLnRtX3NlYyk7Ci0JCisKIAl0bS50bV9taW4gPSBCSU4yQkNEKHRtLnRtX21pbik7CiAJbTQxdDgxX3dyaXRlKE00MVQ4MVJFR19NTiwgdG0udG1fbWluKTsKIApAQCAtMTg3LDcgKzE4Nyw3IEBACiB7CiAJdW5zaWduZWQgaW50IHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYzsKIAotCS8qIAorCS8qCiAJICogbWluIGlzIHZhbGlkIGlmIHR3byByZWFkcyBvZiBzZWMgYXJlIHRoZSBzYW1lLgogCSAqLwogCWZvciAoOzspIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc3dhcm0vc2V0dXAuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvc3dhcm0vc2V0dXAuYwppbmRleCA0NTdhZWI3Li40ZGFlYWE0MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zd2FybS9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc3dhcm0vc2V0dXAuYwpAQCAtNzMsNyArNzMsNyBAQAogewogCWlmICghaXNfZml4dXAgJiYgKHJlZ3MtPmNwMF9jYXVzZSAmIDQpKSB7CiAJCS8qIERhdGEgYnVzIGVycm9yIC0gcHJpbnQgUEEgKi8KLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJCXByaW50aygiREJFIHBoeXNpY2FsIGFkZHJlc3M6ICUwMTBseFxuIiwKIAkJICAgICAgIF9fcmVhZF82NGJpdF9jMF9yZWdpc3RlcigkMjYsIDEpKTsKICNlbHNlCkBAIC05OCw3ICs5OCw3IEBACiAJCXJ0Y19nZXRfdGltZSA9IHhpY29yX2dldF90aW1lOwogCQlydGNfc2V0X3RpbWUgPSB4aWNvcl9zZXRfdGltZTsKIAl9Ci0gCisKIAlpZiAobTQxdDgxX3Byb2JlKCkpIHsKIAkJcHJpbnRrKCJzd2FybSBzZXR1cDogTTQxVDgxIFJUQyBkZXRlY3RlZC5cbiIpOwogCQlydGNfZ2V0X3RpbWUgPSBtNDF0ODFfZ2V0X3RpbWU7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc25pL2lycS5jIGIvYXJjaC9taXBzL3NuaS9pcnEuYwppbmRleCA2MmM3NjBmLi4xNDFhMzEwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc25pL2lycS5jCisrKyBiL2FyY2gvbWlwcy9zbmkvaXJxLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiAvKgogICogaHdpbnQgMSBkZWFscyB3aXRoIEVJU0EgYW5kIFNDU0kgaW50ZXJydXB0cywKLSAqIAorICoKICAqIFRoZSBFSVNBX0lOVCBiaXQgaW4gQ1NJVFBFTkQgaXMgaGlnaCBhY3RpdmUsIGFsbCBvdGhlcnMgYXJlIGxvdyBhY3RpdmUuCiAgKi8KIHZvaWQgcGNpYXNpY19od2ludDEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc25pL3NldHVwLmMgYi9hcmNoL21pcHMvc25pL3NldHVwLmMKaW5kZXggOGY2N2NlZS4uMWIzZjhhMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NuaS9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9zbmkvc2V0dXAuYwpAQCAtMTExLDcgKzExMSw3IEBACiAgKiBUaGUgUk0yMDAvUk0zMDAgaGFzIGEgZmV3IGhvbGVzIGluIGl0J3MgUENJL0VJU0EgbWVtb3J5IGFkZHJlc3Mgc3BhY2UgdXNlZAogICogZm9yIG90aGVyIHB1cnBvc2VzLiAgQmUgcGFyYW5vaWQgYW5kIGFsbG9jYXRlIGFsbCBvZiB0aGUgYmVmb3JlIHRoZSBQQ0kKICAqIGNvZGUgZ2V0cyBhIGNoYW5jZSB0byB0byBtYXAgYW55dGhpbmcgZWxzZSB0aGVyZSAuLi4KLSAqIAorICoKICAqIFRoaXMgbGVhdmVzIHRoZSBmb2xsb3dpbmcgYXJlYXMgYXZhaWxhYmxlOgogICoKICAqIDB4MTAwMDAwMDAgLSAweDEwMDlmZmZmICg2NDBrQikgUENJL0VJU0EvSVNBIEJ1cyBNZW1vcnkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eDQ5MjcvY29tbW9uL3R4NDkyN19pcnFfaGFuZGxlci5TIGIvYXJjaC9taXBzL3R4NDkyNy9jb21tb24vdHg0OTI3X2lycV9oYW5kbGVyLlMKaW5kZXggY2ExMjNlMi4uZGQzY2VkYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3R4NDkyNy9jb21tb24vdHg0OTI3X2lycV9oYW5kbGVyLlMKKysrIGIvYXJjaC9taXBzL3R4NDkyNy9jb21tb24vdHg0OTI3X2lycV9oYW5kbGVyLlMKQEAgLTQyLDEzICs0MiwxMyBAQAogCQlDTEkKIAkJLnNldAlhdAogCi0JCW1mYzAJdDAsIENQMF9DQVVTRSAgCisJCW1mYzAJdDAsIENQMF9DQVVTRQogCQltZmMwCXQxLCBDUDBfU1RBVFVTCiAJCWFuZAl0MCwgdDEKLSAgICAgICAgCisKIAkJYW5kaQl0MSwgdDAsIFNUQVRVU0ZfSVA3CS8qIGNwdSB0aW1lciAqLwogCQlibmV6CXQxLCBsbF9pcDcKLQkJCisKIAkJLyogSVA2Li5JUDMgbXVsdGlwbGV4ZWQgLS0gZG8gbm90IHVzZSAqLwogCiAJCWFuZGkJdDEsIHQwLCBTVEFUVVNGX0lQMgkvKiB0eDQ5MjcgcGljICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHg0OTI3L2NvbW1vbi90eDQ5Mjdfc2V0dXAuYyBiL2FyY2gvbWlwcy90eDQ5MjcvY29tbW9uL3R4NDkyN19zZXR1cC5jCmluZGV4IDE2YmNiZGMuLjI2ZDdjNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eDQ5MjcvY29tbW9uL3R4NDkyN19zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy90eDQ5MjcvY29tbW9uL3R4NDkyN19zZXR1cC5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAlwcmludF9jcDAoa2V5LCAxNiwgIkNPTkZJRyAgIiwgcmVhZF9jMF9jb25maWcoKSk7CiAJcmV0dXJuOwogfQotCQorCiB2b2lkIHByaW50X3BpYyhjaGFyICprZXksIHUzMiByZWcsIGNoYXIgKm5hbWUpCiB7CiAJcHJpbnRrKCIlcyBwaWM6MHglMDh4OiVzPTB4JTA4eFxuIiwga2V5LCByZWcsIG5hbWUsCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5MjcvTWFrZWZpbGUgYi9hcmNoL21pcHMvdHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5MjcvTWFrZWZpbGUKaW5kZXggODZjYTRjZi4uYzFhMzc3YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3R4NDkyNy90b3NoaWJhX3JidHg0OTI3L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy90eDQ5MjcvdG9zaGliYV9yYnR4NDkyNy9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKLW9iai15CSs9IHRvc2hpYmFfcmJ0eDQ5MjdfcHJvbS5vIAotb2JqLXkJKz0gdG9zaGliYV9yYnR4NDkyN19zZXR1cC5vIAotb2JqLXkJKz0gdG9zaGliYV9yYnR4NDkyN19pcnEubyAKK29iai15CSs9IHRvc2hpYmFfcmJ0eDQ5MjdfcHJvbS5vCitvYmoteQkrPSB0b3NoaWJhX3JidHg0OTI3X3NldHVwLm8KK29iai15CSs9IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxLm8KIAogRVhUUkFfQUZMQUdTIDo9ICQoQ0ZMQUdTKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4NDkyNy90b3NoaWJhX3JidHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5MjdfaXJxLmMgYi9hcmNoL21pcHMvdHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5MjcvdG9zaGliYV9yYnR4NDkyN19pcnEuYwppbmRleCBmZDViNDMzLi5hZWUwN2ZmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5MjcvdG9zaGliYV9yYnR4NDkyN19pcnEuYworKysgYi9hcmNoL21pcHMvdHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5MjcvdG9zaGliYV9yYnR4NDkyN19pcnEuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAKIC8qCi1JUlEgIERldmljZSAgCitJUlEgIERldmljZQogMDAgICBSQlRYNDkyNy1JU0EvMDAKIDAxICAgUkJUWDQ5MjctSVNBLzAxIFBTMi9LZXlib2FyZAogMDIgICBSQlRYNDkyNy1JU0EvMDIgQ2FzY2FkZSBSQlRYNDkyNy1JU0EgKGlycXMgOC0xNSkKQEAgLTUyLDE1ICs1MiwxNSBAQAogMTYgICBUWDQ5MjctQ1AwLzAwIFNvZnR3YXJlIDAKIDE3ICAgVFg0OTI3LUNQMC8wMSBTb2Z0d2FyZSAxCiAxOCAgIFRYNDkyNy1DUDAvMDIgQ2FzY2FkZSBUWDQ5MjctQ1AwCi0xOSAgIFRYNDkyNy1DUDAvMDMgTXVsdGlwbGV4ZWQgLS0gZG8gbm90IHVzZSAKLTIwICAgVFg0OTI3LUNQMC8wNCBNdWx0aXBsZXhlZCAtLSBkbyBub3QgdXNlIAotMjEgICBUWDQ5MjctQ1AwLzA1IE11bHRpcGxleGVkIC0tIGRvIG5vdCB1c2UgCi0yMiAgIFRYNDkyNy1DUDAvMDYgTXVsdGlwbGV4ZWQgLS0gZG8gbm90IHVzZSAKKzE5ICAgVFg0OTI3LUNQMC8wMyBNdWx0aXBsZXhlZCAtLSBkbyBub3QgdXNlCisyMCAgIFRYNDkyNy1DUDAvMDQgTXVsdGlwbGV4ZWQgLS0gZG8gbm90IHVzZQorMjEgICBUWDQ5MjctQ1AwLzA1IE11bHRpcGxleGVkIC0tIGRvIG5vdCB1c2UKKzIyICAgVFg0OTI3LUNQMC8wNiBNdWx0aXBsZXhlZCAtLSBkbyBub3QgdXNlCiAyMyAgIFRYNDkyNy1DUDAvMDcgQ1BVIFRJTUVSCiAKIDI0ICAgVFg0OTI3LVBJQy8wMAogMjUgICBUWDQ5MjctUElDLzAxCi0yNiAgIFRYNDkyNy1QSUMvMDIgIAorMjYgICBUWDQ5MjctUElDLzAyCiAyNyAgIFRYNDkyNy1QSUMvMDMgQ2FzY2FkZSBSQlRYNDkyNy1JT0MKIDI4ICAgVFg0OTI3LVBJQy8wNAogMjkgICBUWDQ5MjctUElDLzA1IFJCVFg0OTI3IFJUTC04MDE5QVMgZXRoZXJuZXQKQEAgLTgwLDcgKzgwLDcgQEAKIDQzICAgVFg0OTI3LVBJQy8xOQogNDQgICBUWDQ5MjctUElDLzIwCiA0NSAgIFRYNDkyNy1QSUMvMjEKLTQ2ICAgVFg0OTI3LVBJQy8yMiBUWDQ5MjcgUENJIFBDSS1FUlIgCis0NiAgIFRYNDkyNy1QSUMvMjIgVFg0OTI3IFBDSSBQQ0ktRVJSCiA0NyAgIFRYNDkyNy1QSUMvMjMgVFg0OTI3IFBDSSBQQ0ktUE1BIChub3QgdXNlZCkKIDQ4ICAgVFg0OTI3LVBJQy8yNAogNDkgICBUWDQ5MjctUElDLzI1CkBAIC0xMDAsNyArMTAwLDcgQEAKIDYyIFJCVFg0OTI3LUlPQy8wNgogNjMgUkJUWDQ5MjctSU9DLzA3CiAKLU5PVEVTOiAKK05PVEVTOgogU291dGhCcmlkZ2UvSU5UUiBpcyBtYXBwZWQgdG8gU291dGhCcmlkZ2UvQT1QQ0ktQi8jNTgKIFNvdXRoQnJpZGdlL0lTQS9waW49MCBubyBwY2kgaXJxIHVzZWQgYnkgdGhpcyBkZXZpY2UKIFNvdXRoQnJpZGdlL0lERS9waW49MSBubyBwY2kgaXJxIHVzZWQgYnkgdGhpcyBkZXZpY2UsIHVzaW5nIElOVFIgdmlhIElTQSBJUlExNApAQCAtMTc1LDE5ICsxNzUsMTkgQEAKIHN0YXRpYyBjb25zdCB1MzIgdG9zaGliYV9yYnR4NDkyN19pcnFfZGVidWdfZmxhZyA9CiAgICAgKFRPU0hJQkFfUkJUWDQ5MjdfSVJRX05PTkUgfCBUT1NISUJBX1JCVFg0OTI3X0lSUV9JTkZPIHwKICAgICAgVE9TSElCQV9SQlRYNDkyN19JUlFfV0FSTiB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0VST1IKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0lOSVQgIAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfU1RBUlRVUCAgCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19TSFVURE9XTiAgCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19FTkFCTEUgIAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRElTQUJMRSAgCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19NQVNLICAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0VORElSUSAgCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9JTklUICAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX1NUQVJUVVAgIAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUT1NISUJBX1JCVFg0OTI3X0lSUV9JU0FfU0hVVERPV04gIAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUT1NISUJBX1JCVFg0OTI3X0lSUV9JU0FfRU5BQkxFICAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0RJU0FCTEUgIAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUT1NISUJBX1JCVFg0OTI3X0lSUV9JU0FfTUFTSyAgCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19JTklUCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19TVEFSVFVQCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19TSFVURE9XTgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRU5BQkxFCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19ESVNBQkxFCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19NQVNLCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19FTkRJUlEKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0lOSVQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX1NUQVJUVVAKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX1NIVVRET1dOCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9FTkFCTEUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0RJU0FCTEUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX01BU0sKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0VORElSUQogICAgICk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eDQ5MjcvdG9zaGliYV9yYnR4NDkyNy90b3NoaWJhX3JidHg0OTI3X3NldHVwLmMgYi9hcmNoL21pcHMvdHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5MjcvdG9zaGliYV9yYnR4NDkyN19zZXR1cC5jCmluZGV4IDg3MjRlYTMuLmZjMDcyMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eDQ5MjcvdG9zaGliYV9yYnR4NDkyNy90b3NoaWJhX3JidHg0OTI3X3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3R4NDkyNy90b3NoaWJhX3JidHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5Mjdfc2V0dXAuYwpAQCAtMzk1LDcgKzM5NSw3IEBACiAJCQkvKiBlbmFibGUgc2Vjb25kYXJ5IGlkZSAqLwogCQkJdjA4XzQzIHw9IDB4ODA7CiAKLQkJCS8qIAorCQkJLyoKIAkJCSAqICEhISBETyBOT1QgUkVNT1ZFIFRISVMgQ09NTUVOVCBJVCBJUyBSRVFVSVJFRCBCWSBTTVNDICEhIQogCQkJICoKIAkJCSAqIFRoaXMgbGluZSBvZiBjb2RlIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCBhIHdvcmsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxODEvY29tbW9uL01ha2VmaWxlIGIvYXJjaC9taXBzL3ZyNDE4MS9jb21tb24vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTg3Y2EuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3ZyNDE4MS9jb21tb24vTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGNvbW1vbiBjb2RlIG9mIE5FQyB2cjQxODEgYmFzZWQgYm9hcmRzCi0jCi0KLW9iai15CSA6PSBpcnEubyBpbnRfaGFuZGxlci5vIHNlcmlhbC5vIHRpbWUubwotCi1FWFRSQV9BRkxBR1MgOj0gJChDRkxBR1MpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MTgxL2NvbW1vbi9pbnRfaGFuZGxlci5TIGIvYXJjaC9taXBzL3ZyNDE4MS9jb21tb24vaW50X2hhbmRsZXIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwNDFiOC4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvdnI0MTgxL2NvbW1vbi9pbnRfaGFuZGxlci5TCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qCi0gKiBhcmNoL21pcHMvdnI0MTgxL2NvbW1vbi9pbnRfaGFuZGxlci5TCi0gKgotICogQWRhcHRlZCB0byB0aGUgVlI0MTgxIGFuZCBhbG1vc3QgZW50aXJlbHkgcmV3cml0dGVuOgotICogQ29weXJpZ2h0IChDKSAxOTk5IEJyYWRsZXkgRC4gTGFSb25kZSBhbmQgTWljaGFlbCBLbGFyCi0gKgotICogQ2xlYW4gdXAgdG8gY29uZm9ybSB0byB0aGUgbmV3IElSUQotICogQ29weXJpZ2h0IChDKSAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBKdW4gU3VuLCBqc3VuQG12aXN0YS5jb20gb3IganN1bkBqdW5zdW4ubmV0Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxhc20vYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgotI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgotI2luY2x1ZGUgPGFzbS9zdGFja2ZyYW1lLmg+Ci0KLSNpbmNsdWRlIDxhc20vdnI0MTgxL3ZyNDE4MS5oPgotCi0vKgotICogW2pzdW5dCi0gKiBTZWUgaW5jbHVkZS9hc20vdnI0MTgxL2lycS5oIGZvciBJUlEgYXNzaWdubWVudCBhbmQgc3RyYXRlZ3kuCi0gKi8KLQotCS50ZXh0Ci0JLnNldAlub3Jlb3JkZXIKLQotCS5hbGlnbgk1Ci0JTkVTVEVEKHZyNDE4MV9oYW5kbGVfaXJxLCBQVF9TSVpFLCByYSkKLQotCS5zZXQJbm9hdAotCVNBVkVfQUxMCi0JQ0xJCi0KLQkuc2V0CWF0Ci0JLnNldAlub3Jlb3JkZXIKLQotCW1mYzAJdDAsIENQMF9DQVVTRQotCW1mYzAJdDIsIENQMF9TVEFUVVMKLQotCWFuZAl0MCwgdDIKLQotCS8qIHdlIGNoZWNrIElQMyBmaXJzdDsgaXQgaGFwcGVucyBtb3N0IGZyZXF1ZW50bHkgKi8KLQlhbmRpCXQxLCB0MCwgU1RBVFVTRl9JUDMKLQlibmV6CXQxLCBsbF9jcHVfaXAzCi0JYW5kaQl0MSwgdDAsIFNUQVRVU0ZfSVAyCi0JYm5legl0MSwgbGxfY3B1X2lwMgotCWFuZGkJdDEsIHQwLCBTVEFUVVNGX0lQNwkvKiBjcHUgdGltZXIgKi8KLQlibmV6CXQxLCBsbF9jcHV0aW1lcl9pcnEKLQlhbmRpCXQxLCB0MCwgU1RBVFVTRl9JUDQKLQlibmV6CXQxLCBsbF9jcHVfaXA0Ci0JYW5kaQl0MSwgdDAsIFNUQVRVU0ZfSVA1Ci0JYm5legl0MSwgbGxfY3B1X2lwNQotCWFuZGkJdDEsIHQwLCBTVEFUVVNGX0lQNgotCWJuZXoJdDEsIGxsX2NwdV9pcDYKLQlhbmRpCXQxLCB0MCwgU1RBVFVTRl9JUDAJLyogc29mdHdhcmUgaW50IDAgKi8KLQlibmV6CXQxLCBsbF9jcHVfaXAwCi0JYW5kaQl0MSwgdDAsIFNUQVRVU0ZfSVAxCS8qIHNvZnR3YXJlIGludCAxICovCi0JYm5legl0MSwgbGxfY3B1X2lwMQotCW5vcAotCi0JLnNldAlyZW9yZGVyCi1kb19zcHVyaW91czoKLQlqCXNwdXJpb3VzX2ludGVycnVwdAotCi0vKgotICogcmVndWxhciBDUFUgaXJxcwotICovCi1sbF9jcHV0aW1lcl9pcnE6Ci0JbGkJYTAsIFZSNDE4MV9JUlFfVElNRVIKLQltb3ZlCWExLCBzcAotCWphbAlkb19JUlEKLQlqCXJldF9mcm9tX2lycQotCi0KLWxsX2NwdV9pcDA6Ci0JbGkJYTAsIFZSNDE4MV9JUlFfU1cxCi0JbW92ZQlhMSwgc3AKLQlqYWwJZG9fSVJRCi0JaglyZXRfZnJvbV9pcnEKLQotbGxfY3B1X2lwMToKLQlsaQlhMCwgVlI0MTgxX0lSUV9TVzIKLQltb3ZlCWExLCBzcAotCWphbAlkb19JUlEKLQlqCXJldF9mcm9tX2lycQotCi1sbF9jcHVfaXAzOgotCWxpCWEwLCBWUjQxODFfSVJRX0lOVDEKLQltb3ZlCWExLCBzcAotCWphbAlkb19JUlEKLQlqCXJldF9mcm9tX2lycQotCi1sbF9jcHVfaXA0OgotCWxpCWEwLCBWUjQxODFfSVJRX0lOVDIKLQltb3ZlCWExLCBzcAotCWphbAlkb19JUlEKLQlqCXJldF9mcm9tX2lycQotCi1sbF9jcHVfaXA1OgotCWxpCWEwLCBWUjQxODFfSVJRX0lOVDMKLQltb3ZlCWExLCBzcAotCWphbAlkb19JUlEKLQlqCXJldF9mcm9tX2lycQotCi1sbF9jcHVfaXA2OgotCWxpCWEwLCBWUjQxODFfSVJRX0lOVDQKLQltb3ZlCWExLCBzcAotCWphbAlkb19JUlEKLQlqCXJldF9mcm9tX2lycQotCi0vKgotICogIE9uZSBvZiB0aGUgc3lzIGlycSBoYXMgaGFwcGVuZC4KLSAqCi0gKiAgSW4gdGhlIGludGVyZXN0IG9mIHNwZWVkLCB3ZSBmaXJzdCBkZXRlcm1pbmUgaW4gdGhlIGZvbGxvd2luZyBvcmRlcgotICogIHdoaWNoIDE2LWlycSBibG9jayBoYXZlIHBlbmRpbmcgaW50ZXJydXB0czoKLSAqCXN5c2ludDEgKDE2IHNvdXJjZXMsIGluY2x1ZGluZyBjYXNjYWRpbmcgaW50cnMgZnJvbSBHUElPKQotICoJc3lzaW50MgotICoJZ3BpbyAoMTYgaW50ciBzb3VyY2VzKQotICoKLSAqICBUaGVuIHdlIGRvIGJpbmFyeSBzZWFyY2ggdG8gZmluZCB0aGUgZXhhY3QgaW50ZXJydXB0IHNvdXJjZS4KLSAqLwotbGxfY3B1X2lwMjoKLQotCWx1aQl0MywlaGkoVlI0MTgxX1NZU0lOVDFSRUcpCi0JbGh1CXQwLCVsbyhWUjQxODFfU1lTSU5UMVJFRykodDMpCi0JbGh1CXQyLCVsbyhWUjQxODFfTVNZU0lOVDFSRUcpKHQzKQotCWFuZAl0MCwgMHhmZmZiCQkvKiBoYWNrIC0gcmVtb3ZlIFJUQyBMb25nIDEgaW50ciAqLwotCWFuZAl0MCwgdDIKLQliZXF6CXQwLCBjaGVja19zeXNpbnQyCi0KLQkvKiBjaGVjayBmb3IgR1BJTyBpbnRlcnJ1cHRzICovCi0JYW5kaQl0MSwgdDAsIDB4MDEwMAotCWJuZXoJdDEsIGNoZWNrX2dwaW9faW50Ci0KLQkvKiBzbyB3ZSBoYXZlIGFuIGludGVycnVwdCBpbiBzeXNpbnQxIHdoaWNoIGlzIG5vdCBncGlvIGludCAqLwotCWxpCWEwLCBWUjQxODFfU1lTX0lSUV9CQVNFIC0gMQotCWoJY2hlY2tfMTYKLQotY2hlY2tfc3lzaW50MjoKLQotCWxodQl0MCwlbG8oVlI0MTgxX1NZU0lOVDJSRUcpKHQzKQotCWxodQl0MiwlbG8oVlI0MTgxX01TWVNJTlQyUkVHKSh0MykKLQlhbmQJdDAsIDB4ZmZmZQkJLyogaGFjayAtIHJlbW92ZSBSVEMgTG9uZyAyIGludHIgKi8KLQlhbmQJdDAsIHQyCi0JbGkJYTAsIFZSNDE4MV9TWVNfSVJRX0JBU0UgKyAxNiAtIDEKLQlqCWNoZWNrXzE2Ci0KLWNoZWNrX2dwaW9faW50OgotCWx1aQl0MywlaGkoVlI0MTgxX0dQSU5UTVNLKQotCWxodQl0MCwlbG8oVlI0MTgxX0dQSU5UTVNLKSh0MykKLQlsaHUJdDIsJWxvKFZSNDE4MV9HUElOVFNUQVQpKHQzKQotCXhvcmkJdDAsIDB4ZmZmZgkJCS8qIHdoeT8gcmV2ZXJzZSBsb2dpYz8gKi8KLQlhbmQJdDAsIHQyCi0JbGkJYTAsIFZSNDE4MV9HUElPX0lSUV9CQVNFIC0gMQotCWoJY2hlY2tfMTYKLQotLyoKLSAqICBXaGVuIHdlIHJlYWNoIGNoZWNrXzE2LCB3ZSBoYXZlIDE2LWJpdCBzdGF0dXMgaW4gdDAgYW5kIGJhc2UgaXJxIG51bWJlcgotICogIGluIGEwLgotICovCi1jaGVja18xNjoKLQlhbmRpCXQxLCB0MCwgMHhmZgotCWJuZXoJdDEsIGNoZWNrXzgKLQotCXNybAl0MCwgOAotCWFkZGkJYTAsIDgKLQlqCWNoZWNrXzgKLQotLyoKLSAqICBXaGVuIHdlIHJlYWNoIGNoZWNrXzgsIHdlIGhhdmUgOC1iaXQgc3RhdHVzIGluIHQwIGFuZCBiYXNlIGlycSBudW1iZXIKLSAqICBpbiBhMC4KLSAqLwotY2hlY2tfODoKLQlhbmRpCXQxLCB0MCwgMHhmCi0JYm5legl0MSwgY2hlY2tfNAotCi0Jc3JsCXQwLCA0Ci0JYWRkaQlhMCwgNAotCWoJY2hlY2tfNAotCi0vKgotICogIFdoZW4gd2UgcmVhY2ggY2hlY2tfNCwgd2UgaGF2ZSA0LWJpdCBzdGF0dXMgaW4gdDAgYW5kIGJhc2UgaXJxIG51bWJlcgotICogIGluIGEwLgotICovCi1jaGVja180OgotCWFuZGkJdDAsIHQwLCAweGYKLQliZXF6CXQwLCBkb19zcHVyaW91cwotCi1sb29wOgotCWFuZGkJdDIsIHQwLCAweDEKLQlzcmwJdDAsIDEKLQlhZGRpCWEwLCAxCi0JYmVxegl0MiwgbG9vcAotCi1mb3VuZF9pdDoKLQltb3ZlCWExLCBzcAotCWphbAlkb19JUlEKLQotCWoJcmV0X2Zyb21faXJxCi0KLQlFTkQodnI0MTgxX2hhbmRsZV9pcnEpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MTgxL2NvbW1vbi9pcnEuYyBiL2FyY2gvbWlwcy92cjQxODEvY29tbW9uL2lycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2RmNzdjLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy92cjQxODEvY29tbW9uL2lycS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IEp1biBTdW4sIGpzdW5AbXZpc3RhLmNvbSBvciBqc3VuQGp1bnN1bi5uZXQKLSAqIENvcHlyaWdodCAoQykgMjAwNSBSYWxmIEJhZWNobGUgKHJhbGZAbGludXgtbWlwcy5vcmcpCi0gKgotICogbGludXgvYXJjaC9taXBzL3ZyNDE4MS9jb21tb24vaXJxLmMKLSAqCUNvbXBsZXRlbHkgcmUtd3JpdHRlbiB0byB1c2UgdGhlIG5ldyBpcnEuYwotICoKLSAqIENyZWRpdHMgdG8gQnJhZGxleSBELiBMYVJvbmRlIGFuZCBNaWNoYWVsIEtsYXIgZm9yIHdyaXRpbmcgdGhlIG9yaWdpbmFsCi0gKiBpcnEuYyBmaWxlIHdoaWNoIHdhcyBkZXJpdmVkIGZyb20gdGhlIGNvbW1vbiBpcnEuYyBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLQotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KLSNpbmNsdWRlIDxhc20vZ2RiLXN0dWIuaD4KLQotI2luY2x1ZGUgPGFzbS92cjQxODEvdnI0MTgxLmg+Ci0KLS8qCi0gKiBTdHJhdGVneToKLSAqCi0gKiBXZSBlc3NlbnRpYWxseSBoYXZlIHRocmVlIGlycSBjb250cm9sbGVycywgQ1BVLCBzeXN0ZW0sIGFuZCBncGlvLgotICoKLSAqIENQVSBpcnEgY29udHJvbGxlciBpcyB0YWtlbiBjYXJlIGJ5IGFyY2gvbWlwcy9rZXJuZWwvaXJxX2NwdS5jIGFuZAotICogQ09ORklHX0lSUV9DUFUgY29uZmlnIG9wdGlvbi4KLSAqCi0gKiBXZSBoZXJlIHByb3ZpZGUgc3lzX2lycSBhbmQgZ3Bpb19pcnEgY29udHJvbGxlciBjb2RlLgotICovCi0KLXN0YXRpYyBpbnQgc3lzX2lycV9iYXNlOwotc3RhdGljIGludCBncGlvX2lycV9iYXNlOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN5cyBpcnEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZAotc3lzX2lycV9lbmFibGUodW5zaWduZWQgaW50IGlycSkKLXsKLQlpcnEgLT0gc3lzX2lycV9iYXNlOwotCWlmIChpcnEgPCAxNikgewotCQkqVlI0MTgxX01TWVNJTlQxUkVHIHw9ICh1MTYpKDEgPDwgaXJxKTsKLQl9IGVsc2UgewotCQlpcnEgLT0gMTY7Ci0JCSpWUjQxODFfTVNZU0lOVDJSRUcgfD0gKHUxNikoMSA8PCBpcnEpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXN5c19pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlycSAtPSBzeXNfaXJxX2Jhc2U7Ci0JaWYgKGlycSA8IDE2KSB7Ci0JCSpWUjQxODFfTVNZU0lOVDFSRUcgJj0gfigodTE2KSgxIDw8IGlycSkpOwotCX0gZWxzZSB7Ci0JCWlycSAtPSAxNjsKLQkJKlZSNDE4MV9NU1lTSU5UMlJFRyAmPSB+KCh1MTYpKDEgPDwgaXJxKSk7Ci0JfQotCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXN5c19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN5c19pcnFfZW5hYmxlKGlycSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgc3lzX2lycV9zaHV0ZG93bglzeXNfaXJxX2Rpc2FibGUKLSNkZWZpbmUgc3lzX2lycV9hY2sJCXN5c19pcnFfZGlzYWJsZQotCi1zdGF0aWMgdm9pZAotc3lzX2lycV9lbmQodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZighKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRCB8IElSUV9JTlBST0dSRVNTKSkpCi0JCXN5c19pcnFfZW5hYmxlKGlycSk7Ci19Ci0KLXN0YXRpYyBod19pcnFfY29udHJvbGxlciBzeXNfaXJxX2NvbnRyb2xsZXIgPSB7Ci0JInZyNDE4MV9zeXNfaXJxIiwKLQlzeXNfaXJxX3N0YXJ0dXAsCi0Jc3lzX2lycV9zaHV0ZG93biwKLQlzeXNfaXJxX2VuYWJsZSwKLQlzeXNfaXJxX2Rpc2FibGUsCi0Jc3lzX2lycV9hY2ssCi0Jc3lzX2lycV9lbmQsCi0JTlVMTAkJCS8qIG5vIGFmZmluaXR5IHN0dWZmIGZvciBVUCAqLwotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBncGlvIGlycSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIGdwaW8gaXJxIGxpbmVzIHVzZSByZXZlcnNlIGxvZ2ljICovCi1zdGF0aWMgdm9pZAotZ3Bpb19pcnFfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaXJxIC09IGdwaW9faXJxX2Jhc2U7Ci0JKlZSNDE4MV9HUElOVE1TSyAmPSB+KCh1MTYpKDEgPDwgaXJxKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ncGlvX2lycV9kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaXJxIC09IGdwaW9faXJxX2Jhc2U7Ci0JKlZSNDE4MV9HUElOVE1TSyB8PSAodTE2KSgxIDw8IGlycSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWdwaW9faXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQlncGlvX2lycV9lbmFibGUoaXJxKTsKLQotCWlycSAtPSBncGlvX2lycV9iYXNlOwotCSpWUjQxODFfR1BJTlRFTiB8PSAodTE2KSgxIDw8IGlycSApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ncGlvX2lycV9zaHV0ZG93bih1bnNpZ25lZCBpbnQgaXJxKQotewotCWdwaW9faXJxX2Rpc2FibGUoaXJxKTsKLQotCWlycSAtPSBncGlvX2lycV9iYXNlOwotCSpWUjQxODFfR1BJTlRFTiAmPSB+KCh1MTYpKDEgPDwgaXJxICkpOwotfQotCi1zdGF0aWMgdm9pZAotZ3Bpb19pcnFfYWNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdTE2IGlycXR5cGU7Ci0JdTE2IGlycXNoaWZ0OwotCi0JZ3Bpb19pcnFfZGlzYWJsZShpcnEpOwotCi0JLyogd2UgY2xlYXIgaW50ZXJydXB0IGlmIGl0IGlzIGVkZ2UgdHJpZ2dlcmVkICovCi0JaXJxIC09IGdwaW9faXJxX2Jhc2U7Ci0JaWYgKGlycSA8IDgpIHsKLQkJaXJxdHlwZSA9ICpWUjQxODFfR1BJTlRUWVBMOwotCQlpcnFzaGlmdCA9IDIgPDwgKGlycSoyKTsKLQl9IGVsc2UgewotCQlpcnF0eXBlID0gKlZSNDE4MV9HUElOVFRZUEg7Ci0JCWlycXNoaWZ0ID0gMiA8PCAoKGlycS04KSoyKTsKLQl9Ci0JaWYgKCAhIChpcnF0eXBlICYgaXJxc2hpZnQpICkgewotCQkqVlI0MTgxX0dQSU5UU1RBVCA9ICh1MTYpICgxIDw8IGlycSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotZ3Bpb19pcnFfZW5kKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKQotCQlncGlvX2lycV9lbmFibGUoaXJxKTsKLX0KLQotc3RhdGljIGh3X2lycV9jb250cm9sbGVyIGdwaW9faXJxX2NvbnRyb2xsZXIgPSB7Ci0JInZyNDE4MV9ncGlvX2lycSIsCi0JZ3Bpb19pcnFfc3RhcnR1cCwKLQlncGlvX2lycV9zaHV0ZG93biwKLQlncGlvX2lycV9lbmFibGUsCi0JZ3Bpb19pcnFfZGlzYWJsZSwKLQlncGlvX2lycV9hY2ssCi0JZ3Bpb19pcnFfZW5kLAotCU5VTEwJCQkvKiBubyBhZmZpbml0eSBzdHVmZiBmb3IgVVAgKi8KLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgSVJRIGluaXQgc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1leHRlcm4gYXNtbGlua2FnZSB2b2lkIHZyNDE4MV9oYW5kbGVfaXJxKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnJlYWtwb2ludCh2b2lkKTsKLWV4dGVybiBpbnQgc2V0dXBfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFhY3Rpb24gKmlycWFjdGlvbik7Ci1leHRlcm4gdm9pZCBtaXBzX2NwdV9pcnFfaW5pdCh1MzIgaXJxX2Jhc2UpOwotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjYXNjYWRlID0KLQl7IG5vX2FjdGlvbiwgU0FfSU5URVJSVVBULCBDUFVfTUFTS19OT05FLCAiY2FzY2FkZSIsIE5VTEwsIE5VTEwgfTsKLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHJlc2VydmVkID0KLQl7IG5vX2FjdGlvbiwgU0FfSU5URVJSVVBULCBDUFVfTUFTS19OT05FLCAiY2FzY2FkZSIsIE5VTEwsIE5VTEwgfTsKLQotdm9pZCBfX2luaXQgYXJjaF9pbml0X2lycSh2b2lkKQotewotCWludCBpOwotCi0Jc2V0X2V4Y2VwdF92ZWN0b3IoMCwgdnI0MTgxX2hhbmRsZV9pcnEpOwotCi0JLyogaW5pdCBDUFUgaXJxcyAqLwotCW1pcHNfY3B1X2lycV9pbml0KFZSNDE4MV9DUFVfSVJRX0JBU0UpOwotCi0JLyogaW5pdCBzeXMgaXJxcyAqLwotCXN5c19pcnFfYmFzZSA9IFZSNDE4MV9TWVNfSVJRX0JBU0U7Ci0JZm9yIChpPXN5c19pcnFfYmFzZTsgaSA8IHN5c19pcnFfYmFzZSArIFZSNDE4MV9OVU1fU1lTX0lSUTsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gTlVMTDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAxOwotCQlpcnFfZGVzY1tpXS5oYW5kbGVyID0gJnN5c19pcnFfY29udHJvbGxlcjsKLQl9Ci0KLQkvKiBpbml0IGdwaW8gaXJxcyAqLwotCWdwaW9faXJxX2Jhc2UgPSBWUjQxODFfR1BJT19JUlFfQkFTRTsKLQlmb3IgKGk9Z3Bpb19pcnFfYmFzZTsgaSA8IGdwaW9faXJxX2Jhc2UgKyBWUjQxODFfTlVNX0dQSU9fSVJROyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmZ3Bpb19pcnFfY29udHJvbGxlcjsKLQl9Ci0KLQkvKiBEZWZhdWx0IGFsbCBJQ1UgSVJRcyB0byBvZmYgLi4uICovCi0JKlZSNDE4MV9NU1lTSU5UMVJFRyA9IDA7Ci0JKlZSNDE4MV9NU1lTSU5UMlJFRyA9IDA7Ci0KLQkvKiBXZSBpbml0aWFsaXplIHRoZSBsZXZlbCAyIElDVSByZWdpc3RlcnMgdG8gYWxsIGJpdHMgZGlzYWJsZWQuICovCi0JKlZSNDE4MV9NUElVSU5UUkVHID0gMDsKLQkqVlI0MTgxX01BSVVJTlRSRUcgPSAwOwotCSpWUjQxODFfTUtJVUlOVFJFRyA9IDA7Ci0KLQkvKiBkaXNhYmxlIGFsbCBHUElPIGludHJzICovCi0JKlZSNDE4MV9HUElOVE1TSyA9IDB4ZmZmZjsKLQotCS8qIHZlY3RvciBoYW5kbGVyLiAgV2hhdCB0aGVzZSBkbyBpcyByZWdpc3RlciB0aGUgSVJRIGFzIG5vbi1zaGFyYWJsZSAqLwotCXNldHVwX2lycShWUjQxODFfSVJRX0lOVDAsICZjYXNjYWRlKTsKLQlzZXR1cF9pcnEoVlI0MTgxX0lSUV9HSVUsICZjYXNjYWRlKTsKLQotCS8qCi0JICogUlRDIGludGVycnVwdHMgYXJlIGludGVyZXN0aW5nLiAgVGhleSBoYXZlIHR3byBkZXN0aW5hdGlvbnMuCi0JICogT25lIGlzIGF0IHN5cyBpcnEgY29udHJvbGxlciwgYW5kIHRoZSBvdGhlciBpcyBhdCBDUFUgSVAzIGFuZCBJUDQuCi0JICogUlRDIHRpbWVyIGlzIHVzZWQgYXMgc3lzdGVtIHRpbWVyLgotCSAqIFdlIGVuYWJsZSB0aGVtIGhlcmUsIGJ1dCB0aW1lciByb3V0aW5lIHdpbGwgcmVnaXN0ZXIgbGF0ZXIKLQkgKiB3aXRoIENQVSBJUDMvSVA0LgotCSAqLwotCXNldHVwX2lycShWUjQxODFfSVJRX1JUQ0wxLCAmcmVzZXJ2ZWQpOwotCXNldHVwX2lycShWUjQxODFfSVJRX1JUQ0wyLCAmcmVzZXJ2ZWQpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDE4MS9jb21tb24vc2VyaWFsLmMgYi9hcmNoL21pcHMvdnI0MTgxL2NvbW1vbi9zZXJpYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2MmM2Mi4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvdnI0MTgxL2NvbW1vbi9zZXJpYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjogSnVuIFN1biwganN1bkBtdmlzdGEuY29tIG9yIGpzdW5AanVuc3VuLm5ldAotICoKLSAqIGFyY2gvbWlwcy92cjQxODEvY29tbW9uL3NlcmlhbC5jCi0gKiAgICAgaW5pdGlhbGl6ZSBzZXJpYWwgcG9ydCBvbiB2cjQxODEuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCWl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YJdGhlIEdOVSBHZW5lcmFsCSBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLS8qCi0gKiBbanN1biwgMDEwOTI1XQotICogWW91IG5lZWQgdG8gbWFrZSBzdXJlIHJzX3RhYmxlIGhhcyBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbgotICogZHJpdmVycy9jaGFyL3NlcmlhbC5jIGZpbGUuCVRoZXJlIGlzIG5vIGdvb2Qgd2F5IHRvIGRvIGl0IHJpZ2h0Ci0gKiBub3cuCSBBIHdvcmthcm91bmQgaXMgdG8gaW5jbHVkZSBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMgaW4geW91cgotICogY29uZmlndXJlIGZpbGUsIHdoaWNoIHdvdWxkIGdpdmVzIHlvdSA2NCBwb3J0cyBhbmQgd2FzdGVzIDExSyByYW0uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotCi0jaW5jbHVkZSA8YXNtL3ZyNDE4MS92cjQxODEuaD4KLQotdm9pZCBfX2luaXQgdnI0MTgxX2luaXRfc2VyaWFsKHZvaWQpCi17Ci0Jc3RydWN0IHNlcmlhbF9zdHJ1Y3QgczsKLQotCS8qIHR1cm4gb24gVUFSVCBjbG9jayAqLwotCSpWUjQxODFfQ01VQ0xLTVNLIHw9IFZSNDE4MV9DTVVDTEtNU0tfTVNLU0lVOwotCi0JLyogY2xlYXIgbWVtb3J5ICovCi0JbWVtc2V0KCZzLCAwLCBzaXplb2YocykpOwotCi0Jcy5saW5lID0gMDsJCQkvKiB3ZSBzZXQgdGhlIGZpcnN0IG9uZSAqLwotCXMuYmF1ZF9iYXNlID0gMTE1MjAwMDsKLQlzLmlycSA9IFZSNDE4MV9JUlFfU0lVOwotCXMuZmxhZ3MgPSBBU1lOQ19CT09UX0FVVE9DT05GIHwgQVNZTkNfU0tJUF9URVNUOyAvKiBTVERfQ09NX0ZMQUdTICovCi0Jcy5pb21lbV9iYXNlID0gKHU4KilWUjQxODFfU0lVUkI7Ci0Jcy5pb21lbV9yZWdfc2hpZnQgPSAwOwotCXMuaW9fdHlwZSA9IFNFUklBTF9JT19NRU07Ci0JaWYgKGVhcmx5X3NlcmlhbF9zZXR1cCgmcykgIT0gMCkgewotCQlwYW5pYygidnI0MTgxX2luaXRfc2VyaWFsKCkgZmFpbGVkISIpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDE4MS9jb21tb24vdGltZS5jIGIvYXJjaC9taXBzL3ZyNDE4MS9jb21tb24vdGltZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzgxNDA3Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy92cjQxODEvY29tbW9uL3RpbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IGpzdW5AbXZpc3RhLmNvbSBvciBqc3VuQGp1bnN1bi5uZXQKLSAqCi0gKiBydGMgYW5kIHRpbWUgb3BzIGZvciB2cjQxODEuCSBQYXJ0IG9mIGNvZGUgaXMgZHJpdmVkIGZyb20KLSAqIGxpbnV4LXZyLCBvcmlnaW5hbGx5IHdyaXR0ZW4JIGJ5IEJyYWRsZXkgRC4gTGFSb25kZSAmIE1pY2hhZWwgS2xhci4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZgl0aGUgR05VIEdlbmVyYWwJIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4JCQkvKiBmb3IgSFogKi8KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLQotI2luY2x1ZGUgPGFzbS92cjQxODEvdnI0MTgxLmg+Ci0KLSNkZWZpbmUgQ09VTlRTX1BFUl9KSUZGWSAoKDMyNzY4ICsgSFovMikgLyBIWikKLQotLyoKLSAqIFJUQyBvcHMKLSAqLwotCi1ERUZJTkVfU1BJTkxPQ0socnRjX2xvY2spOwotCi0vKiBwZXIgVlI0MXh4IGRvY3MsIGJhZCBkYXRhIGNhbiBiZSByZWFkIGlmIGJldHdlZW4gMiBjb3VudHMgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQKLXJlYWRfdGltZV9yZWcodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnJlZykKLXsKLQl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKLQlkbyB7Ci0JCXZhbHVlID0gKnJlZzsKLQkJYmFycmllcigpOwotCX0gd2hpbGUgKHZhbHVlICE9ICpyZWcpOwotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXZyNDE4MV9ydGNfZ2V0X3RpbWUodm9pZCkKLXsKLQl1bnNpZ25lZCBzaG9ydCByZWdoLCByZWdtLCByZWdsOwotCi0JLy8gd2h5IHRoaXMgY3Jhenkgb3JkZXIsIHlvdSBhc2s/ICB0byBndWFyYW50ZWUgdGhhdCBuZWl0aGVyIG0KLQkvLyBub3IgbCB3cmFwIGJlZm9yZSBhbGwgMyByZWFkCi0JZG8gewotCQlyZWdtID0gcmVhZF90aW1lX3JlZyhWUjQxODFfRVRJTUVNUkVHKTsKLQkJYmFycmllcigpOwotCQlyZWdoID0gcmVhZF90aW1lX3JlZyhWUjQxODFfRVRJTUVIUkVHKTsKLQkJYmFycmllcigpOwotCQlyZWdsID0gcmVhZF90aW1lX3JlZyhWUjQxODFfRVRJTUVMUkVHKTsKLQl9IHdoaWxlIChyZWdtICE9IHJlYWRfdGltZV9yZWcoVlI0MTgxX0VUSU1FTVJFRykpOwotCXJldHVybiAoKHJlZ2ggPDwgMTcpIHwgKHJlZ20gPDwgMSkgfCAocmVnbCA+PiAxNSkpOwotfQotCi1zdGF0aWMgaW50Ci12cjQxODFfcnRjX3NldF90aW1lKHVuc2lnbmVkIGxvbmcgdGltZXZhbCkKLXsKLQl1bnNpZ25lZCBzaG9ydCBpbnRyZWc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOwotCWludHJlZyA9ICpWUjQxODFfUlRDSU5UUkVHICYgMHgwNTsKLQliYXJyaWVyKCk7Ci0JKlZSNDE4MV9FVElNRUxSRUcgPSB0aW1ldmFsIDw8IDE1OwotCSpWUjQxODFfRVRJTUVNUkVHID0gdGltZXZhbCA+PiAxOwotCSpWUjQxODFfRVRJTUVIUkVHID0gdGltZXZhbCA+PiAxNzsKLQliYXJyaWVyKCk7Ci0JLy8gYXNzdW1lIHRoYXQgYW55IGludHMgdGhhdCBqdXN0IHRyaWdnZXJlZCBhcmUgaW52YWxpZCwgc2luY2UgdGhlCi0JLy8gdGltZSB2YWx1ZSBpcyB3cml0dGVuIG5vbi1hdG9taWNhbGx5IGluIDMgc2VwYXJhdGUgcmVncwotCSpWUjQxODFfUlRDSU5UUkVHID0gMHgwNSBeIGludHJlZzsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIHRpbWVyIGludGVycnVwdCByb3V0aW5lICh3cmFwcGVyKQotICoKLSAqIHdlIG5lZWQgb3VyIG93biBpbnRlcnJ1cHQgcm91dGluZSBiZWNhdXNlIHdlIG5lZWQgdG8gY2xlYXIKLSAqIFJUQzEgaW50ZXJydXB0LgotICovCi1zdGF0aWMgdm9pZAotdnI0MTgxX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQuICovCi0JKlZSNDE4MV9SVENJTlRSRUcgPSAweDI7Ci0KLQkvKiBjYWxsIHRoZSBnZW5lcmljIG9uZSAqLwotCXRpbWVyX2ludGVycnVwdChpcnEsIGRldl9pZCwgcmVncyk7Ci19Ci0KLQotLyoKLSAqIHZyNDE4MV90aW1lX2luaXQ6Ci0gKgotICogV2UgcGljayB0aGUgZm9sbG93aW5nIGNob2ljZXM6Ci0gKiAgIC4gd2UgdXNlIGVsYXBzZWQgdGltZXIgYXMgdGhlIFJUQy4JIFdlIHNldCBzb21lIHJlYXNvbmFibGUgaW5pdCBkYXRhIHNpbmNlCi0gKiAgICAgaXQgZG9lcyBub3QgcGVyc2lzdCBhY3Jvc3MgcmVzZXQKLSAqICAgLiB3ZSB1c2UgUlRDMSBhcyB0aGUgc3lzdGVtIHRpbWVyIGludGVycnVwdCBzb3VyY2UuCi0gKiAgIC4gd2UgdXNlIENQVSBjb3VudGVyIGZvciBmYXN0X2dldHRpbWVvZmZzZXQgYW5kIHdlIGNhbGl2cmF0ZSB0aGUgY3B1Ci0gKiAgICAgZnJlcXVlbmN5LiAgSW4gb3RoZXIgd29yZHMsIHdlIHVzZSBjYWxpYnJhdGVfZGl2NjRfZ2V0dGltZW9mZnNldCgpLgotICogICAuIHdlIHVzZSBvdXIgb3duIHRpbWVyIGludGVycnVwdCByb3V0aW5lIHdoaWNoIGNsZWFycyB0aGUgaW50ZXJydXB0Ci0gKiAgICAgYW5kIHRoZW4gY2FsbHMgdGhlIGdlbmVyaWMgaGlnaC1sZXZlbCB0aW1lciBpbnRlcnJ1cHQgcm91dGluZS4KLSAqCi0gKi8KLQotZXh0ZXJuIGludCBzZXR1cF9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWFjdGlvbiAqaXJxYWN0aW9uKTsKLQotc3RhdGljIHZvaWQKLXZyNDE4MV90aW1lcl9zZXR1cChzdHJ1Y3QgaXJxYWN0aW9uICppcnEpCi17Ci0JLyogb3Zlci13cml0ZSB0aGUgaGFuZGxlciB0byBiZSBvdXIgb3duIG9uZSAqLwotCWlycS0+aGFuZGxlciA9IHZyNDE4MV90aW1lcl9pbnRlcnJ1cHQ7Ci0KLQkvKiBzZXRzIHVwIHRoZSBmcmVxdWVuY3kgKi8KLQkqVlI0MTgxX1JUQ0wxTFJFRyA9IENPVU5UU19QRVJfSklGRlk7Ci0JKlZSNDE4MV9SVENMMUhSRUcgPSAwOwotCi0JLyogYW5kIGFjayBhbnkgcGVuZGluZyBpbnRzICovCi0JKlZSNDE4MV9SVENJTlRSRUcgPSAweDI7Ci0KLQkvKiBzZXR1cCBpcnFhY3Rpb24gKi8KLQlzZXR1cF9pcnEoVlI0MTgxX0lSUV9JTlQxLCBpcnEpOwotCi19Ci0KLXZvaWQKLXZyNDE4MV9pbml0X3RpbWUodm9pZCkKLXsKLQkvKiBzZXR1cCBob29rdXAgZnVuY3Rpb25zICovCi0JcnRjX2dldF90aW1lID0gdnI0MTgxX3J0Y19nZXRfdGltZTsKLQlydGNfc2V0X3RpbWUgPSB2cjQxODFfcnRjX3NldF90aW1lOwotCi0JYm9hcmRfdGltZXJfc2V0dXAgPSB2cjQxODFfdGltZXJfc2V0dXA7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxODEvb3NwcmV5L01ha2VmaWxlIGIvYXJjaC9taXBzL3ZyNDE4MS9vc3ByZXkvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YmUwNTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3ZyNDE4MS9vc3ByZXkvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGNvbW1vbiBjb2RlIG9mIE5FQyBPc3ByZXkgYm9hcmQKLSMKLQotb2JqLXkJIDo9IHNldHVwLm8gcHJvbS5vIHJlc2V0Lm8KLQotb2JqLSQoQ09ORklHX0tHREIpCSs9IGRiZ19pby5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MTgxL29zcHJleS9kYmdfaW8uYyBiL2FyY2gvbWlwcy92cjQxODEvb3NwcmV5L2RiZ19pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZThhODQwLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy92cjQxODEvb3NwcmV5L2RiZ19pby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBrZ2RiIGlvIGZ1bmN0aW9ucyBmb3Igb3NwcmV5LiAgV2UgdXNlIHRoZSBzZXJpYWwgcG9ydCBvbiBkZWJ1ZyBib2FyZC4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IGpzdW5AbXZpc3RhLmNvbSBvciBqc3VuQGp1bnN1bi5uZXQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PSBDT05GSUcgPT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLS8qIFtqc3VuXSB3ZSB1c2UgdGhlIHNlY29uZCBzZXJpYWwgcG9ydCBmb3Iga2RiICovCi0jZGVmaW5lICAgICAgICAgQkFTRSAgICAgICAgICAgICAgICAgICAgMHhiN2ZmZmZmMAotI2RlZmluZSAgICAgICAgIE1BWF9CQVVEICAgICAgICAgICAgICAgIDExNTIwMAotCi0vKiBkaXN0YW5jZSBpbiBieXRlcyBiZXR3ZWVuIHR3byBzZXJpYWwgcmVnaXN0ZXJzICovCi0jZGVmaW5lICAgICAgICAgUkVHX09GRlNFVCAgICAgICAgICAgICAgMQotCi0vKgotICogMCAtIGtnZGIgZG9lcyBzZXJpYWwgaW5pdAotICogMSAtIGtnZGIgc2tpcCBzZXJpYWwgaW5pdAotICovCi1zdGF0aWMgaW50IHJlbW90ZURlYnVnSW5pdGlhbGl6ZWQgPSAxOwotCi0vKgotICogdGhlIGRlZmF1bHQgYmF1ZCByYXRlICppZioga2dkYiBkb2VzIHNlcmlhbCBpbml0Ci0gKi8KLSNkZWZpbmUJCUJBVURfREVGQVVMVAkJVUFSVDE2NTUwX0JBVURfMzg0MDAKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT0gRU5EIE9GIENPTkZJRyA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyOwotCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfMjQwMCAgICAgICAgICAgICAyNDAwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfNDgwMCAgICAgICAgICAgICA0ODAwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfOTYwMCAgICAgICAgICAgICA5NjAwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfMTkyMDAgICAgICAgICAgICAxOTIwMAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9CQVVEXzM4NDAwICAgICAgICAgICAgMzg0MDAKLSNkZWZpbmUgICAgICAgICBVQVJUMTY1NTBfQkFVRF81NzYwMCAgICAgICAgICAgIDU3NjAwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfMTE1MjAwICAgICAgICAgICAxMTUyMDAKLQotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfTk9ORSAgICAgICAgICAgMAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfT0REICAgICAgICAgICAgMHgwOAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfRVZFTiAgICAgICAgICAgMHgxOAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfTUFSSyAgICAgICAgICAgMHgyOAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfU1BBQ0UgICAgICAgICAgMHgzOAotCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0RBVEFfNUJJVCAgICAgICAgICAgICAweDAKLSNkZWZpbmUgICAgICAgICBVQVJUMTY1NTBfREFUQV82QklUICAgICAgICAgICAgIDB4MQotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9EQVRBXzdCSVQgICAgICAgICAgICAgMHgyCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0RBVEFfOEJJVCAgICAgICAgICAgICAweDMKLQotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9TVE9QXzFCSVQgICAgICAgICAgICAgMHgwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX1NUT1BfMkJJVCAgICAgICAgICAgICAweDQKLQotLyogcmVnaXN0ZXIgb2Zmc2V0ICovCi0jZGVmaW5lICAgICAgICAgT0ZTX1JDVl9CVUZGRVIgICAgICAgICAgMAotI2RlZmluZSAgICAgICAgIE9GU19UUkFOU19IT0xEICAgICAgICAgIDAKLSNkZWZpbmUgICAgICAgICBPRlNfU0VORF9CVUZGRVIgICAgICAgICAwCi0jZGVmaW5lICAgICAgICAgT0ZTX0lOVFJfRU5BQkxFICAgICAgICAgKDEqUkVHX09GRlNFVCkKLSNkZWZpbmUgICAgICAgICBPRlNfSU5UUl9JRCAgICAgICAgICAgICAoMipSRUdfT0ZGU0VUKQotI2RlZmluZSAgICAgICAgIE9GU19EQVRBX0ZPUk1BVCAgICAgICAgICgzKlJFR19PRkZTRVQpCi0jZGVmaW5lICAgICAgICAgT0ZTX0xJTkVfQ09OVFJPTCAgICAgICAgKDMqUkVHX09GRlNFVCkKLSNkZWZpbmUgICAgICAgICBPRlNfTU9ERU1fQ09OVFJPTCAgICAgICAoNCpSRUdfT0ZGU0VUKQotI2RlZmluZSAgICAgICAgIE9GU19SUzIzMl9PVVRQVVQgICAgICAgICg0KlJFR19PRkZTRVQpCi0jZGVmaW5lICAgICAgICAgT0ZTX0xJTkVfU1RBVFVTICAgICAgICAgKDUqUkVHX09GRlNFVCkKLSNkZWZpbmUgICAgICAgICBPRlNfTU9ERU1fU1RBVFVTICAgICAgICAoNipSRUdfT0ZGU0VUKQotI2RlZmluZSAgICAgICAgIE9GU19SUzIzMl9JTlBVVCAgICAgICAgICg2KlJFR19PRkZTRVQpCi0jZGVmaW5lICAgICAgICAgT0ZTX1NDUkFUQ0hfUEFEICAgICAgICAgKDcqUkVHX09GRlNFVCkKLQotI2RlZmluZSAgICAgICAgIE9GU19ESVZJU09SX0xTQiAgICAgICAgICgwKlJFR19PRkZTRVQpCi0jZGVmaW5lICAgICAgICAgT0ZTX0RJVklTT1JfTVNCICAgICAgICAgKDEqUkVHX09GRlNFVCkKLQotCi0vKiBtZW1vcnktbWFwcGVkIHJlYWQvd3JpdGUgb2YgdGhlIHBvcnQgKi8KLSNkZWZpbmUgICAgICAgICBVQVJUMTY1NTBfUkVBRCh5KSAgICAoKigodm9sYXRpbGUgdWludDgqKShCQVNFICsgeSkpKQotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9XUklURSh5LCB6KSAgKCgqKCh2b2xhdGlsZSB1aW50OCopKEJBU0UgKyB5KSkpID0geikKLQotdm9pZCBkZWJ1Z0luaXQodWludDMyIGJhdWQsIHVpbnQ4IGRhdGEsIHVpbnQ4IHBhcml0eSwgdWludDggc3RvcCkKLXsKLSAgICAgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0gICAgICAgIFVBUlQxNjU1MF9XUklURShPRlNfSU5UUl9FTkFCTEUsIDApOwotCi0gICAgICAgIC8qIHNldCB1cCBidWFkIHJhdGUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgICAgIHVpbnQzMiBkaXZpc29yOwotCi0gICAgICAgICAgICAgICAgLyogc2V0IERJQUIgYml0ICovCi0gICAgICAgICAgICAgICAgVUFSVDE2NTUwX1dSSVRFKE9GU19MSU5FX0NPTlRST0wsIDB4ODApOwotCi0gICAgICAgICAgICAgICAgLyogc2V0IGRpdmlzb3IgKi8KLSAgICAgICAgICAgICAgICBkaXZpc29yID0gTUFYX0JBVUQgLyBiYXVkOwotICAgICAgICAgICAgICAgIFVBUlQxNjU1MF9XUklURShPRlNfRElWSVNPUl9MU0IsIGRpdmlzb3IgJiAweGZmKTsKLSAgICAgICAgICAgICAgICBVQVJUMTY1NTBfV1JJVEUoT0ZTX0RJVklTT1JfTVNCLCAoZGl2aXNvciAmIDB4ZmYwMCkgPj4gOCk7Ci0KLSAgICAgICAgICAgICAgICAvKiBjbGVhciBESUFCIGJpdCAqLwotICAgICAgICAgICAgICAgIFVBUlQxNjU1MF9XUklURShPRlNfTElORV9DT05UUk9MLCAweDApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogc2V0IGRhdGEgZm9ybWF0ICovCi0gICAgICAgIFVBUlQxNjU1MF9XUklURShPRlNfREFUQV9GT1JNQVQsIGRhdGEgfCBwYXJpdHkgfCBzdG9wKTsKLX0KLQotCi11aW50OCBnZXREZWJ1Z0NoYXIodm9pZCkKLXsKLSAgICAgICAgaWYgKCFyZW1vdGVEZWJ1Z0luaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3RlRGVidWdJbml0aWFsaXplZCA9IDE7Ci0gICAgICAgICAgICAgICAgZGVidWdJbml0KEJBVURfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVDE2NTUwX0RBVEFfOEJJVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVDE2NTUwX1BBUklUWV9OT05FLCBVQVJUMTY1NTBfU1RPUF8xQklUKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICgoVUFSVDE2NTUwX1JFQUQoT0ZTX0xJTkVfU1RBVFVTKSAmIDB4MSkgPT0gMCk7Ci0gICAgICAgIHJldHVybiBVQVJUMTY1NTBfUkVBRChPRlNfUkNWX0JVRkZFUik7Ci19Ci0KLQotaW50IHB1dERlYnVnQ2hhcih1aW50OCBieXRlKQotewotICAgICAgICBpZiAoIXJlbW90ZURlYnVnSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgICAgICByZW1vdGVEZWJ1Z0luaXRpYWxpemVkID0gMTsKLSAgICAgICAgICAgICAgICBkZWJ1Z0luaXQoQkFVRF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUMTY1NTBfREFUQV84QklULAotICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUMTY1NTBfUEFSSVRZX05PTkUsIFVBUlQxNjU1MF9TVE9QXzFCSVQpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKChVQVJUMTY1NTBfUkVBRChPRlNfTElORV9TVEFUVVMpICYgMHgyMCkgPT0gMCk7Ci0gICAgICAgIFVBUlQxNjU1MF9XUklURShPRlNfU0VORF9CVUZGRVIsIGJ5dGUpOwotICAgICAgICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxODEvb3NwcmV5L3Byb20uYyBiL2FyY2gvbWlwcy92cjQxODEvb3NwcmV5L3Byb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwZDE0NS4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvdnI0MTgxL29zcHJleS9wcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IGpzdW5AbXZpc3RhLmNvbSBvciBqc3VuQGp1bnN1bi5uZXQKLSAqCi0gKiBhcmNoL21pcHMvdnI0MTgxL29zcHJleS9wcm9tLmMKLSAqICAgICBwcm9tIGNvZGUgZm9yIG9zcHJleS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZgl0aGUgR05VIEdlbmVyYWwJIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIk5FQ19WcjQxeHggT3NwcmV5IjsKLX0KLQotLyoKLSAqIFtqc3VuXSByaWdodCBub3cgd2UgYXNzdW1lIGl0IGlzIHRoZSBuZWMgZGVidWcgbW9uaXRvciwgd2hpY2ggZG9lcwotICogbm90IHBhc3MgYW55IGFyZ3VtZW50cy4KLSAqLwotdm9pZCBfX2luaXQgcHJvbV9pbml0KHZvaWQpCi17Ci0JLy8gY21kbGluZSBpcyBub3cgc2V0IGluIGRlZmF1bHQgY29uZmlnCi0JLy8gc3RyY3B5KGFyY3NfY21kbGluZSwgImlwPWJvb3RwICIpOwotCS8vIHN0cmNhdChhcmNzX2NtZGxpbmUsICJldGhlcj00NiwweDAzZmUwMzAwLGV0aDAgIik7Ci0JLy8gc3RyY3B5KGFyY3NfY21kbGluZSwgImV0aGVyPTAsMHgwMzAwLGV0aDAgIgotCS8vIHN0cmNhdChhcmNzX2NtZGxpbmUsICJ2aWRlbz12cjQxODFmYjp4cmVzOjI0MCx5cmVzOjMyMCxicHA6OCAiKTsKLQotCW1pcHNfbWFjaGdyb3VwID0gTUFDSF9HUk9VUF9ORUNfVlI0MVhYOwotCW1pcHNfbWFjaHR5cGUgPSBNQUNIX05FQ19PU1BSRVk7Ci0KLQkvKiAxNk1CIGZpeGVkICovCi0JYWRkX21lbW9yeV9yZWdpb24oMCwgMTYgPDwgMjAsIEJPT1RfTUVNX1JBTSk7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgX19pbml0IHByb21fZnJlZV9wcm9tX21lbW9yeSh2b2lkKQotewotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDE4MS9vc3ByZXkvcmVzZXQuYyBiL2FyY2gvbWlwcy92cjQxODEvb3NwcmV5L3Jlc2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNmFlODMuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3ZyNDE4MS9vc3ByZXkvcmVzZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZgl0aGUgR05VIEdlbmVyYWwJIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDEgUmFsZiBCYWVjaGxlCi0gKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjoganN1bkBtdmlzdGEuY29tIG9yIGpzdW5AanVuc3VuLm5ldAotICovCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0KLXZvaWQgbmVjX29zcHJleV9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpCi17Ci0Jc2V0X2MwX3N0YXR1cyhTVDBfRVJMKTsKLQljaGFuZ2VfYzBfY29uZmlnKENPTkZfQ01fQ01BU0ssIENPTkZfQ01fVU5DQUNIRUQpOwotCWZsdXNoX2NhY2hlX2FsbCgpOwotCXdyaXRlX2MwX3dpcmVkKDApOwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJqclx0JTAiOjoiciIoMHhiZmMwMDAwMCkpOwotfQotCi12b2lkIG5lY19vc3ByZXlfaGFsdCh2b2lkKQotewotCXByaW50ayhLRVJOX05PVElDRSAiXG4qKiBZb3UgY2FuIHNhZmVseSB0dXJuIG9mZiB0aGUgcG93ZXJcbiIpOwotCXdoaWxlICgxKQotCQlfX2FzbV9fKCIuc2V0XHRtaXBzM1xuXHQiCi0JCQkid2FpdFxuXHQiCi0JCQkiLnNldFx0bWlwczAiKTsKLX0KLQotdm9pZCBuZWNfb3NwcmV5X3Bvd2VyX29mZih2b2lkKQotewotCW5lY19vc3ByZXlfaGFsdCgpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDE4MS9vc3ByZXkvc2V0dXAuYyBiL2FyY2gvbWlwcy92cjQxODEvb3NwcmV5L3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZjcxNDAuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3ZyNDE4MS9vc3ByZXkvc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL21pcHMvdnI0MTgxL3NldHVwLmMKLSAqCi0gKiBWUjQxeHggc2V0dXAgcm91dGluZXMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgQnJhZGxleSBELiBMYVJvbmRlCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgTWljaGFlbCBLbGFyCi0gKgotICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IGpzdW5AbXZpc3RhLmNvbSBvciBqc3VuQGp1bnN1bi5uZXQKLSAqIENvcHlyaWdodCAoQykgMjAwNSBSYWxmIEJhZWNobGUgKHJhbGZAbGludXgtbWlwcy5vcmcpCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pZGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vcmVib290Lmg+Ci0jaW5jbHVkZSA8YXNtL3ZyNDE4MS92cjQxODEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotCi1leHRlcm4gdm9pZCBuZWNfb3NwcmV5X3Jlc3RhcnQoY2hhciogYyk7Ci1leHRlcm4gdm9pZCBuZWNfb3NwcmV5X2hhbHQodm9pZCk7Ci1leHRlcm4gdm9pZCBuZWNfb3NwcmV5X3Bvd2VyX29mZih2b2lkKTsKLQotZXh0ZXJuIHZvaWQgdnI0MTgxX2luaXRfc2VyaWFsKHZvaWQpOwotZXh0ZXJuIHZvaWQgdnI0MTgxX2luaXRfdGltZSh2b2lkKTsKLQotc3RhdGljIHZvaWQgX19pbml0IG5lY19vc3ByZXlfc2V0dXAodm9pZCkKLXsKLQlzZXRfaW9fcG9ydF9iYXNlKFZSNDE4MV9QT1JUX0JBU0UpOwotCWlzYV9zbG90X29mZnNldCA9IFZSNDE4MV9JU0FNRU1fQkFTRTsKLQotCXZyNDE4MV9pbml0X3NlcmlhbCgpOwotCXZyNDE4MV9pbml0X3RpbWUoKTsKLQotCV9tYWNoaW5lX3Jlc3RhcnQgPSBuZWNfb3NwcmV5X3Jlc3RhcnQ7Ci0JX21hY2hpbmVfaGFsdCA9IG5lY19vc3ByZXlfaGFsdDsKLQlfbWFjaGluZV9wb3dlcl9vZmYgPSBuZWNfb3NwcmV5X3Bvd2VyX29mZjsKLQotCS8qIHNldHVwIHJlc291cmNlIGxpbWl0ICovCi0JaW9wb3J0X3Jlc291cmNlLmVuZCA9IDB4ZmZmZmZmZmY7Ci0JaW9tZW1fcmVzb3VyY2UuZW5kID0gMHhmZmZmZmZmZjsKLQotCS8qIFtqc3VuXSBoYWNrICovCi0JLyoKLQlwcmludGsoIltqc3VuXSBoYWNrIHRvIGNoYW5nZSBleHRlcm5hbCBJU0EgY29udHJvbCByZWdpc3RlciwgJXggLT4gJXhcbiIsCi0JCSgqVlI0MTgxX1hJU0FDVEwpLAotCQkoKlZSNDE4MV9YSVNBQ1RMKSB8IDB4Mik7Ci0JKlZSNDE4MV9YSVNBQ1RMIHw9IDB4MjsKLQkqLwotCi0JLy8gKlZSNDE4MV9HUEhJQlNUSCA9IDB4MjAwMDsKLQkvLyAqVlI0MTgxX0dQTUQwUkVHID0gMHgwMGMwOwotCS8vICpWUjQxODFfR1BJTlRFTgkgPSAxPDw2OwotCi0JLyogW2pzdW5dIEkgYmVsaWV2ZSB0aGlzIHdpbGwgZ2V0IHRoZSBpbnRlcnJ1cHQgdHlwZSByaWdodAotCSAqIGZvciB0aGUgZXRoZXIgcG9ydC4KLQkgKi8KLQkqVlI0MTgxX0dQSU5UVFlQTCA9IDB4MzAwMDsKLX0KLQotZWFybHlfaW5pdGNhbGwobmVjX29zcHJleV9zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L2Nhc2lvLWU1NS9zZXR1cC5jIGIvYXJjaC9taXBzL3ZyNDF4eC9jYXNpby1lNTUvc2V0dXAuYwppbmRleCBhYTg2MDVhLi5kMjkyMDFhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdnI0MXh4L2Nhc2lvLWU1NS9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvY2FzaW8tZTU1L3NldHVwLmMKQEAgLTIzLDExICsyMyw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3ZyNDF4eC9lNTUuaD4KIAotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJDQVNJTyBDQVNTSU9QRUlBIEUtMTEvMTUvNTUvNjUiOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBjYXNpb19lNTVfc2V0dXAodm9pZCkKIHsKIAlzZXRfaW9fcG9ydF9iYXNlKElPX1BPUlRfQkFTRSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9NYWtlZmlsZSBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL01ha2VmaWxlCmluZGV4IGZhOThlZjMuLjkwOTYzMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgY29tbW9uIGNvZGUgb2YgdGhlIE5FQyBWUjQxMDAgc2VyaWVzLgogIwogCi1vYmoteQkJCQkrPSBiY3UubyBjbXUubyBpY3UubyBpbml0Lm8gaW50LWhhbmRsZXIubyBwbXUubworb2JqLXkJCQkJKz0gYmN1Lm8gY211Lm8gaWN1Lm8gaW5pdC5vIGludC1oYW5kbGVyLm8gaXJxLm8gcG11Lm8gdHlwZS5vCiBvYmotJChDT05GSUdfVlJDNDE3MykJCSs9IHZyYzQxNzMubwogCiBFWFRSQV9BRkxBR1MgOj0gJChDRkxBR1MpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pY3UuYyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ljdS5jCmluZGV4IGM4NDI2NjEuLjBiNzNjNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ljdS5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ljdS5jCkBAIC0zLDggKzMsNyBAQAogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiAgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCiAgKiAgICBBdXRob3I6IFlvaWNoaSBZdWFzYSA8eXl1YXNhQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDA1IFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzEsNyArMzAsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CkBAIC0zOSwzNCArMzgsMjQgQEAKIAogI2luY2x1ZGUgPGFzbS9jcHUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lycV9jcHUuaD4KICNpbmNsdWRlIDxhc20vdnI0MXh4L3ZyNDF4eC5oPgogCi1leHRlcm4gYXNtbGlua2FnZSB2b2lkIHZyNDF4eF9oYW5kbGVfaW50ZXJydXB0KHZvaWQpOwotCi1leHRlcm4gdm9pZCBpbml0X3ZyNDF4eF9naXVpbnRfaXJxKHZvaWQpOwotZXh0ZXJuIHZvaWQgZ2l1aW50X2lycV9kaXNwYXRjaChzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0KLXN0YXRpYyB1aW50MzJfdCBpY3UxX2Jhc2U7Ci1zdGF0aWMgdWludDMyX3QgaWN1Ml9iYXNlOwotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpY3VfY2FzY2FkZSA9IHsKLQkuaGFuZGxlcgk9IG5vX2FjdGlvbiwKLQkubWFzawkJPSBDUFVfTUFTS19OT05FLAotCS5uYW1lCQk9ICJjYXNjYWRlIiwKLX07CitzdGF0aWMgdm9pZCBfX2lvbWVtICppY3UxX2Jhc2U7CitzdGF0aWMgdm9pZCBfX2lvbWVtICppY3UyX2Jhc2U7CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHN5c2ludDFfYXNzaWduWzE2XSA9IHsKIAkwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CiBzdGF0aWMgdW5zaWduZWQgY2hhciBzeXNpbnQyX2Fzc2lnblsxNl0gPSB7Ci0JMiwgMCwgMywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCTIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKIAotI2RlZmluZSBTWVNJTlQxUkVHX1RZUEUxCUtTRUcxQUREUigweDBiMDAwMDgwKQotI2RlZmluZSBTWVNJTlQyUkVHX1RZUEUxCUtTRUcxQUREUigweDBiMDAwMjAwKQorI2RlZmluZSBJQ1UxX1RZUEUxX0JBU0UJMHgwYjAwMDA4MFVMCisjZGVmaW5lIElDVTJfVFlQRTFfQkFTRQkweDBiMDAwMjAwVUwKIAotI2RlZmluZSBTWVNJTlQxUkVHX1RZUEUyCUtTRUcxQUREUigweDBmMDAwMDgwKQotI2RlZmluZSBTWVNJTlQyUkVHX1RZUEUyCUtTRUcxQUREUigweDBmMDAwMGEwKQorI2RlZmluZSBJQ1UxX1RZUEUyX0JBU0UJMHgwZjAwMDA4MFVMCisjZGVmaW5lIElDVTJfVFlQRTJfQkFTRQkweDBmMDAwMGEwVUwKKworI2RlZmluZSBJQ1UxX1NJWkUJMHgyMAorI2RlZmluZSBJQ1UyX1NJWkUJMHgxYwogCiAjZGVmaW5lIFNZU0lOVDFSRUcJMHgwMAogI2RlZmluZSBQSVVJTlRSRUcJMHgwMgpAQCAtMTA2LDYxICs5NSw2MSBAQAogI2RlZmluZSBTWVNJTlQxX0lSUV9UT19QSU4oeCkJKCh4KSAtIFNZU0lOVDFfSVJRX0JBU0UpCS8qIFBpbiAwLTE1ICovCiAjZGVmaW5lIFNZU0lOVDJfSVJRX1RPX1BJTih4KQkoKHgpIC0gU1lTSU5UMl9JUlFfQkFTRSkJLyogUGluIDAtMTUgKi8KIAotI2RlZmluZSByZWFkX2ljdTEob2Zmc2V0KQlyZWFkdyhpY3UxX2Jhc2UgKyAob2Zmc2V0KSkKLSNkZWZpbmUgd3JpdGVfaWN1MSh2YWwsIG9mZnNldCkJd3JpdGV3KCh2YWwpLCBpY3UxX2Jhc2UgKyAob2Zmc2V0KSkKKyNkZWZpbmUgSU5UX1RPX0lSUSh4KQkJKCh4KSArIDIpCS8qIEludDAtNCAtPiBJUlEyLTYgKi8KIAotI2RlZmluZSByZWFkX2ljdTIob2Zmc2V0KQlyZWFkdyhpY3UyX2Jhc2UgKyAob2Zmc2V0KSkKLSNkZWZpbmUgd3JpdGVfaWN1Mih2YWwsIG9mZnNldCkJd3JpdGV3KCh2YWwpLCBpY3UyX2Jhc2UgKyAob2Zmc2V0KSkKKyNkZWZpbmUgaWN1MV9yZWFkKG9mZnNldCkJCXJlYWR3KGljdTFfYmFzZSArIChvZmZzZXQpKQorI2RlZmluZSBpY3UxX3dyaXRlKG9mZnNldCwgdmFsdWUpCXdyaXRldygodmFsdWUpLCBpY3UxX2Jhc2UgKyAob2Zmc2V0KSkKKworI2RlZmluZSBpY3UyX3JlYWQob2Zmc2V0KQkJcmVhZHcoaWN1Ml9iYXNlICsgKG9mZnNldCkpCisjZGVmaW5lIGljdTJfd3JpdGUob2Zmc2V0LCB2YWx1ZSkJd3JpdGV3KCh2YWx1ZSksIGljdTJfYmFzZSArIChvZmZzZXQpKQogCiAjZGVmaW5lIElOVEFTU0lHTl9NQVgJNAogI2RlZmluZSBJTlRBU1NJR05fTUFTSwkweDAwMDcKIAotc3RhdGljIGlubGluZSB1aW50MTZfdCBzZXRfaWN1MSh1aW50OF90IG9mZnNldCwgdWludDE2X3Qgc2V0KQorc3RhdGljIGlubGluZSB1aW50MTZfdCBpY3UxX3NldCh1aW50OF90IG9mZnNldCwgdWludDE2X3Qgc2V0KQogewotCXVpbnQxNl90IHJlczsKKwl1aW50MTZfdCBkYXRhOwogCi0JcmVzID0gcmVhZF9pY3UxKG9mZnNldCk7Ci0JcmVzIHw9IHNldDsKLQl3cml0ZV9pY3UxKHJlcywgb2Zmc2V0KTsKKwlkYXRhID0gaWN1MV9yZWFkKG9mZnNldCk7CisJZGF0YSB8PSBzZXQ7CisJaWN1MV93cml0ZShvZmZzZXQsIGRhdGEpOwogCi0JcmV0dXJuIHJlczsKKwlyZXR1cm4gZGF0YTsKIH0KIAotc3RhdGljIGlubGluZSB1aW50MTZfdCBjbGVhcl9pY3UxKHVpbnQ4X3Qgb2Zmc2V0LCB1aW50MTZfdCBjbGVhcikKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgaWN1MV9jbGVhcih1aW50OF90IG9mZnNldCwgdWludDE2X3QgY2xlYXIpCiB7Ci0JdWludDE2X3QgcmVzOworCXVpbnQxNl90IGRhdGE7CiAKLQlyZXMgPSByZWFkX2ljdTEob2Zmc2V0KTsKLQlyZXMgJj0gfmNsZWFyOwotCXdyaXRlX2ljdTEocmVzLCBvZmZzZXQpOworCWRhdGEgPSBpY3UxX3JlYWQob2Zmc2V0KTsKKwlkYXRhICY9IH5jbGVhcjsKKwlpY3UxX3dyaXRlKG9mZnNldCwgZGF0YSk7CiAKLQlyZXR1cm4gcmVzOworCXJldHVybiBkYXRhOwogfQogCi1zdGF0aWMgaW5saW5lIHVpbnQxNl90IHNldF9pY3UyKHVpbnQ4X3Qgb2Zmc2V0LCB1aW50MTZfdCBzZXQpCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGljdTJfc2V0KHVpbnQ4X3Qgb2Zmc2V0LCB1aW50MTZfdCBzZXQpCiB7Ci0JdWludDE2X3QgcmVzOworCXVpbnQxNl90IGRhdGE7CiAKLQlyZXMgPSByZWFkX2ljdTIob2Zmc2V0KTsKLQlyZXMgfD0gc2V0OwotCXdyaXRlX2ljdTIocmVzLCBvZmZzZXQpOworCWRhdGEgPSBpY3UyX3JlYWQob2Zmc2V0KTsKKwlkYXRhIHw9IHNldDsKKwlpY3UyX3dyaXRlKG9mZnNldCwgZGF0YSk7CiAKLQlyZXR1cm4gcmVzOworCXJldHVybiBkYXRhOwogfQogCi1zdGF0aWMgaW5saW5lIHVpbnQxNl90IGNsZWFyX2ljdTIodWludDhfdCBvZmZzZXQsIHVpbnQxNl90IGNsZWFyKQorc3RhdGljIGlubGluZSB1aW50MTZfdCBpY3UyX2NsZWFyKHVpbnQ4X3Qgb2Zmc2V0LCB1aW50MTZfdCBjbGVhcikKIHsKLQl1aW50MTZfdCByZXM7CisJdWludDE2X3QgZGF0YTsKIAotCXJlcyA9IHJlYWRfaWN1MihvZmZzZXQpOwotCXJlcyAmPSB+Y2xlYXI7Ci0Jd3JpdGVfaWN1MihyZXMsIG9mZnNldCk7CisJZGF0YSA9IGljdTJfcmVhZChvZmZzZXQpOworCWRhdGEgJj0gfmNsZWFyOworCWljdTJfd3JpdGUob2Zmc2V0LCBkYXRhKTsKIAotCXJldHVybiByZXM7CisJcmV0dXJuIGRhdGE7CiB9CiAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCiB2b2lkIHZyNDF4eF9lbmFibGVfcGl1aW50KHVpbnQxNl90IG1hc2spCiB7CiAJaXJxX2Rlc2NfdCAqZGVzYyA9IGlycV9kZXNjICsgUElVX0lSUTsKQEAgLTE2OSw3ICsxNTgsNyBAQAogCWlmIChjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUgPT0gQ1BVX1ZSNDExMSB8fAogCSAgICBjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUgPT0gQ1BVX1ZSNDEyMSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotCQlzZXRfaWN1MShNUElVSU5UUkVHLCBtYXNrKTsKKwkJaWN1MV9zZXQoTVBJVUlOVFJFRywgbWFzayk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIAl9CiB9CkBAIC0xODQsNyArMTczLDcgQEAKIAlpZiAoY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9WUjQxMTEgfHwKIAkgICAgY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9WUjQxMjEpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKLQkJY2xlYXJfaWN1MShNUElVSU5UUkVHLCBtYXNrKTsKKwkJaWN1MV9jbGVhcihNUElVSU5UUkVHLCBtYXNrKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogCX0KIH0KQEAgLTE5OSw3ICsxODgsNyBAQAogCWlmIChjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUgPT0gQ1BVX1ZSNDExMSB8fAogCSAgICBjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUgPT0gQ1BVX1ZSNDEyMSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotCQlzZXRfaWN1MShNQUlVSU5UUkVHLCBtYXNrKTsKKwkJaWN1MV9zZXQoTUFJVUlOVFJFRywgbWFzayk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIAl9CiB9CkBAIC0yMTQsNyArMjAzLDcgQEAKIAlpZiAoY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9WUjQxMTEgfHwKIAkgICAgY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9WUjQxMjEpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKLQkJY2xlYXJfaWN1MShNQUlVSU5UUkVHLCBtYXNrKTsKKwkJaWN1MV9jbGVhcihNQUlVSU5UUkVHLCBtYXNrKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogCX0KIH0KQEAgLTIyOSw3ICsyMTgsNyBAQAogCWlmIChjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUgPT0gQ1BVX1ZSNDExMSB8fAogCSAgICBjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUgPT0gQ1BVX1ZSNDEyMSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotCQlzZXRfaWN1MShNS0lVSU5UUkVHLCBtYXNrKTsKKwkJaWN1MV9zZXQoTUtJVUlOVFJFRywgbWFzayk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIAl9CiB9CkBAIC0yNDQsNyArMjMzLDcgQEAKIAlpZiAoY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9WUjQxMTEgfHwKIAkgICAgY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9WUjQxMjEpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKLQkJY2xlYXJfaWN1MShNS0lVSU5UUkVHLCBtYXNrKTsKKwkJaWN1MV9jbGVhcihNS0lVSU5UUkVHLCBtYXNrKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogCX0KIH0KQEAgLTI1Nyw3ICsyNDYsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotCXNldF9pY3UxKE1EU0lVSU5UUkVHLCBtYXNrKTsKKwlpY3UxX3NldChNRFNJVUlOVFJFRywgbWFzayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC0yNjksNyArMjU4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKLQljbGVhcl9pY3UxKE1EU0lVSU5UUkVHLCBtYXNrKTsKKwlpY3UxX2NsZWFyKE1EU0lVSU5UUkVHLCBtYXNrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTI4MSw3ICsyNzAsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotCXNldF9pY3UyKE1GSVJJTlRSRUcsIG1hc2spOworCWljdTJfc2V0KE1GSVJJTlRSRUcsIG1hc2spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMjkzLDcgKzI4Miw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7Ci0JY2xlYXJfaWN1MihNRklSSU5UUkVHLCBtYXNrKTsKKwlpY3UyX2NsZWFyKE1GSVJJTlRSRUcsIG1hc2spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMzA4LDcgKzI5Nyw3IEBACiAJICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfVlI0MTMxIHx8CiAJICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfVlI0MTMzKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7Ci0JCXdyaXRlX2ljdTIoUENJSU5UMCwgTVBDSUlOVFJFRyk7CisJCWljdTJfd3JpdGUoTVBDSUlOVFJFRywgUENJSU5UMCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIAl9CiB9CkBAIC0zMjQsNyArMzEzLDcgQEAKIAkgICAgY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9WUjQxMzEgfHwKIAkgICAgY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9WUjQxMzMpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKLQkJd3JpdGVfaWN1MigwLCBNUENJSU5UUkVHKTsKKwkJaWN1Ml93cml0ZShNUENJSU5UUkVHLCAwKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogCX0KIH0KQEAgLTM0MCw3ICszMjksNyBAQAogCSAgICBjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUgPT0gQ1BVX1ZSNDEzMSB8fAogCSAgICBjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUgPT0gQ1BVX1ZSNDEzMykgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotCQl3cml0ZV9pY3UyKFNDVUlOVDAsIE1TQ1VJTlRSRUcpOworCQlpY3UyX3dyaXRlKE1TQ1VJTlRSRUcsIFNDVUlOVDApOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7CiAJfQogfQpAQCAtMzU2LDcgKzM0NSw3IEBACiAJICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfVlI0MTMxIHx8CiAJICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfVlI0MTMzKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7Ci0JCXdyaXRlX2ljdTIoMCwgTVNDVUlOVFJFRyk7CisJCWljdTJfd3JpdGUoTVNDVUlOVFJFRywgMCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIAl9CiB9CkBAIC0zNzIsNyArMzYxLDcgQEAKIAkgICAgY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9WUjQxMzEgfHwKIAkgICAgY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9WUjQxMzMpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKLQkJc2V0X2ljdTIoTUNTSUlOVFJFRywgbWFzayk7CisJCWljdTJfc2V0KE1DU0lJTlRSRUcsIG1hc2spOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7CiAJfQogfQpAQCAtMzg4LDcgKzM3Nyw3IEBACiAJICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfVlI0MTMxIHx8CiAJICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfVlI0MTMzKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7Ci0JCWNsZWFyX2ljdTIoTUNTSUlOVFJFRywgbWFzayk7CisJCWljdTJfY2xlYXIoTUNTSUlOVFJFRywgbWFzayk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIAl9CiB9CkBAIC00MDQsNyArMzkzLDcgQEAKIAkgICAgY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9WUjQxMzEgfHwKIAkgICAgY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9WUjQxMzMpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKLQkJd3JpdGVfaWN1MihCQ1VJTlRSLCBNQkNVSU5UUkVHKTsKKwkJaWN1Ml93cml0ZShNQkNVSU5UUkVHLCBCQ1VJTlRSKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogCX0KIH0KQEAgLTQyMCwzMCArNDA5LDI4IEBACiAJICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfVlI0MTMxIHx8CiAJICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfVlI0MTMzKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7Ci0JCXdyaXRlX2ljdTIoMCwgTUJDVUlOVFJFRyk7CisJCWljdTJfd3JpdGUoTUJDVUlOVFJFRywgMCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIAl9CiB9CiAKIEVYUE9SVF9TWU1CT0wodnI0MXh4X2Rpc2FibGVfYmN1aW50KTsKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9zeXNpbnQxX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXNldF9pY3UxKE1TWVNJTlQxUkVHLCAodWludDE2X3QpMSA8PCBTWVNJTlQxX0lSUV9UT19QSU4oaXJxKSk7CisJaWN1MV9zZXQoTVNZU0lOVDFSRUcsIDEgPDwgU1lTSU5UMV9JUlFfVE9fUElOKGlycSkpOwogCiAJcmV0dXJuIDA7IC8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KIH0KIAogc3RhdGljIHZvaWQgc2h1dGRvd25fc3lzaW50MV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQljbGVhcl9pY3UxKE1TWVNJTlQxUkVHLCAodWludDE2X3QpMSA8PCBTWVNJTlQxX0lSUV9UT19QSU4oaXJxKSk7CisJaWN1MV9jbGVhcihNU1lTSU5UMVJFRywgMSA8PCBTWVNJTlQxX0lSUV9UT19QSU4oaXJxKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9zeXNpbnQxX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXNldF9pY3UxKE1TWVNJTlQxUkVHLCAodWludDE2X3QpMSA8PCBTWVNJTlQxX0lSUV9UT19QSU4oaXJxKSk7CisJaWN1MV9zZXQoTVNZU0lOVDFSRUcsIDEgPDwgU1lTSU5UMV9JUlFfVE9fUElOKGlycSkpOwogfQogCiAjZGVmaW5lIGRpc2FibGVfc3lzaW50MV9pcnEJc2h1dGRvd25fc3lzaW50MV9pcnEKQEAgLTQ1Miw3ICs0MzksNyBAQAogc3RhdGljIHZvaWQgZW5kX3N5c2ludDFfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKLQkJc2V0X2ljdTEoTVNZU0lOVDFSRUcsICh1aW50MTZfdCkxIDw8IFNZU0lOVDFfSVJRX1RPX1BJTihpcnEpKTsKKwkJaWN1MV9zZXQoTVNZU0lOVDFSRUcsIDEgPDwgU1lTSU5UMV9JUlFfVE9fUElOKGlycSkpOwogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHN5c2ludDFfaXJxX3R5cGUgPSB7CkBAIC00NjUsMjMgKzQ1MiwyMSBAQAogCS5lbmQJCT0gZW5kX3N5c2ludDFfaXJxLAogfTsKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9zeXNpbnQyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXNldF9pY3UyKE1TWVNJTlQyUkVHLCAodWludDE2X3QpMSA8PCBTWVNJTlQyX0lSUV9UT19QSU4oaXJxKSk7CisJaWN1Ml9zZXQoTVNZU0lOVDJSRUcsIDEgPDwgU1lTSU5UMl9JUlFfVE9fUElOKGlycSkpOwogCiAJcmV0dXJuIDA7IC8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KIH0KIAogc3RhdGljIHZvaWQgc2h1dGRvd25fc3lzaW50Ml9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQljbGVhcl9pY3UyKE1TWVNJTlQyUkVHLCAodWludDE2X3QpMSA8PCBTWVNJTlQyX0lSUV9UT19QSU4oaXJxKSk7CisJaWN1Ml9jbGVhcihNU1lTSU5UMlJFRywgMSA8PCBTWVNJTlQyX0lSUV9UT19QSU4oaXJxKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9zeXNpbnQyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXNldF9pY3UyKE1TWVNJTlQyUkVHLCAodWludDE2X3QpMSA8PCBTWVNJTlQyX0lSUV9UT19QSU4oaXJxKSk7CisJaWN1Ml9zZXQoTVNZU0lOVDJSRUcsIDEgPDwgU1lTSU5UMl9JUlFfVE9fUElOKGlycSkpOwogfQogCiAjZGVmaW5lIGRpc2FibGVfc3lzaW50Ml9pcnEJc2h1dGRvd25fc3lzaW50Ml9pcnEKQEAgLTQ5MCw3ICs0NzUsNyBAQAogc3RhdGljIHZvaWQgZW5kX3N5c2ludDJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKLQkJc2V0X2ljdTIoTVNZU0lOVDJSRUcsICh1aW50MTZfdCkxIDw8IFNZU0lOVDJfSVJRX1RPX1BJTihpcnEpKTsKKwkJaWN1Ml9zZXQoTVNZU0lOVDJSRUcsIDEgPDwgU1lTSU5UMl9JUlFfVE9fUElOKGlycSkpOwogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHN5c2ludDJfaXJxX3R5cGUgPSB7CkBAIC01MDMsOCArNDg4LDYgQEAKIAkuZW5kCQk9IGVuZF9zeXNpbnQyX2lycSwKIH07CiAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCiBzdGF0aWMgaW5saW5lIGludCBzZXRfc3lzaW50MV9hc3NpZ24odW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgY2hhciBhc3NpZ24pCiB7CiAJaXJxX2Rlc2NfdCAqZGVzYyA9IGlycV9kZXNjICsgaXJxOwpAQCAtNTE1LDggKzQ5OCw4IEBACiAKIAlzcGluX2xvY2tfaXJxKCZkZXNjLT5sb2NrKTsKIAotCWludGFzc2lnbjAgPSByZWFkX2ljdTEoSU5UQVNTSUdOMCk7Ci0JaW50YXNzaWduMSA9IHJlYWRfaWN1MShJTlRBU1NJR04xKTsKKwlpbnRhc3NpZ24wID0gaWN1MV9yZWFkKElOVEFTU0lHTjApOworCWludGFzc2lnbjEgPSBpY3UxX3JlYWQoSU5UQVNTSUdOMSk7CiAKIAlzd2l0Y2ggKHBpbikgewogCWNhc2UgMDoKQEAgLTU1Niw4ICs1MzksOCBAQAogCX0KIAogCXN5c2ludDFfYXNzaWduW3Bpbl0gPSBhc3NpZ247Ci0Jd3JpdGVfaWN1MShpbnRhc3NpZ24wLCBJTlRBU1NJR04wKTsKLQl3cml0ZV9pY3UxKGludGFzc2lnbjEsIElOVEFTU0lHTjEpOworCWljdTFfd3JpdGUoSU5UQVNTSUdOMCwgaW50YXNzaWduMCk7CisJaWN1MV93cml0ZShJTlRBU1NJR04xLCBpbnRhc3NpZ24xKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmZGVzYy0+bG9jayk7CiAKQEAgLTU3NCw4ICs1NTcsOCBAQAogCiAJc3Bpbl9sb2NrX2lycSgmZGVzYy0+bG9jayk7CiAKLQlpbnRhc3NpZ24yID0gcmVhZF9pY3UxKElOVEFTU0lHTjIpOwotCWludGFzc2lnbjMgPSByZWFkX2ljdTEoSU5UQVNTSUdOMyk7CisJaW50YXNzaWduMiA9IGljdTFfcmVhZChJTlRBU1NJR04yKTsKKwlpbnRhc3NpZ24zID0gaWN1MV9yZWFkKElOVEFTU0lHTjMpOwogCiAJc3dpdGNoIChwaW4pIHsKIAljYXNlIDA6CkBAIC02MjMsOCArNjA2LDggQEAKIAl9CiAKIAlzeXNpbnQyX2Fzc2lnbltwaW5dID0gYXNzaWduOwotCXdyaXRlX2ljdTEoaW50YXNzaWduMiwgSU5UQVNTSUdOMik7Ci0Jd3JpdGVfaWN1MShpbnRhc3NpZ24zLCBJTlRBU1NJR04zKTsKKwlpY3UxX3dyaXRlKElOVEFTU0lHTjIsIGludGFzc2lnbjIpOworCWljdTFfd3JpdGUoSU5UQVNTSUdOMywgaW50YXNzaWduMyk7CiAKIAlzcGluX3VubG9ja19pcnEoJmRlc2MtPmxvY2spOwogCkBAIC02NTEsODggKzYzNCw5MiBAQAogCiBFWFBPUlRfU1lNQk9MKHZyNDF4eF9zZXRfaW50YXNzaWduKTsKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLWFzbWxpbmthZ2Ugdm9pZCBpcnFfZGlzcGF0Y2godW5zaWduZWQgY2hhciBpbnRudW0sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBpY3VfZ2V0X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1aW50MTZfdCBwZW5kMSwgcGVuZDI7CiAJdWludDE2X3QgbWFzazEsIG1hc2syOwogCWludCBpOwogCi0JcGVuZDEgPSByZWFkX2ljdTEoU1lTSU5UMVJFRyk7Ci0JbWFzazEgPSByZWFkX2ljdTEoTVNZU0lOVDFSRUcpOworCXBlbmQxID0gaWN1MV9yZWFkKFNZU0lOVDFSRUcpOworCW1hc2sxID0gaWN1MV9yZWFkKE1TWVNJTlQxUkVHKTsKIAotCXBlbmQyID0gcmVhZF9pY3UyKFNZU0lOVDJSRUcpOwotCW1hc2syID0gcmVhZF9pY3UyKE1TWVNJTlQyUkVHKTsKKwlwZW5kMiA9IGljdTJfcmVhZChTWVNJTlQyUkVHKTsKKwltYXNrMiA9IGljdTJfcmVhZChNU1lTSU5UMlJFRyk7CiAKIAltYXNrMSAmPSBwZW5kMTsKIAltYXNrMiAmPSBwZW5kMjsKIAogCWlmIChtYXNrMSkgewogCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQkJaWYgKGludG51bSA9PSBzeXNpbnQxX2Fzc2lnbltpXSAmJgotCQkJICAgIChtYXNrMSAmICgodWludDE2X3QpMSA8PCBpKSkpIHsKLQkJCQlpZiAoaSA9PSA4KQotCQkJCQlnaXVpbnRfaXJxX2Rpc3BhdGNoKHJlZ3MpOwotCQkJCWVsc2UKLQkJCQkJZG9fSVJRKFNZU0lOVDFfSVJRKGkpLCByZWdzKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisJCQlpZiAoaXJxID09IElOVF9UT19JUlEoc3lzaW50MV9hc3NpZ25baV0pICYmIChtYXNrMSAmICgxIDw8IGkpKSkKKwkJCQlyZXR1cm4gU1lTSU5UMV9JUlEoaSk7CiAJCX0KIAl9CiAKIAlpZiAobWFzazIpIHsKIAkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJCWlmIChpbnRudW0gPT0gc3lzaW50Ml9hc3NpZ25baV0gJiYKLQkJCSAgICAobWFzazIgJiAoKHVpbnQxNl90KTEgPDwgaSkpKSB7Ci0JCQkJZG9fSVJRKFNZU0lOVDJfSVJRKGkpLCByZWdzKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisJCQlpZiAoaXJxID09IElOVF9UT19JUlEoc3lzaW50Ml9hc3NpZ25baV0pICYmIChtYXNrMiAmICgxIDw8IGkpKSkKKwkJCQlyZXR1cm4gU1lTSU5UMl9JUlEoaSk7CiAJCX0KIAl9CiAKIAlwcmludGsoS0VSTl9FUlIgInNwdXJpb3VzIElDVSBpbnRlcnJ1cHQ6ICUwNHgsJTA0eFxuIiwgcGVuZDEsIHBlbmQyKTsKIAogCWF0b21pY19pbmMoJmlycV9lcnJfY291bnQpOwotfQogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwlyZXR1cm4gLTE7Cit9CiAKIHN0YXRpYyBpbnQgX19pbml0IHZyNDF4eF9pY3VfaW5pdCh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgaWN1MV9zdGFydCwgaWN1Ml9zdGFydDsKKwlpbnQgaTsKKwogCXN3aXRjaCAoY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlKSB7CiAJY2FzZSBDUFVfVlI0MTExOgogCWNhc2UgQ1BVX1ZSNDEyMToKLQkJaWN1MV9iYXNlID0gU1lTSU5UMVJFR19UWVBFMTsKLQkJaWN1Ml9iYXNlID0gU1lTSU5UMlJFR19UWVBFMTsKKwkJaWN1MV9zdGFydCA9IElDVTFfVFlQRTFfQkFTRTsKKwkJaWN1Ml9zdGFydCA9IElDVTJfVFlQRTFfQkFTRTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfVlI0MTIyOgogCWNhc2UgQ1BVX1ZSNDEzMToKIAljYXNlIENQVV9WUjQxMzM6Ci0JCWljdTFfYmFzZSA9IFNZU0lOVDFSRUdfVFlQRTI7Ci0JCWljdTJfYmFzZSA9IFNZU0lOVDJSRUdfVFlQRTI7CisJCWljdTFfc3RhcnQgPSBJQ1UxX1RZUEUyX0JBU0U7CisJCWljdTJfc3RhcnQgPSBJQ1UyX1RZUEUyX0JBU0U7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiAiSUNVOiBVbmV4cGVjdGVkIENQVSBvZiBORUMgVlI0MTAwIHNlcmllc1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQl3cml0ZV9pY3UxKDAsIE1TWVNJTlQxUkVHKTsKLQl3cml0ZV9pY3UxKDB4ZmZmZiwgTUdJVUlOVExSRUcpOworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oaWN1MV9zdGFydCwgSUNVMV9TSVpFLCAiSUNVIikgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKIAotCXdyaXRlX2ljdTIoMCwgTVNZU0lOVDJSRUcpOwotCXdyaXRlX2ljdTIoMHhmZmZmLCBNR0lVSU5USFJFRyk7CisJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihpY3UyX3N0YXJ0LCBJQ1UyX1NJWkUsICJJQ1UiKSA9PSBOVUxMKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpY3UxX3N0YXJ0LCBJQ1UxX1NJWkUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KIAotCXJldHVybiAwOwotfQorCWljdTFfYmFzZSA9IGlvcmVtYXAoaWN1MV9zdGFydCwgSUNVMV9TSVpFKTsKKwlpZiAoaWN1MV9iYXNlID09IE5VTEwpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGljdTFfc3RhcnQsIElDVTFfU0laRSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpY3UyX3N0YXJ0LCBJQ1UyX1NJWkUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKLWVhcmx5X2luaXRjYWxsKHZyNDF4eF9pY3VfaW5pdCk7CisJaWN1Ml9iYXNlID0gaW9yZW1hcChpY3UyX3N0YXJ0LCBJQ1UyX1NJWkUpOworCWlmIChpY3UyX2Jhc2UgPT0gTlVMTCkgeworCQlpb3VubWFwKGljdTFfYmFzZSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpY3UxX3N0YXJ0LCBJQ1UxX1NJWkUpOworCQlyZWxlYXNlX21lbV9yZWdpb24oaWN1Ml9zdGFydCwgSUNVMl9TSVpFKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwlpY3UxX3dyaXRlKE1TWVNJTlQxUkVHLCAwKTsKKwlpY3UxX3dyaXRlKE1HSVVJTlRMUkVHLCAweGZmZmYpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF92cjQxeHhfaWN1X2lycSh2b2lkKQotewotCWludCBpOworCWljdTJfd3JpdGUoTVNZU0lOVDJSRUcsIDApOworCWljdTJfd3JpdGUoTUdJVUlOVEhSRUcsIDB4ZmZmZik7CiAKIAlmb3IgKGkgPSBTWVNJTlQxX0lSUV9CQVNFOyBpIDw9IFNZU0lOVDFfSVJRX0xBU1Q7IGkrKykKIAkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZzeXNpbnQxX2lycV90eXBlOwpAQCAtNzQwLDE4ICs3MjcsMTMgQEAKIAlmb3IgKGkgPSBTWVNJTlQyX0lSUV9CQVNFOyBpIDw9IFNZU0lOVDJfSVJRX0xBU1Q7IGkrKykKIAkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZzeXNpbnQyX2lycV90eXBlOwogCi0Jc2V0dXBfaXJxKElOVDBfQ0FTQ0FERV9JUlEsICZpY3VfY2FzY2FkZSk7Ci0Jc2V0dXBfaXJxKElOVDFfQ0FTQ0FERV9JUlEsICZpY3VfY2FzY2FkZSk7Ci0Jc2V0dXBfaXJxKElOVDJfQ0FTQ0FERV9JUlEsICZpY3VfY2FzY2FkZSk7Ci0Jc2V0dXBfaXJxKElOVDNfQ0FTQ0FERV9JUlEsICZpY3VfY2FzY2FkZSk7Ci0Jc2V0dXBfaXJxKElOVDRfQ0FTQ0FERV9JUlEsICZpY3VfY2FzY2FkZSk7CisJY2FzY2FkZV9pcnEoSU5UMF9JUlEsIGljdV9nZXRfaXJxKTsKKwljYXNjYWRlX2lycShJTlQxX0lSUSwgaWN1X2dldF9pcnEpOworCWNhc2NhZGVfaXJxKElOVDJfSVJRLCBpY3VfZ2V0X2lycSk7CisJY2FzY2FkZV9pcnEoSU5UM19JUlEsIGljdV9nZXRfaXJxKTsKKwljYXNjYWRlX2lycShJTlQ0X0lSUSwgaWN1X2dldF9pcnEpOworCisJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19pbml0IGFyY2hfaW5pdF9pcnEodm9pZCkKLXsKLQltaXBzX2NwdV9pcnFfaW5pdChNSVBTX0NQVV9JUlFfQkFTRSk7Ci0JaW5pdF92cjQxeHhfaWN1X2lycSgpOwotCWluaXRfdnI0MXh4X2dpdWludF9pcnEoKTsKLQotCXNldF9leGNlcHRfdmVjdG9yKDAsIHZyNDF4eF9oYW5kbGVfaW50ZXJydXB0KTsKLX0KK2NvcmVfaW5pdGNhbGwodnI0MXh4X2ljdV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ludC1oYW5kbGVyLlMgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pbnQtaGFuZGxlci5TCmluZGV4IDM4ZmY4OWIuLjI3MmMxM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ludC1oYW5kbGVyLlMKKysrIGIvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vaW50LWhhbmRsZXIuUwpAQCAtNzEsMjQgKzcxLDI0IEBACiAKIAkJYW5kaQl0MSwgdDAsIENBVVNFRl9JUDMJIyBjaGVjayBmb3IgSW50MQogCQlibmV6CXQxLCBoYW5kbGVfaW50Ci0JCWxpCWEwLCAxCisJCWxpCWEwLCAzCiAKIAkJYW5kaQl0MSwgdDAsIENBVVNFRl9JUDQJIyBjaGVjayBmb3IgSW50MgogCQlibmV6CXQxLCBoYW5kbGVfaW50Ci0JCWxpCWEwLCAyCisJCWxpCWEwLCA0CiAKIAkJYW5kaQl0MSwgdDAsIENBVVNFRl9JUDUJIyBjaGVjayBmb3IgSW50MwogCQlibmV6CXQxLCBoYW5kbGVfaW50Ci0JCWxpCWEwLCAzCisJCWxpCWEwLCA1CiAKIAkJYW5kaQl0MSwgdDAsIENBVVNFRl9JUDYJIyBjaGVjayBmb3IgSW50NAogCQlibmV6CXQxLCBoYW5kbGVfaW50Ci0JCWxpCWEwLCA0CisJCWxpCWEwLCA2CiAKIDE6CiAJCWFuZGkJdDEsIHQwLCBDQVVTRUZfSVAyCSMgY2hlY2sgZm9yIEludDAKIAkJYm5legl0MSwgaGFuZGxlX2ludAotCQlsaQlhMCwgMAorCQlsaQlhMCwgMgogCiAJCWFuZGkJdDEsIHQwLCBDQVVTRUZfSVAwCSMgY2hlY2sgZm9yIElQMAogCQlibmV6CXQxLCBoYW5kbGVfaXJxCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pcnEuYyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYjIxNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pcnEuYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogIEludGVycnVwdCBoYW5kaW5nIHJvdXRpbmVzIGZvciBORUMgVlI0MTAwIHNlcmllcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxX2NwdS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdnI0MXh4L3ZyNDF4eC5oPgorCit0eXBlZGVmIHN0cnVjdCBpcnFfY2FzY2FkZSB7CisJaW50ICgqZ2V0X2lycSkodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKTsKK30gaXJxX2Nhc2NhZGVfdDsKKworc3RhdGljIGlycV9jYXNjYWRlX3QgaXJxX2Nhc2NhZGVbTlJfSVJRU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY2FzY2FkZV9pcnFhY3Rpb24gPSB7CisJLmhhbmRsZXIJPSBub19hY3Rpb24sCisJLm1hc2sJCT0gQ1BVX01BU0tfTk9ORSwKKwkubmFtZQkJPSAiY2FzY2FkZSIsCit9OworCitpbnQgY2FzY2FkZV9pcnEodW5zaWduZWQgaW50IGlycSwgaW50ICgqZ2V0X2lycSkodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChpcnEgPj0gTlJfSVJRUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaXJxX2Nhc2NhZGVbaXJxXS5nZXRfaXJxICE9IE5VTEwpCisJCWZyZWVfaXJxKGlycSwgTlVMTCk7CisKKwlpcnFfY2FzY2FkZVtpcnFdLmdldF9pcnEgPSBnZXRfaXJxOworCisJaWYgKGdldF9pcnEgIT0gTlVMTCkgeworCQlyZXR2YWwgPSBzZXR1cF9pcnEoaXJxLCAmY2FzY2FkZV9pcnFhY3Rpb24pOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWlycV9jYXNjYWRlW2lycV0uZ2V0X2lycSA9IE5VTEw7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoY2FzY2FkZV9pcnEpOworCithc21saW5rYWdlIHZvaWQgaXJxX2Rpc3BhdGNoKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlycV9jYXNjYWRlX3QgKmNhc2NhZGU7CisJaXJxX2Rlc2NfdCAqZGVzYzsKKworCWlmIChpcnEgPj0gTlJfSVJRUykgeworCQlhdG9taWNfaW5jKCZpcnFfZXJyX2NvdW50KTsKKwkJcmV0dXJuOworCX0KKworCWNhc2NhZGUgPSBpcnFfY2FzY2FkZSArIGlycTsKKwlpZiAoY2FzY2FkZS0+Z2V0X2lycSAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGludCBzb3VyY2VfaXJxID0gaXJxOworCQlkZXNjID0gaXJxX2Rlc2MgKyBzb3VyY2VfaXJxOworCQlkZXNjLT5oYW5kbGVyLT5hY2soc291cmNlX2lycSk7CisJCWlycSA9IGNhc2NhZGUtPmdldF9pcnEoaXJxLCByZWdzKTsKKwkJaWYgKGlycSA8IDApCisJCQlhdG9taWNfaW5jKCZpcnFfZXJyX2NvdW50KTsKKwkJZWxzZQorCQkJaXJxX2Rpc3BhdGNoKGlycSwgcmVncyk7CisJCWRlc2MtPmhhbmRsZXItPmVuZChzb3VyY2VfaXJxKTsKKwl9IGVsc2UKKwkJZG9fSVJRKGlycSwgcmVncyk7Cit9CisKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgdnI0MXh4X2hhbmRsZV9pbnRlcnJ1cHQodm9pZCk7CisKK3ZvaWQgX19pbml0IGFyY2hfaW5pdF9pcnEodm9pZCkKK3sKKwltaXBzX2NwdV9pcnFfaW5pdChNSVBTX0NQVV9JUlFfQkFTRSk7CisKKwlzZXRfZXhjZXB0X3ZlY3RvcigwLCB2cjQxeHhfaGFuZGxlX2ludGVycnVwdCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L3RhbmJhYy10YjAyMjYvc2V0dXAuYyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL3R5cGUuYwpzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvdnI0MXh4L3RhbmJhYy10YjAyMjYvc2V0dXAuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vdHlwZS5jCmluZGV4IDYwMDI3ZTUuLmJjYjVmNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvdGFuYmFjLXRiMDIyNi9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL3R5cGUuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCi0gKiAgc2V0dXAuYywgU2V0dXAgZm9yIHRoZSBUQU5CQUMgVEIwMjI2LgorICogIHR5cGUuYywgU3lzdGVtIHR5cGUgZm9yIE5FQyBWUjQxMDAgc2VyaWVzLgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIwLDUgKzIwLDUgQEAKIAogY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCiB7Ci0JcmV0dXJuICJUQU5CQUMgVEIwMjI2IjsKKwlyZXR1cm4gIk5FQyBWUjQxMDAgc2VyaWVzIjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL3ZyYzQxNzMuYyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL3ZyYzQxNzMuYwppbmRleCA1NDc1ZGQ3Li5iYTU4NzY0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi92cmM0MTczLmMKKysrIGIvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vdnJjNDE3My5jCkBAIC00NzYsNyArNDc2LDcgQEAKIAogCWlmIChjYXNjYWRlX2lycSA8IEdJVV9JUlEoMCkgfHwgY2FzY2FkZV9pcnEgPiBHSVVfSVJRKDE1KSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JCisKIAl2cmM0MTczX291dHcoMCwgVlJDNDE3M19NU1lTSU5UMVJFRyk7CiAKIAl2cjQxeHhfc2V0X2lycV90cmlnZ2VyKEdJVV9JUlFfVE9fUElOKGNhc2NhZGVfaXJxKSwgVFJJR0dFUl9MRVZFTCwgU0lHTkFMX1RIUk9VR0gpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDF4eC9pYm0td29ya3BhZC9zZXR1cC5jIGIvYXJjaC9taXBzL3ZyNDF4eC9pYm0td29ya3BhZC9zZXR1cC5jCmluZGV4IGNmZjQ0NjAuLmU0YjM0YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvaWJtLXdvcmtwYWQvc2V0dXAuYworKysgYi9hcmNoL21pcHMvdnI0MXh4L2libS13b3JrcGFkL3NldHVwLmMKQEAgLTIzLDExICsyMyw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3ZyNDF4eC93b3JrcGFkLmg+CiAKLWNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQotewotCXJldHVybiAiSUJNIFdvcmtQYWQgejUwIjsKLX0KLQogc3RhdGljIGludCBfX2luaXQgaWJtX3dvcmtwYWRfc2V0dXAodm9pZCkKIHsKIAlzZXRfaW9fcG9ydF9iYXNlKElPX1BPUlRfQkFTRSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L25lYy1jbWJ2cjQxMzMvaW5pdC5jIGIvYXJjaC9taXBzL3ZyNDF4eC9uZWMtY21idnI0MTMzL2luaXQuYwppbmRleCA4N2YwNmIzLi5iZTU5MGVkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdnI0MXh4L25lYy1jbWJ2cjQxMzMvaW5pdC5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvbmVjLWNtYnZyNDEzMy9pbml0LmMKQEAgLTE2LDExICsxNiw2IEBACiAgKiBNYW5pc2ggTGFjaHdhbmkgKG1sYWNod2FuaUBtdmlzdGEuY29tKQogICovCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotCi0jaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CiAKICNpZmRlZiBDT05GSUdfUk9DS0hPUFBFUgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMjgsMTQgKzIzLDcgQEAKIAogI2RlZmluZSBQQ0lDT05GRFJFRwkweGFmMDAwYzE0CiAjZGVmaW5lIFBDSUNPTkZBUkVHCTB4YWYwMDBjMTgKLSNlbmRpZgogCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIk5FQyBDTUItVlI0MTMzIjsKLX0KLQotI2lmZGVmIENPTkZJR19ST0NLSE9QUEVSCiB2b2lkIGRpc2FibGVfcGNuZXQodm9pZCkKIHsKIAl1MzIgZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvdGFuYmFjLXRiMDIyNi9NYWtlZmlsZSBiL2FyY2gvbWlwcy92cjQxeHgvdGFuYmFjLXRiMDIyNi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyZjk1My4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvdnI0MXh4L3RhbmJhYy10YjAyMjYvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBUQU5CQUMgVEIwMjI2IHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKLSMKLQotb2JqLXkJCQkrPSBzZXR1cC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L3RhbmJhYy10YjAyMjkvTWFrZWZpbGUgYi9hcmNoL21pcHMvdnI0MXh4L3RhbmJhYy10YjAyMjkvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmI4NjQuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC90YW5iYWMtdGIwMjI5L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgVEFOQkFDIFRCMDIyOShWUjQxMzFESU1NKSBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsCi0jCi0KLW9iai15CQkJCTo9IHNldHVwLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvdGFuYmFjLXRiMDIyOS9zZXR1cC5jIGIvYXJjaC9taXBzL3ZyNDF4eC90YW5iYWMtdGIwMjI5L3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMWI3NTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC90YW5iYWMtdGIwMjI5L3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogIHNldHVwLmMsIFNldHVwIGZvciB0aGUgVEFOQkFDIFRCMDIyOSAoVlI0MTMxRElNTSkKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+Ci0gKgotICogIE1vZGlmaWVkIGZvciBUQU5CQUMgVEIwMjI5OgotICogIENvcHlyaWdodCAoQykgMjAwMyAgTWVnYXNvbHV0aW9uIEluYy4gIDxtYXRzdUBtZWdhc29sdXRpb24uanA+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJUQU5CQUMgVEIwMjI5IjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvdmljdG9yLW1wYzMweC9NYWtlZmlsZSBiL2FyY2gvbWlwcy92cjQxeHgvdmljdG9yLW1wYzMweC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlODA4Ni4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvdnI0MXh4L3ZpY3Rvci1tcGMzMHgvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBWaWN0b3IgTVAtQzMwMy8zMDQgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAotIwotCi1vYmoteQkJCSs9IHNldHVwLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvdmljdG9yLW1wYzMweC9zZXR1cC5jIGIvYXJjaC9taXBzL3ZyNDF4eC92aWN0b3ItbXBjMzB4L3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OTFlMzYuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC92aWN0b3ItbXBjMzB4L3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogIHNldHVwLmMsIFNldHVwIGZvciB0aGUgVmljdG9yIE1QLUMzMDMvMzA0LgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIlZpY3RvciBNUC1DMzAzLzMwNCI7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L3phby1jYXBjZWxsYS9NYWtlZmlsZSBiL2FyY2gvbWlwcy92cjQxeHgvemFvLWNhcGNlbGxhL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQyMDE5Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy92cjQxeHgvemFvLWNhcGNlbGxhL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgWkFPIE5ldHdvcmtzIENhcGNlbGxhICBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsCi0jCi0KLW9iai15CQkJKz0gc2V0dXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDF4eC96YW8tY2FwY2VsbGEvc2V0dXAuYyBiL2FyY2gvbWlwcy92cjQxeHgvemFvLWNhcGNlbGxhL3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YmFkZTIuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC96YW8tY2FwY2VsbGEvc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiAgc2V0dXAuYywgU2V0dXAgZm9yIHRoZSBaQU8gTmV0d29ya3MgQ2FwY2VsbGEuCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMi0yMDA1ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLWNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQotewotCXJldHVybiAiWkFPIE5ldHdvcmtzIENhcGNlbGxhIjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL0tjb25maWcgYi9hcmNoL3BhcmlzYy9LY29uZmlnCmluZGV4IDFjMmQ4NzQuLjBiMDc5MjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL0tjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvS2NvbmZpZwpAQCAtNDksNiArNDksMTAgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQworCWJvb2wKKwlkZWZhdWx0IHkKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvTWFrZWZpbGUgYi9hcmNoL3BhcmlzYy9NYWtlZmlsZQppbmRleCAwNDAzZDJmLi4zYjMzOWIxIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9NYWtlZmlsZQorKysgYi9hcmNoL3BhcmlzYy9NYWtlZmlsZQpAQCAtMTAwLDE1ICsxMDAsNyBAQAogCiBpbnN0YWxsOiBrZXJuZWxfaW5zdGFsbCBtb2R1bGVzX2luc3RhbGwKIAotcHJlcGFyZTogaW5jbHVkZS9hc20tcGFyaXNjL29mZnNldHMuaAotCi1hcmNoL3BhcmlzYy9rZXJuZWwvYXNtLW9mZnNldHMuczogaW5jbHVkZS9hc20gaW5jbHVkZS9saW51eC92ZXJzaW9uLmggXAotCQkJCSAgIGluY2x1ZGUvY29uZmlnL01BUktFUgotCi1pbmNsdWRlL2FzbS1wYXJpc2Mvb2Zmc2V0cy5oOiBhcmNoL3BhcmlzYy9rZXJuZWwvYXNtLW9mZnNldHMucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKLQotQ0xFQU5fRklMRVMJKz0gbGlmaW1hZ2UgaW5jbHVkZS9hc20tcGFyaXNjL29mZnNldHMuaAorQ0xFQU5fRklMRVMJKz0gbGlmaW1hZ2UKIE1SUFJPUEVSX0ZJTEVTCSs9IHBhbG8uY29uZgogCiBkZWZpbmUgYXJjaGhlbHAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2hwdXgvZ2F0ZS5TIGIvYXJjaC9wYXJpc2MvaHB1eC9nYXRlLlMKaW5kZXggMjY4MGExYy4uYWFhZjMzMCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaHB1eC9nYXRlLlMKKysrIGIvYXJjaC9wYXJpc2MvaHB1eC9nYXRlLlMKQEAgLTksNyArOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzbS9hc3NlbWJseS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9ocHV4L3dyYXBwZXJzLlMgYi9hcmNoL3BhcmlzYy9ocHV4L3dyYXBwZXJzLlMKaW5kZXggMWFhOTM2ZC4uMGIwYzNhNiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaHB1eC93cmFwcGVycy5TCisrKyBiL2FyY2gvcGFyaXNjL2hwdXgvd3JhcHBlcnMuUwpAQCAtMjQsNyArMjQsNyBAQAogI3dhcm5pbmcgUEE2NCBzdXBwb3J0IG5lZWRzIG1vcmUgd29yay4uLmRpZCBmaXJzdCBjdXQKICNlbmRpZgogCi0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibHkuaD4KICNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9wYXJpc2Mva2VybmVsL2VudHJ5LlMKaW5kZXggZWU1OGQzNy4uYmUwZjA3ZiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2VudHJ5LlMKQEAgLTIzLDcgKzIzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogLyogd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHBvc3NpYmlsaXRpZXMgdG8gYWN0IG9uIGFuIGludGVycnVwdGlvbjoKICAqICAtIGhhbmRsZSBpbiBhc3NlbWJseSBhbmQgdXNlIHNoYWRvd2VkIHJlZ2lzdGVycyBvbmx5CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvaGVhZC5TIGIvYXJjaC9wYXJpc2Mva2VybmVsL2hlYWQuUwppbmRleCBkZGY3ZTkxLi4yODQwNWVkIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9oZWFkLlMKQEAgLTE0LDcgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+CS8qIGZvciBDT05GSUdfU01QICovCiAKLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wc3cuaD4KICNpbmNsdWRlIDxhc20vcGRjLmg+CiAJCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3MuYwppbmRleCA0ZmMwNDUwLi40NmI3NTkzIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGRjLmg+CiAjaW5jbHVkZSA8YXNtL3BkY19jaGFzc2lzLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wdHJhY2UuYwppbmRleCBjMDdkYjlkLi5mMzQyOGU1IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIC8qIFBTVyBiaXRzIHdlIGFsbG93IHRoZSBkZWJ1Z2dlciB0byBtb2RpZnkgKi8KICNkZWZpbmUgVVNFUl9QU1dfQklUUwkoUFNXX04gfCBQU1dfViB8IFBTV19DQikKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zaWduYWwuYwppbmRleCA1NWQ3MWMxLi4wMjI0NjUxIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3NpZ25hbC5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogI2lmZGVmIENPTkZJR19DT01QQVQKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsLlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbC5TCmluZGV4IDMyZWE3MDEuLjhjN2E3MTggMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsLlMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGwuUwpAQCAtNyw3ICs3LDcgQEAKICAqIHNvcnJ5IGFib3V0IHRoZSB3YWxsLCBwdWZmaW4uLgogICovCiAKLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vcHN3Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RpbWUuYwppbmRleCA2Y2Y3NDA3Li43ZmY2N2Y4IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC90aW1lLmMKQEAgLTE4OCwxMCArMTg4LDcgQEAKIAkJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOwogCQlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsIHd0bV9zZWMsIHd0bV9uc2VjKTsKIAotCQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQkJdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQkJdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKLQkJdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwkJbnRwX2NsZWFyKCk7CiAJfQogCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOwogCWNsb2NrX3dhc19zZXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2xpYi9NYWtlZmlsZSBiL2FyY2gvcGFyaXNjL2xpYi9NYWtlZmlsZQppbmRleCA3YmY3MDU2Li41ZjJlNjkwIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9wYXJpc2MvbGliL01ha2VmaWxlCkBAIC01LDUgKzUsMyBAQAogbGliLXkJOj0gbHVzZXJjb3B5Lm8gYml0b3BzLm8gY2hlY2tzdW0ubyBpby5vIG1lbXNldC5vIGZpeHVwLm8gbWVtY3B5Lm8KIAogb2JqLXkJOj0gaW9tYXAubwotCi1saWItJChDT05GSUdfU01QKSArPSBkZWJ1Z2xvY2tzLm8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2xpYi9iaXRvcHMuYyBiL2FyY2gvcGFyaXNjL2xpYi9iaXRvcHMuYwppbmRleCAyZGUxODJmLi45MGY0MDBiIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9saWIvYml0b3BzLmMKKysrIGIvYXJjaC9wYXJpc2MvbGliL2JpdG9wcy5jCkBAIC0xMyw4ICsxMyw4IEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiAjaWZkZWYgQ09ORklHX1NNUAotc3BpbmxvY2tfdCBfX2F0b21pY19oYXNoW0FUT01JQ19IQVNIX1NJWkVdIF9fbG9ja19hbGlnbmVkID0gewotCVswIC4uLiAoQVRPTUlDX0hBU0hfU0laRS0xKV0gID0gU1BJTl9MT0NLX1VOTE9DS0VECityYXdfc3BpbmxvY2tfdCBfX2F0b21pY19oYXNoW0FUT01JQ19IQVNIX1NJWkVdIF9fbG9ja19hbGlnbmVkID0geworCVswIC4uLiAoQVRPTUlDX0hBU0hfU0laRS0xKV0gID0gX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VECiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2xpYi9kZWJ1Z2xvY2tzLmMgYi9hcmNoL3BhcmlzYy9saWIvZGVidWdsb2Nrcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjMzZmU2Li4wMDAwMDAwCi0tLSBhL2FyY2gvcGFyaXNjL2xpYi9kZWJ1Z2xvY2tzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyogCi0gKiAgICBEZWJ1Z2dpbmcgdmVyc2lvbnMgb2YgU01QIGxvY2tpbmcgcHJpbWl0aXZlcy4KLSAqCi0gKiAgICBDb3B5cmlnaHQgKEMpIDIwMDQgVGhpYmF1dCBWQVJFTkUgPHZhcmVuZXRAcGFyaXNjLWxpbnV4Lm9yZz4KLSAqCi0gKiAgICBTb21lIGNvZGUgc3RvbGxlbiBmcm9tIGFscGhhICYgc3BhcmM2NCA7KQotICoKLSAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqCi0gKiAgICBXZSB1c2UgcGRjX3ByaW50ZigpIHRocm91Z2hvdXQgdGhlIGZpbGUgZm9yIGFsbCBvdXRwdXQgbWVzc2FnZXMsIHRvIGF2b2lkCi0gKiAgICBsb3NpbmcgbWVzc2FnZXMgYmVjYXVzZSBvZiBkaXNhYmxlZCBpbnRlcnJ1cHRzLiBTaW5jZSB3ZSdyZSB1c2luZyB0aGVzZQotICogICAgbWVzc2FnZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcywgaXQgbWFrZXMgc2Vuc2Ugbm90IHRvIHNlbmQgdGhlbSB0byB0aGUKLSAqICAgIGxpbnV4IGNvbnNvbGUuCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4JLyogaW5faW50ZXJydXB0KCkgKi8KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmRpcnEuaD4JLyogaW5faW50ZXJydXB0KCkgKi8KLSNpbmNsdWRlIDxhc20vcGRjLmg+Ci0KLSN1bmRlZiBJTklUX1NUVUNLCi0jZGVmaW5lIElOSVRfU1RVQ0sgMUwgPDwgMzAKLQotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCi0KLXZvaWQgX2RiZ19zcGluX2xvY2soc3BpbmxvY2tfdCAqIGxvY2ssIGNvbnN0IGNoYXIgKmJhc2VfZmlsZSwgaW50IGxpbmVfbm8pCi17Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50ICphOwotCWxvbmcgc3R1Y2sgPSBJTklUX1NUVUNLOwotCXZvaWQgKmlubGluZV9wYyA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ZWQgPSBqaWZmaWVzOwotCWludCBwcmludGVkID0gMDsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi10cnlfYWdhaW46Ci0KLQkvKiBEbyB0aGUgYWN0dWFsIGxvY2tpbmcgKi8KLQkvKiA8VC1Cb25lPiBnZ2c6IHdlIGNhbid0IGdldCBzdHVjayBvbiB0aGUgb3V0dGVyIGxvb3A/Ci0JICogPGdnZz4gVC1Cb25lOiBXZSBjYW4gaGl0IHRoZSBvdXRlciBsb29wCi0JICoJYWxvdCBpZiBtdWx0aXBsZSBDUFVzIGFyZSBjb25zdGFudGx5IHJhY2luZyBmb3IgYSBsb2NrCi0JICoJYW5kIHRoZSBiYWNrcGxhbmUgaXMgTk9UIGZhaXIgYWJvdXQgd2hpY2ggQ1BVIHNlZXMKLQkgKgl0aGUgdXBkYXRlIGZpcnN0LiBCdXQgaXQgd29uJ3QgaGFuZyBzaW5jZSBldmVyeSBmYWlsZWQKLQkgKglhdHRlbXB0IHdpbGwgZHJvcCB1cyBiYWNrIGludG8gdGhlIGlubmVyIGxvb3AgYW5kCi0JICoJZGVjcmVtZW50IGBzdHVjaycuCi0JICogPGdnZz4gSy1jbGFzcyBhbmQgc29tZSBvZiB0aGUgb3RoZXJzIGFyZSBOT1QgZmFpciBpbiB0aGUgSFcKLQkgKiAJaW1wbGVtZW50YXRpb24gc28gd2UgY291bGQgc2VlIGZhbHNlIHBvc2l0aXZlcy4KLQkgKiAJQnV0IGZpeGluZyB0aGUgbG9jayBjb250ZW50aW9uIGlzIGVhc2llciB0aGFuCi0JICogCWZpeGluZyB0aGUgSFcgdG8gYmUgZmFpci4KLQkgKiA8dGF1c3E+IF9fbGRjdygpIHJldHVybnMgMSBpZiB3ZSBnZXQgdGhlIGxvY2s7IG90aGVyd2lzZSB3ZQotCSAqIAlzcGluIHVudGlsIHRoZSB2YWx1ZSBvZiB0aGUgbG9jayBjaGFuZ2VzLCBvciB3ZSB0aW1lIG91dC4KLQkgKi8KLQltYigpOwotCWEgPSBfX2xkY3dfYWxpZ24obG9jayk7Ci0Jd2hpbGUgKHN0dWNrICYmIChfX2xkY3coYSkgPT0gMCkpCi0JCXdoaWxlICgoKmEgPT0gMCkgJiYgLS1zdHVjayk7Ci0JbWIoKTsKLQotCWlmICh1bmxpa2VseShzdHVjayA8PSAwKSkgewotCQlwZGNfcHJpbnRmKAotCQkJIiVzOiVkOiBzcGluX2xvY2soJXMvJXApIHN0dWNrIGluICVzIGF0ICVwKCVkKSIKLQkJCSIgb3duZWQgYnkgJXM6JWQgaW4gJXMgYXQgJXAoJWQpXG4iLAotCQkJYmFzZV9maWxlLCBsaW5lX25vLCBsb2NrLT5tb2R1bGUsIGxvY2ssCi0JCQljdXJyZW50LT5jb21tLCBpbmxpbmVfcGMsIGNwdSwKLQkJCWxvY2stPmJmaWxlLCBsb2NrLT5ibGluZSwgbG9jay0+dGFzay0+Y29tbSwKLQkJCWxvY2stPnByZXZpb3VzLCBsb2NrLT5vbmNwdSk7Ci0JCXN0dWNrID0gSU5JVF9TVFVDSzsKLQkJcHJpbnRlZCA9IDE7Ci0JCWdvdG8gdHJ5X2FnYWluOwotCX0KLQotCS8qIEV4aXRpbmcuICBHb3QgdGhlIGxvY2suICAqLwotCWxvY2stPm9uY3B1ID0gY3B1OwotCWxvY2stPnByZXZpb3VzID0gaW5saW5lX3BjOwotCWxvY2stPnRhc2sgPSBjdXJyZW50OwotCWxvY2stPmJmaWxlID0gKGNoYXIgKiliYXNlX2ZpbGU7Ci0JbG9jay0+YmxpbmUgPSBsaW5lX25vOwotCi0JaWYgKHVubGlrZWx5KHByaW50ZWQpKSB7Ci0JCXBkY19wcmludGYoCi0JCQkiJXM6JWQ6IHNwaW5fbG9jayBncmFiYmVkIGluICVzIGF0ICVwKCVkKSAlbGQgdGlja3NcbiIsCi0JCQliYXNlX2ZpbGUsIGxpbmVfbm8sIGN1cnJlbnQtPmNvbW0sIGlubGluZV9wYywKLQkJCWNwdSwgamlmZmllcyAtIHN0YXJ0ZWQpOwotCX0KLX0KLQotdm9pZCBfZGJnX3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKiBsb2NrLCBjb25zdCBjaGFyICpiYXNlX2ZpbGUsIGludCBsaW5lX25vKQotewotCUNIRUNLX0xPQ0sobG9jayk7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50ICphOwotCW1iKCk7Ci0JYSA9IF9fbGRjd19hbGlnbihsb2NrKTsKLQlpZiAodW5saWtlbHkoKCphICE9IDApICYmIGxvY2stPmJhYmJsZSkpIHsKLQkJbG9jay0+YmFiYmxlLS07Ci0JCXBkY19wcmludGYoCi0JCQkiJXM6JWQ6IHNwaW5fdW5sb2NrKCVzOiVwKSBub3QgbG9ja2VkXG4iLAotCQkJYmFzZV9maWxlLCBsaW5lX25vLCBsb2NrLT5tb2R1bGUsIGxvY2spOwotCX0KLQkqYSA9IDE7CQotCW1iKCk7Ci19Ci0KLWludCBfZGJnX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICogbG9jaywgY29uc3QgY2hhciAqYmFzZV9maWxlLCBpbnQgbGluZV9ubykKLXsKLQlpbnQgcmV0OwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYTsKLQltYigpOwotCWEgPSBfX2xkY3dfYWxpZ24obG9jayk7Ci0JcmV0ID0gKF9fbGRjdyhhKSAhPSAwKTsKLQltYigpOwotCWlmIChyZXQpIHsKLQkJbG9jay0+b25jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCWxvY2stPnByZXZpb3VzID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwotCQlsb2NrLT50YXNrID0gY3VycmVudDsKLQl9IGVsc2UgewotCQlsb2NrLT5iZmlsZSA9IChjaGFyICopYmFzZV9maWxlOwotCQlsb2NrLT5ibGluZSA9IGxpbmVfbm87Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfU1BJTkxPQ0sgKi8KLQotI2lmZGVmIENPTkZJR19ERUJVR19SV0xPQ0sKLQotLyogSW50ZXJydXB0cyB0cm91YmxlIGRldGFpbGVkIGV4cGxhbmF0aW9uLCB0aHggR3JhbnQ6Ci0gKgotICogbyB3cml0ZXIgKHdhbnRzIHRvIG1vZGlmeSBkYXRhKSBhdHRlbXB0cyB0byBhY3F1aXJlIHRoZSByd2xvY2sKLSAqIG8gSGUgZ2V0cyB0aGUgd3JpdGUgbG9jay4KLSAqIG8gSW50ZXJ1cHRzIGFyZSBzdGlsbCBlbmFibGVkLCB3ZSB0YWtlIGFuIGludGVycnVwdCB3aXRoIHRoZQotICogICB3cml0ZSBzdGlsbCBob2xkaW5nIHRoZSBsb2NrLgotICogbyBpbnRlcnJ1cHQgaGFuZGxlciB0cmllcyB0byBhY3F1aXJlIHRoZSByd2xvY2sgZm9yIHJlYWQuCi0gKiBvIGRlYWRsb2NrIHNpbmNlIHRoZSB3cml0ZXIgY2FuJ3QgcmVsZWFzZSBpdCBhdCB0aGlzIHBvaW50LgotICogCi0gKiBJbiBnZW5lcmFsLCBhbnkgdXNlIG9mIHNwaW5sb2NrcyB0aGF0IGNvbXBldGVzIGJldHdlZW4gImJhc2UiCi0gKiBsZXZlbCBhbmQgaW50ZXJydXB0IGxldmVsIGNvZGUgd2lsbCByaXNrIGRlYWRsb2NrLiBJbnRlcnJ1cHRzCi0gKiBuZWVkIHRvIGJlIGRpc2FibGVkIGluIHRoZSBiYXNlIGxldmVsIHJvdXRpbmVzIHRvIGF2b2lkIGl0LgotICogT3IgbW9yZSBwcmVjaXNlbHksIG9ubHkgdGhlIElSUSB0aGUgYmFzZSBsZXZlbCByb3V0aW5lCi0gKiBpcyBjb21wZXRpbmcgd2l0aCBmb3IgdGhlIGxvY2suICBCdXQgaXQncyBtb3JlIGVmZmljaWVudC9mYXN0ZXIKLSAqIHRvIGp1c3QgZGlzYWJsZSBhbGwgaW50ZXJydXB0cyBvbiB0aGF0IENQVSB0byBndWFyYW50ZWUKLSAqIG9uY2UgaXQgZ2V0cyB0aGUgbG9jayBpdCBjYW4gcmVsZWFzZSBpdCBxdWlja2x5IHRvby4KLSAqLwotIAotdm9pZCBfZGJnX3dyaXRlX2xvY2socndsb2NrX3QgKnJ3LCBjb25zdCBjaGFyICpiZmlsZSwgaW50IGJsaW5lKQotewotCXZvaWQgKmlubGluZV9wYyA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ZWQgPSBqaWZmaWVzOwotCWxvbmcgc3R1Y2sgPSBJTklUX1NUVUNLOwotCWludCBwcmludGVkID0gMDsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCQotCWlmKHVubGlrZWx5KGluX2ludGVycnVwdCgpKSkgewkvKiBhY3F1aXJpbmcgd3JpdGUgbG9jayBpbiBpbnRlcnJ1cHQgY29udGV4dCwgYmFkIGlkZWEgKi8KLQkJcGRjX3ByaW50Zigid3JpdGVfbG9jayBjYWxsZXI6ICVzOiVkLCBJUlFzIGVuYWJsZWQsXG4iLCBiZmlsZSwgYmxpbmUpOwotCQlCVUcoKTsKLQl9Ci0KLQkvKiBOb3RlOiBpZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAod2hpY2ggaXMgbW9zdCBsaWtlbHkpLCB0aGUgcHJpbnRrCi0Jd2lsbCBuZXZlciBzaG93IG9uIHRoZSBjb25zb2xlLiBXZSBtaWdodCBuZWVkIGEgcG9sbGluZyBtZXRob2QgdG8gZmx1c2gKLQl0aGUgZG1lc2cgYnVmZmVyIGFueWhvdy4gKi8KLQkKLXJldHJ5OgotCV9yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7Ci0KLQlpZihydy0+Y291bnRlciAhPSAwKSB7Ci0JCS8qIHRoaXMgYmFzaWNhbGx5IG5ldmVyIGhhcHBlbnMgKi8KLQkJX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOwotCQkKLQkJc3R1Y2stLTsKLQkJaWYgKCh1bmxpa2VseShzdHVjayA8PSAwKSkgJiYgKHJ3LT5jb3VudGVyIDwgMCkpIHsKLQkJCXBkY19wcmludGYoCi0JCQkJIiVzOiVkOiB3cml0ZV9sb2NrIHN0dWNrIG9uIHdyaXRlciIKLQkJCQkiIGluICVzIGF0ICVwKCVkKSAlbGQgdGlja3NcbiIsCi0JCQkJYmZpbGUsIGJsaW5lLCBjdXJyZW50LT5jb21tLCBpbmxpbmVfcGMsCi0JCQkJY3B1LCBqaWZmaWVzIC0gc3RhcnRlZCk7Ci0JCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCQlwcmludGVkID0gMTsKLQkJfQotCQllbHNlIGlmICh1bmxpa2VseShzdHVjayA8PSAwKSkgewotCQkJcGRjX3ByaW50ZigKLQkJCQkiJXM6JWQ6IHdyaXRlX2xvY2sgc3R1Y2sgb24gcmVhZGVyIgotCQkJCSIgaW4gJXMgYXQgJXAoJWQpICVsZCB0aWNrc1xuIiwKLQkJCQliZmlsZSwgYmxpbmUsIGN1cnJlbnQtPmNvbW0sIGlubGluZV9wYywKLQkJCQljcHUsIGppZmZpZXMgLSBzdGFydGVkKTsKLQkJCXN0dWNrID0gSU5JVF9TVFVDSzsKLQkJCXByaW50ZWQgPSAxOwotCQl9Ci0JCQotCQl3aGlsZShydy0+Y291bnRlciAhPSAwKTsKLQotCQlnb3RvIHJldHJ5OwotCX0KLQotCS8qIGdvdCBpdC4gIG5vdyBsZWF2ZSB3aXRob3V0IHVubG9ja2luZyAqLwotCXJ3LT5jb3VudGVyID0gLTE7IC8qIHJlbWVtYmVyIHdlIGFyZSBsb2NrZWQgKi8KLQotCWlmICh1bmxpa2VseShwcmludGVkKSkgewotCQlwZGNfcHJpbnRmKAotCQkJIiVzOiVkOiB3cml0ZV9sb2NrIGdyYWJiZWQgaW4gJXMgYXQgJXAoJWQpICVsZCB0aWNrc1xuIiwKLQkJCWJmaWxlLCBibGluZSwgY3VycmVudC0+Y29tbSwgaW5saW5lX3BjLAotCQkJY3B1LCBqaWZmaWVzIC0gc3RhcnRlZCk7Ci0JfQotfQotCi1pbnQgX2RiZ193cml0ZV90cnlsb2NrKHJ3bG9ja190ICpydywgY29uc3QgY2hhciAqYmZpbGUsIGludCBibGluZSkKLXsKLSNpZiAwCi0Jdm9pZCAqaW5saW5lX3BjID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0jZW5kaWYKLQkKLQlpZih1bmxpa2VseShpbl9pbnRlcnJ1cHQoKSkpIHsJLyogYWNxdWlyaW5nIHdyaXRlIGxvY2sgaW4gaW50ZXJydXB0IGNvbnRleHQsIGJhZCBpZGVhICovCi0JCXBkY19wcmludGYoIndyaXRlX2xvY2sgY2FsbGVyOiAlczolZCwgSVJRcyBlbmFibGVkLFxuIiwgYmZpbGUsIGJsaW5lKTsKLQkJQlVHKCk7Ci0JfQotCi0JLyogTm90ZTogaWYgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgKHdoaWNoIGlzIG1vc3QgbGlrZWx5KSwgdGhlIHByaW50awotCXdpbGwgbmV2ZXIgc2hvdyBvbiB0aGUgY29uc29sZS4gV2UgbWlnaHQgbmVlZCBhIHBvbGxpbmcgbWV0aG9kIHRvIGZsdXNoCi0JdGhlIGRtZXNnIGJ1ZmZlciBhbnlob3cuICovCi0JCi0JX3Jhd19zcGluX2xvY2soJnJ3LT5sb2NrKTsKLQotCWlmKHJ3LT5jb3VudGVyICE9IDApIHsKLQkJLyogdGhpcyBiYXNpY2FsbHkgbmV2ZXIgaGFwcGVucyAqLwotCQlfcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIGdvdCBpdC4gIG5vdyBsZWF2ZSB3aXRob3V0IHVubG9ja2luZyAqLwotCXJ3LT5jb3VudGVyID0gLTE7IC8qIHJlbWVtYmVyIHdlIGFyZSBsb2NrZWQgKi8KLSNpZiAwCi0JcGRjX3ByaW50ZigiJXM6JWQ6IHRyeSB3cml0ZV9sb2NrIGdyYWJiZWQgaW4gJXMgYXQgJXAoJWQpXG4iLAotCQkgICBiZmlsZSwgYmxpbmUsIGN1cnJlbnQtPmNvbW0sIGlubGluZV9wYywgY3B1KTsKLSNlbmRpZgotCXJldHVybiAxOwotfQotCi12b2lkIF9kYmdfcmVhZF9sb2NrKHJ3bG9ja190ICogcncsIGNvbnN0IGNoYXIgKmJmaWxlLCBpbnQgYmxpbmUpCi17Ci0jaWYgMAotCXZvaWQgKmlubGluZV9wYyA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ZWQgPSBqaWZmaWVzOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0jZW5kaWYKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCV9yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7IAotCi0JcnctPmNvdW50ZXIrKzsKLSNpZiAwCi0JcGRjX3ByaW50ZigKLQkJIiVzOiVkOiByZWFkX2xvY2sgZ3JhYmJlZCBpbiAlcyBhdCAlcCglZCkgJWxkIHRpY2tzXG4iLAotCQliZmlsZSwgYmxpbmUsIGN1cnJlbnQtPmNvbW0sIGlubGluZV9wYywKLQkJY3B1LCBqaWZmaWVzIC0gc3RhcnRlZCk7Ci0jZW5kaWYKLQlfcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0jZW5kaWYgLyogQ09ORklHX0RFQlVHX1JXTE9DSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbGliL2ZpeHVwLlMgYi9hcmNoL3BhcmlzYy9saWIvZml4dXAuUwppbmRleCAxMzRmMGNkLi4xYjkxNjEyIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9saWIvZml4dXAuUworKysgYi9hcmNoL3BhcmlzYy9saWIvZml4dXAuUwpAQCAtMjAsNyArMjAsNyBAQAogICogRml4dXAgcm91dGluZXMgZm9yIGtlcm5lbCBleGNlcHRpb24gaGFuZGxpbmcuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJseS5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy84eHhfaW8vY3M0MjE4X3RkbS5jIGIvYXJjaC9wcGMvOHh4X2lvL2NzNDIxOF90ZG0uYwppbmRleCA4OWZlMGNlLi4yY2E5ZWM3IDEwMDY0NAotLS0gYS9hcmNoL3BwYy84eHhfaW8vY3M0MjE4X3RkbS5jCisrKyBiL2FyY2gvcHBjLzh4eF9pby9jczQyMThfdGRtLmMKQEAgLTEzODAsNyArMTM4MCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3M0MjE4X2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGJlZXBfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihjc19ub3NvdW5kLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoYmVlcF90aW1lciwgY3Nfbm9zb3VuZCwgMCwgMCk7CiB9OwogCiBzdGF0aWMgdm9pZCBjc19ta3NvdW5kKHVuc2lnbmVkIGludCBoeiwgdW5zaWduZWQgaW50IHRpY2tzKQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvS2NvbmZpZyBiL2FyY2gvcHBjL0tjb25maWcKaW5kZXggZTZmYTFkMS4uMzQ3ZWEyOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvS2NvbmZpZworKysgYi9hcmNoL3BwYy9LY29uZmlnCkBAIC00Nyw2ICs0NywxMCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJYm9vbAorCWRlZmF1bHQgeQorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogbWVudSAiUHJvY2Vzc29yIgpAQCAtMjYxLDYgKzI2NSwxNSBAQAogCiAJICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KIAorY29uZmlnIEhPVFBMVUdfQ1BVCisJYm9vbCAiU3VwcG9ydCBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIENQVXMiCisJZGVwZW5kcyBvbiBTTVAgJiYgSE9UUExVRyAmJiBFWFBFUklNRU5UQUwgJiYgUFBDX1BNQUMKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIHRvIGJlIGFibGUgdG8gZGlzYWJsZSBhbmQgcmUtZW5hYmxlIGluZGl2aWR1YWwKKwkgIENQVXMgYXQgcnVudGltZSBvbiBTTVAgbWFjaGluZXMuCisKKwkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgorCiBzb3VyY2UgYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9LY29uZmlnCiBzb3VyY2UgYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZwogCkBAIC0zMzAsMTQgKzM0Myw2IEBACiAJICBFbmQgb2YgbGlmZTogZW5kIDIwMDAgPwogCSAgVVJMOiBzZWUgVFFNODUwTAogCi0JICBTUEQ4MjNUUzoKLQkgIE1QQzgyMyBiYXNlZCBib2FyZCB1c2VkIGluIHRoZSAiVGVsZSBTZXJ2ZXIiIHByb2R1Y3QKLQkgIE1hbnVmYWN0dXJlcjogU3BlZWNoIERlc2lnbiwgPGh0dHA6Ly93d3cuc3BlZWNoLWRlc2lnbi5kZS8+Ci0JICBEYXRlIG9mIFJlbGVhc2U6IE1pZCAyMDAwICg/KQotCSAgRW5kIG9mIGxpZmU6IC0KLQkgIFVSTDogPGh0dHA6Ly93d3cuc3BlZWNoLWRlc2lnbi5kZS8+Ci0JICBzZWxlY3QgIkVuZ2xpc2giLCB0aGVuICJUZWxldGVhbSBTb2x1dGlvbnMiLCB0aGVuICJUZWxlU2VydmVyIgotCiAJICBJVk1TODoKIAkgIE1QQzg2MCBiYXNlZCBib2FyZCB1c2VkIGluIHRoZSAiSW50ZWdyYXRlZCBWb2ljZSBNYWlsIFN5c3RlbSIsCiAJICBTbWFsbCBWZXJzaW9uICg4IHZvaWNlIGNoYW5uZWxzKQpAQCAtMzU0LDEzICszNTksNiBAQAogCSAgRW5kIG9mIGxpZmU6IC0KIAkgIFVSTDogPGh0dHA6Ly93d3cuc3BlZWNoLWRlc2lnbi5kZS8+CiAKLQkgIFNNODUwOgotCSAgU2VydmljZSBNb2R1bGUgKGJhc2VkIG9uIFRRTTg1MEwpCi0JICBNYW51ZmFjdHVyZXI6IERlcGVuZGFibGUgQ29tcHV0ZXIgU3lzdGVtcywgPGh0dHA6Ly93d3cuZGVjb21zeXMuY29tLz4KLQkgIERhdGUgb2YgUmVsZWFzZTogZW5kIDIwMDAgKD8pCi0JICBFbmQgb2YgbGlmZTogbWlkIDIwMDEgKD8pCi0JICBVUkw6IDxodHRwOi8vd3d3LnR6LW1pa3JvZWxla3Ryb25pay5kZS9TZXJ2aWNlTW9kdWxlL2luZGV4Lmh0bWw+Ci0KIAkgIEhFUk1FUzoKIAkgIEhlcm1lcy1Qcm8gSVNETi9MQU4gcm91dGVyIHdpdGggaW50ZWdyYXRlZCA4IHggaHViCiAJICBNYW51ZmFjdHVyZXI6IE11bHRpZGF0YSBHZXNlbGxzY2hhZnQgZnVyIERhdGVudGVjaG5payB1bmQgSW5mb3JtYXRpawpAQCAtNDY0LDEzICs0NjIsNiBAQAogY29uZmlnIEZQUzg1MEwKIAlib29sICJGUFM4NTBMIgogCi1jb25maWcgU1BEODIzVFMKLQlib29sICJTUEQ4MjNUUyIKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIFNwZWVjaCBEZXNpZ24gODIzIFRlbGUtU2VydmVyIGZyb20gU3BlZWNoCi0JICBEZXNpZ24sIHJlbGVhc2VkIGluIDIwMDAuICBUaGUgbWFudWZhY3R1cmVyJ3Mgd2Vic2l0ZSBpcyBhdAotCSAgPGh0dHA6Ly93d3cuc3BlZWNoLWRlc2lnbi5kZS8+LgotCiBjb25maWcgSVZNUzgKIAlib29sICJJVk1TOCIKIAloZWxwCkBAIC00ODUsMTQgKzQ3Niw2IEBACiAJICBmcm9tIFNwZWVjaCBEZXNpZ24sIHJlbGVhc2VkIE1hcmNoIDIwMDEuICBUaGUgbWFudWZhY3R1cmVyJ3Mgd2Vic2l0ZQogCSAgaXMgYXQgPGh0dHA6Ly93d3cuc3BlZWNoLWRlc2lnbi5kZS8+LgogCi1jb25maWcgU004NTAKLQlib29sICJTTTg1MCIKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIFNlcnZpY2UgTW9kdWxlIDg1MCBmcm9tIERlcGVuZGFibGUKLQkgIENvbXB1dGVyIFN5c3RlbXMsIGFuIFNCQyBiYXNlZCBvbiB0aGUgVFFNODUwTCBtb2R1bGUgYnkgVFEKLQkgIENvbXBvbmVudHMuICBUaGlzIGJvYXJkIGlzIG5vIGxvbmdlciBpbiBwcm9kdWN0aW9uLiAgVGhlCi0JICBtYW51ZmFjdHVyZXIncyB3ZWJzaXRlIGlzIGF0IDxodHRwOi8vd3d3LmRlY29tc3lzLmNvbS8+LgotCiBjb25maWcgSEVSTUVTX1BSTwogCWJvb2wgIkhFUk1FUyIKIApAQCAtNTc4LDkgKzU2MSw2IEBACiAJaGVscAogCSAgU2VsZWN0IENQQ0k2OTAgaWYgY29uZmlndXJpbmcgYSBGb3JjZSBDUENJNjkwIGNQQ0kgYm9hcmQuCiAKLWNvbmZpZyBQQ09SRQotCWJvb2wgIkZvcmNlLVBvd2VyQ29yZSIKLQogY29uZmlnIFBPV0VSUE1DMjUwCiAJYm9vbCAiRm9yY2UtUG93ZXJQTUMyNTAiCiAKQEAgLTYxMyw5ICs1OTMsNiBAQAogY29uZmlnIExPUEVDCiAJYm9vbCAiTW90b3JvbGEtTG9QRUMiCiAKLWNvbmZpZyBNQ1BONzY1Ci0JYm9vbCAiTW90b3JvbGEtTUNQTjc2NSIKLQogY29uZmlnIE1WTUU1MTAwCiAJYm9vbCAiTW90b3JvbGEtTVZNRTUxMDAiCiAKQEAgLTYzNywxMiArNjE0LDYgQEAKIGNvbmZpZyBSQURTVE9ORV9QUEM3RAogCWJvb2wgIlJhZHN0b25lIFRlY2hub2xvZ3kgUFBDN0QgYm9hcmQiCiAKLWNvbmZpZyBBRElSCi0JYm9vbCAiU0JTLUFkaXJvbmRhY2siCi0KLWNvbmZpZyBLMgotCWJvb2wgIlNCUy1LMiIKLQogY29uZmlnIFBBTDQKIAlib29sICJTQlMtUGFsb21hcjQiCiAKQEAgLTcxMyw2ICs2ODQsMTYgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEMgODM0eCBTWVMgZXZhbHVhdGlvbiBib2FyZC4KIAorCSAgQmUgYXdhcmUgdGhhdCBQQ0kgYnVzZXMgY2FuIG9ubHkgZnVuY3Rpb24gd2hlbiBTWVMgYm9hcmQgaXMgcGx1Z2dlZAorCSAgaW50byB0aGUgUElCIChQbGF0Zm9ybSBJTyBCb2FyZCkgYm9hcmQgZnJvbSBGcmVlc2NhbGUgd2hpY2ggcHJvdmlkZQorCSAgMyBQQ0kgc2xvdHMuICBUaGUgUElCcyBQQ0kgaW5pdGlhbGl6YXRpb24gaXMgdGhlIGJvb3Rsb2FkZXIncworCSAgcmVzcG9uc2libGlsdHkuCisKK2NvbmZpZyBFVjY0MzYwCisJYm9vbCAiTWFydmVsbC1FVjY0MzYwQlAiCisJaGVscAorCSAgU2VsZWN0IEVWNjQzNjAgaWYgY29uZmlndXJpbmcgYSBNYXJ2ZWxsIEVWNjQzNjBCUCBFdmFsdWF0aW9uCisJICBwbGF0Zm9ybS4KIGVuZGNob2ljZQogCiBjb25maWcgUFEyQURTCkBAIC03MjIsNyArNzAzLDcgQEAKIAogY29uZmlnIFRRTTh4eEwKIAlib29sCi0JZGVwZW5kcyBvbiA4eHggJiYgKFRRTTgyM0wgfHwgVFFNODUwTCB8fCBGUFM4NTBMIHx8IFRRTTg1NUwgfHwgVFFNODYwTCB8fCBTTTg1MCkKKwlkZXBlbmRzIG9uIDh4eCAmJiAoVFFNODIzTCB8fCBUUU04NTBMIHx8IEZQUzg1MEwgfHwgVFFNODU1TCB8fCBUUU04NjBMKQogCWRlZmF1bHQgeQogCiBjb25maWcgRU1CRURERURCT09UCkBAIC03OTYsMTUgKzc3NywxNSBAQAogCiBjb25maWcgUFBDX0dFTjU1MAogCWJvb2wKLQlkZXBlbmRzIG9uIFNBTkRQT0lOVCB8fCBNQ1BONzY1IHx8IFNQUlVDRSB8fCBQUExVUyB8fCBQQ09SRSB8fCBcCi0JCVBSUE1DNzUwIHx8IEsyIHx8IFBSUE1DODAwIHx8IExPUEVDIHx8IFwKKwlkZXBlbmRzIG9uIFNBTkRQT0lOVCB8fCBTUFJVQ0UgfHwgUFBMVVMgfHwgXAorCQlQUlBNQzc1MCB8fCBQUlBNQzgwMCB8fCBMT1BFQyB8fCBcCiAJCShFVjY0MjYwICYmICFTRVJJQUxfTVBTQykgfHwgQ0hFU1ROVVQgfHwgUkFEU1RPTkVfUFBDN0QgfHwgXAogCQk4M3h4CiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBGT1JDRQogCWJvb2wKLQlkZXBlbmRzIG9uIDZ4eCAmJiAoUENPUkUgfHwgUE9XRVJQTUMyNTApCisJZGVwZW5kcyBvbiA2eHggJiYgUE9XRVJQTUMyNTAKIAlkZWZhdWx0IHkKIAogY29uZmlnIEdUNjQyNjAKQEAgLTgxNCw3ICs3OTUsNyBAQAogCiBjb25maWcgTVY2NDM2MAkJIyBSZWFsbHkgTVY2NDM2MCAmIE1WNjQ0NjAKIAlib29sCi0JZGVwZW5kcyBvbiBDSEVTVE5VVCB8fCBLQVRBTkEgfHwgUkFEU1RPTkVfUFBDN0QgfHwgSERQVQorCWRlcGVuZHMgb24gQ0hFU1ROVVQgfHwgS0FUQU5BIHx8IFJBRFNUT05FX1BQQzdEIHx8IEhEUFUgfHwgRVY2NDM2MAogCWRlZmF1bHQgeQogCiBjb25maWcgTVY2NFg2MApAQCAtODY3LDcgKzg0OCw3IEBACiAKIGNvbmZpZyBNUEMxMFhfQlJJREdFCiAJYm9vbAotCWRlcGVuZHMgb24gUENPUkUgfHwgUE9XRVJQTUMyNTAgfHwgTE9QRUMgfHwgU0FORFBPSU5UCisJZGVwZW5kcyBvbiBQT1dFUlBNQzI1MCB8fCBMT1BFQyB8fCBTQU5EUE9JTlQKIAlkZWZhdWx0IHkKIAogY29uZmlnIE1QQzEwWF9PUEVOUElDCkBAIC04ODYsMTAgKzg2Nyw2IEBACiAJICBJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkIHRoZW4gdGhlIE1QQzgyNHggcHJvY2Vzc29yIHdpbGwgcnVuCiAJICBpbiBEVUFSVCBtb2RlIGluc3RlYWQgb2YgVUFSVCBtb2RlLgogCi1jb25maWcgQ1BDNzEwX0RBVEFfR0FUSEVSSU5HCi0JYm9vbCAiRW5hYmxlIENQQzcxMCBkYXRhIGdhdGhlcmluZyIKLQlkZXBlbmRzIG9uIEsyCi0KIGNvbmZpZyBIQVJSSUVSX1NUT1JFX0dBVEhFUklORwogCWJvb2wgIkVuYWJsZSBIYXJyaWVyIHN0b3JlIGdhdGhlcmluZyIKIAlkZXBlbmRzIG9uIEhBUlJJRVIKQEAgLTExOTQsNiArMTE3MSwxMSBAQAogCWJvb2wKIAlkZWZhdWx0IFBDSQogCitjb25maWcgTVBDODN4eF9QQ0kyCisJYm9vbCAiICBTdXBwcnQgZm9yIDJuZCBQQ0kgaG9zdCBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gUENJICYmIE1QQzgzNHgKKwlkZWZhdWx0IHkgaWYgTVBDODM0eF9TWVMKKwogY29uZmlnIFBDSV9RU1BBTgogCWJvb2wgIlFTcGFuIFBDSSIKIAlkZXBlbmRzIG9uICE0eHggJiYgIUNQTTIgJiYgOHh4CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9LY29uZmlnLmRlYnVnIGIvYXJjaC9wcGMvS2NvbmZpZy5kZWJ1ZwppbmRleCBlMTZjNzcxLi42MTY1M2NiIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvcHBjL0tjb25maWcuZGVidWcKQEAgLTYyLDcgKzYyLDggQEAKIAogY29uZmlnIFNFUklBTF9URVhUX0RFQlVHCiAJYm9vbCAiU3VwcG9ydCBmb3IgZWFybHkgYm9vdCB0ZXh0cyBvdmVyIHNlcmlhbCBwb3J0IgotCWRlcGVuZHMgb24gNHh4IHx8IEdUNjQyNjAgfHwgTE9QRUMgfHwgUFBMVVMgfHwgUFJQTUM4MDAgfHwgUFBDX0dFTjU1MCB8fCBQUENfTVBDNTJ4eAorCWRlcGVuZHMgb24gNHh4IHx8IExPUEVDIHx8IE1WNjRYNjAgfHwgUFBMVVMgfHwgUFJQTUM4MDAgfHwgXAorCQlQUENfR0VONTUwIHx8IFBQQ19NUEM1Mnh4CiAKIGNvbmZpZyBQUENfT0NQCiAJYm9vbApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvTWFrZWZpbGUgYi9hcmNoL3BwYy9NYWtlZmlsZQppbmRleCBkMWI2ZTZkLi42ZGQ3YjUwIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9NYWtlZmlsZQorKysgYi9hcmNoL3BwYy9NYWtlZmlsZQpAQCAtMjEsMTMgKzIxLDE0IEBACiBlbmRpZgogCiBMREZMQUdTX3ZtbGludXgJOj0gLVR0ZXh0ICQoS0VSTkVMTE9BRCkgLUJzdGF0aWMKLUNQUEZMQUdTCSs9IC1JYXJjaC8kKEFSQ0gpIC1JaW5jbHVkZTMKKyMgVGhlIC1JYXJjaC8kKEFSQ0gpL2luY2x1ZGUgaXMgdGVtcG9yYXJ5IHdoaWxlIHdlIGFyZSBtZXJnaW5nCitDUFBGTEFHUwkrPSAtSWFyY2gvJChBUkNIKSAtSWFyY2gvJChBUkNIKS9pbmNsdWRlCiBBRkxBR1MJCSs9IC1JYXJjaC8kKEFSQ0gpCiBDRkxBR1MJCSs9IC1JYXJjaC8kKEFSQ0gpIC1tc29mdC1mbG9hdCAtcGlwZSBcCiAJCS1mZml4ZWQtcjIgLW1tdWx0aXBsZQogQ1BQCQk9ICQoQ0MpIC1FICQoQ0ZMQUdTKQogIyBUZW1wb3JhcnkgaGFjayB1bnRpbCB3ZSBoYXZlIG1pZ3JhdGVkIHRvIGFzbS1wb3dlcnBjCi1MSU5VWElOQ0xVREUgICAgKz0gLUlpbmNsdWRlMworTElOVVhJTkNMVURFICAgICs9IC1JYXJjaC8kKEFSQ0gpL2luY2x1ZGUKIAogQ0hFQ0tGTEFHUwkrPSAtRF9fcG93ZXJwY19fCiAKQEAgLTEwMywyMSArMTA0LDE2IEBACiAKIGFyY2hjbGVhbjoKIAkkKFEpJChNQUtFKSAkKGNsZWFuKT1hcmNoL3BwYy9ib290Ci0JJChRKXJtIC1yZiBpbmNsdWRlMworCSMgVGVtcG9yYXJ5IGhhY2sgdW50aWwgd2UgaGF2ZSBtaWdyYXRlZCB0byBhc20tcG93ZXJwYworCSQoUSlybSAtcmYgYXJjaC8kKEFSQ0gpL2luY2x1ZGUKIAotcHJlcGFyZTogaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXRzLmggY2hlY2tiaW4KLQotYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBcCi0JCQkJICAgaW5jbHVkZS9jb25maWcvTUFSS0VSCi0KLWluY2x1ZGUvYXNtLSQoQVJDSCkvb2Zmc2V0cy5oOiBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCitwcmVwYXJlOiBjaGVja2JpbgogCiAjIFRlbXBvcmFyeSBoYWNrIHVudGlsIHdlIGhhdmUgbWlncmF0ZWQgdG8gYXNtLXBvd2VycGMKLWluY2x1ZGUvYXNtOiBpbmNsdWRlMy9hc20KLWluY2x1ZGUzL2FzbToKLQkkKFEpaWYgWyAhIC1kIGluY2x1ZGUzIF07IHRoZW4gbWtkaXIgLXAgaW5jbHVkZTM7IGZpCi0JJChRKWxuIC1mc24gJChzcmN0cmVlKS9pbmNsdWRlL2FzbS1wb3dlcnBjIGluY2x1ZGUzL2FzbQoraW5jbHVkZS9hc206IGFyY2gvJChBUkNIKS9pbmNsdWRlL2FzbQorYXJjaC8kKEFSQ0gpL2luY2x1ZGUvYXNtOgorCSQoUSlpZiBbICEgLWQgYXJjaC8kKEFSQ0gpL2luY2x1ZGUgXTsgdGhlbiBta2RpciAtcCBhcmNoLyQoQVJDSCkvaW5jbHVkZTsgZmkKKwkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLXBvd2VycGMgYXJjaC8kKEFSQ0gpL2luY2x1ZGUvYXNtCiAKICMgVXNlIHRoZSBmaWxlICcudG1wX2dhc19jaGVjaycgZm9yIGJpbnV0aWxzIHRlc3RzLCBhcyBnYXMgd29uJ3Qgb3V0cHV0CiAjIHRvIHN0ZG91dCBhbmQgdGhlc2UgY2hlY2tzIGFyZSBydW4gZXZlbiBvbiBpbnN0YWxsIHRhcmdldHMuCkBAIC0xNDMsNyArMTM5LDUgQEAKIAkJZmFsc2UgOyBcCiAJZmkKIAotQ0xFQU5fRklMRVMgKz0JaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXRzLmggXAotCQlhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMgXAotCQkkKFRPVVQpCitDTEVBTl9GSUxFUyArPSAkKFRPVVQpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3QvY29tbW9uL25zMTY1NTAuYyBiL2FyY2gvcHBjL2Jvb3QvY29tbW9uL25zMTY1NTAuYwppbmRleCA5MDE3YzU0Li4yNjgxOGJiIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9ib290L2NvbW1vbi9uczE2NTUwLmMKKysrIGIvYXJjaC9wcGMvYm9vdC9jb21tb24vbnMxNjU1MC5jCkBAIC0yMyw3ICsyMyw3IEBACiAKIHVuc2lnbmVkIGxvbmcgc2VyaWFsX2luaXQoaW50IGNoYW4sIHZvaWQgKmlnbm9yZWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBjb21fcG9ydDsKKwl1bnNpZ25lZCBsb25nIGNvbV9wb3J0LCBiYXNlX2JhdWQ7CiAJdW5zaWduZWQgY2hhciBsY3IsIGRsbTsKIAogCS8qIFdlIG5lZWQgdG8gZmluZCBvdXQgd2hpY2ggdHlwZSBpbyB3ZSdyZSBleHBlY3RpbmcuICBJZiBpdCdzCkBAIC00Myw2ICs0Myw4IEBACiAKIAkvKiBIb3cgZmFyIGFwYXJ0IHRoZSByZWdpc3RlcnMgYXJlLiAqLwogCXNoaWZ0ID0gcnNfdGFibGVbY2hhbl0uaW9tZW1fcmVnX3NoaWZ0OworCS8qIEJhc2UgYmF1ZC4uICovCisJYmFzZV9iYXVkID0gcnNfdGFibGVbY2hhbl0uYmF1ZF9iYXNlOwogCQogCS8qIHNhdmUgdGhlIExDUiAqLwogCWxjciA9IGluYihjb21fcG9ydCArIChVQVJUX0xDUiA8PCBzaGlmdCkpOwpAQCAtNjIsOSArNjQsOSBAQAogCWVsc2UgewogCQkvKiBJbnB1dCBjbG9jay4gKi8KIAkJb3V0Yihjb21fcG9ydCArIChVQVJUX0RMTCA8PCBzaGlmdCksCi0JCSAgICAgKEJBU0VfQkFVRCAvIFNFUklBTF9CQVVEKSAmIDB4RkYpOworCQkgICAgIChiYXNlX2JhdWQgLyBTRVJJQUxfQkFVRCkgJiAweEZGKTsKIAkJb3V0Yihjb21fcG9ydCArIChVQVJUX0RMTSA8PCBzaGlmdCksCi0JCSAgICAgKEJBU0VfQkFVRCAvIFNFUklBTF9CQVVEKSA+PiA4KTsKKwkJICAgICAoYmFzZV9iYXVkIC8gU0VSSUFMX0JBVUQpID4+IDgpOwogCQkvKiA4IGRhdGEsIDEgc3RvcCwgbm8gcGFyaXR5ICovCiAJCW91dGIoY29tX3BvcnQgKyAoVUFSVF9MQ1IgPDwgc2hpZnQpLCAweDAzKTsKIAkJLyogUlRTL0RUUiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvYm9vdC9jb21tb24vdXRpbC5TIGIvYXJjaC9wcGMvYm9vdC9jb21tb24vdXRpbC5TCmluZGV4IDQ3ZTY0MTQuLmM5NmM5ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3QvY29tbW9uL3V0aWwuUworKysgYi9hcmNoL3BwYy9ib290L2NvbW1vbi91dGlsLlMKQEAgLTI1Miw3ICsyNTIsNyBAQAogMToJZGNiZglyMCxyMwkJCSMgRmx1c2ggdGhlIGRhdGEgY2FjaGUKIAlpY2JpCXIwLHIzCQkJIyBJbnZhbGlkYXRlIHRoZSBpbnN0cnVjdGlvbiBjYWNoZQogCWFkZGkJcjMscjMsMHgxMAkJIyBJbmNyZW1lbnQgYnkgb25lIGNhY2hlIGxpbmUKLQljbXBsd2kJY3IwLHIzLHI0CQkjIEFyZSB3ZSBhdCB0aGUgZW5kIHlldD8KKwljbXBsdwljcjAscjMscjQJCSMgQXJlIHdlIGF0IHRoZSBlbmQgeWV0PwogCWJsdAkxYgkJCSMgTm8sIGtlZXAgZmx1c2hpbmcgYW5kIGludmFsaWRhdGluZwogI2Vsc2UKIAkvKiBFbmFibGUsIGludmFsaWRhdGUgYW5kIHRoZW4gZGlzYWJsZSB0aGUgTDEgaWNhY2hlL2RjYWNoZS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL01ha2VmaWxlIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvTWFrZWZpbGUKaW5kZXggZDRkYzRmYS4uYjdiZDhmNiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYm9vdC9zaW1wbGUvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvTWFrZWZpbGUKQEAgLTk2LDEwICs5Niw2IEBACiB6aW1hZ2Vpbml0cmQtJChDT05GSUdfR0VNSU5JKQkJOj0gekltYWdlLmluaXRyZC1TVFJJUEVMRgogICAgICAgICAgZW5kLSQoQ09ORklHX0dFTUlOSSkJCTo9IGdlbWluaQogCi0gICAgIGV4dHJhLm8tJChDT05GSUdfSzIpCQk6PSBwcmVwbWFwLm8KLSAgICAgICAgIGVuZC0kKENPTkZJR19LMikJCTo9IGsyCi0gICBjYWNoZWZsYWctJChDT05GSUdfSzIpCQk6PSAtaW5jbHVkZSAkKGNsZWFyX0wyX0wzKQotCiAgICAgIGV4dHJhLm8tJChDT05GSUdfS0FUQU5BKQkJOj0gbWlzYy1rYXRhbmEubwogICAgICAgICAgZW5kLSQoQ09ORklHX0tBVEFOQSkJCTo9IGthdGFuYQogICAgY2FjaGVmbGFnLSQoQ09ORklHX0tBVEFOQSkJCTo9IC1pbmNsdWRlICQoY2xlYXJfTDJfTDMpCkBAIC0xMDgsMTIgKzEwNCwxNSBAQAogICAgICAgICAgZW5kLSQoQ09ORklHX1JBRFNUT05FX1BQQzdEKQk6PSByYWRzdG9uZV9wcGM3ZAogICAgY2FjaGVmbGFnLSQoQ09ORklHX1JBRFNUT05FX1BQQzdEKQk6PSAtaW5jbHVkZSAkKGNsZWFyX0wyX0wzKQogCisgICAgIGV4dHJhLm8tJChDT05GSUdfRVY2NDM2MCkgICAgICAgICAgOj0gbWlzYy1ldjY0MzYwLm8KKyAgICAgICAgIGVuZC0kKENPTkZJR19FVjY0MzYwKSAgICAgICAgICA6PSBldjY0MzYwCisgICBjYWNoZWZsYWctJChDT05GSUdfRVY2NDM2MCkgICAgICAgICAgOj0gLWluY2x1ZGUgJChjbGVhcl9MMl9MMykKKwogIyBrY29uZmlnICdmZWF0dXJlJywgb25seSBvbmUgb2YgdGhlc2Ugd2lsbCBldmVyIGJlICd5JyBhdCBhIHRpbWUuCiAjIFRoZSByZXN0IHdpbGwgYmUgdW5zZXQuCi1tb3Rvcm9sYSA6PSAkKENPTkZJR19NQ1BONzY1KSQoQ09ORklHX01WTUU1MTAwKSQoQ09ORklHX1BSUE1DNzUwKSBcCittb3Rvcm9sYSA6PSAkKENPTkZJR19NVk1FNTEwMCkkKENPTkZJR19QUlBNQzc1MCkgXAogJChDT05GSUdfUFJQTUM4MDApJChDT05GSUdfTE9QRUMpJChDT05GSUdfUFBMVVMpCiBtb3Rvcm9sYSA6PSAkKHN0cmlwICQobW90b3JvbGEpKQotcGNvcmUgOj0gJChDT05GSUdfUENPUkUpJChDT05GSUdfUE9XRVJQTUMyNTApCiAKICAgICAgIHppbWFnZS0kKG1vdG9yb2xhKQkJOj0gekltYWdlLVBQTFVTCiB6aW1hZ2Vpbml0cmQtJChtb3Rvcm9sYSkJCTo9IHpJbWFnZS5pbml0cmQtUFBMVVMKQEAgLTEyMywxMiArMTIyLDYgQEAKICAgICAgZXh0cmEuby0kKENPTkZJR19QUExVUykJCTo9IHByZXBtYXAubwogICAgICBleHRyYS5vLSQoQ09ORklHX0xPUEVDKQkJOj0gbXBjMTB4X21lbW9yeS5vCiAKLSAgICAgIHppbWFnZS0kKHBjb3JlKQkJCTo9IHpJbWFnZS1TVFJJUEVMRgotemltYWdlaW5pdHJkLSQocGNvcmUpCQkJOj0gekltYWdlLmluaXRyZC1TVFJJUEVMRgotICAgICBleHRyYS5vLSQocGNvcmUpCQkJOj0gY2hycG1hcC5vCi0gICAgICAgICBlbmQtJChwY29yZSkJCQk6PSBwY29yZQotICAgY2FjaGVmbGFnLSQocGNvcmUpCQkJOj0gLWluY2x1ZGUgJChjbGVhcl9MMl9MMykKLQogIyBSZWFsbHkgb25seSB2YWxpZCBpZiBDT05GSUdfNnh4PXkKICAgICAgIHppbWFnZS0kKENPTkZJR19QUENfUFJFUCkJCTo9IHpJbWFnZS1QUExVUwogemltYWdlaW5pdHJkLSQoQ09ORklHX1BQQ19QUkVQKQkJOj0gekltYWdlLmluaXRyZC1QUExVUwpAQCAtMTU4LDggKzE1MSw2IEBACiAKICMgVGhpcyBpcyBhIHRyZWVib290IHRoYXQgbmVlZHMgaW5pdCBmdW5jdGlvbnMgdW50aWwgdGhlCiAjIGJvb3Qgcm9tIGlzIHNvcnRlZCBvdXQgKGkuZS4gdGhpcyBpcyBzaG9ydCBsaXZlZCkKLWV4dHJhLWFmbGFncy0kKENPTkZJR19SRURXT09EXzQpCTo9IC1XYSwtbTQwNQotZXh0cmEuby0kKENPTkZJR19SRURXT09EXzQpCQk6PSBydzQvcnc0X2luaXQubyBydzQvcnc0X2luaXRfYnJkLm8KIEVYVFJBX0FGTEFHUyA6PSAkKGV4dHJhLWFmbGFncy15KQogIyBoZWFkLm8gbmVlZHMgdG8gZ2V0IHRoZSBjYWNoZWZsYWdzIGRlZmluZWQuCiBBRkxBR1NfaGVhZC5vCQkJCSs9ICQoY2FjaGVmbGFnLXkpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L3NpbXBsZS9lbWJlZF9jb25maWcuYyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL2VtYmVkX2NvbmZpZy5jCmluZGV4IGMzNDJiNDcuLjQ5MWE2OTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL2VtYmVkX2NvbmZpZy5jCisrKyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL2VtYmVkX2NvbmZpZy5jCkBAIC03ODQsMjggKzc4NCwxMiBAQAogI2lmZGVmIENPTkZJR19JQk1fT1BFTkJJT1MKIC8qIFRoaXMgY291bGQgcG9zc2libHkgd29yayBmb3IgYWxsIHRyZWVib290IHJvbXMuCiAqLwotI2lmIGRlZmluZWQoQ09ORklHX0FTSCkgfHwgZGVmaW5lZChDT05GSUdfQkVFQ0gpIHx8IGRlZmluZWQoQ09ORklHX0JVQklOR0EpCisjaWYgZGVmaW5lZChDT05GSUdfQlVCSU5HQSkKICNkZWZpbmUgQk9BUkRfSU5GT19WRUNUT1IgICAgICAgMHhGRkY4MEI1MCAvKiBvcGVuYmlvcyAxLjE5IG1vdmVkIHRoaXMgdmVjdG9yIGRvd24gIC0gYXJtaW4gKi8KICNlbHNlCiAjZGVmaW5lIEJPQVJEX0lORk9fVkVDVE9SCTB4RkZGRTBCNTAKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0JFRUNICi1zdGF0aWMgdm9pZAotZ2V0X2JvYXJkX2luZm8oYmRfdCAqKmJkcCkKLXsKLQl0eXBlZGVmIHZvaWQgKCpQRlYpKGJkX3QgKmJkKTsKLQkoKFBGVikoKih1bnNpZ25lZCBsb25nICopQk9BUkRfSU5GT19WRUNUT1IpKSgqYmRwKTsKLQlyZXR1cm47Ci19Ci0KLXZvaWQKLWVtYmVkX2NvbmZpZyhiZF90ICoqYmRwKQotewotICAgICAgICAqYmRwID0gJmJkaW5mbzsKLQlnZXRfYm9hcmRfaW5mbyhiZHApOwotfQotI2Vsc2UgLyogIUNPTkZJR19CRUVDSCAqLwogdm9pZAogZW1iZWRfY29uZmlnKGJkX3QgKipiZHApCiB7CkBAIC04NjAsNyArODQ0LDYgQEAKICNlbmRpZgogCXRpbWViYXNlX3BlcmlvZF9ucyA9IDEwMDAwMDAwMDAgLyBiZC0+YmlfdGJmcmVxOwogfQotI2VuZGlmIC8qIENPTkZJR19CRUVDSCAqLwogI2VuZGlmIC8qIENPTkZJR19JQk1fT1BFTkJJT1MgKi8KIAogI2lmZGVmIENPTkZJR19FUDQwNQpAQCAtOTQzLDM5ICs5MjYsMyBAQAogI2VuZGlmCiB9CiAjZW5kaWYKLQotI2lmZGVmIENPTkZJR19SQUlOSUVSCi0vKiBSYWluaWVyIHVzZXMgdnh3b3JrcyBib290cm9tICovCi12b2lkCi1lbWJlZF9jb25maWcoYmRfdCAqKmJkcCkKLXsKLQl1X2NoYXIJKmNwOwotCWludAlpOwotCWJkX3QJKmJkOwotCQotCWJkID0gJmJkaW5mbzsKLQkqYmRwID0gYmQ7Ci0JCi0JZm9yKGk9MDtpPDgxOTI7aSs9MzIpIHsKLQkJX19hc21fXygiZGNjY2kgMCwlMCIgOjogInIiIChpKSk7Ci0JfQotCV9fYXNtX18oImljY2NpIDAsMCIpOwotCV9fYXNtX18oInN5bmM7aXN5bmMiKTsKLQotCS8qIGluaXQgcmFtIGZvciBwYXJpdHkgKi8KLQltZW1zZXQoMCwgMCwweDQwMDAwMCk7ICAvKiBMbyBtZW1vcnkgKi8KLQotCi0JYmQtPmJpX21lbXNpemUgICA9ICgzMiAqIDEwMjQgKiAxMDI0KSA7Ci0JYmQtPmJpX2ludGZyZXEgPSAxMzMwMDAwMDA7IC8vdGhlIGludGVybmFsIGNsb2NrIGlzIDEzMyBNSHoKLQliZC0+YmlfYnVzZnJlcSAgID0gMTAwMDAwMDAwOwotCWJkLT5iaV9wY2lfYnVzZnJlcT0gMzMwMDAwMDA7Ci0KLQljcCA9ICh1X2NoYXIgKilkZWZfZW5ldF9hZGRyOwotCWZvciAoaT0wOyBpPDY7IGkrKykgewotCQliZC0+YmlfZW5ldGFkZHJbaV0gPSAqY3ArKzsKLQl9Ci0KLX0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L3NpbXBsZS9oZWFkLlMgYi9hcmNoL3BwYy9ib290L3NpbXBsZS9oZWFkLlMKaW5kZXggNTI0MDUzMi4uNWU0YWRjMiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYm9vdC9zaW1wbGUvaGVhZC5TCisrKyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL2hlYWQuUwpAQCAtMTIwLDE1ICsxMjAsNiBAQAogCW10c3ByCVNQUk5fREVSLHI0CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19SRURXT09EXzQKLQkvKiBBbGwgb2YgdGhpcyBSZWR3b29kIDQgc3R1ZmYgd2lsbCBzb29uIGRpc2FwcGVhciB3aGVuIHRoZQotCSAqIGJvb3Qgcm9tIGlzIHN0cmFpZ2h0ZW5lZCBvdXQuCi0JICovCi0JbXIJcjI5LCByMwkJLyogRWFzaWVyIHRoYW4gY2hhbmdpbmcgdGhlIG90aGVyIGNvZGUgKi8KLQlibAlIZHdJbml0Ci0JbXIJcjMsIHIyOQotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19NQlgpIHx8IGRlZmluZWQoQ09ORklHX1JQWDgyNjApIHx8IGRlZmluZWQoQ09ORklHX1BQQ19QUkVQKQogCW1yCXI0LHIyOQkvKiBwdXQgdGhlIGJvYXJkIGluZm8gcG9pbnRlciB3aGVyZSB0aGUgcmVsb2NhdGUKIAkJCSAqIHJvdXRpbmUgd2lsbCBmaW5kIGl0CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L3NpbXBsZS9taXNjLWNwY2k2OTAuYyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2MtY3BjaTY5MC5jCmluZGV4IGVmMDhlODYuLjI2ODYwMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2MtY3BjaTY5MC5jCisrKyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2MtY3BjaTY5MC5jCkBAIC0xMiwxNiArMTIsNTYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxwbGF0Zm9ybXMvY3BjaTY5MC5oPgogCisjZGVmaW5lCUtCCSgxMDI0VUwpCisjZGVmaW5lCU1CCSgxMDI0VUwqS0IpCisjZGVmaW5lCUdCCSgxMDI0VUwqTUIpCisKIGV4dGVybiB1MzIgbXY2NHg2MF9jb25zb2xlX2JhdWQ7CiBleHRlcm4gdTMyIG12NjR4NjBfbXBzY19jbGtfc3JjOwogZXh0ZXJuIHUzMiBtdjY0eDYwX21wc2NfY2xrX2ZyZXE7CiAKK3UzMiBtYWcgPSAweGZmZmY7CisKK3Vuc2lnbmVkIGxvbmcKK2dldF9tZW1fc2l6ZSh2b2lkKQoreworCXUzMglzaXplOworCisJc3dpdGNoIChpbl84KCgodm9pZCBfX2lvbWVtICopQ1BDSTY5MF9CUl9CQVNFICsgQ1BDSTY5MF9CUl9NRU1fQ1RMUikpCisJCQkmIDB4MDcpIHsKKwljYXNlIDB4MDE6CisJCXNpemUgPSAyNTYqTUI7CisJCWJyZWFrOworCWNhc2UgMHgwMjoKKwkJc2l6ZSA9IDUxMipNQjsKKwkJYnJlYWs7CisJY2FzZSAweDAzOgorCQlzaXplID0gNzY4Kk1COworCQlicmVhazsKKwljYXNlIDB4MDQ6CisJCXNpemUgPSAxKkdCOworCQlicmVhazsKKwljYXNlIDB4MDU6CisJCXNpemUgPSAxKkdCICsgNTEyKk1COworCQlicmVhazsKKwljYXNlIDB4MDY6CisJCXNpemUgPSAyKkdCOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzaXplID0gMDsKKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKwogdm9pZAogbXY2NHg2MF9ib2FyZF9pbml0KHZvaWQgX19pb21lbSAqb2xkX2Jhc2UsIHZvaWQgX19pb21lbSAqbmV3X2Jhc2UpCiB7CiAJbXY2NHg2MF9jb25zb2xlX2JhdWQgPSBDUENJNjkwX01QU0NfQkFVRDsKIAltdjY0eDYwX21wc2NfY2xrX3NyYyA9IENQQ0k2OTBfTVBTQ19DTEtfU1JDOwotCW12NjR4NjBfbXBzY19jbGtfZnJlcSA9IENQQ0k2OTBfQlVTX0ZSRVE7CisJbXY2NHg2MF9tcHNjX2Nsa19mcmVxID0KKwkJKGdldF9tZW1fc2l6ZSgpID49ICgxKkdCKSkgPyAxMDAwMDAwMDAgOiAxMzMzMzMzMzM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L3NpbXBsZS9taXNjLWV2NjQzNjAuYyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2MtZXY2NDM2MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMWNjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3BwYy9ib290L3NpbXBsZS9taXNjLWV2NjQzNjAuYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogYXJjaC9wcGMvYm9vdC9zaW1wbGUvbWlzYy1ldjY0MzYwLmMKKyAqIENvcHlyaWdodCAoQykgMjAwNSBMZWUgTmlja3MgPGFsbGludXhAZ21haWwuY29tPgorICoKKyAqIEJhc2VkIG9uIGFyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2Mta2F0YW5hLmMgZnJvbToKKyAqIE1hcmsgQS4gR3JlZXIgPHNvdXJjZUBtdmlzdGEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tdjY0eDYwX2RlZnMuaD4KKyNpbmNsdWRlIDxwbGF0Zm9ybXMvZXY2NDM2MC5oPgorCitleHRlcm4gdTMyIG12NjR4NjBfY29uc29sZV9iYXVkOworZXh0ZXJuIHUzMiBtdjY0eDYwX21wc2NfY2xrX3NyYzsKK2V4dGVybiB1MzIgbXY2NHg2MF9tcHNjX2Nsa19mcmVxOworCisvKiBOb3QgaW4gdGhlIGtlcm5lbCBzbyB3b24ndCBpbmNsdWRlIGtlcm5lbC5oIHRvIGdldCBpdHMgJ21pbicgZGVmaW5pdGlvbiAqLworI2lmbmRlZiBtaW4KKyNkZWZpbmUJbWluKGEsYikJKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisKK3ZvaWQKK212NjR4NjBfYm9hcmRfaW5pdCh2b2lkIF9faW9tZW0gKm9sZF9iYXNlLCB2b2lkIF9faW9tZW0gKm5ld19iYXNlKQoreworCW12NjR4NjBfY29uc29sZV9iYXVkICA9IEVWNjQzNjBfREVGQVVMVF9CQVVEOworCW12NjR4NjBfbXBzY19jbGtfc3JjICA9IEVWNjQzNjBfTVBTQ19DTEtfU1JDOworCW12NjR4NjBfbXBzY19jbGtfZnJlcSA9IEVWNjQzNjBfTVBTQ19DTEtfRlJFUTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2Mta2F0YW5hLmMgYi9hcmNoL3BwYy9ib290L3NpbXBsZS9taXNjLWthdGFuYS5jCmluZGV4IGI2ZTFiYjguLmVjOTRhMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2Mta2F0YW5hLmMKKysrIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvbWlzYy1rYXRhbmEuYwpAQCAtMjYsNiArMjYsOCBAQAogI2RlZmluZQltaW4oYSxiKQkoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCiAjZW5kaWYKIAordW5zaWduZWQgbG9uZyBtdjY0MzYwX2dldF9tZW1fc2l6ZSh2b2lkKTsKKwogdm9pZAogbXY2NHg2MF9ib2FyZF9pbml0KHZvaWQgX19pb21lbSAqb2xkX2Jhc2UsIHZvaWQgX19pb21lbSAqbmV3X2Jhc2UpCiB7CkBAIC0zNSwzICszNyw5IEBACiAJCW1pbihrYXRhbmFfYnVzX2ZyZXEoKHZvaWQgX19pb21lbSAqKUtBVEFOQV9DUExEX0JBU0UpLAogCQkJTVY2NHg2MF9UQ0xLX0ZSRVFfTUFYKTsKIH0KKwordW5zaWduZWQgbG9uZworZ2V0X21lbV9zaXplKHZvaWQpCit7CisJcmV0dXJuIG12NjQzNjBfZ2V0X21lbV9zaXplKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L3NpbXBsZS9taXNjLW12NjR4NjAuYyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2MtbXY2NHg2MC5jCmluZGV4IDdlODhmYzYuLjI1OGQ0NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2MtbXY2NHg2MC5jCisrKyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2MtbXY2NHg2MC5jCkBAIC0xOSw2ICsxOSwzMyBAQAogZXh0ZXJuIHN0cnVjdCBiaV9yZWNvcmQgKmRlY29tcHJlc3Nfa2VybmVsKHVuc2lnbmVkIGxvbmcgbG9hZF9hZGRyLAogCWludCBudW1fd29yZHMsIHVuc2lnbmVkIGxvbmcgY2tzdW0pOwogCisKK3UzMiBzaXplX3JlZ1tNVjY0eDYwX0NQVTJNRU1fV0lORE9XU10gPSB7CisJTVY2NHg2MF9DUFUyTUVNXzBfU0laRSwgTVY2NHg2MF9DUFUyTUVNXzFfU0laRSwKKwlNVjY0eDYwX0NQVTJNRU1fMl9TSVpFLCBNVjY0eDYwX0NQVTJNRU1fM19TSVpFCit9OworCisvKiBSZWFkIG1lbSBjdGxyIHRvIGdldCB0aGUgYW1vdW50IG9mIG1lbSBpbiBzeXN0ZW0gKi8KK3Vuc2lnbmVkIGxvbmcKK212NjQzNjBfZ2V0X21lbV9zaXplKHZvaWQpCit7CisJdTMyCWVuYWJsZXMsIGksIHY7CisJdTMyCW1lbSA9IDA7CisKKwllbmFibGVzID0gaW5fbGUzMigodm9pZCBfX2lvbWVtICopQ09ORklHX01WNjRYNjBfTkVXX0JBU0UgKworCQlNVjY0MzYwX0NQVV9CQVJfRU5BQkxFKSAmIDB4ZjsKKworCWZvciAoaT0wOyBpPE1WNjR4NjBfQ1BVMk1FTV9XSU5ET1dTOyBpKyspCisJCWlmICghKGVuYWJsZXMgJiAoMTw8aSkpKSB7CisJCQl2ID0gaW5fbGUzMigodm9pZCBfX2lvbWVtICopQ09ORklHX01WNjRYNjBfTkVXX0JBU0UKKwkJCQkrIHNpemVfcmVnW2ldKSAmIDB4ZmZmZjsKKwkJCXYgPSAodiArIDEpIDw8IDE2OworCQkJbWVtICs9IHY7CisJCX0KKworCXJldHVybiBtZW07Cit9CisKIHZvaWQKIG12NjR4NjBfbW92ZV9iYXNlKHZvaWQgX19pb21lbSAqb2xkX2Jhc2UsIHZvaWQgX19pb21lbSAqbmV3X2Jhc2UpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L3NpbXBsZS9tdjY0eDYwX3R0eS5jIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvbXY2NHg2MF90dHkuYwppbmRleCA1YjQ1ZWI0Li5iOWMyNGQ0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9ib290L3NpbXBsZS9tdjY0eDYwX3R0eS5jCisrKyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL212NjR4NjBfdHR5LmMKQEAgLTIyLDkgKzIyLDE2IEBACiAjaW5jbHVkZSA8YXNtL212NjR4NjBfZGVmcy5oPgogI2luY2x1ZGUgPG1wc2NfZGVmcy5oPgogCisjaWZkZWYgQ09ORklHX0VWNjQzNjAKKyNpbmNsdWRlIDxwbGF0Zm9ybXMvZXY2NDM2MC5oPgordTMyCW12NjR4NjBfY29uc29sZV9iYXVkID0gRVY2NDM2MF9ERUZBVUxUX0JBVUQ7Cit1MzIJbXY2NHg2MF9tcHNjX2Nsa19zcmMgPSBFVjY0MzYwX01QU0NfQ0xLX1NSQzsgLyogVENMSyAqLwordTMyCW12NjR4NjBfbXBzY19jbGtfZnJlcSA9IEVWNjQzNjBfTVBTQ19DTEtfRlJFUTsKKyNlbHNlCiB1MzIJbXY2NHg2MF9jb25zb2xlX2JhdWQgPSA5NjAwOwogdTMyCW12NjR4NjBfbXBzY19jbGtfc3JjID0gODsgLyogVENMSyAqLwogdTMyCW12NjR4NjBfbXBzY19jbGtfZnJlcSA9IDEwMDAwMDAwMDsKKyNlbmRpZgogCiBleHRlcm4gdm9pZCB1ZGVsYXkobG9uZyk7CiBzdGF0aWMgdm9pZCBzdG9wX2RtYShpbnQgY2hhbik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL1NNODUwX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvU004NTBfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjE4ODRiLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL2NvbmZpZ3MvU004NTBfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMKLUNPTkZJR19NTVU9eQotQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKLUNPTkZJR19IQVZFX0RFQ19MT0NLPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19GVVRFWD15Ci0jIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLUNPTkZJR19NT0RVTEVfVU5MT0FEPXkKLSMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAotQ09ORklHX09CU09MRVRFX01PRFBBUk09eQotIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAotQ09ORklHX0tNT0Q9eQotCi0jCi0jIFBsYXRmb3JtIHN1cHBvcnQKLSMKLUNPTkZJR19QUEM9eQotQ09ORklHX1BQQzMyPXkKLSMgQ09ORklHXzZ4eCBpcyBub3Qgc2V0Ci0jIENPTkZJR180MHggaXMgbm90IHNldAotIyBDT05GSUdfUE9XRVIzIGlzIG5vdCBzZXQKLUNPTkZJR184eHg9eQotCi0jCi0jIElCTSA0eHggb3B0aW9ucwotIwotQ09ORklHX0VNQkVEREVEQk9PVD15Ci1DT05GSUdfU0VSSUFMX0NPTlNPTEU9eQotQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRT15Ci0jIENPTkZJR19SUFhMSVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JQWENMQVNTSUMgaXMgbm90IHNldAotIyBDT05GSUdfQlNFSVAgaXMgbm90IHNldAotIyBDT05GSUdfRkFEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUU04MjNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RRTTg1MEwgaXMgbm90IHNldAotIyBDT05GSUdfVFFNODU1TCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUU04NjBMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZQUzg1MEwgaXMgbm90IHNldAotIyBDT05GSUdfU1BEODIzVFMgaXMgbm90IHNldAotIyBDT05GSUdfSVZNUzggaXMgbm90IHNldAotIyBDT05GSUdfSVZNTDI0IGlzIG5vdCBzZXQKLUNPTkZJR19TTTg1MD15Ci0jIENPTkZJR19IRVJNRVNfUFJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQODYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xXTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDVV9FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQU5URUMgaXMgbm90IHNldAotIyBDT05GSUdfTUJYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dJTkNFUFQgaXMgbm90IHNldAotQ09ORklHX1RRTTh4eEw9eQotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotQ09ORklHX01BVEhfRU1VTEFUSU9OPXkKLSMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi0jIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0lfRE9NQUlOUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0lfUVNQQU4gaXMgbm90IHNldAotQ09ORklHX0tDT1JFX0VMRj15Ci1DT05GSUdfQklORk1UX0VMRj15Ci1DT05GSUdfS0VSTkVMX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0iY29uc29sZT10dHlDUE0xIgotCi0jCi0jIEFkdmFuY2VkIHNldHVwCi0jCi0jIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKLQotIwotIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKLSMKLUNPTkZJR19ISUdITUVNX1NUQVJUPTB4ZmUwMDAwMDAKLUNPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCi1DT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKLUNPTkZJR19UQVNLX1NJWkU9MHg4MDAwMDAwMAotQ09ORklHX0JPT1RfTE9BRD0weDAwNDAwMDAwCi0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BOUCBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgZGV2aWNlcwotIwotIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0lERS9NRk0vUkxMIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lERSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTmV0d29ya2luZyBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci0jIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAotIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FQ04gaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi1DT05GSUdfSVBWNl9TQ1RQX189eQotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9IV19GTE9XQ09OVFJPTCBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotIyBDT05GSUdfRVRIRVJUQVAgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotQ09ORklHX05FVF9FVEhFUk5FVD15Ci0jIENPTkZJR19NSUkgaXMgbm90IHNldAotIyBDT05GSUdfT0FLTkVUIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMgKGRlcGVuZHMgb24gTExDPXkpCi0jCi0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCi0jIENPTkZJR19XQU4gaXMgbm90IHNldAotCi0jCi0jIEFtYXRldXIgUmFkaW8gc3VwcG9ydAotIwotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotCi0jCi0jIElyREEgKGluZnJhcmVkKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwotIyBDT05GSUdfSVNETl9CT09MIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19GQiBpcyBub3Qgc2V0Ci0KLSMKLSMgT2xkIENELVJPTSBkcml2ZXJzIChub3QgU0NTSSwgbm90IElERSkKLSMKLSMgQ09ORklHX0NEX05PX0lERVNDU0kgaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotCi0jCi0jIElucHV0IEkvTyBkcml2ZXJzCi0jCi0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgTWFjaW50b3NoIGRldmljZSBkcml2ZXJzCi0jCi0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLSMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF9DUE09eQotQ09ORklHX1NFUklBTF9DUE1fQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfQ1BNX1NDQzEgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9DUE1fU0NDMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfQ1BNX1NDQzQgaXMgbm90IHNldAotQ09ORklHX1NFUklBTF9DUE1fU01DMT15Ci1DT05GSUdfU0VSSUFMX0NQTV9TTUMyPXkKLUNPTkZJR19TRVJJQUxfQ1BNX0FMVF9TTUMyPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci0jIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIEhhcmR3YXJlIFNlbnNvcnMgTWFpbmJvYXJkIHN1cHBvcnQKLSMKLQotIwotIyBJMkMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQ19TRU5TT1IgaXMgbm90IHNldAotCi0jCi0jIE1pY2UKLSMKLSMgQ09ORklHX0JVU01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FJQzAyX1RBUEUgaXMgbm90IHNldAotCi0jCi0jIElQTUkKLSMKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5fUlRDPXkKLSMgQ09ORklHX0dFTl9SVENfWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKLSMgQ09ORklHX0ZUQVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FHUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk0gaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU5HQ0hFQ0tfVElNRVIgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLQotIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCi0jCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUM19GUz15Ci1DT05GSUdfRVhUM19GU19YQVRUUj15Ci0jIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLUNPTkZJR19KQkQ9eQotIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19GU19NQkNBQ0hFPXkKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19GQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUFRTX0ZTPXkKLSMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAotIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKLUNPTkZJR19ORlNfRlM9eQotIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotIyBDT05GSUdfRVhQT1JURlMgaXMgbm90IHNldAotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19TVU5SUENfR1NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOVEVSTUVaWk9fRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLUNPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQotIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX01TRE9TX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FQzk4X1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIE1QQzh4eCBDUE0gT3B0aW9ucwotIwotQ09ORklHX1NDQ19FTkVUPXkKLSMgQ09ORklHX1NDQzFfRU5FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ0MyX0VORVQgaXMgbm90IHNldAotQ09ORklHX1NDQzNfRU5FVD15Ci0jIENPTkZJR19GRUNfRU5FVCBpcyBub3Qgc2V0Ci1DT05GSUdfRU5FVF9CSUdfQlVGRkVSUz15Ci0KLSMKLSMgR2VuZXJpYyBNUEM4eHggT3B0aW9ucwotIwotQ09ORklHXzh4eF9DT1BZQkFDSz15Ci1DT05GSUdfOHh4X0NQVTY9eQotIyBDT05GSUdfVUNPREVfUEFUQ0ggaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBCbHVldG9vdGggc3VwcG9ydAotIwotIyBDT05GSUdfQlQgaXMgbm90IHNldAotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0KLSMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCi0jCi0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9TUEQ4MjNUU19kZWZjb25maWcgYi9hcmNoL3BwYy9jb25maWdzL1NQRDgyM1RTX2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2MGZlYS4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYy9jb25maWdzL1NQRDgyM1RTX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jCi1DT05GSUdfTU1VPXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci1DT05GSUdfSEFWRV9ERUNfTE9DSz15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLUNPTkZJR19FTUJFRERFRD15Ci1DT05GSUdfRlVURVg9eQotIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCi1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKLSMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKLUNPTkZJR19LTU9EPXkKLQotIwotIyBQbGF0Zm9ybSBzdXBwb3J0Ci0jCi1DT05GSUdfUFBDPXkKLUNPTkZJR19QUEMzMj15Ci0jIENPTkZJR182eHggaXMgbm90IHNldAotIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BPV0VSMyBpcyBub3Qgc2V0Ci1DT05GSUdfOHh4PXkKLQotIwotIyBJQk0gNHh4IG9wdGlvbnMKLSMKLUNPTkZJR19FTUJFRERFREJPT1Q9eQotQ09ORklHX1NFUklBTF9DT05TT0xFPXkKLUNPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEU9eQotIyBDT05GSUdfUlBYTElURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SUFhDTEFTU0lDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JTRUlQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZBRFMgaXMgbm90IHNldAotIyBDT05GSUdfVFFNODIzTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUU04NTBMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RRTTg1NUwgaXMgbm90IHNldAotIyBDT05GSUdfVFFNODYwTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GUFM4NTBMIGlzIG5vdCBzZXQKLUNPTkZJR19TUEQ4MjNUUz15Ci0jIENPTkZJR19JVk1TOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JVk1MMjQgaXMgbm90IHNldAotIyBDT05GSUdfU004NTAgaXMgbm90IHNldAotIyBDT05GSUdfSEVSTUVTX1BSTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUDg2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MV01PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ1VfRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQ00gaXMgbm90IHNldAotIyBDT05GSUdfTEFOVEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX01CWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XSU5DRVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19NQVRIX0VNVUxBVElPTj15Ci0jIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfUENJX0RPTUFJTlMgaXMgbm90IHNldAotIyBDT05GSUdfUENJX1FTUEFOIGlzIG5vdCBzZXQKLUNPTkZJR19LQ09SRV9FTEY9eQotQ09ORklHX0JJTkZNVF9FTEY9eQotQ09ORklHX0tFUk5FTF9FTEY9eQotIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0Ci0KLSMKLSMgQWR2YW5jZWQgc2V0dXAKLSMKLSMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAotCi0jCi0jIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAotIwotQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAotQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKLUNPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAotQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCi1DT05GSUdfQk9PVF9MT0FEPTB4MDA0MDAwMDAKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi0jIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBBVEEvSURFL01GTS9STEwgc3VwcG9ydAotIwotIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBJMk8gZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKLSMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotQ09ORklHX1BBQ0tFVD15Ci0jIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci0jIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLSMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VDTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLUNPTkZJR19JUFY2X1NDVFBfXz15Ci0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0hXX0ZMT1dDT05UUk9MIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVEhFUlRBUCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCi1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLSMgQ09ORklHX01JSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQUtORVQgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCi0KLSMKLSMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCi0jCi0jIENPTkZJR19QUFAgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCi0jCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcyAoZGVwZW5kcyBvbiBMTEM9eSkKLSMKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQW1hdGV1ciBSYWRpbyBzdXBwb3J0Ci0jCi0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSXJEQSAoaW5mcmFyZWQpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROX0JPT0wgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLQotIwotIyBPbGQgQ0QtUk9NIGRyaXZlcnMgKG5vdCBTQ1NJLCBub3QgSURFKQotIwotIyBDT05GSUdfQ0RfTk9fSURFU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi0KLSMKLSMgSW5wdXQgSS9PIGRyaXZlcnMKLSMKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci0jIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKLSMKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMX0NQTT15Ci1DT05GSUdfU0VSSUFMX0NQTV9DT05TT0xFPXkKLSMgQ09ORklHX1NFUklBTF9DUE1fU0NDMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfQ1BNX1NDQzIgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9DUE1fU0NDNCBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSUFMX0NQTV9TTUMxPXkKLSMgQ09ORklHX1NFUklBTF9DUE1fU01DMiBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSUFMX0NQTV9BTFRfU01DMj15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIEkyQyBIYXJkd2FyZSBTZW5zb3JzIE1haW5ib2FyZCBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJDIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkNfU0VOU09SIGlzIG5vdCBzZXQKLQotIwotIyBNaWNlCi0jCi0jIENPTkZJR19CVVNNT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19RSUMwMl9UQVBFIGlzIG5vdCBzZXQKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi0jIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci1DT05GSUdfR0VOX1JUQz15Ci0jIENPTkZJR19HRU5fUlRDX1ggaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCi0jIENPTkZJR19GVEFQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BR1AgaXMgbm90IHNldAotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfSEFOR0NIRUNLX1RJTUVSIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLSMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAotQ09ORklHX0VYVDNfRlM9eQotQ09ORklHX0VYVDNfRlNfWEFUVFI9eQotIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0Ci1DT05GSUdfSkJEPXkKLSMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfRlNfTUJDQUNIRT15Ci0jIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfRkFUX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0RFVlBUU19GUz15Ci0jIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAotQ09ORklHX1RNUEZTPXkKLUNPTkZJR19SQU1GUz15Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwotIwotIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi1DT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci1DT05GSUdfUk9PVF9ORlM9eQotQ09ORklHX0xPQ0tEPXkKLSMgQ09ORklHX0VYUE9SVEZTIGlzIG5vdCBzZXQKLUNPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfU1VOUlBDX0dTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlRFUk1FWlpPX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NU0RPU19QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORUM5OF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBNUEM4eHggQ1BNIE9wdGlvbnMKLSMKLUNPTkZJR19TQ0NfRU5FVD15Ci0jIENPTkZJR19TQ0MxX0VORVQgaXMgbm90IHNldAotQ09ORklHX1NDQzJfRU5FVD15Ci0jIENPTkZJR19TQ0MzX0VORVQgaXMgbm90IHNldAotIyBDT05GSUdfRkVDX0VORVQgaXMgbm90IHNldAotQ09ORklHX0VORVRfQklHX0JVRkZFUlM9eQotCi0jCi0jIEdlbmVyaWMgTVBDOHh4IE9wdGlvbnMKLSMKLUNPTkZJR184eHhfQ09QWUJBQ0s9eQotIyBDT05GSUdfOHh4X0NQVTYgaXMgbm90IHNldAotIyBDT05GSUdfVUNPREVfUEFUQ0ggaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBCbHVldG9vdGggc3VwcG9ydAotIwotIyBDT05GSUdfQlQgaXMgbm90IHNldAotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0KLSMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCi0jCi0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9hZGlyX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvYWRpcl9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMGU2NTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvY29uZmlncy9hZGlyX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDgwNSArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jCi1DT05GSUdfTU1VPXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci1DT05GSUdfSEFWRV9ERUNfTE9DSz15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfRVBPTEw9eQotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCi1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKLSMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKLUNPTkZJR19LTU9EPXkKLQotIwotIyBQbGF0Zm9ybSBzdXBwb3J0Ci0jCi1DT05GSUdfUFBDPXkKLUNPTkZJR19QUEMzMj15Ci1DT05GSUdfNnh4PXkKLSMgQ09ORklHXzQweCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUjMgaXMgbm90IHNldAotIyBDT05GSUdfOHh4IGlzIG5vdCBzZXQKLQotIwotIyBJQk0gNHh4IG9wdGlvbnMKLSMKLSMgQ09ORklHXzgyNjAgaXMgbm90IHNldAotQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15Ci1DT05GSUdfUFBDX1NURF9NTVU9eQotIyBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gaXMgbm90IHNldAotIyBDT05GSUdfQVBVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19XSUxMT1dfMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUlBNQzI1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVjY0MjYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQUlVDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MT1BFQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQ1BONzY1IGlzIG5vdCBzZXQKLSMgQ09ORklHX01WTUU1MTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQTFVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSUE1DNzUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSUE1DODAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBTkRQT0lOVCBpcyBub3Qgc2V0Ci1DT05GSUdfQURJUj15Ci0jIENPTkZJR19LMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQUw0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTUlOSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTVAgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTFRJVkVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RBVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfUENJPXkKLUNPTkZJR19QQ0lfRE9NQUlOUz15Ci1DT05GSUdfS0NPUkVfRUxGPXkKLUNPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19LRVJORUxfRUxGPXkKLSMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKLUNPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQotIyBDT05GSUdfUENJX05BTUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1BBUlBPUlQ9eQotQ09ORklHX1BBUlBPUlRfUEM9eQotQ09ORklHX1BBUlBPUlRfUENfQ01MMT15Ci0jIENPTkZJR19QQVJQT1JUX1NFUklBTCBpcyBub3Qgc2V0Ci1DT05GSUdfUEFSUE9SVF9QQ19GSUZPPXkKLUNPTkZJR19QQVJQT1JUX1BDX1NVUEVSSU89eQotIyBDT05GSUdfUEFSUE9SVF9PVEhFUiBpcyBub3Qgc2V0Ci1DT05GSUdfUEFSUE9SVF8xMjg0PXkKLSMgQ09ORklHX1BQQzYwMV9TWU5DX0ZJWCBpcyBub3Qgc2V0Ci1DT05GSUdfQ01ETElORV9CT09MPXkKLUNPTkZJR19DTURMSU5FPSJpcD1vbiIKLQotIwotIyBBZHZhbmNlZCBzZXR1cAotIwotIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCi0jCi1DT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCi1DT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAotQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCi1DT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKLUNPTkZJR19CT09UX0xPQUQ9MHgwMDgwMDAwMAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QTlAgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLUNPTkZJR19CTEtfREVWX0ZEPXkKLSMgQ09ORklHX1BBUklERSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTE9PUD15Ci0jIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEFUQS9JREUvTUZNL1JMTCBzdXBwb3J0Ci0jCi0jIENPTkZJR19JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgc3VwcG9ydAotIwotQ09ORklHX1NDU0k9eQotCi0jCi0jIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCi0jCi1DT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfQ0hSX0RFVl9TVD15Ci0jIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfU1I9eQotQ09ORklHX0JMS19ERVZfU1JfVkVORE9SPXkKLUNPTkZJR19DSFJfREVWX1NHPXkKLQotIwotIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKLSMKLSMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUkVQT1JUX0xVTlMgaXMgbm90IHNldAotQ09ORklHX1NDU0lfQ09OU1RBTlRTPXkKLSMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycwotIwotIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FEVkFOU1lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSU4yMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQU01M0M5NzQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9NRUdBUkFJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQ1BRRkNUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0VBVEFfUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9HRU5FUklDX05DUjUzODAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9HRU5FUklDX05DUjUzODBfTU1JTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9QUEEgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JTU0gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9OQ1I1M0M3eHggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9OQ1I1M0M4WFg9eQotQ09ORklHX1NDU0lfU1lNNTNDOFhYPXkKLUNPTkZJR19TQ1NJX05DUjUzQzhYWF9ERUZBVUxUX1RBR1M9OAotQ09ORklHX1NDU0lfTkNSNTNDOFhYX01BWF9UQUdTPTMyCi1DT05GSUdfU0NTSV9OQ1I1M0M4WFhfU1lOQz0yMAotIyBDT05GSUdfU0NTSV9OQ1I1M0M4WFhfUFJPRklMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX05DUjUzQzhYWF9JT01BUFBFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX05DUjUzQzhYWF9QUVNfUERTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTkNSNTNDOFhYX1NZTUJJT1NfQ09NUEFUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUENJMjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1BDSTIyMjBJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUUxPR0lDX0lTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMT0dJQ19GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfVTE0XzM0RiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKLSMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotQ09ORklHX1BBQ0tFVD15Ci0jIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfTkVURklMVEVSPXkKLSMgQ09ORklHX05FVEZJTFRFUl9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRUNOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotCi0jCi0jIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgotIwotQ09ORklHX0lQX05GX0NPTk5UUkFDSz1tCi1DT05GSUdfSVBfTkZfRlRQPW0KLUNPTkZJR19JUF9ORl9JUkM9bQotQ09ORklHX0lQX05GX1RGVFA9bQotQ09ORklHX0lQX05GX0FNQU5EQT1tCi0jIENPTkZJR19JUF9ORl9RVUVVRSBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfTkZfSVBUQUJMRVM9bQotQ09ORklHX0lQX05GX01BVENIX0xJTUlUPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9NQUM9bQotQ09ORklHX0lQX05GX01BVENIX1BLVFRZUEU9bQotQ09ORklHX0lQX05GX01BVENIX01BUks9bQotQ09ORklHX0lQX05GX01BVENIX01VTFRJUE9SVD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfVE9TPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9FQ049bQotQ09ORklHX0lQX05GX01BVENIX0RTQ1A9bQotQ09ORklHX0lQX05GX01BVENIX0FIX0VTUD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfTEVOR1RIPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQotQ09ORklHX0lQX05GX01BVENIX1RDUE1TUz1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfSEVMUEVSPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9TVEFURT1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfQ09OTlRSQUNLPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9VTkNMRUFOPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9PV05FUj1tCi1DT05GSUdfSVBfTkZfRklMVEVSPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfTUlSUk9SPW0KLUNPTkZJR19JUF9ORl9OQVQ9bQotQ09ORklHX0lQX05GX05BVF9ORUVERUQ9eQotQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfUkVESVJFQ1Q9bQotQ09ORklHX0lQX05GX05BVF9TTk1QX0JBU0lDPW0KLUNPTkZJR19JUF9ORl9OQVRfSVJDPW0KLUNPTkZJR19JUF9ORl9OQVRfRlRQPW0KLUNPTkZJR19JUF9ORl9OQVRfVEZUUD1tCi1DT05GSUdfSVBfTkZfTkFUX0FNQU5EQT1tCi0jIENPTkZJR19JUF9ORl9NQU5HTEUgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfVEFSR0VUX0xPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9UQVJHRVRfVUxPRyBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfTkZfVEFSR0VUX1RDUE1TUz1tCi1DT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KLUNPTkZJR19JUF9ORl9BUlBGSUxURVI9bQotQ09ORklHX0lQX05GX0NPTVBBVF9JUENIQUlOUz1tCi0jIENPTkZJR19JUF9ORl9DT01QQVRfSVBGV0FETSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi1DT05GSUdfSVBWNl9TQ1RQX189eQotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9IV19GTE9XQ09OVFJPTCBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0KLSMKLSMgQVJDbmV0IGRldmljZXMKLSMKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotIyBDT05GSUdfRVRIRVJUQVAgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPXkKLSMgQ09ORklHX09BS05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX1BDST15Ci0jIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0RHUlMgaXMgbm90IHNldAotQ09ORklHX0VFUFJPMTAwPXkKLSMgQ09ORklHX0VFUFJPMTAwX1BJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RMQU4gaXMgbm90IHNldAotIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RMMksgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCi0jCi0jIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZEREkgaXMgbm90IHNldAotIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAotIyBDT05GSUdfUExJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFAgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCi0jCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcyAoZGVwZW5kcyBvbiBMTEM9eSkKLSMKLSMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCi0jIENPTkZJR19XQU4gaXMgbm90IHNldAotCi0jCi0jIEFtYXRldXIgUmFkaW8gc3VwcG9ydAotIwotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotCi0jCi0jIElyREEgKGluZnJhcmVkKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwotIyBDT05GSUdfSVNETl9CT09MIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19GQiBpcyBub3Qgc2V0Ci0KLSMKLSMgT2xkIENELVJPTSBkcml2ZXJzIChub3QgU0NTSSwgbm90IElERSkKLSMKLSMgQ09ORklHX0NEX05PX0lERVNDU0kgaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotCi0jCi0jIElucHV0IEkvTyBkcml2ZXJzCi0jCi0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgTWFjaW50b3NoIGRldmljZSBkcml2ZXJzCi0jCi0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLSMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfVU5JWDk4X1BUWV9DT1VOVD0yNTYKLSMgQ09ORklHX1BSSU5URVIgaXMgbm90IHNldAotIyBDT05GSUdfUFBERVYgaXMgbm90IHNldAotIyBDT05GSUdfVElQQVIgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIEkyQyBIYXJkd2FyZSBTZW5zb3JzIE1haW5ib2FyZCBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJDIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkNfU0VOU09SIGlzIG5vdCBzZXQKLQotIwotIyBNaWNlCi0jCi0jIENPTkZJR19CVVNNT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19RSUMwMl9UQVBFIGlzIG5vdCBzZXQKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi0jIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci1DT05GSUdfR0VOX1JUQz15Ci0jIENPTkZJR19HRU5fUlRDX1ggaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCi0jIENPTkZJR19GVEFQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BR1AgaXMgbm90IHNldAotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfSEFOR0NIRUNLX1RJTUVSIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19FWFQyX0ZTPXkKLSMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAotQ09ORklHX0VYVDNfRlM9eQotQ09ORklHX0VYVDNfRlNfWEFUVFI9eQotIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0Ci1DT05GSUdfSkJEPXkKLSMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfRlNfTUJDQUNIRT15Ci0jIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfRkFUX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0RFVlBUU19GUz15Ci0jIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAotQ09ORklHX1RNUEZTPXkKLUNPTkZJR19SQU1GUz15Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwotIwotIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi1DT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci1DT05GSUdfUk9PVF9ORlM9eQotQ09ORklHX0xPQ0tEPXkKLSMgQ09ORklHX0VYUE9SVEZTIGlzIG5vdCBzZXQKLUNPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfU1VOUlBDX0dTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlRFUk1FWlpPX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi0jIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotQ09ORklHX1VTQj15Ci0jIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKLSMKLUNPTkZJR19VU0JfREVWSUNFRlM9eQotIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTPXkKLQotIwotIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9FSENJX0hDRCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX09IQ0lfSENEPXkKLSMgQ09ORklHX1VTQl9VSENJX0hDRCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCi0jCi0jIENPTkZJR19VU0JfQkxVRVRPT1RIX1RUWSBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX0FDTT1tCi0jIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1NUT1JBR0U9bQotIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTT15Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDAgaXMgbm90IHNldAotQ09ORklHX1VTQl9TVE9SQUdFX0RQQ009eQotIyBDT05GSUdfVVNCX1NUT1JBR0VfSFA4MjAwZSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSHVtYW4gSW50ZXJmYWNlIERldmljZXMgKEhJRCkKLSMKLUNPTkZJR19VU0JfSElEPW0KLQotIwotIyBJbnB1dCBjb3JlIHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgSElEIGlucHV0IGxheWVyIG9yIEhJREJQIHN1cHBvcnQKLSMKLUNPTkZJR19VU0JfSElEREVWPXkKLQotIwotIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycwotIwotCi0jCi0jIFVTQiBJbWFnaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NDQU5ORVIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9IUFVTQlNDU0kgaXMgbm90IHNldAotCi0jCi0jIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAotCi0jCi0jIFZpZGVvNExpbnV4IHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgTXVsdGltZWRpYSBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIFVTQiBOZXR3b3JrIGFkYXB0b3JzCi0jCi0jIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAotCi0jCi0jIFVTQiBwb3J0IGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9VU1M3MjAgaXMgbm90IHNldAotCi0jCi0jIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKLSMKLUNPTkZJR19VU0JfU0VSSUFMPW0KLSMgQ09ORklHX1VTQl9TRVJJQUxfR0VORVJJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0VSSUFMX0JFTEtJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0VSSUFMX1dISVRFSEVBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0VSSUFMX0RJR0lfQUNDRUxFUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0VSSUFMX0VNUEVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TRVJJQUxfRlRESV9TSU8gaXMgbm90IHNldAotQ09ORklHX1VTQl9TRVJJQUxfVklTT1I9bQotIyBDT05GSUdfVVNCX1NFUklBTF9JUEFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TRVJJQUxfSVIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFUklBTF9FREdFUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUX1RJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9QREEgaXMgbm90IHNldAotQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTj1tCi0jIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fTVBSIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjg9eQotQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0EyOFg9eQotIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTI4WEEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTI4WEIgaXMgbm90IHNldAotQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0ExOT15Ci1DT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE4WD15Ci1DT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5Vz15Ci1DT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5UVc9eQotQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0ExOVFJPXkKLUNPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBNDlXPXkKLSMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0E0OVdMQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0VSSUFMX0tMU0kgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFUklBTF9LT0JJTF9TQ1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFUklBTF9NQ1RfVTIzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0VSSUFMX1BMMjMwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0VSSUFMX1NBRkUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFUklBTF9DWUJFUkpBQ0sgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFUklBTF9YSVJDT00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFUklBTF9PTU5JTkVUIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfRVpVU0I9eQotCi0jCi0jIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9USUdMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIEJsdWV0b290aCBzdXBwb3J0Ci0jCi0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL2FzaF9kZWZjb25maWcgYi9hcmNoL3BwYy9jb25maWdzL2FzaF9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTczY2MuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvY29uZmlncy9hc2hfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNjY2ICswLDAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMKLUNPTkZJR19NTVU9eQotQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKLUNPTkZJR19IQVZFX0RFQ19MT0NLPXkKLUNPTkZJR19QUEM9eQotQ09ORklHX1BQQzMyPXkKLUNPTkZJR19HRU5FUklDX05WUkFNPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0NMRUFOX0NPTVBJTEU9eQotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0Ci1DT05GSUdfRU1CRURERUQ9eQotIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAotQ09ORklHX0ZVVEVYPXkKLSMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCi1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKLSMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKLUNPTkZJR19LTU9EPXkKLQotIwotIyBQcm9jZXNzb3IKLSMKLSMgQ09ORklHXzZ4eCBpcyBub3Qgc2V0Ci1DT05GSUdfNDB4PXkKLSMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUjMgaXMgbm90IHNldAotIyBDT05GSUdfUE9XRVI0IGlzIG5vdCBzZXQKLSMgQ09ORklHXzh4eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVRIX0VNVUxBVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci1DT05GSUdfNHh4PXkKLQotIwotIyBJQk0gNHh4IG9wdGlvbnMKLSMKLUNPTkZJR19BU0g9eQotIyBDT05GSUdfQ1BDSTQwNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUDQwNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVkI0MDVFUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQUsgaXMgbm90IHNldAotIyBDT05GSUdfUkVEV09PRF81IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFRFdPT0RfNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWUNBTU9SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQUxOVVQgaXMgbm90IHNldAotQ09ORklHX05QNDA1SD15Ci1DT05GSUdfSUJNNDA1X0VSUjc3PXkKLUNPTkZJR19JQk00MDVfRVJSNTE9eQotQ09ORklHX0lCTV9PQ1A9eQotQ09ORklHX1BQQ19PQ1A9eQotQ09ORklHX0lCTV9PUEVOQklPUz15Ci0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci1DT05GSUdfVUFSVDBfVFRZUzA9eQotIyBDT05GSUdfVUFSVDBfVFRZUzEgaXMgbm90IHNldAotQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRT15Ci0KLSMKLSMgUGxhdGZvcm0gb3B0aW9ucwotIwotIyBDT05GSUdfUENfS0VZQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfS0VSTkVMX0VMRj15Ci1DT05GSUdfQklORk1UX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci1DT05GSUdfQ01ETElORV9CT09MPXkKLUNPTkZJR19DTURMSU5FPSJpcD1vbiIKLQotIwotIyBCdXMgb3B0aW9ucwotIwotQ09ORklHX1BDST15Ci1DT05GSUdfUENJX0RPTUFJTlM9eQotQ09ORklHX1BDSV9MRUdBQ1lfUFJPQz15Ci0jIENPTkZJR19QQ0lfTkFNRVMgaXMgbm90IHNldAotCi0jCi0jIEFkdmFuY2VkIHNldHVwCi0jCi0jIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKLQotIwotIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKLSMKLUNPTkZJR19ISUdITUVNX1NUQVJUPTB4ZmUwMDAwMDAKLUNPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCi1DT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKLUNPTkZJR19UQVNLX1NJWkU9MHg4MDAwMDAwMAotQ09ORklHX0JPT1RfTE9BRD0weDAwNDAwMDAwCi0KLSMKLSMgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0xPT1A9eQotIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ0FSTUVMIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCi0jIENPTkZJR19JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMk8gaXMgbm90IHNldAotCi0jCi0jIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycwotIwotCi0jCi0jIE5ldHdvcmtpbmcgc3VwcG9ydAotIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi0jIENPTkZJR19QQUNLRVQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfTVVMVElDQVNUPXkKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QPXkKLSMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlBfQk9PVFA9eQotIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLUNPTkZJR19TWU5fQ09PS0lFUz15Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9IV19GTE9XQ09OVFJPTCBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0KLSMKLSMgQVJDbmV0IGRldmljZXMKLSMKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotIyBDT05GSUdfTkVUX0VUSEVSTkVUIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RMMksgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUdPTjMgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci1DT05GSUdfSUJNX0VNQUM9eQotIyBDT05GSUdfSUJNX0VNQUNfRVJSTVNHIGlzIG5vdCBzZXQKLUNPTkZJR19JQk1fRU1BQ19SWEI9NjQKLUNPTkZJR19JQk1fRU1BQ19UWEI9OAotQ09ORklHX0lCTV9FTUFDX0ZHQVA9OAotQ09ORklHX0lCTV9FTUFDX1NLQlJFUz0wCi0jIENPTkZJR19GRERJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzCi0jCi0jIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQW1hdGV1ciBSYWRpbyBzdXBwb3J0Ci0jCi0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSXJEQSAoaW5mcmFyZWQpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotCi0jCi0jIEJsdWV0b290aCBzdXBwb3J0Ci0jCi0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLQotIwotIyBUZWxlcGhvbnkgU3VwcG9ydAotIwotIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfSU5QVVQ9eQotCi0jCi0jIFVzZXJsYW5kIGludGVyZmFjZXMKLSMKLUNPTkZJR19JTlBVVF9NT1VTRURFVj15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKLSMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgSS9PIGRyaXZlcnMKLSMKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci1DT05GSUdfU0VSSU89eQotQ09ORklHX1NFUklPX0k4MDQyPXkKLUNPTkZJR19TRVJJT19TRVJQT1JUPXkKLSMgQ09ORklHX1NFUklPX0NUODJDNzEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLUNPTkZJR19JTlBVVF9LRVlCT0FSRD15Ci1DT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQotIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfTU9VU0U9eQotQ09ORklHX01PVVNFX1BTMj15Ci0jIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKLQotIwotIyBDaGFyYWN0ZXIgZGV2aWNlcwotIwotIyBDT05GSUdfVlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00Ci0jIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0jIENPTkZJR19RSUMwMl9UQVBFIGlzIG5vdCBzZXQKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi1DT05GSUdfV0FUQ0hET0c9eQotIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCi0jCi0jIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKLQotIwotIyBQQ0ktYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKLSMKLSMgQ09ORklHX1BDSVBDV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfV0RUUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5fUlRDPXkKLSMgQ09ORklHX0dFTl9SVENfWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKLSMgQ09ORklHX0ZUQVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FHUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk0gaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKLUNPTkZJR19JMkM9eQotIyBDT05GSUdfSTJDX0NIQVJERVYgaXMgbm90IHNldAotCi0jCi0jIEkyQyBBbGdvcml0aG1zCi0jCi0jIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JQk1fSUlDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JU0EgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAotIyBDT05GSUdfU0N4MjAwX0FDQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDX1NFTlNPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAotCi0jCi0jIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLQotIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCi0jCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi0jIENPTkZJR19VU0IgaXMgbm90IHNldAotCi0jCi0jIFVTQiBHYWRnZXQgU3VwcG9ydAotIwotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19GQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAotQ09ORklHX1RNUEZTPXkKLSMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0Ci1DT05GSUdfUkFNRlM9eQotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi1DT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0QgaXMgbm90IHNldAotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19MT0NLRD15Ci0jIENPTkZJR19FWFBPUlRGUyBpcyBub3Qgc2V0Ci1DT05GSUdfU1VOUlBDPXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlRFUk1FWlpPX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NU0RPU19QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORUM5OF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKLSMKLSMgQ09ORklHX05MUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSUJNIDQweCBvcHRpb25zCi0jCi0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotQ09ORklHX0NSQzMyPXkKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9URVhUX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19PQ1A9eQotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL2JlZWNoX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvYmVlY2hfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQ2NzFiLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL2NvbmZpZ3MvYmVlY2hfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMKLUNPTkZJR19NTVU9eQotQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKLUNPTkZJR19IQVZFX0RFQ19MT0NLPXkKLUNPTkZJR19QUEM9eQotQ09ORklHX1BQQzMyPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0NMRUFOX0NPTVBJTEU9eQotIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0Ci1DT05GSUdfQlJPS0VOX09OX1NNUD15Ci0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKLUNPTkZJR19FTUJFRERFRD15Ci0jIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlVURVg9eQotIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLUNPTkZJR19NT0RVTEVfVU5MT0FEPXkKLSMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAotQ09ORklHX09CU09MRVRFX01PRFBBUk09eQotQ09ORklHX01PRFZFUlNJT05TPXkKLUNPTkZJR19LTU9EPXkKLQotIwotIyBQcm9jZXNzb3IKLSMKLSMgQ09ORklHXzZ4eCBpcyBub3Qgc2V0Ci1DT05GSUdfNDB4PXkKLSMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUjMgaXMgbm90IHNldAotIyBDT05GSUdfUE9XRVI0IGlzIG5vdCBzZXQKLSMgQ09ORklHXzh4eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVRIX0VNVUxBVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci1DT05GSUdfNHh4PXkKLQotIwotIyBJQk0gNHh4IG9wdGlvbnMKLSMKLSMgQ09ORklHX0FTSCBpcyBub3Qgc2V0Ci1DT05GSUdfQkVFQ0g9eQotIyBDT05GSUdfQ0VEQVIgaXMgbm90IHNldAotIyBDT05GSUdfQ1BDSTQwNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUDQwNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQUsgaXMgbm90IHNldAotIyBDT05GSUdfUkVEV09PRF80IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFRFdPT0RfNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRURXT09EXzYgaXMgbm90IHNldAotIyBDT05GSUdfU1lDQU1PUkUgaXMgbm90IHNldAotIyBDT05GSUdfVElWTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQUxOVVQgaXMgbm90IHNldAotQ09ORklHX0lCTTQwNV9FUlI3Nz15Ci1DT05GSUdfSUJNNDA1X0VSUjUxPXkKLUNPTkZJR19JQk1fT0NQPXkKLUNPTkZJR19JQk1fT1BFTkJJT1M9eQotQ09ORklHXzQwNV9ETUE9eQotIyBDT05GSUdfUE0gaXMgbm90IHNldAotQ09ORklHX1VBUlQwX1RUWVMwPXkKLSMgQ09ORklHX1VBUlQwX1RUWVMxIGlzIG5vdCBzZXQKLUNPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEU9eQotCi0jCi0jIFBsYXRmb3JtIG9wdGlvbnMKLSMKLSMgQ09ORklHX1BDX0tFWUJPQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAotQ09ORklHX0tFUk5FTF9FTEY9eQotQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKLQotIwotIyBCdXMgb3B0aW9ucwotIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDSV9ET01BSU5TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQWR2YW5jZWQgc2V0dXAKLSMKLSMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAotCi0jCi0jIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAotIwotQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAotQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKLUNPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAotQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCi1DT05GSUdfQk9PVF9MT0FEPTB4MDA0MDAwMDAKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotQ09ORklHX01URD15Ci0jIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAotQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAotCi0jCi0jIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCi0jCi1DT05GSUdfTVREX0NIQVI9eQotQ09ORklHX01URF9CTE9DSz15Ci0jIENPTkZJR19GVEwgaXMgbm90IHNldAotIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0Ci0KLSMKLSMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKLSMKLUNPTkZJR19NVERfQ0ZJPXkKLUNPTkZJR19NVERfSkVERUNQUk9CRT15Ci1DT05GSUdfTVREX0dFTl9QUk9CRT15Ci0jIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAotQ09ORklHX01URF9DRklfQU1EU1REPXkKLSMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAotIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAotCi0jCi0jIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKLSMKLSMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQkVFQ0g9eQotCi0jCi0jIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCi0jCi0jIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAotCi0jCi0jIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BOUCBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgZGV2aWNlcwotIwotQ09ORklHX0JMS19ERVZfTE9PUD15Ci0jIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIwotIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTmV0d29ya2luZyBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLSMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9NVUxUSUNBU1Q9eQotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlA9eQotIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUF9CT09UUD15Ci1DT05GSUdfSVBfUE5QX1JBUlA9eQotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRUNOIGlzIG5vdCBzZXQKLUNPTkZJR19TWU5fQ09PS0lFUz15Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotQ09ORklHX0lQVjZfU0NUUF9fPXkKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSFdfRkxPV0NPTlRST0wgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX09BS05FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzCi0jCi0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCi0jIENPTkZJR19XQU4gaXMgbm90IHNldAotCi0jCi0jIEFtYXRldXIgUmFkaW8gc3VwcG9ydAotIwotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotCi0jCi0jIElyREEgKGluZnJhcmVkKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLQotIwotIyBCbHVldG9vdGggc3VwcG9ydAotIwotIyBDT05GSUdfQlQgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROX0JPT0wgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLUNPTkZJR19GQj15Ci0jIENPTkZJR19GQl9DVDY1NTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1MzVFJJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WR0ExNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKLQotIwotIyBMb2dvIGNvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX0xPR08gaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfSU5QVVQ9eQotCi0jCi0jIFVzZXJsYW5kIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgSS9PIGRyaXZlcnMKLSMKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci1DT05GSUdfU0VSSU89eQotIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJT19DVDgyQzcxMCBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycwotIwotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi0jIENPTkZJR19WVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKLSMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotQ09ORklHX1VOSVg5OF9QVFlTPXkKLUNPTkZJR19VTklYOThfUFRZX0NPVU5UPTI1NgotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi1DT05GSUdfSTJDPXkKLSMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAotCi0jCi0jIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDX0lCTV9JSUM9eQotCi0jCi0jIEkyQyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDX1NFTlNPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAotCi0jCi0jIE1pY2UKLSMKLSMgQ09ORklHX0JVU01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FJQzAyX1RBUEUgaXMgbm90IHNldAotCi0jCi0jIElQTUkKLSMKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5fUlRDPXkKLSMgQ09ORklHX0dFTl9SVENfWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKLSMgQ09ORklHX0ZUQVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FHUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk0gaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19GQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci1DT05GSUdfREVWRlNfRlM9eQotIyBDT05GSUdfREVWRlNfTU9VTlQgaXMgbm90IHNldAotIyBDT05GSUdfREVWRlNfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0RFVlBUU19GUz15Ci0jIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAotQ09ORklHX1RNUEZTPXkKLSMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0Ci1DT05GSUdfUkFNRlM9eQotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi1DT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci1DT05GSUdfUk9PVF9ORlM9eQotQ09ORklHX0xPQ0tEPXkKLSMgQ09ORklHX0VYUE9SVEZTIGlzIG5vdCBzZXQKLUNPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfU1VOUlBDX0dTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlRFUk1FWlpPX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi0jIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0KLSMKLSMgU291bmQKLSMKLUNPTkZJR19TT1VORD15Ci0KLSMKLSMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCi0jCi0jIENPTkZJR19TTkQgaXMgbm90IHNldAotCi0jCi0jIE9wZW4gU291bmQgU3lzdGVtCi0jCi0jIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0Ci0KLSMKLSMgSUJNIDQweCBvcHRpb25zCi0jCi0KLSMKLSMgVVNCIHN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9URVhUX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19PQ1A9eQotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL2NlZGFyX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvY2VkYXJfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGU4Mjg4Li4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL2NvbmZpZ3MvY2VkYXJfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNTM0ICswLDAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMKLUNPTkZJR19NTVU9eQotQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKLUNPTkZJR19IQVZFX0RFQ19MT0NLPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19GVVRFWD15Ci0jIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLUNPTkZJR19NT0RVTEVfVU5MT0FEPXkKLSMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAotQ09ORklHX09CU09MRVRFX01PRFBBUk09eQotIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAotQ09ORklHX0tNT0Q9eQotCi0jCi0jIFBsYXRmb3JtIHN1cHBvcnQKLSMKLUNPTkZJR19QUEM9eQotQ09ORklHX1BQQzMyPXkKLSMgQ09ORklHXzZ4eCBpcyBub3Qgc2V0Ci1DT05GSUdfNDB4PXkKLSMgQ09ORklHX1BPV0VSMyBpcyBub3Qgc2V0Ci0jIENPTkZJR184eHggaXMgbm90IHNldAotQ09ORklHXzR4eD15Ci0KLSMKLSMgSUJNIDR4eCBvcHRpb25zCi0jCi0jIENPTkZJR19BU0ggaXMgbm90IHNldAotIyBDT05GSUdfQkVFQ0ggaXMgbm90IHNldAotQ09ORklHX0NFREFSPXkKLSMgQ09ORklHX0NQQ0k0MDUgaXMgbm90IHNldAotIyBDT05GSUdfRVA0MDUgaXMgbm90IHNldAotIyBDT05GSUdfT0FLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFRFdPT0RfNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRURXT09EXzUgaXMgbm90IHNldAotIyBDT05GSUdfUkVEV09PRF82IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZQ0FNT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJVk8gaXMgbm90IHNldAotIyBDT05GSUdfV0FMTlVUIGlzIG5vdCBzZXQKLUNPTkZJR19JQk00MDVfRVJSNzc9eQotQ09ORklHX0lCTTQwNV9FUlI1MT15Ci1DT05GSUdfSUJNX09DUD15Ci1DT05GSUdfTlA0MDVMPXkKLUNPTkZJR19CSU9TX0ZJWFVQPXkKLUNPTkZJR19JQk1fT1BFTkJJT1M9eQotIyBDT05GSUdfNDA1X0RNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci1DT05GSUdfVUFSVDBfVFRZUzA9eQotIyBDT05GSUdfVUFSVDBfVFRZUzEgaXMgbm90IHNldAotQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRT15Ci0jIENPTkZJR19TTVAgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVRIX0VNVUxBVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfUENJX0RPTUFJTlMgaXMgbm90IHNldAotIyBDT05GSUdfUENfS0VZQk9BUkQgaXMgbm90IHNldAotQ09ORklHX0tDT1JFX0VMRj15Ci1DT05GSUdfQklORk1UX0VMRj15Ci1DT05GSUdfS0VSTkVMX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKLQotIwotIyBBZHZhbmNlZCBzZXR1cAotIwotIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCi0jCi1DT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCi1DT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAotQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCi1DT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKLUNPTkZJR19CT09UX0xPQUQ9MHgwMDQwMDAwMAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QTlAgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTE9PUD15Ci0jIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEFUQS9JREUvTUZNL1JMTCBzdXBwb3J0Ci0jCi0jIENPTkZJR19JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgc3VwcG9ydAotIwotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIE5ldHdvcmtpbmcgc3VwcG9ydAotIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi0jIENPTkZJR19QQUNLRVQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX01VTFRJQ0FTVD15Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotQ09ORklHX0lQX1BOUF9CT09UUD15Ci1DT05GSUdfSVBfUE5QX1JBUlA9eQotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRUNOIGlzIG5vdCBzZXQKLUNPTkZJR19TWU5fQ09PS0lFUz15Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLUNPTkZJR19JUFY2X1NDVFBfXz15Ci0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0hXX0ZMT1dDT05UUk9MIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVEhFUlRBUCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCi0jIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCi0KLSMKLSMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCi0jCi0jIENPTkZJR19QUFAgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCi0jCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcyAoZGVwZW5kcyBvbiBMTEM9eSkKLSMKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQW1hdGV1ciBSYWRpbyBzdXBwb3J0Ci0jCi0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSXJEQSAoaW5mcmFyZWQpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROX0JPT0wgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLQotIwotIyBPbGQgQ0QtUk9NIGRyaXZlcnMgKG5vdCBTQ1NJLCBub3QgSURFKQotIwotIyBDT05GSUdfQ0RfTk9fSURFU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi0KLSMKLSMgSW5wdXQgSS9PIGRyaXZlcnMKLSMKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci0jIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKLSMKLQotIwotIyBDaGFyYWN0ZXIgZGV2aWNlcwotIwotIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLSMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotQ09ORklHX1VOSVg5OF9QVFlTPXkKLUNPTkZJR19VTklYOThfUFRZX0NPVU5UPTI1NgotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi1DT05GSUdfSTJDPXkKLSMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLUNPTkZJR19JMkNfSUJNX09DUF9BTEdPPXkKLUNPTkZJR19JMkNfSUJNX09DUF9BREFQPXkKLSMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgSGFyZHdhcmUgU2Vuc29ycyBNYWluYm9hcmQgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0Ci0jCi0jIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0VOU09SIGlzIG5vdCBzZXQKLQotIwotIyBNaWNlCi0jCi0jIENPTkZJR19CVVNNT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19RSUMwMl9UQVBFIGlzIG5vdCBzZXQKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi1DT05GSUdfV0FUQ0hET0c9eQotIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAotIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19XRFQgaXMgbm90IHNldAotIyBDT05GSUdfV0RUUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfQUNRVUlSRV9XRFQgaXMgbm90IHNldAotIyBDT05GSUdfQURWQU5URUNIX1dEVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVVJPVEVDSF9XRFQgaXMgbm90IHNldAotIyBDT05GSUdfSUI3MDBfV0RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JWENPTVdEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDeDIwMF9XRFQgaXMgbm90IHNldAotIyBDT05GSUdfNjBYWF9XRFQgaXMgbm90IHNldAotIyBDT05GSUdfVzgzODc3Rl9XRFQgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSFpfV0RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDNTIwX1dEVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUQ3WFhfVENPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FMSU03MTAxX1dEVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQzEyMDBfV0RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBRkVSX1dEVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFU1X1dEVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwotIyBDT05GSUdfRlRBUEUgaXMgbm90IHNldAotIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTkdDSEVDS19USU1FUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19GQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUFRTX0ZTPXkKLSMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAotIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKLUNPTkZJR19ORlNfRlM9eQotIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotIyBDT05GSUdfRVhQT1JURlMgaXMgbm90IHNldAotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19TVU5SUENfR1NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOVEVSTUVaWk9fRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLUNPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQotIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX01TRE9TX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FQzk4X1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIElCTSA0MHggb3B0aW9ucwotIwotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBCbHVldG9vdGggc3VwcG9ydAotIwotIyBDT05GSUdfQlQgaXMgbm90IHNldAotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLUNPTkZJR19DUkMzMj15Ci0KLSMKLSMgS2VybmVsIGhhY2tpbmcKLSMKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfT0NQPXkKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0KLSMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCi0jCi0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9jcGNpNjkwX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvY3BjaTY5MF9kZWZjb25maWcKaW5kZXggNTM5NDg3OS4uZmYzZjdlMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvY29uZmlncy9jcGNpNjkwX2RlZmNvbmZpZworKysgYi9hcmNoL3BwYy9jb25maWdzL2NwY2k2OTBfZGVmY29uZmlnCkBAIC0xLDE1ICsxLDE3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTAtcmMyCi0jIEZyaSBEZWMgIDMgMTU6NTY6MTAgMjAwNAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLW1tMQorIyBUaHUgU2VwICAxIDE3OjEwOjM3IDIwMDUKICMKIENPTkZJR19NTVU9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfSEFWRV9ERUNfTE9DSz15CiBDT05GSUdfUFBDPXkKIENPTkZJR19QUEMzMj15CiBDT05GSUdfR0VORVJJQ19OVlJBTT15CitDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTE3LDMzICsxOSwzOCBAQAogQ09ORklHX0VYUEVSSU1FTlRBTD15CiBDT05GSUdfQ0xFQU5fQ09NUElMRT15CiBDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiAKICMKICMgR2VuZXJhbCBzZXR1cAogIwogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKICMgQ09ORklHX1NXQVAgaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTD15CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfRVBPTEw9eQotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogQ09ORklHX1NITUVNPXkKIENPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAogQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCiBDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAogQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAogCiAjCiAjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CkBAIC02NSwzOCArNzIsNDIgQEAKICMgQ09ORklHX1BPV0VSMyBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUjQgaXMgbm90IHNldAogIyBDT05GSUdfOHh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0UyMDAgaXMgbm90IHNldAogIyBDT05GSUdfRTUwMCBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0ZQVT15CiBDT05GSUdfQUxUSVZFQz15CiAjIENPTkZJR19UQVUgaXMgbm90IHNldAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorIyBDT05GSUdfV0FOVF9FQVJMWV9TRVJJQUwgaXMgbm90IHNldAogQ09ORklHX1BQQ19TVERfTU1VPXkKICMgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSBpcyBub3Qgc2V0CiAKICMKKyMgUGVyZm9ybWFuY2UtbW9uaXRvcmluZyBjb3VudGVycyBzdXBwb3J0CisjCisjIENPTkZJR19QRVJGQ1RSIGlzIG5vdCBzZXQKKworIwogIyBQbGF0Zm9ybSBvcHRpb25zCiAjCiAjIENPTkZJR19QUENfTVVMVElQTEFURk9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUFVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBVEFOQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETVYxODIgaXMgbm90IHNldAogIyBDT05GSUdfV0lMTE9XIGlzIG5vdCBzZXQKIENPTkZJR19DUENJNjkwPXkKLSMgQ09ORklHX1BDT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSUE1DMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VWNjQyNjAgaXMgbm90IHNldAotIyBDT05GSUdfREI2NDM2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DSEVTVE5VVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TUFJVQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSERQVSBpcyBub3Qgc2V0CisjIENPTkZJR19FVjY0MjYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0xPUEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX01DUE43NjUgaXMgbm90IHNldAogIyBDT05GSUdfTVZNRTUxMDAgaXMgbm90IHNldAogIyBDT05GSUdfUFBMVVMgaXMgbm90IHNldAogIyBDT05GSUdfUFJQTUM3NTAgaXMgbm90IHNldAogIyBDT05GSUdfUFJQTUM4MDAgaXMgbm90IHNldAotIyBDT05GSUdfUFJQTUM4ODAgaXMgbm90IHNldAogIyBDT05GSUdfU0FORFBPSU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FESVIgaXMgbm90IHNldAotIyBDT05GSUdfSzIgaXMgbm90IHNldAorIyBDT05GSUdfUkFEU1RPTkVfUFBDN0QgaXMgbm90IHNldAogIyBDT05GSUdfUEFMNCBpcyBub3Qgc2V0CiAjIENPTkZJR19HRU1JTkkgaXMgbm90IHNldAogIyBDT05GSUdfRVNUODI2MCBpcyBub3Qgc2V0CkBAIC0xMDUsMjIgKzExNiw0MSBAQAogIyBDT05GSUdfUlBYODI2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUU04MjYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FEUzgyNzIgaXMgbm90IHNldAorIyBDT05GSUdfUFEyRkFEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSVRFNTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM4MzR4X1NZUyBpcyBub3Qgc2V0CisjIENPTkZJR19FVjY0MzYwIGlzIG5vdCBzZXQKK0NPTkZJR19HVDY0MjYwPXkKK0NPTkZJR19NVjY0WDYwPXkKIAogIwogIyBTZXQgYnJpZGdlIG9wdGlvbnMKICMKIENPTkZJR19NVjY0WDYwX0JBU0U9MHhmMTAwMDAwMAogQ09ORklHX01WNjRYNjBfTkVXX0JBU0U9MHhmMTAwMDAwMAotQ09ORklHX0dUNjQyNjA9eQotQ09ORklHX01WNjRYNjA9eQogIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKK0NPTkZJR19ISUdITUVNPXkKK0NPTkZJR19IWl8xMDA9eQorIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTEwMAorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CiBDT05GSUdfQklORk1UX0VMRj15CiBDT05GSUdfQklORk1UX01JU0M9eQogQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0iY29uc29sZT10dHlNTTAsOTYwMCBpcD1vbiIKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eU1NMCBpcD1vbiIKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CiAKICMKICMgQnVzIG9wdGlvbnMKQEAgLTEyOSw3ICsxNTksMTEgQEAKIENPTkZJR19QQ0k9eQogQ09ORklHX1BDSV9ET01BSU5TPXkKIENPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQotQ09ORklHX1BDSV9OQU1FUz15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIAogIwogIyBBZHZhbmNlZCBzZXR1cApAQCAtMTQ2LDYgKzE4MCw3NiBAQAogQ09ORklHX0JPT1RfTE9BRD0weDAwODAwMDAwCiAKICMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKICMgRGV2aWNlIERyaXZlcnMKICMKIApAQCAtMTU0LDYgKzI1OCw3IEBACiAjCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKQEAgLTE3Nyw2ICsyODIsNyBAQAogIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfTE9PUD15CiAjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldApAQCAtMTg1LDcgKzI5MSw2IEBACiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKIENPTkZJR19CTEtfREVWX0lOSVRSRD15Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogCkBAIC0xOTYsNiArMzAxLDcgQEAKIENPTkZJR19JT1NDSEVEX0FTPXkKIENPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKIENPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAogCiAjCiAjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKQEAgLTIwNSw2ICszMTEsNyBAQAogIwogIyBTQ1NJIGRldmljZSBzdXBwb3J0CiAjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0kgaXMgbm90IHNldAogCiAjCkBAIC0yMTUsNiArMzIyLDcgQEAKICMKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKIAogIwogIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CkBAIC0yMzEsNzEgKzMzOSw4IEBACiAjCiAKICMKLSMgTmV0d29ya2luZyBzdXBwb3J0CisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKICMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotQ09ORklHX1BBQ0tFVD15Ci0jIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9NVUxUSUNBU1Q9eQotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLSMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotQ09ORklHX1NZTl9DT09LSUVTPXkKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lQX1RDUERJQUc9eQotIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CkBAIC0zMDgsNiArMzUzLDExIEBACiAjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAogCiAjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIwogIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKICMKIENPTkZJR19ORVRfRVRIRVJORVQ9eQpAQCAtMzI4LDYgKzM3OCw3IEBACiAjIENPTkZJR19ERTRYNSBpcyBub3Qgc2V0CiAjIENPTkZJR19XSU5CT05EXzg0MCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETTkxMDIgaXMgbm90IHNldAorIyBDT05GSUdfVUxJNTI2WCBpcyBub3Qgc2V0CiAjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX1BDST15CiAjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKQEAgLTMzNyw3ICszODgsNiBAQAogIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKICMgQ09ORklHX0RHUlMgaXMgbm90IHNldAogQ09ORklHX0VFUFJPMTAwPXkKLSMgQ09ORklHX0VFUFJPMTAwX1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CiAjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKQEAgLTM2MCwxMyArNDEwLDE4IEBACiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAogIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKICMKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKIApAQCAtMzkwLDYgKzQ0NSwxMSBAQAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19LR0RCT0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMX1JYIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTExfVFJBUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKIAogIwogIyBJU0ROIHN1YnN5c3RlbQpAQCAtNDE5LDE0ICs0NzksNiBAQAogIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAogCiAjCi0jIElucHV0IEkvTyBkcml2ZXJzCi0jCi0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAotCi0jCiAjIElucHV0IERldmljZSBEcml2ZXJzCiAjCiAjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CkBAIC00MzYsNiArNDg4LDEyIEBACiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIAogIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIwogIyBDaGFyYWN0ZXIgZGV2aWNlcwogIwogQ09ORklHX1ZUPXkKQEAgLTQ1NSw2ICs1MTMsNyBAQAogQ09ORklHX1NFUklBTF9NUFNDX0NPTlNPTEU9eQogQ09ORklHX1NFUklBTF9DT1JFPXkKIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTQ4Myw2ICs1NDIsMTEgQEAKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIwogIyBJMkMgc3VwcG9ydAogIwogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKQEAgLTQ5MywxMCArNTU3LDIxIEBACiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAKICMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCiAjIE1pc2MgZGV2aWNlcwogIwogCiAjCisjIE11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycworIworCisjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKQEAgLTUxOCw2ICs1OTMsMTEgQEAKIENPTkZJR19EVU1NWV9DT05TT0xFPXkKIAogIworIyBTcGVha3VwIGNvbnNvbGUgc3BlZWNoCisjCisjIENPTkZJR19TUEVBS1VQIGlzIG5vdCBzZXQKKworIwogIyBTb3VuZAogIwogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldApAQCAtNTI1LDEzICs2MDUsOSBAQAogIwogIyBVU0Igc3VwcG9ydAogIwotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15Ci0KLSMKLSMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCi0jCisjIENPTkZJR19VU0IgaXMgbm90IHNldAogCiAjCiAjIFVTQiBHYWRnZXQgU3VwcG9ydApAQCAtNTM5LDIxICs2MTUsNDkgQEAKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAogCiAjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBTTiBEZXZpY2VzCisjCisKKyMKKyMgRGlzdHJpYnV0ZWQgTG9jayBNYW5hZ2VyCisjCisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCiAjIEZpbGUgc3lzdGVtcwogIwogQ09ORklHX0VYVDJfRlM9eQogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVI0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAogQ09ORklHX0ROT1RJRlk9eQogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwpAQCAtNTc0LDIwICs2NzgsMTggQEAKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19TWVNGUz15Ci1DT05GSUdfREVWRlNfRlM9eQotIyBDT05GSUdfREVWRlNfTU9VTlQgaXMgbm90IHNldAotIyBDT05GSUdfREVWRlNfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKIENPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZRlNfRlMgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKICMKICMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0ZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldApAQCAtNjA1LDEzICs3MDcsMTQgQEAKICMKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQogIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0QgaXMgbm90IHNldAogQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19MT0NLRD15CiBDT05GSUdfTE9DS0RfVjQ9eQotIyBDT05GSUdfRVhQT1JURlMgaXMgbm90IHNldAorQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz15CiBDT05GSUdfU1VOUlBDX0dTUz15CiBDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKQEAgLTYyMSw2ICs3MjQsNyBAQAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBQYXJ0aXRpb24gVHlwZXMKQEAgLTYzNyw2ICs3NDEsNyBAQAogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiAKQEAgLTY0OCw3ICs3NTMsOSBAQAogIwogIyBLZXJuZWwgaGFja2luZwogIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRyBpcyBub3Qgc2V0CiAKICMKQEAgLTY2OSw2ICs3NzYsNyBAQAogIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fREVTPXkKICMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CkBAIC02ODQsMyArNzkyLDcgQEAKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9ldjY0MzYwX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvZXY2NDM2MF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5YmJiNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL2NvbmZpZ3MvZXY2NDM2MF9kZWZjb25maWcKQEAgLTAsMCArMSw3ODQgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMy1yYzUKKyMgRnJpIEF1ZyAgNSAxNToxODoyMyAyMDA1CisjCitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0hBVkVfREVDX0xPQ0s9eQorQ09ORklHX1BQQz15CitDT05GSUdfUFBDMzI9eQorQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19MT0NLX0tFUk5FTD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IKKyMKK0NPTkZJR182eHg9eQorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUjMgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVI0IGlzIG5vdCBzZXQKKyMgQ09ORklHXzh4eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0U1MDAgaXMgbm90IHNldAorQ09ORklHX1BQQ19GUFU9eQorQ09ORklHX0FMVElWRUM9eQorQ09ORklHX1RBVT15CisjIENPTkZJR19UQVVfSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBVV9BVkVSQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfU1REX01NVT15CitDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFPXkKKworIworIyBQbGF0Zm9ybSBvcHRpb25zCisjCisjIENPTkZJR19QUENfTVVMVElQTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19BUFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBVEFOQSBpcyBub3Qgc2V0CisjIENPTkZJR19XSUxMT1cgaXMgbm90IHNldAorIyBDT05GSUdfQ1BDSTY5MCBpcyBub3Qgc2V0CisjIENPTkZJR19QQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUlBNQzI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19DSEVTVE5VVCBpcyBub3Qgc2V0CisjIENPTkZJR19TUFJVQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSERQVSBpcyBub3Qgc2V0CisjIENPTkZJR19FVjY0MjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPUEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01DUE43NjUgaXMgbm90IHNldAorIyBDT05GSUdfTVZNRTUxMDAgaXMgbm90IHNldAorIyBDT05GSUdfUFBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfUFJQTUM3NTAgaXMgbm90IHNldAorIyBDT05GSUdfUFJQTUM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfU0FORFBPSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRFNUT05FX1BQQzdEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FESVIgaXMgbm90IHNldAorIyBDT05GSUdfSzIgaXMgbm90IHNldAorIyBDT05GSUdfUEFMNCBpcyBub3Qgc2V0CisjIENPTkZJR19HRU1JTkkgaXMgbm90IHNldAorIyBDT05GSUdfRVNUODI2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQkM4Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NCUzgyNjAgaXMgbm90IHNldAorIyBDT05GSUdfUlBYODI2MCBpcyBub3Qgc2V0CisjIENPTkZJR19UUU04MjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FEUzgyNzIgaXMgbm90IHNldAorIyBDT05GSUdfUFEyRkFEUyBpcyBub3Qgc2V0CisjIENPTkZJR19MSVRFNTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM4MzR4X1NZUyBpcyBub3Qgc2V0CitDT05GSUdfRVY2NDM2MD15CitDT05GSUdfTVY2NDM2MD15CitDT05GSUdfTVY2NFg2MD15CisKKyMKKyMgU2V0IGJyaWRnZSBvcHRpb25zCisjCitDT05GSUdfTVY2NFg2MF9CQVNFPTB4ZjEwMDAwMDAKK0NPTkZJR19NVjY0WDYwX05FV19CQVNFPTB4ZjEwMDAwMDAKKyMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUPXkKK0NPTkZJR19QUkVFTVBUX0JLTD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX01JU0M9eQorQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlNTTAsMTE1MjAwIHJvb3Q9L2Rldi9tdGRibG9jazEgcncgcm9vdGZzdHlwZT1qZmZzMiIKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19HRU5FUklDX0lTQV9ETUE9eQorQ09ORklHX1BDST15CitDT05GSUdfUENJX0RPTUFJTlM9eQorIyBDT05GSUdfUENJX0xFR0FDWV9QUk9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9OQU1FUyBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBBZHZhbmNlZCBzZXR1cAorIworQ09ORklHX0FEVkFOQ0VEX09QVElPTlM9eQorQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAorIyBDT05GSUdfTE9XTUVNX1NJWkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAorIyBDT05GSUdfS0VSTkVMX1NUQVJUX0JPT0wgaXMgbm90IHNldAorQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCisjIENPTkZJR19UQVNLX1NJWkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKKyMgQ09ORklHX0NPTlNJU1RFTlRfU1RBUlRfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfQ09OU0lTVEVOVF9TVEFSVD0weGZmMTAwMDAwCisjIENPTkZJR19DT05TSVNURU5UX1NJWkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfQ09OU0lTVEVOVF9TSVpFPTB4MDAyMDAwMDAKKyMgQ09ORklHX0JPT1RfTE9BRF9CT09MIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UX0xPQUQ9MHgwMDgwMDAwMAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9UQ1BESUFHPXkKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ09OQ0FUPXkKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorQ09ORklHX01URF9DRklfQURWX09QVElPTlM9eQorQ09ORklHX01URF9DRklfTk9TV0FQPXkKKyMgQ09ORklHX01URF9DRklfQkVfQllURV9TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfTEVfQllURV9TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0dFT01FVFJZPXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PVFAgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHhmZjAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDAxMDAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhSQU09eQorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzI3NjgKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKKyMKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworIyBDT05GSUdfTkVUX0VUSEVSTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorQ09ORklHX01WNjQzWFhfRVRIPXkKK0NPTkZJR19NVjY0M1hYX0VUSF8wPXkKKyMgQ09ORklHX01WNjQzWFhfRVRIXzEgaXMgbm90IHNldAorIyBDT05GSUdfTVY2NDNYWF9FVEhfMiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfTVBTQz15CitDT05GSUdfU0VSSUFMX01QU0NfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5fUlRDPXkKKyMgQ09ORklHX0dFTl9SVENfWCBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0FHUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NFTlNPUiBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBTTiBEZXZpY2VzCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2NvbmZpZ3MvazJfZGVmY29uZmlnIGIvYXJjaC9wcGMvY29uZmlncy9rMl9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMGY1YTYuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvY29uZmlncy9rMl9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw2ODAgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIwotQ09ORklHX01NVT15Ci1DT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQotQ09ORklHX0hBVkVfREVDX0xPQ0s9eQotQ09ORklHX1BQQz15Ci1DT05GSUdfUFBDMzI9eQotQ09ORklHX0dFTkVSSUNfTlZSQU09eQotCi0jCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfQ0xFQU5fQ09NUElMRT15Ci1DT05GSUdfU1RBTkRBTE9ORT15Ci1DT05GSUdfQlJPS0VOX09OX1NNUD15Ci0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotQ09ORklHX1NXQVA9eQotQ09ORklHX1NZU1ZJUEM9eQotIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15Ci0jIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0Ci1DT05GSUdfRU1CRURERUQ9eQotQ09ORklHX0tBTExTWU1TPXkKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCi1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKLSMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKLUNPTkZJR19LTU9EPXkKLQotIwotIyBQcm9jZXNzb3IKLSMKLUNPTkZJR182eHg9eQotIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKLSMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUjMgaXMgbm90IHNldAotIyBDT05GSUdfUE9XRVI0IGlzIG5vdCBzZXQKLSMgQ09ORklHXzh4eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTFRJVkVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RBVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX1NURF9NTVU9eQotCi0jCi0jIFBsYXRmb3JtIG9wdGlvbnMKLSMKLSMgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQVVMgaXMgbm90IHNldAotIyBDT05GSUdfV0lMTE9XIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BPV0VSUE1DMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VWNjQyNjAgaXMgbm90IHNldAotIyBDT05GSUdfU1BSVUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xPUEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX01DUE43NjUgaXMgbm90IHNldAotIyBDT05GSUdfTVZNRTUxMDAgaXMgbm90IHNldAotIyBDT05GSUdfUFBMVVMgaXMgbm90IHNldAotIyBDT05GSUdfUFJQTUM3NTAgaXMgbm90IHNldAotIyBDT05GSUdfUFJQTUM4MDAgaXMgbm90IHNldAotIyBDT05GSUdfU0FORFBPSU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FESVIgaXMgbm90IHNldAotQ09ORklHX0syPXkKLSMgQ09ORklHX1BBTDQgaXMgbm90IHNldAotIyBDT05GSUdfR0VNSU5JIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VTVDgyNjAgaXMgbm90IHNldAotIyBDT05GSUdfU0JTODI2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SUFg2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1RRTTgyNjAgaXMgbm90IHNldAotQ09ORklHX1BQQ19HRU41NTA9eQotIyBDT05GSUdfQ1BDNzEwX0RBVEFfR0FUSEVSSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAotQ09ORklHX0tFUk5FTF9FTEY9eQotQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0iaXA9b24iCi0KLSMKLSMgQnVzIG9wdGlvbnMKLSMKLUNPTkZJR19HRU5FUklDX0lTQV9ETUE9eQotQ09ORklHX1BDST15Ci1DT05GSUdfUENJX0RPTUFJTlM9eQotIyBDT05GSUdfUENJX0xFR0FDWV9QUk9DIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDSV9OQU1FUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQWR2YW5jZWQgc2V0dXAKLSMKLSMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAotCi0jCi0jIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAotIwotQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAotQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKLUNPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAotQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCi1DT05GSUdfQk9PVF9MT0FEPTB4MDA4MDAwMDAKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgQmxvY2sgZGV2aWNlcwotIwotIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTE9PUD15Ci0jIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DQVJNRUwgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKLUNPTkZJR19JREU9eQotQ09ORklHX0JMS19ERVZfSURFPXkKLQotIwotIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKLSMKLUNPTkZJR19CTEtfREVWX0lERURJU0s9eQotIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERURJU0tfU1RST0tFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFQ0QgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERV9UQVNLRklMRV9JTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcwotIwotIyBDT05GSUdfSURFX0dFTkVSSUMgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFUENJPXkKLSMgQ09ORklHX0lERVBDSV9TSEFSRV9JUlEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0dFTkVSSUMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0w4MkMxMDUgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15Ci0jIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAotIyBDT05GSUdfSURFRE1BX1BDSV9BVVRPIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0FETUE9eQotIyBDT05GSUdfQkxLX0RFVl9BRUM2MlhYIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0FMSTE1WDM9eQotIyBDT05GSUdfV0RDX0FMSTE1WDMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ01ENjRYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUElJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX05TODc0MTUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9PTEQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9ORVcgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TVldLUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NJSU1BR0UgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TTEM5MEU2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1RSTTI5MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUE9eQotIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKLQotIwotIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKLSMKLQotIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKLSMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotQ09ORklHX1BBQ0tFVD15Ci0jIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotCi0jCi0jIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVI9eQotIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLUNPTkZJR19JUF9ORl9DT05OVFJBQ0s9bQotQ09ORklHX0lQX05GX0ZUUD1tCi0jIENPTkZJR19JUF9ORl9JUkMgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfVEZUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9BTUFOREEgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfUVVFVUUgaXMgbm90IHNldAotQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9MSU1JVD1tCi0jIENPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9NQVRDSF9NQUM9bQotQ09ORklHX0lQX05GX01BVENIX1BLVFRZUEU9bQotQ09ORklHX0lQX05GX01BVENIX01BUks9bQotQ09ORklHX0lQX05GX01BVENIX01VTFRJUE9SVD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfVE9TPW0KLSMgQ09ORklHX0lQX05GX01BVENIX1JFQ0VOVCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9EU0NQPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9BSF9FU1A9bQotIyBDT05GSUdfSVBfTkZfTUFUQ0hfTEVOR1RIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX01BVENIX1RUTCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfTkZfTUFUQ0hfVENQTVNTPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9IRUxQRVI9bQotQ09ORklHX0lQX05GX01BVENIX1NUQVRFPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9DT05OVFJBQ0s9bQotQ09ORklHX0lQX05GX01BVENIX09XTkVSPW0KLUNPTkZJR19JUF9ORl9GSUxURVI9bQotQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQotQ09ORklHX0lQX05GX05BVD1tCi1DT05GSUdfSVBfTkZfTkFUX05FRURFRD15Ci1DT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9bQotQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVD1tCi0jIENPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX1RBUkdFVF9TQU1FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX05BVF9TTk1QX0JBU0lDIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9OQVRfRlRQPW0KLSMgQ09ORklHX0lQX05GX01BTkdMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9UQVJHRVRfTE9HIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1RDUE1TUz1tCi1DT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KLUNPTkZJR19JUF9ORl9BUlBGSUxURVI9bQotIyBDT05GSUdfSVBfTkZfQVJQX01BTkdMRSBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfTkZfQ09NUEFUX0lQQ0hBSU5TPW0KLSMgQ09ORklHX0lQX05GX0NPTVBBVF9JUEZXQURNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX1JBVyBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSFdfRkxPV0NPTlRST0wgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAotQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBBUkNuZXQgZGV2aWNlcwotIwotIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotQ09ORklHX01JST15Ci0jIENPTkZJR19PQUtORVQgaXMgbm90IHNldAotIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAotCi0jCi0jIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAotIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAotQ09ORklHX05FVF9QQ0k9eQotIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAotIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0Ci1DT05GSUdfRUVQUk8xMDA9eQotIyBDT05GSUdfRUVQUk8xMDBfUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0UxMDAgaXMgbm90IHNldAotIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKLSMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAotIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAotIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAotIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAotIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCi0jIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAotIyBDT05GSUdfREwySyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAotIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAotIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0lYR0IgaXMgbm90IHNldAotIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzCi0jCi0jIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCi0jCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCi0jIENPTkZJR19XQU4gaXMgbm90IHNldAotIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFAgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIFRlbGVwaG9ueSBTdXBwb3J0Ci0jCi0jIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi0KLSMKLSMgSW5wdXQgSS9PIGRyaXZlcnMKLSMKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci0jIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBDaGFyYWN0ZXIgZGV2aWNlcwotIwotIyBDT05GSUdfVlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0yCi0jIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0jIENPTkZJR19RSUMwMl9UQVBFIGlzIG5vdCBzZXQKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi0jIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci1DT05GSUdfR0VOX1JUQz15Ci0jIENPTkZJR19HRU5fUlRDX1ggaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCi0jIENPTkZJR19GVEFQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BR1AgaXMgbm90IHNldAotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLQotIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCi0jCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi0jIENPTkZJR19VU0IgaXMgbm90IHNldAotCi0jCi0jIFVTQiBHYWRnZXQgU3VwcG9ydAotIwotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19GQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci1DT05GSUdfU1lTRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIwotQ09ORklHX05GU19GUz15Ci0jIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotIyBDT05GSUdfRVhQT1JURlMgaXMgbm90IHNldAotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAotIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSU5URVJNRVpaT19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi0jIENPTkZJR19OTFMgaXMgbm90IHNldAotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9URVhUX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0KLSMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCi0jCi0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9rYXRhbmFfZGVmY29uZmlnIGIvYXJjaC9wcGMvY29uZmlncy9rYXRhbmFfZGVmY29uZmlnCmluZGV4IGYwYjBkNTcuLjBmM2JiOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2NvbmZpZ3Mva2F0YW5hX2RlZmNvbmZpZworKysgYi9hcmNoL3BwYy9jb25maWdzL2thdGFuYV9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTEKLSMgVHVlIE1hciAgOCAxNzozMTowMCAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTMtbW0xCisjIFRodSBTZXAgIDEgMTc6MTY6MDMgMjAwNQogIwogQ09ORklHX01NVT15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CkBAIC0xMSw2ICsxMSw3IEBACiBDT05GSUdfUFBDPXkKIENPTkZJR19QUEMzMj15CiBDT05GSUdfR0VORVJJQ19OVlJBTT15CitDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTE4LDI4ICsxOSwzMSBAQAogQ09ORklHX0VYUEVSSU1FTlRBTD15CiBDT05GSUdfQ0xFQU5fQ09NUElMRT15CiBDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiAKICMKICMgR2VuZXJhbCBzZXR1cAogIwogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVEw9eQogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKIENPTkZJR19DQ19BTElHTl9MQUJFTFM9MApAQCAtNjgsMTUgKzcyLDIzIEBACiAjIENPTkZJR19QT1dFUjMgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVI0IGlzIG5vdCBzZXQKICMgQ09ORklHXzh4eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0U1MDAgaXMgbm90IHNldAorQ09ORklHX1BQQ19GUFU9eQogQ09ORklHX0FMVElWRUM9eQogIyBDT05GSUdfVEFVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgzeHggaXMgbm90IHNldAorIyBDT05GSUdfV0FOVF9FQVJMWV9TRVJJQUwgaXMgbm90IHNldAogQ09ORklHX1BQQ19TVERfTU1VPXkKIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEU9eQogCiAjCisjIFBlcmZvcm1hbmNlLW1vbml0b3JpbmcgY291bnRlcnMgc3VwcG9ydAorIworIyBDT05GSUdfUEVSRkNUUiBpcyBub3Qgc2V0CisKKyMKICMgUGxhdGZvcm0gb3B0aW9ucwogIwogIyBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gaXMgbm90IHNldApAQCAtODQsMjEgKzk2LDE4IEBACiBDT05GSUdfS0FUQU5BPXkKICMgQ09ORklHX1dJTExPVyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUENJNjkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSUE1DMjUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NIRVNUTlVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQUlVDRSBpcyBub3Qgc2V0CisjIENPTkZJR19IRFBVIGlzIG5vdCBzZXQKICMgQ09ORklHX0VWNjQyNjAgaXMgbm90IHNldAogIyBDT05GSUdfTE9QRUMgaXMgbm90IHNldAotIyBDT05GSUdfTUNQTjc2NSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVk1FNTEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUExVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QUlBNQzc1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUlBNQzgwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU5EUE9JTlQgaXMgbm90IHNldAogIyBDT05GSUdfUkFEU1RPTkVfUFBDN0QgaXMgbm90IHNldAotIyBDT05GSUdfQURJUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LMiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUw0IGlzIG5vdCBzZXQKICMgQ09ORklHX0dFTUlOSSBpcyBub3Qgc2V0CiAjIENPTkZJR19FU1Q4MjYwIGlzIG5vdCBzZXQKQEAgLTEwOSw2ICsxMTgsOCBAQAogIyBDT05GSUdfQURTODI3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUTJGQURTIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJVEU1MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzgzNHhfU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWNjQzNjAgaXMgbm90IHNldAogQ09ORklHX01WNjQzNjA9eQogQ09ORklHX01WNjRYNjA9eQogCkBAIC0xMTgsMTIgKzEyOSwyOCBAQAogQ09ORklHX01WNjRYNjBfQkFTRT0weGY4MTAwMDAwCiBDT05GSUdfTVY2NFg2MF9ORVdfQkFTRT0weGY4MTAwMDAwCiAjIENPTkZJR19TTVAgaXMgbm90IHNldAorQ09ORklHX0hJR0hNRU09eQorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKIENPTkZJR19CSU5GTVRfRUxGPXkKIENPTkZJR19CSU5GTVRfTUlTQz15CiBDT05GSUdfQ01ETElORV9CT09MPXkKLUNPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eU1NMCw5NjAwIGlwPW9uIgorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5TU0wIGlwPW9uIgorIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX1NFQ0NPTVA9eQorQ09ORklHX0lTQV9ETUFfQVBJPXkKIAogIwogIyBCdXMgb3B0aW9ucwpAQCAtMTMyLDcgKzE1OSw2IEBACiBDT05GSUdfUENJPXkKIENPTkZJR19QQ0lfRE9NQUlOUz15CiBDT05GSUdfUENJX0xFR0FDWV9QUk9DPXkKLUNPTkZJR19QQ0lfTkFNRVM9eQogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKQEAgLTE0MCwxMyArMTY2LDEwIEBACiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAogCiAjCi0jIFBDLWNhcmQgYnJpZGdlcwotIwotCi0jCiAjIEFkdmFuY2VkIHNldHVwCiAjCiBDT05GSUdfQURWQU5DRURfT1BUSU9OUz15CisjIENPTkZJR19ISUdITUVNX1NUQVJUX0JPT0wgaXMgbm90IHNldAogQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAogIyBDT05GSUdfTE9XTUVNX1NJWkVfQk9PTCBpcyBub3Qgc2V0CiBDT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMApAQCAtMTYyLDYgKzE4NSw3NiBAQAogQ09ORklHX0JPT1RfTE9BRD0weDAwODAwMDAwCiAKICMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKICMgRGV2aWNlIERyaXZlcnMKICMKIApAQCAtMTc3LDggKzI3MCw4IEBACiAjCiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DT05DQVQ9eQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKIApAQCAtMjEyLDYgKzMwNSw3IEBACiBDT05GSUdfTVREX0NGSV9JMj15CiAjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX09UUCBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CiAjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldApAQCAtMjE5LDcgKzMxMyw2IEBACiAjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKIAogIwogIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCkBAIC0yMjksNiArMzIyLDcgQEAKIENPTkZJR19NVERfUEhZU01BUF9TVEFSVD0weGUwMDAwMDAwCiBDT05GSUdfTVREX1BIWVNNQVBfTEVOPTB4MAogQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD00CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKICMKICMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCkBAIC0yNzgsNyArMzcyLDYgQEAKIENPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCiAjIENPTkZJR19MQkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAKQEAgLTI5OSw2ICszOTIsNyBAQAogIwogIyBTQ1NJIGRldmljZSBzdXBwb3J0CiAjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0kgaXMgbm90IHNldAogCiAjCkBAIC0zMDksNiArNDAzLDcgQEAKICMKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKIAogIwogIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CkBAIC0zMjUsNzEgKzQyMCw4IEBACiAjCiAKICMKLSMgTmV0d29ya2luZyBzdXBwb3J0CisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKICMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotQ09ORklHX1BBQ0tFVD15Ci0jIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9NVUxUSUNBU1Q9eQotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLSMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotQ09ORklHX1NZTl9DT09LSUVTPXkKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lQX1RDUERJQUc9eQotIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CkBAIC00MDIsNiArNDM0LDExIEBACiAjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAogCiAjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIwogIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKICMKIENPTkZJR19ORVRfRVRIRVJORVQ9eQpAQCAtNDIyLDYgKzQ1OSw3IEBACiAjIENPTkZJR19ERTRYNSBpcyBub3Qgc2V0CiAjIENPTkZJR19XSU5CT05EXzg0MCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETTkxMDIgaXMgbm90IHNldAorIyBDT05GSUdfVUxJNTI2WCBpcyBub3Qgc2V0CiAjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX1BDST15CiAjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKQEAgLTQ0OCwxNCArNDg2LDE5IEBACiAjCiAjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAogIyBDT05GSUdfREwySyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfRTEwMDA9eQorIyBDT05GSUdfRTEwMDBfTkFQSSBpcyBub3Qgc2V0CiAjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKICMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLWTIgaXMgbm90IHNldAogIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAogIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAogQ09ORklHX01WNjQzWFhfRVRIPXkKIENPTkZJR19NVjY0M1hYX0VUSF8wPXkKIENPTkZJR19NVjY0M1hYX0VUSF8xPXkKQEAgLTQ2NCw2ICs1MDcsNyBAQAogIwogIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKICMKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKIApAQCAtNDg3LDYgKzUzMSwxMSBAQAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19LR0RCT0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMX1JYIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTExfVFJBUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKIAogIwogIyBJU0ROIHN1YnN5c3RlbQpAQCAtNTE2LDE0ICs1NjUsNiBAQAogIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAogCiAjCi0jIElucHV0IEkvTyBkcml2ZXJzCi0jCi0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAotCi0jCiAjIElucHV0IERldmljZSBEcml2ZXJzCiAjCiAjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CkBAIC01MzMsNiArNTc0LDEyIEBACiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIAogIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIwogIyBDaGFyYWN0ZXIgZGV2aWNlcwogIwogQ09ORklHX1ZUPXkKQEAgLTU1Miw2ICs1OTksNyBAQAogQ09ORklHX1NFUklBTF9NUFNDX0NPTlNPTEU9eQogQ09ORklHX1NFUklBTF9DT1JFPXkKIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTU4MCw2ICs2MjgsMTEgQEAKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIwogIyBJMkMgc3VwcG9ydAogIwogQ09ORklHX0kyQz15CkBAIC02MDIsMTEgKzY1NSwxMCBAQAogIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX01QQyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKQEAgLTYyMSwxNCArNjczLDM5IEBACiBDT05GSUdfSTJDX01WNjRYWFg9eQogCiAjCi0jIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0CisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwotIyBDT05GSUdfSTJDX1NFTlNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorQ09ORklHX1NFTlNPUlNfTTQxVDAwPXkKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CkBAIC02NDQsMzkgKzcyMSwyOSBAQAogIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKLQotIwotIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0Ci0jCi0jIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0Ci1DT05GSUdfU0VOU09SU19NNDFUMDA9eQotIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGFsbGFzJ3MgMS13aXJlIGJ1cwotIwotIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAKICMKICMgTWlzYyBkZXZpY2VzCiAjCiAKICMKKyMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCisjCisKKyMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldApAQCAtNjk4LDYgKzc2NSwxMSBAQAogQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQogCiAjCisjIFNwZWFrdXAgY29uc29sZSBzcGVlY2gKKyMKKyMgQ09ORklHX1NQRUFLVVAgaXMgbm90IHNldAorCisjCiAjIFNvdW5kCiAjCiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CkBAIC03MDUsMTMgKzc3Nyw5IEBACiAjCiAjIFVTQiBzdXBwb3J0CiAjCi0jIENPTkZJR19VU0IgaXMgbm90IHNldAogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKLQotIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KLSMKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CiAKICMKICMgVVNCIEdhZGdldCBTdXBwb3J0CkBAIC03MjksMjUgKzc5NywzOSBAQAogIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CiAKICMKKyMgU04gRGV2aWNlcworIworCisjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIwogIyBGaWxlIHN5c3RlbXMKICMKIENPTkZJR19FWFQyX0ZTPXkKICMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKIAogIwogIyBYRlMgc3VwcG9ydAogIwogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKICMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKIENPTkZJR19ETk9USUZZPXkKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKQEAgLTc2OCwyMCArODUwLDE4IEBACiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfU1lTRlM9eQotQ09ORklHX0RFVkZTX0ZTPXkKLSMgQ09ORklHX0RFVkZTX01PVU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFVkZTX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CiBDT05GSUdfVE1QRlM9eQotIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVNGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTgwMSwxMiArODgxLDE0IEBACiAjCiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAogIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0QgaXMgbm90IHNldAogQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19MT0NLRD15CiBDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz15CiAjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CkBAIC04MTUsNiArODk3LDcgQEAKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CiAKICMKICMgUGFydGl0aW9uIFR5cGVzCkBAIC04MzEsNiArOTE0LDcgQEAKICMgTGlicmFyeSByb3V0aW5lcwogIwogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogCkBAIC04NDIsOCArOTI2LDEwIEBACiAjCiAjIEtlcm5lbCBoYWNraW5nCiAjCi0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9tY3BuNzY1X2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvbWNwbjc2NV9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OWU4OWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvY29uZmlncy9tY3BuNzY1X2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDU3OSArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jCi1DT05GSUdfTU1VPXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci1DT05GSUdfSEFWRV9ERUNfTE9DSz15Ci1DT05GSUdfUFBDPXkKLUNPTkZJR19QUEMzMj15Ci1DT05GSUdfR0VORVJJQ19OVlJBTT15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi0jIENPTkZJR19FWFBFUklNRU5UQUwgaXMgbm90IHNldAotQ09ORklHX0NMRUFOX0NPTVBJTEU9eQotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLSMgQ09ORklHX1NXQVAgaXMgbm90IHNldAotQ09ORklHX1NZU1ZJUEM9eQotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci0jIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKLUNPTkZJR19FTUJFRERFRD15Ci1DT05GSUdfS0FMTFNZTVM9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfSU9TQ0hFRF9OT09QPXkKLUNPTkZJR19JT1NDSEVEX0FTPXkKLUNPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKLQotIwotIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAotIwotQ09ORklHX01PRFVMRVM9eQotIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15Ci0jIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKLQotIwotIyBQcm9jZXNzb3IKLSMKLUNPTkZJR182eHg9eQotIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKLSMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUjMgaXMgbm90IHNldAotIyBDT05GSUdfUE9XRVI0IGlzIG5vdCBzZXQKLSMgQ09ORklHXzh4eCBpcyBub3Qgc2V0Ci1DT05GSUdfQUxUSVZFQz15Ci0jIENPTkZJR19UQVUgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotQ09ORklHX1BQQ19TVERfTU1VPXkKLQotIwotIyBQbGF0Zm9ybSBvcHRpb25zCi0jCi0jIENPTkZJR19QUENfTVVMVElQTEFURk9STSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUFVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dJTExPVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUlBNQzI1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVjY0MjYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQUlVDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MT1BFQyBpcyBub3Qgc2V0Ci1DT05GSUdfTUNQTjc2NT15Ci0jIENPTkZJR19NVk1FNTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUExVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUlBNQzc1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUlBNQzgwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQU5EUE9JTlQgaXMgbm90IHNldAotIyBDT05GSUdfQURJUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQUw0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTUlOSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FU1Q4MjYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NCUzgyNjAgaXMgbm90IHNldAotIyBDT05GSUdfUlBYNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUU04MjYwIGlzIG5vdCBzZXQKLUNPTkZJR19QUENfR0VONTUwPXkKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19ISUdITUVNPXkKLUNPTkZJR19LRVJORUxfRUxGPXkKLUNPTkZJR19CSU5GTVRfRUxGPXkKLSMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKLUNPTkZJR19DTURMSU5FX0JPT0w9eQotQ09ORklHX0NNRExJTkU9ImlwPW9uIgotCi0jCi0jIEJ1cyBvcHRpb25zCi0jCi1DT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKLUNPTkZJR19QQ0k9eQotQ09ORklHX1BDSV9ET01BSU5TPXkKLSMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0lfTkFNRVMgaXMgbm90IHNldAotCi0jCi0jIEFkdmFuY2VkIHNldHVwCi0jCi0jIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKLQotIwotIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKLSMKLUNPTkZJR19ISUdITUVNX1NUQVJUPTB4ZmUwMDAwMDAKLUNPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCi1DT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKLUNPTkZJR19UQVNLX1NJWkU9MHg4MDAwMDAwMAotQ09ORklHX0JPT1RfTE9BRD0weDAwODAwMDAwCi0KLSMKLSMgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTE9PUD15Ci0jIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DQVJNRUwgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKLUNPTkZJR19JREU9eQotQ09ORklHX0JMS19ERVZfSURFPXkKLQotIwotIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKLSMKLUNPTkZJR19CTEtfREVWX0lERURJU0s9eQotIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERURJU0tfU1RST0tFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFQ0QgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAotIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAotCi0jCi0jIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKLSMKLSMgQ09ORklHX0lERV9HRU5FUklDIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERVBDST15Ci0jIENPTkZJR19JREVQQ0lfU0hBUkVfSVJRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9HRU5FUklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0w4MkMxMDUgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15Ci0jIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAotIyBDT05GSUdfSURFRE1BX1BDSV9BVVRPIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0FETUE9eQotIyBDT05GSUdfQkxLX0RFVl9BRUM2MlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQUxJMTVYMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0FNRDc0WFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DTUQ2NFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1k4MkM2OTMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DUzU1MzAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IUFQzNFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWD15Ci1DT05GSUdfQkxLX0RFVl9JREVETUE9eQotIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKLQotIwotIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKLSMKLQotIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKLSMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotQ09ORklHX1BBQ0tFVD15Ci0jIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotQ09ORklHX05FVERFVklDRVM9eQotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCi0jIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotQ09ORklHX01JST15Ci0jIENPTkZJR19PQUtORVQgaXMgbm90IHNldAotIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAotCi0jCi0jIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUX1RVTElQPXkKLUNPTkZJR19UVUxJUD15Ci0jIENPTkZJR19UVUxJUF9NTUlPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTElQX05BUEkgaXMgbm90IHNldAotIyBDT05GSUdfREU0WDUgaXMgbm90IHNldAotIyBDT05GSUdfV0lOQk9ORF84NDAgaXMgbm90IHNldAotIyBDT05GSUdfRE05MTAyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCi0jIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAotIyBDT05GSUdfREwySyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAotIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAotIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUdPTjMgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GRERJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzCi0jCi0jIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQW1hdGV1ciBSYWRpbyBzdXBwb3J0Ci0jCi0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSXJEQSAoaW5mcmFyZWQpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotCi0jCi0jIEJsdWV0b290aCBzdXBwb3J0Ci0jCi0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLQotIwotIyBUZWxlcGhvbnkgU3VwcG9ydAotIwotIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotCi0jCi0jIElucHV0IEkvTyBkcml2ZXJzCi0jCi0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLSMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAotIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotIyBDT05GSUdfUUlDMDJfVEFQRSBpcyBub3Qgc2V0Ci0KLSMKLSMgSVBNSQotIwotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAotQ09ORklHX0dFTl9SVEM9eQotIyBDT05GSUdfR0VOX1JUQ19YIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwotIyBDT05GSUdfRlRBUEUgaXMgbm90IHNldAotIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjIGRldmljZXMKLSMKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19GQiBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0VYVDJfRlM9eQotIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfRkFUX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX1BST0NfS0NPUkU9eQotIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIwotQ09ORklHX05GU19GUz15Ci0jIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci1DT05GSUdfUk9PVF9ORlM9eQotQ09ORklHX0xPQ0tEPXkKLSMgQ09ORklHX0VYUE9SVEZTIGlzIG5vdCBzZXQKLUNPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi0jIENPTkZJR19OTFMgaXMgbm90IHNldAotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLUNPTkZJR19DUkMzMj15Ci0KLSMKLSMgS2VybmVsIGhhY2tpbmcKLSMKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VjdXJpdHkgb3B0aW9ucwotIwotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotCi0jCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucwotIwotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2NvbmZpZ3MvbWVuZjFfZGVmY29uZmlnIGIvYXJjaC9wcGMvY29uZmlncy9tZW5mMV9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMTY1OWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvY29uZmlncy9tZW5mMV9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw2MjEgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIwotQ09ORklHX01NVT15Ci1DT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQotQ09ORklHX0hBVkVfREVDX0xPQ0s9eQotCi0jCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotQ09ORklHX1NXQVA9eQotQ09ORklHX1NZU1ZJUEM9eQotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci0jIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0Ci1DT05GSUdfRlVURVg9eQotQ09ORklHX0VQT0xMPXkKLQotIwotIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAotIwotQ09ORklHX01PRFVMRVM9eQotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15Ci0jIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0Ci1DT05GSUdfS01PRD15Ci0KLSMKLSMgUGxhdGZvcm0gc3VwcG9ydAotIwotQ09ORklHX1BQQz15Ci1DT05GSUdfUFBDMzI9eQotQ09ORklHXzZ4eD15Ci0jIENPTkZJR180MHggaXMgbm90IHNldAotIyBDT05GSUdfUE9XRVIzIGlzIG5vdCBzZXQKLSMgQ09ORklHXzh4eCBpcyBub3Qgc2V0Ci0KLSMKLSMgSUJNIDR4eCBvcHRpb25zCi0jCi0jIENPTkZJR184MjYwIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0lTQV9ETUE9eQotQ09ORklHX1BQQ19TVERfTU1VPXkKLSMgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQVVMgaXMgbm90IHNldAotIyBDT05GSUdfV0lMTE9XXzIgaXMgbm90IHNldAotIyBDT05GSUdfUENPUkUgaXMgbm90IHNldAotIyBDT05GSUdfUE9XRVJQTUMyNTAgaXMgbm90IHNldAotIyBDT05GSUdfRVY2NDI2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUFJVQ0UgaXMgbm90IHNldAotQ09ORklHX01FTkYxPXkKLSMgQ09ORklHX0xPUEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX01DUE43NjUgaXMgbm90IHNldAotIyBDT05GSUdfTVZNRTUxMDAgaXMgbm90IHNldAotIyBDT05GSUdfUFBMVVMgaXMgbm90IHNldAotIyBDT05GSUdfUFJQTUM3NTAgaXMgbm90IHNldAotIyBDT05GSUdfUFJQTUM4MDAgaXMgbm90IHNldAotIyBDT05GSUdfU0FORFBPSU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FESVIgaXMgbm90IHNldAotIyBDT05GSUdfSzIgaXMgbm90IHNldAotIyBDT05GSUdfUEFMNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU1JTkkgaXMgbm90IHNldAotQ09ORklHX01QQzEwWF9TVE9SRV9HQVRIRVJJTkc9eQotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotIyBDT05GSUdfQUxUSVZFQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQVUgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLSMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAotQ09ORklHX1BDST15Ci1DT05GSUdfUENJX0RPTUFJTlM9eQotQ09ORklHX0tDT1JFX0VMRj15Ci1DT05GSUdfQklORk1UX0VMRj15Ci1DT05GSUdfS0VSTkVMX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0lfTEVHQUNZX1BST0MgaXMgbm90IHNldAotIyBDT05GSUdfUENJX05BTUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUEM2MDFfU1lOQ19GSVggaXMgbm90IHNldAotQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0iaXA9b24iCi0KLSMKLSMgQWR2YW5jZWQgc2V0dXAKLSMKLSMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAotCi0jCi0jIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAotIwotQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAotQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKLUNPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAotQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCi1DT05GSUdfQk9PVF9MT0FEPTB4MDA4MDAwMDAKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi0jIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0lERS9NRk0vUkxMIHN1cHBvcnQKLSMKLUNPTkZJR19JREU9eQotCi0jCi0jIElERSwgQVRBIGFuZCBBVEFQSSBCbG9jayBkZXZpY2VzCi0jCi1DT05GSUdfQkxLX0RFVl9JREU9eQotCi0jCi0jIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwotIwotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVESVNLPXkKLSMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVESVNLX1NUUk9LRSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVDRD15Ci0jIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0Ci0KLSMKLSMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcwotIwotIyBDT05GSUdfQkxLX0RFVl9JREVQQ0kgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgc3VwcG9ydAotIwotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKLQotIwotIyBJMk8gZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyTyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZyBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAotQ09ORklHX05FVEZJTFRFUj15Ci0jIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfTVVMVElDQVNUPXkKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci0jIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAotIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRUNOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotCi0jCi0jIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgotIwotQ09ORklHX0lQX05GX0NPTk5UUkFDSz1tCi1DT05GSUdfSVBfTkZfRlRQPW0KLUNPTkZJR19JUF9ORl9JUkM9bQotIyBDT05GSUdfSVBfTkZfVEZUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9BTUFOREEgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfUVVFVUUgaXMgbm90IHNldAotQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9MSU1JVD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfTUFDPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9QS1RUWVBFPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9NQVJLPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9NVUxUSVBPUlQ9bQotQ09ORklHX0lQX05GX01BVENIX1RPUz1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9EU0NQPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9BSF9FU1A9bQotQ09ORklHX0lQX05GX01BVENIX0xFTkdUSD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfVFRMPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9UQ1BNU1M9bQotQ09ORklHX0lQX05GX01BVENIX0hFTFBFUj1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfU1RBVEU9bQotQ09ORklHX0lQX05GX01BVENIX0NPTk5UUkFDSz1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfVU5DTEVBTj1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfT1dORVI9bQotQ09ORklHX0lQX05GX0ZJTFRFUj1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX01JUlJPUj1tCi1DT05GSUdfSVBfTkZfTkFUPW0KLUNPTkZJR19JUF9ORl9OQVRfTkVFREVEPXkKLUNPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUPW0KLSMgQ09ORklHX0lQX05GX05BVF9TTk1QX0JBU0lDIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9OQVRfSVJDPW0KLUNPTkZJR19JUF9ORl9OQVRfRlRQPW0KLSMgQ09ORklHX0lQX05GX01BTkdMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9UQVJHRVRfTE9HIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1RDUE1TUz1tCi1DT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KLUNPTkZJR19JUF9ORl9BUlBGSUxURVI9bQotQ09ORklHX0lQX05GX0NPTVBBVF9JUENIQUlOUz1tCi0jIENPTkZJR19JUF9ORl9DT01QQVRfSVBGV0FETSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi1DT05GSUdfSVBWNl9TQ1RQX189eQotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9IV19GTE9XQ09OVFJPTCBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0KLSMKLSMgQVJDbmV0IGRldmljZXMKLSMKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotIyBDT05GSUdfRVRIRVJUQVAgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPXkKLSMgQ09ORklHX09BS05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX1BDST15Ci0jIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0RHUlMgaXMgbm90IHNldAotIyBDT05GSUdfRUVQUk8xMDAgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GRUFMTlggaXMgbm90IHNldAotIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAotIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAotIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAotIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAotIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAotIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUdPTjMgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GRERJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzIChkZXBlbmRzIG9uIExMQz15KQotIwotIyBDT05GSUdfUkNQQ0kgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIwotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLQotIwotIyBBbWF0ZXVyIFJhZGlvIHN1cHBvcnQKLSMKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLQotIwotIyBJckRBIChpbmZyYXJlZCkgc3VwcG9ydAotIwotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKLSMgQ09ORklHX0lTRE5fQk9PTCBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3Mgc3VwcG9ydAotIwotIyBDT05GSUdfRkIgaXMgbm90IHNldAotCi0jCi0jIE9sZCBDRC1ST00gZHJpdmVycyAobm90IFNDU0ksIG5vdCBJREUpCi0jCi0jIENPTkZJR19DRF9OT19JREVTQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAotCi0jCi0jIFVzZXJsYW5kIGludGVyZmFjZXMKLSMKLQotIwotIyBJbnB1dCBJL08gZHJpdmVycwotIwotIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycwotIwotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX1VOSVg5OF9QVFlfQ09VTlQ9MjU2Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIEhhcmR3YXJlIFNlbnNvcnMgTWFpbmJvYXJkIHN1cHBvcnQKLSMKLQotIwotIyBJMkMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQ19TRU5TT1IgaXMgbm90IHNldAotCi0jCi0jIE1pY2UKLSMKLSMgQ09ORklHX0JVU01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FJQzAyX1RBUEUgaXMgbm90IHNldAotCi0jCi0jIElQTUkKLSMKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5fUlRDPXkKLSMgQ09ORklHX0dFTl9SVENfWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKLSMgQ09ORklHX0ZUQVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FHUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk0gaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU5HQ0hFQ0tfVElNRVIgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLQotIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCi0jCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0VYVDJfRlM9eQotIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUM19GUz15Ci1DT05GSUdfRVhUM19GU19YQVRUUj15Ci0jIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLUNPTkZJR19KQkQ9eQotIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19GU19NQkNBQ0hFPXkKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLUNPTkZJR19JU085NjYwX0ZTPXkKLSMgQ09ORklHX0pPTElFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19aSVNPRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19GQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUFRTX0ZTPXkKLSMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAotIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKLUNPTkZJR19ORlNfRlM9eQotIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotIyBDT05GSUdfRVhQT1JURlMgaXMgbm90IHNldAotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19TVU5SUENfR1NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOVEVSTUVaWk9fRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLSMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi0jIENPTkZJR19VU0IgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQmx1ZXRvb3RoIHN1cHBvcnQKLSMKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi0jIENPTkZJR19DUkMzMiBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIGhhY2tpbmcKLSMKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VjdXJpdHkgb3B0aW9ucwotIwotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotCi0jCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucwotIwotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2NvbmZpZ3MvbXBjODU2MF9hZHNfZGVmY29uZmlnIGIvYXJjaC9wcGMvY29uZmlncy9tcGM4NTYwX2Fkc19kZWZjb25maWcKaW5kZXggMzhhMzQzYy4uZjgzNGZiNSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvY29uZmlncy9tcGM4NTYwX2Fkc19kZWZjb25maWcKKysrIGIvYXJjaC9wcGMvY29uZmlncy9tcGM4NTYwX2Fkc19kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTEtcmMxCi0jIFRodSBKYW4gMjAgMDE6MjQ6NTYgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjNgorIyBUaHUgQXVnIDExIDE4OjE0OjQ1IDIwMDUKICMKIENPTkZJR19NTVU9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQpAQCAtMTEsNiArMTEsNyBAQAogQ09ORklHX1BQQz15CiBDT05GSUdfUFBDMzI9eQogQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC0xOCw2ICsxOSw3IEBACiBDT05GSUdfRVhQRVJJTUVOVEFMPXkKIENPTkZJR19DTEVBTl9DT01QSUxFPXkKIENPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0yOSwxMiArMzEsMTQgQEAKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTD15CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0VNQkVEREVEPXkKICMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiAjIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CkBAIC00NCw2ICs0OCw3IEBACiBDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAogQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAogCiAjCiAjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CkBAIC01OSwxMiArNjQsMTYgQEAKICMgQ09ORklHX1BPV0VSMyBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUjQgaXMgbm90IHNldAogIyBDT05GSUdfOHh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0UyMDAgaXMgbm90IHNldAogQ09ORklHX0U1MDA9eQogQ09ORklHX0JPT0tFPXkKIENPTkZJR19GU0xfQk9PS0U9eQorIyBDT05GSUdfUEhZU182NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfU1BFPXkKIENPTkZJR19NQVRIX0VNVUxBVElPTj15CisjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisjIENPTkZJR19QTSBpcyBub3Qgc2V0CiBDT05GSUdfODV4eD15CiBDT05GSUdfUFBDX0lORElSRUNUX1BDSV9CRT15CiAKQEAgLTcyLDkgKzgxLDExIEBACiAjIEZyZWVzY2FsZSA4NXh4IG9wdGlvbnMKICMKICMgQ09ORklHX01QQzg1NDBfQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzg1NDhfQ0RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzg1NTVfQ0RTIGlzIG5vdCBzZXQKIENPTkZJR19NUEM4NTYwX0FEUz15CiAjIENPTkZJR19TQkM4NTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUWF9HUDMgaXMgbm90IHNldAogQ09ORklHX01QQzg1NjA9eQogCiAjCkBAIC04MywxMSArOTQsMjUgQEAKIENPTkZJR19DUE0yPXkKICMgQ09ORklHX1BDX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQogQ09ORklHX0JJTkZNVF9FTEY9eQogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CiAKICMKICMgQnVzIG9wdGlvbnMKQEAgLTEwMywxMCArMTI4LDYgQEAKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKICMKLSMgUEMtY2FyZCBicmlkZ2VzCi0jCi0KLSMKICMgQWR2YW5jZWQgc2V0dXAKICMKICMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldApAQCAtMTIxLDYgKzE0Miw2OSBAQAogQ09ORklHX0JPT1RfTE9BRD0weDAwODAwMDAwCiAKICMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9UQ1BESUFHPXkKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisKKyMKICMgRGV2aWNlIERyaXZlcnMKICMKIApAQCAtMTkzLDYgKzI3Nyw3IEBACiAjCiAjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKICMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CiAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydApAQCAtMjA5LDcxICsyOTQsOCBAQAogIwogCiAjCi0jIE5ldHdvcmtpbmcgc3VwcG9ydAorIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CiAjCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfTVVMVElDQVNUPXkKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLSMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lOX0NPT0tJRVM9eQotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfVENQRElBRz15Ci0jIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQzIgaXMgbm90IHNldAotIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKQEAgLTMxMSw4ICszMzMsMTAgQEAKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKICMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAogIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiBDT05GSUdfR0lBTkZBUj15CiBDT05GSUdfR0ZBUl9OQVBJPXkKIApAQCAtMzQyLDYgKzM2Niw4IEBACiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CiAKICMKICMgSVNETiBzdWJzeXN0ZW0KQEAgLTM2OCwxNCArMzk0LDYgQEAKICMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKIAogIwotIyBJbnB1dCBJL08gZHJpdmVycwotIwotIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKLQotIwogIyBJbnB1dCBEZXZpY2UgRHJpdmVycwogIwogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldApAQCAtMzg1LDYgKzQwMywxMiBAQAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKICMgQ2hhcmFjdGVyIGRldmljZXMKICMKICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKQEAgLTQwMywxMSArNDI3LDEyIEBACiBDT05GSUdfU0VSSUFMX0NQTT15CiBDT05GSUdfU0VSSUFMX0NQTV9DT05TT0xFPXkKIENPTkZJR19TRVJJQUxfQ1BNX1NDQzE9eQotIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MyIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ1BNX1NDQzI9eQogIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MzIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJQUxfQ1BNX1NDQzQ9eQorIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0M0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9DUE1fU01DMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJQUxfQ1BNX1NNQzIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgpAQCAtNDM2LDYgKzQ2MSwxMSBAQAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAKICMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCiAjIEkyQyBzdXBwb3J0CiAjCiBDT05GSUdfSTJDPXkKQEAgLTQ1OCwxMSArNDg4LDExIEBACiAjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX01QQz15CiAjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKQEAgLTQ3MywxOSArNTAzLDQ2IEBACiAjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TRU5TT1IgaXMgbm90IHNldAogCiAjCi0jIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0CisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwotIyBDT05GSUdfSTJDX1NFTlNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NNDFUMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19IV01PTj15CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CkBAIC00OTYsMzEgKzU1MywxOCBAQAogIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAotCi0jCi0jIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIERhbGxhcydzIDEtd2lyZSBidXMKLSMKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCiAjIE1pc2MgZGV2aWNlcwpAQCAtNTQwLDcgKzU4NCw2IEBACiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgU291bmQKQEAgLTU1MCwxMyArNTkzLDkgQEAKICMKICMgVVNCIHN1cHBvcnQKICMKLSMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQotCi0jCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotIworIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKQEAgLTU3NCwxMCArNjEzLDE1IEBACiAjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKIAogIworIyBTTiBEZXZpY2VzCisjCisKKyMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15CiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKICMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKQEAgLTU4Nyw5ICs2MzEsMTUgQEAKIENPTkZJR19GU19NQkNBQ0hFPXkKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAogQ09ORklHX0ROT1RJRlk9eQogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKQEAgLTYxNCw3ICs2NjQsNiBAQAogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfS0NPUkU9eQogQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CiBDT05GSUdfVE1QRlM9eQogIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldApAQCAtNjQ4LDcgKzY5Nyw3IEBACiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19ST09UX05GUz15CiBDT05GSUdfTE9DS0Q9eQotIyBDT05GSUdfRVhQT1JURlMgaXMgbm90IHNldAorQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz15CiAjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CkBAIC03MDAsNyArNzQ5LDkgQEAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfS0dEQl9DT05TT0xFIGlzIG5vdCBzZXQKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9vYWtfZGVmY29uZmlnIGIvYXJjaC9wcGMvY29uZmlncy9vYWtfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjZjYzQ4Li4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL2NvbmZpZ3Mvb2FrX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDQ4NSArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jCi1DT05GSUdfTU1VPXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci1DT05GSUdfSEFWRV9ERUNfTE9DSz15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLUNPTkZJR19FTUJFRERFRD15Ci1DT05GSUdfRlVURVg9eQotIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCi1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKLSMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKLUNPTkZJR19LTU9EPXkKLQotIwotIyBQbGF0Zm9ybSBzdXBwb3J0Ci0jCi1DT05GSUdfUFBDPXkKLUNPTkZJR19QUEMzMj15Ci0jIENPTkZJR182eHggaXMgbm90IHNldAotQ09ORklHXzQweD15Ci0jIENPTkZJR19QT1dFUjMgaXMgbm90IHNldAotIyBDT05GSUdfOHh4IGlzIG5vdCBzZXQKLUNPTkZJR180eHg9eQotCi0jCi0jIElCTSA0eHggb3B0aW9ucwotIwotIyBDT05GSUdfQVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NFREFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQQ0k0MDUgaXMgbm90IHNldAotIyBDT05GSUdfRVA0MDUgaXMgbm90IHNldAotQ09ORklHX09BSz15Ci0jIENPTkZJR19SRURXT09EXzQgaXMgbm90IHNldAotIyBDT05GSUdfUkVEV09PRF81IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFRFdPT0RfNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWUNBTU9SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19USVZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTE5VVCBpcyBub3Qgc2V0Ci1DT05GSUdfSUJNNDA1X0VSUjUxPXkKLUNPTkZJR180MDNHQ1g9eQotIyBDT05GSUdfNDA1X0RNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci1DT05GSUdfVUFSVDBfVFRZUzA9eQotIyBDT05GSUdfVUFSVDBfVFRZUzEgaXMgbm90IHNldAotQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRT15Ci0jIENPTkZJR19TTVAgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVRIX0VNVUxBVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfUENJX0RPTUFJTlMgaXMgbm90IHNldAotIyBDT05GSUdfUENfS0VZQk9BUkQgaXMgbm90IHNldAotQ09ORklHX0tDT1JFX0VMRj15Ci1DT05GSUdfQklORk1UX0VMRj15Ci1DT05GSUdfS0VSTkVMX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKLQotIwotIyBBZHZhbmNlZCBzZXR1cAotIwotIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCi0jCi1DT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCi1DT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAotQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCi1DT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKLUNPTkZJR19CT09UX0xPQUQ9MHgwMDQwMDAwMAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QTlAgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTE9PUD15Ci0jIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEFUQS9JREUvTUZNL1JMTCBzdXBwb3J0Ci0jCi0jIENPTkZJR19JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgc3VwcG9ydAotIwotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIE5ldHdvcmtpbmcgc3VwcG9ydAotIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi0jIENPTkZJR19QQUNLRVQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX01VTFRJQ0FTVD15Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUD15Ci0jIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLUNPTkZJR19JUF9QTlBfUkFSUD15Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FQ04gaXMgbm90IHNldAotQ09ORklHX1NZTl9DT09LSUVTPXkKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotQ09ORklHX0lQVjZfU0NUUF9fPXkKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfTExDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSFdfRkxPV0NPTlRST0wgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VUSEVSVEFQIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKLUNPTkZJR19PQUtORVQ9eQotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCi0KLSMKLSMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCi0jCi0jIENPTkZJR19QUFAgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCi0jCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcyAoZGVwZW5kcyBvbiBMTEM9eSkKLSMKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQW1hdGV1ciBSYWRpbyBzdXBwb3J0Ci0jCi0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSXJEQSAoaW5mcmFyZWQpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROX0JPT0wgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLQotIwotIyBPbGQgQ0QtUk9NIGRyaXZlcnMgKG5vdCBTQ1NJLCBub3QgSURFKQotIwotIyBDT05GSUdfQ0RfTk9fSURFU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi0KLSMKLSMgSW5wdXQgSS9PIGRyaXZlcnMKLSMKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci0jIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKLSMKLQotIwotIyBDaGFyYWN0ZXIgZGV2aWNlcwotIwotIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLSMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotIyBDT05GSUdfVU5JWDk4X1BUWVMgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIEkyQyBIYXJkd2FyZSBTZW5zb3JzIE1haW5ib2FyZCBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJDIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkNfU0VOU09SIGlzIG5vdCBzZXQKLQotIwotIyBNaWNlCi0jCi0jIENPTkZJR19CVVNNT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19RSUMwMl9UQVBFIGlzIG5vdCBzZXQKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi0jIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci1DT05GSUdfR0VOX1JUQz15Ci0jIENPTkZJR19HRU5fUlRDX1ggaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCi0jIENPTkZJR19GVEFQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BR1AgaXMgbm90IHNldAotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfSEFOR0NIRUNLX1RJTUVSIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19FWFQyX0ZTPXkKLSMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KQkQgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0ZBVF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLSMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19UTVBGUz15Ci1DT05GSUdfUkFNRlM9eQotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIwotQ09ORklHX05GU19GUz15Ci0jIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0QgaXMgbm90IHNldAotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19MT0NLRD15Ci0jIENPTkZJR19FWFBPUlRGUyBpcyBub3Qgc2V0Ci1DT05GSUdfU1VOUlBDPXkKLSMgQ09ORklHX1NVTlJQQ19HU1MgaXMgbm90IHNldAotIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSU5URVJNRVpaT19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotCi0jCi0jIFNvdW5kCi0jCi0jIENPTkZJR19TT1VORCBpcyBub3Qgc2V0Ci0KLSMKLSMgSUJNIDQweCBvcHRpb25zCi0jCi0KLSMKLSMgVVNCIHN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIEJsdWV0b290aCBzdXBwb3J0Ci0jCi0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX1RFWFRfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL3Bjb3JlX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvcGNvcmVfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDM0NDA1Li4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL2NvbmZpZ3MvcGNvcmVfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNzE2ICswLDAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMKLUNPTkZJR19NTVU9eQotQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKLUNPTkZJR19IQVZFX0RFQ19MT0NLPXkKLUNPTkZJR19QUEM9eQotQ09ORklHX1BQQzMyPXkKLUNPTkZJR19HRU5FUklDX05WUkFNPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0NMRUFOX0NPTVBJTEU9eQotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0Ci1DT05GSUdfRU1CRURERUQ9eQotQ09ORklHX0tBTExTWU1TPXkKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLUNPTkZJR19NT0RVTEVfVU5MT0FEPXkKLSMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAotQ09ORklHX09CU09MRVRFX01PRFBBUk09eQotIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAotQ09ORklHX0tNT0Q9eQotCi0jCi0jIFByb2Nlc3NvcgotIwotQ09ORklHXzZ4eD15Ci0jIENPTkZJR180MHggaXMgbm90IHNldAotIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BPV0VSMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUjQgaXMgbm90IHNldAotIyBDT05GSUdfOHh4IGlzIG5vdCBzZXQKLUNPTkZJR19BTFRJVkVDPXkKLSMgQ09ORklHX1RBVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX1NURF9NTVU9eQotCi0jCi0jIFBsYXRmb3JtIG9wdGlvbnMKLSMKLSMgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQVVMgaXMgbm90IHNldAotIyBDT05GSUdfV0lMTE9XIGlzIG5vdCBzZXQKLUNPTkZJR19QQ09SRT15Ci0jIENPTkZJR19QT1dFUlBNQzI1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVjY0MjYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQUlVDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MT1BFQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQ1BONzY1IGlzIG5vdCBzZXQKLSMgQ09ORklHX01WTUU1MTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQTFVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSUE1DNzUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSUE1DODAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBTkRQT0lOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRElSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0syIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBTDQgaXMgbm90IHNldAotIyBDT05GSUdfR0VNSU5JIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VTVDgyNjAgaXMgbm90IHNldAotIyBDT05GSUdfU0JTODI2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SUFg2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1RRTTgyNjAgaXMgbm90IHNldAotQ09ORklHX1BQQ19HRU41NTA9eQotQ09ORklHX0ZPUkNFPXkKLSMgQ09ORklHX01QQzEwWF9TVE9SRV9HQVRIRVJJTkcgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfS0VSTkVMX0VMRj15Ci1DT05GSUdfQklORk1UX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci1DT05GSUdfQ01ETElORV9CT09MPXkKLUNPTkZJR19DTURMSU5FPSJpcD1vbiIKLQotIwotIyBCdXMgb3B0aW9ucwotIwotQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15Ci1DT05GSUdfUENJPXkKLUNPTkZJR19QQ0lfRE9NQUlOUz15Ci0jIENPTkZJR19QQ0lfTEVHQUNZX1BST0MgaXMgbm90IHNldAotIyBDT05GSUdfUENJX05BTUVTIGlzIG5vdCBzZXQKLQotIwotIyBBZHZhbmNlZCBzZXR1cAotIwotIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCi0jCi1DT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCi1DT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAotQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCi1DT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKLUNPTkZJR19CT09UX0xPQUQ9MHgwMDgwMDAwMAotCi0jCi0jIERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwotIwotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi0jIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DQVJNRUwgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lERSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX1NDU0k9eQotQ09ORklHX1NDU0lfUFJPQ19GUz15Ci0KLSMKLSMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKLSMKLUNPTkZJR19CTEtfREVWX1NEPXkKLSMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAotIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1NSPXkKLSMgQ09ORklHX0JMS19ERVZfU1JfVkVORE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAotCi0jCi0jIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcwotIwotIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9SRVBPUlRfTFVOUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKLSMKLSMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKLSMKLSMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FEVkFOU1lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTUVHQVJBSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQlVTTE9HSUMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9DUFFGQ1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRUFUQV9QSU8gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfR0RUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAotQ09ORklHX1NDU0lfU1lNNTNDOFhYXzI9eQotQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RNQV9BRERSRVNTSU5HX01PREU9MQotQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RFRkFVTFRfVEFHUz0xNgotQ09ORklHX1NDU0lfU1lNNTNDOFhYX01BWF9UQUdTPTY0Ci0jIENPTkZJR19TQ1NJX1NZTTUzQzhYWF9JT01BUFBFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMT0dJQ19JU1AgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTE9HSUNfRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9RTEEyWFhYPXkKLSMgQ09ORklHX1NDU0lfUUxBMjFYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQTIyWFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTEEyMzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUUxBMjMyMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQTYzMTIgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTEE2MzIyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19GVVNJT04gaXMgbm90IHNldAotCi0jCi0jIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKLQotIwotIyBJMk8gZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyTyBpcyBub3Qgc2V0Ci0KLSMKLSMgTWFjaW50b3NoIGRldmljZSBkcml2ZXJzCi0jCi0KLSMKLSMgTmV0d29ya2luZyBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfTVVMVElDQVNUPXkKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci0jIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAotIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotCi0jCi0jIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotQ09ORklHX05FVEZJTFRFUj15Ci0jIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgotIwotQ09ORklHX0lQX05GX0NPTk5UUkFDSz1tCi1DT05GSUdfSVBfTkZfRlRQPW0KLUNPTkZJR19JUF9ORl9JUkM9bQotIyBDT05GSUdfSVBfTkZfVEZUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9BTUFOREEgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfUVVFVUUgaXMgbm90IHNldAotQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9MSU1JVD1tCi0jIENPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9NQVRDSF9NQUM9bQotQ09ORklHX0lQX05GX01BVENIX1BLVFRZUEU9bQotQ09ORklHX0lQX05GX01BVENIX01BUks9bQotQ09ORklHX0lQX05GX01BVENIX01VTFRJUE9SVD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfVE9TPW0KLSMgQ09ORklHX0lQX05GX01BVENIX1JFQ0VOVCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9EU0NQPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9BSF9FU1A9bQotQ09ORklHX0lQX05GX01BVENIX0xFTkdUSD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfVFRMPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9UQ1BNU1M9bQotQ09ORklHX0lQX05GX01BVENIX0hFTFBFUj1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfU1RBVEU9bQotQ09ORklHX0lQX05GX01BVENIX0NPTk5UUkFDSz1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfT1dORVI9bQotQ09ORklHX0lQX05GX0ZJTFRFUj1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCi1DT05GSUdfSVBfTkZfTkFUPW0KLUNPTkZJR19JUF9ORl9OQVRfTkVFREVEPXkKLUNPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUPW0KLSMgQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVAgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfVEFSR0VUX1NBTUUgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfTkFUX1NOTVBfQkFTSUMgaXMgbm90IHNldAotQ09ORklHX0lQX05GX05BVF9JUkM9bQotQ09ORklHX0lQX05GX05BVF9GVFA9bQotIyBDT05GSUdfSVBfTkZfTUFOR0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX1RBUkdFVF9MT0cgaXMgbm90IHNldAotQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfVENQTVNTPW0KLUNPTkZJR19JUF9ORl9BUlBUQUJMRVM9bQotQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCi0jIENPTkZJR19JUF9ORl9BUlBfTUFOR0xFIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9DT01QQVRfSVBDSEFJTlM9bQotIyBDT05GSUdfSVBfTkZfQ09NUEFUX0lQRldBRE0gaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9IV19GTE9XQ09OVFJPTCBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0KLSMKLSMgQVJDbmV0IGRldmljZXMKLSMKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPXkKLSMgQ09ORklHX09BS05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19ORVRfVFVMSVA9eQotIyBDT05GSUdfREUyMTA0WCBpcyBub3Qgc2V0Ci1DT05GSUdfVFVMSVA9eQotIyBDT05GSUdfVFVMSVBfTVdJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTElQX01NSU8gaXMgbm90IHNldAotIyBDT05GSUdfVFVMSVBfTkFQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERTRYNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19XSU5CT05EXzg0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETTkxMDIgaXMgbm90IHNldAotIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAotQ09ORklHX05FVF9QQ0k9eQotIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAotIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0Ci1DT05GSUdfRUVQUk8xMDA9eQotIyBDT05GSUdfRUVQUk8xMDBfUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0UxMDAgaXMgbm90IHNldAotIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKLSMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAotIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAotIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAotIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAotIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCi0jIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAotIyBDT05GSUdfREwySyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAotIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCi0jCi0jIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZEREkgaXMgbm90IHNldAotIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAotIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQW1hdGV1ciBSYWRpbyBzdXBwb3J0Ci0jCi0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSXJEQSAoaW5mcmFyZWQpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotCi0jCi0jIEJsdWV0b290aCBzdXBwb3J0Ci0jCi0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLQotIwotIyBUZWxlcGhvbnkgU3VwcG9ydAotIwotIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotCi0jCi0jIElucHV0IEkvTyBkcml2ZXJzCi0jCi0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLSMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MgotIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotIyBDT05GSUdfUUlDMDJfVEFQRSBpcyBub3Qgc2V0Ci0KLSMKLSMgSVBNSQotIwotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAotQ09ORklHX0dFTl9SVEM9eQotIyBDT05GSUdfR0VOX1JUQ19YIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwotIyBDT05GSUdfRlRBUEUgaXMgbm90IHNldAotIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjIGRldmljZXMKLSMKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19GQiBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0VYVDJfRlM9eQotIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUM19GUz15Ci1DT05GSUdfRVhUM19GU19YQVRUUj15Ci0jIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLUNPTkZJR19KQkQ9eQotIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19GU19NQkNBQ0hFPXkKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19GQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAotQ09ORklHX1RNUEZTPXkKLSMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0Ci1DT05GSUdfUkFNRlM9eQotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi1DT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0QgaXMgbm90IHNldAotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19MT0NLRD15Ci0jIENPTkZJR19FWFBPUlRGUyBpcyBub3Qgc2V0Ci1DT05GSUdfU1VOUlBDPXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlRFUk1FWlpPX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi0jIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0KLSMKLSMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKLSMKLSMgQ09ORklHX05MUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotQ09ORklHX0NSQzMyPXkKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9URVhUX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0KLSMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCi0jCi0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9yYWluaWVyX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvcmFpbmllcl9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNGZjZGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvY29uZmlncy9yYWluaWVyX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDU5OSArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jCi1DT05GSUdfTU1VPXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci1DT05GSUdfSEFWRV9ERUNfTE9DSz15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi0jIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19GVVRFWD15Ci0jIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLSMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAotQ09ORklHX09CU09MRVRFX01PRFBBUk09eQotQ09ORklHX01PRFZFUlNJT05TPXkKLUNPTkZJR19LTU9EPXkKLQotIwotIyBQbGF0Zm9ybSBzdXBwb3J0Ci0jCi1DT05GSUdfUFBDPXkKLUNPTkZJR19QUEMzMj15Ci0jIENPTkZJR182eHggaXMgbm90IHNldAotQ09ORklHXzQweD15Ci0jIENPTkZJR19QT1dFUjMgaXMgbm90IHNldAotIyBDT05GSUdfOHh4IGlzIG5vdCBzZXQKLUNPTkZJR180eHg9eQotCi0jCi0jIElCTSA0eHggb3B0aW9ucwotIwotIyBDT05GSUdfQVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NFREFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQQ0k0MDUgaXMgbm90IHNldAotIyBDT05GSUdfRVA0MDUgaXMgbm90IHNldAotIyBDT05GSUdfT0FLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFRFdPT0RfNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRURXT09EXzUgaXMgbm90IHNldAotIyBDT05GSUdfUkVEV09PRF82IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZQ0FNT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJVk8gaXMgbm90IHNldAotQ09ORklHX1dBTE5VVD15Ci1DT05GSUdfSUJNNDA1X0VSUjc3PXkKLUNPTkZJR19JQk00MDVfRVJSNTE9eQotQ09ORklHX0lCTV9PQ1A9eQotQ09ORklHX0JJT1NfRklYVVA9eQotQ09ORklHXzQwNUdQPXkKLUNPTkZJR19JQk1fT1BFTkJJT1M9eQotQ09ORklHXzQwNV9ETUE9eQotIyBDT05GSUdfUE0gaXMgbm90IHNldAotQ09ORklHX1VBUlQwX1RUWVMwPXkKLSMgQ09ORklHX1VBUlQwX1RUWVMxIGlzIG5vdCBzZXQKLUNPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEU9eQotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotIyBDT05GSUdfTUFUSF9FTVVMQVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLSMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAotQ09ORklHX1BDST15Ci1DT05GSUdfUENJX0RPTUFJTlM9eQotIyBDT05GSUdfUENfS0VZQk9BUkQgaXMgbm90IHNldAotQ09ORklHX0tDT1JFX0VMRj15Ci1DT05GSUdfQklORk1UX0VMRj15Ci1DT05GSUdfS0VSTkVMX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0lfTEVHQUNZX1BST0MgaXMgbm90IHNldAotQ09ORklHX1BDSV9OQU1FUz15Ci0jIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKLQotIwotIyBBZHZhbmNlZCBzZXR1cAotIwotIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCi0jCi1DT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCi1DT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAotQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCi1DT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKLUNPTkZJR19CT09UX0xPQUQ9MHgwMDQwMDAwMAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QTlAgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0xPT1A9eQotQ09ORklHX0JMS19ERVZfTkJEPXkKLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0lERS9NRk0vUkxMIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lERSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKLSMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotQ09ORklHX1BBQ0tFVD15Ci0jIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfTVVMVElDQVNUPXkKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QPXkKLSMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlBfQk9PVFA9eQotQ09ORklHX0lQX1BOUF9SQVJQPXkKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VDTiBpcyBub3Qgc2V0Ci1DT05GSUdfU1lOX0NPT0tJRVM9eQotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi1DT05GSUdfSVBWNl9TQ1RQX189eQotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9IV19GTE9XQ09OVFJPTCBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0KLSMKLSMgQVJDbmV0IGRldmljZXMKLSMKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotIyBDT05GSUdfRVRIRVJUQVAgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPXkKLSMgQ09ORklHX09BS05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX1BDST15Ci1DT05GSUdfUENORVQzMj15Ci0jIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ER1JTIGlzIG5vdCBzZXQKLUNPTkZJR19FRVBSTzEwMD15Ci0jIENPTkZJR19FRVBSTzEwMF9QSU8gaXMgbm90IHNldAotIyBDT05GSUdfRTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GRUFMTlggaXMgbm90IHNldAotIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAotIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAotIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAotIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAotIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAotIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUdPTjMgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GRERJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKLUNPTkZJR19QUFA9eQotIyBDT05GSUdfUFBQX01VTFRJTElOSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUF9BU1lOQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfU1lOQ19UVFkgaXMgbm90IHNldAotIyBDT05GSUdfUFBQX0RFRkxBVEUgaXMgbm90IHNldAotIyBDT05GSUdfUFBQX0JTRENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCi0jCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcyAoZGVwZW5kcyBvbiBMTEM9eSkKLSMKLSMgQ09ORklHX1JDUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQW1hdGV1ciBSYWRpbyBzdXBwb3J0Ci0jCi0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSXJEQSAoaW5mcmFyZWQpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROX0JPT0wgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLQotIwotIyBPbGQgQ0QtUk9NIGRyaXZlcnMgKG5vdCBTQ1NJLCBub3QgSURFKQotIwotIyBDT05GSUdfQ0RfTk9fSURFU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi0KLSMKLSMgSW5wdXQgSS9PIGRyaXZlcnMKLSMKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci1DT05GSUdfU0VSSU89eQotQ09ORklHX1NFUklPX0k4MDQyPXkKLUNPTkZJR19TRVJJT19TRVJQT1JUPXkKLSMgQ09ORklHX1NFUklPX0NUODJDNzEwIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycwotIwotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi0jIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1VOSVg5OF9QVFlTPXkKLUNPTkZJR19VTklYOThfUFRZX0NPVU5UPTI1NgotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi1DT05GSUdfSTJDPXkKLSMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JQk1fT0NQX0FMR08gaXMgbm90IHNldAotQ09ORklHX0kyQ19DSEFSREVWPXkKLQotIwotIyBJMkMgSGFyZHdhcmUgU2Vuc29ycyBNYWluYm9hcmQgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TRU5TT1IgaXMgbm90IHNldAotCi0jCi0jIE1pY2UKLSMKLUNPTkZJR19CVVNNT1VTRT15Ci0jIENPTkZJR19RSUMwMl9UQVBFIGlzIG5vdCBzZXQKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi1DT05GSUdfV0FUQ0hET0c9eQotIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAotIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19XRFQgaXMgbm90IHNldAotIyBDT05GSUdfV0RUUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfQUNRVUlSRV9XRFQgaXMgbm90IHNldAotIyBDT05GSUdfQURWQU5URUNIX1dEVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVVJPVEVDSF9XRFQgaXMgbm90IHNldAotIyBDT05GSUdfSUI3MDBfV0RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JWENPTVdEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDeDIwMF9XRFQgaXMgbm90IHNldAotIyBDT05GSUdfNjBYWF9XRFQgaXMgbm90IHNldAotIyBDT05GSUdfVzgzODc3Rl9XRFQgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSFpfV0RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDNTIwX1dEVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUQ3WFhfVENPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FMSU03MTAxX1dEVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQzEyMDBfV0RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBRkVSX1dEVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFU1X1dEVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci1DT05GSUdfR0VOX1JUQz15Ci0jIENPTkZJR19HRU5fUlRDX1ggaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCi0jIENPTkZJR19GVEFQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BR1AgaXMgbm90IHNldAotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfSEFOR0NIRUNLX1RJTUVSIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19FWFQyX0ZTPXkKLSMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KQkQgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci1DT05GSUdfQVVUT0ZTX0ZTPXkKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLUNPTkZJR19JU085NjYwX0ZTPXkKLSMgQ09ORklHX0pPTElFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19aSVNPRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19GQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUFRTX0ZTPXkKLSMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAotIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKLUNPTkZJR19ORlNfRlM9eQotIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci1DT05GSUdfTkZTRD15Ci0jIENPTkZJR19ORlNEX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0RfVENQIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX0VYUE9SVEZTPXkKLUNPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfU1VOUlBDX0dTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlRFUk1FWlpPX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi0jIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBJQk0gNDB4IG9wdGlvbnMKLSMKLQotIwotIyBVU0Igc3VwcG9ydAotIwotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIEJsdWV0b290aCBzdXBwb3J0Ci0jCi0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX1RFWFRfREVCVUcgaXMgbm90IHNldAotQ09ORklHX09DUD15Ci0KLSMKLSMgU2VjdXJpdHkgb3B0aW9ucwotIwotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotCi0jCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucwotIwotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2NvbmZpZ3MvcmVkd29vZF9kZWZjb25maWcgYi9hcmNoL3BwYy9jb25maWdzL3JlZHdvb2RfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWEzNDhkLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL2NvbmZpZ3MvcmVkd29vZF9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw1NDAgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIwotQ09ORklHX01NVT15Ci1DT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQotQ09ORklHX0hBVkVfREVDX0xPQ0s9eQotQ09ORklHX1BQQz15Ci1DT05GSUdfUFBDMzI9eQotCi0jCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfQ0xFQU5fQ09NUElMRT15Ci0jIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKLUNPTkZJR19CUk9LRU5fT05fU01QPXkKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKLUNPTkZJR19FTUJFRERFRD15Ci0jIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlVURVg9eQotIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLSMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAotQ09ORklHX09CU09MRVRFX01PRFBBUk09eQotIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAotQ09ORklHX0tNT0Q9eQotCi0jCi0jIFByb2Nlc3NvcgotIwotIyBDT05GSUdfNnh4IGlzIG5vdCBzZXQKLUNPTkZJR180MHg9eQotIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BPV0VSMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUjQgaXMgbm90IHNldAotIyBDT05GSUdfOHh4IGlzIG5vdCBzZXQKLSMgQ09ORklHX01BVEhfRU1VTEFUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLUNPTkZJR180eHg9eQotCi0jCi0jIElCTSA0eHggb3B0aW9ucwotIwotIyBDT05GSUdfQVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NFREFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQQ0k0MDUgaXMgbm90IHNldAotIyBDT05GSUdfRVA0MDUgaXMgbm90IHNldAotIyBDT05GSUdfT0FLIGlzIG5vdCBzZXQKLUNPTkZJR19SRURXT09EXzQ9eQotIyBDT05GSUdfUkVEV09PRF81IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFRFdPT0RfNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWUNBTU9SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19USVZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTE5VVCBpcyBub3Qgc2V0Ci1DT05GSUdfSUJNNDA1X0VSUjc3PXkKLUNPTkZJR19JQk00MDVfRVJSNTE9eQotQ09ORklHX0lCTV9PQ1A9eQotQ09ORklHX1NUQjAzeHh4PXkKLUNPTkZJR19JQk1fT1BFTkJJT1M9eQotIyBDT05GSUdfNDA1X0RNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci1DT05GSUdfVUFSVDBfVFRZUzA9eQotIyBDT05GSUdfVUFSVDBfVFRZUzEgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX1NJQ0MgaXMgbm90IHNldAotQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRT15Ci0KLSMKLSMgUGxhdGZvcm0gb3B0aW9ucwotIwotIyBDT05GSUdfUENfS0VZQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfS0VSTkVMX0VMRj15Ci1DT05GSUdfQklORk1UX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAotCi0jCi0jIEJ1cyBvcHRpb25zCi0jCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfUENJX0RPTUFJTlMgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBBZHZhbmNlZCBzZXR1cAotIwotIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCi0jCi1DT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCi1DT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAotQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCi1DT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKLUNPTkZJR19CT09UX0xPQUQ9MHgwMDQwMDAwMAotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi1DT05GSUdfQkxLX0RFVl9MT09QPXkKLSMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCi0jIENPTkZJR19JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBJMk8gZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKLSMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX01VTFRJQ0FTVD15Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotQ09ORklHX0lQX1BOUF9CT09UUD15Ci1DT05GSUdfSVBfUE5QX1JBUlA9eQotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRUNOIGlzIG5vdCBzZXQKLUNPTkZJR19TWU5fQ09PS0lFUz15Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotQ09ORklHX0lQVjZfU0NUUF9fPXkKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSFdfRkxPV0NPTlRST0wgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotQ09ORklHX01JST15Ci1DT05GSUdfT0FLTkVUPXkKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQW1hdGV1ciBSYWRpbyBzdXBwb3J0Ci0jCi0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSXJEQSAoaW5mcmFyZWQpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotCi0jCi0jIEJsdWV0b290aCBzdXBwb3J0Ci0jCi0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKLSMgQ09ORklHX0lTRE5fQk9PTCBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3Mgc3VwcG9ydAotIwotIyBDT05GSUdfRkIgaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfSU5QVVQ9eQotCi0jCi0jIFVzZXJsYW5kIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgSS9PIGRyaXZlcnMKLSMKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci1DT05GSUdfU0VSSU89eQotIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJT19DVDgyQzcxMCBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycwotIwotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi0jIENPTkZJR19WVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKLSMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotIyBDT05GSUdfVU5JWDk4X1BUWVMgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi1DT05GSUdfSTJDPXkKLSMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAotCi0jCi0jIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDX0lCTV9JSUM9eQotCi0jCi0jIEkyQyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDX1NFTlNPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAotCi0jCi0jIE1pY2UKLSMKLSMgQ09ORklHX0JVU01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FJQzAyX1RBUEUgaXMgbm90IHNldAotCi0jCi0jIElQTUkKLSMKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5fUlRDPXkKLSMgQ09ORklHX0dFTl9SVENfWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKLSMgQ09ORklHX0ZUQVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FHUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk0gaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLUNPTkZJR19FWFQzX0ZTPXkKLUNPTkZJR19FWFQzX0ZTX1hBVFRSPXkKLSMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAotQ09ORklHX0pCRD15Ci0jIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0ZTX01CQ0FDSEU9eQotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0ZBVF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19QUk9DX0tDT1JFPXkKLSMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAotIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKLUNPTkZJR19ORlNfRlM9eQotIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotIyBDT05GSUdfRVhQT1JURlMgaXMgbm90IHNldAotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19TVU5SUENfR1NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOVEVSTUVaWk9fRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLSMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIElCTSA0MHggb3B0aW9ucwotIwotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi1DT05GSUdfQ1JDMzI9eQotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotQ09ORklHX1NFUklBTF9URVhUX0RFQlVHPXkKLUNPTkZJR19PQ1A9eQotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3BwYy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggYjE0NTdhOC4uMWZiOTJmMSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTUsOCArMTUsOSBAQAogb2JqLXkJCQkJOj0gZW50cnkubyB0cmFwcy5vIGlycS5vIGlkbGUubyB0aW1lLm8gbWlzYy5vIFwKIAkJCQkJcHJvY2Vzcy5vIHNpZ25hbC5vIHB0cmFjZS5vIGFsaWduLm8gXAogCQkJCQlzZW1hcGhvcmUubyBzeXNjYWxscy5vIHNldHVwLm8gXAotCQkJCQljcHV0YWJsZS5vIHBwY19odGFiLm8gcGVyZm1vbi5vCisJCQkJCWNwdXRhYmxlLm8gcHBjX2h0YWIubwogb2JqLSQoQ09ORklHXzZ4eCkJCSs9IGwyY3IubyBjcHVfc2V0dXBfNnh4Lm8KK29iai0kKENPTkZJR19FNTAwKQkJKz0gcGVyZm1vbi5vCiBvYmotJChDT05GSUdfU09GVFdBUkVfU1VTUEVORCkJKz0gc3dzdXNwLm8KIG9iai0kKENPTkZJR19QT1dFUjQpCQkrPSBjcHVfc2V0dXBfcG93ZXI0Lm8KIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8gcHBjX2tzeW1zLm8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9jcHVfc2V0dXBfNnh4LlMgYi9hcmNoL3BwYy9rZXJuZWwvY3B1X3NldHVwXzZ4eC5TCmluZGV4IDQ2ODcyMWQuLmJhMzk2NDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9jcHVfc2V0dXBfNnh4LlMKKysrIGIvYXJjaC9wcGMva2VybmVsL2NwdV9zZXR1cF82eHguUwpAQCAtMTIsMTAgKzEyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KIAogX0dMT0JBTChfX3NldHVwX2NwdV82MDEpCkBAIC0yNDksOCArMjQ4LDExIEBACiAJc3luYwogCWlzeW5jCiAKLQkvKiBFbmFibGUgTDIgSFcgcHJlZmV0Y2gKKwkvKiBFbmFibGUgTDIgSFcgcHJlZmV0Y2gsIGlmIEwyIGlzIGVuYWJsZWQKIAkgKi8KKwltZnNwcglyMyxTUFJOX0wyQ1IKKwlhbmRpcy4JcjMscjMsTDJDUl9MMkVAaAorCWJlcWxyCiAJbWZzcHIJcjMsU1BSTl9NU1NDUjAKIAlvcmkJcjMscjMsMwogCXN5bmMKQEAgLTMyNCw2ICszMjYsNyBAQAogCWNtcGx3aQljcjQscjMsMHg4MDAyCS8qIDc0NTcgKi8KIAljbXBsd2kJY3I1LHIzLDB4ODAwMwkvKiA3NDQ3QSAqLwogCWNtcGx3aQljcjYscjMsMHg3MDAwCS8qIDc1MEZYICovCisJY21wbHdpCWNyNyxyMywweDgwMDQJLyogNzQ0OCAqLwogCS8qIGNyMSBpcyA3NDAwIHx8IDc0MTAgKi8KIAljcm9yCTQqY3IxK2VxLDQqY3IxK2VxLDQqY3IyK2VxCiAJLyogY3IwIGlzIDc0eHggKi8KQEAgLTMzMSw2ICszMzQsNyBAQAogCWNyb3IJNCpjcjArZXEsNCpjcjArZXEsNCpjcjQrZXEKIAljcm9yCTQqY3IwK2VxLDQqY3IwK2VxLDQqY3IxK2VxCiAJY3Jvcgk0KmNyMCtlcSw0KmNyMCtlcSw0KmNyNStlcQorCWNyb3IJNCpjcjArZXEsNCpjcjArZXEsNCpjcjcrZXEKIAlibmUJMWYKIAkvKiBCYWNrdXAgNzR4eCBzcGVjaWZpYyByZWdzICovCiAJbWZzcHIJcjQsU1BSTl9NU1NDUjAKQEAgLTM5Myw2ICszOTcsNyBAQAogCWNtcGx3aQljcjQscjMsMHg4MDAyCS8qIDc0NTcgKi8KIAljbXBsd2kJY3I1LHIzLDB4ODAwMwkvKiA3NDQ3QSAqLwogCWNtcGx3aQljcjYscjMsMHg3MDAwCS8qIDc1MEZYICovCisJY21wbHdpCWNyNyxyMywweDgwMDQJLyogNzQ0OCAqLwogCS8qIGNyMSBpcyA3NDAwIHx8IDc0MTAgKi8KIAljcm9yCTQqY3IxK2VxLDQqY3IxK2VxLDQqY3IyK2VxCiAJLyogY3IwIGlzIDc0eHggKi8KQEAgLTQwMCw2ICs0MDUsNyBAQAogCWNyb3IJNCpjcjArZXEsNCpjcjArZXEsNCpjcjQrZXEKIAljcm9yCTQqY3IwK2VxLDQqY3IwK2VxLDQqY3IxK2VxCiAJY3Jvcgk0KmNyMCtlcSw0KmNyMCtlcSw0KmNyNStlcQorCWNyb3IJNCpjcjArZXEsNCpjcjArZXEsNCpjcjcrZXEKIAlibmUJMmYKIAkvKiBSZXN0b3JlIDc0eHggc3BlY2lmaWMgcmVncyAqLwogCWx3eglyNCxDU19NU1NDUjAocjUpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvY3B1X3NldHVwX3Bvd2VyNC5TIGIvYXJjaC9wcGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUwppbmRleCBmMmVhMWE5Li43ZTRmYmI2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvY3B1X3NldHVwX3Bvd2VyNC5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMKQEAgLTE0LDggKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogCiBfR0xPQkFMKF9fOTcwX2NwdV9wcmVpbml0KQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3BwYy9rZXJuZWwvY3B1dGFibGUuYwppbmRleCA4YTNkNzRmLi41NDZlMWVhIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvY3B1dGFibGUuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvY3B1dGFibGUuYwpAQCAtMTk4LDIwICsxOTgsNiBAQAogCQkubnVtX3BtY3MJCT0gNCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTAKIAl9LAotCXsJLyogNzQ1Lzc1NSAqLwotCQkucHZyX21hc2sJCT0gMHhmZmZmZjAwMCwKLQkJLnB2cl92YWx1ZQkJPSAweDAwMDgzMDAwLAotCQkuY3B1X25hbWUJCT0gIjc0NS83NTUiLAotCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfQ09NTU9OIHwKLQkJCUNQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwKLQkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9UQVUgfAotCQkJQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fUFBDLAotCQkuaWNhY2hlX2JzaXplCQk9IDMyLAotCQkuZGNhY2hlX2JzaXplCQk9IDMyLAotCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTAKLQl9LAogCXsJLyogNzUwQ1ggKDgwMTAwIGFuZCA4MDEweD8pICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmYwLAogCQkucHZyX3ZhbHVlCQk9IDB4MDAwODAxMDAsCkBAIC0yNTQsNiArMjQwLDM0IEBACiAJCS5udW1fcG1jcwkJPSA0LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGN4CiAJfSwKKwl7CS8qIDc1MENYZSAiR2Vra28iICg4MzIxNCkgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmZmYsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDA4MzIxNCwKKwkJLmNwdV9uYW1lCQk9ICI3NTBDWGUiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfQ09NTU9OIHwKKwkJCUNQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9UQVUgfAorCQkJQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fUFBDLAorCQkuaWNhY2hlX2JzaXplCQk9IDMyLAorCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkubnVtX3BtY3MJCT0gNCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeAorCX0sCisJewkvKiA3NDUvNzU1ICovCisJCS5wdnJfbWFzawkJPSAweGZmZmZmMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAwODMwMDAsCisJCS5jcHVfbmFtZQkJPSAiNzQ1Lzc1NSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9DT01NT04gfAorCQkJQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX1RBVSB8CisJCQlDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9QUEMsCisJCS5pY2FjaGVfYnNpemUJCT0gMzIsCisJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5udW1fcG1jcwkJPSA0LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MAorCX0sCiAJewkvKiA3NTBGWCByZXYgMS54ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZjAwLAogCQkucHZyX3ZhbHVlCQk9IDB4NzAwMDAxMDAsCkBAIC01MzYsNiArNTUwLDIyIEBACiAJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgKIAl9LAorCXsJLyogNzQ0OCAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDgwMDQwMDAwLAorCQkuY3B1X25hbWUJCT0gIjc0NDgiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfQ09NTU9OIHwKKwkJCUNQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8CisJCQlDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfAorCQkJQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAorCQkJQ1BVX0ZUUl9TUEVDNzQ1MCB8IENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfAorCQkJQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5ULAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fUFBDIHwgUFBDX0ZFQVRVUkVfQUxUSVZFQ19DT01QLAorCQkuaWNhY2hlX2JzaXplCQk9IDMyLAorCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkubnVtX3BtY3MJCT0gNiwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDV4CisJfSwKIAl7CS8qIDgyeHggKDgyNDAsIDgyNDUsIDgyNjAgYXJlIGFsbCA2MDNlIGNvcmVzKSAqLwogCQkucHZyX21hc2sJCT0gMHg3ZmZmMDAwMCwKIAkJLnB2cl92YWx1ZQkJPSAweDAwODEwMDAwLApAQCAtOTIyLDYgKzk1MiwyNiBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCX0sCisJeyAvKiA0NDBHWCBSZXYuIEYgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZjAwMDBmZmYsCisJCS5wdnJfdmFsdWUJCT0gMHg1MDAwMDg5NCwKKwkJLmNwdV9uYW1lCQk9ICI0NDBHWCBSZXYuIEYiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSwKKwkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwl9LAorCXsgLyogNDQwU1AgUmV2LiBBICovCisJCS5wdnJfbWFzawkJPSAweGZmMDAwZmZmLAorCQkucHZyX3ZhbHVlCQk9IDB4NTMwMDA4OTEsCisJCS5jcHVfbmFtZQkJPSAiNDQwU1AgUmV2LiBBIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8IFBQQ19GRUFUVVJFX0hBU19NTVUsCisJCS5pY2FjaGVfYnNpemUJCT0gMzIsCisJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJfSwKICNlbmRpZiAvKiBDT05GSUdfNDR4ICovCiAjaWZkZWYgQ09ORklHX0ZTTF9CT09LRQogCXsgCS8qIGUyMDB6NSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2RtYS1tYXBwaW5nLmMgYi9hcmNoL3BwYy9rZXJuZWwvZG1hLW1hcHBpbmcuYwppbmRleCBlMGM2MzFjZi4uYjU2NmQ5OCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL2RtYS1tYXBwaW5nLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL2RtYS1tYXBwaW5nLmMKQEAgLTM5Myw3ICszOTMsNyBAQAogICogX19kbWFfc3luY19wYWdlKCkgaW1wbGVtZW50YXRpb24gZm9yIHN5c3RlbXMgdXNpbmcgaGlnaG1lbS4KICAqIEluIHRoaXMgY2FzZSwgZWFjaCBwYWdlIG9mIGEgYnVmZmVyIG11c3QgYmUga21hcHBlZC9rdW5tYXBwZWQKICAqIGluIG9yZGVyIHRvIGhhdmUgYSB2aXJ0dWFsIGFkZHJlc3MgZm9yIF9fZG1hX3N5bmMoKS4gVGhpcyBtdXN0Ci0gKiBub3Qgc2xlZXAgc28ga21hcF9hdG1vbWljKCkva3VubWFwX2F0b21pYygpIGFyZSB1c2VkLgorICogbm90IHNsZWVwIHNvIGttYXBfYXRvbWljKCkva3VubWFwX2F0b21pYygpIGFyZSB1c2VkLgogICoKICAqIE5vdGU6IHllcywgaXQgaXMgcG9zc2libGUgYW5kIGNvcnJlY3QgdG8gaGF2ZSBhIGJ1ZmZlciBleHRlbmQKICAqIGJleW9uZCB0aGUgZmlyc3QgcGFnZS4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9wcGMva2VybmVsL2VudHJ5LlMKaW5kZXggY2I4MzA0NS4uMDNkNDg4NiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9wcGMva2VybmVsL2VudHJ5LlMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCiAjdW5kZWYgU0hPV19TWVNDQUxMUwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2ZpbmRfbmFtZS5jIGIvYXJjaC9wcGMva2VybmVsL2ZpbmRfbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzBmYThlLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL2tlcm5lbC9maW5kX25hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0vKgotICogRmluZHMgYSBnaXZlbiBhZGRyZXNzIGluIHRoZSBTeXN0ZW0ubWFwIGFuZCBwcmludHMgaXQgb3V0Ci0gKiB3aXRoIGl0cyBuZWlnaGJvcnMuICAtLSBDb3J0Ci0gKi8KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCXVuc2lnbmVkIGxvbmcgYWRkciwgY21wLCBpOwotCUZJTEUgKmY7Ci0JY2hhciBzWzI1Nl0sIGxhc3RbMjU2XTsKLQkKLQlpZiAoIGFyZ2MgPCAyICkKLQl7Ci0JCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIDxhZGRyZXNzPlxuIiwgYXJndlswXSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlmb3IgKCBpID0gMSA7IGFyZ3ZbaV0gOyBpKysgKQotCXsKLQkJc3NjYW5mKCBhcmd2W2ldLCAiJTBseCIsICZhZGRyICk7Ci0JCS8qIGFkanVzdCBpZiBhZGRyIGlzIHJlbGF0aXZlIHRvIGtlcm5lbGJhc2UgKi8KLQkJaWYgKCBhZGRyIDwgUEFHRV9PRkZTRVQgKQotCQkJYWRkciArPSBQQUdFX09GRlNFVDsKLQkJCi0JCWlmICggKGYgPSBmb3BlbiggIlN5c3RlbS5tYXAiLCAiciIgKSkgPT0gTlVMTCApCi0JCXsKLQkJCXBlcnJvcigiZm9wZW4oKVxuIik7Ci0JCQlleGl0KC0xKTsKLQkJfQotCQkKLQkJd2hpbGUgKCAhZmVvZihmKSApCi0JCXsKLQkJCWZnZXRzKHMsIDI1NSAsIGYpOwotCQkJc3NjYW5mKCBzLCAiJTBseCIsICZjbXAgKTsKLQkJCWlmICggYWRkciA8IGNtcCApCi0JCQkJYnJlYWs7Ci0JCQlzdHJjcHkoIGxhc3QsIHMpOwotCQl9Ci0JCQotCQlwcmludGYoICIlcyVzIiwgbGFzdCwgcyApOwotCX0JCQotCWZjbG9zZShmKTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9mcHUuUyBiL2FyY2gvcHBjL2tlcm5lbC9mcHUuUwppbmRleCA2MTg5YjI2Li42NjVkN2QzIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvZnB1LlMKKysrIGIvYXJjaC9wcGMva2VybmVsL2ZwdS5TCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAvKgogICogVGhpcyB0YXNrIHdhbnRzIHRvIHVzZSB0aGUgRlBVIG5vdy4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9oZWFkLlMgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZC5TCmluZGV4IGE5MzFkNzcuLjE5NjBmYjggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9wcGMva2VybmVsL2hlYWQuUwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogI2lmZGVmIENPTkZJR19BUFVTCiAjaW5jbHVkZSA8YXNtL2FtaWdhcHBjLmg+CkBAIC0xMDIzLDIzICsxMDIzLDIxIEBACiAgICAgICAgIGFuZGMgICAgcjQscjQscjMKICAgICAgICAgbXRzcHIgICBTUFJOX0hJRDAscjQKICAgICAgICAgc3luYwotICAgICAgICBibCAgICAgIGdlbWluaV9wcm9tX2luaXQKICAgICAgICAgYiAgICAgICBfX3NlY29uZGFyeV9zdGFydAogI2VuZGlmIC8qIENPTkZJR19HRU1JTkkgKi8KLQkuZ2xvYmwJX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlCi1fX3NlY29uZGFyeV9zdGFydF9wc3VyZ2U6Ci0JbGkJcjI0LDEJCQkvKiBjcHUgIyAqLwotCWIJX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlOTkKLQkuZ2xvYmwJX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlMgotX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlMjoKLQlsaQlyMjQsMgkJCS8qIGNwdSAjICovCi0JYglfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2U5OQotCS5nbG9ibAlfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2UzCi1fX3NlY29uZGFyeV9zdGFydF9wc3VyZ2UzOgotCWxpCXIyNCwzCQkJLyogY3B1ICMgKi8KLQliCV9fc2Vjb25kYXJ5X3N0YXJ0X3BzdXJnZTk5Ci1fX3NlY29uZGFyeV9zdGFydF9wc3VyZ2U5OToKLQkvKiB3ZSBjb21lIGluIGhlcmUgd2l0aCBJUj0wIGFuZCBEUj0xLCBhbmQgREJBVCAwCisKKwkuZ2xvYmwJX19zZWNvbmRhcnlfc3RhcnRfcG1hY18wCitfX3NlY29uZGFyeV9zdGFydF9wbWFjXzA6CisJLyogTkIgdGhlIGVudHJpZXMgZm9yIGNwdXMgMCwgMSwgMiBtdXN0IGVhY2ggb2NjdXB5IDggYnl0ZXMuICovCisJbGkJcjI0LDAKKwliCTFmCisJbGkJcjI0LDEKKwliCTFmCisJbGkJcjI0LDIKKwliCTFmCisJbGkJcjI0LDMKKzE6CisJLyogb24gcG93ZXJzdXJnZSwgd2UgY29tZSBpbiBoZXJlIHdpdGggSVI9MCBhbmQgRFI9MSwgYW5kIERCQVQgMAogCSAgIHNldCB0byBtYXAgdGhlIDB4ZjAwMDAwMDAgLSAweGZmZmZmZmZmIHJlZ2lvbiAqLwogCW1mbXNyCXIwCiAJcmx3aW5tCXIwLHIwLDAsMjgsMjYJCS8qIGNsZWFyIERSICgweDEwKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2hlYWRfNDR4LlMgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF80NHguUwppbmRleCA2OWZmM2E5Li41OTkyNDViIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvaGVhZF80NHguUworKysgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF80NHguUwpAQCAtNDAsNyArNDAsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlICJoZWFkX2Jvb2tlLmgiCiAKIApAQCAtNDYyLDcgKzQ2MiwxMSBAQAogCiAJLyogV2F0Y2hkb2cgVGltZXIgSW50ZXJydXB0ICovCiAJLyogVE9ETzogQWRkIHdhdGNoZG9nIHN1cHBvcnQgKi8KKyNpZmRlZiBDT05GSUdfQk9PS0VfV0RUCisJQ1JJVElDQUxfRVhDRVBUSU9OKDB4MTAyMCwgV2F0Y2hkb2dUaW1lciwgV2F0Y2hkb2dFeGNlcHRpb24pCisjZWxzZQogCUNSSVRJQ0FMX0VYQ0VQVElPTigweDEwMjAsIFdhdGNoZG9nVGltZXIsIFVua25vd25FeGNlcHRpb24pCisjZW5kaWYKIAogCS8qIERhdGEgVExCIEVycm9yIEludGVycnVwdCAqLwogCVNUQVJUX0VYQ0VQVElPTihEYXRhVExCRXJyb3IpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvaGVhZF80eHguUyBiL2FyY2gvcHBjL2tlcm5lbC9oZWFkXzR4eC5TCmluZGV4IDIzZmI1MTguLjg1NjJiODAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9oZWFkXzR4eC5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9oZWFkXzR4eC5TCkBAIC00MCw3ICs0MCw3IEBACiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAvKiBBcyB3aXRoIHRoZSBvdGhlciBQb3dlclBDIHBvcnRzLCBpdCBpcyBleHBlY3RlZCB0aGF0IHdoZW4gY29kZQogICogZXhlY3V0aW9uIGJlZ2lucyBoZXJlLCB0aGUgZm9sbG93aW5nIHJlZ2lzdGVycyBjb250YWluIHZhbGlkLCB5ZXQKQEAgLTQ0OCw5ICs0NDgsMTIgQEAKIAogLyogMHgxMDIwIC0gV2F0Y2hkb2cgVGltZXIgKFdEVCkgRXhjZXB0aW9uCiAqLwotCisjaWZkZWYgQ09ORklHX0JPT0tFX1dEVAorCUNSSVRJQ0FMX0VYQ0VQVElPTigweDEwMjAsIFdEVEV4Y2VwdGlvbiwgV2F0Y2hkb2dFeGNlcHRpb24pCisjZWxzZQogCUNSSVRJQ0FMX0VYQ0VQVElPTigweDEwMjAsIFdEVEV4Y2VwdGlvbiwgVW5rbm93bkV4Y2VwdGlvbikKICNlbmRpZgorI2VuZGlmCiAKIC8qIDB4MTEwMCAtIERhdGEgVExCIE1pc3MgRXhjZXB0aW9uCiAgKiBBcyB0aGUgbmFtZSBpbXBsaWVzLCB0cmFuc2xhdGlvbiBpcyBub3QgaW4gdGhlIE1NVSwgc28gc2VhcmNoIHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2hlYWRfOHh4LlMgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUwppbmRleCBlYjE4Y2FkLi5jYjFhM2E1IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUworKysgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogLyogTWFjcm8gdG8gbWFrZSB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLiAqLwogI2lmZGVmIENPTkZJR184eHhfQ1BVNgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUwppbmRleCBlYjgwNGI3Li44ZTUyZTg0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUworKysgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUwpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlICJoZWFkX2Jvb2tlLmgiCiAKIC8qIEFzIHdpdGggdGhlIG90aGVyIFBvd2VyUEMgcG9ydHMsIGl0IGlzIGV4cGVjdGVkIHRoYXQgd2hlbiBjb2RlCkBAIC01NjQsOCArNTY0LDExIEBACiAJRVhDRVBUSU9OKDB4MzEwMCwgRml4ZWRJbnRlcnZhbFRpbWVyLCBVbmtub3duRXhjZXB0aW9uLCBFWENfWEZFUl9FRSkKIAogCS8qIFdhdGNoZG9nIFRpbWVyIEludGVycnVwdCAqLwotCS8qIFRPRE86IEFkZCB3YXRjaGRvZyBzdXBwb3J0ICovCisjaWZkZWYgQ09ORklHX0JPT0tFX1dEVAorCUNSSVRJQ0FMX0VYQ0VQVElPTigweDMyMDAsIFdhdGNoZG9nVGltZXIsIFdhdGNoZG9nRXhjZXB0aW9uKQorI2Vsc2UKIAlDUklUSUNBTF9FWENFUFRJT04oMHgzMjAwLCBXYXRjaGRvZ1RpbWVyLCBVbmtub3duRXhjZXB0aW9uKQorI2VuZGlmCiAKIAkvKiBEYXRhIFRMQiBFcnJvciBJbnRlcnJ1cHQgKi8KIAlTVEFSVF9FWENFUFRJT04oRGF0YVRMQkVycm9yKQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2lkbGUuYyBiL2FyY2gvcHBjL2tlcm5lbC9pZGxlLmMKaW5kZXggNTM1NDdiNi4uZmJhMjljOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL2lkbGUuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvaWRsZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMzUsNiArMzYsNyBAQAogdm9pZCBkZWZhdWx0X2lkbGUodm9pZCkKIHsKIAl2b2lkICgqcG93ZXJzYXZlKSh2b2lkKTsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJcG93ZXJzYXZlID0gcHBjX21kLnBvd2VyX3NhdmU7CiAKQEAgLTQ0LDcgKzQ2LDcgQEAKICNpZmRlZiBDT05GSUdfU01QCiAJCWVsc2UgewogCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7Ci0JCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQorCQkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhY3B1X2lzX29mZmxpbmUoY3B1KSkKIAkJCQliYXJyaWVyKCk7CiAJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwogCQl9CkBAIC01Miw2ICs1NCw4IEBACiAJfQogCWlmIChuZWVkX3Jlc2NoZWQoKSkKIAkJc2NoZWR1bGUoKTsKKwlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSAmJiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpCisJCWNwdV9kaWUoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9pZGxlXzZ4eC5TIGIvYXJjaC9wcGMva2VybmVsL2lkbGVfNnh4LlMKaW5kZXggMjVkMDA5Yy4uMWEyMTk0YyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL2lkbGVfNnh4LlMKKysrIGIvYXJjaC9wcGMva2VybmVsL2lkbGVfNnh4LlMKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICN1bmRlZiBERUJVRwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvaWRsZV9wb3dlcjQuUyBiL2FyY2gvcHBjL2tlcm5lbC9pZGxlX3Bvd2VyNC5TCmluZGV4IDczYTU4ZmYuLmNjMGQ1MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9pZGxlX3Bvd2VyNC5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9pZGxlX3Bvd2VyNC5TCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjdW5kZWYgREVCVUcKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2wyY3IuUyBiL2FyY2gvcHBjL2tlcm5lbC9sMmNyLlMKaW5kZXggYzM5NDQxMC4uODYxMTE1MiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL2wyY3IuUworKysgYi9hcmNoL3BwYy9rZXJuZWwvbDJjci5TCkBAIC0xNTYsNiArMTU2LDI2IEBACiAJICAgICAgIFRoZSBiaXQgbW92ZWQgb24gdGhlIDc0NTAuLi4uLgogCSAgKioqKi8KIAorQkVHSU5fRlRSX1NFQ1RJT04KKwkvKiBEaXNhYmxlIEwyIHByZWZldGNoIG9uIHNvbWUgNzQ1eCBhbmQgdHJ5IHRvIGVuc3VyZQorCSAqIEwyIHByZWZldGNoIGVuZ2luZXMgYXJlIGlkbGUuIEFzIGV4cGxhaW5lZCBieSBlcnJhdGEKKwkgKiB0ZXh0LCB3ZSBjYW4ndCBiZSBzdXJlIHRoZXkgYXJlLCB3ZSBqdXN0IGhvcGUgdmVyeSBoYXJkCisJICogdGhhdCB3ZWxsIGJlIGVub3VnaCAoc2ljICEpLiBBdCBsZWFzdCBJIG5vdGljZWQgQXBwbGUKKwkgKiBkb2Vzbid0IGV2ZW4gYm90aGVyIGRvaW5nIHRoZSBkY2JmJ3MgaGVyZS4uLgorCSAqLworCW1mc3ByCXI0LFNQUk5fTVNTQ1IwCisJcmx3aW5tCXI0LHI0LDAsMCwyOQorCXN5bmMKKwltdHNwcglTUFJOX01TU0NSMCxyNAorCXN5bmMKKwlpc3luYworCWxpcwlyNCxLRVJORUxCQVNFQGgKKwlkY2JmCTAscjQKKwlkY2JmCTAscjQKKwlkY2JmCTAscjQKKwlkY2JmCTAscjQKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1NQRUM3NDUwKQorCiAJLyogVE9ETzogdXNlIEhXIGZsdXNoIGFzc2lzdCB3aGVuIGF2YWlsYWJsZSAqLwogCiAJbGlzCXI0LDB4MDAwMgpAQCAtMjMwLDcgKzI1MCwxNiBAQAogCW9yaXMJcjMscjMsMHg4MDAwCiAJbXRzcHIJU1BSTl9MMkNSLHIzCiAJc3luYwotCisJCisJLyogRW5hYmxlIEwyIEhXIHByZWZldGNoIG9uIDc0NHgvNzQ1eCAqLworQkVHSU5fRlRSX1NFQ1RJT04KKwltZnNwcglyMyxTUFJOX01TU0NSMAorCW9yaQlyMyxyMywzCisJc3luYworCW10c3ByCVNQUk5fTVNTQ1IwLHIzCisJc3luYworCWlzeW5jCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9TUEVDNzQ1MCkKIDQ6CiAKIAkvKiBSZXN0b3JlIEhJRDBbRFBNXSB0byB3aGF0ZXZlciBpdCB3YXMgYmVmb3JlICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TIGIvYXJjaC9wcGMva2VybmVsL21pc2MuUwppbmRleCBjZTcxYjRhLi45MGQ5MTdkIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAJLnRleHQKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3BjaS5jIGIvYXJjaC9wcGMva2VybmVsL3BjaS5jCmluZGV4IDdiMzU4NmEuLjg1NGU0NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvcGNpLmMKQEAgLTgwLDcgKzgwLDYgQEAKIAlpZiAoKGRldi0+Y2xhc3M+PjggPT0gUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQpKSB7CiAJCWRldi0+dmVuZG9yID0gUENJX1ZFTkRPUl9JRF9BTUQ7CiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9WRU5ET1JfSUQsIFBDSV9WRU5ET1JfSURfQU1EKTsKLQkJcGNpX25hbWVfZGV2aWNlKGRldik7CiAJfQogfQogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfVFJJREVOVCwJUENJX0FOWV9JRCwJCQlmaXh1cF9icm9rZW5fcGNuZXQzMik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMKaW5kZXggZTdkNDBjYy4uODhmNmJiNyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYwpAQCAtNTEsOSArNTEsNiBAQAogI2luY2x1ZGUgPGFzbS9jb21tcHJvYy5oPgogI2VuZGlmCiAKLS8qIFRlbGwgc3RyaW5nLmggd2UgZG9uJ3Qgd2FudCBtZW1jcHkgZXRjLiBhcyBjcHAgZGVmaW5lcyAqLwotI2RlZmluZSBFWFBPUlRfU1lNVEFCX1NUUk9QUwotCiBleHRlcm4gdm9pZCB0cmFuc2Zlcl90b19oYW5kbGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgZG9fSVJRKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiB2b2lkIE1hY2hpbmVDaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CkBAIC0yNjMsNiArMjYwLDcgQEAKIEVYUE9SVF9TWU1CT0woX19hc2hsZGkzKTsKIEVYUE9SVF9TWU1CT0woX19sc2hyZGkzKTsKIEVYUE9SVF9TWU1CT0wobWVtY3B5KTsKK0VYUE9SVF9TWU1CT0woY2FjaGVhYmxlX21lbWNweSk7CiBFWFBPUlRfU1lNQk9MKG1lbXNldCk7CiBFWFBPUlRfU1lNQk9MKG1lbW1vdmUpOwogRVhQT1JUX1NZTUJPTChtZW1zY2FuKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKaW5kZXggOTI5ZTVkMS4uNTQ1Y2ZkMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKQEAgLTQxLDcgKzQxLDExIEBACiAjaW5jbHVkZSA8YXNtL3htb24uaD4KICNpbmNsdWRlIDxhc20vb2NwLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR184NXh4KSB8fCBkZWZpbmVkKENPTkZJR184M3h4KSB8fCBkZWZpbmVkKENPTkZJR19NUEMxMFhfQlJJREdFKQorI2RlZmluZSBVU0VTX1BQQ19TWVMgKGRlZmluZWQoQ09ORklHXzg1eHgpIHx8IGRlZmluZWQoQ09ORklHXzgzeHgpIHx8IFwKKwkJICAgICAgZGVmaW5lZChDT05GSUdfTVBDMTBYX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfODI2MCkgfHwgXAorCQkgICAgICBkZWZpbmVkKENPTkZJR19QUENfTVBDNTJ4eCkpCisKKyNpZiBVU0VTX1BQQ19TWVMKICNpbmNsdWRlIDxhc20vcHBjX3N5cy5oPgogI2VuZGlmCiAKQEAgLTI0MSw3ICsyNDUsNyBAQAogCXNlcV9wcmludGYobSwgImJvZ29taXBzXHQ6ICVsdS4lMDJsdVxuIiwKIAkJICAgbHBqIC8gKDUwMDAwMC9IWiksIChscGogLyAoNTAwMC9IWikpICUgMTAwKTsKIAotI2lmIGRlZmluZWQoQ09ORklHXzg1eHgpIHx8IGRlZmluZWQoQ09ORklHXzgzeHgpIHx8IGRlZmluZWQoQ09ORklHX01QQzEwWF9CUklER0UpCisjaWYgVVNFU19QUENfU1lTCiAJaWYgKGN1cl9wcGNfc3lzX3NwZWMtPnBwY19zeXNfbmFtZSkKIAkJc2VxX3ByaW50ZihtLCAiY2hpcHNldFx0XHQ6ICVzXG4iLAogCQkJY3VyX3BwY19zeXNfc3BlYy0+cHBjX3N5c19uYW1lKTsKQEAgLTYxNSw2ICs2MTksMjYgQEAKIAlpZiAocHBjX21kLnByb2dyZXNzKQogCQlwcGNfbWQucHJvZ3Jlc3MoImlkIG1hY2goKTogZG9uZSIsIDB4MjAwKTsKIH0KKyNpZmRlZiBDT05GSUdfQk9PS0VfV0RUCisvKiBDaGVja3Mgd2R0PXggYW5kIHdkdF9wZXJpb2Q9eHggY29tbWFuZC1saW5lIG9wdGlvbiAqLworaW50IF9faW5pdCBlYXJseV9wYXJzZV93ZHQoY2hhciAqcCkKK3sKKwlpZiAocCAmJiBzdHJuY21wKHAsICIwIiwgMSkgIT0gMCkKKwkgICAgICAgYm9va2Vfd2R0X2VuYWJsZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgid2R0IiwgZWFybHlfcGFyc2Vfd2R0KTsKKworaW50IF9faW5pdCBlYXJseV9wYXJzZV93ZHRfcGVyaW9kIChjaGFyICpwKQoreworCWlmIChwKQorCQlib29rZV93ZHRfcGVyaW9kID0gc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMCk7CisKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJ3ZHRfcGVyaW9kIiwgZWFybHlfcGFyc2Vfd2R0X3BlcmlvZCk7CisjZW5kaWYJLyogQ09ORklHX0JPT0tFX1dEVCAqLwogCiAvKiBDaGVja3MgImwyY3I9eHh4eCIgY29tbWFuZC1saW5lIG9wdGlvbiAqLwogaW50IF9faW5pdCBwcGNfc2V0dXBfbDJjcihjaGFyICpzdHIpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvc21wLmMgYi9hcmNoL3BwYy9rZXJuZWwvc21wLmMKaW5kZXggZTcwYjU4Ny4uNzI2ZmU3YyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9zbXAuYwpAQCAtNDUsNiArNDUsNyBAQAogY3B1bWFza190IGNwdV9wb3NzaWJsZV9tYXA7CiBpbnQgc21wX2h3X2luZGV4W05SX0NQVVNdOwogc3RydWN0IHRocmVhZF9pbmZvICpzZWNvbmRhcnlfdGk7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICppZGxlX3Rhc2tzW05SX0NQVVNdOwogCiBFWFBPUlRfU1lNQk9MKGNwdV9vbmxpbmVfbWFwKTsKIEVYUE9SVF9TWU1CT0woY3B1X3Bvc3NpYmxlX21hcCk7CkBAIC0yODYsNyArMjg3LDggQEAKIAogdm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7Ci0JaW50IG51bV9jcHVzLCBpOworCWludCBudW1fY3B1cywgaSwgY3B1OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAogCS8qIEZpeHVwIGJvb3QgY3B1ICovCiAgICAgICAgIHNtcF9zdG9yZV9jcHVfaW5mbyhzbXBfcHJvY2Vzc29yX2lkKCkpOwpAQCAtMzA4LDYgKzMxMCwxNyBAQAogCiAJaWYgKHNtcF9vcHMtPnNwYWNlX3RpbWVycykKIAkJc21wX29wcy0+c3BhY2VfdGltZXJzKG51bV9jcHVzKTsKKworCWZvcl9lYWNoX2NwdShjcHUpIHsKKwkJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCQljb250aW51ZTsKKwkJLyogY3JlYXRlIGEgcHJvY2VzcyBmb3IgdGhlIHByb2Nlc3NvciAqLworCQlwID0gZm9ya19pZGxlKGNwdSk7CisJCWlmIChJU19FUlIocCkpCisJCQlwYW5pYygiZmFpbGVkIGZvcmsgZm9yIENQVSAldTogJWxpIiwgY3B1LCBQVFJfRVJSKHApKTsKKwkJcC0+dGhyZWFkX2luZm8tPmNwdSA9IGNwdTsKKwkJaWRsZV90YXNrc1tjcHVdID0gcDsKKwl9CiB9CiAKIHZvaWQgX19kZXZpbml0IHNtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCkBAIC0zMzQsMTIgKzM0NywxNyBAQAogCXNldF9kZWModGJfdGlja3NfcGVyX2ppZmZ5KTsKIAljcHVfY2FsbGluX21hcFtjcHVdID0gMTsKIAotCXByaW50aygiQ1BVICVpIGRvbmUgY2FsbGluLi4uXG4iLCBjcHUpOworCXByaW50aygiQ1BVICVkIGRvbmUgY2FsbGluLi4uXG4iLCBjcHUpOwogCXNtcF9vcHMtPnNldHVwX2NwdShjcHUpOwotCXByaW50aygiQ1BVICVpIGRvbmUgc2V0dXAuLi5cbiIsIGNwdSk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOworCXByaW50aygiQ1BVICVkIGRvbmUgc2V0dXAuLi5cbiIsIGNwdSk7CiAJc21wX29wcy0+dGFrZV90aW1lYmFzZSgpOwotCXByaW50aygiQ1BVICVpIGRvbmUgdGltZWJhc2UgdGFrZS4uLlxuIiwgY3B1KTsKKwlwcmludGsoIkNQVSAlZCBkb25lIHRpbWViYXNlIHRha2UuLi5cbiIsIGNwdSk7CisKKwlzcGluX2xvY2soJmNhbGxfbG9jayk7CisJY3B1X3NldChjcHUsIGNwdV9vbmxpbmVfbWFwKTsKKwlzcGluX3VubG9jaygmY2FsbF9sb2NrKTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCWNwdV9pZGxlKCk7CiAJcmV0dXJuIDA7CkBAIC0zNDcsMTcgKzM2NSwxMSBAQAogCiBpbnQgX19jcHVfdXAodW5zaWduZWQgaW50IGNwdSkKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAJY2hhciBidWZbMzJdOwogCWludCBjOwogCi0JLyogY3JlYXRlIGEgcHJvY2VzcyBmb3IgdGhlIHByb2Nlc3NvciAqLwotCS8qIG9ubHkgcmVncy5tc3IgaXMgYWN0dWFsbHkgdXNlZCwgYW5kIDAgaXMgT0sgZm9yIGl0ICovCi0JcCA9IGZvcmtfaWRsZShjcHUpOwotCWlmIChJU19FUlIocCkpCi0JCXBhbmljKCJmYWlsZWQgZm9yayBmb3IgQ1BVICV1OiAlbGkiLCBjcHUsIFBUUl9FUlIocCkpOwotCXNlY29uZGFyeV90aSA9IHAtPnRocmVhZF9pbmZvOwotCXAtPnRocmVhZF9pbmZvLT5jcHUgPSBjcHU7CisJc2Vjb25kYXJ5X3RpID0gaWRsZV90YXNrc1tjcHVdLT50aHJlYWRfaW5mbzsKKwltYigpOwogCiAJLyoKIAkgKiBUaGVyZSB3YXMgYSBjYWNoZSBmbHVzaCBsb29wIGhlcmUgdG8gZmx1c2ggdGhlIGNhY2hlCkBAIC0zODksNyArNDAxLDExIEBACiAJcHJpbnRrKCJQcm9jZXNzb3IgJWQgZm91bmQuXG4iLCBjcHUpOwogCiAJc21wX29wcy0+Z2l2ZV90aW1lYmFzZSgpOwotCWNwdV9zZXQoY3B1LCBjcHVfb25saW5lX21hcCk7CisKKwkvKiBXYWl0IHVudGlsIGNwdSBwdXRzIGl0c2VsZiBpbiB0aGUgb25saW5lIG1hcCAqLworCXdoaWxlICghY3B1X29ubGluZShjcHUpKQorCQljcHVfcmVsYXgoKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvc3dzdXNwLlMgYi9hcmNoL3BwYy9rZXJuZWwvc3dzdXNwLlMKaW5kZXggNTUxNDhiYi4uNjk3NzNjYyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3N3c3VzcC5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9zd3N1c3AuUwpAQCAtNSw3ICs1LDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9zeXNjYWxscy5jIGIvYXJjaC9wcGMva2VybmVsL3N5c2NhbGxzLmMKaW5kZXggMTI0MzEzYy4uMTI3ZjA0MCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3N5c2NhbGxzLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3N5c2NhbGxzLmMKQEAgLTQxLDEwICs0MSw2IEBACiAjaW5jbHVkZSA8YXNtL2lwYy5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KIAotdm9pZAotY2hlY2tfYnVncyh2b2lkKQotewotfQogCiAvKgogICogc3lzX2lwYygpIGlzIHRoZSBkZS1tdWx0aXBsZXhlciBmb3IgdGhlIFN5c1YgSVBDIGNhbGxzLi4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3BwYy9rZXJuZWwvdGltZS5jCmluZGV4IGJmNGRkY2EuLmEzYzUyODEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3RpbWUuYwpAQCAtMTY5LDcgKzE2OSw3IEBACiAJCSAqIFdlIHNob3VsZCBoYXZlIGFuIHJ0YyBjYWxsIHRoYXQgb25seSBzZXRzIHRoZSBtaW51dGVzIGFuZAogCQkgKiBzZWNvbmRzIGxpa2Ugb24gSW50ZWwgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBub24gVVRDIGNsb2Nrcy4KIAkJICovCi0JCWlmICggcHBjX21kLnNldF9ydGNfdGltZSAmJiAodGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSA9PSAwICYmCisJCWlmICggcHBjX21kLnNldF9ydGNfdGltZSAmJiBudHBfc3luY2VkKCkgJiYKIAkJICAgICB4dGltZS50dl9zZWMgLSBsYXN0X3J0Y191cGRhdGUgPj0gNjU5ICYmCiAJCSAgICAgYWJzKCh4dGltZS50dl9uc2VjIC8gMTAwMCkgLSAoMTAwMDAwMC0xMDAwMDAwL0haKSkgPCA1MDAwMDAvSFogJiYKIAkJICAgICBqaWZmaWVzIC0gd2FsbF9qaWZmaWVzID09IDEpIHsKQEAgLTI3MSwxMCArMjcxLDcgQEAKIAkgKi8KIAlsYXN0X3J0Y191cGRhdGUgPSBuZXdfc2VjIC0gNjU4OwogCi0JdGltZV9hZGp1c3QgPSAwOyAgICAgICAgICAgICAgICAvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwogCWNsb2NrX3dhc19zZXQoKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMKaW5kZXggOWU2YWU1Ni4uOTYxZWRlOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMKQEAgLTExOCw2ICsxMTgsMjggQEAKIAlpbmZvLnNpX2NvZGUgPSBjb2RlOwogCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKSBhZGRyOwogCWZvcmNlX3NpZ19pbmZvKHNpZ25yLCAmaW5mbywgY3VycmVudCk7CisKKwkvKgorCSAqIEluaXQgZ2V0cyBubyBzaWduYWxzIHRoYXQgaXQgZG9lc24ndCBoYXZlIGEgaGFuZGxlciBmb3IuCisJICogVGhhdCdzIGFsbCB2ZXJ5IHdlbGwsIGJ1dCBpZiBpdCBoYXMgY2F1c2VkIGEgc3luY2hyb25vdXMKKwkgKiBleGNlcHRpb24gYW5kIHdlIGlnbm9yZSB0aGUgcmVzdWx0aW5nIHNpZ25hbCwgaXQgd2lsbCBqdXN0CisJICogZ2VuZXJhdGUgdGhlIHNhbWUgZXhjZXB0aW9uIG92ZXIgYW5kIG92ZXIgYWdhaW4gYW5kIHdlIGdldAorCSAqIG5vd2hlcmUuICBCZXR0ZXIgdG8ga2lsbCBpdCBhbmQgbGV0IHRoZSBrZXJuZWwgcGFuaWMuCisJICovCisJaWYgKGN1cnJlbnQtPnBpZCA9PSAxKSB7CisJCV9fc2lnaGFuZGxlcl90IGhhbmRsZXI7CisKKwkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJCWhhbmRsZXIgPSBjdXJyZW50LT5zaWdoYW5kLT5hY3Rpb25bc2lnbnItMV0uc2Euc2FfaGFuZGxlcjsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJaWYgKGhhbmRsZXIgPT0gU0lHX0RGTCkgeworCQkJLyogaW5pdCBoYXMgZ2VuZXJhdGVkIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uCisJCQkgICBhbmQgaXQgZG9lc24ndCBoYXZlIGEgaGFuZGxlciBmb3IgdGhlIHNpZ25hbCAqLworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiaW5pdCBoYXMgZ2VuZXJhdGVkIHNpZ25hbCAlZCAiCisJCQkgICAgICAgImJ1dCBoYXMgbm8gaGFuZGxlciBmb3IgaXRcbiIsIHNpZ25yKTsKKwkJCWRvX2V4aXQoc2lnbnIpOworCQl9CisJfQogfQogCiAvKgpAQCAtODQ5LDEwICs4NzEsMTIgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLwogCisjaWZkZWYgQ09ORklHX0U1MDAKIHZvaWQgUGVyZm9ybWFuY2VNb25pdG9yRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXBlcmZfaXJxKHJlZ3MpOwogfQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCiB2b2lkIENhY2hlTG9ja2luZ0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyZXNzLApAQCAtOTA0LDYgKzkyOCwyNSBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfQk9PS0VfV0RUCisvKgorICogRGVmYXVsdCBoYW5kbGVyIGZvciBhIFdhdGNoZG9nIGV4Y2VwdGlvbiwKKyAqIHNwaW5zIHVudGlsIGEgcmVib290IG9jY3VycworICovCit2b2lkIF9fYXR0cmlidXRlX18gKCh3ZWFrKSkgV2F0Y2hkb2dIYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIEdlbmVyaWMgV2F0Y2hkb2dIYW5kbGVyLCBpbXBsZW1lbnQgeW91ciBvd24gKi8KKwltdHNwcihTUFJOX1RDUiwgbWZzcHIoU1BSTl9UQ1IpJih+VENSX1dJRSkpOworCXJldHVybjsKK30KKwordm9pZCBXYXRjaGRvZ0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmludGsgKEtFUk5fRU1FUkcgIlBvd2VyUEMgQm9vay1FIFdhdGNoZG9nIEV4Y2VwdGlvblxuIik7CisJV2F0Y2hkb2dIYW5kbGVyKHJlZ3MpOworfQorI2VuZGlmCisKIHZvaWQgX19pbml0IHRyYXBfaW5pdCh2b2lkKQogewogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvbGliL01ha2VmaWxlIGIvYXJjaC9wcGMvbGliL01ha2VmaWxlCmluZGV4IDFjMzgwZTYuLmYxZTFmYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3BwYy9saWIvTWFrZWZpbGUKQEAgLTQsNiArNCw1IEBACiAKIG9iai15CQkJOj0gY2hlY2tzdW0ubyBzdHJpbmcubyBzdHJjYXNlLm8gZGVjX2FuZF9sb2NrLm8gZGl2NjQubwogCi1vYmotJChDT05GSUdfU01QKQkrPSBsb2Nrcy5vCiBvYmotJChDT05GSUdfOHh4KQkrPSByaGVhcC5vCiBvYmotJChDT05GSUdfQ1BNMikJKz0gcmhlYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvbGliL2RlY19hbmRfbG9jay5jIGIvYXJjaC9wcGMvbGliL2RlY19hbmRfbG9jay5jCmluZGV4IDRlZTg4ODAuLmIxOGYwZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2xpYi9kZWNfYW5kX2xvY2suYworKysgYi9hcmNoL3BwYy9saWIvZGVjX2FuZF9sb2NrLmMKQEAgLTExLDE0ICsxMSw3IEBACiAgKiBoYXMgYSBjbXB4Y2hnLCBhbmQgd2hlcmUgYXRvbWljLT52YWx1ZSBpcyBhbiBpbnQgaG9sZGluZwogICogdGhlIHZhbHVlIG9mIHRoZSBhdG9taWMgKGkuZS4gdGhlIGhpZ2ggYml0cyBhcmVuJ3QgdXNlZAogICogZm9yIGEgbG9jayBvciBhbnl0aGluZyBsaWtlIHRoYXQpLgotICoKLSAqIE4uQi4gQVRPTUlDX0RFQ19BTkRfTE9DSyBnZXRzIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9zcGlubG9jay5oCi0gKiBpZiBzcGlubG9ja3MgYXJlIGVtcHR5IGFuZCB0aHVzIGF0b21pY19kZWNfYW5kX2xvY2sgaXMgZGVmaW5lZAotICogdG8gYmUgYXRvbWljX2RlY19hbmRfdGVzdCAtIGluIHRoYXQgY2FzZSB3ZSBkb24ndCBuZWVkIGl0Ci0gKiBkZWZpbmVkIGhlcmUgYXMgd2VsbC4KICAqLwotCi0jaWZuZGVmIEFUT01JQ19ERUNfQU5EX0xPQ0sKIGludCBfYXRvbWljX2RlY19hbmRfbG9jayhhdG9taWNfdCAqYXRvbWljLCBzcGlubG9ja190ICpsb2NrKQogewogCWludCBjb3VudGVyOwpAQCAtNDMsNCArMzYsMyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKF9hdG9taWNfZGVjX2FuZF9sb2NrKTsKLSNlbmRpZiAvKiBBVE9NSUNfREVDX0FORF9MT0NLICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9tbS9mYXVsdC5jIGIvYXJjaC9wcGMvbW0vZmF1bHQuYwppbmRleCA1N2Q5OTMwLi5lZTVlOWYyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvcHBjL21tL2ZhdWx0LmMKQEAgLTI3OCwxMSArMjc4LDcgQEAKIAogCS8qIFVzZXIgbW9kZSBhY2Nlc3NlcyBjYXVzZSBhIFNJR1NFR1YgKi8KIAlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7Ci0JCWluZm8uc2lfc2lnbm8gPSBTSUdTRUdWOwotCQlpbmZvLnNpX2Vycm5vID0gMDsKLQkJaW5mby5zaV9jb2RlID0gY29kZTsKLQkJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopIGFkZHJlc3M7Ci0JCWZvcmNlX3NpZ19pbmZvKFNJR1NFR1YsICZpbmZvLCBjdXJyZW50KTsKKwkJX2V4Y2VwdGlvbihTSUdTRUdWLCByZWdzLCBjb2RlLCBhZGRyZXNzKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9tbS9oYXNodGFibGUuUyBiL2FyY2gvcHBjL21tL2hhc2h0YWJsZS5TCmluZGV4IGFiODMxMzIuLjNlYzg3YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL21tL2hhc2h0YWJsZS5TCisrKyBiL2FyY2gvcHBjL21tL2hhc2h0YWJsZS5TCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjaWZkZWYgQ09ORklHX1NNUAogCS5jb21tCW1tdV9oYXNoX2xvY2ssNApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvbW0vaW5pdC5jIGIvYXJjaC9wcGMvbW0vaW5pdC5jCmluZGV4IDMzYWRhNzIuLmY0MjFhNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL21tL2luaXQuYworKysgYi9hcmNoL3BwYy9tbS9pbml0LmMKQEAgLTU2MCw5ICs1NjAsMTAgQEAKIHZvaWQgZmx1c2hfZGNhY2hlX2ljYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewogI2lmZGVmIENPTkZJR19CT09LRQotCV9fZmx1c2hfZGNhY2hlX2ljYWNoZShrbWFwKHBhZ2UpKTsKLQlrdW5tYXAocGFnZSk7Ci0jZWxpZiBDT05GSUdfOHh4CisJdm9pZCAqc3RhcnQgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9QUENfU1lOQ19JQ0FDSEUpOworCV9fZmx1c2hfZGNhY2hlX2ljYWNoZShzdGFydCk7CisJa3VubWFwX2F0b21pYyhzdGFydCwgS01fUFBDX1NZTkNfSUNBQ0hFKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHXzh4eCkKIAkvKiBPbiA4eHggdGhlcmUgaXMgbm8gbmVlZCB0byBrbWFwIHNpbmNlIGhpZ2htZW0gaXMgbm90IHN1cHBvcnRlZCAqLwogCV9fZmx1c2hfZGNhY2hlX2ljYWNoZShwYWdlX2FkZHJlc3MocGFnZSkpOyAKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcKaW5kZXggODA1ZGQ5OC4uNzZmNDQ3NiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9LY29uZmlnCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvS2NvbmZpZwpAQCAtMTYsMTEgKzE2LDYgQEAKIAlkZXBlbmRzIG9uIDQweAogCWRlZmF1bHQgV0FMTlVUCiAKLWNvbmZpZyBBU0gKLQlib29sICJBc2giCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSUJNIE5QNDA1SCBldmFsdWF0aW9uIGJvYXJkLgotCiBjb25maWcgQlVCSU5HQQogCWJvb2wgIkJ1YmluZ2EiCiAJc2VsZWN0IFdBTlRfRUFSTFlfU0VSSUFMCkBAIC0zNywxMSArMzIsNiBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEVQNDA1L0VQNDA1UEMgYm9hcmRzLgogCi1jb25maWcgT0FLCi0JYm9vbCAiT2FrIgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIElCTSA0MDNHQ1ggZXZhbHVhdGlvbiBib2FyZC4KLQogY29uZmlnIFJFRFdPT0RfNQogCWJvb2wgIlJlZHdvb2QtNSIKIAloZWxwCkBAIC0xNTIsMTMgKzE0MiwxMyBAQAogIyBBbGwgNDA1LWJhc2VkIGNvcmVzIHVwIHVudGlsIHRoZSA0MDVHUFIgYW5kIDQwNUVQIGhhdmUgdGhpcyBlcnJhdGEuCiBjb25maWcgSUJNNDA1X0VSUjc3CiAJYm9vbAotCWRlcGVuZHMgb24gNDB4ICYmICE0MDNHQ1ggJiYgITQwNUdQUgorCWRlcGVuZHMgb24gNDB4ICYmICE0MDNHQ1ggJiYgITQwNUdQUiAmJiAhNDA1RVAKIAlkZWZhdWx0IHkKIAogIyBBbGwgNDB4LWJhc2VkIGNvcmVzLCB1cCB1bnRpbCB0aGUgNDA1R1BSIGFuZCA0MDVFUCBoYXZlIHRoaXMgZXJyYXRhLgogY29uZmlnIElCTTQwNV9FUlI1MQogCWJvb2wKLQlkZXBlbmRzIG9uIDQweCAmJiAhNDA1R1BSCisJZGVwZW5kcyBvbiA0MHggJiYgITQwNUdQUiAmJiAhNDA1RVAKIAlkZWZhdWx0IHkKIAogY29uZmlnIEJPT0tFCkBAIC0xODYsNiArMTc2LDcgQEAKIAlkZXBlbmRzIG9uIEJVQklOR0EgfHwgRVA0MDUgfHwgU1lDQU1PUkUgfHwgV0FMTlVUCiAJZGVmYXVsdCB5CiAKKyMgT0FLIGRvZXNuJ3QgZXhpc3QgYnV0IHdhbnRlZCB0byBrZWVwIHRoaXMgYXJvdW5kIGZvciBhbnkgZnV0dXJlIDQwM0dDWCBib2FyZHMKIGNvbmZpZyA0MDNHQ1gKIAlib29sCiAJZGVwZW5kcyBPQUsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvTWFrZWZpbGUgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L01ha2VmaWxlCmluZGV4IDg0NGMzYjUuLjFkZDZkN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9NYWtlZmlsZQpAQCAtMSwxNCArMSwxMiBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIFBvd2VyUEMgNHh4IGxpbnV4IGtlcm5lbC4KIAotb2JqLSQoQ09ORklHX0FTSCkJCSs9IGFzaC5vCiBvYmotJChDT05GSUdfQkFNQk9PKQkJKz0gYmFtYm9vLm8KIG9iai0kKENPTkZJR19DUENJNDA1KQkJKz0gY3BjaTQwNS5vCiBvYmotJChDT05GSUdfRUJPTlkpCQkrPSBlYm9ueS5vCiBvYmotJChDT05GSUdfRVA0MDUpCQkrPSBlcDQwNS5vCiBvYmotJChDT05GSUdfQlVCSU5HQSkJCSs9IGJ1YmluZ2Eubwogb2JqLSQoQ09ORklHX0xVQU4pCQkrPSBsdWFuLm8KLW9iai0kKENPTkZJR19PQUspCQkrPSBvYWsubwogb2JqLSQoQ09ORklHX09DT1RFQSkJCSs9IG9jb3RlYS5vCiBvYmotJChDT05GSUdfUkVEV09PRF81KQkJKz0gcmVkd29vZDUubwogb2JqLSQoQ09ORklHX1JFRFdPT0RfNikJCSs9IHJlZHdvb2Q2Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvYXNoLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2FzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTI5MTE3Li4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSAqIGFyY2gvcHBjL3BsYXRmb3Jtcy80eHgvYXNoLmMKLSAqCi0gKiBTdXBwb3J0IGZvciB0aGUgSUJNIE5QNDA1SCBhc2ggZXZhbCBib2FyZAotICoKLSAqIEF1dGhvcjogQXJtaW4gS3VzdGVyIDxha3VzdGVyQG12aXN0YS5jb20+Ci0gKgotICogMjAwMS0yMDAyIChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQotICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCi0gKiBvciBpbXBsaWVkLgotICovCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vb2NwLmg+Ci0jaW5jbHVkZSA8YXNtL2libV9vY3BfcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL3RvZGMuaD4KLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCRyh4Li4uKSBwcmludGsoeCkKLSNlbHNlCi0jZGVmaW5lIERCRyh4Li4uKQotI2VuZGlmCi0KLXZvaWQgKmFzaF9ydGNfYmFzZTsKLQotLyogU29tZSBJUlFzIHVuaXF1ZSB0byBXYWxudXQuCi0gKiBVc2VkIGJ5IHRoZSBnZW5lcmljIDQwNSBQQ0kgc2V0dXAgZnVuY3Rpb25zIGluIHBwYzR4eF9wY2kuYwotICovCi1pbnQgX19pbml0Ci1wcGM0MDVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyIGlkc2VsLCB1bnNpZ25lZCBjaGFyIHBpbikKLXsKLQlzdGF0aWMgY2hhciBwY2lfaXJxX3RhYmxlW11bNF0gPQotCSAgICAvKgotCSAgICAgKiAgICAgIFBDSSBJRFNFTC9JTlRQSU4tPklOVExJTkUKLQkgICAgICogICAgICBBICAgICAgIEIgICAgICAgQyAgICAgICBECi0JICAgICAqLwotCXsKLQkJezI0LCAyNCwgMjQsIDI0fSwJLyogSURTRUwgMSAtIFBDSSBzbG90IDEgKi8KLQkJezI1LCAyNSwgMjUsIDI1fSwJLyogSURTRUwgMiAtIFBDSSBzbG90IDIgKi8KLQkJezI2LCAyNiwgMjYsIDI2fSwJLyogSURTRUwgMyAtIFBDSSBzbG90IDMgKi8KLQkJezI3LCAyNywgMjcsIDI3fSwJLyogSURTRUwgNCAtIFBDSSBzbG90IDQgKi8KLQl9OwotCi0JY29uc3QgbG9uZyBtaW5faWRzZWwgPSAxLCBtYXhfaWRzZWwgPSA0LCBpcnFzX3Blcl9zbG90ID0gNDsKLQlyZXR1cm4gUENJX0lSUV9UQUJMRV9MT09LVVA7Ci19Ci0KLXZvaWQgX19pbml0Ci1hc2hfc2V0dXBfYXJjaCh2b2lkKQotewotCXBwYzR4eF9zZXR1cF9hcmNoKCk7Ci0KLQlpYm1fb2NwX3NldF9lbWFjKDAsIDMpOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0JSSU5HVVAKLQlpbnQgaTsKLQlwcmludGsoIlxuIik7Ci0JcHJpbnRrKCJtYWNoaW5lXHQ6ICVzXG4iLCBQUEM0eHhfTUFDSElORV9OQU1FKTsKLQlwcmludGsoIlxuIik7Ci0JcHJpbnRrKCJiaV9zX3ZlcnNpb25cdCAlc1xuIiwgYmlwLT5iaV9zX3ZlcnNpb24pOwotCXByaW50aygiYmlfcl92ZXJzaW9uXHQgJXNcbiIsIGJpcC0+Ymlfcl92ZXJzaW9uKTsKLQlwcmludGsoImJpX21lbXNpemVcdCAweCU4Ljh4XHQgJWRNQnl0ZXNcbiIsIGJpcC0+YmlfbWVtc2l6ZSwKLQkgICAgICAgYmlwLT5iaV9tZW1zaXplIC8gKDEwMjQgKiAxMDAwKSk7Ci0JZm9yIChpID0gMDsgaSA8IEVNQUNfTlVNUzsgaSsrKSB7Ci0JCXByaW50aygiYmlfZW5ldGFkZHIgJWRcdCAlMi4yeCUyLjJ4JTIuMngtJTIuMnglMi4yeCUyLjJ4XG4iLCBpLAotCQkgICAgICAgYmlwLT5iaV9lbmV0YWRkcltpXVswXSwgYmlwLT5iaV9lbmV0YWRkcltpXVsxXSwKLQkJICAgICAgIGJpcC0+YmlfZW5ldGFkZHJbaV1bMl0sIGJpcC0+YmlfZW5ldGFkZHJbaV1bM10sCi0JCSAgICAgICBiaXAtPmJpX2VuZXRhZGRyW2ldWzRdLCBiaXAtPmJpX2VuZXRhZGRyW2ldWzVdKTsKLQl9Ci0JcHJpbnRrKCJiaV9wY2lfZW5ldGFkZHIgJWRcdCAlMi4yeCUyLjJ4JTIuMngtJTIuMnglMi4yeCUyLjJ4XG4iLCAwLAotCSAgICAgICBiaXAtPmJpX3BjaV9lbmV0YWRkclswXSwgYmlwLT5iaV9wY2lfZW5ldGFkZHJbMV0sCi0JICAgICAgIGJpcC0+YmlfcGNpX2VuZXRhZGRyWzJdLCBiaXAtPmJpX3BjaV9lbmV0YWRkclszXSwKLQkgICAgICAgYmlwLT5iaV9wY2lfZW5ldGFkZHJbNF0sIGJpcC0+YmlfcGNpX2VuZXRhZGRyWzVdKTsKLQotCXByaW50aygiYmlfaW50ZnJlcVx0IDB4JTguOHhcdCBjbG9jazpcdCAlZE1oelxuIiwKLQkgICAgICAgYmlwLT5iaV9pbnRmcmVxLCBiaXAtPmJpX2ludGZyZXEgLyAxMDAwMDAwKTsKLQotCXByaW50aygiYmlfYnVzZnJlcVx0IDB4JTguOHhcdCBwbGIgYnVzIGNsb2NrOlx0ICVkTUh6XG4iLAotCSAgICAgICBiaXAtPmJpX2J1c2ZyZXEsIGJpcC0+YmlfYnVzZnJlcSAvIDEwMDAwMDApOwotCXByaW50aygiYmlfcGNpX2J1c2ZyZXFcdCAweCU4Ljh4XHQgcGNpIGJ1cyBjbG9jazpcdCAlZE1IelxuIiwKLQkgICAgICAgYmlwLT5iaV9wY2lfYnVzZnJlcSwgYmlwLT5iaV9wY2lfYnVzZnJlcSAvIDEwMDAwMDApOwotCi0JcHJpbnRrKCJcbiIpOwotI2VuZGlmCi0JLyogUlRDIHN0ZXAgZm9yIGFzaCAqLwotCWFzaF9ydGNfYmFzZSA9ICh2b2lkICopIEFTSF9SVENfVkFERFI7Ci0JVE9EQ19JTklUKFRPRENfVFlQRV9EUzE3NDMsIGFzaF9ydGNfYmFzZSwgYXNoX3J0Y19iYXNlLCBhc2hfcnRjX2Jhc2UsCi0JCSAgOCk7Ci19Ci0KLXZvaWQgX19pbml0Ci1iaW9zX2ZpeHVwKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgc3RydWN0IHBjaWwwX3JlZ3MgKnBjaXApCi17Ci0JLyoKLQkgKiBFeHBlY3RlZCBQQ0kgbWFwcGluZzoKLQkgKgotCSAqICBQTEIgYWRkciAgICAgICAgICAgICBQQ0kgbWVtb3J5IGFkZHIKLQkgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqICAwMDAwJzAwMDAgLSA3ZmZmJ2ZmZmYgPC0tLSAgMDAwMCcwMDAwIC0gN2ZmZidmZmZmCi0JICogIDgwMDAnMDAwMCAtIEJmZmYnZmZmZiAtLS0+ICA4MDAwJzAwMDAgLSBCZmZmJ2ZmZmYKLQkgKgotCSAqICBQTEIgYWRkciAgICAgICAgICAgICBQQ0kgaW8gYWRkcgotCSAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICogIGU4MDAnMDAwMCAtIGU4MDAnZmZmZiAtLS0+ICAwMDAwJzAwMDAgLSAwMDAxJzAwMDAKLQkgKgotCSAqIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBzaW1wbGlmaWVkIGJ5IGFzc3VtaW5nIHRoYXQgdGhlIGJvb3Ryb20KLQkgKiBoYXMgYmVlbiB3ZWxsIGJlaGF2ZWQgaW4gZm9sbG93aW5nIHRoaXMgbWFwcGluZy4KLQkgKi8KLQotI2lmZGVmIERFQlVHCi0JaW50IGk7Ci0KLQlwcmludGsoImlvcmVtYXAgUENMSU9fQkFTRSA9IDB4JXhcbiIsIHBjaXApOwotCXByaW50aygiUENJIGJyaWRnZSByZWdzIGJlZm9yZSBmaXh1cCBcbiIpOwotCWZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKSB7Ci0JCXByaW50aygiIHBtbSVkbWFcdDB4JXhcbiIsIGksIGluX2xlMzIoJihwY2lwLT5wbW1baV0ubWEpKSk7Ci0JCXByaW50aygiIHBtbSVkbGFcdDB4JXhcbiIsIGksIGluX2xlMzIoJihwY2lwLT5wbW1baV0ubGEpKSk7Ci0JCXByaW50aygiIHBtbSVkcGNpbGFcdDB4JXhcbiIsIGksCi0JCSAgICAgICBpbl9sZTMyKCYocGNpcC0+cG1tW2ldLnBjaWxhKSkpOwotCQlwcmludGsoIiBwbW0lZHBjaWhhXHQweCV4XG4iLCBpLAotCQkgICAgICAgaW5fbGUzMigmKHBjaXAtPnBtbVtpXS5wY2loYSkpKTsKLQl9Ci0JcHJpbnRrKCIgcHRtMW1zXHQweCV4XG4iLCBpbl9sZTMyKCYocGNpcC0+cHRtMW1zKSkpOwotCXByaW50aygiIHB0bTFsYVx0MHgleFxuIiwgaW5fbGUzMigmKHBjaXAtPnB0bTFsYSkpKTsKLQlwcmludGsoIiBwdG0ybXNcdDB4JXhcbiIsIGluX2xlMzIoJihwY2lwLT5wdG0ybXMpKSk7Ci0JcHJpbnRrKCIgcHRtMmxhXHQweCV4XG4iLCBpbl9sZTMyKCYocGNpcC0+cHRtMmxhKSkpOwotCWZvciAoYmFyID0gUENJX0JBU0VfQUREUkVTU18xOyBiYXIgPD0gUENJX0JBU0VfQUREUkVTU18yOyBiYXIgKz0gNCkgewotCQllYXJseV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBob3NlLT5maXJzdF9idXNubywKLQkJCQkJUENJX0ZVTkMoaG9zZS0+Zmlyc3RfYnVzbm8pLCBiYXIsCi0JCQkJCSZiYXJfcmVzcG9uc2UpOwotCQlEQkcoIkJVUyAlZCwgZGV2aWNlICVkLCBGdW5jdGlvbiAlZCBiYXIgMHglOC44eCBpcyAweCU4Ljh4XG4iLAotCQkgICAgaG9zZS0+Zmlyc3RfYnVzbm8sIFBDSV9TTE9UKGhvc2UtPmZpcnN0X2J1c25vKSwKLQkJICAgIFBDSV9GVU5DKGhvc2UtPmZpcnN0X2J1c25vKSwgYmFyLCBiYXJfcmVzcG9uc2UpOwotCX0KLQotI2VuZGlmCi0JaWYgKHBwY19tZC5wcm9ncmVzcykKLQkJcHBjX21kLnByb2dyZXNzKCJiaW9zX2ZpeHVwKCk6IGVudGVyIiwgMHg4MDApOwotCi0JLyogYWRkZWQgZm9yIElCTSBib290IHJvbSB2ZXJzaW9uIDEuMTUgYmlvcyBiYXIgY2hhbmdlcyAgLUFLICovCi0KLQkvKiBEaXNhYmxlIHJlZ2lvbiBmaXJzdCAqLwotCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cG1tWzBdLm1hKSwgMHgwMDAwMDAwMCk7Ci0JLyogUExCIHN0YXJ0aW5nIGFkZHIsIFBDSTogMHg4MDAwMDAwMCAqLwotCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cG1tWzBdLmxhKSwgMHg4MDAwMDAwMCk7Ci0JLyogUENJIHN0YXJ0IGFkZHIsIDB4ODAwMDAwMDAgKi8KLQlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnBtbVswXS5wY2lsYSksIFBQQzQwNV9QQ0lfTUVNX0JBU0UpOwotCS8qIDUxMk1CIHJhbmdlIG9mIFBMQiB0byBQQ0kgKi8KLQlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnBtbVswXS5wY2loYSksIDB4MDAwMDAwMDApOwotCS8qIEVuYWJsZSBubyBwcmUtZmV0Y2gsIGVuYWJsZSByZWdpb24gKi8KLQlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnBtbVswXS5tYSksICgoMHhmZmZmZmZmZiAtCi0JCQkJCQkoUFBDNDA1X1BDSV9VUFBFUl9NRU0gLQotCQkJCQkJIFBQQzQwNV9QQ0lfTUVNX0JBU0UpKSB8IDB4MDEpKTsKLQotCS8qIERpc2FibGUgcmVnaW9uIG9uZSAqLwotCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cG1tWzFdLm1hKSwgMHgwMDAwMDAwMCk7Ci0Jb3V0X2xlMzIoKHZvaWQgKikgJihwY2lwLT5wbW1bMV0ubGEpLCAweDAwMDAwMDAwKTsKLQlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnBtbVsxXS5wY2lsYSksIDB4MDAwMDAwMDApOwotCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cG1tWzFdLnBjaWhhKSwgMHgwMDAwMDAwMCk7Ci0Jb3V0X2xlMzIoKHZvaWQgKikgJihwY2lwLT5wbW1bMV0ubWEpLCAweDAwMDAwMDAwKTsKLQotCS8qIERpc2FibGUgcmVnaW9uIHR3byAqLwotCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cG1tWzJdLm1hKSwgMHgwMDAwMDAwMCk7Ci0Jb3V0X2xlMzIoKHZvaWQgKikgJihwY2lwLT5wbW1bMl0ubGEpLCAweDAwMDAwMDAwKTsKLQlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnBtbVsyXS5wY2lsYSksIDB4MDAwMDAwMDApOwotCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cG1tWzJdLnBjaWhhKSwgMHgwMDAwMDAwMCk7Ci0Jb3V0X2xlMzIoKHZvaWQgKikgJihwY2lwLT5wbW1bMl0ubWEpLCAweDAwMDAwMDAwKTsKLQotCS8qIEVuYWJsZSBQVE0xIGFuZCBQVE0yLCBtYXBwZWQgdG8gUExCIGFkZHJlc3MgMC4gKi8KLQotCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cHRtMWxhKSwgMHgwMDAwMDAwMCk7Ci0Jb3V0X2xlMzIoKHZvaWQgKikgJihwY2lwLT5wdG0xbXMpLCAweDAwMDAwMDAxKTsKLQlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnB0bTJsYSksIDB4MDAwMDAwMDApOwotCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cHRtMm1zKSwgMHgwMDAwMDAwMSk7Ci0KLQkvKiBXcml0ZSB6ZXJvIHRvIFBUTTEgQkFSLiAqLwotCi0JZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGhvc2UtPmZpcnN0X2J1c25vLAotCQkJCSBQQ0lfRlVOQyhob3NlLT5maXJzdF9idXNubyksCi0JCQkJIFBDSV9CQVNFX0FERFJFU1NfMSwKLQkJCQkgMHgwMDAwMDAwMCk7Ci0KLQkvKiBEaXNhYmxlIFBUTTIgKHVudXNlZCkgKi8KLQotCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cHRtMmxhKSwgMHgwMDAwMDAwMCk7Ci0Jb3V0X2xlMzIoKHZvaWQgKikgJihwY2lwLT5wdG0ybXMpLCAweDAwMDAwMDAwKTsKLQotCS8qIGVuZCB3b3JrIGFycm91bmQgKi8KLQlpZiAocHBjX21kLnByb2dyZXNzKQotCQlwcGNfbWQucHJvZ3Jlc3MoImJpb3NfZml4dXAoKTogZG9uZSIsIDB4ODAwKTsKLQotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJQQ0kgYnJpZGdlIHJlZ3MgYWZ0ZXIgZml4dXAgXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDw9IDI7IGkrKykgewotCQlwcmludGsoIiBwbW0lZG1hXHQweCV4XG4iLCBpLCBpbl9sZTMyKCYocGNpcC0+cG1tW2ldLm1hKSkpOwotCQlwcmludGsoIiBwbW0lZGxhXHQweCV4XG4iLCBpLCBpbl9sZTMyKCYocGNpcC0+cG1tW2ldLmxhKSkpOwotCQlwcmludGsoIiBwbW0lZHBjaWxhXHQweCV4XG4iLCBpLAotCQkgICAgICAgaW5fbGUzMigmKHBjaXAtPnBtbVtpXS5wY2lsYSkpKTsKLQkJcHJpbnRrKCIgcG1tJWRwY2loYVx0MHgleFxuIiwgaSwKLQkJICAgICAgIGluX2xlMzIoJihwY2lwLT5wbW1baV0ucGNpaGEpKSk7Ci0JfQotCXByaW50aygiIHB0bTFtc1x0MHgleFxuIiwgaW5fbGUzMigmKHBjaXAtPnB0bTFtcykpKTsKLQlwcmludGsoIiBwdG0xbGFcdDB4JXhcbiIsIGluX2xlMzIoJihwY2lwLT5wdG0xbGEpKSk7Ci0JcHJpbnRrKCIgcHRtMm1zXHQweCV4XG4iLCBpbl9sZTMyKCYocGNpcC0+cHRtMm1zKSkpOwotCXByaW50aygiIHB0bTJsYVx0MHgleFxuIiwgaW5fbGUzMigmKHBjaXAtPnB0bTJsYSkpKTsKLQotCWZvciAoYmFyID0gUENJX0JBU0VfQUREUkVTU18xOyBiYXIgPD0gUENJX0JBU0VfQUREUkVTU18yOyBiYXIgKz0gNCkgewotCQllYXJseV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBob3NlLT5maXJzdF9idXNubywKLQkJCQkJUENJX0ZVTkMoaG9zZS0+Zmlyc3RfYnVzbm8pLCBiYXIsCi0JCQkJCSZiYXJfcmVzcG9uc2UpOwotCQlEQkcoIkJVUyAlZCwgZGV2aWNlICVkLCBGdW5jdGlvbiAlZCBiYXIgMHglOC44eCBpcyAweCU4Ljh4XG4iLAotCQkgICAgaG9zZS0+Zmlyc3RfYnVzbm8sIFBDSV9TTE9UKGhvc2UtPmZpcnN0X2J1c25vKSwKLQkJICAgIFBDSV9GVU5DKGhvc2UtPmZpcnN0X2J1c25vKSwgYmFyLCBiYXJfcmVzcG9uc2UpOwotCX0KLQotCi0jZW5kaWYKLX0KLQotdm9pZCBfX2luaXQKLWFzaF9tYXBfaW8odm9pZCkKLXsKLQlwcGM0eHhfbWFwX2lvKCk7Ci0JaW9fYmxvY2tfbWFwcGluZyhBU0hfUlRDX1ZBRERSLCBBU0hfUlRDX1BBRERSLCBBU0hfUlRDX1NJWkUsIF9QQUdFX0lPKTsKLX0KLQotdm9pZCBfX2luaXQKLXBsYXRmb3JtX2luaXQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKLQkgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3KQotewotCXBwYzR4eF9pbml0KHIzLCByNCwgcjUsIHI2LCByNyk7Ci0KLQlwcGNfbWQuc2V0dXBfYXJjaCA9IGFzaF9zZXR1cF9hcmNoOwotCXBwY19tZC5zZXR1cF9pb19tYXBwaW5ncyA9IGFzaF9tYXBfaW87Ci0KLSNpZmRlZiBDT05GSUdfUFBDX1JUQwotCXBwY19tZC50aW1lX2luaXQgPSB0b2RjX3RpbWVfaW5pdDsKLQlwcGNfbWQuc2V0X3J0Y190aW1lID0gdG9kY19zZXRfcnRjX3RpbWU7Ci0JcHBjX21kLmdldF9ydGNfdGltZSA9IHRvZGNfZ2V0X3J0Y190aW1lOwotCXBwY19tZC5udnJhbV9yZWFkX3ZhbCA9IHRvZGNfZGlyZWN0X3JlYWRfdmFsOwotCXBwY19tZC5udnJhbV93cml0ZV92YWwgPSB0b2RjX2RpcmVjdF93cml0ZV92YWw7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvYXNoLmggYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2FzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc0NDhlLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvYXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9hc2guaAotICoKLSAqIE1hY3JvcywgZGVmaW5pdGlvbnMsIGFuZCBkYXRhIHN0cnVjdHVyZXMgc3BlY2lmaWMgdG8gdGhlIElCTSBQb3dlclBDCi0gKiBBc2ggZXZhbCBib2FyZC4KLSAqCi0gKiBBdXRob3I6IEFybWluIEt1c3RlciA8YWt1c3RlckBtdmlzdGEuY29tPgotICoKLSAqIDIwMDAtMjAwMiAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgotICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0KLSAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwotICogb3IgaW1wbGllZC4KLSAqLwotCi0jaWZkZWYgX19LRVJORUxfXwotI2lmbmRlZiBfX0FTTV9BU0hfSF9fCi0jZGVmaW5lIF9fQVNNX0FTSF9IX18KLSNpbmNsdWRlIDxwbGF0Zm9ybXMvNHh4L2libW5wNDA1aC5oPgotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotLyoKLSAqIERhdGEgc3RydWN0dXJlIGRlZmluaW5nIGJvYXJkIGluZm9ybWF0aW9uIG1haW50YWluZWQgYnkgdGhlIGJvb3QKLSAqIFJPTSBvbiBJQk0ncyAiQXNoIiBldmFsdWF0aW9uIGJvYXJkLiBBbiBlZmZvcnQgaGFzIGJlZW4gbWFkZSB0bwotICoga2VlcCB0aGUgZmllbGQgbmFtZXMgY29uc2lzdGVudCB3aXRoIHRoZSA4eHggJ2JkX3QnIGJvYXJkIGluZm8KLSAqIHN0cnVjdHVyZXMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgYm9hcmRfaW5mbyB7Ci0JdW5zaWduZWQgY2hhcgkgYmlfc192ZXJzaW9uWzRdOwkvKiBWZXJzaW9uIG9mIHRoaXMgc3RydWN0dXJlICovCi0JdW5zaWduZWQgY2hhcgkgYmlfcl92ZXJzaW9uWzMwXTsJLyogVmVyc2lvbiBvZiB0aGUgSUJNIFJPTSAqLwotCXVuc2lnbmVkIGludAkgYmlfbWVtc2l6ZTsJCS8qIERSQU0gaW5zdGFsbGVkLCBpbiBieXRlcyAqLwotCXVuc2lnbmVkIGNoYXIJIGJpX2VuZXRhZGRyWzRdWzZdOwkvKiBMb2NhbCBFdGhlcm5ldCBNQUMgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGNoYXIJIGJpX3BjaV9lbmV0YWRkcls2XTsKLQl1bnNpZ25lZCBpbnQJIGJpX2ludGZyZXE7CQkvKiBQcm9jZXNzb3Igc3BlZWQsIGluIEh6ICovCi0JdW5zaWduZWQgaW50CSBiaV9idXNmcmVxOwkJLyogUExCIEJ1cyBzcGVlZCwgaW4gSHogKi8KLQl1bnNpZ25lZCBpbnQJIGJpX3BjaV9idXNmcmVxOwkvKiBQQ0kgc3BlZWQgaW4gSHogKi8KLX0gYmRfdDsKLQotLyogU29tZSA0eHggcGFydHMgdXNlIGEgZGlmZmVyZW50IHRpbWViYXNlIGZyZXF1ZW5jeSBmcm9tIHRoZSBpbnRlcm5hbCBjbG9jay4KLSovCi0jZGVmaW5lIGJpX3RiZnJlcSBiaV9pbnRmcmVxCi0KLS8qIE1lbW9yeSBtYXAgZm9yIHRoZSBJQk0gIkFzaCIgTlA0MDVIIGV2YWx1YXRpb24gYm9hcmQuCi0gKi8KLQotZXh0ZXJuICB2b2lkICphc2hfcnRjX2Jhc2U7Ci0jZGVmaW5lIEFTSF9SVENfUEFERFIJCSgodWludCkweGYwMDAwMDAwKQotI2RlZmluZSBBU0hfUlRDX1ZBRERSCQlBU0hfUlRDX1BBRERSCi0jZGVmaW5lIEFTSF9SVENfU0laRQkJKCh1aW50KTgqMTAyNCkKLQotCi0vKiBFYXJseSBpbml0aWFsaXphdGlvbiBhZGRyZXNzIG1hcHBpbmcgZm9yIGJsb2NrX2lvLgotICogU3RhbmRhcmQgNDA1R1AgbWFwLgotICovCi0jZGVmaW5lIFBQQzR4eF9QQ0lfSU9fUEFERFIJKCh1aW50KVBQQzQwNV9QQ0lfUEhZX0lPX0JBU0UpCi0jZGVmaW5lIFBQQzR4eF9QQ0lfSU9fVkFERFIJUFBDNHh4X1BDSV9JT19QQUREUgotI2RlZmluZSBQUEM0eHhfUENJX0lPX1NJWkUJKCh1aW50KTY0KjEwMjQpCi0jZGVmaW5lIFBQQzR4eF9QQ0lfQ0ZHX1BBRERSCSgodWludClQUEM0MDVfUENJX0NPTkZJR19BRERSKQotI2RlZmluZSBQUEM0eHhfUENJX0NGR19WQUREUglQUEM0eHhfUENJX0NGR19QQUREUgotI2RlZmluZSBQUEM0eHhfUENJX0NGR19TSVpFCSgodWludCk0KjEwMjQpCi0jZGVmaW5lIFBQQzR4eF9QQ0lfTENGR19QQUREUgkoKHVpbnQpMHhlZjQwMDAwMCkKLSNkZWZpbmUgUFBDNHh4X1BDSV9MQ0ZHX1ZBRERSCVBQQzR4eF9QQ0lfTENGR19QQUREUgotI2RlZmluZSBQUEM0eHhfUENJX0xDRkdfU0laRQkoKHVpbnQpNCoxMDI0KQotI2RlZmluZSBQUEM0eHhfT05CX0lPX1BBRERSCSgodWludCkweGVmNjAwMDAwKQotI2RlZmluZSBQUEM0eHhfT05CX0lPX1ZBRERSCVBQQzR4eF9PTkJfSU9fUEFERFIKLSNkZWZpbmUgUFBDNHh4X09OQl9JT19TSVpFCSgodWludCk0KjEwMjQpCi0KLSNkZWZpbmUgTlJfQk9BUkRfSVJRUyAzMgotCi0jaWZkZWYgQ09ORklHX1BQQzQwNUdQX0lOVEVSTkFMX0NMT0NLCi0jZGVmaW5lIEJBU0VfQkFVRAkJMjAxNjAwCi0jZWxzZQotI2RlZmluZSBCQVNFX0JBVUQJCTY5MTIwMAotI2VuZGlmCi0KLSNkZWZpbmUgUFBDNHh4X01BQ0hJTkVfTkFNRSAiSUJNIE5QNDA1SCBBc2giCi0KLWV4dGVybiBjaGFyIHBjaV9pcnFfdGFibGVbXVs0XTsKLQotCi0jZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwotI2VuZGlmIC8qIF9fQVNNX0FTSF9IX18gKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2JhbWJvby5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9iYW1ib28uYwppbmRleCBmMTE2Nzg3Li5hYzM5MWQ0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2JhbWJvby5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvYmFtYm9vLmMKQEAgLTUyLDEzICs1Miw2IEBACiAjaW5jbHVkZSA8c3lzbGliL2dlbjU1MC5oPgogI2luY2x1ZGUgPHN5c2xpYi9pYm00NDBneF9jb21tb24uaD4KIAotLyoKLSAqIFRoaXMgaXMgYSBob3JyaWJsZSBrbHVkZ2UsIHdlIGV2ZW50dWFsbHkgbmVlZCB0byBhYnN0cmFjdCB0aGlzCi0gKiBnZW5lcmljIFBIWSBzdHVmZiwgc28gdGhlICBzdGFuZGFyZCBwaHkgbW9kZSBkZWZpbmVzIGNhbiBiZQotICogZWFzaWx5IHVzZWQgZnJvbSBhcmNoIGNvZGUuCi0gKi8KLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19waHkuaCIKLQogYmRfdCBfX3JlczsKIAogc3RhdGljIHN0cnVjdCBpYm00NHhfY2xvY2tzIGNsb2NrcyBfX2luaXRkYXRhOwpAQCAtMTIzLDMzICsxMTYsNjkgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGJhbWJvb19zZXRfZW1hY2RhdGEodm9pZCkKIHsKLQl1bnNpZ25lZCBjaGFyICogc2VsZWN0aW9uMV9iYXNlOworCXU4ICogYmFzZV9hZGRyOwogCXN0cnVjdCBvY3BfZGVmICpkZWY7CiAJc3RydWN0IG9jcF9mdW5jX2VtYWNfZGF0YSAqZW1hY2RhdGE7Ci0JdTggc2VsZWN0aW9uMV92YWw7CisJdTggdmFsOwogCWludCBtb2RlOworCXUzMiBleGNsdWRlZCA9IDA7CiAKLQlzZWxlY3Rpb24xX2Jhc2UgPSBpb3JlbWFwNjQoQkFNQk9PX0ZQR0FfU0VMRUNUSU9OMV9SRUdfQUREUiwgMTYpOwotCXNlbGVjdGlvbjFfdmFsID0gcmVhZGIoc2VsZWN0aW9uMV9iYXNlKTsKLQlpb3VubWFwKCh2b2lkICopIHNlbGVjdGlvbjFfYmFzZSk7Ci0JaWYgKEJBTUJPT19TRUxfTUlJKHNlbGVjdGlvbjFfdmFsKSkKKwliYXNlX2FkZHIgPSBpb3JlbWFwNjQoQkFNQk9PX0ZQR0FfU0VMRUNUSU9OMV9SRUdfQUREUiwgMTYpOworCXZhbCA9IHJlYWRiKGJhc2VfYWRkcik7CisJaW91bm1hcCgodm9pZCAqKSBiYXNlX2FkZHIpOworCWlmIChCQU1CT09fU0VMX01JSSh2YWwpKQogCQltb2RlID0gUEhZX01PREVfTUlJOwotCWVsc2UgaWYgKEJBTUJPT19TRUxfUk1JSShzZWxlY3Rpb24xX3ZhbCkpCisJZWxzZSBpZiAoQkFNQk9PX1NFTF9STUlJKHZhbCkpCiAJCW1vZGUgPSBQSFlfTU9ERV9STUlJOwogCWVsc2UKIAkJbW9kZSA9IFBIWV9NT0RFX1NNSUk7CiAKLQkvKiBTZXQgbWFjX2FkZHIgYW5kIHBoeSBtb2RlIGZvciBlYWNoIEVNQUMgKi8KKwkvKgorCSAqIFNXMiBvbiB0aGUgQmFtYm9vIGlzIHVzZWQgZm9yIGV0aGVybmV0IGNvbmZpZ3VyYXRpb24gYW5kIGlzIGFjY2Vzc2VkCisJICogdmlhIHRoZSBDT05GSUcyIHJlZ2lzdGVyIGluIHRoZSBGUEdBLiAgSWYgdGhlIEFORUcgcGluIGlzIHNldCwKKwkgKiBvdmVyd3JpdGUgdGhlIHN1cHBvcnRlZCBmZWF0dXJlcyB3aXRoIHRoZSBzZXR0aW5ncyBpbiBTVzIuCisJICoKKwkgKiBUaGlzIGlzIHVzZWQgYXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgaW1wcm9wZXJseSBiaWFzZWQgUkotNDUgc29ja2V0cworCSAqIG9uIHRoZSBSZXYuIDAgQmFtYm9vLiAgQnkgZGVmYXVsdCBvbmx5IDEwYmFzZVQgaXMgZnVuY3Rpb25hbC4KKwkgKiBSZW1vdmluZyBpbmR1Y3RvcnMgTDE3IGFuZCBMMTggZnJvbSB0aGUgYm9hcmQgYWxsb3dzIDEwMGJhc2VULCBidXQKKwkgKiBkaXNhYmxlcyAxMGJhc2VULiAgVGhlIFJldi4gMSBoYXMgbm8gc3VjaCBsaW1pdGF0aW9ucy4KKwkgKi8KKworCWJhc2VfYWRkciA9IGlvcmVtYXA2NChCQU1CT09fRlBHQV9DT05GSUcyX1JFR19BRERSLCA4KTsKKwl2YWwgPSByZWFkYihiYXNlX2FkZHIpOworCWlvdW5tYXAoKHZvaWQgKikgYmFzZV9hZGRyKTsKKwlpZiAoIUJBTUJPT19BVVRPTkVHT1RJQVRFKHZhbCkpIHsKKwkJZXhjbHVkZWQgfD0gU1VQUE9SVEVEX0F1dG9uZWc7CisJCWlmIChCQU1CT09fRk9SQ0VfMTAwTWJwcyh2YWwpKSB7CisJCQlleGNsdWRlZCB8PSBTVVBQT1JURURfMTBiYXNlVF9GdWxsOworCQkJZXhjbHVkZWQgfD0gU1VQUE9SVEVEXzEwYmFzZVRfSGFsZjsKKwkJCWlmIChCQU1CT09fRlVMTF9EVVBMRVhfRU4odmFsKSkKKwkJCQlleGNsdWRlZCB8PSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZjsKKwkJCWVsc2UKKwkJCQlleGNsdWRlZCB8PSBTVVBQT1JURURfMTAwYmFzZVRfRnVsbDsKKwkJfSBlbHNlIHsKKwkJCWV4Y2x1ZGVkIHw9IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsOworCQkJZXhjbHVkZWQgfD0gU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGY7CisJCQlpZiAoQkFNQk9PX0ZVTExfRFVQTEVYX0VOKHZhbCkpCisJCQkJZXhjbHVkZWQgfD0gU1VQUE9SVEVEXzEwYmFzZVRfSGFsZjsKKwkJCWVsc2UKKwkJCQlleGNsdWRlZCB8PSBTVVBQT1JURURfMTBiYXNlVF9GdWxsOworCQl9CisJfQorCisJLyogU2V0IG1hY19hZGRyLCBwaHkgbW9kZSBhbmQgdW5zdXBwb3J0ZWQgcGh5IGZlYXR1cmVzIGZvciBlYWNoIEVNQUMgKi8KIAogCWRlZiA9IG9jcF9nZXRfb25lX2RldmljZShPQ1BfVkVORE9SX0lCTSwgT0NQX0ZVTkNfRU1BQywgMCk7CiAJZW1hY2RhdGEgPSBkZWYtPmFkZGl0aW9uczsKIAltZW1jcHkoZW1hY2RhdGEtPm1hY19hZGRyLCBfX3Jlcy5iaV9lbmV0YWRkciwgNik7CiAJZW1hY2RhdGEtPnBoeV9tb2RlID0gbW9kZTsKKwllbWFjZGF0YS0+cGh5X2ZlYXRfZXhjID0gZXhjbHVkZWQ7CiAKIAlkZWYgPSBvY3BfZ2V0X29uZV9kZXZpY2UoT0NQX1ZFTkRPUl9JQk0sIE9DUF9GVU5DX0VNQUMsIDEpOwogCWVtYWNkYXRhID0gZGVmLT5hZGRpdGlvbnM7CiAJbWVtY3B5KGVtYWNkYXRhLT5tYWNfYWRkciwgX19yZXMuYmlfZW5ldDFhZGRyLCA2KTsKIAllbWFjZGF0YS0+cGh5X21vZGUgPSBtb2RlOworCWVtYWNkYXRhLT5waHlfZmVhdF9leGMgPSBleGNsdWRlZDsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9iYW1ib28uaCBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvYmFtYm9vLmgKaW5kZXggNjNkNzE0NS4uNWMwMTkyOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9iYW1ib28uaAorKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2JhbWJvby5oCkBAIC04OCw3ICs4OCw3IEBACiAjZGVmaW5lIFNURF9VQVJUX09QKG51bSkJCQkJCVwKIAl7IDAsIEJBU0VfQkFVRCwgMCwgVUFSVCMjbnVtIyNfSU5ULAkJCVwKIAkJKEFTWU5DX0JPT1RfQVVUT0NPTkYgfCBBU1lOQ19TS0lQX1RFU1QpLAlcCi0JCWlvbWVtX2Jhc2U6IFVBUlQjI251bSMjX0lPX0JBU0UsCQlcCisJCWlvbWVtX2Jhc2U6ICh2b2lkKilVQVJUIyNudW0jI19JT19CQVNFLAkJXAogCQlpb190eXBlOiBTRVJJQUxfSU9fTUVNfSwKIAogI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCVwKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvZWJvbnkuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvZWJvbnkuYwppbmRleCA1MDllNjlhLi5kNmIyYjE5IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2Vib255LmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9lYm9ueS5jCkBAIC01NSwxMyArNTUsNiBAQAogI2luY2x1ZGUgPHN5c2xpYi9nZW41NTAuaD4KICNpbmNsdWRlIDxzeXNsaWIvaWJtNDQwZ3BfY29tbW9uLmg+CiAKLS8qCi0gKiBUaGlzIGlzIGEgaG9ycmlibGUga2x1ZGdlLCB3ZSBldmVudHVhbGx5IG5lZWQgdG8gYWJzdHJhY3QgdGhpcwotICogZ2VuZXJpYyBQSFkgc3R1ZmYsIHNvIHRoZSAgc3RhbmRhcmQgcGh5IG1vZGUgZGVmaW5lcyBjYW4gYmUKLSAqIGVhc2lseSB1c2VkIGZyb20gYXJjaCBjb2RlLgotICovCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfcGh5LmgiCi0KIGJkX3QgX19yZXM7CiAKIHN0YXRpYyBzdHJ1Y3QgaWJtNDR4X2Nsb2NrcyBjbG9ja3MgX19pbml0ZGF0YTsKQEAgLTk4LDE1ICs5MSwxMCBAQAogCSAqIG9uIFJldi4gQyBzaWxpY29uIHRoZW4gZXJyYXRhIGZvcmNlcyB1cyB0bwogCSAqIHVzZSB0aGUgaW50ZXJuYWwgY2xvY2suCiAJICovCi0Jc3dpdGNoIChQVlJfUkVWKG1mc3ByKFNQUk5fUFZSKSkpIHsKLQkJY2FzZSBQVlJfUkVWKFBWUl80NDBHUF9SQik6Ci0JCQlmcmVxID0gRUJPTllfNDQwR1BfUkJfU1lTQ0xLOwotCQkJYnJlYWs7Ci0JCWNhc2UgUFZSX1JFVihQVlJfNDQwR1BfUkMxKToKLQkJZGVmYXVsdDoKLQkJCWZyZXEgPSBFQk9OWV80NDBHUF9SQ19TWVNDTEs7Ci0JCQlicmVhazsKLQl9CisJaWYgKHN0cmNtcChjdXJfY3B1X3NwZWNbMF0tPmNwdV9uYW1lLCAiNDQwR1AgUmV2LiBCIikgPT0gMCkKKwkJZnJlcSA9IEVCT05ZXzQ0MEdQX1JCX1NZU0NMSzsKKwllbHNlCisJCWZyZXEgPSBFQk9OWV80NDBHUF9SQ19TWVNDTEs7CiAKIAlpYm00NHhfY2FsaWJyYXRlX2RlY3IoZnJlcSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libTQwNWVwLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libTQwNWVwLmMKaW5kZXggNmQ0NDU2Ny4uMDkzYjI4ZCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm00MDVlcC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtNDA1ZXAuYwpAQCAtMzMsNiArMzMsNyBAQAogCS50eGRlX2lycQk9IDEzLAkJLyogVFggRGVzY3JpcHRvciBFcnJvciBJUlEgKi8KIAkucnhkZV9pcnEJPSAxNCwJCS8qIFJYIERlc2NyaXB0b3IgRXJyb3IgSVJRICovCiAJLnNlcnJfaXJxCT0gMTAsCQkvKiBNQUwgU3lzdGVtIEVycm9yIElSUSAgICAqLworCS5kY3JfYmFzZQk9IERDUk5fTUFMX0JBU0UgLyogTUFMMF9DRkcgRENSIG51bWJlciAqLwogfTsKIE9DUF9TWVNGU19NQUxfREFUQSgpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtNDA1Z3AuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtNDA1Z3AuYwppbmRleCBkZmQ3ZWYzLi5lNTcwMDQ2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libTQwNWdwLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm00MDVncC5jCkBAIC00Niw2ICs0Niw3IEBACiAJLnR4ZGVfaXJxCT0gMTMsCQkvKiBUWCBEZXNjcmlwdG9yIEVycm9yIElSUSAqLwogCS5yeGRlX2lycQk9IDE0LAkJLyogUlggRGVzY3JpcHRvciBFcnJvciBJUlEgKi8KIAkuc2Vycl9pcnEJPSAxMCwJCS8qIE1BTCBTeXN0ZW0gRXJyb3IgSVJRICAgICovCisJLmRjcl9iYXNlCT0gRENSTl9NQUxfQkFTRSAvKiBNQUwwX0NGRyBEQ1IgbnVtYmVyICovCiB9OwogT0NQX1NZU0ZTX01BTF9EQVRBKCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm00MDVncHIuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtNDA1Z3ByLmMKaW5kZXggMDFjOGNjYi4uY2QwZDAwZCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm00MDVncHIuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libTQwNWdwci5jCkBAIC00Miw2ICs0Miw3IEBACiAJLnR4ZGVfaXJxCT0gMTMsCQkvKiBUWCBEZXNjcmlwdG9yIEVycm9yIElSUSAqLwogCS5yeGRlX2lycQk9IDE0LAkJLyogUlggRGVzY3JpcHRvciBFcnJvciBJUlEgKi8KIAkuc2Vycl9pcnEJPSAxMCwJCS8qIE1BTCBTeXN0ZW0gRXJyb3IgSVJRICAgICovCisJLmRjcl9iYXNlCT0gRENSTl9NQUxfQkFTRSAvKiBNQUwwX0NGRyBEQ1IgbnVtYmVyICovCiB9OwogT0NQX1NZU0ZTX01BTF9EQVRBKCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm00NDBlcC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm00NDBlcC5jCmluZGV4IDI4NGRhMDEuLjQ3MTJkZTggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtNDQwZXAuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libTQ0MGVwLmMKQEAgLTUzLDYgKzUzLDcgQEAKIAkudHhkZV9pcnEJPSAzMywJCS8qIFRYIERlc2NyaXB0b3IgRXJyb3IgSVJRICovCiAJLnJ4ZGVfaXJxCT0gMzQsCQkvKiBSWCBEZXNjcmlwdG9yIEVycm9yIElSUSAqLwogCS5zZXJyX2lycQk9IDMyLAkJLyogTUFMIFN5c3RlbSBFcnJvciBJUlEgICAgKi8KKwkuZGNyX2Jhc2UJPSBEQ1JOX01BTF9CQVNFIC8qIE1BTDBfQ0ZHIERDUiBudW1iZXIgKi8KIH07CiBPQ1BfU1lTRlNfTUFMX0RBVEEoKQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libTQ0MGdwLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libTQ0MGdwLmMKaW5kZXggMjc2MTVlZi4uZDkyNjI0NSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm00NDBncC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtNDQwZ3AuYwpAQCAtNTYsNiArNTYsNyBAQAogCS50eGRlX2lycQk9IDMzLAkJLyogVFggRGVzY3JpcHRvciBFcnJvciBJUlEgKi8KIAkucnhkZV9pcnEJPSAzNCwJCS8qIFJYIERlc2NyaXB0b3IgRXJyb3IgSVJRICovCiAJLnNlcnJfaXJxCT0gMzIsCQkvKiBNQUwgU3lzdGVtIEVycm9yIElSUSAgICAqLworCS5kY3JfYmFzZQk9IERDUk5fTUFMX0JBU0UgLyogTUFMMF9DRkcgRENSIG51bWJlciAqLwogfTsKIE9DUF9TWVNGU19NQUxfREFUQSgpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtNDQwZ3guYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtNDQwZ3guYwppbmRleCAxZjM4ZjQyLi45NTZmNDVlIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libTQ0MGd4LmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm00NDBneC5jCkBAIC04NCw2ICs4NCw3IEBACiAJLnR4ZGVfaXJxCT0gMzMsCQkvKiBUWCBEZXNjcmlwdG9yIEVycm9yIElSUSAqLwogCS5yeGRlX2lycQk9IDM0LAkJLyogUlggRGVzY3JpcHRvciBFcnJvciBJUlEgKi8KIAkuc2Vycl9pcnEJPSAzMiwJCS8qIE1BTCBTeXN0ZW0gRXJyb3IgSVJRICAgICovCisJLmRjcl9iYXNlCT0gRENSTl9NQUxfQkFTRSAvKiBNQUwwX0NGRyBEQ1IgbnVtYmVyICovCiB9OwogT0NQX1NZU0ZTX01BTF9EQVRBKCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm00NDBzcC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm00NDBzcC5jCmluZGV4IGZhM2UwMDMuLmZlYjE3ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtNDQwc3AuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libTQ0MHNwLmMKQEAgLTQzLDYgKzQzLDcgQEAKIAkudHhkZV9pcnEJPSAzNCwJCS8qIFRYIERlc2NyaXB0b3IgRXJyb3IgSVJRICovCiAJLnJ4ZGVfaXJxCT0gMzUsCQkvKiBSWCBEZXNjcmlwdG9yIEVycm9yIElSUSAqLwogCS5zZXJyX2lycQk9IDMzLAkJLyogTUFMIFN5c3RlbSBFcnJvciBJUlEgICAgKi8KKwkuZGNyX2Jhc2UJPSBEQ1JOX01BTF9CQVNFIC8qIE1BTDBfQ0ZHIERDUiBudW1iZXIgKi8KIH07CiBPQ1BfU1lTRlNfTUFMX0RBVEEoKQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libW5wNDA1aC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm1ucDQwNWguYwppbmRleCBlY2RjNWJlLi5hNDc3YTc4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libW5wNDA1aC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtbnA0MDVoLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAkuem1paV9tdXgJPSAxLAkJLyogWk1JSSBpbnB1dCBvZiB0aGlzIEVNQUMgKi8KIAkubWFsX2lkeAk9IDAsCQkvKiBNQUwgZGV2aWNlIGluZGV4ICovCiAJLm1hbF9yeF9jaGFuCT0gMSwJCS8qIE1BTCByeCBjaGFubmVsIG51bWJlciAqLwotCS5tYWxfdHhfY2hhbgk9IDEsCQkvKiBNQUwgdHggY2hhbm5lbCBudW1iZXIgKi8KKwkubWFsX3R4X2NoYW4JPSAyLAkJLyogTUFMIHR4IGNoYW5uZWwgbnVtYmVyICovCiAJLndvbF9pcnEJPSA0MSwJCS8qIFdPTCBpbnRlcnJ1cHQgbnVtYmVyICovCiAJLm1kaW9faWR4CT0gLTEsCQkvKiBObyBzaGFyZWQgTURJTyAqLwogCS50YWhfaWR4CT0gLTEsCQkvKiBObyBUQUggKi8KQEAgLTQ2LDcgKzQ2LDcgQEAKIAkuem1paV9tdXgJPSAyLAkJLyogWk1JSSBpbnB1dCBvZiB0aGlzIEVNQUMgKi8KIAkubWFsX2lkeAk9IDAsCQkvKiBNQUwgZGV2aWNlIGluZGV4ICovCiAJLm1hbF9yeF9jaGFuCT0gMiwJCS8qIE1BTCByeCBjaGFubmVsIG51bWJlciAqLwotCS5tYWxfdHhfY2hhbgk9IDIsCQkvKiBNQUwgdHggY2hhbm5lbCBudW1iZXIgKi8KKwkubWFsX3R4X2NoYW4JPSA0LAkJLyogTUFMIHR4IGNoYW5uZWwgbnVtYmVyICovCiAJLndvbF9pcnEJPSA0MSwJCS8qIFdPTCBpbnRlcnJ1cHQgbnVtYmVyICovCiAJLm1kaW9faWR4CT0gLTEsCQkvKiBObyBzaGFyZWQgTURJTyAqLwogCS50YWhfaWR4CT0gLTEsCQkvKiBObyBUQUggKi8KQEAgLTU4LDcgKzU4LDcgQEAKIAkuem1paV9tdXgJPSAzLAkJLyogWk1JSSBpbnB1dCBvZiB0aGlzIEVNQUMgKi8KIAkubWFsX2lkeAk9IDAsCQkvKiBNQUwgZGV2aWNlIGluZGV4ICovCiAJLm1hbF9yeF9jaGFuCT0gMywJCS8qIE1BTCByeCBjaGFubmVsIG51bWJlciAqLwotCS5tYWxfdHhfY2hhbgk9IDMsCQkvKiBNQUwgdHggY2hhbm5lbCBudW1iZXIgKi8KKwkubWFsX3R4X2NoYW4JPSA2LAkJLyogTUFMIHR4IGNoYW5uZWwgbnVtYmVyICovCiAJLndvbF9pcnEJPSA0MSwJCS8qIFdPTCBpbnRlcnJ1cHQgbnVtYmVyICovCiAJLm1kaW9faWR4CT0gLTEsCQkvKiBObyBzaGFyZWQgTURJTyAqLwogCS50YWhfaWR4CT0gLTEsCQkvKiBObyBUQUggKi8KQEAgLTczLDYgKzczLDcgQEAKIAkudHhkZV9pcnEJPSA0NiwJCS8qIFRYIERlc2NyaXB0b3IgRXJyb3IgSVJRICovCiAJLnJ4ZGVfaXJxCT0gNDcsCQkvKiBSWCBEZXNjcmlwdG9yIEVycm9yIElSUSAqLwogCS5zZXJyX2lycQk9IDQ1LAkJLyogTUFMIFN5c3RlbSBFcnJvciBJUlEgICAgKi8KKwkuZGNyX2Jhc2UJPSBEQ1JOX01BTF9CQVNFIC8qIE1BTDBfQ0ZHIERDUiBudW1iZXIgKi8KIH07CiBPQ1BfU1lTRlNfTUFMX0RBVEEoKQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libXN0YjQuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtc3RiNC5jCmluZGV4IDg3NGQxNmIuLmQ5MDYyN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtc3RiNC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtc3RiNC5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL29jcC5oPgorI2luY2x1ZGUgPGFzbS9wcGM0eHhfcGljLmg+CiAjaW5jbHVkZSA8cGxhdGZvcm1zLzR4eC9pYm1zdGI0Lmg+CiAKIHN0YXRpYyBzdHJ1Y3Qgb2NwX2Z1bmNfaWljX2RhdGEgaWJtc3RiNF9paWMwX2RlZiA9IHsKQEAgLTcyLDEyICs3Myw1MSBAQAogCSAgLmlycQkJPSBJREUwX0lSUSwKIAkgIC5wbQkJPSBPQ1BfQ1BNX05BLAogCX0sCi0JeyAudmVuZG9yCT0gT0NQX1ZFTkRPUl9JQk0sCi0JICAuZnVuY3Rpb24JPSBPQ1BfRlVOQ19VU0IsCi0JICAucGFkZHIJPSBVU0IwX0JBU0UsCi0JICAuaXJxCQk9IFVTQjBfSVJRLAotCSAgLnBtCQk9IE9DUF9DUE1fTkEsCi0JfSwKIAl7IC52ZW5kb3IJPSBPQ1BfVkVORE9SX0lOVkFMSUQsCiAJfQogfTsKKworLyogUG9sYXJpdHkgYW5kIHRyaWdnZXJpbmcgc2V0dGluZ3MgZm9yIGludGVybmFsIGludGVycnVwdCBzb3VyY2VzICovCitzdHJ1Y3QgcHBjNHh4X3VpY19zZXR0aW5ncyBwcGM0eHhfY29yZV91aWNfY2ZnW10gX19pbml0ZGF0YSA9IHsKKwl7IC5wb2xhcml0eSAJPSAweDdmZmZmZjAxLAorCSAgLnRyaWdnZXJpbmcJPSAweDAwMDAwMDAwLAorCSAgLmV4dF9pcnFfbWFzawk9IDB4MDAwMDAwN2UsCS8qIElSUTAgLSBJUlE1ICovCisJfQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvaGNpX3VzYl9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFVTQjBfQkFTRSwKKwkJLmVuZAk9IFVTQjBfQkFTRSArIFVTQjBfU0laRSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBVU0IwX0lSUSwKKwkJLmVuZAk9IFVTQjBfSVJRLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHU2NCBkbWFfbWFzayA9IDB4ZmZmZmZmZmZVTEw7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9oY2lfdXNiX2RldmljZSA9IHsKKwkubmFtZQkJPSAicHBjLXNvYy1vaGNpIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUob2hjaV91c2JfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBvaGNpX3VzYl9yZXNvdXJjZXMsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzayA9ICZkbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMTCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaWJtc3RiNF9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwkmb2hjaV91c2JfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2libXN0YjRfcGxhdGZvcm1fYWRkX2RldmljZXModm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoaWJtc3RiNF9kZXZzLCBBUlJBWV9TSVpFKGlibXN0YjRfZGV2cykpOworfQorYXJjaF9pbml0Y2FsbChpYm1zdGI0X3BsYXRmb3JtX2FkZF9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtc3RiNC5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm1zdGI0LmgKaW5kZXggYmNiNGIxZS4uOWYyMWQ0YyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm1zdGI0LmgKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm1zdGI0LmgKQEAgLTczLDkgKzczLDkgQEAKICNkZWZpbmUgT1BCMF9CQVNFCTB4NDAwMDAwMDAKICNkZWZpbmUgR1BJTzBfQkFTRQkweDQwMDYwMDAwCiAKKyNkZWZpbmUgVVNCMF9CQVNFCTB4NDAwMTAwMDAKKyNkZWZpbmUgVVNCMF9TSVpFCTB4QTAKICNkZWZpbmUgVVNCMF9JUlEJMTgKLSNkZWZpbmUgVVNCMF9CQVNFCVNUQjA0eHh4X01BUF9JT19BRERSKDB4NDAwMTAwMDApCi0jZGVmaW5lIFVTQjBfRVhURU5UIDQwOTYKIAogI2RlZmluZSBJSUNfTlVNUyAyCiAjZGVmaW5lIFVBUlRfTlVNUwkzCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2x1YW4uYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvbHVhbi5jCmluZGV4IDk1MzU5ZjcuLmEzOGU2ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvbHVhbi5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvbHVhbi5jCkBAIC01MywxMyArNTMsNiBAQAogI2luY2x1ZGUgPHN5c2xpYi9pYm00NDBneF9jb21tb24uaD4KICNpbmNsdWRlIDxzeXNsaWIvaWJtNDQwc3BfY29tbW9uLmg+CiAKLS8qCi0gKiBUaGlzIGlzIGEgaG9ycmlibGUga2x1ZGdlLCB3ZSBldmVudHVhbGx5IG5lZWQgdG8gYWJzdHJhY3QgdGhpcwotICogZ2VuZXJpYyBQSFkgc3R1ZmYsIHNvIHRoZSAgc3RhbmRhcmQgcGh5IG1vZGUgZGVmaW5lcyBjYW4gYmUKLSAqIGVhc2lseSB1c2VkIGZyb20gYXJjaCBjb2RlLgotICovCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfcGh5LmgiCi0KIGJkX3QgX19yZXM7CiAKIHN0YXRpYyBzdHJ1Y3QgaWJtNDR4X2Nsb2NrcyBjbG9ja3MgX19pbml0ZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvbHVhbi5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9sdWFuLmgKaW5kZXggMDliNDQ0Yy4uYmJlN2QwNyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9sdWFuLmgKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9sdWFuLmgKQEAgLTU1LDcgKzU1LDcgQEAKICNkZWZpbmUgU1REX1VBUlRfT1AobnVtKQkJCQkJXAogCXsgMCwgQkFTRV9CQVVELCAwLCBVQVJUIyNudW0jI19JTlQsCQkJXAogCQkoQVNZTkNfQk9PVF9BVVRPQ09ORiB8IEFTWU5DX1NLSVBfVEVTVCksCVwKLQkJaW9tZW1fYmFzZTogVUFSVCMjbnVtIyNfSU9fQkFTRSwJCVwKKwkJaW9tZW1fYmFzZTogKHZvaWQqKVVBUlQjI251bSMjX0lPX0JBU0UsCQlcCiAJCWlvX3R5cGU6IFNFUklBTF9JT19NRU19LAogCiAjZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMJXApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9vYWsuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvb2FrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMjVlZTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9vYWsuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICoKLSAqICAgIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIEdyYW50IEVyaWNrc29uIDxncmFudEBsY3NlLnVtbi5lZHU+Ci0gKgotICogICAgTW9kdWxlIG5hbWU6IG9hay5jCi0gKgotICogICAgRGVzY3JpcHRpb246Ci0gKiAgICAgIEFyY2hpdGVjdHVyZS0gLyBwbGF0Zm9ybS1zcGVjaWZpYyBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZSBmb3IKLSAqICAgICAgdGhlIElCTSBQb3dlclBDIDQwM0dDWCAiT2FrIiBldmFsdWF0aW9uIGJvYXJkLiBBZGFwdGVkIGZyb20gb3JpZ2luYWwKLSAqICAgICAgY29kZSBieSBHYXJ5IFRob21hcywgQ29ydCBEb3VnYW4gPGNvcnRAZnNtbGFicy5jb20+LCBhbmQgRGFuIE1hbGVrCi0gKiAgICAgIDxkYW5AbmV0NHguY29tPi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCi0jaW5jbHVkZSA8YXNtL2JvYXJkLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgotI2luY2x1ZGUgPGFzbS9wcGM0eHhfcGljLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLQotI2luY2x1ZGUgIm9hay5oIgotCi0vKiBGdW5jdGlvbiBQcm90b3R5cGVzICovCi0KLWV4dGVybiB2b2lkIGFib3J0KHZvaWQpOwotCi0vKiBHbG9iYWwgVmFyaWFibGVzICovCi0KLXVuc2lnbmVkIGNoYXIgX19yZXNbc2l6ZW9mKGJkX3QpXTsKLQotCi0vKgotICogdm9pZCBfX2luaXQgb2FrX2luaXQoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogICBUaGlzIHJvdXRpbmUuLi4KLSAqCi0gKiBJbnB1dChzKToKLSAqICAgcjMgLSBPcHRpb25hbCBwb2ludGVyIHRvIGEgYm9hcmQgaW5mb3JtYXRpb24gc3RydWN0dXJlLgotICogICByNCAtIE9wdGlvbmFsIHBvaW50ZXIgdG8gdGhlIHBoeXNpY2FsIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGluaXQgUkFNCi0gKiAgICAgICAgZGlzay4KLSAqICAgcjUgLSBPcHRpb25hbCBwb2ludGVyIHRvIHRoZSBwaHlzaWNhbCBlbmRpbmcgYWRkcmVzcyBvZiB0aGUgaW5pdCBSQU0KLSAqICAgICAgICBkaXNrLgotICogICByNiAtIE9wdGlvbmFsIHBvaW50ZXIgdG8gdGhlIHBoeXNpY2FsIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgYW55IGtlcm5lbAotICogICAgICAgIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzLgotICogICByNyAtIE9wdGlvbmFsIHBvaW50ZXIgdG8gdGhlIHBoeXNpY2FsIGVuZGluZyBhZGRyZXNzIG9mIGFueSBrZXJuZWwKLSAqICAgICAgICBjb21tYW5kLWxpbmUgcGFyYW1ldGVycy4KLSAqCi0gKiBPdXRwdXQocyk6Ci0gKiAgIE4vQQotICoKLSAqIFJldHVybnM6Ci0gKiAgIE4vQQotICoKLSAqLwotdm9pZCBfX2luaXQKLXBsYXRmb3JtX2luaXQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKLQkgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3KQotewotCXBhcnNlX2Jvb3RpbmZvKGZpbmRfYm9vdGluZm8oKSk7Ci0KLQkvKgotCSAqIElmIHdlIHdlcmUgcGFzc2VkIGluIGEgYm9hcmQgaW5mb3JtYXRpb24sIGNvcHkgaXQgaW50byB0aGUKLQkgKiByZXNpZHVhbCBkYXRhIGFyZWEuCi0JICovCi0JaWYgKHIzKSB7Ci0JCW1lbWNweSgodm9pZCAqKV9fcmVzLCAodm9pZCAqKShyMyArIEtFUk5FTEJBU0UpLCBzaXplb2YoYmRfdCkpOwotCX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5JVFJEKQotCS8qCi0JICogSWYgdGhlIGluaXQgUkFNIGRpc2sgaGFzIGJlZW4gY29uZmlndXJlZCBpbiwgYW5kIHRoZXJlJ3MgYSB2YWxpZAotCSAqIHN0YXJ0aW5nIGFkZHJlc3MgZm9yIGl0LCBzZXQgaXQgdXAuCi0JICovCi0JaWYgKHI0KSB7Ci0JCWluaXRyZF9zdGFydCA9IHI0ICsgS0VSTkVMQkFTRTsKLQkJaW5pdHJkX2VuZCA9IHI1ICsgS0VSTkVMQkFTRTsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSU5JVFJEICovCi0KLQkvKiBDb3B5IHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBhIHNhZmUgcGxhY2UuICovCi0KLQlpZiAocjYpIHsKLSAJCSooY2hhciAqKShyNyArIEtFUk5FTEJBU0UpID0gMDsKLQkJc3RyY3B5KGNtZF9saW5lLCAoY2hhciAqKShyNiArIEtFUk5FTEJBU0UpKTsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIG1hY2hpbmUtZGVwZW5kZW5jeSB2ZWN0b3JzICovCi0KLQlwcGNfbWQuc2V0dXBfYXJjaAkgCT0gb2FrX3NldHVwX2FyY2g7Ci0JcHBjX21kLnNob3dfcGVyY3B1aW5mbwkgCT0gb2FrX3Nob3dfcGVyY3B1aW5mbzsKLQlwcGNfbWQuaXJxX2Nhbm9uaWNhbGl6ZSAJPSBOVUxMOwotCXBwY19tZC5pbml0X0lSUQkJIAk9IHBwYzR4eF9waWNfaW5pdDsKLQlwcGNfbWQuZ2V0X2lycQkJIAk9IE5VTEw7ICAvKiBTZXQgaW4gcHBjNHh4X3BpY19pbml0KCkgKi8KLQlwcGNfbWQuaW5pdAkJIAk9IE5VTEw7Ci0KLQlwcGNfbWQucmVzdGFydAkJIAk9IG9ha19yZXN0YXJ0OwotCXBwY19tZC5wb3dlcl9vZmYJIAk9IG9ha19wb3dlcl9vZmY7Ci0JcHBjX21kLmhhbHQJCSAJPSBvYWtfaGFsdDsKLQotCXBwY19tZC50aW1lX2luaXQJIAk9IG9ha190aW1lX2luaXQ7Ci0JcHBjX21kLnNldF9ydGNfdGltZQkgCT0gb2FrX3NldF9ydGNfdGltZTsKLQlwcGNfbWQuZ2V0X3J0Y190aW1lCSAJPSBvYWtfZ2V0X3J0Y190aW1lOwotCXBwY19tZC5jYWxpYnJhdGVfZGVjcgkgCT0gb2FrX2NhbGlicmF0ZV9kZWNyOwotfQotCi0vKgotICogRG9jdW1lbnQgbWUuCi0gKi8KLXZvaWQgX19pbml0Ci1vYWtfc2V0dXBfYXJjaCh2b2lkKQotewotCS8qIFhYWCAtIEltcGxlbWVudCBtZSAqLwotfQotCi0vKgotICogaW50IG9ha19zaG93X3BlcmNwdWluZm8oKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogICBUaGlzIHJvdXRpbmUgcHJldHR5LXByaW50cyB0aGUgcGxhdGZvcm0ncyBpbnRlcm5hbCBDUFUgYW5kIGJ1cyBjbG9jawotICogICBmcmVxdWVuY2llcyBpbnRvIHRoZSBidWZmZXIgZm9yIHVzYWdlIGluIC9wcm9jL2NwdWluZm8uCi0gKgotICogSW5wdXQocyk6Ci0gKiAgKmJ1ZmZlciAtIEJ1ZmZlciBpbnRvIHdoaWNoIENQVSBhbmQgYnVzIGNsb2NrIGZyZXF1ZW5jaWVzIGFyZSB0byBiZQotICogICAgICAgICAgICBwcmludGVkLgotICoKLSAqIE91dHB1dChzKToKLSAqICAqYnVmZmVyIC0gQnVmZmVyIHdpdGggdGhlIENQVSBhbmQgYnVzIGNsb2NrIGZyZXF1ZW5jaWVzLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGludG8gJ2J1ZmZlcicgaWYgT0ssIG90aGVyd2lzZSB6ZXJvIG9yIGxlc3MKLSAqICAgb24gZXJyb3IuCi0gKi8KLWludAotb2FrX3Nob3dfcGVyY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGludCBpKQotewotCWJkX3QgKmJwID0gKGJkX3QgKilfX3JlczsKLQotCXNlcV9wcmludGYobSwgImNsb2NrXHRcdDogJWRNSHpcbiIKLQkJICAgImJ1cyBjbG9ja1x0XHQ6ICVkTUh6XG4iLAotCQkgICBicC0+YmlfaW50ZnJlcSAvIDEwMDAwMDAsCi0JCSAgIGJwLT5iaV9idXNmcmVxIC8gMTAwMDAwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIERvY3VtZW50IG1lLgotICovCi12b2lkCi1vYWtfcmVzdGFydChjaGFyICpjbWQpCi17Ci0JYWJvcnQoKTsKLX0KLQotLyoKLSAqIERvY3VtZW50IG1lLgotICovCi12b2lkCi1vYWtfcG93ZXJfb2ZmKHZvaWQpCi17Ci0Jb2FrX3Jlc3RhcnQoTlVMTCk7Ci19Ci0KLS8qCi0gKiBEb2N1bWVudCBtZS4KLSAqLwotdm9pZAotb2FrX2hhbHQodm9pZCkKLXsKLQlvYWtfcmVzdGFydChOVUxMKTsKLX0KLQotLyoKLSAqIERvY3VtZW50IG1lLgotICovCi1sb25nIF9faW5pdAotb2FrX3RpbWVfaW5pdCh2b2lkKQotewotCS8qIFhYWCAtIEltcGxlbWVudCBtZSAqLwotCXJldHVybiAwOwotfQotCi0vKgotICogRG9jdW1lbnQgbWUuCi0gKi8KLWludCBfX2luaXQKLW9ha19zZXRfcnRjX3RpbWUodW5zaWduZWQgbG9uZyB0aW1lKQotewotCS8qIFhYWCAtIEltcGxlbWVudCBtZSAqLwotCi0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIERvY3VtZW50IG1lLgotICovCi11bnNpZ25lZCBsb25nIF9faW5pdAotb2FrX2dldF9ydGNfdGltZSh2b2lkKQotewotCS8qIFhYWCAtIEltcGxlbWVudCBtZSAqLwotCi0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIHZvaWQgX19pbml0IG9ha19jYWxpYnJhdGVfZGVjcigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIFRoaXMgcm91dGluZSByZXRyaWV2ZXMgdGhlIGludGVybmFsIHByb2Nlc3NvciBmcmVxdWVuY3kgZnJvbSB0aGUgYm9hcmQKLSAqICAgaW5mb3JtYXRpb24gc3RydWN0dXJlLCBzZXRzIHVwIHRoZSBrZXJuZWwgdGltZXIgZGVjcmVtZW50ZXIgYmFzZWQgb24KLSAqICAgdGhhdCB2YWx1ZSwgZW5hYmxlcyB0aGUgNDAzIHByb2dyYW1tYWJsZSBpbnRlcnZhbCB0aW1lciAoUElUKSBhbmQgc2V0cwotICogICBpdCB1cCBmb3IgYXV0by1yZWxvYWQuCi0gKgotICogSW5wdXQocyk6Ci0gKiAgIE4vQQotICoKLSAqIE91dHB1dChzKToKLSAqICAgTi9BCi0gKgotICogUmV0dXJuczoKLSAqICAgTi9BCi0gKgotICovCi12b2lkIF9faW5pdAotb2FrX2NhbGlicmF0ZV9kZWNyKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGZyZXE7Ci0JYmRfdCAqYmlwID0gKGJkX3QgKilfX3JlczsKLQotCWZyZXEgPSBiaXAtPmJpX2ludGZyZXE7Ci0KLQlkZWNyZW1lbnRlcl9jb3VudCA9IGZyZXEgLyBIWjsKLQljb3VudF9wZXJpb2RfbnVtID0gMTsKLQljb3VudF9wZXJpb2RfZGVuID0gZnJlcTsKLQotCS8qIEVuYWJsZSB0aGUgUElUIGFuZCBzZXQgYXV0by1yZWxvYWQgb2YgaXRzIHZhbHVlICovCi0KLQltdHNwcihTUFJOX1RDUiwgVENSX1BJRSB8IFRDUl9BUkUpOwotCi0JLyogQ2xlYXIgYW55IHBlbmRpbmcgdGltZXIgaW50ZXJydXB0cyAqLwotCi0JbXRzcHIoU1BSTl9UU1IsIFRTUl9FTlcgfCBUU1JfV0lTIHwgVFNSX1BJUyB8IFRTUl9GSVMpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9vYWsuaCBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvb2FrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODZhNGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9vYWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKgotICogICAgQ29weXJpZ2h0IChjKSAxOTk5IEdyYW50IEVyaWNrc29uIDxncmFudEBsY3NlLnVtbi5lZHU+Ci0gKgotICogICAgTW9kdWxlIG5hbWU6IG9hay5oCi0gKgotICogICAgRGVzY3JpcHRpb246Ci0gKglNYWNyb3MsIGRlZmluaXRpb25zLCBhbmQgZGF0YSBzdHJ1Y3R1cmVzIHNwZWNpZmljIHRvIHRoZSBJQk0gUG93ZXJQQwotICogICAgICA0MDNHe0EsQixDLENYfSAiT2FrIiBldmFsdWF0aW9uIGJvYXJkLiBBbnl0aGluZyBzcGVjaWZpYyB0byB0aGUgcHJvLQotICogICAgICBjZXNzb3IgaXRzZWxmIGlzIGRlZmluZWQgZWxzZXdoZXJlLgotICoKLSAqLwotCi0jaWZkZWYgX19LRVJORUxfXwotI2lmbmRlZiBfX0FTTV9PQUtfSF9fCi0jZGVmaW5lIF9fQVNNX09BS19IX18KLQotLyogV2UgaGF2ZSBhbiBJQk0gNDAzR3tBLEIsQyxDWH0gY29yZSAqLwotI2luY2x1ZGUgPGFzbS9pYm00MDMuaD4KLQotI2RlZmluZSBfSU9fQkFTRQkwCi0jZGVmaW5lIF9JU0FfTUVNX0JBU0UJMAotI2RlZmluZSBQQ0lfRFJBTV9PRkZTRVQJMAotCi0vKiBNZW1vcnkgbWFwIGZvciB0aGUgIk9hayIgZXZhbHVhdGlvbiBib2FyZCAqLwotCi0jZGVmaW5lCVBQQzQwM1NQVV9JT19CQVNFCTB4NDAwMDAwMDAJLyogNDAzIE9uLWNoaXAgc2VyaWFsIHBvcnQgKi8KLSNkZWZpbmUJUFBDNDAzU1BVX0lPX1NJWkUJMHgwMDAwMDAwOAotI2RlZmluZQlPQUtTRVJJQUxfSU9fQkFTRQkweDdFMDAwMDAwCS8qIE5TMTY1NTBEViBzZXJpYWwgcG9ydCAqLwotI2RlZmluZQlPQUtTRVJJQUxfSU9fU0laRQkweDAwMDAwMDA4Ci0jZGVmaW5lCU9BS05FVF9JT19CQVNFCQkweEY0MDAwMDAwCS8qIE5TODM5MDJBViBFdGhlcm5ldCAqLwotI2RlZmluZQlPQUtORVRfSU9fU0laRQkJMHgwMDAwMDA0MAotI2RlZmluZQlPQUtQUk9NX0lPX0JBU0UJCTB4RkZGRTAwMDAJLyogQU1EIDI5RjAxMCBGbGFzaCBST00gKi8KLSNkZWZpbmUJT0FLUFJPTV9JT19TSVpFCQkweDAwMDIwMDAwCi0KLQotLyogSW50ZXJydXB0IGFzc2lnbm1lbnRzIGZpeGVkIGJ5IHRoZSBoYXJkd2FyZSBpbXBsZW1lbnRhdGlvbiAqLwotCi0vKiBUaGlzIGlzIGFubm95aW5nIGtidWlsZC0yLjQgcHJvYmxlbS4gLS0gVG9tICovCi0KLSNkZWZpbmUJUFBDNDAzU1BVX1JYX0lOVAk0CS8qIEFJQ19JTlQ0ICovCi0jZGVmaW5lCVBQQzQwM1NQVV9UWF9JTlQJNQkvKiBBSUNfSU5UNSAqLwotI2RlZmluZQlPQUtORVRfSU5UCQkyNwkvKiBBSUNfSU5UMjcgKi8KLSNkZWZpbmUJT0FLU0VSSUFMX0lOVAkJMjgJLyogQUlDX0lOVDI4ICovCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0vKgotICogRGF0YSBzdHJ1Y3R1cmUgZGVmaW5pbmcgYm9hcmQgaW5mb3JtYXRpb24gbWFpbnRhaW5lZCBieSB0aGUgYm9vdAotICogUk9NIG9uIElCTSdzICJPYWsiIGV2YWx1YXRpb24gYm9hcmQuIEFuIGVmZm9ydCBoYXMgYmVlbiBtYWRlIHRvCi0gKiBrZWVwIHRoZSBmaWVsZCBuYW1lcyBjb25zaXN0ZW50IHdpdGggdGhlIDh4eCAnYmRfdCcgYm9hcmQgaW5mbwotICogc3RydWN0dXJlcy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBib2FyZF9pbmZvIHsKLQl1bnNpZ25lZCBjaGFyCSBiaV9zX3ZlcnNpb25bNF07CS8qIFZlcnNpb24gb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KLQl1bnNpZ25lZCBjaGFyCSBiaV9yX3ZlcnNpb25bMzBdOwkvKiBWZXJzaW9uIG9mIHRoZSBJQk0gUk9NICovCi0JdW5zaWduZWQgaW50CSBiaV9tZW1zaXplOwkJLyogRFJBTSBpbnN0YWxsZWQsIGluIGJ5dGVzICovCi0JdW5zaWduZWQgY2hhcgkgYmlfZW5ldGFkZHJbNl07CS8qIEV0aGVybmV0IE1BQyBhZGRyZXNzICovCi0JdW5zaWduZWQgaW50CSBiaV9pbnRmcmVxOwkJLyogUHJvY2Vzc29yIHNwZWVkLCBpbiBIeiAqLwotCXVuc2lnbmVkIGludAkgYmlfYnVzZnJlcTsJCS8qIEJ1cyBzcGVlZCwgaW4gSHogKi8KLX0gYmRfdDsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1leHRlcm4gdm9pZAkJIG9ha19pbml0KHVuc2lnbmVkIGxvbmcgcjMsCi0JCQkJICB1bnNpZ25lZCBsb25nIGlyZF9zdGFydCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgaXJkX2VuZCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgY2xpbmVfc3RhcnQsCi0JCQkJICB1bnNpZ25lZCBsb25nIGNsaW5lX2VuZCk7Ci1leHRlcm4gdm9pZAkJIG9ha19zZXR1cF9hcmNoKHZvaWQpOwotZXh0ZXJuIGludAkJIG9ha19zZXR1cF9yZXNpZHVhbChjaGFyICpidWZmZXIpOwotZXh0ZXJuIHZvaWQJCSBvYWtfaW5pdF9JUlEodm9pZCk7Ci1leHRlcm4gaW50CQkgb2FrX2dldF9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIHZvaWQJCSBvYWtfcmVzdGFydChjaGFyICpjbWQpOwotZXh0ZXJuIHZvaWQJCSBvYWtfcG93ZXJfb2ZmKHZvaWQpOwotZXh0ZXJuIHZvaWQJCSBvYWtfaGFsdCh2b2lkKTsKLWV4dGVybiB2b2lkCQkgb2FrX3RpbWVfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQJCSBvYWtfc2V0X3J0Y190aW1lKHVuc2lnbmVkIGxvbmcgbm93KTsKLWV4dGVybiB1bnNpZ25lZCBsb25nCSBvYWtfZ2V0X3J0Y190aW1lKHZvaWQpOwotZXh0ZXJuIHZvaWQJCSBvYWtfY2FsaWJyYXRlX2RlY3Iodm9pZCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLS8qIFNvbWUgNHh4IHBhcnRzIHVzZSBhIGRpZmZlcmVudCB0aW1lYmFzZSBmcmVxdWVuY3kgZnJvbSB0aGUgaW50ZXJuYWwgY2xvY2suCi0qLwotI2RlZmluZSBiaV90YmZyZXEgYmlfaW50ZnJlcQotCi0jZGVmaW5lIFBQQzR4eF9NQUNISU5FX05BTUUJIklCTSBPYWsiCi0KLSNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0jZW5kaWYgLyogX19BU01fT0FLX0hfXyAqLwotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvb2FrX3NldHVwLmggYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L29ha19zZXR1cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjQ4YmQwLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvb2FrX3NldHVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICoKLSAqICAgIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIEdyYW50IEVyaWNrc29uIDxncmFudEBsY3NlLnVtbi5lZHU+Ci0gKgotICogICAgTW9kdWxlIG5hbWU6IG9ha19zZXR1cC5oCi0gKgotICogICAgRGVzY3JpcHRpb246Ci0gKiAgICAgIEFyY2hpdGVjdHVyZS0gLyBwbGF0Zm9ybS1zcGVjaWZpYyBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZSBmb3IKLSAqICAgICAgdGhlIElCTSBQb3dlclBDIDQwM0dDWCAiT2FrIiBldmFsdWF0aW9uIGJvYXJkLiBBZGFwdGVkIGZyb20gb3JpZ2luYWwKLSAqICAgICAgY29kZSBieSBHYXJ5IFRob21hcywgQ29ydCBEb3VnYW4gPGNvcnRAY3Mubm10LmVkdT4sIGFuZCBEYW4gTWFsZWsKLSAqICAgICAgPGRhbkBuZXR4NC5jb20+LgotICoKLSAqLwotCi0jaWZuZGVmCV9fT0FLX1NFVFVQX0hfXwotI2RlZmluZQlfX09BS19TRVRVUF9IX18KLQotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vYm9hcmQuaD4KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLWV4dGVybiB1bnNpZ25lZCBjaGFyCSBfX3Jlc1tzaXplb2YoYmRfdCldOwotCi1leHRlcm4gdm9pZAkJIG9ha19pbml0KHVuc2lnbmVkIGxvbmcgcjMsCi0JCQkJICB1bnNpZ25lZCBsb25nIGlyZF9zdGFydCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgaXJkX2VuZCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgY2xpbmVfc3RhcnQsCi0JCQkJICB1bnNpZ25lZCBsb25nIGNsaW5lX2VuZCk7Ci1leHRlcm4gdm9pZAkJIG9ha19zZXR1cF9hcmNoKHZvaWQpOwotZXh0ZXJuIGludAkJIG9ha19zZXR1cF9yZXNpZHVhbChjaGFyICpidWZmZXIpOwotZXh0ZXJuIHZvaWQJCSBvYWtfaW5pdF9JUlEodm9pZCk7Ci1leHRlcm4gaW50CQkgb2FrX2dldF9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIHZvaWQJCSBvYWtfcmVzdGFydChjaGFyICpjbWQpOwotZXh0ZXJuIHZvaWQJCSBvYWtfcG93ZXJfb2ZmKHZvaWQpOwotZXh0ZXJuIHZvaWQJCSBvYWtfaGFsdCh2b2lkKTsKLWV4dGVybiB2b2lkCQkgb2FrX3RpbWVfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQJCSBvYWtfc2V0X3J0Y190aW1lKHVuc2lnbmVkIGxvbmcgbm93KTsKLWV4dGVybiB1bnNpZ25lZCBsb25nCSBvYWtfZ2V0X3J0Y190aW1lKHZvaWQpOwotZXh0ZXJuIHZvaWQJCSBvYWtfY2FsaWJyYXRlX2RlY3Iodm9pZCk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fT0FLX1NFVFVQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9vY290ZWEuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvb2NvdGVhLmMKaW5kZXggOGZjMzRhMy4uODAwMjhkZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9vY290ZWEuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L29jb3RlYS5jCkBAIC01MywxMyArNTMsNiBAQAogI2luY2x1ZGUgPHN5c2xpYi9nZW41NTAuaD4KICNpbmNsdWRlIDxzeXNsaWIvaWJtNDQwZ3hfY29tbW9uLmg+CiAKLS8qCi0gKiBUaGlzIGlzIGEgaG9ycmlibGUga2x1ZGdlLCB3ZSBldmVudHVhbGx5IG5lZWQgdG8gYWJzdHJhY3QgdGhpcwotICogZ2VuZXJpYyBQSFkgc3R1ZmYsIHNvIHRoZSAgc3RhbmRhcmQgcGh5IG1vZGUgZGVmaW5lcyBjYW4gYmUKLSAqIGVhc2lseSB1c2VkIGZyb20gYXJjaCBjb2RlLgotICovCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfcGh5LmgiCi0KIGJkX3QgX19yZXM7CiAKIHN0YXRpYyBzdHJ1Y3QgaWJtNDR4X2Nsb2NrcyBjbG9ja3MgX19pbml0ZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvcmVkd29vZDUuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvcmVkd29vZDUuYwppbmRleCAyZjVlNDEwLi5iZWU4YjRhIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3JlZHdvb2Q1LmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9yZWR3b29kNS5jCkBAIC0xOCw2ICsxOCwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BwYzR4eF9waWMuaD4KKworLyoKKyAqIERlZmluZSBleHRlcm5hbCBJUlEgc2Vuc2VzIGFuZCBwb2xhcml0aWVzLgorICovCit1bnNpZ25lZCBjaGFyIHBwYzR4eF91aWNfZXh0X2lycV9jZmdbXSBfX2luaXRkYXRhID0geworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfTkVHQVRJVkUpLAkvKiBFeHQgSW50IDAgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwJLyogRXh0IEludCAxICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9ORUdBVElWRSksCS8qIEV4dCBJbnQgMiAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfTkVHQVRJVkUpLAkvKiBFeHQgSW50IDMgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwJLyogRXh0IEludCA0ICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9ORUdBVElWRSksCS8qIEV4dCBJbnQgNSAqLworfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbWM5MXhfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmMKaW5kZXggZGRkMDRkNC4uYjM4YTg1MSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCkBAIC02Miw5ICs2MiwyOSBAQAogdW5zaWduZWQgY2hhciBfX3Jlc1tzaXplb2YgKGJkX3QpXTsKIAogI2lmZGVmIENPTkZJR19QQ0kKLSNlcnJvciAiUENJIGlzIG5vdCBzdXBwb3J0ZWQiCi0vKiBORUVEIG1wYzgzeHhfbWFwX2lycSAmIG1wYzgzeHhfZXhjbHVkZV9kZXZpY2UKLSAgIHNlZSBwbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkc19jb21tb24uYyAqLworaW50CittcGM4M3h4X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgY2hhciBpZHNlbCwgdW5zaWduZWQgY2hhciBwaW4pCit7CisJc3RhdGljIGNoYXIgcGNpX2lycV90YWJsZVtdWzRdID0KKwkgICAgLyoKKwkgICAgICogICAgICBQQ0kgSURTRUwvSU5UUElOLT5JTlRMSU5FCisJICAgICAqICAgICAgIEEgICAgICBCICAgICAgQyAgICAgIEQKKwkgICAgICovCisJeworCQl7UElSUUEsIFBJUlFCLCAgUElSUUMsICBQSVJRRH0sIC8qIGlkc2VsIDB4MTEgKi8KKwkJe1BJUlFDLCBQSVJRRCwgIFBJUlFBLCAgUElSUUJ9LCAvKiBpZHNlbCAweDEyICovCisJCXtQSVJRRCwgUElSUUEsICBQSVJRQiwgIFBJUlFDfSAgLyogaWRzZWwgMHgxMyAqLworCX07CisKKwljb25zdCBsb25nIG1pbl9pZHNlbCA9IDB4MTEsIG1heF9pZHNlbCA9IDB4MTMsIGlycXNfcGVyX3Nsb3QgPSA0OworCXJldHVybiBQQ0lfSVJRX1RBQkxFX0xPT0tVUDsKK30KKworaW50CittcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKK3sKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04OCw3ICsxMDgsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogCS8qIHNldHVwIFBDSSBob3N0IGJyaWRnZXMgKi8KLQltcGM4M3h4X3N5c19zZXR1cF9ob3NlKCk7CisJbXBjODN4eF9zZXR1cF9ob3NlKCk7CiAjZW5kaWYKIAltcGM4M3h4X2Vhcmx5X3NlcmlhbF9tYXAoKTsKIApAQCAtMTc1LDEwICsxOTUsMTcgQEAKIAkJSVJRX1NFTlNFX0xFVkVMLAkvKiBFWFQgMSAqLwogCQlJUlFfU0VOU0VfTEVWRUwsCS8qIEVYVCAyICovCiAJCTAsCQkJLyogRVhUIDMgKi8KKyNpZmRlZiBDT05GSUdfUENJCisJCUlSUV9TRU5TRV9MRVZFTCwJLyogRVhUIDQgKi8KKwkJSVJRX1NFTlNFX0xFVkVMLAkvKiBFWFQgNSAqLworCQlJUlFfU0VOU0VfTEVWRUwsCS8qIEVYVCA2ICovCisJCUlSUV9TRU5TRV9MRVZFTCwJLyogRVhUIDcgKi8KKyNlbHNlCiAJCTAsCQkJLyogRVhUIDQgKi8KIAkJMCwJCQkvKiBFWFQgNSAqLwogCQkwLAkJCS8qIEVYVCA2ICovCiAJCTAsCQkJLyogRVhUIDcgKi8KKyNlbmRpZgogCX07CiAKIAlpcGljX2luaXQoYmluZm8tPmJpX2ltbXJfYmFzZSArIDB4MDA3MDAsIDAsIE1QQzgzeHhfSVBJQ19JUlFfT0ZGU0VULCBzZW5zZXMsIDgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuaCBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmgKaW5kZXggYTJmNmU0OS4uMTU4NGNkNyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuaAorKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5oCkBAIC0yNiw3ICsyNiw3IEBACiAjZGVmaW5lIFZJUlRfSU1NUkJBUgkJKCh1aW50KTB4ZmUwMDAwMDApCiAKICNkZWZpbmUgQkNTUl9QSFlTX0FERFIJCSgodWludCkweGY4MDAwMDAwKQotI2RlZmluZSBCQ1NSX1NJWkUJCSgodWludCkoMzIgKiAxMDI0KSkKKyNkZWZpbmUgQkNTUl9TSVpFCQkoKHVpbnQpKDEyOCAqIDEwMjQpKQogCiAjZGVmaW5lIEJDU1JfTUlTQ19SRUcyX09GRgkweDA3CiAjZGVmaW5lIEJDU1JfTUlTQ19SRUcyX1BPUkVTRVQJMHgwMQpAQCAtMzQsMjMgKzM0LDI1IEBACiAjZGVmaW5lIEJDU1JfTUlTQ19SRUczX09GRgkweDA4CiAjZGVmaW5lIEJDU1JfTUlTQ19SRUczX0NORkxPQ0sJMHg4MAogCi0jaWZkZWYgQ09ORklHX1BDSQotLyogUENJIGludGVycnVwdCBjb250cm9sbGVyICovCi0jZGVmaW5lIFBJUlFBICAgICAgICBNUEM4M3h4X0lSUV9JUlE0Ci0jZGVmaW5lIFBJUlFCICAgICAgICBNUEM4M3h4X0lSUV9JUlE1Ci0jZGVmaW5lIFBJUlFDICAgICAgICBNUEM4M3h4X0lSUV9JUlE2Ci0jZGVmaW5lIFBJUlFEICAgICAgICBNUEM4M3h4X0lSUV9JUlE3CisjZGVmaW5lIFBJUlFBCU1QQzgzeHhfSVJRX0VYVDQKKyNkZWZpbmUgUElSUUIJTVBDODN4eF9JUlFfRVhUNQorI2RlZmluZSBQSVJRQwlNUEM4M3h4X0lSUV9FWFQ2CisjZGVmaW5lIFBJUlFECU1QQzgzeHhfSVJRX0VYVDcKIAotI2RlZmluZSBNUEM4MzR4X1NZU19QQ0kxX0xPV0VSX0lPICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIE1QQzgzNHhfU1lTX1BDSTFfVVBQRVJfSU8gICAgICAgIDB4MDBmZmZmZmYKKyNkZWZpbmUgTVBDODN4eF9QQ0kxX0xPV0VSX0lPCTB4MDAwMDAwMDAKKyNkZWZpbmUgTVBDODN4eF9QQ0kxX1VQUEVSX0lPCTB4MDBmZmZmZmYKKyNkZWZpbmUgTVBDODN4eF9QQ0kxX0xPV0VSX01FTQkweDgwMDAwMDAwCisjZGVmaW5lIE1QQzgzeHhfUENJMV9VUFBFUl9NRU0JMHg5ZmZmZmZmZgorI2RlZmluZSBNUEM4M3h4X1BDSTFfSU9fQkFTRQkweGUyMDAwMDAwCisjZGVmaW5lIE1QQzgzeHhfUENJMV9NRU1fT0ZGU0VUCTB4MDAwMDAwMDAKKyNkZWZpbmUgTVBDODN4eF9QQ0kxX0lPX1NJWkUJMHgwMTAwMDAwMAogCi0jZGVmaW5lIE1QQzgzNHhfU1lTX1BDSTFfTE9XRVJfTUVNICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgTVBDODM0eF9TWVNfUENJMV9VUFBFUl9NRU0gICAgICAgMHg5ZmZmZmZmZgotCi0jZGVmaW5lIE1QQzgzNHhfU1lTX1BDSTFfSU9fQkFTRSAgICAgICAgIDB4ZTIwMDAwMDAKLSNkZWZpbmUgTVBDODM0eF9TWVNfUENJMV9NRU1fT0ZGU0VUICAgICAgMHgwMDAwMDAwMAotCi0jZGVmaW5lIE1QQzgzNHhfU1lTX1BDSTFfSU9fU0laRSAgICAgICAgIDB4MDEwMDAwMDAKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCisjZGVmaW5lIE1QQzgzeHhfUENJMl9MT1dFUl9JTwkweDAwMDAwMDAwCisjZGVmaW5lIE1QQzgzeHhfUENJMl9VUFBFUl9JTwkweDAwZmZmZmZmCisjZGVmaW5lIE1QQzgzeHhfUENJMl9MT1dFUl9NRU0JMHhhMDAwMDAwMAorI2RlZmluZSBNUEM4M3h4X1BDSTJfVVBQRVJfTUVNCTB4YmZmZmZmZmYKKyNkZWZpbmUgTVBDODN4eF9QQ0kyX0lPX0JBU0UJMHhlMzAwMDAwMAorI2RlZmluZSBNUEM4M3h4X1BDSTJfTUVNX09GRlNFVAkweDAwMDAwMDAwCisjZGVmaW5lIE1QQzgzeHhfUENJMl9JT19TSVpFCTB4MDEwMDAwMDAKIAogI2VuZGlmICAgICAgICAgICAgICAgIC8qIF9fTUFDSF9NUEM4M1hYX1NZU19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9NYWtlZmlsZSBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9NYWtlZmlsZQppbmRleCA1NDg4YTA1Li5mZjc0NTJlIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL01ha2VmaWxlCkBAIC0yMSwyMiArMjEsMTcgQEAKIGVuZGlmCiBvYmotJChDT05GSUdfUE1BQ19CQUNLTElHSFQpCSs9IHBtYWNfYmFja2xpZ2h0Lm8KIG9iai0kKENPTkZJR19QUkVQX1JFU0lEVUFMKQkrPSByZXNpZHVhbC5vCi1vYmotJChDT05GSUdfQURJUikJCSs9IGFkaXJfc2V0dXAubyBhZGlyX3BpYy5vIGFkaXJfcGNpLm8KIG9iai0kKENPTkZJR19QUTJBRFMpCQkrPSBwcTJhZHMubwogb2JqLSQoQ09ORklHX1RRTTgyNjApCQkrPSB0cW04MjYwX3NldHVwLm8KIG9iai0kKENPTkZJR19DUENJNjkwKQkJKz0gY3BjaTY5MC5vCiBvYmotJChDT05GSUdfRVY2NDI2MCkJCSs9IGV2NjQyNjAubwogb2JqLSQoQ09ORklHX0NIRVNUTlVUKQkJKz0gY2hlc3RudXQubwogb2JqLSQoQ09ORklHX0dFTUlOSSkJCSs9IGdlbWluaV9wY2kubyBnZW1pbmlfc2V0dXAubyBnZW1pbmlfcHJvbS5vCi1vYmotJChDT05GSUdfSzIpCQkrPSBrMi5vCiBvYmotJChDT05GSUdfTE9QRUMpCQkrPSBsb3BlYy5vCiBvYmotJChDT05GSUdfS0FUQU5BKQkJKz0ga2F0YW5hLm8KIG9iai0kKENPTkZJR19IRFBVKQkJKz0gaGRwdS5vCi1vYmotJChDT05GSUdfTUNQTjc2NSkJCSs9IG1jcG43NjUubwotb2JqLSQoQ09ORklHX01FTkYxKQkJKz0gbWVuZjFfc2V0dXAubyBtZW5mMV9wY2kubwogb2JqLSQoQ09ORklHX01WTUU1MTAwKQkJKz0gbXZtZTUxMDAubwogb2JqLSQoQ09ORklHX1BBTDQpCQkrPSBwYWw0X3NldHVwLm8gcGFsNF9wY2kubwotb2JqLSQoQ09ORklHX1BDT1JFKQkJKz0gcGNvcmUubwogb2JqLSQoQ09ORklHX1BPV0VSUE1DMjUwKQkrPSBwb3dlcnBtYzI1MC5vCiBvYmotJChDT05GSUdfUFBMVVMpCQkrPSBwcGx1cy5vCiBvYmotJChDT05GSUdfUFJQTUM3NTApCQkrPSBwcnBtYzc1MC5vCkBAIC00Niw2ICs0MSw3IEBACiBvYmotJChDT05GSUdfU0JDODJ4eCkJCSs9IHNiYzgyeHgubwogb2JqLSQoQ09ORklHX1NQUlVDRSkJCSs9IHNwcnVjZS5vCiBvYmotJChDT05GSUdfTElURTUyMDApCQkrPSBsaXRlNTIwMC5vCitvYmotJChDT05GSUdfRVY2NDM2MCkJCSs9IGV2NjQzNjAubwogCiBpZmVxICgkKENPTkZJR19TTVApLHkpCiBvYmotJChDT05GSUdfUFBDX1BNQUMpCQkrPSBwbWFjX3NtcC5vCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvYWRpci5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2FkaXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhNzQ4Yi4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvYWRpci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIGFyY2gvcHBjL3BsYXRmb3Jtcy9hZGlyLmgKLSAqCi0gKiBEZWZpbml0aW9ucyBmb3IgU0JTIEFkaXJvbmRhY2sgYm9hcmQgc3VwcG9ydAotICoKLSAqIEJ5IE1pY2hhZWwgU29rb2xvdiA8bXNva29sb3ZAaXZhbi5IYXJoYW4uT1JHPgotICovCi0KLSNpZm5kZWYgX19QUENfUExBVEZPUk1TX0FESVJfSAotI2RlZmluZSBfX1BQQ19QTEFURk9STVNfQURJUl9ICi0KLS8qCi0gKiBTQlMgQWRpcm9uZGFjayBkZWZpbml0aW9ucwotICovCi0KLS8qIFBQQyBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIGxheW91dC4gV2UgdXNlIHRoZSBvbmUgc2V0IHVwIGJ5IHRoZSBmaXJtd2FyZS4gKi8KLSNkZWZpbmUJQURJUl9QQ0kzMl9NRU1fQkFTRQkweDgwMDAwMDAwCi0jZGVmaW5lCUFESVJfUENJMzJfTUVNX1NJWkUJMHgyMDAwMDAwMAotI2RlZmluZQlBRElSX1BDSTY0X01FTV9CQVNFCTB4QTAwMDAwMDAKLSNkZWZpbmUJQURJUl9QQ0k2NF9NRU1fU0laRQkweDIwMDAwMDAwCi0jZGVmaW5lCUFESVJfUENJMzJfSU9fQkFTRQkweEMwMDAwMDAwCi0jZGVmaW5lCUFESVJfUENJMzJfSU9fU0laRQkweDEwMDAwMDAwCi0jZGVmaW5lCUFESVJfUENJNjRfSU9fQkFTRQkweEQwMDAwMDAwCi0jZGVmaW5lCUFESVJfUENJNjRfSU9fU0laRQkweDEwMDAwMDAwCi0jZGVmaW5lCUFESVJfUENJNjRfUEhCCQkweEZGNDAwMDAwCi0jZGVmaW5lCUFESVJfUENJMzJfUEhCCQkweEZGNTAwMDAwCi0KLSNkZWZpbmUgQURJUl9QQ0k2NF9DT05GSUdfQUREUgkoQURJUl9QQ0k2NF9QSEIgKyAweDAwMGY4MDAwKQotI2RlZmluZSBBRElSX1BDSTY0X0NPTkZJR19EQVRBCShBRElSX1BDSTY0X1BIQiArIDB4MDAwZjgwMTApCi0KLSNkZWZpbmUgQURJUl9QQ0kzMl9DT05GSUdfQUREUgkoQURJUl9QQ0kzMl9QSEIgKyAweDAwMGY4MDAwKQotI2RlZmluZSBBRElSX1BDSTMyX0NPTkZJR19EQVRBCShBRElSX1BDSTMyX1BIQiArIDB4MDAwZjgwMTApCi0KLS8qIFN5c3RlbSBtZW1vcnkgYXMgc2VlbiBmcm9tIFBDSSAqLwotI2RlZmluZSBBRElSX1BDSV9TWVNfTUVNX0JBU0UJMHg4MDAwMDAwMAotCi0vKiBTdGF0aWMgdmlydHVhbCBtYXBwaW5nIG9mIFBDSSBJL08gKi8KLSNkZWZpbmUJQURJUl9QQ0kzMl9WSVJUX0lPX0JBU0UJMHhGRTAwMDAwMAotI2RlZmluZQlBRElSX1BDSTMyX1ZJUlRfSU9fU0laRQkweDAxMDAwMDAwCi0jZGVmaW5lCUFESVJfUENJNjRfVklSVF9JT19CQVNFCTB4RkYwMDAwMDAKLSNkZWZpbmUJQURJUl9QQ0k2NF9WSVJUX0lPX1NJWkUJMHgwMTAwMDAwMAotCi0vKiBSZWdpc3RlcnMgKi8KLSNkZWZpbmUJQURJUl9OVlJBTV9SVENfQUREUgkweDc0Ci0jZGVmaW5lCUFESVJfTlZSQU1fUlRDX0RBVEEJMHg3NQotCi0jZGVmaW5lCUFESVJfQk9BUkRfSURfUkVHCShBRElSX1BDSTMyX1ZJUlRfSU9fQkFTRSArIDB4MDhGRkYwKQotI2RlZmluZQlBRElSX0NQTEQxUkVWX1JFRwkoQURJUl9QQ0kzMl9WSVJUX0lPX0JBU0UgKyAweDA4RkZGMSkKLSNkZWZpbmUJQURJUl9DUExEMlJFVl9SRUcJKEFESVJfUENJMzJfVklSVF9JT19CQVNFICsgMHgwOEZGRjIpCi0jZGVmaW5lCUFESVJfRkxBU0hDVExfUkVHCShBRElSX1BDSTMyX1ZJUlRfSU9fQkFTRSArIDB4MDhGRkYzKQotI2RlZmluZQlBRElSX0NQQzcxMF9TVEFUX1JFRwkoQURJUl9QQ0kzMl9WSVJUX0lPX0JBU0UgKyAweDA4RkZGNCkKLSNkZWZpbmUJQURJUl9DTE9DS19SRUcJCShBRElSX1BDSTMyX1ZJUlRfSU9fQkFTRSArIDB4MDhGRkY1KQotI2RlZmluZQlBRElSX0dQSU9fUkVHCQkoQURJUl9QQ0kzMl9WSVJUX0lPX0JBU0UgKyAweDA4RkZGOCkKLSNkZWZpbmUJQURJUl9NSVNDX1JFRwkJKEFESVJfUENJMzJfVklSVF9JT19CQVNFICsgMHgwOEZGRjkpCi0jZGVmaW5lCUFESVJfTEVEX1JFRwkJKEFESVJfUENJMzJfVklSVF9JT19CQVNFICsgMHgwOEZGRkEpCi0KLSNkZWZpbmUJQURJUl9DTE9DS19SRUdfUEQJMHgxMAotI2RlZmluZQlBRElSX0NMT0NLX1JFR19TUFJFQUQJMHgwOAotI2RlZmluZQlBRElSX0NMT0NLX1JFR19TRUwxMzMJMHgwNAotI2RlZmluZQlBRElSX0NMT0NLX1JFR19TRUwxCTB4MDIKLSNkZWZpbmUJQURJUl9DTE9DS19SRUdfU0VMMAkweDAxCi0KLSNkZWZpbmUJQURJUl9QUk9DQV9JTlRfTUFTSwkoQURJUl9QQ0kzMl9WSVJUX0lPX0JBU0UgKyAweDBFRkZGMCkKLSNkZWZpbmUJQURJUl9QUk9DQl9JTlRfTUFTSwkoQURJUl9QQ0kzMl9WSVJUX0lPX0JBU0UgKyAweDBFRkZGMikKLSNkZWZpbmUJQURJUl9QUk9DQV9JTlRfU1RBVAkoQURJUl9QQ0kzMl9WSVJUX0lPX0JBU0UgKyAweDBFRkZGNCkKLSNkZWZpbmUJQURJUl9QUk9DQl9JTlRfU1RBVAkoQURJUl9QQ0kzMl9WSVJUX0lPX0JBU0UgKyAweDBFRkZGNikKLQotLyogTGludXggSVJRIG51bWJlcnMgKi8KLSNkZWZpbmUJQURJUl9JUlFfTk9ORQkJLTEKLSNkZWZpbmUJQURJUl9JUlFfU0VSSUFMMgkzCi0jZGVmaW5lCUFESVJfSVJRX1NFUklBTDEJNAotI2RlZmluZQlBRElSX0lSUV9GREMJCTYKLSNkZWZpbmUJQURJUl9JUlFfUEFSQUxMRUwJNwotI2RlZmluZQlBRElSX0lSUV9WSUFfQVVESU8JMTAKLSNkZWZpbmUJQURJUl9JUlFfVklBX1VTQgkxMQotI2RlZmluZQlBRElSX0lSUV9JREUwCQkxNAotI2RlZmluZQlBRElSX0lSUV9JREUxCQkxNQotI2RlZmluZQlBRElSX0lSUV9QQ0kwX0lOVEEJMTYKLSNkZWZpbmUJQURJUl9JUlFfUENJMF9JTlRCCTE3Ci0jZGVmaW5lCUFESVJfSVJRX1BDSTBfSU5UQwkxOAotI2RlZmluZQlBRElSX0lSUV9QQ0kwX0lOVEQJMTkKLSNkZWZpbmUJQURJUl9JUlFfUENJMV9JTlRBCTIwCi0jZGVmaW5lCUFESVJfSVJRX1BDSTFfSU5UQgkyMQotI2RlZmluZQlBRElSX0lSUV9QQ0kxX0lOVEMJMjIKLSNkZWZpbmUJQURJUl9JUlFfUENJMV9JTlRECTIzCi0jZGVmaW5lCUFESVJfSVJRX01CU0NTSQkJMjQJLyogbW90aGVyYm9hcmQgU0NTSSAqLwotI2RlZmluZQlBRElSX0lSUV9NQkVUSDEJCTI1CS8qIG1vdGhlcmJvYXJkIEV0aGVybmV0IDEgKi8KLSNkZWZpbmUJQURJUl9JUlFfTUJFVEgwCQkyNgkvKiBtb3RoZXJib2FyZCBFdGhlcm5ldCAwICovCi0jZGVmaW5lCUFESVJfSVJRX0NQQzcxMF9JTlQxCTI3Ci0jZGVmaW5lCUFESVJfSVJRX0NQQzcxMF9JTlQyCTI4Ci0jZGVmaW5lCUFESVJfSVJRX1ZUODJDNjg2X05NSQkyOQotI2RlZmluZQlBRElSX0lSUV9WVDgyQzY4Nl9JTlRSCTMwCi0jZGVmaW5lCUFESVJfSVJRX0lOVEVSUFJPQwkzMQotCi0jZW5kaWYgLyogX19QUENfUExBVEZPUk1TX0FESVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL2FkaXJfcGNpLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvYWRpcl9wY2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0YWM1My4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvYWRpcl9wY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKgotICogYXJjaC9wcGMvcGxhdGZvcm1zL2FkaXJfcGNpLmMKLSAqCi0gKiBQQ0kgc3VwcG9ydCBmb3IgU0JTIEFkaXJvbmRhY2sKLSAqCi0gKiBCeSBNaWNoYWVsIFNva29sb3YgPG1zb2tvbG92QGl2YW4uSGFyaGFuLk9SRz4KLSAqIGJhc2VkIG9uIHRoZSBLMiB2ZXJzaW9uIGJ5IE1hdHQgUG9ydGVyIDxtcG9ydGVyQG12aXN0YS5jb20+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0KLSNpbmNsdWRlIDxzeXNsaWIvY3BjNzEwLmg+Ci0jaW5jbHVkZSAiYWRpci5oIgotCi0jdW5kZWYgREVCVUcKLSNpZmRlZiBERUJVRwotI2RlZmluZSBEQkcoeC4uLikgcHJpbnRrKHgpCi0jZWxzZQotI2RlZmluZSBEQkcoeC4uLikKLSNlbmRpZiAvKiBERUJVRyAqLwotCi1zdGF0aWMgaW5saW5lIGludCBfX2luaXQKLWFkaXJfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyIGlkc2VsLCB1bnNpZ25lZCBjaGFyIHBpbikKLXsKLSNkZWZpbmUJUENJSVJRKGEsYixjLGQpCXtBRElSX0lSUV8jI2EsQURJUl9JUlFfIyNiLEFESVJfSVJRXyMjYyxBRElSX0lSUV8jI2R9LAotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zZShkZXYtPmJ1cy0+bnVtYmVyKTsKLQkvKgotCSAqIFRoZSB0aHJlZSBQQ0kgZGV2aWNlcyBvbiB0aGUgbW90aGVyYm9hcmQgaGF2ZSBkZWRpY2F0ZWQgbGluZXMgdG8gdGhlCi0JICogQ1BMRCBpbnRlcnJ1cHQgY29udHJvbGxlciwgYnlwYXNzaW5nIHRoZSBzdGFuZGFyZCBQQ0kgSU5UQS1EIGFuZCB0aGUKLQkgKiBQQyBpbnRlcnJ1cHQgY29udHJvbGxlci4gQWxsIG90aGVyIFBDSSBkZXZpY2VzIChzbG90cykgaGF2ZSB1c3VhbAotCSAqIHN0YWdnZXJlZCBJTlRBLUQgbGluZXMsIHJlc3VsdGluZyBpbiA4IGxpbmVzIHRvdGFsIChQQ0kwIElOVEEtRCBhbmQKLQkgKiBQQ0kxIElOVEEtRCkuIEFsbCA4IGdvIHRvIHRoZSBDUExEIGludGVycnVwdCBjb250cm9sbGVyLiBQQ0kwIElOVEEtRAotCSAqIGFsc28gZ28gdG8gdGhlIHNvdXRoIGJyaWRnZSwgc28gd2UgaGF2ZSB0aGUgb3B0aW9uIG9mIHRha2luZyB0aGVtCi0JICogdmlhIHRoZSBDUExEIGludGVycnVwdCBjb250cm9sbGVyIG9yIHZpYSB0aGUgc291dGggYnJpZGdlIDgyNTkKLQkgKiA4MjU4IHRoaW5neS4gUENJMSBJTlRBLUQgY2FuIG9ubHkgYmUgdGFrZW4gdmlhIHRoZSBDUExEIGludGVycnVwdAotCSAqIGNvbnRyb2xsZXIuIFdlIHRha2UgYWxsIFBDSSBpbnRlcnJ1cHRzIHZpYSB0aGUgQ1BMRCBpbnRlcnJ1cHQKLQkgKiBjb250cm9sbGVyIGFzIHJlY29tbWVuZGVkIGJ5IFNCUy4KLQkgKgotCSAqIFdlIGFsc28gaGF2ZSBzb21lIG1vbmtleSBidXNpbmVzcyB3aXRoIHRoZSBQQ0kgZGV2aWNlcyB3aXRoaW4gdGhlCi0JICogVlQ4MkM2ODZCIHNvdXRoIGJyaWRnZSBpdHNlbGYuIFRoaXMgY2hpcCBhY3R1YWxseSBoYXMgNyBmdW5jdGlvbnMgb24KLQkgKiBpdHMgSURTRUwuIEZ1bmN0aW9uIDAgaXMgdGhlIGFjdHVhbCBzb3V0aCBicmlkZ2UsIGZ1bmN0aW9uIDEgaXMgSURFLAotCSAqIGFuZCBmdW5jdGlvbiA0IGlzIHNvbWUgc3BlY2lhbCBzdHVmZi4gVGhlIG90aGVyIDQgZnVuY3Rpb25zIGFyZSBqdXN0Ci0JICogcmVndWxhciBQQ0kgZGV2aWNlcyBidW5kbGVkIGluIHRoZSBjaGlwLiAyIGFuZCAzIGFyZSBVU0IgVUhDSXMgYW5kIDUKLQkgKiBhbmQgNiBhcmUgYXVkaW8gKG5vdCBzdXBwb3J0ZWQgb24gdGhlIEFkaXJvbmRhY2spLgotCSAqCi0JICogVGhpcyBpcyB3aGVyZSB0aGUgbW9ua2V5IGJ1c2luZXNzIGJlZ2lucy4gUENJIGRldmljZXMgYXJlIHN1cHBvc2VkCi0JICogdG8gc2lnbmFsIG5vcm1hbCBQQ0kgaW50ZXJydXB0cy4gQnV0IHRoZSA0IGZ1bmN0aW9ucyBpbiBxdWVzdGlvbiBhcmUKLQkgKiBsb2NhdGVkIGluIHRoZSBzb3V0aCBicmlkZ2UgY2hpcCwgd2hpY2ggaXMgZGVzaWduZWQgd2l0aCB0aGUKLQkgKiBhc3N1bXB0aW9uIHRoYXQgaXQgd2lsbCBiZSBmaWVsZGluZyBQQ0kgSU5UQS1EIGludGVycnVwdHMgcmF0aGVyCi0JICogdGhhbiBnZW5lcmF0aW5nIHRoZW0uIEhlcmUncyB3aGF0IGl0IGRvZXMuIEVhY2ggb2YgdGhlIGZ1bmN0aW9ucyBpbgotCSAqIHF1ZXN0aW9uIHJvdXRlcyBpdHMgaW50ZXJydXB0IHRvIG9uZSBvZiB0aGUgSVJRcyBvbiB0aGUgODI1OSB0aGluZ3kuCi0JICogV2hpY2ggb25lPyBJdCBsb29rcyBhdCB0aGUgSW50ZXJydXB0IExpbmUgcmVnaXN0ZXIgaW4gdGhlIFBDSSBjb25maWcKLQkgKiBzcGFjZSwgZXZlbiB0aG91Z2ggdGhlIFBDSSBzcGVjIHNheXMgaXQncyBmb3IgQklPUy9PUyBpbnRlcmFjdGlvbgotCSAqIG9ubHkuCi0JICoKLQkgKiBIb3cgZG8gd2UgZGVhbCB3aXRoIHRoaXM/IFdlIHRha2UgdGhlc2UgaW50ZXJydXB0cyB2aWEgODI1OSBJUlFzIGFzCi0JICogd2UgaGF2ZSB0by4gV2UgcmV0dXJuIHRoZSBkZXNpcmVkIElSUSBudW1iZXJzIGZyb20gdGhpcyByb3V0aW5lIHdoZW4KLQkgKiBjYWxsZWQgZm9yIHRoZSBmdW5jdGlvbnMgaW4gcXVlc3Rpb24uIFRoZSBQQ0kgc2NhbiBjb2RlIHdpbGwgdGhlbgotCSAqIHN0aWNrIG91ciByZXR1cm4gdmFsdWUgaW50byB0aGUgSW50ZXJydXB0IExpbmUgcmVnaXN0ZXIgaW4gdGhlIFBDSQotCSAqIGNvbmZpZyBzcGFjZSwgYW5kIHRoZSBpbnRlcnJ1cHQgd2lsbCBhY3R1YWxseSBnbyB0aGVyZS4gV2UgaWRlbnRpZnkKLQkgKiB0aGVzZSBmdW5jdGlvbnMgd2l0aGluIHRoZSBzb3V0aCBicmlkZ2UgSURTRUwgYnkgdGhlaXIgaW50ZXJydXB0IHBpbgotCSAqIG51bWJlcnMsIGFzIHRoZSBWVDgyQzY4NkIgaGFzIDA0IGluIHRoZSBJbnRlcnJ1cHQgUGluIHJlZ2lzdGVyIGZvcgotCSAqIFVTQiBhbmQgMDMgZm9yIGF1ZGlvLgotCSAqLwotCWlmICghaG9zZS0+aW5kZXgpIHsKLQkJc3RhdGljIGNoYXIgcGNpX2lycV90YWJsZVtdWzRdID0KLQkJLyoKLQkJICogICAgICAgICAgICAgUENJIElEU0VML0lOVFBJTi0+SU5UTElORQotCQkgKiAgICAgICAgICAgICBBICAgICAgICAgIEIgICAgICAgICAgQyAgICAgICAgICBECi0JCSAqLwotCQl7Ci0gICAgLyogc291dGggYnJpZGdlICovCVBDSUlSUShJREUwLCAgICAgIE5PTkUsICAgICAgVklBX0FVRElPLCBWSUFfVVNCKQotICAgIC8qIEV0aGVybmV0IDAgKi8JUENJSVJRKE1CRVRIMCwgICAgTUJFVEgwLCAgICBNQkVUSDAsICAgIE1CRVRIMCkKLSAgICAvKiBQQ0kwIHNsb3QgMSAqLwlQQ0lJUlEoUENJMF9JTlRCLCBQQ0kwX0lOVEMsIFBDSTBfSU5URCwgUENJMF9JTlRBKQotICAgIC8qIFBDSTAgc2xvdCAyICovCVBDSUlSUShQQ0kwX0lOVEMsIFBDSTBfSU5URCwgUENJMF9JTlRBLCBQQ0kwX0lOVEIpCi0gICAgLyogUENJMCBzbG90IDMgKi8JUENJSVJRKFBDSTBfSU5URCwgUENJMF9JTlRBLCBQQ0kwX0lOVEIsIFBDSTBfSU5UQykKLQkJfTsKLQkJY29uc3QgbG9uZyBtaW5faWRzZWwgPSAzLCBtYXhfaWRzZWwgPSA3LCBpcnFzX3Blcl9zbG90ID0gNDsKLQkJcmV0dXJuIFBDSV9JUlFfVEFCTEVfTE9PS1VQOwotCX0gZWxzZSB7Ci0JCXN0YXRpYyBjaGFyIHBjaV9pcnFfdGFibGVbXVs0XSA9Ci0JCS8qCi0JCSAqICAgICAgICAgICAgIFBDSSBJRFNFTC9JTlRQSU4tPklOVExJTkUKLQkJICogICAgICAgICAgICAgQSAgICAgICAgICBCICAgICAgICAgIEMgICAgICAgICAgRAotCQkgKi8KLQkJewotICAgIC8qIEV0aGVybmV0IDEgKi8JUENJSVJRKE1CRVRIMSwgICAgTUJFVEgxLCAgICBNQkVUSDEsICAgIE1CRVRIMSkKLSAgICAvKiBTQ1NJICovCQlQQ0lJUlEoTUJTQ1NJLCAgICBNQlNDU0ksICAgIE1CU0NTSSwgICAgTUJTQ1NJKQotICAgIC8qIFBDSTEgc2xvdCAxICovCVBDSUlSUShQQ0kxX0lOVEIsIFBDSTFfSU5UQywgUENJMV9JTlRELCBQQ0kxX0lOVEEpCi0gICAgLyogUENJMSBzbG90IDIgKi8JUENJSVJRKFBDSTFfSU5UQywgUENJMV9JTlRELCBQQ0kxX0lOVEEsIFBDSTFfSU5UQikKLSAgICAvKiBQQ0kxIHNsb3QgMyAqLwlQQ0lJUlEoUENJMV9JTlRELCBQQ0kxX0lOVEEsIFBDSTFfSU5UQiwgUENJMV9JTlRDKQotCQl9OwotCQljb25zdCBsb25nIG1pbl9pZHNlbCA9IDMsIG1heF9pZHNlbCA9IDcsIGlycXNfcGVyX3Nsb3QgPSA0OwotCQlyZXR1cm4gUENJX0lSUV9UQUJMRV9MT09LVVA7Ci0JfQotI3VuZGVmIFBDSUlSUQotfQotCi1zdGF0aWMgdm9pZAotYWRpcl9wY2liaW9zX2ZpeHVwX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCWludCBpOwotCi0JaWYgKChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lCTSkgJiYKLQkJCShkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lCTV9DUEM3MTBfUENJNjQpKQotCXsKLQkJREJHKCJGaXh1cCBDUEM3MTAgcmVzb3VyY2VzXG4iKTsKLQkJZm9yIChpPTA7IGk8REVWSUNFX0NPVU5UX1JFU09VUkNFOyBpKyspCi0JCXsKLQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPSAwOwotCQkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgPSAwOwotCQl9Ci0JfQotfQotCi0vKgotICogQ1BDNzEwIEREMyBoYXMgYW4gZXJyYXRhIGNhdXNpbmcgaXQgdG8gaGFuZyB0aGUgc3lzdGVtIGlmIGEgdHlwZSAwIGNvbmZpZwotICogY3ljbGUgaXMgYXR0ZW1wdGVkIG9uIGl0cyBQQ0kzMiBpbnRlcmZhY2Ugd2l0aCBhIGRldmljZSBudW1iZXIgPiAyMS4KLSAqIENQQzcxMCdzIFBDSSBicmlkZ2VzIG1hcCBkZXZpY2UgbnVtYmVycyAxIHRocm91Z2ggMjEgdG8gQUQxMSB0aHJvdWdoIEFEMzEuCi0gKiBQZXIgdGhlIFBDSSBzcGVjIGl0IE1VU1QgYWNjZXB0IGFsbCBvdGhlciBkZXZpY2UgbnVtYmVycyBhbmQgZG8gbm90aGluZywgYW5kCi0gKiBzb2Z0d2FyZSBNVVNUIHNjYW4gYWxsIGRldmljZSBudW1iZXJzIHdpdGhvdXQgYXNzdW1pbmcgaG93IElEU0VMcyBhcmUKLSAqIG1hcHBlZC4gSG93ZXZlciwgYXMgdGhlIENQQzcxMCBERDMncyBlcnJhdGEgY2F1c2VzIHN1Y2ggY29ycmVjdCBzY2FubmluZwotICogcHJvY2VkdXJlIHRvIGhhbmcgdGhlIHN5c3RlbSwgd2UgaGF2ZSBubyBjaG9pY2UgYnV0IHRvIGludHJvZHVjZSB0aGlzIGhhY2sKLSAqIG9mIGtub3dpbmdseSBhdm9pZGluZyBkZXZpY2UgbnVtYmVycyA+IDIxIG9uIFBDSTAsCi0gKi8KLXN0YXRpYyBpbnQKLWFkaXJfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQotewotCWlmICgoYnVzID09IDApICYmIChQQ0lfU0xPVChkZXZmbikgPiAyMSkpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0JZWxzZQotCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi12b2lkIGFkaXJfZmluZF9icmlkZ2VzKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlX2EsICpob3NlX2I7Ci0KLQkvKiBTZXR1cCBQQ0kzMiBob3NlICovCi0JaG9zZV9hID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7Ci0JaWYgKCFob3NlX2EpCi0JCXJldHVybjsKLQotCWhvc2VfYS0+Zmlyc3RfYnVzbm8gPSAwOwotCWhvc2VfYS0+bGFzdF9idXNubyA9IDB4ZmY7Ci0JaG9zZV9hLT5wY2lfbWVtX29mZnNldCA9IEFESVJfUENJMzJfTUVNX0JBU0U7Ci0JaG9zZV9hLT5pb19zcGFjZS5zdGFydCA9IDA7Ci0JaG9zZV9hLT5pb19zcGFjZS5lbmQgPSBBRElSX1BDSTMyX1ZJUlRfSU9fU0laRSAtIDE7Ci0JaG9zZV9hLT5tZW1fc3BhY2Uuc3RhcnQgPSAwOwotCWhvc2VfYS0+bWVtX3NwYWNlLmVuZCA9IEFESVJfUENJMzJfTUVNX1NJWkUgLSAxOwotCWhvc2VfYS0+aW9fcmVzb3VyY2Uuc3RhcnQgPSAwOwotCWhvc2VfYS0+aW9fcmVzb3VyY2UuZW5kID0gQURJUl9QQ0kzMl9WSVJUX0lPX1NJWkUgLSAxOwotCWhvc2VfYS0+aW9fcmVzb3VyY2UuZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwotCWhvc2VfYS0+bWVtX3Jlc291cmNlc1swXS5zdGFydCA9IEFESVJfUENJMzJfTUVNX0JBU0U7Ci0JaG9zZV9hLT5tZW1fcmVzb3VyY2VzWzBdLmVuZCA9IEFESVJfUENJMzJfTUVNX0JBU0UgKwotCQkJCQlBRElSX1BDSTMyX01FTV9TSVpFIC0gMTsKLQlob3NlX2EtPm1lbV9yZXNvdXJjZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKLQlob3NlX2EtPmlvX2Jhc2VfcGh5cyA9IEFESVJfUENJMzJfSU9fQkFTRTsKLQlob3NlX2EtPmlvX2Jhc2VfdmlydCA9ICh2b2lkICopIEFESVJfUENJMzJfVklSVF9JT19CQVNFOwotCi0JcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IGFkaXJfZXhjbHVkZV9kZXZpY2U7Ci0Jc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2VfYSwgQURJUl9QQ0kzMl9DT05GSUdfQUREUiwKLQkJCSAgIEFESVJfUENJMzJfQ09ORklHX0RBVEEpOwotCi0JLyogSW5pdGlhbGl6ZSBQQ0kzMiBidXMgcmVnaXN0ZXJzICovCi0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9hLAotCQkJaG9zZV9hLT5maXJzdF9idXNubywKLQkJCVBDSV9ERVZGTigwLCAwKSwKLQkJCUNQQzcxMF9CVVNfTlVNQkVSLAotCQkJaG9zZV9hLT5maXJzdF9idXNubyk7Ci0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9hLAotCQkJaG9zZV9hLT5maXJzdF9idXNubywKLQkJCVBDSV9ERVZGTigwLCAwKSwKLQkJCUNQQzcxMF9TVUJfQlVTX05VTUJFUiwKLQkJCWhvc2VfYS0+bGFzdF9idXNubyk7Ci0KLQlob3NlX2EtPmxhc3RfYnVzbm8gPSBwY2lhdXRvX2J1c19zY2FuKGhvc2VfYSwgaG9zZV9hLT5maXJzdF9idXNubyk7Ci0KLQkvKiBXcml0ZSBvdXQgY29ycmVjdCBtYXggc3Vib3JkaW5hdGUgYnVzIG51bWJlciBmb3IgaG9zZSBBICovCi0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9hLAotCQkJaG9zZV9hLT5maXJzdF9idXNubywKLQkJCVBDSV9ERVZGTigwLCAwKSwKLQkJCUNQQzcxMF9TVUJfQlVTX05VTUJFUiwKLQkJCWhvc2VfYS0+bGFzdF9idXNubyk7Ci0KLQkvKiBTZXR1cCBQQ0k2NCBob3NlICovCi0JaG9zZV9iID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7Ci0JaWYgKCFob3NlX2IpCi0JCXJldHVybjsKLQotCWhvc2VfYi0+Zmlyc3RfYnVzbm8gPSBob3NlX2EtPmxhc3RfYnVzbm8gKyAxOwotCWhvc2VfYi0+bGFzdF9idXNubyA9IDB4ZmY7Ci0JaG9zZV9iLT5wY2lfbWVtX29mZnNldCA9IEFESVJfUENJNjRfTUVNX0JBU0U7Ci0JaG9zZV9iLT5pb19zcGFjZS5zdGFydCA9IDA7Ci0JaG9zZV9iLT5pb19zcGFjZS5lbmQgPSBBRElSX1BDSTY0X1ZJUlRfSU9fU0laRSAtIDE7Ci0JaG9zZV9iLT5tZW1fc3BhY2Uuc3RhcnQgPSAwOwotCWhvc2VfYi0+bWVtX3NwYWNlLmVuZCA9IEFESVJfUENJNjRfTUVNX1NJWkUgLSAxOwotCWhvc2VfYi0+aW9fcmVzb3VyY2Uuc3RhcnQgPSAwOwotCWhvc2VfYi0+aW9fcmVzb3VyY2UuZW5kID0gQURJUl9QQ0k2NF9WSVJUX0lPX1NJWkUgLSAxOwotCWhvc2VfYi0+aW9fcmVzb3VyY2UuZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwotCWhvc2VfYi0+bWVtX3Jlc291cmNlc1swXS5zdGFydCA9IEFESVJfUENJNjRfTUVNX0JBU0U7Ci0JaG9zZV9iLT5tZW1fcmVzb3VyY2VzWzBdLmVuZCA9IEFESVJfUENJNjRfTUVNX0JBU0UgKwotCQkJCQlBRElSX1BDSTY0X01FTV9TSVpFIC0gMTsKLQlob3NlX2ItPm1lbV9yZXNvdXJjZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKLQlob3NlX2ItPmlvX2Jhc2VfcGh5cyA9IEFESVJfUENJNjRfSU9fQkFTRTsKLQlob3NlX2ItPmlvX2Jhc2VfdmlydCA9ICh2b2lkICopIEFESVJfUENJNjRfVklSVF9JT19CQVNFOwotCi0Jc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2VfYiwgQURJUl9QQ0k2NF9DT05GSUdfQUREUiwKLQkJCSAgIEFESVJfUENJNjRfQ09ORklHX0RBVEEpOwotCi0JLyogSW5pdGlhbGl6ZSBQQ0k2NCBidXMgcmVnaXN0ZXJzICovCi0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9iLAotCQkJMCwKLQkJCVBDSV9ERVZGTigwLCAwKSwKLQkJCUNQQzcxMF9TVUJfQlVTX05VTUJFUiwKLQkJCTB4ZmYpOwotCi0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9iLAotCQkJMCwKLQkJCVBDSV9ERVZGTigwLCAwKSwKLQkJCUNQQzcxMF9CVVNfTlVNQkVSLAotCQkJaG9zZV9iLT5maXJzdF9idXNubyk7Ci0KLQlob3NlX2ItPmxhc3RfYnVzbm8gPSBwY2lhdXRvX2J1c19zY2FuKGhvc2VfYiwKLQkJCWhvc2VfYi0+Zmlyc3RfYnVzbm8pOwotCi0JLyogV3JpdGUgb3V0IGNvcnJlY3QgbWF4IHN1Ym9yZGluYXRlIGJ1cyBudW1iZXIgZm9yIGhvc2UgQiAqLwotCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2VfYiwKLQkJCWhvc2VfYi0+Zmlyc3RfYnVzbm8sCi0JCQlQQ0lfREVWRk4oMCwgMCksCi0JCQlDUEM3MTBfU1VCX0JVU19OVU1CRVIsCi0JCQlob3NlX2ItPmxhc3RfYnVzbm8pOwotCi0JcHBjX21kLnBjaWJpb3NfZml4dXAgPSBOVUxMOwotCXBwY19tZC5wY2liaW9zX2ZpeHVwX3Jlc291cmNlcyA9IGFkaXJfcGNpYmlvc19maXh1cF9yZXNvdXJjZXM7Ci0JcHBjX21kLnBjaV9zd2l6emxlID0gY29tbW9uX3N3aXp6bGU7Ci0JcHBjX21kLnBjaV9tYXBfaXJxID0gYWRpcl9tYXBfaXJxOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL2FkaXJfcGljLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvYWRpcl9waWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0N2NiYS4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvYWRpcl9waWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogYXJjaC9wcGMvcGxhdGZvcm1zL2FkaXJfcGljLmMKLSAqCi0gKiBJbnRlcnJ1cHQgY29udHJvbGxlciBzdXBwb3J0IGZvciBTQlMgQWRpcm9uZGFjawotICoKLSAqIEJ5IE1pY2hhZWwgU29rb2xvdiA8bXNva29sb3ZAaXZhbi5IYXJoYW4uT1JHPgotICogYmFzZWQgb24gdGhlIEsyIGFuZCBTQ00gdmVyc2lvbnMgYnkgTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAbXZpc3RhLmNvbT4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaTgyNTkuaD4KLSNpbmNsdWRlICJhZGlyLmgiCi0KLXN0YXRpYyB2b2lkIGFkaXJfb25ib2FyZF9waWNfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgYWRpcl9vbmJvYXJkX3BpY19kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpOwotCi1fX2luaXQgc3RhdGljIHZvaWQKLWFkaXJfb25ib2FyZF9waWNfaW5pdCh2b2lkKQotewotCXZvbGF0aWxlIHVfc2hvcnQgKm1hc2tyZWcgPSAodm9sYXRpbGUgdV9zaG9ydCAqKSBBRElSX1BST0NBX0lOVF9NQVNLOwotCi0JLyogRGlzYWJsZSBhbGwgQWRpcm9uZGFjayBvbmJvYXJkIGludGVycnVwdHMgKi8KLQlvdXRfYmUxNihtYXNrcmVnLCAweEZGRkYpOwotfQotCi1zdGF0aWMgaW50Ci1hZGlyX29uYm9hcmRfcGljX2dldF9pcnEodm9pZCkKLXsKLQl2b2xhdGlsZSB1X3Nob3J0ICpzdGF0cmVnID0gKHZvbGF0aWxlIHVfc2hvcnQgKikgQURJUl9QUk9DQV9JTlRfU1RBVDsKLQlpbnQgaXJxOwotCXVfc2hvcnQgaW50X3N0YXR1cywgaW50X3Rlc3Q7Ci0KLQlpbnRfc3RhdHVzID0gaW5fYmUxNihzdGF0cmVnKTsKLQlmb3IgKGlycSA9IDAsIGludF90ZXN0ID0gMTsgaXJxIDwgMTY7IGlycSsrLCBpbnRfdGVzdCA8PD0gMSkgewotCQlpZiAoaW50X3N0YXR1cyAmIGludF90ZXN0KQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGlycSA9PSAxNikKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIChpcnErMTYpOwotfQotCi1zdGF0aWMgdm9pZAotYWRpcl9vbmJvYXJkX3BpY19lbmFibGUodW5zaWduZWQgaW50IGlycSkKLXsKLQl2b2xhdGlsZSB1X3Nob3J0ICptYXNrcmVnID0gKHZvbGF0aWxlIHVfc2hvcnQgKikgQURJUl9QUk9DQV9JTlRfTUFTSzsKLQotCS8qIENoYW5nZSBpcnEgdG8gQWRpcm9uZGFjayBvbmJvYXJkIG5hdGl2ZSB2YWx1ZSAqLwotCWlycSAtPSAxNjsKLQotCS8qIEVuYWJsZSByZXF1ZXN0ZWQgaXJxIG51bWJlciAqLwotCW91dF9iZTE2KG1hc2tyZWcsIGluX2JlMTYobWFza3JlZykgJiB+KDEgPDwgaXJxKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGlyX29uYm9hcmRfcGljX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKLXsKLQl2b2xhdGlsZSB1X3Nob3J0ICptYXNrcmVnID0gKHZvbGF0aWxlIHVfc2hvcnQgKikgQURJUl9QUk9DQV9JTlRfTUFTSzsKLQotCS8qIENoYW5nZSBpcnEgdG8gQWRpcm9uZGFjayBvbmJvYXJkIG5hdGl2ZSB2YWx1ZSAqLwotCWlycSAtPSAxNjsKLQotCS8qIERpc2FibGUgcmVxdWVzdGVkIGlycSBudW1iZXIgKi8KLQlvdXRfYmUxNihtYXNrcmVnLCBpbl9iZTE2KG1hc2tyZWcpIHwgKDEgPDwgaXJxKSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgYWRpcl9vbmJvYXJkX3BpYyA9IHsKLQkiIEFESVIgUElDICIsCi0JTlVMTCwKLQlOVUxMLAotCWFkaXJfb25ib2FyZF9waWNfZW5hYmxlLAkJLyogdW5tYXNrICovCi0JYWRpcl9vbmJvYXJkX3BpY19kaXNhYmxlLAkJLyogbWFzayAqLwotCWFkaXJfb25ib2FyZF9waWNfZGlzYWJsZSwJCS8qIG1hc2sgYW5kIGFjayAqLwotCU5VTEwsCi0JTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbm9vcF9hY3Rpb24gPSB7Ci0JLmhhbmRsZXIJPSBub19hY3Rpb24sCi0JLmZsYWdzICAgICAgICAgID0gU0FfSU5URVJSVVBULAotCS5tYXNrICAgICAgICAgICA9IENQVV9NQVNLX05PTkUsCi0JLm5hbWUgICAgICAgICAgID0gIjgyYzU5IHByaW1hcnkgY2FzY2FkZSIsCi19OwotCi0vKgotICogTGludXggaW50ZXJydXB0IHZhbHVlcyBhcmUgYXNzaWduZWQgYXMgZm9sbG93czoKLSAqCi0gKiAJMC0xNQkJVlQ4MkM2ODYgODI1OSBpbnRlcnJ1cHRzCi0gKiAJMTYtMzEJCUFkaXJvbmRhY2sgQ1BMRCBpbnRlcnJ1cHRzCi0gKi8KLV9faW5pdCB2b2lkCi1hZGlyX2luaXRfSVJRKHZvaWQpCi17Ci0JaW50CWk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBjYXNjYWRlZCA4MjU5J3Mgb24gdGhlIFZUODJDNjg2ICovCi0JZm9yIChpPTA7IGk8MTY7IGkrKykKLQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZpODI1OV9waWM7Ci0JaTgyNTlfaW5pdChOVUxMKTsKLQotCS8qIEluaXRpYWxpemUgQWRpcm9uZGFjayBDUExEIFBJQyBhbmQgZW5hYmxlIDgyNTkgaW50ZXJydXB0IGNhc2NhZGUgKi8KLQlmb3IgKGk9MTY7IGk8MzI7IGkrKykKLQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZhZGlyX29uYm9hcmRfcGljOwotCWFkaXJfb25ib2FyZF9waWNfaW5pdCgpOwotCi0JLyogRW5hYmxlIDgyNTkgaW50ZXJydXB0IGNhc2NhZGUgKi8KLQlzZXR1cF9pcnEoQURJUl9JUlFfVlQ4MkM2ODZfSU5UUiwgJm5vb3BfYWN0aW9uKTsKLX0KLQotaW50Ci1hZGlyX2dldF9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW50CWlycTsKLQotCWlmICgoaXJxID0gYWRpcl9vbmJvYXJkX3BpY19nZXRfaXJxKCkpIDwgMCkKLQkJcmV0dXJuIGlycTsKLQotCWlmIChpcnEgPT0gQURJUl9JUlFfVlQ4MkM2ODZfSU5UUikKLQkJaXJxID0gaTgyNTlfaXJxKHJlZ3MpOwotCi0JcmV0dXJuIGlycTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9hZGlyX3NldHVwLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvYWRpcl9zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTY3NTRlLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9hZGlyX3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIGFyY2gvcHBjL3BsYXRmb3Jtcy9hZGlyX3NldHVwLmMKLSAqCi0gKiBCb2FyZCBzZXR1cCByb3V0aW5lcyBmb3IgU0JTIEFkaXJvbmRhY2sKLSAqCi0gKiBCeSBNaWNoYWVsIFNva29sb3YgPG1zb2tvbG92QGl2YW4uSGFyaGFuLk9SRz4KLSAqIGJhc2VkIG9uIHRoZSBLMiB2ZXJzaW9uIGJ5IE1hdHQgUG9ydGVyIDxtcG9ydGVyQG12aXN0YS5jb20+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pZGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL3RvZGMuaD4KLSNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KLQotI2luY2x1ZGUgImFkaXIuaCIKLQotZXh0ZXJuIHZvaWQgYWRpcl9pbml0X0lSUSh2b2lkKTsKLWV4dGVybiBpbnQgYWRpcl9nZXRfaXJxKHN0cnVjdCBwdF9yZWdzICopOwotZXh0ZXJuIHZvaWQgYWRpcl9maW5kX2JyaWRnZXModm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3B1Xzc1MGN4WzE2XSA9IHsKLQk1LCAxNSwgMTQsIDAsIDQsIDEzLCAwLCA5LCA2LCAxMSwgOCwgMTAsIDE2LCAxMiwgNywgMAotfTsKLQotc3RhdGljIGludAotYWRpcl9nZXRfYnVzX3NwZWVkKHZvaWQpCi17Ci0JaWYgKCEoKigodV9jaGFyICopIEFESVJfQ0xPQ0tfUkVHKSAmIEFESVJfQ0xPQ0tfUkVHX1NFTDEzMykpCi0JCXJldHVybiAxMDAwMDAwMDA7Ci0JZWxzZQotCQlyZXR1cm4gMTMzMzMzMzMzOwotfQotCi1zdGF0aWMgaW50Ci1hZGlyX2dldF9jcHVfc3BlZWQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGhpZDE7Ci0JaW50IGNwdV9zcGVlZDsKLQotCWhpZDEgPSBtZnNwcihTUFJOX0hJRDEpID4+IDI4OwotCi0JaGlkMSA9IGNwdV83NTBjeFtoaWQxXTsKLQotCWNwdV9zcGVlZCA9IGFkaXJfZ2V0X2J1c19zcGVlZCgpKmhpZDEvMjsKLQlyZXR1cm4gY3B1X3NwZWVkOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQKLWFkaXJfY2FsaWJyYXRlX2RlY3Iodm9pZCkKLXsKLQlpbnQgZnJlcSwgZGl2aXNvciA9IDQ7Ci0KLQkvKiBkZXRlcm1pbmUgcHJvY2Vzc29yIGJ1cyBzcGVlZCAqLwotCWZyZXEgPSBhZGlyX2dldF9idXNfc3BlZWQoKTsKLQl0Yl90aWNrc19wZXJfamlmZnkgPSBmcmVxIC8gSFogLyBkaXZpc29yOwotCXRiX3RvX3VzID0gbXVsaHd1X3NjYWxlX2ZhY3RvcihmcmVxL2Rpdmlzb3IsIDEwMDAwMDApOwotfQotCi1zdGF0aWMgaW50Ci1hZGlyX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCi17Ci0Jc2VxX3ByaW50ZihtLCAidmVuZG9yXHRcdDogU0JTXG4iKTsKLQlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogQWRpcm9uZGFja1xuIik7Ci0Jc2VxX3ByaW50ZihtLCAiY3B1IHNwZWVkXHQ6ICVkTWh6XG4iLCBhZGlyX2dldF9jcHVfc3BlZWQoKS8xMDAwMDAwKTsKLQlzZXFfcHJpbnRmKG0sICJidXMgc3BlZWRcdDogJWRNaHpcbiIsIGFkaXJfZ2V0X2J1c19zcGVlZCgpLzEwMDAwMDApOwotCXNlcV9wcmludGYobSwgIm1lbW9yeSB0eXBlXHQ6IFNEUkFNXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1leHRlcm4gY2hhciBjbWRfbGluZVtdOwotCi1UT0RDX0FMTE9DKCk7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdAotYWRpcl9zZXR1cF9hcmNoKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGNwdTsKLQotCS8qIFNldHVwIFRPREMgYWNjZXNzICovCi0JVE9EQ19JTklUKFRPRENfVFlQRV9NQzE0NjgxOCwgQURJUl9OVlJBTV9SVENfQUREUiwgMCwKLQkJICBBRElSX05WUkFNX1JUQ19EQVRBLCA4KTsKLQotCS8qIGluaXQgdG8gc29tZSB+c2FuZSB2YWx1ZSB1bnRpbCBjYWxpYnJhdGVfZGVsYXkoKSBydW5zICovCi0gICAgICAgIGxvb3BzX3Blcl9qaWZmeSA9IDUwMDAwMDAwL0haOwotCi0gICAgICAgLyogU2V0dXAgUENJIGhvc3QgYnJpZGdlcyAqLwotICAgICAgICBhZGlyX2ZpbmRfYnJpZGdlcygpOwotCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECi0JaWYgKGluaXRyZF9zdGFydCkKLQkJUk9PVF9ERVYgPSBSb290X1JBTTA7Ci0JZWxzZQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1JPT1RfTkZTCi0JCVJPT1RfREVWID0gUm9vdF9ORlM7Ci0jZWxzZQotCQlST09UX0RFViA9IFJvb3RfU0RBMTsKLSNlbmRpZgotCi0JLyogSWRlbnRpZnkgdGhlIHN5c3RlbSAqLwotCXByaW50aygiU3lzdGVtIElkZW50aWZpY2F0aW9uOiBTQlMgQWRpcm9uZGFjayAtIFBvd2VyUEMgNzUwQ1hlIEAgJWQgTWh6XG4iLCBhZGlyX2dldF9jcHVfc3BlZWQoKS8xMDAwMDAwKTsKLQlwcmludGsoIlNCUyBBZGlyb25kYWNrIHBvcnQgKEMpIDIwMDEgU0JTIFRlY2hub2xvZ2llcywgSW5jLlxuIik7Ci0KLQkvKiBJZGVudGlmeSB0aGUgQ1BVIG1hbnVmYWN0dXJlciAqLwotCWNwdSA9IG1mc3ByKFNQUk5fUFZSKTsKLQlwcmludGsoIkNQVSBtYW51ZmFjdHVyZXI6IElCTSBbcmV2PSUwNHhdXG4iLCAoY3B1ICYgMHhmZmZmKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGlyX3Jlc3RhcnQoY2hhciAqY21kKQotewotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JLyogU1JSMCBoYXMgc3lzdGVtIHJlc2V0IHZlY3RvciwgU1JSMSBoYXMgZGVmYXVsdCBNU1IgdmFsdWUgKi8KLQkvKiByZmkgcmVzdG9yZXMgTVNSIGZyb20gU1JSMSBhbmQgc2V0cyB0aGUgUEMgdG8gdGhlIFNSUjAgdmFsdWUgKi8KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCSgibGlzCTMsMHhmZmYwXG5cdCIKLQkgIm9yaQkzLDMsMHgwMTAwXG5cdCIKLQkgIm10c3ByCTI2LDNcblx0IgotCSAibGkJMywwXG5cdCIKLQkgIm10c3ByCTI3LDNcblx0IgotCSAicmZpXG5cdCIpOwotCWZvcig7Oyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGlyX3Bvd2VyX29mZih2b2lkKQotewotCWZvcig7Oyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGlyX2hhbHQodm9pZCkKLXsKLQlhZGlyX3Jlc3RhcnQoTlVMTCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdAotYWRpcl9maW5kX2VuZF9vZl9tZW1vcnkodm9pZCkKLXsKLQlyZXR1cm4gYm9vdF9tZW1fc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0Ci1hZGlyX21hcF9pbyh2b2lkKQotewotCWlvX2Jsb2NrX21hcHBpbmcoQURJUl9QQ0kzMl9WSVJUX0lPX0JBU0UsIEFESVJfUENJMzJfSU9fQkFTRSwKLQkJCQlBRElSX1BDSTMyX1ZJUlRfSU9fU0laRSwgX1BBR0VfSU8pOwotCWlvX2Jsb2NrX21hcHBpbmcoQURJUl9QQ0k2NF9WSVJUX0lPX0JBU0UsIEFESVJfUENJNjRfSU9fQkFTRSwKLQkJCQlBRElSX1BDSTY0X1ZJUlRfSU9fU0laRSwgX1BBR0VfSU8pOwotfQotCi12b2lkIF9faW5pdAotcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAotCSAgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpCi17Ci0JLyoKLQkgKiBPbiB0aGUgQWRpcm9uZGFjayB3ZSB1c2UgYmlfcmVjcyBhbmQgcGFzcyB0aGUgcG9pbnRlciB0byB0aGVtIGluIFIzLgotCSAqLwotCXBhcnNlX2Jvb3RpbmZvKChzdHJ1Y3QgYmlfcmVjb3JkICopIChyMyArIEtFUk5FTEJBU0UpKTsKLQotCS8qIFJlbWVtYmVyLCBpc2FfaW9fYmFzZSBpcyB2aXJ0dWFsIGJ1dCBpc2FfbWVtX2Jhc2UgaXMgcGh5c2ljYWwhICovCi0JaXNhX2lvX2Jhc2UgPSBBRElSX1BDSTMyX1ZJUlRfSU9fQkFTRTsKLQlpc2FfbWVtX2Jhc2UgPSBBRElSX1BDSTMyX01FTV9CQVNFOwotCXBjaV9kcmFtX29mZnNldCA9IEFESVJfUENJX1NZU19NRU1fQkFTRTsKLQotCXBwY19tZC5zZXR1cF9hcmNoID0gYWRpcl9zZXR1cF9hcmNoOwotCXBwY19tZC5zaG93X2NwdWluZm8gPSBhZGlyX3Nob3dfY3B1aW5mbzsKLQlwcGNfbWQuaXJxX2Nhbm9uaWNhbGl6ZSA9IE5VTEw7Ci0JcHBjX21kLmluaXRfSVJRID0gYWRpcl9pbml0X0lSUTsKLQlwcGNfbWQuZ2V0X2lycSA9IGFkaXJfZ2V0X2lycTsKLQlwcGNfbWQuaW5pdCA9IE5VTEw7Ci0KLQlwcGNfbWQuZmluZF9lbmRfb2ZfbWVtb3J5ID0gYWRpcl9maW5kX2VuZF9vZl9tZW1vcnk7Ci0JcHBjX21kLnNldHVwX2lvX21hcHBpbmdzID0gYWRpcl9tYXBfaW87Ci0KLQlwcGNfbWQucmVzdGFydCA9IGFkaXJfcmVzdGFydDsKLQlwcGNfbWQucG93ZXJfb2ZmID0gYWRpcl9wb3dlcl9vZmY7Ci0JcHBjX21kLmhhbHQgPSBhZGlyX2hhbHQ7Ci0KLQlwcGNfbWQudGltZV9pbml0ID0gdG9kY190aW1lX2luaXQ7Ci0JcHBjX21kLnNldF9ydGNfdGltZSA9IHRvZGNfc2V0X3J0Y190aW1lOwotCXBwY19tZC5nZXRfcnRjX3RpbWUgPSB0b2RjX2dldF9ydGNfdGltZTsKLQlwcGNfbWQubnZyYW1fcmVhZF92YWwgPSB0b2RjX21jMTQ2ODE4X3JlYWRfdmFsOwotCXBwY19tZC5udnJhbV93cml0ZV92YWwgPSB0b2RjX21jMTQ2ODE4X3dyaXRlX3ZhbDsKLQlwcGNfbWQuY2FsaWJyYXRlX2RlY3IgPSBhZGlyX2NhbGlicmF0ZV9kZWNyOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL2NwY2k2OTAuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9jcGNpNjkwLmMKaW5kZXggNTA3ODcwYy4uZjY0YWMyYSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL2NwY2k2OTAuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvY3BjaTY5MC5jCkBAIC0zNSwxMSArMzUsNyBAQAogI2RlZmluZSBTRVRfUENJX0lERV9OQVRJVkUKIAogc3RhdGljIHN0cnVjdCBtdjY0eDYwX2hhbmRsZQliaDsKLXN0YXRpYyB1MzIgY3BjaTY5MF9icl9iYXNlOwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNwdV83eHhbMTZdID0geyAvKiA3eHggJiA3NHh4IChidXQgbm90IDc0NXgpICovCi0JMTgsIDE1LCAxNCwgMiwgNCwgMTMsIDUsIDksIDYsIDExLCA4LCAxMCwgMTYsIDEyLCA3LCAwCi19Oworc3RhdGljIHZvaWQgX19pb21lbSAqY3BjaTY5MF9icl9iYXNlOwogCiBUT0RDX0FMTE9DKCk7CiAKQEAgLTU1LDcgKzUxLDcgQEAKIAkJICogCSAgIEEgICBCICAgQyAgIEQKIAkJICovCiAJCXsKLQkJCXsgOTAsIDkxLCA4OCwgODl9LCAvKiBJRFNFTCAzMC8yMCAtIFNlbnRpbmVsICovCisJCQl7IDkwLCA5MSwgODgsIDg5IH0sIC8qIElEU0VMIDMwLzIwIC0gU2VudGluZWwgKi8KIAkJfTsKIAogCQljb25zdCBsb25nIG1pbl9pZHNlbCA9IDIwLCBtYXhfaWRzZWwgPSAyMCwgaXJxc19wZXJfc2xvdCA9IDQ7CkBAIC02Nyw5ICs2Myw5IEBACiAJCSAqIAkgICBBICAgQiAgIEMgICBECiAJCSAqLwogCQl7Ci0JCQl7IDkzLCA5NCwgOTUsIDkyfSwgLyogSURTRUwgMjgvMTggLSBQTUMgc2xvdCAyICovCi0JCQl7ICAwLCAgMCwgIDAsICAwfSwgLyogSURTRUwgMjkvMTkgLSBOb3QgdXNlZCAqLwotCQkJeyA5NCwgOTUsIDkyLCA5M30sIC8qIElEU0VMIDMwLzIwIC0gUE1DIHNsb3QgMSAqLworCQkJeyA5MywgOTQsIDk1LCA5MiB9LCAvKiBJRFNFTCAyOC8xOCAtIFBNQyBzbG90IDIgKi8KKwkJCXsgIDAsICAwLCAgMCwgIDAgfSwgLyogSURTRUwgMjkvMTkgLSBOb3QgdXNlZCAqLworCQkJeyA5NCwgOTUsIDkyLCA5MyB9LCAvKiBJRFNFTCAzMC8yMCAtIFBNQyBzbG90IDEgKi8KIAkJfTsKIAogCQljb25zdCBsb25nIG1pbl9pZHNlbCA9IDE4LCBtYXhfaWRzZWwgPSAyMCwgaXJxc19wZXJfc2xvdCA9IDQ7CkBAIC03Nyw2OCArNzMsMjkgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQKLWNwY2k2OTBfZ2V0X2NwdV9zcGVlZCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcJaGlkMTsKKyNkZWZpbmUJR0IJKDEwMjRVTCAqIDEwMjRVTCAqIDEwMjRVTCkKIAotCWhpZDEgPSBtZnNwcihTUFJOX0hJRDEpID4+IDI4OwotCXJldHVybiBDUENJNjkwX0JVU19GUkVRICogY3B1Xzd4eFtoaWQxXS8yOworc3RhdGljIHUzMgorY3BjaTY5MF9nZXRfYnVzX2ZyZXEodm9pZCkKK3sKKwlpZiAoYm9vdF9tZW1fc2l6ZSA+PSAoMSpHQikpIC8qIGJ1cyBzcGVlZCBiYXNlZCBvbiBtZW0gc2l6ZSAqLworCQlyZXR1cm4gMTAwMDAwMDAwOworCWVsc2UKKwkJcmV0dXJuIDEzMzMzMzMzMzsKIH0KIAotI2RlZmluZQlLQgkoMTAyNFVMKQotI2RlZmluZQlNQgkoMTAyNFVMICogS0IpCi0jZGVmaW5lCUdCCSgxMDI0VUwgKiBNQikKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY3B1Xzc1MHh4WzMyXSA9IHsgLyogNzUwRlggJiA3NTBHWCAqLworCSAwLCAgMCwgIDIsICAyLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LC8qIDAtMTUqLworCTE2LCAxNywgMTgsIDE5LCAyMCwgMjIsIDI0LCAyNiwgMjgsIDMwLCAzMiwgMzQsIDM2LCAzOCwgNDAsICAwIC8qMTYtMzEqLworfTsKIAotdW5zaWduZWQgbG9uZyBfX2luaXQKLWNwY2k2OTBfZmluZF9lbmRfb2ZfbWVtb3J5KHZvaWQpCitzdGF0aWMgaW50CitjcGNpNjkwX2dldF9jcHVfZnJlcSh2b2lkKQogewotCXUzMgkJbWVtX2N0bHJfc2l6ZTsKLQlzdGF0aWMgdTMyCWJvYXJkX3NpemU7Ci0Jc3RhdGljIHU4CWZpcnN0X3RpbWUgPSAxOworCXVuc2lnbmVkIGxvbmcJcGxsX2NmZzsKIAotCWlmIChmaXJzdF90aW1lKSB7Ci0JCS8qIFVzaW5nIGNwY2k2OTBfc2V0X2JhdCgpIG1hcHBpbmcgPT0+IHZpcnQgYWRkciA9PSBwaHlzIGFkZHIgKi8KLQkJc3dpdGNoIChpbl84KCh1OCAqKSAoY3BjaTY5MF9icl9iYXNlICsKLQkJCUNQQ0k2OTBfQlJfTUVNX0NUTFIpKSAmIDB4MDcpIHsKLQkJY2FzZSAweDAxOgotCQkJYm9hcmRfc2l6ZSA9IDI1NipNQjsKLQkJCWJyZWFrOwotCQljYXNlIDB4MDI6Ci0JCQlib2FyZF9zaXplID0gNTEyKk1COwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgwMzoKLQkJCWJvYXJkX3NpemUgPSA3NjgqTUI7Ci0JCQlicmVhazsKLQkJY2FzZSAweDA0OgotCQkJYm9hcmRfc2l6ZSA9IDEqR0I7Ci0JCQlicmVhazsKLQkJY2FzZSAweDA1OgotCQkJYm9hcmRfc2l6ZSA9IDEqR0IgKyA1MTIqTUI7Ci0JCQlicmVhazsKLQkJY2FzZSAweDA2OgotCQkJYm9hcmRfc2l6ZSA9IDIqR0I7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJvYXJkX3NpemUgPSAweGZmZmZmZmZmOyAvKiB1c2UgbWVtIGN0bHIgc2l6ZSAqLwotCQl9IC8qIHN3aXRjaCAqLwotCi0JCW1lbV9jdGxyX3NpemUgPSAgbXY2NHg2MF9nZXRfbWVtX3NpemUoQ09ORklHX01WNjRYNjBfTkVXX0JBU0UsCi0JCQlNVjY0eDYwX1RZUEVfR1Q2NDI2MEEpOwotCi0JCS8qIENoZWNrIHRoYXQgbWVtIGN0bHIgJiBib2FyZCByZWcgYWdyZWUuICBJZiBub3QsIHBpY2sgTUlOLiAqLwotCQlpZiAoYm9hcmRfc2l6ZSAhPSBtZW1fY3Rscl9zaXplKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJCb2FyZCByZWdpc3RlciAmIG1lbW9yeSBjb250cm9sbGVyIgotCQkJCSJtZW0gc2l6ZSBkaXNhZ3JlZSAoYm9hcmQgcmVnOiAweCVseCwgIgotCQkJCSJtZW0gY3RscjogMHglbHgpXG4iLAotCQkJCSh1bG9uZylib2FyZF9zaXplLCAodWxvbmcpbWVtX2N0bHJfc2l6ZSk7Ci0JCQlib2FyZF9zaXplID0gbWluKGJvYXJkX3NpemUsIG1lbV9jdGxyX3NpemUpOwotCQl9Ci0KLQkJZmlyc3RfdGltZSA9IDA7Ci0JfSAvKiBpZiAqLwotCi0JcmV0dXJuIGJvYXJkX3NpemU7CisJcGxsX2NmZyA9IChtZnNwcihTUFJOX0hJRDEpICYgMHhmODAwMDAwMCkgPj4gMjc7CisJcmV0dXJuIGNwY2k2OTBfZ2V0X2J1c19mcmVxKCkgKiBjcHVfNzUweHhbcGxsX2NmZ10vMjsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0CkBAIC0yMjgsNyArMTg1LDcgQEAKIAltdjY0eDYwX3NldF8zMmJpdF93aW5kb3coJmJoLCBNVjY0eDYwX0NQVTJERVZfMF9XSU4sIENQQ0k2OTBfQlJfQkFTRSwKIAkJQ1BDSTY5MF9CUl9TSVpFLCAwKTsKIAliaC5jaS0+ZW5hYmxlX3dpbmRvd18zMmJpdCgmYmgsIE1WNjR4NjBfQ1BVMkRFVl8wX1dJTik7Ci0JY3BjaTY5MF9icl9iYXNlID0gKHUzMilpb3JlbWFwKENQQ0k2OTBfQlJfQkFTRSwgQ1BDSTY5MF9CUl9TSVpFKTsKKwljcGNpNjkwX2JyX2Jhc2UgPSBpb3JlbWFwKENQQ0k2OTBfQlJfQkFTRSwgQ1BDSTY5MF9CUl9TSVpFKTsKIAogCW12NjR4NjBfc2V0XzMyYml0X3dpbmRvdygmYmgsIE1WNjR4NjBfQ1BVMkRFVl8xX1dJTiwgQ1BDSTY5MF9UT0RDX0JBU0UsCiAJCUNQQ0k2OTBfVE9EQ19TSVpFLCAwKTsKQEAgLTMyOSw3ICsyODYsNyBAQAogCXBkYXRhLT5tYXhfaWRsZSA9IDQwOwogCXBkYXRhLT5kZWZhdWx0X2JhdWQgPSBDUENJNjkwX01QU0NfQkFVRDsKIAlwZGF0YS0+YnJnX2Nsa19zcmMgPSBDUENJNjkwX01QU0NfQ0xLX1NSQzsKLQlwZGF0YS0+YnJnX2Nsa19mcmVxID0gQ1BDSTY5MF9CVVNfRlJFUTsKKwlwZGF0YS0+YnJnX2Nsa19mcmVxID0gY3BjaTY5MF9nZXRfYnVzX2ZyZXEoKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQKQEAgLTM2NSw3ICszMjIsNyBAQAogCXUzMglpID0gMTAwMDA7CiAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCW91dF84KCh1OCAqKShjcGNpNjkwX2JyX2Jhc2UgKyBDUENJNjkwX0JSX1NXX1JFU0VUKSwgMHgxMSk7CisJb3V0XzgoKGNwY2k2OTBfYnJfYmFzZSArIENQQ0k2OTBfQlJfU1dfUkVTRVQpLCAweDExKTsKIAogCXdoaWxlIChpICE9IDApIGkrKzsKIAlwYW5pYygicmVzdGFydCBmYWlsZWRcbiIpOwpAQCAtMzk0LDEwICszNTEsNDAgQEAKIHN0YXRpYyBpbnQKIGNwY2k2OTBfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKKwljaGFyCSpzOworCisJc2VxX3ByaW50ZihtLCAiY3B1IE1Ielx0XHQ6ICVkXG4iLAorCQkoY3BjaTY5MF9nZXRfY3B1X2ZyZXEoKSArIDUwMDAwMCkgLyAxMDAwMDAwKTsKKwlzZXFfcHJpbnRmKG0sICJidXMgTUh6XHRcdDogJWRcbiIsCisJCShjcGNpNjkwX2dldF9idXNfZnJlcSgpICsgNTAwMDAwKSAvIDEwMDAwMDApOwogCXNlcV9wcmludGYobSwgInZlbmRvclx0XHQ6ICIgQk9BUkRfVkVORE9SICJcbiIpOwogCXNlcV9wcmludGYobSwgIm1hY2hpbmVcdFx0OiAiIEJPQVJEX01BQ0hJTkUgIlxuIik7Ci0Jc2VxX3ByaW50ZihtLCAiY3B1IE1Ielx0XHQ6ICVkXG4iLCBjcGNpNjkwX2dldF9jcHVfc3BlZWQoKS8xMDAwLzEwMDApOwotCXNlcV9wcmludGYobSwgImJ1cyBNSHpcdFx0OiAlZFxuIiwgQ1BDSTY5MF9CVVNfRlJFUS8xMDAwLzEwMDApOworCXNlcV9wcmludGYobSwgIkZQR0EgUmV2aXNpb25cdDogJWRcbiIsCisJCWluXzgoY3BjaTY5MF9icl9iYXNlICsgQ1BDSTY5MF9CUl9NRU1fQ1RMUikgPj4gNSk7CisKKwlzd2l0Y2goYmgudHlwZSkgeworCWNhc2UgTVY2NHg2MF9UWVBFX0dUNjQyNjBBOgorCQlzID0gImd0NjQyNjBhIjsKKwkJYnJlYWs7CisJY2FzZSBNVjY0eDYwX1RZUEVfR1Q2NDI2MEI6CisJCXMgPSAiZ3Q2NDI2MGIiOworCQlicmVhazsKKwljYXNlIE1WNjR4NjBfVFlQRV9NVjY0MzYwOgorCQlzID0gIm12NjQzNjAiOworCQlicmVhazsKKwljYXNlIE1WNjR4NjBfVFlQRV9NVjY0NDYwOgorCQlzID0gIm12NjQ0NjAiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzID0gIlVua25vd24iOworCX0KKwlzZXFfcHJpbnRmKG0sICJicmlkZ2UgdHlwZVx0OiAlc1xuIiwgcyk7CisJc2VxX3ByaW50ZihtLCAiYnJpZGdlIHJldlx0OiAweCV4XG4iLCBiaC5yZXYpOworI2lmIGRlZmluZWQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkKKwlzZXFfcHJpbnRmKG0sICJjb2hlcmVuY3lcdDogJXNcbiIsICJvZmYiKTsKKyNlbHNlCisJc2VxX3ByaW50ZihtLCAiY29oZXJlbmN5XHQ6ICVzXG4iLCAib24iKTsKKyNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDcsNyArMzk0LDcgQEAKIHsKIAl1bG9uZyBmcmVxOwogCi0JZnJlcSA9IENQQ0k2OTBfQlVTX0ZSRVEgLyA0OworCWZyZXEgPSBjcGNpNjkwX2dldF9idXNfZnJlcSgpIC8gNDsKIAogCXByaW50ayhLRVJOX0lORk8gInRpbWVfaW5pdDogZGVjcmVtZW50ZXIgZnJlcXVlbmN5ID0gJWx1LiUuNmx1IE1IelxuIiwKIAkgICAgICAgZnJlcS8xMDAwMDAwLCBmcmVxJTEwMDAwMDApOwpAQCAtNDE2LDI1ICs0MDMsMTIgQEAKIAl0Yl90b191cyA9IG11bGh3dV9zY2FsZV9mYWN0b3IoZnJlcSwgMTAwMDAwMCk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLWNwY2k2OTBfc2V0X2JhdCh1MzIgYWRkciwgdTMyIHNpemUpCi17Ci0JYWRkciAmPSAweGZmZmUwMDAwOwotCXNpemUgJj0gMHgxZmZlMDAwMDsKLQlzaXplID0gKChzaXplID4+IDE3KSAtIDEpIDw8IDI7Ci0KLQltYigpOwotCW10c3ByKFNQUk5fREJBVDFVLCBhZGRyIHwgc2l6ZSB8IDB4Mik7IC8qIFZzID09IDE7IFZwID09IDAgKi8KLQltdHNwcihTUFJOX0RCQVQxTCwgYWRkciB8IDB4MmEpOyAvKiBXSU1HIGJpdHMgPT0gMDEwMTsgUFAgPT0gci93IGFjY2VzcyAqLwotCW1iKCk7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRykgfHwgZGVmaW5lZChDT05GSUdfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRykgfHwgZGVmaW5lZChDT05GSUdfS0dEQl9NUFNDKQogc3RhdGljIHZvaWQgX19pbml0CiBjcGNpNjkwX21hcF9pbyh2b2lkKQogewogCWlvX2Jsb2NrX21hcHBpbmcoQ09ORklHX01WNjRYNjBfTkVXX0JBU0UsIENPTkZJR19NVjY0WDYwX05FV19CQVNFLAotCQkxMjggKiBLQiwgX1BBR0VfSU8pOworCQkxMjggKiAxMDI0LCBfUEFHRV9JTyk7CiB9CiAjZW5kaWYKIApAQCAtNDQyLDE0ICs0MTYsMTUgQEAKIHBsYXRmb3JtX2luaXQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKIAkgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3KQogewotI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAotCWluaXRyZF9zdGFydD1pbml0cmRfZW5kPTA7Ci0JaW5pdHJkX2JlbG93X3N0YXJ0X29rPTA7Ci0jZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSU5JVFJEICovCi0KIAlwYXJzZV9ib290aW5mbyhmaW5kX2Jvb3RpbmZvKCkpOwogCi0JbG9vcHNfcGVyX2ppZmZ5ID0gY3BjaTY5MF9nZXRfY3B1X3NwZWVkKCkgLyBIWjsKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKKwkvKiB0YWtlIGNhcmUgb2YgaW5pdHJkIGlmIHdlIGhhdmUgb25lICovCisJaWYgKHI0KSB7CisJCWluaXRyZF9zdGFydCA9IHI0ICsgS0VSTkVMQkFTRTsKKwkJaW5pdHJkX2VuZCA9IHI1ICsgS0VSTkVMQkFTRTsKKwl9CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSU5JVFJEICovCiAKIAlpc2FfbWVtX2Jhc2UgPSAwOwogCkBAIC00NjAsNyArNDM1LDYgQEAKIAlwcGNfbWQucmVzdGFydCA9IGNwY2k2OTBfcmVzdGFydDsKIAlwcGNfbWQucG93ZXJfb2ZmID0gY3BjaTY5MF9wb3dlcl9vZmY7CiAJcHBjX21kLmhhbHQgPSBjcGNpNjkwX2hhbHQ7Ci0JcHBjX21kLmZpbmRfZW5kX29mX21lbW9yeSA9IGNwY2k2OTBfZmluZF9lbmRfb2ZfbWVtb3J5OwogCXBwY19tZC50aW1lX2luaXQgPSB0b2RjX3RpbWVfaW5pdDsKIAlwcGNfbWQuc2V0X3J0Y190aW1lID0gdG9kY19zZXRfcnRjX3RpbWU7CiAJcHBjX21kLmdldF9ydGNfdGltZSA9IHRvZGNfZ2V0X3J0Y190aW1lOwpAQCAtNDY4LDIyICs0NDIsMTMgQEAKIAlwcGNfbWQubnZyYW1fd3JpdGVfdmFsID0gdG9kY19kaXJlY3Rfd3JpdGVfdmFsOwogCXBwY19tZC5jYWxpYnJhdGVfZGVjciA9IGNwY2k2OTBfY2FsaWJyYXRlX2RlY3I7CiAKLQkvKgotCSAqIE5lZWQgdG8gbWFwIGluIGJvYXJkIHJlZ3MgKHVzZWQgYnkgY3BjaTY5MF9maW5kX2VuZF9vZl9tZW1vcnkoKSkKLQkgKiBhbmQgdGhlIGJyaWRnZSdzIHJlZ3MgKHVzZWQgYnkgcHJvZ3Jlc3MpOwotCSAqLwotCWNwY2k2OTBfc2V0X2JhdChDUENJNjkwX0JSX0JBU0UsIDMyICogTUIpOwotCWNwY2k2OTBfYnJfYmFzZSA9IENQQ0k2OTBfQlJfQkFTRTsKLQotI2lmZGVmCUNPTkZJR19TRVJJQUxfVEVYVF9ERUJVRworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9URVhUX0RFQlVHKSB8fCBkZWZpbmVkKENPTkZJR19LR0RCX01QU0MpCiAJcHBjX21kLnNldHVwX2lvX21hcHBpbmdzID0gY3BjaTY5MF9tYXBfaW87CisjaWZkZWYgQ09ORklHX1NFUklBTF9URVhUX0RFQlVHCiAJcHBjX21kLnByb2dyZXNzID0gbXY2NHg2MF9tcHNjX3Byb2dyZXNzOwogCW12NjR4NjBfcHJvZ3Jlc3NfaW5pdChDT05GSUdfTVY2NFg2MF9ORVdfQkFTRSk7CiAjZW5kaWYJLyogQ09ORklHX1NFUklBTF9URVhUX0RFQlVHICovCi0jaWZkZWYJQ09ORklHX0tHREIKLQlwcGNfbWQuc2V0dXBfaW9fbWFwcGluZ3MgPSBjcGNpNjkwX21hcF9pbzsKLQlwcGNfbWQuZWFybHlfc2VyaWFsX21hcCA9IGNwY2k2OTBfZWFybHlfc2VyaWFsX21hcDsKLSNlbmRpZgkvKiBDT05GSUdfS0dEQiAqLworI2VuZGlmCS8qIGRlZmluZWQoQ09ORklHX1NFUklBTF9URVhUX0RFQlVHKSB8fCBkZWZpbmVkKENPTkZJR19LR0RCX01QU0MpICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVBTQykKIAlwbGF0Zm9ybV9ub3RpZnkgPSBjcGNpNjkwX3BsYXRmb3JtX25vdGlmeTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9jcGNpNjkwLmggYi9hcmNoL3BwYy9wbGF0Zm9ybXMvY3BjaTY5MC5oCmluZGV4IDM2Y2QyNjcuLjQ5NTg0YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9jcGNpNjkwLmgKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2NwY2k2OTAuaApAQCAtNzMsNiArNzMsNCBAQAogI2RlZmluZQlDUENJNjkwX01QU0NfQkFVRAkJCTk2MDAKICNkZWZpbmUJQ1BDSTY5MF9NUFNDX0NMS19TUkMJCQk4IC8qIFRDTEsgKi8KIAotI2RlZmluZQlDUENJNjkwX0JVU19GUkVRCQkJMTMzMzMzMzMzCi0KICNlbmRpZiAvKiBfX1BQQ19QTEFURk9STVNfQ1BDSTY5MF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvZXY2NDM2MC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2V2NjQzNjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODExYThhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2V2NjQzNjAuYwpAQCAtMCwwICsxLDUxMCBAQAorLyoKKyAqIGFyY2gvcHBjL3BsYXRmb3Jtcy9ldjY0MzYwLmMKKyAqCisgKiBCb2FyZCBzZXR1cCByb3V0aW5lcyBmb3IgdGhlIE1hcnZlbGwgRVYtNjQzNjAtQlAgRXZhbHVhdGlvbiBCb2FyZC4KKyAqCisgKiBBdXRob3I6IExlZSBOaWNrcyA8YWxsaW51eEBnbWFpbC5jb20+CisgKgorICogQmFzZWQgb24gY29kZSBkb25lIGJ5IFJhYmVlaCBLaG91cnkgLSByYWJlZWhAZ2FsaWxlby5jby5pbAorICogQmFzZWQgb24gY29kZSBkb25lIGJ5IC0gTWFyayBBLiBHcmVlciA8bWdyZWVyQG12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKyNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdjY0M3h4Lmg+CisjaWZkZWYgQ09ORklHX0JPT1RJTUcKKyNpbmNsdWRlIDxsaW51eC9ib290aW1nLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS90b2RjLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL3BwY2Jvb3QuaD4KKyNpbmNsdWRlIDxhc20vbXY2NHg2MC5oPgorI2luY2x1ZGUgPHBsYXRmb3Jtcy9ldjY0MzYwLmg+CisKKyNkZWZpbmUgQk9BUkRfVkVORE9SICAgICJNYXJ2ZWxsIgorI2RlZmluZSBCT0FSRF9NQUNISU5FICAgIkVWLTY0MzYwLUJQIgorCitzdGF0aWMgc3RydWN0CQltdjY0eDYwX2hhbmRsZSBiaDsKK3N0YXRpYyB2b2lkIF9faW9tZW0JKnNyYW1fYmFzZTsKKworc3RhdGljIHUzMgkJZXY2NDM2MF9mbGFzaF9zaXplXzA7CitzdGF0aWMgdTMyCQlldjY0MzYwX2ZsYXNoX3NpemVfMTsKKworc3RhdGljIHUzMgkJZXY2NDM2MF9idXNfZnJlcXVlbmN5OworCit1bnNpZ25lZCBjaGFyCV9fcmVzW3NpemVvZihiZF90KV07CisKK3N0YXRpYyBpbnQgX19pbml0CitldjY0MzYwX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgY2hhciBpZHNlbCwgdW5zaWduZWQgY2hhciBwaW4pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorZXY2NDM2MF9zZXR1cF9icmlkZ2Uodm9pZCkKK3sKKwlzdHJ1Y3QgbXY2NHg2MF9zZXR1cF9pbmZvIHNpOworCWludCBpOworCisJbWVtc2V0KCZzaSwgMCwgc2l6ZW9mKHNpKSk7CisKKwlzaS5waHlzX3JlZ19iYXNlID0gQ09ORklHX01WNjRYNjBfTkVXX0JBU0U7CisKKwkjaWZkZWYgQ09ORklHX1BDSQorCXNpLnBjaV8xLmVuYWJsZV9idXMgPSAxOworCXNpLnBjaV8xLnBjaV9pby5jcHVfYmFzZSA9IEVWNjQzNjBfUENJMV9JT19TVEFSVF9QUk9DX0FERFI7CisJc2kucGNpXzEucGNpX2lvLnBjaV9iYXNlX2hpID0gMDsKKwlzaS5wY2lfMS5wY2lfaW8ucGNpX2Jhc2VfbG8gPSBFVjY0MzYwX1BDSTFfSU9fU1RBUlRfUENJX0FERFI7CisJc2kucGNpXzEucGNpX2lvLnNpemUgPSBFVjY0MzYwX1BDSTFfSU9fU0laRTsKKwlzaS5wY2lfMS5wY2lfaW8uc3dhcCA9IE1WNjR4NjBfQ1BVMlBDSV9TV0FQX05PTkU7CisJc2kucGNpXzEucGNpX21lbVswXS5jcHVfYmFzZSA9IEVWNjQzNjBfUENJMV9NRU1fU1RBUlRfUFJPQ19BRERSOworCXNpLnBjaV8xLnBjaV9tZW1bMF0ucGNpX2Jhc2VfaGkgPSBFVjY0MzYwX1BDSTFfTUVNX1NUQVJUX1BDSV9ISV9BRERSOworCXNpLnBjaV8xLnBjaV9tZW1bMF0ucGNpX2Jhc2VfbG8gPSBFVjY0MzYwX1BDSTFfTUVNX1NUQVJUX1BDSV9MT19BRERSOworCXNpLnBjaV8xLnBjaV9tZW1bMF0uc2l6ZSA9IEVWNjQzNjBfUENJMV9NRU1fU0laRTsKKwlzaS5wY2lfMS5wY2lfbWVtWzBdLnN3YXAgPSBNVjY0eDYwX0NQVTJQQ0lfU1dBUF9OT05FOworCXNpLnBjaV8xLnBjaV9jbWRfYml0cyA9IDA7CisJc2kucGNpXzEubGF0ZW5jeV90aW1lciA9IDB4ODA7CisJI2Vsc2UKKwlzaS5wY2lfMC5lbmFibGVfYnVzID0gMDsKKwlzaS5wY2lfMS5lbmFibGVfYnVzID0gMDsKKwkjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBNVjY0eDYwX0NQVTJNRU1fV0lORE9XUzsgaSsrKSB7CisjaWYgZGVmaW5lZChDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFKQorCQlzaS5jcHVfcHJvdF9vcHRpb25zW2ldID0gMDsKKwkJc2kuZW5ldF9vcHRpb25zW2ldID0gTVY2NDM2MF9FTkVUMk1FTV9TTk9PUF9OT05FOworCQlzaS5tcHNjX29wdGlvbnNbaV0gPSBNVjY0MzYwX01QU0MyTUVNX1NOT09QX05PTkU7CisJCXNpLmlkbWFfb3B0aW9uc1tpXSA9IE1WNjQzNjBfSURNQTJNRU1fU05PT1BfTk9ORTsKKworCQlzaS5wY2lfMS5hY2NfY250bF9vcHRpb25zW2ldID0KKwkJICAgIE1WNjQzNjBfUENJX0FDQ19DTlRMX1NOT09QX05PTkUgfAorCQkgICAgTVY2NDM2MF9QQ0lfQUNDX0NOVExfU1dBUF9OT05FIHwKKwkJICAgIE1WNjQzNjBfUENJX0FDQ19DTlRMX01CVVJTVF8xMjhfQllURVMgfAorCQkgICAgTVY2NDM2MF9QQ0lfQUNDX0NOVExfUkRTSVpFXzI1Nl9CWVRFUzsKKyNlbHNlCisJCXNpLmNwdV9wcm90X29wdGlvbnNbaV0gPSAwOworCQlzaS5lbmV0X29wdGlvbnNbaV0gPSBNVjY0MzYwX0VORVQyTUVNX1NOT09QX05PTkU7IC8qIGVycmF0YSAqLworCQlzaS5tcHNjX29wdGlvbnNbaV0gPSBNVjY0MzYwX01QU0MyTUVNX1NOT09QX05PTkU7IC8qIGVycmF0YSAqLworCQlzaS5pZG1hX29wdGlvbnNbaV0gPSBNVjY0MzYwX0lETUEyTUVNX1NOT09QX05PTkU7IC8qIGVycmF0YSAqLworCisJCXNpLnBjaV8xLmFjY19jbnRsX29wdGlvbnNbaV0gPQorCQkgICAgTVY2NDM2MF9QQ0lfQUNDX0NOVExfU05PT1BfV0IgfAorCQkgICAgTVY2NDM2MF9QQ0lfQUNDX0NOVExfU1dBUF9OT05FIHwKKwkJICAgIE1WNjQzNjBfUENJX0FDQ19DTlRMX01CVVJTVF8zMl9CWVRFUyB8CisJCSAgICBNVjY0MzYwX1BDSV9BQ0NfQ05UTF9SRFNJWkVfMzJfQllURVM7CisjZW5kaWYKKwl9CisKKwlpZiAobXY2NHg2MF9pbml0KCZiaCwgJnNpKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQnJpZGdlIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOworCisJI2lmZGVmIENPTkZJR19QQ0kKKwlwY2lfZHJhbV9vZmZzZXQgPSAwOyAvKiBzeXMgbWVtIGF0IHNhbWUgYWRkciBvbiBQQ0kgJiBjcHUgYnVzICovCisJcHBjX21kLnBjaV9zd2l6emxlID0gY29tbW9uX3N3aXp6bGU7CisJcHBjX21kLnBjaV9tYXBfaXJxID0gZXY2NDM2MF9tYXBfaXJxOworCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtdjY0eDYwX3BjaV9leGNsdWRlX2RldmljZTsKKworCW12NjR4NjBfc2V0X2J1cygmYmgsIDEsIDApOworCWJoLmhvc2VfYi0+Zmlyc3RfYnVzbm8gPSAwOworCWJoLmhvc2VfYi0+bGFzdF9idXNubyA9IDB4ZmY7CisJI2VuZGlmCit9CisKKy8qIEJyaWRnZSAmIHBsYXRmb3JtIHNldHVwIHJvdXRpbmVzICovCit2b2lkIF9faW5pdAorZXY2NDM2MF9pbnRyX3NldHVwKHZvaWQpCit7CisJLyogTVBQIDgsIDksIGFuZCAxMCAqLworCW12NjR4NjBfY2xyX2JpdHMoJmJoLCBNVjY0eDYwX01QUF9DTlRMXzEsIDB4ZmZmKTsKKworCS8qCisJICogRGVmaW5lIEdQUCA4LDksYW5kIDEwIGludGVycnVwdCBwb2xhcml0eSBhcyBhY3RpdmUgbG93CisJICogaW5wdXQgc2lnbmFsIGFuZCBsZXZlbCB0cmlnZ2VyZWQKKwkgKi8KKwltdjY0eDYwX3NldF9iaXRzKCZiaCwgTVY2NHg2MF9HUFBfTEVWRUxfQ05UTCwgMHg3MDApOworCW12NjR4NjBfY2xyX2JpdHMoJmJoLCBNVjY0eDYwX0dQUF9JT19DTlRMLCAweDcwMCk7CisKKwkvKiBDb25maWcgR1BQIGludHIgY3RsciB0byByZXNwb25kIHRvIGxldmVsIHRyaWdnZXIgKi8KKwltdjY0eDYwX3NldF9iaXRzKCZiaCwgTVY2NHg2MF9DT01NX0FSQklURVJfQ05UTCwgKDE8PDEwKSk7CisKKwkvKiBFcnJhbnVtIEZFciBQQ0ktIzggKi8KKwltdjY0eDYwX2Nscl9iaXRzKCZiaCwgTVY2NHg2MF9QQ0kwX0NNRCwgKDE8PDUpIHwgKDE8PDkpKTsKKwltdjY0eDYwX2Nscl9iaXRzKCZiaCwgTVY2NHg2MF9QQ0kxX0NNRCwgKDE8PDUpIHwgKDE8PDkpKTsKKworCS8qCisJICogRGlzbWlzcyBhbmQgdGhlbiBlbmFibGUgaW50ZXJydXB0IG9uIEdQUCBpbnRlcnJ1cHQgY2F1c2UKKwkgKiBmb3IgQ1BVICMwCisJICovCisJbXY2NHg2MF93cml0ZSgmYmgsIE1WNjR4NjBfR1BQX0lOVFJfQ0FVU0UsIH4weDcwMCk7CisJbXY2NHg2MF9zZXRfYml0cygmYmgsIE1WNjR4NjBfR1BQX0lOVFJfTUFTSywgMHg3MDApOworCisJLyoKKwkgKiBEaXNtaXNzIGFuZCB0aGVuIGVuYWJsZSBpbnRlcnJ1cHQgb24gQ1BVICMwIGhpZ2ggY2F1c2UgcmVnCisJICogQklUMjUgc3VtbWFyaXplcyBHUFAgaW50ZXJydXB0cyA4LTE1CisJICovCisJbXY2NHg2MF9zZXRfYml0cygmYmgsIE1WNjQzNjBfSUNfQ1BVMF9JTlRSX01BU0tfSEksICgxPDwyNSkpOworfQorCit2b2lkIF9faW5pdAorZXY2NDM2MF9zZXR1cF9wZXJpcGhlcmFscyh2b2lkKQoreworCXUzMiBiYXNlOworCisJLyogU2V0IHVwIHdpbmRvdyBmb3IgYm9vdCBDUyAqLworCW12NjR4NjBfc2V0XzMyYml0X3dpbmRvdygmYmgsIE1WNjR4NjBfQ1BVMkJPT1RfV0lOLAorCQkgRVY2NDM2MF9CT09UX1dJTkRPV19CQVNFLCBFVjY0MzYwX0JPT1RfV0lORE9XX1NJWkUsIDApOworCWJoLmNpLT5lbmFibGVfd2luZG93XzMyYml0KCZiaCwgTVY2NHg2MF9DUFUyQk9PVF9XSU4pOworCisJLyogV2Ugb25seSB1c2UgdGhlIDMyLWJpdCBmbGFzaCAqLworCW12NjR4NjBfZ2V0XzMyYml0X3dpbmRvdygmYmgsIE1WNjR4NjBfQ1BVMkJPT1RfV0lOLCAmYmFzZSwKKwkJJmV2NjQzNjBfZmxhc2hfc2l6ZV8wKTsKKwlldjY0MzYwX2ZsYXNoX3NpemVfMSA9IDA7CisKKwltdjY0eDYwX3NldF8zMmJpdF93aW5kb3coJmJoLCBNVjY0eDYwX0NQVTJERVZfMV9XSU4sCisJCSBFVjY0MzYwX1JUQ19XSU5ET1dfQkFTRSwgRVY2NDM2MF9SVENfV0lORE9XX1NJWkUsIDApOworCWJoLmNpLT5lbmFibGVfd2luZG93XzMyYml0KCZiaCwgTVY2NHg2MF9DUFUyREVWXzFfV0lOKTsKKworCW12NjR4NjBfc2V0XzMyYml0X3dpbmRvdygmYmgsIE1WNjR4NjBfQ1BVMlNSQU1fV0lOLAorCQkgRVY2NDM2MF9JTlRFUk5BTF9TUkFNX0JBU0UsIE1WNjQzNjBfU1JBTV9TSVpFLCAwKTsKKwliaC5jaS0+ZW5hYmxlX3dpbmRvd18zMmJpdCgmYmgsIE1WNjR4NjBfQ1BVMlNSQU1fV0lOKTsKKwlzcmFtX2Jhc2UgPSBpb3JlbWFwKEVWNjQzNjBfSU5URVJOQUxfU1JBTV9CQVNFLCBNVjY0MzYwX1NSQU1fU0laRSk7CisKKwkvKiBTZXQgdXAgRW5ldC0+U1JBTSB3aW5kb3cgKi8KKwltdjY0eDYwX3NldF8zMmJpdF93aW5kb3coJmJoLCBNVjY0eDYwX0VORVQyTUVNXzRfV0lOLAorCQlFVjY0MzYwX0lOVEVSTkFMX1NSQU1fQkFTRSwgTVY2NDM2MF9TUkFNX1NJWkUsIDB4Mik7CisJYmguY2ktPmVuYWJsZV93aW5kb3dfMzJiaXQoJmJoLCBNVjY0eDYwX0VORVQyTUVNXzRfV0lOKTsKKworCS8qIEdpdmUgZW5ldCByL3cgYWNjZXNzIHRvIG1lbW9yeSByZWdpb24gKi8KKwltdjY0eDYwX3NldF9iaXRzKCZiaCwgTVY2NDM2MF9FTkVUMk1FTV9BQ0NfUFJPVF8wLCAoMHgzIDw8ICg0IDw8IDEpKSk7CisJbXY2NHg2MF9zZXRfYml0cygmYmgsIE1WNjQzNjBfRU5FVDJNRU1fQUNDX1BST1RfMSwgKDB4MyA8PCAoNCA8PCAxKSkpOworCW12NjR4NjBfc2V0X2JpdHMoJmJoLCBNVjY0MzYwX0VORVQyTUVNX0FDQ19QUk9UXzIsICgweDMgPDwgKDQgPDwgMSkpKTsKKworCW12NjR4NjBfY2xyX2JpdHMoJmJoLCBNVjY0eDYwX1BDSTFfUENJX0RFQ09ERV9DTlRMLCAoMSA8PCAzKSk7CisJbXY2NHg2MF9jbHJfYml0cygmYmgsIE1WNjR4NjBfVElNUl9DTlRSXzBfM19DTlRMLAorCQkJICgoMSA8PCAwKSB8ICgxIDw8IDgpIHwgKDEgPDwgMTYpIHwgKDEgPDwgMjQpKSk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCisJbXY2NHg2MF93cml0ZSgmYmgsIE1WNjQzNjBfU1JBTV9DT05GSUcsIDB4MDAxNjAwMDApOworI2Vsc2UKKwltdjY0eDYwX3dyaXRlKCZiaCwgTVY2NDM2MF9TUkFNX0NPTkZJRywgMHgwMDE2MDBiMik7CisjZW5kaWYKKworCS8qCisJICogU2V0dGluZyB0aGUgU1JBTSB0byAwLiBOb3RlIHRoYXQgdGhpcyBnZW5lcmF0ZXMgcGFyaXR5IGVycm9ycyBvbgorCSAqIGludGVybmFsIGRhdGEgcGF0aCBpbiBTUkFNIHNpbmNlIGl0J3MgZmlyc3QgdGltZSBhY2Nlc3NpbmcgaXQKKwkgKiB3aGlsZSBhZnRlciByZXNldCBpdCdzIG5vdCBjb25maWd1cmVkLgorCSAqLworCW1lbXNldChzcmFtX2Jhc2UsIDAsIE1WNjQzNjBfU1JBTV9TSVpFKTsKKworCS8qIHNldCB1cCBQQ0kgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKwlldjY0MzYwX2ludHJfc2V0dXAoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0CitldjY0MzYwX3NldHVwX2FyY2godm9pZCkKK3sKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoImV2NjQzNjBfc2V0dXBfYXJjaDogZW50ZXIiLCAwKTsKKworCXNldF90YigwLCAwKTsKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCWlmIChpbml0cmRfc3RhcnQpCisJCVJPT1RfREVWID0gUm9vdF9SQU0wOworCWVsc2UKKyNlbmRpZgorI2lmZGVmICAgQ09ORklHX1JPT1RfTkZTCisJCVJPT1RfREVWID0gUm9vdF9ORlM7CisjZWxzZQorCQlST09UX0RFViA9IFJvb3RfU0RBMjsKKyNlbmRpZgorCisJLyoKKwkgKiBTZXQgdXAgdGhlIEwyQ1IgcmVnaXN0ZXIuCisJICovCisJX3NldF9MMkNSKEwyQ1JfTDJFIHwgTDJDUl9MMlBFKTsKKworCWlmIChwcGNfbWQucHJvZ3Jlc3MpCisJCXBwY19tZC5wcm9ncmVzcygiZXY2NDM2MF9zZXR1cF9hcmNoOiBjYWxsaW5nIHNldHVwX2JyaWRnZSIsIDApOworCisJZXY2NDM2MF9zZXR1cF9icmlkZ2UoKTsKKwlldjY0MzYwX3NldHVwX3BlcmlwaGVyYWxzKCk7CisJZXY2NDM2MF9idXNfZnJlcXVlbmN5ID0gZXY2NDM2MF9idXNfZnJlcSgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgJXMgcG9ydCAoQykgMjAwNSBMZWUgTmlja3MgIgorCQkiKGFsbGludXhAZ21haWwuY29tKVxuIiwgQk9BUkRfVkVORE9SLCBCT0FSRF9NQUNISU5FKTsKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoImV2NjQzNjBfc2V0dXBfYXJjaDogZXhpdCIsIDApOworfQorCisvKiBQbGF0Zm9ybSBkZXZpY2UgZGF0YSBmaXh1cCByb3V0aW5lcy4gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVBTQykKK3N0YXRpYyB2b2lkIF9faW5pdAorZXY2NDM2MF9maXh1cF9tcHNjX3BkYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1wc2NfcGRhdGEgKnBkYXRhOworCisJcGRhdGEgPSAoc3RydWN0IG1wc2NfcGRhdGEgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCXBkYXRhLT5tYXhfaWRsZSA9IDQwOworCXBkYXRhLT5kZWZhdWx0X2JhdWQgPSBFVjY0MzYwX0RFRkFVTFRfQkFVRDsKKwlwZGF0YS0+YnJnX2Nsa19zcmMgPSBFVjY0MzYwX01QU0NfQ0xLX1NSQzsKKwkvKgorCSAqIFRDTEsgKG5vdCBTeXNDTGspIGlzIHJvdXRlZCB0byBCUkcsIHRoZW4gdG8gdGhlIE1QU0MuICBPbiBtb3N0IHBhcnRzLAorCSAqIFRDTEsgPT0gU3lzQ0xLIGJ1dCBvbiA2NDQ2MCwgdGhleSBhcmUgc2VwYXJhdGUgcGlucy4KKwkgKiBTeXNDTEsgY2FuIGdvIHVwIHRvIDIwMCBNSHogYnV0IFRDTEsgY2FuIG9ubHkgZ28gdXAgdG8gMTMzIE1Iei4KKwkgKi8KKwlwZGF0YS0+YnJnX2Nsa19mcmVxID0gbWluKGV2NjQzNjBfYnVzX2ZyZXF1ZW5jeSwgTVY2NHg2MF9UQ0xLX0ZSRVFfTUFYKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVY2NDNYWF9FVEgpCitzdGF0aWMgdm9pZCBfX2luaXQKK2V2NjQzNjBfZml4dXBfZXRoX3BkYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgKmV0aF9wZDsKKwlzdGF0aWMgdTE2IHBoeV9hZGRyW10gPSB7CisJCUVWNjQzNjBfRVRIMF9QSFlfQUREUiwKKwkJRVY2NDM2MF9FVEgxX1BIWV9BRERSLAorCQlFVjY0MzYwX0VUSDJfUEhZX0FERFIsCisJfTsKKworCWV0aF9wZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWV0aF9wZC0+Zm9yY2VfcGh5X2FkZHIgPSAxOworCWV0aF9wZC0+cGh5X2FkZHIgPSBwaHlfYWRkcltwZGV2LT5pZF07CisJZXRoX3BkLT50eF9xdWV1ZV9zaXplID0gRVY2NDM2MF9FVEhfVFhfUVVFVUVfU0laRTsKKwlldGhfcGQtPnJ4X3F1ZXVlX3NpemUgPSBFVjY0MzYwX0VUSF9SWF9RVUVVRV9TSVpFOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0CitldjY0MzYwX3BsYXRmb3JtX25vdGlmeShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RhdGljIHN0cnVjdCB7CisJCWNoYXIJKmJ1c19pZDsKKwkJdm9pZAkoKCpydG4pKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpKTsKKwl9IGRldl9tYXBbXSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVBTQykKKwkJeyBNUFNDX0NUTFJfTkFNRSAiLjAiLCBldjY0MzYwX2ZpeHVwX21wc2NfcGRhdGEgfSwKKwkJeyBNUFNDX0NUTFJfTkFNRSAiLjEiLCBldjY0MzYwX2ZpeHVwX21wc2NfcGRhdGEgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01WNjQzWFhfRVRIKQorCQl7IE1WNjQzWFhfRVRIX05BTUUgIi4wIiwgZXY2NDM2MF9maXh1cF9ldGhfcGRhdGEgfSwKKwkJeyBNVjY0M1hYX0VUSF9OQU1FICIuMSIsIGV2NjQzNjBfZml4dXBfZXRoX3BkYXRhIH0sCisJCXsgTVY2NDNYWF9FVEhfTkFNRSAiLjIiLCBldjY0MzYwX2ZpeHVwX2V0aF9wZGF0YSB9LAorI2VuZGlmCisJfTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworCWludAlpOworCisJaWYgKGRldiAmJiBkZXYtPmJ1c19pZCkKKwkJZm9yIChpPTA7IGk8QVJSQVlfU0laRShkZXZfbWFwKTsgaSsrKQorCQkJaWYgKCFzdHJuY21wKGRldi0+YnVzX2lkLCBkZXZfbWFwW2ldLmJ1c19pZCwKKwkJCQlCVVNfSURfU0laRSkpIHsKKworCQkJCXBkZXYgPSBjb250YWluZXJfb2YoZGV2LAorCQkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOworCQkJCWRldl9tYXBbaV0ucnRuKHBkZXYpOworCQkJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfTVREX1BIWVNNQVAKKworI2lmbmRlZiBNQgorI2RlZmluZSBNQgkoMSA8PCAyMCkKKyNlbmRpZgorCisvKgorICogTVREIExheW91dC4KKyAqCisgKiBGTEFTSCBBbW91bnQ6CTB4ZmYwMDAwMDAgLSAweGZmZmZmZmZmCisgKiAtLS0tLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXNlcnZlZDoJCTB4ZmYwMDAwMDAgLSAweGZmMDNmZmZmCisgKiBKRkZTMiBmaWxlIHN5c3RlbToJMHhmZjA0MDAwMCAtIDB4ZmZlZmZmZmYKKyAqIFUtYm9vdDoJCTB4ZmZmMDAwMDAgLSAweGZmZmZmZmZmCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CitldjY0MzYwX3NldHVwX210ZCh2b2lkKQoreworCXUzMglzaXplOworCWludAlwdGJsX2VudHJpZXM7CisJc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uCSpwdGJsOworCisJc2l6ZSA9IGV2NjQzNjBfZmxhc2hfc2l6ZV8wICsgZXY2NDM2MF9mbGFzaF9zaXplXzE7CisJaWYgKCFzaXplKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXB0YmxfZW50cmllcyA9IDM7CisKKwlpZiAoKHB0YmwgPSBrbWFsbG9jKHB0YmxfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgbXRkX3BhcnRpdGlvbiksCisJCUdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgYWxsb2MgTVREIHBhcnRpdGlvbiB0YWJsZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocHRibCwgMCwgcHRibF9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBtdGRfcGFydGl0aW9uKSk7CisKKwlwdGJsWzBdLm5hbWUgPSAicmVzZXJ2ZWQiOworCXB0YmxbMF0ub2Zmc2V0ID0gMDsKKwlwdGJsWzBdLnNpemUgPSBFVjY0MzYwX01URF9SRVNFUlZFRF9TSVpFOworCXB0YmxbMV0ubmFtZSA9ICJqZmZzMiI7CisJcHRibFsxXS5vZmZzZXQgPSBFVjY0MzYwX01URF9SRVNFUlZFRF9TSVpFOworCXB0YmxbMV0uc2l6ZSA9IEVWNjQzNjBfTVREX0pGRlMyX1NJWkU7CisJcHRibFsyXS5uYW1lID0gIlUtQk9PVCI7CisJcHRibFsyXS5vZmZzZXQgPSBFVjY0MzYwX01URF9SRVNFUlZFRF9TSVpFICsgRVY2NDM2MF9NVERfSkZGUzJfU0laRTsKKwlwdGJsWzJdLnNpemUgPSBFVjY0MzYwX01URF9VQk9PVF9TSVpFOworCisJcGh5c21hcF9tYXAuc2l6ZSA9IHNpemU7CisJcGh5c21hcF9zZXRfcGFydGl0aW9ucyhwdGJsLCBwdGJsX2VudHJpZXMpOworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKGV2NjQzNjBfc2V0dXBfbXRkKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZXY2NDM2MF9yZXN0YXJ0KGNoYXIgKmNtZCkKK3sKKwl1bG9uZwlpID0gMHhmZmZmZmZmZjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICogcnRjX2Jhc2UgPSBpb3JlbWFwKEVWNjQzNjBfUlRDX1dJTkRPV19CQVNFLDB4NDAwMCk7CisKKwkvKiBpc3N1ZSBoYXJkIHJlc2V0ICovCisJcnRjX2Jhc2VbMHhmXSA9IDB4ODA7CisJcnRjX2Jhc2VbMHhjXSA9IDB4MDA7CisJcnRjX2Jhc2VbMHhkXSA9IDB4MDE7CisJcnRjX2Jhc2VbMHhmXSA9IDB4ODM7CisKKwl3aGlsZSAoaS0tID4gMCkgOworCXBhbmljKCJyZXN0YXJ0IGZhaWxlZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitldjY0MzYwX2hhbHQodm9pZCkKK3sKKwl3aGlsZSAoMSkgOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHZvaWQKK2V2NjQzNjBfcG93ZXJfb2ZmKHZvaWQpCit7CisJZXY2NDM2MF9oYWx0KCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitzdGF0aWMgaW50CitldjY0MzYwX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJc2VxX3ByaW50ZihtLCAidmVuZG9yXHRcdDogIiBCT0FSRF9WRU5ET1IgIlxuIik7CisJc2VxX3ByaW50ZihtLCAibWFjaGluZVx0XHQ6ICIgQk9BUkRfTUFDSElORSAiXG4iKTsKKwlzZXFfcHJpbnRmKG0sICJidXMgc3BlZWRcdDogJWRNSHpcbiIsIGV2NjQzNjBfYnVzX2ZyZXF1ZW5jeS8xMDAwLzEwMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorZXY2NDM2MF9jYWxpYnJhdGVfZGVjcih2b2lkKQoreworCXUzMiBmcmVxOworCisJZnJlcSA9IGV2NjQzNjBfYnVzX2ZyZXF1ZW5jeSAvIDQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJ0aW1lX2luaXQ6IGRlY3JlbWVudGVyIGZyZXF1ZW5jeSA9ICVsdS4lLjZsdSBNSHpcbiIsCisJICAgICAgIChsb25nKWZyZXEgLyAxMDAwMDAwLCAobG9uZylmcmVxICUgMTAwMDAwMCk7CisKKwl0Yl90aWNrc19wZXJfamlmZnkgPSBmcmVxIC8gSFo7CisJdGJfdG9fdXMgPSBtdWxod3Vfc2NhbGVfZmFjdG9yKGZyZXEsIDEwMDAwMDApOworfQorCit1bnNpZ25lZCBsb25nIF9faW5pdAorZXY2NDM2MF9maW5kX2VuZF9vZl9tZW1vcnkodm9pZCkKK3sKKwlyZXR1cm4gbXY2NHg2MF9nZXRfbWVtX3NpemUoQ09ORklHX01WNjRYNjBfTkVXX0JBU0UsCisJCU1WNjR4NjBfVFlQRV9NVjY0MzYwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitldjY0MzYwX3NldF9iYXQodm9pZCkKK3sKKwltYigpOworCW10c3ByKFNQUk5fREJBVDJVLCAweGYwMDAxZmZlKTsKKwltdHNwcihTUFJOX0RCQVQyTCwgMHhmMDAwMDAyYSk7CisJbWIoKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9URVhUX0RFQlVHKSAmJiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVBTQ19DT05TT0xFKQorc3RhdGljIHZvaWQgX19pbml0CitldjY0MzYwX21hcF9pbyh2b2lkKQoreworCWlvX2Jsb2NrX21hcHBpbmcoQ09ORklHX01WNjRYNjBfTkVXX0JBU0UsIFwKKwkJCSBDT05GSUdfTVY2NFg2MF9ORVdfQkFTRSwgXAorCQkJIDB4MDAwMjAwMDAsIF9QQUdFX0lPKTsKK30KKyNlbmRpZgorCit2b2lkIF9faW5pdAorcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCSAgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpCit7CisJcGFyc2VfYm9vdGluZm8oZmluZF9ib290aW5mbygpKTsKKworCS8qIEFTU1VNUFRJT046ICBJZiBib3RoIHIzIChiZF90IHBvaW50ZXIpIGFuZCByNiAoY21kbGluZSBwb2ludGVyKQorCSAqIGFyZSBub24temVybywgdGhlbiB3ZSBzaG91bGQgdXNlIHRoZSBib2FyZCBpbmZvIGZyb20gdGhlIGJkX3QKKwkgKiBzdHJ1Y3R1cmUgYW5kIHRoZSBjbWRsaW5lIHBvaW50ZWQgdG8gYnkgcjYgaW5zdGVhZCBvZiB0aGUKKwkgKiBpbmZvcm1hdGlvbiBmcm9tIGJpcmVjcywgaWYgYW55LiAgT3RoZXJ3aXNlLCB1c2UgdGhlIGluZm9ybWF0aW9uCisJICogZnJvbSBiaXJlY3MgYXMgZGlzY292ZXJlZCBieSB0aGUgcHJlY2VlZGluZyBjYWxsIHRvCisJICogcGFyc2VfYm9vdGluZm8oKS4gIFRoaXMgcnVsZSBzaG91bGQgd29yayB3aXRoIGJvdGggUFBDQm9vdCwgd2hpY2gKKwkgKiB1c2VzIGEgYmRfdCBib2FyZCBpbmZvIHN0cnVjdHVyZSwgYW5kIHRoZSBrZXJuZWwgYm9vdCB3cmFwcGVyLAorCSAqIHdoaWNoIHVzZXMgYmlyZWNzLgorCSAqLworCWlmIChyMyAmJiByNikgeworCQkvKiBjb3B5IGJvYXJkIGluZm8gc3RydWN0dXJlICovCisJCW1lbWNweSggKHZvaWQgKilfX3Jlcywodm9pZCAqKShyMytLRVJORUxCQVNFKSwgc2l6ZW9mKGJkX3QpICk7CisJCS8qIGNvcHkgY29tbWFuZCBsaW5lICovCisJCSooY2hhciAqKShyNytLRVJORUxCQVNFKSA9IDA7CisJCXN0cmNweShjbWRfbGluZSwgKGNoYXIgKikocjYrS0VSTkVMQkFTRSkpOworCX0KKwkjaWZkZWYgQ09ORklHX0lTQQorCWlzYV9tZW1fYmFzZSA9IDA7CisJI2VuZGlmCisKKwlwcGNfbWQuc2V0dXBfYXJjaCA9IGV2NjQzNjBfc2V0dXBfYXJjaDsKKwlwcGNfbWQuc2hvd19jcHVpbmZvID0gZXY2NDM2MF9zaG93X2NwdWluZm87CisJcHBjX21kLmluaXRfSVJRID0gbXY2NDM2MF9pbml0X2lycTsKKwlwcGNfbWQuZ2V0X2lycSA9IG12NjQzNjBfZ2V0X2lycTsKKwlwcGNfbWQucmVzdGFydCA9IGV2NjQzNjBfcmVzdGFydDsKKwlwcGNfbWQucG93ZXJfb2ZmID0gZXY2NDM2MF9wb3dlcl9vZmY7CisJcHBjX21kLmhhbHQgPSBldjY0MzYwX2hhbHQ7CisJcHBjX21kLmZpbmRfZW5kX29mX21lbW9yeSA9IGV2NjQzNjBfZmluZF9lbmRfb2ZfbWVtb3J5OworCXBwY19tZC5jYWxpYnJhdGVfZGVjciA9IGV2NjQzNjBfY2FsaWJyYXRlX2RlY3I7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRykgJiYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01QU0NfQ09OU09MRSkKKwlwcGNfbWQuc2V0dXBfaW9fbWFwcGluZ3MgPSBldjY0MzYwX21hcF9pbzsKKwlwcGNfbWQucHJvZ3Jlc3MgPSBtdjY0eDYwX21wc2NfcHJvZ3Jlc3M7CisJbXY2NHg2MF9wcm9ncmVzc19pbml0KENPTkZJR19NVjY0WDYwX05FV19CQVNFKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01QU0MpIHx8IGRlZmluZWQoQ09ORklHX01WNjQzWFhfRVRIKQorCXBsYXRmb3JtX25vdGlmeSA9IGV2NjQzNjBfcGxhdGZvcm1fbm90aWZ5OworI2VuZGlmCisKKwlldjY0MzYwX3NldF9iYXQoKTsgLyogTmVlZCBmb3IgZXY2NDM2MF9maW5kX2VuZF9vZl9tZW1vcnkgYW5kIHByb2dyZXNzICovCit9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvZXY2NDM2MC5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2V2NjQzNjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGVhYmU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2V2NjQzNjAuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIGFyY2gvcHBjL3BsYXRmb3Jtcy9ldjY0MzYwLmgKKyAqCisgKiBEZWZpbml0aW9ucyBmb3IgTWFydmVsbCBFVi02NDM2MC1CUCBFdmFsdWF0aW9uIEJvYXJkLgorICoKKyAqIEF1dGhvcjogTGVlIE5pY2tzIDxhbGxpbnV4QGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGRvbmUgYnkgUmFiZWVoIEtob3VyeSAtIHJhYmVlaEBnYWxpbGVvLmNvLmlsCisgKiBCYXNlZCBvbiBjb2RlIGRvbmUgYnkgTWFyayBBLiBHcmVlciA8bWdyZWVyQG12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKgorICogVGhlIE1WNjQzNjAgaGFzIDIgUENJIGJ1c2VzIGVhY2ggd2l0aCAxIHdpbmRvdyBmcm9tIHRoZSBDUFUgYnVzIHRvCisgKiBQQ0kgSS9PIHNwYWNlIGFuZCA0IHdpbmRvd3MgZnJvbSB0aGUgQ1BVIGJ1cyB0byBQQ0kgTUVNIHNwYWNlLgorICogV2UnbGwgb25seSB1c2Ugb25lIFBDSSBNRU0gd2luZG93IG9uIGVhY2ggUENJIGJ1cy4KKyAqCisgKiBUaGlzIGlzIHRoZSBDUFUgcGh5c2ljYWwgbWVtb3J5IG1hcCAod2luZG93cyBtdXN0IGJlIGF0IGxlYXN0IDY0S0IgYW5kIHN0YXJ0CisgKiBvbiBhIGJvdW5kYXJ5IHRoYXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUgd2luZG93IHNpemUpOgorICoKKyAqICAgIDB4NDIwMDAwMDAtMHg0MjAzZmZmZiAgICAgIC0gSW50ZXJuYWwgU1JBTQorICogICAgMHhmMTAwMDAwMC0weGYxMDBmZmZmICAgICAgLSBNVjY0MzYwIFJlZ2lzdGVycyAoQ09ORklHX01WNjRYNjBfTkVXX0JBU0UpCisgKiAgICAweGZjODAwMDAwLTB4ZmNmZmZmZmYgICAgICAtIFJUQworICogICAgMHhmZjAwMDAwMC0weGZmZmZmZmZmICAgICAgLSBCb290IHdpbmRvdywgMTYgTUIgZmxhc2gKKyAqICAgIDB4YzAwMDAwMDAtMHhjM2ZmZmZmZiAgICAgIC0gUENJIEkvTyAoc2Vjb25kIGhvc2UpCisgKiAgICAweDgwMDAwMDAwLTB4YmZmZmZmZmYgICAgICAtIFBDSSBNRU0gKHNlY29uZCBob3NlKQorICovCisKKyNpZm5kZWYgX19QUENfUExBVEZPUk1TX0VWNjQzNjBfSAorI2RlZmluZSBfX1BQQ19QTEFURk9STVNfRVY2NDM2MF9ICisKKy8qIENQVSBQaHlzaWNhbCBNZW1vcnkgTWFwIHNldHVwLiAqLworI2RlZmluZSBFVjY0MzYwX0JPT1RfV0lORE9XX0JBU0UJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgRVY2NDM2MF9CT09UX1dJTkRPV19TSVpFCQkweDAxMDAwMDAwIC8qIDE2IE1CICovCisjZGVmaW5lIEVWNjQzNjBfSU5URVJOQUxfU1JBTV9CQVNFCQkweDQyMDAwMDAwCisjZGVmaW5lIEVWNjQzNjBfUlRDX1dJTkRPV19CQVNFCQkJMHhmYzgwMDAwMAorI2RlZmluZSBFVjY0MzYwX1JUQ19XSU5ET1dfU0laRQkJCTB4MDA4MDAwMDAgLyogOCBNQiAqLworCisjZGVmaW5lIEVWNjQzNjBfUENJMV9NRU1fU1RBUlRfUFJPQ19BRERSCTB4ODAwMDAwMDAKKyNkZWZpbmUgRVY2NDM2MF9QQ0kxX01FTV9TVEFSVF9QQ0lfSElfQUREUgkweDAwMDAwMDAwCisjZGVmaW5lIEVWNjQzNjBfUENJMV9NRU1fU1RBUlRfUENJX0xPX0FERFIJMHg4MDAwMDAwMAorI2RlZmluZSBFVjY0MzYwX1BDSTFfTUVNX1NJWkUJCQkweDQwMDAwMDAwIC8qIDEgR0IgKi8KKyNkZWZpbmUgRVY2NDM2MF9QQ0kxX0lPX1NUQVJUX1BST0NfQUREUgkJMHhjMDAwMDAwMAorI2RlZmluZSBFVjY0MzYwX1BDSTFfSU9fU1RBUlRfUENJX0FERFIJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRVY2NDM2MF9QQ0kxX0lPX1NJWkUJCQkweDA0MDAwMDAwIC8qIDY0IE1CICovCisKKyNkZWZpbmUJRVY2NDM2MF9ERUZBVUxUX0JBVUQJCQkxMTUyMDAKKyNkZWZpbmUJRVY2NDM2MF9NUFNDX0NMS19TUkMJCQk4CSAgLyogVENMSyAqLworI2RlZmluZSBFVjY0MzYwX01QU0NfQ0xLX0ZSRVEJCQkxMzMzMzMzMzMKKworI2RlZmluZQlFVjY0MzYwX01URF9SRVNFUlZFRF9TSVpFCQkweDQwMDAwCisjZGVmaW5lIEVWNjQzNjBfTVREX0pGRlMyX1NJWkUJCQkweGVjMDAwMAorI2RlZmluZSBFVjY0MzYwX01URF9VQk9PVF9TSVpFCQkJMHgxMDAwMDAKKworI2RlZmluZQlFVjY0MzYwX0VUSDBfUEhZX0FERFIJCQk4CisjZGVmaW5lCUVWNjQzNjBfRVRIMV9QSFlfQUREUgkJCTkKKyNkZWZpbmUJRVY2NDM2MF9FVEgyX1BIWV9BRERSCQkJMTAKKworI2RlZmluZSBFVjY0MzYwX0VUSF9UWF9RVUVVRV9TSVpFCQk4MDAKKyNkZWZpbmUgRVY2NDM2MF9FVEhfUlhfUVVFVUVfU0laRQkJNDAwCisKKyNkZWZpbmUJRVY2NDM2MF9FVEhfUE9SVF9DT05GSUdfVkFMVUUJCQlcCisJRVRIX1VOSUNBU1RfTk9STUFMX01PREUJCQl8CVwKKwlFVEhfREVGQVVMVF9SWF9RVUVVRV8wCQkJfAlcCisJRVRIX0RFRkFVTFRfUlhfQVJQX1FVRVVFXzAJCXwJXAorCUVUSF9SRUNFSVZFX0JDX0lGX05PVF9JUF9PUl9BUlAJCXwJXAorCUVUSF9SRUNFSVZFX0JDX0lGX0lQCQkJfAlcCisJRVRIX1JFQ0VJVkVfQkNfSUZfQVJQCQkJfAlcCisJRVRIX0NBUFRVUkVfVENQX0ZSQU1FU19ESVMJCXwJXAorCUVUSF9DQVBUVVJFX1VEUF9GUkFNRVNfRElTCQl8CVwKKwlFVEhfREVGQVVMVF9SWF9UQ1BfUVVFVUVfMAkJfAlcCisJRVRIX0RFRkFVTFRfUlhfVURQX1FVRVVFXzAJCXwJXAorCUVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfMAorCisjZGVmaW5lCUVWNjQzNjBfRVRIX1BPUlRfQ09ORklHX0VYVEVORF9WQUxVRQkJXAorCUVUSF9TUEFOX0JQRFVfUEFDS0VUU19BU19OT1JNQUwJCXwJXAorCUVUSF9QQVJUSVRJT05fRElTQUJMRQorCisjZGVmaW5lCUdUX0VUSF9JUEdfSU5UX1JYKHZhbHVlKQkJCVwKKwkoKHZhbHVlICYgMHgzZmZmKSA8PCA4KQorCisjZGVmaW5lCUVWNjQzNjBfRVRIX1BPUlRfU0RNQV9DT05GSUdfVkFMVUUJCVwKKwlFVEhfUlhfQlVSU1RfU0laRV80XzY0QklUCQl8CVwKKwlHVF9FVEhfSVBHX0lOVF9SWCgwKQkJCXwJXAorCUVUSF9UWF9CVVJTVF9TSVpFXzRfNjRCSVQKKworI2RlZmluZQlFVjY0MzYwX0VUSF9QT1JUX1NFUklBTF9DT05UUk9MX1ZBTFVFCQlcCisJRVRIX0ZPUkNFX0xJTktfUEFTUwkJCXwJXAorCUVUSF9FTkFCTEVfQVVUT19ORUdfRk9SX0RVUExYCQl8CVwKKwlFVEhfRElTQUJMRV9BVVRPX05FR19GT1JfRkxPV19DVFJMCXwJXAorCUVUSF9BRFZfU1lNTUVUUklDX0ZMT1dfQ1RSTAkJfAlcCisJRVRIX0ZPUkNFX0ZDX01PREVfTk9fUEFVU0VfRElTX1RYCXwJXAorCUVUSF9GT1JDRV9CUF9NT0RFX05PX0pBTQkJfAlcCisJQklUOQkJCQkJfAlcCisJRVRIX0RPX05PVF9GT1JDRV9MSU5LX0ZBSUwJCXwJXAorCUVUSF9SRVRSQU5TTUlUXzE2X0FUVEVNUFRTCQl8CVwKKwlFVEhfRU5BQkxFX0FVVE9fTkVHX1NQRUVEX0dNSUkJCXwJXAorCUVUSF9EVEVfQURWXzAJCQkJfAlcCisJRVRIX0RJU0FCTEVfQVVUT19ORUdfQllQQVNTCQl8CVwKKwlFVEhfQVVUT19ORUdfTk9fQ0hBTkdFCQkJfAlcCisJRVRIX01BWF9SWF9QQUNLRVRfOTcwMEJZVEUJCXwJXAorCUVUSF9DTFJfRVhUX0xPT1BCQUNLCQkJfAlcCisJRVRIX1NFVF9GVUxMX0RVUExFWF9NT0RFCQl8CVwKKwlFVEhfRU5BQkxFX0ZMT1dfQ1RSTF9UWF9SWF9JTl9GVUxMX0RVUExFWAorCitzdGF0aWMgaW5saW5lIHUzMgorZXY2NDM2MF9idXNfZnJlcSh2b2lkKQoreworCXJldHVybiAxMzMzMzMzMzM7Cit9CisKKyNlbmRpZgkvKiBfX1BQQ19QTEFURk9STVNfRVY2NDM2MF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvaGRwdS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2hkcHUuYwppbmRleCBiNjU5ZDdiLi5mZjM3OTY4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvaGRwdS5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9oZHB1LmMKQEAgLTU4LDcgKzU4LDcgQEAKIHN0YXRpYyB2b2lkIGhkcHVfc2V0X2wxcGUodm9pZCk7CiBzdGF0aWMgdm9pZCBoZHB1X2NwdXN0YXRlX3NldCh1bnNpZ25lZCBjaGFyIG5ld19zdGF0ZSk7CiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIHNwaW5sb2NrX3QgdGltZWJhc2VfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGltZWJhc2VfbG9jayk7CiBzdGF0aWMgdW5zaWduZWQgaW50IHRpbWViYXNlX3VwcGVyID0gMCwgdGltZWJhc2VfbG93ZXIgPSAwOwogZXh0ZXJuIGludCBzbXBfdGJfc3luY2hyb25pemVkOwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvazIuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9rMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNiNDM4Li4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9rMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEzICswLDAgQEAKLS8qCi0gKiBhcmNoL3BwYy9wbGF0Zm9ybXMvazIuYwotICoKLSAqIEJvYXJkIHNldHVwIHJvdXRpbmVzIGZvciBTQlMgSzIKLSAqCi0gKiBBdXRob3I6IE1hdHQgUG9ydGVyIDxtcG9ydGVyQG12aXN0YS5jb20+Ci0gKgotICogVXBkYXRlZCBieTogUmFuZHkgVmluc29uIDxydmluc29uQG12aXN0YS5jb20uCi0gKgotICogMjAwMS0yMDA0IChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQotICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCi0gKiBvciBpbXBsaWVkLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaWRlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vdGltZS5oPgotI2luY2x1ZGUgPGFzbS9pODI1OS5oPgotI2luY2x1ZGUgPGFzbS90b2RjLmg+Ci0jaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+Ci0KLSNpbmNsdWRlIDxzeXNsaWIvY3BjNzEwLmg+Ci0jaW5jbHVkZSAiazIuaCIKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OwotZXh0ZXJuIHZvaWQgZ2VuNTUwX3Byb2dyZXNzKGNoYXIgKiwgdW5zaWduZWQgc2hvcnQpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNwdV83eHhbMTZdID0gewotCTAsIDE1LCAxNCwgMCwgMCwgMTMsIDUsIDksIDYsIDExLCA4LCAxMCwgMTYsIDEyLCA3LCAwCi19Owotc3RhdGljIHVuc2lnbmVkIGludCBjcHVfNnh4WzE2XSA9IHsKLQkwLCAwLCAxNCwgMCwgMCwgMTMsIDUsIDksIDYsIDExLCA4LCAxMCwgMCwgMTIsIDcsIDAKLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50IF9faW5pdAotazJfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyIGlkc2VsLCB1bnNpZ25lZCBjaGFyIHBpbikKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoZGV2LT5idXMtPm51bWJlcik7Ci0JLyoKLQkgKiBDaGVjayBvdXIgaG9zZSBpbmRleC4gIElmIHdlIGFyZSB6ZXJvIHRoZW4gd2UgYXJlIG9uIHRoZQotCSAqIGxvY2FsIFBDSSBob3NlLCBvdGhlcndpc2Ugd2UgYXJlIG9uIHRoZSBjUENJIGhvc2UuCi0JICovCi0JaWYgKCFob3NlLT5pbmRleCkgewotCQlzdGF0aWMgY2hhciBwY2lfaXJxX3RhYmxlW11bNF0gPQotCQkJLyoKLQkJCSAqIAlQQ0kgSURTRUwvSU5UUElOLT5JTlRMSU5FCi0JCQkgKiAJQQlCCUMJRAotCQkJICovCi0JCXsKLQkJCXsxLCAJMCwJMCwJMH0sCS8qIEV0aGVybmV0ICovCi0JCQl7NSwJNSwJNSwJNX0sCS8qIFBNQyBTaXRlIDEgKi8KLQkJCXs2LAk2LAk2LAk2fSwJLyogUE1DIFNpdGUgMiAqLwotCQkJezAsICAgICAwLCAgICAgIDAsICAgICAgMH0sICAgICAvKiB1bnVzZWQgKi8KLQkJCXswLCAgICAgMCwgICAgICAwLCAgICAgIDB9LCAgICAgLyogdW51c2VkICovCi0JCQl7MCwgICAgIDAsICAgICAgMCwgICAgICAwfSwgICAgIC8qIFBDSS1JU0EgQnJpZGdlICovCi0JCQl7MCwgICAgIDAsICAgICAgMCwgICAgICAwfSwgICAgIC8qIHVudXNlZCAqLwotCQkJezAsICAgICAwLCAgICAgIDAsICAgICAgMH0sICAgICAvKiB1bnVzZWQgKi8KLQkJCXswLCAgICAgMCwgICAgICAwLCAgICAgIDB9LCAgICAgLyogdW51c2VkICovCi0JCQl7MCwgICAgIDAsICAgICAgMCwgICAgICAwfSwgICAgIC8qIHVudXNlZCAqLwotCQkJezAsICAgICAwLCAgICAgIDAsICAgICAgMH0sICAgICAvKiB1bnVzZWQgKi8KLQkJCXswLCAgICAgMCwgICAgICAwLCAgICAgIDB9LCAgICAgLyogdW51c2VkICovCi0JCQl7MCwgICAgIDAsICAgICAgMCwgICAgICAwfSwgICAgIC8qIHVudXNlZCAqLwotCQkJezAsICAgICAwLCAgICAgIDAsICAgICAgMH0sICAgICAvKiB1bnVzZWQgKi8KLQkJCXsxNSwJMCwJMCwJMH0sCS8qIE01MjI5IElERSAqLwotCQl9OwotCQljb25zdCBsb25nIG1pbl9pZHNlbCA9IDMsIG1heF9pZHNlbCA9IDE3LCBpcnFzX3Blcl9zbG90ID0gNDsKLQkJcmV0dXJuIFBDSV9JUlFfVEFCTEVfTE9PS1VQOwotCX0gZWxzZSB7Ci0JCXN0YXRpYyBjaGFyIHBjaV9pcnFfdGFibGVbXVs0XSA9Ci0JCS8qCi0JCSAqIAlQQ0kgSURTRUwvSU5UUElOLT5JTlRMSU5FCi0JCSAqIAlBCUIJQwlECi0JCSAqLwotCQl7Ci0JCQl7MTAsIAkxMSwJMTIsCTl9LAkvKiBjUENJIHNsb3QgOCAqLwotCQkJezExLCAJMTIsCTksCTEwfSwJLyogY1BDSSBzbG90IDcgKi8KLQkJCXsxMiwgCTksCTEwLAkxMX0sCS8qIGNQQ0kgc2xvdCA2ICovCi0JCQl7OSwgCTEwLAkxMSwJMTJ9LAkvKiBjUENJIHNsb3QgNSAqLwotCQkJezEwLCAJMTEsCTEyLAk5fSwJLyogY1BDSSBzbG90IDQgKi8KLQkJCXsxMSwgCTEyLAk5LAkxMH0sCS8qIGNQQ0kgc2xvdCAzICovCi0JCQl7MTIsIAk5LAkxMCwJMTF9LAkvKiBjUENJIHNsb3QgMiAqLwotCQl9OwotCQljb25zdCBsb25nIG1pbl9pZHNlbCA9IDE1LCBtYXhfaWRzZWwgPSAyMSwgaXJxc19wZXJfc2xvdCA9IDQ7Ci0JCXJldHVybiBQQ0lfSVJRX1RBQkxFX0xPT0tVUDsKLQl9Ci19Ci0KLXZvaWQgazJfcGNpYmlvc19maXh1cCh2b2lkKQotewotI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSURFKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lERV9NT0RVTEUpCi0Jc3RydWN0IHBjaV9kZXYgKmlkZV9kZXY7Ci0KLQkvKgotCSAqIEVuYWJsZSBETUEgc3VwcG9ydCBvbiBoZGMKLQkgKi8KLQlpZGVfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwKLQkJCQkgIFBDSV9ERVZJQ0VfSURfQUxfTTUyMjksIE5VTEwpOwotCi0JaWYgKGlkZV9kZXYpIHsKLQotCQl1bnNpZ25lZCBsb25nIGlkZV9kbWFfYmFzZTsKLQotCQlpZGVfZG1hX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoaWRlX2RldiwgNCk7Ci0JCW91dGIoMHgwMCwgaWRlX2RtYV9iYXNlICsgMHgyKTsKLQkJb3V0YigweDIwLCBpZGVfZG1hX2Jhc2UgKyAweGEpOwotCQlwY2lfZGV2X3B1dChpZGVfZGV2KTsKLQl9Ci0jZW5kaWYKLX0KLQotdm9pZCBrMl9wY2liaW9zX2ZpeHVwX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCWludCBpOwotCi0JaWYgKChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lCTSkgJiYKLQkgICAgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSUJNX0NQQzcxMF9QQ0k2NCkpIHsKLQkJcHJfZGVidWcoIkZpeHVwIENQQzcxMCByZXNvdXJjZXNcbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsKLQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPSAwOwotCQkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgPSAwOwotCQl9Ci0JfQotfQotCi12b2lkIGsyX3NldHVwX2hvc2VzKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlX2EsICpob3NlX2I7Ci0KLQkvKgotCSAqIFJlY29uZmlndXJlIENQQzcxMCBtZW1vcnkgbWFwIHNvCi0JICogd2UgaGF2ZSBzb21lIG1vcmUgUENJIG1lbW9yeSBzcGFjZS4KLQkgKi8KLQotCS8qIFNldCBGUEhCIG1vZGUgKi8KLQlfX3Jhd193cml0ZWwoMHg4MDgwMDBlMCwgUEdDSFApOwkvKiBTZXQgRlBIQiBtb2RlICovCi0KLQkvKiBQQ0kzMiBtYXBwaW5ncyAqLwotCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAwLCBLMl9QQ0kzMl9CQVIgKyBQSUJBUik7CS8qIFBDSSBJL08gYmFzZSAqLwotCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAwLCBLMl9QQ0kzMl9CQVIgKyBQTUJBUik7CS8qIFBDSSBNZW0gYmFzZSAqLwotCV9fcmF3X3dyaXRlbCgweGYwMDAwMDAwLCBLMl9QQ0kzMl9CQVIgKyBNU0laRSk7CS8qIDI1Nk1CICovCi0JX19yYXdfd3JpdGVsKDB4ZmZmMDAwMDAsIEsyX1BDSTMyX0JBUiArIElPU0laRSk7IC8qIDFNQiAqLwotCV9fcmF3X3dyaXRlbCgweGMwMDAwMDAwLCBLMl9QQ0kzMl9CQVIgKyBTTUJBUik7CS8qIEJhc2VAMHhjMDAwMDAwMCAqLwotCV9fcmF3X3dyaXRlbCgweDgwMDAwMDAwLCBLMl9QQ0kzMl9CQVIgKyBTSUJBUik7CS8qIEJhc2VAMHg4MDAwMDAwMCAqLwotCV9fcmF3X3dyaXRlbCgweDAwMDAwMGMwLCBLMl9QQ0kzMl9CQVIgKyBQU1NJWkUpOyAvKiAxR0Igc3BhY2UgKi8KLQlfX3Jhd193cml0ZWwoMHgwMDAwMDBjMCwgSzJfUENJMzJfQkFSICsgUFBTSVpFKTsgLyogMUdCIHNwYWNlICovCi0JX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIEsyX1BDSTMyX0JBUiArIEJBUlBTKTsJLyogQmFzZUAweDAwMDAwMDAwICovCi0JX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIEsyX1BDSTMyX0JBUiArIEJBUlBQKTsJLyogQmFzZUAweDAwMDAwMDAwICovCi0JX19yYXdfd3JpdGVsKDB4MDAwMDAwODAsIEsyX1BDSTMyX0JBUiArIFBTQkFSKTsJLyogQmFzZUAweDgwICovCi0JX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIEsyX1BDSTMyX0JBUiArIFBQQkFSKTsKLQotCV9fcmF3X3dyaXRlbCgweGMwMDAwMDAwLCBLMl9QQ0kzMl9CQVIgKyBCUE1ETEspOwotCV9fcmF3X3dyaXRlbCgweGQwMDAwMDAwLCBLMl9QQ0kzMl9CQVIgKyBUUE1ETEspOwotCV9fcmF3X3dyaXRlbCgweDgwMDAwMDAwLCBLMl9QQ0kzMl9CQVIgKyBCSU9ETEspOwotCV9fcmF3X3dyaXRlbCgweDgwMTAwMDAwLCBLMl9QQ0kzMl9CQVIgKyBUSU9ETEspOwotCV9fcmF3X3dyaXRlbCgweGUwMDA4MDAwLCBLMl9QQ0kzMl9CQVIgKyBETEtDVFJMKTsKLQlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgSzJfUENJMzJfQkFSICsgRExLREVWKTsKLQotCS8qIFBDSTY0IG1hcHBpbmdzICovCi0JX19yYXdfd3JpdGVsKDB4MDAxMDAwMDAsIEsyX1BDSTY0X0JBUiArIFBJQkFSKTsJLyogUENJIEkvTyBiYXNlICovCi0JX19yYXdfd3JpdGVsKDB4MTAwMDAwMDAsIEsyX1BDSTY0X0JBUiArIFBNQkFSKTsJLyogUENJIE1lbSBiYXNlICovCi0JX19yYXdfd3JpdGVsKDB4ZjAwMDAwMDAsIEsyX1BDSTY0X0JBUiArIE1TSVpFKTsJLyogMjU2TUIgKi8KLQlfX3Jhd193cml0ZWwoMHhmZmYwMDAwMCwgSzJfUENJNjRfQkFSICsgSU9TSVpFKTsgLyogMU1CICovCi0JX19yYXdfd3JpdGVsKDB4ZDAwMDAwMDAsIEsyX1BDSTY0X0JBUiArIFNNQkFSKTsJLyogQmFzZUAweGQwMDAwMDAwICovCi0JX19yYXdfd3JpdGVsKDB4ODAxMDAwMDAsIEsyX1BDSTY0X0JBUiArIFNJQkFSKTsJLyogQmFzZUAweDgwMTAwMDAwICovCi0JX19yYXdfd3JpdGVsKDB4MDAwMDAwYzAsIEsyX1BDSTY0X0JBUiArIFBTU0laRSk7IC8qIDFHQiBzcGFjZSAqLwotCV9fcmF3X3dyaXRlbCgweDAwMDAwMGMwLCBLMl9QQ0k2NF9CQVIgKyBQUFNJWkUpOyAvKiAxR0Igc3BhY2UgKi8KLQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgSzJfUENJNjRfQkFSICsgQkFSUFMpOwkvKiBCYXNlQDB4MDAwMDAwMDAgKi8KLQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgSzJfUENJNjRfQkFSICsgQkFSUFApOwkvKiBCYXNlQDB4MDAwMDAwMDAgKi8KLQotCS8qIFNldHVwIFBDSTMyIGhvc2UgKi8KLQlob3NlX2EgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKLQlpZiAoIWhvc2VfYSkKLQkJcmV0dXJuOwotCi0JaG9zZV9hLT5maXJzdF9idXNubyA9IDA7Ci0JaG9zZV9hLT5sYXN0X2J1c25vID0gMHhmZjsKLQlob3NlX2EtPnBjaV9tZW1fb2Zmc2V0ID0gSzJfUENJMzJfTUVNX0JBU0U7Ci0KLQlwY2lfaW5pdF9yZXNvdXJjZSgmaG9zZV9hLT5pb19yZXNvdXJjZSwKLQkJCSAgSzJfUENJMzJfTE9XRVJfSU8sCi0JCQkgIEsyX1BDSTMyX1VQUEVSX0lPLAotCQkJICBJT1JFU09VUkNFX0lPLCAiUENJMzIgaG9zdCBicmlkZ2UiKTsKLQotCXBjaV9pbml0X3Jlc291cmNlKCZob3NlX2EtPm1lbV9yZXNvdXJjZXNbMF0sCi0JCQkgIEsyX1BDSTMyX0xPV0VSX01FTSArIEsyX1BDSTMyX01FTV9CQVNFLAotCQkJICBLMl9QQ0kzMl9VUFBFUl9NRU0gKyBLMl9QQ0kzMl9NRU1fQkFTRSwKLQkJCSAgSU9SRVNPVVJDRV9NRU0sICJQQ0kzMiBob3N0IGJyaWRnZSIpOwotCi0JaG9zZV9hLT5pb19zcGFjZS5zdGFydCA9IEsyX1BDSTMyX0xPV0VSX0lPOwotCWhvc2VfYS0+aW9fc3BhY2UuZW5kID0gSzJfUENJMzJfVVBQRVJfSU87Ci0JaG9zZV9hLT5tZW1fc3BhY2Uuc3RhcnQgPSBLMl9QQ0kzMl9MT1dFUl9NRU07Ci0JaG9zZV9hLT5tZW1fc3BhY2UuZW5kID0gSzJfUENJMzJfVVBQRVJfTUVNOwotCWhvc2VfYS0+aW9fYmFzZV92aXJ0ID0gKHZvaWQgKilLMl9JU0FfSU9fQkFTRTsKLQotCXNldHVwX2luZGlyZWN0X3BjaShob3NlX2EsIEsyX1BDSTMyX0NPTkZJR19BRERSLCBLMl9QQ0kzMl9DT05GSUdfREFUQSk7Ci0KLQkvKiBJbml0aWFsaXplIFBDSTMyIGJ1cyByZWdpc3RlcnMgKi8KLQllYXJseV93cml0ZV9jb25maWdfYnl0ZShob3NlX2EsCi0JCQkJaG9zZV9hLT5maXJzdF9idXNubywKLQkJCQlQQ0lfREVWRk4oMCwgMCksCi0JCQkJQ1BDNzEwX0JVU19OVU1CRVIsIGhvc2VfYS0+Zmlyc3RfYnVzbm8pOwotCi0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9hLAotCQkJCWhvc2VfYS0+Zmlyc3RfYnVzbm8sCi0JCQkJUENJX0RFVkZOKDAsIDApLAotCQkJCUNQQzcxMF9TVUJfQlVTX05VTUJFUiwgaG9zZV9hLT5sYXN0X2J1c25vKTsKLQotCS8qIEVuYWJsZSBQQ0kgaW50ZXJydXB0IHBvbGxpbmcgKi8KLQllYXJseV93cml0ZV9jb25maWdfYnl0ZShob3NlX2EsCi0JCQkJaG9zZV9hLT5maXJzdF9idXNubywKLQkJCQlQQ0lfREVWRk4oOCwgMCksIDB4NDUsIDB4ODApOwotCi0JLyogUm91dGUgcG9sbGVkIFBDSSBpbnRlcnJ1cHRzICovCi0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9hLAotCQkJCWhvc2VfYS0+Zmlyc3RfYnVzbm8sCi0JCQkJUENJX0RFVkZOKDgsIDApLCAweDQ4LCAweDU4KTsKLQotCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2VfYSwKLQkJCQlob3NlX2EtPmZpcnN0X2J1c25vLAotCQkJCVBDSV9ERVZGTig4LCAwKSwgMHg0OSwgMHgwNyk7Ci0KLQllYXJseV93cml0ZV9jb25maWdfYnl0ZShob3NlX2EsCi0JCQkJaG9zZV9hLT5maXJzdF9idXNubywKLQkJCQlQQ0lfREVWRk4oOCwgMCksIDB4NGEsIDB4MzEpOwotCi0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9hLAotCQkJCWhvc2VfYS0+Zmlyc3RfYnVzbm8sCi0JCQkJUENJX0RFVkZOKDgsIDApLCAweDRiLCAweGI5KTsKLQotCS8qIHJvdXRlIHNlY29uZGFyeSBJREUgY2hhbm5lbCBpbnRlcnJ1cHQgdG8gSVJRIDE1ICovCi0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9hLAotCQkJCWhvc2VfYS0+Zmlyc3RfYnVzbm8sCi0JCQkJUENJX0RFVkZOKDgsIDApLCAweDc1LCAweDBmKTsKLQotCS8qIGVuYWJsZSBJREUgY29udHJvbGxlciBJRFNFTCAqLwotCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2VfYSwKLQkJCQlob3NlX2EtPmZpcnN0X2J1c25vLAotCQkJCVBDSV9ERVZGTig4LCAwKSwgMHg1OCwgMHg0OCk7Ci0KLQkvKiBFbmFibGUgSURFIGZ1bmN0aW9uICovCi0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9hLAotCQkJCWhvc2VfYS0+Zmlyc3RfYnVzbm8sCi0JCQkJUENJX0RFVkZOKDE3LCAwKSwgMHg1MCwgMHgwMyk7Ci0KLQkvKiBTZXQgTTUyMjkgSURFIGNvbnRyb2xsZXIgdG8gbmF0aXZlIG1vZGUgKi8KLQllYXJseV93cml0ZV9jb25maWdfYnl0ZShob3NlX2EsCi0JCQkJaG9zZV9hLT5maXJzdF9idXNubywKLQkJCQlQQ0lfREVWRk4oMTcsIDApLCBQQ0lfQ0xBU1NfUFJPRywgMHhkZik7Ci0KLQlob3NlX2EtPmxhc3RfYnVzbm8gPSBwY2lhdXRvX2J1c19zY2FuKGhvc2VfYSwgaG9zZV9hLT5maXJzdF9idXNubyk7Ci0KLQkvKiBXcml0ZSBvdXQgY29ycmVjdCBtYXggc3Vib3JkaW5hdGUgYnVzIG51bWJlciBmb3IgaG9zZSBBICovCi0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9hLAotCQkJCWhvc2VfYS0+Zmlyc3RfYnVzbm8sCi0JCQkJUENJX0RFVkZOKDAsIDApLAotCQkJCUNQQzcxMF9TVUJfQlVTX05VTUJFUiwgaG9zZV9hLT5sYXN0X2J1c25vKTsKLQotCS8qIE9ubHkgc2V0dXAgUENJNjQgaG9zZSBpZiB3ZSBhcmUgaW4gdGhlIHN5c3RlbSBzbG90ICovCi0JaWYgKCEocmVhZGIoSzJfTUlTQ19SRUcpICYgSzJfU1lTX1NMT1RfTUFTSykpIHsKLQkJLyogU2V0dXAgUENJNjQgaG9zZSAqLwotCQlob3NlX2IgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKLQkJaWYgKCFob3NlX2IpCi0JCQlyZXR1cm47Ci0KLQkJaG9zZV9iLT5maXJzdF9idXNubyA9IGhvc2VfYS0+bGFzdF9idXNubyArIDE7Ci0JCWhvc2VfYi0+bGFzdF9idXNubyA9IDB4ZmY7Ci0KLQkJLyogUmVtaW5kZXI6IHF1aXQgY2hhbmdpbmcgdGhlIGZvbGxvd2luZywgaXQgaXMgY29ycmVjdC4gKi8KLQkJaG9zZV9iLT5wY2lfbWVtX29mZnNldCA9IEsyX1BDSTMyX01FTV9CQVNFOwotCi0JCXBjaV9pbml0X3Jlc291cmNlKCZob3NlX2ItPmlvX3Jlc291cmNlLAotCQkJCSAgSzJfUENJNjRfTE9XRVJfSU8sCi0JCQkJICBLMl9QQ0k2NF9VUFBFUl9JTywKLQkJCQkgIElPUkVTT1VSQ0VfSU8sICJQQ0k2NCBob3N0IGJyaWRnZSIpOwotCi0JCXBjaV9pbml0X3Jlc291cmNlKCZob3NlX2ItPm1lbV9yZXNvdXJjZXNbMF0sCi0JCQkJICBLMl9QQ0k2NF9MT1dFUl9NRU0gKyBLMl9QQ0kzMl9NRU1fQkFTRSwKLQkJCQkgIEsyX1BDSTY0X1VQUEVSX01FTSArIEsyX1BDSTMyX01FTV9CQVNFLAotCQkJCSAgSU9SRVNPVVJDRV9NRU0sICJQQ0k2NCBob3N0IGJyaWRnZSIpOwotCi0JCWhvc2VfYi0+aW9fc3BhY2Uuc3RhcnQgPSBLMl9QQ0k2NF9MT1dFUl9JTzsKLQkJaG9zZV9iLT5pb19zcGFjZS5lbmQgPSBLMl9QQ0k2NF9VUFBFUl9JTzsKLQkJaG9zZV9iLT5tZW1fc3BhY2Uuc3RhcnQgPSBLMl9QQ0k2NF9MT1dFUl9NRU07Ci0JCWhvc2VfYi0+bWVtX3NwYWNlLmVuZCA9IEsyX1BDSTY0X1VQUEVSX01FTTsKLQkJaG9zZV9iLT5pb19iYXNlX3ZpcnQgPSAodm9pZCAqKUsyX0lTQV9JT19CQVNFOwotCi0JCXNldHVwX2luZGlyZWN0X3BjaShob3NlX2IsCi0JCQkJICAgSzJfUENJNjRfQ09ORklHX0FERFIsIEsyX1BDSTY0X0NPTkZJR19EQVRBKTsKLQotCQkvKiBJbml0aWFsaXplIFBDSTY0IGJ1cyByZWdpc3RlcnMgKi8KLQkJZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9iLAotCQkJCQkwLAotCQkJCQlQQ0lfREVWRk4oMCwgMCksCi0JCQkJCUNQQzcxMF9TVUJfQlVTX05VTUJFUiwgMHhmZik7Ci0KLQkJZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9iLAotCQkJCQkwLAotCQkJCQlQQ0lfREVWRk4oMCwgMCksCi0JCQkJCUNQQzcxMF9CVVNfTlVNQkVSLCBob3NlX2ItPmZpcnN0X2J1c25vKTsKLQotCQlob3NlX2ItPmxhc3RfYnVzbm8gPSBwY2lhdXRvX2J1c19zY2FuKGhvc2VfYiwKLQkJCQkJCSAgICAgIGhvc2VfYi0+Zmlyc3RfYnVzbm8pOwotCi0JCS8qIFdyaXRlIG91dCBjb3JyZWN0IG1heCBzdWJvcmRpbmF0ZSBidXMgbnVtYmVyIGZvciBob3NlIEIgKi8KLQkJZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZV9iLAotCQkJCQlob3NlX2ItPmZpcnN0X2J1c25vLAotCQkJCQlQQ0lfREVWRk4oMCwgMCksCi0JCQkJCUNQQzcxMF9TVUJfQlVTX05VTUJFUiwKLQkJCQkJaG9zZV9iLT5sYXN0X2J1c25vKTsKLQotCQkvKiBDb25maWd1cmUgUENJNjQgUFNCQVIgKi8KLQkJZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2VfYiwKLQkJCQkJIGhvc2VfYi0+Zmlyc3RfYnVzbm8sCi0JCQkJCSBQQ0lfREVWRk4oMCwgMCksCi0JCQkJCSBQQ0lfQkFTRV9BRERSRVNTXzAsCi0JCQkJCSBLMl9QQ0k2NF9TWVNfTUVNX0JBU0UpOwotCX0KLQotCS8qIENvbmZpZ3VyZSBpODI1OSBsZXZlbC9lZGdlIHNldHRpbmdzICovCi0Jb3V0YigweDYyLCAweDRkMCk7Ci0Jb3V0YigweGRlLCAweDRkMSk7Ci0KLSNpZmRlZiBDT05GSUdfQ1BDNzEwX0RBVEFfR0FUSEVSSU5HCi0JewotCQl1bnNpZ25lZCBpbnQgdG1wOwotCQl0bXAgPSBfX3Jhd19yZWFkbChBQkNOVEwpOwotCQkvKiBFbmFibGUgZGF0YSBnYXRoZXJpbmcgb24gYm90aCBQQ0kgaW50ZXJmYWNlcyAqLwotCQlfX3Jhd193cml0ZWwodG1wIHwgMHgwNTAwMDAwMCwgQUJDTlRMKTsKLQl9Ci0jZW5kaWYKLQotCXBwY19tZC5wY2liaW9zX2ZpeHVwID0gazJfcGNpYmlvc19maXh1cDsKLQlwcGNfbWQucGNpYmlvc19maXh1cF9yZXNvdXJjZXMgPSBrMl9wY2liaW9zX2ZpeHVwX3Jlc291cmNlczsKLQlwcGNfbWQucGNpX3N3aXp6bGUgPSBjb21tb25fc3dpenpsZTsKLQlwcGNfbWQucGNpX21hcF9pcnEgPSBrMl9tYXBfaXJxOwotfQotCi1zdGF0aWMgaW50IGsyX2dldF9idXNfc3BlZWQodm9pZCkKLXsKLQlpbnQgYnVzX3NwZWVkOwotCXVuc2lnbmVkIGNoYXIgYm9hcmRfaWQ7Ci0KLQlib2FyZF9pZCA9ICoodW5zaWduZWQgY2hhciAqKUsyX0JPQVJEX0lEX1JFRzsKLQotCXN3aXRjaCAoSzJfQlVTX1NQRChib2FyZF9pZCkpIHsKLQotCWNhc2UgMDoKLQlkZWZhdWx0OgotCQlidXNfc3BlZWQgPSAxMDAwMDAwMDA7Ci0JCWJyZWFrOwotCi0JY2FzZSAxOgotCQlidXNfc3BlZWQgPSA4MzMzMzMzMzsKLQkJYnJlYWs7Ci0KLQljYXNlIDI6Ci0JCWJ1c19zcGVlZCA9IDc1MDAwMDAwOwotCQlicmVhazsKLQotCWNhc2UgMzoKLQkJYnVzX3NwZWVkID0gNjY2NjY2NjY7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gYnVzX3NwZWVkOwotfQotCi1zdGF0aWMgaW50IGsyX2dldF9jcHVfc3BlZWQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGhpZDE7Ci0JaW50IGNwdV9zcGVlZDsKLQotCWhpZDEgPSBtZnNwcihTUFJOX0hJRDEpID4+IDI4OwotCi0JaWYgKChtZnNwcihTUFJOX1BWUikgPj4gMTYpID09IDgpCi0JCWhpZDEgPSBjcHVfN3h4W2hpZDFdOwotCWVsc2UKLQkJaGlkMSA9IGNwdV82eHhbaGlkMV07Ci0KLQljcHVfc3BlZWQgPSBrMl9nZXRfYnVzX3NwZWVkKCkgKiBoaWQxIC8gMjsKLQlyZXR1cm4gY3B1X3NwZWVkOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgazJfY2FsaWJyYXRlX2RlY3Iodm9pZCkKLXsKLQlpbnQgZnJlcSwgZGl2aXNvciA9IDQ7Ci0KLQkvKiBkZXRlcm1pbmUgcHJvY2Vzc29yIGJ1cyBzcGVlZCAqLwotCWZyZXEgPSBrMl9nZXRfYnVzX3NwZWVkKCk7Ci0JdGJfdGlja3NfcGVyX2ppZmZ5ID0gZnJlcSAvIEhaIC8gZGl2aXNvcjsKLQl0Yl90b191cyA9IG11bGh3dV9zY2FsZV9mYWN0b3IoZnJlcSAvIGRpdmlzb3IsIDEwMDAwMDApOwotfQotCi1zdGF0aWMgaW50IGsyX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCi17Ci0JdW5zaWduZWQgY2hhciBrMl9nZW9fYml0cywgazJfc3lzdGVtX3Nsb3Q7Ci0KLQlzZXFfcHJpbnRmKG0sICJ2ZW5kb3JcdFx0OiBTQlNcbiIpOwotCXNlcV9wcmludGYobSwgIm1hY2hpbmVcdFx0OiBLMlxuIik7Ci0Jc2VxX3ByaW50ZihtLCAiY3B1IHNwZWVkXHQ6ICVkTWh6XG4iLCBrMl9nZXRfY3B1X3NwZWVkKCkgLyAxMDAwMDAwKTsKLQlzZXFfcHJpbnRmKG0sICJidXMgc3BlZWRcdDogJWRNaHpcbiIsIGsyX2dldF9idXNfc3BlZWQoKSAvIDEwMDAwMDApOwotCXNlcV9wcmludGYobSwgIm1lbW9yeSB0eXBlXHQ6IFNEUkFNXG4iKTsKLQotCWsyX2dlb19iaXRzID0gcmVhZGIoSzJfTVNJWl9HRU9fUkVHKSAmIEsyX0dFT19BRFJfTUFTSzsKLQlrMl9zeXN0ZW1fc2xvdCA9ICEocmVhZGIoSzJfTUlTQ19SRUcpICYgSzJfU1lTX1NMT1RfTUFTSyk7Ci0Jc2VxX3ByaW50ZihtLCAiYmFja3BsYW5lXHQ6ICVzIHNsb3QgYm9hcmQiLAotCQkgICBrMl9zeXN0ZW1fc2xvdCA/ICJTeXN0ZW0iIDogIk5vbiBzeXN0ZW0iKTsKLQlzZXFfcHJpbnRmKG0sICJ3aXRoIGdlb2dyYXBoaWNhbCBhZGRyZXNzICV4XG4iLCBrMl9nZW9fYml0cyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotVE9EQ19BTExPQygpOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgazJfc2V0dXBfYXJjaCh2b2lkKQotewotCXVuc2lnbmVkIGludCBjcHU7Ci0KLQkvKiBTZXR1cCBUT0RDIGFjY2VzcyAqLwotCVRPRENfSU5JVChUT0RDX1RZUEVfTUs0OFQzNywgMCwgMCwKLQkJICBpb3JlbWFwKEsyX1JUQ19CQVNFX0FERFJFU1MsIEsyX1JUQ19TSVpFKSwgOCk7Ci0KLQkvKiBpbml0IHRvIHNvbWUgfnNhbmUgdmFsdWUgdW50aWwgY2FsaWJyYXRlX2RlbGF5KCkgcnVucyAqLwotCWxvb3BzX3Blcl9qaWZmeSA9IDUwMDAwMDAwIC8gSFo7Ci0KLQkvKiBtYWtlIEZMQVNIIHRyYW5zYWN0aW9ucyBoaWdoZXIgcHJpb3JpdHkgdGhhbiBQQ0kgdG8gYXZvaWQgZGVhZGxvY2sgKi8KLQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoU0lPQzEpIHwgMHg4MDAwMDAwMCwgU0lPQzEpOwotCi0JLyogU2V0IGhhcmR3YXJlIHRvIGFjY2VzcyBGTEFTSCBwYWdlIDIgKi8KLQlfX3Jhd193cml0ZWwoMSA8PCAyOSwgR1BPVVQpOwotCi0JLyogU2V0dXAgUENJIGhvc3QgYnJpZGdlcyAqLwotCWsyX3NldHVwX2hvc2VzKCk7Ci0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQlpZiAoaW5pdHJkX3N0YXJ0KQotCQlST09UX0RFViA9IFJvb3RfUkFNMDsKLQllbHNlCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUk9PVF9ORlMKLQkJUk9PVF9ERVYgPSBSb290X05GUzsKLSNlbHNlCi0JCVJPT1RfREVWID0gUm9vdF9IREMxOwotI2VuZGlmCi0KLQkvKiBJZGVudGlmeSB0aGUgc3lzdGVtICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiU3lzdGVtIElkZW50aWZpY2F0aW9uOiBTQlMgSzIgLSBQb3dlclBDIDc1MCBAICIKLQkJCSIlZCBNaHpcbiIsIGsyX2dldF9jcHVfc3BlZWQoKSAvIDEwMDAwMDApOwotCXByaW50ayhLRVJOX0lORk8gIlBvcnQgYnkgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAiCi0JCQkiKHNvdXJjZUBtdmlzdGEuY29tKVxuIik7Ci0KLQkvKiBJZGVudGlmeSB0aGUgQ1BVIG1hbnVmYWN0dXJlciAqLwotCWNwdSA9IFBWUl9SRVYobWZzcHIoU1BSTl9QVlIpKTsKLQlwcmludGsoS0VSTl9JTkZPICJDUFUgbWFudWZhY3R1cmVyOiAlcyBbcmV2PSUwNHhdXG4iLAotCQkJKGNwdSAmICgxIDw8IDE1KSkgPyAiSUJNIiA6ICJNb3Rvcm9sYSIsIGNwdSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGsyX3Jlc3RhcnQoY2hhciAqY21kKQotewotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0KLQkvKiBGbGlwIEZMQVNIIGJhY2sgdG8gcGFnZSAxIHRvIGFjY2VzcyBmaXJtd2FyZSBpbWFnZSAqLwotCV9fcmF3X3dyaXRlbCgwLCBHUE9VVCk7Ci0KLQkvKiBTUlIwIGhhcyBzeXN0ZW0gcmVzZXQgdmVjdG9yLCBTUlIxIGhhcyBkZWZhdWx0IE1TUiB2YWx1ZSAqLwotCS8qIHJmaSByZXN0b3JlcyBNU1IgZnJvbSBTUlIxIGFuZCBzZXRzIHRoZSBQQyB0byB0aGUgU1JSMCB2YWx1ZSAqLwotCW10c3ByKFNQUk5fU1JSMCwgMHhmZmYwMDEwMCk7Ci0JbXRzcHIoU1BSTl9TUlIxLCAwKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmZpXG5cdCIpOwotCi0JLyogbm90IHJlYWNoZWQgKi8KLQlmb3IgKDs7KSA7Ci19Ci0KLXN0YXRpYyB2b2lkIGsyX3Bvd2VyX29mZih2b2lkKQotewotCWZvciAoOzspIDsKLX0KLQotc3RhdGljIHZvaWQgazJfaGFsdCh2b2lkKQotewotCWsyX3Jlc3RhcnQoTlVMTCk7Ci19Ci0KLS8qCi0gKiBTZXQgQkFUIDMgdG8gbWFwIFBDSTMyIEkvTyBzcGFjZS4KLSAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBrMl9zZXRfYmF0KHZvaWQpCi17Ci0JLyogd2FpdCBmb3IgYWxsIG91dHN0YW5kaW5nIG1lbW9yeSBhY2Nlc3NlcyB0byBjb21wbGV0ZSAqLwotCW1iKCk7Ci0KLQkvKiBzZXR1cCBEQkFUcyAqLwotCW10c3ByKFNQUk5fREJBVDJVLCAweDgwMDAxZmZlKTsKLQltdHNwcihTUFJOX0RCQVQyTCwgMHg4MDAwMDAyYSk7Ci0JbXRzcHIoU1BSTl9EQkFUM1UsIDB4ZjAwMDFmZmUpOwotCW10c3ByKFNQUk5fREJBVDNMLCAweGYwMDAwMDJhKTsKLQotCS8qIHdhaXQgZm9yIHVwZGF0ZXMgKi8KLQltYigpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgazJfZmluZF9lbmRfb2ZfbWVtb3J5KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyB0b3RhbDsKLQl1bnNpZ25lZCBjaGFyIG1zaXplID0gNzsJLyogRGVmYXVsdCB0byAxMjhNQiAqLwotCi0JbXNpemUgPSBLMl9NRU1fU0laRShyZWFkYihLMl9NU0laX0dFT19SRUcpKTsKLQotCXN3aXRjaCAobXNpemUpIHsKLQljYXNlIDI6Ci0JCS8qCi0JCSAqIFRoaXMgd2lsbCBicmVhayB3aXRob3V0IGEgbG93ZXJlZAotCQkgKiBLRVJORUxCQVNFIG9yIENPTkZJR19ISUdITUVNIG9uLgotCQkgKiBJdCBzZWVtcyBub24gMUdCIGJ1aWxkcyBleGlzdCB5ZXQsCi0JCSAqIHRob3VnaC4KLQkJICovCi0JCXRvdGFsID0gSzJfTUVNX1NJWkVfMUdCOwotCQlicmVhazsKLQljYXNlIDM6Ci0JY2FzZSA0OgotCQl0b3RhbCA9IEsyX01FTV9TSVpFXzUxMk1COwotCQlicmVhazsKLQljYXNlIDU6Ci0JY2FzZSA2OgotCQl0b3RhbCA9IEsyX01FTV9TSVpFXzI1Nk1COwotCQlicmVhazsKLQljYXNlIDc6Ci0JCXRvdGFsID0gSzJfTUVNX1NJWkVfMTI4TUI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50awotCQkgICAgKCJLMjogSW52YWxpZCBtZW1vcnkgc2l6ZSBkZXRlY3RlZCwgZGVmYXVsdGluZyB0byAxMjhNQlxuIik7Ci0JCXRvdGFsID0gSzJfTUVNX1NJWkVfMTI4TUI7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gdG90YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBrMl9tYXBfaW8odm9pZCkKLXsKLQlpb19ibG9ja19tYXBwaW5nKEsyX1BDSTMyX0lPX0JBU0UsCi0JCQkgSzJfUENJMzJfSU9fQkFTRSwgMHgwMDIwMDAwMCwgX1BBR0VfSU8pOwotCWlvX2Jsb2NrX21hcHBpbmcoMHhmZjAwMDAwMCwgMHhmZjAwMDAwMCwgMHgwMTAwMDAwMCwgX1BBR0VfSU8pOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgazJfaW5pdF9pcnEodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQlpcnFfZGVzY1tpXS5oYW5kbGVyID0gJmk4MjU5X3BpYzsKLQotCWk4MjU5X2luaXQoMCk7Ci19Ci0KLXZvaWQgX19pbml0IHBsYXRmb3JtX2luaXQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwKLQkJCSAgdW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNykKLXsKLQlwYXJzZV9ib290aW5mbygoc3RydWN0IGJpX3JlY29yZCAqKShyMyArIEtFUk5FTEJBU0UpKTsKLQotCWsyX3NldF9iYXQoKTsKLQotCWlzYV9pb19iYXNlID0gSzJfSVNBX0lPX0JBU0U7Ci0JaXNhX21lbV9iYXNlID0gSzJfSVNBX01FTV9CQVNFOwotCXBjaV9kcmFtX29mZnNldCA9IEsyX1BDSTMyX1NZU19NRU1fQkFTRTsKLQotCXBwY19tZC5zZXR1cF9hcmNoID0gazJfc2V0dXBfYXJjaDsKLQlwcGNfbWQuc2hvd19jcHVpbmZvID0gazJfc2hvd19jcHVpbmZvOwotCXBwY19tZC5pbml0X0lSUSA9IGsyX2luaXRfaXJxOwotCXBwY19tZC5nZXRfaXJxID0gaTgyNTlfaXJxOwotCi0JcHBjX21kLmZpbmRfZW5kX29mX21lbW9yeSA9IGsyX2ZpbmRfZW5kX29mX21lbW9yeTsKLQlwcGNfbWQuc2V0dXBfaW9fbWFwcGluZ3MgPSBrMl9tYXBfaW87Ci0KLQlwcGNfbWQucmVzdGFydCA9IGsyX3Jlc3RhcnQ7Ci0JcHBjX21kLnBvd2VyX29mZiA9IGsyX3Bvd2VyX29mZjsKLQlwcGNfbWQuaGFsdCA9IGsyX2hhbHQ7Ci0KLQlwcGNfbWQudGltZV9pbml0ID0gdG9kY190aW1lX2luaXQ7Ci0JcHBjX21kLnNldF9ydGNfdGltZSA9IHRvZGNfc2V0X3J0Y190aW1lOwotCXBwY19tZC5nZXRfcnRjX3RpbWUgPSB0b2RjX2dldF9ydGNfdGltZTsKLQlwcGNfbWQuY2FsaWJyYXRlX2RlY3IgPSBrMl9jYWxpYnJhdGVfZGVjcjsKLQotCXBwY19tZC5udnJhbV9yZWFkX3ZhbCA9IHRvZGNfZGlyZWN0X3JlYWRfdmFsOwotCXBwY19tZC5udnJhbV93cml0ZV92YWwgPSB0b2RjX2RpcmVjdF93cml0ZV92YWw7Ci0KLSNpZmRlZiBDT05GSUdfU0VSSUFMX1RFWFRfREVCVUcKLQlwcGNfbWQucHJvZ3Jlc3MgPSBnZW41NTBfcHJvZ3Jlc3M7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9rMi5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2syLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MzI2YWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL2syLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogYXJjaC9wcGMvcGxhdGZvcm1zL2syLmgKLSAqCi0gKiBEZWZpbml0aW9ucyBmb3IgU0JTIEsyIGJvYXJkIHN1cHBvcnQKLSAqCi0gKiBBdXRob3I6IE1hdHQgUG9ydGVyIDxtcG9ydGVyQG12aXN0YS5jb20+Ci0gKgotICogMjAwMSAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgotICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0KLSAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwotICogb3IgaW1wbGllZC4KLSAqLwotCi0jaWZuZGVmIF9fUFBDX1BMQVRGT1JNU19LMl9ICi0jZGVmaW5lIF9fUFBDX1BMQVRGT1JNU19LMl9ICi0KLS8qCi0gKiBTQlMgSzIgZGVmaW5pdGlvbnMKLSAqLwotCi0jZGVmaW5lCUsyX1BDSTY0X0JBUgkJMHhmZjQwMDAwMAotI2RlZmluZQlLMl9QQ0kzMl9CQVIJCTB4ZmY1MDAwMDAKLQotI2RlZmluZSBLMl9QQ0k2NF9DT05GSUdfQUREUgkoSzJfUENJNjRfQkFSICsgMHgwMDBmODAwMCkKLSNkZWZpbmUgSzJfUENJNjRfQ09ORklHX0RBVEEJKEsyX1BDSTY0X0JBUiArIDB4MDAwZjgwMTApCi0KLSNkZWZpbmUgSzJfUENJMzJfQ09ORklHX0FERFIJKEsyX1BDSTMyX0JBUiArIDB4MDAwZjgwMDApCi0jZGVmaW5lIEsyX1BDSTMyX0NPTkZJR19EQVRBCShLMl9QQ0kzMl9CQVIgKyAweDAwMGY4MDEwKQotCi0jZGVmaW5lIEsyX1BDSTY0X01FTV9CQVNFCTB4ZDAwMDAwMDAKLSNkZWZpbmUgSzJfUENJNjRfSU9fQkFTRQkweDgwMTAwMDAwCi0KLSNkZWZpbmUgSzJfUENJMzJfTUVNX0JBU0UJMHhjMDAwMDAwMAotI2RlZmluZSBLMl9QQ0kzMl9JT19CQVNFCTB4ODAwMDAwMDAKLQotI2RlZmluZSBLMl9QQ0kzMl9TWVNfTUVNX0JBU0UJMHg4MDAwMDAwMAotI2RlZmluZSBLMl9QQ0k2NF9TWVNfTUVNX0JBU0UJSzJfUENJMzJfU1lTX01FTV9CQVNFCi0KLSNkZWZpbmUgSzJfUENJMzJfTE9XRVJfTUVNCTB4MDAwMDAwMDAKLSNkZWZpbmUgSzJfUENJMzJfVVBQRVJfTUVNCTB4MGZmZmZmZmYKLSNkZWZpbmUgSzJfUENJMzJfTE9XRVJfSU8JMHgwMDAwMDAwMAotI2RlZmluZSBLMl9QQ0kzMl9VUFBFUl9JTwkweDAwMGZmZmZmCi0KLSNkZWZpbmUgSzJfUENJNjRfTE9XRVJfTUVNCTB4MTAwMDAwMDAKLSNkZWZpbmUgSzJfUENJNjRfVVBQRVJfTUVNCTB4MWZmZmZmZmYKLSNkZWZpbmUgSzJfUENJNjRfTE9XRVJfSU8JMHgwMDEwMDAwMAotI2RlZmluZQlLMl9QQ0k2NF9VUFBFUl9JTwkweDAwMWZmZmZmCi0KLSNkZWZpbmUgSzJfSVNBX0lPX0JBU0UJCUsyX1BDSTMyX0lPX0JBU0UKLSNkZWZpbmUgSzJfSVNBX01FTV9CQVNFCQlLMl9QQ0kzMl9NRU1fQkFTRQotCi0jZGVmaW5lIEsyX0JPQVJEX0lEX1JFRwkJKEsyX0lTQV9JT19CQVNFICsgMHg4MDApCi0jZGVmaW5lIEsyX01JU0NfUkVHCQkoSzJfSVNBX0lPX0JBU0UgKyAweDgwNCkKLSNkZWZpbmUgSzJfTVNJWl9HRU9fUkVHCQkoSzJfSVNBX0lPX0JBU0UgKyAweDgwOCkKLSNkZWZpbmUgSzJfSE9UX1NXQVBfUkVHCQkoSzJfSVNBX0lPX0JBU0UgKyAweDgwYykKLSNkZWZpbmUgSzJfUExEMl9SRUcJCShLMl9JU0FfSU9fQkFTRSArIDB4ODBlKQotI2RlZmluZSBLMl9QTEQzX1JFRwkJKEsyX0lTQV9JT19CQVNFICsgMHg4MGYpCi0KLSNkZWZpbmUgSzJfQlVTX1NQRChib2FyZF9pZCkJKGJvYXJkX2lkID4+IDIpICYgMwotCi0jZGVmaW5lIEsyX1JUQ19CQVNFX09GRlNFVAkweDkwMDAwCi0jZGVmaW5lIEsyX1JUQ19CQVNFX0FERFJFU1MJKEsyX1BDSTMyX01FTV9CQVNFICsgSzJfUlRDX0JBU0VfT0ZGU0VUKQotI2RlZmluZSBLMl9SVENfU0laRQkJMHg4MDAwCi0KLSNkZWZpbmUgSzJfTUVNX1NJWkVfTUFTSwkweGUwCi0jZGVmaW5lIEsyX01FTV9TSVpFKHNpemVfcmVnKQkoc2l6ZV9yZWcgJiBLMl9NRU1fU0laRV9NQVNLKSA+PiA1Ci0jZGVmaW5lCUsyX01FTV9TSVpFXzFHQgkJMHg0MDAwMDAwMAotI2RlZmluZSBLMl9NRU1fU0laRV81MTJNQgkweDIwMDAwMDAwCi0jZGVmaW5lIEsyX01FTV9TSVpFXzI1Nk1CCTB4MTAwMDAwMDAKLSNkZWZpbmUgSzJfTUVNX1NJWkVfMTI4TUIJMHgwODAwMDAwMAotCi0jZGVmaW5lIEsyX0wyQ0FDSEVfTUFTSwkJMHgwMwkvKiBNYXNrIGZvciAyIEwyIENhY2hlIGJpdHMgKi8KLSNkZWZpbmUgSzJfTDJDQUNIRV81MTJLQgkweDAwCS8qIDUxMktCICovCi0jZGVmaW5lIEsyX0wyQ0FDSEVfMjU2S0IJMHgwMQkvKiAyNTZLQiAqLwotI2RlZmluZSBLMl9MMkNBQ0hFXzFNQgkJMHgwMgkvKiAxTUIgKi8KLSNkZWZpbmUgSzJfTDJDQUNIRV9OT05FCQkweDAzCS8qIE5vbmUgKi8KLQotI2RlZmluZSBLMl9HRU9fQURSX01BU0sJCTB4MWYKLQotI2RlZmluZSBLMl9TWVNfU0xPVF9NQVNLCTB4MDgKLQotI2VuZGlmIC8qIF9fUFBDX1BMQVRGT1JNU19LMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMva2F0YW5hLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMva2F0YW5hLmMKaW5kZXggMTY5ZGJmNi4uMmI1M2FmYSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL2thdGFuYS5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9rYXRhbmEuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RpbWcuaD4KICNlbmRpZgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgpAQCAtNDIsMTUgKzQzLDE0IEBACiAjaW5jbHVkZSA8YXNtL212NjR4NjAuaD4KICNpbmNsdWRlIDxwbGF0Zm9ybXMva2F0YW5hLmg+CiAKLXN0YXRpYyBzdHJ1Y3QJCW12NjR4NjBfaGFuZGxlIGJoOwotc3RhdGljIGthdGFuYV9pZF90CWthdGFuYV9pZDsKLXN0YXRpYyB2b2lkIF9faW9tZW0JKmNwbGRfYmFzZTsKLXN0YXRpYyB2b2lkIF9faW9tZW0JKnNyYW1fYmFzZTsKLQotc3RhdGljIHUzMgkJa2F0YW5hX2ZsYXNoX3NpemVfMDsKLXN0YXRpYyB1MzIJCWthdGFuYV9mbGFzaF9zaXplXzE7Ci0KLXN0YXRpYyB1MzIJCWthdGFuYV9idXNfZnJlcXVlbmN5Oworc3RhdGljIHN0cnVjdCBtdjY0eDYwX2hhbmRsZQliaDsKK3N0YXRpYyBrYXRhbmFfaWRfdAkJa2F0YW5hX2lkOworc3RhdGljIHZvaWQgX19pb21lbQkJKmNwbGRfYmFzZTsKK3N0YXRpYyB2b2lkIF9faW9tZW0JCSpzcmFtX2Jhc2U7CitzdGF0aWMgdTMyCQkJa2F0YW5hX2ZsYXNoX3NpemVfMDsKK3N0YXRpYyB1MzIJCQlrYXRhbmFfZmxhc2hfc2l6ZV8xOworc3RhdGljIHUzMgkJCWthdGFuYV9idXNfZnJlcXVlbmN5Oworc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlcglrYXRhbmFfaG9zZV9hOwogCiB1bnNpZ25lZCBjaGFyCV9fcmVzW3NpemVvZihiZF90KV07CiAKQEAgLTcxLDggKzcxLDEyIEBACiAJCQlLQVRBTkFfUENJX0lOVEFfSVJRXzc1MGksIEtBVEFOQV9QQ0lfSU5UQl9JUlFfNzUwaSB9LAogCQkvKiBJRFNFTCA2IChUODExMCkgKi8KIAkJe0tBVEFOQV9QQ0lfSU5URF9JUlFfNzUwaSwgMCwgMCwgMCB9LAorCQkvKiBJRFNFTCA3ICh1bnVzZWQpICovCisJCXswLCAwLCAwLCAwIH0sCisJCS8qIElEU0VMIDggKEludGVsIDgyNTQ0KSAoNzUyaSBvbmx5IGJ1dCBkb2Vzbid0IGhhcm0gNzUwaSkgKi8KKwkJe0tBVEFOQV9QQ0lfSU5URF9JUlFfNzUwaSwgMCwgMCwgMCB9LAogCX07Ci0JY29uc3QgbG9uZyBtaW5faWRzZWwgPSA0LCBtYXhfaWRzZWwgPSA2LCBpcnFzX3Blcl9zbG90ID0gNDsKKwljb25zdCBsb25nIG1pbl9pZHNlbCA9IDQsIG1heF9pZHNlbCA9IDgsIGlycXNfcGVyX3Nsb3QgPSA0OwogCiAJcmV0dXJuIFBDSV9JUlFfVEFCTEVfTE9PS1VQOwogfQpAQCAtMTQ4LDcgKzE1Miw3IEBACiAJCQlzYXZlX2V4Y2x1ZGUgPSBtdjY0eDYwX3BjaV9leGNsdWRlX2JyaWRnZTsKIAkJCW12NjR4NjBfcGNpX2V4Y2x1ZGVfYnJpZGdlID0gMDsKIAotCQkJZWFybHlfcmVhZF9jb25maWdfd29yZChiaC5ob3NlX2EsIDAsCisJCQllYXJseV9yZWFkX2NvbmZpZ193b3JkKGJoLmhvc2VfYiwgMCwKIAkJCQlQQ0lfREVWRk4oMCwwKSwgUENJX0RFVklDRV9JRCwgJnZhbCk7CiAKIAkJCW12NjR4NjBfcGNpX2V4Y2x1ZGVfYnJpZGdlID0gc2F2ZV9leGNsdWRlOwpAQCAtMTkxLDcgKzE5NSw4IEBACiAJc3RydWN0IG12NjR4NjBfc2V0dXBfaW5mbyBzaTsKIAl2b2lkIF9faW9tZW0gKnZhZGRyOwogCWludCBpOwotCXUxNiB2YWw7CisJdTMyIHY7CisJdTE2IHZhbCwgdHlwZTsKIAl1OCBzYXZlX2V4Y2x1ZGU7CiAKIAkvKgpAQCAtMjIyLDYgKzIyNywyMCBAQAogCQkJUENJX0RFVklDRV9JRCwgdmFsKTsKIAl9CiAKKwkvKgorCSAqIFdoaWxlIHdlJ3JlIGluIGhlcmUsIHNldCB0aGUgaG90c3dhcCByZWdpc3RlciBjb3JyZWN0bHkuCisJICogVHVybiBvZmYgYmx1ZSBMRUQ7IG1hc2sgRU5VTSMsIGNsZWFyIGluc2VydGlvbiAmIGV4dHJhY3Rpb24gYml0cy4KKwkgKi8KKwllYXJseV9yZWFkX2NvbmZpZ19kd29yZCgmaG9zZSwgMCwgUENJX0RFVkZOKDAsIDApLAorCQlNVjY0MzYwX1BDSUNGR19DUENJX0hPVFNXQVAsICZ2KTsKKwl2ICY9IH4oMTw8MTkpOworCXYgfD0gKCgxPDwxNykgfCAoMTw8MjIpIHwgKDE8PDIzKSk7CisJZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKCZob3NlLCAwLCBQQ0lfREVWRk4oMCwgMCksCisJCU1WNjQzNjBfUENJQ0ZHX0NQQ0lfSE9UU1dBUCwgdik7CisKKwkvKiBXaGlsZSB3ZSdyZSBhdCBpdCwgZ3JhYiB0aGUgYnJpZGdlIHR5cGUgZm9yIGxhdGVyICovCisJZWFybHlfcmVhZF9jb25maWdfd29yZCgmaG9zZSwgMCwgUENJX0RFVkZOKDAsIDApLCBQQ0lfREVWSUNFX0lELCAmdHlwZSk7CisKIAltdjY0eDYwX3BjaV9leGNsdWRlX2JyaWRnZSA9IHNhdmVfZXhjbHVkZTsKIAlpb3VubWFwKHZhZGRyKTsKIApAQCAtMjUxLDIxICsyNzAsMjMgQEAKIAkJc2kuaWRtYV9vcHRpb25zW2ldID0gTVY2NDM2MF9JRE1BMk1FTV9TTk9PUF9OT05FOwogCiAJCXNpLnBjaV8xLmFjY19jbnRsX29wdGlvbnNbaV0gPQotCQkgICAgTVY2NDM2MF9QQ0lfQUNDX0NOVExfU05PT1BfTk9ORSB8Ci0JCSAgICBNVjY0MzYwX1BDSV9BQ0NfQ05UTF9TV0FQX05PTkUgfAotCQkgICAgTVY2NDM2MF9QQ0lfQUNDX0NOVExfTUJVUlNUXzEyOF9CWVRFUyB8Ci0JCSAgICBNVjY0MzYwX1BDSV9BQ0NfQ05UTF9SRFNJWkVfMjU2X0JZVEVTOworCQkJTVY2NDM2MF9QQ0lfQUNDX0NOVExfU05PT1BfTk9ORSB8CisJCQlNVjY0MzYwX1BDSV9BQ0NfQ05UTF9TV0FQX05PTkUgfAorCQkJTVY2NDM2MF9QQ0lfQUNDX0NOVExfTUJVUlNUXzEyOF9CWVRFUyB8CisJCQlNVjY0MzYwX1BDSV9BQ0NfQ05UTF9SRFNJWkVfMjU2X0JZVEVTOwogI2Vsc2UKIAkJc2kuY3B1X3Byb3Rfb3B0aW9uc1tpXSA9IDA7Ci0JCXNpLmVuZXRfb3B0aW9uc1tpXSA9IE1WNjQzNjBfRU5FVDJNRU1fU05PT1BfTk9ORTsgLyogZXJyYXRhICovCi0JCXNpLm1wc2Nfb3B0aW9uc1tpXSA9IE1WNjQzNjBfTVBTQzJNRU1fU05PT1BfTk9ORTsgLyogZXJyYXRhICovCi0JCXNpLmlkbWFfb3B0aW9uc1tpXSA9IE1WNjQzNjBfSURNQTJNRU1fU05PT1BfTk9ORTsgLyogZXJyYXRhICovCisJCXNpLmVuZXRfb3B0aW9uc1tpXSA9IE1WNjQzNjBfRU5FVDJNRU1fU05PT1BfV0I7CisJCXNpLm1wc2Nfb3B0aW9uc1tpXSA9IE1WNjQzNjBfTVBTQzJNRU1fU05PT1BfV0I7CisJCXNpLmlkbWFfb3B0aW9uc1tpXSA9IE1WNjQzNjBfSURNQTJNRU1fU05PT1BfV0I7CiAKIAkJc2kucGNpXzEuYWNjX2NudGxfb3B0aW9uc1tpXSA9Ci0JCSAgICBNVjY0MzYwX1BDSV9BQ0NfQ05UTF9TTk9PUF9XQiB8Ci0JCSAgICBNVjY0MzYwX1BDSV9BQ0NfQ05UTF9TV0FQX05PTkUgfAotCQkgICAgTVY2NDM2MF9QQ0lfQUNDX0NOVExfTUJVUlNUXzMyX0JZVEVTIHwKLQkJICAgIE1WNjQzNjBfUENJX0FDQ19DTlRMX1JEU0laRV8zMl9CWVRFUzsKKwkJCU1WNjQzNjBfUENJX0FDQ19DTlRMX1NOT09QX1dCIHwKKwkJCU1WNjQzNjBfUENJX0FDQ19DTlRMX1NXQVBfTk9ORSB8CisJCQlNVjY0MzYwX1BDSV9BQ0NfQ05UTF9NQlVSU1RfMzJfQllURVMgfAorCQkJKCh0eXBlID09IFBDSV9ERVZJQ0VfSURfTUFSVkVMTF9NVjY0MzYwKSA/CisJCQkJTVY2NDM2MF9QQ0lfQUNDX0NOVExfUkRTSVpFXzMyX0JZVEVTIDoKKwkJCQlNVjY0MzYwX1BDSV9BQ0NfQ05UTF9SRFNJWkVfMjU2X0JZVEVTKTsKICNlbmRpZgogCX0KIApAQCAtMjgxLDEyICszMDIsMjYgQEAKIAltdjY0eDYwX3NldF9idXMoJmJoLCAxLCAwKTsKIAliaC5ob3NlX2ItPmZpcnN0X2J1c25vID0gMDsKIAliaC5ob3NlX2ItPmxhc3RfYnVzbm8gPSAweGZmOworCisJLyoKKwkgKiBOZWVkIHRvIGFjY2VzcyBob3Rzd2FwIHJlZyB3aGljaCBpcyBpbiB0aGUgcGNpIGNvbmZpZyBhcmVhIG9mIHRoZQorCSAqIGJyaWRnZSdzIGhvc2UgMC4gIE5vdGUgdGhhdCBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKSBjYW4ndCBiZSB1c2VkCisJICogdG8gYWxsb2MgaG9zZV9hIGIvYyB0aGF0IHdvdWxkIG1ha2UgaG9zZSAwIGtub3duIHRvIHRoZSBnZW5lcmljCisJICogcGNpIGNvZGUgd2hpY2ggd2UgZG9uJ3Qgd2FudC4KKwkgKi8KKwliaC5ob3NlX2EgPSAma2F0YW5hX2hvc2VfYTsKKwlzZXR1cF9pbmRpcmVjdF9wY2lfbm9tYXAoYmguaG9zZV9hLAorCQliaC52X2Jhc2UgKyBNVjY0eDYwX1BDSTBfQ09ORklHX0FERFIsCisJCWJoLnZfYmFzZSArIE1WNjR4NjBfUENJMF9DT05GSUdfREFUQSk7CiB9CiAKIC8qIEJyaWRnZSAmIHBsYXRmb3JtIHNldHVwIHJvdXRpbmVzICovCiB2b2lkIF9faW5pdAoga2F0YW5hX2ludHJfc2V0dXAodm9pZCkKIHsKKwlpZiAoYmgudHlwZSA9PSBNVjY0eDYwX1RZUEVfTVY2NDQ2MCkgLyogQXMgcGVyIGluc3RucyBmcm9tIE1hcnZlbGwgKi8KKwkJbXY2NHg2MF9jbHJfYml0cygmYmgsIE1WNjR4NjBfQ1BVX01BU1RFUl9DTlRMLCAxIDw8IDE1KTsKKwogCS8qIE1QUCA4LCA5LCBhbmQgMTAgKi8KIAltdjY0eDYwX2Nscl9iaXRzKCZiaCwgTVY2NHg2MF9NUFBfQ05UTF8xLCAweGZmZik7CiAKQEAgLTMwOSw5ICszNDQsMTYgQEAKIAkvKiBDb25maWcgR1BQIGludHIgY3RsciB0byByZXNwb25kIHRvIGxldmVsIHRyaWdnZXIgKi8KIAltdjY0eDYwX3NldF9iaXRzKCZiaCwgTVY2NHg2MF9DT01NX0FSQklURVJfQ05UTCwgKDE8PDEwKSk7CiAKLQkvKiBFcnJhbnVtIEZFciBQQ0ktIzggKi8KLQltdjY0eDYwX2Nscl9iaXRzKCZiaCwgTVY2NHg2MF9QQ0kwX0NNRCwgKDE8PDUpIHwgKDE8PDkpKTsKLQltdjY0eDYwX2Nscl9iaXRzKCZiaCwgTVY2NHg2MF9QQ0kxX0NNRCwgKDE8PDUpIHwgKDE8PDkpKTsKKwlpZiAoYmgudHlwZSA9PSBNVjY0eDYwX1RZUEVfTVY2NDM2MCkgeworCQkvKiBFcnJhdHVtIEZFciBQQ0ktIzkgKi8KKwkJbXY2NHg2MF9jbHJfYml0cygmYmgsIE1WNjR4NjBfUENJMV9DTUQsCisJCQkJKDE8PDQpIHwgKDE8PDUpIHwgKDE8PDYpIHwgKDE8PDcpKTsKKwkJbXY2NHg2MF9zZXRfYml0cygmYmgsIE1WNjR4NjBfUENJMV9DTUQsICgxPDw4KSB8ICgxPDw5KSk7CisJfSBlbHNlIHsKKwkJbXY2NHg2MF9jbHJfYml0cygmYmgsIE1WNjR4NjBfUENJMV9DTUQsICgxPDw2KSB8ICgxPDw3KSk7CisJCW12NjR4NjBfc2V0X2JpdHMoJmJoLCBNVjY0eDYwX1BDSTFfQ01ELAorCQkJCSgxPDw0KSB8ICgxPDw1KSB8ICgxPDw4KSB8ICgxPDw5KSk7CisJfQogCiAJLyoKIAkgKiBEaXNtaXNzIGFuZCB0aGVuIGVuYWJsZSBpbnRlcnJ1cHQgb24gR1BQIGludGVycnVwdCBjYXVzZQpAQCAtNDczLDE3ICs1MTUsNDYgQEAKIAkJcHBjX21kLnByb2dyZXNzKCJrYXRhbmFfc2V0dXBfYXJjaDogZXhpdCIsIDApOwogfQogCit2b2lkCitrYXRhbmFfZml4dXBfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTE2CXYxNjsKKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIEwxX0NBQ0hFX0xJTkVfU0laRT4+Mik7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmdjE2KTsKKwl2MTYgfD0gUENJX0NPTU1BTkRfSU5WQUxJREFURSB8IFBDSV9DT01NQU5EX0ZBU1RfQkFDSzsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgdjE2KTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjcHVfNzUweHhbMzJdID0geyAvKiA3NTBGWCAmIDc1MEdYICovCisJIDAsICAwLCAgMiwgIDIsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsLyogMC0xNSovCisJMTYsIDE3LCAxOCwgMTksIDIwLCAyMiwgMjQsIDI2LCAyOCwgMzAsIDMyLCAzNCwgMzYsIDM4LCA0MCwgIDAgLyoxNi0zMSovCit9OworCitzdGF0aWMgaW50CitrYXRhbmFfZ2V0X2NwdV9mcmVxKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZwlwbGxfY2ZnOworCisJcGxsX2NmZyA9IChtZnNwcihTUFJOX0hJRDEpICYgMHhmODAwMDAwMCkgPj4gMjc7CisJcmV0dXJuIGthdGFuYV9idXNfZnJlcXVlbmN5ICogY3B1Xzc1MHh4W3BsbF9jZmddLzI7Cit9CisKIC8qIFBsYXRmb3JtIGRldmljZSBkYXRhIGZpeHVwIHJvdXRpbmVzLiAqLwogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9NUFNDKQogc3RhdGljIHZvaWQgX19pbml0CiBrYXRhbmFfZml4dXBfbXBzY19wZGF0YShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBtcHNjX3BkYXRhICpwZGF0YTsKKwlzdHJ1Y3QgbXBzY19wZGF0YSAqcGRhdGEgPSAoc3RydWN0IG1wc2NfcGRhdGEgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwliZF90ICpiZHAgPSAoYmRfdCAqKV9fcmVzOwogCi0JcGRhdGEgPSAoc3RydWN0IG1wc2NfcGRhdGEgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoYmRwLT5iaV9iYXVkcmF0ZSkKKwkJcGRhdGEtPmRlZmF1bHRfYmF1ZCA9IGJkcC0+YmlfYmF1ZHJhdGU7CisJZWxzZQorCQlwZGF0YS0+ZGVmYXVsdF9iYXVkID0gS0FUQU5BX0RFRkFVTFRfQkFVRDsKIAogCXBkYXRhLT5tYXhfaWRsZSA9IDQwOwotCXBkYXRhLT5kZWZhdWx0X2JhdWQgPSBLQVRBTkFfREVGQVVMVF9CQVVEOwogCXBkYXRhLT5icmdfY2xrX3NyYyA9IEtBVEFOQV9NUFNDX0NMS19TUkM7CiAJLyoKIAkgKiBUQ0xLIChub3QgU3lzQ0xrKSBpcyByb3V0ZWQgdG8gQlJHLCB0aGVuIHRvIHRoZSBNUFNDLiAgT24gbW9zdCBwYXJ0cywKQEAgLTUxMyw2ICs1ODQsMTggQEAKIH0KICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfU1lTRlMpCitzdGF0aWMgdm9pZCBfX2luaXQKK2thdGFuYV9maXh1cF9tdjY0eHh4X3BkYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG12NjR4eHhfcGRhdGEgKnBkYXRhID0gKHN0cnVjdCBtdjY0eHh4X3BkYXRhICopCisJCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJLyogS2F0YW5hIHN1cHBvcnRzIHRoZSBtdjY0eHh4IGhvdHN3YXAgcmVnaXN0ZXIgKi8KKwlwZGF0YS0+aHNfcmVnX3ZhbGlkID0gMTsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IF9faW5pdAoga2F0YW5hX3BsYXRmb3JtX25vdGlmeShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC01MjksNiArNjEyLDkgQEAKIAkJeyBNVjY0M1hYX0VUSF9OQU1FICIuMSIsIGthdGFuYV9maXh1cF9ldGhfcGRhdGEgfSwKIAkJeyBNVjY0M1hYX0VUSF9OQU1FICIuMiIsIGthdGFuYV9maXh1cF9ldGhfcGRhdGEgfSwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU0ZTKQorCQl7IE1WNjRYWFhfREVWX05BTUUgIi4wIiwga2F0YW5hX2ZpeHVwX212NjR4eHhfcGRhdGEgfSwKKyNlbmRpZgogCX07CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKIAlpbnQJaTsKQEAgLTUzNiw4ICs2MjIsNyBAQAogCWlmIChkZXYgJiYgZGV2LT5idXNfaWQpCiAJCWZvciAoaT0wOyBpPEFSUkFZX1NJWkUoZGV2X21hcCk7IGkrKykKIAkJCWlmICghc3RybmNtcChkZXYtPmJ1c19pZCwgZGV2X21hcFtpXS5idXNfaWQsCi0JCQkJQlVTX0lEX1NJWkUpKSB7Ci0KKwkJCQkJQlVTX0lEX1NJWkUpKSB7CiAJCQkJcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsCiAJCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7CiAJCQkJZGV2X21hcFtpXS5ydG4ocGRldik7CkBAIC01NzgsOCArNjYzLDcgQEAKIAlwdGJsX2VudHJpZXMgPSAoc2l6ZSA+PSAoNjQqTUIpKSA/IDYgOiA0OwogCiAJaWYgKChwdGJsID0ga21hbGxvYyhwdGJsX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IG10ZF9wYXJ0aXRpb24pLAotCQlHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCisJCQlHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBhbGxvYyBNVEQgcGFydGl0aW9uIHRhYmxlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNjExLDcgKzY5NSw2IEBACiAJcGh5c21hcF9zZXRfcGFydGl0aW9ucyhwdGJsLCBwdGJsX2VudHJpZXMpOwogCXJldHVybiAwOwogfQotCiBhcmNoX2luaXRjYWxsKGthdGFuYV9zZXR1cF9tdGQpOwogI2VuZGlmCiAKQEAgLTYzMiw3ICs3MTUsMjIgQEAKIHsKIAl1OAl2OwogCi0JaWYgKGthdGFuYV9pZCA9PSBLQVRBTkFfSURfNzUySSkgeworCS8qIFR1cm4gb24gYmx1ZSBMRUQgdG8gaW5kaWNhdGUgaXRzIG9rYXkgdG8gcmVtb3ZlICovCisJaWYgKGthdGFuYV9pZCA9PSBLQVRBTkFfSURfNzUwSSkgeworCQl1MzIJdjsKKwkJdTgJc2F2ZV9leGNsdWRlOworCisJCS8qIFNldCBMT08gYml0IGluIGNQQ0kgSG90U3dhcCByZWcgb2YgaG9zZSAwIHRvIHR1cm4gb24gTEVELiAqLworCQlzYXZlX2V4Y2x1ZGUgPSBtdjY0eDYwX3BjaV9leGNsdWRlX2JyaWRnZTsKKwkJbXY2NHg2MF9wY2lfZXhjbHVkZV9icmlkZ2UgPSAwOworCQllYXJseV9yZWFkX2NvbmZpZ19kd29yZChiaC5ob3NlX2EsIDAsIFBDSV9ERVZGTigwLCAwKSwKKwkJCU1WNjQzNjBfUENJQ0ZHX0NQQ0lfSE9UU1dBUCwgJnYpOworCQl2ICY9IDB4ZmY7CisJCXYgfD0gKDEgPDwgMTkpOworCQllYXJseV93cml0ZV9jb25maWdfZHdvcmQoYmguaG9zZV9hLCAwLCBQQ0lfREVWRk4oMCwgMCksCisJCQlNVjY0MzYwX1BDSUNGR19DUENJX0hPVFNXQVAsIHYpOworCQltdjY0eDYwX3BjaV9leGNsdWRlX2JyaWRnZSA9IHNhdmVfZXhjbHVkZTsKKwl9IGVsc2UgaWYgKGthdGFuYV9pZCA9PSBLQVRBTkFfSURfNzUySSkgewogCQkgICB2ID0gaW5fOChjcGxkX2Jhc2UgKyBIU0xfUExEX0JBU0UgKyBIU0xfUExEX0hPVF9TV0FQX09GRik7CiAJCSAgIHYgfD0gSFNMX1BMRF9IT1RfU1dBUF9MRURfQklUOwogCQkgICBvdXRfOChjcGxkX2Jhc2UgKyBIU0xfUExEX0JBU0UgKyBIU0xfUExEX0hPVF9TV0FQX09GRiwgdik7CkBAIC02NTIsMzcgKzc1MCw2NSBAQAogc3RhdGljIGludAoga2F0YW5hX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CisJY2hhcgkqczsKKworCXNlcV9wcmludGYobSwgImNwdSBmcmVxXHQ6ICVkTUh6XG4iLAorCQkoa2F0YW5hX2dldF9jcHVfZnJlcSgpICsgNTAwMDAwKSAvIDEwMDAwMDApOworCXNlcV9wcmludGYobSwgImJ1cyBmcmVxXHQ6ICVsZE1IelxuIiwKKwkJKChsb25nKWthdGFuYV9idXNfZnJlcXVlbmN5ICsgNTAwMDAwKSAvIDEwMDAwMDApOwogCXNlcV9wcmludGYobSwgInZlbmRvclx0XHQ6IEFydGVzeW4gQ29tbXVuaWNhdGlvbiBQcm9kdWN0cywgTExDXG4iKTsKIAogCXNlcV9wcmludGYobSwgImJvYXJkXHRcdDogIik7Ci0KIAlzd2l0Y2ggKGthdGFuYV9pZCkgewogCWNhc2UgS0FUQU5BX0lEXzM3NTA6Ci0JCXNlcV9wcmludGYobSwgIkthdGFuYSAzNzUwXG4iKTsKKwkJc2VxX3ByaW50ZihtLCAiS2F0YW5hIDM3NTAiKTsKIAkJYnJlYWs7CiAKIAljYXNlIEtBVEFOQV9JRF83NTBJOgotCQlzZXFfcHJpbnRmKG0sICJLYXRhbmEgNzUwaVxuIik7CisJCXNlcV9wcmludGYobSwgIkthdGFuYSA3NTBpIik7CiAJCWJyZWFrOwogCiAJY2FzZSBLQVRBTkFfSURfNzUySToKLQkJc2VxX3ByaW50ZihtLCAiS2F0YW5hIDc1MmlcbiIpOworCQlzZXFfcHJpbnRmKG0sICJLYXRhbmEgNzUyaSIpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXNlcV9wcmludGYobSwgIlVua25vd25cbiIpOworCQlzZXFfcHJpbnRmKG0sICJVbmtub3duIik7CiAJCWJyZWFrOwogCX0KLQotCXNlcV9wcmludGYobSwgInByb2R1Y3QgSURcdDogMHgleFxuIiwKKwlzZXFfcHJpbnRmKG0sICIgKHByb2R1Y3QgaWQ6IDB4JXgpXG4iLAogCQkgICBpbl84KGNwbGRfYmFzZSArIEtBVEFOQV9DUExEX1BST0RVQ1RfSUQpKTsKKworCXNlcV9wcmludGYobSwgInBjaSBtb2RlXHQ6ICVzTW9uYXJjaFxuIiwKKwkJa2F0YW5hX2lzX21vbmFyY2goKT8gIiIgOiAiTm9uLSIpOwogCXNlcV9wcmludGYobSwgImhhcmR3YXJlIHJldlx0OiAweCV4XG4iLAogCQkgICBpbl84KGNwbGRfYmFzZStLQVRBTkFfQ1BMRF9IQVJEV0FSRV9WRVIpKTsKLQlzZXFfcHJpbnRmKG0sICJQTEQgcmV2XHRcdDogMHgleFxuIiwKKwlzZXFfcHJpbnRmKG0sICJwbGQgcmV2XHRcdDogMHgleFxuIiwKIAkJICAgaW5fOChjcGxkX2Jhc2UgKyBLQVRBTkFfQ1BMRF9QTERfVkVSKSk7Ci0Jc2VxX3ByaW50ZihtLCAiUExCIGZyZXFcdDogJWxkTWh6XG4iLAotCQkobG9uZylrYXRhbmFfYnVzX2ZyZXF1ZW5jeSAvIDEwMDAwMDApOwotCXNlcV9wcmludGYobSwgIlBDSVx0XHQ6ICVzTW9uYXJjaFxuIiwga2F0YW5hX2lzX21vbmFyY2goKT8gIiIgOiAiTm9uLSIpOworCisJc3dpdGNoKGJoLnR5cGUpIHsKKwljYXNlIE1WNjR4NjBfVFlQRV9HVDY0MjYwQToKKwkJcyA9ICJndDY0MjYwYSI7CisJCWJyZWFrOworCWNhc2UgTVY2NHg2MF9UWVBFX0dUNjQyNjBCOgorCQlzID0gImd0NjQyNjBiIjsKKwkJYnJlYWs7CisJY2FzZSBNVjY0eDYwX1RZUEVfTVY2NDM2MDoKKwkJcyA9ICJtdjY0MzYwIjsKKwkJYnJlYWs7CisJY2FzZSBNVjY0eDYwX1RZUEVfTVY2NDQ2MDoKKwkJcyA9ICJtdjY0NDYwIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcyA9ICJVbmtub3duIjsKKwl9CisJc2VxX3ByaW50ZihtLCAiYnJpZGdlIHR5cGVcdDogJXNcbiIsIHMpOworCXNlcV9wcmludGYobSwgImJyaWRnZSByZXZcdDogMHgleFxuIiwgYmgucmV2KTsKKyNpZiBkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCisJc2VxX3ByaW50ZihtLCAiY29oZXJlbmN5XHQ6ICVzXG4iLCAib2ZmIik7CisjZWxzZQorCXNlcV9wcmludGYobSwgImNvaGVyZW5jeVx0OiAlc1xuIiwgIm9uIik7CisjZW5kaWYKIAogCXJldHVybiAwOwogfQpAQCAtNzAxLDExICs4MjcsMjAgQEAKIAl0Yl90b191cyA9IG11bGh3dV9zY2FsZV9mYWN0b3IoZnJlcSwgMTAwMDAwMCk7CiB9CiAKKy8qCisgKiBUaGUga2F0YW5hIHN1cHBvcnRzIGJvdGggdUltYWdlIGFuZCB6SW1hZ2UuICBJZiB1SW1hZ2UsIGdldCB0aGUgbWVtIHNpemUKKyAqIGZyb20gdGhlIGJkIGluZm8uICBJZiB6SW1hZ2UsIHRoZSBib290d3JhcHBlciBhZGRzIGEgQklfTUVNU0laRSBlbnRyeSBpbgorICogdGhlIGJpX3JlYyBkYXRhIHdoaWNoIGlzIHN1Y2tlZCBvdXQgYW5kIHB1dCBpbnRvIGJvb3RfbWVtX3NpemUgYnkKKyAqIHBhcnNlX2Jvb3RpbmZvKCkuICBNTVVfaW5pdCgpIHdpbGwgdGhlbiB1c2UgdGhlIGJvb3RfbWVtX3NpemUgZm9yIHRoZSBtZW0KKyAqIHNpemUgYW5kIG5vdCBjYWxsIHRoaXMgcm91dGluZS4gIFRoZSBvbmx5IHdheSB0aGlzIHdpbGwgZmFpbCBpcyB3aGVuIGEgdUltYWdlCisgKiBpcyB1c2VkIGJ1dCB0aGUgZncgZG9lc24ndCBwYXNzIGluIGEgdmFsaWQgYmlfbWVtc2l6ZS4gIFRoaXMgc2hvdWxkIG5ldmVyCisgKiBoYXBwZW4sIHRob3VnaC4KKyAqLwogdW5zaWduZWQgbG9uZyBfX2luaXQKIGthdGFuYV9maW5kX2VuZF9vZl9tZW1vcnkodm9pZCkKIHsKLQlyZXR1cm4gbXY2NHg2MF9nZXRfbWVtX3NpemUoQ09ORklHX01WNjRYNjBfTkVXX0JBU0UsCi0JCU1WNjR4NjBfVFlQRV9NVjY0MzYwKTsKKwliZF90ICpiZHAgPSAoYmRfdCAqKV9fcmVzOworCXJldHVybiBiZHAtPmJpX21lbXNpemU7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfTVY2NFhYWCkgJiYgZGVmaW5lZChDT05GSUdfU0VOU09SU19NNDFUMDApCkBAIC03MjksMTUgKzg2NCw2IEBACiBsYXRlX2luaXRjYWxsKGthdGFuYV9ydGNfaG9va3VwKTsKICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHZvaWQKLWthdGFuYV9zZXRfYmF0KHZvaWQpCi17Ci0JbWIoKTsKLQltdHNwcihTUFJOX0RCQVQyVSwgMHhmMDAwMWZmZSk7Ci0JbXRzcHIoU1BSTl9EQkFUMkwsIDB4ZjAwMDAwMmEpOwotCW1iKCk7Ci19Ci0KICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRykgJiYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01QU0NfQ09OU09MRSkKIHN0YXRpYyB2b2lkIF9faW5pdAoga2F0YW5hX21hcF9pbyh2b2lkKQpAQCAtNzYzLDE1ICs4ODksMjQgQEAKIAkgKi8KIAlpZiAocjMgJiYgcjYpIHsKIAkJLyogY29weSBib2FyZCBpbmZvIHN0cnVjdHVyZSAqLwotCQltZW1jcHkoICh2b2lkICopX19yZXMsKHZvaWQgKikocjMrS0VSTkVMQkFTRSksIHNpemVvZihiZF90KSApOworCQltZW1jcHkoKHZvaWQgKilfX3JlcywgKHZvaWQgKikocjMrS0VSTkVMQkFTRSksIHNpemVvZihiZF90KSk7CiAJCS8qIGNvcHkgY29tbWFuZCBsaW5lICovCiAJCSooY2hhciAqKShyNytLRVJORUxCQVNFKSA9IDA7CiAJCXN0cmNweShjbWRfbGluZSwgKGNoYXIgKikocjYrS0VSTkVMQkFTRSkpOwogCX0KIAorI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCS8qIHRha2UgY2FyZSBvZiBpbml0cmQgaWYgd2UgaGF2ZSBvbmUgKi8KKwlpZiAocjQpIHsKKwkJaW5pdHJkX3N0YXJ0ID0gcjQgKyBLRVJORUxCQVNFOworCQlpbml0cmRfZW5kID0gcjUgKyBLRVJORUxCQVNFOworCX0KKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JTklUUkQgKi8KKwogCWlzYV9tZW1fYmFzZSA9IDA7CiAKIAlwcGNfbWQuc2V0dXBfYXJjaCA9IGthdGFuYV9zZXR1cF9hcmNoOworCXBwY19tZC5wY2liaW9zX2ZpeHVwX3Jlc291cmNlcyA9IGthdGFuYV9maXh1cF9yZXNvdXJjZXM7CiAJcHBjX21kLnNob3dfY3B1aW5mbyA9IGthdGFuYV9zaG93X2NwdWluZm87CiAJcHBjX21kLmluaXRfSVJRID0gbXY2NDM2MF9pbml0X2lycTsKIAlwcGNfbWQuZ2V0X2lycSA9IG12NjQzNjBfZ2V0X2lycTsKQEAgLTc5MCw2ICs5MjUsNCBAQAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9NUFNDKSB8fCBkZWZpbmVkKENPTkZJR19NVjY0M1hYX0VUSCkKIAlwbGF0Zm9ybV9ub3RpZnkgPSBrYXRhbmFfcGxhdGZvcm1fbm90aWZ5OwogI2VuZGlmCi0KLQlrYXRhbmFfc2V0X2JhdCgpOyAvKiBOZWVkIGZvciBrYXRhbmFfZmluZF9lbmRfb2ZfbWVtb3J5IGFuZCBwcm9ncmVzcyAqLwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL2thdGFuYS5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2thdGFuYS5oCmluZGV4IGI4MmVkODEuLjU5NzI1N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9rYXRhbmEuaAorKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMva2F0YW5hLmgKQEAgLTU2LDE0ICs1NiwxNCBAQAogI2RlZmluZSBLQVRBTkFfUENJMV9JT19TSVpFICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMCAvKiA2NCBNQiAqLwogCiAvKiBCb2FyZC1zcGVjaWZpYyBJUlEgaW5mbyAqLwotI2RlZmluZSAgS0FUQU5BX1BDSV9JTlRBX0lSUV8zNzUwCQk2NCs4Ci0jZGVmaW5lICBLQVRBTkFfUENJX0lOVEJfSVJRXzM3NTAJCTY0KzkKLSNkZWZpbmUgIEtBVEFOQV9QQ0lfSU5UQ19JUlFfMzc1MAkJNjQrMTAKKyNkZWZpbmUgIEtBVEFOQV9QQ0lfSU5UQV9JUlFfMzc1MAkJKDY0KzgpCisjZGVmaW5lICBLQVRBTkFfUENJX0lOVEJfSVJRXzM3NTAJCSg2NCs5KQorI2RlZmluZSAgS0FUQU5BX1BDSV9JTlRDX0lSUV8zNzUwCQkoNjQrMTApCiAKLSNkZWZpbmUgIEtBVEFOQV9QQ0lfSU5UQV9JUlFfNzUwaQkJNjQrOAotI2RlZmluZSAgS0FUQU5BX1BDSV9JTlRCX0lSUV83NTBpCQk2NCs5Ci0jZGVmaW5lICBLQVRBTkFfUENJX0lOVENfSVJRXzc1MGkJCTY0KzEwCi0jZGVmaW5lICBLQVRBTkFfUENJX0lOVERfSVJRXzc1MGkJCTY0KzE0CisjZGVmaW5lICBLQVRBTkFfUENJX0lOVEFfSVJRXzc1MGkJCSg2NCs4KQorI2RlZmluZSAgS0FUQU5BX1BDSV9JTlRCX0lSUV83NTBpCQkoNjQrOSkKKyNkZWZpbmUgIEtBVEFOQV9QQ0lfSU5UQ19JUlFfNzUwaQkJKDY0KzEwKQorI2RlZmluZSAgS0FUQU5BX1BDSV9JTlREX0lSUV83NTBpCQkoNjQrMTQpCiAKICNkZWZpbmUgS0FUQU5BX0NQTERfUlNUX0VWRU5UCQkJMHgwMDAwMDAwMAogI2RlZmluZSBLQVRBTkFfQ1BMRF9SU1RfQ01ECQkJMHgwMDAwMTAwMApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL21jcG43NjUuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9tY3BuNzY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OGQyOTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL21jcG43NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDUyNyArMCwwIEBACi0vKgotICogYXJjaC9wcGMvcGxhdGZvcm1zL21jcG43NjUuYwotICoKLSAqIEJvYXJkIHNldHVwIHJvdXRpbmVzIGZvciB0aGUgTW90b3JvbGEgTUNHIE1DUE43NjUgY1BDSSBCb2FyZC4KLSAqCi0gKiBBdXRob3I6IE1hcmsgQS4gR3JlZXIKLSAqICAgICAgICAgbWdyZWVyQG12aXN0YS5jb20KLSAqCi0gKiBNb2RpZmllZCBieSBSYW5keSBWaW5zb24gKHJ2aW5zb25AbXZpc3RhLmNvbSkKLSAqCi0gKiAyMDAxLTIwMDIgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBhZGRzIHN1cHBvcnQgZm9yIHRoZSBNb3Rvcm9sYSBNQ0cgTUNQTjc2NS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgkvKiBmb3IgbGludXgvc2VyaWFsX2NvcmUuaCAqLwotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vdGltZS5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9zbXAuaD4KLSNpbmNsdWRlIDxhc20vb3Blbl9waWMuaD4KLSNpbmNsdWRlIDxhc20vaTgyNTkuaD4KLSNpbmNsdWRlIDxhc20vdG9kYy5oPgotI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2hhd2suaD4KLSNpbmNsdWRlIDxhc20va2dkYi5oPgotCi0jaW5jbHVkZSAibWNwbjc2NS5oIgotCi1zdGF0aWMgdV9jaGFyIG1jcG43NjVfb3BlbnBpY19pbml0c2Vuc2VzW10gX19pbml0ZGF0YSA9IHsKLQkoSVJRX1NFTlNFX0VER0UgIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwvKiAxNjogaTgyNTkgY2FzY2FkZSAqLwotCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfTkVHQVRJVkUpLC8qIDE3OiBDT00xLDIsMyw0ICovCi0JKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9ORUdBVElWRSksLyogMTg6IEVuZXQgMSAoZnJvbnQpICovCi0JKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9ORUdBVElWRSksLyogMTk6IEhBV0sgV0RUIFhYWFggKi8KLQkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwvKiAyMDogMjE1NTQgYnJpZGdlICovCi0JKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9ORUdBVElWRSksLyogMjE6IGNQQ0kgSU5UQSMgKi8KLQkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwvKiAyMjogY1BDSSBJTlRCIyAqLwotCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfTkVHQVRJVkUpLC8qIDIzOiBjUENJIElOVEMjICovCi0JKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9ORUdBVElWRSksLyogMjQ6IGNQQ0kgSU5URCMgKi8KLQkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwvKiAyNTogUE1DMSBJTlRBIyxQTUMyIElOVEIjKi8KLQkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwvKiAyNjogUE1DMSBJTlRCIyxQTUMyIElOVEMjKi8KLQkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwvKiAyNzogUE1DMSBJTlRDIyxQTUMyIElOVEQjKi8KLQkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwvKiAyODogUE1DMSBJTlREIyxQTUMyIElOVEEjKi8KLQkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwvKiAyOTogRW5ldCAyIChKMykgKi8KLQkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwvKiAzMDogQWJvcnQgU3dpdGNoICovCi0JKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9ORUdBVElWRSksLyogMzE6IFJUQyBBbGFybSAqLwotfTsKLQotZXh0ZXJuIHZvaWQgbWNwbjc2NV9zZXRfVklBX0lERV9uYXRpdmUodm9pZCk7Ci0KLWV4dGVybiB1X2ludCBvcGVucGljX2lycSh2b2lkKTsKLWV4dGVybiBjaGFyIGNtZF9saW5lW107Ci0KLWV4dGVybiB2b2lkIGdlbjU1MF9wcm9ncmVzcyhjaGFyICosIHVuc2lnbmVkIHNob3J0KTsKLWV4dGVybiB2b2lkIGdlbjU1MF9pbml0KGludCwgc3RydWN0IHVhcnRfcG9ydCAqKTsKLQotaW50IHVzZV9vZl9pbnRlcnJ1cHRfdHJlZSA9IDA7Ci0KLXN0YXRpYyB2b2lkIG1jcG43NjVfaGFsdCh2b2lkKTsKLQotVE9EQ19BTExPQygpOwotCi0vKgotICogTW90b3JvbGEgTUNHIE1DUE43NjUgaW50ZXJydXB0IHJvdXRpbmcuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1tY3BuNzY1X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgY2hhciBpZHNlbCwgdW5zaWduZWQgY2hhciBwaW4pCi17Ci0Jc3RhdGljIGNoYXIgcGNpX2lycV90YWJsZVtdWzRdID0KLQkvKgotCSAqCVBDSSBJRFNFTC9JTlRQSU4tPklOVExJTkUKLQkgKiAJICAgQSAgIEIgICBDICAgRAotCSAqLwotCXsKLQkJeyAxNCwgIDAsICAwLCAgMCB9LAkvKiBJRFNFTCAxMSAtIGhhdmUgdG8gbWFudWFsbHkgc2V0ICovCi0JCXsgIDAsICAwLCAgMCwgIDAgfSwJLyogSURTRUwgMTIgLSB1bnVzZWQgKi8KLQkJeyAgMCwgIDAsICAwLCAgMCB9LAkvKiBJRFNFTCAxMyAtIHVudXNlZCAqLwotCQl7IDE4LCAgMCwgIDAsICAwIH0sCS8qIElEU0VMIDE0IC0gRW5ldCAwICovCi0JCXsgIDAsICAwLCAgMCwgIDAgfSwJLyogSURTRUwgMTUgLSB1bnVzZWQgKi8KLQkJeyAyNSwgMjYsIDI3LCAyOCB9LAkvKiBJRFNFTCAxNiAtIFBNQyBTbG90IDEgKi8KLQkJeyAyOCwgMjUsIDI2LCAyNyB9LAkvKiBJRFNFTCAxNyAtIFBNQyBTbG90IDIgKi8KLQkJeyAgMCwgIDAsICAwLCAgMCB9LAkvKiBJRFNFTCAxOCAtIFBNQyAyQiBDb25uZWN0b3IgWFhYWCAqLwotCQl7IDI5LCAgMCwgIDAsICAwIH0sCS8qIElEU0VMIDE5IC0gRW5ldCAxICovCi0JCXsgMjAsICAwLCAgMCwgIDAgfSwJLyogSURTRUwgMjAgLSAyMTU1NCBjUENJIGJyaWRnZSAqLwotCX07Ci0KLQljb25zdCBsb25nIG1pbl9pZHNlbCA9IDExLCBtYXhfaWRzZWwgPSAyMCwgaXJxc19wZXJfc2xvdCA9IDQ7Ci0JcmV0dXJuIFBDSV9JUlFfVEFCTEVfTE9PS1VQOwotfQotCi12b2lkIF9faW5pdAotbWNwbjc2NV9zZXRfVklBX0lERV9sZWdhY3kodm9pZCkKLXsKLQl1bnNpZ25lZCBzaG9ydCB2ZW5kLCBkZXY7Ci0KLQllYXJseV9yZWFkX2NvbmZpZ193b3JkKDAsIDAsIFBDSV9ERVZGTigweGIsIDEpLCBQQ0lfVkVORE9SX0lELCAmdmVuZCk7Ci0JZWFybHlfcmVhZF9jb25maWdfd29yZCgwLCAwLCBQQ0lfREVWRk4oMHhiLCAxKSwgUENJX0RFVklDRV9JRCwgJmRldik7Ci0KLQlpZiAoKHZlbmQgPT0gUENJX1ZFTkRPUl9JRF9WSUEpICYmCi0JICAgIChkZXYgPT0gUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzEpKSB7Ci0KLQkJdW5zaWduZWQgY2hhciB0ZW1wOwotCi0JCS8qIHB1dCBiYWNrIG9yaWdpbmFsICJzdGFuZGFyZCIgcG9ydCBiYXNlIGFkZHJlc3NlcyAqLwotCQllYXJseV93cml0ZV9jb25maWdfZHdvcmQoMCwgMCwgUENJX0RFVkZOKDB4YiwgMSksCi0JCQkJICAgICAgICAgUENJX0JBU0VfQUREUkVTU18wLCAweDFmMSk7Ci0JCWVhcmx5X3dyaXRlX2NvbmZpZ19kd29yZCgwLCAwLCBQQ0lfREVWRk4oMHhiLCAxKSwKLQkJCQkgICAgICAgICBQQ0lfQkFTRV9BRERSRVNTXzEsIDB4M2Y1KTsKLQkJZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKDAsIDAsIFBDSV9ERVZGTigweGIsIDEpLAotCQkJCSAgICAgICAgIFBDSV9CQVNFX0FERFJFU1NfMiwgMHgxNzEpOwotCQllYXJseV93cml0ZV9jb25maWdfZHdvcmQoMCwgMCwgUENJX0RFVkZOKDB4YiwgMSksCi0JCQkJICAgICAgICAgUENJX0JBU0VfQUREUkVTU18zLCAweDM3NSk7Ci0JCWVhcmx5X3dyaXRlX2NvbmZpZ19kd29yZCgwLCAwLCBQQ0lfREVWRk4oMHhiLCAxKSwKLQkJCQkgICAgICAgICBQQ0lfQkFTRV9BRERSRVNTXzQsIDB4Y2MwMSk7Ci0KLQkJLyogcHV0IGludG8gbGVnYWN5IG1vZGUgKi8KLQkJZWFybHlfcmVhZF9jb25maWdfYnl0ZSgwLCAwLCBQQ0lfREVWRk4oMHhiLCAxKSwgUENJX0NMQVNTX1BST0csCi0JCQkJICAgICAgICZ0ZW1wKTsKLQkJdGVtcCAmPSB+MHgwNTsKLQkJZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoMCwgMCwgUENJX0RFVkZOKDB4YiwgMSksIFBDSV9DTEFTU19QUk9HLAotCQkJCQl0ZW1wKTsKLQl9Ci19Ci0KLXZvaWQKLW1jcG43NjVfc2V0X1ZJQV9JREVfbmF0aXZlKHZvaWQpCi17Ci0JdW5zaWduZWQgc2hvcnQgdmVuZCwgZGV2OwotCi0JZWFybHlfcmVhZF9jb25maWdfd29yZCgwLCAwLCBQQ0lfREVWRk4oMHhiLCAxKSwgUENJX1ZFTkRPUl9JRCwgJnZlbmQpOwotCWVhcmx5X3JlYWRfY29uZmlnX3dvcmQoMCwgMCwgUENJX0RFVkZOKDB4YiwgMSksIFBDSV9ERVZJQ0VfSUQsICZkZXYpOwotCi0JaWYgKCh2ZW5kID09IFBDSV9WRU5ET1JfSURfVklBKSAmJgotCSAgICAoZGV2ID09IFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8xKSkgewotCi0JCXVuc2lnbmVkIGNoYXIgdGVtcDsKLQotCQkvKiBwdXQgaW50byBuYXRpdmUgbW9kZSAqLwotCQllYXJseV9yZWFkX2NvbmZpZ19ieXRlKDAsIDAsIFBDSV9ERVZGTigweGIsIDEpLCBQQ0lfQ0xBU1NfUFJPRywKLQkJCQkgICAgICAgJnRlbXApOwotCQl0ZW1wIHw9IDB4MDU7Ci0JCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKDAsIDAsIFBDSV9ERVZGTigweGIsIDEpLCBQQ0lfQ0xBU1NfUFJPRywKLQkJCQkJdGVtcCk7Ci0JfQotfQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgVklBIDgyYzU4NmIuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdAotbWNwbjc2NV9zZXR1cF92aWFfODJjNTg2Yih2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2CSpkZXY7Ci0JdV9jaGFyCQljOwotCi0JaWYgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwKLQkJCQkgICBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMCwKLQkJCQkgICBOVUxMKSkgPT0gTlVMTCkgewotCQlwcmludGsoIk5vIFZJQSBJU0EgYnJpZGdlIGZvdW5kXG4iKTsKLQkJbWNwbjc2NV9oYWx0KCk7Ci0JCS8qIE5PVFJFQUNIRUQgKi8KLQl9Ci0KLQkvKgotCSAqIElmIHRoZSBmaXJtd2FyZSBsZWZ0IHRoZSBFSVNBIDRkMC80ZDEgcG9ydHMgZW5hYmxlZCwgbWFrZSBzdXJlCi0JICogSVJRIDE0IGlzIHNldCBmb3IgZWRnZS4KLQkgKi8KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDcsICZjKTsKLQotCWlmIChjICYgKDE8PDUpKSB7Ci0JCWMgPSBpbmIoMHg0ZDEpOwotCQljICY9IH4oMTw8Nik7Ci0JCW91dGIoYywgMHg0ZDEpOwotCX0KLQotCS8qIERpc2FibGUgUE5QIElSUSByb3V0aW5nIHNpbmNlIHdlIHVzZSB0aGUgSGF3aydzIE1QSUMgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1NCwgMCk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1OCwgMCk7Ci0KLQlwY2lfZGV2X3B1dChkZXYpOwotCWlmICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSUEsCi0JCQkJICAgUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzEsCi0JCQkJICAgTlVMTCkpID09IE5VTEwpIHsKLQkJcHJpbnRrKCJObyBWSUEgSVNBIGJyaWRnZSBmb3VuZFxuIik7Ci0JCW1jcG43NjVfaGFsdCgpOwotCQkvKiBOT1RSRUFDSEVEICovCi0JfQotCi0JLyoKLQkgKiBQUENCdWcgZG9lc24ndCBzZXQgdGhlIGVuYWJsZSBiaXRzIGZvciB0aGUgSURFIGRldmljZS4KLQkgKiBUdXJuIHRoZW0gb24gbm93LgotCSAqLwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgJmMpOwotCWMgfD0gMHgwMzsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQwLCBjKTsKLQlwY2lfZGV2X3B1dChkZXYpOwotCi0JcmV0dXJuOwotfQotCi12b2lkIF9faW5pdAotbWNwbjc2NV9wY2liaW9zX2ZpeHVwKHZvaWQpCi17Ci0JLyogRG8gTUNQTjc2NSBib2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4gICovCi0JbWNwbjc2NV9zZXR1cF92aWFfODJjNTg2YigpOwotfQotCi12b2lkIF9faW5pdAotbWNwbjc2NV9maW5kX2JyaWRnZXModm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIJKmhvc2U7Ci0KLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7Ci0KLQlpZiAoIWhvc2UpCi0JCXJldHVybjsKLQotCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKLQlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKLQlob3NlLT5wY2lfbWVtX29mZnNldCA9IE1DUE43NjVfUENJX1BIWV9NRU1fT0ZGU0VUOwotCi0JcGNpX2luaXRfcmVzb3VyY2UoJmhvc2UtPmlvX3Jlc291cmNlLAotCQkJTUNQTjc2NV9QQ0lfSU9fU1RBUlQsCi0JCQlNQ1BONzY1X1BDSV9JT19FTkQsCi0JCQlJT1JFU09VUkNFX0lPLAotCQkJIlBDSSBob3N0IGJyaWRnZSIpOwotCi0JcGNpX2luaXRfcmVzb3VyY2UoJmhvc2UtPm1lbV9yZXNvdXJjZXNbMF0sCi0JCQlNQ1BONzY1X1BDSV9NRU1fU1RBUlQsCi0JCQlNQ1BONzY1X1BDSV9NRU1fRU5ELAotCQkJSU9SRVNPVVJDRV9NRU0sCi0JCQkiUENJIGhvc3QgYnJpZGdlIik7Ci0KLQlob3NlLT5pb19zcGFjZS5zdGFydCA9IE1DUE43NjVfUENJX0lPX1NUQVJUOwotCWhvc2UtPmlvX3NwYWNlLmVuZCA9IE1DUE43NjVfUENJX0lPX0VORDsKLQlob3NlLT5tZW1fc3BhY2Uuc3RhcnQgPSBNQ1BONzY1X1BDSV9NRU1fU1RBUlQ7Ci0JaG9zZS0+bWVtX3NwYWNlLmVuZCA9IE1DUE43NjVfUENJX01FTV9FTkQgLSBIQVdLX01QSUNfU0laRTsKLQotCWlmIChoYXdrX2luaXQoaG9zZSwKLQkJICAgICAgIE1DUE43NjVfSEFXS19QUENfUkVHX0JBU0UsCi0JCSAgICAgICBNQ1BONzY1X1BST0NfUENJX01FTV9TVEFSVCwKLQkJICAgICAgIE1DUE43NjVfUFJPQ19QQ0lfTUVNX0VORCAtIEhBV0tfTVBJQ19TSVpFLAotCQkgICAgICAgTUNQTjc2NV9QUk9DX1BDSV9JT19TVEFSVCwKLQkJICAgICAgIE1DUE43NjVfUFJPQ19QQ0lfSU9fRU5ELAotCQkgICAgICAgTUNQTjc2NV9QQ0lfTUVNX0VORCAtIEhBV0tfTVBJQ19TSVpFICsgMSkgIT0gMCkgewotCQlwcmludGsoIkNvdWxkIG5vdCBpbml0aWFsaXplIEhBV0sgYnJpZGdlXG4iKTsKLQl9Ci0KLQkvKiBWSUEgSURFIEJBUiBkZWNvZGVycyBhcmUgb25seSAxNi1iaXRzIHdpZGUuIFBDSSBBdXRvIENvbmZpZwotCSAqIHdpbGwgcmVhc3NpZ24gdGhlIGJhcnMgb3V0c2lkZSBvZiAxNi1iaXQgSS9PIHNwYWNlLCB3aGljaCB3aWxsIAotCSAqICJicmVhayIgdGhpbmdzLiBUbyBwcmV2ZW50IHRoaXMsIHdlJ2xsIHNldCB0aGUgSURFIGNoaXAgaW50bwotCSAqIGxlZ2FjeSBtb2RlIGFuZCBzZWVkIHRoZSBiYXJzIHdpdGggdGhlaXIgbGVnYWN5IGFkZHJlc3NlcyAoaW4gMTYtYml0Ci0JICogSS9PIHNwYWNlKS4gVGhlIEF1dG8gQ29uZmlnIGNvZGUgd2lsbCBza2lwIHRoZSBJREUgY29udG9sbGVyIGluIAotCSAqIGxlZ2FjeSBtb2RlLCBzbyBvdXIgYmFyIHZhbHVlcyB3aWxsIHN0aWNrLgotCSAqLwotCW1jcG43NjVfc2V0X1ZJQV9JREVfbGVnYWN5KCk7Ci0KLQlob3NlLT5sYXN0X2J1c25vID0gcGNpYXV0b19idXNfc2Nhbihob3NlLCBob3NlLT5maXJzdF9idXNubyk7Ci0KLQkvKiBOb3cgdGhhdCB3ZSd2ZSBnb3QgMTYtYml0IGFkZHJlc3NlcyBpbiB0aGUgYmFycywgd2UgY2FuIHN3aXRjaCB0aGUKLQkgKiBJREUgY29udHJvbGxlciBiYWNrIGludG8gbmF0aXZlIG1vZGUgc28gd2UgY2FuIGRvICJtb2Rlcm4iIHJlc291cmNlCi0JICogYW5kIGludGVycnVwdCBtYW5hZ2VtZW50LgotCSAqLwotCW1jcG43NjVfc2V0X1ZJQV9JREVfbmF0aXZlKCk7Ci0KLQlwcGNfbWQucGNpYmlvc19maXh1cCA9IG1jcG43NjVfcGNpYmlvc19maXh1cDsKLQlwcGNfbWQucGNpYmlvc19maXh1cF9idXMgPSBOVUxMOwotCXBwY19tZC5wY2lfc3dpenpsZSA9IGNvbW1vbl9zd2l6emxlOwotCXBwY19tZC5wY2lfbWFwX2lycSA9IG1jcG43NjVfbWFwX2lycTsKLQotCXJldHVybjsKLX0KLXN0YXRpYyB2b2lkIF9faW5pdAotbWNwbjc2NV9zZXR1cF9hcmNoKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCi0JaWYgKCBwcGNfbWQucHJvZ3Jlc3MgKQotCQlwcGNfbWQucHJvZ3Jlc3MoIm1jcG43NjVfc2V0dXBfYXJjaDogZW50ZXIiLCAwKTsKLQotCWxvb3BzX3Blcl9qaWZmeSA9IDUwMDAwMDAwIC8gSFo7Ci0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQlpZiAoaW5pdHJkX3N0YXJ0KQotCQlST09UX0RFViA9IFJvb3RfUkFNMDsKLQllbHNlCi0jZW5kaWYKLSNpZmRlZglDT05GSUdfUk9PVF9ORlMKLQkJUk9PVF9ERVYgPSBSb290X05GUzsKLSNlbHNlCi0JCVJPT1RfREVWID0gUm9vdF9TREEyOwotI2VuZGlmCi0KLQlpZiAoIHBwY19tZC5wcm9ncmVzcyApCi0JCXBwY19tZC5wcm9ncmVzcygibWNwbjc2NV9zZXR1cF9hcmNoOiBmaW5kX2JyaWRnZXMiLCAwKTsKLQotCS8qIExvb2t1cCBQQ0kgaG9zdCBicmlkZ2VzICovCi0JbWNwbjc2NV9maW5kX2JyaWRnZXMoKTsKLQotCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoMCk7Ci0JaXNhX2lvX2Jhc2UgPSAodWxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0OwotCi0JVE9EQ19JTklUKFRPRENfVFlQRV9NSzQ4VDM3LAotCQkgIChNQ1BONzY1X1BIWVNfTlZSQU1fQVMwIC0gaXNhX2lvX2Jhc2UpLAotCQkgIChNQ1BONzY1X1BIWVNfTlZSQU1fQVMxIC0gaXNhX2lvX2Jhc2UpLAotCQkgIChNQ1BONzY1X1BIWVNfTlZSQU1fREFUQSAtIGlzYV9pb19iYXNlKSwKLQkJICA4KTsKLQotCU9wZW5QSUNfSW5pdFNlbnNlcyA9IG1jcG43NjVfb3BlbnBpY19pbml0c2Vuc2VzOwotCU9wZW5QSUNfTnVtSW5pdFNlbnNlcyA9IHNpemVvZihtY3BuNzY1X29wZW5waWNfaW5pdHNlbnNlcyk7Ci0KLQlwcmludGsoIk1vdG9yb2xhIE1DRyBNQ1BONzY1IGNQQ0kgTm9uLVN5c3RlbSBCb2FyZFxuIik7Ci0JcHJpbnRrKCJNQ1BONzY1IHBvcnQgKE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKHNvdXJjZUBtdmlzdGEuY29tKSlcbiIpOwotCi0JaWYgKCBwcGNfbWQucHJvZ3Jlc3MgKQotCQlwcGNfbWQucHJvZ3Jlc3MoIm1jcG43NjVfc2V0dXBfYXJjaDogZXhpdCIsIDApOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQKLW1jcG43NjVfaW5pdDIodm9pZCkKLXsKLQotCXJlcXVlc3RfcmVnaW9uKDB4MDAsMHgyMCwiZG1hMSIpOwotCXJlcXVlc3RfcmVnaW9uKDB4MjAsMHgyMCwicGljMSIpOwotCXJlcXVlc3RfcmVnaW9uKDB4NDAsMHgyMCwidGltZXIiKTsKLQlyZXF1ZXN0X3JlZ2lvbigweDgwLDB4MTAsImRtYSBwYWdlIHJlZyIpOwotCXJlcXVlc3RfcmVnaW9uKDB4YTAsMHgyMCwicGljMiIpOwotCXJlcXVlc3RfcmVnaW9uKDB4YzAsMHgyMCwiZG1hMiIpOwotCi0JcmV0dXJuOwotfQotCi0vKgotICogSW50ZXJydXB0IHNldHVwIGFuZCBzZXJ2aWNlLgotICogSGF2ZSBNUElDIG9uIEhBV0sgYW5kIGNhc2NhZGVkIDgyNTlzIG9uIFZJQSA4MjU4NiBjYXNjYWRlZCB0byBNUElDLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQKLW1jcG43NjVfaW5pdF9JUlEodm9pZCkKLXsKLQlpbnQgaTsKLQotCWlmICggcHBjX21kLnByb2dyZXNzICkKLQkJcHBjX21kLnByb2dyZXNzKCJpbml0X2lycTogZW50ZXIiLCAwKTsKLQotCW9wZW5waWNfaW5pdChOVU1fODI1OV9JTlRFUlJVUFRTKTsKLQlvcGVucGljX2hvb2t1cF9jYXNjYWRlKE5VTV84MjU5X0lOVEVSUlVQVFMsICI4MmM1OSBjYXNjYWRlIiwKLQkJCWk4MjU5X2lycSk7Ci0KLQlmb3IoaT0wOyBpIDwgTlVNXzgyNTlfSU5URVJSVVBUUzsgaSsrKQotCQlpcnFfZGVzY1tpXS5oYW5kbGVyID0gJmk4MjU5X3BpYzsKLQotCWk4MjU5X2luaXQoMCk7Ci0KLQlpZiAoIHBwY19tZC5wcm9ncmVzcyApCi0JCXBwY19tZC5wcm9ncmVzcygiaW5pdF9pcnE6IGV4aXQiLCAwKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHUzMgotbWNwbjc2NV9pcnFfY2Fub25pY2FsaXplKHUzMiBpcnEpCi17Ci0JaWYgKGlycSA9PSAyKQotCQlyZXR1cm4gOTsKLQllbHNlCi0JCXJldHVybiBpcnE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdAotbWNwbjc2NV9maW5kX2VuZF9vZl9tZW1vcnkodm9pZCkKLXsKLQlyZXR1cm4gaGF3a19nZXRfbWVtX3NpemUoTUNQTjc2NV9IQVdLX1NNQ19CQVNFKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0Ci1tY3BuNzY1X21hcF9pbyh2b2lkKQotewotCWlvX2Jsb2NrX21hcHBpbmcoMHhmZTgwMDAwMCwgMHhmZTgwMDAwMCwgMHgwMDgwMDAwMCwgX1BBR0VfSU8pOwotfQotCi1zdGF0aWMgdm9pZAotbWNwbjc2NV9yZXNldF9ib2FyZCh2b2lkKQotewotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0KLQkvKiBzZXQgVklBIElERSBjb250cm9sbGVyIGludG8gbmF0aXZlIG1vZGUgKi8KLQltY3BuNzY1X3NldF9WSUFfSURFX25hdGl2ZSgpOwotCi0JLyogU2V0IGV4Y2VwdGlvbiBwcmVmaXggaGlnaCAtIHRvIHRoZSBmaXJtd2FyZSAqLwotCV9ubWFza19hbmRfb3JfbXNyKDAsIE1TUl9JUCk7Ci0KLQlvdXRfOCgodV9jaGFyICopTUNQTjc2NV9CT0FSRF9NT0RSU1RfUkVHLCAweDAxKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLW1jcG43NjVfcmVzdGFydChjaGFyICpjbWQpCi17Ci0Jdm9sYXRpbGUgdWxvbmcJaSA9IDEwMDAwMDAwOwotCi0JbWNwbjc2NV9yZXNldF9ib2FyZCgpOwotCi0Jd2hpbGUgKGktLSA+IDApOwotCXBhbmljKCJyZXN0YXJ0IGZhaWxlZFxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tY3BuNzY1X3Bvd2VyX29mZih2b2lkKQotewotCW1jcG43NjVfaGFsdCgpOwotCS8qIE5PVFJFQUNIRUQgKi8KLX0KLQotc3RhdGljIHZvaWQKLW1jcG43NjVfaGFsdCh2b2lkKQotewotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0Jd2hpbGUgKDEpOwotCS8qIE5PVFJFQUNIRUQgKi8KLX0KLQotc3RhdGljIGludAotbWNwbjc2NV9zaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptKQotewotCXNlcV9wcmludGYobSwgInZlbmRvclx0XHQ6IE1vdG9yb2xhIE1DR1xuIik7Ci0Jc2VxX3ByaW50ZihtLCAibWFjaGluZVx0XHQ6IE1DUE43NjVcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZXQgQkFUIDMgdG8gbWFwIDB4ZjAwMDAwMDAgdG8gZW5kIG9mIHBoeXNpY2FsIG1lbW9yeSBzcGFjZS4KLSAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZAotbWNwbjc2NV9zZXRfYmF0KHZvaWQpCi17Ci0JbWIoKTsKLQltdHNwcihTUFJOX0RCQVQxVSwgMHhmZTgwMDBmZSk7Ci0JbXRzcHIoU1BSTl9EQkFUMUwsIDB4ZmU4MDAwMmEpOwotCW1iKCk7Ci19Ci0KLXZvaWQgX19pbml0Ci1wbGF0Zm9ybV9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCi0JCXVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpCi17Ci0JcGFyc2VfYm9vdGluZm8oZmluZF9ib290aW5mbygpKTsKLQotCS8qIE1hcCBpbiBib2FyZCByZWdzLCBldGMuICovCi0JbWNwbjc2NV9zZXRfYmF0KCk7Ci0KLQlpc2FfbWVtX2Jhc2UgPSBNQ1BONzY1X0lTQV9NRU1fQkFTRTsKLQlwY2lfZHJhbV9vZmZzZXQgPSBNQ1BONzY1X1BDSV9EUkFNX09GRlNFVDsKLQlJU0FfRE1BX1RIUkVTSE9MRCA9IDB4MDBmZmZmZmY7Ci0JRE1BX01PREVfUkVBRCA9IDB4NDQ7Ci0JRE1BX01PREVfV1JJVEUgPSAweDQ4OwotCi0JcHBjX21kLnNldHVwX2FyY2ggPSBtY3BuNzY1X3NldHVwX2FyY2g7Ci0JcHBjX21kLnNob3dfY3B1aW5mbyA9IG1jcG43NjVfc2hvd19jcHVpbmZvOwotCXBwY19tZC5pcnFfY2Fub25pY2FsaXplID0gbWNwbjc2NV9pcnFfY2Fub25pY2FsaXplOwotCXBwY19tZC5pbml0X0lSUSA9IG1jcG43NjVfaW5pdF9JUlE7Ci0JcHBjX21kLmdldF9pcnEgPSBvcGVucGljX2dldF9pcnE7Ci0JcHBjX21kLmluaXQgPSBtY3BuNzY1X2luaXQyOwotCi0JcHBjX21kLnJlc3RhcnQgPSBtY3BuNzY1X3Jlc3RhcnQ7Ci0JcHBjX21kLnBvd2VyX29mZiA9IG1jcG43NjVfcG93ZXJfb2ZmOwotCXBwY19tZC5oYWx0ID0gbWNwbjc2NV9oYWx0OwotCi0JcHBjX21kLmZpbmRfZW5kX29mX21lbW9yeSA9IG1jcG43NjVfZmluZF9lbmRfb2ZfbWVtb3J5OwotCXBwY19tZC5zZXR1cF9pb19tYXBwaW5ncyA9IG1jcG43NjVfbWFwX2lvOwotCi0JcHBjX21kLnRpbWVfaW5pdCA9IHRvZGNfdGltZV9pbml0OwotCXBwY19tZC5zZXRfcnRjX3RpbWUgPSB0b2RjX3NldF9ydGNfdGltZTsKLQlwcGNfbWQuZ2V0X3J0Y190aW1lID0gdG9kY19nZXRfcnRjX3RpbWU7Ci0JcHBjX21kLmNhbGlicmF0ZV9kZWNyID0gdG9kY19jYWxpYnJhdGVfZGVjcjsKLQotCXBwY19tZC5udnJhbV9yZWFkX3ZhbCA9IHRvZGNfbTQ4dHh4X3JlYWRfdmFsOwotCXBwY19tZC5udnJhbV93cml0ZV92YWwgPSB0b2RjX200OHR4eF93cml0ZV92YWw7Ci0KLQlwcGNfbWQuaGVhcnRiZWF0ID0gTlVMTDsKLQlwcGNfbWQuaGVhcnRiZWF0X3Jlc2V0ID0gMDsKLQlwcGNfbWQuaGVhcnRiZWF0X2NvdW50ID0gMDsKLQotI2lmZGVmIENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRwotCXBwY19tZC5wcm9ncmVzcyA9IGdlbjU1MF9wcm9ncmVzczsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19LR0RCCi0JcHBjX21kLmtnZGJfbWFwX3NjYyA9IGdlbjU1MF9rZ2RiX21hcF9zY2M7Ci0jZW5kaWYKLQotCXJldHVybjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9tY3BuNzY1LmggYi9hcmNoL3BwYy9wbGF0Zm9ybXMvbWNwbjc2NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDM1ZWNhLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9tY3BuNzY1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIGFyY2gvcHBjL3BsYXRmb3Jtcy9tY3BuNzY1LmgKLSAqCi0gKiBEZWZpbml0aW9ucyBmb3IgTW90b3JvbGEgTUNHIE1DUE43NjUgY1BDSSBCb2FyZC4KLSAqCi0gKiBBdXRob3I6IE1hcmsgQS4gR3JlZXIKLSAqICAgICAgICAgbWdyZWVyQG12aXN0YS5jb20KLSAqCi0gKiAyMDAxLTIwMDQgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKi8KLQotLyoKLSAqIEZyb20gUHJvY2Vzc29yIHRvIFBDSToKLSAqICAgUENJIE1lbSBTcGFjZTogMHg4MDAwMDAwMCAtIDB4YzAwMDAwMDAgLT4gMHg4MDAwMDAwMCAtIDB4YzAwMDAwMDAgKDEgR0IpCi0gKiAgIFBDSSBJL08gU3BhY2U6IDB4ZmQ4MDAwMDAgLSAweGZlMDAwMDAwIC0+IDB4MDAwMDAwMDAgLSAweDAwODAwMDAwICg4IE1CKQotICoJTm90ZTogTXVzdCBza2lwIDB4ZmUwMDAwMDAtMHhmZTQwMDAwMCBmb3IgQ09ORklHX0hJR0hNRU0vUEtNQVAgYXJlYQotICogICBNUElDIGluIFBDSSBNZW0gU3BhY2U6IDB4ZmU4MDAwMDAgLSAweGZlODMwMDAwIChub3QgYWxsIHVzZWQgYnkgTVBJQykKLSAqCi0gKiBGcm9tIFBDSSB0byBQcm9jZXNzb3I6Ci0gKiAgIFN5c3RlbSBNZW1vcnk6IDB4MDAwMDAwMDAgLT4gMHgwMDAwMDAwMAotICovCi0KLSNpZm5kZWYgX19QUENfUExBVEZPUk1TX01DUE43NjVfSAotI2RlZmluZSBfX1BQQ19QTEFURk9STVNfTUNQTjc2NV9ICi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0KLS8qIFBDSSBNZW1vcnkgc3BhY2UgbWFwcGluZyBpbmZvICovCi0jZGVmaW5lCU1DUE43NjVfUENJX01FTV9TSVpFCQkweDQwMDAwMDAwVQotI2RlZmluZSBNQ1BONzY1X1BST0NfUENJX01FTV9TVEFSVAkweDgwMDAwMDAwVQotI2RlZmluZSBNQ1BONzY1X1BST0NfUENJX01FTV9FTkQJKE1DUE43NjVfUFJPQ19QQ0lfTUVNX1NUQVJUICsJXAotCQkJCQkgTUNQTjc2NV9QQ0lfTUVNX1NJWkUgLSAxKQotI2RlZmluZSBNQ1BONzY1X1BDSV9NRU1fU1RBUlQJCTB4ODAwMDAwMDBVCi0jZGVmaW5lIE1DUE43NjVfUENJX01FTV9FTkQJCShNQ1BONzY1X1BDSV9NRU1fU1RBUlQgKwlcCi0JCQkJCSBNQ1BONzY1X1BDSV9NRU1fU0laRSAtIDEpCi0KLS8qIFBDSSBJL08gc3BhY2UgbWFwcGluZyBpbmZvICovCi0jZGVmaW5lCU1DUE43NjVfUENJX0lPX1NJWkUJCTB4MDA4MDAwMDBVCi0jZGVmaW5lIE1DUE43NjVfUFJPQ19QQ0lfSU9fU1RBUlQJMHhmZDgwMDAwMFUKLSNkZWZpbmUgTUNQTjc2NV9QUk9DX1BDSV9JT19FTkQJCShNQ1BONzY1X1BST0NfUENJX0lPX1NUQVJUICsJXAotCQkJCQkgTUNQTjc2NV9QQ0lfSU9fU0laRSAtIDEpCi0jZGVmaW5lIE1DUE43NjVfUENJX0lPX1NUQVJUCQkweDAwMDAwMDAwVQotI2RlZmluZSBNQ1BONzY1X1BDSV9JT19FTkQJCShNQ1BONzY1X1BDSV9JT19TVEFSVCArIAlcCi0JCQkJCSBNQ1BONzY1X1BDSV9JT19TSVpFIC0gMSkKLQotLyogU3lzdGVtIG1lbW9yeSBtYXBwaW5nIGluZm8gKi8KLSNkZWZpbmUgTUNQTjc2NV9QQ0lfRFJBTV9PRkZTRVQJCTB4MDAwMDAwMDBVCi0jZGVmaW5lIE1DUE43NjVfUENJX1BIWV9NRU1fT0ZGU0VUCTB4MDAwMDAwMDBVCi0KLSNkZWZpbmUgTUNQTjc2NV9JU0FfTUVNX0JBU0UJCTB4MDAwMDAwMDBVCi0jZGVmaW5lIE1DUE43NjVfSVNBX0lPX0JBU0UJCU1DUE43NjVfUFJPQ19QQ0lfSU9fU1RBUlQKLQotLyogRGVmaW5lIGJhc2UgYWRkcmVzc2VzIGZvciBpbXBvcnRhbnQgc2V0cyBvZiByZWdpc3RlcnMgKi8KLSNkZWZpbmUgTUNQTjc2NV9IQVdLX01QSUNfQkFTRQkJMHhmZTgwMDAwMFUKLSNkZWZpbmUgTUNQTjc2NV9IQVdLX1NNQ19CQVNFCQkweGZlZjgwMDAwVQotI2RlZmluZQlNQ1BONzY1X0hBV0tfUFBDX1JFR19CQVNFCTB4ZmVmZjAwMDBVCi0KLS8qIERlZmluZSBNQ1BONzY1IGJvYXJkIHJlZ2lzdGVyIGFkZHJlc3Nlcy4gKi8KLSNkZWZpbmUJTUNQTjc2NV9CT0FSRF9TVEFUVVNfUkVHCTB4ZmVmODgwODBVCi0jZGVmaW5lCU1DUE43NjVfQk9BUkRfTU9ERkFJTF9SRUcJMHhmZWY4ODA5MFUKLSNkZWZpbmUJTUNQTjc2NV9CT0FSRF9NT0RSU1RfUkVHCTB4ZmVmODgwYTBVCi0jZGVmaW5lCU1DUE43NjVfQk9BUkRfVEJFTl9SRUcJCTB4ZmVmODgwYzBVCi0jZGVmaW5lCU1DUE43NjVfQk9BUkRfR0VPR1JBUEhJQ0FMX1JFRwkweGZlZjg4MGU4VQotI2RlZmluZQlNQ1BONzY1X0JPQVJEX0VYVF9GRUFUVVJFX1JFRwkweGZlZjg4MGYwVQotI2RlZmluZQlNQ1BONzY1X0JPQVJEX0xBU1RfUkVTRVRfUkVHCTB4ZmVmODgwZjhVCi0KLS8qIERlZmluZXMgZm9yIFVBUlQgKi8KLQotLyogRGVmaW5lIHRoZSBVQVJUIGJhc2UgYWRkcmVzc2VzICovCi0jZGVmaW5lCU1DUE43NjVfU0VSSUFMXzEJCTB4ZmVmODgwMDAKLSNkZWZpbmUJTUNQTjc2NV9TRVJJQUxfMgkJMHhmZWY4ODIwMAotI2RlZmluZQlNQ1BONzY1X1NFUklBTF8zCQkweGZlZjg4NDAwCi0jZGVmaW5lCU1DUE43NjVfU0VSSUFMXzQJCTB4ZmVmODg2MDAKLQotI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwotI2RlZmluZSBSU19UQUJMRV9TSVpFICA2NAotI2Vsc2UKLSNkZWZpbmUgUlNfVEFCTEVfU0laRSAgNAotI2VuZGlmCi0KLS8qIFJhdGUgZm9yIHRoZSAxLjg0MzIgTWh6IGNsb2NrIGZvciB0aGUgb25ib2FyZCBzZXJpYWwgY2hpcCAqLwotI2RlZmluZSBCQVNFX0JBVUQJKCAxODQzMjAwIC8gMTYgKQotI2RlZmluZSBVQVJUX0NMSwkxODQzMjAwCi0KLSNpZmRlZiBDT05GSUdfU0VSSUFMX0RFVEVDVF9JUlEKLSNkZWZpbmUgU1REX0NPTV9GTEFHUyAoQVNZTkNfQk9PVF9BVVRPQ09ORnxBU1lOQ19TS0lQX1RFU1R8QVNZTkNfQVVUT19JUlEpCi0jZWxzZQotI2RlZmluZSBTVERfQ09NX0ZMQUdTIChBU1lOQ19CT09UX0FVVE9DT05GfEFTWU5DX1NLSVBfVEVTVCkKLSNlbmRpZgotCi0vKiBBbGwgVUFSVCBJUlEncyBhcmUgd2lyZS1PUidkIHRvIElSUSAxNyAqLwotI2RlZmluZSBTVERfU0VSSUFMX1BPUlRfREZOUyBcCi0gICAgICAgIHsgMCwgQkFTRV9CQVVELCBNQ1BONzY1X1NFUklBTF8xLCAxNywgU1REX0NPTV9GTEFHUywgLyogdHR5UzAgKi9cCi0JCWlvbWVtX2Jhc2U6ICh1OCAqKU1DUE43NjVfU0VSSUFMXzEsCQkJXAotCQlpb21lbV9yZWdfc2hpZnQ6IDQsCQkJCQlcCi0JCWlvX3R5cGU6IFNFUklBTF9JT19NRU0gfSwJCQkJXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgTUNQTjc2NV9TRVJJQUxfMiwgMTcsIFNURF9DT01fRkxBR1MsIC8qIHR0eVMxICovXAotCQlpb21lbV9iYXNlOiAodTggKilNQ1BONzY1X1NFUklBTF8yLAkJCVwKLQkJaW9tZW1fcmVnX3NoaWZ0OiA0LAkJCQkJXAotCQlpb190eXBlOiBTRVJJQUxfSU9fTUVNIH0sCQkJCVwKLSAgICAgICAgeyAwLCBCQVNFX0JBVUQsIE1DUE43NjVfU0VSSUFMXzMsIDE3LCBTVERfQ09NX0ZMQUdTLCAvKiB0dHlTMiAqL1wKLQkJaW9tZW1fYmFzZTogKHU4ICopTUNQTjc2NV9TRVJJQUxfMywJCQlcCi0JCWlvbWVtX3JlZ19zaGlmdDogNCwJCQkJCVwKLQkJaW9fdHlwZTogU0VSSUFMX0lPX01FTSB9LAkJCQlcCi0gICAgICAgIHsgMCwgQkFTRV9CQVVELCBNQ1BONzY1X1NFUklBTF80LCAxNywgU1REX0NPTV9GTEFHUywgLyogdHR5UzMgKi9cCi0JCWlvbWVtX2Jhc2U6ICh1OCAqKU1DUE43NjVfU0VSSUFMXzQsCQkJXAotCQlpb21lbV9yZWdfc2hpZnQ6IDQsCQkJCQlcCi0JCWlvX3R5cGU6IFNFUklBTF9JT19NRU0gfSwKLQotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TIFwKLSAgICAgICAgU1REX1NFUklBTF9QT1JUX0RGTlMKLQotLyogRGVmaW5lIHRoZSBOVlJBTS9SVEMgYWRkcmVzcyBzdHJvYmUgJiBkYXRhIHJlZ2lzdGVycyAqLwotI2RlZmluZSBNQ1BONzY1X1BIWVNfTlZSQU1fQVMwICAgICAgICAgIDB4ZmVmODgwYzhVCi0jZGVmaW5lIE1DUE43NjVfUEhZU19OVlJBTV9BUzEgICAgICAgICAgMHhmZWY4ODBkMFUKLSNkZWZpbmUgTUNQTjc2NV9QSFlTX05WUkFNX0RBVEEgICAgICAgICAweGZlZjg4MGQ4VQotCi1leHRlcm4gdm9pZCBtY3BuNzY1X2ZpbmRfYnJpZGdlcyh2b2lkKTsKLQotI2VuZGlmIC8qIF9fUFBDX1BMQVRGT1JNU19NQ1BONzY1X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wY29yZS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3Bjb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTkxNjMuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3Bjb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoKLSAqIGFyY2gvcHBjL3BsYXRmb3Jtcy9wY29yZV9zZXR1cC5jCi0gKgotICogU2V0dXAgcm91dGluZXMgZm9yIEZvcmNlIFBDT1JFIGJvYXJkcwotICoKLSAqIEF1dGhvcjogTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAbXZpc3RhLmNvbT4KLSAqCi0gKiAyMDAxIChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQotICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCi0gKiBvciBpbXBsaWVkLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vaTgyNTkuaD4KLSNpbmNsdWRlIDxhc20vbXBjMTB4Lmg+Ci0jaW5jbHVkZSA8YXNtL3RvZGMuaD4KLSNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KLSNpbmNsdWRlIDxhc20va2dkYi5oPgotCi0jaW5jbHVkZSAicGNvcmUuaCIKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OwotCi1zdGF0aWMgaW50IGJvYXJkX3R5cGU7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IF9faW5pdAotcGNvcmVfNjc1MF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIGNoYXIgaWRzZWwsIHVuc2lnbmVkIGNoYXIgcGluKQotewotCXN0YXRpYyBjaGFyIHBjaV9pcnFfdGFibGVbXVs0XSA9Ci0JLyoKLQkgKiAgICAgIFBDSSBJRFNFTC9JTlRQSU4tPklOVExJTkUKLQkgKiAgICAgIEEgICAgICAgQiAgICAgICBDICAgICAgIEQKLQkgKi8KLQl7Ci0JCXs5LAkxMCwJMTEsCTEyfSwJLyogSURTRUwgMjQgLSBERUMgMjE1NTQgKi8KLQkJezEwLAkwLAkwLAkwfSwJLyogSURTRUwgMjUgLSBERUMgMjExNDMgKi8KLQkJezExLAkxMiwJOSwJMTB9LAkvKiBJRFNFTCAyNiAtIFBNQyBJICovCi0JCXsxMiwJOSwJMTAsCTExfSwJLyogSURTRUwgMjcgLSBQTUMgSUkgKi8KLQkJezAsCTAsCTAsCTB9LAkvKiBJRFNFTCAyOCAtIHVudXNlZCAqLwotCQl7MCwJMCwJOSwJMH0sCS8qIElEU0VMIDI5IC0gdW51c2VkICovCi0JCXswLAkwLAkwLAkwfSwJLyogSURTRUwgMzAgLSBXaW5ib25kICovCi0JCX07Ci0JY29uc3QgbG9uZyBtaW5faWRzZWwgPSAyNCwgbWF4X2lkc2VsID0gMzAsIGlycXNfcGVyX3Nsb3QgPSA0OwotCXJldHVybiBQQ0lfSVJRX1RBQkxFX0xPT0tVUDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50IF9faW5pdAotcGNvcmVfNjgwX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgY2hhciBpZHNlbCwgdW5zaWduZWQgY2hhciBwaW4pCi17Ci0Jc3RhdGljIGNoYXIgcGNpX2lycV90YWJsZVtdWzRdID0KLQkvKgotCSAqICAgICAgUENJIElEU0VML0lOVFBJTi0+SU5UTElORQotCSAqICAgICAgQSAgICAgICBCICAgICAgIEMgICAgICAgRAotCSAqLwotCXsKLQkJezksCTEwLAkxMSwJMTJ9LAkvKiBJRFNFTCAyNCAtIFNlbnRpbmVsICovCi0JCXsxMCwJMCwJMCwJMH0sCS8qIElEU0VMIDI1IC0gaTgyNTU5ICMxICovCi0JCXsxMSwJMTIsCTksCTEwfSwJLyogSURTRUwgMjYgLSBQTUMgSSAqLwotCQl7MTIsCTksCTEwLAkxMX0sCS8qIElEU0VMIDI3IC0gUE1DIElJICovCi0JCXs5LAkwLAkwLAkwfSwJLyogSURTRUwgMjggLSBpODI1NTkgIzIgKi8KLQkJezAsCTAsCTAsCTB9LAkvKiBJRFNFTCAyOSAtIHVudXNlZCAqLwotCQl7MCwJMCwJMCwJMH0sCS8qIElEU0VMIDMwIC0gV2luYm9uZCAqLwotCQl9OwotCWNvbnN0IGxvbmcgbWluX2lkc2VsID0gMjQsIG1heF9pZHNlbCA9IDMwLCBpcnFzX3Blcl9zbG90ID0gNDsKLQlyZXR1cm4gUENJX0lSUV9UQUJMRV9MT09LVVA7Ci19OwotCi12b2lkIF9faW5pdAotcGNvcmVfcGNpYmlvc19maXh1cCh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0KLQlpZiAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfV0lOQk9ORCwKLQkJCQlQQ0lfREVWSUNFX0lEX1dJTkJPTkRfODNDNTUzLAotCQkJCTApKSkKLQl7Ci0JCS8qIFJlcm91dGUgaW50ZXJydXB0cyBib3RoIElERSBjaGFubmVscyB0byAxNSAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LAotCQkJCVBDT1JFX1dJTkJPTkRfSURFX0lOVCwKLQkJCQkweGZmKTsKLQotCQkvKiBSb3V0ZSBJTlRBLUQgdG8gSVJROS0xMiwgcmVzcGVjdGl2ZWx5ICovCi0JCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsCi0JCQkJUENPUkVfV0lOQk9ORF9QQ0lfSU5ULAotCQkJCTB4OWFiYyk7Ci0KLQkJLyoKLQkJICogU2V0IHVwIDgyNTkgZWRnZS9sZXZlbCB0cmlnZ2VyaW5nCi0JCSAqLwotIAkJb3V0YigweDAwLCBQQ09SRV9XSU5CT05EX1BSSV9FREdfTFZMKTsKLQkJb3V0YigweDFlLCBQQ09SRV9XSU5CT05EX1NFQ19FREdfTFZMKTsKLQkJcGNpX2Rldl9wdXQoZGV2KTsKLQl9Ci19Ci0KLWludCBfX2luaXQKLXBjb3JlX2ZpbmRfYnJpZGdlcyh2b2lkKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKLQlpbnQgaG9zdF9icmlkZ2UsIGJvYXJkX3R5cGU7Ci0KLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7Ci0JaWYgKCFob3NlKQotCQlyZXR1cm4gMDsKLQotCW1wYzEweF9icmlkZ2VfaW5pdChob3NlLAotCQkJTVBDMTBYX01FTV9NQVBfQiwKLQkJCU1QQzEwWF9NRU1fTUFQX0IsCi0JCQlNUEMxMFhfTUFQQl9FVU1CX0JBU0UpOwotCi0JLyogRGV0ZXJtaW5lIGJvYXJkIHR5cGUgKi8KLQllYXJseV9yZWFkX2NvbmZpZ19kd29yZChob3NlLAotCQkJMCwKLQkJCVBDSV9ERVZGTigwLDApLAotCQkJUENJX1ZFTkRPUl9JRCwKLQkJCSZob3N0X2JyaWRnZSk7Ci0JaWYgKGhvc3RfYnJpZGdlID09IE1QQzEwWF9CUklER0VfMTA2KQotCQlib2FyZF90eXBlID0gUENPUkVfVFlQRV82NzUwOwotCWVsc2UgLyogTVBDMTBYX0JSSURHRV8xMDcgKi8KLQkJYm9hcmRfdHlwZSA9IFBDT1JFX1RZUEVfNjgwOwotCi0JaG9zZS0+bGFzdF9idXNubyA9IHBjaWF1dG9fYnVzX3NjYW4oaG9zZSwgaG9zZS0+Zmlyc3RfYnVzbm8pOwotCi0JcHBjX21kLnBjaWJpb3NfZml4dXAgPSBwY29yZV9wY2liaW9zX2ZpeHVwOwotCXBwY19tZC5wY2lfc3dpenpsZSA9IGNvbW1vbl9zd2l6emxlOwotCi0JaWYgKGJvYXJkX3R5cGUgPT0gUENPUkVfVFlQRV82NzUwKQotCQlwcGNfbWQucGNpX21hcF9pcnEgPSBwY29yZV82NzUwX21hcF9pcnE7Ci0JZWxzZSAvKiBQQ09SRV9UWVBFXzY4MCAqLwotCQlwcGNfbWQucGNpX21hcF9pcnEgPSBwY29yZV82ODBfbWFwX2lycTsKLQotCXJldHVybiBib2FyZF90eXBlOwotfQotCi0vKiBEdW1teSB2YXJpYWJsZSB0byBzYXRpc2Z5IG1wYzEweF9jb21tb24ubyAqLwotdm9pZCAqT3BlblBJQ19BZGRyOwotCi1zdGF0aWMgaW50Ci1wY29yZV9zaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptKQotewotCXNlcV9wcmludGYobSwgInZlbmRvclx0XHQ6IEZvcmNlIENvbXB1dGVyc1xuIik7Ci0KLQlpZiAoYm9hcmRfdHlwZSA9PSBQQ09SRV9UWVBFXzY3NTApCi0JCXNlcV9wcmludGYobSwgIm1hY2hpbmVcdFx0OiBQb3dlckNvcmUgNjc1MFxuIik7Ci0JZWxzZSAvKiBQQ09SRV9UWVBFXzY4MCAqLwotCQlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogUG93ZXJDb3JlIDY4MFxuIik7Ci0KLQlzZXFfcHJpbnRmKG0sICJMMlx0XHQ6ICIgKTsKLQlpZiAoYm9hcmRfdHlwZSA9PSBQQ09SRV9UWVBFXzY3NTApCi0JCXN3aXRjaCAocmVhZGIoUENPUkVfRENDUl9SRUcpICYgUENPUkVfRENDUl9MMl9NQVNLKQotCQl7Ci0JCQljYXNlIFBDT1JFX0RDQ1JfTDJfMEtCOgotCQkJCXNlcV9wcmludGYobSwgIm5vY2FjaGUiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUENPUkVfRENDUl9MMl8yNTZLQjoKLQkJCQlzZXFfcHJpbnRmKG0sICIyNTZLQiIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQQ09SRV9EQ0NSX0wyXzFNQjoKLQkJCQlzZXFfcHJpbnRmKG0sICIxTUIiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUENPUkVfRENDUl9MMl81MTJLQjoKLQkJCQlzZXFfcHJpbnRmKG0sICI1MTJLQiIpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzZXFfcHJpbnRmKG0sICJlcnJvciIpOwotCQkJCWJyZWFrOwotCQl9Ci0JZWxzZSAvKiBQQ09SRV9UWVBFXzY4MCAqLwotCQlzd2l0Y2ggKHJlYWRiKFBDT1JFX0RDQ1JfUkVHKSAmIFBDT1JFX0RDQ1JfTDJfTUFTSykKLQkJewotCQkJY2FzZSBQQ09SRV9EQ0NSX0wyXzJNQjoKLQkJCQlzZXFfcHJpbnRmKG0sICIyTUIiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUENPUkVfRENDUl9MMl8yNTZLQjoKLQkJCQlzZXFfcHJpbnRmKG0sICJyZXNlcnZlZCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQQ09SRV9EQ0NSX0wyXzFNQjoKLQkJCQlzZXFfcHJpbnRmKG0sICIxTUIiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUENPUkVfRENDUl9MMl81MTJLQjoKLQkJCQlzZXFfcHJpbnRmKG0sICI1MTJLQiIpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzZXFfcHJpbnRmKG0sICJlcnJvciIpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQlzZXFfcHJpbnRmKG0sICJcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdAotcGNvcmVfc2V0dXBfYXJjaCh2b2lkKQotewotCS8qIGluaXQgdG8gc29tZSB+c2FuZSB2YWx1ZSB1bnRpbCBjYWxpYnJhdGVfZGVsYXkoKSBydW5zICovCi0JbG9vcHNfcGVyX2ppZmZ5ID0gNTAwMDAwMDAvSFo7Ci0KLQkvKiBMb29rdXAgUENJIGhvc3QgYnJpZGdlcyAqLwotCWJvYXJkX3R5cGUgPSBwY29yZV9maW5kX2JyaWRnZXMoKTsKLQotI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAotCWlmIChpbml0cmRfc3RhcnQpCi0JCVJPT1RfREVWID0gUm9vdF9SQU0wOwotICAgICAgICBlbHNlCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUk9PVF9ORlMKLQkJUk9PVF9ERVYgPSBSb290X05GUzsKLSNlbHNlCi0JCVJPT1RfREVWID0gUm9vdF9TREEyOwotI2VuZGlmCi0KLSAJcHJpbnRrKEtFUk5fSU5GTyAiRm9yY2UgUG93ZXJDb3JlICIpOwotCWlmIChib2FyZF90eXBlID09IFBDT1JFX1RZUEVfNjc1MCkKLQkJcHJpbnRrKCI2NzUwXG4iKTsKLQllbHNlCi0JCXByaW50aygiNjgwXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICJQb3J0IGJ5IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKHNvdXJjZUBtdmlzdGEuY29tKVxuIik7Ci0JX3NldF9MMkNSKEwyQ1JfTDJFIHwgX2dldF9MMkNSKCkpOwotCi19Ci0KLXN0YXRpYyB2b2lkCi1wY29yZV9yZXN0YXJ0KGNoYXIgKmNtZCkKLXsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCS8qIEhhcmQgcmVzZXQgKi8KLQl3cml0ZWIoMHgxMSwgMHhmZTAwMDMzMik7Ci0Jd2hpbGUoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wY29yZV9oYWx0KHZvaWQpCi17Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkvKiBUdXJuIG9mZiB1c2VyIExFRHMgKi8KLQl3cml0ZWIoMHgwMCwgMHhmZTAwMDMwMCk7Ci0Jd2hpbGUgKDEpOwotfQotCi1zdGF0aWMgdm9pZAotcGNvcmVfcG93ZXJfb2ZmKHZvaWQpCi17Ci0JcGNvcmVfaGFsdCgpOwotfQotCi0KLXN0YXRpYyB2b2lkIF9faW5pdAotcGNvcmVfaW5pdF9JUlEodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoIGkgPSAwIDsgaSA8IDE2IDsgaSsrICkKLQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZpODI1OV9waWM7Ci0KLQlpODI1OV9pbml0KDApOwotfQotCi0vKgotICogU2V0IEJBVCAzIHRvIG1hcCAweGYwMDAwMDAwIHRvIGVuZCBvZiBwaHlzaWNhbCBtZW1vcnkgc3BhY2UuCi0gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLXBjb3JlX3NldF9iYXQodm9pZCkKLXsKLQltYigpOwotCW10c3ByKFNQUk5fREJBVDNVLCAweGYwMDAxZmZlKTsKLQltdHNwcihTUFJOX0RCQVQzTCwgMHhmZTgwMDAyYSk7Ci0JbWIoKTsKLQotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQKLXBjb3JlX2ZpbmRfZW5kX29mX21lbW9yeSh2b2lkKQotewotCi0JcmV0dXJuIG1wYzEweF9nZXRfbWVtX3NpemUoTVBDMTBYX01FTV9NQVBfQik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdAotcGNvcmVfbWFwX2lvKHZvaWQpCi17Ci0JaW9fYmxvY2tfbWFwcGluZygweGZlMDAwMDAwLCAweGZlMDAwMDAwLCAweDAyMDAwMDAwLCBfUEFHRV9JTyk7Ci19Ci0KLVRPRENfQUxMT0MoKTsKLQotdm9pZCBfX2luaXQKLXBsYXRmb3JtX2luaXQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKLQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNykKLXsKLQlwYXJzZV9ib290aW5mbyhmaW5kX2Jvb3RpbmZvKCkpOwotCi0JLyogQ292ZXIgSS9PIHNwYWNlIHdpdGggYSBCQVQgKi8KLQkvKiB5dWNrLCBiZXR0ZXIgaG9wZSB5b3VyIHJhbSBzaXplIGlzIGEgcG93ZXIgb2YgMiAgLS0gcGF1bHVzICovCi0JcGNvcmVfc2V0X2JhdCgpOwotCi0JaXNhX2lvX2Jhc2UgPSBNUEMxMFhfTUFQQl9JU0FfSU9fQkFTRTsKLQlpc2FfbWVtX2Jhc2UgPSBNUEMxMFhfTUFQQl9JU0FfTUVNX0JBU0U7Ci0JcGNpX2RyYW1fb2Zmc2V0ID0gTVBDMTBYX01BUEJfRFJBTV9PRkZTRVQ7Ci0KLQlwcGNfbWQuc2V0dXBfYXJjaAk9IHBjb3JlX3NldHVwX2FyY2g7Ci0JcHBjX21kLnNob3dfY3B1aW5mbwk9IHBjb3JlX3Nob3dfY3B1aW5mbzsKLQlwcGNfbWQuaW5pdF9JUlEJCT0gcGNvcmVfaW5pdF9JUlE7Ci0JcHBjX21kLmdldF9pcnEJCT0gaTgyNTlfaXJxOwotCi0JcHBjX21kLmZpbmRfZW5kX29mX21lbW9yeSA9IHBjb3JlX2ZpbmRfZW5kX29mX21lbW9yeTsKLQlwcGNfbWQuc2V0dXBfaW9fbWFwcGluZ3MgPSBwY29yZV9tYXBfaW87Ci0KLQlwcGNfbWQucmVzdGFydAkJPSBwY29yZV9yZXN0YXJ0OwotCXBwY19tZC5wb3dlcl9vZmYJPSBwY29yZV9wb3dlcl9vZmY7Ci0JcHBjX21kLmhhbHQJCT0gcGNvcmVfaGFsdDsKLQotCVRPRENfSU5JVChUT0RDX1RZUEVfTUs0OFQ1OSwKLQkJICBQQ09SRV9OVlJBTV9BUzAsCi0JCSAgUENPUkVfTlZSQU1fQVMxLAotCQkgIFBDT1JFX05WUkFNX0RBVEEsCi0JCSAgOCk7Ci0KLQlwcGNfbWQudGltZV9pbml0CT0gdG9kY190aW1lX2luaXQ7Ci0JcHBjX21kLmdldF9ydGNfdGltZQk9IHRvZGNfZ2V0X3J0Y190aW1lOwotCXBwY19tZC5zZXRfcnRjX3RpbWUJPSB0b2RjX3NldF9ydGNfdGltZTsKLQlwcGNfbWQuY2FsaWJyYXRlX2RlY3IJPSB0b2RjX2NhbGlicmF0ZV9kZWNyOwotCi0JcHBjX21kLm52cmFtX3JlYWRfdmFsCT0gdG9kY19tNDh0eHhfcmVhZF92YWw7Ci0JcHBjX21kLm52cmFtX3dyaXRlX3ZhbAk9IHRvZGNfbTQ4dHh4X3dyaXRlX3ZhbDsKLQotI2lmZGVmIENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRwotCXBwY19tZC5wcm9ncmVzcyA9IGdlbjU1MF9wcm9ncmVzczsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19LR0RCCi0JcHBjX21kLmtnZGJfbWFwX3NjYyA9IGdlbjU1MF9rZ2RiX21hcF9zY2M7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wY29yZS5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3Bjb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YTI2ZTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3Bjb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogYXJjaC9wcGMvcGxhdGZvcm1zL3Bjb3JlLmgKLSAqCi0gKiBEZWZpbml0aW9ucyBmb3IgRm9yY2UgUG93ZXJDb3JlIGJvYXJkIHN1cHBvcnQKLSAqCi0gKiBBdXRob3I6IE1hdHQgUG9ydGVyIDxtcG9ydGVyQG12aXN0YS5jb20+Ci0gKgotICogMjAwMSAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgotICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0KLSAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwotICogb3IgaW1wbGllZC4KLSAqLwotCi0jaWZuZGVmIF9fUFBDX1BMQVRGT1JNU19QQ09SRV9ICi0jZGVmaW5lIF9fUFBDX1BMQVRGT1JNU19QQ09SRV9ICi0KLSNpbmNsdWRlIDxhc20vbXBjMTB4Lmg+Ci0KLSNkZWZpbmUgUENPUkVfVFlQRV82NzUwCQkJMQotI2RlZmluZSBQQ09SRV9UWVBFXzY4MAkJCTIKLQotI2RlZmluZSBQQ09SRV9OVlJBTV9BUzAJCQkweDczCi0jZGVmaW5lIFBDT1JFX05WUkFNX0FTMQkJCTB4NzUKLSNkZWZpbmUgUENPUkVfTlZSQU1fREFUQQkJMHg3NwotCi0jZGVmaW5lIFBDT1JFX0RDQ1JfUkVHCQkJKE1QQzEwWF9NQVBCX0lTQV9JT19CQVNFICsgMHgzMDgpCi0jZGVmaW5lIFBDT1JFX0RDQ1JfTDJfTUFTSwkJMHhjMAotI2RlZmluZSBQQ09SRV9EQ0NSX0wyXzBLQgkJMHgwMAotI2RlZmluZSBQQ09SRV9EQ0NSX0wyXzI1NktCCQkweDQwCi0jZGVmaW5lIFBDT1JFX0RDQ1JfTDJfNTEyS0IJCTB4YzAKLSNkZWZpbmUgUENPUkVfRENDUl9MMl8xTUIJCTB4ODAKLSNkZWZpbmUgUENPUkVfRENDUl9MMl8yTUIJCTB4MDAKLQotI2RlZmluZSBQQ09SRV9XSU5CT05EX0lERV9JTlQJCTB4NDMKLSNkZWZpbmUgUENPUkVfV0lOQk9ORF9QQ0lfSU5UCQkweDQ0Ci0jZGVmaW5lIFBDT1JFX1dJTkJPTkRfUFJJX0VER19MVkwJMHg0ZDAKLSNkZWZpbmUgUENPUkVfV0lOQk9ORF9TRUNfRURHX0xWTAkweDRkMQotCi0jZW5kaWYgLyogX19QUENfUExBVEZPUk1TX1BDT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3BpYy5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfcGljLmMKaW5kZXggOWY5MmUxYi4uMmNlMDU4OCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfcGljLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfcGljLmMKQEAgLTYxOSw3ICs2MTksNyBAQAogCXJldHVybiB2aWFpbnQ7CiB9CiAKLXN0YXRpYyBpbnQgcG1hY3BpY19zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIHUzMiBzdGF0ZSkKK3N0YXRpYyBpbnQgcG1hY3BpY19zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlpbnQgdmlhaW50ID0gcG1hY3BpY19maW5kX3ZpYWludCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbGVlcC5TIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfc2xlZXAuUwppbmRleCAwMTZhNzQ2Li44ODQxOWM3IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbGVlcC5TCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3NsZWVwLlMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjZGVmaW5lIE1BR0lDCTB4NGM2MTcyNzMJLyogJ0xhcnMnICovCiAKQEAgLTE2MSw2ICsxNjEsOCBAQAogCWFkZGkgcjMscjMsc2xlZXBfc3RvcmFnZUBsCiAJc3R3IHI1LDAocjMpCiAKKwkuZ2xvYmwJbG93X2NwdV9kaWUKK2xvd19jcHVfZGllOgogCS8qIEZsdXNoICYgZGlzYWJsZSBhbGwgY2FjaGVzICovCiAJYmwJZmx1c2hfZGlzYWJsZV9jYWNoZXMKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfc21wLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbXAuYwppbmRleCA4ZTA0OWRhLi43OTRhMjM5IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbXAuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbXAuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgpAQCAtNTUsOSArNTYsNyBAQAogICogUG93ZXJzdXJnZSAob2xkIHBvd2VybWFjIFNNUCkgc3VwcG9ydC4KICAqLwogCi1leHRlcm4gdm9pZCBfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2Uodm9pZCk7Ci1leHRlcm4gdm9pZCBfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2UyKHZvaWQpOwkvKiBUZW1wb3JhcnkgaG9ycmlibGUgaGFjayAqLwotZXh0ZXJuIHZvaWQgX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlMyh2b2lkKTsJLyogVGVtcG9yYXJ5IGhvcnJpYmxlIGhhY2sgKi8KK2V4dGVybiB2b2lkIF9fc2Vjb25kYXJ5X3N0YXJ0X3BtYWNfMCh2b2lkKTsKIAogLyogQWRkcmVzc2VzIGZvciBwb3dlcnN1cmdlIHJlZ2lzdGVycyAqLwogI2RlZmluZSBIQU1NRVJIRUFEX0JBU0UJCTB4ZjgwMDAwMDAKQEAgLTExOSw3ICsxMTgsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBwcmlfdGJfaGksIHByaV90Yl9sbzsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHJpX3RiX3N0YW1wOwogCi1zdGF0aWMgdm9pZCBfX2luaXQgY29yZTk5X2luaXRfY2FjaGVzKGludCBjcHUpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgY29yZTk5X2luaXRfY2FjaGVzKGludCBjcHUpCiB7CiAJaWYgKCFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9MMkNSKSkKIAkJcmV0dXJuOwpAQCAtMzQ2LDcgKzM0NSw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzbXBfcHN1cmdlX2tpY2tfY3B1KGludCBucikKIHsKLQl2b2lkICgqc3RhcnQpKHZvaWQpID0gX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBfX3BhKF9fc2Vjb25kYXJ5X3N0YXJ0X3BtYWNfMCkgKyBuciAqIDg7CiAJdW5zaWduZWQgbG9uZyBhOwogCiAJLyogbWF5IG5lZWQgdG8gZmx1c2ggaGVyZSBpZiBzZWNvbmRhcnkgYmF0cyBhcmVuJ3Qgc2V0dXAgKi8KQEAgLTM1NiwxNyArMzU1LDcgQEAKIAogCWlmIChwcGNfbWQucHJvZ3Jlc3MpIHBwY19tZC5wcm9ncmVzcygic21wX3BzdXJnZV9raWNrX2NwdSIsIDB4MzUzKTsKIAotCS8qIHNldHVwIGVudHJ5IHBvaW50IG9mIHNlY29uZGFyeSBwcm9jZXNzb3IgKi8KLQlzd2l0Y2ggKG5yKSB7Ci0JY2FzZSAyOgotCQlzdGFydCA9IF9fc2Vjb25kYXJ5X3N0YXJ0X3BzdXJnZTI7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJc3RhcnQgPSBfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2UzOwotCQlicmVhazsKLQl9Ci0KLQlvdXRfYmUzMihwc3VyZ2Vfc3RhcnQsIF9fcGEoc3RhcnQpKTsKKwlvdXRfYmUzMihwc3VyZ2Vfc3RhcnQsIHN0YXJ0KTsKIAltYigpOwogCiAJcHN1cmdlX3NldF9pcGkobnIpOwpAQCAtNTAwLDE0ICs0ODksMTQgQEAKIAlyZXR1cm4gbmNwdXM7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzbXBfY29yZTk5X2tpY2tfY3B1KGludCBucikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbXBfY29yZTk5X2tpY2tfY3B1KGludCBucikKIHsKIAl1bnNpZ25lZCBsb25nIHNhdmVfdmVjdG9yLCBuZXdfdmVjdG9yOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp2ZWN0b3IKIAkJID0gKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEtFUk5FTEJBU0UrMHgxMDApKTsKLQlpZiAobnIgPCAxIHx8IG5yID4gMykKKwlpZiAobnIgPCAwIHx8IG5yID4gMykKIAkJcmV0dXJuOwogCWlmIChwcGNfbWQucHJvZ3Jlc3MpIHBwY19tZC5wcm9ncmVzcygic21wX2NvcmU5OV9raWNrX2NwdSIsIDB4MzQ2KTsKIApAQCAtNTE4LDE5ICs1MDcsOSBAQAogCXNhdmVfdmVjdG9yID0gKnZlY3RvcjsKIAogCS8qIFNldHVwIGZha2UgcmVzZXQgdmVjdG9yIHRoYXQgZG9lcwkKLQkgKiAgIGIgX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlIC0gS0VSTkVMQkFTRQorCSAqICAgYiBfX3NlY29uZGFyeV9zdGFydF9wbWFjXzAgKyBucio4IC0gS0VSTkVMQkFTRQogCSAqLwotCXN3aXRjaChucikgewotCQljYXNlIDE6Ci0JCQluZXdfdmVjdG9yID0gKHVuc2lnbmVkIGxvbmcpX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCW5ld192ZWN0b3IgPSAodW5zaWduZWQgbG9uZylfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2UyOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCW5ld192ZWN0b3IgPSAodW5zaWduZWQgbG9uZylfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2UzOwotCQkJYnJlYWs7Ci0JfQorCW5ld192ZWN0b3IgPSAodW5zaWduZWQgbG9uZykgX19zZWNvbmRhcnlfc3RhcnRfcG1hY18wICsgbnIgKiA4OwogCSp2ZWN0b3IgPSAweDQ4MDAwMDAyICsgbmV3X3ZlY3RvciAtIEtFUk5FTEJBU0U7CiAKIAkvKiBmbHVzaCBkYXRhIGNhY2hlIGFuZCBpbnZhbCBpbnN0cnVjdGlvbiBjYWNoZSAqLwpAQCAtNTU0LDcgKzUzMyw3IEBACiAJaWYgKHBwY19tZC5wcm9ncmVzcykgcHBjX21kLnByb2dyZXNzKCJzbXBfY29yZTk5X2tpY2tfY3B1IGRvbmUiLCAweDM0Nyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzbXBfY29yZTk5X3NldHVwX2NwdShpbnQgY3B1X25yKQorc3RhdGljIHZvaWQgX19kZXZpbml0IHNtcF9jb3JlOTlfc2V0dXBfY3B1KGludCBjcHVfbnIpCiB7CiAJLyogU2V0dXAgTDIvTDMgKi8KIAlpZiAoY3B1X25yICE9IDApCkBAIC02NjgsMyArNjQ3LDQ3IEBACiAJLmdpdmVfdGltZWJhc2UJPSBzbXBfY29yZTk5X2dpdmVfdGltZWJhc2UsCiAJLnRha2VfdGltZWJhc2UJPSBzbXBfY29yZTk5X3Rha2VfdGltZWJhc2UsCiB9OworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisKK2ludCBfX2NwdV9kaXNhYmxlKHZvaWQpCit7CisJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X29ubGluZV9tYXApOworCisJLyogWFhYIHJlc2V0IGNwdSBhZmZpbml0eSBoZXJlICovCisJb3BlbnBpY19zZXRfcHJpb3JpdHkoMHhmKTsKKwlhc20gdm9sYXRpbGUoIm10ZGVjICUwIiA6IDogInIiICgweDdmZmZmZmZmKSk7CisJbWIoKTsKKwl1ZGVsYXkoMjApOworCWFzbSB2b2xhdGlsZSgibXRkZWMgJTAiIDogOiAiciIgKDB4N2ZmZmZmZmYpKTsKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIHZvaWQgbG93X2NwdV9kaWUodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsgLyogaW4gcG1hY19zbGVlcC5TICovCitzdGF0aWMgaW50IGNwdV9kZWFkW05SX0NQVVNdOworCit2b2lkIGNwdV9kaWUodm9pZCkKK3sKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWNwdV9kZWFkW3NtcF9wcm9jZXNzb3JfaWQoKV0gPSAxOworCW1iKCk7CisJbG93X2NwdV9kaWUoKTsKK30KKwordm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpbnQgdGltZW91dDsKKworCXRpbWVvdXQgPSAxMDAwOworCXdoaWxlICghY3B1X2RlYWRbY3B1XSkgeworCQlpZiAoLS10aW1lb3V0ID09IDApIHsKKwkJCXByaW50aygiQ1BVICV1IHJlZnVzZWQgdG8gZGllIVxuIiwgY3B1KTsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgxKTsKKwl9CisJY3B1X2NhbGxpbl9tYXBbY3B1XSA9IDA7CisJY3B1X2RlYWRbY3B1XSA9IDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3NwZDh4eC5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3NwZDh4eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDQ4ZDE0Li4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9zcGQ4eHguaAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBTcGVlY2ggRGVzaWduIFNQRDh4eFRTIGJvYXJkIHNwZWNpZmljIGRlZmluaXRpb25zCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDEgV29sZmdhbmcgRGVuayAod2RAZGVueC5kZSkKLSAqLwotCi0jaWZkZWYgX19LRVJORUxfXwotI2lmbmRlZiBfX0FTTV9TUEQ4WFhfSF9fCi0jZGVmaW5lIF9fQVNNX1NQRDhYWF9IX18KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotCi0jaW5jbHVkZSA8YXNtL3BwY2Jvb3QuaD4KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLSNkZWZpbmUgU1BEX0lNTVJfQkFTRQkweEZGRjAwMDAwCS8qIHBoeXMuIGFkZHIgb2YgSU1NUiAqLwotI2RlZmluZSBTUERfSU1BUF9TSVpFCSg2NCAqIDEwMjQpCS8qIHNpemUgb2YgbWFwcGVkIGFyZWEgKi8KLQotI2RlZmluZSBJTUFQX0FERFIJU1BEX0lNTVJfQkFTRQkvKiBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgSU1NUiBhcmVhICovCi0jZGVmaW5lIElNQVBfU0laRQlTUERfSU1BUF9TSVpFCS8qIG1hcHBlZCBzaXplIG9mIElNTVIgYXJlYSAqLwotCi0jZGVmaW5lIFBDTUNJQV9NRU1fQUREUgkoKHVpbnQpMHhGRTEwMDAwMCkKLSNkZWZpbmUgUENNQ0lBX01FTV9TSVpFCSgodWludCkoNjQgKiAxMDI0KSkKLQotI2RlZmluZSBJREUwX0lOVEVSUlVQVAkxMAkJLyogPSBJUlE1ICovCi0jZGVmaW5lIElERTFfSU5URVJSVVBUCTEyCQkvKiA9IElSUTYgKi8KLSNkZWZpbmUgQ1BNX0lOVEVSUlVQVAkxMwkJLyogPSBTSVVfTEVWRUw2ICh3YXM6IFNJVV9MRVZFTDIpICovCi0KLS8qIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG51bWJlciBvZiBJREUgaGFyZHdhcmUgaW50ZXJmYWNlcyAqLwotI2RlZmluZSBNQVhfSFdJRlMJMgotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIElERTAgSW50ZXJmYWNlCi0gKi8KLSNkZWZpbmUgSURFMF9CQVNFX09GRlNFVAkJMHgwMDAwCS8qIE9mZnNldCBpbiBQQ01DSUEgbWVtb3J5ICovCi0jZGVmaW5lIElERTBfREFUQV9SRUdfT0ZGU0VUCQkweDAwMDAKLSNkZWZpbmUgSURFMF9FUlJPUl9SRUdfT0ZGU0VUCQkweDAwODEKLSNkZWZpbmUgSURFMF9OU0VDVE9SX1JFR19PRkZTRVQJCTB4MDA4MgotI2RlZmluZSBJREUwX1NFQ1RPUl9SRUdfT0ZGU0VUCQkweDAwODMKLSNkZWZpbmUgSURFMF9MQ1lMX1JFR19PRkZTRVQJCTB4MDA4NAotI2RlZmluZSBJREUwX0hDWUxfUkVHX09GRlNFVAkJMHgwMDg1Ci0jZGVmaW5lIElERTBfU0VMRUNUX1JFR19PRkZTRVQJCTB4MDA4NgotI2RlZmluZSBJREUwX1NUQVRVU19SRUdfT0ZGU0VUCQkweDAwODcKLSNkZWZpbmUgSURFMF9DT05UUk9MX1JFR19PRkZTRVQJCTB4MDEwNgotI2RlZmluZSBJREUwX0lSUV9SRUdfT0ZGU0VUCQkweDAwMEEJLyogbm90IHVzZWQgKi8KLQotLyoKLSAqIERlZmluaXRpb25zIGZvciBJREUxIEludGVyZmFjZQotICovCi0jZGVmaW5lIElERTFfQkFTRV9PRkZTRVQJCTB4MEMwMAkvKiBPZmZzZXQgaW4gUENNQ0lBIG1lbW9yeSAqLwotI2RlZmluZSBJREUxX0RBVEFfUkVHX09GRlNFVAkJMHgwMDAwCi0jZGVmaW5lIElERTFfRVJST1JfUkVHX09GRlNFVAkJMHgwMDgxCi0jZGVmaW5lIElERTFfTlNFQ1RPUl9SRUdfT0ZGU0VUCQkweDAwODIKLSNkZWZpbmUgSURFMV9TRUNUT1JfUkVHX09GRlNFVAkJMHgwMDgzCi0jZGVmaW5lIElERTFfTENZTF9SRUdfT0ZGU0VUCQkweDAwODQKLSNkZWZpbmUgSURFMV9IQ1lMX1JFR19PRkZTRVQJCTB4MDA4NQotI2RlZmluZSBJREUxX1NFTEVDVF9SRUdfT0ZGU0VUCQkweDAwODYKLSNkZWZpbmUgSURFMV9TVEFUVVNfUkVHX09GRlNFVAkJMHgwMDg3Ci0jZGVmaW5lIElERTFfQ09OVFJPTF9SRUdfT0ZGU0VUCQkweDAxMDYKLSNkZWZpbmUgSURFMV9JUlFfUkVHX09GRlNFVAkJMHgwMDBBCS8qIG5vdCB1c2VkICovCi0KLS8qIENQTSBFdGhlcm5ldCB0aHJvdWdoIFNDQ3guCi0gKgotICogQml0cyBpbiBwYXJhbGxlbCBJL08gcG9ydCByZWdpc3RlcnMgdGhhdCBoYXZlIHRvIGJlIHNldC9jbGVhcmVkCi0gKiB0byBjb25maWd1cmUgdGhlIHBpbnMgZm9yIFNDQzIgdXNlLgotICovCi0jZGVmaW5lIFBBX0VORVRfTURDCSgodXNob3J0KTB4MDAwMSkJLyogUEEgMTUgISEhICovCi0jZGVmaW5lIFBBX0VORVRfTURJTwkoKHVzaG9ydCkweDAwMDIpCS8qIFBBIDE0ICEhISAqLwotI2RlZmluZSBQQV9FTkVUX1JYRAkoKHVzaG9ydCkweDAwMDQpCS8qIFBBIDEzICovCi0jZGVmaW5lIFBBX0VORVRfVFhECSgodXNob3J0KTB4MDAwOCkJLyogUEEgMTIgKi8KLSNkZWZpbmUgUEFfRU5FVF9SQ0xLCSgodXNob3J0KTB4MDIwMCkJLyogUEEgIDYgKi8KLSNkZWZpbmUgUEFfRU5FVF9UQ0xLCSgodXNob3J0KTB4MDQwMCkJLyogUEEgIDUgKi8KLQotI2RlZmluZSBQQl9FTkVUX1RFTkEJKCh1aW50KTB4MDAwMDIwMDApCS8qIFBCIDE4ICovCi0KLSNkZWZpbmUgUENfRU5FVF9DTFNOCSgodXNob3J0KTB4MDA0MCkJLyogUEMgIDkgKi8KLSNkZWZpbmUgUENfRU5FVF9SRU5BCSgodXNob3J0KTB4MDA4MCkJLyogUEMgIDggKi8KLSNkZWZpbmUgUENfRU5FVF9SRVNFVAkoKHVzaG9ydCkweDAxMDApCS8qIFBDICA3ICEhISAqLwotCi0vKiBDb250cm9sIGJpdHMgaW4gdGhlIFNJQ1IgdG8gcm91dGUgVENMSyAoQ0xLMykgYW5kIFJDTEsgKENMSzIpIHRvCi0gKiBTQ0MyLiAgQWxzbywgbWFrZSBzdXJlIEdSMiAoYml0IDE2KSBhbmQgU0MyIChiaXQgMTcpIGFyZSB6ZXJvLgotICovCi0jZGVmaW5lIFNJQ1JfRU5FVF9NQVNLCSgodWludCkweDAwMDBmZjAwKQotI2RlZmluZSBTSUNSX0VORVRfQ0xLUlQJKCh1aW50KTB4MDAwMDJFMDApCi0KLS8qIFdlIGRvbid0IHVzZSB0aGUgODI1OS4KLSovCi0jZGVmaW5lIE5SXzgyNTlfSU5UUwkwCi0KLSNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0jZW5kaWYgLyogX19BU01fU1BEOFhYX0hfXyAqLwotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy90cW04eHguaCBiL2FyY2gvcHBjL3BsYXRmb3Jtcy90cW04eHguaAppbmRleCAyMTUwZGM4Li40M2FjMDY0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvdHFtOHh4LmgKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3RxbTh4eC5oCkBAIC0xNDcsMjkgKzE0Nyw2IEBACiAjZGVmaW5lIFNJQ1JfRU5FVF9DTEtSVAkoKHVpbnQpMHgwMDAwMjYwMCkKICNlbmRpZgkvKiBDT05GSUdfRlBTODUwTCAqLwogCi0vKioqICBTTTg1MCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgU004NTAgU2VydmljZSBNb2R1bGUgdXNlcyBTQ0MyIGZvciBJckRBIGFuZCBTQ0MzIGZvciBFdGhlcm5ldCAqLwotCi0jaWZkZWYgQ09ORklHX1NNODUwCi0jZGVmaW5lIFBCX0VORVRfUlhECSgodWludCkweDAwMDAwMDA0KQkvKiBQQiAyOSAqLwotI2RlZmluZSBQQl9FTkVUX1RYRAkoKHVpbnQpMHgwMDAwMDAwMikJLyogUEIgMzAgKi8KLSNkZWZpbmUgUEFfRU5FVF9SQ0xLCSgodXNob3J0KTB4MDEwMCkJLyogUEEgIDcgKi8KLSNkZWZpbmUgUEFfRU5FVF9UQ0xLCSgodXNob3J0KTB4MDQwMCkJLyogUEEgIDUgKi8KLQotI2RlZmluZSBQQ19FTkVUX0xCSwkoKHVzaG9ydCkweDAwMDgpCS8qIFBDIDEyICovCi0jZGVmaW5lIFBDX0VORVRfVEVOQQkoKHVzaG9ydCkweDAwMDQpCS8qIFBDIDEzICovCi0KLSNkZWZpbmUgUENfRU5FVF9SRU5BCSgodXNob3J0KTB4MDgwMCkJLyogUEMgIDQgKi8KLSNkZWZpbmUgUENfRU5FVF9DTFNOCSgodXNob3J0KTB4MDQwMCkJLyogUEMgIDUgKi8KLQotLyogQ29udHJvbCBiaXRzIGluIHRoZSBTSUNSIHRvIHJvdXRlIFRDTEsgKENMSzMpIGFuZCBSQ0xLIChDTEsxKSB0bwotICogU0NDMy4gIEFsc28sIG1ha2Ugc3VyZSBHUjMgKGJpdCA4KSBhbmQgU0MzIChiaXQgOSkgYXJlIHplcm8uCi0gKi8KLSNkZWZpbmUgU0lDUl9FTkVUX01BU0sJKCh1aW50KTB4MDBGRjAwMDApCi0jZGVmaW5lIFNJQ1JfRU5FVF9DTEtSVAkoKHVpbnQpMHgwMDI2MDAwMCkKLSNlbmRpZgkvKiBDT05GSUdfU004NTAgKi8KLQogLyogV2UgZG9uJ3QgdXNlIHRoZSA4MjU5LgogKi8KICNkZWZpbmUgTlJfODI1OV9JTlRTCTAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZSBiL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZQppbmRleCAyMjBhNjVhLi44YjliMjI2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvc3lzbGliL01ha2VmaWxlCkBAIC00Myw4ICs0Myw2IEBACiBvYmotJChDT05GSUdfUE9XRVI0KQkJKz0gb3Blbl9waWMyLm8KIG9iai0kKENPTkZJR19QUENfQ0hSUCkJCSs9IG9wZW5fcGljLm8gaW5kaXJlY3RfcGNpLm8gaTgyNTkubwogb2JqLSQoQ09ORklHX1BQQ19QUkVQKQkJKz0gb3Blbl9waWMubyBpbmRpcmVjdF9wY2kubyBpODI1OS5vIHRvZGNfdGltZS5vCi1vYmotJChDT05GSUdfQURJUikJCSs9IGk4MjU5Lm8gaW5kaXJlY3RfcGNpLm8gcGNpX2F1dG8ubyBcCi0JCQkJCXRvZGNfdGltZS5vCiBvYmotJChDT05GSUdfQkFNQk9PKQkJKz0gaW5kaXJlY3RfcGNpLm8gcGNpX2F1dG8ubyB0b2RjX3RpbWUubwogb2JqLSQoQ09ORklHX0NQQ0k2OTApCQkrPSB0b2RjX3RpbWUubyBwY2lfYXV0by5vCiBvYmotJChDT05GSUdfRUJPTlkpCQkrPSBpbmRpcmVjdF9wY2kubyBwY2lfYXV0by5vIHRvZGNfdGltZS5vCkBAIC01MiwxNiArNTAsMTAgQEAKIG9iai0kKENPTkZJR19DSEVTVE5VVCkJCSs9IG12NjQzNjBfcGljLm8gcGNpX2F1dG8ubwogb2JqLSQoQ09ORklHX0dFTUlOSSkJCSs9IG9wZW5fcGljLm8gaW5kaXJlY3RfcGNpLm8KIG9iai0kKENPTkZJR19HVDY0MjYwKQkJKz0gZ3Q2NDI2MF9waWMubwotb2JqLSQoQ09ORklHX0syKQkJKz0gaTgyNTkubyBpbmRpcmVjdF9wY2kubyB0b2RjX3RpbWUubyBcCi0JCQkJCXBjaV9hdXRvLm8KIG9iai0kKENPTkZJR19MT1BFQykJCSs9IGk4MjU5Lm8gcGNpX2F1dG8ubyB0b2RjX3RpbWUubwogb2JqLSQoQ09ORklHX0hEUFUpCQkrPSBwY2lfYXV0by5vCiBvYmotJChDT05GSUdfTFVBTikJCSs9IGluZGlyZWN0X3BjaS5vIHBjaV9hdXRvLm8gdG9kY190aW1lLm8KIG9iai0kKENPTkZJR19LQVRBTkEpCQkrPSBwY2lfYXV0by5vCi1vYmotJChDT05GSUdfTUNQTjc2NSkJCSs9IHRvZGNfdGltZS5vIGluZGlyZWN0X3BjaS5vIHBjaV9hdXRvLm8gXAotCQkJCQlvcGVuX3BpYy5vIGk4MjU5Lm8gaGF3a19jb21tb24ubwotb2JqLSQoQ09ORklHX01FTkYxKQkJKz0gdG9kY190aW1lLm8gaTgyNTkubyBtcGMxMHhfY29tbW9uLm8gXAotCQkJCQlwY2lfYXV0by5vIGluZGlyZWN0X3BjaS5vCiBvYmotJChDT05GSUdfTVY2NDM2MCkJCSs9IG12NjQzNjBfcGljLm8KIG9iai0kKENPTkZJR19NVjY0WDYwKQkJKz0gbXY2NHg2MC5vIG12NjR4NjBfd2luLm8gaW5kaXJlY3RfcGNpLm8KIG9iai0kKENPTkZJR19NVk1FNTEwMCkJCSs9IG9wZW5fcGljLm8gdG9kY190aW1lLm8gaW5kaXJlY3RfcGNpLm8gXApAQCAtNjksNyArNjEsNiBAQAogb2JqLSQoQ09ORklHX01WTUU1MTAwX0lQTUM3NjFfUFJFU0VOVCkJKz0gaTgyNTkubwogb2JqLSQoQ09ORklHX09DT1RFQSkJCSs9IGluZGlyZWN0X3BjaS5vIHBjaV9hdXRvLm8gdG9kY190aW1lLm8KIG9iai0kKENPTkZJR19QQUw0KQkJKz0gY3BjNzAwX3BpYy5vCi1vYmotJChDT05GSUdfUENPUkUpCQkrPSB0b2RjX3RpbWUubyBpODI1OS5vIHBjaV9hdXRvLm8KIG9iai0kKENPTkZJR19QT1dFUlBNQzI1MCkJKz0gcGNpX2F1dG8ubwogb2JqLSQoQ09ORklHX1BQTFVTKQkJKz0gaGF3a19jb21tb24ubyBvcGVuX3BpYy5vIGk4MjU5Lm8gXAogCQkJCSAgIGluZGlyZWN0X3BjaS5vIHRvZGNfdGltZS5vIHBjaV9hdXRvLm8KQEAgLTgyLDcgKzczLDggQEAKIG9iai0kKENPTkZJR19TQkM4Mnh4KQkJKz0gdG9kY190aW1lLm8KIG9iai0kKENPTkZJR19TUFJVQ0UpCQkrPSBjcGM3MDBfcGljLm8gaW5kaXJlY3RfcGNpLm8gcGNpX2F1dG8ubyBcCiAJCQkJICAgdG9kY190aW1lLm8KLW9iai0kKENPTkZJR184MjYwKQkJKz0gbTgyNjBfc2V0dXAubworb2JqLSQoQ09ORklHXzgyNjApCQkrPSBtODI2MF9zZXR1cC5vIHBxMl9kZXZpY2VzLm8gcHEyX3N5cy5vIFwKKwkJCQkgICBwcGNfc3lzLm8KIG9iai0kKENPTkZJR19QQ0lfODI2MCkJCSs9IG04Mnh4X3BjaS5vIGluZGlyZWN0X3BjaS5vIHBjaV9hdXRvLm8KIG9iai0kKENPTkZJR184MjYwX1BDSTkpCQkrPSBtODI2MF9wY2lfZXJyYXR1bTkubwogb2JqLSQoQ09ORklHX0NQTTIpCQkrPSBjcG0yX2NvbW1vbi5vIGNwbTJfcGljLm8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9jcGM3MDBfcGljLmMgYi9hcmNoL3BwYy9zeXNsaWIvY3BjNzAwX3BpYy5jCmluZGV4IDc3NDcwOTguLjc1ZmU4ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9jcGM3MDBfcGljLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL2NwYzcwMF9waWMuYwpAQCAtOTAsMTQgKzkwLDEwIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgY3BjNzAwX3BpYyA9IHsKLQkiQ1BDNzAwIFBJQyIsCi0JTlVMTCwKLQlOVUxMLAotCWNwYzcwMF91bm1hc2tfaXJxLAotCWNwYzcwMF9tYXNrX2lycSwKLQljcGM3MDBfbWFza19hbmRfYWNrX2lycSwKLQlOVUxMLAotCU5VTEwKKwkudHlwZW5hbWUgPSAiQ1BDNzAwIFBJQyIsCisJLmVuYWJsZSA9IGNwYzcwMF91bm1hc2tfaXJxLAorCS5kaXNhYmxlID0gY3BjNzAwX21hc2tfaXJxLAorCS5hY2sgPSBjcGM3MDBfbWFza19hbmRfYWNrX2lycSwKIH07CiAKIF9faW5pdCBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL2k4MjU5LmMgYi9hcmNoL3BwYy9zeXNsaWIvaTgyNTkuYwppbmRleCBiOTM5MWU2Li41Yzc5MDhjIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvaTgyNTkuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvaTgyNTkuYwpAQCAtMTI5LDE0ICsxMjksMTEgQEAKIH0KIAogc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGk4MjU5X3BpYyA9IHsKLQkiIGk4MjU5ICAgICIsCi0JTlVMTCwKLQlOVUxMLAotCWk4MjU5X3VubWFza19pcnEsCi0JaTgyNTlfbWFza19pcnEsCi0JaTgyNTlfbWFza19hbmRfYWNrX2lycSwKLQlpODI1OV9lbmRfaXJxLAotCU5VTEwKKwkudHlwZW5hbWUgPSAiIGk4MjU5ICAgICIsCisJLmVuYWJsZSA9IGk4MjU5X3VubWFza19pcnEsCisJLmRpc2FibGUgPSBpODI1OV9tYXNrX2lycSwKKwkuYWNrID0gaTgyNTlfbWFza19hbmRfYWNrX2lycSwKKwkuZW5kID0gaTgyNTlfZW5kX2lycSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGljMV9pb3JlcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9pYm00NDBneF9jb21tb24uYyBiL2FyY2gvcHBjL3N5c2xpYi9pYm00NDBneF9jb21tb24uYwppbmRleCBkNDc3NmFmLi4wYmI5MTk4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvaWJtNDQwZ3hfY29tbW9uLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL2libTQ0MGd4X2NvbW1vbi5jCkBAIC0yMzYsOSArMjM2LDEwIEBACiAJLyogRGlzYWJsZSBMMkMgb24gcmV2LkEsIHJldi5CIGFuZCA4MDBNSHogdmVyc2lvbiBvZiByZXYuQywKIAkgICBlbmFibGUgaXQgb24gYWxsIG90aGVyIHJldmlzaW9ucwogCSAqLwotCXUzMiBwdnIgPSBtZnNwcihTUFJOX1BWUik7Ci0JaWYgKHB2ciA9PSBQVlJfNDQwR1hfUkEgfHwgcHZyID09IFBWUl80NDBHWF9SQiB8fAotCSAgICAocHZyID09IFBWUl80NDBHWF9SQyAmJiBwLT5jcHUgPiA2NjcwMDAwMDApKQorCWlmIChzdHJjbXAoY3VyX2NwdV9zcGVjWzBdLT5jcHVfbmFtZSwgIjQ0MEdYIFJldi4gQSIpID09IDAgfHwKKwkJCXN0cmNtcChjdXJfY3B1X3NwZWNbMF0tPmNwdV9uYW1lLCAiNDQwR1ggUmV2LiBCIikgPT0gMAorCQkJfHwgKHN0cmNtcChjdXJfY3B1X3NwZWNbMF0tPmNwdV9uYW1lLCAiNDQwR1ggUmV2LiBDIikKKwkJCQk9PSAwICYmIHAtPmNwdSA+IDY2NzAwMDAwMCkpCiAJCWlibTQ0MGd4X2wyY19kaXNhYmxlKCk7CiAJZWxzZQogCQlpYm00NDBneF9sMmNfZW5hYmxlKCk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvbTh4eF9zZXR1cC5jIGIvYXJjaC9wcGMvc3lzbGliL204eHhfc2V0dXAuYwppbmRleCBhMzcwMmNmLi40Yzg4OGRhIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvbTh4eF9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9tOHh4X3NldHVwLmMKQEAgLTU3LDcgKzU3LDcgQEAKIGV4dGVybiB2b2lkIG04eHhfaWRlX2luaXQodm9pZCk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGZpbmRfYXZhaWxhYmxlX21lbW9yeSh2b2lkKTsKLWV4dGVybiB2b2lkIG04eHhfY3BtX3Jlc2V0KCk7CitleHRlcm4gdm9pZCBtOHh4X2NwbV9yZXNldCh2b2lkKTsKIGV4dGVybiB2b2lkIG04eHhfd2R0X2hhbmRsZXJfaW5zdGFsbChiZF90ICpicCk7CiBleHRlcm4gdm9pZCBycHhmYl9hbGxvY19wYWdlcyh2b2lkKTsKIGV4dGVybiB2b2lkIGNwbV9pbnRlcnJ1cHRfaW5pdCh2b2lkKTsKQEAgLTI2Niw4ICsyNjYsOCBAQAogCiAJYnAgPSAoYmRfdCAqKV9fcmVzOwogCi0Jc2VxX3ByaW50ZihtLCAiY2xvY2tcdFx0OiAlbGRNSHpcbiIKLQkJICAgImJ1cyBjbG9ja1x0OiAlbGRNSHpcbiIsCisJc2VxX3ByaW50ZihtLCAiY2xvY2tcdFx0OiAldU1IelxuIgorCQkgICAiYnVzIGNsb2NrXHQ6ICV1TUh6XG4iLAogCQkgICBicC0+YmlfaW50ZnJlcSAvIDEwMDAwMDAsCiAJCSAgIGJwLT5iaV9idXNmcmVxIC8gMTAwMDAwMCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9tcGMxMHhfY29tbW9uLmMgYi9hcmNoL3BwYy9zeXNsaWIvbXBjMTB4X2NvbW1vbi5jCmluZGV4IDg3MDY1ZTIuLjNlMDM5NzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9tcGMxMHhfY29tbW9uLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL21wYzEweF9jb21tb24uYwpAQCAtMTQwLDEyICsxNDAsMTIgQEAKIAl9LAogCVtNUEMxMFhfVUFSVDBdID0gewogCQkubmFtZSA9ICJzZXJpYWw4MjUwIiwKLQkJLmlkCT0gMCwKKwkJLmlkCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCQkuZGV2LnBsYXRmb3JtX2RhdGEgPSBzZXJpYWxfcGxhdF91YXJ0MCwKIAl9LAogCVtNUEMxMFhfVUFSVDFdID0gewogCQkubmFtZSA9ICJzZXJpYWw4MjUwIiwKLQkJLmlkCT0gMSwKKwkJLmlkCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNMSwKIAkJLmRldi5wbGF0Zm9ybV9kYXRhID0gc2VyaWFsX3BsYXRfdWFydDEsCiAJfSwKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL21wYzgzeHhfZGV2aWNlcy5jIGIvYXJjaC9wcGMvc3lzbGliL21wYzgzeHhfZGV2aWNlcy5jCmluZGV4IDVhYWYwZTUuLjk1YjNiOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9tcGM4M3h4X2RldmljZXMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvbXBjODN4eF9kZXZpY2VzLmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogCX0sCiAJW01QQzgzeHhfRFVBUlRdID0gewogCQkubmFtZSA9ICJzZXJpYWw4MjUwIiwKLQkJLmlkCT0gMCwKKwkJLmlkCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCQkuZGV2LnBsYXRmb3JtX2RhdGEgPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKIAl9LAogCVtNUEM4M3h4X1NFQzJdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL21wYzg1eHhfZGV2aWNlcy5jIGIvYXJjaC9wcGMvc3lzbGliL21wYzg1eHhfZGV2aWNlcy5jCmluZGV4IDhhZjMyMmQuLmJiYzVhYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9tcGM4NXh4X2RldmljZXMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvbXBjODV4eF9kZXZpY2VzLmMKQEAgLTI4Miw3ICsyODIsNyBAQAogCX0sCiAJW01QQzg1eHhfRFVBUlRdID0gewogCQkubmFtZSA9ICJzZXJpYWw4MjUwIiwKLQkJLmlkCT0gMCwKKwkJLmlkCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCQkuZGV2LnBsYXRmb3JtX2RhdGEgPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKIAl9LAogCVtNUEM4NXh4X1BFUkZNT05dID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL212NjQzNjBfcGljLmMgYi9hcmNoL3BwYy9zeXNsaWIvbXY2NDM2MF9waWMuYwppbmRleCA3NGQ4OTk2Li44MzU2ZGE0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvbXY2NDM2MF9waWMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvbXY2NDM2MF9waWMuYwpAQCAtMzY2LDEwICszNjYsMTYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKKy8qCisgKiBCaXQgMCBvZiBNVjY0eDYwX1BDSXhfRVJSX01BU0sgZG9lcyBub3QgZXhpc3Qgb24gdGhlIDY0MzYwIGFuZCBiZWNhdXNlIG9mCisgKiBlcnJhdGEgRkVyLSMxMSBhbmQgRkVyLSMjMTYgZm9yIHRoZSA2NDQ2MCwgaXQgc2hvdWxkIGJlIDAgb24gdGhhdCBjaGlwIGFzCisgKiB3ZWxsLiAgSU9XLCBkb24ndCBzZXQgYml0IDAuCisgKi8KKyNkZWZpbmUgTVY2NDM2MF9QQ0kwX0VSUl9NQVNLX1ZBTAkweDAwYTUwYzI0CisKIHN0YXRpYyBpbnQgX19pbml0CiBtdjY0MzYwX3JlZ2lzdGVyX2hkbHJzKHZvaWQpCiB7Ci0JdTMyCW1hc2s7CiAJaW50CXJjOwogCiAJLyogQ2xlYXIgb2xkIGVycm9ycyBhbmQgcmVnaXN0ZXIgQ1BVIGludGVyZmFjZSBlcnJvciBpbnRyIGhhbmRsZXIgKi8KQEAgLTM4NywxNyArMzkzLDYgQEAKIAkJbXY2NDM2MF9zcmFtX2Vycm9yX2ludF9oYW5kbGVyLFNBX0lOVEVSUlVQVCxTUkFNX0lOVFJfU1RSLCAwKSkpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IHJlZ2lzdGVyIFNSQU0gZXJyb3IgaGFuZGxlcjogJWQiLHJjKTsKIAotCS8qCi0JICogQml0IDAgcmVzZXJ2ZWQgb24gNjQzNjAgYW5kIGVycmF0dW0gRkVyIFBDSS0jMTEgKFBDSSBpbnRlcm5hbAotCSAqIGRhdGEgcGFyaXR5IGVycm9yIHNldCBpbmNvcnJlY3RseSkgb24gcmV2IDAgJiAxIG9mIDY0NDYwIHJlcXVpcmVzCi0JICogYml0IDAgdG8gYmUgY2xlYXJlZC4KLQkgKi8KLQltYXNrID0gMHgwMGE1MGMyNDsKLQotCWlmICgobXY2NHg2MF9nZXRfYnJpZGdlX3R5cGUoKSA9PSBNVjY0eDYwX1RZUEVfTVY2NDQ2MCkgJiYKLQkJKG12NjR4NjBfZ2V0X2JyaWRnZV9yZXYoKSA+IDEpKQotCQltYXNrIHw9IDB4MTsJLyogZW5hYmxlIERQRXJyIG9uIDY0NDYwICovCi0KIAkvKiBDbGVhciBvbGQgZXJyb3JzIGFuZCByZWdpc3RlciBQQ0kgMCBlcnJvciBpbnRyIGhhbmRsZXIgKi8KIAltdjY0eDYwX3dyaXRlKCZiaCwgTVY2NHg2MF9QQ0kwX0VSUl9DQVVTRSwgMCk7CiAJaWYgKChyYyA9IHJlcXVlc3RfaXJxKE1WNjQzNjBfSVJRX1BDSTAgKyBtdjY0MzYwX2lycV9iYXNlLApAQCAtNDA3LDcgKzQwMiwxMSBAQAogCQkJcmMpOwogCiAJbXY2NHg2MF93cml0ZSgmYmgsIE1WNjR4NjBfUENJMF9FUlJfTUFTSywgMCk7Ci0JbXY2NHg2MF93cml0ZSgmYmgsIE1WNjR4NjBfUENJMF9FUlJfTUFTSywgbWFzayk7CisJbXY2NHg2MF93cml0ZSgmYmgsIE1WNjR4NjBfUENJMF9FUlJfTUFTSywgTVY2NDM2MF9QQ0kwX0VSUl9NQVNLX1ZBTCk7CisKKwkvKiBFcnJhdHVtIEZFciBQQ0ktIzE2IHNheXMgdG8gY2xlYXIgYml0IDAgb2YgUENJIFNFUlJuIE1hc2sgcmVnLiAqLworCW12NjR4NjBfd3JpdGUoJmJoLCBNVjY0eDYwX1BDSTBfRVJSX1NFUlJfTUFTSywKKwkJbXY2NHg2MF9yZWFkKCZiaCwgTVY2NHg2MF9QQ0kwX0VSUl9TRVJSX01BU0spICYgfjB4MVVMKTsKIAogCS8qIENsZWFyIG9sZCBlcnJvcnMgYW5kIHJlZ2lzdGVyIFBDSSAxIGVycm9yIGludHIgaGFuZGxlciAqLwogCW12NjR4NjBfd3JpdGUoJmJoLCBNVjY0eDYwX1BDSTFfRVJSX0NBVVNFLCAwKTsKQEAgLTQxOCw3ICs0MTcsMTEgQEAKIAkJCXJjKTsKIAogCW12NjR4NjBfd3JpdGUoJmJoLCBNVjY0eDYwX1BDSTFfRVJSX01BU0ssIDApOwotCW12NjR4NjBfd3JpdGUoJmJoLCBNVjY0eDYwX1BDSTFfRVJSX01BU0ssIG1hc2spOworCW12NjR4NjBfd3JpdGUoJmJoLCBNVjY0eDYwX1BDSTFfRVJSX01BU0ssIE1WNjQzNjBfUENJMF9FUlJfTUFTS19WQUwpOworCisJLyogRXJyYXR1bSBGRXIgUENJLSMxNiBzYXlzIHRvIGNsZWFyIGJpdCAwIG9mIFBDSSBJbnRyIE1hc2sgcmVnLiAqLworCW12NjR4NjBfd3JpdGUoJmJoLCBNVjY0eDYwX1BDSTFfRVJSX1NFUlJfTUFTSywKKwkJbXY2NHg2MF9yZWFkKCZiaCwgTVY2NHg2MF9QQ0kxX0VSUl9TRVJSX01BU0spICYgfjB4MVVMKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL212NjR4NjAuYyBiL2FyY2gvcHBjL3N5c2xpYi9tdjY0eDYwLmMKaW5kZXggY2M3NzE3Ny4uODM5Zjg4NyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL212NjR4NjAuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvbXY2NHg2MC5jCkBAIC0zMCwxMyArMzAsMTYgQEAKICNpbmNsdWRlIDxhc20vbXY2NHg2MC5oPgogCiAKLXU4CQltdjY0eDYwX3BjaV9leGNsdWRlX2JyaWRnZSA9IDE7Ci1zcGlubG9ja190CW12NjR4NjBfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3U4IG12NjR4NjBfcGNpX2V4Y2x1ZGVfYnJpZGdlID0gMTsKK0RFRklORV9TUElOTE9DSyhtdjY0eDYwX2xvY2spOwogCi1zdGF0aWMgcGh5c19hZGRyX3QgCW12NjR4NjBfYnJpZGdlX3BiYXNlID0gMDsKLXN0YXRpYyB2b2lkIAkJKm12NjR4NjBfYnJpZGdlX3ZiYXNlID0gMDsKK3N0YXRpYyBwaHlzX2FkZHJfdCAJbXY2NHg2MF9icmlkZ2VfcGJhc2U7CitzdGF0aWMgdm9pZCAJCSptdjY0eDYwX2JyaWRnZV92YmFzZTsKIHN0YXRpYyB1MzIJCW12NjR4NjBfYnJpZGdlX3R5cGUgPSBNVjY0eDYwX1RZUEVfSU5WQUxJRDsKLXN0YXRpYyB1MzIJCW12NjR4NjBfYnJpZGdlX3JldiA9IDA7CitzdGF0aWMgdTMyCQltdjY0eDYwX2JyaWRnZV9yZXY7CisjaWYgZGVmaW5lZChDT05GSUdfU1lTRlMpICYmICFkZWZpbmVkKENPTkZJR19HVDY0MjYwKQorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlcglzeXNmc19ob3NlX2E7CisjZW5kaWYKIAogc3RhdGljIHUzMiBndDY0MjYwX3RyYW5zbGF0ZV9zaXplKHUzMiBiYXNlLCB1MzIgc2l6ZSwgdTMyIG51bV9iaXRzKTsKIHN0YXRpYyB1MzIgZ3Q2NDI2MF91bnRyYW5zbGF0ZV9zaXplKHUzMiBiYXNlLCB1MzIgc2l6ZSwgdTMyIG51bV9iaXRzKTsKQEAgLTQzMiw2ICs0MzUsMjAgQEAKIH07CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1NZU0ZTKSAmJiAhZGVmaW5lZChDT05GSUdfR1Q2NDI2MCkKK3N0YXRpYyBzdHJ1Y3QgbXY2NHh4eF9wZGF0YSBtdjY0eHh4X3BkYXRhID0geworCS5oc19yZWdfdmFsaWQJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXY2NHh4eF9kZXZpY2UgPSB7IC8qIGdlbmVyYWwgbXY2NHg2MCBzdHVmZiAqLworCS5uYW1lCT0gTVY2NFhYWF9ERVZfTkFNRSwKKwkuaWQJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJm12NjR4eHhfcGRhdGEsCisJfSwKK307CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm12NjR4NjBfcGRfZGV2c1tdIF9faW5pdGRhdGEgPSB7CiAjaWZkZWYgQ09ORklHX1NFUklBTF9NUFNDCiAJJm1wc2Nfc2hhcmVkX2RldmljZSwKQEAgLTQ1Myw2ICs0NzAsOSBAQAogI2lmZGVmCUNPTkZJR19JMkNfTVY2NFhYWAogCSZpMmNfZGV2aWNlLAogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1lTRlMpICYmICFkZWZpbmVkKENPTkZJR19HVDY0MjYwKQorCSZtdjY0eHh4X2RldmljZSwKKyNlbmRpZgogfTsKIAogLyoKQEAgLTU3NCw2ICs1OTQsMTEgQEAKIAliaC0+aG9zZV9hID0gJmhvc2VfYTsKIAliaC0+aG9zZV9iID0gJmhvc2VfYjsKIAorI2lmIGRlZmluZWQoQ09ORklHX1NZU0ZTKSAmJiAhZGVmaW5lZChDT05GSUdfR1Q2NDI2MCkKKwkvKiBTYXZlIGEgY29weSBvZiBob3NlX2EgZm9yIHN5c2ZzIGZ1bmN0aW9ucyAtLSBoYWNrICovCisJbWVtY3B5KCZzeXNmc19ob3NlX2EsICZob3NlX2EsIHNpemVvZihob3NlX2EpKTsKKyNlbmRpZgorCiAJbXY2NHg2MF9zZXRfYnVzKGJoLCAwLCAwKTsKIAltdjY0eDYwX3NldF9idXMoYmgsIDEsIDApOwogCkBAIC01OTAsOCArNjE1LDYgQEAKIAogCW12NjR4NjBfc2V0X2JpdHMoYmgsIE1WNjR4NjBfUENJMF9UT19SRVRSWSwgMHhmZmZmKTsKIAltdjY0eDYwX3NldF9iaXRzKGJoLCBNVjY0eDYwX1BDSTFfVE9fUkVUUlksIDB4ZmZmZik7Ci0KLQlyZXR1cm47CiB9CiAKIC8qCkBAIC02MjgsMTkgKzY1MSwxNSBAQAogCQkJdmFsID0gbXY2NHg2MF9yZWFkKGJoLCBzaXplX3JlZyk7CiAJCQl2YWwgPSBnZXRfZnJvbV9maWVsZCh2YWwsIHNpemVfYml0cyk7CiAJCQkqc2l6ZSA9IGJoLT5jaS0+dW50cmFuc2xhdGVfc2l6ZSgqYmFzZSwgdmFsLCBzaXplX2JpdHMpOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQkqc2l6ZSA9IDA7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCSpiYXNlID0gMDsKIAkJKnNpemUgPSAwOwogCX0KIAogCXByX2RlYnVnKCJnZXQgMzJiaXQgd2luZG93OiAlZCwgYmFzZTogMHgleCwgc2l6ZTogMHgleFxuIiwKIAkJd2luZG93LCAqYmFzZSwgKnNpemUpOwotCi0JcmV0dXJuOwogfQogCiAvKgpAQCAtNjc3LDggKzY5Niw2IEBACiAKIAkJKHZvaWQpbXY2NHg2MF9yZWFkKGJoLCBiYXNlX3JlZyk7IC8qIEZsdXNoIEZJRk8gKi8KIAl9Ci0KLQlyZXR1cm47CiB9CiAKIC8qCkBAIC03MTIsMTEgKzcyOSw5IEBACiAJCQl2YWwgPSBnZXRfZnJvbV9maWVsZCh2YWwsIHNpemVfYml0cyk7CiAJCQkqc2l6ZSA9IGJoLT5jaS0+dW50cmFuc2xhdGVfc2l6ZSgqYmFzZV9sbywgdmFsLAogCQkJCQkJCQlzaXplX2JpdHMpOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQkqc2l6ZSA9IDA7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCSpiYXNlX2hpID0gMDsKIAkJKmJhc2VfbG8gPSAwOwogCQkqc2l6ZSA9IDA7CkBAIC03MjQsOCArNzM5LDYgQEAKIAogCXByX2RlYnVnKCJnZXQgNjRiaXQgd2luZG93OiAlZCwgYmFzZSBoaTogMHgleCwgYmFzZSBsbzogMHgleCwgIgogCQkic2l6ZTogMHgleFxuIiwgd2luZG93LCAqYmFzZV9oaSwgKmJhc2VfbG8sICpzaXplKTsKLQotCXJldHVybjsKIH0KIAogLyoKQEAgLTc2Niw4ICs3NzksNiBAQAogCiAJCSh2b2lkKW12NjR4NjBfcmVhZChiaCwgYmFzZV9sb19yZWcpOyAvKiBGbHVzaCBGSUZPICovCiAJfQotCi0JcmV0dXJuOwogfQogCiAvKgpAQCAtMTAwOCw4ICsxMDE5LDYgQEAKIAkJCW1lbV93aW5kb3dzW2ldWzBdID0gMDsKIAkJCW1lbV93aW5kb3dzW2ldWzFdID0gMDsKIAkJfQotCi0JcmV0dXJuOwogfQogCiAvKgpAQCAtMTA3Nyw4ICsxMDg2LDYgQEAKIAkJCX0KIAogCQl9Ci0KLQlyZXR1cm47CiB9CiAKIC8qCkBAIC0xMTEyLDggKzExMTksNyBAQAogCQltdjY0eDYwX3NldF8zMmJpdF93aW5kb3coYmgsIHJlbWFwX3RhYltidXNdWzBdLAogCQkJcGktPnBjaV9pby5wY2lfYmFzZV9sbywgMCwgMCk7CiAJCWJoLT5jaS0+ZW5hYmxlX3dpbmRvd18zMmJpdChiaCwgd2luX3RhYltidXNdWzBdKTsKLQl9Ci0JZWxzZSAvKiBBY3R1YWxseSwgdGhlIHdpbmRvdyBzaG91bGQgYWxyZWFkeSBiZSBkaXNhYmxlZCAqLworCX0gZWxzZSAvKiBBY3R1YWxseSwgdGhlIHdpbmRvdyBzaG91bGQgYWxyZWFkeSBiZSBkaXNhYmxlZCAqLwogCQliaC0+Y2ktPmRpc2FibGVfd2luZG93XzMyYml0KGJoLCB3aW5fdGFiW2J1c11bMF0pOwogCiAJZm9yIChpPTA7IGk8MzsgaSsrKQpAQCAtMTEyNSwxMSArMTEzMSw4IEBACiAJCQkJcGktPnBjaV9tZW1baV0ucGNpX2Jhc2VfaGksCiAJCQkJcGktPnBjaV9tZW1baV0ucGNpX2Jhc2VfbG8sIDAsIDApOwogCQkJYmgtPmNpLT5lbmFibGVfd2luZG93XzMyYml0KGJoLCB3aW5fdGFiW2J1c11baSsxXSk7Ci0JCX0KLQkJZWxzZSAvKiBBY3R1YWxseSwgdGhlIHdpbmRvdyBzaG91bGQgYWxyZWFkeSBiZSBkaXNhYmxlZCAqLworCQl9IGVsc2UgLyogQWN0dWFsbHksIHRoZSB3aW5kb3cgc2hvdWxkIGFscmVhZHkgYmUgZGlzYWJsZWQgKi8KIAkJCWJoLT5jaS0+ZGlzYWJsZV93aW5kb3dfMzJiaXQoYmgsIHdpbl90YWJbYnVzXVtpKzFdKTsKLQotCXJldHVybjsKIH0KIAogLyoKQEAgLTEyMDYsOCArMTIwOSw2IEBACiAJCQkJTVY2NHg2MF9QQ0kwX0JBUl9FTkFCTEUgOgogCQkJCU1WNjR4NjBfUENJMV9CQVJfRU5BQkxFKSwgKDEgPDwgaSkpOwogCQl9Ci0KLQlyZXR1cm47CiB9CiAKIC8qCkBAIC0xMjI5LDcgKzEyMzAsNiBAQAogCSpob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CiAJc2V0dXBfaW5kaXJlY3RfcGNpX25vbWFwKCpob3NlLCBiaC0+dl9iYXNlICsgY2ZnX2FkZHIsCiAJCWJoLT52X2Jhc2UgKyBjZmdfZGF0YSk7Ci0JcmV0dXJuOwogfQogCiAvKgpAQCAtMTI3Miw3ICsxMjcyLDYgQEAKIAkJCQkJCXBpLT5wY2lfbWVtWzBdLnNpemUgLSAxOwogCWhvc2UtPnBjaV9tZW1fb2Zmc2V0ID0gcGktPnBjaV9tZW1bMF0uY3B1X2Jhc2UgLQogCQkJCQkJcGktPnBjaV9tZW1bMF0ucGNpX2Jhc2VfbG87Ci0JcmV0dXJuOwogfQogCiAvKgpAQCAtMTMwOSw3ICsxMzA4LDYgQEAKIAllYXJseV93cml0ZV9jb25maWdfd29yZChob3NlLCAwLCBkZXZmbiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgdTE2X3ZhbCk7CiAKIAltdjY0eDYwX3BjaV9leGNsdWRlX2JyaWRnZSA9IHNhdmVfZXhjbHVkZTsKLQlyZXR1cm47CiB9CiAKIC8qCkBAIC0xMzM2LDggKzEzMzQsNyBAQAogCQlwMnBfY2ZnID0gTVY2NHg2MF9QQ0kwX1AyUF9DT05GSUc7CiAJCXBjaV9jZmdfb2Zmc2V0ID0gMHg2NDsKIAkJaG9zZSA9IGJoLT5ob3NlX2E7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCXBjaV9tb2RlID0gYmgtPnBjaV9tb2RlX2I7CiAJCXAycF9jZmcgPSBNVjY0eDYwX1BDSTFfUDJQX0NPTkZJRzsKIAkJcGNpX2NmZ19vZmZzZXQgPSAweGU0OwpAQCAtMTM1Miw4ICsxMzQ5LDcgQEAKIAkJdmFsIHw9IChjaGlsZF9idXMgPDwgMTYpIHwgMHhmZjsKIAkJbXY2NHg2MF93cml0ZShiaCwgcDJwX2NmZywgdmFsKTsKIAkJKHZvaWQpbXY2NHg2MF9yZWFkKGJoLCBwMnBfY2ZnKTsgLyogRmx1c2ggRklGTyAqLwotCX0KLQllbHNlIHsgLyogUENJLVggKi8KKwl9IGVsc2UgeyAvKiBQQ0ktWCAqLwogCQkvKgogCQkgKiBOZWVkIHRvIHVzZSB0aGUgY3VycmVudCBidXMvZGV2IG51bWJlciAodGhhdCdzIGluIHRoZQogCQkgKiBQMlAgQ09ORklHIHJlZykgdG8gYWNjZXNzIHRoZSBicmlkZ2UncyBwY2kgY29uZmlnIHNwYWNlLgpAQCAtMTM2NSw4ICsxMzYxLDYgQEAKIAkJCXBjaV9jZmdfb2Zmc2V0LCBjaGlsZF9idXMgPDwgOCk7CiAJCW12NjR4NjBfcGNpX2V4Y2x1ZGVfYnJpZGdlID0gc2F2ZV9leGNsdWRlOwogCX0KLQotCXJldHVybjsKIH0KIAogLyoKQEAgLTE0MjMsOCArMTQxNyw2IEBACiAJCQlqKys7CiAJCX0KIAl9Ci0KLQlyZXR1cm47CiB9CiAKIC8qCkBAIC0xNDk4LDggKzE0OTAsNiBAQAogCWVhcmx5X3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCAwLCBQQ0lfREVWRk4oMCwgMCksCiAJCWd0NjQyNjBfcmVnX2FkZHJzW2J1c11bd2luZG93XSwgbXY2NHg2MF9tYXNrKGJhc2UsIDIwKSB8IDB4OCk7CiAJbXY2NHg2MF9wY2lfZXhjbHVkZV9icmlkZ2UgPSBzYXZlX2V4Y2x1ZGU7Ci0KLQlyZXR1cm47CiB9CiAKIC8qCkBAIC0xNTIzLDggKzE1MTMsNiBAQAogCWVhcmx5X3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCAwLCBQQ0lfREVWRk4oMCwwKSwgZ3Q2NDI2MF9vZmZzZXRbYnVzXSwKIAkJKGJhc2UgPDwgMTYpKTsKIAltdjY0eDYwX3BjaV9leGNsdWRlX2JyaWRnZSA9IHNhdmVfZXhjbHVkZTsKLQotCXJldHVybjsKIH0KIAogLyoKQEAgLTE1NjEsNyArMTU0OSw2IEBACiBndDY0MjYwX2VuYWJsZV93aW5kb3dfMzJiaXQoc3RydWN0IG12NjR4NjBfaGFuZGxlICpiaCwgdTMyIHdpbmRvdykKIHsKIAlwcl9kZWJ1ZygiZW5hYmxlIDMyYml0IHdpbmRvdzogJWRcbiIsIHdpbmRvdyk7Ci0JcmV0dXJuOwogfQogCiAvKgpAQCAtMTU4NCw4ICsxNTcxLDYgQEAKIAkJbXY2NHg2MF93cml0ZShiaCwgZ3Q2NDI2MF8zMmJpdF93aW5kb3dzW3dpbmRvd10uYmFzZV9yZWcsMHhmZmYpOwogCQltdjY0eDYwX3dyaXRlKGJoLCBndDY0MjYwXzMyYml0X3dpbmRvd3Nbd2luZG93XS5zaXplX3JlZywgMCk7CiAJfQotCi0JcmV0dXJuOwogfQogCiAvKgpAQCAtMTU5OSw3ICsxNTg0LDYgQEAKIGd0NjQyNjBfZW5hYmxlX3dpbmRvd182NGJpdChzdHJ1Y3QgbXY2NHg2MF9oYW5kbGUgKmJoLCB1MzIgd2luZG93KQogewogCXByX2RlYnVnKCJlbmFibGUgNjRiaXQgd2luZG93OiAlZFxuIiwgd2luZG93KTsKLQlyZXR1cm47CS8qIEVuYWJsZWQgd2hlbiB3aW5kb3cgY29uZmlndXJlZCAoaS5lLiwgd2hlbiB0b3AgPj0gYmFzZSkgKi8KIH0KIAogLyoKQEAgLTE2MjQsOCArMTYwOCw2IEBACiAJCW12NjR4NjBfd3JpdGUoYmgsIGd0NjQyNjBfNjRiaXRfd2luZG93c1t3aW5kb3ddLmJhc2VfaGlfcmVnLCAwKTsKIAkJbXY2NHg2MF93cml0ZShiaCwgZ3Q2NDI2MF82NGJpdF93aW5kb3dzW3dpbmRvd10uc2l6ZV9yZWcsIDApOwogCX0KLQotCXJldHVybjsKIH0KIAogLyoKQEAgLTE3MTIsOCArMTY5NCw2IEBACiAJbXY2NHg2MF93cml0ZShiaCwgR1Q2NDI2MF9JQ19DUFVfSU5UXzFfTUFTSywgMCk7CiAJbXY2NHg2MF93cml0ZShiaCwgR1Q2NDI2MF9JQ19DUFVfSU5UXzJfTUFTSywgMCk7CiAJbXY2NHg2MF93cml0ZShiaCwgR1Q2NDI2MF9JQ19DUFVfSU5UXzNfTUFTSywgMCk7Ci0KLQlyZXR1cm47CiB9CiAKIC8qCkBAIC0xNzgxLDE0ICsxNzYxLDExIEBACiAJbXY2NHg2MF9tcHNjMV9wZGF0YS5jYWNoZV9tZ210ID0gMTsKIAogCWlmICgociA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZSgmbXBzYzFfZGV2aWNlLCBJT1JFU09VUkNFX0lSUSwgMCkpCi0JCSE9IE5VTEwpIHsKLQorCQkJIT0gTlVMTCkgewogCQlyLT5zdGFydCA9IE1WNjR4NjBfSVJRX1NETUFfMDsKIAkJci0+ZW5kID0gTVY2NHg2MF9JUlFfU0RNQV8wOwogCX0KICNlbmRpZgotCi0JcmV0dXJuOwogfQogCiAvKgpAQCAtMTg2MSwxNCArMTgzOCwxMSBAQAogCW12NjR4NjBfbXBzYzFfcGRhdGEuY2FjaGVfbWdtdCA9IDE7CiAKIAlpZiAoKHIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoJm1wc2MxX2RldmljZSwgSU9SRVNPVVJDRV9JUlEsIDApKQotCQkhPSBOVUxMKSB7Ci0KKwkJCSE9IE5VTEwpIHsKIAkJci0+c3RhcnQgPSBNVjY0eDYwX0lSUV9TRE1BXzA7CiAJCXItPmVuZCA9IE1WNjR4NjBfSVJRX1NETUFfMDsKIAl9CiAjZW5kaWYKLQotCXJldHVybjsKIH0KIAogLyoKQEAgLTE5NDUsOCArMTkxOSw2IEBACiAJCW12NjQzNjBfcmVnX2FkZHJzW2J1c11bd2luZG93XS5iYXNlX2xvX2JhciwKIAkJbXY2NHg2MF9tYXNrKGJhc2UsMjApIHwgMHhjKTsKIAltdjY0eDYwX3BjaV9leGNsdWRlX2JyaWRnZSA9IHNhdmVfZXhjbHVkZTsKLQotCXJldHVybjsKIH0KIAogLyoKQEAgLTE5NzIsOCArMTk0NCw2IEBACiAJZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIDAsIFBDSV9ERVZGTigwLDApLAogCQltdjY0MzYwX29mZnNldFtidXNdWzFdLCAwKTsKIAltdjY0eDYwX3BjaV9leGNsdWRlX2JyaWRnZSA9IHNhdmVfZXhjbHVkZTsKLQotCXJldHVybjsKIH0KIAogLyoKQEAgLTIwODIsOCArMjA1Miw2IEBACiAJCQkJIjMyYml0IHRhYmxlIGNvcnJ1cHRlZCIpOwogCQl9CiAJfQotCi0JcmV0dXJuOwogfQogCiAvKgpAQCAtMjEzOSw4ICsyMTA3LDYgQEAKIAkJCQkiMzJiaXQgdGFibGUgY29ycnVwdGVkIik7CiAJCX0KIAl9Ci0KLQlyZXR1cm47CiB9CiAKIC8qCkBAIC0yMTU4LDggKzIxMjQsNyBAQAogCQkobXY2NDM2MF82NGJpdF93aW5kb3dzW3dpbmRvd10uc2l6ZV9yZWcgIT0gMCkpIHsKIAogCQlpZiAoKG12NjQzNjBfNjRiaXRfd2luZG93c1t3aW5kb3ddLmV4dHJhICYgTVY2NHg2MF9FWFRSQV9NQVNLKQotCQkJPT0gTVY2NHg2MF9FWFRSQV9QQ0lBQ0NfRU5BQikKLQorCQkJCT09IE1WNjR4NjBfRVhUUkFfUENJQUNDX0VOQUIpCiAJCQltdjY0eDYwX3NldF9iaXRzKGJoLAogCQkJCW12NjQzNjBfNjRiaXRfd2luZG93c1t3aW5kb3ddLmJhc2VfbG9fcmVnLAogCQkJCSgxIDw8IChtdjY0MzYwXzY0Yml0X3dpbmRvd3Nbd2luZG93XS5leHRyYSAmCkBAIC0yMTY4LDggKzIxMzMsNiBAQAogCQkJcHJpbnRrKEtFUk5fRVJSICJtdjY0MzYwX2VuYWJsZTogJXNcbiIsCiAJCQkJIjY0Yml0IHRhYmxlIGNvcnJ1cHRlZCIpOwogCX0KLQotCXJldHVybjsKIH0KIAogLyoKQEAgLTIxODYsMTEgKzIxNDksOSBAQAogCQltdjY0MzYwXzY0Yml0X3dpbmRvd3Nbd2luZG93XS5zaXplX3JlZyk7CiAKIAlpZiAoKG12NjQzNjBfNjRiaXRfd2luZG93c1t3aW5kb3ddLmJhc2VfbG9fcmVnICE9IDApICYmCi0JCShtdjY0MzYwXzY0Yml0X3dpbmRvd3Nbd2luZG93XS5zaXplX3JlZyAhPSAwKSkgewotCisJCQkobXY2NDM2MF82NGJpdF93aW5kb3dzW3dpbmRvd10uc2l6ZV9yZWcgIT0gMCkpIHsKIAkJaWYgKChtdjY0MzYwXzY0Yml0X3dpbmRvd3Nbd2luZG93XS5leHRyYSAmIE1WNjR4NjBfRVhUUkFfTUFTSykKLQkJCT09IE1WNjR4NjBfRVhUUkFfUENJQUNDX0VOQUIpCi0KKwkJCQk9PSBNVjY0eDYwX0VYVFJBX1BDSUFDQ19FTkFCKQogCQkJbXY2NHg2MF9jbHJfYml0cyhiaCwKIAkJCQltdjY0MzYwXzY0Yml0X3dpbmRvd3Nbd2luZG93XS5iYXNlX2xvX3JlZywKIAkJCQkoMSA8PCAobXY2NDM2MF82NGJpdF93aW5kb3dzW3dpbmRvd10uZXh0cmEgJgpAQCAtMjE5OSw4ICsyMTYwLDYgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAibXY2NDM2MF9kaXNhYmxlOiAlc1xuIiwKIAkJCQkiNjRiaXQgdGFibGUgY29ycnVwdGVkIik7CiAJfQotCi0JcmV0dXJuOwogfQogCiAvKgpAQCAtMjI0MSw4ICsyMjAwLDYgQEAKIAkvKiBEaXNhYmxlIGFsbCBQQ0ktPjx3aGF0ZXZlcj4gd2luZG93cyAqLwogCW12NjR4NjBfc2V0X2JpdHMoYmgsIE1WNjR4NjBfUENJMF9CQVJfRU5BQkxFLCAweDAwMDBmOWZmKTsKIAltdjY0eDYwX3NldF9iaXRzKGJoLCBNVjY0eDYwX1BDSTFfQkFSX0VOQUJMRSwgMHgwMDAwZjlmZik7Ci0KLQlyZXR1cm47CiB9CiAKIC8qCkBAIC0yMzM1LDggKzIyOTIsNiBAQAogCQkJbXY2NHg2MF9zZXRfYml0cyhiaCwgTVY2NDM2MF9JRE1BMk1FTV9BQ0NfUFJPVF8zLAogCQkJCSgweDMgPDwgKGkgPDwgMSkpKTsKIAkJfQotCi0JcmV0dXJuOwogfQogCiAvKgpAQCAtMjM1MCw0MiArMjMwNSwxNDUgQEAKIG12NjQzNjBfc2V0X21wc2MycmVnc193aW5kb3coc3RydWN0IG12NjR4NjBfaGFuZGxlICpiaCwgdTMyIGJhc2UpCiB7CiAJcHJfZGVidWcoInNldCBtcHNjLT5pbnRlcm5hbCByZWdzLCBiYXNlOiAweCV4XG4iLCBiYXNlKTsKLQogCW12NjR4NjBfd3JpdGUoYmgsIE1WNjQzNjBfTVBTQzJSRUdTX0JBU0UsIGJhc2UgJiAweGZmZmYwMDAwKTsKLQlyZXR1cm47CiB9CiAKIC8qCiAgKiBtdjY0MzYwX2NoaXBfc3BlY2lmaWNfaW5pdCgpCiAgKgotICogTm8gZXJyYXRhIHdvcmsgYXJvdW5kcyBmb3IgdGhlIE1WNjQzNjAgaW1wbGVtZW50ZWQgYXQgdGhpcyBwb2ludC4KKyAqIEltcGxlbWVudCBlcnJhdGEgd29yayBhcm91bmRzIGZvciB0aGUgTVY2NDM2MC4KICAqLwogc3RhdGljIHZvaWQgX19pbml0CiBtdjY0MzYwX2NoaXBfc3BlY2lmaWNfaW5pdChzdHJ1Y3QgbXY2NHg2MF9oYW5kbGUgKmJoLAogCXN0cnVjdCBtdjY0eDYwX3NldHVwX2luZm8gKnNpKQogeworI2lmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCisJbXY2NHg2MF9zZXRfYml0cyhiaCwgTVY2NDM2MF9EX1VOSVRfQ09OVFJPTF9ISUdILCAoMTw8MjQpKTsKKyNlbmRpZgogI2lmZGVmIENPTkZJR19TRVJJQUxfTVBTQwogCW12NjR4NjBfbXBzYzBfcGRhdGEuYnJnX2Nhbl90dW5lID0gMTsKIAltdjY0eDYwX21wc2MwX3BkYXRhLmNhY2hlX21nbXQgPSAxOwogCW12NjR4NjBfbXBzYzFfcGRhdGEuYnJnX2Nhbl90dW5lID0gMTsKIAltdjY0eDYwX21wc2MxX3BkYXRhLmNhY2hlX21nbXQgPSAxOwogI2VuZGlmCi0KLQlyZXR1cm47CiB9CiAKIC8qCiAgKiBtdjY0NDYwX2NoaXBfc3BlY2lmaWNfaW5pdCgpCiAgKgotICogTm8gZXJyYXRhIHdvcmsgYXJvdW5kcyBmb3IgdGhlIE1WNjQ0NjAgaW1wbGVtZW50ZWQgYXQgdGhpcyBwb2ludC4KKyAqIEltcGxlbWVudCBlcnJhdGEgd29yayBhcm91bmRzIGZvciB0aGUgTVY2NDQ2MC4KICAqLwogc3RhdGljIHZvaWQgX19pbml0CiBtdjY0NDYwX2NoaXBfc3BlY2lmaWNfaW5pdChzdHJ1Y3QgbXY2NHg2MF9oYW5kbGUgKmJoLAogCXN0cnVjdCBtdjY0eDYwX3NldHVwX2luZm8gKnNpKQogeworI2lmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCisJbXY2NHg2MF9zZXRfYml0cyhiaCwgTVY2NDM2MF9EX1VOSVRfQ09OVFJPTF9ISUdILCAoMTw8MjQpIHwgKDE8PDI1KSk7CisJbXY2NHg2MF9zZXRfYml0cyhiaCwgTVY2NDQ2MF9EX1VOSVRfTU1BU0ssICgxPDwxKSB8ICgxPDw0KSk7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfU0VSSUFMX01QU0MKIAltdjY0eDYwX21wc2MwX3BkYXRhLmJyZ19jYW5fdHVuZSA9IDE7CisJbXY2NHg2MF9tcHNjMF9wZGF0YS5jYWNoZV9tZ210ID0gMTsKIAltdjY0eDYwX21wc2MxX3BkYXRhLmJyZ19jYW5fdHVuZSA9IDE7CisJbXY2NHg2MF9tcHNjMV9wZGF0YS5jYWNoZV9tZ210ID0gMTsKICNlbmRpZgotCXJldHVybjsKIH0KKworCisjaWYgZGVmaW5lZChDT05GSUdfU1lTRlMpICYmICFkZWZpbmVkKENPTkZJR19HVDY0MjYwKQorLyogRXhwb3J0IHRoZSBob3Rzd2FwIHJlZ2lzdGVyIHZpYSBzeXNmcyBmb3IgZW51bSBldmVudCBtb25pdG9yaW5nICovCisjZGVmaW5lCVZBTF9MRU5fTUFYCTExIC8qIDMyLWJpdCBoZXggb3IgZGVjIHN0cmluZ2lmaWVkIG51bWJlciArICdcbicgKi8KKworREVDTEFSRV9NVVRFWChtdjY0eHh4X2hzX2xvY2spOworCitzdGF0aWMgc3NpemVfdAorbXY2NHh4eF9oc19yZWdfcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJdTMyCXY7CisJdTgJc2F2ZV9leGNsdWRlOworCisJaWYgKG9mZiA+IDApCisJCXJldHVybiAwOworCWlmIChjb3VudCA8IFZBTF9MRU5fTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJm12NjR4eHhfaHNfbG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJc2F2ZV9leGNsdWRlID0gbXY2NHg2MF9wY2lfZXhjbHVkZV9icmlkZ2U7CisJbXY2NHg2MF9wY2lfZXhjbHVkZV9icmlkZ2UgPSAwOworCWVhcmx5X3JlYWRfY29uZmlnX2R3b3JkKCZzeXNmc19ob3NlX2EsIDAsIFBDSV9ERVZGTigwLCAwKSwKKwkJCU1WNjQzNjBfUENJQ0ZHX0NQQ0lfSE9UU1dBUCwgJnYpOworCW12NjR4NjBfcGNpX2V4Y2x1ZGVfYnJpZGdlID0gc2F2ZV9leGNsdWRlOworCXVwKCZtdjY0eHh4X2hzX2xvY2spOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDh4XG4iLCB2KTsKK30KKworc3RhdGljIHNzaXplX3QKK212NjR4eHhfaHNfcmVnX3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwl1MzIJdjsKKwl1OAlzYXZlX2V4Y2x1ZGU7CisKKwlpZiAob2ZmID4gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGNvdW50IDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNzY2FuZihidWYsICIlaSIsICZ2KSA9PSAxKSB7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJm12NjR4eHhfaHNfbG9jaykpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlzYXZlX2V4Y2x1ZGUgPSBtdjY0eDYwX3BjaV9leGNsdWRlX2JyaWRnZTsKKwkJbXY2NHg2MF9wY2lfZXhjbHVkZV9icmlkZ2UgPSAwOworCQllYXJseV93cml0ZV9jb25maWdfZHdvcmQoJnN5c2ZzX2hvc2VfYSwgMCwgUENJX0RFVkZOKDAsIDApLAorCQkJCU1WNjQzNjBfUENJQ0ZHX0NQQ0lfSE9UU1dBUCwgdik7CisJCW12NjR4NjBfcGNpX2V4Y2x1ZGVfYnJpZGdlID0gc2F2ZV9leGNsdWRlOworCQl1cCgmbXY2NHh4eF9oc19sb2NrKTsKKwl9CisJZWxzZQorCQljb3VudCA9IC1FSU5WQUw7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBtdjY0eHh4X2hzX3JlZ19hdHRyID0geyAvKiBIb3Rzd2FwIHJlZ2lzdGVyICovCisJLmF0dHIgPSB7CisJCS5uYW1lID0gImhzX3JlZyIsCisJCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnNpemUgID0gVkFMX0xFTl9NQVgsCisJLnJlYWQgID0gbXY2NHh4eF9oc19yZWdfcmVhZCwKKwkud3JpdGUgPSBtdjY0eHh4X2hzX3JlZ193cml0ZSwKK307CisKKy8qIFByb3ZpZGUgc3lzZnMgZmlsZSBpbmRpY2F0aW5nIGlmIHRoaXMgcGxhdGZvcm0gc3VwcG9ydHMgdGhlIGhzX3JlZyAqLworc3RhdGljIHNzaXplX3QKK212NjR4eHhfaHNfcmVnX3ZhbGlkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJc3RydWN0IG12NjR4eHhfcGRhdGEJKnBkcDsKKwl1MzIJCQl2OworCisJcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7CisJcGRwID0gKHN0cnVjdCBtdjY0eHh4X3BkYXRhICopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZtdjY0eHh4X2hzX2xvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCXYgPSBwZHAtPmhzX3JlZ192YWxpZDsKKwl1cCgmbXY2NHh4eF9oc19sb2NrKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCB2KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihoc19yZWdfdmFsaWQsIFNfSVJVR08sIG12NjR4eHhfaHNfcmVnX3ZhbGlkX3Nob3csIE5VTEwpOworCitzdGF0aWMgaW50IF9faW5pdAorbXY2NHh4eF9zeXNmc19pbml0KHZvaWQpCit7CisJc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZtdjY0eHh4X2RldmljZS5kZXYua29iaiwgJm12NjR4eHhfaHNfcmVnX2F0dHIpOworCXN5c2ZzX2NyZWF0ZV9maWxlKCZtdjY0eHh4X2RldmljZS5kZXYua29iaiwmZGV2X2F0dHJfaHNfcmVnX3ZhbGlkLmF0dHIpOworCXJldHVybiAwOworfQorc3Vic3lzX2luaXRjYWxsKG12NjR4eHhfc3lzZnNfaW5pdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9vY3AuYyBiL2FyY2gvcHBjL3N5c2xpYi9vY3AuYwppbmRleCBlNWZkMmFlLi45Y2NjZTQzIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvb2NwLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL29jcC5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIH0KIAogc3RhdGljIGludAotb2NwX2RldmljZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHN0YXRlKQorb2NwX2RldmljZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBvY3BfZGV2aWNlICpvY3BfZGV2ID0gdG9fb2NwX2RldihkZXYpOwogCXN0cnVjdCBvY3BfZHJpdmVyICpvY3BfZHJ2ID0gdG9fb2NwX2RydihkZXYtPmRyaXZlcik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvb2ZfZGV2aWNlLmMgYi9hcmNoL3BwYy9zeXNsaWIvb2ZfZGV2aWNlLmMKaW5kZXggMWViNGY3Mi4uZGE4YTBmMiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL29mX2RldmljZS5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9vZl9kZXZpY2UuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb2ZfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgc3RhdGUpCitzdGF0aWMgaW50IG9mX2RldmljZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBvZl9kZXZpY2UgKiBvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICogZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9vcGVuX3BpYy5jIGIvYXJjaC9wcGMvc3lzbGliL29wZW5fcGljLmMKaW5kZXggYWQzOWI4Ni4uNTNkYTU4NSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL29wZW5fcGljLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL29wZW5fcGljLmMKQEAgLTk0OCw3ICs5NDgsNyBAQAogICogd2UgbmVlZCBzb21ldGhpbmcgYmV0dGVyIHRvIGRlYWwgd2l0aCB0aGF0Li4uIE1heWJlIHN3aXRjaCB0byBTMSBmb3IKICAqIGNwdWZyZXEgY2hhbmdlcwogICovCi1pbnQgb3BlbnBpY19zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIHUzMiBzdGF0ZSkKK2ludCBvcGVucGljX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCWludAlpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvb3Blbl9waWMyLmMgYi9hcmNoL3BwYy9zeXNsaWIvb3Blbl9waWMyLmMKaW5kZXggN2UyNzJjNS4uMmUwZWE5MiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL29wZW5fcGljMi5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9vcGVuX3BpYzIuYwpAQCAtODIsMTMgKzgyLDExIEBACiBzdGF0aWMgdm9pZCBvcGVucGljMl9hY2tfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpOwogCiBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgb3Blbl9waWMyID0gewotCSIgT3BlblBJQzIgIiwKLQlOVUxMLAotCU5VTEwsCi0Jb3BlbnBpYzJfZW5hYmxlX2lycSwKLQlvcGVucGljMl9kaXNhYmxlX2lycSwKLQlvcGVucGljMl9hY2tfaXJxLAotCW9wZW5waWMyX2VuZF9pcnEsCisJLnR5cGVuYW1lID0gIiBPcGVuUElDMiAiLAorCS5lbmFibGUgPSBvcGVucGljMl9lbmFibGVfaXJxLAorCS5kaXNhYmxlID0gb3BlbnBpYzJfZGlzYWJsZV9pcnEsCisJLmFjayA9IG9wZW5waWMyX2Fja19pcnEsCisJLmVuZCA9IG9wZW5waWMyX2VuZF9pcnEsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3BwYzQwM19waWMuYyBiL2FyY2gvcHBjL3N5c2xpYi9wcGM0MDNfcGljLmMKaW5kZXggMDZjYjBhZi4uY2U0ZDFkZSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL3BwYzQwM19waWMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvcHBjNDAzX3BpYy5jCkBAIC0zNCwxMyArMzQsMTAgQEAKIHN0YXRpYyB2b2lkIHBwYzQwM19haWNfZGlzYWJsZV9hbmRfYWNrKHVuc2lnbmVkIGludCBpcnEpOwogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHBwYzQwM19haWMgPSB7Ci0JIjQwM0dDIEFJQyIsCi0JTlVMTCwKLQlOVUxMLAotCXBwYzQwM19haWNfZW5hYmxlLAotCXBwYzQwM19haWNfZGlzYWJsZSwKLQlwcGM0MDNfYWljX2Rpc2FibGVfYW5kX2FjaywKLQkwCisJLnR5cGVuYW1lID0gIjQwM0dDIEFJQyIsCisJLmVuYWJsZSA9IHBwYzQwM19haWNfZW5hYmxlLAorCS5kaXNhYmxlID0gcHBjNDAzX2FpY19kaXNhYmxlLAorCS5hY2sgPSBwcGM0MDNfYWljX2Rpc2FibGVfYW5kX2FjaywKIH07CiAKIGludApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3BwYzR4eF9zZXR1cC5jIGIvYXJjaC9wcGMvc3lzbGliL3BwYzR4eF9zZXR1cC5jCmluZGV4IGUxNzBhZWIuLmI4NDNjNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9wcGM0eHhfc2V0dXAuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvcHBjNHh4X3NldHVwLmMKQEAgLTQ4LDEwICs0OCw2IEBACiBleHRlcm4gdm9pZCBhYm9ydCh2b2lkKTsKIGV4dGVybiB2b2lkIHBwYzR4eF9maW5kX2JyaWRnZXModm9pZCk7CiAKLWV4dGVybiB2b2lkIHBwYzR4eF93ZHRfaGVhcnRiZWF0KHZvaWQpOwotZXh0ZXJuIGludCB3ZHRfZW5hYmxlOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgd2R0X3BlcmlvZDsKLQogLyogR2xvYmFsIFZhcmlhYmxlcyAqLwogYmRfdCBfX3JlczsKIApAQCAtMTcxLDcgKzE2Nyw3IEBACiAJdW5zaWduZWQgaW50IGZyZXE7CiAJYmRfdCAqYmlwID0gJl9fcmVzOwogCi0jaWYgZGVmaW5lZChDT05GSUdfV0FMTlVUKSB8fCBkZWZpbmVkKENPTkZJR19BU0gpIHx8IGRlZmluZWQoQ09ORklHX1NZQ0FNT1JFKQorI2lmIGRlZmluZWQoQ09ORklHX1dBTE5VVCkgfHwgZGVmaW5lZChDT05GSUdfU1lDQU1PUkUpCiAJLyogV2FsbnV0IGJvb3Qgcm9tIHNldHMgRENSIENIQ1IxIChha2EgQ1BDMF9DUjEpIGJpdCBDRVRFIHRvIDEgKi8KIAltdGRjcihEQ1JOX0NIQ1IxLCBtZmRjcihEQ1JOX0NIQ1IxKSAmIH5DSFIxX0NFVEUpOwogI2VuZGlmCkBAIC0yNTcsMjIgKzI1Myw2IEBACiAJCSooY2hhciAqKSAocjcgKyBLRVJORUxCQVNFKSA9IDA7CiAJCXN0cmNweShjbWRfbGluZSwgKGNoYXIgKikgKHI2ICsgS0VSTkVMQkFTRSkpOwogCX0KLSNpZiBkZWZpbmVkKENPTkZJR19QUEM0MDVfV0RUKQotLyogTG9vayBmb3Igd2R0PSBvcHRpb24gb24gY29tbWFuZCBsaW5lICovCi0JaWYgKHN0cnN0cihjbWRfbGluZSwgIndkdD0iKSkgewotCQlpbnQgdmFsaWRfd2R0ID0gMDsKLQkJY2hhciAqcCwgKnE7Ci0JCWZvciAocSA9IGNtZF9saW5lOyAocCA9IHN0cnN0cihxLCAid2R0PSIpKSAhPSAwOykgewotCQkJcSA9IHAgKyA0OwotCQkJaWYgKHAgPiBjbWRfbGluZSAmJiBwWy0xXSAhPSAnICcpCi0JCQkJY29udGludWU7Ci0JCQl3ZHRfcGVyaW9kID0gc2ltcGxlX3N0cnRvdWwocSwgJnEsIDApOwotCQkJdmFsaWRfd2R0ID0gMTsKLQkJCSsrcTsKLQkJfQotCQl3ZHRfZW5hYmxlID0gdmFsaWRfd2R0OwotCX0KLSNlbmRpZgogCiAJLyogSW5pdGlhbGl6ZSBtYWNoaW5lLWRlcGVuZGVudCB2ZWN0b3JzICovCiAKQEAgLTI4NywxMSArMjY3LDYgQEAKIAogCXBwY19tZC5jYWxpYnJhdGVfZGVjciA9IHBwYzR4eF9jYWxpYnJhdGVfZGVjcjsKIAotI2lmZGVmIENPTkZJR19QUEM0MDVfV0RUCi0JcHBjX21kLmhlYXJ0YmVhdCA9IHBwYzR4eF93ZHRfaGVhcnRiZWF0OwotI2VuZGlmCi0JcHBjX21kLmhlYXJ0YmVhdF9jb3VudCA9IDA7Ci0KIAlwcGNfbWQuZmluZF9lbmRfb2ZfbWVtb3J5ID0gcHBjNHh4X2ZpbmRfZW5kX29mX21lbW9yeTsKIAlwcGNfbWQuc2V0dXBfaW9fbWFwcGluZ3MgPSBwcGM0eHhfbWFwX2lvOwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvcHBjODN4eF9wY2kuaCBiL2FyY2gvcHBjL3N5c2xpYi9wcGM4M3h4X3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNjkxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3BwYy9zeXNsaWIvcHBjODN4eF9wY2kuaApAQCAtMCwwICsxLDE1MSBAQAorLyogQ3JlYXRlZCBieSBUb255IExpIDx0b255LmxpQGZyZWVzY2FsZS5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgZnJlZXNjYWxlIHNlbWljb25kdWN0b3IKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19QUENfU1lTTElCX1BQQzgzWFhfUENJX0gKKyNkZWZpbmUgX19QUENfU1lTTElCX1BQQzgzWFhfUENJX0gKKwordHlwZWRlZiBzdHJ1Y3QgaW1tcl9jbGsgeworCXUzMiBzcG1yOyAvKiBzeXN0ZW0gUExMIG1vZGUgUmVnaXN0ZXIgICovCisJdTMyIG9jY3I7IC8qIG91dHB1dCBjbG9jayBjb250cm9sIFJlZ2lzdGVyICAqLworCXUzMiBzY2NyOyAvKiBzeXN0ZW0gY2xvY2sgY29udHJvbCBSZWdpc3RlciAgKi8KKwl1OCByZXMwWzB4RjRdOworfSBpbW1yX2Nsa190OworCisvKgorICogU2VxdWVuY2VyCisgKi8KK3R5cGVkZWYgc3RydWN0IGltbXJfaW9zIHsKKwl1MzIJcG90YXIwOworCXU4CXJlczBbNF07CisJdTMyCXBvYmFyMDsKKwl1OAlyZXMxWzRdOworCXUzMglwb2NtcjA7CisJdTgJcmVzMls0XTsKKwl1MzIJcG90YXIxOworCXU4CXJlczNbNF07CisJdTMyCXBvYmFyMTsKKwl1OAlyZXM0WzRdOworCXUzMglwb2NtcjE7CisJdTgJcmVzNVs0XTsKKwl1MzIJcG90YXIyOworCXU4CXJlczZbNF07CisJdTMyCXBvYmFyMjsKKwl1OAlyZXM3WzRdOworCXUzMglwb2NtcjI7CisJdTgJcmVzOFs0XTsKKwl1MzIJcG90YXIzOworCXU4CXJlczlbNF07CisJdTMyCXBvYmFyMzsKKwl1OAlyZXMxMFs0XTsKKwl1MzIJcG9jbXIzOworCXU4CXJlczExWzRdOworCXUzMglwb3RhcjQ7CisJdTgJcmVzMTJbNF07CisJdTMyCXBvYmFyNDsKKwl1OAlyZXMxM1s0XTsKKwl1MzIJcG9jbXI0OworCXU4CXJlczE0WzRdOworCXUzMglwb3RhcjU7CisJdTgJcmVzMTVbNF07CisJdTMyCXBvYmFyNTsKKwl1OAlyZXMxNls0XTsKKwl1MzIJcG9jbXI1OworCXU4CXJlczE3WzRdOworCXU4CXJlczE4WzB4NjBdOworCXUzMglwbWNyOworCXU4CXJlczE5WzRdOworCXUzMglkdGNyOworCXU4CXJlczIwWzRdOworfSBpbW1yX2lvc190OworI2RlZmluZSBQT1RBUl9UQV9NQVNLCTB4MDAwZmZmZmYKKyNkZWZpbmUgUE9CQVJfQkFfTUFTSwkweDAwMGZmZmZmCisjZGVmaW5lIFBPQ01SX0VOCTB4ODAwMDAwMDAKKyNkZWZpbmUgUE9DTVJfSU8JMHg0MDAwMDAwMCAvKiAwLS1tZW1vcnkgc3BhY2UgMS0tSS9PIHNwYWNlICovCisjZGVmaW5lIFBPQ01SX1NFCTB4MjAwMDAwMDAgLyogc3RyZWFtaW5nIGVuYWJsZSAqLworI2RlZmluZSBQT0NNUl9EU1QJMHgxMDAwMDAwMCAvKiAwLS1QQ0kxIDEtLVBDSTIgKi8KKyNkZWZpbmUgUE9DTVJfQ01fTUFTSwkweDAwMGZmZmZmCisKKy8qCisgKiBQQ0kgQ29udHJvbGxlciBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IGltbXJfcGNpY3RybCB7CisJdTMyCWVzcjsKKwl1MzIJZWNkcjsKKwl1MzIJZWVyOworCXUzMgllYXRjcjsKKwl1MzIJZWFjcjsKKwl1MzIJZWVhY3I7CisJdTMyCWVkbGNyOworCXUzMgllZGhjcjsKKwl1MzIJZ2NyOworCXUzMgllY3I7CisJdTMyCWdzcjsKKwl1OAlyZXMwWzEyXTsKKwl1MzIJcGl0YXIyOworCXU4CXJlczFbNF07CisJdTMyCXBpYmFyMjsKKwl1MzIJcGllYmFyMjsKKwl1MzIJcGl3YXIyOworCXU4CXJlczJbNF07CisJdTMyCXBpdGFyMTsKKwl1OAlyZXMzWzRdOworCXUzMglwaWJhcjE7CisJdTMyCXBpZWJhcjE7CisJdTMyCXBpd2FyMTsKKwl1OAlyZXM0WzRdOworCXUzMglwaXRhcjA7CisJdTgJcmVzNVs0XTsKKwl1MzIJcGliYXIwOworCXU4CXJlczZbNF07CisJdTMyCXBpd2FyMDsKKwl1OAlyZXM3WzEzMl07Cit9IGltbXJfcGNpY3RybF90OworI2RlZmluZSBQSVRBUl9UQV9NQVNLCTB4MDAwZmZmZmYKKyNkZWZpbmUgUElCQVJfTUFTSwkweGZmZmZmZmZmCisjZGVmaW5lIFBJRUJBUl9FQkFfTUFTSwkweDAwMGZmZmZmCisjZGVmaW5lIFBJV0FSX0VOCTB4ODAwMDAwMDAKKyNkZWZpbmUgUElXQVJfUEYJMHgyMDAwMDAwMAorI2RlZmluZSBQSVdBUl9SVFRfTUFTSwkweDAwMGYwMDAwCisjZGVmaW5lIFBJV0FSX1JUVF9OT19TTk9PUAkweDAwMDQwMDAwCisjZGVmaW5lIFBJV0FSX1JUVF9TTk9PUAkweDAwMDUwMDAwCisjZGVmaW5lIFBJV0FSX1dUVF9NQVNLCTB4MDAwMGYwMDAKKyNkZWZpbmUgUElXQVJfV1RUX05PX1NOT09QCTB4MDAwMDQwMDAKKyNkZWZpbmUgUElXQVJfV1RUX1NOT09QCTB4MDAwMDUwMDAKKyNkZWZpbmUgUElXQVJfSVdTX01BU0sJMHgwMDAwMDAzRgorI2RlZmluZSBQSVdBUl9JV1NfNEsJMHgwMDAwMDAwQgorI2RlZmluZSBQSVdBUl9JV1NfOEsJMHgwMDAwMDAwQworI2RlZmluZSBQSVdBUl9JV1NfMTZLCTB4MDAwMDAwMEQKKyNkZWZpbmUgUElXQVJfSVdTXzMySwkweDAwMDAwMDBFCisjZGVmaW5lIFBJV0FSX0lXU182NEsJMHgwMDAwMDAwRgorI2RlZmluZSBQSVdBUl9JV1NfMTI4SwkweDAwMDAwMDEwCisjZGVmaW5lIFBJV0FSX0lXU18yNTZLCTB4MDAwMDAwMTEKKyNkZWZpbmUgUElXQVJfSVdTXzUxMksJMHgwMDAwMDAxMgorI2RlZmluZSBQSVdBUl9JV1NfMU0JMHgwMDAwMDAxMworI2RlZmluZSBQSVdBUl9JV1NfMk0JMHgwMDAwMDAxNAorI2RlZmluZSBQSVdBUl9JV1NfNE0JMHgwMDAwMDAxNQorI2RlZmluZSBQSVdBUl9JV1NfOE0JMHgwMDAwMDAxNgorI2RlZmluZSBQSVdBUl9JV1NfMTZNCTB4MDAwMDAwMTcKKyNkZWZpbmUgUElXQVJfSVdTXzMyTQkweDAwMDAwMDE4CisjZGVmaW5lIFBJV0FSX0lXU182NE0JMHgwMDAwMDAxOQorI2RlZmluZSBQSVdBUl9JV1NfMTI4TQkweDAwMDAwMDFBCisjZGVmaW5lIFBJV0FSX0lXU18yNTZNCTB4MDAwMDAwMUIKKyNkZWZpbmUgUElXQVJfSVdTXzUxMk0JMHgwMDAwMDAxQworI2RlZmluZSBQSVdBUl9JV1NfMUcJMHgwMDAwMDAxRAorI2RlZmluZSBQSVdBUl9JV1NfMkcJMHgwMDAwMDAxRQorCisjZW5kaWYgLyogX19QUENfU1lTTElCX1BQQzgzWFhfUENJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9wcGM4M3h4X3NldHVwLmMgYi9hcmNoL3BwYy9zeXNsaWIvcHBjODN4eF9zZXR1cC5jCmluZGV4IDYwMmE4NjguLjg5MDQ4NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9wcGM4M3h4X3NldHVwLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL3BwYzgzeHhfc2V0dXAuYwpAQCAtMTEsNiArMTEsMTcgQEAKICAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIEFkZGVkIFBDSSBzdXBwb3J0IC0tIFRvbnkgTGkgPHRvbnkubGlAZnJlZXNjYWxlLmNvbT4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC0zMSw2ICs0MiwxMCBAQAogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogCiAjaW5jbHVkZSA8c3lzbGliL3BwYzgzeHhfc2V0dXAuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8c3lzbGliL3BwYzgzeHhfcGNpLmg+CisjZW5kaWYKIAogcGh5c19hZGRyX3QgaW1tcmJhcjsKIApAQCAtMTYyLDQgKzE3NywyMzcgQEAKIAlmb3IoOzspOwogfQogCi0vKiBQQ0kgU1VQUE9SVCBET0VTIE5PVCBFWElULCBNT0RFTCBhZnRlciBwcGM4NXh4X3NldHVwLmMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCit2b2lkIF9faW5pdAorbXBjODN4eF9zZXR1cF9wY2kxKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwl1MTYgcmVnMTY7CisJdm9sYXRpbGUgaW1tcl9wY2ljdHJsX3QgKiBwY2lfY3RybDsKKwl2b2xhdGlsZSBpbW1yX2lvc190ICogaW9zOworCWJkX3QgKmJpbmZvID0gKGJkX3QgKikgX19yZXM7CisKKwlwY2lfY3RybCA9IGlvcmVtYXAoYmluZm8tPmJpX2ltbXJfYmFzZSArIDB4ODUwMCwgc2l6ZW9mKGltbXJfcGNpY3RybF90KSk7CisJaW9zID0gaW9yZW1hcChiaW5mby0+YmlfaW1tcl9iYXNlICsgMHg4NDAwLCBzaXplb2YoaW1tcl9pb3NfdCkpOworCisJLyoKKwkgKiBDb25maWd1cmUgUENJIE91dGJvdW5kIFRyYW5zbGF0aW9uIFdpbmRvd3MKKwkgKi8KKwlpb3MtPnBvdGFyMCA9IChNUEM4M3h4X1BDSTFfTE9XRVJfTUVNID4+IDEyKSAmIFBPVEFSX1RBX01BU0s7CisJaW9zLT5wb2JhcjAgPSAoTVBDODN4eF9QQ0kxX0xPV0VSX01FTSA+PiAxMikgJiBQT0JBUl9CQV9NQVNLOworCWlvcy0+cG9jbXIwID0gUE9DTVJfRU4gfAorCQkoKCgweGZmZmZmZmZmIC0gKE1QQzgzeHhfUENJMV9VUFBFUl9NRU0gLQorCQkJCU1QQzgzeHhfUENJMV9MT1dFUl9NRU0pKSA+PiAxMikgJiBQT0NNUl9DTV9NQVNLKTsKKworCS8qIG1hcHBlZCB0byBQQ0kxIElPIHNwYWNlICovCisJaW9zLT5wb3RhcjEgPSAoTVBDODN4eF9QQ0kxX0xPV0VSX0lPID4+IDEyKSAmIFBPVEFSX1RBX01BU0s7CisJaW9zLT5wb2JhcjEgPSAoTVBDODN4eF9QQ0kxX0lPX0JBU0UgPj4gMTIpICYgUE9CQVJfQkFfTUFTSzsKKwlpb3MtPnBvY21yMSA9IFBPQ01SX0VOIHwgUE9DTVJfSU8gfAorCQkoKCgweGZmZmZmZmZmIC0gKE1QQzgzeHhfUENJMV9VUFBFUl9JTyAtCisJCQkJTVBDODN4eF9QQ0kxX0xPV0VSX0lPKSkgPj4gMTIpICYgUE9DTVJfQ01fTUFTSyk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBQQ0kgSW5ib3VuZCBUcmFuc2xhdGlvbiBXaW5kb3dzCisJICovCisJcGNpX2N0cmwtPnBpdGFyMSA9IDB4MDsKKwlwY2lfY3RybC0+cGliYXIxID0gMHgwOworCXBjaV9jdHJsLT5waWViYXIxID0gMHgwOworCXBjaV9jdHJsLT5waXdhcjEgPSBQSVdBUl9FTiB8IFBJV0FSX1BGIHwgUElXQVJfUlRUX1NOT09QIHwgUElXQVJfV1RUX1NOT09QIHwgUElXQVJfSVdTXzJHOworCisJLyoKKwkgKiBSZWxlYXNlIFBDSSBSU1Qgc2lnbmFsCisJICovCisJcGNpX2N0cmwtPmdjciA9IDA7CisJdWRlbGF5KDIwMDApOworCXBjaV9jdHJsLT5nY3IgPSAxOworCXVkZWxheSgyMDAwKTsKKworCXJlZzE2ID0gMHhmZjsKKwllYXJseV9yZWFkX2NvbmZpZ193b3JkKGhvc2UsIGhvc2UtPmZpcnN0X2J1c25vLCAwLCBQQ0lfQ09NTUFORCwgJnJlZzE2KTsKKwlyZWcxNiB8PSBQQ0lfQ09NTUFORF9TRVJSIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfTUVNT1JZOworCWVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGhvc2UtPmZpcnN0X2J1c25vLCAwLCBQQ0lfQ09NTUFORCwgcmVnMTYpOworCisJLyoKKwkgKiBDbGVhciBub24tcmVzZXJ2ZWQgYml0cyBpbiBzdGF0dXMgcmVnaXN0ZXIuCisJICovCisJZWFybHlfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgaG9zZS0+Zmlyc3RfYnVzbm8sIDAsIFBDSV9TVEFUVVMsIDB4ZmZmZik7CisJZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgaG9zZS0+Zmlyc3RfYnVzbm8sIDAsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsKKworCWlvdW5tYXAocGNpX2N0cmwpOworCWlvdW5tYXAoaW9zKTsKK30KKwordm9pZCBfX2luaXQKK21wYzgzeHhfc2V0dXBfcGNpMihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJdTE2IHJlZzE2OworCXZvbGF0aWxlIGltbXJfcGNpY3RybF90ICogcGNpX2N0cmw7CisJdm9sYXRpbGUgaW1tcl9pb3NfdCAqIGlvczsKKwliZF90ICpiaW5mbyA9IChiZF90ICopIF9fcmVzOworCisJcGNpX2N0cmwgPSBpb3JlbWFwKGJpbmZvLT5iaV9pbW1yX2Jhc2UgKyAweDg2MDAsIHNpemVvZihpbW1yX3BjaWN0cmxfdCkpOworCWlvcyA9IGlvcmVtYXAoYmluZm8tPmJpX2ltbXJfYmFzZSArIDB4ODQwMCwgc2l6ZW9mKGltbXJfaW9zX3QpKTsKKworCS8qCisJICogQ29uZmlndXJlIFBDSSBPdXRib3VuZCBUcmFuc2xhdGlvbiBXaW5kb3dzCisJICovCisJaW9zLT5wb3RhcjMgPSAoTVBDODN4eF9QQ0kyX0xPV0VSX01FTSA+PiAxMikgJiBQT1RBUl9UQV9NQVNLOworCWlvcy0+cG9iYXIzID0gKE1QQzgzeHhfUENJMl9MT1dFUl9NRU0gPj4gMTIpICYgUE9CQVJfQkFfTUFTSzsKKwlpb3MtPnBvY21yMyA9IFBPQ01SX0VOIHwgUE9DTVJfRFNUIHwKKwkJKCgoMHhmZmZmZmZmZiAtIChNUEM4M3h4X1BDSTJfVVBQRVJfTUVNIC0KKwkJCQlNUEM4M3h4X1BDSTJfTE9XRVJfTUVNKSkgPj4gMTIpICYgUE9DTVJfQ01fTUFTSyk7CisKKwkvKiBtYXBwZWQgdG8gUENJMiBJTyBzcGFjZSAqLworCWlvcy0+cG90YXI0ID0gKE1QQzgzeHhfUENJMl9MT1dFUl9JTyA+PiAxMikgJiBQT1RBUl9UQV9NQVNLOworCWlvcy0+cG9iYXI0ID0gKE1QQzgzeHhfUENJMl9JT19CQVNFID4+IDEyKSAmIFBPQkFSX0JBX01BU0s7CisJaW9zLT5wb2NtcjQgPSBQT0NNUl9FTiB8IFBPQ01SX0RTVCB8IFBPQ01SX0lPIHwKKwkJKCgoMHhmZmZmZmZmZiAtIChNUEM4M3h4X1BDSTJfVVBQRVJfSU8gLQorCQkJCU1QQzgzeHhfUENJMl9MT1dFUl9JTykpID4+IDEyKSAmIFBPQ01SX0NNX01BU0spOworCisJLyoKKwkgKiBDb25maWd1cmUgUENJIEluYm91bmQgVHJhbnNsYXRpb24gV2luZG93cworCSAqLworCXBjaV9jdHJsLT5waXRhcjEgPSAweDA7CisJcGNpX2N0cmwtPnBpYmFyMSA9IDB4MDsKKwlwY2lfY3RybC0+cGllYmFyMSA9IDB4MDsKKwlwY2lfY3RybC0+cGl3YXIxID0gUElXQVJfRU4gfCBQSVdBUl9QRiB8IFBJV0FSX1JUVF9TTk9PUCB8IFBJV0FSX1dUVF9TTk9PUCB8IFBJV0FSX0lXU18yRzsKKworCS8qCisJICogUmVsZWFzZSBQQ0kgUlNUIHNpZ25hbAorCSAqLworCXBjaV9jdHJsLT5nY3IgPSAwOworCXVkZWxheSgyMDAwKTsKKwlwY2lfY3RybC0+Z2NyID0gMTsKKwl1ZGVsYXkoMjAwMCk7CisKKwlyZWcxNiA9IDB4ZmY7CisJZWFybHlfcmVhZF9jb25maWdfd29yZChob3NlLCBob3NlLT5maXJzdF9idXNubywgMCwgUENJX0NPTU1BTkQsICZyZWcxNik7CisJcmVnMTYgfD0gUENJX0NPTU1BTkRfU0VSUiB8IFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWTsKKwllYXJseV93cml0ZV9jb25maWdfd29yZChob3NlLCBob3NlLT5maXJzdF9idXNubywgMCwgUENJX0NPTU1BTkQsIHJlZzE2KTsKKworCS8qCisJICogQ2xlYXIgbm9uLXJlc2VydmVkIGJpdHMgaW4gc3RhdHVzIHJlZ2lzdGVyLgorCSAqLworCWVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGhvc2UtPmZpcnN0X2J1c25vLCAwLCBQQ0lfU1RBVFVTLCAweGZmZmYpOworCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGhvc2UtPmZpcnN0X2J1c25vLCAwLCBQQ0lfTEFURU5DWV9USU1FUiwgMHg4MCk7CisKKwlpb3VubWFwKHBjaV9jdHJsKTsKKwlpb3VubWFwKGlvcyk7Cit9CisKKy8qCisgKiBQQ0kgYnVzZXMgY2FuIGJlIGVuYWJsZWQgb25seSBpZiBTWVMgYm9hcmQgY29tYmluYXRlcyB3aXRoIFBJQgorICogKFBsYXRmb3JtIElPIEJvYXJkKSBib2FyZCB3aGljaCBwcm92aWRlIDMgUENJIHNsb3RzLiBUaGVyZSBpcyAyIFBDSSBidXNlcworICogYW5kIDMgUENJIHNsb3RzLCBzbyBwZW9wbGUgbXVzdCBjb25maWd1cmUgdGhlIHJvdXRlcyBiZXR3ZWVuIHRoZW0gYmVmb3JlCisgKiBlbmFibGUgUENJIGJ1cy4gVGhpcyByb3V0ZXMgYXJlIHVuZGVyIHRoZSBjb250cm9sIG9mIFBDQTk1NTVQVyBkZXZpY2Ugd2hpY2gKKyAqIGNhbiBiZSBhY2Nlc3NlZCB2aWEgSTJDIGJ1cyAyIGFuZCBhcmUgY29uZmlndXJlZCBieSBmaXJtd2FyZS4gUmVmZXIgdG8KKyAqIEZyZWVzY2FsZSB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmaXJtd2FyZSBjb25maWd1cmF0aW9uLgorICovCisKK2V4dGVybiBpbnQgbXBjODN4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOworZXh0ZXJuIGludCBtcGM4M3h4X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgY2hhciBpZHNlbCwKKwkJdW5zaWduZWQgY2hhciBwaW4pOwordm9pZCBfX2luaXQKK21wYzgzeHhfc2V0dXBfaG9zZSh2b2lkKQoreworCXUzMiB2YWwzMjsKKwl2b2xhdGlsZSBpbW1yX2Nsa190ICogY2xrOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqIGhvc2UxOworI2lmZGVmIENPTkZJR19NUEM4M3h4X1BDSTIKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiBob3NlMjsKKyNlbmRpZgorCWJkX3QgKiBiaW5mbyA9IChiZF90ICopX19yZXM7CisKKwljbGsgPSBpb3JlbWFwKGJpbmZvLT5iaV9pbW1yX2Jhc2UgKyAweEEwMCwKKwkJCXNpemVvZihpbW1yX2Nsa190KSk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBQQ0kgY29udHJvbGxlciBhbmQgUENJX0NMS19PVVRQVVQgYm90aCBpbiA2Nk0gbW9kZQorCSAqLworCXZhbDMyID0gY2xrLT5vY2NyOworCXVkZWxheSgyMDAwKTsKKwljbGstPm9jY3IgPSAweGZmMDAwMDAwOworCXVkZWxheSgyMDAwKTsKKworCWlvdW5tYXAoY2xrKTsKKworCWhvc2UxID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJaWYoIWhvc2UxKQorCQlyZXR1cm47CisKKwlwcGNfbWQucGNpX3N3aXp6bGUgPSBjb21tb25fc3dpenpsZTsKKwlwcGNfbWQucGNpX21hcF9pcnEgPSBtcGM4M3h4X21hcF9pcnE7CisKKwlob3NlMS0+YnVzX29mZnNldCA9IDA7CisJaG9zZTEtPmZpcnN0X2J1c25vID0gMDsKKwlob3NlMS0+bGFzdF9idXNubyA9IDB4ZmY7CisKKwlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZTEsIGJpbmZvLT5iaV9pbW1yX2Jhc2UgKyBQQ0kxX0NGR19BRERSX09GRlNFVCwKKwkJCWJpbmZvLT5iaV9pbW1yX2Jhc2UgKyBQQ0kxX0NGR19EQVRBX09GRlNFVCk7CisJaG9zZTEtPnNldF9jZmdfdHlwZSA9IDE7CisKKwltcGM4M3h4X3NldHVwX3BjaTEoaG9zZTEpOworCisJaG9zZTEtPnBjaV9tZW1fb2Zmc2V0ID0gTVBDODN4eF9QQ0kxX01FTV9PRkZTRVQ7CisJaG9zZTEtPm1lbV9zcGFjZS5zdGFydCA9IE1QQzgzeHhfUENJMV9MT1dFUl9NRU07CisJaG9zZTEtPm1lbV9zcGFjZS5lbmQgPSBNUEM4M3h4X1BDSTFfVVBQRVJfTUVNOworCisJaG9zZTEtPmlvX2Jhc2VfcGh5cyA9IE1QQzgzeHhfUENJMV9JT19CQVNFOworCWhvc2UxLT5pb19zcGFjZS5zdGFydCA9IE1QQzgzeHhfUENJMV9MT1dFUl9JTzsKKwlob3NlMS0+aW9fc3BhY2UuZW5kID0gTVBDODN4eF9QQ0kxX1VQUEVSX0lPOworI2lmZGVmIENPTkZJR19NUEM4M3h4X1BDSTIKKwlpc2FfaW9fYmFzZSA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoTVBDODN4eF9QQ0kxX0lPX0JBU0UsCisJCQlNUEM4M3h4X1BDSTFfSU9fU0laRSArIE1QQzgzeHhfUENJMl9JT19TSVpFKTsKKyNlbHNlCisJaXNhX2lvX2Jhc2UgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKE1QQzgzeHhfUENJMV9JT19CQVNFLAorCQkJTVBDODN4eF9QQ0kxX0lPX1NJWkUpOworI2VuZGlmIC8qIENPTkZJR19NUEM4M3h4X1BDSTIgKi8KKwlob3NlMS0+aW9fYmFzZV92aXJ0ID0gKHZvaWQgKilpc2FfaW9fYmFzZTsKKwkvKiBzZXR1cCByZXNvdXJjZXMgKi8KKwlwY2lfaW5pdF9yZXNvdXJjZSgmaG9zZTEtPmlvX3Jlc291cmNlLAorCQkJTVBDODN4eF9QQ0kxX0xPV0VSX0lPLAorCQkJTVBDODN4eF9QQ0kxX1VQUEVSX0lPLAorCQkJSU9SRVNPVVJDRV9JTywgIlBDSSBob3N0IGJyaWRnZSAxIik7CisJcGNpX2luaXRfcmVzb3VyY2UoJmhvc2UxLT5tZW1fcmVzb3VyY2VzWzBdLAorCQkJTVBDODN4eF9QQ0kxX0xPV0VSX01FTSwKKwkJCU1QQzgzeHhfUENJMV9VUFBFUl9NRU0sCisJCQlJT1JFU09VUkNFX01FTSwgIlBDSSBob3N0IGJyaWRnZSAxIik7CisKKwlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODN4eF9leGNsdWRlX2RldmljZTsKKwlob3NlMS0+bGFzdF9idXNubyA9IHBjaWF1dG9fYnVzX3NjYW4oaG9zZTEsIGhvc2UxLT5maXJzdF9idXNubyk7CisKKyNpZmRlZiBDT05GSUdfTVBDODN4eF9QQ0kyCisJaG9zZTIgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlpZighaG9zZTIpCisJCXJldHVybjsKKworCWhvc2UyLT5idXNfb2Zmc2V0ID0gaG9zZTEtPmxhc3RfYnVzbm8gKyAxOworCWhvc2UyLT5maXJzdF9idXNubyA9IGhvc2UxLT5sYXN0X2J1c25vICsgMTsKKwlob3NlMi0+bGFzdF9idXNubyA9IDB4ZmY7CisJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UyLCBiaW5mby0+YmlfaW1tcl9iYXNlICsgUENJMl9DRkdfQUREUl9PRkZTRVQsCisJCQliaW5mby0+YmlfaW1tcl9iYXNlICsgUENJMl9DRkdfREFUQV9PRkZTRVQpOworCWhvc2UyLT5zZXRfY2ZnX3R5cGUgPSAxOworCisJbXBjODN4eF9zZXR1cF9wY2kyKGhvc2UyKTsKKworCWhvc2UyLT5wY2lfbWVtX29mZnNldCA9IE1QQzgzeHhfUENJMl9NRU1fT0ZGU0VUOworCWhvc2UyLT5tZW1fc3BhY2Uuc3RhcnQgPSBNUEM4M3h4X1BDSTJfTE9XRVJfTUVNOworCWhvc2UyLT5tZW1fc3BhY2UuZW5kID0gTVBDODN4eF9QQ0kyX1VQUEVSX01FTTsKKworCWhvc2UyLT5pb19iYXNlX3BoeXMgPSBNUEM4M3h4X1BDSTJfSU9fQkFTRTsKKwlob3NlMi0+aW9fc3BhY2Uuc3RhcnQgPSBNUEM4M3h4X1BDSTJfTE9XRVJfSU87CisJaG9zZTItPmlvX3NwYWNlLmVuZCA9IE1QQzgzeHhfUENJMl9VUFBFUl9JTzsKKwlob3NlMi0+aW9fYmFzZV92aXJ0ID0gKHZvaWQgKikoaXNhX2lvX2Jhc2UgKyBNUEM4M3h4X1BDSTFfSU9fU0laRSk7CisJLyogc2V0dXAgcmVzb3VyY2VzICovCisJcGNpX2luaXRfcmVzb3VyY2UoJmhvc2UyLT5pb19yZXNvdXJjZSwKKwkJCU1QQzgzeHhfUENJMl9MT1dFUl9JTywKKwkJCU1QQzgzeHhfUENJMl9VUFBFUl9JTywKKwkJCUlPUkVTT1VSQ0VfSU8sICJQQ0kgaG9zdCBicmlkZ2UgMiIpOworCXBjaV9pbml0X3Jlc291cmNlKCZob3NlMi0+bWVtX3Jlc291cmNlc1swXSwKKwkJCU1QQzgzeHhfUENJMl9MT1dFUl9NRU0sCisJCQlNUEM4M3h4X1BDSTJfVVBQRVJfTUVNLAorCQkJSU9SRVNPVVJDRV9NRU0sICJQQ0kgaG9zdCBicmlkZ2UgMiIpOworCisJaG9zZTItPmxhc3RfYnVzbm8gPSBwY2lhdXRvX2J1c19zY2FuKGhvc2UyLCBob3NlMi0+Zmlyc3RfYnVzbm8pOworI2VuZGlmIC8qIENPTkZJR19NUEM4M3h4X1BDSTIgKi8KK30KKyNlbmRpZiAvKkNPTkZJR19QQ0kqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3BwYzgzeHhfc2V0dXAuaCBiL2FyY2gvcHBjL3N5c2xpYi9wcGM4M3h4X3NldHVwLmgKaW5kZXggNjgzZjE3OS4uYzc2NmMxYSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL3BwYzgzeHhfc2V0dXAuaAorKysgYi9hcmNoL3BwYy9zeXNsaWIvcHBjODN4eF9zZXR1cC5oCkBAIC0xMiw2ICsxMiwxNCBAQAogICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKICNpZm5kZWYgX19QUENfU1lTTElCX1BQQzgzWFhfU0VUVVBfSApAQCAtMTksNyArMjcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9wcGNib290Lmg+CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1wYzgzeHhfZmluZF9lbmRfb2ZfbWVtb3J5KHZvaWQpIF9faW5pdDsKIGV4dGVybiBsb25nIG1wYzgzeHhfdGltZV9pbml0KHZvaWQpIF9faW5pdDsKQEAgLTMxLDEzICszOCwxMSBAQAogZXh0ZXJuIHZvaWQgbXBjODN4eF9zZXR1cF9ob3NlKHZvaWQpIF9faW5pdDsKIAogLyogUENJIGNvbmZpZyAqLwotI2lmIDAKLSNkZWZpbmUgUENJMV9DRkdfQUREUl9PRkZTRVQJKEZJWE1FKQotI2RlZmluZSBQQ0kxX0NGR19EQVRBX09GRlNFVAkoRklYTUUpCisjZGVmaW5lIFBDSTFfQ0ZHX0FERFJfT0ZGU0VUICgweDgzMDApCisjZGVmaW5lIFBDSTFfQ0ZHX0RBVEFfT0ZGU0VUICgweDgzMDQpCiAKLSNkZWZpbmUgUENJMl9DRkdfQUREUl9PRkZTRVQJKEZJWE1FKQotI2RlZmluZSBQQ0kyX0NGR19EQVRBX09GRlNFVAkoRklYTUUpCi0jZW5kaWYKKyNkZWZpbmUgUENJMl9DRkdfQUREUl9PRkZTRVQgKDB4ODM4MCkKKyNkZWZpbmUgUENJMl9DRkdfREFUQV9PRkZTRVQgKDB4ODM4NCkKIAogLyogU2VyaWFsIENvbmZpZyAqLwogI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3BwY19zeXMuYyBiL2FyY2gvcHBjL3N5c2xpYi9wcGNfc3lzLmMKaW5kZXggODc5MjAyMy4uNTJiYTBjNiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL3BwY19zeXMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvcHBjX3N5cy5jCkBAIC02LDYgKzYsNyBAQAogICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYSA8a3VtYXIuZ2FsYUBmcmVlc2NhbGUuY29tPgogICoKICAqIENvcHlyaWdodCAyMDA1IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqIENvcHlyaWdodCAyMDA1IE1vbnRhVmlzdGEsIEluYy4gYnkgVml0YWx5IEJvcmR1ZyA8dmJvcmR1Z0BydS5tdmlzdGEuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC0zNSwxMCArMzYsNTkgQEAKIAogdm9pZCBfX2luaXQgaWRlbnRpZnlfcHBjX3N5c19ieV9uYW1lKGNoYXIgKm5hbWUpCiB7Ci0JLyogVE9ETyAqLworCXVuc2lnbmVkIGludCBpID0gMDsKKwl3aGlsZSAocHBjX3N5c19zcGVjc1tpXS5wcGNfc3lzX25hbWVbMF0pCisJeworCQlpZiAoIXN0cmNtcChwcGNfc3lzX3NwZWNzW2ldLnBwY19zeXNfbmFtZSwgbmFtZSkpCisJCQlicmVhazsKKwkJaSsrOworCX0KKwljdXJfcHBjX3N5c19zcGVjID0gJnBwY19zeXNfc3BlY3NbaV07CiAJcmV0dXJuOwogfQogCitzdGF0aWMgaW50IF9faW5pdCBjb3VudF9zeXNfc3BlY3Modm9pZCkKK3sKKwlpbnQgaSA9IDA7CisJd2hpbGUgKHBwY19zeXNfc3BlY3NbaV0ucHBjX3N5c19uYW1lWzBdKQorCQlpKys7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGZpbmRfY2hpcF9ieV9uYW1lX2FuZF9pZChjaGFyICpuYW1lLCB1MzIgaWQpCit7CisJaW50IHJldCA9IC0xOworCXVuc2lnbmVkIGludCBpID0gMDsKKwl1bnNpZ25lZCBpbnQgaiA9IDA7CisJdW5zaWduZWQgaW50IGR1cHMgPSAwOworCisJdW5zaWduZWQgY2hhciBtYXRjaGVkW2NvdW50X3N5c19zcGVjcygpXTsKKworCXdoaWxlIChwcGNfc3lzX3NwZWNzW2ldLnBwY19zeXNfbmFtZVswXSkgeworCQlpZiAoIXN0cmNtcChwcGNfc3lzX3NwZWNzW2ldLnBwY19zeXNfbmFtZSwgbmFtZSkpCisJCQltYXRjaGVkW2orK10gPSBpOworCQlpKys7CisJfQorCWlmIChqICE9IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworCQkJaWYgKChwcGNfc3lzX3NwZWNzW21hdGNoZWRbaV1dLm1hc2sgJiBpZCkgPT0KKwkJCSAgICBwcGNfc3lzX3NwZWNzW21hdGNoZWRbaV1dLnZhbHVlKSB7CisJCQkJcmV0ID0gbWF0Y2hlZFtpXTsKKwkJCQlkdXBzKys7CisJCQl9CisJCX0KKwkJcmV0ID0gKGR1cHMgPT0gMSkgPyByZXQgOiAoLTEgKiBkdXBzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBfX2luaXQgaWRlbnRpZnlfcHBjX3N5c19ieV9uYW1lX2FuZF9pZChjaGFyICpuYW1lLCB1MzIgaWQpCit7CisJaW50IGkgPSBmaW5kX2NoaXBfYnlfbmFtZV9hbmRfaWQobmFtZSwgaWQpOworCUJVR19PTihpIDwgMCk7CisJY3VyX3BwY19zeXNfc3BlYyA9ICZwcGNfc3lzX3NwZWNzW2ldOworfQorCiAvKiBVcGRhdGUgYWxsIG1lbW9yeSByZXNvdXJjZXMgYnkgcGFkZHIsIGNhbGwgYmVmb3JlIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlciAqLwogdm9pZCBfX2luaXQKIHBwY19zeXNfZml4dXBfbWVtX3Jlc291cmNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBoeXNfYWRkcl90IHBhZGRyKQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3BxMl9kZXZpY2VzLmMgYi9hcmNoL3BwYy9zeXNsaWIvcHEyX2RldmljZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDM4Njk3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wcGMvc3lzbGliL3BxMl9kZXZpY2VzLmMKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBhcmNoL3BwYy9zeXNsaWIvcHEyX2RldmljZXMuYworICoKKyAqIFBRMiBEZXZpY2UgZGVzY3JpcHRpb25zCisgKgorICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYSA8a3VtYXIuZ2FsYUBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS9jcG0yLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wcGNfc3lzLmg+CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHBjX3N5c19wbGF0Zm9ybV9kZXZpY2VzW10gPSB7CisJW01QQzgyeHhfQ1BNX0ZDQzFdID0geworCQkubmFtZSA9ICJmc2wtY3BtLWZjYyIsCisJCS5pZAk9IDEsCisJCS5udW1fcmVzb3VyY2VzCSA9IDMsCisJCS5yZXNvdXJjZSA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeworCQkJeworCQkJCS5uYW1lCT0gImZjY19yZWdzIiwKKwkJCQkuc3RhcnQJPSAweDExMzAwLAorCQkJCS5lbmQJPSAweDExMzFmLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZQk9ICJmY2NfcHJhbSIsCisJCQkJLnN0YXJ0CT0gMHg4NDAwLAorCQkJCS5lbmQJPSAweDg0ZmYsCisJCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJCQl9LAorCQkJeworCQkJCS5zdGFydAk9IFNJVV9JTlRfRkNDMSwKKwkJCQkuZW5kCT0gU0lVX0lOVF9GQ0MxLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCQkJfSwKKwkJfSwKKwl9LAorCVtNUEM4Mnh4X0NQTV9GQ0MyXSA9IHsKKwkJLm5hbWUgPSAiZnNsLWNwbS1mY2MiLAorCQkuaWQJPSAyLAorCQkubnVtX3Jlc291cmNlcwkgPSAzLAorCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkubmFtZQk9ICJmY2NfcmVncyIsCisJCQkJLnN0YXJ0CT0gMHgxMTMyMCwKKwkJCQkuZW5kCT0gMHgxMTMzZiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUJPSAiZmNjX3ByYW0iLAorCQkJCS5zdGFydAk9IDB4ODUwMCwKKwkJCQkuZW5kCT0gMHg4NWZmLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJCXsKKwkJCQkuc3RhcnQJPSBTSVVfSU5UX0ZDQzIsCisJCQkJLmVuZAk9IFNJVV9JTlRfRkNDMiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkJCX0sCisJCX0sCisJfSwKKwlbTVBDODJ4eF9DUE1fRkNDM10gPSB7CisJCS5uYW1lID0gImZzbC1jcG0tZmNjIiwKKwkJLmlkCT0gMywKKwkJLm51bV9yZXNvdXJjZXMJID0gMywKKwkJLnJlc291cmNlID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLm5hbWUJPSAiZmNjX3JlZ3MiLAorCQkJCS5zdGFydAk9IDB4MTEzNDAsCisJCQkJLmVuZAk9IDB4MTEzNWYsCisJCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJCQl9LAorCQkJeworCQkJCS5uYW1lCT0gImZjY19wcmFtIiwKKwkJCQkuc3RhcnQJPSAweDg2MDAsCisJCQkJLmVuZAk9IDB4ODZmZiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkJCX0sCisJCQl7CisJCQkJLnN0YXJ0CT0gU0lVX0lOVF9GQ0MzLAorCQkJCS5lbmQJPSBTSVVfSU5UX0ZDQzMsCisJCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJCQl9LAorCQl9LAorCX0sCisJW01QQzgyeHhfQ1BNX0kyQ10gPSB7CisJCS5uYW1lID0gImZzbC1jcG0taTJjIiwKKwkJLmlkCT0gMSwKKwkJLm51bV9yZXNvdXJjZXMJID0gMywKKwkJLnJlc291cmNlID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLm5hbWUJPSAiaTJjX21lbSIsCisJCQkJLnN0YXJ0CT0gMHgxMTg2MCwKKwkJCQkuZW5kCT0gMHgxMThCRiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUJPSAiaTJjX3ByYW0iLAorCQkJCS5zdGFydCAJPSAweDhhZmMsCisJCQkJLmVuZAk9IDB4OGFmZCwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkJCX0sCisJCQl7CisJCQkJLnN0YXJ0CT0gU0lVX0lOVF9JMkMsCisJCQkJLmVuZAk9IFNJVV9JTlRfSTJDLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCQkJfSwKKwkJfSwKKwl9LAorCVtNUEM4Mnh4X0NQTV9TQ0MxXSA9IHsKKwkJLm5hbWUgPSAiZnNsLWNwbS1zY2MiLAorCQkuaWQJPSAxLAorCQkubnVtX3Jlc291cmNlcwkgPSAzLAorCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkubmFtZQk9ICJzY2NfbWVtIiwKKwkJCQkuc3RhcnQJPSAweDExQTAwLAorCQkJCS5lbmQJPSAweDExQTFGLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZQk9ICJzY2NfcHJhbSIsCisJCQkJLnN0YXJ0CT0gMHg4MDAwLAorCQkJCS5lbmQJPSAweDgwZmYsCisJCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJCQl9LAorCQkJeworCQkJCS5zdGFydAk9IFNJVV9JTlRfU0NDMSwKKwkJCQkuZW5kCT0gU0lVX0lOVF9TQ0MxLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCQkJfSwKKwkJfSwKKwl9LAorCVtNUEM4Mnh4X0NQTV9TQ0MyXSA9IHsKKwkJLm5hbWUgPSAiZnNsLWNwbS1zY2MiLAorCQkuaWQJPSAyLAorCQkubnVtX3Jlc291cmNlcwkgPSAzLAorCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkubmFtZQk9ICJzY2NfbWVtIiwKKwkJCQkuc3RhcnQJPSAweDExQTIwLAorCQkJCS5lbmQJPSAweDExQTNGLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZQk9ICJzY2NfcHJhbSIsCisJCQkJLnN0YXJ0CT0gMHg4MTAwLAorCQkJCS5lbmQJPSAweDgxZmYsCisJCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJCQl9LAorCQkJeworCQkJCS5zdGFydAk9IFNJVV9JTlRfU0NDMiwKKwkJCQkuZW5kCT0gU0lVX0lOVF9TQ0MyLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCQkJfSwKKwkJfSwKKwl9LAorCVtNUEM4Mnh4X0NQTV9TQ0MzXSA9IHsKKwkJLm5hbWUgPSAiZnNsLWNwbS1zY2MiLAorCQkuaWQJPSAzLAorCQkubnVtX3Jlc291cmNlcwkgPSAzLAorCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkubmFtZSAJPSAic2NjX21lbSIsCisJCQkJLnN0YXJ0CT0gMHgxMUE0MCwKKwkJCQkuZW5kCT0gMHgxMUE1RiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUJPSAic2NjX3ByYW0iLAorCQkJCS5zdGFydAk9IDB4ODIwMCwKKwkJCQkuZW5kCT0gMHg4MmZmLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJCXsKKwkJCQkuc3RhcnQJPSBTSVVfSU5UX1NDQzMsCisJCQkJLmVuZAk9IFNJVV9JTlRfU0NDMywKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkJCX0sCisJCX0sCisJfSwKKwlbTVBDODJ4eF9DUE1fU0NDNF0gPSB7CisJCS5uYW1lID0gImZzbC1jcG0tc2NjIiwKKwkJLmlkCT0gNCwKKwkJLm51bV9yZXNvdXJjZXMJID0gMywKKwkJLnJlc291cmNlID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLm5hbWUJPSAic2NjX21lbSIsCisJCQkJLnN0YXJ0CT0gMHgxMUE2MCwKKwkJCQkuZW5kCT0gMHgxMUE3RiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUJPSAic2NjX3ByYW0iLAorCQkJCS5zdGFydAk9IDB4ODMwMCwKKwkJCQkuZW5kCT0gMHg4M2ZmLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJCXsKKwkJCQkuc3RhcnQJPSBTSVVfSU5UX1NDQzQsCisJCQkJLmVuZAk9IFNJVV9JTlRfU0NDNCwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkJCX0sCisJCX0sCisJfSwKKwlbTVBDODJ4eF9DUE1fU1BJXSA9IHsKKwkJLm5hbWUgPSAiZnNsLWNwbS1zcGkiLAorCQkuaWQJPSAxLAorCQkubnVtX3Jlc291cmNlcwkgPSAzLAorCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkubmFtZQk9ICJzcGlfbWVtIiwKKwkJCQkuc3RhcnQJPSAweDExQUEwLAorCQkJCS5lbmQJPSAweDExQUZGLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZQk9ICJzcGlfcHJhbSIsCisJCQkJLnN0YXJ0CT0gMHg4OWZjLAorCQkJCS5lbmQJPSAweDg5ZmQsCisJCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJCQl9LAorCQkJeworCQkJCS5zdGFydAk9IFNJVV9JTlRfU1BJLAorCQkJCS5lbmQJPSBTSVVfSU5UX1NQSSwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkJCX0sCisJCX0sCisJfSwKKwlbTVBDODJ4eF9DUE1fTUNDMV0gPSB7CisJCS5uYW1lID0gImZzbC1jcG0tbWNjIiwKKwkJLmlkCT0gMSwKKwkJLm51bV9yZXNvdXJjZXMJID0gMywKKwkJLnJlc291cmNlID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLm5hbWUJPSAibWNjX21lbSIsCisJCQkJLnN0YXJ0CT0gMHgxMUIzMCwKKwkJCQkuZW5kCT0gMHgxMUIzRiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUJPSAibWNjX3ByYW0iLAorCQkJCS5zdGFydAk9IDB4ODcwMCwKKwkJCQkuZW5kCT0gMHg4NzdmLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJCXsKKwkJCQkuc3RhcnQJPSBTSVVfSU5UX01DQzEsCisJCQkJLmVuZAk9IFNJVV9JTlRfTUNDMSwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkJCX0sCisJCX0sCisJfSwKKwlbTVBDODJ4eF9DUE1fTUNDMl0gPSB7CisJCS5uYW1lID0gImZzbC1jcG0tbWNjIiwKKwkJLmlkCT0gMiwKKwkJLm51bV9yZXNvdXJjZXMJID0gMywKKwkJLnJlc291cmNlID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLm5hbWUJPSAibWNjX21lbSIsCisJCQkJLnN0YXJ0CT0gMHgxMUI1MCwKKwkJCQkuZW5kCT0gMHgxMUI1RiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUJPSAibWNjX3ByYW0iLAorCQkJCS5zdGFydAk9IDB4ODgwMCwKKwkJCQkuZW5kCT0gMHg4ODdmLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJCXsKKwkJCQkuc3RhcnQJPSBTSVVfSU5UX01DQzIsCisJCQkJLmVuZAk9IFNJVV9JTlRfTUNDMiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkJCX0sCisJCX0sCisJfSwKKwlbTVBDODJ4eF9DUE1fU01DMV0gPSB7CisJCS5uYW1lID0gImZzbC1jcG0tc21jIiwKKwkJLmlkCT0gMSwKKwkJLm51bV9yZXNvdXJjZXMJID0gMywKKwkJLnJlc291cmNlID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLm5hbWUJPSAic21jX21lbSIsCisJCQkJLnN0YXJ0CT0gMHgxMUE4MCwKKwkJCQkuZW5kCT0gMHgxMUE4RiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUJPSAic21jX3ByYW0iLAorCQkJCS5zdGFydAk9IDB4ODdmYywKKwkJCQkuZW5kCT0gMHg4N2ZkLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJCXsKKwkJCQkuc3RhcnQJPSBTSVVfSU5UX1NNQzEsCisJCQkJLmVuZAk9IFNJVV9JTlRfU01DMSwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkJCX0sCisJCX0sCisJfSwKKwlbTVBDODJ4eF9DUE1fU01DMl0gPSB7CisJCS5uYW1lID0gImZzbC1jcG0tc21jIiwKKwkJLmlkCT0gMiwKKwkJLm51bV9yZXNvdXJjZXMJID0gMywKKwkJLnJlc291cmNlID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLm5hbWUJPSAic21jX21lbSIsCisJCQkJLnN0YXJ0CT0gMHgxMUE5MCwKKwkJCQkuZW5kCT0gMHgxMUE5RiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUJPSAic21jX3ByYW0iLAorCQkJCS5zdGFydAk9IDB4ODhmYywKKwkJCQkuZW5kCT0gMHg4OGZkLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJCXsKKwkJCQkuc3RhcnQJPSBTSVVfSU5UX1NNQzIsCisJCQkJLmVuZAk9IFNJVV9JTlRfU01DMiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkJCX0sCisJCX0sCisJfSwKKwlbTVBDODJ4eF9DUE1fVVNCXSA9IHsKKwkJLm5hbWUgPSAiZnNsLWNwbS11c2IiLAorCQkuaWQJPSAxLAorCQkubnVtX3Jlc291cmNlcwk9IDMsCisJCS5yZXNvdXJjZSA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeworCQkJeworCQkJCS5uYW1lCT0gInVzYl9tZW0iLAorCQkJCS5zdGFydAk9IDB4MTFiNjAsCisJCQkJLmVuZAk9IDB4MTFiNzgsCisJCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJCQl9LAorCQkJeworCQkJCS5uYW1lCT0gInVzYl9wcmFtIiwKKwkJCQkuc3RhcnQJPSAweDhiMDAsCisJCQkJLmVuZAk9IDB4OGJmZiwKKwkJCQkuZmxhZ3MgCT0gSU9SRVNPVVJDRV9NRU0sCisJCQl9LAorCQkJeworCQkJCS5zdGFydAk9IFNJVV9JTlRfVVNCLAorCQkJCS5lbmQJPSBTSVVfSU5UX1VTQiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkJCX0sCisKKwkJfSwKKwl9LAorCVtNUEM4Mnh4X1NFQzFdID0geworCQkubmFtZSA9ICJmc2wtc2VjIiwKKwkJLmlkID0gMSwKKwkJLm51bV9yZXNvdXJjZXMgPSAxLAorCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkubmFtZQk9ICJzZWNfbWVtIiwKKwkJCQkuc3RhcnQJPSAweDQwMDAwLAorCQkJCS5lbmQJPSAweDUyZmZmLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWFjaF9tcGM4Mnh4X2ZpeHVwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcHBjX3N5c19maXh1cF9tZW1fcmVzb3VyY2UocGRldiwgQ1BNX01BUF9BRERSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbWFjaF9tcGM4Mnh4X2luaXQodm9pZCkKK3sKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoIm1hY2hfbXBjODJ4eF9pbml0OmVudGVyIiwgMCk7CisJcHBjX3N5c19kZXZpY2VfZml4dXAgPSBtYWNoX21wYzgyeHhfZml4dXA7CisJcmV0dXJuIDA7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKG1hY2hfbXBjODJ4eF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9wcTJfc3lzLmMgYi9hcmNoL3BwYy9zeXNsaWIvcHEyX3N5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNmM5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3BwYy9zeXNsaWIvcHEyX3N5cy5jCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogYXJjaC9wcGMvc3lzbGliL3BxMl9kZXZpY2VzLmMKKyAqCisgKiBQUTIgU3lzdGVtIGRlc2NyaXB0aW9ucworICoKKyAqIE1haW50YWluZXI6IEt1bWFyIEdhbGEgPGt1bWFyLmdhbGFAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vcHBjX3N5cy5oPgorCitzdHJ1Y3QgcHBjX3N5c19zcGVjICpjdXJfcHBjX3N5c19zcGVjOworc3RydWN0IHBwY19zeXNfc3BlYyBwcGNfc3lzX3NwZWNzW10gPSB7CisJLyogYmVsb3cgaXMgYSBsaXN0IG9mIHRoZSA4MjYwIGZhbWlseSBvZiBwcm9jZXNzb3JzICovCisJeworCQkucHBjX3N5c19uYW1lCT0gIjgyNTAiLAorCQkubWFzawkJPSAweDAwMDBmZjAwLAorCQkudmFsdWUJCT0gMHgwMDAwMDAwMCwKKwkJLm51bV9kZXZpY2VzCT0gMTIsCisJCS5kZXZpY2VfbGlzdCA9IChlbnVtIHBwY19zeXNfZGV2aWNlc1tdKQorCQl7CisJCQlNUEM4Mnh4X0NQTV9GQ0MxLCBNUEM4Mnh4X0NQTV9GQ0MyLCBNUEM4Mnh4X0NQTV9GQ0MzLAorCQkJTVBDODJ4eF9DUE1fU0NDMSwgTVBDODJ4eF9DUE1fU0NDMiwgTVBDODJ4eF9DUE1fU0NDMywKKwkJCU1QQzgyeHhfQ1BNX1NDQzQsIE1QQzgyeHhfQ1BNX01DQzEsIE1QQzgyeHhfQ1BNX1NNQzEsCisJCQlNUEM4Mnh4X0NQTV9TTUMyLCBNUEM4Mnh4X0NQTV9TUEksIE1QQzgyeHhfQ1BNX0kyQywKKwkJfQorCX0sCisJeworCQkucHBjX3N5c19uYW1lCT0gIjgyNTUiLAorCQkubWFzawkJPSAweDAwMDBmZjAwLAorCQkudmFsdWUJCT0gMHgwMDAwMDAwMCwKKwkJLm51bV9kZXZpY2VzCT0gMTEsCisJCS5kZXZpY2VfbGlzdCA9IChlbnVtIHBwY19zeXNfZGV2aWNlc1tdKQorCQl7CisJCQlNUEM4Mnh4X0NQTV9GQ0MxLCBNUEM4Mnh4X0NQTV9GQ0MyLCBNUEM4Mnh4X0NQTV9TQ0MxLAorCQkJTVBDODJ4eF9DUE1fU0NDMiwgTVBDODJ4eF9DUE1fU0NDMywgTVBDODJ4eF9DUE1fU0NDNCwKKwkJCU1QQzgyeHhfQ1BNX01DQzEsIE1QQzgyeHhfQ1BNX1NNQzEsIE1QQzgyeHhfQ1BNX1NNQzIsCisJCQlNUEM4Mnh4X0NQTV9TUEksIE1QQzgyeHhfQ1BNX0kyQywKKwkJfQorCX0sCisJeworCQkucHBjX3N5c19uYW1lCT0gIjgyNjAiLAorCQkubWFzawkJPSAweDAwMDBmZjAwLAorCQkudmFsdWUJCT0gMHgwMDAwMDAwMCwKKwkJLm51bV9kZXZpY2VzCT0gMTIsCisJCS5kZXZpY2VfbGlzdCA9IChlbnVtIHBwY19zeXNfZGV2aWNlc1tdKQorCQl7CisJCQlNUEM4Mnh4X0NQTV9GQ0MxLCBNUEM4Mnh4X0NQTV9GQ0MyLCBNUEM4Mnh4X0NQTV9GQ0MzLAorCQkJTVBDODJ4eF9DUE1fU0NDMSwgTVBDODJ4eF9DUE1fU0NDMiwgTVBDODJ4eF9DUE1fU0NDMywKKwkJCU1QQzgyeHhfQ1BNX1NDQzQsIE1QQzgyeHhfQ1BNX01DQzEsIE1QQzgyeHhfQ1BNX1NNQzEsCisJCQlNUEM4Mnh4X0NQTV9TTUMyLCBNUEM4Mnh4X0NQTV9TUEksIE1QQzgyeHhfQ1BNX0kyQywKKwkJfQorCX0sCisJeworCQkucHBjX3N5c19uYW1lCT0gIjgyNjQiLAorCQkubWFzawkJPSAweDAwMDBmZjAwLAorCQkudmFsdWUJCT0gMHgwMDAwMDAwMCwKKwkJLm51bV9kZXZpY2VzCT0gMTIsCisJCS5kZXZpY2VfbGlzdCA9IChlbnVtIHBwY19zeXNfZGV2aWNlc1tdKQorCQl7CisJCQlNUEM4Mnh4X0NQTV9GQ0MxLCBNUEM4Mnh4X0NQTV9GQ0MyLCBNUEM4Mnh4X0NQTV9GQ0MzLAorCQkJTVBDODJ4eF9DUE1fU0NDMSwgTVBDODJ4eF9DUE1fU0NDMiwgTVBDODJ4eF9DUE1fU0NDMywKKwkJCU1QQzgyeHhfQ1BNX1NDQzQsIE1QQzgyeHhfQ1BNX01DQzEsIE1QQzgyeHhfQ1BNX1NNQzEsCisJCQlNUEM4Mnh4X0NQTV9TTUMyLCBNUEM4Mnh4X0NQTV9TUEksIE1QQzgyeHhfQ1BNX0kyQywKKwkJfQorCX0sCisJeworCQkucHBjX3N5c19uYW1lCT0gIjgyNjUiLAorCQkubWFzawkJPSAweDAwMDBmZjAwLAorCQkudmFsdWUJCT0gMHgwMDAwMDAwMCwKKwkJLm51bV9kZXZpY2VzCT0gMTIsCisJCS5kZXZpY2VfbGlzdCA9IChlbnVtIHBwY19zeXNfZGV2aWNlc1tdKQorCQl7CisJCQlNUEM4Mnh4X0NQTV9GQ0MxLCBNUEM4Mnh4X0NQTV9GQ0MyLCBNUEM4Mnh4X0NQTV9GQ0MzLAorCQkJTVBDODJ4eF9DUE1fU0NDMSwgTVBDODJ4eF9DUE1fU0NDMiwgTVBDODJ4eF9DUE1fU0NDMywKKwkJCU1QQzgyeHhfQ1BNX1NDQzQsIE1QQzgyeHhfQ1BNX01DQzEsIE1QQzgyeHhfQ1BNX1NNQzEsCisJCQlNUEM4Mnh4X0NQTV9TTUMyLCBNUEM4Mnh4X0NQTV9TUEksIE1QQzgyeHhfQ1BNX0kyQywKKwkJfQorCX0sCisJeworCQkucHBjX3N5c19uYW1lCT0gIjgyNjYiLAorCQkubWFzawkJPSAweDAwMDBmZjAwLAorCQkudmFsdWUJCT0gMHgwMDAwMDAwMCwKKwkJLm51bV9kZXZpY2VzCT0gMTIsCisJCS5kZXZpY2VfbGlzdCA9IChlbnVtIHBwY19zeXNfZGV2aWNlc1tdKQorCQl7CisJCQlNUEM4Mnh4X0NQTV9GQ0MxLCBNUEM4Mnh4X0NQTV9GQ0MyLCBNUEM4Mnh4X0NQTV9GQ0MzLAorCQkJTVBDODJ4eF9DUE1fU0NDMSwgTVBDODJ4eF9DUE1fU0NDMiwgTVBDODJ4eF9DUE1fU0NDMywKKwkJCU1QQzgyeHhfQ1BNX1NDQzQsIE1QQzgyeHhfQ1BNX01DQzEsIE1QQzgyeHhfQ1BNX1NNQzEsCisJCQlNUEM4Mnh4X0NQTV9TTUMyLCBNUEM4Mnh4X0NQTV9TUEksIE1QQzgyeHhfQ1BNX0kyQywKKwkJfQorCX0sCisJLyogYmVsb3cgaXMgYSBsaXN0IG9mIHRoZSA4MjcyIGZhbWlseSBvZiBwcm9jZXNzb3JzICovCisJeworCQkucHBjX3N5c19uYW1lCT0gIjgyNDciLAorCQkubWFzawkJPSAweDAwMDBmZjAwLAorCQkudmFsdWUJCT0gMHgwMDAwMGQwMCwKKwkJLm51bV9kZXZpY2VzCT0gMTAsCisJCS5kZXZpY2VfbGlzdCA9IChlbnVtIHBwY19zeXNfZGV2aWNlc1tdKQorCQl7CisJCQlNUEM4Mnh4X0NQTV9GQ0MxLCBNUEM4Mnh4X0NQTV9GQ0MyLCBNUEM4Mnh4X0NQTV9TQ0MxLAorCQkJTVBDODJ4eF9DUE1fU0NDMiwgTVBDODJ4eF9DUE1fU0NDMywgTVBDODJ4eF9DUE1fU01DMSwKKwkJCU1QQzgyeHhfQ1BNX1NNQzIsIE1QQzgyeHhfQ1BNX1NQSSwgTVBDODJ4eF9DUE1fSTJDLAorCQkJTVBDODJ4eF9DUE1fVVNCLAorCQl9LAorCX0sCisJeworCQkucHBjX3N5c19uYW1lCT0gIjgyNDgiLAorCQkubWFzawkJPSAweDAwMDBmZjAwLAorCQkudmFsdWUJCT0gMHgwMDAwMGMwMCwKKwkJLm51bV9kZXZpY2VzCT0gMTEsCisJCS5kZXZpY2VfbGlzdCA9IChlbnVtIHBwY19zeXNfZGV2aWNlc1tdKQorCQl7CisJCQlNUEM4Mnh4X0NQTV9GQ0MxLCBNUEM4Mnh4X0NQTV9GQ0MyLCBNUEM4Mnh4X0NQTV9TQ0MxLAorCQkJTVBDODJ4eF9DUE1fU0NDMiwgTVBDODJ4eF9DUE1fU0NDMywgTVBDODJ4eF9DUE1fU01DMSwKKwkJCU1QQzgyeHhfQ1BNX1NNQzIsIE1QQzgyeHhfQ1BNX1NQSSwgTVBDODJ4eF9DUE1fSTJDLAorCQkJTVBDODJ4eF9DUE1fVVNCLCBNUEM4Mnh4X1NFQzEsCisJCX0sCisJfSwKKwl7CisJCS5wcGNfc3lzX25hbWUJPSAiODI3MSIsCisJCS5tYXNrCQk9IDB4MDAwMGZmMDAsCisJCS52YWx1ZQkJPSAweDAwMDAwZDAwLAorCQkubnVtX2RldmljZXMJPSAxMCwKKwkJLmRldmljZV9saXN0ID0gKGVudW0gcHBjX3N5c19kZXZpY2VzW10pCisJCXsKKwkJCU1QQzgyeHhfQ1BNX0ZDQzEsIE1QQzgyeHhfQ1BNX0ZDQzIsIE1QQzgyeHhfQ1BNX1NDQzEsCisJCQlNUEM4Mnh4X0NQTV9TQ0MyLCBNUEM4Mnh4X0NQTV9TQ0MzLCBNUEM4Mnh4X0NQTV9TTUMxLAorCQkJTVBDODJ4eF9DUE1fU01DMiwgTVBDODJ4eF9DUE1fU1BJLCBNUEM4Mnh4X0NQTV9JMkMsCisJCQlNUEM4Mnh4X0NQTV9VU0IsCisJCX0sCisJfSwKKwl7CisJCS5wcGNfc3lzX25hbWUJPSAiODI3MiIsCisJCS5tYXNrCQk9IDB4MDAwMGZmMDAsCisJCS52YWx1ZQkJPSAweDAwMDAwYzAwLAorCQkubnVtX2RldmljZXMJPSAxMSwKKwkJLmRldmljZV9saXN0ID0gKGVudW0gcHBjX3N5c19kZXZpY2VzW10pCisJCXsKKwkJCU1QQzgyeHhfQ1BNX0ZDQzEsIE1QQzgyeHhfQ1BNX0ZDQzIsIE1QQzgyeHhfQ1BNX1NDQzEsCisJCQlNUEM4Mnh4X0NQTV9TQ0MyLCBNUEM4Mnh4X0NQTV9TQ0MzLCBNUEM4Mnh4X0NQTV9TTUMxLAorCQkJTVBDODJ4eF9DUE1fU01DMiwgTVBDODJ4eF9DUE1fU1BJLCBNUEM4Mnh4X0NQTV9JMkMsCisJCQlNUEM4Mnh4X0NQTV9VU0IsIE1QQzgyeHhfU0VDMSwKKwkJfSwKKwl9LAorCS8qIGJlbG93IGlzIGEgbGlzdCBvZiB0aGUgODI4MCBmYW1pbHkgb2YgcHJvY2Vzc29ycyAqLworCXsKKwkJLnBwY19zeXNfbmFtZQk9ICI4MjcwIiwKKwkJLm1hc2sgCQk9IDB4MDAwMGZmMDAsCisJCS52YWx1ZSAJCT0gMHgwMDAwMGEwMCwKKwkJLm51bV9kZXZpY2VzIAk9IDEyLAorCQkuZGV2aWNlX2xpc3QgPSAoZW51bSBwcGNfc3lzX2RldmljZXNbXSkKKwkJeworCQkJTVBDODJ4eF9DUE1fRkNDMSwgTVBDODJ4eF9DUE1fRkNDMiwgTVBDODJ4eF9DUE1fRkNDMywKKwkJCU1QQzgyeHhfQ1BNX1NDQzEsIE1QQzgyeHhfQ1BNX1NDQzIsIE1QQzgyeHhfQ1BNX1NDQzMsCisJCQlNUEM4Mnh4X0NQTV9TQ0M0LCBNUEM4Mnh4X0NQTV9NQ0MxLCBNUEM4Mnh4X0NQTV9TTUMxLAorCQkJTVBDODJ4eF9DUE1fU01DMiwgTVBDODJ4eF9DUE1fU1BJLCBNUEM4Mnh4X0NQTV9JMkMsCisJCX0sCisJfSwKKwl7CisJCS5wcGNfc3lzX25hbWUJPSAiODI3NSIsCisJCS5tYXNrIAkJPSAweDAwMDBmZjAwLAorCQkudmFsdWUgCQk9IDB4MDAwMDBhMDAsCisJCS5udW1fZGV2aWNlcyAJPSAxMiwKKwkJLmRldmljZV9saXN0ID0gKGVudW0gcHBjX3N5c19kZXZpY2VzW10pCisJCXsKKwkJCU1QQzgyeHhfQ1BNX0ZDQzEsIE1QQzgyeHhfQ1BNX0ZDQzIsIE1QQzgyeHhfQ1BNX0ZDQzMsCisJCQlNUEM4Mnh4X0NQTV9TQ0MxLCBNUEM4Mnh4X0NQTV9TQ0MyLCBNUEM4Mnh4X0NQTV9TQ0MzLAorCQkJTVBDODJ4eF9DUE1fU0NDNCwgTVBDODJ4eF9DUE1fTUNDMSwgTVBDODJ4eF9DUE1fU01DMSwKKwkJCU1QQzgyeHhfQ1BNX1NNQzIsIE1QQzgyeHhfQ1BNX1NQSSwgTVBDODJ4eF9DUE1fSTJDLAorCQl9LAorCX0sCisJeworCQkucHBjX3N5c19uYW1lCT0gIjgyODAiLAorCQkubWFzayAJCT0gMHgwMDAwZmYwMCwKKwkJLnZhbHVlIAkJPSAweDAwMDAwYTAwLAorCQkubnVtX2RldmljZXMgCT0gMTMsCisJCS5kZXZpY2VfbGlzdCA9IChlbnVtIHBwY19zeXNfZGV2aWNlc1tdKQorCQl7CisJCQlNUEM4Mnh4X0NQTV9GQ0MxLCBNUEM4Mnh4X0NQTV9GQ0MyLCBNUEM4Mnh4X0NQTV9GQ0MzLAorCQkJTVBDODJ4eF9DUE1fU0NDMSwgTVBDODJ4eF9DUE1fU0NDMiwgTVBDODJ4eF9DUE1fU0NDMywKKwkJCU1QQzgyeHhfQ1BNX1NDQzQsIE1QQzgyeHhfQ1BNX01DQzEsIE1QQzgyeHhfQ1BNX01DQzIsCisJCQlNUEM4Mnh4X0NQTV9TTUMxLCBNUEM4Mnh4X0NQTV9TTUMyLCBNUEM4Mnh4X0NQTV9TUEksCisJCQlNUEM4Mnh4X0NQTV9JMkMsCisJCX0sCisJfSwKKwl7CisJCS8qIGRlZmF1bHQgbWF0Y2ggKi8KKwkJLnBwY19zeXNfbmFtZQk9ICIiLAorCQkubWFzayAJCT0gMHgwMDAwMDAwMCwKKwkJLnZhbHVlIAkJPSAweDAwMDAwMDAwLAorCX0sCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3FzcGFuX3BjaS5jIGIvYXJjaC9wcGMvc3lzbGliL3FzcGFuX3BjaS5jCmluZGV4IDU3ZjRlZDUuLjA5NzBiNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9xc3Bhbl9wY2kuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvcXNwYW5fcGNpLmMKQEAgLTk0LDcgKzk0LDcgQEAKICNkZWZpbmUgbWtfY29uZmlnX3R5cGUxKGJ1cywgZGV2LCBvZmZzZXQpIFwKIAlta19jb25maWdfYWRkcihidXMsIGRldiwgb2Zmc2V0KSB8IDE7CiAKLXN0YXRpYyBzcGlubG9ja190IHBjaWJpb3NfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socGNpYmlvc19sb2NrKTsKIAogaW50IHFzcGFuX3BjaWJpb3NfcmVhZF9jb25maWdfYnl0ZSh1bnNpZ25lZCBjaGFyIGJ1cywgdW5zaWduZWQgY2hhciBkZXZfZm4sCiAJCQkJICB1bnNpZ25lZCBjaGFyIG9mZnNldCwgdW5zaWduZWQgY2hhciAqdmFsKQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3hpbGlueF9waWMuYyBiL2FyY2gvcHBjL3N5c2xpYi94aWxpbnhfcGljLmMKaW5kZXggZTBiZDY2Zi4uMmNiY2FkMiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL3hpbGlueF9waWMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIveGlsaW54X3BpYy5jCkBAIC03OSwxNCArNzksMTEgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSB4aWxpbnhfaW50YyA9IHsKLQkiWGlsaW54IEludGVycnVwdCBDb250cm9sbGVyIiwKLQlOVUxMLAotCU5VTEwsCi0JeGlsaW54X2ludGNfZW5hYmxlLAotCXhpbGlueF9pbnRjX2Rpc2FibGUsCi0JeGlsaW54X2ludGNfZGlzYWJsZV9hbmRfYWNrLAotCXhpbGlueF9pbnRjX2VuZCwKLQkwCisJLnR5cGVuYW1lID0gIlhpbGlueCBJbnRlcnJ1cHQgQ29udHJvbGxlciIsCisJLmVuYWJsZSA9IHhpbGlueF9pbnRjX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHhpbGlueF9pbnRjX2Rpc2FibGUsCisJLmFjayA9IHhpbGlueF9pbnRjX2Rpc2FibGVfYW5kX2FjaywKKwkuZW5kID0geGlsaW54X2ludGNfZW5kLAogfTsKIAogaW50CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L0tjb25maWcgYi9hcmNoL3BwYzY0L0tjb25maWcKaW5kZXggMTNiMjYyZi4uZGVjYTY4YSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9LY29uZmlnCisrKyBiL2FyY2gvcHBjNjQvS2NvbmZpZwpAQCAtNDQsNiArNDQsMTAgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQworCWJvb2wKKwlkZWZhdWx0IHkKKwogIyBXZSBvcHRpbWlzdGljYWxseSBhbGxvY2F0ZSBsYXJnZXBhZ2VzIGZyb20gdGhlIFZNLCBzbyBtYWtlIHRoZSBsaW1pdAogIyBsYXJnZSBlbm91Z2ggKDE2TUIpLiBUaGlzIGJhZGx5IG5hbWVkIGNvbmZpZyBvcHRpb24gaXMgYWN0dWFsbHkKICMgbWF4IG9yZGVyICsgMQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9LY29uZmlnLmRlYnVnIGIvYXJjaC9wcGM2NC9LY29uZmlnLmRlYnVnCmluZGV4IDQ2YjFjZTUuLmYxNmE1MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3BwYzY0L0tjb25maWcuZGVidWcKQEAgLTQxLDEwICs0MSwxOSBAQAogCWhlbHAKIAkgIEluY2x1ZGUgaW4ta2VybmVsIGhvb2tzIGZvciB0aGUgeG1vbiBrZXJuZWwgbW9uaXRvci9kZWJ1Z2dlci4KIAkgIFVubGVzcyB5b3UgYXJlIGludGVuZGluZyB0byBkZWJ1ZyB0aGUga2VybmVsLCBzYXkgTiBoZXJlLgorCSAgTWFrZSBzdXJlIHRvIGVuYWJsZSBhbHNvIENPTkZJR19CT09UWF9URVhUIG9uIE1hY3MuIE90aGVyd2lzZQorCSAgbm90aGluZyB3aWxsIGFwcGVhciBvbiB0aGUgc2NyZWVuICh4bW9uIHdyaXRlcyBkaXJlY3RseSB0byB0aGUKKwkgIGZyYW1lYnVmZmVyIG1lbW9yeSkuCisJICBUaGUgY21kbGluZSBvcHRpb24gJ3htb24nIG9yICd4bW9uPWVhcmx5JyB3aWxsIGRyb3AgaW50byB4bW9uIHZlcnkKKwkgIGVhcmx5IGR1cmluZyBib290LiAneG1vbj1vbicgd2lsbCBqdXN0IGVuYWJsZSB0aGUgeG1vbiBkZWJ1Z2dlciBob29rcy4KKwkgICd4bW9uPW9mZicgd2lsbCBkaXNhYmxlIHRoZSBkZWJ1Z2dlciBob29rcyBpZiBDT05GSUdfWE1PTl9ERUZBVUxUIGlzIHNldC4KIAogY29uZmlnIFhNT05fREVGQVVMVAogCWJvb2wgIkVuYWJsZSB4bW9uIGJ5IGRlZmF1bHQiCiAJZGVwZW5kcyBvbiBYTU9OCisJaGVscAorCSAgeG1vbiBpcyBub3JtYWxseSBkaXNhYmxlZCB1bmxlc3MgYm9vdGVkIHdpdGggJ3htb249b24nLgorCSAgVXNlICd4bW9uPW9mZicgdG8gZGlzYWJsZSB4bW9uIGluaXQgZHVyaW5nIHJ1bnRpbWUuCiAKIGNvbmZpZyBQUENEQkcKIAlib29sICJJbmNsdWRlIFBQQ0RCRyByZWFsdGltZSBkZWJ1Z2dpbmciCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L01ha2VmaWxlIGIvYXJjaC9wcGM2NC9NYWtlZmlsZQppbmRleCA2MzUwY2NlLi4xN2QyYzFlIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L01ha2VmaWxlCisrKyBiL2FyY2gvcHBjNjQvTWFrZWZpbGUKQEAgLTQ5LDE0ICs0OSwxNCBAQAogCiBlbmRpZgogCi1DSEVDS0ZMQUdTCSs9IC1tNjQgLURfX3Bvd2VycGNfXworQ0hFQ0tGTEFHUwkrPSAtbTY0IC1EX19wb3dlcnBjX18gLURfX3Bvd2VycGM2NF9fCiAKIExERkxBR1MJCTo9IC1tIGVsZjY0cHBjCiBMREZMQUdTX3ZtbGludXgJOj0gLUJzdGF0aWMgLWUgJChLRVJORUxMT0FEKSAtVHRleHQgJChLRVJORUxMT0FEKQogQ0ZMQUdTCQkrPSAtbXNvZnQtZmxvYXQgLXBpcGUgLW1taW5pbWFsLXRvYyAtbXRyYWNlYmFjaz1ub25lIFwKIAkJICAgLW1jYWxsLWFpeGRlc2MKICMgVGVtcG9yYXJ5IGhhY2sgdW50aWwgd2UgaGF2ZSBtaWdyYXRlZCB0byBhc20tcG93ZXJwYwotQ1BQRkxBR1MJKz0gLUlpbmNsdWRlMworQ1BQRkxBR1MJKz0gLUlhcmNoLyQoQVJDSCkvaW5jbHVkZQogCiBHQ0NfVkVSU0lPTiAgICAgOj0gJChjYWxsIGNjLXZlcnNpb24pCiBHQ0NfQlJPS0VOX1ZFQwk6PSAkKHNoZWxsIGlmIFsgJChHQ0NfVkVSU0lPTikgLWx0IDA0MDAgXSA7IHRoZW4gZWNobyAieSI7IGZpIDspCkBAIC04OSwxMSArODksMTIgQEAKIAogYm9vdCA6PSBhcmNoL3BwYzY0L2Jvb3QKIAotYm9vdHRhcmdldC0kKENPTkZJR19QUENfUFNFUklFUykgOj0gekltYWdlIHpJbWFnZS5pbml0cmQKLWJvb3R0YXJnZXQtJChDT05GSUdfUFBDX01BUExFKSA6PSB6SW1hZ2UgekltYWdlLmluaXRyZAotYm9vdHRhcmdldC0kKENPTkZJR19QUENfSVNFUklFUykgOj0gdm1saW51eC5zbWluaXRyZCB2bWxpbnV4LmluaXRyZCB2bWxpbnV4LnNtCi1ib290dGFyZ2V0LSQoQ09ORklHX1BQQ19CUEEpIDo9IHpJbWFnZSB6SW1hZ2UuaW5pdHJkCi0kKGJvb3R0YXJnZXQteSk6IHZtbGludXgKK2Jvb3R0YXJnZXRzLSQoQ09ORklHX1BQQ19QU0VSSUVTKSArPSB6SW1hZ2UgekltYWdlLmluaXRyZAorYm9vdHRhcmdldHMtJChDT05GSUdfUFBDX1BNQUMpICs9IHpJbWFnZS52bW9kZSB6SW1hZ2UuaW5pdHJkLnZtb2RlCitib290dGFyZ2V0cy0kKENPTkZJR19QUENfTUFQTEUpICs9IHpJbWFnZSB6SW1hZ2UuaW5pdHJkCitib290dGFyZ2V0cy0kKENPTkZJR19QUENfSVNFUklFUykgKz0gdm1saW51eC5zbWluaXRyZCB2bWxpbnV4LmluaXRyZCB2bWxpbnV4LnNtCitib290dGFyZ2V0cy0kKENPTkZJR19QUENfQlBBKSArPSB6SW1hZ2UgekltYWdlLmluaXRyZAorJChib290dGFyZ2V0cy15KTogdm1saW51eAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgJChib290KS8kQAogCiBib290aW1hZ2UtJChDT05GSUdfUFBDX1BTRVJJRVMpIDo9ICQoYm9vdCkvekltYWdlCkBAIC0xMTQsMjcgKzExNSwyMSBAQAogCiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQotCSQoUSlybSAtcmYgaW5jbHVkZTMKKwkjIFRlbXBvcmFyeSBoYWNrIHVudGlsIHdlIGhhdmUgbWlncmF0ZWQgdG8gYXNtLXBvd2VycGMKKwkkKFEpcm0gLXJmIGFyY2gvJChBUkNIKS9pbmNsdWRlCiAKLXByZXBhcmU6IGluY2x1ZGUvYXNtLXBwYzY0L29mZnNldHMuaAotCi1hcmNoL3BwYzY0L2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBcCi0JCQkJICAgaW5jbHVkZS9jb25maWcvTUFSS0VSCi0KLWluY2x1ZGUvYXNtLXBwYzY0L29mZnNldHMuaDogYXJjaC9wcGM2NC9rZXJuZWwvYXNtLW9mZnNldHMucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKIAogIyBUZW1wb3JhcnkgaGFjayB1bnRpbCB3ZSBoYXZlIG1pZ3JhdGVkIHRvIGFzbS1wb3dlcnBjCi1pbmNsdWRlL2FzbTogaW5jbHVkZTMvYXNtCi1pbmNsdWRlMy9hc206Ci0JJChRKWlmIFsgISAtZCBpbmNsdWRlMyBdOyB0aGVuIG1rZGlyIC1wIGluY2x1ZGUzOyBmaTsKLQkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLXBvd2VycGMgaW5jbHVkZTMvYXNtCitpbmNsdWRlL2FzbTogYXJjaC8kKEFSQ0gpL2luY2x1ZGUvYXNtCithcmNoLyQoQVJDSCkvaW5jbHVkZS9hc206CisJJChRKWlmIFsgISAtZCBhcmNoLyQoQVJDSCkvaW5jbHVkZSBdOyB0aGVuIG1rZGlyIC1wIGFyY2gvJChBUkNIKS9pbmNsdWRlOyBmaQorCSQoUSlsbiAtZnNuICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tcG93ZXJwYyBhcmNoLyQoQVJDSCkvaW5jbHVkZS9hc20KIAogZGVmaW5lIGFyY2hoZWxwCi0gIGVjaG8gICcqIHpJbWFnZSAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlIChhcmNoLyQoQVJDSCkvYm9vdC96SW1hZ2UpJwotICBlY2hvICAnICB6SW1hZ2UuaW5pdHJkLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSB3aXRoIGluaXRyZCBhdHRhY2hlZCwnCi0gIGVjaG8gICcJCSAgIHNvdXJjZWQgZnJvbSBhcmNoLyQoQVJDSCkvYm9vdC9yYW1kaXNrLmltYWdlLmd6JwotICBlY2hvICAnCQkgICAoYXJjaC8kKEFSQ0gpL2Jvb3QvekltYWdlLmluaXRyZCknCisgIGVjaG8gICcgIHpJbWFnZS52bW9kZSAgICAgICAgLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoYXJjaC8kKEFSQ0gpL2Jvb3QvekltYWdlLnZtb2RlKScKKyAgZWNobyAgJyAgekltYWdlLmluaXRyZC52bW9kZSAtIENvbXByZXNzZWQga2VybmVsIGltYWdlIHdpdGggaW5pdHJkIGF0dGFjaGVkLCcKKyAgZWNobyAgJyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZWQgZnJvbSBhcmNoLyQoQVJDSCkvYm9vdC9yYW1kaXNrLmltYWdlLmd6JworICBlY2hvICAnICAgICAgICAgICAgICAgICAgICAgICAgKGFyY2gvJChBUkNIKS9ib290L3pJbWFnZS5pbml0cmQudm1vZGUpJworICBlY2hvICAnICB6SW1hZ2UgICAgICAgICAgICAgIC0gekltYWdlIGZvciBwU2VyaWVzIG1hY2hpbmVzJworICBlY2hvICAnICB6SW1hZ2UuaW5pdHJkICAgICAgIC0gekltYWdlIHdpdGggaW5pdHJkIGZvciBwU2VyaWVzIG1hY2hpbmVzJwogZW5kZWYKLQotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tcHBjNjQvb2Zmc2V0cy5oCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2Jvb3QvTWFrZWZpbGUgYi9hcmNoL3BwYzY0L2Jvb3QvTWFrZWZpbGUKaW5kZXggMmM1ZjVlNy4uMzNmZGM4NyAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcHBjNjQvYm9vdC9NYWtlZmlsZQpAQCAtMzcsNiArMzcsOSBAQAogcXVpZXRfY21kX2Jvb3RhcyA9IEJPT1RBUyAgJEAKICAgICAgIGNtZF9ib290YXMgPSAkKENST1NTMzJDQykgLVdwLC1NRCwkKGRlcGZpbGUpICQoQk9PVEFGTEFHUykgLWMgLW8gJEAgJDwKIAorcXVpZXRfY21kX2Jvb3RsZCA9IEJPT1RMRCAgJEAKKyAgICAgIGNtZF9ib290bGQgPSAkKENST1NTMzJMRCkgJChCT09UTEZMQUdTKSAtbyAkQCAkKDIpCisKICQocGF0c3Vic3QgJS5jLCUubywgJChmaWx0ZXIgJS5jLCAkKHNyYy1ib290KSkpOiAlLm86ICUuYwogCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxib290Y2MpCiAkKHBhdHN1YnN0ICUuUywlLm8sICQoZmlsdGVyICUuUywgJChzcmMtYm9vdCkpKTogJS5vOiAlLlMKQEAgLTUzLDcgKzU2LDcgQEAKIGd6LXNlYyAgPSAkKGZvcmVhY2ggc2VjdGlvbiwgJCgxKSwgJChwYXRzdWJzdCAlLCQob2JqKS9rZXJuZWwtJS5neiwgJChzZWN0aW9uKSkpCiAKIGhvc3Rwcm9ncy15CQk6PSBhZGRub3RlIGFkZFJhbURpc2sKLXRhcmdldHMgCQkrPSB6SW1hZ2UgekltYWdlLmluaXRyZCBpbWFnZXNpemUuYyBcCit0YXJnZXRzIAkJKz0gekltYWdlLnZtb2RlIHpJbWFnZS5pbml0cmQudm1vZGUgekltYWdlIHpJbWFnZS5pbml0cmQgaW1hZ2VzaXplLmMgXAogCQkJICAgJChwYXRzdWJzdCAkKG9iaikvJSwlLCAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSkgXAogCQkJICAgJChwYXRzdWJzdCAkKG9iaikvJSwlLCAkKGNhbGwgc3JjLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSkgXAogCQkJICAgJChwYXRzdWJzdCAkKG9iaikvJSwlLCAkKGNhbGwgZ3otc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpKSBcCkBAIC02Myw3ICs2Niw3IEBACiBxdWlldF9jbWRfcmFtZGlzayA9IFJBTURJU0sgJEAKICAgICAgIGNtZF9yYW1kaXNrID0gJChvYmopL2FkZFJhbURpc2sgJChvYmopL3JhbWRpc2suaW1hZ2UuZ3ogJDwgJEAKIAotcXVpZXRfY21kX3N0cmlwdm0gPSBTVFJJUCAkQAorcXVpZXRfY21kX3N0cmlwdm0gPSBTVFJJUCAgICRACiAgICAgICBjbWRfc3RyaXB2bSA9ICQoU1RSSVApIC1zICQ8IC1vICRACiAKIHZtbGludXguc3RyaXA6IHZtbGludXggRk9SQ0UKQEAgLTcxLDEyICs3NCwyMCBAQAogJChvYmopL3ZtbGludXguaW5pdHJkOiB2bWxpbnV4LnN0cmlwICQob2JqKS9hZGRSYW1EaXNrICQob2JqKS9yYW1kaXNrLmltYWdlLmd6IEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQscmFtZGlzaykKIAotYWRkc2VjdGlvbiA9ICQoQ1JPU1MzMk9CSkNPUFkpICQoMSkgXAotCQktLWFkZC1zZWN0aW9uPS5rZXJuZWw6JChzdHJpcCAkKHBhdHN1YnN0ICQob2JqKS9rZXJuZWwtJS5vLCUsICQoMSkpKT0kKHBhdHN1YnN0ICUubywlLmd6LCAkKDEpKSBcCi0JCS0tc2V0LXNlY3Rpb24tZmxhZ3M9Lmtlcm5lbDokKHN0cmlwICQocGF0c3Vic3QgJChvYmopL2tlcm5lbC0lLm8sJSwgJCgxKSkpPSQoT0JKQ09QWUZMQUdTKQorcXVpZXRfY21kX2FkZHNlY3Rpb24gPSBBRERTRUMgICRACisgICAgICBjbWRfYWRkc2VjdGlvbiA9ICQoQ1JPU1MzMk9CSkNPUFkpICRAIFwKKwkJLS1hZGQtc2VjdGlvbj0ua2VybmVsOiQoc3RyaXAgJChwYXRzdWJzdCAkKG9iaikva2VybmVsLSUubywlLCAkQCkpPSQocGF0c3Vic3QgJS5vLCUuZ3osICRAKSBcCisJCS0tc2V0LXNlY3Rpb24tZmxhZ3M9Lmtlcm5lbDokKHN0cmlwICQocGF0c3Vic3QgJChvYmopL2tlcm5lbC0lLm8sJSwgJEApKT0kKE9CSkNPUFlGTEFHUykKIAotcXVpZXRfY21kX2FkZG5vdGUgPSBBREROT1RFICRAIAotICAgICAgY21kX2FkZG5vdGUgPSAkKENST1NTMzJMRCkgJChCT09UTEZMQUdTKSAtbyAkQCAkKG9iai1ib290KSAmJiAkKG9iaikvYWRkbm90ZSAkQAorcXVpZXRfY21kX2ltYWdlc2l6ZSA9IEdFTlNJWkUgJEAKKyAgICAgIGNtZF9pbWFnZXNpemUgPSBscyAtbCB2bWxpbnV4LnN0cmlwIHwgXAorCQlhd2sgJ3twcmludGYgIi8qIGdlbmVyYXRlZCAtLSBkbyBub3QgZWRpdCEgKi9cbiIgInVuc2lnbmVkIGxvbmcgdm1saW51eF9maWxlc2l6ZSA9ICVkO1xuIiwgJCQ1fScgXAorCQk+ICQob2JqKS9pbWFnZXNpemUuYyAmJiBcCisJCSQoQ1JPU1NfQ09NUElMRSlubSAtbiB2bWxpbnV4IHwgdGFpbCAtbiAxIHwgXAorCQlhd2sgJ3twcmludGYgInVuc2lnbmVkIGxvbmcgdm1saW51eF9tZW1zaXplID0gMHglcztcbiIsIHN1YnN0cigkJDEsOCl9JyA+PiAkKG9iaikvaW1hZ2VzaXplLmMKKworcXVpZXRfY21kX2FkZG5vdGUgPSBBREROT1RFICRACisgICAgICBjbWRfYWRkbm90ZSA9ICQob2JqKS9hZGRub3RlICRACiAKICQoY2FsbCBnei1zZWMsICQocmVxdWlyZWQpKTogJChvYmopL2tlcm5lbC0lLmd6OiAlIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKQEAgLTg1LDI4ICs5NiwzMCBAQAogCWNwIC1mICQob2JqKS9yYW1kaXNrLmltYWdlLmd6ICRACiAKICQoY2FsbCBzcmMtc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpOiAkKG9iaikva2VybmVsLSUuYzogJChvYmopL2tlcm5lbC0lLmd6IEZPUkNFCi0JdG91Y2ggJEAKKwlAdG91Y2ggJEAKIAogJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSk6ICQob2JqKS9rZXJuZWwtJS5vOiAkKG9iaikva2VybmVsLSUuYyBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxib290Y2MpCi0JJChjYWxsIGFkZHNlY3Rpb24sICRAKQorCSQoY2FsbCBjbWQsYWRkc2VjdGlvbikKIAotJChvYmopL3pJbWFnZTogb2JqLWJvb3QgKz0gJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpKQotJChvYmopL3pJbWFnZTogJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpKSAkKG9iai1ib290KSAkKG9iaikvYWRkbm90ZSBGT1JDRQorJChvYmopL3pJbWFnZS52bW9kZTogb2JqLWJvb3QgKz0gJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpKQorJChvYmopL3pJbWFnZS52bW9kZTogJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpKSAkKG9iai1ib290KSBGT1JDRQorCSQoY2FsbCBjbWQsYm9vdGxkLCQob2JqLWJvb3QpKQorCiskKG9iaikvekltYWdlLmluaXRyZC52bW9kZTogb2JqLWJvb3QgKz0gJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkKKyQob2JqKS96SW1hZ2UuaW5pdHJkLnZtb2RlOiAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSAkKG9iai1ib290KSBGT1JDRQorCSQoY2FsbCBjbWQsYm9vdGxkLCQob2JqLWJvb3QpKQorCiskKG9iaikvekltYWdlOiAkKG9iaikvekltYWdlLnZtb2RlICQob2JqKS9hZGRub3RlIEZPUkNFCisJQGNwIC1mICQ8ICRACiAJJChjYWxsIGlmX2NoYW5nZWQsYWRkbm90ZSkKIAotJChvYmopL3pJbWFnZS5pbml0cmQ6IG9iai1ib290ICs9ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpCi0kKG9iaikvekltYWdlLmluaXRyZDogJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkgJChvYmotYm9vdCkgJChvYmopL2FkZG5vdGUgRk9SQ0UKKyQob2JqKS96SW1hZ2UuaW5pdHJkOiAkKG9iaikvekltYWdlLmluaXRyZC52bW9kZSAkKG9iaikvYWRkbm90ZSBGT1JDRQorCUBjcCAtZiAkPCAkQAogCSQoY2FsbCBpZl9jaGFuZ2VkLGFkZG5vdGUpCiAKICQob2JqKS9pbWFnZXNpemUuYzogdm1saW51eC5zdHJpcAotCUBlY2hvIEdlbmVyYXRpbmcgJEAKLQlscyAtbCB2bWxpbnV4LnN0cmlwIHwgXAotCWF3ayAne3ByaW50ZiAiLyogZ2VuZXJhdGVkIC0tIGRvIG5vdCBlZGl0ISAqL1xuIiBcCi0JCSJ1bnNpZ25lZCBsb25nIHZtbGludXhfZmlsZXNpemUgPSAlZDtcbiIsICQkNX0nID4gJChvYmopL2ltYWdlc2l6ZS5jCi0JJChDUk9TU19DT01QSUxFKW5tIC1uIHZtbGludXggfCB0YWlsIC1uIDEgfCBcCi0JYXdrICd7cHJpbnRmICJ1bnNpZ25lZCBsb25nIHZtbGludXhfbWVtc2l6ZSA9IDB4JXM7XG4iLCBzdWJzdHIoJCQxLDgpfScgXAotCQk+PiAkKG9iaikvaW1hZ2VzaXplLmMKKwkkKGNhbGwgY21kLGltYWdlc2l6ZSkKIAogaW5zdGFsbDogJChDT05GSUdVUkUpICQoQk9PVElNQUdFKQogCXNoIC14ICQoc3JjdHJlZSkvJChzcmMpL2luc3RhbGwuc2ggIiQoS0VSTkVMUkVMRUFTRSkiIHZtbGludXggU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIiAiJChCT09USU1BR0UpIgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9ib290L21haW4uYyBiL2FyY2gvcHBjNjQvYm9vdC9tYWluLmMKaW5kZXggOTllNjhjZi4uZjdlYzE5YSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9ib290L21haW4uYworKysgYi9hcmNoL3BwYzY0L2Jvb3QvbWFpbi5jCkBAIC0yMyw3ICsyMyw4IEBACiAKIC8qIFZhbHVlIHBpY2tlZCB0byBtYXRjaCB0aGF0IHVzZWQgYnkgeWFib290ICovCiAjZGVmaW5lIFBST0dfU1RBUlQJMHgwMTQwMDAwMAotI2RlZmluZSBSQU1fRU5ECQkoMjU2PDwyMCkgLy8gRml4bWU6IHVzZSBPRiAqLworI2RlZmluZSBSQU1fRU5ECQkoNTEyPDwyMCkgLy8gRml4bWU6IHVzZSBPRiAqLworI2RlZmluZQlPTkVfTUIJCTB4MTAwMDAwCiAKIHN0YXRpYyBjaGFyICphdmFpbF9yYW07CiBzdGF0aWMgY2hhciAqYmVnaW5fYXZhaWwsICplbmRfYXZhaWw7CkBAIC0zMiw2ICszMyw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGhlYXBfbWF4OwogCiBleHRlcm4gY2hhciBfc3RhcnRbXTsKK2V4dGVybiBjaGFyIF9lbmRbXTsKIGV4dGVybiBjaGFyIF92bWxpbnV4X3N0YXJ0W107CiBleHRlcm4gY2hhciBfdm1saW51eF9lbmRbXTsKIGV4dGVybiBjaGFyIF9pbml0cmRfc3RhcnRbXTsKQEAgLTU4LDEzICs2MCwxMyBAQAogCiAjdW5kZWYgREVCVUcKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xhaW1fYmFzZSA9IFBST0dfU1RBUlQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjbGFpbV9iYXNlOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0cnlfY2xhaW0odW5zaWduZWQgbG9uZyBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9IDA7CiAKLQlmb3IoOyBjbGFpbV9iYXNlIDwgUkFNX0VORDsgY2xhaW1fYmFzZSArPSAweDEwMDAwMCkgeworCWZvcig7IGNsYWltX2Jhc2UgPCBSQU1fRU5EOyBjbGFpbV9iYXNlICs9IE9ORV9NQikgewogI2lmZGVmIERFQlVHCiAJCXByaW50ZigiICAgIHRyeWluZzogMHglMDhseFxuXHIiLCBjbGFpbV9iYXNlKTsKICNlbmRpZgpAQCAtOTUsNyArOTcsMjYgQEAKIAlpZiAoZ2V0cHJvcChjaG9zZW5faGFuZGxlLCAic3RkaW4iLCAmc3RkaW4sIHNpemVvZihzdGRpbikpICE9IDQpCiAJCWV4aXQoKTsKIAotCXByaW50ZigiXG5ccnpJbWFnZSBzdGFydGluZzogbG9hZGVkIGF0IDB4JXhcblxyIiwgKHVuc2lnbmVkKV9zdGFydCk7CisJcHJpbnRmKCJcblxyekltYWdlIHN0YXJ0aW5nOiBsb2FkZWQgYXQgMHglbHhcblxyIiwgKHVuc2lnbmVkIGxvbmcpIF9zdGFydCk7CisKKwkvKgorCSAqIFRoZSBmaXJzdCBhdmFpbGFibGUgY2xhaW1fYmFzZSBtdXN0IGJlIGFib3ZlIHRoZSBlbmQgb2YgdGhlCisJICogdGhlIGxvYWRlZCBrZXJuZWwgd3JhcHBlciBmaWxlIChfc3RhcnQgdG8gX2VuZCBpbmNsdWRlcyB0aGUKKwkgKiBpbml0cmQgaW1hZ2UgaWYgaXQgaXMgcHJlc2VudCkgYW5kIHJvdW5kZWQgdXAgdG8gYSBuaWNlCisJICogMSBNQiBib3VuZGFyeSBmb3IgZ29vZCBtZWFzdXJlLgorCSAqLworCisJY2xhaW1fYmFzZSA9IF9BTElHTl9VUCgodW5zaWduZWQgbG9uZylfZW5kLCBPTkVfTUIpOworCisjaWYgZGVmaW5lZChQUk9HX1NUQVJUKQorCS8qCisJICogTWFpbnRhaW4gYSAibWFnaWMiIG1pbmltdW0gYWRkcmVzcy4gVGhpcyBrZWVwcyBzb21lIG9sZGVyCisJICogZmlybXdhcmUgcGxhdGZvcm1zIHJ1bm5pbmcuCisJICovCisKKwlpZiAoY2xhaW1fYmFzZSA8IFBST0dfU1RBUlQpCisJCWNsYWltX2Jhc2UgPSBQUk9HX1NUQVJUOworI2VuZGlmCiAKIAkvKgogCSAqIE5vdyB3ZSB0cnkgdG8gY2xhaW0gc29tZSBtZW1vcnkgZm9yIHRoZSBrZXJuZWwgaXRzZWxmCkBAIC0xMDUsNyArMTI2LDcgQEAKIAkgKiBzaXplLi4uIEluIHByYWN0aWNlIHdlIGFkZCAxTWIsIHRoYXQgaXMgZW5vdWdoLCBidXQgd2Ugc2hvdWxkIHJlYWxseQogCSAqIGNvbnNpZGVyIGZpeGluZyB0aGUgTWFrZWZpbGUgdG8gcHV0IGEgX3Jhd18ga2VybmVsIGluIHRoZXJlICEKIAkgKi8KLQl2bWxpbnV4X21lbXNpemUgKz0gMHgxMDAwMDA7CisJdm1saW51eF9tZW1zaXplICs9IE9ORV9NQjsKIAlwcmludGYoIkFsbG9jYXRpbmcgMHglbHggYnl0ZXMgZm9yIGtlcm5lbCAuLi5cblxyIiwgdm1saW51eF9tZW1zaXplKTsKIAl2bWxpbnV4LmFkZHIgPSB0cnlfY2xhaW0odm1saW51eF9tZW1zaXplKTsKIAlpZiAodm1saW51eC5hZGRyID09IDApIHsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wcGM2NC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggZjRiM2JmYy4uYWU2MGViMSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvTWFrZWZpbGUKQEAgLTMxLDcgKzMxLDcgQEAKIAogb2JqLSQoQ09ORklHX1BQQ19QU0VSSUVTKSArPSBwU2VyaWVzX3BjaS5vIHBTZXJpZXNfbHBhci5vIHBTZXJpZXNfaHZDYWxsLm8gXAogCQkJICAgICBwU2VyaWVzX252cmFtLm8gcnRhc2QubyByYXMubyBwU2VyaWVzX3JlY29uZmlnLm8gXAotCQkJICAgICBwU2VyaWVzX3NldHVwLm8gcFNlcmllc19pb21tdS5vCisJCQkgICAgIHBTZXJpZXNfc2V0dXAubyBwU2VyaWVzX2lvbW11Lm8gdWRiZ18xNjU1MC5vCiAKIG9iai0kKENPTkZJR19QUENfQlBBKSArPSBicGFfc2V0dXAubyBicGFfaW9tbXUubyBicGFfbnZyYW0ubyBcCiAJCQkgYnBhX2lpYy5vIHNwaWRlci1waWMubwpAQCAtNTgsOSArNTgsMTEgQEAKIG9iai0kKENPTkZJR19NUElDKQkJKz0gbXBpYy5vCiAKIG9iai0kKENPTkZJR19QUENfUE1BQykJCSs9IHBtYWNfc2V0dXAubyBwbWFjX2ZlYXR1cmUubyBwbWFjX3BjaS5vIFwKLQkJCQkgICBwbWFjX3RpbWUubyBwbWFjX252cmFtLm8gcG1hY19sb3dfaTJjLm8KKwkJCQkgICBwbWFjX3RpbWUubyBwbWFjX252cmFtLm8gcG1hY19sb3dfaTJjLm8gXAorCQkJCSAgIHVkYmdfc2NjLm8KIAotb2JqLSQoQ09ORklHX1BQQ19NQVBMRSkJCSs9IG1hcGxlX3NldHVwLm8gbWFwbGVfcGNpLm8gbWFwbGVfdGltZS5vCitvYmotJChDT05GSUdfUFBDX01BUExFKQkJKz0gbWFwbGVfc2V0dXAubyBtYXBsZV9wY2kubyBtYXBsZV90aW1lLm8gXAorCQkJCSAgIHVkYmdfMTY1NTAubwogCiBvYmotJChDT05GSUdfVTNfREFSVCkJCSs9IHUzX2lvbW11Lm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvYnBhX2lpYy5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvYnBhX2lpYy5jCmluZGV4IGM4ZjNkYzMuLjBhYWE4NzggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2JwYV9paWMuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9icGFfaWljLmMKQEAgLTIwNSw2ICsyMDUsMTggQEAKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKKworLyogVXNlIHRoZSBoaWdoZXN0IGludGVycnVwdCBwcmlvcml0aWVzIGZvciBJUEkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlpY19pcGlfdG9faXJxKGludCBpcGkpCit7CisJcmV0dXJuIElJQ19JUElfT0ZGU0VUICsgSUlDX05VTV9JUElTIC0gMSAtIGlwaTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWljX2lycV90b19pcGkoaW50IGlycSkKK3sKKwlyZXR1cm4gSUlDX05VTV9JUElTIC0gMSAtIChpcnEgLSBJSUNfSVBJX09GRlNFVCk7Cit9CisKIHZvaWQgaWljX3NldHVwX2NwdSh2b2lkKQogewogCW91dF9iZTY0KCZfX2dldF9jcHVfdmFyKGlpYykucmVncy0+cHJpbywgMHhmZik7CkBAIC0yMTIsMTggKzIyNCwyMCBAQAogCiB2b2lkIGlpY19jYXVzZV9JUEkoaW50IGNwdSwgaW50IG1lc2cpCiB7Ci0Jb3V0X2JlNjQoJnBlcl9jcHUoaWljLCBjcHUpLnJlZ3MtPmdlbmVyYXRlLCBtZXNnKTsKKwlvdXRfYmU2NCgmcGVyX2NwdShpaWMsIGNwdSkucmVncy0+Z2VuZXJhdGUsIChJSUNfTlVNX0lQSVMgLSAxIC0gbWVzZykgPDwgNCk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBpaWNfaXBpX2FjdGlvbihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCi0Jc21wX21lc3NhZ2VfcmVjdihpcnEgLSBJSUNfSVBJX09GRlNFVCwgcmVncyk7CisJc21wX21lc3NhZ2VfcmVjdihpaWNfaXJxX3RvX2lwaShpcnEpLCByZWdzKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIGlpY19yZXF1ZXN0X2lwaShpbnQgaXJxLCBjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIHZvaWQgaWljX3JlcXVlc3RfaXBpKGludCBpcGksIGNvbnN0IGNoYXIgKm5hbWUpCiB7CisJaW50IGlycTsKKworCWlycSA9IGlpY19pcGlfdG9faXJxKGlwaSk7CiAJLyogSVBJcyBhcmUgbWFya2VkIFNBX0lOVEVSUlVQVCBhcyB0aGV5IG11c3QgcnVuIHdpdGggaXJxcwogCSAqIGRpc2FibGVkICovCiAJZ2V0X2lycV9kZXNjKGlycSktPmhhbmRsZXIgPSAmaWljX3BpYzsKQEAgLTIzMywxMCArMjQ3LDEwIEBACiAKIHZvaWQgaWljX3JlcXVlc3RfSVBJcyh2b2lkKQogewotCWlpY19yZXF1ZXN0X2lwaShJSUNfSVBJX09GRlNFVCArIFBQQ19NU0dfQ0FMTF9GVU5DVElPTiwgIklQSS1jYWxsIik7Ci0JaWljX3JlcXVlc3RfaXBpKElJQ19JUElfT0ZGU0VUICsgUFBDX01TR19SRVNDSEVEVUxFLCAiSVBJLXJlc2NoZWQiKTsKKwlpaWNfcmVxdWVzdF9pcGkoUFBDX01TR19DQUxMX0ZVTkNUSU9OLCAiSVBJLWNhbGwiKTsKKwlpaWNfcmVxdWVzdF9pcGkoUFBDX01TR19SRVNDSEVEVUxFLCAiSVBJLXJlc2NoZWQiKTsKICNpZmRlZiBDT05GSUdfREVCVUdHRVIKLQlpaWNfcmVxdWVzdF9pcGkoSUlDX0lQSV9PRkZTRVQgKyBQUENfTVNHX0RFQlVHR0VSX0JSRUFLLCAiSVBJLWRlYnVnIik7CisJaWljX3JlcXVlc3RfaXBpKFBQQ19NU0dfREVCVUdHRVJfQlJFQUssICJJUEktZGVidWciKTsKICNlbmRpZiAvKiBDT05GSUdfREVCVUdHRVIgKi8KIH0KICNlbmRpZiAvKiBDT05GSUdfU01QICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9idGV4dC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvYnRleHQuYwppbmRleCBjNTNmMDc5Li5iNmZiZmJlIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9idGV4dC5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2J0ZXh0LmMKQEAgLTcsNyArNyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMgYi9hcmNoL3BwYzY0L2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMKaW5kZXggMDQ4MmMwNi4uMWZiNjczYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMKQEAgLTEyLDEwICsxMiw5IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAKIF9HTE9CQUwoX185NzBfY3B1X3ByZWluaXQpCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvY3B1dGFibGUuYwppbmRleCA0ODQ3ZjJhLi44ODMxYTI4IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2NwdXRhYmxlLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKKyNpbmNsdWRlIDxhc20vb3Byb2ZpbGVfaW1wbC5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogCiBzdHJ1Y3QgY3B1X3NwZWMqIGN1cl9jcHVfc3BlYyA9IE5VTEw7CkBAIC01NCwyNCArNTUsMzIgQEAKIAkJLnB2cl92YWx1ZQkJPSAweDAwNDAwMDAwLAogCQkuY3B1X25hbWUJCT0gIlBPV0VSMyAoNjMwKSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8Ci0JCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8Ci0JCQlDUFVfRlRSX1BNQzgsCisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiwKIAkJLmNwdV91c2VyX2ZlYXR1cmVzID0gQ09NTU9OX1VTRVJfUFBDNjQsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAorI2lmZGVmIENPTkZJR19PUFJPRklMRQorCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcG93ZXIzIiwKKwkJLm9wcm9maWxlX21vZGVsCQk9ICZvcF9tb2RlbF9yczY0LAorI2VuZGlmCiAJfSwKIAl7CS8qIFBvd2VyMysgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCiAJCS5wdnJfdmFsdWUJCT0gMHgwMDQxMDAwMCwKIAkJLmNwdV9uYW1lCQk9ICJQT1dFUjMgKDYzMCspIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKLQkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9JQUJSIHwKLQkJCUNQVV9GVFJfUE1DOCwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9JQUJSLAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCwKIAkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkubnVtX3BtY3MJCT0gOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCisjaWZkZWYgQ09ORklHX09QUk9GSUxFCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjMiLAorCQkub3Byb2ZpbGVfbW9kZWwJCT0gJm9wX21vZGVsX3JzNjQsCisjZW5kaWYKIAl9LAogCXsJLyogTm9ydGhzdGFyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNzksMTEgKzg4LDE2IEBACiAJCS5jcHVfbmFtZQkJPSAiUlM2NC1JSSAobm9ydGhzdGFyKSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CiAJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8Ci0JCQlDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9DVFJMLAorCQkJQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1RSTCwKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAorI2lmZGVmIENPTkZJR19PUFJPRklMRQorCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcnM2NCIsCisJCS5vcHJvZmlsZV9tb2RlbAkJPSAmb3BfbW9kZWxfcnM2NCwKKyNlbmRpZgogCX0sCiAJewkvKiBQdWxzYXIgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC05MSwxMSArMTA1LDE2IEBACiAJCS5jcHVfbmFtZQkJPSAiUlM2NC1JSUkgKHB1bHNhcikiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAogCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0lBQlIgfAotCQkJQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1RSTCwKKwkJCUNQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX0NUUkwsCiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKKyNpZmRlZiBDT05GSUdfT1BST0ZJTEUKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3JzNjQiLAorCQkub3Byb2ZpbGVfbW9kZWwJCT0gJm9wX21vZGVsX3JzNjQsCisjZW5kaWYKIAl9LAogCXsJLyogSS1zdGFyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTAzLDExICsxMjIsMTYgQEAKIAkJLmNwdV9uYW1lCQk9ICJSUzY0LUlJSSAoaWNlc3RhcikiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAogCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0lBQlIgfAotCQkJQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1RSTCwKKwkJCUNQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX0NUUkwsCiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKKyNpZmRlZiBDT05GSUdfT1BST0ZJTEUKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3JzNjQiLAorCQkub3Byb2ZpbGVfbW9kZWwJCT0gJm9wX21vZGVsX3JzNjQsCisjZW5kaWYKIAl9LAogCXsJLyogUy1zdGFyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTE1LDExICsxMzksMTYgQEAKIAkJLmNwdV9uYW1lCQk9ICJSUzY0LUlWIChzc3RhcikiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAogCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0lBQlIgfAotCQkJQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1RSTCwKKwkJCUNQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX0NUUkwsCiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKKyNpZmRlZiBDT05GSUdfT1BST0ZJTEUKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3JzNjQiLAorCQkub3Byb2ZpbGVfbW9kZWwJCT0gJm9wX21vZGVsX3JzNjQsCisjZW5kaWYKIAl9LAogCXsJLyogUG93ZXI0ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTI3LDExICsxNTYsMTYgQEAKIAkJLmNwdV9uYW1lCQk9ICJQT1dFUjQgKGdwKSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CiAJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCQlDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAorCQkJQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9NTUNSQSwKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAorI2lmZGVmIENPTkZJR19PUFJPRklMRQorCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcG93ZXI0IiwKKwkJLm9wcm9maWxlX21vZGVsCQk9ICZvcF9tb2RlbF9yczY0LAorI2VuZGlmCiAJfSwKIAl7CS8qIFBvd2VyNCsgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0xMzksMTEgKzE3MywxNiBAQAogCQkuY3B1X25hbWUJCT0gIlBPV0VSNCsgKGdxKSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CiAJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCQlDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAorCQkJQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9NTUNSQSwKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAorI2lmZGVmIENPTkZJR19PUFJPRklMRQorCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcG93ZXI0IiwKKwkJLm9wcm9maWxlX21vZGVsCQk9ICZvcF9tb2RlbF9wb3dlcjQsCisjZW5kaWYKIAl9LAogCXsJLyogUFBDOTcwICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTUyLDEyICsxOTEsMTcgQEAKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKIAkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKIAkJCUNQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwKLQkJCUNQVV9GVFJfQ0FOX05BUCB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCisJCQlDUFVfRlRSX0NBTl9OQVAgfCBDUFVfRlRSX01NQ1JBLAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCB8CiAJCQlQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3BwYzk3MCwKKyNpZmRlZiBDT05GSUdfT1BST0ZJTEUKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0Lzk3MCIsCisJCS5vcHJvZmlsZV9tb2RlbAkJPSAmb3BfbW9kZWxfcG93ZXI0LAorI2VuZGlmCiAJfSwKIAl7CS8qIFBQQzk3MEZYICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTY2LDEyICsyMTAsMTcgQEAKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKIAkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKIAkJCUNQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwKLQkJCUNQVV9GVFJfQ0FOX05BUCB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCisJCQlDUFVfRlRSX0NBTl9OQVAgfCBDUFVfRlRSX01NQ1JBLAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCB8CiAJCQlQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3BwYzk3MCwKKyNpZmRlZiBDT05GSUdfT1BST0ZJTEUKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0Lzk3MCIsCisJCS5vcHJvZmlsZV9tb2RlbAkJPSAmb3BfbW9kZWxfcG93ZXI0LAorI2VuZGlmCiAJfSwKIAl7CS8qIFBQQzk3ME1QICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTgwLDEyICsyMjksMTYgQEAKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKIAkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKIAkJCUNQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwKLQkJCUNQVV9GVFJfQ0FOX05BUCB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCisJCQlDUFVfRlRSX0NBTl9OQVAgfCBDUFVfRlRSX01NQ1JBLAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCB8CiAJCQlQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcHBjOTcwLAorI2lmZGVmIENPTkZJR19PUFJPRklMRQorCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvOTcwIiwKKwkJLm9wcm9maWxlX21vZGVsCQk9ICZvcF9tb2RlbF9wb3dlcjQsCisjZW5kaWYKIAl9LAogCXsJLyogUG93ZXI1ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTk5LDcgKzI1MiwxMiBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCwKIAkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkubnVtX3BtY3MJCT0gNiwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCisjaWZkZWYgQ09ORklHX09QUk9GSUxFCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjUiLAorCQkub3Byb2ZpbGVfbW9kZWwJCT0gJm9wX21vZGVsX3Bvd2VyNCwKKyNlbmRpZgogCX0sCiAJewkvKiBQb3dlcjUgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0yMTMsNyArMjcxLDEyIEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNCwKKyNpZmRlZiBDT05GSUdfT1BST0ZJTEUKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNSIsCisJCS5vcHJvZmlsZV9tb2RlbAkJPSAmb3BfbW9kZWxfcG93ZXI0LAorI2VuZGlmCiAJfSwKIAl7CS8qIEJFIEREMS54ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMjM5LDYgKzMwMiw3IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5udW1fcG1jcwkJPSA2LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNCwKIAl9CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvZWVoLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9lZWguYwppbmRleCBhZjUyNzJmLi5iYTkzZmQ3IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9lZWguYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9lZWguYwpAQCAtMjAyLDEwICsyMDIsOSBAQAogCXdoaWxlIChuKSB7CiAJCXN0cnVjdCBwY2lfaW9fYWRkcl9yYW5nZSAqcGlhcjsKIAkJcGlhciA9IHJiX2VudHJ5KG4sIHN0cnVjdCBwY2lfaW9fYWRkcl9yYW5nZSwgcmJfbm9kZSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6ICVzIGFkZHIgcmFuZ2UgJWQgWyVseC0lbHhdOiAlcyAlc1xuIiwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogJXMgYWRkciByYW5nZSAlZCBbJWx4LSVseF06ICVzXG4iLAogCQkgICAgICAgKHBpYXItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgPyAiaS9vIiA6ICJtZW0iLCBjbnQsCi0JCSAgICAgICBwaWFyLT5hZGRyX2xvLCBwaWFyLT5hZGRyX2hpLCBwY2lfbmFtZShwaWFyLT5wY2lkZXYpLAotCQkgICAgICAgcGNpX3ByZXR0eV9uYW1lKHBpYXItPnBjaWRldikpOworCQkgICAgICAgcGlhci0+YWRkcl9sbywgcGlhci0+YWRkcl9oaSwgcGNpX25hbWUocGlhci0+cGNpZGV2KSk7CiAJCWNudCsrOwogCQluID0gcmJfbmV4dChuKTsKIAl9CkBAIC0yNTUsMjIgKzI1NCwyNCBAQAogc3RhdGljIHZvaWQgX19wY2lfYWRkcl9jYWNoZV9pbnNlcnRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwlzdHJ1Y3QgcGNpX2RuICpwZG47CiAJaW50IGk7CiAJaW50IGluc2VydGVkID0gMDsKIAogCWRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldik7CiAJaWYgKCFkbikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IG5vIHBjaSBkbiBmb3VuZCBmb3IgZGV2PSVzICVzXG4iLAotCQkJcGNpX25hbWUoZGV2KSwgcGNpX3ByZXR0eV9uYW1lKGRldikpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IG5vIHBjaSBkbiBmb3VuZCBmb3IgZGV2PSVzXG4iLAorCQkJcGNpX25hbWUoZGV2KSk7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBTa2lwIGFueSBkZXZpY2VzIGZvciB3aGljaCBFRUggaXMgbm90IGVuYWJsZWQuICovCi0JaWYgKCEoZG4tPmVlaF9tb2RlICYgRUVIX01PREVfU1VQUE9SVEVEKSB8fAotCSAgICBkbi0+ZWVoX21vZGUgJiBFRUhfTU9ERV9OT0NIRUNLKSB7CisJcGRuID0gZG4tPmRhdGE7CisJaWYgKCEocGRuLT5lZWhfbW9kZSAmIEVFSF9NT0RFX1NVUFBPUlRFRCkgfHwKKwkgICAgcGRuLT5lZWhfbW9kZSAmIEVFSF9NT0RFX05PQ0hFQ0spIHsKICNpZmRlZiBERUJVRwotCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IHNraXAgYnVpbGRpbmcgYWRkcmVzcyBjYWNoZSBmb3I9JXMgJXNcbiIsCi0JCSAgICAgICBwY2lfbmFtZShkZXYpLCBwY2lfcHJldHR5X25hbWUoZGV2KSk7CisJCXByaW50ayhLRVJOX0lORk8gIlBDSTogc2tpcCBidWlsZGluZyBhZGRyZXNzIGNhY2hlIGZvcj0lc1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKGRldikpOwogI2VuZGlmCiAJCXJldHVybjsKIAl9CkBAIC00MTYsNiArNDE3LDcgQEAKIHN0YXRpYyBpbnQgcmVhZF9zbG90X3Jlc2V0X3N0YXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIGludCByZXRzW10pCiB7CiAJaW50IHRva2VuLCBvdXRwdXRzOworCXN0cnVjdCBwY2lfZG4gKnBkbiA9IGRuLT5kYXRhOwogCiAJaWYgKGlibV9yZWFkX3Nsb3RfcmVzZXRfc3RhdGUyICE9IFJUQVNfVU5LTk9XTl9TRVJWSUNFKSB7CiAJCXRva2VuID0gaWJtX3JlYWRfc2xvdF9yZXNldF9zdGF0ZTI7CkBAIC00MjUsOCArNDI3LDggQEAKIAkJb3V0cHV0cyA9IDM7CiAJfQogCi0JcmV0dXJuIHJ0YXNfY2FsbCh0b2tlbiwgMywgb3V0cHV0cywgcmV0cywgZG4tPmVlaF9jb25maWdfYWRkciwKLQkJCSBCVUlEX0hJKGRuLT5waGItPmJ1aWQpLCBCVUlEX0xPKGRuLT5waGItPmJ1aWQpKTsKKwlyZXR1cm4gcnRhc19jYWxsKHRva2VuLCAzLCBvdXRwdXRzLCByZXRzLCBwZG4tPmVlaF9jb25maWdfYWRkciwKKwkJCSBCVUlEX0hJKHBkbi0+cGhiLT5idWlkKSwgQlVJRF9MTyhwZG4tPnBoYi0+YnVpZCkpOwogfQogCiAvKioKQEAgLTQ0NywxMiArNDQ5LDEyIEBACiAJICogaW4gbGlnaHQgb2YgcG90ZW50aWFsIGNvcnJ1cHRpb24sIHdlIGNhbiB1c2UgaXQgaGVyZS4KIAkgKi8KIAlpZiAocGFuaWNfb25fb29wcykKLQkJcGFuaWMoIkVFSDogTU1JTyBmYWlsdXJlICglZCkgb24gZGV2aWNlOiVzICVzXG4iLCByZXNldF9zdGF0ZSwKLQkJICAgICAgcGNpX25hbWUoZGV2KSwgcGNpX3ByZXR0eV9uYW1lKGRldikpOworCQlwYW5pYygiRUVIOiBNTUlPIGZhaWx1cmUgKCVkKSBvbiBkZXZpY2U6JXNcbiIsIHJlc2V0X3N0YXRlLAorCQkgICAgICBwY2lfbmFtZShkZXYpKTsKIAllbHNlIHsKIAkJX19nZXRfY3B1X3ZhcihpZ25vcmVkX2ZhaWx1cmVzKSsrOwotCQlwcmludGsoS0VSTl9JTkZPICJFRUg6IElnbm9yZWQgTU1JTyBmYWlsdXJlICglZCkgb24gZGV2aWNlOiVzICVzXG4iLAotCQkgICAgICAgcmVzZXRfc3RhdGUsIHBjaV9uYW1lKGRldiksIHBjaV9wcmV0dHlfbmFtZShkZXYpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRUVIOiBJZ25vcmVkIE1NSU8gZmFpbHVyZSAoJWQpIG9uIGRldmljZTolc1xuIiwKKwkJICAgICAgIHJlc2V0X3N0YXRlLCBwY2lfbmFtZShkZXYpKTsKIAl9CiB9CiAKQEAgLTQ4Miw4ICs0ODQsOCBAQAogCQkJYnJlYWs7CiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRUVIOiBNTUlPIGZhaWx1cmUgKCVkKSwgbm90aWZpeWluZyBkZXZpY2UgIgotCQkgICAgICAgIiVzICVzXG4iLCBldmVudC0+cmVzZXRfc3RhdGUsCi0JCSAgICAgICBwY2lfbmFtZShldmVudC0+ZGV2KSwgcGNpX3ByZXR0eV9uYW1lKGV2ZW50LT5kZXYpKTsKKwkJICAgICAgICIlc1xuIiwgZXZlbnQtPnJlc2V0X3N0YXRlLAorCQkgICAgICAgcGNpX25hbWUoZXZlbnQtPmRldikpOwogCiAJCWF0b21pY19zZXQoJmVlaF9mYWlsX2NvdW50LCAwKTsKIAkJbm90aWZpZXJfY2FsbF9jaGFpbiAoJmVlaF9ub3RpZmllcl9jaGFpbiwKQEAgLTUzNSw2ICs1MzcsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJjLCByZXNldF9zdGF0ZTsKIAlzdHJ1Y3QgZWVoX2V2ZW50ICAqZXZlbnQ7CisJc3RydWN0IHBjaV9kbiAqcGRuOwogCiAJX19nZXRfY3B1X3Zhcih0b3RhbF9tbWlvX2ZmcykrKzsKIApAQCAtNTQzLDE0ICs1NDYsMTUgQEAKIAogCWlmICghZG4pCiAJCXJldHVybiAwOworCXBkbiA9IGRuLT5kYXRhOwogCiAJLyogQWNjZXNzIHRvIElPIEJBUnMgbWlnaHQgZ2V0IHRoaXMgZmFyIGFuZCBzdGlsbCBub3Qgd2FudCBjaGVja2luZy4gKi8KLQlpZiAoIShkbi0+ZWVoX21vZGUgJiBFRUhfTU9ERV9TVVBQT1JURUQpIHx8Ci0JICAgIGRuLT5lZWhfbW9kZSAmIEVFSF9NT0RFX05PQ0hFQ0spIHsKKwlpZiAoIXBkbi0+ZWVoX2NhcGFibGUgfHwgIShwZG4tPmVlaF9tb2RlICYgRUVIX01PREVfU1VQUE9SVEVEKSB8fAorCSAgICBwZG4tPmVlaF9tb2RlICYgRUVIX01PREVfTk9DSEVDSykgewogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIWRuLT5lZWhfY29uZmlnX2FkZHIpIHsKKwlpZiAoIXBkbi0+ZWVoX2NvbmZpZ19hZGRyKSB7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNTU4LDcgKzU2Miw3IEBACiAJICogSWYgd2UgYWxyZWFkeSBoYXZlIGEgcGVuZGluZyBpc29sYXRpb24gZXZlbnQgZm9yIHRoaXMKIAkgKiBzbG90LCB3ZSBrbm93IGl0J3MgYmFkIGFscmVhZHksIHdlIGRvbid0IG5lZWQgdG8gY2hlY2suLi4KIAkgKi8KLQlpZiAoZG4tPmVlaF9tb2RlICYgRUVIX01PREVfSVNPTEFURUQpIHsKKwlpZiAocGRuLT5lZWhfbW9kZSAmIEVFSF9NT0RFX0lTT0xBVEVEKSB7CiAJCWF0b21pY19pbmMoJmVlaF9mYWlsX2NvdW50KTsKIAkJaWYgKGF0b21pY19yZWFkKCZlZWhfZmFpbF9jb3VudCkgPj0gRUVIX01BWF9GQUlMUykgewogCQkJLyogcmUtcmVhZCB0aGUgc2xvdCByZXNldCBzdGF0ZSAqLwpAQCAtNTgzLDcgKzU4Nyw3IEBACiAJfQogCiAJLyogcHJldmVudCByZXBlYXRlZCByZXBvcnRzIG9mIHRoaXMgZmFpbHVyZSAqLwotCWRuLT5lZWhfbW9kZSB8PSBFRUhfTU9ERV9JU09MQVRFRDsKKwlwZG4tPmVlaF9tb2RlIHw9IEVFSF9NT0RFX0lTT0xBVEVEOwogCiAJcmVzZXRfc3RhdGUgPSByZXRzWzBdOwogCkBAIC01OTEsOSArNTk1LDkgQEAKIAltZW1zZXQoc2xvdF9lcnJidWYsIDAsIGVlaF9lcnJvcl9idWZfc2l6ZSk7CiAKIAlyYyA9IHJ0YXNfY2FsbChpYm1fc2xvdF9lcnJvcl9kZXRhaWwsCi0JICAgICAgICAgICAgICAgOCwgMSwgTlVMTCwgZG4tPmVlaF9jb25maWdfYWRkciwKLQkgICAgICAgICAgICAgICBCVUlEX0hJKGRuLT5waGItPmJ1aWQpLAotCSAgICAgICAgICAgICAgIEJVSURfTE8oZG4tPnBoYi0+YnVpZCksIE5VTEwsIDAsCisJICAgICAgICAgICAgICAgOCwgMSwgTlVMTCwgcGRuLT5lZWhfY29uZmlnX2FkZHIsCisJICAgICAgICAgICAgICAgQlVJRF9ISShwZG4tPnBoYi0+YnVpZCksCisJICAgICAgICAgICAgICAgQlVJRF9MTyhwZG4tPnBoYi0+YnVpZCksIE5VTEwsIDAsCiAJICAgICAgICAgICAgICAgdmlydF90b19waHlzKHNsb3RfZXJyYnVmKSwKIAkgICAgICAgICAgICAgICBlZWhfZXJyb3JfYnVmX3NpemUsCiAJICAgICAgICAgICAgICAgMSAvKiBUZW1wb3JhcnkgRXJyb3IgKi8pOwpAQCAtNjgwLDggKzY4NCw5IEBACiAJdTMyICpkZXZpY2VfaWQgPSAodTMyICopZ2V0X3Byb3BlcnR5KGRuLCAiZGV2aWNlLWlkIiwgTlVMTCk7CiAJdTMyICpyZWdzOwogCWludCBlbmFibGU7CisJc3RydWN0IHBjaV9kbiAqcGRuID0gZG4tPmRhdGE7CiAKLQlkbi0+ZWVoX21vZGUgPSAwOworCXBkbi0+ZWVoX21vZGUgPSAwOwogCiAJaWYgKHN0YXR1cyAmJiBzdHJjbXAoc3RhdHVzLCAib2siKSAhPSAwKQogCQlyZXR1cm4gTlVMTDsJLyogaWdub3JlIGRldmljZXMgd2l0aCBiYWQgc3RhdHVzICovCkBAIC02OTIsNyArNjk3LDcgQEAKIAogCS8qIFRoZXJlIGlzIG5vdGhpbmcgdG8gY2hlY2sgb24gUENJIHRvIElTQSBicmlkZ2VzICovCiAJaWYgKGRuLT50eXBlICYmICFzdHJjbXAoZG4tPnR5cGUsICJpc2EiKSkgewotCQlkbi0+ZWVoX21vZGUgfD0gRUVIX01PREVfTk9DSEVDSzsKKwkJcGRuLT5lZWhfbW9kZSB8PSBFRUhfTU9ERV9OT0NIRUNLOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTcwOSw3ICs3MTQsNyBAQAogCQllbmFibGUgPSAwOwogCiAJaWYgKCFlbmFibGUpCi0JCWRuLT5lZWhfbW9kZSB8PSBFRUhfTU9ERV9OT0NIRUNLOworCQlwZG4tPmVlaF9tb2RlIHw9IEVFSF9NT0RFX05PQ0hFQ0s7CiAKIAkvKiBPay4uLiBzZWUgaWYgdGhpcyBkZXZpY2Ugc3VwcG9ydHMgRUVILiAgU29tZSBkbywgc29tZSBkb24ndCwKIAkgKiBhbmQgdGhlIG9ubHkgd2F5IHRvIGZpbmQgb3V0IGlzIHRvIGNoZWNrIGVhY2ggYW5kIGV2ZXJ5IG9uZS4gKi8KQEAgLTcyMiw4ICs3MjcsOCBAQAogCQkJCUVFSF9FTkFCTEUpOwogCQlpZiAocmV0ID09IDApIHsKIAkJCWVlaF9zdWJzeXN0ZW1fZW5hYmxlZCA9IDE7Ci0JCQlkbi0+ZWVoX21vZGUgfD0gRUVIX01PREVfU1VQUE9SVEVEOwotCQkJZG4tPmVlaF9jb25maWdfYWRkciA9IHJlZ3NbMF07CisJCQlwZG4tPmVlaF9tb2RlIHw9IEVFSF9NT0RFX1NVUFBPUlRFRDsKKwkJCXBkbi0+ZWVoX2NvbmZpZ19hZGRyID0gcmVnc1swXTsKICNpZmRlZiBERUJVRwogCQkJcHJpbnRrKEtFUk5fREVCVUcgIkVFSDogJXM6IGVlaCBlbmFibGVkXG4iLCBkbi0+ZnVsbF9uYW1lKTsKICNlbmRpZgpAQCAtNzMxLDEwICs3MzYsMTEgQEAKIAogCQkJLyogVGhpcyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IEVFSCwgYnV0IGl0IG1heSBoYXZlIGFuCiAJCQkgKiBFRUggcGFyZW50LCBpbiB3aGljaCBjYXNlIHdlIG1hcmsgaXQgYXMgc3VwcG9ydGVkLiAqLwotCQkJaWYgKGRuLT5wYXJlbnQgJiYgKGRuLT5wYXJlbnQtPmVlaF9tb2RlICYgRUVIX01PREVfU1VQUE9SVEVEKSkgeworCQkJaWYgKGRuLT5wYXJlbnQgJiYgZG4tPnBhcmVudC0+ZGF0YQorCQkJICAgICYmIChQQ0lfRE4oZG4tPnBhcmVudCktPmVlaF9tb2RlICYgRUVIX01PREVfU1VQUE9SVEVEKSkgewogCQkJCS8qIFBhcmVudCBzdXBwb3J0cyBFRUguICovCi0JCQkJZG4tPmVlaF9tb2RlIHw9IEVFSF9NT0RFX1NVUFBPUlRFRDsKLQkJCQlkbi0+ZWVoX2NvbmZpZ19hZGRyID0gZG4tPnBhcmVudC0+ZWVoX2NvbmZpZ19hZGRyOworCQkJCXBkbi0+ZWVoX21vZGUgfD0gRUVIX01PREVfU1VQUE9SVEVEOworCQkJCXBkbi0+ZWVoX2NvbmZpZ19hZGRyID0gUENJX0ROKGRuLT5wYXJlbnQpLT5lZWhfY29uZmlnX2FkZHI7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9CiAJCX0KQEAgLTc5MSwxMSArNzk3LDEzIEBACiAJZm9yIChwaGIgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAicGNpIik7IHBoYjsKIAkgICAgIHBoYiA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKHBoYiwgInBjaSIpKSB7CiAJCXVuc2lnbmVkIGxvbmcgYnVpZDsKKwkJc3RydWN0IHBjaV9kbiAqcGNpOwogCiAJCWJ1aWQgPSBnZXRfcGhiX2J1aWQocGhiKTsKLQkJaWYgKGJ1aWQgPT0gMCkKKwkJaWYgKGJ1aWQgPT0gMCB8fCBwaGItPmRhdGEgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCisJCXBjaSA9IHBoYi0+ZGF0YTsKIAkJaW5mby5idWlkX2xvID0gQlVJRF9MTyhidWlkKTsKIAkJaW5mby5idWlkX2hpID0gQlVJRF9ISShidWlkKTsKIAkJdHJhdmVyc2VfcGNpX2RldmljZXMocGhiLCBlYXJseV9lbmFibGVfZWVoLCAmaW5mbyk7CkBAIC04MjQsOSArODMyLDkgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKIAlzdHJ1Y3QgZWVoX2Vhcmx5X2VuYWJsZV9pbmZvIGluZm87CiAKLQlpZiAoIWRuKQorCWlmICghZG4gfHwgIWRuLT5kYXRhKQogCQlyZXR1cm47Ci0JcGhiID0gZG4tPnBoYjsKKwlwaGIgPSBQQ0lfRE4oZG4pLT5waGI7CiAJaWYgKE5VTEwgPT0gcGhiIHx8IDAgPT0gcGhiLT5idWlkKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVFSDogRXhwZWN0ZWQgYnVpZCBidXQgZm91bmQgbm9uZVxuIik7CiAJCXJldHVybjsKQEAgLTg1MSw4ICs4NTksNyBAQAogCQlyZXR1cm47CiAKICNpZmRlZiBERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJFRUg6IGFkZGluZyBkZXZpY2UgJXMgJXNcbiIsIHBjaV9uYW1lKGRldiksCi0JICAgICAgIHBjaV9wcmV0dHlfbmFtZShkZXYpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiRUVIOiBhZGRpbmcgZGV2aWNlICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKICNlbmRpZgogCiAJcGNpX2FkZHJfY2FjaGVfaW5zZXJ0X2RldmljZSAoZGV2KTsKQEAgLTg3Myw4ICs4ODAsNyBAQAogCiAJLyogVW5yZWdpc3RlciB0aGUgZGV2aWNlIHdpdGggdGhlIEVFSC9QQ0kgYWRkcmVzcyBzZWFyY2ggc3lzdGVtICovCiAjaWZkZWYgREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiRUVIOiByZW1vdmUgZGV2aWNlICVzICVzXG4iLCBwY2lfbmFtZShkZXYpLAotCSAgICAgICBwY2lfcHJldHR5X25hbWUoZGV2KSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVFSDogcmVtb3ZlIGRldmljZSAlc1xuIiwgcGNpX25hbWUoZGV2KSk7CiAjZW5kaWYKIAlwY2lfYWRkcl9jYWNoZV9yZW1vdmVfZGV2aWNlKGRldik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9wcGM2NC9rZXJuZWwvZW50cnkuUwppbmRleCBiNjE1NzJlLi5kMTMzYTQ5IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2VudHJ5LlMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCkBAIC00MDAsMTUgKzQwMCwxNCBAQAogCWNtcGQJY3IxLHI2LHI5CS8qIG9yIGlzIG5ldyBFU0lEIHRoZSBzYW1lIGFzIGN1cnJlbnQgRVNJRD8gKi8KIAljcm9yCWVxLDQqY3IxK2VxLGVxCiAJYmVxCTJmCQkvKiBpZiB5ZXMsIGRvbid0IHNsYmllIGl0ICovCi0Jb3JpcwlyMCxyNiwweDA4MDAJLyogc2V0IEMgKGNsYXNzKSBiaXQgKi8KIAogCS8qIEJvbHQgaW4gdGhlIG5ldyBzdGFjayBTTEIgZW50cnkgKi8KIAlsZAlyNyxLU1BfVlNJRChyNCkJLyogR2V0IG5ldyBzdGFjaydzIFZTSUQgKi8KLQlvcmlzCXI2LHI2LChTTEJfRVNJRF9WKUBoCi0Jb3JpCXI2LHI2LChTTEJfTlVNX0JPTFRFRC0xKUBsCi0Jc2xiaWUJcjAKLQlzbGJpZQlyMAkJLyogV29ya2Fyb3VuZCBQT1dFUjUgPCBERDIuMSBpc3N1ZSAqLwotCXNsYm10ZQlyNyxyNgorCW9yaXMJcjAscjYsKFNMQl9FU0lEX1YpQGgKKwlvcmkJcjAscjAsKFNMQl9OVU1fQk9MVEVELTEpQGwKKwlzbGJpZQlyNgorCXNsYmllCXI2CQkvKiBXb3JrYXJvdW5kIFBPV0VSNSA8IEREMi4xIGlzc3VlICovCisJc2xibXRlCXI3LHIwCiAJaXN5bmMKIAogMjoKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2hlYWQuUyBiL2FyY2gvcHBjNjQva2VybmVsL2hlYWQuUwppbmRleCAwMzY5NTk3Li41OGMzMTQ3IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvaGVhZC5TCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW1jZmcuaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpAQCAtMTY0Niw4ICsxNjQ2LDkgQEAKICNlbHNlCiAJLyogc2V0IHRoZSBBU1IgKi8KIAlsZAlyMyxzeXN0ZW1jZmdAZ290KHIyKQkvKiByMyA9IHB0ciB0byBzeXN0ZW1jZmcJICovCisJbGQJcjMsMChyMykKIAlsd3oJcjMsUExBVEZPUk0ocjMpCQkvKiByMyA9IHBsYXRmb3JtIGZsYWdzCQkgKi8KLQljbXBsZGkgCXIzLFBMQVRGT1JNX1BTRVJJRVNfTFBBUgorCWFuZGkuCXIzLHIzLFBMQVRGT1JNX0xQQVIJLyogVGVzdCBpZiBiaXQgMCBpcyBzZXQgKExQQVIgYml0KSAqLwogCWJuZQk5OGYKIAltZnNwcglyMyxQVlIKIAlzcndpCXIzLHIzLDE2CkBAIC0xODA5LDggKzE4MTAsOSBAQAogCWxkCXIzLFBBQ0FTVEFCUkVBTChyMTMpCiAJb3JpCXI0LHIzLDEJCQkvKiB0dXJuIG9uIHZhbGlkIGJpdAkJICovCiAJbGQJcjMsc3lzdGVtY2ZnQGdvdChyMikJLyogcjMgPSBwdHIgdG8gc3lzdGVtY2ZnICovCisJbGQJcjMsMChyMykKIAlsd3oJcjMsUExBVEZPUk0ocjMpCQkvKiByMyA9IHBsYXRmb3JtIGZsYWdzICovCi0JY21wbGRpIAlyMyxQTEFURk9STV9QU0VSSUVTX0xQQVIKKwlhbmRpLglyMyxyMyxQTEFURk9STV9MUEFSCS8qIFRlc3QgaWYgYml0IDAgaXMgc2V0IChMUEFSIGJpdCkgKi8KIAlibmUJOThmCiAJbWZzcHIJcjMsUFZSCiAJc3J3aQlyMyxyMywxNgpAQCAtMTgyOCw5ICsxODMwLDEwIEBACiA5OToKIAkvKiBTZXQgU0RSMSAoaGFzaCB0YWJsZSBwb2ludGVyKSAqLwogCWxkCXIzLHN5c3RlbWNmZ0Bnb3QocjIpCS8qIHIzID0gcHRyIHRvIHN5c3RlbWNmZyAqLworCWxkCXIzLDAocjMpCiAJbHd6CXIzLFBMQVRGT1JNKHIzKQkJLyogcjMgPSBwbGF0Zm9ybSBmbGFncyAqLwogCS8qIFRlc3QgaWYgYml0IDAgaXMgc2V0IChMUEFSIGJpdCkgKi8KLQlhbmRpLglyMyxyMywweDEKKwlhbmRpLglyMyxyMyxQTEFURk9STV9MUEFSCiAJYm5lCTk4ZgogCUxPQURBRERSKHI2LF9TRFIxKQkJLyogT25seSBpZiBOT1QgTFBBUiAqLwogCXN1YglyNixyNixyMjYKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfVnBkSW5mby5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19WcGRJbmZvLmMKaW5kZXggZDExYzczMi4uNWQ5MjE3OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19WcGRJbmZvLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19WcGRJbmZvLmMKQEAgLTI2NCw4ICsyNjQsNSBAQAogCXByaW50aygiJWQuIFBDSTogQnVzJTNkLCBEZXZpY2UlM2QsIFZlbmRvciAlMDRYIEZyYW1lJTNkLCBDYXJkICU0cyAgIiwKIAkJCWNvdW50LCBidXMsIFBDSV9TTE9UKFBjaURldi0+ZGV2Zm4pLCBQY2lEZXYtPnZlbmRvciwKIAkJCWZyYW1lLCBjYXJkKTsKLQlpZiAocGNpX2NsYXNzX25hbWUoUGNpRGV2LT5jbGFzcyA+PiA4KSA9PSAwKQotCQlwcmludGsoIjB4JTA0WFxuIiwgKGludCkoUGNpRGV2LT5jbGFzcyA+PiA4KSk7Ci0JZWxzZQotCQlwcmludGsoIiVzXG4iLCBwY2lfY2xhc3NfbmFtZShQY2lEZXYtPmNsYXNzID4+IDgpKTsKKwlwcmludGsoIjB4JTA0WFxuIiwgKGludCkoUGNpRGV2LT5jbGFzcyA+PiA4KSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9pZGxlX3Bvd2VyNC5TIGIvYXJjaC9wcGM2NC9rZXJuZWwvaWRsZV9wb3dlcjQuUwppbmRleCA5N2U0YTI2Li5jYTAyYWZlIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9pZGxlX3Bvd2VyNC5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2lkbGVfcG93ZXI0LlMKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICN1bmRlZiBERUJVRwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9pb21hcC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvaW9tYXAuYwppbmRleCAxNTNjYzhiLi42MTYwYzhkIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9pb21hcC5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2lvbWFwLmMKQEAgLTIyLDEzICsyMiwyMyBAQAogewogCXJldHVybiByZWFkdyhhZGRyKTsKIH0KK3Vuc2lnbmVkIGludCBmYXN0Y2FsbCBpb3JlYWQxNmJlKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gaW5fYmUxNihhZGRyKTsKK30KIHVuc2lnbmVkIGludCBmYXN0Y2FsbCBpb3JlYWQzMih2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJcmV0dXJuIHJlYWRsKGFkZHIpOwogfQordW5zaWduZWQgaW50IGZhc3RjYWxsIGlvcmVhZDMyYmUodm9pZCBfX2lvbWVtICphZGRyKQoreworCXJldHVybiBpbl9iZTMyKGFkZHIpOworfQogRVhQT1JUX1NZTUJPTChpb3JlYWQ4KTsKIEVYUE9SVF9TWU1CT0woaW9yZWFkMTYpOworRVhQT1JUX1NZTUJPTChpb3JlYWQxNmJlKTsKIEVYUE9SVF9TWU1CT0woaW9yZWFkMzIpOworRVhQT1JUX1NZTUJPTChpb3JlYWQzMmJlKTsKIAogdm9pZCBmYXN0Y2FsbCBpb3dyaXRlOCh1OCB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKQEAgLTM4LDEzICs0OCwyMyBAQAogewogCXdyaXRldyh2YWwsIGFkZHIpOwogfQordm9pZCBmYXN0Y2FsbCBpb3dyaXRlMTZiZSh1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJb3V0X2JlMTYoYWRkciwgdmFsKTsKK30KIHZvaWQgZmFzdGNhbGwgaW93cml0ZTMyKHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAl3cml0ZWwodmFsLCBhZGRyKTsKIH0KK3ZvaWQgZmFzdGNhbGwgaW93cml0ZTMyYmUodTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCW91dF9iZTMyKGFkZHIsIHZhbCk7Cit9CiBFWFBPUlRfU1lNQk9MKGlvd3JpdGU4KTsKIEVYUE9SVF9TWU1CT0woaW93cml0ZTE2KTsKK0VYUE9SVF9TWU1CT0woaW93cml0ZTE2YmUpOwogRVhQT1JUX1NZTUJPTChpb3dyaXRlMzIpOworRVhQT1JUX1NZTUJPTChpb3dyaXRlMzJiZSk7CiAKIC8qCiAgKiBUaGVzZSBhcmUgdGhlICJyZXBlYXQgcmVhZC93cml0ZSIgZnVuY3Rpb25zLiBOb3RlIHRoZQpAQCAtNTYsMTUgKzc2LDE1IEBACiAgKi8KIHZvaWQgaW9yZWFkOF9yZXAodm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JX2luc2IoKHU4IF9fZm9yY2UgKikgYWRkciwgZHN0LCBjb3VudCk7CisJX2luc2IoKHU4IF9faW9tZW0gKikgYWRkciwgZHN0LCBjb3VudCk7CiB9CiB2b2lkIGlvcmVhZDE2X3JlcCh2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQlfaW5zd19ucygodTE2IF9fZm9yY2UgKikgYWRkciwgZHN0LCBjb3VudCk7CisJX2luc3dfbnMoKHUxNiBfX2lvbWVtICopIGFkZHIsIGRzdCwgY291bnQpOwogfQogdm9pZCBpb3JlYWQzMl9yZXAodm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JX2luc2xfbnMoKHUzMiBfX2ZvcmNlICopIGFkZHIsIGRzdCwgY291bnQpOworCV9pbnNsX25zKCh1MzIgX19pb21lbSAqKSBhZGRyLCBkc3QsIGNvdW50KTsKIH0KIEVYUE9SVF9TWU1CT0woaW9yZWFkOF9yZXApOwogRVhQT1JUX1NZTUJPTChpb3JlYWQxNl9yZXApOwpAQCAtNzIsMTUgKzkyLDE1IEBACiAKIHZvaWQgaW93cml0ZThfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCV9vdXRzYigodTggX19mb3JjZSAqKSBhZGRyLCBzcmMsIGNvdW50KTsKKwlfb3V0c2IoKHU4IF9faW9tZW0gKikgYWRkciwgc3JjLCBjb3VudCk7CiB9CiB2b2lkIGlvd3JpdGUxNl9yZXAodm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JX291dHN3X25zKCh1MTYgX19mb3JjZSAqKSBhZGRyLCBzcmMsIGNvdW50KTsKKwlfb3V0c3dfbnMoKHUxNiBfX2lvbWVtICopIGFkZHIsIHNyYywgY291bnQpOwogfQogdm9pZCBpb3dyaXRlMzJfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCV9vdXRzbF9ucygodTMyIF9fZm9yY2UgKikgYWRkciwgc3JjLCBjb3VudCk7CisJX291dHNsX25zKCh1MzIgX19pb21lbSAqKSBhZGRyLCBzcmMsIGNvdW50KTsKIH0KIEVYUE9SVF9TWU1CT0woaW93cml0ZThfcmVwKTsKIEVYUE9SVF9TWU1CT0woaW93cml0ZTE2X3JlcCk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9pb21tdS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvaW9tbXUuYwppbmRleCA4NDVlZWJkLi45MDMyYjZiIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9pb21tdS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2lvbW11LmMKQEAgLTQzOCw3ICs0MzgsOCBAQAogCiB2b2lkIGlvbW11X2ZyZWVfdGFibGUoc3RydWN0IGRldmljZV9ub2RlICpkbikKIHsKLQlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IGRuLT5pb21tdV90YWJsZTsKKwlzdHJ1Y3QgcGNpX2RuICpwZG4gPSBkbi0+ZGF0YTsKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IHBkbi0+aW9tbXVfdGFibGU7CiAJdW5zaWduZWQgbG9uZyBiaXRtYXBfc3osIGk7CiAJdW5zaWduZWQgaW50IG9yZGVyOwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggYTNkNTE5NS4uN2U4MGQ0OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2twcm9iZXMuYwpAQCAtNDQsNyArNDQsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcga3Byb2JlX3N0YXR1c19wcmV2LCBrcHJvYmVfc2F2ZWRfbXNyX3ByZXY7CiBzdGF0aWMgc3RydWN0IHB0X3JlZ3MganByb2JlX3NhdmVkX3JlZ3M7CiAKLWludCBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCitpbnQgX19rcHJvYmVzIGFyY2hfcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9ICpwLT5hZGRyOwpAQCAtNjgsMjcgKzY4LDI3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJbWVtY3B5KHAtPmFpbnNuLmluc24sIHAtPmFkZHIsIE1BWF9JTlNOX1NJWkUgKiBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CiAJcC0+b3Bjb2RlID0gKnAtPmFkZHI7CiB9CiAKLXZvaWQgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAkqcC0+YWRkciA9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT047CiAJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBwLT5hZGRyLAogCQkJICAgKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIgKyBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CiB9CiAKLXZvaWQgYXJjaF9kaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2Rpc2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAkqcC0+YWRkciA9IHAtPm9wY29kZTsKIAlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIsCiAJCQkgICAodW5zaWduZWQgbG9uZykgcC0+YWRkciArIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKIH0KIAotdm9pZCBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3ZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXVwKCZrcHJvYmVfbXV0ZXgpOwogCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24pOwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJcmVncy0+bXNyIHw9IE1TUl9TRTsKIAogCS8qIHNpbmdsZSBzdGVwIGlubGluZSBpZiBpdCBpcyBhIHRyYXAgdmFyaWFudCAqLwotCWlmIChJU19UVyhpbnNuKSB8fCBJU19URChpbnNuKSB8fCBJU19UV0koaW5zbikgfHwgSVNfVERJKGluc24pKQorCWlmIChpc190cmFwKGluc24pKQogCQlyZWdzLT5uaXAgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyOwogCWVsc2UKIAkJcmVncy0+bmlwID0gKHVuc2lnbmVkIGxvbmcpcC0+YWluc24uaW5zbjsKQEAgLTEyMiw3ICsxMjIsOCBAQAogCWtwcm9iZV9zYXZlZF9tc3IgPSBrcHJvYmVfc2F2ZWRfbXNyX3ByZXY7CiB9CiAKLXZvaWQgYXJjaF9wcmVwYXJlX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit2b2lkIF9fa3Byb2JlcyBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwogCkBAIC0xNTEsNyArMTUyLDkgQEAKIAkJICAgRGlzYXJtIHRoZSBwcm9iZSB3ZSBqdXN0IGhpdCwgYW5kIGlnbm9yZSBpdC4gKi8KIAkJcCA9IGdldF9rcHJvYmUoYWRkcik7CiAJCWlmIChwKSB7Ci0JCQlpZiAoa3Byb2JlX3N0YXR1cyA9PSBLUFJPQkVfSElUX1NTKSB7CisJCQlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9ICpwLT5haW5zbi5pbnNuOworCQkJaWYgKGtwcm9iZV9zdGF0dXMgPT0gS1BST0JFX0hJVF9TUyAmJgorCQkJCQlpc190cmFwKGluc24pKSB7CiAJCQkJcmVncy0+bXNyICY9IH5NU1JfU0U7CiAJCQkJcmVncy0+bXNyIHw9IGtwcm9iZV9zYXZlZF9tc3I7CiAJCQkJdW5sb2NrX2twcm9iZXMoKTsKQEAgLTE5MSw4ICsxOTQsNyBAQAogCQkJICogdHJhcCB2YXJpYW50LCBpdCBjb3VsZCBiZWxvbmcgdG8gc29tZW9uZSBlbHNlCiAJCQkgKi8KIAkJCWtwcm9iZV9vcGNvZGVfdCBjdXJfaW5zbiA9ICphZGRyOwotCQkJaWYgKElTX1RXKGN1cl9pbnNuKSB8fCBJU19URChjdXJfaW5zbikgfHwKLQkJCQkJSVNfVFdJKGN1cl9pbnNuKSB8fCBJU19UREkoY3VyX2luc24pKQorCQkJaWYgKGlzX3RyYXAoY3VyX2luc24pKQogCQkgICAgICAgCQlnb3RvIG5vX2twcm9iZTsKIAkJCS8qCiAJCQkgKiBUaGUgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB3YXMgcmVtb3ZlZCByaWdodApAQCAtMjQ0LDcgKzI0Niw3IEBACiAvKgogICogQ2FsbGVkIHdoZW4gdGhlIHByb2JlIGF0IGtyZXRwcm9iZSB0cmFtcG9saW5lIGlzIGhpdAogICovCi1pbnQgdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IF9fa3Byb2JlcyB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAgICAgICAgIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpID0gTlVMTDsKICAgICAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CkBAIC0zMDgsNyArMzEwLDcgQEAKICAqIHNpbmdsZS1zdGVwcGVkIGEgY29weSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgYWRkcmVzcyBvZiB0aGlzCiAgKiBjb3B5IGlzIHAtPmFpbnNuLmluc24uCiAgKi8KLXN0YXRpYyB2b2lkIHJlc3VtZV9leGVjdXRpb24oc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgcmVzdW1lX2V4ZWN1dGlvbihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGludCBpbnNuID0gKnAtPmFpbnNuLmluc247CkBAIC0zNzMsOCArMzc1LDggQEAKIC8qCiAgKiBXcmFwcGVyIHJvdXRpbmUgdG8gZm9yIGhhbmRsaW5nIGV4Y2VwdGlvbnMuCiAgKi8KLWludCBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIHZhbCwKLQkJCSAgICAgdm9pZCAqZGF0YSkKK2ludCBfX2twcm9iZXMga3Byb2JlX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGRpZV9hcmdzICphcmdzID0gKHN0cnVjdCBkaWVfYXJncyAqKWRhdGE7CiAJaW50IHJldCA9IE5PVElGWV9ET05FOwpAQCAtNDAyLDExICs0MDQsMTEgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0JcHJlZW1wdF9lbmFibGUoKTsKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHNldGptcF9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBqcHJvYmUgKmpwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBqcHJvYmUsIGtwKTsKIApAQCAtNDE5LDE2ICs0MjEsMTYgQEAKIAlyZXR1cm4gMTsKIH0KIAotdm9pZCBqcHJvYmVfcmV0dXJuKHZvaWQpCit2b2lkIF9fa3Byb2JlcyBqcHJvYmVfcmV0dXJuKHZvaWQpCiB7CiAJYXNtIHZvbGF0aWxlKCJ0cmFwIiA6OjogIm1lbW9yeSIpOwogfQogCi12b2lkIGpwcm9iZV9yZXR1cm5fZW5kKHZvaWQpCit2b2lkIF9fa3Byb2JlcyBqcHJvYmVfcmV0dXJuX2VuZCh2b2lkKQogewogfTsKIAotaW50IGxvbmdqbXBfYnJlYWtfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgbG9uZ2ptcF9icmVha19oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCS8qCiAJICogRklYTUUgLSB3ZSBzaG91bGQgaWRlYWxseSBiZSB2YWxpZGF0aW5nIHRoYXQgd2UgZ290IGhlcmUgJ2NvcwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvbHBhcmNmZy5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvbHBhcmNmZy5jCmluZGV4IGVkYWQzNjEuLmNhZTE5YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2xwYXJjZmcuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9scGFyY2ZnLmMKQEAgLTU2OSw3ICs1NjksNyBAQAogaW50IF9faW5pdCBscGFyY2ZnX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKLQltb2RlX3QgbW9kZSA9IFNfSVJVU1I7CisJbW9kZV90IG1vZGUgPSBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7CiAKIAkvKiBBbGxvdyB3cml0aW5nIGlmIHdlIGhhdmUgRldfRkVBVFVSRV9TUExQQVIgKi8KIAlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9TUExQQVIpKSB7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9tYXBsZV9wY2kuYyBiL2FyY2gvcHBjNjQva2VybmVsL21hcGxlX3BjaS5jCmluZGV4IDUzOTkzOTkuLjVhOGI0ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL21hcGxlX3BjaS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL21hcGxlX3BjaS5jCkBAIC00NDcsOSArNDQ3LDkgQEAKIAkgKi8KIAlpZiAodTNfYWdwKSB7CiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSB1M19hZ3AtPmFyY2hfZGF0YTsKLQkJbnAtPmJ1c25vID0gMHhmMDsKKwkJUENJX0ROKG5wKS0+YnVzbm8gPSAweGYwOwogCQlmb3IgKG5wID0gbnAtPmNoaWxkOyBucDsgbnAgPSBucC0+c2libGluZykKLQkJCW5wLT5idXNubyA9IDB4ZjA7CisJCQlQQ0lfRE4obnApLT5idXNubyA9IDB4ZjA7CiAJfQogCiAJLyogVGVsbCBwY2kuYyB0byB1c2UgdGhlIGNvbW1vbiByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2FuaXNtICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9tYXBsZV9zZXR1cC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvbWFwbGVfc2V0dXAuYwppbmRleCBiYjU1YjVhLi5mYzA1Njc0IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9tYXBsZV9zZXR1cC5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL21hcGxlX3NldHVwLmMKQEAgLTIwNyw5ICsyMDcsNiBAQAogCQljb21wb3J0ID0gKHZvaWQgKilpb3JlbWFwKHBoeXNwb3J0LCAxNik7CiAJCXVkYmdfaW5pdF91YXJ0KGNvbXBvcnQsIGRlZmF1bHRfc3BlZWQpOwogCi0JCXBwY19tZC51ZGJnX3B1dGMgPSB1ZGJnX3B1dGM7Ci0JCXBwY19tZC51ZGJnX2dldGMgPSB1ZGJnX2dldGM7Ci0JCXBwY19tZC51ZGJnX2dldGNfcG9sbCA9IHVkYmdfZ2V0Y19wb2xsOwogCQlEQkcoIkhlbGxvIFdvcmxkICFcbiIpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvbWlzYy5TIGIvYXJjaC9wcGM2NC9rZXJuZWwvbWlzYy5TCmluZGV4IDQ3NGRmMGEuLmU3MjQxYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL21pc2MuUworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9taXNjLlMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KIAogCS50ZXh0CkBAIC0xODMsNyArMTgzLDcgQEAKICAqICAgZmx1c2ggYWxsIGJ5dGVzIGZyb20gc3RhcnQgdGhyb3VnaCBzdG9wLTEgaW5jbHVzaXZlCiAgKi8KIAotX0dMT0JBTChfX2ZsdXNoX2ljYWNoZV9yYW5nZSkKK19LUFJPQkUoX19mbHVzaF9pY2FjaGVfcmFuZ2UpCiAKIC8qCiAgKiBGbHVzaCB0aGUgZGF0YSBjYWNoZSB0byBtZW1vcnkgCkBAIC0yMjMsNyArMjIzLDcgQEAKIAliZG56CTJiCiAJaXN5bmMKIAlibHIKLQkKKwkucHJldmlvdXMgLnRleHQKIC8qCiAgKiBMaWtlIGFib3ZlLCBidXQgb25seSBkbyB0aGUgRC1jYWNoZS4KICAqCkBAIC05NTcsNyArOTU3LDcgQEAKIAkubGxvbmcgLnBwY19mb3JrCiAJLmxsb25nIC5zeXNfcmVhZAogCS5sbG9uZyAuc3lzX3dyaXRlCi0JLmxsb25nIC5zeXMzMl9vcGVuCQkvKiA1ICovCisJLmxsb25nIC5jb21wYXRfc3lzX29wZW4JCS8qIDUgKi8KIAkubGxvbmcgLnN5c19jbG9zZQogCS5sbG9uZyAuc3lzMzJfd2FpdHBpZAogCS5sbG9uZyAuc3lzMzJfY3JlYXQKQEAgLTE0MzEsOSArMTQzMSw5IEBACiAJLmxsb25nIC5zeXNfbmlfc3lzY2FsbAkJLyogMTk1IC0gMzJiaXQgb25seSBzdGF0NjQgKi8KIAkubGxvbmcgLnN5c19uaV9zeXNjYWxsCQkvKiAzMmJpdCBvbmx5IGxzdGF0NjQgKi8KIAkubGxvbmcgLnN5c19uaV9zeXNjYWxsCQkvKiAzMmJpdCBvbmx5IGZzdGF0NjQgKi8KLQkubGxvbmcgLnN5c19uaV9zeXNjYWxsCQkvKiAzMmJpdCBvbmx5IHBjaWNvbmZpZ19yZWFkICovCi0JLmxsb25nIC5zeXNfbmlfc3lzY2FsbAkJLyogMzJiaXQgb25seSBwY2ljb25maWdfd3JpdGUgKi8KLQkubGxvbmcgLnN5c19uaV9zeXNjYWxsCQkvKiAzMmJpdCBvbmx5IHBjaWNvbmZpZ19pb2Jhc2UgKi8KKwkubGxvbmcgLnN5c19wY2ljb25maWdfcmVhZAorCS5sbG9uZyAuc3lzX3BjaWNvbmZpZ193cml0ZQorCS5sbG9uZyAuc3lzX3BjaWNvbmZpZ19pb2Jhc2UJLyogMjAwIC0gcGNpY29uZmlnX2lvYmFzZSAqLwogCS5sbG9uZyAuc3lzX25pX3N5c2NhbGwJCS8qIHJlc2VydmVkIGZvciBNYWNPbkxpbnV4ICovCiAJLmxsb25nIC5zeXNfZ2V0ZGVudHM2NAogCS5sbG9uZyAuc3lzX3Bpdm90X3Jvb3QKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfaW9tbXUuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfaW9tbXUuYwppbmRleCA5ZDVlMWU3Li5mMGZkN2ZiIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX2lvbW11LmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19pb21tdS5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIAkJCQkgICAgICBzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRtYV93aW5kb3cpCiB7Ci0JdGJsLT5pdF9idXNubyAgPSBkbi0+YnVzc3Vibm87CisJdGJsLT5pdF9idXNubyAgPSBQQ0lfRE4oZG4pLT5idXNzdWJubzsKIAogCS8qIFRPRE86IFBhcnNlIGZpZWxkIHNpemUgcHJvcGVydGllcyBwcm9wZXJseS4gKi8KIAl0YmwtPml0X3NpemUgICA9ICgoKHVuc2lnbmVkIGxvbmcpZG1hX3dpbmRvd1s0XSA8PCAzMikgfApAQCAtMzExLDYgKzMxMSw3IEBACiBzdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfcFNlcmllcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sICpwZG47CisJc3RydWN0IHBjaV9kbiAqcGNpOwogCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCiAJREJHKCJpb21tdV9idXNfc2V0dXBfcFNlcmllcywgYnVzICVwLCBidXMtPnNlbGYgJXBcbiIsIGJ1cywgYnVzLT5zZWxmKTsKQEAgLTMyNSw2ICszMjYsNyBAQAogCSAqLwogCiAJZG4gPSBwY2lfYnVzX3RvX09GX25vZGUoYnVzKTsKKwlwY2kgPSBkbi0+ZGF0YTsKIAogCWlmICghYnVzLT5zZWxmKSB7CiAJCS8qIFJvb3QgYnVzICovCkBAIC0zNDEsMTggKzM0MywxOCBAQAogCQkJCSAqIGFsbHRvZ2V0aGVyLiBUaGlzIGxlYXZlcyA3NjhNQiBmb3IgdGhlIHdpbmRvdy4KIAkJCQkgKi8KIAkJCQlEQkcoIlBIQiBoYXMgaW8taG9sZSwgcmVzZXJ2aW5nIDI1Nk1CXG4iKTsKLQkJCQlkbi0+cGhiLT5kbWFfd2luZG93X3NpemUgPSAzIDw8IDI4OwotCQkJCWRuLT5waGItPmRtYV93aW5kb3dfYmFzZV9jdXIgPSAxIDw8IDI4OworCQkJCXBjaS0+cGhiLT5kbWFfd2luZG93X3NpemUgPSAzIDw8IDI4OworCQkJCXBjaS0+cGhiLT5kbWFfd2luZG93X2Jhc2VfY3VyID0gMSA8PCAyODsKIAkJCX0gZWxzZSB7CiAJCQkJLyogMUdCIHdpbmRvdyBieSBkZWZhdWx0ICovCi0JCQkJZG4tPnBoYi0+ZG1hX3dpbmRvd19zaXplID0gMSA8PCAzMDsKLQkJCQlkbi0+cGhiLT5kbWFfd2luZG93X2Jhc2VfY3VyID0gMDsKKwkJCQlwY2ktPnBoYi0+ZG1hX3dpbmRvd19zaXplID0gMSA8PCAzMDsKKwkJCQlwY2ktPnBoYi0+ZG1hX3dpbmRvd19iYXNlX2N1ciA9IDA7CiAJCQl9CiAKIAkJCXRibCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksIEdGUF9LRVJORUwpOwogCi0JCQlpb21tdV90YWJsZV9zZXRwYXJtcyhkbi0+cGhiLCBkbiwgdGJsKTsKLQkJCWRuLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsKTsKKwkJCWlvbW11X3RhYmxlX3NldHBhcm1zKHBjaS0+cGhiLCBkbiwgdGJsKTsKKwkJCXBjaS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCk7CiAJCX0gZWxzZSB7CiAJCQkvKiBEbyBhIDEyOE1CIHRhYmxlIGF0IHJvb3QuIFRoaXMgaXMgdXNlZCBmb3IgdGhlIElERQogCQkJICogY29udHJvbGxlciBvbiBzb21lIFNNUC1tb2RlIFBPV0VSNCBtYWNoaW5lcy4gSXQKQEAgLTM2MywxNiArMzY1LDE2IEBACiAJCQkgKiBBbGxvY2F0ZSBhdCBvZmZzZXQgMTI4TUIgdG8gYXZvaWQgaGF2aW5nIHRvIGRlYWwKIAkJCSAqIHdpdGggSVNBIGhvbGVzOyAxMjhNQiB0YWJsZSBmb3IgSURFIGlzIHBsZW50eS4KIAkJCSAqLwotCQkJZG4tPnBoYi0+ZG1hX3dpbmRvd19zaXplID0gMSA8PCAyNzsKLQkJCWRuLT5waGItPmRtYV93aW5kb3dfYmFzZV9jdXIgPSAxIDw8IDI3OworCQkJcGNpLT5waGItPmRtYV93aW5kb3dfc2l6ZSA9IDEgPDwgMjc7CisJCQlwY2ktPnBoYi0+ZG1hX3dpbmRvd19iYXNlX2N1ciA9IDEgPDwgMjc7CiAKIAkJCXRibCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksIEdGUF9LRVJORUwpOwogCi0JCQlpb21tdV90YWJsZV9zZXRwYXJtcyhkbi0+cGhiLCBkbiwgdGJsKTsKLQkJCWRuLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsKTsKKwkJCWlvbW11X3RhYmxlX3NldHBhcm1zKHBjaS0+cGhiLCBkbiwgdGJsKTsKKwkJCXBjaS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCk7CiAKIAkJCS8qIEFsbCBjaGlsZCBidXNlcyBoYXZlIDI1Nk1CIHRhYmxlcyAqLwotCQkJZG4tPnBoYi0+ZG1hX3dpbmRvd19zaXplID0gMSA8PCAyODsKKwkJCXBjaS0+cGhiLT5kbWFfd2luZG93X3NpemUgPSAxIDw8IDI4OwogCQl9CiAJfSBlbHNlIHsKIAkJcGRuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cy0+cGFyZW50KTsKQEAgLTM4NiwxMiArMzg4LDEyIEBACiAKIAkJCXRibCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksIEdGUF9LRVJORUwpOwogCi0JCQlpb21tdV90YWJsZV9zZXRwYXJtcyhkbi0+cGhiLCBkbiwgdGJsKTsKKwkJCWlvbW11X3RhYmxlX3NldHBhcm1zKHBjaS0+cGhiLCBkbiwgdGJsKTsKIAotCQkJZG4tPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwpOworCQkJcGNpLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsKTsKIAkJfSBlbHNlIHsKIAkJCS8qIExvd2VyIHRoYW4gZmlyc3QgY2hpbGQgb3IgdW5kZXIgcHl0aG9uLCB1c2UgcGFyZW50IHRhYmxlICovCi0JCQlkbi0+aW9tbXVfdGFibGUgPSBwZG4tPmlvbW11X3RhYmxlOworCQkJcGNpLT5pb21tdV90YWJsZSA9IFBDSV9ETihwZG4pLT5pb21tdV90YWJsZTsKIAkJfQogCX0KIH0KQEAgLTQwMSw2ICs0MDMsNyBAQAogewogCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sICpwZG47CisJc3RydWN0IHBjaV9kbiAqcHBjaTsKIAl1bnNpZ25lZCBpbnQgKmRtYV93aW5kb3cgPSBOVUxMOwogCiAJREJHKCJpb21tdV9idXNfc2V0dXBfcFNlcmllc0xQLCBidXMgJXAsIGJ1cy0+c2VsZiAlcFxuIiwgYnVzLCBidXMtPnNlbGYpOwpAQCAtNDE5LDIyICs0MjIsMjQgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICghcGRuLT5pb21tdV90YWJsZSkgeworCXBwY2kgPSBwZG4tPmRhdGE7CisJaWYgKCFwcGNpLT5pb21tdV90YWJsZSkgewogCQkvKiBCdXNzdWJubyBoYXNuJ3QgYmVlbiBjb3BpZWQgeWV0LgogCQkgKiBEbyBpdCBub3cgYmVjYXVzZSBpb21tdV90YWJsZV9zZXRwYXJtc19scGFyIG5lZWRzIGl0LgogCQkgKi8KLQkJcGRuLT5idXNzdWJubyA9IGJ1cy0+bnVtYmVyOworCisJCXBwY2ktPmJ1c3N1Ym5vID0gYnVzLT5udW1iZXI7CiAKIAkJdGJsID0gKHN0cnVjdCBpb21tdV90YWJsZSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksCiAJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCi0JCWlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIocGRuLT5waGIsIHBkbiwgdGJsLCBkbWFfd2luZG93KTsKKwkJaW9tbXVfdGFibGVfc2V0cGFybXNfbHBhcihwcGNpLT5waGIsIHBkbiwgdGJsLCBkbWFfd2luZG93KTsKIAotCQlwZG4tPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwpOworCQlwcGNpLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsKTsKIAl9CiAKIAlpZiAocGRuICE9IGRuKQotCQlkbi0+aW9tbXVfdGFibGUgPSBwZG4tPmlvbW11X3RhYmxlOworCQlQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9IHBwY2ktPmlvbW11X3RhYmxlOwogfQogCiAKQEAgLTQ0OSwxMSArNDU0LDExIEBACiAJICovCiAJbXlkbiA9IGRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldik7CiAKLQl3aGlsZSAoZG4gJiYgZG4tPmlvbW11X3RhYmxlID09IE5VTEwpCisJd2hpbGUgKGRuICYmIGRuLT5kYXRhICYmIFBDSV9ETihkbiktPmlvbW11X3RhYmxlID09IE5VTEwpCiAJCWRuID0gZG4tPnBhcmVudDsKIAotCWlmIChkbikgewotCQlteWRuLT5pb21tdV90YWJsZSA9IGRuLT5pb21tdV90YWJsZTsKKwlpZiAoZG4gJiYgZG4tPmRhdGEpIHsKKwkJUENJX0ROKG15ZG4pLT5pb21tdV90YWJsZSA9IFBDSV9ETihkbiktPmlvbW11X3RhYmxlOwogCX0gZWxzZSB7CiAJCURCRygiaW9tbXVfZGV2X3NldHVwX3BTZXJpZXMsIGRldiAlcCAoJXMpIGhhcyBubyBpb21tdSB0YWJsZVxuIiwgZGV2LCBkZXYtPnByZXR0eV9uYW1lKTsKIAl9CkBAIC00NjMsMTAgKzQ2OCwxMSBAQAogewogCWludCBlcnIgPSBOT1RJRllfT0s7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IG5vZGU7CisJc3RydWN0IHBjaV9kbiAqcGNpID0gbnAtPmRhdGE7CiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgUFNFUklFU19SRUNPTkZJR19SRU1PVkU6Ci0JCWlmIChucC0+aW9tbXVfdGFibGUgJiYKKwkJaWYgKHBjaS0+aW9tbXVfdGFibGUgJiYKIAkJICAgIGdldF9wcm9wZXJ0eShucCwgImlibSxkbWEtd2luZG93IiwgTlVMTCkpCiAJCQlpb21tdV9mcmVlX3RhYmxlKG5wKTsKIAkJYnJlYWs7CkBAIC00ODYsNiArNDkyLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBkbiwgKmRuOwogCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCWludCAqZG1hX3dpbmRvdyA9IE5VTEw7CisJc3RydWN0IHBjaV9kbiAqcGNpOwogCiAJREJHKCJpb21tdV9kZXZfc2V0dXBfcFNlcmllc0xQLCBkZXYgJXAgKCVzKVxuIiwgZGV2LCBkZXYtPnByZXR0eV9uYW1lKTsKIApAQCAtNDk3LDggKzUwNCwxMCBAQAogCSAqLwogCWRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldik7CiAKLQlmb3IgKHBkbiA9IGRuOyBwZG4gJiYgIXBkbi0+aW9tbXVfdGFibGU7IHBkbiA9IHBkbi0+cGFyZW50KSB7Ci0JCWRtYV93aW5kb3cgPSAodW5zaWduZWQgaW50ICopZ2V0X3Byb3BlcnR5KHBkbiwgImlibSxkbWEtd2luZG93IiwgTlVMTCk7CisJZm9yIChwZG4gPSBkbjsgcGRuICYmIHBkbi0+ZGF0YSAmJiAhUENJX0ROKHBkbiktPmlvbW11X3RhYmxlOworCSAgICAgcGRuID0gcGRuLT5wYXJlbnQpIHsKKwkJZG1hX3dpbmRvdyA9ICh1bnNpZ25lZCBpbnQgKikKKwkJCWdldF9wcm9wZXJ0eShwZG4sICJpYm0sZG1hLXdpbmRvdyIsIE5VTEwpOwogCQlpZiAoZG1hX3dpbmRvdykKIAkJCWJyZWFrOwogCX0KQEAgLTUxNSwyMCArNTI0LDIxIEBACiAJCURCRygiRm91bmQgRE1BIHdpbmRvdywgYWxsb2NhdGluZyB0YWJsZVxuIik7CiAJfQogCi0JaWYgKCFwZG4tPmlvbW11X3RhYmxlKSB7CisJcGNpID0gcGRuLT5kYXRhOworCWlmICghcGNpLT5pb21tdV90YWJsZSkgewogCQkvKiBpb21tdV90YWJsZV9zZXRwYXJtc19scGFyIG5lZWRzIGJ1c3N1Ym5vLiAqLwotCQlwZG4tPmJ1c3N1Ym5vID0gcGRuLT5waGItPmJ1cy0+bnVtYmVyOworCQlwY2ktPmJ1c3N1Ym5vID0gcGNpLT5waGItPmJ1cy0+bnVtYmVyOwogCiAJCXRibCA9IChzdHJ1Y3QgaW9tbXVfdGFibGUgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXVfdGFibGUpLAogCQkJCQkJICAgIEdGUF9LRVJORUwpOwogCi0JCWlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIocGRuLT5waGIsIHBkbiwgdGJsLCBkbWFfd2luZG93KTsKKwkJaW9tbXVfdGFibGVfc2V0cGFybXNfbHBhcihwY2ktPnBoYiwgcGRuLCB0YmwsIGRtYV93aW5kb3cpOwogCi0JCXBkbi0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCk7CisJCXBjaS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCk7CiAJfQogCiAJaWYgKHBkbiAhPSBkbikKLQkJZG4tPmlvbW11X3RhYmxlID0gcGRuLT5pb21tdV90YWJsZTsKKwkJUENJX0ROKGRuKS0+aW9tbXVfdGFibGUgPSBwY2ktPmlvbW11X3RhYmxlOwogfQogCiBzdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfbnVsbChzdHJ1Y3QgcGNpX2J1cyAqYikgeyB9CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX2xwYXIuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfbHBhci5jCmluZGV4IDBhM2RkYzkuLmE2ZGU4M2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfbHBhci5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfbHBhci5jCkBAIC0xOTIsOSArMTkyLDkgQEAKIHZvaWQgdWRiZ19pbml0X2RlYnVnX2xwYXIodm9pZCkKIHsKIAl2dGVybW5vID0gMDsKLQlwcGNfbWQudWRiZ19wdXRjID0gdWRiZ19wdXRjTFA7Ci0JcHBjX21kLnVkYmdfZ2V0YyA9IHVkYmdfZ2V0Y0xQOwotCXBwY19tZC51ZGJnX2dldGNfcG9sbCA9IHVkYmdfZ2V0Y19wb2xsTFA7CisJdWRiZ19wdXRjID0gdWRiZ19wdXRjTFA7CisJdWRiZ19nZXRjID0gdWRiZ19nZXRjTFA7CisJdWRiZ19nZXRjX3BvbGwgPSB1ZGJnX2dldGNfcG9sbExQOwogfQogCiAvKiByZXR1cm5zIDAgaWYgY291bGRuJ3QgZmluZCBvciB1c2UgL2Nob3Nlbi9zdGRvdXQgYXMgY29uc29sZSAqLwpAQCAtMjI3LDE4ICsyMjcsMTggQEAKIAkJCXRlcm1ubyA9ICh1MzIgKilnZXRfcHJvcGVydHkoc3Rkb3V0X25vZGUsICJyZWciLCBOVUxMKTsKIAkJCWlmICh0ZXJtbm8pIHsKIAkJCQl2dGVybW5vID0gdGVybW5vWzBdOwotCQkJCXBwY19tZC51ZGJnX3B1dGMgPSB1ZGJnX3B1dGNMUDsKLQkJCQlwcGNfbWQudWRiZ19nZXRjID0gdWRiZ19nZXRjTFA7Ci0JCQkJcHBjX21kLnVkYmdfZ2V0Y19wb2xsID0gdWRiZ19nZXRjX3BvbGxMUDsKKwkJCQl1ZGJnX3B1dGMgPSB1ZGJnX3B1dGNMUDsKKwkJCQl1ZGJnX2dldGMgPSB1ZGJnX2dldGNMUDsKKwkJCQl1ZGJnX2dldGNfcG9sbCA9IHVkYmdfZ2V0Y19wb2xsTFA7CiAJCQkJZm91bmQgPSAxOwogCQkJfQogCQl9IGVsc2UgaWYgKGRldmljZV9pc19jb21wYXRpYmxlKHN0ZG91dF9ub2RlLCAiaHZ0ZXJtLXByb3RvY29sIikpIHsKIAkJCXRlcm1ubyA9ICh1MzIgKilnZXRfcHJvcGVydHkoc3Rkb3V0X25vZGUsICJyZWciLCBOVUxMKTsKIAkJCWlmICh0ZXJtbm8pIHsKIAkJCQl2dGVybW5vID0gdGVybW5vWzBdOwotCQkJCXBwY19tZC51ZGJnX3B1dGMgPSB1ZGJnX2h2c2lfcHV0YzsKLQkJCQlwcGNfbWQudWRiZ19nZXRjID0gdWRiZ19odnNpX2dldGM7Ci0JCQkJcHBjX21kLnVkYmdfZ2V0Y19wb2xsID0gdWRiZ19odnNpX2dldGNfcG9sbDsKKwkJCQl1ZGJnX3B1dGMgPSB1ZGJnX2h2c2lfcHV0YzsKKwkJCQl1ZGJnX2dldGMgPSB1ZGJnX2h2c2lfZ2V0YzsKKwkJCQl1ZGJnX2dldGNfcG9sbCA9IHVkYmdfaHZzaV9nZXRjX3BvbGw7CiAJCQkJZm91bmQgPSAxOwogCQkJfQogCQl9CkBAIC0yNjYsNiArMjY2LDEwIEBACiAKIAkvKiBSZWdpc3RlciB0aGUgVmlydHVhbCBQcm9jZXNzb3IgQXJlYSAoVlBBKSAqLwogCWZsYWdzID0gMVVMIDw8ICg2MyAtIDE4KTsKKworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BTFRJVkVDKSkKKwkJcGFjYVtjcHVdLmxwcGFjYS52bXhyZWdzX2luX3VzZSA9IDE7CisKIAlyZXQgPSByZWdpc3Rlcl92cGEoZmxhZ3MsIGh3Y3B1LCBfX3BhKHZwYSkpOwogCiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfcmVjb25maWcuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfcmVjb25maWcuYwppbmRleCBkYzJhNjlkLi41OGM2MTIxIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX3JlY29uZmlnLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19yZWNvbmZpZy5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCWludCBlcnIgPSAtRU5PTUVNOwogCi0JbnAgPSBrY2FsbG9jKDEsIHNpemVvZigqbnApLCBHRlBfS0VSTkVMKTsKKwlucCA9IGt6YWxsb2Moc2l6ZW9mKCpucCksIEdGUF9LRVJORUwpOwogCWlmICghbnApCiAJCWdvdG8gb3V0X2VycjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19zZXR1cC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19zZXR1cC5jCmluZGV4IGYwZjA2MzAuLjk0OTBiNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfc2V0dXAuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX3NldHVwLmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9hZGIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMjcyLDcgKzI3Miw3IEBACiB7CiAJLyogTWFudWFsbHkgbGVhdmUgdGhlIGtlcm5lbCB2ZXJzaW9uIG9uIHRoZSBwYW5lbC4gKi8KIAlwcGNfbWQucHJvZ3Jlc3MoIkxpbnV4IHBwYzY0XG4iLCAwKTsKLQlwcGNfbWQucHJvZ3Jlc3MoVVRTX1JFTEVBU0UsIDApOworCXBwY19tZC5wcm9ncmVzcyhzeXN0ZW1fdXRzbmFtZS52ZXJzaW9uLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzk3LDkgKzM5Nyw2IEBACiAJCWNvbXBvcnQgPSAodm9pZCAqKWlvcmVtYXAocGh5c3BvcnQsIDE2KTsKIAkJdWRiZ19pbml0X3VhcnQoY29tcG9ydCwgZGVmYXVsdF9zcGVlZCk7CiAKLQkJcHBjX21kLnVkYmdfcHV0YyA9IHVkYmdfcHV0YzsKLQkJcHBjX21kLnVkYmdfZ2V0YyA9IHVkYmdfZ2V0YzsKLQkJcHBjX21kLnVkYmdfZ2V0Y19wb2xsID0gdWRiZ19nZXRjX3BvbGw7CiAJCURCRygiSGVsbG8gV29ybGQgIVxuIik7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wYWNhRGF0YS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcGFjYURhdGEuYwppbmRleCA2MTgyYTJjLi4zM2EyZDhkIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wYWNhRGF0YS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BhY2FEYXRhLmMKQEAgLTU5LDYgKzU5LDcgQEAKIAkJLmZwcmVnc19pbl91c2UgPSAxLAkJCQkJICAgIFwKIAkJLmVuZF9vZl9xdWFudHVtID0gMHhmZmZmZmZmZmZmZmZmZmZmdWwsCQkJICAgIFwKIAkJLnNsYl9jb3VudCA9IDY0LAkJCQkJICAgIFwKKwkJLnZteHJlZ3NfaW5fdXNlID0gMCwJCQkJCSAgICBcCiAJfSwJCQkJCQkJCSAgICBcCiAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BjaS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcGNpLmMKaW5kZXggZDBkNTVjNy4uODQ0N2RjYyAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcGNpLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTg0LDcgKzg1LDYgQEAKIAlpZiAoKGRldi0+Y2xhc3M+PjggPT0gUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQpKSB7CiAJCWRldi0+dmVuZG9yID0gUENJX1ZFTkRPUl9JRF9BTUQ7CiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9WRU5ET1JfSUQsIFBDSV9WRU5ET1JfSURfQU1EKTsKLQkJcGNpX25hbWVfZGV2aWNlKGRldik7CiAJfQogfQogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfVFJJREVOVCwgUENJX0FOWV9JRCwgZml4dXBfYnJva2VuX3BjbmV0MzIpOwpAQCAtODM4LDkgKzgzOCwxMSBAQAogICAgICAgICAqIGRldmljZSB0cmVlLiAgSWYgdGhleSBhcmUgdGhlbiB3ZSBuZWVkIHRvIHNjYW4gYWxsIHRoZQogICAgICAgICAqIGZ1bmN0aW9ucyBvZiB0aGlzIHNsb3QuCiAgICAgICAgICovCi0gICAgICAgZm9yIChkbiA9IGJ1c2RuLT5jaGlsZDsgZG47IGRuID0gZG4tPnNpYmxpbmcpCi0gICAgICAgICAgICAgICBpZiAoKGRuLT5kZXZmbiA+PiAzKSA9PSAoZGV2Zm4gPj4gMykpCisgICAgICAgZm9yIChkbiA9IGJ1c2RuLT5jaGlsZDsgZG47IGRuID0gZG4tPnNpYmxpbmcpIHsKKwkgICAgICAgc3RydWN0IHBjaV9kbiAqcGRuID0gZG4tPmRhdGE7CisJICAgICAgIGlmIChwZG4gJiYgKHBkbi0+ZGV2Zm4gPj4gMykgPT0gKGRldmZuID4+IDMpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICB9CiAKICAgICAgICByZXR1cm4gMDsKIH0KQEAgLTk4MywzICs5ODUsNjIgQEAKIH0KIAogI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLworCisKKyNkZWZpbmUgSU9CQVNFX0JSSURHRV9OVU1CRVIJMAorI2RlZmluZSBJT0JBU0VfTUVNT1JZCQkxCisjZGVmaW5lIElPQkFTRV9JTwkJMgorI2RlZmluZSBJT0JBU0VfSVNBX0lPCQkzCisjZGVmaW5lIElPQkFTRV9JU0FfTUVNCQk0CisKK2xvbmcgc3lzX3BjaWNvbmZpZ19pb2Jhc2UobG9uZyB3aGljaCwgdW5zaWduZWQgbG9uZyBpbl9idXMsCisJCQkgIHVuc2lnbmVkIGxvbmcgaW5fZGV2Zm4pCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlOworCXN0cnVjdCBsaXN0X2hlYWQgKmxuOworCXN0cnVjdCBwY2lfYnVzICpidXMgPSBOVUxMOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaG9zZV9ub2RlOworCisJLyogQXJnaCAhIFBsZWFzZSBmb3JnaXZlIG1lIGZvciB0aGF0IGhhY2ssIGJ1dCB0aGF0J3MgdGhlCisJICogc2ltcGxlc3Qgd2F5IHRvIGdldCBleGlzdGluZyBYRnJlZSB0byBub3QgbG9ja3VwIG9uIHNvbWUKKwkgKiBHNSBtYWNoaW5lcy4uLiBTbyB3aGVuIHNvbWV0aGluZyBhc2tzIGZvciBidXMgMCBpbyBiYXNlCisJICogKGJ1cyAwIGlzIEhUIHJvb3QpLCB3ZSByZXR1cm4gdGhlIEFHUCBvbmUgaW5zdGVhZC4KKwkgKi8KKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwlpZiAoc3lzdGVtY2ZnLT5wbGF0Zm9ybSA9PSBQTEFURk9STV9QT1dFUk1BQyAmJgorCSAgICBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIk1hY1JJU0M0IikpCisJCWlmIChpbl9idXMgPT0gMCkKKwkJCWluX2J1cyA9IDB4ZjA7CisjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCisKKwkvKiBUaGF0IHN5c2NhbGwgaXNuJ3QgcXVpdGUgY29tcGF0aWJsZSB3aXRoIFBDSSBkb21haW5zLCBidXQgaXQncworCSAqIHVzZWQgb24gcHJlLWRvbWFpbnMgc2V0dXAuIFdlIHJldHVybiB0aGUgZmlyc3QgbWF0Y2gKKwkgKi8KKworCWZvciAobG4gPSBwY2lfcm9vdF9idXNlcy5uZXh0OyBsbiAhPSAmcGNpX3Jvb3RfYnVzZXM7IGxuID0gbG4tPm5leHQpIHsKKwkJYnVzID0gcGNpX2J1c19iKGxuKTsKKwkJaWYgKGluX2J1cyA+PSBidXMtPm51bWJlciAmJiBpbl9idXMgPCAoYnVzLT5udW1iZXIgKyBidXMtPnN1Ym9yZGluYXRlKSkKKwkJCWJyZWFrOworCQlidXMgPSBOVUxMOworCX0KKwlpZiAoYnVzID09IE5VTEwgfHwgYnVzLT5zeXNkYXRhID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaG9zZV9ub2RlID0gKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKWJ1cy0+c3lzZGF0YTsKKwlob3NlID0gUENJX0ROKGhvc2Vfbm9kZSktPnBoYjsKKworCXN3aXRjaCAod2hpY2gpIHsKKwljYXNlIElPQkFTRV9CUklER0VfTlVNQkVSOgorCQlyZXR1cm4gKGxvbmcpaG9zZS0+Zmlyc3RfYnVzbm87CisJY2FzZSBJT0JBU0VfTUVNT1JZOgorCQlyZXR1cm4gKGxvbmcpaG9zZS0+cGNpX21lbV9vZmZzZXQ7CisJY2FzZSBJT0JBU0VfSU86CisJCXJldHVybiAobG9uZylob3NlLT5pb19iYXNlX3BoeXM7CisJY2FzZSBJT0JBU0VfSVNBX0lPOgorCQlyZXR1cm4gKGxvbmcpaXNhX2lvX2Jhc2U7CisJY2FzZSBJT0JBU0VfSVNBX01FTToKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcGNpLmggYi9hcmNoL3BwYzY0L2tlcm5lbC9wY2kuaAppbmRleCAyNmJlNzhiLi41ZWIyY2MzIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wY2kuaAorKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wY2kuaApAQCAtMzQsNyArMzQsNiBAQAogCiB2b2lkIHBjaV9kZXZzX3BoYl9pbml0KHZvaWQpOwogdm9pZCBwY2lfZGV2c19waGJfaW5pdF9keW5hbWljKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKTsKLXN0cnVjdCBkZXZpY2Vfbm9kZSAqZmV0Y2hfZGV2X2RuKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCiAvKiBQQ0kgYWRkcmVzcyBjYWNoZSBtYW5hZ2VtZW50IHJvdXRpbmVzICovCiB2b2lkIHBjaV9hZGRyX2NhY2hlX2luc2VydF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wY2lfZG4uYyBiL2FyY2gvcHBjNjQva2VybmVsL3BjaV9kbi5jCmluZGV4IGVjMzQ1NDYuLmE4NjM4OWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BjaV9kbi5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BjaV9kbi5jCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgpAQCAtNDAsMTYgKzQyLDI2IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIgPSBkYXRhOwogCWludCAqdHlwZSA9IChpbnQgKilnZXRfcHJvcGVydHkoZG4sICJpYm0scGNpLWNvbmZpZy1zcGFjZS10eXBlIiwgTlVMTCk7CiAJdTMyICpyZWdzOworCXN0cnVjdCBwY2lfZG4gKnBkbjsKIAotCWRuLT5waGIgPSBwaGI7CisJaWYgKHBoYi0+aXNfZHluYW1pYykKKwkJcGRuID0ga21hbGxvYyhzaXplb2YoKnBkbiksIEdGUF9LRVJORUwpOworCWVsc2UKKwkJcGRuID0gYWxsb2NfYm9vdG1lbShzaXplb2YoKnBkbikpOworCWlmIChwZG4gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KHBkbiwgMCwgc2l6ZW9mKCpwZG4pKTsKKwlkbi0+ZGF0YSA9IHBkbjsKKwlwZG4tPm5vZGUgPSBkbjsKKwlwZG4tPnBoYiA9IHBoYjsKIAlyZWdzID0gKHUzMiAqKWdldF9wcm9wZXJ0eShkbiwgInJlZyIsIE5VTEwpOwogCWlmIChyZWdzKSB7CiAJCS8qIEZpcnN0IHJlZ2lzdGVyIGVudHJ5IGlzIGFkZHIgKDAwQkJTUzAwKSAgKi8KLQkJZG4tPmJ1c25vID0gKHJlZ3NbMF0gPj4gMTYpICYgMHhmZjsKLQkJZG4tPmRldmZuID0gKHJlZ3NbMF0gPj4gOCkgJiAweGZmOworCQlwZG4tPmJ1c25vID0gKHJlZ3NbMF0gPj4gMTYpICYgMHhmZjsKKwkJcGRuLT5kZXZmbiA9IChyZWdzWzBdID4+IDgpICYgMHhmZjsKIAl9CiAKLQlkbi0+cGNpX2V4dF9jb25maWdfc3BhY2UgPSAodHlwZSAmJiAqdHlwZSA9PSAxKTsKKwlwZG4tPnBjaV9leHRfY29uZmlnX3NwYWNlID0gKHR5cGUgJiYgKnR5cGUgPT0gMSk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTExMiwxMCArMTI0LDE1IEBACiB2b2lkIF9fZGV2aW5pdCBwY2lfZGV2c19waGJfaW5pdF9keW5hbWljKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqIGRuID0gKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKSBwaGItPmFyY2hfZGF0YTsKKwlzdHJ1Y3QgcGNpX2RuICpwZG47CiAKIAkvKiBQSEIgbm9kZXMgdGhlbXNlbHZlcyBtdXN0IG5vdCBtYXRjaCAqLwotCWRuLT5kZXZmbiA9IGRuLT5idXNubyA9IC0xOwotCWRuLT5waGIgPSBwaGI7CisJdXBkYXRlX2RuX3BjaV9pbmZvKGRuLCBwaGIpOworCXBkbiA9IGRuLT5kYXRhOworCWlmIChwZG4pIHsKKwkJcGRuLT5kZXZmbiA9IHBkbi0+YnVzbm8gPSAtMTsKKwkJcGRuLT5waGIgPSBwaGI7CisJfQogCiAJLyogVXBkYXRlIGRuLT5waGIgcHRycyBmb3IgbmV3IHBoYiBhbmQgY2hpbGRyZW4gZGV2aWNlcyAqLwogCXRyYXZlcnNlX3BjaV9kZXZpY2VzKGRuLCB1cGRhdGVfZG5fcGNpX2luZm8sIHBoYik7CkBAIC0xMjMsMTQgKzE0MCwxNyBAQAogCiAvKgogICogVHJhdmVyc2FsIGZ1bmMgdGhhdCBsb29rcyBmb3IgYSA8YnVzbm8sZGV2ZmNuPiB2YWx1ZS4KLSAqIElmIGZvdW5kLCB0aGUgZGV2aWNlX25vZGUgaXMgcmV0dXJuZWQgKHRodXMgdGVybWluYXRpbmcgdGhlIHRyYXZlcnNhbCkuCisgKiBJZiBmb3VuZCwgdGhlIHBjaV9kbiBpcyByZXR1cm5lZCAodGh1cyB0ZXJtaW5hdGluZyB0aGUgdHJhdmVyc2FsKS4KICAqLwogc3RhdGljIHZvaWQgKmlzX2RldmZuX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpkbiwgdm9pZCAqZGF0YSkKIHsKIAlpbnQgYnVzbm8gPSAoKHVuc2lnbmVkIGxvbmcpZGF0YSA+PiA4KSAmIDB4ZmY7CiAJaW50IGRldmZuID0gKCh1bnNpZ25lZCBsb25nKWRhdGEpICYgMHhmZjsKKwlzdHJ1Y3QgcGNpX2RuICpwY2kgPSBkbi0+ZGF0YTsKIAotCXJldHVybiAoKGRldmZuID09IGRuLT5kZXZmbikgJiYgKGJ1c25vID09IGRuLT5idXNubykpID8gZG4gOiBOVUxMOworCWlmIChwY2kgJiYgKGRldmZuID09IHBjaS0+ZGV2Zm4pICYmIChidXNubyA9PSBwY2ktPmJ1c25vKSkKKwkJcmV0dXJuIGRuOworCXJldHVybiBOVUxMOwogfQogCiAvKgpAQCAtMTQ5LDEzICsxNjksMTAgQEAKIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZmV0Y2hfZGV2X2RuKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpvcmlnX2RuID0gZGV2LT5zeXNkYXRhOwotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiID0gb3JpZ19kbi0+cGhiOyAvKiBhc3N1bWUgc2FtZSBwaGIgYXMgb3JpZ19kbiAqLwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGhiX2RuOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CiAJdW5zaWduZWQgbG9uZyBzZWFyY2h2YWwgPSAoZGV2LT5idXMtPm51bWJlciA8PCA4KSB8IGRldi0+ZGV2Zm47CiAKLQlwaGJfZG4gPSBwaGItPmFyY2hfZGF0YTsKLQlkbiA9IHRyYXZlcnNlX3BjaV9kZXZpY2VzKHBoYl9kbiwgaXNfZGV2Zm5fbm9kZSwgKHZvaWQgKilzZWFyY2h2YWwpOworCWRuID0gdHJhdmVyc2VfcGNpX2RldmljZXMob3JpZ19kbiwgaXNfZGV2Zm5fbm9kZSwgKHZvaWQgKilzZWFyY2h2YWwpOwogCWlmIChkbikKIAkJZGV2LT5zeXNkYXRhID0gZG47CiAJcmV0dXJuIGRuOwpAQCAtMTY1LDExICsxODIsMTMgQEAKIHN0YXRpYyBpbnQgcGNpX2RuX3JlY29uZmlnX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpub2RlKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBub2RlOworCXN0cnVjdCBwY2lfZG4gKnBjaTsKIAlpbnQgZXJyID0gTk9USUZZX09LOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIFBTRVJJRVNfUkVDT05GSUdfQUREOgotCQl1cGRhdGVfZG5fcGNpX2luZm8obnAsIG5wLT5wYXJlbnQtPnBoYik7CisJCXBjaSA9IG5wLT5wYXJlbnQtPmRhdGE7CisJCXVwZGF0ZV9kbl9wY2lfaW5mbyhucCwgcGNpLT5waGIpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnIgPSBOT1RJRllfRE9ORTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BjaV9pb21tdS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcGNpX2lvbW11LmMKaW5kZXggZWYwYTYyYi4uMTQ2NDdlMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvcGNpX2lvbW11LmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcGNpX2lvbW11LmMKQEAgLTY2LDcgKzY2LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KIAogI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQotCXJldHVybiBQQ0lfR0VUX0ROKHBkZXYpLT5pb21tdV90YWJsZTsKKwlyZXR1cm4gUENJX0ROKFBDSV9HRVRfRE4ocGRldikpLT5pb21tdV90YWJsZTsKICNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcG1hY19mZWF0dXJlLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX2ZlYXR1cmUuYwppbmRleCA5OGVkMmJjLi5lYjRlNmMzIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX2ZlYXR1cmUuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX2ZlYXR1cmUuYwpAQCAtNjc0LDYgKzY3NCw3IEBACiAjaWYgMCAvKiBEaXNhYmxlZCBmb3Igbm93ICovCiAJdTMyCXVmcmVxLCBmcmVxLCB1Y2ZnLCBjZmc7CiAJc3RydWN0IGRldmljZV9ub2RlICpwY2l4X25vZGU7CisJc3RydWN0IHBjaV9kbiAqcGRuOwogCXU4ICAJcHhfYnVzLCBweF9kZXZmbjsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnB4X2hvc2U7CiAKQEAgLTY4Nyw5ICs2ODgsMTAgQEAKIAkJcHJpbnRrKCJObyBQQ0ktWCBicmlkZ2UgZm91bmRcbiIpOwogCQlyZXR1cm47CiAJfQotCXB4X2hvc2UgPSBwY2l4X25vZGUtPnBoYjsKLQlweF9idXMgPSBwY2l4X25vZGUtPmJ1c25vOwotCXB4X2RldmZuID0gcGNpeF9ub2RlLT5kZXZmbjsKKwlwZG4gPSBwY2l4X25vZGUtPmRhdGE7CisJcHhfaG9zZSA9IHBkbi0+cGhiOworCXB4X2J1cyA9IHBkbi0+YnVzbm87CisJcHhfZGV2Zm4gPSBwZG4tPmRldmZuOwogCQogCWVhcmx5X3JlYWRfY29uZmlnX2R3b3JkKHB4X2hvc2UsIHB4X2J1cywgcHhfZGV2Zm4sIDB4YzQsICZjZmcpOwogCWVhcmx5X3JlYWRfY29uZmlnX2R3b3JkKHB4X2hvc2UsIHB4X2J1cywgcHhfZGV2Zm4sIDB4Y2MsICZmcmVxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BtYWNfcGNpLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX3BjaS5jCmluZGV4IDcxZmU5MTEuLmQzN2JmZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BtYWNfcGNpLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcG1hY19wY2kuYwpAQCAtMjQyLDcgKzI0Miw3IEBACiAJZWxzZQogCQlidXNkbiA9IGhvc2UtPmFyY2hfZGF0YTsKIAlmb3IgKGRuID0gYnVzZG4tPmNoaWxkOyBkbjsgZG4gPSBkbi0+c2libGluZykKLQkJaWYgKGRuLT5kZXZmbiA9PSBkZXZmbikKKwkJaWYgKGRuLT5kYXRhICYmIFBDSV9ETihkbiktPmRldmZuID09IGRldmZuKQogCQkJYnJlYWs7CiAJaWYgKGRuID09IE5VTEwpCiAJCXJldHVybiAtMTsKQEAgLTc0Niw5ICs3NDYsOSBAQAogCSAqLwogCWlmICh1M19hZ3ApIHsKIAkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHUzX2FncC0+YXJjaF9kYXRhOwotCQlucC0+YnVzbm8gPSAweGYwOworCQlQQ0lfRE4obnApLT5idXNubyA9IDB4ZjA7CiAJCWZvciAobnAgPSBucC0+Y2hpbGQ7IG5wOyBucCA9IG5wLT5zaWJsaW5nKQotCQkJbnAtPmJ1c25vID0gMHhmMDsKKwkJCVBDSV9ETihucCktPmJ1c25vID0gMHhmMDsKIAl9CiAKIAlwbWFjX2NoZWNrX2h0X2xpbmsoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BtYWNfc2V0dXAuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BtYWNfc2V0dXAuYwppbmRleCA4ZmY4NmE3Li5lN2Y2OTVkIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX3NldHVwLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcG1hY19zZXR1cC5jCkBAIC0yNzQsMTYgKzI3NCw2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfQk9PVFhfVEVYVAotc3RhdGljIGludCBkdW1teV9nZXRjX3BvbGwodm9pZCkKLXsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGR1bW15X2dldGModm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgYnRleHRfcHV0Yyh1bnNpZ25lZCBjaGFyIGMpCiB7CiAJYnRleHRfZHJhd2NoYXIoYyk7CkBAIC0zNDIsMTYgKzMzMiwxMyBAQAogCQlzY2NkYmcgPSAxOwogICAgICAgIAkJdWRiZ19pbml0X3NjYyhOVUxMKTsKICAgICAgICAJfQotCi0JZWxzZSB7CiAjaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKKwllbHNlIHsKIAkJaW5pdF9ib290X2Rpc3BsYXkoKTsKIAotCQlwcGNfbWQudWRiZ19wdXRjID0gYnRleHRfcHV0YzsKLQkJcHBjX21kLnVkYmdfZ2V0YyA9IGR1bW15X2dldGM7Ci0JCXBwY19tZC51ZGJnX2dldGNfcG9sbCA9IGR1bW15X2dldGNfcG9sbDsKLSNlbmRpZiAvKiBDT05GSUdfQk9PVFhfVEVYVCAqLworCQl1ZGJnX3B1dGMgPSBidGV4dF9wdXRjOwogCX0KKyNlbmRpZiAvKiBDT05GSUdfQk9PVFhfVEVYVCAqLwogCiAJLyogU2V0dXAgaW50ZXJydXB0IG1hcHBpbmcgb3B0aW9ucyAqLwogCXBwYzY0X2ludGVycnVwdF9jb250cm9sbGVyID0gSUNfT1BFTl9QSUM7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wbWMuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BtYy5jCmluZGV4IGNkZmVjNzQuLjYzZDk0ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BtYy5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BtYy5jCkBAIC0yNiw3ICsyNiw3IEBACiAJbXRzcHIoU1BSTl9NTUNSMCwgbW1jcjApOwogfQogCi1zdGF0aWMgc3BpbmxvY2tfdCBwbWNfb3duZXJfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socG1jX293bmVyX2xvY2spOwogc3RhdGljIHZvaWQgKnBtY19vd25lcl9jYWxsZXI7IC8qIG1vc3RseSBmb3IgZGVidWdnaW5nICovCiBwZXJmX2lycV90IHBlcmZfaXJxID0gZHVtbXlfcGVyZjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcHJvbS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcHJvbS5jCmluZGV4IGIyMTg0ODguLjcwMzVkZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3Byb20uYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wcm9tLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0xNzM0LDYgKzE3MzMsNyBAQAogCWtmcmVlKG5vZGUtPmludHJzKTsKIAlrZnJlZShub2RlLT5hZGRycyk7CiAJa2ZyZWUobm9kZS0+ZnVsbF9uYW1lKTsKKwlrZnJlZShub2RlLT5kYXRhKTsKIAlrZnJlZShub2RlKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcHJvbV9pbml0LmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9wcm9tX2luaXQuYwppbmRleCAxMjIyODNhLi45OTc5OTE5IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wcm9tX2luaXQuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wcm9tX2luaXQuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3J0YXNfcGNpLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9ydGFzX3BjaS5jCmluZGV4IDFkY2NhZGEuLjRhOTcxOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3J0YXNfcGNpLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcnRhc19wY2kuYwpAQCAtNDgsNyArNDgsNyBAQAogc3RhdGljIGludCBpYm1fcmVhZF9wY2lfY29uZmlnOwogc3RhdGljIGludCBpYm1fd3JpdGVfcGNpX2NvbmZpZzsKIAotc3RhdGljIGludCBjb25maWdfYWNjZXNzX3ZhbGlkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIGludCB3aGVyZSkKK3N0YXRpYyBpbnQgY29uZmlnX2FjY2Vzc192YWxpZChzdHJ1Y3QgcGNpX2RuICpkbiwgaW50IHdoZXJlKQogewogCWlmICh3aGVyZSA8IDI1NikKIAkJcmV0dXJuIDE7CkBAIC03OCwxNSArNzgsMTcgQEAKIAlpbnQgcmV0dXJudmFsID0gLTE7CiAJdW5zaWduZWQgbG9uZyBidWlkLCBhZGRyOwogCWludCByZXQ7CisJc3RydWN0IHBjaV9kbiAqcGRuOwogCi0JaWYgKCFkbikKKwlpZiAoIWRuIHx8ICFkbi0+ZGF0YSkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQlpZiAoIWNvbmZpZ19hY2Nlc3NfdmFsaWQoZG4sIHdoZXJlKSkKKwlwZG4gPSBkbi0+ZGF0YTsKKwlpZiAoIWNvbmZpZ19hY2Nlc3NfdmFsaWQocGRuLCB3aGVyZSkpCiAJCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CiAKLQlhZGRyID0gKCh3aGVyZSAmIDB4ZjAwKSA8PCAyMCkgfCAoZG4tPmJ1c25vIDw8IDE2KSB8Ci0JCShkbi0+ZGV2Zm4gPDwgOCkgfCAod2hlcmUgJiAweGZmKTsKLQlidWlkID0gZG4tPnBoYi0+YnVpZDsKKwlhZGRyID0gKCh3aGVyZSAmIDB4ZjAwKSA8PCAyMCkgfCAocGRuLT5idXNubyA8PCAxNikgfAorCQkocGRuLT5kZXZmbiA8PCA4KSB8ICh3aGVyZSAmIDB4ZmYpOworCWJ1aWQgPSBwZG4tPnBoYi0+YnVpZDsKIAlpZiAoYnVpZCkgewogCQlyZXQgPSBydGFzX2NhbGwoaWJtX3JlYWRfcGNpX2NvbmZpZywgNCwgMiwgJnJldHVybnZhbCwKIAkJCQlhZGRyLCBidWlkID4+IDMyLCBidWlkICYgMHhmZmZmZmZmZiwgc2l6ZSk7CkBAIC05OCw4ICsxMDAsOCBAQAogCWlmIChyZXQpCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKLQlpZiAocmV0dXJudmFsID09IEVFSF9JT19FUlJPUl9WQUxVRShzaXplKQotCSAgICAmJiBlZWhfZG5fY2hlY2tfZmFpbHVyZSAoZG4sIE5VTEwpKQorCWlmIChyZXR1cm52YWwgPT0gRUVIX0lPX0VSUk9SX1ZBTFVFKHNpemUpICYmCisJICAgIGVlaF9kbl9jaGVja19mYWlsdXJlIChkbiwgTlVMTCkpCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwpAQCAtMTE4LDI0ICsxMjAsMjggQEAKIAogCS8qIFNlYXJjaCBvbmx5IGRpcmVjdCBjaGlsZHJlbiBvZiB0aGUgYnVzICovCiAJZm9yIChkbiA9IGJ1c2RuLT5jaGlsZDsgZG47IGRuID0gZG4tPnNpYmxpbmcpCi0JCWlmIChkbi0+ZGV2Zm4gPT0gZGV2Zm4gJiYgb2ZfZGV2aWNlX2F2YWlsYWJsZShkbikpCisJCWlmIChkbi0+ZGF0YSAmJiBQQ0lfRE4oZG4pLT5kZXZmbiA9PSBkZXZmbgorCQkgICAgJiYgb2ZfZGV2aWNlX2F2YWlsYWJsZShkbikpCiAJCQlyZXR1cm4gcnRhc19yZWFkX2NvbmZpZyhkbiwgd2hlcmUsIHNpemUsIHZhbCk7CisKIAlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogfQogCi1zdGF0aWMgaW50IHJ0YXNfd3JpdGVfY29uZmlnKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpCitpbnQgcnRhc193cml0ZV9jb25maWcoc3RydWN0IGRldmljZV9ub2RlICpkbiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKIHsKIAl1bnNpZ25lZCBsb25nIGJ1aWQsIGFkZHI7CiAJaW50IHJldDsKKwlzdHJ1Y3QgcGNpX2RuICpwZG47CiAKLQlpZiAoIWRuKQorCWlmICghZG4gfHwgIWRuLT5kYXRhKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCWlmICghY29uZmlnX2FjY2Vzc192YWxpZChkbiwgd2hlcmUpKQorCXBkbiA9IGRuLT5kYXRhOworCWlmICghY29uZmlnX2FjY2Vzc192YWxpZChwZG4sIHdoZXJlKSkKIAkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKIAotCWFkZHIgPSAoKHdoZXJlICYgMHhmMDApIDw8IDIwKSB8IChkbi0+YnVzbm8gPDwgMTYpIHwKLQkJKGRuLT5kZXZmbiA8PCA4KSB8ICh3aGVyZSAmIDB4ZmYpOwotCWJ1aWQgPSBkbi0+cGhiLT5idWlkOworCWFkZHIgPSAoKHdoZXJlICYgMHhmMDApIDw8IDIwKSB8IChwZG4tPmJ1c25vIDw8IDE2KSB8CisJCShwZG4tPmRldmZuIDw8IDgpIHwgKHdoZXJlICYgMHhmZik7CisJYnVpZCA9IHBkbi0+cGhiLT5idWlkOwogCWlmIChidWlkKSB7CiAJCXJldCA9IHJ0YXNfY2FsbChpYm1fd3JpdGVfcGNpX2NvbmZpZywgNSwgMSwgTlVMTCwgYWRkciwgYnVpZCA+PiAzMiwgYnVpZCAmIDB4ZmZmZmZmZmYsIHNpemUsICh1bG9uZykgdmFsKTsKIAl9IGVsc2UgewpAQCAtMTYxLDcgKzE2Nyw4IEBACiAKIAkvKiBTZWFyY2ggb25seSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIGJ1cyAqLwogCWZvciAoZG4gPSBidXNkbi0+Y2hpbGQ7IGRuOyBkbiA9IGRuLT5zaWJsaW5nKQotCQlpZiAoZG4tPmRldmZuID09IGRldmZuICYmIG9mX2RldmljZV9hdmFpbGFibGUoZG4pKQorCQlpZiAoZG4tPmRhdGEgJiYgUENJX0ROKGRuKS0+ZGV2Zm4gPT0gZGV2Zm4KKwkJICAgICYmIG9mX2RldmljZV9hdmFpbGFibGUoZG4pKQogCQkJcmV0dXJuIHJ0YXNfd3JpdGVfY29uZmlnKGRuLCB3aGVyZSwgc2l6ZSwgdmFsKTsKIAlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcnRhc2QuYyBiL2FyY2gvcHBjNjQva2VybmVsL3J0YXNkLmMKaW5kZXggYjBjM2I4Mi4uZTI2YjA0MiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvcnRhc2QuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9ydGFzZC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC00MTIsOCArNDEzLDcgQEAKIAogCQkvKiBEcm9wIGhvdHBsdWcgbG9jaywgYW5kIHNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIGRlbGF5ICovCiAJCXVubG9ja19jcHVfaG90cGx1ZygpOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KGRlbGF5KTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoZGVsYXkpOwogCQlsb2NrX2NwdV9ob3RwbHVnKCk7CiAKIAkJY3B1ID0gbmV4dF9jcHUoY3B1LCBjcHVfb25saW5lX21hcCk7CkBAIC00NDIsNyArNDQyLDcgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIlJUQVMgZGFlbW9uIHN0YXJ0ZWRcbiIpOwogCi0JREVCVUcoIndpbGwgc2xlZXAgZm9yICVkIGppZmZpZXNcbiIsIChIWio2MC9ydGFzX2V2ZW50X3NjYW5fcmF0ZSkgLyAyKTsKKwlERUJVRygid2lsbCBzbGVlcCBmb3IgJWQgbWlsbGlzZWNvbmRzXG4iLCAoMzAwMDAvcnRhc19ldmVudF9zY2FuX3JhdGUpKTsKIAogCS8qIFNlZSBpZiB3ZSBoYXZlIGFueSBlcnJvciBzdG9yZWQgaW4gTlZSQU0gKi8KIAltZW1zZXQobG9nZGF0YSwgMCwgcnRhc19lcnJvcl9sb2dfbWF4KTsKQEAgLTQ1OSw3ICs0NTksNyBAQAogCX0KIAogCS8qIEZpcnN0IHBhc3MuICovCi0JZG9fZXZlbnRfc2Nhbl9hbGxfY3B1cyhIWik7CisJZG9fZXZlbnRfc2Nhbl9hbGxfY3B1cygxMDAwKTsKIAogCWlmIChzdXJ2ZWlsbGFuY2VfdGltZW91dCAhPSAtMSkgewogCQlERUJVRygiZW5hYmxpbmcgc3VydmVpbGxhbmNlXG4iKTsKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCSAqIG1hY2hpbmVzIGhhdmUgcHJvYmxlbXMgaWYgd2UgY2FsbCBldmVudC1zY2FuIHRvbwogCSAqIHF1aWNrbHkuICovCiAJZm9yICg7OykKLQkJZG9fZXZlbnRfc2Nhbl9hbGxfY3B1cygoSFoqNjAvcnRhc19ldmVudF9zY2FuX3JhdGUpIC8gMik7CisJCWRvX2V2ZW50X3NjYW5fYWxsX2NwdXMoMzAwMDAvcnRhc19ldmVudF9zY2FuX3JhdGUpOwogCiBlcnJvcjoKIAkvKiBTaG91bGQgZGVsZXRlIHByb2MgZW50cmllcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcnRjLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9ydGMuYwppbmRleCBkNzI5ZmVmLi42ZmY1MmJjIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9ydGMuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9ydGMuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0zNTEsOCArMzUyLDcgQEAKIAkJCQlyZXR1cm47CS8qIGRlbGF5IG5vdCBhbGxvd2VkICovCiAJCQl9CiAJCQl3YWl0X3RpbWUgPSBydGFzX2V4dGVuZGVkX2J1c3lfZGVsYXlfdGltZShlcnJvcik7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dCh3YWl0X3RpbWUpOworCQkJbXNsZWVwX2ludGVycnVwdGlibGUod2FpdF90aW1lKTsKIAkJCWVycm9yID0gUlRBU19DTE9DS19CVVNZOwogCQl9CiAJfSB3aGlsZSAoZXJyb3IgPT0gUlRBU19DTE9DS19CVVNZICYmIChfX2dldF90YigpIDwgbWF4X3dhaXRfdGIpKTsKQEAgLTM4Niw4ICszODYsNyBAQAogCQkJaWYgKGluX2ludGVycnVwdCgpKQogCQkJCXJldHVybiAxOwkvKiBwcm9iYWJseSBkZWNyZW1lbnRlciAqLwogCQkJd2FpdF90aW1lID0gcnRhc19leHRlbmRlZF9idXN5X2RlbGF5X3RpbWUoZXJyb3IpOwotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQod2FpdF90aW1lKTsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKHdhaXRfdGltZSk7CiAJCQllcnJvciA9IFJUQVNfQ0xPQ0tfQlVTWTsKIAkJfQogCX0gd2hpbGUgKGVycm9yID09IFJUQVNfQ0xPQ0tfQlVTWSAmJiAoX19nZXRfdGIoKSA8IG1heF93YWl0X3RiKSk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9zY2FubG9nLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9zY2FubG9nLmMKaW5kZXggNGQ3MDczNi4uMjE1YmY4OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvc2NhbmxvZy5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3NjYW5sb2cuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3J0YXMuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgpAQCAtNzcsNyArNzgsNyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWZvciAoOzspIHsKLQkJd2FpdF90aW1lID0gSFovMjsJLyogZGVmYXVsdCB3YWl0IGlmIG5vIGRhdGEgKi8KKwkJd2FpdF90aW1lID0gNTAwOwkvKiBkZWZhdWx0IHdhaXQgaWYgbm8gZGF0YSAqLwogCQlzcGluX2xvY2soJnJ0YXNfZGF0YV9idWZfbG9jayk7CiAJCW1lbWNweShydGFzX2RhdGFfYnVmLCBkYXRhLCBSVEFTX0RBVEFfQlVGX1NJWkUpOwogCQlzdGF0dXMgPSBydGFzX2NhbGwoaWJtX3NjYW5fbG9nX2R1bXAsIDIsIDEsIE5VTEwsCkBAIC0xMDcsMjQgKzEwOCwxNCBAQAogCQkJYnJlYWs7CiAJCSAgICBkZWZhdWx0OgogCQkJaWYgKHN0YXR1cyA+IDk5MDAgJiYgc3RhdHVzIDw9IDk5MDUpIHsKLQkJCQkvKiBObyBkYXRhLiAgUlRBUyBpcyBoaW50aW5nIGF0IGEgZGVsYXkgcmVxdWlyZWQKLQkJCQkgKiBiZXR3ZWVuIDEtMTAwMDAwIG1pbGxpc2Vjb25kcwotCQkJCSAqLwotCQkJCWludCBtcyA9IDE7Ci0JCQkJZm9yICg7IHN0YXR1cyA+IDk5MDA7IHN0YXR1cy0tKQotCQkJCQltcyA9IG1zICogMTA7Ci0JCQkJLyogVXNlIG1pY3Jvc2Vjb25kcyBmb3IgcmVhc29uYWJsZSBhY2N1cmFjeSAqLwotCQkJCW1zICo9IDEwMDA7Ci0JCQkJd2FpdF90aW1lID0gbXMgLyAoMTAwMDAwMC9IWik7IC8qIHJvdW5kIGRvd24gaXMgZmluZSAqLwotCQkJCS8qIEZhbGwgdGhyb3VnaCB0byBzbGVlcCAqLworCQkJCXdhaXRfdGltZSA9IHJ0YXNfZXh0ZW5kZWRfYnVzeV9kZWxheV90aW1lKHN0YXR1cyk7CiAJCQl9IGVsc2UgewogCQkJCXByaW50ayhLRVJOX0VSUiAic2NhbmxvZzogdW5rbm93biBlcnJvciBmcm9tIHJ0YXM6ICVkXG4iLCBzdGF0dXMpOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQl9CiAJCS8qIEFwcGFyZW50bHkgbm8gZGF0YSB5ZXQuICBXYWl0IGFuZCB0cnkgYWdhaW4uICovCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQod2FpdF90aW1lKTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUod2FpdF90aW1lKTsKIAl9CiAJLypOT1RSRUFDSEVEKi8KIH0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGVlM2IyMGQuLmJmYTg3OTFjIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3NldHVwLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KQEAgLTg5LDcgKzg5LDcgQEAKICNkZWZpbmUgRUFSTFlfREVCVUdfSU5JVCgpIHVkYmdfaW5pdF9tYXBsZV9yZWFsbW9kZSgpCiAjZGVmaW5lIEVBUkxZX0RFQlVHX0lOSVQoKSB1ZGJnX2luaXRfcG1hY19yZWFsbW9kZSgpCiAjZGVmaW5lIEVBUkxZX0RFQlVHX0lOSVQoKQkJCQkJCVwKLQlkbyB7IHBwY19tZC51ZGJnX3B1dGMgPSBjYWxsX3J0YXNfZGlzcGxheV9zdGF0dXNfZGVsYXk7IH0gd2hpbGUoMCkKKwlkbyB7IHVkYmdfcHV0YyA9IGNhbGxfcnRhc19kaXNwbGF5X3N0YXR1c19kZWxheTsgfSB3aGlsZSgwKQogI2VuZGlmCiAKIC8qIGV4dGVybiB2b2lkICpzdGFiOyAqLwpAQCAtMTA4LDcgKzEwOCw2IEBACiBpbnQgYm9vdF9jcHVpZF9waHlzID0gMDsKIGRldl90IGJvb3RfZGV2OwogdTY0IHBwYzY0X3BmdF9zaXplOwotdTY0IHBwYzY0X2RlYnVnX3N3aXRjaDsKIAogc3RydWN0IHBwYzY0X2NhY2hlcyBwcGM2NF9jYWNoZXM7CiBFWFBPUlRfU1lNQk9MX0dQTChwcGM2NF9jYWNoZXMpOwpAQCAtMTU0LDM0ICsxNTMsNiBAQAogCS5vcmlnX3ZpZGVvX3BvaW50cyA9IDE2CiB9OwogCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgUFBDREJHIHN0YXRlLiAgQ2FsbGVkIGJlZm9yZSByZWxvY2F0aW9uIGhhcyBiZWVuIGVuYWJsZWQuCi0gKi8KLXZvaWQgX19pbml0IHBwY2RiZ19pbml0aWFsaXplKHZvaWQpCi17Ci0JcHBjNjRfZGVidWdfc3dpdGNoID0gUFBDX0RFQlVHX0RFRkFVTFQ7IC8qIHwgUFBDREJHX0JVU1dBTEsgfCAqLwotCS8qIFBQQ0RCR19QSEJJTklUIHwgUFBDREJHX01NIHwgUFBDREJHX01NSU5JVCB8IFBQQ0RCR19UQ0VJTklUIHwgUFBDREJHX1RDRSAqLzsKLX0KLQotLyoKLSAqIEVhcmx5IGJvb3QgY29uc29sZSBiYXNlZCBvbiB1ZGJnCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY29uc29sZSB1ZGJnX2NvbnNvbGUgPSB7Ci0JLm5hbWUJPSAidWRiZyIsCi0JLndyaXRlCT0gdWRiZ19jb25zb2xlX3dyaXRlLAotCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiwKLQkuaW5kZXgJPSAtMSwKLX07Ci1zdGF0aWMgaW50IGVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQ7Ci0KLXZvaWQgX19pbml0IGRpc2FibGVfZWFybHlfcHJpbnRrKHZvaWQpCi17Ci0JaWYgKCFlYXJseV9jb25zb2xlX2luaXRpYWxpemVkKQotCQlyZXR1cm47Ci0JdW5yZWdpc3Rlcl9jb25zb2xlKCZ1ZGJnX2NvbnNvbGUpOwotCWVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQgPSAwOwotfQotCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDX01VTFRJUExBVEZPUk0pICYmIGRlZmluZWQoQ09ORklHX1NNUCkKIAogc3RhdGljIGludCBzbXRfZW5hYmxlZF9jbWRsaW5lOwpAQCAtNDI1LDEyICszOTYsNiBAQAogCX0KIAlwcGNfbWQgPSAqKm1hY2g7CiAKLQkvKiBvdXIgdWRiZyBjYWxsYmFja3MgZ290IG92ZXJyaWRlbiBieSB0aGUgYWJvdmUsIGxldCdzIHB1dCB0aGVtCi0JICogYmFjayBpbi4gVWx0aW1hdGVseSwgSSB3YW50IHRob3NlIHRoaW5ncyB0byBiZSBzcGxpdCBmcm9tIHRoZQotCSAqIG1haW4gcHBjX21kCi0JICovCi0JRUFSTFlfREVCVUdfSU5JVCgpOwotCiAJREJHKCJGb3VuZCwgSW5pdGlhbGl6aW5nIG1lbW9yeSBtYW5hZ2VtZW50Li4uXG4iKTsKIAogCS8qCkBAIC02MzYsOCArNjAxLDcgQEAKIAkvKgogCSAqIFJlZ2lzdGVyIGVhcmx5IGNvbnNvbGUKIAkgKi8KLQllYXJseV9jb25zb2xlX2luaXRpYWxpemVkID0gMTsKLQlyZWdpc3Rlcl9jb25zb2xlKCZ1ZGJnX2NvbnNvbGUpOworCXJlZ2lzdGVyX2Vhcmx5X3VkYmdfY29uc29sZSgpOwogCiAJLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLwogCXN0cmxjcHkoc2F2ZWRfY29tbWFuZF9saW5lLCBjbWRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOwpAQCAtNjU3LDcgKzYyMSw3IEBACiAJc21wX3JlbGVhc2VfY3B1cygpOwogI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgIWRlZmluZWQoQ09ORklHX1BQQ19JU0VSSUVTKSAqLwogCi0JcHJpbnRrKCJTdGFydGluZyBMaW51eCBQUEM2NCAlc1xuIiwgVVRTX1JFTEVBU0UpOworCXByaW50aygiU3RhcnRpbmcgTGludXggUFBDNjQgJXNcbiIsIHN5c3RlbV91dHNuYW1lLnZlcnNpb24pOwogCiAJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAJcHJpbnRrKCJwcGM2NF9wZnRfc2l6ZSAgICAgICAgICAgICAgICA9IDB4JWx4XG4iLCBwcGM2NF9wZnRfc2l6ZSk7CkBAIC0xMzE5LDcgKzEyODMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewogCS5uYW1lCT0gInNlcmlhbDgyNTAiLAotCS5pZAk9IDAsCisJLmlkCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCS5kZXYJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhID0gc2VyaWFsX3BvcnRzLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9zeXNfcHBjMzIuYyBiL2FyY2gvcHBjNjQva2VybmVsL3N5c19wcGMzMi5jCmluZGV4IDIwNjYxOTAuLmU5M2MxMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3N5c19wcGMzMi5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3N5c19wcGMzMi5jCkBAIC03MDgsNjIgKzcwOCw5IEBACiAJCQkJICAgY29tcGF0X3B0cih1YnVmKSk7CiB9CiAKLSNkZWZpbmUgSU9CQVNFX0JSSURHRV9OVU1CRVIJMAotI2RlZmluZSBJT0JBU0VfTUVNT1JZCQkxCi0jZGVmaW5lIElPQkFTRV9JTwkJMgotI2RlZmluZSBJT0JBU0VfSVNBX0lPCQkzCi0jZGVmaW5lIElPQkFTRV9JU0FfTUVNCQk0Ci0KIGFzbWxpbmthZ2UgaW50IHN5czMyX3BjaWNvbmZpZ19pb2Jhc2UodTMyIHdoaWNoLCB1MzIgaW5fYnVzLCB1MzIgaW5fZGV2Zm4pCiB7Ci0jaWZkZWYgQ09ORklHX1BDSQotCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsbjsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gTlVMTDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmhvc2Vfbm9kZTsKLQotCS8qIEFyZ2ggISBQbGVhc2UgZm9yZ2l2ZSBtZSBmb3IgdGhhdCBoYWNrLCBidXQgdGhhdCdzIHRoZQotCSAqIHNpbXBsZXN0IHdheSB0byBnZXQgZXhpc3RpbmcgWEZyZWUgdG8gbm90IGxvY2t1cCBvbiBzb21lCi0JICogRzUgbWFjaGluZXMuLi4gU28gd2hlbiBzb21ldGhpbmcgYXNrcyBmb3IgYnVzIDAgaW8gYmFzZQotCSAqIChidXMgMCBpcyBIVCByb290KSwgd2UgcmV0dXJuIHRoZSBBR1Agb25lIGluc3RlYWQuCi0JICovCi0jaWZkZWYgQ09ORklHX1BQQ19QTUFDCi0JaWYgKHN5c3RlbWNmZy0+cGxhdGZvcm0gPT0gUExBVEZPUk1fUE9XRVJNQUMgJiYKLQkgICAgbWFjaGluZV9pc19jb21wYXRpYmxlKCJNYWNSSVNDNCIpKQotCQlpZiAoaW5fYnVzID09IDApCi0JCQlpbl9idXMgPSAweGYwOwotI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwotCi0JLyogVGhhdCBzeXNjYWxsIGlzbid0IHF1aXRlIGNvbXBhdGlibGUgd2l0aCBQQ0kgZG9tYWlucywgYnV0IGl0J3MKLQkgKiB1c2VkIG9uIHByZS1kb21haW5zIHNldHVwLiBXZSByZXR1cm4gdGhlIGZpcnN0IG1hdGNoCi0JICovCi0KLQlmb3IgKGxuID0gcGNpX3Jvb3RfYnVzZXMubmV4dDsgbG4gIT0gJnBjaV9yb290X2J1c2VzOyBsbiA9IGxuLT5uZXh0KSB7Ci0JCWJ1cyA9IHBjaV9idXNfYihsbik7Ci0JCWlmIChpbl9idXMgPj0gYnVzLT5udW1iZXIgJiYgaW5fYnVzIDwgKGJ1cy0+bnVtYmVyICsgYnVzLT5zdWJvcmRpbmF0ZSkpCi0JCQlicmVhazsKLQkJYnVzID0gTlVMTDsKLQl9Ci0JaWYgKGJ1cyA9PSBOVUxMIHx8IGJ1cy0+c3lzZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWhvc2Vfbm9kZSA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKilidXMtPnN5c2RhdGE7Ci0JaG9zZSA9IGhvc2Vfbm9kZS0+cGhiOwotCi0Jc3dpdGNoICh3aGljaCkgewotCWNhc2UgSU9CQVNFX0JSSURHRV9OVU1CRVI6Ci0JCXJldHVybiAobG9uZylob3NlLT5maXJzdF9idXNubzsKLQljYXNlIElPQkFTRV9NRU1PUlk6Ci0JCXJldHVybiAobG9uZylob3NlLT5wY2lfbWVtX29mZnNldDsKLQljYXNlIElPQkFTRV9JTzoKLQkJcmV0dXJuIChsb25nKWhvc2UtPmlvX2Jhc2VfcGh5czsKLQljYXNlIElPQkFTRV9JU0FfSU86Ci0JCXJldHVybiAobG9uZylpc2FfaW9fYmFzZTsKLQljYXNlIElPQkFTRV9JU0FfTUVNOgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0jZW5kaWYJLyogQ09ORklHX1BDSSAqLwotCXJldHVybiAtRU9QTk9UU1VQUDsKKwlyZXR1cm4gc3lzX3BjaWNvbmZpZ19pb2Jhc2Uod2hpY2gsIGluX2J1cywgaW5fZGV2Zm4pOwogfQogCiAKQEAgLTg2NywzNyArODE0LDYgQEAKIAlyZXR1cm4gc3lzX2xzZWVrKGZkLCAoaW50KW9mZnNldCwgb3JpZ2luKTsKIH0KIAotLyoKLSAqIFRoaXMgaXMganVzdCBhIHZlcnNpb24gZm9yIDMyLWJpdCBhcHBsaWNhdGlvbnMgd2hpY2ggZG9lcwotICogbm90IGZvcmNlIE9fTEFSR0VGSUxFIG9uLgotICovCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfb3Blbihjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQotewotCWNoYXIgKiB0bXA7Ci0JaW50IGZkLCBlcnJvcjsKLQotCXRtcCA9IGdldG5hbWUoZmlsZW5hbWUpOwotCWZkID0gUFRSX0VSUih0bXApOwotCWlmICghSVNfRVJSKHRtcCkpIHsKLQkJZmQgPSBnZXRfdW51c2VkX2ZkKCk7Ci0JCWlmIChmZCA+PSAwKSB7Ci0JCQlzdHJ1Y3QgZmlsZSAqIGYgPSBmaWxwX29wZW4odG1wLCBmbGFncywgbW9kZSk7Ci0JCQllcnJvciA9IFBUUl9FUlIoZik7Ci0JCQlpZiAoSVNfRVJSKGYpKQotCQkJCWdvdG8gb3V0X2Vycm9yOwotCQkJZmRfaW5zdGFsbChmZCwgZik7Ci0JCX0KLW91dDoKLQkJcHV0bmFtZSh0bXApOwotCX0KLQlyZXR1cm4gZmQ7Ci0KLW91dF9lcnJvcjoKLQlwdXRfdW51c2VkX2ZkKGZkKTsKLQlmZCA9IGVycm9yOwotCWdvdG8gb3V0OwotfQotCiAvKiBOb3RlOiBpdCBpcyBuZWNlc3NhcnkgdG8gdHJlYXQgYnVmc2l6IGFzIGFuIHVuc2lnbmVkIGludCwKICAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY2FzdCB0byBhIHNpZ25lZCBpbnQgdG8gaW5zdXJlIHRoYXQgdGhlIAogICogcHJvcGVyIGNvbnZlcnNpb24gKHNpZ24gZXh0ZW5zaW9uKSBiZXR3ZWVuIHRoZSByZWdpc3RlciByZXByZXNlbnRhdGlvbiBvZiBhIHNpZ25lZCBpbnQgKG1zciBpbiAzMi1iaXQgbW9kZSkKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3N5c2NhbGxzLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9zeXNjYWxscy5jCmluZGV4IGE4Y2JiMjAuLjA1ZjE2NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3N5c2NhbGxzLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvc3lzY2FsbHMuYwpAQCAtNDYsMTAgKzQ2LDYgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgd2FsbF9qaWZmaWVzOwogCi12b2lkCi1jaGVja19idWdzKHZvaWQpCi17Ci19CiAKIC8qCiAgKiBzeXNfaXBjKCkgaXMgdGhlIGRlLW11bHRpcGxleGVyIGZvciB0aGUgU3lzViBJUEMgY2FsbHMuLgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvc3lzZnMuYyBiL2FyY2gvcHBjNjQva2VybmVsL3N5c2ZzLmMKaW5kZXggZjMxMWVlNy4uNjY1NGIzNSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvc3lzZnMuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9zeXNmcy5jCkBAIC0yMTUsMTggKzIxNSwyMyBAQAogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9NTUNSQSkpCiAJCXN5c2Rldl9jcmVhdGVfZmlsZShzLCAmYXR0cl9tbWNyYSk7CiAKLQlzeXNkZXZfY3JlYXRlX2ZpbGUocywgJmF0dHJfcG1jMSk7Ci0Jc3lzZGV2X2NyZWF0ZV9maWxlKHMsICZhdHRyX3BtYzIpOwotCXN5c2Rldl9jcmVhdGVfZmlsZShzLCAmYXR0cl9wbWMzKTsKLQlzeXNkZXZfY3JlYXRlX2ZpbGUocywgJmF0dHJfcG1jNCk7Ci0Jc3lzZGV2X2NyZWF0ZV9maWxlKHMsICZhdHRyX3BtYzUpOwotCXN5c2Rldl9jcmVhdGVfZmlsZShzLCAmYXR0cl9wbWM2KTsKLQotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9QTUM4KSkgeworCWlmIChjdXJfY3B1X3NwZWMtPm51bV9wbWNzID49IDEpCisJCXN5c2Rldl9jcmVhdGVfZmlsZShzLCAmYXR0cl9wbWMxKTsKKwlpZiAoY3VyX2NwdV9zcGVjLT5udW1fcG1jcyA+PSAyKQorCQlzeXNkZXZfY3JlYXRlX2ZpbGUocywgJmF0dHJfcG1jMik7CisJaWYgKGN1cl9jcHVfc3BlYy0+bnVtX3BtY3MgPj0gMykKKwkJc3lzZGV2X2NyZWF0ZV9maWxlKHMsICZhdHRyX3BtYzMpOworCWlmIChjdXJfY3B1X3NwZWMtPm51bV9wbWNzID49IDQpCisJCXN5c2Rldl9jcmVhdGVfZmlsZShzLCAmYXR0cl9wbWM0KTsKKwlpZiAoY3VyX2NwdV9zcGVjLT5udW1fcG1jcyA+PSA1KQorCQlzeXNkZXZfY3JlYXRlX2ZpbGUocywgJmF0dHJfcG1jNSk7CisJaWYgKGN1cl9jcHVfc3BlYy0+bnVtX3BtY3MgPj0gNikKKwkJc3lzZGV2X2NyZWF0ZV9maWxlKHMsICZhdHRyX3BtYzYpOworCWlmIChjdXJfY3B1X3NwZWMtPm51bV9wbWNzID49IDcpCiAJCXN5c2Rldl9jcmVhdGVfZmlsZShzLCAmYXR0cl9wbWM3KTsKKwlpZiAoY3VyX2NwdV9zcGVjLT5udW1fcG1jcyA+PSA4KQogCQlzeXNkZXZfY3JlYXRlX2ZpbGUocywgJmF0dHJfcG1jOCk7Ci0JfQotCisgIAogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TTVQpKQogCQlzeXNkZXZfY3JlYXRlX2ZpbGUocywgJmF0dHJfcHVycik7CiB9CkBAIC0yNTIsMTcgKzI1NywyMiBAQAogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9NTUNSQSkpCiAJCXN5c2Rldl9yZW1vdmVfZmlsZShzLCAmYXR0cl9tbWNyYSk7CiAKLQlzeXNkZXZfcmVtb3ZlX2ZpbGUocywgJmF0dHJfcG1jMSk7Ci0Jc3lzZGV2X3JlbW92ZV9maWxlKHMsICZhdHRyX3BtYzIpOwotCXN5c2Rldl9yZW1vdmVfZmlsZShzLCAmYXR0cl9wbWMzKTsKLQlzeXNkZXZfcmVtb3ZlX2ZpbGUocywgJmF0dHJfcG1jNCk7Ci0Jc3lzZGV2X3JlbW92ZV9maWxlKHMsICZhdHRyX3BtYzUpOwotCXN5c2Rldl9yZW1vdmVfZmlsZShzLCAmYXR0cl9wbWM2KTsKLQotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9QTUM4KSkgeworCWlmIChjdXJfY3B1X3NwZWMtPm51bV9wbWNzID49IDEpCisJCXN5c2Rldl9yZW1vdmVfZmlsZShzLCAmYXR0cl9wbWMxKTsKKwlpZiAoY3VyX2NwdV9zcGVjLT5udW1fcG1jcyA+PSAyKQorCQlzeXNkZXZfcmVtb3ZlX2ZpbGUocywgJmF0dHJfcG1jMik7CisJaWYgKGN1cl9jcHVfc3BlYy0+bnVtX3BtY3MgPj0gMykKKwkJc3lzZGV2X3JlbW92ZV9maWxlKHMsICZhdHRyX3BtYzMpOworCWlmIChjdXJfY3B1X3NwZWMtPm51bV9wbWNzID49IDQpCisJCXN5c2Rldl9yZW1vdmVfZmlsZShzLCAmYXR0cl9wbWM0KTsKKwlpZiAoY3VyX2NwdV9zcGVjLT5udW1fcG1jcyA+PSA1KQorCQlzeXNkZXZfcmVtb3ZlX2ZpbGUocywgJmF0dHJfcG1jNSk7CisJaWYgKGN1cl9jcHVfc3BlYy0+bnVtX3BtY3MgPj0gNikKKwkJc3lzZGV2X3JlbW92ZV9maWxlKHMsICZhdHRyX3BtYzYpOworCWlmIChjdXJfY3B1X3NwZWMtPm51bV9wbWNzID49IDcpCiAJCXN5c2Rldl9yZW1vdmVfZmlsZShzLCAmYXR0cl9wbWM3KTsKKwlpZiAoY3VyX2NwdV9zcGVjLT5udW1fcG1jcyA+PSA4KQogCQlzeXNkZXZfcmVtb3ZlX2ZpbGUocywgJmF0dHJfcG1jOCk7Ci0JfQogCiAJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1NNVCkpCiAJCXN5c2Rldl9yZW1vdmVfZmlsZShzLCAmYXR0cl9wdXJyKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvcHBjNjQva2VybmVsL3RpbWUuYwppbmRleCAxNjk2ZTFiLi45OTM5YzIwIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvdGltZS5jCkBAIC01MSw3ICs1MSw2IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KIAotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9udnJhbS5oPgpAQCAtMTI5LDcgKzEyOCw3IEBACiAgICAgICAgICAqIFdlIHNob3VsZCBoYXZlIGFuIHJ0YyBjYWxsIHRoYXQgb25seSBzZXRzIHRoZSBtaW51dGVzIGFuZAogICAgICAgICAgKiBzZWNvbmRzIGxpa2Ugb24gSW50ZWwgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBub24gVVRDIGNsb2Nrcy4KICAgICAgICAgICovCi0gICAgICAgIGlmICggKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorICAgICAgICBpZiAobnRwX3N5bmNlZCgpICYmCiAgICAgICAgICAgICAgeHRpbWUudHZfc2VjIC0gbGFzdF9ydGNfdXBkYXRlID49IDY1OSAmJgogICAgICAgICAgICAgIGFicygoeHRpbWUudHZfbnNlYy8xMDAwKSAtICgxMDAwMDAwLTEwMDAwMDAvSFopKSA8IDUwMDAwMC9IWiAmJgogICAgICAgICAgICAgIGppZmZpZXMgLSB3YWxsX2ppZmZpZXMgPT0gMSkgewpAQCAtNDM2LDEwICs0MzUsNyBAQAogCSAqLwogCWxhc3RfcnRjX3VwZGF0ZSA9IG5ld19zZWMgLSA2NTg7CiAKLQl0aW1lX2FkanVzdCA9IDA7ICAgICAgICAgICAgICAgIC8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLwotCXRpbWVfc3RhdHVzIHw9IFNUQV9VTlNZTkM7Ci0JdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKLQl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworCW50cF9jbGVhcigpOwogCiAJZGVsdGFfeHNlYyA9IG11bGhkdSggKHRiX2xhc3Rfc3RhbXAtZG9fZ3RvZC52YXJwLT50Yl9vcmlnX3N0YW1wKSwKIAkJCSAgICAgZG9fZ3RvZC52YXJwLT50Yl90b194cyApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcHBjNjQva2VybmVsL3RyYXBzLmMKaW5kZXggYThkNWU4My4uNzQ2N2FlNSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC90cmFwcy5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0yMjAsNyArMjIxLDcgQEAKIAlfZXhjZXB0aW9uKFNJR1RSQVAsIHJlZ3MsIFRSQVBfQlJLUFQsIHJlZ3MtPm5pcCk7CiB9CiAKLXZvaWQgc2luZ2xlX3N0ZXBfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQordm9pZCBfX2twcm9iZXMgc2luZ2xlX3N0ZXBfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXJlZ3MtPm1zciAmPSB+TVNSX1NFOyAgLyogVHVybiBvZmYgJ3RyYWNlJyBiaXQgKi8KIApAQCAtMzk4LDcgKzM5OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcHJvZ3JhbV9jaGVja19leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit2b2lkIF9fa3Byb2JlcyBwcm9ncmFtX2NoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpZiAoZGVidWdnZXJfZmF1bHRfaGFuZGxlcihyZWdzKSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvdTNfaW9tbXUuYyBiL2FyY2gvcHBjNjQva2VybmVsL3UzX2lvbW11LmMKaW5kZXggYjZlM2JjYS4uNDFlYTA5YyAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdTNfaW9tbXUuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC91M19pb21tdS5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIAlkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOwogCiAJaWYgKGRuKQotCQlkbi0+aW9tbXVfdGFibGUgPSAmaW9tbXVfdGFibGVfdTM7CisJCVBDSV9ETihkbiktPmlvbW11X3RhYmxlID0gJmlvbW11X3RhYmxlX3UzOwogfQogCiBzdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfdTMoc3RydWN0IHBjaV9idXMgKmJ1cykKQEAgLTI5MSw3ICsyOTEsNyBAQAogCWRuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cyk7CiAKIAlpZiAoZG4pCi0JCWRuLT5pb21tdV90YWJsZSA9ICZpb21tdV90YWJsZV91MzsKKwkJUENJX0ROKGRuKS0+aW9tbXVfdGFibGUgPSAmaW9tbXVfdGFibGVfdTM7CiB9CiAKIHN0YXRpYyB2b2lkIGlvbW11X2Rldl9zZXR1cF9udWxsKHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvdWRiZy5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvdWRiZy5jCmluZGV4IGMwZGE0NTUuLmQ0OWMzNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3VkYmcuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC91ZGJnLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogTlMxNjU1MCBTZXJpYWwgUG9ydCAodWFydCkgZGVidWdnaW5nIHN0dWZmLgorICogcG9sbGluZyBtb2RlIHN0YXRlbGVzcyBkZWJ1Z2dpbmcgc3R1ZmYsIG9yaWdpbmFsbHkgZm9yIE5TMTY1NTAgU2VyaWFsIFBvcnRzCiAgKgogICogYyAyMDAxIFBQQyA2NCBUZWFtLCBJQk0gQ29ycAogICoKQEAgLTEzLDI0OSArMTMsMjQgQEAKICNkZWZpbmUgV0FOVF9QUENEQkdfVEFCIC8qIE9ubHkgZGVmaW5lZCBoZXJlICovCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxhc20vcHBjZGVidWcuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgogCi1leHRlcm4gdTggcmVhbF9yZWFkYih2b2xhdGlsZSB1OCBfX2lvbWVtICAqYWRkcik7Ci1leHRlcm4gdm9pZCByZWFsX3dyaXRlYih1OCBkYXRhLCB2b2xhdGlsZSB1OCBfX2lvbWVtICphZGRyKTsKK3ZvaWQgKCp1ZGJnX3B1dGMpKHVuc2lnbmVkIGNoYXIgYyk7Cit1bnNpZ25lZCBjaGFyICgqdWRiZ19nZXRjKSh2b2lkKTsKK2ludCAoKnVkYmdfZ2V0Y19wb2xsKSh2b2lkKTsKIAotc3RydWN0IE5TMTY1NTAgewotCS8qIHRoaXMgc3RydWN0IG11c3QgYmUgcGFja2VkICovCi0JdW5zaWduZWQgY2hhciByYnI7ICAvKiAwICovCi0JdW5zaWduZWQgY2hhciBpZXI7ICAvKiAxICovCi0JdW5zaWduZWQgY2hhciBmY3I7ICAvKiAyICovCi0JdW5zaWduZWQgY2hhciBsY3I7ICAvKiAzICovCi0JdW5zaWduZWQgY2hhciBtY3I7ICAvKiA0ICovCi0JdW5zaWduZWQgY2hhciBsc3I7ICAvKiA1ICovCi0JdW5zaWduZWQgY2hhciBtc3I7ICAvKiA2ICovCi0JdW5zaWduZWQgY2hhciBzY3I7ICAvKiA3ICovCi19OwotCi0jZGVmaW5lIHRociByYnIKLSNkZWZpbmUgaWlyIGZjcgotI2RlZmluZSBkbGwgcmJyCi0jZGVmaW5lIGRsbSBpZXIKLSNkZWZpbmUgZGxhYiBsY3IKLQotI2RlZmluZSBMU1JfRFIgICAweDAxICAvKiBEYXRhIHJlYWR5ICovCi0jZGVmaW5lIExTUl9PRSAgIDB4MDIgIC8qIE92ZXJydW4gKi8KLSNkZWZpbmUgTFNSX1BFICAgMHgwNCAgLyogUGFyaXR5IGVycm9yICovCi0jZGVmaW5lIExTUl9GRSAgIDB4MDggIC8qIEZyYW1pbmcgZXJyb3IgKi8KLSNkZWZpbmUgTFNSX0JJICAgMHgxMCAgLyogQnJlYWsgKi8KLSNkZWZpbmUgTFNSX1RIUkUgMHgyMCAgLyogWG1pdCBob2xkaW5nIHJlZ2lzdGVyIGVtcHR5ICovCi0jZGVmaW5lIExTUl9URU1UIDB4NDAgIC8qIFhtaXR0ZXIgZW1wdHkgKi8KLSNkZWZpbmUgTFNSX0VSUiAgMHg4MCAgLyogRXJyb3IgKi8KLQotc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBOUzE2NTUwIF9faW9tZW0gKnVkYmdfY29tcG9ydDsKLQotdm9pZCB1ZGJnX2luaXRfdWFydCh2b2lkIF9faW9tZW0gKmNvbXBvcnQsIHVuc2lnbmVkIGludCBzcGVlZCkKLXsKLQl1MTYgZGxsID0gc3BlZWQgPyAoMTE1MjAwIC8gc3BlZWQpIDogMTI7Ci0KLQlpZiAoY29tcG9ydCkgewotCQl1ZGJnX2NvbXBvcnQgPSAoc3RydWN0IE5TMTY1NTAgX19pb21lbSAqKWNvbXBvcnQ7Ci0JCW91dF84KCZ1ZGJnX2NvbXBvcnQtPmxjciwgMHgwMCk7Ci0JCW91dF84KCZ1ZGJnX2NvbXBvcnQtPmllciwgMHhmZik7Ci0JCW91dF84KCZ1ZGJnX2NvbXBvcnQtPmllciwgMHgwMCk7Ci0JCW91dF84KCZ1ZGJnX2NvbXBvcnQtPmxjciwgMHg4MCk7CS8qIEFjY2VzcyBiYXVkIHJhdGUgKi8KLQkJb3V0XzgoJnVkYmdfY29tcG9ydC0+ZGxsLCBkbGwgJiAweGZmKTsJLyogMSA9IDExNTIwMCwgIDIgPSA1NzYwMCwKLQkJCQkJCQkgICAzID0gMzg0MDAsIDEyID0gOTYwMCBiYXVkICovCi0JCW91dF84KCZ1ZGJnX2NvbXBvcnQtPmRsbSwgZGxsID4+IDgpOwkvKiBkbGwgPj4gOCB3aGljaCBzaG91bGQgYmUgemVybwotCQkJCQkJCSAgIGZvciBmYXN0IHJhdGVzOyAqLwotCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5sY3IsIDB4MDMpOwkvKiA4IGRhdGEsIDEgc3RvcCwgbm8gcGFyaXR5ICovCi0JCW91dF84KCZ1ZGJnX2NvbXBvcnQtPm1jciwgMHgwMyk7CS8qIFJUUy9EVFIgKi8KLQkJb3V0XzgoJnVkYmdfY29tcG9ydC0+ZmNyICwweDA3KTsJLyogQ2xlYXIgJiBlbmFibGUgRklGT3MgKi8KLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfUFBDX1BNQUMKLQotI2RlZmluZQlTQ0NfVFhSRFkJNAotI2RlZmluZSBTQ0NfUlhSRFkJMQotCi1zdGF0aWMgdm9sYXRpbGUgdTggX19pb21lbSAqc2NjYzsKLXN0YXRpYyB2b2xhdGlsZSB1OCBfX2lvbWVtICpzY2NkOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzY2NfaW5pdHRhYltdID0gewotICAgIDEzLCAwLAkJLyogc2V0IGJhdWQgcmF0ZSBkaXZpc29yICovCi0gICAgMTIsIDAsCi0gICAgMTQsIDEsCQkvKiBiYXVkIHJhdGUgZ2VuIGVuYWJsZSwgc3JjPXJ0eGMgKi8KLSAgICAxMSwgMHg1MCwJCS8qIGNsb2NrcyA9IGJyIGdlbiAqLwotICAgIDUsICAweGVhLAkJLyogdHggOCBiaXRzLCBhc3NlcnQgRFRSICYgUlRTICovCi0gICAgNCwgIDB4NDYsCQkvKiB4MTYgY2xvY2ssIDEgc3RvcCAqLwotICAgIDMsICAweGMxLAkJLyogcnggZW5hYmxlLCA4IGJpdHMgKi8KLX07Ci0KLXZvaWQgdWRiZ19pbml0X3NjYyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCXUzMiAqcmVnOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlpbnQgaSwgeDsKLQotCWlmIChucCA9PSBOVUxMKQotCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJlc2NjIik7Ci0JaWYgKG5wID09IE5VTEwgfHwgbnAtPnBhcmVudCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQl1ZGJnX3ByaW50ZigiZm91bmQgU0NDLi4uXG4iKTsKLQkvKiBHZXQgYWRkcmVzcyB3aXRoaW4gbWFjLWlvIEFTSUMgKi8gCi0JcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwotCWlmIChyZWcgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWFkZHIgPSByZWdbMF07Ci0JdWRiZ19wcmludGYoImxvY2FsIGFkZHI6ICVseFxuIiwgYWRkcik7Ci0JLyogR2V0IGFkZHJlc3Mgb2YgbWFjLWlvIFBDSSBpdHNlbGYgKi8KLQlyZWcgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLT5wYXJlbnQsICJhc3NpZ25lZC1hZGRyZXNzZXMiLCBOVUxMKTsKLQlpZiAocmVnID09IE5VTEwpCi0JCXJldHVybjsKLQlhZGRyICs9IHJlZ1syXTsKLQl1ZGJnX3ByaW50ZigiZmluYWwgYWRkcjogJWx4XG4iLCBhZGRyKTsKLQotCS8qIFNldHVwIGZvciA1NzYwMCA4TjEgKi8KLQlhZGRyICs9IDB4MjA7Ci0Jc2NjYyA9ICh2b2xhdGlsZSB1OCAqIF9faW9tZW0pIGlvcmVtYXAoYWRkciAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKSA7Ci0Jc2NjYyArPSBhZGRyICYgflBBR0VfTUFTSzsKLQlzY2NkID0gc2NjYyArIDB4MTA7Ci0KLQl1ZGJnX3ByaW50ZigiaW9yZW1hcCByZXN1bHQgc2NjYzogJXBcbiIsIHNjY2MpOwotCW1iKCk7Ci0KLQlmb3IgKGkgPSAyMDAwMDsgaSAhPSAwOyAtLWkpCi0JCXggPSBpbl84KHNjY2MpOwotCW91dF84KHNjY2MsIDB4MDkpOwkJLyogcmVzZXQgQSBvciBCIHNpZGUgKi8KLQlvdXRfOChzY2NjLCAweGMwKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNjY19pbml0dGFiKTsgKytpKQotCQlvdXRfOChzY2NjLCBzY2NfaW5pdHRhYltpXSk7Ci0KLQlwcGNfbWQudWRiZ19wdXRjID0gdWRiZ19wdXRjOwotCXBwY19tZC51ZGJnX2dldGMgPSB1ZGJnX2dldGM7Ci0JcHBjX21kLnVkYmdfZ2V0Y19wb2xsID0gdWRiZ19nZXRjX3BvbGw7Ci0KLQl1ZGJnX3B1dHMoIkhlbGxvIFdvcmxkICFcbiIpOwotfQotCi0jZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCi0KLSNpZmRlZiBDT05GSUdfUFBDX1BNQUMKLXN0YXRpYyB2b2lkIHVkYmdfcmVhbF9wdXRjKHVuc2lnbmVkIGNoYXIgYykKLXsKLQl3aGlsZSAoKHJlYWxfcmVhZGIoc2NjYykgJiBTQ0NfVFhSRFkpID09IDApCi0JCTsKLQlyZWFsX3dyaXRlYihjLCBzY2NkKTsKLQlpZiAoYyA9PSAnXG4nKQotCQl1ZGJnX3JlYWxfcHV0YygnXHInKTsKLX0KLQotdm9pZCB1ZGJnX2luaXRfcG1hY19yZWFsbW9kZSh2b2lkKQotewotCXNjY2MgPSAodm9sYXRpbGUgdTggX19pb21lbSAqKTB4ODAwMTMwMjB1bDsKLQlzY2NkID0gKHZvbGF0aWxlIHU4IF9faW9tZW0gKikweDgwMDEzMDMwdWw7Ci0KLQlwcGNfbWQudWRiZ19wdXRjID0gdWRiZ19yZWFsX3B1dGM7Ci0JcHBjX21kLnVkYmdfZ2V0YyA9IE5VTEw7Ci0JcHBjX21kLnVkYmdfZ2V0Y19wb2xsID0gTlVMTDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KLQotI2lmZGVmIENPTkZJR19QUENfTUFQTEUKLXZvaWQgdWRiZ19tYXBsZV9yZWFsX3B1dGModW5zaWduZWQgY2hhciBjKQotewotCWlmICh1ZGJnX2NvbXBvcnQpIHsKLQkJd2hpbGUgKChyZWFsX3JlYWRiKCZ1ZGJnX2NvbXBvcnQtPmxzcikgJiBMU1JfVEhSRSkgPT0gMCkKLQkJCS8qIHdhaXQgZm9yIGlkbGUgKi87Ci0JCXJlYWxfd3JpdGViKGMsICZ1ZGJnX2NvbXBvcnQtPnRocik7IGVpZWlvKCk7Ci0JCWlmIChjID09ICdcbicpIHsKLQkJCS8qIEFsc28gcHV0IGEgQ1IuICBUaGlzIGlzIGZvciBjb252ZW5pZW5jZS4gKi8KLQkJCXdoaWxlICgocmVhbF9yZWFkYigmdWRiZ19jb21wb3J0LT5sc3IpICYgTFNSX1RIUkUpID09IDApCi0JCQkJLyogd2FpdCBmb3IgaWRsZSAqLzsKLQkJCXJlYWxfd3JpdGViKCdccicsICZ1ZGJnX2NvbXBvcnQtPnRocik7IGVpZWlvKCk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgdWRiZ19pbml0X21hcGxlX3JlYWxtb2RlKHZvaWQpCi17Ci0JdWRiZ19jb21wb3J0ID0gKHZvbGF0aWxlIHN0cnVjdCBOUzE2NTUwIF9faW9tZW0gKikweGY0MDAwM2Y4OwotCi0JcHBjX21kLnVkYmdfcHV0YyA9IHVkYmdfbWFwbGVfcmVhbF9wdXRjOwotCXBwY19tZC51ZGJnX2dldGMgPSBOVUxMOwotCXBwY19tZC51ZGJnX2dldGNfcG9sbCA9IE5VTEw7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19NQVBMRSAqLwotCi12b2lkIHVkYmdfcHV0Yyh1bnNpZ25lZCBjaGFyIGMpCi17Ci0JaWYgKHVkYmdfY29tcG9ydCkgewotCQl3aGlsZSAoKGluXzgoJnVkYmdfY29tcG9ydC0+bHNyKSAmIExTUl9USFJFKSA9PSAwKQotCQkJLyogd2FpdCBmb3IgaWRsZSAqLzsKLQkJb3V0XzgoJnVkYmdfY29tcG9ydC0+dGhyLCBjKTsKLQkJaWYgKGMgPT0gJ1xuJykgewotCQkJLyogQWxzbyBwdXQgYSBDUi4gIFRoaXMgaXMgZm9yIGNvbnZlbmllbmNlLiAqLwotCQkJd2hpbGUgKChpbl84KCZ1ZGJnX2NvbXBvcnQtPmxzcikgJiBMU1JfVEhSRSkgPT0gMCkKLQkJCQkvKiB3YWl0IGZvciBpZGxlICovOyAKLQkJCW91dF84KCZ1ZGJnX2NvbXBvcnQtPnRociwgJ1xyJyk7Ci0JCX0KLQl9Ci0jaWZkZWYgQ09ORklHX1BQQ19QTUFDCi0JZWxzZSBpZiAoc2NjYykgewotCQl3aGlsZSAoKGluXzgoc2NjYykgJiBTQ0NfVFhSRFkpID09IDApCi0JCQk7Ci0JCW91dF84KHNjY2QsICBjKTsJCQotCQlpZiAoYyA9PSAnXG4nKQotCQkJdWRiZ19wdXRjKCdccicpOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KLX0KLQotaW50IHVkYmdfZ2V0Y19wb2xsKHZvaWQpCi17Ci0JaWYgKHVkYmdfY29tcG9ydCkgewotCQlpZiAoKGluXzgoJnVkYmdfY29tcG9ydC0+bHNyKSAmIExTUl9EUikgIT0gMCkKLQkJCXJldHVybiBpbl84KCZ1ZGJnX2NvbXBvcnQtPnJicik7Ci0JCWVsc2UKLQkJCXJldHVybiAtMTsKLQl9Ci0jaWZkZWYgQ09ORklHX1BQQ19QTUFDCi0JZWxzZSBpZiAoc2NjYykgewotCQlpZiAoKGluXzgoc2NjYykgJiBTQ0NfUlhSRFkpICE9IDApCi0JCQlyZXR1cm4gaW5fOChzY2NkKTsKLQkJZWxzZQotCQkJcmV0dXJuIC0xOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KLQlyZXR1cm4gLTE7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgdWRiZ19nZXRjKHZvaWQpCi17Ci0JaWYgKHVkYmdfY29tcG9ydCkgewotCQl3aGlsZSAoKGluXzgoJnVkYmdfY29tcG9ydC0+bHNyKSAmIExTUl9EUikgPT0gMCkKLQkJCS8qIHdhaXQgZm9yIGNoYXIgKi87Ci0JCXJldHVybiBpbl84KCZ1ZGJnX2NvbXBvcnQtPnJicik7Ci0JfQotI2lmZGVmIENPTkZJR19QUENfUE1BQwotCWVsc2UgaWYgKHNjY2MpIHsKLQkJd2hpbGUgKChpbl84KHNjY2MpICYgU0NDX1JYUkRZKSA9PSAwKQotCQkJOwotCQlyZXR1cm4gaW5fOChzY2NkKTsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCi0JcmV0dXJuIDA7Ci19Ci0KKy8qIHVkYmcgbGlicmFyeSwgdXNlZCBieSB4bW9uIGV0IGFsICovCiB2b2lkIHVkYmdfcHV0cyhjb25zdCBjaGFyICpzKQogewotCWlmIChwcGNfbWQudWRiZ19wdXRjKSB7CisJaWYgKHVkYmdfcHV0YykgewogCQljaGFyIGM7CiAKIAkJaWYgKHMgJiYgKnMgIT0gJ1wwJykgewogCQkJd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykKLQkJCQlwcGNfbWQudWRiZ19wdXRjKGMpOworCQkJCXVkYmdfcHV0YyhjKTsKIAkJfQogCX0KICNpZiAwCkBAIC0yNzAsMTIgKzQ1LDEyIEBACiAJaW50IHJlbWFpbiA9IG47CiAJY2hhciBjOwogCi0JaWYgKCFwcGNfbWQudWRiZ19wdXRjKQorCWlmICghdWRiZ19wdXRjKQogCQlyZXR1cm4gMDsKIAogCWlmIChzICYmICpzICE9ICdcMCcpIHsKIAkJd2hpbGUgKCgoYyA9ICpzKyspICE9ICdcMCcpICYmIChyZW1haW4tLSA+IDApKSB7Ci0JCQlwcGNfbWQudWRiZ19wdXRjKGMpOworCQkJdWRiZ19wdXRjKGMpOwogCQl9CiAJfQogCkBAIC0yODcsMTIgKzYyLDEyIEBACiAJY2hhciBjLCAqcCA9IGJ1ZjsKIAlpbnQgaTsKIAotCWlmICghcHBjX21kLnVkYmdfZ2V0YykKKwlpZiAoIXVkYmdfZ2V0YykKIAkJcmV0dXJuIDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYnVmbGVuOyArK2kpIHsKIAkJZG8gewotCQkJYyA9IHBwY19tZC51ZGJnX2dldGMoKTsKKwkJCWMgPSB1ZGJnX2dldGMoKTsKIAkJfSB3aGlsZSAoYyA9PSAweDExIHx8IGMgPT0gMHgxMyk7CiAJCWlmIChjID09IDApCiAJCQlicmVhazsKQEAgLTMwMiwxMSArNzcsNiBAQAogCXJldHVybiBpOwogfQogCi12b2lkIHVkYmdfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY29uLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgbikKLXsKLQl1ZGJnX3dyaXRlKHMsIG4pOwotfQotCiAjZGVmaW5lIFVEQkdfQlVGU0laRSAyNTYKIHZvaWQgdWRiZ19wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CkBAIC0zMTksNiArODksMTAgQEAKIAl2YV9lbmQoYXJncyk7CiB9CiAKKy8qIFBQQ0RCRyBzdHVmZiAqLworCit1NjQgcHBjNjRfZGVidWdfc3dpdGNoOworCiAvKiBTcGVjaWFsIHByaW50IHVzZWQgYnkgUFBDREJHKCkgbWFjcm8gKi8KIHZvaWQgdWRiZ19wcGNkYmcodW5zaWduZWQgbG9uZyBkZWJ1Z19mbGFncywgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CkBAIC0zNTgsMyArMTMyLDQ5IEBACiB7CiAJcmV0dXJuIChmbGFncyAmIHBwYzY0X2RlYnVnX3N3aXRjaCk7CiB9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBQUENEQkcgc3RhdGUuICBDYWxsZWQgYmVmb3JlIHJlbG9jYXRpb24gaGFzIGJlZW4gZW5hYmxlZC4KKyAqLwordm9pZCBfX2luaXQgcHBjZGJnX2luaXRpYWxpemUodm9pZCkKK3sKKwlwcGM2NF9kZWJ1Z19zd2l0Y2ggPSBQUENfREVCVUdfREVGQVVMVDsgLyogfCBQUENEQkdfQlVTV0FMSyB8ICovCisJLyogUFBDREJHX1BIQklOSVQgfCBQUENEQkdfTU0gfCBQUENEQkdfTU1JTklUIHwgUFBDREJHX1RDRUlOSVQgfCBQUENEQkdfVENFICovOworfQorCisvKgorICogRWFybHkgYm9vdCBjb25zb2xlIGJhc2VkIG9uIHVkYmcKKyAqLworc3RhdGljIHZvaWQgdWRiZ19jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjb24sIGNvbnN0IGNoYXIgKnMsCisJCXVuc2lnbmVkIGludCBuKQoreworCXVkYmdfd3JpdGUocywgbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSB1ZGJnX2NvbnNvbGUgPSB7CisJLm5hbWUJPSAidWRiZyIsCisJLndyaXRlCT0gdWRiZ19jb25zb2xlX3dyaXRlLAorCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJPSAtMSwKK307CisKK3N0YXRpYyBpbnQgZWFybHlfY29uc29sZV9pbml0aWFsaXplZDsKKwordm9pZCBfX2luaXQgZGlzYWJsZV9lYXJseV9wcmludGsodm9pZCkKK3sKKwlpZiAoIWVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKwl1bnJlZ2lzdGVyX2NvbnNvbGUoJnVkYmdfY29uc29sZSk7CisJZWFybHlfY29uc29sZV9pbml0aWFsaXplZCA9IDA7Cit9CisKKy8qIGNhbGxlZCBieSBzZXR1cF9zeXN0ZW0gKi8KK3ZvaWQgcmVnaXN0ZXJfZWFybHlfdWRiZ19jb25zb2xlKHZvaWQpCit7CisJZWFybHlfY29uc29sZV9pbml0aWFsaXplZCA9IDE7CisJcmVnaXN0ZXJfY29uc29sZSgmdWRiZ19jb25zb2xlKTsKK30KKworI2lmIDAgICAvKiBpZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBhcyBhIHJlZ3VsYXIgb3V0cHV0IGNvbnNvbGUgKi8KK2NvbnNvbGVfaW5pdGNhbGwocmVnaXN0ZXJfdWRiZ19jb25zb2xlKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvdWRiZ18xNjU1MC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvdWRiZ18xNjU1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTM1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3BwYzY0L2tlcm5lbC91ZGJnXzE2NTUwLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiB1ZGJnIGZvciBmb3IgTlMxNjU1MCBjb21wYXRhYmxlIHNlcmlhbCBwb3J0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IFBQQyA2NCBUZWFtLCBJQk0gQ29ycAorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworZXh0ZXJuIHU4IHJlYWxfcmVhZGIodm9sYXRpbGUgdTggX19pb21lbSAgKmFkZHIpOworZXh0ZXJuIHZvaWQgcmVhbF93cml0ZWIodTggZGF0YSwgdm9sYXRpbGUgdTggX19pb21lbSAqYWRkcik7CisKK3N0cnVjdCBOUzE2NTUwIHsKKwkvKiB0aGlzIHN0cnVjdCBtdXN0IGJlIHBhY2tlZCAqLworCXVuc2lnbmVkIGNoYXIgcmJyOyAgLyogMCAqLworCXVuc2lnbmVkIGNoYXIgaWVyOyAgLyogMSAqLworCXVuc2lnbmVkIGNoYXIgZmNyOyAgLyogMiAqLworCXVuc2lnbmVkIGNoYXIgbGNyOyAgLyogMyAqLworCXVuc2lnbmVkIGNoYXIgbWNyOyAgLyogNCAqLworCXVuc2lnbmVkIGNoYXIgbHNyOyAgLyogNSAqLworCXVuc2lnbmVkIGNoYXIgbXNyOyAgLyogNiAqLworCXVuc2lnbmVkIGNoYXIgc2NyOyAgLyogNyAqLworfTsKKworI2RlZmluZSB0aHIgcmJyCisjZGVmaW5lIGlpciBmY3IKKyNkZWZpbmUgZGxsIHJicgorI2RlZmluZSBkbG0gaWVyCisjZGVmaW5lIGRsYWIgbGNyCisKKyNkZWZpbmUgTFNSX0RSICAgMHgwMSAgLyogRGF0YSByZWFkeSAqLworI2RlZmluZSBMU1JfT0UgICAweDAyICAvKiBPdmVycnVuICovCisjZGVmaW5lIExTUl9QRSAgIDB4MDQgIC8qIFBhcml0eSBlcnJvciAqLworI2RlZmluZSBMU1JfRkUgICAweDA4ICAvKiBGcmFtaW5nIGVycm9yICovCisjZGVmaW5lIExTUl9CSSAgIDB4MTAgIC8qIEJyZWFrICovCisjZGVmaW5lIExTUl9USFJFIDB4MjAgIC8qIFhtaXQgaG9sZGluZyByZWdpc3RlciBlbXB0eSAqLworI2RlZmluZSBMU1JfVEVNVCAweDQwICAvKiBYbWl0dGVyIGVtcHR5ICovCisjZGVmaW5lIExTUl9FUlIgIDB4ODAgIC8qIEVycm9yICovCisKK3N0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgTlMxNjU1MCBfX2lvbWVtICp1ZGJnX2NvbXBvcnQ7CisKK3N0YXRpYyB2b2lkIHVkYmdfNTUwX3B1dGModW5zaWduZWQgY2hhciBjKQoreworCWlmICh1ZGJnX2NvbXBvcnQpIHsKKwkJd2hpbGUgKChpbl84KCZ1ZGJnX2NvbXBvcnQtPmxzcikgJiBMU1JfVEhSRSkgPT0gMCkKKwkJCS8qIHdhaXQgZm9yIGlkbGUgKi87CisJCW91dF84KCZ1ZGJnX2NvbXBvcnQtPnRociwgYyk7CisJCWlmIChjID09ICdcbicpCisJCQl1ZGJnXzU1MF9wdXRjKCdccicpOworCX0KK30KKworc3RhdGljIGludCB1ZGJnXzU1MF9nZXRjX3BvbGwodm9pZCkKK3sKKwlpZiAodWRiZ19jb21wb3J0KSB7CisJCWlmICgoaW5fOCgmdWRiZ19jb21wb3J0LT5sc3IpICYgTFNSX0RSKSAhPSAwKQorCQkJcmV0dXJuIGluXzgoJnVkYmdfY29tcG9ydC0+cmJyKTsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHVkYmdfNTUwX2dldGModm9pZCkKK3sKKwlpZiAodWRiZ19jb21wb3J0KSB7CisJCXdoaWxlICgoaW5fOCgmdWRiZ19jb21wb3J0LT5sc3IpICYgTFNSX0RSKSA9PSAwKQorCQkJLyogd2FpdCBmb3IgY2hhciAqLzsKKwkJcmV0dXJuIGluXzgoJnVkYmdfY29tcG9ydC0+cmJyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdWRiZ19pbml0X3VhcnQodm9pZCBfX2lvbWVtICpjb21wb3J0LCB1bnNpZ25lZCBpbnQgc3BlZWQpCit7CisJdTE2IGRsbCA9IHNwZWVkID8gKDExNTIwMCAvIHNwZWVkKSA6IDEyOworCisJaWYgKGNvbXBvcnQpIHsKKwkJdWRiZ19jb21wb3J0ID0gKHN0cnVjdCBOUzE2NTUwIF9faW9tZW0gKiljb21wb3J0OworCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5sY3IsIDB4MDApOworCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5pZXIsIDB4ZmYpOworCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5pZXIsIDB4MDApOworCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5sY3IsIDB4ODApOwkvKiBBY2Nlc3MgYmF1ZCByYXRlICovCisJCW91dF84KCZ1ZGJnX2NvbXBvcnQtPmRsbCwgZGxsICYgMHhmZik7CS8qIDEgPSAxMTUyMDAsICAyID0gNTc2MDAsCisJCQkJCQkJICAgMyA9IDM4NDAwLCAxMiA9IDk2MDAgYmF1ZCAqLworCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5kbG0sIGRsbCA+PiA4KTsJLyogZGxsID4+IDggd2hpY2ggc2hvdWxkIGJlIHplcm8KKwkJCQkJCQkgICBmb3IgZmFzdCByYXRlczsgKi8KKwkJb3V0XzgoJnVkYmdfY29tcG9ydC0+bGNyLCAweDAzKTsJLyogOCBkYXRhLCAxIHN0b3AsIG5vIHBhcml0eSAqLworCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5tY3IsIDB4MDMpOwkvKiBSVFMvRFRSICovCisJCW91dF84KCZ1ZGJnX2NvbXBvcnQtPmZjciAsMHgwNyk7CS8qIENsZWFyICYgZW5hYmxlIEZJRk9zICovCisJCXVkYmdfcHV0YyA9IHVkYmdfNTUwX3B1dGM7CisJCXVkYmdfZ2V0YyA9IHVkYmdfNTUwX2dldGM7CisJCXVkYmdfZ2V0Y19wb2xsID0gdWRiZ181NTBfZ2V0Y19wb2xsOworCX0KK30KKworI2lmZGVmIENPTkZJR19QUENfTUFQTEUKK3ZvaWQgdWRiZ19tYXBsZV9yZWFsX3B1dGModW5zaWduZWQgY2hhciBjKQoreworCWlmICh1ZGJnX2NvbXBvcnQpIHsKKwkJd2hpbGUgKChyZWFsX3JlYWRiKCZ1ZGJnX2NvbXBvcnQtPmxzcikgJiBMU1JfVEhSRSkgPT0gMCkKKwkJCS8qIHdhaXQgZm9yIGlkbGUgKi87CisJCXJlYWxfd3JpdGViKGMsICZ1ZGJnX2NvbXBvcnQtPnRocik7IGVpZWlvKCk7CisJCWlmIChjID09ICdcbicpCisJCQl1ZGJnX21hcGxlX3JlYWxfcHV0YygnXHInKTsKKwl9Cit9CisKK3ZvaWQgdWRiZ19pbml0X21hcGxlX3JlYWxtb2RlKHZvaWQpCit7CisJdWRiZ19jb21wb3J0ID0gKHZvbGF0aWxlIHN0cnVjdCBOUzE2NTUwIF9faW9tZW0gKikweGY0MDAwM2Y4OworCisJdWRiZ19wdXRjID0gdWRiZ19tYXBsZV9yZWFsX3B1dGM7CisJdWRiZ19nZXRjID0gTlVMTDsKKwl1ZGJnX2dldGNfcG9sbCA9IE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQQ19NQVBMRSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvdWRiZ19zY2MuYyBiL2FyY2gvcHBjNjQva2VybmVsL3VkYmdfc2NjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3ZmQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3VkYmdfc2NjLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiB1ZGJnIGZvciBmb3Igemlsb2cgc2NjIHBvcnRzIGFzIGZvdW5kIG9uIEFwcGxlIFBvd2VyTWFjcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IFBQQyA2NCBUZWFtLCBJQk0gQ29ycAorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL25hY2EuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KKworZXh0ZXJuIHU4IHJlYWxfcmVhZGIodm9sYXRpbGUgdTggX19pb21lbSAgKmFkZHIpOworZXh0ZXJuIHZvaWQgcmVhbF93cml0ZWIodTggZGF0YSwgdm9sYXRpbGUgdTggX19pb21lbSAqYWRkcik7CisKKyNkZWZpbmUJU0NDX1RYUkRZCTQKKyNkZWZpbmUgU0NDX1JYUkRZCTEKKworc3RhdGljIHZvbGF0aWxlIHU4IF9faW9tZW0gKnNjY2M7CitzdGF0aWMgdm9sYXRpbGUgdTggX19pb21lbSAqc2NjZDsKKworc3RhdGljIHZvaWQgdWRiZ19zY2NfcHV0Yyh1bnNpZ25lZCBjaGFyIGMpCit7CisJaWYgKHNjY2MpIHsKKwkJd2hpbGUgKChpbl84KHNjY2MpICYgU0NDX1RYUkRZKSA9PSAwKQorCQkJOworCQlvdXRfOChzY2NkLCAgYyk7CisJCWlmIChjID09ICdcbicpCisJCQl1ZGJnX3NjY19wdXRjKCdccicpOworCX0KK30KKworc3RhdGljIGludCB1ZGJnX3NjY19nZXRjX3BvbGwodm9pZCkKK3sKKwlpZiAoc2NjYykgeworCQlpZiAoKGluXzgoc2NjYykgJiBTQ0NfUlhSRFkpICE9IDApCisJCQlyZXR1cm4gaW5fOChzY2NkKTsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHVkYmdfc2NjX2dldGModm9pZCkKK3sKKwlpZiAoc2NjYykgeworCQl3aGlsZSAoKGluXzgoc2NjYykgJiBTQ0NfUlhSRFkpID09IDApCisJCQk7CisJCXJldHVybiBpbl84KHNjY2QpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2NjX2luaXR0YWJbXSA9IHsKKyAgICAxMywgMCwJCS8qIHNldCBiYXVkIHJhdGUgZGl2aXNvciAqLworICAgIDEyLCAwLAorICAgIDE0LCAxLAkJLyogYmF1ZCByYXRlIGdlbiBlbmFibGUsIHNyYz1ydHhjICovCisgICAgMTEsIDB4NTAsCQkvKiBjbG9ja3MgPSBiciBnZW4gKi8KKyAgICA1LCAgMHhlYSwJCS8qIHR4IDggYml0cywgYXNzZXJ0IERUUiAmIFJUUyAqLworICAgIDQsICAweDQ2LAkJLyogeDE2IGNsb2NrLCAxIHN0b3AgKi8KKyAgICAzLCAgMHhjMSwJCS8qIHJ4IGVuYWJsZSwgOCBiaXRzICovCit9OworCit2b2lkIHVkYmdfaW5pdF9zY2Moc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwl1MzIgKnJlZzsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IGksIHg7CisKKwlpZiAobnAgPT0gTlVMTCkKKwkJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiZXNjYyIpOworCWlmIChucCA9PSBOVUxMIHx8IG5wLT5wYXJlbnQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJdWRiZ19wcmludGYoImZvdW5kIFNDQy4uLlxuIik7CisJLyogR2V0IGFkZHJlc3Mgd2l0aGluIG1hYy1pbyBBU0lDICovCisJcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCWlmIChyZWcgPT0gTlVMTCkKKwkJcmV0dXJuOworCWFkZHIgPSByZWdbMF07CisJdWRiZ19wcmludGYoImxvY2FsIGFkZHI6ICVseFxuIiwgYWRkcik7CisJLyogR2V0IGFkZHJlc3Mgb2YgbWFjLWlvIFBDSSBpdHNlbGYgKi8KKwlyZWcgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLT5wYXJlbnQsICJhc3NpZ25lZC1hZGRyZXNzZXMiLCBOVUxMKTsKKwlpZiAocmVnID09IE5VTEwpCisJCXJldHVybjsKKwlhZGRyICs9IHJlZ1syXTsKKwl1ZGJnX3ByaW50ZigiZmluYWwgYWRkcjogJWx4XG4iLCBhZGRyKTsKKworCS8qIFNldHVwIGZvciA1NzYwMCA4TjEgKi8KKwlhZGRyICs9IDB4MjA7CisJc2NjYyA9ICh2b2xhdGlsZSB1OCAqIF9faW9tZW0pIGlvcmVtYXAoYWRkciAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKSA7CisJc2NjYyArPSBhZGRyICYgflBBR0VfTUFTSzsKKwlzY2NkID0gc2NjYyArIDB4MTA7CisKKwl1ZGJnX3ByaW50ZigiaW9yZW1hcCByZXN1bHQgc2NjYzogJXBcbiIsIHNjY2MpOworCW1iKCk7CisKKwlmb3IgKGkgPSAyMDAwMDsgaSAhPSAwOyAtLWkpCisJCXggPSBpbl84KHNjY2MpOworCW91dF84KHNjY2MsIDB4MDkpOwkJLyogcmVzZXQgQSBvciBCIHNpZGUgKi8KKwlvdXRfOChzY2NjLCAweGMwKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNjY19pbml0dGFiKTsgKytpKQorCQlvdXRfOChzY2NjLCBzY2NfaW5pdHRhYltpXSk7CisKKwl1ZGJnX3B1dGMgPSB1ZGJnX3NjY19wdXRjOworCXVkYmdfZ2V0YyA9IHVkYmdfc2NjX2dldGM7CisJdWRiZ19nZXRjX3BvbGwgPSB1ZGJnX3NjY19nZXRjX3BvbGw7CisKKwl1ZGJnX3B1dHMoIkhlbGxvIFdvcmxkICFcbiIpOworfQorCitzdGF0aWMgdm9pZCB1ZGJnX3JlYWxfc2NjX3B1dGModW5zaWduZWQgY2hhciBjKQoreworCXdoaWxlICgocmVhbF9yZWFkYihzY2NjKSAmIFNDQ19UWFJEWSkgPT0gMCkKKwkJOworCXJlYWxfd3JpdGViKGMsIHNjY2QpOworCWlmIChjID09ICdcbicpCisJCXVkYmdfcmVhbF9zY2NfcHV0YygnXHInKTsKK30KKwordm9pZCB1ZGJnX2luaXRfcG1hY19yZWFsbW9kZSh2b2lkKQoreworCXNjY2MgPSAodm9sYXRpbGUgdTggX19pb21lbSAqKTB4ODAwMTMwMjB1bDsKKwlzY2NkID0gKHZvbGF0aWxlIHU4IF9faW9tZW0gKikweDgwMDEzMDMwdWw7CisKKwl1ZGJnX3B1dGMgPSB1ZGJnX3JlYWxfc2NjX3B1dGM7CisJdWRiZ19nZXRjID0gTlVMTDsKKwl1ZGJnX2dldGNfcG9sbCA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvY2FjaGVmbHVzaC5TIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzMyL2NhY2hlZmx1c2guUwppbmRleCAwZWQ3ZWE3Li5jOGRiOTkzIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvY2FjaGVmbHVzaC5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3Zkc28zMi9jYWNoZWZsdXNoLlMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIAkudGV4dAogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvZGF0YXBhZ2UuUyBiL2FyY2gvcHBjNjQva2VybmVsL3Zkc28zMi9kYXRhcGFnZS5TCmluZGV4IDI5YjZiZDMuLjRmNGViMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3Zkc28zMi9kYXRhcGFnZS5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3Zkc28zMi9kYXRhcGFnZS5TCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNtL3Zkc28uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzMyL2dldHRpbWVvZmRheS5TIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzMyL2dldHRpbWVvZmRheS5TCmluZGV4IDJiNDhiZjEuLjA3ZjFjMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3Zkc28zMi9nZXR0aW1lb2ZkYXkuUworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvZ2V0dGltZW9mZGF5LlMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCiAJLnRleHQKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3Zkc282NC9jYWNoZWZsdXNoLlMgYi9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvNjQvY2FjaGVmbHVzaC5TCmluZGV4IGUwNzI1YjcuLmQ0YTBhZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3Zkc282NC9jYWNoZWZsdXNoLlMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzY0L2NhY2hlZmx1c2guUwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS92ZHNvLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCS50ZXh0CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3Zkc282NC9kYXRhcGFnZS5TIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzY0L2RhdGFwYWdlLlMKaW5kZXggMThhZmQ5Ny4uZWQ2ZTU5OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzY0L2RhdGFwYWdlLlMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzY0L2RhdGFwYWdlLlMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvNjQvZ2V0dGltZW9mZGF5LlMgYi9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvNjQvZ2V0dGltZW9mZGF5LlMKaW5kZXggZWQzZjk3MC4uZjZkZjgwMiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzY0L2dldHRpbWVvZmRheS5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3Zkc282NC9nZXR0aW1lb2ZkYXkuUwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS92ZHNvLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCS50ZXh0CiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvcHBjNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNDEwM2NjMS4uMDMwNjUxMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xNSw2ICsxNSw3IEBACiAJKigudGV4dCAudGV4dC4qKQogCVNDSEVEX1RFWFQKIAlMT0NLX1RFWFQKKwlLUFJPQkVTX1RFWFQKIAkqKC5maXh1cCkKIAkuID0gQUxJR04oNDA5Nik7CiAJX2V0ZXh0ID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvbGliL2RlY19hbmRfbG9jay5jIGIvYXJjaC9wcGM2NC9saWIvZGVjX2FuZF9sb2NrLmMKaW5kZXggNmU4ZDg1OS4uN2I5ZDRkYSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9saWIvZGVjX2FuZF9sb2NrLmMKKysrIGIvYXJjaC9wcGM2NC9saWIvZGVjX2FuZF9sb2NrLmMKQEAgLTIwLDE0ICsyMCw3IEBACiAgKiBoYXMgYSBjbXB4Y2hnLCBhbmQgd2hlcmUgYXRvbWljLT52YWx1ZSBpcyBhbiBpbnQgaG9sZGluZwogICogdGhlIHZhbHVlIG9mIHRoZSBhdG9taWMgKGkuZS4gdGhlIGhpZ2ggYml0cyBhcmVuJ3QgdXNlZAogICogZm9yIGEgbG9jayBvciBhbnl0aGluZyBsaWtlIHRoYXQpLgotICoKLSAqIE4uQi4gQVRPTUlDX0RFQ19BTkRfTE9DSyBnZXRzIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9zcGlubG9jay5oCi0gKiBpZiBzcGlubG9ja3MgYXJlIGVtcHR5IGFuZCB0aHVzIGF0b21pY19kZWNfYW5kX2xvY2sgaXMgZGVmaW5lZAotICogdG8gYmUgYXRvbWljX2RlY19hbmRfdGVzdCAtIGluIHRoYXQgY2FzZSB3ZSBkb24ndCBuZWVkIGl0Ci0gKiBkZWZpbmVkIGhlcmUgYXMgd2VsbC4KICAqLwotCi0jaWZuZGVmIEFUT01JQ19ERUNfQU5EX0xPQ0sKIGludCBfYXRvbWljX2RlY19hbmRfbG9jayhhdG9taWNfdCAqYXRvbWljLCBzcGlubG9ja190ICpsb2NrKQogewogCWludCBjb3VudGVyOwpAQCAtNTIsNCArNDUsMyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKF9hdG9taWNfZGVjX2FuZF9sb2NrKTsKLSNlbmRpZiAvKiBBVE9NSUNfREVDX0FORF9MT0NLICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2xpYi9sb2Nrcy5jIGIvYXJjaC9wcGM2NC9saWIvbG9ja3MuYwppbmRleCBlZjcwZWY5Li4wMzM2NDNhIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2xpYi9sb2Nrcy5jCisrKyBiL2FyY2gvcHBjNjQvbGliL2xvY2tzLmMKQEAgLTIzLDEyICsyMywxMiBAQAogLyogd2FpdGluZyBmb3IgYSBzcGlubG9jay4uLiAqLwogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19TUExQQVIpIHx8IGRlZmluZWQoQ09ORklHX1BQQ19JU0VSSUVTKQogCi12b2lkIF9fc3Bpbl95aWVsZChzcGlubG9ja190ICpsb2NrKQordm9pZCBfX3NwaW5feWllbGQocmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJdW5zaWduZWQgaW50IGxvY2tfdmFsdWUsIGhvbGRlcl9jcHUsIHlpZWxkX2NvdW50OwogCXN0cnVjdCBwYWNhX3N0cnVjdCAqaG9sZGVyX3BhY2E7CiAKLQlsb2NrX3ZhbHVlID0gbG9jay0+bG9jazsKKwlsb2NrX3ZhbHVlID0gbG9jay0+c2xvY2s7CiAJaWYgKGxvY2tfdmFsdWUgPT0gMCkKIAkJcmV0dXJuOwogCWhvbGRlcl9jcHUgPSBsb2NrX3ZhbHVlICYgMHhmZmZmOwpAQCAtMzgsNyArMzgsNyBAQAogCWlmICgoeWllbGRfY291bnQgJiAxKSA9PSAwKQogCQlyZXR1cm47CQkvKiB2aXJ0dWFsIGNwdSBpcyBjdXJyZW50bHkgcnVubmluZyAqLwogCXJtYigpOwotCWlmIChsb2NrLT5sb2NrICE9IGxvY2tfdmFsdWUpCisJaWYgKGxvY2stPnNsb2NrICE9IGxvY2tfdmFsdWUpCiAJCXJldHVybjsJCS8qIHNvbWV0aGluZyBoYXMgY2hhbmdlZCAqLwogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogCUh2Q2FsbDIoSHZDYWxsQmFzZVlpZWxkUHJvY2Vzc29yLCBIdkNhbGxfWWllbGRUb1Byb2MsCkBAIC01NCw3ICs1NCw3IEBACiAgKiBUaGlzIHR1cm5zIG91dCB0byBiZSB0aGUgc2FtZSBmb3IgcmVhZCBhbmQgd3JpdGUgbG9ja3MsIHNpbmNlCiAgKiB3ZSBvbmx5IGtub3cgdGhlIGhvbGRlciBpZiBpdCBpcyB3cml0ZS1sb2NrZWQuCiAgKi8KLXZvaWQgX19yd195aWVsZChyd2xvY2tfdCAqcncpCit2b2lkIF9fcndfeWllbGQocmF3X3J3bG9ja190ICpydykKIHsKIAlpbnQgbG9ja192YWx1ZTsKIAl1bnNpZ25lZCBpbnQgaG9sZGVyX2NwdSwgeWllbGRfY291bnQ7CkBAIC04Miw5ICs4Miw5IEBACiB9CiAjZW5kaWYKIAotdm9pZCBzcGluX3VubG9ja193YWl0KHNwaW5sb2NrX3QgKmxvY2spCit2b2lkIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQocmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7Ci0Jd2hpbGUgKGxvY2stPmxvY2spIHsKKwl3aGlsZSAobG9jay0+c2xvY2spIHsKIAkJSE1UX2xvdygpOwogCQlpZiAoU0hBUkVEX1BST0NFU1NPUikKIAkJCV9fc3Bpbl95aWVsZChsb2NrKTsKQEAgLTkyLDQgKzkyLDQgQEAKIAlITVRfbWVkaXVtKCk7CiB9CiAKLUVYUE9SVF9TWU1CT0woc3Bpbl91bmxvY2tfd2FpdCk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9tbS9mYXVsdC5jIGIvYXJjaC9wcGM2NC9tbS9mYXVsdC5jCmluZGV4IDIwYjBmMzcuLjc3MmYwNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvbW0vZmF1bHQuYworKysgYi9hcmNoL3BwYzY0L21tL2ZhdWx0LmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTg0LDggKzg1LDggQEAKICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgMCBpZiB0aGUgZmF1bHQgd2FzIGhhbmRsZWQsIG9yIHRoZSBzaWduYWwKICAqIG51bWJlciBpZiB0aGlzIGlzIGEga2VybmVsIGZhdWx0IHRoYXQgY2FuJ3QgYmUgaGFuZGxlZCBoZXJlLgogICovCi1pbnQgZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAotCQkgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKK2ludCBfX2twcm9iZXMgZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWE7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvbW0vaGFzaF9sb3cuUyBiL2FyY2gvcHBjNjQvbW0vaGFzaF9sb3cuUwppbmRleCAzNWViNDllLi5lZTVhNWQzIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L21tL2hhc2hfbG93LlMKKysrIGIvYXJjaC9wcGM2NC9tbS9oYXNoX2xvdy5TCkBAIC0xNiw3ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAKIAkudGV4dApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9tbS9odWdldGxicGFnZS5jIGIvYXJjaC9wcGM2NC9tbS9odWdldGxicGFnZS5jCmluZGV4IGU3ODMzYzguLjMzODc3MWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL3BwYzY0L21tL2h1Z2V0bGJwYWdlLmMKQEAgLTE0NCw3ICsxNDQsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBOVU1fTE9XX0FSRUFTOyBpKyspIHsKIAkJaWYgKCEgKGFyZWFzICYgKDFVIDw8IGkpKSkKIAkJCWNvbnRpbnVlOwotCQlhc20gdm9sYXRpbGUoInNsYmllICUwIiA6IDogInIiIChpIDw8IFNJRF9TSElGVCkpOworCQlhc20gdm9sYXRpbGUoInNsYmllICUwIgorCQkJICAgICA6IDogInIiICgoaSA8PCBTSURfU0hJRlQpIHwgU0xCSUVfQykpOwogCX0KIAogCWFzbSB2b2xhdGlsZSgiaXN5bmMiIDogOiA6ICJtZW1vcnkiKTsKQEAgLTE2NCw3ICsxNjUsOCBAQAogCQkJY29udGludWU7CiAJCWZvciAoaiA9IDA7IGogPCAoMVVMIDw8IChIVExCX0FSRUFfU0hJRlQtU0lEX1NISUZUKSk7IGorKykKIAkJCWFzbSB2b2xhdGlsZSgic2xiaWUgJTAiCi0JCQkJICAgICA6OiAiciIgKChpIDw8IEhUTEJfQVJFQV9TSElGVCkgKyAoaiA8PCBTSURfU0hJRlQpKSk7CisJCQkJICAgICA6OiAiciIgKCgoaSA8PCBIVExCX0FSRUFfU0hJRlQpCisJCQkJCSAgICAgKyAoaiA8PCBTSURfU0hJRlQpKSB8IFNMQklFX0MpKTsKIAl9CiAKIAlhc20gdm9sYXRpbGUoImlzeW5jIiA6IDogOiAibWVtb3J5Iik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L21tL2luaXQuYyBiL2FyY2gvcHBjNjQvbW0vaW5pdC5jCmluZGV4IGMwMmRjOTguLmMyMTU3YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvcHBjNjQvbW0vaW5pdC5jCkBAIC0zOTIsNiArMzkyLDcgQEAKIAogCWFkZHIgPSAodW5zaWduZWQgbG9uZylfX2luaXRfYmVnaW47CiAJZm9yICg7IGFkZHIgPCAodW5zaWduZWQgbG9uZylfX2luaXRfZW5kOyBhZGRyICs9IFBBR0VfU0laRSkgeworCQltZW1zZXQoKHZvaWQgKilhZGRyLCAweGNjLCBQQUdFX1NJWkUpOwogCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoYWRkcikpOwogCQlzZXRfcGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2UoYWRkciksIDEpOwogCQlmcmVlX3BhZ2UoYWRkcik7CkBAIC01NTIsMjcgKzU1MywxOCBAQAogCS8qIEFkZCBhbGwgcGh5c2ljYWwgbWVtb3J5IHRvIHRoZSBib290bWVtIG1hcCwgbWFyayBlYWNoIGFyZWEKIAkgKiBwcmVzZW50LgogCSAqLwotCWZvciAoaT0wOyBpIDwgbG1iLm1lbW9yeS5jbnQ7IGkrKykgewotCQl1bnNpZ25lZCBsb25nIGJhc2UsIHNpemU7Ci0JCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOwotCi0JCWJhc2UgPSBsbWIubWVtb3J5LnJlZ2lvbltpXS5iYXNlOwotCQlzaXplID0gbG1iLm1lbW9yeS5yZWdpb25baV0uc2l6ZTsKLQotCQlzdGFydF9wZm4gPSBiYXNlID4+IFBBR0VfU0hJRlQ7Ci0JCWVuZF9wZm4gPSBzdGFydF9wZm4gKyAoc2l6ZSA+PiBQQUdFX1NISUZUKTsKLQkJbWVtb3J5X3ByZXNlbnQoMCwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKLQotCQlmcmVlX2Jvb3RtZW0oYmFzZSwgc2l6ZSk7Ci0JfQorCWZvciAoaT0wOyBpIDwgbG1iLm1lbW9yeS5jbnQ7IGkrKykKKwkJZnJlZV9ib290bWVtKGxtYi5tZW1vcnkucmVnaW9uW2ldLmJhc2UsCisJCQkgICAgIGxtYl9zaXplX2J5dGVzKCZsbWIubWVtb3J5LCBpKSk7CiAKIAkvKiByZXNlcnZlIHRoZSBzZWN0aW9ucyB3ZSdyZSBhbHJlYWR5IHVzaW5nICovCi0JZm9yIChpPTA7IGkgPCBsbWIucmVzZXJ2ZWQuY250OyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyBiYXNlID0gbG1iLnJlc2VydmVkLnJlZ2lvbltpXS5iYXNlOwotCQl1bnNpZ25lZCBsb25nIHNpemUgPSBsbWIucmVzZXJ2ZWQucmVnaW9uW2ldLnNpemU7CisJZm9yIChpPTA7IGkgPCBsbWIucmVzZXJ2ZWQuY250OyBpKyspCisJCXJlc2VydmVfYm9vdG1lbShsbWIucmVzZXJ2ZWQucmVnaW9uW2ldLmJhc2UsCisJCQkJbG1iX3NpemVfYnl0ZXMoJmxtYi5yZXNlcnZlZCwgaSkpOwogCi0JCXJlc2VydmVfYm9vdG1lbShiYXNlLCBzaXplKTsKLQl9CisJZm9yIChpPTA7IGkgPCBsbWIubWVtb3J5LmNudDsgaSsrKQorCQltZW1vcnlfcHJlc2VudCgwLCBsbWJfc3RhcnRfcGZuKCZsbWIubWVtb3J5LCBpKSwKKwkJCSAgICAgICBsbWJfZW5kX3BmbigmbG1iLm1lbW9yeSwgaSkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9tbS9udW1hLmMgYi9hcmNoL3BwYzY0L21tL251bWEuYwppbmRleCBjMzExNmYwLi5jYjg2NGI4IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L21tL251bWEuYworKysgYi9hcmNoL3BwYzY0L21tL251bWEuYwpAQCAtNDQwLDggKzQ0MCw2IEBACiAJCWZvciAoaSA9IHN0YXJ0IDsgaSA8IChzdGFydCtzaXplKTsgaSArPSBNRU1PUllfSU5DUkVNRU5UKQogCQkJbnVtYV9tZW1vcnlfbG9va3VwX3RhYmxlW2kgPj4gTUVNT1JZX0lOQ1JFTUVOVF9TSElGVF0gPQogCQkJCW51bWFfZG9tYWluOwotCQltZW1vcnlfcHJlc2VudChudW1hX2RvbWFpbiwgc3RhcnQgPj4gUEFHRV9TSElGVCwKLQkJCQkJCShzdGFydCArIHNpemUpID4+IFBBR0VfU0hJRlQpOwogCiAJCWlmICgtLXJhbmdlcykKIAkJCWdvdG8gbmV3X3JhbmdlOwpAQCAtNDgzLDcgKzQ4MSw2IEBACiAKIAlmb3IgKGkgPSAwIDsgaSA8IHRvcF9vZl9yYW07IGkgKz0gTUVNT1JZX0lOQ1JFTUVOVCkKIAkJbnVtYV9tZW1vcnlfbG9va3VwX3RhYmxlW2kgPj4gTUVNT1JZX0lOQ1JFTUVOVF9TSElGVF0gPSAwOwotCW1lbW9yeV9wcmVzZW50KDAsIDAsIGluaXRfbm9kZV9kYXRhWzBdLm5vZGVfZW5kX3Bmbik7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBkdW1wX251bWFfdG9wb2xvZ3kodm9pZCkKQEAgLTY5NSw2ICs2OTIsNDYgQEAKIAkJCQkJCSAgICAgc2l6ZSk7CiAJCQl9CiAJCX0KKwkJLyoKKwkJICogVGhpcyBsb29wIG1heSBsb29rIGZhbWFsaWFyLCBidXQgd2UgaGF2ZSB0byBkbyBpdCBhZ2FpbgorCQkgKiBhZnRlciBtYXJraW5nIG91ciByZXNlcnZlZCBtZW1vcnkgdG8gbWFyayBtZW1vcnkgcHJlc2VudAorCQkgKiBmb3Igc3BhcnNlbWVtLgorCQkgKi8KKwkJYWRkcl9jZWxscyA9IGdldF9tZW1fYWRkcl9jZWxscygpOworCQlzaXplX2NlbGxzID0gZ2V0X21lbV9zaXplX2NlbGxzKCk7CisJCW1lbW9yeSA9IE5VTEw7CisJCXdoaWxlICgobWVtb3J5ID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobWVtb3J5LCAibWVtb3J5IikpICE9IE5VTEwpIHsKKwkJCXVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0LCBtZW1fc2l6ZTsKKwkJCWludCBudW1hX2RvbWFpbiwgcmFuZ2VzOworCQkJdW5zaWduZWQgaW50ICptZW1jZWxsX2J1ZjsKKwkJCXVuc2lnbmVkIGludCBsZW47CisKKwkJCW1lbWNlbGxfYnVmID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShtZW1vcnksICJyZWciLCAmbGVuKTsKKwkJCWlmICghbWVtY2VsbF9idWYgfHwgbGVuIDw9IDApCisJCQkJY29udGludWU7CisKKwkJCXJhbmdlcyA9IG1lbW9yeS0+bl9hZGRyczsJLyogcmFuZ2VzIGluIGNlbGwgKi8KK25ld19yYW5nZTI6CisJCQltZW1fc3RhcnQgPSByZWFkX25fY2VsbHMoYWRkcl9jZWxscywgJm1lbWNlbGxfYnVmKTsKKwkJCW1lbV9zaXplID0gcmVhZF9uX2NlbGxzKHNpemVfY2VsbHMsICZtZW1jZWxsX2J1Zik7CisJCQlpZiAobnVtYV9lbmFibGVkKSB7CisJCQkJbnVtYV9kb21haW4gPSBvZl9ub2RlX251bWFfZG9tYWluKG1lbW9yeSk7CisJCQkJaWYgKG51bWFfZG9tYWluICA+PSBNQVhfTlVNTk9ERVMpCisJCQkJCW51bWFfZG9tYWluID0gMDsKKwkJCX0gZWxzZQorCQkJCW51bWFfZG9tYWluID0gIDA7CisKKwkJCWlmIChudW1hX2RvbWFpbiAhPSBuaWQpCisJCQkJY29udGludWU7CisKKwkJCW1lbV9zaXplID0gbnVtYV9lbmZvcmNlX21lbW9yeV9saW1pdChtZW1fc3RhcnQsIG1lbV9zaXplKTsKKwkJCW1lbW9yeV9wcmVzZW50KG51bWFfZG9tYWluLCBtZW1fc3RhcnQgPj4gUEFHRV9TSElGVCwKKwkJCQkgICAgICAgKG1lbV9zdGFydCArIG1lbV9zaXplKSA+PiBQQUdFX1NISUZUKTsKKworCQkJaWYgKC0tcmFuZ2VzKQkJLyogcHJvY2VzcyBhbGwgcmFuZ2VzIGluIGNlbGwgKi8KKwkJCQlnb3RvIG5ld19yYW5nZTI7CisJCX0KKwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9tbS9zbGIuYyBiL2FyY2gvcHBjNjQvbW0vc2xiLmMKaW5kZXggMjQ0MTUwYS4uMDQ3Mzk1MyAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9tbS9zbGIuYworKysgYi9hcmNoL3BwYzY0L21tL3NsYi5jCkBAIC04Nyw4ICs4Nyw4IEBACiAJCWludCBpOwogCQlhc20gdm9sYXRpbGUoImlzeW5jIiA6IDogOiAibWVtb3J5Iik7CiAJCWZvciAoaSA9IDA7IGkgPCBvZmZzZXQ7IGkrKykgewotCQkJZXNpZF9kYXRhID0gKHVuc2lnbmVkIGxvbmcpZ2V0X3BhY2EoKS0+c2xiX2NhY2hlW2ldCi0JCQkJPDwgU0lEX1NISUZUOworCQkJZXNpZF9kYXRhID0gKCh1bnNpZ25lZCBsb25nKWdldF9wYWNhKCktPnNsYl9jYWNoZVtpXQorCQkJCTw8IFNJRF9TSElGVCkgfCBTTEJJRV9DOwogCQkJYXNtIHZvbGF0aWxlKCJzbGJpZSAlMCIgOiA6ICJyIiAoZXNpZF9kYXRhKSk7CiAJCX0KIAkJYXNtIHZvbGF0aWxlKCJpc3luYyIgOiA6IDogIm1lbW9yeSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9tbS9zbGJfbG93LlMgYi9hcmNoL3BwYzY0L21tL3NsYl9sb3cuUwppbmRleCBiYWIyNTU4Li5hM2EwM2RhIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L21tL3NsYl9sb3cuUworKysgYi9hcmNoL3BwYzY0L21tL3NsYl9sb3cuUwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KIAogLyogdm9pZCBzbGJfYWxsb2NhdGUodW5zaWduZWQgbG9uZyBlYSk7CkBAIC05NywyNSArOTcsMjEgQEAKIAlsaHoJcjksUEFDQUhJR0hIVExCQVJFQVMocjEzKQogCXNyZGkJcjExLHIzLChIVExCX0FSRUFfU0hJRlQtU0lEX1NISUZUKQogCXNyZAlyOSxyOSxyMTEKLQlhbmRpLglyOSxyOSwxCi0JYm5lCTVmCi0KLQlsaQlyMTEsU0xCX1ZTSURfVVNFUgotCi0JY21wbGRpCXIzLDE2Ci0JYmdlCTZmCi0KLQlsaHoJcjksUEFDQUxPV0hUTEJBUkVBUyhyMTMpCi0Jc3JkCXI5LHI5LHIzCi0JYW5kaS4JcjkscjksMQotCi0JYmVxCTZmCi0KLTU6CWxpCXIxMSxTTEJfVlNJRF9VU0VSfFNMQl9WU0lEX0wKKwlsaHoJcjExLFBBQ0FMT1dIVExCQVJFQVMocjEzKQorCXNyZAlyMTEscjExLHIzCisJb3IJcjkscjkscjExCiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl8xNk1fUEFHRSkKICNlbmRpZiAvKiBDT05GSUdfSFVHRVRMQl9QQUdFICovCiAKLTY6CWxkCXI5LFBBQ0FDT05URVhUSUQocjEzKQorCWxpCXIxMSxTTEJfVlNJRF9VU0VSCisKKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCitCRUdJTl9GVFJfU0VDVElPTgorCXJsZGltaQlyMTEscjksOCw1NQkJLyogc2hpZnQgbWFza2VkIGJpdCBpbnRvIFNMQl9WU0lEX0wgKi8KK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSXzE2TV9QQUdFKQorI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KKworCWxkCXI5LFBBQ0FDT05URVhUSUQocjEzKQogCXJsZGltaQlyMyxyOSxVU0VSX0VTSURfQklUUywwCiAKIDk6CS8qIHIzID0gcHJvdG92c2lkLCByMTEgPSBmbGFncywgcjEwID0gZXNpZF9kYXRhLCBjcjcgPSA8PktFUk5FTEJBU0UgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvb3Byb2ZpbGUvY29tbW9uLmMgYi9hcmNoL3BwYzY0L29wcm9maWxlL2NvbW1vbi5jCmluZGV4IDRhY2QxYTQuLmU1ZjU3MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvb3Byb2ZpbGUvY29tbW9uLmMKKysrIGIvYXJjaC9wcGM2NC9vcHJvZmlsZS9jb21tb24uYwpAQCAtMTYsMTEgKzE2LDkgQEAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wbWMuaD4KKyNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KKyNpbmNsdWRlIDxhc20vb3Byb2ZpbGVfaW1wbC5oPgogCi0jaW5jbHVkZSAib3BfaW1wbC5oIgotCi1leHRlcm4gc3RydWN0IG9wX3BwYzY0X21vZGVsIG9wX21vZGVsX3JzNjQ7Ci1leHRlcm4gc3RydWN0IG9wX3BwYzY0X21vZGVsIG9wX21vZGVsX3Bvd2VyNDsKIHN0YXRpYyBzdHJ1Y3Qgb3BfcHBjNjRfbW9kZWwgKm1vZGVsOwogCiBzdGF0aWMgc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnIGN0cltPUF9NQVhfQ09VTlRFUl07CkBAIC0xMjMsNTMgKzEyMSwxMyBAQAogCiBpbnQgX19pbml0IG9wcm9maWxlX2FyY2hfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQogewotCXVuc2lnbmVkIGludCBwdnI7CisJaWYgKCFjdXJfY3B1X3NwZWMtPm9wcm9maWxlX21vZGVsIHx8ICFjdXJfY3B1X3NwZWMtPm9wcm9maWxlX2NwdV90eXBlKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCXB2ciA9IG1mc3ByKFNQUk5fUFZSKTsKKwltb2RlbCA9IGN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfbW9kZWw7CisJbW9kZWwtPm51bV9jb3VudGVycyA9IGN1cl9jcHVfc3BlYy0+bnVtX3BtY3M7CiAKLQlzd2l0Y2ggKFBWUl9WRVIocHZyKSkgewotCQljYXNlIFBWXzYzMDoKLQkJY2FzZSBQVl82MzBwOgotCQkJbW9kZWwgPSAmb3BfbW9kZWxfcnM2NDsKLQkJCW1vZGVsLT5udW1fY291bnRlcnMgPSA4OwotCQkJb3BzLT5jcHVfdHlwZSA9ICJwcGM2NC9wb3dlcjMiOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQVl9OT1JUSFNUQVI6Ci0JCWNhc2UgUFZfUFVMU0FSOgotCQljYXNlIFBWX0lDRVNUQVI6Ci0JCWNhc2UgUFZfU1NUQVI6Ci0JCQltb2RlbCA9ICZvcF9tb2RlbF9yczY0OwotCQkJbW9kZWwtPm51bV9jb3VudGVycyA9IDg7Ci0JCQlvcHMtPmNwdV90eXBlID0gInBwYzY0L3JzNjQiOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQVl9QT1dFUjQ6Ci0JCWNhc2UgUFZfUE9XRVI0cDoKLQkJCW1vZGVsID0gJm9wX21vZGVsX3Bvd2VyNDsKLQkJCW1vZGVsLT5udW1fY291bnRlcnMgPSA4OwotCQkJb3BzLT5jcHVfdHlwZSA9ICJwcGM2NC9wb3dlcjQiOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQVl85NzA6Ci0JCWNhc2UgUFZfOTcwRlg6Ci0JCWNhc2UgUFZfOTcwTVA6Ci0JCQltb2RlbCA9ICZvcF9tb2RlbF9wb3dlcjQ7Ci0JCQltb2RlbC0+bnVtX2NvdW50ZXJzID0gODsKLQkJCW9wcy0+Y3B1X3R5cGUgPSAicHBjNjQvOTcwIjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUFZfUE9XRVI1OgotCQljYXNlIFBWX1BPV0VSNXA6Ci0JCQltb2RlbCA9ICZvcF9tb2RlbF9wb3dlcjQ7Ci0JCQltb2RlbC0+bnVtX2NvdW50ZXJzID0gNjsKLQkJCW9wcy0+Y3B1X3R5cGUgPSAicHBjNjQvcG93ZXI1IjsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KKwlvcHMtPmNwdV90eXBlID0gY3VyX2NwdV9zcGVjLT5vcHJvZmlsZV9jcHVfdHlwZTsKIAlvcHMtPmNyZWF0ZV9maWxlcyA9IG9wX3BwYzY0X2NyZWF0ZV9maWxlczsKIAlvcHMtPnNldHVwID0gb3BfcHBjNjRfc2V0dXA7CiAJb3BzLT5zaHV0ZG93biA9IG9wX3BwYzY0X3NodXRkb3duOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYyBiL2FyY2gvcHBjNjQvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMKaW5kZXggM2QxMDNkNi4uMzJiMmJiNSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYworKysgYi9hcmNoL3BwYzY0L29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jCkBAIC0xNiwxNCArMTYsMTIgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtY2ZnLmg+CiAjaW5jbHVkZSA8YXNtL3J0YXMuaD4KKyNpbmNsdWRlIDxhc20vb3Byb2ZpbGVfaW1wbC5oPgogCiAjZGVmaW5lIGRiZyhhcmdzLi4uKQogCi0jaW5jbHVkZSAib3BfaW1wbC5oIgotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyByZXNldF92YWx1ZVtPUF9NQVhfQ09VTlRFUl07CiAKLXN0YXRpYyBpbnQgbnVtX2NvdW50ZXJzOwogc3RhdGljIGludCBvcHJvZmlsZV9ydW5uaW5nOwogc3RhdGljIGludCBtbWNyYV9oYXNfc2lodjsKIApAQCAtNDUsOCArNDMsNiBAQAogewogCWludCBpOwogCi0JbnVtX2NvdW50ZXJzID0gbnVtX2N0cnM7Ci0KIAkvKgogCSAqIFNJSFYgLyBTSVBSIGJpdHMgYXJlIG9ubHkgaW1wbGVtZW50ZWQgb24gUE9XRVI0KyAoR1EpIGFuZCBhYm92ZS4KIAkgKiBIb3dldmVyIHdlIGRpc2FibGUgaXQgb24gYWxsIFBPV0VSNCB1bnRpbCB3ZSB2ZXJpZnkgaXQgd29ya3MKQEAgLTY4LDcgKzY0LDcgQEAKIAogCWJhY2t0cmFjZV9zcGlubG9ja3MgPSBzeXMtPmJhY2t0cmFjZV9zcGlubG9ja3M7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpCisJZm9yIChpID0gMDsgaSA8IGN1cl9jcHVfc3BlYy0+bnVtX3BtY3M7ICsraSkKIAkJcmVzZXRfdmFsdWVbaV0gPSAweDgwMDAwMDAwVUwgLSBjdHJbaV0uY291bnQ7CiAKIAkvKiBzZXR1cCB1c2VyIGFuZCBrZXJuZWwgcHJvZmlsaW5nICovCkBAIC0xMjEsNyArMTE3LDcgQEAKIAkvKiBzZXQgdGhlIFBNTSBiaXQgKHNlZSBjb21tZW50IGJlbG93KSAqLwogCW10bXNyZChtZm1zcigpIHwgTVNSX1BNTSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgY3VyX2NwdV9zcGVjLT5udW1fcG1jczsgKytpKSB7CiAJCWlmIChjdHJbaV0uZW5hYmxlZCkgewogCQkJY3RyX3dyaXRlKGksIHJlc2V0X3ZhbHVlW2ldKTsKIAkJfSBlbHNlIHsKQEAgLTI3Miw3ICsyNjgsNyBAQAogCS8qIHNldCB0aGUgUE1NIGJpdCAoc2VlIGNvbW1lbnQgYmVsb3cpICovCiAJbXRtc3JkKG1mbXNyKCkgfCBNU1JfUE1NKTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBjdXJfY3B1X3NwZWMtPm51bV9wbWNzOyArK2kpIHsKIAkJdmFsID0gY3RyX3JlYWQoaSk7CiAJCWlmICh2YWwgPCAwKSB7CiAJCQlpZiAob3Byb2ZpbGVfcnVubmluZyAmJiBjdHJbaV0uZW5hYmxlZCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9vcHJvZmlsZS9vcF9tb2RlbF9yczY0LmMgYi9hcmNoL3BwYzY0L29wcm9maWxlL29wX21vZGVsX3JzNjQuYwppbmRleCBiY2VjNTA2Li4wOGM1YjMzIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L29wcm9maWxlL29wX21vZGVsX3JzNjQuYworKysgYi9hcmNoL3BwYzY0L29wcm9maWxlL29wX21vZGVsX3JzNjQuYwpAQCAtMTQsMTEgKzE0LDEwIEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KKyNpbmNsdWRlIDxhc20vb3Byb2ZpbGVfaW1wbC5oPgogCiAjZGVmaW5lIGRiZyhhcmdzLi4uKQogCi0jaW5jbHVkZSAib3BfaW1wbC5oIgotCiBzdGF0aWMgdm9pZCBjdHJsX3dyaXRlKHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgdmFsKQogewogCXVuc2lnbmVkIGludCB0bXAgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC94bW9uL3N0YXJ0LmMgYi9hcmNoL3BwYzY0L3htb24vc3RhcnQuYwppbmRleCBmODZiNTg0Li5lNTBjMTU4IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L3htb24vc3RhcnQuYworKysgYi9hcmNoL3BwYzY0L3htb24vc3RhcnQuYwpAQCAtNjEsNyArNjEsOSBAQAogaW50CiB4bW9uX3JlYWRfcG9sbCh2b2lkKQogewotCXJldHVybiB1ZGJnX2dldGNfcG9sbCgpOworCWlmICh1ZGJnX2dldGNfcG9sbCkKKwkJcmV0dXJuIHVkYmdfZ2V0Y19wb2xsKCk7CisJcmV0dXJuIC0xOwogfQogIAogRklMRSAqeG1vbl9zdGRpbjsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9NYWtlZmlsZSBiL2FyY2gvczM5MC9NYWtlZmlsZQppbmRleCAzY2Q4ZGQyLi45OGRiMzA0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL01ha2VmaWxlCkBAIC0xOSw2ICsxOSw3IEBACiBBRkxBR1MJCSs9IC1tMzEKIFVUU19NQUNISU5FCTo9IHMzOTAKIFNUQUNLX1NJWkUJOj0gODE5MgorQ0hFQ0tGTEFHUwkrPSAtRF9fczM5MF9fCiBlbmRpZgogCiBpZmRlZiBDT05GSUdfQVJDSF9TMzkwWApAQCAtMjgsNiArMjksNyBAQAogQUZMQUdTCQkrPSAtbTY0CiBVVFNfTUFDSElORQk6PSBzMzkweAogU1RBQ0tfU0laRQk6PSAxNjM4NAorQ0hFQ0tGTEFHUwkrPSAtRF9fczM5MF9fIC1EX19zMzkweF9fCiBlbmRpZgogCiBjZmxhZ3MtJChDT05GSUdfTUFSQ0hfRzUpICAgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9ZzUpCkBAIC0xMDAsMTYgKzEwMiw2IEBACiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQogCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS0kKEFSQ0gpL29mZnNldHMuaAotCi1hcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLQkJCQkgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKLQotaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXRzLmg6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKLQotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXRzLmgKLQogIyBEb24ndCB1c2UgdGFicyBpbiBlY2hvIGFyZ3VtZW50cwogZGVmaW5lIGFyY2hoZWxwCiAgIGVjaG8gICcqIGltYWdlICAgICAgICAgICAtIEtlcm5lbCBpbWFnZSBmb3IgSVBMICgkKGJvb3QpL2ltYWdlKScKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZGVidWcuYyBiL2FyY2gvczM5MC9rZXJuZWwvZGVidWcuYwppbmRleCA5NjBiYTYwLi5iYzU5MjgyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2RlYnVnLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9kZWJ1Zy5jCkBAIC02Miw3ICs2Miw3IEBACiB9IGRlYnVnX3NwcmludGZfZW50cnlfdDsKIAogCi1leHRlcm4gdm9pZCB0b2RfdG9fdGltZXZhbCh1aW50NjRfdCB0b2R2YWwsIHN0cnVjdCB0aW1ldmFsICp4dGltZSk7CitleHRlcm4gdm9pZCB0b2RfdG9fdGltZXZhbCh1aW50NjRfdCB0b2R2YWwsIHN0cnVjdCB0aW1lc3BlYyAqeHRpbWUpOwogCiAvKiBpbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5ZXMgKi8KIApAQCAtMzc0LDkgKzM3NCwyNCBAQAogewogICAgICAgICBpbnQgaSxqOwogICAgICAgICBkZWJ1Z19pbmZvX3QqIHJjOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICAgICAgIHJjID0gZGVidWdfaW5mb19hbGxvYyhpbi0+bmFtZSwgaW4tPnBhZ2VzX3Blcl9hcmVhLCBpbi0+bnJfYXJlYXMsCi0JCQkJaW4tPmJ1Zl9zaXplLCBpbi0+bGV2ZWwsIG1vZGUpOworCS8qIGdldCBhIGNvbnNpc3RlbnQgY29weSBvZiB0aGUgZGVidWcgYXJlYXMgKi8KKwlkbyB7CisJCXJjID0gZGVidWdfaW5mb19hbGxvYyhpbi0+bmFtZSwgaW4tPnBhZ2VzX3Blcl9hcmVhLAorCQkJaW4tPm5yX2FyZWFzLCBpbi0+YnVmX3NpemUsIGluLT5sZXZlbCwgbW9kZSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbi0+bG9jaywgZmxhZ3MpOworCQlpZighcmMpCisJCQlnb3RvIG91dDsKKwkJLyogaGFzIHNvbWV0aGluZyBjaGFuZ2VkIGluIHRoZSBtZWFudGltZSA/ICovCisJCWlmKChyYy0+cGFnZXNfcGVyX2FyZWEgPT0gaW4tPnBhZ2VzX3Blcl9hcmVhKSAmJgorCQkgICAocmMtPm5yX2FyZWFzID09IGluLT5ucl9hcmVhcykpIHsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluLT5sb2NrLCBmbGFncyk7CisJCWRlYnVnX2luZm9fZnJlZShyYyk7CisJfSB3aGlsZSAoMSk7CisKICAgICAgICAgaWYoIXJjIHx8IChtb2RlID09IE5PX0FSRUFTKSkKICAgICAgICAgICAgICAgICBnb3RvIG91dDsKIApAQCAtMzg2LDYgKzQwMSw3IEBACiAJCX0KICAgICAgICAgfQogb3V0OgorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbi0+bG9jaywgZmxhZ3MpOwogICAgICAgICByZXR1cm4gcmM7CiB9CiAKQEAgLTU5MywxOSArNjA5LDE1IEBACiAJZGVidWdfaW5mb190ICpkZWJ1Z19pbmZvLCAqZGVidWdfaW5mb19zbmFwc2hvdDsKIAogCWRvd24oJmRlYnVnX2xvY2spOwotCi0JLyogZmluZCBkZWJ1ZyBsb2cgYW5kIHZpZXcgKi8KLQlkZWJ1Z19pbmZvID0gZGVidWdfYXJlYV9maXJzdDsKLQl3aGlsZShkZWJ1Z19pbmZvICE9IE5VTEwpewotCQlmb3IgKGkgPSAwOyBpIDwgREVCVUdfTUFYX1ZJRVdTOyBpKyspIHsKLQkJCWlmICghZGVidWdfaW5mby0+dmlld3NbaV0pCi0JCQkJY29udGludWU7Ci0JCQllbHNlIGlmIChkZWJ1Z19pbmZvLT5kZWJ1Z2ZzX2VudHJpZXNbaV0gPT0KLQkJCQkgZmlsZS0+Zl9kZW50cnkpIHsKLQkJCQlnb3RvIGZvdW5kOwkvKiBmb3VuZCB2aWV3ICEgKi8KLQkJCX0KKwlkZWJ1Z19pbmZvID0gKHN0cnVjdCBkZWJ1Z19pbmZvKilmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwOworCS8qIGZpbmQgZGVidWcgdmlldyAqLworCWZvciAoaSA9IDA7IGkgPCBERUJVR19NQVhfVklFV1M7IGkrKykgeworCQlpZiAoIWRlYnVnX2luZm8tPnZpZXdzW2ldKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKGRlYnVnX2luZm8tPmRlYnVnZnNfZW50cmllc1tpXSA9PQorCQkJIGZpbGUtPmZfZGVudHJ5KSB7CisJCQlnb3RvIGZvdW5kOwkvKiBmb3VuZCB2aWV3ICEgKi8KIAkJfQotCQlkZWJ1Z19pbmZvID0gZGVidWdfaW5mby0+bmV4dDsKIAl9CiAJLyogbm8gZW50cnkgZm91bmQgKi8KIAlyYyA9IC1FSU5WQUw7CkBAIC04MzMsNyArODQ1LDcgQEAKIGRlYnVnX2ZpbmlzaF9lbnRyeShkZWJ1Z19pbmZvX3QgKiBpZCwgZGVidWdfZW50cnlfdCogYWN0aXZlLCBpbnQgbGV2ZWwsCiAJCQlpbnQgZXhjZXB0aW9uKQogewotCVNUQ0soYWN0aXZlLT5pZC5zdGNrKTsKKwlhY3RpdmUtPmlkLnN0Y2sgPSBnZXRfY2xvY2soKTsKIAlhY3RpdmUtPmlkLmZpZWxkcy5jcHVpZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlhY3RpdmUtPmNhbGxlciA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKIAlhY3RpdmUtPmlkLmZpZWxkcy5leGNlcHRpb24gPSBleGNlcHRpb247CkBAIC0xMDc4LDcgKzEwOTAsNyBAQAogCWlmICh2aWV3LT5pbnB1dF9wcm9jKQogCQltb2RlIHw9IFNfSVdVU1I7CiAJcGRlID0gZGVidWdmc19jcmVhdGVfZmlsZSh2aWV3LT5uYW1lLCBtb2RlLCBpZC0+ZGVidWdmc19yb290X2VudHJ5LAotCQkJCU5VTEwsICZkZWJ1Z19maWxlX29wcyk7CisJCQkJaWQgLCAmZGVidWdfZmlsZV9vcHMpOwogCWlmICghcGRlKXsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiZGVidWc6IGRlYnVnZnNfY3JlYXRlX2ZpbGUoKSBmYWlsZWQhIlwKIAkJCSIgQ2Fubm90IHJlZ2lzdGVyIHZpZXcgJXMvJXNcbiIsIGlkLT5uYW1lLHZpZXctPm5hbWUpOwpAQCAtMTQzMiw3ICsxNDQ0LDcgQEAKIGRlYnVnX2RmbHRfaGVhZGVyX2ZuKGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywKIAkJCSBpbnQgYXJlYSwgZGVidWdfZW50cnlfdCAqIGVudHJ5LCBjaGFyICpvdXRfYnVmKQogewotCXN0cnVjdCB0aW1ldmFsIHRpbWVfdmFsOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lX3NwZWM7CiAJdW5zaWduZWQgbG9uZyBsb25nIHRpbWU7CiAJY2hhciAqZXhjZXB0X3N0cjsKIAl1bnNpZ25lZCBsb25nIGNhbGxlcjsKQEAgLTE0NDMsNyArMTQ1NSw3IEBACiAJdGltZSA9IGVudHJ5LT5pZC5zdGNrOwogCS8qIGFkanVzdCB0b2RjbG9jayB0byAxOTcwICovCiAJdGltZSAtPSAweDgxMjZkNjBlNDYwMDAwMDBMTCAtICgweDNjMjY3MDBMTCAqIDEwMDAwMDAgKiA0MDk2KTsKLQl0b2RfdG9fdGltZXZhbCh0aW1lLCAmdGltZV92YWwpOworCXRvZF90b190aW1ldmFsKHRpbWUsICZ0aW1lX3NwZWMpOwogCiAJaWYgKGVudHJ5LT5pZC5maWVsZHMuZXhjZXB0aW9uKQogCQlleGNlcHRfc3RyID0gIioiOwpAQCAtMTQ1MSw3ICsxNDYzLDcgQEAKIAkJZXhjZXB0X3N0ciA9ICItIjsKIAljYWxsZXIgPSAoKHVuc2lnbmVkIGxvbmcpIGVudHJ5LT5jYWxsZXIpICYgUFNXX0FERFJfSU5TTjsKIAlyYyArPSBzcHJpbnRmKG91dF9idWYsICIlMDJpICUwMTFsdTolMDZsdSAlMXUgJTFzICUwMmkgJXAgICIsCi0JCSAgICAgIGFyZWEsIHRpbWVfdmFsLnR2X3NlYywgdGltZV92YWwudHZfdXNlYywgbGV2ZWwsCisJCSAgICAgIGFyZWEsIHRpbWVfc3BlYy50dl9zZWMsIHRpbWVfc3BlYy50dl9uc2VjIC8gMTAwMCwgbGV2ZWwsCiAJCSAgICAgIGV4Y2VwdF9zdHIsIGVudHJ5LT5pZC5maWVsZHMuY3B1aWQsICh2b2lkICopIGNhbGxlcik7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCmluZGV4IDFhMjcxYjEuLjU4ZmM3ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIApAQCAtMTM4LDE0ICsxMzgsMTQgQEAKIAlzdAklcjEyLF9fU0ZfQkFDS0NIQUlOKCVyMTUpCSMgY2xlYXIgYmFjayBjaGFpbgogCS5lbmRtCiAKLQkubWFjcm8gIFJFU1RPUkVfQUxMIHN5bmMKLQltdmMJX19MQ19SRVRVUk5fUFNXKDgpLFNQX1BTVyglcjE1KSAjIG1vdmUgdXNlciBQU1cgdG8gbG93Y29yZQorCS5tYWNybyAgUkVTVE9SRV9BTEwgcHN3b3JnLHN5bmMKKwltdmMJXHBzd29yZyg4KSxTUF9QU1coJXIxNSkgIyBtb3ZlIHVzZXIgUFNXIHRvIGxvd2NvcmUKIAkuaWYgIVxzeW5jCi0JbmkJX19MQ19SRVRVUk5fUFNXKzEsMHhmZAkjIGNsZWFyIHdhaXQgc3RhdGUgYml0CisJbmkJXHBzd29yZysxLDB4ZmQJCSMgY2xlYXIgd2FpdCBzdGF0ZSBiaXQKIAkuZW5kaWYKIAlsbQklcjAsJXIxNSxTUF9SMCglcjE1KQkjIGxvYWQgZ3BycyAwLTE1IG9mIHVzZXIKIAlTVE9SRV9USU1FUiBfX0xDX0VYSVRfVElNRVIKLQlscHN3CV9fTENfUkVUVVJOX1BTVwkJIyBiYWNrIHRvIGNhbGxlcgorCWxwc3cJXHBzd29yZwkJCSMgYmFjayB0byBjYWxsZXIKIAkuZW5kbQogCiAvKgpAQCAtMjM1LDcgKzIzNSw3IEBACiAJdG0JX19USV9mbGFncyszKCVyOSksX1RJRl9XT1JLX1NWQwogCWJueglCQVNFRChzeXNjX3dvcmspICAjIHRoZXJlIGlzIHdvcmsgdG8gZG8gKHNpZ25hbHMgZXRjLikKIHN5c2NfbGVhdmU6Ci0gICAgICAgIFJFU1RPUkVfQUxMIDEKKyAgICAgICAgUkVTVE9SRV9BTEwgX19MQ19SRVRVUk5fUFNXLDEKIAogIwogIyByZWNoZWNrIGlmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbwpAQCAtMzEyLDggKzMxMiw2IEBACiAJbGEJJXIxNCxCQVNFRChzeXNjX3JldHVybikJIyBsb2FkIGFkci4gb2Ygc3lzdGVtIHJldHVybgogCWJyCSVyMQkJCSMgYnJhbmNoIHRvIGRvX3NpbmdsZV9zdGVwCiAKLV9fY3JpdGljYWxfZW5kOgotCiAjCiAjIGNhbGwgdHJhY2UgYmVmb3JlIGFuZCBhZnRlciBzeXNfY2FsbAogIwpAQCAtNTcxLDcgKzU2OSw4IEBACiAJdG0JX19USV9mbGFncyszKCVyOSksX1RJRl9XT1JLX0lOVAogCWJueglCQVNFRChpb193b3JrKSAgICAgICAgICMgdGhlcmUgaXMgd29yayB0byBkbyAoc2lnbmFscyBldGMuKQogaW9fbGVhdmU6Ci0gICAgICAgIFJFU1RPUkVfQUxMIDAKKyAgICAgICAgUkVTVE9SRV9BTEwgX19MQ19SRVRVUk5fUFNXLDAKK2lvX2RvbmU6CiAKICNpZmRlZiBDT05GSUdfUFJFRU1QVAogaW9fcHJlZW1wdDoKQEAgLTYyMSw3ICs2MjAsNyBAQAogIwogaW9fbWNja19wZW5kaW5nOgogCWwJJXIxLEJBU0VEKC5MczM5MF9oYW5kbGVfbWNjaykKLQlsCSVyMTQsQkFTRUQoaW9fd29ya19sb29wKQorCWxhCSVyMTQsQkFTRUQoaW9fd29ya19sb29wKQogCWJyCSVyMQkJICAgICAgICMgVElGIGJpdCB3aWxsIGJlIGNsZWFyZWQgYnkgaGFuZGxlcgogCiAjCkBAIC02NzQsNiArNjczLDggQEAKIAliYXNyCSVyMTQsJXIxCiAJYglCQVNFRChpb19yZXR1cm4pCiAKK19fY3JpdGljYWxfZW5kOgorCiAvKgogICogTWFjaGluZSBjaGVjayBoYW5kbGVyIHJvdXRpbmVzCiAgKi8KQEAgLTY4MSw2ICs2ODIsNyBAQAogICAgICAgICAuZ2xvYmwgbWNja19pbnRfaGFuZGxlcgogbWNja19pbnRfaGFuZGxlcjoKIAlzcHQJX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBCSMgcmV2YWxpZGF0ZSBjcHUgdGltZXIKKwltdmMJX19MQ19BU1lOQ19FTlRFUl9USU1FUig4KSxfX0xDX0NQVV9USU1FUl9TQVZFX0FSRUEKIAlsbQklcjAsJXIxNSxfX0xDX0dQUkVHU19TQVZFX0FSRUEJIyByZXZhbGlkYXRlIGdwcnMKIAlTQVZFX0FMTF9CQVNFIF9fTENfU0FWRV9BUkVBKzMyCiAJbGEJJXIxMixfX0xDX01DS19PTERfUFNXCkBAIC02OTMsMTcgKzY5NSw4IEBACiAJbXZjCV9fTENfQVNZTkNfRU5URVJfVElNRVIoOCksX19MQ19MQVNUX1VQREFURV9USU1FUgogCW12YwlfX0xDX1NZTkNfRU5URVJfVElNRVIoOCksX19MQ19MQVNUX1VQREFURV9USU1FUgogCW12YwlfX0xDX0VYSVRfVElNRVIoOCksX19MQ19MQVNUX1VQREFURV9USU1FUgotMDoJdG0JX19MQ19NQ0NLX0NPREUrMiwweDA4ICAgIyBtd3Agb2Ygb2xkIHBzdyB2YWxpZD8KLQlibm8JQkFTRUQobWNja19ub192dGltZSkJIyBubyAtPiBza2lwIGNsZWFudXAgY3JpdGljYWwKLQl0bQlfX0xDX01DS19PTERfUFNXKzEsMHgwMSAjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPwotCWJ6CUJBU0VEKG1jY2tfbm9fdnRpbWUpCi0JVVBEQVRFX1ZUSU1FIF9fTENfRVhJVF9USU1FUixfX0xDX0FTWU5DX0VOVEVSX1RJTUVSLF9fTENfVVNFUl9USU1FUgotCVVQREFURV9WVElNRSBfX0xDX0xBU1RfVVBEQVRFX1RJTUVSLF9fTENfRVhJVF9USU1FUixfX0xDX1NZU1RFTV9USU1FUgotCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfQVNZTkNfRU5URVJfVElNRVIKLW1jY2tfbm9fdnRpbWU6CiAjZW5kaWYKLTA6Ci0JdG0JX19MQ19NQ0NLX0NPREUrMiwweDA5ICAgIyBtd3AgKyBpYSBvZiBvbGQgcHN3IHZhbGlkPworMDoJdG0JX19MQ19NQ0NLX0NPREUrMiwweDA5ICAgIyBtd3AgKyBpYSBvZiBvbGQgcHN3IHZhbGlkPwogCWJubwlCQVNFRChtY2NrX2ludF9tYWluKQkjIG5vIC0+IHNraXAgY2xlYW51cCBjcml0aWNhbAogCXRtCV9fTENfTUNLX09MRF9QU1crMSwweDAxCSMgdGVzdCBwcm9ibGVtIHN0YXRlIGJpdAogCWJueglCQVNFRChtY2NrX2ludF9tYWluKQkjIGZyb20gdXNlciAtPiBsb2FkIGFzeW5jIHN0YWNrCkBAIC03MjAsNiArNzEzLDE2IEBACiAJYmUJQkFTRUQoMGYpCiAJbAklcjE1LF9fTENfUEFOSUNfU1RBQ0sJIyBsb2FkIHBhbmljIHN0YWNrCiAwOglDUkVBVEVfU1RBQ0tfRlJBTUUgX19MQ19NQ0tfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQSszMgorI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCisJdG0JX19MQ19NQ0NLX0NPREUrMiwweDA4ICAgIyBtd3Agb2Ygb2xkIHBzdyB2YWxpZD8KKwlibm8JQkFTRUQobWNja19ub192dGltZSkJIyBubyAtPiBza2lwIGNsZWFudXAgY3JpdGljYWwKKwl0bQlfX0xDX01DS19PTERfUFNXKzEsMHgwMSAjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPworCWJ6CUJBU0VEKG1jY2tfbm9fdnRpbWUpCisJVVBEQVRFX1ZUSU1FIF9fTENfRVhJVF9USU1FUixfX0xDX0FTWU5DX0VOVEVSX1RJTUVSLF9fTENfVVNFUl9USU1FUgorCVVQREFURV9WVElNRSBfX0xDX0xBU1RfVVBEQVRFX1RJTUVSLF9fTENfRVhJVF9USU1FUixfX0xDX1NZU1RFTV9USU1FUgorCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfQVNZTkNfRU5URVJfVElNRVIKK21jY2tfbm9fdnRpbWU6CisjZW5kaWYKIAlsCSVyOSxfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAogCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKIAlsICAgICAgICVyMSxCQVNFRCguTHMzOTBfbWNjaykKQEAgLTczNyw3ICs3NDAsNyBAQAogCWwJJXIxLEJBU0VEKC5MczM5MF9oYW5kbGVfbWNjaykKIAliYXNyCSVyMTQsJXIxCQkjIGNhbGwgbWFjaGluZSBjaGVjayBoYW5kbGVyCiBtY2NrX3JldHVybjoKLSAgICAgICAgUkVTVE9SRV9BTEwgMAorICAgICAgICBSRVNUT1JFX0FMTCBfX0xDX1JFVFVSTl9NQ0NLX1BTVywwCiAKICNpZmRlZiBDT05GSUdfU01QCiAvKgpAQCAtODAzLDYgKzgwNiwxMCBAQAogCS5sb25nCXN5c2NfbGVhdmUgKyAweDgwMDAwMDAwLCBzeXNjX3dvcmtfbG9vcCArIDB4ODAwMDAwMDAKIGNsZWFudXBfdGFibGVfc3lzY193b3JrX2xvb3A6CiAJLmxvbmcJc3lzY193b3JrX2xvb3AgKyAweDgwMDAwMDAwLCBzeXNjX3Jlc2NoZWR1bGUgKyAweDgwMDAwMDAwCitjbGVhbnVwX3RhYmxlX2lvX2xlYXZlOgorCS5sb25nCWlvX2xlYXZlICsgMHg4MDAwMDAwMCwgaW9fZG9uZSArIDB4ODAwMDAwMDAKK2NsZWFudXBfdGFibGVfaW9fd29ya19sb29wOgorCS5sb25nCWlvX3dvcmtfbG9vcCArIDB4ODAwMDAwMDAsIGlvX21jY2tfcGVuZGluZyArIDB4ODAwMDAwMDAKIAogY2xlYW51cF9jcml0aWNhbDoKIAljbGMJNCg0LCVyMTIpLEJBU0VEKGNsZWFudXBfdGFibGVfc3lzdGVtX2NhbGwpCkBAIC04MjUsMTAgKzgzMiwyNiBAQAogCWNsYwk0KDQsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9zeXNjX3dvcmtfbG9vcCs0KQogCWJsCUJBU0VEKGNsZWFudXBfc3lzY19yZXR1cm4pCiAwOgorCWNsYwk0KDQsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9pb19sZWF2ZSkKKwlibAlCQVNFRCgwZikKKwljbGMJNCg0LCVyMTIpLEJBU0VEKGNsZWFudXBfdGFibGVfaW9fbGVhdmUrNCkKKwlibAlCQVNFRChjbGVhbnVwX2lvX2xlYXZlKQorMDoKKwljbGMJNCg0LCVyMTIpLEJBU0VEKGNsZWFudXBfdGFibGVfaW9fd29ya19sb29wKQorCWJsCUJBU0VEKDBmKQorCWNsYwk0KDQsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9pb193b3JrX2xvb3ArNCkKKwlibAlCQVNFRChjbGVhbnVwX2lvX3JldHVybikKKzA6CiAJYnIJJXIxNAogCiBjbGVhbnVwX3N5c3RlbV9jYWxsOgogCW12YwlfX0xDX1JFVFVSTl9QU1coOCksMCglcjEyKQorCWMJJXIxMixCQVNFRCguTG1ja19vbGRfcHN3KQorCWJlCUJBU0VEKDBmKQorCWxhCSVyMTIsX19MQ19TQVZFX0FSRUErMTYKKwliCUJBU0VEKDFmKQorMDoJbGEJJXIxMixfX0xDX1NBVkVfQVJFQSszMgorMToKICNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwogCWNsYwlfX0xDX1JFVFVSTl9QU1crNCg0KSxCQVNFRChjbGVhbnVwX3N5c3RlbV9jYWxsX2luc24rNCkKIAliaAlCQVNFRCgwZikKQEAgLTgzOCwxMSArODYxLDEzIEBACiAjZW5kaWYKIAljbGMJX19MQ19SRVRVUk5fUFNXKzQoNCksQkFTRUQoY2xlYW51cF9zeXN0ZW1fY2FsbF9pbnNuKQogCWJoCUJBU0VEKDBmKQotCW12YwlfX0xDX1NBVkVfQVJFQSgxNiksX19MQ19TQVZFX0FSRUErMTYKLTA6CXN0CSVyMTMsX19MQ19TQVZFX0FSRUErMjAKKwltdmMJX19MQ19TQVZFX0FSRUEoMTYpLDAoJXIxMikKKzA6CXN0CSVyMTMsNCglcjEyKQorCXN0CSVyMTIsX19MQ19TQVZFX0FSRUErNDgJIyBhcmdoCiAJU0FWRV9BTEwgX19MQ19TVkNfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQSwxCiAJQ1JFQVRFX1NUQUNLX0ZSQU1FIF9fTENfU1ZDX09MRF9QU1csX19MQ19TQVZFX0FSRUEKLQlzdAklcjE1LF9fTENfU0FWRV9BUkVBKzI4CisJbAklcjEyLF9fTENfU0FWRV9BUkVBKzQ4CSMgYXJnaAorCXN0CSVyMTUsMTIoJXIxMikKIAlsaAklcjcsMHg4YQogI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCiBjbGVhbnVwX3Z0aW1lOgpAQCAtODc5LDE3ICs5MDQsMjEgQEAKIAogY2xlYW51cF9zeXNjX2xlYXZlOgogCWNsYwk0KDQsJXIxMiksQkFTRUQoY2xlYW51cF9zeXNjX2xlYXZlX2luc24pCi0JYmUJQkFTRUQoMGYpCisJYmUJQkFTRUQoMmYpCiAjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKIAltdmMJX19MQ19FWElUX1RJTUVSKDgpLF9fTENfQVNZTkNfRU5URVJfVElNRVIKIAljbGMJNCg0LCVyMTIpLEJBU0VEKGNsZWFudXBfc3lzY19sZWF2ZV9pbnNuKzQpCi0JYmUJQkFTRUQoMGYpCisJYmUJQkFTRUQoMmYpCiAjZW5kaWYKIAltdmMJX19MQ19SRVRVUk5fUFNXKDgpLFNQX1BTVyglcjE1KQotCW12YwlfX0xDX1NBVkVfQVJFQSsxNigxNiksU1BfUjEyKCVyMTUpCi0JbG0JJXIwLCVyMTEsU1BfUjAoJXIxNSkKKwljCSVyMTIsQkFTRUQoLkxtY2tfb2xkX3BzdykKKwlibmUJQkFTRUQoMGYpCisJbXZjCV9fTENfU0FWRV9BUkVBKzMyKDE2KSxTUF9SMTIoJXIxNSkKKwliCUJBU0VEKDFmKQorMDoJbXZjCV9fTENfU0FWRV9BUkVBKzE2KDE2KSxTUF9SMTIoJXIxNSkKKzE6CWxtCSVyMCwlcjExLFNQX1IwKCVyMTUpCiAJbAklcjE1LFNQX1IxNSglcjE1KQotMDoJbGEJJXIxMixfX0xDX1JFVFVSTl9QU1cKKzI6CWxhCSVyMTIsX19MQ19SRVRVUk5fUFNXCiAJYnIJJXIxNAogY2xlYW51cF9zeXNjX2xlYXZlX2luc246CiAjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKQEAgLTg5Nyw2ICs5MjYsMzYgQEAKICNlbmRpZgogCS5sb25nCXN5c2NfbGVhdmUgKyAxMCArIDB4ODAwMDAwMDAKIAorY2xlYW51cF9pb19yZXR1cm46CisJbXZjCV9fTENfUkVUVVJOX1BTVyg0KSwwKCVyMTIpCisJbXZjCV9fTENfUkVUVVJOX1BTVys0KDQpLEJBU0VEKGNsZWFudXBfdGFibGVfaW9fd29ya19sb29wKQorCWxhCSVyMTIsX19MQ19SRVRVUk5fUFNXCisJYnIJJXIxNAorCitjbGVhbnVwX2lvX2xlYXZlOgorCWNsYwk0KDQsJXIxMiksQkFTRUQoY2xlYW51cF9pb19sZWF2ZV9pbnNuKQorCWJlCUJBU0VEKDJmKQorI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCisJbXZjCV9fTENfRVhJVF9USU1FUig4KSxfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCisJY2xjCTQoNCwlcjEyKSxCQVNFRChjbGVhbnVwX2lvX2xlYXZlX2luc24rNCkKKwliZQlCQVNFRCgyZikKKyNlbmRpZgorCW12YwlfX0xDX1JFVFVSTl9QU1coOCksU1BfUFNXKCVyMTUpCisJYwklcjEyLEJBU0VEKC5MbWNrX29sZF9wc3cpCisJYm5lCUJBU0VEKDBmKQorCW12YwlfX0xDX1NBVkVfQVJFQSszMigxNiksU1BfUjEyKCVyMTUpCisJYglCQVNFRCgxZikKKzA6CW12YwlfX0xDX1NBVkVfQVJFQSsxNigxNiksU1BfUjEyKCVyMTUpCisxOglsbQklcjAsJXIxMSxTUF9SMCglcjE1KQorCWwJJXIxNSxTUF9SMTUoJXIxNSkKKzI6CWxhCSVyMTIsX19MQ19SRVRVUk5fUFNXCisJYnIJJXIxNAorY2xlYW51cF9pb19sZWF2ZV9pbnNuOgorI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCisJLmxvbmcJaW9fbGVhdmUgKyAxOCArIDB4ODAwMDAwMDAKKyNlbmRpZgorCS5sb25nCWlvX2xlYXZlICsgMTQgKyAweDgwMDAwMDAwCisKIC8qCiAgKiBJbnRlZ2VyIGNvbnN0YW50cwogICovCkBAIC05MTgsNiArOTc3LDcgQEAKIC5MczM5MF9tY2NrOiAgIC5sb25nICBzMzkwX2RvX21hY2hpbmVfY2hlY2sKIC5MczM5MF9oYW5kbGVfbWNjazoKIAkgICAgICAgLmxvbmcgIHMzOTBfaGFuZGxlX21jY2sKKy5MbWNrX29sZF9wc3c6IC5sb25nICBfX0xDX01DS19PTERfUFNXCiAuTGRvX0lSUTogICAgICAubG9uZyAgZG9fSVJRCiAuTGRvX2V4dGludDogICAubG9uZyAgZG9fZXh0aW50CiAuTGRvX3NpZ25hbDogICAubG9uZyAgZG9fc2lnbmFsCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCmluZGV4IGQ5ZjIyOTEuLmQwYzlmZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKQEAgLTEzMSwxNCArMTMxLDE0IEBACiAJc3RnCSVyMTIsX19TRl9CQUNLQ0hBSU4oJXIxNSkKICAgICAgICAgLmVuZG0KIAotCS5tYWNybwlSRVNUT1JFX0FMTCBzeW5jCi0JbXZjCV9fTENfUkVUVVJOX1BTVygxNiksU1BfUFNXKCVyMTUpICMgbW92ZSB1c2VyIFBTVyB0byBsb3djb3JlCisJLm1hY3JvCVJFU1RPUkVfQUxMIHBzd29yZyxzeW5jCisJbXZjCVxwc3dvcmcoMTYpLFNQX1BTVyglcjE1KSAjIG1vdmUgdXNlciBQU1cgdG8gbG93Y29yZQogCS5pZiAhXHN5bmMKLQluaQlfX0xDX1JFVFVSTl9QU1crMSwweGZkCSMgY2xlYXIgd2FpdCBzdGF0ZSBiaXQKKwluaQlccHN3b3JnKzEsMHhmZAkJIyBjbGVhciB3YWl0IHN0YXRlIGJpdAogCS5lbmRpZgogCWxtZwklcjAsJXIxNSxTUF9SMCglcjE1KQkjIGxvYWQgZ3BycyAwLTE1IG9mIHVzZXIKIAlTVE9SRV9USU1FUiBfX0xDX0VYSVRfVElNRVIKLQlscHN3ZQlfX0xDX1JFVFVSTl9QU1cJCSMgYmFjayB0byBjYWxsZXIKKwlscHN3ZQlccHN3b3JnCQkJIyBiYWNrIHRvIGNhbGxlcgogCS5lbmRtCiAKIC8qCkBAIC0yMTQsOCArMjE0LDggQEAKIHN5c2NfZG9fcmVzdGFydDoKIAlsYXJsICAgICVyMTAsc3lzX2NhbGxfdGFibGUKICNpZmRlZiBDT05GSUdfUzM5MF9TVVBQT1JUCi0gICAgICAgIHRtICAgICAgU1BfUFNXKzMoJXIxNSksMHgwMSAgIyBhcmUgd2UgcnVubmluZyBpbiAzMSBiaXQgbW9kZSA/Ci0gICAgICAgIGpvICAgICAgc3lzY19ub2VtdQorCXRtCV9fVElfZmxhZ3MrNSglcjkpLChfVElGXzMxQklUPj4xNikgICMgcnVubmluZyBpbiAzMSBiaXQgbW9kZSA/CisJam5vCXN5c2Nfbm9lbXUKIAlsYXJsICAgICVyMTAsc3lzX2NhbGxfdGFibGVfZW11ICAjIHVzZSAzMSBiaXQgZW11bGF0aW9uIHN5c3RlbSBjYWxscwogc3lzY19ub2VtdToKICNlbmRpZgpAQCAtMjMzLDcgKzIzMyw3IEBACiAJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9XT1JLX1NWQwogCWpueglzeXNjX3dvcmsgICAgICAgICAjIHRoZXJlIGlzIHdvcmsgdG8gZG8gKHNpZ25hbHMgZXRjLikKIHN5c2NfbGVhdmU6Ci0gICAgICAgIFJFU1RPUkVfQUxMIDEKKyAgICAgICAgUkVTVE9SRV9BTEwgX19MQ19SRVRVUk5fUFNXLDEKIAogIwogIyByZWNoZWNrIGlmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbwpAQCAtMzA4LDggKzMwOCw2IEBACiAJamcJZG9fc2luZ2xlX3N0ZXAJCSMgYnJhbmNoIHRvIGRvX3NpZ3RyYXAKIAogCi1fX2NyaXRpY2FsX2VuZDoKLQogIwogIyBjYWxsIHN5c2NhbGxfdHJhY2UgYmVmb3JlIGFuZCBhZnRlciBzeXN0ZW0gY2FsbAogIyBzcGVjaWFsIGxpbmthZ2U6ICVyMTIgY29udGFpbnMgdGhlIHJldHVybiBhZGRyZXNzIGZvciB0cmFjZV9zdmMKQEAgLTYxMiw3ICs2MTAsOCBAQAogCXRtCV9fVElfZmxhZ3MrNyglcjkpLF9USUZfV09SS19JTlQKIAlqbnoJaW9fd29yayAgICAgICAgICAgICAgICAjIHRoZXJlIGlzIHdvcmsgdG8gZG8gKHNpZ25hbHMgZXRjLikKIGlvX2xlYXZlOgotICAgICAgICBSRVNUT1JFX0FMTCAwCisgICAgICAgIFJFU1RPUkVfQUxMIF9fTENfUkVUVVJOX1BTVywwCitpb19kb25lOgogCiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKIGlvX3ByZWVtcHQ6CkBAIC03MTEsNiArNzEwLDggQEAKIAlicmFzbCAgICVyMTQsZG9fZXh0aW50CiAJaglpb19yZXR1cm4KIAorX19jcml0aWNhbF9lbmQ6CisKIC8qCiAgKiBNYWNoaW5lIGNoZWNrIGhhbmRsZXIgcm91dGluZXMKICAqLwpAQCAtNzE4LDYgKzcxOSw3IEBACiBtY2NrX2ludF9oYW5kbGVyOgogCWxhCSVyMSw0MDk1CQkjIHJldmFsaWRhdGUgcjEKIAlzcHQJX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBLTQwOTUoJXIxKQkjIHJldmFsaWRhdGUgY3B1IHRpbWVyCisJbXZjCV9fTENfQVNZTkNfRU5URVJfVElNRVIoOCksX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBLTQwOTUoJXIxKQogICAJbG1nICAgICAlcjAsJXIxNSxfX0xDX0dQUkVHU19TQVZFX0FSRUEtNDA5NSglcjEpIyByZXZhbGlkYXRlIGdwcnMKIAlTQVZFX0FMTF9CQVNFIF9fTENfU0FWRV9BUkVBKzY0CiAJbGEJJXIxMixfX0xDX01DS19PTERfUFNXCkBAIC03MzAsMTcgKzczMiw4IEBACiAJbXZjCV9fTENfQVNZTkNfRU5URVJfVElNRVIoOCksX19MQ19MQVNUX1VQREFURV9USU1FUgogCW12YwlfX0xDX1NZTkNfRU5URVJfVElNRVIoOCksX19MQ19MQVNUX1VQREFURV9USU1FUgogCW12YwlfX0xDX0VYSVRfVElNRVIoOCksX19MQ19MQVNUX1VQREFURV9USU1FUgotMDoJdG0JX19MQ19NQ0NLX0NPREUrMiwweDA4CSMgbXdwIG9mIG9sZCBwc3cgdmFsaWQ/Ci0Jam5vCW1jY2tfbm9fdnRpbWUJCSMgbm8gLT4gbm8gdGltZXIgdXBkYXRlCi0JdG0gICAgICBfX0xDX01DS19PTERfUFNXKzEsMHgwMSAjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPwotCWp6CW1jY2tfbm9fdnRpbWUKLQlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfQVNZTkNfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCi0JVVBEQVRFX1ZUSU1FIF9fTENfTEFTVF9VUERBVEVfVElNRVIsX19MQ19FWElUX1RJTUVSLF9fTENfU1lTVEVNX1RJTUVSCi0JbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19BU1lOQ19FTlRFUl9USU1FUgotbWNja19ub192dGltZToKICNlbmRpZgotMDoKLQl0bQlfX0xDX01DQ0tfQ09ERSsyLDB4MDkgICAjIG13cCArIGlhIG9mIG9sZCBwc3cgdmFsaWQ/CiswOgl0bQlfX0xDX01DQ0tfQ09ERSsyLDB4MDkgICAjIG13cCArIGlhIG9mIG9sZCBwc3cgdmFsaWQ/CiAJam5vCW1jY2tfaW50X21haW4JCSMgbm8gLT4gc2tpcCBjbGVhbnVwIGNyaXRpY2FsCiAJdG0gICAgICBfX0xDX01DS19PTERfUFNXKzEsMHgwMSAjIHRlc3QgcHJvYmxlbSBzdGF0ZSBiaXQKIAlqbnoJbWNja19pbnRfbWFpbgkJIyBmcm9tIHVzZXIgLT4gbG9hZCBrZXJuZWwgc3RhY2sKQEAgLTc1Niw2ICs3NDksMTYgQEAKIAlqegkwZgogCWxnICAgICAgJXIxNSxfX0xDX1BBTklDX1NUQUNLICAgIyBsb2FkIHBhbmljIHN0YWNrCiAwOglDUkVBVEVfU1RBQ0tfRlJBTUUgX19MQ19NQ0tfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQSs2NAorI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCisJdG0JX19MQ19NQ0NLX0NPREUrMiwweDA4CSMgbXdwIG9mIG9sZCBwc3cgdmFsaWQ/CisJam5vCW1jY2tfbm9fdnRpbWUJCSMgbm8gLT4gbm8gdGltZXIgdXBkYXRlCisJdG0gICAgICBfX0xDX01DS19PTERfUFNXKzEsMHgwMSAjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPworCWp6CW1jY2tfbm9fdnRpbWUKKwlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfQVNZTkNfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCisJVVBEQVRFX1ZUSU1FIF9fTENfTEFTVF9VUERBVEVfVElNRVIsX19MQ19FWElUX1RJTUVSLF9fTENfU1lTVEVNX1RJTUVSCisJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19BU1lOQ19FTlRFUl9USU1FUgorbWNja19ub192dGltZToKKyNlbmRpZgogCWxnCSVyOSxfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAogCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKIAlicmFzbAklcjE0LHMzOTBfZG9fbWFjaGluZV9jaGVjawpAQCAtNzcxLDcgKzc3NCw3IEBACiAJam5vCW1jY2tfcmV0dXJuCiAJYnJhc2wJJXIxNCxzMzkwX2hhbmRsZV9tY2NrCiBtY2NrX3JldHVybjoKLSAgICAgICAgUkVTVE9SRV9BTEwgMAorICAgICAgICBSRVNUT1JFX0FMTCBfX0xDX1JFVFVSTl9NQ0NLX1BTVywwCiAKICNpZmRlZiBDT05GSUdfU01QCiAvKgpAQCAtODMzLDYgKzgzNiwxMCBAQAogCS5xdWFkCXN5c2NfbGVhdmUsIHN5c2Nfd29ya19sb29wCiBjbGVhbnVwX3RhYmxlX3N5c2Nfd29ya19sb29wOgogCS5xdWFkCXN5c2Nfd29ya19sb29wLCBzeXNjX3Jlc2NoZWR1bGUKK2NsZWFudXBfdGFibGVfaW9fbGVhdmU6CisJLnF1YWQJaW9fbGVhdmUsIGlvX2RvbmUKK2NsZWFudXBfdGFibGVfaW9fd29ya19sb29wOgorCS5xdWFkCWlvX3dvcmtfbG9vcCwgaW9fbWNja19wZW5kaW5nCiAKIGNsZWFudXBfY3JpdGljYWw6CiAJY2xjCTgoOCwlcjEyKSxCQVNFRChjbGVhbnVwX3RhYmxlX3N5c3RlbV9jYWxsKQpAQCAtODU1LDEwICs4NjIsMjYgQEAKIAljbGMJOCg4LCVyMTIpLEJBU0VEKGNsZWFudXBfdGFibGVfc3lzY193b3JrX2xvb3ArOCkKIAlqbAljbGVhbnVwX3N5c2NfcmV0dXJuCiAwOgorCWNsYwk4KDgsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9pb19sZWF2ZSkKKwlqbAkwZgorCWNsYwk4KDgsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9pb19sZWF2ZSs4KQorCWpsCWNsZWFudXBfaW9fbGVhdmUKKzA6CisJY2xjCTgoOCwlcjEyKSxCQVNFRChjbGVhbnVwX3RhYmxlX2lvX3dvcmtfbG9vcCkKKwlqbAkwZgorCWNsYwk4KDgsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9pb193b3JrX2xvb3ArOCkKKwlqbAljbGVhbnVwX2lvX3JldHVybgorMDoKIAlicgklcjE0CiAKIGNsZWFudXBfc3lzdGVtX2NhbGw6CiAJbXZjCV9fTENfUkVUVVJOX1BTVygxNiksMCglcjEyKQorCWNnaGkJJXIxMixfX0xDX01DS19PTERfUFNXCisJamUJMGYKKwlsYQklcjEyLF9fTENfU0FWRV9BUkVBKzMyCisJagkxZgorMDoJbGEJJXIxMixfX0xDX1NBVkVfQVJFQSs2NAorMToKICNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwogCWNsYwlfX0xDX1JFVFVSTl9QU1crOCg4KSxCQVNFRChjbGVhbnVwX3N5c3RlbV9jYWxsX2luc24rOCkKIAlqaAkwZgpAQCAtODY4LDExICs4OTEsMTMgQEAKICNlbmRpZgogCWNsYwlfX0xDX1JFVFVSTl9QU1crOCg4KSxCQVNFRChjbGVhbnVwX3N5c3RlbV9jYWxsX2luc24pCiAJamgJMGYKLQltdmMJX19MQ19TQVZFX0FSRUEoMzIpLF9fTENfU0FWRV9BUkVBKzMyCi0wOglzdGcJJXIxMyxfX0xDX1NBVkVfQVJFQSs0MAorCW12YwlfX0xDX1NBVkVfQVJFQSgzMiksMCglcjEyKQorMDoJc3RnCSVyMTMsOCglcjEyKQorCXN0ZwklcjEyLF9fTENfU0FWRV9BUkVBKzk2CSMgYXJnaAogCVNBVkVfQUxMIF9fTENfU1ZDX09MRF9QU1csX19MQ19TQVZFX0FSRUEsMQogCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBCi0Jc3RnCSVyMTUsX19MQ19TQVZFX0FSRUErNTYKKwlsZwklcjEyLF9fTENfU0FWRV9BUkVBKzk2CSMgYXJnaAorCXN0ZwklcjE1LDI0KCVyMTIpCiAJbGxnaAklcjcsX19MQ19TVkNfSU5UX0NPREUKICNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwogY2xlYW51cF92dGltZToKQEAgLTkwOSwxNyArOTM0LDIxIEBACiAKIGNsZWFudXBfc3lzY19sZWF2ZToKIAljbGMJOCg4LCVyMTIpLEJBU0VEKGNsZWFudXBfc3lzY19sZWF2ZV9pbnNuKQotCWplCTBmCisJamUJMmYKICNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwogCW12YwlfX0xDX0VYSVRfVElNRVIoOCksX19MQ19BU1lOQ19FTlRFUl9USU1FUgogCWNsYwk4KDgsJXIxMiksQkFTRUQoY2xlYW51cF9zeXNjX2xlYXZlX2luc24rOCkKLQlqZQkwZgorCWplCTJmCiAjZW5kaWYKIAltdmMJX19MQ19SRVRVUk5fUFNXKDE2KSxTUF9QU1coJXIxNSkKLQltdmMJX19MQ19TQVZFX0FSRUErMzIoMzIpLFNQX1IxMiglcjE1KQotCWxtZwklcjAsJXIxMSxTUF9SMCglcjE1KQorCWNnaGkJJXIxMixfX0xDX01DS19PTERfUFNXCisJam5lCTBmCisJbXZjCV9fTENfU0FWRV9BUkVBKzY0KDMyKSxTUF9SMTIoJXIxNSkKKwlqCTFmCiswOgltdmMJX19MQ19TQVZFX0FSRUErMzIoMzIpLFNQX1IxMiglcjE1KQorMToJbG1nCSVyMCwlcjExLFNQX1IwKCVyMTUpCiAJbGcJJXIxNSxTUF9SMTUoJXIxNSkKLTA6CWxhCSVyMTIsX19MQ19SRVRVUk5fUFNXCisyOglsYQklcjEyLF9fTENfUkVUVVJOX1BTVwogCWJyCSVyMTQKIGNsZWFudXBfc3lzY19sZWF2ZV9pbnNuOgogI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCkBAIC05MjcsNiArOTU2LDM2IEBACiAjZW5kaWYKIAkucXVhZAlzeXNjX2xlYXZlICsgMTIKIAorY2xlYW51cF9pb19yZXR1cm46CisJbXZjCV9fTENfUkVUVVJOX1BTVyg4KSwwKCVyMTIpCisJbXZjCV9fTENfUkVUVVJOX1BTVys4KDgpLEJBU0VEKGNsZWFudXBfdGFibGVfaW9fd29ya19sb29wKQorCWxhCSVyMTIsX19MQ19SRVRVUk5fUFNXCisJYnIJJXIxNAorCitjbGVhbnVwX2lvX2xlYXZlOgorCWNsYwk4KDgsJXIxMiksQkFTRUQoY2xlYW51cF9pb19sZWF2ZV9pbnNuKQorCWplCTJmCisjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKKwltdmMJX19MQ19FWElUX1RJTUVSKDgpLF9fTENfQVNZTkNfRU5URVJfVElNRVIKKwljbGMJOCg4LCVyMTIpLEJBU0VEKGNsZWFudXBfaW9fbGVhdmVfaW5zbis4KQorCWplCTJmCisjZW5kaWYKKwltdmMJX19MQ19SRVRVUk5fUFNXKDE2KSxTUF9QU1coJXIxNSkKKwljZ2hpCSVyMTIsX19MQ19NQ0tfT0xEX1BTVworCWpuZQkwZgorCW12YwlfX0xDX1NBVkVfQVJFQSs2NCgzMiksU1BfUjEyKCVyMTUpCisJagkxZgorMDoJbXZjCV9fTENfU0FWRV9BUkVBKzMyKDMyKSxTUF9SMTIoJXIxNSkKKzE6CWxtZwklcjAsJXIxMSxTUF9SMCglcjE1KQorCWxnCSVyMTUsU1BfUjE1KCVyMTUpCisyOglsYQklcjEyLF9fTENfUkVUVVJOX1BTVworCWJyCSVyMTQKK2NsZWFudXBfaW9fbGVhdmVfaW5zbjoKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCS5xdWFkCWlvX2xlYXZlICsgMjAKKyNlbmRpZgorCS5xdWFkCWlvX2xlYXZlICsgMTYKKwogLyoKICAqIEludGVnZXIgY29uc3RhbnRzCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMKaW5kZXggMjcxMGU2Ni4uNTU2NTRiNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMKaW5kZXggOWE4MjYzYS4uYzlmZjA0MCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKaW5kZXggOGNhNDg1Ni4uMmZkNzVkYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKQEAgLTEzOSwxMCArMTM5LDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL3NwaW5sb2NrLmMgYi9hcmNoL3MzOTAvbGliL3NwaW5sb2NrLmMKaW5kZXggODg4YjU1OS4uMmRjMTRlOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi9zcGlubG9jay5jCisrKyBiL2FyY2gvczM5MC9saWIvc3BpbmxvY2suYwpAQCAtMzYsNyArMzYsNyBAQAogfQogCiB2b2lkCi1fcmF3X3NwaW5fbG9ja193YWl0KHNwaW5sb2NrX3QgKmxwLCB1bnNpZ25lZCBpbnQgcGMpCitfcmF3X3NwaW5fbG9ja193YWl0KHJhd19zcGlubG9ja190ICpscCwgdW5zaWduZWQgaW50IHBjKQogewogCWludCBjb3VudCA9IHNwaW5fcmV0cnk7CiAKQEAgLTUzLDcgKzUzLDcgQEAKIEVYUE9SVF9TWU1CT0woX3Jhd19zcGluX2xvY2tfd2FpdCk7CiAKIGludAotX3Jhd19zcGluX3RyeWxvY2tfcmV0cnkoc3BpbmxvY2tfdCAqbHAsIHVuc2lnbmVkIGludCBwYykKK19yYXdfc3Bpbl90cnlsb2NrX3JldHJ5KHJhd19zcGlubG9ja190ICpscCwgdW5zaWduZWQgaW50IHBjKQogewogCWludCBjb3VudCA9IHNwaW5fcmV0cnk7CiAKQEAgLTY3LDcgKzY3LDcgQEAKIEVYUE9SVF9TWU1CT0woX3Jhd19zcGluX3RyeWxvY2tfcmV0cnkpOwogCiB2b2lkCi1fcmF3X3JlYWRfbG9ja193YWl0KHJ3bG9ja190ICpydykKK19yYXdfcmVhZF9sb2NrX3dhaXQocmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBpbnQgb2xkOwogCWludCBjb3VudCA9IHNwaW5fcmV0cnk7CkBAIC04Niw3ICs4Niw3IEBACiBFWFBPUlRfU1lNQk9MKF9yYXdfcmVhZF9sb2NrX3dhaXQpOwogCiBpbnQKLV9yYXdfcmVhZF90cnlsb2NrX3JldHJ5KHJ3bG9ja190ICpydykKK19yYXdfcmVhZF90cnlsb2NrX3JldHJ5KHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgaW50IG9sZDsKIAlpbnQgY291bnQgPSBzcGluX3JldHJ5OwpAQCAtMTAyLDcgKzEwMiw3IEBACiBFWFBPUlRfU1lNQk9MKF9yYXdfcmVhZF90cnlsb2NrX3JldHJ5KTsKIAogdm9pZAotX3Jhd193cml0ZV9sb2NrX3dhaXQocndsb2NrX3QgKnJ3KQorX3Jhd193cml0ZV9sb2NrX3dhaXQocmF3X3J3bG9ja190ICpydykKIHsKIAlpbnQgY291bnQgPSBzcGluX3JldHJ5OwogCkBAIC0xMTksNyArMTE5LDcgQEAKIEVYUE9SVF9TWU1CT0woX3Jhd193cml0ZV9sb2NrX3dhaXQpOwogCiBpbnQKLV9yYXdfd3JpdGVfdHJ5bG9ja19yZXRyeShyd2xvY2tfdCAqcncpCitfcmF3X3dyaXRlX3RyeWxvY2tfcmV0cnkocmF3X3J3bG9ja190ICpydykKIHsKIAlpbnQgY291bnQgPSBzcGluX3JldHJ5OwogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3MuUyBiL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5TCmluZGV4IGU4MDI5ZWYuLjg4ZmM5NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5TCisrKyBiL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5TCkBAIC0xMSw3ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9sb3djb3JlLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogICAgICAgICAudGV4dAogICAgICAgICAuYWxpZ24gNApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzNjQuUyBiL2FyY2gvczM5MC9saWIvdWFjY2VzczY0LlMKaW5kZXggMGNhNTY5Ny4uNTAyMTk3OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzNjQuUworKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3M2NC5TCkBAIC0xMSw3ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9sb3djb3JlLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogICAgICAgICAudGV4dAogICAgICAgICAuYWxpZ24gNApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2ZhdWx0LmMgYi9hcmNoL3MzOTAvbW0vZmF1bHQuYwppbmRleCA3NWZkZTk0Li44NTZhOTcxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vZmF1bHQuYworKysgYi9hcmNoL3MzOTAvbW0vZmF1bHQuYwpAQCAtNTYzLDEyICs1NjMsMTQgQEAKIAkJCSAqIGludGVycnVwdC4gcGZhdWx0X3dhaXQgaXMgdmFsaWQuIFNldCBwZmF1bHRfd2FpdAogCQkJICogYmFjayB0byB6ZXJvIGFuZCB3YWtlIHVwIHRoZSBwcm9jZXNzLiBUaGlzIGNhbgogCQkJICogc2FmZWx5IGJlIGRvbmUgYmVjYXVzZSB0aGUgdGFzayBpcyBzdGlsbCBzbGVlcGluZwotCQkJICogYW5kIGNhbid0IHByb2N1ZGUgbmV3IHBmYXVsdHMuICovCisJCQkgKiBhbmQgY2FuJ3QgcHJvZHVjZSBuZXcgcGZhdWx0cy4gKi8KIAkJCXRzay0+dGhyZWFkLnBmYXVsdF93YWl0ID0gMDsKIAkJCXdha2VfdXBfcHJvY2Vzcyh0c2spOworCQkJcHV0X3Rhc2tfc3RydWN0KHRzayk7CiAJCX0KIAl9IGVsc2UgewogCQkvKiBzaWduYWwgYml0IG5vdCBzZXQgLT4gYSByZWFsIHBhZ2UgaXMgbWlzc2luZy4gKi8KKwkJZ2V0X3Rhc2tfc3RydWN0KHRzayk7CiAJCXNldF90YXNrX3N0YXRlKHRzaywgVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQlpZiAoeGNoZygmdHNrLT50aHJlYWQucGZhdWx0X3dhaXQsIDEpICE9IDApIHsKIAkJCS8qIENvbXBsZXRpb24gaW50ZXJydXB0IHdhcyBmYXN0ZXIgdGhhbiB0aGUgaW5pdGlhbApAQCAtNTc4LDYgKzU4MCw3IEBACiAJCQkgKiBtb2RlIGFuZCBjYW4ndCBwcm9kdWNlIG5ldyBwZmF1bHRzLiAqLwogCQkJdHNrLT50aHJlYWQucGZhdWx0X3dhaXQgPSAwOwogCQkJc2V0X3Rhc2tfc3RhdGUodHNrLCBUQVNLX1JVTk5JTkcpOworCQkJcHV0X3Rhc2tfc3RydWN0KHRzayk7CiAJCX0gZWxzZQogCQkJc2V0X3Rza19uZWVkX3Jlc2NoZWQodHNrKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcgYi9hcmNoL3NoL0tjb25maWcKaW5kZXggYWRjODEwOS4uM2U4MDRjNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnCisrKyBiL2FyY2gvc2gvS2NvbmZpZwpAQCAtMzcsNiArMzcsMTAgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQworCWJvb2wKKwlkZWZhdWx0IHkKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIG1lbnUgIlN5c3RlbSB0eXBlIgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9NYWtlZmlsZSBiL2FyY2gvc2gvTWFrZWZpbGUKaW5kZXggYjU2MzU2My4uMTlmMDBkNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL01ha2VmaWxlCkBAIC0xNTUsNyArMTU1LDcgQEAKIHByZXBhcmU6IG1ha2V0b29scyBpbmNsdWRlL2FzbS1zaC8uY3B1IGluY2x1ZGUvYXNtLXNoLy5tYWNoCiAKIC5QSE9OWTogbWFrZXRvb2xzIEZPUkNFCi1tYWtldG9vbHM6IGluY2x1ZGUvYXNtLXNoL2FzbS1vZmZzZXRzLmggaW5jbHVkZS9saW51eC92ZXJzaW9uLmggRk9SQ0UKK21ha2V0b29sczogIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIEZPUkNFCiAJJChRKSQoTUFLRSkgJChidWlsZCk9YXJjaC9zaC90b29scyBpbmNsdWRlL2FzbS1zaC9tYWNodHlwZXMuaAogCiBhbGw6IHpJbWFnZQpAQCAtMTY4LDE0ICsxNjgsNyBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tc2gvbWFjaHR5cGVzLmggaW5jbHVkZS9hc20tc2gvYXNtLW9mZnNldHMuaAotCi1hcmNoL3NoL2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBcCi0JCQkgICAgICBpbmNsdWRlL2FzbS1zaC8uY3B1IGluY2x1ZGUvYXNtLXNoLy5tYWNoCi0KLWluY2x1ZGUvYXNtLXNoL2FzbS1vZmZzZXRzLmg6IGFyY2gvc2gva2VybmVsL2FzbS1vZmZzZXRzLnMKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCi0KK0NMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLXNoL21hY2h0eXBlcy5oCiAKIGRlZmluZSBhcmNoaGVscAogCUBlY2hvICcgIHpJbWFnZSAJICAgICAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlIChhcmNoL3NoL2Jvb3QvekltYWdlKScKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2FkeC9pcnFfbWFza3JlZy5jIGIvYXJjaC9zaC9ib2FyZHMvYWR4L2lycV9tYXNrcmVnLmMKaW5kZXggY2E5MWJiMC4uYzA5NzNmOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYWR4L2lycV9tYXNrcmVnLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvYWR4L2lycV9tYXNrcmVnLmMKQEAgLTM3LDEzICszNywxMyBAQAogCiAvKiBod19pbnRlcnJ1cHRfdHlwZSAqLwogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBtYXNrcmVnX2lycV90eXBlID0gewotCSIgTWFzayBSZWdpc3RlciIsCi0Jc3RhcnR1cF9tYXNrcmVnX2lycSwKLQlzaHV0ZG93bl9tYXNrcmVnX2lycSwKLQllbmFibGVfbWFza3JlZ19pcnEsCi0JZGlzYWJsZV9tYXNrcmVnX2lycSwKLQltYXNrX2FuZF9hY2tfbWFza3JlZywKLQllbmRfbWFza3JlZ19pcnEKKwkudHlwZW5hbWUgPSAiIE1hc2sgUmVnaXN0ZXIiLAorCS5zdGFydHVwID0gc3RhcnR1cF9tYXNrcmVnX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9tYXNrcmVnX2lycSwKKwkuZW5hYmxlID0gZW5hYmxlX21hc2tyZWdfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9tYXNrcmVnX2lycSwKKwkuYWNrID0gbWFza19hbmRfYWNrX21hc2tyZWcsCisJLmVuZCA9IGVuZF9tYXNrcmVnX2lycQogfTsKIAogLyogYWN0dWFsIGltcGxlbWVudGF0aW4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2JpZ3N1ci9pby5jIGIvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lvLmMKaW5kZXggNjk3MTQ0ZC4uYTlmZGU3OCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lvLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lvLmMKQEAgLTM3LDEwICszNyw2IEBACiBzdGF0aWMgdTMyIGJpZ3N1cl9pb21hcF9oaVtCSUdTVVJfSU9NQVBfSElfTk1BUF07CiBzdGF0aWMgdTggYmlnc3VyX2lvbWFwX2hpX3NoaWZ0W0JJR1NVUl9JT01BUF9ISV9OTUFQXTsKIAotI2lmbmRlZiBNQVgKLSNkZWZpbmUgTUFYKGEsYikgICAgKChhKT4oYik/KGEpOihiKSkKLSNlbmRpZgotCiB2b2lkIGJpZ3N1cl9wb3J0X21hcCh1MzIgYmFzZXBvcnQsIHUzMiBucG9ydHMsIHUzMiBhZGRyLCB1OCBzaGlmdCkKIHsKIAl1MzIgcG9ydCwgZW5kcG9ydCA9IGJhc2Vwb3J0ICsgbnBvcnRzOwpAQCAtNTcsNyArNTMsNyBAQAogCSAgICAJYWRkciArPSAoMTw8KEJJR1NVUl9JT01BUF9MT19TSElGVCkpOwogCX0KIAotCWZvciAocG9ydCA9IE1BWChiYXNlcG9ydCwgQklHU1VSX0lPTUFQX0xPX1RIUkVTSCkgOworCWZvciAocG9ydCA9IG1heF90KHUzMiwgYmFzZXBvcnQsIEJJR1NVUl9JT01BUF9MT19USFJFU0gpOwogCSAgICAgcG9ydCA8IGVuZHBvcnQgJiYgcG9ydCA8IEJJR1NVUl9JT01BUF9ISV9USFJFU0ggOwogCSAgICAgcG9ydCArPSAoMTw8QklHU1VSX0lPTUFQX0hJX1NISUZUKSkgewogCSAgICAJcHJfZGVidWcoIiAgICBtYXBoaVsweCV4XSA9IDB4JTA4eFxuIiwgcG9ydCwgYWRkcik7CkBAIC04MCw3ICs3Niw3IEBACiAJCWJpZ3N1cl9pb21hcF9sb1twb3J0Pj5CSUdTVVJfSU9NQVBfTE9fU0hJRlRdID0gMDsKIAl9CiAKLQlmb3IgKHBvcnQgPSBNQVgoYmFzZXBvcnQsIEJJR1NVUl9JT01BUF9MT19USFJFU0gpIDsKKwlmb3IgKHBvcnQgPSBtYXhfdCh1MzIsIGJhc2Vwb3J0LCBCSUdTVVJfSU9NQVBfTE9fVEhSRVNIKTsKIAkgICAgIHBvcnQgPCBlbmRwb3J0ICYmIHBvcnQgPCBCSUdTVVJfSU9NQVBfSElfVEhSRVNIIDsKIAkgICAgIHBvcnQgKz0gKDE8PEJJR1NVUl9JT01BUF9ISV9TSElGVCkpIHsKIAkJYmlnc3VyX2lvbWFwX2hpW3BvcnQ+PkJJR1NVUl9JT01BUF9ISV9TSElGVF0gPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lycS5jCmluZGV4IGMxODhmYzMuLjZkZGJjYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2JpZ3N1ci9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaXJxLmMKQEAgLTIyOCwyMyArMjI4LDIzIEBACiAKIC8qIERlZmluZSB0aGUgSVJRIHN0cnVjdHVyZXMgZm9yIHRoZSBMMSBhbmQgTDIgSVJRIHR5cGVzICovCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGJpZ3N1cl9sMWlycV90eXBlID0gewotICAgICAgICAiQmlnU3VyLUNQTEQtTGV2ZWwxLUlSUSIsCi0gICAgICAgIHN0YXJ0dXBfYmlnc3VyX2lycSwKLSAgICAgICAgc2h1dGRvd25fYmlnc3VyX2lycSwKLSAgICAgICAgZW5hYmxlX2JpZ3N1cl9sMWlycSwKLSAgICAgICAgZGlzYWJsZV9iaWdzdXJfbDFpcnEsCi0gICAgICAgIG1hc2tfYW5kX2Fja19iaWdzdXIsCi0gICAgICAgIGVuZF9iaWdzdXJfaXJxCisJLnR5cGVuYW1lICA9ICJCaWdTdXItQ1BMRC1MZXZlbDEtSVJRIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfYmlnc3VyX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9iaWdzdXJfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfYmlnc3VyX2wxaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9iaWdzdXJfbDFpcnEsCisJLmFjayA9IG1hc2tfYW5kX2Fja19iaWdzdXIsCisJLmVuZCA9IGVuZF9iaWdzdXJfaXJxCiB9OwogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGJpZ3N1cl9sMmlycV90eXBlID0gewotICAgICAgICAiQmlnU3VyLUNQTEQtTGV2ZWwyLUlSUSIsCi0gICAgICAgIHN0YXJ0dXBfYmlnc3VyX2lycSwKLSAgICAgICAgc2h1dGRvd25fYmlnc3VyX2lycSwKLSAgICAgICAgZW5hYmxlX2JpZ3N1cl9sMmlycSwKLSAgICAgICAgZGlzYWJsZV9iaWdzdXJfbDJpcnEsCi0gICAgICAgIG1hc2tfYW5kX2Fja19iaWdzdXIsCi0gICAgICAgIGVuZF9iaWdzdXJfaXJxCisJLnR5cGVuYW1lICA9ICJCaWdTdXItQ1BMRC1MZXZlbDItSVJRIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfYmlnc3VyX2lycSwKKwkuc2h1dGRvd24gID1zaHV0ZG93bl9iaWdzdXJfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfYmlnc3VyX2wyaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9iaWdzdXJfbDJpcnEsCisJLmFjayA9IG1hc2tfYW5kX2Fja19iaWdzdXIsCisJLmVuZCA9IGVuZF9iaWdzdXJfaXJxCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2NxcmVlay9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL2NxcmVlay9pcnEuYwppbmRleCBmYTZjZmU1Li5kMWRhMGQ4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9jcXJlZWsvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvY3FyZWVrL2lycS5jCkBAIC04MywxMyArODMsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBjcXJlZWtfaXJxX3R5cGUgPSB7Ci0JIkNxUkVFSy1JUlEiLAotCXN0YXJ0dXBfY3FyZWVrX2lycSwKLQlzaHV0ZG93bl9jcXJlZWtfaXJxLAotCWVuYWJsZV9jcXJlZWtfaXJxLAotCWRpc2FibGVfY3FyZWVrX2lycSwKLQltYXNrX2FuZF9hY2tfY3FyZWVrLAotCWVuZF9jcXJlZWtfaXJxCisJLnR5cGVuYW1lID0gIkNxUkVFSy1JUlEiLAorCS5zdGFydHVwID0gc3RhcnR1cF9jcXJlZWtfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX2NxcmVla19pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9jcXJlZWtfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9jcXJlZWtfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfY3FyZWVrLAorCS5lbmQgPSBlbmRfY3FyZWVrX2lycQogfTsKIAogaW50IGNxcmVla19oYXNfaWRlLCBjcXJlZWtfaGFzX2lzYTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hhcnAvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9oYXJwL2lycS5jCmluZGV4IGFjZDU4NDguLjUyZDBiYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2hhcnAvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvaGFycC9pcnEuYwpAQCAtMzksMTMgKzM5LDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaGFycF9pcnFfdHlwZSA9IHsKLQkiSGFycC1JUlEiLAotCXN0YXJ0dXBfaGFycF9pcnEsCi0Jc2h1dGRvd25faGFycF9pcnEsCi0JZW5hYmxlX2hhcnBfaXJxLAotCWRpc2FibGVfaGFycF9pcnEsCi0JbWFza19hbmRfYWNrX2hhcnAsCi0JZW5kX2hhcnBfaXJxCisJLnR5cGVuYW1lID0gIkhhcnAtSVJRIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfaGFycF9pcnEsCisJLnNodXRkb3duID0gc2h1dGRvd25faGFycF9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9oYXJwX2lycSwKKwkuZGlzYWJsZSA9IGRpc2FibGVfaGFycF9pcnEsCisJLmFjayA9IG1hc2tfYW5kX2Fja19oYXJwLAorCS5lbmQgPSBlbmRfaGFycF9pcnEKIH07CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfaGFycF9pcnEodW5zaWduZWQgaW50IGlycSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9pcnEuYwppbmRleCAyM2FkYzZiLi43MTVlOGZlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL2lycS5jCkBAIC04NiwxMyArODYsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBvZF9pcnFfdHlwZSA9IHsKLQkiT3ZlcmRyaXZlLUlSUSIsCi0Jc3RhcnR1cF9vZF9pcnEsCi0Jc2h1dGRvd25fb2RfaXJxLAotCWVuYWJsZV9vZF9pcnEsCi0JZGlzYWJsZV9vZF9pcnEsCi0JbWFza19hbmRfYWNrX29kLAotCWVuZF9vZF9pcnEKKwkudHlwZW5hbWUgPSAiT3ZlcmRyaXZlLUlSUSIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX29kX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9vZF9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9vZF9pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX29kX2lycSwKKwkuYWNrID0gbWFza19hbmRfYWNrX29kLAorCS5lbmQgPSBlbmRfb2RfaXJxCiB9OwogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX29kX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaXJxLmMKaW5kZXggYTc5MjFmNi4uZWQ0YzViNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL2lycS5jCkBAIC03NCwxMyArNzQsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBoczc3NTFydm9pcF9pcnFfdHlwZSA9IHsKLQkiSFM3NzUxUlZvSVAgSVJRIiwKLQlzdGFydHVwX2hzNzc1MXJ2b2lwX2lycSwKLQlzaHV0ZG93bl9oczc3NTFydm9pcF9pcnEsCi0JZW5hYmxlX2hzNzc1MXJ2b2lwX2lycSwKLQlkaXNhYmxlX2hzNzc1MXJ2b2lwX2lycSwKLQlhY2tfaHM3NzUxcnZvaXBfaXJxLAotCWVuZF9oczc3NTFydm9pcF9pcnEsCisJLnR5cGVuYW1lID0gICJIUzc3NTFSVm9JUCBJUlEiLAorCS5zdGFydHVwID0gc3RhcnR1cF9oczc3NTFydm9pcF9pcnEsCisJLnNodXRkb3duID0gc2h1dGRvd25faHM3NzUxcnZvaXBfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfaHM3NzUxcnZvaXBfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9oczc3NTFydm9pcF9pcnEsCisJLmFjayA9IGFja19oczc3NTFydm9pcF9pcnEsCisJLmVuZCA9IGVuZF9oczc3NTFydm9pcF9pcnEsCiB9OwogCiBzdGF0aWMgdm9pZCBtYWtlX2hzNzc1MXJ2b2lwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lycS5jCmluZGV4IDk1NzE3ZjQuLmQzNmM5MzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaXJxLmMKQEAgLTg4LDEzICs4OCwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHJ0czc3NTFyMmRfaXJxX3R5cGUgPSB7Ci0JIlJUUzc3NTFSMkQgSVJRIiwKLQlzdGFydHVwX3J0czc3NTFyMmRfaXJxLAotCXNodXRkb3duX3J0czc3NTFyMmRfaXJxLAotCWVuYWJsZV9ydHM3NzUxcjJkX2lycSwKLQlkaXNhYmxlX3J0czc3NTFyMmRfaXJxLAotCWFja19ydHM3NzUxcjJkX2lycSwKLQllbmRfcnRzNzc1MXIyZF9pcnEsCisJLnR5cGVuYW1lID0gIlJUUzc3NTFSMkQgSVJRIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfcnRzNzc1MXIyZF9pcnEsCisJLnNodXRkb3duID0gc2h1dGRvd25fcnRzNzc1MXIyZF9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9ydHM3NzUxcjJkX2lycSwKKwkuZGlzYWJsZSA9IGRpc2FibGVfcnRzNzc1MXIyZF9pcnEsCisJLmFjayA9IGFja19ydHM3NzUxcjJkX2lycSwKKwkuZW5kID0gZW5kX3J0czc3NTFyMmRfaXJxLAogfTsKIAogc3RhdGljIHZvaWQgbWFrZV9ydHM3NzUxcjJkX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL2lycS5jCmluZGV4IDU2NzVhNDEuLjdhMmViMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3N5c3RlbWgvaXJxLmMKQEAgLTM1LDEzICszNSwxMyBAQAogCiAvKiBod19pbnRlcnJ1cHRfdHlwZSAqLwogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBzeXN0ZW1oX2lycV90eXBlID0gewotCSIgU3lzdGVtSCBSZWdpc3RlciIsCi0Jc3RhcnR1cF9zeXN0ZW1oX2lycSwKLQlzaHV0ZG93bl9zeXN0ZW1oX2lycSwKLQllbmFibGVfc3lzdGVtaF9pcnEsCi0JZGlzYWJsZV9zeXN0ZW1oX2lycSwKLQltYXNrX2FuZF9hY2tfc3lzdGVtaCwKLQllbmRfc3lzdGVtaF9pcnEKKwkudHlwZW5hbWUgPSAiIFN5c3RlbUggUmVnaXN0ZXIiLAorCS5zdGFydHVwID0gc3RhcnR1cF9zeXN0ZW1oX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9zeXN0ZW1oX2lycSwKKwkuZW5hYmxlID0gZW5hYmxlX3N5c3RlbWhfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9zeXN0ZW1oX2lycSwKKwkuYWNrID0gbWFza19hbmRfYWNrX3N5c3RlbWgsCisJLmVuZCA9IGVuZF9zeXN0ZW1oX2lycQogfTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3N5c3RlbWhfaXJxKHVuc2lnbmVkIGludCBpcnEpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvaXJxLmMKaW5kZXggMTI5ODg4My4uMTM5NWMxZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc3VwZXJoL21pY3JvZGV2L2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3N1cGVyaC9taWNyb2Rldi9pcnEuYwpAQCAtODMsMTMgKzgzLDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgbWljcm9kZXZfaXJxX3R5cGUgPSB7Ci0JIk1pY3JvRGV2LUlSUSIsCi0Jc3RhcnR1cF9taWNyb2Rldl9pcnEsCi0Jc2h1dGRvd25fbWljcm9kZXZfaXJxLAotCWVuYWJsZV9taWNyb2Rldl9pcnEsCi0JZGlzYWJsZV9taWNyb2Rldl9pcnEsCi0JbWFza19hbmRfYWNrX21pY3JvZGV2LAotCWVuZF9taWNyb2Rldl9pcnEKKwkudHlwZW5hbWUgPSAiTWljcm9EZXYtSVJRIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfbWljcm9kZXZfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX21pY3JvZGV2X2lycSwKKwkuZW5hYmxlID0gZW5hYmxlX21pY3JvZGV2X2lycSwKKwkuZGlzYWJsZSA9IGRpc2FibGVfbWljcm9kZXZfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfbWljcm9kZXYsCisJLmVuZCA9IGVuZF9taWNyb2Rldl9pcnEKIH07CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfbWljcm9kZXZfaXJxKHVuc2lnbmVkIGludCBpcnEpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NjaGlwcy9oZDY0NDZ4L2hkNjQ0NjUvaW8uYyBiL2FyY2gvc2gvY2NoaXBzL2hkNjQ0NngvaGQ2NDQ2NS9pby5jCmluZGV4IDk5YWM3MDkuLjg0Y2IxNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL2hkNjQ0NngvaGQ2NDQ2NS9pby5jCisrKyBiL2FyY2gvc2gvY2NoaXBzL2hkNjQ0NngvaGQ2NDQ2NS9pby5jCkBAIC00OCwxMCArNDgsNiBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcJaGQ2NDQ2NV9pb21hcF9oaVtIRDY0NDY1X0lPTUFQX0hJX05NQVBdOwogc3RhdGljIHVuc2lnbmVkIGNoYXIJaGQ2NDQ2NV9pb21hcF9oaV9zaGlmdFtIRDY0NDY1X0lPTUFQX0hJX05NQVBdOwogCi0jaWZuZGVmIE1BWAotI2RlZmluZSBNQVgoYSxiKSAgICAoKGEpPihiKT8oYSk6KGIpKQotI2VuZGlmCi0KICNkZWZpbmUgUE9SVDJBRERSKHgpIChzaF9tdi5tdl9pc2FfcG9ydDJhZGRyKHgpKQogCiB2b2lkIGhkNjQ0NjVfcG9ydF9tYXAodW5zaWduZWQgc2hvcnQgYmFzZXBvcnQsIHVuc2lnbmVkIGludCBucG9ydHMsCkBAIC03MSw3ICs2Nyw3IEBACiAJICAgIGFkZHIgKz0gKDE8PChIRDY0NDY1X0lPTUFQX0xPX1NISUZUKSk7CiAJfQogCi0JZm9yIChwb3J0ID0gTUFYKGJhc2Vwb3J0LCBIRDY0NDY1X0lPTUFQX0xPX1RIUkVTSCkgOworCWZvciAocG9ydCA9IG1heF90KHVuc2lnbmVkIGludCwgYmFzZXBvcnQsIEhENjQ0NjVfSU9NQVBfTE9fVEhSRVNIKTsKIAkgICAgIHBvcnQgPCBlbmRwb3J0ICYmIHBvcnQgPCBIRDY0NDY1X0lPTUFQX0hJX1RIUkVTSCA7CiAJICAgICBwb3J0ICs9ICgxPDxIRDY0NDY1X0lPTUFQX0hJX1NISUZUKSkgewogCSAgICBEUFJJTlRLKCIgICAgbWFwaGlbMHgleF0gPSAweCUwOGx4XG4iLCBwb3J0LCBhZGRyKTsKQEAgLTk1LDcgKzkxLDcgQEAKICAgICAJICAgIGhkNjQ0NjVfaW9tYXBfbG9bcG9ydD4+SEQ2NDQ2NV9JT01BUF9MT19TSElGVF0gPSAwOwogCX0KIAotCWZvciAocG9ydCA9IE1BWChiYXNlcG9ydCwgSEQ2NDQ2NV9JT01BUF9MT19USFJFU0gpIDsKKwlmb3IgKHBvcnQgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIGJhc2Vwb3J0LCBIRDY0NDY1X0lPTUFQX0xPX1RIUkVTSCk7CiAJICAgICBwb3J0IDwgZW5kcG9ydCAmJiBwb3J0IDwgSEQ2NDQ2NV9JT01BUF9ISV9USFJFU0ggOwogCSAgICAgcG9ydCArPSAoMTw8SEQ2NDQ2NV9JT01BUF9ISV9TSElGVCkpIHsKICAgICAJICAgIGhkNjQ0NjVfaW9tYXBfaGlbcG9ydD4+SEQ2NDQ2NV9JT01BUF9ISV9TSElGVF0gPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jIGIvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jCmluZGV4IDMwNzkyMzQuLjFiNmFjNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9pcnEuYworKysgYi9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvaXJxLmMKQEAgLTg3LDEzICs4NywxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHZveWFnZXJneF9pcnFfdHlwZSA9IHsKLQkiVk9ZQUdFUkdYLUlSUSIsCi0Jc3RhcnR1cF92b3lhZ2VyZ3hfaXJxLAotCXNodXRkb3duX3ZveWFnZXJneF9pcnEsCi0JZW5hYmxlX3ZveWFnZXJneF9pcnEsCi0JZGlzYWJsZV92b3lhZ2VyZ3hfaXJxLAotCW1hc2tfYW5kX2Fja192b3lhZ2VyZ3gsCi0JZW5kX3ZveWFnZXJneF9pcnEsCisJLnR5cGVuYW1lID0gIlZPWUFHRVJHWC1JUlEiLAorCS5zdGFydHVwID0gc3RhcnR1cF92b3lhZ2VyZ3hfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX3ZveWFnZXJneF9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV92b3lhZ2VyZ3hfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV92b3lhZ2VyZ3hfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfdm95YWdlcmd4LAorCS5lbmQgPSBlbmRfdm95YWdlcmd4X2lycSwKIH07CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB2b3lhZ2VyZ3hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxX2ltYXNrLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxX2ltYXNrLmMKaW5kZXggZjc2OTAxZS4uYTk2M2QwMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycV9pbWFzay5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnFfaW1hc2suYwpAQCAtNDYsMTMgKzQ2LDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW1hc2tfaXJxX3R5cGUgPSB7Ci0JIlNSLklNQVNLIiwKLQlzdGFydHVwX2ltYXNrX2lycSwKLQlzaHV0ZG93bl9pbWFza19pcnEsCi0JZW5hYmxlX2ltYXNrX2lycSwKLQlkaXNhYmxlX2ltYXNrX2lycSwKLQltYXNrX2FuZF9hY2tfaW1hc2ssCi0JZW5kX2ltYXNrX2lycQorCS50eXBlbmFtZSA9ICJTUi5JTUFTSyIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX2ltYXNrX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9pbWFza19pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9pbWFza19pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX2ltYXNrX2lycSwKKwkuYWNrID0gbWFza19hbmRfYWNrX2ltYXNrLAorCS5lbmQgPSBlbmRfaW1hc2tfaXJxCiB9OwogCiB2b2lkIHN0YXRpYyBpbmxpbmUgc2V0X2ludGVycnVwdF9yZWdpc3RlcnMoaW50IGlwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycV9pcHIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnFfaXByLmMKaW5kZXggN2VhM2QyZC4uNzFmOTIwOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycV9pcHIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxX2lwci5jCkBAIC00OCwxMyArNDgsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpcHJfaXJxX3R5cGUgPSB7Ci0JIklQUi1JUlEiLAotCXN0YXJ0dXBfaXByX2lycSwKLQlzaHV0ZG93bl9pcHJfaXJxLAotCWVuYWJsZV9pcHJfaXJxLAotCWRpc2FibGVfaXByX2lycSwKLQltYXNrX2FuZF9hY2tfaXByLAotCWVuZF9pcHJfaXJxCisJLnR5cGVuYW1lID0gIklQUi1JUlEiLAorCS5zdGFydHVwID0gc3RhcnR1cF9pcHJfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX2lwcl9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9pcHJfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9pcHJfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfaXByLAorCS5lbmQgPSBlbmRfaXByX2lycQogfTsKIAogc3RhdGljIHZvaWQgZGlzYWJsZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpCkBAIC0xNDIsMTMgKzE0MiwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHBpbnRfaXJxX3R5cGUgPSB7Ci0JIlBJTlQtSVJRIiwKLQlzdGFydHVwX3BpbnRfaXJxLAotCXNodXRkb3duX3BpbnRfaXJxLAotCWVuYWJsZV9waW50X2lycSwKLQlkaXNhYmxlX3BpbnRfaXJxLAotCW1hc2tfYW5kX2Fja19waW50LAotCWVuZF9waW50X2lycQorCS50eXBlbmFtZSA9ICJQSU5ULUlSUSIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX3BpbnRfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX3BpbnRfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfcGludF9pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX3BpbnRfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfcGludCwKKwkuZW5kID0gZW5kX3BpbnRfaXJxCiB9OwogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3BpbnRfaXJxKHVuc2lnbmVkIGludCBpcnEpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2lycV9pbnRjMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9pcnFfaW50YzIuYwppbmRleCAwOTllYmJmLi5mNmIxNmJhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2lycV9pbnRjMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvaXJxX2ludGMyLmMKQEAgLTQ4LDEzICs0OCwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGludGMyX2lycV90eXBlID0gewotCSJJTlRDMi1JUlEiLAotCXN0YXJ0dXBfaW50YzJfaXJxLAotCXNodXRkb3duX2ludGMyX2lycSwKLQllbmFibGVfaW50YzJfaXJxLAotCWRpc2FibGVfaW50YzJfaXJxLAotCW1hc2tfYW5kX2Fja19pbnRjMiwKLQllbmRfaW50YzJfaXJxCisJLnR5cGVuYW1lID0gIklOVEMyLUlSUSIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX2ludGMyX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9pbnRjMl9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9pbnRjMl9pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX2ludGMyX2lycSwKKwkuYWNrID0gbWFza19hbmRfYWNrX2ludGMyLAorCS5lbmQgPSBlbmRfaW50YzJfaXJxCiB9OwogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2ludGMyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zaC9rZXJuZWwvdGltZS5jCmluZGV4IGRmN2E5YjkuLjAyY2E2OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3NoL2tlcm5lbC90aW1lLmMKQEAgLTIxNSwxMCArMjE1LDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAKQEAgLTIzNCw3ICsyMzEsNyBAQAogICogdGltZXJfaW50ZXJydXB0KCkgbmVlZHMgdG8ga2VlcCB1cCB0aGUgcmVhbC10aW1lIGNsb2NrLAogICogYXMgd2VsbCBhcyBjYWxsIHRoZSAiZG9fdGltZXIoKSIgcm91dGluZSBldmVyeSBjbG9ja3RpY2sKICAqLwotc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlkb190aW1lcihyZWdzKTsKICNpZm5kZWYgQ09ORklHX1NNUApAQCAtMjUyLDcgKzI0OSw3IEBACiAJICogUlRDIGNsb2NrIGFjY29yZGluZ2x5IGV2ZXJ5IH4xMSBtaW51dGVzLiBTZXRfcnRjX21tc3MoKSBoYXMgdG8gYmUKIAkgKiBjYWxsZWQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gNTAwIG1zIGJlZm9yZSB0aGUgbmV3IHNlY29uZCBzdGFydHMuCiAJICovCi0JaWYgKCh0aW1lX3N0YXR1cyAmIFNUQV9VTlNZTkMpID09IDAgJiYKKwlpZiAobnRwX3N5bmNlZCgpICYmCiAJICAgIHh0aW1lLnR2X3NlYyA+IGxhc3RfcnRjX3VwZGF0ZSArIDY2MCAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApID49IDUwMDAwMCAtICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPD0gNTAwMDAwICsgKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIpIHsKQEAgLTI4NSw3ICsyODIsNyBAQAogCSAqIGxvY2FsbHkgZGlzYWJsZWQuIC1hcmNhCiAJICovCiAJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0JZG9fdGltZXJfaW50ZXJydXB0KGlycSwgTlVMTCwgcmVncyk7CisJZG9fdGltZXJfaW50ZXJydXB0KGlycSwgcmVncyk7CiAJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9LY29uZmlnIGIvYXJjaC9zaDY0L0tjb25maWcKaW5kZXggNGMzZTUzMy4uZmIzNWI0NSAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L0tjb25maWcKKysrIGIvYXJjaC9zaDY0L0tjb25maWcKQEAgLTI5LDEwICsyOSw2IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCi1jb25maWcgTE9HX0JVRl9TSElGVAotCWludAotCWRlZmF1bHQgMTQKLQogY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCiAJYm9vbAogCmRpZmYgLS1naXQgYS9hcmNoL3NoNjQvTWFrZWZpbGUgYi9hcmNoL3NoNjQvTWFrZWZpbGUKaW5kZXggYjRmZDhlMS4uMzkwNzM3MyAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L01ha2VmaWxlCisrKyBiL2FyY2gvc2g2NC9NYWtlZmlsZQpAQCAtNzMsMTEgKzczLDcgQEAKIGFyY2hjbGVhbjoKIAkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKGJvb3QpCiAKLXByZXBhcmU6IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtLW9mZnNldHMuaCBhcmNoLyQoQVJDSCkvbGliL3N5c2NhbGx0YWIuaAotCi1pbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbS1vZmZzZXRzLmg6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucyBcCi0JCQkJICAgaW5jbHVkZS9hc20gaW5jbHVkZS9saW51eC92ZXJzaW9uLmgKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCitwcmVwYXJlOiBhcmNoLyQoQVJDSCkvbGliL3N5c2NhbGx0YWIuaAogCiBkZWZpbmUgZmlsZWNoa19nZW4tc3lzY2FsbHRhYgogICAgICAgIChzZXQgLWU7IFwKQEAgLTEwOCw3ICsxMDQsNyBAQAogYXJjaC8kKEFSQ0gpL2xpYi9zeXNjYWxsdGFiLmg6IGFyY2gvc2g2NC9rZXJuZWwvc3lzY2FsbHMuUwogCSQoY2FsbCBmaWxlY2hrLGdlbi1zeXNjYWxsdGFiKQogCi1DTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbS1vZmZzZXRzLmggYXJjaC8kKEFSQ0gpL2xpYi9zeXNjYWxsdGFiLmgKK0NMRUFOX0ZJTEVTICs9IGFyY2gvJChBUkNIKS9saWIvc3lzY2FsbHRhYi5oCiAKIGRlZmluZSBhcmNoaGVscAogCUBlY2hvICcgIHpJbWFnZSAJICAgICAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlIChhcmNoL3NoNjQvYm9vdC96SW1hZ2UpJwpkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L2tlcm5lbC9pcnFfaW50Yy5jIGIvYXJjaC9zaDY0L2tlcm5lbC9pcnFfaW50Yy5jCmluZGV4IDQzZjg4ZjMuLmZjOTliZjRlIDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL2lycV9pbnRjLmMKKysrIGIvYXJjaC9zaDY0L2tlcm5lbC9pcnFfaW50Yy5jCkBAIC0xMDcsMTMgKzEwNywxMyBAQAogc3RhdGljIHZvaWQgZW5kX2ludGNfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGludGNfaXJxX3R5cGUgPSB7Ci0JIklOVEMiLAotCXN0YXJ0dXBfaW50Y19pcnEsCi0Jc2h1dGRvd25faW50Y19pcnEsCi0JZW5hYmxlX2ludGNfaXJxLAotCWRpc2FibGVfaW50Y19pcnEsCi0JbWFza19hbmRfYWNrX2ludGMsCi0JZW5kX2ludGNfaXJxCisJLnR5cGVuYW1lID0gIklOVEMiLAorCS5zdGFydHVwID0gc3RhcnR1cF9pbnRjX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9pbnRjX2lycSwKKwkuZW5hYmxlID0gZW5hYmxlX2ludGNfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9pbnRjX2lycSwKKwkuYWNrID0gbWFza19hbmRfYWNrX2ludGMsCisJLmVuZCA9IGVuZF9pbnRjX2lycQogfTsKIAogc3RhdGljIGludCBpcmxtOwkJLyogSVJMIG1vZGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zaDY0L2tlcm5lbC90aW1lLmMKaW5kZXggNmM4NGRhMy4uZjRhNjJhMSAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zaDY0L2tlcm5lbC90aW1lLmMKQEAgLTI0NywxMCArMjQ3LDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAKQEAgLTMwMyw3ICszMDAsNyBAQAogICogdGltZXJfaW50ZXJydXB0KCkgbmVlZHMgdG8ga2VlcCB1cCB0aGUgcmVhbC10aW1lIGNsb2NrLAogICogYXMgd2VsbCBhcyBjYWxsIHRoZSAiZG9fdGltZXIoKSIgcm91dGluZSBldmVyeSBjbG9ja3RpY2sKICAqLwotc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgY3VycmVudF9jdGM7CiAJYXNtICgiZ2V0Y29uIGNyNjIsICUwIiA6ICI9ciIgKGN1cnJlbnRfY3RjKSk7CkBAIC0zMjgsNyArMzI1LDcgQEAKIAkgKiBSVEMgY2xvY2sgYWNjb3JkaW5nbHkgZXZlcnkgfjExIG1pbnV0ZXMuIFNldF9ydGNfbW1zcygpIGhhcyB0byBiZQogCSAqIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byA1MDAgbXMgYmVmb3JlIHRoZSBuZXcgc2Vjb25kIHN0YXJ0cy4KIAkgKi8KLQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorCWlmIChudHBfc3luY2VkKCkgJiYKIAkgICAgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPj0gNTAwMDAwIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA8PSA1MDAwMDAgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMikgewpAQCAtMzYxLDcgKzM1OCw3IEBACiAJICogbG9jYWxseSBkaXNhYmxlZC4gLWFyY2EKIAkgKi8KIAl3cml0ZV9sb2NrKCZ4dGltZV9sb2NrKTsKLQlkb190aW1lcl9pbnRlcnJ1cHQoaXJxLCBOVUxMLCByZWdzKTsKKwlkb190aW1lcl9pbnRlcnJ1cHQoaXJxLCByZWdzKTsKIAl3cml0ZV91bmxvY2soJnh0aW1lX2xvY2spOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9LY29uZmlnIGIvYXJjaC9zcGFyYy9LY29uZmlnCmluZGV4IGFjYTAyOGEuLmFiYTA1MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvS2NvbmZpZworKysgYi9hcmNoL3NwYXJjL0tjb25maWcKQEAgLTIxMSw2ICsyMTEsMTAgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQworCWJvb2wKKwlkZWZhdWx0IHkKKwogY29uZmlnIFNVTl9QTQogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvTWFrZWZpbGUgYi9hcmNoL3NwYXJjL01ha2VmaWxlCmluZGV4IDdiM2JiYWYuLmRlYTQ4ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYy9NYWtlZmlsZQpAQCAtNTksMTcgKzU5LDcgQEAKIGFyY2hjbGVhbjoKIAkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKGJvb3QpCiAKLXByZXBhcmU6IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtX29mZnNldHMuaAotCi1hcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLQkJCQkgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKLQotaW5jbHVkZS9hc20tJChBUkNIKS9hc21fb2Zmc2V0cy5oOiBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCi0KLUNMRUFOX0ZJTEVTICs9CWluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtX29mZnNldHMuaAlcCi0JCWFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucwlcCi0JCWFyY2gvJChBUkNIKS9ib290L1N5c3RlbS5tYXAKK0NMRUFOX0ZJTEVTICs9IGFyY2gvJChBUkNIKS9ib290L1N5c3RlbS5tYXAKIAogIyBEb24ndCB1c2UgdGFicyBpbiBlY2hvIGFyZ3VtZW50cy4KIGRlZmluZSBhcmNoaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUyBiL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMKaW5kZXggYjQ0ODE2Ni4uMDNlY2I0ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8YXNtL2tnZGIuaD4KICNpbmNsdWRlIDxhc20vY29udHJlZ3MuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3Bzci5oPgogI2luY2x1ZGUgPGFzbS92YWRkcnMuaD4KICNpbmNsdWRlIDxhc20vbWVtcmVnLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMKaW5kZXggNTk3ZDNmZi4uMzZhNDA2OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwpAQCAtODQwLDEwICs4NDAsNyBAQAogCiAJeHRpbWUudHZfc2VjID0gdHYtPnR2X3NlYzsKIAl4dGltZS50dl9uc2VjID0gdHYtPnR2X25zZWM7Ci0JdGltZV9hZGp1c3QgPSAwOwkJLyogc3RvcCBhY3RpdmUgYWRqdGltZSgpICovCi0JdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJbnRwX2NsZWFyKCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NjbG93LlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zY2xvdy5TCmluZGV4IDNhODY3ZmMuLjEzNmUzN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NjbG93LlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2Nsb3cuUwpAQCAtNyw3ICs3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS93aW5tYWNyby5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zLmMKaW5kZXggOGZhYThkYy4uZjg0ODA5MyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltcy5jCkBAIC0xMTQsMTcgKzExNCw3IEBACiAvKiB1c2VkIGJ5IHZhcmlvdXMgZHJpdmVycyAqLwogRVhQT1JUX1NZTUJPTChzcGFyY19jcHVfbW9kZWwpOwogRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKICNpZmRlZiBDT05GSUdfU01QCi1FWFBPUlRfU1lNQk9MKF9kb19zcGluX2xvY2spOwotRVhQT1JUX1NZTUJPTChfZG9fc3Bpbl91bmxvY2spOwotRVhQT1JUX1NZTUJPTChfc3Bpbl90cnlsb2NrKTsKLUVYUE9SVF9TWU1CT0woX2RvX3JlYWRfbG9jayk7Ci1FWFBPUlRfU1lNQk9MKF9kb19yZWFkX3VubG9jayk7Ci1FWFBPUlRfU1lNQk9MKF9kb193cml0ZV9sb2NrKTsKLUVYUE9SVF9TWU1CT0woX2RvX3dyaXRlX3VubG9jayk7Ci0jZW5kaWYKLSNlbHNlCiAvLyBYWFggZmluZCB3aGF0IHVzZXMgKG9yIHVzZWQpIHRoZXNlLgogRVhQT1JUX1NZTUJPTChfX19yd19yZWFkX2VudGVyKTsKIEVYUE9SVF9TWU1CT0woX19fcndfcmVhZF9leGl0KTsKQEAgLTE3NSw3ICsxNjUsNiBAQAogRVhQT1JUX1NZTUJPTChnZXRfYXV4aW8pOwogI2VuZGlmCiBFWFBPUlRfU1lNQk9MKHJlcXVlc3RfZmFzdF9pcnEpOwotRVhQT1JUX1NZTUJPTChpb19yZW1hcF9wYWdlX3JhbmdlKTsKIEVYUE9SVF9TWU1CT0woaW9fcmVtYXBfcGZuX3JhbmdlKTsKICAgLyogUDM6IGlvdW5pdF94eHggbWF5IGJlIG5lZWRlZCwgc3VuNGQgdXNlcnMgKi8KIC8qIEVYUE9SVF9TWU1CT0woaW91bml0X21hcF9kbWFfaW5pdCk7ICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lLmMKaW5kZXggM2I3NTlhZS4uYmMwMTVlOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWUuYwpAQCAtMTM5LDcgKzEzOSw3IEBACiAKIAogCS8qIERldGVybWluZSB3aGVuIHRvIHVwZGF0ZSB0aGUgTW9zdGVrIGNsb2NrLiAqLwotCWlmICgodGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSA9PSAwICYmCisJaWYgKG50cF9zeW5jZWQoKSAmJgogCSAgICB4dGltZS50dl9zZWMgPiBsYXN0X3J0Y191cGRhdGUgKyA2NjAgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA+PSA1MDAwMDAgLSAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMiAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApIDw9IDUwMDAwMCArICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyKSB7CkBAIC01NTQsMTAgKzU1NCw3IEBACiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOwogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOwogCi0JdGltZV9hZGp1c3QgPSAwOwkJLyogc3RvcCBhY3RpdmUgYWRqdGltZSgpICovCi0JdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJbnRwX2NsZWFyKCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL01ha2VmaWxlIGIvYXJjaC9zcGFyYy9saWIvTWFrZWZpbGUKaW5kZXggMjI5NmZmOS4uZmE1MDA2OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYy9saWIvTWFrZWZpbGUKQEAgLTksNSArOSwzIEBACiAJIHN0cm5jcHlfZnJvbV91c2VyLm8gZGl2ZGkzLm8gdWRpdmRpMy5vIHN0cmxlbl91c2VyLm8gXAogCSBjb3B5X3VzZXIubyBsb2Nrcy5vIGF0b21pYy5vIGF0b21pYzMyLm8gYml0b3BzLm8gXAogCSBsc2hyZGkzLm8gYXNobGRpMy5vIHJ3c2VtLm8gbXVsZGkzLm8gYml0ZXh0Lm8KLQotbGliLSQoQ09ORklHX0RFQlVHX1NQSU5MT0NLKSArPQlkZWJ1Z2xvY2tzLm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL2F0b21pYzMyLmMgYi9hcmNoL3NwYXJjL2xpYi9hdG9taWMzMi5jCmluZGV4IDE5NzI0YzUuLjJlNjRlOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbGliL2F0b21pYzMyLmMKKysrIGIvYXJjaC9zcGFyYy9saWIvYXRvbWljMzIuYwpAQCAtMjAsNyArMjAsNyBAQAogCiAjZWxzZSAvKiBTTVAgKi8KIAotc3RhdGljIHNwaW5sb2NrX3QgZHVtbXkgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGR1bW15KTsKICNkZWZpbmUgQVRPTUlDX0hBU0hfU0laRQkxCiAjZGVmaW5lIEFUT01JQ19IQVNIKGEpCQkoJmR1bW15KQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2xpYi9kZWJ1Z2xvY2tzLmMgYi9hcmNoL3NwYXJjL2xpYi9kZWJ1Z2xvY2tzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMTgyMzUuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9saWIvZGVidWdsb2Nrcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qICRJZDogZGVidWdsb2Nrcy5jLHYgMS4xMSAyMDAxLzA5LzIwIDAwOjM1OjMxIGRhdmVtIEV4cCAkCi0gKiBkZWJ1Z2xvY2tzLmM6IERlYnVnZ2luZyB2ZXJzaW9ucyBvZiBTTVAgbG9ja2luZyBwcmltaXRpdmVzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtOTkgQW50b24gQmxhbmNoYXJkIChhbnRvbkBwcm9nc29jLnV0cy5lZHUuYXUpCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgkvKiBGb3IgTlJfQ1BVUyAqLwotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3Bzci5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQotI2lmZGVmIENPTkZJR19TTVAKLQotLyogU29tZSBub3RlcyBvbiBob3cgdGhlc2UgZGVidWdnaW5nIHJvdXRpbmVzIHdvcmsuICBXaGVuIGEgbG9jayBpcyBhY3F1aXJlZAotICogYW4gZXh0cmEgZGVidWdnaW5nIG1lbWJlciBsb2NrLT5vd25lcl9wYyBpcyBzZXQgdG8gdGhlIGNhbGxlciBvZiB0aGUgbG9jawotICogYWNxdWlzaXRpb24gcm91dGluZS4gIFJpZ2h0IGJlZm9yZSByZWxlYXNpbmcgYSBsb2NrLCB0aGUgZGVidWdnaW5nIHByb2dyYW0KLSAqIGNvdW50ZXIgaXMgY2xlYXJlZCB0byB6ZXJvLgotICoKLSAqIEZ1cnRoZXJtb3JlLCBzaW5jZSBQQydzIGFyZSA0IGJ5dGUgYWxpZ25lZCBvbiBTcGFyYywgd2Ugc3R1ZmYgdGhlIENQVQotICogbnVtYmVyIG9mIHRoZSBvd25lciBpbiB0aGUgbG93ZXN0IHR3byBiaXRzLgotICovCi0KLSNkZWZpbmUgU1RPUkVfQ0FMTEVSKEEpIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3YgJSVpNywgJTAiIDogIj1yIiAoQSkpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2hvdyhjaGFyICpzdHIsIHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgY2FsbGVyKQotewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlwcmludGsoIiVzKCVwKSBDUFUjJWQgc3R1Y2sgYXQgJTA4bHgsIG93bmVyIFBDKCUwOGx4KTpDUFUoJWx4KVxuIixzdHIsCi0JCWxvY2ssIGNwdSwgY2FsbGVyLCBsb2NrLT5vd25lcl9wYyAmIH4zLCBsb2NrLT5vd25lcl9wYyAmIDMpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2hvd19yZWFkKGNoYXIgKnN0ciwgcndsb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgY2FsbGVyKQotewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlwcmludGsoIiVzKCVwKSBDUFUjJWQgc3R1Y2sgYXQgJTA4bHgsIG93bmVyIFBDKCUwOGx4KTpDUFUoJWx4KVxuIiwgc3RyLAotCQlsb2NrLCBjcHUsIGNhbGxlciwgbG9jay0+b3duZXJfcGMgJiB+MywgbG9jay0+b3duZXJfcGMgJiAzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNob3dfd3JpdGUoY2hhciAqc3RyLCByd2xvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBjYWxsZXIpCi17Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpbnQgaTsKLQotCXByaW50aygiJXMoJXApIENQVSMlZCBzdHVjayBhdCAlMDhseCwgb3duZXIgUEMoJTA4bHgpOkNQVSglbHgpIiwgc3RyLAotCQlsb2NrLCBjcHUsIGNhbGxlciwgbG9jay0+b3duZXJfcGMgJiB+MywgbG9jay0+b3duZXJfcGMgJiAzKTsKLQotCWZvcihpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKLQkJcHJpbnRrKCIgcmVhZGVyWyVkXT0lMDhseCIsIGksIGxvY2stPnJlYWRlcl9wY1tpXSk7Ci0KLQlwcmludGsoIlxuIik7Ci19Ci0KLSN1bmRlZiBJTklUX1NUVUNLCi0jZGVmaW5lIElOSVRfU1RVQ0sgMTAwMDAwMDAwCi0KLXZvaWQgX2RvX3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrLCBjaGFyICpzdHIpCi17Ci0JdW5zaWduZWQgbG9uZyBjYWxsZXI7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpbnQgc3R1Y2sgPSBJTklUX1NUVUNLOwotCi0JU1RPUkVfQ0FMTEVSKGNhbGxlcik7Ci0KLWFnYWluOgotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZHN0dWIgWyUxXSwgJTAiIDogIj1yIiAodmFsKSA6ICJyIiAoJihsb2NrLT5sb2NrKSkpOwotCWlmKHZhbCkgewotCQl3aGlsZShsb2NrLT5sb2NrKSB7Ci0JCQlpZiAoIS0tc3R1Y2spIHsKLQkJCQlzaG93KHN0ciwgbG9jaywgY2FsbGVyKTsKLQkJCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCQl9Ci0JCQliYXJyaWVyKCk7Ci0JCX0KLQkJZ290byBhZ2FpbjsKLQl9Ci0JbG9jay0+b3duZXJfcGMgPSAoY3B1ICYgMykgfCAoY2FsbGVyICYgfjMpOwotfQotCi1pbnQgX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCXVuc2lnbmVkIGxvbmcgY2FsbGVyOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlTVE9SRV9DQUxMRVIoY2FsbGVyKTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZHN0dWIgWyUxXSwgJTAiIDogIj1yIiAodmFsKSA6ICJyIiAoJihsb2NrLT5sb2NrKSkpOwotCWlmKCF2YWwpIHsKLQkJLyogV2UgZ290IGl0LCByZWNvcmQgb3VyIGlkZW50aXR5IGZvciBkZWJ1Z2dpbmcuICovCi0JCWxvY2stPm93bmVyX3BjID0gKGNwdSAmIDMpIHwgKGNhbGxlciAmIH4zKTsKLQl9Ci0JcmV0dXJuIHZhbCA9PSAwOwotfQotCi12b2lkIF9kb19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQotewotCWxvY2stPm93bmVyX3BjID0gMDsKLQliYXJyaWVyKCk7Ci0JbG9jay0+bG9jayA9IDA7Ci19Ci0KLXZvaWQgX2RvX3JlYWRfbG9jayhyd2xvY2tfdCAqcncsIGNoYXIgKnN0cikKLXsKLQl1bnNpZ25lZCBsb25nIGNhbGxlcjsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBzdHVjayA9IElOSVRfU1RVQ0s7Ci0KLQlTVE9SRV9DQUxMRVIoY2FsbGVyKTsKLQotd2xvY2tfYWdhaW46Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oImxkc3R1YiBbJTEgKyAzXSwgJTAiIDogIj1yIiAodmFsKSA6ICJyIiAoJihydy0+bG9jaykpKTsKLQlpZih2YWwpIHsKLQkJd2hpbGUocnctPmxvY2sgJiAweGZmKSB7Ci0JCQlpZiAoIS0tc3R1Y2spIHsKLQkJCQlzaG93X3JlYWQoc3RyLCBydywgY2FsbGVyKTsKLQkJCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCQl9Ci0JCQliYXJyaWVyKCk7Ci0JCX0KLQkJZ290byB3bG9ja19hZ2FpbjsKLQl9Ci0KLQlydy0+cmVhZGVyX3BjW2NwdV0gPSBjYWxsZXI7Ci0JYmFycmllcigpOwotCXJ3LT5sb2NrKys7Ci19Ci0KLXZvaWQgX2RvX3JlYWRfdW5sb2NrKHJ3bG9ja190ICpydywgY2hhciAqc3RyKQotewotCXVuc2lnbmVkIGxvbmcgY2FsbGVyOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JaW50IHN0dWNrID0gSU5JVF9TVFVDSzsKLQotCVNUT1JFX0NBTExFUihjYWxsZXIpOwotCi13bG9ja19hZ2FpbjoKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGRzdHViIFslMSArIDNdLCAlMCIgOiAiPXIiICh2YWwpIDogInIiICgmKHJ3LT5sb2NrKSkpOwotCWlmKHZhbCkgewotCQl3aGlsZShydy0+bG9jayAmIDB4ZmYpIHsKLQkJCWlmICghLS1zdHVjaykgewotCQkJCXNob3dfcmVhZChzdHIsIHJ3LCBjYWxsZXIpOwotCQkJCXN0dWNrID0gSU5JVF9TVFVDSzsKLQkJCX0KLQkJCWJhcnJpZXIoKTsKLQkJfQotCQlnb3RvIHdsb2NrX2FnYWluOwotCX0KLQotCXJ3LT5yZWFkZXJfcGNbY3B1XSA9IDA7Ci0JYmFycmllcigpOwotCXJ3LT5sb2NrIC09IDB4MWZmOwotfQotCi12b2lkIF9kb193cml0ZV9sb2NrKHJ3bG9ja190ICpydywgY2hhciAqc3RyKQotewotCXVuc2lnbmVkIGxvbmcgY2FsbGVyOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JaW50IHN0dWNrID0gSU5JVF9TVFVDSzsKLQotCVNUT1JFX0NBTExFUihjYWxsZXIpOwotCi13bG9ja19hZ2FpbjoKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGRzdHViIFslMSArIDNdLCAlMCIgOiAiPXIiICh2YWwpIDogInIiICgmKHJ3LT5sb2NrKSkpOwotCWlmKHZhbCkgewotd2xvY2tfd2FpdDoKLQkJd2hpbGUocnctPmxvY2spIHsKLQkJCWlmICghLS1zdHVjaykgewotCQkJCXNob3dfd3JpdGUoc3RyLCBydywgY2FsbGVyKTsKLQkJCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCQl9Ci0JCQliYXJyaWVyKCk7Ci0JCX0KLQkJZ290byB3bG9ja19hZ2FpbjsKLQl9Ci0KLQlpZiAocnctPmxvY2sgJiB+MHhmZikgewotCQkqKCgodW5zaWduZWQgY2hhciAqKSZydy0+bG9jaykrMykgPSAwOwotCQliYXJyaWVyKCk7Ci0JCWdvdG8gd2xvY2tfd2FpdDsKLQl9Ci0KLQliYXJyaWVyKCk7Ci0JcnctPm93bmVyX3BjID0gKGNwdSAmIDMpIHwgKGNhbGxlciAmIH4zKTsKLX0KLQotdm9pZCBfZG9fd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydykKLXsKLQlydy0+b3duZXJfcGMgPSAwOwotCWJhcnJpZXIoKTsKLQlydy0+bG9jayA9IDA7Ci19Ci0KLSNlbmRpZiAvKiBTTVAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vZ2VuZXJpYy5jIGIvYXJjaC9zcGFyYy9tbS9nZW5lcmljLmMKaW5kZXggZGIyN2VlZS4uMjBjY2I5NSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9nZW5lcmljLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9nZW5lcmljLmMKQEAgLTE2LDMxICsxNiw2IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAotc3RhdGljIGlubGluZSB2b2lkIGZvcmdldF9wdGUocHRlX3QgcGFnZSkKLXsKLSNpZiAwIC8qIG9sZCAyLjQgY29kZSAqLwotCWlmIChwdGVfbm9uZShwYWdlKSkKLQkJcmV0dXJuOwotCWlmIChwdGVfcHJlc2VudChwYWdlKSkgewotCQl1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ocGFnZSk7Ci0JCXN0cnVjdCBwYWdlICpwdHBhZ2U7Ci0JCWlmICghcGZuX3ZhbGlkKHBmbikpCi0JCQlyZXR1cm47Ci0JCXB0cGFnZSA9IHBmbl90b19wYWdlKHBmbik7Ci0JCWlmIChQYWdlUmVzZXJ2ZWQocHRwYWdlKSkKLQkJCXJldHVybjsKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKHB0cGFnZSk7Ci0JCXJldHVybjsKLQl9Ci0Jc3dhcF9mcmVlKHB0ZV90b19zd3BfZW50cnkocGFnZSkpOwotI2Vsc2UKLQlpZiAoIXB0ZV9ub25lKHBhZ2UpKSB7Ci0JCXByaW50aygiZm9yZ2V0X3B0ZTogb2xkIG1hcHBpbmcgZXhpc3RlZCFcbiIpOwotCQlCVUcoKTsKLQl9Ci0jZW5kaWYKLX0KLQogLyogUmVtYXAgSU8gbWVtb3J5LCB0aGUgc2FtZSB3YXkgYXMgcmVtYXBfcGZuX3JhbmdlKCksIGJ1dCB1c2UKICAqIHRoZSBvYmlvIG1lbW9yeSBzcGFjZS4KICAqCkBAIC02MCw3ICszNSw2IEBACiAJCXB0ZV90IG9sZHBhZ2UgPSAqcHRlOwogCQlwdGVfY2xlYXIobW0sIGFkZHJlc3MsIHB0ZSk7CiAJCXNldF9wdGUocHRlLCBta19wdGVfaW8ob2Zmc2V0LCBwcm90LCBzcGFjZSkpOwotCQlmb3JnZXRfcHRlKG9sZHBhZ2UpOwogCQlhZGRyZXNzICs9IFBBR0VfU0laRTsKIAkJb2Zmc2V0ICs9IFBBR0VfU0laRTsKIAkJcHRlKys7CkBAIC04OCwzNyArNjIsNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaW9fcmVtYXBfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBmcm9tLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBwZ3Byb3RfdCBwcm90LCBpbnQgc3BhY2UpCi17Ci0JaW50IGVycm9yID0gMDsKLQlwZ2RfdCAqIGRpcjsKLQl1bnNpZ25lZCBsb25nIGJlZyA9IGZyb207Ci0JdW5zaWduZWQgbG9uZyBlbmQgPSBmcm9tICsgc2l6ZTsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07Ci0KLQlwcm90ID0gX19wZ3Byb3QocGdfaW9iaXRzKTsKLQlvZmZzZXQgLT0gZnJvbTsKLQlkaXIgPSBwZ2Rfb2Zmc2V0KG1tLCBmcm9tKTsKLQlmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIGJlZywgZW5kKTsKLQotCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7Ci0Jd2hpbGUgKGZyb20gPCBlbmQpIHsKLQkJcG1kX3QgKnBtZCA9IHBtZF9hbGxvYyhjdXJyZW50LT5tbSwgZGlyLCBmcm9tKTsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlpZiAoIXBtZCkKLQkJCWJyZWFrOwotCQllcnJvciA9IGlvX3JlbWFwX3BtZF9yYW5nZShtbSwgcG1kLCBmcm9tLCBlbmQgLSBmcm9tLCBvZmZzZXQgKyBmcm9tLCBwcm90LCBzcGFjZSk7Ci0JCWlmIChlcnJvcikKLQkJCWJyZWFrOwotCQlmcm9tID0gKGZyb20gKyBQR0RJUl9TSVpFKSAmIFBHRElSX01BU0s7Ci0JCWRpcisrOwotCX0KLQlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7Ci0KLQlmbHVzaF90bGJfcmFuZ2Uodm1hLCBiZWcsIGVuZCk7Ci0JcmV0dXJuIGVycm9yOwotfQotCiBpbnQgaW9fcmVtYXBfcGZuX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGZyb20sCiAJCQl1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBzaXplLCBwZ3Byb3RfdCBwcm90KQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9oeXBlcnNwYXJjLlMgYi9hcmNoL3NwYXJjL21tL2h5cGVyc3BhcmMuUwppbmRleCA1NGI4ZTc2Li5hMjMxY2NhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2h5cGVyc3BhcmMuUworKysgYi9hcmNoL3NwYXJjL21tL2h5cGVyc3BhcmMuUwpAQCAtNiw3ICs2LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vcHNyLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2FzaS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndHNybW11Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL3N3aWZ0LlMgYi9hcmNoL3NwYXJjL21tL3N3aWZ0LlMKaW5kZXggMmRjYWE1YS4uY2Q5MGYzZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9zd2lmdC5TCisrKyBiL2FyY2gvc3BhcmMvbW0vc3dpZnQuUwpAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxhc20vYXNpLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0c3JtbXUuaD4KLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCS50ZXh0CiAJLmFsaWduCTQKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vdHN1bmFtaS5TIGIvYXJjaC9zcGFyYy9tbS90c3VuYW1pLlMKaW5kZXggOGFjZDE3OC4uNjk3YWY2MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS90c3VuYW1pLlMKKysrIGIvYXJjaC9zcGFyYy9tbS90c3VuYW1pLlMKQEAgLTYsNyArNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3Bzci5oPgogI2luY2x1ZGUgPGFzbS9hc2kuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS92aWtpbmcuUyBiL2FyY2gvc3BhcmMvbW0vdmlraW5nLlMKaW5kZXggZjU4NzEyZC4uM2NiZDZkZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS92aWtpbmcuUworKysgYi9hcmNoL3NwYXJjL21tL3Zpa2luZy5TCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vcHNyLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2FzaS5oPgogI2luY2x1ZGUgPGFzbS9teGNjLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9LY29uZmlnIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKaW5kZXggOWFmZDI4ZS4uMWU5ZDg2MyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L0tjb25maWcKKysrIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKQEAgLTUsNiArNSwxNiBAQAogCiBtYWlubWVudSAiTGludXgvVWx0cmFTUEFSQyBLZXJuZWwgQ29uZmlndXJhdGlvbiIKIAorY29uZmlnIFNQQVJDNjQKKwlib29sCisJZGVmYXVsdCB5CisJaGVscAorCSAgU1BBUkMgaXMgYSBmYW1pbHkgb2YgUklTQyBtaWNyb3Byb2Nlc3NvcnMgZGVzaWduZWQgYW5kIG1hcmtldGVkIGJ5CisJICBTdW4gTWljcm9zeXN0ZW1zLCBpbmNvcnBvcmF0ZWQuICBUaGlzIHBvcnQgY292ZXJzIHRoZSBuZXdlciA2NC1iaXQKKwkgIFVsdHJhU1BBUkMuICBUaGUgVWx0cmFMaW51eCBwcm9qZWN0IG1haW50YWlucyBib3RoIHRoZSBTUEFSQzMyIGFuZAorCSAgU1BBUkM2NCBwb3J0czsgaXRzIHdlYiBwYWdlIGlzIGF2YWlsYWJsZSBhdAorCSAgPGh0dHA6Ly93d3cudWx0cmFsaW51eC5vcmcvPi4KKwogY29uZmlnIDY0QklUCiAJZGVmX2Jvb2wgeQogCkBAIC0xNiw2ICsyNiwxMCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJYm9vbAorCWRlZmF1bHQgeQorCiBjaG9pY2UKIAlwcm9tcHQgIktlcm5lbCBwYWdlIHNpemUiCiAJZGVmYXVsdCBTUEFSQzY0X1BBR0VfU0laRV84S0IKQEAgLTcxLDc1ICs4NSw2IEBACiAKIG1lbnUgIkdlbmVyYWwgbWFjaGluZSBzZXR1cCIKIAotY29uZmlnIEJCQ19JMkMKLQl0cmlzdGF0ZSAiVWx0cmFTUEFSQy1JSUkgYm9vdGJ1cyBpMmMgY29udHJvbGxlciBkcml2ZXIiCi0JZGVwZW5kcyBvbiBQQ0kKLQloZWxwCi0JICBUaGUgQkJDIGRldmljZXMgb24gdGhlIFVsdHJhU1BBUkMgSUlJIGhhdmUgdHdvIEkyQyBjb250cm9sbGVycy4gIFRoZQotCSAgZmlyc3QgSTJDIGNvbnRyb2xsZXIgY29ubmVjdHMgbWFpbmx5IHRvIGNvbmZpZ3VyYXRpb24gUFJPTXMgKE5WUkFNLAotCSAgQ1BVIGNvbmZpZ3VyYXRpb24sIERJTU0gdHlwZXMsIGV0Yy4pLiAgVGhlIHNlY29uZCBJMkMgY29udHJvbGxlcgotCSAgY29ubmVjdHMgdG8gZW52aXJvbm1lbnRhbCBjb250cm9sIGRldmljZXMgc3VjaCBhcyBmYW5zIGFuZAotCSAgdGVtcGVyYXR1cmUgc2Vuc29ycy4gIFRoZSBzZWNvbmQgY29udHJvbGxlciBhbHNvIGNvbm5lY3RzIHRvIHRoZQotCSAgc21hcnRjYXJkIHJlYWRlciwgaWYgcHJlc2VudC4gIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGVzZS4KLQotY29uZmlnIFZUCi0JYm9vbCAiVmlydHVhbCB0ZXJtaW5hbCIgaWYgRU1CRURERUQKLQlzZWxlY3QgSU5QVVQKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRlcm1pbmFsIGRldmljZXMgd2l0aAotCSAgZGlzcGxheSBhbmQga2V5Ym9hcmQgZGV2aWNlcy4gVGhlc2UgYXJlIGNhbGxlZCAidmlydHVhbCIgYmVjYXVzZSB5b3UKLQkgIGNhbiBydW4gc2V2ZXJhbCB2aXJ0dWFsIHRlcm1pbmFscyAoYWxzbyBjYWxsZWQgdmlydHVhbCBjb25zb2xlcykgb24KLQkgIG9uZSBwaHlzaWNhbCB0ZXJtaW5hbC4gVGhpcyBpcyByYXRoZXIgdXNlZnVsLCBmb3IgZXhhbXBsZSBvbmUKLQkgIHZpcnR1YWwgdGVybWluYWwgY2FuIGNvbGxlY3Qgc3lzdGVtIG1lc3NhZ2VzIGFuZCB3YXJuaW5ncywgYW5vdGhlcgotCSAgb25lIGNhbiBiZSB1c2VkIGZvciBhIHRleHQtbW9kZSB1c2VyIHNlc3Npb24sIGFuZCBhIHRoaXJkIGNvdWxkIHJ1bgotCSAgYW4gWCBzZXNzaW9uLCBhbGwgaW4gcGFyYWxsZWwuIFN3aXRjaGluZyBiZXR3ZWVuIHZpcnR1YWwgdGVybWluYWxzCi0JICBpcyBkb25lIHdpdGggY2VydGFpbiBrZXkgY29tYmluYXRpb25zLCB1c3VhbGx5IEFsdC08ZnVuY3Rpb24ga2V5Pi4KLQotCSAgVGhlIHNldHRlcm0gY29tbWFuZCAoIm1hbiBzZXR0ZXJtIikgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZQotCSAgcHJvcGVydGllcyAoc3VjaCBhcyBjb2xvcnMgb3IgYmVlcGluZykgb2YgYSB2aXJ0dWFsIHRlcm1pbmFsLiBUaGUKLQkgIG1hbiBwYWdlIGNvbnNvbGVfY29kZXMoNCkgKCJtYW4gY29uc29sZV9jb2RlcyIpIGNvbnRhaW5zIHRoZSBzcGVjaWFsCi0JICBjaGFyYWN0ZXIgc2VxdWVuY2VzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRob3NlIHByb3BlcnRpZXMKLQkgIGRpcmVjdGx5LiBUaGUgZm9udHMgdXNlZCBvbiB2aXJ0dWFsIHRlcm1pbmFscyBjYW4gYmUgY2hhbmdlZCB3aXRoCi0JICB0aGUgc2V0Zm9udCAoIm1hbiBzZXRmb250IikgY29tbWFuZCBhbmQgdGhlIGtleSBiaW5kaW5ncyBhcmUgZGVmaW5lZAotCSAgd2l0aCB0aGUgbG9hZGtleXMgKCJtYW4gbG9hZGtleXMiKSBjb21tYW5kLgotCi0JICBZb3UgbmVlZCBhdCBsZWFzdCBvbmUgdmlydHVhbCB0ZXJtaW5hbCBkZXZpY2UgaW4gb3JkZXIgdG8gbWFrZSB1c2UKLQkgIG9mIHlvdXIga2V5Ym9hcmQgYW5kIG1vbml0b3IuIFRoZXJlZm9yZSwgb25seSBwZW9wbGUgY29uZmlndXJpbmcgYW4KLQkgIGVtYmVkZGVkIHN5c3RlbSB3b3VsZCB3YW50IHRvIHNheSBOIGhlcmUgaW4gb3JkZXIgdG8gc2F2ZSBzb21lCi0JICBtZW1vcnk7IHRoZSBvbmx5IHdheSB0byBsb2cgaW50byBzdWNoIGEgc3lzdGVtIGlzIHRoZW4gdmlhIGEgc2VyaWFsCi0JICBvciBuZXR3b3JrIGNvbm5lY3Rpb24uCi0KLQkgIElmIHVuc3VyZSwgc2F5IFksIG9yIGVsc2UgeW91IHdvbid0IGJlIGFibGUgdG8gZG8gbXVjaCB3aXRoIHlvdXIgbmV3Ci0JICBzaGlueSBMaW51eCBzeXN0ZW0gOi0pCi0KLWNvbmZpZyBWVF9DT05TT0xFCi0JYm9vbCAiU3VwcG9ydCBmb3IgY29uc29sZSBvbiB2aXJ0dWFsIHRlcm1pbmFsIiBpZiBFTUJFRERFRAotCWRlcGVuZHMgb24gVlQKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JICBUaGUgc3lzdGVtIGNvbnNvbGUgaXMgdGhlIGRldmljZSB3aGljaCByZWNlaXZlcyBhbGwga2VybmVsIG1lc3NhZ2VzCi0JICBhbmQgd2FybmluZ3MgYW5kIHdoaWNoIGFsbG93cyBsb2dpbnMgaW4gc2luZ2xlIHVzZXIgbW9kZS4gSWYgeW91Ci0JICBhbnN3ZXIgWSBoZXJlLCBhIHZpcnR1YWwgdGVybWluYWwgKHRoZSBkZXZpY2UgdXNlZCB0byBpbnRlcmFjdCB3aXRoCi0JICBhIHBoeXNpY2FsIHRlcm1pbmFsKSBjYW4gYmUgdXNlZCBhcyBzeXN0ZW0gY29uc29sZS4gVGhpcyBpcyB0aGUgbW9zdAotCSAgY29tbW9uIG1vZGUgb2Ygb3BlcmF0aW9ucywgc28geW91IHNob3VsZCBzYXkgWSBoZXJlIHVubGVzcyB5b3Ugd2FudAotCSAgdGhlIGtlcm5lbCBtZXNzYWdlcyBiZSBvdXRwdXQgb25seSB0byBhIHNlcmlhbCBwb3J0IChpbiB3aGljaCBjYXNlCi0JICB5b3Ugc2hvdWxkIHNheSBZIHRvICJDb25zb2xlIG9uIHNlcmlhbCBwb3J0IiwgYmVsb3cpLgotCi0JICBJZiB5b3UgZG8gc2F5IFkgaGVyZSwgYnkgZGVmYXVsdCB0aGUgY3VycmVudGx5IHZpc2libGUgdmlydHVhbAotCSAgdGVybWluYWwgKC9kZXYvdHR5MCkgd2lsbCBiZSB1c2VkIGFzIHN5c3RlbSBjb25zb2xlLiBZb3UgY2FuIGNoYW5nZQotCSAgdGhhdCB3aXRoIGEga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24gc3VjaCBhcyAiY29uc29sZT10dHkzIiB3aGljaAotCSAgd291bGQgdXNlIHRoZSB0aGlyZCB2aXJ0dWFsIHRlcm1pbmFsIGFzIHN5c3RlbSBjb25zb2xlLiAoVHJ5ICJtYW4KLQkgIGJvb3RwYXJhbSIgb3Igc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgYm9vdCBsb2FkZXIgKGxpbG8gb3IKLQkgIGxvYWRsaW4pIGFib3V0IGhvdyB0byBwYXNzIG9wdGlvbnMgdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuKQotCi0JICBJZiB1bnN1cmUsIHNheSBZLgotCi1jb25maWcgSFdfQ09OU09MRQotCWJvb2wKLQlkZXBlbmRzIG9uIFZUCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBTTVAKIAlib29sICJTeW1tZXRyaWMgbXVsdGktcHJvY2Vzc2luZyBzdXBwb3J0IgogCS0tLWhlbHAtLS0KQEAgLTIwNSwxNyArMTUwLDYgQEAKIAogCSAgSWYgaW4gZG91YnQsIHNheSBOLgogCi0jIElkZW50aWZ5IHRoaXMgYXMgYSBTcGFyYzY0IGJ1aWxkCi1jb25maWcgU1BBUkM2NAotCWJvb2wKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBTUEFSQyBpcyBhIGZhbWlseSBvZiBSSVNDIG1pY3JvcHJvY2Vzc29ycyBkZXNpZ25lZCBhbmQgbWFya2V0ZWQgYnkKLQkgIFN1biBNaWNyb3N5c3RlbXMsIGluY29ycG9yYXRlZC4gIFRoaXMgcG9ydCBjb3ZlcnMgdGhlIG5ld2VyIDY0LWJpdAotCSAgVWx0cmFTUEFSQy4gIFRoZSBVbHRyYUxpbnV4IHByb2plY3QgbWFpbnRhaW5zIGJvdGggdGhlIFNQQVJDMzIgYW5kCi0JICBTUEFSQzY0IHBvcnRzOyBpdHMgd2ViIHBhZ2UgaXMgYXZhaWxhYmxlIGF0Ci0JICA8aHR0cDovL3d3dy51bHRyYWxpbnV4Lm9yZy8+LgotCiAjIEdsb2JhbCB0aGluZ3MgYWNyb3NzIGFsbCBTdW4gbWFjaGluZXMuCiBjb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSwogCWJvb2wKQEAgLTI0Niw2ICsxODAsMTAgQEAKIAogZW5kY2hvaWNlCiAKK2VuZG1lbnUKKworc291cmNlICJtbS9LY29uZmlnIgorCiBjb25maWcgR0VORVJJQ19JU0FfRE1BCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtMzQ0LDMzICsyODIsNiBAQAogCWJvb2wKIAlkZWZhdWx0IFBDSQogCi1jb25maWcgUlRDCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFBDSQotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIElmIHlvdSBzYXkgWSBoZXJlIGFuZCBjcmVhdGUgYSBjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIC9kZXYvcnRjIHdpdGgKLQkgIG1ham9yIG51bWJlciAxMCBhbmQgbWlub3IgbnVtYmVyIDEzNSB1c2luZyBta25vZCAoIm1hbiBta25vZCIpLCB5b3UKLQkgIHdpbGwgZ2V0IGFjY2VzcyB0byB0aGUgcmVhbCB0aW1lIGNsb2NrIChvciBoYXJkd2FyZSBjbG9jaykgYnVpbHQKLQkgIGludG8geW91ciBjb21wdXRlci4KLQotCSAgRXZlcnkgUEMgaGFzIHN1Y2ggYSBjbG9jayBidWlsdCBpbi4gSXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUKLQkgIHNpZ25hbHMgZnJvbSBhcyBsb3cgYXMgMUh6IHVwIHRvIDgxOTJIeiwgYW5kIGNhbiBhbHNvIGJlIHVzZWQKLQkgIGFzIGEgMjQgaG91ciBhbGFybS4gSXQgcmVwb3J0cyBzdGF0dXMgaW5mb3JtYXRpb24gdmlhIHRoZSBmaWxlCi0JICAvcHJvYy9kcml2ZXIvcnRjIGFuZCBpdHMgYmVoYXZpb3VyIGlzIHNldCBieSB2YXJpb3VzIGlvY3RscyBvbgotCSAgL2Rldi9ydGMuCi0KLQkgIElmIHlvdSBydW4gTGludXggb24gYSBtdWx0aXByb2Nlc3NvciBtYWNoaW5lIGFuZCBzYWlkIFkgdG8KLQkgICJTeW1tZXRyaWMgTXVsdGkgUHJvY2Vzc2luZyIgYWJvdmUsIHlvdSBzaG91bGQgc2F5IFkgaGVyZSB0byByZWFkCi0JICBhbmQgc2V0IHRoZSBSVEMgaW4gYW4gU01QIGNvbXBhdGlibGUgZmFzaGlvbi4KLQotCSAgSWYgeW91IHRoaW5rIHlvdSBoYXZlIGEgdXNlIGZvciBzdWNoIGEgZGV2aWNlIChzdWNoIGFzIHBlcmlvZGljIGRhdGEKLQkgIHNhbXBsaW5nKSwgdGhlbiBzYXkgWSBoZXJlLCBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3J0Yy50eHQ+Ci0JICBmb3IgZGV0YWlscy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcnRjLgotCiBzb3VyY2UgImRyaXZlcnMvcGNpL0tjb25maWciCiAKIGNvbmZpZyBTVU5fT1BFTlBST01GUwpAQCAtNDE0LDYgKzMyNSw4IEBACiAJICBJZiB5b3Ugd2FudCB0byBydW4gU3VuT1MgYmluYXJpZXMgKHNlZSBTdW5PUyBiaW5hcnkgZW11bGF0aW9uIGJlbG93KQogCSAgb3Igb3RoZXIgYS5vdXQgYmluYXJpZXMsIHNheSBZLiBJZiB1bnN1cmUsIHNheSBOLgogCittZW51ICJFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cyIKKwogc291cmNlICJmcy9LY29uZmlnLmJpbmZtdCIKIAogY29uZmlnIFNVTk9TX0VNVUwKQEAgLTQzNiw3NCArMzQ5LDcgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzb2xhcmlzLgogCi1zb3VyY2UgImRyaXZlcnMvcGFycG9ydC9LY29uZmlnIgotCi1jb25maWcgUFJJTlRFUgotCXRyaXN0YXRlICJQYXJhbGxlbCBwcmludGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQVJQT1JUCi0JLS0taGVscC0tLQotCSAgSWYgeW91IGludGVuZCB0byBhdHRhY2ggYSBwcmludGVyIHRvIHRoZSBwYXJhbGxlbCBwb3J0IG9mIHlvdXIgTGludXgKLQkgIGJveCAoYXMgb3Bwb3NlZCB0byB1c2luZyBhIHNlcmlhbCBwcmludGVyOyBpZiB0aGUgY29ubmVjdG9yIGF0IHRoZQotCSAgcHJpbnRlciBoYXMgOSBvciAyNSBob2xlcyBbImZlbWFsZSJdLCB0aGVuIGl0J3Mgc2VyaWFsKSwgc2F5IFkuCi0JICBBbHNvIHJlYWQgdGhlIFByaW50aW5nLUhPV1RPLCBhdmFpbGFibGUgZnJvbQotCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KLQotCSAgSXQgaXMgcG9zc2libGUgdG8gc2hhcmUgb25lIHBhcmFsbGVsIHBvcnQgYW1vbmcgc2V2ZXJhbCBkZXZpY2VzCi0JICAoZS5nLiBwcmludGVyIGFuZCBaSVAgZHJpdmUpIGFuZCBpdCBpcyBzYWZlIHRvIGNvbXBpbGUgdGhlCi0JICBjb3JyZXNwb25kaW5nIGRyaXZlcnMgaW50byB0aGUga2VybmVsLgotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9wYXJwb3J0LnR4dD4uICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGxwLgotCi0JICBJZiB5b3UgaGF2ZSBzZXZlcmFsIHBhcmFsbGVsIHBvcnRzLCB5b3UgY2FuIHNwZWNpZnkgd2hpY2ggcG9ydHMgdG8KLQkgIHVzZSB3aXRoIHRoZSAibHAiIGtlcm5lbCBjb21tYW5kIGxpbmUgb3B0aW9uLiAgKFRyeSAibWFuIGJvb3RwYXJhbSIKLQkgIG9yIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIGJvb3QgbG9hZGVyIChsaWxvIG9yIGxvYWRsaW4pIGFib3V0Ci0JICBob3cgdG8gcGFzcyBvcHRpb25zIHRvIHRoZSBrZXJuZWwgYXQgYm9vdCB0aW1lLikgIFRoZSBzeW50YXggb2YgdGhlCi0JICAibHAiIGNvbW1hbmQgbGluZSBvcHRpb24gY2FuIGJlIGZvdW5kIGluIDxmaWxlOmRyaXZlcnMvY2hhci9scC5jPi4KLQotCSAgSWYgeW91IGhhdmUgbW9yZSB0aGFuIDggcHJpbnRlcnMsIHlvdSBuZWVkIHRvIGluY3JlYXNlIHRoZSBMUF9OTwotCSAgbWFjcm8gaW4gbHAuYyBhbmQgdGhlIFBBUlBPUlRfTUFYIG1hY3JvIGluIHBhcnBvcnQuaC4KLQotY29uZmlnIFBQREVWCi0JdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHVzZXItc3BhY2UgcGFyYWxsZWwgcG9ydCBkZXZpY2UgZHJpdmVycyIKLQlkZXBlbmRzIG9uIFBBUlBPUlQKLQktLS1oZWxwLS0tCi0JICBTYXlpbmcgWSB0byB0aGlzIGFkZHMgc3VwcG9ydCBmb3IgL2Rldi9wYXJwb3J0IGRldmljZSBub2Rlcy4gIFRoaXMKLQkgIGlzIG5lZWRlZCBmb3IgcHJvZ3JhbXMgdGhhdCB3YW50IHBvcnRhYmxlIGFjY2VzcyB0byB0aGUgcGFyYWxsZWwKLQkgIHBvcnQsIGZvciBpbnN0YW5jZSBkZXZpY2VpZCAod2hpY2ggZGlzcGxheXMgUGx1Zy1hbmQtUGxheSBkZXZpY2UKLQkgIElEcykuCi0KLQkgIFRoaXMgaXMgdGhlIHBhcmFsbGVsIHBvcnQgZXF1aXZhbGVudCBvZiBTQ1NJIGdlbmVyaWMgc3VwcG9ydCAoc2cpLgotCSAgSXQgaXMgc2FmZSB0byBzYXkgTiB0byB0aGlzIC0tIGl0IGlzIG5vdCBuZWVkZWQgZm9yIG5vcm1hbCBwcmludGluZwotCSAgb3IgcGFyYWxsZWwgcG9ydCBDRC1ST00vZGlzayBzdXBwb3J0LgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwcGRldi4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIEVOVkNUUkwKLQl0cmlzdGF0ZSAiU1VOVywgZW52Y3RybCBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJCi0JaGVscAotCSAgS2VybmVsIHN1cHBvcnQgZm9yIHRlbXBlcmF0dXJlIGFuZCBmYW4gbW9uaXRvcmluZyBvbiBTdW4gU01FCi0JICBtYWNoaW5lcy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZW52Y3RybC4KLQotY29uZmlnIERJU1BMQVk3U0VHCi0JdHJpc3RhdGUgIjctU2VnbWVudCBEaXNwbGF5IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kKLQktLS1oZWxwLS0tCi0JICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSA3LXNlZ21lbnQgZGlzcGxheSBhbmQgTEVEIHByZXNlbnQgb24KLQkgIFN1biBNaWNyb3N5c3RlbXMgQ29tcGFjdFBDSSBtb2RlbHMgQ1AxNDAwIGFuZCBDUDE1MDAuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGRpc3BsYXk3c2VnLgotCi0JICBJZiB5b3UgZG8gbm90IGhhdmUgYSBDb21wYWN0UENJIG1vZGVsIENQMTQwMCBvciBDUDE1MDAsIG9yCi0JICBhbm90aGVyIFVsdHJhU1BBUkMtSUlpLWNFbmdpbmUgYm9hcmRzZXQgd2l0aCBhIDctc2VnbWVudCBkaXNwbGF5LAotCSAgeW91IHNob3VsZCBzYXkgTiB0byB0aGlzIG9wdGlvbi4KK2VuZG1lbnUKIAogY29uZmlnIENNRExJTkVfQk9PTAogCWJvb2wgIkRlZmF1bHQgYm9vdGxvYWRlciBrZXJuZWwgYXJndW1lbnRzIgpAQCAtNTIxLDE0OCArMzY3LDE2IEBACiAKIAkgIE5PVEU6IFRoaXMgb3B0aW9uIFdJTEwgb3ZlcnJpZGUgdGhlIFBST00gYm9vdGFyZ3Mgc2V0dGluZyEKIAotc291cmNlICJtbS9LY29uZmlnIgotCi1lbmRtZW51Ci0KIHNvdXJjZSAibmV0L0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9iYXNlL0tjb25maWciCi0KLXNvdXJjZSAiZHJpdmVycy92aWRlby9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvc2VyaWFsL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3NidXMvY2hhci9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvbXRkL0tjb25maWciCi0KLXNvdXJjZSAiZHJpdmVycy9ibG9jay9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvaWRlL0tjb25maWciCi0KLXNvdXJjZSAiZHJpdmVycy9zY3NpL0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9mYzQvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL21kL0tjb25maWciCi0KLWlmIFBDSQotc291cmNlICJkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL0tjb25maWciCi1lbmRpZgotCi1zb3VyY2UgImRyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL25ldC9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvaXNkbi9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvdGVsZXBob255L0tjb25maWciCi0KLSMgVGhpcyBvbmUgbXVzdCBiZSBiZWZvcmUgdGhlIGZpbGVzeXN0ZW0gY29uZmlncy4gLURhdmVNCi0KLW1lbnUgIlVuaXg5OCBQVFkgc3VwcG9ydCIKLQotY29uZmlnIFVOSVg5OF9QVFlTCi0JYm9vbCAiVW5peDk4IFBUWSBzdXBwb3J0IgotCS0tLWhlbHAtLS0KLQkgIEEgcHNldWRvIHRlcm1pbmFsIChQVFkpIGlzIGEgc29mdHdhcmUgZGV2aWNlIGNvbnNpc3Rpbmcgb2YgdHdvCi0JICBoYWx2ZXM6IGEgbWFzdGVyIGFuZCBhIHNsYXZlLiBUaGUgc2xhdmUgZGV2aWNlIGJlaGF2ZXMgaWRlbnRpY2FsIHRvCi0JICBhIHBoeXNpY2FsIHRlcm1pbmFsOyB0aGUgbWFzdGVyIGRldmljZSBpcyB1c2VkIGJ5IGEgcHJvY2VzcyB0bwotCSAgcmVhZCBkYXRhIGZyb20gYW5kIHdyaXRlIGRhdGEgdG8gdGhlIHNsYXZlLCB0aGVyZWJ5IGVtdWxhdGluZyBhCi0JICB0ZXJtaW5hbC4gVHlwaWNhbCBwcm9ncmFtcyBmb3IgdGhlIG1hc3RlciBzaWRlIGFyZSB0ZWxuZXQgc2VydmVycwotCSAgYW5kIHh0ZXJtcy4KLQotCSAgTGludXggaGFzIHRyYWRpdGlvbmFsbHkgdXNlZCB0aGUgQlNELWxpa2UgbmFtZXMgL2Rldi9wdHl4eCBmb3IKLQkgIG1hc3RlcnMgYW5kIC9kZXYvdHR5eHggZm9yIHNsYXZlcyBvZiBwc2V1ZG8gdGVybWluYWxzLiBUaGlzIHNjaGVtZQotCSAgaGFzIGEgbnVtYmVyIG9mIHByb2JsZW1zLiBUaGUgR05VIEMgbGlicmFyeSBnbGliYyAyLjEgYW5kIGxhdGVyLAotCSAgaG93ZXZlciwgc3VwcG9ydHMgdGhlIFVuaXg5OCBuYW1pbmcgc3RhbmRhcmQ6IGluIG9yZGVyIHRvIGFjcXVpcmUgYQotCSAgcHNldWRvIHRlcm1pbmFsLCBhIHByb2Nlc3Mgb3BlbnMgL2Rldi9wdG14OyB0aGUgbnVtYmVyIG9mIHRoZSBwc2V1ZG8KLQkgIHRlcm1pbmFsIGlzIHRoZW4gbWFkZSBhdmFpbGFibGUgdG8gdGhlIHByb2Nlc3MgYW5kIHRoZSBwc2V1ZG8KLQkgIHRlcm1pbmFsIHNsYXZlIGNhbiBiZSBhY2Nlc3NlZCBhcyAvZGV2L3B0cy88bnVtYmVyPi4gV2hhdCB3YXMKLQkgIHRyYWRpdGlvbmFsbHkgL2Rldi90dHlwMiB3aWxsIHRoZW4gYmUgL2Rldi9wdHMvMiwgZm9yIGV4YW1wbGUuCi0KLQkgIFRoZSBlbnRyaWVzIGluIC9kZXYvcHRzLyBhcmUgY3JlYXRlZCBvbiB0aGUgZmx5IGJ5IGEgdmlydHVhbAotCSAgZmlsZSBzeXN0ZW07IHRoZXJlZm9yZSwgaWYgeW91IHNheSBZIGhlcmUgeW91IHNob3VsZCBzYXkgWSB0bwotCSAgIi9kZXYvcHRzIGZpbGUgc3lzdGVtIGZvciBVbml4OTggUFRZcyIgYXMgd2VsbC4KLQotCSAgSWYgeW91IHdhbnQgdG8gc2F5IFkgaGVyZSwgeW91IG5lZWQgdG8gaGF2ZSB0aGUgQyBsaWJyYXJ5IGdsaWJjIDIuMQotCSAgb3IgbGF0ZXIgKGVxdWFsIHRvIGxpYmMtNi4xLCBjaGVjayB3aXRoICJscyAtbCAvbGliL2xpYmMuc28uKiIpLgotCSAgUmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGluIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4gcGVydGFpbmluZyB0bwotCSAgcHNldWRvIHRlcm1pbmFscy4gSXQncyBzYWZlIHRvIHNheSBOLgotCi1jb25maWcgVU5JWDk4X1BUWV9DT1VOVAotCWludCAiTWF4aW11bSBudW1iZXIgb2YgVW5peDk4IFBUWXMgaW4gdXNlICgwLTIwNDgpIgotCWRlcGVuZHMgb24gVU5JWDk4X1BUWVMKLQlkZWZhdWx0ICIyNTYiCi0JaGVscAotCSAgVGhlIG1heGltdW0gbnVtYmVyIG9mIFVuaXg5OCBQVFlzIHRoYXQgY2FuIGJlIHVzZWQgYXQgYW55IG9uZSB0aW1lLgotCSAgVGhlIGRlZmF1bHQgaXMgMjU2LCBhbmQgc2hvdWxkIGJlIGVub3VnaCBmb3IgZGVza3RvcCBzeXN0ZW1zLiBTZXJ2ZXIKLQkgIG1hY2hpbmVzIHdoaWNoIHN1cHBvcnQgaW5jb21pbmcgdGVsbmV0L3Jsb2dpbi9zc2ggY29ubmVjdGlvbnMgYW5kL29yCi0JICBzZXJ2ZSBzZXZlcmFsIFggdGVybWluYWxzIG1heSB3YW50IHRvIGluY3JlYXNlIHRoaXM6IGV2ZXJ5IGluY29taW5nCi0JICBjb25uZWN0aW9uIGFuZCBldmVyeSB4dGVybSB1c2VzIHVwIG9uZSBQVFkuCi0KLQkgIFdoZW4gbm90IGluIHVzZSwgZWFjaCBhZGRpdGlvbmFsIHNldCBvZiAyNTYgUFRZcyBvY2N1cHkKLQkgIGFwcHJveGltYXRlbHkgOCBLQiBvZiBrZXJuZWwgbWVtb3J5IG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLgotCi1lbmRtZW51Ci0KLW1lbnUgIlhGcmVlODYgRFJJIHN1cHBvcnQiCi0KLWNvbmZpZyBEUk0KLQlib29sICJEaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXIgKFhGcmVlODYgRFJJIHN1cHBvcnQpIgotCWhlbHAKLQkgIEtlcm5lbC1sZXZlbCBzdXBwb3J0IGZvciB0aGUgRGlyZWN0IFJlbmRlcmluZyBJbmZyYXN0cnVjdHVyZSAoRFJJKQotCSAgaW50cm9kdWNlZCBpbiBYRnJlZTg2IDQuMC4gSWYgeW91IHNheSBZIGhlcmUsIHlvdSBuZWVkIHRvIHNlbGVjdAotCSAgdGhlIG1vZHVsZSB0aGF0J3MgcmlnaHQgZm9yIHlvdXIgZ3JhcGhpY3MgY2FyZCBmcm9tIHRoZSBsaXN0IGJlbG93LgotCSAgVGhlc2UgbW9kdWxlcyBwcm92aWRlIHN1cHBvcnQgZm9yIHN5bmNocm9uaXphdGlvbiwgc2VjdXJpdHksIGFuZAotCSAgRE1BIHRyYW5zZmVycy4gUGxlYXNlIHNlZSA8aHR0cDovL2RyaS5zb3VyY2Vmb3JnZS5uZXQvPiBmb3IgbW9yZQotCSAgZGV0YWlscy4gIFlvdSBzaG91bGQgYWxzbyBzZWxlY3QgYW5kIGNvbmZpZ3VyZSBBR1AKLQkgICgvZGV2L2FncGdhcnQpIHN1cHBvcnQuCi0KLWNvbmZpZyBEUk1fRkZCCi0JdHJpc3RhdGUgIkNyZWF0b3IvQ3JlYXRvcjNEIgotCWRlcGVuZHMgb24gRFJNICYmIEJST0tFTgotCWhlbHAKLQkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBvbmUgb2YgU3VuJ3MgQ3JlYXRvcjNELWJhc2VkIGdyYXBoaWNzCi0JICBhbmQgZnJhbWUgYnVmZmVyIGNhcmRzLiAgUHJvZHVjdCBwYWdlIGF0Ci0JICA8aHR0cDovL3d3dy5zdW4uY29tL2Rlc2t0b3AvcHJvZHVjdHMvR3JhcGhpY3MvY3JlYXRvcjNkLmh0bWw+LgotCi1jb25maWcgRFJNX1RERlgKLQl0cmlzdGF0ZSAiM2RmeCBCYW5zaGVlL1Zvb2RvbzMrIgotCWRlcGVuZHMgb24gRFJNCi0JaGVscAotCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgM2RmeCBCYW5zaGVlIG9yIFZvb2RvbzMgKG9yIGxhdGVyKSwKLQkgIGdyYXBoaWNzIGNhcmQuICBJZiBNIGlzIHNlbGVjdGVkLCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRkZnguCi0KLWNvbmZpZyBEUk1fUjEyOAotCXRyaXN0YXRlICJBVEkgUmFnZSAxMjgiCi0JZGVwZW5kcyBvbiBEUk0KLQloZWxwCi0JICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYW4gQVRJIFJhZ2UgMTI4IGdyYXBoaWNzIGNhcmQuICBJZiBNCi0JICBpcyBzZWxlY3RlZCwgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByMTI4LiAgQUdQIHN1cHBvcnQgZm9yCi0JICB0aGlzIGNhcmQgaXMgc3Ryb25nbHkgc3VnZ2VzdGVkICh1bmxlc3MgeW91IGhhdmUgYSBQQ0kgdmVyc2lvbikuCi0KLWVuZG1lbnUKLQotc291cmNlICJkcml2ZXJzL2lucHV0L0tjb25maWciCi0KLXNvdXJjZSAiZHJpdmVycy9pMmMvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL2h3bW9uL0tjb25maWciCi0KIHNvdXJjZSAiZnMvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL21lZGlhL0tjb25maWciCi0KLXNvdXJjZSAic291bmQvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3VzYi9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnIgotCiBzb3VyY2UgImFyY2gvc3BhcmM2NC9vcHJvZmlsZS9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvc3BhcmM2NC9LY29uZmlnLmRlYnVnIgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9hc20tb2Zmc2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjYzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTAsMCArMSBAQAorLyogRHVtbXkgYXNtLW9mZnNldHMuYyBmaWxlLiBSZXF1aXJlZCBieSBrYnVpbGQgYW5kIHJlYWR5IHRvIGJlIHVzZWQgLSBoaW50ISAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnRyeS5TCmluZGV4IGNlY2RjMGEuLjNlMGJhZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2VudHJ5LlMKQEAgLTkyNywxMzkgKzkyNyw2IEBACiAJYmEscHQJCSV4Y2MsIHJ0cmFwCiAJIGNscgkJJWw2CiAKLQkvKiBDYXB0dXJlIEkvRC9FLWNhY2hlIHN0YXRlIGludG8gcGVyLWNwdSBlcnJvciBzY29yZWJvYXJkLgotCSAqCi0JICogJWcxOgkJKFRMPj0wKSA/IDEgOiAwCi0JICogJWcyOgkJc2NyYXRjaAotCSAqICVnMzoJCXNjcmF0Y2gKLQkgKiAlZzQ6CQlBRlNSCi0JICogJWc1OgkJQUZBUgotCSAqICVnNjoJCWN1cnJlbnQgdGhyZWFkIHB0cgotCSAqICVnNzoJCXNjcmF0Y2gKLQkgKi8KLSNkZWZpbmUgQ0hFRVRBSF9MT0dfRVJST1IJCQkJCQlcCi0JLyogUHV0ICJUTDEiIHNvZnR3YXJlIGJpdCBpbnRvIEFGU1IuICovCQkJCVwKLQlhbmQJCSVnMSwgMHgxLCAlZzE7CQkJCQlcCi0Jc2xseAkJJWcxLCA2MywgJWcyOwkJCQkJXAotCW9yCQklZzQsICVnMiwgJWc0OwkJCQkJXAotCS8qIEdldCBsb2cgZW50cnkgcG9pbnRlciBmb3IgdGhpcyBjcHUgYXQgdGhpcyB0cmFwIGxldmVsLiAqLwlcCi0JQlJBTkNIX0lGX0pBTEFQRU5PKGcyLGczLDUwZikJCQkJCVwKLQlsZHhhCQlbJWcwXSBBU0lfU0FGQVJJX0NPTkZJRywgJWcyOwkJCVwKLQlzcmx4CQklZzIsIDE3LCAlZzI7CQkJCQlcCi0JYmEscHQJCSV4Y2MsIDYwZjsgCQkJCQlcCi0JIGFuZAkJJWcyLCAweDNmZiwgJWcyOwkJCQlcCi01MDoJbGR4YQkJWyVnMF0gQVNJX0pCVVNfQ09ORklHLCAlZzI7CQkJXAotCXNybHgJCSVnMiwgMTcsICVnMjsJCQkJCVwKLQlhbmQJCSVnMiwgMHgxZiwgJWcyOwkJCQkJXAotNjA6CXNsbHgJCSVnMiwgOSwgJWcyOwkJCQkJXAotCXNldGhpCQklaGkoY2hlZXRhaF9lcnJvcl9sb2cpLCAlZzM7CQkJXAotCWxkeAkJWyVnMyArICVsbyhjaGVldGFoX2Vycm9yX2xvZyldLCAlZzM7CQlcCi0JYnJ6LHBuCQklZzMsIDgwZjsJCQkJCVwKLQkgbm9wOwkJCQkJCQkJXAotCWFkZAkJJWczLCAlZzIsICVnMzsJCQkJCVwKLQlzbGx4CQklZzEsIDgsICVnMTsJCQkJCVwKLQlhZGQJCSVnMywgJWcxLCAlZzE7CQkJCQlcCi0JLyogJWcxIGhvbGRzIHBvaW50ZXIgdG8gdGhlIHRvcCBvZiB0aGUgbG9nZ2luZyBzY29yZWJvYXJkICovCVwKLQlsZHgJCVslZzEgKyAweDBdLCAlZzc7CQkJCVwKLQljbXAJCSVnNywgLTE7CQkJCQlcCi0JYm5lLHBuCQkleGNjLCA4MGY7CQkJCQlcCi0JIG5vcDsJCQkJCQkJCVwKLQlzdHgJCSVnNCwgWyVnMSArIDB4MF07CQkJCVwKLQlzdHgJCSVnNSwgWyVnMSArIDB4OF07CQkJCVwKLQlhZGQJCSVnMSwgMHgxMCwgJWcxOwkJCQkJXAotCS8qICVnMSBub3cgcG9pbnRzIHRvIEQtY2FjaGUgbG9nZ2luZyBhcmVhICovCQkJXAotCXNldAkJMHgzZmY4LCAlZzI7CS8qIERDX2FkZHIgbWFzawkJKi8JXAotCWFuZAkJJWc1LCAlZzIsICVnMjsJLyogRENfYWRkciBiaXRzIG9mIEFGQVIJKi8JXAotCXNybHgJCSVnNSwgMTIsICVnMzsJCQkJCVwKLQlvcgkJJWczLCAxLCAlZzM7CS8qIFBIWVMgdGFnICsgdmFsaWQJKi8JXAotMTA6CWxkeGEJCVslZzJdIEFTSV9EQ0FDSEVfVEFHLCAlZzc7CQkJXAotCWNtcAkJJWczLCAlZzc7CS8qIFRBRyBtYXRjaD8JCSovCVwKLQlibmUscHQJCSV4Y2MsIDEzZjsJCQkJCVwKLQkgbm9wOwkJCQkJCQkJXAotCS8qIFllcCwgd2hhdCB3ZSB3YW50LCBjYXB0dXJlIHN0YXRlLiAqLwkJCQlcCi0Jc3R4CQklZzIsIFslZzEgKyAweDIwXTsJCQkJXAotCXN0eAkJJWc3LCBbJWcxICsgMHgyOF07CQkJCVwKLQkvKiBBIG1lbWJhciBTeW5jIGlzIHJlcXVpcmVkIGJlZm9yZSBhbmQgYWZ0ZXIgdXRhZyBhY2Nlc3MuICovCVwKLQltZW1iYXIJCSNTeW5jOwkJCQkJCVwKLQlsZHhhCQlbJWcyXSBBU0lfRENBQ0hFX1VUQUcsICVnNzsJCQlcCi0JbWVtYmFyCQkjU3luYzsJCQkJCQlcCi0Jc3R4CQklZzcsIFslZzEgKyAweDMwXTsJCQkJXAotCWxkeGEJCVslZzJdIEFTSV9EQ0FDSEVfU05PT1BfVEFHLCAlZzc7CQlcCi0Jc3R4CQklZzcsIFslZzEgKyAweDM4XTsJCQkJXAotCWNscgkJJWczOwkJCQkJCVwKLTEyOglsZHhhCQlbJWcyICsgJWczXSBBU0lfRENBQ0hFX0RBVEEsICVnNzsJCVwKLQlzdHgJCSVnNywgWyVnMV07CQkJCQlcCi0JYWRkCQklZzMsICgxIDw8IDUpLCAlZzM7CQkJCVwKLQljbXAJCSVnMywgKDQgPDwgNSk7CQkJCQlcCi0JYmwscHQJCSV4Y2MsIDEyYjsJCQkJCVwKLQkgYWRkCQklZzEsIDB4OCwgJWcxOwkJCQkJXAotCWJhLHB0CQkleGNjLCAyMGY7CQkJCQlcCi0JIGFkZAkJJWcxLCAweDIwLCAlZzE7CQkJCQlcCi0xMzoJc2V0aGkJCSVoaSgxIDw8IDE0KSwgJWc3OwkJCQlcCi0JYWRkCQklZzIsICVnNywgJWcyOwkJCQkJXAotCXNybHgJCSVnMiwgMTQsICVnNzsJCQkJCVwKLQljbXAJCSVnNywgNDsJCQkJCQlcCi0JYmwscHQJCSV4Y2MsIDEwYjsJCQkJCVwKLQkgbm9wOwkJCQkJCQkJXAotCWFkZAkJJWcxLCAweDQwLCAlZzE7CQkJCQlcCi0yMDoJLyogJWcxIG5vdyBwb2ludHMgdG8gSS1jYWNoZSBsb2dnaW5nIGFyZWEgKi8JCQlcCi0Jc2V0CQkweDFmZTAsICVnMjsJLyogSUNfYWRkciBtYXNrCQkqLwlcCi0JYW5kCQklZzUsICVnMiwgJWcyOwkvKiBJQ19hZGRyIGJpdHMgb2YgQUZBUgkqLwlcCi0Jc2xseAkJJWcyLCAxLCAlZzI7CS8qIElDX2FkZHJbMTM6Nl09PVZBWzEyOjVdICovCVwKLQlzcmx4CQklZzUsICgxMyAtIDgpLCAlZzM7IC8qIE1ha2UgUFRBRyAqLwkJXAotCWFuZG4JCSVnMywgMHhmZiwgJWczOwkvKiBNYXNrIG9mZiB1bmRlZmluZWQgYml0cyAqLwlcCi0yMToJbGR4YQkJWyVnMl0gQVNJX0lDX1RBRywgJWc3OwkJCQlcCi0JYW5kbgkJJWc3LCAweGZmLCAlZzc7CQkJCQlcCi0JY21wCQklZzMsICVnNzsJCQkJCVwKLQlibmUscHQJCSV4Y2MsIDIzZjsJCQkJCVwKLQkgbm9wOwkJCQkJCQkJXAotCS8qIFllcCwgd2hhdCB3ZSB3YW50LCBjYXB0dXJlIHN0YXRlLiAqLwkJCQlcCi0Jc3R4CQklZzIsIFslZzEgKyAweDQwXTsJCQkJXAotCXN0eAkJJWc3LCBbJWcxICsgMHg0OF07CQkJCVwKLQlhZGQJCSVnMiwgKDEgPDwgMyksICVnMjsJCQkJXAotCWxkeGEJCVslZzJdIEFTSV9JQ19UQUcsICVnNzsJCQkJXAotCWFkZAkJJWcyLCAoMSA8PCAzKSwgJWcyOwkJCQlcCi0Jc3R4CQklZzcsIFslZzEgKyAweDUwXTsJCQkJXAotCWxkeGEJCVslZzJdIEFTSV9JQ19UQUcsICVnNzsJCQkJXAotCWFkZAkJJWcyLCAoMSA8PCAzKSwgJWcyOwkJCQlcCi0Jc3R4CQklZzcsIFslZzEgKyAweDYwXTsJCQkJXAotCWxkeGEJCVslZzJdIEFTSV9JQ19UQUcsICVnNzsJCQkJXAotCXN0eAkJJWc3LCBbJWcxICsgMHg2OF07CQkJCVwKLQlzdWIJCSVnMiwgKDMgPDwgMyksICVnMjsJCQkJXAotCWxkeGEJCVslZzJdIEFTSV9JQ19TVEFHLCAlZzc7CQkJCVwKLQlzdHgJCSVnNywgWyVnMSArIDB4NThdOwkJCQlcCi0JY2xyCQklZzM7CQkJCQkJXAotCXNybHgJCSVnMiwgMiwgJWcyOwkJCQkJXAotMjI6CWxkeGEJCVslZzIgKyAlZzNdIEFTSV9JQ19JTlNUUiwgJWc3OwkJCVwKLQlzdHgJCSVnNywgWyVnMV07CQkJCQlcCi0JYWRkCQklZzMsICgxIDw8IDMpLCAlZzM7CQkJCVwKLQljbXAJCSVnMywgKDggPDwgMyk7CQkJCQlcCi0JYmwscHQJCSV4Y2MsIDIyYjsJCQkJCVwKLQkgYWRkCQklZzEsIDB4OCwgJWcxOwkJCQkJXAotCWJhLHB0CQkleGNjLCAzMGY7CQkJCQlcCi0JIGFkZAkJJWcxLCAweDMwLCAlZzE7CQkJCQlcCi0yMzoJc2V0aGkJCSVoaSgxIDw8IDE0KSwgJWc3OwkJCQlcCi0JYWRkCQklZzIsICVnNywgJWcyOwkJCQkJXAotCXNybHgJCSVnMiwgMTQsICVnNzsJCQkJCVwKLQljbXAJCSVnNywgNDsJCQkJCQlcCi0JYmwscHQJCSV4Y2MsIDIxYjsJCQkJCVwKLQkgbm9wOwkJCQkJCQkJXAotCWFkZAkJJWcxLCAweDcwLCAlZzE7CQkJCQlcCi0zMDoJLyogJWcxIG5vdyBwb2ludHMgdG8gRS1jYWNoZSBsb2dnaW5nIGFyZWEgKi8JCQlcCi0JYW5kbgkJJWc1LCAoMzIgLSAxKSwgJWcyOwkvKiBFLWNhY2hlIHN1YmJsb2NrICovCVwKLQlzdHgJCSVnMiwgWyVnMSArIDB4MjBdOwkJCQlcCi0JbGR4YQkJWyVnMl0gQVNJX0VDX1RBR19EQVRBLCAlZzc7CQkJXAotCXN0eAkJJWc3LCBbJWcxICsgMHgyOF07CQkJCVwKLQlsZHhhCQlbJWcyXSBBU0lfRUNfUiwgJWcwOwkJCQlcCi0JY2xyCQklZzM7CQkJCQkJXAotMzE6CWxkeGEJCVslZzNdIEFTSV9FQ19EQVRBLCAlZzc7CQkJCVwKLQlzdHgJCSVnNywgWyVnMSArICVnM107CQkJCVwKLQlhZGQJCSVnMywgMHg4LCAlZzM7CQkJCQlcCi0JY21wCQklZzMsIDB4MjA7CQkJCQlcCi0JYmwscHQJCSV4Y2MsIDMxYjsJCQkJCVwKLQkgbm9wOwkJCQkJCQkJXAotODA6CS8qIERPTkUgKi8KLQogCS8qIFRoZXNlIGdldCBwYXRjaGVkIGludG8gdGhlIHRyYXAgdGFibGUgYXQgYm9vdCB0aW1lCiAJICogb25jZSB3ZSBrbm93IHdlIGhhdmUgYSBjaGVldGFoIHByb2Nlc3Nvci4KIAkgKi8KQEAgLTEyOTYsNiArMTE2MywxNzAgQEAKIAltZW1iYXIJCSNTeW5jCiAJcmV0cnkKIAorCS8qIENhcHR1cmUgSS9EL0UtY2FjaGUgc3RhdGUgaW50byBwZXItY3B1IGVycm9yIHNjb3JlYm9hcmQuCisJICoKKwkgKiAlZzE6CQkoVEw+PTApID8gMSA6IDAKKwkgKiAlZzI6CQlzY3JhdGNoCisJICogJWczOgkJc2NyYXRjaAorCSAqICVnNDoJCUFGU1IKKwkgKiAlZzU6CQlBRkFSCisJICogJWc2OgkJY3VycmVudCB0aHJlYWQgcHRyCisJICogJWc3OgkJc2NyYXRjaAorCSAqLworX19jaGVldGFoX2xvZ19lcnJvcjoKKwkvKiBQdXQgIlRMMSIgc29mdHdhcmUgYml0IGludG8gQUZTUi4gKi8KKwlhbmQJCSVnMSwgMHgxLCAlZzEKKwlzbGx4CQklZzEsIDYzLCAlZzIKKwlvcgkJJWc0LCAlZzIsICVnNAorCisJLyogR2V0IGxvZyBlbnRyeSBwb2ludGVyIGZvciB0aGlzIGNwdSBhdCB0aGlzIHRyYXAgbGV2ZWwuICovCisJQlJBTkNIX0lGX0pBTEFQRU5PKGcyLGczLDUwZikKKwlsZHhhCQlbJWcwXSBBU0lfU0FGQVJJX0NPTkZJRywgJWcyCisJc3JseAkJJWcyLCAxNywgJWcyCisJYmEscHQJCSV4Y2MsIDYwZgorCSBhbmQJCSVnMiwgMHgzZmYsICVnMgorCis1MDoJbGR4YQkJWyVnMF0gQVNJX0pCVVNfQ09ORklHLCAlZzIKKwlzcmx4CQklZzIsIDE3LCAlZzIKKwlhbmQJCSVnMiwgMHgxZiwgJWcyCisKKzYwOglzbGx4CQklZzIsIDksICVnMgorCXNldGhpCQklaGkoY2hlZXRhaF9lcnJvcl9sb2cpLCAlZzMKKwlsZHgJCVslZzMgKyAlbG8oY2hlZXRhaF9lcnJvcl9sb2cpXSwgJWczCisJYnJ6LHBuCQklZzMsIDgwZgorCSBub3AKKworCWFkZAkJJWczLCAlZzIsICVnMworCXNsbHgJCSVnMSwgOCwgJWcxCisJYWRkCQklZzMsICVnMSwgJWcxCisKKwkvKiAlZzEgaG9sZHMgcG9pbnRlciB0byB0aGUgdG9wIG9mIHRoZSBsb2dnaW5nIHNjb3JlYm9hcmQgKi8KKwlsZHgJCVslZzEgKyAweDBdLCAlZzcKKwljbXAJCSVnNywgLTEKKwlibmUscG4JCSV4Y2MsIDgwZgorCSBub3AKKworCXN0eAkJJWc0LCBbJWcxICsgMHgwXQorCXN0eAkJJWc1LCBbJWcxICsgMHg4XQorCWFkZAkJJWcxLCAweDEwLCAlZzEKKworCS8qICVnMSBub3cgcG9pbnRzIHRvIEQtY2FjaGUgbG9nZ2luZyBhcmVhICovCisJc2V0CQkweDNmZjgsICVnMgkvKiBEQ19hZGRyIG1hc2sJCSovCisJYW5kCQklZzUsICVnMiwgJWcyCS8qIERDX2FkZHIgYml0cyBvZiBBRkFSCSovCisJc3JseAkJJWc1LCAxMiwgJWczCisJb3IJCSVnMywgMSwgJWczCS8qIFBIWVMgdGFnICsgdmFsaWQJKi8KKworMTA6CWxkeGEJCVslZzJdIEFTSV9EQ0FDSEVfVEFHLCAlZzcKKwljbXAJCSVnMywgJWc3CS8qIFRBRyBtYXRjaD8JCSovCisJYm5lLHB0CQkleGNjLCAxM2YKKwkgbm9wCisKKwkvKiBZZXAsIHdoYXQgd2Ugd2FudCwgY2FwdHVyZSBzdGF0ZS4gKi8KKwlzdHgJCSVnMiwgWyVnMSArIDB4MjBdCisJc3R4CQklZzcsIFslZzEgKyAweDI4XQorCisJLyogQSBtZW1iYXIgU3luYyBpcyByZXF1aXJlZCBiZWZvcmUgYW5kIGFmdGVyIHV0YWcgYWNjZXNzLiAqLworCW1lbWJhcgkJI1N5bmMKKwlsZHhhCQlbJWcyXSBBU0lfRENBQ0hFX1VUQUcsICVnNworCW1lbWJhcgkJI1N5bmMKKwlzdHgJCSVnNywgWyVnMSArIDB4MzBdCisJbGR4YQkJWyVnMl0gQVNJX0RDQUNIRV9TTk9PUF9UQUcsICVnNworCXN0eAkJJWc3LCBbJWcxICsgMHgzOF0KKwljbHIJCSVnMworCisxMjoJbGR4YQkJWyVnMiArICVnM10gQVNJX0RDQUNIRV9EQVRBLCAlZzcKKwlzdHgJCSVnNywgWyVnMV0KKwlhZGQJCSVnMywgKDEgPDwgNSksICVnMworCWNtcAkJJWczLCAoNCA8PCA1KQorCWJsLHB0CQkleGNjLCAxMmIKKwkgYWRkCQklZzEsIDB4OCwgJWcxCisKKwliYSxwdAkJJXhjYywgMjBmCisJIGFkZAkJJWcxLCAweDIwLCAlZzEKKworMTM6CXNldGhpCQklaGkoMSA8PCAxNCksICVnNworCWFkZAkJJWcyLCAlZzcsICVnMgorCXNybHgJCSVnMiwgMTQsICVnNworCWNtcAkJJWc3LCA0CisJYmwscHQJCSV4Y2MsIDEwYgorCSBub3AKKworCWFkZAkJJWcxLCAweDQwLCAlZzEKKworCS8qICVnMSBub3cgcG9pbnRzIHRvIEktY2FjaGUgbG9nZ2luZyBhcmVhICovCisyMDoJc2V0CQkweDFmZTAsICVnMgkvKiBJQ19hZGRyIG1hc2sJCSovCisJYW5kCQklZzUsICVnMiwgJWcyCS8qIElDX2FkZHIgYml0cyBvZiBBRkFSCSovCisJc2xseAkJJWcyLCAxLCAlZzIJLyogSUNfYWRkclsxMzo2XT09VkFbMTI6NV0gKi8KKwlzcmx4CQklZzUsICgxMyAtIDgpLCAlZzMgLyogTWFrZSBQVEFHICovCisJYW5kbgkJJWczLCAweGZmLCAlZzMJLyogTWFzayBvZmYgdW5kZWZpbmVkIGJpdHMgKi8KKworMjE6CWxkeGEJCVslZzJdIEFTSV9JQ19UQUcsICVnNworCWFuZG4JCSVnNywgMHhmZiwgJWc3CisJY21wCQklZzMsICVnNworCWJuZSxwdAkJJXhjYywgMjNmCisJIG5vcAorCisJLyogWWVwLCB3aGF0IHdlIHdhbnQsIGNhcHR1cmUgc3RhdGUuICovCisJc3R4CQklZzIsIFslZzEgKyAweDQwXQorCXN0eAkJJWc3LCBbJWcxICsgMHg0OF0KKwlhZGQJCSVnMiwgKDEgPDwgMyksICVnMgorCWxkeGEJCVslZzJdIEFTSV9JQ19UQUcsICVnNworCWFkZAkJJWcyLCAoMSA8PCAzKSwgJWcyCisJc3R4CQklZzcsIFslZzEgKyAweDUwXQorCWxkeGEJCVslZzJdIEFTSV9JQ19UQUcsICVnNworCWFkZAkJJWcyLCAoMSA8PCAzKSwgJWcyCisJc3R4CQklZzcsIFslZzEgKyAweDYwXQorCWxkeGEJCVslZzJdIEFTSV9JQ19UQUcsICVnNworCXN0eAkJJWc3LCBbJWcxICsgMHg2OF0KKwlzdWIJCSVnMiwgKDMgPDwgMyksICVnMgorCWxkeGEJCVslZzJdIEFTSV9JQ19TVEFHLCAlZzcKKwlzdHgJCSVnNywgWyVnMSArIDB4NThdCisJY2xyCQklZzMKKwlzcmx4CQklZzIsIDIsICVnMgorCisyMjoJbGR4YQkJWyVnMiArICVnM10gQVNJX0lDX0lOU1RSLCAlZzcKKwlzdHgJCSVnNywgWyVnMV0KKwlhZGQJCSVnMywgKDEgPDwgMyksICVnMworCWNtcAkJJWczLCAoOCA8PCAzKQorCWJsLHB0CQkleGNjLCAyMmIKKwkgYWRkCQklZzEsIDB4OCwgJWcxCisKKwliYSxwdAkJJXhjYywgMzBmCisJIGFkZAkJJWcxLCAweDMwLCAlZzEKKworMjM6CXNldGhpCQklaGkoMSA8PCAxNCksICVnNworCWFkZAkJJWcyLCAlZzcsICVnMgorCXNybHgJCSVnMiwgMTQsICVnNworCWNtcAkJJWc3LCA0CisJYmwscHQJCSV4Y2MsIDIxYgorCSBub3AKKworCWFkZAkJJWcxLCAweDcwLCAlZzEKKworCS8qICVnMSBub3cgcG9pbnRzIHRvIEUtY2FjaGUgbG9nZ2luZyBhcmVhICovCiszMDoJYW5kbgkJJWc1LCAoMzIgLSAxKSwgJWcyCisJc3R4CQklZzIsIFslZzEgKyAweDIwXQorCWxkeGEJCVslZzJdIEFTSV9FQ19UQUdfREFUQSwgJWc3CisJc3R4CQklZzcsIFslZzEgKyAweDI4XQorCWxkeGEJCVslZzJdIEFTSV9FQ19SLCAlZzAKKwljbHIJCSVnMworCiszMToJbGR4YQkJWyVnM10gQVNJX0VDX0RBVEEsICVnNworCXN0eAkJJWc3LCBbJWcxICsgJWczXQorCWFkZAkJJWczLCAweDgsICVnMworCWNtcAkJJWczLCAweDIwCisKKwlibCxwdAkJJXhjYywgMzFiCisJIG5vcAorODA6CisJcmRwcgkJJXR0LCAlZzIKKwljbXAJCSVnMiwgMHg3MAorCWJlCQljX2Zhc3RfZWNjCisJIGNtcAkJJWcyLCAweDYzCisJYmUJCWNfY2VlCisJIG5vcAorCWJhLHB0CQkleGNjLCBjX2RlZmVycmVkCisKIAkvKiBDaGVldGFoIEZFQ0MgdHJhcCBoYW5kbGluZywgd2UgZ2V0IGhlcmUgZnJvbSB0bHswLDF9X2ZlY2MKIAkgKiBpbiB0aGUgdHJhcCB0YWJsZS4gIFRoYXQgY29kZSBoYXMgZG9uZSBhIG1lbW9yeSBiYXJyaWVyCiAJICogYW5kIGhhcyBkaXNhYmxlZCBib3RoIHRoZSBJLWNhY2hlIGFuZCBELWNhY2hlIGluIHRoZSBEQ1UKQEAgLTEzMjEsOCArMTM1MiwxMCBAQAogCXN0eGEJCSVnNCwgWyVnMF0gQVNJX0FGU1IKIAltZW1iYXIJCSNTeW5jCiAKLQlDSEVFVEFIX0xPR19FUlJPUgorCWJhLHB0CQkleGNjLCBfX2NoZWV0YWhfbG9nX2Vycm9yCisJIG5vcAogCitjX2Zhc3RfZWNjOgogCXJkcHIJCSVwaWwsICVnMgogCXdycHIJCSVnMCwgMTUsICVwaWwKIAliYSxwdAkJJXhjYywgZXRyYXBfaXJxCkBAIC0xMzQ3LDggKzEzODAsMTAgQEAKIAlzdHhhCQklZzQsIFslZzBdIEFTSV9BRlNSCiAJbWVtYmFyCQkjU3luYwogCi0JQ0hFRVRBSF9MT0dfRVJST1IKKwliYSxwdAkJJXhjYywgX19jaGVldGFoX2xvZ19lcnJvcgorCSBub3AKIAorY19jZWU6CiAJcmRwcgkJJXBpbCwgJWcyCiAJd3JwcgkJJWcwLCAxNSwgJXBpbAogCWJhLHB0CQkleGNjLCBldHJhcF9pcnEKQEAgLTEzNzMsOCArMTQwOCwxMCBAQAogCXN0eGEJCSVnNCwgWyVnMF0gQVNJX0FGU1IKIAltZW1iYXIJCSNTeW5jCiAKLQlDSEVFVEFIX0xPR19FUlJPUgorCWJhLHB0CQkleGNjLCBfX2NoZWV0YWhfbG9nX2Vycm9yCisJIG5vcAogCitjX2RlZmVycmVkOgogCXJkcHIJCSVwaWwsICVnMgogCXdycHIJCSVnMCwgMTUsICVwaWwKIAliYSxwdAkJJXhjYywgZXRyYXBfaXJxCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2hlYWQuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaGVhZC5TCmluZGV4IDgxMDRhNTYuLjFmYTA2YzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaGVhZC5TCkBAIC01MzgsMTEgKzUzOCwxMiBAQAogCSBub3AKIAljYWxsCWNoZWV0YWhfcGx1c19wYXRjaF93aW5maXh1cAogCSBub3AKLQkKIAogMjoJLyogUGF0Y2ggY29weS9wYWdlIG9wZXJhdGlvbnMgdG8gY2hlZXRhaCBvcHRpbWl6ZWQgdmVyc2lvbnMuICovCiAJY2FsbAljaGVldGFoX3BhdGNoX2NvcHlvcHMKIAkgbm9wCisJY2FsbAljaGVldGFoX3BhdGNoX2NvcHlfcGFnZQorCSBub3AKIAljYWxsCWNoZWV0YWhfcGF0Y2hfY2FjaGV0bGJvcHMKIAkgbm9wCiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggYmJmMTFmOC4uMGQ2NmQwNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KICNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAogLyogV2UgZG8gbm90IGhhdmUgaGFyZHdhcmUgc2luZ2xlLXN0ZXBwaW5nIG9uIHNwYXJjNjQuCiAgKiBTbyB3ZSBpbXBsZW1lbnQgc29mdHdhcmUgc2luZ2xlLXN0ZXBwaW5nIHdpdGggYnJlYWtwb2ludApAQCAtMzcsMzEgKzM4LDMxIEBACiAgKiAtIE1hcmsgdGhhdCB3ZSBhcmUgbm8gbG9uZ2VyIGFjdGl2ZWx5IGluIGEga3Byb2JlLgogICovCiAKLWludCBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCitpbnQgX19rcHJvYmVzIGFyY2hfcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJcC0+YWluc24uaW5zblswXSA9ICpwLT5hZGRyOwogCXAtPmFpbnNuLmluc25bMV0gPSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OXzI7CiAJcC0+b3Bjb2RlID0gKnAtPmFkZHI7CiB9CiAKLXZvaWQgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAkqcC0+YWRkciA9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT047CiAJZmx1c2hpKHAtPmFkZHIpOwogfQogCi12b2lkIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBfX2twcm9iZXMgYXJjaF9kaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJKnAtPmFkZHIgPSBwLT5vcGNvZGU7CiAJZmx1c2hpKHAtPmFkZHIpOwogfQogCi12b2lkIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBfX2twcm9iZXMgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiB9CiAKQEAgLTExMSw3ICsxMTIsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBrcHJvYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGtwcm9iZV9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcHJvYmUgKnA7CiAJdm9pZCAqYWRkciA9ICh2b2lkICopIHJlZ3MtPnRwYzsKQEAgLTE5MSw4ICsxOTIsOSBAQAogICogVGhlIG9yaWdpbmFsIElOU04gbG9jYXRpb24gd2FzIFJFQUxfUEMsIGl0IGFjdHVhbGx5CiAgKiBleGVjdXRlZCBhdCBQQyBhbmQgcHJvZHVjZWQgZGVzdGluYXRpb24gYWRkcmVzcyBOUEMuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlbGJyYW5jaF9maXh1cCh1MzIgaW5zbiwgdW5zaWduZWQgbG9uZyByZWFsX3BjLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBwYywgdW5zaWduZWQgbG9uZyBucGMpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2twcm9iZXMgcmVsYnJhbmNoX2ZpeHVwKHUzMiBpbnNuLCB1bnNpZ25lZCBsb25nIHJlYWxfcGMsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBjLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBucGMpCiB7CiAJLyogQnJhbmNoIG5vdCB0YWtlbiwgbm8gbW9kcyBuZWNlc3NhcnkuICAqLwogCWlmIChucGMgPT0gcGMgKyAweDRVTCkKQEAgLTIxNyw3ICsyMTksOCBAQAogLyogSWYgSU5TTiBpcyBhbiBpbnN0cnVjdGlvbiB3aGljaCB3cml0ZXMgaXQncyBQQyBsb2NhdGlvbgogICogaW50byBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLCBmaXggdGhhdCB1cC4KICAqLwotc3RhdGljIHZvaWQgcmV0cGNfZml4dXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHUzMiBpbnNuLCB1bnNpZ25lZCBsb25nIHJlYWxfcGMpCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgcmV0cGNfZml4dXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHUzMiBpbnNuLAorCQkJCSAgdW5zaWduZWQgbG9uZyByZWFsX3BjKQogewogCXVuc2lnbmVkIGxvbmcgKnNsb3QgPSBOVUxMOwogCkBAIC0yNTcsNyArMjYwLDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdG8gcmV0dXJuIGZyb20gdGhlIHBvc3Qtc2luZ2xlLXN0ZXAKICAqIGJyZWFrcG9pbnQgdHJhcC4KICAqLwotc3RhdGljIHZvaWQgcmVzdW1lX2V4ZWN1dGlvbihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyByZXN1bWVfZXhlY3V0aW9uKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXUzMiBpbnNuID0gcC0+YWluc24uaW5zblswXTsKIApAQCAtMzE1LDggKzMxOCw4IEBACiAvKgogICogV3JhcHBlciByb3V0aW5lIHRvIGZvciBoYW5kbGluZyBleGNlcHRpb25zLgogICovCi1pbnQga3Byb2JlX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyB2YWwsCi0JCQkgICAgIHZvaWQgKmRhdGEpCitpbnQgX19rcHJvYmVzIGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IChzdHJ1Y3QgZGllX2FyZ3MgKilkYXRhOwogCXN3aXRjaCAodmFsKSB7CkBAIC0zNDQsNyArMzQ3LDggQEAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKLWFzbWxpbmthZ2Ugdm9pZCBrcHJvYmVfdHJhcCh1bnNpZ25lZCBsb25nIHRyYXBfbGV2ZWwsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorYXNtbGlua2FnZSB2b2lkIF9fa3Byb2JlcyBrcHJvYmVfdHJhcCh1bnNpZ25lZCBsb25nIHRyYXBfbGV2ZWwsCisJCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJQlVHX09OKHRyYXBfbGV2ZWwgIT0gMHgxNzAgJiYgdHJhcF9sZXZlbCAhPSAweDE3MSk7CiAKQEAgLTM2OCw3ICszNzIsNyBAQAogc3RhdGljIHN0cnVjdCBwdF9yZWdzICpqcHJvYmVfc2F2ZWRfcmVnc19sb2NhdGlvbjsKIHN0YXRpYyBzdHJ1Y3Qgc3BhcmNfc3RhY2tmIGpwcm9iZV9zYXZlZF9zdGFjazsKIAotaW50IHNldGptcF9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBqcHJvYmUgKmpwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBqcHJvYmUsIGtwKTsKIApAQCAtMzkwLDcgKzM5NCw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXZvaWQganByb2JlX3JldHVybih2b2lkKQordm9pZCBfX2twcm9iZXMganByb2JlX3JldHVybih2b2lkKQogewogCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKQEAgLTQwMyw3ICs0MDcsNyBAQAogCiBleHRlcm4gdm9pZCBfX3Nob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOwogCi1pbnQgbG9uZ2ptcF9icmVha19oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IF9fa3Byb2JlcyBsb25nam1wX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTMyICphZGRyID0gKHUzMiAqKSByZWdzLT50cGM7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaS5jCmluZGV4IGYyMWM5OTMuLjJmZjdjMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYwpAQCAtMzU5LDEzNCArMzU5LDE3IEBACiAJcGJ1cy0+cmVzb3VyY2VbMV0gPSAmcGJtLT5tZW1fc3BhY2U7CiB9CiAKLWludCBwY2lfY2xhaW1fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCByZXNvdXJjZSkKK3N0cnVjdCByZXNvdXJjZSAqcGNpYmlvc19zZWxlY3Rfcm9vdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHJlc291cmNlICpyKQogewogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IHBkZXYtPmJ1cy0+c3lzZGF0YTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZwZGV2LT5yZXNvdXJjZVtyZXNvdXJjZV07Ci0Jc3RydWN0IHJlc291cmNlICpyb290OworCXN0cnVjdCByZXNvdXJjZSAqcm9vdCA9IE5VTEw7CiAKLQlpZiAoIXBibSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKIAkJcm9vdCA9ICZwYm0tPmlvX3NwYWNlOwotCWVsc2UKKwlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKIAkJcm9vdCA9ICZwYm0tPm1lbV9zcGFjZTsKIAotCXBibS0+cGFyZW50LT5yZXNvdXJjZV9hZGp1c3QocGRldiwgcmVzLCByb290KTsKLQotCXJldHVybiByZXF1ZXN0X3Jlc291cmNlKHJvb3QsIHJlcyk7Ci19Ci0KLS8qCi0gKiBHaXZlbiB0aGUgUENJIGJ1cyBhIGRldmljZSByZXNpZGVzIG9uLCB0cnkgdG8KLSAqIGZpbmQgYW4gYWNjZXB0YWJsZSByZXNvdXJjZSBhbGxvY2F0aW9uIGZvciBhCi0gKiBzcGVjaWZpYyBkZXZpY2UgcmVzb3VyY2UuLgotICovCi1zdGF0aWMgaW50IHBjaV9hc3NpZ25fYnVzX3Jlc291cmNlKGNvbnN0IHN0cnVjdCBwY2lfYnVzICpidXMsCi0Jc3RydWN0IHBjaV9kZXYgKmRldiwKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKLQl1bnNpZ25lZCBsb25nIHNpemUsCi0JdW5zaWduZWQgbG9uZyBtaW4sCi0JaW50IHJlc25vKQotewotCXVuc2lnbmVkIGludCB0eXBlX21hc2s7Ci0JaW50IGk7Ci0KLQl0eXBlX21hc2sgPSBJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU07Ci0JZm9yIChpID0gMCA7IGkgPCA0OyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyID0gYnVzLT5yZXNvdXJjZVtpXTsKLQkJaWYgKCFyKQotCQkJY29udGludWU7Ci0KLQkJLyogdHlwZV9tYXNrIG11c3QgbWF0Y2ggKi8KLQkJaWYgKChyZXMtPmZsYWdzIF4gci0+ZmxhZ3MpICYgdHlwZV9tYXNrKQotCQkJY29udGludWU7Ci0KLQkJLyogT2ssIHRyeSBpdCBvdXQuLiAqLwotCQlpZiAoYWxsb2NhdGVfcmVzb3VyY2UociwgcmVzLCBzaXplLCBtaW4sIC0xLCBzaXplLCBOVUxMLCBOVUxMKSA8IDApCi0JCQljb250aW51ZTsKLQotCQkvKiBQQ0kgY29uZmlnIHNwYWNlIHVwZGF0ZWQgYnkgY2FsbGVyLiAgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUJVU1k7Ci19Ci0KLWludCBwY2lfYXNzaWduX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzb3VyY2UpCi17Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0Jc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcGNwLT5wYm07Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSAmcGRldi0+cmVzb3VyY2VbcmVzb3VyY2VdOwotCXVuc2lnbmVkIGxvbmcgbWluLCBzaXplOwotCWludCBlcnI7Ci0KLQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCW1pbiA9IHBibS0+aW9fc3BhY2Uuc3RhcnQgKyAweDQwMFVMOwotCWVsc2UKLQkJbWluID0gcGJtLT5tZW1fc3BhY2Uuc3RhcnQ7Ci0KLQlzaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKLQotCWVyciA9IHBjaV9hc3NpZ25fYnVzX3Jlc291cmNlKHBkZXYtPmJ1cywgcGRldiwgcmVzLCBzaXplLCBtaW4sIHJlc291cmNlKTsKLQotCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50aygiUENJOiBGYWlsZWQgdG8gYWxsb2NhdGUgcmVzb3VyY2UgJWQgZm9yICVzXG4iLAotCQkgICAgICAgcmVzb3VyY2UsIHBjaV9uYW1lKHBkZXYpKTsKLQl9IGVsc2UgewotCQkvKiBVcGRhdGUgUENJIGNvbmZpZyBzcGFjZS4gKi8KLQkJcGJtLT5wYXJlbnQtPmJhc2VfYWRkcmVzc191cGRhdGUocGRldiwgcmVzb3VyY2UpOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qIFNvcnQgcmVzb3VyY2VzIGJ5IGFsaWdubWVudCAqLwotdm9pZCBwZGV2X3NvcnRfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZV9saXN0ICpoZWFkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyOwotCQlzdHJ1Y3QgcmVzb3VyY2VfbGlzdCAqbGlzdCwgKnRtcDsKLQkJdW5zaWduZWQgbG9uZyByX2FsaWduOwotCi0JCXIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQkJcl9hbGlnbiA9IHItPmVuZCAtIHItPnN0YXJ0OwotCQkKLQkJaWYgKCEoci0+ZmxhZ3MpIHx8IHItPnBhcmVudCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIXJfYWxpZ24pIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogSWdub3JlIGJvZ3VzIHJlc291cmNlICVkICIKLQkJCQkJICAgICJbJWx4OiVseF0gb2YgJXNcbiIsCi0JCQkJCSAgICBpLCByLT5zdGFydCwgci0+ZW5kLCBwY2lfbmFtZShkZXYpKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXJfYWxpZ24gPSAoaSA8IFBDSV9CUklER0VfUkVTT1VSQ0VTKSA/IHJfYWxpZ24gKyAxIDogci0+c3RhcnQ7Ci0JCWZvciAobGlzdCA9IGhlYWQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKLQkJCXVuc2lnbmVkIGxvbmcgYWxpZ24gPSAwOwotCQkJc3RydWN0IHJlc291cmNlX2xpc3QgKmxuID0gbGlzdC0+bmV4dDsKLQkJCWludCBpZHg7Ci0KLQkJCWlmIChsbikgewotCQkJCWlkeCA9IGxuLT5yZXMgLSAmbG4tPmRldi0+cmVzb3VyY2VbMF07Ci0JCQkJYWxpZ24gPSAoaWR4IDwgUENJX0JSSURHRV9SRVNPVVJDRVMpID8KLQkJCQkJbG4tPnJlcy0+ZW5kIC0gbG4tPnJlcy0+c3RhcnQgKyAxIDoKLQkJCQkJbG4tPnJlcy0+c3RhcnQ7Ci0JCQl9Ci0JCQlpZiAocl9hbGlnbiA+IGFsaWduKSB7Ci0JCQkJdG1wID0ga21hbGxvYyhzaXplb2YoKnRtcCksIEdGUF9LRVJORUwpOwotCQkJCWlmICghdG1wKQotCQkJCQlwYW5pYygicGRldl9zb3J0X3Jlc291cmNlcygpOiAiCi0JCQkJCSAgICAgICJrbWFsbG9jKCkgZmFpbGVkIVxuIik7Ci0JCQkJdG1wLT5uZXh0ID0gbG47Ci0JCQkJdG1wLT5yZXMgPSByOwotCQkJCXRtcC0+ZGV2ID0gZGV2OwotCQkJCWxpc3QtPm5leHQgPSB0bXA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9CisJcmV0dXJuIHJvb3Q7CiB9CiAKIHZvaWQgcGNpYmlvc191cGRhdGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaXJxKQpAQCAtNzM2LDggKzYxOSw3IEBACiBzdGF0aWMgdm9pZCBfX3BjaV9tbWFwX3NldF9wZ3Byb3Qoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCSAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlKQogewotCS8qIE91ciBpb19yZW1hcF9wYWdlX3JhbmdlL2lvX3JlbWFwX3Bmbl9yYW5nZSB0YWtlcyBjYXJlIG9mIHRoaXMsCi0JICAgZG8gbm90aGluZy4gKi8KKwkvKiBPdXIgaW9fcmVtYXBfcGZuX3JhbmdlIHRha2VzIGNhcmUgb2YgdGhpcywgZG8gbm90aGluZy4gICovCiB9CiAKIC8qIFBlcmZvcm0gdGhlIGFjdHVhbCByZW1hcCBvZiB0aGUgcGFnZXMgZm9yIGEgUENJIGRldmljZSBtYXBwaW5nLCBhcyBhcHByb3ByaWF0ZQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfcHN5Y2hvLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYwppbmRleCA5MWFiNDY2Li42ZWQxZWYyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAvKjB4MzIqLzE1LAkJLyogUG93ZXIgTWFuYWdlbWVudAkJKi8KIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBzeWNob19pbm9fdG9fcGlsKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgaW5vKQorc3RhdGljIGludCBwc3ljaG9faW5vX3RvX3BpbChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IGlubykKIHsKIAlpbnQgcmV0OwogCkBAIC0zNDQsOSArMzQ0LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBwc3ljaG9faXJxX2J1aWxkKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCQkJICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCQkgICAgdW5zaWduZWQgaW50IGlubykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHN5Y2hvX2lycV9idWlsZChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCisJCQkJICAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBpbm8pCiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldDsKIAl1bnNpZ25lZCBsb25nIGltYXAsIGljbHI7CkBAIC0xMDI0LDcgKzEwMjQsNyBAQAogI2RlZmluZSBQU1lDSE9fQ0VfSU5PCQkweDJmCiAjZGVmaW5lIFBTWUNIT19QQ0lFUlJfQV9JTk8JMHgzMAogI2RlZmluZSBQU1lDSE9fUENJRVJSX0JfSU5PCTB4MzEKLXN0YXRpYyB2b2lkIF9faW5pdCBwc3ljaG9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCitzdGF0aWMgdm9pZCBwc3ljaG9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCiB7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gJnAtPnBibV9BOyAvKiBhcmJpdHJhcnkgKi8KIAl1bnNpZ25lZCBsb25nIGJhc2UgPSBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3M7CkBAIC0xMDkxLDE1ICsxMDkxLDE1IEBACiB9CiAKIC8qIFBTWUNITyBib290IHRpbWUgcHJvYmluZyBhbmQgaW5pdGlhbGl6YXRpb24uICovCi1zdGF0aWMgdm9pZCBfX2luaXQgcHN5Y2hvX3Jlc291cmNlX2FkanVzdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKLQkJCQkJICBzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QpCitzdGF0aWMgdm9pZCBwc3ljaG9fcmVzb3VyY2VfYWRqdXN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJCSAgIHN0cnVjdCByZXNvdXJjZSAqcm9vdCkKIHsKIAlyZXMtPnN0YXJ0ICs9IHJvb3QtPnN0YXJ0OwogCXJlcy0+ZW5kICs9IHJvb3QtPnN0YXJ0OwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcHN5Y2hvX2Jhc2VfYWRkcmVzc191cGRhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCByZXNvdXJjZSkKK3N0YXRpYyB2b2lkIHBzeWNob19iYXNlX2FkZHJlc3NfdXBkYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzb3VyY2UpCiB7CiAJc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcGNwLT5wYm07CkBAIC0xMTQ0LDcgKzExNDQsNyBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHdoZXJlICsgNCwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwYm1fY29uZmlnX2J1c21hc3RlcmluZyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCitzdGF0aWMgdm9pZCBwYm1fY29uZmlnX2J1c21hc3RlcmluZyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7CiAJdTggKmFkZHI7CiAKQEAgLTExNjEsOCArMTE2MSw4IEBACiAJcGNpX2NvbmZpZ193cml0ZTgoYWRkciwgNjQpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcGJtX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKK3N0YXRpYyB2b2lkIHBibV9zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKKwkJCSBzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7CiAJc3RydWN0IHBjaWRldl9jb29raWUgKmNvb2tpZSA9IGttYWxsb2Moc2l6ZW9mKCpjb29raWUpLCBHRlBfS0VSTkVMKTsKIApAQCAtMTE4OSw3ICsxMTg5LDcgQEAKIAlwY2lfc2V0dXBfYnVzbWFzdGVyaW5nKHBibSwgcGJtLT5wY2lfYnVzKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHBzeWNob19zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCkKK3N0YXRpYyB2b2lkIHBzeWNob19zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCkKIHsKIAlwYm1fY29uZmlnX2J1c21hc3RlcmluZygmcC0+cGJtX0IpOwogCXAtPnBibV9CLmlzXzY2bWh6X2NhcGFibGUgPSAwOwpAQCAtMTIwNCw3ICsxMjA0LDcgQEAKIAlwc3ljaG9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMocCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwc3ljaG9faW9tbXVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCkKK3N0YXRpYyB2b2lkIHBzeWNob19pb21tdV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQogewogCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11ID0gcC0+cGJtX0EuaW9tbXU7CiAJdW5zaWduZWQgbG9uZyB0c2JiYXNlLCBpOwpAQCAtMTMyNyw4ICsxMzI3LDggQEAKIAlwc3ljaG9fd3JpdGUocC0+cGJtX0EuY29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX1BDSUJfRElBRywgdG1wKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHBibV9yZWdpc3Rlcl90b3BsZXZlbF9yZXNvdXJjZXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCi0JCQkJCQkgICBzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCitzdGF0aWMgdm9pZCBwYm1fcmVnaXN0ZXJfdG9wbGV2ZWxfcmVzb3VyY2VzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAorCQkJCQkgICAgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewogCWNoYXIgKm5hbWUgPSBwYm0tPm5hbWU7CiAKQEAgLTE0ODEsNyArMTQ4MSw3IEBACiAKICNkZWZpbmUgUFNZQ0hPX0NPTkZJR1NQQUNFCTB4MDAxMDAwMDAwVUwKIAotdm9pZCBfX2luaXQgcHN5Y2hvX2luaXQoaW50IG5vZGUsIGNoYXIgKm1vZGVsX25hbWUpCit2b2lkIHBzeWNob19pbml0KGludCBub2RlLCBjaGFyICptb2RlbF9uYW1lKQogewogCXN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzIHByX3JlZ3NbM107CiAJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnA7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYwppbmRleCA1MmJmMzQzLi4wZWU2YmQ1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMKQEAgLTU1NCw3ICs1NTQsNyBAQAogLyoweDMyKi8xNSwJCS8qIFBvd2VyIE1hbmFnZW1lbnQJCSovCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBzYWJyZV9pbm9fdG9fcGlsKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgaW5vKQorc3RhdGljIGludCBzYWJyZV9pbm9fdG9fcGlsKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgaW5vKQogewogCWludCByZXQ7CiAKQEAgLTYxMiw5ICs2MTIsOSBAQAogCXNhYnJlX3JlYWQoc3luY19yZWcpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBzYWJyZV9pcnFfYnVpbGQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAotCQkJCQkgICBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJICAgdW5zaWduZWQgaW50IGlubykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2FicmVfaXJxX2J1aWxkKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKKwkJCQkgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIHVuc2lnbmVkIGludCBpbm8pCiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldDsKIAl1bnNpZ25lZCBsb25nIGltYXAsIGljbHI7CkBAIC0xMDA5LDcgKzEwMDksNyBAQAogI2RlZmluZSBTQUJSRV9VRV9JTk8JCTB4MmUKICNkZWZpbmUgU0FCUkVfQ0VfSU5PCQkweDJmCiAjZGVmaW5lIFNBQlJFX1BDSUVSUl9JTk8JMHgzMAotc3RhdGljIHZvaWQgX19pbml0IHNhYnJlX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQorc3RhdGljIHZvaWQgc2FicmVfcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCiB7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gJnAtPnBibV9BOyAvKiBhcmJpdHJhcnkgKi8KIAl1bnNpZ25lZCBsb25nIGJhc2UgPSBwYm0tPmNvbnRyb2xsZXJfcmVnczsKQEAgLTEwNTYsOSArMTA1Niw5IEBACiAJc2FicmVfd3JpdGUoYmFzZSArIFNBQlJFX1BDSUNUUkwsIHRtcCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzYWJyZV9yZXNvdXJjZV9hZGp1c3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJCSBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKLQkJCQkJIHN0cnVjdCByZXNvdXJjZSAqcm9vdCkKK3N0YXRpYyB2b2lkIHNhYnJlX3Jlc291cmNlX2FkanVzdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJCSAgc3RydWN0IHJlc291cmNlICpyb290KQogewogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IHBkZXYtPmJ1cy0+c3lzZGF0YTsKIAl1bnNpZ25lZCBsb25nIGJhc2U7CkBAIC0xMDcyLDcgKzEwNzIsNyBAQAogCXJlcy0+ZW5kICs9IGJhc2U7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzYWJyZV9iYXNlX2FkZHJlc3NfdXBkYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzb3VyY2UpCitzdGF0aWMgdm9pZCBzYWJyZV9iYXNlX2FkZHJlc3NfdXBkYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzb3VyY2UpCiB7CiAJc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcGNwLT5wYm07CkBAIC0xMTE4LDcgKzExMTgsNyBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHdoZXJlICsgNCwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBhcGJfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwgc3RydWN0IHBjaV9idXMgKnNhYnJlX2J1cykKK3N0YXRpYyB2b2lkIGFwYl9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLCBzdHJ1Y3QgcGNpX2J1cyAqc2FicmVfYnVzKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCkBAIC0xMTgxLDcgKzExODEsNyBAQAogCXJldHVybiBjb29raWU7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzYWJyZV9zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCkKK3N0YXRpYyB2b2lkIHNhYnJlX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQogewogCXN0YXRpYyBpbnQgb25jZTsKIAlzdHJ1Y3QgcGNpX2J1cyAqc2FicmVfYnVzLCAqcGJ1czsKQEAgLTEyNjIsOSArMTI2Miw5IEBACiAJc2FicmVfcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMocCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzYWJyZV9pb21tdV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJCSAgICBpbnQgdHNic2l6ZSwgdW5zaWduZWQgbG9uZyBkdm1hX29mZnNldCwKLQkJCQkgICAgdTMyIGRtYV9tYXNrKQorc3RhdGljIHZvaWQgc2FicmVfaW9tbXVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKKwkJCSAgICAgaW50IHRzYnNpemUsIHVuc2lnbmVkIGxvbmcgZHZtYV9vZmZzZXQsCisJCQkgICAgIHUzMiBkbWFfbWFzaykKIHsKIAlzdHJ1Y3QgcGNpX2lvbW11ICppb21tdSA9IHAtPnBibV9BLmlvbW11OwogCXVuc2lnbmVkIGxvbmcgdHNiYmFzZSwgaSwgb3JkZXI7CkBAIC0xMzQ1LDggKzEzNDUsOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHBibV9yZWdpc3Rlcl90b3BsZXZlbF9yZXNvdXJjZXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCi0JCQkJCQkgICBzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCitzdGF0aWMgdm9pZCBwYm1fcmVnaXN0ZXJfdG9wbGV2ZWxfcmVzb3VyY2VzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAorCQkJCQkgICAgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewogCWNoYXIgKm5hbWUgPSBwYm0tPm5hbWU7CiAJdW5zaWduZWQgbG9uZyBpYmFzZSA9IHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX0lPU1BBQ0U7CkBAIC0xNDE1LDcgKzE0MTUsNyBAQAogCQkJCQkgICAgJnBibS0+bWVtX3NwYWNlKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHNhYnJlX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLCBpbnQgc2FicmVfbm9kZSwgdTMyIGRtYV9iZWdpbikKK3N0YXRpYyB2b2lkIHNhYnJlX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLCBpbnQgc2FicmVfbm9kZSwgdTMyIGRtYV9iZWdpbikKIHsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CiAJY2hhciBuYW1lYnVmWzEyOF07CkBAIC0xNTUyLDcgKzE1NTIsNyBAQAogCX0KIH0KIAotdm9pZCBfX2luaXQgc2FicmVfaW5pdChpbnQgcG5vZGUsIGNoYXIgKm1vZGVsX25hbWUpCit2b2lkIHNhYnJlX2luaXQoaW50IHBub2RlLCBjaGFyICptb2RlbF9uYW1lKQogewogCXN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzIHByX3JlZ3NbMl07CiAJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnA7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCmluZGV4IDZhMTgyYmIuLjMzMTM4MmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCkBAIC0yODUsNyArMjg1LDcgQEAKIC8qMHgzZiovMCwJCS8qIFJlc2VydmVkIGZvciBOZXdMaW5rCQkqLwogfTsKIAotc3RhdGljIGludCBfX2luaXQgc2NoaXpvX2lub190b19waWwoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVuc2lnbmVkIGludCBpbm8pCitzdGF0aWMgaW50IHNjaGl6b19pbm9fdG9fcGlsKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgaW5vKQogewogCWludCByZXQ7CiAKQEAgLTEyMjEsNyArMTIyMSw3IEBACiAgKiBQQ0kgYnVzIHVuaXRzIG9mIHRoZSBzYW1lIFRvbWF0aWxsby4gIEkgc3RpbGwgaGF2ZSBub3QgcmVhbGx5CiAgKiBmaWd1cmVkIHRoaXMgb3V0Li4uCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCB0b21hdGlsbG9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCitzdGF0aWMgdm9pZCB0b21hdGlsbG9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCiB7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOwogCXVuc2lnbmVkIGludCBpcnE7CkBAIC0xMzU5LDcgKzEzNTksNyBAQAogCQkgICAgIChTQ0hJWk9fU0FGSVJRQ1RSTF9FTiB8IChCVVNfRVJST1JfVU5NQVApKSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzY2hpem9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCitzdGF0aWMgdm9pZCBzY2hpem9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCiB7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOwogCXVuc2lnbmVkIGludCBpcnE7CkBAIC0xNTA1LDcgKzE1MDUsNyBAQAogCQkgICAgIChTQ0hJWk9fU0FGSVJRQ1RSTF9FTiB8IChCVVNfRVJST1JfVU5NQVApKSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwYm1fY29uZmlnX2J1c21hc3RlcmluZyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCitzdGF0aWMgdm9pZCBwYm1fY29uZmlnX2J1c21hc3RlcmluZyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7CiAJdTggKmFkZHI7CiAKQEAgLTE1MjIsOCArMTUyMiw4IEBACiAJcGNpX2NvbmZpZ193cml0ZTgoYWRkciwgNjQpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcGJtX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKK3N0YXRpYyB2b2lkIHBibV9zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKKwkJCSBzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7CiAJc3RydWN0IHBjaWRldl9jb29raWUgKmNvb2tpZSA9IGttYWxsb2Moc2l6ZW9mKCpjb29raWUpLCBHRlBfS0VSTkVMKTsKIApAQCAtMTU1MCw4ICsxNTUwLDggQEAKIAlwY2lfc2V0dXBfYnVzbWFzdGVyaW5nKHBibSwgcGJtLT5wY2lfYnVzKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IF9fc2NoaXpvX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJCSAgICAgaW50IGNoaXBfdHlwZSkKK3N0YXRpYyB2b2lkIF9fc2NoaXpvX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAorCQkJICAgICAgaW50IGNoaXBfdHlwZSkKIHsKIAlpZiAoIXAtPnBibV9CLnByb21fbm9kZSB8fCAhcC0+cGJtX0EucHJvbV9ub2RlKSB7CiAJCXByaW50aygiUENJOiBPbmx5IG9uZSBQQ0kgYnVzIG1vZHVsZSBvZiBjb250cm9sbGVyIGZvdW5kLlxuIik7CkBAIC0xNTc3LDE3ICsxNTc3LDE3IEBACiAJCXNjaGl6b19yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHNjaGl6b19zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCkKK3N0YXRpYyB2b2lkIHNjaGl6b19zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCkKIHsKIAlfX3NjaGl6b19zY2FuX2J1cyhwLCBQQk1fQ0hJUF9UWVBFX1NDSElaTyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCB0b21hdGlsbG9fc2Nhbl9idXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCitzdGF0aWMgdm9pZCB0b21hdGlsbG9fc2Nhbl9idXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCiB7CiAJX19zY2hpem9fc2Nhbl9idXMocCwgUEJNX0NISVBfVFlQRV9UT01BVElMTE8pOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2NoaXpvX2Jhc2VfYWRkcmVzc191cGRhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCByZXNvdXJjZSkKK3N0YXRpYyB2b2lkIHNjaGl6b19iYXNlX2FkZHJlc3NfdXBkYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzb3VyY2UpCiB7CiAJc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcGNwLT5wYm07CkBAIC0xNjMyLDkgKzE2MzIsOSBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHdoZXJlICsgNCwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzY2hpem9fcmVzb3VyY2VfYWRqdXN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcmVzLAotCQkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcm9vdCkKK3N0YXRpYyB2b2lkIHNjaGl6b19yZXNvdXJjZV9hZGp1c3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkJICAgc3RydWN0IHJlc291cmNlICpyb290KQogewogCXJlcy0+c3RhcnQgKz0gcm9vdC0+c3RhcnQ7CiAJcmVzLT5lbmQgKz0gcm9vdC0+c3RhcnQ7CkBAIC0xNzAyLDggKzE3MDIsOCBAQAogCSAgICAgICBwYm0tPm1lbV9zcGFjZS5zdGFydCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwYm1fcmVnaXN0ZXJfdG9wbGV2ZWxfcmVzb3VyY2VzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJCQkJICAgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQorc3RhdGljIHZvaWQgcGJtX3JlZ2lzdGVyX3RvcGxldmVsX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKKwkJCQkJICAgIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKIAlwYm0tPmlvX3NwYWNlLm5hbWUgPSBwYm0tPm1lbV9zcGFjZS5uYW1lID0gcGJtLT5uYW1lOwogCkBAIC0xOTMyLDcgKzE5MzIsNyBAQAogI2RlZmluZSBUT01BVElMTE9fUENJX0lPQ19URElBRwkJKDB4MjI1MFVMKQogI2RlZmluZSBUT01BVElMTE9fUENJX0lPQ19ERElBRwkJKDB4MjI5MFVMKQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2NoaXpvX3BibV9od19pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKK3N0YXRpYyB2b2lkIHNjaGl6b19wYm1faHdfaW5pdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7CiAJdTY0IHRtcDsKIApAQCAtMTk4Niw5ICsxOTg2LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzY2hpem9fcGJtX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCi0JCQkJICAgaW50IHByb21fbm9kZSwgdTMyIHBvcnRpZCwKLQkJCQkgICBpbnQgY2hpcF90eXBlKQorc3RhdGljIHZvaWQgc2NoaXpvX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAorCQkJICAgIGludCBwcm9tX25vZGUsIHUzMiBwb3J0aWQsCisJCQkgICAgaW50IGNoaXBfdHlwZSkKIHsKIAlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyBwcl9yZWdzWzRdOwogCXVuc2lnbmVkIGludCBidXNyYW5nZVsyXTsKQEAgLTIxNDUsNyArMjE0NSw3IEBACiAJcmV0dXJuICh4ID09IHkpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgX19zY2hpem9faW5pdChpbnQgbm9kZSwgY2hhciAqbW9kZWxfbmFtZSwgaW50IGNoaXBfdHlwZSkKK3N0YXRpYyB2b2lkIF9fc2NoaXpvX2luaXQoaW50IG5vZGUsIGNoYXIgKm1vZGVsX25hbWUsIGludCBjaGlwX3R5cGUpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnA7CiAJc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7CkBAIC0yMjEzLDE3ICsyMjEzLDE3IEBACiAJc2NoaXpvX3BibV9pbml0KHAsIG5vZGUsIHBvcnRpZCwgY2hpcF90eXBlKTsKIH0KIAotdm9pZCBfX2luaXQgc2NoaXpvX2luaXQoaW50IG5vZGUsIGNoYXIgKm1vZGVsX25hbWUpCit2b2lkIHNjaGl6b19pbml0KGludCBub2RlLCBjaGFyICptb2RlbF9uYW1lKQogewogCV9fc2NoaXpvX2luaXQobm9kZSwgbW9kZWxfbmFtZSwgUEJNX0NISVBfVFlQRV9TQ0hJWk8pOwogfQogCi12b2lkIF9faW5pdCBzY2hpem9fcGx1c19pbml0KGludCBub2RlLCBjaGFyICptb2RlbF9uYW1lKQordm9pZCBzY2hpem9fcGx1c19pbml0KGludCBub2RlLCBjaGFyICptb2RlbF9uYW1lKQogewogCV9fc2NoaXpvX2luaXQobm9kZSwgbW9kZWxfbmFtZSwgUEJNX0NISVBfVFlQRV9TQ0hJWk9fUExVUyk7CiB9CiAKLXZvaWQgX19pbml0IHRvbWF0aWxsb19pbml0KGludCBub2RlLCBjaGFyICptb2RlbF9uYW1lKQordm9pZCB0b21hdGlsbG9faW5pdChpbnQgbm9kZSwgY2hhciAqbW9kZWxfbmFtZSkKIHsKIAlfX3NjaGl6b19pbml0KG5vZGUsIG1vZGVsX25hbWUsIFBCTV9DSElQX1RZUEVfVE9NQVRJTExPKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNjYyNTU0My4uN2QxMGIwMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTYwNywxMSArNjA3LDYgQEAKIAlzdHJ1Y3QgdGhyZWFkX2luZm8gKnQgPSBwLT50aHJlYWRfaW5mbzsKIAljaGFyICpjaGlsZF90cmFwX2ZyYW1lOwogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JcC0+dGhyZWFkLnNtcF9sb2NrX2NvdW50ID0gMDsKLQlwLT50aHJlYWQuc21wX2xvY2tfcGMgPSAwOwotI2VuZGlmCi0KIAkvKiBDYWxjdWxhdGUgb2Zmc2V0IHRvIHN0YWNrX2ZyYW1lICYgcHRfcmVncyAqLwogCWNoaWxkX3RyYXBfZnJhbWUgPSAoKGNoYXIgKil0KSArIChUSFJFQURfU0laRSAtIChUUkFDRVJFR19TWitTVEFDS0ZSQU1FX1NaKSk7CiAJbWVtY3B5KGNoaWxkX3RyYXBfZnJhbWUsICgoKHN0cnVjdCBzcGFyY19zdGFja2YgKilyZWdzKS0xKSwgKFRSQUNFUkVHX1NaK1NUQUNLRlJBTUVfU1opKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcnRyYXAuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcnRyYXAuUwppbmRleCAwNjk2ZWQ0Li5mYWZkMjI3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3J0cmFwLlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9ydHJhcC5TCkBAIC0xNTMsMTEgKzE1MywxNCBAQAogcnRyYXBfaXJxOgogcnRyYXBfY2xyX2w2OgljbHIJCQklbDYKIHJ0cmFwOgotCQlsZHViCQkJWyVnNiArIFRJX0NQVV0sICVsMAotCQlzZXRoaQkJCSVoaShpcnFfc3RhdCksICVsMgkhICZzb2Z0aXJxX2FjdGl2ZQotCQlvcgkJCSVsMiwgJWxvKGlycV9zdGF0KSwgJWwyCSEgJnNvZnRpcnFfYWN0aXZlCi1pcnFzel9wYXRjaG1lOglzbGx4CQkJJWwwLCAwLCAlbDAKLQkJbGR1dwkJCVslbDIgKyAlbDBdLCAlbDEJISBzb2Z0aXJxX3BlbmRpbmcKKyNpZm5kZWYgQ09ORklHX1NNUAorCQlzZXRoaQkJCSVoaShwZXJfY3B1X19fX2NwdV9kYXRhKSwgJWwwCisJCWxkdXcJCQlbJWwwICsgJWxvKHBlcl9jcHVfX19fY3B1X2RhdGEpXSwgJWwxCisjZWxzZQorCQlzZXRoaQkJCSVoaShwZXJfY3B1X19fX2NwdV9kYXRhKSwgJWwwCisJCW9yCQkJJWwwLCAlbG8ocGVyX2NwdV9fX19jcHVfZGF0YSksICVsMAorCQlsZHV3CQkJWyVsMCArICVnNV0sICVsMQorI2VuZGlmCiAJCWNtcAkJCSVsMSwgMAogCiAJCS8qIG1tL3VsdHJhLlM6eGNhbGxfcmVwb3J0X3JlZ3MgS05PV1MgYWJvdXQgdGhpcyBsb2FkLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGZiZGZlZDMuLmRkYmVkMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKQEAgLTUxMSwxOCArNTExLDYgQEAKIAljb25zd2l0Y2hwID0gJnByb21fY29uOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU01QCi0JaSA9ICh1bnNpZ25lZCBsb25nKSZpcnFfc3RhdFsxXSAtICh1bnNpZ25lZCBsb25nKSZpcnFfc3RhdFswXTsKLQlpZiAoKGkgPT0gU01QX0NBQ0hFX0JZVEVTKSB8fCAoaSA9PSAoMiAqIFNNUF9DQUNIRV9CWVRFUykpKSB7Ci0JCWV4dGVybiB1bnNpZ25lZCBpbnQgaXJxc3pfcGF0Y2htZVsxXTsKLQkJaXJxc3pfcGF0Y2htZVswXSB8PSAoKGkgPT0gU01QX0NBQ0hFX0JZVEVTKSA/IFNNUF9DQUNIRV9CWVRFU19TSElGVCA6IFwKLQkJCQkJCQlTTVBfQ0FDSEVfQllURVNfU0hJRlQgKyAxKTsKLQkJZmx1c2hpKChsb25nKSZpcnFzel9wYXRjaG1lWzBdKTsKLQl9IGVsc2UgewotCQlwcm9tX3ByaW50ZigiVW5leHBlY3RlZCBzaXplIG9mIGlycV9zdGF0W10gZWxlbWVudHNcbiIpOwotCQlwcm9tX2hhbHQoKTsKLQl9Ci0jZW5kaWYKIAkvKiBXb3JrIG91dCBpZiB3ZSBhcmUgc3RhcmZpcmUgZWFybHkgb24gKi8KIAljaGVja19pZl9zdGFyZmlyZSgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCmluZGV4IGEzZWE2OTcuLmNiYjVlNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCkBAIC04OCw4ICs4OCw2IEBACiBleHRlcm4gaW50IGNvbXBhdF9zeXNfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1MzIgYXJnKTsKIGV4dGVybiBpbnQgKCpoYW5kbGVfbWF0aGVtdSkoc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IGZwdXN0YXRlICopOwogZXh0ZXJuIGxvbmcgc3BhcmMzMl9vcGVuKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIGludCBmbGFncywgaW50IG1vZGUpOwotZXh0ZXJuIGludCBpb19yZW1hcF9wYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGZyb20sCi0JdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3QgcHJvdCwgaW50IHNwYWNlKTsKIGV4dGVybiBpbnQgaW9fcmVtYXBfcGZuX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGZyb20sCiAJdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3QgcHJvdCk7CiBleHRlcm4gdm9pZCAoKnByb21fcGFsZXR0ZSkoaW50KTsKQEAgLTExNywxNyArMTE1LDEyIEBACiAKIC8qIHVzZWQgYnkgdmFyaW91cyBkcml2ZXJzICovCiAjaWZkZWYgQ09ORklHX1NNUAotI2lmbmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKIC8qIE91dCBvZiBsaW5lIHJ3LWxvY2tpbmcgaW1wbGVtZW50YXRpb24uICovCiBFWFBPUlRfU1lNQk9MKF9fcmVhZF9sb2NrKTsKIEVYUE9SVF9TWU1CT0woX19yZWFkX3VubG9jayk7CiBFWFBPUlRfU1lNQk9MKF9fd3JpdGVfbG9jayk7CiBFWFBPUlRfU1lNQk9MKF9fd3JpdGVfdW5sb2NrKTsKIEVYUE9SVF9TWU1CT0woX193cml0ZV90cnlsb2NrKTsKLS8qIE91dCBvZiBsaW5lIHNwaW4tbG9ja2luZyBpbXBsZW1lbnRhdGlvbi4gKi8KLUVYUE9SVF9TWU1CT0woX3Jhd19zcGluX2xvY2spOwotRVhQT1JUX1NZTUJPTChfcmF3X3NwaW5fbG9ja19mbGFncyk7Ci0jZW5kaWYKIAogLyogSGFyZCBJUlEgbG9ja2luZyAqLwogRVhQT1JUX1NZTUJPTChzeW5jaHJvbml6ZV9pcnEpOwpAQCAtMjQ1LDcgKzIzOCw2IEBACiAjZW5kaWYKIAogLyogSS9PIGRldmljZSBtbWFwaW5nIG9uIFNwYXJjNjQuICovCi1FWFBPUlRfU1lNQk9MKGlvX3JlbWFwX3BhZ2VfcmFuZ2UpOwogRVhQT1JUX1NZTUJPTChpb19yZW1hcF9wZm5fcmFuZ2UpOwogCiAvKiBTb2xhcmlzL1N1bk9TIGJpbmFyeSBjb21wYXRpYmlsaXR5ICovCkBAIC00MDYsMTIgKzM5OCwzIEBACiBFWFBPUlRfU1lNQk9MKHhvcl92aXNfNSk7CiAKIEVYUE9SVF9TWU1CT0wocHJvbV9wYWxldHRlKTsKLQotLyogbWVtb3J5IGJhcnJpZXJzICovCi1FWFBPUlRfU1lNQk9MKG1iKTsKLUVYUE9SVF9TWU1CT0wocm1iKTsKLUVYUE9SVF9TWU1CT0wod21iKTsKLUVYUE9SVF9TWU1CT0wobWVtYmFyX3N0b3JlbG9hZCk7Ci1FWFBPUlRfU1lNQk9MKG1lbWJhcl9zdG9yZWxvYWRfc3RvcmVzdG9yZSk7Ci1FWFBPUlRfU1lNQk9MKG1lbWJhcl9zdG9yZWxvYWRfbG9hZGxvYWQpOwotRVhQT1JUX1NZTUJPTChtZW1iYXJfc3RvcmVzdG9yZV9sb2Fkc3RvcmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zdW5vc19pb2N0bDMyLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N1bm9zX2lvY3RsMzIuYwppbmRleCA4N2MxYWViLi43NjU0YjhhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N1bm9zX2lvY3RsMzIuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N1bm9zX2lvY3RsMzIuYwpAQCAtMTUyLDExICsxNTIsMTIgQEAKIAkJcmV0ID0gY29tcGF0X3N5c19pb2N0bChmZCwgU0lPQ0dJRkNPTkYsIGFyZyk7CiAJCWdvdG8gb3V0OwogCi0JY2FzZSBfSU9XKCdpJywgMjEsIHN0cnVjdCBpZnJlcSk6IC8qIFNJT0NTSUZNVFUgKi8KLQkJcmV0ID0gc3lzX2lvY3RsKGZkLCBTSU9DU0lGTVRVLCBhcmcpOworCWNhc2UgX0lPVygnaScsIDIxLCBzdHJ1Y3QgaWZyZXEzMik6CisJCXJldCA9IGNvbXBhdF9zeXNfaW9jdGwoZmQsIFNJT0NTSUZNVFUsIGFyZyk7CiAJCWdvdG8gb3V0OwotCWNhc2UgX0lPV1IoJ2knLCAyMiwgc3RydWN0IGlmcmVxKTogLyogU0lPQ0dJRk1UVSAqLwotCQlyZXQgPSBzeXNfaW9jdGwoZmQsIFNJT0NHSUZNVFUsIGFyZyk7CisKKwljYXNlIF9JT1dSKCdpJywgMjIsIHN0cnVjdCBpZnJlcTMyKToKKwkJcmV0ID0gY29tcGF0X3N5c19pb2N0bChmZCwgU0lPQ0dJRk1UVSwgYXJnKTsKIAkJZ290byBvdXQ7CiAKIAljYXNlIF9JT1dSKCdpJywgMjMsIHN0cnVjdCBpZnJlcTMyKToKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjMzIuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjMzIuYwppbmRleCAxZDNhYTU4Li43ZjYyMzllIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c19zcGFyYzMyLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMzMi5jCkBAIC0xMDAyLDI5ICsxMDAyLDcgQEAKIGFzbWxpbmthZ2UgbG9uZyBzcGFyYzMyX29wZW4oY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLAogCQkJICAgICBpbnQgZmxhZ3MsIGludCBtb2RlKQogewotCWNoYXIgKiB0bXA7Ci0JaW50IGZkLCBlcnJvcjsKLQotCXRtcCA9IGdldG5hbWUoZmlsZW5hbWUpOwotCWZkID0gUFRSX0VSUih0bXApOwotCWlmICghSVNfRVJSKHRtcCkpIHsKLQkJZmQgPSBnZXRfdW51c2VkX2ZkKCk7Ci0JCWlmIChmZCA+PSAwKSB7Ci0JCQlzdHJ1Y3QgZmlsZSAqIGYgPSBmaWxwX29wZW4odG1wLCBmbGFncywgbW9kZSk7Ci0JCQllcnJvciA9IFBUUl9FUlIoZik7Ci0JCQlpZiAoSVNfRVJSKGYpKQotCQkJCWdvdG8gb3V0X2Vycm9yOwotCQkJZmRfaW5zdGFsbChmZCwgZik7Ci0JCX0KLW91dDoKLQkJcHV0bmFtZSh0bXApOwotCX0KLQlyZXR1cm4gZmQ7Ci0KLW91dF9lcnJvcjoKLQlwdXRfdW51c2VkX2ZkKGZkKTsKLQlmZCA9IGVycm9yOwotCWdvdG8gb3V0OworCXJldHVybiBkb19zeXNfb3BlbihmaWxlbmFtZSwgZmxhZ3MsIG1vZGUpOwogfQogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBkb19tcmVtYXAodW5zaWduZWQgbG9uZyBhZGRyLApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYwppbmRleCAzNjJiOWMyLi4zZjA4YTMyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJc3RhdGljIGxvbmcgbGFzdF9ydGNfdXBkYXRlOwogCiAJLyogRGV0ZXJtaW5lIHdoZW4gdG8gdXBkYXRlIHRoZSBNb3N0ZWsgY2xvY2suICovCi0JaWYgKCh0aW1lX3N0YXR1cyAmIFNUQV9VTlNZTkMpID09IDAgJiYKKwlpZiAobnRwX3N5bmNlZCgpICYmCiAJICAgIHh0aW1lLnR2X3NlYyA+IGxhc3RfcnRjX3VwZGF0ZSArIDY2MCAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApID49IDUwMDAwMCAtICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPD0gNTAwMDAwICsgKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA5NTA0MjNkLi5mNDdkMGJlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xNyw2ICsxNyw3IEBACiAgICAgKigudGV4dCkKICAgICBTQ0hFRF9URVhUCiAgICAgTE9DS19URVhUCisgICAgS1BST0JFU19URVhUCiAgICAgKiguZ251Lndhcm5pbmcpCiAgIH0gPTAKICAgX2V0ZXh0ID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvTWFrZWZpbGUgYi9hcmNoL3NwYXJjNjQvbGliL01ha2VmaWxlCmluZGV4IDYyMDFmMTAuLmQ5NjhhZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYzY0L2xpYi9NYWtlZmlsZQpAQCAtMTIsOSArMTIsOCBAQAogCSBVMW1lbWNweS5vIFUxY29weV9mcm9tX3VzZXIubyBVMWNvcHlfdG9fdXNlci5vIFwKIAkgVTNtZW1jcHkubyBVM2NvcHlfZnJvbV91c2VyLm8gVTNjb3B5X3RvX3VzZXIubyBVM3BhdGNoLm8gXAogCSBjb3B5X2luX3VzZXIubyB1c2VyX2ZpeHVwLm8gbWVtbW92ZS5vIFwKLQkgbWNvdW50Lm8gaXBjc3VtLm8gcndzZW0ubyB4b3IubyBmaW5kX2JpdC5vIGRlbGF5Lm8gbWIubworCSBtY291bnQubyBpcGNzdW0ubyByd3NlbS5vIHhvci5vIGZpbmRfYml0Lm8gZGVsYXkubwogCi1saWItJChDT05GSUdfREVCVUdfU1BJTkxPQ0spICs9IGRlYnVnbG9ja3MubwogbGliLSQoQ09ORklHX0hBVkVfREVDX0xPQ0spICs9IGRlY19hbmRfbG9jay5vCiAKIG9iai15ICs9IGlvbWFwLm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvUGVlQ2VlSS5jIGIvYXJjaC9zcGFyYzY0L2xpYi9QZWVDZWVJLmMKaW5kZXggMzAwOGQ1My4uM2M2Y2ZiYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2xpYi9QZWVDZWVJLmMKKysrIGIvYXJjaC9zcGFyYzY0L2xpYi9QZWVDZWVJLmMKQEAgLTcsMjggKzcsMzEgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKLXZvaWQgb3V0c2Iodm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCit2b2lkIG91dHNiKHVuc2lnbmVkIGxvbmcgX19hZGRyLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CisJdm9pZCBfX2lvbWVtICphZGRyID0gKHZvaWQgX19pb21lbSAqKSBfX2FkZHI7CiAJY29uc3QgdTggKnAgPSBzcmM7CiAKLQl3aGlsZShjb3VudC0tKQorCXdoaWxlIChjb3VudC0tKQogCQlvdXRiKCpwKyssIGFkZHIpOwogfQogCi12b2lkIG91dHN3KHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQordm9pZCBvdXRzdyh1bnNpZ25lZCBsb25nIF9fYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCWlmKGNvdW50KSB7CisJdm9pZCBfX2lvbWVtICphZGRyID0gKHZvaWQgX19pb21lbSAqKSBfX2FkZHI7CisKKwlpZiAoY291bnQpIHsKIAkJdTE2ICpwcyA9ICh1MTYgKilzcmM7CiAJCXUzMiAqcGk7CiAKLQkJaWYoKCh1NjQpc3JjKSAmIDB4MikgeworCQlpZiAoKCh1NjQpc3JjKSAmIDB4MikgewogCQkJdTE2IHZhbCA9IGxlMTZfdG9fY3B1cChwcyk7CiAJCQlvdXR3KHZhbCwgYWRkcik7CiAJCQlwcysrOwogCQkJY291bnQtLTsKIAkJfQogCQlwaSA9ICh1MzIgKilwczsKLQkJd2hpbGUoY291bnQgPj0gMikgeworCQl3aGlsZSAoY291bnQgPj0gMikgewogCQkJdTMyIHcgPSBsZTMyX3RvX2NwdXAocGkpOwogCiAJCQlwaSsrOwpAQCAtMzcsMTkgKzQwLDIxIEBACiAJCQljb3VudCAtPSAyOwogCQl9CiAJCXBzID0gKHUxNiAqKXBpOwotCQlpZihjb3VudCkgeworCQlpZiAoY291bnQpIHsKIAkJCXUxNiB2YWwgPSBsZTE2X3RvX2NwdXAocHMpOwogCQkJb3V0dyh2YWwsIGFkZHIpOwogCQl9CiAJfQogfQogCi12b2lkIG91dHNsKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQordm9pZCBvdXRzbCh1bnNpZ25lZCBsb25nIF9fYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCWlmKGNvdW50KSB7Ci0JCWlmKCgoKHU2NClzcmMpICYgMHgzKSA9PSAwKSB7CisJdm9pZCBfX2lvbWVtICphZGRyID0gKHZvaWQgX19pb21lbSAqKSBfX2FkZHI7CisKKwlpZiAoY291bnQpIHsKKwkJaWYgKCgoKHU2NClzcmMpICYgMHgzKSA9PSAwKSB7CiAJCQl1MzIgKnAgPSAodTMyICopc3JjOwotCQkJd2hpbGUoY291bnQtLSkgeworCQkJd2hpbGUgKGNvdW50LS0pIHsKIAkJCQl1MzIgdmFsID0gY3B1X3RvX2xlMzJwKHApOwogCQkJCW91dGwodmFsLCBhZGRyKTsKIAkJCQlwKys7CkBAIC02MCwxMyArNjUsMTMgQEAKIAkJCXUzMiBsID0gMCwgbDI7CiAJCQl1MzIgKnBpOwogCi0JCQlzd2l0Y2goKCh1NjQpc3JjKSAmIDB4MykgeworCQkJc3dpdGNoICgoKHU2NClzcmMpICYgMHgzKSB7CiAJCQljYXNlIDB4MjoKIAkJCQljb3VudCAtPSAxOwogCQkJCWwgPSBjcHVfdG9fbGUxNnAocHMpIDw8IDE2OwogCQkJCXBzKys7CiAJCQkJcGkgPSAodTMyICopcHM7Ci0JCQkJd2hpbGUoY291bnQtLSkgeworCQkJCXdoaWxlIChjb3VudC0tKSB7CiAJCQkJCWwyID0gY3B1X3RvX2xlMzJwKHBpKTsKIAkJCQkJcGkrKzsKIAkJCQkJb3V0bCgoKGwgPj4gMTYpIHwgKGwyIDw8IDE2KSksIGFkZHIpOwpAQCAtODYsNyArOTEsNyBAQAogCQkJCXBzKys7CiAJCQkJbCB8PSAobDIgPDwgMTYpOwogCQkJCXBpID0gKHUzMiAqKXBzOwotCQkJCXdoaWxlKGNvdW50LS0pIHsKKwkJCQl3aGlsZSAoY291bnQtLSkgewogCQkJCQlsMiA9IGNwdV90b19sZTMycChwaSk7CiAJCQkJCXBpKys7CiAJCQkJCW91dGwoKChsID4+IDgpIHwgKGwyIDw8IDI0KSksIGFkZHIpOwpAQCAtMTAxLDcgKzEwNiw3IEBACiAJCQkJcGIgPSAodTggKilzcmM7CiAJCQkJbCA9ICgqcGIrKyA8PCAyNCk7CiAJCQkJcGkgPSAodTMyICopcGI7Ci0JCQkJd2hpbGUoY291bnQtLSkgeworCQkJCXdoaWxlIChjb3VudC0tKSB7CiAJCQkJCWwyID0gY3B1X3RvX2xlMzJwKHBpKTsKIAkJCQkJcGkrKzsKIAkJCQkJb3V0bCgoKGwgPj4gMjQpIHwgKGwyIDw8IDgpKSwgYWRkcik7CkBAIC0xMTksMTYgKzEyNCwxOCBAQAogCX0KIH0KIAotdm9pZCBpbnNiKHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQordm9pZCBpbnNiKHVuc2lnbmVkIGxvbmcgX19hZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JaWYoY291bnQpIHsKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSAodm9pZCBfX2lvbWVtICopIF9fYWRkcjsKKworCWlmIChjb3VudCkgewogCQl1MzIgKnBpOwogCQl1OCAqcGIgPSBkc3Q7CiAKLQkJd2hpbGUoKCgodW5zaWduZWQgbG9uZylwYikgJiAweDMpICYmIGNvdW50LS0pCisJCXdoaWxlICgoKCh1bnNpZ25lZCBsb25nKXBiKSAmIDB4MykgJiYgY291bnQtLSkKIAkJCSpwYisrID0gaW5iKGFkZHIpOwogCQlwaSA9ICh1MzIgKilwYjsKLQkJd2hpbGUoY291bnQgPj0gNCkgeworCQl3aGlsZSAoY291bnQgPj0gNCkgewogCQkJdTMyIHc7CiAKIAkJCXcgID0gKGluYihhZGRyKSA8PCAyNCk7CkBAIC0xMzksMjMgKzE0NiwyNSBAQAogCQkJY291bnQgLT0gNDsKIAkJfQogCQlwYiA9ICh1OCAqKXBpOwotCQl3aGlsZShjb3VudC0tKQorCQl3aGlsZSAoY291bnQtLSkKIAkJCSpwYisrID0gaW5iKGFkZHIpOwogCX0KIH0KIAotdm9pZCBpbnN3KHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQordm9pZCBpbnN3KHVuc2lnbmVkIGxvbmcgX19hZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JaWYoY291bnQpIHsKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSAodm9pZCBfX2lvbWVtICopIF9fYWRkcjsKKworCWlmIChjb3VudCkgewogCQl1MTYgKnBzID0gZHN0OwogCQl1MzIgKnBpOwogCi0JCWlmKCgodW5zaWduZWQgbG9uZylwcykgJiAweDIpIHsKKwkJaWYgKCgodW5zaWduZWQgbG9uZylwcykgJiAweDIpIHsKIAkJCSpwcysrID0gbGUxNl90b19jcHUoaW53KGFkZHIpKTsKIAkJCWNvdW50LS07CiAJCX0KIAkJcGkgPSAodTMyICopcHM7Ci0JCXdoaWxlKGNvdW50ID49IDIpIHsKKwkJd2hpbGUgKGNvdW50ID49IDIpIHsKIAkJCXUzMiB3OwogCiAJCQl3ICA9IChsZTE2X3RvX2NwdShpbncoYWRkcikpIDw8IDE2KTsKQEAgLTE2NCwzMSArMTczLDMzIEBACiAJCQljb3VudCAtPSAyOwogCQl9CiAJCXBzID0gKHUxNiAqKXBpOwotCQlpZihjb3VudCkKKwkJaWYgKGNvdW50KQogCQkJKnBzID0gbGUxNl90b19jcHUoaW53KGFkZHIpKTsKIAl9CiB9CiAKLXZvaWQgaW5zbCh2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3ZvaWQgaW5zbCh1bnNpZ25lZCBsb25nIF9fYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCWlmKGNvdW50KSB7Ci0JCWlmKCgoKHVuc2lnbmVkIGxvbmcpZHN0KSAmIDB4MykgPT0gMCkgeworCXZvaWQgX19pb21lbSAqYWRkciA9ICh2b2lkIF9faW9tZW0gKikgX19hZGRyOworCisJaWYgKGNvdW50KSB7CisJCWlmICgoKCh1bnNpZ25lZCBsb25nKWRzdCkgJiAweDMpID09IDApIHsKIAkJCXUzMiAqcGkgPSBkc3Q7Ci0JCQl3aGlsZShjb3VudC0tKQorCQkJd2hpbGUgKGNvdW50LS0pCiAJCQkJKnBpKysgPSBsZTMyX3RvX2NwdShpbmwoYWRkcikpOwogCQl9IGVsc2UgewogCQkJdTMyIGwgPSAwLCBsMiwgKnBpOwogCQkJdTE2ICpwczsKIAkJCXU4ICpwYjsKIAotCQkJc3dpdGNoKCgodW5zaWduZWQgbG9uZylkc3QpICYgMykgeworCQkJc3dpdGNoICgoKHVuc2lnbmVkIGxvbmcpZHN0KSAmIDMpIHsKIAkJCWNhc2UgMHgyOgogCQkJCXBzID0gZHN0OwogCQkJCWNvdW50IC09IDE7CiAJCQkJbCA9IGxlMzJfdG9fY3B1KGlubChhZGRyKSk7CiAJCQkJKnBzKysgPSBsOwogCQkJCXBpID0gKHUzMiAqKXBzOwotCQkJCXdoaWxlKGNvdW50LS0pIHsKKwkJCQl3aGlsZSAoY291bnQtLSkgewogCQkJCQlsMiA9IGxlMzJfdG9fY3B1KGlubChhZGRyKSk7CiAJCQkJCSpwaSsrID0gKGwgPDwgMTYpIHwgKGwyID4+IDE2KTsKIAkJCQkJbCA9IGwyOwpAQCAtMjA1LDcgKzIxNiw3IEBACiAJCQkJcHMgPSAodTE2ICopcGI7CiAJCQkJKnBzKysgPSAoKGwgPj4gOCkgJiAweGZmZmYpOwogCQkJCXBpID0gKHUzMiAqKXBzOwotCQkJCXdoaWxlKGNvdW50LS0pIHsKKwkJCQl3aGlsZSAoY291bnQtLSkgewogCQkJCQlsMiA9IGxlMzJfdG9fY3B1KGlubChhZGRyKSk7CiAJCQkJCSpwaSsrID0gKGwgPDwgMjQpIHwgKGwyID4+IDgpOwogCQkJCQlsID0gbDI7CkBAIC0yMjAsNyArMjMxLDcgQEAKIAkJCQlsID0gbGUzMl90b19jcHUoaW5sKGFkZHIpKTsKIAkJCQkqcGIrKyA9IGwgPj4gMjQ7CiAJCQkJcGkgPSAodTMyICopcGI7Ci0JCQkJd2hpbGUoY291bnQtLSkgeworCQkJCXdoaWxlIChjb3VudC0tKSB7CiAJCQkJCWwyID0gbGUzMl90b19jcHUoaW5sKGFkZHIpKTsKIAkJCQkJKnBpKysgPSAobCA8PCA4KSB8IChsMiA+PiAyNCk7CiAJCQkJCWwgPSBsMjsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvY29weV9wYWdlLlMgYi9hcmNoL3NwYXJjNjQvbGliL2NvcHlfcGFnZS5TCmluZGV4IDIzZWJmMmMuLmZlZWJiMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9saWIvY29weV9wYWdlLlMKKysrIGIvYXJjaC9zcGFyYzY0L2xpYi9jb3B5X3BhZ2UuUwpAQCAtODcsNyArODcsNyBAQAogCW1lbWJhcgkJI1N5bmMKIAl3cnByCQklbzIsIDB4MCwgJXBzdGF0ZQogCi0JQlJBTkNIX0lGX0FOWV9DSEVFVEFIKGczLG8yLDFmKQorY2hlZXRhaF9jb3B5X3BhZ2VfaW5zbjoKIAliYSxwdAkJJXhjYywgOWYKIAkgbm9wCiAKQEAgLTI0MCwzICsyNDAsMTQgQEAKIAkgc3R3CQklbzQsIFslZzYgKyBUSV9QUkVfQ09VTlRdCiAKIAkuc2l6ZQkJY29weV91c2VyX3BhZ2UsIC4tY29weV91c2VyX3BhZ2UKKworCS5nbG9ibAkJY2hlZXRhaF9wYXRjaF9jb3B5X3BhZ2UKK2NoZWV0YWhfcGF0Y2hfY29weV9wYWdlOgorCXNldGhpCQklaGkoMHgwMTAwMDAwMCksICVvMQkhIE5PUAorCXNldGhpCQklaGkoY2hlZXRhaF9jb3B5X3BhZ2VfaW5zbiksICVvMAorCW9yCQklbzAsICVsbyhjaGVldGFoX2NvcHlfcGFnZV9pbnNuKSwgJW8wCisJc3R3CQklbzEsIFslbzBdCisJbWVtYmFyCQkjU3RvcmVTdG9yZQorCWZsdXNoCQklbzAKKwlyZXRsCisJIG5vcApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9kZWJ1Z2xvY2tzLmMgYi9hcmNoL3NwYXJjNjQvbGliL2RlYnVnbG9ja3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmMGI1NS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL2RlYnVnbG9ja3MuYworKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKiAkSWQ6IGRlYnVnbG9ja3MuYyx2IDEuOSAyMDAxLzExLzE3IDAwOjEwOjQ4IGRhdmVtIEV4cCAkCi0gKiBkZWJ1Z2xvY2tzLmM6IERlYnVnZ2luZyB2ZXJzaW9ucyBvZiBTTVAgbG9ja2luZyBwcmltaXRpdmVzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG93IChjaGFyICpzdHIsIHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgY2FsbGVyKQotewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlwcmludGsoIiVzKCVwKSBDUFUjJWQgc3R1Y2sgYXQgJTA4eCwgb3duZXIgUEMoJTA4eCk6Q1BVKCV4KVxuIiwKLQkgICAgICAgc3RyLCBsb2NrLCBjcHUsICh1bnNpZ25lZCBpbnQpIGNhbGxlciwKLQkgICAgICAgbG9jay0+b3duZXJfcGMsIGxvY2stPm93bmVyX2NwdSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG93X3JlYWQgKGNoYXIgKnN0ciwgcndsb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgY2FsbGVyKQotewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlwcmludGsoIiVzKCVwKSBDUFUjJWQgc3R1Y2sgYXQgJTA4eCwgd3JpdGVyIFBDKCUwOHgpOkNQVSgleClcbiIsCi0JICAgICAgIHN0ciwgbG9jaywgY3B1LCAodW5zaWduZWQgaW50KSBjYWxsZXIsCi0JICAgICAgIGxvY2stPndyaXRlcl9wYywgbG9jay0+d3JpdGVyX2NwdSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG93X3dyaXRlIChjaGFyICpzdHIsIHJ3bG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGNhbGxlcikKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBpOwotCi0JcHJpbnRrKCIlcyglcCkgQ1BVIyVkIHN0dWNrIGF0ICUwOHhcbiIsCi0JICAgICAgIHN0ciwgbG9jaywgY3B1LCAodW5zaWduZWQgaW50KSBjYWxsZXIpOwotCXByaW50aygiV3JpdGVyOiBQQyglMDh4KTpDUFUoJXgpXG4iLAotCSAgICAgICBsb2NrLT53cml0ZXJfcGMsIGxvY2stPndyaXRlcl9jcHUpOwotCXByaW50aygiUmVhZGVyczoiKTsKLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQotCQlpZiAobG9jay0+cmVhZGVyX3BjW2ldKQotCQkJcHJpbnRrKCIgJWRbJTA4eF0iLCBpLCBsb2NrLT5yZWFkZXJfcGNbaV0pOwotCXByaW50aygiXG4iKTsKLX0KLQotI3VuZGVmIElOSVRfU1RVQ0sKLSNkZWZpbmUgSU5JVF9TVFVDSyAxMDAwMDAwMDAKLQotdm9pZCBfZG9fc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2ssIGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBjYWxsZXIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IHN0dWNrID0gSU5JVF9TVFVDSzsKLQlpbnQgY3B1ID0gZ2V0X2NwdSgpOwotCWludCBzaG93biA9IDA7Ci0KLWFnYWluOgotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZHN0dWIgWyUxXSwgJTAiCi0JCQkgICAgIDogIj1yIiAodmFsKQotCQkJICAgICA6ICJyIiAoJihsb2NrLT5sb2NrKSkKLQkJCSAgICAgOiAibWVtb3J5Iik7Ci0JbWVtYmFyX3N0b3JlbG9hZF9zdG9yZXN0b3JlKCk7Ci0JaWYgKHZhbCkgewotCQl3aGlsZSAobG9jay0+bG9jaykgewotCQkJaWYgKCEtLXN0dWNrKSB7Ci0JCQkJaWYgKHNob3duKysgPD0gMikKLQkJCQkJc2hvdyhzdHIsIGxvY2ssIGNhbGxlcik7Ci0JCQkJc3R1Y2sgPSBJTklUX1NUVUNLOwotCQkJfQotCQkJcm1iKCk7Ci0JCX0KLQkJZ290byBhZ2FpbjsKLQl9Ci0JbG9jay0+b3duZXJfcGMgPSAoKHVuc2lnbmVkIGludCljYWxsZXIpOwotCWxvY2stPm93bmVyX2NwdSA9IGNwdTsKLQljdXJyZW50LT50aHJlYWQuc21wX2xvY2tfY291bnQrKzsKLQljdXJyZW50LT50aHJlYWQuc21wX2xvY2tfcGMgPSAoKHVuc2lnbmVkIGludCljYWxsZXIpOwotCi0JcHV0X2NwdSgpOwotfQotCi1pbnQgX2RvX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGNhbGxlcikKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgY3B1ID0gZ2V0X2NwdSgpOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImxkc3R1YiBbJTFdLCAlMCIKLQkJCSAgICAgOiAiPXIiICh2YWwpCi0JCQkgICAgIDogInIiICgmKGxvY2stPmxvY2spKQotCQkJICAgICA6ICJtZW1vcnkiKTsKLQltZW1iYXJfc3RvcmVsb2FkX3N0b3Jlc3RvcmUoKTsKLQlpZiAoIXZhbCkgewotCQlsb2NrLT5vd25lcl9wYyA9ICgodW5zaWduZWQgaW50KWNhbGxlcik7Ci0JCWxvY2stPm93bmVyX2NwdSA9IGNwdTsKLQkJY3VycmVudC0+dGhyZWFkLnNtcF9sb2NrX2NvdW50Kys7Ci0JCWN1cnJlbnQtPnRocmVhZC5zbXBfbG9ja19wYyA9ICgodW5zaWduZWQgaW50KWNhbGxlcik7Ci0JfQotCi0JcHV0X2NwdSgpOwotCi0JcmV0dXJuIHZhbCA9PSAwOwotfQotCi12b2lkIF9kb19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQotewotCWxvY2stPm93bmVyX3BjID0gMDsKLQlsb2NrLT5vd25lcl9jcHUgPSBOT19QUk9DX0lEOwotCW1lbWJhcl9zdG9yZXN0b3JlX2xvYWRzdG9yZSgpOwotCWxvY2stPmxvY2sgPSAwOwotCWN1cnJlbnQtPnRocmVhZC5zbXBfbG9ja19jb3VudC0tOwotfQotCi0vKiBLZWVwIElOSVRfU1RVQ0sgdGhlIHNhbWUuLi4gKi8KLQotdm9pZCBfZG9fcmVhZF9sb2NrKHJ3bG9ja190ICpydywgY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGNhbGxlcikKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgc3R1Y2sgPSBJTklUX1NUVUNLOwotCWludCBjcHUgPSBnZXRfY3B1KCk7Ci0JaW50IHNob3duID0gMDsKLQotd2xvY2tfYWdhaW46Ci0JLyogV2FpdCBmb3IgYW55IHdyaXRlciB0byBnbyBhd2F5LiAgKi8KLQl3aGlsZSAoKChsb25nKShydy0+bG9jaykpIDwgMCkgewotCQlpZiAoIS0tc3R1Y2spIHsKLQkJCWlmIChzaG93bisrIDw9IDIpCi0JCQkJc2hvd19yZWFkKHN0ciwgcncsIGNhbGxlcik7Ci0JCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCX0KLQkJcm1iKCk7Ci0JfQotCS8qIFRyeSBvbmNlIHRvIGluY3JlbWVudCB0aGUgY291bnRlci4gICovCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iCWxkeAkJWyUwXSwgJSVnMVxuIgotIglicmx6LGEscG4JJSVnMSwgMmZcbiIKLSIJIG1vdgkJMSwgJTBcbiIKLSIJYWRkCQklJWcxLCAxLCAlJWc3XG4iCi0iCWNhc3gJCVslMF0sICUlZzEsICUlZzdcbiIKLSIJc3ViCQklJWcxLCAlJWc3LCAlMFxuIgotIjI6Igk6ICI9ciIgKHZhbCkKLQk6ICIwIiAoJihydy0+bG9jaykpCi0JOiAiZzEiLCAiZzciLCAibWVtb3J5Iik7Ci0JbWVtYmFyX3N0b3JlbG9hZF9zdG9yZXN0b3JlKCk7Ci0JaWYgKHZhbCkKLQkJZ290byB3bG9ja19hZ2FpbjsKLQlydy0+cmVhZGVyX3BjW2NwdV0gPSAoKHVuc2lnbmVkIGludCljYWxsZXIpOwotCWN1cnJlbnQtPnRocmVhZC5zbXBfbG9ja19jb3VudCsrOwotCWN1cnJlbnQtPnRocmVhZC5zbXBfbG9ja19wYyA9ICgodW5zaWduZWQgaW50KWNhbGxlcik7Ci0KLQlwdXRfY3B1KCk7Ci19Ci0KLXZvaWQgX2RvX3JlYWRfdW5sb2NrKHJ3bG9ja190ICpydywgY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGNhbGxlcikKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgc3R1Y2sgPSBJTklUX1NUVUNLOwotCWludCBjcHUgPSBnZXRfY3B1KCk7Ci0JaW50IHNob3duID0gMDsKLQotCS8qIERyb3Agb3VyIGlkZW50aXR5IF9maXJzdF8uICovCi0JcnctPnJlYWRlcl9wY1tjcHVdID0gMDsKLQljdXJyZW50LT50aHJlYWQuc21wX2xvY2tfY291bnQtLTsKLXJ1bmxvY2tfYWdhaW46Ci0JLyogU3BpbiB0cnlpbmcgdG8gZGVjcmVtZW50IHRoZSBjb3VudGVyIHVzaW5nIGNhc3guICAqLwotCV9fYXNtX18gX192b2xhdGlsZV9fKAotIgltZW1iYXIJI1N0b3JlTG9hZCB8ICNMb2FkTG9hZFxuIgotIglsZHgJWyUwXSwgJSVnMVxuIgotIglzdWIJJSVnMSwgMSwgJSVnN1xuIgotIgljYXN4CVslMF0sICUlZzEsICUlZzdcbiIKLSIJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgotIglzdWIJJSVnMSwgJSVnNywgJTBcbiIKLQk6ICI9ciIgKHZhbCkKLQk6ICIwIiAoJihydy0+bG9jaykpCi0JOiAiZzEiLCAiZzciLCAibWVtb3J5Iik7Ci0JaWYgKHZhbCkgewotCQlpZiAoIS0tc3R1Y2spIHsKLQkJCWlmIChzaG93bisrIDw9IDIpCi0JCQkJc2hvd19yZWFkKHN0ciwgcncsIGNhbGxlcik7Ci0JCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCX0KLQkJZ290byBydW5sb2NrX2FnYWluOwotCX0KLQotCXB1dF9jcHUoKTsKLX0KLQotdm9pZCBfZG9fd3JpdGVfbG9jayhyd2xvY2tfdCAqcncsIGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBjYWxsZXIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IHN0dWNrID0gSU5JVF9TVFVDSzsKLQlpbnQgY3B1ID0gZ2V0X2NwdSgpOwotCWludCBzaG93biA9IDA7Ci0KLXdsb2NrX2FnYWluOgotCS8qIFNwaW4gd2hpbGUgdGhlcmUgaXMgYW5vdGhlciB3cml0ZXIuICovCi0Jd2hpbGUgKCgobG9uZylydy0+bG9jaykgPCAwKSB7Ci0JCWlmICghLS1zdHVjaykgewotCQkJaWYgKHNob3duKysgPD0gMikKLQkJCQlzaG93X3dyaXRlKHN0ciwgcncsIGNhbGxlcik7Ci0JCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCX0KLQkJcm1iKCk7Ci0JfQotCi0JLyogVHJ5IHRvIGFjdWlyZSB0aGUgd3JpdGUgYml0LiAgKi8KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLSIJbW92CTEsICUlZzNcbiIKLSIJc2xseAklJWczLCA2MywgJSVnM1xuIgotIglsZHgJWyUwXSwgJSVnMVxuIgotIglicmx6LHBuCSUlZzEsIDFmXG4iCi0iCSBvcgklJWcxLCAlJWczLCAlJWc3XG4iCi0iCWNhc3gJWyUwXSwgJSVnMSwgJSVnN1xuIgotIgltZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCi0iCWJhLHB0CSUleGNjLCAyZlxuIgotIgkgc3ViCSUlZzEsICUlZzcsICUwXG4iCi0iMToJbW92CTEsICUwXG4iCi0iMjoiCTogIj1yIiAodmFsKQotCTogIjAiICgmKHJ3LT5sb2NrKSkKLQk6ICJnMyIsICJnMSIsICJnNyIsICJtZW1vcnkiKTsKLQlpZiAodmFsKSB7Ci0JCS8qIFdlIGNvdWxkbid0IGdldCB0aGUgd3JpdGUgYml0LiAqLwotCQlpZiAoIS0tc3R1Y2spIHsKLQkJCWlmIChzaG93bisrIDw9IDIpCi0JCQkJc2hvd193cml0ZShzdHIsIHJ3LCBjYWxsZXIpOwotCQkJc3R1Y2sgPSBJTklUX1NUVUNLOwotCQl9Ci0JCWdvdG8gd2xvY2tfYWdhaW47Ci0JfQotCWlmICgocnctPmxvY2sgJiAoKDFVTDw8NjMpLTFVTCkpICE9IDBVTCkgewotCQkvKiBSZWFkZXJzIHN0aWxsIGFyb3VuZCwgZHJvcCB0aGUgd3JpdGUKLQkJICogbG9jaywgc3BpbiwgYW5kIHRyeSBhZ2Fpbi4KLQkJICovCi0JCWlmICghLS1zdHVjaykgewotCQkJaWYgKHNob3duKysgPD0gMikKLQkJCQlzaG93X3dyaXRlKHN0ciwgcncsIGNhbGxlcik7Ci0JCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCX0KLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iCQltb3YJMSwgJSVnM1xuIgotIgkJc2xseAklJWczLCA2MywgJSVnM1xuIgotIjE6CQlsZHgJWyUwXSwgJSVnMVxuIgotIgkJYW5kbgklJWcxLCAlJWczLCAlJWc3XG4iCi0iCQljYXN4CVslMF0sICUlZzEsICUlZzdcbiIKLSIJCWNtcAklJWcxLCAlJWc3XG4iCi0iCQltZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCi0iCQlibmUscG4JJSV4Y2MsIDFiXG4iCi0iCQkgbm9wIgotCQk6IC8qIG5vIG91dHB1dHMgKi8KLQkJOiAiciIgKCYocnctPmxvY2spKQotCQk6ICJnMyIsICJnMSIsICJnNyIsICJjYyIsICJtZW1vcnkiKTsKLQkJd2hpbGUocnctPmxvY2sgIT0gMCkgewotCQkJaWYgKCEtLXN0dWNrKSB7Ci0JCQkJaWYgKHNob3duKysgPD0gMikKLQkJCQkJc2hvd193cml0ZShzdHIsIHJ3LCBjYWxsZXIpOwotCQkJCXN0dWNrID0gSU5JVF9TVFVDSzsKLQkJCX0KLQkJCXJtYigpOwotCQl9Ci0JCWdvdG8gd2xvY2tfYWdhaW47Ci0JfQotCi0JLyogV2UgaGF2ZSBpdCwgc2F5IHdobyB3ZSBhcmUuICovCi0JcnctPndyaXRlcl9wYyA9ICgodW5zaWduZWQgaW50KWNhbGxlcik7Ci0JcnctPndyaXRlcl9jcHUgPSBjcHU7Ci0JY3VycmVudC0+dGhyZWFkLnNtcF9sb2NrX2NvdW50Kys7Ci0JY3VycmVudC0+dGhyZWFkLnNtcF9sb2NrX3BjID0gKCh1bnNpZ25lZCBpbnQpY2FsbGVyKTsKLQotCXB1dF9jcHUoKTsKLX0KLQotdm9pZCBfZG9fd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydywgdW5zaWduZWQgbG9uZyBjYWxsZXIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IHN0dWNrID0gSU5JVF9TVFVDSzsKLQlpbnQgc2hvd24gPSAwOwotCi0JLyogRHJvcCBvdXIgaWRlbnRpdHkgX2ZpcnN0XyAqLwotCXJ3LT53cml0ZXJfcGMgPSAwOwotCXJ3LT53cml0ZXJfY3B1ID0gTk9fUFJPQ19JRDsKLQljdXJyZW50LT50aHJlYWQuc21wX2xvY2tfY291bnQtLTsKLXdsb2NrX2FnYWluOgotCV9fYXNtX18gX192b2xhdGlsZV9fKAotIgltZW1iYXIJI1N0b3JlTG9hZCB8ICNMb2FkTG9hZFxuIgotIgltb3YJMSwgJSVnM1xuIgotIglzbGx4CSUlZzMsIDYzLCAlJWczXG4iCi0iCWxkeAlbJTBdLCAlJWcxXG4iCi0iCWFuZG4JJSVnMSwgJSVnMywgJSVnN1xuIgotIgljYXN4CVslMF0sICUlZzEsICUlZzdcbiIKLSIJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgotIglzdWIJJSVnMSwgJSVnNywgJTBcbiIKLQk6ICI9ciIgKHZhbCkKLQk6ICIwIiAoJihydy0+bG9jaykpCi0JOiAiZzMiLCAiZzEiLCAiZzciLCAibWVtb3J5Iik7Ci0JaWYgKHZhbCkgewotCQlpZiAoIS0tc3R1Y2spIHsKLQkJCWlmIChzaG93bisrIDw9IDIpCi0JCQkJc2hvd193cml0ZSgid3JpdGVfdW5sb2NrIiwgcncsIGNhbGxlcik7Ci0JCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCX0KLQkJZ290byB3bG9ja19hZ2FpbjsKLQl9Ci19Ci0KLWludCBfZG9fd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncsIGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBjYWxsZXIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IGNwdSA9IGdldF9jcHUoKTsKLQotCS8qIFRyeSB0byBhY3VpcmUgdGhlIHdyaXRlIGJpdC4gICovCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iCW1vdgkxLCAlJWczXG4iCi0iCXNsbHgJJSVnMywgNjMsICUlZzNcbiIKLSIJbGR4CVslMF0sICUlZzFcbiIKLSIJYnJseixwbgklJWcxLCAxZlxuIgotIgkgb3IJJSVnMSwgJSVnMywgJSVnN1xuIgotIgljYXN4CVslMF0sICUlZzEsICUlZzdcbiIKLSIJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgotIgliYSxwdAklJXhjYywgMmZcbiIKLSIJIHN1YgklJWcxLCAlJWc3LCAlMFxuIgotIjE6CW1vdgkxLCAlMFxuIgotIjI6Igk6ICI9ciIgKHZhbCkKLQk6ICIwIiAoJihydy0+bG9jaykpCi0JOiAiZzMiLCAiZzEiLCAiZzciLCAibWVtb3J5Iik7Ci0KLQlpZiAodmFsKSB7Ci0JCXB1dF9jcHUoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKChydy0+bG9jayAmICgoMVVMPDw2MyktMVVMKSkgIT0gMFVMKSB7Ci0JCS8qIFJlYWRlcnMgc3RpbGwgYXJvdW5kLCBkcm9wIHRoZSB3cml0ZQotCQkgKiBsb2NrLCByZXR1cm4gZmFpbHVyZS4KLQkJICovCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAotIgkJbW92CTEsICUlZzNcbiIKLSIJCXNsbHgJJSVnMywgNjMsICUlZzNcbiIKLSIxOgkJbGR4CVslMF0sICUlZzFcbiIKLSIJCWFuZG4JJSVnMSwgJSVnMywgJSVnN1xuIgotIgkJY2FzeAlbJTBdLCAlJWcxLCAlJWc3XG4iCi0iCQljbXAJJSVnMSwgJSVnN1xuIgotIgkJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgotIgkJYm5lLHBuCSUleGNjLCAxYlxuIgotIgkJIG5vcCIKLQkJOiAvKiBubyBvdXRwdXRzICovCi0JCTogInIiICgmKHJ3LT5sb2NrKSkKLQkJOiAiZzMiLCAiZzEiLCAiZzciLCAiY2MiLCAibWVtb3J5Iik7Ci0KLQkJcHV0X2NwdSgpOwotCi0JCXJldHVybiAwOwotCX0KLQotCS8qIFdlIGhhdmUgaXQsIHNheSB3aG8gd2UgYXJlLiAqLwotCXJ3LT53cml0ZXJfcGMgPSAoKHVuc2lnbmVkIGludCljYWxsZXIpOwotCXJ3LT53cml0ZXJfY3B1ID0gY3B1OwotCWN1cnJlbnQtPnRocmVhZC5zbXBfbG9ja19jb3VudCsrOwotCWN1cnJlbnQtPnRocmVhZC5zbXBfbG9ja19wYyA9ICgodW5zaWduZWQgaW50KWNhbGxlcik7Ci0KLQlwdXRfY3B1KCk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvbWIuUyBiL2FyY2gvc3BhcmM2NC9saWIvbWIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwNGY3NC4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL21iLlMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBtYi5TOiBPdXQgb2YgbGluZSBtZW1vcnkgYmFycmllcnMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKLSAqLwotCi0JLyogVGhlc2UgYXJlIGhlcmUgaW4gYW4gZWZmb3J0IHRvIG1vcmUgZnVsbHkgd29yayBhcm91bmQKLQkgKiBTcGl0ZmlyZSBFcnJhdGEgIzUxLiAgRXNzZW50aWFsbHksIGlmIGEgbWVtb3J5IGJhcnJpZXIKLQkgKiBvY2N1cnMgc29vbiBhZnRlciBhIG1pc3ByZWRpY3RlZCBicmFuY2gsIHRoZSBjaGlwIGNhbiBzdG9wCi0JICogZXhlY3V0aW5nIGluc3RydWN0aW9ucyB1bnRpbCBhIHRyYXAgb2NjdXJzLiAgVGhlcmVmb3JlLCBpZgotCSAqIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCB0aGUgY2hpcCBjYW4gaGFuZyBmb3JldmVyLgotCSAqCi0JICogSXQgdXNlZCB0byBiZSBiZWxpZXZlZCB0aGF0IHRoZSBtZW1vcnkgYmFycmllciBoYWQgdG8gYmUKLQkgKiByaWdodCBpbiB0aGUgZGVsYXkgc2xvdCwgYnV0IGEgY2FzZSBoYXMgYmVlbiB0cmFjZWQKLQkgKiByZWNlbnRseSB3aGVyZWluIHRoZSBtZW1vcnkgYmFycmllciB3YXMgb25lIGluc3RydWN0aW9uCi0JICogYWZ0ZXIgdGhlIGJyYW5jaCBkZWxheSBzbG90IGFuZCB0aGUgY2hpcCBzdGlsbCBodW5nLiAgVGhlCi0JICogb2ZmZW5kaW5nIHNlcXVlbmNlIHdhcyB0aGUgZm9sbG93aW5nIGluIHN5bV93YWtldXBfZG9uZSgpCi0JICogb2YgdGhlIHN5bTUzYzh4eF8yIGRyaXZlcjoKLQkgKgotCSAqCWNhbGwJc3ltX2NjYl9mcm9tX2RzYSwgMAotCSAqCSBtb3ZnZQklaWNjLCAwLCAlbDAKLQkgKglicnoscG4JJW8wLCAuTEwxMzAzCi0JICoJIG1vdgklbzAsICVsMgotCSAqCW1lbWJhcgkjTG9hZExvYWQKLQkgKgotCSAqIFRoZSBicmFuY2ggaGFzIHRvIGJlIG1pc3ByZWRpY3RlZCBmb3IgdGhlIGJ1ZyB0byBvY2N1ci4KLQkgKiBUaGVyZWZvcmUsIHdlIHB1dCB0aGUgbWVtb3J5IGJhcnJpZXIgZXhwbGljaXRseSBpbnRvIGEKLQkgKiAiYnJhbmNoIGFsd2F5cywgcHJlZGljdGVkIHRha2VuIiBkZWxheSBzbG90IHRvIGF2b2lkIHRoZQotCSAqIHByb2JsZW0gY2FzZS4KLQkgKi8KLQotCS50ZXh0Ci0KLTk5OglyZXRsCi0JIG5vcAotCi0JLmdsb2JsCW1iCi1tYjoJYmEscHQJJXhjYywgOTliCi0JIG1lbWJhcgkjTG9hZExvYWQgfCAjTG9hZFN0b3JlIHwgI1N0b3JlU3RvcmUgfCAjU3RvcmVMb2FkCi0JLnNpemUJbWIsIC4tbWIKLQotCS5nbG9ibAlybWIKLXJtYjoJYmEscHQJJXhjYywgOTliCi0JIG1lbWJhcgkjTG9hZExvYWQKLQkuc2l6ZQlybWIsIC4tcm1iCi0KLQkuZ2xvYmwJd21iCi13bWI6CWJhLHB0CSV4Y2MsIDk5YgotCSBtZW1iYXIJI1N0b3JlU3RvcmUKLQkuc2l6ZQl3bWIsIC4td21iCi0KLQkuZ2xvYmwJbWVtYmFyX3N0b3JlbG9hZAotbWVtYmFyX3N0b3JlbG9hZDoKLQliYSxwdAkleGNjLCA5OWIKLQkgbWVtYmFyCSNTdG9yZUxvYWQKLQkuc2l6ZQltZW1iYXJfc3RvcmVsb2FkLCAuLW1lbWJhcl9zdG9yZWxvYWQKLQotCS5nbG9ibAltZW1iYXJfc3RvcmVsb2FkX3N0b3Jlc3RvcmUKLW1lbWJhcl9zdG9yZWxvYWRfc3RvcmVzdG9yZToKLQliYSxwdAkleGNjLCA5OWIKLQkgbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQotCS5zaXplCW1lbWJhcl9zdG9yZWxvYWRfc3RvcmVzdG9yZSwgLi1tZW1iYXJfc3RvcmVsb2FkX3N0b3Jlc3RvcmUKLQotCS5nbG9ibAltZW1iYXJfc3RvcmVsb2FkX2xvYWRsb2FkCi1tZW1iYXJfc3RvcmVsb2FkX2xvYWRsb2FkOgotCWJhLHB0CSV4Y2MsIDk5YgotCSBtZW1iYXIJI1N0b3JlTG9hZCB8ICNMb2FkTG9hZAotCS5zaXplCW1lbWJhcl9zdG9yZWxvYWRfbG9hZGxvYWQsIC4tbWVtYmFyX3N0b3JlbG9hZF9sb2FkbG9hZAotCi0JLmdsb2JsCW1lbWJhcl9zdG9yZXN0b3JlX2xvYWRzdG9yZQotbWVtYmFyX3N0b3Jlc3RvcmVfbG9hZHN0b3JlOgotCWJhLHB0CSV4Y2MsIDk5YgotCSBtZW1iYXIJI1N0b3JlU3RvcmUgfCAjTG9hZFN0b3JlCi0JLnNpemUJbWVtYmFyX3N0b3Jlc3RvcmVfbG9hZHN0b3JlLCAuLW1lbWJhcl9zdG9yZXN0b3JlX2xvYWRzdG9yZQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMgYi9hcmNoL3NwYXJjNjQvbW0vZmF1bHQuYwppbmRleCA1MmU5Mzc1Li5kYjFlMzMxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbW0vZmF1bHQuYworKysgYi9hcmNoL3NwYXJjNjQvbW0vZmF1bHQuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTExNyw4ICsxMTgsOSBAQAogCXJldHVybiB0YWxseTsKIH0KIAotc3RhdGljIHZvaWQgdW5oYW5kbGVkX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCi0JCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgdW5oYW5kbGVkX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpZiAoKHVuc2lnbmVkIGxvbmcpIGFkZHJlc3MgPCBQQUdFX1NJWkUpIHsKIAkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIE5VTEwgIgpAQCAtMzA0LDcgKzMwNiw3IEBACiAJdW5oYW5kbGVkX2ZhdWx0IChhZGRyZXNzLCBjdXJyZW50LCByZWdzKTsKIH0KIAotYXNtbGlua2FnZSB2b2lkIGRvX3NwYXJjNjRfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIHZvaWQgX19rcHJvYmVzIGRvX3NwYXJjNjRfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9nZW5lcmljLmMgYi9hcmNoL3NwYXJjNjQvbW0vZ2VuZXJpYy5jCmluZGV4IDZiMzFmNjEuLmM5NTRkOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tbS9nZW5lcmljLmMKKysrIGIvYXJjaC9zcGFyYzY0L21tL2dlbmVyaWMuYwpAQCAtMTE2LDM3ICsxMTYsNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaW9fcmVtYXBfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBmcm9tLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBwZ3Byb3RfdCBwcm90LCBpbnQgc3BhY2UpCi17Ci0JaW50IGVycm9yID0gMDsKLQlwZ2RfdCAqIGRpcjsKLQl1bnNpZ25lZCBsb25nIGJlZyA9IGZyb207Ci0JdW5zaWduZWQgbG9uZyBlbmQgPSBmcm9tICsgc2l6ZTsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07Ci0KLQlwcm90ID0gX19wZ3Byb3QocGdfaW9iaXRzKTsKLQlvZmZzZXQgLT0gZnJvbTsKLQlkaXIgPSBwZ2Rfb2Zmc2V0KG1tLCBmcm9tKTsKLQlmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIGJlZywgZW5kKTsKLQotCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7Ci0Jd2hpbGUgKGZyb20gPCBlbmQpIHsKLQkJcHVkX3QgKnB1ZCA9IHB1ZF9hbGxvYyhtbSwgZGlyLCBmcm9tKTsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlpZiAoIXB1ZCkKLQkJCWJyZWFrOwotCQllcnJvciA9IGlvX3JlbWFwX3B1ZF9yYW5nZShtbSwgcHVkLCBmcm9tLCBlbmQgLSBmcm9tLCBvZmZzZXQgKyBmcm9tLCBwcm90LCBzcGFjZSk7Ci0JCWlmIChlcnJvcikKLQkJCWJyZWFrOwotCQlmcm9tID0gKGZyb20gKyBQR0RJUl9TSVpFKSAmIFBHRElSX01BU0s7Ci0JCWRpcisrOwotCX0KLQlmbHVzaF90bGJfcmFuZ2Uodm1hLCBiZWcsIGVuZCk7Ci0Jc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwotCi0JcmV0dXJuIGVycm9yOwotfQotCiBpbnQgaW9fcmVtYXBfcGZuX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGZyb20sCiAJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHNpemUsIHBncHJvdF90IHByb3QpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jIGIvYXJjaC9zcGFyYzY0L21tL2luaXQuYwppbmRleCAzZmJhZjM0Li5mZGIxZWJiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9oZWFkLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMjUwLDcgKzI1MSw3IEBACiAJcHV0X2NwdSgpOwogfQogCi12b2lkIGZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3ZvaWQgX19rcHJvYmVzIGZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAkvKiBDaGVldGFoIGhhcyBjb2hlcmVudCBJLWNhY2hlLiAqLwogCWlmICh0bGJfdHlwZSA9PSBzcGl0ZmlyZSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L21tL3VsdHJhLlMgYi9hcmNoL3NwYXJjNjQvbW0vdWx0cmEuUwppbmRleCAzNjM3NzA4Li5iMmVlOWI1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbW0vdWx0cmEuUworKysgYi9hcmNoL3NwYXJjNjQvbW0vdWx0cmEuUwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3NwaXRmaXJlLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9waWwuaD4KICNpbmNsdWRlIDxhc20vaGVhZC5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgpAQCAtNDUsNiArNDYsOCBAQAogCW5vcAogCW5vcAogCW5vcAorCW5vcAorCW5vcAogCiAJLmFsaWduCQkzMgogCS5nbG9ibAkJX19mbHVzaF90bGJfcGVuZGluZwpAQCAtNzMsNiArNzYsOSBAQAogCXJldGwKIAkgd3JwcgkJJWc3LCAweDAsICVwc3RhdGUKIAlub3AKKwlub3AKKwlub3AKKwlub3AKIAogCS5hbGlnbgkJMzIKIAkuZ2xvYmwJCV9fZmx1c2hfdGxiX2tlcm5lbF9yYW5nZQpAQCAtMTEzLDYgKzExOSw3IEBACiAjZWxzZQogI2Vycm9yIHVuc3VwcG9ydGVkIFBBR0VfU0laRQogI2VuZGlmCisJLnNlY3Rpb24gLmtwcm9iZXMudGV4dCwgImF4IgogCS5hbGlnbgkJMzIKIAkuZ2xvYmwJCV9fZmx1c2hfaWNhY2hlX3BhZ2UKIF9fZmx1c2hfaWNhY2hlX3BhZ2U6CS8qICVvMCA9IHBoeXNfcGFnZSAqLwpAQCAtMTk1LDYgKzIwMiw3IEBACiAJIG5vcAogI2VuZGlmIC8qIERDQUNIRV9BTElBU0lOR19QT1NTSUJMRSAqLwogCisJLnByZXZpb3VzIC50ZXh0CiAJLmFsaWduCQkzMgogX19wcmVmaWxsX2R0bGI6CiAJcmRwcgkJJXBzdGF0ZSwgJWc3CkBAIC0yMjQsMTYgKzIzMiw4IEBACiAJIG9yCQklbzUsICVvMCwgJW81CiAJYmEsYSxwdAkJJXhjYywgX19wcmVmaWxsX2l0bGIKIAotCS8qIENoZWV0YWggc3BlY2lmaWMgdmVyc2lvbnMsIHBhdGNoZWQgYXQgYm9vdCB0aW1lLgotCSAqCi0JICogVGhpcyB3cml0ZXMgb2YgdGhlIFBSSU1BUllfQ09OVEVYVCByZWdpc3RlciBpbiB0aGlzIGZpbGUgYXJlCi0JICogc2FmZSBldmVuIG9uIENoZWV0YWgrIGFuZCBsYXRlciB3cnQuIHRoZSBwYWdlIHNpemUgZmllbGRzLgotCSAqIFRoZSBudWNsZXVzIHBhZ2Ugc2l6ZSBmaWVsZHMgZG8gbm90IG1hdHRlciBiZWNhdXNlIHdlIG1ha2UKLQkgKiBubyBkYXRhIHJlZmVyZW5jZXMsIGFuZCB0aGVzZSBpbnN0cnVjdGlvbnMgZXhlY3V0ZSBvdXQgb2YgYQotCSAqIGxvY2tlZCBJLVRMQiBlbnRyeSBzaXR0aW5nIGluIHRoZSBmdWxseSBhc3Nvc2NpYXRpdmUgSS1UTEIuCi0JICogVGhpcyBzZXF1ZW5jZSBzaG91bGQgYWxzbyBuZXZlciB0cmFwLgotCSAqLwotX19jaGVldGFoX2ZsdXNoX3RsYl9tbTogLyogMTUgaW5zbnMgKi8KKwkvKiBDaGVldGFoIHNwZWNpZmljIHZlcnNpb25zLCBwYXRjaGVkIGF0IGJvb3QgdGltZS4gKi8KK19fY2hlZXRhaF9mbHVzaF90bGJfbW06IC8qIDE4IGluc25zICovCiAJcmRwcgkJJXBzdGF0ZSwgJWc3CiAJYW5kbgkJJWc3LCBQU1RBVEVfSUUsICVnMgogCXdycHIJCSVnMiwgMHgwLCAlcHN0YXRlCkBAIC0yNDEsNiArMjQxLDkgQEAKIAltb3YJCVBSSU1BUllfQ09OVEVYVCwgJW8yCiAJbW92CQkweDQwLCAlZzMKIAlsZHhhCQlbJW8yXSBBU0lfRE1NVSwgJWcyCisJc3JseAkJJWcyLCBDVFhfUEdTWjFfTlVDX1NISUZULCAlbzEKKwlzbGx4CQklbzEsIENUWF9QR1NaMV9OVUNfU0hJRlQsICVvMQorCW9yCQklbzAsICVvMSwgJW8wCS8qIFByZXNlcnZlIG51Y2xldXMgcGFnZSBzaXplIGZpZWxkcyAqLwogCXN0eGEJCSVvMCwgWyVvMl0gQVNJX0RNTVUKIAlzdHhhCQklZzAsIFslZzNdIEFTSV9ETU1VX0RFTUFQCiAJc3R4YQkJJWcwLCBbJWczXSBBU0lfSU1NVV9ERU1BUApAQCAtMjUwLDcgKzI1Myw3IEBACiAJcmV0bAogCSB3cnByCQklZzcsIDB4MCwgJXBzdGF0ZQogCi1fX2NoZWV0YWhfZmx1c2hfdGxiX3BlbmRpbmc6CS8qIDIzIGluc25zICovCitfX2NoZWV0YWhfZmx1c2hfdGxiX3BlbmRpbmc6CS8qIDI2IGluc25zICovCiAJLyogJW8wID0gY29udGV4dCwgJW8xID0gbnIsICVvMiA9IHZhZGRyc1tdICovCiAJcmRwcgkJJXBzdGF0ZSwgJWc3CiAJc2xseAkJJW8xLCAzLCAlbzEKQEAgLTI1OSw2ICsyNjIsOSBAQAogCXdycHIJCSVnMCwgMSwgJXRsCiAJbW92CQlQUklNQVJZX0NPTlRFWFQsICVvNAogCWxkeGEJCVslbzRdIEFTSV9ETU1VLCAlZzIKKwlzcmx4CQklZzIsIENUWF9QR1NaMV9OVUNfU0hJRlQsICVvMworCXNsbHgJCSVvMywgQ1RYX1BHU1oxX05VQ19TSElGVCwgJW8zCisJb3IJCSVvMCwgJW8zLCAlbzAJLyogUHJlc2VydmUgbnVjbGV1cyBwYWdlIHNpemUgZmllbGRzICovCiAJc3R4YQkJJW8wLCBbJW80XSBBU0lfRE1NVQogMToJc3ViCQklbzEsICgxIDw8IDMpLCAlbzEKIAlsZHgJCVslbzIgKyAlbzFdLCAlbzMKQEAgLTMxMSwxNCArMzE3LDE0IEBACiAJc2V0aGkJCSVoaShfX2NoZWV0YWhfZmx1c2hfdGxiX21tKSwgJW8xCiAJb3IJCSVvMSwgJWxvKF9fY2hlZXRhaF9mbHVzaF90bGJfbW0pLCAlbzEKIAljYWxsCQljaGVldGFoX3BhdGNoX29uZQotCSBtb3YJCTE1LCAlbzIKKwkgbW92CQkxOCwgJW8yCiAKIAlzZXRoaQkJJWhpKF9fZmx1c2hfdGxiX3BlbmRpbmcpLCAlbzAKIAlvcgkJJW8wLCAlbG8oX19mbHVzaF90bGJfcGVuZGluZyksICVvMAogCXNldGhpCQklaGkoX19jaGVldGFoX2ZsdXNoX3RsYl9wZW5kaW5nKSwgJW8xCiAJb3IJCSVvMSwgJWxvKF9fY2hlZXRhaF9mbHVzaF90bGJfcGVuZGluZyksICVvMQogCWNhbGwJCWNoZWV0YWhfcGF0Y2hfb25lCi0JIG1vdgkJMjMsICVvMgorCSBtb3YJCTI2LCAlbzIKIAogI2lmZGVmIERDQUNIRV9BTElBU0lOR19QT1NTSUJMRQogCXNldGhpCQklaGkoX19mbHVzaF9kY2FjaGVfcGFnZSksICVvMApAQCAtMzUyLDkgKzM1OCwxMiBAQAogCS5nbG9ibAkJeGNhbGxfZmx1c2hfdGxiX21tCiB4Y2FsbF9mbHVzaF90bGJfbW06CiAJbW92CQlQUklNQVJZX0NPTlRFWFQsICVnMgotCW1vdgkJMHg0MCwgJWc0CiAJbGR4YQkJWyVnMl0gQVNJX0RNTVUsICVnMworCXNybHgJCSVnMywgQ1RYX1BHU1oxX05VQ19TSElGVCwgJWc0CisJc2xseAkJJWc0LCBDVFhfUEdTWjFfTlVDX1NISUZULCAlZzQKKwlvcgkJJWc1LCAlZzQsICVnNQkvKiBQcmVzZXJ2ZSBudWNsZXVzIHBhZ2Ugc2l6ZSBmaWVsZHMgKi8KIAlzdHhhCQklZzUsIFslZzJdIEFTSV9ETU1VCisJbW92CQkweDQwLCAlZzQKIAlzdHhhCQklZzAsIFslZzRdIEFTSV9ETU1VX0RFTUFQCiAJc3R4YQkJJWcwLCBbJWc0XSBBU0lfSU1NVV9ERU1BUAogCXN0eGEJCSVnMywgWyVnMl0gQVNJX0RNTVUKQEAgLTM2Niw2ICszNzUsMTAgQEAKIAlzbGx4CQklZzEsIDMsICVnMQogCW1vdgkJUFJJTUFSWV9DT05URVhULCAlZzQKIAlsZHhhCQlbJWc0XSBBU0lfRE1NVSwgJWcyCisJc3JseAkJJWcyLCBDVFhfUEdTWjFfTlVDX1NISUZULCAlZzQKKwlzbGx4CQklZzQsIENUWF9QR1NaMV9OVUNfU0hJRlQsICVnNAorCW9yCQklZzUsICVnNCwgJWc1CisJbW92CQlQUklNQVJZX0NPTlRFWFQsICVnNAogCXN0eGEJCSVnNSwgWyVnNF0gQVNJX0RNTVUKIDE6CXN1YgkJJWcxLCAoMSA8PCAzKSwgJWcxCiAJbGR4CQlbJWc3ICsgJWcxXSwgJWc1CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvc29sYXJpcy9pb2N0bC5jIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvaW9jdGwuYwppbmRleCBjYWMwYTFjLi5iZTBhMDU0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvc29sYXJpcy9pb2N0bC5jCisrKyBiL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2lvY3RsLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdGlvLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAKICNpbmNsdWRlIDxuZXQvc29jay5oPgpAQCAtMjkzLDE2ICsyOTQsMTggQEAKIHN0YXRpYyBpbmxpbmUgaW50IHNvbGFyaXNfc29ja21vZCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHUzMiBhcmcpCiB7CiAJc3RydWN0IGlub2RlICppbm87CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAkvKiBJIHdvbmRlciB3aGljaCBvZiB0aGVzZSB0ZXN0cyBhcmUgc3VwZXJmbHVvdXMuLi4gLS1wYXRyaWsgKi8KLQlzcGluX2xvY2soJmN1cnJlbnQtPmZpbGVzLT5maWxlX2xvY2spOwotCWlmICghIGN1cnJlbnQtPmZpbGVzLT5mZFtmZF0gfHwKLQkgICAgISBjdXJyZW50LT5maWxlcy0+ZmRbZmRdLT5mX2RlbnRyeSB8fAotCSAgICAhIChpbm8gPSBjdXJyZW50LT5maWxlcy0+ZmRbZmRdLT5mX2RlbnRyeS0+ZF9pbm9kZSkgfHwKKwlyY3VfcmVhZF9sb2NrKCk7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShjdXJyZW50LT5maWxlcyk7CisJaWYgKCEgZmR0LT5mZFtmZF0gfHwKKwkgICAgISBmZHQtPmZkW2ZkXS0+Zl9kZW50cnkgfHwKKwkgICAgISAoaW5vID0gZmR0LT5mZFtmZF0tPmZfZGVudHJ5LT5kX2lub2RlKSB8fAogCSAgICAhIFNfSVNTT0NLKGluby0+aV9tb2RlKSkgewotCQlzcGluX3VubG9jaygmY3VycmVudC0+ZmlsZXMtPmZpbGVfbG9jayk7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gVEJBREY7CiAJfQotCXNwaW5fdW5sb2NrKCZjdXJyZW50LT5maWxlcy0+ZmlsZV9sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAkKIAlzd2l0Y2ggKGNtZCAmIDB4ZmYpIHsKIAljYXNlIDEwOTogLyogU0lfU09DS1BBUkFNUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3NvbGFyaXMvdGltb2QuYyBiL2FyY2gvc3BhcmM2NC9zb2xhcmlzL3RpbW9kLmMKaW5kZXggMDIyYzgwZi4uYWFhZDI5YyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L3NvbGFyaXMvdGltb2QuYworKysgYi9hcmNoL3NwYXJjNjQvc29sYXJpcy90aW1vZC5jCkBAIC0xNDMsOSArMTQzLDExIEBACiBzdGF0aWMgdm9pZCB0aW1vZF93YWtlX3NvY2tldCh1bnNpZ25lZCBpbnQgZmQpCiB7CiAJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCiAJU09MRCgid2FrZWluZyBzb2NrZXQiKTsKLQlzb2NrID0gU09DS0VUX0koY3VycmVudC0+ZmlsZXMtPmZkW2ZkXS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOworCXNvY2sgPSBTT0NLRVRfSShmZHQtPmZkW2ZkXS0+Zl9kZW50cnktPmRfaW5vZGUpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc29jay0+d2FpdCk7CiAJcmVhZF9sb2NrKCZzb2NrLT5zay0+c2tfY2FsbGJhY2tfbG9jayk7CiAJaWYgKHNvY2stPmZhc3luY19saXN0ICYmICF0ZXN0X2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc29jay0+ZmxhZ3MpKQpAQCAtMTU3LDkgKzE1OSwxMSBAQAogc3RhdGljIHZvaWQgdGltb2RfcXVldWUodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgVF9wcmltc2cgKml0KQogewogCXN0cnVjdCBzb2xfc29ja2V0X3N0cnVjdCAqc29jazsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCiAJU09MRCgicXVldWluZyBwcmltc2ciKTsKLQlzb2NrID0gKHN0cnVjdCBzb2xfc29ja2V0X3N0cnVjdCAqKWN1cnJlbnQtPmZpbGVzLT5mZFtmZF0tPnByaXZhdGVfZGF0YTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKTsKKwlzb2NrID0gKHN0cnVjdCBzb2xfc29ja2V0X3N0cnVjdCAqKWZkdC0+ZmRbZmRdLT5wcml2YXRlX2RhdGE7CiAJaXQtPm5leHQgPSBzb2NrLT5wZmlyc3Q7CiAJc29jay0+cGZpcnN0ID0gaXQ7CiAJaWYgKCFzb2NrLT5wbGFzdCkKQEAgLTE3MSw5ICsxNzUsMTEgQEAKIHN0YXRpYyB2b2lkIHRpbW9kX3F1ZXVlX2VuZCh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBUX3ByaW1zZyAqaXQpCiB7CiAJc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0ICpzb2NrOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAlTT0xEKCJxdWV1aW5nIHByaW1zZyBhdCBlbmQiKTsKLQlzb2NrID0gKHN0cnVjdCBzb2xfc29ja2V0X3N0cnVjdCAqKWN1cnJlbnQtPmZpbGVzLT5mZFtmZF0tPnByaXZhdGVfZGF0YTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKTsKKwlzb2NrID0gKHN0cnVjdCBzb2xfc29ja2V0X3N0cnVjdCAqKWZkdC0+ZmRbZmRdLT5wcml2YXRlX2RhdGE7CiAJaXQtPm5leHQgPSBOVUxMOwogCWlmIChzb2NrLT5wbGFzdCkKIAkJc29jay0+cGxhc3QtPm5leHQgPSBpdDsKQEAgLTM0NCw2ICszNTAsNyBAQAogCWNoYXIgKmJ1ZjsKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKIAlzdHJ1Y3QgaW5vZGUgKmlubzsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCXN0cnVjdCBzb2xfc29ja2V0X3N0cnVjdCAqc29jazsKIAltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CiAJbG9uZyBhcmdzWzZdOwpAQCAtMzUxLDcgKzM1OCw5IEBACiAJCShpbnQgKCopKGludCwgdW5zaWduZWQgbG9uZyBfX3VzZXIgKikpU1lTKHNvY2tldGNhbGwpOwogCWludCAoKnN5c19zZW5kdG8pKGludCwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90LCB1bnNpZ25lZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCBpbnQpID0KIAkJKGludCAoKikoaW50LCB2b2lkIF9fdXNlciAqLCBzaXplX3QsIHVuc2lnbmVkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIGludCkpU1lTKHNlbmR0byk7Ci0JZmlscCA9IGN1cnJlbnQtPmZpbGVzLT5mZFtmZF07CisKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKTsKKwlmaWxwID0gZmR0LT5mZFtmZF07CiAJaW5vID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CiAJc29jayA9IChzdHJ1Y3Qgc29sX3NvY2tldF9zdHJ1Y3QgKilmaWxwLT5wcml2YXRlX2RhdGE7CiAJU09MRCgiZW50cnkiKTsKQEAgLTYyMCw2ICs2MjksNyBAQAogCWludCBvbGRmbGFnczsKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKIAlzdHJ1Y3QgaW5vZGUgKmlubzsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCXN0cnVjdCBzb2xfc29ja2V0X3N0cnVjdCAqc29jazsKIAlzdHJ1Y3QgVF91bml0ZGF0YV9pbmQgdWRpOwogCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKQEAgLTYzMiw3ICs2NDIsOCBAQAogCQogCVNPTEQoImVudHJ5Iik7CiAJU09MREQoKCIldSAlcCAlZCAlcCAlcCAlZCAlcCAlZFxuIiwgZmQsIGN0bF9idWYsIGN0bF9tYXhsZW4sIGN0bF9sZW4sIGRhdGFfYnVmLCBkYXRhX21heGxlbiwgZGF0YV9sZW4sICpmbGFnc19wKSk7Ci0JZmlscCA9IGN1cnJlbnQtPmZpbGVzLT5mZFtmZF07CisJZmR0ID0gZmlsZXNfZmR0YWJsZShjdXJyZW50LT5maWxlcyk7CisJZmlscCA9IGZkdC0+ZmRbZmRdOwogCWlubyA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwogCXNvY2sgPSAoc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0ICopZmlscC0+cHJpdmF0ZV9kYXRhOwogCVNPTEREKCgiJXAgJXBcbiIsIHNvY2stPnBmaXJzdCwgc29jay0+cGZpcnN0ID8gc29jay0+cGZpcnN0LT5uZXh0IDogTlVMTCkpOwpAQCAtODQ0LDEyICs4NTUsMTQgQEAKIAlpbnQgX191c2VyICpmbGdwdHI7CiAJaW50IGZsYWdzOwogCWludCBlcnJvciA9IC1FQkFERjsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCiAJU09MRCgiZW50cnkiKTsKIAlsb2NrX2tlcm5lbCgpOwogCWlmKGZkID49IE5SX09QRU4pIGdvdG8gb3V0OwogCi0JZmlscCA9IGN1cnJlbnQtPmZpbGVzLT5mZFtmZF07CisJZmR0ID0gZmlsZXNfZmR0YWJsZShjdXJyZW50LT5maWxlcyk7CisJZmlscCA9IGZkdC0+ZmRbZmRdOwogCWlmKCFmaWxwKSBnb3RvIG91dDsKIAogCWlubyA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwpAQCAtOTEwLDEyICs5MjMsMTQgQEAKIAlzdHJ1Y3Qgc3RyYnVmIGN0bCwgZGF0OwogCWludCBmbGFncyA9IChpbnQpIGFyZzM7CiAJaW50IGVycm9yID0gLUVCQURGOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAlTT0xEKCJlbnRyeSIpOwogCWxvY2tfa2VybmVsKCk7CiAJaWYoZmQgPj0gTlJfT1BFTikgZ290byBvdXQ7CiAKLQlmaWxwID0gY3VycmVudC0+ZmlsZXMtPmZkW2ZkXTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKTsKKwlmaWxwID0gZmR0LT5mZFtmZF07CiAJaWYoIWZpbHApIGdvdG8gb3V0OwogCiAJaW5vID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWcgYi9hcmNoL3VtL0tjb25maWcKaW5kZXggZjk0NTQ0NC4uNjg0ZTFmOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9LY29uZmlnCisrKyBiL2FyY2gvdW0vS2NvbmZpZwpAQCAtNzMsNyArNzMsNyBAQAogCXRvIENPTkZJR19NT0RFX1RUKS4gIE90aGVyd2lzZSwgaXQgaXMgc2FmZSB0byBzYXkgWS4gIERpc2FibGluZyB0aGlzCiAJb3B0aW9uIHdpbGwgc2hyaW5rIHRoZSBVTUwgYmluYXJ5IHNsaWdodGx5LgogCi1zb3VyY2UgImFyY2gvdW0vS2NvbmZpZ19hcmNoIgorc291cmNlICJhcmNoL3VtL0tjb25maWcuYXJjaCIKIHNvdXJjZSAibW0vS2NvbmZpZyIKIAogY29uZmlnIExEX1NDUklQVF9TVEFUSUMKQEAgLTE5Niw3ICsxOTYsNyBAQAogY29uZmlnIFNNUAogCWJvb2wgIlN5bW1ldHJpYyBtdWx0aS1wcm9jZXNzaW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVmYXVsdCBuCi0JZGVwZW5kcyBvbiBNT0RFX1RUICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gKE1PREVfVFQgJiYgRVhQRVJJTUVOVEFMICYmICFTTVBfQlJPS0VOKSB8fCAoQlJPS0VOICYmIFNNUF9CUk9LRU4pCiAJaGVscAogCVRoaXMgb3B0aW9uIGVuYWJsZXMgVU1MIFNNUCBzdXBwb3J0LgogCUl0IGlzIE5PVCByZWxhdGVkIHRvIGhhdmluZyBhIHJlYWwgU01QIGJveC4gTm90IGRpcmVjdGx5LCBhdCBsZWFzdC4KQEAgLTI3OSw3ICsyNzksNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvYmFzZS9LY29uZmlnIgogCi1zb3VyY2UgImFyY2gvdW0vS2NvbmZpZ19jaGFyIgorc291cmNlICJhcmNoL3VtL0tjb25maWcuY2hhciIKIAogc291cmNlICJkcml2ZXJzL2Jsb2NrL0tjb25maWciCiAKQEAgLTI4Nyw3ICsyODcsNyBAQAogCWJvb2wKIAlkZWZhdWx0IE5FVAogCi1zb3VyY2UgImFyY2gvdW0vS2NvbmZpZ19uZXQiCitzb3VyY2UgImFyY2gvdW0vS2NvbmZpZy5uZXQiCiAKIHNvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIApAQCAtMzExLDcgKzMxMSw3IEBACiAJZGVwZW5kcyBvbiBTQ1NJCiAJZGVmYXVsdCB5CiAKLXNvdXJjZSAiYXJjaC91bS9LY29uZmlnX3Njc2kiCitzb3VyY2UgImFyY2gvdW0vS2NvbmZpZy5zY3NpIgogCiBlbmRtZW51CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZ19jaGFyIGIvYXJjaC91bS9LY29uZmlnLmNoYXIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vS2NvbmZpZ19jaGFyCnJlbmFtZSB0byBhcmNoL3VtL0tjb25maWcuY2hhcgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnLmRlYnVnIGIvYXJjaC91bS9LY29uZmlnLmRlYnVnCmluZGV4IGJkNDFlNDIuLjU2ODFhOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3VtL0tjb25maWcuZGVidWcKQEAgLTIsNiArMiwxNyBAQAogCiBzb3VyY2UgImxpYi9LY29uZmlnLmRlYnVnIgogCitjb25maWcgQ01ETElORV9PTl9IT1NUCisJYm9vbCAiU2hvdyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIG9uIHRoZSBob3N0IGluIFRUIG1vZGUiCisJZGVwZW5kcyBvbiBNT0RFX1RUCisJZGVmYXVsdCAhREVCVUdfSU5GTworCWhlbHAKKwlUaGlzIGNvbnRyb2xzIHdoZXRoZXIgYXJndW1lbnRzIGluIGd1ZXN0IHByb2Nlc3NlcyBzaG91bGQgYmUgc2hvd24gb24KKwl0aGUgaG9zdCdzIHBzIG91dHB1dC4KKwlFbmFibGluZyB0aGlzIG9wdGlvbiBoaW5kZXJzIGRlYnVnZ2luZyBvbiBzb21lIHJlY2VudCBHREIgdmVyc2lvbnMKKwkoYmVjYXVzZSBHREIgZ2V0cyAiY29uZnVzZWQiIHdoZW4gd2UgZG8gYW4gZXhlY3ZwKCkpLiBTbyBwcm9iYWJseSB5b3UKKwlzaG91bGQgZGlzYWJsZSBpdC4KKwogY29uZmlnIFBUX1BST1hZCiAJYm9vbCAiRW5hYmxlIHB0cmFjZSBwcm94eSIKIAlkZXBlbmRzIG9uIFhURVJNX0NIQU4gJiYgREVCVUdfSU5GTyAmJiBNT0RFX1RUCmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWdfaTM4NiBiL2FyY2gvdW0vS2NvbmZpZy5pMzg2CnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIGFyY2gvdW0vS2NvbmZpZ19pMzg2CnJlbmFtZSB0byBhcmNoL3VtL0tjb25maWcuaTM4NgppbmRleCAyN2MxOGE4Li44YWQxNTZhIDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWdfaTM4NgorKysgYi9hcmNoL3VtL0tjb25maWcuaTM4NgpAQCAtNiw2ICs2LDEwIEBACiAJYm9vbAogCWRlZmF1bHQgbgogCitjb25maWcgU0VNQVBIT1JFX1NMRUVQRVJTCisJYm9vbAorCWRlZmF1bHQgeQorCiBjb25maWcgVE9QX0FERFIKICAJaGV4CiAgCWRlZmF1bHQgMHhjMDAwMDAwMCBpZiAhSE9TVF8yR18yRwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnX25ldCBiL2FyY2gvdW0vS2NvbmZpZy5uZXQKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYXJjaC91bS9LY29uZmlnX25ldApyZW5hbWUgdG8gYXJjaC91bS9LY29uZmlnLm5ldAppbmRleCBmYTJhYjJkLi4xNGEwNGViIDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWdfbmV0CisrKyBiL2FyY2gvdW0vS2NvbmZpZy5uZXQKQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgICAgbGluayB3aXRoIHRoZSBob3N0LgogCiAgICAgICAgIFRvIHVzZSB0aGlzLCB5b3VyIGhvc3Qga2VybmVsIG11c3QgaGF2ZSBzdXBwb3J0IGZvciBFdGhlcnRhcAotICAgICAgICBkZXZpY2VzLiAgQWxzbywgaWYgeW91ciBob3N0IGtlcm5lbCBpcyAyLjQueCwgaXQgbXVzdCBoYXZlIAorICAgICAgICBkZXZpY2VzLiAgQWxzbywgaWYgeW91ciBob3N0IGtlcm5lbCBpcyAyLjQueCwgaXQgbXVzdCBoYXZlCiAgICAgICAgIENPTkZJR19ORVRMSU5LX0RFViBjb25maWd1cmVkIGFzIFkgb3IgTS4KIAogICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICAgIG5ldHdvcmtpbmcuCiAKICAgICAgICAgSWYgeW91J2QgbGlrZSB0byBzZXQgdXAgYW4gSVAgbmV0d29yayB3aXRoIHRoZSBob3N0IGFuZC9vciB0aGUKLSAgICAgICAgb3V0c2lkZSB3b3JsZCwgc2F5IFkgdG8gdGhpcywgdGhlIERhZW1vbiBUcmFuc3BvcnQgYW5kL29yIHRoZSAKKyAgICAgICAgb3V0c2lkZSB3b3JsZCwgc2F5IFkgdG8gdGhpcywgdGhlIERhZW1vbiBUcmFuc3BvcnQgYW5kL29yIHRoZQogICAgICAgICBTbGlwIFRyYW5zcG9ydC4gIFlvdSdsbCBuZWVkIGF0IGxlYXN0IG9uZSBvZiB0aGVtLCBidXQgbWF5IGNob29zZQogICAgICAgICBtb3JlIHRoYW4gb25lIHdpdGhvdXQgY29uZmxpY3QuICBJZiB5b3UgZG9uJ3QgbmVlZCBVTUwgbmV0d29ya2luZywKICAgICAgICAgc2F5IE4uCkBAIC03OCw3ICs3OCw3IEBACiAKICAgICAgICAgVGhlIEV0aGVydGFwIFRyYW5zcG9ydCBpcyBwcmVmZXJyZWQgb3ZlciBzbGlwIGJlY2F1c2Ugb2YgaXRzCiAgICAgICAgIGxpbWl0YXRpb25zLiAgSWYgeW91IHByZWZlciBzbGlwLCBob3dldmVyLCBzYXkgWSBoZXJlLiAgT3RoZXJ3aXNlCi0gICAgICAgIGNob29zZSB0aGUgTXVsdGljYXN0IHRyYW5zcG9ydCAodG8gbmV0d29yayBtdWx0aXBsZSBVTUxzIG9uIAorICAgICAgICBjaG9vc2UgdGhlIE11bHRpY2FzdCB0cmFuc3BvcnQgKHRvIG5ldHdvcmsgbXVsdGlwbGUgVU1McyBvbgogICAgICAgICBtdWx0aXBsZSBob3N0cyksIEV0aGVydGFwICh0byBuZXR3b3JrIHdpdGggdGhlIGhvc3QgYW5kIHRoZQogICAgICAgICBvdXRzaWRlIHdvcmxkKSwgYW5kL29yIHRoZSBEYWVtb24gdHJhbnNwb3J0ICh0byBuZXR3b3JrIG11bHRpcGxlCiAgICAgICAgIFVNTHMgb24gYSBzaW5nbGUgaG9zdCkuICBZb3UgbWF5IGNob29zZSBtb3JlIHRoYW4gb25lIHdpdGhvdXQKQEAgLTEzOCw3ICsxMzgsNyBAQAogCWRlcGVuZHMgb24gVU1MX05FVCAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJVGhlIHBjYXAgdHJhbnNwb3J0IG1ha2VzIGEgcGNhcCBwYWNrZXQgc3RyZWFtIG9uIHRoZSBob3N0IGxvb2sKLQlsaWtlIGFuIGV0aGVybmV0IGRldmljZSBpbnNpZGUgVU1MLiAgVGhpcyBpcyB1c2VmdWwgZm9yIG1ha2luZyAKKwlsaWtlIGFuIGV0aGVybmV0IGRldmljZSBpbnNpZGUgVU1MLiAgVGhpcyBpcyB1c2VmdWwgZm9yIG1ha2luZwogCVVNTCBhY3QgYXMgYSBuZXR3b3JrIG1vbml0b3IgZm9yIHRoZSBob3N0LiAgWW91IG11c3QgaGF2ZSBsaWJjYXAKIAlpbnN0YWxsZWQgaW4gb3JkZXIgdG8gYnVpbGQgdGhlIHBjYXAgdHJhbnNwb3J0IGludG8gVU1MLgogCkBAIC0xNjksMTEgKzE2OSwxMSBAQAogICAgICAgICBzZXR1cCBzdHJpbmcuICBUaGUgZWZmZWN0IG9mIHRoaXMgdHJhbnNwb3J0IG9uIHRoZSBVTUwgaXMgc2ltaWxhcgogICAgICAgICB0aGF0IG9mIGEgaG9zdCBiZWhpbmQgYSBmaXJld2FsbCB0aGF0IG1hc3F1ZXJhZGVzIGFsbCBuZXR3b3JrCiAgICAgICAgIGNvbm5lY3Rpb25zIHBhc3NpbmcgdGhyb3VnaCBpdCAoYnV0IGlzIGxlc3Mgc2VjdXJlKS4KLQkKKwogICAgICAgICBUbyB1c2UgdGhpcyB5b3Ugc2hvdWxkIGZpcnN0IGhhdmUgc2xpcnAgY29tcGlsZWQgc29tZXdoZXJlCiAgICAgICAgIGFjY2Vzc2libGUgb24gdGhlIGhvc3QsIGFuZCBoYXZlIHJlYWQgaXRzIGRvY3VtZW50YXRpb24uICBJZiB5b3UKICAgICAgICAgZG9uJ3QgbmVlZCBVTUwgbmV0d29ya2luZywgc2F5IE4uCi0JCisKICAgICAgICAgU3RhcnR1cCBleGFtcGxlOiAiZXRoMD1zbGlycCxGRTpGRDowMTowMjowMzowNCwvdXNyL2xvY2FsL2Jpbi9zbGlycCIKIAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnX3Njc2kgYi9hcmNoL3VtL0tjb25maWcuc2NzaQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9LY29uZmlnX3Njc2kKcmVuYW1lIHRvIGFyY2gvdW0vS2NvbmZpZy5zY3NpCmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWdfeDg2XzY0IGIvYXJjaC91bS9LY29uZmlnLng4Nl82NApzaW1pbGFyaXR5IGluZGV4IDgyJQpyZW5hbWUgZnJvbSBhcmNoL3VtL0tjb25maWdfeDg2XzY0CnJlbmFtZSB0byBhcmNoL3VtL0tjb25maWcueDg2XzY0CmluZGV4IDczNWEwNDcuLmJkMzVlNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZ194ODZfNjQKKysrIGIvYXJjaC91bS9LY29uZmlnLng4Nl82NApAQCAtNiw2ICs2LDEwIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgU0VNQVBIT1JFX1NMRUVQRVJTCisJYm9vbAorCWRlZmF1bHQgeQorCiBjb25maWcgVE9QX0FERFIKICAJaGV4CiAJZGVmYXVsdCAweDgwMDAwMDAwCkBAIC0zMywzICszNyw3IEBACiBjb25maWcgQVJDSF9SRVVTRV9IT1NUX1ZTWVNDQUxMX0FSRUEKIAlib29sCiAJZGVmYXVsdCBuCisKK2NvbmZpZyBTTVBfQlJPS0VOCisJYm9vbAorCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZSBiL2FyY2gvdW0vTWFrZWZpbGUKaW5kZXggZjVhODNhNy4uMTU0ODAzYSAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZQorKysgYi9hcmNoL3VtL01ha2VmaWxlCkBAIC01Niw2ICs1Niw3IEBACiAKIENGTEFHUyArPSAkKENGTEFHUy15KSAtRF9fYXJjaF91bV9fIC1EU1VCQVJDSD1cIiQoU1VCQVJDSClcIiBcCiAJJChBUkNIX0lOQ0xVREUpICQoTU9ERV9JTkNMVURFKSAtRHZtYXA9a2VybmVsX3ZtYXAKK0FGTEFHUyArPSAkKEFSQ0hfSU5DTFVERSkKIAogVVNFUl9DRkxBR1MgOj0gJChwYXRzdWJzdCAtSSUsLCQoQ0ZMQUdTKSkKIFVTRVJfQ0ZMQUdTIDo9ICQocGF0c3Vic3QgLURfX0tFUk5FTF9fLCwkKFVTRVJfQ0ZMQUdTKSkgJChBUkNIX0lOQ0xVREUpIFwKQEAgLTEwMSwxMCArMTAyLDkgQEAKIGVuZGVmCiAKIGlmbmVxICgkKEtCVUlMRF9TUkMpLCkKLSQoc2hlbGwgbWtkaXIgLXAgJChBUkNIX0RJUikgJiYgbG4gLWZzbiAkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL0tjb25maWdfJChTVUJBUkNIKSAkKEFSQ0hfRElSKS9LY29uZmlnX2FyY2gpCi1DTEVBTl9GSUxFUyArPSAkKEFSQ0hfRElSKS9LY29uZmlnX2FyY2gKKyQoc2hlbGwgbWtkaXIgLXAgJChBUkNIX0RJUikgJiYgbG4gLWZzbiAkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL0tjb25maWcuJChTVUJBUkNIKSAkKEFSQ0hfRElSKS9LY29uZmlnLmFyY2gpCiBlbHNlCi0kKHNoZWxsIGNkICQoQVJDSF9ESVIpICYmIGxuIC1zZiBLY29uZmlnXyQoU1VCQVJDSCkgS2NvbmZpZ19hcmNoKQorJChzaGVsbCBjZCAkKEFSQ0hfRElSKSAmJiBsbiAtc2YgS2NvbmZpZy4kKFNVQkFSQ0gpIEtjb25maWcuYXJjaCkKIGVuZGlmCiAKIHByZXBhcmU6ICQoQVJDSF9TWU1MSU5LUykgJChTWVNfSEVBREVSUykgJChHRU5fSEVBREVSUykKQEAgLTE0MywxNCArMTQzLDE0IEBACiAjVFQgb3Igc2thcyBtYWtlZmlsZXMgYW5kIGRvbid0IGNsZWFuIHNrYXNfcHRyZWdzLmguCiBDTEVBTl9GSUxFUyArPSBsaW51eCB4LmkgZ21vbi5vdXQgJChBUkNIX0RJUikvaW5jbHVkZS91bWwtY29uZmlnLmggXAogCSQoR0VOX0hFQURFUlMpICQoQVJDSF9ESVIpL2luY2x1ZGUvc2thc19wdHJlZ3MuaCBcCi0JJChBUkNIX0RJUikvaW5jbHVkZS91c2VyX2NvbnN0YW50cy5oCisJJChBUkNIX0RJUikvaW5jbHVkZS91c2VyX2NvbnN0YW50cy5oICQoQVJDSF9ESVIpL0tjb25maWcuYXJjaAogCiBNUlBST1BFUl9GSUxFUyArPSAkKFNZTUxJTktfSEVBREVSUykgJChBUkNIX1NZTUxJTktTKSBcCi0JJChhZGRwcmVmaXggJChBUkNIX0RJUikva2VybmVsLywkKEtFUk5fU1lNTElOS1MpKSAkKEFSQ0hfRElSKS9vcyBcCi0JJChBUkNIX0RJUikvS2NvbmZpZ19hcmNoCisJJChhZGRwcmVmaXggJChBUkNIX0RJUikva2VybmVsLywkKEtFUk5fU1lNTElOS1MpKSAkKEFSQ0hfRElSKS9vcwogCiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChBUkNIX0RJUikvdXRpbAorCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoQVJDSF9ESVIpL29zLSQoT1MpL3V0aWwKIAlAZmluZCAuIFwoIC1uYW1lICcqLmJiJyAtbyAtbmFtZSAnKi5iYmcnIC1vIC1uYW1lICcqLmRhJyBcCiAJCS1vIC1uYW1lICcqLmdjb3YnIFwpIC10eXBlIGYgLXByaW50IHwgeGFyZ3Mgcm0gLWYKIApAQCAtMTk2LDYgKzE5NiwyMiBAQAogCXNlZCAncy8gQ09ORklHLyBVTUxfQ09ORklHLycKIGVuZGVmCiAKK2RlZmluZSBmaWxlY2hrX2dlbi1hc20tb2Zmc2V0cworICAgICAgICAoc2V0IC1lOyBcCisgICAgICAgICBlY2hvICIjaWZuZGVmIF9fQVNNX09GRlNFVFNfSF9fIjsgXAorICAgICAgICAgZWNobyAiI2RlZmluZSBfX0FTTV9PRkZTRVRTX0hfXyI7IFwKKyAgICAgICAgIGVjaG8gIi8qIjsgXAorICAgICAgICAgZWNobyAiICogRE8gTk9UIE1PRElGWS4iOyBcCisgICAgICAgICBlY2hvICIgKiI7IFwKKyAgICAgICAgIGVjaG8gIiAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFyY2gvJChBUkNIKS9NYWtlZmlsZSI7IFwKKyAgICAgICAgIGVjaG8gIiAqIjsgXAorICAgICAgICAgZWNobyAiICovIjsgXAorICAgICAgICAgZWNobyAiIjsgXAorICAgICAgICAgc2VkIC1uZSAiL14tPi97czpeLT5cKFteIF0qXCkgW1wkJCNdKlwoW14gXSpcKSBcKC4qXCk6I2RlZmluZSBcMSBcMiAvKiBcMyAqLzo7IHM6LT46OjsgcDt9IjsgXAorICAgICAgICAgZWNobyAiIjsgXAorICAgICAgICAgZWNobyAiI2VuZGlmIiApCitlbmRlZgorCiAkKEFSQ0hfRElSKS9pbmNsdWRlL3VtbC1jb25maWcuaCA6IGluY2x1ZGUvbGludXgvYXV0b2NvbmYuaAogCSQoY2FsbCBmaWxlY2hrLHVtbGNvbmZpZykKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZS1pMzg2IGIvYXJjaC91bS9NYWtlZmlsZS1pMzg2CmluZGV4IGE3NzdlNTcuLjFhYjQzMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vTWFrZWZpbGUtaTM4NgorKysgYi9hcmNoL3VtL01ha2VmaWxlLWkzODYKQEAgLTI3LDcgKzI3LDcgQEAKIGVuZGlmCiBlbmRpZgogCi1DRkxBR1MgKz0gLVVfXyQoU1VCQVJDSClfXyAtVSQoU1VCQVJDSCkgJChTVFVCX0NGTEFHUykKK0NGTEFHUyArPSAtVV9fJChTVUJBUkNIKV9fIC1VJChTVUJBUkNIKQogCiBpZm5lcSAoJChDT05GSUdfR1BST0YpLHkpCiBBUkNIX0NGTEFHUyArPSAtRFVNX0ZBU1RDQUxMCmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NCBiL2FyY2gvdW0vTWFrZWZpbGUteDg2XzY0CmluZGV4IGFhMmY3MTcuLjQzNmFiYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vTWFrZWZpbGUteDg2XzY0CisrKyBiL2FyY2gvdW0vTWFrZWZpbGUteDg2XzY0CkBAIC02LDggKzYsOSBAQAogCiAjV2UgI3VuZGVmIF9feDg2XzY0X18gZm9yIGtlcm5lbHNwYWNlLCBub3QgZm9yIHVzZXJzcGFjZSB3aGVyZQogI2l0J3MgbmVlZGVkIGZvciBoZWFkZXJzIHRvIHdvcmshCi1DRkxBR1MgKz0gLVVfXyQoU1VCQVJDSClfXyAtZm5vLWJ1aWx0aW4gJChTVFVCX0NGTEFHUykKK0NGTEFHUyArPSAtVV9fJChTVUJBUkNIKV9fIC1mbm8tYnVpbHRpbgogVVNFUl9DRkxBR1MgKz0gLWZuby1idWlsdGluCitDSEVDS0ZMQUdTICArPSAtbTY0CiAKIEVMRl9BUkNIIDo9IGkzODY6eDg2LTY0CiBFTEZfRk9STUFUIDo9IGVsZjY0LXg4Ni02NApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL01ha2VmaWxlIGIvYXJjaC91bS9kcml2ZXJzL01ha2VmaWxlCmluZGV4IGRlMTdkNGMuLjc4M2UxOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9NYWtlZmlsZQorKysgYi9hcmNoL3VtL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDcgQEAKIG5ldC1vYmpzIDo9IG5ldF9rZXJuLm8gbmV0X3VzZXIubwogbWNvbnNvbGUtb2JqcyA6PSBtY29uc29sZV9rZXJuLm8gbWNvbnNvbGVfdXNlci5vCiBob3N0YXVkaW8tb2JqcyA6PSBob3N0YXVkaW9fa2Vybi5vCi11YmQtb2JqcyA6PSB1YmRfa2Vybi5vIHViZF91c2VyLm8KK3ViZC1vYmpzIDo9IHViZF9rZXJuLm8KIHBvcnQtb2JqcyA6PSBwb3J0X2tlcm4ubyBwb3J0X3VzZXIubwogaGFyZGRvZy1vYmpzIDo9IGhhcmRkb2dfa2Vybi5vIGhhcmRkb2dfdXNlci5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYwppbmRleCA1ZDM3NjgxLi5kZTNiY2U3IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jCkBAIC02Myw3ICs2Myw3IEBACiAgKgogICogU0lHV0lOQ0ggY2FuJ3QgYmUgcmVjZWl2ZWQgc3luY2hyb25vdXNseSwgc28geW91IGhhdmUgdG8gc2V0IHVwIHRvIHJlY2VpdmUgaXQKICAqIGFzIGEgc2lnbmFsLiAgVGhhdCBiZWluZyB0aGUgY2FzZSwgaWYgeW91IGFyZSBnb2luZyB0byB3YWl0IGZvciBpdCwgaXQgaXMKLSAqIGNvbnZlbmllbnQgdG8gc2l0IGluIGEgcGF1c2UoKSBhbmQgd2FpdCBmb3IgdGhlIHNpZ25hbCB0byBib3VuY2UgeW91IG91dCBvZgorICogY29udmVuaWVudCB0byBzaXQgaW4gc2lnc3VzcGVuZCgpIGFuZCB3YWl0IGZvciB0aGUgc2lnbmFsIHRvIGJvdW5jZSB5b3Ugb3V0IG9mCiAgKiBpdCAoc2VlIGJlbG93IGZvciBob3cgd2UgbWFrZSBzdXJlIHRvIGV4aXQgb25seSBvbiBTSUdXSU5DSCkuCiAgKi8KIApAQCAtOTQsMTggKzk0LDE5IEBACiAJCSAgICAgICAiYnl0ZSwgZXJyID0gJWRcbiIsIC1jb3VudCk7CiAKIAkvKiBXZSBhcmUgbm90IHVzaW5nIFNJR19JR04gb24gcHVycG9zZSwgc28gZG9uJ3QgZml4IGl0IGFzIEkgdGhvdWdodCB0bwotCSAqIGRvISBJZiB1c2luZyBTSUdfSUdOLCB0aGUgcGF1c2UoKSBjYWxsIGJlbG93IHdvdWxkIG5vdCBzdG9wIG9uCisJICogZG8hIElmIHVzaW5nIFNJR19JR04sIHRoZSBzaWdzdXNwZW5kKCkgY2FsbCBiZWxvdyB3b3VsZCBub3Qgc3RvcCBvbgogCSAqIFNJR1dJTkNILiAqLwogCiAJc2lnbmFsKFNJR1dJTkNILCB3aW5jaF9oYW5kbGVyKTsKIAlzaWdmaWxsc2V0KCZzaWdzKTsKLQlzaWdkZWxzZXQoJnNpZ3MsIFNJR1dJTkNIKTsKLQkvKiBCbG9jayBhbnl0aGluZyBlbHNlIHRoYW4gU0lHV0lOQ0guICovCisJLyogQmxvY2sgYWxsIHNpZ25hbHMgcG9zc2libGUuICovCiAJaWYoc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZzaWdzLCBOVUxMKSA8IDApewogCQlwcmludGsoIndpbmNoX3RocmVhZCA6IHNpZ3Byb2NtYXNrIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgCiAJCSAgICAgICBlcnJubyk7CiAJCWV4aXQoMSk7CiAJfQorCS8qIEluIHNpZ3N1c3BlbmQoKSwgYmxvY2sgYW55dGhpbmcgZWxzZSB0aGFuIFNJR1dJTkNILiAqLworCXNpZ2RlbHNldCgmc2lncywgU0lHV0lOQ0gpOwogCiAJaWYoc2V0c2lkKCkgPCAwKXsKIAkJcHJpbnRrKCJ3aW5jaF90aHJlYWQgOiBzZXRzaWQgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCBlcnJubyk7CkBAIC0xMzAsNyArMTMxLDcgQEAKIAl3aGlsZSgxKXsKIAkJLyogVGhpcyB3aWxsIGJlIGludGVycnVwdGVkIGJ5IFNJR1dJTkNIIG9ubHksIHNpbmNlIG90aGVyIHNpZ25hbHMKIAkJICogYXJlIGJsb2NrZWQuKi8KLQkJcGF1c2UoKTsKKwkJc2lnc3VzcGVuZCgmc2lncyk7CiAKIAkJY291bnQgPSBvc193cml0ZV9maWxlKHBpcGVfZmQsICZjLCBzaXplb2YoYykpOwogCQlpZihjb3VudCAhPSBzaXplb2YoYykpCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCmluZGV4IDM0NGIyNGQuLmU3N2EzOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAibGludXgvYmxrcGcuaCIKICNpbmNsdWRlICJsaW51eC9nZW5oZC5oIgogI2luY2x1ZGUgImxpbnV4L3NwaW5sb2NrLmgiCisjaW5jbHVkZSAiYXNtL2F0b21pYy5oIgogI2luY2x1ZGUgImFzbS9zZWdtZW50LmgiCiAjaW5jbHVkZSAiYXNtL3VhY2Nlc3MuaCIKICNpbmNsdWRlICJhc20vaXJxLmgiCkBAIC01MywyMCArNTQsMjEgQEAKICNpbmNsdWRlICJtZW0uaCIKICNpbmNsdWRlICJtZW1fa2Vybi5oIgogI2luY2x1ZGUgImNvdy5oIgorI2luY2x1ZGUgImFpby5oIgogCiBlbnVtIHViZF9yZXEgeyBVQkRfUkVBRCwgVUJEX1dSSVRFIH07CiAKIHN0cnVjdCBpb190aHJlYWRfcmVxIHsKLQllbnVtIHViZF9yZXEgb3A7CisJZW51bSBhaW9fdHlwZSBvcDsKIAlpbnQgZmRzWzJdOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0c1syXTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOwogCWNoYXIgKmJ1ZmZlcjsKIAlpbnQgc2VjdG9yc2l6ZTsKLQl1bnNpZ25lZCBsb25nIHNlY3Rvcl9tYXNrOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBjb3dfb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgYml0bWFwX3dvcmRzWzJdOworCWludCBiaXRtYXBfb2Zmc2V0OworCWxvbmcgYml0bWFwX3N0YXJ0OworCWxvbmcgYml0bWFwX2VuZDsKIAlpbnQgZXJyb3I7CiB9OwogCkBAIC04MCwyOCArODIsMzEgQEAKIAkJCSAgIHVuc2lnbmVkIGxvbmcgKmJpdG1hcF9sZW5fb3V0LAogCQkJICAgaW50ICpkYXRhX29mZnNldF9vdXQpOwogZXh0ZXJuIGludCByZWFkX2Nvd19iaXRtYXAoaW50IGZkLCB2b2lkICpidWYsIGludCBvZmZzZXQsIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgZG9faW8oc3RydWN0IGlvX3RocmVhZF9yZXEgKnJlcSk7CitleHRlcm4gdm9pZCBkb19pbyhzdHJ1Y3QgaW9fdGhyZWFkX3JlcSAqcmVxLCBzdHJ1Y3QgcmVxdWVzdCAqciwKKwkJICB1bnNpZ25lZCBsb25nICpiaXRtYXApOwogCi1zdGF0aWMgaW5saW5lIGludCB1YmRfdGVzdF9iaXQoX191NjQgYml0LCB1bnNpZ25lZCBjaGFyICpkYXRhKQorc3RhdGljIGlubGluZSBpbnQgdWJkX3Rlc3RfYml0KF9fdTY0IGJpdCwgdm9pZCAqZGF0YSkKIHsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBkYXRhOwogCV9fdTY0IG47CiAJaW50IGJpdHMsIG9mZjsKIAotCWJpdHMgPSBzaXplb2YoZGF0YVswXSkgKiA4OworCWJpdHMgPSBzaXplb2YoYnVmZmVyWzBdKSAqIDg7CiAJbiA9IGJpdCAvIGJpdHM7CiAJb2ZmID0gYml0ICUgYml0czsKLQlyZXR1cm4oKGRhdGFbbl0gJiAoMSA8PCBvZmYpKSAhPSAwKTsKKwlyZXR1cm4oKGJ1ZmZlcltuXSAmICgxIDw8IG9mZikpICE9IDApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdWJkX3NldF9iaXQoX191NjQgYml0LCB1bnNpZ25lZCBjaGFyICpkYXRhKQorc3RhdGljIGlubGluZSB2b2lkIHViZF9zZXRfYml0KF9fdTY0IGJpdCwgdm9pZCAqZGF0YSkKIHsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBkYXRhOwogCV9fdTY0IG47CiAJaW50IGJpdHMsIG9mZjsKIAotCWJpdHMgPSBzaXplb2YoZGF0YVswXSkgKiA4OworCWJpdHMgPSBzaXplb2YoYnVmZmVyWzBdKSAqIDg7CiAJbiA9IGJpdCAvIGJpdHM7CiAJb2ZmID0gYml0ICUgYml0czsKLQlkYXRhW25dIHw9ICgxIDw8IG9mZik7CisJYnVmZmVyW25dIHw9ICgxIDw8IG9mZik7CiB9CiAvKkVuZCBzdHVmZiBmcm9tIHViZF91c2VyLmgqLwogCkBAIC0xMTAsOCArMTE1LDYgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodWJkX2lvX2xvY2spOwogc3RhdGljIERFRklORV9TUElOTE9DSyh1YmRfbG9jayk7CiAKLXN0YXRpYyB2b2lkICgqZG9fdWJkKSh2b2lkKTsKLQogc3RhdGljIGludCB1YmRfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKIHN0YXRpYyBpbnQgdWJkX3JlbGVhc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSk7CiBzdGF0aWMgaW50IHViZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLApAQCAtMTU4LDYgKzE2MSw4IEBACiAgICAgICAgIGludCBkYXRhX29mZnNldDsKIH07CiAKKyNkZWZpbmUgTUFYX1NHIDY0CisKIHN0cnVjdCB1YmQgewogCWNoYXIgKmZpbGU7CiAJaW50IGNvdW50OwpAQCAtMTY4LDYgKzE3Myw3IEBACiAJaW50IG5vX2NvdzsKIAlzdHJ1Y3QgY293IGNvdzsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBkZXY7CisgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCBzZ1tNQVhfU0ddOwogfTsKIAogI2RlZmluZSBERUZBVUxUX0NPVyB7IFwKQEAgLTQ2MCw4MSArNDY2LDExNCBAQAogKTsKIAogc3RhdGljIHZvaWQgZG9fdWJkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICogcSk7Ci0KLS8qIE9ubHkgY2hhbmdlZCBieSB1YmRfaW5pdCwgd2hpY2ggaXMgYW4gaW5pdGNhbGwuICovCi1pbnQgdGhyZWFkX2ZkID0gLTE7CitzdGF0aWMgaW50IGluX3ViZDsKIAogLyogQ2hhbmdlZCBieSB1YmRfaGFuZGxlciwgd2hpY2ggaXMgc2VyaWFsaXplZCBiZWNhdXNlIGludGVycnVwdHMgb25seQogICogaGFwcGVuIG9uIENQVSAwLgogICovCiBpbnQgaW50cl9jb3VudCA9IDA7CiAKK3N0YXRpYyB2b2lkIHViZF9lbmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgYnl0ZXMsIGludCB1cHRvZGF0ZSkKK3sKKwlpZiAoIWVuZF90aGF0X3JlcXVlc3RfZmlyc3QocmVxLCB1cHRvZGF0ZSwgYnl0ZXMgPj4gOSkpIHsKKwkJYWRkX2Rpc2tfcmFuZG9tbmVzcyhyZXEtPnJxX2Rpc2spOworCQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocmVxKTsKKwl9Cit9CisKIC8qIGNhbGwgdWJkX2ZpbmlzaCBpZiB5b3UgbmVlZCB0byBzZXJpYWxpemUgKi8KLXN0YXRpYyB2b2lkIF9fdWJkX2ZpbmlzaChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgZXJyb3IpCitzdGF0aWMgdm9pZCBfX3ViZF9maW5pc2goc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IGJ5dGVzKQogewotCWludCBuc2VjdDsKKwlpZihieXRlcyA8IDApeworCQl1YmRfZW5kX3JlcXVlc3QocmVxLCAwLCAwKTsKKyAgCQlyZXR1cm47CisgIAl9CiAKLQlpZihlcnJvcil7Ci0JCWVuZF9yZXF1ZXN0KHJlcSwgMCk7Ci0JCXJldHVybjsKLQl9Ci0JbnNlY3QgPSByZXEtPmN1cnJlbnRfbnJfc2VjdG9yczsKLQlyZXEtPnNlY3RvciArPSBuc2VjdDsKLQlyZXEtPmJ1ZmZlciArPSBuc2VjdCA8PCA5OwotCXJlcS0+ZXJyb3JzID0gMDsKLQlyZXEtPm5yX3NlY3RvcnMgLT0gbnNlY3Q7Ci0JcmVxLT5jdXJyZW50X25yX3NlY3RvcnMgPSAwOwotCWVuZF9yZXF1ZXN0KHJlcSwgMSk7CisJdWJkX2VuZF9yZXF1ZXN0KHJlcSwgYnl0ZXMsIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdWJkX2ZpbmlzaChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgZXJyb3IpCitzdGF0aWMgaW5saW5lIHZvaWQgdWJkX2ZpbmlzaChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgYnl0ZXMpCiB7Ci0gCXNwaW5fbG9jaygmdWJkX2lvX2xvY2spOwotCV9fdWJkX2ZpbmlzaChyZXEsIGVycm9yKTsKLQlzcGluX3VubG9jaygmdWJkX2lvX2xvY2spOworICAgCXNwaW5fbG9jaygmdWJkX2lvX2xvY2spOworCV9fdWJkX2ZpbmlzaChyZXEsIGJ5dGVzKTsKKyAgCXNwaW5fdW5sb2NrKCZ1YmRfaW9fbG9jayk7CiB9CiAKLS8qIENhbGxlZCB3aXRob3V0IHViZF9pb19sb2NrIGhlbGQgKi8KLXN0YXRpYyB2b2lkIHViZF9oYW5kbGVyKHZvaWQpCi17Ci0Jc3RydWN0IGlvX3RocmVhZF9yZXEgcmVxOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGVsdl9uZXh0X3JlcXVlc3QodWJkX3F1ZXVlKTsKLQlpbnQgbjsKK3N0cnVjdCBiaXRtYXBfaW8geworICAgICAgICBhdG9taWNfdCBjb3VudDsKKyAgICAgICAgc3RydWN0IGFpb19jb250ZXh0IGFpbzsKK307CiAKLQlkb191YmQgPSBOVUxMOwotCWludHJfY291bnQrKzsKLQluID0gb3NfcmVhZF9maWxlKHRocmVhZF9mZCwgJnJlcSwgc2l6ZW9mKHJlcSkpOwotCWlmKG4gIT0gc2l6ZW9mKHJlcSkpewotCQlwcmludGsoS0VSTl9FUlIgIlBpZCAlZCAtIHNwdXJpb3VzIGludGVycnVwdCBpbiB1YmRfaGFuZGxlciwgIgotCQkgICAgICAgImVyciA9ICVkXG4iLCBvc19nZXRwaWQoKSwgLW4pOwotCQlzcGluX2xvY2soJnViZF9pb19sb2NrKTsKLQkJZW5kX3JlcXVlc3QocnEsIDApOwotCQlzcGluX3VubG9jaygmdWJkX2lvX2xvY2spOwotCQlyZXR1cm47Ci0JfQotICAgICAgICAKLQl1YmRfZmluaXNoKHJxLCByZXEuZXJyb3IpOwotCXJlYWN0aXZhdGVfZmQodGhyZWFkX2ZkLCBVQkRfSVJRKTsJCi0JZG9fdWJkX3JlcXVlc3QodWJkX3F1ZXVlKTsKLX0KK3N0cnVjdCB1YmRfYWlvIHsKKyAgICAgICAgc3RydWN0IGFpb19jb250ZXh0IGFpbzsKKyAgICAgICAgc3RydWN0IHJlcXVlc3QgKnJlcTsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgc3RydWN0IGJpdG1hcF9pbyAqYml0bWFwOworICAgICAgICB2b2lkICpiaXRtYXBfYnVmOworfTsKKworc3RhdGljIGludCB1YmRfcmVwbHlfZmQgPSAtMTsKIAogc3RhdGljIGlycXJldHVybl90IHViZF9pbnRyKGludCBpcnEsIHZvaWQgKmRldiwgc3RydWN0IHB0X3JlZ3MgKnVudXNlZCkKIHsKLQl1YmRfaGFuZGxlcigpOworCXN0cnVjdCBhaW9fdGhyZWFkX3JlcGx5IHJlcGx5OworCXN0cnVjdCB1YmRfYWlvICphaW87CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKwlpbnQgZXJyLCBuLCBmZCA9IChpbnQpIChsb25nKSBkZXY7CisKKwl3aGlsZSgxKXsKKwkJZXJyID0gb3NfcmVhZF9maWxlKGZkLCAmcmVwbHksIHNpemVvZihyZXBseSkpOworCQlpZihlcnIgPT0gLUVBR0FJTikKKwkJCWJyZWFrOworCQlpZihlcnIgPCAwKXsKKwkJCXByaW50aygidWJkX2Fpb19oYW5kbGVyIC0gcmVhZCByZXR1cm5lZCBlcnIgJWRcbiIsCisJCQkgICAgICAgLWVycik7CisJCQlicmVhazsKKwkJfQorCisgICAgICAgICAgICAgICAgYWlvID0gY29udGFpbmVyX29mKHJlcGx5LmRhdGEsIHN0cnVjdCB1YmRfYWlvLCBhaW8pOworICAgICAgICAgICAgICAgIG4gPSByZXBseS5lcnI7CisKKwkJaWYobiA9PSAwKXsKKwkJCXJlcSA9IGFpby0+cmVxOworCQkJcmVxLT5ucl9zZWN0b3JzIC09IGFpby0+bGVuID4+IDk7CisKKwkJCWlmKChhaW8tPmJpdG1hcCAhPSBOVUxMKSAmJgorCQkJICAgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmFpby0+Yml0bWFwLT5jb3VudCkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlvLT5haW8gPSBhaW8tPmJpdG1hcC0+YWlvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaW8tPmxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGFpby0+Yml0bWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlvLT5iaXRtYXAgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRfYWlvKCZhaW8tPmFpbyk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZigocmVxLT5ucl9zZWN0b3JzID09IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhaW8tPmJpdG1hcCA9PSBOVUxMKSl7CisJCQkJCWludCBsZW4gPSByZXEtPmhhcmRfbnJfc2VjdG9ycyA8PCA5OworCQkJCQl1YmRfZmluaXNoKHJlcSwgbGVuKTsKKwkJCQl9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWlvLT5iaXRtYXBfYnVmICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUoYWlvLT5iaXRtYXBfYnVmKTsKKwkJCQlrZnJlZShhaW8pOworCQkJfQorCQl9CisgICAgICAgICAgICAgICAgZWxzZSBpZihuIDwgMCl7CisgICAgICAgICAgICAgICAgICAgICAgICB1YmRfZmluaXNoKGFpby0+cmVxLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFpby0+Yml0bWFwICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGFpby0+Yml0bWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFpby0+Yml0bWFwX2J1ZiAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShhaW8tPmJpdG1hcF9idWYpOworICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUoYWlvKTsKKyAgICAgICAgICAgICAgICB9CisJfQorCXJlYWN0aXZhdGVfZmQoZmQsIFVCRF9JUlEpOworCisgICAgICAgIGRvX3ViZF9yZXF1ZXN0KHViZF9xdWV1ZSk7CisKIAlyZXR1cm4oSVJRX0hBTkRMRUQpOwogfQogCi0vKiBPbmx5IGNoYW5nZWQgYnkgdWJkX2luaXQsIHdoaWNoIGlzIGFuIGluaXRjYWxsLiAqLwotc3RhdGljIGludCBpb19waWQgPSAtMTsKLQotdm9pZCBraWxsX2lvX3RocmVhZCh2b2lkKQotewotCWlmKGlvX3BpZCAhPSAtMSkgCi0JCW9zX2tpbGxfcHJvY2Vzcyhpb19waWQsIDEpOwotfQotCi1fX3VtbF9leGl0Y2FsbChraWxsX2lvX3RocmVhZCk7Ci0KIHN0YXRpYyBpbnQgdWJkX2ZpbGVfc2l6ZShzdHJ1Y3QgdWJkICpkZXYsIF9fdTY0ICpzaXplX291dCkKIHsKIAljaGFyICpmaWxlOwpAQCAtNTY5LDcgKzYwOCw3IEBACiAJCQkJJmRldi0+Y293LmRhdGFfb2Zmc2V0LCBjcmVhdGVfcHRyKTsKIAogCWlmKChkZXYtPmZkID09IC1FTk9FTlQpICYmIGNyZWF0ZV9jb3cpewotCQlkZXYtPmZkID0gY3JlYXRlX2Nvd19maWxlKGRldi0+ZmlsZSwgZGV2LT5jb3cuZmlsZSwgCisJCWRldi0+ZmQgPSBjcmVhdGVfY293X2ZpbGUoZGV2LT5maWxlLCBkZXYtPmNvdy5maWxlLAogCQkJCQkgIGRldi0+b3BlbmZsYWdzLCAxIDw8IDksIFBBR0VfU0laRSwKIAkJCQkJICAmZGV2LT5jb3cuYml0bWFwX29mZnNldCwgCiAJCQkJCSAgJmRldi0+Y293LmJpdG1hcF9sZW4sCkBAIC02NjgsMjEgKzcwNywyMiBAQAogCXN0cnVjdCB1YmQgKmRldiA9ICZ1YmRfZGV2W25dOwogCWludCBlcnI7CiAKKwllcnIgPSAtRU5PREVWOwogCWlmKGRldi0+ZmlsZSA9PSBOVUxMKQotCQlyZXR1cm4oLUVOT0RFVik7CisJCWdvdG8gb3V0OwogCiAJaWYgKHViZF9vcGVuX2RldihkZXYpKQotCQlyZXR1cm4oLUVOT0RFVik7CisJCWdvdG8gb3V0OwogCiAJZXJyID0gdWJkX2ZpbGVfc2l6ZShkZXYsICZkZXYtPnNpemUpOwogCWlmKGVyciA8IDApCi0JCXJldHVybihlcnIpOworCQlnb3RvIG91dF9jbG9zZTsKIAogCWRldi0+c2l6ZSA9IFJPVU5EX0JMT0NLKGRldi0+c2l6ZSk7CiAKIAllcnIgPSB1YmRfbmV3X2Rpc2soTUFKT1JfTlIsIGRldi0+c2l6ZSwgbiwgJnViZF9nZW5kaXNrW25dKTsKIAlpZihlcnIpIAotCQlyZXR1cm4oZXJyKTsKKwkJZ290byBvdXRfY2xvc2U7CiAgCiAJaWYoZmFrZV9tYWpvciAhPSBNQUpPUl9OUikKIAkJdWJkX25ld19kaXNrKGZha2VfbWFqb3IsIGRldi0+c2l6ZSwgbiwgCkBAIC02OTMsOCArNzMzLDExIEBACiAJaWYgKGZha2VfaWRlKQogCQltYWtlX2lkZV9lbnRyaWVzKHViZF9nZW5kaXNrW25dLT5kaXNrX25hbWUpOwogCisJZXJyID0gMDsKK291dF9jbG9zZToKIAl1YmRfY2xvc2UoZGV2KTsKLQlyZXR1cm4gMDsKK291dDoKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IHViZF9jb25maWcoY2hhciAqc3RyKQpAQCAtODI3LDYgKzg3MCwxMCBAQAogewogICAgICAgICBpbnQgaTsKIAorCXViZF9yZXBseV9mZCA9IGluaXRfYWlvX2lycShVQkRfSVJRLCAidWJkIiwgdWJkX2ludHIpOworCWlmKHViZF9yZXBseV9mZCA8IDApCisJCXByaW50aygiU2V0dGluZyB1cCB1YmQgQUlPIGZhaWxlZCwgZXJyID0gJWRcbiIsIHViZF9yZXBseV9mZCk7CisKIAlkZXZmc19ta19kaXIoInViZCIpOwogCWlmIChyZWdpc3Rlcl9ibGtkZXYoTUFKT1JfTlIsICJ1YmQiKSkKIAkJcmV0dXJuIC0xOwpAQCAtODM3LDYgKzg4NCw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAJCQorCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHModWJkX3F1ZXVlLCBNQVhfU0cpOwogCWlmIChmYWtlX21ham9yICE9IE1BSk9SX05SKSB7CiAJCWNoYXIgbmFtZVtzaXplb2YoInViZF9ubm5cMCIpXTsKIApAQCAtODQ4LDQwICs4OTYsMTIgQEAKIAlkcml2ZXJfcmVnaXN0ZXIoJnViZF9kcml2ZXIpOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfREVWOyBpKyspIAogCQl1YmRfYWRkKGkpOworCiAJcmV0dXJuIDA7CiB9CiAKIGxhdGVfaW5pdGNhbGwodWJkX2luaXQpOwogCi1pbnQgdWJkX2RyaXZlcl9pbml0KHZvaWQpewotCXVuc2lnbmVkIGxvbmcgc3RhY2s7Ci0JaW50IGVycjsKLQotCS8qIFNldCBieSBDT05GSUdfQkxLX0RFVl9VQkRfU1lOQyBvciB1YmQ9c3luYy4qLwotCWlmKGdsb2JhbF9vcGVuZmxhZ3Mucyl7Ci0JCXByaW50ayhLRVJOX0lORk8gInViZDogU3luY2hyb25vdXMgbW9kZVxuIik7Ci0JCS8qIExldHRpbmcgdWJkPXN5bmMgYmUgbGlrZSB1c2luZyB1YmQjcz0gaW5zdGVhZCBvZiB1YmQjPSBpcwotCQkgKiBlbm91Z2guIFNvIHVzZSBhbnl3YXkgdGhlIGlvIHRocmVhZC4gKi8KLQl9Ci0Jc3RhY2sgPSBhbGxvY19zdGFjaygwLCAwKTsKLQlpb19waWQgPSBzdGFydF9pb190aHJlYWQoc3RhY2sgKyBQQUdFX1NJWkUgLSBzaXplb2Yodm9pZCAqKSwgCi0JCQkJICZ0aHJlYWRfZmQpOwotCWlmKGlvX3BpZCA8IDApewotCQlwcmludGsoS0VSTl9FUlIgCi0JCSAgICAgICAidWJkIDogRmFpbGVkIHRvIHN0YXJ0IEkvTyB0aHJlYWQgKGVycm5vID0gJWQpIC0gIgotCQkgICAgICAgImZhbGxpbmcgYmFjayB0byBzeW5jaHJvbm91cyBJL09cbiIsIC1pb19waWQpOwotCQlpb19waWQgPSAtMTsKLQkJcmV0dXJuKDApOwotCX0KLQllcnIgPSB1bV9yZXF1ZXN0X2lycShVQkRfSVJRLCB0aHJlYWRfZmQsIElSUV9SRUFELCB1YmRfaW50ciwgCi0JCQkgICAgIFNBX0lOVEVSUlVQVCwgInViZCIsIHViZF9kZXYpOwotCWlmKGVyciAhPSAwKQotCQlwcmludGsoS0VSTl9FUlIgInVtX3JlcXVlc3RfaXJxIGZhaWxlZCAtIGVycm5vID0gJWRcbiIsIC1lcnIpOwotCXJldHVybihlcnIpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwodWJkX2RyaXZlcl9pbml0KTsKLQogc3RhdGljIGludCB1YmRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2s7CkBAIC05MTksMTA1ICs5MzksNTUgQEAKIAlyZXR1cm4oMCk7CiB9CiAKLXN0YXRpYyB2b2lkIGNvd2lmeV9iaXRtYXAoX191NjQgaW9fb2Zmc2V0LCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nICpjb3dfbWFzaywKLQkJCSAgX191NjQgKmNvd19vZmZzZXQsIHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwKLQkJCSAgX191NjQgYml0bWFwX29mZnNldCwgdW5zaWduZWQgbG9uZyAqYml0bWFwX3dvcmRzLAotCQkJICBfX3U2NCBiaXRtYXBfbGVuKQorc3RhdGljIHZvaWQgY293aWZ5X2JpdG1hcChzdHJ1Y3QgaW9fdGhyZWFkX3JlcSAqcmVxLCB1bnNpZ25lZCBsb25nICpiaXRtYXApCiB7Ci0JX191NjQgc2VjdG9yID0gaW9fb2Zmc2V0ID4+IDk7Ci0JaW50IGksIHVwZGF0ZV9iaXRtYXAgPSAwOworICAgICAgICBfX3U2NCBzZWN0b3IgPSByZXEtPm9mZnNldCAvIHJlcS0+c2VjdG9yc2l6ZTsKKyAgICAgICAgaW50IGk7CiAKLQlmb3IoaSA9IDA7IGkgPCBsZW5ndGggPj4gOTsgaSsrKXsKLQkJaWYoY293X21hc2sgIT0gTlVMTCkKLQkJCXViZF9zZXRfYml0KGksICh1bnNpZ25lZCBjaGFyICopIGNvd19tYXNrKTsKLQkJaWYodWJkX3Rlc3RfYml0KHNlY3RvciArIGksICh1bnNpZ25lZCBjaGFyICopIGJpdG1hcCkpCi0JCQljb250aW51ZTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgcmVxLT5sZW5ndGggLyByZXEtPnNlY3RvcnNpemU7IGkrKyl7CisgICAgICAgICAgICAgICAgaWYodWJkX3Rlc3RfYml0KHNlY3RvciArIGksIGJpdG1hcCkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotCQl1cGRhdGVfYml0bWFwID0gMTsKLQkJdWJkX3NldF9iaXQoc2VjdG9yICsgaSwgKHVuc2lnbmVkIGNoYXIgKikgYml0bWFwKTsKLQl9CisgICAgICAgICAgICAgICAgaWYocmVxLT5iaXRtYXBfc3RhcnQgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICByZXEtPmJpdG1hcF9zdGFydCA9IHNlY3RvciArIGk7CisgICAgICAgICAgICAgICAgcmVxLT5iaXRtYXBfZW5kID0gc2VjdG9yICsgaSArIDE7CiAKLQlpZighdXBkYXRlX2JpdG1hcCkKLQkJcmV0dXJuOwotCi0JKmNvd19vZmZzZXQgPSBzZWN0b3IgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCk7Ci0KLQkvKiBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIGNhc2Ugd2hlcmUgd2UncmUgZXhhY3RseSBhdCB0aGUgZW5kIG9mIHRoZQotCSAqIGRldmljZSwgYW5kICpjb3dfb2Zmc2V0ICsgMSBpcyBvZmYgdGhlIGVuZC4gIFNvLCBqdXN0IGJhY2sgaXQgdXAKLQkgKiBieSBvbmUgd29yZC4gIFRoYW5rcyB0byBMeW5uIEtlcmJ5IGZvciB0aGUgZml4IGFuZCBKYW1lcyBNY01lY2hhbgotCSAqIGZvciB0aGUgb3JpZ2luYWwgZGlhZ25vc2lzLgotCSAqLwotCWlmKCpjb3dfb2Zmc2V0ID09ICgoYml0bWFwX2xlbiArIHNpemVvZih1bnNpZ25lZCBsb25nKSAtIDEpIC8KLQkJCSAgIHNpemVvZih1bnNpZ25lZCBsb25nKSAtIDEpKQotCQkoKmNvd19vZmZzZXQpLS07Ci0KLQliaXRtYXBfd29yZHNbMF0gPSBiaXRtYXBbKmNvd19vZmZzZXRdOwotCWJpdG1hcF93b3Jkc1sxXSA9IGJpdG1hcFsqY293X29mZnNldCArIDFdOwotCi0JKmNvd19vZmZzZXQgKj0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwotCSpjb3dfb2Zmc2V0ICs9IGJpdG1hcF9vZmZzZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvd2lmeV9yZXEoc3RydWN0IGlvX3RocmVhZF9yZXEgKnJlcSwgdW5zaWduZWQgbG9uZyAqYml0bWFwLAotCQkgICAgICAgX191NjQgYml0bWFwX29mZnNldCwgX191NjQgYml0bWFwX2xlbikKLXsKLQlfX3U2NCBzZWN0b3IgPSByZXEtPm9mZnNldCA+PiA5OwotCWludCBpOwotCi0JaWYocmVxLT5sZW5ndGggPiAoc2l6ZW9mKHJlcS0+c2VjdG9yX21hc2spICogOCkgPDwgOSkKLQkJcGFuaWMoIk9wZXJhdGlvbiB0b28gbG9uZyIpOwotCi0JaWYocmVxLT5vcCA9PSBVQkRfUkVBRCkgewotCQlmb3IoaSA9IDA7IGkgPCByZXEtPmxlbmd0aCA+PiA5OyBpKyspewotCQkJaWYodWJkX3Rlc3RfYml0KHNlY3RvciArIGksICh1bnNpZ25lZCBjaGFyICopIGJpdG1hcCkpCi0JCQkJdWJkX3NldF9iaXQoaSwgKHVuc2lnbmVkIGNoYXIgKikgCi0JCQkJCSAgICAmcmVxLT5zZWN0b3JfbWFzayk7Ci0gICAgICAgICAgICAgICAgfQotCX0KLQllbHNlIGNvd2lmeV9iaXRtYXAocmVxLT5vZmZzZXQsIHJlcS0+bGVuZ3RoLCAmcmVxLT5zZWN0b3JfbWFzaywKLQkJCSAgICZyZXEtPmNvd19vZmZzZXQsIGJpdG1hcCwgYml0bWFwX29mZnNldCwKLQkJCSAgIHJlcS0+Yml0bWFwX3dvcmRzLCBiaXRtYXBfbGVuKTsKKyAgICAgICAgICAgICAgICB1YmRfc2V0X2JpdChzZWN0b3IgKyBpLCBiaXRtYXApOworICAgICAgICB9CiB9CiAKIC8qIENhbGxlZCB3aXRoIHViZF9pb19sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgcHJlcGFyZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEsIHN0cnVjdCBpb190aHJlYWRfcmVxICppb19yZXEpCitzdGF0aWMgaW50IHByZXBhcmVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgaW9fdGhyZWFkX3JlcSAqaW9fcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCwgaW50IHBhZ2Vfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSByZXEtPnJxX2Rpc2s7CiAJc3RydWN0IHViZCAqZGV2ID0gZGlzay0+cHJpdmF0ZV9kYXRhOwotCV9fdTY0IG9mZnNldDsKLQlpbnQgbGVuOwotCi0JaWYocmVxLT5ycV9zdGF0dXMgPT0gUlFfSU5BQ1RJVkUpIHJldHVybigxKTsKIAogCS8qIFRoaXMgc2hvdWxkIGJlIGltcG9zc2libGUgbm93ICovCiAJaWYoKHJxX2RhdGFfZGlyKHJlcSkgPT0gV1JJVEUpICYmICFkZXYtPm9wZW5mbGFncy53KXsKIAkJcHJpbnRrKCJXcml0ZSBhdHRlbXB0ZWQgb24gcmVhZG9ubHkgdWJkIGRldmljZSAlc1xuIiwgCiAJCSAgICAgICBkaXNrLT5kaXNrX25hbWUpOwotCQllbmRfcmVxdWVzdChyZXEsIDApOworICAgICAgICAgICAgICAgIHViZF9lbmRfcmVxdWVzdChyZXEsIDAsIDApOwogCQlyZXR1cm4oMSk7CiAJfQogCi0Jb2Zmc2V0ID0gKChfX3U2NCkgcmVxLT5zZWN0b3IpIDw8IDk7Ci0JbGVuID0gcmVxLT5jdXJyZW50X25yX3NlY3RvcnMgPDwgOTsKLQogCWlvX3JlcS0+ZmRzWzBdID0gKGRldi0+Y293LmZpbGUgIT0gTlVMTCkgPyBkZXYtPmNvdy5mZCA6IGRldi0+ZmQ7CiAJaW9fcmVxLT5mZHNbMV0gPSBkZXYtPmZkOwotCWlvX3JlcS0+Y293X29mZnNldCA9IC0xOwogCWlvX3JlcS0+b2Zmc2V0ID0gb2Zmc2V0OwogCWlvX3JlcS0+bGVuZ3RoID0gbGVuOwogCWlvX3JlcS0+ZXJyb3IgPSAwOwotCWlvX3JlcS0+c2VjdG9yX21hc2sgPSAwOwotCi0JaW9fcmVxLT5vcCA9IChycV9kYXRhX2RpcihyZXEpID09IFJFQUQpID8gVUJEX1JFQUQgOiBVQkRfV1JJVEU7CisJaW9fcmVxLT5vcCA9IChycV9kYXRhX2RpcihyZXEpID09IFJFQUQpID8gQUlPX1JFQUQgOiBBSU9fV1JJVEU7CiAJaW9fcmVxLT5vZmZzZXRzWzBdID0gMDsKIAlpb19yZXEtPm9mZnNldHNbMV0gPSBkZXYtPmNvdy5kYXRhX29mZnNldDsKLQlpb19yZXEtPmJ1ZmZlciA9IHJlcS0+YnVmZmVyOworICAgICAgICBpb19yZXEtPmJ1ZmZlciA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIHBhZ2Vfb2Zmc2V0OwogCWlvX3JlcS0+c2VjdG9yc2l6ZSA9IDEgPDwgOTsKKyAgICAgICAgaW9fcmVxLT5iaXRtYXBfb2Zmc2V0ID0gZGV2LT5jb3cuYml0bWFwX29mZnNldDsKKyAgICAgICAgaW9fcmVxLT5iaXRtYXBfc3RhcnQgPSAtMTsKKyAgICAgICAgaW9fcmVxLT5iaXRtYXBfZW5kID0gLTE7CiAKLQlpZihkZXYtPmNvdy5maWxlICE9IE5VTEwpCi0JCWNvd2lmeV9yZXEoaW9fcmVxLCBkZXYtPmNvdy5iaXRtYXAsIGRldi0+Y293LmJpdG1hcF9vZmZzZXQsCi0JCQkgICBkZXYtPmNvdy5iaXRtYXBfbGVuKTsKLQorICAgICAgICBpZigoZGV2LT5jb3cuZmlsZSAhPSBOVUxMKSAmJiAoaW9fcmVxLT5vcCA9PSBVQkRfV1JJVEUpKQorICAgICAgICAgICAgICAgIGNvd2lmeV9iaXRtYXAoaW9fcmVxLCBkZXYtPmNvdy5iaXRtYXApOwogCXJldHVybigwKTsKIH0KIApAQCAtMTAyNiwzMCArOTk2LDM2IEBACiB7CiAJc3RydWN0IGlvX3RocmVhZF9yZXEgaW9fcmVxOwogCXN0cnVjdCByZXF1ZXN0ICpyZXE7Ci0JaW50IGVyciwgbjsKKwlfX3U2NCBzZWN0b3I7CisJaW50IGVycjsKIAotCWlmKHRocmVhZF9mZCA9PSAtMSl7Ci0JCXdoaWxlKChyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpKSAhPSBOVUxMKXsKLQkJCWVyciA9IHByZXBhcmVfcmVxdWVzdChyZXEsICZpb19yZXEpOwotCQkJaWYoIWVycil7Ci0JCQkJZG9faW8oJmlvX3JlcSk7Ci0JCQkJX191YmRfZmluaXNoKHJlcSwgaW9fcmVxLmVycm9yKTsKLQkJCX0KKwlpZihpbl91YmQpCisJCXJldHVybjsKKwlpbl91YmQgPSAxOworCXdoaWxlKChyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpKSAhPSBOVUxMKXsKKwkJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSByZXEtPnJxX2Rpc2s7CisJCXN0cnVjdCB1YmQgKmRldiA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwkJaW50IG4sIGk7CisKKwkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOworCisJCXNlY3RvciA9IHJlcS0+c2VjdG9yOworCQluID0gYmxrX3JxX21hcF9zZyhxLCByZXEsIGRldi0+c2cpOworCisJCWZvcihpID0gMDsgaSA8IG47IGkrKyl7CisJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gJmRldi0+c2dbaV07CisKKwkJCWVyciA9IHByZXBhcmVfcmVxdWVzdChyZXEsICZpb19yZXEsIHNlY3RvciA8PCA5LAorCQkJCQkgICAgICBzZy0+b2Zmc2V0LCBzZy0+bGVuZ3RoLAorCQkJCQkgICAgICBzZy0+cGFnZSk7CisJCQlpZihlcnIpCisJCQkJY29udGludWU7CisKKwkJCXNlY3RvciArPSBzZy0+bGVuZ3RoID4+IDk7CisJCQlkb19pbygmaW9fcmVxLCByZXEsIGRldi0+Y293LmJpdG1hcCk7CiAJCX0KIAl9Ci0JZWxzZSB7Ci0JCWlmKGRvX3ViZCB8fCAocmVxID0gZWx2X25leHRfcmVxdWVzdChxKSkgPT0gTlVMTCkKLQkJCXJldHVybjsKLQkJZXJyID0gcHJlcGFyZV9yZXF1ZXN0KHJlcSwgJmlvX3JlcSk7Ci0JCWlmKCFlcnIpewotCQkJZG9fdWJkID0gdWJkX2hhbmRsZXI7Ci0JCQluID0gb3Nfd3JpdGVfZmlsZSh0aHJlYWRfZmQsIChjaGFyICopICZpb19yZXEsCi0JCQkJCSBzaXplb2YoaW9fcmVxKSk7Ci0JCQlpZihuICE9IHNpemVvZihpb19yZXEpKQotCQkJCXByaW50aygid3JpdGUgdG8gaW8gdGhyZWFkIGZhaWxlZCwgIgotCQkJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgLW4pOwotCQl9Ci0JfQorCWluX3ViZCA9IDA7CiB9CiAKIHN0YXRpYyBpbnQgdWJkX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCkBAIC0xMjY1LDEzMSArMTI0MSw5NSBAQAogCXJldHVybihlcnIpOwogfQogCi1zdGF0aWMgaW50IHVwZGF0ZV9iaXRtYXAoc3RydWN0IGlvX3RocmVhZF9yZXEgKnJlcSkKK3ZvaWQgZG9faW8oc3RydWN0IGlvX3RocmVhZF9yZXEgKnJlcSwgc3RydWN0IHJlcXVlc3QgKnIsIHVuc2lnbmVkIGxvbmcgKmJpdG1hcCkKIHsKLQlpbnQgbjsKKyAgICAgICAgc3RydWN0IHViZF9haW8gKmFpbzsKKyAgICAgICAgc3RydWN0IGJpdG1hcF9pbyAqYml0bWFwX2lvID0gTlVMTDsKKyAgICAgICAgY2hhciAqYnVmOworICAgICAgICB2b2lkICpiaXRtYXBfYnVmID0gTlVMTDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsZW4sIHNlY3RvcjsKKyAgICAgICAgaW50IG5zZWN0b3JzLCBzdGFydCwgZW5kLCBiaXQsIGVycjsKKyAgICAgICAgX191NjQgb2ZmOwogCi0JaWYocmVxLT5jb3dfb2Zmc2V0ID09IC0xKQotCQlyZXR1cm4oMCk7CisgICAgICAgIGlmKHJlcS0+Yml0bWFwX3N0YXJ0ICE9IC0xKXsKKyAgICAgICAgICAgICAgICAvKiBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCB3b3JkICovCisgICAgICAgICAgICAgICAgaW50IHJvdW5kID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworICAgICAgICAgICAgICAgIGxlbiA9IChyZXEtPmJpdG1hcF9lbmQgLSByZXEtPmJpdG1hcF9zdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kICogOCAtIDEpIC8gKHJvdW5kICogOCk7CisgICAgICAgICAgICAgICAgbGVuICo9IHJvdW5kOwogCi0JbiA9IG9zX3NlZWtfZmlsZShyZXEtPmZkc1sxXSwgcmVxLT5jb3dfb2Zmc2V0KTsKLQlpZihuIDwgMCl7Ci0JCXByaW50aygiZG9faW8gLSBiaXRtYXAgbHNlZWsgZmFpbGVkIDogZXJyID0gJWRcbiIsIC1uKTsKLQkJcmV0dXJuKDEpOwotCX0KKyAgICAgICAgICAgICAgICBvZmYgPSByZXEtPmJpdG1hcF9zdGFydCAvICg4ICogcm91bmQpOworICAgICAgICAgICAgICAgIG9mZiAqPSByb3VuZDsKIAotCW4gPSBvc193cml0ZV9maWxlKHJlcS0+ZmRzWzFdLCAmcmVxLT5iaXRtYXBfd29yZHMsCi0JCSAgICAgICAgICBzaXplb2YocmVxLT5iaXRtYXBfd29yZHMpKTsKLQlpZihuICE9IHNpemVvZihyZXEtPmJpdG1hcF93b3JkcykpewotCQlwcmludGsoImRvX2lvIC0gYml0bWFwIHVwZGF0ZSBmYWlsZWQsIGVyciA9ICVkIGZkID0gJWRcbiIsIC1uLAotCQkgICAgICAgcmVxLT5mZHNbMV0pOwotCQlyZXR1cm4oMSk7Ci0JfQorICAgICAgICAgICAgICAgIGJpdG1hcF9pbyA9IGttYWxsb2Moc2l6ZW9mKCpiaXRtYXBfaW8pLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgICAgICAgICBpZihiaXRtYXBfaW8gPT0gTlVMTCl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkZhaWxlZCB0byBrbWFsbG9jIGJpdG1hcCBJT1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXEtPmVycm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAKLQlyZXR1cm4oMCk7CisgICAgICAgICAgICAgICAgYml0bWFwX2J1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgICAgICAgICBpZihiaXRtYXBfYnVmID09IE5VTEwpeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJkb19pbyA6IGttYWxsb2Mgb2YgYml0bWFwIGNodW5rICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGJpdG1hcF9pbyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXEtPmVycm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KGJpdG1hcF9idWYsICZiaXRtYXBbb2ZmIC8gc2l6ZW9mKGJpdG1hcFswXSldLCBsZW4pOworCisgICAgICAgICAgICAgICAgKmJpdG1hcF9pbyA9ICgoc3RydWN0IGJpdG1hcF9pbykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmNvdW50CT0gQVRPTUlDX0lOSVQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5haW8JCT0gSU5JVF9BSU8oQUlPX1dSSVRFLCByZXEtPmZkc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcF9idWYsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS0+Yml0bWFwX29mZnNldCArIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHViZF9yZXBseV9mZCkgfSApOworICAgICAgICB9CisKKyAgICAgICAgbnNlY3RvcnMgPSByZXEtPmxlbmd0aCAvIHJlcS0+c2VjdG9yc2l6ZTsKKyAgICAgICAgc3RhcnQgPSAwOworICAgICAgICBlbmQgPSBuc2VjdG9yczsKKyAgICAgICAgYml0ID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmKGJpdG1hcCAhPSBOVUxMKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3RvciA9IHJlcS0+b2Zmc2V0IC8gcmVxLT5zZWN0b3JzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgYml0ID0gdWJkX3Rlc3RfYml0KHNlY3RvciArIHN0YXJ0LCBiaXRtYXApOworICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSgoZW5kIDwgbnNlY3RvcnMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWJkX3Rlc3RfYml0KHNlY3RvciArIGVuZCwgYml0bWFwKSA9PSBiaXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvZmYgPSByZXEtPm9mZnNldHNbYml0XSArIHJlcS0+b2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICogcmVxLT5zZWN0b3JzaXplOworICAgICAgICAgICAgICAgIGxlbiA9IChlbmQgLSBzdGFydCkgKiByZXEtPnNlY3RvcnNpemU7CisgICAgICAgICAgICAgICAgYnVmID0gJnJlcS0+YnVmZmVyW3N0YXJ0ICogcmVxLT5zZWN0b3JzaXplXTsKKworICAgICAgICAgICAgICAgIGFpbyA9IGttYWxsb2Moc2l6ZW9mKCphaW8pLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgICAgICAgICBpZihhaW8gPT0gTlVMTCl7CisgICAgICAgICAgICAgICAgICAgICAgICByZXEtPmVycm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqYWlvID0gKChzdHJ1Y3QgdWJkX2FpbykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmFpbwkJPSBJTklUX0FJTyhyZXEtPm9wLCByZXEtPmZkc1tiaXRdLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIG9mZiwgdWJkX3JlcGx5X2ZkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbgkJPSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXEJCT0gciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpdG1hcAk9IGJpdG1hcF9pbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpdG1hcF9idWYgCT0gYml0bWFwX2J1ZiB9KTsKKworICAgICAgICAgICAgICAgIGlmKGFpby0+Yml0bWFwICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBhdG9taWNfaW5jKCZhaW8tPmJpdG1hcC0+Y291bnQpOworCisgICAgICAgICAgICAgICAgZXJyID0gc3VibWl0X2FpbygmYWlvLT5haW8pOworICAgICAgICAgICAgICAgIGlmKGVycil7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImRvX2lvIC0gc3VibWl0X2FpbyBmYWlsZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyID0gJWRcbiIsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXEtPmVycm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGFydCA9IGVuZDsKKyAgICAgICAgfSB3aGlsZShzdGFydCA8IG5zZWN0b3JzKTsKIH0KLQotdm9pZCBkb19pbyhzdHJ1Y3QgaW9fdGhyZWFkX3JlcSAqcmVxKQotewotCWNoYXIgKmJ1ZjsKLQl1bnNpZ25lZCBsb25nIGxlbjsKLQlpbnQgbiwgbnNlY3RvcnMsIHN0YXJ0LCBlbmQsIGJpdDsKLQlpbnQgZXJyOwotCV9fdTY0IG9mZjsKLQotCW5zZWN0b3JzID0gcmVxLT5sZW5ndGggLyByZXEtPnNlY3RvcnNpemU7Ci0Jc3RhcnQgPSAwOwotCWRvIHsKLQkJYml0ID0gdWJkX3Rlc3RfYml0KHN0YXJ0LCAodW5zaWduZWQgY2hhciAqKSAmcmVxLT5zZWN0b3JfbWFzayk7Ci0JCWVuZCA9IHN0YXJ0OwotCQl3aGlsZSgoZW5kIDwgbnNlY3RvcnMpICYmCi0JCSAgICAgICh1YmRfdGVzdF9iaXQoZW5kLCAodW5zaWduZWQgY2hhciAqKQotCQkJCSAgICAmcmVxLT5zZWN0b3JfbWFzaykgPT0gYml0KSkKLQkJCWVuZCsrOwotCi0JCW9mZiA9IHJlcS0+b2Zmc2V0ICsgcmVxLT5vZmZzZXRzW2JpdF0gKwotCQkJc3RhcnQgKiByZXEtPnNlY3RvcnNpemU7Ci0JCWxlbiA9IChlbmQgLSBzdGFydCkgKiByZXEtPnNlY3RvcnNpemU7Ci0JCWJ1ZiA9ICZyZXEtPmJ1ZmZlcltzdGFydCAqIHJlcS0+c2VjdG9yc2l6ZV07Ci0KLQkJZXJyID0gb3Nfc2Vla19maWxlKHJlcS0+ZmRzW2JpdF0sIG9mZik7Ci0JCWlmKGVyciA8IDApewotCQkJcHJpbnRrKCJkb19pbyAtIGxzZWVrIGZhaWxlZCA6IGVyciA9ICVkXG4iLCAtZXJyKTsKLQkJCXJlcS0+ZXJyb3IgPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmKHJlcS0+b3AgPT0gVUJEX1JFQUQpewotCQkJbiA9IDA7Ci0JCQlkbyB7Ci0JCQkJYnVmID0gJmJ1ZltuXTsKLQkJCQlsZW4gLT0gbjsKLQkJCQluID0gb3NfcmVhZF9maWxlKHJlcS0+ZmRzW2JpdF0sIGJ1ZiwgbGVuKTsKLQkJCQlpZiAobiA8IDApIHsKLQkJCQkJcHJpbnRrKCJkb19pbyAtIHJlYWQgZmFpbGVkLCBlcnIgPSAlZCAiCi0JCQkJCSAgICAgICAiZmQgPSAlZFxuIiwgLW4sIHJlcS0+ZmRzW2JpdF0pOwotCQkJCQlyZXEtPmVycm9yID0gMTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gd2hpbGUoKG4gPCBsZW4pICYmIChuICE9IDApKTsKLQkJCWlmIChuIDwgbGVuKSBtZW1zZXQoJmJ1ZltuXSwgMCwgbGVuIC0gbik7Ci0JCX0gZWxzZSB7Ci0JCQluID0gb3Nfd3JpdGVfZmlsZShyZXEtPmZkc1tiaXRdLCBidWYsIGxlbik7Ci0JCQlpZihuICE9IGxlbil7Ci0JCQkJcHJpbnRrKCJkb19pbyAtIHdyaXRlIGZhaWxlZCBlcnIgPSAlZCAiCi0JCQkJICAgICAgICJmZCA9ICVkXG4iLCAtbiwgcmVxLT5mZHNbYml0XSk7Ci0JCQkJcmVxLT5lcnJvciA9IDE7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJc3RhcnQgPSBlbmQ7Ci0JfSB3aGlsZShzdGFydCA8IG5zZWN0b3JzKTsKLQotCXJlcS0+ZXJyb3IgPSB1cGRhdGVfYml0bWFwKHJlcSk7Ci19Ci0KLS8qIENoYW5nZWQgaW4gc3RhcnRfaW9fdGhyZWFkLCB3aGljaCBpcyBzZXJpYWxpemVkIGJ5IGJlaW5nIGNhbGxlZCBvbmx5Ci0gKiBmcm9tIHViZF9pbml0LCB3aGljaCBpcyBhbiBpbml0Y2FsbC4KLSAqLwotaW50IGtlcm5lbF9mZCA9IC0xOwotCi0vKiBPbmx5IGNoYW5nZWQgYnkgdGhlIGlvIHRocmVhZCAqLwotaW50IGlvX2NvdW50ID0gMDsKLQotaW50IGlvX3RocmVhZCh2b2lkICphcmcpCi17Ci0Jc3RydWN0IGlvX3RocmVhZF9yZXEgcmVxOwotCWludCBuOwotCi0JaWdub3JlX3NpZ3dpbmNoX3NpZygpOwotCXdoaWxlKDEpewotCQluID0gb3NfcmVhZF9maWxlKGtlcm5lbF9mZCwgJnJlcSwgc2l6ZW9mKHJlcSkpOwotCQlpZihuICE9IHNpemVvZihyZXEpKXsKLQkJCWlmKG4gPCAwKQotCQkJCXByaW50aygiaW9fdGhyZWFkIC0gcmVhZCBmYWlsZWQsIGZkID0gJWQsICIKLQkJCQkgICAgICAgImVyciA9ICVkXG4iLCBrZXJuZWxfZmQsIC1uKTsKLQkJCWVsc2UgewotCQkJCXByaW50aygiaW9fdGhyZWFkIC0gc2hvcnQgcmVhZCwgZmQgPSAlZCwgIgotCQkJCSAgICAgICAibGVuZ3RoID0gJWRcbiIsIGtlcm5lbF9mZCwgbik7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpb19jb3VudCsrOwotCQlkb19pbygmcmVxKTsKLQkJbiA9IG9zX3dyaXRlX2ZpbGUoa2VybmVsX2ZkLCAmcmVxLCBzaXplb2YocmVxKSk7Ci0JCWlmKG4gIT0gc2l6ZW9mKHJlcSkpCi0JCQlwcmludGsoImlvX3RocmVhZCAtIHdyaXRlIGZhaWxlZCwgZmQgPSAlZCwgZXJyID0gJWRcbiIsCi0JCQkgICAgICAga2VybmVsX2ZkLCAtbik7Ci0JfQotfQotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2Fpby5oIGIvYXJjaC91bS9pbmNsdWRlL2Fpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjE2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYWlvLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBBSU9fSF9fCisjZGVmaW5lIEFJT19IX18KKworZW51bSBhaW9fdHlwZSB7IEFJT19SRUFELCBBSU9fV1JJVEUsIEFJT19NTUFQIH07CisKK3N0cnVjdCBhaW9fdGhyZWFkX3JlcGx5IHsKKwl2b2lkICpkYXRhOworCWludCBlcnI7Cit9OworCitzdHJ1Y3QgYWlvX2NvbnRleHQgeworCWVudW0gYWlvX3R5cGUgdHlwZTsKKwlpbnQgZmQ7CisJdm9pZCAqZGF0YTsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQ7CisJaW50IHJlcGx5X2ZkOworCXN0cnVjdCBhaW9fY29udGV4dCAqbmV4dDsKK307CisKKyNkZWZpbmUgSU5JVF9BSU8oYWlvX3R5cGUsIGFpb19mZCwgYWlvX2RhdGEsIGFpb19sZW4sIGFpb19vZmZzZXQsIFwKKwkJIGFpb19yZXBseV9mZCkgXAorCXsgLnR5cGUgCT0gYWlvX3R5cGUsIFwKKwkgIC5mZAkJPSBhaW9fZmQsIFwKKwkgIC5kYXRhCQk9IGFpb19kYXRhLCBcCisJICAubGVuCQk9IGFpb19sZW4sIFwKKwkgIC5vZmZzZXQJPSBhaW9fb2Zmc2V0LCBcCisJICAucmVwbHlfZmQJPSBhaW9fcmVwbHlfZmQgfQorCisjZGVmaW5lIElOSVRfQUlPX0NPTlRFWFQgeyAucmVwbHlfZmQJPSAtMSwgXAorCQkJICAgLm5leHQJPSBOVUxMIH0KKworZXh0ZXJuIGludCBzdWJtaXRfYWlvKHN0cnVjdCBhaW9fY29udGV4dCAqYWlvKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaCBiL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oCmluZGV4IGQ3MDVkYWEuLjBhYTYyMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oCkBAIC0xMiwzICsxMiw0IEBACiBERUZJTkVfU1RSKFVNX0tFUk5fTk9USUNFLCBLRVJOX05PVElDRSk7CiBERUZJTkVfU1RSKFVNX0tFUk5fSU5GTywgS0VSTl9JTkZPKTsKIERFRklORV9TVFIoVU1fS0VSTl9ERUJVRywgS0VSTl9ERUJVRyk7CitERUZJTkUoSE9TVF9FTEZfQ0xBU1MsIEVMRl9DTEFTUyk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvaW5pdC5oIGIvYXJjaC91bS9pbmNsdWRlL2luaXQuaAppbmRleCA1NWMyNjkzLi5jYmQ3OWE4IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvaW5pdC5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9pbml0LmgKQEAgLTExMSw3ICsxMTEsMTUgQEAKIAogI2lmbmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgX19pbml0Y2FsbChmbikgc3RhdGljIGluaXRjYWxsX3QgX19pbml0Y2FsbF8jI2ZuIF9faW5pdF9jYWxsID0gZm4KKyNkZWZpbmUgX19kZWZpbmVfaW5pdGNhbGwobGV2ZWwsZm4pIFwKKwlzdGF0aWMgaW5pdGNhbGxfdCBfX2luaXRjYWxsXyMjZm4gX19hdHRyaWJ1dGVfdXNlZF9fIFwKKwlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmluaXRjYWxsIiBsZXZlbCAiLmluaXQiKSkpID0gZm4KKworLyogVXNlcnNwYWNlIGluaXRjYWxscyBzaG91bGRuJ3QgZGVwZW5kIG9uIGFueXRoaW5nIGluIHRoZSBrZXJuZWwsIHNvIHdlJ2xsCisgKiBtYWtlIHRoZW0gcnVuIGZpcnN0LgorICovCisjZGVmaW5lIF9faW5pdGNhbGwoZm4pIF9fZGVmaW5lX2luaXRjYWxsKCIxIiwgZm4pCisKICNkZWZpbmUgX19leGl0Y2FsbChmbikgc3RhdGljIGV4aXRjYWxsX3QgX19leGl0Y2FsbF8jI2ZuIF9fZXhpdF9jYWxsID0gZm4KIAogI2RlZmluZSBfX2luaXRfY2FsbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkLF9fc2VjdGlvbl9fICgiLmluaXRjYWxsLmluaXQiKSkpCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvaXJxX2tlcm4uaCBiL2FyY2gvdW0vaW5jbHVkZS9pcnFfa2Vybi5oCmluZGV4IDNhZjUyYTYuLmMyMjJkNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9pcnFfa2Vybi5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9pcnFfa2Vybi5oCkBAIC03LDEyICs3LDE1IEBACiAjZGVmaW5lIF9fSVJRX0tFUk5fSF9fCiAKICNpbmNsdWRlICJsaW51eC9pbnRlcnJ1cHQuaCIKKyNpbmNsdWRlICJhc20vcHRyYWNlLmgiCiAKIGV4dGVybiBpbnQgdW1fcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgaW50IGZkLCBpbnQgdHlwZSwKIAkJCSAgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwKIAkJCQkJCSBzdHJ1Y3QgcHRfcmVncyAqKSwKIAkJCSAgdW5zaWduZWQgbG9uZyBpcnFmbGFncywgIGNvbnN0IGNoYXIgKiBkZXZuYW1lLAogCQkJICB2b2lkICpkZXZfaWQpOworZXh0ZXJuIGludCBpbml0X2Fpb19pcnEoaW50IGlycSwgY2hhciAqbmFtZSwKKwkJCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9tZW0uaCBiL2FyY2gvdW0vaW5jbHVkZS9tZW0uaAppbmRleCA5OWQzYWQ0Li5lOGZmMGQ4IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvbWVtLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL21lbS5oCkBAIC0xMyw3ICsxMywxNyBAQAogZXh0ZXJuIGludCBpc19yZW1hcHBlZCh2b2lkICp2aXJ0KTsKIGV4dGVybiBpbnQgcGh5c21lbV9yZW1vdmVfbWFwcGluZyh2b2lkICp2aXJ0KTsKIGV4dGVybiB2b2lkIHBoeXNtZW1fZm9yZ2V0X2Rlc2NyaXB0b3IoaW50IGZkKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHRvX3BoeXModm9pZCAqdmlydCk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHVtbF9waHlzbWVtOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRvX3BoeXModm9pZCAqdmlydCkKK3sKKwlyZXR1cm4oKCh1bnNpZ25lZCBsb25nKSB2aXJ0KSAtIHVtbF9waHlzbWVtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICp0b192aXJ0KHVuc2lnbmVkIGxvbmcgcGh5cykKK3sKKwlyZXR1cm4oKHZvaWQgKikgdW1sX3BoeXNtZW0gKyBwaHlzKTsKK30KIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9vcy5oIGIvYXJjaC91bS9pbmNsdWRlL29zLmgKaW5kZXggODgxZDI5OC4uNGMzNjI0NSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL29zLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL29zLmgKQEAgLTE1Myw2ICsxNTMsMTEgQEAKIGV4dGVybiBpbnQgb3NfZmlsZV9tb2RlKGNoYXIgKmZpbGUsIHN0cnVjdCBvcGVuZmxhZ3MgKm1vZGVfb3V0KTsKIGV4dGVybiBpbnQgb3NfbG9ja19maWxlKGludCBmZCwgaW50IGV4Y2wpOwogCisvKiBzdGFydF91cC5jICovCitleHRlcm4gdm9pZCBvc19lYXJseV9jaGVja3Modm9pZCk7CitleHRlcm4gaW50IGNhbl9kb19za2FzKHZvaWQpOworCisvKiBwcm9jZXNzLmMgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIG9zX3Byb2Nlc3NfcGMoaW50IHBpZCk7CiBleHRlcm4gaW50IG9zX3Byb2Nlc3NfcGFyZW50KGludCBwaWQpOwogZXh0ZXJuIHZvaWQgb3Nfc3RvcF9wcm9jZXNzKGludCBwaWQpOwpAQCAtMTYxLDYgKzE2Niw5IEBACiBleHRlcm4gdm9pZCBvc191c3IxX3Byb2Nlc3MoaW50IHBpZCk7CiBleHRlcm4gaW50IG9zX2dldHBpZCh2b2lkKTsKIGV4dGVybiBpbnQgb3NfZ2V0cGdycCh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfbmV3X3RocmVhZF9zdGFjayh2b2lkICpzaWdfc3RhY2ssIHZvaWQgKCp1c3IxX2hhbmRsZXIpKGludCkpOworZXh0ZXJuIHZvaWQgaW5pdF9uZXdfdGhyZWFkX3NpZ25hbHMoaW50IGFsdHN0YWNrKTsKK2V4dGVybiBpbnQgcnVuX2tlcm5lbF90aHJlYWQoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZywgdm9pZCAqKmptcF9wdHIpOwogCiBleHRlcm4gaW50IG9zX21hcF9tZW1vcnkodm9pZCAqdmlydCwgaW50IGZkLCB1bnNpZ25lZCBsb25nIGxvbmcgb2ZmLAogCQkJIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgciwgaW50IHcsIGludCB4KTsKQEAgLTE3MCw2ICsxNzgsMTMgQEAKIGV4dGVybiB2b2lkIG9zX2ZsdXNoX3N0ZG91dCh2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgb3NfdXNlY3Modm9pZCk7CiAKKy8qIHR0LmMKKyAqIGZvciB0dCBtb2RlIG9ubHkgKHdpbGwgYmUgZGVsZXRlZCBpbiBmdXR1cmUuLi4pCisgKi8KK2V4dGVybiB2b2lkIGZvcndhcmRfcGVuZGluZ19zaWdpbyhpbnQgdGFyZ2V0KTsKK2V4dGVybiBpbnQgc3RhcnRfZm9ya190cmFtcCh2b2lkICphcmcsIHVuc2lnbmVkIGxvbmcgdGVtcF9zdGFjaywKKwkJCSAgICBpbnQgY2xvbmVfZmxhZ3MsIGludCAoKnRyYW1wKSh2b2lkICopKTsKKwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzY2FsbC5oIGIvYXJjaC91bS9pbmNsdWRlL3N5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGExZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL3N5c2NhbGwuaApAQCAtMCwwICsxLDEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTQ0FMTF9VU0VSX0gKKyNkZWZpbmUgX19TWVNDQUxMX1VTRVJfSAorCitleHRlcm4gaW50IHJlY29yZF9zeXNjYWxsX3N0YXJ0KGludCBzeXNjYWxsKTsKK2V4dGVybiB2b2lkIHJlY29yZF9zeXNjYWxsX2VuZChpbnQgaW5kZXgsIGxvbmcgcmVzdWx0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzY2FsbF91c2VyLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzY2FsbF91c2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMWQwZWMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3N5c2NhbGxfdXNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19TWVNDQUxMX1VTRVJfSAotI2RlZmluZSBfX1NZU0NBTExfVVNFUl9ICi0KLWV4dGVybiBpbnQgcmVjb3JkX3N5c2NhbGxfc3RhcnQoaW50IHN5c2NhbGwpOwotZXh0ZXJuIHZvaWQgcmVjb3JkX3N5c2NhbGxfZW5kKGludCBpbmRleCwgbG9uZyByZXN1bHQpOwotCi0jZW5kaWYKLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9zeXNjYWxscy5oIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC1pMzg2L3N5c2NhbGxzLmgKaW5kZXggYmUwYTNlMy4uYTBkNWI3NCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC1pMzg2L3N5c2NhbGxzLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC1pMzg2L3N5c2NhbGxzLmgKQEAgLTE2LDYgKzE2LDggQEAKIAogZXh0ZXJuIHN5c2NhbGxfaGFuZGxlcl90IG9sZF9tbWFwX2kzODY7CiAKK2V4dGVybiBzeXNjYWxsX2hhbmRsZXJfdCAqc3lzX2NhbGxfdGFibGVbXTsKKwogI2RlZmluZSBFWEVDVVRFX1NZU0NBTEwoc3lzY2FsbCwgcmVncykgXAogCSgobG9uZyAoKikoc3RydWN0IHN5c2NhbGxfYXJncykpICgqc3lzX2NhbGxfdGFibGVbc3lzY2FsbF0pKShTWVNDQUxMX0FSR1MoJnJlZ3MtPnJlZ3MpKQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9wdHJhY2UuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3B0cmFjZS5oCmluZGV4IGJlOGFjZDUuLjMzMWFhMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3B0cmFjZS5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3B0cmFjZS5oCkBAIC0yMjcsNyArMjI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljKCJCYWQgcmVnaXN0ZXIgaW4gVVBUX1NFVCA6ICVkXG4iLCByZWcpOyAgXAogCQkJYnJlYWs7IFwKICAgICAgICAgICAgICAgICB9IFwKLSAgICAgICAgICAgICAgICB2YWw7IFwKKyAgICAgICAgICAgICAgICBfX3VwdF92YWw7IFwKICAgICAgICAgfSkKIAogI2RlZmluZSBVUFRfU0VUX1NZU0NBTExfUkVUVVJOKHIsIHJlcykgXApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvc3lzY2FsbHMuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3N5c2NhbGxzLmgKaW5kZXggNjc5MjNjYy4uZTA2ZjgzZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvc3lzY2FsbHMuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9zeXNjYWxscy5oCkBAIC0xNCw2ICsxNCw4IEBACiAKIGV4dGVybiBzeXNjYWxsX2hhbmRsZXJfdCAqaWEzMl9zeXNfY2FsbF90YWJsZVtdOwogCitleHRlcm4gc3lzY2FsbF9oYW5kbGVyX3QgKnN5c19jYWxsX3RhYmxlW107CisKICNkZWZpbmUgRVhFQ1VURV9TWVNDQUxMKHN5c2NhbGwsIHJlZ3MpIFwKIAkoKChsb25nICgqKShsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nKSkgXAogCSAgKCpzeXNfY2FsbF90YWJsZVtzeXNjYWxsXSkpKFVQVF9TWVNDQUxMX0FSRzEoJnJlZ3MtPnJlZ3MpLCBcCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdGxiLmggYi9hcmNoL3VtL2luY2x1ZGUvdGxiLmgKaW5kZXggYzZmOTYyOC4uNDVkN2RhNiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3RsYi5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS90bGIuaApAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlICJ1bV9tbXUuaCIKIAogc3RydWN0IGhvc3Rfdm1fb3AgewotCWVudW0geyBNTUFQLCBNVU5NQVAsIE1QUk9URUNUIH0gdHlwZTsKKwllbnVtIHsgTk9ORSwgTU1BUCwgTVVOTUFQLCBNUFJPVEVDVCB9IHR5cGU7CiAJdW5pb24gewogCQlzdHJ1Y3QgewogCQkJdW5zaWduZWQgbG9uZyBhZGRyOwpAQCAtMzgsMjQgKzM4LDEwIEBACiBleHRlcm4gdm9pZCBmb3JjZV9mbHVzaF9hbGwodm9pZCk7CiBleHRlcm4gdm9pZCBmaXhfcmFuZ2VfY29tbW9uKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHIsIGludCBmb3JjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmRvX29wcykodW5pb24gbW1fY29udGV4dCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaG9zdF92bV9vcCAqLCBpbnQpKTsKKwkJCSAgICAgaW50ICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosCisJCQkJCSAgIHN0cnVjdCBob3N0X3ZtX29wICosIGludCwgaW50LAorCQkJCQkgICB2b2lkICoqKSk7CiBleHRlcm4gaW50IGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uKHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCQkJCSB1bnNpZ25lZCBsb25nIGVuZCk7CiAKLWV4dGVybiBpbnQgYWRkX21tYXAodW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkgICAgaW50IHIsIGludCB3LCBpbnQgeCwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdF9maWxsZWQsIHVuaW9uIG1tX2NvbnRleHQgKm1tdSwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmRvX29wcykodW5pb24gbW1fY29udGV4dCAqLCBzdHJ1Y3QgaG9zdF92bV9vcCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpKTsKLWV4dGVybiBpbnQgYWRkX211bm1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkgICAgICBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLCBpbnQgaW5kZXgsIGludCBsYXN0X2ZpbGxlZCwKLSAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBtbV9jb250ZXh0ICptbXUsCi0gICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmRvX29wcykodW5pb24gbW1fY29udGV4dCAqLCBzdHJ1Y3QgaG9zdF92bV9vcCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCkpOwotZXh0ZXJuIGludCBhZGRfbXByb3RlY3QodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHIsIGludCB3LAotCQkJaW50IHgsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0X2ZpbGxlZCwgdW5pb24gbW1fY29udGV4dCAqbW11LAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmRvX29wcykodW5pb24gbW1fY29udGV4dCAqLCBzdHJ1Y3QgaG9zdF92bV9vcCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS91bV91YWNjZXNzLmggYi9hcmNoL3VtL2luY2x1ZGUvdW1fdWFjY2Vzcy5oCmluZGV4IDZlMzQ4Y2IuLjg0YzA4NjggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS91bV91YWNjZXNzLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3VtX3VhY2Nlc3MuaApAQCAtMjAsMTMgKzIwLDYgQEAKICNkZWZpbmUgYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpIFwKIAlDSE9PU0VfTU9ERV9QUk9DKGFjY2Vzc19va190dCwgYWNjZXNzX29rX3NrYXMsIHR5cGUsIGFkZHIsIHNpemUpCiAKLS8qIHRoaXMgZnVuY3Rpb24gd2lsbCBnbyBhd2F5IHNvb24gLSB1c2UgYWNjZXNzX29rKCkgaW5zdGVhZCAqLwotc3RhdGljIGlubGluZSBpbnQgX19kZXByZWNhdGVkIHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkIF9fdXNlciAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiAoQ0hPT1NFX01PREVfUFJPQyh2ZXJpZnlfYXJlYV90dCwgdmVyaWZ5X2FyZWFfc2thcywgdHlwZSwgYWRkciwKLQkJCQlzaXplKSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgaW50IG4pCiB7CiAJcmV0dXJuKENIT09TRV9NT0RFX1BST0MoY29weV9mcm9tX3VzZXJfdHQsIGNvcHlfZnJvbV91c2VyX3NrYXMsIHRvLApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3VzZXJfdXRpbC5oIGIvYXJjaC91bS9pbmNsdWRlL3VzZXJfdXRpbC5oCmluZGV4IDdiNmEyNGQuLmJiNTA1ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS91c2VyX3V0aWwuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvdXNlcl91dGlsLmgKQEAgLTU0LDggKzU0LDYgQEAKIGV4dGVybiB2b2lkIHRhc2tfcHJvdGVjdGlvbnModW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKIGV4dGVybiBpbnQgd2FpdF9mb3Jfc3RvcChpbnQgcGlkLCBpbnQgc2lnLCBpbnQgY29udF90eXBlLCB2b2lkICpyZWxheSk7CiBleHRlcm4gdm9pZCAqYWRkX3NpZ25hbF9oYW5kbGVyKGludCBzaWcsIHZvaWQgKCpoYW5kbGVyKShpbnQpKTsKLWV4dGVybiBpbnQgc3RhcnRfZm9ya190cmFtcCh2b2lkICphcmcsIHVuc2lnbmVkIGxvbmcgdGVtcF9zdGFjaywgCi0JCQkgICAgaW50IGNsb25lX2ZsYWdzLCBpbnQgKCp0cmFtcCkodm9pZCAqKSk7CiBleHRlcm4gaW50IGxpbnV4X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKIGV4dGVybiB2b2lkIHNldF9jbWRsaW5lKGNoYXIgKmNtZCk7CiBleHRlcm4gdm9pZCBpbnB1dF9jYih2b2lkICgqcHJvYykodm9pZCAqKSwgdm9pZCAqYXJnLCBpbnQgYXJnX2xlbik7CkBAIC02NCw4ICs2Miw2IEBACiBleHRlcm4gaW50IHN3aXRjaGVyb28oaW50IGZkLCBpbnQgcHJvdCwgdm9pZCAqZnJvbSwgdm9pZCAqdG8sIGludCBzaXplKTsKIGV4dGVybiB2b2lkIHNldHVwX21hY2hpbmVuYW1lKGNoYXIgKm1hY2hpbmVfb3V0KTsKIGV4dGVybiB2b2lkIHNldHVwX2hvc3RpbmZvKHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdF9uZXdfdGhyZWFkX3N0YWNrKHZvaWQgKnNpZ19zdGFjaywgdm9pZCAoKnVzcjFfaGFuZGxlcikoaW50KSk7Ci1leHRlcm4gdm9pZCBpbml0X25ld190aHJlYWRfc2lnbmFscyhpbnQgYWx0c3RhY2spOwogZXh0ZXJuIHZvaWQgZG9fZXhlYyhpbnQgb2xkX3BpZCwgaW50IG5ld19waWQpOwogZXh0ZXJuIHZvaWQgdHJhY2VyX3BhbmljKGNoYXIgKm1zZywgLi4uKTsKIGV4dGVybiBjaGFyICpnZXRfdW1pZChpbnQgb25seV9pZl9zZXQpOwpAQCAtNzQsMTYgKzcwLDEyIEBACiBleHRlcm4gaW50IGF0dGFjaChpbnQgcGlkKTsKIGV4dGVybiB2b2lkIGtpbGxfY2hpbGRfZGVhZChpbnQgcGlkKTsKIGV4dGVybiBpbnQgY29udChpbnQgcGlkKTsKLWV4dGVybiB2b2lkIGNoZWNrX3B0cmFjZSh2b2lkKTsKIGV4dGVybiB2b2lkIGNoZWNrX3NpZ2lvKHZvaWQpOwotZXh0ZXJuIGludCBydW5fa2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqYXJnLCB2b2lkICoqam1wX3B0cik7CiBleHRlcm4gdm9pZCB3cml0ZV9zaWdpb193b3JrYXJvdW5kKHZvaWQpOwogZXh0ZXJuIHZvaWQgYXJjaF9jaGVja19idWdzKHZvaWQpOwogZXh0ZXJuIGludCBjcHVfZmVhdHVyZShjaGFyICp3aGF0LCBjaGFyICpidWYsIGludCBsZW4pOwogZXh0ZXJuIGludCBhcmNoX2hhbmRsZV9zaWduYWwoaW50IHNpZywgdW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIGludCBhcmNoX2ZpeHVwKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqc2NfcHRyKTsKLWV4dGVybiB2b2lkIGZvcndhcmRfcGVuZGluZ19zaWdpbyhpbnQgdGFyZ2V0KTsKLWV4dGVybiBpbnQgY2FuX2RvX3NrYXModm9pZCk7CiBleHRlcm4gdm9pZCBhcmNoX2luaXRfdGhyZWFkKHZvaWQpOwogZXh0ZXJuIGludCBzZXRqbXBfd3JhcHBlcih2b2lkICgqcHJvYykodm9pZCAqLCB2b2lkICopLCAuLi4pOwogZXh0ZXJuIGludCByYXcoaW50IGZkKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL01ha2VmaWxlIGIvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUKaW5kZXggYTg5MThlODAuLjYxNGI4ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvdW0va2VybmVsL01ha2VmaWxlCkBAIC04LDI1ICs4LDI0IEBACiAKIG9iai15ID0gY29uZmlnLm8gZXhlY19rZXJuLm8gZXhpdGNvZGUubyBcCiAJaGVscGVyLm8gaW5pdF90YXNrLm8gaXJxLm8gaXJxX3VzZXIubyBrc3ltcy5vIG1haW4ubyBtZW0ubyBtZW1fdXNlci5vIFwKLQlwaHlzbWVtLm8gcHJvY2Vzcy5vIHByb2Nlc3Nfa2Vybi5vIHB0cmFjZS5vIHJlYm9vdC5vIHJlc291cmNlLm8gXAotCXNpZ2lvX3VzZXIubyBzaWdpb19rZXJuLm8gc2lnbmFsX2tlcm4ubyBzaWduYWxfdXNlci5vIHNtcC5vIFwKLQlzeXNjYWxsX2tlcm4ubyBzeXNycS5vIHRlbXBmaWxlLm8gdGltZS5vIHRpbWVfa2Vybi5vIFwKLQl0bGIubyB0cmFwX2tlcm4ubyB0cmFwX3VzZXIubyB1YWNjZXNzX3VzZXIubyB1bV9hcmNoLm8gdW1pZC5vIFwKLQl1c2VyX3V0aWwubworCXBoeXNtZW0ubyBwcm9jZXNzX2tlcm4ubyBwdHJhY2UubyByZWJvb3QubyByZXNvdXJjZS5vIHNpZ2lvX3VzZXIubyBcCisJc2lnaW9fa2Vybi5vIHNpZ25hbF9rZXJuLm8gc2lnbmFsX3VzZXIubyBzbXAubyBzeXNjYWxsX2tlcm4ubyBzeXNycS5vIFwKKwl0ZW1wZmlsZS5vIHRpbWUubyB0aW1lX2tlcm4ubyB0bGIubyB0cmFwX2tlcm4ubyB0cmFwX3VzZXIubyBcCisJdWFjY2Vzc191c2VyLm8gdW1fYXJjaC5vIHVtaWQubyB1c2VyX3V0aWwubwogCiBvYmotJChDT05GSUdfQkxLX0RFVl9JTklUUkQpICs9IGluaXRyZC5vCiBvYmotJChDT05GSUdfR1BST0YpCSs9IGdwcm9mX3N5bXMubwogb2JqLSQoQ09ORklHX0dDT1YpCSs9IGdtb25fc3ltcy5vCiBvYmotJChDT05GSUdfVFRZX0xPRykJKz0gdHR5X2xvZy5vCi1vYmotJChDT05GSUdfU1lTQ0FMTF9ERUJVRykgKz0gc3lzY2FsbF91c2VyLm8KK29iai0kKENPTkZJR19TWVNDQUxMX0RFQlVHKSArPSBzeXNjYWxsLm8KIAogb2JqLSQoQ09ORklHX01PREVfVFQpICs9IHR0Lwogb2JqLSQoQ09ORklHX01PREVfU0tBUykgKz0gc2thcy8KIAogdXNlci1vYmpzLSQoQ09ORklHX1RUWV9MT0cpICs9IHR0eV9sb2cubwogCi1VU0VSX09CSlMgOj0gJCh1c2VyLW9ianMteSkgY29uZmlnLm8gaGVscGVyLm8gbWFpbi5vIHByb2Nlc3MubyB0ZW1wZmlsZS5vIFwKLQl0aW1lLm8gdHR5X2xvZy5vIHVtaWQubyB1c2VyX3V0aWwubworVVNFUl9PQkpTIDo9ICQodXNlci1vYmpzLXkpIGNvbmZpZy5vIGhlbHBlci5vIG1haW4ubyB0ZW1wZmlsZS5vIHRpbWUubyBcCisJdHR5X2xvZy5vIHVtaWQubyB1c2VyX3V0aWwubwogCiBpbmNsdWRlIGFyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC91bS9rZXJuZWwvYXNtLW9mZnNldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTNhNjRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMCwwICsxIEBACisvKiBEdW1teSBmaWxlIHRvIG1ha2Uga2J1aWxkIGhhcHB5IC0gdW51c2VkISAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TIGIvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TCmluZGV4IDM5NDJhNWYuLjI1MTdlY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2R5bi5sZHMuUworKysgYi9hcmNoL3VtL2tlcm5lbC9keW4ubGRzLlMKQEAgLTE0NiwzNyArMTQ2LDggQEAKICAgfQogICBfZW5kID0gLjsKICAgUFJPVklERSAoZW5kID0gLik7Ci0gICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KLSAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLSAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9Ci0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKworICBTVEFCU19ERUJVRworCisgIERXQVJGX0RFQlVHCiB9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9pcnEuYyBiL2FyY2gvdW0va2VybmVsL2lycS5jCmluZGV4IDlmMTgwNjEuLmRjZDgxNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2lycS5jCisrKyBiL2FyY2gvdW0va2VybmVsL2lycS5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAiaXJxX3VzZXIuaCIKICNpbmNsdWRlICJpcnFfa2Vybi5oIgotCisjaW5jbHVkZSAib3MuaCIKIAogLyoKICAqIEdlbmVyaWMsIGNvbnRyb2xsZXItaW5kZXBlbmRlbnQgZnVuY3Rpb25zOgpAQCAtMTY4LDEzICsxNjgsMzIgQEAKIAl9CiB9CiAKLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCitpbnQgaW5pdF9haW9faXJxKGludCBpcnEsIGNoYXIgKm5hbWUsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosCisJCQkJCQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqKSkKK3sKKwlpbnQgZmRzWzJdLCBlcnI7CisKKwllcnIgPSBvc19waXBlKGZkcywgMSwgMSk7CisJaWYoZXJyKXsKKwkJcHJpbnRrKCJpbml0X2Fpb19pcnEgLSBvc19waXBlIGZhaWxlZCwgZXJyID0gJWRcbiIsIC1lcnIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSB1bV9yZXF1ZXN0X2lycShpcnEsIGZkc1swXSwgSVJRX1JFQUQsIGhhbmRsZXIsCisJCQkgICAgIFNBX0lOVEVSUlVQVCB8IFNBX1NBTVBMRV9SQU5ET00sIG5hbWUsCisJCQkgICAgICh2b2lkICopIChsb25nKSBmZHNbMF0pOworCWlmKGVycil7CisJCXByaW50aygiaW5pdF9haW9faXJxIC0gOiB1bV9yZXF1ZXN0X2lycSBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkgICAgICAgZXJyKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJZXJyID0gZmRzWzFdOworCWdvdG8gb3V0OworCisgb3V0X2Nsb3NlOgorCW9zX2Nsb3NlX2ZpbGUoZmRzWzBdKTsKKwlvc19jbG9zZV9maWxlKGZkc1sxXSk7Cisgb3V0OgorCXJldHVybihlcnIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwva3N5bXMuYyBiL2FyY2gvdW0va2VybmVsL2tzeW1zLmMKaW5kZXggOTk0MzlmYS4uYTk3YTcyZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwva3N5bXMuYworKysgYi9hcmNoL3VtL2tlcm5lbC9rc3ltcy5jCkBAIC0zNCwxNCArMzQsOSBAQAogRVhQT1JUX1NZTUJPTChhcmNoX3ZhbGlkYXRlKTsKIEVYUE9SVF9TWU1CT0woZ2V0X2ttZW1fZW5kKTsKIAotRVhQT1JUX1NZTUJPTChwYWdlX3RvX3BoeXMpOwotRVhQT1JUX1NZTUJPTChwaHlzX3RvX3BhZ2UpOwogRVhQT1JUX1NZTUJPTChoaWdoX3BoeXNtZW0pOwogRVhQT1JUX1NZTUJPTChlbXB0eV96ZXJvX3BhZ2UpOwogRVhQT1JUX1NZTUJPTCh1bV92aXJ0X3RvX3BoeXMpOwotRVhQT1JUX1NZTUJPTChfX3ZpcnRfdG9fcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKHRvX3BoeXMpOwotRVhQT1JUX1NZTUJPTCh0b192aXJ0KTsKIEVYUE9SVF9TWU1CT0wobW9kZV90dCk7CiBFWFBPUlRfU1lNQk9MKGhhbmRsZV9wYWdlX2ZhdWx0KTsKIEVYUE9SVF9TWU1CT0woZmluZF9pb21lbSk7CkBAIC0xMTQsMjIgKzEwOSwzIEBACiBFWFBPUlRfU1lNQk9MKF9fcmVhZF9sb2NrX2ZhaWxlZCk7CiAKICNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0hJR0hNRU0KLUVYUE9SVF9TWU1CT0woa21hcCk7Ci1FWFBPUlRfU1lNQk9MKGt1bm1hcCk7Ci1FWFBPUlRfU1lNQk9MKGttYXBfYXRvbWljKTsKLUVYUE9SVF9TWU1CT0woa3VubWFwX2F0b21pYyk7Ci1FWFBPUlRfU1lNQk9MKGttYXBfYXRvbWljX3RvX3BhZ2UpOwotI2VuZGlmCi0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9tYWluLmMgYi9hcmNoL3VtL2tlcm5lbC9tYWluLmMKaW5kZXggMWUxYTg3Zi4uZDMxMDI3ZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvbWFpbi5jCisrKyBiL2FyY2gvdW0va2VybmVsL21haW4uYwpAQCAtOTcsNyArOTcsNyBAQAogCQlleGl0KDEpOwogCX0KIAotI2lmZGVmIFVNTF9DT05GSUdfTU9ERV9UVAorI2lmZGVmIFVNTF9DT05GSUdfQ01ETElORV9PTl9IT1NUCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aHJlYWQgY29tbWFuZCBsaW5lcyAqLwogCWlmKGFyZ2MgPCAyIHx8IHN0cmxlbihhcmd2WzFdKSA8IFRIUkVBRF9OQU1FX0xFTiAtIDEpewogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9tZW0uYyBiL2FyY2gvdW0va2VybmVsL21lbS5jCmluZGV4IDU1OTdiZDMuLjY0ZmEwNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL21lbS5jCisrKyBiL2FyY2gvdW0va2VybmVsL21lbS5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGZpeGFkZHJfdXNlcl9pbml0KCB2b2lkKQogewotI2lmIENPTkZJR19BUkNIX1JFVVNFX0hPU1RfVlNZU0NBTExfQVJFQQorI2lmZGVmIENPTkZJR19BUkNIX1JFVVNFX0hPU1RfVlNZU0NBTExfQVJFQQogCWxvbmcgc2l6ZSA9IEZJWEFERFJfVVNFUl9FTkQgLSBGSVhBRERSX1VTRVJfU1RBUlQ7CiAJcGdkX3QgKnBnZDsKIAlwdWRfdCAqcHVkOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jIGIvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jCmluZGV4IGEyNGUzYjcuLmVhNjcwZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3BoeXNtZW0uYworKysgYi9hcmNoL3VtL2tlcm5lbC9waHlzbWVtLmMKQEAgLTI0OCwxNiArMjQ4LDYgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGh5c21lbV9zaXplOwogCi12b2lkICp0b192aXJ0KHVuc2lnbmVkIGxvbmcgcGh5cykKLXsKLQlyZXR1cm4oKHZvaWQgKikgdW1sX3BoeXNtZW0gKyBwaHlzKTsKLX0KLQotdW5zaWduZWQgbG9uZyB0b19waHlzKHZvaWQgKnZpcnQpCi17Ci0JcmV0dXJuKCgodW5zaWduZWQgbG9uZykgdmlydCkgLSB1bWxfcGh5c21lbSk7Ci19Ci0KIGludCBpbml0X21hcHModW5zaWduZWQgbG9uZyBwaHlzbWVtLCB1bnNpZ25lZCBsb25nIGlvbWVtLCB1bnNpZ25lZCBsb25nIGhpZ2htZW0pCiB7CiAJc3RydWN0IHBhZ2UgKnAsICptYXA7CkBAIC0yOTgsMzEgKzI4OCw2IEBACiAJcmV0dXJuKDApOwogfQogCi1zdHJ1Y3QgcGFnZSAqcGh5c190b19wYWdlKGNvbnN0IHVuc2lnbmVkIGxvbmcgcGh5cykKLXsKLQlyZXR1cm4oJm1lbV9tYXBbcGh5cyA+PiBQQUdFX1NISUZUXSk7Ci19Ci0KLXN0cnVjdCBwYWdlICpfX3ZpcnRfdG9fcGFnZShjb25zdCB1bnNpZ25lZCBsb25nIHZpcnQpCi17Ci0JcmV0dXJuKCZtZW1fbWFwW19fcGEodmlydCkgPj4gUEFHRV9TSElGVF0pOwotfQotCi1waHlzX3QgcGFnZV90b19waHlzKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXJldHVybigocGFnZSAtIG1lbV9tYXApIDw8IFBBR0VfU0hJRlQpOwotfQotCi1wdGVfdCBta19wdGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHBncHJvdF90IHBncHJvdCkKLXsKLQlwdGVfdCBwdGU7Ci0KLQlwdGVfc2V0X3ZhbChwdGUsIHBhZ2VfdG9fcGh5cyhwYWdlKSwgcGdwcm90KTsKLQlpZihwdGVfcHJlc2VudChwdGUpKQotCQlwdGVfbWtuZXdwcm90KHB0ZV9ta25ld3BhZ2UocHRlKSk7Ci0JcmV0dXJuKHB0ZSk7Ci19Ci0KIC8qIENoYW5nZWQgZHVyaW5nIGVhcmx5IGJvb3QgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGttZW1fdG9wID0gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9NYWtlZmlsZSBiL2FyY2gvdW0va2VybmVsL3NrYXMvTWFrZWZpbGUKaW5kZXggZDI5NmQ1NS4uZGIzNmM3YyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9NYWtlZmlsZQorKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogIwogCiBvYmoteSA6PSBjbG9uZS5vIGV4ZWNfa2Vybi5vIG1lbS5vIG1lbV91c2VyLm8gbW11Lm8gcHJvY2Vzcy5vIHByb2Nlc3Nfa2Vybi5vIFwKLQlzeXNjYWxsX2tlcm4ubyBzeXNjYWxsX3VzZXIubyB0bGIubyB0cmFwX3VzZXIubyB1YWNjZXNzLm8gXAorCXN5c2NhbGwubyB0bGIubyB0cmFwX3VzZXIubyB1YWNjZXNzLm8KIAogc3ViZGlyLSA6PSB1dGlsCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9tbXUtc2thcy5oIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKaW5kZXggMjc4YjcyZi4uMDk1MzZmOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKQEAgLTYsMTEgKzYsMTUgQEAKICNpZm5kZWYgX19TS0FTX01NVV9ICiAjZGVmaW5lIF9fU0tBU19NTVVfSAogCisjaW5jbHVkZSAibGludXgvY29uZmlnLmgiCiAjaW5jbHVkZSAibW1faWQuaCIKIAogc3RydWN0IG1tdV9jb250ZXh0X3NrYXMgewogCXN0cnVjdCBtbV9pZCBpZDsKICAgICAgICAgdW5zaWduZWQgbG9uZyBsYXN0X3BhZ2VfdGFibGU7CisjaWZkZWYgQ09ORklHXzNfTEVWRUxfUEdUQUJMRVMKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsYXN0X3BtZDsKKyNlbmRpZgogfTsKIAogZXh0ZXJuIHZvaWQgc3dpdGNoX21tX3NrYXMoc3RydWN0IG1tX2lkICogbW1faWRwKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9za2FzLmggYi9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvc2thcy5oCmluZGV4IGQ5ODNlYTguLjA2MDkzNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9za2FzLmgKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3NrYXMuaApAQCAtMjQsMjggKzI0LDI2IEBACiBleHRlcm4gdm9pZCByZW1vdmVfc2lnc3RhY2sodm9pZCk7CiBleHRlcm4gdm9pZCBuZXdfdGhyZWFkX2hhbmRsZXIoaW50IHNpZyk7CiBleHRlcm4gdm9pZCBoYW5kbGVfc3lzY2FsbCh1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gaW50IG1hcChzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsIHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBsZW4sCi0gICAgICAgICAgICAgICBpbnQgciwgaW50IHcsIGludCB4LCBpbnQgcGh5c19mZCwgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCk7Ci1leHRlcm4gaW50IHVubWFwKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pOworZXh0ZXJuIGludCBtYXAoc3RydWN0IG1tX2lkICogbW1faWRwLCB1bnNpZ25lZCBsb25nIHZpcnQsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgciwgaW50IHcsIGludCB4LCBpbnQgcGh5c19mZCwKKwkgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCwgaW50IGRvbmUsIHZvaWQgKipkYXRhKTsKK2V4dGVybiBpbnQgdW5tYXAoc3RydWN0IG1tX2lkICogbW1faWRwLCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJIGludCBkb25lLCB2b2lkICoqZGF0YSk7CiBleHRlcm4gaW50IHByb3RlY3Qoc3RydWN0IG1tX2lkICogbW1faWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCSAgIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgciwgaW50IHcsIGludCB4KTsKKwkJICAgdW5zaWduZWQgbG9uZyBsZW4sIGludCByLCBpbnQgdywgaW50IHgsIGludCBkb25lLAorCQkgICB2b2lkICoqZGF0YSk7CiBleHRlcm4gdm9pZCB1c2VyX3NpZ25hbChpbnQgc2lnLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncywgaW50IHBpZCk7Ci1leHRlcm4gaW50IG5ld19tbShpbnQgZnJvbSk7CitleHRlcm4gaW50IG5ld19tbShpbnQgZnJvbSwgdW5zaWduZWQgbG9uZyBzdGFjayk7CiBleHRlcm4gaW50IHN0YXJ0X3VzZXJzcGFjZSh1bnNpZ25lZCBsb25nIHN0dWJfc3RhY2spOwogZXh0ZXJuIGludCBjb3B5X2NvbnRleHRfc2thczAodW5zaWduZWQgbG9uZyBzdGFjaywgaW50IHBpZCk7CiBleHRlcm4gdm9pZCBnZXRfc2thc19mYXVsdGluZm8oaW50IHBpZCwgc3RydWN0IGZhdWx0aW5mbyAqIGZpKTsKIGV4dGVybiBsb25nIGV4ZWN1dGVfc3lzY2FsbF9za2FzKHZvaWQgKnIpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY3VycmVudF9zdHViX3N0YWNrKHZvaWQpOworZXh0ZXJuIGxvbmcgcnVuX3N5c2NhbGxfc3R1YihzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeXNjYWxsLCB1bnNpZ25lZCBsb25nICphcmdzLCBsb25nIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYWRkciwgaW50IGRvbmUpOworZXh0ZXJuIGxvbmcgc3lzY2FsbF9zdHViX2RhdGEoc3RydWN0IG1tX2lkICogbW1faWRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqZGF0YSwgaW50IGRhdGFfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYWRkciwgdm9pZCAqKnN0dWJfYWRkcik7CiAKICNlbmRpZgotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3VhY2Nlc3Mtc2thcy5oIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3VhY2Nlc3Mtc2thcy5oCmluZGV4IGNkNmMyODAuLjZlZTNmMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS91YWNjZXNzLXNrYXMuaAorKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvdWFjY2Vzcy1za2FzLmgKQEAgLTE4LDE4ICsxOCwxOCBAQAogCSAgKCh1bnNpZ25lZCBsb25nKSAoYWRkcikgKyAoc2l6ZSkgPD0gRklYQUREUl9VU0VSX0VORCkgJiYgXAogCSAgKCh1bnNpZ25lZCBsb25nKSAoYWRkcikgKyAoc2l6ZSkgPj0gKHVuc2lnbmVkIGxvbmcpKGFkZHIpKSkpCiAKLXN0YXRpYyBpbmxpbmUgaW50IHZlcmlmeV9hcmVhX3NrYXMoaW50IHR5cGUsIGNvbnN0IHZvaWQgKiBhZGRyLAorc3RhdGljIGlubGluZSBpbnQgdmVyaWZ5X2FyZWFfc2thcyhpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKiBhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJcmV0dXJuKGFjY2Vzc19va19za2FzKHR5cGUsIGFkZHIsIHNpemUpID8gMCA6IC1FRkFVTFQpOwogfQogCi1leHRlcm4gaW50IGNvcHlfZnJvbV91c2VyX3NrYXModm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGludCBuKTsKLWV4dGVybiBpbnQgY29weV90b191c2VyX3NrYXModm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGludCBuKTsKLWV4dGVybiBpbnQgc3RybmNweV9mcm9tX3VzZXJfc2thcyhjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgaW50IGNvdW50KTsKLWV4dGVybiBpbnQgX19jbGVhcl91c2VyX3NrYXModm9pZCAqbWVtLCBpbnQgbGVuKTsKLWV4dGVybiBpbnQgY2xlYXJfdXNlcl9za2FzKHZvaWQgKm1lbSwgaW50IGxlbik7Ci1leHRlcm4gaW50IHN0cm5sZW5fdXNlcl9za2FzKGNvbnN0IHZvaWQgKnN0ciwgaW50IGxlbik7CitleHRlcm4gaW50IGNvcHlfZnJvbV91c2VyX3NrYXModm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCBpbnQgbik7CitleHRlcm4gaW50IGNvcHlfdG9fdXNlcl9za2FzKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4pOworZXh0ZXJuIGludCBzdHJuY3B5X2Zyb21fdXNlcl9za2FzKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgaW50IGNvdW50KTsKK2V4dGVybiBpbnQgX19jbGVhcl91c2VyX3NrYXModm9pZCBfX3VzZXIgKm1lbSwgaW50IGxlbik7CitleHRlcm4gaW50IGNsZWFyX3VzZXJfc2thcyh2b2lkIF9fdXNlciAqbWVtLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgc3Rybmxlbl91c2VyX3NrYXMoY29uc3Qgdm9pZCBfX3VzZXIgKnN0ciwgaW50IGxlbik7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL21lbV91c2VyLmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL21lbV91c2VyLmMKaW5kZXggYjA5ODBmZi4uMWQ4OTY0MCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9tZW1fdXNlci5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvbWVtX3VzZXIuYwpAQCAtNSwxMyArNSwxNCBAQAogCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSAibWVtX3VzZXIuaCIKICNpbmNsdWRlICJtZW0uaCIKLSNpbmNsdWRlICJtbV9pZC5oIgorI2luY2x1ZGUgInNrYXMuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJwcm9jX21tLmgiCkBAIC0yMyw0NiArMjQsMTU1IEBACiAjaW5jbHVkZSAidW1sLWNvbmZpZy5oIgogI2luY2x1ZGUgInN5c2RlcC9wdHJhY2UuaCIKICNpbmNsdWRlICJzeXNkZXAvc3R1Yi5oIgotI2luY2x1ZGUgInNrYXMuaCIKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3lzY2FsbF9zdHViLCBfX3N5c2NhbGxfc3R1Yl9zdGFydDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGJhdGNoX3N5c2NhbGxfc3R1YiwgX19zeXNjYWxsX3N0dWJfc3RhcnQ7CiAKIGV4dGVybiB2b2lkIHdhaXRfc3R1Yl9kb25lKGludCBwaWQsIGludCBzaWcsIGNoYXIgKiBmbmFtZSk7CiAKLXN0YXRpYyBsb25nIHJ1bl9zeXNjYWxsX3N0dWIoc3RydWN0IG1tX2lkICogbW1faWRwLCBpbnQgc3lzY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqYXJncykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAqY2hlY2tfaW5pdF9zdGFjayhzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrKQogeworCWlmKHN0YWNrID09IE5VTEwpeworCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIG1tX2lkcC0+c3RhY2sgKyAyOworCQkqc3RhY2sgPSAwOworCX0KKwlyZXR1cm4gc3RhY2s7Cit9CisKK2V4dGVybiBpbnQgcHJvY19tbTsKKworaW50IHNpbmdsZV9jb3VudCA9IDA7CitpbnQgbXVsdGlfY291bnQgPSAwOworaW50IG11bHRpX29wX2NvdW50ID0gMDsKKworc3RhdGljIGxvbmcgZG9fc3lzY2FsbF9zdHViKHN0cnVjdCBtbV9pZCAqbW1faWRwLCB2b2lkICoqYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ3NbTUFYX1JFR19OUl07CisJdW5zaWduZWQgbG9uZyAqZGF0YTsKKwl1bnNpZ25lZCBsb25nICpzeXNjYWxsOworCWxvbmcgcmV0LCBvZmZzZXQ7CiAgICAgICAgIGludCBuLCBwaWQgPSBtbV9pZHAtPnUucGlkOwotICAgICAgICB1bnNpZ25lZCBsb25nIHJlZ3NbTUFYX1JFR19OUl07CisKKwlpZihwcm9jX21tKQorI3dhcm5pbmcgTmVlZCB0byBsb29rIHVwIHVzZXJzcGFjZV9waWQgYnkgY3B1CisJCXBpZCA9IHVzZXJzcGFjZV9waWRbMF07CisKKwltdWx0aV9jb3VudCsrOwogCiAgICAgICAgIGdldF9zYWZlX3JlZ2lzdGVycyhyZWdzKTsKICAgICAgICAgcmVnc1tSRUdTX0lQX0lOREVYXSA9IFVNTF9DT05GSUdfU1RVQl9DT0RFICsKLSAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcpICZzeXNjYWxsX3N0dWIgLQorCQkoKHVuc2lnbmVkIGxvbmcpICZiYXRjaF9zeXNjYWxsX3N0dWIgLQogICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgJl9fc3lzY2FsbF9zdHViX3N0YXJ0KTsKLSAgICAgICAgLyogWFhYIERvbid0IGhhdmUgYSBkZWZpbmUgZm9yIHN0YXJ0aW5nIGEgc3lzY2FsbCAqLwotICAgICAgICByZWdzW1JFR1NfU1lTQ0FMTF9OUl0gPSBzeXNjYWxsOwotICAgICAgICByZWdzW1JFR1NfU1lTQ0FMTF9BUkcxXSA9IGFyZ3NbMF07Ci0gICAgICAgIHJlZ3NbUkVHU19TWVNDQUxMX0FSRzJdID0gYXJnc1sxXTsKLSAgICAgICAgcmVnc1tSRUdTX1NZU0NBTExfQVJHM10gPSBhcmdzWzJdOwotICAgICAgICByZWdzW1JFR1NfU1lTQ0FMTF9BUkc0XSA9IGFyZ3NbM107Ci0gICAgICAgIHJlZ3NbUkVHU19TWVNDQUxMX0FSRzVdID0gYXJnc1s0XTsKLSAgICAgICAgcmVnc1tSRUdTX1NZU0NBTExfQVJHNl0gPSBhcmdzWzVdOwotICAgICAgICBuID0gcHRyYWNlX3NldHJlZ3MocGlkLCByZWdzKTsKLSAgICAgICAgaWYobiA8IDApewotICAgICAgICAgICAgICAgIHByaW50aygicnVuX3N5c2NhbGxfc3R1YiA6IFBUUkFDRV9TRVRSRUdTIGZhaWxlZCwgIgotICAgICAgICAgICAgICAgICAgICAgICAiZXJybm8gPSAlZFxuIiwgbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKG4pOwotICAgICAgICB9CisJbiA9IHB0cmFjZV9zZXRyZWdzKHBpZCwgcmVncyk7CisJaWYobiA8IDApCisJCXBhbmljKCJkb19zeXNjYWxsX3N0dWIgOiBQVFJBQ0VfU0VUUkVHUyBmYWlsZWQsIGVycm5vID0gJWRcbiIsCisJCSAgICAgIG4pOwogCi0gICAgICAgIHdhaXRfc3R1Yl9kb25lKHBpZCwgMCwgInJ1bl9zeXNjYWxsX3N0dWIiKTsKKwl3YWl0X3N0dWJfZG9uZShwaWQsIDAsICJkb19zeXNjYWxsX3N0dWIiKTsKIAotICAgICAgICByZXR1cm4oKigodW5zaWduZWQgbG9uZyAqKSBtbV9pZHAtPnN0YWNrKSk7CisJLyogV2hlbiB0aGUgc3R1YiBzdG9wcywgd2UgZmluZCB0aGUgZm9sbG93aW5nIHZhbHVlcyBvbiB0aGUKKwkgKiBiZWdpbm5pbmcgb2YgdGhlIHN0YWNrOgorCSAqIChsb25nIClyZXR1cm5fdmFsdWUKKwkgKiAobG9uZyApb2Zmc2V0IHRvIGZhaWxlZCBzeWNhbGwtZGF0YSAoMCwgaWYgbm8gZXJyb3IpCisJICovCisJcmV0ID0gKigodW5zaWduZWQgbG9uZyAqKSBtbV9pZHAtPnN0YWNrKTsKKwlvZmZzZXQgPSAqKCh1bnNpZ25lZCBsb25nICopIG1tX2lkcC0+c3RhY2sgKyAxKTsKKwlpZiAob2Zmc2V0KSB7CisJCWRhdGEgPSAodW5zaWduZWQgbG9uZyAqKShtbV9pZHAtPnN0YWNrICsKKwkJCQkJIG9mZnNldCAtIFVNTF9DT05GSUdfU1RVQl9EQVRBKTsKKwkJc3lzY2FsbCA9ICh1bnNpZ25lZCBsb25nICopKCh1bnNpZ25lZCBsb25nKWRhdGEgKyBkYXRhWzBdKTsKKwkJcHJpbnRrKCJkb19zeXNjYWxsX3N0dWI6IHN5c2NhbGwgJWxkIGZhaWxlZCwgcmV0dXJuIHZhbHVlID0gIgorCQkgICAgICAgIjB4JWx4LCBleHBlY3RlZCByZXR1cm4gdmFsdWUgPSAweCVseFxuIiwKKwkJICAgICAgIHN5c2NhbGxbMF0sIHJldCwgc3lzY2FsbFs3XSk7CisJCXByaW50aygiICAgIHN5c2NhbGwgcGFyYW1ldGVyczogIgorCQkgICAgICAgIjB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4XG4iLAorCQkgICAgICAgc3lzY2FsbFsxXSwgc3lzY2FsbFsyXSwgc3lzY2FsbFszXSwKKwkJICAgICAgIHN5c2NhbGxbNF0sIHN5c2NhbGxbNV0sIHN5c2NhbGxbNl0pOworCQlmb3IobiA9IDE7IG4gPCBkYXRhWzBdL3NpemVvZihsb25nKTsgbisrKSB7CisJCQlpZihuID09IDEpCisJCQkJcHJpbnRrKCIgICAgYWRkaXRpb25hbCBzeXNjYWxsIGRhdGE6Iik7CisJCQlpZihuICUgNCA9PSAxKQorCQkJCXByaW50aygiXG4gICAgICAiKTsKKwkJCXByaW50aygiICAweCVseCIsIGRhdGFbbl0pOworCQl9CisJCWlmKG4gPiAxKQorCQkJcHJpbnRrKCJcbiIpOworCX0KKwllbHNlIHJldCA9IDA7CisKKwkqYWRkciA9IGNoZWNrX2luaXRfc3RhY2sobW1faWRwLCBOVUxMKTsKKworCXJldHVybiByZXQ7CiB9CiAKLWludCBtYXAoc3RydWN0IG1tX2lkICptbV9pZHAsIHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBsZW4sCi0gICAgICAgIGludCByLCBpbnQgdywgaW50IHgsIGludCBwaHlzX2ZkLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0KQorbG9uZyBydW5fc3lzY2FsbF9zdHViKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgaW50IHN5c2NhbGwsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmFyZ3MsIGxvbmcgZXhwZWN0ZWQsIHZvaWQgKiphZGRyLAorIAkJICAgICAgaW50IGRvbmUpCiB7Ci0gICAgICAgIGludCBwcm90LCBuOworIAl1bnNpZ25lZCBsb25nICpzdGFjayA9IGNoZWNrX2luaXRfc3RhY2sobW1faWRwLCAqYWRkcik7CisKKwlpZihkb25lICYmICphZGRyID09IE5VTEwpCisJCXNpbmdsZV9jb3VudCsrOworCisgCSpzdGFjayArPSBzaXplb2YobG9uZyk7CisJc3RhY2sgKz0gKnN0YWNrIC8gc2l6ZW9mKGxvbmcpOworCisgICAgICAgICpzdGFjaysrID0gc3lzY2FsbDsKKyAgICAgICAgKnN0YWNrKysgPSBhcmdzWzBdOworICAgICAgICAqc3RhY2srKyA9IGFyZ3NbMV07CisgICAgICAgICpzdGFjaysrID0gYXJnc1syXTsKKyAgICAgICAgKnN0YWNrKysgPSBhcmdzWzNdOworICAgICAgICAqc3RhY2srKyA9IGFyZ3NbNF07CisgICAgICAgICpzdGFjaysrID0gYXJnc1s1XTsKKwkqc3RhY2srKyA9IGV4cGVjdGVkOworICAgICAgICAqc3RhY2sgPSAwOworICAgICAgICBtdWx0aV9vcF9jb3VudCsrOworCisgICAgICAgIGlmKCFkb25lICYmICgoKCh1bnNpZ25lZCBsb25nKSBzdGFjaykgJiB+UEFHRV9NQVNLKSA8CisJCSAgICAgUEFHRV9TSVpFIC0gMTAgKiBzaXplb2YobG9uZykpKXsKKwkJKmFkZHIgPSBzdGFjazsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisJcmV0dXJuIGRvX3N5c2NhbGxfc3R1YihtbV9pZHAsIGFkZHIpOworfQorCitsb25nIHN5c2NhbGxfc3R1Yl9kYXRhKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmRhdGEsIGludCBkYXRhX2NvdW50LAorCQkgICAgICAgdm9pZCAqKmFkZHIsIHZvaWQgKipzdHViX2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyAqc3RhY2s7CisJaW50IHJldCA9IDA7CisKKwkvKiBJZiAqYWRkciBzdGlsbCBpcyB1bmluaXRpYWxpemVkLCBpdCAqbXVzdCogY29udGFpbiBOVUxMLgorCSAqIFRodXMgaW4gdGhpcyBjYXNlIGRvX3N5c2NhbGxfc3R1YiBjb3JyZWN0bHkgd29uJ3QgYmUgY2FsbGVkLgorCSAqLworCWlmKCgoKHVuc2lnbmVkIGxvbmcpICphZGRyKSAmIH5QQUdFX01BU0spID49CisJICAgUEFHRV9TSVpFIC0gKDEwICsgZGF0YV9jb3VudCkgKiBzaXplb2YobG9uZykpIHsKKwkJcmV0ID0gZG9fc3lzY2FsbF9zdHViKG1tX2lkcCwgYWRkcik7CisgCQkvKiBpbiBjYXNlIG9mIGVycm9yLCBkb24ndCBvdmVyd3JpdGUgZGF0YSBvbiBzdGFjayAqLworCQlpZihyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXN0YWNrID0gY2hlY2tfaW5pdF9zdGFjayhtbV9pZHAsICphZGRyKTsKKwkqYWRkciA9IHN0YWNrOworCisJKnN0YWNrID0gZGF0YV9jb3VudCAqIHNpemVvZihsb25nKTsKKworCW1lbWNweShzdGFjayArIDEsIGRhdGEsIGRhdGFfY291bnQgKiBzaXplb2YobG9uZykpOworCisJKnN0dWJfYWRkciA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZykoc3RhY2sgKyAxKSAmIH5QQUdFX01BU0spICsKKwkJCSAgICAgIFVNTF9DT05GSUdfU1RVQl9EQVRBKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFwKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwKKwlpbnQgciwgaW50IHcsIGludCB4LCBpbnQgcGh5c19mZCwgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCwKKwlpbnQgZG9uZSwgdm9pZCAqKmRhdGEpCit7CisgICAgICAgIGludCBwcm90LCByZXQ7CiAKICAgICAgICAgcHJvdCA9IChyID8gUFJPVF9SRUFEIDogMCkgfCAodyA/IFBST1RfV1JJVEUgOiAwKSB8CiAgICAgICAgICAgICAgICAgKHggPyBQUk9UX0VYRUMgOiAwKTsKQEAgLTcwLDYgKzE4MCw3IEBACiAgICAgICAgIGlmKHByb2NfbW0pewogICAgICAgICAgICAgICAgIHN0cnVjdCBwcm9jX21tX29wIG1hcDsKICAgICAgICAgICAgICAgICBpbnQgZmQgPSBtbV9pZHAtPnUubW1fZmQ7CisKICAgICAgICAgICAgICAgICBtYXAgPSAoKHN0cnVjdCBwcm9jX21tX29wKSB7IC5vcAk9IE1NX01NQVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudQkJPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAubW1hcAk9CkBAIC04MSw2MyArMTkyLDYxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZkCT0gcGh5c19mZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0PSBvZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9IH0gKTsKLSAgICAgICAgICAgICAgICBuID0gb3Nfd3JpdGVfZmlsZShmZCwgJm1hcCwgc2l6ZW9mKG1hcCkpOwotICAgICAgICAgICAgICAgIGlmKG4gIT0gc2l6ZW9mKG1hcCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIm1hcCA6IC9wcm9jL21tIG1hcCBmYWlsZWQsIGVyciA9ICVkXG4iLCAtbik7CisJCXJldCA9IG9zX3dyaXRlX2ZpbGUoZmQsICZtYXAsIHNpemVvZihtYXApKTsKKwkJaWYocmV0ICE9IHNpemVvZihtYXApKQorCQkJcHJpbnRrKCJtYXAgOiAvcHJvYy9tbSBtYXAgZmFpbGVkLCBlcnIgPSAlZFxuIiwgLXJldCk7CisJCWVsc2UgcmV0ID0gMDsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb25nIHJlczsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ3NbXSA9IHsgdmlydCwgbGVuLCBwcm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELCBwaHlzX2ZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTUFQX09GRlNFVChvZmZzZXQpIH07CiAKLSAgICAgICAgICAgICAgICByZXMgPSBydW5fc3lzY2FsbF9zdHViKG1tX2lkcCwgU1RVQl9NTUFQX05SLCBhcmdzKTsKLSAgICAgICAgICAgICAgICBpZigodm9pZCAqKSByZXMgPT0gTUFQX0ZBSUxFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygibW1hcCBzdHViIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgcmVzKTsKKwkJcmV0ID0gcnVuX3N5c2NhbGxfc3R1YihtbV9pZHAsIFNUVUJfTU1BUF9OUiwgYXJncywgdmlydCwKKwkJCQkgICAgICAgZGF0YSwgZG9uZSk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCi1pbnQgdW5tYXAoc3RydWN0IG1tX2lkICptbV9pZHAsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoraW50IHVubWFwKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIGludCBkb25lLAorCSAgdm9pZCAqKmRhdGEpCiB7Ci0gICAgICAgIGludCBuOworICAgICAgICBpbnQgcmV0OwogCiAgICAgICAgIGlmKHByb2NfbW0pewogICAgICAgICAgICAgICAgIHN0cnVjdCBwcm9jX21tX29wIHVubWFwOwogICAgICAgICAgICAgICAgIGludCBmZCA9IG1tX2lkcC0+dS5tbV9mZDsKKwogICAgICAgICAgICAgICAgIHVubWFwID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AJPSBNTV9NVU5NQVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51CT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAubXVubWFwCT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5hZGRyCT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbgkJPSBsZW4gfSB9IH0gKTsKLSAgICAgICAgICAgICAgICBuID0gb3Nfd3JpdGVfZmlsZShmZCwgJnVubWFwLCBzaXplb2YodW5tYXApKTsKLSAgICAgICAgICAgICAgICBpZihuICE9IHNpemVvZih1bm1hcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKG4gPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKG4gPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oLUVJTyk7Ci0gICAgICAgICAgICAgICAgfQorCQlyZXQgPSBvc193cml0ZV9maWxlKGZkLCAmdW5tYXAsIHNpemVvZih1bm1hcCkpOworCQlpZihyZXQgIT0gc2l6ZW9mKHVubWFwKSkKKwkJCXByaW50aygidW5tYXAgLSBwcm9jX21tIHdyaXRlIHJldHVybmVkICVkXG4iLCByZXQpOworCQllbHNlIHJldCA9IDA7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlczsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ3NbXSA9IHsgKHVuc2lnbmVkIGxvbmcpIGFkZHIsIGxlbiwgMCwgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB9OwogCi0gICAgICAgICAgICAgICAgcmVzID0gcnVuX3N5c2NhbGxfc3R1YihtbV9pZHAsIF9fTlJfbXVubWFwLCBhcmdzKTsKLSAgICAgICAgICAgICAgICBpZihyZXMgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJtdW5tYXAgc3R1YiBmYWlsZWQsIGVycm5vID0gJWRcbiIsIHJlcyk7CisJCXJldCA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBfX05SX211bm1hcCwgYXJncywgMCwKKwkJCQkgICAgICAgZGF0YSwgZG9uZSk7CisgICAgICAgICAgICAgICAgaWYocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygibXVubWFwIHN0dWIgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCByZXQpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuKDApOworICAgICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgcHJvdGVjdChzdHJ1Y3QgbW1faWQgKm1tX2lkcCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkgICAgaW50IHIsIGludCB3LCBpbnQgeCkKK2ludCBwcm90ZWN0KHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkgICAgaW50IHIsIGludCB3LCBpbnQgeCwgaW50IGRvbmUsIHZvaWQgKipkYXRhKQogewogICAgICAgICBzdHJ1Y3QgcHJvY19tbV9vcCBwcm90ZWN0OwotICAgICAgICBpbnQgcHJvdCwgbjsKKyAgICAgICAgaW50IHByb3QsIHJldDsKIAogICAgICAgICBwcm90ID0gKHIgPyBQUk9UX1JFQUQgOiAwKSB8ICh3ID8gUFJPVF9XUklURSA6IDApIHwKICAgICAgICAgICAgICAgICAoeCA/IFBST1RfRVhFQyA6IDApOwpAQCAtMTUyLDIwICsyNjEsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbgk9IGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3QJPSBwcm90IH0gfSB9ICk7CiAKLSAgICAgICAgICAgICAgICBuID0gb3Nfd3JpdGVfZmlsZShmZCwgJnByb3RlY3QsIHNpemVvZihwcm90ZWN0KSk7Ci0gICAgICAgICAgICAgICAgaWYobiAhPSBzaXplb2YocHJvdGVjdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBwYW5pYygicHJvdGVjdCBmYWlsZWQsIGVyciA9ICVkIiwgLW4pOworICAgICAgICAgICAgICAgIHJldCA9IG9zX3dyaXRlX2ZpbGUoZmQsICZwcm90ZWN0LCBzaXplb2YocHJvdGVjdCkpOworICAgICAgICAgICAgICAgIGlmKHJldCAhPSBzaXplb2YocHJvdGVjdCkpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoInByb3RlY3QgZmFpbGVkLCBlcnIgPSAlZCIsIC1yZXQpOworICAgICAgICAgICAgICAgIGVsc2UgcmV0ID0gMDsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVzOwogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnc1tdID0geyBhZGRyLCBsZW4sIHByb3QsIDAsIDAsIDAgfTsKIAotICAgICAgICAgICAgICAgIHJlcyA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBfX05SX21wcm90ZWN0LCBhcmdzKTsKLSAgICAgICAgICAgICAgICBpZihyZXMgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcGFuaWMoIm1wcm90ZWN0IHN0dWIgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCByZXMpOworICAgICAgICAgICAgICAgIHJldCA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBfX05SX21wcm90ZWN0LCBhcmdzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZG9uZSk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIHJldHVybiByZXQ7CiB9CiAKIHZvaWQgYmVmb3JlX21lbV9za2FzKHVuc2lnbmVkIGxvbmcgdW51c2VkKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvbW11LmMKaW5kZXggZDIzMmRhYS4uMjQwMTQzYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL21tdS5jCkBAIC01Niw2ICs1Niw5IEBACiAJICovCiAKICAgICAgICAgbW0tPmNvbnRleHQuc2thcy5sYXN0X3BhZ2VfdGFibGUgPSBwbWRfcGFnZV9rZXJuZWwoKnBtZCk7CisjaWZkZWYgQ09ORklHXzNfTEVWRUxfUEdUQUJMRVMKKyAgICAgICAgbW0tPmNvbnRleHQuc2thcy5sYXN0X3BtZCA9ICh1bnNpZ25lZCBsb25nKSBfX3ZhKHB1ZF92YWwoKnB1ZCkpOworI2VuZGlmCiAKIAkqcHRlID0gbWtfcHRlKHZpcnRfdG9fcGFnZShrZXJuZWwpLCBfX3BncHJvdChfUEFHRV9QUkVTRU5UKSk7CiAJKnB0ZSA9IHB0ZV9ta2V4ZWMoKnB0ZSk7CkBAIC03NywyMyArODAsMTQgQEAKIAlzdHJ1Y3QgbW1fc3RydWN0ICpjdXJfbW0gPSBjdXJyZW50LT5tbTsKIAlzdHJ1Y3QgbW1faWQgKmN1cl9tbV9pZCA9ICZjdXJfbW0tPmNvbnRleHQuc2thcy5pZDsKIAlzdHJ1Y3QgbW1faWQgKm1tX2lkID0gJm1tLT5jb250ZXh0LnNrYXMuaWQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFjazsKLQlpbnQgZnJvbSwgcmV0OworCXVuc2lnbmVkIGxvbmcgc3RhY2sgPSAwOworCWludCBmcm9tLCByZXQgPSAtRU5PTUVNOwogCi0JaWYocHJvY19tbSl7Ci0JCWlmKChjdXJfbW0gIT0gTlVMTCkgJiYgKGN1cl9tbSAhPSAmaW5pdF9tbSkpCi0JCQlmcm9tID0gY3VyX21tLT5jb250ZXh0LnNrYXMuaWQudS5tbV9mZDsKLQkJZWxzZSBmcm9tID0gLTE7CisJaWYoIXByb2NfbW0gfHwgIXB0cmFjZV9mYXVsdGluZm8peworCQlzdGFjayA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYoc3RhY2sgPT0gMCkKKwkJCWdvdG8gb3V0OwogCi0JCXJldCA9IG5ld19tbShmcm9tKTsKLQkJaWYocmV0IDwgMCl7Ci0JCQlwcmludGsoImluaXRfbmV3X2NvbnRleHRfc2thcyAtIG5ld19tbSBmYWlsZWQsICIKLQkJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJbW1faWQtPnUubW1fZmQgPSByZXQ7Ci0JfQotCWVsc2UgewogCQkvKiBUaGlzIHplcm9zIHRoZSBlbnRyeSB0aGF0IHBnZF9hbGxvYyBkaWRuJ3QsIG5lZWRlZCBzaW5jZQogCQkgKiB3ZSBhcmUgYWJvdXQgdG8gcmVpbml0aWFsaXplIGl0LCBhbmQgd2FudCBtbS5ucl9wdGVzIHRvCiAJCSAqIGJlIGFjY3VyYXRlLgpAQCAtMTAzLDIwICs5NywzMCBAQAogCQlyZXQgPSBpbml0X3N0dWJfcHRlKG1tLCBDT05GSUdfU1RVQl9DT0RFLAogCQkJCSAgICAodW5zaWduZWQgbG9uZykgJl9fc3lzY2FsbF9zdHViX3N0YXJ0KTsKIAkJaWYocmV0KQotCQkJZ290byBvdXQ7Ci0KLQkJcmV0ID0gLUVOT01FTTsKLQkJc3RhY2sgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCWlmKHN0YWNrID09IDApCi0JCQlnb3RvIG91dDsKLQkJbW1faWQtPnN0YWNrID0gc3RhY2s7CisJCQlnb3RvIG91dF9mcmVlOwogCiAJCXJldCA9IGluaXRfc3R1Yl9wdGUobW0sIENPTkZJR19TVFVCX0RBVEEsIHN0YWNrKTsKIAkJaWYocmV0KQogCQkJZ290byBvdXRfZnJlZTsKIAogCQltbS0+bnJfcHRlcy0tOworCX0KKwltbV9pZC0+c3RhY2sgPSBzdGFjazsKIAorCWlmKHByb2NfbW0peworCQlpZigoY3VyX21tICE9IE5VTEwpICYmIChjdXJfbW0gIT0gJmluaXRfbW0pKQorCQkJZnJvbSA9IGN1cl9tbV9pZC0+dS5tbV9mZDsKKwkJZWxzZSBmcm9tID0gLTE7CisKKwkJcmV0ID0gbmV3X21tKGZyb20sIHN0YWNrKTsKKwkJaWYocmV0IDwgMCl7CisJCQlwcmludGsoImluaXRfbmV3X2NvbnRleHRfc2thcyAtIG5ld19tbSBmYWlsZWQsICIKKwkJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJbW1faWQtPnUubW1fZmQgPSByZXQ7CisJfQorCWVsc2UgewogCQlpZigoY3VyX21tICE9IE5VTEwpICYmIChjdXJfbW0gIT0gJmluaXRfbW0pKQogCQkJbW1faWQtPnUucGlkID0gY29weV9jb250ZXh0X3NrYXMwKHN0YWNrLAogCQkJCQkJCSAgY3VyX21tX2lkLT51LnBpZCk7CkBAIC0xMjYsNyArMTMwLDggQEAKIAlyZXR1cm4gMDsKIAogIG91dF9mcmVlOgotCWZyZWVfcGFnZShtbV9pZC0+c3RhY2spOworCWlmKG1tX2lkLT5zdGFjayAhPSAwKQorCQlmcmVlX3BhZ2UobW1faWQtPnN0YWNrKTsKICBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzNyw5ICsxNDIsMTUgQEAKIAogCWlmKHByb2NfbW0pCiAJCW9zX2Nsb3NlX2ZpbGUobW11LT5pZC51Lm1tX2ZkKTsKLQllbHNlIHsKKwllbHNlCiAJCW9zX2tpbGxfcHRyYWNlZF9wcm9jZXNzKG1tdS0+aWQudS5waWQsIDEpOworCisJaWYoIXByb2NfbW0gfHwgIXB0cmFjZV9mYXVsdGluZm8pewogCQlmcmVlX3BhZ2UobW11LT5pZC5zdGFjayk7Ci0JCWZyZWVfcGFnZShtbXUtPmxhc3RfcGFnZV90YWJsZSk7CisJCXB0ZV9mcmVlX2tlcm5lbCgocHRlX3QgKikgbW11LT5sYXN0X3BhZ2VfdGFibGUpOworICAgICAgICAgICAgICAgIGRlY19wYWdlX3N0YXRlKG5yX3BhZ2VfdGFibGVfcGFnZXMpOworI2lmZGVmIENPTkZJR18zX0xFVkVMX1BHVEFCTEVTCisJCXBtZF9mcmVlKChwbWRfdCAqKSBtbXUtPmxhc3RfcG1kKTsKKyNlbmRpZgogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzLmMKaW5kZXggZjIyOGY4Yi4uNWNkMGU5OSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzLmMKQEAgLTEzOCw2ICsxMzgsOCBAQAogfQogCiBleHRlcm4gaW50IF9fc3lzY2FsbF9zdHViX3N0YXJ0OworaW50IHN0dWJfY29kZV9mZCA9IC0xOworX191NjQgc3R1Yl9jb2RlX29mZnNldDsKIAogc3RhdGljIGludCB1c2Vyc3BhY2VfdHJhbXAodm9pZCAqc3RhY2spCiB7CkBAIC0xNTIsMzEgKzE1NCwzMSBAQAogCQkvKiBUaGlzIGhhcyBhIHB0ZSwgYnV0IGl0IGNhbid0IGJlIG1hcHBlZCBpbiB3aXRoIHRoZSB1c3VhbAogCQkgKiB0bGJfZmx1c2ggbWVjaGFuaXNtIGJlY2F1c2UgdGhpcyBpcyBwYXJ0IG9mIHRoYXQgbWVjaGFuaXNtCiAJCSAqLwotCQlpbnQgZmQ7Ci0JCV9fdTY0IG9mZnNldDsKLQotCQlmZCA9IHBoeXNfbWFwcGluZyh0b19waHlzKCZfX3N5c2NhbGxfc3R1Yl9zdGFydCksICZvZmZzZXQpOwogCQlhZGRyID0gbW1hcDY0KCh2b2lkICopIFVNTF9DT05GSUdfU1RVQl9DT0RFLCBwYWdlX3NpemUoKSwKLQkJCSAgICAgIFBST1RfRVhFQywgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsIGZkLCBvZmZzZXQpOworCQkJICAgICAgUFJPVF9FWEVDLCBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwKKwkJCSAgICAgIHN0dWJfY29kZV9mZCwgc3R1Yl9jb2RlX29mZnNldCk7CiAJCWlmKGFkZHIgPT0gTUFQX0ZBSUxFRCl7Ci0JCQlwcmludGsoIm1hcHBpbmcgbW1hcCBzdHViIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKKwkJCXByaW50aygibWFwcGluZyBzdHViIGNvZGUgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAogCQkJICAgICAgIGVycm5vKTsKIAkJCWV4aXQoMSk7CiAJCX0KIAogCQlpZihzdGFjayAhPSBOVUxMKXsKKwkJCWludCBmZDsKKwkJCV9fdTY0IG9mZnNldDsKKwogCQkJZmQgPSBwaHlzX21hcHBpbmcodG9fcGh5cyhzdGFjayksICZvZmZzZXQpOwogCQkJYWRkciA9IG1tYXAoKHZvaWQgKikgVU1MX0NPTkZJR19TVFVCX0RBVEEsIHBhZ2Vfc2l6ZSgpLAogCQkJCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAogCQkJCSAgICBNQVBfRklYRUQgfCBNQVBfU0hBUkVELCBmZCwgb2Zmc2V0KTsKIAkJCWlmKGFkZHIgPT0gTUFQX0ZBSUxFRCl7Ci0JCQkJcHJpbnRrKCJtYXBwaW5nIHNlZ2ZhdWx0IHN0YWNrIGZhaWxlZCwgIgorCQkJCXByaW50aygibWFwcGluZyBzdHViIHN0YWNrIGZhaWxlZCwgIgogCQkJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgZXJybm8pOwogCQkJCWV4aXQoMSk7CiAJCQl9CiAJCX0KIAl9Ci0JaWYoIXB0cmFjZV9mYXVsdGluZm8gJiYgKHN0YWNrICE9IE5VTEwpKXsKKwlpZighcHRyYWNlX2ZhdWx0aW5mbyl7CiAJCXVuc2lnbmVkIGxvbmcgdiA9IFVNTF9DT05GSUdfU1RVQl9DT0RFICsKIAkJCQkgICh1bnNpZ25lZCBsb25nKSBzdHViX3NlZ3ZfaGFuZGxlciAtCiAJCQkJICAodW5zaWduZWQgbG9uZykgJl9fc3lzY2FsbF9zdHViX3N0YXJ0OwpAQCAtMjAyLDYgKzIwNCwxMCBAQAogCXVuc2lnbmVkIGxvbmcgc3A7CiAJaW50IHBpZCwgc3RhdHVzLCBuLCBmbGFnczsKIAorCWlmICggc3R1Yl9jb2RlX2ZkID09IC0xICkKKwkJc3R1Yl9jb2RlX2ZkID0gcGh5c19tYXBwaW5nKHRvX3BoeXMoJl9fc3lzY2FsbF9zdHViX3N0YXJ0KSwKKwkJCQkJICAgICZzdHViX2NvZGVfb2Zmc2V0KTsKKwogCXN0YWNrID0gbW1hcChOVUxMLCBQQUdFX1NJWkUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCiAJCSAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CiAJaWYoc3RhY2sgPT0gTUFQX0ZBSUxFRCkKQEAgLTM2Myw2ICszNjksNTMgQEAKIAlyZXR1cm4gcGlkOwogfQogCisvKgorICogVGhpcyBpcyB1c2VkIG9ubHksIGlmIHByb2NfbW0gaXMgYXZhaWxhYmxlLCB3aGlsZSBQVFJBQ0VfRkFVTFRJTkZPCisgKiBpc24ndC4gT3BlbmluZyAvcHJvYy9tbSBjcmVhdGVzIGEgbmV3IG1tX2NvbnRleHQsIHdoaWNoIGxhY2tzIHRoZSBzdHViLXBhZ2VzCisgKiBUaHVzLCB3ZSBtYXAgdGhlbSB1c2luZyAvcHJvYy9tbS1mZAorICovCit2b2lkIG1hcF9zdHViX3BhZ2VzKGludCBmZCwgdW5zaWduZWQgbG9uZyBjb2RlLAorCQkgICAgdW5zaWduZWQgbG9uZyBkYXRhLCB1bnNpZ25lZCBsb25nIHN0YWNrKQoreworCXN0cnVjdCBwcm9jX21tX29wIG1tb3A7CisJaW50IG47CisKKwltbW9wID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AgICAgICAgID0gTU1fTU1BUCwKKwkJCQkgICAgICAudSAgICAgICAgID0KKwkJCQkgICAgICB7IC5tbWFwICAgID0KKwkJCQkJeyAuYWRkciAgICA9IGNvZGUsCisJCQkJCSAgLmxlbiAgICAgPSBQQUdFX1NJWkUsCisJCQkJCSAgLnByb3QgICAgPSBQUk9UX0VYRUMsCisJCQkJCSAgLmZsYWdzICAgPSBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwKKwkJCQkJICAuZmQgICAgICA9IHN0dWJfY29kZV9mZCwKKwkJCQkJICAub2Zmc2V0ICA9IHN0dWJfY29kZV9vZmZzZXQKKwl9IH0gfSk7CisJbiA9IG9zX3dyaXRlX2ZpbGUoZmQsICZtbW9wLCBzaXplb2YobW1vcCkpOworCWlmKG4gIT0gc2l6ZW9mKG1tb3ApKQorCQlwYW5pYygibWFwX3N0dWJfcGFnZXMgOiAvcHJvYy9tbSBtYXAgZm9yIGNvZGUgZmFpbGVkLCAiCisJCSAgICAgICJlcnIgPSAlZFxuIiwgLW4pOworCisJaWYgKCBzdGFjayApIHsKKwkJX191NjQgbWFwX29mZnNldDsKKwkJaW50IG1hcF9mZCA9IHBoeXNfbWFwcGluZyh0b19waHlzKCh2b2lkICopc3RhY2spLCAmbWFwX29mZnNldCk7CisJCW1tb3AgPSAoKHN0cnVjdCBwcm9jX21tX29wKQorCQkJCXsgLm9wICAgICAgICA9IE1NX01NQVAsCisJCQkJICAudSAgICAgICAgID0KKwkJCQkgIHsgLm1tYXAgICAgPQorCQkJCSAgICB7IC5hZGRyICAgID0gZGF0YSwKKwkJCQkgICAgICAubGVuICAgICA9IFBBR0VfU0laRSwKKwkJCQkgICAgICAucHJvdCAgICA9IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQkJICAgICAgLmZsYWdzICAgPSBNQVBfRklYRUQgfCBNQVBfU0hBUkVELAorCQkJCSAgICAgIC5mZCAgICAgID0gbWFwX2ZkLAorCQkJCSAgICAgIC5vZmZzZXQgID0gbWFwX29mZnNldAorCQl9IH0gfSk7CisJCW4gPSBvc193cml0ZV9maWxlKGZkLCAmbW1vcCwgc2l6ZW9mKG1tb3ApKTsKKwkJaWYobiAhPSBzaXplb2YobW1vcCkpCisJCQlwYW5pYygibWFwX3N0dWJfcGFnZXMgOiAvcHJvYy9tbSBtYXAgZm9yIGRhdGEgZmFpbGVkLCAiCisJCQkgICAgICAiZXJyID0gJWRcbiIsIC1uKTsKKwl9Cit9CisKIHZvaWQgbmV3X3RocmVhZCh2b2lkICpzdGFjaywgdm9pZCAqKnN3aXRjaF9idWZfcHRyLCB2b2lkICoqZm9ya19idWZfcHRyLAogCQl2b2lkICgqaGFuZGxlcikoaW50KSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzc19rZXJuLmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3Nfa2Vybi5jCmluZGV4IGNiYWJhYjEuLjNkMWIyMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzc19rZXJuLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzX2tlcm4uYwpAQCAtMTI5LDcgKzEyOSw5IEBACiAJcmV0dXJuKDApOwogfQogCi1pbnQgbmV3X21tKGludCBmcm9tKQorZXh0ZXJuIHZvaWQgbWFwX3N0dWJfcGFnZXMoaW50IGZkLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJCQkgICB1bnNpZ25lZCBsb25nIGRhdGEsIHVuc2lnbmVkIGxvbmcgc3RhY2spOworaW50IG5ld19tbShpbnQgZnJvbSwgdW5zaWduZWQgbG9uZyBzdGFjaykKIHsKIAlzdHJ1Y3QgcHJvY19tbV9vcCBjb3B5OwogCWludCBuLCBmZDsKQEAgLTE0OCw2ICsxNTAsOSBAQAogCQkJICAgICAgICJlcnIgPSAlZFxuIiwgLW4pOwogCX0KIAorCWlmKCFwdHJhY2VfZmF1bHRpbmZvKQorCQltYXBfc3R1Yl9wYWdlcyhmZCwgQ09ORklHX1NUVUJfQ09ERSwgQ09ORklHX1NUVUJfREFUQSwgc3RhY2spOworCiAJcmV0dXJuKGZkKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9zeXNjYWxsLmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3N5c2NhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWZiOTQwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9zeXNjYWxsLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgImxpbnV4L3N5cy5oIgorI2luY2x1ZGUgImxpbnV4L3B0cmFjZS5oIgorI2luY2x1ZGUgImFzbS9lcnJuby5oIgorI2luY2x1ZGUgImFzbS91bmlzdGQuaCIKKyNpbmNsdWRlICJhc20vcHRyYWNlLmgiCisjaW5jbHVkZSAiYXNtL2N1cnJlbnQuaCIKKyNpbmNsdWRlICJzeXNkZXAvc3lzY2FsbHMuaCIKKyNpbmNsdWRlICJrZXJuX3V0aWwuaCIKKyNpbmNsdWRlICJzeXNjYWxsLmgiCisKK3ZvaWQgaGFuZGxlX3N5c2NhbGwodW5pb24gdW1sX3B0X3JlZ3MgKnIpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBjb250YWluZXJfb2Yociwgc3RydWN0IHB0X3JlZ3MsIHJlZ3MpOworCWxvbmcgcmVzdWx0OworCWludCBzeXNjYWxsOworI2lmZGVmIFVNTF9DT05GSUdfU1lTQ0FMTF9ERUJVRworICAJaW50IGluZGV4OworCisgIAlpbmRleCA9IHJlY29yZF9zeXNjYWxsX3N0YXJ0KFVQVF9TWVNDQUxMX05SKHIpKTsKKyNlbmRpZgorCXN5c2NhbGxfdHJhY2UociwgMCk7CisKKwljdXJyZW50LT50aHJlYWQubnN5c2NhbGxzKys7CisJbnN5c2NhbGxzKys7CisKKwkvKiBUaGlzIHNob3VsZCBnbyBpbiB0aGUgZGVjbGFyYXRpb24gb2Ygc3lzY2FsbCwgYnV0IHdoZW4gSSBkbyB0aGF0LAorCSAqIHN0cmFjZSAtZiAtYyBiYXNoIC1jICdscyA7IGxzJyBicmVha3MsIHNvbWV0aW1lcyBub3QgdHJhY2luZworCSAqIGNoaWxkcmVuIGF0IGFsbCwgc29tZXRpbWVzIGhhbmdpbmcgd2hlbiBiYXNoIGRvZXNuJ3Qgc2VlIHRoZSBmaXJzdAorCSAqIGxzIGV4aXQuCisJICogVGhlIGFzc2VtYmx5IGxvb2tzIGZ1bmN0aW9uYWxseSB0aGUgc2FtZSB0byBtZS4gIFRoaXMgaXMKKwkgKiAgICAgZ2NjIHZlcnNpb24gNC4wLjEgMjAwNTA3MjcgKFJlZCBIYXQgNC4wLjEtNSkKKwkgKiBpbiBjYXNlIGl0J3MgYSBjb21waWxlciBidWcuCisJICovCisJc3lzY2FsbCA9IFVQVF9TWVNDQUxMX05SKHIpOworCWlmKChzeXNjYWxsID49IE5SX3N5c2NhbGxzKSB8fCAoc3lzY2FsbCA8IDApKQorCQlyZXN1bHQgPSAtRU5PU1lTOworCWVsc2UgcmVzdWx0ID0gRVhFQ1VURV9TWVNDQUxMKHN5c2NhbGwsIHJlZ3MpOworCisJUkVHU19TRVRfU1lTQ0FMTF9SRVRVUk4oci0+c2thcy5yZWdzLCByZXN1bHQpOworCisJc3lzY2FsbF90cmFjZShyLCAxKTsKKyNpZmRlZiBVTUxfQ09ORklHX1NZU0NBTExfREVCVUcKKyAgCXJlY29yZF9zeXNjYWxsX2VuZChpbmRleCwgcmVzdWx0KTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9zeXNjYWxsX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvc3lzY2FsbF9rZXJuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjA0MGMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9zeXNjYWxsX2tlcm4uYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwMyBKZWZmIERpa2UgKGpkaWtlQGFkZHRvaXQuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlICJsaW51eC9zeXMuaCIKLSNpbmNsdWRlICJsaW51eC9wdHJhY2UuaCIKLSNpbmNsdWRlICJhc20vZXJybm8uaCIKLSNpbmNsdWRlICJhc20vdW5pc3RkLmgiCi0jaW5jbHVkZSAiYXNtL3B0cmFjZS5oIgotI2luY2x1ZGUgImFzbS9jdXJyZW50LmgiCi0jaW5jbHVkZSAic3lzZGVwL3N5c2NhbGxzLmgiCi0jaW5jbHVkZSAia2Vybl91dGlsLmgiCi0KLWV4dGVybiBzeXNjYWxsX2hhbmRsZXJfdCAqc3lzX2NhbGxfdGFibGVbXTsKLQotbG9uZyBleGVjdXRlX3N5c2NhbGxfc2thcyh2b2lkICpyKQotewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gcjsKLQlsb25nIHJlczsKLQlpbnQgc3lzY2FsbDsKLQotCWN1cnJlbnQtPnRocmVhZC5uc3lzY2FsbHMrKzsKLQluc3lzY2FsbHMrKzsKLQlzeXNjYWxsID0gVVBUX1NZU0NBTExfTlIoJnJlZ3MtPnJlZ3MpOwotCi0JaWYoKHN5c2NhbGwgPj0gTlJfc3lzY2FsbHMpIHx8IChzeXNjYWxsIDwgMCkpCi0JCXJlcyA9IC1FTk9TWVM7Ci0JZWxzZSByZXMgPSBFWEVDVVRFX1NZU0NBTEwoc3lzY2FsbCwgcmVncyk7Ci0KLQlyZXR1cm4ocmVzKTsKLX0KLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvc3lzY2FsbF91c2VyLmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3N5c2NhbGxfdXNlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA2NjQ5Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvc3lzY2FsbF91c2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgImtlcm5fdXRpbC5oIgotI2luY2x1ZGUgInVtbC1jb25maWcuaCIKLSNpbmNsdWRlICJzeXNjYWxsX3VzZXIuaCIKLSNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCi0jaW5jbHVkZSAic3lzZGVwL3NpZ2NvbnRleHQuaCIKLSNpbmNsdWRlICJza2FzLmgiCi0KLXZvaWQgaGFuZGxlX3N5c2NhbGwodW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MpCi17Ci0JbG9uZyByZXN1bHQ7Ci0jaWZkZWYgVU1MX0NPTkZJR19TWVNDQUxMX0RFQlVHCi0gIAlpbnQgaW5kZXg7Ci0KLSAgCWluZGV4ID0gcmVjb3JkX3N5c2NhbGxfc3RhcnQoVVBUX1NZU0NBTExfTlIocmVncykpOwotI2VuZGlmCi0KLQlzeXNjYWxsX3RyYWNlKHJlZ3MsIDApOwotCXJlc3VsdCA9IGV4ZWN1dGVfc3lzY2FsbF9za2FzKHJlZ3MpOwotCi0JUkVHU19TRVRfU1lTQ0FMTF9SRVRVUk4ocmVncy0+c2thcy5yZWdzLCByZXN1bHQpOwotCi0Jc3lzY2FsbF90cmFjZShyZWdzLCAxKTsKLSNpZmRlZiBVTUxfQ09ORklHX1NZU0NBTExfREVCVUcKLSAgCXJlY29yZF9zeXNjYWxsX2VuZChpbmRleCwgcmVzdWx0KTsKLSNlbmRpZgotfQotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy90bGIuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvdGxiLmMKaW5kZXggNjIzMDk5OS4uNmU4NDk2MyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy90bGIuYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3RsYi5jCkBAIC0xOCwzMyArMTgsMzkgQEAKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInRsYi5oIgogCi1zdGF0aWMgdm9pZCBkb19vcHModW5pb24gbW1fY29udGV4dCAqbW11LCBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLCBpbnQgbGFzdCkKK3N0YXRpYyBpbnQgZG9fb3BzKHVuaW9uIG1tX2NvbnRleHQgKm1tdSwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGxhc3QsCisJCSAgaW50IGZpbmlzaGVkLCB2b2lkICoqZmx1c2gpCiB7CiAJc3RydWN0IGhvc3Rfdm1fb3AgKm9wOwotCWludCBpOworICAgICAgICBpbnQgaSwgcmV0ID0gMDsKIAotCWZvcihpID0gMDsgaSA8PSBsYXN0OyBpKyspeworICAgICAgICBmb3IoaSA9IDA7IGkgPD0gbGFzdCAmJiAhcmV0OyBpKyspewogCQlvcCA9ICZvcHNbaV07CiAJCXN3aXRjaChvcC0+dHlwZSl7CiAJCWNhc2UgTU1BUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgmbW11LT5za2FzLmlkLCBvcC0+dS5tbWFwLmFkZHIsIG9wLT51Lm1tYXAubGVuLAotCQkJICAgIG9wLT51Lm1tYXAuciwgb3AtPnUubW1hcC53LCBvcC0+dS5tbWFwLngsCi0JCQkgICAgb3AtPnUubW1hcC5mZCwgb3AtPnUubW1hcC5vZmZzZXQpOworCQkJcmV0ID0gbWFwKCZtbXUtPnNrYXMuaWQsIG9wLT51Lm1tYXAuYWRkciwKKwkJCQkgIG9wLT51Lm1tYXAubGVuLCBvcC0+dS5tbWFwLnIsIG9wLT51Lm1tYXAudywKKwkJCQkgIG9wLT51Lm1tYXAueCwgb3AtPnUubW1hcC5mZCwKKwkJCQkgIG9wLT51Lm1tYXAub2Zmc2V0LCBmaW5pc2hlZCwgZmx1c2gpOwogCQkJYnJlYWs7CiAJCWNhc2UgTVVOTUFQOgotICAgICAgICAgICAgICAgICAgICAgICAgdW5tYXAoJm1tdS0+c2thcy5pZCwgKHZvaWQgKikgb3AtPnUubXVubWFwLmFkZHIsCi0JCQkgICAgICBvcC0+dS5tdW5tYXAubGVuKTsKKwkJCXJldCA9IHVubWFwKCZtbXUtPnNrYXMuaWQsCisJCQkJICAgICh2b2lkICopIG9wLT51Lm11bm1hcC5hZGRyLAorCQkJCSAgICBvcC0+dS5tdW5tYXAubGVuLCBmaW5pc2hlZCwgZmx1c2gpOwogCQkJYnJlYWs7CiAJCWNhc2UgTVBST1RFQ1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0KCZtbXUtPnNrYXMuaWQsIG9wLT51Lm1wcm90ZWN0LmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT51Lm1wcm90ZWN0Lmxlbiwgb3AtPnUubXByb3RlY3QuciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPnUubXByb3RlY3Qudywgb3AtPnUubXByb3RlY3QueCk7CisJCQlyZXQgPSBwcm90ZWN0KCZtbXUtPnNrYXMuaWQsIG9wLT51Lm1wcm90ZWN0LmFkZHIsCisJCQkJICAgICAgb3AtPnUubXByb3RlY3QubGVuLCBvcC0+dS5tcHJvdGVjdC5yLAorCQkJCSAgICAgIG9wLT51Lm1wcm90ZWN0LncsIG9wLT51Lm1wcm90ZWN0LngsCisJCQkJICAgICAgZmluaXNoZWQsIGZsdXNoKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKCJVbmtub3duIG9wIHR5cGUgJWQgaW4gZG9fb3BzXG4iLCBvcC0+dHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0KKworCXJldHVybiByZXQ7CiB9CiAKIGV4dGVybiBpbnQgcHJvY19tbTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3N5c2NhbGwuYyBiL2FyY2gvdW0va2VybmVsL3N5c2NhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDI5YzEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9rZXJuZWwvc3lzY2FsbC5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpbmNsdWRlICJrZXJuX3V0aWwuaCIKKyNpbmNsdWRlICJzeXNjYWxsLmgiCisjaW5jbHVkZSAib3MuaCIKKworc3RydWN0IHsKKwlpbnQgc3lzY2FsbDsKKwlpbnQgcGlkOworCWxvbmcgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZW5kOworfSBzeXNjYWxsX3JlY29yZFsxMDI0XTsKKworaW50IHJlY29yZF9zeXNjYWxsX3N0YXJ0KGludCBzeXNjYWxsKQoreworCWludCBtYXgsIGluZGV4OworCisJbWF4ID0gc2l6ZW9mKHN5c2NhbGxfcmVjb3JkKS9zaXplb2Yoc3lzY2FsbF9yZWNvcmRbMF0pOworCWluZGV4ID0gbmV4dF9zeXNjYWxsX2luZGV4KG1heCk7CisKKwlzeXNjYWxsX3JlY29yZFtpbmRleF0uc3lzY2FsbCA9IHN5c2NhbGw7CisJc3lzY2FsbF9yZWNvcmRbaW5kZXhdLnBpZCA9IGN1cnJlbnRfcGlkKCk7CisJc3lzY2FsbF9yZWNvcmRbaW5kZXhdLnJlc3VsdCA9IDB4ZGVhZGJlZWY7CisJc3lzY2FsbF9yZWNvcmRbaW5kZXhdLnN0YXJ0ID0gb3NfdXNlY3MoKTsKKwlyZXR1cm4oaW5kZXgpOworfQorCit2b2lkIHJlY29yZF9zeXNjYWxsX2VuZChpbnQgaW5kZXgsIGxvbmcgcmVzdWx0KQoreworCXN5c2NhbGxfcmVjb3JkW2luZGV4XS5yZXN1bHQgPSByZXN1bHQ7CisJc3lzY2FsbF9yZWNvcmRbaW5kZXhdLmVuZCA9IG9zX3VzZWNzKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9zeXNjYWxsX3VzZXIuYyBiL2FyY2gvdW0va2VybmVsL3N5c2NhbGxfdXNlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWI3MTFlLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0va2VybmVsL3N5c2NhbGxfdXNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgImtlcm5fdXRpbC5oIgotI2luY2x1ZGUgInN5c2NhbGxfdXNlci5oIgotCi1zdHJ1Y3QgewotCWludCBzeXNjYWxsOwotCWludCBwaWQ7Ci0JbG9uZyByZXN1bHQ7Ci0Jc3RydWN0IHRpbWV2YWwgc3RhcnQ7Ci0Jc3RydWN0IHRpbWV2YWwgZW5kOwotfSBzeXNjYWxsX3JlY29yZFsxMDI0XTsKLQotaW50IHJlY29yZF9zeXNjYWxsX3N0YXJ0KGludCBzeXNjYWxsKQotewotCWludCBtYXgsIGluZGV4OwotCi0JbWF4ID0gc2l6ZW9mKHN5c2NhbGxfcmVjb3JkKS9zaXplb2Yoc3lzY2FsbF9yZWNvcmRbMF0pOwotCWluZGV4ID0gbmV4dF9zeXNjYWxsX2luZGV4KG1heCk7Ci0KLQlzeXNjYWxsX3JlY29yZFtpbmRleF0uc3lzY2FsbCA9IHN5c2NhbGw7Ci0Jc3lzY2FsbF9yZWNvcmRbaW5kZXhdLnBpZCA9IGN1cnJlbnRfcGlkKCk7Ci0Jc3lzY2FsbF9yZWNvcmRbaW5kZXhdLnJlc3VsdCA9IDB4ZGVhZGJlZWY7Ci0JZ2V0dGltZW9mZGF5KCZzeXNjYWxsX3JlY29yZFtpbmRleF0uc3RhcnQsIE5VTEwpOwotCXJldHVybihpbmRleCk7Ci19Ci0KLXZvaWQgcmVjb3JkX3N5c2NhbGxfZW5kKGludCBpbmRleCwgbG9uZyByZXN1bHQpCi17Ci0Jc3lzY2FsbF9yZWNvcmRbaW5kZXhdLnJlc3VsdCA9IHJlc3VsdDsKLQlnZXR0aW1lb2ZkYXkoJnN5c2NhbGxfcmVjb3JkW2luZGV4XS5lbmQsIE5VTEwpOwotfQotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdGxiLmMgYi9hcmNoL3VtL2tlcm5lbC90bGIuYwppbmRleCA4M2VjOGQ0Ny4uODBlZDYxOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdGxiLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdGxiLmMKQEAgLTE1LDEyICsxNSwxMTggQEAKICNpbmNsdWRlICJtZW1fdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCiAKK3N0YXRpYyBpbnQgYWRkX21tYXAodW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgbGVuLAorIAkJICAgIGludCByLCBpbnQgdywgaW50IHgsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCAqaW5kZXgsCisJCSAgICBpbnQgbGFzdF9maWxsZWQsIHVuaW9uIG1tX2NvbnRleHQgKm1tdSwgdm9pZCAqKmZsdXNoLAorCQkgICAgaW50ICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosCisJCQkJICBpbnQsIGludCwgdm9pZCAqKikpCit7CisgICAgICAgIF9fdTY0IG9mZnNldDsKKwlzdHJ1Y3QgaG9zdF92bV9vcCAqbGFzdDsKKwlpbnQgZmQsIHJldCA9IDA7CisKKwlmZCA9IHBoeXNfbWFwcGluZyhwaHlzLCAmb2Zmc2V0KTsKKwlpZigqaW5kZXggIT0gLTEpeworCQlsYXN0ID0gJm9wc1sqaW5kZXhdOworCQlpZigobGFzdC0+dHlwZSA9PSBNTUFQKSAmJgorCQkgICAobGFzdC0+dS5tbWFwLmFkZHIgKyBsYXN0LT51Lm1tYXAubGVuID09IHZpcnQpICYmCisJCSAgIChsYXN0LT51Lm1tYXAuciA9PSByKSAmJiAobGFzdC0+dS5tbWFwLncgPT0gdykgJiYKKwkJICAgKGxhc3QtPnUubW1hcC54ID09IHgpICYmIChsYXN0LT51Lm1tYXAuZmQgPT0gZmQpICYmCisJCSAgIChsYXN0LT51Lm1tYXAub2Zmc2V0ICsgbGFzdC0+dS5tbWFwLmxlbiA9PSBvZmZzZXQpKXsKKwkJCWxhc3QtPnUubW1hcC5sZW4gKz0gbGVuOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZigqaW5kZXggPT0gbGFzdF9maWxsZWQpeworCQlyZXQgPSAoKmRvX29wcykobW11LCBvcHMsIGxhc3RfZmlsbGVkLCAwLCBmbHVzaCk7CisJCSppbmRleCA9IC0xOworCX0KKworCW9wc1srKyppbmRleF0gPSAoKHN0cnVjdCBob3N0X3ZtX29wKSB7IC50eXBlCT0gTU1BUCwKKwkJCSAgICAgCQkJLnUgPSB7IC5tbWFwID0geworCQkJCQkJICAgICAgIC5hZGRyCT0gdmlydCwKKwkJCQkJCSAgICAgICAubGVuCT0gbGVuLAorCQkJCQkJICAgICAgIC5yCT0gciwKKwkJCQkJCSAgICAgICAudwk9IHcsCisJCQkJCQkgICAgICAgLngJPSB4LAorCQkJCQkJICAgICAgIC5mZAk9IGZkLAorCQkJCQkJICAgICAgIC5vZmZzZXQJPSBvZmZzZXQgfQorCQkJICAgfSB9KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZF9tdW5tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJICAgICAgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50ICppbmRleCwgaW50IGxhc3RfZmlsbGVkLAorCQkgICAgICB1bmlvbiBtbV9jb250ZXh0ICptbXUsIHZvaWQgKipmbHVzaCwKKwkJICAgICAgaW50ICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosCisJCQkJICAgIGludCwgaW50LCB2b2lkICoqKSkKK3sKKwlzdHJ1Y3QgaG9zdF92bV9vcCAqbGFzdDsKKwlpbnQgcmV0ID0gMDsKKworCWlmKCppbmRleCAhPSAtMSl7CisJCWxhc3QgPSAmb3BzWyppbmRleF07CisJCWlmKChsYXN0LT50eXBlID09IE1VTk1BUCkgJiYKKwkJICAgKGxhc3QtPnUubXVubWFwLmFkZHIgKyBsYXN0LT51Lm1tYXAubGVuID09IGFkZHIpKXsKKwkJCWxhc3QtPnUubXVubWFwLmxlbiArPSBsZW47CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmKCppbmRleCA9PSBsYXN0X2ZpbGxlZCl7CisJCXJldCA9ICgqZG9fb3BzKShtbXUsIG9wcywgbGFzdF9maWxsZWQsIDAsIGZsdXNoKTsKKwkJKmluZGV4ID0gLTE7CisJfQorCisJb3BzWysrKmluZGV4XSA9ICgoc3RydWN0IGhvc3Rfdm1fb3ApIHsgLnR5cGUJPSBNVU5NQVAsCisJCQkgICAgIAkJICAgICAgIC51ID0geyAubXVubWFwID0geworCQkJCQkJICAgICAgICAuYWRkcgk9IGFkZHIsCisJCQkJCQkJLmxlbgk9IGxlbiB9IH0gfSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGRfbXByb3RlY3QodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHIsIGludCB3LAorCQkJaW50IHgsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCAqaW5kZXgsCisJCQlpbnQgbGFzdF9maWxsZWQsIHVuaW9uIG1tX2NvbnRleHQgKm1tdSwgdm9pZCAqKmZsdXNoLAorIAkJCWludCAoKmRvX29wcykodW5pb24gbW1fY29udGV4dCAqLCBzdHJ1Y3QgaG9zdF92bV9vcCAqLAorCQkJCSAgICAgIGludCwgaW50LCB2b2lkICoqKSkKK3sKKwlzdHJ1Y3QgaG9zdF92bV9vcCAqbGFzdDsKKwlpbnQgcmV0ID0gMDsKKworCWlmKCppbmRleCAhPSAtMSl7CisJCWxhc3QgPSAmb3BzWyppbmRleF07CisJCWlmKChsYXN0LT50eXBlID09IE1QUk9URUNUKSAmJgorCQkgICAobGFzdC0+dS5tcHJvdGVjdC5hZGRyICsgbGFzdC0+dS5tcHJvdGVjdC5sZW4gPT0gYWRkcikgJiYKKwkJICAgKGxhc3QtPnUubXByb3RlY3QuciA9PSByKSAmJiAobGFzdC0+dS5tcHJvdGVjdC53ID09IHcpICYmCisJCSAgIChsYXN0LT51Lm1wcm90ZWN0LnggPT0geCkpeworCQkJbGFzdC0+dS5tcHJvdGVjdC5sZW4gKz0gbGVuOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZigqaW5kZXggPT0gbGFzdF9maWxsZWQpeworCQlyZXQgPSAoKmRvX29wcykobW11LCBvcHMsIGxhc3RfZmlsbGVkLCAwLCBmbHVzaCk7CisJCSppbmRleCA9IC0xOworCX0KKworCW9wc1srKyppbmRleF0gPSAoKHN0cnVjdCBob3N0X3ZtX29wKSB7IC50eXBlCT0gTVBST1RFQ1QsCisJCQkgICAgIAkJICAgICAgIC51ID0geyAubXByb3RlY3QgPSB7CisJCQkJCQkgICAgICAgLmFkZHIJPSBhZGRyLAorCQkJCQkJICAgICAgIC5sZW4JPSBsZW4sCisJCQkJCQkgICAgICAgLnIJPSByLAorCQkJCQkJICAgICAgIC53CT0gdywKKwkJCQkJCSAgICAgICAueAk9IHggfSB9IH0pOworCXJldHVybiByZXQ7Cit9CisKICNkZWZpbmUgQUREX1JPVU5EKG4sIGluYykgKCgobikgKyAoaW5jKSkgJiB+KChpbmMpIC0gMSkpCiAKIHZvaWQgZml4X3JhbmdlX2NvbW1vbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHIsIGludCBmb3JjZSwKLSAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KSkKKwkJICAgICAgaW50ICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosCisJCQkJICAgIGludCwgaW50LCB2b2lkICoqKSkKIHsKICAgICAgICAgcGdkX3QgKm5wZ2Q7CiAgICAgICAgIHB1ZF90ICpucHVkOwpAQCAtMjksMjEgKzEzNSwyNCBAQAogICAgICAgICB1bmlvbiBtbV9jb250ZXh0ICptbXUgPSAmbW0tPmNvbnRleHQ7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgZW5kOwogICAgICAgICBpbnQgciwgdywgeDsKLSAgICAgICAgc3RydWN0IGhvc3Rfdm1fb3Agb3BzWzE2XTsKKyAgICAgICAgc3RydWN0IGhvc3Rfdm1fb3Agb3BzWzFdOworICAgICAgICB2b2lkICpmbHVzaCA9IE5VTEw7CiAgICAgICAgIGludCBvcF9pbmRleCA9IC0xLCBsYXN0X29wID0gc2l6ZW9mKG9wcykgLyBzaXplb2Yob3BzWzBdKSAtIDE7CisgICAgICAgIGludCByZXQgPSAwOwogCiAgICAgICAgIGlmKG1tID09IE5VTEwpIHJldHVybjsKIAotICAgICAgICBmb3IoYWRkciA9IHN0YXJ0X2FkZHI7IGFkZHIgPCBlbmRfYWRkcjspeworICAgICAgICBvcHNbMF0udHlwZSA9IE5PTkU7CisgICAgICAgIGZvcihhZGRyID0gc3RhcnRfYWRkcjsgYWRkciA8IGVuZF9hZGRyICYmICFyZXQ7KXsKICAgICAgICAgICAgICAgICBucGdkID0gcGdkX29mZnNldChtbSwgYWRkcik7CiAgICAgICAgICAgICAgICAgaWYoIXBnZF9wcmVzZW50KCpucGdkKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBBRERfUk9VTkQoYWRkciwgUEdESVJfU0laRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbmQgPiBlbmRfYWRkcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gZW5kX2FkZHI7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JjZSB8fCBwZ2RfbmV3cGFnZSgqbnBnZCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCA9IGFkZF9tdW5tYXAoYWRkciwgZW5kIC0gYWRkciwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIG1tdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX29wcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGFkZF9tdW5tYXAoYWRkciwgZW5kIC0gYWRkciwgb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcF9pbmRleCwgbGFzdF9vcCwgbW11LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbHVzaCwgZG9fb3BzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdkX21rdXB0b2RhdGUoKm5wZ2QpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYWRkciA9IGVuZDsKQEAgLTU2LDkgKzE2NSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbmQgPiBlbmRfYWRkcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gZW5kX2FkZHI7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JjZSB8fCBwdWRfbmV3cGFnZSgqbnB1ZCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCA9IGFkZF9tdW5tYXAoYWRkciwgZW5kIC0gYWRkciwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIG1tdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX29wcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGFkZF9tdW5tYXAoYWRkciwgZW5kIC0gYWRkciwgb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcF9pbmRleCwgbGFzdF9vcCwgbW11LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbHVzaCwgZG9fb3BzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVkX21rdXB0b2RhdGUoKm5wdWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYWRkciA9IGVuZDsKQEAgLTcxLDkgKzE4MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbmQgPiBlbmRfYWRkcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gZW5kX2FkZHI7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JjZSB8fCBwbWRfbmV3cGFnZSgqbnBtZCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCA9IGFkZF9tdW5tYXAoYWRkciwgZW5kIC0gYWRkciwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIG1tdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX29wcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGFkZF9tdW5tYXAoYWRkciwgZW5kIC0gYWRkciwgb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcF9pbmRleCwgbGFzdF9vcCwgbW11LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbHVzaCwgZG9fb3BzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1kX21rdXB0b2RhdGUoKm5wbWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYWRkciA9IGVuZDsKQEAgLTkyLDI0ICsyMDEsMzIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYoZm9yY2UgfHwgcHRlX25ld3BhZ2UoKm5wdGUpKXsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHB0ZV9wcmVzZW50KCpucHRlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXggPSBhZGRfbW1hcChhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZV92YWwoKm5wdGUpICYgUEFHRV9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRSwgciwgdywgeCwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBtbXUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fb3BzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugb3BfaW5kZXggPSBhZGRfbXVubWFwKGFkZHIsIFBBR0VfU0laRSwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIG1tdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX29wcyk7CisJCQkgIHJldCA9IGFkZF9tbWFwKGFkZHIsCisJCQkJCSBwdGVfdmFsKCpucHRlKSAmIFBBR0VfTUFTSywKKwkJCQkJIFBBR0VfU0laRSwgciwgdywgeCwgb3BzLAorCQkJCQkgJm9wX2luZGV4LCBsYXN0X29wLCBtbXUsCisJCQkJCSAmZmx1c2gsIGRvX29wcyk7CisJCQllbHNlIHJldCA9IGFkZF9tdW5tYXAoYWRkciwgUEFHRV9TSVpFLCBvcHMsCisJCQkJCSAgICAgICZvcF9pbmRleCwgbGFzdF9vcCwgbW11LAorCQkJCQkgICAgICAmZmx1c2gsIGRvX29wcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgaWYocHRlX25ld3Byb3QoKm5wdGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXggPSBhZGRfbXByb3RlY3QoYWRkciwgUEFHRV9TSVpFLCByLCB3LCB4LCBvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCwgbGFzdF9vcCwgbW11LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fb3BzKTsKKwkJCXJldCA9IGFkZF9tcHJvdGVjdChhZGRyLCBQQUdFX1NJWkUsIHIsIHcsIHgsIG9wcywKKwkJCQkJICAgJm9wX2luZGV4LCBsYXN0X29wLCBtbXUsCisJCQkJCSAgICZmbHVzaCwgZG9fb3BzKTsKIAogICAgICAgICAgICAgICAgICpucHRlID0gcHRlX21rdXB0b2RhdGUoKm5wdGUpOwogICAgICAgICAgICAgICAgIGFkZHIgKz0gUEFHRV9TSVpFOwogICAgICAgICB9Ci0gICAgICAgICgqZG9fb3BzKShtbXUsIG9wcywgb3BfaW5kZXgpOworCisJaWYoIXJldCkKKwkJcmV0ID0gKCpkb19vcHMpKG1tdSwgb3BzLCBvcF9pbmRleCwgMSwgJmZsdXNoKTsKKworCS8qIFRoaXMgaXMgbm90IGFuIGVsc2UgYmVjYXVzZSByZXQgaXMgbW9kaWZpZWQgYWJvdmUgKi8KKwlpZihyZXQpIHsKKwkJcHJpbnRrKCJmaXhfcmFuZ2VfY29tbW9uOiBmYWlsZWQsIGtpbGxpbmcgY3VycmVudCBwcm9jZXNzXG4iKTsKKwkJZm9yY2Vfc2lnKFNJR0tJTEwsIGN1cnJlbnQpOworCX0KIH0KIAogaW50IGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQpAQCAtMjI2LDEwNiArMzQzLDYgQEAKICAgICAgICAgcmV0dXJuKHB0ZV9vZmZzZXRfbWFwKHBtZCwgYWRkcikpOwogfQogCi1pbnQgYWRkX21tYXAodW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgbGVuLAotICAgICAgICAgICAgIGludCByLCBpbnQgdywgaW50IHgsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBpbmRleCwKLSAgICAgICAgICAgICBpbnQgbGFzdF9maWxsZWQsIHVuaW9uIG1tX2NvbnRleHQgKm1tdSwKLSAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpCi17Ci0gICAgICAgIF9fdTY0IG9mZnNldDsKLQlzdHJ1Y3QgaG9zdF92bV9vcCAqbGFzdDsKLQlpbnQgZmQ7Ci0KLQlmZCA9IHBoeXNfbWFwcGluZyhwaHlzLCAmb2Zmc2V0KTsKLQlpZihpbmRleCAhPSAtMSl7Ci0JCWxhc3QgPSAmb3BzW2luZGV4XTsKLQkJaWYoKGxhc3QtPnR5cGUgPT0gTU1BUCkgJiYKLQkJICAgKGxhc3QtPnUubW1hcC5hZGRyICsgbGFzdC0+dS5tbWFwLmxlbiA9PSB2aXJ0KSAmJgotCQkgICAobGFzdC0+dS5tbWFwLnIgPT0gcikgJiYgKGxhc3QtPnUubW1hcC53ID09IHcpICYmCi0JCSAgIChsYXN0LT51Lm1tYXAueCA9PSB4KSAmJiAobGFzdC0+dS5tbWFwLmZkID09IGZkKSAmJgotCQkgICAobGFzdC0+dS5tbWFwLm9mZnNldCArIGxhc3QtPnUubW1hcC5sZW4gPT0gb2Zmc2V0KSl7Ci0JCQlsYXN0LT51Lm1tYXAubGVuICs9IGxlbjsKLQkJCXJldHVybihpbmRleCk7Ci0JCX0KLQl9Ci0KLQlpZihpbmRleCA9PSBsYXN0X2ZpbGxlZCl7Ci0JCSgqZG9fb3BzKShtbXUsIG9wcywgbGFzdF9maWxsZWQpOwotCQlpbmRleCA9IC0xOwotCX0KLQotCW9wc1srK2luZGV4XSA9ICgoc3RydWN0IGhvc3Rfdm1fb3ApIHsgLnR5cGUJPSBNTUFQLAotCQkJCQkgICAgICAudSA9IHsgLm1tYXAgPSB7Ci0JCQkJCQkgICAgICAuYWRkcgk9IHZpcnQsCi0JCQkJCQkgICAgICAubGVuCT0gbGVuLAotCQkJCQkJICAgICAgLnIJPSByLAotCQkJCQkJICAgICAgLncJPSB3LAotCQkJCQkJICAgICAgLngJPSB4LAotCQkJCQkJICAgICAgLmZkCT0gZmQsCi0JCQkJCQkgICAgICAub2Zmc2V0CT0gb2Zmc2V0IH0KLQkJCQkJICAgICAgfSB9KTsKLQlyZXR1cm4oaW5kZXgpOwotfQotCi1pbnQgYWRkX211bm1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLAotCSAgICAgICBpbnQgaW5kZXgsIGludCBsYXN0X2ZpbGxlZCwgdW5pb24gbW1fY29udGV4dCAqbW11LAotCSAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpCi17Ci0Jc3RydWN0IGhvc3Rfdm1fb3AgKmxhc3Q7Ci0KLQlpZihpbmRleCAhPSAtMSl7Ci0JCWxhc3QgPSAmb3BzW2luZGV4XTsKLQkJaWYoKGxhc3QtPnR5cGUgPT0gTVVOTUFQKSAmJgotCQkgICAobGFzdC0+dS5tdW5tYXAuYWRkciArIGxhc3QtPnUubW1hcC5sZW4gPT0gYWRkcikpewotCQkJbGFzdC0+dS5tdW5tYXAubGVuICs9IGxlbjsKLQkJCXJldHVybihpbmRleCk7Ci0JCX0KLQl9Ci0KLQlpZihpbmRleCA9PSBsYXN0X2ZpbGxlZCl7Ci0JCSgqZG9fb3BzKShtbXUsIG9wcywgbGFzdF9maWxsZWQpOwotCQlpbmRleCA9IC0xOwotCX0KLQotCW9wc1srK2luZGV4XSA9ICgoc3RydWN0IGhvc3Rfdm1fb3ApIHsgLnR5cGUJPSBNVU5NQVAsCi0JCQkJCSAgICAgIC51ID0geyAubXVubWFwID0gewotCQkJCQkJICAgICAgLmFkZHIJPSBhZGRyLAotCQkJCQkJICAgICAgLmxlbgk9IGxlbiB9IH0gfSk7Ci0JcmV0dXJuKGluZGV4KTsKLX0KLQotaW50IGFkZF9tcHJvdGVjdCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgciwgaW50IHcsIGludCB4LAotICAgICAgICAgICAgICAgICBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLCBpbnQgaW5kZXgsIGludCBsYXN0X2ZpbGxlZCwKLSAgICAgICAgICAgICAgICAgdW5pb24gbW1fY29udGV4dCAqbW11LAotICAgICAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpCi17Ci0Jc3RydWN0IGhvc3Rfdm1fb3AgKmxhc3Q7Ci0KLQlpZihpbmRleCAhPSAtMSl7Ci0JCWxhc3QgPSAmb3BzW2luZGV4XTsKLQkJaWYoKGxhc3QtPnR5cGUgPT0gTVBST1RFQ1QpICYmCi0JCSAgIChsYXN0LT51Lm1wcm90ZWN0LmFkZHIgKyBsYXN0LT51Lm1wcm90ZWN0LmxlbiA9PSBhZGRyKSAmJgotCQkgICAobGFzdC0+dS5tcHJvdGVjdC5yID09IHIpICYmIChsYXN0LT51Lm1wcm90ZWN0LncgPT0gdykgJiYKLQkJICAgKGxhc3QtPnUubXByb3RlY3QueCA9PSB4KSl7Ci0JCQlsYXN0LT51Lm1wcm90ZWN0LmxlbiArPSBsZW47Ci0JCQlyZXR1cm4oaW5kZXgpOwotCQl9Ci0JfQotCi0JaWYoaW5kZXggPT0gbGFzdF9maWxsZWQpewotCQkoKmRvX29wcykobW11LCBvcHMsIGxhc3RfZmlsbGVkKTsKLQkJaW5kZXggPSAtMTsKLQl9Ci0KLQlvcHNbKytpbmRleF0gPSAoKHN0cnVjdCBob3N0X3ZtX29wKSB7IC50eXBlCT0gTVBST1RFQ1QsCi0JCQkJCSAgICAgIC51ID0geyAubXByb3RlY3QgPSB7Ci0JCQkJCQkgICAgICAuYWRkcgk9IGFkZHIsCi0JCQkJCQkgICAgICAubGVuCT0gbGVuLAotCQkJCQkJICAgICAgLnIJPSByLAotCQkJCQkJICAgICAgLncJPSB3LAotCQkJCQkJICAgICAgLngJPSB4IH0gfSB9KTsKLQlyZXR1cm4oaW5kZXgpOwotfQotCiB2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAgICAgICAgIGFkZHJlc3MgJj0gUEFHRV9NQVNLOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHJhcF9rZXJuLmMgYi9hcmNoL3VtL2tlcm5lbC90cmFwX2tlcm4uYwppbmRleCBjMjBhZWYxLi44N2NjNmZkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90cmFwX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC90cmFwX2tlcm4uYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgIm1lbS5oIgogI2luY2x1ZGUgIm1lbV9rZXJuLmgiCiAKKy8qIE5vdGUgdGhpcyBpcyBjb25zdHJhaW5lZCB0byByZXR1cm4gMCwgLUVGQVVMVCwgLUVBQ0NFU1MsIC1FTk9NRU0gYnkgc2VndigpLiAqLwogaW50IGhhbmRsZV9wYWdlX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBpcCwgCiAJCSAgICAgIGludCBpc193cml0ZSwgaW50IGlzX3VzZXIsIGludCAqY29kZV9vdXQpCiB7CkBAIC0zNSw3ICszNiw2IEBACiAJcHVkX3QgKnB1ZDsKIAlwbWRfdCAqcG1kOwogCXB0ZV90ICpwdGU7Ci0JdW5zaWduZWQgbG9uZyBwYWdlOwogCWludCBlcnIgPSAtRUZBVUxUOwogCiAJKmNvZGVfb3V0ID0gU0VHVl9NQVBFUlI7CkBAIC01MiwxNyArNTIsMTcgQEAKIAllbHNlIGlmKGV4cGFuZF9zdGFjayh2bWEsIGFkZHJlc3MpKSAKIAkJZ290byBvdXQ7CiAKLSBnb29kX2FyZWE6Citnb29kX2FyZWE6CiAJKmNvZGVfb3V0ID0gU0VHVl9BQ0NFUlI7CiAJaWYoaXNfd3JpdGUgJiYgISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKSAKIAkJZ290byBvdXQ7CiAKLSAgICAgICAgaWYoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDKSkpCisJLyogRG9uJ3QgcmVxdWlyZSBWTV9SRUFEfFZNX0VYRUMgZm9yIHdyaXRlIGZhdWx0cyEgKi8KKyAgICAgICAgaWYoIWlzX3dyaXRlICYmICEodm1hLT52bV9mbGFncyAmIChWTV9SRUFEIHwgVk1fRVhFQykpKQogICAgICAgICAgICAgICAgIGdvdG8gb3V0OwogCi0JcGFnZSA9IGFkZHJlc3MgJiBQQUdFX01BU0s7CiAJZG8gewotIHN1cnZpdmU6CitzdXJ2aXZlOgogCQlzd2l0Y2ggKGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBhZGRyZXNzLCBpc193cml0ZSkpewogCQljYXNlIFZNX0ZBVUxUX01JTk9SOgogCQkJY3VycmVudC0+bWluX2ZsdCsrOwpAQCAtNzksMTYgKzc5LDE1IEBACiAJCWRlZmF1bHQ6CiAJCQlCVUcoKTsKIAkJfQotCQlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBwYWdlKTsKLQkJcHVkID0gcHVkX29mZnNldChwZ2QsIHBhZ2UpOwotCQlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgcGFnZSk7Ci0JCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgcGFnZSk7CisJCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpOworCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcmVzcyk7CisJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyZXNzKTsKKwkJcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBhZGRyZXNzKTsKIAl9IHdoaWxlKCFwdGVfcHJlc2VudCgqcHRlKSk7CiAJZXJyID0gMDsKLQkqcHRlID0gcHRlX21reW91bmcoKnB0ZSk7Ci0JaWYocHRlX3dyaXRlKCpwdGUpKSAqcHRlID0gcHRlX21rZGlydHkoKnB0ZSk7Ci0JZmx1c2hfdGxiX3BhZ2Uodm1hLCBwYWdlKTsKLSBvdXQ6CisJV0FSTl9PTighcHRlX3lvdW5nKCpwdGUpIHx8IChpc193cml0ZSAmJiAhcHRlX2RpcnR5KCpwdGUpKSk7CisJZmx1c2hfdGxiX3BhZ2Uodm1hLCBhZGRyZXNzKTsKK291dDoKIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCXJldHVybihlcnIpOwogCkBAIC0xNDQsMTkgKzE0MywxOCBAQAogCQlwYW5pYygiS2VybmVsIG1vZGUgZmF1bHQgYXQgYWRkciAweCVseCwgaXAgMHglbHgiLCAKIAkJICAgICAgYWRkcmVzcywgaXApOwogCi0JaWYoZXJyID09IC1FQUNDRVMpeworCWlmIChlcnIgPT0gLUVBQ0NFUykgewogCQlzaS5zaV9zaWdubyA9IFNJR0JVUzsKIAkJc2kuc2lfZXJybm8gPSAwOwogCQlzaS5zaV9jb2RlID0gQlVTX0FEUkVSUjsKIAkJc2kuc2lfYWRkciA9ICh2b2lkICopYWRkcmVzczsKICAgICAgICAgICAgICAgICBjdXJyZW50LT50aHJlYWQuYXJjaC5mYXVsdGluZm8gPSBmaTsKIAkJZm9yY2Vfc2lnX2luZm8oU0lHQlVTLCAmc2ksIGN1cnJlbnQpOwotCX0KLQllbHNlIGlmKGVyciA9PSAtRU5PTUVNKXsKKwl9IGVsc2UgaWYgKGVyciA9PSAtRU5PTUVNKSB7CiAJCXByaW50aygiVk06IGtpbGxpbmcgcHJvY2VzcyAlc1xuIiwgY3VycmVudC0+Y29tbSk7CiAJCWRvX2V4aXQoU0lHS0lMTCk7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CisJCUJVR19PTihlcnIgIT0gLUVGQVVMVCk7CiAJCXNpLnNpX3NpZ25vID0gU0lHU0VHVjsKIAkJc2kuc2lfYWRkciA9ICh2b2lkICopIGFkZHJlc3M7CiAgICAgICAgICAgICAgICAgY3VycmVudC0+dGhyZWFkLmFyY2guZmF1bHRpbmZvID0gZmk7CkBAIC0yMDAsMzAgKzE5OCwzIEBACiB2b2lkIHRyYXBfaW5pdCh2b2lkKQogewogfQotCi1ERUZJTkVfU1BJTkxPQ0sodHJhcF9sb2NrKTsKLQotc3RhdGljIGludCB0cmFwX2luZGV4ID0gMDsKLQotaW50IG5leHRfdHJhcF9pbmRleChpbnQgbGltaXQpCi17Ci0JaW50IHJldDsKLQotCXNwaW5fbG9jaygmdHJhcF9sb2NrKTsKLQlyZXQgPSB0cmFwX2luZGV4OwotCWlmKCsrdHJhcF9pbmRleCA9PSBsaW1pdCkKLQkJdHJhcF9pbmRleCA9IDA7Ci0Jc3Bpbl91bmxvY2soJnRyYXBfbG9jayk7Ci0JcmV0dXJuKHJldCk7Ci19Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90cmFwX3VzZXIuYyBiL2FyY2gvdW0va2VybmVsL3RyYXBfdXNlci5jCmluZGV4IGY4MjVhNmUuLmU5Y2NkNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3RyYXBfdXNlci5jCisrKyBiL2FyY2gvdW0va2VybmVsL3RyYXBfdXNlci5jCkBAIC00MCwzNSArNDAsMTQgQEAKIAl9IHdoaWxlKDEpOwogfQogCi0vKiBVbmxvY2tlZCAtIGRvbid0IGNhcmUgaWYgdGhpcyBpcyBhIGJpdCBvZmYgKi8KLWludCBuc2VnZmF1bHRzID0gMDsKLQotc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0JaW50IGlzX3dyaXRlOwotCWludCBwaWQ7Ci0JdW5zaWduZWQgbG9uZyBzcDsKLQlpbnQgaXNfdXNlcjsKLX0gc2VnZmF1bHRfcmVjb3JkWzEwMjRdOwotCiB2b2lkIHNlZ3ZfaGFuZGxlcihpbnQgc2lnLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncykKIHsKLQlpbnQgaW5kZXgsIG1heDsKICAgICAgICAgc3RydWN0IGZhdWx0aW5mbyAqIGZpID0gVVBUX0ZBVUxUSU5GTyhyZWdzKTsKIAogICAgICAgICBpZihVUFRfSVNfVVNFUihyZWdzKSAmJiAhU0VHVl9JU19GSVhBQkxFKGZpKSl7CiAgICAgICAgICAgICAgICAgYmFkX3NlZ3YoKmZpLCBVUFRfSVAocmVncykpOwogCQlyZXR1cm47CiAJfQotCW1heCA9IHNpemVvZihzZWdmYXVsdF9yZWNvcmQpL3NpemVvZihzZWdmYXVsdF9yZWNvcmRbMF0pOwotCWluZGV4ID0gbmV4dF90cmFwX2luZGV4KG1heCk7Ci0KLQluc2VnZmF1bHRzKys7Ci0gICAgICAgIHNlZ2ZhdWx0X3JlY29yZFtpbmRleF0uYWRkcmVzcyA9IEZBVUxUX0FERFJFU1MoKmZpKTsKLQlzZWdmYXVsdF9yZWNvcmRbaW5kZXhdLnBpZCA9IG9zX2dldHBpZCgpOwotICAgICAgICBzZWdmYXVsdF9yZWNvcmRbaW5kZXhdLmlzX3dyaXRlID0gRkFVTFRfV1JJVEUoKmZpKTsKLQlzZWdmYXVsdF9yZWNvcmRbaW5kZXhdLnNwID0gVVBUX1NQKHJlZ3MpOwotCXNlZ2ZhdWx0X3JlY29yZFtpbmRleF0uaXNfdXNlciA9IFVQVF9JU19VU0VSKHJlZ3MpOwogICAgICAgICBzZWd2KCpmaSwgVVBUX0lQKHJlZ3MpLCBVUFRfSVNfVVNFUihyZWdzKSwgcmVncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3R0L2luY2x1ZGUvdWFjY2Vzcy10dC5oIGIvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS91YWNjZXNzLXR0LmgKaW5kZXggM2ZiYjVmZS4uYWE2ZGIzOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS91YWNjZXNzLXR0LmgKKysrIGIvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS91YWNjZXNzLXR0LmgKQEAgLTMzLDcgKzMzLDcgQEAKICAgICAgICAgICgoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSA8PSAoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSArIChzaXplKSkpICYmIFwKICAgICAgICAgICAodW5kZXJfdGFza19zaXplKGFkZHIsIHNpemUpIHx8IGlzX3N0YWNrKGFkZHIsIHNpemUpKSkpCiAKLXN0YXRpYyBpbmxpbmUgaW50IHZlcmlmeV9hcmVhX3R0KGludCB0eXBlLCBjb25zdCB2b2lkICogYWRkciwKK3N0YXRpYyBpbmxpbmUgaW50IHZlcmlmeV9hcmVhX3R0KGludCB0eXBlLCBjb25zdCB2b2lkIF9fdXNlciAqIGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJcmV0dXJuKGFjY2Vzc19va190dCh0eXBlLCBhZGRyLCBzaXplKSA/IDAgOiAtRUZBVUxUKTsKQEAgLTUwLDEyICs1MCwxMiBAQAogZXh0ZXJuIGludCBfX2RvX3N0cm5sZW5fdXNlcihjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgbiwKIAkJCSAgICAgdm9pZCAqKmZhdWx0X2FkZHIsIHZvaWQgKipmYXVsdF9jYXRjaGVyKTsKIAotZXh0ZXJuIGludCBjb3B5X2Zyb21fdXNlcl90dCh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4pOwotZXh0ZXJuIGludCBjb3B5X3RvX3VzZXJfdHQodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGludCBuKTsKLWV4dGVybiBpbnQgc3RybmNweV9mcm9tX3VzZXJfdHQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGludCBjb3VudCk7Ci1leHRlcm4gaW50IF9fY2xlYXJfdXNlcl90dCh2b2lkICptZW0sIGludCBsZW4pOwotZXh0ZXJuIGludCBjbGVhcl91c2VyX3R0KHZvaWQgKm1lbSwgaW50IGxlbik7Ci1leHRlcm4gaW50IHN0cm5sZW5fdXNlcl90dChjb25zdCB2b2lkICpzdHIsIGludCBsZW4pOworZXh0ZXJuIGludCBjb3B5X2Zyb21fdXNlcl90dCh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIGludCBuKTsKK2V4dGVybiBpbnQgY29weV90b191c2VyX3R0KHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4pOworZXh0ZXJuIGludCBzdHJuY3B5X2Zyb21fdXNlcl90dChjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGludCBjb3VudCk7CitleHRlcm4gaW50IF9fY2xlYXJfdXNlcl90dCh2b2lkIF9fdXNlciAqbWVtLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgY2xlYXJfdXNlcl90dCh2b2lkIF9fdXNlciAqbWVtLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgc3Rybmxlbl91c2VyX3R0KGNvbnN0IHZvaWQgX191c2VyICpzdHIsIGludCBsZW4pOwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHQvc3lzY2FsbF9rZXJuLmMgYi9hcmNoL3VtL2tlcm5lbC90dC9zeXNjYWxsX2tlcm4uYwppbmRleCAyNjUwYTYyLi4zZDI5YzkwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90dC9zeXNjYWxsX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC90dC9zeXNjYWxsX2tlcm4uYwpAQCAtMTIsMzYgKzEyLDQxIEBACiAjaW5jbHVkZSAiYXNtL3VhY2Nlc3MuaCIKICNpbmNsdWRlICJhc20vc3RhdC5oIgogI2luY2x1ZGUgInN5c2RlcC9zeXNjYWxscy5oIgorI2luY2x1ZGUgInN5c2RlcC9zaWdjb250ZXh0LmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCisjaW5jbHVkZSAic3lzY2FsbC5oIgogCi1leHRlcm4gc3lzY2FsbF9oYW5kbGVyX3QgKnN5c19jYWxsX3RhYmxlW107Ci0KLWxvbmcgZXhlY3V0ZV9zeXNjYWxsX3R0KHZvaWQgKnIpCit2b2lkIHN5c2NhbGxfaGFuZGxlcl90dChpbnQgc2lnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHI7Ci0JbG9uZyByZXM7CisJdm9pZCAqc2M7CisJbG9uZyByZXN1bHQ7CiAJaW50IHN5c2NhbGw7Ci0KICNpZmRlZiBDT05GSUdfU1lTQ0FMTF9ERUJVRworCWludCBpbmRleDsKKyAgCWluZGV4ID0gcmVjb3JkX3N5c2NhbGxfc3RhcnQoc3lzY2FsbCk7CisjZW5kaWYKKwlzYyA9IFVQVF9TQygmcmVncy0+cmVncyk7CisJU0NfU1RBUlRfU1lTQ0FMTChzYyk7CisKKwlzeXNjYWxsX3RyYWNlKCZyZWdzLT5yZWdzLCAwKTsKKwogCWN1cnJlbnQtPnRocmVhZC5uc3lzY2FsbHMrKzsKIAluc3lzY2FsbHMrKzsKLSNlbmRpZgogCXN5c2NhbGwgPSBVUFRfU1lTQ0FMTF9OUigmcmVncy0+cmVncyk7CiAKIAlpZigoc3lzY2FsbCA+PSBOUl9zeXNjYWxscykgfHwgKHN5c2NhbGwgPCAwKSkKLQkJcmVzID0gLUVOT1NZUzsKLQllbHNlIHJlcyA9IEVYRUNVVEVfU1lTQ0FMTChzeXNjYWxsLCByZWdzKTsKKwkJcmVzdWx0ID0gLUVOT1NZUzsKKwllbHNlIHJlc3VsdCA9IEVYRUNVVEVfU1lTQ0FMTChzeXNjYWxsLCByZWdzKTsKIAotCXJldHVybihyZXMpOworCS8qIHJlZ3MtPnNjIG1heSBoYXZlIGNoYW5nZWQgd2hpbGUgdGhlIHN5c3RlbSBjYWxsIHJhbiAodGhlcmUgbWF5CisJICogaGF2ZSBiZWVuIGFuIGludGVycnVwdCBvciBzZWdmYXVsdCksIHNvIGl0IG5lZWRzIHRvIGJlIHJlZnJlc2hlZC4KKwkgKi8KKwlVUFRfU0MoJnJlZ3MtPnJlZ3MpID0gc2M7CisKKwlTQ19TRVRfU1lTQ0FMTF9SRVRVUk4oc2MsIHJlc3VsdCk7CisKKwlzeXNjYWxsX3RyYWNlKCZyZWdzLT5yZWdzLCAxKTsKKyNpZmRlZiBDT05GSUdfU1lTQ0FMTF9ERUJVRworICAJcmVjb3JkX3N5c2NhbGxfZW5kKGluZGV4LCByZXN1bHQpOworI2VuZGlmCiB9Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC9zeXNjYWxsX3VzZXIuYyBiL2FyY2gvdW0va2VybmVsL3R0L3N5c2NhbGxfdXNlci5jCmluZGV4IGIyMTgzMTYuLjkwMjk4N2IgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3R0L3N5c2NhbGxfdXNlci5jCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L3N5c2NhbGxfdXNlci5jCkBAIC0xMyw0MiArMTMsOSBAQAogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKLSNpbmNsdWRlICJzeXNjYWxsX3VzZXIuaCIKKyNpbmNsdWRlICJzeXNjYWxsLmgiCiAjaW5jbHVkZSAidHQuaCIKIAotCi12b2lkIHN5c2NhbGxfaGFuZGxlcl90dChpbnQgc2lnLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncykKLXsKLQl2b2lkICpzYzsKLQlsb25nIHJlc3VsdDsKLQlpbnQgc3lzY2FsbDsKLSNpZmRlZiBVTUxfQ09ORklHX0RFQlVHX1NZU0NBTEwKLQlpbnQgaW5kZXg7Ci0jZW5kaWYKLQotCXN5c2NhbGwgPSBVUFRfU1lTQ0FMTF9OUihyZWdzKTsKLQlzYyA9IFVQVF9TQyhyZWdzKTsKLQlTQ19TVEFSVF9TWVNDQUxMKHNjKTsKLQotI2lmZGVmIFVNTF9DT05GSUdfREVCVUdfU1lTQ0FMTAotICAJaW5kZXggPSByZWNvcmRfc3lzY2FsbF9zdGFydChzeXNjYWxsKTsKLSNlbmRpZgotCXN5c2NhbGxfdHJhY2UocmVncywgMCk7Ci0JcmVzdWx0ID0gZXhlY3V0ZV9zeXNjYWxsX3R0KHJlZ3MpOwotCi0JLyogcmVncy0+c2MgbWF5IGhhdmUgY2hhbmdlZCB3aGlsZSB0aGUgc3lzdGVtIGNhbGwgcmFuICh0aGVyZSBtYXkKLQkgKiBoYXZlIGJlZW4gYW4gaW50ZXJydXB0IG9yIHNlZ2ZhdWx0KSwgc28gaXQgbmVlZHMgdG8gYmUgcmVmcmVzaGVkLgotCSAqLwotCVVQVF9TQyhyZWdzKSA9IHNjOwotCi0JU0NfU0VUX1NZU0NBTExfUkVUVVJOKHNjLCByZXN1bHQpOwotCi0Jc3lzY2FsbF90cmFjZShyZWdzLCAxKTsKLSNpZmRlZiBVTUxfQ09ORklHX0RFQlVHX1NZU0NBTEwKLSAgCXJlY29yZF9zeXNjYWxsX2VuZChpbmRleCwgcmVzdWx0KTsKLSNlbmRpZgotfQotCiB2b2lkIGRvX3NpZ3RyYXAodm9pZCAqdGFzaykKIHsKIAlVUFRfU1lTQ0FMTF9OUihUQVNLX1JFR1ModGFzaykpID0gLTE7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC90bGIuYyBiL2FyY2gvdW0va2VybmVsL3R0L3RsYi5jCmluZGV4IDJlZWZiNDMuLmYxZDg1ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3R0L3RsYi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L3RsYi5jCkBAIC0xNywyNSArMTcsMzEgQEAKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInRsYi5oIgogCi1zdGF0aWMgdm9pZCBkb19vcHModW5pb24gbW1fY29udGV4dCAqbW11LCBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLCBpbnQgbGFzdCkKK3N0YXRpYyBpbnQgZG9fb3BzKHVuaW9uIG1tX2NvbnRleHQgKm1tdSwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGxhc3QsCisJCSAgICBpbnQgZmluaXNoZWQsIHZvaWQgKipmbHVzaCkKIHsKIAlzdHJ1Y3QgaG9zdF92bV9vcCAqb3A7Ci0JaW50IGk7CisgICAgICAgIGludCBpLCByZXQ9MDsKIAotCWZvcihpID0gMDsgaSA8PSBsYXN0OyBpKyspeworICAgICAgICBmb3IoaSA9IDA7IGkgPD0gbGFzdCAmJiAhcmV0OyBpKyspewogCQlvcCA9ICZvcHNbaV07CiAJCXN3aXRjaChvcC0+dHlwZSl7CiAJCWNhc2UgTU1BUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zX21hcF9tZW1vcnkoKHZvaWQgKikgb3AtPnUubW1hcC5hZGRyLCBvcC0+dS5tbWFwLmZkLAotCQkJCSAgICAgIG9wLT51Lm1tYXAub2Zmc2V0LCBvcC0+dS5tbWFwLmxlbiwKLQkJCQkgICAgICBvcC0+dS5tbWFwLnIsIG9wLT51Lm1tYXAudywKLQkJCQkgICAgICBvcC0+dS5tbWFwLngpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gb3NfbWFwX21lbW9yeSgodm9pZCAqKSBvcC0+dS5tbWFwLmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT51Lm1tYXAuZmQsIG9wLT51Lm1tYXAub2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+dS5tbWFwLmxlbiwgb3AtPnUubW1hcC5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+dS5tbWFwLncsIG9wLT51Lm1tYXAueCk7CiAJCQlicmVhazsKIAkJY2FzZSBNVU5NQVA6Ci0JCQlvc191bm1hcF9tZW1vcnkoKHZvaWQgKikgb3AtPnUubXVubWFwLmFkZHIsCi0JCQkJCW9wLT51Lm11bm1hcC5sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gb3NfdW5tYXBfbWVtb3J5KCh2b2lkICopIG9wLT51Lm11bm1hcC5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT51Lm11bm1hcC5sZW4pOwogCQkJYnJlYWs7CiAJCWNhc2UgTVBST1RFQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBwcm90ZWN0X21lbW9yeShvcC0+dS5tcHJvdGVjdC5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPnUubXVubWFwLmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT51Lm1wcm90ZWN0LnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+dS5tcHJvdGVjdC53LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPnUubXByb3RlY3QueCwgMSk7CiAJCQlwcm90ZWN0X21lbW9yeShvcC0+dS5tcHJvdGVjdC5hZGRyLCBvcC0+dS5tdW5tYXAubGVuLAogCQkJCSAgICAgICBvcC0+dS5tcHJvdGVjdC5yLCBvcC0+dS5tcHJvdGVjdC53LAogCQkJCSAgICAgICBvcC0+dS5tcHJvdGVjdC54LCAxKTsKQEAgLTQ1LDYgKzUxLDggQEAKIAkJCWJyZWFrOwogCQl9CiAJfQorCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgZml4X3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdW1fYXJjaC5jIGIvYXJjaC91bS9rZXJuZWwvdW1fYXJjaC5jCmluZGV4IGNhMmJiNmYuLjA5ZjZmN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3VtX2FyY2guYworKysgYi9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMKQEAgLTEyNiw3ICsxMjYsNyBAQAogdW5zaWduZWQgbG9uZyBlbmRfdm07CiBpbnQgbmNwdXMgPSAxOwogCi0jaWZkZWYgQ09ORklHX01PREVfVFQKKyNpZmRlZiBDT05GSUdfQ01ETElORV9PTl9IT1NUCiAvKiBQb2ludGVyIHNldCBpbiBsaW51eF9tYWluLCB0aGUgYXJyYXkgaXRzZWxmIGlzIHByaXZhdGUgdG8gZWFjaCB0aHJlYWQsCiAgKiBhbmQgY2hhbmdlZCBhdCBhZGRyZXNzIHNwYWNlIGNyZWF0aW9uIHRpbWUgc28gdGhpcyBwb3NlcyBubyBjb25jdXJyZW5jeQogICogcHJvYmxlbXMuCkBAIC0xNDEsNyArMTQxLDcgQEAKIAogdm9pZCBzZXRfY21kbGluZShjaGFyICpjbWQpCiB7Ci0jaWZkZWYgQ09ORklHX01PREVfVFQKKyNpZmRlZiBDT05GSUdfQ01ETElORV9PTl9IT1NUCiAJY2hhciAqdW1pZCwgKnB0cjsKIAogCWlmKENIT09TRV9NT0RFKGhvbmV5cG90LCAwKSkgcmV0dXJuOwpAQCAtMzMzLDYgKzMzMyw3IEBACiAJaWYoaGF2ZV9yb290ID09IDApCiAJCWFkZF9hcmcoREVGQVVMVF9DT01NQU5EX0xJTkUpOwogCisJb3NfZWFybHlfY2hlY2tzKCk7CiAJbW9kZV90dCA9IGZvcmNlX3R0ID8gMSA6ICFjYW5fZG9fc2thcygpOwogI2lmbmRlZiBDT05GSUdfTU9ERV9UVAogCWlmIChtb2RlX3R0KSB7CkBAIC0zODUsNyArMzg2LDcgQEAKIAogCXNldHVwX21hY2hpbmVuYW1lKHN5c3RlbV91dHNuYW1lLm1hY2hpbmUpOwogCi0jaWZkZWYgQ09ORklHX01PREVfVFQKKyNpZmRlZiBDT05GSUdfQ01ETElORV9PTl9IT1NUCiAJYXJndjFfYmVnaW4gPSBhcmd2WzFdOwogCWFyZ3YxX2VuZCA9ICZhcmd2WzFdW3N0cmxlbihhcmd2WzFdKV07CiAjZW5kaWYKQEAgLTQ3MCw3ICs0NzEsNiBAQAogdm9pZCBfX2luaXQgY2hlY2tfYnVncyh2b2lkKQogewogCWFyY2hfY2hlY2tfYnVncygpOwotCWNoZWNrX3B0cmFjZSgpOwogCWNoZWNrX3NpZ2lvKCk7CiAJY2hlY2tfZGV2YW5vbigpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TIGIvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TCmluZGV4IGIwMzMyNmQuLmFmMTE5MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3VtbC5sZHMuUworKysgYi9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMKQEAgLTkzLDE0ICs5MywxMCBAQAogICAgKiguYnNzKQogICAgKihDT01NT04pCiAgIH0KLSAgX2VuZCA9IC4gOworICBfZW5kID0gLjsKICAgUFJPVklERSAoZW5kID0gLik7Ci0gIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfQotICAuc3RhYi5leGNsIDAgOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleCAwIDogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLSAgLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQorCisgIFNUQUJTX0RFQlVHCisKKyAgRFdBUkZfREVCVUcKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUgYi9hcmNoL3VtL29zLUxpbnV4L01ha2VmaWxlCmluZGV4IDRkZGY1NDAuLjdhMTY2MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZQpAQCAtMywxMSArMywxOSBAQAogIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAjCiAKLW9iai15ID0gZWxmX2F1eC5vIGZpbGUubyBwcm9jZXNzLm8gc2lnbmFsLm8gdGltZS5vIHR0eS5vIHVzZXJfc3ltcy5vIGRyaXZlcnMvIFwKLQlzeXMtJChTVUJBUkNIKS8KK29iai15ID0gYWlvLm8gZWxmX2F1eC5vIGZpbGUubyBwcm9jZXNzLm8gc2lnbmFsLm8gc3RhcnRfdXAubyB0aW1lLm8gdHQubyBcCisJdHR5Lm8gdXNlcl9zeW1zLm8gZHJpdmVycy8gc3lzLSQoU1VCQVJDSCkvCiAKLVVTRVJfT0JKUyA6PSBlbGZfYXV4Lm8gZmlsZS5vIHByb2Nlc3MubyBzaWduYWwubyB0aW1lLm8gdHR5Lm8KK1VTRVJfT0JKUyA6PSBhaW8ubyBlbGZfYXV4Lm8gZmlsZS5vIHByb2Nlc3MubyBzaWduYWwubyBzdGFydF91cC5vIHRpbWUubyB0dC5vIFwKKwl0dHkubworCitlbGZfYXV4Lm86ICQoQVJDSF9ESVIpL2tlcm5lbC1vZmZzZXRzLmgKK0NGTEFHU19lbGZfYXV4Lm8gKz0gLUkkKG9ianRyZWUpL2FyY2gvdW0KIAogQ0ZMQUdTX3VzZXJfc3ltcy5vICs9IC1EU1VCQVJDSF8kKFNVQkFSQ0gpCiAKK0hBVkVfQUlPX0FCSSA6PSAkKHNoZWxsIFsgLXIgL3Vzci9pbmNsdWRlL2xpbnV4L2Fpb19hYmkuaCBdICYmIFwKKwllY2hvIC1ESEFWRV9BSU9fQUJJICkKK0NGTEFHU19haW8ubyArPSAkKEhBVkVfQUlPX0FCSSkKKwogaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvYWlvLmMgYi9hcmNoL3VtL29zLUxpbnV4L2Fpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDg5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL29zLUxpbnV4L2Fpby5jCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAiaGVscGVyLmgiCisjaW5jbHVkZSAiYWlvLmgiCisjaW5jbHVkZSAiaW5pdC5oIgorI2luY2x1ZGUgInVzZXIuaCIKKyNpbmNsdWRlICJtb2RlLmgiCisKK3N0YXRpYyBpbnQgYWlvX3JlcV9mZF9yID0gLTE7CitzdGF0aWMgaW50IGFpb19yZXFfZmRfdyA9IC0xOworCitzdGF0aWMgaW50IHVwZGF0ZV9haW8oc3RydWN0IGFpb19jb250ZXh0ICphaW8sIGludCByZXMpCit7CisgICAgICAgIGlmKHJlcyA8IDApCisgICAgICAgICAgICAgICAgYWlvLT5sZW4gPSByZXM7CisgICAgICAgIGVsc2UgaWYoKHJlcyA9PSAwKSAmJiAoYWlvLT50eXBlID09IEFJT19SRUFEKSl7CisgICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgRU9GIGNhc2UgLSB3ZSBoYXZlIGhpdCB0aGUgZW5kIG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICogYW5kIGl0IGVuZHMgaW4gYSBwYXJ0aWFsIGJsb2NrLCBzbyB3ZSBmaWxsIHRoZSBlbmQgb2YKKyAgICAgICAgICAgICAgICAgKiB0aGUgYmxvY2sgd2l0aCB6ZXJvcyBhbmQgY2xhaW0gc3VjY2Vzcy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBtZW1zZXQoYWlvLT5kYXRhLCAwLCBhaW8tPmxlbik7CisgICAgICAgICAgICAgICAgYWlvLT5sZW4gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYocmVzID4gMCl7CisgICAgICAgICAgICAgICAgYWlvLT5sZW4gLT0gcmVzOworICAgICAgICAgICAgICAgIGFpby0+ZGF0YSArPSByZXM7CisgICAgICAgICAgICAgICAgYWlvLT5vZmZzZXQgKz0gcmVzOworICAgICAgICAgICAgICAgIHJldHVybiBhaW8tPmxlbjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChIQVZFX0FJT19BQkkpCisjaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgorCisvKiBJZiB3ZSBoYXZlIHRoZSBoZWFkZXJzLCB3ZSBhcmUgZ29pbmcgdG8gYnVpbGQgd2l0aCBBSU8gZW5hYmxlZC4KKyAqIElmIHdlIGRvbid0IGhhdmUgYWlvIGluIGxpYmMsIHdlIGRlZmluZSB0aGUgbmVjZXNzYXJ5IHN0dWJzIGhlcmUuCisgKi8KKworI2lmICFkZWZpbmVkKEhBVkVfQUlPX0xJQkMpCisKK3N0YXRpYyBsb25nIGlvX3NldHVwKGludCBuLCBhaW9fY29udGV4dF90ICpjdHhwKQoreworICAgICAgICByZXR1cm4gc3lzY2FsbChfX05SX2lvX3NldHVwLCBuLCBjdHhwKTsKK30KKworc3RhdGljIGxvbmcgaW9fc3VibWl0KGFpb19jb250ZXh0X3QgY3R4LCBsb25nIG5yLCBzdHJ1Y3QgaW9jYiAqKmlvY2JwcCkKK3sKKyAgICAgICAgcmV0dXJuIHN5c2NhbGwoX19OUl9pb19zdWJtaXQsIGN0eCwgbnIsIGlvY2JwcCk7Cit9CisKK3N0YXRpYyBsb25nIGlvX2dldGV2ZW50cyhhaW9fY29udGV4dF90IGN0eF9pZCwgbG9uZyBtaW5fbnIsIGxvbmcgbnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlvX2V2ZW50ICpldmVudHMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCkKK3sKKyAgICAgICAgcmV0dXJuIHN5c2NhbGwoX19OUl9pb19nZXRldmVudHMsIGN0eF9pZCwgbWluX25yLCBuciwgZXZlbnRzLCB0aW1lb3V0KTsKK30KKworI2VuZGlmCisKKy8qIFRoZSBBSU9fTU1BUCBjYXNlcyBmb3JjZSB0aGUgbW1hcHBlZCBwYWdlIGludG8gbWVtb3J5IGhlcmUKKyAqIHJhdGhlciB0aGFuIGluIHdoYXRldmVyIHBsYWNlIGZpcnN0IHRvdWNoZXMgdGhlIGRhdGEuICBJIHVzZWQKKyAqIHRvIGRvIHRoaXMgYnkgdG91Y2hpbmcgdGhlIHBhZ2UsIGJ1dCB0aGF0J3MgZGVsaWNhdGUgYmVjYXVzZQorICogZ2NjIGlzIHByb25lIHRvIG9wdGltaXppbmcgdGhhdCBhd2F5LiAgU28sIHdoYXQncyBkb25lIGhlcmUKKyAqIGlzIHdlIHJlYWQgZnJvbSB0aGUgZGVzY3JpcHRvciBmcm9tIHdoaWNoIHRoZSBwYWdlIHdhcworICogbWFwcGVkLiAgVGhlIGNhbGxlciBpcyByZXF1aXJlZCB0byBwYXNzIGFuIG9mZnNldCB3aGljaCBpcworICogaW5zaWRlIHRoZSBwYWdlIHRoYXQgd2FzIG1hcHBlZC4gIFRodXMsIHdoZW4gdGhlIHJlYWQKKyAqIHJldHVybnMsIHdlIGtub3cgdGhhdCB0aGUgcGFnZSBpcyBpbiB0aGUgcGFnZSBjYWNoZSwgYW5kCisgKiB0aGF0IGl0IG5vdyBiYWNrcyB0aGUgbW1hcHBlZCBhcmVhLgorICovCisKK3N0YXRpYyBpbnQgZG9fYWlvKGFpb19jb250ZXh0X3QgY3R4LCBzdHJ1Y3QgYWlvX2NvbnRleHQgKmFpbykKK3sKKyAgICAgICAgc3RydWN0IGlvY2IgaW9jYiwgKmlvY2JwID0gJmlvY2I7CisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBpb2NiID0gKChzdHJ1Y3QgaW9jYikgeyAuYWlvX2RhdGEgCT0gKHVuc2lnbmVkIGxvbmcpIGFpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFpb19yZXFwcmlvCT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFpb19maWxkZXMJPSBhaW8tPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWlvX2J1Zgk9ICh1bnNpZ25lZCBsb25nKSBhaW8tPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5haW9fbmJ5dGVzCT0gYWlvLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5haW9fb2Zmc2V0CT0gYWlvLT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5haW9fcmVzZXJ2ZWQxCT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFpb19yZXNlcnZlZDIJPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWlvX3Jlc2VydmVkMwk9IDAgfSk7CisKKyAgICAgICAgc3dpdGNoKGFpby0+dHlwZSl7CisgICAgICAgIGNhc2UgQUlPX1JFQUQ6CisgICAgICAgICAgICAgICAgaW9jYi5haW9fbGlvX29wY29kZSA9IElPQ0JfQ01EX1BSRUFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFJT19XUklURToKKyAgICAgICAgICAgICAgICBpb2NiLmFpb19saW9fb3Bjb2RlID0gSU9DQl9DTURfUFdSSVRFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFJT19NTUFQOgorICAgICAgICAgICAgICAgIGlvY2IuYWlvX2xpb19vcGNvZGUgPSBJT0NCX0NNRF9QUkVBRDsKKyAgICAgICAgICAgICAgICBpb2NiLmFpb19idWYgPSAodW5zaWduZWQgbG9uZykgJmM7CisgICAgICAgICAgICAgICAgaW9jYi5haW9fbmJ5dGVzID0gc2l6ZW9mKGMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByaW50aygiQm9ndXMgb3AgaW4gZG9fYWlvIC0gJWRcbiIsIGFpby0+dHlwZSk7CisgICAgICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGlvX3N1Ym1pdChjdHgsIDEsICZpb2NicCk7CisgICAgICAgIGlmKGVyciA+IDApCisgICAgICAgICAgICAgICAgZXJyID0gMDsKKworIG91dDoKKyAgICAgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGFpb19jb250ZXh0X3QgY3R4ID0gMDsKKworc3RhdGljIGludCBhaW9fdGhyZWFkKHZvaWQgKmFyZykKK3sKKyAgICAgICAgc3RydWN0IGFpb190aHJlYWRfcmVwbHkgcmVwbHk7CisgICAgICAgIHN0cnVjdCBhaW9fY29udGV4dCAqYWlvOworICAgICAgICBzdHJ1Y3QgaW9fZXZlbnQgZXZlbnQ7CisgICAgICAgIGludCBlcnIsIG47CisKKyAgICAgICAgc2lnbmFsKFNJR1dJTkNILCBTSUdfSUdOKTsKKworICAgICAgICB3aGlsZSgxKXsKKyAgICAgICAgICAgICAgICBuID0gaW9fZ2V0ZXZlbnRzKGN0eCwgMSwgMSwgJmV2ZW50LCBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZihuIDwgMCl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihlcnJubyA9PSBFSU5UUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImFpb190aHJlYWQgLSBpb19nZXRldmVudHMgZmFpbGVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisJCQlhaW8gPSAoc3RydWN0IGFpb19jb250ZXh0ICopIGV2ZW50LmRhdGE7CisJCQlpZih1cGRhdGVfYWlvKGFpbywgZXZlbnQucmVzKSl7CisJCQkJZG9fYWlvKGN0eCwgYWlvKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSAoKHN0cnVjdCBhaW9fdGhyZWFkX3JlcGx5KQorCQkJCXsgLmRhdGEgPSBhaW8sCisJCQkJICAuZXJyCT0gYWlvLT5sZW4gfSk7CisJCQllcnIgPSBvc193cml0ZV9maWxlKGFpby0+cmVwbHlfZmQsICZyZXBseSwKKwkJCQkJICAgIHNpemVvZihyZXBseSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyICE9IHNpemVvZihyZXBseSkpCisJCQkJcHJpbnRrKCJhaW9fdGhyZWFkIC0gd3JpdGUgZmFpbGVkLCAiCisJCQkJICAgICAgICJmZCA9ICVkLCBlcnIgPSAlZFxuIiwgYWlvLT5yZXBseV9mZCwKKwkJCQkgICAgICAgLWVycik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBkb19ub3RfYWlvKHN0cnVjdCBhaW9fY29udGV4dCAqYWlvKQoreworICAgICAgICBjaGFyIGM7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgc3dpdGNoKGFpby0+dHlwZSl7CisgICAgICAgIGNhc2UgQUlPX1JFQUQ6CisgICAgICAgICAgICAgICAgZXJyID0gb3Nfc2Vla19maWxlKGFpby0+ZmQsIGFpby0+b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZihlcnIpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgICAgICAgIGVyciA9IG9zX3JlYWRfZmlsZShhaW8tPmZkLCBhaW8tPmRhdGEsIGFpby0+bGVuKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBSU9fV1JJVEU6CisgICAgICAgICAgICAgICAgZXJyID0gb3Nfc2Vla19maWxlKGFpby0+ZmQsIGFpby0+b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZihlcnIpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgICAgICAgIGVyciA9IG9zX3dyaXRlX2ZpbGUoYWlvLT5mZCwgYWlvLT5kYXRhLCBhaW8tPmxlbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUlPX01NQVA6CisgICAgICAgICAgICAgICAgZXJyID0gb3Nfc2Vla19maWxlKGFpby0+ZmQsIGFpby0+b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZihlcnIpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgICAgICAgIGVyciA9IG9zX3JlYWRfZmlsZShhaW8tPmZkLCAmYywgc2l6ZW9mKGMpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmludGsoImRvX25vdF9haW8gLSBiYWQgcmVxdWVzdCB0eXBlIDogJWRcbiIsIGFpby0+dHlwZSk7CisgICAgICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgb3V0OgorICAgICAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG5vdF9haW9fdGhyZWFkKHZvaWQgKmFyZykKK3sKKyAgICAgICAgc3RydWN0IGFpb19jb250ZXh0ICphaW87CisgICAgICAgIHN0cnVjdCBhaW9fdGhyZWFkX3JlcGx5IHJlcGx5OworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIHNpZ25hbChTSUdXSU5DSCwgU0lHX0lHTik7CisgICAgICAgIHdoaWxlKDEpeworICAgICAgICAgICAgICAgIGVyciA9IG9zX3JlYWRfZmlsZShhaW9fcmVxX2ZkX3IsICZhaW8sIHNpemVvZihhaW8pKTsKKyAgICAgICAgICAgICAgICBpZihlcnIgIT0gc2l6ZW9mKGFpbykpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJub3RfYWlvX3RocmVhZCAtIHJlYWQgZmFpbGVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQgPSAlZCwgZXJyID0gJWRcbiIsIGFpb19yZXFfZmRfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygibm90X2Fpb190aHJlYWQgLSBzaG9ydCByZWFkLCBmZCA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGVuZ3RoID0gJWRcbiIsIGFpb19yZXFfZmRfciwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyBhZ2FpbjoKKyAgICAgICAgICAgICAgICBlcnIgPSBkb19ub3RfYWlvKGFpbyk7CisKKyAgICAgICAgICAgICAgICBpZih1cGRhdGVfYWlvKGFpbywgZXJyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYWdhaW47CisKKyAgICAgICAgICAgICAgICByZXBseSA9ICgoc3RydWN0IGFpb190aHJlYWRfcmVwbHkpIHsgLmRhdGEgCT0gYWlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXJyCT0gYWlvLT5sZW4gfSk7CisgICAgICAgICAgICAgICAgZXJyID0gb3Nfd3JpdGVfZmlsZShhaW8tPnJlcGx5X2ZkLCAmcmVwbHksIHNpemVvZihyZXBseSkpOworICAgICAgICAgICAgICAgIGlmKGVyciAhPSBzaXplb2YocmVwbHkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJub3RfYWlvX3RocmVhZCAtIHdyaXRlIGZhaWxlZCwgZmQgPSAlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnIgPSAlZFxuIiwgYWlvX3JlcV9mZF9yLCAtZXJyKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgaW50IHN1Ym1pdF9haW9fMjQoc3RydWN0IGFpb19jb250ZXh0ICphaW8pCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgZXJyID0gb3Nfd3JpdGVfZmlsZShhaW9fcmVxX2ZkX3csICZhaW8sIHNpemVvZihhaW8pKTsKKyAgICAgICAgaWYoZXJyID09IHNpemVvZihhaW8pKQorICAgICAgICAgICAgICAgIGVyciA9IDA7CisKKyAgICAgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhaW9fcGlkID0gLTE7CitzdGF0aWMgaW50ICgqc3VibWl0X3Byb2MpKHN0cnVjdCBhaW9fY29udGV4dCAqYWlvKTsKKworc3RhdGljIGludCBpbml0X2Fpb18yNCh2b2lkKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIHN0YWNrOworICAgICAgICBpbnQgZmRzWzJdLCBlcnI7CisKKyAgICAgICAgZXJyID0gb3NfcGlwZShmZHMsIDEsIDEpOworICAgICAgICBpZihlcnIpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgYWlvX3JlcV9mZF93ID0gZmRzWzBdOworICAgICAgICBhaW9fcmVxX2ZkX3IgPSBmZHNbMV07CisgICAgICAgIGVyciA9IHJ1bl9oZWxwZXJfdGhyZWFkKG5vdF9haW9fdGhyZWFkLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9ORV9GSUxFUyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgJnN0YWNrLCAwKTsKKyAgICAgICAgaWYoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIG91dF9jbG9zZV9waXBlOworCisgICAgICAgIGFpb19waWQgPSBlcnI7CisgICAgICAgIGdvdG8gb3V0OworCisgb3V0X2Nsb3NlX3BpcGU6CisgICAgICAgIG9zX2Nsb3NlX2ZpbGUoZmRzWzBdKTsKKyAgICAgICAgb3NfY2xvc2VfZmlsZShmZHNbMV0pOworICAgICAgICBhaW9fcmVxX2ZkX3cgPSAtMTsKKyAgICAgICAgYWlvX3JlcV9mZF9yID0gLTE7Cisgb3V0OgorI2lmbmRlZiBIQVZFX0FJT19BQkkKKwlwcmludGsoIi91c3IvaW5jbHVkZS9saW51eC9haW9fYWJpLmggbm90IHByZXNlbnQgZHVyaW5nIGJ1aWxkXG4iKTsKKyNlbmRpZgorCXByaW50aygiMi42IGhvc3QgQUlPIHN1cHBvcnQgbm90IHVzZWQgLSBmYWxsaW5nIGJhY2sgdG8gSS9PICIKKwkgICAgICAgInRocmVhZFxuIik7CisKKwlzdWJtaXRfcHJvYyA9IHN1Ym1pdF9haW9fMjQ7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBIQVZFX0FJT19BQkkKKyNkZWZpbmUgREVGQVVMVF8yNF9BSU8gMAorc3RhdGljIGludCBzdWJtaXRfYWlvXzI2KHN0cnVjdCBhaW9fY29udGV4dCAqYWlvKQoreworCXN0cnVjdCBhaW9fdGhyZWFkX3JlcGx5IHJlcGx5OworCWludCBlcnI7CisKKwllcnIgPSBkb19haW8oY3R4LCBhaW8pOworCWlmKGVycil7CisJCXJlcGx5ID0gKChzdHJ1Y3QgYWlvX3RocmVhZF9yZXBseSkgeyAuZGF0YSA9IGFpbywKKwkJCQkJICAgICAgICAgICAgIC5lcnIgID0gZXJyIH0pOworCQllcnIgPSBvc193cml0ZV9maWxlKGFpby0+cmVwbHlfZmQsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSk7CisJCWlmKGVyciAhPSBzaXplb2YocmVwbHkpKQorCQkJcHJpbnRrKCJzdWJtaXRfYWlvXzI2IC0gd3JpdGUgZmFpbGVkLCAiCisJCQkgICAgICAgImZkID0gJWQsIGVyciA9ICVkXG4iLCBhaW8tPnJlcGx5X2ZkLCAtZXJyKTsKKwkJZWxzZSBlcnIgPSAwOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9haW9fMjYodm9pZCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBzdGFjazsKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBpZihpb19zZXR1cCgyNTYsICZjdHgpKXsKKyAgICAgICAgICAgICAgICBwcmludGsoImFpb190aHJlYWQgZmFpbGVkIHRvIGluaXRpYWxpemUgY29udGV4dCwgZXJyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGVycm5vKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLWVycm5vOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gcnVuX2hlbHBlcl90aHJlYWQoYWlvX3RocmVhZCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsICZzdGFjaywgMCk7CisgICAgICAgIGlmKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICBhaW9fcGlkID0gZXJyOworCisJcHJpbnRrKCJVc2luZyAyLjYgaG9zdCBBSU9cbiIpOworCisJc3VibWl0X3Byb2MgPSBzdWJtaXRfYWlvXzI2OworCisgICAgICAgIHJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBERUZBVUxUXzI0X0FJTyAxCitzdGF0aWMgaW50IHN1Ym1pdF9haW9fMjYoc3RydWN0IGFpb19jb250ZXh0ICphaW8pCit7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW50IGluaXRfYWlvXzI2KHZvaWQpCit7CisJc3VibWl0X3Byb2MgPSBzdWJtaXRfYWlvXzI2OworICAgICAgICByZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGFpb18yNCA9IERFRkFVTFRfMjRfQUlPOworCitzdGF0aWMgaW50IF9faW5pdCBzZXRfYWlvXzI0KGNoYXIgKm5hbWUsIGludCAqYWRkKQoreworICAgICAgICBhaW9fMjQgPSAxOworICAgICAgICByZXR1cm4gMDsKK30KKworX191bWxfc2V0dXAoImFpbz0yLjQiLCBzZXRfYWlvXzI0LAorImFpbz0yLjRcbiIKKyIgICAgVGhpcyBpcyB1c2VkIHRvIGZvcmNlIFVNTCB0byB1c2UgMi40LXN0eWxlIEFJTyBldmVuIHdoZW4gMi42IEFJTyBpc1xuIgorIiAgICBhdmFpbGFibGUuICAyLjQgQUlPIGlzIGEgc2luZ2xlIHRocmVhZCB0aGF0IGhhbmRsZXMgb25lIHJlcXVlc3QgYXQgYVxuIgorIiAgICB0aW1lLCBzeW5jaHJvbm91c2x5LiAgMi42IEFJTyBpcyBhIHRocmVhZCB3aGljaCB1c2VzIHRoZSAyLjYgQUlPIFxuIgorIiAgICBpbnRlcmZhY2UgdG8gaGFuZGxlIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cy4gIDIuNiBBSU8gXG4iCisiICAgIGlzIG5vdCBhdmFpbGFibGUgaW4gdHQgbW9kZSwgb24gMi40IGhvc3RzLCBvciB3aGVuIFVNTCBpcyBidWlsdCB3aXRoXG4iCisiICAgIC91c3IvaW5jbHVkZS9saW51eC9haW9fYWJpLmggbm90IGF2YWlsYWJsZS4gIE1hbnkgZGlzdHJpYnV0aW9ucyBkb24ndFxuIgorIiAgICBpbmNsdWRlIGFpb19hYmkuaCwgc28geW91IHdpbGwgbmVlZCB0byBjb3B5IGl0IGZyb20gYSBrZXJuZWwgdHJlZSB0b1xuIgorIiAgICB5b3VyIC91c3IvaW5jbHVkZS9saW51eCBpbiBvcmRlciB0byBidWlsZCBhbiBBSU8tY2FwYWJsZSBVTUxcblxuIgorKTsKKworc3RhdGljIGludCBpbml0X2Fpbyh2b2lkKQoreworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIENIT09TRV9NT0RFKCh7CisgICAgICAgICAgICAgICAgaWYoIWFpb18yNCl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkRpc2FibGluZyAyLjYgQUlPIGluIHR0IG1vZGVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYWlvXzI0ID0gMTsKKyAgICAgICAgICAgICAgICB9IH0pLCAodm9pZCkgMCk7CisKKyAgICAgICAgaWYoIWFpb18yNCl7CisgICAgICAgICAgICAgICAgZXJyID0gaW5pdF9haW9fMjYoKTsKKyAgICAgICAgICAgICAgICBpZihlcnIgJiYgKGVycm5vID09IEVOT1NZUykpeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIyLjYgQUlPIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGhvc3QgLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldmVydGluZyB0byAyLjQgQUlPXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpb18yNCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGFpb18yNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5pdF9haW9fMjQoKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworLyogVGhlIHJlYXNvbiBmb3IgdGhlIF9faW5pdGNhbGwvX191bWxfZXhpdGNhbGwgYXN5bW1ldHJ5IGlzIHRoYXQgaW5pdF9haW8KKyAqIG5lZWRzIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBrZXJuZWwgaXMgcnVubmluZyBiZWNhdXNlIGl0IGNhbGxzIHJ1bl9oZWxwZXIsCisgKiB3aGljaCBuZWVkcyBnZXRfZnJlZV9wYWdlLiAgZXhpdF9haW8gaXMgYSBfX3VtbF9leGl0Y2FsbCBiZWNhdXNlIHRoZSBnZW5lcmljCisgKiBrZXJuZWwgZG9lcyBub3QgcnVuIF9fZXhpdGNhbGxzIG9uIHNodXRkb3duLCBhbmQgY2FuJ3QgYmVjYXVzZSBtYW55IG9mIHRoZW0KKyAqIGJyZWFrIHdoZW4gY2FsbGVkIG91dHNpZGUgb2YgbW9kdWxlIHVubG9hZGluZy4KKyAqLworX19pbml0Y2FsbChpbml0X2Fpbyk7CisKK3N0YXRpYyB2b2lkIGV4aXRfYWlvKHZvaWQpCit7CisgICAgICAgIGlmKGFpb19waWQgIT0gLTEpCisgICAgICAgICAgICAgICAgb3Nfa2lsbF9wcm9jZXNzKGFpb19waWQsIDEpOworfQorCitfX3VtbF9leGl0Y2FsbChleGl0X2Fpbyk7CisKK2ludCBzdWJtaXRfYWlvKHN0cnVjdCBhaW9fY29udGV4dCAqYWlvKQoreworCXJldHVybiAoKnN1Ym1pdF9wcm9jKShhaW8pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9lbGZfYXV4LmMgYi9hcmNoL3VtL29zLUxpbnV4L2VsZl9hdXguYwppbmRleCA0Y2NhM2U5Li4xMzk5NTIwIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2VsZl9hdXguYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2VsZl9hdXguYwpAQCAtMTIsOCArMTIsOSBAQAogI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJlbGZfdXNlci5oIgogI2luY2x1ZGUgIm1lbV91c2VyLmgiCisjaW5jbHVkZSA8a2VybmVsLW9mZnNldHMuaD4KIAotI2lmIEVMRl9DTEFTUyA9PSBFTEZDTEFTUzMyCisjaWYgSE9TVF9FTEZfQ0xBU1MgPT0gRUxGQ0xBU1MzMgogdHlwZWRlZiBFbGYzMl9hdXh2X3QgZWxmX2F1eHZfdDsKICNlbHNlCiB0eXBlZGVmIEVsZjY0X2F1eHZfdCBlbGZfYXV4dl90OwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYwppbmRleCAxZTEyNmJmLi5kMzI0MTNlIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYwpAQCAtMywxMCArMywxMCBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgpAQCAtMTQsNiArMTQsMTAgQEAKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKKyNpbmNsdWRlICJzaWduYWxfdXNlci5oIgorI2luY2x1ZGUgInByb2Nlc3MuaCIKKyNpbmNsdWRlICJpcnFfdXNlci5oIgorI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogCiAjZGVmaW5lIEFSQklUUkFSWV9BRERSIC0xCiAjZGVmaW5lIEZBSUxVUkVfUElEICAgIC0xCkBAIC0xMTQsOCArMTE4LDEwIEBACiAJa2lsbChwaWQsIFNJR1VTUjEpOwogfQogCi0vKkRvbid0IHVzZSB0aGUgZ2xpYmMgdmVyc2lvbiwgd2hpY2ggY2FjaGVzIHRoZSByZXN1bHQgaW4gVExTLiBJdCBtaXNzZXMgc29tZQotICogc3lzY2FsbHMsIGFuZCBhbHNvIGJyZWFrcyB3aXRoIGNsb25lKCksIHdoaWNoIGRvZXMgbm90IHVuc2hhcmUgdGhlIFRMUy4qLworLyogRG9uJ3QgdXNlIHRoZSBnbGliYyB2ZXJzaW9uLCB3aGljaCBjYWNoZXMgdGhlIHJlc3VsdCBpbiBUTFMuIEl0IG1pc3NlcyBzb21lCisgKiBzeXNjYWxscywgYW5kIGFsc28gYnJlYWtzIHdpdGggY2xvbmUoKSwgd2hpY2ggZG9lcyBub3QgdW5zaGFyZSB0aGUgVExTLgorICovCisKIGlubGluZSBfc3lzY2FsbDAocGlkX3QsIGdldHBpZCkKIAogaW50IG9zX2dldHBpZCh2b2lkKQpAQCAtMTY0LDYgKzE3MCw1MiBAQAogICAgICAgICByZXR1cm4oMCk7CiB9CiAKK3ZvaWQgaW5pdF9uZXdfdGhyZWFkX3N0YWNrKHZvaWQgKnNpZ19zdGFjaywgdm9pZCAoKnVzcjFfaGFuZGxlcikoaW50KSkKK3sKKwlpbnQgZmxhZ3MgPSAwLCBwYWdlczsKKworCWlmKHNpZ19zdGFjayAhPSBOVUxMKXsKKwkJcGFnZXMgPSAoMSA8PCBVTUxfQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUik7CisJCXNldF9zaWdzdGFjayhzaWdfc3RhY2ssIHBhZ2VzICogcGFnZV9zaXplKCkpOworCQlmbGFncyA9IFNBX09OU1RBQ0s7CisJfQorCWlmKHVzcjFfaGFuZGxlcikgc2V0X2hhbmRsZXIoU0lHVVNSMSwgdXNyMV9oYW5kbGVyLCBmbGFncywgLTEpOworfQorCit2b2lkIGluaXRfbmV3X3RocmVhZF9zaWduYWxzKGludCBhbHRzdGFjaykKK3sKKwlpbnQgZmxhZ3MgPSBhbHRzdGFjayA/IFNBX09OU1RBQ0sgOiAwOworCisJc2V0X2hhbmRsZXIoU0lHU0VHViwgKF9fc2lnaGFuZGxlcl90KSBzaWdfaGFuZGxlciwgZmxhZ3MsCisJCSAgICBTSUdVU1IxLCBTSUdJTywgU0lHV0lOQ0gsIFNJR0FMUk0sIFNJR1ZUQUxSTSwgLTEpOworCXNldF9oYW5kbGVyKFNJR1RSQVAsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIGZsYWdzLAorCQkgICAgU0lHVVNSMSwgU0lHSU8sIFNJR1dJTkNILCBTSUdBTFJNLCBTSUdWVEFMUk0sIC0xKTsKKwlzZXRfaGFuZGxlcihTSUdGUEUsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIGZsYWdzLAorCQkgICAgU0lHVVNSMSwgU0lHSU8sIFNJR1dJTkNILCBTSUdBTFJNLCBTSUdWVEFMUk0sIC0xKTsKKwlzZXRfaGFuZGxlcihTSUdJTEwsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIGZsYWdzLAorCQkgICAgU0lHVVNSMSwgU0lHSU8sIFNJR1dJTkNILCBTSUdBTFJNLCBTSUdWVEFMUk0sIC0xKTsKKwlzZXRfaGFuZGxlcihTSUdCVVMsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIGZsYWdzLAorCQkgICAgU0lHVVNSMSwgU0lHSU8sIFNJR1dJTkNILCBTSUdBTFJNLCBTSUdWVEFMUk0sIC0xKTsKKwlzZXRfaGFuZGxlcihTSUdVU1IyLCAoX19zaWdoYW5kbGVyX3QpIHNpZ19oYW5kbGVyLAorCQkgICAgZmxhZ3MsIFNJR1VTUjEsIFNJR0lPLCBTSUdXSU5DSCwgU0lHQUxSTSwgU0lHVlRBTFJNLCAtMSk7CisJc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7CisKKwlpbml0X2lycV9zaWduYWxzKGFsdHN0YWNrKTsKK30KKworaW50IHJ1bl9rZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICphcmcsIHZvaWQgKipqbXBfcHRyKQoreworICAgICAgIHNpZ2ptcF9idWYgYnVmOworICAgICAgIGludCBuOworCisgICAgICAgKmptcF9wdHIgPSAmYnVmOworICAgICAgIG4gPSBzaWdzZXRqbXAoYnVmLCAxKTsKKyAgICAgICBpZihuICE9IDApCisgICAgICAgICAgICAgICByZXR1cm4obik7CisgICAgICAgKCpmbikoYXJnKTsKKyAgICAgICByZXR1cm4oMCk7Cit9CisKIC8qCiAgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KICAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC91bS9vcy1MaW51eC9zdGFydF91cC5jCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIGFyY2gvdW0va2VybmVsL3Byb2Nlc3MuYwpyZW5hbWUgdG8gYXJjaC91bS9vcy1MaW51eC9zdGFydF91cC5jCmluZGV4IDY3YWNkOTIuLjA0MGNjMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3N0YXJ0X3VwLmMKQEAgLTEsNCArMSw0IEBACi0vKiAKKy8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAidXNlci5oIgotI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJzaWduYWxfa2Vybi5oIgogI2luY2x1ZGUgInNpZ25hbF91c2VyLmgiCiAjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgpAQCAtMzksOTggKzM4LDYgQEAKICNpbmNsdWRlICJyZWdpc3RlcnMuaCIKICNlbmRpZgogCi12b2lkIGluaXRfbmV3X3RocmVhZF9zdGFjayh2b2lkICpzaWdfc3RhY2ssIHZvaWQgKCp1c3IxX2hhbmRsZXIpKGludCkpCi17Ci0JaW50IGZsYWdzID0gMCwgcGFnZXM7Ci0KLQlpZihzaWdfc3RhY2sgIT0gTlVMTCl7Ci0JCXBhZ2VzID0gKDEgPDwgVU1MX0NPTkZJR19LRVJORUxfU1RBQ0tfT1JERVIpOwotCQlzZXRfc2lnc3RhY2soc2lnX3N0YWNrLCBwYWdlcyAqIHBhZ2Vfc2l6ZSgpKTsKLQkJZmxhZ3MgPSBTQV9PTlNUQUNLOwotCX0KLQlpZih1c3IxX2hhbmRsZXIpIHNldF9oYW5kbGVyKFNJR1VTUjEsIHVzcjFfaGFuZGxlciwgZmxhZ3MsIC0xKTsKLX0KLQotdm9pZCBpbml0X25ld190aHJlYWRfc2lnbmFscyhpbnQgYWx0c3RhY2spCi17Ci0JaW50IGZsYWdzID0gYWx0c3RhY2sgPyBTQV9PTlNUQUNLIDogMDsKLQotCXNldF9oYW5kbGVyKFNJR1NFR1YsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIGZsYWdzLAotCQkgICAgU0lHVVNSMSwgU0lHSU8sIFNJR1dJTkNILCBTSUdBTFJNLCBTSUdWVEFMUk0sIC0xKTsKLQlzZXRfaGFuZGxlcihTSUdUUkFQLCAoX19zaWdoYW5kbGVyX3QpIHNpZ19oYW5kbGVyLCBmbGFncywgCi0JCSAgICBTSUdVU1IxLCBTSUdJTywgU0lHV0lOQ0gsIFNJR0FMUk0sIFNJR1ZUQUxSTSwgLTEpOwotCXNldF9oYW5kbGVyKFNJR0ZQRSwgKF9fc2lnaGFuZGxlcl90KSBzaWdfaGFuZGxlciwgZmxhZ3MsIAotCQkgICAgU0lHVVNSMSwgU0lHSU8sIFNJR1dJTkNILCBTSUdBTFJNLCBTSUdWVEFMUk0sIC0xKTsKLQlzZXRfaGFuZGxlcihTSUdJTEwsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIGZsYWdzLCAKLQkJICAgIFNJR1VTUjEsIFNJR0lPLCBTSUdXSU5DSCwgU0lHQUxSTSwgU0lHVlRBTFJNLCAtMSk7Ci0Jc2V0X2hhbmRsZXIoU0lHQlVTLCAoX19zaWdoYW5kbGVyX3QpIHNpZ19oYW5kbGVyLCBmbGFncywgCi0JCSAgICBTSUdVU1IxLCBTSUdJTywgU0lHV0lOQ0gsIFNJR0FMUk0sIFNJR1ZUQUxSTSwgLTEpOwotCXNldF9oYW5kbGVyKFNJR1VTUjIsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIAotCQkgICAgZmxhZ3MsIFNJR1VTUjEsIFNJR0lPLCBTSUdXSU5DSCwgU0lHQUxSTSwgU0lHVlRBTFJNLCAtMSk7Ci0Jc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7Ci0KLQlpbml0X2lycV9zaWduYWxzKGFsdHN0YWNrKTsKLX0KLQotc3RydWN0IHRyYW1wIHsKLQlpbnQgKCp0cmFtcCkodm9pZCAqKTsKLQl2b2lkICp0cmFtcF9kYXRhOwotCXVuc2lnbmVkIGxvbmcgdGVtcF9zdGFjazsKLQlpbnQgZmxhZ3M7Ci0JaW50IHBpZDsKLX07Ci0KLS8qIFNlZSBhYm92ZSBmb3Igd2h5IHNpZ2tpbGwgaXMgaGVyZSAqLwotCi1pbnQgc2lna2lsbCA9IFNJR0tJTEw7Ci0KLWludCBvdXRlcl90cmFtcCh2b2lkICphcmcpCi17Ci0Jc3RydWN0IHRyYW1wICp0OwotCWludCBzaWcgPSBzaWdraWxsOwotCi0JdCA9IGFyZzsKLQl0LT5waWQgPSBjbG9uZSh0LT50cmFtcCwgKHZvaWQgKikgdC0+dGVtcF9zdGFjayArIHBhZ2Vfc2l6ZSgpLzIsCi0JCSAgICAgICB0LT5mbGFncywgdC0+dHJhbXBfZGF0YSk7Ci0JaWYodC0+cGlkID4gMCkgd2FpdF9mb3Jfc3RvcCh0LT5waWQsIFNJR1NUT1AsIFBUUkFDRV9DT05ULCBOVUxMKTsKLQlraWxsKG9zX2dldHBpZCgpLCBzaWcpOwotCV9leGl0KDApOwotfQotCi1pbnQgc3RhcnRfZm9ya190cmFtcCh2b2lkICp0aHJlYWRfYXJnLCB1bnNpZ25lZCBsb25nIHRlbXBfc3RhY2ssIAotCQkgICAgIGludCBjbG9uZV9mbGFncywgaW50ICgqdHJhbXApKHZvaWQgKikpCi17Ci0Jc3RydWN0IHRyYW1wIGFyZzsKLQl1bnNpZ25lZCBsb25nIHNwOwotCWludCBuZXdfcGlkLCBzdGF0dXMsIGVycjsKLQotCS8qIFRoZSB0cmFtcG9saW5lIHdpbGwgcnVuIG9uIHRoZSB0ZW1wb3Jhcnkgc3RhY2sgKi8KLQlzcCA9IHN0YWNrX3NwKHRlbXBfc3RhY2spOwotCi0JY2xvbmVfZmxhZ3MgfD0gQ0xPTkVfRklMRVMgfCBTSUdDSExEOwotCi0JYXJnLnRyYW1wID0gdHJhbXA7Ci0JYXJnLnRyYW1wX2RhdGEgPSB0aHJlYWRfYXJnOwotCWFyZy50ZW1wX3N0YWNrID0gdGVtcF9zdGFjazsKLQlhcmcuZmxhZ3MgPSBjbG9uZV9mbGFnczsKLQotCS8qIFN0YXJ0IHRoZSBwcm9jZXNzIGFuZCB3YWl0IGZvciBpdCB0byBraWxsIGl0c2VsZiAqLwotCW5ld19waWQgPSBjbG9uZShvdXRlcl90cmFtcCwgKHZvaWQgKikgc3AsIGNsb25lX2ZsYWdzLCAmYXJnKTsKLQlpZihuZXdfcGlkIDwgMCkKLQkJcmV0dXJuKG5ld19waWQpOwotCi0JQ0FUQ0hfRUlOVFIoZXJyID0gd2FpdHBpZChuZXdfcGlkLCAmc3RhdHVzLCAwKSk7Ci0JaWYoZXJyIDwgMCkKLQkJcGFuaWMoIldhaXRpbmcgZm9yIG91dGVyIHRyYW1wb2xpbmUgZmFpbGVkIC0gZXJybm8gPSAlZCIsCi0JCSAgICAgIGVycm5vKTsKLQotCWlmKCFXSUZTSUdOQUxFRChzdGF0dXMpIHx8IChXVEVSTVNJRyhzdGF0dXMpICE9IFNJR0tJTEwpKQotCQlwYW5pYygib3V0ZXIgdHJhbXBvbGluZSBkaWRuJ3QgZXhpdCB3aXRoIFNJR0tJTEwsICIKLQkJICAgICAgInN0YXR1cyA9ICVkIiwgc3RhdHVzKTsKLQotCXJldHVybihhcmcucGlkKTsKLX0KLQogc3RhdGljIGludCBwdHJhY2VfY2hpbGQodm9pZCAqYXJnKQogewogCWludCByZXQ7CkBAIC0xNjUsNyArNzIsNyBAQAogCXZvaWQgKnN0YWNrOwogCXVuc2lnbmVkIGxvbmcgc3A7CiAJaW50IHBpZCwgbiwgc3RhdHVzOwotCQorCiAJc3RhY2sgPSBtbWFwKE5VTEwsIFBBR0VfU0laRSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKIAkJICAgICBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKIAlpZihzdGFjayA9PSBNQVBfRkFJTEVEKQpAQCAtMTczLDEwICs4MCwxMCBAQAogCXNwID0gKHVuc2lnbmVkIGxvbmcpIHN0YWNrICsgUEFHRV9TSVpFIC0gc2l6ZW9mKHZvaWQgKik7CiAJcGlkID0gY2xvbmUocHRyYWNlX2NoaWxkLCAodm9pZCAqKSBzcCwgU0lHQ0hMRCwgTlVMTCk7CiAJaWYocGlkIDwgMCkKLQkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IGNsb25lIGZhaWxlZCwgZXJybm8gPSAlZCIsIGVycm5vKTsKKwkJcGFuaWMoInN0YXJ0X3B0cmFjZWRfY2hpbGQgOiBjbG9uZSBmYWlsZWQsIGVycm5vID0gJWQiLCBlcnJubyk7CiAJQ0FUQ0hfRUlOVFIobiA9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCBXVU5UUkFDRUQpKTsKIAlpZihuIDwgMCkKLQkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IHdhaXQgZmFpbGVkLCBlcnJubyA9ICVkIiwgZXJybm8pOworCQlwYW5pYygiY2hlY2tfcHRyYWNlIDogY2xvbmUgZmFpbGVkLCBlcnJubyA9ICVkIiwgZXJybm8pOwogCWlmKCFXSUZTVE9QUEVEKHN0YXR1cykgfHwgKFdTVE9QU0lHKHN0YXR1cykgIT0gU0lHU1RPUCkpCiAJCXBhbmljKCJjaGVja19wdHJhY2UgOiBleHBlY3RlZCBTSUdTVE9QLCBnb3Qgc3RhdHVzID0gJWQiLAogCQkgICAgICBzdGF0dXMpOwpAQCAtMTg1LDExICs5MiwxNCBAQAogCXJldHVybihwaWQpOwogfQogCi0vKiBXaGVuIHRlc3RpbmcgZm9yIFNZU0VNVSBzdXBwb3J0LCBpZiBpdCBpcyBvbmUgb2YgdGhlIGJyb2tlbiB2ZXJzaW9ucywgd2UgbXVzdAotICoganVzdCBhdm9pZCB1c2luZyBzeXNlbXUsIG5vdCBwYW5pYywgYnV0IG9ubHkgaWYgU1lTRU1VIGZlYXR1cmVzIGFyZSBicm9rZW4uCisvKiBXaGVuIHRlc3RpbmcgZm9yIFNZU0VNVSBzdXBwb3J0LCBpZiBpdCBpcyBvbmUgb2YgdGhlIGJyb2tlbiB2ZXJzaW9ucywgd2UKKyAqIG11c3QganVzdCBhdm9pZCB1c2luZyBzeXNlbXUsIG5vdCBwYW5pYywgYnV0IG9ubHkgaWYgU1lTRU1VIGZlYXR1cmVzIGFyZQorICogYnJva2VuLgogICogU28gb25seSBmb3IgU1lTRU1VIGZlYXR1cmVzIHdlIHRlc3QgbXVzdHBhbmljLCB3aGlsZSBub3JtYWwgaG9zdCBmZWF0dXJlcwotICogbXVzdCB3b3JrIGFueXdheSEqLwotc3RhdGljIGludCBzdG9wX3B0cmFjZWRfY2hpbGQoaW50IHBpZCwgdm9pZCAqc3RhY2ssIGludCBleGl0Y29kZSwgaW50IG11c3RwYW5pYykKKyAqIG11c3Qgd29yayBhbnl3YXkhCisgKi8KK3N0YXRpYyBpbnQgc3RvcF9wdHJhY2VkX2NoaWxkKGludCBwaWQsIHZvaWQgKnN0YWNrLCBpbnQgZXhpdGNvZGUsCisJCQkgICAgICBpbnQgbXVzdHBhbmljKQogewogCWludCBzdGF0dXMsIG4sIHJldCA9IDA7CiAKQEAgLTIxNyw4ICsxMjcsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZm9yY2Vfc3lzZW11X2Rpc2FibGVkID0gMDsKLQogaW50IHB0cmFjZV9mYXVsdGluZm8gPSAxOwogaW50IHByb2NfbW0gPSAxOwogCkBAIC0yMjgsMjkgKzEzNiwzMiBAQAogCXJldHVybiAwOwogfQogCitfX3VtbF9zZXR1cCgic2thczAiLCBza2FzMF9jbWRfcGFyYW0sCisJCSJza2FzMFxuIgorCQkiICAgIERpc2FibGVzIFNLQVMzIHVzYWdlLCBzbyB0aGF0IFNLQVMwIGlzIHVzZWQsIHVubGVzcyBcbiIKKwkgICAgICAgICIgICAgeW91IHNwZWNpZnkgbW9kZT10dC5cblxuIik7CisKK3N0YXRpYyBpbnQgZm9yY2Vfc3lzZW11X2Rpc2FibGVkID0gMDsKKwogc3RhdGljIGludCBfX2luaXQgbm9zeXNlbXVfY21kX3BhcmFtKGNoYXIgKnN0ciwgaW50KiBhZGQpCiB7CiAJZm9yY2Vfc3lzZW11X2Rpc2FibGVkID0gMTsKIAlyZXR1cm4gMDsKIH0KIAotX191bWxfc2V0dXAoInNrYXMwIiwgc2thczBfY21kX3BhcmFtLAotCQkic2thczBcbiIKLQkJIiAgICBEaXNhYmxlcyBTS0FTMyB1c2FnZSwgc28gdGhhdCBTS0FTMCBpcyB1c2VkLCB1bmxlc3MgeW91IFxuIgotCQkiICAgIHNwZWNpZnkgbW9kZT10dC5cblxuIik7Ci0KIF9fdW1sX3NldHVwKCJub3N5c2VtdSIsIG5vc3lzZW11X2NtZF9wYXJhbSwKLQkJIm5vc3lzZW11XG4iCi0JCSIgICAgVHVybnMgb2ZmIHN5c2NhbGwgZW11bGF0aW9uIHBhdGNoIGZvciBwdHJhY2UgKFNZU0VNVSkgb24uXG4iCi0JCSIgICAgU1lTRU1VIGlzIGEgcGVyZm9ybWFuY2UtcGF0Y2ggaW50cm9kdWNlZCBieSBMYXVyZW50IFZpdmllci4gSXQgY2hhbmdlc1xuIgotCQkiICAgIGJlaGF2aW91ciBvZiBwdHJhY2UoKSBhbmQgaGVscHMgcmVkdWNpbmcgaG9zdCBjb250ZXh0IHN3aXRjaCByYXRlLlxuIgotCQkiICAgIFRvIG1ha2UgaXQgd29ya2luZywgeW91IG5lZWQgYSBrZXJuZWwgcGF0Y2ggZm9yIHlvdXIgaG9zdCwgdG9vLlxuIgotCQkiICAgIFNlZSBodHRwOi8vcGVyc28ud2FuYWRvby5mci9sYXVyZW50LnZpdmllci9VTUwvIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLlxuXG4iKTsKKyJub3N5c2VtdVxuIgorIiAgICBUdXJucyBvZmYgc3lzY2FsbCBlbXVsYXRpb24gcGF0Y2ggZm9yIHB0cmFjZSAoU1lTRU1VKSBvbi5cbiIKKyIgICAgU1lTRU1VIGlzIGEgcGVyZm9ybWFuY2UtcGF0Y2ggaW50cm9kdWNlZCBieSBMYXVyZW50IFZpdmllci4gSXQgY2hhbmdlc1xuIgorIiAgICBiZWhhdmlvdXIgb2YgcHRyYWNlKCkgYW5kIGhlbHBzIHJlZHVjaW5nIGhvc3QgY29udGV4dCBzd2l0Y2ggcmF0ZS5cbiIKKyIgICAgVG8gbWFrZSBpdCB3b3JraW5nLCB5b3UgbmVlZCBhIGtlcm5lbCBwYXRjaCBmb3IgeW91ciBob3N0LCB0b28uXG4iCisiICAgIFNlZSBodHRwOi8vcGVyc28ud2FuYWRvby5mci9sYXVyZW50LnZpdmllci9VTUwvIGZvciBmdXJ0aGVyIFxuIgorIiAgICBpbmZvcm1hdGlvbi5cblxuIik7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjaGVja19zeXNlbXUodm9pZCkKIHsKIAl2b2lkICpzdGFjazsKLQlpbnQgcGlkLCBzeXNjYWxsLCBuLCBzdGF0dXMsIGNvdW50PTA7CisgCWludCBwaWQsIG4sIHN0YXR1cywgY291bnQ9MDsKIAogCXByaW50aygiQ2hlY2tpbmcgc3lzY2FsbCBlbXVsYXRpb24gcGF0Y2ggZm9yIHB0cmFjZS4uLiIpOwogCXN5c2VtdV9zdXBwb3J0ZWQgPSAwOwpAQCAtMjgxLDYgKzE5MiwxMiBAQAogCiAJcHJpbnRrKCJDaGVja2luZyBhZHZhbmNlZCBzeXNjYWxsIGVtdWxhdGlvbiBwYXRjaCBmb3IgcHRyYWNlLi4uIik7CiAJcGlkID0gc3RhcnRfcHRyYWNlZF9jaGlsZCgmc3RhY2spOworCisJaWYocHRyYWNlKFBUUkFDRV9PTERTRVRPUFRJT05TLCBwaWQsIDAsCisJCSAgKHZvaWQgKikgUFRSQUNFX09fVFJBQ0VTWVNHT09EKSA8IDApCisJCXBhbmljKCJjaGVja19wdHJhY2U6IFBUUkFDRV9PTERTRVRPUFRJT05TIGZhaWxlZCwgZXJybm8gPSAlZCIsCisJCSAgICAgIGVycm5vKTsKKwogCXdoaWxlKDEpewogCQljb3VudCsrOwogCQlpZihwdHJhY2UoUFRSQUNFX1NZU0VNVV9TSU5HTEVTVEVQLCBwaWQsIDAsIDApIDwgMCkKQEAgLTI4OCwxNSArMjA1LDEwIEBACiAJCUNBVENIX0VJTlRSKG4gPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgV1VOVFJBQ0VEKSk7CiAJCWlmKG4gPCAwKQogCQkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IHdhaXQgZmFpbGVkLCBlcnJubyA9ICVkIiwgZXJybm8pOwotCQlpZighV0lGU1RPUFBFRChzdGF0dXMpIHx8IChXU1RPUFNJRyhzdGF0dXMpICE9IFNJR1RSQVApKQotCQkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IGV4cGVjdGVkIChTSUdUUkFQfFNZU0NBTExfVFJBUCksICIKLQkJCSAgICAgICJnb3Qgc3RhdHVzID0gJWQiLCBzdGF0dXMpOwotCi0JCXN5c2NhbGwgPSBwdHJhY2UoUFRSQUNFX1BFRUtVU1IsIHBpZCwgUFRfU1lTQ0FMTF9OUl9PRkZTRVQsCi0JCQkJIDApOwotCQlpZihzeXNjYWxsID09IF9fTlJfZ2V0cGlkKXsKKwkJaWYoV0lGU1RPUFBFRChzdGF0dXMpICYmIChXU1RPUFNJRyhzdGF0dXMpID09IChTSUdUUkFQfDB4ODApKSl7CiAJCQlpZiAoIWNvdW50KQotCQkJCXBhbmljKCJjaGVja19wdHJhY2UgOiBTWVNFTVVfU0lOR0xFU1RFUCBkb2Vzbid0IHNpbmdsZXN0ZXAiKTsKKwkJCQlwYW5pYygiY2hlY2tfcHRyYWNlIDogU1lTRU1VX1NJTkdMRVNURVAgIgorCQkJCSAgICAgICJkb2Vzbid0IHNpbmdsZXN0ZXAiKTsKIAkJCW4gPSBwdHJhY2UoUFRSQUNFX1BPS0VVU1IsIHBpZCwgUFRfU1lTQ0FMTF9SRVRfT0ZGU0VULAogCQkJCSAgIG9zX2dldHBpZCgpKTsKIAkJCWlmKG4gPCAwKQpAQCAtMzA0LDYgKzIxNiwxMSBAQAogCQkJCSAgICAgICJjYWxsIHJldHVybiwgZXJybm8gPSAlZCIsIGVycm5vKTsKIAkJCWJyZWFrOwogCQl9CisJCWVsc2UgaWYoV0lGU1RPUFBFRChzdGF0dXMpICYmIChXU1RPUFNJRyhzdGF0dXMpID09IFNJR1RSQVApKQorCQkJY291bnQrKzsKKwkJZWxzZQorCQkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IGV4cGVjdGVkIFNJR1RSQVAgb3IgIgorCQkJICAgICAgIihTSUdUUkFQfDB4ODApLCBnb3Qgc3RhdHVzID0gJWQiLCBzdGF0dXMpOwogCX0KIAlpZiAoc3RvcF9wdHJhY2VkX2NoaWxkKHBpZCwgc3RhY2ssIDAsIDApIDwgMCkKIAkJZ290byBmYWlsX3N0b3BwZWQ7CkBAIC0zMjEsNyArMjM4LDcgQEAKIAlwcmludGsoIm1pc3NpbmdcbiIpOwogfQogCi12b2lkIF9faW5pdCBjaGVja19wdHJhY2Uodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBjaGVja19wdHJhY2Uodm9pZCkKIHsKIAl2b2lkICpzdGFjazsKIAlpbnQgcGlkLCBzeXNjYWxsLCBuLCBzdGF0dXM7CkBAIC0zMjksMjAgKzI0NiwyMCBAQAogCXByaW50aygiQ2hlY2tpbmcgdGhhdCBwdHJhY2UgY2FuIGNoYW5nZSBzeXN0ZW0gY2FsbCBudW1iZXJzLi4uIik7CiAJcGlkID0gc3RhcnRfcHRyYWNlZF9jaGlsZCgmc3RhY2spOwogCi0JaWYgKHB0cmFjZShQVFJBQ0VfT0xEU0VUT1BUSU9OUywgcGlkLCAwLCAodm9pZCAqKVBUUkFDRV9PX1RSQUNFU1lTR09PRCkgPCAwKQotCQlwYW5pYygiY2hlY2tfcHRyYWNlOiBQVFJBQ0VfU0VUT1BUSU9OUyBmYWlsZWQsIGVycm5vID0gJWQiLCBlcnJubyk7CisJaWYocHRyYWNlKFBUUkFDRV9PTERTRVRPUFRJT05TLCBwaWQsIDAsICh2b2lkICopUFRSQUNFX09fVFJBQ0VTWVNHT09EKSA8IDApCisJCXBhbmljKCJjaGVja19wdHJhY2U6IFBUUkFDRV9PTERTRVRPUFRJT05TIGZhaWxlZCwgZXJybm8gPSAlZCIsIGVycm5vKTsKIAogCXdoaWxlKDEpewogCQlpZihwdHJhY2UoUFRSQUNFX1NZU0NBTEwsIHBpZCwgMCwgMCkgPCAwKQotCQkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IHB0cmFjZSBmYWlsZWQsIGVycm5vID0gJWQiLCAKKwkJCXBhbmljKCJjaGVja19wdHJhY2UgOiBwdHJhY2UgZmFpbGVkLCBlcnJubyA9ICVkIiwKIAkJCSAgICAgIGVycm5vKTsKIAkJQ0FUQ0hfRUlOVFIobiA9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCBXVU5UUkFDRUQpKTsKIAkJaWYobiA8IDApCiAJCQlwYW5pYygiY2hlY2tfcHRyYWNlIDogd2FpdCBmYWlsZWQsIGVycm5vID0gJWQiLCBlcnJubyk7Ci0JCWlmKCFXSUZTVE9QUEVEKHN0YXR1cykgfHwgKFdTVE9QU0lHKHN0YXR1cykgIT0gU0lHVFJBUCArIDB4ODApKQotCQkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IGV4cGVjdGVkIFNJR1RSQVAgKyAweDgwLCAiCisJCWlmKCFXSUZTVE9QUEVEKHN0YXR1cykgfHwgKFdTVE9QU0lHKHN0YXR1cykgIT0gKFNJR1RSQVB8MHg4MCkpKQorCQkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IGV4cGVjdGVkIChTSUdUUkFQfDB4ODApLCAiCiAJCQkgICAgICAiZ290IHN0YXR1cyA9ICVkIiwgc3RhdHVzKTsKLQkJCisKIAkJc3lzY2FsbCA9IHB0cmFjZShQVFJBQ0VfUEVFS1VTUiwgcGlkLCBQVF9TWVNDQUxMX05SX09GRlNFVCwKIAkJCQkgMCk7CiAJCWlmKHN5c2NhbGwgPT0gX19OUl9nZXRwaWQpewpAQCAtMzU5LDMzICsyNzYsMzYgQEAKIAljaGVja19zeXNlbXUoKTsKIH0KIAotaW50IHJ1bl9rZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICphcmcsIHZvaWQgKipqbXBfcHRyKQordm9pZCBvc19lYXJseV9jaGVja3Modm9pZCkKIHsKLQlzaWdqbXBfYnVmIGJ1ZjsKLQlpbnQgbjsKLQotCSpqbXBfcHRyID0gJmJ1ZjsKLQluID0gc2lnc2V0am1wKGJ1ZiwgMSk7Ci0JaWYobiAhPSAwKQotCQlyZXR1cm4obik7Ci0JKCpmbikoYXJnKTsKLQlyZXR1cm4oMCk7CisJY2hlY2tfcHRyYWNlKCk7CiB9CiAKLXZvaWQgZm9yd2FyZF9wZW5kaW5nX3NpZ2lvKGludCB0YXJnZXQpCitzdGF0aWMgaW50IF9faW5pdCBub3Byb2NtbV9jbWRfcGFyYW0oY2hhciAqc3RyLCBpbnQqIGFkZCkKIHsKLQlzaWdzZXRfdCBzaWdzOwotCi0JaWYoc2lncGVuZGluZygmc2lncykpIAotCQlwYW5pYygiZm9yd2FyZF9wZW5kaW5nX3NpZ2lvIDogc2lncGVuZGluZyBmYWlsZWQiKTsKLQlpZihzaWdpc21lbWJlcigmc2lncywgU0lHSU8pKQotCQlraWxsKHRhcmdldCwgU0lHSU8pOworCXByb2NfbW0gPSAwOworCXJldHVybiAwOwogfQogCi1leHRlcm4gdm9pZCAqX19zeXNjYWxsX3N0dWJfc3RhcnQsIF9fc3lzY2FsbF9zdHViX2VuZDsKK19fdW1sX3NldHVwKCJub3Byb2NtbSIsIG5vcHJvY21tX2NtZF9wYXJhbSwKKyJub3Byb2NtbVxuIgorIiAgICBUdXJucyBvZmYgdXNhZ2Ugb2YgL3Byb2MvbW0sIGV2ZW4gaWYgaG9zdCBzdXBwb3J0cyBpdC5cbiIKKyIgICAgVG8gc3VwcG9ydCAvcHJvYy9tbSwgdGhlIGhvc3QgbmVlZHMgdG8gYmUgcGF0Y2hlZCB1c2luZ1xuIgorIiAgICB0aGUgY3VycmVudCBza2FzMyBwYXRjaC5cblxuIik7CisKK3N0YXRpYyBpbnQgX19pbml0IG5vcHRyYWNlZmF1bHRpbmZvX2NtZF9wYXJhbShjaGFyICpzdHIsIGludCogYWRkKQoreworCXB0cmFjZV9mYXVsdGluZm8gPSAwOworCXJldHVybiAwOworfQorCitfX3VtbF9zZXR1cCgibm9wdHJhY2VmYXVsdGluZm8iLCBub3B0cmFjZWZhdWx0aW5mb19jbWRfcGFyYW0sCisibm9wdHJhY2VmYXVsdGluZm9cbiIKKyIgICAgVHVybnMgb2ZmIHVzYWdlIG9mIFBUUkFDRV9GQVVMVElORk8sIGV2ZW4gaWYgaG9zdCBzdXBwb3J0c1xuIgorIiAgICBpdC4gVG8gc3VwcG9ydCBQVFJBQ0VfRkFVTFRJTkZPLCB0aGUgaG9zdCBuZWVkcyB0byBiZSBwYXRjaGVkXG4iCisiICAgIHVzaW5nIHRoZSBjdXJyZW50IHNrYXMzIHBhdGNoLlxuXG4iKTsKIAogI2lmZGVmIFVNTF9DT05GSUdfTU9ERV9TS0FTCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19za2FzM19wdHJhY2Vfc3VwcG9ydCh2b2lkKQogewogCXN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvIGZpOwpAQCAtNDAwLDkgKzMyMCw4IEBACiAJCXB0cmFjZV9mYXVsdGluZm8gPSAwOwogCQlpZihlcnJubyA9PSBFSU8pCiAJCQlwcmludGYoIm5vdCBmb3VuZFxuIik7Ci0JCWVsc2UgeworCQllbHNlCiAJCQlwZXJyb3IoIm5vdCBmb3VuZCIpOwotCQl9CiAJfQogCWVsc2UgewogCQlpZiAoIXB0cmFjZV9mYXVsdGluZm8pCkBAIC00MTksOSArMzM4LDEwIEBACiB7CiAJcHJpbnRmKCJDaGVja2luZyBmb3IgL3Byb2MvbW0uLi4iKTsKIAlpZiAob3NfYWNjZXNzKCIvcHJvYy9tbSIsIE9TX0FDQ19XX09LKSA8IDApIHsKLQkJcHJvY19tbSA9IDA7CisgCQlwcm9jX21tID0gMDsKIAkJcHJpbnRmKCJub3QgZm91bmRcbiIpOwotCX0gZWxzZSB7CisJfQorCWVsc2UgewogCQlpZiAoIXByb2NfbW0pCiAJCQlwcmludGYoImZvdW5kIGJ1dCBkaXNhYmxlZCBvbiBjb21tYW5kIGxpbmVcbiIpOwogCQllbHNlCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3R0LmMgYi9hcmNoL3VtL29zLUxpbnV4L3R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwNDdhYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdHQuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSAidXNlcl91dGlsLmgiCisjaW5jbHVkZSAia2Vybl91dGlsLmgiCisjaW5jbHVkZSAidXNlci5oIgorI2luY2x1ZGUgInNpZ25hbF9rZXJuLmgiCisjaW5jbHVkZSAic2lnbmFsX3VzZXIuaCIKKyNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCisjaW5jbHVkZSAic3lzZGVwL3NpZ2NvbnRleHQuaCIKKyNpbmNsdWRlICJpcnFfdXNlci5oIgorI2luY2x1ZGUgInB0cmFjZV91c2VyLmgiCisjaW5jbHVkZSAidGltZV91c2VyLmgiCisjaW5jbHVkZSAiaW5pdC5oIgorI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidW1sLWNvbmZpZy5oIgorI2luY2x1ZGUgImNob29zZS1tb2RlLmgiCisjaW5jbHVkZSAibW9kZS5oIgorI2luY2x1ZGUgInRlbXBmaWxlLmgiCisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9ubHkgZm9yIHR0IG1vZGUgKHdpbGwgYmUgZGVsZXRlZCBpbiBmdXR1cmUuLi4pCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdHJ1Y3QgdHJhbXAgeworCWludCAoKnRyYW1wKSh2b2lkICopOworCXZvaWQgKnRyYW1wX2RhdGE7CisJdW5zaWduZWQgbG9uZyB0ZW1wX3N0YWNrOworCWludCBmbGFnczsKKwlpbnQgcGlkOworfTsKKworLyogU2VlIGFib3ZlIGZvciB3aHkgc2lna2lsbCBpcyBoZXJlICovCisKK2ludCBzaWdraWxsID0gU0lHS0lMTDsKKworaW50IG91dGVyX3RyYW1wKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdHJhbXAgKnQ7CisJaW50IHNpZyA9IHNpZ2tpbGw7CisKKwl0ID0gYXJnOworCXQtPnBpZCA9IGNsb25lKHQtPnRyYW1wLCAodm9pZCAqKSB0LT50ZW1wX3N0YWNrICsgcGFnZV9zaXplKCkvMiwKKwkJICAgICAgIHQtPmZsYWdzLCB0LT50cmFtcF9kYXRhKTsKKwlpZih0LT5waWQgPiAwKSB3YWl0X2Zvcl9zdG9wKHQtPnBpZCwgU0lHU1RPUCwgUFRSQUNFX0NPTlQsIE5VTEwpOworCWtpbGwob3NfZ2V0cGlkKCksIHNpZyk7CisJX2V4aXQoMCk7Cit9CisKK2ludCBzdGFydF9mb3JrX3RyYW1wKHZvaWQgKnRocmVhZF9hcmcsIHVuc2lnbmVkIGxvbmcgdGVtcF9zdGFjaywKKwkJICAgICBpbnQgY2xvbmVfZmxhZ3MsIGludCAoKnRyYW1wKSh2b2lkICopKQoreworCXN0cnVjdCB0cmFtcCBhcmc7CisJdW5zaWduZWQgbG9uZyBzcDsKKwlpbnQgbmV3X3BpZCwgc3RhdHVzLCBlcnI7CisKKwkvKiBUaGUgdHJhbXBvbGluZSB3aWxsIHJ1biBvbiB0aGUgdGVtcG9yYXJ5IHN0YWNrICovCisJc3AgPSBzdGFja19zcCh0ZW1wX3N0YWNrKTsKKworCWNsb25lX2ZsYWdzIHw9IENMT05FX0ZJTEVTIHwgU0lHQ0hMRDsKKworCWFyZy50cmFtcCA9IHRyYW1wOworCWFyZy50cmFtcF9kYXRhID0gdGhyZWFkX2FyZzsKKwlhcmcudGVtcF9zdGFjayA9IHRlbXBfc3RhY2s7CisJYXJnLmZsYWdzID0gY2xvbmVfZmxhZ3M7CisKKwkvKiBTdGFydCB0aGUgcHJvY2VzcyBhbmQgd2FpdCBmb3IgaXQgdG8ga2lsbCBpdHNlbGYgKi8KKwluZXdfcGlkID0gY2xvbmUob3V0ZXJfdHJhbXAsICh2b2lkICopIHNwLCBjbG9uZV9mbGFncywgJmFyZyk7CisJaWYobmV3X3BpZCA8IDApCisJCXJldHVybihuZXdfcGlkKTsKKworCUNBVENIX0VJTlRSKGVyciA9IHdhaXRwaWQobmV3X3BpZCwgJnN0YXR1cywgMCkpOworCWlmKGVyciA8IDApCisJCXBhbmljKCJXYWl0aW5nIGZvciBvdXRlciB0cmFtcG9saW5lIGZhaWxlZCAtIGVycm5vID0gJWQiLAorCQkgICAgICBlcnJubyk7CisKKwlpZighV0lGU0lHTkFMRUQoc3RhdHVzKSB8fCAoV1RFUk1TSUcoc3RhdHVzKSAhPSBTSUdLSUxMKSkKKwkJcGFuaWMoIm91dGVyIHRyYW1wb2xpbmUgZGlkbid0IGV4aXQgd2l0aCBTSUdLSUxMLCAiCisJCSAgICAgICJzdGF0dXMgPSAlZCIsIHN0YXR1cyk7CisKKwlyZXR1cm4oYXJnLnBpZCk7Cit9CisKK3ZvaWQgZm9yd2FyZF9wZW5kaW5nX3NpZ2lvKGludCB0YXJnZXQpCit7CisJc2lnc2V0X3Qgc2lnczsKKworCWlmKHNpZ3BlbmRpbmcoJnNpZ3MpKQorCQlwYW5pYygiZm9yd2FyZF9wZW5kaW5nX3NpZ2lvIDogc2lncGVuZGluZyBmYWlsZWQiKTsKKwlpZihzaWdpc21lbWJlcigmc2lncywgU0lHSU8pKQorCQlraWxsKHRhcmdldCwgU0lHSU8pOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMgYi9hcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKaW5kZXggMTdmMzA1Yi4uNTlhMTI5MSAxMDA2NDQKLS0tIGEvYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCisrKyBiL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwpAQCAtOSw2ICs5LDExIEBACiAKICQoVVNFUl9PQkpTKSA6IGNfZmxhZ3MgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChVU0VSX0NGTEFHUykgXAogCSQoQ0ZMQUdTXyQobm90ZGlyICRAKSkKKyQoVVNFUl9PQkpTKTogY21kX2NoZWNrc3JjID0KKyQoVVNFUl9PQkpTKTogcXVpZXRfY21kX2NoZWNrc3JjID0KKyQoVVNFUl9PQkpTKTogY21kX2ZvcmNlX2NoZWNrc3JjID0KKyQoVVNFUl9PQkpTKTogcXVpZXRfY21kX2ZvcmNlX2NoZWNrc3JjID0KKwogCiAjIFRoZSBzdHVicyBhbmQgdW5tYXAubyBjYW4ndCB0cnkgdG8gY2FsbCBtY291bnQgb3IgdXBkYXRlIGJhc2ljIGJsb2NrIGRhdGEKIGRlZmluZSB1bnByb2ZpbGUKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS51bm1hcCBiL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS51bm1hcAppbmRleCA4MDJkMDI3Li5iMjE2NTE4IDEwMDY0NAotLS0gYS9hcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUudW5tYXAKKysrIGIvYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnVubWFwCkBAIC0xMiw3ICsxMiw3IEBACiAKIHF1aWV0X2NtZF93cmFwbGQgPSBMRCAgICAgICRACiBkZWZpbmUgY21kX3dyYXBsZAotCSQoTEQpICQoTERGTEFHUykgLXIgLW8gJChvYmopL3VubWFwX3RtcC5vICQ8ICQoc2hlbGwgJChDQykgJChDRkxBR1MpIC1wcmludC1maWxlLW5hbWU9bGliYy5hKTsgXAorCSQoTEQpICQoTERGTEFHUykgLXIgLW8gJChvYmopL3VubWFwX3RtcC5vICQ8IDsgXAogCSQoT0JKQ09QWSkgJChVTUxfT0JKQ09QWUZMQUdTKSAkKG9iaikvdW5tYXBfdG1wLm8gJEAgLUcgc3dpdGNoZXJvbwogZW5kZWYKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9NYWtlZmlsZSBiL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUKaW5kZXggNzdjM2M0ZC4uNGNhMmEyMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9NYWtlZmlsZQorKysgYi9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlCkBAIC0xNiwxMyArMTYsNyBAQAogaGlnaG1lbS5jLWRpciA9IG1tCiBtb2R1bGUuYy1kaXIgPSBrZXJuZWwKIAotU1RVQl9DRkxBR1MgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChjYWxsIHVucHJvZmlsZSwkKFVTRVJfQ0ZMQUdTKSkKLQotIyBfY2ZsYWdzIHdvcmtzIHdpdGgga2VybmVsIGZpbGVzLCBub3Qgd2l0aCB1c2Vyc3BhY2Ugb25lcywgYnV0IGNfZmxhZ3MgZG9lcywKLSMgd2h5IGFzayB3aHk/Ci0kKG9iaikvc3R1Yl9zZWd2Lm8gOiBjX2ZsYWdzID0gJChTVFVCX0NGTEFHUykKLQotJChvYmopL3N0dWIubyA6IGFfZmxhZ3MgPSAkKFNUVUJfQ0ZMQUdTKQorJChvYmopL3N0dWJfc2Vndi5vIDogX2NfZmxhZ3MgPSAkKGNhbGwgdW5wcm9maWxlLCQoQ0ZMQUdTKSkKIAogc3ViZGlyLSA6PSB1dGlsCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYva2VybmVsLW9mZnNldHMuYyBiL2FyY2gvdW0vc3lzLWkzODYva2VybmVsLW9mZnNldHMuYwppbmRleCA5ZjhlY2QxLi5hMTA3MGFmIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L2tlcm5lbC1vZmZzZXRzLmMKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9rZXJuZWwtb2Zmc2V0cy5jCkBAIC0yLDYgKzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKICNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NpZ25hbC5jIGIvYXJjaC91bS9zeXMtaTM4Ni9zaWduYWwuYwppbmRleCA0ZWZjNjlhLi4xNmJjMTk5MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9zaWduYWwuYworKysgYi9hcmNoL3VtL3N5cy1pMzg2L3NpZ25hbC5jCkBAIC0xMjIsOSArMTIyLDkgQEAKIAlpbnQgZXJyOwogCiAJdG9fZnAgPSB0by0+ZnBzdGF0ZTsKLQlmcm9tX2ZwID0gZnJvbS0+ZnBzdGF0ZTsKIAlzaWdzID0gdG8tPm9sZG1hc2s7CiAJZXJyID0gY29weV9mcm9tX3VzZXIodG8sIGZyb20sIHNpemVvZigqdG8pKTsKKwlmcm9tX2ZwID0gdG8tPmZwc3RhdGU7CiAJdG8tPm9sZG1hc2sgPSBzaWdzOwogCXRvLT5mcHN0YXRlID0gdG9fZnA7CiAJaWYodG9fZnAgIT0gTlVMTCkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc3R1Yi5TIGIvYXJjaC91bS9zeXMtaTM4Ni9zdHViLlMKaW5kZXggMmYyYzcwYS4uNmE3MGQ5YSAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9zdHViLlMKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9zdHViLlMKQEAgLTIsNyArMiw1MCBAQAogCiAJLmdsb2JsIHN5c2NhbGxfc3R1YgogLnNlY3Rpb24gLl9fc3lzY2FsbF9zdHViLCAieCIKLXN5c2NhbGxfc3R1YjoKLQlpbnQgCSQweDgwCisKKwkuZ2xvYmwgYmF0Y2hfc3lzY2FsbF9zdHViCitiYXRjaF9zeXNjYWxsX3N0dWI6CisJLyogbG9hZCBwb2ludGVyIHRvIGZpcnN0IG9wZXJhdGlvbiAqLworCW1vdgkkKFVNTF9DT05GSUdfU1RVQl9EQVRBKzgpLCAlZXNwCisKK2FnYWluOgorCS8qIGxvYWQgbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSAqLworCW1vdgkweDAoJWVzcCksICVlYXgKKworCS8qIGlmKGxlbmd0aCA9PSAwKSA6IGVuZCBvZiBsaXN0ICovCisJLyogd3JpdGUgcG9zc2libGUgMCB0byBoZWFkZXIgKi8KKwltb3YJJWVheCwgVU1MX0NPTkZJR19TVFVCX0RBVEErNAorCWNtcGwJJDAsICVlYXgKKwlqeglkb25lCisKKwkvKiBzYXZlIGN1cnJlbnQgcG9pbnRlciAqLworCW1vdgklZXNwLCBVTUxfQ09ORklHX1NUVUJfREFUQSs0CisKKwkvKiBza2lwIGFkZGl0aW9uYWwgZGF0YSAqLworCWFkZAklZWF4LCAlZXNwCisKKwkvKiBsb2FkIHN5c2NhbGwtIyAqLworCXBvcAklZWF4CisKKwkvKiBsb2FkIHN5c2NhbGwgcGFyYW1zICovCisJcG9wCSVlYngKKwlwb3AJJWVjeAorCXBvcAklZWR4CisJcG9wCSVlc2kKKyAJcG9wCSVlZGkKKwlwb3AJJWVicAorCisJLyogZXhlY3V0ZSBzeXNjYWxsICovCisJaW50CSQweDgwCisKKwkvKiBjaGVjayByZXR1cm4gdmFsdWUgKi8KKwlwb3AJJWVieAorCWNtcAklZWJ4LCAlZWF4CisJamUJYWdhaW4KKworZG9uZToKKwkvKiBzYXZlIHJldHVybiB2YWx1ZSAqLwogCW1vdgklZWF4LCBVTUxfQ09ORklHX1NUVUJfREFUQQorCisJLyogc3RvcCAqLwogCWludDMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc3R1Yl9zZWd2LmMgYi9hcmNoL3VtL3N5cy1pMzg2L3N0dWJfc2Vndi5jCmluZGV4IDY4YWVhYmUuLjFlODhiMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc3R1Yl9zZWd2LmMKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9zdHViX3NlZ3YuYwpAQCAtMyw4ICszLDcgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8YXNtL3NpZ2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgInVtbC1jb25maWcuaCIKICNpbmNsdWRlICJzeXNkZXAvc2lnY29udGV4dC5oIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L01ha2VmaWxlIGIvYXJjaC91bS9zeXMteDg2XzY0L01ha2VmaWxlCmluZGV4IDc0ODgyMDYuLmYwYWI1NzRkIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L01ha2VmaWxlCkBAIC02LDcgKzYsNyBAQAogCiAjWFhYOiB3aHkgaW50byBsaWIteT8KIGxpYi15ID0gYml0b3BzLm8gYnVncy5vIGNzdW0tcGFydGlhbC5vIGRlbGF5Lm8gZmF1bHQubyBtZW0ubyBtZW1jcHkubyBcCi0JcHRyYWNlLm8gcHRyYWNlX3VzZXIubyBzZW1hcGhvcmUubyBzaWdjb250ZXh0Lm8gc2lnbmFsLm8gc3R1Yi5vIFwKKwlwdHJhY2UubyBwdHJhY2VfdXNlci5vIHNpZ2NvbnRleHQubyBzaWduYWwubyBzdHViLm8gXAogCXN0dWJfc2Vndi5vIHN5c2NhbGxzLm8gc3lzY2FsbF90YWJsZS5vIHN5c3JxLm8gdGh1bmsubwogCiBvYmoteSA6PSBrc3ltcy5vCkBAIC0xNSw3ICsxNSw3IEBACiBVU0VSX09CSlMgOj0gcHRyYWNlX3VzZXIubyBzaWdjb250ZXh0Lm8KIAogU1lNTElOS1MgPSBiaXRvcHMuYyBjc3VtLWNvcHkuUyBjc3VtLXBhcnRpYWwuYyBjc3VtLXdyYXBwZXJzLmMgbWVtY3B5LlMgXAotCXNlbWFwaG9yZS5jIHRodW5rLlMgbW9kdWxlLmMKKwl0aHVuay5TIG1vZHVsZS5jCiAKIGluY2x1ZGUgYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCiAKQEAgLTI0LDE3ICsyNCwxMCBAQAogY3N1bS1wYXJ0aWFsLmMtZGlyID0gbGliCiBjc3VtLXdyYXBwZXJzLmMtZGlyID0gbGliCiBtZW1jcHkuUy1kaXIgPSBsaWIKLXNlbWFwaG9yZS5jLWRpciA9IGtlcm5lbAogdGh1bmsuUy1kaXIgPSBsaWIKIG1vZHVsZS5jLWRpciA9IGtlcm5lbAogCi1TVFVCX0NGTEFHUyA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKGNhbGwgdW5wcm9maWxlLCQoVVNFUl9DRkxBR1MpKQotCi0jIF9jZmxhZ3Mgd29ya3Mgd2l0aCBrZXJuZWwgZmlsZXMsIG5vdCB3aXRoIHVzZXJzcGFjZSBvbmVzLCBidXQgY19mbGFncyBkb2VzLAotIyB3aHkgYXNrIHdoeT8KLSQob2JqKS9zdHViX3NlZ3YubyA6IGNfZmxhZ3MgPSAkKFNUVUJfQ0ZMQUdTKQotCi0kKG9iaikvc3R1Yi5vIDogYV9mbGFncyA9ICQoU1RVQl9DRkxBR1MpCiskKG9iaikvc3R1Yl9zZWd2Lm86IF9jX2ZsYWdzID0gJChjYWxsIHVucHJvZmlsZSwkKENGTEFHUykpCiAKIHN1YmRpci0gOj0gdXRpbAogCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQva2VybmVsLW9mZnNldHMuYyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9rZXJuZWwtb2Zmc2V0cy5jCmluZGV4IDIyMGU4NzUuLjk5ODU0MWUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9rZXJuZWwtb2Zmc2V0cy5jCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9rZXJuZWwtb2Zmc2V0cy5jCkBAIC0yLDYgKzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKICNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2lnbmFsLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc2lnbmFsLmMKaW5kZXggOGZkYWVkMC4uZmUxZDA2NSAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3NpZ25hbC5jCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaWduYWwuYwpAQCAtMTA0LDI4ICsxMDQsMzUgQEAKIGludCBjb3B5X3NjX2Zyb21fdXNlcl90dChzdHJ1Y3Qgc2lnY29udGV4dCAqdG8sIHN0cnVjdCBzaWdjb250ZXh0ICpmcm9tLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZwc2l6ZSkKIHsKLSAgICAgICBzdHJ1Y3QgX2Zwc3RhdGUgKnRvX2ZwLCAqZnJvbV9mcDsKLSAgICAgICB1bnNpZ25lZCBsb25nIHNpZ3M7Ci0gICAgICAgaW50IGVycjsKKwlzdHJ1Y3QgX2Zwc3RhdGUgKnRvX2ZwLCAqZnJvbV9mcDsKKwl1bnNpZ25lZCBsb25nIHNpZ3M7CisJaW50IGVycjsKIAotICAgICAgIHRvX2ZwID0gdG8tPmZwc3RhdGU7Ci0gICAgICAgZnJvbV9mcCA9IGZyb20tPmZwc3RhdGU7Ci0gICAgICAgc2lncyA9IHRvLT5vbGRtYXNrOwotICAgICAgIGVyciA9IGNvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBzaXplb2YoKnRvKSk7Ci0gICAgICAgdG8tPm9sZG1hc2sgPSBzaWdzOwotICAgICAgIHJldHVybihlcnIpOworCXRvX2ZwID0gdG8tPmZwc3RhdGU7CisJc2lncyA9IHRvLT5vbGRtYXNrOworCWVyciA9IGNvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBzaXplb2YoKnRvKSk7CisJZnJvbV9mcCA9IHRvLT5mcHN0YXRlOworCXRvLT5mcHN0YXRlID0gdG9fZnA7CisJdG8tPm9sZG1hc2sgPSBzaWdzOworCWlmKHRvX2ZwICE9IE5VTEwpCisJCWVyciB8PSBjb3B5X2Zyb21fdXNlcih0b19mcCwgZnJvbV9mcCwgZnBzaXplKTsKKwlyZXR1cm4oZXJyKTsKIH0KIAogaW50IGNvcHlfc2NfdG9fdXNlcl90dChzdHJ1Y3Qgc2lnY29udGV4dCAqdG8sIHN0cnVjdCBfZnBzdGF0ZSAqZnAsCiAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNpZ2NvbnRleHQgKmZyb20sIGludCBmcHNpemUpCiB7Ci0gICAgICAgc3RydWN0IF9mcHN0YXRlICp0b19mcCwgKmZyb21fZnA7Ci0gICAgICAgaW50IGVycjsKKwlzdHJ1Y3QgX2Zwc3RhdGUgKnRvX2ZwLCAqZnJvbV9mcDsKKwlpbnQgZXJyOwogCi0gICAgICAgdG9fZnAgPSAoZnAgPyBmcCA6IChzdHJ1Y3QgX2Zwc3RhdGUgKikgKHRvICsgMSkpOwotICAgICAgIGZyb21fZnAgPSBmcm9tLT5mcHN0YXRlOwotICAgICAgIGVyciA9IGNvcHlfdG9fdXNlcih0bywgZnJvbSwgc2l6ZW9mKCp0bykpOwotICAgICAgIHJldHVybihlcnIpOworCXRvX2ZwID0gKGZwID8gZnAgOiAoc3RydWN0IF9mcHN0YXRlICopICh0byArIDEpKTsKKwlmcm9tX2ZwID0gZnJvbS0+ZnBzdGF0ZTsKKwllcnIgPSBjb3B5X3RvX3VzZXIodG8sIGZyb20sIHNpemVvZigqdG8pKTsKKwlpZihmcm9tX2ZwICE9IE5VTEwpeworCQllcnIgfD0gY29weV90b191c2VyKCZ0by0+ZnBzdGF0ZSwgJnRvX2ZwLCBzaXplb2YodG8tPmZwc3RhdGUpKTsKKwkJZXJyIHw9IGNvcHlfdG9fdXNlcih0b19mcCwgZnJvbV9mcCwgZnBzaXplKTsKKwl9CisJcmV0dXJuKGVycik7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3N0dWIuUyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zdHViLlMKaW5kZXggMzFjMTQ5Mi4uMDNjMjc5NyAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3N0dWIuUworKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yi5TCkBAIC0xMywzICsxMyw1NCBAQAogCW9yCSVyY3gsICVyYngKIAltb3ZxCSVyYXgsICglcmJ4KQogCWludDMKKworCS5nbG9ibCBiYXRjaF9zeXNjYWxsX3N0dWIKK2JhdGNoX3N5c2NhbGxfc3R1YjoKKwltb3YJJChVTUxfQ09ORklHX1NUVUJfREFUQSA+PiAzMiksICVyYngKKwlzYWwJJDMyLCAlcmJ4CisJbW92CSQoVU1MX0NPTkZJR19TVFVCX0RBVEEgJiAweGZmZmZmZmZmKSwgJXJheAorCW9yCSVyYXgsICVyYngKKwkvKiBsb2FkIHBvaW50ZXIgdG8gZmlyc3Qgb3BlcmF0aW9uICovCisJbW92CSVyYngsICVyc3AKKwlhZGQJJDB4MTAsICVyc3AKK2FnYWluOgorCS8qIGxvYWQgbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSAqLworCW1vdgkweDAoJXJzcCksICVyYXgKKworCS8qIGlmKGxlbmd0aCA9PSAwKSA6IGVuZCBvZiBsaXN0ICovCisJLyogd3JpdGUgcG9zc2libGUgMCB0byBoZWFkZXIgKi8KKwltb3YJJXJheCwgOCglcmJ4KQorCWNtcAkkMCwgJXJheAorCWp6CWRvbmUKKworCS8qIHNhdmUgY3VycmVudCBwb2ludGVyICovCisJbW92CSVyc3AsIDgoJXJieCkKKworCS8qIHNraXAgYWRkaXRpb25hbCBkYXRhICovCisJYWRkCSVyYXgsICVyc3AKKworCS8qIGxvYWQgc3lzY2FsbC0jICovCisJcG9wCSVyYXgKKworCS8qIGxvYWQgc3lzY2FsbCBwYXJhbXMgKi8KKwlwb3AJJXJkaQorCXBvcAklcnNpCisJcG9wCSVyZHgKKwlwb3AJJXIxMAorIAlwb3AJJXI4CisJcG9wCSVyOQorCisJLyogZXhlY3V0ZSBzeXNjYWxsICovCisJc3lzY2FsbAorCisJLyogY2hlY2sgcmV0dXJuIHZhbHVlICovCisJcG9wCSVyY3gKKwljbXAJJXJjeCwgJXJheAorCWplCWFnYWluCisKK2RvbmU6CisJLyogc2F2ZSByZXR1cm4gdmFsdWUgKi8KKwltb3YJJXJheCwgKCVyYngpCisKKwkvKiBzdG9wICovCisJaW50MwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3N0dWJfc2Vndi5jIGIvYXJjaC91bS9zeXMteDg2XzY0L3N0dWJfc2Vndi5jCmluZGV4IDE2MWQxZmUuLjY1YTEzMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zdHViX3NlZ3YuYworKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yl9zZWd2LmMKQEAgLTMsOSArMywxMCBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CiAjaW5jbHVkZSAidW1sLWNvbmZpZy5oIgogI2luY2x1ZGUgInN5c2RlcC9zaWdjb250ZXh0LmgiCiAjaW5jbHVkZSAic3lzZGVwL2ZhdWx0aW5mby5oIgpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL01ha2VmaWxlIGIvYXJjaC92ODUwL01ha2VmaWxlCmluZGV4IGJmMzhjYTAuLjhiZTlhYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9NYWtlZmlsZQorKysgYi9hcmNoL3Y4NTAvTWFrZWZpbGUKQEAgLTUxLDE2ICs1MSw0IEBACiAJJChPQkpDT1BZKSAkKE9CSkNPUFlfRkxBR1NfQkxPQikgLS1yZW5hbWUtc2VjdGlvbiAuZGF0YT0ucm9vdCxhbGxvYyxsb2FkLHJlYWRvbmx5LGRhdGEsY29udGVudHMgJDwgcm9vdF9mc19pbWFnZS5vCiBlbmRpZgogCi0KLXByZXBhcmU6IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtLWNvbnN0cy5oCi0KLSMgR2VuZXJhdGUgY29uc3RhbnRzIGZyb20gQyBjb2RlIGZvciB1c2UgYnkgYXNtIGZpbGVzCi1hcmNoLyQoQVJDSCkva2VybmVsL2FzbS1jb25zdHMuczogaW5jbHVkZS9hc20gaW5jbHVkZS9saW51eC92ZXJzaW9uLmggXAotCQkJCSAgIGluY2x1ZGUvY29uZmlnL01BUktFUgotCi1pbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbS1jb25zdHMuaDogYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tY29uc3RzLnMKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCi0KLUNMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtLWNvbnN0cy5oIFwKLQkgICAgICAgYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tY29uc3RzLnMgXAotCSAgICAgICByb290X2ZzX2ltYWdlLm8KK0NMRUFOX0ZJTEVTICs9IHJvb3RfZnNfaW1hZ2UubwpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2NvbmZpZ3MvcnRlLW1hMS1jYl9kZWZjb25maWcgYi9hcmNoL3Y4NTAvY29uZmlncy9ydGUtbWExLWNiX2RlZmNvbmZpZwppbmRleCAxYjVjYTNjLi4xYTViZWRhIDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAvY29uZmlncy9ydGUtbWExLWNiX2RlZmNvbmZpZworKysgYi9hcmNoL3Y4NTAvY29uZmlncy9ydGUtbWExLWNiX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi11YzAKLSMgVGh1IEp1bCAyMSAxMTowODoyNyAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTMtdWMwCisjIEZyaSBTZXAgIDIgMTM6NTQ6MjcgMjAwNQogIwogIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJRDE2IGlzIG5vdCBzZXQKQEAgLTQ0LDYgKzQ0LDggQEAKICMgQ09ORklHX1Y4NTBFX0hJR0hSRVNfVElNRVIgaXMgbm90IHNldAogIyBDT05GSUdfUkVTRVRfR1VBUkQgaXMgbm90IHNldAogQ09ORklHX0xBUkdFX0FMTE9DUz15CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtMTExLDYgKzExMyw1MiBAQAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKworIwogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfU1RBTkRBTE9ORT15CkBAIC0xNTgsNiArMjA2LDcgQEAKICMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcwogIwogIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAogCiAjCiAjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycwpAQCAtMjMyLDYgKzI4MSw3IEBACiAjCiAjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKICMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CiAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydApAQCAtMjQ0LDUzICsyOTQsOCBAQAogIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKIAogIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi0jIENPTkZJR19QQUNLRVQgaXMgbm90IHNldAotIyBDT05GSUdfVU5JWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAotIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldApAQCAtMzcyLDYgKzM3Nyw4IEBACiAjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CiAKICMKICMgSVNETiBzdWJzeXN0ZW0KQEAgLTQ3Miw2ICs0NzksNyBAQAogIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogCiAjCiAjIFhGUyBzdXBwb3J0CkBAIC00NzksNiArNDg3LDggQEAKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfUk9NRlNfRlM9eQorIyBDT05GSUdfTUFHSUNfUk9NX1BUUiBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldApAQCAtNTI0LDkgKzUzNCwxMSBAQAogIwogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQogIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NJRlMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2NvbmZpZ3MvcnRlLW1lMi1jYl9kZWZjb25maWcgYi9hcmNoL3Y4NTAvY29uZmlncy9ydGUtbWUyLWNiX2RlZmNvbmZpZwppbmRleCA0NGJlY2MwLi4xNWU2NjY0IDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAvY29uZmlncy9ydGUtbWUyLWNiX2RlZmNvbmZpZworKysgYi9hcmNoL3Y4NTAvY29uZmlncy9ydGUtbWUyLWNiX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi11YzAKLSMgVGh1IEp1bCAyMSAxMTozMDowOCAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTMtdWMwCisjIEZyaSBTZXAgIDIgMTM6NDc6NTAgMjAwNQogIwogIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJRDE2IGlzIG5vdCBzZXQKQEAgLTQxLDYgKzQxLDggQEAKICMgQ09ORklHX1Y4NTBFX0hJR0hSRVNfVElNRVIgaXMgbm90IHNldAogIyBDT05GSUdfUkVTRVRfR1VBUkQgaXMgbm90IHNldAogQ09ORklHX0xBUkdFX0FMTE9DUz15CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtNTYsNyArNTgsNiBAQAogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNDVEwgaXMgbm90IHNldAotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfRU1CRURERUQ9eQpAQCAtMTA0LDYgKzEwNSwxMSBAQAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCisjIE5ldHdvcmtpbmcKKyMKKyMgQ09ORklHX05FVCBpcyBub3Qgc2V0CisKKyMKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1NUQU5EQUxPTkU9eQpAQCAtMTUxLDYgKzE1Nyw3IEBACiAjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKICMKICMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIAogIwogIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKQEAgLTIxOCw2ICsyMjUsNyBAQAogIwogIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CiAjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAogCiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKQEAgLTIyOCw5ICsyMzYsOCBAQAogIwogCiAjCi0jIE5ldHdvcmtpbmcgc3VwcG9ydAorIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CiAjCi0jIENPTkZJR19ORVQgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKIApAQCAtMzExLDcgKzMxOCw2IEBACiAjCiAjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgogIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCkBAIC0zMzUsNiArMzQxLDcgQEAKICMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKIAogIwogIyBYRlMgc3VwcG9ydApAQCAtMzQyLDYgKzM0OSw4IEBACiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogQ09ORklHX1JPTUZTX0ZTPXkKKyMgQ09ORklHX01BR0lDX1JPTV9QVFIgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAogQ09ORklHX0ROT1RJRlk9eQogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9jb25maWdzL3NpbV9kZWZjb25maWcgYi9hcmNoL3Y4NTAvY29uZmlncy9zaW1fZGVmY29uZmlnCmluZGV4IGQ3M2Y1ZjkuLmYzMWJhNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9jb25maWdzL3NpbV9kZWZjb25maWcKKysrIGIvYXJjaC92ODUwL2NvbmZpZ3Mvc2ltX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi11YzAKLSMgVGh1IEp1bCAyMSAxMToyOToyNyAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTMtdWMwCisjIEZyaSBTZXAgIDIgMTM6MzY6NDMgMjAwNQogIwogIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJRDE2IGlzIG5vdCBzZXQKQEAgLTM2LDYgKzM2LDggQEAKIENPTkZJR19aRVJPX0JTUz15CiAjIENPTkZJR19SRVNFVF9HVUFSRCBpcyBub3Qgc2V0CiBDT05GSUdfTEFSR0VfQUxMT0NTPXkKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC01MSw3ICs1Myw2IEBACiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU0NUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19FTUJFRERFRD15CkBAIC05OSw2ICsxMDAsMTEgQEAKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIworIyBOZXR3b3JraW5nCisjCisjIENPTkZJR19ORVQgaXMgbm90IHNldAorCisjCiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKIENPTkZJR19TVEFOREFMT05FPXkKQEAgLTE0Niw2ICsxNTIsNyBAQAogIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCiAjCiAjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKICMKICMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCkBAIC0yMTMsNiArMjIwLDcgQEAKICMKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKIAogIwogIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CkBAIC0yMjMsOSArMjMxLDggQEAKICMKIAogIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwotIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CiAKQEAgLTMwMCw3ICszMDcsNiBAQAogIwogIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKICMKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIwpAQCAtMzI0LDYgKzMzMCw3IEBACiAjIENPTkZJR19KQkQgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAKICMKICMgWEZTIHN1cHBvcnQKQEAgLTMzMSw2ICszMzgsOCBAQAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ST01GU19GUz15CisjIENPTkZJR19NQUdJQ19ST01fUFRSIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKICMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKIENPTkZJR19ETk9USUZZPXkKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL2FzbS1jb25zdHMuYyBiL2FyY2gvdjg1MC9rZXJuZWwvYXNtLW9mZnNldHMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC92ODUwL2tlcm5lbC9hc20tY29uc3RzLmMKcmVuYW1lIHRvIGFyY2gvdjg1MC9rZXJuZWwvYXNtLW9mZnNldHMuYwpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC92ODUwL2tlcm5lbC9lbnRyeS5TCmluZGV4IDg5NWUyN2IuLmQ5OTFlNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3Y4NTAva2VybmVsL2VudHJ5LlMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKLSNpbmNsdWRlIDxhc20vYXNtLWNvbnN0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAKIC8qIE1ha2UgYSBzbGlnaHRseSBtb3JlIGNvbnZlbmllbnQgYWxpYXMgZm9yIENfU1lNQk9MX05BTUUuICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC9pcnEuYyBiL2FyY2gvdjg1MC9rZXJuZWwvaXJxLmMKaW5kZXggMzM2Y2JmMi4uOWU4NTk2OSAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3Y4NTAva2VybmVsL2lycS5jCkBAIC02NywxMyArNjcsMTMgQEAKICNkZWZpbmUgZW5kX25vbmUJZW5hYmxlX25vbmUKIAogc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG5vX2lycV90eXBlID0gewotCSJub25lIiwKLQlzdGFydHVwX25vbmUsCi0Jc2h1dGRvd25fbm9uZSwKLQllbmFibGVfbm9uZSwKLQlkaXNhYmxlX25vbmUsCi0JYWNrX25vbmUsCi0JZW5kX25vbmUKKwkudHlwZW5hbWUgPSAibm9uZSIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX25vbmUsCisJLnNodXRkb3duID0gc2h1dGRvd25fbm9uZSwKKwkuZW5hYmxlID0gZW5hYmxlX25vbmUsCisJLmRpc2FibGUgPSBkaXNhYmxlX25vbmUsCisJLmFjayA9IGFja19ub25lLAorCS5lbmQgPSBlbmRfbm9uZQogfTsKIAogdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpcnFfZXJyX2NvdW50LCBzcHVyaW91c19jb3VudDsKZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvdjg1MC9rZXJuZWwvc2V0dXAuYwppbmRleCBjNDFkNzJiLi42MmJkYjhkIDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC92ODUwL2tlcm5lbC9zZXR1cC5jCkBAIC0xLDggKzEsOCBAQAogLyoKICAqIGFyY2gvdjg1MC9rZXJuZWwvc2V0dXAuYyAtLSBBcmNoLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxLDAyLDAzICBORUMgRWxlY3Ryb25pY3MgQ29ycG9yYXRpb24KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEsMDIsMDMgIE1pbGVzIEJhZGVyIDxtaWxlc0BnbnUub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwMSwwMiwwMywwNSAgTkVDIEVsZWN0cm9uaWNzIENvcnBvcmF0aW9uCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLDAyLDAzLDA1ICBNaWxlcyBCYWRlciA8bWlsZXNAZ251Lm9yZz4KICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCiAgKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzCkBAIC05OCwxMCArOTgsMjAgQEAKIH0KIAogI2lmZGVmIENPTkZJR19NVEQKKworLyogRnJvbSBkcml2ZXJzL210ZC9kZXZpY2VzL3NscmFtLmMgKi8KKyNkZWZpbmUgU0xSQU1fQkxLX1NaIDB4NDAwMAorCiAvKiBTZXQgdGhlIHJvb3QgZmlsZXN5c3RlbSB0byBiZSB0aGUgZ2l2ZW4gbWVtb3J5IHJlZ2lvbi4KICAgIFNvbWUgcGFyYW1ldGVyIG1heSBiZSBhcHBlbmRlZCB0byBDTURfTElORS4gICovCiB2b2lkIHNldF9tZW1fcm9vdCAodm9pZCAqYWRkciwgc2l6ZV90IGxlbiwgY2hhciAqY21kX2xpbmUpCiB7CisJLyogU29tZSBzb3J0IG9mIGlkaW9jeSBpbiBNVEQgbWVhbnMgd2UgbXVzdCBzdXBwbHkgYSBsZW5ndGggdGhhdCdzCisJICAgYSBtdWx0aXBsZSBvZiBTTFJBTV9CTEtfU1ouICBXZSBqdXN0IHJvdW5kIHVwIHRoZSByZWFsIGxlbmd0aCwKKwkgICBhcyB0aGUgZmlsZSBzeXN0ZW0gc2hvdWxkbid0IGF0dGVtcHQgdG8gYWNjZXNzIGFueXRoaW5nIGJleW9uZAorCSAgIHRoZSBlbmQgb2YgdGhlIGltYWdlIGFueXdheS4gICovCisJbGVuID0gKCgobGVuIC0gMSkgKyBTTFJBTV9CTEtfU1opIC8gU0xSQU1fQkxLX1NaKSAqIFNMUkFNX0JMS19TWjsKKwogCS8qIFRoZSBvbmx5IHdheSB0byBwYXNzIGluZm8gdG8gdGhlIE1URCBzbHJhbSBkcml2ZXIgaXMgdmlhCiAJICAgdGhlIGNvbW1hbmQgbGluZS4gICovCiAJaWYgKCpjbWRfbGluZSkgewpAQCAtMTI4LDEzICsxMzgsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBubWlfaXJxX3R5cGUgPSB7Ci0JIk5NSSIsCi0JaXJxX3plcm8sCQkvKiBzdGFydHVwICovCi0JaXJxX25vcCwJCS8qIHNodXRkb3duICovCi0JaXJxX25vcCwJCS8qIGVuYWJsZSAqLwotCWlycV9ub3AsCQkvKiBkaXNhYmxlICovCi0JaXJxX25vcCwJCS8qIGFjayAqLwotCW5taV9lbmQsCQkvKiBlbmQgKi8KKwkudHlwZW5hbWUgPSAiTk1JIiwKKwkuc3RhcnR1cCA9IGlycV96ZXJvLAkJLyogc3RhcnR1cCAqLworCS5zaHV0ZG93biA9IGlycV9ub3AsCQkvKiBzaHV0ZG93biAqLworCS5lbmFibGUgPSBpcnFfbm9wLAkJLyogZW5hYmxlICovCisJLmRpc2FibGUgPSBpcnFfbm9wLAkJLyogZGlzYWJsZSAqLworCS5hY2sgPSBpcnFfbm9wLAkJLyogYWNrICovCisJLmVuZCA9IG5taV9lbmQsCQkvKiBlbmQgKi8KIH07CiAKIHZvaWQgX19pbml0IGluaXRfSVJRICh2b2lkKQpAQCAtMjg0LDMgKzI5NCwzMyBAQAogCWZyZWVfYXJlYV9pbml0X25vZGUgKDAsIE5PREVfREFUQSgwKSwgem9uZXNfc2l6ZSwKIAkJCSAgICAgQUREUl9UT19QQUdFIChQQUdFX09GRlNFVCksIDApOwogfQorCisMCisKKy8qIFRha2VuIGZyb20gbTY4a25vbW11ICovCit2b2lkIHNob3dfbWVtKHZvaWQpCit7CisgICAgdW5zaWduZWQgbG9uZyBpOworICAgIGludCBmcmVlID0gMCwgdG90YWwgPSAwLCByZXNlcnZlZCA9IDAsIHNoYXJlZCA9IDA7CisgICAgaW50IGNhY2hlZCA9IDA7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICJcbk1lbS1pbmZvOlxuIik7CisgICAgc2hvd19mcmVlX2FyZWFzKCk7CisgICAgaSA9IG1heF9tYXBucjsKKyAgICB3aGlsZSAoaS0tID4gMCkgeworCXRvdGFsKys7CisJaWYgKFBhZ2VSZXNlcnZlZChtZW1fbWFwK2kpKQorCSAgICByZXNlcnZlZCsrOworCWVsc2UgaWYgKFBhZ2VTd2FwQ2FjaGUobWVtX21hcCtpKSkKKwkgICAgY2FjaGVkKys7CisJZWxzZSBpZiAoIXBhZ2VfY291bnQobWVtX21hcCtpKSkKKwkgICAgZnJlZSsrOworCWVsc2UKKwkgICAgc2hhcmVkICs9IHBhZ2VfY291bnQobWVtX21hcCtpKSAtIDE7CisgICAgfQorICAgIHByaW50ayhLRVJOX0lORk8gIiVkIHBhZ2VzIG9mIFJBTVxuIix0b3RhbCk7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJWQgZnJlZSBwYWdlc1xuIixmcmVlKTsKKyAgICBwcmludGsoS0VSTl9JTkZPICIlZCByZXNlcnZlZCBwYWdlc1xuIixyZXNlcnZlZCk7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJWQgcGFnZXMgc2hhcmVkXG4iLHNoYXJlZCk7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJWQgcGFnZXMgc3dhcCBjYWNoZWRcbiIsY2FjaGVkKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9rZXJuZWwvc2ltLmMgYi9hcmNoL3Y4NTAva2VybmVsL3NpbS5jCmluZGV4IGUyY2M1NTguLjE3MDQ5YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvc2ltLmMKKysrIGIvYXJjaC92ODUwL2tlcm5lbC9zaW0uYwpAQCAtNzMsMTMgKzczLDEzIEBACiBzdGF0aWMgdW5zaWduZWQgaXJxX3plcm8gKHVuc2lnbmVkIGlycSkgeyByZXR1cm4gMDsgfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHNpbV9pcnFfdHlwZSA9IHsKLQkiSVJRIiwKLQlpcnFfemVybywJCS8qIHN0YXJ0dXAgKi8KLQlpcnFfbm9wLAkJLyogc2h1dGRvd24gKi8KLQlpcnFfbm9wLAkJLyogZW5hYmxlICovCi0JaXJxX25vcCwJCS8qIGRpc2FibGUgKi8KLQlpcnFfbm9wLAkJLyogYWNrICovCi0JaXJxX25vcCwJCS8qIGVuZCAqLworCS50eXBlbmFtZSA9ICJJUlEiLAorCS5zdGFydHVwID0gaXJxX3plcm8sCQkvKiBzdGFydHVwICovCisJLnNodXRkb3duID0gaXJxX25vcCwJCS8qIHNodXRkb3duICovCisJLmVuYWJsZSA9IGlycV9ub3AsCQkvKiBlbmFibGUgKi8KKwkuZGlzYWJsZSA9IGlycV9ub3AsCQkvKiBkaXNhYmxlICovCisJLmFjayA9IGlycV9ub3AsCQkvKiBhY2sgKi8KKwkuZW5kID0gaXJxX25vcCwJCS8qIGVuZCAqLwogfTsKIAogdm9pZCBfX2luaXQgbWFjaF9pbml0X2lycXMgKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL3RpbWUuYyBiL2FyY2gvdjg1MC9rZXJuZWwvdGltZS5jCmluZGV4IGY3MjJhMjYuLmVhM2ZkODggMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvdjg1MC9rZXJuZWwvdGltZS5jCkBAIC02Niw3ICs2Niw3IEBACiAJICogQ01PUyBjbG9jayBhY2NvcmRpbmdseSBldmVyeSB+MTEgbWludXRlcy4gU2V0X3J0Y19tbXNzKCkgaGFzIHRvIGJlCiAJICogY2FsbGVkIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIDUwMCBtcyBiZWZvcmUgdGhlIG5ldyBzZWNvbmQgc3RhcnRzLgogCSAqLwotCWlmICgodGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSA9PSAwICYmCisJaWYgKG50cF9zeW5jZWQoKSAmJgogCSAgICB4dGltZS50dl9zZWMgPiBsYXN0X3J0Y191cGRhdGUgKyA2NjAgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA+PSA1MDAwMDAgLSAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMiAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApIDw9IDUwMDAwMCArICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyKSB7CkBAIC0xNjksMTAgKzE2OSw3IEBACiAJeHRpbWUudHZfc2VjID0gdHYtPnR2X3NlYzsKIAl4dGltZS50dl9uc2VjID0gdHYtPnR2X25zZWM7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lICgpICovCi0JdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJbnRwX2NsZWFyKCk7CiAKIAl3cml0ZV9zZXF1bmxvY2tfaXJxICgmeHRpbWVfbG9jayk7CiAJY2xvY2tfd2FzX3NldCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvS2NvbmZpZyBiL2FyY2gveDg2XzY0L0tjb25maWcKaW5kZXggNjYwYTAzYS4uZTYzMzIzZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvS2NvbmZpZworKysgYi9hcmNoL3g4Nl82NC9LY29uZmlnCkBAIC0yNCw2ICsyNCwxMCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIFNFTUFQSE9SRV9TTEVFUEVSUworCWJvb2wKKwlkZWZhdWx0IHkKKwogY29uZmlnIE1NVQogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTYxLDYgKzY1LDEwIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgQVJDSF9NQVlfSEFWRV9QQ19GREMKKwlib29sCisJZGVmYXVsdCB5CisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiAKQEAgLTE0NCw3ICsxNTIsNiBAQAogCSAgd2l0aCBtYWpvciAyMDMgYW5kIG1pbm9ycyAwIHRvIDMxIGZvciAvZGV2L2NwdS8wL2NwdWlkIHRvCiAJICAvZGV2L2NwdS8zMS9jcHVpZC4KIAotIyBkaXNhYmxlIGl0IGZvciBvcHRlcm9uIG9wdGltaXplZCBidWlsZHMgYmVjYXVzZSBpdCBwdWxscyBpbiBBQ1BJX0JPT1QKIGNvbmZpZyBYODZfSFQKIAlib29sCiAJZGVwZW5kcyBvbiBTTVAgJiYgIU1LOApAQCAtNDM3LDYgKzQ0NCwxMSBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEdFTkVSSUNfUEVORElOR19JUlEKKwlib29sCisJZGVwZW5kcyBvbiBHRU5FUklDX0hBUkRJUlFTICYmIFNNUAorCWRlZmF1bHQgeQorCiBtZW51ICJQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMiCiAKIHNvdXJjZSBrZXJuZWwvcG93ZXIvS2NvbmZpZwpAQCAtNDYxLDcgKzQ3Myw2IEBACiBjb25maWcgUENJX01NQ09ORklHCiAJYm9vbCAiU3VwcG9ydCBtbWNvbmZpZyBQQ0kgY29uZmlnIHNwYWNlIGFjY2VzcyIKIAlkZXBlbmRzIG9uIFBDSSAmJiBBQ1BJCi0Jc2VsZWN0IEFDUElfQk9PVAogCiBjb25maWcgVU5PUkRFUkVEX0lPCiAgICAgICAgYm9vbCAiVW5vcmRlcmVkIElPIG1hcHBpbmcgYWNjZXNzIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9NYWtlZmlsZQppbmRleCA0YzZlZDk2Li5hOWNkNDJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9NYWtlZmlsZQpAQCAtODYsMTYgKzg2LDYgQEAKIGFyY2hjbGVhbjoKIAkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKGJvb3QpCiAKLXByZXBhcmU6IGluY2x1ZGUvYXNtLSQoQVJDSCkvb2Zmc2V0LmgKLQotYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBcCi0JCQkJICAgaW5jbHVkZS9jb25maWcvTUFSS0VSCi0KLWluY2x1ZGUvYXNtLSQoQVJDSCkvb2Zmc2V0Lmg6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKLQotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXQuaAotCiBkZWZpbmUgYXJjaGhlbHAKICAgZWNobyAgJyogYnpJbWFnZQktIENvbXByZXNzZWQga2VybmVsIGltYWdlIChhcmNoLyQoQVJDSCkvYm9vdC9iekltYWdlKScKICAgZWNobyAgJyAgaW5zdGFsbAktIEluc3RhbGwga2VybmVsIHVzaW5nJwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvYm9vdC9zZXR1cC5TIGIvYXJjaC94ODZfNjQvYm9vdC9zZXR1cC5TCmluZGV4IGZmNThiMjguLjEyZWEwYjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2Jvb3Qvc2V0dXAuUworKysgYi9hcmNoL3g4Nl82NC9ib290L3NldHVwLlMKQEAgLTgxLDcgKzgxLDcgQEAKICMgVGhpcyBpcyB0aGUgc2V0dXAgaGVhZGVyLCBhbmQgaXQgbXVzdCBzdGFydCBhdCAlY3M6MiAob2xkIDB4OTAyMDoyKQogCiAJCS5hc2NpaQkiSGRyUyIJCSMgaGVhZGVyIHNpZ25hdHVyZQotCQkud29yZAkweDAyMDMJCSMgaGVhZGVyIHZlcnNpb24gbnVtYmVyICg+PSAweDAxMDUpCisJCS53b3JkCTB4MDIwNAkJIyBoZWFkZXIgdmVyc2lvbiBudW1iZXIgKD49IDB4MDEwNSkKIAkJCQkJIyBvciBlbHNlIG9sZCBsb2FkbGluLTEuNSB3aWxsIGZhaWwpCiByZWFsbW9kZV9zd3RjaDoJLndvcmQJMCwgMAkJIyBkZWZhdWx0X3N3aXRjaCwgU0VUVVBTRUcKIHN0YXJ0X3N5c19zZWc6CS53b3JkCVNZU1NFRwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvYm9vdC90b29scy9idWlsZC5jIGIvYXJjaC94ODZfNjQvYm9vdC90b29scy9idWlsZC5jCmluZGV4IDE4YjViYWMuLmM0NGY1ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2Jvb3QvdG9vbHMvYnVpbGQuYworKysgYi9hcmNoL3g4Nl82NC9ib290L3Rvb2xzL2J1aWxkLmMKQEAgLTE3OCw3ICsxNzgsOSBAQAogCQlkaWUoIk91dHB1dDogc2VlayBmYWlsZWQiKTsKIAlidWZbMF0gPSAoc3lzX3NpemUgJiAweGZmKTsKIAlidWZbMV0gPSAoKHN5c19zaXplID4+IDgpICYgMHhmZik7Ci0JaWYgKHdyaXRlKDEsIGJ1ZiwgMikgIT0gMikKKwlidWZbMl0gPSAoKHN5c19zaXplID4+IDE2KSAmIDB4ZmYpOworCWJ1ZlszXSA9ICgoc3lzX3NpemUgPj4gMjQpICYgMHhmZik7CisJaWYgKHdyaXRlKDEsIGJ1ZiwgNCkgIT0gNCkKIAkJZGllKCJXcml0ZSBvZiBpbWFnZSBsZW5ndGggZmFpbGVkIik7CiAKIAlyZXR1cm4gMDsJCQkJCSAgICAvKiBFdmVyeXRoaW5nIGlzIE9LICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9kZWZjb25maWcgYi9hcmNoL3g4Nl82NC9kZWZjb25maWcKaW5kZXggYjk3YTYxZS4uYmY1N2UyMyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvZGVmY29uZmlnCisrKyBiL2FyY2gveDg2XzY0L2RlZmNvbmZpZwpAQCAtMTM1LDggKzEzNSw2IEBACiAjIEFDUEkgKEFkdmFuY2VkIENvbmZpZ3VyYXRpb24gYW5kIFBvd2VyIEludGVyZmFjZSkgU3VwcG9ydAogIwogQ09ORklHX0FDUEk9eQotQ09ORklHX0FDUElfQk9PVD15Ci1DT05GSUdfQUNQSV9JTlRFUlBSRVRFUj15CiBDT05GSUdfQUNQSV9BQz15CiBDT05GSUdfQUNQSV9CQVRURVJZPXkKIENPTkZJR19BQ1BJX0JVVFRPTj15CkBAIC0xNTEsMTAgKzE0OSw4IEBACiBDT05GSUdfQUNQSV9UT1NISUJBPXkKIENPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSPTIwMDEKICMgQ09ORklHX0FDUElfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0FDUElfQlVTPXkKIENPTkZJR19BQ1BJX0VDPXkKIENPTkZJR19BQ1BJX1BPV0VSPXkKLUNPTkZJR19BQ1BJX1BDST15CiBDT05GSUdfQUNQSV9TWVNURU09eQogIyBDT05GSUdfQUNQSV9DT05UQUlORVIgaXMgbm90IHNldAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfaW9jdGwuYyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9pb2N0bC5jCmluZGV4IGQyNTlmOGEuLjQxOTc1OGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9pb2N0bC5jCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9pb2N0bC5jCkBAIC0yNCwxNyArMjQsMjYgQEAKIHN0YXRpYyBpbnQgdGlvY2dkZXYodW5zaWduZWQgZmQsIHVuc2lnbmVkIGNtZCwgIHVuc2lnbmVkIGludCBfX3VzZXIgKnB0cikgCiB7IAogCi0Jc3RydWN0IGZpbGUgKmZpbGUgPSBmZ2V0KGZkKTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqcmVhbF90dHk7CisJaW50IGZwdXRfbmVlZGVkLCByZXQ7CiAKKwlmaWxlID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKIAlpZiAoIWZpbGUpCiAJCXJldHVybiAtRUJBREY7CisKKwlyZXQgPSAtRUlOVkFMOwogCWlmIChmaWxlLT5mX29wLT5pb2N0bCAhPSB0dHlfaW9jdGwpCi0JCXJldHVybiAtRUlOVkFMOyAKKwkJZ290byBvdXQ7CiAJcmVhbF90dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWYgKCFyZWFsX3R0eSkgCQotCQlyZXR1cm4gLUVJTlZBTDsgCi0JcmV0dXJuIHB1dF91c2VyKG5ld19lbmNvZGVfZGV2KHR0eV9kZXZudW0ocmVhbF90dHkpKSwgcHRyKTsgCisJCWdvdG8gb3V0OworCisJcmV0ID0gcHV0X3VzZXIobmV3X2VuY29kZV9kZXYodHR5X2Rldm51bShyZWFsX3R0eSkpLCBwdHIpOyAKKworb3V0OgorCWZwdXRfbGlnaHQoZmlsZSwgZnB1dF9uZWVkZWQpOworCXJldHVybiByZXQ7CiB9IAogCiAjZGVmaW5lIFJUQ19JUlFQX1JFQUQzMglfSU9SKCdwJywgMHgwYiwgdW5zaWduZWQgaW50KQkgLyogUmVhZCBJUlEgcmF0ZSAgICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUwppbmRleCBjNDVkNmEwLi41MjQ0ZjgwIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKQEAgLTYsNyArNiw3IEBACiAKICNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CiAjaW5jbHVkZSA8YXNtL2NhbGxpbmcuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vaWEzMl91bmlzdGQuaD4JCkBAIC0zMDcsNyArMzA3LDcgQEAKIAkucXVhZCBzdHViMzJfZm9yawogCS5xdWFkIHN5c19yZWFkCiAJLnF1YWQgc3lzX3dyaXRlCi0JLnF1YWQgc3lzMzJfb3BlbgkJLyogNSAqLworCS5xdWFkIGNvbXBhdF9zeXNfb3BlbgkJLyogNSAqLwogCS5xdWFkIHN5c19jbG9zZQogCS5xdWFkIHN5czMyX3dhaXRwaWQKIAkucXVhZCBzeXNfY3JlYXQKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvc3lzX2lhMzIuYyBiL2FyY2gveDg2XzY0L2lhMzIvc3lzX2lhMzIuYwppbmRleCBiZTk5NmQxLi4wNGQ4MDQwIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL3N5c19pYTMyLmMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9zeXNfaWEzMi5jCkBAIC05NjksMzIgKzk2OSw2IEBACiAJcmV0dXJuIHN5c19raWxsKHBpZCwgc2lnKTsKIH0KICAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9vcGVuKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIGludCBmbGFncywgaW50IG1vZGUpCi17Ci0JY2hhciAqIHRtcDsKLQlpbnQgZmQsIGVycm9yOwotCi0JLyogZG9uJ3QgZm9yY2UgT19MQVJHRUZJTEUgKi8KLQl0bXAgPSBnZXRuYW1lKGZpbGVuYW1lKTsKLQlmZCA9IFBUUl9FUlIodG1wKTsKLQlpZiAoIUlTX0VSUih0bXApKSB7Ci0JCWZkID0gZ2V0X3VudXNlZF9mZCgpOwotCQlpZiAoZmQgPj0gMCkgewotCQkJc3RydWN0IGZpbGUgKmYgPSBmaWxwX29wZW4odG1wLCBmbGFncywgbW9kZSk7Ci0JCQllcnJvciA9IFBUUl9FUlIoZik7Ci0JCQlpZiAoSVNfRVJSKGYpKSB7Ci0JCQkJcHV0X3VudXNlZF9mZChmZCk7IAotCQkJCWZkID0gZXJyb3I7Ci0JCQl9IGVsc2UgewotCQkJCWZzbm90aWZ5X29wZW4oZi0+Zl9kZW50cnkpOwotCQkJCWZkX2luc3RhbGwoZmQsIGYpOwotCQkJfQotCQl9Ci0JCXB1dG5hbWUodG1wKTsKLQl9Ci0JcmV0dXJuIGZkOwotfQotCiBleHRlcm4gYXNtbGlua2FnZSBsb25nCiBzeXNfdGltZXJfY3JlYXRlKGNsb2NraWRfdCB3aGljaF9jbG9jaywKIAkJIHN0cnVjdCBzaWdldmVudCBfX3VzZXIgKnRpbWVyX2V2ZW50X3NwZWMsCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL3ZzeXNjYWxsLXN5c2NhbGwuUyBiL2FyY2gveDg2XzY0L2lhMzIvdnN5c2NhbGwtc3lzY2FsbC5TCmluZGV4IGUyYWFmM2QuLmIwMjQ5NjViIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL3ZzeXNjYWxsLXN5c2NhbGwuUworKysgYi9hcmNoL3g4Nl82NC9pYTMyL3ZzeXNjYWxsLXN5c2NhbGwuUwpAQCAtMyw3ICszLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNtL2lhMzJfdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAKIAkudGV4dApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi92c3lzY2FsbC1zeXNlbnRlci5TIGIvYXJjaC94ODZfNjQvaWEzMi92c3lzY2FsbC1zeXNlbnRlci5TCmluZGV4IDhmYjhlMGYuLjcxZjNkZTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvdnN5c2NhbGwtc3lzZW50ZXIuUworKysgYi9hcmNoL3g4Nl82NC9pYTMyL3ZzeXNjYWxsLXN5c2VudGVyLlMKQEAgLTMsNyArMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzbS9pYTMyX3VuaXN0ZC5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCS50ZXh0CiAJLnNlY3Rpb24gLnRleHQudnN5c2NhbGwsImF4IgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlIGIvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlCmluZGV4IDQ4ZjllMmMuLjE1NzliZGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUKQEAgLTQsMTUgKzQsMTUgQEAKIAogZXh0cmEteSAJOj0gaGVhZC5vIGhlYWQ2NC5vIGluaXRfdGFzay5vIHZtbGludXgubGRzCiBFWFRSQV9BRkxBR1MJOj0gLXRyYWRpdGlvbmFsCi1vYmoteQk6PSBwcm9jZXNzLm8gc2VtYXBob3JlLm8gc2lnbmFsLm8gZW50cnkubyB0cmFwcy5vIGlycS5vIFwKK29iai15CTo9IHByb2Nlc3MubyBzaWduYWwubyBlbnRyeS5vIHRyYXBzLm8gaXJxLm8gXAogCQlwdHJhY2UubyB0aW1lLm8gaW9wb3J0Lm8gbGR0Lm8gc2V0dXAubyBpODI1OS5vIHN5c194ODZfNjQubyBcCiAJCXg4NjY0X2tzeW1zLm8gaTM4Ny5vIHN5c2NhbGwubyB2c3lzY2FsbC5vIFwKLQkJc2V0dXA2NC5vIGJvb3RmbGFnLm8gZTgyMC5vIHJlYm9vdC5vIHF1aXJrcy5vCisJCXNldHVwNjQubyBib290ZmxhZy5vIGU4MjAubyByZWJvb3QubyBxdWlya3MubyBpODIzNy5vCiAKIG9iai0kKENPTkZJR19YODZfTUNFKSAgICAgICAgICs9IG1jZS5vCiBvYmotJChDT05GSUdfWDg2X01DRV9JTlRFTCkJKz0gbWNlX2ludGVsLm8KIG9iai0kKENPTkZJR19NVFJSKQkJKz0gLi4vLi4vaTM4Ni9rZXJuZWwvY3B1L210cnIvCi1vYmotJChDT05GSUdfQUNQSV9CT09UKQkJKz0gYWNwaS8KK29iai0kKENPTkZJR19BQ1BJKQkJKz0gYWNwaS8KIG9iai0kKENPTkZJR19YODZfTVNSKQkJKz0gbXNyLm8KIG9iai0kKENPTkZJR19NSUNST0NPREUpCQkrPSBtaWNyb2NvZGUubwogb2JqLSQoQ09ORklHX1g4Nl9DUFVJRCkJCSs9IGNwdWlkLm8KQEAgLTQ1LDMgKzQ1LDQgQEAKIG1pY3JvY29kZS0kKHN1YnN0IG0seSwkKENPTkZJR19NSUNST0NPREUpKSAgKz0gLi4vLi4vaTM4Ni9rZXJuZWwvbWljcm9jb2RlLm8KIGludGVsX2NhY2hlaW5mby15CQkrPSAuLi8uLi9pMzg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLm8KIHF1aXJrcy15CQkJKz0gLi4vLi4vaTM4Ni9rZXJuZWwvcXVpcmtzLm8KK2k4MjM3LXkJCQkJKz0gLi4vLi4vaTM4Ni9rZXJuZWwvaTgyMzcubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FjcGkvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9NYWtlZmlsZQppbmRleCBkMmMyZWU1Li43ZGE5YWNlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9NYWtlZmlsZQpAQCAtMSwzICsxLDMgQEAKLW9iai0kKENPTkZJR19BQ1BJX0JPT1QpCQk6PSBib290Lm8KLWJvb3QtJChDT05GSUdfQUNQSV9CT09UKQk6PSAuLi8uLi8uLi9pMzg2L2tlcm5lbC9hY3BpL2Jvb3Qubworb2JqLXkJCQk6PSBib290Lm8KK2Jvb3QteQkJCTo9IC4uLy4uLy4uL2kzODYva2VybmVsL2FjcGkvYm9vdC5vCiBvYmotJChDT05GSUdfQUNQSV9TTEVFUCkJKz0gc2xlZXAubyB3YWtldXAubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FjcGkvc2xlZXAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hY3BpL3NsZWVwLmMKaW5kZXggN2EyNzVkZS4uMTQ4ZjZmNyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2FjcGkvc2xlZXAuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9zbGVlcC5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvdy1MZXZlbCBTbGVlcCBTdXBwb3J0CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzcsMTEgKzc2LDEyIEBACiAgKiBDcmVhdGUgYW4gaWRlbnRpdHkgbWFwcGVkIHBhZ2UgdGFibGUgYW5kIGNvcHkgdGhlIHdha2V1cCByb3V0aW5lIHRvCiAgKiBsb3cgbWVtb3J5LgogICovCi1pbnQgYWNwaV9zYXZlX3N0YXRlX21lbSAodm9pZCkKK2ludCBhY3BpX3NhdmVfc3RhdGVfbWVtKHZvaWQpCiB7CiAJaW5pdF9sb3dfbWFwcGluZygpOwogCi0JbWVtY3B5KCh2b2lkICopIGFjcGlfd2FrZXVwX2FkZHJlc3MsICZ3YWtldXBfc3RhcnQsICZ3YWtldXBfZW5kIC0gJndha2V1cF9zdGFydCk7CisJbWVtY3B5KCh2b2lkICopYWNwaV93YWtldXBfYWRkcmVzcywgJndha2V1cF9zdGFydCwKKwkgICAgICAgJndha2V1cF9lbmQgLSAmd2FrZXVwX3N0YXJ0KTsKIAlhY3BpX2NvcHlfd2FrZXVwX3JvdXRpbmUoYWNwaV93YWtldXBfYWRkcmVzcyk7CiAKIAlyZXR1cm4gMDsKQEAgLTkwLDcgKzkwLDcgQEAKIC8qCiAgKiBhY3BpX3Jlc3RvcmVfc3RhdGUKICAqLwotdm9pZCBhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtICh2b2lkKQordm9pZCBhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtKHZvaWQpCiB7CiAJc2V0X3BnZChwZ2Rfb2Zmc2V0KGN1cnJlbnQtPm1tLCAwVUwpLCBsb3dfcHRyKTsKIAlmbHVzaF90bGJfYWxsKCk7CkBAIC0xMDgsNyArMTA4LDggQEAKIHsKIAlhY3BpX3dha2V1cF9hZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpYWxsb2NfYm9vdG1lbV9sb3coUEFHRV9TSVpFKTsKIAlpZiAoKCZ3YWtldXBfZW5kIC0gJndha2V1cF9zdGFydCkgPiBQQUdFX1NJWkUpCi0JCXByaW50ayhLRVJOX0NSSVQgIkFDUEk6IFdha2V1cCBjb2RlIHdheSB0b28gYmlnLCB3aWxsIGNyYXNoIG9uIGF0dGVtcHQgdG8gc3VzcGVuZFxuIik7CisJCXByaW50ayhLRVJOX0NSSVQKKwkJICAgICAgICJBQ1BJOiBXYWtldXAgY29kZSB3YXkgdG9vIGJpZywgd2lsbCBjcmFzaCBvbiBhdHRlbXB0IHRvIHN1c3BlbmRcbiIpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3NsZWVwX3NldHVwKGNoYXIgKnN0cikKQEAgLTEyNyw2ICsxMjgsOCBAQAogCiBfX3NldHVwKCJhY3BpX3NsZWVwPSIsIGFjcGlfc2xlZXBfc2V0dXApOwogCi0jZW5kaWYgLypDT05GSUdfQUNQSV9TTEVFUCovCisjZW5kaWYJCQkJLypDT05GSUdfQUNQSV9TTEVFUCAqLwogCi12b2lkIGFjcGlfcGNpX2xpbmtfZXhpdCh2b2lkKSB7fQordm9pZCBhY3BpX3BjaV9saW5rX2V4aXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZTgyMC5jCmluZGV4IGI1NDhkZWEuLmJiMGFlMTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2U4MjAuYwpAQCAtODUsNyArODUsNyBAQAogCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsgCiAJCWlmICh0eXBlICYmIGVpLT50eXBlICE9IHR5cGUpIAogCQkJY29udGludWU7Ci0JCWlmIChlaS0+YWRkciA+PSBlbmQgfHwgZWktPmFkZHIgKyBlaS0+c2l6ZSA8IHN0YXJ0KSAKKwkJaWYgKGVpLT5hZGRyID49IGVuZCB8fCBlaS0+YWRkciArIGVpLT5zaXplIDw9IHN0YXJ0KQogCQkJY29udGludWU7IAogCQlyZXR1cm4gMTsgCiAJfSAKQEAgLTU2Nyw3ICs1NjcsNyBAQAogICovCiBfX2luaXQgdm9pZCBlODIwX3NldHVwX2dhcCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZ2Fwc3RhcnQsIGdhcHNpemU7CisJdW5zaWduZWQgbG9uZyBnYXBzdGFydCwgZ2Fwc2l6ZSwgcm91bmQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0OwogCWludCBpOwogCWludCBmb3VuZCA9IDA7CkBAIC02MDQsMTQgKzYwNCwxNCBAQAogCX0KIAogCS8qCi0JICogU3RhcnQgYWxsb2NhdGluZyBkeW5hbWljIFBDSSBtZW1vcnkgYSBiaXQgaW50byB0aGUgZ2FwLAotCSAqIGFsaWduZWQgdXAgdG8gdGhlIG5lYXJlc3QgbWVnYWJ5dGUuCi0JICoKLQkgKiBRdWVzdGlvbjogc2hvdWxkIHdlIHRyeSB0byBwYWQgaXQgdXAgYSBiaXQgKGRvIHNvbWV0aGluZwotCSAqIGxpa2UgIiArIChnYXBzaXplID4+IDMpIiBpbiB0aGVyZSB0b28/KS4gV2Ugbm93IGhhdmUgdGhlCi0JICogdGVjaG5vbG9neS4KKwkgKiBTZWUgaG93IG11Y2ggd2Ugd2FudCB0byByb3VuZCB1cDogc3RhcnQgb2ZmIHdpdGgKKwkgKiByb3VuZGluZyB0byB0aGUgbmV4dCAxTUIgYXJlYS4KIAkgKi8KLQlwY2lfbWVtX3N0YXJ0ID0gKGdhcHN0YXJ0ICsgMHhmZmZmZikgJiB+MHhmZmZmZjsKKwlyb3VuZCA9IDB4MTAwMDAwOworCXdoaWxlICgoZ2Fwc2l6ZSA+PiA0KSA+IHJvdW5kKQorCQlyb3VuZCArPSByb3VuZDsKKwkvKiBGdW4gd2l0aCB0d28ncyBjb21wbGVtZW50ICovCisJcGNpX21lbV9zdGFydCA9IChnYXBzdGFydCArIHJvdW5kKSAmIC1yb3VuZDsKIAogCXByaW50ayhLRVJOX0lORk8gIkFsbG9jYXRpbmcgUENJIHJlc291cmNlcyBzdGFydGluZyBhdCAlbHggKGdhcDogJWx4OiVseClcbiIsCiAJCXBjaV9tZW1fc3RhcnQsIGdhcHN0YXJ0LCBnYXBzaXplKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC94ODZfNjQva2VybmVsL2VudHJ5LlMKaW5kZXggMDk2ZDQ3MC4uMzYyMDUwOCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2VudHJ5LlMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CiAjaW5jbHVkZSA8YXNtL2NhbGxpbmcuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KQEAgLTc4NCw4ICs3ODQsOSBAQAogCXJldAogCUNGSV9FTkRQUk9DCiAKLUVOVFJZKHBhZ2VfZmF1bHQpCitLUFJPQkVfRU5UUlkocGFnZV9mYXVsdCkKIAllcnJvcmVudHJ5IGRvX3BhZ2VfZmF1bHQKKwkucHJldmlvdXMgLnRleHQKIAogRU5UUlkoY29wcm9jZXNzb3JfZXJyb3IpCiAJemVyb2VudHJ5IGRvX2NvcHJvY2Vzc29yX2Vycm9yCkBAIC03OTcsMTMgKzc5OCwxNCBAQAogCXplcm9lbnRyeSBtYXRoX3N0YXRlX3Jlc3RvcmUKIAogCS8qIHJ1bnMgb24gZXhjZXB0aW9uIHN0YWNrICovCi1FTlRSWShkZWJ1ZykKK0tQUk9CRV9FTlRSWShkZWJ1ZykKIAlDRklfU1RBUlRQUk9DCiAJcHVzaHEgJDAKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgOAkJCiAJcGFyYW5vaWRlbnRyeSBkb19kZWJ1ZwogCWptcCBwYXJhbm9pZF9leGl0CiAJQ0ZJX0VORFBST0MKKwkucHJldmlvdXMgLnRleHQKIAogCS8qIHJ1bnMgb24gZXhjZXB0aW9uIHN0YWNrICovCQogRU5UUlkobm1pKQpAQCAtODU0LDggKzg1Niw5IEBACiAJam1wIHBhcmFub2lkX3VzZXJzcGFjZQogCUNGSV9FTkRQUk9DCiAKLUVOVFJZKGludDMpCitLUFJPQkVfRU5UUlkoaW50MykKIAl6ZXJvZW50cnkgZG9faW50MwkKKwkucHJldmlvdXMgLnRleHQKIAogRU5UUlkob3ZlcmZsb3cpCiAJemVyb2VudHJ5IGRvX292ZXJmbG93CkBAIC04OTIsOCArODk1LDkgQEAKIAlqbXAgcGFyYW5vaWRfZXhpdAogCUNGSV9FTkRQUk9DCiAKLUVOVFJZKGdlbmVyYWxfcHJvdGVjdGlvbikKK0tQUk9CRV9FTlRSWShnZW5lcmFsX3Byb3RlY3Rpb24pCiAJZXJyb3JlbnRyeSBkb19nZW5lcmFsX3Byb3RlY3Rpb24KKwkucHJldmlvdXMgLnRleHQKIAogRU5UUlkoYWxpZ25tZW50X2NoZWNrKQogCWVycm9yZW50cnkgZG9fYWxpZ25tZW50X2NoZWNrCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWMuYwppbmRleCAzMGM4NDNhLi5iMWMxNDRmIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljLmMKQEAgLTIwLDEyICsyMCwxMiBAQAogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vaXBpLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19BQ1BJX0JVUykKKyNpZiBkZWZpbmVkKENPTkZJR19BQ1BJKQogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNlbmRpZgogCiAvKiB3aGljaCBsb2dpY2FsIENQVSBudW1iZXIgbWFwcyB0byB3aGljaCBDUFUgKHBoeXNpY2FsIEFQSUMgSUQpICovCi11OCB4ODZfY3B1X3RvX2FwaWNpZFtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07Cit1OCB4ODZfY3B1X3RvX2FwaWNpZFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0geyBbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUQgfTsKIEVYUE9SVF9TWU1CT0woeDg2X2NwdV90b19hcGljaWQpOwogdTggeDg2X2NwdV90b19sb2dfYXBpY2lkW05SX0NQVVNdID0geyBbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUQgfTsKIApAQCAtNDcsNyArNDcsNyBAQAogCXU4IGNsdXN0ZXJfY250W05VTV9BUElDX0NMVVNURVJTXTsKIAlpbnQgbnVtX2NwdXMgPSAwOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQUNQSV9CVVMpCisjaWYgZGVmaW5lZChDT05GSUdfQUNQSSkKIAkvKgogCSAqIFNvbWUgeDg2XzY0IG1hY2hpbmVzIHVzZSBwaHlzaWNhbCBBUElDIG1vZGUgcmVnYXJkbGVzcyBvZiBob3cgbWFueQogCSAqIHByb2NzL2NsdXN0ZXJzIGFyZSBwcmVzZW50ICh4ODZfNjQgRVM3MDAwIGlzIGFuIGV4YW1wbGUpLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfY2x1c3Rlci5jIGIvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfY2x1c3Rlci5jCmluZGV4IDk3MDNkYTcuLmY2NTIzZGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2NsdXN0ZXIuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19jbHVzdGVyLmMKQEAgLTcyLDEwICs3MiwxNCBAQAogc3RhdGljIHZvaWQgY2x1c3Rlcl9zZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCiB7CiAJY3B1bWFza190IG1hc2sgPSBjcHVfb25saW5lX21hcDsKLQljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtYXNrKTsKKwlpbnQgbWUgPSBnZXRfY3B1KCk7IC8qIEVuc3VyZSB3ZSBhcmUgbm90IHByZWVtcHRlZCB3aGVuIHdlIGNsZWFyICovCisKKwljcHVfY2xlYXIobWUsIG1hc2spOwogCiAJaWYgKCFjcHVzX2VtcHR5KG1hc2spKQogCQljbHVzdGVyX3NlbmRfSVBJX21hc2sobWFzaywgdmVjdG9yKTsKKworCXB1dF9jcHUoKTsKIH0KIAogc3RhdGljIHZvaWQgY2x1c3Rlcl9zZW5kX0lQSV9hbGwoaW50IHZlY3RvcikKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYwppbmRleCBhZGM5NjI4Li42ZDU3ZGE5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19mbGF0LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfZmxhdC5jCkBAIC03OCw4ICs3OCwxOCBAQAogCiBzdGF0aWMgdm9pZCBmbGF0X3NlbmRfSVBJX2FsbGJ1dHNlbGYoaW50IHZlY3RvcikKIHsKKyNpZm5kZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAJaWYgKCgobnVtX29ubGluZV9jcHVzKCkpIC0gMSkgPj0gMSkKIAkJX19zZW5kX0lQSV9zaG9ydGN1dChBUElDX0RFU1RfQUxMQlVULCB2ZWN0b3IsQVBJQ19ERVNUX0xPR0lDQUwpOworI2Vsc2UKKwljcHVtYXNrX3QgYWxsYnV0bWUgPSBjcHVfb25saW5lX21hcDsKKwlpbnQgbWUgPSBnZXRfY3B1KCk7IC8qIEVuc3VyZSB3ZSBhcmUgbm90IHByZWVtcHRlZCB3aGVuIHdlIGNsZWFyICovCisJY3B1X2NsZWFyKG1lLCBhbGxidXRtZSk7CisKKwlpZiAoIWNwdXNfZW1wdHkoYWxsYnV0bWUpKQorCQlmbGF0X3NlbmRfSVBJX21hc2soYWxsYnV0bWUsIHZlY3Rvcik7CisJcHV0X2NwdSgpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIGZsYXRfc2VuZF9JUElfYWxsKGludCB2ZWN0b3IpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYwppbmRleCBkMjA2ZDdlLi41ZjE1MjliIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKQEAgLTcwLDcgKzcwLDcgQEAKIAlzaG9ydCBhcGljLCBwaW4sIG5leHQ7CiB9IGlycV8yX3BpbltQSU5fTUFQX1NJWkVdOwogCi1pbnQgdmVjdG9yX2lycVtOUl9WRUNUT1JTXSA9IHsgWzAgLi4uIE5SX1ZFQ1RPUlMgLSAxXSA9IC0xfTsKK2ludCB2ZWN0b3JfaXJxW05SX1ZFQ1RPUlNdIF9fcmVhZF9tb3N0bHkgPSB7IFswIC4uLiBOUl9WRUNUT1JTIC0gMV0gPSAtMX07CiAjaWZkZWYgQ09ORklHX1BDSV9NU0kKICNkZWZpbmUgdmVjdG9yX3RvX2lycSh2ZWN0b3IpIAlcCiAJKHBsYXRmb3JtX2xlZ2FjeV9pcnEodmVjdG9yKSA/IHZlY3RvciA6IHZlY3Rvcl9pcnFbdmVjdG9yXSkKQEAgLTc4LDYgKzc4LDU0IEBACiAjZGVmaW5lIHZlY3Rvcl90b19pcnEodmVjdG9yKQkodmVjdG9yKQogI2VuZGlmCiAKKyNkZWZpbmUgX19ET19BQ1RJT04oUiwgQUNUSU9OLCBGSU5BTCkJCQkJCVwKKwkJCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJaW50IHBpbjsJCQkJCQkJXAorCXN0cnVjdCBpcnFfcGluX2xpc3QgKmVudHJ5ID0gaXJxXzJfcGluICsgaXJxOwkJCVwKKwkJCQkJCQkJCVwKKwlmb3IgKDs7KSB7CQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IHJlZzsJCQkJCVwKKwkJcGluID0gZW50cnktPnBpbjsJCQkJCVwKKwkJaWYgKHBpbiA9PSAtMSkJCQkJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCXJlZyA9IGlvX2FwaWNfcmVhZChlbnRyeS0+YXBpYywgMHgxMCArIFIgKyBwaW4qMik7CVwKKwkJcmVnIEFDVElPTjsJCQkJCQlcCisJCWlvX2FwaWNfbW9kaWZ5KGVudHJ5LT5hcGljLCByZWcpOwkJCVwKKwkJaWYgKCFlbnRyeS0+bmV4dCkJCQkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJZW50cnkgPSBpcnFfMl9waW4gKyBlbnRyeS0+bmV4dDsJCQlcCisJfQkJCQkJCQkJXAorCUZJTkFMOwkJCQkJCQkJXAorfQorCisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIHZvaWQgc2V0X2lvYXBpY19hZmZpbml0eV9pcnEodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IG1hc2spCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZGVzdDsKKwljcHVtYXNrX3QgdG1wOworCisJY3B1c19hbmQodG1wLCBtYXNrLCBjcHVfb25saW5lX21hcCk7CisJaWYgKGNwdXNfZW1wdHkodG1wKSkKKwkJdG1wID0gVEFSR0VUX0NQVVM7CisKKwljcHVzX2FuZChtYXNrLCB0bXAsIENQVV9NQVNLX0FMTCk7CisKKwlkZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKG1hc2spOworCisJLyoKKwkgKiBPbmx5IHRoZSBoaWdoIDggYml0cyBhcmUgdmFsaWQuCisJICovCisJZGVzdCA9IFNFVF9BUElDX0xPR0lDQUxfSUQoZGVzdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlfX0RPX0FDVElPTigxLCA9IGRlc3QsICkKKwlzZXRfaXJxX2luZm8oaXJxLCBtYXNrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworfQorI2VuZGlmCisKIC8qCiAgKiBUaGUgY29tbW9uIGNhc2UgaXMgMToxIElSUTwtPnBpbiBtYXBwaW5ncy4gU29tZXRpbWVzIHRoZXJlIGFyZQogICogc2hhcmVkIElTQS1zcGFjZSBJUlFzLCBzbyB3ZSBoYXZlIHRvIHN1cHBvcnQgdGhlbS4gV2UgYXJlIHN1cGVyCkBAIC0xMDEsMjYgKzE0OSw2IEBACiAJZW50cnktPnBpbiA9IHBpbjsKIH0KIAotI2RlZmluZSBfX0RPX0FDVElPTihSLCBBQ1RJT04sIEZJTkFMKQkJCQkJXAotCQkJCQkJCQkJXAotewkJCQkJCQkJCVwKLQlpbnQgcGluOwkJCQkJCQlcCi0Jc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnkgPSBpcnFfMl9waW4gKyBpcnE7CQkJXAotCQkJCQkJCQkJXAotCWZvciAoOzspIHsJCQkJCQkJXAotCQl1bnNpZ25lZCBpbnQgcmVnOwkJCQkJXAotCQlwaW4gPSBlbnRyeS0+cGluOwkJCQkJXAotCQlpZiAocGluID09IC0xKQkJCQkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJcmVnID0gaW9fYXBpY19yZWFkKGVudHJ5LT5hcGljLCAweDEwICsgUiArIHBpbioyKTsJXAotCQlyZWcgQUNUSU9OOwkJCQkJCVwKLQkJaW9fYXBpY19tb2RpZnkoZW50cnktPmFwaWMsIHJlZyk7CQkJXAotCQlpZiAoIWVudHJ5LT5uZXh0KQkJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQllbnRyeSA9IGlycV8yX3BpbiArIGVudHJ5LT5uZXh0OwkJCVwKLQl9CQkJCQkJCQlcCi0JRklOQUw7CQkJCQkJCQlcCi19CiAKICNkZWZpbmUgRE9fQUNUSU9OKG5hbWUsUixBQ1RJT04sIEZJTkFMKQkJCQkJXAogCQkJCQkJCQkJXApAQCAtNjU1LDcgKzY4Myw3IEBACiB9CiAKIC8qIGlycV92ZWN0b3JzIGlzIGluZGV4ZWQgYnkgdGhlIHN1bSBvZiBhbGwgUlRFcyBpbiBhbGwgSS9PIEFQSUNzLiAqLwotdTggaXJxX3ZlY3RvcltOUl9JUlFfVkVDVE9SU10gPSB7IEZJUlNUX0RFVklDRV9WRUNUT1IgLCAwIH07Cit1OCBpcnFfdmVjdG9yW05SX0lSUV9WRUNUT1JTXSBfX3JlYWRfbW9zdGx5ID0geyBGSVJTVF9ERVZJQ0VfVkVDVE9SICwgMCB9OwogCiBpbnQgYXNzaWduX2lycV92ZWN0b3IoaW50IGlycSkKIHsKQEAgLTc2Nyw2ICs3OTUsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAkJaW9fYXBpY193cml0ZShhcGljLCAweDExKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSsxKSk7CiAJCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMCsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMCkpOworCQlzZXRfbmF0aXZlX2lycV9pbmZvKGlycSwgVEFSR0VUX0NQVVMpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwogCX0KIAl9CkBAIC0xMTM4LDkgKzExNjcsOSBAQAogCWNsZWFyX0lPX0FQSUMoKTsKIAogCS8qCi0JICogSWYgdGhlIGk4MjU1OSBpcyByb3V0ZWQgdGhyb3VnaCBhbiBJT0FQSUMKKwkgKiBJZiB0aGUgaTgyNTkgaXMgcm91dGVkIHRocm91Z2ggYW4gSU9BUElDCiAJICogUHV0IHRoYXQgSU9BUElDIGluIHZpcnR1YWwgd2lyZSBtb2RlCi0JICogc28gbGVnYWN5IGludGVycnVwcyBjYW4gYmUgZGVsaXZlcmVkLgorCSAqIHNvIGxlZ2FjeSBpbnRlcnJ1cHRzIGNhbiBiZSBkZWxpdmVyZWQuCiAJICovCiAJcGluID0gZmluZF9pc2FfaXJxX3BpbigwLCBtcF9FeHRJTlQpOwogCWlmIChwaW4gIT0gLTEpIHsKQEAgLTEzMTQsNiArMTM0Myw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGFja19lZGdlX2lvYXBpY19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKKwltb3ZlX2lycShpcnEpOwogCWlmICgoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX1BFTkRJTkcgfCBJUlFfRElTQUJMRUQpKQogCQkJCQk9PSAoSVJRX1BFTkRJTkcgfCBJUlFfRElTQUJMRUQpKQogCQltYXNrX0lPX0FQSUNfaXJxKGlycSk7CkBAIC0xMzQzLDI2ICsxMzczLDEwIEBACiAKIHN0YXRpYyB2b2lkIGVuZF9sZXZlbF9pb2FwaWNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQogeworCW1vdmVfaXJxKGlycSk7CiAJYWNrX0FQSUNfaXJxKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGRlc3Q7Ci0KLQlkZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKG1hc2spOwotCi0JLyoKLQkgKiBPbmx5IHRoZSBoaWdoIDggYml0cyBhcmUgdmFsaWQuCi0JICovCi0JZGVzdCA9IFNFVF9BUElDX0xPR0lDQUxfSUQoZGVzdCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQlfX0RPX0FDVElPTigxLCA9IGRlc3QsICkKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotfQotCiAjaWZkZWYgQ09ORklHX1BDSV9NU0kKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9lZGdlX2lvYXBpY192ZWN0b3IodW5zaWduZWQgaW50IHZlY3RvcikKIHsKQEAgLTEzNzUsNiArMTM4OSw3IEBACiB7CiAJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKIAorCW1vdmVfbmF0aXZlX2lycSh2ZWN0b3IpOwogCWFja19lZGdlX2lvYXBpY19pcnEoaXJxKTsKIH0KIApAQCAtMTM4OSw2ICsxNDA0LDcgQEAKIHsKIAlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOwogCisJbW92ZV9uYXRpdmVfaXJxKHZlY3Rvcik7CiAJZW5kX2xldmVsX2lvYXBpY19pcnEoaXJxKTsKIH0KIApAQCAtMTQwNiwxNCArMTQyMiwxNyBAQAogCXVubWFza19JT19BUElDX2lycShpcnEpOwogfQogCisjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIHZvaWQgc2V0X2lvYXBpY19hZmZpbml0eV92ZWN0b3IgKHVuc2lnbmVkIGludCB2ZWN0b3IsCiAJCQkJCWNwdW1hc2tfdCBjcHVfbWFzaykKIHsKIAlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOwogCisJc2V0X25hdGl2ZV9pcnFfaW5mbyh2ZWN0b3IsIGNwdV9tYXNrKTsKIAlzZXRfaW9hcGljX2FmZmluaXR5X2lycShpcnEsIGNwdV9tYXNrKTsKIH0KLSNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TTVAKKyNlbmRpZiAvLyBDT05GSUdfUENJX01TSQogCiAvKgogICogTGV2ZWwgYW5kIGVkZ2UgdHJpZ2dlcmVkIElPLUFQSUMgaW50ZXJydXB0cyBuZWVkIGRpZmZlcmVudCBoYW5kbGluZywKQEAgLTE0MjQsNyArMTQ0Myw3IEBACiAgKiByYWNlcy4KICAqLwogCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19lZGdlX3R5cGUgPSB7CitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19lZGdlX3R5cGUgX19yZWFkX21vc3RseSA9IHsKIAkudHlwZW5hbWUgPSAiSU8tQVBJQy1lZGdlIiwKIAkuc3RhcnR1cCAJPSBzdGFydHVwX2VkZ2VfaW9hcGljLAogCS5zaHV0ZG93biAJPSBzaHV0ZG93bl9lZGdlX2lvYXBpYywKQEAgLTE0MzIsMTAgKzE0NTEsMTIgQEAKIAkuZGlzYWJsZSAJPSBkaXNhYmxlX2VkZ2VfaW9hcGljLAogCS5hY2sgCQk9IGFja19lZGdlX2lvYXBpYywKIAkuZW5kIAkJPSBlbmRfZWRnZV9pb2FwaWMsCisjaWZkZWYgQ09ORklHX1NNUAogCS5zZXRfYWZmaW5pdHkgPSBzZXRfaW9hcGljX2FmZmluaXR5LAorI2VuZGlmCiB9OwogCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19sZXZlbF90eXBlID0geworc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpb2FwaWNfbGV2ZWxfdHlwZSBfX3JlYWRfbW9zdGx5ID0gewogCS50eXBlbmFtZSA9ICJJTy1BUElDLWxldmVsIiwKIAkuc3RhcnR1cCAJPSBzdGFydHVwX2xldmVsX2lvYXBpYywKIAkuc2h1dGRvd24gCT0gc2h1dGRvd25fbGV2ZWxfaW9hcGljLApAQCAtMTQ0Myw3ICsxNDY0LDkgQEAKIAkuZGlzYWJsZSAJPSBkaXNhYmxlX2xldmVsX2lvYXBpYywKIAkuYWNrIAkJPSBtYXNrX2FuZF9hY2tfbGV2ZWxfaW9hcGljLAogCS5lbmQgCQk9IGVuZF9sZXZlbF9pb2FwaWMsCisjaWZkZWYgQ09ORklHX1NNUAogCS5zZXRfYWZmaW5pdHkgPSBzZXRfaW9hcGljX2FmZmluaXR5LAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9JT19BUElDX3RyYXBzKHZvaWQpCkBAIC0xNTA2LDcgKzE1MjksNyBAQAogCiBzdGF0aWMgdm9pZCBlbmRfbGFwaWNfaXJxICh1bnNpZ25lZCBpbnQgaSkgeyAvKiBub3RoaW5nICovIH0KIAotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBsYXBpY19pcnFfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgbGFwaWNfaXJxX3R5cGUgX19yZWFkX21vc3RseSA9IHsKIAkudHlwZW5hbWUgPSAibG9jYWwtQVBJQy1lZGdlIiwKIAkuc3RhcnR1cCA9IE5VTEwsIC8qIHN0YXJ0dXBfaXJxKCkgbm90IHVzZWQgZm9yIElSUTAgKi8KIAkuc2h1dGRvd24gPSBOVUxMLCAvKiBzaHV0ZG93bl9pcnEoKSBub3QgdXNlZCBmb3IgSVJRMCAqLwpAQCAtMTg0MSw3ICsxODY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSS1iYXNlZCBJT0FQSUMgQ29uZmlndXJhdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogCiAjZGVmaW5lIElPX0FQSUNfTUFYX0lECQkweEZFCiAKQEAgLTE5MTgsMTIgKzE5NDEsMTMgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAlpb19hcGljX3dyaXRlKGlvYXBpYywgMHgxMSsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMSkpOwogCWlvX2FwaWNfd3JpdGUoaW9hcGljLCAweDEwKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSswKSk7CisJc2V0X25hdGl2ZV9pcnFfaW5mbyh1c2VfcGNpX3ZlY3RvcigpID8gIGVudHJ5LnZlY3RvciA6IGlycSwgVEFSR0VUX0NQVVMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmIC8qQ09ORklHX0FDUElfQk9PVCovCisjZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KIAogCiAvKgpAQCAtMTkzMSw2ICsxOTU1LDcgQEAKICAqIHdlIG5lZWQgdG8gcmVwcm9ncmFtIHRoZSBpb3JlZHRibHMgdG8gY2F0ZXIgZm9yIHRoZSBjcHVzIHdoaWNoIGhhdmUgY29tZSBvbmxpbmUKICAqIHNvIG1hc2sgaW4gYWxsIGNhc2VzIHNob3VsZCBzaW1wbHkgYmUgVEFSR0VUX0NQVVMKICAqLworI2lmZGVmIENPTkZJR19TTVAKIHZvaWQgX19pbml0IHNldHVwX2lvYXBpY19kZXN0KHZvaWQpCiB7CiAJaW50IHBpbiwgaW9hcGljLCBpcnEsIGlycV9lbnRyeTsKQEAgLTE5NDksMyArMTk3NCw0IEBACiAKIAl9CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDVjNmRjNzAuLmRmMDhjNDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2twcm9iZXMuYwpAQCAtNzQsNyArNzQsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoraW50IF9fa3Byb2JlcyBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJLyogaW5zbjogbXVzdCBiZSBvbiBzcGVjaWFsIGV4ZWN1dGFibGUgcGFnZSBvbiB4ODZfNjQuICovCiAJdXAoJmtwcm9iZV9tdXRleCk7CkBAIC0xODksNyArMTg5LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJczMyICpyaXBkaXNwOwogCW1lbWNweShwLT5haW5zbi5pbnNuLCBwLT5hZGRyLCBNQVhfSU5TTl9TSVpFKTsKQEAgLTIxNSwyMSArMjE1LDIxIEBACiAJcC0+b3Bjb2RlID0gKnAtPmFkZHI7CiB9CiAKLXZvaWQgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAkqcC0+YWRkciA9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT047CiAJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBwLT5hZGRyLAogCQkJICAgKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIgKyBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CiB9CiAKLXZvaWQgYXJjaF9kaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2Rpc2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAkqcC0+YWRkciA9IHAtPm9wY29kZTsKIAlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIsCiAJCQkgICAodW5zaWduZWQgbG9uZykgcC0+YWRkciArIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKIH0KIAotdm9pZCBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3ZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXVwKCZrcHJvYmVfbXV0ZXgpOwogCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24pOwpAQCAtMjYxLDcgKzI2MSw3IEBACiAJCWtwcm9iZV9zYXZlZF9yZmxhZ3MgJj0gfklGX01BU0s7CiB9CiAKLXN0YXRpYyB2b2lkIHByZXBhcmVfc2luZ2xlc3RlcChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBwcmVwYXJlX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJcmVncy0+ZWZsYWdzIHw9IFRGX01BU0s7CiAJcmVncy0+ZWZsYWdzICY9IH5JRl9NQVNLOwpAQCAtMjcyLDcgKzI3Miw4IEBACiAJCXJlZ3MtPnJpcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFpbnNuLmluc247CiB9CiAKLXZvaWQgYXJjaF9wcmVwYXJlX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit2b2lkIF9fa3Byb2JlcyBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgKnNhcmEgPSAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnJzcDsKICAgICAgICAgc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CkBAIC0yOTUsNyArMjk2LDcgQEAKICAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IGFzIHRyYXAzIGlzIGFuIGludGVycnVwdCBnYXRlIGFuZCB0aGV5CiAgKiByZW1haW4gZGlzYWJsZWQgdGhvcm91Z2ggb3V0IHRoaXMgZnVuY3Rpb24uCiAgKi8KLWludCBrcHJvYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMga3Byb2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGtwcm9iZSAqcDsKIAlpbnQgcmV0ID0gMDsKQEAgLTMxMCw3ICszMTEsOCBAQAogCQkgICBEaXNhcm0gdGhlIHByb2JlIHdlIGp1c3QgaGl0LCBhbmQgaWdub3JlIGl0LiAqLwogCQlwID0gZ2V0X2twcm9iZShhZGRyKTsKIAkJaWYgKHApIHsKLQkJCWlmIChrcHJvYmVfc3RhdHVzID09IEtQUk9CRV9ISVRfU1MpIHsKKwkJCWlmIChrcHJvYmVfc3RhdHVzID09IEtQUk9CRV9ISVRfU1MgJiYKKwkJCQkqcC0+YWluc24uaW5zbiA9PSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OKSB7CiAJCQkJcmVncy0+ZWZsYWdzICY9IH5URl9NQVNLOwogCQkJCXJlZ3MtPmVmbGFncyB8PSBrcHJvYmVfc2F2ZWRfcmZsYWdzOwogCQkJCXVubG9ja19rcHJvYmVzKCk7CkBAIC0zNjAsNyArMzYyLDEwIEBACiAJCQkgKiBlaXRoZXIgYSBwcm9iZXBvaW50IG9yIGEgZGVidWdnZXIgYnJlYWtwb2ludAogCQkJICogYXQgdGhpcyBhZGRyZXNzLiAgSW4gZWl0aGVyIGNhc2UsIG5vIGZ1cnRoZXIKIAkJCSAqIGhhbmRsaW5nIG9mIHRoaXMgaW50ZXJydXB0IGlzIGFwcHJvcHJpYXRlLgorCQkJICogQmFjayB1cCBvdmVyIHRoZSAobm93IG1pc3NpbmcpIGludDMgYW5kIHJ1bgorCQkJICogdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uLgogCQkJICovCisJCQlyZWdzLT5yaXAgPSAodW5zaWduZWQgbG9uZylhZGRyOwogCQkJcmV0ID0gMTsKIAkJfQogCQkvKiBOb3Qgb25lIG9mIG91cnM6IGxldCBrZXJuZWwgaGFuZGxlIGl0ICovCkBAIC0zOTksNyArNDA0LDcgQEAKIC8qCiAgKiBDYWxsZWQgd2hlbiB3ZSBoaXQgdGhlIHByb2JlIHBvaW50IGF0IGtyZXRwcm9iZV90cmFtcG9saW5lCiAgKi8KLWludCB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitpbnQgX19rcHJvYmVzIHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKICAgICAgICAgc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmkgPSBOVUxMOwogICAgICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKQEAgLTQ3OCw3ICs0ODMsNyBAQAogICogdGhhdCBpcyBhdG9wIHRoZSBzdGFjayBpcyB0aGUgYWRkcmVzcyBmb2xsb3dpbmcgdGhlIGNvcGllZCBpbnN0cnVjdGlvbi4KICAqIFdlIG5lZWQgdG8gbWFrZSBpdCB0aGUgYWRkcmVzcyBmb2xsb3dpbmcgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uLgogICovCi1zdGF0aWMgdm9pZCByZXN1bWVfZXhlY3V0aW9uKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19rcHJvYmVzIHJlc3VtZV9leGVjdXRpb24oc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyAqdG9zID0gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5yc3A7CiAJdW5zaWduZWQgbG9uZyBuZXh0X3JpcCA9IDA7CkBAIC01MzYsNyArNTQxLDcgQEAKICAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IGFzIHRyYXAxIGlzIGFuIGludGVycnVwdCBnYXRlIGFuZCB0aGV5CiAgKiByZW1haW4gZGlzYWJsZWQgdGhvcm91Z2hvdXQgdGhpcyBmdW5jdGlvbi4gIEFuZCB3ZSBob2xkIGtwcm9iZSBsb2NrLgogICovCi1pbnQgcG9zdF9rcHJvYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgcG9zdF9rcHJvYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpZiAoIWtwcm9iZV9ydW5uaW5nKCkpCiAJCXJldHVybiAwOwpAQCAtNTcxLDcgKzU3Niw3IEBACiB9CiAKIC8qIEludGVycnVwdHMgZGlzYWJsZWQsIGtwcm9iZV9sb2NrIGhlbGQuICovCi1pbnQga3Byb2JlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCB0cmFwbnIpCitpbnQgX19rcHJvYmVzIGtwcm9iZV9mYXVsdF9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgdHJhcG5yKQogewogCWlmIChjdXJyZW50X2twcm9iZS0+ZmF1bHRfaGFuZGxlcgogCSAgICAmJiBjdXJyZW50X2twcm9iZS0+ZmF1bHRfaGFuZGxlcihjdXJyZW50X2twcm9iZSwgcmVncywgdHJhcG5yKSkKQEAgLTU5MCw4ICs1OTUsOCBAQAogLyoKICAqIFdyYXBwZXIgcm91dGluZSBmb3IgaGFuZGxpbmcgZXhjZXB0aW9ucy4KICAqLwotaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgdmFsLAotCQkJICAgICB2b2lkICpkYXRhKQoraW50IF9fa3Byb2JlcyBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZGllX2FyZ3MgKmFyZ3MgPSAoc3RydWN0IGRpZV9hcmdzICopZGF0YTsKIAlzd2l0Y2ggKHZhbCkgewpAQCAtNjE5LDcgKzYyNCw3IEBACiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCi1pbnQgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IF9fa3Byb2JlcyBzZXRqbXBfcHJlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGpwcm9iZSAqanAgPSBjb250YWluZXJfb2YocCwgc3RydWN0IGpwcm9iZSwga3ApOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKQEAgLTY0MCw3ICs2NDUsNyBAQAogCXJldHVybiAxOwogfQogCi12b2lkIGpwcm9iZV9yZXR1cm4odm9pZCkKK3ZvaWQgX19rcHJvYmVzIGpwcm9iZV9yZXR1cm4odm9pZCkKIHsKIAlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJYXNtIHZvbGF0aWxlICgiICAgICAgIHhjaGcgICAlJXJieCwlJXJzcCAgICAgXG4iCkBAIC02NTEsNyArNjU2LDcgQEAKIAkJICAgICAgKGpwcm9iZV9zYXZlZF9yc3ApOiJtZW1vcnkiKTsKIH0KIAotaW50IGxvbmdqbXBfYnJlYWtfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgbG9uZ2ptcF9icmVha19oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXU4ICphZGRyID0gKHU4ICopIChyZWdzLT5yaXAgLSAxKTsKIAl1bnNpZ25lZCBsb25nIHN0YWNrX2FkZHIgPSAodW5zaWduZWQgbG9uZylqcHJvYmVfc2F2ZWRfcnNwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL21wcGFyc2UuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tcHBhcnNlLmMKaW5kZXggNzljMzYyZC4uOGQ4ZWQ2YSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL21wcGFyc2UuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbXBwYXJzZS5jCkBAIC03NCw3ICs3NCw3IEBACiBwaHlzaWRfbWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwID0gUEhZU0lEX01BU0tfTk9ORTsKIAogLyogQUNQSSBNQURUIGVudHJ5IHBhcnNpbmcgZnVuY3Rpb25zICovCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVAorI2lmZGVmIENPTkZJR19BQ1BJCiBleHRlcm4gc3RydWN0IGFjcGlfYm9vdF9mbGFncyBhY3BpX2Jvb3Q7CiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiBleHRlcm4gaW50IGFjcGlfcGFyc2VfbGFwaWMgKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIpOwpAQCAtODQsNyArODQsNyBAQAogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogZXh0ZXJuIGludCBhY3BpX3BhcnNlX2lvYXBpYyAoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlcik7CiAjZW5kaWYgLypDT05GSUdfWDg2X0lPX0FQSUMqLwotI2VuZGlmIC8qQ09ORklHX0FDUElfQk9PVCovCisjZW5kaWYgLypDT05GSUdfQUNQSSovCiAKIHU4IGJpb3NfY3B1X2FwaWNpZFtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07CiAKQEAgLTUxOSw4ICs1MTksNiBAQAogCXN0cnVjdCBpbnRlbF9tcF9mbG9hdGluZyAqbXBmID0gbXBmX2ZvdW5kOwogCiAJLyoKLSAJICogQUNQSSBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGVudGlyZSBTTVAgY29uZmlndXJhdGlvbiBvciBqdXN0IHRvIAotIAkgKiBlbnVtZXJhdGUvY29uZmlndXJlIHByb2Nlc3NvcnMgKENPTkZJR19BQ1BJX0JPT1QpLiAgTm90ZSB0aGF0IAogIAkgKiBBQ1BJIHN1cHBvcnRzIGJvdGggbG9naWNhbCAoZS5nLiBIeXBlci1UaHJlYWRpbmcpIGFuZCBwaHlzaWNhbCAKICAJICogcHJvY2Vzc29ycywgd2hlcmUgTVBTIG9ubHkgc3VwcG9ydHMgcGh5c2ljYWwuCiAgCSAqLwpAQCAtNjczLDcgKzY3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSS1iYXNlZCBNUCBDb25maWd1cmF0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVAorI2lmZGVmIENPTkZJR19BQ1BJCiAKIHZvaWQgX19pbml0IG1wX3JlZ2lzdGVyX2xhcGljX2FkZHJlc3MgKAogCXU2NAkJCWFkZHJlc3MpCkBAIC05MjksMTEgKzkyNyw5IEBACiAJaWYgKGFjcGlfaXJxX21vZGVsICE9IEFDUElfSVJRX01PREVMX0lPQVBJQykKIAkJcmV0dXJuIGdzaTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JVUwogCS8qIERvbid0IHNldCB1cCB0aGUgQUNQSSBTQ0kgYmVjYXVzZSBpdCdzIGFscmVhZHkgc2V0IHVwICovCiAJaWYgKGFjcGlfZmFkdC5zY2lfaW50ID09IGdzaSkKIAkJcmV0dXJuIGdzaTsKLSNlbmRpZgogCiAJaW9hcGljID0gbXBfZmluZF9pb2FwaWMoZ3NpKTsKIAlpZiAoaW9hcGljIDwgMCkgewpAQCAtOTczLDEzICs5NjksMTEgQEAKIAkJaWYgKGdzaSA8IE1BWF9HU0lfTlVNKSB7CiAJCQlpZiAoZ3NpID4gMTUpCiAJCQkJZ3NpID0gcGNpX2lycSsrOwotI2lmZGVmIENPTkZJR19BQ1BJX0JVUwogCQkJLyoKIAkJCSAqIERvbid0IGFzc2lnbiBJUlEgdXNlZCBieSBBQ1BJIFNDSQogCQkJICovCiAJCQlpZiAoZ3NpID09IGFjcGlfZmFkdC5zY2lfaW50KQogCQkJCWdzaSA9IHBjaV9pcnErKzsKLSNlbmRpZgogCQkJZ3NpX3RvX2lycVtpcnFdID0gZ3NpOwogCQl9IGVsc2UgewogCQkJcHJpbnRrKEtFUk5fRVJSICJHU0kgJXUgaXMgdG9vIGhpZ2hcbiIsIGdzaSk7CkBAIC05OTQsNCArOTg4LDQgQEAKIH0KIAogI2VuZGlmIC8qQ09ORklHX1g4Nl9JT19BUElDKi8KLSNlbmRpZiAvKkNPTkZJR19BQ1BJX0JPT1QqLworI2VuZGlmIC8qQ09ORklHX0FDUEkqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL25taS5jIGIvYXJjaC94ODZfNjQva2VybmVsL25taS5jCmluZGV4IDRlNDRkNmUuLmNhZjE2NDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKQEAgLTI5MCw3ICsyOTAsNyBAQAogCiBzdGF0aWMgaW50IG5taV9wbV9hY3RpdmU7IC8qIG5taV9hY3RpdmUgYmVmb3JlIHN1c3BlbmQgKi8KIAotc3RhdGljIGludCBsYXBpY19ubWlfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCB1MzIgc3RhdGUpCitzdGF0aWMgaW50IGxhcGljX25taV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlubWlfcG1fYWN0aXZlID0gbm1pX2FjdGl2ZTsKIAlkaXNhYmxlX2xhcGljX25taV93YXRjaGRvZygpOwpAQCAtNDYzLDYgKzQ2Myw4IEBACiAJICovCiAJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKIAkJcGVyX2NwdShubWlfdG91Y2gsIGkpID0gMTsKKworIAl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiB9CiAKIHZvaWQgbm1pX3dhdGNoZG9nX3RpY2sgKHN0cnVjdCBwdF9yZWdzICogcmVncywgdW5zaWduZWQgcmVhc29uKQpAQCAtNTIyLDE0ICs1MjQsMTQgQEAKIAogCW5taV9lbnRlcigpOwogCWFkZF9wZGEoX19ubWlfY291bnQsMSk7Ci0JaWYgKCFubWlfY2FsbGJhY2socmVncywgY3B1KSkKKwlpZiAoIXJjdV9kZXJlZmVyZW5jZShubWlfY2FsbGJhY2spKHJlZ3MsIGNwdSkpCiAJCWRlZmF1bHRfZG9fbm1pKHJlZ3MpOwogCW5taV9leGl0KCk7CiB9CiAKIHZvaWQgc2V0X25taV9jYWxsYmFjayhubWlfY2FsbGJhY2tfdCBjYWxsYmFjaykKIHsKLQlubWlfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwlyY3VfYXNzaWduX3BvaW50ZXIobm1pX2NhbGxiYWNrLCBjYWxsYmFjayk7CiB9CiAKIHZvaWQgdW5zZXRfbm1pX2NhbGxiYWNrKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCA3NTc3ZjlkLi44NjYxZjgyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTMxMCw2ICszMTAsNyBAQAogCiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlwcmludGsoIkNQVSAlZDoiLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCV9fc2hvd19yZWdzKHJlZ3MpOwogCXNob3dfdHJhY2UoJnJlZ3MtPnJzcCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IDExNmE0OTEuLjlhZWM1MjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCkBAIC02NSwxMyArNjUsMTMgQEAKICAqIE1hY2hpbmUgc2V0dXAuLgogICovCiAKLXN0cnVjdCBjcHVpbmZvX3g4NiBib290X2NwdV9kYXRhOworc3RydWN0IGNwdWluZm9feDg2IGJvb3RfY3B1X2RhdGEgX19yZWFkX21vc3RseTsKIAogdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzOwogCiBpbnQgYWNwaV9kaXNhYmxlZDsKIEVYUE9SVF9TWU1CT0woYWNwaV9kaXNhYmxlZCk7Ci0jaWZkZWYJQ09ORklHX0FDUElfQk9PVAorI2lmZGVmCUNPTkZJR19BQ1BJCiBleHRlcm4gaW50IF9faW5pdGRhdGEgYWNwaV9odDsKIGV4dGVybiBhY3BpX2ludGVycnVwdF9mbGFncwlhY3BpX3NjaV9mbGFnczsKIGludCBfX2luaXRkYXRhIGFjcGlfZm9yY2UgPSAwOwpAQCAtMjk0LDcgKzI5NCw3IEBACiAJCQltYXhjcHVzID0gc2ltcGxlX3N0cnRvdWwoZnJvbSArIDgsIE5VTEwsIDApOwogCQl9CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAkJLyogImFjcGk9b2ZmIiBkaXNhYmxlcyBib3RoIEFDUEkgdGFibGUgcGFyc2luZyBhbmQgaW50ZXJwcmV0ZXIgaW5pdCAqLwogCQlpZiAoIW1lbWNtcChmcm9tLCAiYWNwaT1vZmYiLCA4KSkKIAkJCWRpc2FibGVfYWNwaSgpOwpAQCAtNTY2LDcgKzU2Niw3IEBACiAKIAlpbml0X21lbW9yeV9tYXBwaW5nKDAsIChlbmRfcGZuX21hcCA8PCBQQUdFX1NISUZUKSk7CiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAkvKgogCSAqIEluaXRpYWxpemUgdGhlIEFDUEkgYm9vdC10aW1lIHRhYmxlIHBhcnNlciAoZ2V0cyB0aGUgUlNEUCBhbmQgU0RUKS4KIAkgKiBDYWxsIHRoaXMgZWFybHkgZm9yIFNSQVQgbm9kZSBzZXR1cC4KQEAgLTY1OCw3ICs2NTgsNyBAQAogCiAJY2hlY2tfaW9hcGljKCk7CiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAkvKgogCSAqIFJlYWQgQVBJQyBhbmQgc29tZSBvdGhlciBlYXJseSBpbmZvcm1hdGlvbiBmcm9tIEFDUEkgdGFibGVzLgogCSAqLwpAQCAtOTI5LDcgKzkyOSw3IEBACiAgCWMtPng4Nl9udW1fY29yZXMgPSBpbnRlbF9udW1fY3B1X2NvcmVzKGMpOwogfQogCi12b2lkIF9fY3B1aW5pdCBnZXRfY3B1X3ZlbmRvcihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgZ2V0X2NwdV92ZW5kb3Ioc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCWNoYXIgKnYgPSBjLT54ODZfdmVuZG9yX2lkOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXA2NC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwNjQuYwppbmRleCAzNDA4MmMxLi5lM2ZmY2FjIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXA2NC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cDY0LmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogY2hhciBib290X2NwdV9zdGFja1tJUlFTVEFDS1NJWkVdIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5ic3MucGFnZV9hbGlnbmVkIikpKTsKIAotdW5zaWduZWQgbG9uZyBfX3N1cHBvcnRlZF9wdGVfbWFzayA9IH4wVUw7Cit1bnNpZ25lZCBsb25nIF9fc3VwcG9ydGVkX3B0ZV9tYXNrIF9fcmVhZF9tb3N0bHkgPSB+MFVMOwogc3RhdGljIGludCBkb19ub3RfbnggX19pbml0ZGF0YSA9IDA7CiAKIC8qIG5vZXhlYz1vbnxvZmYKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCmluZGV4IGZhMjVlMzkuLjRmYjM0YjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYwpAQCAtNjIsMTMgKzYyLDEzIEBACiAvKiBOdW1iZXIgb2Ygc2libGluZ3MgcGVyIENQVSBwYWNrYWdlICovCiBpbnQgc21wX251bV9zaWJsaW5ncyA9IDE7CiAvKiBQYWNrYWdlIElEIG9mIGVhY2ggbG9naWNhbCBDUFUgKi8KLXU4IHBoeXNfcHJvY19pZFtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07Ci11OCBjcHVfY29yZV9pZFtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07Cit1OCBwaHlzX3Byb2NfaWRbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07Cit1OCBjcHVfY29yZV9pZFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0geyBbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUQgfTsKIEVYUE9SVF9TWU1CT0wocGh5c19wcm9jX2lkKTsKIEVYUE9SVF9TWU1CT0woY3B1X2NvcmVfaWQpOwogCiAvKiBCaXRtYXNrIG9mIGN1cnJlbnRseSBvbmxpbmUgQ1BVcyAqLwotY3B1bWFza190IGNwdV9vbmxpbmVfbWFwOworY3B1bWFza190IGNwdV9vbmxpbmVfbWFwIF9fcmVhZF9tb3N0bHk7CiAKIEVYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOwogCkBAIC04OCw4ICs4OCw4IEBACiAvKiBTZXQgd2hlbiB0aGUgaWRsZXJzIGFyZSBhbGwgZm9ya2VkICovCiBpbnQgc21wX3RocmVhZHNfcmVhZHk7CiAKLWNwdW1hc2tfdCBjcHVfc2libGluZ19tYXBbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKLWNwdW1hc2tfdCBjcHVfY29yZV9tYXBbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKK2NwdW1hc2tfdCBjcHVfc2libGluZ19tYXBbTlJfQ1BVU10gX19yZWFkX21vc3RseTsKK2NwdW1hc2tfdCBjcHVfY29yZV9tYXBbTlJfQ1BVU10gX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0woY3B1X2NvcmVfbWFwKTsKIAogLyoKQEAgLTg5NCwyMyArODk0LDYgQEAKIAljcHVfc2V0KDAsIGNwdV9jb3JlX21hcFswXSk7CiB9CiAKLS8qCi0gKiBIYW5kbGUgdXNlciBjcHVzPS4uLiBwYXJhbWV0ZXIuCi0gKi8KLXN0YXRpYyBfX2luaXQgdm9pZCBlbmZvcmNlX21heF9jcHVzKHVuc2lnbmVkIG1heF9jcHVzKQotewotCWludCBpLCBrOwotCWsgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKLQkJaWYgKCFjcHVfcG9zc2libGUoaSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCsrayA+IG1heF9jcHVzKSB7Ci0JCQljcHVfY2xlYXIoaSwgY3B1X3Bvc3NpYmxlX21hcCk7Ci0JCQljcHVfY2xlYXIoaSwgY3B1X3ByZXNlbnRfbWFwKTsKLQkJfQotCX0KLX0KLQogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogLyoKICAqIGNwdV9wb3NzaWJsZV9tYXAgc2hvdWxkIGJlIHN0YXRpYywgaXQgY2Fubm90IGNoYW5nZSBhcyBjcHUncwpAQCAtOTk5LDggKzk4Miw2IEBACiAJY3VycmVudF9jcHVfZGF0YSA9IGJvb3RfY3B1X2RhdGE7CiAJY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHUgPSAwOyAgLyogbmVlZGVkPyAqLwogCi0JZW5mb3JjZV9tYXhfY3B1cyhtYXhfY3B1cyk7Ci0KICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAlwcmVmaWxsX3Bvc3NpYmxlX21hcCgpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZF9hc20uUyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zdXNwZW5kX2FzbS5TCmluZGV4IDUzZjhlMTYuLjRkNjU5ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zdXNwZW5kX2FzbS5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zdXNwZW5kX2FzbS5TCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIEVOVFJZKHN3c3VzcF9hcmNoX3N1c3BlbmQpCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCmluZGV4IDY2YmY2ZGQuLjdiNmFiZTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYwpAQCAtMTc2LDEwICsxNzYsNyBAQAogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ4dGltZSwgc2VjLCBuc2VjKTsKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsIHd0bV9zZWMsIHd0bV9uc2VjKTsKIAotCXRpbWVfYWRqdXN0ID0gMDsJCS8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLwotCXRpbWVfc3RhdHVzIHw9IFNUQV9VTlNZTkM7Ci0JdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKLQl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworCW50cF9jbGVhcigpOwogCiAJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CiAJY2xvY2tfd2FzX3NldCgpOwpAQCAtNDcxLDcgKzQ2OCw3IEBACiAgKiBvZmYpIGlzbid0IGxpa2VseSB0byBnbyBhd2F5IG11Y2ggc29vbmVyIGFueXdheS4KICAqLwogCi0JaWYgKCh+dGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSAmJiB4dGltZS50dl9zZWMgPiBydGNfdXBkYXRlICYmCisJaWYgKG50cF9zeW5jZWQoKSAmJiB4dGltZS50dl9zZWMgPiBydGNfdXBkYXRlICYmCiAJCWFicyh4dGltZS50dl9uc2VjIC0gNTAwMDAwMDAwKSA8PSB0aWNrX25zZWMgLyAyKSB7CiAJCXNldF9ydGNfbW1zcyh4dGltZS50dl9zZWMpOwogCQlydGNfdXBkYXRlID0geHRpbWUudHZfc2VjICsgNjYwOwpAQCAtMTA0MSw2ICsxMDM4LDcgQEAKIAl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jayxmbGFncyk7CiAJamlmZmllcyArPSBzbGVlcF9sZW5ndGg7CiAJd2FsbF9qaWZmaWVzICs9IHNsZWVwX2xlbmd0aDsKKwl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKaW5kZXggNmVhZDQzMy4uZjIzOGQ2MCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDE5LDggKzQyMCw5IEBACiAJZG9fZXhpdChTSUdTRUdWKTsKIH0KIAotc3RhdGljIHZvaWQgZG9fdHJhcChpbnQgdHJhcG5yLCBpbnQgc2lnbnIsIGNoYXIgKnN0ciwgCi0JCQkgICBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSwgc2lnaW5mb190ICppbmZvKQorc3RhdGljIHZvaWQgX19rcHJvYmVzIGRvX3RyYXAoaW50IHRyYXBuciwgaW50IHNpZ25yLCBjaGFyICpzdHIsCisJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSwKKwkJCSAgICAgIHNpZ2luZm9fdCAqaW5mbykKIHsKIAljb25kaXRpb25hbF9zdGkocmVncyk7CiAKQEAgLTUwNCw3ICs1MDYsOCBAQAogRE9fRVJST1IoMTIsIFNJR0JVUywgICJzdGFjayBzZWdtZW50Iiwgc3RhY2tfc2VnbWVudCkKIERPX0VSUk9SKCA4LCBTSUdTRUdWLCAiZG91YmxlIGZhdWx0IiwgZG91YmxlX2ZhdWx0KQogCi1hc21saW5rYWdlIHZvaWQgZG9fZ2VuZXJhbF9wcm90ZWN0aW9uKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQorYXNtbGlua2FnZSB2b2lkIF9fa3Byb2JlcyBkb19nZW5lcmFsX3Byb3RlY3Rpb24oc3RydWN0IHB0X3JlZ3MgKiByZWdzLAorCQkJCQkJbG9uZyBlcnJvcl9jb2RlKQogewogCWNvbmRpdGlvbmFsX3N0aShyZWdzKTsKIApAQCAtNjIyLDcgKzYyNSw3IEBACiAJCWlvX2NoZWNrX2Vycm9yKHJlYXNvbiwgcmVncyk7CiB9CiAKLWFzbWxpbmthZ2Ugdm9pZCBkb19pbnQzKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQorYXNtbGlua2FnZSB2b2lkIF9fa3Byb2JlcyBkb19pbnQzKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQogewogCWlmIChub3RpZnlfZGllKERJRV9JTlQzLCAiaW50MyIsIHJlZ3MsIGVycm9yX2NvZGUsIDMsIFNJR1RSQVApID09IE5PVElGWV9TVE9QKSB7CiAJCXJldHVybjsKQEAgLTY1Myw3ICs2NTYsOCBAQAogfQogCiAvKiBydW5zIG9uIElTVCBzdGFjay4gKi8KLWFzbWxpbmthZ2Ugdm9pZCBkb19kZWJ1ZyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKK2FzbWxpbmthZ2Ugdm9pZCBfX2twcm9iZXMgZG9fZGVidWcoc3RydWN0IHB0X3JlZ3MgKiByZWdzLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKIHsKIAl1bnNpZ25lZCBsb25nIGNvbmRpdGlvbjsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDJhOTRmOWIuLjZkZDY0MmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0yMSw2ICsyMSw3IEBACiAJKigudGV4dCkKIAlTQ0hFRF9URVhUCiAJTE9DS19URVhUCisJS1BST0JFU19URVhUCiAJKiguZml4dXApCiAJKiguZ251Lndhcm5pbmcpCiAJfSA9IDB4OTA5MApAQCAtMTkzLDIwICsxOTQsNyBAQAogI2VuZGlmCiAJfQogCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQotICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIFNUQUJTX0RFQlVHCiAKLQotICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9CisgIERXQVJGX0RFQlVHCiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvY29weV91c2VyLlMgYi9hcmNoL3g4Nl82NC9saWIvY29weV91c2VyLlMKaW5kZXggYmQ1NTZjOC4uZGZhMzU4YiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL2NvcHlfdXNlci5TCisrKyBiL2FyY2gveDg2XzY0L2xpYi9jb3B5X3VzZXIuUwpAQCAtNyw3ICs3LDcgQEAKICNkZWZpbmUgRklYX0FMSUdOTUVOVCAxCiAJCQogCSNpbmNsdWRlIDxhc20vY3VycmVudC5oPgotCSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisJI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCSNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KIAkjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbGliL2dldHVzZXIuUyBiL2FyY2gveDg2XzY0L2xpYi9nZXR1c2VyLlMKaW5kZXggZjgwYmFmZS4uMzg0NGQ1ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL2dldHVzZXIuUworKysgYi9hcmNoL3g4Nl82NC9saWIvZ2V0dXNlci5TCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogCiAJLnRleHQKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2xpYi9wdXR1c2VyLlMgYi9hcmNoL3g4Nl82NC9saWIvcHV0dXNlci5TCmluZGV4IDU4MjhiODEuLjdmNTU5MzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2xpYi9wdXR1c2VyLlMKKysrIGIvYXJjaC94ODZfNjQvbGliL3B1dHVzZXIuUwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KIAogCS50ZXh0CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9tbS9mYXVsdC5jIGIvYXJjaC94ODZfNjQvbW0vZmF1bHQuYwppbmRleCBjYTkxNGMzLi44MTY3MzJkIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9tbS9mYXVsdC5jCisrKyBiL2FyY2gveDg2XzY0L21tL2ZhdWx0LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CQkvKiBGb3IgdW5ibGFua19zY3JlZW4oKSAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0yOTQsNyArMjk1LDggQEAKICAqCWJpdCAyID09IDAgbWVhbnMga2VybmVsLCAxIG1lYW5zIHVzZXItbW9kZQogICogICAgICBiaXQgMyA9PSAxIG1lYW5zIGZhdWx0IHdhcyBhbiBpbnN0cnVjdGlvbiBmZXRjaAogICovCi1hc21saW5rYWdlIHZvaWQgZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQorYXNtbGlua2FnZSB2b2lkIF9fa3Byb2JlcyBkb19wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQl1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW07CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9tbS9udW1hLmMgYi9hcmNoL3g4Nl82NC9tbS9udW1hLmMKaW5kZXggNmExNTZmNS4uMDRmN2EzMyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbW0vbnVtYS5jCisrKyBiL2FyY2gveDg2XzY0L21tL251bWEuYwpAQCAtMjIsMTQgKzIyLDE0IEBACiAjZGVmaW5lIERwcmludGsoeC4uLikKICNlbmRpZgogCi1zdHJ1Y3QgcGdsaXN0X2RhdGEgKm5vZGVfZGF0YVtNQVhfTlVNTk9ERVNdOworc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbTUFYX05VTU5PREVTXSBfX3JlYWRfbW9zdGx5OwogYm9vdG1lbV9kYXRhX3QgcGxhdF9ub2RlX2JkYXRhW01BWF9OVU1OT0RFU107CiAKIGludCBtZW1ub2RlX3NoaWZ0OwogdTggIG1lbW5vZGVtYXBbTk9ERU1BUFNJWkVdOwogCi11bnNpZ25lZCBjaGFyIGNwdV90b19ub2RlW05SX0NQVVNdID0geyBbMCAuLi4gTlJfQ1BVUy0xXSA9IE5VTUFfTk9fTk9ERSB9OwotY3B1bWFza190ICAgICBub2RlX3RvX2NwdW1hc2tbTUFYX05VTU5PREVTXTsKK3Vuc2lnbmVkIGNoYXIgY3B1X3RvX25vZGVbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBOVU1BX05PX05PREUgfTsKK2NwdW1hc2tfdCAgICAgbm9kZV90b19jcHVtYXNrW01BWF9OVU1OT0RFU10gX19yZWFkX21vc3RseTsKIAogaW50IG51bWFfb2ZmIF9faW5pdGRhdGE7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L3BjaS9NYWtlZmlsZSBiL2FyY2gveDg2XzY0L3BjaS9NYWtlZmlsZQppbmRleCAzN2M5MmU4Li5iYjM0ZTVlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvcGNpL01ha2VmaWxlCkBAIC04LDcgKzgsNyBAQAogb2JqLXkJCTo9IGkzODYubwogb2JqLSQoQ09ORklHX1BDSV9ESVJFQ1QpKz0gZGlyZWN0Lm8KIG9iai15CQkrPSBmaXh1cC5vCi1vYmotJChDT05GSUdfQUNQSV9QQ0kpCSs9IGFjcGkubworb2JqLSQoQ09ORklHX0FDUEkpCSs9IGFjcGkubwogb2JqLXkJCQkrPSBsZWdhY3kubyBpcnEubyBjb21tb24ubwogIyBtbWNvbmZpZyBoYXMgYSA2NGJpdCBzcGVjaWFsCiBvYmotJChDT05GSUdfUENJX01NQ09ORklHKSArPSBtbWNvbmZpZy5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9wY2kvTWFrZWZpbGUtQlVTIGIvYXJjaC94ODZfNjQvcGNpL01ha2VmaWxlLUJVUwppbmRleCAyOTE5ODVmLi40ZjBjMDVhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9wY2kvTWFrZWZpbGUtQlVTCisrKyBiL2FyY2gveDg2XzY0L3BjaS9NYWtlZmlsZS1CVVMKQEAgLTgsNyArOCw3IEBACiBvYmoteQkJOj0gaTM4Ni5vCiBvYmotJChDT05GSUdfUENJX0RJUkVDVCkrPSBkaXJlY3Qubwogb2JqLXkJCSs9IGZpeHVwLm8KLW9iai0kKENPTkZJR19BQ1BJX1BDSSkJKz0gYWNwaS5vCitvYmotJChDT05GSUdfQUNQSSkJKz0gYWNwaS5vCiBvYmoteQkJCSs9IGxlZ2FjeS5vIGlycS5vIGNvbW1vbi5vCiAjIG1tY29uZmlnIGhhcyBhIDY0Yml0IHNwZWNpYWwKIG9iai0kKENPTkZJR19QQ0lfTU1DT05GSUcpICs9IG1tY29uZmlnLm8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL01ha2VmaWxlIGIvYXJjaC94dGVuc2EvTWFrZWZpbGUKaW5kZXggMjc4NDdlNC4uNjdlZjRjZCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvTWFrZWZpbGUKKysrIGIvYXJjaC94dGVuc2EvTWFrZWZpbGUKQEAgLTY2LDEzICs2Niw3IEBACiAKIGFyY2hpbmMJCTo9IGluY2x1ZGUvYXNtLXh0ZW5zYQogCi1hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuczogXAotCWFyY2gveHRlbnNhL2tlcm5lbC9hc20tb2Zmc2V0cy5jICQoYXJjaGluYykvLnBsYXRmb3JtCi0KLWluY2x1ZGUvYXNtLXh0ZW5zYS9vZmZzZXRzLmg6IGFyY2gveHRlbnNhL2tlcm5lbC9hc20tb2Zmc2V0cy5zCi0JJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXRzKQotCi1wcmVwYXJlOiAkKGFyY2hpbmMpLy5wbGF0Zm9ybSAkKGFyY2hpbmMpL29mZnNldHMuaAorcHJlcGFyZTogJChhcmNoaW5jKS8ucGxhdGZvcm0KIAogIyBVcGRhdGUgbWFjaGluZSBjcHUgYW5kIHBsYXRmb3JtIHN5bWxpbmtzIGlmIHNvbWV0aGluZyB3aGljaCBhZmZlY3RzCiAjIHRoZW0gY2hhbmdlZC4KQEAgLTk0LDcgKzg4LDcgQEAKIHpJbWFnZSB6SW1hZ2UuaW5pdHJkOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSAkQAogCi1DTEVBTl9GSUxFUwkrPSBhcmNoL3h0ZW5zYS92bWxpbnV4LmxkcyAkKGFyY2hpbmMpL29mZnNldC5oIFwKK0NMRUFOX0ZJTEVTCSs9IGFyY2gveHRlbnNhL3ZtbGludXgubGRzICAgICAgICAgICAgICAgICAgICAgIFwKIAkJICAgJChhcmNoaW5jKS9wbGF0Zm9ybSAkKGFyY2hpbmMpL3h0ZW5zYS9jb25maWcgXAogCQkgICAkKGFyY2hpbmMpLy5wbGF0Zm9ybQogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvYWxpZ24uUyBiL2FyY2gveHRlbnNhL2tlcm5lbC9hbGlnbi5TCmluZGV4IDc0YjFlOTAuLmE0OTU2NTcgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9hbGlnbi5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9hbGlnbi5TCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMKaW5kZXggYzY0YTAxZi4uNWMwMThjNSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMKQEAgLTE0LDcgKzE0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3Byb2Nlc3MuYwppbmRleCA0MDk5NzAzLi5jODNiYjBkIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTQzLDcgKzQzLDcgQEAKICNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9jb3Byb2Nlc3Nvci5oPgogCiBleHRlcm4gdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3RpbWUuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMKaW5kZXggZTA3Mjg3ZC4uMWFjN2Q1YyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdGltZS5jCkBAIC0xMjIsMTAgKzEyMiw3IEBACiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOwogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOwogCi0JdGltZV9hZGp1c3QgPSAwOyAgICAgICAgICAgICAgICAvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE4NCw3ICsxODEsNyBAQAogCQluZXh0ICs9IENDT1VOVF9QRVJfSklGRlk7CiAJCWRvX3RpbWVyIChyZWdzKTsgLyogTGludXggaGFuZGxlciBpbiBrZXJuZWwvdGltZXIuYyAqLwogCi0JCWlmICgodGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSA9PSAwICYmCisJCWlmIChudHBfc3luY2VkKCkgJiYKIAkJICAgIHh0aW1lLnR2X3NlYyAtIGxhc3RfcnRjX3VwZGF0ZSA+PSA2NTkgJiYKIAkJICAgIGFicygoeHRpbWUudHZfbnNlYy8xMDAwKS0oMTAwMDAwMC0xMDAwMDAwL0haKSk8NTAwMDAwMC9IWiAmJgogCQkgICAgamlmZmllcyAtIHdhbGxfamlmZmllcyA9PSAxKSB7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdmVjdG9ycy5TIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZlY3RvcnMuUwppbmRleCA4MTgwOGYwLi4wZTc0Mzk3IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdmVjdG9ycy5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC92ZWN0b3JzLlMKQEAgLTQ2LDcgKzQ2LDcgQEAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpkaWZmIC0tZ2l0IGEvY3J5cHRvL0tjb25maWcgYi9jcnlwdG8vS2NvbmZpZwppbmRleCAyNTZjMGIxLi44OTI5OWY0IDEwMDY0NAotLS0gYS9jcnlwdG8vS2NvbmZpZworKysgYi9jcnlwdG8vS2NvbmZpZwpAQCAtMjE5LDcgKzIxOSw3IEBACiAJICBkZXNjcmliZWQgaW4gUkZDMjYxMi4KIAogY29uZmlnIENSWVBUT19URUEKLQl0cmlzdGF0ZSAiVEVBIGFuZCBYVEVBIGNpcGhlciBhbGdvcml0aG1zIgorCXRyaXN0YXRlICJURUEsIFhURUEgYW5kIFhFVEEgY2lwaGVyIGFsZ29yaXRobXMiCiAJZGVwZW5kcyBvbiBDUllQVE8KIAloZWxwCiAJICBURUEgY2lwaGVyIGFsZ29yaXRobS4KQEAgLTIzMiw2ICsyMzIsOSBAQAogCSAgdGhlIFRFQSBhbGdvcml0aG0gdG8gYWRkcmVzcyBhIHBvdGVudGlhbCBrZXkgd2Vha25lc3MKIAkgIGluIHRoZSBURUEgYWxnb3JpdGhtLgogCisJICBYdGVuZGVuZCBFbmNyeXB0aW9uIFRpbnkgQWxnb3JpdGhtIGlzIGEgbWlzLWltcGxlbWVudGF0aW9uIAorCSAgb2YgdGhlIFhURUEgYWxnb3JpdGhtIGZvciBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLgorCiBjb25maWcgQ1JZUFRPX0FSQzQKIAl0cmlzdGF0ZSAiQVJDNCBjaXBoZXIgYWxnb3JpdGhtIgogCWRlcGVuZHMgb24gQ1JZUFRPCmRpZmYgLS1naXQgYS9jcnlwdG8vYXBpLmMgYi9jcnlwdG8vYXBpLmMKaW5kZXggYjQ3Mjg4MS4uOTU5YzRlNSAxMDA2NDQKLS0tIGEvY3J5cHRvL2FwaS5jCisrKyBiL2NyeXB0by9hcGkuYwpAQCAtNjYsNyArNjYsOCBAQAogCiBzdGF0aWMgaW50IGNyeXB0b19pbml0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKIHsKLQl0Zm0tPmNydF9mbGFncyA9IDA7CisJdGZtLT5jcnRfZmxhZ3MgPSBmbGFncyAmIENSWVBUT19URk1fUkVRX01BU0s7CisJZmxhZ3MgJj0gfkNSWVBUT19URk1fUkVRX01BU0s7CiAJCiAJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkpIHsKIAljYXNlIENSWVBUT19BTEdfVFlQRV9DSVBIRVI6CmRpZmYgLS1naXQgYS9jcnlwdG8vY2lwaGVyLmMgYi9jcnlwdG8vY2lwaGVyLmMKaW5kZXggOGRhNjQ0My4uZGZkNGJjZiAxMDA2NDQKLS0tIGEvY3J5cHRvL2NpcGhlci5jCisrKyBiL2NyeXB0by9jaXBoZXIuYwpAQCAtMTkxLDYgKzE5MSw4IEBACiAJdTggKml2ID0gZGVzYy0+aW5mbzsKIAl1bnNpZ25lZCBpbnQgZG9uZSA9IDA7CiAKKwluYnl0ZXMgLT0gYnNpemU7CisKIAlkbyB7CiAJCXhvcihpdiwgc3JjKTsKIAkJZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBpdik7CkBAIC0xOTgsNyArMjAwLDcgQEAKIAogCQlzcmMgKz0gYnNpemU7CiAJCWRzdCArPSBic2l6ZTsKLQl9IHdoaWxlICgoZG9uZSArPSBic2l6ZSkgPCBuYnl0ZXMpOworCX0gd2hpbGUgKChkb25lICs9IGJzaXplKSA8PSBuYnl0ZXMpOwogCiAJcmV0dXJuIGRvbmU7CiB9CkBAIC0yMTksNiArMjIxLDggQEAKIAl1OCAqaXYgPSBkZXNjLT5pbmZvOwogCXVuc2lnbmVkIGludCBkb25lID0gMDsKIAorCW5ieXRlcyAtPSBic2l6ZTsKKwogCWRvIHsKIAkJdTggKnRtcF9kc3QgPSAqZHN0X3A7CiAKQEAgLTIzMCw3ICsyMzQsNyBAQAogCiAJCXNyYyArPSBic2l6ZTsKIAkJZHN0ICs9IGJzaXplOwotCX0gd2hpbGUgKChkb25lICs9IGJzaXplKSA8IG5ieXRlcyk7CisJfSB3aGlsZSAoKGRvbmUgKz0gYnNpemUpIDw9IG5ieXRlcyk7CiAKIAlyZXR1cm4gZG9uZTsKIH0KQEAgLTI0MywxMiArMjQ3LDE0IEBACiAJdm9pZCAoKmZuKSh2b2lkICosIHU4ICosIGNvbnN0IHU4ICopID0gZGVzYy0+Y3JmbjsKIAl1bnNpZ25lZCBpbnQgZG9uZSA9IDA7CiAKKwluYnl0ZXMgLT0gYnNpemU7CisKIAlkbyB7CiAJCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGRzdCwgc3JjKTsKIAogCQlzcmMgKz0gYnNpemU7CiAJCWRzdCArPSBic2l6ZTsKLQl9IHdoaWxlICgoZG9uZSArPSBic2l6ZSkgPCBuYnl0ZXMpOworCX0gd2hpbGUgKChkb25lICs9IGJzaXplKSA8PSBuYnl0ZXMpOwogCiAJcmV0dXJuIGRvbmU7CiB9CkBAIC0zNzcsMTEgKzM4Myw3IEBACiBpbnQgY3J5cHRvX2luaXRfY2lwaGVyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKIHsKIAl1MzIgbW9kZSA9IGZsYWdzICYgQ1JZUFRPX1RGTV9NT0RFX01BU0s7Ci0JCiAJdGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID0gbW9kZSA/IG1vZGUgOiBDUllQVE9fVEZNX01PREVfRUNCOwotCWlmIChmbGFncyAmIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKQotCQl0Zm0tPmNydF9mbGFncyA9IENSWVBUT19URk1fUkVRX1dFQUtfS0VZOwotCQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9jcnlwdG8vaW50ZXJuYWwuaCBiL2NyeXB0by9pbnRlcm5hbC5oCmluZGV4IDM3NTE1YmUuLjM3YWE2NTIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9pbnRlcm5hbC5oCisrKyBiL2NyeXB0by9pbnRlcm5hbC5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20va21hcF90eXBlcy5oPgogCiBleHRlcm4gZW51bSBrbV90eXBlIGNyeXB0b19rbV90eXBlc1tdOwpAQCAtMzgsNyArMzksNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX3lpZWxkKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7Ci0JaWYgKCFpbl9hdG9taWMoKSkKKwlpZiAodGZtLT5jcnRfZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVApCiAJCWNvbmRfcmVzY2hlZCgpOwogfQogCmRpZmYgLS1naXQgYS9jcnlwdG8vdGNyeXB0LmMgYi9jcnlwdG8vdGNyeXB0LmMKaW5kZXggYmQ3NTI0Yy4uNjg2Mzk0MSAxMDA2NDQKLS0tIGEvY3J5cHRvL3RjcnlwdC5jCisrKyBiL2NyeXB0by90Y3J5cHQuYwpAQCAtNzIsNyArNzIsNyBAQAogCSJkZXMiLCAibWQ1IiwgImRlczNfZWRlIiwgInJvdDEzIiwgInNoYTEiLCAic2hhMjU2IiwgImJsb3dmaXNoIiwKIAkidHdvZmlzaCIsICJzZXJwZW50IiwgInNoYTM4NCIsICJzaGE1MTIiLCAibWQ0IiwgImFlcyIsICJjYXN0NiIsCiAJImFyYzQiLCAibWljaGFlbF9taWMiLCAiZGVmbGF0ZSIsICJjcmMzMmMiLCAidGVhIiwgInh0ZWEiLAotCSJraGF6YWQiLCAid3A1MTIiLCAid3AzODQiLCAid3AyNTYiLCAidG5lcHJlcyIsIE5VTEwKKwkia2hhemFkIiwgIndwNTEyIiwgIndwMzg0IiwgIndwMjU2IiwgInRuZXByZXMiLCAieGV0YSIsIE5VTEwKIH07CiAKIHN0YXRpYyB2b2lkIGhleGR1bXAodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQpAQCAtODU5LDYgKzg1OSwxMCBAQAogCQl0ZXN0X2NpcGhlciAoImFudWJpcyIsIE1PREVfQ0JDLCBFTkNSWVBULCBhbnViaXNfY2JjX2VuY190dl90ZW1wbGF0ZSwgQU5VQklTX0NCQ19FTkNfVEVTVF9WRUNUT1JTKTsKIAkJdGVzdF9jaXBoZXIgKCJhbnViaXMiLCBNT0RFX0NCQywgREVDUllQVCwgYW51YmlzX2NiY19kZWNfdHZfdGVtcGxhdGUsIEFOVUJJU19DQkNfRU5DX1RFU1RfVkVDVE9SUyk7CiAKKwkJLy9YRVRBCisJCXRlc3RfY2lwaGVyICgieGV0YSIsIE1PREVfRUNCLCBFTkNSWVBULCB4ZXRhX2VuY190dl90ZW1wbGF0ZSwgWEVUQV9FTkNfVEVTVF9WRUNUT1JTKTsKKwkJdGVzdF9jaXBoZXIgKCJ4ZXRhIiwgTU9ERV9FQ0IsIERFQ1JZUFQsIHhldGFfZGVjX3R2X3RlbXBsYXRlLCBYRVRBX0RFQ19URVNUX1ZFQ1RPUlMpOworCiAJCXRlc3RfaGFzaCgic2hhMzg0Iiwgc2hhMzg0X3R2X3RlbXBsYXRlLCBTSEEzODRfVEVTVF9WRUNUT1JTKTsKIAkJdGVzdF9oYXNoKCJzaGE1MTIiLCBzaGE1MTJfdHZfdGVtcGxhdGUsIFNIQTUxMl9URVNUX1ZFQ1RPUlMpOwogCQl0ZXN0X2hhc2goIndwNTEyIiwgd3A1MTJfdHZfdGVtcGxhdGUsIFdQNTEyX1RFU1RfVkVDVE9SUyk7CkBAIC0xMDE2LDYgKzEwMjAsMTEgQEAKIAljYXNlIDI5OgogCQl0ZXN0X2hhc2goInRncjEyOCIsIHRncjEyOF90dl90ZW1wbGF0ZSwgVEdSMTI4X1RFU1RfVkVDVE9SUyk7CiAJCWJyZWFrOworCQkKKwljYXNlIDMwOgorCQl0ZXN0X2NpcGhlciAoInhldGEiLCBNT0RFX0VDQiwgRU5DUllQVCwgeGV0YV9lbmNfdHZfdGVtcGxhdGUsIFhFVEFfRU5DX1RFU1RfVkVDVE9SUyk7CisJCXRlc3RfY2lwaGVyICgieGV0YSIsIE1PREVfRUNCLCBERUNSWVBULCB4ZXRhX2RlY190dl90ZW1wbGF0ZSwgWEVUQV9ERUNfVEVTVF9WRUNUT1JTKTsKKwkJYnJlYWs7CiAKICNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKIAljYXNlIDEwMDoKZGlmZiAtLWdpdCBhL2NyeXB0by90Y3J5cHQuaCBiL2NyeXB0by90Y3J5cHQuaAppbmRleCBjMDFhMGNlOS4uNTIyZmZkNCAxMDA2NDQKLS0tIGEvY3J5cHRvL3RjcnlwdC5oCisrKyBiL2NyeXB0by90Y3J5cHQuaApAQCAtMjIxMSw3ICsyMjExLDcgQEAKIAkJLmtsZW4JPSAxNiwKIAkJLmlucHV0ICA9IHsgWzAgLi4uIDhdID0gMHgwMCB9LAogCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSB7IDB4YWEsIDB4MjIsIDB4OTYsIDB4ZTUsIDB4NmMsIDB4NjEsIDB4ZjMsIDB4NDUgfSwKKwkJLnJlc3VsdAk9IHsgMHhkOCwgMHhkNCwgMHhlOSwgMHhkZSwgMHhkOSwgMHgxZSwgMHgxMywgMHhmNyB9LAogCQkucmxlbgk9IDgsCiAJfSwgewogCQkua2V5CT0geyAweDJiLCAweDAyLCAweDA1LCAweDY4LCAweDA2LCAweDE0LCAweDQ5LCAweDc2LApAQCAtMjIxOSwzMSArMjIxOSwzMSBAQAogCQkua2xlbgk9IDE2LAogCQkuaW5wdXQJPSB7IDB4NzQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4MjAsIDB4NmQsIDB4NjUsIDB4MmUgfSwKIAkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0geyAweDgyLCAweDNlLCAweGViLCAweDM1LCAweGRjLCAweGRkLCAweGQ5LCAweGMzIH0sCisJCS5yZXN1bHQJPSB7IDB4OTQsIDB4ZWIsIDB4YzgsIDB4OTYsIDB4ODQsIDB4NmEsIDB4NDksIDB4YTggfSwKIAkJLnJsZW4JPSA4LAogCX0sIHsKIAkJLmtleQk9IHsgMHgwOSwgMHg2NSwgMHg0MywgMHgxMSwgMHg2NiwgMHg0NCwgMHgzOSwgMHgyNSwKIAkJCSAgICAweDUxLCAweDNhLCAweDE2LCAweDEwLCAweDBhLCAweDA4LCAweDEyLCAweDZlIH0sCiAJCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9IHsgMHg2YywgMHg2ZiwgMHg2ZSwgMHg2NywgMHg2NSwgMHg3MiwgMHg1ZiwgMHg3NCwKKwkJLmlucHV0CT0geyAweDNlLCAweGNlLCAweGFlLCAweDIyLCAweDYwLCAweDU2LCAweGE4LCAweDlkLAogCQkJICAgIDB4NjUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NzYsIDB4NjUsIDB4NjMsIDB4NzQgfSwKIAkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9IHsgMHhlMiwgMHgwNCwgMHhkYiwgMHhmMiwgMHg4OSwgMHg4NSwgMHg5ZSwgMHhlYSwKKwkJLnJlc3VsdAk9IHsgMHhlMiwgMHgwNCwgMHhkYiwgMHhmMiwgMHg4OSwgMHg4NSwgMHg5ZSwgMHhlYSwgCiAJCQkgICAgMHg2MSwgMHgzNSwgMHhhYSwgMHhlZCwgMHhiNSwgMHhjYiwgMHg3MSwgMHgyYyB9LAogCQkucmxlbgk9IDE2LAogCX0sIHsKIAkJLmtleQk9IHsgMHg0ZCwgMHg3NiwgMHgzMiwgMHgxNywgMHgwNSwgMHgzZiwgMHg3NSwgMHgyYywKIAkJCSAgICAweDVkLCAweDA0LCAweDE2LCAweDM2LCAweDE1LCAweDcyLCAweDYzLCAweDJmIH0sCiAJCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9IHsgMHg1NCwgMHg2NSwgMHg2MSwgMHgyMCwgMHg2OSwgMHg3MywgMHgyMCwgMHg2NywKLQkJCSAgICAweDZmLCAweDZmLCAweDY0LCAweDIwLCAweDY2LCAweDZmLCAweDcyLCAweDIwLAotCQkJICAgIDB4NzksIDB4NmYsIDB4NzUsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjAsIDB4NzIsCisJCS5pbnB1dAk9IHsgMHg1NCwgMHg2NSwgMHg2MSwgMHgyMCwgMHg2OSwgMHg3MywgMHgyMCwgMHg2NywgCisJCQkgICAgMHg2ZiwgMHg2ZiwgMHg2NCwgMHgyMCwgMHg2NiwgMHg2ZiwgMHg3MiwgMHgyMCwgCisJCQkgICAgMHg3OSwgMHg2ZiwgMHg3NSwgMHgyMSwgMHgyMSwgMHgyMSwgMHgyMCwgMHg3MiwgCiAJCQkgICAgMHg2NSwgMHg2MSwgMHg2YywgMHg2YywgMHg3OSwgMHgyMSwgMHgyMSwgMHgyMSB9LAogCQkuaWxlbgk9IDMyLAotCQkucmVzdWx0CT0geyAweDBiLCAweDAzLCAweGNkLCAweDhhLCAweGJlLCAweDk1LCAweGZkLCAweGIxLAotCQkJICAgIDB4YzEsIDB4NDQsIDB4OTEsIDB4MGIsIDB4YTUsIDB4YzksIDB4MWIsIDB4YjQsCi0JCQkgICAgMHhhOSwgMHhkYSwgMHgxZSwgMHg5ZSwgMHhiMSwgMHgzZSwgMHgyYSwgMHg4ZiwKLQkJCSAgICAweGVhLCAweGE1LCAweDZhLCAweDg1LCAweGQxLCAweGY0LCAweGE4LCAweGE1IH0sCisJCS5yZXN1bHQJPSB7IDB4OTksIDB4ODEsIDB4OWYsIDB4NWQsIDB4NmYsIDB4NGIsIDB4MzEsIDB4M2EsCisJCQkgICAgMHg4NiwgMHhmZiwgMHg2ZiwgMHhkMCwgMHhlMywgMHg4NywgMHg3MCwgMHgwNywKKwkJCSAgICAweDRkLCAweGI4LCAweGNmLCAweGYzLCAweDk5LCAweDUwLCAweGIzLCAweGQ0LAorCQkJICAgIDB4NzMsIDB4YTIsIDB4ZmEsIDB4YzksIDB4MTYsIDB4NTksIDB4NWQsIDB4ODEgfSwKIAkJLnJsZW4JPSAzMiwKIAl9CiB9OwpAQCAtMjI1Miw3ICsyMjUyLDcgQEAKIAl7CiAJCS5rZXkgICAgPSB7IFswIC4uLiAxNV0gPSAweDAwIH0sCiAJCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9IHsgMHhhYSwgMHgyMiwgMHg5NiwgMHhlNSwgMHg2YywgMHg2MSwgMHhmMywgMHg0NSB9LAorCQkuaW5wdXQJPSB7IDB4ZDgsIDB4ZDQsIDB4ZTksIDB4ZGUsIDB4ZDksIDB4MWUsIDB4MTMsIDB4ZjcgfSwKIAkJLmlsZW4JPSA4LAogCQkucmVzdWx0ID0geyBbMCAuLi4gOF0gPSAweDAwIH0sCiAJCS5ybGVuCT0gOCwKQEAgLTIyNjAsNyArMjI2MCw3IEBACiAJCS5rZXkJPSB7IDB4MmIsIDB4MDIsIDB4MDUsIDB4NjgsIDB4MDYsIDB4MTQsIDB4NDksIDB4NzYsCiAJCQkgICAgMHg3NywgMHg1ZCwgMHgwZSwgMHgyNiwgMHg2YywgMHgyOCwgMHg3OCwgMHg0MyB9LAogCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSB7IDB4ODIsIDB4M2UsIDB4ZWIsIDB4MzUsIDB4ZGMsIDB4ZGQsIDB4ZDksIDB4YzMgfSwKKwkJLmlucHV0CT0geyAweDk0LCAweGViLCAweGM4LCAweDk2LCAweDg0LCAweDZhLCAweDQ5LCAweGE4IH0sCiAJCS5pbGVuCT0gOCwKIAkJLnJlc3VsdAk9IHsgMHg3NCwgMHg2NSwgMHg3MywgMHg3NCwgMHgyMCwgMHg2ZCwgMHg2NSwgMHgyZSB9LAogCQkucmxlbgk9IDgsCkBAIC0yMjY4LDI0ICsyMjY4LDI0IEBACiAJCS5rZXkJPSB7IDB4MDksIDB4NjUsIDB4NDMsIDB4MTEsIDB4NjYsIDB4NDQsIDB4MzksIDB4MjUsCiAJCQkgICAgMHg1MSwgMHgzYSwgMHgxNiwgMHgxMCwgMHgwYSwgMHgwOCwgMHgxMiwgMHg2ZSB9LAogCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSB7IDB4ZTIsIDB4MDQsIDB4ZGIsIDB4ZjIsIDB4ODksIDB4ODUsIDB4OWUsIDB4ZWEsCi0JCQkgICAgMHg2MSwgMHgzNSwgMHhhYSwgMHhlZCwgMHhiNSwgMHhjYiwgMHg3MSwgMHgyYyB9LAorCQkuaW5wdXQJPSB7IDB4M2UsIDB4Y2UsIDB4YWUsIDB4MjIsIDB4NjAsIDB4NTYsIDB4YTgsIDB4OWQsCisJCQkgICAgMHg3NywgMHg0ZCwgMHhkNCwgMHhiNCwgMHg4NywgMHgyNCwgMHhlMywgMHg5YSB9LAogCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0geyAweDZjLCAweDZmLCAweDZlLCAweDY3LCAweDY1LCAweDcyLCAweDVmLCAweDc0LAorCQkucmVzdWx0CT0geyAweDZjLCAweDZmLCAweDZlLCAweDY3LCAweDY1LCAweDcyLCAweDVmLCAweDc0LCAKIAkJCSAgICAweDY1LCAweDczLCAweDc0LCAweDVmLCAweDc2LCAweDY1LCAweDYzLCAweDc0IH0sCiAJCS5ybGVuCT0gMTYsCiAJfSwgewogCQkua2V5CT0geyAweDRkLCAweDc2LCAweDMyLCAweDE3LCAweDA1LCAweDNmLCAweDc1LCAweDJjLAogCQkJICAgIDB4NWQsIDB4MDQsIDB4MTYsIDB4MzYsIDB4MTUsIDB4NzIsIDB4NjMsIDB4MmYgfSwKIAkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0geyAweDBiLCAweDAzLCAweGNkLCAweDhhLCAweGJlLCAweDk1LCAweGZkLCAweGIxLAotCQkJICAgIDB4YzEsIDB4NDQsIDB4OTEsIDB4MGIsIDB4YTUsIDB4YzksIDB4MWIsIDB4YjQsCi0JCQkgICAgMHhhOSwgMHhkYSwgMHgxZSwgMHg5ZSwgMHhiMSwgMHgzZSwgMHgyYSwgMHg4ZiwKLQkJCSAgICAweGVhLCAweGE1LCAweDZhLCAweDg1LCAweGQxLCAweGY0LCAweGE4LCAweGE1IH0sCisJCS5pbnB1dAk9IHsgMHg5OSwgMHg4MSwgMHg5ZiwgMHg1ZCwgMHg2ZiwgMHg0YiwgMHgzMSwgMHgzYSwKKwkJCSAgICAweDg2LCAweGZmLCAweDZmLCAweGQwLCAweGUzLCAweDg3LCAweDcwLCAweDA3LAorCQkJICAgIDB4NGQsIDB4YjgsIDB4Y2YsIDB4ZjMsIDB4OTksIDB4NTAsIDB4YjMsIDB4ZDQsCisJCQkgICAgMHg3MywgMHhhMiwgMHhmYSwgMHhjOSwgMHgxNiwgMHg1OSwgMHg1ZCwgMHg4MSB9LAogCQkuaWxlbgk9IDMyLAotCQkucmVzdWx0CT0geyAweDU0LCAweDY1LCAweDYxLCAweDIwLCAweDY5LCAweDczLCAweDIwLCAweDY3LAotCQkJICAgIDB4NmYsIDB4NmYsIDB4NjQsIDB4MjAsIDB4NjYsIDB4NmYsIDB4NzIsIDB4MjAsCi0JCQkgICAgMHg3OSwgMHg2ZiwgMHg3NSwgMHgyMSwgMHgyMSwgMHgyMSwgMHgyMCwgMHg3MiwKKwkJLnJlc3VsdAk9IHsgMHg1NCwgMHg2NSwgMHg2MSwgMHgyMCwgMHg2OSwgMHg3MywgMHgyMCwgMHg2NywgCisJCQkgICAgMHg2ZiwgMHg2ZiwgMHg2NCwgMHgyMCwgMHg2NiwgMHg2ZiwgMHg3MiwgMHgyMCwgCisJCQkgICAgMHg3OSwgMHg2ZiwgMHg3NSwgMHgyMSwgMHgyMSwgMHgyMSwgMHgyMCwgMHg3MiwgCiAJCQkgICAgMHg2NSwgMHg2MSwgMHg2YywgMHg2YywgMHg3OSwgMHgyMSwgMHgyMSwgMHgyMSB9LAogCQkucmxlbgk9IDMyLAogCX0KQEAgLTI1OTQsNiArMjU5NCw5OCBAQAogCX0sCiB9OwogCisvKiAKKyAqIFhFVEEgdGVzdCB2ZWN0b3JzIAorICovCisjZGVmaW5lIFhFVEFfRU5DX1RFU1RfVkVDVE9SUwk0CisjZGVmaW5lIFhFVEFfREVDX1RFU1RfVkVDVE9SUwk0CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgeGV0YV9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkgICAgPSB7IFswIC4uLiAxNV0gPSAweDAwIH0sCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dCAgPSB7IFswIC4uLiA4XSA9IDB4MDAgfSwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0geyAweGFhLCAweDIyLCAweDk2LCAweGU1LCAweDZjLCAweDYxLCAweGYzLCAweDQ1IH0sCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSB7IDB4MmIsIDB4MDIsIDB4MDUsIDB4NjgsIDB4MDYsIDB4MTQsIDB4NDksIDB4NzYsCisJCQkgICAgMHg3NywgMHg1ZCwgMHgwZSwgMHgyNiwgMHg2YywgMHgyOCwgMHg3OCwgMHg0MyB9LAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSB7IDB4NzQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4MjAsIDB4NmQsIDB4NjUsIDB4MmUgfSwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0geyAweDgyLCAweDNlLCAweGViLCAweDM1LCAweGRjLCAweGRkLCAweGQ5LCAweGMzIH0sCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSB7IDB4MDksIDB4NjUsIDB4NDMsIDB4MTEsIDB4NjYsIDB4NDQsIDB4MzksIDB4MjUsCisJCQkgICAgMHg1MSwgMHgzYSwgMHgxNiwgMHgxMCwgMHgwYSwgMHgwOCwgMHgxMiwgMHg2ZSB9LAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSB7IDB4NmMsIDB4NmYsIDB4NmUsIDB4NjcsIDB4NjUsIDB4NzIsIDB4NWYsIDB4NzQsIAorCQkJICAgIDB4NjUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NzYsIDB4NjUsIDB4NjMsIDB4NzQgfSwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9IHsgMHhlMiwgMHgwNCwgMHhkYiwgMHhmMiwgMHg4OSwgMHg4NSwgMHg5ZSwgMHhlYSwgCisJCQkgICAgMHg2MSwgMHgzNSwgMHhhYSwgMHhlZCwgMHhiNSwgMHhjYiwgMHg3MSwgMHgyYyB9LAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9IHsgMHg0ZCwgMHg3NiwgMHgzMiwgMHgxNywgMHgwNSwgMHgzZiwgMHg3NSwgMHgyYywKKwkJCSAgICAweDVkLCAweDA0LCAweDE2LCAweDM2LCAweDE1LCAweDcyLCAweDYzLCAweDJmIH0sCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9IHsgMHg1NCwgMHg2NSwgMHg2MSwgMHgyMCwgMHg2OSwgMHg3MywgMHgyMCwgMHg2NywgCisJCQkgICAgMHg2ZiwgMHg2ZiwgMHg2NCwgMHgyMCwgMHg2NiwgMHg2ZiwgMHg3MiwgMHgyMCwgCisJCQkgICAgMHg3OSwgMHg2ZiwgMHg3NSwgMHgyMSwgMHgyMSwgMHgyMSwgMHgyMCwgMHg3MiwgCisJCQkgICAgMHg2NSwgMHg2MSwgMHg2YywgMHg2YywgMHg3OSwgMHgyMSwgMHgyMSwgMHgyMSB9LAorCQkuaWxlbgk9IDMyLAorCQkucmVzdWx0CT0geyAweDBiLCAweDAzLCAweGNkLCAweDhhLCAweGJlLCAweDk1LCAweGZkLCAweGIxLCAKKwkJCSAgICAweGMxLCAweDQ0LCAweDkxLCAweDBiLCAweGE1LCAweGM5LCAweDFiLCAweGI0LCAKKwkJCSAgICAweGE5LCAweGRhLCAweDFlLCAweDllLCAweGIxLCAweDNlLCAweDJhLCAweDhmLCAKKwkJCSAgICAweGVhLCAweGE1LCAweDZhLCAweDg1LCAweGQxLCAweGY0LCAweGE4LCAweGE1IH0sCisJCS5ybGVuCT0gMzIsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyB4ZXRhX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleSAgICA9IHsgWzAgLi4uIDE1XSA9IDB4MDAgfSwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0geyAweGFhLCAweDIyLCAweDk2LCAweGU1LCAweDZjLCAweDYxLCAweGYzLCAweDQ1IH0sCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdCA9IHsgWzAgLi4uIDhdID0gMHgwMCB9LAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0geyAweDJiLCAweDAyLCAweDA1LCAweDY4LCAweDA2LCAweDE0LCAweDQ5LCAweDc2LAorCQkJICAgIDB4NzcsIDB4NWQsIDB4MGUsIDB4MjYsIDB4NmMsIDB4MjgsIDB4NzgsIDB4NDMgfSwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0geyAweDgyLCAweDNlLCAweGViLCAweDM1LCAweGRjLCAweGRkLCAweGQ5LCAweGMzIH0sCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9IHsgMHg3NCwgMHg2NSwgMHg3MywgMHg3NCwgMHgyMCwgMHg2ZCwgMHg2NSwgMHgyZSB9LAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0geyAweDA5LCAweDY1LCAweDQzLCAweDExLCAweDY2LCAweDQ0LCAweDM5LCAweDI1LAorCQkJICAgIDB4NTEsIDB4M2EsIDB4MTYsIDB4MTAsIDB4MGEsIDB4MDgsIDB4MTIsIDB4NmUgfSwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0geyAweGUyLCAweDA0LCAweGRiLCAweGYyLCAweDg5LCAweDg1LCAweDllLCAweGVhLCAKKwkJCSAgICAweDYxLCAweDM1LCAweGFhLCAweGVkLCAweGI1LCAweGNiLCAweDcxLCAweDJjIH0sCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSB7IDB4NmMsIDB4NmYsIDB4NmUsIDB4NjcsIDB4NjUsIDB4NzIsIDB4NWYsIDB4NzQsIAorCQkJICAgIDB4NjUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NzYsIDB4NjUsIDB4NjMsIDB4NzQgfSwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSB7IDB4NGQsIDB4NzYsIDB4MzIsIDB4MTcsIDB4MDUsIDB4M2YsIDB4NzUsIDB4MmMsCisJCQkgICAgMHg1ZCwgMHgwNCwgMHgxNiwgMHgzNiwgMHgxNSwgMHg3MiwgMHg2MywgMHgyZiB9LAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSB7IDB4MGIsIDB4MDMsIDB4Y2QsIDB4OGEsIDB4YmUsIDB4OTUsIDB4ZmQsIDB4YjEsIAorCQkJICAgIDB4YzEsIDB4NDQsIDB4OTEsIDB4MGIsIDB4YTUsIDB4YzksIDB4MWIsIDB4YjQsIAorCQkJICAgIDB4YTksIDB4ZGEsIDB4MWUsIDB4OWUsIDB4YjEsIDB4M2UsIDB4MmEsIDB4OGYsIAorCQkJICAgIDB4ZWEsIDB4YTUsIDB4NmEsIDB4ODUsIDB4ZDEsIDB4ZjQsIDB4YTgsIDB4YTUgfSwKKwkJLmlsZW4JPSAzMiwKKwkJLnJlc3VsdAk9IHsgMHg1NCwgMHg2NSwgMHg2MSwgMHgyMCwgMHg2OSwgMHg3MywgMHgyMCwgMHg2NywgCisJCQkgICAgMHg2ZiwgMHg2ZiwgMHg2NCwgMHgyMCwgMHg2NiwgMHg2ZiwgMHg3MiwgMHgyMCwgCisJCQkgICAgMHg3OSwgMHg2ZiwgMHg3NSwgMHgyMSwgMHgyMSwgMHgyMSwgMHgyMCwgMHg3MiwgCisJCQkgICAgMHg2NSwgMHg2MSwgMHg2YywgMHg2YywgMHg3OSwgMHgyMSwgMHgyMSwgMHgyMSB9LAorCQkucmxlbgk9IDMyLAorCX0KK307CisKIC8qCiAgKiBDb21wcmVzc2lvbiBzdHVmZi4KICAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3RlYS5jIGIvY3J5cHRvL3RlYS5jCmluZGV4IDAzYzIzY2IuLjU5MjRlZmQgMTAwNjQ0Ci0tLSBhL2NyeXB0by90ZWEuYworKysgYi9jcnlwdG8vdGVhLmMKQEAgLTEsMTEgKzEsMTUgQEAKIC8qIAogICogQ3J5cHRvZ3JhcGhpYyBBUEkuCiAgKgotICogVEVBIGFuZCBYdGVuZGVkIFRFQSBBbGdvcml0aG1zCisgKiBURUEsIFhURUEsIGFuZCBYRVRBIGNyeXB0byBhbG9ncml0aG1zCiAgKgogICogVGhlIFRFQSBhbmQgWHRlbmRlZCBURUEgYWxnb3JpdGhtcyB3ZXJlIGRldmVsb3BlZCBieSBEYXZpZCBXaGVlbGVyIAogICogYW5kIFJvZ2VyIE5lZWRoYW0gYXQgdGhlIENvbXB1dGVyIExhYm9yYXRvcnkgb2YgQ2FtYnJpZGdlIFVuaXZlcnNpdHkuCiAgKgorICogRHVlIHRvIHRoZSBvcmRlciBvZiBldmFsdWF0aW9uIGluIFhURUEgbWFueSBwZW9wbGUgaGF2ZSBpbmNvcnJlY3RseQorICogaW1wbGVtZW50ZWQgaXQuICBYRVRBIChYVEVBIGluIHRoZSB3cm9uZyBvcmRlciksIGV4aXN0cyBmb3IKKyAqIGNvbXBhdGliaWxpdHkgd2l0aCB0aGVzZSBpbXBsZW1lbnRhdGlvbnMuCisgKgogICogQ29weXJpZ2h0IChjKSAyMDA0IEFhcm9uIEdyb3RoZSBhamdyb3RoZUB5YWhvby5jb20KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMTUzLDkgKzE1Nyw5IEBACiAJeiA9IHUzMl9pbiAoc3JjICsgNCk7CiAKIAl3aGlsZSAoc3VtICE9IGxpbWl0KSB7Ci0JCXkgKz0gKHogPDwgNCBeIHogPj4gNSkgKyAoeiBeIHN1bSkgKyBjdHgtPktFWVtzdW0mM107IAorCQl5ICs9ICgoeiA8PCA0IF4geiA+PiA1KSArIHopIF4gKHN1bSArIGN0eC0+S0VZW3N1bSYzXSk7IAogCQlzdW0gKz0gWFRFQV9ERUxUQTsKLQkJeiArPSAoeSA8PCA0IF4geSA+PiA1KSArICh5IF4gc3VtKSArIGN0eC0+S0VZW3N1bT4+MTEgJjNdOyAKKwkJeiArPSAoKHkgPDwgNCBeIHkgPj4gNSkgKyB5KSBeIChzdW0gKyBjdHgtPktFWVtzdW0+PjExICYzXSk7IAogCX0KIAkKIAl1MzJfb3V0IChkc3QsIHkpOwpAQCAtMTc1LDYgKzE3OSw1MSBAQAogCXN1bSA9IFhURUFfREVMVEEgKiBYVEVBX1JPVU5EUzsKIAogCXdoaWxlIChzdW0pIHsKKwkJeiAtPSAoKHkgPDwgNCBeIHkgPj4gNSkgKyB5KSBeIChzdW0gKyBjdHgtPktFWVtzdW0+PjExICYgM10pOworCQlzdW0gLT0gWFRFQV9ERUxUQTsKKwkJeSAtPSAoKHogPDwgNCBeIHogPj4gNSkgKyB6KSBeIChzdW0gKyBjdHgtPktFWVtzdW0gJiAzXSk7CisJfQorCQorCXUzMl9vdXQgKGRzdCwgeSk7CisJdTMyX291dCAoZHN0ICsgNCwgeik7CisKK30KKworCitzdGF0aWMgdm9pZCB4ZXRhX2VuY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3sgCisKKwl1MzIgeSwgeiwgc3VtID0gMDsKKwl1MzIgbGltaXQgPSBYVEVBX0RFTFRBICogWFRFQV9ST1VORFM7CisKKwlzdHJ1Y3QgeHRlYV9jdHggKmN0eCA9IGN0eF9hcmc7CisKKwl5ID0gdTMyX2luIChzcmMpOworCXogPSB1MzJfaW4gKHNyYyArIDQpOworCisJd2hpbGUgKHN1bSAhPSBsaW1pdCkgeworCQl5ICs9ICh6IDw8IDQgXiB6ID4+IDUpICsgKHogXiBzdW0pICsgY3R4LT5LRVlbc3VtJjNdOworCQlzdW0gKz0gWFRFQV9ERUxUQTsKKwkJeiArPSAoeSA8PCA0IF4geSA+PiA1KSArICh5IF4gc3VtKSArIGN0eC0+S0VZW3N1bT4+MTEgJjNdOworCX0KKwkKKwl1MzJfb3V0IChkc3QsIHkpOworCXUzMl9vdXQgKGRzdCArIDQsIHopOworCit9CisKK3N0YXRpYyB2b2lkIHhldGFfZGVjcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoreyAKKworCXUzMiB5LCB6LCBzdW07CisJc3RydWN0IHRlYV9jdHggKmN0eCA9IGN0eF9hcmc7CisKKwl5ID0gdTMyX2luIChzcmMpOworCXogPSB1MzJfaW4gKHNyYyArIDQpOworCisJc3VtID0gWFRFQV9ERUxUQSAqIFhURUFfUk9VTkRTOworCisJd2hpbGUgKHN1bSkgewogCQl6IC09ICh5IDw8IDQgXiB5ID4+IDUpICsgKHkgXiBzdW0pICsgY3R4LT5LRVlbc3VtPj4xMSAmIDNdOwogCQlzdW0gLT0gWFRFQV9ERUxUQTsKIAkJeSAtPSAoeiA8PCA0IF4geiA+PiA1KSArICh6IF4gc3VtKSArIGN0eC0+S0VZW3N1bSAmIDNdOwpAQCAtMjE1LDYgKzI2NCwyMSBAQAogCS5jaWFfZGVjcnlwdAkJPQl4dGVhX2RlY3J5cHQgfSB9CiB9OwogCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgeGV0YV9hbGcgPSB7CisJLmNyYV9uYW1lCQk9CSJ4ZXRhIiwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0JWFRFQV9CTE9DS19TSVpFLAorCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2YgKHN0cnVjdCB4dGVhX2N0eCksCisJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKHh0ZWFfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UJCQk9CXsgLmNpcGhlciA9IHsKKwkuY2lhX21pbl9rZXlzaXplCT0JWFRFQV9LRVlfU0laRSwKKwkuY2lhX21heF9rZXlzaXplCT0JWFRFQV9LRVlfU0laRSwKKwkuY2lhX3NldGtleQkJPSAJeHRlYV9zZXRrZXksCisJLmNpYV9lbmNyeXB0CQk9CXhldGFfZW5jcnlwdCwKKwkuY2lhX2RlY3J5cHQJCT0JeGV0YV9kZWNyeXB0IH0gfQorfTsKKwogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewogCWludCByZXQgPSAwOwpAQCAtMjI5LDYgKzI5MywxMyBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZ4ZXRhX2FsZyk7CisJaWYgKHJldCA8IDApIHsKKwkJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZ0ZWFfYWxnKTsKKwkJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZ4dGVhX2FsZyk7CisJCWdvdG8gb3V0OworCX0KKwogb3V0OgkKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjM3LDEyICszMDgsMTQgQEAKIHsKIAljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJnRlYV9hbGcpOwogCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmeHRlYV9hbGcpOworCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmeGV0YV9hbGcpOwogfQogCiBNT0RVTEVfQUxJQVMoInh0ZWEiKTsKK01PRFVMRV9BTElBUygieGV0YSIpOwogCiBtb2R1bGVfaW5pdChpbml0KTsKIG1vZHVsZV9leGl0KGZpbmkpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlRFQSAmIFhURUEgQ3J5cHRvZ3JhcGhpYyBBbGdvcml0aG1zIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRFQSwgWFRFQSAmIFhFVEEgQ3J5cHRvZ3JhcGhpYyBBbGdvcml0aG1zIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9NYWtlZmlsZQppbmRleCA5NjYzMTMyLi44NmM4NjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTgsNyArOCw3IEBACiBvYmotJChDT05GSUdfUENJKQkJKz0gcGNpLwogb2JqLSQoQ09ORklHX1BBUklTQykJCSs9IHBhcmlzYy8KIG9iai15CQkJCSs9IHZpZGVvLwotb2JqLSQoQ09ORklHX0FDUElfQk9PVCkJCSs9IGFjcGkvCitvYmotJChDT05GSUdfQUNQSSkJCSs9IGFjcGkvCiAjIFBuUCBtdXN0IGNvbWUgYWZ0ZXIgQUNQSSBzaW5jZSBpdCB3aWxsIGV2ZW50dWFsbHkgbmVlZCB0byBjaGVjayBpZiBhY3BpCiAjIHdhcyB1c2VkIGFuZCBkbyBub3RoaW5nIGlmIHNvCiBvYmotJChDT05GSUdfUE5QKQkJKz0gcG5wLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY29ybi9ibG9jay9mZDE3NzIuYyBiL2RyaXZlcnMvYWNvcm4vYmxvY2svZmQxNzcyLmMKaW5kZXggYzBhMzdkOS4uMDQ4NTQyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY29ybi9ibG9jay9mZDE3NzIuYworKysgYi9kcml2ZXJzL2Fjb3JuL2Jsb2NrL2ZkMTc3Mi5jCkBAIC0zNzYsMTkgKzM3NiwxNSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IG1vdG9yX29mZl90aW1lciA9Ci0JVElNRVJfSU5JVElBTElaRVIoZmRfbW90b3Jfb2ZmX3RpbWVyLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIobW90b3Jfb2ZmX3RpbWVyLCBmZF9tb3Rvcl9vZmZfdGltZXIsIDAsIDApOwogCiAjaWZkZWYgVFJBQ0tCVUZGRVIKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCByZWFkdHJhY2tfdGltZXIgPQotCVRJTUVSX0lOSVRJQUxJWkVSKGZkX3JlYWR0cmFja19jaGVjaywgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHJlYWR0cmFja190aW1lciwgZmRfcmVhZHRyYWNrX2NoZWNrLCAwLCAwKTsKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdGltZW91dF90aW1lciA9Ci0JVElNRVJfSU5JVElBTElaRVIoZmRfdGltZXNfb3V0LCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIodGltZW91dF90aW1lciwgZmRfdGltZXNfb3V0LCAwLCAwKTsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGZkX3RpbWVyID0KLQlUSU1FUl9JTklUSUFMSVpFUihjaGVja19jaGFuZ2UsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihmZF90aW1lciwgY2hlY2tfY2hhbmdlLCAwLCAwKTsKIAogLyogREFHOiBIYXZlbid0IGdvdCBhIGNsdWUgd2hhdCB0aGlzIGlzPyAqLwogaW50IHN0ZG1hX2lzbG9ja2VkKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvS2NvbmZpZyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCmluZGV4IGJhMTM4OTYuLmZlMWU4MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCkBAIC0zLDcgKzMsNiBAQAogIwogCiBtZW51ICJBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQTQogCWRlcGVuZHMgb24gIVg4Nl9WSVNXUwogCWRlcGVuZHMgb24gIUlBNjRfSFBfU0lNCiAJZGVwZW5kcyBvbiBJQTY0IHx8IFg4NgpAQCAtMTEsNiArMTAsOCBAQAogY29uZmlnIEFDUEkKIAlib29sICJBQ1BJIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJQTY0IHx8IFg4NgorCXNlbGVjdCBQTQorCXNlbGVjdCBQQ0kKIAogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KQEAgLTQzLDIwICs0NCwxMCBAQAogCiBpZiBBQ1BJCiAKLWNvbmZpZyBBQ1BJX0JPT1QKLQlib29sCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBBQ1BJX0lOVEVSUFJFVEVSCi0JYm9vbAotCWRlZmF1bHQgeQotCi1pZiBBQ1BJX0lOVEVSUFJFVEVSCi0KIGNvbmZpZyBBQ1BJX1NMRUVQCi0JYm9vbCAiU2xlZXAgU3RhdGVzIChFWFBFUklNRU5UQUwpIgorCWJvb2wgIlNsZWVwIFN0YXRlcyIKIAlkZXBlbmRzIG9uIFg4NiAmJiAoIVNNUCB8fCBTVVNQRU5EX1NNUCkKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBQTQorCWRlcGVuZHMgb24gUE0KIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBhZGRzIHN1cHBvcnQgZm9yIEFDUEkgc3VzcGVuZCBzdGF0ZXMuIApAQCAtOTAsMTYgKzgxLDE2IEBACiBjb25maWcgQUNQSV9BQwogCXRyaXN0YXRlICJBQyBBZGFwdGVyIgogCWRlcGVuZHMgb24gWDg2Ci0JZGVmYXVsdCBtCisJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciB0aGUgQUMgQWRhcHRlciBvYmplY3QsIHdoaWNoIGluZGljYXRlcwotCSAgd2hldGhlciBhIHN5c3RlbSBpcyBvbiBBQywgb3Igbm90LiAgVHlwaWNhbGx5LCBvbmx5IG1vYmlsZSBzeXN0ZW1zIAotCSAgaGF2ZSB0aGlzIG9iamVjdCwgc2luY2UgZGVza3RvcHMgYXJlIGFsd2F5cyBvbiBBQy4KKwkgIHdoZXRoZXIgYSBzeXN0ZW0gaXMgb24gQUMsIG9yIG5vdC4gSWYgeW91IGhhdmUgYSBzeXN0ZW0gdGhhdCBjYW4KKwkgIHN3aXRjaCBiZXR3ZWVuIEEvQyBhbmQgYmF0dGVyeSwgc2F5IFkuCiAKIGNvbmZpZyBBQ1BJX0JBVFRFUlkKIAl0cmlzdGF0ZSAiQmF0dGVyeSIKIAlkZXBlbmRzIG9uIFg4NgotCWRlZmF1bHQgbQorCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgYmF0dGVyeSBpbmZvcm1hdGlvbiB0aHJvdWdoCiAJICAvcHJvYy9hY3BpL2JhdHRlcnkuIElmIHlvdSBoYXZlIGEgbW9iaWxlIHN5c3RlbSB3aXRoIGEgYmF0dGVyeSwgCkBAIC0xMDcsMTggKzk4LDE3IEBACiAKIGNvbmZpZyBBQ1BJX0JVVFRPTgogCXRyaXN0YXRlICJCdXR0b24iCi0JZGVmYXVsdCBtCisJZGVmYXVsdCB5CiAJaGVscAotCSAgVGhpcyBkcml2ZXIgcmVnaXN0ZXJzIGZvciBldmVudHMgYmFzZWQgb24gYnV0dG9ucywgc3VjaCBhcyB0aGUKLQkgIHBvd2VyLCBzbGVlcCwgYW5kIGxpZCBzd2l0Y2guICBJbiB0aGUgZnV0dXJlLCBhIGRhZW1vbiB3aWxsIHJlYWQKLQkgIC9wcm9jL2FjcGkvZXZlbnQgYW5kIHBlcmZvcm0gdXNlci1kZWZpbmVkIGFjdGlvbnMgc3VjaCBhcyBzaHV0dGluZwotCSAgZG93biB0aGUgc3lzdGVtLiAgVW50aWwgdGhlbiwgeW91IGNhbiBjYXQgaXQsIGFuZCBzZWUgb3V0cHV0IHdoZW4KLQkgIGEgYnV0dG9uIGlzIHByZXNzZWQuCisJICBUaGlzIGRyaXZlciBoYW5kbGVzIGV2ZW50cyBvbiB0aGUgcG93ZXIsIHNsZWVwIGFuZCBsaWQgYnV0dG9ucy4KKwkgIEEgZGFlbW9uIHJlYWRzIC9wcm9jL2FjcGkvZXZlbnQgYW5kIHBlcmZvcm0gdXNlci1kZWZpbmVkIGFjdGlvbnMKKwkgIHN1Y2ggYXMgc2h1dHRpbmcgZG93biB0aGUgc3lzdGVtLiAgVGhpcyBpcyBuZWNlc3NhcnkgZm9yCisJICBzb2Z0d2FyZSBjb250cm9sbGVkIHBvd2Vyb2ZmLgogCiBjb25maWcgQUNQSV9WSURFTwogCXRyaXN0YXRlICJWaWRlbyIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCWRlZmF1bHQgbQorCWRlcGVuZHMgb24gWDg2CisJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaW1wbGVtZW50IHRoZSBBQ1BJIEV4dGVuc2lvbnMgRm9yIERpc3BsYXkgQWRhcHRlcnMKIAkgIGZvciBpbnRlZ3JhdGVkIGdyYXBoaWNzIGRldmljZXMgb24gbW90aGVyYm9hcmQsIGFzIHNwZWNpZmllZCBpbgpAQCAtMTI5LDEwICsxMTksOSBAQAogCSAgZm9yIHlvdXIgaW50ZWdyYXRlZCB2aWRlbyBkZXZpY2UuCiAKIGNvbmZpZyBBQ1BJX0hPVEtFWQotCXRyaXN0YXRlICJHZW5lcmljIEhvdGtleSIKLQlkZXBlbmRzIG9uIEFDUElfSU5URVJQUkVURVIKKwl0cmlzdGF0ZSAiR2VuZXJpYyBIb3RrZXkgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQlkZXBlbmRzIG9uICFJQTY0X1NHSV9TTgorCWRlcGVuZHMgb24gWDg2CiAJZGVmYXVsdCBuCiAJaGVscAogCSAgRXhwZXJpbWVudGFsIGNvbnNvbGlkYXRlZCBob3RrZXkgZHJpdmVyLgpAQCAtMTQwLDMxICsxMjksMzAgQEAKIAogY29uZmlnIEFDUElfRkFOCiAJdHJpc3RhdGUgIkZhbiIKLQlkZWZhdWx0IG0KKwlkZWZhdWx0IHkKIAloZWxwCiAJICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIEFDUEkgZmFuIGRldmljZXMsIGFsbG93aW5nIHVzZXItbW9kZSAKIAkgIGFwcGxpY2F0aW9ucyB0byBwZXJmb3JtIGJhc2ljIGZhbiBjb250cm9sIChvbiwgb2ZmLCBzdGF0dXMpLgogCiBjb25maWcgQUNQSV9QUk9DRVNTT1IKIAl0cmlzdGF0ZSAiUHJvY2Vzc29yIgotCWRlZmF1bHQgbQorCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGluc3RhbGxzIEFDUEkgYXMgdGhlIGlkbGUgaGFuZGxlciBmb3IgTGludXgsIGFuZCB1c2VzCiAJICBBQ1BJIEMyIGFuZCBDMyBwcm9jZXNzb3Igc3RhdGVzIHRvIHNhdmUgcG93ZXIsIG9uIHN5c3RlbXMgdGhhdAotCSAgc3VwcG9ydCBpdC4KKwkgIHN1cHBvcnQgaXQuICBJdCBpcyByZXF1aXJlZCBieSBzZXZlcmFsIGZsYXZvcnMgb2YgY3B1ZnJlcQorCSAgUGVyZm9ybWFuY2Utc3RhdGUgZHJpdmVycy4KIAogY29uZmlnIEFDUElfSE9UUExVR19DUFUKLQlib29sICJQcm9jZXNzb3IgSG90cGx1ZyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEFDUElfUFJPQ0VTU09SICYmIEhPVFBMVUdfQ1BVICYmIEVYUEVSSU1FTlRBTAorCWJvb2wKKwlkZXBlbmRzIG9uIEFDUElfUFJPQ0VTU09SICYmIEhPVFBMVUdfQ1BVCiAJc2VsZWN0IEFDUElfQ09OVEFJTkVSCi0JZGVmYXVsdCBuCi0JIC0tLWhlbHAtLS0KLQkgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdXIgcGxhdGZvcm0gc3VwcG9ydCBwaHlzaWNhbCBDUFUgaG90cGx1Zy4KKwlkZWZhdWx0IHkKIAogY29uZmlnIEFDUElfVEhFUk1BTAogCXRyaXN0YXRlICJUaGVybWFsIFpvbmUiCiAJZGVwZW5kcyBvbiBBQ1BJX1BST0NFU1NPUgotCWRlZmF1bHQgbQorCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgQUNQSSB0aGVybWFsIHpvbmVzLiAgTW9zdCBtb2JpbGUgYW5kCiAJICBzb21lIGRlc2t0b3Agc3lzdGVtcyBzdXBwb3J0IEFDUEkgdGhlcm1hbCB6b25lcy4gIEl0IGlzIEhJR0hMWQpAQCAtMTgwLDcgKzE2OCw3IEBACiBjb25maWcgQUNQSV9BU1VTCiAgICAgICAgIHRyaXN0YXRlICJBU1VTL01lZGlvbiBMYXB0b3AgRXh0cmFzIgogCWRlcGVuZHMgb24gWDg2Ci0JZGVmYXVsdCBtCisJZGVmYXVsdCB5CiAgICAgICAgIC0tLWhlbHAtLS0KICAgICAgICAgICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciBleHRyYSBmZWF0dXJlcyBvZiBBQ1BJLWNvbXBhdGlibGUKICAgICAgICAgICBBU1VTIGxhcHRvcHMuIEFzIHNvbWUgb2YgTWVkaW9uIGxhcHRvcHMgYXJlIG1hZGUgYnkgQVNVUywgaXQgbWF5IGFsc28KQEAgLTIwOSw3ICsxOTcsNyBAQAogY29uZmlnIEFDUElfSUJNCiAJdHJpc3RhdGUgIklCTSBUaGlua1BhZCBMYXB0b3AgRXh0cmFzIgogCWRlcGVuZHMgb24gWDg2Ci0JZGVmYXVsdCBtCisJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIExpbnV4IEFDUEkgZHJpdmVyIGZvciB0aGUgSUJNIFRoaW5rUGFkIGxhcHRvcHMuIEl0IGFkZHMKIAkgIHN1cHBvcnQgZm9yIEZuLUZ4IGtleSBjb21iaW5hdGlvbnMsIEJsdWV0b290aCBjb250cm9sLCB2aWRlbwpAQCAtMjIyLDcgKzIxMCw3IEBACiBjb25maWcgQUNQSV9UT1NISUJBCiAJdHJpc3RhdGUgIlRvc2hpYmEgTGFwdG9wIEV4dHJhcyIKIAlkZXBlbmRzIG9uIFg4NgotCWRlZmF1bHQgbQorCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgYWNjZXNzIHRvIGNlcnRhaW4gc3lzdGVtIHNldHRpbmdzCiAJICBvbiAibGVnYWN5IGZyZWUiIFRvc2hpYmEgbGFwdG9wcy4gIFRoZXNlIGxhcHRvcHMgY2FuIGJlIHJlY29nbml6ZWQgYnkKQEAgLTI2Miw4ICsyNTAsNyBAQAogCSAgRW50ZXIgdGhlIGZ1bGwgcGF0aCBuYW1lIHRvIHRoZSBmaWxlIHdpY2ggaW5jbHVkZXMgdGhlIEFtbENvZGUgZGVjbGFyYXRpb24uCiAKIGNvbmZpZyBBQ1BJX0JMQUNLTElTVF9ZRUFSCi0JaW50ICJEaXNhYmxlIEFDUEkgZm9yIHN5c3RlbXMgYmVmb3JlIEphbiAxc3QgdGhpcyB5ZWFyIgotCWRlcGVuZHMgb24gQUNQSV9JTlRFUlBSRVRFUgorCWludCAiRGlzYWJsZSBBQ1BJIGZvciBzeXN0ZW1zIGJlZm9yZSBKYW4gMXN0IHRoaXMgeWVhciIgaWYgWDg2CiAJZGVmYXVsdCAwCiAJaGVscAogCSAgZW50ZXIgYSA0LWRpZ2l0IHllYXIsIGVnLiAyMDAxIHRvIGRpc2FibGUgQUNQSSBieSBkZWZhdWx0CkBAIC0yODEsMTAgKzI2OCw2IEBACiAJICBvZiB2ZXJib3NpdHkuIFNheWluZyBZIGVuYWJsZXMgdGhlc2Ugc3RhdGVtZW50cy4gVGhpcyB3aWxsIGluY3JlYXNlCiAJICB5b3VyIGtlcm5lbCBzaXplIGJ5IGFyb3VuZCA1MEsuCiAKLWNvbmZpZyBBQ1BJX0JVUwotCWJvb2wKLQlkZWZhdWx0IHkKLQogY29uZmlnIEFDUElfRUMKIAlib29sCiAJZGVwZW5kcyBvbiBYODYKQEAgLTI5OCwxMCArMjgxLDYgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBBQ1BJX1BDSQotCWJvb2wKLQlkZWZhdWx0IFBDSQotCiBjb25maWcgQUNQSV9TWVNURU0KIAlib29sCiAJZGVmYXVsdCB5CkBAIC0zMDksMTQgKzI4OCwxMSBAQAogCSAgVGhpcyBkcml2ZXIgd2lsbCBlbmFibGUgeW91ciBzeXN0ZW0gdG8gc2h1dCBkb3duIHVzaW5nIEFDUEksIGFuZAogCSAgZHVtcCB5b3VyIEFDUEkgRFNEVCB0YWJsZSB1c2luZyAvcHJvYy9hY3BpL2RzZHQuCiAKLWVuZGlmCSMgQUNQSV9JTlRFUlBSRVRFUgotCiBjb25maWcgWDg2X1BNX1RJTUVSCiAJYm9vbCAiUG93ZXIgTWFuYWdlbWVudCBUaW1lciBTdXBwb3J0IgogCWRlcGVuZHMgb24gWDg2Ci0JZGVwZW5kcyBvbiBBQ1BJX0JPT1QgJiYgRVhQRVJJTUVOVEFMCiAJZGVwZW5kcyBvbiAhWDg2XzY0Ci0JZGVmYXVsdCBuCisJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhlIFBvd2VyIE1hbmFnZW1lbnQgVGltZXIgaXMgYXZhaWxhYmxlIG9uIGFsbCBBQ1BJLWNhcGFibGUsCiAJICBpbiBtb3N0IGNhc2VzIGV2ZW4gaWYgQUNQSSBpcyB1bnVzYWJsZSBvciBibGFja2xpc3RlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQppbmRleCBhZDY3ZThmLi5hMTgyNDM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCkBAIC0xNSwxMyArMTUsMTMgQEAKICMKICMgQUNQSSBCb290LVRpbWUgVGFibGUgUGFyc2luZwogIwotb2JqLSQoQ09ORklHX0FDUElfQk9PVCkJCSs9IHRhYmxlcy5vCi1vYmotJChDT05GSUdfQUNQSV9JTlRFUlBSRVRFUikJKz0gYmxhY2tsaXN0Lm8KK29iai15CQkJCSs9IHRhYmxlcy5vCitvYmoteQkJCQkrPSBibGFja2xpc3QubwogCiAjCiAjIEFDUEkgQ29yZSBTdWJzeXN0ZW0gKEludGVycHJldGVyKQogIwotb2JqLSQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpCSs9IG9zbC5vIHV0aWxzLm8gXAorb2JqLXkJCQkJKz0gb3NsLm8gdXRpbHMubyBcCiAJCQkJICAgZGlzcGF0Y2hlci8gZXZlbnRzLyBleGVjdXRlci8gaGFyZHdhcmUvIFwKIAkJCQkgICBuYW1lc3BhY2UvIHBhcnNlci8gcmVzb3VyY2VzLyB0YWJsZXMvIFwKIAkJCQkgICB1dGlsaXRpZXMvCkBAIC0zNSw4ICszNSw4IEBACiBwcm9jZXNzb3Itb2JqcwkrPSBwcm9jZXNzb3JfcGVyZmxpYi5vCQkJCiBlbmRpZgogCi1vYmotJChDT05GSUdfQUNQSV9CVVMpCQkrPSBzbGVlcC8KLW9iai0kKENPTkZJR19BQ1BJX0JVUykJCSs9IGJ1cy5vIGdsdWUubworb2JqLXkJCQkJKz0gc2xlZXAvCitvYmoteQkJCQkrPSBidXMubyBnbHVlLm8KIG9iai0kKENPTkZJR19BQ1BJX0FDKSAJCSs9IGFjLm8KIG9iai0kKENPTkZJR19BQ1BJX0JBVFRFUlkpCSs9IGJhdHRlcnkubwogb2JqLSQoQ09ORklHX0FDUElfQlVUVE9OKQkrPSBidXR0b24ubwpAQCAtNDQsNyArNDQsNyBAQAogb2JqLSQoQ09ORklHX0FDUElfRkFOKQkJKz0gZmFuLm8KIG9iai0kKENPTkZJR19BQ1BJX1ZJREVPKQkrPSB2aWRlby5vIAogb2JqLSQoQ09ORklHX0FDUElfSE9US0VZKQkrPSBob3RrZXkubwotb2JqLSQoQ09ORklHX0FDUElfUENJKQkJKz0gcGNpX3Jvb3QubyBwY2lfbGluay5vIHBjaV9pcnEubyBwY2lfYmluZC5vCitvYmoteQkJCQkrPSBwY2lfcm9vdC5vIHBjaV9saW5rLm8gcGNpX2lycS5vIHBjaV9iaW5kLm8KIG9iai0kKENPTkZJR19BQ1BJX1BPV0VSKQkrPSBwb3dlci5vCiBvYmotJChDT05GSUdfQUNQSV9QUk9DRVNTT1IpCSs9IHByb2Nlc3Nvci5vCiBvYmotJChDT05GSUdfQUNQSV9DT05UQUlORVIpCSs9IGNvbnRhaW5lci5vCkBAIC01NSw1ICs1NSw1IEBACiBvYmotJChDT05GSUdfQUNQSV9BU1VTKQkJKz0gYXN1c19hY3BpLm8KIG9iai0kKENPTkZJR19BQ1BJX0lCTSkJCSs9IGlibV9hY3BpLm8KIG9iai0kKENPTkZJR19BQ1BJX1RPU0hJQkEpCSs9IHRvc2hpYmFfYWNwaS5vCi1vYmotJChDT05GSUdfQUNQSV9CVVMpCQkrPSBzY2FuLm8gbW90aGVyYm9hcmQubworb2JqLXkJCQkJKz0gc2Nhbi5vIG1vdGhlcmJvYXJkLm8KIG9iai0kKENPTkZJR19BQ1BJX0hPVFBMVUdfTUVNT1JZKQkrPSBhY3BpX21lbWhvdHBsdWcubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjLmMgYi9kcml2ZXJzL2FjcGkvYWMuYwppbmRleCAyM2FiNzYxLi43ODM5YjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWMuYworKysgYi9kcml2ZXJzL2FjcGkvYWMuYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCi0KICNkZWZpbmUgQUNQSV9BQ19DT01QT05FTlQJCTB4MDAwMjAwMDAKICNkZWZpbmUgQUNQSV9BQ19DTEFTUwkJCSJhY19hZGFwdGVyIgogI2RlZmluZSBBQ1BJX0FDX0hJRCAJCQkiQUNQSTAwMDMiCkBAIC00NSw0NyArNDQsNDUgQEAKICNkZWZpbmUgQUNQSV9BQ19TVEFUVVNfVU5LTk9XTgkJMHhGRgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfQUNfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImFjcGlfYWMiKQorQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9hYyIpCiAKLU1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKKyAgICBNT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9BQ19EUklWRVJfTkFNRSk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBpbnQgYWNwaV9hY19hZGQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV9hY19yZW1vdmUgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfYWNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV9hY19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIHN0YXRpYyBpbnQgYWNwaV9hY19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2FjX2RyaXZlciA9IHsKLQkubmFtZSA9CQlBQ1BJX0FDX0RSSVZFUl9OQU1FLAotCS5jbGFzcyA9CUFDUElfQUNfQ0xBU1MsCi0JLmlkcyA9CQlBQ1BJX0FDX0hJRCwKLQkub3BzID0JCXsKLQkJCQkuYWRkID0JCWFjcGlfYWNfYWRkLAotCQkJCS5yZW1vdmUgPQlhY3BpX2FjX3JlbW92ZSwKLQkJCX0sCisJLm5hbWUgPSBBQ1BJX0FDX0RSSVZFUl9OQU1FLAorCS5jbGFzcyA9IEFDUElfQUNfQ0xBU1MsCisJLmlkcyA9IEFDUElfQUNfSElELAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX2FjX2FkZCwKKwkJLnJlbW92ZSA9IGFjcGlfYWNfcmVtb3ZlLAorCQl9LAogfTsKIAogc3RydWN0IGFjcGlfYWMgewotCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0JdW5zaWduZWQgbG9uZwkJc3RhdGU7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgc3RhdGU7CiB9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX2FjX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV9hY19vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX2FjX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDIEFkYXB0ZXIgTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludAotYWNwaV9hY19nZXRfc3RhdGUgKAotCXN0cnVjdCBhY3BpX2FjCQkqYWMpCitzdGF0aWMgaW50IGFjcGlfYWNfZ2V0X3N0YXRlKHN0cnVjdCBhY3BpX2FjICphYykKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2FjX2dldF9zdGF0ZSIpOwogCkBAIC05NSwyNCArOTIsMjMgQEAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoYWMtPmhhbmRsZSwgIl9QU1IiLCBOVUxMLCAmYWMtPnN0YXRlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciByZWFkaW5nIEFDIEFkYXB0ZXIgc3RhdGVcbiIpKTsKKwkJCQkgICJFcnJvciByZWFkaW5nIEFDIEFkYXB0ZXIgc3RhdGVcbiIpKTsKIAkJYWMtPnN0YXRlID0gQUNQSV9BQ19TVEFUVVNfVU5LTk9XTjsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KLQkKKwogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmFjcGlfYWNfZGlyOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV9hY19kaXI7CiAKIHN0YXRpYyBpbnQgYWNwaV9hY19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX2FjCQkqYWMgPSAoc3RydWN0IGFjcGlfYWMgKikgc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX2FjICphYyA9IChzdHJ1Y3QgYWNwaV9hYyAqKXNlcS0+cHJpdmF0ZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYWNfc2VxX3Nob3ciKTsKIApAQCAtMTM5LDIzICsxMzUsMjEgQEAKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KLQkKKwogc3RhdGljIGludCBhY3BpX2FjX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfYWNfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX2FjX2FkZF9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfYWNfYWRkX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnkgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnkgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9hY19hZGRfZnMiKTsKIAogCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJYWNwaV9hY19kaXIpOworCQkJCQkJICAgICBhY3BpX2FjX2Rpcik7CiAJCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpCiAJCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpLT5vd25lciA9IFRISVNfTU9EVUxFOwpAQCAtMTYzLDExICsxNTcsMTEgQEAKIAogCS8qICdzdGF0ZScgW1JdICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX0FDX0ZJTEVfU1RBVEUsCi0JCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfQUNfRklMRV9TVEFURSkpOworCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkgIEFDUElfQUNfRklMRV9TVEFURSkpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfYWNfZm9wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC0xNzcsMTYgKzE3MSwxMiBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2FjX3JlbW92ZV9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfYWNfcmVtb3ZlX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYWNfcmVtb3ZlX2ZzIik7CiAKIAlpZiAoYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9BQ19GSUxFX1NUQVRFLAotCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0FDX0ZJTEVfU1RBVEUsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAogCQlyZW1vdmVfcHJvY19lbnRyeShhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwgYWNwaV9hY19kaXIpOwogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IE5VTEw7CkBAIC0xOTUsMTkgKzE4NSwxNCBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgTW9kZWwKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX2FjX25vdGlmeSAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQl1MzIJCQlldmVudCwKLQl2b2lkCQkJKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX2FjX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9hYwkJKmFjID0gKHN0cnVjdCBhY3BpX2FjICopIGRhdGE7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOworCXN0cnVjdCBhY3BpX2FjICphYyA9IChzdHJ1Y3QgYWNwaV9hYyAqKWRhdGE7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9hY19ub3RpZnkiKTsKIApAQCAtMjI0LDIxICsyMDksMTggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpKTsKKwkJCQkgICJVbnN1cHBvcnRlZCBldmVudCBbMHgleF1cbiIsIGV2ZW50KSk7CiAJCWJyZWFrOwogCX0KIAogCXJldHVybl9WT0lEOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfYWNfYWRkICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9hY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfYWMJCSphYyA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfYWMgKmFjID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYWNfYWRkIik7CiAKQEAgLTI2NCwxOSArMjQ2LDIwIEBACiAJCWdvdG8gZW5kOwogCiAJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGFjLT5oYW5kbGUsCi0JCUFDUElfREVWSUNFX05PVElGWSwgYWNwaV9hY19ub3RpZnksIGFjKTsKKwkJCQkJICAgICBBQ1BJX0RFVklDRV9OT1RJRlksIGFjcGlfYWNfbm90aWZ5LAorCQkJCQkgICAgIGFjKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciBpbnN0YWxsaW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CisJCQkJICAiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIikpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoJXMpXG4iLCAKLQkJYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwgCi0JCWFjLT5zdGF0ZT8ib24tbGluZSI6Im9mZi1saW5lIik7CisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc10gKCVzKVxuIiwKKwkgICAgICAgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKKwkgICAgICAgYWMtPnN0YXRlID8gIm9uLWxpbmUiIDogIm9mZi1saW5lIik7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAocmVzdWx0KSB7CiAJCWFjcGlfYWNfcmVtb3ZlX2ZzKGRldmljZSk7CiAJCWtmcmVlKGFjKTsKQEAgLTI4NSwyNyArMjY4LDIzIEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9hY19yZW1vdmUgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCWludAkJCXR5cGUpCitzdGF0aWMgaW50IGFjcGlfYWNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfYWMJCSphYyA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfYWMgKmFjID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYWNfcmVtb3ZlIik7CiAKIAlpZiAoIWRldmljZSB8fCAhYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlhYyA9IChzdHJ1Y3QgYWNwaV9hYyAqKSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJYWMgPSAoc3RydWN0IGFjcGlfYWMgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKIAlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihhYy0+aGFuZGxlLAotCQlBQ1BJX0RFVklDRV9OT1RJRlksIGFjcGlfYWNfbm90aWZ5KTsKKwkJCQkJICAgIEFDUElfREVWSUNFX05PVElGWSwgYWNwaV9hY19ub3RpZnkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAKIAlhY3BpX2FjX3JlbW92ZV9mcyhkZXZpY2UpOwogCkBAIC0zMTQsMTEgKzI5Myw5IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX2FjX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2FjX2luaXQodm9pZCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9hY19pbml0Iik7CiAKQEAgLTMzNiw5ICszMTMsNyBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWFjcGlfYWNfZXhpdCAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX2FjX2V4aXQodm9pZCkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2FjX2V4aXQiKTsKIApAQCAtMzQ5LDYgKzMyNCw1IEBACiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogbW9kdWxlX2luaXQoYWNwaV9hY19pbml0KTsKIG1vZHVsZV9leGl0KGFjcGlfYWNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKaW5kZXggNzcyODVmZi4uMDFhMWJkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAotCiAjZGVmaW5lIEFDUElfTUVNT1JZX0RFVklDRV9DT01QT05FTlQJCTB4MDgwMDAwMDBVTAogI2RlZmluZSBBQ1BJX01FTU9SWV9ERVZJQ0VfQ0xBU1MJCSJtZW1vcnkiCiAjZGVmaW5lIEFDUElfTUVNT1JZX0RFVklDRV9ISUQJCQkiUE5QMEM4MCIKQEAgLTQxLDggKzQwLDggQEAKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX01FTU9SWV9ERVZJQ0VfQ09NUE9ORU5UCiAKLUFDUElfTU9EVUxFX05BTUUJCSgiYWNwaV9tZW1vcnkiKQotTU9EVUxFX0FVVEhPUigiTmF2ZWVuIEIgUyA8bmF2ZWVuLmIuc0BpbnRlbC5jb20+Iik7CitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX21lbW9yeSIpCisgICAgTU9EVUxFX0FVVEhPUigiTmF2ZWVuIEIgUyA8bmF2ZWVuLmIuc0BpbnRlbC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9NRU1PUllfREVWSUNFX0RSSVZFUl9OQU1FKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApAQCAtNTYsMzQgKzU1LDMzIEBACiAjZGVmaW5lIE1FTU9SWV9QT1dFUl9PTl9TVEFURQkxCiAjZGVmaW5lIE1FTU9SWV9QT1dFUl9PRkZfU1RBVEUJMgogCi1zdGF0aWMgaW50IGFjcGlfbWVtb3J5X2RldmljZV9hZGQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV9tZW1vcnlfZGV2aWNlX3JlbW92ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgYWNwaV9tZW1vcnlfZGV2aWNlX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGFjcGlfbWVtb3J5X2RldmljZV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX21lbW9yeV9kZXZpY2VfZHJpdmVyID0gewotCS5uYW1lID0JCUFDUElfTUVNT1JZX0RFVklDRV9EUklWRVJfTkFNRSwKLQkuY2xhc3MgPQlBQ1BJX01FTU9SWV9ERVZJQ0VfQ0xBU1MsCi0JLmlkcyA9CQlBQ1BJX01FTU9SWV9ERVZJQ0VfSElELAotCS5vcHMgPQkJewotCQkJCS5hZGQgPQkJYWNwaV9tZW1vcnlfZGV2aWNlX2FkZCwKLQkJCQkucmVtb3ZlID0JYWNwaV9tZW1vcnlfZGV2aWNlX3JlbW92ZSwKLQkJCX0sCisJLm5hbWUgPSBBQ1BJX01FTU9SWV9ERVZJQ0VfRFJJVkVSX05BTUUsCisJLmNsYXNzID0gQUNQSV9NRU1PUllfREVWSUNFX0NMQVNTLAorCS5pZHMgPSBBQ1BJX01FTU9SWV9ERVZJQ0VfSElELAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX21lbW9yeV9kZXZpY2VfYWRkLAorCQkucmVtb3ZlID0gYWNwaV9tZW1vcnlfZGV2aWNlX3JlbW92ZSwKKwkJfSwKIH07CiAKIHN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgewogCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQl1bnNpZ25lZCBpbnQgc3RhdGU7CQkvKiBTdGF0ZSBvZiB0aGUgbWVtb3J5IGRldmljZSAqLworCXVuc2lnbmVkIGludCBzdGF0ZTsJLyogU3RhdGUgb2YgdGhlIG1lbW9yeSBkZXZpY2UgKi8KIAl1bnNpZ25lZCBzaG9ydCBjYWNoZV9hdHRyaWJ1dGU7CS8qIG1lbW9yeSBjYWNoZSBhdHRyaWJ1dGUgKi8KLQl1bnNpZ25lZCBzaG9ydCByZWFkX3dyaXRlX2F0dHJpYnV0ZTsvKiBtZW1vcnkgcmVhZC93cml0ZSBhdHRyaWJ1dGUgKi8KLQl1NjQgc3RhcnRfYWRkcjsJLyogTWVtb3J5IFJhbmdlIHN0YXJ0IHBoeXNpY2FsIGFkZHIgKi8KLQl1NjQgZW5kX2FkZHI7CS8qIE1lbW9yeSBSYW5nZSBlbmQgcGh5c2ljYWwgYWRkciAqLworCXVuc2lnbmVkIHNob3J0IHJlYWRfd3JpdGVfYXR0cmlidXRlOwkvKiBtZW1vcnkgcmVhZC93cml0ZSBhdHRyaWJ1dGUgKi8KKwl1NjQgc3RhcnRfYWRkcjsJCS8qIE1lbW9yeSBSYW5nZSBzdGFydCBwaHlzaWNhbCBhZGRyICovCisJdTY0IGVuZF9hZGRyOwkJLyogTWVtb3J5IFJhbmdlIGVuZCBwaHlzaWNhbCBhZGRyICovCiB9OwogCi0KIHN0YXRpYyBpbnQKIGFjcGlfbWVtb3J5X2dldF9kZXZpY2VfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgKm1lbV9kZXZpY2UpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgYWRkcmVzczY0OwogCkBAIC05NCwxNSArOTIsMTUgQEAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCXJlc291cmNlID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlICopIGJ1ZmZlci5wb2ludGVyOworCXJlc291cmNlID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlICopYnVmZmVyLnBvaW50ZXI7CiAJc3RhdHVzID0gYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQocmVzb3VyY2UsICZhZGRyZXNzNjQpOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlpZiAoYWRkcmVzczY0LnJlc291cmNlX3R5cGUgPT0gQUNQSV9NRU1PUllfUkFOR0UpIHsKIAkJCS8qIFBvcHVsYXRlIHRoZSBzdHJ1Y3R1cmUgKi8KIAkJCW1lbV9kZXZpY2UtPmNhY2hlX2F0dHJpYnV0ZSA9Ci0JCQkJYWRkcmVzczY0LmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlOworCQkJICAgIGFkZHJlc3M2NC5hdHRyaWJ1dGUubWVtb3J5LmNhY2hlX2F0dHJpYnV0ZTsKIAkJCW1lbV9kZXZpY2UtPnJlYWRfd3JpdGVfYXR0cmlidXRlID0KLQkJCWFkZHJlc3M2NC5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlOworCQkJICAgIGFkZHJlc3M2NC5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlOwogCQkJbWVtX2RldmljZS0+c3RhcnRfYWRkciA9IGFkZHJlc3M2NC5taW5fYWRkcmVzc19yYW5nZTsKIAkJCW1lbV9kZXZpY2UtPmVuZF9hZGRyID0gYWRkcmVzczY0Lm1heF9hZGRyZXNzX3JhbmdlOwogCQl9CkBAIC0xMTQsNyArMTEyLDcgQEAKIAogc3RhdGljIGludAogYWNwaV9tZW1vcnlfZ2V0X2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsCi0Jc3RydWN0IGFjcGlfbWVtb3J5X2RldmljZSAqKm1lbV9kZXZpY2UpCisJCSAgICAgICBzdHJ1Y3QgYWNwaV9tZW1vcnlfZGV2aWNlICoqbWVtX2RldmljZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9oYW5kbGUgcGhhbmRsZTsKQEAgLTEyOCw4ICsxMjYsNyBAQAogCiAJc3RhdHVzID0gYWNwaV9nZXRfcGFyZW50KGhhbmRsZSwgJnBoYW5kbGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIkVycm9yIGluIGFjcGlfZ2V0X3BhcmVudFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRXJyb3IgaW4gYWNwaV9nZXRfcGFyZW50XG4iKSk7CiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAl9CiAKQEAgLTEzNyw3ICsxMzQsNyBAQAogCXN0YXR1cyA9IGFjcGlfYnVzX2dldF9kZXZpY2UocGhhbmRsZSwgJnBkZXZpY2UpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIkVycm9yIGluIGFjcGlfYnVzX2dldF9kZXZpY2VcbiIpKTsKKwkJCQkgICJFcnJvciBpbiBhY3BpX2J1c19nZXRfZGV2aWNlXG4iKSk7CiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAl9CiAKQEAgLTE0NywyMyArMTQ0LDIxIEBACiAJICovCiAJc3RhdHVzID0gYWNwaV9idXNfYWRkKCZkZXZpY2UsIHBkZXZpY2UsIGhhbmRsZSwgQUNQSV9CVVNfVFlQRV9ERVZJQ0UpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIkVycm9yIGluIGFjcGlfYnVzX2FkZFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRXJyb3IgaW4gYWNwaV9idXNfYWRkXG4iKSk7CiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAkqbWVtX2RldmljZSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAlpZiAoISgqbWVtX2RldmljZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJcbiBkcml2ZXIgZGF0YSBub3QgZm91bmQiICk7CisJCXByaW50ayhLRVJOX0VSUiAiXG4gZHJpdmVyIGRhdGEgbm90IGZvdW5kIik7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfbWVtb3J5X2NoZWNrX2RldmljZShzdHJ1Y3QgYWNwaV9tZW1vcnlfZGV2aWNlICptZW1fZGV2aWNlKQorc3RhdGljIGludCBhY3BpX21lbW9yeV9jaGVja19kZXZpY2Uoc3RydWN0IGFjcGlfbWVtb3J5X2RldmljZSAqbWVtX2RldmljZSkKIHsKIAl1bnNpZ25lZCBsb25nIGN1cnJlbnRfc3RhdHVzOwogCkBAIC0xNzEsMjIgKzE2NiwyMSBAQAogCiAJLyogR2V0IGRldmljZSBwcmVzZW50L2Fic2VudCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBfU1RBICovCiAJaWYgKEFDUElfRkFJTFVSRShhY3BpX2V2YWx1YXRlX2ludGVnZXIobWVtX2RldmljZS0+aGFuZGxlLCAiX1NUQSIsCi0JCU5VTEwsICZjdXJyZW50X3N0YXR1cykpKQorCQkJCQkgICAgICAgTlVMTCwgJmN1cnJlbnRfc3RhdHVzKSkpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAkvKgogCSAqIENoZWNrIGZvciBkZXZpY2Ugc3RhdHVzLiBEZXZpY2Ugc2hvdWxkIGJlCiAJICogcHJlc2VudC9lbmFibGVkL2Z1bmN0aW9uaW5nLgogCSAqLwogCWlmICghKChjdXJyZW50X3N0YXR1cyAmIEFDUElfTUVNT1JZX1NUQV9QUkVTRU5UKQotCQkmJiAoY3VycmVudF9zdGF0dXMgJiBBQ1BJX01FTU9SWV9TVEFfRU5BQkxFRCkKLQkJJiYgKGN1cnJlbnRfc3RhdHVzICYgQUNQSV9NRU1PUllfU1RBX0ZVTkNUSU9OQUwpKSkKKwkgICAgICAmJiAoY3VycmVudF9zdGF0dXMgJiBBQ1BJX01FTU9SWV9TVEFfRU5BQkxFRCkKKwkgICAgICAmJiAoY3VycmVudF9zdGF0dXMgJiBBQ1BJX01FTU9SWV9TVEFfRlVOQ1RJT05BTCkpKQogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfbWVtb3J5X2VuYWJsZV9kZXZpY2Uoc3RydWN0IGFjcGlfbWVtb3J5X2RldmljZSAqbWVtX2RldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9tZW1vcnlfZW5hYmxlX2RldmljZShzdHJ1Y3QgYWNwaV9tZW1vcnlfZGV2aWNlICptZW1fZGV2aWNlKQogewogCWludCByZXN1bHQ7CiAKQEAgLTE5Niw3ICsxOTAsNyBAQAogCXJlc3VsdCA9IGFjcGlfbWVtb3J5X2dldF9kZXZpY2VfcmVzb3VyY2VzKG1lbV9kZXZpY2UpOwogCWlmIChyZXN1bHQpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJcbmdldF9kZXZpY2VfcmVzb3VyY2VzIGZhaWxlZFxuIikpOworCQkJCSAgIlxuZ2V0X2RldmljZV9yZXNvdXJjZXMgZmFpbGVkXG4iKSk7CiAJCW1lbV9kZXZpY2UtPnN0YXRlID0gTUVNT1JZX0lOVkFMSURfU1RBVEU7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtMjA2LDExICsyMDAsMTAgQEAKIAkgKiBOb3RlOiBBc3N1bWUgdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBvbiBzdWNjZXNzCiAJICovCiAJcmVzdWx0ID0gYWRkX21lbW9yeShtZW1fZGV2aWNlLT5zdGFydF9hZGRyLAotCQkJKG1lbV9kZXZpY2UtPmVuZF9hZGRyIC0gbWVtX2RldmljZS0+c3RhcnRfYWRkcikgKyAxLAotCQkJbWVtX2RldmljZS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUpOworCQkJICAgIChtZW1fZGV2aWNlLT5lbmRfYWRkciAtIG1lbV9kZXZpY2UtPnN0YXJ0X2FkZHIpICsgMSwKKwkJCSAgICBtZW1fZGV2aWNlLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlxuYWRkX21lbW9yeSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIlxuYWRkX21lbW9yeSBmYWlsZWRcbiIpKTsKIAkJbWVtX2RldmljZS0+c3RhdGUgPSBNRU1PUllfSU5WQUxJRF9TVEFURTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC0yMTgsMTEgKzIxMSwxMCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfbWVtb3J5X3Bvd2VyZG93bl9kZXZpY2Uoc3RydWN0IGFjcGlfbWVtb3J5X2RldmljZSAqbWVtX2RldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9tZW1vcnlfcG93ZXJkb3duX2RldmljZShzdHJ1Y3QgYWNwaV9tZW1vcnlfZGV2aWNlICptZW1fZGV2aWNlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdfbGlzdDsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdDsKIAl1bmlvbiBhY3BpX29iamVjdCBhcmc7CiAJdW5zaWduZWQgbG9uZyBjdXJyZW50X3N0YXR1czsKIApAQCAtMjM0LDE2ICsyMjYsMTYgQEAKIAlhcmcudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOwogCWFyZy5pbnRlZ2VyLnZhbHVlID0gMTsKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChtZW1fZGV2aWNlLT5oYW5kbGUsCi0JCQkiX0VKMCIsICZhcmdfbGlzdCwgTlVMTCk7CisJCQkJICAgICAgIl9FSjAiLCAmYXJnX2xpc3QsIE5VTEwpOwogCS8qIFJldHVybiBvbiBfRUowIGZhaWx1cmUgKi8KIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwiX0VKMCBmYWlsZWQuXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJfRUowIGZhaWxlZC5cbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAogCS8qIEV2YWx1dGUgX1NUQSB0byBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIGRpc2FibGVkICovCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKG1lbV9kZXZpY2UtPmhhbmRsZSwgIl9TVEEiLAotCQlOVUxMLCAmY3VycmVudF9zdGF0dXMpOworCQkJCSAgICAgICBOVUxMLCAmY3VycmVudF9zdGF0dXMpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCkBAIC0yNTQsOCArMjQ2LDcgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfbWVtb3J5X2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgKm1lbV9kZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfbWVtb3J5X2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgKm1lbV9kZXZpY2UpCiB7CiAJaW50IHJlc3VsdDsKIAl1NjQgc3RhcnQgPSBtZW1fZGV2aWNlLT5zdGFydF9hZGRyOwpAQCAtMjc4LDcgKzI2OSw3IEBACiAJcmVzdWx0ID0gYWNwaV9tZW1vcnlfcG93ZXJkb3duX2RldmljZShtZW1fZGV2aWNlKTsKIAlpZiAocmVzdWx0KSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSJEZXZpY2UgUG93ZXIgRG93biBmYWlsZWQuXG4iKSk7CisJCQkJICAiRGV2aWNlIFBvd2VyIERvd24gZmFpbGVkLlxuIikpOwogCQkvKiBTZXQgdGhlIHN0YXR1cyBvZiB0aGUgZGV2aWNlIHRvIGludmFsaWQgKi8KIAkJbWVtX2RldmljZS0+c3RhdGUgPSBNRU1PUllfSU5WQUxJRF9TVEFURTsKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTI4OCw4ICsyNzksNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkCi1hY3BpX21lbW9yeV9kZXZpY2Vfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9tZW1vcnlfZGV2aWNlX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWNwaV9tZW1vcnlfZGV2aWNlICptZW1fZGV2aWNlOwogCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOwpAQCAtMjk5LDM3ICsyODksMzcgQEAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBBQ1BJX05PVElGWV9CVVNfQ0hFQ0s6CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJcblJlY2VpdmVkIEJVUyBDSEVDSyBub3RpZmljYXRpb24gZm9yIGRldmljZVxuIikpOworCQkJCSAgIlxuUmVjZWl2ZWQgQlVTIENIRUNLIG5vdGlmaWNhdGlvbiBmb3IgZGV2aWNlXG4iKSk7CiAJCS8qIEZhbGwgVGhyb3VnaCAqLwogCWNhc2UgQUNQSV9OT1RJRllfREVWSUNFX0NIRUNLOgogCQlpZiAoZXZlbnQgPT0gQUNQSV9OT1RJRllfREVWSUNFX0NIRUNLKQogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIlxuUmVjZWl2ZWQgREVWSUNFIENIRUNLIG5vdGlmaWNhdGlvbiBmb3IgZGV2aWNlXG4iKSk7CisJCQkJCSAgIlxuUmVjZWl2ZWQgREVWSUNFIENIRUNLIG5vdGlmaWNhdGlvbiBmb3IgZGV2aWNlXG4iKSk7CiAJCWlmIChhY3BpX21lbW9yeV9nZXRfZGV2aWNlKGhhbmRsZSwgJm1lbV9kZXZpY2UpKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJFcnJvciBpbiBmaW5kaW5nIGRyaXZlciBkYXRhXG4iKSk7CisJCQkJCSAgIkVycm9yIGluIGZpbmRpbmcgZHJpdmVyIGRhdGFcbiIpKTsKIAkJCXJldHVybl9WT0lEOwogCQl9CiAKIAkJaWYgKCFhY3BpX21lbW9yeV9jaGVja19kZXZpY2UobWVtX2RldmljZSkpIHsKIAkJCWlmIChhY3BpX21lbW9yeV9lbmFibGVfZGV2aWNlKG1lbV9kZXZpY2UpKQogCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJIkVycm9yIGluIGFjcGlfbWVtb3J5X2VuYWJsZV9kZXZpY2VcbiIpKTsKKwkJCQkJCSAgIkVycm9yIGluIGFjcGlfbWVtb3J5X2VuYWJsZV9kZXZpY2VcbiIpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIEFDUElfTk9USUZZX0VKRUNUX1JFUVVFU1Q6CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJcblJlY2VpdmVkIEVKRUNUIFJFUVVFU1Qgbm90aWZpY2F0aW9uIGZvciBkZXZpY2VcbiIpKTsKKwkJCQkgICJcblJlY2VpdmVkIEVKRUNUIFJFUVVFU1Qgbm90aWZpY2F0aW9uIGZvciBkZXZpY2VcbiIpKTsKIAogCQlpZiAoYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiRGV2aWNlIGRvZXNuJ3QgZXhpc3RcbiIpKTsKKwkJCQkJICAiRGV2aWNlIGRvZXNuJ3QgZXhpc3RcbiIpKTsKIAkJCWJyZWFrOwogCQl9CiAJCW1lbV9kZXZpY2UgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAJCWlmICghbWVtX2RldmljZSkgewogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkRyaXZlciBEYXRhIGlzIE5VTExcbiIpKTsKKwkJCQkJICAiRHJpdmVyIERhdGEgaXMgTlVMTFxuIikpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMzM3LDI2ICszMjcsMjUgQEAKIAkJICogQ3VycmVudGx5IGRpc2FibGluZyBtZW1vcnkgZGV2aWNlIGZyb20ga2VybmVsIG1vZGUKIAkJICogVEJEOiBDYW4gYWxzbyBiZSBkaXNhYmxlZCBmcm9tIHVzZXIgbW9kZSBzY3JpcHRzCiAJCSAqIFRCRDogQ2FuIGFsc28gYmUgZGlzYWJsZWQgYnkgQ2FsbGJhY2sgcmVnaXN0cmF0aW9uCi0JCSAqIAl3aXRoIGdlbmVyaWMgc3lzZnMgZHJpdmVyCisJCSAqICAgICAgd2l0aCBnZW5lcmljIHN5c2ZzIGRyaXZlcgogCQkgKi8KIAkJaWYgKGFjcGlfbWVtb3J5X2Rpc2FibGVfZGV2aWNlKG1lbV9kZXZpY2UpKQogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiRXJyb3IgaW4gYWNwaV9tZW1vcnlfZGlzYWJsZV9kZXZpY2VcbiIpKTsKKwkJCQkJICAiRXJyb3IgaW4gYWNwaV9tZW1vcnlfZGlzYWJsZV9kZXZpY2VcbiIpKTsKIAkJLyoKIAkJICogVEJEOiBJbnZva2UgYWNwaV9idXNfcmVtb3ZlIHRvIGNsZWFudXAgZGF0YSBzdHJ1Y3R1cmVzCiAJCSAqLwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOworCQkJCSAgIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfbWVtb3J5X2RldmljZV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfbWVtb3J5X2RldmljZV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgYWNwaV9tZW1vcnlfZGV2aWNlICptZW1fZGV2aWNlID0gTlVMTDsKQEAgLTM5MSw4ICszODAsNyBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX21lbW9yeV9kZXZpY2VfcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCitzdGF0aWMgaW50IGFjcGlfbWVtb3J5X2RldmljZV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewogCXN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgKm1lbV9kZXZpY2UgPSBOVUxMOwogCkBAIC00MDEsNyArMzg5LDcgQEAKIAlpZiAoIWRldmljZSB8fCAhYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQltZW1fZGV2aWNlID0gKHN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCW1lbV9kZXZpY2UgPSAoc3RydWN0IGFjcGlfbWVtb3J5X2RldmljZSAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAlrZnJlZShtZW1fZGV2aWNlKTsKIAogCXJldHVybl9WQUxVRSgwKTsKQEAgLTQxMCwxMiArMzk4LDExIEBACiAvKgogICogSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGZvciBtZW1vcnkgZGV2aWNlCiAgKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotaXNfbWVtb3J5X2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpCitzdGF0aWMgYWNwaV9zdGF0dXMgaXNfbWVtb3J5X2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpCiB7CiAJY2hhciAqaGFyZHdhcmVfaWQ7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAJc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gKmluZm87CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJpc19tZW1vcnlfZGV2aWNlIik7CkBAIC00MzIsNyArNDE5LDcgQEAKIAogCWhhcmR3YXJlX2lkID0gaW5mby0+aGFyZHdhcmVfaWQudmFsdWU7CiAJaWYgKChoYXJkd2FyZV9pZCA9PSBOVUxMKSB8fAotCQkoc3RyY21wKGhhcmR3YXJlX2lkLCBBQ1BJX01FTU9SWV9ERVZJQ0VfSElEKSkpCisJICAgIChzdHJjbXAoaGFyZHdhcmVfaWQsIEFDUElfTUVNT1JZX0RFVklDRV9ISUQpKSkKIAkJc3RhdHVzID0gQUVfRVJST1I7CiAKIAlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwpAQCAtNDQwLDggKzQyNyw4IEBACiB9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9tZW1vcnlfcmVnaXN0ZXJfbm90aWZ5X2hhbmRsZXIgKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQl1MzIgbGV2ZWwsIHZvaWQgKmN0eHQsIHZvaWQgKipyZXR2KQorYWNwaV9tZW1vcnlfcmVnaXN0ZXJfbm90aWZ5X2hhbmRsZXIoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJCSAgICB1MzIgbGV2ZWwsIHZvaWQgKmN0eHQsIHZvaWQgKipyZXR2KQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIApAQCAtNDUyLDEwICs0MzksMTAgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsJLyogY29udGludWUgKi8KIAogCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihoYW5kbGUsIEFDUElfU1lTVEVNX05PVElGWSwKLQkJCWFjcGlfbWVtb3J5X2RldmljZV9ub3RpZnksIE5VTEwpOworCQkJCQkgICAgIGFjcGlfbWVtb3J5X2RldmljZV9ub3RpZnksIE5VTEwpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKKwkJCQkgICJFcnJvciBpbnN0YWxsaW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CS8qIGNvbnRpbnVlICovCiAJfQogCkBAIC00NjMsOCArNDUwLDggQEAKIH0KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX21lbW9yeV9kZXJlZ2lzdGVyX25vdGlmeV9oYW5kbGVyIChhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQkgICAgICAgdTMyIGxldmVsLCB2b2lkICpjdHh0LCB2b2lkICoqcmV0dikKK2FjcGlfbWVtb3J5X2RlcmVnaXN0ZXJfbm90aWZ5X2hhbmRsZXIoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJCSAgICAgIHUzMiBsZXZlbCwgdm9pZCAqY3R4dCwgdm9pZCAqKnJldHYpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCkBAIC00NzUsMTggKzQ2MiwxOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwkvKiBjb250aW51ZSAqLwogCiAJc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoaGFuZGxlLAotCQkJQUNQSV9TWVNURU1fTk9USUZZLCBhY3BpX21lbW9yeV9kZXZpY2Vfbm90aWZ5KTsKKwkJCQkJICAgIEFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJICAgIGFjcGlfbWVtb3J5X2RldmljZV9ub3RpZnkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CS8qIGNvbnRpbnVlICovCiAJfQogCiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX21lbW9yeV9kZXZpY2VfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfbWVtb3J5X2RldmljZV9pbml0KHZvaWQpCiB7CiAJaW50IHJlc3VsdDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CkBAIC00OTksMjEgKzQ4NiwyMCBAQAogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCi0JCQkJQUNQSV9VSU5UMzJfTUFYLAotCQkJCWFjcGlfbWVtb3J5X3JlZ2lzdGVyX25vdGlmeV9oYW5kbGVyLAotCQkJCU5VTEwsIE5VTEwpOworCQkJCSAgICAgQUNQSV9VSU5UMzJfTUFYLAorCQkJCSAgICAgYWNwaV9tZW1vcnlfcmVnaXN0ZXJfbm90aWZ5X2hhbmRsZXIsCisJCQkJICAgICBOVUxMLCBOVUxMKTsKIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJ3YWxrX25hbWVzcGFjZSBmYWlsZWRcbiIpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIndhbGtfbmFtZXNwYWNlIGZhaWxlZFxuIikpOwogCQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV9tZW1vcnlfZGV2aWNlX2RyaXZlcik7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKLSAgICAgICAgfQorCX0KIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0Ci1hY3BpX21lbW9yeV9kZXZpY2VfZXhpdCAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX21lbW9yeV9kZXZpY2VfZXhpdCh2b2lkKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIApAQCAtNTI0LDEyICs1MTAsMTIgQEAKIAkgKiBoYW5kbGVzLgogCSAqLwogCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgQUNQSV9ST09UX09CSkVDVCwKLQkJCUFDUElfVUlOVDMyX01BWCwKLQkJCWFjcGlfbWVtb3J5X2RlcmVnaXN0ZXJfbm90aWZ5X2hhbmRsZXIsCi0JCQlOVUxMLCBOVUxMKTsKKwkJCQkgICAgIEFDUElfVUlOVDMyX01BWCwKKwkJCQkgICAgIGFjcGlfbWVtb3J5X2RlcmVnaXN0ZXJfbm90aWZ5X2hhbmRsZXIsCisJCQkJICAgICBOVUxMLCBOVUxMKTsKIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAid2Fsa19uYW1lc3BhY2UgZmFpbGVkXG4iKSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAid2Fsa19uYW1lc3BhY2UgZmFpbGVkXG4iKSk7CiAKIAlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV9tZW1vcnlfZGV2aWNlX2RyaXZlcik7CiAKQEAgLTUzOCw1ICs1MjQsMyBAQAogCiBtb2R1bGVfaW5pdChhY3BpX21lbW9yeV9kZXZpY2VfaW5pdCk7CiBtb2R1bGVfZXhpdChhY3BpX21lbW9yeV9kZXZpY2VfZXhpdCk7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jIGIvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCmluZGV4IGE1NjBiMWUuLmZlYzg5NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKQEAgLTYxLDcgKzYxLDcgQEAKIC8qCiAgKiBTb21lIGV2ZW50cyB3ZSB1c2UsIHNhbWUgZm9yIGFsbCBBc3VzCiAgKi8KLSNkZWZpbmUgQlJfVVAgICAgICAgMHgxMCAgICAgIAkJCisjZGVmaW5lIEJSX1VQICAgICAgIDB4MTAKICNkZWZpbmUgQlJfRE9XTiAgICAgMHgyMAogCiAvKgpAQCAtNzUsNyArNzUsNiBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfSE9US19OQU1FKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotCiBzdGF0aWMgdWlkX3QgYXN1c191aWQ7CiBzdGF0aWMgZ2lkX3QgYXN1c19naWQ7CiBtb2R1bGVfcGFyYW0oYXN1c191aWQsIHVpbnQsIDApOwpAQCAtODMsMjYgKzgyLDI1IEBACiBtb2R1bGVfcGFyYW0oYXN1c19naWQsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhnaWQsICJHSUQgZm9yIGVudHJpZXMgaW4gL3Byb2MvYWNwaS9hc3VzLlxuIik7CiAKLQogLyogRm9yIGVhY2ggbW9kZWwsIGFsbCBmZWF0dXJlcyBpbXBsZW1lbnRlZCwgCiAgKiB0aG9zZSBtYXJrZWQgd2l0aCBSIGFyZSByZWxhdGl2ZSB0byBIT1RLLCBBIGZvciBhYnNvbHV0ZSAqLwogc3RydWN0IG1vZGVsX2RhdGEgewotCWNoYXIgKm5hbWU7ICAgICAgICAgICAgICAvL25hbWUgb2YgdGhlIGxhcHRvcF9fX19fX19fX19fX19fX19BCi0JY2hhciAqbXRfbWxlZDsgICAgICAgICAgIC8vbWV0aG9kIHRvIGhhbmRsZSBtbGVkX19fX19fX19fX19fX1IKLQljaGFyICptbGVkX3N0YXR1czsgICAgICAgLy9ub2RlIHRvIGhhbmRsZSBtbGVkIHJlYWRpbmdfX19fX19fQQotCWNoYXIgKm10X3dsZWQ7ICAgICAgICAgICAvL21ldGhvZCB0byBoYW5kbGUgd2xlZF9fX19fX19fX19fX19SCi0JY2hhciAqd2xlZF9zdGF0dXM7ICAgICAgIC8vbm9kZSB0byBoYW5kbGUgd2xlZCByZWFkaW5nX19fX19fX0EKLSAJY2hhciAqbXRfdGxlZDsgICAgICAgICAgIC8vbWV0aG9kIHRvIGhhbmRsZSB0bGVkX19fX19fX19fX19fX1IKLSAJY2hhciAqdGxlZF9zdGF0dXM7ICAgICAgIC8vbm9kZSB0byBoYW5kbGUgdGxlZCByZWFkaW5nX19fX19fX0EKLQljaGFyICptdF9sY2Rfc3dpdGNoOyAgICAgLy9tZXRob2QgdG8gdHVybiBMQ0QgT04vT0ZGX19fX19fX19fQQotCWNoYXIgKmxjZF9zdGF0dXM7ICAgICAgICAvL25vZGUgdG8gcmVhZCBMQ0QgcGFuZWwgc3RhdGVfX19fX19BCi0JY2hhciAqYnJpZ2h0bmVzc191cDsgICAgIC8vbWV0aG9kIHRvIHNldCBicmlnaHRuZXNzIHVwX19fX19fX0EKLQljaGFyICpicmlnaHRuZXNzX2Rvd247ICAgLy9ndWVzcyB3aGF0ID9fX19fX19fX19fX19fX19fX19fX19fQQotCWNoYXIgKmJyaWdodG5lc3Nfc2V0OyAgICAvL21ldGhvZCB0byBzZXQgYWJzb2x1dGUgYnJpZ2h0bmVzc19SCi0JY2hhciAqYnJpZ2h0bmVzc19nZXQ7ICAgIC8vbWV0aG9kIHRvIGdldCBhYnNvbHV0ZSBicmlnaHRuZXNzX1IKLQljaGFyICpicmlnaHRuZXNzX3N0YXR1czsgLy9ub2RlIHRvIGdldCBicmlnaHRuZXNzX19fX19fX19fX19fQQotCWNoYXIgKmRpc3BsYXlfc2V0OyAgICAgICAvL21ldGhvZCB0byBzZXQgdmlkZW8gb3V0cHV0X19fX19fX19SCi0JY2hhciAqZGlzcGxheV9nZXQ7ICAgICAgIC8vbWV0aG9kIHRvIGdldCB2aWRlbyBvdXRwdXRfX19fX19fX1IKKwljaGFyICpuYW1lOwkJLy9uYW1lIG9mIHRoZSBsYXB0b3BfX19fX19fX19fX19fX19fQQorCWNoYXIgKm10X21sZWQ7CQkvL21ldGhvZCB0byBoYW5kbGUgbWxlZF9fX19fX19fX19fX19SCisJY2hhciAqbWxlZF9zdGF0dXM7CS8vbm9kZSB0byBoYW5kbGUgbWxlZCByZWFkaW5nX19fX19fX0EKKwljaGFyICptdF93bGVkOwkJLy9tZXRob2QgdG8gaGFuZGxlIHdsZWRfX19fX19fX19fX19fUgorCWNoYXIgKndsZWRfc3RhdHVzOwkvL25vZGUgdG8gaGFuZGxlIHdsZWQgcmVhZGluZ19fX19fX19BCisJY2hhciAqbXRfdGxlZDsJCS8vbWV0aG9kIHRvIGhhbmRsZSB0bGVkX19fX19fX19fX19fX1IKKwljaGFyICp0bGVkX3N0YXR1czsJLy9ub2RlIHRvIGhhbmRsZSB0bGVkIHJlYWRpbmdfX19fX19fQQorCWNoYXIgKm10X2xjZF9zd2l0Y2g7CS8vbWV0aG9kIHRvIHR1cm4gTENEIE9OL09GRl9fX19fX19fX0EKKwljaGFyICpsY2Rfc3RhdHVzOwkvL25vZGUgdG8gcmVhZCBMQ0QgcGFuZWwgc3RhdGVfX19fX19BCisJY2hhciAqYnJpZ2h0bmVzc191cDsJLy9tZXRob2QgdG8gc2V0IGJyaWdodG5lc3MgdXBfX19fX19fQQorCWNoYXIgKmJyaWdodG5lc3NfZG93bjsJLy9ndWVzcyB3aGF0ID9fX19fX19fX19fX19fX19fX19fX19fQQorCWNoYXIgKmJyaWdodG5lc3Nfc2V0OwkvL21ldGhvZCB0byBzZXQgYWJzb2x1dGUgYnJpZ2h0bmVzc19SCisJY2hhciAqYnJpZ2h0bmVzc19nZXQ7CS8vbWV0aG9kIHRvIGdldCBhYnNvbHV0ZSBicmlnaHRuZXNzX1IKKwljaGFyICpicmlnaHRuZXNzX3N0YXR1czsJLy9ub2RlIHRvIGdldCBicmlnaHRuZXNzX19fX19fX19fX19fQQorCWNoYXIgKmRpc3BsYXlfc2V0OwkvL21ldGhvZCB0byBzZXQgdmlkZW8gb3V0cHV0X19fX19fX19SCisJY2hhciAqZGlzcGxheV9nZXQ7CS8vbWV0aG9kIHRvIGdldCB2aWRlbyBvdXRwdXRfX19fX19fX1IKIH07CiAKIC8qCkBAIC0xMTAsMzQgKzEwOCwzNCBAQAogICogYWJvdXQgdGhlIGhvdGsgZGV2aWNlCiAgKi8KIHN0cnVjdCBhc3VzX2hvdGsgewotCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOyAvL3RoZSBkZXZpY2Ugd2UgYXJlIGluCi0JYWNwaV9oYW5kbGUgaGFuZGxlOyAgICAgICAgIC8vdGhlIGhhbmRsZSBvZiB0aGUgaG90ayBkZXZpY2UKLQljaGFyIHN0YXR1czsgICAgICAgICAgICAgICAgLy9zdGF0dXMgb2YgdGhlIGhvdGssIGZvciBMRURzLCAuLi4KLQlzdHJ1Y3QgbW9kZWxfZGF0YSAqbWV0aG9kczsgLy9tZXRob2RzIGF2YWlsYWJsZSBvbiB0aGUgbGFwdG9wCi0JdTggYnJpZ2h0bmVzczsgICAgICAgICAgICAgIC8vYnJpZ2h0bmVzcyBsZXZlbAorCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOwkvL3RoZSBkZXZpY2Ugd2UgYXJlIGluCisJYWNwaV9oYW5kbGUgaGFuZGxlOwkvL3RoZSBoYW5kbGUgb2YgdGhlIGhvdGsgZGV2aWNlCisJY2hhciBzdGF0dXM7CQkvL3N0YXR1cyBvZiB0aGUgaG90aywgZm9yIExFRHMsIC4uLgorCXN0cnVjdCBtb2RlbF9kYXRhICptZXRob2RzOwkvL21ldGhvZHMgYXZhaWxhYmxlIG9uIHRoZSBsYXB0b3AKKwl1OCBicmlnaHRuZXNzOwkJLy9icmlnaHRuZXNzIGxldmVsCiAJZW51bSB7Ci0JCUExeCA9IDAsICAvL0ExMzQwRCwgQTEzMDBGCi0JCUEyeCwgICAgICAvL0EyNTAwSAotCQlEMXgsICAgICAgLy9EMQotCQlMMkQsICAgICAgLy9MMjAwMEQKLQkJTDNDLCAgICAgIC8vTDM4MDBDCi0JCUwzRCwgICAgICAvL0wzNDAwRAotCQlMM0gsICAgICAgLy9MM0gsIGJ1dCBhbHNvIEwyMDAwRQotCQlMNFIsICAgICAgLy9MNDUwMFIKLQkJTDV4LCAgICAgIC8vTDU4MDBDIAotCQlMOEwsICAgICAgLy9MODQwMEwKLQkJTTFBLCAgICAgIC8vTTEzMDBBCi0JCU0yRSwgICAgICAvL00yNDAwRSwgTDQ0MDBMCi0JCU02TiwgICAgICAvL002ODAwTgotCQlNNlIsICAgICAgLy9NNjcwMFIKLQkJUDMwLAkgIC8vU2Ftc3VuZyBQMzAKLQkJUzF4LCAgICAgIC8vUzEzMDBBLCBidXQgYWxzbyBMMTQwMEIgYW5kIE0yNDAwQSAoTDg0RikKLQkJUzJ4LCAgICAgIC8vUzIwMCAoSjEgcmVwb3J0ZWQpLCBWaWN0b3IgTVAtWFA3MjEwCi0JCXh4TiwgICAgICAvL00yNDAwTiwgTTM3MDBOLCBNNTIwME4sIFMxMzAwTiwgUzUyMDBOLCBXMU9PT04KLQkJCSAgLy8oQ2VudHJpbm8pCisJCUExeCA9IDAsCS8vQTEzNDBELCBBMTMwMEYKKwkJQTJ4LAkJLy9BMjUwMEgKKwkJRDF4LAkJLy9EMQorCQlMMkQsCQkvL0wyMDAwRAorCQlMM0MsCQkvL0wzODAwQworCQlMM0QsCQkvL0wzNDAwRAorCQlMM0gsCQkvL0wzSCwgYnV0IGFsc28gTDIwMDBFCisJCUw0UiwJCS8vTDQ1MDBSCisJCUw1eCwJCS8vTDU4MDBDIAorCQlMOEwsCQkvL0w4NDAwTAorCQlNMUEsCQkvL00xMzAwQQorCQlNMkUsCQkvL00yNDAwRSwgTDQ0MDBMCisJCU02TiwJCS8vTTY4MDBOCisJCU02UiwJCS8vTTY3MDBSCisJCVAzMCwJCS8vU2Ftc3VuZyBQMzAKKwkJUzF4LAkJLy9TMTMwMEEsIGJ1dCBhbHNvIEwxNDAwQiBhbmQgTTI0MDBBIChMODRGKQorCQlTMngsCQkvL1MyMDAgKEoxIHJlcG9ydGVkKSwgVmljdG9yIE1QLVhQNzIxMAorCQl4eE4sCQkvL00yNDAwTiwgTTM3MDBOLCBNNTIwME4sIFMxMzAwTiwgUzUyMDBOLCBXMU9PT04KKwkJLy8oQ2VudHJpbm8pCiAJCUVORF9NT0RFTAotCX0gbW9kZWw7ICAgICAgICAgICAgICAvL01vZGVscyBjdXJyZW50bHkgc3VwcG9ydGVkCi0JdTE2IGV2ZW50X2NvdW50WzEyOF07IC8vY291bnQgZm9yIGVhY2ggZXZlbnQgVE9ETyBtYWtlIHRoaXMgYmV0dGVyCisJfSBtb2RlbDsJCS8vTW9kZWxzIGN1cnJlbnRseSBzdXBwb3J0ZWQKKwl1MTYgZXZlbnRfY291bnRbMTI4XTsJLy9jb3VudCBmb3IgZWFjaCBldmVudCBUT0RPIG1ha2UgdGhpcyBiZXR0ZXIKIH07CiAKIC8qIEhlcmUgd2UgZ28gKi8KQEAgLTE1MCw3ICsxNDgsNyBAQAogI2RlZmluZSB4eE5fUFJFRklYICJcXF9TQi5QQ0kwLlNCUkcuRUMwLiIKIAogc3RhdGljIHN0cnVjdCBtb2RlbF9kYXRhIG1vZGVsX2NvbmZbRU5EX01PREVMXSA9IHsKLSAgICAgICAgLyoKKwkvKgogCSAqIFRob3NlIHBhdGhuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIEhPVEsgLyBBVEtEIGRldmljZSA6CiAJICogICAgICAgLSBtdF9tbGVkCiAJICogICAgICAgLSBtdF93bGVkCkBAIC0xNjUsMjE1ICsxNjMsMTk3IEBACiAJICovCiAKIAl7Ci0JCS5uYW1lICAgICAgICAgICAgICA9ICJBMXgiLAotCQkubXRfbWxlZCAgICAgICAgICAgPSAiTUxFRCIsCi0JCS5tbGVkX3N0YXR1cyAgICAgICA9ICJcXE1BSUwiLAotCQkubXRfbGNkX3N3aXRjaCAgICAgPSBBMXhfUFJFRklYICJfUTEwIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcQktMSSIsCi0JCS5icmlnaHRuZXNzX3VwICAgICA9IEExeF9QUkVGSVggIl9RMEUiLAotCQkuYnJpZ2h0bmVzc19kb3duICAgPSBBMXhfUFJFRklYICJfUTBGIgotCX0sCisJIC5uYW1lID0gIkExeCIsCisJIC5tdF9tbGVkID0gIk1MRUQiLAorCSAubWxlZF9zdGF0dXMgPSAiXFxNQUlMIiwKKwkgLm10X2xjZF9zd2l0Y2ggPSBBMXhfUFJFRklYICJfUTEwIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxCS0xJIiwKKwkgLmJyaWdodG5lc3NfdXAgPSBBMXhfUFJFRklYICJfUTBFIiwKKwkgLmJyaWdodG5lc3NfZG93biA9IEExeF9QUkVGSVggIl9RMEYifSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIkEyeCIsCi0JCS5tdF9tbGVkICAgICAgICAgICA9ICJNTEVEIiwKLQkJLm10X3dsZWQgICAgICAgICAgID0gIldMRUQiLAotCQkud2xlZF9zdGF0dXMgICAgICAgPSAiXFxTRzY2IiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0gIlxcUTEwIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcQkFPRiIsCi0JCS5icmlnaHRuZXNzX3NldCAgICA9ICJTUExWIiwKLQkJLmJyaWdodG5lc3NfZ2V0ICAgID0gIkdQTFYiLAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXElORkIiCi0JfSwKKwkgLm5hbWUgPSAiQTJ4IiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCisJIC5tdF93bGVkID0gIldMRUQiLAorCSAud2xlZF9zdGF0dXMgPSAiXFxTRzY2IiwKKwkgLm10X2xjZF9zd2l0Y2ggPSAiXFxRMTAiLAorCSAubGNkX3N0YXR1cyA9ICJcXEJBT0YiLAorCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCisJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKKwkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAorCSAuZGlzcGxheV9nZXQgPSAiXFxJTkZCIn0sCiAKIAl7Ci0JCS5uYW1lICAgICAgICAgICAgICA9ICJEMXgiLAotCQkubXRfbWxlZCAgICAgICAgICAgPSAiTUxFRCIsCi0JCS5tdF9sY2Rfc3dpdGNoICAgICA9ICJcXFEwRCIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXEdQMTEiLAotCQkuYnJpZ2h0bmVzc191cCAgICAgPSAiXFxRMEMiLAotCQkuYnJpZ2h0bmVzc19kb3duICAgPSAiXFxRMEIiLAotCQkuYnJpZ2h0bmVzc19zdGF0dXMgPSAiXFxCTFZMIiwKLQkJLmRpc3BsYXlfc2V0ICAgICAgID0gIlNEU1AiLAotCQkuZGlzcGxheV9nZXQgICAgICAgPSAiXFxJTkZCIgotCX0sCisJIC5uYW1lID0gIkQxeCIsCisJIC5tdF9tbGVkID0gIk1MRUQiLAorCSAubXRfbGNkX3N3aXRjaCA9ICJcXFEwRCIsCisJIC5sY2Rfc3RhdHVzID0gIlxcR1AxMSIsCisJIC5icmlnaHRuZXNzX3VwID0gIlxcUTBDIiwKKwkgLmJyaWdodG5lc3NfZG93biA9ICJcXFEwQiIsCisJIC5icmlnaHRuZXNzX3N0YXR1cyA9ICJcXEJMVkwiLAorCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCisJIC5kaXNwbGF5X2dldCA9ICJcXElORkIifSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIkwyRCIsCi0JCS5tdF9tbGVkICAgICAgICAgICA9ICJNTEVEIiwKLQkJLm1sZWRfc3RhdHVzICAgICAgID0gIlxcU0dQNiIsCi0JCS5tdF93bGVkICAgICAgICAgICA9ICJXTEVEIiwKLQkJLndsZWRfc3RhdHVzICAgICAgID0gIlxcUkNQMyIsCi0JCS5tdF9sY2Rfc3dpdGNoICAgICA9ICJcXFExMCIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXFNHUDAiLAotCQkuYnJpZ2h0bmVzc191cCAgICAgPSAiXFxRMEUiLAotCQkuYnJpZ2h0bmVzc19kb3duICAgPSAiXFxRMEYiLAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXElORkIiCi0JfSwKKwkgLm5hbWUgPSAiTDJEIiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCisJIC5tbGVkX3N0YXR1cyA9ICJcXFNHUDYiLAorCSAubXRfd2xlZCA9ICJXTEVEIiwKKwkgLndsZWRfc3RhdHVzID0gIlxcUkNQMyIsCisJIC5tdF9sY2Rfc3dpdGNoID0gIlxcUTEwIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxTR1AwIiwKKwkgLmJyaWdodG5lc3NfdXAgPSAiXFxRMEUiLAorCSAuYnJpZ2h0bmVzc19kb3duID0gIlxcUTBGIiwKKwkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAorCSAuZGlzcGxheV9nZXQgPSAiXFxJTkZCIn0sCiAKIAl7Ci0JCS5uYW1lICAgICAgICAgICAgICA9ICJMM0MiLAotCQkubXRfbWxlZCAgICAgICAgICAgPSAiTUxFRCIsCi0JCS5tdF93bGVkICAgICAgICAgICA9ICJXTEVEIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0gTDNDX1BSRUZJWCAiX1ExMCIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXEdMMzIiLAotCQkuYnJpZ2h0bmVzc19zZXQgICAgPSAiU1BMViIsCi0JCS5icmlnaHRuZXNzX2dldCAgICA9ICJHUExWIiwKLQkJLmRpc3BsYXlfc2V0ICAgICAgID0gIlNEU1AiLAotCQkuZGlzcGxheV9nZXQgICAgICAgPSAiXFxfU0IuUENJMC5QQ0kxLlZHQUMuTk1BUCIKLQl9LAorCSAubmFtZSA9ICJMM0MiLAorCSAubXRfbWxlZCA9ICJNTEVEIiwKKwkgLm10X3dsZWQgPSAiV0xFRCIsCisJIC5tdF9sY2Rfc3dpdGNoID0gTDNDX1BSRUZJWCAiX1ExMCIsCisJIC5sY2Rfc3RhdHVzID0gIlxcR0wzMiIsCisJIC5icmlnaHRuZXNzX3NldCA9ICJTUExWIiwKKwkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAorCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCisJIC5kaXNwbGF5X2dldCA9ICJcXF9TQi5QQ0kwLlBDSTEuVkdBQy5OTUFQIn0sCiAKIAl7Ci0JCS5uYW1lICAgICAgICAgICAgICA9ICJMM0QiLAotCQkubXRfbWxlZCAgICAgICAgICAgPSAiTUxFRCIsCi0JCS5tbGVkX3N0YXR1cyAgICAgICA9ICJcXE1BTEQiLAotCQkubXRfd2xlZCAgICAgICAgICAgPSAiV0xFRCIsCi0JCS5tdF9sY2Rfc3dpdGNoICAgICA9ICJcXFExMCIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXEJLTEciLAotCQkuYnJpZ2h0bmVzc19zZXQgICAgPSAiU1BMViIsCi0JCS5icmlnaHRuZXNzX2dldCAgICA9ICJHUExWIiwKLQkJLmRpc3BsYXlfc2V0ICAgICAgID0gIlNEU1AiLAotCQkuZGlzcGxheV9nZXQgICAgICAgPSAiXFxJTkZCIgotCX0sCisJIC5uYW1lID0gIkwzRCIsCisJIC5tdF9tbGVkID0gIk1MRUQiLAorCSAubWxlZF9zdGF0dXMgPSAiXFxNQUxEIiwKKwkgLm10X3dsZWQgPSAiV0xFRCIsCisJIC5tdF9sY2Rfc3dpdGNoID0gIlxcUTEwIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxCS0xHIiwKKwkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAorCSAuYnJpZ2h0bmVzc19nZXQgPSAiR1BMViIsCisJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKKwkgLmRpc3BsYXlfZ2V0ID0gIlxcSU5GQiJ9LAogCiAJewotCQkubmFtZSAgICAgICAgICAgICAgPSAiTDNIIiwKLQkJLm10X21sZWQgICAgICAgICAgID0gIk1MRUQiLAotCQkubXRfd2xlZCAgICAgICAgICAgPSAiV0xFRCIsCi0JCS5tdF9sY2Rfc3dpdGNoICAgICA9ICJFSEsiLAotCQkubGNkX3N0YXR1cyAgICAgICAgPSAiXFxfU0IuUENJMC5QTS5QQkMiLAotCQkuYnJpZ2h0bmVzc19zZXQgICAgPSAiU1BMViIsCi0JCS5icmlnaHRuZXNzX2dldCAgICA9ICJHUExWIiwKLQkJLmRpc3BsYXlfc2V0ICAgICAgID0gIlNEU1AiLAotCQkuZGlzcGxheV9nZXQgICAgICAgPSAiXFxJTkZCIgotCX0sCisJIC5uYW1lID0gIkwzSCIsCisJIC5tdF9tbGVkID0gIk1MRUQiLAorCSAubXRfd2xlZCA9ICJXTEVEIiwKKwkgLm10X2xjZF9zd2l0Y2ggPSAiRUhLIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxfU0IuUENJMC5QTS5QQkMiLAorCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCisJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKKwkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAorCSAuZGlzcGxheV9nZXQgPSAiXFxJTkZCIn0sCiAKIAl7Ci0JCS5uYW1lICAgICAgICAgICAgICA9ICJMNFIiLAotCQkubXRfbWxlZCAgICAgICAgICAgPSAiTUxFRCIsCi0JCS5tdF93bGVkICAgICAgICAgICA9ICJXTEVEIiwKLQkJLndsZWRfc3RhdHVzICAgICAgID0gIlxcX1NCLlBDSTAuU0JSRy5TRzEzIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0geHhOX1BSRUZJWCAiX1ExMCIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXF9TQi5QQ0kwLlNCU00uU0VPNCIsCi0JCS5icmlnaHRuZXNzX3NldCAgICA9ICJTUExWIiwKLQkJLmJyaWdodG5lc3NfZ2V0ICAgID0gIkdQTFYiLCAKLQkJLmRpc3BsYXlfc2V0ICAgICAgID0gIlNEU1AiLAotCQkuZGlzcGxheV9nZXQgICAgICAgPSAiXFxfU0IuUENJMC5QMFAxLlZHQS5HRVREIgotCX0sCisJIC5uYW1lID0gIkw0UiIsCisJIC5tdF9tbGVkID0gIk1MRUQiLAorCSAubXRfd2xlZCA9ICJXTEVEIiwKKwkgLndsZWRfc3RhdHVzID0gIlxcX1NCLlBDSTAuU0JSRy5TRzEzIiwKKwkgLm10X2xjZF9zd2l0Y2ggPSB4eE5fUFJFRklYICJfUTEwIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxfU0IuUENJMC5TQlNNLlNFTzQiLAorCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCisJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKKwkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAorCSAuZGlzcGxheV9nZXQgPSAiXFxfU0IuUENJMC5QMFAxLlZHQS5HRVREIn0sCiAKIAl7Ci0JCS5uYW1lICAgICAgICAgICAgICA9ICJMNXgiLAotCQkubXRfbWxlZCAgICAgICAgICAgPSAiTUxFRCIsCisJIC5uYW1lID0gIkw1eCIsCisJIC5tdF9tbGVkID0gIk1MRUQiLAogLyogV0xFRCBwcmVzZW50LCBidXQgbm90IGNvbnRyb2xsZWQgYnkgQUNQSSAqLwotCQkubXRfdGxlZCAgICAgICAgICAgPSAiVExFRCIsCi0JCS5tdF9sY2Rfc3dpdGNoICAgICA9ICJcXFEwRCIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXEJBT0YiLAotCQkuYnJpZ2h0bmVzc19zZXQgICAgPSAiU1BMViIsCi0JCS5icmlnaHRuZXNzX2dldCAgICA9ICJHUExWIiwKLQkJLmRpc3BsYXlfc2V0ICAgICAgID0gIlNEU1AiLAotCQkuZGlzcGxheV9nZXQgICAgICAgPSAiXFxJTkZCIgotCX0sCisJIC5tdF90bGVkID0gIlRMRUQiLAorCSAubXRfbGNkX3N3aXRjaCA9ICJcXFEwRCIsCisJIC5sY2Rfc3RhdHVzID0gIlxcQkFPRiIsCisJIC5icmlnaHRuZXNzX3NldCA9ICJTUExWIiwKKwkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAorCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCisJIC5kaXNwbGF5X2dldCA9ICJcXElORkIifSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIkw4TCIKKwkgLm5hbWUgPSAiTDhMIgogLyogTm8gZmVhdHVyZXMsIGJ1dCBhdCBsZWFzdCBzdXBwb3J0IHRoZSBob3RrZXlzICovCi0JfSwKKwkgfSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIk0xQSIsCi0JCS5tdF9tbGVkICAgICAgICAgICA9ICJNTEVEIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0gTTFBX1BSRUZJWCAiUTEwIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcUE5PRiIsCi0JCS5icmlnaHRuZXNzX3VwICAgICA9IE0xQV9QUkVGSVggIlEwRSIsCi0JCS5icmlnaHRuZXNzX2Rvd24gICA9IE0xQV9QUkVGSVggIlEwRiIsCi0JCS5icmlnaHRuZXNzX3N0YXR1cyA9ICJcXEJSSVQiLAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXElORkIiCi0JfSwKKwkgLm5hbWUgPSAiTTFBIiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCisJIC5tdF9sY2Rfc3dpdGNoID0gTTFBX1BSRUZJWCAiUTEwIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxQTk9GIiwKKwkgLmJyaWdodG5lc3NfdXAgPSBNMUFfUFJFRklYICJRMEUiLAorCSAuYnJpZ2h0bmVzc19kb3duID0gTTFBX1BSRUZJWCAiUTBGIiwKKwkgLmJyaWdodG5lc3Nfc3RhdHVzID0gIlxcQlJJVCIsCisJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKKwkgLmRpc3BsYXlfZ2V0ID0gIlxcSU5GQiJ9LAogCiAJewotCQkubmFtZSAgICAgICAgICAgICAgPSAiTTJFIiwKLQkJLm10X21sZWQgICAgICAgICAgID0gIk1MRUQiLAotCQkubXRfd2xlZCAgICAgICAgICAgPSAiV0xFRCIsCi0JCS5tdF9sY2Rfc3dpdGNoICAgICA9ICJcXFExMCIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXEdQMDYiLAotCQkuYnJpZ2h0bmVzc19zZXQgICAgPSAiU1BMViIsCi0JCS5icmlnaHRuZXNzX2dldCAgICA9ICJHUExWIiwKLQkJLmRpc3BsYXlfc2V0ICAgICAgID0gIlNEU1AiLAotCQkuZGlzcGxheV9nZXQgICAgICAgPSAiXFxJTkZCIgotCX0sCisJIC5uYW1lID0gIk0yRSIsCisJIC5tdF9tbGVkID0gIk1MRUQiLAorCSAubXRfd2xlZCA9ICJXTEVEIiwKKwkgLm10X2xjZF9zd2l0Y2ggPSAiXFxRMTAiLAorCSAubGNkX3N0YXR1cyA9ICJcXEdQMDYiLAorCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCisJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKKwkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAorCSAuZGlzcGxheV9nZXQgPSAiXFxJTkZCIn0sCiAKIAl7Ci0JCS5uYW1lICAgICAgICAgICAgICA9ICJNNk4iLAotCQkubXRfbWxlZCAgICAgICAgICAgPSAiTUxFRCIsCi0JCS5tdF93bGVkICAgICAgICAgICA9ICJXTEVEIiwKLQkJLndsZWRfc3RhdHVzICAgICAgID0gIlxcX1NCLlBDSTAuU0JSRy5TRzEzIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0geHhOX1BSRUZJWCAiX1ExMCIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXF9TQi5CS0xUIiwKLQkJLmJyaWdodG5lc3Nfc2V0ICAgID0gIlNQTFYiLAotCQkuYnJpZ2h0bmVzc19nZXQgICAgPSAiR1BMViIsCi0JCS5kaXNwbGF5X3NldCAgICAgICA9ICJTRFNQIiwKLQkJLmRpc3BsYXlfZ2V0ICAgICAgID0gIlxcU1NURSIKLQl9LAorCSAubmFtZSA9ICJNNk4iLAorCSAubXRfbWxlZCA9ICJNTEVEIiwKKwkgLm10X3dsZWQgPSAiV0xFRCIsCisJIC53bGVkX3N0YXR1cyA9ICJcXF9TQi5QQ0kwLlNCUkcuU0cxMyIsCisJIC5tdF9sY2Rfc3dpdGNoID0geHhOX1BSRUZJWCAiX1ExMCIsCisJIC5sY2Rfc3RhdHVzID0gIlxcX1NCLkJLTFQiLAorCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCisJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKKwkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAorCSAuZGlzcGxheV9nZXQgPSAiXFxTU1RFIn0sCiAJewotCQkubmFtZSAgICAgICAgICAgICAgPSAiTTZSIiwKLQkJLm10X21sZWQgICAgICAgICAgID0gIk1MRUQiLAotCQkubXRfd2xlZCAgICAgICAgICAgPSAiV0xFRCIsCi0JCS5tdF9sY2Rfc3dpdGNoICAgICA9IHh4Tl9QUkVGSVggIl9RMTAiLAotCQkubGNkX3N0YXR1cyAgICAgICAgPSAiXFxfU0IuUENJMC5TQlNNLlNFTzQiLAotCQkuYnJpZ2h0bmVzc19zZXQgICAgPSAiU1BMViIsCi0JCS5icmlnaHRuZXNzX2dldCAgICA9ICJHUExWIiwKLQkJLmRpc3BsYXlfc2V0ICAgICAgID0gIlNEU1AiLAotCQkuZGlzcGxheV9nZXQgICAgICAgPSAiXFxTU1RFIgotCX0sCi0KKwkgLm5hbWUgPSAiTTZSIiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCisJIC5tdF93bGVkID0gIldMRUQiLAorCSAubXRfbGNkX3N3aXRjaCA9IHh4Tl9QUkVGSVggIl9RMTAiLAorCSAubGNkX3N0YXR1cyA9ICJcXF9TQi5QQ0kwLlNCU00uU0VPNCIsCisJIC5icmlnaHRuZXNzX3NldCA9ICJTUExWIiwKKwkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAorCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCisJIC5kaXNwbGF5X2dldCA9ICJcXFNTVEUifSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIlAzMCIsCi0JCS5tdF93bGVkICAgICAgICAgICA9ICJXTEVEIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0gUDMwX1BSRUZJWCAiX1EwRSIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXEJLTFQiLAotCQkuYnJpZ2h0bmVzc191cCAgICAgPSBQMzBfUFJFRklYICJfUTY4IiwKLQkJLmJyaWdodG5lc3NfZG93biAgID0gUDMwX1BSRUZJWCAiX1E2OSIsCi0JCS5icmlnaHRuZXNzX2dldCAgICA9ICJHUExWIiwKLQkJLmRpc3BsYXlfc2V0ICAgICAgID0gIlNEU1AiLAotCQkuZGlzcGxheV9nZXQgICAgICAgPSAiXFxETlhUIgotCX0sCisJIC5uYW1lID0gIlAzMCIsCisJIC5tdF93bGVkID0gIldMRUQiLAorCSAubXRfbGNkX3N3aXRjaCA9IFAzMF9QUkVGSVggIl9RMEUiLAorCSAubGNkX3N0YXR1cyA9ICJcXEJLTFQiLAorCSAuYnJpZ2h0bmVzc191cCA9IFAzMF9QUkVGSVggIl9RNjgiLAorCSAuYnJpZ2h0bmVzc19kb3duID0gUDMwX1BSRUZJWCAiX1E2OSIsCisJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKKwkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAorCSAuZGlzcGxheV9nZXQgPSAiXFxETlhUIn0sCiAKIAl7Ci0JCS5uYW1lICAgICAgICAgICAgICA9ICJTMXgiLAotCQkubXRfbWxlZCAgICAgICAgICAgPSAiTUxFRCIsCi0JCS5tbGVkX3N0YXR1cyAgICAgICA9ICJcXEVNTEUiLAotCQkubXRfd2xlZCAgICAgICAgICAgPSAiV0xFRCIsCi0JCS5tdF9sY2Rfc3dpdGNoICAgICA9IFMxeF9QUkVGSVggIlExMCIgLAotCQkubGNkX3N0YXR1cyAgICAgICAgPSAiXFxQTk9GIiwKLQkJLmJyaWdodG5lc3Nfc2V0ICAgID0gIlNQTFYiLAotCQkuYnJpZ2h0bmVzc19nZXQgICAgPSAiR1BMViIKLQl9LAorCSAubmFtZSA9ICJTMXgiLAorCSAubXRfbWxlZCA9ICJNTEVEIiwKKwkgLm1sZWRfc3RhdHVzID0gIlxcRU1MRSIsCisJIC5tdF93bGVkID0gIldMRUQiLAorCSAubXRfbGNkX3N3aXRjaCA9IFMxeF9QUkVGSVggIlExMCIsCisJIC5sY2Rfc3RhdHVzID0gIlxcUE5PRiIsCisJIC5icmlnaHRuZXNzX3NldCA9ICJTUExWIiwKKwkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYifSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIlMyeCIsCi0JCS5tdF9tbGVkICAgICAgICAgICA9ICJNTEVEIiwKLQkJLm1sZWRfc3RhdHVzICAgICAgID0gIlxcTUFJTCIsCi0JCS5tdF9sY2Rfc3dpdGNoICAgICA9IFMyeF9QUkVGSVggIl9RMTAiLAotCQkubGNkX3N0YXR1cyAgICAgICAgPSAiXFxCS0xJIiwKLQkJLmJyaWdodG5lc3NfdXAgICAgID0gUzJ4X1BSRUZJWCAiX1EwQiIsCi0JCS5icmlnaHRuZXNzX2Rvd24gICA9IFMyeF9QUkVGSVggIl9RMEEiCi0JfSwKKwkgLm5hbWUgPSAiUzJ4IiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCisJIC5tbGVkX3N0YXR1cyA9ICJcXE1BSUwiLAorCSAubXRfbGNkX3N3aXRjaCA9IFMyeF9QUkVGSVggIl9RMTAiLAorCSAubGNkX3N0YXR1cyA9ICJcXEJLTEkiLAorCSAuYnJpZ2h0bmVzc191cCA9IFMyeF9QUkVGSVggIl9RMEIiLAorCSAuYnJpZ2h0bmVzc19kb3duID0gUzJ4X1BSRUZJWCAiX1EwQSJ9LAogCiAJewotCQkubmFtZSAgICAgICAgICAgICAgPSAieHhOIiwKLQkJLm10X21sZWQgICAgICAgICAgID0gIk1MRUQiLAorCSAubmFtZSA9ICJ4eE4iLAorCSAubXRfbWxlZCA9ICJNTEVEIiwKIC8qIFdMRUQgcHJlc2VudCwgYnV0IG5vdCBjb250cm9sbGVkIGJ5IEFDUEkgKi8KLQkJLm10X2xjZF9zd2l0Y2ggICAgID0geHhOX1BSRUZJWCAiX1ExMCIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXEJLTFQiLAotCQkuYnJpZ2h0bmVzc19zZXQgICAgPSAiU1BMViIsCi0JCS5icmlnaHRuZXNzX2dldCAgICA9ICJHUExWIiwKLQkJLmRpc3BsYXlfc2V0ICAgICAgID0gIlNEU1AiLAotCQkuZGlzcGxheV9nZXQgICAgICAgPSAiXFxBRFZHIgotCX0KKwkgLm10X2xjZF9zd2l0Y2ggPSB4eE5fUFJFRklYICJfUTEwIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxCS0xUIiwKKwkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAorCSAuYnJpZ2h0bmVzc19nZXQgPSAiR1BMViIsCisJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKKwkgLmRpc3BsYXlfZ2V0ID0gIlxcQURWRyJ9CiB9OwogCiAvKiBwcm9jZGlyIHdlIHVzZSAqLwpAQCAtMzk1LDEzICszNzUsMTMgQEAKIHN0YXRpYyBpbnQgYXN1c19ob3RrX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFzdXNfaG90a19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYXN1c19ob3RrX2RyaXZlciA9IHsKLQkubmFtZSA9IAlBQ1BJX0hPVEtfTkFNRSwKLQkuY2xhc3MgPSAJQUNQSV9IT1RLX0NMQVNTLAotCS5pZHMgPSAJCUFDUElfSE9US19ISUQsCi0JLm9wcyA9IAkJewotCQkJCS5hZGQgPSAJCWFzdXNfaG90a19hZGQsCi0JCQkJLnJlbW92ZSA9IAlhc3VzX2hvdGtfcmVtb3ZlLAotCQkJfSwKKwkubmFtZSA9IEFDUElfSE9US19OQU1FLAorCS5jbGFzcyA9IEFDUElfSE9US19DTEFTUywKKwkuaWRzID0gQUNQSV9IT1RLX0hJRCwKKwkub3BzID0geworCQkuYWRkID0gYXN1c19ob3RrX2FkZCwKKwkJLnJlbW92ZSA9IGFzdXNfaG90a19yZW1vdmUsCisJCX0sCiB9OwogCiAvKiAKQEAgLTQyMywxMSArNDAzLDEwIEBACiAJaW5fb2JqLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKIAlpbl9vYmouaW50ZWdlci52YWx1ZSA9IHZhbDsKIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgKGNoYXIgKikgbWV0aG9kLCAmcGFyYW1zLCBvdXRwdXQpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgKGNoYXIgKiltZXRob2QsICZwYXJhbXMsIG91dHB1dCk7CiAJcmV0dXJuIChzdGF0dXMgPT0gQUVfT0spOwogfQogCi0KIHN0YXRpYyBpbnQgcmVhZF9hY3BpX2ludChhY3BpX2hhbmRsZSBoYW5kbGUsIGNvbnN0IGNoYXIgKm1ldGhvZCwgaW50ICp2YWwpCiB7CiAJc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dDsKQEAgLTQzNyw3ICs0MTYsNyBAQAogCW91dHB1dC5sZW5ndGggPSBzaXplb2Yob3V0X29iaik7CiAJb3V0cHV0LnBvaW50ZXIgPSAmb3V0X29iajsKIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgKGNoYXIgKikgbWV0aG9kLCBOVUxMLCAmb3V0cHV0KTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIChjaGFyICopbWV0aG9kLCBOVUxMLCAmb3V0cHV0KTsKIAkqdmFsID0gb3V0X29iai5pbnRlZ2VyLnZhbHVlOwogCXJldHVybiAoc3RhdHVzID09IEFFX09LKSAmJiAob3V0X29iai50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKTsKIH0KQEAgLTQ0OSw3ICs0MjgsNyBAQAogICovCiBzdGF0aWMgaW50CiBwcm9jX3JlYWRfaW5mbyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKLQkJdm9pZCAqZGF0YSkKKwkgICAgICAgdm9pZCAqZGF0YSkKIHsKIAlpbnQgbGVuID0gMDsKIAlpbnQgdGVtcDsKQEAgLTQ2MCw3ICs0MzksNyBAQAogCSAqLwogCiAJbGVuICs9IHNwcmludGYocGFnZSwgQUNQSV9IT1RLX05BTUUgIiAiIEFTVVNfQUNQSV9WRVJTSU9OICJcbiIpOwotCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJNb2RlbCByZWZlcmVuY2UgICAgOiAlc1xuIiwgCisJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIk1vZGVsIHJlZmVyZW5jZSAgICA6ICVzXG4iLAogCQkgICAgICAgaG90ay0+bWV0aG9kcy0+bmFtZSk7CiAJLyogCiAJICogVGhlIFNGVU4gbWV0aG9kIHByb2JhYmx5IGFsbG93cyB0aGUgb3JpZ2luYWwgZHJpdmVyIHRvIGdldCB0aGUgbGlzdCAKQEAgLTQ2OSw3ICs0NDgsOCBAQAogCSAqIFRoZSBzaWduaWZpY2FuY2Ugb2Ygb3RoZXJzIGlzIHlldCB0byBiZSBmb3VuZC4KIAkgKi8KIAlpZiAocmVhZF9hY3BpX2ludChob3RrLT5oYW5kbGUsICJTRlVOIiwgJnRlbXApKQotCQlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiU0ZVTiB2YWx1ZSAgICAgICAgIDogMHglMDR4XG4iLCB0ZW1wKTsKKwkJbGVuICs9CisJCSAgICBzcHJpbnRmKHBhZ2UgKyBsZW4sICJTRlVOIHZhbHVlICAgICAgICAgOiAweCUwNHhcbiIsIHRlbXApOwogCS8qCiAJICogQW5vdGhlciB2YWx1ZSBmb3IgdXNlcnNwYWNlOiB0aGUgQVNZTSBtZXRob2QgcmV0dXJucyAweDAyIGZvcgogCSAqIGJhdHRlcnkgbG93IGFuZCAweDA0IGZvciBiYXR0ZXJ5IGNyaXRpY2FsLCBpdHMgcmVhZGluZ3MgdGVuZCB0byBiZQpAQCAtNDc4LDcgKzQ1OCw4IEBACiAJICogc2lsZW50bHkgaWdub3JlZC4KIAkgKi8KIAlpZiAocmVhZF9hY3BpX2ludChob3RrLT5oYW5kbGUsICJBU1lNIiwgJnRlbXApKQotCQlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiQVNZTSB2YWx1ZSAgICAgICAgIDogMHglMDR4XG4iLCB0ZW1wKTsKKwkJbGVuICs9CisJCSAgICBzcHJpbnRmKHBhZ2UgKyBsZW4sICJBU1lNIHZhbHVlICAgICAgICAgOiAweCUwNHhcbiIsIHRlbXApOwogCWlmIChhc3VzX2luZm8pIHsKIAkJc25wcmludGYoYnVmLCAxNiwgIiVkIiwgYXN1c19pbmZvLT5sZW5ndGgpOwogCQlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiRFNEVCBsZW5ndGggICAgICAgIDogJXNcbiIsIGJ1Zik7CkBAIC01MDEsNyArNDgyLDYgQEAKIAlyZXR1cm4gbGVuOwogfQogCi0KIC8qCiAgKiAvcHJvYyBoYW5kbGVycwogICogV2Ugd3JpdGUgb3VyIGluZm8gaW4gcGFnZSwgd2UgYmVnaW4gYXQgb2Zmc2V0IG9mZiBhbmQgY2Fubm90IHdyaXRlIG1vcmUKQEAgLTUxMCw4ICs0OTAsNyBAQAogICovCiAKIC8qIEdlbmVyaWMgTEVEIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludAotcmVhZF9sZWQoY29uc3QgY2hhciAqbGVkbmFtZSwgaW50IGxlZG1hc2spCitzdGF0aWMgaW50IHJlYWRfbGVkKGNvbnN0IGNoYXIgKmxlZG5hbWUsIGludCBsZWRtYXNrKQogewogCWlmIChsZWRuYW1lKSB7CiAJCWludCBsZWRfc3RhdHVzOwpAQCAtNTI1LDcgKzUwNCw3IEBACiAJcmV0dXJuIChob3RrLT5zdGF0dXMgJiBsZWRtYXNrKSA/IDEgOiAwOwogfQogCi1zdGF0aWMgaW50IHBhcnNlX2FyZyhjb25zdCBjaGFyIF9fdXNlciAqYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50LCBpbnQgKnZhbCkKK3N0YXRpYyBpbnQgcGFyc2VfYXJnKGNvbnN0IGNoYXIgX191c2VyICogYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50LCBpbnQgKnZhbCkKIHsKIAljaGFyIHNbMzJdOwogCWlmICghY291bnQpCkBAIC01NDIsOCArNTIxLDggQEAKIAogLyogRklYTUU6IGtpbGwgZXh0cmFuZW91cyBhcmdzIHNvIGl0IGNhbiBiZSBjYWxsZWQgaW5kZXBlbmRlbnRseSAqLwogc3RhdGljIGludAotd3JpdGVfbGVkKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsCi0gICAgICAgICAgY2hhciAqbGVkbmFtZSwgaW50IGxlZG1hc2ssIGludCBpbnZlcnQpCit3cml0ZV9sZWQoY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsCisJICBjaGFyICpsZWRuYW1lLCBpbnQgbGVkbWFzaywgaW50IGludmVydCkKIHsKIAlpbnQgdmFsdWU7CiAJaW50IGxlZF9vdXQgPSAwOwpAQCAtNTU1LDE2ICs1MzQsMTYgQEAKIAlob3RrLT5zdGF0dXMgPQogCSAgICAobGVkX291dCkgPyAoaG90ay0+c3RhdHVzIHwgbGVkbWFzaykgOiAoaG90ay0+c3RhdHVzICYgfmxlZG1hc2spOwogCi0JaWYgKGludmVydCkgLyogaW52ZXJ0IHRhcmdldCB2YWx1ZSAqLworCWlmIChpbnZlcnQpCQkvKiBpbnZlcnQgdGFyZ2V0IHZhbHVlICovCiAJCWxlZF9vdXQgPSAhbGVkX291dCAmIDB4MTsKIAogCWlmICghd3JpdGVfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCBsZWRuYW1lLCBsZWRfb3V0LCBOVUxMKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQXN1cyBBQ1BJOiBMRUQgKCVzKSB3cml0ZSBmYWlsZWRcbiIsIGxlZG5hbWUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IExFRCAoJXMpIHdyaXRlIGZhaWxlZFxuIiwKKwkJICAgICAgIGxlZG5hbWUpOwogCiAJcmV0dXJuIGNvdW50OwogfQogCi0KIC8qCiAgKiBQcm9jIGhhbmRsZXJzIGZvciBNTEVECiAgKi8KQEAgLTU3MiwxMiArNTUxLDEyIEBACiBwcm9jX3JlYWRfbWxlZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKIAkgICAgICAgdm9pZCAqZGF0YSkKIHsKLQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWRcbiIsIHJlYWRfbGVkKGhvdGstPm1ldGhvZHMtPm1sZWRfc3RhdHVzLCBNTEVEX09OKSk7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVkXG4iLAorCQkgICAgICAgcmVhZF9sZWQoaG90ay0+bWV0aG9kcy0+bWxlZF9zdGF0dXMsIE1MRURfT04pKTsKIH0KIAotCiBzdGF0aWMgaW50Ci1wcm9jX3dyaXRlX21sZWQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCitwcm9jX3dyaXRlX21sZWQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAogCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewogCXJldHVybiB3cml0ZV9sZWQoYnVmZmVyLCBjb3VudCwgaG90ay0+bWV0aG9kcy0+bXRfbWxlZCwgTUxFRF9PTiwgMSk7CkBAIC01OTAsMTEgKzU2OSwxMiBAQAogcHJvY19yZWFkX3dsZWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsCiAJICAgICAgIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIHNwcmludGYocGFnZSwgIiVkXG4iLCByZWFkX2xlZChob3RrLT5tZXRob2RzLT53bGVkX3N0YXR1cywgV0xFRF9PTikpOworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwKKwkJICAgICAgIHJlYWRfbGVkKGhvdGstPm1ldGhvZHMtPndsZWRfc3RhdHVzLCBXTEVEX09OKSk7CiB9CiAKIHN0YXRpYyBpbnQKLXByb2Nfd3JpdGVfd2xlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKK3Byb2Nfd3JpdGVfd2xlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCiAJCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7CiAJcmV0dXJuIHdyaXRlX2xlZChidWZmZXIsIGNvdW50LCBob3RrLT5tZXRob2RzLT5tdF93bGVkLCBXTEVEX09OLCAwKTsKQEAgLTYwNywzNSArNTg3LDM2IEBACiBwcm9jX3JlYWRfdGxlZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKIAkgICAgICAgdm9pZCAqZGF0YSkKIHsKLQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWRcbiIsIHJlYWRfbGVkKGhvdGstPm1ldGhvZHMtPnRsZWRfc3RhdHVzLCBUTEVEX09OKSk7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVkXG4iLAorCQkgICAgICAgcmVhZF9sZWQoaG90ay0+bWV0aG9kcy0+dGxlZF9zdGF0dXMsIFRMRURfT04pKTsKIH0KIAogc3RhdGljIGludAotcHJvY193cml0ZV90bGVkKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorcHJvY193cml0ZV90bGVkKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKIAkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKIHsKIAlyZXR1cm4gd3JpdGVfbGVkKGJ1ZmZlciwgY291bnQsIGhvdGstPm1ldGhvZHMtPm10X3RsZWQsIFRMRURfT04sIDApOwogfQogCi0KIHN0YXRpYyBpbnQgZ2V0X2xjZF9zdGF0ZSh2b2lkKQogewogCWludCBsY2QgPSAwOwogCiAJaWYgKGhvdGstPm1vZGVsICE9IEwzSCkgewotCS8qIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgYW55dGhpbmcgaWYgd2UgYXJlIGhlcmUgKi8KKwkJLyogV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBhbnl0aGluZyBpZiB3ZSBhcmUgaGVyZSAqLwogCQlpZiAoIXJlYWRfYWNwaV9pbnQoTlVMTCwgaG90ay0+bWV0aG9kcy0+bGNkX3N0YXR1cywgJmxjZCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IEVycm9yIHJlYWRpbmcgTENEIHN0YXR1c1xuIik7Ci0JCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyBMQ0Qgc3RhdHVzXG4iKTsKKwogCQlpZiAoaG90ay0+bW9kZWwgPT0gTDJEKQogCQkJbGNkID0gfmxjZDsKLQl9IGVsc2UgeyAvKiBMM0ggYW5kIHRoZSBsaWtlIGhhdmUgdG8gYmUgaGFuZGxlZCBkaWZmZXJlbnRseSAqLworCX0gZWxzZSB7CQkvKiBMM0ggYW5kIHRoZSBsaWtlIGhhdmUgdG8gYmUgaGFuZGxlZCBkaWZmZXJlbnRseSAqLwogCQlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOwogCQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBpbnB1dDsKIAkJdW5pb24gYWNwaV9vYmplY3QgbXRfcGFyYW1zWzJdOwogCQlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0OwogCQl1bmlvbiBhY3BpX29iamVjdCBvdXRfb2JqOwotCQkKKwogCQlpbnB1dC5jb3VudCA9IDI7CiAJCWlucHV0LnBvaW50ZXIgPSBtdF9wYXJhbXM7CiAJCS8qIE5vdGU6IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBwYXJ0bHkgZ3Vlc3NlZCB1cCwgYnV0IApAQCAtNjQ3LDE1ICs2MjgsMTcgQEAKIAogCQlvdXRwdXQubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmopOwogCQlvdXRwdXQucG9pbnRlciA9ICZvdXRfb2JqOwotCQkKLQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgaG90ay0+bWV0aG9kcy0+bGNkX3N0YXR1cywgJmlucHV0LCAmb3V0cHV0KTsKKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgaG90ay0+bWV0aG9kcy0+bGNkX3N0YXR1cywKKwkJCQkJICZpbnB1dCwgJm91dHB1dCk7CiAJCWlmIChzdGF0dXMgIT0gQUVfT0spCiAJCQlyZXR1cm4gLTE7CiAJCWlmIChvdXRfb2JqLnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpCiAJCQkvKiBUaGF0J3Mgd2hhdCB0aGUgQU1MIGNvZGUgZG9lcyAqLwogCQkJbGNkID0gb3V0X29iai5pbnRlZ2VyLnZhbHVlID4+IDg7CiAJfQotCQorCiAJcmV0dXJuIChsY2QgJiAxKTsKIH0KIApAQCAtNjY5LDEwICs2NTIsMTMgQEAKIAkJLyogc3dpdGNoICovCiAJCWlmIChob3RrLT5tb2RlbCAhPSBMM0gpIHsKIAkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgaG90ay0+bWV0aG9kcy0+bXRfbGNkX3N3aXRjaCwKKwkJCSAgICBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLAorCQkJCQkJIGhvdGstPm1ldGhvZHMtPm10X2xjZF9zd2l0Y2gsCiAJCQkJCQkgTlVMTCwgTlVMTCk7Ci0JCX0gZWxzZSB7IC8qIEwzSCBhbmQgdGhlIGxpa2UgaGF2ZSB0byBiZSBoYW5kbGVkIGRpZmZlcmVudGx5ICovCi0JCQlpZiAoIXdyaXRlX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgaG90ay0+bWV0aG9kcy0+bXRfbGNkX3N3aXRjaCwgMHgwNywgTlVMTCkpCisJCX0gZWxzZSB7CS8qIEwzSCBhbmQgdGhlIGxpa2UgaGF2ZSB0byBiZSBoYW5kbGVkIGRpZmZlcmVudGx5ICovCisJCQlpZiAoIXdyaXRlX2FjcGlfaW50CisJCQkgICAgKGhvdGstPmhhbmRsZSwgaG90ay0+bWV0aG9kcy0+bXRfbGNkX3N3aXRjaCwgMHgwNywKKwkJCSAgICAgTlVMTCkpCiAJCQkJc3RhdHVzID0gQUVfRVJST1I7CiAJCQkvKiBMM0gncyBBTUwgZXhlY3V0ZXMgRUhLICgweDA3KSB1cG9uIEZuK0Y3IGtleXByZXNzLCAKIAkJCSAgIHRoZSBleGFjdCBiZWhhdmlvdXIgaXMgc2ltdWxhdGVkIGhlcmUgKi8KQEAgLTY5MSwzMyArNjc3LDMzIEBACiAJcmV0dXJuIHNwcmludGYocGFnZSwgIiVkXG4iLCBnZXRfbGNkX3N0YXRlKCkpOwogfQogCi0KIHN0YXRpYyBpbnQKLXByb2Nfd3JpdGVfbGNkKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorcHJvY193cml0ZV9sY2Qoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAogCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewogCWludCB2YWx1ZTsKLQkKKwogCWNvdW50ID0gcGFyc2VfYXJnKGJ1ZmZlciwgY291bnQsICZ2YWx1ZSk7CiAJaWYgKGNvdW50ID4gMCkKIAkJc2V0X2xjZF9zdGF0ZSh2YWx1ZSk7CiAJcmV0dXJuIGNvdW50OwogfQogCi0KIHN0YXRpYyBpbnQgcmVhZF9icmlnaHRuZXNzKHZvaWQpCiB7CiAJaW50IHZhbHVlOwotCQotCWlmKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZ2V0KSB7IC8qIFNQTFYvR1BMViBsYXB0b3AgKi8KLQkJaWYgKCFyZWFkX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19nZXQsIAorCisJaWYgKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZ2V0KSB7CS8qIFNQTFYvR1BMViBsYXB0b3AgKi8KKwkJaWYgKCFyZWFkX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19nZXQsCiAJCQkJICAgJnZhbHVlKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyBicmlnaHRuZXNzXG4iKTsKLQl9IGVsc2UgaWYgKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3Nfc3RhdHVzKSB7IC8qIEZvciBEMSBmb3IgZXhhbXBsZSAqLwotCQlpZiAoIXJlYWRfYWNwaV9pbnQoTlVMTCwgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19zdGF0dXMsIAorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJBc3VzIEFDUEk6IEVycm9yIHJlYWRpbmcgYnJpZ2h0bmVzc1xuIik7CisJfSBlbHNlIGlmIChob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3N0YXR1cykgewkvKiBGb3IgRDEgZm9yIGV4YW1wbGUgKi8KKwkJaWYgKCFyZWFkX2FjcGlfaW50KE5VTEwsIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3Nfc3RhdHVzLAogCQkJCSAgICZ2YWx1ZSkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IEVycm9yIHJlYWRpbmcgYnJpZ2h0bmVzc1xuIik7Ci0JfSBlbHNlIC8qIE5vIEdQTFYgbWV0aG9kICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyBicmlnaHRuZXNzXG4iKTsKKwl9IGVsc2UJCQkvKiBObyBHUExWIG1ldGhvZCAqLwogCQl2YWx1ZSA9IGhvdGstPmJyaWdodG5lc3M7CiAJcmV0dXJuIHZhbHVlOwogfQpAQCAtNzMwLDIzICs3MTYsMjUgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOwogCiAJLyogU1BMViBsYXB0b3AgKi8KLQlpZihob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3NldCkgewotCQlpZiAoIXdyaXRlX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19zZXQsIAorCWlmIChob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3NldCkgeworCQlpZiAoIXdyaXRlX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19zZXQsCiAJCQkJICAgIHZhbHVlLCBOVUxMKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogRXJyb3IgY2hhbmdpbmcgYnJpZ2h0bmVzc1xuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkFzdXMgQUNQSTogRXJyb3IgY2hhbmdpbmcgYnJpZ2h0bmVzc1xuIik7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBObyBTUExWIG1ldGhvZCBpZiB3ZSBhcmUgaGVyZSwgYWN0IGFzIGFwcHJvcHJpYXRlICovCiAJdmFsdWUgLT0gcmVhZF9icmlnaHRuZXNzKCk7CiAJd2hpbGUgKHZhbHVlICE9IDApIHsKLQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgKHZhbHVlID4gMCkgPyAKLQkJCQkJICAgICAgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc191cCA6IAorCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCAodmFsdWUgPiAwKSA/CisJCQkJCSAgICAgIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfdXAgOgogCQkJCQkgICAgICBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2Rvd24sCiAJCQkJCSAgICAgIE5VTEwsIE5VTEwpOwogCQkodmFsdWUgPiAwKSA/IHZhbHVlLS0gOiB2YWx1ZSsrOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IEVycm9yIGNoYW5naW5nIGJyaWdodG5lc3NcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJBc3VzIEFDUEk6IEVycm9yIGNoYW5naW5nIGJyaWdodG5lc3NcbiIpOwogCX0KIAlyZXR1cm47CiB9CkBAIC03NTksNyArNzQ3LDcgQEAKIH0KIAogc3RhdGljIGludAotcHJvY193cml0ZV9icm4oc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCitwcm9jX3dyaXRlX2JybihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCiAJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7CiAJaW50IHZhbHVlOwpAQCAtNzY3LDcgKzc1NSw3IEBACiAJY291bnQgPSBwYXJzZV9hcmcoYnVmZmVyLCBjb3VudCwgJnZhbHVlKTsKIAlpZiAoY291bnQgPiAwKSB7CiAJCXZhbHVlID0gKDAgPCB2YWx1ZSkgPyAoKDE1IDwgdmFsdWUpID8gMTUgOiB2YWx1ZSkgOiAwOwotCQkJLyogMCA8PSB2YWx1ZSA8PSAxNSAqLworCQkvKiAwIDw9IHZhbHVlIDw9IDE1ICovCiAJCXNldF9icmlnaHRuZXNzKHZhbHVlKTsKIAl9IGVsc2UgaWYgKGNvdW50IDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IEVycm9yIHJlYWRpbmcgdXNlciBpbnB1dFxuIik7CkBAIC03NzksNyArNzY3LDcgQEAKIHN0YXRpYyB2b2lkIHNldF9kaXNwbGF5KGludCB2YWx1ZSkKIHsKIAkvKiBubyBzYW5pdHkgY2hlY2sgbmVlZGVkIGZvciBub3cgKi8KLQlpZiAoIXdyaXRlX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgaG90ay0+bWV0aG9kcy0+ZGlzcGxheV9zZXQsIAorCWlmICghd3JpdGVfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5kaXNwbGF5X3NldCwKIAkJCSAgICB2YWx1ZSwgTlVMTCkpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogRXJyb3Igc2V0dGluZyBkaXNwbGF5XG4iKTsKIAlyZXR1cm47CkBAIC03OTEsMTMgKzc3OSwxNCBAQAogICovCiBzdGF0aWMgaW50CiBwcm9jX3JlYWRfZGlzcChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKLQkgICAgICB2b2lkICpkYXRhKQorCSAgICAgICB2b2lkICpkYXRhKQogewogCWludCB2YWx1ZSA9IDA7Ci0JCisKIAlpZiAoIXJlYWRfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5kaXNwbGF5X2dldCwgJnZhbHVlKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQXN1cyBBQ1BJOiBFcnJvciByZWFkaW5nIGRpc3BsYXkgc3RhdHVzXG4iKTsKLQl2YWx1ZSAmPSAweDA3OyAvKiBuZWVkZWQgZm9yIHNvbWUgbW9kZWxzLCBzaG91bGRuJ3QgaHVydCBvdGhlcnMgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyBkaXNwbGF5IHN0YXR1c1xuIik7CisJdmFsdWUgJj0gMHgwNzsJCS8qIG5lZWRlZCBmb3Igc29tZSBtb2RlbHMsIHNob3VsZG4ndCBodXJ0IG90aGVycyAqLwogCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgdmFsdWUpOwogfQogCkBAIC04MDgsOCArNzk3LDggQEAKICAqIHNpbXVsdGFuZW91c2x5LCBzbyBiZSB3YXJuZWQuIFNlZSB0aGUgYWNwaTRhc3VzIFJFQURNRSBmb3IgbW9yZSBpbmZvLgogICovCiBzdGF0aWMgaW50Ci1wcm9jX3dyaXRlX2Rpc3Aoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCitwcm9jX3dyaXRlX2Rpc3Aoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewogCWludCB2YWx1ZTsKIApAQCAtODIyLDE5ICs4MTEsMTkgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLQotdHlwZWRlZiBpbnQgKHByb2NfcmVhZGZ1bmMpKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotdHlwZWRlZiBpbnQgKHByb2Nfd3JpdGVmdW5jKShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7Cit0eXBlZGVmIGludCAocHJvY19yZWFkZnVuYykgKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJCQkgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKK3R5cGVkZWYgaW50IChwcm9jX3dyaXRlZnVuYykgKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKIAogc3RhdGljIGludAotX19pbml0IGFzdXNfcHJvY19hZGQoY2hhciAqbmFtZSwgcHJvY193cml0ZWZ1bmMgKndyaXRlZnVuYywKLQkgICAgICAgICAgICAgcHJvY19yZWFkZnVuYyAqcmVhZGZ1bmMsIG1vZGVfdCBtb2RlLAotCSAgICAgICAgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK19faW5pdCBhc3VzX3Byb2NfYWRkKGNoYXIgKm5hbWUsIHByb2Nfd3JpdGVmdW5jICogd3JpdGVmdW5jLAorCQkgICAgIHByb2NfcmVhZGZ1bmMgKiByZWFkZnVuYywgbW9kZV90IG1vZGUsCisJCSAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jID0gY3JlYXRlX3Byb2NfZW50cnkobmFtZSwgbW9kZSwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwotCWlmKCFwcm9jKSB7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jID0KKwkgICAgY3JlYXRlX3Byb2NfZW50cnkobmFtZSwgbW9kZSwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCWlmICghcHJvYykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIFVuYWJsZSB0byBjcmVhdGUgJXMgZnMgZW50cnlcbiIsIG5hbWUpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtODUxLDE0ICs4NDAsMTQgQEAKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CiAJbW9kZV90IG1vZGU7Ci0JCisKIAkvKgogCSAqIElmIHBhcmFtZXRlciB1aWQgb3IgZ2lkIGlzIG5vdCBjaGFuZ2VkLCBrZWVwIHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yCiAJICogb3VyIHByb2MgZW50cmllcyAoLXJ3LXJ3LXJ3LSkgZWxzZSwgaXQgbWVhbnMgd2UgY2FyZSBhYm91dCBzZWN1cml0eSwKIAkgKiBhbmQgdGhlbiBzZXQgdG8gLXJ3LXJ3LS0tLQogCSAqLwogCi0JaWYgKChhc3VzX3VpZCA9PSAwKSAmJiAoYXN1c19naWQgPT0gMCkpeworCWlmICgoYXN1c191aWQgPT0gMCkgJiYgKGFzdXNfZ2lkID09IDApKSB7CiAJCW1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVR087CiAJfSBlbHNlIHsKIAkJbW9kZSA9IFNfSUZSRUcgfCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVdVU1IgfCBTX0lXR1JQOwpAQCAtODgxLDE1ICs4NzAsMTggQEAKIAl9CiAKIAlpZiAoaG90ay0+bWV0aG9kcy0+bXRfd2xlZCkgewotCQlhc3VzX3Byb2NfYWRkKFBST0NfV0xFRCwgJnByb2Nfd3JpdGVfd2xlZCwgJnByb2NfcmVhZF93bGVkLCBtb2RlLCBkZXZpY2UpOworCQlhc3VzX3Byb2NfYWRkKFBST0NfV0xFRCwgJnByb2Nfd3JpdGVfd2xlZCwgJnByb2NfcmVhZF93bGVkLAorCQkJICAgICAgbW9kZSwgZGV2aWNlKTsKIAl9CiAKIAlpZiAoaG90ay0+bWV0aG9kcy0+bXRfbWxlZCkgewotCQlhc3VzX3Byb2NfYWRkKFBST0NfTUxFRCwgJnByb2Nfd3JpdGVfbWxlZCwgJnByb2NfcmVhZF9tbGVkLCBtb2RlLCBkZXZpY2UpOworCQlhc3VzX3Byb2NfYWRkKFBST0NfTUxFRCwgJnByb2Nfd3JpdGVfbWxlZCwgJnByb2NfcmVhZF9tbGVkLAorCQkJICAgICAgbW9kZSwgZGV2aWNlKTsKIAl9CiAKIAlpZiAoaG90ay0+bWV0aG9kcy0+bXRfdGxlZCkgewotCQlhc3VzX3Byb2NfYWRkKFBST0NfVExFRCwgJnByb2Nfd3JpdGVfdGxlZCwgJnByb2NfcmVhZF90bGVkLCBtb2RlLCBkZXZpY2UpOworCQlhc3VzX3Byb2NfYWRkKFBST0NfVExFRCwgJnByb2Nfd3JpdGVfdGxlZCwgJnByb2NfcmVhZF90bGVkLAorCQkJICAgICAgbW9kZSwgZGV2aWNlKTsKIAl9CiAKIAkvKiAKQEAgLTg5NywzNSArODg5LDQwIEBACiAJICogZnJvbSBrZXlib2FyZCAKIAkgKi8KIAlpZiAoaG90ay0+bWV0aG9kcy0+bXRfbGNkX3N3aXRjaCAmJiBob3RrLT5tZXRob2RzLT5sY2Rfc3RhdHVzKSB7Ci0JCWFzdXNfcHJvY19hZGQoUFJPQ19MQ0QsICZwcm9jX3dyaXRlX2xjZCwgJnByb2NfcmVhZF9sY2QsIG1vZGUsIGRldmljZSk7CisJCWFzdXNfcHJvY19hZGQoUFJPQ19MQ0QsICZwcm9jX3dyaXRlX2xjZCwgJnByb2NfcmVhZF9sY2QsIG1vZGUsCisJCQkgICAgICBkZXZpY2UpOwogCX0KLQkKKwogCWlmICgoaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc191cCAmJiBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2Rvd24pIHx8CiAJICAgIChob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2dldCAmJiBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3NldCkpIHsKLQkJYXN1c19wcm9jX2FkZChQUk9DX0JSTiwgJnByb2Nfd3JpdGVfYnJuLCAmcHJvY19yZWFkX2JybiwgbW9kZSwgZGV2aWNlKTsKKwkJYXN1c19wcm9jX2FkZChQUk9DX0JSTiwgJnByb2Nfd3JpdGVfYnJuLCAmcHJvY19yZWFkX2JybiwgbW9kZSwKKwkJCSAgICAgIGRldmljZSk7CiAJfQogCiAJaWYgKGhvdGstPm1ldGhvZHMtPmRpc3BsYXlfc2V0KSB7Ci0JCWFzdXNfcHJvY19hZGQoUFJPQ19ESVNQLCAmcHJvY193cml0ZV9kaXNwLCAmcHJvY19yZWFkX2Rpc3AsIG1vZGUsIGRldmljZSk7CisJCWFzdXNfcHJvY19hZGQoUFJPQ19ESVNQLCAmcHJvY193cml0ZV9kaXNwLCAmcHJvY19yZWFkX2Rpc3AsCisJCQkgICAgICBtb2RlLCBkZXZpY2UpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFzdXNfaG90a19yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlKiBkZXZpY2UpCitzdGF0aWMgaW50IGFzdXNfaG90a19yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYoYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19JTkZPLGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwlpZiAoYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19JTkZPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJCWlmIChob3RrLT5tZXRob2RzLT5tdF93bGVkKQotCQkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19XTEVELGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfV0xFRCwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCQlpZiAoaG90ay0+bWV0aG9kcy0+bXRfbWxlZCkKLQkJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfTUxFRCxhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX01MRUQsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAkJaWYgKGhvdGstPm1ldGhvZHMtPm10X3RsZWQpCi0JCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX1RMRUQsYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19UTEVELCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJCWlmIChob3RrLT5tZXRob2RzLT5tdF9sY2Rfc3dpdGNoICYmIGhvdGstPm1ldGhvZHMtPmxjZF9zdGF0dXMpCiAJCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0xDRCwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwotCQlpZiAoKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfdXAgJiYgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19kb3duKSB8fAotCQkgICAgKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZ2V0ICYmIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3Nfc2V0KSkKKwkJaWYgKChob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3VwCisJCSAgICAgJiYgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19kb3duKQorCQkgICAgfHwgKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZ2V0CisJCQkmJiBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3NldCkpCiAJCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0JSTiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCQlpZiAoaG90ay0+bWV0aG9kcy0+ZGlzcGxheV9zZXQpCiAJCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0RJU1AsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKQEAgLTkzMywxNiArOTMwLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIHZvaWQgYXN1c19ob3RrX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKIHsKLQkvKiBUT0RPIEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSBldmVudHMgY291bnQuKi8KKwkvKiBUT0RPIEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSBldmVudHMgY291bnQuICovCiAJaWYgKCFob3RrKQogCQlyZXR1cm47CiAKIAlpZiAoKGV2ZW50ICYgfigodTMyKSBCUl9VUCkpIDwgMTYpIHsKIAkJaG90ay0+YnJpZ2h0bmVzcyA9IChldmVudCAmIH4oKHUzMikgQlJfVVApKTsKLQl9IGVsc2UgaWYgKChldmVudCAmIH4oKHUzMikgQlJfRE9XTikpIDwgMTYgKSB7CisJfSBlbHNlIGlmICgoZXZlbnQgJiB+KCh1MzIpIEJSX0RPV04pKSA8IDE2KSB7CiAJCWhvdGstPmJyaWdodG5lc3MgPSAoZXZlbnQgJiB+KCh1MzIpIEJSX0RPV04pKTsKIAl9CiAKQEAgLTk3Niw3ICs5NzIsNyBAQAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBDb3VsZG4ndCBnZXQgdGhlIERTRFQgdGFibGUgaGVhZGVyXG4iKTsKIAllbHNlCi0JCWFzdXNfaW5mbyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikgZHNkdC5wb2ludGVyOworCQlhc3VzX2luZm8gPSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICopZHNkdC5wb2ludGVyOwogCiAJLyogV2UgaGF2ZSB0byB3cml0ZSAwIG9uIGluaXQgdGhpcyBmYXIgZm9yIGFsbCBBU1VTIG1vZGVscyAqLwogCWlmICghd3JpdGVfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCAiSU5JVCIsIDAsICZidWZmZXIpKSB7CkBAIC05ODgsMTUgKzk4NCwxNyBAQAogCWlmICghcmVhZF9hY3BpX2ludChob3RrLT5oYW5kbGUsICJCU1RTIiwgJmJzdHNfcmVzdWx0KSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBFcnJvciBjYWxsaW5nIEJTVFNcbiIpOwogCWVsc2UgaWYgKGJzdHNfcmVzdWx0KQotCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgQlNUUyBjYWxsZWQsIDB4JTAyeCByZXR1cm5lZFxuIiwgYnN0c19yZXN1bHQpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgQlNUUyBjYWxsZWQsIDB4JTAyeCByZXR1cm5lZFxuIiwKKwkJICAgICAgIGJzdHNfcmVzdWx0KTsKIAogCS8qIFNhbXN1bmcgUDMwIGhhcyBhIGRldmljZSB3aXRoIGEgdmFsaWQgX0hJRCB3aG9zZSBJTklUIGRvZXMgbm90IAogCSAqIHJldHVybiBhbnl0aGluZy4gQ2F0Y2ggdGhpcyBvbmUgYW5kIGFueSBzaW1pbGFyIGhlcmUgKi8KIAlpZiAoYnVmZmVyLnBvaW50ZXIgPT0gTlVMTCkgewotCQlpZiAoYXN1c19pbmZvICYmIC8qIFNhbXN1bmcgUDMwICovCisJCWlmIChhc3VzX2luZm8gJiYJLyogU2Ftc3VuZyBQMzAgKi8KIAkJICAgIHN0cm5jbXAoYXN1c19pbmZvLT5vZW1fdGFibGVfaWQsICJPREVNIiwgNCkgPT0gMCkgewogCQkJaG90ay0+bW9kZWwgPSBQMzA7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgU2Ftc3VuZyBQMzAgZGV0ZWN0ZWQsIHN1cHBvcnRlZFxuIik7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCSAgICAgICAiICBTYW1zdW5nIFAzMCBkZXRlY3RlZCwgc3VwcG9ydGVkXG4iKTsKIAkJfSBlbHNlIHsKIAkJCWhvdGstPm1vZGVsID0gTTJFOwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBubyBzdHJpbmcgcmV0dXJuZWQgYnkgSU5JVFxuIik7CkBAIC0xMDA2LDEwICsxMDA0LDExIEBACiAJCWhvdGstPm1ldGhvZHMgPSAmbW9kZWxfY29uZltob3RrLT5tb2RlbF07CiAJCXJldHVybiBBRV9PSzsKIAl9Ci0JCi0JbW9kZWwgPSAodW5pb24gYWNwaV9vYmplY3QgKikgYnVmZmVyLnBvaW50ZXI7CisKKwltb2RlbCA9ICh1bmlvbiBhY3BpX29iamVjdCAqKWJ1ZmZlci5wb2ludGVyOwogCWlmIChtb2RlbC0+dHlwZSA9PSBBQ1BJX1RZUEVfU1RSSU5HKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiICAlcyBtb2RlbCBkZXRlY3RlZCwgIiwgbW9kZWwtPnN0cmluZy5wb2ludGVyKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIgICVzIG1vZGVsIGRldGVjdGVkLCAiLAorCQkgICAgICAgbW9kZWwtPnN0cmluZy5wb2ludGVyKTsKIAl9CiAKIAlob3RrLT5tb2RlbCA9IEVORF9NT0RFTDsKQEAgLTEwMzUsNyArMTAzNCw3IEBACiAJCSBzdHJuY21wKG1vZGVsLT5zdHJpbmcucG9pbnRlciwgIk02TiIsIDMpID09IDAgfHwKIAkJIHN0cm5jbXAobW9kZWwtPnN0cmluZy5wb2ludGVyLCAiUzFOIiwgMykgPT0gMCB8fAogCQkgc3RybmNtcChtb2RlbC0+c3RyaW5nLnBvaW50ZXIsICJTNU4iLCAzKSA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgIHN0cm5jbXAobW9kZWwtPnN0cmluZy5wb2ludGVyLCAiVzFOIiwgMykgPT0gMCkKKwkJIHN0cm5jbXAobW9kZWwtPnN0cmluZy5wb2ludGVyLCAiVzFOIiwgMykgPT0gMCkKIAkJaG90ay0+bW9kZWwgPSB4eE47CiAJZWxzZSBpZiAoc3RybmNtcChtb2RlbC0+c3RyaW5nLnBvaW50ZXIsICJNMSIsIDIpID09IDApCiAJCWhvdGstPm1vZGVsID0gTTFBOwpAQCAtMTA2OSwyMSArMTA2OCwyMSBAQAogCiAJLyogU29ydCBvZiBwZXItbW9kZWwgYmxhY2tsaXN0ICovCiAJaWYgKHN0cm5jbXAobW9kZWwtPnN0cmluZy5wb2ludGVyLCAiTDJCIiwgMykgPT0gMCkKLQkJaG90ay0+bWV0aG9kcy0+bGNkX3N0YXR1cyA9IE5VTEw7IAorCQlob3RrLT5tZXRob2RzLT5sY2Rfc3RhdHVzID0gTlVMTDsKIAkvKiBMMkIgaXMgc2ltaWxhciBlbm91Z2ggdG8gTDNDIHRvIHVzZSBpdHMgc2V0dGluZ3MsIHdpdGggdGhpcyBvbmx5IAogCSAgIGV4Y2VwdGlvbiAqLwogCWVsc2UgaWYgKHN0cm5jbXAobW9kZWwtPnN0cmluZy5wb2ludGVyLCAiUzVOIiwgMykgPT0gMCB8fAogCQkgc3RybmNtcChtb2RlbC0+c3RyaW5nLnBvaW50ZXIsICJNNU4iLCAzKSA9PSAwKQotCQlob3RrLT5tZXRob2RzLT5tdF9tbGVkID0gTlVMTDsgCisJCWhvdGstPm1ldGhvZHMtPm10X21sZWQgPSBOVUxMOwogCS8qIFM1TiBhbmQgTTVOIGhhdmUgbm8gTUxFRCAqLwogCWVsc2UgaWYgKHN0cm5jbXAobW9kZWwtPnN0cmluZy5wb2ludGVyLCAiTTJOIiwgMykgPT0gMCB8fAogCQkgc3RybmNtcChtb2RlbC0+c3RyaW5nLnBvaW50ZXIsICJXMU4iLCAzKSA9PSAwKQotCQlob3RrLT5tZXRob2RzLT5tdF93bGVkID0gIldMRUQiOyAKKwkJaG90ay0+bWV0aG9kcy0+bXRfd2xlZCA9ICJXTEVEIjsKIAkvKiBNMk4gYW5kIFcxTiBoYXZlIGEgdXNhYmxlIFdMRUQgKi8KIAllbHNlIGlmIChhc3VzX2luZm8pIHsKIAkJaWYgKHN0cm5jbXAoYXN1c19pbmZvLT5vZW1fdGFibGVfaWQsICJMMSIsIDIpID09IDApCiAJCQlob3RrLT5tZXRob2RzLT5tbGVkX3N0YXR1cyA9IE5VTEw7Ci0JLyogUzEzMDBBIHJlcG9ydHMgTDg0RiwgYnV0IEwxNDAwQiB0b28sIGFjY291bnQgZm9yIHRoYXQgKi8KKwkJLyogUzEzMDBBIHJlcG9ydHMgTDg0RiwgYnV0IEwxNDAwQiB0b28sIGFjY291bnQgZm9yIHRoYXQgKi8KIAl9CiAKIAlhY3BpX29zX2ZyZWUobW9kZWwpOwpAQCAtMTA5MSw3ICsxMDkwLDYgQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQgYXN1c19ob3RrX2NoZWNrKHZvaWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0xMTEwLDcgKzExMDgsNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQgYXN1c19ob3RrX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKQEAgLTExMjMsNyArMTEyMCw3IEBACiAJICAgICAgIEFTVVNfQUNQSV9WRVJTSU9OKTsKIAogCWhvdGsgPQotCSAgICAoc3RydWN0IGFzdXNfaG90ayAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXN1c19ob3RrKSwgR0ZQX0tFUk5FTCk7CisJICAgIChzdHJ1Y3QgYXN1c19ob3RrICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGFzdXNfaG90ayksIEdGUF9LRVJORUwpOwogCWlmICghaG90aykKIAkJcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KGhvdGssIDAsIHNpemVvZihzdHJ1Y3QgYXN1c19ob3RrKSk7CkBAIC0xMTM0LDcgKzExMzEsNiBAQAogCWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSA9IGhvdGs7CiAJaG90ay0+ZGV2aWNlID0gZGV2aWNlOwogCi0KIAlyZXN1bHQgPSBhc3VzX2hvdGtfY2hlY2soKTsKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKQEAgLTExNTMsMTcgKzExNDksMjIgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICIgIEVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpOwogCiAJLyogRm9yIGxhcHRvcHMgd2l0aG91dCBHUExWOiBpbml0IHRoZSBob3RrLT5icmlnaHRuZXNzIHZhbHVlICovCi0JaWYgKCghaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19nZXQpICYmICghaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19zdGF0dXMpICYmCi0JICAgIChob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3VwICYmIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZG93bikpIHsKLQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19kb3duLAotCQkJCQkgICAgICBOVUxMLCBOVUxMKTsKKwlpZiAoKCFob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2dldCkKKwkgICAgJiYgKCFob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3N0YXR1cykKKwkgICAgJiYgKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfdXAKKwkJJiYgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19kb3duKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19kb3duLAorCQkJCQkgTlVMTCwgTlVMTCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgRXJyb3IgY2hhbmdpbmcgYnJpZ2h0bmVzc1xuIik7CiAJCWVsc2UgewotCQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc191cCwKLQkJCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLAorCQkJCQkJIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfdXAsCisJCQkJCQkgTlVMTCwgTlVMTCk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBTdHJhbmdlLCBlcnJvciBjaGFuZ2luZyIgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBTdHJhbmdlLCBlcnJvciBjaGFuZ2luZyIKIAkJCQkgICAgICAgIiBicmlnaHRuZXNzXG4iKTsKIAkJfQogCX0KQEAgLTExNzYsNyArMTE3Nyw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotCiBzdGF0aWMgaW50IGFzdXNfaG90a19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CkBAIC0xMTk2LDcgKzExOTYsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgX19pbml0IGFzdXNfYWNwaV9pbml0KHZvaWQpCiB7CiAJaW50IHJlc3VsdDsKQEAgLTEyMDQsOSArMTIwMyw5IEBACiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKCFhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKXsKKwlpZiAoIWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJVc2luZyBnZW5lcmljIGhvdGtleSBkcml2ZXJcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsJCisJCXJldHVybiAtRU5PREVWOwogCX0KIAlhc3VzX3Byb2NfZGlyID0gcHJvY19ta2RpcihQUk9DX0FTVVMsIGFjcGlfcm9vdF9kaXIpOwogCWlmICghYXN1c19wcm9jX2RpcikgewpAQCAtMTIyNSw3ICsxMjI0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgdm9pZCBfX2V4aXQgYXN1c19hY3BpX2V4aXQodm9pZCkKIHsKIAlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYXN1c19ob3RrX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwppbmRleCBjNTVmZWNhLi43MDJlODU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAotCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9WQUxVRV9VTktOT1dOIDB4RkZGRkZGRkYKIAogI2RlZmluZSBBQ1BJX0JBVFRFUllfRk9STUFUX0JJRgkiTk5OTk5OTk5OU1NTUyIKQEAgLTUzLDg3ICs1Miw4NSBAQAogI2RlZmluZSBBQ1BJX0JBVFRFUllfVU5JVFNfV0FUVFMJIm1XIgogI2RlZmluZSBBQ1BJX0JBVFRFUllfVU5JVFNfQU1QUwkJIm1BIgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9CQVRURVJZX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJhY3BpX2JhdHRlcnkiKQorQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9iYXR0ZXJ5IikKIAotTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOworICAgIE1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKIE1PRFVMRV9ERVNDUklQVElPTihBQ1BJX0JBVFRFUllfRFJJVkVSX05BTUUpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9hZGQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3JlbW92ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2JhdHRlcnlfZHJpdmVyID0gewotCS5uYW1lID0JCUFDUElfQkFUVEVSWV9EUklWRVJfTkFNRSwKLQkuY2xhc3MgPQlBQ1BJX0JBVFRFUllfQ0xBU1MsCi0JLmlkcyA9CQlBQ1BJX0JBVFRFUllfSElELAotCS5vcHMgPQkJewotCQkJCS5hZGQgPQkJYWNwaV9iYXR0ZXJ5X2FkZCwKLQkJCQkucmVtb3ZlID0JYWNwaV9iYXR0ZXJ5X3JlbW92ZSwKLQkJCX0sCisJLm5hbWUgPSBBQ1BJX0JBVFRFUllfRFJJVkVSX05BTUUsCisJLmNsYXNzID0gQUNQSV9CQVRURVJZX0NMQVNTLAorCS5pZHMgPSBBQ1BJX0JBVFRFUllfSElELAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX2JhdHRlcnlfYWRkLAorCQkucmVtb3ZlID0gYWNwaV9iYXR0ZXJ5X3JlbW92ZSwKKwkJfSwKIH07CiAKIHN0cnVjdCBhY3BpX2JhdHRlcnlfc3RhdHVzIHsKLQlhY3BpX2ludGVnZXIJCXN0YXRlOwotCWFjcGlfaW50ZWdlcgkJcHJlc2VudF9yYXRlOwotCWFjcGlfaW50ZWdlcgkJcmVtYWluaW5nX2NhcGFjaXR5OwotCWFjcGlfaW50ZWdlcgkJcHJlc2VudF92b2x0YWdlOworCWFjcGlfaW50ZWdlciBzdGF0ZTsKKwlhY3BpX2ludGVnZXIgcHJlc2VudF9yYXRlOworCWFjcGlfaW50ZWdlciByZW1haW5pbmdfY2FwYWNpdHk7CisJYWNwaV9pbnRlZ2VyIHByZXNlbnRfdm9sdGFnZTsKIH07CiAKIHN0cnVjdCBhY3BpX2JhdHRlcnlfaW5mbyB7Ci0JYWNwaV9pbnRlZ2VyCQlwb3dlcl91bml0OwotCWFjcGlfaW50ZWdlcgkJZGVzaWduX2NhcGFjaXR5OwotCWFjcGlfaW50ZWdlcgkJbGFzdF9mdWxsX2NhcGFjaXR5OwotCWFjcGlfaW50ZWdlcgkJYmF0dGVyeV90ZWNobm9sb2d5OwotCWFjcGlfaW50ZWdlcgkJZGVzaWduX3ZvbHRhZ2U7Ci0JYWNwaV9pbnRlZ2VyCQlkZXNpZ25fY2FwYWNpdHlfd2FybmluZzsKLQlhY3BpX2ludGVnZXIJCWRlc2lnbl9jYXBhY2l0eV9sb3c7Ci0JYWNwaV9pbnRlZ2VyCQliYXR0ZXJ5X2NhcGFjaXR5X2dyYW51bGFyaXR5XzE7Ci0JYWNwaV9pbnRlZ2VyCQliYXR0ZXJ5X2NhcGFjaXR5X2dyYW51bGFyaXR5XzI7Ci0JYWNwaV9zdHJpbmcJCW1vZGVsX251bWJlcjsKLQlhY3BpX3N0cmluZwkJc2VyaWFsX251bWJlcjsKLQlhY3BpX3N0cmluZwkJYmF0dGVyeV90eXBlOwotCWFjcGlfc3RyaW5nCQlvZW1faW5mbzsKKwlhY3BpX2ludGVnZXIgcG93ZXJfdW5pdDsKKwlhY3BpX2ludGVnZXIgZGVzaWduX2NhcGFjaXR5OworCWFjcGlfaW50ZWdlciBsYXN0X2Z1bGxfY2FwYWNpdHk7CisJYWNwaV9pbnRlZ2VyIGJhdHRlcnlfdGVjaG5vbG9neTsKKwlhY3BpX2ludGVnZXIgZGVzaWduX3ZvbHRhZ2U7CisJYWNwaV9pbnRlZ2VyIGRlc2lnbl9jYXBhY2l0eV93YXJuaW5nOworCWFjcGlfaW50ZWdlciBkZXNpZ25fY2FwYWNpdHlfbG93OworCWFjcGlfaW50ZWdlciBiYXR0ZXJ5X2NhcGFjaXR5X2dyYW51bGFyaXR5XzE7CisJYWNwaV9pbnRlZ2VyIGJhdHRlcnlfY2FwYWNpdHlfZ3JhbnVsYXJpdHlfMjsKKwlhY3BpX3N0cmluZyBtb2RlbF9udW1iZXI7CisJYWNwaV9zdHJpbmcgc2VyaWFsX251bWJlcjsKKwlhY3BpX3N0cmluZyBiYXR0ZXJ5X3R5cGU7CisJYWNwaV9zdHJpbmcgb2VtX2luZm87CiB9OwogCiBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X2ZsYWdzIHsKLQl1OAkJCXByZXNlbnQ6MTsJLyogQmF5IG9jY3VwaWVkPyAqLwotCXU4CQkJcG93ZXJfdW5pdDoxOwkvKiAwPXdhdHRzLCAxPWFwbXMgKi8KLQl1OAkJCWFsYXJtOjE7CS8qIF9CVFAgcHJlc2VudD8gKi8KLQl1OAkJCXJlc2VydmVkOjU7CisJdTggcHJlc2VudDoxOwkJLyogQmF5IG9jY3VwaWVkPyAqLworCXU4IHBvd2VyX3VuaXQ6MTsJLyogMD13YXR0cywgMT1hcG1zICovCisJdTggYWxhcm06MTsJCS8qIF9CVFAgcHJlc2VudD8gKi8KKwl1OCByZXNlcnZlZDo1OwogfTsKIAogc3RydWN0IGFjcGlfYmF0dGVyeV90cmlwcyB7Ci0JdW5zaWduZWQgbG9uZwkJd2FybmluZzsKLQl1bnNpZ25lZCBsb25nCQlsb3c7CisJdW5zaWduZWQgbG9uZyB3YXJuaW5nOworCXVuc2lnbmVkIGxvbmcgbG93OwogfTsKIAogc3RydWN0IGFjcGlfYmF0dGVyeSB7Ci0JYWNwaV9oYW5kbGUJCWhhbmRsZTsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CiAJc3RydWN0IGFjcGlfYmF0dGVyeV9mbGFncyBmbGFnczsKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X3RyaXBzIHRyaXBzOwotCXVuc2lnbmVkIGxvbmcJCWFsYXJtOworCXVuc2lnbmVkIGxvbmcgYWxhcm07CiAJc3RydWN0IGFjcGlfYmF0dGVyeV9pbmZvICppbmZvOwogfTsKIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdHRlcnkgTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIGludAotYWNwaV9iYXR0ZXJ5X2dldF9pbmZvICgKLQlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5CSpiYXR0ZXJ5LAotCXN0cnVjdCBhY3BpX2JhdHRlcnlfaW5mbyAqKmJpZikKK2FjcGlfYmF0dGVyeV9nZXRfaW5mbyhzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5LAorCQkgICAgICBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X2luZm8gKipiaWYpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cyAJCXN0YXR1cyA9IDA7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWZvcm1hdCA9IHtzaXplb2YoQUNQSV9CQVRURVJZX0ZPUk1BVF9CSUYpLAotCQkJCQkJQUNQSV9CQVRURVJZX0ZPUk1BVF9CSUZ9OwotCXN0cnVjdCBhY3BpX2J1ZmZlcglkYXRhID0gezAsIE5VTEx9OwotCXVuaW9uIGFjcGlfb2JqZWN0CSpwYWNrYWdlID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGZvcm1hdCA9IHsgc2l6ZW9mKEFDUElfQkFUVEVSWV9GT1JNQVRfQklGKSwKKwkJQUNQSV9CQVRURVJZX0ZPUk1BVF9CSUYKKwl9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBkYXRhID0geyAwLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKnBhY2thZ2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X2dldF9pbmZvIik7CiAKQEAgLTE0OCw3ICsxNDUsNyBAQAogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCi0JcGFja2FnZSA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKKwlwYWNrYWdlID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopYnVmZmVyLnBvaW50ZXI7CiAKIAkvKiBFeHRyYWN0IFBhY2thZ2UgRGF0YSAqLwogCkBAIC0xNzQsMjcgKzE3MSwyNyBAQAogCQlnb3RvIGVuZDsKIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCiAJaWYgKCFyZXN1bHQpCi0JCSgqYmlmKSA9IChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X2luZm8gKikgZGF0YS5wb2ludGVyOworCQkoKmJpZikgPSAoc3RydWN0IGFjcGlfYmF0dGVyeV9pbmZvICopZGF0YS5wb2ludGVyOwogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBpbnQKLWFjcGlfYmF0dGVyeV9nZXRfc3RhdHVzICgKLQlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5CSpiYXR0ZXJ5LAotCXN0cnVjdCBhY3BpX2JhdHRlcnlfc3RhdHVzICoqYnN0KQorYWNwaV9iYXR0ZXJ5X2dldF9zdGF0dXMoc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSwKKwkJCXN0cnVjdCBhY3BpX2JhdHRlcnlfc3RhdHVzICoqYnN0KQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMgCQlzdGF0dXMgPSAwOwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwotCXN0cnVjdCBhY3BpX2J1ZmZlcglmb3JtYXQgPSB7c2l6ZW9mKEFDUElfQkFUVEVSWV9GT1JNQVRfQlNUKSwKLQkJCQkJCUFDUElfQkFUVEVSWV9GT1JNQVRfQlNUfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJZGF0YSA9IHswLCBOVUxMfTsKLQl1bmlvbiBhY3BpX29iamVjdAkqcGFja2FnZSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBmb3JtYXQgPSB7IHNpemVvZihBQ1BJX0JBVFRFUllfRk9STUFUX0JTVCksCisJCUFDUElfQkFUVEVSWV9GT1JNQVRfQlNUCisJfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgZGF0YSA9IHsgMCwgTlVMTCB9OworCXVuaW9uIGFjcGlfb2JqZWN0ICpwYWNrYWdlID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYmF0dGVyeV9nZXRfc3RhdHVzIik7CiAKQEAgLTIwOSw3ICsyMDYsNyBAQAogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCi0JcGFja2FnZSA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKKwlwYWNrYWdlID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopYnVmZmVyLnBvaW50ZXI7CiAKIAkvKiBFeHRyYWN0IFBhY2thZ2UgRGF0YSAqLwogCkBAIC0yMzUsMjQgKzIzMiwyMSBAQAogCQlnb3RvIGVuZDsKIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCiAJaWYgKCFyZXN1bHQpCi0JCSgqYnN0KSA9IChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X3N0YXR1cyAqKSBkYXRhLnBvaW50ZXI7CisJCSgqYnN0KSA9IChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X3N0YXR1cyAqKWRhdGEucG9pbnRlcjsKIAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KIHN0YXRpYyBpbnQKLWFjcGlfYmF0dGVyeV9zZXRfYWxhcm0gKAotCXN0cnVjdCBhY3BpX2JhdHRlcnkJKmJhdHRlcnksCi0JdW5zaWduZWQgbG9uZwkJYWxhcm0pCithY3BpX2JhdHRlcnlfc2V0X2FsYXJtKHN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnksIHVuc2lnbmVkIGxvbmcgYWxhcm0pCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IDA7Ci0JdW5pb24gYWNwaV9vYmplY3QJYXJnMCA9IHtBQ1BJX1RZUEVfSU5URUdFUn07Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJYXJnX2xpc3QgPSB7MSwgJmFyZzB9OworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CisJdW5pb24gYWNwaV9vYmplY3QgYXJnMCA9IHsgQUNQSV9UWVBFX0lOVEVHRVIgfTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdCA9IHsgMSwgJmFyZzAgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYmF0dGVyeV9zZXRfYWxhcm0iKTsKIApAQCAtMjc1LDE5ICsyNjksMTYgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9iYXR0ZXJ5X2NoZWNrICgKLQlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5CSpiYXR0ZXJ5KQorc3RhdGljIGludCBhY3BpX2JhdHRlcnlfY2hlY2soc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlhY3BpX2hhbmRsZQkJaGFuZGxlID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9oYW5kbGUgaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAJc3RydWN0IGFjcGlfYmF0dGVyeV9pbmZvICpiaWYgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X2NoZWNrIik7Ci0JCisKIAlpZiAoIWJhdHRlcnkpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIApAQCAtMzM2LDE4ICszMjcsMTcgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmFjcGlfYmF0dGVyeV9kaXI7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICphY3BpX2JhdHRlcnlfZGlyOwogc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVhZF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5CSpiYXR0ZXJ5ID0gKHN0cnVjdCBhY3BpX2JhdHRlcnkgKikgc2VxLT5wcml2YXRlOworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkgPSAoc3RydWN0IGFjcGlfYmF0dGVyeSAqKXNlcS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X2luZm8gKmJpZiA9IE5VTEw7Ci0JY2hhcgkJCSp1bml0cyA9ICI/IjsKKwljaGFyICp1bml0cyA9ICI/IjsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYmF0dGVyeV9yZWFkX2luZm8iKTsKIApAQCAtMzY5LDE5ICszNTksMjEgQEAKIAkJZ290byBlbmQ7CiAJfQogCi0JdW5pdHMgPSBiaWYtPnBvd2VyX3VuaXQgPyBBQ1BJX0JBVFRFUllfVU5JVFNfQU1QUyA6IEFDUElfQkFUVEVSWV9VTklUU19XQVRUUzsKLQkJCQkJCisJdW5pdHMgPQorCSAgICBiaWYtPgorCSAgICBwb3dlcl91bml0ID8gQUNQSV9CQVRURVJZX1VOSVRTX0FNUFMgOiBBQ1BJX0JBVFRFUllfVU5JVFNfV0FUVFM7CisKIAlpZiAoYmlmLT5kZXNpZ25fY2FwYWNpdHkgPT0gQUNQSV9CQVRURVJZX1ZBTFVFX1VOS05PV04pCiAJCXNlcV9wcmludGYoc2VxLCAiZGVzaWduIGNhcGFjaXR5OiAgICAgICAgIHVua25vd25cbiIpOwogCWVsc2UKIAkJc2VxX3ByaW50ZihzZXEsICJkZXNpZ24gY2FwYWNpdHk6ICAgICAgICAgJWQgJXNoXG4iLAotCQkJKHUzMikgYmlmLT5kZXNpZ25fY2FwYWNpdHksIHVuaXRzKTsKKwkJCSAgICh1MzIpIGJpZi0+ZGVzaWduX2NhcGFjaXR5LCB1bml0cyk7CiAKIAlpZiAoYmlmLT5sYXN0X2Z1bGxfY2FwYWNpdHkgPT0gQUNQSV9CQVRURVJZX1ZBTFVFX1VOS05PV04pCiAJCXNlcV9wcmludGYoc2VxLCAibGFzdCBmdWxsIGNhcGFjaXR5OiAgICAgIHVua25vd25cbiIpOwogCWVsc2UKIAkJc2VxX3ByaW50ZihzZXEsICJsYXN0IGZ1bGwgY2FwYWNpdHk6ICAgICAgJWQgJXNoXG4iLAotCQkJKHUzMikgYmlmLT5sYXN0X2Z1bGxfY2FwYWNpdHksIHVuaXRzKTsKKwkJCSAgICh1MzIpIGJpZi0+bGFzdF9mdWxsX2NhcGFjaXR5LCB1bml0cyk7CiAKIAlzd2l0Y2ggKCh1MzIpIGJpZi0+YmF0dGVyeV90ZWNobm9sb2d5KSB7CiAJY2FzZSAwOgpAQCAtMzk5LDI2ICszOTEsMjIgQEAKIAkJc2VxX3ByaW50ZihzZXEsICJkZXNpZ24gdm9sdGFnZTogICAgICAgICAgdW5rbm93blxuIik7CiAJZWxzZQogCQlzZXFfcHJpbnRmKHNlcSwgImRlc2lnbiB2b2x0YWdlOiAgICAgICAgICAlZCBtVlxuIiwKLQkJCSh1MzIpIGJpZi0+ZGVzaWduX3ZvbHRhZ2UpOwotCQotCXNlcV9wcmludGYoc2VxLCAiZGVzaWduIGNhcGFjaXR5IHdhcm5pbmc6ICVkICVzaFxuIiwKLQkJKHUzMikgYmlmLT5kZXNpZ25fY2FwYWNpdHlfd2FybmluZywgdW5pdHMpOwotCXNlcV9wcmludGYoc2VxLCAiZGVzaWduIGNhcGFjaXR5IGxvdzogICAgICVkICVzaFxuIiwKLQkJKHUzMikgYmlmLT5kZXNpZ25fY2FwYWNpdHlfbG93LCB1bml0cyk7Ci0Jc2VxX3ByaW50ZihzZXEsICJjYXBhY2l0eSBncmFudWxhcml0eSAxOiAgJWQgJXNoXG4iLAotCQkodTMyKSBiaWYtPmJhdHRlcnlfY2FwYWNpdHlfZ3JhbnVsYXJpdHlfMSwgdW5pdHMpOwotCXNlcV9wcmludGYoc2VxLCAiY2FwYWNpdHkgZ3JhbnVsYXJpdHkgMjogICVkICVzaFxuIiwKLQkJKHUzMikgYmlmLT5iYXR0ZXJ5X2NhcGFjaXR5X2dyYW51bGFyaXR5XzIsIHVuaXRzKTsKLQlzZXFfcHJpbnRmKHNlcSwgIm1vZGVsIG51bWJlcjogICAgICAgICAgICAlc1xuIiwKLQkJYmlmLT5tb2RlbF9udW1iZXIpOwotCXNlcV9wcmludGYoc2VxLCAic2VyaWFsIG51bWJlcjogICAgICAgICAgICVzXG4iLAotCQliaWYtPnNlcmlhbF9udW1iZXIpOwotCXNlcV9wcmludGYoc2VxLCAiYmF0dGVyeSB0eXBlOiAgICAgICAgICAgICVzXG4iLAotCQliaWYtPmJhdHRlcnlfdHlwZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJPRU0gaW5mbzogICAgICAgICAgICAgICAgJXNcbiIsCi0JCWJpZi0+b2VtX2luZm8pOworCQkJICAgKHUzMikgYmlmLT5kZXNpZ25fdm9sdGFnZSk7CiAKLWVuZDoKKwlzZXFfcHJpbnRmKHNlcSwgImRlc2lnbiBjYXBhY2l0eSB3YXJuaW5nOiAlZCAlc2hcbiIsCisJCSAgICh1MzIpIGJpZi0+ZGVzaWduX2NhcGFjaXR5X3dhcm5pbmcsIHVuaXRzKTsKKwlzZXFfcHJpbnRmKHNlcSwgImRlc2lnbiBjYXBhY2l0eSBsb3c6ICAgICAlZCAlc2hcbiIsCisJCSAgICh1MzIpIGJpZi0+ZGVzaWduX2NhcGFjaXR5X2xvdywgdW5pdHMpOworCXNlcV9wcmludGYoc2VxLCAiY2FwYWNpdHkgZ3JhbnVsYXJpdHkgMTogICVkICVzaFxuIiwKKwkJICAgKHUzMikgYmlmLT5iYXR0ZXJ5X2NhcGFjaXR5X2dyYW51bGFyaXR5XzEsIHVuaXRzKTsKKwlzZXFfcHJpbnRmKHNlcSwgImNhcGFjaXR5IGdyYW51bGFyaXR5IDI6ICAlZCAlc2hcbiIsCisJCSAgICh1MzIpIGJpZi0+YmF0dGVyeV9jYXBhY2l0eV9ncmFudWxhcml0eV8yLCB1bml0cyk7CisJc2VxX3ByaW50ZihzZXEsICJtb2RlbCBudW1iZXI6ICAgICAgICAgICAgJXNcbiIsIGJpZi0+bW9kZWxfbnVtYmVyKTsKKwlzZXFfcHJpbnRmKHNlcSwgInNlcmlhbCBudW1iZXI6ICAgICAgICAgICAlc1xuIiwgYmlmLT5zZXJpYWxfbnVtYmVyKTsKKwlzZXFfcHJpbnRmKHNlcSwgImJhdHRlcnkgdHlwZTogICAgICAgICAgICAlc1xuIiwgYmlmLT5iYXR0ZXJ5X3R5cGUpOworCXNlcV9wcmludGYoc2VxLCAiT0VNIGluZm86ICAgICAgICAgICAgICAgICVzXG4iLCBiaWYtPm9lbV9pbmZvKTsKKworICAgICAgZW5kOgogCWtmcmVlKGJpZik7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CkBAIC00MjksMTQgKzQxNywxMiBAQAogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX2JhdHRlcnlfcmVhZF9pbmZvLCBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2JhdHRlcnlfcmVhZF9zdGF0ZSAoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3N0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3JlYWRfc3RhdGUoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX2JhdHRlcnkJKmJhdHRlcnkgPSAoc3RydWN0IGFjcGlfYmF0dGVyeSAqKSBzZXEtPnByaXZhdGU7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSA9IChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICopc2VxLT5wcml2YXRlOwogCXN0cnVjdCBhY3BpX2JhdHRlcnlfc3RhdHVzICpic3QgPSBOVUxMOwotCWNoYXIJCQkqdW5pdHMgPSAiPyI7CisJY2hhciAqdW5pdHMgPSAiPyI7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2JhdHRlcnlfcmVhZF9zdGF0ZSIpOwogCkBAIC00NTIsNyArNDM4LDkgQEAKIAogCS8qIEJhdHRlcnkgVW5pdHMgKi8KIAotCXVuaXRzID0gYmF0dGVyeS0+ZmxhZ3MucG93ZXJfdW5pdCA/IEFDUElfQkFUVEVSWV9VTklUU19BTVBTIDogQUNQSV9CQVRURVJZX1VOSVRTX1dBVFRTOworCXVuaXRzID0KKwkgICAgYmF0dGVyeS0+ZmxhZ3MuCisJICAgIHBvd2VyX3VuaXQgPyBBQ1BJX0JBVFRFUllfVU5JVFNfQU1QUyA6IEFDUElfQkFUVEVSWV9VTklUU19XQVRUUzsKIAogCS8qIEJhdHRlcnkgU3RhdHVzIChfQlNUKSAqLwogCkBAIC00NjcsMTIgKzQ1NSwxMiBAQAogCWVsc2UKIAkJc2VxX3ByaW50ZihzZXEsICJjYXBhY2l0eSBzdGF0ZTogICAgICAgICAgY3JpdGljYWxcbiIpOwogCi0JaWYgKChic3QtPnN0YXRlICYgMHgwMSkgJiYgKGJzdC0+c3RhdGUgJiAweDAyKSl7Ci0JCXNlcV9wcmludGYoc2VxLCAiY2hhcmdpbmcgc3RhdGU6ICAgICAgICAgIGNoYXJnaW5nL2Rpc2NoYXJnaW5nXG4iKTsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJCYXR0ZXJ5IENoYXJnaW5nIGFuZCBEaXNjaGFyZ2luZz9cbiIpKTsKLQl9Ci0JZWxzZSBpZiAoYnN0LT5zdGF0ZSAmIDB4MDEpCisJaWYgKChic3QtPnN0YXRlICYgMHgwMSkgJiYgKGJzdC0+c3RhdGUgJiAweDAyKSkgeworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICJjaGFyZ2luZyBzdGF0ZTogICAgICAgICAgY2hhcmdpbmcvZGlzY2hhcmdpbmdcbiIpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkJhdHRlcnkgQ2hhcmdpbmcgYW5kIERpc2NoYXJnaW5nP1xuIikpOworCX0gZWxzZSBpZiAoYnN0LT5zdGF0ZSAmIDB4MDEpCiAJCXNlcV9wcmludGYoc2VxLCAiY2hhcmdpbmcgc3RhdGU6ICAgICAgICAgIGRpc2NoYXJnaW5nXG4iKTsKIAllbHNlIGlmIChic3QtPnN0YXRlICYgMHgwMikKIAkJc2VxX3ByaW50ZihzZXEsICJjaGFyZ2luZyBzdGF0ZTogICAgICAgICAgY2hhcmdpbmdcbiIpOwpAQCAtNDg0LDIxICs0NzIsMjEgQEAKIAkJc2VxX3ByaW50ZihzZXEsICJwcmVzZW50IHJhdGU6ICAgICAgICAgICAgdW5rbm93blxuIik7CiAJZWxzZQogCQlzZXFfcHJpbnRmKHNlcSwgInByZXNlbnQgcmF0ZTogICAgICAgICAgICAlZCAlc1xuIiwKLQkJCSh1MzIpIGJzdC0+cHJlc2VudF9yYXRlLCB1bml0cyk7CisJCQkgICAodTMyKSBic3QtPnByZXNlbnRfcmF0ZSwgdW5pdHMpOwogCiAJaWYgKGJzdC0+cmVtYWluaW5nX2NhcGFjaXR5ID09IEFDUElfQkFUVEVSWV9WQUxVRV9VTktOT1dOKQogCQlzZXFfcHJpbnRmKHNlcSwgInJlbWFpbmluZyBjYXBhY2l0eTogICAgICB1bmtub3duXG4iKTsKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAicmVtYWluaW5nIGNhcGFjaXR5OiAgICAgICVkICVzaFxuIiwKLQkJCSh1MzIpIGJzdC0+cmVtYWluaW5nX2NhcGFjaXR5LCB1bml0cyk7CisJCQkgICAodTMyKSBic3QtPnJlbWFpbmluZ19jYXBhY2l0eSwgdW5pdHMpOwogCiAJaWYgKGJzdC0+cHJlc2VudF92b2x0YWdlID09IEFDUElfQkFUVEVSWV9WQUxVRV9VTktOT1dOKQogCQlzZXFfcHJpbnRmKHNlcSwgInByZXNlbnQgdm9sdGFnZTogICAgICAgICB1bmtub3duXG4iKTsKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAicHJlc2VudCB2b2x0YWdlOiAgICAgICAgICVkIG1WXG4iLAotCQkJKHUzMikgYnN0LT5wcmVzZW50X3ZvbHRhZ2UpOworCQkJICAgKHUzMikgYnN0LT5wcmVzZW50X3ZvbHRhZ2UpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJa2ZyZWUoYnN0KTsKIAogCXJldHVybl9WQUxVRSgwKTsKQEAgLTUwOSwxMiArNDk3LDEwIEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfYmF0dGVyeV9yZWFkX3N0YXRlLCBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2JhdHRlcnlfcmVhZF9hbGFybSAoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3N0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3JlYWRfYWxhcm0oc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5CSpiYXR0ZXJ5ID0gKHN0cnVjdCBhY3BpX2JhdHRlcnkgKikgc2VxLT5wcml2YXRlOwotCWNoYXIJCQkqdW5pdHMgPSAiPyI7CisJc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSA9IChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICopc2VxLT5wcml2YXRlOworCWNoYXIgKnVuaXRzID0gIj8iOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X3JlYWRfYWxhcm0iKTsKIApAQCAtNTI3LDggKzUxMywxMCBAQAogCX0KIAogCS8qIEJhdHRlcnkgVW5pdHMgKi8KLQkKLQl1bml0cyA9IGJhdHRlcnktPmZsYWdzLnBvd2VyX3VuaXQgPyBBQ1BJX0JBVFRFUllfVU5JVFNfQU1QUyA6IEFDUElfQkFUVEVSWV9VTklUU19XQVRUUzsKKworCXVuaXRzID0KKwkgICAgYmF0dGVyeS0+ZmxhZ3MuCisJICAgIHBvd2VyX3VuaXQgPyBBQ1BJX0JBVFRFUllfVU5JVFNfQU1QUyA6IEFDUElfQkFUVEVSWV9VTklUU19XQVRUUzsKIAogCS8qIEJhdHRlcnkgQWxhcm0gKi8KIApAQCAtNTM4LDIyICs1MjYsMTkgQEAKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAiJWQgJXNoXG4iLCAodTMyKSBiYXR0ZXJ5LT5hbGFybSwgdW5pdHMpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIHN0YXRpYyBzc2l6ZV90Ci1hY3BpX2JhdHRlcnlfd3JpdGVfYWxhcm0gKAotCXN0cnVjdCBmaWxlCSpmaWxlLAotCWNvbnN0IGNoYXIJX191c2VyICpidWZmZXIsCi0Jc2l6ZV90CQljb3VudCwKLQlsb2ZmX3QJCSpwcG9zKQorYWNwaV9iYXR0ZXJ5X3dyaXRlX2FsYXJtKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWNoYXIJCQlhbGFybV9zdHJpbmdbMTJdID0geydcMCd9OwotCXN0cnVjdCBzZXFfZmlsZQkJKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhY3BpX2JhdHRlcnkJKmJhdHRlcnkgPSAoc3RydWN0IGFjcGlfYmF0dGVyeSAqKW0tPnByaXZhdGU7CisJaW50IHJlc3VsdCA9IDA7CisJY2hhciBhbGFybV9zdHJpbmdbMTJdID0geyAnXDAnIH07CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5ID0gKHN0cnVjdCBhY3BpX2JhdHRlcnkgKiltLT5wcml2YXRlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X3dyaXRlX2FsYXJtIik7CiAKQEAgLTU2NSwxMSArNTUwLDExIEBACiAKIAlpZiAoY29weV9mcm9tX3VzZXIoYWxhcm1fc3RyaW5nLCBidWZmZXIsIGNvdW50KSkKIAkJcmV0dXJuX1ZBTFVFKC1FRkFVTFQpOwotCQorCiAJYWxhcm1fc3RyaW5nW2NvdW50XSA9ICdcMCc7CiAKLQlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfc2V0X2FsYXJtKGJhdHRlcnksIAotCQlzaW1wbGVfc3RydG91bChhbGFybV9zdHJpbmcsIE5VTEwsIDApKTsKKwlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfc2V0X2FsYXJtKGJhdHRlcnksCisJCQkJCXNpbXBsZV9zdHJ0b3VsKGFsYXJtX3N0cmluZywgTlVMTCwgMCkpOwogCWlmIChyZXN1bHQpCiAJCXJldHVybl9WQUxVRShyZXN1bHQpOwogCkBAIC01ODIsNDEgKzU2NywzOSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX2JhdHRlcnlfaW5mb19vcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV9iYXR0ZXJ5X2luZm9fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV9iYXR0ZXJ5X2luZm9fb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfYmF0dGVyeV9zdGF0ZV9vcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV9iYXR0ZXJ5X3N0YXRlX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfYmF0dGVyeV9zdGF0ZV9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9iYXR0ZXJ5X2FsYXJtX29wcyA9IHsKLQkub3BlbgkJPSBhY3BpX2JhdHRlcnlfYWxhcm1fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkud3JpdGUJCT0gYWNwaV9iYXR0ZXJ5X3dyaXRlX2FsYXJtLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX2JhdHRlcnlfYWxhcm1fb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS53cml0ZSA9IGFjcGlfYmF0dGVyeV93cml0ZV9hbGFybSwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCi1zdGF0aWMgaW50Ci1hY3BpX2JhdHRlcnlfYWRkX2ZzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYmF0dGVyeV9hZGRfZnMiKTsKIAogCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJYWNwaV9iYXR0ZXJ5X2Rpcik7CisJCQkJCQkgICAgIGFjcGlfYmF0dGVyeV9kaXIpOwogCQlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKQogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKS0+b3duZXIgPSBUSElTX01PRFVMRTsKQEAgLTYyNCwyNCArNjA3LDI0IEBACiAKIAkvKiAnaW5mbycgW1JdICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX0JBVFRFUllfRklMRV9JTkZPLAotCQlTX0lSVUdPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQkJICBTX0lSVUdPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJaWYgKCFlbnRyeSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCi0JCQlBQ1BJX0JBVFRFUllfRklMRV9JTkZPKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9CQVRURVJZX0ZJTEVfSU5GTykpOwogCWVsc2UgewotCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfYmF0dGVyeV9pbmZvX29wczsgCisJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9iYXR0ZXJ5X2luZm9fb3BzOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAkJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CiAJfQogCiAJLyogJ3N0YXR1cycgW1JdICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX0JBVFRFUllfRklMRV9TVEFUVVMsCi0JCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfQkFUVEVSWV9GSUxFX1NUQVRVUykpOworCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkgIEFDUElfQkFUVEVSWV9GSUxFX1NUQVRVUykpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfYmF0dGVyeV9zdGF0ZV9vcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtNjUwLDExICs2MzMsMTIgQEAKIAogCS8qICdhbGFybScgW1IvV10gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfQkFUVEVSWV9GSUxFX0FMQVJNLAotCQlTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9CQVRURVJZX0ZJTEVfQUxBUk0pKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCisJCQkJICBBQ1BJX0JBVFRFUllfRklMRV9BTEFSTSkpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfYmF0dGVyeV9hbGFybV9vcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtNjY0LDEwICs2NDgsNyBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2JhdHRlcnlfcmVtb3ZlX2ZzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3JlbW92ZV9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2JhdHRlcnlfcmVtb3ZlX2ZzIik7CiAKQEAgLTY4NiwxOSArNjY3LDE0IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZAotYWNwaV9iYXR0ZXJ5X25vdGlmeSAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQl1MzIJCQlldmVudCwKLQl2b2lkCQkJKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX2JhdHRlcnlfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBhY3BpX2JhdHRlcnkJKmJhdHRlcnkgPSAoc3RydWN0IGFjcGlfYmF0dGVyeSAqKSBkYXRhOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5ID0gKHN0cnVjdCBhY3BpX2JhdHRlcnkgKilkYXRhOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYmF0dGVyeV9ub3RpZnkiKTsKIApAQCAtNzE2LDI0ICs2OTIsMjEgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpKTsKKwkJCQkgICJVbnN1cHBvcnRlZCBldmVudCBbMHgleF1cbiIsIGV2ZW50KSk7CiAJCWJyZWFrOwogCX0KIAogCXJldHVybl9WT0lEOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfYmF0dGVyeV9hZGQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2JhdHRlcnlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IDA7Ci0Jc3RydWN0IGFjcGlfYmF0dGVyeQkqYmF0dGVyeSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5ID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYmF0dGVyeV9hZGQiKTsKLQkKKwogCWlmICghZGV2aWNlKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKQEAgLTc1NiwxOSArNzI5LDIwIEBACiAJCWdvdG8gZW5kOwogCiAJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGJhdHRlcnktPmhhbmRsZSwKLQkJQUNQSV9ERVZJQ0VfTk9USUZZLCBhY3BpX2JhdHRlcnlfbm90aWZ5LCBiYXR0ZXJ5KTsKKwkJCQkJICAgICBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJCSAgICAgYWNwaV9iYXR0ZXJ5X25vdGlmeSwgYmF0dGVyeSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlbmQ7CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFNsb3QgWyVzXSAoYmF0dGVyeSAlcylcbiIsCi0JCUFDUElfQkFUVEVSWV9ERVZJQ0VfTkFNRSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JCWRldmljZS0+c3RhdHVzLmJhdHRlcnlfcHJlc2VudD8icHJlc2VudCI6ImFic2VudCIpOwotCQkKLWVuZDoKKwkgICAgICAgQUNQSV9CQVRURVJZX0RFVklDRV9OQU1FLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKKwkgICAgICAgZGV2aWNlLT5zdGF0dXMuYmF0dGVyeV9wcmVzZW50ID8gInByZXNlbnQiIDogImFic2VudCIpOworCisgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkgewogCQlhY3BpX2JhdHRlcnlfcmVtb3ZlX2ZzKGRldmljZSk7CiAJCWtmcmVlKGJhdHRlcnkpOwpAQCAtNzc3LDI3ICs3NTEsMjQgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2JhdHRlcnlfcmVtb3ZlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlpbnQJCQl0eXBlKQorc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gMDsKLQlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5CSpiYXR0ZXJ5ID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X3JlbW92ZSIpOwogCiAJaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCi0JYmF0dGVyeSA9IChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICopIGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKwliYXR0ZXJ5ID0gKHN0cnVjdCBhY3BpX2JhdHRlcnkgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKIAlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihiYXR0ZXJ5LT5oYW5kbGUsCi0JCUFDUElfREVWSUNFX05PVElGWSwgYWNwaV9iYXR0ZXJ5X25vdGlmeSk7CisJCQkJCSAgICBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJCSAgICBhY3BpX2JhdHRlcnlfbm90aWZ5KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgcmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKKwkJCQkgICJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOwogCiAJYWNwaV9iYXR0ZXJ5X3JlbW92ZV9mcyhkZXZpY2UpOwogCkBAIC04MDYsMTEgKzc3Nyw5IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX2JhdHRlcnlfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfYmF0dGVyeV9pbml0KHZvaWQpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYmF0dGVyeV9pbml0Iik7CiAKQEAgLTgyOCw5ICs3OTcsNyBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWFjcGlfYmF0dGVyeV9leGl0ICh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGFjcGlfYmF0dGVyeV9leGl0KHZvaWQpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X2V4aXQiKTsKIApAQCAtODQxLDYgKzgwOCw1IEBACiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogbW9kdWxlX2luaXQoYWNwaV9iYXR0ZXJ5X2luaXQpOwogbW9kdWxlX2V4aXQoYWNwaV9iYXR0ZXJ5X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2JsYWNrbGlzdC5jIGIvZHJpdmVycy9hY3BpL2JsYWNrbGlzdC5jCmluZGV4IDRjMDEwZTcuLjk4MjRmNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ibGFja2xpc3QuYworKysgYi9kcml2ZXJzL2FjcGkvYmxhY2tsaXN0LmMKQEAgLTI2LDcgKzI2LDYgQEAKICAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAgKi8KIAotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzQsNDkgKzMzLDQ5IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogCi1lbnVtIGFjcGlfYmxhY2tsaXN0X3ByZWRpY2F0ZXMKLXsKLSAgICAgICAgYWxsX3ZlcnNpb25zLAotICAgICAgICBsZXNzX3RoYW5fb3JfZXF1YWwsCi0gICAgICAgIGVxdWFsLAotICAgICAgICBncmVhdGVyX3RoYW5fb3JfZXF1YWwsCitlbnVtIGFjcGlfYmxhY2tsaXN0X3ByZWRpY2F0ZXMgeworCWFsbF92ZXJzaW9ucywKKwlsZXNzX3RoYW5fb3JfZXF1YWwsCisJZXF1YWwsCisJZ3JlYXRlcl90aGFuX29yX2VxdWFsLAogfTsKIAotc3RydWN0IGFjcGlfYmxhY2tsaXN0X2l0ZW0KLXsKLSAgICAgICAgY2hhciAgICAgICAgICAgIG9lbV9pZFs3XTsKLSAgICAgICAgY2hhciAgICAgICAgICAgIG9lbV90YWJsZV9pZFs5XTsKLSAgICAgICAgdTMyICAgICAgICAgICAgIG9lbV9yZXZpc2lvbjsKLSAgICAgICAgYWNwaV90YWJsZV90eXBlIHRhYmxlOwotICAgICAgICBlbnVtIGFjcGlfYmxhY2tsaXN0X3ByZWRpY2F0ZXMgb2VtX3JldmlzaW9uX3ByZWRpY2F0ZTsKLSAgICAgICAgY2hhciAgICAgICAgICAgICpyZWFzb247Ci0gICAgICAgIHUzMiAgICAgICAgICAgICBpc19jcml0aWNhbF9lcnJvcjsKK3N0cnVjdCBhY3BpX2JsYWNrbGlzdF9pdGVtIHsKKwljaGFyIG9lbV9pZFs3XTsKKwljaGFyIG9lbV90YWJsZV9pZFs5XTsKKwl1MzIgb2VtX3JldmlzaW9uOworCWFjcGlfdGFibGVfdHlwZSB0YWJsZTsKKwllbnVtIGFjcGlfYmxhY2tsaXN0X3ByZWRpY2F0ZXMgb2VtX3JldmlzaW9uX3ByZWRpY2F0ZTsKKwljaGFyICpyZWFzb247CisJdTMyIGlzX2NyaXRpY2FsX2Vycm9yOwogfTsKIAogLyoKICAqIFBPTElDWTogSWYgKmFueXRoaW5nKiBkb2Vzbid0IHdvcmssIHB1dCBpdCBvbiB0aGUgYmxhY2tsaXN0LgogICoJICAgSWYgdGhleSBhcmUgY3JpdGljYWwgZXJyb3JzLCBtYXJrIGl0IGNyaXRpY2FsLCBhbmQgYWJvcnQgZHJpdmVyIGxvYWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9ibGFja2xpc3RfaXRlbSBhY3BpX2JsYWNrbGlzdFtdIF9faW5pdGRhdGEgPQoteworc3RhdGljIHN0cnVjdCBhY3BpX2JsYWNrbGlzdF9pdGVtIGFjcGlfYmxhY2tsaXN0W10gX19pbml0ZGF0YSA9IHsKIAkvKiBDb21wYXEgUHJlc2FyaW8gMTcwMCAqLwotCXsiUFRMVEQgIiwgIiAgRFNEVCAgIiwgMHgwNjA0MDAwMCwgQUNQSV9EU0RULCBsZXNzX3RoYW5fb3JfZXF1YWwsICJNdWx0aXBsZSBwcm9ibGVtcyIsIDF9LAorCXsiUFRMVEQgIiwgIiAgRFNEVCAgIiwgMHgwNjA0MDAwMCwgQUNQSV9EU0RULCBsZXNzX3RoYW5fb3JfZXF1YWwsCisJICJNdWx0aXBsZSBwcm9ibGVtcyIsIDF9LAogCS8qIFNvbnkgRlgxMjAsIEZYMTQwLCBGWDE1MD8gKi8KLQl7IlNPTlkgICIsICJVMCAgICAgICIsIDB4MjAwMTAzMTMsIEFDUElfRFNEVCwgbGVzc190aGFuX29yX2VxdWFsLCAiQUNQSSBkcml2ZXIgcHJvYmxlbSIsIDF9LAorCXsiU09OWSAgIiwgIlUwICAgICAgIiwgMHgyMDAxMDMxMywgQUNQSV9EU0RULCBsZXNzX3RoYW5fb3JfZXF1YWwsCisJICJBQ1BJIGRyaXZlciBwcm9ibGVtIiwgMX0sCiAJLyogQ29tcGFxIFByZXNhcmlvIDgwMCwgSW5zeWRlIEJJT1MgKi8KLQl7IklOVDQ0MCIsICJTWVNGZXh4eCIsIDB4MDAwMDEwMDEsIEFDUElfRFNEVCwgbGVzc190aGFuX29yX2VxdWFsLCAiRG9lcyBub3QgdXNlIF9SRUcgdG8gcHJvdGVjdCBFQyBPcFJlZ2lvbnMiLCAxfSwKKwl7IklOVDQ0MCIsICJTWVNGZXh4eCIsIDB4MDAwMDEwMDEsIEFDUElfRFNEVCwgbGVzc190aGFuX29yX2VxdWFsLAorCSAiRG9lcyBub3QgdXNlIF9SRUcgdG8gcHJvdGVjdCBFQyBPcFJlZ2lvbnMiLCAxfSwKIAkvKiBJQk0gNjAwRSAtIF9BRFIgc2hvdWxkIHJldHVybiA3LCBidXQgaXQgcmV0dXJucyAxICovCi0JeyJJQk0gICAiLCAiVFA2MDBFICAiLCAweDAwMDAwMTA1LCBBQ1BJX0RTRFQsIGxlc3NfdGhhbl9vcl9lcXVhbCwgIkluY29ycmVjdCBfQURSIiwgMX0sCi0JeyJBU1VTXDBcMCIsICJQMkItUyAgICIsIDAsIEFDUElfRFNEVCwgYWxsX3ZlcnNpb25zLCAiQm9ndXMgUENJIHJvdXRpbmciLCAxfSwKKwl7IklCTSAgICIsICJUUDYwMEUgICIsIDB4MDAwMDAxMDUsIEFDUElfRFNEVCwgbGVzc190aGFuX29yX2VxdWFsLAorCSAiSW5jb3JyZWN0IF9BRFIiLCAxfSwKKwl7IkFTVVNcMFwwIiwgIlAyQi1TICAgIiwgMCwgQUNQSV9EU0RULCBhbGxfdmVyc2lvbnMsCisJICJCb2d1cyBQQ0kgcm91dGluZyIsIDF9LAogCiAJeyIifQogfTsKIAotCiAjaWYJQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVIKIAotc3RhdGljIGludCBfX2luaXQKLWJsYWNrbGlzdF9ieV95ZWFyKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBibGFja2xpc3RfYnlfeWVhcih2b2lkKQogewogCWludCB5ZWFyOwogCWNoYXIgKnMgPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CSU9TX0RBVEUpOwpAQCAtOTIsMzYgKzkxLDM4IEBACiAKIAlzICs9IDE7CiAKLQl5ZWFyID0gc2ltcGxlX3N0cnRvdWwocyxOVUxMLDApOyAKKwl5ZWFyID0gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMCk7CiAKLQlpZiAoeWVhciA8IDEwMCkgewkJLyogMi1kaWdpdCB5ZWFyICovCisJaWYgKHllYXIgPCAxMDApIHsJLyogMi1kaWdpdCB5ZWFyICovCiAJCXllYXIgKz0gMTkwMDsKIAkJaWYgKHllYXIgPCAxOTk2KQkvKiBubyBkYXRlcyA8IHNwZWMgMS4wICovCiAJCQl5ZWFyICs9IDEwMDsKIAl9CiAKIAlpZiAoeWVhciA8IENPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkJJT1MgYWdlICglZCkgZmFpbHMgY3V0b2ZmICglZCksICIgCi0JCQkiYWNwaT1mb3JjZSBpcyByZXF1aXJlZCB0byBlbmFibGUgQUNQSVxuIiwKLQkJCXllYXIsIENPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQklPUyBhZ2UgKCVkKSBmYWlscyBjdXRvZmYgKCVkKSwgIgorCQkgICAgICAgImFjcGk9Zm9yY2UgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIEFDUElcbiIsCisJCSAgICAgICB5ZWFyLCBDT05GSUdfQUNQSV9CTEFDS0xJU1RfWUVBUik7CiAJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBibGFja2xpc3RfYnlfeWVhcih2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBibGFja2xpc3RfYnlfeWVhcih2b2lkKQoreworCXJldHVybiAwOworfQogI2VuZGlmCiAKLWludCBfX2luaXQKLWFjcGlfYmxhY2tsaXN0ZWQodm9pZCkKK2ludCBfX2luaXQgYWNwaV9ibGFja2xpc3RlZCh2b2lkKQogewogCWludCBpID0gMDsKIAlpbnQgYmxhY2tsaXN0ZWQgPSAwOwogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfaGVhZGVyOwogCi0Jd2hpbGUgKGFjcGlfYmxhY2tsaXN0W2ldLm9lbV9pZFswXSAhPSAnXDAnKQotCXsKLQkJaWYgKGFjcGlfZ2V0X3RhYmxlX2hlYWRlcl9lYXJseShhY3BpX2JsYWNrbGlzdFtpXS50YWJsZSwgJnRhYmxlX2hlYWRlcikpIHsKKwl3aGlsZSAoYWNwaV9ibGFja2xpc3RbaV0ub2VtX2lkWzBdICE9ICdcMCcpIHsKKwkJaWYgKGFjcGlfZ2V0X3RhYmxlX2hlYWRlcl9lYXJseQorCQkgICAgKGFjcGlfYmxhY2tsaXN0W2ldLnRhYmxlLCAmdGFibGVfaGVhZGVyKSkgewogCQkJaSsrOwogCQkJY29udGludWU7CiAJCX0KQEAgLTEzMSwzMyArMTMyLDQzIEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmIChzdHJuY21wKGFjcGlfYmxhY2tsaXN0W2ldLm9lbV90YWJsZV9pZCwgdGFibGVfaGVhZGVyLT5vZW1fdGFibGVfaWQsIDgpKSB7CisJCWlmIChzdHJuY21wCisJCSAgICAoYWNwaV9ibGFja2xpc3RbaV0ub2VtX3RhYmxlX2lkLCB0YWJsZV9oZWFkZXItPm9lbV90YWJsZV9pZCwKKwkJICAgICA4KSkgewogCQkJaSsrOwogCQkJY29udGludWU7CiAJCX0KIAogCQlpZiAoKGFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbl9wcmVkaWNhdGUgPT0gYWxsX3ZlcnNpb25zKQotCQkgICAgfHwgKGFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbl9wcmVkaWNhdGUgPT0gbGVzc190aGFuX29yX2VxdWFsCi0JCSAgICAgICAgJiYgdGFibGVfaGVhZGVyLT5vZW1fcmV2aXNpb24gPD0gYWNwaV9ibGFja2xpc3RbaV0ub2VtX3JldmlzaW9uKQotCQkgICAgfHwgKGFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbl9wcmVkaWNhdGUgPT0gZ3JlYXRlcl90aGFuX29yX2VxdWFsCi0JCSAgICAgICAgJiYgdGFibGVfaGVhZGVyLT5vZW1fcmV2aXNpb24gPj0gYWNwaV9ibGFja2xpc3RbaV0ub2VtX3JldmlzaW9uKQorCQkgICAgfHwgKGFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbl9wcmVkaWNhdGUgPT0KKwkJCWxlc3NfdGhhbl9vcl9lcXVhbAorCQkJJiYgdGFibGVfaGVhZGVyLT5vZW1fcmV2aXNpb24gPD0KKwkJCWFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbikKKwkJICAgIHx8IChhY3BpX2JsYWNrbGlzdFtpXS5vZW1fcmV2aXNpb25fcHJlZGljYXRlID09CisJCQlncmVhdGVyX3RoYW5fb3JfZXF1YWwKKwkJCSYmIHRhYmxlX2hlYWRlci0+b2VtX3JldmlzaW9uID49CisJCQlhY3BpX2JsYWNrbGlzdFtpXS5vZW1fcmV2aXNpb24pCiAJCSAgICB8fCAoYWNwaV9ibGFja2xpc3RbaV0ub2VtX3JldmlzaW9uX3ByZWRpY2F0ZSA9PSBlcXVhbAotCQkgICAgICAgICYmIHRhYmxlX2hlYWRlci0+b2VtX3JldmlzaW9uID09IGFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbikpIHsKKwkJCSYmIHRhYmxlX2hlYWRlci0+b2VtX3JldmlzaW9uID09CisJCQlhY3BpX2JsYWNrbGlzdFtpXS5vZW1fcmV2aXNpb24pKSB7CiAKLQkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlZlbmRvciBcIiU2LjZzXCIgU3lzdGVtIFwiJTguOHNcIiAiCi0JCQkJIlJldmlzaW9uIDB4JXggaGFzIGEga25vd24gQUNQSSBCSU9TIHByb2JsZW0uXG4iLAotCQkJCWFjcGlfYmxhY2tsaXN0W2ldLm9lbV9pZCwKLQkJCQlhY3BpX2JsYWNrbGlzdFtpXS5vZW1fdGFibGVfaWQsCi0JCQkJYWNwaV9ibGFja2xpc3RbaV0ub2VtX3JldmlzaW9uKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJCSAgICAgICAiVmVuZG9yIFwiJTYuNnNcIiBTeXN0ZW0gXCIlOC44c1wiICIKKwkJCSAgICAgICAiUmV2aXNpb24gMHgleCBoYXMgYSBrbm93biBBQ1BJIEJJT1MgcHJvYmxlbS5cbiIsCisJCQkgICAgICAgYWNwaV9ibGFja2xpc3RbaV0ub2VtX2lkLAorCQkJICAgICAgIGFjcGlfYmxhY2tsaXN0W2ldLm9lbV90YWJsZV9pZCwKKwkJCSAgICAgICBhY3BpX2JsYWNrbGlzdFtpXS5vZW1fcmV2aXNpb24pOwogCi0JCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJSZWFzb246ICVzLiBUaGlzIGlzIGEgJXMgZXJyb3JcbiIsCi0JCQkJYWNwaV9ibGFja2xpc3RbaV0ucmVhc29uLAotCQkJCShhY3BpX2JsYWNrbGlzdFtpXS5pc19jcml0aWNhbF9lcnJvciA/ICJub24tcmVjb3ZlcmFibGUiIDogInJlY292ZXJhYmxlIikpOworCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkJICAgICAgICJSZWFzb246ICVzLiBUaGlzIGlzIGEgJXMgZXJyb3JcbiIsCisJCQkgICAgICAgYWNwaV9ibGFja2xpc3RbaV0ucmVhc29uLAorCQkJICAgICAgIChhY3BpX2JsYWNrbGlzdFtpXS4KKwkJCQlpc19jcml0aWNhbF9lcnJvciA/ICJub24tcmVjb3ZlcmFibGUiIDoKKwkJCQkicmVjb3ZlcmFibGUiKSk7CiAKIAkJCWJsYWNrbGlzdGVkID0gYWNwaV9ibGFja2xpc3RbaV0uaXNfY3JpdGljYWxfZXJyb3I7CiAJCQlicmVhazsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCWkrKzsKIAkJfQogCX0KQEAgLTE2Niw0ICsxNzcsMyBAQAogCiAJcmV0dXJuIGJsYWNrbGlzdGVkOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYnVzLmMgYi9kcml2ZXJzL2FjcGkvYnVzLmMKaW5kZXggZDc3YzIzMC4uNmE0ZGE0MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXMuYworKysgYi9kcml2ZXJzL2FjcGkvYnVzLmMKQEAgLTM2LDE5ICszNiwxNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9CVVNfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImFjcGlfYnVzIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9idXMiKQogI2lmZGVmCUNPTkZJR19YODYKIGV4dGVybiB2b2lkIF9faW5pdCBhY3BpX3BpY19zY2lfc2V0X3RyaWdnZXIodW5zaWduZWQgaW50IGlycSwgdTE2IHRyaWdnZXIpOwogI2VuZGlmCiAKLUZBRFRfREVTQ1JJUFRPUgkJCWFjcGlfZmFkdDsKK0ZBRFRfREVTQ1JJUFRPUiBhY3BpX2ZhZHQ7CiBFWFBPUlRfU1lNQk9MKGFjcGlfZmFkdCk7CiAKLXN0cnVjdCBhY3BpX2RldmljZQkJKmFjcGlfcm9vdDsKLXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkJKmFjcGlfcm9vdF9kaXI7CitzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfcm9vdDsKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV9yb290X2RpcjsKIEVYUE9SVF9TWU1CT0woYWNwaV9yb290X2Rpcik7CiAKICNkZWZpbmUgU1RSVUNUX1RPX0lOVChzKQkoKigoaW50KikmcykpCkBAIC01NywxMiArNTUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UgTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotaW50Ci1hY3BpX2J1c19nZXRfZGV2aWNlICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCXN0cnVjdCBhY3BpX2RldmljZQkqKmRldmljZSkKK2ludCBhY3BpX2J1c19nZXRfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfZGV2aWNlICoqZGV2aWNlKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2dldF9kZXZpY2UiKTsKIApAQCAtNzEsMjQgKzY2LDIzIEBACiAKIAkvKiBUQkQ6IFN1cHBvcnQgZml4ZWQtZmVhdHVyZSBkZXZpY2VzICovCiAKLQlzdGF0dXMgPSBhY3BpX2dldF9kYXRhKGhhbmRsZSwgYWNwaV9idXNfZGF0YV9oYW5kbGVyLCAodm9pZCoqKSBkZXZpY2UpOworCXN0YXR1cyA9IGFjcGlfZ2V0X2RhdGEoaGFuZGxlLCBhY3BpX2J1c19kYXRhX2hhbmRsZXIsICh2b2lkICoqKWRldmljZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICEqZGV2aWNlKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIk5vIGNvbnRleHQgZm9yIG9iamVjdCBbJXBdXG4iLAotCQkJaGFuZGxlKSk7CisJCQkJICBoYW5kbGUpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAogCXJldHVybl9WQUxVRSgwKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX2J1c19nZXRfZGV2aWNlKTsKIAotaW50Ci1hY3BpX2J1c19nZXRfc3RhdHVzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK2ludCBhY3BpX2J1c19nZXRfc3RhdHVzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQl1bnNpZ25lZCBsb25nCQlzdGEgPSAwOwotCQorCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuc2lnbmVkIGxvbmcgc3RhID0gMDsKKwogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2dldF9zdGF0dXMiKTsKIAogCWlmICghZGV2aWNlKQpAQCAtOTgsMTAgKzkyLDExIEBACiAJICogRXZhbHVhdGUgX1NUQSBpZiBwcmVzZW50LgogCSAqLwogCWlmIChkZXZpY2UtPmZsYWdzLmR5bmFtaWNfc3RhdHVzKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPmhhbmRsZSwgIl9TVEEiLCBOVUxMLCAmc3RhKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPmhhbmRsZSwgIl9TVEEiLCBOVUxMLCAmc3RhKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotCQlTVFJVQ1RfVE9fSU5UKGRldmljZS0+c3RhdHVzKSA9IChpbnQpIHN0YTsKKwkJU1RSVUNUX1RPX0lOVChkZXZpY2UtPnN0YXR1cykgPSAoaW50KXN0YTsKIAl9CiAKIAkvKgpAQCAtMTE1LDMzICsxMTAsMzAgQEAKIAogCWlmIChkZXZpY2UtPnN0YXR1cy5mdW5jdGlvbmFsICYmICFkZXZpY2UtPnN0YXR1cy5wcmVzZW50KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJEZXZpY2UgWyVzXSBzdGF0dXMgWyUwOHhdOiAiCi0JCQkiZnVuY3Rpb25hbCBidXQgbm90IHByZXNlbnQ7IHNldHRpbmcgcHJlc2VudFxuIiwKLQkJCWRldmljZS0+cG5wLmJ1c19pZCwKLQkJCSh1MzIpIFNUUlVDVF9UT19JTlQoZGV2aWNlLT5zdGF0dXMpKTsKKwkJICAgICAgICJmdW5jdGlvbmFsIGJ1dCBub3QgcHJlc2VudDsgc2V0dGluZyBwcmVzZW50XG4iLAorCQkgICAgICAgZGV2aWNlLT5wbnAuYnVzX2lkLCAodTMyKSBTVFJVQ1RfVE9fSU5UKGRldmljZS0+c3RhdHVzKSk7CiAJCWRldmljZS0+c3RhdHVzLnByZXNlbnQgPSAxOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRldmljZSBbJXNdIHN0YXR1cyBbJTA4eF1cbiIsIAotCQlkZXZpY2UtPnBucC5idXNfaWQsICh1MzIpIFNUUlVDVF9UT19JTlQoZGV2aWNlLT5zdGF0dXMpKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGV2aWNlIFslc10gc3RhdHVzIFslMDh4XVxuIiwKKwkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkLAorCQkJICAodTMyKSBTVFJVQ1RfVE9fSU5UKGRldmljZS0+c3RhdHVzKSkpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2J1c19nZXRfc3RhdHVzKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2J1c19nZXRfc3RhdHVzKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyIE1hbmFnZW1lbnQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWludAotYWNwaV9idXNfZ2V0X3Bvd2VyICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCWludAkJCSpzdGF0ZSkKK2ludCBhY3BpX2J1c19nZXRfcG93ZXIoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKnN0YXRlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgc3RhdHVzID0gMDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZwkJcHNjID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHBzYyA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19nZXRfcG93ZXIiKTsKIApAQCAtMTU3LDIwICsxNDksMTggQEAKIAkJCSpzdGF0ZSA9IGRldmljZS0+cGFyZW50LT5wb3dlci5zdGF0ZTsKIAkJZWxzZQogCQkJKnN0YXRlID0gQUNQSV9TVEFURV9EMDsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogR2V0IHRoZSBkZXZpY2UncyBwb3dlciBzdGF0ZSBlaXRoZXIgZGlyZWN0bHkgKHZpYSBfUFNDKSBvciAKIAkJICogaW5kaXJlY3RseSAodmlhIHBvd2VyIHJlc291cmNlcykuCiAJCSAqLwogCQlpZiAoZGV2aWNlLT5wb3dlci5mbGFncy5leHBsaWNpdF9nZXQpIHsKLQkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPmhhbmRsZSwgIl9QU0MiLCAKLQkJCQlOVUxMLCAmcHNjKTsKKwkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPmhhbmRsZSwgIl9QU0MiLAorCQkJCQkJICAgICAgIE5VTEwsICZwc2MpOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKLQkJCWRldmljZS0+cG93ZXIuc3RhdGUgPSAoaW50KSBwc2M7Ci0JCX0KLQkJZWxzZSBpZiAoZGV2aWNlLT5wb3dlci5mbGFncy5wb3dlcl9yZXNvdXJjZXMpIHsKKwkJCWRldmljZS0+cG93ZXIuc3RhdGUgPSAoaW50KXBzYzsKKwkJfSBlbHNlIGlmIChkZXZpY2UtPnBvd2VyLmZsYWdzLnBvd2VyX3Jlc291cmNlcykgewogCQkJcmVzdWx0ID0gYWNwaV9wb3dlcl9nZXRfaW5mZXJyZWRfc3RhdGUoZGV2aWNlKTsKIAkJCWlmIChyZXN1bHQpCiAJCQkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CkBAIC0xODAsMjIgKzE3MCwxOSBAQAogCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRldmljZSBbJXNdIHBvd2VyIHN0YXRlIGlzIEQlZFxuIiwKLQkJZGV2aWNlLT5wbnAuYnVzX2lkLCBkZXZpY2UtPnBvd2VyLnN0YXRlKSk7CisJCQkgIGRldmljZS0+cG5wLmJ1c19pZCwgZGV2aWNlLT5wb3dlci5zdGF0ZSkpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX2dldF9wb3dlcik7CiAKLQotaW50Ci1hY3BpX2J1c19zZXRfcG93ZXIgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0JaW50CQkJc3RhdGUpCitpbnQgYWNwaV9idXNfc2V0X3Bvd2VyKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHN0YXRlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKLQljaGFyCQkJb2JqZWN0X25hbWVbNV0gPSB7J18nLCdQJywnUycsJzAnK3N0YXRlLCdcMCd9OworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKKwljaGFyIG9iamVjdF9uYW1lWzVdID0geyAnXycsICdQJywgJ1MnLCAnMCcgKyBzdGF0ZSwgJ1wwJyB9OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfc2V0X3Bvd2VyIik7CiAKQEAgLTIwOSw3ICsxOTYsOCBAQAogCS8qIE1ha2Ugc3VyZSB0aGlzIGlzIGEgdmFsaWQgdGFyZ2V0IHN0YXRlICovCiAKIAlpZiAoIWRldmljZS0+ZmxhZ3MucG93ZXJfbWFuYWdlYWJsZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJEZXZpY2UgaXMgbm90IHBvd2VyIG1hbmFnZWFibGVcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCSAgIkRldmljZSBpcyBub3QgcG93ZXIgbWFuYWdlYWJsZVxuIikpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCS8qCkBAIC0yMTksMTUgKzIwNywxOCBAQAogCWlmIChkZXZpY2UtPnBvd2VyLnN0YXRlID09IEFDUElfU1RBVEVfVU5LTk9XTikKIAkJYWNwaV9idXNfZ2V0X3Bvd2VyKGRldmljZS0+aGFuZGxlLCAmZGV2aWNlLT5wb3dlci5zdGF0ZSk7CiAJaWYgKHN0YXRlID09IGRldmljZS0+cG93ZXIuc3RhdGUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGV2aWNlIGlzIGFscmVhZHkgYXQgRCVkXG4iLCBzdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEZXZpY2UgaXMgYWxyZWFkeSBhdCBEJWRcbiIsCisJCQkJICBzdGF0ZSkpOwogCQlyZXR1cm5fVkFMVUUoMCk7CiAJfQogCWlmICghZGV2aWNlLT5wb3dlci5zdGF0ZXNbc3RhdGVdLmZsYWdzLnZhbGlkKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkRldmljZSBkb2VzIG5vdCBzdXBwb3J0IEQlZFxuIiwgc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgRCVkXG4iLAorCQkJCSAgc3RhdGUpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAlpZiAoZGV2aWNlLT5wYXJlbnQgJiYgKHN0YXRlIDwgZGV2aWNlLT5wYXJlbnQtPnBvd2VyLnN0YXRlKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJDYW5ub3Qgc2V0IGRldmljZSB0byBhIGhpZ2hlci1wb3dlcmVkIHN0YXRlIHRoYW4gcGFyZW50XG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkgICJDYW5ub3Qgc2V0IGRldmljZSB0byBhIGhpZ2hlci1wb3dlcmVkIHN0YXRlIHRoYW4gcGFyZW50XG4iKSk7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKQEAgLTI0NSwxOCArMjM2LDE3IEBACiAJCQkJZ290byBlbmQ7CiAJCX0KIAkJaWYgKGRldmljZS0+cG93ZXIuc3RhdGVzW3N0YXRlXS5mbGFncy5leHBsaWNpdF9zZXQpIHsKLQkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldmljZS0+aGFuZGxlLCAKLQkJCQlvYmplY3RfbmFtZSwgTlVMTCwgTlVMTCk7CisJCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChkZXZpY2UtPmhhbmRsZSwKKwkJCQkJCSAgICAgIG9iamVjdF9uYW1lLCBOVUxMLCBOVUxMKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCQkJZ290byBlbmQ7CiAJCQl9CiAJCX0KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJaWYgKGRldmljZS0+cG93ZXIuc3RhdGVzW3N0YXRlXS5mbGFncy5leHBsaWNpdF9zZXQpIHsKLQkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldmljZS0+aGFuZGxlLCAKLQkJCQlvYmplY3RfbmFtZSwgTlVMTCwgTlVMTCk7CisJCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChkZXZpY2UtPmhhbmRsZSwKKwkJCQkJCSAgICAgIG9iamVjdF9uYW1lLCBOVUxMLCBOVUxMKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCQkJZ290byBlbmQ7CkBAIC0yNjksMjAgKzI1OSwyMSBAQAogCQl9CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiRXJyb3IgdHJhbnNpdGlvbmluZyBkZXZpY2UgWyVzXSB0byBEJWRcbiIsCi0JCQlkZXZpY2UtPnBucC5idXNfaWQsIHN0YXRlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkgICJFcnJvciB0cmFuc2l0aW9uaW5nIGRldmljZSBbJXNdIHRvIEQlZFxuIiwKKwkJCQkgIGRldmljZS0+cG5wLmJ1c19pZCwgc3RhdGUpKTsKIAllbHNlCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRldmljZSBbJXNdIHRyYW5zaXRpb25lZCB0byBEJWRcbiIsCi0JCQlkZXZpY2UtPnBucC5idXNfaWQsIHN0YXRlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJEZXZpY2UgWyVzXSB0cmFuc2l0aW9uZWQgdG8gRCVkXG4iLAorCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkLCBzdGF0ZSkpOwogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9idXNfc2V0X3Bvd2VyKTsKIAotCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50IE1hbmFnZW1lbnQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yOTIsMTYgKzI4MywxMiBAQAogTElTVF9IRUFEKGFjcGlfYnVzX2V2ZW50X2xpc3QpOwogREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYWNwaV9idXNfZXZlbnRfcXVldWUpOwogCi1leHRlcm4gaW50CQkJZXZlbnRfaXNfb3BlbjsKK2V4dGVybiBpbnQgZXZlbnRfaXNfb3BlbjsKIAotaW50Ci1hY3BpX2J1c19nZW5lcmF0ZV9ldmVudCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsCi0JdTgJCQl0eXBlLAotCWludAkJCWRhdGEpCitpbnQgYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHU4IHR5cGUsIGludCBkYXRhKQogewotCXN0cnVjdCBhY3BpX2J1c19ldmVudAkqZXZlbnQgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzID0gMDsKKwlzdHJ1Y3QgYWNwaV9idXNfZXZlbnQgKmV2ZW50ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50Iik7CiAKQEAgLTMyOSwxNCArMzE2LDEzIEBACiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQpOwogCi1pbnQKLWFjcGlfYnVzX3JlY2VpdmVfZXZlbnQgKAotCXN0cnVjdCBhY3BpX2J1c19ldmVudAkqZXZlbnQpCitpbnQgYWNwaV9idXNfcmVjZWl2ZV9ldmVudChzdHJ1Y3QgYWNwaV9idXNfZXZlbnQgKmV2ZW50KQogewotCXVuc2lnbmVkIGxvbmcJCWZsYWdzID0gMDsKLQlzdHJ1Y3QgYWNwaV9idXNfZXZlbnQJKmVudHJ5ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzdHJ1Y3QgYWNwaV9idXNfZXZlbnQgKmVudHJ5ID0gTlVMTDsKIAogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCkBAIC0zNjEsNyArMzQ3LDggQEAKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYWNwaV9idXNfZXZlbnRfbG9jaywgZmxhZ3MpOwotCWVudHJ5ID0gbGlzdF9lbnRyeShhY3BpX2J1c19ldmVudF9saXN0Lm5leHQsIHN0cnVjdCBhY3BpX2J1c19ldmVudCwgbm9kZSk7CisJZW50cnkgPQorCSAgICBsaXN0X2VudHJ5KGFjcGlfYnVzX2V2ZW50X2xpc3QubmV4dCwgc3RydWN0IGFjcGlfYnVzX2V2ZW50LCBub2RlKTsKIAlpZiAoZW50cnkpCiAJCWxpc3RfZGVsKCZlbnRyeS0+bm9kZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNwaV9idXNfZXZlbnRfbG9jaywgZmxhZ3MpOwpAQCAtMzc1LDE5ICszNjIsMTcgQEAKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9idXNfcmVjZWl2ZV9ldmVudCk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9idXNfcmVjZWl2ZV9ldmVudCk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBIYW5kbGluZwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIGludAotYWNwaV9idXNfY2hlY2tfZGV2aWNlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlpbnQJCQkqc3RhdHVzX2NoYW5nZWQpCithY3BpX2J1c19jaGVja19kZXZpY2Uoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCAqc3RhdHVzX2NoYW5nZWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgc3RhdHVzID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOwogCXN0cnVjdCBhY3BpX2RldmljZV9zdGF0dXMgb2xkX3N0YXR1czsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2NoZWNrX2RldmljZSIpOwpAQCAtNDIyLDE1ICs0MDcsMTQgQEAKIAogCWlmIChzdGF0dXNfY2hhbmdlZCkKIAkJKnN0YXR1c19jaGFuZ2VkID0gMTsKLQkKKwogCS8qCiAJICogRGV2aWNlIEluc2VydGlvbi9SZW1vdmFsCiAJICovCiAJaWYgKChkZXZpY2UtPnN0YXR1cy5wcmVzZW50KSAmJiAhKG9sZF9zdGF0dXMucHJlc2VudCkpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGV2aWNlIGluc2VydGlvbiBkZXRlY3RlZFxuIikpOwogCQkvKiBUQkQ6IEhhbmRsZSBkZXZpY2UgaW5zZXJ0aW9uICovCi0JfQotCWVsc2UgaWYgKCEoZGV2aWNlLT5zdGF0dXMucHJlc2VudCkgJiYgKG9sZF9zdGF0dXMucHJlc2VudCkpIHsKKwl9IGVsc2UgaWYgKCEoZGV2aWNlLT5zdGF0dXMucHJlc2VudCkgJiYgKG9sZF9zdGF0dXMucHJlc2VudCkpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGV2aWNlIHJlbW92YWwgZGV0ZWN0ZWRcbiIpKTsKIAkJLyogVEJEOiBIYW5kbGUgZGV2aWNlIHJlbW92YWwgKi8KIAl9CkBAIC00MzgsMTMgKzQyMiwxMCBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2J1c19jaGVja19zY29wZSAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfYnVzX2NoZWNrX3Njb3BlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JaW50CQkJc3RhdHVzX2NoYW5nZWQgPSAwOworCWludCByZXN1bHQgPSAwOworCWludCBzdGF0dXNfY2hhbmdlZCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19jaGVja19zY29wZSIpOwogCkBAIC00NjcsMjAgKzQ0OCwxNSBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCiAvKioKICAqIGFjcGlfYnVzX25vdGlmeQogICogLS0tLS0tLS0tLS0tLS0tCiAgKiBDYWxsYmFjayBmb3IgYWxsICdzeXN0ZW0tbGV2ZWwnIGRldmljZSBub3RpZmljYXRpb25zICh2YWx1ZXMgMHgwMC0weDdGKS4KICAqLwotc3RhdGljIHZvaWQgCi1hY3BpX2J1c19ub3RpZnkgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICB0eXBlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9idXNfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHR5cGUsIHZvaWQgKmRhdGEpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfbm90aWZ5Iik7CiAKQEAgLTQ5MCw2NCArNDY2LDczIEBACiAJc3dpdGNoICh0eXBlKSB7CiAKIAljYXNlIEFDUElfTk9USUZZX0JVU19DSEVDSzoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUmVjZWl2ZWQgQlVTIENIRUNLIG5vdGlmaWNhdGlvbiBmb3IgZGV2aWNlIFslc11cbiIsIAotCQkJZGV2aWNlLT5wbnAuYnVzX2lkKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJSZWNlaXZlZCBCVVMgQ0hFQ0sgbm90aWZpY2F0aW9uIGZvciBkZXZpY2UgWyVzXVxuIiwKKwkJCQkgIGRldmljZS0+cG5wLmJ1c19pZCkpOwogCQlyZXN1bHQgPSBhY3BpX2J1c19jaGVja19zY29wZShkZXZpY2UpOwogCQkvKiAKIAkJICogVEJEOiBXZSdsbCBuZWVkIHRvIG91dHNvdXJjZSBjZXJ0YWluIGV2ZW50cyB0byBub24tQUNQSQotCQkgKglkcml2ZXJzIHZpYSB0aGUgZGV2aWNlIG1hbmFnZXIgKGRldmljZS5jKS4KKwkJICogICAgICBkcml2ZXJzIHZpYSB0aGUgZGV2aWNlIG1hbmFnZXIgKGRldmljZS5jKS4KIAkJICovCiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0s6Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlY2VpdmVkIERFVklDRSBDSEVDSyBub3RpZmljYXRpb24gZm9yIGRldmljZSBbJXNdXG4iLCAKLQkJCWRldmljZS0+cG5wLmJ1c19pZCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiUmVjZWl2ZWQgREVWSUNFIENIRUNLIG5vdGlmaWNhdGlvbiBmb3IgZGV2aWNlIFslc11cbiIsCisJCQkJICBkZXZpY2UtPnBucC5idXNfaWQpKTsKIAkJcmVzdWx0ID0gYWNwaV9idXNfY2hlY2tfZGV2aWNlKGRldmljZSwgTlVMTCk7CiAJCS8qIAogCQkgKiBUQkQ6IFdlJ2xsIG5lZWQgdG8gb3V0c291cmNlIGNlcnRhaW4gZXZlbnRzIHRvIG5vbi1BQ1BJCi0JCSAqCWRyaXZlcnMgdmlhIHRoZSBkZXZpY2UgbWFuYWdlciAoZGV2aWNlLmMpLgorCQkgKiAgICAgIGRyaXZlcnMgdmlhIHRoZSBkZXZpY2UgbWFuYWdlciAoZGV2aWNlLmMpLgogCQkgKi8KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTk9USUZZX0RFVklDRV9XQUtFOgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZWNlaXZlZCBERVZJQ0UgV0FLRSBub3RpZmljYXRpb24gZm9yIGRldmljZSBbJXNdXG4iLCAKLQkJCWRldmljZS0+cG5wLmJ1c19pZCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiUmVjZWl2ZWQgREVWSUNFIFdBS0Ugbm90aWZpY2F0aW9uIGZvciBkZXZpY2UgWyVzXVxuIiwKKwkJCQkgIGRldmljZS0+cG5wLmJ1c19pZCkpOwogCQkvKiBUQkQgKi8KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTk9USUZZX0VKRUNUX1JFUVVFU1Q6Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlY2VpdmVkIEVKRUNUIFJFUVVFU1Qgbm90aWZpY2F0aW9uIGZvciBkZXZpY2UgWyVzXVxuIiwgCi0JCQlkZXZpY2UtPnBucC5idXNfaWQpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIlJlY2VpdmVkIEVKRUNUIFJFUVVFU1Qgbm90aWZpY2F0aW9uIGZvciBkZXZpY2UgWyVzXVxuIiwKKwkJCQkgIGRldmljZS0+cG5wLmJ1c19pZCkpOwogCQkvKiBUQkQgKi8KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTk9USUZZX0RFVklDRV9DSEVDS19MSUdIVDoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUmVjZWl2ZWQgREVWSUNFIENIRUNLIExJR0hUIG5vdGlmaWNhdGlvbiBmb3IgZGV2aWNlIFslc11cbiIsIAotCQkJZGV2aWNlLT5wbnAuYnVzX2lkKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJSZWNlaXZlZCBERVZJQ0UgQ0hFQ0sgTElHSFQgbm90aWZpY2F0aW9uIGZvciBkZXZpY2UgWyVzXVxuIiwKKwkJCQkgIGRldmljZS0+cG5wLmJ1c19pZCkpOwogCQkvKiBUQkQ6IEV4YWN0bHkgd2hhdCBkb2VzICdsaWdodCcgbWVhbj8gKi8KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTk9USUZZX0ZSRVFVRU5DWV9NSVNNQVRDSDoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUmVjZWl2ZWQgRlJFUVVFTkNZIE1JU01BVENIIG5vdGlmaWNhdGlvbiBmb3IgZGV2aWNlIFslc11cbiIsIAotCQkJZGV2aWNlLT5wbnAuYnVzX2lkKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJSZWNlaXZlZCBGUkVRVUVOQ1kgTUlTTUFUQ0ggbm90aWZpY2F0aW9uIGZvciBkZXZpY2UgWyVzXVxuIiwKKwkJCQkgIGRldmljZS0+cG5wLmJ1c19pZCkpOwogCQkvKiBUQkQgKi8KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTk9USUZZX0JVU19NT0RFX01JU01BVENIOgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZWNlaXZlZCBCVVMgTU9ERSBNSVNNQVRDSCBub3RpZmljYXRpb24gZm9yIGRldmljZSBbJXNdXG4iLCAKLQkJCWRldmljZS0+cG5wLmJ1c19pZCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiUmVjZWl2ZWQgQlVTIE1PREUgTUlTTUFUQ0ggbm90aWZpY2F0aW9uIGZvciBkZXZpY2UgWyVzXVxuIiwKKwkJCQkgIGRldmljZS0+cG5wLmJ1c19pZCkpOwogCQkvKiBUQkQgKi8KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTk9USUZZX1BPV0VSX0ZBVUxUOgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZWNlaXZlZCBQT1dFUiBGQVVMVCBub3RpZmljYXRpb24gZm9yIGRldmljZSBbJXNdXG4iLCAKLQkJCWRldmljZS0+cG5wLmJ1c19pZCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiUmVjZWl2ZWQgUE9XRVIgRkFVTFQgbm90aWZpY2F0aW9uIGZvciBkZXZpY2UgWyVzXVxuIiwKKwkJCQkgIGRldmljZS0+cG5wLmJ1c19pZCkpOwogCQkvKiBUQkQgKi8KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZWNlaXZlZCB1bmtub3duL3Vuc3VwcG9ydGVkIG5vdGlmaWNhdGlvbiBbJTA4eF1cbiIsIAotCQkJdHlwZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiUmVjZWl2ZWQgdW5rbm93bi91bnN1cHBvcnRlZCBub3RpZmljYXRpb24gWyUwOHhdXG4iLAorCQkJCSAgdHlwZSkpOwogCQlicmVhazsKIAl9CiAKQEAgLTU1OCwxMyArNTQzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemF0aW9uL0NsZWFudXAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX2J1c19pbml0X2lycSAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfYnVzX2luaXRfaXJxKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb2JqZWN0CWFyZyA9IHtBQ1BJX1RZUEVfSU5URUdFUn07Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJYXJnX2xpc3QgPSB7MSwgJmFyZ307Ci0JY2hhcgkJCSptZXNzYWdlID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmcgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3QgPSB7IDEsICZhcmcgfTsKKwljaGFyICptZXNzYWdlID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2luaXRfaXJxIik7CiAKQEAgLTYwMSwxMiArNTg1LDEwIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXZvaWQgX19pbml0Ci1hY3BpX2Vhcmx5X2luaXQgKHZvaWQpCit2b2lkIF9faW5pdCBhY3BpX2Vhcmx5X2luaXQodm9pZCkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHtzaXplb2YoYWNwaV9mYWR0KSwgJmFjcGlfZmFkdH07CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgc2l6ZW9mKGFjcGlfZmFkdCksICZhY3BpX2ZhZHQgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWFybHlfaW5pdCIpOwogCkBAIC02MTksMTMgKzYwMSwxNSBAQAogCiAJc3RhdHVzID0gYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSgpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJVbmFibGUgdG8gaW5pdGlhbGl6ZSB0aGUgQUNQSSBJbnRlcnByZXRlclxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJVbmFibGUgdG8gaW5pdGlhbGl6ZSB0aGUgQUNQSSBJbnRlcnByZXRlclxuIik7CiAJCWdvdG8gZXJyb3IwOwogCX0KIAogCXN0YXR1cyA9IGFjcGlfbG9hZF90YWJsZXMoKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVW5hYmxlIHRvIGxvYWQgdGhlIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZXNcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCisJCSAgICAgICAiVW5hYmxlIHRvIGxvYWQgdGhlIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZXNcbiIpOwogCQlnb3RvIGVycm9yMDsKIAl9CiAKQEAgLTYzNyw3ICs2MjEsNiBAQAogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJVbmFibGUgdG8gZ2V0IHRoZSBGQURUXG4iKTsKIAkJZ290byBlcnJvcjA7CiAJfQotCiAjaWZkZWYgQ09ORklHX1g4NgogCWlmICghYWNwaV9pb2FwaWMpIHsKIAkJZXh0ZXJuIGFjcGlfaW50ZXJydXB0X2ZsYWdzIGFjcGlfc2NpX2ZsYWdzOwpAQCAtNjQ3LDcgKzYzMCw4IEBACiAJCQlhY3BpX3NjaV9mbGFncy50cmlnZ2VyID0gMzsKIAogCQkvKiBTZXQgUElDLW1vZGUgU0NJIHRyaWdnZXIgdHlwZSAqLwotCQlhY3BpX3BpY19zY2lfc2V0X3RyaWdnZXIoYWNwaV9mYWR0LnNjaV9pbnQsIGFjcGlfc2NpX2ZsYWdzLnRyaWdnZXIpOworCQlhY3BpX3BpY19zY2lfc2V0X3RyaWdnZXIoYWNwaV9mYWR0LnNjaV9pbnQsCisJCQkJCSBhY3BpX3NjaV9mbGFncy50cmlnZ2VyKTsKIAl9IGVsc2UgewogCQlleHRlcm4gaW50IGFjcGlfc2NpX292ZXJyaWRlX2dzaTsKIAkJLyoKQEAgLTY1OCw3ICs2NDIsMTAgQEAKIAl9CiAjZW5kaWYKIAotCXN0YXR1cyA9IGFjcGlfZW5hYmxlX3N1YnN5c3RlbSh+KEFDUElfTk9fSEFSRFdBUkVfSU5JVCB8IEFDUElfTk9fQUNQSV9FTkFCTEUpKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0ofgorCQkJCSAgKEFDUElfTk9fSEFSRFdBUkVfSU5JVCB8CisJCQkJICAgQUNQSV9OT19BQ1BJX0VOQUJMRSkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJVbmFibGUgdG8gZW5hYmxlIEFDUElcbiIpOwogCQlnb3RvIGVycm9yMDsKQEAgLTY2NiwzMCArNjUzLDMyIEBACiAKIAlyZXR1cm5fVk9JRDsKIAotZXJyb3IwOgorICAgICAgZXJyb3IwOgogCWRpc2FibGVfYWNwaSgpOwogCXJldHVybl9WT0lEOwogfQogCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV9idXNfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfYnVzX2luaXQodm9pZCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlleHRlcm4gYWNwaV9zdGF0dXMJYWNwaV9vc19pbml0aWFsaXplMSh2b2lkKTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlleHRlcm4gYWNwaV9zdGF0dXMgYWNwaV9vc19pbml0aWFsaXplMSh2b2lkKTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2luaXQiKTsKIAogCXN0YXR1cyA9IGFjcGlfb3NfaW5pdGlhbGl6ZTEoKTsKIAotCXN0YXR1cyA9IGFjcGlfZW5hYmxlX3N1YnN5c3RlbShBQ1BJX05PX0hBUkRXQVJFX0lOSVQgfCBBQ1BJX05PX0FDUElfRU5BQkxFKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0oQUNQSV9OT19IQVJEV0FSRV9JTklUIHwgQUNQSV9OT19BQ1BJX0VOQUJMRSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlVuYWJsZSB0byBzdGFydCB0aGUgQUNQSSBJbnRlcnByZXRlclxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJVbmFibGUgdG8gc3RhcnQgdGhlIEFDUEkgSW50ZXJwcmV0ZXJcbiIpOwogCQlnb3RvIGVycm9yMTsKIAl9CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVW5hYmxlIHRvIGluaXRpYWxpemUgQUNQSSBPUyBvYmplY3RzXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkgICAgICAgIlVuYWJsZSB0byBpbml0aWFsaXplIEFDUEkgT1Mgb2JqZWN0c1xuIik7CiAJCWdvdG8gZXJyb3IxOwogCX0KICNpZmRlZiBDT05GSUdfQUNQSV9FQwpAQCAtNzIzLDkgKzcxMiwxMiBAQAogCS8qCiAJICogUmVnaXN0ZXIgdGhlIGZvciBhbGwgc3RhbmRhcmQgZGV2aWNlIG5vdGlmaWNhdGlvbnMuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKEFDUElfUk9PVF9PQkpFQ1QsIEFDUElfU1lTVEVNX05PVElGWSwgJmFjcGlfYnVzX25vdGlmeSwgTlVMTCk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKEFDUElfUk9PVF9PQkpFQ1QsIEFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJJmFjcGlfYnVzX25vdGlmeSwgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlVuYWJsZSB0byByZWdpc3RlciBmb3IgZGV2aWNlIG5vdGlmaWNhdGlvbnNcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCisJCSAgICAgICAiVW5hYmxlIHRvIHJlZ2lzdGVyIGZvciBkZXZpY2Ugbm90aWZpY2F0aW9uc1xuIik7CiAJCWdvdG8gZXJyb3IxOwogCX0KIApAQCAtNzM3LDIxICs3MjksMjAgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiAKIAkvKiBNaW1pYyBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbiBoYW5kbGluZyAqLwotZXJyb3IxOgorICAgICAgZXJyb3IxOgogCWFjcGlfdGVybWluYXRlKCk7CiAJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogfQogCi1kZWNsX3N1YnN5cyhhY3BpLE5VTEwsTlVMTCk7CitkZWNsX3N1YnN5cyhhY3BpLCBOVUxMLCBOVUxMKTsKIAotc3RhdGljIGludCBfX2luaXQgYWNwaV9pbml0ICh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9pbml0KHZvaWQpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfaW5pdCIpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlN1YnN5c3RlbSByZXZpc2lvbiAlMDh4XG4iLAotCQlBQ1BJX0NBX1ZFUlNJT04pOworCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJTdWJzeXN0ZW0gcmV2aXNpb24gJTA4eFxuIiwgQUNQSV9DQV9WRVJTSU9OKTsKIAogCWlmIChhY3BpX2Rpc2FibGVkKSB7CiAJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJJbnRlcnByZXRlciBkaXNhYmxlZC5cbiIpOwpAQCAtNzY3LDcgKzc1OCw4IEBACiAJCWlmICghUE1fSVNfQUNUSVZFKCkpCiAJCQlwbV9hY3RpdmUgPSAxOwogCQllbHNlIHsKLQkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJBUE0gaXMgYWxyZWFkeSBhY3RpdmUsIGV4aXRpbmdcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJCSAgICAgICAiQVBNIGlzIGFscmVhZHkgYWN0aXZlLCBleGl0aW5nXG4iKTsKIAkJCWRpc2FibGVfYWNwaSgpOwogCQkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1dHRvbi5jIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCmluZGV4IDgxNjJmZDAuLjRiNmQ5ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXR0b24uYworKysgYi9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAotCiAjZGVmaW5lIEFDUElfQlVUVE9OX0NPTVBPTkVOVAkJMHgwMDA4MDAwMAogI2RlZmluZSBBQ1BJX0JVVFRPTl9EUklWRVJfTkFNRQkJIkFDUEkgQnV0dG9uIERyaXZlciIKICNkZWZpbmUgQUNQSV9CVVRUT05fQ0xBU1MJCSJidXR0b24iCkBAIC00Miw3ICs0MSw3IEBACiAjZGVmaW5lIEFDUElfQlVUVE9OX05PVElGWV9TVEFUVVMJMHg4MAogCiAjZGVmaW5lIEFDUElfQlVUVE9OX1NVQkNMQVNTX1BPV0VSCSJwb3dlciIKLSNkZWZpbmUgQUNQSV9CVVRUT05fSElEX1BPV0VSCQkiUE5QMEMwQyIJCisjZGVmaW5lIEFDUElfQlVUVE9OX0hJRF9QT1dFUgkJIlBOUDBDMEMiCiAjZGVmaW5lIEFDUElfQlVUVE9OX0RFVklDRV9OQU1FX1BPV0VSCSJQb3dlciBCdXR0b24gKENNKSIKICNkZWZpbmUgQUNQSV9CVVRUT05fREVWSUNFX05BTUVfUE9XRVJGCSJQb3dlciBCdXR0b24gKEZGKSIKICNkZWZpbmUgQUNQSV9CVVRUT05fVFlQRV9QT1dFUgkJMHgwMQpAQCAtNjEsNjUgKzYwLDY1IEBACiAjZGVmaW5lIEFDUElfQlVUVE9OX1RZUEVfTElECQkweDA1CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9CVVRUT05fQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImFjcGlfYnV0dG9uIikKK0FDUElfTU9EVUxFX05BTUUoImFjcGlfYnV0dG9uIikKIAotTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOworICAgIE1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKIE1PRFVMRV9ERVNDUklQVElPTihBQ1BJX0JVVFRPTl9EUklWRVJfTkFNRSk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLQotc3RhdGljIGludCBhY3BpX2J1dHRvbl9hZGQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV9idXR0b25fcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX2J1dHRvbl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX2J1dHRvbl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIHN0YXRpYyBpbnQgYWNwaV9idXR0b25faW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0YXRpYyBpbnQgYWNwaV9idXR0b25fc3RhdGVfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9idXR0b25fZHJpdmVyID0gewotCS5uYW1lID0JCUFDUElfQlVUVE9OX0RSSVZFUl9OQU1FLAotCS5jbGFzcyA9CUFDUElfQlVUVE9OX0NMQVNTLAotCS5pZHMgPQkJIkFDUElfRlBCLEFDUElfRlNCLFBOUDBDMEQsUE5QMEMwQyxQTlAwQzBFIiwKLQkub3BzID0JCXsKLQkJCQkuYWRkID0JCWFjcGlfYnV0dG9uX2FkZCwKLQkJCQkucmVtb3ZlID0JYWNwaV9idXR0b25fcmVtb3ZlLAotCQkJfSwKKwkubmFtZSA9IEFDUElfQlVUVE9OX0RSSVZFUl9OQU1FLAorCS5jbGFzcyA9IEFDUElfQlVUVE9OX0NMQVNTLAorCS5pZHMgPSAiQUNQSV9GUEIsQUNQSV9GU0IsUE5QMEMwRCxQTlAwQzBDLFBOUDBDMEUiLAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX2J1dHRvbl9hZGQsCisJCS5yZW1vdmUgPSBhY3BpX2J1dHRvbl9yZW1vdmUsCisJCX0sCiB9OwogCiBzdHJ1Y3QgYWNwaV9idXR0b24gewotCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2U7CS8qIEZpeGVkIGJ1dHRvbiBrbHVkZ2UgKi8KLQl1OAkJCXR5cGU7Ci0JdW5zaWduZWQgbG9uZwkJcHVzaGVkOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsJLyogRml4ZWQgYnV0dG9uIGtsdWRnZSAqLworCXU4IHR5cGU7CisJdW5zaWduZWQgbG9uZyBwdXNoZWQ7CiB9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX2J1dHRvbl9pbmZvX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV9idXR0b25faW5mb19vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX2J1dHRvbl9pbmZvX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX2J1dHRvbl9zdGF0ZV9mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfYnV0dG9uX3N0YXRlX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfYnV0dG9uX3N0YXRlX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmFjcGlfYnV0dG9uX2RpcjsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfYnV0dG9uX2RpcjsKIAogc3RhdGljIGludCBhY3BpX2J1dHRvbl9pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfYnV0dG9uCSpidXR0b24gPSAoc3RydWN0IGFjcGlfYnV0dG9uICopIHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbiA9IChzdHJ1Y3QgYWNwaV9idXR0b24gKilzZXEtPnByaXZhdGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9pbmZvX3NlcV9zaG93Iik7CiAKIAlpZiAoIWJ1dHRvbiB8fCAhYnV0dG9uLT5kZXZpY2UpCiAJCXJldHVybl9WQUxVRSgwKTsKIAotCXNlcV9wcmludGYoc2VxLCAidHlwZTogICAgICAgICAgICAgICAgICAgICVzXG4iLCAKLQkJYWNwaV9kZXZpY2VfbmFtZShidXR0b24tPmRldmljZSkpOworCXNlcV9wcmludGYoc2VxLCAidHlwZTogICAgICAgICAgICAgICAgICAgICVzXG4iLAorCQkgICBhY3BpX2RldmljZV9uYW1lKGJ1dHRvbi0+ZGV2aWNlKSk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CkBAIC0xMjgsMjQgKzEyNywyNCBAQAogewogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX2J1dHRvbl9pbmZvX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKIH0KLQkKKwogc3RhdGljIGludCBhY3BpX2J1dHRvbl9zdGF0ZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX2J1dHRvbgkqYnV0dG9uID0gKHN0cnVjdCBhY3BpX2J1dHRvbiAqKSBzZXEtPnByaXZhdGU7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1czsKLQl1bnNpZ25lZCBsb25nCQlzdGF0ZTsKKwlzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbiA9IChzdHJ1Y3QgYWNwaV9idXR0b24gKilzZXEtPnByaXZhdGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgc3RhdGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9zdGF0ZV9zZXFfc2hvdyIpOwogCiAJaWYgKCFidXR0b24gfHwgIWJ1dHRvbi0+ZGV2aWNlKQogCQlyZXR1cm5fVkFMVUUoMCk7CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoYnV0dG9uLT5oYW5kbGUsIl9MSUQiLE5VTEwsJnN0YXRlKTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoYnV0dG9uLT5oYW5kbGUsICJfTElEIiwgTlVMTCwgJnN0YXRlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJc2VxX3ByaW50ZihzZXEsICJzdGF0ZTogICAgICB1bnN1cHBvcnRlZFxuIik7Ci0JfQotCWVsc2V7Ci0JCXNlcV9wcmludGYoc2VxLCAic3RhdGU6ICAgICAgJXNcbiIsIChzdGF0ZSA/ICJvcGVuIiA6ICJjbG9zZWQiKSk7IAorCX0gZWxzZSB7CisJCXNlcV9wcmludGYoc2VxLCAic3RhdGU6ICAgICAgJXNcbiIsCisJCQkgICAoc3RhdGUgPyAib3BlbiIgOiAiY2xvc2VkIikpOwogCX0KIAogCXJldHVybl9WQUxVRSgwKTsKQEAgLTE2MCwxMiArMTU5LDEwIEBACiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICphY3BpX3NsZWVwX2RpcjsKIHN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfbGlkX2RpcjsKIAotc3RhdGljIGludAotYWNwaV9idXR0b25fYWRkX2ZzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9idXR0b25fYWRkX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnkgPSBOVUxMOwotCXN0cnVjdCBhY3BpX2J1dHRvbgkqYnV0dG9uID0gTlVMTDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbiA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9hZGRfZnMiKTsKIApAQCAtMTc4LDIxICsxNzUsMjEgQEAKIAljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVI6CiAJY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1BPV0VSRjoKIAkJaWYgKCFhY3BpX3Bvd2VyX2RpcikKLQkJCWFjcGlfcG93ZXJfZGlyID0gcHJvY19ta2RpcihBQ1BJX0JVVFRPTl9TVUJDTEFTU19QT1dFUiwgCi0JCQkJYWNwaV9idXR0b25fZGlyKTsKKwkJCWFjcGlfcG93ZXJfZGlyID0gcHJvY19ta2RpcihBQ1BJX0JVVFRPTl9TVUJDTEFTU19QT1dFUiwKKwkJCQkJCSAgICBhY3BpX2J1dHRvbl9kaXIpOwogCQllbnRyeSA9IGFjcGlfcG93ZXJfZGlyOwogCQlicmVhazsKIAljYXNlIEFDUElfQlVUVE9OX1RZUEVfU0xFRVA6CiAJY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1NMRUVQRjoKIAkJaWYgKCFhY3BpX3NsZWVwX2RpcikKLQkJCWFjcGlfc2xlZXBfZGlyID0gcHJvY19ta2RpcihBQ1BJX0JVVFRPTl9TVUJDTEFTU19TTEVFUCwgCi0JCQkJYWNwaV9idXR0b25fZGlyKTsKKwkJCWFjcGlfc2xlZXBfZGlyID0gcHJvY19ta2RpcihBQ1BJX0JVVFRPTl9TVUJDTEFTU19TTEVFUCwKKwkJCQkJCSAgICBhY3BpX2J1dHRvbl9kaXIpOwogCQllbnRyeSA9IGFjcGlfc2xlZXBfZGlyOwogCQlicmVhazsKIAljYXNlIEFDUElfQlVUVE9OX1RZUEVfTElEOgogCQlpZiAoIWFjcGlfbGlkX2RpcikKLQkJCWFjcGlfbGlkX2RpciA9IHByb2NfbWtkaXIoQUNQSV9CVVRUT05fU1VCQ0xBU1NfTElELCAKLQkJCQlhY3BpX2J1dHRvbl9kaXIpOworCQkJYWNwaV9saWRfZGlyID0gcHJvY19ta2RpcihBQ1BJX0JVVFRPTl9TVUJDTEFTU19MSUQsCisJCQkJCQkgIGFjcGlfYnV0dG9uX2Rpcik7CiAJCWVudHJ5ID0gYWNwaV9saWRfZGlyOwogCQlicmVhazsKIAl9CkBAIC0yMDgsMTEgKzIwNSwxMSBAQAogCiAJLyogJ2luZm8nIFtSXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fRklMRV9JTkZPLAotCQlTX0lSVUdPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQkJICBTX0lSVUdPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJaWYgKCFlbnRyeSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCi0JCQlBQ1BJX0JVVFRPTl9GSUxFX0lORk8pKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCisJCQkJICBBQ1BJX0JVVFRPTl9GSUxFX0lORk8pKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX2J1dHRvbl9pbmZvX2ZvcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtMjIyLDExICsyMTksMTEgQEAKIAkvKiBzaG93IGxpZCBzdGF0ZSBbUl0gKi8KIAlpZiAoYnV0dG9uLT50eXBlID09IEFDUElfQlVUVE9OX1RZUEVfTElEKSB7CiAJCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fRklMRV9TVEFURSwKLQkJCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkJICBTX0lSVUdPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJCWlmICghZW50cnkpCiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCi0JCQkJQUNQSV9CVVRUT05fRklMRV9JTkZPKSk7CisJCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkJICBBQ1BJX0JVVFRPTl9GSUxFX0lORk8pKTsKIAkJZWxzZSB7CiAJCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfYnV0dG9uX3N0YXRlX2ZvcHM7CiAJCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKQEAgLTIzNywxMiArMjM0LDkgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9idXR0b25fcmVtb3ZlX2ZzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9idXR0b25fcmVtb3ZlX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBhY3BpX2J1dHRvbgkqYnV0dG9uID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbiA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9yZW1vdmVfZnMiKTsKIApAQCAtMjUwLDMwICsyNDQsMjUgQEAKIAlpZiAoYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJaWYgKGJ1dHRvbi0+dHlwZSA9PSBBQ1BJX0JVVFRPTl9UWVBFX0xJRCkKIAkJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfQlVUVE9OX0ZJTEVfU1RBVEUsCi0JCQkJCSAgICAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fRklMRV9JTkZPLAotCQkJCSAgICAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCiAJCXJlbW92ZV9wcm9jX2VudHJ5KGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJCSAgICAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSktPnBhcmVudCk7CisJCQkJICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKS0+cGFyZW50KTsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBOVUxMOwogCX0KIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZAotYWNwaV9idXR0b25fbm90aWZ5ICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCXUzMgkJCWV2ZW50LAotCXZvaWQJCQkqZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfYnV0dG9uX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9idXR0b24JKmJ1dHRvbiA9IChzdHJ1Y3QgYWNwaV9idXR0b24gKikgZGF0YTsKKwlzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbiA9IChzdHJ1Y3QgYWNwaV9idXR0b24gKilkYXRhOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25fbm90aWZ5Iik7CiAKQEAgLTI4MiwyNCArMjcxLDIyIEBACiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBBQ1BJX0JVVFRPTl9OT1RJRllfU1RBVFVTOgotCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChidXR0b24tPmRldmljZSwgZXZlbnQsICsrYnV0dG9uLT5wdXNoZWQpOworCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChidXR0b24tPmRldmljZSwgZXZlbnQsCisJCQkJCSsrYnV0dG9uLT5wdXNoZWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOworCQkJCSAgIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2J1dHRvbl9ub3RpZnlfZml4ZWQgKAotCXZvaWQJCQkqZGF0YSkKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX2J1dHRvbl9ub3RpZnlfZml4ZWQodm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9idXR0b24JKmJ1dHRvbiA9IChzdHJ1Y3QgYWNwaV9idXR0b24gKikgZGF0YTsKLQkKKwlzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbiA9IChzdHJ1Y3QgYWNwaV9idXR0b24gKilkYXRhOworCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25fbm90aWZ5X2ZpeGVkIik7CiAKIAlpZiAoIWJ1dHRvbikKQEAgLTMxMCwxNCArMjk3LDExIEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2J1dHRvbl9hZGQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2J1dHRvbl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfYnV0dG9uCSpidXR0b24gPSBOVUxMOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX2FkZCIpOwogCkBAIC0zMzksNDIgKzMyMywzNCBAQAogCSAqLwogCWlmICghc3RyY21wKGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpLCBBQ1BJX0JVVFRPTl9ISURfUE9XRVIpKSB7CiAJCWJ1dHRvbi0+dHlwZSA9IEFDUElfQlVUVE9OX1RZUEVfUE9XRVI7Ci0JCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksCi0JCQlBQ1BJX0JVVFRPTl9ERVZJQ0VfTkFNRV9QT1dFUik7Ci0JCXNwcmludGYoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgIiVzLyVzIiwgCisJCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksIEFDUElfQlVUVE9OX0RFVklDRV9OQU1FX1BPV0VSKTsKKwkJc3ByaW50ZihhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCAiJXMvJXMiLAogCQkJQUNQSV9CVVRUT05fQ0xBU1MsIEFDUElfQlVUVE9OX1NVQkNMQVNTX1BPV0VSKTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNtcChhY3BpX2RldmljZV9oaWQoZGV2aWNlKSwgQUNQSV9CVVRUT05fSElEX1BPV0VSRikpIHsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYWNwaV9kZXZpY2VfaGlkKGRldmljZSksIEFDUElfQlVUVE9OX0hJRF9QT1dFUkYpKSB7CiAJCWJ1dHRvbi0+dHlwZSA9IEFDUElfQlVUVE9OX1RZUEVfUE9XRVJGOwogCQlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLAotCQkJQUNQSV9CVVRUT05fREVWSUNFX05BTUVfUE9XRVJGKTsKLQkJc3ByaW50ZihhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCAiJXMvJXMiLCAKKwkJICAgICAgIEFDUElfQlVUVE9OX0RFVklDRV9OQU1FX1BPV0VSRik7CisJCXNwcmludGYoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgIiVzLyVzIiwKIAkJCUFDUElfQlVUVE9OX0NMQVNTLCBBQ1BJX0JVVFRPTl9TVUJDTEFTU19QT1dFUik7Ci0JfQotCWVsc2UgaWYgKCFzdHJjbXAoYWNwaV9kZXZpY2VfaGlkKGRldmljZSksIEFDUElfQlVUVE9OX0hJRF9TTEVFUCkpIHsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYWNwaV9kZXZpY2VfaGlkKGRldmljZSksIEFDUElfQlVUVE9OX0hJRF9TTEVFUCkpIHsKIAkJYnV0dG9uLT50eXBlID0gQUNQSV9CVVRUT05fVFlQRV9TTEVFUDsKLQkJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwKLQkJCUFDUElfQlVUVE9OX0RFVklDRV9OQU1FX1NMRUVQKTsKLQkJc3ByaW50ZihhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCAiJXMvJXMiLCAKKwkJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9CVVRUT05fREVWSUNFX05BTUVfU0xFRVApOworCQlzcHJpbnRmKGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICIlcy8lcyIsCiAJCQlBQ1BJX0JVVFRPTl9DTEFTUywgQUNQSV9CVVRUT05fU1VCQ0xBU1NfU0xFRVApOwotCX0KLQllbHNlIGlmICghc3RyY21wKGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpLCBBQ1BJX0JVVFRPTl9ISURfU0xFRVBGKSkgeworCX0gZWxzZSBpZiAoIXN0cmNtcChhY3BpX2RldmljZV9oaWQoZGV2aWNlKSwgQUNQSV9CVVRUT05fSElEX1NMRUVQRikpIHsKIAkJYnV0dG9uLT50eXBlID0gQUNQSV9CVVRUT05fVFlQRV9TTEVFUEY7CiAJCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksCi0JCQlBQ1BJX0JVVFRPTl9ERVZJQ0VfTkFNRV9TTEVFUEYpOwotCQlzcHJpbnRmKGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICIlcy8lcyIsIAorCQkgICAgICAgQUNQSV9CVVRUT05fREVWSUNFX05BTUVfU0xFRVBGKTsKKwkJc3ByaW50ZihhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCAiJXMvJXMiLAogCQkJQUNQSV9CVVRUT05fQ0xBU1MsIEFDUElfQlVUVE9OX1NVQkNMQVNTX1NMRUVQKTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNtcChhY3BpX2RldmljZV9oaWQoZGV2aWNlKSwgQUNQSV9CVVRUT05fSElEX0xJRCkpIHsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYWNwaV9kZXZpY2VfaGlkKGRldmljZSksIEFDUElfQlVUVE9OX0hJRF9MSUQpKSB7CiAJCWJ1dHRvbi0+dHlwZSA9IEFDUElfQlVUVE9OX1RZUEVfTElEOwotCQlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLAotCQkJQUNQSV9CVVRUT05fREVWSUNFX05BTUVfTElEKTsKLQkJc3ByaW50ZihhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCAiJXMvJXMiLCAKKwkJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9CVVRUT05fREVWSUNFX05BTUVfTElEKTsKKwkJc3ByaW50ZihhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCAiJXMvJXMiLAogCQkJQUNQSV9CVVRUT05fQ0xBU1MsIEFDUElfQlVUVE9OX1NVQkNMQVNTX0xJRCk7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJVbnN1cHBvcnRlZCBoaWQgWyVzXVxuIiwKLQkJCWFjcGlfZGV2aWNlX2hpZChkZXZpY2UpKSk7CisJCQkJICBhY3BpX2RldmljZV9oaWQoZGV2aWNlKSkpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0zODUsNDYgKzM2MSw0NiBAQAogCiAJc3dpdGNoIChidXR0b24tPnR5cGUpIHsKIAljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVJGOgotCQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlciAoCi0JCQlBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTiwKLQkJCWFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCwKLQkJCWJ1dHRvbik7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTiwKKwkJCQkJCSAgICAgYWNwaV9idXR0b25fbm90aWZ5X2ZpeGVkLAorCQkJCQkJICAgICBidXR0b24pOwogCQlicmVhazsKIAljYXNlIEFDUElfQlVUVE9OX1RZUEVfU0xFRVBGOgotCQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlciAoCi0JCQlBQ1BJX0VWRU5UX1NMRUVQX0JVVFRPTiwKLQkJCWFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCwKLQkJCWJ1dHRvbik7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX1NMRUVQX0JVVFRPTiwKKwkJCQkJCSAgICAgYWNwaV9idXR0b25fbm90aWZ5X2ZpeGVkLAorCQkJCQkJICAgICBidXR0b24pOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIgKAotCQkJYnV0dG9uLT5oYW5kbGUsCi0JCQlBQ1BJX0RFVklDRV9OT1RJRlksCi0JCQlhY3BpX2J1dHRvbl9ub3RpZnksCi0JCQlidXR0b24pOworCQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoYnV0dG9uLT5oYW5kbGUsCisJCQkJCQkgICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJCSAgICAgYWNwaV9idXR0b25fbm90aWZ5LAorCQkJCQkJICAgICBidXR0b24pOwogCQlicmVhazsKIAl9CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciBpbnN0YWxsaW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CisJCQkJICAiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIikpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CiAKIAlpZiAoZGV2aWNlLT53YWtldXAuZmxhZ3MudmFsaWQpIHsKIAkJLyogQnV0dG9uJ3MgR1BFIGlzIHJ1bi13YWtlIEdQRSAqLwotCQlhY3BpX3NldF9ncGVfdHlwZShkZXZpY2UtPndha2V1cC5ncGVfZGV2aWNlLCAKLQkJCWRldmljZS0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfR1BFX1RZUEVfV0FLRV9SVU4pOwotCQlhY3BpX2VuYWJsZV9ncGUoZGV2aWNlLT53YWtldXAuZ3BlX2RldmljZSwgCi0JCQlkZXZpY2UtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX05PVF9JU1IpOworCQlhY3BpX3NldF9ncGVfdHlwZShkZXZpY2UtPndha2V1cC5ncGVfZGV2aWNlLAorCQkJCSAgZGV2aWNlLT53YWtldXAuZ3BlX251bWJlciwKKwkJCQkgIEFDUElfR1BFX1RZUEVfV0FLRV9SVU4pOworCQlhY3BpX2VuYWJsZV9ncGUoZGV2aWNlLT53YWtldXAuZ3BlX2RldmljZSwKKwkJCQlkZXZpY2UtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX05PVF9JU1IpOwogCQlkZXZpY2UtPndha2V1cC5zdGF0ZS5lbmFibGVkID0gMTsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXVxuIiwgCi0JCWFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpOworCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdXG4iLAorCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKTsKIAotZW5kOgorICAgICAgZW5kOgogCWlmIChyZXN1bHQpIHsKIAkJYWNwaV9idXR0b25fcmVtb3ZlX2ZzKGRldmljZSk7CiAJCWtmcmVlKGJ1dHRvbik7CkBAIC00MzMsMTIgKzQwOSwxMCBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfYnV0dG9uX3JlbW92ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQorc3RhdGljIGludCBhY3BpX2J1dHRvbl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSAwOwotCXN0cnVjdCBhY3BpX2J1dHRvbgkqYnV0dG9uID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX3JlbW92ZSIpOwogCkBAIC00NTAsMzUgKzQyNCwzNiBAQAogCS8qIFVucmVnaXN0ZXIgZm9yIGRldmljZSBub3RpZmljYXRpb25zLiAqLwogCXN3aXRjaCAoYnV0dG9uLT50eXBlKSB7CiAJY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1BPV0VSRjoKLQkJc3RhdHVzID0gYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlcigKLQkJCUFDUElfRVZFTlRfUE9XRVJfQlVUVE9OLCBhY3BpX2J1dHRvbl9ub3RpZnlfZml4ZWQpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTiwKKwkJCQkJCSAgICBhY3BpX2J1dHRvbl9ub3RpZnlfZml4ZWQpOwogCQlicmVhazsKIAljYXNlIEFDUElfQlVUVE9OX1RZUEVfU0xFRVBGOgotCQlzdGF0dXMgPSBhY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyKAotCQkJQUNQSV9FVkVOVF9TTEVFUF9CVVRUT04sIGFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyKEFDUElfRVZFTlRfU0xFRVBfQlVUVE9OLAorCQkJCQkJICAgIGFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGJ1dHRvbi0+aGFuZGxlLAotCQkJQUNQSV9ERVZJQ0VfTk9USUZZLCBhY3BpX2J1dHRvbl9ub3RpZnkpOworCQkJCQkJICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJCSAgICBhY3BpX2J1dHRvbl9ub3RpZnkpOwogCQlicmVhazsKIAl9CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgcmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKKwkJCQkgICJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOwogCi0JYWNwaV9idXR0b25fcmVtb3ZlX2ZzKGRldmljZSk7CQorCWFjcGlfYnV0dG9uX3JlbW92ZV9mcyhkZXZpY2UpOwogCiAJa2ZyZWUoYnV0dG9uKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV9idXR0b25faW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfYnV0dG9uX2luaXQodm9pZCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25faW5pdCIpOwogCkBAIC00OTUsMTUgKzQ3MCwxMyBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWFjcGlfYnV0dG9uX2V4aXQgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNwaV9idXR0b25fZXhpdCh2b2lkKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX2V4aXQiKTsKIAogCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2J1dHRvbl9kcml2ZXIpOwogCi0JaWYgKGFjcGlfcG93ZXJfZGlyKSAKKwlpZiAoYWNwaV9wb3dlcl9kaXIpCiAJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfQlVUVE9OX1NVQkNMQVNTX1BPV0VSLCBhY3BpX2J1dHRvbl9kaXIpOwogCWlmIChhY3BpX3NsZWVwX2RpcikKIAkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fU1VCQ0xBU1NfU0xFRVAsIGFjcGlfYnV0dG9uX2Rpcik7CkBAIC01MTQsNiArNDg3LDUgQEAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiBtb2R1bGVfaW5pdChhY3BpX2J1dHRvbl9pbml0KTsKIG1vZHVsZV9leGl0KGFjcGlfYnV0dG9uX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jIGIvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jCmluZGV4IDk3MDEzZGQuLjEwZGQ2OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMKQEAgLTQ0LDkgKzQ0LDkgQEAKIAogI2RlZmluZSBBQ1BJX0NPTlRBSU5FUl9DT01QT05FTlQJMHgwMTAwMDAwMAogI2RlZmluZSBfQ09NUE9ORU5UCQkJQUNQSV9DT05UQUlORVJfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkJKCJhY3BpX2NvbnRhaW5lciIpCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX2NvbnRhaW5lciIpCiAKLU1PRFVMRV9BVVRIT1IoIkFuaWwgUyBLZXNoYXZhbXVydGh5Iik7CisgICAgTU9EVUxFX0FVVEhPUigiQW5pbCBTIEtlc2hhdmFtdXJ0aHkiKTsKIE1PRFVMRV9ERVNDUklQVElPTihBQ1BJX0NPTlRBSU5FUl9EUklWRVJfTkFNRSk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKQEAgLTU2LDQxICs1NiwzOCBAQAogc3RhdGljIGludCBhY3BpX2NvbnRhaW5lcl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2NvbnRhaW5lcl9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJQUNQSV9DT05UQUlORVJfRFJJVkVSX05BTUUsCi0JLmNsYXNzID0JQUNQSV9DT05UQUlORVJfQ0xBU1MsCi0JLmlkcyA9CQkiQUNQSTAwMDQsUE5QMEEwNSxQTlAwQTA2IiwKLQkub3BzID0JCXsKLQkJCQkuYWRkID0JCWFjcGlfY29udGFpbmVyX2FkZCwKLQkJCQkucmVtb3ZlID0JYWNwaV9jb250YWluZXJfcmVtb3ZlLAotCQkJfSwKKwkubmFtZSA9IEFDUElfQ09OVEFJTkVSX0RSSVZFUl9OQU1FLAorCS5jbGFzcyA9IEFDUElfQ09OVEFJTkVSX0NMQVNTLAorCS5pZHMgPSAiQUNQSTAwMDQsUE5QMEEwNSxQTlAwQTA2IiwKKwkub3BzID0geworCQkuYWRkID0gYWNwaV9jb250YWluZXJfYWRkLAorCQkucmVtb3ZlID0gYWNwaV9jb250YWluZXJfcmVtb3ZlLAorCQl9LAogfTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGludAotaXNfZGV2aWNlX3ByZXNlbnQoYWNwaV9oYW5kbGUgaGFuZGxlKQorc3RhdGljIGludCBpc19kZXZpY2VfcHJlc2VudChhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0JYWNwaV9oYW5kbGUJCXRlbXA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1czsKLQl1bnNpZ25lZCBsb25nCXN0YTsKKwlhY3BpX2hhbmRsZSB0ZW1wOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHN0YTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImlzX2RldmljZV9wcmVzZW50Iik7CiAKIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX1NUQSIsICZ0ZW1wKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybl9WQUxVRSgxKTsgLyogX1NUQSBub3QgZm91bmQsIGFzc211ZSBkZXZpY2UgcHJlc2VudCAqLworCQlyZXR1cm5fVkFMVUUoMSk7CS8qIF9TVEEgbm90IGZvdW5kLCBhc3NtdWUgZGV2aWNlIHByZXNlbnQgKi8KIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfU1RBIiwgTlVMTCwgJnN0YSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlyZXR1cm5fVkFMVUUoMCk7IC8qIEZpcm13YXJlIGVycm9yICovCisJCXJldHVybl9WQUxVRSgwKTsJLyogRmlybXdhcmUgZXJyb3IgKi8KIAogCXJldHVybl9WQUxVRSgoc3RhICYgQUNQSV9TVEFfUFJFU0VOVCkgPT0gQUNQSV9TVEFfUFJFU0VOVCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotYWNwaV9jb250YWluZXJfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2NvbnRhaW5lcl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IGFjcGlfY29udGFpbmVyICpjb250YWluZXI7CiAKQEAgLTEwMiwyOCArOTksMjYgQEAKIAl9CiAKIAljb250YWluZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9jb250YWluZXIpLCBHRlBfS0VSTkVMKTsKLQlpZighY29udGFpbmVyKQorCWlmICghY29udGFpbmVyKQogCQlyZXR1cm5fVkFMVUUoLUVOT01FTSk7Ci0JCisKIAltZW1zZXQoY29udGFpbmVyLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfY29udGFpbmVyKSk7CiAJY29udGFpbmVyLT5oYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX0NPTlRBSU5FUl9ERVZJQ0VfTkFNRSk7CiAJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksIEFDUElfQ09OVEFJTkVSX0NMQVNTKTsKIAlhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkgPSBjb250YWluZXI7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEZXZpY2UgPCVzPiBiaWQgPCVzPlxuIiwJXAotCQlhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKSk7Ci0KKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEZXZpY2UgPCVzPiBiaWQgPCVzPlxuIiwKKwkJCSAgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSkpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX2NvbnRhaW5lcl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQorc3RhdGljIGludCBhY3BpX2NvbnRhaW5lcl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9jb250YWluZXIJKnBjID0gTlVMTDsKLQlwYyA9IChzdHJ1Y3QgYWNwaV9jb250YWluZXIqKSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfY29udGFpbmVyICpwYyA9IE5VTEw7CisJcGMgPSAoc3RydWN0IGFjcGlfY29udGFpbmVyICopYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCiAJaWYgKHBjKQogCQlrZnJlZShwYyk7CkBAIC0xMzEsOSArMTI2LDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0KLXN0YXRpYyBpbnQKLWNvbnRhaW5lcl9kZXZpY2VfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqKmRldmljZSwgYWNwaV9oYW5kbGUgaGFuZGxlKQorc3RhdGljIGludCBjb250YWluZXJfZGV2aWNlX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKipkZXZpY2UsIGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKIAlhY3BpX2hhbmRsZSBwaGFuZGxlOwogCXN0cnVjdCBhY3BpX2RldmljZSAqcGRldjsKQEAgLTE1OCwxMCArMTUxLDkgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotc3RhdGljIHZvaWQKLWNvbnRhaW5lcl9ub3RpZnlfY2IoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSwgdm9pZCAqY29udGV4dCkKK3N0YXRpYyB2b2lkIGNvbnRhaW5lcl9ub3RpZnlfY2IoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSwgdm9pZCAqY29udGV4dCkKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJCSpkZXZpY2UgPSBOVUxMOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAlpbnQgcmVzdWx0OwogCWludCBwcmVzZW50OwogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTE2OSwxNCArMTYxLDE0IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiY29udGFpbmVyX25vdGlmeV9jYiIpOwogCiAJcHJlc2VudCA9IGlzX2RldmljZV9wcmVzZW50KGhhbmRsZSk7Ci0JCisKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFDUElfTk9USUZZX0JVU19DSEVDSzoKIAkJLyogRmFsbCB0aHJvdWdoICovCiAJY2FzZSBBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0s6CiAJCXByaW50aygiQ29udGFpbmVyIGRyaXZlciByZWNlaXZlZCAlcyBldmVudFxuIiwKLQkJCSh0eXBlID09IEFDUElfTk9USUZZX0JVU19DSEVDSyk/Ci0JCQkiQUNQSV9OT1RJRllfQlVTX0NIRUNLIjoiQUNQSV9OT1RJRllfREVWSUNFX0NIRUNLIik7CisJCSAgICAgICAodHlwZSA9PSBBQ1BJX05PVElGWV9CVVNfQ0hFQ0spID8KKwkJICAgICAgICJBQ1BJX05PVElGWV9CVVNfQ0hFQ0siIDogIkFDUElfTk9USUZZX0RFVklDRV9DSEVDSyIpOwogCQlzdGF0dXMgPSBhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmRldmljZSk7CiAJCWlmIChwcmVzZW50KSB7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIWRldmljZSkgewpAQCAtMjA3LDE1ICsxOTksMTMgQEAKIAogc3RhdGljIGFjcGlfc3RhdHVzCiBjb250YWluZXJfd2Fsa19uYW1lc3BhY2VfY2IoYWNwaV9oYW5kbGUgaGFuZGxlLAotCXUzMiBsdmwsCi0Jdm9pZCAqY29udGV4dCwKLQl2b2lkICoqcnYpCisJCQkgICAgdTMyIGx2bCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQogewotCWNoYXIgCQkJCSpoaWQgPSBOVUxMOwotCXN0cnVjdCBhY3BpX2J1ZmZlciAJCWJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gCSppbmZvOwotCWFjcGlfc3RhdHVzIAkJCXN0YXR1czsKLQlpbnQgCQkJCSphY3Rpb24gPSBjb250ZXh0OworCWNoYXIgKmhpZCA9IE5VTEw7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyAqaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50ICphY3Rpb24gPSBjb250ZXh0OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiY29udGFpbmVyX3dhbGtfbmFtZXNwYWNlX2NiIik7CiAKQEAgLTIzMyw2NiArMjIzLDYwIEBACiAJfQogCiAJaWYgKHN0cmNtcChoaWQsICJBQ1BJMDAwNCIpICYmIHN0cmNtcChoaWQsICJQTlAwQTA1IikgJiYKLQkJCXN0cmNtcChoaWQsICJQTlAwQTA2IikpIHsKKwkgICAgc3RyY21wKGhpZCwgIlBOUDBBMDYiKSkgewogCQlnb3RvIGVuZDsKIAl9CiAKLQlzd2l0Y2goKmFjdGlvbikgeworCXN3aXRjaCAoKmFjdGlvbikgewogCWNhc2UgSU5TVEFMTF9OT1RJRllfSEFORExFUjoKIAkJYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGhhbmRsZSwKLQkJCUFDUElfU1lTVEVNX05PVElGWSwKLQkJCWNvbnRhaW5lcl9ub3RpZnlfY2IsCi0JCQlOVUxMKTsKKwkJCQkJICAgIEFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJICAgIGNvbnRhaW5lcl9ub3RpZnlfY2IsIE5VTEwpOwogCQlicmVhazsKIAljYXNlIFVOSU5TVEFMTF9OT1RJRllfSEFORExFUjoKIAkJYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoaGFuZGxlLAotCQkJQUNQSV9TWVNURU1fTk9USUZZLAotCQkJY29udGFpbmVyX25vdGlmeV9jYik7CisJCQkJCSAgIEFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJICAgY29udGFpbmVyX25vdGlmeV9jYik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIAotZW5kOgorICAgICAgZW5kOgogCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX2NvbnRhaW5lcl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2NvbnRhaW5lcl9pbml0KHZvaWQpCiB7Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaW50CWFjdGlvbiA9IElOU1RBTExfTk9USUZZX0hBTkRMRVI7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IGFjdGlvbiA9IElOU1RBTExfTk9USUZZX0hBTkRMRVI7CiAKIAlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfY29udGFpbmVyX2RyaXZlcik7CiAJaWYgKHJlc3VsdCA8IDApIHsKLQkJcmV0dXJuKHJlc3VsdCk7CisJCXJldHVybiAocmVzdWx0KTsKIAl9CiAKIAkvKiByZWdpc3RlciBub3RpZnkgaGFuZGxlciB0byBldmVyeSBjb250YWluZXIgZGV2aWNlICovCiAJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLAotCQkJCSAgICAgQUNQSV9ST09UX09CSkVDVCwKLQkJCQkgICAgIEFDUElfVUlOVDMyX01BWCwKLQkJCQkgICAgIGNvbnRhaW5lcl93YWxrX25hbWVzcGFjZV9jYiwKLQkJCQkgICAgICZhY3Rpb24sIE5VTEwpOworCQkJICAgIEFDUElfUk9PVF9PQkpFQ1QsCisJCQkgICAgQUNQSV9VSU5UMzJfTUFYLAorCQkJICAgIGNvbnRhaW5lcl93YWxrX25hbWVzcGFjZV9jYiwgJmFjdGlvbiwgTlVMTCk7CiAKLQlyZXR1cm4oMCk7CisJcmV0dXJuICgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0Ci1hY3BpX2NvbnRhaW5lcl9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNwaV9jb250YWluZXJfZXhpdCh2b2lkKQogewotCWludAkJCWFjdGlvbiA9IFVOSU5TVEFMTF9OT1RJRllfSEFORExFUjsKKwlpbnQgYWN0aW9uID0gVU5JTlNUQUxMX05PVElGWV9IQU5ETEVSOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9jb250YWluZXJfZXhpdCIpOwogCiAJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLAotCQkJCSAgICAgQUNQSV9ST09UX09CSkVDVCwKLQkJCQkgICAgIEFDUElfVUlOVDMyX01BWCwKLQkJCQkgICAgIGNvbnRhaW5lcl93YWxrX25hbWVzcGFjZV9jYiwKLQkJCQkgICAgICZhY3Rpb24sIE5VTEwpOworCQkJICAgIEFDUElfUk9PVF9PQkpFQ1QsCisJCQkgICAgQUNQSV9VSU5UMzJfTUFYLAorCQkJICAgIGNvbnRhaW5lcl93YWxrX25hbWVzcGFjZV9jYiwgJmFjdGlvbiwgTlVMTCk7CiAKIAlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV9jb250YWluZXJfZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2RlYnVnLmMgYi9kcml2ZXJzL2FjcGkvZGVidWcuYwppbmRleCAyYzBkYWM1Li4yNjMzMjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGVidWcuYworKysgYi9kcml2ZXJzL2FjcGkvZGVidWcuYwpAQCAtMTIsMTcgKzEyLDE0IEBACiAjaW5jbHVkZSA8YWNwaS9hY2dsb2JhbC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfU1lTVEVNX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJkZWJ1ZyIpCi0KK0FDUElfTU9EVUxFX05BTUUoImRlYnVnIikKICNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9ERUJVR19MQVlFUgkiZGVidWdfbGF5ZXIiCiAjZGVmaW5lIEFDUElfU1lTVEVNX0ZJTEVfREVCVUdfTEVWRUwJImRlYnVnX2xldmVsIgotCiAjaWZkZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAogI3VuZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKICNlbmRpZgotCiAjZGVmaW5lIE1PRFVMRV9QQVJBTV9QUkVGSVgKLW1vZHVsZV9wYXJhbShhY3BpX2RiZ19sYXllciwgdWludCwgMDQwMCk7CisgICAgbW9kdWxlX3BhcmFtKGFjcGlfZGJnX2xheWVyLCB1aW50LCAwNDAwKTsKIG1vZHVsZV9wYXJhbShhY3BpX2RiZ19sZXZlbCwgdWludCwgMDQwMCk7CiAKIHN0cnVjdCBhY3BpX2RsYXllciB7CkBAIC0zNSw4ICszMiw3IEBACiB9OwogI2RlZmluZSBBQ1BJX0RFQlVHX0lOSVQodikJeyAubmFtZSA9ICN2LCAudmFsdWUgPSB2IH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RsYXllciBhY3BpX2RlYnVnX2xheWVyc1tdID0KLXsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kbGF5ZXIgYWNwaV9kZWJ1Z19sYXllcnNbXSA9IHsKIAlBQ1BJX0RFQlVHX0lOSVQoQUNQSV9VVElMSVRJRVMpLAogCUFDUElfREVCVUdfSU5JVChBQ1BJX0hBUkRXQVJFKSwKIAlBQ1BJX0RFQlVHX0lOSVQoQUNQSV9FVkVOVFMpLApAQCAtNTMsOCArNDksNyBAQAogCUFDUElfREVCVUdfSU5JVChBQ1BJX1RPT0xTKSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kbGV2ZWwgYWNwaV9kZWJ1Z19sZXZlbHNbXSA9Ci17CitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGxldmVsIGFjcGlfZGVidWdfbGV2ZWxzW10gPSB7CiAJQUNQSV9ERUJVR19JTklUKEFDUElfTFZfRVJST1IpLAogCUFDUElfREVCVUdfSU5JVChBQ1BJX0xWX1dBUk4pLAogCUFDUElfREVCVUdfSU5JVChBQ1BJX0xWX0lOSVQpLApAQCAtODgsODEgKzgzLDc3IEBACiAJQUNQSV9ERUJVR19JTklUKEFDUElfTFZfQU1MX0RJU0FTU0VNQkxFKSwKIAlBQ1BJX0RFQlVHX0lOSVQoQUNQSV9MVl9WRVJCT1NFX0lORk8pLAogCUFDUElfREVCVUdfSU5JVChBQ1BJX0xWX0ZVTExfVEFCTEVTKSwKLQlBQ1BJX0RFQlVHX0lOSVQoQUNQSV9MVl9FVkVOVFMpLCAgICAgICAgICAgICAKKwlBQ1BJX0RFQlVHX0lOSVQoQUNQSV9MVl9FVkVOVFMpLAogfTsKIAogc3RhdGljIGludAotYWNwaV9zeXN0ZW1fcmVhZF9kZWJ1ZyAoCi0JY2hhcgkJCSpwYWdlLAotCWNoYXIJCQkqKnN0YXJ0LAotCW9mZl90CQkJb2ZmLAotCWludCAJCQljb3VudCwKLQlpbnQgCQkJKmVvZiwKLQl2b2lkCQkJKmRhdGEpCithY3BpX3N5c3RlbV9yZWFkX2RlYnVnKGNoYXIgKnBhZ2UsCisJCSAgICAgICBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQljaGFyCQkJKnAgPSBwYWdlOwotCWludCAJCQlzaXplID0gMDsKLQl1bnNpZ25lZCBpbnQJCWk7CisJY2hhciAqcCA9IHBhZ2U7CisJaW50IHNpemUgPSAwOworCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKG9mZiAhPSAwKQogCQlnb3RvIGVuZDsKIAogCXAgKz0gc3ByaW50ZihwLCAiJS0yNXNcdEhleCAgICAgICAgU0VUXG4iLCAiRGVzY3JpcHRpb24iKTsKIAotCXN3aXRjaCAoKHVuc2lnbmVkIGxvbmcpIGRhdGEpIHsKKwlzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKWRhdGEpIHsKIAljYXNlIDA6CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFjcGlfZGVidWdfbGF5ZXJzKTsgaSsrKSB7CiAJCQlwICs9IHNwcmludGYocCwgIiUtMjVzXHQweCUwOGxYIFslY11cbiIsCi0JCQkJYWNwaV9kZWJ1Z19sYXllcnNbaV0ubmFtZSwKLQkJCQlhY3BpX2RlYnVnX2xheWVyc1tpXS52YWx1ZSwKLQkJCQkoYWNwaV9kYmdfbGF5ZXIgJiBhY3BpX2RlYnVnX2xheWVyc1tpXS52YWx1ZSkgPwotCQkJCScqJyA6ICcgJyk7CisJCQkJICAgICBhY3BpX2RlYnVnX2xheWVyc1tpXS5uYW1lLAorCQkJCSAgICAgYWNwaV9kZWJ1Z19sYXllcnNbaV0udmFsdWUsCisJCQkJICAgICAoYWNwaV9kYmdfbGF5ZXIgJiBhY3BpX2RlYnVnX2xheWVyc1tpXS4KKwkJCQkgICAgICB2YWx1ZSkgPyAnKicgOiAnICcpOwogCQl9CiAJCXAgKz0gc3ByaW50ZihwLCAiJS0yNXNcdDB4JTA4WCBbJWNdXG4iLCAiQUNQSV9BTExfRFJJVkVSUyIsCi0JCQlBQ1BJX0FMTF9EUklWRVJTLAotCQkJKGFjcGlfZGJnX2xheWVyICYgQUNQSV9BTExfRFJJVkVSUykgPT0gQUNQSV9BTExfRFJJVkVSUz8KLQkJCScqJyA6IChhY3BpX2RiZ19sYXllciAmIEFDUElfQUxMX0RSSVZFUlMpID09IDAgPwotCQkJJyAnIDogJy0nKTsKKwkJCSAgICAgQUNQSV9BTExfRFJJVkVSUywKKwkJCSAgICAgKGFjcGlfZGJnX2xheWVyICYgQUNQSV9BTExfRFJJVkVSUykgPT0KKwkJCSAgICAgQUNQSV9BTExfRFJJVkVSUyA/ICcqJyA6IChhY3BpX2RiZ19sYXllciAmCisJCQkJCQkgICAgICAgQUNQSV9BTExfRFJJVkVSUykgPT0KKwkJCSAgICAgMCA/ICcgJyA6ICctJyk7CiAJCXAgKz0gc3ByaW50ZihwLAotCQkJIi0tXG5kZWJ1Z19sYXllciA9IDB4JTA4WCAoKiA9IGVuYWJsZWQsIC0gPSBwYXJ0aWFsKVxuIiwKLQkJCWFjcGlfZGJnX2xheWVyKTsKKwkJCSAgICAgIi0tXG5kZWJ1Z19sYXllciA9IDB4JTA4WCAoKiA9IGVuYWJsZWQsIC0gPSBwYXJ0aWFsKVxuIiwKKwkJCSAgICAgYWNwaV9kYmdfbGF5ZXIpOwogCQlicmVhazsKIAljYXNlIDE6CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFjcGlfZGVidWdfbGV2ZWxzKTsgaSsrKSB7CiAJCQlwICs9IHNwcmludGYocCwgIiUtMjVzXHQweCUwOGxYIFslY11cbiIsCi0JCQkJYWNwaV9kZWJ1Z19sZXZlbHNbaV0ubmFtZSwKLQkJCQlhY3BpX2RlYnVnX2xldmVsc1tpXS52YWx1ZSwKLQkJCQkoYWNwaV9kYmdfbGV2ZWwgJiBhY3BpX2RlYnVnX2xldmVsc1tpXS52YWx1ZSkgPwotCQkJCScqJyA6ICcgJyk7CisJCQkJICAgICBhY3BpX2RlYnVnX2xldmVsc1tpXS5uYW1lLAorCQkJCSAgICAgYWNwaV9kZWJ1Z19sZXZlbHNbaV0udmFsdWUsCisJCQkJICAgICAoYWNwaV9kYmdfbGV2ZWwgJiBhY3BpX2RlYnVnX2xldmVsc1tpXS4KKwkJCQkgICAgICB2YWx1ZSkgPyAnKicgOiAnICcpOwogCQl9CiAJCXAgKz0gc3ByaW50ZihwLCAiLS1cbmRlYnVnX2xldmVsID0gMHglMDhYICgqID0gZW5hYmxlZClcbiIsCi0JCQkJYWNwaV9kYmdfbGV2ZWwpOworCQkJICAgICBhY3BpX2RiZ19sZXZlbCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXAgKz0gc3ByaW50ZihwLCAiSW52YWxpZCBkZWJ1ZyBvcHRpb25cbiIpOwogCQlicmVhazsKIAl9Ci0JCi1lbmQ6CisKKyAgICAgIGVuZDoKIAlzaXplID0gKHAgLSBwYWdlKTsKLQlpZiAoc2l6ZSA8PSBvZmYrY291bnQpICplb2YgPSAxOworCWlmIChzaXplIDw9IG9mZiArIGNvdW50KQorCQkqZW9mID0gMTsKIAkqc3RhcnQgPSBwYWdlICsgb2ZmOwogCXNpemUgLT0gb2ZmOwotCWlmIChzaXplPmNvdW50KSBzaXplID0gY291bnQ7Ci0JaWYgKHNpemU8MCkgc2l6ZSA9IDA7CisJaWYgKHNpemUgPiBjb3VudCkKKwkJc2l6ZSA9IGNvdW50OworCWlmIChzaXplIDwgMCkKKwkJc2l6ZSA9IDA7CiAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotCiBzdGF0aWMgaW50Ci1hY3BpX3N5c3RlbV93cml0ZV9kZWJ1ZyAoCi0Jc3RydWN0IGZpbGUgICAgICAgICAgICAgKmZpbGUsCi0gICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgIF9fdXNlciAqYnVmZmVyLAotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGNvdW50LAotICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK2FjcGlfc3lzdGVtX3dyaXRlX2RlYnVnKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewotCWNoYXIJCQlkZWJ1Z19zdHJpbmdbMTJdID0geydcMCd9OworCWNoYXIgZGVidWdfc3RyaW5nWzEyXSA9IHsgJ1wwJyB9OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zeXN0ZW1fd3JpdGVfZGVidWciKTsKIApAQCAtMTc0LDcgKzE2NSw3IEBACiAKIAlkZWJ1Z19zdHJpbmdbY291bnRdID0gJ1wwJzsKIAotCXN3aXRjaCAoKHVuc2lnbmVkIGxvbmcpIGRhdGEpIHsKKwlzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKWRhdGEpIHsKIAljYXNlIDA6CiAJCWFjcGlfZGJnX2xheWVyID0gc2ltcGxlX3N0cnRvdWwoZGVidWdfc3RyaW5nLCBOVUxMLCAwKTsKIAkJYnJlYWs7CkBAIC0xOTAsOSArMTgxLDkgQEAKIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9kZWJ1Z19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwogCWludCBlcnJvciA9IDA7Ci0JY2hhciAqIG5hbWU7CisJY2hhciAqbmFtZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZGVidWdfaW5pdCIpOwogCkBAIC0yMDEsOCArMTkyLDEwIEBACiAKIAkvKiAnZGVidWdfbGF5ZXInIFtSL1ddICovCiAJbmFtZSA9IEFDUElfU1lTVEVNX0ZJTEVfREVCVUdfTEFZRVI7Ci0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KG5hbWUsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCBhY3BpX3Jvb3RfZGlyLAotCQkJCSAgICAgICBhY3BpX3N5c3RlbV9yZWFkX2RlYnVnLCh2b2lkICopMCk7CisJZW50cnkgPQorCSAgICBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KG5hbWUsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCQkgICBhY3BpX3Jvb3RfZGlyLCBhY3BpX3N5c3RlbV9yZWFkX2RlYnVnLAorCQkJCSAgICh2b2lkICopMCk7CiAJaWYgKGVudHJ5KQogCQllbnRyeS0+d3JpdGVfcHJvYyA9IGFjcGlfc3lzdGVtX3dyaXRlX2RlYnVnOwogCWVsc2UKQEAgLTIxMCwxOSArMjAzLDIxIEBACiAKIAkvKiAnZGVidWdfbGV2ZWwnIFtSL1ddICovCiAJbmFtZSA9IEFDUElfU1lTVEVNX0ZJTEVfREVCVUdfTEVWRUw7Ci0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KG5hbWUsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCBhY3BpX3Jvb3RfZGlyLAotCQkJCSAgICAgICBhY3BpX3N5c3RlbV9yZWFkX2RlYnVnLCAodm9pZCAqKTEpOwotCWlmIChlbnRyeSkgCisJZW50cnkgPQorCSAgICBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KG5hbWUsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCQkgICBhY3BpX3Jvb3RfZGlyLCBhY3BpX3N5c3RlbV9yZWFkX2RlYnVnLAorCQkJCSAgICh2b2lkICopMSk7CisJaWYgKGVudHJ5KQogCQllbnRyeS0+d3JpdGVfcHJvYyA9IGFjcGlfc3lzdGVtX3dyaXRlX2RlYnVnOwogCWVsc2UKIAkJZ290byBFcnJvcjsKIAotIERvbmU6CisgICAgICBEb25lOgogCXJldHVybl9WQUxVRShlcnJvcik7CiAKLSBFcnJvcjoKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAKLQkJCSAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIHByb2MgZnMgZW50cnlcbiIsIG5hbWUpKTsKKyAgICAgIEVycm9yOgorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgcHJvYyBmcyBlbnRyeVxuIiwgbmFtZSkpOwogCiAJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9TWVNURU1fRklMRV9ERUJVR19MRVZFTCwgYWNwaV9yb290X2Rpcik7CiAJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9TWVNURU1fRklMRV9ERUJVR19MQVlFUiwgYWNwaV9yb290X2Rpcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2ZpZWxkLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2ZpZWxkLmMKaW5kZXggODQxOTM5OC4uMjAyMmFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNmaWVsZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYwpAQCAtNDEsNyArNDEsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KQEAgLTQ5LDE4ICs0OCwxNCBAQAogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNmaWVsZCIpCitBQ1BJX01PRFVMRV9OQU1FKCJkc2ZpZWxkIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X2ZpZWxkX25hbWVzICgKLQlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAgICppbmZvLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnKTsKLQorYWNwaV9kc19nZXRfZmllbGRfbmFtZXMoc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODIsNDEgKzc3LDM2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19jcmVhdGVfYnVmZmVyX2ZpZWxkICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19jcmVhdGVfYnVmZmVyX2ZpZWxkKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCSAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNlY29uZF9kZXNjID0gTlVMTDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNlY29uZF9kZXNjID0gTlVMTDsKKwl1MzIgZmxhZ3M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19jcmVhdGVfYnVmZmVyX2ZpZWxkIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19jcmVhdGVfYnVmZmVyX2ZpZWxkIik7CiAKIAkvKiBHZXQgdGhlIG5hbWVfc3RyaW5nIGFyZ3VtZW50ICovCiAKIAlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9DUkVBVEVfRklFTERfT1ApIHsKLQkJYXJnID0gYWNwaV9wc19nZXRfYXJnIChvcCwgMyk7Ci0JfQotCWVsc2UgeworCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcob3AsIDMpOworCX0gZWxzZSB7CiAJCS8qIENyZWF0ZSBCaXQvQnl0ZS9Xb3JkL0R3b3JkIGZpZWxkICovCiAKLQkJYXJnID0gYWNwaV9wc19nZXRfYXJnIChvcCwgMik7CisJCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMik7CiAJfQogCiAJaWYgKCFhcmcpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTk9fT1BFUkFORCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7CiAJfQogCiAJaWYgKHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUpIHsKIAkJbm9kZSA9IHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGU7CiAJCXN0YXR1cyA9IEFFX09LOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBEdXJpbmcgdGhlIGxvYWQgcGhhc2UsIHdlIHdhbnQgdG8gZW50ZXIgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGludG8KIAkJICogdGhlIG5hbWVzcGFjZS4gIER1cmluZyB0aGUgZXhlY3V0ZSBwaGFzZSAod2hlbiB3ZSBldmFsdWF0ZSB0aGUgc2l6ZQpAQCAtMTI0LDIxICsxMTQsMjIgQEAKIAkJICovCiAJCWlmICh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfRVhFQ1VURSkgewogCQkJZmxhZ3MgPSBBQ1BJX05TX05PX1VQU0VBUkNIIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEU7Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlmbGFncyA9IEFDUElfTlNfTk9fVVBTRUFSQ0ggfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSB8Ci0JCQkJCUFDUElfTlNfRVJST1JfSUZfRk9VTkQ7CisJCQkgICAgQUNQSV9OU19FUlJPUl9JRl9GT1VORDsKIAkJfQogCiAJCS8qCiAJCSAqIEVudGVyIHRoZSBuYW1lX3N0cmluZyBpbnRvIHRoZSBuYW1lc3BhY2UKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsCi0JCQkJIEFDUElfVFlQRV9BTlksIEFDUElfSU1PREVfTE9BRF9QQVNTMSwKLQkJCQkgZmxhZ3MsIHdhbGtfc3RhdGUsICYobm9kZSkpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9OU0VSUk9SIChhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIHN0YXR1cyk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAorCQkJCSAgIGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywgQUNQSV9UWVBFX0FOWSwKKwkJCQkgICBBQ1BJX0lNT0RFX0xPQURfUEFTUzEsIGZsYWdzLCB3YWxrX3N0YXRlLAorCQkJCSAgICYobm9kZSkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX05TRVJST1IoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBzdGF0dXMpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKQEAgLTE1Myw5ICsxNDQsOSBAQAogCSAqIGFuZCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgZmllbGQgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGlzIHdhcyBhIGxvb2t1cAogCSAqIG9mIGFuIGV4aXN0aW5nIG5vZGUgYW5kIHdlIGRvbid0IHdhbnQgdG8gY3JlYXRlIHRoZSBmaWVsZCBvYmplY3QgYWdhaW4uCiAJICovCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCWlmIChvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKgpAQCAtMTY1LDcgKzE1Niw3IEBACiAKIAkvKiBDcmVhdGUgdGhlIGJ1ZmZlciBmaWVsZCBvYmplY3QgKi8KIAotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKTsKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKTsKIAlpZiAoIW9ial9kZXNjKSB7CiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byBjbGVhbnVwOwpAQCAtMTc2LDI4ICsxNjcsMjYgQEAKIAkgKiBvcGNvZGUgYW5kIG9wZXJhbmRzIC0tIHNpbmNlIHRoZSBidWZmZXIgYW5kIGluZGV4CiAJICogb3BlcmFuZHMgbXVzdCBiZSBldmFsdWF0ZWQuCiAJICovCi0Jc2Vjb25kX2Rlc2MgICAgICAgICAgICAgICAgID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKKwlzZWNvbmRfZGVzYyA9IG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7CiAJc2Vjb25kX2Rlc2MtPmV4dHJhLmFtbF9zdGFydCA9IG9wLT5uYW1lZC5kYXRhOwogCXNlY29uZF9kZXNjLT5leHRyYS5hbWxfbGVuZ3RoID0gb3AtPm5hbWVkLmxlbmd0aDsKIAlvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLm5vZGUgPSBub2RlOwogCiAJLyogQXR0YWNoIGNvbnN0cnVjdGVkIGZpZWxkIGRlc2NyaXB0b3JzIHRvIHBhcmVudCBub2RlICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKG5vZGUsIG9ial9kZXNjLCBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5vZGUsIG9ial9kZXNjLCBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAogCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfZmllbGRfbmFtZXMKQEAgLTIxNCwxNyArMjAzLDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X2ZpZWxkX25hbWVzICgKLQlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAgICppbmZvLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnKQorYWNwaV9kc19nZXRfZmllbGRfbmFtZXMoc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2ludGVnZXIgcG9zaXRpb247CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfZ2V0X2ZpZWxkX25hbWVzIiwgaW5mbyk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfZ2V0X2ZpZWxkX25hbWVzIiwgaW5mbyk7CiAKIAkvKiBGaXJzdCBmaWVsZCBzdGFydHMgYXQgYml0IHplcm8gKi8KIApAQCAtMjQzLDE4ICsyMjksMTYgQEAKIAkJY2FzZSBBTUxfSU5UX1JFU0VSVkVERklFTERfT1A6CiAKIAkJCXBvc2l0aW9uID0gKGFjcGlfaW50ZWdlcikgaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uCi0JCQkJCSArIChhY3BpX2ludGVnZXIpIGFyZy0+Y29tbW9uLnZhbHVlLnNpemU7CisJCQkgICAgKyAoYWNwaV9pbnRlZ2VyKSBhcmctPmNvbW1vbi52YWx1ZS5zaXplOwogCiAJCQlpZiAocG9zaXRpb24gPiBBQ1BJX1VJTlQzMl9NQVgpIHsKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCQkiQml0IG9mZnNldCB3aXRoaW4gZmllbGQgdG9vIGxhcmdlICg+IDB4RkZGRkZGRkYpXG4iKSk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9TVVBQT1JUKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkJpdCBvZmZzZXQgd2l0aGluIGZpZWxkIHRvbyBsYXJnZSAoPiAweEZGRkZGRkZGKVxuIikpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKIAkJCX0KIAogCQkJaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uID0gKHUzMikgcG9zaXRpb247CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX0lOVF9BQ0NFU1NGSUVMRF9PUDoKIAogCQkJLyoKQEAgLTI2Niw3MyArMjUwLDcwIEBACiAJCQkgKiBBQ0NFU1NfVFlQRSBiaXRzCiAJCQkgKi8KIAkJCWluZm8tPmZpZWxkX2ZsYWdzID0gKHU4KQotCQkJCSgoaW5mby0+ZmllbGRfZmxhZ3MgJiB+KEFNTF9GSUVMRF9BQ0NFU1NfVFlQRV9NQVNLKSkgfAotCQkJCSgodTgpICgodTMyKSBhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyID4+IDgpKSk7CisJCQkgICAgKChpbmZvLT4KKwkJCSAgICAgIGZpZWxkX2ZsYWdzICYgfihBTUxfRklFTERfQUNDRVNTX1RZUEVfTUFTSykpIHwKKwkJCSAgICAgKCh1OCkgKCh1MzIpIGFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIgPj4gOCkpKTsKIAogCQkJaW5mby0+YXR0cmlidXRlID0gKHU4KSAoYXJnLT5jb21tb24udmFsdWUuaW50ZWdlcik7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX0lOVF9OQU1FREZJRUxEX09QOgogCiAJCQkvKiBMb29rdXAgdGhlIG5hbWUgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sCi0JCQkJCSAgKGNoYXIgKikgJmFyZy0+bmFtZWQubmFtZSwKLQkJCQkJICBpbmZvLT5maWVsZF90eXBlLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkJCSAgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCi0JCQkJCSAgd2Fsa19zdGF0ZSwgJmluZm8tPmZpZWxkX25vZGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCUFDUElfUkVQT1JUX05TRVJST1IgKChjaGFyICopICZhcmctPm5hbWVkLm5hbWUsIHN0YXR1cyk7CisJCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAorCQkJCQkJKGNoYXIgKikmYXJnLT5uYW1lZC5uYW1lLAorCQkJCQkJaW5mby0+ZmllbGRfdHlwZSwKKwkJCQkJCUFDUElfSU1PREVfRVhFQ1VURSwKKwkJCQkJCUFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLAorCQkJCQkJd2Fsa19zdGF0ZSwgJmluZm8tPmZpZWxkX25vZGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJQUNQSV9SRVBPUlRfTlNFUlJPUigoY2hhciAqKSZhcmctPm5hbWVkLm5hbWUsCisJCQkJCQkgICAgc3RhdHVzKTsKIAkJCQlpZiAoc3RhdHVzICE9IEFFX0FMUkVBRFlfRVhJU1RTKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQkJfQogCiAJCQkJLyogQWxyZWFkeSBleGlzdHMsIGlnbm9yZSBlcnJvciAqLwotCQkJfQotCQkJZWxzZSB7CisJCQl9IGVsc2UgewogCQkJCWFyZy0+Y29tbW9uLm5vZGUgPSBpbmZvLT5maWVsZF9ub2RlOwogCQkJCWluZm8tPmZpZWxkX2JpdF9sZW5ndGggPSBhcmctPmNvbW1vbi52YWx1ZS5zaXplOwogCiAJCQkJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGFuIG9iamVjdCBmb3IgdGhlIG5ldyBGaWVsZCBOb2RlICovCiAKLQkJCQlzdGF0dXMgPSBhY3BpX2V4X3ByZXBfZmllbGRfdmFsdWUgKGluZm8pOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCXN0YXR1cyA9IGFjcGlfZXhfcHJlcF9maWVsZF92YWx1ZShpbmZvKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQkJfQogCQkJfQogCiAJCQkvKiBLZWVwIHRyYWNrIG9mIGJpdCBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZmllbGQgKi8KIAogCQkJcG9zaXRpb24gPSAoYWNwaV9pbnRlZ2VyKSBpbmZvLT5maWVsZF9iaXRfcG9zaXRpb24KLQkJCQkJICsgKGFjcGlfaW50ZWdlcikgYXJnLT5jb21tb24udmFsdWUuc2l6ZTsKKwkJCSAgICArIChhY3BpX2ludGVnZXIpIGFyZy0+Y29tbW9uLnZhbHVlLnNpemU7CiAKIAkJCWlmIChwb3NpdGlvbiA+IEFDUElfVUlOVDMyX01BWCkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJCSJGaWVsZCBbJTQuNHNdIGJpdCBvZmZzZXQgdG9vIGxhcmdlICg+IDB4RkZGRkZGRkYpXG4iLAotCQkJCQkoY2hhciAqKSAmaW5mby0+ZmllbGRfbm9kZS0+bmFtZSkpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfU1VQUE9SVCk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJGaWVsZCBbJTQuNHNdIGJpdCBvZmZzZXQgdG9vIGxhcmdlICg+IDB4RkZGRkZGRkYpXG4iLCAoY2hhciAqKSZpbmZvLT5maWVsZF9ub2RlLT5uYW1lKSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NVUFBPUlQpOwogCQkJfQogCiAJCQlpbmZvLT5maWVsZF9iaXRfcG9zaXRpb24gKz0gaW5mby0+ZmllbGRfYml0X2xlbmd0aDsKIAkJCWJyZWFrOwogCi0KIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkludmFsaWQgb3Bjb2RlIGluIGZpZWxkIGxpc3Q6ICVYXG4iLAotCQkJCWFyZy0+Y29tbW9uLmFtbF9vcGNvZGUpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0JBRF9PUENPREUpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiSW52YWxpZCBvcGNvZGUgaW4gZmllbGQgbGlzdDogJVhcbiIsCisJCQkJCSAgYXJnLT5jb21tb24uYW1sX29wY29kZSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfT1BDT0RFKTsKIAkJfQogCiAJCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NyZWF0ZV9maWVsZApAQCAtMzQ4LDI5ICszMjksMjggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9maWVsZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcmVnaW9uX25vZGUsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfY3JlYXRlX2ZpZWxkKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcmVnaW9uX25vZGUsCisJCSAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmc7Ci0Jc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gICBpbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOworCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvIGluZm87CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfY3JlYXRlX2ZpZWxkIiwgb3ApOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2NyZWF0ZV9maWVsZCIsIG9wKTsKIAogCS8qIEZpcnN0IGFyZyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IG9wX3JlZ2lvbiAobXVzdCBhbHJlYWR5IGV4aXN0KSAqLwogCiAJYXJnID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7CiAJaWYgKCFyZWdpb25fbm9kZSkgewotCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYXJnLT5jb21tb24udmFsdWUubmFtZSwKLQkJCQkgIEFDUElfVFlQRV9SRUdJT04sIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCQkgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgd2Fsa19zdGF0ZSwgJnJlZ2lvbl9ub2RlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAoYXJnLT5jb21tb24udmFsdWUubmFtZSwgc3RhdHVzKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sCisJCQkJICAgYXJnLT5jb21tb24udmFsdWUubmFtZSwgQUNQSV9UWVBFX1JFR0lPTiwKKwkJCQkgICBBQ1BJX0lNT0RFX0VYRUNVVEUsIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwKKwkJCQkgICB3YWxrX3N0YXRlLCAmcmVnaW9uX25vZGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX05TRVJST1IoYXJnLT5jb21tb24udmFsdWUubmFtZSwgc3RhdHVzKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCkBAIC0zODUsMTIgKzM2NSwxMSBAQAogCWluZm8uZmllbGRfdHlwZSA9IEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ7CiAJaW5mby5yZWdpb25fbm9kZSA9IHJlZ2lvbl9ub2RlOwogCi0Jc3RhdHVzID0gYWNwaV9kc19nZXRfZmllbGRfbmFtZXMgKCZpbmZvLCB3YWxrX3N0YXRlLCBhcmctPmNvbW1vbi5uZXh0KTsKKwlzdGF0dXMgPSBhY3BpX2RzX2dldF9maWVsZF9uYW1lcygmaW5mbywgd2Fsa19zdGF0ZSwgYXJnLT5jb21tb24ubmV4dCk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0X2ZpZWxkX29iamVjdHMKQEAgLTQwNywzNyArMzg2LDM0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X2ZpZWxkX29iamVjdHMgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2RzX2luaXRfZmllbGRfb2JqZWN0cyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZyA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1OCB0eXBlID0gMDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19pbml0X2ZpZWxkX29iamVjdHMiLCBvcCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfaW5pdF9maWVsZF9vYmplY3RzIiwgb3ApOwogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKIAljYXNlIEFNTF9GSUVMRF9PUDoKLQkJYXJnID0gYWNwaV9wc19nZXRfYXJnIChvcCwgMik7CisJCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMik7CiAJCXR5cGUgPSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOwogCQlicmVhazsKIAogCWNhc2UgQU1MX0JBTktfRklFTERfT1A6Ci0JCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyAob3AsIDQpOworCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcob3AsIDQpOwogCQl0eXBlID0gQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ7CiAJCWJyZWFrOwogCiAJY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6Ci0JCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyAob3AsIDMpOworCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcob3AsIDMpOwogCQl0eXBlID0gQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKgpAQCAtNDQ3LDE2ICs0MjMsMTggQEAKIAkJLyogSWdub3JlIE9GRlNFVCBhbmQgQUNDRVNTQVMgdGVybXMgaGVyZSAqLwogCiAJCWlmIChhcmctPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfTkFNRURGSUVMRF9PUCkgewotCQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sCi0JCQkJCSAgKGNoYXIgKikgJmFyZy0+bmFtZWQubmFtZSwKLQkJCQkJICB0eXBlLCBBQ1BJX0lNT0RFX0xPQURfUEFTUzEsCi0JCQkJCSAgQUNQSV9OU19OT19VUFNFQVJDSCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFIHwKLQkJCQkJICBBQ1BJX05TX0VSUk9SX0lGX0ZPVU5ELAotCQkJCQkgIHdhbGtfc3RhdGUsICZub2RlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlBQ1BJX1JFUE9SVF9OU0VSUk9SICgoY2hhciAqKSAmYXJnLT5uYW1lZC5uYW1lLCBzdGF0dXMpOworCQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKKwkJCQkJCShjaGFyICopJmFyZy0+bmFtZWQubmFtZSwKKwkJCQkJCXR5cGUsIEFDUElfSU1PREVfTE9BRF9QQVNTMSwKKwkJCQkJCUFDUElfTlNfTk9fVVBTRUFSQ0ggfAorCQkJCQkJQUNQSV9OU19ET05UX09QRU5fU0NPUEUgfAorCQkJCQkJQUNQSV9OU19FUlJPUl9JRl9GT1VORCwKKwkJCQkJCXdhbGtfc3RhdGUsICZub2RlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfUkVQT1JUX05TRVJST1IoKGNoYXIgKikmYXJnLT5uYW1lZC5uYW1lLAorCQkJCQkJICAgIHN0YXR1cyk7CiAJCQkJaWYgKHN0YXR1cyAhPSBBRV9BTFJFQURZX0VYSVNUUykgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJCX0KIAogCQkJCS8qIE5hbWUgYWxyZWFkeSBleGlzdHMsIGp1c3QgaWdub3JlIHRoaXMgZXJyb3IgKi8KQEAgLTQ3MiwxMCArNDUwLDkgQEAKIAkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY3JlYXRlX2JhbmtfZmllbGQKQEAgLTQ5MSw0MSArNDY4LDQyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19jcmVhdGVfYmFua19maWVsZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcmVnaW9uX25vZGUsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfY3JlYXRlX2JhbmtfZmllbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcmVnaW9uX25vZGUsCisJCQkgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnOwotCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICAgaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKKwlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyBpbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2NyZWF0ZV9iYW5rX2ZpZWxkIiwgb3ApOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2NyZWF0ZV9iYW5rX2ZpZWxkIiwgb3ApOwogCiAJLyogRmlyc3QgYXJnIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb3BfcmVnaW9uIChtdXN0IGFscmVhZHkgZXhpc3QpICovCiAKIAlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKIAlpZiAoIXJlZ2lvbl9ub2RlKSB7Ci0JCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBhcmctPmNvbW1vbi52YWx1ZS5uYW1lLAotCQkJCSAgQUNQSV9UWVBFX1JFR0lPTiwgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJCSAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLCAmcmVnaW9uX25vZGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9OU0VSUk9SIChhcmctPmNvbW1vbi52YWx1ZS5uYW1lLCBzdGF0dXMpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKKwkJCQkgICBhcmctPmNvbW1vbi52YWx1ZS5uYW1lLCBBQ1BJX1RZUEVfUkVHSU9OLAorCQkJCSAgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCSAgIHdhbGtfc3RhdGUsICZyZWdpb25fbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihhcmctPmNvbW1vbi52YWx1ZS5uYW1lLCBzdGF0dXMpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAkvKiBTZWNvbmQgYXJnIGlzIHRoZSBCYW5rIFJlZ2lzdGVyIChGaWVsZCkgKG11c3QgYWxyZWFkeSBleGlzdCkgKi8KIAogCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7Ci0Jc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywKLQkJCSAgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsICZpbmZvLnJlZ2lzdGVyX25vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBzdGF0dXMpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLAorCQkJICAgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLAorCQkJICAgJmluZm8ucmVnaXN0ZXJfbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX05TRVJST1IoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBzdGF0dXMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBUaGlyZCBhcmcgaXMgdGhlIGJhbmtfdmFsdWUgKi8KQEAgLTU0MywxMiArNTIxLDExIEBACiAJaW5mby5maWVsZF90eXBlID0gQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ7CiAJaW5mby5yZWdpb25fbm9kZSA9IHJlZ2lvbl9ub2RlOwogCi0Jc3RhdHVzID0gYWNwaV9kc19nZXRfZmllbGRfbmFtZXMgKCZpbmZvLCB3YWxrX3N0YXRlLCBhcmctPmNvbW1vbi5uZXh0KTsKKwlzdGF0dXMgPSBhY3BpX2RzX2dldF9maWVsZF9uYW1lcygmaW5mbywgd2Fsa19zdGF0ZSwgYXJnLT5jb21tb24ubmV4dCk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfaW5kZXhfZmllbGQKQEAgLTU2NCwzOSArNTQxLDQwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19jcmVhdGVfaW5kZXhfZmllbGQgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnJlZ2lvbl9ub2RlLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2RzX2NyZWF0ZV9pbmRleF9maWVsZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcmVnaW9uX25vZGUsCisJCQkgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZzsKLQlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAgIGluZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CisJc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19jcmVhdGVfaW5kZXhfZmllbGQiLCBvcCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfY3JlYXRlX2luZGV4X2ZpZWxkIiwgb3ApOwogCiAJLyogRmlyc3QgYXJnIGlzIHRoZSBuYW1lIG9mIHRoZSBJbmRleCByZWdpc3RlciAobXVzdCBhbHJlYWR5IGV4aXN0KSAqLwogCiAJYXJnID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7Ci0Jc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywKLQkJCSAgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsICZpbmZvLnJlZ2lzdGVyX25vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBzdGF0dXMpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLAorCQkJICAgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLAorCQkJICAgJmluZm8ucmVnaXN0ZXJfbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX05TRVJST1IoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBzdGF0dXMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBTZWNvbmQgYXJnIGlzIHRoZSBkYXRhIHJlZ2lzdGVyIChtdXN0IGFscmVhZHkgZXhpc3QpICovCiAKIAlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwotCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsCi0JCQkgIEFDUElfVFlQRV9BTlksIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCSAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLCAmaW5mby5kYXRhX3JlZ2lzdGVyX25vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBzdGF0dXMpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLAorCQkJICAgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLAorCQkJICAgJmluZm8uZGF0YV9yZWdpc3Rlcl9ub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfTlNFUlJPUihhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIE5leHQgYXJnIGlzIHRoZSBmaWVsZCBmbGFncyAqLwpAQCAtNjA5LDkgKzU4Nyw3IEBACiAJaW5mby5maWVsZF90eXBlID0gQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOwogCWluZm8ucmVnaW9uX25vZGUgPSByZWdpb25fbm9kZTsKIAotCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2ZpZWxkX25hbWVzICgmaW5mbywgd2Fsa19zdGF0ZSwgYXJnLT5jb21tb24ubmV4dCk7CisJc3RhdHVzID0gYWNwaV9kc19nZXRfZmllbGRfbmFtZXMoJmluZm8sIHdhbGtfc3RhdGUsIGFyZy0+Y29tbW9uLm5leHQpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzaW5pdC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMKaW5kZXggZDc3OTBkYi4uODY5M2M3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMKQEAgLTQxLDIzICs0MSwxNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImRzaW5pdCIpCitBQ1BJX01PRFVMRV9OQU1FKCJkc2luaXQiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X29uZV9vYmplY3QgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KK2FjcGlfZHNfaW5pdF9vbmVfb2JqZWN0KGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTgwLDI2ICs3NCwyMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRfb25lX29iamVjdCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKQorYWNwaV9kc19pbml0X29uZV9vYmplY3QoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gICAgICAqaW5mbyA9IChzdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbyAqKSBjb250ZXh0OworCXN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvICppbmZvID0KKwkgICAgKHN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvICopY29udGV4dDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSA9CisJICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9oYW5kbGU7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfaW5pdF9vbmVfb2JqZWN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX2luaXRfb25lX29iamVjdCIpOwogCiAJLyoKLQkgKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIG9iamVjdHMgb3duZWQgYnkgdGhlIHRhYmxlIHRoYXQKKwkgKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIE5TIG5vZGVzIG93bmVkIGJ5IHRoZSB0YWJsZSB0aGF0CiAJICogd2FzIGp1c3QgbG9hZGVkCiAJICovCi0JaWYgKCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2hhbmRsZSktPm93bmVyX2lkICE9Ci0JCQlpbmZvLT50YWJsZV9kZXNjLT50YWJsZV9pZCkgeworCWlmIChub2RlLT5vd25lcl9pZCAhPSBpbmZvLT50YWJsZV9kZXNjLT5vd25lcl9pZCkgewogCQlyZXR1cm4gKEFFX09LKTsKIAl9CiAKQEAgLTEwNywzMyArOTgsMzEgQEAKIAogCS8qIEFuZCBldmVuIHRoZW4sIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gYSBmZXcgb2JqZWN0IHR5cGVzICovCiAKLQl0eXBlID0gYWNwaV9uc19nZXRfdHlwZSAob2JqX2hhbmRsZSk7CisJdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUob2JqX2hhbmRsZSk7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFDUElfVFlQRV9SRUdJT046CiAKLQkJc3RhdHVzID0gYWNwaV9kc19pbml0aWFsaXplX3JlZ2lvbiAob2JqX2hhbmRsZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJSZWdpb24gJXAgWyU0LjRzXSAtIEluaXQgZmFpbHVyZSwgJXNcbiIsCi0JCQkJb2JqX2hhbmRsZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfaGFuZGxlKSwKLQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJc3RhdHVzID0gYWNwaV9kc19pbml0aWFsaXplX3JlZ2lvbihvYmpfaGFuZGxlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJSZWdpb24gJXAgWyU0LjRzXSAtIEluaXQgZmFpbHVyZSwgJXNcbiIsCisJCQkJCSAgb2JqX2hhbmRsZSwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2hhbmRsZSksCisJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJfQogCiAJCWluZm8tPm9wX3JlZ2lvbl9jb3VudCsrOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgogCi0JCWluZm8tPm1ldGhvZF9jb3VudCsrOwotCiAJCS8qCiAJCSAqIFByaW50IGEgZG90IGZvciBlYWNoIG1ldGhvZCB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHByaW50CiAJCSAqIHRoZSBlbnRpcmUgcGF0aG5hbWUKIAkJICovCiAJCWlmICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9JTklUX05BTUVTKSkgewotCQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0lOSVQsICIuIikpOworCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwgIi4iKSk7CiAJCX0KIAogCQkvKgpAQCAtMTQzLDQxICsxMzIsMzIgQEAKIAkJICogb24gYSBwZXItdGFibGUgYmFzaXMuIEN1cnJlbnRseSwgd2UganVzdCB1c2UgYSBnbG9iYWwgZm9yIHRoZSB3aWR0aC4KIAkJICovCiAJCWlmIChpbmZvLT50YWJsZV9kZXNjLT5wb2ludGVyLT5yZXZpc2lvbiA9PSAxKSB7Ci0JCQkoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9oYW5kbGUpLT5mbGFncyB8PSBBTk9CSl9EQVRBX1dJRFRIXzMyOworCQkJbm9kZS0+ZmxhZ3MgfD0gQU5PQkpfREFUQV9XSURUSF8zMjsKIAkJfQogCiAJCS8qCiAJCSAqIEFsd2F5cyBwYXJzZSBtZXRob2RzIHRvIGRldGVjdCBlcnJvcnMsIHdlIHdpbGwgZGVsZXRlCiAJCSAqIHRoZSBwYXJzZSB0cmVlIGJlbG93CiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2RzX3BhcnNlX21ldGhvZCAob2JqX2hhbmRsZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJNZXRob2QgJXAgWyU0LjRzXSAtIHBhcnNlIGZhaWx1cmUsICVzXG4iLAotCQkJCW9ial9oYW5kbGUsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2hhbmRsZSksCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCXN0YXR1cyA9IGFjcGlfZHNfcGFyc2VfbWV0aG9kKG9ial9oYW5kbGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIlxuK01ldGhvZCAlcCBbJTQuNHNdIC0gcGFyc2UgZmFpbHVyZSwgJXNcbiIsCisJCQkJCSAgb2JqX2hhbmRsZSwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2hhbmRsZSksCisJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAogCQkJLyogVGhpcyBwYXJzZSBmYWlsZWQsIGJ1dCB3ZSB3aWxsIGNvbnRpbnVlIHBhcnNpbmcgbW9yZSBtZXRob2RzICovCi0KLQkJCWJyZWFrOwogCQl9CiAKLQkJLyoKLQkJICogRGVsZXRlIHRoZSBwYXJzZSB0cmVlLiAgV2Ugc2ltcGx5IHJlLXBhcnNlIHRoZSBtZXRob2QKLQkJICogZm9yIGV2ZXJ5IGV4ZWN1dGlvbiBzaW5jZSB0aGVyZSBpc24ndCBtdWNoIG92ZXJoZWFkCi0JCSAqLwotCQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZSAob2JqX2hhbmRsZSk7Ci0JCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lciAoCi0JCQkoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9oYW5kbGUpLT5vYmplY3QtPm1ldGhvZC5vd25pbmdfaWQpOworCQlpbmZvLT5tZXRob2RfY291bnQrKzsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKIAogCQlpbmZvLT5kZXZpY2VfY291bnQrKzsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTE4OSw3ICsxNjksNiBAQAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaW5pdGlhbGl6ZV9vYmplY3RzCkBAIC0yMDUsNDUgKzE4NCw0MyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdGlhbGl6ZV9vYmplY3RzICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnN0YXJ0X25vZGUpCithY3BpX2RzX2luaXRpYWxpemVfb2JqZWN0cyhzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICogdGFibGVfZGVzYywKKwkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogc3RhcnRfbm9kZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbyAgICAgIGluZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvIGluZm87CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19pbml0aWFsaXplX29iamVjdHMiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19pbml0aWFsaXplX29iamVjdHMiKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiKioqKiBTdGFydGluZyBpbml0aWFsaXphdGlvbiBvZiBuYW1lc3BhY2Ugb2JqZWN0cyAqKioqXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwgIlBhcnNpbmcgYWxsIENvbnRyb2wgTWV0aG9kczoiKSk7CiAKLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkiKioqKiBTdGFydGluZyBpbml0aWFsaXphdGlvbiBvZiBuYW1lc3BhY2Ugb2JqZWN0cyAqKioqXG4iKSk7Ci0JQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0lOSVQsICJQYXJzaW5nIGFsbCBDb250cm9sIE1ldGhvZHM6IikpOwotCi0JaW5mby5tZXRob2RfY291bnQgICA9IDA7CisJaW5mby5tZXRob2RfY291bnQgPSAwOwogCWluZm8ub3BfcmVnaW9uX2NvdW50ID0gMDsKLQlpbmZvLm9iamVjdF9jb3VudCAgID0gMDsKLQlpbmZvLmRldmljZV9jb3VudCAgID0gMDsKLQlpbmZvLnRhYmxlX2Rlc2MgICAgID0gdGFibGVfZGVzYzsKKwlpbmZvLm9iamVjdF9jb3VudCA9IDA7CisJaW5mby5kZXZpY2VfY291bnQgPSAwOworCWluZm8udGFibGVfZGVzYyA9IHRhYmxlX2Rlc2M7CiAKIAkvKiBXYWxrIGVudGlyZSBuYW1lc3BhY2UgZnJvbSB0aGUgc3VwcGxpZWQgcm9vdCAqLwogCi0Jc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZSAoQUNQSV9UWVBFX0FOWSwgc3RhcnRfbm9kZSwgQUNQSV9VSU5UMzJfTUFYLAotCQkJICBhY3BpX2RzX2luaXRfb25lX29iamVjdCwgJmluZm8sIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJ3YWxrX25hbWVzcGFjZSBmYWlsZWQsICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfQU5ZLCBzdGFydF9ub2RlLCBBQ1BJX1VJTlQzMl9NQVgsCisJCQkJICAgICBhY3BpX2RzX2luaXRfb25lX29iamVjdCwgJmluZm8sIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAid2Fsa19uYW1lc3BhY2UgZmFpbGVkLCAlc1xuIiwKKwkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0lOSVQsCi0JCSJcblRhYmxlIFslNC40c10oaWQgJTQuNFgpIC0gJWhkIE9iamVjdHMgd2l0aCAlaGQgRGV2aWNlcyAlaGQgTWV0aG9kcyAlaGQgUmVnaW9uc1xuIiwKLQkJdGFibGVfZGVzYy0+cG9pbnRlci0+c2lnbmF0dXJlLCB0YWJsZV9kZXNjLT50YWJsZV9pZCwgaW5mby5vYmplY3RfY291bnQsCi0JCWluZm8uZGV2aWNlX2NvdW50LCBpbmZvLm1ldGhvZF9jb3VudCwgaW5mby5vcF9yZWdpb25fY291bnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULAorCQkJICAgICAgIlxuVGFibGUgWyU0LjRzXShpZCAlNC40WCkgLSAlaGQgT2JqZWN0cyB3aXRoICVoZCBEZXZpY2VzICVoZCBNZXRob2RzICVoZCBSZWdpb25zXG4iLAorCQkJICAgICAgdGFibGVfZGVzYy0+cG9pbnRlci0+c2lnbmF0dXJlLAorCQkJICAgICAgdGFibGVfZGVzYy0+b3duZXJfaWQsIGluZm8ub2JqZWN0X2NvdW50LAorCQkJICAgICAgaW5mby5kZXZpY2VfY291bnQsIGluZm8ubWV0aG9kX2NvdW50LAorCQkJICAgICAgaW5mby5vcF9yZWdpb25fY291bnQpKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkiJWhkIE1ldGhvZHMsICVoZCBSZWdpb25zXG4iLCBpbmZvLm1ldGhvZF9jb3VudCwgaW5mby5vcF9yZWdpb25fY291bnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiJWhkIE1ldGhvZHMsICVoZCBSZWdpb25zXG4iLCBpbmZvLm1ldGhvZF9jb3VudCwKKwkJCSAgaW5mby5vcF9yZWdpb25fY291bnQpKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbWV0aG9kLmMKaW5kZXggOWZjM2Y0Yy4uMzZjMWNhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jCkBAIC00MSw3ICs0MSw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgpAQCAtNDksNjcgKzQ4LDU3IEBACiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJkc21ldGhvZCIpCi0KK0FDUElfTU9EVUxFX05BTUUoImRzbWV0aG9kIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19wYXJzZV9tZXRob2QKICAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2hhbmRsZSAgICAgIC0gTWV0aG9kIG5vZGUKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAtIE1ldGhvZCBub2RlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBDYWxsIHRoZSBwYXJzZXIgYW5kIHBhcnNlIHRoZSBBTUwgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gKiAgICAgICAgICAgICAgbWV0aG9kLgorICogREVTQ1JJUFRJT046IFBhcnNlIHRoZSBBTUwgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZC4KICAqCiAgKiBNVVRFWDogICAgICAgQXNzdW1lcyBwYXJzZXIgaXMgbG9ja2VkCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfcGFyc2VfbWV0aG9kICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUpCithY3BpX3N0YXR1cyBhY3BpX2RzX3BhcnNlX21ldGhvZChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfb3duZXJfaWQgICAgICAgICAgICAgICAgICAgb3duZXJfaWQ7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfcGFyc2VfbWV0aG9kIiwgb2JqX2hhbmRsZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfcGFyc2VfbWV0aG9kIiwgbm9kZSk7CiAKIAkvKiBQYXJhbWV0ZXIgVmFsaWRhdGlvbiAqLwogCi0JaWYgKCFvYmpfaGFuZGxlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTlVMTF9FTlRSWSk7CisJaWYgKCFub2RlKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OVUxMX0VOVFJZKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwgIioqKiogUGFyc2luZyBbJTQuNHNdICoqKiogbmFtZWRfb2JqPSVwXG4iLAotCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9oYW5kbGUpLCBvYmpfaGFuZGxlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCSAgIioqKiogUGFyc2luZyBbJTQuNHNdICoqKiogbmFtZWRfb2JqPSVwXG4iLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksIG5vZGUpKTsKIAogCS8qIEV4dHJhY3QgdGhlIG1ldGhvZCBvYmplY3QgZnJvbSB0aGUgbWV0aG9kIE5vZGUgKi8KIAotCW5vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2hhbmRsZTsKLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAJaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05VTExfT0JKRUNUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfT0JKRUNUKTsKIAl9CiAKIAkvKiBDcmVhdGUgYSBtdXRleCBmb3IgdGhlIG1ldGhvZCBpZiB0aGVyZSBpcyBhIGNvbmN1cnJlbmN5IGxpbWl0ICovCiAKIAlpZiAoKG9ial9kZXNjLT5tZXRob2QuY29uY3VycmVuY3kgIT0gQUNQSV9JTkZJTklURV9DT05DVVJSRU5DWSkgJiYKLQkJKCFvYmpfZGVzYy0+bWV0aG9kLnNlbWFwaG9yZSkpIHsKLQkJc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlIChvYmpfZGVzYy0+bWV0aG9kLmNvbmN1cnJlbmN5LAotCQkJCSAgIG9ial9kZXNjLT5tZXRob2QuY29uY3VycmVuY3ksCi0JCQkJICAgJm9ial9kZXNjLT5tZXRob2Quc2VtYXBob3JlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCSAgICAoIW9ial9kZXNjLT5tZXRob2Quc2VtYXBob3JlKSkgeworCQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUob2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSwKKwkJCQkJCSAgb2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSwKKwkJCQkJCSAgJm9ial9kZXNjLT5tZXRob2Quc2VtYXBob3JlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIApAQCAtMTE3LDE0ICsxMDYsMTQgQEAKIAkgKiBBbGxvY2F0ZSBhIG5ldyBwYXJzZXIgb3AgdG8gYmUgdGhlIHJvb3Qgb2YgdGhlIHBhcnNlZAogCSAqIG1ldGhvZCB0cmVlCiAJICovCi0Jb3AgPSBhY3BpX3BzX2FsbG9jX29wIChBTUxfTUVUSE9EX09QKTsKKwlvcCA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX01FVEhPRF9PUCk7CiAJaWYgKCFvcCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCS8qIEluaXQgbmV3IG9wIHdpdGggdGhlIG1ldGhvZCBuYW1lIGFuZCBwb2ludGVyIGJhY2sgdG8gdGhlIE5vZGUgKi8KIAotCWFjcGlfcHNfc2V0X25hbWUgKG9wLCBub2RlLT5uYW1lLmludGVnZXIpOworCWFjcGlfcHNfc2V0X25hbWUob3AsIG5vZGUtPm5hbWUuaW50ZWdlcik7CiAJb3AtPmNvbW1vbi5ub2RlID0gbm9kZTsKIAogCS8qCkBAIC0xMzIsMjIgKzEyMSwyNyBAQAogCSAqIG9iamVjdHMgKHN1Y2ggYXMgT3BlcmF0aW9uIFJlZ2lvbnMpIGNhbiBiZSBjcmVhdGVkIGR1cmluZyB0aGUKIAkgKiBmaXJzdCBwYXNzIHBhcnNlLgogCSAqLwotCW93bmVyX2lkID0gYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZCAoQUNQSV9PV05FUl9UWVBFX01FVEhPRCk7Ci0Jb2JqX2Rlc2MtPm1ldGhvZC5vd25pbmdfaWQgPSBvd25lcl9pZDsKKwlzdGF0dXMgPSBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkKCZvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBjbGVhbnVwOworCX0KIAogCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyB3YWxrIHN0YXRlICovCiAKLQl3YWxrX3N0YXRlID0gYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZSAob3duZXJfaWQsIE5VTEwsIE5VTEwsIE5VTEwpOworCXdhbGtfc3RhdGUgPQorCSAgICBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKG9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQsIE5VTEwsIE5VTEwsCisJCQkJICAgICAgTlVMTCk7CiAJaWYgKCF3YWxrX3N0YXRlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIGNsZWFudXAyOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2FsayAod2Fsa19zdGF0ZSwgb3AsIG5vZGUsCi0JCQkgIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAotCQkJICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsIE5VTEwsIDEpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSAod2Fsa19zdGF0ZSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIG5vZGUsCisJCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAorCQkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsIE5VTEwsIDEpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHdhbGtfc3RhdGUpOworCQlnb3RvIGNsZWFudXAyOwogCX0KIAogCS8qCkBAIC0xNTksMjAgKzE1MywzMSBAQAogCSAqIG1ldGhvZCBzbyB0aGF0IG9wZXJhbmRzIHRvIHRoZSBuYW1lZCBvYmplY3RzIGNhbiB0YWtlIG9uIGR5bmFtaWMKIAkgKiBydW4tdGltZSB2YWx1ZXMuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwgKHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfYW1sKHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXAyOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAotCQkiKioqKiBbJTQuNHNdIFBhcnNlZCAqKioqIG5hbWVkX29iaj0lcCBPcD0lcFxuIiwKLQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfaGFuZGxlKSwgb2JqX2hhbmRsZSwgb3ApKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJICAiKioqKiBbJTQuNHNdIFBhcnNlZCAqKioqIG5hbWVkX29iaj0lcCBPcD0lcFxuIiwKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLCBub2RlLCBvcCkpOwogCi0JYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSAob3ApOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkvKgorCSAqIERlbGV0ZSB0aGUgcGFyc2UgdHJlZS4gV2Ugc2ltcGx5IHJlLXBhcnNlIHRoZSBtZXRob2QgZm9yIGV2ZXJ5CisJICogZXhlY3V0aW9uIHNpbmNlIHRoZXJlIGlzbid0IG11Y2ggb3ZlcmhlYWQgKGNvbXBhcmVkIHRvIGtlZXBpbmcgbG90cworCSAqIG9mIHBhcnNlIHRyZWVzIGFyb3VuZCkKKwkgKi8KKwlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZShub2RlKTsKKwlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIob2JqX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCk7CisKKyAgICAgIGNsZWFudXAyOgorCWFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZCgmb2JqX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCk7CisKKyAgICAgIGNsZWFudXA6CisJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19iZWdpbl9tZXRob2RfZXhlY3V0aW9uCkBAIC0xOTAsMTkgKzE5NSwyMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbiAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbWV0aG9kX25vZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqY2FsbGluZ19tZXRob2Rfbm9kZSkKK2FjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGUsCisJCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNhbGxpbmdfbWV0aG9kX25vZGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19iZWdpbl9tZXRob2RfZXhlY3V0aW9uIiwgbWV0aG9kX25vZGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2JlZ2luX21ldGhvZF9leGVjdXRpb24iLCBtZXRob2Rfbm9kZSk7CiAKIAlpZiAoIW1ldGhvZF9ub2RlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTlVMTF9FTlRSWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OVUxMX0VOVFJZKTsKKwl9CisKKwkvKiBQcmV2ZW50IHdyYXBhcm91bmQgb2YgdGhyZWFkIGNvdW50ICovCisKKwlpZiAob2JqX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQgPT0gQUNQSV9VSU5UOF9NQVgpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJNZXRob2QgcmVhY2hlZCBtYXhpbXVtIHJlZW50cmFuY3kgbGltaXQgKDI1NSlcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9NRVRIT0RfTElNSVQpOwogCX0KIAogCS8qCkBAIC0yMTksOCArMjI4LDkgQEAKIAkJICogdGhyZWFkIHRoYXQgaXMgbWFraW5nIHJlY3Vyc2l2ZSBtZXRob2QgY2FsbHMuCiAJCSAqLwogCQlpZiAobWV0aG9kX25vZGUgPT0gY2FsbGluZ19tZXRob2Rfbm9kZSkgewotCQkJaWYgKG9ial9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50ID49IG9ial9kZXNjLT5tZXRob2QuY29uY3VycmVuY3kpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9NRVRIT0RfTElNSVQpOworCQkJaWYgKG9ial9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50ID49CisJCQkgICAgb2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTUVUSE9EX0xJTUlUKTsKIAkJCX0KIAkJfQogCkBAIC0yMjgsOCArMjM4LDIxIEBACiAJCSAqIEdldCBhIHVuaXQgZnJvbSB0aGUgbWV0aG9kIHNlbWFwaG9yZS4gVGhpcyByZWxlYXNlcyB0aGUKIAkJICogaW50ZXJwcmV0ZXIgaWYgd2UgYmxvY2sKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlIChvYmpfZGVzYy0+bWV0aG9kLnNlbWFwaG9yZSwKLQkJCQkgQUNQSV9XQUlUX0ZPUkVWRVIpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUob2JqX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUsCisJCQkJCQkgIEFDUElfV0FJVF9GT1JFVkVSKTsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuIE93bmVyIElEIGZvciB0aGlzIG1ldGhvZCwgb25seSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aHJlYWQKKwkgKiB0byBiZWdpbiBjb25jdXJyZW50IGV4ZWN1dGlvbi4gV2Ugb25seSBuZWVkIG9uZSBvd25lcl9pZCwgZXZlbiBpZiB0aGUKKwkgKiBtZXRob2QgaXMgaW52b2tlZCByZWN1cnNpdmVseS4KKwkgKi8KKwlpZiAoIW9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQpIHsKKwkJc3RhdHVzID0gYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZCgmb2JqX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KIAl9CiAKIAkvKgpAQCAtMjM3LDEwICsyNjAsOSBAQAogCSAqIHJlZW50ZXJlZCBvbmUgbW9yZSB0aW1lIChldmVuIGlmIGl0IGlzIHRoZSBzYW1lIHRocmVhZCkKIAkgKi8KIAlvYmpfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudCsrOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NhbGxfY29udHJvbF9tZXRob2QKQEAgLTI1NiwxMDEgKzI3OCw5OSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfY2FsbF9jb250cm9sX21ldGhvZCAoCi0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKnRoaXNfd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKK2FjcGlfZHNfY2FsbF9jb250cm9sX21ldGhvZChzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKnRocmVhZCwKKwkJCSAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp0aGlzX3dhbGtfc3RhdGUsCisJCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm1ldGhvZF9ub2RlOwotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKm5leHRfd2Fsa19zdGF0ZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgIGluZm87Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGU7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqbmV4dF93YWxrX3N0YXRlID0gTlVMTDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyBpbmZvOworCXUzMiBpOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2NhbGxfY29udHJvbF9tZXRob2QiLCB0aGlzX3dhbGtfc3RhdGUpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19jYWxsX2NvbnRyb2xfbWV0aG9kIiwgdGhpc193YWxrX3N0YXRlKTsKLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiRXhlY3V0ZSBtZXRob2QgJXAsIGN1cnJlbnRzdGF0ZT0lcFxuIiwKLQkJdGhpc193YWxrX3N0YXRlLT5wcmV2X29wLCB0aGlzX3dhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiRXhlY3V0ZSBtZXRob2QgJXAsIGN1cnJlbnRzdGF0ZT0lcFxuIiwKKwkJCSAgdGhpc193YWxrX3N0YXRlLT5wcmV2X29wLCB0aGlzX3dhbGtfc3RhdGUpKTsKIAogCS8qCiAJICogR2V0IHRoZSBuYW1lc3BhY2UgZW50cnkgZm9yIHRoZSBjb250cm9sIG1ldGhvZCB3ZSBhcmUgYWJvdXQgdG8gY2FsbAogCSAqLwogCW1ldGhvZF9ub2RlID0gdGhpc193YWxrX3N0YXRlLT5tZXRob2RfY2FsbF9ub2RlOwogCWlmICghbWV0aG9kX25vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OVUxMX0VOVFJZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfRU5UUlkpOwogCX0KIAotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChtZXRob2Rfbm9kZSk7CisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QobWV0aG9kX25vZGUpOwogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OVUxMX09CSkVDVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OVUxMX09CSkVDVCk7CiAJfQogCi0Jb2JqX2Rlc2MtPm1ldGhvZC5vd25pbmdfaWQgPSBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkIChBQ1BJX09XTkVSX1RZUEVfTUVUSE9EKTsKLQogCS8qIEluaXQgZm9yIG5ldyBtZXRob2QsIHdhaXQgb24gY29uY3VycmVuY3kgc2VtYXBob3JlICovCiAKLQlzdGF0dXMgPSBhY3BpX2RzX2JlZ2luX21ldGhvZF9leGVjdXRpb24gKG1ldGhvZF9ub2RlLCBvYmpfZGVzYywKLQkJCSAgdGhpc193YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9kc19iZWdpbl9tZXRob2RfZXhlY3V0aW9uKG1ldGhvZF9ub2RlLCBvYmpfZGVzYywKKwkJCQkJCXRoaXNfd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJaWYgKCEob2JqX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgJiBBTUxfTUVUSE9EX0lOVEVSTkFMX09OTFkpKSB7CiAJCS8qIDEpIFBhcnNlOiBDcmVhdGUgYSBuZXcgd2FsayBzdGF0ZSBmb3IgdGhlIHByZWVtcHRpbmcgd2FsayAqLwogCi0JCW5leHRfd2Fsa19zdGF0ZSA9IGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUgKG9ial9kZXNjLT5tZXRob2Qub3duaW5nX2lkLAotCQkJCSAgb3AsIG9ial9kZXNjLCBOVUxMKTsKKwkJbmV4dF93YWxrX3N0YXRlID0KKwkJICAgIGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUob2JqX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCwgb3AsCisJCQkJCSAgICAgIG9ial9kZXNjLCBOVUxMKTsKIAkJaWYgKCFuZXh0X3dhbGtfc3RhdGUpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJLyogQ3JlYXRlIGFuZCBpbml0IGEgUm9vdCBOb2RlICovCiAKLQkJb3AgPSBhY3BpX3BzX2NyZWF0ZV9zY29wZV9vcCAoKTsKKwkJb3AgPSBhY3BpX3BzX2NyZWF0ZV9zY29wZV9vcCgpOwogCQlpZiAoIW9wKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAotCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsgKG5leHRfd2Fsa19zdGF0ZSwgb3AsIG1ldGhvZF9ub2RlLAotCQkJCSAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwKLQkJCQkgIE5VTEwsIDEpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlIChuZXh0X3dhbGtfc3RhdGUpOworCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsobmV4dF93YWxrX3N0YXRlLCBvcCwgbWV0aG9kX25vZGUsCisJCQkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKKwkJCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwKKwkJCQkJICAgICAgIE5VTEwsIDEpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUobmV4dF93YWxrX3N0YXRlKTsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCiAJCS8qIEJlZ2luIEFNTCBwYXJzZSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfYW1sIChuZXh0X3dhbGtfc3RhdGUpOwotCQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlIChvcCk7CisJCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfYW1sKG5leHRfd2Fsa19zdGF0ZSk7CisJCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUob3ApOwogCX0KIAogCS8qIDIpIEV4ZWN1dGU6IENyZWF0ZSBhIG5ldyBzdGF0ZSBmb3IgdGhlIHByZWVtcHRpbmcgd2FsayAqLwogCi0JbmV4dF93YWxrX3N0YXRlID0gYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZSAob2JqX2Rlc2MtPm1ldGhvZC5vd25pbmdfaWQsCi0JCQkgIE5VTEwsIG9ial9kZXNjLCB0aHJlYWQpOworCW5leHRfd2Fsa19zdGF0ZSA9IGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUob2JqX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCwKKwkJCQkJCSAgICBOVUxMLCBvYmpfZGVzYywgdGhyZWFkKTsKIAlpZiAoIW5leHRfd2Fsa19zdGF0ZSkgewogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAJLyoKIAkgKiBUaGUgcmVzb2x2ZWQgYXJndW1lbnRzIHdlcmUgcHV0IG9uIHRoZSBwcmV2aW91cyB3YWxrIHN0YXRlJ3Mgb3BlcmFuZAotCSAqIHN0YWNrLiAgT3BlcmFuZHMgb24gdGhlIHByZXZpb3VzIHdhbGsgc3RhdGUgc3RhY2sgYWx3YXlzCi0JICogc3RhcnQgYXQgaW5kZXggMC4KLQkgKiBOdWxsIHRlcm1pbmF0ZSB0aGUgbGlzdCBvZiBhcmd1bWVudHMKKwkgKiBzdGFjay4gT3BlcmFuZHMgb24gdGhlIHByZXZpb3VzIHdhbGsgc3RhdGUgc3RhY2sgYWx3YXlzCisJICogc3RhcnQgYXQgaW5kZXggMC4gQWxzbywgbnVsbCB0ZXJtaW5hdGUgdGhlIGxpc3Qgb2YgYXJndW1lbnRzCiAJICovCi0JdGhpc193YWxrX3N0YXRlLT5vcGVyYW5kcyBbdGhpc193YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdID0gTlVMTDsKKwl0aGlzX3dhbGtfc3RhdGUtPm9wZXJhbmRzW3RoaXNfd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IE5VTEw7CiAKIAlpbmZvLnBhcmFtZXRlcnMgPSAmdGhpc193YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKIAlpbmZvLnBhcmFtZXRlcl90eXBlID0gQUNQSV9QQVJBTV9BUkdTOwogCi0Jc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrIChuZXh0X3dhbGtfc3RhdGUsIE5VTEwsIG1ldGhvZF9ub2RlLAotCQkJICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoLAotCQkJICAmaW5mbywgMyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2FsayhuZXh0X3dhbGtfc3RhdGUsIE5VTEwsIG1ldGhvZF9ub2RlLAorCQkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoLCAmaW5mbywgMyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKQEAgLTM1OSwzOSArMzc5LDM4IEBACiAJICogKHRoZXkgd2VyZSBjb3BpZWQgdG8gbmV3IG9iamVjdHMpCiAJICovCiAJZm9yIChpID0gMDsgaSA8IG9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQ7IGkrKykgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHRoaXNfd2Fsa19zdGF0ZS0+b3BlcmFuZHMgW2ldKTsKLQkJdGhpc193YWxrX3N0YXRlLT5vcGVyYW5kcyBbaV0gPSBOVUxMOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UodGhpc193YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSk7CisJCXRoaXNfd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0gPSBOVUxMOwogCX0KIAogCS8qIENsZWFyIHRoZSBvcGVyYW5kIHN0YWNrICovCiAKIAl0aGlzX3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDA7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJIlN0YXJ0aW5nIG5lc3RlZCBleGVjdXRpb24sIG5ld3N0YXRlPSVwXG4iLCBuZXh0X3dhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiU3RhcnRpbmcgbmVzdGVkIGV4ZWN1dGlvbiwgbmV3c3RhdGU9JXBcbiIsCisJCQkgIG5leHRfd2Fsa19zdGF0ZSkpOwogCiAJaWYgKG9ial9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9JTlRFUk5BTF9PTkxZKSB7Ci0JCXN0YXR1cyA9IG9ial9kZXNjLT5tZXRob2QuaW1wbGVtZW50YXRpb24gKG5leHRfd2Fsa19zdGF0ZSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gb2JqX2Rlc2MtPm1ldGhvZC5pbXBsZW1lbnRhdGlvbihuZXh0X3dhbGtfc3RhdGUpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCisgICAgICBjbGVhbnVwOgorCS8qIERlY3JlbWVudCB0aGUgdGhyZWFkIGNvdW50IG9uIHRoZSBtZXRob2QgcGFyc2UgdHJlZSAqLworCisJaWYgKG5leHRfd2Fsa19zdGF0ZSAmJiAobmV4dF93YWxrX3N0YXRlLT5tZXRob2RfZGVzYykpIHsKKwkJbmV4dF93YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudC0tOworCX0KIAogCS8qIE9uIGVycm9yLCB3ZSBtdXN0IGRlbGV0ZSB0aGUgbmV3IHdhbGsgc3RhdGUgKi8KIAotY2xlYW51cDoKLQlpZiAobmV4dF93YWxrX3N0YXRlICYmIChuZXh0X3dhbGtfc3RhdGUtPm1ldGhvZF9kZXNjKSkgewotCQkvKiBEZWNyZW1lbnQgdGhlIHRocmVhZCBjb3VudCBvbiB0aGUgbWV0aG9kIHBhcnNlIHRyZWUgKi8KLQotCSAgIG5leHRfd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQtLTsKLQl9Ci0JKHZvaWQpIGFjcGlfZHNfdGVybWluYXRlX2NvbnRyb2xfbWV0aG9kIChuZXh0X3dhbGtfc3RhdGUpOwotCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUgKG5leHRfd2Fsa19zdGF0ZSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfZHNfdGVybWluYXRlX2NvbnRyb2xfbWV0aG9kKG5leHRfd2Fsa19zdGF0ZSk7CisJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZShuZXh0X3dhbGtfc3RhdGUpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcmVzdGFydF9jb250cm9sX21ldGhvZApAQCAtNDA3LDI1ICs0MjYsMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3RhcnRfY29udHJvbF9tZXRob2QgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MpCithY3BpX2RzX3Jlc3RhcnRfY29udHJvbF9tZXRob2Qoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfcmVzdGFydF9jb250cm9sX21ldGhvZCIsIHdhbGtfc3RhdGUpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19yZXN0YXJ0X2NvbnRyb2xfbWV0aG9kIiwgd2Fsa19zdGF0ZSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIioqKipSZXN0YXJ0IFslNC40c10gT3AgJXAgcmV0dXJuX3ZhbHVlX2Zyb21fY2FsbGVlICVwXG4iLAorCQkJICAoY2hhciAqKSZ3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZS0+bmFtZSwKKwkJCSAgd2Fsa19zdGF0ZS0+bWV0aG9kX2NhbGxfb3AsIHJldHVybl9kZXNjKSk7CiAKLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkiKioqKlJlc3RhcnQgWyU0LjRzXSBPcCAlcCByZXR1cm5fdmFsdWVfZnJvbV9jYWxsZWUgJXBcbiIsCi0JCShjaGFyICopICZ3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZS0+bmFtZSwgd2Fsa19zdGF0ZS0+bWV0aG9kX2NhbGxfb3AsCi0JCXJldHVybl9kZXNjKSk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJIiAgICByZXR1cm5fZnJvbV90aGlzX21ldGhvZF91c2VkPz0lWCByZXNfc3RhY2sgJXAgV2FsayAlcFxuIiwKLQkJd2Fsa19zdGF0ZS0+cmV0dXJuX3VzZWQsCi0JCXdhbGtfc3RhdGUtPnJlc3VsdHMsIHdhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiICAgIHJldHVybl9mcm9tX3RoaXNfbWV0aG9kX3VzZWQ/PSVYIHJlc19zdGFjayAlcCBXYWxrICVwXG4iLAorCQkJICB3YWxrX3N0YXRlLT5yZXR1cm5fdXNlZCwKKwkJCSAgd2Fsa19zdGF0ZS0+cmVzdWx0cywgd2Fsa19zdGF0ZSkpOwogCiAJLyogRGlkIHRoZSBjYWxsZWQgbWV0aG9kIHJldHVybiBhIHZhbHVlPyAqLwogCkBAIC00MzUsMTAgKzQ1MSwxMCBAQAogCQlpZiAod2Fsa19zdGF0ZS0+cmV0dXJuX3VzZWQpIHsKIAkJCS8qIFNhdmUgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBwcmV2aW91cyBtZXRob2QgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfcHVzaCAocmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocmV0dXJuX2Rlc2MpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3B1c2gocmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAogCQkJLyoKQEAgLTQ1NiwyNiArNDcyLDI2IEBACiAJCSAqIE5PVEU6IHRoaXMgaXMgb3B0aW9uYWwgYmVjYXVzZSB0aGUgQVNMIGxhbmd1YWdlIGRvZXMgbm90IGFjdHVhbGx5CiAJCSAqIHN1cHBvcnQgdGhpcyBiZWhhdmlvci4KIAkJICovCi0JCWVsc2UgaWYgKCFhY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybiAocmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUsIEZBTFNFKSkgeworCQllbHNlIGlmICghYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4KKwkJCSAocmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUsIEZBTFNFKSkgewogCQkJLyoKIAkJCSAqIERlbGV0ZSB0aGUgcmV0dXJuIHZhbHVlIGlmIGl0IHdpbGwgbm90IGJlIHVzZWQgYnkgdGhlCiAJCQkgKiBjYWxsaW5nIG1ldGhvZAogCQkJICovCi0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHJldHVybl9kZXNjKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CiAJCX0KIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfdGVybWluYXRlX2NvbnRyb2xfbWV0aG9kCiAgKgogICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBTdGF0ZSBvZiB0aGUgbWV0aG9kCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogVGVybWluYXRlIGEgY29udHJvbCBtZXRob2QuICBEZWxldGUgZXZlcnl0aGluZyB0aGF0IHRoZSBtZXRob2QKICAqICAgICAgICAgICAgICBjcmVhdGVkLCBkZWxldGUgYWxsIGxvY2FscyBhbmQgYXJndW1lbnRzLCBhbmQgZGVsZXRlIHRoZSBwYXJzZQpAQCAtNDgzLDYzICs0OTksNTkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2QgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCit2b2lkIGFjcGlfZHNfdGVybWluYXRlX2NvbnRyb2xfbWV0aG9kKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbWV0aG9kX25vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9ub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2QiLCB3YWxrX3N0YXRlKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2QiLCB3YWxrX3N0YXRlKTsKIAogCWlmICghd2Fsa19zdGF0ZSkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fVk9JRDsKIAl9CiAKIAkvKiBUaGUgY3VycmVudCBtZXRob2Qgb2JqZWN0IHdhcyBzYXZlZCBpbiB0aGUgd2FsayBzdGF0ZSAqLwogCiAJb2JqX2Rlc2MgPSB3YWxrX3N0YXRlLT5tZXRob2RfZGVzYzsKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fVk9JRDsKIAl9CiAKIAkvKiBEZWxldGUgYWxsIGFyZ3VtZW50cyBhbmQgbG9jYWxzICovCiAKLQlhY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV9hbGwgKHdhbGtfc3RhdGUpOworCWFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX2FsbCh3YWxrX3N0YXRlKTsKIAogCS8qCiAJICogTG9jayB0aGUgcGFyc2VyIHdoaWxlIHdlIHRlcm1pbmF0ZSB0aGlzIG1ldGhvZC4KIAkgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IHRocmVhZCBleGVjdXRpbmcgdGhlIG1ldGhvZCwKIAkgKiB3ZSBoYXZlIGFkZGl0aW9uYWwgY2xlYW51cCB0byBwZXJmb3JtCiAJICovCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9QQVJTRVIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9QQVJTRVIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fVk9JRDsKIAl9CiAKIAkvKiBTaWduYWwgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kIGlmIG5lY2Vzc2FyeSAqLwogCiAJaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2Quc2VtYXBob3JlKSB7Ci0JCXN0YXR1cyA9IGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZSAoCi0JCQkJICB3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLnNlbWFwaG9yZSwgMSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCBzaWduYWwgbWV0aG9kIHNlbWFwaG9yZVxuIikpOwotCQkJc3RhdHVzID0gQUVfT0s7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC4KKwkJCQkJICAgICBzZW1hcGhvcmUsIDEpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IHNpZ25hbCBtZXRob2Qgc2VtYXBob3JlXG4iKSk7CiAKIAkJCS8qIElnbm9yZSBlcnJvciBhbmQgY29udGludWUgY2xlYW51cCAqLwogCQl9CiAJfQogCiAJaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkJIioqKiBOb3QgZGVsZXRpbmcgbWV0aG9kIG5hbWVzcGFjZSwgdGhlcmUgYXJlIHN0aWxsICVkIHRocmVhZHNcbiIsCi0JCQl3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudCkpOwotCX0KKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkgICIqKiogTm90IGRlbGV0aW5nIG1ldGhvZCBuYW1lc3BhY2UsIHRoZXJlIGFyZSBzdGlsbCAlZCB0aHJlYWRzXG4iLAorCQkJCSAgd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC4KKwkJCQkgIHRocmVhZF9jb3VudCkpOworCX0gZWxzZSB7CQkvKiBUaGlzIGlzIHRoZSBsYXN0IGV4ZWN1dGluZyB0aHJlYWQgKi8KIAotCWlmICghd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQpIHsKIAkJLyoKIAkJICogU3VwcG9ydCB0byBkeW5hbWljYWxseSBjaGFuZ2UgYSBtZXRob2QgZnJvbSBub3Rfc2VyaWFsaXplZCB0bwogCQkgKiBTZXJpYWxpemVkIGlmIGl0IGFwcGVhcnMgdGhhdCB0aGUgbWV0aG9kIGlzIHdyaXR0ZW4gZm9vbGlzaGx5IGFuZApAQCAtNTUxLDEwICs1NjMsMTEgQEAKIAkJICogYmVmb3JlIGNyZWF0aW5nIHRoZSBzeW5jaHJvbml6YXRpb24gc2VtYXBob3JlLgogCQkgKi8KIAkJaWYgKCh3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLmNvbmN1cnJlbmN5ID09IDEpICYmCi0JCQkoIXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2Quc2VtYXBob3JlKSkgewotCQkJc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlICgxLAotCQkJCQkgMSwKLQkJCQkJICZ3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLnNlbWFwaG9yZSk7CisJCSAgICAoIXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2Quc2VtYXBob3JlKSkgeworCQkJc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlKDEsIDEsCisJCQkJCQkJICAmd2Fsa19zdGF0ZS0+CisJCQkJCQkJICBtZXRob2RfZGVzYy0+bWV0aG9kLgorCQkJCQkJCSAgc2VtYXBob3JlKTsKIAkJfQogCiAJCS8qCkBAIC01NjksMjggKzU4MiwyNyBAQAogCQkgKiBEZWxldGUgYW55IG5hbWVzcGFjZSBlbnRyaWVzIGNyZWF0ZWQgaW1tZWRpYXRlbHkgdW5kZXJuZWF0aAogCQkgKiB0aGUgbWV0aG9kCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZ290byBleGl0OwogCQl9CiAKIAkJaWYgKG1ldGhvZF9ub2RlLT5jaGlsZCkgewotCQkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUgKG1ldGhvZF9ub2RlKTsKKwkJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9zdWJ0cmVlKG1ldGhvZF9ub2RlKTsKIAkJfQogCiAJCS8qCiAJCSAqIERlbGV0ZSBhbnkgbmFtZXNwYWNlIGVudHJpZXMgY3JlYXRlZCBhbnl3aGVyZSBlbHNlIHdpdGhpbgogCQkgKiB0aGUgbmFtZXNwYWNlCiAJCSAqLwotCQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIgKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2Qub3duaW5nX2lkKTsKLQkJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7Ci0JCX0KKwkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT4KKwkJCQkJCSAgbWV0aG9kLm93bmVyX2lkKTsKKwkJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJCWFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZCgmd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC4KKwkJCQkJIG93bmVyX2lkKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX1BBUlNFUik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfUEFSU0VSKTsKKwlyZXR1cm5fVk9JRDsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc210aGRhdC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtdGhkYXQuYwppbmRleCBmNzk5ODMwLi40MDk1Y2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc210aGRhdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbXRoZGF0LmMKQEAgLTQxLDQxICs0MSwzMiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImRzbXRoZGF0IikKK0FDUElfTU9EVUxFX05BTUUoImRzbXRoZGF0IikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCiBzdGF0aWMgdm9pZAotYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV92YWx1ZSh1MTYgb3Bjb2RlLAorCQkJCSB1MzIgaW5kZXgsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlKHUxNiBvcGNvZGUsCisJCQkgICAgICB1MzIgaW5kZXgsCisJCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCiBhY3BpX29iamVjdF90eXBlCi1hY3BpX2RzX21ldGhvZF9kYXRhX2dldF90eXBlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZSh1MTYgb3Bjb2RlLAorCQkJICAgICB1MzIgaW5kZXgsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9pbml0CkBAIC05Nyw0NSArODgsNDEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX2RzX21ldGhvZF9kYXRhX2luaXQgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCit2b2lkIGFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKwl1MzIgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX21ldGhvZF9kYXRhX2luaXQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX21ldGhvZF9kYXRhX2luaXQiKTsKIAogCS8qIEluaXQgdGhlIG1ldGhvZCBhcmd1bWVudHMgKi8KIAogCWZvciAoaSA9IDA7IGkgPCBBQ1BJX01FVEhPRF9OVU1fQVJHUzsgaSsrKSB7Ci0JCUFDUElfTU9WRV8zMl9UT18zMiAoJndhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5uYW1lLAorCQlBQ1BJX01PVkVfMzJfVE9fMzIoJndhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5uYW1lLAogCQkJCSAgIE5BTUVPRl9BUkdfTlRFKTsKIAkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLm5hbWUuaW50ZWdlciB8PSAoaSA8PCAyNCk7Ci0JCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5kZXNjcmlwdG9yICAgPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDsKLQkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLnR5cGUgICAgICAgICA9IEFDUElfVFlQRV9BTlk7Ci0JCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5mbGFncyAgICAgICAgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwKLQkJCQkgIEFOT0JKX01FVEhPRF9BUkc7CisJCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5kZXNjcmlwdG9yID0gQUNQSV9ERVNDX1RZUEVfTkFNRUQ7CisJCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS50eXBlID0gQUNQSV9UWVBFX0FOWTsKKwkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLmZsYWdzID0gQU5PQkpfRU5EX09GX1BFRVJfTElTVCB8CisJCSAgICBBTk9CSl9NRVRIT0RfQVJHOwogCX0KIAogCS8qIEluaXQgdGhlIG1ldGhvZCBsb2NhbHMgKi8KIAogCWZvciAoaSA9IDA7IGkgPCBBQ1BJX01FVEhPRF9OVU1fTE9DQUxTOyBpKyspIHsKLQkJQUNQSV9NT1ZFXzMyX1RPXzMyICgmd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLm5hbWUsCisJCUFDUElfTU9WRV8zMl9UT18zMigmd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLm5hbWUsCiAJCQkJICAgTkFNRU9GX0xPQ0FMX05URSk7CiAKIAkJd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLm5hbWUuaW50ZWdlciB8PSAoaSA8PCAyNCk7Ci0JCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5kZXNjcmlwdG9yICA9IEFDUElfREVTQ19UWVBFX05BTUVEOwotCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0udHlwZSAgICAgICAgPSBBQ1BJX1RZUEVfQU5ZOwotCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0uZmxhZ3MgICAgICAgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwKLQkJCQkgQU5PQkpfTUVUSE9EX0xPQ0FMOworCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0uZGVzY3JpcHRvciA9CisJCSAgICBBQ1BJX0RFU0NfVFlQRV9OQU1FRDsKKwkJd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOworCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0uZmxhZ3MgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwKKwkJICAgIEFOT0JKX01FVEhPRF9MT0NBTDsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV9hbGwKQEAgLTE0OSwyNiArMTM2LDI1IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfYWxsICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQordm9pZCBhY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV9hbGwoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OworCXUzMiBpbmRleDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX21ldGhvZF9kYXRhX2RlbGV0ZV9hbGwiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX21ldGhvZF9kYXRhX2RlbGV0ZV9hbGwiKTsKIAogCS8qIERldGFjaCB0aGUgbG9jYWxzICovCiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBBQ1BJX01FVEhPRF9OVU1fTE9DQUxTOyBpbmRleCsrKSB7CiAJCWlmICh3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaW5kZXhdLm9iamVjdCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIkRlbGV0aW5nIExvY2FsJWQ9JXBcbiIsCi0JCQkJCWluZGV4LCB3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaW5kZXhdLm9iamVjdCkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiRGVsZXRpbmcgTG9jYWwlZD0lcFxuIiwKKwkJCQkJICBpbmRleCwKKwkJCQkJICB3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaW5kZXhdLgorCQkJCQkgIG9iamVjdCkpOwogCiAJCQkvKiBEZXRhY2ggb2JqZWN0IChpZiBwcmVzZW50KSBhbmQgcmVtb3ZlIGEgcmVmZXJlbmNlICovCiAKLQkJCWFjcGlfbnNfZGV0YWNoX29iamVjdCAoJndhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpbmRleF0pOworCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KCZ3YWxrX3N0YXRlLT4KKwkJCQkJICAgICAgbG9jYWxfdmFyaWFibGVzW2luZGV4XSk7CiAJCX0KIAl9CiAKQEAgLTE3NiwxOSArMTYyLDE5IEBACiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBBQ1BJX01FVEhPRF9OVU1fQVJHUzsgaW5kZXgrKykgewogCQlpZiAod2Fsa19zdGF0ZS0+YXJndW1lbnRzW2luZGV4XS5vYmplY3QpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJEZWxldGluZyBBcmclZD0lcFxuIiwKLQkJCQkJaW5kZXgsIHdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpbmRleF0ub2JqZWN0KSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJEZWxldGluZyBBcmclZD0lcFxuIiwKKwkJCQkJICBpbmRleCwKKwkJCQkJICB3YWxrX3N0YXRlLT5hcmd1bWVudHNbaW5kZXhdLm9iamVjdCkpOwogCiAJCQkvKiBEZXRhY2ggb2JqZWN0IChpZiBwcmVzZW50KSBhbmQgcmVtb3ZlIGEgcmVmZXJlbmNlICovCiAKLQkJCWFjcGlfbnNfZGV0YWNoX29iamVjdCAoJndhbGtfc3RhdGUtPmFyZ3VtZW50c1tpbmRleF0pOworCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KCZ3YWxrX3N0YXRlLT5hcmd1bWVudHNbaW5kZXhdKTsKIAkJfQogCX0KIAogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdF9hcmdzCkBAIC0yMDYsNDcgKzE5Miw0NCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdF9hcmdzICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcGFyYW1zLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3BhcmFtX2NvdW50LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2RzX21ldGhvZF9kYXRhX2luaXRfYXJncyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcGFyYW1zLAorCQkJICAgICAgdTMyIG1heF9wYXJhbV9jb3VudCwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBpbmRleCA9IDA7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfbWV0aG9kX2RhdGFfaW5pdF9hcmdzIiwgcGFyYW1zKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19tZXRob2RfZGF0YV9pbml0X2FyZ3MiLCBwYXJhbXMpOwogCiAJaWYgKCFwYXJhbXMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIk5vIHBhcmFtIGxpc3QgcGFzc2VkIHRvIG1ldGhvZFxuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIk5vIHBhcmFtIGxpc3QgcGFzc2VkIHRvIG1ldGhvZFxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIENvcHkgcGFzc2VkIHBhcmFtZXRlcnMgaW50byB0aGUgbmV3IG1ldGhvZCBzdGFjayBmcmFtZSAqLwogCiAJd2hpbGUgKChpbmRleCA8IEFDUElfTUVUSE9EX05VTV9BUkdTKSAmJgotCQkgICAoaW5kZXggPCBtYXhfcGFyYW1fY291bnQpICAgICAgJiYKLQkJCXBhcmFtc1tpbmRleF0pIHsKKwkgICAgICAgKGluZGV4IDwgbWF4X3BhcmFtX2NvdW50KSAmJiBwYXJhbXNbaW5kZXhdKSB7CiAJCS8qCiAJCSAqIEEgdmFsaWQgcGFyYW1ldGVyLgogCQkgKiBTdG9yZSB0aGUgYXJndW1lbnQgaW4gdGhlIG1ldGhvZC93YWxrIGRlc2NyaXB0b3IuCiAJCSAqIERvIG5vdCBjb3B5IHRoZSBhcmcgaW4gb3JkZXIgdG8gaW1wbGVtZW50IGNhbGwgYnkgcmVmZXJlbmNlCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX3NldF92YWx1ZSAoQU1MX0FSR19PUCwgaW5kZXgsCi0JCQkJIHBhcmFtc1tpbmRleF0sIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlKEFNTF9BUkdfT1AsIGluZGV4LAorCQkJCQkJICAgICAgIHBhcmFtc1tpbmRleF0sCisJCQkJCQkgICAgICAgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQlpbmRleCsrOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICIlZCBhcmdzIHBhc3NlZCB0byBtZXRob2RcbiIsIGluZGV4KSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiJWQgYXJncyBwYXNzZWQgdG8gbWV0aG9kXG4iLCBpbmRleCkpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZQpAQCAtMjYzLDE0ICsyNDYsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqKm5vZGUpCithY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKHUxNiBvcGNvZGUsCisJCQkgICAgIHUzMiBpbmRleCwKKwkJCSAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipub2RlKQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19tZXRob2RfZGF0YV9nZXRfbm9kZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUiKTsKIAogCS8qCiAJICogTWV0aG9kIExvY2FscyBhbmQgQXJndW1lbnRzIGFyZSBzdXBwb3J0ZWQKQEAgLTI3OSwxMCArMjYwLDEwIEBACiAJY2FzZSBBTUxfTE9DQUxfT1A6CiAKIAkJaWYgKGluZGV4ID4gQUNQSV9NRVRIT0RfTUFYX0xPQ0FMKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiTG9jYWwgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKVxuIiwKLQkJCQlpbmRleCwgQUNQSV9NRVRIT0RfTUFYX0xPQ0FMKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlZBTElEX0lOREVYKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkxvY2FsIGluZGV4ICVkIGlzIGludmFsaWQgKG1heCAlZClcbiIsCisJCQkJCSAgaW5kZXgsIEFDUElfTUVUSE9EX01BWF9MT0NBTCkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX0lOREVYKTsKIAkJfQogCiAJCS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHBzZXVkby1ub2RlICovCkBAIC0yOTMsMTAgKzI3NCwxMCBAQAogCWNhc2UgQU1MX0FSR19PUDoKIAogCQlpZiAoaW5kZXggPiBBQ1BJX01FVEhPRF9NQVhfQVJHKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiQXJnIGluZGV4ICVkIGlzIGludmFsaWQgKG1heCAlZClcbiIsCi0JCQkJaW5kZXgsIEFDUElfTUVUSE9EX01BWF9BUkcpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVkFMSURfSU5ERVgpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiQXJnIGluZGV4ICVkIGlzIGludmFsaWQgKG1heCAlZClcbiIsCisJCQkJCSAgaW5kZXgsIEFDUElfTUVUSE9EX01BWF9BUkcpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5WQUxJRF9JTkRFWCk7CiAJCX0KIAogCQkvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBwc2V1ZG8tbm9kZSAqLwpAQCAtMzA1LDE0ICsyODYsMTQgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk9wY29kZSAlZCBpcyBpbnZhbGlkXG4iLCBvcGNvZGUpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX09QQ09ERSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJPcGNvZGUgJWQgaXMgaW52YWxpZFxuIiwKKwkJCQkgIG9wY29kZSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9PUENPREUpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUKQEAgLTMzMCwyOSArMzExLDI2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUodTE2IG9wY29kZSwKKwkJCSAgICAgIHUzMiBpbmRleCwKKwkJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19tZXRob2RfZGF0YV9zZXRfdmFsdWUiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19tZXRob2RfZGF0YV9zZXRfdmFsdWUiKTsKLQotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJIm5ld19vYmogJXAgT3Bjb2RlICVYLCBSZWZzPSVkIFslc11cbiIsIG9iamVjdCwKLQkJb3Bjb2RlLCBvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQsCi0JCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAob2JqZWN0LT5jb21tb24udHlwZSkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkgICJuZXdfb2JqICVwIE9wY29kZSAlWCwgUmVmcz0lZCBbJXNdXG4iLCBvYmplY3QsCisJCQkgIG9wY29kZSwgb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50LAorCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUob2JqZWN0LT5jb21tb24udHlwZSkpKTsKIAogCS8qIEdldCB0aGUgbmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBhcmcvbG9jYWwgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTM2MSwxNSArMzM5LDE0IEBACiAJICogcmVmZXJlbmNlIHNlbWFudGljcyBvZiBBQ1BJIENvbnRyb2wgTWV0aG9kIGludm9jYXRpb24uCiAJICogKFNlZSBBQ1BJIHNwZWNpZmljYXRpb24gMi4wX2MpCiAJICovCi0JYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvYmplY3QpOworCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmplY3QpOwogCiAJLyogSW5zdGFsbCB0aGUgb2JqZWN0ICovCiAKIAlub2RlLT5vYmplY3QgPSBvYmplY3Q7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlCkBAIC0zODcsMzIgKzM2NCwzMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRlc3RfZGVzYykKK2FjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlKHUxNiBvcGNvZGUsCisJCQkgICAgICB1MzIgaW5kZXgsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmRlc3RfZGVzYykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19tZXRob2RfZGF0YV9nZXRfdmFsdWUiKTsKIAogCS8qIFZhbGlkYXRlIHRoZSBvYmplY3QgZGVzY3JpcHRvciAqLwogCiAJaWYgKCFkZXN0X2Rlc2MpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJOdWxsIG9iamVjdCBkZXNjcmlwdG9yIHBvaW50ZXJcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJOdWxsIG9iamVjdCBkZXNjcmlwdG9yIHBvaW50ZXJcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIEdldCB0aGUgbmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBhcmcvbG9jYWwgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogR2V0IHRoZSBvYmplY3QgZnJvbSB0aGUgbm9kZSAqLwpAQCAtNDMzLDkgKzQwOCwxMCBAQAogCQkvKiBJZiBzbGFjayBlbmFibGVkLCBpbml0IHRoZSBsb2NhbF94L2FyZ194IHRvIGFuIEludGVnZXIgb2YgdmFsdWUgemVybyAqLwogCiAJCWlmIChhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2spIHsKLQkJCW9iamVjdCA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCQkJb2JqZWN0ID0KKwkJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQkJaWYgKCFvYmplY3QpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCQl9CiAKIAkJCW9iamVjdC0+aW50ZWdlci52YWx1ZSA9IDA7CkBAIC00NDQsMjcgKzQyMCwyOSBAQAogCiAJCS8qIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBlcnJvciAqLwogCi0JCWVsc2Ugc3dpdGNoIChvcGNvZGUpIHsKLQkJY2FzZSBBTUxfQVJHX09QOgorCQllbHNlCisJCQlzd2l0Y2ggKG9wY29kZSkgeworCQkJY2FzZSBBTUxfQVJHX09QOgogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiVW5pbml0aWFsaXplZCBBcmdbJWRdIGF0IG5vZGUgJXBcbiIsCi0JCQkJaW5kZXgsIG5vZGUpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiVW5pbml0aWFsaXplZCBBcmdbJWRdIGF0IG5vZGUgJXBcbiIsCisJCQkJCQkgIGluZGV4LCBub2RlKSk7CiAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1VOSU5JVElBTElaRURfQVJHKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1VOSU5JVElBTElaRURfQVJHKTsKIAotCQljYXNlIEFNTF9MT0NBTF9PUDoKKwkJCWNhc2UgQU1MX0xPQ0FMX09QOgogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiVW5pbml0aWFsaXplZCBMb2NhbFslZF0gYXQgbm9kZSAlcFxuIiwKLQkJCQlpbmRleCwgbm9kZSkpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJVbmluaXRpYWxpemVkIExvY2FsWyVkXSBhdCBub2RlICVwXG4iLAorCQkJCQkJICBpbmRleCwgbm9kZSkpOwogCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9VTklOSVRJQUxJWkVEX0xPQ0FMKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1VOSU5JVElBTElaRURfTE9DQUwpOwogCi0JCWRlZmF1bHQ6Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJOb3QgQXJnL0xvY2FsIG9wY29kZTogJVhcbiIsIG9wY29kZSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOwotCQl9CisJCQlkZWZhdWx0OgorCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm90IEFyZy9Mb2NhbCBvcGNvZGU6ICVYXG4iLAorCQkJCQkJICAgb3Bjb2RlKSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CisJCQl9CiAJfQogCiAJLyoKQEAgLTQ3MiwxMiArNDUwLDExIEBACiAJICogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QKIAkgKi8KIAkqZGVzdF9kZXNjID0gb2JqZWN0OwotCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqZWN0KTsKKwlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqZWN0KTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUKQEAgLTQ5NCwyOSArNDcxLDI1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX3ZhbHVlKHUxNiBvcGNvZGUsCisJCQkJIHUzMiBpbmRleCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfbWV0aG9kX2RhdGFfZGVsZXRlX3ZhbHVlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUiKTsKIAogCS8qIEdldCB0aGUgbmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBhcmcvbG9jYWwgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZShvcGNvZGUsIGluZGV4LCB3YWxrX3N0YXRlLCAmbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9WT0lEOwogCX0KIAogCS8qIEdldCB0aGUgYXNzb2NpYXRlZCBvYmplY3QgKi8KIAotCW9iamVjdCA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJb2JqZWN0ID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCiAJLyoKIAkgKiBVbmRlZmluZSB0aGUgQXJnIG9yIExvY2FsIGJ5IHNldHRpbmcgaXRzIGRlc2NyaXB0b3IKQEAgLTUyNiwxOSArNDk5LDE4IEBACiAJbm9kZS0+b2JqZWN0ID0gTlVMTDsKIAogCWlmICgob2JqZWN0KSAmJgotCQkoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmplY3QpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpKSB7CisJICAgIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSkgewogCQkvKgogCQkgKiBUaGVyZSBpcyBhIHZhbGlkIG9iamVjdC4KIAkJICogRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgYnkgb25lIHRvIGJhbGFuY2UgdGhlCiAJCSAqIGluY3JlbWVudCB3aGVuIHRoZSBvYmplY3Qgd2FzIHN0b3JlZC4KIAkJICovCi0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqZWN0KTsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9iamVjdCk7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19zdG9yZV9vYmplY3RfdG9fbG9jYWwKQEAgLTU1Nyw0MCArNTI5LDM4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19zdG9yZV9vYmplY3RfdG9fbG9jYWwgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfc3RvcmVfb2JqZWN0X3RvX2xvY2FsKHUxNiBvcGNvZGUsCisJCQkgICAgICB1MzIgaW5kZXgsCisJCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpjdXJyZW50X29ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm5ld19vYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqY3VycmVudF9vYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXdfb2JqX2Rlc2M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19zdG9yZV9vYmplY3RfdG9fbG9jYWwiKTsKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiT3Bjb2RlPSVYIEluZGV4PSVkIE9iaj0lcFxuIiwKLQkJb3Bjb2RlLCBpbmRleCwgb2JqX2Rlc2MpKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19zdG9yZV9vYmplY3RfdG9fbG9jYWwiKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJPcGNvZGU9JVggSW5kZXg9JWQgT2JqPSVwXG4iLAorCQkJICBvcGNvZGUsIGluZGV4LCBvYmpfZGVzYykpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIEdldCB0aGUgbmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBhcmcvbG9jYWwgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JY3VycmVudF9vYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJY3VycmVudF9vYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAoY3VycmVudF9vYmpfZGVzYyA9PSBvYmpfZGVzYykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIGFscmVhZHkgaW5zdGFsbGVkIVxuIiwKLQkJCW9ial9kZXNjKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIGFscmVhZHkgaW5zdGFsbGVkIVxuIiwKKwkJCQkgIG9ial9kZXNjKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCkBAIC02MDIsOSArNTcyLDExIEBACiAJICovCiAJbmV3X29ial9kZXNjID0gb2JqX2Rlc2M7CiAJaWYgKG9ial9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID4gMSkgewotCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0IChvYmpfZGVzYywgJm5ld19vYmpfZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3Qob2JqX2Rlc2MsICZuZXdfb2JqX2Rlc2MsCisJCQkJCQkgICAgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKQEAgLTYzMyw0MiArNjA1LDM5IEBACiAJCSAqLwogCQlpZiAob3Bjb2RlID09IEFNTF9BUkdfT1ApIHsKIAkJCS8qCi0JCQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgb2JqZWN0IGlzIHRoZSBjb3JyZWN0IHR5cGUuICBUaGlzIG1heSBiZQotCQkJICogb3ZlcmtpbGwsIGJ1dGl0IGlzIGhlcmUgYmVjYXVzZSByZWZlcmVuY2VzIHdlcmUgTlMgbm9kZXMgaW4KLQkJCSAqICB0aGUgcGFzdC4gIE5vdyB0aGV5IGFyZSBvcGVyYW5kIG9iamVjdHMgb2YgdHlwZSBSZWZlcmVuY2UuCi0JCQkgKi8KLQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKGN1cnJlbnRfb2JqX2Rlc2MpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCQkiSW52YWxpZCBkZXNjcmlwdG9yIHR5cGUgd2hpbGUgc3RvcmluZyB0byBtZXRob2QgYXJnOiBbJXNdXG4iLAotCQkJCQlhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKGN1cnJlbnRfb2JqX2Rlc2MpKSk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOwotCQkJfQotCi0JCQkvKgogCQkJICogSWYgd2UgaGF2ZSBhIHZhbGlkIHJlZmVyZW5jZSBvYmplY3QgdGhhdCBjYW1lIGZyb20gcmVmX29mKCksCiAJCQkgKiBkbyB0aGUgaW5kaXJlY3Qgc3RvcmUKIAkJCSAqLwotCQkJaWYgKChjdXJyZW50X29ial9kZXNjLT5jb21tb24udHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSAmJgotCQkJCShjdXJyZW50X29ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9SRUZfT0ZfT1ApKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCQkJCSJBcmcgKCVwKSBpcyBhbiBvYmpfcmVmKE5vZGUpLCBzdG9yaW5nIGluIG5vZGUgJXBcbiIsCi0JCQkJCQluZXdfb2JqX2Rlc2MsIGN1cnJlbnRfb2JqX2Rlc2MpKTsKKwkJCWlmICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKGN1cnJlbnRfb2JqX2Rlc2MpID09CisJCQkgICAgIEFDUElfREVTQ19UWVBFX09QRVJBTkQpCisJCQkgICAgJiYgKGN1cnJlbnRfb2JqX2Rlc2MtPmNvbW1vbi50eXBlID09CisJCQkJQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkKKwkJCSAgICAmJiAoY3VycmVudF9vYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9PQorCQkJCUFNTF9SRUZfT0ZfT1ApKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCQkJICAiQXJnICglcCkgaXMgYW4gb2JqX3JlZihOb2RlKSwgc3RvcmluZyBpbiBub2RlICVwXG4iLAorCQkJCQkJICBuZXdfb2JqX2Rlc2MsCisJCQkJCQkgIGN1cnJlbnRfb2JqX2Rlc2MpKTsKIAogCQkJCS8qCiAJCQkJICogU3RvcmUgdGhpcyBvYmplY3QgdG8gdGhlIE5vZGUgKHBlcmZvcm0gdGhlIGluZGlyZWN0IHN0b3JlKQogCQkJCSAqIE5PVEU6IE5vIGltcGxpY2l0IGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLCBhcyBwZXIgdGhlIEFDUEkKIAkJCQkgKiBzcGVjaWZpY2F0aW9uIHJ1bGVzIG9uIHN0b3JpbmcgdG8gTG9jYWxzL0FyZ3MuCiAJCQkJICovCi0JCQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZSAobmV3X29ial9kZXNjLAotCQkJCQkJIGN1cnJlbnRfb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QsIHdhbGtfc3RhdGUsCi0JCQkJCQkgQUNQSV9OT19JTVBMSUNJVF9DT05WRVJTSU9OKTsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2V4X3N0b3JlX29iamVjdF90b19ub2RlKG5ld19vYmpfZGVzYywKKwkJCQkJCQkJIGN1cnJlbnRfb2JqX2Rlc2MtPgorCQkJCQkJCQkgcmVmZXJlbmNlLgorCQkJCQkJCQkgb2JqZWN0LAorCQkJCQkJCQkgd2Fsa19zdGF0ZSwKKwkJCQkJCQkJIEFDUElfTk9fSU1QTElDSVRfQ09OVkVSU0lPTik7CiAKIAkJCQkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIGlmIHdlIGNvcGllZCB0aGUgb2JqZWN0IGFib3ZlICovCiAKIAkJCQlpZiAobmV3X29ial9kZXNjICE9IG9ial9kZXNjKSB7Ci0JCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAobmV3X29ial9kZXNjKTsKKwkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG5ld19vYmpfZGVzYyk7CiAJCQkJfQotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAkJfQogCkBAIC02NzYsNyArNjQ1LDcgQEAKIAkJICogRGVsZXRlIHRoZSBleGlzdGluZyBvYmplY3QKIAkJICogYmVmb3JlIHN0b3JpbmcgdGhlIG5ldyBvbmUKIAkJICovCi0JCWFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX3ZhbHVlIChvcGNvZGUsIGluZGV4LCB3YWxrX3N0YXRlKTsKKwkJYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUob3Bjb2RlLCBpbmRleCwgd2Fsa19zdGF0ZSk7CiAJfQogCiAJLyoKQEAgLTY4NCwxOCArNjUzLDE5IEBACiAJICogdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBBcmcgb3IgTG9jYWwuCiAJICogKGluY3JlbWVudHMgdGhlIG9iamVjdCByZWZlcmVuY2UgY291bnQgYnkgb25lKQogCSAqLwotCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlIChvcGNvZGUsIGluZGV4LCBuZXdfb2JqX2Rlc2MsIHdhbGtfc3RhdGUpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlKG9wY29kZSwgaW5kZXgsIG5ld19vYmpfZGVzYywKKwkJCQkJICB3YWxrX3N0YXRlKTsKIAogCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgaWYgd2UgY29waWVkIHRoZSBvYmplY3QgYWJvdmUgKi8KIAogCWlmIChuZXdfb2JqX2Rlc2MgIT0gb2JqX2Rlc2MpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChuZXdfb2JqX2Rlc2MpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UobmV3X29ial9kZXNjKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTcxMiwzOSArNjgyLDMzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX29iamVjdF90eXBlCi1hY3BpX2RzX21ldGhvZF9kYXRhX2dldF90eXBlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2RzX21ldGhvZF9kYXRhX2dldF90eXBlKHUxNiBvcGNvZGUsCisJCQkgICAgIHUzMiBpbmRleCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX21ldGhvZF9kYXRhX2dldF90eXBlIik7CiAKIAkvKiBHZXQgdGhlIG5hbWVzcGFjZSBub2RlIGZvciB0aGUgYXJnL2xvY2FsICovCiAKLQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlIChvcGNvZGUsIGluZGV4LCB3YWxrX3N0YXRlLCAmbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fVkFMVUUgKChBQ1BJX1RZUEVfTk9UX0ZPVU5EKSk7CisJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZShvcGNvZGUsIGluZGV4LCB3YWxrX3N0YXRlLCAmbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9WQUxVRSgoQUNQSV9UWVBFX05PVF9GT1VORCkpOwogCX0KIAogCS8qIEdldCB0aGUgb2JqZWN0ICovCiAKLQlvYmplY3QgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCW9iamVjdCA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAoIW9iamVjdCkgewogCQkvKiBVbmluaXRpYWxpemVkIGxvY2FsL2FyZywgcmV0dXJuIFRZUEVfQU5ZICovCiAKLQkJcmV0dXJuX1ZBTFVFIChBQ1BJX1RZUEVfQU5ZKTsKKwkJcmV0dXJuX1ZBTFVFKEFDUElfVFlQRV9BTlkpOwogCX0KIAogCS8qIEdldCB0aGUgb2JqZWN0IHR5cGUgKi8KIAotCXJldHVybl9WQUxVRSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9iamVjdCkpOworCXJldHVybl9WQUxVRShBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmplY3QpKTsKIH0KICNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29iamVjdC5jCmluZGV4IGJmYmFlNGUuLjhhYzBjZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb2JqZWN0LmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYwpAQCAtNDEsNyArNDEsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KQEAgLTUwLDE0ICs0OSwxMiBAQAogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNvYmplY3QiKQorQUNQSV9NT0RVTEVfTkFNRSgiZHNvYmplY3QiKQogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmpfZGVzY19wdHIpOwotCithY3BpX2RzX2J1aWxkX2ludGVybmFsX29iamVjdChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9ial9kZXNjX3B0cik7CiAKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNzYsMTcgKzczLDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmpfZGVzY19wdHIpCithY3BpX2RzX2J1aWxkX2ludGVybmFsX29iamVjdChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9ial9kZXNjX3B0cikKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19idWlsZF9pbnRlcm5hbF9vYmplY3QiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2J1aWxkX2ludGVybmFsX29iamVjdCIpOwogCiAJKm9ial9kZXNjX3B0ciA9IE5VTEw7CiAJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX05BTUVQQVRIX09QKSB7CkBAIC05Niw0MCArOTAsNDQgQEAKIAkJICogT3RoZXJ3aXNlLCBnbyBhaGVhZCBhbmQgbG9vayBpdCB1cCBub3cKIAkJICovCiAJCWlmICghb3AtPmNvbW1vbi5ub2RlKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKLQkJCQkJICBvcC0+Y29tbW9uLnZhbHVlLnN0cmluZywKLQkJCQkJICBBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkJCSAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCi0JCQkJCSAgTlVMTCwKLQkJCQkJICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopICYob3AtPmNvbW1vbi5ub2RlKSk7CisJCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAorCQkJCQkJb3AtPmNvbW1vbi52YWx1ZS5zdHJpbmcsCisJCQkJCQlBQ1BJX1RZUEVfQU5ZLAorCQkJCQkJQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJCQkJQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwKKwkJCQkJCUFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLCBOVUxMLAorCQkJCQkJKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqKQorCQkJCQkJJihvcC0+Y29tbW9uLm5vZGUpKTsKIAotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCUFDUElfUkVQT1JUX05TRVJST1IgKG9wLT5jb21tb24udmFsdWUuc3RyaW5nLCBzdGF0dXMpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfUkVQT1JUX05TRVJST1Iob3AtPmNvbW1vbi52YWx1ZS5zdHJpbmcsCisJCQkJCQkgICAgc3RhdHVzKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAkJfQogCX0KIAogCS8qIENyZWF0ZSBhbmQgaW5pdCB0aGUgaW50ZXJuYWwgQUNQSSBvYmplY3QgKi8KIAotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0ICgKLQkJCSAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wLT5jb21tb24uYW1sX29wY29kZSkpLT5vYmplY3RfdHlwZSk7CisJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvCisJCQkJCQkgICAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSktPgorCQkJCQkJICBvYmplY3RfdHlwZSk7CiAJaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCAod2Fsa19zdGF0ZSwgb3AsIG9wLT5jb21tb24uYW1sX29wY29kZSwKLQkJCSAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2RzX2luaXRfb2JqZWN0X2Zyb21fb3Aod2Fsa19zdGF0ZSwgb3AsIG9wLT5jb21tb24uYW1sX29wY29kZSwKKwkJCQkJJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJKm9ial9kZXNjX3B0ciA9IG9ial9kZXNjOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqCkBAIC0xNDcsMjAgKzE0NSwxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfYnVmZmVyX29iaiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9ial9kZXNjX3B0cikKK2FjcGlfZHNfYnVpbGRfaW50ZXJuYWxfYnVmZmVyX29iaihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJCSAgdTMyIGJ1ZmZlcl9sZW5ndGgsCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2Rlc2NfcHRyKQogewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpieXRlX2xpc3Q7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX2xpc3RfbGVuZ3RoID0gMDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpieXRlX2xpc3Q7CisJdTMyIGJ5dGVfbGlzdF9sZW5ndGggPSAwOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfYnVpbGRfaW50ZXJuYWxfYnVmZmVyX29iaiIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfYnVpbGRfaW50ZXJuYWxfYnVmZmVyX29iaiIpOwogCiAJb2JqX2Rlc2MgPSAqb2JqX2Rlc2NfcHRyOwogCWlmIChvYmpfZGVzYykgewpAQCAtMTY4LDE0ICsxNjMsMTMgQEAKIAkJICogV2UgYXJlIGV2YWx1YXRpbmcgYSBOYW1lZCBidWZmZXIgb2JqZWN0ICJOYW1lICh4eHh4LCBCdWZmZXIpIi4KIAkJICogVGhlIGJ1ZmZlciBvYmplY3QgYWxyZWFkeSBleGlzdHMgKGZyb20gdGhlIE5TIG5vZGUpCiAJCSAqLwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBDcmVhdGUgYSBuZXcgYnVmZmVyIG9iamVjdCAqLwogCi0JCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfQlVGRkVSKTsKKwkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0JVRkZFUik7CiAJCSpvYmpfZGVzY19wdHIgPSBvYmpfZGVzYzsKIAkJaWYgKCFvYmpfZGVzYykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAl9CiAKQEAgLTE4NCwxNiArMTc4LDE3IEBACiAJICogaW5kaXZpZHVhbCBieXRlcyBvciBhIHN0cmluZyBpbml0aWFsaXplci4gIEluIGVpdGhlciBjYXNlLCBhCiAJICogYnl0ZV9saXN0IGFwcGVhcnMgaW4gdGhlIEFNTC4KIAkgKi8KLQlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsgICAgICAgICAvKiBza2lwIGZpcnN0IGFyZyAqLworCWFyZyA9IG9wLT5jb21tb24udmFsdWUuYXJnOwkvKiBza2lwIGZpcnN0IGFyZyAqLwogCiAJYnl0ZV9saXN0ID0gYXJnLT5uYW1lZC5uZXh0OwogCWlmIChieXRlX2xpc3QpIHsKIAkJaWYgKGJ5dGVfbGlzdC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX0lOVF9CWVRFTElTVF9PUCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkV4cGVjdGluZyBieXRlbGlzdCwgZ290IEFNTCBvcGNvZGUgJVggaW4gb3AgJXBcbiIsCi0JCQkJYnl0ZV9saXN0LT5jb21tb24uYW1sX29wY29kZSwgYnl0ZV9saXN0KSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJFeHBlY3RpbmcgYnl0ZWxpc3QsIGdvdCBBTUwgb3Bjb2RlICVYIGluIG9wICVwXG4iLAorCQkJCQkgIGJ5dGVfbGlzdC0+Y29tbW9uLmFtbF9vcGNvZGUsCisJCQkJCSAgYnl0ZV9saXN0KSk7CiAKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJCXJldHVybiAoQUVfVFlQRSk7CiAJCX0KIApAQCAtMjE0LDMxICsyMDksMjkgQEAKIAogCWlmIChvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCA9PSAwKSB7CiAJCW9ial9kZXNjLT5idWZmZXIucG9pbnRlciA9IE5VTEw7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkiQnVmZmVyIGRlZmluZWQgd2l0aCB6ZXJvIGxlbmd0aCBpbiBBTUwsIGNyZWF0aW5nXG4iKSk7Ci0JfQotCWVsc2UgewotCQlvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKAotCQkJCSAgIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIkJ1ZmZlciBkZWZpbmVkIHdpdGggemVybyBsZW5ndGggaW4gQU1MLCBjcmVhdGluZ1xuIikpOworCX0gZWxzZSB7CisJCW9ial9kZXNjLT5idWZmZXIucG9pbnRlciA9CisJCSAgICBBQ1BJX01FTV9DQUxMT0NBVEUob2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOwogCQlpZiAoIW9ial9kZXNjLT5idWZmZXIucG9pbnRlcikgewotCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKG9ial9kZXNjKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKG9ial9kZXNjKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJLyogSW5pdGlhbGl6ZSBidWZmZXIgZnJvbSB0aGUgYnl0ZV9saXN0IChpZiBwcmVzZW50KSAqLwogCiAJCWlmIChieXRlX2xpc3QpIHsKLQkJCUFDUElfTUVNQ1BZIChvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIGJ5dGVfbGlzdC0+bmFtZWQuZGF0YSwKLQkJCQkJICBieXRlX2xpc3RfbGVuZ3RoKTsKKwkJCUFDUElfTUVNQ1BZKG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkgICAgYnl0ZV9saXN0LT5uYW1lZC5kYXRhLCBieXRlX2xpc3RfbGVuZ3RoKTsKIAkJfQogCX0KIAogCW9ial9kZXNjLT5idWZmZXIuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7Ci0Jb3AtPmNvbW1vbi5ub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9kZXNjOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCW9wLT5jb21tb24ubm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9kZXNjOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iagpAQCAtMjU2LDI4ICsyNDksMjUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2J1aWxkX2ludGVybmFsX3BhY2thZ2Vfb2JqICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9sZW5ndGgsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9ial9kZXNjX3B0cikKK2FjcGlfZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmooc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCQkgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkJICAgdTMyIHBhY2thZ2VfbGVuZ3RoLAorCQkJCSAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmpfZGVzY19wdHIpCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnBhcmVudDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyA9IE5VTEw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2xpc3RfbGVuZ3RoOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcmVudDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyA9IE5VTEw7CisJdTMyIHBhY2thZ2VfbGlzdF9sZW5ndGg7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iaiIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmoiKTsKIAogCS8qIEZpbmQgdGhlIHBhcmVudCBvZiBhIHBvc3NpYmx5IG5lc3RlZCBwYWNrYWdlICovCiAKIAlwYXJlbnQgPSBvcC0+Y29tbW9uLnBhcmVudDsKLQl3aGlsZSAoKHBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApICAgIHx8Ci0JCSAgIChwYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9WQVJfUEFDS0FHRV9PUCkpIHsKKwl3aGlsZSAoKHBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApIHx8CisJICAgICAgIChwYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9WQVJfUEFDS0FHRV9PUCkpIHsKIAkJcGFyZW50ID0gcGFyZW50LT5jb21tb24ucGFyZW50OwogCX0KIApAQCAtMjg3LDEyICsyNzcsMTEgQEAKIAkJICogV2UgYXJlIGV2YWx1YXRpbmcgYSBOYW1lZCBwYWNrYWdlIG9iamVjdCAiTmFtZSAoeHh4eCwgUGFja2FnZSkiLgogCQkgKiBHZXQgdGhlIGV4aXN0aW5nIHBhY2thZ2Ugb2JqZWN0IGZyb20gdGhlIE5TIG5vZGUKIAkJICovCi0JfQotCWVsc2UgewotCQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX1BBQ0tBR0UpOworCX0gZWxzZSB7CisJCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9QQUNLQUdFKTsKIAkJKm9ial9kZXNjX3B0ciA9IG9ial9kZXNjOwogCQlpZiAoIW9ial9kZXNjKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCW9ial9kZXNjLT5wYWNrYWdlLm5vZGUgPSBwYXJlbnQtPmNvbW1vbi5ub2RlOwpAQCAtMzIzLDEyICszMTIsMTMgQEAKIAkgKiBpbmRpdmlkdWFsIG9iamVjdHMpLiBBZGQgYW4gZXh0cmEgcG9pbnRlciBzbG90IHNvCiAJICogdGhhdCB0aGUgbGlzdCBpcyBhbHdheXMgbnVsbCB0ZXJtaW5hdGVkLgogCSAqLwotCW9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzID0gQUNQSV9NRU1fQ0FMTE9DQVRFICgKLQkJCSAoKGFjcGlfc2l6ZSkgb2JqX2Rlc2MtPnBhY2thZ2UuY291bnQgKyAxKSAqIHNpemVvZiAodm9pZCAqKSk7CisJb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMgPSBBQ1BJX01FTV9DQUxMT0NBVEUoKChhY3BpX3NpemUpIG9ial9kZXNjLT4KKwkJCQkJCQkgcGFja2FnZS5jb3VudCArCisJCQkJCQkJIDEpICogc2l6ZW9mKHZvaWQgKikpOwogCiAJaWYgKCFvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50cykgewotCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyAob2JqX2Rlc2MpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKG9ial9kZXNjKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyoKQEAgLTM0MiwxMSArMzMyLDEzIEBACiAJCQkvKiBPYmplY3QgKHBhY2thZ2Ugb3IgYnVmZmVyKSBpcyBhbHJlYWR5IGJ1aWx0ICovCiAKIAkJCW9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzW2ldID0KLQkJCQlBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCBhcmctPmNvbW1vbi5ub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0YXR1cyA9IGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0ICh3YWxrX3N0YXRlLCBhcmcsCi0JCQkJCSAmb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0pOworCQkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwKKwkJCQkJICBhcmctPmNvbW1vbi5ub2RlKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0KHdhbGtfc3RhdGUsIGFyZywKKwkJCQkJCQkgICAgICAgJm9ial9kZXNjLT4KKwkJCQkJCQkgICAgICAgcGFja2FnZS4KKwkJCQkJCQkgICAgICAgZWxlbWVudHNbaV0pOwogCQl9CiAKIAkJaSsrOwpAQCAtMzU0LDExICszNDYsMTAgQEAKIAl9CiAKIAlvYmpfZGVzYy0+cGFja2FnZS5mbGFncyB8PSBBT1BPQkpfREFUQV9WQUxJRDsKLQlvcC0+Y29tbW9uLm5vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCW9wLT5jb21tb24ubm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9kZXNjOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY3JlYXRlX25vZGUKQEAgLTM3NCw1NyArMzY1LDUzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19jcmVhdGVfbm9kZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKQorYWNwaV9kc19jcmVhdGVfbm9kZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2NyZWF0ZV9ub2RlIiwgb3ApOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2NyZWF0ZV9ub2RlIiwgb3ApOwogCiAJLyoKIAkgKiBCZWNhdXNlIG9mIHRoZSBleGVjdXRpb24gcGFzcyB0aHJvdWdoIHRoZSBub24tY29udHJvbC1tZXRob2QKIAkgKiBwYXJ0cyBvZiB0aGUgdGFibGUsIHdlIGNhbiBhcnJpdmUgaGVyZSB0d2ljZS4gIE9ubHkgaW5pdAogCSAqIHRoZSBuYW1lZCBvYmplY3Qgbm9kZSB0aGUgZmlyc3QgdGltZSB0aHJvdWdoCiAJICovCi0JaWYgKGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJaWYgKGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCWlmICghb3AtPmNvbW1vbi52YWx1ZS5hcmcpIHsKIAkJLyogTm8gYXJndW1lbnRzLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvICovCiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogQnVpbGQgYW4gaW50ZXJuYWwgb2JqZWN0IGZvciB0aGUgYXJndW1lbnQocykgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0ICh3YWxrX3N0YXRlLCBvcC0+Y29tbW9uLnZhbHVlLmFyZywKLQkJCSAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0KHdhbGtfc3RhdGUsIG9wLT5jb21tb24udmFsdWUuYXJnLAorCQkJCQkgICAgICAgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogUmUtdHlwZSB0aGUgb2JqZWN0IGFjY29yZGluZyB0byBpdHMgYXJndW1lbnQgKi8KIAotCW5vZGUtPnR5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpOworCW5vZGUtPnR5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYyk7CiAKIAkvKiBBdHRhY2ggb2JqIHRvIG5vZGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCAobm9kZSwgb2JqX2Rlc2MsIG5vZGUtPnR5cGUpOworCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdChub2RlLCBvYmpfZGVzYywgbm9kZS0+dHlwZSk7CiAKIAkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0jZW5kaWYgLyogQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OICovCi0KKyNlbmRpZgkJCQkvKiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04gKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC00NDQsNTUgKzQzMSw1MCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmV0X29ial9kZXNjKQorYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJICAgIHUxNiBvcGNvZGUsCisJCQkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldF9vYmpfZGVzYykKIHsKLQljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAgICpvcF9pbmZvOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wX2luZm87CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19pbml0X29iamVjdF9mcm9tX29wIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19pbml0X29iamVjdF9mcm9tX29wIik7CiAKIAlvYmpfZGVzYyA9ICpyZXRfb2JqX2Rlc2M7Ci0Jb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcGNvZGUpOworCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcGNvZGUpOwogCWlmIChvcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgewogCQkvKiBVbmtub3duIG9wY29kZSAqLwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfVFlQRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKIAl9CiAKIAkvKiBQZXJmb3JtIHBlci1vYmplY3QgaW5pdGlhbGl6YXRpb24gKi8KIAotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCiAJCS8qCiAJCSAqIERlZmVyIGV2YWx1YXRpb24gb2YgQnVmZmVyIHRlcm1fYXJnIG9wZXJhbmQKIAkJICovCi0JCW9ial9kZXNjLT5idWZmZXIubm9kZSAgICAgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKLQkJCQkgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwkJb2JqX2Rlc2MtPmJ1ZmZlci5ub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCisJCSAgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKIAkJb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfc3RhcnQgPSBvcC0+bmFtZWQuZGF0YTsKIAkJb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfbGVuZ3RoID0gb3AtPm5hbWVkLmxlbmd0aDsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAKIAkJLyoKIAkJICogRGVmZXIgZXZhbHVhdGlvbiBvZiBQYWNrYWdlIHRlcm1fYXJnIG9wZXJhbmQKIAkJICovCi0JCW9ial9kZXNjLT5wYWNrYWdlLm5vZGUgICAgID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCi0JCQkJICAgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJCW9ial9kZXNjLT5wYWNrYWdlLm5vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCQlvYmpfZGVzYy0+cGFja2FnZS5hbWxfc3RhcnQgPSBvcC0+bmFtZWQuZGF0YTsKIAkJb2JqX2Rlc2MtPnBhY2thZ2UuYW1sX2xlbmd0aCA9IG9wLT5uYW1lZC5sZW5ndGg7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCiAJCXN3aXRjaCAob3BfaW5mby0+dHlwZSkgewpAQCAtNTI1LDcgKzUwNyw3IEBACiAJCQkJLyogVHJ1bmNhdGUgdmFsdWUgaWYgd2UgYXJlIGV4ZWN1dGluZyBmcm9tIGEgMzItYml0IEFDUEkgdGFibGUgKi8KIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQkJCQlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlIChvYmpfZGVzYyk7CisJCQkJYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZShvYmpfZGVzYyk7CiAjZW5kaWYKIAkJCQlicmVhazsKIApAQCAtNTM2LDMzICs1MTgsMzYgQEAKIAogCQkJZGVmYXVsdDoKIAotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiVW5rbm93biBjb25zdGFudCBvcGNvZGUgJVhcbiIsIG9wY29kZSkpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJVbmtub3duIGNvbnN0YW50IG9wY29kZSAlWFxuIiwKKwkJCQkJCSAgb3Bjb2RlKSk7CiAJCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfVFlQRV9MSVRFUkFMOgogCiAJCQlvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSA9IG9wLT5jb21tb24udmFsdWUuaW50ZWdlcjsKKyNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCisJCQlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlKG9ial9kZXNjKTsKKyNlbmRpZgogCQkJYnJlYWs7CiAKLQogCQlkZWZhdWx0OgotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbmtub3duIEludGVnZXIgdHlwZSAlWFxuIiwKLQkJCQlvcF9pbmZvLT50eXBlKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJVbmtub3duIEludGVnZXIgdHlwZSAlWFxuIiwKKwkJCQkJICBvcF9pbmZvLT50eXBlKSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAogCQlvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIgPSBvcC0+Y29tbW9uLnZhbHVlLnN0cmluZzsKLQkJb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggPSAodTMyKSBBQ1BJX1NUUkxFTiAob3AtPmNvbW1vbi52YWx1ZS5zdHJpbmcpOworCQlvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCA9CisJCSAgICAodTMyKSBBQ1BJX1NUUkxFTihvcC0+Y29tbW9uLnZhbHVlLnN0cmluZyk7CiAKIAkJLyoKIAkJICogVGhlIHN0cmluZyBpcyBjb250YWluZWQgaW4gdGhlIEFDUEkgdGFibGUsIGRvbid0IGV2ZXIgdHJ5CkBAIC01NzEsMTEgKzU1Niw5IEBACiAJCW9ial9kZXNjLT5jb21tb24uZmxhZ3MgfD0gQU9QT0JKX1NUQVRJQ19QT0lOVEVSOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCiAJCXN3aXRjaCAob3BfaW5mby0+dHlwZSkgewpAQCAtNTg3LDE0ICs1NzAsMTcgQEAKIAkJCW9ial9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0ID0gb3Bjb2RlIC0gQU1MX0xPQ0FMX09QOwogCiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAoQU1MX0xPQ0FMX09QLAotCQkJCQkgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsCi0JCQkJCSB3YWxrX3N0YXRlLAotCQkJCQkgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqKSAmb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOworCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZShBTUxfTE9DQUxfT1AsCisJCQkJCQkJICAgICAgb2JqX2Rlc2MtPgorCQkJCQkJCSAgICAgIHJlZmVyZW5jZS5vZmZzZXQsCisJCQkJCQkJICAgICAgd2Fsa19zdGF0ZSwKKwkJCQkJCQkgICAgICAoc3RydWN0CisJCQkJCQkJICAgICAgIGFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCQkgICAgICAgKiopJm9ial9kZXNjLT4KKwkJCQkJCQkgICAgICByZWZlcmVuY2Uub2JqZWN0KTsKICNlbmRpZgogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVDoKIAogCQkJLyogU3BsaXQgdGhlIG9wY29kZSBpbnRvIGEgYmFzZSBvcGNvZGUgKyBvZmZzZXQgKi8KQEAgLTYwMywxNCArNTg5LDE4IEBACiAJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCA9IG9wY29kZSAtIEFNTF9BUkdfT1A7CiAKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0JCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlIChBTUxfQVJHX09QLAotCQkJCQkgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsCi0JCQkJCSB3YWxrX3N0YXRlLAotCQkJCQkgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqKSAmb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOworCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZShBTUxfQVJHX09QLAorCQkJCQkJCSAgICAgIG9ial9kZXNjLT4KKwkJCQkJCQkgICAgICByZWZlcmVuY2Uub2Zmc2V0LAorCQkJCQkJCSAgICAgIHdhbGtfc3RhdGUsCisJCQkJCQkJICAgICAgKHN0cnVjdAorCQkJCQkJCSAgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkJICAgICAgICoqKSZvYmpfZGVzYy0+CisJCQkJCQkJICAgICAgcmVmZXJlbmNlLm9iamVjdCk7CiAjZW5kaWYKIAkJCWJyZWFrOwogCi0JCWRlZmF1bHQ6IC8qIE90aGVyIGxpdGVyYWxzLCBldGMuLiAqLworCQlkZWZhdWx0OgkvKiBPdGhlciBsaXRlcmFscywgZXRjLi4gKi8KIAogCQkJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX05BTUVQQVRIX09QKSB7CiAJCQkJLyogTm9kZSB3YXMgc2F2ZWQgaW4gT3AgKi8KQEAgLTYyMywxNyArNjEzLDE1IEBACiAJCX0KIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbmltcGxlbWVudGVkIGRhdGEgdHlwZTogJVhcbiIsCi0JCQlBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVW5pbXBsZW1lbnRlZCBkYXRhIHR5cGU6ICVYXG4iLAorCQkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSk7CiAKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb3Bjb2RlLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jCmluZGV4IGJhMTNiY2EuLjkzOWQxNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb3Bjb2RlLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYwpAQCAtNDIsNyArNDIsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KQEAgLTUyLDI2ICs1MSwyMSBAQAogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNvcGNvZGUiKQorQUNQSV9NT0RVTEVfTkFNRSgiZHNvcGNvZGUiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzY29wZV9ub2RlLAorCQkJICB1MzIgYW1sX2xlbmd0aCwgdTggKiBhbWxfc3RhcnQpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqc2NvcGVfbm9kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9sZW5ndGgsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sX3N0YXJ0KTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vcGNvZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqYnVmZmVyX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2Zmc2V0X2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbGVuZ3RoX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVzdWx0X2Rlc2MpOwotCithY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkKHUxNiBhbWxfb3Bjb2RlLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYnVmZmVyX2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9mZnNldF9kZXNjLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpsZW5ndGhfZGVzYywKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVzdWx0X2Rlc2MpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTg5LDI2ICs4MywyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnNjb3BlX25vZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9zdGFydCkKK2FjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzY29wZV9ub2RlLAorCQkJICB1MzIgYW1sX2xlbmd0aCwgdTggKiBhbWxfc3RhcnQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3A7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19leGVjdXRlX2FyZ3VtZW50cyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfZXhlY3V0ZV9hcmd1bWVudHMiKTsKIAogCS8qCiAJICogQWxsb2NhdGUgYSBuZXcgcGFyc2VyIG9wIHRvIGJlIHRoZSByb290IG9mIHRoZSBwYXJzZWQgdHJlZQogCSAqLwotCW9wID0gYWNwaV9wc19hbGxvY19vcCAoQU1MX0lOVF9FVkFMX1NVQlRSRUVfT1ApOworCW9wID0gYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX0VWQUxfU1VCVFJFRV9PUCk7CiAJaWYgKCFvcCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCS8qIFNhdmUgdGhlIE5vZGUgZm9yIHVzZSBpbiBhY3BpX3BzX3BhcnNlX2FtbCAqLwpAQCAtMTE3LDE2ICsxMDcsMTcgQEAKIAogCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBwYXJzZXIgc3RhdGUgKi8KIAotCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlICgwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwl3YWxrX3N0YXRlID0gYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZSgwLCBOVUxMLCBOVUxMLCBOVUxMKTsKIAlpZiAoIXdhbGtfc3RhdGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsgKHdhbGtfc3RhdGUsIG9wLCBOVUxMLCBhbWxfc3RhcnQsCi0JCQkgIGFtbF9sZW5ndGgsIE5VTEwsIDEpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSAod2Fsa19zdGF0ZSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIE5VTEwsIGFtbF9zdGFydCwKKwkJCQkgICAgICAgYW1sX2xlbmd0aCwgTlVMTCwgMSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBNYXJrIHRoaXMgcGFyc2UgYXMgYSBkZWZlcnJlZCBvcGNvZGUgKi8KQEAgLTEzNiw1MCArMTI3LDUxIEBACiAKIAkvKiBQYXNzMTogUGFyc2UgdGhlIGVudGlyZSBkZWNsYXJhdGlvbiAqLwogCi0Jc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwgKHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSAob3ApOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwod2Fsa19zdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBHZXQgYW5kIGluaXQgdGhlIE9wIGNyZWF0ZWQgYWJvdmUgKi8KIAogCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7Ci0JYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSAob3ApOworCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUob3ApOwogCiAJLyogRXZhbHVhdGUgdGhlIGRlZmVycmVkIGFyZ3VtZW50cyAqLwogCi0Jb3AgPSBhY3BpX3BzX2FsbG9jX29wIChBTUxfSU5UX0VWQUxfU1VCVFJFRV9PUCk7CisJb3AgPSBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfRVZBTF9TVUJUUkVFX09QKTsKIAlpZiAoIW9wKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJb3AtPmNvbW1vbi5ub2RlID0gc2NvcGVfbm9kZTsKIAogCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBwYXJzZXIgc3RhdGUgKi8KIAotCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlICgwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwl3YWxrX3N0YXRlID0gYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZSgwLCBOVUxMLCBOVUxMLCBOVUxMKTsKIAlpZiAoIXdhbGtfc3RhdGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBFeGVjdXRlIHRoZSBvcGNvZGUgYW5kIGFyZ3VtZW50cyAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrICh3YWxrX3N0YXRlLCBvcCwgTlVMTCwgYW1sX3N0YXJ0LAotCQkJICBhbWxfbGVuZ3RoLCBOVUxMLCAzKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUgKHdhbGtfc3RhdGUpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrKHdhbGtfc3RhdGUsIG9wLCBOVUxMLCBhbWxfc3RhcnQsCisJCQkJICAgICAgIGFtbF9sZW5ndGgsIE5VTEwsIDMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHdhbGtfc3RhdGUpOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyogTWFyayB0aGlzIGV4ZWN1dGlvbiBhcyBhIGRlZmVycmVkIG9wY29kZSAqLwogCiAJd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSA9IG5vZGU7Ci0Jc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwgKHdhbGtfc3RhdGUpOwotCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUgKG9wKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7Ci19CisJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwod2Fsa19zdGF0ZSk7CiAKKyAgICAgIGNsZWFudXA6CisJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTk1LDM4ICsxODcsMzYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYykKK2FjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZXh0cmFfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmV4dHJhX2Rlc2M7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzIiwgb2JqX2Rlc2MpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzIiwgb2JqX2Rlc2MpOwogCiAJaWYgKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBHZXQgdGhlIEFNTCBwb2ludGVyIChtZXRob2Qgb2JqZWN0KSBhbmQgYnVmZmVyX2ZpZWxkIG5vZGUgKi8KIAotCWV4dHJhX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0IChvYmpfZGVzYyk7CisJZXh0cmFfZGVzYyA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3Qob2JqX2Rlc2MpOwogCW5vZGUgPSBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLm5vZGU7CiAKLQlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUgKEFDUElfVFlQRV9CVUZGRVJfRklFTEQsIG5vZGUsIE5VTEwpKTsKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiWyU0LjRzXSBidWZmZXJfZmllbGQgQXJnIEluaXRcbiIsCi0JCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAobm9kZSkpKTsKKwlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUKKwkJCShBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxELCBub2RlLCBOVUxMKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiWyU0LjRzXSBidWZmZXJfZmllbGQgQXJnIEluaXRcbiIsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSkpOwogCiAJLyogRXhlY3V0ZSB0aGUgQU1MIGNvZGUgZm9yIHRoZSB0ZXJtX2FyZyBhcmd1bWVudHMgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMgKG5vZGUsIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlIChub2RlKSwKLQkJCSBleHRyYV9kZXNjLT5leHRyYS5hbWxfbGVuZ3RoLCBleHRyYV9kZXNjLT5leHRyYS5hbWxfc3RhcnQpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzKG5vZGUsIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpLAorCQkJCQkgICBleHRyYV9kZXNjLT5leHRyYS5hbWxfbGVuZ3RoLAorCQkJCQkgICBleHRyYV9kZXNjLT5leHRyYS5hbWxfc3RhcnQpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZ2V0X2J1ZmZlcl9hcmd1bWVudHMKQEAgLTI0MCw0MCArMjMwLDM1IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X2J1ZmZlcl9hcmd1bWVudHMgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKQorYWNwaV9zdGF0dXMgYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19nZXRfYnVmZmVyX2FyZ3VtZW50cyIsIG9ial9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19nZXRfYnVmZmVyX2FyZ3VtZW50cyIsIG9ial9kZXNjKTsKIAogCWlmIChvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogR2V0IHRoZSBCdWZmZXIgbm9kZSAqLwogCiAJbm9kZSA9IG9ial9kZXNjLT5idWZmZXIubm9kZTsKIAlpZiAoIW5vZGUpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiTm8gcG9pbnRlciBiYWNrIHRvIE5TIG5vZGUgaW4gYnVmZmVyIG9iaiAlcFxuIiwgb2JqX2Rlc2MpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIHBvaW50ZXIgYmFjayB0byBOUyBub2RlIGluIGJ1ZmZlciBvYmogJXBcbiIsIG9ial9kZXNjKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJCdWZmZXIgQXJnIEluaXRcbiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJCdWZmZXIgQXJnIEluaXRcbiIpKTsKIAogCS8qIEV4ZWN1dGUgdGhlIEFNTCBjb2RlIGZvciB0aGUgdGVybV9hcmcgYXJndW1lbnRzICovCiAKLQlzdGF0dXMgPSBhY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzIChub2RlLCBub2RlLAotCQkJIG9ial9kZXNjLT5idWZmZXIuYW1sX2xlbmd0aCwgb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfc3RhcnQpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzKG5vZGUsIG5vZGUsCisJCQkJCSAgIG9ial9kZXNjLT5idWZmZXIuYW1sX2xlbmd0aCwKKwkJCQkJICAgb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfc3RhcnQpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzCkBAIC0yODcsNDAgKzI3MiwzNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpCithY3BpX3N0YXR1cyBhY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19nZXRfcGFja2FnZV9hcmd1bWVudHMiLCBvYmpfZGVzYyk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzIiwgb2JqX2Rlc2MpOwogCiAJaWYgKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBHZXQgdGhlIFBhY2thZ2Ugbm9kZSAqLwogCiAJbm9kZSA9IG9ial9kZXNjLT5wYWNrYWdlLm5vZGU7CiAJaWYgKCFub2RlKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJIk5vIHBvaW50ZXIgYmFjayB0byBOUyBub2RlIGluIHBhY2thZ2UgJXBcbiIsIG9ial9kZXNjKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJObyBwb2ludGVyIGJhY2sgdG8gTlMgbm9kZSBpbiBwYWNrYWdlICVwXG4iLAorCQkJCSAgIG9ial9kZXNjKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJQYWNrYWdlIEFyZyBJbml0XG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiUGFja2FnZSBBcmcgSW5pdFxuIikpOwogCiAJLyogRXhlY3V0ZSB0aGUgQU1MIGNvZGUgZm9yIHRoZSB0ZXJtX2FyZyBhcmd1bWVudHMgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMgKG5vZGUsIG5vZGUsCi0JCQkgb2JqX2Rlc2MtPnBhY2thZ2UuYW1sX2xlbmd0aCwgb2JqX2Rlc2MtPnBhY2thZ2UuYW1sX3N0YXJ0KTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyhub2RlLCBub2RlLAorCQkJCQkgICBvYmpfZGVzYy0+cGFja2FnZS5hbWxfbGVuZ3RoLAorCQkJCQkgICBvYmpfZGVzYy0+cGFja2FnZS5hbWxfc3RhcnQpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9yZWdpb25fYXJndW1lbnRzCkBAIC0zMzQsNDQgKzMxNSw0MyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19nZXRfcmVnaW9uX2FyZ3VtZW50cyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpCithY3BpX3N0YXR1cyBhY3BpX2RzX2dldF9yZWdpb25fYXJndW1lbnRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZXh0cmFfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZXh0cmFfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19nZXRfcmVnaW9uX2FyZ3VtZW50cyIsIG9ial9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19nZXRfcmVnaW9uX2FyZ3VtZW50cyIsIG9ial9kZXNjKTsKIAogCWlmIChvYmpfZGVzYy0+cmVnaW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCi0JZXh0cmFfZGVzYyA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QgKG9ial9kZXNjKTsKKwlleHRyYV9kZXNjID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdChvYmpfZGVzYyk7CiAJaWYgKCFleHRyYV9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CiAJfQogCiAJLyogR2V0IHRoZSBSZWdpb24gbm9kZSAqLwogCiAJbm9kZSA9IG9ial9kZXNjLT5yZWdpb24ubm9kZTsKIAotCUFDUElfREVCVUdfRVhFQyAoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUgKEFDUElfVFlQRV9SRUdJT04sIG5vZGUsIE5VTEwpKTsKKwlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUKKwkJCShBQ1BJX1RZUEVfUkVHSU9OLCBub2RlLCBOVUxMKSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiWyU0LjRzXSBvcF9yZWdpb24gQXJnIEluaXQgYXQgQU1MICVwXG4iLAotCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG5vZGUpLCBleHRyYV9kZXNjLT5leHRyYS5hbWxfc3RhcnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkgICJbJTQuNHNdIG9wX3JlZ2lvbiBBcmcgSW5pdCBhdCBBTUwgJXBcbiIsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwKKwkJCSAgZXh0cmFfZGVzYy0+ZXh0cmEuYW1sX3N0YXJ0KSk7CiAKIAkvKiBFeGVjdXRlIHRoZSBhcmd1bWVudCBBTUwgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMgKG5vZGUsIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlIChub2RlKSwKLQkJCSBleHRyYV9kZXNjLT5leHRyYS5hbWxfbGVuZ3RoLCBleHRyYV9kZXNjLT5leHRyYS5hbWxfc3RhcnQpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzKG5vZGUsIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpLAorCQkJCQkgICBleHRyYV9kZXNjLT5leHRyYS5hbWxfbGVuZ3RoLAorCQkJCQkgICBleHRyYV9kZXNjLT5leHRyYS5hbWxfc3RhcnQpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaW5pdGlhbGl6ZV9yZWdpb24KQEAgLTM4NCwyMyArMzY0LDE5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdGlhbGl6ZV9yZWdpb24gKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSkKK2FjcGlfc3RhdHVzIGFjcGlfZHNfaW5pdGlhbGl6ZV9yZWdpb24oYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChvYmpfaGFuZGxlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChvYmpfaGFuZGxlKTsKIAogCS8qIE5hbWVzcGFjZSBpcyBOT1QgbG9ja2VkICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfcmVnaW9uIChvYmpfZGVzYywgRkFMU0UpOworCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24ob2JqX2Rlc2MsIEZBTFNFKTsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZApAQCAtNDE5LDMwICszOTUsMjcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3Bjb2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmJ1ZmZlcl9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9mZnNldF9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmxlbmd0aF9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlc3VsdF9kZXNjKQorYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZCh1MTYgYW1sX29wY29kZSwKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmJ1ZmZlcl9kZXNjLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvZmZzZXRfZGVzYywKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbGVuZ3RoX2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlc3VsdF9kZXNjKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X29mZnNldDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF9jb3VudDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2ZsYWdzOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXUzMiBvZmZzZXQ7CisJdTMyIGJpdF9vZmZzZXQ7CisJdTMyIGJpdF9jb3VudDsKKwl1OCBmaWVsZF9mbGFnczsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfaW5pdF9idWZmZXJfZmllbGQiLCBvYmpfZGVzYyk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfaW5pdF9idWZmZXJfZmllbGQiLCBvYmpfZGVzYyk7CiAKIAkvKiBIb3N0IG9iamVjdCBtdXN0IGJlIGEgQnVmZmVyICovCiAKLQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGJ1ZmZlcl9kZXNjKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlRhcmdldCBvZiBDcmVhdGUgRmllbGQgaXMgbm90IGEgQnVmZmVyIG9iamVjdCAtICVzXG4iLAotCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoYnVmZmVyX2Rlc2MpKSk7CisJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKGJ1ZmZlcl9kZXNjKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVGFyZ2V0IG9mIENyZWF0ZSBGaWVsZCBpcyBub3QgYSBCdWZmZXIgb2JqZWN0IC0gJXNcbiIsCisJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGJ1ZmZlcl9kZXNjKSkpOwogCiAJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTQ1MywxMSArNDI2LDExIEBACiAJICogb3V0IGFzIGEgbmFtZV9zdHJpbmcsIGFuZCBzaG91bGQgdGhlcmVmb3JlIG5vdyBiZSBhIE5TIG5vZGUKIAkgKiBhZnRlciByZXNvbHV0aW9uIGluIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcygpLgogCSAqLwotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHJlc3VsdF9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiKCVzKSBkZXN0aW5hdGlvbiBub3QgYSBOUyBOb2RlIFslc11cbiIsCi0JCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKGFtbF9vcGNvZGUpLAotCQkJCWFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAocmVzdWx0X2Rlc2MpKSk7CisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShyZXN1bHRfZGVzYykgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICIoJXMpIGRlc3RpbmF0aW9uIG5vdCBhIE5TIE5vZGUgWyVzXVxuIiwKKwkJCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKGFtbF9vcGNvZGUpLAorCQkJCSAgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKHJlc3VsdF9kZXNjKSkpOwogCiAJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTQ3NSwxMyArNDQ4LDEzIEBACiAKIAkJZmllbGRfZmxhZ3MgPSBBTUxfRklFTERfQUNDRVNTX0JZVEU7CiAJCWJpdF9vZmZzZXQgPSBvZmZzZXQ7Ci0JCWJpdF9jb3VudCAgPSAodTMyKSBsZW5ndGhfZGVzYy0+aW50ZWdlci52YWx1ZTsKKwkJYml0X2NvdW50ID0gKHUzMikgbGVuZ3RoX2Rlc2MtPmludGVnZXIudmFsdWU7CiAKIAkJLyogTXVzdCBoYXZlIGEgdmFsaWQgKD4wKSBiaXQgY291bnQgKi8KIAogCQlpZiAoYml0X2NvdW50ID09IDApIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJBdHRlbXB0IHRvIGNyZWF0ZV9maWVsZCBvZiBsZW5ndGggMFxuIikpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiQXR0ZW1wdCB0byBjcmVhdGVfZmllbGQgb2YgbGVuZ3RoIDBcbiIpKTsKIAkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1ZBTFVFOwogCQkJZ290byBjbGVhbnVwOwogCQl9CkBAIC00OTIsNyArNDY1LDcgQEAKIAkJLyogT2Zmc2V0IGlzIGluIGJpdHMsIEZpZWxkIGlzIG9uZSBiaXQgKi8KIAogCQliaXRfb2Zmc2V0ID0gb2Zmc2V0OwotCQliaXRfY291bnQgID0gMTsKKwkJYml0X2NvdW50ID0gMTsKIAkJZmllbGRfZmxhZ3MgPSBBTUxfRklFTERfQUNDRVNTX0JZVEU7CiAJCWJyZWFrOwogCkBAIC01MDEsNyArNDc0LDcgQEAKIAkJLyogT2Zmc2V0IGlzIGluIGJ5dGVzLCBmaWVsZCBpcyBvbmUgYnl0ZSAqLwogCiAJCWJpdF9vZmZzZXQgPSA4ICogb2Zmc2V0OwotCQliaXRfY291bnQgID0gODsKKwkJYml0X2NvdW50ID0gODsKIAkJZmllbGRfZmxhZ3MgPSBBTUxfRklFTERfQUNDRVNTX0JZVEU7CiAJCWJyZWFrOwogCkBAIC01MTAsNyArNDgzLDcgQEAKIAkJLyogT2Zmc2V0IGlzIGluIGJ5dGVzLCBmaWVsZCBpcyBvbmUgd29yZCAqLwogCiAJCWJpdF9vZmZzZXQgPSA4ICogb2Zmc2V0OwotCQliaXRfY291bnQgID0gMTY7CisJCWJpdF9jb3VudCA9IDE2OwogCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfV09SRDsKIAkJYnJlYWs7CiAKQEAgLTUxOSw3ICs0OTIsNyBAQAogCQkvKiBPZmZzZXQgaXMgaW4gYnl0ZXMsIGZpZWxkIGlzIG9uZSBkd29yZCAqLwogCiAJCWJpdF9vZmZzZXQgPSA4ICogb2Zmc2V0OwotCQliaXRfY291bnQgID0gMzI7CisJCWJpdF9jb3VudCA9IDMyOwogCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfRFdPUkQ7CiAJCWJyZWFrOwogCkBAIC01MjgsMjkgKzUwMSwyOSBAQAogCQkvKiBPZmZzZXQgaXMgaW4gYnl0ZXMsIGZpZWxkIGlzIG9uZSBxd29yZCAqLwogCiAJCWJpdF9vZmZzZXQgPSA4ICogb2Zmc2V0OwotCQliaXRfY291bnQgID0gNjQ7CisJCWJpdF9jb3VudCA9IDY0OwogCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfUVdPUkQ7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmtub3duIGZpZWxkIGNyZWF0aW9uIG9wY29kZSAlMDJ4XG4iLAotCQkJYW1sX29wY29kZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVua25vd24gZmllbGQgY3JlYXRpb24gb3Bjb2RlICUwMnhcbiIsCisJCQkJICBhbWxfb3Bjb2RlKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyogRW50aXJlIGZpZWxkIG11c3QgZml0IHdpdGhpbiB0aGUgY3VycmVudCBsZW5ndGggb2YgdGhlIGJ1ZmZlciAqLwogCi0JaWYgKChiaXRfb2Zmc2V0ICsgYml0X2NvdW50KSA+Ci0JCSg4ICogKHUzMikgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIkZpZWxkIFslNC40c10gc2l6ZSAlZCBleGNlZWRzIEJ1ZmZlciBbJTQuNHNdIHNpemUgJWQgKGJpdHMpXG4iLAotCQkJIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocmVzdWx0X2Rlc2MpLAotCQkJIGJpdF9vZmZzZXQgKyBiaXRfY291bnQsCi0JCQkgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChidWZmZXJfZGVzYy0+YnVmZmVyLm5vZGUpLAotCQkJIDggKiAodTMyKSBidWZmZXJfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOworCWlmICgoYml0X29mZnNldCArIGJpdF9jb3VudCkgPiAoOCAqICh1MzIpIGJ1ZmZlcl9kZXNjLT5idWZmZXIubGVuZ3RoKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkZpZWxkIFslNC40c10gc2l6ZSAlZCBleGNlZWRzIEJ1ZmZlciBbJTQuNHNdIHNpemUgJWQgKGJpdHMpXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHJlc3VsdF9kZXNjKSwKKwkJCQkgIGJpdF9vZmZzZXQgKyBiaXRfY291bnQsCisJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUoYnVmZmVyX2Rlc2MtPmJ1ZmZlci4KKwkJCQkJCQlub2RlKSwKKwkJCQkgIDggKiAodTMyKSBidWZmZXJfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQlVGRkVSX0xJTUlUOwogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtNTYwLDkgKzUzMyw5IEBACiAJICogRm9yIGZpZWxkX2ZsYWdzLCB1c2UgTE9DS19SVUxFID0gMCAoTk9fTE9DSyksCiAJICogVVBEQVRFX1JVTEUgPSAwIChVUERBVEVfUFJFU0VSVkUpCiAJICovCi0Jc3RhdHVzID0gYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3QgKG9ial9kZXNjLCBmaWVsZF9mbGFncywgMCwKLQkJCSAgYml0X29mZnNldCwgYml0X2NvdW50KTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3Qob2JqX2Rlc2MsIGZpZWxkX2ZsYWdzLCAwLAorCQkJCQkJICBiaXRfb2Zmc2V0LCBiaXRfY291bnQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCkBAIC01NzEsMzUgKzU0NCwzMyBAQAogCS8qIFJlZmVyZW5jZSBjb3VudCBmb3IgYnVmZmVyX2Rlc2MgaW5oZXJpdHMgb2JqX2Rlc2MgY291bnQgKi8KIAogCWJ1ZmZlcl9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gKHUxNikKLQkJKGJ1ZmZlcl9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ICsgb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOworCSAgICAoYnVmZmVyX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgKworCSAgICAgb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOwogCi0KLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCiAJLyogQWx3YXlzIGRlbGV0ZSB0aGUgb3BlcmFuZHMgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2Zmc2V0X2Rlc2MpOwotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoYnVmZmVyX2Rlc2MpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvZmZzZXRfZGVzYyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGJ1ZmZlcl9kZXNjKTsKIAogCWlmIChhbWxfb3Bjb2RlID09IEFNTF9DUkVBVEVfRklFTERfT1ApIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChsZW5ndGhfZGVzYyk7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShsZW5ndGhfZGVzYyk7CiAJfQogCiAJLyogT24gZmFpbHVyZSwgZGVsZXRlIHRoZSByZXN1bHQgZGVzY3JpcHRvciAqLwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHJlc3VsdF9kZXNjKTsgLyogUmVzdWx0IGRlc2NyaXB0b3IgKi8KLQl9Ci0JZWxzZSB7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXN1bHRfZGVzYyk7CS8qIFJlc3VsdCBkZXNjcmlwdG9yICovCisJfSBlbHNlIHsKIAkJLyogTm93IHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggYXJlIHZhbGlkIGZvciB0aGlzIGJ1ZmZlcl9maWVsZCAqLwogCiAJCW9ial9kZXNjLT5idWZmZXJfZmllbGQuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMKQEAgLTYxNSwyNCArNTg2LDIxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19ldmFsX2J1ZmZlcl9maWVsZF9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKK2FjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCQkgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpuZXh0X29wOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dF9vcDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19ldmFsX2J1ZmZlcl9maWVsZF9vcGVyYW5kcyIsIG9wKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19ldmFsX2J1ZmZlcl9maWVsZF9vcGVyYW5kcyIsIG9wKTsKIAogCS8qCiAJICogVGhpcyBpcyB3aGVyZSB3ZSBldmFsdWF0ZSB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIGZpZWxkcyBvZiB0aGUKIAkgKiBjcmVhdGVfeHh4X2ZpZWxkIGRlY2xhcmF0aW9uCiAJICovCi0Jbm9kZSA9ICBvcC0+Y29tbW9uLm5vZGU7CisJbm9kZSA9IG9wLT5jb21tb24ubm9kZTsKIAogCS8qIG5leHRfb3AgcG9pbnRzIHRvIHRoZSBvcCB0aGF0IGhvbGRzIHRoZSBCdWZmZXIgKi8KIApAQCAtNjQwLDMwICs2MDgsMzIgQEAKIAogCS8qIEV2YWx1YXRlL2NyZWF0ZSB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9wZXJhbmRzICovCiAKLQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyAod2Fsa19zdGF0ZSwgbmV4dF9vcCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwgbmV4dF9vcCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CiAJfQogCiAJLyogUmVzb2x2ZSB0aGUgb3BlcmFuZHMgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlLAotCQkJICBBQ1BJX1dBTEtfT1BFUkFORFMsIHdhbGtfc3RhdGUpOworCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUsCisJCQkJCSAgQUNQSV9XQUxLX09QRVJBTkRTLCB3YWxrX3N0YXRlKTsKIAotCUFDUElfRFVNUF9PUEVSQU5EUyAoQUNQSV9XQUxLX09QRVJBTkRTLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAotCQkJICB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMsICJhZnRlciBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMiKTsKKwlBQ1BJX0RVTVBfT1BFUkFORFMoQUNQSV9XQUxLX09QRVJBTkRTLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAorCQkJICAgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzLAorCQkJICAgImFmdGVyIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyIpOwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIiglcykgYmFkIG9wZXJhbmQocykgKCVYKVxuIiwKLQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLCBzdGF0dXMpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIiglcykgYmFkIG9wZXJhbmQocykgKCVYKVxuIiwKKwkJCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wLT5jb21tb24uCisJCQkJCQkJICBhbWxfb3Bjb2RlKSwgc3RhdHVzKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBJbml0aWFsaXplIHRoZSBCdWZmZXIgRmllbGQgKi8KQEAgLTY3MSwyMiArNjQxLDI1IEBACiAJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfQ1JFQVRFX0ZJRUxEX09QKSB7CiAJCS8qIE5PVEU6IFNsaWdodGx5IGRpZmZlcmVudCBvcGVyYW5kcyBmb3IgdGhpcyBvcGNvZGUgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIG9ial9kZXNjLAotCQkJCSB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSwgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0sCi0JCQkJIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzJdLCB3YWxrX3N0YXRlLT5vcGVyYW5kc1szXSk7Ci0JfQotCWVsc2UgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZChvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIG9ial9kZXNjLAorCQkJCQkgICAgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSwKKwkJCQkJICAgICAgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0sCisJCQkJCSAgICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzJdLAorCQkJCQkgICAgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1szXSk7CisJfSBlbHNlIHsKIAkJLyogQWxsIG90aGVyLCBjcmVhdGVfeHh4X2ZpZWxkIG9wY29kZXMgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIG9ial9kZXNjLAotCQkJCSB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSwgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0sCi0JCQkJCQkgIE5VTEwsIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzJdKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZHNfaW5pdF9idWZmZXJfZmllbGQob3AtPmNvbW1vbi5hbWxfb3Bjb2RlLCBvYmpfZGVzYywKKwkJCQkJICAgICAgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0sCisJCQkJCSAgICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzFdLCBOVUxMLAorCQkJCQkgICAgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1syXSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF9yZWdpb25fb3BlcmFuZHMKQEAgLTcwMiwyNSArNjc1LDIyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19ldmFsX3JlZ2lvbl9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKK2FjcGlfZHNfZXZhbF9yZWdpb25fb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9wZXJhbmRfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm5leHRfb3A7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmRfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dF9vcDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19ldmFsX3JlZ2lvbl9vcGVyYW5kcyIsIG9wKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19ldmFsX3JlZ2lvbl9vcGVyYW5kcyIsIG9wKTsKIAogCS8qCiAJICogVGhpcyBpcyB3aGVyZSB3ZSBldmFsdWF0ZSB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIGZpZWxkcyBvZiB0aGUKIAkgKiBvcF9yZWdpb24gZGVjbGFyYXRpb24KIAkgKi8KLQlub2RlID0gIG9wLT5jb21tb24ubm9kZTsKKwlub2RlID0gb3AtPmNvbW1vbi5ub2RlOwogCiAJLyogbmV4dF9vcCBwb2ludHMgdG8gdGhlIG9wIHRoYXQgaG9sZHMgdGhlIHNwYWNlX2lEICovCiAKQEAgLTczMiwyNiArNzAyLDI2IEBACiAKIAkvKiBFdmFsdWF0ZS9jcmVhdGUgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvcGVyYW5kcyAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMgKHdhbGtfc3RhdGUsIG5leHRfb3ApOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzKHdhbGtfc3RhdGUsIG5leHRfb3ApOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBSZXNvbHZlIHRoZSBsZW5ndGggYW5kIGFkZHJlc3Mgb3BlcmFuZHMgdG8gbnVtYmVycyAqLwogCi0Jc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUsCi0JCQkgQUNQSV9XQUxLX09QRVJBTkRTLCB3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMob3AtPmNvbW1vbi5hbWxfb3Bjb2RlLAorCQkJCQkgIEFDUElfV0FMS19PUEVSQU5EUywgd2Fsa19zdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCUFDUElfRFVNUF9PUEVSQU5EUyAoQUNQSV9XQUxLX09QRVJBTkRTLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAotCQkJICAxLCAiYWZ0ZXIgYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzIik7CisJQUNQSV9EVU1QX09QRVJBTkRTKEFDUElfV0FMS19PUEVSQU5EUywgQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJICAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwKKwkJCSAgIDEsICJhZnRlciBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMiKTsKIAotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CiAJfQogCiAJLyoKQEAgLTc2MSw3ICs3MzEsNyBAQAogCW9wZXJhbmRfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtIDFdOwogCiAJb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGggPSAodTMyKSBvcGVyYW5kX2Rlc2MtPmludGVnZXIudmFsdWU7Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvcGVyYW5kX2Rlc2MpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvcGVyYW5kX2Rlc2MpOwogCiAJLyoKIAkgKiBHZXQgdGhlIGFkZHJlc3MgYW5kIHNhdmUgaXQKQEAgLTc3MCwyMiArNzQwLDIxIEBACiAJb3BlcmFuZF9kZXNjID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0gMl07CiAKIAlvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MgPSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQotCQkJICBvcGVyYW5kX2Rlc2MtPmludGVnZXIudmFsdWU7Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvcGVyYW5kX2Rlc2MpOworCSAgICBvcGVyYW5kX2Rlc2MtPmludGVnZXIudmFsdWU7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9wZXJhbmRfZGVzYyk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAicmduX29iaiAlcCBBZGRyICU4LjhYJTguOFggTGVuICVYXG4iLAotCQlvYmpfZGVzYywKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MpLAotCQlvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgInJnbl9vYmogJXAgQWRkciAlOC44WCU4LjhYIExlbiAlWFxuIiwKKwkJCSAgb2JqX2Rlc2MsCisJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MpLAorCQkJICBvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCkpOwogCiAJLyogTm93IHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggYXJlIHZhbGlkIGZvciB0aGlzIG9wcmVnaW9uICovCiAKIAlvYmpfZGVzYy0+cmVnaW9uLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcwpAQCAtODAyLDQ2ICs3NzEsNDQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2V2YWxfZGF0YV9vYmplY3Rfb3BlcmFuZHMgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpCithY3BpX2RzX2V2YWxfZGF0YV9vYmplY3Rfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCQkgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmFyZ19kZXNjOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphcmdfZGVzYzsKKwl1MzIgbGVuZ3RoOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyIpOwogCiAJLyogVGhlIGZpcnN0IG9wZXJhbmQgKGZvciBhbGwgb2YgdGhlc2UgZGF0YSBvYmplY3RzKSBpcyB0aGUgbGVuZ3RoICovCiAKLQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kICh3YWxrX3N0YXRlLCBvcC0+Y29tbW9uLnZhbHVlLmFyZywgMSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZCh3YWxrX3N0YXRlLCBvcC0+Y29tbW9uLnZhbHVlLmFyZywgMSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyAod2Fsa19zdGF0ZS0+b3Bjb2RlLAotCQkJICAmKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLTFdKSwKLQkJCSAgd2Fsa19zdGF0ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKHdhbGtfc3RhdGUtPm9wY29kZSwKKwkJCQkJICAmKHdhbGtfc3RhdGUtPgorCQkJCQkgICAgb3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0KKwkJCQkJCSAgICAgMV0pLCB3YWxrX3N0YXRlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogRXh0cmFjdCBsZW5ndGggb3BlcmFuZCAqLwogCi0JYXJnX2Rlc2MgPSB3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0gMV07CisJYXJnX2Rlc2MgPSB3YWxrX3N0YXRlLT5vcGVyYW5kc1t3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAxXTsKIAlsZW5ndGggPSAodTMyKSBhcmdfZGVzYy0+aW50ZWdlci52YWx1ZTsKIAogCS8qIENsZWFudXAgZm9yIGxlbmd0aCBvcGVyYW5kICovCiAKLQlzdGF0dXMgPSBhY3BpX2RzX29ial9zdGFja19wb3AgKDEsIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfb2JqX3N0YWNrX3BvcCgxLCB3YWxrX3N0YXRlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChhcmdfZGVzYyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGFyZ19kZXNjKTsKIAogCS8qCiAJICogQ3JlYXRlIHRoZSBhY3R1YWwgZGF0YSBvYmplY3QKQEAgLTg0OSwzNyArODE2LDQyIEBACiAJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKIAljYXNlIEFNTF9CVUZGRVJfT1A6CiAKLQkJc3RhdHVzID0gYWNwaV9kc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqICh3YWxrX3N0YXRlLCBvcCwgbGVuZ3RoLCAmb2JqX2Rlc2MpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9kc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqKHdhbGtfc3RhdGUsIG9wLCBsZW5ndGgsCisJCQkJCQkgICAgICAmb2JqX2Rlc2MpOwogCQlicmVhazsKIAogCWNhc2UgQU1MX1BBQ0tBR0VfT1A6CiAJY2FzZSBBTUxfVkFSX1BBQ0tBR0VfT1A6CiAKLQkJc3RhdHVzID0gYWNwaV9kc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iaiAod2Fsa19zdGF0ZSwgb3AsIGxlbmd0aCwgJm9ial9kZXNjKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmood2Fsa19zdGF0ZSwgb3AsIGxlbmd0aCwKKwkJCQkJCSAgICAgICAmb2JqX2Rlc2MpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0JBRF9PUENPREUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9PUENPREUpOwogCX0KIAotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJLyoKIAkJICogUmV0dXJuIHRoZSBvYmplY3QgaW4gdGhlIHdhbGtfc3RhdGUsIHVubGVzcyB0aGUgcGFyZW50IGlzIGEgcGFja2FnZSAtCiAJCSAqIGluIHRoaXMgY2FzZSwgdGhlIHJldHVybiBvYmplY3Qgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHBhcnNlIHRyZWUKIAkJICogZm9yIHRoZSBwYWNrYWdlLgogCQkgKi8KIAkJaWYgKCghb3AtPmNvbW1vbi5wYXJlbnQpIHx8Ci0JCQkoKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfUEFDS0FHRV9PUCkgJiYKLQkJCSAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9WQVJfUEFDS0FHRV9PUCkgJiYKLQkJCSAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9OQU1FX09QKSkpIHsKKwkJICAgICgob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9QQUNLQUdFX09QKSAmJgorCQkgICAgIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0KKwkJICAgICAgQU1MX1ZBUl9QQUNLQUdFX09QKQorCQkgICAgICYmIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0KKwkJCSBBTUxfTkFNRV9PUCkpKSB7CiAJCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gb2JqX2Rlc2M7CiAJCX0KIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3AKQEAgLTg5NSwxOSArODY3LDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApCithY3BpX2RzX2V4ZWNfYmVnaW5fY29udHJvbF9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqY29udHJvbF9zdGF0ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmNvbnRyb2xfc3RhdGU7CiAKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX2V4ZWNfYmVnaW5fY29udHJvbF9vcCIpOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfZXhlY19iZWdpbl9jb250cm9sX29wIik7Ci0KLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiT3A9JXAgT3Bjb2RlPSUyLjJYIFN0YXRlPSVwXG4iLCBvcCwKLQkJb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLCB3YWxrX3N0YXRlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wPSVwIE9wY29kZT0lMi4yWCBTdGF0ZT0lcFxuIiwgb3AsCisJCQkgIG9wLT5jb21tb24uYW1sX29wY29kZSwgd2Fsa19zdGF0ZSkpOwogCiAJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKIAljYXNlIEFNTF9JRl9PUDoKQEAgLTkxOCw3ICs4ODcsNyBAQAogCQkgKiBjb25zdHJ1Y3RzLiBXZSBuZWVkIHRvIG1hbmFnZSB0aGVzZSBhcyBhIHN0YWNrLCBpbiBvcmRlcgogCQkgKiB0byBoYW5kbGUgbmVzdGluZy4KIAkJICovCi0JCWNvbnRyb2xfc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9jb250cm9sX3N0YXRlICgpOworCQljb250cm9sX3N0YXRlID0gYWNwaV91dF9jcmVhdGVfY29udHJvbF9zdGF0ZSgpOwogCQlpZiAoIWNvbnRyb2xfc3RhdGUpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWJyZWFrOwpAQCAtOTI3LDE0ICs4OTYsMTYgQEAKIAkJICogU2F2ZSBhIHBvaW50ZXIgdG8gdGhlIHByZWRpY2F0ZSBmb3IgbXVsdGlwbGUgZXhlY3V0aW9ucwogCQkgKiBvZiBhIGxvb3AKIAkJICovCi0JCWNvbnRyb2xfc3RhdGUtPmNvbnRyb2wuYW1sX3ByZWRpY2F0ZV9zdGFydCA9IHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwgLSAxOwotCQljb250cm9sX3N0YXRlLT5jb250cm9sLnBhY2thZ2VfZW5kID0gd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnBrZ19lbmQ7CisJCWNvbnRyb2xfc3RhdGUtPmNvbnRyb2wuYW1sX3ByZWRpY2F0ZV9zdGFydCA9CisJCSAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sIC0gMTsKKwkJY29udHJvbF9zdGF0ZS0+Y29udHJvbC5wYWNrYWdlX2VuZCA9CisJCSAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUucGtnX2VuZDsKIAkJY29udHJvbF9zdGF0ZS0+Y29udHJvbC5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7CiAKLQogCQkvKiBQdXNoIHRoZSBjb250cm9sIHN0YXRlIG9uIHRoaXMgd2FsaydzIGNvbnRyb2wgc3RhY2sgKi8KIAotCQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSAoJndhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUsIGNvbnRyb2xfc3RhdGUpOworCQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSwKKwkJCQkJICAgY29udHJvbF9zdGF0ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBTUxfRUxTRV9PUDoKQEAgLTk1OSw3ICs5MzAsNiBAQAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V4ZWNfZW5kX2NvbnRyb2xfb3AKQEAgLTk3NSw0NiArOTQ1LDQyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19leGVjX2VuZF9jb250cm9sX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKQorYWNwaV9kc19leGVjX2VuZF9jb250cm9sX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlLAorCQkJICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICogb3ApCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpjb250cm9sX3N0YXRlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqY29udHJvbF9zdGF0ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfZXhlY19lbmRfY29udHJvbF9vcCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19leGVjX2VuZF9jb250cm9sX29wIik7CiAKIAlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewogCWNhc2UgQU1MX0lGX09QOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiW0lGX09QXSBPcD0lcFxuIiwgb3ApKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIltJRl9PUF0gT3A9JXBcbiIsIG9wKSk7CiAKIAkJLyoKIAkJICogU2F2ZSB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgaW4gY2FzZSB0aGVyZSBpcyBhbgogCQkgKiBFTFNFIHRvIGNvbWUKIAkJICovCiAJCXdhbGtfc3RhdGUtPmxhc3RfcHJlZGljYXRlID0KLQkJCSh1OCkgd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnZhbHVlOworCQkgICAgKHU4KSB3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWU7CiAKIAkJLyoKIAkJICogUG9wIHRoZSBjb250cm9sIHN0YXRlIHRoYXQgd2FzIGNyZWF0ZWQgYXQgdGhlIHN0YXJ0CiAJCSAqIG9mIHRoZSBJRiBhbmQgZnJlZSBpdAogCQkgKi8KLQkJY29udHJvbF9zdGF0ZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUgKCZ3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKTsKLQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoY29udHJvbF9zdGF0ZSk7CisJCWNvbnRyb2xfc3RhdGUgPQorCQkgICAgYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSk7CisJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoY29udHJvbF9zdGF0ZSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9FTFNFX09QOgogCiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9XSElMRV9PUDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIltXSElMRV9PUF0gT3A9JXBcbiIsIG9wKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJbV0hJTEVfT1BdIE9wPSVwXG4iLCBvcCkpOwogCiAJCWlmICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWUpIHsKIAkJCS8qIFByZWRpY2F0ZSB3YXMgdHJ1ZSwgZ28gYmFjayBhbmQgZXZhbHVhdGUgaXQgYWdhaW4hICovCkBAIC0xMDIyLDIyICs5ODgsMjQgQEAKIAkJCXN0YXR1cyA9IEFFX0NUUkxfUEVORElORzsKIAkJfQogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkJIltXSElMRV9PUF0gdGVybWluYXRpb24hIE9wPSVwXG4iLG9wKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJICAiW1dISUxFX09QXSB0ZXJtaW5hdGlvbiEgT3A9JXBcbiIsIG9wKSk7CiAKIAkJLyogUG9wIHRoaXMgY29udHJvbCBzdGF0ZSBhbmQgZnJlZSBpdCAqLwogCi0JCWNvbnRyb2xfc3RhdGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlICgmd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSk7CisJCWNvbnRyb2xfc3RhdGUgPQorCQkgICAgYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSk7CiAKLQkJd2Fsa19zdGF0ZS0+YW1sX2xhc3Rfd2hpbGUgPSBjb250cm9sX3N0YXRlLT5jb250cm9sLmFtbF9wcmVkaWNhdGVfc3RhcnQ7Ci0JCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKGNvbnRyb2xfc3RhdGUpOworCQl3YWxrX3N0YXRlLT5hbWxfbGFzdF93aGlsZSA9CisJCSAgICBjb250cm9sX3N0YXRlLT5jb250cm9sLmFtbF9wcmVkaWNhdGVfc3RhcnQ7CisJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoY29udHJvbF9zdGF0ZSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9SRVRVUk5fT1A6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkiW1JFVFVSTl9PUF0gT3A9JXAgQXJnPSVwXG4iLG9wLCBvcC0+Y29tbW9uLnZhbHVlLmFyZykpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIltSRVRVUk5fT1BdIE9wPSVwIEFyZz0lcFxuIiwgb3AsCisJCQkJICBvcC0+Y29tbW9uLnZhbHVlLmFyZykpOwogCiAJCS8qCiAJCSAqIE9uZSBvcHRpb25hbCBvcGVyYW5kIC0tIHRoZSByZXR1cm4gdmFsdWUKQEAgLTEwNDcsMTIgKzEwMTUsMTQgQEAKIAkJaWYgKG9wLT5jb21tb24udmFsdWUuYXJnKSB7CiAJCQkvKiBTaW5jZSB3ZSBoYXZlIGEgcmVhbCBSZXR1cm4oKSwgZGVsZXRlIGFueSBpbXBsaWNpdCByZXR1cm4gKi8KIAotCQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4gKHdhbGtfc3RhdGUpOworCQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4od2Fsa19zdGF0ZSk7CiAKIAkJCS8qIFJldHVybiBzdGF0ZW1lbnQgaGFzIGFuIGltbWVkaWF0ZSBvcGVyYW5kICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzICh3YWxrX3N0YXRlLCBvcC0+Y29tbW9uLnZhbHVlLmFyZyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzKHdhbGtfc3RhdGUsCisJCQkJCQkgICAgb3AtPmNvbW1vbi52YWx1ZS5hcmcpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJcmV0dXJuIChzdGF0dXMpOwogCQkJfQogCkBAIC0xMDYxLDggKzEwMzEsMTAgQEAKIAkJCSAqIGFuIGFyZyBvciBsb2NhbCksIHJlc29sdmUgaXQgbm93IGJlY2F1c2UgaXQgbWF5CiAJCQkgKiBjZWFzZSB0byBleGlzdCBhdCB0aGUgZW5kIG9mIHRoZSBtZXRob2QuCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSAoJndhbGtfc3RhdGUtPm9wZXJhbmRzIFswXSwgd2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSgmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0sCisJCQkJCQkgICAgIHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJcmV0dXJuIChzdGF0dXMpOwogCQkJfQogCkBAIC0xMDcyLDEyICsxMDQ0LDExIEBACiAJCQkgKiBpcyBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiB6ZXJvIQogCQkJICovCiAJCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKCh3YWxrX3N0YXRlLT5yZXN1bHRzKSAmJgotCQkJCSAod2Fsa19zdGF0ZS0+cmVzdWx0cy0+cmVzdWx0cy5udW1fcmVzdWx0cyA+IDApKSB7CisJCX0gZWxzZSBpZiAoKHdhbGtfc3RhdGUtPnJlc3VsdHMpICYmCisJCQkgICAod2Fsa19zdGF0ZS0+cmVzdWx0cy0+cmVzdWx0cy5udW1fcmVzdWx0cyA+IDApKSB7CiAJCQkvKiBTaW5jZSB3ZSBoYXZlIGEgcmVhbCBSZXR1cm4oKSwgZGVsZXRlIGFueSBpbXBsaWNpdCByZXR1cm4gKi8KIAotCQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4gKHdhbGtfc3RhdGUpOworCQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4od2Fsa19zdGF0ZSk7CiAKIAkJCS8qCiAJCQkgKiBUaGUgcmV0dXJuIHZhbHVlIGhhcyBjb21lIGZyb20gYSBwcmV2aW91cyBjYWxjdWxhdGlvbi4KQEAgLTEwODgsNjcgKzEwNTksNzggQEAKIAkJCSAqCiAJCQkgKiBBbGxvdyByZWZlcmVuY2VzIGNyZWF0ZWQgYnkgdGhlIEluZGV4IG9wZXJhdG9yIHRvIHJldHVybiB1bmNoYW5nZWQuCiAJCQkgKi8KLQkJCWlmICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFICh3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm9ial9kZXNjWzBdKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSAmJgotCQkJCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAod2Fsa19zdGF0ZS0+cmVzdWx0cy0+cmVzdWx0cy5vYmpfZGVzYyBbMF0pID09IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpICYmCi0JCQkJKCh3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm9ial9kZXNjIFswXSktPnJlZmVyZW5jZS5vcGNvZGUgIT0gQU1MX0lOREVYX09QKSkgewotCQkJCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSAoJndhbGtfc3RhdGUtPnJlc3VsdHMtPnJlc3VsdHMub2JqX2Rlc2MgWzBdLCB3YWxrX3N0YXRlKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlpZiAoKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRQorCQkJICAgICAod2Fsa19zdGF0ZS0+cmVzdWx0cy0+cmVzdWx0cy5vYmpfZGVzY1swXSkgPT0KKwkJCSAgICAgQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkKKwkJCSAgICAmJgorCQkJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRQorCQkJICAgICAod2Fsa19zdGF0ZS0+cmVzdWx0cy0+cmVzdWx0cy5vYmpfZGVzY1swXSkgPT0KKwkJCSAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkKKwkJCSAgICAmJiAoKHdhbGtfc3RhdGUtPnJlc3VsdHMtPnJlc3VsdHMub2JqX2Rlc2NbMF0pLT4KKwkJCQlyZWZlcmVuY2Uub3Bjb2RlICE9IEFNTF9JTkRFWF9PUCkpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUoJndhbGtfc3RhdGUtPgorCQkJCQkJCSAgICAgcmVzdWx0cy0+cmVzdWx0cy4KKwkJCQkJCQkgICAgIG9ial9kZXNjWzBdLAorCQkJCQkJCSAgICAgd2Fsa19zdGF0ZSk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJCXJldHVybiAoc3RhdHVzKTsKIAkJCQl9CiAJCQl9CiAKLQkJCXdhbGtfc3RhdGUtPnJldHVybl9kZXNjID0gd2Fsa19zdGF0ZS0+cmVzdWx0cy0+cmVzdWx0cy5vYmpfZGVzYyBbMF07Ci0JCX0KLQkJZWxzZSB7CisJCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyA9CisJCQkgICAgd2Fsa19zdGF0ZS0+cmVzdWx0cy0+cmVzdWx0cy5vYmpfZGVzY1swXTsKKwkJfSBlbHNlIHsKIAkJCS8qIE5vIHJldHVybiBvcGVyYW5kICovCiAKIAkJCWlmICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpIHsKLQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFswXSk7CisJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHdhbGtfc3RhdGUtPgorCQkJCQkJCSBvcGVyYW5kc1swXSk7CiAJCQl9CiAKLQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzIFswXSAgICA9IE5VTEw7Ci0JCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgICAgPSAwOwotCQkJd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MgICAgID0gTlVMTDsKKwkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0gTlVMTDsKKwkJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDA7CisJCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyA9IE5VTEw7CiAJCX0KIAotCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkJIkNvbXBsZXRlZCBSRVRVUk5fT1AgU3RhdGU9JXAsIHJldF92YWw9JXBcbiIsCi0JCQl3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYykpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIkNvbXBsZXRlZCBSRVRVUk5fT1AgU3RhdGU9JXAsIHJldF92YWw9JXBcbiIsCisJCQkJICB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYykpOwogCiAJCS8qIEVuZCB0aGUgY29udHJvbCBtZXRob2QgZXhlY3V0aW9uIHJpZ2h0IG5vdyAqLwogCiAJCXN0YXR1cyA9IEFFX0NUUkxfVEVSTUlOQVRFOwogCQlicmVhazsKIAotCiAJY2FzZSBBTUxfTk9PUF9PUDoKIAogCQkvKiBKdXN0IGRvIG5vdGhpbmchICovCiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9CUkVBS19QT0lOVF9PUDoKIAogCQkvKiBDYWxsIHVwIHRvIHRoZSBPUyBzZXJ2aWNlIGxheWVyIHRvIGhhbmRsZSB0aGlzICovCiAKLQkJc3RhdHVzID0gYWNwaV9vc19zaWduYWwgKEFDUElfU0lHTkFMX0JSRUFLUE9JTlQsICJFeGVjdXRlZCBBTUwgQnJlYWtwb2ludCBvcGNvZGUiKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfb3Nfc2lnbmFsKEFDUElfU0lHTkFMX0JSRUFLUE9JTlQsCisJCQkJICAgIkV4ZWN1dGVkIEFNTCBCcmVha3BvaW50IG9wY29kZSIpOwogCiAJCS8qIElmIGFuZCB3aGVuIGl0IHJldHVybnMsIGFsbCBkb25lLiAqLwogCiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9CUkVBS19PUDoKLQljYXNlIEFNTF9DT05USU5VRV9PUDogLyogQUNQSSAyLjAgKi8KLQorCWNhc2UgQU1MX0NPTlRJTlVFX09QOgkvKiBBQ1BJIDIuMCAqLwogCiAJCS8qIFBvcCBhbmQgZGVsZXRlIGNvbnRyb2wgc3RhdGVzIHVudGlsIHdlIGZpbmQgYSB3aGlsZSAqLwogCiAJCXdoaWxlICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlICYmCi0JCQkJKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbnRyb2wub3Bjb2RlICE9IEFNTF9XSElMRV9PUCkpIHsKLQkJCWNvbnRyb2xfc3RhdGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlICgmd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSk7Ci0JCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIChjb250cm9sX3N0YXRlKTsKKwkJICAgICAgICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLm9wY29kZSAhPQorCQkJQU1MX1dISUxFX09QKSkgeworCQkJY29udHJvbF9zdGF0ZSA9CisJCQkgICAgYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+CisJCQkJCQkgICAgICBjb250cm9sX3N0YXRlKTsKKwkJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoY29udHJvbF9zdGF0ZSk7CiAJCX0KIAogCQkvKiBObyB3aGlsZSBmb3VuZD8gKi8KQEAgLTExNTksMjMgKzExNDEsMjMgQEAKIAogCQkvKiBXYXM6IHdhbGtfc3RhdGUtPmFtbF9sYXN0X3doaWxlID0gd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Q29udHJvbC5hbWxfcHJlZGljYXRlX3N0YXJ0OyAqLwogCi0JCXdhbGtfc3RhdGUtPmFtbF9sYXN0X3doaWxlID0gd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC5wYWNrYWdlX2VuZDsKKwkJd2Fsa19zdGF0ZS0+YW1sX2xhc3Rfd2hpbGUgPQorCQkgICAgd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC5wYWNrYWdlX2VuZDsKIAogCQkvKiBSZXR1cm4gc3RhdHVzIGRlcGVuZGluZyBvbiBvcGNvZGUgKi8KIAogCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9CUkVBS19PUCkgewogCQkJc3RhdHVzID0gQUVfQ1RSTF9CUkVBSzsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCXN0YXR1cyA9IEFFX0NUUkxfQ09OVElOVUU7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbmtub3duIGNvbnRyb2wgb3Bjb2RlPSVYIE9wPSVwXG4iLAotCQkJb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLCBvcCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVua25vd24gY29udHJvbCBvcGNvZGU9JVggT3A9JXBcbiIsCisJCQkJICBvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIG9wKSk7CiAKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWJyZWFrOwpAQCAtMTE4Myw0ICsxMTY1LDMgQEAKIAogCXJldHVybiAoc3RhdHVzKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN1dGlscy5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN1dGlscy5jCmluZGV4IDk2MTMzNDkuLjgzYWUxYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzdXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMKQEAgLTQxLDcgKzQxLDYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CkBAIC01MSw4ICs1MCw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY2RlYnVnLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImRzdXRpbHMiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJkc3V0aWxzIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02OCwxMyArNjYsOSBAQAogICogICAgICAgICAgICAgIHBhcmVudCBtZXRob2QgZXhpdHMuKQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQordm9pZCBhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX2NsZWFyX2ltcGxpY2l0X3JldHVybiIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4iKTsKIAogCS8qCiAJICogU2xhY2sgbXVzdCBiZSBlbmFibGVkIGZvciB0aGlzIGZlYXR1cmUKQEAgLTg5LDE2ICs4MywxNSBAQAogCQkgKiBjb21wbGV4IHN0YXRlbWVudHMsIHRoZSBpbXBsaWNpdCByZXR1cm4gdmFsdWUgY2FuIGJlCiAJCSAqIGJ1YmJsZWQgdXAgc2V2ZXJhbCBsZXZlbHMuCiAJCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCSJSZW1vdmluZyByZWZlcmVuY2Ugb24gc3RhbGUgaW1wbGljaXQgcmV0dXJuIG9iaiAlcFxuIiwKLQkJCXdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmopKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkgICJSZW1vdmluZyByZWZlcmVuY2Ugb24gc3RhbGUgaW1wbGljaXQgcmV0dXJuIG9iaiAlcFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmopKTsKIAotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmopOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uod2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaik7CiAJCXdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmogPSBOVUxMOwogCX0KIH0KIAotCiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMTksMjcgKzExMiwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdTgKLWFjcGlfZHNfZG9faW1wbGljaXRfcmV0dXJuICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3JlZmVyZW5jZSkKK2FjcGlfZHNfZG9faW1wbGljaXRfcmV0dXJuKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjLAorCQkJICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwgdTggYWRkX3JlZmVyZW5jZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19kb19pbXBsaWNpdF9yZXR1cm4iKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfZG9faW1wbGljaXRfcmV0dXJuIik7CiAKIAkvKgogCSAqIFNsYWNrIG11c3QgYmUgZW5hYmxlZCBmb3IgdGhpcyBmZWF0dXJlLCBhbmQgd2UgbXVzdAogCSAqIGhhdmUgYSB2YWxpZCByZXR1cm4gb2JqZWN0CiAJICovCi0JaWYgKCghYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKSB8fAotCQkoIXJldHVybl9kZXNjKSkgeworCWlmICgoIWFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgfHwgKCFyZXR1cm5fZGVzYykpIHsKIAkJcmV0dXJuIChGQUxTRSk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkiUmVzdWx0ICVwIHdpbGwgYmUgaW1wbGljaXRseSByZXR1cm5lZDsgUHJldj0lcFxuIiwKLQkJCXJldHVybl9kZXNjLAotCQkJd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICJSZXN1bHQgJXAgd2lsbCBiZSBpbXBsaWNpdGx5IHJldHVybmVkOyBQcmV2PSVwXG4iLAorCQkJICByZXR1cm5fZGVzYywgd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikpOwogCiAJLyoKIAkgKiBEZWxldGUgYW55ICJzdGFsZSIgaW1wbGljaXQgcmV0dXJuIHZhbHVlIGZpcnN0LiBIb3dldmVyLCBpbgpAQCAtMTUxLDIwICsxMzksMTkgQEAKIAkJaWYgKHdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmogPT0gcmV0dXJuX2Rlc2MpIHsKIAkJCXJldHVybiAoVFJVRSk7CiAJCX0KLQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4gKHdhbGtfc3RhdGUpOworCQlhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybih3YWxrX3N0YXRlKTsKIAl9CiAKIAkvKiBTYXZlIHRoZSBpbXBsaWNpdCByZXR1cm4gdmFsdWUsIGFkZCBhIHJlZmVyZW5jZSBpZiByZXF1ZXN0ZWQgKi8KIAogCXdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmogPSByZXR1cm5fZGVzYzsKIAlpZiAoYWRkX3JlZmVyZW5jZSkgewotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKHJldHVybl9kZXNjKTsKKwkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKIAl9CiAKIAlyZXR1cm4gKFRSVUUpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaXNfcmVzdWx0X3VzZWQKQEAgLTE3OSwyMCArMTY2LDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB1OAotYWNwaV9kc19pc19yZXN1bHRfdXNlZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfaXNfcmVzdWx0X3VzZWQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiBvcCwKKwkJICAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlKQogewotCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICAgKnBhcmVudF9pbmZvOworCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICpwYXJlbnRfaW5mbzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfaXNfcmVzdWx0X3VzZWQiLCBvcCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfaXNfcmVzdWx0X3VzZWQiLCBvcCk7CiAKIAkvKiBNdXN0IGhhdmUgYm90aCBhbiBPcCBhbmQgYSBSZXN1bHQgT2JqZWN0ICovCiAKIAlpZiAoIW9wKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTnVsbCBPcFxuIikpOwotCQlyZXR1cm5fVkFMVUUgKFRSVUUpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiTnVsbCBPcFxuIikpOworCQlyZXR1cm5fVkFMVUUoVFJVRSk7CiAJfQogCiAJLyoKQEAgLTIwNCw3ICsxODksOCBAQAogCSAqIE5PVEU6IHRoaXMgaXMgb3B0aW9uYWwgYmVjYXVzZSB0aGUgQVNMIGxhbmd1YWdlIGRvZXMgbm90IGFjdHVhbGx5CiAJICogc3VwcG9ydCB0aGlzIGJlaGF2aW9yLgogCSAqLwotCSh2b2lkKSBhY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybiAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwgd2Fsa19zdGF0ZSwgVFJVRSk7CisJKHZvaWQpYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4od2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwgd2Fsa19zdGF0ZSwKKwkJCQkJIFRSVUUpOwogCiAJLyoKIAkgKiBOb3cgZGV0ZXJtaW5lIGlmIHRoZSBwYXJlbnQgd2lsbCB1c2UgdGhlIHJlc3VsdApAQCAtMjE1LDIyICsyMDEsMjQgQEAKIAkgKiB2aWEgZXhlY3V0ZV9jb250cm9sX21ldGhvZCBoYXMgYSBzY29wZV9vcCBhcyB0aGUgcGFyZW50LgogCSAqLwogCWlmICgoIW9wLT5jb21tb24ucGFyZW50KSB8fAotCQkob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9TQ09QRV9PUCkpIHsKKwkgICAgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfU0NPUEVfT1ApKSB7CiAJCS8qIE5vIHBhcmVudCwgdGhlIHJldHVybiB2YWx1ZSBjYW5ub3QgcG9zc2libHkgYmUgdXNlZCAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkJIkF0IE1ldGhvZCBsZXZlbCwgcmVzdWx0IG9mIFslc10gbm90IHVzZWRcbiIsCi0JCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSkpOwotCQlyZXR1cm5fVkFMVUUgKEZBTFNFKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkgICJBdCBNZXRob2QgbGV2ZWwsIHJlc3VsdCBvZiBbJXNdIG5vdCB1c2VkXG4iLAorCQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi4KKwkJCQkJCQkgIGFtbF9vcGNvZGUpKSk7CisJCXJldHVybl9WQUxVRShGQUxTRSk7CiAJfQogCiAJLyogR2V0IGluZm8gb24gdGhlIHBhcmVudC4gVGhlIHJvb3Rfb3AgaXMgQU1MX1NDT1BFICovCiAKLQlwYXJlbnRfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpOworCXBhcmVudF9pbmZvID0KKwkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKIAlpZiAocGFyZW50X2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVua25vd24gcGFyZW50IG9wY29kZS4gT3A9JXBcbiIsIG9wKSk7Ci0JCXJldHVybl9WQUxVRSAoRkFMU0UpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVua25vd24gcGFyZW50IG9wY29kZS4gT3A9JXBcbiIsIG9wKSk7CisJCXJldHVybl9WQUxVRShGQUxTRSk7CiAJfQogCiAJLyoKQEAgLTI1Niw4ICsyNDQsMTAgQEAKIAkJCSAqIElmIHdlIGFyZSBleGVjdXRpbmcgdGhlIHByZWRpY2F0ZSBBTkQgdGhpcyBpcyB0aGUgcHJlZGljYXRlIG9wLAogCQkJICogd2Ugd2lsbCB1c2UgdGhlIHJldHVybiB2YWx1ZQogCQkJICovCi0JCQlpZiAoKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9PSBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0VYRUNVVElORykgJiYKLQkJCQkod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC5wcmVkaWNhdGVfb3AgPT0gb3ApKSB7CisJCQlpZiAoKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9PQorCQkJICAgICBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0VYRUNVVElORykKKwkJCSAgICAmJiAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC4KKwkJCQlwcmVkaWNhdGVfb3AgPT0gb3ApKSB7CiAJCQkJZ290byByZXN1bHRfdXNlZDsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjcxLDcgKzI2MSw2IEBACiAKIAkJZ290byByZXN1bHRfbm90X3VzZWQ7CiAKLQogCWNhc2UgQU1MX0NMQVNTX0NSRUFURToKIAogCQkvKgpAQCAtMjgwLDE1ICsyNjksMTYgQEAKIAkJICovCiAJCWdvdG8gcmVzdWx0X3VzZWQ7CiAKLQogCWNhc2UgQU1MX0NMQVNTX05BTUVEX09CSkVDVDoKIAotCQlpZiAoKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUkVHSU9OX09QKSAgICAgIHx8Ci0JCQkob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9EQVRBX1JFR0lPTl9PUCkgfHwKLQkJCShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApICAgICB8fAotCQkJKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfVkFSX1BBQ0tBR0VfT1ApIHx8Ci0JCQkob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9CVUZGRVJfT1ApICAgICAgfHwKLQkJCShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOVF9FVkFMX1NVQlRSRUVfT1ApKSB7CisJCWlmICgob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApIHx8CisJCSAgICAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9EQVRBX1JFR0lPTl9PUCkKKwkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApCisJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQlBTUxfVkFSX1BBQ0tBR0VfT1ApCisJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9CVUZGRVJfT1ApCisJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQlBTUxfSU5UX0VWQUxfU1VCVFJFRV9PUCkpIHsKIAkJCS8qCiAJCQkgKiBUaGVzZSBvcGNvZGVzIGFsbG93IHRlcm1fYXJnKHMpIGFzIG9wZXJhbmRzIGFuZCB0aGVyZWZvcmUKIAkJCSAqIHRoZSBvcGVyYW5kcyBjYW4gYmUgbWV0aG9kIGNhbGxzLiAgVGhlIHJlc3VsdCBpcyB1c2VkLgpAQCAtMjk4LDcgKzI4OCw2IEBACiAKIAkJZ290byByZXN1bHRfbm90X3VzZWQ7CiAKLQogCWRlZmF1bHQ6CiAKIAkJLyoKQEAgLTMwOCwyNiArMjk3LDI1IEBACiAJCWdvdG8gcmVzdWx0X3VzZWQ7CiAJfQogCisgICAgICByZXN1bHRfdXNlZDoKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiUmVzdWx0IG9mIFslc10gdXNlZCBieSBQYXJlbnQgWyVzXSBPcD0lcFxuIiwKKwkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwKKwkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi4KKwkJCQkJCSAgYW1sX29wY29kZSksIG9wKSk7CiAKLXJlc3VsdF91c2VkOgotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkiUmVzdWx0IG9mIFslc10gdXNlZCBieSBQYXJlbnQgWyVzXSBPcD0lcFxuIiwKLQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSksCi0JCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpLCBvcCkpOworCXJldHVybl9WQUxVRShUUlVFKTsKIAotCXJldHVybl9WQUxVRSAoVFJVRSk7CisgICAgICByZXN1bHRfbm90X3VzZWQ6CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIlJlc3VsdCBvZiBbJXNdIG5vdCB1c2VkIGJ5IFBhcmVudCBbJXNdIE9wPSVwXG4iLAorCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAorCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLgorCQkJCQkJICBhbWxfb3Bjb2RlKSwgb3ApKTsKIAotCi1yZXN1bHRfbm90X3VzZWQ6Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCSJSZXN1bHQgb2YgWyVzXSBub3QgdXNlZCBieSBQYXJlbnQgWyVzXSBPcD0lcFxuIiwKLQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSksCi0JCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpLCBvcCkpOwotCi0JcmV0dXJuX1ZBTFVFIChGQUxTRSk7CisJcmV0dXJuX1ZBTFVFKEZBTFNFKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2RlbGV0ZV9yZXN1bHRfaWZfbm90X3VzZWQKQEAgLTM0NiwyMCArMzM0LDE3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX2RzX2RlbGV0ZV9yZXN1bHRfaWZfbm90X3VzZWQgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlc3VsdF9vYmosCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXN1bHRfb2JqLAorCQkJCSAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCIsIHJlc3VsdF9vYmopOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2RlbGV0ZV9yZXN1bHRfaWZfbm90X3VzZWQiLCByZXN1bHRfb2JqKTsKIAogCWlmICghb3ApIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJOdWxsIE9wXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJOdWxsIE9wXG4iKSk7CiAJCXJldHVybl9WT0lEOwogCX0KIApAQCAtMzY3LDE5ICszNTIsMTggQEAKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCi0JaWYgKCFhY3BpX2RzX2lzX3Jlc3VsdF91c2VkIChvcCwgd2Fsa19zdGF0ZSkpIHsKKwlpZiAoIWFjcGlfZHNfaXNfcmVzdWx0X3VzZWQob3AsIHdhbGtfc3RhdGUpKSB7CiAJCS8qIE11c3QgcG9wIHRoZSByZXN1bHQgc3RhY2sgKG9ial9kZXNjIHNob3VsZCBiZSBlcXVhbCB0byByZXN1bHRfb2JqKSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3BvcCAoJm9ial9kZXNjLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChyZXN1bHRfb2JqKTsKKwkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfcG9wKCZvYmpfZGVzYywgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJlc3VsdF9vYmopOwogCQl9CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19yZXNvbHZlX29wZXJhbmRzCkBAIC0zOTQsMTYgKzM3OCwxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc29sdmVfb3BlcmFuZHMgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2RzX3Jlc29sdmVfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19yZXNvbHZlX29wZXJhbmRzIiwgd2Fsa19zdGF0ZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfcmVzb2x2ZV9vcGVyYW5kcyIsIHdhbGtfc3RhdGUpOwogCiAJLyoKIAkgKiBBdHRlbXB0IHRvIHJlc29sdmUgZWFjaCBvZiB0aGUgdmFsaWQgb3BlcmFuZHMKQEAgLTQxMSwxNiArMzkxLDE3IEBACiAJICogdGhhdCB0aGUgYWN0dWFsIG9iamVjdHMgYXJlIHBhc3NlZCwgbm90IGNvcGllcyBvZiB0aGUgb2JqZWN0cy4KIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzOyBpKyspIHsKLQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlICgmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0sIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUoJndhbGtfc3RhdGUtPm9wZXJhbmRzW2ldLAorCQkJCQkgICAgIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY2xlYXJfb3BlcmFuZHMKQEAgLTQzMywxNSArNDE0LDExIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9kc19jbGVhcl9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK3ZvaWQgYWNwaV9kc19jbGVhcl9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKwl1MzIgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19jbGVhcl9vcGVyYW5kcyIsIHdhbGtfc3RhdGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2NsZWFyX29wZXJhbmRzIiwgd2Fsa19zdGF0ZSk7CiAKIAkvKiBSZW1vdmUgYSByZWZlcmVuY2Ugb24gZWFjaCBvcGVyYW5kIG9uIHRoZSBzdGFjayAqLwogCkBAIC00NTAsNyArNDI3LDcgQEAKIAkJICogUmVtb3ZlIGEgcmVmZXJlbmNlIHRvIGFsbCBvcGVyYW5kcywgaW5jbHVkaW5nIGJvdGgKIAkJICogIkFyZ3VtZW50cyIgYW5kICJUYXJnZXRzIi4KIAkJICovCi0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pOwogCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSA9IE5VTEw7CiAJfQogCkBAIC00NTksNyArNDM2LDYgQEAKIH0KICNlbmRpZgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY3JlYXRlX29wZXJhbmQKQEAgLTQ3OCwzNyArNDU0LDM2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19jcmVhdGVfb3BlcmFuZCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfaW5kZXgpCithY3BpX2RzX2NyZWF0ZV9vcGVyYW5kKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnLCB1MzIgYXJnX2luZGV4KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9zdHJpbmc7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbmd0aDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpwYXJlbnRfb3A7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGU7Ci0JYWNwaV9pbnRlcnByZXRlcl9tb2RlICAgICAgICAgICBpbnRlcnByZXRlcl9tb2RlOwotCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICAgKm9wX2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJY2hhciAqbmFtZV9zdHJpbmc7CisJdTMyIG5hbWVfbGVuZ3RoOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwYXJlbnRfb3A7CisJdTE2IG9wY29kZTsKKwlhY3BpX2ludGVycHJldGVyX21vZGUgaW50ZXJwcmV0ZXJfbW9kZTsKKwljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqb3BfaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19jcmVhdGVfb3BlcmFuZCIsIGFyZyk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfY3JlYXRlX29wZXJhbmQiLCBhcmcpOwogCiAJLyogQSB2YWxpZCBuYW1lIG11c3QgYmUgbG9va2VkIHVwIGluIHRoZSBuYW1lc3BhY2UgKi8KIAogCWlmICgoYXJnLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX05BTUVQQVRIX09QKSAmJgotCQkoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIkdldHRpbmcgYSBuYW1lOiBBcmc9JXBcbiIsIGFyZykpOworCSAgICAoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILCAiR2V0dGluZyBhIG5hbWU6IEFyZz0lcFxuIiwKKwkJCQkgIGFyZykpOwogCiAJCS8qIEdldCB0aGUgZW50aXJlIG5hbWUgc3RyaW5nIGZyb20gdGhlIEFNTCBzdHJlYW0gKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X2dldF9uYW1lX3N0cmluZyAoQUNQSV9UWVBFX0FOWSwgYXJnLT5jb21tb24udmFsdWUuYnVmZmVyLAotCQkJCSAgJm5hbWVfc3RyaW5nLCAmbmFtZV9sZW5ndGgpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9nZXRfbmFtZV9zdHJpbmcoQUNQSV9UWVBFX0FOWSwKKwkJCQkJICAgIGFyZy0+Y29tbW9uLnZhbHVlLmJ1ZmZlciwKKwkJCQkJICAgICZuYW1lX3N0cmluZywgJm5hbWVfbGVuZ3RoKTsKIAotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQkvKiBBbGwgcHJlZml4ZXMgaGF2ZSBiZWVuIGhhbmRsZWQsIGFuZCB0aGUgbmFtZSBpcyBpbiBuYW1lX3N0cmluZyAqLwpAQCAtNTIzLDEzICs0OTgsMTQgQEAKIAkJICogYWN0dWFsIG9wY29kZSBleGlzdHMuCiAJCSAqLwogCQlpZiAoKHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUpICYmCi0JCQkod2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKSAmJgotCQkJKGFyZ19pbmRleCAhPSAwKSkgewotCQkJb2JqX2Rlc2MgPSBBQ1BJX0NBU1RfUFRSICgKLQkJCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUpOworCQkgICAgKHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkKKwkJICAgICYmIChhcmdfaW5kZXggIT0gMCkpIHsKKwkJCW9ial9kZXNjID0KKwkJCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsCisJCQkJCSAgd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSk7CiAJCQlzdGF0dXMgPSBBRV9PSzsKLQkJfQotCQllbHNlICAgIC8qIEFsbCBvdGhlciBvcGNvZGVzICovIHsKKwkJfSBlbHNlIHsJLyogQWxsIG90aGVyIG9wY29kZXMgKi8KKwogCQkJLyoKIAkJCSAqIERpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG5hbWVzcGFjZSAiY3JlYXRlIiBvcGVyYXRpb24KIAkJCSAqIHZlcnN1cyBhICJsb29rdXAiIG9wZXJhdGlvbiAoSU1PREVfTE9BRF9QQVNTMiB2cy4KQEAgLTUzNyw0MyArNTEzLDUxIEBACiAJCQkgKiBuYW1lc3BhY2Ugb2JqZWN0cyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBjb250cm9sIG1ldGhvZHMuCiAJCQkgKi8KIAkJCXBhcmVudF9vcCA9IGFyZy0+Y29tbW9uLnBhcmVudDsKLQkJCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAocGFyZW50X29wLT5jb21tb24uYW1sX29wY29kZSk7Ci0JCQlpZiAoKG9wX2luZm8tPmZsYWdzICYgQU1MX05TTk9ERSkgJiYKLQkJCQkocGFyZW50X29wLT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfSU5UX01FVEhPRENBTExfT1ApICYmCi0JCQkJKHBhcmVudF9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX1JFR0lPTl9PUCkgJiYKLQkJCQkocGFyZW50X29wLT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfSU5UX05BTUVQQVRIX09QKSkgeworCQkJb3BfaW5mbyA9CisJCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ocGFyZW50X29wLT5jb21tb24uCisJCQkJCQkgICAgYW1sX29wY29kZSk7CisJCQlpZiAoKG9wX2luZm8tPmZsYWdzICYgQU1MX05TTk9ERSkKKwkJCSAgICAmJiAocGFyZW50X29wLT5jb21tb24uYW1sX29wY29kZSAhPQorCQkJCUFNTF9JTlRfTUVUSE9EQ0FMTF9PUCkKKwkJCSAgICAmJiAocGFyZW50X29wLT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfUkVHSU9OX09QKQorCQkJICAgICYmIChwYXJlbnRfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9CisJCQkJQU1MX0lOVF9OQU1FUEFUSF9PUCkpIHsKIAkJCQkvKiBFbnRlciBuYW1lIGludG8gbmFtZXNwYWNlIGlmIG5vdCBmb3VuZCAqLwogCiAJCQkJaW50ZXJwcmV0ZXJfbW9kZSA9IEFDUElfSU1PREVfTE9BRF9QQVNTMjsKLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQkvKiBSZXR1cm4gYSBmYWlsdXJlIGlmIG5hbWUgbm90IGZvdW5kICovCiAKIAkJCQlpbnRlcnByZXRlcl9tb2RlID0gQUNQSV9JTU9ERV9FWEVDVVRFOwogCQkJfQogCi0JCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgbmFtZV9zdHJpbmcsCi0JCQkJCSBBQ1BJX1RZUEVfQU5ZLCBpbnRlcnByZXRlcl9tb2RlLAotCQkJCQkgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCi0JCQkJCSB3YWxrX3N0YXRlLAotCQkJCQkgQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsICZvYmpfZGVzYykpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBuYW1lX3N0cmluZywKKwkJCQkJICAgQUNQSV9UWVBFX0FOWSwgaW50ZXJwcmV0ZXJfbW9kZSwKKwkJCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwKKwkJCQkJICAgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsIHdhbGtfc3RhdGUsCisJCQkJCSAgIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIoc3RydWN0CisJCQkJCQkJCSAgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKKwkJCQkJCQkJICAmb2JqX2Rlc2MpKTsKIAkJCS8qCiAJCQkgKiBUaGUgb25seSBjYXNlIHdoZXJlIHdlIHBhc3MgdGhyb3VnaCAoaWdub3JlKSBhIE5PVF9GT1VORAogCQkJICogZXJyb3IgaXMgZm9yIHRoZSBjb25kX3JlZl9vZiBvcGNvZGUuCiAJCQkgKi8KIAkJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCQkJaWYgKHBhcmVudF9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0NPTkRfUkVGX09GX09QKSB7CisJCQkJaWYgKHBhcmVudF9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCQkgICAgQU1MX0NPTkRfUkVGX09GX09QKSB7CiAJCQkJCS8qCiAJCQkJCSAqIEZvciB0aGUgQ29uZGl0aW9uYWwgUmVmZXJlbmNlIG9wLCBpdCdzIE9LIGlmCiAJCQkJCSAqIHRoZSBuYW1lIGlzIG5vdCBmb3VuZDsgIFdlIGp1c3QgbmVlZCBhIHdheSB0bwogCQkJCQkgKiBpbmRpY2F0ZSB0aGlzIHRvIHRoZSBpbnRlcnByZXRlciwgc2V0IHRoZQogCQkJCQkgKiBvYmplY3QgdG8gdGhlIHJvb3QKIAkJCQkJICovCi0JCQkJCW9ial9kZXNjID0gQUNQSV9DQVNUX1BUUiAoCi0JCQkJCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJCQkJCW9ial9kZXNjID0KKwkJCQkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24KKwkJCQkJCQkgIGFjcGlfb3BlcmFuZF9vYmplY3QsCisJCQkJCQkJICBhY3BpX2dibF9yb290X25vZGUpOwogCQkJCQlzdGF0dXMgPSBBRV9PSzsKLQkJCQl9Ci0JCQkJZWxzZSB7CisJCQkJfSBlbHNlIHsKIAkJCQkJLyoKIAkJCQkJICogV2UganVzdCBwbGFpbiBkaWRuJ3QgZmluZCBpdCAtLSB3aGljaCBpcyBhCiAJCQkJCSAqIHZlcnkgc2VyaW91cyBlcnJvciBhdCB0aGlzIHBvaW50CkBAIC01ODIsMzAgKzU2NiwzMCBAQAogCQkJCX0KIAkJCX0KIAotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCUFDUElfUkVQT1JUX05TRVJST1IgKG5hbWVfc3RyaW5nLCBzdGF0dXMpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihuYW1lX3N0cmluZywgc3RhdHVzKTsKIAkJCX0KIAkJfQogCiAJCS8qIEZyZWUgdGhlIG5hbWVzdHJpbmcgY3JlYXRlZCBhYm92ZSAqLwogCi0JCUFDUElfTUVNX0ZSRUUgKG5hbWVfc3RyaW5nKTsKKwkJQUNQSV9NRU1fRlJFRShuYW1lX3N0cmluZyk7CiAKIAkJLyogQ2hlY2sgc3RhdHVzIGZyb20gdGhlIGxvb2t1cCAqLwogCi0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qIFB1dCB0aGUgcmVzdWx0aW5nIG9iamVjdCBvbnRvIHRoZSBjdXJyZW50IG9iamVjdCBzdGFjayAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZHNfb2JqX3N0YWNrX3B1c2ggKG9ial9kZXNjLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2RzX29ial9zdGFja19wdXNoKG9ial9kZXNjLCB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQotCQlBQ1BJX0RFQlVHR0VSX0VYRUMgKGFjcGlfZGJfZGlzcGxheV9hcmd1bWVudF9vYmplY3QgKG9ial9kZXNjLCB3YWxrX3N0YXRlKSk7Ci0JfQotCWVsc2UgeworCQlBQ1BJX0RFQlVHR0VSX0VYRUMoYWNwaV9kYl9kaXNwbGF5X2FyZ3VtZW50X29iamVjdAorCQkJCSAgIChvYmpfZGVzYywgd2Fsa19zdGF0ZSkpOworCX0gZWxzZSB7CiAJCS8qIENoZWNrIGZvciBudWxsIG5hbWUgY2FzZSAqLwogCiAJCWlmIChhcmctPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfTkFNRVBBVEhfT1ApIHsKQEAgLTYxNSw3NyArNTk5LDgzIEBACiAJCQkgKiBpbiB0aGUgb3JpZ2luYWwgQVNMLiAgQ3JlYXRlIGEgWmVybyBDb25zdGFudCBmb3IgYQogCQkJICogcGxhY2Vob2xkZXIuICAoU3RvcmUgdG8gYSBjb25zdGFudCBpcyBhIE5vb3AuKQogCQkJICovCi0JCQlvcGNvZGUgPSBBTUxfWkVST19PUDsgICAgICAgLyogSGFzIG5vIGFyZ3VtZW50cyEgKi8KKwkJCW9wY29kZSA9IEFNTF9aRVJPX09QOwkvKiBIYXMgbm8gYXJndW1lbnRzISAqLwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCQkiTnVsbCBuYW1lcGF0aDogQXJnPSVwXG4iLCBhcmcpKTsKLQkJfQotCQllbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIk51bGwgbmFtZXBhdGg6IEFyZz0lcFxuIiwgYXJnKSk7CisJCX0gZWxzZSB7CiAJCQlvcGNvZGUgPSBhcmctPmNvbW1vbi5hbWxfb3Bjb2RlOwogCQl9CiAKIAkJLyogR2V0IHRoZSBvYmplY3QgdHlwZSBvZiB0aGUgYXJndW1lbnQgKi8KIAotCQlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wY29kZSk7CisJCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcGNvZGUpOwogCQlpZiAob3BfaW5mby0+b2JqZWN0X3R5cGUgPT0gQUNQSV9UWVBFX0lOVkFMSUQpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0lNUExFTUVOVEVEKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfSU1QTEVNRU5URUQpOwogCQl9CiAKIAkJaWYgKG9wX2luZm8tPmZsYWdzICYgQU1MX0hBU19SRVRWQUwpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCSJBcmd1bWVudCBwcmV2aW91c2x5IGNyZWF0ZWQsIGFscmVhZHkgc3RhY2tlZCBcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIkFyZ3VtZW50IHByZXZpb3VzbHkgY3JlYXRlZCwgYWxyZWFkeSBzdGFja2VkIFxuIikpOwogCi0JCQlBQ1BJX0RFQlVHR0VSX0VYRUMgKGFjcGlfZGJfZGlzcGxheV9hcmd1bWVudF9vYmplY3QgKAotCQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAxXSwgd2Fsa19zdGF0ZSkpOworCQkJQUNQSV9ERUJVR0dFUl9FWEVDKGFjcGlfZGJfZGlzcGxheV9hcmd1bWVudF9vYmplY3QKKwkJCQkJICAgKHdhbGtfc3RhdGUtPgorCQkJCQkgICAgb3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0KKwkJCQkJCSAgICAgMV0sIHdhbGtfc3RhdGUpKTsKIAogCQkJLyoKIAkJCSAqIFVzZSB2YWx1ZSB0aGF0IHdhcyBhbHJlYWR5IHByZXZpb3VzbHkgcmV0dXJuZWQKIAkJCSAqIGJ5IHRoZSBldmFsdWF0aW9uIG9mIHRoaXMgYXJndW1lbnQKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfcG9wX2Zyb21fYm90dG9tICgmb2JqX2Rlc2MsIHdhbGtfc3RhdGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2RzX3Jlc3VsdF9wb3BfZnJvbV9ib3R0b20oJm9ial9kZXNjLAorCQkJCQkJCSAgIHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJLyoKIAkJCQkgKiBPbmx5IGVycm9yIGlzIHVuZGVyZmxvdywgYW5kIHRoaXMgaW5kaWNhdGVzCiAJCQkJICogYSBtaXNzaW5nIG9yIG51bGwgb3BlcmFuZCEKIAkJCQkgKi8KLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIk1pc3Npbmcgb3IgbnVsbCBvcGVyYW5kLCAlc1xuIiwKLQkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJNaXNzaW5nIG9yIG51bGwgb3BlcmFuZCwgJXNcbiIsCisJCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbgorCQkJCQkJICAoc3RhdHVzKSkpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyogQ3JlYXRlIGFuIEFDUElfSU5URVJOQUxfT0JKRUNUIGZvciB0aGUgYXJndW1lbnQgKi8KIAotCQkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKG9wX2luZm8tPm9iamVjdF90eXBlKTsKKwkJCW9ial9kZXNjID0KKwkJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3Qob3BfaW5mby0+CisJCQkJCQkJICAgb2JqZWN0X3R5cGUpOwogCQkJaWYgKCFvYmpfZGVzYykgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJCX0KIAogCQkJLyogSW5pdGlhbGl6ZSB0aGUgbmV3IG9iamVjdCAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfb2JqZWN0X2Zyb21fb3AgKAotCQkJCQkgd2Fsa19zdGF0ZSwgYXJnLCBvcGNvZGUsICZvYmpfZGVzYyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKG9ial9kZXNjKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCh3YWxrX3N0YXRlLCBhcmcsIG9wY29kZSwKKwkJCQkJCQkmb2JqX2Rlc2MpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Mob2JqX2Rlc2MpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCQl9CiAKIAkJLyogUHV0IHRoZSBvcGVyYW5kIG9iamVjdCBvbiB0aGUgb2JqZWN0IHN0YWNrICovCiAKLQkJc3RhdHVzID0gYWNwaV9kc19vYmpfc3RhY2tfcHVzaCAob2JqX2Rlc2MsIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZHNfb2JqX3N0YWNrX3B1c2gob2JqX2Rlc2MsIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKLQkJQUNQSV9ERUJVR0dFUl9FWEVDIChhY3BpX2RiX2Rpc3BsYXlfYXJndW1lbnRfb2JqZWN0IChvYmpfZGVzYywgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHR0VSX0VYRUMoYWNwaV9kYl9kaXNwbGF5X2FyZ3VtZW50X29iamVjdAorCQkJCSAgIChvYmpfZGVzYywgd2Fsa19zdGF0ZSkpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMKQEAgLTcwMiwyOSArNjkyLDI3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqZmlyc3RfYXJnKQorYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpmaXJzdF9hcmcpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmc7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfY291bnQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CisJdTMyIGFyZ19jb3VudCA9IDA7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfY3JlYXRlX29wZXJhbmRzIiwgZmlyc3RfYXJnKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19jcmVhdGVfb3BlcmFuZHMiLCBmaXJzdF9hcmcpOwogCiAJLyogRm9yIGFsbCBhcmd1bWVudHMgaW4gdGhlIGxpc3QuLi4gKi8KIAogCWFyZyA9IGZpcnN0X2FyZzsKIAl3aGlsZSAoYXJnKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmQgKHdhbGtfc3RhdGUsIGFyZywgYXJnX2NvdW50KTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kKHdhbGtfc3RhdGUsIGFyZywgYXJnX2NvdW50KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIkFyZyAjJWQgKCVwKSBkb25lLCBBcmcxPSVwXG4iLAotCQkJYXJnX2NvdW50LCBhcmcsIGZpcnN0X2FyZykpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIkFyZyAjJWQgKCVwKSBkb25lLCBBcmcxPSVwXG4iLCBhcmdfY291bnQsCisJCQkJICBhcmcsIGZpcnN0X2FyZykpOwogCiAJCS8qIE1vdmUgb24gdG8gbmV4dCBhcmd1bWVudCwgaWYgYW55ICovCiAKQEAgLTczMiwyMCArNzIwLDE3IEBACiAJCWFyZ19jb3VudCsrOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAotCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAkvKgogCSAqIFdlIG11c3QgdW5kbyBldmVyeXRoaW5nIGRvbmUgYWJvdmU7IG1lYW5pbmcgdGhhdCB3ZSBtdXN0CiAJICogcG9wIGV2ZXJ5dGhpbmcgb2ZmIG9mIHRoZSBvcGVyYW5kIHN0YWNrIGFuZCBkZWxldGUgdGhvc2UKIAkgKiBvYmplY3RzCiAJICovCi0JKHZvaWQpIGFjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlIChhcmdfY291bnQsIHdhbGtfc3RhdGUpOworCSh2b2lkKWFjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlKGFyZ19jb3VudCwgd2Fsa19zdGF0ZSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIldoaWxlIGNyZWF0aW5nIEFyZyAlZCAtICVzXG4iLAotCQkoYXJnX2NvdW50ICsgMSksIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiV2hpbGUgY3JlYXRpbmcgQXJnICVkIC0gJXNcbiIsCisJCQkgIChhcmdfY291bnQgKyAxKSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dleGVjLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dleGVjLmMKaW5kZXggMTBmNzEzMS4uZTUyMjc2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3ZXhlYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2V4ZWMuYwpAQCAtNDIsNyArNDIsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KQEAgLTUyLDI3ICs1MSwyNiBAQAogI2luY2x1ZGUgPGFjcGkvYWNkZWJ1Zy5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNhc20uaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJkc3dleGVjIikKK0FDUElfTU9EVUxFX05BTUUoImRzd2V4ZWMiKQogCiAvKgogICogRGlzcGF0Y2ggdGFibGUgZm9yIG9wY29kZSBjbGFzc2VzCiAgKi8KLXN0YXRpYyBBQ1BJX0VYRUNVVEVfT1AgICAgICBhY3BpX2dibF9vcF90eXBlX2Rpc3BhdGNoIFtdID0gewotCQkJICBhY3BpX2V4X29wY29kZV8wQV8wVF8xUiwKLQkJCSAgYWNwaV9leF9vcGNvZGVfMUFfMFRfMFIsCi0JCQkgIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzFSLAotCQkJICBhY3BpX2V4X29wY29kZV8xQV8xVF8wUiwKLQkJCSAgYWNwaV9leF9vcGNvZGVfMUFfMVRfMVIsCi0JCQkgIGFjcGlfZXhfb3Bjb2RlXzJBXzBUXzBSLAotCQkJICBhY3BpX2V4X29wY29kZV8yQV8wVF8xUiwKLQkJCSAgYWNwaV9leF9vcGNvZGVfMkFfMVRfMVIsCi0JCQkgIGFjcGlfZXhfb3Bjb2RlXzJBXzJUXzFSLAotCQkJICBhY3BpX2V4X29wY29kZV8zQV8wVF8wUiwKLQkJCSAgYWNwaV9leF9vcGNvZGVfM0FfMVRfMVIsCi0JCQkgIGFjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSfTsKLQorc3RhdGljIEFDUElfRVhFQ1VURV9PUCBhY3BpX2dibF9vcF90eXBlX2Rpc3BhdGNoW10gPSB7CisJYWNwaV9leF9vcGNvZGVfMEFfMFRfMVIsCisJYWNwaV9leF9vcGNvZGVfMUFfMFRfMFIsCisJYWNwaV9leF9vcGNvZGVfMUFfMFRfMVIsCisJYWNwaV9leF9vcGNvZGVfMUFfMVRfMFIsCisJYWNwaV9leF9vcGNvZGVfMUFfMVRfMVIsCisJYWNwaV9leF9vcGNvZGVfMkFfMFRfMFIsCisJYWNwaV9leF9vcGNvZGVfMkFfMFRfMVIsCisJYWNwaV9leF9vcGNvZGVfMkFfMVRfMVIsCisJYWNwaV9leF9vcGNvZGVfMkFfMlRfMVIsCisJYWNwaV9leF9vcGNvZGVfM0FfMFRfMFIsCisJYWNwaV9leF9vcGNvZGVfM0FfMVRfMVIsCisJYWNwaV9leF9vcGNvZGVfNkFfMFRfMVIKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTg4LDY0ICs4Niw2NCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2dldF9wcmVkaWNhdGVfdmFsdWUgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVzdWx0X29iaikgewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbG9jYWxfb2JqX2Rlc2MgPSBOVUxMOworYWNwaV9kc19nZXRfcHJlZGljYXRlX3ZhbHVlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVzdWx0X29iaikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpsb2NhbF9vYmpfZGVzYyA9IE5VTEw7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSIsIHdhbGtfc3RhdGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2dldF9wcmVkaWNhdGVfdmFsdWUiLCB3YWxrX3N0YXRlKTsKIAogCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9IDA7CiAKIAlpZiAocmVzdWx0X29iaikgewotCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9wb3AgKCZvYmpfZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJDb3VsZCBub3QgZ2V0IHJlc3VsdCBmcm9tIHByZWRpY2F0ZSBldmFsdWF0aW9uLCAlc1xuIiwKLQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfcG9wKCZvYmpfZGVzYywgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiQ291bGQgbm90IGdldCByZXN1bHQgZnJvbSBwcmVkaWNhdGUgZXZhbHVhdGlvbiwgJXNcbiIsCisJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KLQl9Ci0JZWxzZSB7Ci0JCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmQgKHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm9wLCAwKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmQod2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+b3AsIDApOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKLQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlICgmd2Fsa19zdGF0ZS0+b3BlcmFuZHMgWzBdLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKCZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSwKKwkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCi0JCW9ial9kZXNjID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHMgWzBdOworCQlvYmpfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCX0KIAogCWlmICghb2JqX2Rlc2MpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTm8gcHJlZGljYXRlIG9ial9kZXNjPSVwIFN0YXRlPSVwXG4iLAotCQkJb2JqX2Rlc2MsIHdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJObyBwcmVkaWNhdGUgb2JqX2Rlc2M9JXAgU3RhdGU9JXBcbiIsCisJCQkJICBvYmpfZGVzYywgd2Fsa19zdGF0ZSkpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX05PX09QRVJBTkQpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwogCX0KIAogCS8qCiAJICogUmVzdWx0IG9mIHByZWRpY2F0ZSBldmFsdWF0aW9uIG11c3QgYmUgYW4gSW50ZWdlcgogCSAqIG9iamVjdC4gSW1wbGljaXRseSBjb252ZXJ0IHRoZSBhcmd1bWVudCBpZiBuZWNlc3NhcnkuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIgKG9ial9kZXNjLCAmbG9jYWxfb2JqX2Rlc2MsIDE2KTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob2JqX2Rlc2MsICZsb2NhbF9vYmpfZGVzYywgMTYpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChsb2NhbF9vYmpfZGVzYykgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiQmFkIHByZWRpY2F0ZSAobm90IGFuIGludGVnZXIpIG9ial9kZXNjPSVwIFN0YXRlPSVwIFR5cGU9JVhcbiIsCi0JCQlvYmpfZGVzYywgd2Fsa19zdGF0ZSwgQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkpOworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShsb2NhbF9vYmpfZGVzYykgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJCYWQgcHJlZGljYXRlIChub3QgYW4gaW50ZWdlcikgb2JqX2Rlc2M9JXAgU3RhdGU9JXAgVHlwZT0lWFxuIiwKKwkJCQkgIG9ial9kZXNjLCB3YWxrX3N0YXRlLAorCQkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSk7CiAKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJZ290byBjbGVhbnVwOwpAQCAtMTUzLDcgKzE1MSw3IEBACiAKIAkvKiBUcnVuY2F0ZSB0aGUgcHJlZGljYXRlIHRvIDMyLWJpdHMgaWYgbmVjZXNzYXJ5ICovCiAKLQlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlIChsb2NhbF9vYmpfZGVzYyk7CisJYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZShsb2NhbF9vYmpfZGVzYyk7CiAKIAkvKgogCSAqIFNhdmUgdGhlIHJlc3VsdCBvZiB0aGUgcHJlZGljYXRlIGV2YWx1YXRpb24gb24KQEAgLTE2MSw4ICsxNTksNyBAQAogCSAqLwogCWlmIChsb2NhbF9vYmpfZGVzYy0+aW50ZWdlci52YWx1ZSkgewogCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWUgPSBUUlVFOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBQcmVkaWNhdGUgaXMgRkFMU0UsIHdlIHdpbGwganVzdCB0b3NzIHRoZQogCQkgKiByZXN0IG9mIHRoZSBwYWNrYWdlCkBAIC0xNzEsMzAgKzE2OCwzMCBAQAogCQlzdGF0dXMgPSBBRV9DVFJMX0ZBTFNFOwogCX0KIAorICAgICAgY2xlYW51cDoKIAotY2xlYW51cDoKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJDb21wbGV0ZWQgYSBwcmVkaWNhdGUgZXZhbD0lWCBPcD0lcFxuIiwKKwkJCSAgd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnZhbHVlLAorCQkJICB3YWxrX3N0YXRlLT5vcCkpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIkNvbXBsZXRlZCBhIHByZWRpY2F0ZSBldmFsPSVYIE9wPSVwXG4iLAotCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWUsIHdhbGtfc3RhdGUtPm9wKSk7CisJLyogQnJlYWsgdG8gZGVidWdnZXIgdG8gZGlzcGxheSByZXN1bHQgKi8KIAotCSAvKiBCcmVhayB0byBkZWJ1Z2dlciB0byBkaXNwbGF5IHJlc3VsdCAqLwotCi0JQUNQSV9ERUJVR0dFUl9FWEVDIChhY3BpX2RiX2Rpc3BsYXlfcmVzdWx0X29iamVjdCAobG9jYWxfb2JqX2Rlc2MsIHdhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHR0VSX0VYRUMoYWNwaV9kYl9kaXNwbGF5X3Jlc3VsdF9vYmplY3QKKwkJCSAgIChsb2NhbF9vYmpfZGVzYywgd2Fsa19zdGF0ZSkpOwogCiAJLyoKIAkgKiBEZWxldGUgdGhlIHByZWRpY2F0ZSByZXN1bHQgb2JqZWN0ICh3ZSBrbm93IHRoYXQKIAkgKiB3ZSBkb24ndCBuZWVkIGl0IGFueW1vcmUpCiAJICovCiAJaWYgKGxvY2FsX29ial9kZXNjICE9IG9ial9kZXNjKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAobG9jYWxfb2JqX2Rlc2MpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UobG9jYWxfb2JqX2Rlc2MpOwogCX0KLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCiAJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID0gQUNQSV9DT05UUk9MX05PUk1BTDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXhlY19iZWdpbl9vcApAQCAtMjExLDM4ICsyMDgsMzkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19leGVjX2JlZ2luX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKipvdXRfb3ApCithY3BpX2RzX2V4ZWNfYmVnaW5fb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvdXRfb3ApCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3A7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZV9jbGFzczsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIG9wY29kZV9jbGFzczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19leGVjX2JlZ2luX29wIiwgd2Fsa19zdGF0ZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfZXhlY19iZWdpbl9vcCIsIHdhbGtfc3RhdGUpOwogCiAJb3AgPSB3YWxrX3N0YXRlLT5vcDsKIAlpZiAoIW9wKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZHNfbG9hZDJfYmVnaW5fb3AgKHdhbGtfc3RhdGUsIG91dF9vcCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9kc19sb2FkMl9iZWdpbl9vcCh3YWxrX3N0YXRlLCBvdXRfb3ApOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJb3AgPSAqb3V0X29wOwogCQl3YWxrX3N0YXRlLT5vcCA9IG9wOwogCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7Ci0JCXdhbGtfc3RhdGUtPm9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKKwkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9CisJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOwogCi0JCWlmIChhY3BpX25zX29wZW5zX3Njb3BlICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5vYmplY3RfdHlwZSkpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCSIoJXMpIFBvcHBpbmcgc2NvcGUgZm9yIE9wICVwXG4iLAotCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAod2Fsa19zdGF0ZS0+b3BfaW5mby0+b2JqZWN0X3R5cGUpLCBvcCkpOworCQlpZiAoYWNwaV9uc19vcGVuc19zY29wZSh3YWxrX3N0YXRlLT5vcF9pbmZvLT5vYmplY3RfdHlwZSkpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIiglcykgUG9wcGluZyBzY29wZSBmb3IgT3AgJXBcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHdhbGtfc3RhdGUtPgorCQkJCQkJCQlvcF9pbmZvLT4KKwkJCQkJCQkJb2JqZWN0X3R5cGUpLAorCQkJCQkgIG9wKSk7CiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfc2NvcGVfc3RhY2tfcG9wICh3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcCh3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCQl9CiAJfQpAQCAtMjUyLDcgKzI1MCw3IEBACiAJCQkqb3V0X29wID0gb3A7CiAJCX0KIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKgpAQCAtMjYxLDE5ICsyNTksMjAgQEAKIAkgKiBTYXZlIHRoaXMga25vd2xlZGdlIGluIHRoZSBjdXJyZW50IHNjb3BlIGRlc2NyaXB0b3IKIAkgKi8KIAlpZiAoKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpICYmCi0JCSh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPT0KLQkJCUFDUElfQ09OVFJPTF9DT05ESVRJT05BTF9FWEVDVVRJTkcpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJFeGVjIHByZWRpY2F0ZSBPcD0lcCBTdGF0ZT0lcFxuIiwKLQkJCQkgIG9wLCB3YWxrX3N0YXRlKSk7CisJICAgICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPT0KKwkgICAgIEFDUElfQ09OVFJPTF9DT05ESVRJT05BTF9FWEVDVVRJTkcpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICJFeGVjIHByZWRpY2F0ZSBPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsCisJCQkJICB3YWxrX3N0YXRlKSk7CiAKLQkJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID0gQUNQSV9DT05UUk9MX1BSRURJQ0FURV9FWEVDVVRJTkc7CisJCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9CisJCSAgICBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0VYRUNVVElORzsKIAogCQkvKiBTYXZlIHN0YXJ0IG9mIHByZWRpY2F0ZSAqLwogCiAJCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbnRyb2wucHJlZGljYXRlX29wID0gb3A7CiAJfQogCi0KIAlvcGNvZGVfY2xhc3MgPSB3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzczsKIAogCS8qIFdlIHdhbnQgdG8gc2VuZCBuYW1lcGF0aHMgdG8gdGhlIGxvYWQgY29kZSAqLwpAQCAtMjg4LDE1ICsyODcsMTQgQEAKIAlzd2l0Y2ggKG9wY29kZV9jbGFzcykgewogCWNhc2UgQU1MX0NMQVNTX0NPTlRST0w6CiAKLQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCAod2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCh3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCi0JCXN0YXR1cyA9IGFjcGlfZHNfZXhlY19iZWdpbl9jb250cm9sX29wICh3YWxrX3N0YXRlLCBvcCk7CisJCXN0YXR1cyA9IGFjcGlfZHNfZXhlY19iZWdpbl9jb250cm9sX29wKHdhbGtfc3RhdGUsIG9wKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX0NMQVNTX05BTUVEX09CSkVDVDoKIAogCQlpZiAod2Fsa19zdGF0ZS0+d2Fsa190eXBlID09IEFDUElfV0FMS19NRVRIT0QpIHsKQEAgLTMwNiwxNSArMzA0LDE0IEBACiAJCQkgKiBvYmplY3QgaXMgdGVtcG9yYXJ5IGFuZCB3aWxsIGJlIGRlbGV0ZWQgdXBvbiBjb21wbGV0aW9uIG9mCiAJCQkgKiB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kLgogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX2RzX2xvYWQyX2JlZ2luX29wICh3YWxrX3N0YXRlLCBOVUxMKTsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfbG9hZDJfYmVnaW5fb3Aod2Fsa19zdGF0ZSwgTlVMTCk7CiAJCX0KIAogCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApIHsKLQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3B1c2ggKHdhbGtfc3RhdGUpOworCQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCh3YWxrX3N0YXRlKTsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBTUxfQ0xBU1NfRVhFQ1VURToKIAljYXNlIEFNTF9DTEFTU19DUkVBVEU6CiAKQEAgLTMyMiwyMCArMzE5LDE4IEBACiAJCSAqIE1vc3Qgb3BlcmF0b3JzIHdpdGggYXJndW1lbnRzLgogCQkgKiBTdGFydCBhIG5ldyByZXN1bHQvb3BlcmFuZCBzdGF0ZQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCAod2Fsa19zdGF0ZSk7CisJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3B1c2god2Fsa19zdGF0ZSk7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKIAkvKiBOb3RoaW5nIHRvIGRvIGhlcmUgZHVyaW5nIG1ldGhvZCBleGVjdXRpb24gKi8KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19leGVjX2VuZF9vcApAQCAtMzUwLDI4ICszNDUsMjUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZXhlY19lbmRfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2RzX2V4ZWNfZW5kX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3A7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX3R5cGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9jbGFzczsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpuZXh0X29wOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmZpcnN0X2FyZzsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIG9wX3R5cGU7CisJdTMyIG9wX2NsYXNzOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuZXh0X29wOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpmaXJzdF9hcmc7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfZXhlY19lbmRfb3AiLCB3YWxrX3N0YXRlKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfZXhlY19lbmRfb3AiLCB3YWxrX3N0YXRlKTsKLQotCi0Jb3AgICAgICA9IHdhbGtfc3RhdGUtPm9wOworCW9wID0gd2Fsa19zdGF0ZS0+b3A7CiAJb3BfdHlwZSA9IHdhbGtfc3RhdGUtPm9wX2luZm8tPnR5cGU7CiAJb3BfY2xhc3MgPSB3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzczsKIAogCWlmIChvcF9jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gb3Bjb2RlICVYXG4iLCBvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfSU1QTEVNRU5URUQpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBvcGNvZGUgJVhcbiIsCisJCQkJICBvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9JTVBMRU1FTlRFRCk7CiAJfQogCiAJZmlyc3RfYXJnID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7CkBAIC0zODQsMjkgKzM3NiwzMSBAQAogCiAJLyogQ2FsbCBkZWJ1Z2dlciBmb3Igc2luZ2xlIHN0ZXAgc3VwcG9ydCAoREVCVUcgYnVpbGQgb25seSkgKi8KIAotCUFDUElfREVCVUdHRVJfRVhFQyAoc3RhdHVzID0gYWNwaV9kYl9zaW5nbGVfc3RlcCAod2Fsa19zdGF0ZSwgb3AsIG9wX2NsYXNzKSk7Ci0JQUNQSV9ERUJVR0dFUl9FWEVDIChpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7cmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpO30pOworCUFDUElfREVCVUdHRVJfRVhFQyhzdGF0dXMgPQorCQkJICAgYWNwaV9kYl9zaW5nbGVfc3RlcCh3YWxrX3N0YXRlLCBvcCwgb3BfY2xhc3MpKTsKKwlBQ1BJX0RFQlVHR0VSX0VYRUMoaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkgICByZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTt9CisJKSA7CiAKIAkvKiBEZWNvZGUgdGhlIE9wY29kZSBDbGFzcyAqLwogCiAJc3dpdGNoIChvcF9jbGFzcykgewotCWNhc2UgQU1MX0NMQVNTX0FSR1VNRU5UOiAgICAvKiBjb25zdGFudHMsIGxpdGVyYWxzLCBldGMuIC0gZG8gbm90aGluZyAqLworCWNhc2UgQU1MX0NMQVNTX0FSR1VNRU5UOgkvKiBjb25zdGFudHMsIGxpdGVyYWxzLCBldGMuIC0gZG8gbm90aGluZyAqLwogCQlicmVhazsKIAotCi0JY2FzZSBBTUxfQ0xBU1NfRVhFQ1VURTogICAgIC8qIG1vc3Qgb3BlcmF0b3JzIHdpdGggYXJndW1lbnRzICovCisJY2FzZSBBTUxfQ0xBU1NfRVhFQ1VURToJLyogbW9zdCBvcGVyYXRvcnMgd2l0aCBhcmd1bWVudHMgKi8KIAogCQkvKiBCdWlsZCByZXNvbHZlZCBvcGVyYW5kIHN0YWNrICovCiAKLQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMgKHdhbGtfc3RhdGUsIGZpcnN0X2FyZyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwgZmlyc3RfYXJnKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAogCQkvKiBEb25lIHdpdGggdGhpcyByZXN1bHQgc3RhdGUgKE5vdyB0aGF0IG9wZXJhbmQgc3RhY2sgaXMgYnVpbHQpICovCiAKLQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wICh3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3Aod2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKQEAgLTQxNyw4NiArNDExLDkzIEBACiAJCWlmICghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05PX09QRVJBTkRfUkVTT0xWRSkpIHsKIAkJCS8qIFJlc29sdmUgYWxsIG9wZXJhbmRzICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyAod2Fsa19zdGF0ZS0+b3Bjb2RlLAotCQkJCQkgJih3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0xXSksCi0JCQkJCSB3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJCQlBQ1BJX0RVTVBfT1BFUkFORFMgKEFDUElfV0FMS19PUEVSQU5EUywgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSwKLQkJCQkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzLCAiYWZ0ZXIgZXhfcmVzb2x2ZV9vcGVyYW5kcyIpOworCQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKHdhbGtfc3RhdGUtPm9wY29kZSwKKwkJCQkJCQkgICYod2Fsa19zdGF0ZS0+CisJCQkJCQkJICAgIG9wZXJhbmRzCisJCQkJCQkJICAgIFt3YWxrX3N0YXRlLT4KKwkJCQkJCQkgICAgIG51bV9vcGVyYW5kcyAtIDFdKSwKKwkJCQkJCQkgIHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJQUNQSV9EVU1QX09QRVJBTkRTKEFDUElfV0FMS19PUEVSQU5EUywKKwkJCQkJCSAgIEFDUElfSU1PREVfRVhFQ1VURSwKKwkJCQkJCSAgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lCisJCQkJCQkgICAod2Fsa19zdGF0ZS0+b3Bjb2RlKSwKKwkJCQkJCSAgIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcywKKwkJCQkJCSAgICJhZnRlciBleF9yZXNvbHZlX29wZXJhbmRzIik7CiAJCQl9CiAJCX0KIAotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJLyoKIAkJCSAqIERpc3BhdGNoIHRoZSByZXF1ZXN0IHRvIHRoZSBhcHByb3ByaWF0ZSBpbnRlcnByZXRlciBoYW5kbGVyCiAJCQkgKiByb3V0aW5lLiAgVGhlcmUgaXMgb25lIHJvdXRpbmUgcGVyIG9wY29kZSAidHlwZSIgYmFzZWQgdXBvbiB0aGUKIAkJCSAqIG51bWJlciBvZiBvcGNvZGUgYXJndW1lbnRzIGFuZCByZXR1cm4gdHlwZS4KIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9nYmxfb3BfdHlwZV9kaXNwYXRjaFtvcF90eXBlXSAod2Fsa19zdGF0ZSk7Ci0JCX0KLQkJZWxzZSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZ2JsX29wX3R5cGVfZGlzcGF0Y2hbb3BfdHlwZV0gKHdhbGtfc3RhdGUpOworCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFRyZWF0IGNvbnN0cnVjdHMgb2YgdGhlIGZvcm0gIlN0b3JlKGxvY2FsX3gsbG9jYWxfeCkiIGFzIG5vb3BzIHdoZW4gdGhlCiAJCQkgKiBMb2NhbCBpcyB1bmluaXRpYWxpemVkLgogCQkJICovCi0JCQlpZiAgKChzdGF0dXMgPT0gQUVfQU1MX1VOSU5JVElBTElaRURfTE9DQUwpICYmCi0JCQkJKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfU1RPUkVfT1ApICYmCi0JCQkJKHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLT5jb21tb24udHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSAmJgotCQkJCSh3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXS0+Y29tbW9uLnR5cGUgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgJiYKLQkJCQkod2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0tPnJlZmVyZW5jZS5vcGNvZGUgPT0KLQkJCQkgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0tPnJlZmVyZW5jZS5vcGNvZGUpICYmCi0JCQkJKHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLT5yZWZlcmVuY2Uub2Zmc2V0ID09Ci0JCQkJIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzFdLT5yZWZlcmVuY2Uub2Zmc2V0KSkgeworCQkJaWYgKChzdGF0dXMgPT0gQUVfQU1MX1VOSU5JVElBTElaRURfTE9DQUwpICYmCisJCQkgICAgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfU1RPUkVfT1ApICYmCisJCQkgICAgKHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLT5jb21tb24udHlwZSA9PQorCQkJICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQorCQkJICAgICYmICh3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXS0+Y29tbW9uLnR5cGUgPT0KKwkJCQlBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQorCQkJICAgICYmICh3YWxrX3N0YXRlLT5vcGVyYW5kc1swXS0+cmVmZXJlbmNlLm9wY29kZSA9PQorCQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzFdLT5yZWZlcmVuY2Uub3Bjb2RlKQorCQkJICAgICYmICh3YWxrX3N0YXRlLT5vcGVyYW5kc1swXS0+cmVmZXJlbmNlLm9mZnNldCA9PQorCQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzFdLT5yZWZlcmVuY2Uub2Zmc2V0KSkgewogCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJbJXNdOiBDb3VsZCBub3QgcmVzb2x2ZSBvcGVyYW5kcywgJXNcbiIsCi0JCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpLAotCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJCX0gZWxzZSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIlslc106IENvdWxkIG5vdCByZXNvbHZlIG9wZXJhbmRzLCAlc1xuIiwKKwkJCQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUKKwkJCQkJCSAgKHdhbGtfc3RhdGUtPm9wY29kZSksCisJCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbgorCQkJCQkJICAoc3RhdHVzKSkpOwogCQkJfQogCQl9CiAKIAkJLyogQWx3YXlzIGRlbGV0ZSB0aGUgYXJndW1lbnQgb2JqZWN0cyBhbmQgY2xlYXIgdGhlIG9wZXJhbmQgc3RhY2sgKi8KIAotCQlhY3BpX2RzX2NsZWFyX29wZXJhbmRzICh3YWxrX3N0YXRlKTsKKwkJYWNwaV9kc19jbGVhcl9vcGVyYW5kcyh3YWxrX3N0YXRlKTsKIAogCQkvKgogCQkgKiBJZiBhIHJlc3VsdCBvYmplY3Qgd2FzIHJldHVybmVkIGZyb20gYWJvdmUsIHB1c2ggaXQgb24gdGhlCiAJCSAqIGN1cnJlbnQgcmVzdWx0IHN0YWNrCiAJCSAqLwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpICYmCi0JCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9wdXNoICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLCB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIHdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19yZXN1bHRfcHVzaCh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLAorCQkJCQkJd2Fsa19zdGF0ZSk7CiAJCX0KIAogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAogCQlzd2l0Y2ggKG9wX3R5cGUpIHsKLQkJY2FzZSBBTUxfVFlQRV9DT05UUk9MOiAgICAvKiBUeXBlIDEgb3Bjb2RlLCBJRi9FTFNFL1dISUxFL05PT1AgKi8KKwkJY2FzZSBBTUxfVFlQRV9DT05UUk9MOgkvKiBUeXBlIDEgb3Bjb2RlLCBJRi9FTFNFL1dISUxFL05PT1AgKi8KIAogCQkJLyogMSBPcGVyYW5kLCAwIGV4dGVybmFsX3Jlc3VsdCwgMCBpbnRlcm5hbF9yZXN1bHQgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9kc19leGVjX2VuZF9jb250cm9sX29wICh3YWxrX3N0YXRlLCBvcCk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX2V4ZWNfZW5kX2NvbnRyb2xfb3Aod2Fsa19zdGF0ZSwgb3ApOwogCiAJCQkvKiBNYWtlIHN1cmUgdG8gcHJvcGVybHkgcG9wIHRoZSByZXN1bHQgc3RhY2sgKi8KIAotCQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcCAod2Fsa19zdGF0ZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QRU5ESU5HKSB7Ci0JCQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wICh3YWxrX3N0YXRlKTsKLQkJCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3Aod2Fsa19zdGF0ZSk7CisJCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BFTkRJTkcpIHsKKwkJCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3Aod2Fsa19zdGF0ZSk7CisJCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQkJCXN0YXR1cyA9IEFFX0NUUkxfUEVORElORzsKIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX1RZUEVfTUVUSE9EX0NBTEw6CiAKIAkJCS8qCkBAIC01MDUsMTYgKzUwNiwyMiBAQAogCQkJICogYSByZWZlcmVuY2UgdG8gaXQuCiAJCQkgKi8KIAkJCWlmICgob3AtPmFzbC5wYXJlbnQpICYmCi0JCQkgICAoKG9wLT5hc2wucGFyZW50LT5hc2wuYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkgfHwKLQkJCQkob3AtPmFzbC5wYXJlbnQtPmFzbC5hbWxfb3Bjb2RlID09IEFNTF9WQVJfUEFDS0FHRV9PUCkpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJCSJNZXRob2QgUmVmZXJlbmNlIGluIGEgUGFja2FnZSwgT3A9JXBcbiIsIG9wKSk7Ci0JCQkJb3AtPmNvbW1vbi5ub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9wLT5hc2wudmFsdWUuYXJnLT5hc2wubm9kZS0+b2JqZWN0OwotCQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob3AtPmFzbC52YWx1ZS5hcmctPmFzbC5ub2RlLT5vYmplY3QpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQkJICAgICgob3AtPmFzbC5wYXJlbnQtPmFzbC5hbWxfb3Bjb2RlID09IEFNTF9QQUNLQUdFX09QKQorCQkJICAgICB8fCAob3AtPmFzbC5wYXJlbnQtPmFzbC5hbWxfb3Bjb2RlID09CisJCQkJIEFNTF9WQVJfUEFDS0FHRV9PUCkpKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJCSAgIk1ldGhvZCBSZWZlcmVuY2UgaW4gYSBQYWNrYWdlLCBPcD0lcFxuIiwKKwkJCQkJCSAgb3ApKTsKKwkJCQlvcC0+Y29tbW9uLm5vZGUgPQorCQkJCSAgICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvcC0+YXNsLnZhbHVlLgorCQkJCSAgICBhcmctPmFzbC5ub2RlLT5vYmplY3Q7CisJCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9wLT5hc2wudmFsdWUuYXJnLT5hc2wuCisJCQkJCQkgICAgICBub2RlLT5vYmplY3QpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCQl9CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiTWV0aG9kIGludm9jYXRpb24sIE9wPSVwXG4iLCBvcCkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJICAiTWV0aG9kIGludm9jYXRpb24sIE9wPSVwXG4iLCBvcCkpOwogCiAJCQkvKgogCQkJICogKEFNTF9NRVRIT0RDQUxMKSBPcC0+QXNsLlZhbHVlLkFyZy0+QXNsLk5vZGUgY29udGFpbnMKQEAgLTUzMSw4ICs1MzgsOCBAQAogCQkJLyoKIAkJCSAqIEdldCB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzIGFuZCBwdXQgdGhlbSBvbiB0aGUgb3BlcmFuZCBzdGFjawogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyAod2Fsa19zdGF0ZSwgbmV4dF9vcCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyh3YWxrX3N0YXRlLCBuZXh0X29wKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCWJyZWFrOwogCQkJfQogCkBAIC01NDEsMTEgKzU0OCwxMSBAQAogCQkJICogd2UgbXVzdCByZXNvbHZlIGFsbCBsb2NhbCByZWZlcmVuY2VzIGhlcmUgKExvY2FsIHZhcmlhYmxlcywKIAkJCSAqIGFyZ3VtZW50cyB0byAqdGhpcyogbWV0aG9kLCBldGMuKQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc29sdmVfb3BlcmFuZHMgKHdhbGtfc3RhdGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJc3RhdHVzID0gYWNwaV9kc19yZXNvbHZlX29wZXJhbmRzKHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJLyogT24gZXJyb3IsIGNsZWFyIGFsbCByZXNvbHZlZCBvcGVyYW5kcyAqLwogCi0JCQkJYWNwaV9kc19jbGVhcl9vcGVyYW5kcyAod2Fsa19zdGF0ZSk7CisJCQkJYWNwaV9kc19jbGVhcl9vcGVyYW5kcyh3YWxrX3N0YXRlKTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtNTU5LDI3ICs1NjYsMjggQEAKIAkJCSAqIFJldHVybiBub3c7IHdlIGRvbid0IHdhbnQgdG8gZGlzdHVyYiBhbnl0aGluZywKIAkJCSAqIGVzcGVjaWFsbHkgdGhlIG9wZXJhbmQgY291bnQhCiAJCQkgKi8KLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLQorCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAKIAkJY2FzZSBBTUxfVFlQRV9DUkVBVEVfRklFTEQ6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkJIkV4ZWN1dGluZyBjcmVhdGVfZmllbGQgQnVmZmVyL0luZGV4IE9wPSVwXG4iLCBvcCkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCQkgICJFeGVjdXRpbmcgY3JlYXRlX2ZpZWxkIEJ1ZmZlci9JbmRleCBPcD0lcFxuIiwKKwkJCQkJICBvcCkpOwogCi0JCQlzdGF0dXMgPSBhY3BpX2RzX2xvYWQyX2VuZF9vcCAod2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPSBhY3BpX2RzX2xvYWQyX2VuZF9vcCh3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlzdGF0dXMgPSBhY3BpX2RzX2V2YWxfYnVmZmVyX2ZpZWxkX29wZXJhbmRzICh3YWxrX3N0YXRlLCBvcCk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMod2Fsa19zdGF0ZSwgb3ApOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFNTF9UWVBFX0NSRUFURV9PQkpFQ1Q6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkJIkV4ZWN1dGluZyBjcmVhdGVfb2JqZWN0IChCdWZmZXIvUGFja2FnZSkgT3A9JXBcbiIsIG9wKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCSAgIkV4ZWN1dGluZyBjcmVhdGVfb2JqZWN0IChCdWZmZXIvUGFja2FnZSkgT3A9JXBcbiIsCisJCQkJCSAgb3ApKTsKIAogCQkJc3dpdGNoIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKIAkJCWNhc2UgQU1MX05BTUVfT1A6CkBAIC01ODgsMTMgKzU5NiwxNSBAQAogCQkJCSAqIFB1dCB0aGUgTm9kZSBvbiB0aGUgb2JqZWN0IHN0YWNrIChDb250YWlucyB0aGUgQUNQSSBOYW1lCiAJCQkJICogb2YgdGhpcyBvYmplY3QpCiAJCQkJICovCi0JCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSAodm9pZCAqKSBvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLm5vZGU7CisJCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPQorCQkJCSAgICAodm9pZCAqKW9wLT5jb21tb24ucGFyZW50LT5jb21tb24ubm9kZTsKIAkJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAxOwogCi0JCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfbm9kZSAod2Fsa19zdGF0ZSwKLQkJCQkJCSBvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLm5vZGUsCi0JCQkJCQkgb3AtPmNvbW1vbi5wYXJlbnQpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9ub2RlKHdhbGtfc3RhdGUsCisJCQkJCQkJICAgICBvcC0+Y29tbW9uLnBhcmVudC0+CisJCQkJCQkJICAgICBjb21tb24ubm9kZSwKKwkJCQkJCQkgICAgIG9wLT5jb21tb24ucGFyZW50KTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCkBAIC02MDMsMjAgKzYxMywyNiBAQAogCiAJCQljYXNlIEFNTF9JTlRfRVZBTF9TVUJUUkVFX09QOgogCi0JCQkJc3RhdHVzID0gYWNwaV9kc19ldmFsX2RhdGFfb2JqZWN0X29wZXJhbmRzICh3YWxrX3N0YXRlLCBvcCwKLQkJCQkJCSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24ubm9kZSkpOworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcworCQkJCSAgICAod2Fsa19zdGF0ZSwgb3AsCisJCQkJICAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qob3AtPmNvbW1vbi4KKwkJCQkJCQkJIHBhcmVudC0+Y29tbW9uLgorCQkJCQkJCQkgbm9kZSkpOwogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgogCi0JCQkJc3RhdHVzID0gYWNwaV9kc19ldmFsX2RhdGFfb2JqZWN0X29wZXJhbmRzICh3YWxrX3N0YXRlLCBvcCwgTlVMTCk7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19ldmFsX2RhdGFfb2JqZWN0X29wZXJhbmRzCisJCQkJICAgICh3YWxrX3N0YXRlLCBvcCwgTlVMTCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCS8qIERvbmUgd2l0aCByZXN1bHQgc3RhdGUgKE5vdyB0aGF0IG9wZXJhbmQgc3RhY2sgaXMgYnVpbHQpICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcCAod2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3Aod2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQl9CiAKQEAgLTYyNSw1NiArNjQxLDU4IEBACiAJCQkgKiBjdXJyZW50IHJlc3VsdCBzdGFjawogCQkJICovCiAJCQlpZiAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgewotCQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3B1c2ggKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosIHdhbGtfc3RhdGUpOworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfcmVzdWx0X3B1c2god2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwKKwkJCQkJCQl3YWxrX3N0YXRlKTsKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfVFlQRV9OQU1FRF9GSUVMRDoKIAkJY2FzZSBBTUxfVFlQRV9OQU1FRF9DT01QTEVYOgogCQljYXNlIEFNTF9UWVBFX05BTUVEX1NJTVBMRToKIAkJY2FzZSBBTUxfVFlQRV9OQU1FRF9OT19PQko6CiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfbG9hZDJfZW5kX29wICh3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfbG9hZDJfZW5kX29wKHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkJCSJFeGVjdXRpbmcgb3BfcmVnaW9uIEFkZHJlc3MvTGVuZ3RoIE9wPSVwXG4iLCBvcCkpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkJCSAgIkV4ZWN1dGluZyBvcF9yZWdpb24gQWRkcmVzcy9MZW5ndGggT3A9JXBcbiIsCisJCQkJCQkgIG9wKSk7CiAKLQkJCQlzdGF0dXMgPSBhY3BpX2RzX2V2YWxfcmVnaW9uX29wZXJhbmRzICh3YWxrX3N0YXRlLCBvcCk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfZXZhbF9yZWdpb25fb3BlcmFuZHMod2Fsa19zdGF0ZSwKKwkJCQkJCQkJIG9wKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCi0JCQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wICh3YWxrX3N0YXRlKTsKKwkJCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3Aod2Fsa19zdGF0ZSk7CiAJCQl9CiAKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfVFlQRV9VTkRFRklORUQ6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJVbmRlZmluZWQgb3Bjb2RlIHR5cGUgT3A9JXBcbiIsIG9wKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9JTVBMRU1FTlRFRCk7Ci0KKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIlVuZGVmaW5lZCBvcGNvZGUgdHlwZSBPcD0lcFxuIiwgb3ApKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfSU1QTEVNRU5URUQpOwogCiAJCWNhc2UgQU1MX1RZUEVfQk9HVVM6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCSJJbnRlcm5hbCBvcGNvZGU9JVggdHlwZSBPcD0lcFxuIiwKLQkJCQl3YWxrX3N0YXRlLT5vcGNvZGUsIG9wKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCQkgICJJbnRlcm5hbCBvcGNvZGU9JVggdHlwZSBPcD0lcFxuIiwKKwkJCQkJICB3YWxrX3N0YXRlLT5vcGNvZGUsIG9wKSk7CiAJCQlicmVhazsKIAotCiAJCWRlZmF1bHQ6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJVbmltcGxlbWVudGVkIG9wY29kZSwgY2xhc3M9JVggdHlwZT0lWCBPcGNvZGU9JVggT3A9JXBcbiIsCi0JCQkJb3BfY2xhc3MsIG9wX3R5cGUsIG9wLT5jb21tb24uYW1sX29wY29kZSwgb3ApKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIlVuaW1wbGVtZW50ZWQgb3Bjb2RlLCBjbGFzcz0lWCB0eXBlPSVYIE9wY29kZT0lWCBPcD0lcFxuIiwKKwkJCQkJICBvcF9jbGFzcywgb3BfdHlwZSwKKwkJCQkJICBvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIG9wKSk7CiAKIAkJCXN0YXR1cyA9IEFFX05PVF9JTVBMRU1FTlRFRDsKIAkJCWJyZWFrOwpAQCAtNjg1LDU1ICs3MDMsNTggQEAKIAkgKiBBQ1BJIDIuMCBzdXBwb3J0IGZvciA2NC1iaXQgaW50ZWdlcnM6IFRydW5jYXRlIG51bWVyaWMKIAkgKiByZXN1bHQgdmFsdWUgaWYgd2UgYXJlIGV4ZWN1dGluZyBmcm9tIGEgMzItYml0IEFDUEkgdGFibGUKIAkgKi8KLQlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKTsKKwlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmopOwogCiAJLyoKIAkgKiBDaGVjayBpZiB3ZSBqdXN0IGNvbXBsZXRlZCB0aGUgZXZhbHVhdGlvbiBvZiBhCiAJICogY29uZGl0aW9uYWwgcHJlZGljYXRlCiAJICovCiAKLQlpZiAoKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgJiYKLQkJKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpICYmCi0JCSh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPT0KLQkJCUFDUElfQ09OVFJPTF9QUkVESUNBVEVfRVhFQ1VUSU5HKSAmJgotCQkod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC5wcmVkaWNhdGVfb3AgPT0gb3ApKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSAod2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+cmVzdWx0X29iaik7CisJaWYgKChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgJiYKKwkgICAgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpICYmCisJICAgICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPT0KKwkgICAgIEFDUElfQ09OVFJPTF9QUkVESUNBVEVfRVhFQ1VUSU5HKSAmJgorCSAgICAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC5wcmVkaWNhdGVfb3AgPT0gb3ApKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2RzX2dldF9wcmVkaWNhdGVfdmFsdWUod2Fsa19zdGF0ZSwKKwkJCQkJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmopOwogCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gTlVMTDsKIAl9CiAKLQotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAKIAkvKiBJbnZva2UgZXhjZXB0aW9uIGhhbmRsZXIgb24gZXJyb3IgKi8KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykgJiYKLQkJYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXIgJiYKLQkJIShzdGF0dXMgJiBBRV9DT0RFX0NPTlRST0wpKSB7Ci0JCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlciAoKTsKLQkJc3RhdHVzID0gYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXIgKHN0YXR1cywKLQkJCQkgd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUtPm5hbWUuaW50ZWdlciwgd2Fsa19zdGF0ZS0+b3Bjb2RlLAotCQkJCSB3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0LCBOVUxMKTsKLQkJKHZvaWQpIGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIgKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmCisJICAgIGFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyICYmICEoc3RhdHVzICYgQUVfQ09ERV9DT05UUk9MKSkgeworCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKKwkJc3RhdHVzID0gYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXIoc3RhdHVzLAorCQkJCQkJICAgIHdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlLT4KKwkJCQkJCSAgICBuYW1lLmludGVnZXIsCisJCQkJCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlLAorCQkJCQkJICAgIHdhbGtfc3RhdGUtPmFtbF9vZmZzZXQsCisJCQkJCQkgICAgTlVMTCk7CisJCSh2b2lkKWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKIAl9CiAKIAlpZiAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgewogCQkvKiBCcmVhayB0byBkZWJ1Z2dlciB0byBkaXNwbGF5IHJlc3VsdCAqLwogCi0JCUFDUElfREVCVUdHRVJfRVhFQyAoYWNwaV9kYl9kaXNwbGF5X3Jlc3VsdF9vYmplY3QgKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosCi0JCQkJIHdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR0dFUl9FWEVDKGFjcGlfZGJfZGlzcGxheV9yZXN1bHRfb2JqZWN0CisJCQkJICAgKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosIHdhbGtfc3RhdGUpKTsKIAogCQkvKgogCQkgKiBEZWxldGUgdGhlIHJlc3VsdCBvcCBpZiBhbmQgb25seSBpZjoKIAkJICogUGFyZW50IHdpbGwgbm90IHVzZSB0aGUgcmVzdWx0IC0tIHN1Y2ggYXMgYW55CiAJCSAqIG5vbi1uZXN0ZWQgdHlwZTIgb3AgaW4gYSBtZXRob2QgKHBhcmVudCB3aWxsIGJlIG1ldGhvZCkKIAkJICovCi0JCWFjcGlfZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCAob3AsIHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosIHdhbGtfc3RhdGUpOworCQlhY3BpX2RzX2RlbGV0ZV9yZXN1bHRfaWZfbm90X3VzZWQob3AsIHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosCisJCQkJCQkgIHdhbGtfc3RhdGUpOwogCX0KLQogI2lmZGVmIF9VTkRFUl9ERVZFTE9QTUVOVAogCiAJaWYgKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwgPT0gd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbF9lbmQpIHsKLQkJYWNwaV9kYl9tZXRob2RfZW5kICh3YWxrX3N0YXRlKTsKKwkJYWNwaV9kYl9tZXRob2RfZW5kKHdhbGtfc3RhdGUpOwogCX0KICNlbmRpZgogCkBAIC03NDUsMTIgKzc2NiwxMCBAQAogCiAJLyogT24gZXJyb3IsIGRpc3BsYXkgbWV0aG9kIGxvY2Fscy9hcmdzICovCiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCWFjcGlfZG1fZHVtcF9tZXRob2RfaW5mbyAoc3RhdHVzLCB3YWxrX3N0YXRlLCBvcCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfZG1fZHVtcF9tZXRob2RfaW5mbyhzdGF0dXMsIHdhbGtfc3RhdGUsIG9wKTsKIAl9CiAjZW5kaWYKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMKaW5kZXggZDExNjIwMC4uNDExNzMxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3bG9hZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2xvYWQuYwpAQCAtNDEsNyArNDEsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KQEAgLTUwLDEzICs0OSwxMiBAQAogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CiAKLSNpZmRlZiBfQUNQSV9BU0xfQ09NUElMRVIKKyNpZmRlZiBBQ1BJX0FTTF9DT01QSUxFUgogI2luY2x1ZGUgPGFjcGkvYWNkaXNhc20uaD4KICNlbmRpZgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJkc3dsb2FkIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiZHN3bG9hZCIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzAsMzIgKzY4LDI5IEBACiAgKiBERVNDUklQVElPTjogSW5pdCB3YWxrIHN0YXRlIGNhbGxiYWNrcwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRfY2FsbGJhY2tzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc19udW1iZXIpCithY3BpX2RzX2luaXRfY2FsbGJhY2tzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsIHUzMiBwYXNzX251bWJlcikKIHsKIAogCXN3aXRjaCAocGFzc19udW1iZXIpIHsKIAljYXNlIDE6Ci0JCXdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICAgICAgID0gQUNQSV9QQVJTRV9MT0FEX1BBU1MxIHwKLQkJCQkgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOworCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8CisJCSAgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOwogCQl3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMV9iZWdpbl9vcDsKIAkJd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMV9lbmRfb3A7CiAJCWJyZWFrOwogCiAJY2FzZSAyOgotCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAgICAgICA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8Ci0JCQkJICAgQUNQSV9QQVJTRV9ERUxFVEVfVFJFRTsKKwkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgPSBBQ1BJX1BBUlNFX0xPQURfUEFTUzEgfAorCQkgICAgQUNQSV9QQVJTRV9ERUxFVEVfVFJFRTsKIAkJd2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayA9IGFjcGlfZHNfbG9hZDJfYmVnaW5fb3A7CiAJCXdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayA9IGFjcGlfZHNfbG9hZDJfZW5kX29wOwogCQlicmVhazsKIAogCWNhc2UgMzoKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0JCXdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICAgICAgfD0gQUNQSV9QQVJTRV9FWEVDVVRFICB8Ci0JCQkJICAgQUNQSV9QQVJTRV9ERUxFVEVfVFJFRTsKKwkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgfD0gQUNQSV9QQVJTRV9FWEVDVVRFIHwKKwkJICAgIEFDUElfUEFSU0VfREVMRVRFX1RSRUU7CiAJCXdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgPSBhY3BpX2RzX2V4ZWNfYmVnaW5fb3A7CiAJCXdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayA9IGFjcGlfZHNfZXhlY19lbmRfb3A7CiAjZW5kaWYKQEAgLTEwOCw3ICsxMDMsNiBAQAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbG9hZDFfYmVnaW5fb3AKQEAgLTEyMywzNyArMTE3LDI2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19sb2FkMV9iZWdpbl9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICoqb3V0X29wKQorYWNwaV9kc19sb2FkMV9iZWdpbl9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSwKKwkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqIG91dF9vcCkKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsKKwljaGFyICpwYXRoOworCXUzMiBmbGFnczsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfbG9hZDFfYmVnaW5fb3AiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfbG9hZDFfYmVnaW5fb3AiKTsKIAogCW9wID0gd2Fsa19zdGF0ZS0+b3A7Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsIHdhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILCAiT3A9JXAgU3RhdGU9JXBcbiIsIG9wLAorCQkJICB3YWxrX3N0YXRlKSk7CiAKIAkvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIG9wY29kZXMgdGhhdCBoYXZlIGFuIGFzc29jaWF0ZWQgbmFtZSAqLwogCiAJaWYgKG9wKSB7CiAJCWlmICghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSkgewotI2lmIDAKLQkJCWlmICgod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX0VYRUNVVEUpIHx8Ci0JCQkJKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19DT05UUk9MKSkgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiXG5cbioqKkVYRUNVVEFCTEUgT1BDT0RFICVzKioqXG5cbiIsCi0JCQkJCXdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUpOwotCQkJCSpvdXRfb3AgPSBvcDsKLQkJCQlyZXR1cm4gKEFFX0NUUkxfU0tJUCk7Ci0JCQl9Ci0jZW5kaWYKIAkJCSpvdXRfb3AgPSBvcDsKIAkJCXJldHVybiAoQUVfT0spOwogCQl9CkBAIC0xNjYsMTQgKzE0OSwxNSBAQAogCQl9CiAJfQogCi0JcGF0aCA9IGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyAoJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSk7CisJcGF0aCA9IGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZygmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKTsKIAogCS8qIE1hcCB0aGUgcmF3IG9wY29kZSBpbnRvIGFuIGludGVybmFsIG9iamVjdCB0eXBlICovCiAKIAlvYmplY3RfdHlwZSA9IHdhbGtfc3RhdGUtPm9wX2luZm8tPm9iamVjdF90eXBlOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCSJTdGF0ZT0lcCBPcD0lcCBbJXNdXG4iLCB3YWxrX3N0YXRlLCBvcCwgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChvYmplY3RfdHlwZSkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiU3RhdGU9JXAgT3A9JXAgWyVzXVxuIiwgd2Fsa19zdGF0ZSwgb3AsCisJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmplY3RfdHlwZSkpKTsKIAogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CiAJY2FzZSBBTUxfU0NPUEVfT1A6CkBAIC0xODMsMjMgKzE2NywyNyBAQAogCQkgKiB0aGF0IHdlIGNhbiBhY3R1YWxseSBvcGVuIHRoZSBzY29wZSB0byBlbnRlciBuZXcgbmFtZXMgdW5kZXJuZWF0aCBpdC4KIAkJICogQWxsb3cgc2VhcmNoLXRvLXJvb3QgZm9yIHNpbmdsZSBuYW1lc2Vncy4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBwYXRoLCBvYmplY3RfdHlwZSwKLQkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKLSNpZmRlZiBfQUNQSV9BU0xfQ09NUElMRVIKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIHBhdGgsIG9iamVjdF90eXBlLAorCQkJCSAgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCSAgIHdhbGtfc3RhdGUsICYobm9kZSkpOworI2lmZGVmIEFDUElfQVNMX0NPTVBJTEVSCiAJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CiAJCQkvKgogCQkJICogVGFibGUgZGlzYXNzZW1ibHk6CiAJCQkgKiBUYXJnZXQgb2YgU2NvcGUoKSBub3QgZm91bmQuICBHZW5lcmF0ZSBhbiBFeHRlcm5hbCBmb3IgaXQsIGFuZAogCQkJICogaW5zZXJ0IHRoZSBuYW1lIGludG8gdGhlIG5hbWVzcGFjZS4KIAkJCSAqLwotCQkJYWNwaV9kbV9hZGRfdG9fZXh0ZXJuYWxfbGlzdCAocGF0aCk7Ci0JCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgcGF0aCwgb2JqZWN0X3R5cGUsCi0JCQkJCSAgIEFDUElfSU1PREVfTE9BRF9QQVNTMSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAotCQkJCQkgICB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKKwkJCWFjcGlfZG1fYWRkX3RvX2V4dGVybmFsX2xpc3QocGF0aCk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIHBhdGgsCisJCQkJCSAgIG9iamVjdF90eXBlLCBBQ1BJX0lNT0RFX0xPQURfUEFTUzEsCisJCQkJCSAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgd2Fsa19zdGF0ZSwKKwkJCQkJICAgJihub2RlKSk7CiAJCX0KICNlbmRpZgotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9OU0VSUk9SIChwYXRoLCBzdGF0dXMpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX05TRVJST1IocGF0aCwgc3RhdHVzKTsKIAkJCXJldHVybiAoc3RhdHVzKTsKIAkJfQogCkBAIC0yMDgsNyArMTk2LDcgQEAKIAkJICogb25lIG9mIHRoZSBvcGNvZGVzIHRoYXQgYWN0dWFsbHkgb3BlbnMgYSBzY29wZQogCQkgKi8KIAkJc3dpdGNoIChub2RlLT50eXBlKSB7Ci0JCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFOiAgICAgICAgIC8qIFNjb3BlICAqLworCQljYXNlIEFDUElfVFlQRV9MT0NBTF9TQ09QRToJLyogU2NvcGUgICovCiAJCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKIAkJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6CiAJCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKQEAgLTIzMiw5ICsyMjAsMTAgQEAKIAkJCSAqIGEgd2FybmluZwogCQkJICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkJIlR5cGUgb3ZlcnJpZGUgLSBbJTQuNHNdIGhhZCBpbnZhbGlkIHR5cGUgKCVzKSBmb3IgU2NvcGUgb3BlcmF0b3IsIGNoYW5nZWQgdG8gKFNjb3BlKVxuIiwKLQkJCQlwYXRoLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKG5vZGUtPnR5cGUpKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCSAgIlR5cGUgb3ZlcnJpZGUgLSBbJTQuNHNdIGhhZCBpbnZhbGlkIHR5cGUgKCVzKSBmb3IgU2NvcGUgb3BlcmF0b3IsIGNoYW5nZWQgdG8gKFNjb3BlKVxuIiwKKwkJCQkJICBwYXRoLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShub2RlLT50eXBlKSkpOwogCiAJCQlub2RlLT50eXBlID0gQUNQSV9UWVBFX0FOWTsKIAkJCXdhbGtfc3RhdGUtPnNjb3BlX2luZm8tPmNvbW1vbi52YWx1ZSA9IEFDUElfVFlQRV9BTlk7CkBAIC0yNDQsMTUgKzIzMywxMiBAQAogCiAJCQkvKiBBbGwgb3RoZXIgdHlwZXMgYXJlIGFuIGVycm9yICovCiAKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJIkludmFsaWQgdHlwZSAoJXMpIGZvciB0YXJnZXQgb2YgU2NvcGUgb3BlcmF0b3IgWyU0LjRzXSAoQ2Fubm90IG92ZXJyaWRlKVxuIiwKLQkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKG5vZGUtPnR5cGUpLCBwYXRoKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgdHlwZSAoJXMpIGZvciB0YXJnZXQgb2YgU2NvcGUgb3BlcmF0b3IgWyU0LjRzXSAoQ2Fubm90IG92ZXJyaWRlKVxuIiwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpLCBwYXRoKSk7CiAKIAkJCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKIAkJLyoKQEAgLTI4MSwxNSArMjY3LDE1IEBACiAKIAkJZmxhZ3MgPSBBQ1BJX05TX05PX1VQU0VBUkNIOwogCQlpZiAoKHdhbGtfc3RhdGUtPm9wY29kZSAhPSBBTUxfU0NPUEVfT1ApICYmCi0JCQkoISh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfREVGRVJSRURfT1ApKSkgeworCQkgICAgKCEod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX0RFRkVSUkVEX09QKSkpIHsKIAkJCWZsYWdzIHw9IEFDUElfTlNfRVJST1JfSUZfRk9VTkQ7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIlslc10gQ2Fubm90IGFscmVhZHkgZXhpc3RcbiIsCi0JCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAob2JqZWN0X3R5cGUpKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCQkiWyVzXSBCb3RoIEZpbmQgb3IgQ3JlYXRlIGFsbG93ZWRcbiIsCi0JCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAob2JqZWN0X3R5cGUpKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCQkgICJbJXNdIENhbm5vdCBhbHJlYWR5IGV4aXN0XG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmplY3RfdHlwZSkpKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIlslc10gQm90aCBGaW5kIG9yIENyZWF0ZSBhbGxvd2VkXG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmplY3RfdHlwZSkpKTsKIAkJfQogCiAJCS8qCkBAIC0yOTgsMjIgKzI4NCwyMyBAQAogCQkgKiBpbnZvbHZlIGFyZ3VtZW50cyB0byB0aGUgb3Bjb2RlIG11c3QgYmUgY3JlYXRlZCBhcyB3ZSBnbyBiYWNrIHVwIHRoZQogCQkgKiBwYXJzZSB0cmVlIGxhdGVyLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIHBhdGgsIG9iamVjdF90eXBlLAotCQkJCSAgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLCBmbGFncywgd2Fsa19zdGF0ZSwgJihub2RlKSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX05TRVJST1IgKHBhdGgsIHN0YXR1cyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBwYXRoLCBvYmplY3RfdHlwZSwKKwkJCQkgICBBQ1BJX0lNT0RFX0xPQURfUEFTUzEsIGZsYWdzLCB3YWxrX3N0YXRlLAorCQkJCSAgICYobm9kZSkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX05TRVJST1IocGF0aCwgc3RhdHVzKTsKIAkJCXJldHVybiAoc3RhdHVzKTsKIAkJfQogCQlicmVhazsKIAl9CiAKLQogCS8qIENvbW1vbiBleGl0ICovCiAKIAlpZiAoIW9wKSB7CiAJCS8qIENyZWF0ZSBhIG5ldyBvcCAqLwogCi0JCW9wID0gYWNwaV9wc19hbGxvY19vcCAod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKKwkJb3AgPSBhY3BpX3BzX2FsbG9jX29wKHdhbGtfc3RhdGUtPm9wY29kZSk7CiAJCWlmICghb3ApIHsKIAkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAkJfQpAQCAtMzI3LDE5ICszMTQsMTggQEAKIAlvcC0+bmFtZWQucGF0aCA9ICh1OCAqKSBwYXRoOwogI2VuZGlmCiAKLQogCS8qCiAJICogUHV0IHRoZSBOb2RlIGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywgc28gd2UKIAkgKiBjYW4gZ2V0IGl0IGFnYWluIHF1aWNrbHkgd2hlbiB0aGlzIHNjb3BlIGlzIGNsb3NlZAogCSAqLwogCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7Ci0JYWNwaV9wc19hcHBlbmRfYXJnIChhY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUgKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLCBvcCk7CisJYWNwaV9wc19hcHBlbmRfYXJnKGFjcGlfcHNfZ2V0X3BhcmVudF9zY29wZSgmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSwKKwkJCSAgIG9wKTsKIAogCSpvdXRfb3AgPSBvcDsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19sb2FkMV9lbmRfb3AKQEAgLTM1MywyMCArMzM5LDE3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZHNfbG9hZDFfZW5kX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9kc19sb2FkMV9lbmRfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3A7Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICBvYmplY3RfdHlwZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKKwlhY3BpX29iamVjdF90eXBlIG9iamVjdF90eXBlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19sb2FkMV9lbmRfb3AiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfbG9hZDFfZW5kX29wIik7CiAKIAlvcCA9IHdhbGtfc3RhdGUtPm9wOwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiT3A9JXAgU3RhdGU9JXBcbiIsIG9wLCB3YWxrX3N0YXRlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wPSVwIFN0YXRlPSVwXG4iLCBvcCwKKwkJCSAgd2Fsa19zdGF0ZSkpOwogCiAJLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBvcGNvZGVzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIG5hbWUgKi8KIApAQCAtMzgwLDIxICszNjMsMjAgQEAKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KIAlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfRklFTEQpIHsKLQkJaWYgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfRklFTERfT1AgICAgICAgICB8fAotCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9CQU5LX0ZJRUxEX09QICAgIHx8Ci0JCQl3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0lOREVYX0ZJRUxEX09QKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfZmllbGRfb2JqZWN0cyAob3AsIHdhbGtfc3RhdGUpOworCQlpZiAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9GSUVMRF9PUCB8fAorCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9CQU5LX0ZJRUxEX09QIHx8CisJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0lOREVYX0ZJRUxEX09QKSB7CisJCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfZmllbGRfb2JqZWN0cyhvcCwgd2Fsa19zdGF0ZSk7CiAJCX0KIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KIAotCiAJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUkVHSU9OX09QKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX3JlZ2lvbiAob3AtPm5hbWVkLmRhdGEsIG9wLT5uYW1lZC5sZW5ndGgsCi0JCQkJICAgKGFjcGlfYWRyX3NwYWNlX3R5cGUpCi0JCQkJCQkgKChvcC0+Y29tbW9uLnZhbHVlLmFyZyktPmNvbW1vbi52YWx1ZS5pbnRlZ2VyKSwKLQkJCQkJCSB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2V4X2NyZWF0ZV9yZWdpb24ob3AtPm5hbWVkLmRhdGEsIG9wLT5uYW1lZC5sZW5ndGgsCisJCQkJCSAgICAgICAoYWNwaV9hZHJfc3BhY2VfdHlwZSkKKwkJCQkJICAgICAgICgob3AtPmNvbW1vbi52YWx1ZS5hcmcpLT5jb21tb24uCisJCQkJCQl2YWx1ZS5pbnRlZ2VyKSwgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAJfQpAQCAtNDA0LDggKzM4NiwxMSBAQAogCQkvKiBGb3IgTmFtZSBvcGNvZGUsIGdldCB0aGUgb2JqZWN0IHR5cGUgZnJvbSB0aGUgYXJndW1lbnQgKi8KIAogCQlpZiAob3AtPmNvbW1vbi52YWx1ZS5hcmcpIHsKLQkJCW9iamVjdF90eXBlID0gKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvICgKLQkJCQkob3AtPmNvbW1vbi52YWx1ZS5hcmcpLT5jb21tb24uYW1sX29wY29kZSkpLT5vYmplY3RfdHlwZTsKKwkJCW9iamVjdF90eXBlID0gKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKChvcC0+Y29tbW9uLgorCQkJCQkJCQl2YWx1ZS5hcmcpLT4KKwkJCQkJCQkgICAgICAgY29tbW9uLgorCQkJCQkJCSAgICAgICBhbWxfb3Bjb2RlKSktPgorCQkJICAgIG9iamVjdF90eXBlOwogCQkJb3AtPmNvbW1vbi5ub2RlLT50eXBlID0gKHU4KSBvYmplY3RfdHlwZTsKIAkJfQogCX0KQEAgLTQxOSwyMyArNDA0LDI2IEBACiAJCSAqIG9mIGludm9jYXRpb25zIG9mIHRoZSBtZXRob2QgKG5lZWQgdG8ga25vdyB0aGUgbnVtYmVyIG9mCiAJCSAqIGFyZ3VtZW50cy4pCiAJCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCSJMT0FESU5HLU1ldGhvZDogU3RhdGU9JXAgT3A9JXAgbmFtZWRfb2JqPSVwXG4iLAotCQkJd2Fsa19zdGF0ZSwgb3AsIG9wLT5uYW1lZC5ub2RlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJICAiTE9BRElORy1NZXRob2Q6IFN0YXRlPSVwIE9wPSVwIG5hbWVkX29iaj0lcFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUsIG9wLCBvcC0+bmFtZWQubm9kZSkpOwogCi0JCWlmICghYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChvcC0+bmFtZWQubm9kZSkpIHsKLQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0gKHZvaWQgKikgb3AtPm5hbWVkLm5vZGU7CisJCWlmICghYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG9wLT5uYW1lZC5ub2RlKSkgeworCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSAodm9pZCAqKW9wLT5uYW1lZC5ub2RlOwogCQkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMTsKIAotCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMgKHdhbGtfc3RhdGUsIG9wLT5jb21tb24udmFsdWUuYXJnKTsKLQkJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJCQlzdGF0dXMgPSBhY3BpX2V4X2NyZWF0ZV9tZXRob2QgKG9wLT5uYW1lZC5kYXRhLAotCQkJCQkJICAgb3AtPm5hbWVkLmxlbmd0aCwgd2Fsa19zdGF0ZSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzKHdhbGtfc3RhdGUsCisJCQkJCQkgICAgb3AtPmNvbW1vbi52YWx1ZS5hcmcpOworCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfbWV0aG9kKG9wLT5uYW1lZC5kYXRhLAorCQkJCQkJCSAgICAgICBvcC0+bmFtZWQubGVuZ3RoLAorCQkJCQkJCSAgICAgICB3YWxrX3N0YXRlKTsKIAkJCX0KIAkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0gTlVMTDsKIAkJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDA7CiAKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCXJldHVybiAoc3RhdHVzKTsKIAkJCX0KIAkJfQpAQCAtNDQzLDE3ICs0MzEsMTcgQEAKIAogCS8qIFBvcCB0aGUgc2NvcGUgc3RhY2sgKi8KIAotCWlmIChhY3BpX25zX29wZW5zX3Njb3BlIChvYmplY3RfdHlwZSkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICIoJXMpOiBQb3BwaW5nIHNjb3BlIGZvciBPcCAlcFxuIiwKLQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAob2JqZWN0X3R5cGUpLCBvcCkpOworCWlmIChhY3BpX25zX29wZW5zX3Njb3BlKG9iamVjdF90eXBlKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIiglcyk6IFBvcHBpbmcgc2NvcGUgZm9yIE9wICVwXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9iamVjdF90eXBlKSwgb3ApKTsKIAotCQlzdGF0dXMgPSBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcCAod2Fsa19zdGF0ZSk7CisJCXN0YXR1cyA9IGFjcGlfZHNfc2NvcGVfc3RhY2tfcG9wKHdhbGtfc3RhdGUpOwogCX0KIAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2xvYWQyX2JlZ2luX29wCkBAIC00NjgsMzAgKzQ1Niw1MyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfbG9hZDJfYmVnaW5fb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqKm91dF9vcCkKK2FjcGlfZHNfbG9hZDJfYmVnaW5fb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUsCisJCSAgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKiBvdXRfb3ApCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3A7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIG9iamVjdF90eXBlOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcl9wdHI7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX29iamVjdF90eXBlIG9iamVjdF90eXBlOworCWNoYXIgKmJ1ZmZlcl9wdHI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19sb2FkMl9iZWdpbl9vcCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfbG9hZDJfYmVnaW5fb3AiKTsKIAogCW9wID0gd2Fsa19zdGF0ZS0+b3A7Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsIHdhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILCAiT3A9JXAgU3RhdGU9JXBcbiIsIG9wLAorCQkJICB3YWxrX3N0YXRlKSk7CiAKIAlpZiAob3ApIHsKKwkJaWYgKCh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKSAmJgorCQkgICAgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9PQorCQkgICAgIEFDUElfQ09OVFJPTF9DT05ESVRJT05BTF9FWEVDVVRJTkcpKSB7CisJCQkvKiBXZSBhcmUgZXhlY3V0aW5nIGEgd2hpbGUgbG9vcCBvdXRzaWRlIG9mIGEgbWV0aG9kICovCisKKwkJCXN0YXR1cyA9IGFjcGlfZHNfZXhlY19iZWdpbl9vcCh3YWxrX3N0YXRlLCBvdXRfb3ApOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKwogCQkvKiBXZSBvbmx5IGNhcmUgYWJvdXQgTmFtZXNwYWNlIG9wY29kZXMgaGVyZSAqLwogCiAJCWlmICgoISh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9OU09QQ09ERSkgJiYKLQkJCSAgKHdhbGtfc3RhdGUtPm9wY29kZSAhPSBBTUxfSU5UX05BTUVQQVRIX09QKSkgfHwKLQkJCSghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSkpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQkgICAgICh3YWxrX3N0YXRlLT5vcGNvZGUgIT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkpIHx8CisJCSAgICAoISh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9OQU1FRCkpKSB7CisjaWZkZWYgQUNQSV9FTkFCTEVfTU9EVUxFX0xFVkVMX0NPREUKKwkJCWlmICgod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX0VYRUNVVEUpIHx8CisJCQkgICAgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19DT05UUk9MKSkgeworCisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJCSAgIkJlZ2luL0VYRUM6ICVzIChmbCAlOC44WClcbiIsCisJCQkJCQkgIHdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUsCisJCQkJCQkgIHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzKSk7CisKKwkJCQkvKiBFeGVjdXRpbmcgYSB0eXBlMSBvciB0eXBlMiBvcGNvZGUgb3V0c2lkZSBvZiBhIG1ldGhvZCAqLworCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19leGVjX2JlZ2luX29wKHdhbGtfc3RhdGUsIG91dF9vcCk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CisjZW5kaWYKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCX0KIAogCQkvKiBHZXQgdGhlIG5hbWUgd2UgYXJlIGdvaW5nIHRvIGVudGVyIG9yIGxvb2t1cCBpbiB0aGUgbmFtZXNwYWNlICovCkBAIC01MDMsMjggKzUxNCwyNyBAQAogCQkJaWYgKCFidWZmZXJfcHRyKSB7CiAJCQkJLyogTm8gbmFtZSwganVzdCBleGl0ICovCiAKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQkJfQotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyogR2V0IG5hbWUgZnJvbSB0aGUgb3AgKi8KIAotCQkJYnVmZmVyX3B0ciA9IChjaGFyICopICZvcC0+bmFtZWQubmFtZTsKKwkJCWJ1ZmZlcl9wdHIgPSAoY2hhciAqKSZvcC0+bmFtZWQubmFtZTsKIAkJfQotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBHZXQgdGhlIG5hbWVzdHJpbmcgZnJvbSB0aGUgcmF3IEFNTCAqLwogCi0JCWJ1ZmZlcl9wdHIgPSBhY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcgKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpOworCQlidWZmZXJfcHRyID0KKwkJICAgIGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZygmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKTsKIAl9CiAKIAkvKiBNYXAgdGhlIG9wY29kZSBpbnRvIGFuIGludGVybmFsIG9iamVjdCB0eXBlICovCiAKIAlvYmplY3RfdHlwZSA9IHdhbGtfc3RhdGUtPm9wX2luZm8tPm9iamVjdF90eXBlOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCSJTdGF0ZT0lcCBPcD0lcCBUeXBlPSVYXG4iLCB3YWxrX3N0YXRlLCBvcCwgb2JqZWN0X3R5cGUpKTsKLQorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICJTdGF0ZT0lcCBPcD0lcCBUeXBlPSVYXG4iLCB3YWxrX3N0YXRlLCBvcCwKKwkJCSAgb2JqZWN0X3R5cGUpKTsKIAogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CiAJY2FzZSBBTUxfRklFTERfT1A6CkBAIC01NDIsOSArNTUyLDEwIEBACiAJCSAqIERvbid0IGVudGVyIHRoZSBuYW1lIGludG8gdGhlIG5hbWVzcGFjZSwgYnV0IGxvb2sgaXQgdXAKIAkJICogZm9yIHVzZSBsYXRlci4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBidWZmZXJfcHRyLCBvYmplY3RfdHlwZSwKLQkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAotCQkJCSAgd2Fsa19zdGF0ZSwgJihub2RlKSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBidWZmZXJfcHRyLAorCQkJCSAgIG9iamVjdF90eXBlLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFNTF9TQ09QRV9PUDoKQEAgLTU1NCwyOCArNTY1LDI4IEBACiAJCSAqIERvbid0IGVudGVyIHRoZSBuYW1lIGludG8gdGhlIG5hbWVzcGFjZSwgYnV0IGxvb2sgaXQgdXAKIAkJICogZm9yIHVzZSBsYXRlci4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBidWZmZXJfcHRyLCBvYmplY3RfdHlwZSwKLQkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAotCQkJCSAgd2Fsa19zdGF0ZSwgJihub2RlKSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLSNpZmRlZiBfQUNQSV9BU0xfQ09NUElMRVIKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGJ1ZmZlcl9wdHIsCisJCQkJICAgb2JqZWN0X3R5cGUsIEFDUElfSU1PREVfRVhFQ1VURSwKKwkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsICYobm9kZSkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKyNpZmRlZiBBQ1BJX0FTTF9DT01QSUxFUgogCQkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKIAkJCQlzdGF0dXMgPSBBRV9PSzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUFDUElfUkVQT1JUX05TRVJST1IgKGJ1ZmZlcl9wdHIsIHN0YXR1cyk7CisJCQl9IGVsc2UgeworCQkJCUFDUElfUkVQT1JUX05TRVJST1IoYnVmZmVyX3B0ciwgc3RhdHVzKTsKIAkJCX0KICNlbHNlCi0JCQlBQ1BJX1JFUE9SVF9OU0VSUk9SIChidWZmZXJfcHRyLCBzdGF0dXMpOworCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihidWZmZXJfcHRyLCBzdGF0dXMpOwogI2VuZGlmCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCQkvKgogCQkgKiBXZSBtdXN0IGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0YXJnZXQgaXMKIAkJICogb25lIG9mIHRoZSBvcGNvZGVzIHRoYXQgYWN0dWFsbHkgb3BlbnMgYSBzY29wZQogCQkgKi8KIAkJc3dpdGNoIChub2RlLT50eXBlKSB7Ci0JCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFOiAgICAgICAgIC8qIFNjb3BlICovCisJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFOgkvKiBTY29wZSAqLwogCQljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CiAJCWNhc2UgQUNQSV9UWVBFX1BPV0VSOgogCQljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6CkBAIC01OTYsOSArNjA3LDcgQEAKIAkJCSAqICBTY29wZSAoREVCKSB7IC4uLiB9CiAJCQkgKi8KIAotCQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKAotCQkJCSJUeXBlIG92ZXJyaWRlIC0gWyU0LjRzXSBoYWQgaW52YWxpZCB0eXBlICglcykgZm9yIFNjb3BlIG9wZXJhdG9yLCBjaGFuZ2VkIHRvIChTY29wZSlcbiIsCi0JCQkJYnVmZmVyX3B0ciwgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChub2RlLT50eXBlKSkpOworCQkJQUNQSV9SRVBPUlRfV0FSTklORygoIlR5cGUgb3ZlcnJpZGUgLSBbJTQuNHNdIGhhZCBpbnZhbGlkIHR5cGUgKCVzKSBmb3IgU2NvcGUgb3BlcmF0b3IsIGNoYW5nZWQgdG8gKFNjb3BlKVxuIiwgYnVmZmVyX3B0ciwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpKSk7CiAKIAkJCW5vZGUtPnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOwogCQkJd2Fsa19zdGF0ZS0+c2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlID0gQUNQSV9UWVBFX0FOWTsKQEAgLTYwOCw5ICs2MTcsNyBAQAogCiAJCQkvKiBBbGwgb3RoZXIgdHlwZXMgYXJlIGFuIGVycm9yICovCiAKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJIkludmFsaWQgdHlwZSAoJXMpIGZvciB0YXJnZXQgb2YgU2NvcGUgb3BlcmF0b3IgWyU0LjRzXVxuIiwKLQkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKG5vZGUtPnR5cGUpLCBidWZmZXJfcHRyKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgdHlwZSAoJXMpIGZvciB0YXJnZXQgb2YgU2NvcGUgb3BlcmF0b3IgWyU0LjRzXVxuIiwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpLCBidWZmZXJfcHRyKSk7CiAKIAkJCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KQEAgLTYyNSwxNCArNjMyLDE2IEBACiAKIAkJCW5vZGUgPSBvcC0+Y29tbW9uLm5vZGU7CiAKLQkJCWlmIChhY3BpX25zX29wZW5zX3Njb3BlIChvYmplY3RfdHlwZSkpIHsKLQkJCQlzdGF0dXMgPSBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2ggKG5vZGUsIG9iamVjdF90eXBlLCB3YWxrX3N0YXRlKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCWlmIChhY3BpX25zX29wZW5zX3Njb3BlKG9iamVjdF90eXBlKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaChub2RlLCBvYmplY3RfdHlwZSwKKwkJCQkJCQkgICAgIHdhbGtfc3RhdGUpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCQl9CiAKIAkJCX0KLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJfQogCiAJCS8qCkBAIC02NTEsMjQgKzY2MCwyNiBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYnVmZmVyX3B0ciwgb2JqZWN0X3R5cGUsCi0JCQkJICBBQ1BJX0lNT0RFX0VYRUNVVEUsIEFDUElfTlNfTk9fVVBTRUFSQ0gsCi0JCQkJICB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKKwkJLyogQWRkIG5ldyBlbnRyeSBpbnRvIG5hbWVzcGFjZSAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBidWZmZXJfcHRyLAorCQkJCSAgIG9iamVjdF90eXBlLCBBQ1BJX0lNT0RFX0xPQURfUEFTUzIsCisJCQkJICAgQUNQSV9OU19OT19VUFNFQVJDSCwgd2Fsa19zdGF0ZSwgJihub2RlKSk7CiAJCWJyZWFrOwogCX0KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAoYnVmZmVyX3B0ciwgc3RhdHVzKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9OU0VSUk9SKGJ1ZmZlcl9wdHIsIHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCiAJaWYgKCFvcCkgewogCQkvKiBDcmVhdGUgYSBuZXcgb3AgKi8KIAotCQlvcCA9IGFjcGlfcHNfYWxsb2Nfb3AgKHdhbGtfc3RhdGUtPm9wY29kZSk7CisJCW9wID0gYWNwaV9wc19hbGxvY19vcCh3YWxrX3N0YXRlLT5vcGNvZGUpOwogCQlpZiAoIW9wKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCS8qIEluaXRpYWxpemUgdGhlIG5ldyBvcCAqLwpAQCAtNjc2LDkgKzY4Nyw3IEBACiAJCWlmIChub2RlKSB7CiAJCQlvcC0+bmFtZWQubmFtZSA9IG5vZGUtPm5hbWUuaW50ZWdlcjsKIAkJfQotCQlpZiAob3V0X29wKSB7Ci0JCQkqb3V0X29wID0gb3A7Ci0JCX0KKwkJKm91dF9vcCA9IG9wOwogCX0KIAogCS8qCkBAIC02ODcsMTAgKzY5Niw5IEBACiAJICovCiAJb3AtPmNvbW1vbi5ub2RlID0gbm9kZTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2xvYWQyX2VuZF9vcApAQCAtNzA0LDM5ICs3MTIsNTQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19sb2FkMl9lbmRfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2RzX2xvYWQyX2VuZF9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICBvYmplY3RfdHlwZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpuZXdfbm9kZTsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpuZXdfbm9kZTsKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXUzMiBpOwogI2VuZGlmCiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19sb2FkMl9lbmRfb3AiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19sb2FkMl9lbmRfb3AiKTsKIAogCW9wID0gd2Fsa19zdGF0ZS0+b3A7Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJPcGNvZGUgWyVzXSBPcCAlcCBTdGF0ZSAlcFxuIiwKLQkJCXdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUsIG9wLCB3YWxrX3N0YXRlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wY29kZSBbJXNdIE9wICVwIFN0YXRlICVwXG4iLAorCQkJICB3YWxrX3N0YXRlLT5vcF9pbmZvLT5uYW1lLCBvcCwgd2Fsa19zdGF0ZSkpOwogCi0JLyogT25seSBpbnRlcmVzdGVkIGluIG9wY29kZXMgdGhhdCBoYXZlIG5hbWVzcGFjZSBvYmplY3RzICovCisJLyogQ2hlY2sgaWYgb3Bjb2RlIGhhZCBhbiBhc3NvY2lhdGVkIG5hbWVzcGFjZSBvYmplY3QgKi8KIAogCWlmICghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05TT0JKRUNUKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKyNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCisjaWZkZWYgQUNQSV9FTkFCTEVfTU9EVUxFX0xFVkVMX0NPREUKKwkJLyogTm8gbmFtZXNwYWNlIG9iamVjdC4gRXhlY3V0YWJsZSBvcGNvZGU/ICovCisKKwkJaWYgKCh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfRVhFQ1VURSkgfHwKKwkJICAgICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfQ09OVFJPTCkpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIkVuZC9FWEVDOiAgICVzIChmbCAlOC44WClcbiIsCisJCQkJCSAgd2Fsa19zdGF0ZS0+b3BfaW5mby0+bmFtZSwKKwkJCQkJICB3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncykpOworCisJCQkvKiBFeGVjdXRpbmcgYSB0eXBlMSBvciB0eXBlMiBvcGNvZGUgb3V0c2lkZSBvZiBhIG1ldGhvZCAqLworCisJCQlzdGF0dXMgPSBhY3BpX2RzX2V4ZWNfZW5kX29wKHdhbGtfc3RhdGUpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKyNlbmRpZgorI2VuZGlmCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfU0NPUEVfT1ApIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkiRW5kaW5nIHNjb3BlIE9wPSVwIFN0YXRlPSVwXG4iLCBvcCwgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIkVuZGluZyBzY29wZSBPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsCisJCQkJICB3YWxrX3N0YXRlKSk7CiAJfQogCi0KIAlvYmplY3RfdHlwZSA9IHdhbGtfc3RhdGUtPm9wX2luZm8tPm9iamVjdF90eXBlOwogCiAJLyoKQEAgLTc0OSwxOCArNzcyLDE5IEBACiAJICogUHV0IHRoZSBOb2RlIG9uIHRoZSBvYmplY3Qgc3RhY2sgKENvbnRhaW5zIHRoZSBBQ1BJIE5hbWUgb2YKIAkgKiB0aGlzIG9iamVjdCkKIAkgKi8KLQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9ICh2b2lkICopIG5vZGU7CisJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSAodm9pZCAqKW5vZGU7CiAJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMTsKIAogCS8qIFBvcCB0aGUgc2NvcGUgc3RhY2sgKi8KIAotCWlmIChhY3BpX25zX29wZW5zX3Njb3BlIChvYmplY3RfdHlwZSkgJiYKLQkgICAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICIoJXMpIFBvcHBpbmcgc2NvcGUgZm9yIE9wICVwXG4iLAotCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChvYmplY3RfdHlwZSksIG9wKSk7CisJaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUob2JqZWN0X3R5cGUpICYmCisJICAgIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX0lOVF9NRVRIT0RDQUxMX09QKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIiglcykgUG9wcGluZyBzY29wZSBmb3IgT3AgJXBcbiIsCisJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUob2JqZWN0X3R5cGUpLCBvcCkpOwogCi0JCXN0YXR1cyA9IGFjcGlfZHNfc2NvcGVfc3RhY2tfcG9wICh3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcCh3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAl9CkBAIC03OTMsOSArODE3LDEwIEBACiAJICogQU1MX1RIRVJNQUxaT05FCiAJICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJIkNyZWF0ZS1Mb2FkIFslc10gU3RhdGU9JXAgT3A9JXAgbmFtZWRfb2JqPSVwXG4iLAotCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwgd2Fsa19zdGF0ZSwgb3AsIG5vZGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiQ3JlYXRlLUxvYWQgWyVzXSBTdGF0ZT0lcCBPcD0lcCBuYW1lZF9vYmo9JXBcbiIsCisJCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wLT5jb21tb24uYW1sX29wY29kZSksCisJCQkgIHdhbGtfc3RhdGUsIG9wLCBub2RlKSk7CiAKIAkvKiBEZWNvZGUgdGhlIG9wY29kZSAqLwogCkBAIC04MTAsMjcgKzgzNSwzMiBAQAogCQkgKiBDcmVhdGUgdGhlIGZpZWxkIG9iamVjdCwgYnV0IHRoZSBmaWVsZCBidWZmZXIgYW5kIGluZGV4IG11c3QKIAkJICogYmUgZXZhbHVhdGVkIGxhdGVyIGR1cmluZyB0aGUgZXhlY3V0aW9uIHBoYXNlCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9idWZmZXJfZmllbGQgKG9wLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfYnVmZmVyX2ZpZWxkKG9wLCB3YWxrX3N0YXRlKTsKIAkJYnJlYWs7CiAKLQotCSBjYXNlIEFNTF9UWVBFX05BTUVEX0ZJRUxEOgorCWNhc2UgQU1MX1RZUEVfTkFNRURfRklFTEQ6CiAKIAkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKIAkJY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6CiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX2luZGV4X2ZpZWxkIChvcCwgKGFjcGlfaGFuZGxlKSBhcmctPmNvbW1vbi5ub2RlLAotCQkJCQkgd2Fsa19zdGF0ZSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZHNfY3JlYXRlX2luZGV4X2ZpZWxkKG9wLAorCQkJCQkJICAgICAgIChhY3BpX2hhbmRsZSkgYXJnLT4KKwkJCQkJCSAgICAgICBjb21tb24ubm9kZSwgd2Fsa19zdGF0ZSk7CiAJCQlicmVhazsKIAogCQljYXNlIEFNTF9CQU5LX0ZJRUxEX09QOgogCi0JCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9iYW5rX2ZpZWxkIChvcCwgYXJnLT5jb21tb24ubm9kZSwgd2Fsa19zdGF0ZSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZHNfY3JlYXRlX2JhbmtfZmllbGQob3AsIGFyZy0+Y29tbW9uLm5vZGUsCisJCQkJCQkgICAgICB3YWxrX3N0YXRlKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQU1MX0ZJRUxEX09QOgogCi0JCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9maWVsZCAob3AsIGFyZy0+Y29tbW9uLm5vZGUsIHdhbGtfc3RhdGUpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2RzX2NyZWF0ZV9maWVsZChvcCwgYXJnLT5jb21tb24ubm9kZSwKKwkJCQkJCSB3YWxrX3N0YXRlKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC04MzksNDMgKzg2OSw0MiBAQAogCQl9CiAJCWJyZWFrOwogCisJY2FzZSBBTUxfVFlQRV9OQU1FRF9TSU1QTEU6CiAKLQkgY2FzZSBBTUxfVFlQRV9OQU1FRF9TSU1QTEU6Ci0KLQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMgKHdhbGtfc3RhdGUsIGFyZyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwgYXJnKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAogCQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewogCQljYXNlIEFNTF9QUk9DRVNTT1JfT1A6CiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX3Byb2Nlc3NvciAod2Fsa19zdGF0ZSk7CisJCQlzdGF0dXMgPSBhY3BpX2V4X2NyZWF0ZV9wcm9jZXNzb3Iod2Fsa19zdGF0ZSk7CiAJCQlicmVhazsKIAogCQljYXNlIEFNTF9QT1dFUl9SRVNfT1A6CiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlICh3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlKHdhbGtfc3RhdGUpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBTUxfTVVURVhfT1A6CiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX211dGV4ICh3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX211dGV4KHdhbGtfc3RhdGUpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBTUxfRVZFTlRfT1A6CiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX2V2ZW50ICh3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX2V2ZW50KHdhbGtfc3RhdGUpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBTUxfREFUQV9SRUdJT05fT1A6CiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX3RhYmxlX3JlZ2lvbiAod2Fsa19zdGF0ZSk7CisJCQlzdGF0dXMgPSBhY3BpX2V4X2NyZWF0ZV90YWJsZV9yZWdpb24od2Fsa19zdGF0ZSk7CiAJCQlicmVhazsKIAogCQljYXNlIEFNTF9BTElBU19PUDoKIAotCQkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfYWxpYXMgKHdhbGtfc3RhdGUpOworCQkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfYWxpYXMod2Fsa19zdGF0ZSk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtODg4LDEyICs5MTcsMTIgQEAKIAkJLyogRGVsZXRlIG9wZXJhbmRzICovCiAKIAkJZm9yIChpID0gMTsgaSA8IHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kczsgaSsrKSB7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSk7CiAJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSA9IE5VTEw7CiAJCX0KIAogCQlicmVhazsKLSNlbmRpZiAvKiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04gKi8KKyNlbmRpZgkJCQkvKiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04gKi8KIAogCWNhc2UgQU1MX1RZUEVfTkFNRURfQ09NUExFWDoKIApAQCAtOTA5LDkgKzkzOCwxMCBAQAogCQkJICogSWYgd2UgaGF2ZSBhIHZhbGlkIHJlZ2lvbiwgaW5pdGlhbGl6ZSBpdAogCQkJICogTmFtZXNwYWNlIGlzIE5PVCBsb2NrZWQgYXQgdGhpcyBwb2ludC4KIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9ldl9pbml0aWFsaXplX3JlZ2lvbiAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKSwKLQkJCQkJIEZBTFNFKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9ldl9pbml0aWFsaXplX3JlZ2lvbgorCQkJICAgIChhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSksIEZBTFNFKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCS8qCiAJCQkJICogIElmIEFFX05PVF9FWElTVCBpcyByZXR1cm5lZCwgaXQgaXMgbm90IGZhdGFsCiAJCQkJICogIGJlY2F1c2UgbWFueSByZWdpb25zIGdldCBjcmVhdGVkIGJlZm9yZSBhIGhhbmRsZXIKQEAgLTkyMywxMyArOTUzLDExIEBACiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX05BTUVfT1A6CiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX25vZGUgKHdhbGtfc3RhdGUsIG5vZGUsIG9wKTsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX25vZGUod2Fsa19zdGF0ZSwgbm9kZSwgb3ApOwogCQkJYnJlYWs7Ci0jZW5kaWYgLyogQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OICovCi0KKyNlbmRpZgkJCQkvKiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04gKi8KIAogCQlkZWZhdWx0OgogCQkJLyogQWxsIE5BTUVEX0NPTVBMRVggb3Bjb2RlcyBtdXN0IGJlIGhhbmRsZWQgYWJvdmUgKi8KQEAgLTkzOCwyNyArOTY2LDI5IEBACiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX0NMQVNTX0lOVEVSTkFMOgogCiAJCS8qIGNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDogKi8KIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX0NMQVNTX01FVEhPRF9DQUxMOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkJIlJFU09MVklORy1tZXRob2RfY2FsbDogU3RhdGU9JXAgT3A9JXAgbmFtZWRfb2JqPSVwXG4iLAotCQkJd2Fsa19zdGF0ZSwgb3AsIG5vZGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkgICJSRVNPTFZJTkctbWV0aG9kX2NhbGw6IFN0YXRlPSVwIE9wPSVwIG5hbWVkX29iaj0lcFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUsIG9wLCBub2RlKSk7CiAKIAkJLyoKIAkJICogTG9va3VwIHRoZSBtZXRob2QgbmFtZSBhbmQgc2F2ZSB0aGUgTm9kZQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywKLQkJCQkgIEFDUElfVFlQRV9BTlksIEFDUElfSU1PREVfTE9BRF9QQVNTMiwKLQkJCQkgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLAotCQkJCSAgd2Fsa19zdGF0ZSwgJihuZXdfbm9kZSkpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAorCQkJCSAgIGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywgQUNQSV9UWVBFX0FOWSwKKwkJCQkgICBBQ1BJX0lNT0RFX0xPQURfUEFTUzIsCisJCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwKKwkJCQkgICBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwgd2Fsa19zdGF0ZSwKKwkJCQkgICAmKG5ld19ub2RlKSk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCiAJCQkvKgogCQkJICogTWFrZSBzdXJlIHRoYXQgd2hhdCB3ZSBmb3VuZCBpcyBpbmRlZWQgYSBtZXRob2QKIAkJCSAqIFdlIGRpZG4ndCBzZWFyY2ggZm9yIGEgbWV0aG9kIG9uIHB1cnBvc2UsIHRvIHNlZSBpZiB0aGUgbmFtZQpAQCAtOTczLDI0ICsxMDAzLDIwIEBACiAJCQkgKiBwYXJzZXIgdXNlcywgc28gd2UgY2FuIGdldCBpdCBhZ2FpbiBhdCB0aGUgZW5kIG9mIHRoaXMgc2NvcGUKIAkJCSAqLwogCQkJb3AtPmNvbW1vbi5ub2RlID0gbmV3X25vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX1JFUE9SVF9OU0VSUk9SIChhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIHN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX1JFUE9SVF9OU0VSUk9SKGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywgc3RhdHVzKTsKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAogCS8qIFJlbW92ZSB0aGUgTm9kZSBwdXNoZWQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nICovCiAKIAl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9IE5VTEw7CiAJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c2NvcGUuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3Njb3BlLmMKaW5kZXggMjFmNDU0OC4uZGVmZTk1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c2NvcGUuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jCkBAIC00MSwxNCArNDEsMTEgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHN3c2NvcGUiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJkc3dzY29wZSIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjIsMTUgKzU5LDExIEBACiAgKiAgICAgICAgICAgICAgcm9vdCBzY29wZSBvYmplY3QgKHdoaWNoIHJlbWFpbnMgYXQgdGhlIHN0YWNrIHRvcC4pCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV9kc19zY29wZV9zdGFja19jbGVhciAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK3ZvaWQgYWNwaV9kc19zY29wZV9zdGFja19jbGVhcihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnNjb3BlX2luZm87CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZV9pbmZvOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfc2NvcGVfc3RhY2tfY2xlYXIiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfc2NvcGVfc3RhY2tfY2xlYXIiKTsKIAogCXdoaWxlICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvKSB7CiAJCS8qIFBvcCBhIHNjb3BlIG9mZiB0aGUgc3RhY2sgKi8KQEAgLTc4LDE0ICs3MSwxNCBAQAogCQlzY29wZV9pbmZvID0gd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbzsKIAkJd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbyA9IHNjb3BlX2luZm8tPnNjb3BlLm5leHQ7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSJQb3BwZWQgb2JqZWN0IHR5cGUgKCVzKVxuIiwKLQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlKSkpOwotCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIChzY29wZV9pbmZvKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIlBvcHBlZCBvYmplY3QgdHlwZSAoJXMpXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHNjb3BlX2luZm8tPmNvbW1vbi4KKwkJCQkJCQl2YWx1ZSkpKTsKKwkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzY29wZV9pbmZvKTsKIAl9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19zY29wZV9zdGFja19wdXNoCkBAIC0xMDIsNzQgKzk1LDcwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19zY29wZV9zdGFja19wdXNoICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19zY29wZV9zdGFja19wdXNoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJCSBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnNjb3BlX2luZm87Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqb2xkX3Njb3BlX2luZm87CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZV9pbmZvOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqb2xkX3Njb3BlX2luZm87CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19zY29wZV9zdGFja19wdXNoIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19zY29wZV9zdGFja19wdXNoIik7CiAKIAlpZiAoIW5vZGUpIHsKIAkJLyogSW52YWxpZCBzY29wZSAgICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiZHNfc2NvcGVfc3RhY2tfcHVzaDogbnVsbCBzY29wZSBwYXNzZWRcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJkc19zY29wZV9zdGFja19wdXNoOiBudWxsIHNjb3BlIHBhc3NlZFxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogTWFrZSBzdXJlIG9iamVjdCB0eXBlIGlzIHZhbGlkICovCiAKLQlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUgKHR5cGUpKSB7Ci0JCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgKLQkJCSJkc19zY29wZV9zdGFja19wdXNoOiBJbnZhbGlkIG9iamVjdCB0eXBlOiAweCVYXG4iLCB0eXBlKSk7CisJaWYgKCFhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlKHR5cGUpKSB7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJkc19zY29wZV9zdGFja19wdXNoOiBJbnZhbGlkIG9iamVjdCB0eXBlOiAweCVYXG4iLCB0eXBlKSk7CiAJfQogCiAJLyogQWxsb2NhdGUgYSBuZXcgc2NvcGUgb2JqZWN0ICovCiAKLQlzY29wZV9pbmZvID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSAoKTsKKwlzY29wZV9pbmZvID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSgpOwogCWlmICghc2NvcGVfaW5mbykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCS8qIEluaXQgbmV3IHNjb3BlIG9iamVjdCAqLwogCiAJc2NvcGVfaW5mby0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1dTQ09QRTsKLQlzY29wZV9pbmZvLT5zY29wZS5ub2RlICAgICAgPSBub2RlOwotCXNjb3BlX2luZm8tPmNvbW1vbi52YWx1ZSAgICA9ICh1MTYpIHR5cGU7CisJc2NvcGVfaW5mby0+c2NvcGUubm9kZSA9IG5vZGU7CisJc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlID0gKHUxNikgdHlwZTsKIAogCXdhbGtfc3RhdGUtPnNjb3BlX2RlcHRoKys7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkiWyUuMmRdIFB1c2hlZCBzY29wZSAiLCAodTMyKSB3YWxrX3N0YXRlLT5zY29wZV9kZXB0aCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCSAgIlslLjJkXSBQdXNoZWQgc2NvcGUgIiwKKwkJCSAgKHUzMikgd2Fsa19zdGF0ZS0+c2NvcGVfZGVwdGgpKTsKIAogCW9sZF9zY29wZV9pbmZvID0gd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbzsKIAlpZiAob2xkX3Njb3BlX2luZm8pIHsKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0VYRUMsCi0JCQkiWyU0LjRzXSAoJXMpIiwKLQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2xkX3Njb3BlX2luZm8tPnNjb3BlLm5vZGUpLAotCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChvbGRfc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlKSkpOwotCX0KLQllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0VYRUMsCi0JCQkiW1xcX19fXSAoJXMpIiwgIlJPT1QiKSk7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0VYRUMsCisJCQkJICAgICAgIlslNC40c10gKCVzKSIsCisJCQkJICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9sZF9zY29wZV9pbmZvLT4KKwkJCQkJCQkgICAgc2NvcGUubm9kZSksCisJCQkJICAgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9sZF9zY29wZV9pbmZvLT4KKwkJCQkJCQkgICAgY29tbW9uLnZhbHVlKSkpOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0VYRUMsICJbXFxfX19dICglcykiLCAiUk9PVCIpKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfRVhFQywKLQkJIiwgTmV3IHNjb3BlIC0+IFslNC40c10gKCVzKVxuIiwKLQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChzY29wZV9pbmZvLT5zY29wZS5ub2RlKSwKLQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChzY29wZV9pbmZvLT5jb21tb24udmFsdWUpKSk7CisJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfRVhFQywKKwkJCSAgICAgICIsIE5ldyBzY29wZSAtPiBbJTQuNHNdICglcylcbiIsCisJCQkgICAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUoc2NvcGVfaW5mby0+c2NvcGUubm9kZSksCisJCQkgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUoc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlKSkpOwogCiAJLyogUHVzaCBuZXcgc2NvcGUgb2JqZWN0IG9udG8gc3RhY2sgKi8KIAotCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlICgmd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgc2NvcGVfaW5mbyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUoJndhbGtfc3RhdGUtPnNjb3BlX2luZm8sIHNjb3BlX2luZm8pOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19zY29wZV9zdGFja19wb3AKQEAgLTE4Miw0NyArMTcxLDQxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZHNfc2NvcGVfc3RhY2tfcG9wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9kc19zY29wZV9zdGFja19wb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzY29wZV9pbmZvOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKm5ld19zY29wZV9pbmZvOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc2NvcGVfaW5mbzsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKm5ld19zY29wZV9pbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfc2NvcGVfc3RhY2tfcG9wIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19zY29wZV9zdGFja19wb3AiKTsKIAogCS8qCiAJICogUG9wIHNjb3BlIGluZm8gb2JqZWN0IG9mZiB0aGUgc3RhY2suCiAJICovCi0Jc2NvcGVfaW5mbyA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUgKCZ3YWxrX3N0YXRlLT5zY29wZV9pbmZvKTsKKwlzY29wZV9pbmZvID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbyk7CiAJaWYgKCFzY29wZV9pbmZvKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfU1RBQ0tfVU5ERVJGTE9XKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NUQUNLX1VOREVSRkxPVyk7CiAJfQogCiAJd2Fsa19zdGF0ZS0+c2NvcGVfZGVwdGgtLTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCSJbJS4yZF0gUG9wcGVkIHNjb3BlIFslNC40c10gKCVzKSwgTmV3IHNjb3BlIC0+ICIsCi0JCSh1MzIpIHdhbGtfc3RhdGUtPnNjb3BlX2RlcHRoLAotCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHNjb3BlX2luZm8tPnNjb3BlLm5vZGUpLAotCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKHNjb3BlX2luZm8tPmNvbW1vbi52YWx1ZSkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkgICJbJS4yZF0gUG9wcGVkIHNjb3BlIFslNC40c10gKCVzKSwgTmV3IHNjb3BlIC0+ICIsCisJCQkgICh1MzIpIHdhbGtfc3RhdGUtPnNjb3BlX2RlcHRoLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUoc2NvcGVfaW5mby0+c2NvcGUubm9kZSksCisJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShzY29wZV9pbmZvLT5jb21tb24udmFsdWUpKSk7CiAKIAluZXdfc2NvcGVfaW5mbyA9IHdhbGtfc3RhdGUtPnNjb3BlX2luZm87CiAJaWYgKG5ld19zY29wZV9pbmZvKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9FWEVDLAotCQkJIlslNC40c10gKCVzKVxuIiwKLQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAobmV3X3Njb3BlX2luZm8tPnNjb3BlLm5vZGUpLAotCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChuZXdfc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlKSkpOwotCX0KLQllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0VYRUMsCi0JCQkiW1xcX19fXSAoUk9PVClcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfRVhFQywKKwkJCQkgICAgICAiWyU0LjRzXSAoJXMpXG4iLAorCQkJCSAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShuZXdfc2NvcGVfaW5mby0+CisJCQkJCQkJICAgIHNjb3BlLm5vZGUpLAorCQkJCSAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShuZXdfc2NvcGVfaW5mby0+CisJCQkJCQkJICAgIGNvbW1vbi52YWx1ZSkpKTsKKwl9IGVsc2UgeworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9FWEVDLCAiW1xcX19fXSAoUk9PVClcbiIpKTsKIAl9CiAKLQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIChzY29wZV9pbmZvKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHNjb3BlX2luZm8pOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c3RhdGUuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3N0YXRlLmMKaW5kZXggOWNkM2RiNi4uN2Q2OGE1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c3RhdGUuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jCkBAIC00MSwzNyArNDEsMjggQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHN3c3RhdGUiKQorQUNQSV9NT0RVTEVfTkFNRSgiZHN3c3RhdGUiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KICNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwogYWNwaV9zdGF0dXMKLWFjcGlfZHNfcmVzdWx0X2luc2VydCAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX3Jlc3VsdF9pbnNlcnQodm9pZCAqb2JqZWN0LAorCQkgICAgICB1MzIgaW5kZXgsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOworCithY3BpX3N0YXR1cyBhY3BpX2RzX29ial9zdGFja19kZWxldGVfYWxsKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19vYmpfc3RhY2tfZGVsZXRlX2FsbCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX29ial9zdGFja19wb3Bfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmplY3QsCisJCQkgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19vYmpfc3RhY2tfcG9wX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9iamVjdCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotdm9pZCAqCi1hY3BpX2RzX29ial9zdGFja19nZXRfdmFsdWUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Cit2b2lkICphY3BpX2RzX29ial9zdGFja19nZXRfdmFsdWUodTMyIGluZGV4LAorCQkJCSAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAjZW5kaWYKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCkBAIC05MiwzNiArODMsMzUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9yZW1vdmUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19yZXN1bHRfcmVtb3ZlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmplY3QsCisJCSAgICAgIHUzMiBpbmRleCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZTsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19yZXN1bHRfcmVtb3ZlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX3Jlc3VsdF9yZW1vdmUiKTsKIAogCXN0YXRlID0gd2Fsa19zdGF0ZS0+cmVzdWx0czsKIAlpZiAoIXN0YXRlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTm8gcmVzdWx0IG9iamVjdCBwdXNoZWQhIFN0YXRlPSVwXG4iLAotCQkJd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk5vIHJlc3VsdCBvYmplY3QgcHVzaGVkISBTdGF0ZT0lcFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUpKTsKIAkJcmV0dXJuIChBRV9OT1RfRVhJU1QpOwogCX0KIAogCWlmIChpbmRleCA+PSBBQ1BJX09CSl9NQVhfT1BFUkFORCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJJbmRleCBvdXQgb2YgcmFuZ2U6ICVYIFN0YXRlPSVwIE51bT0lWFxuIiwKLQkJCWluZGV4LCB3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkluZGV4IG91dCBvZiByYW5nZTogJVggU3RhdGU9JXAgTnVtPSVYXG4iLAorCQkJCSAgaW5kZXgsIHdhbGtfc3RhdGUsCisJCQkJICBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOwogCX0KIAogCS8qIENoZWNrIGZvciBhIHZhbGlkIHJlc3VsdCBvYmplY3QgKi8KIAotCWlmICghc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4XSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJOdWxsIG9wZXJhbmQhIFN0YXRlPSVwICNPcHM9JVgsIEluZGV4PSVYXG4iLAotCQkJd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMsIGluZGV4KSk7CisJaWYgKCFzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzY1tpbmRleF0pIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJOdWxsIG9wZXJhbmQhIFN0YXRlPSVwICNPcHM9JVgsIEluZGV4PSVYXG4iLAorCQkJCSAgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMsCisJCQkJICBpbmRleCkpOwogCQlyZXR1cm4gKEFFX0FNTF9OT19SRVRVUk5fVkFMVUUpOwogCX0KIApAQCAtMTI5LDE4ICsxMTksMjAgQEAKIAogCXN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLS07CiAKLQkqb2JqZWN0ID0gc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4XTsKLQlzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzYyBbaW5kZXhdID0gTlVMTDsKKwkqb2JqZWN0ID0gc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2NbaW5kZXhdOworCXN0YXRlLT5yZXN1bHRzLm9ial9kZXNjW2luZGV4XSA9IE5VTEw7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkiT2JqPSVwIFslc10gSW5kZXg9JVggU3RhdGU9JXAgTnVtPSVYXG4iLAotCQkqb2JqZWN0LCAoKm9iamVjdCkgPyBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lICgqb2JqZWN0KSA6ICJOVUxMIiwKLQkJaW5kZXgsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJICAiT2JqPSVwIFslc10gSW5kZXg9JVggU3RhdGU9JXAgTnVtPSVYXG4iLAorCQkJICAqb2JqZWN0LAorCQkJICAoKm9iamVjdCkgPyBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKCpvYmplY3QpIDoKKwkJCSAgIk5VTEwiLCBpbmRleCwgd2Fsa19zdGF0ZSwKKwkJCSAgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKIAogCXJldHVybiAoQUVfT0spOwogfQogCi0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTU3LDE2ICsxNDksMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9wb3AgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfcmVzdWx0X3BvcCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqIG9iamVjdCwKKwkJICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCiB7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpbmRleDsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZTsKKwlhY3BpX25hdGl2ZV91aW50IGluZGV4OworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX3Jlc3VsdF9wb3AiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfcmVzdWx0X3BvcCIpOwogCiAJc3RhdGUgPSB3YWxrX3N0YXRlLT5yZXN1bHRzOwogCWlmICghc3RhdGUpIHsKQEAgLTE3NCw4ICsxNjMsOSBAQAogCX0KIAogCWlmICghc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJSZXN1bHQgc3RhY2sgaXMgZW1wdHkhIFN0YXRlPSVwXG4iLAotCQkJd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlJlc3VsdCBzdGFjayBpcyBlbXB0eSEgU3RhdGU9JXBcbiIsCisJCQkJICB3YWxrX3N0YXRlKSk7CiAJCXJldHVybiAoQUVfQU1MX05PX1JFVFVSTl9WQUxVRSk7CiAJfQogCkBAIC0xODYsMjYgKzE3NiwyNyBAQAogCWZvciAoaW5kZXggPSBBQ1BJX09CSl9OVU1fT1BFUkFORFM7IGluZGV4OyBpbmRleC0tKSB7CiAJCS8qIENoZWNrIGZvciBhIHZhbGlkIHJlc3VsdCBvYmplY3QgKi8KIAotCQlpZiAoc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4IC0xXSkgewotCQkJKm9iamVjdCA9IHN0YXRlLT5yZXN1bHRzLm9ial9kZXNjIFtpbmRleCAtMV07Ci0JCQlzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzYyBbaW5kZXggLTFdID0gTlVMTDsKKwkJaWYgKHN0YXRlLT5yZXN1bHRzLm9ial9kZXNjW2luZGV4IC0gMV0pIHsKKwkJCSpvYmplY3QgPSBzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzY1tpbmRleCAtIDFdOworCQkJc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2NbaW5kZXggLSAxXSA9IE5VTEw7CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkJIk9iaj0lcCBbJXNdIEluZGV4PSVYIFN0YXRlPSVwIE51bT0lWFxuIiwKLQkJCQkqb2JqZWN0LAotCQkJCSgqb2JqZWN0KSA/IGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKCpvYmplY3QpIDogIk5VTEwiLAotCQkJCSh1MzIpIGluZGV4IC0xLCB3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCQkgICJPYmo9JXAgWyVzXSBJbmRleD0lWCBTdGF0ZT0lcCBOdW09JVhcbiIsCisJCQkJCSAgKm9iamVjdCwKKwkJCQkJICAoKm9iamVjdCkgPworCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoKm9iamVjdCkKKwkJCQkJICA6ICJOVUxMIiwgKHUzMikgaW5kZXggLSAxLCB3YWxrX3N0YXRlLAorCQkJCQkgIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CiAKIAkJCXJldHVybiAoQUVfT0spOwogCQl9CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCSJObyByZXN1bHQgb2JqZWN0cyEgU3RhdGU9JXBcbiIsIHdhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJICAiTm8gcmVzdWx0IG9iamVjdHMhIFN0YXRlPSVwXG4iLCB3YWxrX3N0YXRlKSk7CiAJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Jlc3VsdF9wb3BfZnJvbV9ib3R0b20KQEAgLTIyMSwzOCArMjEyLDM3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfcG9wX2Zyb21fYm90dG9tICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqZWN0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2RzX3Jlc3VsdF9wb3BfZnJvbV9ib3R0b20odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKiBvYmplY3QsCisJCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCiB7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpbmRleDsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZTsKKwlhY3BpX25hdGl2ZV91aW50IGluZGV4OworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX3Jlc3VsdF9wb3BfZnJvbV9ib3R0b20iKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfcmVzdWx0X3BvcF9mcm9tX2JvdHRvbSIpOwogCiAJc3RhdGUgPSB3YWxrX3N0YXRlLT5yZXN1bHRzOwogCWlmICghc3RhdGUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiV2FybmluZzogTm8gcmVzdWx0IG9iamVjdCBwdXNoZWQhIFN0YXRlPSVwXG4iLCB3YWxrX3N0YXRlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiV2FybmluZzogTm8gcmVzdWx0IG9iamVjdCBwdXNoZWQhIFN0YXRlPSVwXG4iLAorCQkJCSAgd2Fsa19zdGF0ZSkpOwogCQlyZXR1cm4gKEFFX05PVF9FWElTVCk7CiAJfQogCiAJaWYgKCFzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIHJlc3VsdCBvYmplY3RzISBTdGF0ZT0lcFxuIiwKLQkJCXdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJObyByZXN1bHQgb2JqZWN0cyEgU3RhdGU9JXBcbiIsIHdhbGtfc3RhdGUpKTsKIAkJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIAl9CiAKIAkvKiBSZW1vdmUgQm90dG9tIGVsZW1lbnQgKi8KIAotCSpvYmplY3QgPSBzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzYyBbMF07CisJKm9iamVjdCA9IHN0YXRlLT5yZXN1bHRzLm9ial9kZXNjWzBdOwogCiAJLyogUHVzaCBlbnRpcmUgc3RhY2sgZG93biBvbmUgZWxlbWVudCAqLwogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHM7IGluZGV4KyspIHsKLQkJc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4XSA9IHN0YXRlLT5yZXN1bHRzLm9ial9kZXNjIFtpbmRleCArIDFdOworCQlzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzY1tpbmRleF0gPQorCQkgICAgc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2NbaW5kZXggKyAxXTsKIAl9CiAKIAlzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cy0tOwpAQCAtMjYwLDIwICsyNTAsMjEgQEAKIAkvKiBDaGVjayBmb3IgYSB2YWxpZCByZXN1bHQgb2JqZWN0ICovCiAKIAlpZiAoISpvYmplY3QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTnVsbCBvcGVyYW5kISBTdGF0ZT0lcCAjT3BzPSVYLCBJbmRleD0lWFxuIiwKLQkJCXdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLCAodTMyKSBpbmRleCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk51bGwgb3BlcmFuZCEgU3RhdGU9JXAgI09wcz0lWCBJbmRleD0lWFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLAorCQkJCSAgKHUzMikgaW5kZXgpKTsKIAkJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIFslc10sIFJlc3VsdHM9JXAgU3RhdGU9JXBcbiIsCi0JCSpvYmplY3QsICgqb2JqZWN0KSA/IGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKCpvYmplY3QpIDogIk5VTEwiLAotCQlzdGF0ZSwgd2Fsa19zdGF0ZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIk9iaj0lcCBbJXNdIFJlc3VsdHM9JXAgU3RhdGU9JXBcbiIsCisJCQkgICpvYmplY3QsCisJCQkgICgqb2JqZWN0KSA/IGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoKm9iamVjdCkgOgorCQkJICAiTlVMTCIsIHN0YXRlLCB3YWxrX3N0YXRlKSk7CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Jlc3VsdF9wdXNoCkBAIC0yODgsNDcgKzI3OSw1MCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfcmVzdWx0X3B1c2ggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19yZXN1bHRfcHVzaCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogb2JqZWN0LAorCQkgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfcmVzdWx0X3B1c2giKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfcmVzdWx0X3B1c2giKTsKIAogCXN0YXRlID0gd2Fsa19zdGF0ZS0+cmVzdWx0czsKIAlpZiAoIXN0YXRlKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIk5vIHJlc3VsdCBzdGFjayBmcmFtZSBkdXJpbmcgcHVzaFxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIHJlc3VsdCBzdGFjayBmcmFtZSBkdXJpbmcgcHVzaFxuIikpOwogCQlyZXR1cm4gKEFFX0FNTF9JTlRFUk5BTCk7CiAJfQogCiAJaWYgKHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzID09IEFDUElfT0JKX05VTV9PUEVSQU5EUykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJSZXN1bHQgc3RhY2sgb3ZlcmZsb3c6IE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsCi0JCQlvYmplY3QsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiUmVzdWx0IHN0YWNrIG92ZXJmbG93OiBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAorCQkJCSAgb2JqZWN0LCB3YWxrX3N0YXRlLAorCQkJCSAgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKIAkJcmV0dXJuIChBRV9TVEFDS19PVkVSRkxPVyk7CiAJfQogCiAJaWYgKCFvYmplY3QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTnVsbCBPYmplY3QhIE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsCi0JCQlvYmplY3QsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTnVsbCBPYmplY3QhIE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsCisJCQkJICBvYmplY3QsIHdhbGtfc3RhdGUsCisJCQkJICBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOwogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXRlLT5yZXN1bHRzLm9ial9kZXNjIFtzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0c10gPSBvYmplY3Q7CisJc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2Nbc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHNdID0gb2JqZWN0OwogCXN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKys7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIFslc10gU3RhdGU9JXAgTnVtPSVYIEN1cj0lWFxuIiwKLQkJb2JqZWN0LCBvYmplY3QgPyBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKSBvYmplY3QpIDogIk5VTEwiLAotCQl3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cywgd2Fsa19zdGF0ZS0+Y3VycmVudF9yZXN1bHQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgWyVzXSBTdGF0ZT0lcCBOdW09JVggQ3VyPSVYXG4iLAorCQkJICBvYmplY3QsCisJCQkgIG9iamVjdCA/CisJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoKHVuaW9uCisJCQkJCQkJYWNwaV9vcGVyYW5kX29iamVjdCAqKQorCQkJCQkJICAgICAgIG9iamVjdCkgOiAiTlVMTCIsCisJCQkgIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLAorCQkJICB3YWxrX3N0YXRlLT5jdXJyZW50X3Jlc3VsdCkpOwogCiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaApAQCAtMzQxLDMwICszMzUsMjYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZHNfcmVzdWx0X3N0YWNrX3B1c2goc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX3Jlc3VsdF9zdGFja19wdXNoIik7CisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19yZXN1bHRfc3RhY2tfcHVzaCIpOwogCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKCk7CisJc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CiAJaWYgKCFzdGF0ZSkgewogCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CiAJfQogCiAJc3RhdGUtPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9SRVNVTFQ7Ci0JYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUgKCZ3YWxrX3N0YXRlLT5yZXN1bHRzLCBzdGF0ZSk7CisJYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUoJndhbGtfc3RhdGUtPnJlc3VsdHMsIHN0YXRlKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJSZXN1bHRzPSVwIFN0YXRlPSVwXG4iLAotCQlzdGF0ZSwgd2Fsa19zdGF0ZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlJlc3VsdHM9JXAgU3RhdGU9JXBcbiIsCisJCQkgIHN0YXRlLCB3YWxrX3N0YXRlKSk7CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3AKQEAgLTM3NywzNSArMzY3LDMxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZTsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfcmVzdWx0X3N0YWNrX3BvcCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19yZXN1bHRfc3RhY2tfcG9wIik7CiAKIAkvKiBDaGVjayBmb3Igc3RhY2sgdW5kZXJmbG93ICovCiAKIAlpZiAod2Fsa19zdGF0ZS0+cmVzdWx0cyA9PSBOVUxMKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJVbmRlcmZsb3cgLSBTdGF0ZT0lcFxuIiwKLQkJCXdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiVW5kZXJmbG93IC0gU3RhdGU9JXBcbiIsCisJCQkJICB3YWxrX3N0YXRlKSk7CiAJCXJldHVybiAoQUVfQU1MX05PX09QRVJBTkQpOwogCX0KIAotCXN0YXRlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSAoJndhbGtfc3RhdGUtPnJlc3VsdHMpOworCXN0YXRlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+cmVzdWx0cyk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkiUmVzdWx0PSVwIHJlbWFpbmluZ19yZXN1bHRzPSVYIFN0YXRlPSVwXG4iLAotCQlzdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMsIHdhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkgICJSZXN1bHQ9JXAgcmVtYWluaW5nX3Jlc3VsdHM9JVggU3RhdGU9JXBcbiIsCisJCQkgIHN0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cywgd2Fsa19zdGF0ZSkpOwogCi0JYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoc3RhdGUpOworCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc3RhdGUpOwogCiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcHVzaApAQCAtNDIwLDM1ICs0MDYsMzUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19wdXNoICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfb2JqX3N0YWNrX3B1c2godm9pZCAqb2JqZWN0LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19vYmpfc3RhY2tfcHVzaCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19vYmpfc3RhY2tfcHVzaCIpOwogCiAJLyogQ2hlY2sgZm9yIHN0YWNrIG92ZXJmbG93ICovCiAKIAlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID49IEFDUElfT0JKX05VTV9PUEVSQU5EUykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJvdmVyZmxvdyEgT2JqPSVwIFN0YXRlPSVwICNPcHM9JVhcbiIsCi0JCQlvYmplY3QsIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIm92ZXJmbG93ISBPYmo9JXAgU3RhdGU9JXAgI09wcz0lWFxuIiwKKwkJCQkgIG9iamVjdCwgd2Fsa19zdGF0ZSwKKwkJCQkgIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwogCQlyZXR1cm4gKEFFX1NUQUNLX09WRVJGTE9XKTsKIAl9CiAKIAkvKiBQdXQgdGhlIG9iamVjdCBvbnRvIHRoZSBzdGFjayAqLwogCi0Jd2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10gPSBvYmplY3Q7CisJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IG9iamVjdDsKIAl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMrKzsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgWyVzXSBTdGF0ZT0lcCAjT3BzPSVYXG4iLAotCQkJICBvYmplY3QsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopIG9iamVjdCksCi0JCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIk9iaj0lcCBbJXNdIFN0YXRlPSVwICNPcHM9JVhcbiIsCisJCQkgIG9iamVjdCwKKwkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSgodW5pb24KKwkJCQkJCQlhY3BpX29wZXJhbmRfb2JqZWN0ICopCisJCQkJCQkgICAgICAgb2JqZWN0KSwgd2Fsa19zdGF0ZSwKKwkJCSAgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19wb3AKQEAgLTQ2NCwzOCArNDUwLDM1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19vYmpfc3RhY2tfcG9wICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcF9jb3VudCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19vYmpfc3RhY2tfcG9wKHUzMiBwb3BfY291bnQsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKwl1MzIgaTsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX29ial9zdGFja19wb3AiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfb2JqX3N0YWNrX3BvcCIpOwogCiAJZm9yIChpID0gMDsgaSA8IHBvcF9jb3VudDsgaSsrKSB7CiAJCS8qIENoZWNrIGZvciBzdGFjayB1bmRlcmZsb3cgKi8KIAogCQlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID09IDApIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJVbmRlcmZsb3chIENvdW50PSVYIFN0YXRlPSVwICNPcHM9JVhcbiIsCi0JCQkJcG9wX2NvdW50LCB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIlVuZGVyZmxvdyEgQ291bnQ9JVggU3RhdGU9JXAgI09wcz0lWFxuIiwKKwkJCQkJICBwb3BfY291bnQsIHdhbGtfc3RhdGUsCisJCQkJCSAgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CiAJCQlyZXR1cm4gKEFFX1NUQUNLX1VOREVSRkxPVyk7CiAJCX0KIAogCQkvKiBKdXN0IHNldCB0aGUgc3RhY2sgZW50cnkgdG8gbnVsbCAqLwogCiAJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcy0tOwotCQl3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IE5VTEw7CisJCXdhbGtfc3RhdGUtPm9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10gPSBOVUxMOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJDb3VudD0lWCBTdGF0ZT0lcCAjT3BzPSVYXG4iLAorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkNvdW50PSVYIFN0YXRlPSVwICNPcHM9JVhcbiIsCiAJCQkgIHBvcF9jb3VudCwgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19wb3BfYW5kX2RlbGV0ZQpAQCAtNTExLDQ0ICs0OTQsNDMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19wb3BfYW5kX2RlbGV0ZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BfY291bnQsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlKHUzMiBwb3BfY291bnQsCisJCQkJIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKKwl1MzIgaTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX29ial9zdGFja19wb3BfYW5kX2RlbGV0ZSIpOwogCiAJZm9yIChpID0gMDsgaSA8IHBvcF9jb3VudDsgaSsrKSB7CiAJCS8qIENoZWNrIGZvciBzdGFjayB1bmRlcmZsb3cgKi8KIAogCQlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID09IDApIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJVbmRlcmZsb3chIENvdW50PSVYIFN0YXRlPSVwICNPcHM9JVhcbiIsCi0JCQkJcG9wX2NvdW50LCB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIlVuZGVyZmxvdyEgQ291bnQ9JVggU3RhdGU9JXAgI09wcz0lWFxuIiwKKwkJCQkJICBwb3BfY291bnQsIHdhbGtfc3RhdGUsCisJCQkJCSAgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CiAJCQlyZXR1cm4gKEFFX1NUQUNLX1VOREVSRkxPVyk7CiAJCX0KIAogCQkvKiBQb3AgdGhlIHN0YWNrIGFuZCBkZWxldGUgYW4gb2JqZWN0IGlmIHByZXNlbnQgaW4gdGhpcyBzdGFjayBlbnRyeSAqLwogCiAJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcy0tOwotCQlvYmpfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdOworCQlvYmpfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc107CiAJCWlmIChvYmpfZGVzYykgewotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlICh3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSk7Ci0JCQl3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IE5VTEw7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uod2Fsa19zdGF0ZS0+CisJCQkJCQkgb3BlcmFuZHNbd2Fsa19zdGF0ZS0+CisJCQkJCQkJICBudW1fb3BlcmFuZHNdKTsKKwkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10gPSBOVUxMOwogCQl9CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIkNvdW50PSVYIFN0YXRlPSVwICNPcHM9JVhcbiIsCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiQ291bnQ9JVggU3RhdGU9JXAgI09wcz0lWFxuIiwKIAkJCSAgcG9wX2NvdW50LCB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKIAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZQpAQCAtNTYyLDI1ICs1NDQsMjEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICoKLWFjcGlfZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZSAoCi0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkKQotCitzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICphY3BpX2RzX2dldF9jdXJyZW50X3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlCisJCQkJCQkgICAgICAgKnRocmVhZCkKIHsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19nZXRfY3VycmVudF93YWxrX3N0YXRlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX2dldF9jdXJyZW50X3dhbGtfc3RhdGUiKTsKIAogCWlmICghdGhyZWFkKSB7CiAJCXJldHVybiAoTlVMTCk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsICJDdXJyZW50IHdhbGtfc3RhdGUgJXBcbiIsCi0JCXRocmVhZC0+d2Fsa19zdGF0ZV9saXN0KSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIkN1cnJlbnQgd2Fsa19zdGF0ZSAlcFxuIiwKKwkJCSAgdGhyZWFkLT53YWxrX3N0YXRlX2xpc3QpKTsKIAogCXJldHVybiAodGhyZWFkLT53YWxrX3N0YXRlX2xpc3QpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcHVzaF93YWxrX3N0YXRlCkBAIC01OTUsMjAgKzU3MywxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV9kc19wdXNoX3dhbGtfc3RhdGUgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkKQorYWNwaV9kc19wdXNoX3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqdGhyZWFkKQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19wdXNoX3dhbGtfc3RhdGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19wdXNoX3dhbGtfc3RhdGUiKTsKIAotCi0Jd2Fsa19zdGF0ZS0+bmV4dCAgICAgID0gdGhyZWFkLT53YWxrX3N0YXRlX2xpc3Q7CisJd2Fsa19zdGF0ZS0+bmV4dCA9IHRocmVhZC0+d2Fsa19zdGF0ZV9saXN0OwogCXRocmVhZC0+d2Fsa19zdGF0ZV9saXN0ID0gd2Fsa19zdGF0ZTsKIAogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcG9wX3dhbGtfc3RhdGUKQEAgLTYyMywxNSArNTk4LDExIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqCi1hY3BpX2RzX3BvcF93YWxrX3N0YXRlICgKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpCitzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICphY3BpX2RzX3BvcF93YWxrX3N0YXRlKHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqdGhyZWFkKQogewotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGU7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX3BvcF93YWxrX3N0YXRlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19wb3Bfd2Fsa19zdGF0ZSIpOwogCiAJd2Fsa19zdGF0ZSA9IHRocmVhZC0+d2Fsa19zdGF0ZV9saXN0OwogCkBAIC02NDcsMTAgKzYxOCw5IEBACiAJCSAqLwogCX0KIAotCXJldHVybl9QVFIgKHdhbGtfc3RhdGUpOworCXJldHVybl9QVFIod2Fsa19zdGF0ZSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZQpAQCAtNjY3LDU3ICs2MzcsNTUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICoKLWFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUgKAotCWFjcGlfb3duZXJfaWQgICAgICAgICAgICAgICAgICAgb3duZXJfaWQsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3JpZ2luLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm10aF9kZXNjLAotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgKnRocmVhZCkKK3N0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKmFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUoYWNwaV9vd25lcl9pZCBvd25lcl9pZCwKKwkJCQkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QKKwkJCQkJCSAgKm9yaWdpbiwKKwkJCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorCQkJCQkJICAqbXRoX2Rlc2MsCisJCQkJCQkgIHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZQorCQkJCQkJICAqdGhyZWFkKQogewotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19jcmVhdGVfd2Fsa19zdGF0ZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX2NyZWF0ZV93YWxrX3N0YXRlIik7Ci0KLQotCXdhbGtfc3RhdGUgPSBhY3BpX3V0X2FjcXVpcmVfZnJvbV9jYWNoZSAoQUNQSV9NRU1fTElTVF9XQUxLKTsKKwl3YWxrX3N0YXRlID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlKSk7CiAJaWYgKCF3YWxrX3N0YXRlKSB7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAotCXdhbGtfc3RhdGUtPmRhdGFfdHlwZSAgICAgICA9IEFDUElfREVTQ19UWVBFX1dBTEs7Ci0Jd2Fsa19zdGF0ZS0+b3duZXJfaWQgICAgICAgID0gb3duZXJfaWQ7Ci0Jd2Fsa19zdGF0ZS0+b3JpZ2luICAgICAgICAgID0gb3JpZ2luOwotCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjICAgICA9IG10aF9kZXNjOwotCXdhbGtfc3RhdGUtPnRocmVhZCAgICAgICAgICA9IHRocmVhZDsKKwl3YWxrX3N0YXRlLT5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9XQUxLOworCXdhbGtfc3RhdGUtPm93bmVyX2lkID0gb3duZXJfaWQ7CisJd2Fsa19zdGF0ZS0+b3JpZ2luID0gb3JpZ2luOworCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjID0gbXRoX2Rlc2M7CisJd2Fsa19zdGF0ZS0+dGhyZWFkID0gdGhyZWFkOwogCiAJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnN0YXJ0X29wID0gb3JpZ2luOwogCiAJLyogSW5pdCB0aGUgbWV0aG9kIGFyZ3MvbG9jYWwgKi8KIAogI2lmICghZGVmaW5lZCAoQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OKSAmJiAhZGVmaW5lZCAoQUNQSV9DT05TVEFOVF9FVkFMX09OTFkpKQotCWFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdCAod2Fsa19zdGF0ZSk7CisJYWNwaV9kc19tZXRob2RfZGF0YV9pbml0KHdhbGtfc3RhdGUpOwogI2VuZGlmCiAKIAkvKiBDcmVhdGUgYW4gaW5pdGlhbCByZXN1bHQgc3RhY2sgZW50cnkgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3B1c2ggKHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV91dF9yZWxlYXNlX3RvX2NhY2hlIChBQ1BJX01FTV9MSVNUX1dBTEssIHdhbGtfc3RhdGUpOwotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoKHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX01FTV9GUkVFKHdhbGtfc3RhdGUpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAogCS8qIFB1dCB0aGUgbmV3IHN0YXRlIGF0IHRoZSBoZWFkIG9mIHRoZSB3YWxrIGxpc3QgKi8KIAogCWlmICh0aHJlYWQpIHsKLQkJYWNwaV9kc19wdXNoX3dhbGtfc3RhdGUgKHdhbGtfc3RhdGUsIHRocmVhZCk7CisJCWFjcGlfZHNfcHVzaF93YWxrX3N0YXRlKHdhbGtfc3RhdGUsIHRocmVhZCk7CiAJfQogCi0JcmV0dXJuX1BUUiAod2Fsa19zdGF0ZSk7CisJcmV0dXJuX1BUUih3YWxrX3N0YXRlKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2luaXRfYW1sX3dhbGsKQEAgLTczNyw3MCArNzA1LDcwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X2FtbF93YWxrICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm1ldGhvZF9ub2RlLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9zdGFydCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9sZW5ndGgsCi0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfbnVtYmVyKQorYWNwaV9kc19pbml0X2FtbF93YWxrKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9ub2RlLAorCQkgICAgICB1OCAqIGFtbF9zdGFydCwKKwkJICAgICAgdTMyIGFtbF9sZW5ndGgsCisJCSAgICAgIHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvLCB1OCBwYXNzX251bWJlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUgPSAmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmV4dHJhX29wOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlID0gJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZTsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqZXh0cmFfb3A7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19pbml0X2FtbF93YWxrIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfaW5pdF9hbWxfd2FsayIpOwotCi0KLQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sICAgID0KLQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sX3N0YXJ0ID0gYW1sX3N0YXJ0OworCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwgPQorCSAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sX3N0YXJ0ID0gYW1sX3N0YXJ0OwogCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfZW5kID0KLQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUucGtnX2VuZCA9IGFtbF9zdGFydCArIGFtbF9sZW5ndGg7CisJICAgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5wa2dfZW5kID0gYW1sX3N0YXJ0ICsgYW1sX2xlbmd0aDsKIAogCS8qIFRoZSBuZXh0X29wIG9mIHRoZSBuZXh0X3dhbGsgd2lsbCBiZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXRob2QgKi8KIAogCXdhbGtfc3RhdGUtPm5leHRfb3AgPSBOVUxMOworCXdhbGtfc3RhdGUtPnBhc3NfbnVtYmVyID0gcGFzc19udW1iZXI7CiAKIAlpZiAoaW5mbykgewogCQlpZiAoaW5mby0+cGFyYW1ldGVyX3R5cGUgPT0gQUNQSV9QQVJBTV9HUEUpIHsKLQkJCXdhbGtfc3RhdGUtPmdwZV9ldmVudF9pbmZvID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8sCi0JCQkJCSAgIGluZm8tPnBhcmFtZXRlcnMpOwotCQl9Ci0JCWVsc2UgewotCQkJd2Fsa19zdGF0ZS0+cGFyYW1zICAgICAgICAgID0gaW5mby0+cGFyYW1ldGVyczsKKwkJCXdhbGtfc3RhdGUtPmdwZV9ldmVudF9pbmZvID0KKwkJCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvLAorCQkJCQkgIGluZm8tPnBhcmFtZXRlcnMpOworCQl9IGVsc2UgeworCQkJd2Fsa19zdGF0ZS0+cGFyYW1zID0gaW5mby0+cGFyYW1ldGVyczsKIAkJCXdhbGtfc3RhdGUtPmNhbGxlcl9yZXR1cm5fZGVzYyA9ICZpbmZvLT5yZXR1cm5fb2JqZWN0OwogCQl9CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9wc19pbml0X3Njb3BlICgmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLCBvcCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9wc19pbml0X3Njb3BlKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUsIG9wKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJaWYgKG1ldGhvZF9ub2RlKSB7CiAJCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5zdGFydF9ub2RlID0gbWV0aG9kX25vZGU7Ci0JCXdhbGtfc3RhdGUtPndhbGtfdHlwZSAgICAgICAgICAgID0gQUNQSV9XQUxLX01FVEhPRDsKLQkJd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUgICAgICAgICAgPSBtZXRob2Rfbm9kZTsKLQkJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MgICAgICAgICAgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG1ldGhvZF9ub2RlKTsKKwkJd2Fsa19zdGF0ZS0+d2Fsa190eXBlID0gQUNQSV9XQUxLX01FVEhPRDsKKwkJd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUgPSBtZXRob2Rfbm9kZTsKKwkJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MgPQorCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG1ldGhvZF9ub2RlKTsKIAogCQkvKiBQdXNoIHN0YXJ0IHNjb3BlIG9uIHNjb3BlIHN0YWNrIGFuZCBtYWtlIGl0IGN1cnJlbnQgICovCiAKLQkJc3RhdHVzID0gYWNwaV9kc19zY29wZV9zdGFja19wdXNoIChtZXRob2Rfbm9kZSwgQUNQSV9UWVBFX01FVEhPRCwgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaChtZXRob2Rfbm9kZSwgQUNQSV9UWVBFX01FVEhPRCwKKwkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qIEluaXQgdGhlIG1ldGhvZCBhcmd1bWVudHMgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2luaXRfYXJncyAod2Fsa19zdGF0ZS0+cGFyYW1zLAotCQkJCSBBQ1BJX01FVEhPRF9OVU1fQVJHUywgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3Mod2Fsa19zdGF0ZS0+cGFyYW1zLAorCQkJCQkJICAgICAgIEFDUElfTUVUSE9EX05VTV9BUkdTLAorCQkJCQkJICAgICAgIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFNldHVwIHRoZSBjdXJyZW50IHNjb3BlLgogCQkgKiBGaW5kIGEgTmFtZWQgT3AgdGhhdCBoYXMgYSBuYW1lc3BhY2Ugbm9kZSBhc3NvY2lhdGVkIHdpdGggaXQuCkBAIC04MTQsMjcgKzc4MiwyNyBAQAogCiAJCWlmICghZXh0cmFfb3ApIHsKIAkJCXBhcnNlcl9zdGF0ZS0+c3RhcnRfbm9kZSA9IE5VTEw7Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlwYXJzZXJfc3RhdGUtPnN0YXJ0X25vZGUgPSBleHRyYV9vcC0+Y29tbW9uLm5vZGU7CiAJCX0KIAogCQlpZiAocGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlKSB7CiAJCQkvKiBQdXNoIHN0YXJ0IHNjb3BlIG9uIHNjb3BlIHN0YWNrIGFuZCBtYWtlIGl0IGN1cnJlbnQgICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaCAocGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlLAotCQkJCQkgIHBhcnNlcl9zdGF0ZS0+c3RhcnRfbm9kZS0+dHlwZSwgd2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2gocGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlLAorCQkJCQkJICAgICBwYXJzZXJfc3RhdGUtPnN0YXJ0X25vZGUtPgorCQkJCQkJICAgICB0eXBlLCB3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCQl9CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9kc19pbml0X2NhbGxiYWNrcyAod2Fsa19zdGF0ZSwgcGFzc19udW1iZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRfY2FsbGJhY2tzKHdhbGtfc3RhdGUsIHBhc3NfbnVtYmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlCkBAIC04NDcsMjkgKzgxNSwyNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCit2b2lkIGFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZTsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2RlbGV0ZV93YWxrX3N0YXRlIiwgd2Fsa19zdGF0ZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfZGVsZXRlX3dhbGtfc3RhdGUiLCB3YWxrX3N0YXRlKTsKIAogCWlmICghd2Fsa19zdGF0ZSkgewogCQlyZXR1cm47CiAJfQogCiAJaWYgKHdhbGtfc3RhdGUtPmRhdGFfdHlwZSAhPSBBQ1BJX0RFU0NfVFlQRV9XQUxLKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiJXAgaXMgbm90IGEgdmFsaWQgd2FsayBzdGF0ZVxuIiwKLQkJCXdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICIlcCBpcyBub3QgYSB2YWxpZCB3YWxrIHN0YXRlXG4iLAorCQkJCSAgd2Fsa19zdGF0ZSkpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5zY29wZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIiVwIHdhbGsgc3RpbGwgaGFzIGEgc2NvcGUgbGlzdFxuIiwKLQkJCXdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICIlcCB3YWxrIHN0aWxsIGhhcyBhIHNjb3BlIGxpc3RcbiIsCisJCQkJICB3YWxrX3N0YXRlKSk7CiAJfQogCiAJLyogQWx3YXlzIG11c3QgZnJlZSBhbnkgbGlua2VkIGNvbnRyb2wgc3RhdGVzICovCkBAIC04NzgsNyArODQ0LDcgQEAKIAkJc3RhdGUgPSB3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlOwogCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlID0gc3RhdGUtPmNvbW1vbi5uZXh0OwogCi0JCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKHN0YXRlKTsKKwkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7CiAJfQogCiAJLyogQWx3YXlzIG11c3QgZnJlZSBhbnkgbGlua2VkIHBhcnNlIHN0YXRlcyAqLwpAQCAtODg3LDcgKzg1Myw3IEBACiAJCXN0YXRlID0gd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbzsKIAkJd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbyA9IHN0YXRlLT5jb21tb24ubmV4dDsKIAotCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIChzdGF0ZSk7CisJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc3RhdGUpOwogCX0KIAogCS8qIEFsd2F5cyBtdXN0IGZyZWUgYW55IHN0YWNrZWQgcmVzdWx0IHN0YXRlcyAqLwpAQCAtODk2LDQxICs4NjIsMTMgQEAKIAkJc3RhdGUgPSB3YWxrX3N0YXRlLT5yZXN1bHRzOwogCQl3YWxrX3N0YXRlLT5yZXN1bHRzID0gc3RhdGUtPmNvbW1vbi5uZXh0OwogCi0JCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKHN0YXRlKTsKKwkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7CiAJfQogCi0JYWNwaV91dF9yZWxlYXNlX3RvX2NhY2hlIChBQ1BJX01FTV9MSVNUX1dBTEssIHdhbGtfc3RhdGUpOworCUFDUElfTUVNX0ZSRUUod2Fsa19zdGF0ZSk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQotI2lmZGVmIEFDUElfRU5BQkxFX09CSkVDVF9DQUNIRQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlX2NhY2hlCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBQdXJnZSB0aGUgZ2xvYmFsIHN0YXRlIG9iamVjdCBjYWNoZS4gIFVzZWQgZHVyaW5nIHN1YnN5c3RlbQotICogICAgICAgICAgICAgIHRlcm1pbmF0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGVfY2FjaGUgKAotCXZvaWQpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX2RlbGV0ZV93YWxrX3N0YXRlX2NhY2hlIik7Ci0KLQotCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfY2FjaGUgKEFDUElfTUVNX0xJU1RfV0FMSyk7Ci0JcmV0dXJuX1ZPSUQ7Ci19Ci0jZW5kaWYKLQotCiAjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtOTQ3LDUwICs4ODUsNTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9pbnNlcnQgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2RzX3Jlc3VsdF9pbnNlcnQodm9pZCAqb2JqZWN0LAorCQkgICAgICB1MzIgaW5kZXgsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfcmVzdWx0X2luc2VydCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19yZXN1bHRfaW5zZXJ0Iik7CiAKIAlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7CiAJaWYgKCFzdGF0ZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIHJlc3VsdCBvYmplY3QgcHVzaGVkISBTdGF0ZT0lcFxuIiwKLQkJCXdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJObyByZXN1bHQgb2JqZWN0IHB1c2hlZCEgU3RhdGU9JXBcbiIsCisJCQkJICB3YWxrX3N0YXRlKSk7CiAJCXJldHVybiAoQUVfTk9UX0VYSVNUKTsKIAl9CiAKIAlpZiAoaW5kZXggPj0gQUNQSV9PQkpfTlVNX09QRVJBTkRTKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIkluZGV4IG91dCBvZiByYW5nZTogJVggT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKLQkJCWluZGV4LCBvYmplY3QsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSW5kZXggb3V0IG9mIHJhbmdlOiAlWCBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAorCQkJCSAgaW5kZXgsIG9iamVjdCwgd2Fsa19zdGF0ZSwKKwkJCQkgIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJaWYgKCFvYmplY3QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTnVsbCBPYmplY3QhIEluZGV4PSVYIE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsCi0JCQlpbmRleCwgb2JqZWN0LCB3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk51bGwgT2JqZWN0ISBJbmRleD0lWCBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAorCQkJCSAgaW5kZXgsIG9iamVjdCwgd2Fsa19zdGF0ZSwKKwkJCQkgIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4XSA9IG9iamVjdDsKKwlzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzY1tpbmRleF0gPSBvYmplY3Q7CiAJc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMrKzsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCSJPYmo9JXAgWyVzXSBTdGF0ZT0lcCBOdW09JVggQ3VyPSVYXG4iLAotCQlvYmplY3QsIG9iamVjdCA/IGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopIG9iamVjdCkgOiAiTlVMTCIsCi0JCXdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLCB3YWxrX3N0YXRlLT5jdXJyZW50X3Jlc3VsdCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCSAgIk9iaj0lcCBbJXNdIFN0YXRlPSVwIE51bT0lWCBDdXI9JVhcbiIsCisJCQkgIG9iamVjdCwKKwkJCSAgb2JqZWN0ID8KKwkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSgodW5pb24KKwkJCQkJCQlhY3BpX29wZXJhbmRfb2JqZWN0ICopCisJCQkJCQkgICAgICAgb2JqZWN0KSA6ICJOVUxMIiwKKwkJCSAgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMsCisJCQkgIHdhbGtfc3RhdGUtPmN1cnJlbnRfcmVzdWx0KSk7CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19kZWxldGVfYWxsCkBAIC0xMDA0LDI5ICs5NDUsMjQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19vYmpfc3RhY2tfZGVsZXRlX2FsbCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXUzMiBpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX29ial9zdGFja19kZWxldGVfYWxsIiwgd2Fsa19zdGF0ZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwiLCB3YWxrX3N0YXRlKTsKIAogCS8qIFRoZSBzdGFjayBzaXplIGlzIGNvbmZpZ3VyYWJsZSwgYnV0IGZpeGVkICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgQUNQSV9PQkpfTlVNX09QRVJBTkRTOyBpKyspIHsKIAkJaWYgKHdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldKSB7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSk7CiAJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSA9IE5VTEw7CiAJCX0KIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfb2JqX3N0YWNrX3BvcF9vYmplY3QKQEAgLTEwNDIsMTkgKzk3OCwxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3BvcF9vYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfb2JqX3N0YWNrX3BvcF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9iamVjdCwKKwkJCSAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19vYmpfc3RhY2tfcG9wX29iamVjdCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19vYmpfc3RhY2tfcG9wX29iamVjdCIpOwogCiAJLyogQ2hlY2sgZm9yIHN0YWNrIHVuZGVyZmxvdyAqLwogCiAJaWYgKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9PSAwKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIk1pc3Npbmcgb3BlcmFuZC9zdGFjayBlbXB0eSEgU3RhdGU9JXAgI09wcz0lWFxuIiwKLQkJCXdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk1pc3Npbmcgb3BlcmFuZC9zdGFjayBlbXB0eSEgU3RhdGU9JXAgI09wcz0lWFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwogCQkqb2JqZWN0ID0gTlVMTDsKIAkJcmV0dXJuIChBRV9BTUxfTk9fT1BFUkFORCk7CiAJfQpAQCAtMTA2NSwyNyArOTk5LDI2IEBACiAKIAkvKiBDaGVjayBmb3IgYSB2YWxpZCBvcGVyYW5kICovCiAKLQlpZiAoIXdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIk51bGwgb3BlcmFuZCEgU3RhdGU9JXAgI09wcz0lWFxuIiwKLQkJCXdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOworCWlmICghd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk51bGwgb3BlcmFuZCEgU3RhdGU9JXAgI09wcz0lWFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwogCQkqb2JqZWN0ID0gTlVMTDsKIAkJcmV0dXJuIChBRV9BTUxfTk9fT1BFUkFORCk7CiAJfQogCiAJLyogR2V0IG9wZXJhbmQgYW5kIHNldCBzdGFjayBlbnRyeSB0byBudWxsICovCiAKLQkqb2JqZWN0ID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc107Ci0Jd2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10gPSBOVUxMOworCSpvYmplY3QgPSB3YWxrX3N0YXRlLT5vcGVyYW5kc1t3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdOworCXdhbGtfc3RhdGUtPm9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10gPSBOVUxMOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIk9iaj0lcCBbJXNdIFN0YXRlPSVwICNPcHM9JVhcbiIsCi0JCQkgICpvYmplY3QsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKCpvYmplY3QpLAorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIk9iaj0lcCBbJXNdIFN0YXRlPSVwICNPcHM9JVhcbiIsCisJCQkgICpvYmplY3QsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoKm9iamVjdCksCiAJCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwogCiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfZ2V0X3ZhbHVlCkBAIC0xMTAxLDMwICsxMDM0LDI1IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAqCi1hY3BpX2RzX29ial9zdGFja19nZXRfdmFsdWUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK3ZvaWQgKmFjcGlfZHNfb2JqX3N0YWNrX2dldF92YWx1ZSh1MzIgaW5kZXgsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX29ial9zdGFja19nZXRfdmFsdWUiLCB3YWxrX3N0YXRlKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19vYmpfc3RhY2tfZ2V0X3ZhbHVlIiwgd2Fsa19zdGF0ZSk7CiAKIAkvKiBDYW4ndCBkbyBpdCBpZiB0aGUgc3RhY2sgaXMgZW1wdHkgKi8KIAogCWlmICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPT0gMCkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAkvKiBvciBpZiB0aGUgaW5kZXggaXMgcGFzdCB0aGUgdG9wIG9mIHRoZSBzdGFjayAqLwogCiAJaWYgKGluZGV4ID4gKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtICh1MzIpIDEpKSB7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAotCXJldHVybl9QVFIgKHdhbGtfc3RhdGUtPm9wZXJhbmRzWyhhY3BpX25hdGl2ZV91aW50KSh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAxKSAtCi0JCQkgIGluZGV4XSk7CisJcmV0dXJuX1BUUih3YWxrX3N0YXRlLT4KKwkJICAgb3BlcmFuZHNbKGFjcGlfbmF0aXZlX3VpbnQpICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAxKSAtCisJCQkgICAgaW5kZXhdKTsKIH0KICNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lYy5jIGIvZHJpdmVycy9hY3BpL2VjLmMKaW5kZXggMWFjNTczMS4uN2UxYTQ0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2VjLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjLmMKQEAgLTM4LDEzMCArMzgsMTEyIEBACiAjaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9FQ19DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgiYWNwaV9lYyIpCi0KK0FDUElfTU9EVUxFX05BTUUoImFjcGlfZWMiKQogI2RlZmluZSBBQ1BJX0VDX0NPTVBPTkVOVAkJMHgwMDEwMDAwMAogI2RlZmluZSBBQ1BJX0VDX0NMQVNTCQkJImVtYmVkZGVkX2NvbnRyb2xsZXIiCiAjZGVmaW5lIEFDUElfRUNfSElECQkJIlBOUDBDMDkiCiAjZGVmaW5lIEFDUElfRUNfRFJJVkVSX05BTUUJCSJBQ1BJIEVtYmVkZGVkIENvbnRyb2xsZXIgRHJpdmVyIgogI2RlZmluZSBBQ1BJX0VDX0RFVklDRV9OQU1FCQkiRW1iZWRkZWQgQ29udHJvbGxlciIKICNkZWZpbmUgQUNQSV9FQ19GSUxFX0lORk8JCSJpbmZvIgotCi0KICNkZWZpbmUgQUNQSV9FQ19GTEFHX09CRgkweDAxCS8qIE91dHB1dCBidWZmZXIgZnVsbCAqLwogI2RlZmluZSBBQ1BJX0VDX0ZMQUdfSUJGCTB4MDIJLyogSW5wdXQgYnVmZmVyIGZ1bGwgKi8KICNkZWZpbmUgQUNQSV9FQ19GTEFHX0JVUlNUCTB4MTAJLyogYnVyc3QgbW9kZSAqLwogI2RlZmluZSBBQ1BJX0VDX0ZMQUdfU0NJCTB4MjAJLyogRUMtU0NJIG9jY3VycmVkICovCi0KICNkZWZpbmUgQUNQSV9FQ19FVkVOVF9PQkYJMHgwMQkvKiBPdXRwdXQgYnVmZmVyIGZ1bGwgKi8KICNkZWZpbmUgQUNQSV9FQ19FVkVOVF9JQkUJMHgwMgkvKiBJbnB1dCBidWZmZXIgZW1wdHkgKi8KLQogI2RlZmluZSBBQ1BJX0VDX0RFTEFZCQk1MAkvKiBXYWl0IDUwbXMgbWF4LiBkdXJpbmcgRUMgb3BzICovCiAjZGVmaW5lIEFDUElfRUNfVURFTEFZX0dMSwkxMDAwCS8qIFdhaXQgMW1zIG1heC4gdG8gZ2V0IGdsb2JhbCBsb2NrICovCi0KLSNkZWZpbmUgQUNQSV9FQ19VREVMQVkgICAgICAgICAxMDAgICAgIC8qIFBvbGwgQCAxMDB1cyBpbmNyZW1lbnRzICovCi0jZGVmaW5lIEFDUElfRUNfVURFTEFZX0NPVU5UICAgMTAwMCAgICAvKiBXYWl0IDEwbXMgbWF4LiBkdXJpbmcgRUMgb3BzICovCi0KKyNkZWZpbmUgQUNQSV9FQ19VREVMQVkgICAgICAgICAxMDAJLyogUG9sbCBAIDEwMHVzIGluY3JlbWVudHMgKi8KKyNkZWZpbmUgQUNQSV9FQ19VREVMQVlfQ09VTlQgICAxMDAwCS8qIFdhaXQgMTBtcyBtYXguIGR1cmluZyBFQyBvcHMgKi8KICNkZWZpbmUgQUNQSV9FQ19DT01NQU5EX1JFQUQJMHg4MAogI2RlZmluZSBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUJMHg4MQogI2RlZmluZSBBQ1BJX0VDX0JVUlNUX0VOQUJMRQkweDgyCiAjZGVmaW5lIEFDUElfRUNfQlVSU1RfRElTQUJMRQkweDgzCiAjZGVmaW5lIEFDUElfRUNfQ09NTUFORF9RVUVSWQkweDg0Ci0KICNkZWZpbmUgRUNfUE9MTElORwkJMHhGRgogI2RlZmluZSBFQ19CVVJTVAkJMHgwMAotCi0KLXN0YXRpYyBpbnQgYWNwaV9lY19yZW1vdmUgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7Ci1zdGF0aWMgaW50IGFjcGlfZWNfc3RhcnQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19zdG9wIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwotc3RhdGljIGludCBhY3BpX2VjX2J1cnN0X2FkZCAoIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX2FkZCAoIHN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV9lY19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgYWNwaV9lY19zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGFjcGlfZWNfc3RvcChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX2VjX2J1cnN0X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfZWNfZHJpdmVyID0gewotCS5uYW1lID0JCUFDUElfRUNfRFJJVkVSX05BTUUsCi0JLmNsYXNzID0JQUNQSV9FQ19DTEFTUywKLQkuaWRzID0JCUFDUElfRUNfSElELAotCS5vcHMgPQkJewotCQkJCS5hZGQgPQkJYWNwaV9lY19wb2xsaW5nX2FkZCwKLQkJCQkucmVtb3ZlID0JYWNwaV9lY19yZW1vdmUsCi0JCQkJLnN0YXJ0ID0JYWNwaV9lY19zdGFydCwKLQkJCQkuc3RvcCA9CQlhY3BpX2VjX3N0b3AsCi0JCQl9LAorCS5uYW1lID0gQUNQSV9FQ19EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX0VDX0NMQVNTLAorCS5pZHMgPSBBQ1BJX0VDX0hJRCwKKwkub3BzID0geworCQkuYWRkID0gYWNwaV9lY19wb2xsaW5nX2FkZCwKKwkJLnJlbW92ZSA9IGFjcGlfZWNfcmVtb3ZlLAorCQkuc3RhcnQgPSBhY3BpX2VjX3N0YXJ0LAorCQkuc3RvcCA9IGFjcGlfZWNfc3RvcCwKKwkJfSwKIH07CiB1bmlvbiBhY3BpX2VjIHsKIAlzdHJ1Y3QgewotCQl1MzIJCQkJbW9kZTsKLQkJYWNwaV9oYW5kbGUJCQloYW5kbGU7Ci0JCXVuc2lnbmVkIGxvbmcJCQl1aWQ7Ci0JCXVuc2lnbmVkIGxvbmcJCQlncGVfYml0OwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MJc3RhdHVzX2FkZHI7Ci0JCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcwljb21tYW5kX2FkZHI7Ci0JCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcwlkYXRhX2FkZHI7Ci0JCXVuc2lnbmVkIGxvbmcJCQlnbG9iYWxfbG9jazsKKwkJdTMyIG1vZGU7CisJCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwkJdW5zaWduZWQgbG9uZyB1aWQ7CisJCXVuc2lnbmVkIGxvbmcgZ3BlX2JpdDsKKwkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHN0YXR1c19hZGRyOworCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgY29tbWFuZF9hZGRyOworCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgZGF0YV9hZGRyOworCQl1bnNpZ25lZCBsb25nIGdsb2JhbF9sb2NrOwogCX0gY29tbW9uOwogCiAJc3RydWN0IHsKLQkJdTMyCQkJCW1vZGU7Ci0JCWFjcGlfaGFuZGxlCQkJaGFuZGxlOwotCQl1bnNpZ25lZCBsb25nCQkJdWlkOwotCQl1bnNpZ25lZCBsb25nCQkJZ3BlX2JpdDsKLQkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzCXN0YXR1c19hZGRyOwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MJY29tbWFuZF9hZGRyOwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MJZGF0YV9hZGRyOwotCQl1bnNpZ25lZCBsb25nCQkJZ2xvYmFsX2xvY2s7Ci0JCXVuc2lnbmVkIGludAkJCWV4cGVjdF9ldmVudDsKLQkJYXRvbWljX3QJCQlsZWF2aW5nX2J1cnN0OyAvKiAwIDogTm8sIDEgOiBZZXMsIDI6IGFib3J0Ki8KLQkJYXRvbWljX3QJCQlwZW5kaW5nX2dwZTsKLQkJc3RydWN0IHNlbWFwaG9yZQkJc2VtOwotCQl3YWl0X3F1ZXVlX2hlYWRfdAkJd2FpdDsKLQl9YnVyc3Q7CisJCXUzMiBtb2RlOworCQlhY3BpX2hhbmRsZSBoYW5kbGU7CisJCXVuc2lnbmVkIGxvbmcgdWlkOworCQl1bnNpZ25lZCBsb25nIGdwZV9iaXQ7CisJCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBzdGF0dXNfYWRkcjsKKwkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGNvbW1hbmRfYWRkcjsKKwkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGRhdGFfYWRkcjsKKwkJdW5zaWduZWQgbG9uZyBnbG9iYWxfbG9jazsKKwkJdW5zaWduZWQgaW50IGV4cGVjdF9ldmVudDsKKwkJYXRvbWljX3QgbGVhdmluZ19idXJzdDsJLyogMCA6IE5vLCAxIDogWWVzLCAyOiBhYm9ydCAqLworCQlhdG9taWNfdCBwZW5kaW5nX2dwZTsKKwkJc3RydWN0IHNlbWFwaG9yZSBzZW07CisJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJfSBidXJzdDsKIAogCXN0cnVjdCB7Ci0JCXUzMgkJCQltb2RlOwotCQlhY3BpX2hhbmRsZQkJCWhhbmRsZTsKLQkJdW5zaWduZWQgbG9uZwkJCXVpZDsKLQkJdW5zaWduZWQgbG9uZwkJCWdwZV9iaXQ7Ci0JCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcwlzdGF0dXNfYWRkcjsKLQkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzCWNvbW1hbmRfYWRkcjsKLQkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzCWRhdGFfYWRkcjsKLQkJdW5zaWduZWQgbG9uZwkJCWdsb2JhbF9sb2NrOwotICAgICAgIAkJc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgICAgICBsb2NrOwotCX1wb2xsaW5nOworCQl1MzIgbW9kZTsKKwkJYWNwaV9oYW5kbGUgaGFuZGxlOworCQl1bnNpZ25lZCBsb25nIHVpZDsKKwkJdW5zaWduZWQgbG9uZyBncGVfYml0OworCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3Mgc3RhdHVzX2FkZHI7CisJCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBjb21tYW5kX2FkZHI7CisJCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBkYXRhX2FkZHI7CisJCXVuc2lnbmVkIGxvbmcgZ2xvYmFsX2xvY2s7CisJCXNwaW5sb2NrX3QgbG9jazsKKwl9IHBvbGxpbmc7CiB9OwogCi1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ193YWl0ICggdW5pb24gYWNwaV9lYyAqZWMsIHU4IGV2ZW50KTsgCitzdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ193YWl0KHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBldmVudCk7CiBzdGF0aWMgaW50IGFjcGlfZWNfYnVyc3Rfd2FpdCh1bmlvbiBhY3BpX2VjICplYywgdW5zaWduZWQgaW50IGV2ZW50KTsKLXN0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3JlYWQgKCB1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTMyICpkYXRhKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19idXJzdF9yZWFkKCB1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTMyICpkYXRhKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3dyaXRlICggdW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX2J1cnN0X3dyaXRlICggdW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX3BvbGxpbmdfcXVlcnkgKCB1bmlvbiBhY3BpX2VjICplYywgdTMyICpkYXRhKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19idXJzdF9xdWVyeSAoIHVuaW9uIGFjcGlfZWMgKmVjLCB1MzIgKmRhdGEpOwotc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfcG9sbGluZ19xdWVyeSAoIHZvaWQgKmVjX2N4dCk7Ci1zdGF0aWMgdm9pZCBhY3BpX2VjX2dwZV9idXJzdF9xdWVyeSAoIHZvaWQgKmVjX2N4dCk7Ci1zdGF0aWMgdTMyIGFjcGlfZWNfZ3BlX3BvbGxpbmdfaGFuZGxlciAoIHZvaWQgKmRhdGEpOwotc3RhdGljIHUzMiBhY3BpX2VjX2dwZV9idXJzdF9oYW5kbGVyICggdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ19yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKTsKK3N0YXRpYyBpbnQgYWNwaV9lY19idXJzdF9yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKTsKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3dyaXRlKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1OCBkYXRhKTsKK3N0YXRpYyBpbnQgYWNwaV9lY19idXJzdF93cml0ZSh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSk7CitzdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ19xdWVyeSh1bmlvbiBhY3BpX2VjICplYywgdTMyICogZGF0YSk7CitzdGF0aWMgaW50IGFjcGlfZWNfYnVyc3RfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpOworc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfcG9sbGluZ19xdWVyeSh2b2lkICplY19jeHQpOworc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfYnVyc3RfcXVlcnkodm9pZCAqZWNfY3h0KTsKK3N0YXRpYyB1MzIgYWNwaV9lY19ncGVfcG9sbGluZ19oYW5kbGVyKHZvaWQgKmRhdGEpOworc3RhdGljIHUzMiBhY3BpX2VjX2dwZV9idXJzdF9oYW5kbGVyKHZvaWQgKmRhdGEpOwogc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdAotYWNwaV9mYWtlX2VjZHRfcG9sbGluZ19jYWxsYmFjayAoCi0JYWNwaV9oYW5kbGUJaGFuZGxlLAotCXUzMgkJTGV2ZWwsCi0Jdm9pZAkJKmNvbnRleHQsCi0Jdm9pZAkJKipyZXR2YWwpOworYWNwaV9mYWtlX2VjZHRfcG9sbGluZ19jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJdTMyIExldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dmFsKTsKIAogc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdAotYWNwaV9mYWtlX2VjZHRfYnVyc3RfY2FsbGJhY2sgKAotCWFjcGlfaGFuZGxlCWhhbmRsZSwKLQl1MzIJCUxldmVsLAotCXZvaWQJCSpjb250ZXh0LAotCXZvaWQJCSoqcmV0dmFsKTsKK2FjcGlfZmFrZV9lY2R0X2J1cnN0X2NhbGxiYWNrKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCSAgICAgIHUzMiBMZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHZhbCk7CiAKLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX2VjX3BvbGxpbmdfZ2V0X3JlYWxfZWNkdCh2b2lkKTsKLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX2VjX2J1cnN0X2dldF9yZWFsX2VjZHQodm9pZCk7CitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX3BvbGxpbmdfZ2V0X3JlYWxfZWNkdCh2b2lkKTsKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfYnVyc3RfZ2V0X3JlYWxfZWNkdCh2b2lkKTsKIC8qIElmIHdlIGZpbmQgYW4gRUMgdmlhIHRoZSBFQ0RULCB3ZSBuZWVkIHRvIGtlZXAgYSBwdHIgdG8gaXRzIGNvbnRleHQgKi8KLXN0YXRpYyB1bmlvbiBhY3BpX2VjCSplY19lY2R0Oworc3RhdGljIHVuaW9uIGFjcGlfZWMgKmVjX2VjZHQ7CiAKIC8qIEV4dGVybmFsIGludGVyZmFjZXMgdXNlIGZpcnN0IEVDIG9ubHksIHNvIHJlbWVtYmVyICovCiBzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlICpmaXJzdF9lYzsKQEAgLTE3MywzMCArMTU1LDI0IEBACiAKIHN0YXRpYyBpbmxpbmUgdTMyIGFjcGlfZWNfcmVhZF9zdGF0dXModW5pb24gYWNwaV9lYyAqZWMpCiB7Ci0JdTMyCXN0YXR1cyA9IDA7CisJdTMyIHN0YXR1cyA9IDA7CiAKIAlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZzdGF0dXMsICZlYy0+Y29tbW9uLnN0YXR1c19hZGRyKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX2VjX3dhaXQgKAotCXVuaW9uIGFjcGlfZWMJCSplYywKLQl1OAkJCWV2ZW50KQorc3RhdGljIGludCBhY3BpX2VjX3dhaXQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGV2ZW50KQogewotCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkgCi0JCXJldHVybiBhY3BpX2VjX3BvbGxpbmdfd2FpdCAoZWMsIGV2ZW50KTsKKwlpZiAoYWNwaV9lY19wb2xsaW5nX21vZGUpCisJCXJldHVybiBhY3BpX2VjX3BvbGxpbmdfd2FpdChlYywgZXZlbnQpOwogCWVsc2UKLQkJcmV0dXJuIGFjcGlfZWNfYnVyc3Rfd2FpdCAoZWMsIGV2ZW50KTsKKwkJcmV0dXJuIGFjcGlfZWNfYnVyc3Rfd2FpdChlYywgZXZlbnQpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX2VjX3BvbGxpbmdfd2FpdCAoCi0JdW5pb24gYWNwaV9lYwkJKmVjLAotCXU4CQkJZXZlbnQpCitzdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ193YWl0KHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBldmVudCkKIHsKLQl1MzIJCQlhY3BpX2VjX3N0YXR1cyA9IDA7Ci0JdTMyCQkJaSA9IEFDUElfRUNfVURFTEFZX0NPVU5UOworCXUzMiBhY3BpX2VjX3N0YXR1cyA9IDA7CisJdTMyIGkgPSBBQ1BJX0VDX1VERUxBWV9DT1VOVDsKIAogCWlmICghZWMpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjA1LDE5ICsxODEsMjEgQEAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBBQ1BJX0VDX0VWRU5UX09CRjoKIAkJZG8gewotCQkJYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCAmYWNwaV9lY19zdGF0dXMsICZlYy0+Y29tbW9uLnN0YXR1c19hZGRyKTsKKwkJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJmFjcGlfZWNfc3RhdHVzLAorCQkJCQkgICAgICAgJmVjLT5jb21tb24uc3RhdHVzX2FkZHIpOwogCQkJaWYgKGFjcGlfZWNfc3RhdHVzICYgQUNQSV9FQ19GTEFHX09CRikKIAkJCQlyZXR1cm4gMDsKIAkJCXVkZWxheShBQ1BJX0VDX1VERUxBWSk7Ci0JCX0gd2hpbGUgKC0taT4wKTsKKwkJfSB3aGlsZSAoLS1pID4gMCk7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9FQ19FVkVOVF9JQkU6CiAJCWRvIHsKLQkJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJmFjcGlfZWNfc3RhdHVzLCAmZWMtPmNvbW1vbi5zdGF0dXNfYWRkcik7CisJCQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZhY3BpX2VjX3N0YXR1cywKKwkJCQkJICAgICAgICZlYy0+Y29tbW9uLnN0YXR1c19hZGRyKTsKIAkJCWlmICghKGFjcGlfZWNfc3RhdHVzICYgQUNQSV9FQ19GTEFHX0lCRikpCiAJCQkJcmV0dXJuIDA7CiAJCQl1ZGVsYXkoQUNQSV9FQ19VREVMQVkpOwotCQl9IHdoaWxlICgtLWk+MCk7CisJCX0gd2hpbGUgKC0taSA+IDApOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIyNywyNSArMjA1LDM2IEBACiB9CiBzdGF0aWMgaW50IGFjcGlfZWNfYnVyc3Rfd2FpdCh1bmlvbiBhY3BpX2VjICplYywgdW5zaWduZWQgaW50IGV2ZW50KQogewotCWludAlyZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY193YWl0Iik7CiAKIAllYy0+YnVyc3QuZXhwZWN0X2V2ZW50ID0gZXZlbnQ7CiAJc21wX21iKCk7CiAKLQlyZXN1bHQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChlYy0+YnVyc3Qud2FpdCwKLQkJCQkJIWVjLT5idXJzdC5leHBlY3RfZXZlbnQsCi0JCQkJCW1zZWNzX3RvX2ppZmZpZXMoQUNQSV9FQ19ERUxBWSkpOwotCQorCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEFDUElfRUNfRVZFTlRfT0JGOgorCQlpZiAoYWNwaV9lY19yZWFkX3N0YXR1cyhlYykgJiBldmVudCkgeworCQkJZWMtPmJ1cnN0LmV4cGVjdF9ldmVudCA9IDA7CisJCQlyZXR1cm5fVkFMVUUoMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfRUNfRVZFTlRfSUJFOgorCQlpZiAofmFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpICYgZXZlbnQpIHsKKwkJCWVjLT5idXJzdC5leHBlY3RfZXZlbnQgPSAwOworCQkJcmV0dXJuX1ZBTFVFKDApOworCQl9CisJCWJyZWFrOworCX0KKworCXJlc3VsdCA9IHdhaXRfZXZlbnRfdGltZW91dChlYy0+YnVyc3Qud2FpdCwKKwkJCQkgICAgIWVjLT5idXJzdC5leHBlY3RfZXZlbnQsCisJCQkJICAgIG1zZWNzX3RvX2ppZmZpZXMoQUNQSV9FQ19ERUxBWSkpOworCiAJZWMtPmJ1cnN0LmV4cGVjdF9ldmVudCA9IDA7CiAJc21wX21iKCk7CiAKLQlpZiAocmVzdWx0IDwgMCl7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIiByZXN1bHQgID0gJWQgIiwgcmVzdWx0KSk7Ci0JCXJldHVybl9WQUxVRShyZXN1bHQpOwotCX0KLQogCS8qCiAJICogVmVyaWZ5IHRoYXQgdGhlIGV2ZW50IGluIHF1ZXN0aW9uIGhhcyBhY3R1YWxseSBoYXBwZW5lZCBieQogCSAqIHF1ZXJ5aW5nIEVDIHN0YXR1cy4gRG8gdGhlIGNoZWNrIGV2ZW4gaWYgb3BlcmF0aW9uIHRpbWVkLW91dApAQCAtMjY2LDk1ICsyNTUsNjUgQEAKIAlyZXR1cm5fVkFMVUUoLUVUSU1FKTsKIH0KIAotCi0KLXN0YXRpYyBpbnQKLWFjcGlfZWNfZW50ZXJfYnVyc3RfbW9kZSAoCi0JdW5pb24gYWNwaV9lYwkJKmVjKQorc3RhdGljIGludCBhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUodW5pb24gYWNwaV9lYyAqZWMpCiB7Ci0JdTMyCQkJdG1wID0gMDsKLQlpbnQJCQlzdGF0dXMgPSAwOworCXUzMiB0bXAgPSAwOworCWludCBzdGF0dXMgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlIik7CiAKIAlzdGF0dXMgPSBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKTsKLQlpZiAoc3RhdHVzICE9IC1FSU5WQUwgJiYKLQkJIShzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKXsKLQkJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19CVVJTVF9FTkFCTEUsICZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7CisJaWYgKHN0YXR1cyAhPSAtRUlOVkFMICYmICEoc3RhdHVzICYgQUNQSV9FQ19GTEFHX0JVUlNUKSkgeworCQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gZW5kOworCQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0JVUlNUX0VOQUJMRSwKKwkJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKIAkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7Ci0JCWlmIChzdGF0dXMpewotCQkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKKwkJaWYgKHN0YXR1cykKIAkJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKLQkJfQogCQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZ0bXAsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0JCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7Ci0JCWlmKHRtcCAhPSAweDkwICkgey8qIEJ1cnN0IEFDSyBieXRlKi8KKwkJaWYgKHRtcCAhPSAweDkwKSB7CS8qIEJ1cnN0IEFDSyBieXRlICovCiAJCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAJCX0KIAl9CiAKLQlhdG9taWNfc2V0KCZlYy0+YnVyc3QubGVhdmluZ19idXJzdCAsIDApOworCWF0b21pY19zZXQoJmVjLT5idXJzdC5sZWF2aW5nX2J1cnN0LCAwKTsKIAlyZXR1cm5fVkFMVUUoMCk7CisgICAgICBlbmQ6CisJcHJpbnRrKCJFcnJvciBpbiBhY3BpX2VjX3dhaXRcbiIpOworCXJldHVybl9WQUxVRSgtMSk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfZWNfbGVhdmVfYnVyc3RfbW9kZSAoCi0JdW5pb24gYWNwaV9lYwkJKmVjKQorc3RhdGljIGludCBhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUodW5pb24gYWNwaV9lYyAqZWMpCiB7Ci0JaW50CQkJc3RhdHVzID0wOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19sZWF2ZV9idXJzdF9tb2RlIik7CiAKLQlhdG9taWNfc2V0KCZlYy0+YnVyc3QubGVhdmluZ19idXJzdCAsIDEpOwotCXN0YXR1cyA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOwotCWlmIChzdGF0dXMgIT0gLUVJTlZBTCAmJgotCQkoc3RhdHVzICYgQUNQSV9FQ19GTEFHX0JVUlNUKSl7Ci0JCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQlVSU1RfRElTQUJMRSwgJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKLQkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0ZMQUdfSUJGKTsKLQkJaWYgKHN0YXR1cyl7Ci0JCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwiLS0tLS0tLT53YWl0IGZhaWxcbiIpKTsKLQkJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKLQkJfQotCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwotCQlzdGF0dXMgPSBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKTsKLQl9Ci0KKwlhdG9taWNfc2V0KCZlYy0+YnVyc3QubGVhdmluZ19idXJzdCwgMSk7CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX2VjX3JlYWQgKAotCXVuaW9uIGFjcGlfZWMJCSplYywKLQl1OAkJCWFkZHJlc3MsCi0JdTMyCQkJKmRhdGEpCitzdGF0aWMgaW50IGFjcGlfZWNfcmVhZCh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTMyICogZGF0YSkKIHsKLQlpZiAoYWNwaV9lY19wb2xsaW5nX21vZGUpIAorCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkKIAkJcmV0dXJuIGFjcGlfZWNfcG9sbGluZ19yZWFkKGVjLCBhZGRyZXNzLCBkYXRhKTsKIAllbHNlCiAJCXJldHVybiBhY3BpX2VjX2J1cnN0X3JlYWQoZWMsIGFkZHJlc3MsIGRhdGEpOwogfQotc3RhdGljIGludAotYWNwaV9lY193cml0ZSAoCi0JdW5pb24gYWNwaV9lYwkJKmVjLAotCXU4CQkJYWRkcmVzcywKLQl1OAkJCWRhdGEpCitzdGF0aWMgaW50IGFjcGlfZWNfd3JpdGUodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbGluZ19tb2RlKSAKKwlpZiAoYWNwaV9lY19wb2xsaW5nX21vZGUpCiAJCXJldHVybiBhY3BpX2VjX3BvbGxpbmdfd3JpdGUoZWMsIGFkZHJlc3MsIGRhdGEpOwogCWVsc2UKIAkJcmV0dXJuIGFjcGlfZWNfYnVyc3Rfd3JpdGUoZWMsIGFkZHJlc3MsIGRhdGEpOwogfQotc3RhdGljIGludAotYWNwaV9lY19wb2xsaW5nX3JlYWQgKAotCXVuaW9uIGFjcGlfZWMJCSplYywKLQl1OAkJCWFkZHJlc3MsCi0JdTMyCQkJKmRhdGEpCitzdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ19yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzID0gMDsKLQl1MzIJCQlnbGsgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXUzMiBnbGsgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19yZWFkIik7CiAKQEAgLTM3MSw3ICszMzAsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5wb2xsaW5nLmxvY2ssIGZsYWdzKTsKIAotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9SRUFELCAmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOworCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9SRUFELAorCQkJCSZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7CiAJcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBlbmQ7CkBAIC0zODQsOSArMzQ0LDkgQEAKIAlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsIGRhdGEsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZWFkIFslMDJ4XSBmcm9tIGFkZHJlc3MgWyUwMnhdXG4iLAotCQkqZGF0YSwgYWRkcmVzcykpOwotCQotZW5kOgorCQkJICAqZGF0YSwgYWRkcmVzcykpOworCisgICAgICBlbmQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPnBvbGxpbmcubG9jaywgZmxhZ3MpOwogCiAJaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCkBAIC0zOTUsMTcgKzM1NSwxMiBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfZWNfcG9sbGluZ193cml0ZSAoCi0JdW5pb24gYWNwaV9lYwkJKmVjLAotCXU4CQkJYWRkcmVzcywKLQl1OAkJCWRhdGEpCitzdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ193cml0ZSh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQl1bnNpZ25lZCBsb25nCQlmbGFncyA9IDA7Ci0JdTMyCQkJZ2xrID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwl1MzIgZ2xrID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfd3JpdGUiKTsKIApAQCAtNDIwLDcgKzM3NSw4IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPnBvbGxpbmcubG9jaywgZmxhZ3MpOwogCi0JYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1dSSVRFLCAmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOworCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9XUklURSwKKwkJCQkmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOwogCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gZW5kOwpAQCAtNDM2LDkgKzM5Miw5IEBACiAJCWdvdG8gZW5kOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiV3JvdGUgWyUwMnhdIHRvIGFkZHJlc3MgWyUwMnhdXG4iLAotCQlkYXRhLCBhZGRyZXNzKSk7CisJCQkgIGRhdGEsIGFkZHJlc3MpKTsKIAotZW5kOgorICAgICAgZW5kOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5wb2xsaW5nLmxvY2ssIGZsYWdzKTsKIAogCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKQpAQCAtNDQ3LDIxICs0MDMsMTYgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotc3RhdGljIGludAotYWNwaV9lY19idXJzdF9yZWFkICgKLQl1bmlvbiBhY3BpX2VjCQkqZWMsCi0JdTgJCQlhZGRyZXNzLAotCXUzMgkJCSpkYXRhKQorc3RhdGljIGludCBhY3BpX2VjX2J1cnN0X3JlYWQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHUzMiAqIGRhdGEpCiB7Ci0JaW50CQkJc3RhdHVzID0gMDsKLQl1MzIJCQlnbGs7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIGdsazsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfcmVhZCIpOwogCiAJaWYgKCFlYyB8fCAhZGF0YSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCi1yZXRyeToKIAkqZGF0YSA9IDA7CiAKIAlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykgewpAQCAtNDczLDY0ICs0MjQsNDkgQEAKIAlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKIAlkb3duKCZlYy0+YnVyc3Quc2VtKTsKIAotCWlmKGFjcGlfZWNfZW50ZXJfYnVyc3RfbW9kZShlYykpCi0JCWdvdG8gZW5kOwotCi0JYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1JFQUQsICZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7CisJYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlKGVjKTsKIAlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwogCWlmIChzdGF0dXMpIHsKKwkJcHJpbnRrKCJyZWFkIEVDLCBJQiBub3QgZW1wdHlcbiIpOwogCQlnb3RvIGVuZDsKIAl9CisJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1JFQUQsCisJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKKwlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50aygicmVhZCBFQywgSUIgbm90IGVtcHR5XG4iKTsKKwl9CiAKIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBhZGRyZXNzLCAmZWMtPmNvbW1vbi5kYXRhX2FkZHIpOwotCXN0YXR1cz0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7Ci0JaWYgKHN0YXR1cyl7Ci0JCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoInJlYWQgRUMsIE9CIG5vdCBmdWxsXG4iKTsKIAkJZ290byBlbmQ7CiAJfQotCiAJYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCBkYXRhLCAmZWMtPmNvbW1vbi5kYXRhX2FkZHIpOwotCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7Ci0KIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZWFkIFslMDJ4XSBmcm9tIGFkZHJlc3MgWyUwMnhdXG4iLAotCQkqZGF0YSwgYWRkcmVzcykpOwotCQotZW5kOgorCQkJICAqZGF0YSwgYWRkcmVzcykpOworCisgICAgICBlbmQ6CiAJYWNwaV9lY19sZWF2ZV9idXJzdF9tb2RlKGVjKTsKIAl1cCgmZWMtPmJ1cnN0LnNlbSk7CiAKIAlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykKIAkJYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKGdsayk7CiAKLQlpZihhdG9taWNfcmVhZCgmZWMtPmJ1cnN0LmxlYXZpbmdfYnVyc3QpID09IDIpewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sImFib3J0ZWQsIHJldHJ5IC4uLlxuIikpOwotCQl3aGlsZShhdG9taWNfcmVhZCgmZWMtPmJ1cnN0LnBlbmRpbmdfZ3BlKSl7Ci0JCQltc2xlZXAoMSk7CQotCQl9Ci0JCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7Ci0JCWdvdG8gcmV0cnk7Ci0JfQotCiAJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9lY19idXJzdF93cml0ZSAoCi0JdW5pb24gYWNwaV9lYwkJKmVjLAotCXU4CQkJYWRkcmVzcywKLQl1OAkJCWRhdGEpCitzdGF0aWMgaW50IGFjcGlfZWNfYnVyc3Rfd3JpdGUodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpCiB7Ci0JaW50CQkJc3RhdHVzID0gMDsKLQl1MzIJCQlnbGs7Ci0JdTMyCQkJdG1wOworCWludCBzdGF0dXMgPSAwOworCXUzMiBnbGs7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3dyaXRlIik7CiAKIAlpZiAoIWVjKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7Ci1yZXRyeToKKwogCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKSB7CiAJCXN0YXR1cyA9IGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayhBQ1BJX0VDX1VERUxBWV9HTEssICZnbGspOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCkBAIC01NDAsNjkgKzQ3Niw0MyBAQAogCVdBUk5fT04oaW5faW50ZXJydXB0KCkpOwogCWRvd24oJmVjLT5idXJzdC5zZW0pOwogCi0JaWYoYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlKGVjKSkKLQkJZ290byBlbmQ7CisJYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlKGVjKTsKIAotCXN0YXR1cyA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOwotCWlmIChzdGF0dXMgIT0gLUVJTlZBTCAmJgotCQkhKHN0YXR1cyAmIEFDUElfRUNfRkxBR19CVVJTVCkpewotCQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0JVUlNUX0VOQUJMRSwgJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKLQkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7Ci0JCWlmIChzdGF0dXMpCi0JCQlnb3RvIGVuZDsKLQkJYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCAmdG1wLCAmZWMtPmNvbW1vbi5kYXRhX2FkZHIpOwotCQlpZih0bXAgIT0gMHg5MCApIC8qIEJ1cnN0IEFDSyBieXRlKi8KLQkJCWdvdG8gZW5kOwotCX0KLQkvKk5vdyB3ZSBhcmUgaW4gYnVyc3QgbW9kZSovCi0KLQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUsICZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7CiAJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKLQlpZiAoc3RhdHVzKXsKLQkJZ290byBlbmQ7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoIndyaXRlIEVDLCBJQiBub3QgZW1wdHlcbiIpOworCX0KKwlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUsCisJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKKwlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50aygid3JpdGUgRUMsIElCIG5vdCBlbXB0eVxuIik7CiAJfQogCiAJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgYWRkcmVzcywgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKIAlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlpZiAoc3RhdHVzKXsKLQkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKLQkJZ290byBlbmQ7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoIndyaXRlIEVDLCBJQiBub3QgZW1wdHlcbiIpOwogCX0KIAogCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGRhdGEsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0Jc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIGVuZDsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIldyb3RlIFslMDJ4XSB0byBhZGRyZXNzIFslMDJ4XVxuIiwKLQkJZGF0YSwgYWRkcmVzcykpOworCQkJICBkYXRhLCBhZGRyZXNzKSk7CiAKLWVuZDoKIAlhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUoZWMpOwogCXVwKCZlYy0+YnVyc3Quc2VtKTsKIAogCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKQogCQlhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2soZ2xrKTsKIAotCWlmKGF0b21pY19yZWFkKCZlYy0+YnVyc3QubGVhdmluZ19idXJzdCkgPT0gMil7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywiYWJvcnRlZCwgcmV0cnkgLi4uXG4iKSk7Ci0JCXdoaWxlKGF0b21pY19yZWFkKCZlYy0+YnVyc3QucGVuZGluZ19ncGUpKXsKLQkJCW1zbGVlcCgxKTsJCi0JCX0KLQkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKLQkJZ290byByZXRyeTsKLQl9Ci0KIAlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKIH0KIAogLyoKICAqIEV4dGVybmFsbHkgY2FsbGFibGUgRUMgYWNjZXNzIGZ1bmN0aW9ucy4gRm9yIG5vdywgYXNzdW1lIDEgRUMgb25seQogICovCi1pbnQKLWVjX3JlYWQodTggYWRkciwgdTggKnZhbCkKK2ludCBlY19yZWFkKHU4IGFkZHIsIHU4ICogdmFsKQogewogCXVuaW9uIGFjcGlfZWMgKmVjOwogCWludCBlcnI7CkBAIC02MTgsMTQgKzUyOCwxMyBAQAogCWlmICghZXJyKSB7CiAJCSp2YWwgPSB0ZW1wX2RhdGE7CiAJCXJldHVybiAwOwotCX0KLQllbHNlCisJfSBlbHNlCiAJCXJldHVybiBlcnI7CiB9CisKIEVYUE9SVF9TWU1CT0woZWNfcmVhZCk7CiAKLWludAotZWNfd3JpdGUodTggYWRkciwgdTggdmFsKQoraW50IGVjX3dyaXRlKHU4IGFkZHIsIHU4IHZhbCkKIHsKIAl1bmlvbiBhY3BpX2VjICplYzsKIAlpbnQgZXJyOwpAQCAtNjM5LDI3ICs1NDgsMjIgQEAKIAogCXJldHVybiBlcnI7CiB9CisKIEVYUE9SVF9TWU1CT0woZWNfd3JpdGUpOwogCi1zdGF0aWMgaW50Ci1hY3BpX2VjX3F1ZXJ5ICgKLQl1bmlvbiBhY3BpX2VjCQkqZWMsCi0JdTMyCQkJKmRhdGEpCitzdGF0aWMgaW50IGFjcGlfZWNfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbGluZ19tb2RlKSAKKwlpZiAoYWNwaV9lY19wb2xsaW5nX21vZGUpCiAJCXJldHVybiBhY3BpX2VjX3BvbGxpbmdfcXVlcnkoZWMsIGRhdGEpOwogCWVsc2UKIAkJcmV0dXJuIGFjcGlfZWNfYnVyc3RfcXVlcnkoZWMsIGRhdGEpOwogfQotc3RhdGljIGludAotYWNwaV9lY19wb2xsaW5nX3F1ZXJ5ICgKLQl1bmlvbiBhY3BpX2VjCQkqZWMsCi0JdTMyCQkJKmRhdGEpCitzdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ19xdWVyeSh1bmlvbiBhY3BpX2VjICplYywgdTMyICogZGF0YSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQl1bnNpZ25lZCBsb25nCQlmbGFncyA9IDA7Ci0JdTMyCQkJZ2xrID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwl1MzIgZ2xrID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfcXVlcnkiKTsKIApAQCAtNjgxLDcgKzU4NSw4IEBACiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5wb2xsaW5nLmxvY2ssIGZsYWdzKTsKIAotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9RVUVSWSwgJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKKwlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfUVVFUlksCisJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKIAlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKQEAgLTY5MCw3ICs1OTUsNyBAQAogCWlmICghKmRhdGEpCiAJCXJlc3VsdCA9IC1FTk9EQVRBOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPnBvbGxpbmcubG9jaywgZmxhZ3MpOwogCiAJaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCkBAIC02OTgsMTMgKzYwMywxMCBAQAogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9Ci1zdGF0aWMgaW50Ci1hY3BpX2VjX2J1cnN0X3F1ZXJ5ICgKLQl1bmlvbiBhY3BpX2VjCQkqZWMsCi0JdTMyCQkJKmRhdGEpCitzdGF0aWMgaW50IGFjcGlfZWNfYnVyc3RfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpCiB7Ci0JaW50CQkJc3RhdHVzID0gMDsKLQl1MzIJCQlnbGs7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIGdsazsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfcXVlcnkiKTsKIApAQCAtNzE5LDcwICs2MjEsNjQgQEAKIAl9CiAKIAlkb3duKCZlYy0+YnVyc3Quc2VtKTsKLQlpZihhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUoZWMpKQorCisJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoInF1ZXJ5IEVDLCBJQiBub3QgZW1wdHlcbiIpOwogCQlnb3RvIGVuZDsKKwl9CiAJLyoKIAkgKiBRdWVyeSB0aGUgRUMgdG8gZmluZCBvdXQgd2hpY2ggX1F4eCBtZXRob2Qgd2UgbmVlZCB0byBldmFsdWF0ZS4KIAkgKiBOb3RlIHRoYXQgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBxdWVyeSBjYXVzZXMgdGhlIEFDUElfRUNfU0NJCiAJICogYml0IHRvIGJlIGNsZWFyZWQgKGFuZCB0aHVzIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgc291cmNlKS4KIAkgKi8KLQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfUVVFUlksICZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7CisJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1FVRVJZLAorCQkJCSZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7CiAJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7Ci0JaWYgKHN0YXR1cyl7Ci0JCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoInF1ZXJ5IEVDLCBPQiBub3QgZnVsbFxuIik7CiAJCWdvdG8gZW5kOwogCX0KIAogCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgZGF0YSwgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwogCWlmICghKmRhdGEpCiAJCXN0YXR1cyA9IC1FTk9EQVRBOwogCi1lbmQ6Ci0JYWNwaV9lY19sZWF2ZV9idXJzdF9tb2RlKGVjKTsKKyAgICAgIGVuZDoKIAl1cCgmZWMtPmJ1cnN0LnNlbSk7CiAKIAlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykKIAkJYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKGdsayk7CiAKLQlpZihhdG9taWNfcmVhZCgmZWMtPmJ1cnN0LmxlYXZpbmdfYnVyc3QpID09IDIpewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sImFib3J0ZWQsIHJldHJ5IC4uLlxuIikpOwotCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwotCQlzdGF0dXMgPSAtRU5PREFUQTsKLQl9CiAJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQgTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogdW5pb24gYWNwaV9lY19xdWVyeV9kYXRhIHsKLQlhY3BpX2hhbmRsZQkJaGFuZGxlOwotCXU4CQkJZGF0YTsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJdTggZGF0YTsKIH07CiAKLXN0YXRpYyB2b2lkCi1hY3BpX2VjX2dwZV9xdWVyeSAoCi0Jdm9pZAkJCSplY19jeHQpCitzdGF0aWMgdm9pZCBhY3BpX2VjX2dwZV9xdWVyeSh2b2lkICplY19jeHQpCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbGluZ19tb2RlKSAKKwlpZiAoYWNwaV9lY19wb2xsaW5nX21vZGUpCiAJCWFjcGlfZWNfZ3BlX3BvbGxpbmdfcXVlcnkoZWNfY3h0KTsKIAllbHNlCiAJCWFjcGlfZWNfZ3BlX2J1cnN0X3F1ZXJ5KGVjX2N4dCk7CiB9CiAKLXN0YXRpYyB2b2lkCi1hY3BpX2VjX2dwZV9wb2xsaW5nX3F1ZXJ5ICgKLQl2b2lkCQkJKmVjX2N4dCkKK3N0YXRpYyB2b2lkIGFjcGlfZWNfZ3BlX3BvbGxpbmdfcXVlcnkodm9pZCAqZWNfY3h0KQogewotCXVuaW9uIGFjcGlfZWMJCSplYyA9ICh1bmlvbiBhY3BpX2VjICopIGVjX2N4dDsKLQl1MzIJCQl2YWx1ZSA9IDA7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3MgPSAwOwotCXN0YXRpYyBjaGFyCQlvYmplY3RfbmFtZVs1XSA9IHsnXycsJ1EnLCcwJywnMCcsJ1wwJ307Ci0JY29uc3QgY2hhcgkJaGV4W10gPSB7JzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywKLQkJCQkgICAgICAgICAnOCcsJzknLCdBJywnQicsJ0MnLCdEJywnRScsJ0YnfTsKKwl1bmlvbiBhY3BpX2VjICplYyA9ICh1bmlvbiBhY3BpX2VjICopZWNfY3h0OworCXUzMiB2YWx1ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RhdGljIGNoYXIgb2JqZWN0X25hbWVbNV0gPSB7ICdfJywgJ1EnLCAnMCcsICcwJywgJ1wwJyB9OworCWNvbnN0IGNoYXIgaGV4W10gPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLAorCQknOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJworCX07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX2dwZV9xdWVyeSIpOwogCkBAIC04MTIsMTkgKzcwOCwxOCBAQAogCiAJYWNwaV9ldmFsdWF0ZV9vYmplY3QoZWMtPmNvbW1vbi5oYW5kbGUsIG9iamVjdF9uYW1lLCBOVUxMLCBOVUxMKTsKIAotZW5kOgkKKyAgICAgIGVuZDoKIAlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwogfQotc3RhdGljIHZvaWQKLWFjcGlfZWNfZ3BlX2J1cnN0X3F1ZXJ5ICgKLQl2b2lkCQkJKmVjX2N4dCkKK3N0YXRpYyB2b2lkIGFjcGlfZWNfZ3BlX2J1cnN0X3F1ZXJ5KHZvaWQgKmVjX2N4dCkKIHsKLQl1bmlvbiBhY3BpX2VjCQkqZWMgPSAodW5pb24gYWNwaV9lYyAqKSBlY19jeHQ7Ci0JdTMyCQkJdmFsdWU7Ci0JaW50CQkJcmVzdWx0ID0gLUVOT0RBVEE7Ci0Jc3RhdGljIGNoYXIJCW9iamVjdF9uYW1lWzVdID0geydfJywnUScsJzAnLCcwJywnXDAnfTsKLQljb25zdCBjaGFyCQloZXhbXSA9IHsnMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLAotCQkJCSAgICAgICAgICc4JywnOScsJ0EnLCdCJywnQycsJ0QnLCdFJywnRid9OworCXVuaW9uIGFjcGlfZWMgKmVjID0gKHVuaW9uIGFjcGlfZWMgKillY19jeHQ7CisJdTMyIHZhbHVlOworCWludCByZXN1bHQgPSAtRU5PREFUQTsKKwlzdGF0aWMgY2hhciBvYmplY3RfbmFtZVs1XSA9IHsgJ18nLCAnUScsICcwJywgJzAnLCAnXDAnIH07CisJY29uc3QgY2hhciBoZXhbXSA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCisJCSc4JywgJzknLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnCisJfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfZ3BlX3F1ZXJ5Iik7CiAKQEAgLTg0MCwyNiArNzM1LDIyIEBACiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRXZhbHVhdGluZyAlc1xuIiwgb2JqZWN0X25hbWUpKTsKIAogCWFjcGlfZXZhbHVhdGVfb2JqZWN0KGVjLT5jb21tb24uaGFuZGxlLCBvYmplY3RfbmFtZSwgTlVMTCwgTlVMTCk7Ci1lbmQ6CQorICAgICAgZW5kOgogCWF0b21pY19kZWMoJmVjLT5idXJzdC5wZW5kaW5nX2dwZSk7CiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdTMyCi1hY3BpX2VjX2dwZV9oYW5kbGVyICgKLQl2b2lkCQkJKmRhdGEpCitzdGF0aWMgdTMyIGFjcGlfZWNfZ3BlX2hhbmRsZXIodm9pZCAqZGF0YSkKIHsKLQlpZiAoYWNwaV9lY19wb2xsaW5nX21vZGUpIAorCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkKIAkJcmV0dXJuIGFjcGlfZWNfZ3BlX3BvbGxpbmdfaGFuZGxlcihkYXRhKTsKIAllbHNlCi0JCXJldHVybiBhY3BpX2VjX2dwZV9idXJzdF9oYW5kbGVyKGRhdGEpOwkKKwkJcmV0dXJuIGFjcGlfZWNfZ3BlX2J1cnN0X2hhbmRsZXIoZGF0YSk7CiB9Ci1zdGF0aWMgdTMyCi1hY3BpX2VjX2dwZV9wb2xsaW5nX2hhbmRsZXIgKAotCXZvaWQJCQkqZGF0YSkKK3N0YXRpYyB1MzIgYWNwaV9lY19ncGVfcG9sbGluZ19oYW5kbGVyKHZvaWQgKmRhdGEpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfZWMJCSplYyA9ICh1bmlvbiBhY3BpX2VjICopIGRhdGE7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9lYyAqZWMgPSAodW5pb24gYWNwaV9lYyAqKWRhdGE7CiAKIAlpZiAoIWVjKQogCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CkBAIC04NjcsNjEgKzc1OCw0OSBAQAogCWFjcGlfZGlzYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX0lTUik7CiAKIAlzdGF0dXMgPSBhY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24oT1NEX1BSSU9SSVRZX0dQRSwKLQkJYWNwaV9lY19ncGVfcXVlcnksIGVjKTsKKwkJCQkJICAgICBhY3BpX2VjX2dwZV9xdWVyeSwgZWMpOwogCiAJaWYgKHN0YXR1cyA9PSBBRV9PSykKIAkJcmV0dXJuIEFDUElfSU5URVJSVVBUX0hBTkRMRUQ7CiAJZWxzZQogCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CiB9Ci1zdGF0aWMgdTMyCi1hY3BpX2VjX2dwZV9idXJzdF9oYW5kbGVyICgKLQl2b2lkCQkJKmRhdGEpCitzdGF0aWMgdTMyIGFjcGlfZWNfZ3BlX2J1cnN0X2hhbmRsZXIodm9pZCAqZGF0YSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdTMyCQkJdmFsdWU7Ci0JdW5pb24gYWNwaV9lYwkJKmVjID0gKHVuaW9uIGFjcGlfZWMgKikgZGF0YTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgdmFsdWU7CisJdW5pb24gYWNwaV9lYyAqZWMgPSAodW5pb24gYWNwaV9lYyAqKWRhdGE7CiAKIAlpZiAoIWVjKQogCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CiAKLQlhY3BpX2Rpc2FibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9JU1IpOwotCisJYWNwaV9jbGVhcl9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX0lTUik7CiAJdmFsdWUgPSBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKTsKIAotCWlmKCh2YWx1ZSAmIEFDUElfRUNfRkxBR19JQkYpICYmCi0JCSEodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpICYmCi0JCQkoYXRvbWljX3JlYWQoJmVjLT5idXJzdC5sZWF2aW5nX2J1cnN0KSA9PSAwKSkgeyAKLQkvKgotCSAqIHRoZSBlbWJlZGRlZCBjb250cm9sbGVyIGRpc2FibGVzIAotCSAqIGJ1cnN0IG1vZGUgZm9yIGFueSByZWFzb24gb3RoZXIgCi0JICogdGhhbiB0aGUgYnVyc3QgZGlzYWJsZSBjb21tYW5kCi0JICogdG8gcHJvY2VzcyBjcml0aWNhbCBldmVudC4KLQkgKi8KLQkJYXRvbWljX3NldCgmZWMtPmJ1cnN0LmxlYXZpbmdfYnVyc3QgLCAyKTsgLyogYmxvY2sgY3VycmVudCBwZW5kaW5nIHRyYW5zYWN0aW9uCi0JCQkJCWFuZCByZXRyeSAqLworCXN3aXRjaCAoZWMtPmJ1cnN0LmV4cGVjdF9ldmVudCkgeworCWNhc2UgQUNQSV9FQ19FVkVOVF9PQkY6CisJCWlmICghKHZhbHVlICYgQUNQSV9FQ19GTEFHX09CRikpCisJCQlicmVhazsKKwljYXNlIEFDUElfRUNfRVZFTlRfSUJFOgorCQlpZiAoKHZhbHVlICYgQUNQSV9FQ19GTEFHX0lCRikpCisJCQlicmVhazsKKwkJZWMtPmJ1cnN0LmV4cGVjdF9ldmVudCA9IDA7CiAJCXdha2VfdXAoJmVjLT5idXJzdC53YWl0KTsKLQl9ZWxzZSB7Ci0JCWlmICgoZWMtPmJ1cnN0LmV4cGVjdF9ldmVudCA9PSBBQ1BJX0VDX0VWRU5UX09CRiAmJgotCQkJCSh2YWx1ZSAmIEFDUElfRUNfRkxBR19PQkYpKSB8fAotCSAgICAJCQkoZWMtPmJ1cnN0LmV4cGVjdF9ldmVudCA9PSBBQ1BJX0VDX0VWRU5UX0lCRSAmJgotCQkJCSEodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfSUJGKSkpIHsKLQkJCWVjLT5idXJzdC5leHBlY3RfZXZlbnQgPSAwOwotCQkJd2FrZV91cCgmZWMtPmJ1cnN0LndhaXQpOwotCQkJcmV0dXJuIEFDUElfSU5URVJSVVBUX0hBTkRMRUQ7Ci0JCX0KKwkJcmV0dXJuIEFDUElfSU5URVJSVVBUX0hBTkRMRUQ7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCi0JaWYgKHZhbHVlICYgQUNQSV9FQ19GTEFHX1NDSSl7Ci0JCWF0b21pY19hZGQoMSwgJmVjLT5idXJzdC5wZW5kaW5nX2dwZSkgOworCWlmICh2YWx1ZSAmIEFDUElfRUNfRkxBR19TQ0kpIHsKKwkJYXRvbWljX2FkZCgxLCAmZWMtPmJ1cnN0LnBlbmRpbmdfZ3BlKTsKIAkJc3RhdHVzID0gYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKE9TRF9QUklPUklUWV9HUEUsCi0JCQkJCQlhY3BpX2VjX2dwZV9xdWVyeSwgZWMpOworCQkJCQkJICAgICBhY3BpX2VjX2dwZV9xdWVyeSwgZWMpOwogCQlyZXR1cm4gc3RhdHVzID09IEFFX09LID8KLQkJQUNQSV9JTlRFUlJVUFRfSEFORExFRCA6IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwotCX0gCisJCSAgICBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEIDogQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CisJfQogCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfSVNSKTsKIAlyZXR1cm4gc3RhdHVzID09IEFFX09LID8KLQkJQUNQSV9JTlRFUlJVUFRfSEFORExFRCA6IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOworCSAgICBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEIDogQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05MjksMzcgKzgwOCwzMSBAQAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2VjX3NwYWNlX3NldHVwICgKLQlhY3BpX2hhbmRsZQkJcmVnaW9uX2hhbmRsZSwKLQl1MzIJCQlmdW5jdGlvbiwKLQl2b2lkCQkJKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkCQkJKipyZXR1cm5fY29udGV4dCkKK2FjcGlfZWNfc3BhY2Vfc2V0dXAoYWNwaV9oYW5kbGUgcmVnaW9uX2hhbmRsZSwKKwkJICAgIHUzMiBmdW5jdGlvbiwgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmV0dXJuX2NvbnRleHQpCiB7CiAJLyoKIAkgKiBUaGUgRUMgb2JqZWN0IGlzIGluIHRoZSBoYW5kbGVyIGNvbnRleHQgYW5kIGlzIG5lZWRlZAogCSAqIHdoZW4gY2FsbGluZyB0aGUgYWNwaV9lY19zcGFjZV9oYW5kbGVyLgogCSAqLwotCSpyZXR1cm5fY29udGV4dCAgPSAoZnVuY3Rpb24gIT0gQUNQSV9SRUdJT05fREVBQ1RJVkFURSkgPwotCQkJCQkJaGFuZGxlcl9jb250ZXh0IDogTlVMTDsKKwkqcmV0dXJuX2NvbnRleHQgPSAoZnVuY3Rpb24gIT0gQUNQSV9SRUdJT05fREVBQ1RJVkFURSkgPworCSAgICBoYW5kbGVyX2NvbnRleHQgOiBOVUxMOwogCiAJcmV0dXJuIEFFX09LOwogfQogCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9lY19zcGFjZV9oYW5kbGVyICgKLQl1MzIJCQlmdW5jdGlvbiwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MJYWRkcmVzcywKLQl1MzIJCQliaXRfd2lkdGgsCi0JYWNwaV9pbnRlZ2VyCQkqdmFsdWUsCi0Jdm9pZAkJCSpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZAkJCSpyZWdpb25fY29udGV4dCkKK2FjcGlfZWNfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCSAgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkgICAgICB1MzIgYml0X3dpZHRoLAorCQkgICAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJICAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXVuaW9uIGFjcGlfZWMJCSplYyA9IE5VTEw7Ci0JdTY0CQkJdGVtcCA9ICp2YWx1ZTsKLQlhY3BpX2ludGVnZXIJCWZfdiA9IDA7Ci0JaW50IAkJCWkgPSAwOworCWludCByZXN1bHQgPSAwOworCXVuaW9uIGFjcGlfZWMgKmVjID0gTlVMTDsKKwl1NjQgdGVtcCA9ICp2YWx1ZTsKKwlhY3BpX2ludGVnZXIgZl92ID0gMDsKKwlpbnQgaSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3NwYWNlX2hhbmRsZXIiKTsKIApAQCAtOTY3LDE3ICs4NDAsMTggQEAKIAkJcmV0dXJuX1ZBTFVFKEFFX0JBRF9QQVJBTUVURVIpOwogCiAJaWYgKGJpdF93aWR0aCAhPSA4ICYmIGFjcGlfc3RyaWN0KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJhY3BpX2VjX3NwYWNlX2hhbmRsZXI6IGJpdF93aWR0aCBzaG91bGQgYmUgOFxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCSAgICAgICAiYWNwaV9lY19zcGFjZV9oYW5kbGVyOiBiaXRfd2lkdGggc2hvdWxkIGJlIDhcbiIpOwogCQlyZXR1cm5fVkFMVUUoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JZWMgPSAodW5pb24gYWNwaV9lYyAqKSBoYW5kbGVyX2NvbnRleHQ7CisJZWMgPSAodW5pb24gYWNwaV9lYyAqKWhhbmRsZXJfY29udGV4dDsKIAotbmV4dF9ieXRlOgorICAgICAgbmV4dF9ieXRlOgogCXN3aXRjaCAoZnVuY3Rpb24pIHsKIAljYXNlIEFDUElfUkVBRDoKIAkJdGVtcCA9IDA7Ci0JCXJlc3VsdCA9IGFjcGlfZWNfcmVhZChlYywgKHU4KSBhZGRyZXNzLCAodTMyICopJnRlbXApOworCQlyZXN1bHQgPSBhY3BpX2VjX3JlYWQoZWMsICh1OCkgYWRkcmVzcywgKHUzMiAqKSAmIHRlbXApOwogCQlicmVhazsKIAljYXNlIEFDUElfV1JJVEU6CiAJCXJlc3VsdCA9IGFjcGlfZWNfd3JpdGUoZWMsICh1OCkgYWRkcmVzcywgKHU4KSB0ZW1wKTsKQEAgLTEwMDQsOCArODc4LDcgQEAKIAkJKnZhbHVlID0gZl92OwogCX0KIAotCQkKLW91dDoKKyAgICAgIG91dDoKIAlzd2l0Y2ggKHJlc3VsdCkgewogCWNhc2UgLUVJTlZBTDoKIAkJcmV0dXJuX1ZBTFVFKEFFX0JBRF9QQVJBTUVURVIpOwpAQCAtMTAyMSwxOCArODk0LDE1IEBACiAJfQogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqYWNwaV9lY19kaXI7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICphY3BpX2VjX2RpcjsKIAotCi1zdGF0aWMgaW50Ci1hY3BpX2VjX3JlYWRfaW5mbyAoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3N0YXRpYyBpbnQgYWNwaV9lY19yZWFkX2luZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQl1bmlvbiBhY3BpX2VjCQkqZWMgPSAodW5pb24gYWNwaV9lYyAqKSBzZXEtPnByaXZhdGU7CisJdW5pb24gYWNwaV9lYyAqZWMgPSAodW5pb24gYWNwaV9lYyAqKXNlcS0+cHJpdmF0ZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfcmVhZF9pbmZvIik7CiAKQEAgLTEwNDAsMTQgKzkxMCwxNSBAQAogCQlnb3RvIGVuZDsKIAogCXNlcV9wcmludGYoc2VxLCAiZ3BlIGJpdDogICAgICAgICAgICAgICAgIDB4JTAyeFxuIiwKLQkJKHUzMikgZWMtPmNvbW1vbi5ncGVfYml0KTsKKwkJICAgKHUzMikgZWMtPmNvbW1vbi5ncGVfYml0KTsKIAlzZXFfcHJpbnRmKHNlcSwgInBvcnRzOiAgICAgICAgICAgICAgICAgICAweCUwMngsIDB4JTAyeFxuIiwKLQkJKHUzMikgZWMtPmNvbW1vbi5zdGF0dXNfYWRkci5hZGRyZXNzLCAodTMyKSBlYy0+Y29tbW9uLmRhdGFfYWRkci5hZGRyZXNzKTsKKwkJICAgKHUzMikgZWMtPmNvbW1vbi5zdGF0dXNfYWRkci5hZGRyZXNzLAorCQkgICAodTMyKSBlYy0+Y29tbW9uLmRhdGFfYWRkci5hZGRyZXNzKTsKIAlzZXFfcHJpbnRmKHNlcSwgInVzZSBnbG9iYWwgbG9jazogICAgICAgICAlc1xuIiwKLQkJZWMtPmNvbW1vbi5nbG9iYWxfbG9jaz8ieWVzIjoibm8iKTsKKwkJICAgZWMtPmNvbW1vbi5nbG9iYWxfbG9jayA/ICJ5ZXMiIDogIm5vIik7CiAJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKIAotZW5kOgorICAgICAgZW5kOgogCXJldHVybl9WQUxVRSgwKTsKIH0KIApAQCAtMTA1NywzNCArOTI4LDMyIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfZWNfaW5mb19vcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV9lY19pbmZvX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfZWNfaW5mb19vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAotc3RhdGljIGludAotYWNwaV9lY19hZGRfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2VjX2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfYWRkX2ZzIik7CiAKIAlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKSB7CiAJCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gcHJvY19ta2RpcihhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJCWFjcGlfZWNfZGlyKTsKKwkJCQkJCSAgICAgYWNwaV9lY19kaXIpOwogCQlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKQogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9FQ19GSUxFX0lORk8sIFNfSVJVR08sCi0JCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9FQ19GSUxFX0lORk8pKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCisJCQkJICBBQ1BJX0VDX0ZJTEVfSU5GTykpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfZWNfaW5mb19vcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtMTA5NCwxMCArOTYzLDcgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9lY19yZW1vdmVfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2VjX3JlbW92ZV9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3JlbW92ZV9mcyIpOwogCkBAIC0xMTEwLDIwICs5NzYsMTYgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0KLXN0YXRpYyBpbnQKLWFjcGlfZWNfcG9sbGluZ19hZGQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2VjX3BvbGxpbmdfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfZWMJCSplYyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZwkJdWlkOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfZWMgKmVjID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHVpZDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfYWRkIik7CiAKQEAgLTExNDMsMjYgKzEwMDUsMzEgQEAKIAlhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkgPSBlYzsKIAogCS8qIFVzZSB0aGUgZ2xvYmFsIGxvY2sgZm9yIGFsbCBFQyB0cmFuc2FjdGlvbnM/ICovCi0JYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGVjLT5jb21tb24uaGFuZGxlLCAiX0dMSyIsIE5VTEwsICZlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKTsKKwlhY3BpX2V2YWx1YXRlX2ludGVnZXIoZWMtPmNvbW1vbi5oYW5kbGUsICJfR0xLIiwgTlVMTCwKKwkJCSAgICAgICZlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKTsKIAogCS8qIElmIG91ciBVSUQgbWF0Y2hlcyB0aGUgVUlEIGZvciB0aGUgRUNEVC1lbnVtZXJhdGVkIEVDLAotCSAgIHdlIG5vdyBoYXZlIHRoZSAqcmVhbCogRUMgaW5mbywgc28ga2lsbCB0aGUgbWFrZXNoaWZ0IG9uZS4qLworCSAgIHdlIG5vdyBoYXZlIHRoZSAqcmVhbCogRUMgaW5mbywgc28ga2lsbCB0aGUgbWFrZXNoaWZ0IG9uZS4gKi8KIAlhY3BpX2V2YWx1YXRlX2ludGVnZXIoZWMtPmNvbW1vbi5oYW5kbGUsICJfVUlEIiwgTlVMTCwgJnVpZCk7CiAJaWYgKGVjX2VjZHQgJiYgZWNfZWNkdC0+Y29tbW9uLnVpZCA9PSB1aWQpIHsKIAkJYWNwaV9yZW1vdmVfYWRkcmVzc19zcGFjZV9oYW5kbGVyKEFDUElfUk9PVF9PQkpFQ1QsCi0JCQlBQ1BJX0FEUl9TUEFDRV9FQywgJmFjcGlfZWNfc3BhY2VfaGFuZGxlcik7Ci0JCi0JCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LCAmYWNwaV9lY19ncGVfaGFuZGxlcik7CisJCQkJCQkgIEFDUElfQURSX1NQQUNFX0VDLAorCQkJCQkJICAmYWNwaV9lY19zcGFjZV9oYW5kbGVyKTsKKworCQlhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihOVUxMLCBlY19lY2R0LT5jb21tb24uZ3BlX2JpdCwKKwkJCQkJJmFjcGlfZWNfZ3BlX2hhbmRsZXIpOwogCiAJCWtmcmVlKGVjX2VjZHQpOwogCX0KIAogCS8qIEdldCBHUEUgYml0IGFzc2lnbm1lbnQgKEVDIGV2ZW50cykuICovCiAJLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIF9HUEUgcmV0dXJuaW5nIGEgcGFja2FnZSAqLwotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+Y29tbW9uLmhhbmRsZSwgIl9HUEUiLCBOVUxMLCAmZWMtPmNvbW1vbi5ncGVfYml0KTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZWMtPmNvbW1vbi5oYW5kbGUsICJfR1BFIiwgTlVMTCwKKwkJCQkgICZlYy0+Y29tbW9uLmdwZV9iaXQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIkVycm9yIG9idGFpbmluZyBHUEUgYml0IGFzc2lnbm1lbnRcbiIpKTsKKwkJCQkgICJFcnJvciBvYnRhaW5pbmcgR1BFIGJpdCBhc3NpZ25tZW50XG4iKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZW5kOwogCX0KQEAgLTExNzIsMjYgKzEwMzksMjQgQEAKIAkJZ290byBlbmQ7CiAKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoZ3BlICVkKVxuIiwKLQkJYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJKHUzMikgZWMtPmNvbW1vbi5ncGVfYml0KTsKKwkgICAgICAgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKKwkgICAgICAgKHUzMikgZWMtPmNvbW1vbi5ncGVfYml0KTsKIAogCWlmICghZmlyc3RfZWMpCiAJCWZpcnN0X2VjID0gZGV2aWNlOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkKIAkJa2ZyZWUoZWMpOwogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9Ci1zdGF0aWMgaW50Ci1hY3BpX2VjX2J1cnN0X2FkZCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfZWNfYnVyc3RfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfZWMJCSplYyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZwkJdWlkOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfZWMgKmVjID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHVpZDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfYWRkIik7CiAKQEAgLTEyMDUsMzUgKzEwNzAsNDAgQEAKIAogCWVjLT5jb21tb24uaGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CiAJZWMtPmNvbW1vbi51aWQgPSAtMTsKLSAJYXRvbWljX3NldCgmZWMtPmJ1cnN0LnBlbmRpbmdfZ3BlLCAwKTsKLSAJYXRvbWljX3NldCgmZWMtPmJ1cnN0LmxlYXZpbmdfYnVyc3QgLCAxKTsKLSAJaW5pdF9NVVRFWCgmZWMtPmJ1cnN0LnNlbSk7Ci0gCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjLT5idXJzdC53YWl0KTsKKwlhdG9taWNfc2V0KCZlYy0+YnVyc3QucGVuZGluZ19ncGUsIDApOworCWF0b21pY19zZXQoJmVjLT5idXJzdC5sZWF2aW5nX2J1cnN0LCAxKTsKKwlpbml0X01VVEVYKCZlYy0+YnVyc3Quc2VtKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlYy0+YnVyc3Qud2FpdCk7CiAJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9FQ19ERVZJQ0VfTkFNRSk7CiAJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksIEFDUElfRUNfQ0xBU1MpOwogCWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSA9IGVjOwogCiAJLyogVXNlIHRoZSBnbG9iYWwgbG9jayBmb3IgYWxsIEVDIHRyYW5zYWN0aW9ucz8gKi8KLQlhY3BpX2V2YWx1YXRlX2ludGVnZXIoZWMtPmNvbW1vbi5oYW5kbGUsICJfR0xLIiwgTlVMTCwgJmVjLT5jb21tb24uZ2xvYmFsX2xvY2spOworCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+Y29tbW9uLmhhbmRsZSwgIl9HTEsiLCBOVUxMLAorCQkJICAgICAgJmVjLT5jb21tb24uZ2xvYmFsX2xvY2spOwogCiAJLyogSWYgb3VyIFVJRCBtYXRjaGVzIHRoZSBVSUQgZm9yIHRoZSBFQ0RULWVudW1lcmF0ZWQgRUMsCi0JICAgd2Ugbm93IGhhdmUgdGhlICpyZWFsKiBFQyBpbmZvLCBzbyBraWxsIHRoZSBtYWtlc2hpZnQgb25lLiovCisJICAgd2Ugbm93IGhhdmUgdGhlICpyZWFsKiBFQyBpbmZvLCBzbyBraWxsIHRoZSBtYWtlc2hpZnQgb25lLiAqLwogCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+Y29tbW9uLmhhbmRsZSwgIl9VSUQiLCBOVUxMLCAmdWlkKTsKIAlpZiAoZWNfZWNkdCAmJiBlY19lY2R0LT5jb21tb24udWlkID09IHVpZCkgewogCQlhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwKLQkJCUFDUElfQURSX1NQQUNFX0VDLCAmYWNwaV9lY19zcGFjZV9oYW5kbGVyKTsKKwkJCQkJCSAgQUNQSV9BRFJfU1BBQ0VfRUMsCisJCQkJCQkgICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIpOwogCi0JCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LCAmYWNwaV9lY19ncGVfaGFuZGxlcik7CisJCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LAorCQkJCQkmYWNwaV9lY19ncGVfaGFuZGxlcik7CiAKIAkJa2ZyZWUoZWNfZWNkdCk7CiAJfQogCiAJLyogR2V0IEdQRSBiaXQgYXNzaWdubWVudCAoRUMgZXZlbnRzKS4gKi8KIAkvKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgX0dQRSByZXR1cm5pbmcgYSBwYWNrYWdlICovCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGVjLT5jb21tb24uaGFuZGxlLCAiX0dQRSIsIE5VTEwsICZlYy0+Y29tbW9uLmdwZV9iaXQpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+Y29tbW9uLmhhbmRsZSwgIl9HUEUiLCBOVUxMLAorCQkJCSAgJmVjLT5jb21tb24uZ3BlX2JpdCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3Igb2J0YWluaW5nIEdQRSBiaXQgYXNzaWdubWVudFxuIikpOworCQkJCSAgIkVycm9yIG9idGFpbmluZyBHUEUgYml0IGFzc2lnbm1lbnRcbiIpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlbmQ7CiAJfQpAQCAtMTI0MiwyNyArMTExMiwyNCBAQAogCWlmIChyZXN1bHQpCiAJCWdvdG8gZW5kOwogCisJcHJpbnRrKCJidXJzdC1tb2RlLWVjLTEwLUF1Z1xuIik7CiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc10gKGdwZSAlZClcbiIsCi0JCWFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JCSh1MzIpIGVjLT5jb21tb24uZ3BlX2JpdCk7CisJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCisJICAgICAgICh1MzIpIGVjLT5jb21tb24uZ3BlX2JpdCk7CiAKIAlpZiAoIWZpcnN0X2VjKQogCQlmaXJzdF9lYyA9IGRldmljZTsKIAotZW5kOgorICAgICAgZW5kOgogCWlmIChyZXN1bHQpCiAJCWtmcmVlKGVjKTsKIAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfZWNfcmVtb3ZlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlpbnQJCQl0eXBlKQorc3RhdGljIGludCBhY3BpX2VjX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7Ci0JdW5pb24gYWNwaV9lYwkJKmVjID0gTlVMTDsKKwl1bmlvbiBhY3BpX2VjICplYyA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3JlbW92ZSIpOwogCkBAIC0xMjc4LDEzICsxMTQ1LDEwIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9lY19pb19wb3J0cyAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UJKnJlc291cmNlLAotCXZvaWQJCQkqY29udGV4dCkKK2FjcGlfZWNfaW9fcG9ydHMoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLCB2b2lkICpjb250ZXh0KQogewotCXVuaW9uIGFjcGlfZWMJCSplYyA9ICh1bmlvbiBhY3BpX2VjICopIGNvbnRleHQ7CisJdW5pb24gYWNwaV9lYyAqZWMgPSAodW5pb24gYWNwaV9lYyAqKWNvbnRleHQ7CiAJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICphZGRyOwogCiAJaWYgKHJlc291cmNlLT5pZCAhPSBBQ1BJX1JTVFlQRV9JTykgewpAQCAtMTMxMiwxMyArMTE3NiwxMCBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2VjX3N0YXJ0ICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9lY19zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9lYwkJKmVjID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX2VjICplYyA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3N0YXJ0Iik7CiAKQEAgLTEzMzQsNDkgKzExOTUsNTAgQEAKIAkgKiBHZXQgSS9PIHBvcnQgYWRkcmVzc2VzLiBDb252ZXJ0IHRvIEdBUyBmb3JtYXQuCiAJICovCiAJc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhlYy0+Y29tbW9uLmhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKLQkJYWNwaV9lY19pb19wb3J0cywgZWMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCBlYy0+Y29tbW9uLmNvbW1hbmRfYWRkci5yZWdpc3Rlcl9iaXRfd2lkdGggPT0gMCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRXJyb3IgZ2V0dGluZyBJL08gcG9ydCBhZGRyZXNzZXMiKSk7CisJCQkJICAgICBhY3BpX2VjX2lvX3BvcnRzLCBlYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpCisJICAgIHx8IGVjLT5jb21tb24uY29tbWFuZF9hZGRyLnJlZ2lzdGVyX2JpdF93aWR0aCA9PSAwKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiRXJyb3IgZ2V0dGluZyBJL08gcG9ydCBhZGRyZXNzZXMiKSk7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKIAllYy0+Y29tbW9uLnN0YXR1c19hZGRyID0gZWMtPmNvbW1vbi5jb21tYW5kX2FkZHI7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJncGU9MHglMDJ4LCBwb3J0cz0weCUyeCwweCUyeFxuIiwKLQkJKHUzMikgZWMtPmNvbW1vbi5ncGVfYml0LCAodTMyKSBlYy0+Y29tbW9uLmNvbW1hbmRfYWRkci5hZGRyZXNzLAotCQkodTMyKSBlYy0+Y29tbW9uLmRhdGFfYWRkci5hZGRyZXNzKSk7Ci0KKwkJCSAgKHUzMikgZWMtPmNvbW1vbi5ncGVfYml0LAorCQkJICAodTMyKSBlYy0+Y29tbW9uLmNvbW1hbmRfYWRkci5hZGRyZXNzLAorCQkJICAodTMyKSBlYy0+Y29tbW9uLmRhdGFfYWRkci5hZGRyZXNzKSk7CiAKIAkvKgogCSAqIEluc3RhbGwgR1BFIGhhbmRsZXIKIAkgKi8KIAlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LAotCQlBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCwgJmFjcGlfZWNfZ3BlX2hhbmRsZXIsIGVjKTsKKwkJCQkJICBBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCwKKwkJCQkJICAmYWNwaV9lY19ncGVfaGFuZGxlciwgZWMpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQotCWFjcGlfc2V0X2dwZV90eXBlIChOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfR1BFX1RZUEVfUlVOVElNRSk7Ci0JYWNwaV9lbmFibGVfZ3BlIChOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJYWNwaV9zZXRfZ3BlX3R5cGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUpOworCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CiAKLQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyIChlYy0+Y29tbW9uLmhhbmRsZSwKLQkJCUFDUElfQURSX1NQQUNFX0VDLCAmYWNwaV9lY19zcGFjZV9oYW5kbGVyLAotCQkJJmFjcGlfZWNfc3BhY2Vfc2V0dXAsIGVjKTsKKwlzdGF0dXMgPSBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKGVjLT5jb21tb24uaGFuZGxlLAorCQkJCQkJICAgIEFDUElfQURSX1NQQUNFX0VDLAorCQkJCQkJICAgICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIsCisJCQkJCQkgICAgJmFjcGlfZWNfc3BhY2Vfc2V0dXAsIGVjKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCAmYWNwaV9lY19ncGVfaGFuZGxlcik7CisJCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwKKwkJCQkJJmFjcGlfZWNfZ3BlX2hhbmRsZXIpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCiAJcmV0dXJuX1ZBTFVFKEFFX09LKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2VjX3N0b3AgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCWludAkJCXR5cGUpCitzdGF0aWMgaW50IGFjcGlfZWNfc3RvcChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfZWMJCSplYyA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9lYyAqZWMgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19zdG9wIik7CiAKQEAgLTEzODYsMTEgKzEyNDgsMTQgQEAKIAllYyA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihlYy0+Y29tbW9uLmhhbmRsZSwKLQkJQUNQSV9BRFJfU1BBQ0VfRUMsICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIpOworCQkJCQkJICAgQUNQSV9BRFJfU1BBQ0VfRUMsCisJCQkJCQkgICAmYWNwaV9lY19zcGFjZV9oYW5kbGVyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAotCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgJmFjcGlfZWNfZ3BlX2hhbmRsZXIpOworCXN0YXR1cyA9CisJICAgIGFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwKKwkJCQkgICAgJmFjcGlfZWNfZ3BlX2hhbmRsZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCkBAIC0xMzk4LDMyICsxMjYzLDI2IEBACiB9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWFjcGlfZmFrZV9lY2R0X2NhbGxiYWNrICgKLQlhY3BpX2hhbmRsZQloYW5kbGUsCi0JdTMyCQlMZXZlbCwKLQl2b2lkCQkqY29udGV4dCwKLQl2b2lkCQkqKnJldHZhbCkKK2FjcGlfZmFrZV9lY2R0X2NhbGxiYWNrKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCXUzMiBMZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHZhbCkKIHsKIAogCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkKIAkJcmV0dXJuIGFjcGlfZmFrZV9lY2R0X3BvbGxpbmdfY2FsbGJhY2soaGFuZGxlLAotCQkJTGV2ZWwsIGNvbnRleHQsIHJldHZhbCk7CisJCQkJCQkgICAgICAgTGV2ZWwsIGNvbnRleHQsIHJldHZhbCk7CiAJZWxzZQogCQlyZXR1cm4gYWNwaV9mYWtlX2VjZHRfYnVyc3RfY2FsbGJhY2soaGFuZGxlLAotCQkJTGV2ZWwsIGNvbnRleHQsIHJldHZhbCk7CisJCQkJCQkgICAgIExldmVsLCBjb250ZXh0LCByZXR2YWwpOwogfQogCiBzdGF0aWMgYWNwaV9zdGF0dXMgX19pbml0Ci1hY3BpX2Zha2VfZWNkdF9wb2xsaW5nX2NhbGxiYWNrICgKLQlhY3BpX2hhbmRsZQloYW5kbGUsCi0JdTMyCQlMZXZlbCwKLQl2b2lkCQkqY29udGV4dCwKLQl2b2lkCQkqKnJldHZhbCkKK2FjcGlfZmFrZV9lY2R0X3BvbGxpbmdfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJCXUzMiBMZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHZhbCkKIHsKLQlhY3BpX3N0YXR1cwlzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCi0JCWFjcGlfZWNfaW9fcG9ydHMsIGVjX2VjZHQpOworCQkJCSAgICAgYWNwaV9lY19pb19wb3J0cywgZWNfZWNkdCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm4gc3RhdHVzOwogCWVjX2VjZHQtPmNvbW1vbi5zdGF0dXNfYWRkciA9IGVjX2VjZHQtPmNvbW1vbi5jb21tYW5kX2FkZHI7CkBAIC0xNDMxLDMzICsxMjkwLDMzIEBACiAJZWNfZWNkdC0+Y29tbW9uLnVpZCA9IC0xOwogCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfVUlEIiwgTlVMTCwgJmVjX2VjZHQtPmNvbW1vbi51aWQpOwogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9HUEUiLCBOVUxMLCAmZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfR1BFIiwgTlVMTCwKKwkJCQkgICZlY19lY2R0LT5jb21tb24uZ3BlX2JpdCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm4gc3RhdHVzOwogCXNwaW5fbG9ja19pbml0KCZlY19lY2R0LT5wb2xsaW5nLmxvY2spOwogCWVjX2VjZHQtPmNvbW1vbi5nbG9iYWxfbG9jayA9IFRSVUU7CiAJZWNfZWNkdC0+Y29tbW9uLmhhbmRsZSA9IGhhbmRsZTsKIAotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICAiR1BFPTB4JTAyeCwgcG9ydHM9MHglMngsIDB4JTJ4XG4iLAotCQkodTMyKSBlY19lY2R0LT5jb21tb24uZ3BlX2JpdCwgKHUzMikgZWNfZWNkdC0+Y29tbW9uLmNvbW1hbmRfYWRkci5hZGRyZXNzLAotCQkodTMyKSBlY19lY2R0LT5jb21tb24uZGF0YV9hZGRyLmFkZHJlc3MpOworCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJHUEU9MHglMDJ4LCBwb3J0cz0weCUyeCwgMHglMnhcbiIsCisJICAgICAgICh1MzIpIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LAorCSAgICAgICAodTMyKSBlY19lY2R0LT5jb21tb24uY29tbWFuZF9hZGRyLmFkZHJlc3MsCisJICAgICAgICh1MzIpIGVjX2VjZHQtPmNvbW1vbi5kYXRhX2FkZHIuYWRkcmVzcyk7CiAKIAlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7CiB9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWFjcGlfZmFrZV9lY2R0X2J1cnN0X2NhbGxiYWNrICgKLQlhY3BpX2hhbmRsZQloYW5kbGUsCi0JdTMyCQlMZXZlbCwKLQl2b2lkCQkqY29udGV4dCwKLQl2b2lkCQkqKnJldHZhbCkKK2FjcGlfZmFrZV9lY2R0X2J1cnN0X2NhbGxiYWNrKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCSAgICAgIHUzMiBMZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHZhbCkKIHsKLQlhY3BpX3N0YXR1cwlzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJaW5pdF9NVVRFWCgmZWNfZWNkdC0+YnVyc3Quc2VtKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlY19lY2R0LT5idXJzdC53YWl0KTsKIAlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKLQkJYWNwaV9lY19pb19wb3J0cywgZWNfZWNkdCk7CisJCQkJICAgICBhY3BpX2VjX2lvX3BvcnRzLCBlY19lY2R0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiBzdGF0dXM7CiAJZWNfZWNkdC0+Y29tbW9uLnN0YXR1c19hZGRyID0gZWNfZWNkdC0+Y29tbW9uLmNvbW1hbmRfYWRkcjsKQEAgLTE0NjUsMTUgKzEzMjQsMTggQEAKIAllY19lY2R0LT5jb21tb24udWlkID0gLTE7CiAJYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9VSUQiLCBOVUxMLCAmZWNfZWNkdC0+Y29tbW9uLnVpZCk7CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0dQRSIsIE5VTEwsICZlY19lY2R0LT5jb21tb24uZ3BlX2JpdCk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9HUEUiLCBOVUxMLAorCQkJCSAgJmVjX2VjZHQtPmNvbW1vbi5ncGVfYml0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiBzdGF0dXM7CiAJZWNfZWNkdC0+Y29tbW9uLmdsb2JhbF9sb2NrID0gVFJVRTsKIAllY19lY2R0LT5jb21tb24uaGFuZGxlID0gaGFuZGxlOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggICJHUEU9MHglMDJ4LCBwb3J0cz0weCUyeCwgMHglMnhcbiIsCi0JCSh1MzIpIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LCAodTMyKSBlY19lY2R0LT5jb21tb24uY29tbWFuZF9hZGRyLmFkZHJlc3MsCi0JCSh1MzIpIGVjX2VjZHQtPmNvbW1vbi5kYXRhX2FkZHIuYWRkcmVzcyk7CisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkdQRT0weCUwMngsIHBvcnRzPTB4JTJ4LCAweCUyeFxuIiwKKwkgICAgICAgKHUzMikgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsCisJICAgICAgICh1MzIpIGVjX2VjZHQtPmNvbW1vbi5jb21tYW5kX2FkZHIuYWRkcmVzcywKKwkgICAgICAgKHUzMikgZWNfZWNkdC0+Y29tbW9uLmRhdGFfYWRkci5hZGRyZXNzKTsKIAogCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKIH0KQEAgLTE0ODgsMTEgKzEzNTAsMTAgQEAKICAqIG9wIHJlZ2lvbiAoc2luY2UgX1JFRyBpc24ndCBpbnZva2VkIHlldCkuIFRoZSBhc3N1bXB0aW9uIGlzIHRydWUgZm9yCiAgKiBhbGwgc3lzdGVtcyBmb3VuZC4KICAqLwotc3RhdGljIGludCBfX2luaXQKLWFjcGlfZWNfZmFrZV9lY2R0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX2Zha2VfZWNkdCh2b2lkKQogewotCWFjcGlfc3RhdHVzCXN0YXR1czsKLQlpbnQJCXJldCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWludCByZXQgPSAwOwogCiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlRyeSB0byBtYWtlIGFuIGZha2UgRUNEVFxuIik7CiAKQEAgLTE1MDMsMTAgKzEzNjQsOCBAQAogCX0KIAltZW1zZXQoZWNfZWNkdCwgMCwgc2l6ZW9mKHVuaW9uIGFjcGlfZWMpKTsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2RldmljZXMgKEFDUElfRUNfSElELAotCQkJCWFjcGlfZmFrZV9lY2R0X2NhbGxiYWNrLAotCQkJCU5VTEwsCi0JCQkJTlVMTCk7CisJc3RhdHVzID0gYWNwaV9nZXRfZGV2aWNlcyhBQ1BJX0VDX0hJRCwKKwkJCQkgIGFjcGlfZmFrZV9lY2R0X2NhbGxiYWNrLCBOVUxMLCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJa2ZyZWUoZWNfZWNkdCk7CiAJCWVjX2VjZHQgPSBOVUxMOwpAQCAtMTUxNCwxMyArMTM3MywxMiBAQAogCQlnb3RvIGVycm9yOwogCX0KIAlyZXR1cm4gMDsKLWVycm9yOgorICAgICAgZXJyb3I6CiAJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ2FuJ3QgbWFrZSBhbiBmYWtlIEVDRFRcbiIpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX2VjX2dldF9yZWFsX2VjZHQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfZ2V0X3JlYWxfZWNkdCh2b2lkKQogewogCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkKIAkJcmV0dXJuIGFjcGlfZWNfcG9sbGluZ19nZXRfcmVhbF9lY2R0KCk7CkBAIC0xNTI4LDE0ICsxMzg2LDE0IEBACiAJCXJldHVybiBhY3BpX2VjX2J1cnN0X2dldF9yZWFsX2VjZHQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQKLWFjcGlfZWNfcG9sbGluZ19nZXRfcmVhbF9lY2R0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX3BvbGxpbmdfZ2V0X3JlYWxfZWNkdCh2b2lkKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZWNkdCAJKmVjZHRfcHRyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9lY2R0ICplY2R0X3B0cjsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKCJFQ0RUIiwgMSwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsIAotCQkoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKSAmZWNkdF9wdHIpOworCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKCJFQ0RUIiwgMSwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsCisJCQkJCSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKQorCQkJCQkgJmVjZHRfcHRyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0xNTU4LDEzICsxNDE2LDE0IEBACiAJZWNfZWNkdC0+Y29tbW9uLmdsb2JhbF9sb2NrID0gVFJVRTsKIAllY19lY2R0LT5jb21tb24udWlkID0gZWNkdF9wdHItPnVpZDsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBlY2R0X3B0ci0+ZWNfaWQsICZlY19lY2R0LT5jb21tb24uaGFuZGxlKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2dldF9oYW5kbGUoTlVMTCwgZWNkdF9wdHItPmVjX2lkLCAmZWNfZWNkdC0+Y29tbW9uLmhhbmRsZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gZXJyb3I7CiAJfQogCiAJcmV0dXJuIDA7Ci1lcnJvcjoKKyAgICAgIGVycm9yOgogCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkNvdWxkIG5vdCB1c2UgRUNEVFxuIik7CiAJa2ZyZWUoZWNfZWNkdCk7CiAJZWNfZWNkdCA9IE5VTEw7CkBAIC0xNTcyLDE1ICsxNDMxLDE0IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQKLWFjcGlfZWNfYnVyc3RfZ2V0X3JlYWxfZWNkdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19idXJzdF9nZXRfcmVhbF9lY2R0KHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1czsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9lY2R0IAkqZWNkdF9wdHI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3RhYmxlX2VjZHQgKmVjZHRfcHRyOwogCiAJc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUoIkVDRFQiLCAxLCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywKLQkJKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikgJmVjZHRfcHRyKTsKKwkJCQkJIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopCisJCQkJCSAmZWNkdF9wdHIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTE1OTQsOCArMTQ1Miw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCW1lbXNldChlY19lY2R0LCAwLCBzaXplb2YodW5pb24gYWNwaV9lYykpOwogCi0gCWluaXRfTVVURVgoJmVjX2VjZHQtPmJ1cnN0LnNlbSk7Ci0gCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjX2VjZHQtPmJ1cnN0LndhaXQpOworCWluaXRfTVVURVgoJmVjX2VjZHQtPmJ1cnN0LnNlbSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZWNfZWNkdC0+YnVyc3Qud2FpdCk7CiAJZWNfZWNkdC0+Y29tbW9uLmNvbW1hbmRfYWRkciA9IGVjZHRfcHRyLT5lY19jb250cm9sOwogCWVjX2VjZHQtPmNvbW1vbi5zdGF0dXNfYWRkciA9IGVjZHRfcHRyLT5lY19jb250cm9sOwogCWVjX2VjZHQtPmNvbW1vbi5kYXRhX2FkZHIgPSBlY2R0X3B0ci0+ZWNfZGF0YTsKQEAgLTE2MDQsMTMgKzE0NjIsMTQgQEAKIAllY19lY2R0LT5jb21tb24uZ2xvYmFsX2xvY2sgPSBUUlVFOwogCWVjX2VjZHQtPmNvbW1vbi51aWQgPSBlY2R0X3B0ci0+dWlkOwogCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGVjZHRfcHRyLT5lY19pZCwgJmVjX2VjZHQtPmNvbW1vbi5oYW5kbGUpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBlY2R0X3B0ci0+ZWNfaWQsICZlY19lY2R0LT5jb21tb24uaGFuZGxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBlcnJvcjsKIAl9CiAKIAlyZXR1cm4gMDsKLWVycm9yOgorICAgICAgZXJyb3I6CiAJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ291bGQgbm90IHVzZSBFQ0RUXG4iKTsKIAlrZnJlZShlY19lY2R0KTsKIAllY19lY2R0ID0gTlVMTDsKQEAgLTE2MTksMTEgKzE0NzgsMTAgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXRkYXRhIGFjcGlfZmFrZV9lY2R0X2VuYWJsZWQ7Ci1pbnQgX19pbml0Ci1hY3BpX2VjX2VjZHRfcHJvYmUgKHZvaWQpCitpbnQgX19pbml0IGFjcGlfZWNfZWNkdF9wcm9iZSh2b2lkKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXM7Ci0JaW50CQkJcmV0OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgcmV0OwogCiAJcmV0ID0gYWNwaV9lY19nZXRfcmVhbF9lY2R0KCk7CiAJLyogVHJ5IHRvIG1ha2UgYSBmYWtlIEVDRFQgKi8KQEAgLTE2MzgsMjYgKzE0OTYsMjggQEAKIAkgKiBJbnN0YWxsIEdQRSBoYW5kbGVyCiAJICovCiAJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LAotCQlBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCwgJmFjcGlfZWNfZ3BlX2hhbmRsZXIsCi0JCWVjX2VjZHQpOworCQkJCQkgIEFDUElfR1BFX0VER0VfVFJJR0dFUkVELAorCQkJCQkgICZhY3BpX2VjX2dwZV9oYW5kbGVyLCBlY19lY2R0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBlcnJvcjsKIAl9Ci0JYWNwaV9zZXRfZ3BlX3R5cGUgKE5VTEwsIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUpOwotCWFjcGlfZW5hYmxlX2dwZSAoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJYWNwaV9zZXRfZ3BlX3R5cGUoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsIEFDUElfR1BFX1RZUEVfUlVOVElNRSk7CisJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwogCi0Jc3RhdHVzID0gYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlciAoQUNQSV9ST09UX09CSkVDVCwKLQkJCUFDUElfQURSX1NQQUNFX0VDLCAmYWNwaV9lY19zcGFjZV9oYW5kbGVyLAotCQkJJmFjcGlfZWNfc3BhY2Vfc2V0dXAsIGVjX2VjZHQpOworCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwKKwkJCQkJCSAgICBBQ1BJX0FEUl9TUEFDRV9FQywKKwkJCQkJCSAgICAmYWNwaV9lY19zcGFjZV9oYW5kbGVyLAorCQkJCQkJICAgICZhY3BpX2VjX3NwYWNlX3NldHVwLAorCQkJCQkJICAgIGVjX2VjZHQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihOVUxMLCBlY19lY2R0LT5jb21tb24uZ3BlX2JpdCwKLQkJCSZhY3BpX2VjX2dwZV9oYW5kbGVyKTsKKwkJCQkJJmFjcGlfZWNfZ3BlX2hhbmRsZXIpOwogCQlnb3RvIGVycm9yOwogCX0KIAogCXJldHVybiAwOwogCi1lcnJvcjoKKyAgICAgIGVycm9yOgogCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkNvdWxkIG5vdCB1c2UgRUNEVFxuIik7CiAJa2ZyZWUoZWNfZWNkdCk7CiAJZWNfZWNkdCA9IE5VTEw7CkBAIC0xNjY1LDEwICsxNTI1LDkgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX2luaXQodm9pZCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19pbml0Iik7CiAKQEAgLTE2OTMsOCArMTU1Miw3IEBACiAKIC8qIEVDIGRyaXZlciBjdXJyZW50bHkgbm90IHVubG9hZGFibGUgKi8KICNpZiAwCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWFjcGlfZWNfZXhpdCAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX2VjX2V4aXQodm9pZCkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX2V4aXQiKTsKIApAQCAtMTcwNCw3ICsxNTYyLDcgQEAKIAogCXJldHVybl9WT0lEOwogfQotI2VuZGlmIC8qIDAgKi8KKyNlbmRpZgkJCQkvKiAwICovCiAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfZmFrZV9lY2R0X3NldHVwKGNoYXIgKnN0cikKIHsKQEAgLTE3MjcsOCArMTU4NSw4IEBACiAJCWFjcGlfZWNfcG9sbGluZ19tb2RlID0gRUNfUE9MTElORzsKIAkJYWNwaV9lY19kcml2ZXIub3BzLmFkZCA9IGFjcGlfZWNfcG9sbGluZ19hZGQ7CiAJfQotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJFQyAlcyBtb2RlLlxuIiwKLQkJYnVyc3QgPyAiYnVyc3QiOiAicG9sbGluZyIpOworCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJFQyAlcyBtb2RlLlxuIiwgYnVyc3QgPyAiYnVyc3QiIDogInBvbGxpbmciKTsKIAlyZXR1cm4gMDsKIH0KKwogX19zZXR1cCgiZWNfYnVyc3Q9IiwgYWNwaV9lY19zZXRfcG9sbGluZ19tb2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudC5jIGIvZHJpdmVycy9hY3BpL2V2ZW50LmMKaW5kZXggNDNjNDlmNi4uYmZhOGI3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50LmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50LmMKQEAgLTEzLDQ1ICsxMyw0MCBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9TWVNURU1fQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImV2ZW50IikKK0FDUElfTU9EVUxFX05BTUUoImV2ZW50IikKIAogLyogR2xvYmFsIHZhcnMgZm9yIGhhbmRsaW5nIGV2ZW50IHByb2MgZW50cnkgKi8KIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWNwaV9zeXN0ZW1fZXZlbnRfbG9jayk7Ci1pbnQJCQkJZXZlbnRfaXNfb3BlbiA9IDA7Ci1leHRlcm4gc3RydWN0IGxpc3RfaGVhZAkJYWNwaV9idXNfZXZlbnRfbGlzdDsKLWV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdAlhY3BpX2J1c19ldmVudF9xdWV1ZTsKK2ludCBldmVudF9pc19vcGVuID0gMDsKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGFjcGlfYnVzX2V2ZW50X2xpc3Q7CitleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3QgYWNwaV9idXNfZXZlbnRfcXVldWU7CiAKLXN0YXRpYyBpbnQKLWFjcGlfc3lzdGVtX29wZW5fZXZlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IGFjcGlfc3lzdGVtX29wZW5fZXZlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3Bpbl9sb2NrX2lycSAoJmFjcGlfc3lzdGVtX2V2ZW50X2xvY2spOworCXNwaW5fbG9ja19pcnEoJmFjcGlfc3lzdGVtX2V2ZW50X2xvY2spOwogCi0JaWYoZXZlbnRfaXNfb3BlbikKKwlpZiAoZXZlbnRfaXNfb3BlbikKIAkJZ290byBvdXRfYnVzeTsKIAogCWV2ZW50X2lzX29wZW4gPSAxOwogCi0Jc3Bpbl91bmxvY2tfaXJxICgmYWNwaV9zeXN0ZW1fZXZlbnRfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZhY3BpX3N5c3RlbV9ldmVudF9sb2NrKTsKIAlyZXR1cm4gMDsKIAotb3V0X2J1c3k6Ci0Jc3Bpbl91bmxvY2tfaXJxICgmYWNwaV9zeXN0ZW1fZXZlbnRfbG9jayk7CisgICAgICBvdXRfYnVzeToKKwlzcGluX3VubG9ja19pcnEoJmFjcGlfc3lzdGVtX2V2ZW50X2xvY2spOwogCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBzc2l6ZV90Ci1hY3BpX3N5c3RlbV9yZWFkX2V2ZW50ICgKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUsCi0JY2hhcgkJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpwcG9zKQorYWNwaV9zeXN0ZW1fcmVhZF9ldmVudChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBidWZmZXIsIHNpemVfdCBjb3VudCwKKwkJICAgICAgIGxvZmZfdCAqIHBwb3MpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9idXNfZXZlbnQJZXZlbnQ7Ci0Jc3RhdGljIGNoYXIJCXN0cltBQ1BJX01BWF9TVFJJTkddOwotCXN0YXRpYyBpbnQJCWNoYXJzX3JlbWFpbmluZyA9IDA7Ci0Jc3RhdGljIGNoYXIJCSpwdHI7Ci0KKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9idXNfZXZlbnQgZXZlbnQ7CisJc3RhdGljIGNoYXIgc3RyW0FDUElfTUFYX1NUUklOR107CisJc3RhdGljIGludCBjaGFyc19yZW1haW5pbmcgPSAwOworCXN0YXRpYyBjaGFyICpwdHI7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3N5c3RlbV9yZWFkX2V2ZW50Iik7CiAKQEAgLTY3LDEwICs2MiwxMiBAQAogCQkJcmV0dXJuX1ZBTFVFKC1FSU8pOwogCQl9CiAKLQkJY2hhcnNfcmVtYWluaW5nID0gc3ByaW50ZihzdHIsICIlcyAlcyAlMDh4ICUwOHhcbiIsIAotCQkJZXZlbnQuZGV2aWNlX2NsYXNzP2V2ZW50LmRldmljZV9jbGFzczoiPHVua25vd24+IiwKLQkJCWV2ZW50LmJ1c19pZD9ldmVudC5idXNfaWQ6Ijx1bmtub3duPiIsIAotCQkJZXZlbnQudHlwZSwgZXZlbnQuZGF0YSk7CisJCWNoYXJzX3JlbWFpbmluZyA9IHNwcmludGYoc3RyLCAiJXMgJXMgJTA4eCAlMDh4XG4iLAorCQkJCQkgIGV2ZW50LmRldmljZV9jbGFzcyA/IGV2ZW50LgorCQkJCQkgIGRldmljZV9jbGFzcyA6ICI8dW5rbm93bj4iLAorCQkJCQkgIGV2ZW50LmJ1c19pZCA/IGV2ZW50LgorCQkJCQkgIGJ1c19pZCA6ICI8dW5rbm93bj4iLCBldmVudC50eXBlLAorCQkJCQkgIGV2ZW50LmRhdGEpOwogCQlwdHIgPSBzdHI7CiAJfQogCkBAIC04OCwxOSArODUsMTUgQEAKIAlyZXR1cm5fVkFMVUUoY291bnQpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3N5c3RlbV9jbG9zZV9ldmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQgYWNwaV9zeXN0ZW1fY2xvc2VfZXZlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3Bpbl9sb2NrX2lycSAoJmFjcGlfc3lzdGVtX2V2ZW50X2xvY2spOworCXNwaW5fbG9ja19pcnEoJmFjcGlfc3lzdGVtX2V2ZW50X2xvY2spOwogCWV2ZW50X2lzX29wZW4gPSAwOwotCXNwaW5fdW5sb2NrX2lycSAoJmFjcGlfc3lzdGVtX2V2ZW50X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmYWNwaV9zeXN0ZW1fZXZlbnRfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWFjcGlfc3lzdGVtX3BvbGxfZXZlbnQoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCXBvbGxfdGFibGUJCSp3YWl0KQorc3RhdGljIHVuc2lnbmVkIGludCBhY3BpX3N5c3RlbV9wb2xsX2V2ZW50KHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICogd2FpdCkKIHsKIAlwb2xsX3dhaXQoZmlsZSwgJmFjcGlfYnVzX2V2ZW50X3F1ZXVlLCB3YWl0KTsKIAlpZiAoIWxpc3RfZW1wdHkoJmFjcGlfYnVzX2V2ZW50X2xpc3QpKQpAQCAtMTA5LDE1ICsxMDIsMTUgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9zeXN0ZW1fZXZlbnRfb3BzID0gewotCS5vcGVuID0JCWFjcGlfc3lzdGVtX29wZW5fZXZlbnQsCi0JLnJlYWQgPQkJYWNwaV9zeXN0ZW1fcmVhZF9ldmVudCwKLQkucmVsZWFzZSA9CWFjcGlfc3lzdGVtX2Nsb3NlX2V2ZW50LAotCS5wb2xsID0JCWFjcGlfc3lzdGVtX3BvbGxfZXZlbnQsCisJLm9wZW4gPSBhY3BpX3N5c3RlbV9vcGVuX2V2ZW50LAorCS5yZWFkID0gYWNwaV9zeXN0ZW1fcmVhZF9ldmVudCwKKwkucmVsZWFzZSA9IGFjcGlfc3lzdGVtX2Nsb3NlX2V2ZW50LAorCS5wb2xsID0gYWNwaV9zeXN0ZW1fcG9sbF9ldmVudCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfZXZlbnRfaW5pdCh2b2lkKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnk7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKIAlpbnQgZXJyb3IgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9ldmVudF9pbml0Iik7CkBAIC0xMzAsOCArMTIzLDkgQEAKIAlpZiAoZW50cnkpCiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9zeXN0ZW1fZXZlbnRfb3BzOwogCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAKLQkJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgcHJvYyBmcyBlbnRyeVxuIiwiZXZlbnQiICkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBwcm9jIGZzIGVudHJ5XG4iLAorCQkJCSAgImV2ZW50IikpOwogCQllcnJvciA9IC1FRkFVTFQ7CiAJfQogCXJldHVybl9WQUxVRShlcnJvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2ZXZlbnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCmluZGV4IGRkM2E3MmEuLjg0MmQxZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCkBAIC00NSwxOCArNDUsMTIgQEAKICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXZldmVudCIpCitBQ1BJX01PRFVMRV9OQU1FKCJldmV2ZW50IikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfZXZfZml4ZWRfZXZlbnRfaW5pdGlhbGl6ZSh2b2lkKTsKIAotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2ZpeGVkX2V2ZW50X2luaXRpYWxpemUgKAotCXZvaWQpOwotCi1zdGF0aWMgdTMyCi1hY3BpX2V2X2ZpeGVkX2V2ZW50X2Rpc3BhdGNoICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKLQorc3RhdGljIHUzMiBhY3BpX2V2X2ZpeGVkX2V2ZW50X2Rpc3BhdGNoKHUzMiBldmVudCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzAsMjEgKzY0LDE3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdGlhbGl6ZV9ldmVudHMgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX2V2X2luaXRpYWxpemVfZXZlbnRzKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfaW5pdGlhbGl6ZV9ldmVudHMiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2luaXRpYWxpemVfZXZlbnRzIik7CiAKIAkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBBQ1BJIHRhYmxlcyAqLwogCiAJaWYgKCFhY3BpX2dibF9EU0RUKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1dBUk4sICJObyBBQ1BJIHRhYmxlcyBwcmVzZW50IVxuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0FDUElfVEFCTEVTKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiTm8gQUNQSSB0YWJsZXMgcHJlc2VudCFcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKIAl9CiAKIAkvKgpAQCAtOTIsMjYgKzgyLDIyIEBACiAJICogZW5hYmxpbmcgU0NJcyB0byBwcmV2ZW50IGludGVycnVwdHMgZnJvbSBvY2N1cnJpbmcgYmVmb3JlIHRoZSBoYW5kbGVycyBhcmUKIAkgKiBpbnN0YWxsZWQuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9ldl9maXhlZF9ldmVudF9pbml0aWFsaXplICgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgZml4ZWQgZXZlbnRzLCAlc1xuIiwKLQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXZfZml4ZWRfZXZlbnRfaW5pdGlhbGl6ZSgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVuYWJsZSB0byBpbml0aWFsaXplIGZpeGVkIGV2ZW50cywgJXNcbiIsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9ldl9ncGVfaW5pdGlhbGl6ZSAoKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJIlVuYWJsZSB0byBpbml0aWFsaXplIGdlbmVyYWwgcHVycG9zZSBldmVudHMsICVzXG4iLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9ldl9ncGVfaW5pdGlhbGl6ZSgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVuYWJsZSB0byBpbml0aWFsaXplIGdlbmVyYWwgcHVycG9zZSBldmVudHMsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzCkBAIC0xMjQsNDEgKzExMCwzMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2luc3RhbGxfeHJ1cHRfaGFuZGxlcnMgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX2V2X2luc3RhbGxfeHJ1cHRfaGFuZGxlcnModm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzIik7CiAKIAkvKiBJbnN0YWxsIHRoZSBTQ0kgaGFuZGxlciAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX3NjaV9oYW5kbGVyICgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiVW5hYmxlIHRvIGluc3RhbGwgU3lzdGVtIENvbnRyb2wgSW50ZXJydXB0IEhhbmRsZXIsICVzXG4iLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX3NjaV9oYW5kbGVyKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5hYmxlIHRvIGluc3RhbGwgU3lzdGVtIENvbnRyb2wgSW50ZXJydXB0IEhhbmRsZXIsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBJbnN0YWxsIHRoZSBoYW5kbGVyIGZvciB0aGUgR2xvYmFsIExvY2sgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyICgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgR2xvYmFsIExvY2sgaGFuZGxlciwgJXNcbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V2X2luaXRfZ2xvYmFsX2xvY2tfaGFuZGxlcigpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVuYWJsZSB0byBpbml0aWFsaXplIEdsb2JhbCBMb2NrIGhhbmRsZXIsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAlhY3BpX2dibF9ldmVudHNfaW5pdGlhbGl6ZWQgPSBUUlVFOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2ZpeGVkX2V2ZW50X2luaXRpYWxpemUKQEAgLTE3MSwxMyArMTQ4LDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2ZpeGVkX2V2ZW50X2luaXRpYWxpemUgKAotCXZvaWQpCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9ldl9maXhlZF9ldmVudF9pbml0aWFsaXplKHZvaWQpCiB7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCisJYWNwaV9uYXRpdmVfdWludCBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlIHRoYXQga2VlcHMgdHJhY2sgb2YgZml4ZWQgZXZlbnQgaGFuZGxlcnMKQEAgLTE5MCwxMCArMTY0LDExIEBACiAJCS8qIEVuYWJsZSB0aGUgZml4ZWQgZXZlbnQgKi8KIAogCQlpZiAoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS5lbmFibGVfcmVnaXN0ZXJfaWQgIT0gMHhGRikgewotCQkJc3RhdHVzID0gYWNwaV9zZXRfcmVnaXN0ZXIgKAotCQkJCQkgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS5lbmFibGVfcmVnaXN0ZXJfaWQsCi0JCQkJCSAwLCBBQ1BJX01UWF9MT0NLKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS4KKwkJCQkJICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkLCAwLAorCQkJCQkgICAgICBBQ1BJX01UWF9MT0NLKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCXJldHVybiAoc3RhdHVzKTsKIAkJCX0KIAkJfQpAQCAtMjAyLDcgKzE3Nyw2IEBACiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9maXhlZF9ldmVudF9kZXRlY3QKQEAgLTIxNSwzMSArMTg5LDI3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyCi1hY3BpX2V2X2ZpeGVkX2V2ZW50X2RldGVjdCAoCi0Jdm9pZCkKK3UzMiBhY3BpX2V2X2ZpeGVkX2V2ZW50X2RldGVjdCh2b2lkKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3N0YXR1cyA9IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfc3RhdHVzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfZW5hYmxlOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKKwl1MzIgaW50X3N0YXR1cyA9IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOworCXUzMiBmaXhlZF9zdGF0dXM7CisJdTMyIGZpeGVkX2VuYWJsZTsKKwlhY3BpX25hdGl2ZV91aW50IGk7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoImV2X2ZpeGVkX2V2ZW50X2RldGVjdCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJldl9maXhlZF9ldmVudF9kZXRlY3QiKTsKIAogCS8qCiAJICogUmVhZCB0aGUgZml4ZWQgZmVhdHVyZSBzdGF0dXMgYW5kIGVuYWJsZSByZWdpc3RlcnMsIGFzIGFsbCB0aGUgY2FzZXMKIAkgKiBkZXBlbmQgb24gdGhlaXIgdmFsdWVzLiAgSWdub3JlIGVycm9ycyBoZXJlLgogCSAqLwotCSh2b2lkKSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQgKEFDUElfTVRYX0RPX05PVF9MT0NLLCBBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCi0JCQkgJmZpeGVkX3N0YXR1cyk7Ci0JKHZvaWQpIGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwKLQkJCSAmZml4ZWRfZW5hYmxlKTsKKwkodm9pZClhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJICAgIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywgJmZpeGVkX3N0YXR1cyk7CisJKHZvaWQpYWNwaV9od19yZWdpc3Rlcl9yZWFkKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCSAgICBBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsICZmaXhlZF9lbmFibGUpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5URVJSVVBUUywKLQkJIkZpeGVkIEV2ZW50IEJsb2NrOiBFbmFibGUgJTA4WCBTdGF0dXMgJTA4WFxuIiwKLQkJZml4ZWRfZW5hYmxlLCBmaXhlZF9zdGF0dXMpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOVEVSUlVQVFMsCisJCQkgICJGaXhlZCBFdmVudCBCbG9jazogRW5hYmxlICUwOFggU3RhdHVzICUwOFhcbiIsCisJCQkgIGZpeGVkX2VuYWJsZSwgZml4ZWRfc3RhdHVzKSk7CiAKIAkvKgogCSAqIENoZWNrIGZvciBhbGwgcG9zc2libGUgRml4ZWQgRXZlbnRzIGFuZCBkaXNwYXRjaCB0aG9zZSB0aGF0IGFyZSBhY3RpdmUKQEAgLTI0NywxOCArMjE3LDE5IEBACiAJZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX0ZJWEVEX0VWRU5UUzsgaSsrKSB7CiAJCS8qIEJvdGggdGhlIHN0YXR1cyBhbmQgZW5hYmxlIGJpdHMgbXVzdCBiZSBvbiBmb3IgdGhpcyBldmVudCAqLwogCi0JCWlmICgoZml4ZWRfc3RhdHVzICYgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS5zdGF0dXNfYml0X21hc2spICYmCi0JCQkoZml4ZWRfZW5hYmxlICYgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS5lbmFibGVfYml0X21hc2spKSB7CisJCWlmICgoZml4ZWRfc3RhdHVzICYgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS4KKwkJICAgICBzdGF0dXNfYml0X21hc2spCisJCSAgICAmJiAoZml4ZWRfZW5hYmxlICYgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS4KKwkJCWVuYWJsZV9iaXRfbWFzaykpIHsKIAkJCS8qIEZvdW5kIGFuIGFjdGl2ZSAoc2lnbmFsbGVkKSBldmVudCAqLwogCi0JCQlpbnRfc3RhdHVzIHw9IGFjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2ggKCh1MzIpIGkpOworCQkJaW50X3N0YXR1cyB8PSBhY3BpX2V2X2ZpeGVkX2V2ZW50X2Rpc3BhdGNoKCh1MzIpIGkpOwogCQl9CiAJfQogCiAJcmV0dXJuIChpbnRfc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2ZpeGVkX2V2ZW50X2Rpc3BhdGNoCkBAIC0yNzIsMzkgKzI0MywzMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB1MzIKLWFjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2ggKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpCitzdGF0aWMgdTMyIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2godTMyIGV2ZW50KQogewogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyogQ2xlYXIgdGhlIHN0YXR1cyBiaXQgKi8KIAotCSh2b2lkKSBhY3BpX3NldF9yZWdpc3RlciAoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uc3RhdHVzX3JlZ2lzdGVyX2lkLAotCQkJIDEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkodm9pZClhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KKwkJCQlzdGF0dXNfcmVnaXN0ZXJfaWQsIDEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKIAogCS8qCiAJICogTWFrZSBzdXJlIHdlJ3ZlIGdvdCBhIGhhbmRsZXIuICBJZiBub3QsIHJlcG9ydCBhbiBlcnJvci4KIAkgKiBUaGUgZXZlbnQgaXMgZGlzYWJsZWQgdG8gcHJldmVudCBmdXJ0aGVyIGludGVycnVwdHMuCiAJICovCiAJaWYgKE5VTEwgPT0gYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmhhbmRsZXIpIHsKLQkJKHZvaWQpIGFjcGlfc2V0X3JlZ2lzdGVyIChhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS5lbmFibGVfcmVnaXN0ZXJfaWQsCi0JCQkJMCwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkodm9pZClhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KKwkJCQkJZW5hYmxlX3JlZ2lzdGVyX2lkLCAwLAorCQkJCQlBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKAotCQkJKCJObyBpbnN0YWxsZWQgaGFuZGxlciBmb3IgZml4ZWQgZXZlbnQgWyUwOFhdXG4iLAotCQkJZXZlbnQpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJObyBpbnN0YWxsZWQgaGFuZGxlciBmb3IgZml4ZWQgZXZlbnQgWyUwOFhdXG4iLCBldmVudCkpOwogCiAJCXJldHVybiAoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwogCX0KIAogCS8qIEludm9rZSB0aGUgRml4ZWQgRXZlbnQgaGFuZGxlciAqLwogCi0JcmV0dXJuICgoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmhhbmRsZXIpKAotCQkJICBhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uY29udGV4dCkpOworCXJldHVybiAoKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS4KKwkJIGhhbmRsZXIpIChhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uY29udGV4dCkpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYwppbmRleCAwODExMjBiLi5iMmYyMzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jCkBAIC00NiwxNCArNDYsMTAgQEAKICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXZncGUiKQorQUNQSV9NT0RVTEVfTkFNRSgiZXZncGUiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KLXN0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFCi1hY3BpX2V2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2QgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCitzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2Qodm9pZCAqY29udGV4dCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjksMTUgKzY1LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9zZXRfZ3BlX3R5cGUgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSkKK2FjcGlfZXZfc2V0X2dwZV90eXBlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywgdTggdHlwZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9zZXRfZ3BlX3R5cGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3NldF9ncGVfdHlwZSIpOwogCiAJLyogVmFsaWRhdGUgdHlwZSBhbmQgdXBkYXRlIHJlZ2lzdGVyIGVuYWJsZSBtYXNrcyAqLwogCkBAIC04OCwyMSArODAsMjAgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogRGlzYWJsZSB0aGUgR1BFIGlmIGN1cnJlbnRseSBlbmFibGVkICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlIChncGVfZXZlbnRfaW5mbyk7CisJc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7CiAKIAkvKiBUeXBlIHdhcyB2YWxpZGF0ZWQgYWJvdmUgKi8KIAotCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPSB+QUNQSV9HUEVfVFlQRV9NQVNLOyAvKiBDbGVhciB0eXBlIGJpdHMgKi8KLQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgfD0gdHlwZTsgICAgICAgICAgICAgIC8qIEluc2VydCB0eXBlICovCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPSB+QUNQSV9HUEVfVFlQRV9NQVNLOwkvKiBDbGVhciB0eXBlIGJpdHMgKi8KKwlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgfD0gdHlwZTsJLyogSW5zZXJ0IHR5cGUgKi8KKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzCkBAIC0xMTgsNTcgKzEwOSw1NSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3MgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSkKK2FjcGlfZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3Moc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAorCQkJCXU4IHR5cGUpCiB7Ci0Jc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gICAqZ3BlX3JlZ2lzdGVyX2luZm87Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9iaXQ7CisJc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gKmdwZV9yZWdpc3Rlcl9pbmZvOworCXU4IHJlZ2lzdGVyX2JpdDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyIpOwogCiAJZ3BlX3JlZ2lzdGVyX2luZm8gPSBncGVfZXZlbnRfaW5mby0+cmVnaXN0ZXJfaW5mbzsKIAlpZiAoIWdwZV9yZWdpc3Rlcl9pbmZvKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CiAJfQogCXJlZ2lzdGVyX2JpdCA9IGdwZV9ldmVudF9pbmZvLT5yZWdpc3Rlcl9iaXQ7CiAKIAkvKiAxKSBEaXNhYmxlIGNhc2UuICBTaW1wbHkgY2xlYXIgYWxsIGVuYWJsZSBiaXRzICovCiAKIAlpZiAodHlwZSA9PSBBQ1BJX0dQRV9ESVNBQkxFKSB7Ci0JCUFDUElfQ0xFQVJfQklUIChncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl93YWtlLCByZWdpc3Rlcl9iaXQpOwotCQlBQ1BJX0NMRUFSX0JJVCAoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLCByZWdpc3Rlcl9iaXQpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJQUNQSV9DTEVBUl9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3Jfd2FrZSwKKwkJCSAgICAgICByZWdpc3Rlcl9iaXQpOworCQlBQ1BJX0NMRUFSX0JJVChncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl9ydW4sIHJlZ2lzdGVyX2JpdCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogMikgRW5hYmxlIGNhc2UuICBTZXQvQ2xlYXIgdGhlIGFwcHJvcHJpYXRlIGVuYWJsZSBiaXRzICovCiAKIAlzd2l0Y2ggKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1RZUEVfTUFTSykgewogCWNhc2UgQUNQSV9HUEVfVFlQRV9XQUtFOgotCQlBQ1BJX1NFVF9CSVQgICAoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3Jfd2FrZSwgcmVnaXN0ZXJfYml0KTsKLQkJQUNQSV9DTEVBUl9CSVQgKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3J1biwgcmVnaXN0ZXJfYml0KTsKKwkJQUNQSV9TRVRfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3dha2UsIHJlZ2lzdGVyX2JpdCk7CisJCUFDUElfQ0xFQVJfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3J1biwgcmVnaXN0ZXJfYml0KTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfR1BFX1RZUEVfUlVOVElNRToKLQkJQUNQSV9DTEVBUl9CSVQgKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3dha2UsIHJlZ2lzdGVyX2JpdCk7Ci0JCUFDUElfU0VUX0JJVCAgIChncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl9ydW4sIHJlZ2lzdGVyX2JpdCk7CisJCUFDUElfQ0xFQVJfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3dha2UsCisJCQkgICAgICAgcmVnaXN0ZXJfYml0KTsKKwkJQUNQSV9TRVRfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3J1biwgcmVnaXN0ZXJfYml0KTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfR1BFX1RZUEVfV0FLRV9SVU46Ci0JCUFDUElfU0VUX0JJVCAgIChncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl93YWtlLCByZWdpc3Rlcl9iaXQpOwotCQlBQ1BJX1NFVF9CSVQgICAoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLCByZWdpc3Rlcl9iaXQpOworCQlBQ1BJX1NFVF9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3Jfd2FrZSwgcmVnaXN0ZXJfYml0KTsKKwkJQUNQSV9TRVRfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3J1biwgcmVnaXN0ZXJfYml0KTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2VuYWJsZV9ncGUKQEAgLTE4NCwyMSArMTczLDE5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9lbmFibGVfZ3BlICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3RvX2hhcmR3YXJlKQorYWNwaV9ldl9lbmFibGVfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywKKwkJICAgdTggd3JpdGVfdG9faGFyZHdhcmUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfZW5hYmxlX2dwZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfZW5hYmxlX2dwZSIpOwogCiAJLyogTWFrZSBzdXJlIEhXIGVuYWJsZSBtYXNrcyBhcmUgdXBkYXRlZCAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyAoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX0VOQUJMRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyhncGVfZXZlbnRfaW5mbywgQUNQSV9HUEVfRU5BQkxFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogTWFyayB3YWtlLWVuYWJsZWQgb3IgSFcgZW5hYmxlLCBvciBib3RoICovCkBAIC0yMDYsNDEgKzE5Myw0MCBAQAogCXN3aXRjaCAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfVFlQRV9NQVNLKSB7CiAJY2FzZSBBQ1BJX0dQRV9UWVBFX1dBS0U6CiAKLQkJQUNQSV9TRVRfQklUIChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1dBS0VfRU5BQkxFRCk7CisJCUFDUElfU0VUX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1dBS0VfRU5BQkxFRCk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0dQRV9UWVBFX1dBS0VfUlVOOgogCi0JCUFDUElfU0VUX0JJVCAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9XQUtFX0VOQUJMRUQpOworCQlBQ1BJX1NFVF9CSVQoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9XQUtFX0VOQUJMRUQpOwogCiAJCS8qbGludCAtZmFsbHRocm91Z2ggKi8KIAogCWNhc2UgQUNQSV9HUEVfVFlQRV9SVU5USU1FOgogCi0JCUFDUElfU0VUX0JJVCAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9SVU5fRU5BQkxFRCk7CisJCUFDUElfU0VUX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1JVTl9FTkFCTEVEKTsKIAogCQlpZiAod3JpdGVfdG9faGFyZHdhcmUpIHsKIAkJCS8qIENsZWFyIHRoZSBHUEUgKG9mIHN0YWxlIGV2ZW50cyksIHRoZW4gZW5hYmxlIGl0ICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlIChncGVfZXZlbnRfaW5mbyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUoZ3BlX2V2ZW50X2luZm8pOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CiAKIAkJCS8qIEVuYWJsZSB0aGUgcmVxdWVzdGVkIHJ1bnRpbWUgR1BFICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfaHdfd3JpdGVfZ3BlX2VuYWJsZV9yZWcgKGdwZV9ldmVudF9pbmZvKTsKKwkJCXN0YXR1cyA9IGFjcGlfaHdfd3JpdGVfZ3BlX2VuYWJsZV9yZWcoZ3BlX2V2ZW50X2luZm8pOwogCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9kaXNhYmxlX2dwZQpAQCAtMjUzLDM2ICsyMzksMzMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9kaXNhYmxlX2dwZSAoCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8pCithY3BpX3N0YXR1cyBhY3BpX2V2X2Rpc2FibGVfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9kaXNhYmxlX2dwZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfZGlzYWJsZV9ncGUiKTsKIAogCWlmICghKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0VOQUJMRV9NQVNLKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBNYWtlIHN1cmUgSFcgZW5hYmxlIG1hc2tzIGFyZSB1cGRhdGVkICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzIChncGVfZXZlbnRfaW5mbywgQUNQSV9HUEVfRElTQUJMRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyhncGVfZXZlbnRfaW5mbywgQUNQSV9HUEVfRElTQUJMRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIE1hcmsgd2FrZS1kaXNhYmxlZCBvciBIVyBkaXNhYmxlLCBvciBib3RoICovCiAKIAlzd2l0Y2ggKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1RZUEVfTUFTSykgewogCWNhc2UgQUNQSV9HUEVfVFlQRV9XQUtFOgotCQlBQ1BJX0NMRUFSX0JJVCAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9XQUtFX0VOQUJMRUQpOworCQlBQ1BJX0NMRUFSX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1dBS0VfRU5BQkxFRCk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0dQRV9UWVBFX1dBS0VfUlVOOgotCQlBQ1BJX0NMRUFSX0JJVCAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9XQUtFX0VOQUJMRUQpOworCQlBQ1BJX0NMRUFSX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1dBS0VfRU5BQkxFRCk7CiAKIAkJLypsaW50IC1mYWxsdGhyb3VnaCAqLwogCkBAIC0yOTAsMTggKzI3MywxNyBAQAogCiAJCS8qIERpc2FibGUgdGhlIHJlcXVlc3RlZCBydW50aW1lIEdQRSAqLwogCi0JCUFDUElfQ0xFQVJfQklUIChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1JVTl9FTkFCTEVEKTsKLQkJc3RhdHVzID0gYWNwaV9od193cml0ZV9ncGVfZW5hYmxlX3JlZyAoZ3BlX2V2ZW50X2luZm8pOworCQlBQ1BJX0NMRUFSX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1JVTl9FTkFCTEVEKTsKKwkJc3RhdHVzID0gYWNwaV9od193cml0ZV9ncGVfZW5hYmxlX3JlZyhncGVfZXZlbnRfaW5mbyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8KQEAgLTMxOSwxOCArMzAxLDE0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKgotYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8gKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIpCitzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJCQkJCSAgICAgICB1MzIgZ3BlX251bWJlcikKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2s7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2s7CisJYWNwaV9uYXRpdmVfdWludCBpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyogQSBOVUxMIGdwZV9ibG9jayBtZWFucyB1c2UgdGhlIEZBRFQtZGVmaW5lZCBHUEUgYmxvY2socykgKi8KIApAQCAtMzQwLDExICszMTgsMTQgQEAKIAkJZm9yIChpID0gMDsgaSA8IEFDUElfTUFYX0dQRV9CTE9DS1M7IGkrKykgewogCQkJZ3BlX2Jsb2NrID0gYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzW2ldOwogCQkJaWYgKGdwZV9ibG9jaykgewotCQkJCWlmICgoZ3BlX251bWJlciA+PSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyKSAmJgotCQkJCQkoZ3BlX251bWJlciA8IGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKwotCQkJCQkJKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiA4KSkpIHsKLQkJCQkJcmV0dXJuICgmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvW2dwZV9udW1iZXIgLQotCQkJCQkJZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcl0pOworCQkJCWlmICgoZ3BlX251bWJlciA+PSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyKQorCQkJCSAgICAmJiAoZ3BlX251bWJlciA8CisJCQkJCWdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKworCQkJCQkoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqIDgpKSkgeworCQkJCQlyZXR1cm4gKCZncGVfYmxvY2stPgorCQkJCQkJZXZlbnRfaW5mb1tncGVfbnVtYmVyIC0KKwkJCQkJCQkgICBncGVfYmxvY2stPgorCQkJCQkJCSAgIGJsb2NrX2Jhc2VfbnVtYmVyXSk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0zNTYsMjMgKzMzNywyNSBAQAogCiAJLyogQSBOb24tTlVMTCBncGVfZGV2aWNlIG1lYW5zIHRoaXMgaXMgYSBHUEUgQmxvY2sgRGV2aWNlICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIGdwZV9kZXZpY2UpOwotCWlmICghb2JqX2Rlc2MgfHwKLQkJIW9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrKSB7CisJb2JqX2Rlc2MgPQorCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCisJCQkJCWdwZV9kZXZpY2UpOworCWlmICghb2JqX2Rlc2MgfHwgIW9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrKSB7CiAJCXJldHVybiAoTlVMTCk7CiAJfQogCiAJZ3BlX2Jsb2NrID0gb2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2s7CiAKIAlpZiAoKGdwZV9udW1iZXIgPj0gZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcikgJiYKLQkJKGdwZV9udW1iZXIgPCBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsgKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiA4KSkpIHsKLQkJcmV0dXJuICgmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvW2dwZV9udW1iZXIgLSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyXSk7CisJICAgIChncGVfbnVtYmVyIDwKKwkgICAgIGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKyAoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqIDgpKSkgeworCQlyZXR1cm4gKCZncGVfYmxvY2stPgorCQkJZXZlbnRfaW5mb1tncGVfbnVtYmVyIC0gZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcl0pOwogCX0KIAogCXJldHVybiAoTlVMTCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9ncGVfZGV0ZWN0CkBAIC0zODcsMjIgKzM3MCwyMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXUzMgotYWNwaV9ldl9ncGVfZGV0ZWN0ICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfbGlzdCkKK3UzMiBhY3BpX2V2X2dwZV9kZXRlY3Qoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKiBncGVfeHJ1cHRfbGlzdCkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9zdGF0dXMgPSBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRfc3RhdHVzX2J5dGU7Ci0Jc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gICAqZ3BlX3JlZ2lzdGVyX2luZm87Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmVnOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX3JlZzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2s7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgajsKKwl1MzIgaW50X3N0YXR1cyA9IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOworCXU4IGVuYWJsZWRfc3RhdHVzX2J5dGU7CisJc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gKmdwZV9yZWdpc3Rlcl9pbmZvOworCXUzMiBzdGF0dXNfcmVnOworCXUzMiBlbmFibGVfcmVnOworCXUzMiBmbGFnczsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKKwlhY3BpX25hdGl2ZV91aW50IGk7CisJYWNwaV9uYXRpdmVfdWludCBqOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJldl9ncGVfZGV0ZWN0Iik7CisJQUNQSV9GVU5DVElPTl9OQU1FKCJldl9ncGVfZGV0ZWN0Iik7CiAKIAkvKiBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIG5vIEdQRXMgKi8KIApAQCAtNDEyLDcgKzM5Myw3IEBACiAKIAkvKiBFeGFtaW5lIGFsbCBHUEUgYmxvY2tzIGF0dGFjaGVkIHRvIHRoaXMgaW50ZXJydXB0IGxldmVsICovCiAKLQlhY3BpX29zX2FjcXVpcmVfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIEFDUElfSVNSKTsKKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKIAlncGVfYmxvY2sgPSBncGVfeHJ1cHRfbGlzdC0+Z3BlX2Jsb2NrX2xpc3RfaGVhZDsKIAl3aGlsZSAoZ3BlX2Jsb2NrKSB7CiAJCS8qCkBAIC00MjcsMjMgKzQwOCwzMCBAQAogCiAJCQkvKiBSZWFkIHRoZSBTdGF0dXMgUmVnaXN0ZXIgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfcmVhZCAoQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgsICZzdGF0dXNfcmVnLAotCQkJCQkgJmdwZV9yZWdpc3Rlcl9pbmZvLT5zdGF0dXNfYWRkcmVzcyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgsCisJCQkJCQkgICAmc3RhdHVzX3JlZywKKwkJCQkJCSAgICZncGVfcmVnaXN0ZXJfaW5mby0+CisJCQkJCQkgICBzdGF0dXNfYWRkcmVzcyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJCX0KIAogCQkJLyogUmVhZCB0aGUgRW5hYmxlIFJlZ2lzdGVyICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3JlYWQgKEFDUElfR1BFX1JFR0lTVEVSX1dJRFRILCAmZW5hYmxlX3JlZywKLQkJCQkJICZncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2FkZHJlc3MpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKEFDUElfR1BFX1JFR0lTVEVSX1dJRFRILAorCQkJCQkJICAgJmVuYWJsZV9yZWcsCisJCQkJCQkgICAmZ3BlX3JlZ2lzdGVyX2luZm8tPgorCQkJCQkJICAgZW5hYmxlX2FkZHJlc3MpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCQl9CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOVEVSUlVQVFMsCi0JCQkJIlJlYWQgR1BFIFJlZ2lzdGVyIGF0IEdQRSVYOiBTdGF0dXM9JTAyWCwgRW5hYmxlPSUwMlhcbiIsCi0JCQkJZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlciwgc3RhdHVzX3JlZywgZW5hYmxlX3JlZykpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTlRFUlJVUFRTLAorCQkJCQkgICJSZWFkIEdQRSBSZWdpc3RlciBhdCBHUEUlWDogU3RhdHVzPSUwMlgsIEVuYWJsZT0lMDJYXG4iLAorCQkJCQkgIGdwZV9yZWdpc3Rlcl9pbmZvLT5iYXNlX2dwZV9udW1iZXIsCisJCQkJCSAgc3RhdHVzX3JlZywgZW5hYmxlX3JlZykpOwogCiAJCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyBhY3RpdmUgYXQgYWxsIGluIHRoaXMgcmVnaXN0ZXIgKi8KIApAQCAtNDU5LDE0ICs0NDcsMjEgQEAKIAkJCWZvciAoaiA9IDA7IGogPCBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsgaisrKSB7CiAJCQkJLyogRXhhbWluZSBvbmUgR1BFIGJpdCAqLwogCi0JCQkJaWYgKGVuYWJsZWRfc3RhdHVzX2J5dGUgJiBhY3BpX2dibF9kZWNvZGVfdG84Yml0W2pdKSB7CisJCQkJaWYgKGVuYWJsZWRfc3RhdHVzX2J5dGUgJgorCQkJCSAgICBhY3BpX2dibF9kZWNvZGVfdG84Yml0W2pdKSB7CiAJCQkJCS8qCiAJCQkJCSAqIEZvdW5kIGFuIGFjdGl2ZSBHUEUuIERpc3BhdGNoIHRoZSBldmVudCB0byBhIGhhbmRsZXIKIAkJCQkJICogb3IgbWV0aG9kLgogCQkJCQkgKi8KLQkJCQkJaW50X3N0YXR1cyB8PSBhY3BpX2V2X2dwZV9kaXNwYXRjaCAoCi0JCQkJCQkmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvWyhpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal0sCi0JCQkJCQkodTMyKSBqICsgZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlcik7CisJCQkJCWludF9zdGF0dXMgfD0KKwkJCQkJICAgIGFjcGlfZXZfZ3BlX2Rpc3BhdGNoKCZncGVfYmxvY2stPgorCQkJCQkJCQkgZXZlbnRfaW5mb1soaSAqCisJCQkJCQkJCQkgICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKQorCQkJCQkJCQkJICAgICsKKwkJCQkJCQkJCSAgICBqXSwKKwkJCQkJCQkJICh1MzIpIGogKworCQkJCQkJCQkgZ3BlX3JlZ2lzdGVyX2luZm8tPgorCQkJCQkJCQkgYmFzZV9ncGVfbnVtYmVyKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTQ3NCwxMyArNDY5LDEyIEBACiAJCWdwZV9ibG9jayA9IGdwZV9ibG9jay0+bmV4dDsKIAl9CiAKLXVubG9ja19hbmRfZXhpdDoKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKIAotCWFjcGlfb3NfcmVsZWFzZV9sb2NrIChhY3BpX2dibF9ncGVfbG9jaywgQUNQSV9JU1IpOworCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIChpbnRfc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2QKQEAgLTQ5Nyw0NSArNDkxLDQxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UKLWFjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZCAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCkKK3N0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZCh2b2lkICpjb250ZXh0KQogewotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvID0gKHZvaWQgKikgY29udGV4dDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIgPSAwOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgbG9jYWxfZ3BlX2V2ZW50X2luZm87Ci0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICBpbmZvOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbyA9ICh2b2lkICopY29udGV4dDsKKwl1MzIgZ3BlX251bWJlciA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvIGxvY2FsX2dwZV9ldmVudF9pbmZvOworCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIGluZm87CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZCIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fVk9JRDsKIAl9CiAKIAkvKiBNdXN0IHJldmFsaWRhdGUgdGhlIGdwZV9udW1iZXIvZ3BlX2Jsb2NrICovCiAKLQlpZiAoIWFjcGlfZXZfdmFsaWRfZ3BlX2V2ZW50IChncGVfZXZlbnRfaW5mbykpIHsKLQkJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOworCWlmICghYWNwaV9ldl92YWxpZF9ncGVfZXZlbnQoZ3BlX2V2ZW50X2luZm8pKSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwogCQlyZXR1cm5fVk9JRDsKIAl9CiAKIAkvKiBTZXQgdGhlIEdQRSBmbGFncyBmb3IgcmV0dXJuIHRvIGVuYWJsZWQgc3RhdGUgKi8KIAotCSh2b2lkKSBhY3BpX2V2X2VuYWJsZV9ncGUgKGdwZV9ldmVudF9pbmZvLCBGQUxTRSk7CisJKHZvaWQpYWNwaV9ldl9lbmFibGVfZ3BlKGdwZV9ldmVudF9pbmZvLCBGQUxTRSk7CiAKIAkvKgogCSAqIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgR1BFIGluZm8gZm9yIHRoaXMgbGV2ZWwgLSB3ZSBjb3B5IHRoZQogCSAqIGluZm8gdG8gcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIHdpdGggcmVtb3ZlX2hhbmRsZXIvcmVtb3ZlX2Jsb2NrLgogCSAqLwotCUFDUElfTUVNQ1BZICgmbG9jYWxfZ3BlX2V2ZW50X2luZm8sIGdwZV9ldmVudF9pbmZvLAotCQlzaXplb2YgKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvKSk7CisJQUNQSV9NRU1DUFkoJmxvY2FsX2dwZV9ldmVudF9pbmZvLCBncGVfZXZlbnRfaW5mbywKKwkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbykpOwogCi0Jc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCkBAIC01NDQsNDQgKzUzNCw0MCBAQAogCSAqIHRpbWUgdG8gYXZvaWQgcmFjZSB3aXRoIGV2X2dwZV9pbnN0YWxsX2hhbmRsZXIKIAkgKi8KIAlpZiAoKGxvY2FsX2dwZV9ldmVudF9pbmZvLmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgPT0KLQkJCUFDUElfR1BFX0RJU1BBVENIX01FVEhPRCkgeworCSAgICBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpIHsKIAkJLyoKIAkJICogSW52b2tlIHRoZSBHUEUgTWV0aG9kIChfTHh4LCBfRXh4KSBpLmUuLCBldmFsdWF0ZSB0aGUgX0x4eC9fRXh4CiAJCSAqIGNvbnRyb2wgbWV0aG9kIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBHUEUKIAkJICovCiAJCWluZm8ubm9kZSA9IGxvY2FsX2dwZV9ldmVudF9pbmZvLmRpc3BhdGNoLm1ldGhvZF9ub2RlOwotCQlpbmZvLnBhcmFtZXRlcnMgPSBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICosIGdwZV9ldmVudF9pbmZvKTsKKwkJaW5mby5wYXJhbWV0ZXJzID0KKwkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqLCBncGVfZXZlbnRfaW5mbyk7CiAJCWluZm8ucGFyYW1ldGVyX3R5cGUgPSBBQ1BJX1BBUkFNX0dQRTsKIAotCQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZSAoJmluZm8pOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCSIlcyB3aGlsZSBldmFsdWF0aW5nIG1ldGhvZCBbJTQuNHNdIGZvciBHUEVbJTJYXVxuIiwKLQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChsb2NhbF9ncGVfZXZlbnRfaW5mby5kaXNwYXRjaC5tZXRob2Rfbm9kZSksCi0JCQkJZ3BlX251bWJlcikpOworCQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZSgmaW5mbyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCIlcyB3aGlsZSBldmFsdWF0aW5nIG1ldGhvZCBbJTQuNHNdIGZvciBHUEVbJTJYXVxuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShsb2NhbF9ncGVfZXZlbnRfaW5mby5kaXNwYXRjaC5tZXRob2Rfbm9kZSksIGdwZV9udW1iZXIpKTsKIAkJfQogCX0KIAogCWlmICgobG9jYWxfZ3BlX2V2ZW50X2luZm8uZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09Ci0JCQlBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQpIHsKKwkgICAgQUNQSV9HUEVfTEVWRUxfVFJJR0dFUkVEKSB7CiAJCS8qCiAJCSAqIEdQRSBpcyBsZXZlbC10cmlnZ2VyZWQsIHdlIGNsZWFyIHRoZSBHUEUgc3RhdHVzIGJpdCBhZnRlcgogCQkgKiBoYW5kbGluZyB0aGUgZXZlbnQuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZSAoJmxvY2FsX2dwZV9ldmVudF9pbmZvKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZSgmbG9jYWxfZ3BlX2V2ZW50X2luZm8pOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybl9WT0lEOwogCQl9CiAJfQogCiAJLyogRW5hYmxlIHRoaXMgR1BFICovCiAKLQkodm9pZCkgYWNwaV9od193cml0ZV9ncGVfZW5hYmxlX3JlZyAoJmxvY2FsX2dwZV9ldmVudF9pbmZvKTsKKwkodm9pZClhY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnKCZsb2NhbF9ncGVfZXZlbnRfaW5mbyk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9ncGVfZGlzcGF0Y2gKQEAgLTU5OSwzOCArNTg1LDMxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB1MzIKLWFjcGlfZXZfZ3BlX2Rpc3BhdGNoICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIpCithY3BpX2V2X2dwZV9kaXNwYXRjaChzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8sIHUzMiBncGVfbnVtYmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2dwZV9kaXNwYXRjaCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfZ3BlX2Rpc3BhdGNoIik7CiAKIAkvKgogCSAqIElmIGVkZ2UtdHJpZ2dlcmVkLCBjbGVhciB0aGUgR1BFIHN0YXR1cyBiaXQgbm93LiAgTm90ZSB0aGF0CiAJICogbGV2ZWwtdHJpZ2dlcmVkIGV2ZW50cyBhcmUgY2xlYXJlZCBhZnRlciB0aGUgR1BFIGlzIHNlcnZpY2VkLgogCSAqLwogCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLKSA9PQotCQkJQUNQSV9HUEVfRURHRV9UUklHR0VSRUQpIHsKLQkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUgKGdwZV9ldmVudF9pbmZvKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6ICVzLCBVbmFibGUgdG8gY2xlYXIgR1BFWyUyWF1cbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLCBncGVfbnVtYmVyKSk7Ci0JCQlyZXR1cm5fVkFMVUUgKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKKwkgICAgQUNQSV9HUEVfRURHRV9UUklHR0VSRUQpIHsKKwkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUoZ3BlX2V2ZW50X2luZm8pOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6ICVzLCBVbmFibGUgdG8gY2xlYXIgR1BFWyUyWF1cbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLCBncGVfbnVtYmVyKSk7CisJCQlyZXR1cm5fVkFMVUUoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwogCQl9CiAJfQogCiAJLyogU2F2ZSBjdXJyZW50IHN5c3RlbSBzdGF0ZSAqLwogCiAJaWYgKGFjcGlfZ2JsX3N5c3RlbV9hd2FrZV9hbmRfcnVubmluZykgewotCQlBQ1BJX1NFVF9CSVQgKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfU1lTVEVNX1JVTk5JTkcpOwotCX0KLQllbHNlIHsKLQkJQUNQSV9DTEVBUl9CSVQgKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfU1lTVEVNX1JVTk5JTkcpOworCQlBQ1BJX1NFVF9CSVQoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9TWVNURU1fUlVOTklORyk7CisJfSBlbHNlIHsKKwkJQUNQSV9DTEVBUl9CSVQoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9TWVNURU1fUlVOTklORyk7CiAJfQogCiAJLyoKQEAgLTY0NywxOSArNjI2LDE5IEBACiAJCSAqIEludm9rZSB0aGUgaW5zdGFsbGVkIGhhbmRsZXIgKGF0IGludGVycnVwdCBsZXZlbCkKIAkJICogSWdub3JlIHJldHVybiBzdGF0dXMgZm9yIG5vdy4gIFRCRDogbGVhdmUgR1BFIGRpc2FibGVkIG9uIGVycm9yPwogCQkgKi8KLQkJKHZvaWQpIGdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5oYW5kbGVyLT5hZGRyZXNzICgKLQkJCQkgIGdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5oYW5kbGVyLT5jb250ZXh0KTsKKwkJKHZvaWQpZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXItPmFkZHJlc3MoZ3BlX2V2ZW50X2luZm8tPgorCQkJCQkJCQlkaXNwYXRjaC4KKwkJCQkJCQkJaGFuZGxlci0+CisJCQkJCQkJCWNvbnRleHQpOwogCiAJCS8qIEl0IGlzIG5vdyBzYWZlIHRvIGNsZWFyIGxldmVsLXRyaWdnZXJlZCBldmVudHMuICovCiAKIAkJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09Ci0JCQkJQUNQSV9HUEVfTEVWRUxfVFJJR0dFUkVEKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZSAoZ3BlX2V2ZW50X2luZm8pOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJCSJhY3BpX2V2X2dwZV9kaXNwYXRjaDogJXMsIFVuYWJsZSB0byBjbGVhciBHUEVbJTJYXVxuIiwKLQkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLCBncGVfbnVtYmVyKSk7Ci0JCQkJcmV0dXJuX1ZBTFVFIChBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7CisJCSAgICBBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQpIHsKKwkJCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6ICVzLCBVbmFibGUgdG8gY2xlYXIgR1BFWyUyWF1cbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLCBncGVfbnVtYmVyKSk7CisJCQkJcmV0dXJuX1ZBTFVFKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKIAkJCX0KIAkJfQogCQlicmVhazsKQEAgLTY3MCwyNCArNjQ5LDIxIEBACiAJCSAqIERpc2FibGUgR1BFLCBzbyBpdCBkb2Vzbid0IGtlZXAgZmlyaW5nIGJlZm9yZSB0aGUgbWV0aG9kIGhhcyBhCiAJCSAqIGNoYW5jZSB0byBydW4uCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlIChncGVfZXZlbnRfaW5mbyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJImFjcGlfZXZfZ3BlX2Rpc3BhdGNoOiAlcywgVW5hYmxlIHRvIGRpc2FibGUgR1BFWyUyWF1cbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLCBncGVfbnVtYmVyKSk7Ci0JCQlyZXR1cm5fVkFMVUUgKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKKwkJc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V2X2dwZV9kaXNwYXRjaDogJXMsIFVuYWJsZSB0byBkaXNhYmxlIEdQRVslMlhdXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwgZ3BlX251bWJlcikpOworCQkJcmV0dXJuX1ZBTFVFKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKIAkJfQogCiAJCS8qCiAJCSAqIEV4ZWN1dGUgdGhlIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggdGhlIEdQRQogCQkgKiBOT1RFOiBMZXZlbC10cmlnZ2VyZWQgR1BFcyBhcmUgY2xlYXJlZCBhZnRlciB0aGUgbWV0aG9kIGNvbXBsZXRlcy4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbiAoT1NEX1BSSU9SSVRZX0dQRSwKLQkJCQkgYWNwaV9ldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kLCBncGVfZXZlbnRfaW5mbyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJImFjcGlfZXZfZ3BlX2Rpc3BhdGNoOiAlcywgVW5hYmxlIHRvIHF1ZXVlIGhhbmRsZXIgZm9yIEdQRVslMlhdIC0gZXZlbnQgZGlzYWJsZWRcbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLCBncGVfbnVtYmVyKSk7CisJCXN0YXR1cyA9IGFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbihPU0RfUFJJT1JJVFlfR1BFLAorCQkJCQkJICAgICBhY3BpX2V2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2QsCisJCQkJCQkgICAgIGdwZV9ldmVudF9pbmZvKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXZfZ3BlX2Rpc3BhdGNoOiAlcywgVW5hYmxlIHRvIHF1ZXVlIGhhbmRsZXIgZm9yIEdQRVslMlhdIC0gZXZlbnQgZGlzYWJsZWRcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLCBncGVfbnVtYmVyKSk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTY5NSwyOCArNjcxLDIzIEBACiAKIAkJLyogTm8gaGFuZGxlciBvciBtZXRob2QgdG8gcnVuISAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6IE5vIGhhbmRsZXIgb3IgbWV0aG9kIGZvciBHUEVbJTJYXSwgZGlzYWJsaW5nIGV2ZW50XG4iLAotCQkJZ3BlX251bWJlcikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXZfZ3BlX2Rpc3BhdGNoOiBObyBoYW5kbGVyIG9yIG1ldGhvZCBmb3IgR1BFWyUyWF0sIGRpc2FibGluZyBldmVudFxuIiwgZ3BlX251bWJlcikpOwogCiAJCS8qCiAJCSAqIERpc2FibGUgdGhlIEdQRS4gIFRoZSBHUEUgd2lsbCByZW1haW4gZGlzYWJsZWQgdW50aWwgdGhlIEFDUEkKIAkJICogQ29yZSBTdWJzeXN0ZW0gaXMgcmVzdGFydGVkLCBvciBhIGhhbmRsZXIgaXMgaW5zdGFsbGVkLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZSAoZ3BlX2V2ZW50X2luZm8pOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCSJhY3BpX2V2X2dwZV9kaXNwYXRjaDogJXMsIFVuYWJsZSB0byBkaXNhYmxlIEdQRVslMlhdXG4iLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSwgZ3BlX251bWJlcikpOwotCQkJcmV0dXJuX1ZBTFVFIChBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7CisJCXN0YXR1cyA9IGFjcGlfZXZfZGlzYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8pOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6ICVzLCBVbmFibGUgdG8gZGlzYWJsZSBHUEVbJTJYXVxuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksIGdwZV9udW1iZXIpKTsKKwkJCXJldHVybl9WQUxVRShBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7CiAJCX0KIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuX1ZBTFVFIChBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEKTsKKwlyZXR1cm5fVkFMVUUoQUNQSV9JTlRFUlJVUFRfSEFORExFRCk7CiB9CiAKLQogI2lmZGVmIEFDUElfR1BFX05PVElGWV9DSEVDSwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFRCRDogTk9UIFVTRUQsIFBST1RPVFlQRSBPTkxZIEFORCBXSUxMIFBST0JBQkxZIEJFIFJFTU9WRUQKQEAgLTczNSwzNSArNzA2LDI5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9jaGVja19mb3Jfd2FrZV9vbmx5X2dwZSAoCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8pCithY3BpX2V2X2NoZWNrX2Zvcl93YWtlX29ubHlfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9jaGVja19mb3Jfd2FrZV9vbmx5X2dwZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2NoZWNrX2Zvcl93YWtlX29ubHlfZ3BlIik7Ci0KLQotCWlmICgoZ3BlX2V2ZW50X2luZm8pICYmICAvKiBPbmx5ID4wIGZvciBfTHh4L19FeHggKi8KLQkgICAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1NZU1RFTV9NQVNLKSA9PSBBQ1BJX0dQRV9TWVNURU1fUlVOTklORykpIC8qIFN5c3RlbSBzdGF0ZSBhdCBHUEUgdGltZSAqLyB7CisJaWYgKChncGVfZXZlbnRfaW5mbykgJiYJLyogT25seSA+MCBmb3IgX0x4eC9fRXh4ICovCisJICAgICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfU1lTVEVNX01BU0spID09IEFDUElfR1BFX1NZU1RFTV9SVU5OSU5HKSkgewkvKiBTeXN0ZW0gc3RhdGUgYXQgR1BFIHRpbWUgKi8KIAkJLyogVGhpcyBtdXN0IGJlIGEgd2FrZS1vbmx5IEdQRSwgZGlzYWJsZSBpdCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXZfZGlzYWJsZV9ncGUgKGdwZV9ldmVudF9pbmZvKTsKKwkJc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7CiAKIAkJLyogU2V0IEdQRSB0byB3YWtlLW9ubHkuICBEbyBub3QgY2hhbmdlIHdha2UgZGlzYWJsZWQvZW5hYmxlZCBzdGF0dXMgKi8KIAotCQlhY3BpX2V2X3NldF9ncGVfdHlwZSAoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX1RZUEVfV0FLRSk7CisJCWFjcGlfZXZfc2V0X2dwZV90eXBlKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9UWVBFX1dBS0UpOwogCi0JCUFDUElfUkVQT1JUX0lORk8gKCgiR1BFICVwIHdhcyB1cGRhdGVkIGZyb20gd2FrZS9ydW4gdG8gd2FrZS1vbmx5XG4iLAotCQkJCWdwZV9ldmVudF9pbmZvKSk7CisJCUFDUElfUkVQT1JUX0lORk8oKCJHUEUgJXAgd2FzIHVwZGF0ZWQgZnJvbSB3YWtlL3J1biB0byB3YWtlLW9ubHlcbiIsIGdwZV9ldmVudF9pbmZvKSk7CiAKIAkJLyogVGhpcyB3YXMgYSB3YWtlLW9ubHkgR1BFICovCiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9XQUtFX09OTFlfR1BFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1dBS0VfT05MWV9HUEUpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAjZW5kaWYKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMKaW5kZXggODQxODZhNy4uYjMxMmViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGVibGsuYwpAQCAtNDYsNDEgKzQ2LDI5IEBACiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV2Z3BlYmxrIikKK0FDUElfTU9EVUxFX05BTUUoImV2Z3BlYmxrIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V2X3NhdmVfbWV0aG9kX2luZm8oYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCSB1MzIgbGV2ZWwsIHZvaWQgKm9ial9kZXNjLCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X3NhdmVfbWV0aG9kX2luZm8gKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9ial9kZXNjLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworYWNwaV9ldl9tYXRjaF9wcndfYW5kX2dwZShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJICB1MzIgbGV2ZWwsIHZvaWQgKmluZm8sIHZvaWQgKipyZXR1cm5fdmFsdWUpOworCitzdGF0aWMgc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmFjcGlfZXZfZ2V0X2dwZV94cnVwdF9ibG9jayh1MzIKKwkJCQkJCQkgICAgICAgaW50ZXJydXB0X251bWJlcik7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9tYXRjaF9wcndfYW5kX2dwZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5mbywKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICoKLWFjcGlfZXZfZ2V0X2dwZV94cnVwdF9ibG9jayAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWwpOworYWNwaV9ldl9kZWxldGVfZ3BlX3hydXB0KHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHQpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfZGVsZXRlX2dwZV94cnVwdCAoCi0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0KTsKK2FjcGlfZXZfaW5zdGFsbF9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywKKwkJCSAgdTMyIGludGVycnVwdF9udW1iZXIpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5zdGFsbF9ncGVfYmxvY2sgKAotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jaywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbCk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9jcmVhdGVfZ3BlX2luZm9fYmxvY2tzICgKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOwotCithY3BpX2V2X2NyZWF0ZV9ncGVfaW5mb19ibG9ja3Moc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jayk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtOTYsMTYgKzg0LDEyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTgKLWFjcGlfZXZfdmFsaWRfZ3BlX2V2ZW50ICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbykKK3U4IGFjcGlfZXZfdmFsaWRfZ3BlX2V2ZW50KHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbykKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfYmxvY2s7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrOworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfYmxvY2s7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qIE5vIG5lZWQgZm9yIHNwaW4gbG9jayBzaW5jZSB3ZSBhcmUgbm90IGNoYW5naW5nIGFueSBsaXN0IGVsZW1lbnRzICovCiAKQEAgLTExOSw3ICsxMDMsMTAgQEAKIAogCQl3aGlsZSAoZ3BlX2Jsb2NrKSB7CiAJCQlpZiAoKCZncGVfYmxvY2stPmV2ZW50X2luZm9bMF0gPD0gZ3BlX2V2ZW50X2luZm8pICYmCi0JCQkJKCZncGVfYmxvY2stPmV2ZW50X2luZm9bKChhY3BpX3NpemUpIGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQpICogOF0gPiBncGVfZXZlbnRfaW5mbykpIHsKKwkJCSAgICAoJmdwZV9ibG9jay0+CisJCQkgICAgIGV2ZW50X2luZm9bKChhY3BpX3NpemUpIGdwZV9ibG9jay0+CisJCQkJCSByZWdpc3Rlcl9jb3VudCkgKiA4XSA+CisJCQkgICAgIGdwZV9ldmVudF9pbmZvKSkgewogCQkJCXJldHVybiAoVFJVRSk7CiAJCQl9CiAKQEAgLTEzMiwxMyArMTE5LDExIEBACiAJcmV0dXJuIChGQUxTRSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl93YWxrX2dwZV9saXN0CiAgKgogICogUEFSQU1FVEVSUzogIGdwZV93YWxrX2NhbGxiYWNrICAgLSBSb3V0aW5lIGNhbGxlZCBmb3IgZWFjaCBHUEUgYmxvY2sKLSAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gQUNQSV9OT1RfSVNSIG9yIEFDUElfSVNSCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTE0NiwyMCArMTMxLDE2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfd2Fsa19ncGVfbGlzdCAoCi0JQUNQSV9HUEVfQ0FMTEJBQ0sgICAgICAgZ3BlX3dhbGtfY2FsbGJhY2ssCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK2FjcGlfc3RhdHVzIGFjcGlfZXZfd2Fsa19ncGVfbGlzdChBQ1BJX0dQRV9DQUxMQkFDSyBncGVfd2Fsa19jYWxsYmFjaykKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2s7Ci0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm87Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgZmxhZ3M7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl93YWxrX2dwZV9saXN0Iik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfd2Fsa19ncGVfbGlzdCIpOwotCi0KLQlhY3BpX29zX2FjcXVpcmVfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKIAogCS8qIFdhbGsgdGhlIGludGVycnVwdCBsZXZlbCBkZXNjcmlwdG9yIGxpc3QgKi8KIApAQCAtMTcxLDggKzE1Miw4IEBACiAJCXdoaWxlIChncGVfYmxvY2spIHsKIAkJCS8qIE9uZSBjYWxsYmFjayBwZXIgR1BFIGJsb2NrICovCiAKLQkJCXN0YXR1cyA9IGdwZV93YWxrX2NhbGxiYWNrIChncGVfeHJ1cHRfaW5mbywgZ3BlX2Jsb2NrKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IGdwZV93YWxrX2NhbGxiYWNrKGdwZV94cnVwdF9pbmZvLCBncGVfYmxvY2spOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCQl9CiAKQEAgLTE4MiwxMiArMTYzLDExIEBACiAJCWdwZV94cnVwdF9pbmZvID0gZ3BlX3hydXB0X2luZm8tPm5leHQ7CiAJfQogCi11bmxvY2tfYW5kX2V4aXQ6Ci0JYWNwaV9vc19yZWxlYXNlX2xvY2sgKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9kZWxldGVfZ3BlX2hhbmRsZXJzCkBAIC0yMDMsMTcgKzE4MywxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycyAoCi0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKQorYWNwaV9ldl9kZWxldGVfZ3BlX2hhbmRsZXJzKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKKwkJCSAgICBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKQogewotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGo7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOworCWFjcGlfbmF0aXZlX3VpbnQgaTsKKwlhY3BpX25hdGl2ZV91aW50IGo7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9kZWxldGVfZ3BlX2hhbmRsZXJzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9kZWxldGVfZ3BlX2hhbmRsZXJzIik7CiAKIAkvKiBFeGFtaW5lIGVhY2ggR1BFIFJlZ2lzdGVyIHdpdGhpbiB0aGUgYmxvY2sgKi8KIApAQCAtMjIxLDIxICsxOTgsMjMgQEAKIAkJLyogTm93IGxvb2sgYXQgdGhlIGluZGl2aWR1YWwgR1BFcyBpbiB0aGlzIGJ5dGUgcmVnaXN0ZXIgKi8KIAogCQlmb3IgKGogPSAwOyBqIDwgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7IGorKykgewotCQkJZ3BlX2V2ZW50X2luZm8gPSAmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvWyhpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal07CisJCQlncGVfZXZlbnRfaW5mbyA9CisJCQkgICAgJmdwZV9ibG9jay0+CisJCQkgICAgZXZlbnRfaW5mb1soaSAqIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSArIGpdOwogCiAJCQlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spID09Ci0JCQkJCUFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVIpIHsKLQkJCQlBQ1BJX01FTV9GUkVFIChncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guaGFuZGxlcik7CisJCQkgICAgQUNQSV9HUEVfRElTUEFUQ0hfSEFORExFUikgeworCQkJCUFDUElfTUVNX0ZSRUUoZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXIpOwogCQkJCWdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5oYW5kbGVyID0gTlVMTDsKLQkJCQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJj0gfkFDUElfR1BFX0RJU1BBVENIX01BU0s7CisJCQkJZ3BlX2V2ZW50X2luZm8tPmZsYWdzICY9CisJCQkJICAgIH5BQ1BJX0dQRV9ESVNQQVRDSF9NQVNLOwogCQkJfQogCQl9CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3NhdmVfbWV0aG9kX2luZm8KQEAgLTI1OSwzMCArMjM4LDI2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfc2F2ZV9tZXRob2RfaW5mbyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2Rlc2MsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSkKK2FjcGlfZXZfc2F2ZV9tZXRob2RfaW5mbyhhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJIHUzMiBsZXZlbCwgdm9pZCAqb2JqX2Rlc2MsIHZvaWQgKipyZXR1cm5fdmFsdWUpCiB7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrID0gKHZvaWQgKikgb2JqX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm87Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfbnVtYmVyOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVtBQ1BJX05BTUVfU0laRSArIDFdOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrID0gKHZvaWQgKilvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CisJdTMyIGdwZV9udW1iZXI7CisJY2hhciBuYW1lW0FDUElfTkFNRV9TSVpFICsgMV07CisJdTggdHlwZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9zYXZlX21ldGhvZF9pbmZvIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9zYXZlX21ldGhvZF9pbmZvIik7CiAKIAkvKgogCSAqIF9MeHggYW5kIF9FeHggR1BFIG1ldGhvZCBzdXBwb3J0CiAJICoKIAkgKiAxKSBFeHRyYWN0IHRoZSBuYW1lIGZyb20gdGhlIG9iamVjdCBhbmQgY29udmVydCB0byBhIHN0cmluZwogCSAqLwotCUFDUElfTU9WRV8zMl9UT18zMiAobmFtZSwKLQkJCSAgICYoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9oYW5kbGUpLT5uYW1lLmludGVnZXIpOworCUFDUElfTU9WRV8zMl9UT18zMihuYW1lLAorCQkJICAgJigoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfaGFuZGxlKS0+bmFtZS4KKwkJCSAgIGludGVnZXIpOwogCW5hbWVbQUNQSV9OQU1FX1NJWkVdID0gMDsKIAogCS8qCkBAIC0zMDQsMzQgKzI3OSwzNiBAQAogCWRlZmF1bHQ6CiAJCS8qIFVua25vd24gbWV0aG9kIHR5cGUsIGp1c3QgaWdub3JlIGl0ISAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVua25vd24gR1BFIG1ldGhvZCB0eXBlOiAlcyAobmFtZSBub3Qgb2YgZm9ybSBfTHh4IG9yIF9FeHgpXG4iLAotCQkJbmFtZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbmtub3duIEdQRSBtZXRob2QgdHlwZTogJXMgKG5hbWUgbm90IG9mIGZvcm0gX0x4eCBvciBfRXh4KVxuIiwKKwkJCQkgIG5hbWUpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBDb252ZXJ0IHRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBuYW1lIHRvIHRoZSBHUEUgTnVtYmVyICovCiAKLQlncGVfbnVtYmVyID0gQUNQSV9TVFJUT1VMICgmbmFtZVsyXSwgTlVMTCwgMTYpOworCWdwZV9udW1iZXIgPSBBQ1BJX1NUUlRPVUwoJm5hbWVbMl0sIE5VTEwsIDE2KTsKIAlpZiAoZ3BlX251bWJlciA9PSBBQ1BJX1VJTlQzMl9NQVgpIHsKIAkJLyogQ29udmVyc2lvbiBmYWlsZWQ7IGludmFsaWQgbWV0aG9kLCBqdXN0IGlnbm9yZSBpdCAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIkNvdWxkIG5vdCBleHRyYWN0IEdQRSBudW1iZXIgZnJvbSBuYW1lOiAlcyAobmFtZSBpcyBub3Qgb2YgZm9ybSBfTHh4IG9yIF9FeHgpXG4iLAotCQkJbmFtZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJDb3VsZCBub3QgZXh0cmFjdCBHUEUgbnVtYmVyIGZyb20gbmFtZTogJXMgKG5hbWUgaXMgbm90IG9mIGZvcm0gX0x4eCBvciBfRXh4KVxuIiwKKwkJCQkgIG5hbWUpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciBmb3IgdGhpcyBHUEUgYmxvY2sgKi8KIAogCWlmICgoZ3BlX251bWJlciA8IGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIpIHx8Ci0JCShncGVfbnVtYmVyID49IChncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsgKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiA4KSkpKSB7CisJICAgIChncGVfbnVtYmVyID49CisJICAgICAoZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArCisJICAgICAgKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiA4KSkpKSB7CiAJCS8qCiAJCSAqIE5vdCB2YWxpZCBmb3IgdGhpcyBHUEUgYmxvY2ssIGp1c3QgaWdub3JlIGl0CiAJCSAqIEhvd2V2ZXIsIGl0IG1heSBiZSB2YWxpZCBmb3IgYSBkaWZmZXJlbnQgR1BFIGJsb2NrLCBzaW5jZSBHUEUwIGFuZCBHUEUxCiAJCSAqIG1ldGhvZHMgYm90aCBhcHBlYXIgdW5kZXIgXF9HUEUuCiAJCSAqLwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKgpAQCAtMzM5LDI0ICszMTYsMjUgQEAKIAkgKiBmb3IgdXNlIGR1cmluZyBkaXNwYXRjaCBvZiB0aGlzIEdQRS4gIERlZmF1bHQgdHlwZSBpcyBSVU5USU1FLCBhbHRob3VnaAogCSAqIHRoaXMgbWF5IGNoYW5nZSB3aGVuIHRoZSBfUFJXIG1ldGhvZHMgYXJlIGV4ZWN1dGVkIGxhdGVyLgogCSAqLwotCWdwZV9ldmVudF9pbmZvID0gJmdwZV9ibG9jay0+ZXZlbnRfaW5mb1tncGVfbnVtYmVyIC0gZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcl07CisJZ3BlX2V2ZW50X2luZm8gPQorCSAgICAmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvW2dwZV9udW1iZXIgLSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyXTsKIAogCWdwZV9ldmVudF9pbmZvLT5mbGFncyA9ICh1OCkgKHR5cGUgfCBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QgfAotCQkJICAgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKKwkJCQkgICAgICBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUpOwogCi0JZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLm1ldGhvZF9ub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9oYW5kbGU7CisJZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLm1ldGhvZF9ub2RlID0KKwkgICAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2hhbmRsZTsKIAogCS8qIFVwZGF0ZSBlbmFibGUgbWFzaywgYnV0IGRvbid0IGVuYWJsZSB0aGUgSFcgR1BFIGFzIG9mIHlldCAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl9lbmFibGVfZ3BlIChncGVfZXZlbnRfaW5mbywgRkFMU0UpOworCXN0YXR1cyA9IGFjcGlfZXZfZW5hYmxlX2dwZShncGVfZXZlbnRfaW5mbywgRkFMU0UpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwKLQkJIlJlZ2lzdGVyZWQgR1BFIG1ldGhvZCAlcyBhcyBHUEUgbnVtYmVyIDB4JS4yWFxuIiwKLQkJbmFtZSwgZ3BlX251bWJlcikpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0xPQUQsCisJCQkgICJSZWdpc3RlcmVkIEdQRSBtZXRob2QgJXMgYXMgR1BFIG51bWJlciAweCUuMlhcbiIsCisJCQkgIG5hbWUsIGdwZV9udW1iZXIpKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlCkBAIC0zNzMsMzQgKzM1MSwyOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpCithY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQkgIHUzMiBsZXZlbCwgdm9pZCAqaW5mbywgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfd2Fsa19pbmZvICAgICAgICpncGVfaW5mbyA9ICh2b2lkICopIGluZm87Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZ3BlX2RldmljZTsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2s7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqdGFyZ2V0X2dwZV9kZXZpY2U7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm87Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcGtnX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfbnVtYmVyOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX2dwZV93YWxrX2luZm8gKmdwZV9pbmZvID0gKHZvaWQgKilpbmZvOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpncGVfZGV2aWNlOworCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2s7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnRhcmdldF9ncGVfZGV2aWNlOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwa2dfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1MzIgZ3BlX251bWJlcjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9tYXRjaF9wcndfYW5kX2dwZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfbWF0Y2hfcHJ3X2FuZF9ncGUiKTsKIAogCS8qIENoZWNrIGZvciBhIF9QUlcgbWV0aG9kIHVuZGVyIHRoaXMgZGV2aWNlICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAob2JqX2hhbmRsZSwgTUVUSE9EX05BTUVfX1BSVywKLQkJCSBBQ1BJX0JUWVBFX1BBQ0tBR0UsICZwa2dfZGVzYyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KG9ial9oYW5kbGUsIE1FVEhPRF9OQU1FX19QUlcsCisJCQkJCSBBQ1BJX0JUWVBFX1BBQ0tBR0UsICZwa2dfZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCS8qIElnbm9yZSBhbGwgZXJyb3JzIGZyb20gX1BSVywgd2UgZG9uJ3Qgd2FudCB0byBhYm9ydCB0aGUgc3Vic3lzdGVtICovCiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogVGhlIHJldHVybmVkIF9QUlcgcGFja2FnZSBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzICovCkBAIC00MjAsNyArMzkzLDcgQEAKIAkgKi8KIAlvYmpfZGVzYyA9IHBrZ19kZXNjLT5wYWNrYWdlLmVsZW1lbnRzWzBdOwogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCS8qIFVzZSBGQURULWRlZmluZWQgR1BFIGRldmljZSAoZnJvbSBkZWZpbml0aW9uIG9mIF9QUlcpICovCiAKIAkJdGFyZ2V0X2dwZV9kZXZpY2UgPSBhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2U7CkBAIC00MjgsMjIgKzQwMSwyMyBAQAogCQkvKiBJbnRlZ2VyIGlzIHRoZSBHUEUgbnVtYmVyIGluIHRoZSBGQURUIGRlc2NyaWJlZCBHUEUgYmxvY2tzICovCiAKIAkJZ3BlX251bWJlciA9ICh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCX0KLQllbHNlIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CisJfSBlbHNlIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKIAkJLyogUGFja2FnZSBjb250YWlucyBhIEdQRSByZWZlcmVuY2UgYW5kIEdQRSBudW1iZXIgd2l0aGluIGEgR1BFIGJsb2NrICovCiAKIAkJaWYgKChvYmpfZGVzYy0+cGFja2FnZS5jb3VudCA8IDIpIHx8Ci0JCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzWzBdKSAhPSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB8fAotCQkJKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1sxXSkgIT0gQUNQSV9UWVBFX0lOVEVHRVIpKSB7CisJCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbMF0pICE9CisJCSAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkKKwkJICAgIHx8IChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1sxXSkgIT0KKwkJCUFDUElfVFlQRV9JTlRFR0VSKSkgewogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKIAkJLyogR2V0IEdQRSBibG9jayByZWZlcmVuY2UgYW5kIGRlY29kZSAqLwogCi0JCXRhcmdldF9ncGVfZGV2aWNlID0gb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbMF0tPnJlZmVyZW5jZS5ub2RlOworCQl0YXJnZXRfZ3BlX2RldmljZSA9CisJCSAgICBvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1swXS0+cmVmZXJlbmNlLm5vZGU7CiAJCWdwZV9udW1iZXIgPSAodTMyKSBvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1sxXS0+aW50ZWdlci52YWx1ZTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogVW5rbm93biB0eXBlLCBqdXN0IGlnbm9yZSBpdCAqLwogCiAJCWdvdG8gY2xlYW51cDsKQEAgLTQ1OCwzMSArNDMyLDM3IEBACiAJICogICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBHUEUgZGV2aWNlLgogCSAqLwogCWlmICgoZ3BlX2RldmljZSA9PSB0YXJnZXRfZ3BlX2RldmljZSkgJiYKLQkJKGdwZV9udW1iZXIgPj0gZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcikgJiYKLQkJKGdwZV9udW1iZXIgPCBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsgKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiA4KSkpIHsKLQkJZ3BlX2V2ZW50X2luZm8gPSAmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvW2dwZV9udW1iZXIgLSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyXTsKKwkgICAgKGdwZV9udW1iZXIgPj0gZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcikgJiYKKwkgICAgKGdwZV9udW1iZXIgPAorCSAgICAgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArIChncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICogOCkpKSB7CisJCWdwZV9ldmVudF9pbmZvID0KKwkJICAgICZncGVfYmxvY2stPmV2ZW50X2luZm9bZ3BlX251bWJlciAtCisJCQkJCSAgIGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXJdOwogCiAJCS8qIE1hcmsgR1BFIGZvciBXQUtFLU9OTFkgYnV0IFdBS0VfRElTQUJMRUQgKi8KIAotCQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJj0gfihBQ1BJX0dQRV9XQUtFX0VOQUJMRUQgfCBBQ1BJX0dQRV9SVU5fRU5BQkxFRCk7Ci0JCXN0YXR1cyA9IGFjcGlfZXZfc2V0X2dwZV90eXBlIChncGVfZXZlbnRfaW5mbywgQUNQSV9HUEVfVFlQRV9XQUtFKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJj0KKwkJICAgIH4oQUNQSV9HUEVfV0FLRV9FTkFCTEVEIHwgQUNQSV9HUEVfUlVOX0VOQUJMRUQpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldl9zZXRfZ3BlX3R5cGUoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX1RZUEVfV0FLRSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byBjbGVhbnVwOwogCQl9Ci0JCXN0YXR1cyA9IGFjcGlfZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3MgKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9ESVNBQkxFKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3MoZ3BlX2V2ZW50X2luZm8sCisJCQkJCQkgICAgQUNQSV9HUEVfRElTQUJMRSk7CiAJfQogCi1jbGVhbnVwOgotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocGtnX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworICAgICAgY2xlYW51cDoKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocGtnX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9nZXRfZ3BlX3hydXB0X2Jsb2NrCiAgKgotICogUEFSQU1FVEVSUzogIGludGVycnVwdF9sZXZlbCAgICAgLSBJbnRlcnJ1cHQgZm9yIGEgR1BFIGJsb2NrCisgKiBQQVJBTUVURVJTOiAgaW50ZXJydXB0X251bWJlciAgICAgLSBJbnRlcnJ1cHQgZm9yIGEgR1BFIGJsb2NrCiAgKgogICogUkVUVVJOOiAgICAgIEEgR1BFIGludGVycnVwdCBibG9jawogICoKQEAgLTQ5MywyNCArNDczLDIyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICoKLWFjcGlfZXZfZ2V0X2dwZV94cnVwdF9ibG9jayAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWwpCitzdGF0aWMgc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmFjcGlfZXZfZ2V0X2dwZV94cnVwdF9ibG9jayh1MzIKKwkJCQkJCQkgICAgICAgaW50ZXJydXB0X251bWJlcikKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpuZXh0X2dwZV94cnVwdDsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHQ7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKm5leHRfZ3BlX3hydXB0OworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBmbGFnczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2dldF9ncGVfeHJ1cHRfYmxvY2siKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2dldF9ncGVfeHJ1cHRfYmxvY2siKTsKIAogCS8qIE5vIG5lZWQgZm9yIGxvY2sgc2luY2Ugd2UgYXJlIG5vdCBjaGFuZ2luZyBhbnkgbGlzdCBlbGVtZW50cyBoZXJlICovCiAKIAluZXh0X2dwZV94cnVwdCA9IGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7CiAJd2hpbGUgKG5leHRfZ3BlX3hydXB0KSB7Ci0JCWlmIChuZXh0X2dwZV94cnVwdC0+aW50ZXJydXB0X2xldmVsID09IGludGVycnVwdF9sZXZlbCkgewotCQkJcmV0dXJuX1BUUiAobmV4dF9ncGVfeHJ1cHQpOworCQlpZiAobmV4dF9ncGVfeHJ1cHQtPmludGVycnVwdF9udW1iZXIgPT0gaW50ZXJydXB0X251bWJlcikgeworCQkJcmV0dXJuX1BUUihuZXh0X2dwZV94cnVwdCk7CiAJCX0KIAogCQluZXh0X2dwZV94cnVwdCA9IG5leHRfZ3BlX3hydXB0LT5uZXh0OwpAQCAtNTE4LDE2ICs0OTYsMTYgQEAKIAogCS8qIE5vdCBmb3VuZCwgbXVzdCBhbGxvY2F0ZSBhIG5ldyB4cnVwdCBkZXNjcmlwdG9yICovCiAKLQlncGVfeHJ1cHQgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKHNpemVvZiAoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8pKTsKKwlncGVfeHJ1cHQgPSBBQ1BJX01FTV9DQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvKSk7CiAJaWYgKCFncGVfeHJ1cHQpIHsKLQkJcmV0dXJuX1BUUiAoTlVMTCk7CisJCXJldHVybl9QVFIoTlVMTCk7CiAJfQogCi0JZ3BlX3hydXB0LT5pbnRlcnJ1cHRfbGV2ZWwgPSBpbnRlcnJ1cHRfbGV2ZWw7CisJZ3BlX3hydXB0LT5pbnRlcnJ1cHRfbnVtYmVyID0gaW50ZXJydXB0X251bWJlcjsKIAogCS8qIEluc3RhbGwgbmV3IGludGVycnVwdCBkZXNjcmlwdG9yIHdpdGggc3BpbiBsb2NrICovCiAKLQlhY3BpX29zX2FjcXVpcmVfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIEFDUElfTk9UX0lTUik7CisJZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7CiAJaWYgKGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQpIHsKIAkJbmV4dF9ncGVfeHJ1cHQgPSBhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkOwogCQl3aGlsZSAobmV4dF9ncGVfeHJ1cHQtPm5leHQpIHsKQEAgLTUzNiwyOSArNTE0LDI4IEBACiAKIAkJbmV4dF9ncGVfeHJ1cHQtPm5leHQgPSBncGVfeHJ1cHQ7CiAJCWdwZV94cnVwdC0+cHJldmlvdXMgPSBuZXh0X2dwZV94cnVwdDsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZCA9IGdwZV94cnVwdDsKIAl9Ci0JYWNwaV9vc19yZWxlYXNlX2xvY2sgKGFjcGlfZ2JsX2dwZV9sb2NrLCBBQ1BJX05PVF9JU1IpOworCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CiAKIAkvKiBJbnN0YWxsIG5ldyBpbnRlcnJ1cHQgaGFuZGxlciBpZiBub3QgU0NJX0lOVCAqLwogCi0JaWYgKGludGVycnVwdF9sZXZlbCAhPSBhY3BpX2dibF9GQURULT5zY2lfaW50KSB7Ci0JCXN0YXR1cyA9IGFjcGlfb3NfaW5zdGFsbF9pbnRlcnJ1cHRfaGFuZGxlciAoaW50ZXJydXB0X2xldmVsLAotCQkJCSBhY3BpX2V2X2dwZV94cnVwdF9oYW5kbGVyLCBncGVfeHJ1cHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiQ291bGQgbm90IGluc3RhbGwgR1BFIGludGVycnVwdCBoYW5kbGVyIGF0IGxldmVsIDB4JVhcbiIsCi0JCQkJaW50ZXJydXB0X2xldmVsKSk7Ci0JCQlyZXR1cm5fUFRSIChOVUxMKTsKKwlpZiAoaW50ZXJydXB0X251bWJlciAhPSBhY3BpX2dibF9GQURULT5zY2lfaW50KSB7CisJCXN0YXR1cyA9IGFjcGlfb3NfaW5zdGFsbF9pbnRlcnJ1cHRfaGFuZGxlcihpbnRlcnJ1cHRfbnVtYmVyLAorCQkJCQkJCSAgIGFjcGlfZXZfZ3BlX3hydXB0X2hhbmRsZXIsCisJCQkJCQkJICAgZ3BlX3hydXB0KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJDb3VsZCBub3QgaW5zdGFsbCBHUEUgaW50ZXJydXB0IGhhbmRsZXIgYXQgbGV2ZWwgMHglWFxuIiwKKwkJCQkJICBpbnRlcnJ1cHRfbnVtYmVyKSk7CisJCQlyZXR1cm5fUFRSKE5VTEwpOwogCQl9CiAJfQogCi0JcmV0dXJuX1BUUiAoZ3BlX3hydXB0KTsKKwlyZXR1cm5fUFRSKGdwZV94cnVwdCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9kZWxldGVfZ3BlX3hydXB0CkBAIC01NzMsMzMgKzU1MCwzMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2RlbGV0ZV9ncGVfeHJ1cHQgKAotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdCkKK2FjcGlfZXZfZGVsZXRlX2dwZV94cnVwdChzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgZmxhZ3M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9kZWxldGVfZ3BlX3hydXB0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9kZWxldGVfZ3BlX3hydXB0Iik7CiAKIAkvKiBXZSBuZXZlciB3YW50IHRvIHJlbW92ZSB0aGUgU0NJIGludGVycnVwdCBoYW5kbGVyICovCiAKLQlpZiAoZ3BlX3hydXB0LT5pbnRlcnJ1cHRfbGV2ZWwgPT0gYWNwaV9nYmxfRkFEVC0+c2NpX2ludCkgeworCWlmIChncGVfeHJ1cHQtPmludGVycnVwdF9udW1iZXIgPT0gYWNwaV9nYmxfRkFEVC0+c2NpX2ludCkgewogCQlncGVfeHJ1cHQtPmdwZV9ibG9ja19saXN0X2hlYWQgPSBOVUxMOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBEaXNhYmxlIHRoaXMgaW50ZXJydXB0ICovCiAKLQlzdGF0dXMgPSBhY3BpX29zX3JlbW92ZV9pbnRlcnJ1cHRfaGFuZGxlciAoZ3BlX3hydXB0LT5pbnRlcnJ1cHRfbGV2ZWwsCi0JCQkgICBhY3BpX2V2X2dwZV94cnVwdF9oYW5kbGVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX29zX3JlbW92ZV9pbnRlcnJ1cHRfaGFuZGxlcihncGVfeHJ1cHQtPmludGVycnVwdF9udW1iZXIsCisJCQkJCQkgIGFjcGlfZXZfZ3BlX3hydXB0X2hhbmRsZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBVbmxpbmsgdGhlIGludGVycnVwdCBibG9jayB3aXRoIGxvY2sgKi8KIAotCWFjcGlfb3NfYWNxdWlyZV9sb2NrIChhY3BpX2dibF9ncGVfbG9jaywgQUNQSV9OT1RfSVNSKTsKKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKIAlpZiAoZ3BlX3hydXB0LT5wcmV2aW91cykgewogCQlncGVfeHJ1cHQtPnByZXZpb3VzLT5uZXh0ID0gZ3BlX3hydXB0LT5uZXh0OwogCX0KQEAgLTYwNywyMSArNTgyLDIwIEBACiAJaWYgKGdwZV94cnVwdC0+bmV4dCkgewogCQlncGVfeHJ1cHQtPm5leHQtPnByZXZpb3VzID0gZ3BlX3hydXB0LT5wcmV2aW91czsKIAl9Ci0JYWNwaV9vc19yZWxlYXNlX2xvY2sgKGFjcGlfZ2JsX2dwZV9sb2NrLCBBQ1BJX05PVF9JU1IpOworCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CiAKIAkvKiBGcmVlIHRoZSBibG9jayAqLwogCi0JQUNQSV9NRU1fRlJFRSAoZ3BlX3hydXB0KTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlBQ1BJX01FTV9GUkVFKGdwZV94cnVwdCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luc3RhbGxfZ3BlX2Jsb2NrCiAgKgogICogUEFSQU1FVEVSUzogIGdwZV9ibG9jayAgICAgICAtIE5ldyBHUEUgYmxvY2sKLSAqICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWwgLSBMZXZlbCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBHUEUgYmxvY2sKKyAqICAgICAgICAgICAgICBpbnRlcnJ1cHRfbnVtYmVyIC0gWHJ1cHQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR1BFIGJsb2NrCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTYzMCwyNCArNjA0LDIyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5zdGFsbF9ncGVfYmxvY2sgKAotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jaywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbCkKK2FjcGlfZXZfaW5zdGFsbF9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywKKwkJCSAgdTMyIGludGVycnVwdF9udW1iZXIpCiB7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqbmV4dF9ncGVfYmxvY2s7Ci0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2Jsb2NrOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpuZXh0X2dwZV9ibG9jazsKKwlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2Jsb2NrOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgZmxhZ3M7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pbnN0YWxsX2dwZV9ibG9jayIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2luc3RhbGxfZ3BlX2Jsb2NrIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JZ3BlX3hydXB0X2Jsb2NrID0gYWNwaV9ldl9nZXRfZ3BlX3hydXB0X2Jsb2NrIChpbnRlcnJ1cHRfbGV2ZWwpOworCWdwZV94cnVwdF9ibG9jayA9IGFjcGlfZXZfZ2V0X2dwZV94cnVwdF9ibG9jayhpbnRlcnJ1cHRfbnVtYmVyKTsKIAlpZiAoIWdwZV94cnVwdF9ibG9jaykgewogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtNjU1LDcgKzYyNyw3IEBACiAKIAkvKiBJbnN0YWxsIHRoZSBuZXcgYmxvY2sgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCB3aXRoIGxvY2sgKi8KIAotCWFjcGlfb3NfYWNxdWlyZV9sb2NrIChhY3BpX2dibF9ncGVfbG9jaywgQUNQSV9OT1RfSVNSKTsKKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKIAlpZiAoZ3BlX3hydXB0X2Jsb2NrLT5ncGVfYmxvY2tfbGlzdF9oZWFkKSB7CiAJCW5leHRfZ3BlX2Jsb2NrID0gZ3BlX3hydXB0X2Jsb2NrLT5ncGVfYmxvY2tfbGlzdF9oZWFkOwogCQl3aGlsZSAobmV4dF9ncGVfYmxvY2stPm5leHQpIHsKQEAgLTY2NCwyMCArNjM2LDE4IEBACiAKIAkJbmV4dF9ncGVfYmxvY2stPm5leHQgPSBncGVfYmxvY2s7CiAJCWdwZV9ibG9jay0+cHJldmlvdXMgPSBuZXh0X2dwZV9ibG9jazsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJZ3BlX3hydXB0X2Jsb2NrLT5ncGVfYmxvY2tfbGlzdF9oZWFkID0gZ3BlX2Jsb2NrOwogCX0KIAogCWdwZV9ibG9jay0+eHJ1cHRfYmxvY2sgPSBncGVfeHJ1cHRfYmxvY2s7Ci0JYWNwaV9vc19yZWxlYXNlX2xvY2sgKGFjcGlfZ2JsX2dwZV9sb2NrLCBBQ1BJX05PVF9JU1IpOworCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CiAKLXVubG9ja19hbmRfZXhpdDoKLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZGVsZXRlX2dwZV9ibG9jawpAQCAtNjkwLDYyICs2NjAsNTcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spCithY3BpX3N0YXR1cyBhY3BpX2V2X2RlbGV0ZV9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGZsYWdzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5zdGFsbF9ncGVfYmxvY2siKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9pbnN0YWxsX2dwZV9ibG9jayIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIERpc2FibGUgYWxsIEdQRXMgaW4gdGhpcyBibG9jayAqLwogCi0Jc3RhdHVzID0gYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jayAoZ3BlX2Jsb2NrLT54cnVwdF9ibG9jaywgZ3BlX2Jsb2NrKTsKKwlzdGF0dXMgPSBhY3BpX2h3X2Rpc2FibGVfZ3BlX2Jsb2NrKGdwZV9ibG9jay0+eHJ1cHRfYmxvY2ssIGdwZV9ibG9jayk7CiAKIAlpZiAoIWdwZV9ibG9jay0+cHJldmlvdXMgJiYgIWdwZV9ibG9jay0+bmV4dCkgewogCQkvKiBUaGlzIGlzIHRoZSBsYXN0IGdwZV9ibG9jayBvbiB0aGlzIGludGVycnVwdCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXZfZGVsZXRlX2dwZV94cnVwdCAoZ3BlX2Jsb2NrLT54cnVwdF9ibG9jayk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV9ldl9kZWxldGVfZ3BlX3hydXB0KGdwZV9ibG9jay0+eHJ1cHRfYmxvY2spOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIFJlbW92ZSB0aGUgYmxvY2sgb24gdGhpcyBpbnRlcnJ1cHQgd2l0aCBsb2NrICovCiAKLQkJYWNwaV9vc19hY3F1aXJlX2xvY2sgKGFjcGlfZ2JsX2dwZV9sb2NrLCBBQ1BJX05PVF9JU1IpOworCQlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKIAkJaWYgKGdwZV9ibG9jay0+cHJldmlvdXMpIHsKIAkJCWdwZV9ibG9jay0+cHJldmlvdXMtPm5leHQgPSBncGVfYmxvY2stPm5leHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlncGVfYmxvY2stPnhydXB0X2Jsb2NrLT5ncGVfYmxvY2tfbGlzdF9oZWFkID0gZ3BlX2Jsb2NrLT5uZXh0OworCQl9IGVsc2UgeworCQkJZ3BlX2Jsb2NrLT54cnVwdF9ibG9jay0+Z3BlX2Jsb2NrX2xpc3RfaGVhZCA9CisJCQkgICAgZ3BlX2Jsb2NrLT5uZXh0OwogCQl9CiAKIAkJaWYgKGdwZV9ibG9jay0+bmV4dCkgewogCQkJZ3BlX2Jsb2NrLT5uZXh0LT5wcmV2aW91cyA9IGdwZV9ibG9jay0+cHJldmlvdXM7CiAJCX0KLQkJYWNwaV9vc19yZWxlYXNlX2xvY2sgKGFjcGlfZ2JsX2dwZV9sb2NrLCBBQ1BJX05PVF9JU1IpOworCQlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOwogCX0KIAogCS8qIEZyZWUgdGhlIGdwZV9ibG9jayAqLwogCi0JQUNQSV9NRU1fRlJFRSAoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvKTsKLQlBQ1BJX01FTV9GUkVFIChncGVfYmxvY2stPmV2ZW50X2luZm8pOwotCUFDUElfTUVNX0ZSRUUgKGdwZV9ibG9jayk7CisJQUNQSV9NRU1fRlJFRShncGVfYmxvY2stPnJlZ2lzdGVyX2luZm8pOworCUFDUElfTUVNX0ZSRUUoZ3BlX2Jsb2NrLT5ldmVudF9pbmZvKTsKKwlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jayk7CiAKLXVubG9ja19hbmRfZXhpdDoKLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcwpAQCAtNzU5LDQzICs3MjQsNDEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9jcmVhdGVfZ3BlX2luZm9fYmxvY2tzICgKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spCithY3BpX2V2X2NyZWF0ZV9ncGVfaW5mb19ibG9ja3Moc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaykKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAgICpncGVfcmVnaXN0ZXJfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8gPSBOVUxMOwotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKnRoaXNfZXZlbnQ7Ci0Jc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gICAqdGhpc19yZWdpc3RlcjsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBqOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbyA9IE5VTEw7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqdGhpc19ldmVudDsKKwlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqdGhpc19yZWdpc3RlcjsKKwlhY3BpX25hdGl2ZV91aW50IGk7CisJYWNwaV9uYXRpdmVfdWludCBqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2NyZWF0ZV9ncGVfaW5mb19ibG9ja3MiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2NyZWF0ZV9ncGVfaW5mb19ibG9ja3MiKTsKIAogCS8qIEFsbG9jYXRlIHRoZSBHUEUgcmVnaXN0ZXIgaW5mb3JtYXRpb24gYmxvY2sgKi8KIAotCWdwZV9yZWdpc3Rlcl9pbmZvID0gQUNQSV9NRU1fQ0FMTE9DQVRFICgKLQkJCSAgKGFjcGlfc2l6ZSkgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqCi0JCQkgIHNpemVvZiAoc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8pKTsKKwlncGVfcmVnaXN0ZXJfaW5mbyA9IEFDUElfTUVNX0NBTExPQ0FURSgoYWNwaV9zaXplKSBncGVfYmxvY2stPgorCQkJCQkgICAgICAgcmVnaXN0ZXJfY291bnQgKgorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdAorCQkJCQkJICAgICAgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbykpOwogCWlmICghZ3BlX3JlZ2lzdGVyX2luZm8pIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiQ291bGQgbm90IGFsbG9jYXRlIHRoZSBncGVfcmVnaXN0ZXJfaW5mbyB0YWJsZVxuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQ291bGQgbm90IGFsbG9jYXRlIHRoZSBncGVfcmVnaXN0ZXJfaW5mbyB0YWJsZVxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKgogCSAqIEFsbG9jYXRlIHRoZSBHUEUgZXZlbnRfaW5mbyBibG9jay4gVGhlcmUgYXJlIGVpZ2h0IGRpc3RpbmN0IEdQRXMKIAkgKiBwZXIgcmVnaXN0ZXIuICBJbml0aWFsaXphdGlvbiB0byB6ZXJvcyBpcyBzdWZmaWNpZW50LgogCSAqLwotCWdwZV9ldmVudF9pbmZvID0gQUNQSV9NRU1fQ0FMTE9DQVRFICgKLQkJCSAgICgoYWNwaV9zaXplKSBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICoKLQkJCSAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAqCi0JCQkgICBzaXplb2YgKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvKSk7CisJZ3BlX2V2ZW50X2luZm8gPSBBQ1BJX01FTV9DQUxMT0NBVEUoKChhY3BpX3NpemUpIGdwZV9ibG9jay0+CisJCQkJCSAgICAgcmVnaXN0ZXJfY291bnQgKgorCQkJCQkgICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAqCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8pKTsKIAlpZiAoIWdwZV9ldmVudF9pbmZvKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIkNvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgZ3BlX2V2ZW50X2luZm8gdGFibGVcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJDb3VsZCBub3QgYWxsb2NhdGUgdGhlIGdwZV9ldmVudF9pbmZvIHRhYmxlXG4iKSk7CiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KQEAgLTgwMyw3ICs3NjYsNyBAQAogCS8qIFNhdmUgdGhlIG5ldyBJbmZvIGFycmF5cyBpbiB0aGUgR1BFIGJsb2NrICovCiAKIAlncGVfYmxvY2stPnJlZ2lzdGVyX2luZm8gPSBncGVfcmVnaXN0ZXJfaW5mbzsKLQlncGVfYmxvY2stPmV2ZW50X2luZm8gID0gZ3BlX2V2ZW50X2luZm87CisJZ3BlX2Jsb2NrLT5ldmVudF9pbmZvID0gZ3BlX2V2ZW50X2luZm87CiAKIAkvKgogCSAqIEluaXRpYWxpemUgdGhlIEdQRSBSZWdpc3RlciBhbmQgRXZlbnQgc3RydWN0dXJlcy4gIEEgZ29hbCBvZiB0aGVzZQpAQCAtODEyLDI5ICs3NzUsMzQgQEAKIAkgKiBhbmQgdGhlIGVuYWJsZSByZWdpc3RlcnMgb2NjdXB5IHRoZSBzZWNvbmQgaGFsZi4KIAkgKi8KIAl0aGlzX3JlZ2lzdGVyID0gZ3BlX3JlZ2lzdGVyX2luZm87Ci0JdGhpc19ldmVudCAgID0gZ3BlX2V2ZW50X2luZm87CisJdGhpc19ldmVudCA9IGdwZV9ldmVudF9pbmZvOwogCiAJZm9yIChpID0gMDsgaSA8IGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQ7IGkrKykgewogCQkvKiBJbml0IHRoZSByZWdpc3Rlcl9pbmZvIGZvciB0aGlzIEdQRSByZWdpc3RlciAoOCBHUEVzKSAqLwogCi0JCXRoaXNfcmVnaXN0ZXItPmJhc2VfZ3BlX251bWJlciA9ICh1OCkgKGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKwotCQkJCSAgIChpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpKTsKKwkJdGhpc19yZWdpc3Rlci0+YmFzZV9ncGVfbnVtYmVyID0KKwkJICAgICh1OCkgKGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKworCQkJICAoaSAqIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSk7CiAKLQkJQUNQSV9TVE9SRV9BRERSRVNTICh0aGlzX3JlZ2lzdGVyLT5zdGF0dXNfYWRkcmVzcy5hZGRyZXNzLAotCQkJCSAoZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLmFkZHJlc3MKLQkJCQkgKyBpKSk7CisJCUFDUElfU1RPUkVfQUREUkVTUyh0aGlzX3JlZ2lzdGVyLT5zdGF0dXNfYWRkcmVzcy5hZGRyZXNzLAorCQkJCSAgIChncGVfYmxvY2stPmJsb2NrX2FkZHJlc3MuYWRkcmVzcyArIGkpKTsKIAotCQlBQ1BJX1NUT1JFX0FERFJFU1MgKHRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLmFkZHJlc3MsCi0JCQkJIChncGVfYmxvY2stPmJsb2NrX2FkZHJlc3MuYWRkcmVzcwotCQkJCSArIGkKLQkJCQkgKyBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50KSk7CisJCUFDUElfU1RPUkVfQUREUkVTUyh0aGlzX3JlZ2lzdGVyLT5lbmFibGVfYWRkcmVzcy5hZGRyZXNzLAorCQkJCSAgIChncGVfYmxvY2stPmJsb2NrX2FkZHJlc3MuYWRkcmVzcworCQkJCSAgICArIGkgKyBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50KSk7CiAKLQkJdGhpc19yZWdpc3Rlci0+c3RhdHVzX2FkZHJlc3MuYWRkcmVzc19zcGFjZV9pZCA9IGdwZV9ibG9jay0+YmxvY2tfYWRkcmVzcy5hZGRyZXNzX3NwYWNlX2lkOwotCQl0aGlzX3JlZ2lzdGVyLT5lbmFibGVfYWRkcmVzcy5hZGRyZXNzX3NwYWNlX2lkID0gZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLmFkZHJlc3Nfc3BhY2VfaWQ7Ci0JCXRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLnJlZ2lzdGVyX2JpdF93aWR0aCA9IEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOwotCQl0aGlzX3JlZ2lzdGVyLT5lbmFibGVfYWRkcmVzcy5yZWdpc3Rlcl9iaXRfd2lkdGggPSBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsKLQkJdGhpc19yZWdpc3Rlci0+c3RhdHVzX2FkZHJlc3MucmVnaXN0ZXJfYml0X29mZnNldCA9IEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOwotCQl0aGlzX3JlZ2lzdGVyLT5lbmFibGVfYWRkcmVzcy5yZWdpc3Rlcl9iaXRfb2Zmc2V0ID0gQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7CisJCXRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLmFkZHJlc3Nfc3BhY2VfaWQgPQorCQkgICAgZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLmFkZHJlc3Nfc3BhY2VfaWQ7CisJCXRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLmFkZHJlc3Nfc3BhY2VfaWQgPQorCQkgICAgZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLmFkZHJlc3Nfc3BhY2VfaWQ7CisJCXRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLnJlZ2lzdGVyX2JpdF93aWR0aCA9CisJCSAgICBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsKKwkJdGhpc19yZWdpc3Rlci0+ZW5hYmxlX2FkZHJlc3MucmVnaXN0ZXJfYml0X3dpZHRoID0KKwkJICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOworCQl0aGlzX3JlZ2lzdGVyLT5zdGF0dXNfYWRkcmVzcy5yZWdpc3Rlcl9iaXRfb2Zmc2V0ID0KKwkJICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOworCQl0aGlzX3JlZ2lzdGVyLT5lbmFibGVfYWRkcmVzcy5yZWdpc3Rlcl9iaXRfb2Zmc2V0ID0KKwkJICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOwogCiAJCS8qIEluaXQgdGhlIGV2ZW50X2luZm8gZm9yIGVhY2ggR1BFIHdpdGhpbiB0aGlzIHJlZ2lzdGVyICovCiAKQEAgLTg0OSwzNiArODE3LDM2IEBACiAJCSAqIGFyZSBjbGVhcmVkIGJ5IHdyaXRpbmcgYSAnMScsIHdoaWxlIGVuYWJsZSByZWdpc3RlcnMgYXJlIGNsZWFyZWQKIAkJICogYnkgd3JpdGluZyBhICcwJy4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlIChBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCwgMHgwMCwKLQkJCQkgJnRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZShBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCwgMHgwMCwKKwkJCQkJCSAmdGhpc19yZWdpc3Rlci0+CisJCQkJCQkgZW5hYmxlX2FkZHJlc3MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gZXJyb3JfZXhpdDsKIAkJfQogCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlIChBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCwgMHhGRiwKLQkJCQkgJnRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZShBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCwgMHhGRiwKKwkJCQkJCSAmdGhpc19yZWdpc3Rlci0+CisJCQkJCQkgc3RhdHVzX2FkZHJlc3MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gZXJyb3JfZXhpdDsKIAkJfQogCiAJCXRoaXNfcmVnaXN0ZXIrKzsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCi0KLWVycm9yX2V4aXQ6CisgICAgICBlcnJvcl9leGl0OgogCWlmIChncGVfcmVnaXN0ZXJfaW5mbykgewotCQlBQ1BJX01FTV9GUkVFIChncGVfcmVnaXN0ZXJfaW5mbyk7CisJCUFDUElfTUVNX0ZSRUUoZ3BlX3JlZ2lzdGVyX2luZm8pOwogCX0KIAlpZiAoZ3BlX2V2ZW50X2luZm8pIHsKLQkJQUNQSV9NRU1fRlJFRSAoZ3BlX2V2ZW50X2luZm8pOworCQlBQ1BJX01FTV9GUkVFKGdwZV9ldmVudF9pbmZvKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrCkBAIC04ODcsNyArODU1LDcgQEAKICAqICAgICAgICAgICAgICBncGVfYmxvY2tfYWRkcmVzcyAgIC0gQWRkcmVzcyBhbmQgc3BhY2VfaUQKICAqICAgICAgICAgICAgICByZWdpc3Rlcl9jb3VudCAgICAgIC0gTnVtYmVyIG9mIEdQRSByZWdpc3RlciBwYWlycyBpbiB0aGUgYmxvY2sKICAqICAgICAgICAgICAgICBncGVfYmxvY2tfYmFzZV9udW1iZXIgLSBTdGFydGluZyBHUEUgbnVtYmVyIGZvciB0aGUgYmxvY2sKLSAqICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWwgICAgIC0gSC9XIGludGVycnVwdCBmb3IgdGhlIGJsb2NrCisgKiAgICAgICAgICAgICAgaW50ZXJydXB0X251bWJlciAgICAtIEgvVyBpbnRlcnJ1cHQgZm9yIHRoZSBibG9jawogICogICAgICAgICAgICAgIHJldHVybl9ncGVfYmxvY2sgICAgLSBXaGVyZSB0aGUgbmV3IGJsb2NrIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCkBAIC04OTcsNjggKzg2NSw2NiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZ3BlX2RldmljZSwKLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgICpncGVfYmxvY2tfYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2NvdW50LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX2Jsb2NrX2Jhc2VfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0X2xldmVsLAotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKipyZXR1cm5fZ3BlX2Jsb2NrKQorYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpncGVfZGV2aWNlLAorCQkJIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ3BlX2Jsb2NrX2FkZHJlc3MsCisJCQkgdTMyIHJlZ2lzdGVyX2NvdW50LAorCQkJIHU4IGdwZV9ibG9ja19iYXNlX251bWJlciwKKwkJCSB1MzIgaW50ZXJydXB0X251bWJlciwKKwkJCSBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqKnJldHVybl9ncGVfYmxvY2spCiB7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrOwotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGo7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWtlX2dwZV9jb3VudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9lbmFibGVkX2NvdW50OwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2dwZV93YWxrX2luZm8gICAgICAgZ3BlX2luZm87CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CisJYWNwaV9uYXRpdmVfdWludCBpOworCWFjcGlfbmF0aXZlX3VpbnQgajsKKwl1MzIgd2FrZV9ncGVfY291bnQ7CisJdTMyIGdwZV9lbmFibGVkX2NvdW50OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9ncGVfd2Fsa19pbmZvIGdwZV9pbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfY3JlYXRlX2dwZV9ibG9jayIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfY3JlYXRlX2dwZV9ibG9jayIpOwogCiAJaWYgKCFyZWdpc3Rlcl9jb3VudCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBBbGxvY2F0ZSBhIG5ldyBHUEUgYmxvY2sgKi8KIAotCWdwZV9ibG9jayA9IEFDUElfTUVNX0NBTExPQ0FURSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbykpOworCWdwZV9ibG9jayA9IEFDUElfTUVNX0NBTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8pKTsKIAlpZiAoIWdwZV9ibG9jaykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCS8qIEluaXRpYWxpemUgdGhlIG5ldyBHUEUgYmxvY2sgKi8KIAogCWdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgPSByZWdpc3Rlcl9jb3VudDsKIAlncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyID0gZ3BlX2Jsb2NrX2Jhc2VfbnVtYmVyOwotCWdwZV9ibG9jay0+bm9kZSAgICAgICAgICAgPSBncGVfZGV2aWNlOworCWdwZV9ibG9jay0+bm9kZSA9IGdwZV9kZXZpY2U7CiAKLQlBQ1BJX01FTUNQWSAoJmdwZV9ibG9jay0+YmxvY2tfYWRkcmVzcywgZ3BlX2Jsb2NrX2FkZHJlc3MsCi0JCXNpemVvZiAoc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzKSk7CisJQUNQSV9NRU1DUFkoJmdwZV9ibG9jay0+YmxvY2tfYWRkcmVzcywgZ3BlX2Jsb2NrX2FkZHJlc3MsCisJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzKSk7CiAKIAkvKiBDcmVhdGUgdGhlIHJlZ2lzdGVyX2luZm8gYW5kIGV2ZW50X2luZm8gc3ViLXN0cnVjdHVyZXMgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcyAoZ3BlX2Jsb2NrKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfTUVNX0ZSRUUgKGdwZV9ibG9jayk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfaW5mb19ibG9ja3MoZ3BlX2Jsb2NrKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9NRU1fRlJFRShncGVfYmxvY2spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBJbnN0YWxsIHRoZSBuZXcgYmxvY2sgaW4gdGhlIGdsb2JhbCBsaXN0KHMpICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfZ3BlX2Jsb2NrIChncGVfYmxvY2ssIGludGVycnVwdF9sZXZlbCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX01FTV9GUkVFIChncGVfYmxvY2spOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX2dwZV9ibG9jayhncGVfYmxvY2ssIGludGVycnVwdF9udW1iZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jayk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEZpbmQgYWxsIEdQRSBtZXRob2RzIChfTHh4LCBfRXh4KSBmb3IgdGhpcyBibG9jayAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZSAoQUNQSV9UWVBFX01FVEhPRCwgZ3BlX2RldmljZSwKLQkJCSAgQUNQSV9VSU5UMzJfTUFYLCBBQ1BJX05TX1dBTEtfTk9fVU5MT0NLLCBhY3BpX2V2X3NhdmVfbWV0aG9kX2luZm8sCi0JCQkgIGdwZV9ibG9jaywgTlVMTCk7CisJc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfTUVUSE9ELCBncGVfZGV2aWNlLAorCQkJCQlBQ1BJX1VJTlQzMl9NQVgsIEFDUElfTlNfV0FMS19OT19VTkxPQ0ssCisJCQkJCWFjcGlfZXZfc2F2ZV9tZXRob2RfaW5mbywgZ3BlX2Jsb2NrLAorCQkJCQlOVUxMKTsKIAogCS8qCiAJICogUnVudGltZSBvcHRpb246IFNob3VsZCBXYWtlIEdQRXMgYmUgZW5hYmxlZCBhdCBydW50aW1lPyAgVGhlIGRlZmF1bHQKQEAgLTk3NCw5ICs5NDAsMTEgQEAKIAkJZ3BlX2luZm8uZ3BlX2Jsb2NrID0gZ3BlX2Jsb2NrOwogCQlncGVfaW5mby5ncGVfZGV2aWNlID0gZ3BlX2RldmljZTsKIAotCQlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlIChBQ1BJX1RZUEVfREVWSUNFLCBBQ1BJX1JPT1RfT0JKRUNULAotCQkJCSAgQUNQSV9VSU5UMzJfTUFYLCBBQ1BJX05TX1dBTEtfVU5MT0NLLCBhY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlLAotCQkJCSAgJmdwZV9pbmZvLCBOVUxMKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgQUNQSV9ST09UX09CSkVDVCwKKwkJCQkJICAgQUNQSV9VSU5UMzJfTUFYLCBBQ1BJX05TX1dBTEtfVU5MT0NLLAorCQkJCQkgICBhY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlLCAmZ3BlX2luZm8sCisJCQkJCSAgIE5VTEwpOwogCX0KIAogCS8qCkBAIC05OTEsMTAgKzk1OSwxNCBAQAogCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CiAJCQkvKiBHZXQgdGhlIGluZm8gYmxvY2sgZm9yIHRoaXMgcGFydGljdWxhciBHUEUgKi8KIAotCQkJZ3BlX2V2ZW50X2luZm8gPSAmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvWyhpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal07CisJCQlncGVfZXZlbnRfaW5mbyA9CisJCQkgICAgJmdwZV9ibG9jay0+CisJCQkgICAgZXZlbnRfaW5mb1soaSAqIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSArIGpdOwogCi0JCQlpZiAoKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PSBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpICYmCi0JCQkJIChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUpKSB7CisJCQlpZiAoKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PQorCQkJICAgICBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpCisJCQkgICAgJiYgKGdwZV9ldmVudF9pbmZvLT4KKwkJCQlmbGFncyAmIEFDUElfR1BFX1RZUEVfUlVOVElNRSkpIHsKIAkJCQlncGVfZW5hYmxlZF9jb3VudCsrOwogCQkJfQogCkBAIC0xMDA2LDIyICs5NzgsMjIgQEAKIAogCS8qIER1bXAgaW5mbyBhYm91dCB0aGlzIEdQRSBibG9jayAqLwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5JVCwKLQkJIkdQRSAlMDJYIHRvICUwMlggWyU0LjRzXSAldSByZWdzIG9uIGludCAweCVYXG4iLAotCQkodTMyKSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyLAotCQkodTMyKSAoZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArCi0JCQkJKChncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpIC0xKSksCi0JCWdwZV9kZXZpY2UtPm5hbWUuYXNjaWksCi0JCWdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQsCi0JCWludGVycnVwdF9sZXZlbCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5JVCwKKwkJCSAgIkdQRSAlMDJYIHRvICUwMlggWyU0LjRzXSAldSByZWdzIG9uIGludCAweCVYXG4iLAorCQkJICAodTMyKSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyLAorCQkJICAodTMyKSAoZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArCisJCQkJICgoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqCisJCQkJICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpIC0gMSkpLAorCQkJICBncGVfZGV2aWNlLT5uYW1lLmFzY2lpLCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50LAorCQkJICBpbnRlcnJ1cHRfbnVtYmVyKSk7CiAKIAkvKiBFbmFibGUgYWxsIHZhbGlkIEdQRXMgZm91bmQgYWJvdmUgKi8KIAotCXN0YXR1cyA9IGFjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrIChOVUxMLCBncGVfYmxvY2spOworCXN0YXR1cyA9IGFjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrKE5VTEwsIGdwZV9ibG9jayk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULAotCQkJIkZvdW5kICV1IFdha2UsIEVuYWJsZWQgJXUgUnVudGltZSBHUEVzIGluIHRoaXMgYmxvY2tcbiIsCi0JCQl3YWtlX2dwZV9jb3VudCwgZ3BlX2VuYWJsZWRfY291bnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCisJCQkgICJGb3VuZCAldSBXYWtlLCBFbmFibGVkICV1IFJ1bnRpbWUgR1BFcyBpbiB0aGlzIGJsb2NrXG4iLAorCQkJICB3YWtlX2dwZV9jb3VudCwgZ3BlX2VuYWJsZWRfY291bnQpKTsKIAogCS8qIFJldHVybiB0aGUgbmV3IGJsb2NrICovCiAKQEAgLTEwMjksMTAgKzEwMDEsOSBAQAogCQkoKnJldHVybl9ncGVfYmxvY2spID0gZ3BlX2Jsb2NrOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9ncGVfaW5pdGlhbGl6ZQpAQCAtMTA0NSwyMiArMTAxNiwxOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2dwZV9pbml0aWFsaXplICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9ldl9ncGVfaW5pdGlhbGl6ZSh2b2lkKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQwID0gMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2NvdW50MSA9IDA7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfbnVtYmVyX21heCA9IDA7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdTMyIHJlZ2lzdGVyX2NvdW50MCA9IDA7CisJdTMyIHJlZ2lzdGVyX2NvdW50MSA9IDA7CisJdTMyIGdwZV9udW1iZXJfbWF4ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9ncGVfaW5pdGlhbGl6ZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2dwZV9pbml0aWFsaXplIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTEwODgsMjkgKzEwNTUsMjkgQEAKIAkgKiBJZiBFSVRIRVIgdGhlIHJlZ2lzdGVyIGxlbmd0aCBPUiB0aGUgYmxvY2sgYWRkcmVzcyBhcmUgemVybywgdGhlbiB0aGF0CiAJICogcGFydGljdWxhciBibG9jayBpcyBub3Qgc3VwcG9ydGVkLgogCSAqLwotCWlmIChhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4gJiYKLQkJYWNwaV9nYmxfRkFEVC0+eGdwZTBfYmxrLmFkZHJlc3MpIHsKKwlpZiAoYWNwaV9nYmxfRkFEVC0+Z3BlMF9ibGtfbGVuICYmIGFjcGlfZ2JsX0ZBRFQtPnhncGUwX2Jsay5hZGRyZXNzKSB7CiAJCS8qIEdQRSBibG9jayAwIGV4aXN0cyAoaGFzIGJvdGggbGVuZ3RoIGFuZCBhZGRyZXNzID4gMCkgKi8KIAogCQlyZWdpc3Rlcl9jb3VudDAgPSAodTE2KSAoYWNwaV9nYmxfRkFEVC0+Z3BlMF9ibGtfbGVuIC8gMik7CiAKLQkJZ3BlX251bWJlcl9tYXggPSAocmVnaXN0ZXJfY291bnQwICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpIC0gMTsKKwkJZ3BlX251bWJlcl9tYXggPQorCQkgICAgKHJlZ2lzdGVyX2NvdW50MCAqIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAtIDE7CiAKIAkJLyogSW5zdGFsbCBHUEUgQmxvY2sgMCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayAoYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlLAotCQkJCSAmYWNwaV9nYmxfRkFEVC0+eGdwZTBfYmxrLCByZWdpc3Rlcl9jb3VudDAsIDAsCi0JCQkJIGFjcGlfZ2JsX0ZBRFQtPnNjaV9pbnQsICZhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMF0pOworCQlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2soYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlLAorCQkJCQkJICAmYWNwaV9nYmxfRkFEVC0+eGdwZTBfYmxrLAorCQkJCQkJICByZWdpc3Rlcl9jb3VudDAsIDAsCisJCQkJCQkgIGFjcGlfZ2JsX0ZBRFQtPnNjaV9pbnQsCisJCQkJCQkgICZhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMF0pOwogCi0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJIkNvdWxkIG5vdCBjcmVhdGUgR1BFIEJsb2NrIDAsICVzXG4iLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGNyZWF0ZSBHUEUgQmxvY2sgMCwgJXNcbiIsCisJCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJCX0KIAl9CiAKLQlpZiAoYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuICYmCi0JCWFjcGlfZ2JsX0ZBRFQtPnhncGUxX2Jsay5hZGRyZXNzKSB7CisJaWYgKGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmxrX2xlbiAmJiBhY3BpX2dibF9GQURULT54Z3BlMV9ibGsuYWRkcmVzcykgewogCQkvKiBHUEUgYmxvY2sgMSBleGlzdHMgKGhhcyBib3RoIGxlbmd0aCBhbmQgYWRkcmVzcyA+IDApICovCiAKIAkJcmVnaXN0ZXJfY291bnQxID0gKHUxNikgKGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmxrX2xlbiAvIDIpOwpAQCAtMTExOCwyOSArMTA4NSwyNiBAQAogCQkvKiBDaGVjayBmb3IgR1BFMC9HUEUxIG92ZXJsYXAgKGlmIGJvdGggYmFua3MgZXhpc3QpICovCiAKIAkJaWYgKChyZWdpc3Rlcl9jb3VudDApICYmCi0JCQkoZ3BlX251bWJlcl9tYXggPj0gYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiR1BFMCBibG9jayAoR1BFIDAgdG8gJWQpIG92ZXJsYXBzIHRoZSBHUEUxIGJsb2NrIChHUEUgJWQgdG8gJWQpIC0gSWdub3JpbmcgR1BFMVxuIiwKLQkJCQlncGVfbnVtYmVyX21heCwgYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlLAotCQkJCWFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmFzZSArCi0JCQkJKChyZWdpc3Rlcl9jb3VudDEgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLSAxKSkpOworCQkgICAgKGdwZV9udW1iZXJfbWF4ID49IGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmFzZSkpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiR1BFMCBibG9jayAoR1BFIDAgdG8gJWQpIG92ZXJsYXBzIHRoZSBHUEUxIGJsb2NrIChHUEUgJWQgdG8gJWQpIC0gSWdub3JpbmcgR1BFMVxuIiwgZ3BlX251bWJlcl9tYXgsIGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmFzZSwgYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlICsgKChyZWdpc3Rlcl9jb3VudDEgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLSAxKSkpOwogCiAJCQkvKiBJZ25vcmUgR1BFMSBibG9jayBieSBzZXR0aW5nIHRoZSByZWdpc3RlciBjb3VudCB0byB6ZXJvICovCiAKIAkJCXJlZ2lzdGVyX2NvdW50MSA9IDA7Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQkvKiBJbnN0YWxsIEdQRSBCbG9jayAxICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayAoYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlLAotCQkJCQkgJmFjcGlfZ2JsX0ZBRFQtPnhncGUxX2JsaywgcmVnaXN0ZXJfY291bnQxLAotCQkJCQkgYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlLAotCQkJCQkgYWNwaV9nYmxfRkFEVC0+c2NpX2ludCwgJmFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1sxXSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayhhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UsCisJCQkJCQkgICAgICZhY3BpX2dibF9GQURULT54Z3BlMV9ibGssCisJCQkJCQkgICAgIHJlZ2lzdGVyX2NvdW50MSwKKwkJCQkJCSAgICAgYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlLAorCQkJCQkJICAgICBhY3BpX2dibF9GQURULT5zY2lfaW50LAorCQkJCQkJICAgICAmYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzCisJCQkJCQkgICAgIFsxXSk7CiAKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCQkiQ291bGQgbm90IGNyZWF0ZSBHUEUgQmxvY2sgMSwgJXNcbiIsCi0JCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgY3JlYXRlIEdQRSBCbG9jayAxLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJCX0KIAogCQkJLyoKQEAgLTExNDgsNyArMTExMiw3IEBACiAJCQkgKiBzcGFjZS4gSG93ZXZlciwgR1BFMCBhbHdheXMgc3RhcnRzIGF0IEdQRSBudW1iZXIgemVyby4KIAkJCSAqLwogCQkJZ3BlX251bWJlcl9tYXggPSBhY3BpX2dibF9GQURULT5ncGUxX2Jhc2UgKwotCQkJCQkgICgocmVnaXN0ZXJfY291bnQxICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpIC0gMSk7CisJCQkgICAgKChyZWdpc3Rlcl9jb3VudDEgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLSAxKTsKIAkJfQogCX0KIApAQCAtMTE1Nyw4ICsxMTIxLDggQEAKIAlpZiAoKHJlZ2lzdGVyX2NvdW50MCArIHJlZ2lzdGVyX2NvdW50MSkgPT0gMCkgewogCQkvKiBHUEVzIGFyZSBub3QgcmVxdWlyZWQgYnkgQUNQSSwgdGhpcyBpcyBPSyAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsCi0JCQkJIlRoZXJlIGFyZSBubyBHUEUgYmxvY2tzIGRlZmluZWQgaW4gdGhlIEZBRFRcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULAorCQkJCSAgIlRoZXJlIGFyZSBubyBHUEUgYmxvY2tzIGRlZmluZWQgaW4gdGhlIEZBRFRcbiIpKTsKIAkJc3RhdHVzID0gQUVfT0s7CiAJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC0xMTY2LDE1ICsxMTMwLDEyIEBACiAJLyogQ2hlY2sgZm9yIE1heCBHUEUgbnVtYmVyIG91dC1vZi1yYW5nZSAqLwogCiAJaWYgKGdwZV9udW1iZXJfbWF4ID4gQUNQSV9HUEVfTUFYKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIk1heGltdW0gR1BFIG51bWJlciBmcm9tIEZBRFQgaXMgdG9vIGxhcmdlOiAweCVYXG4iLAotCQkJZ3BlX251bWJlcl9tYXgpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJNYXhpbXVtIEdQRSBudW1iZXIgZnJvbSBGQURUIGlzIHRvbyBsYXJnZTogMHglWFxuIiwgZ3BlX251bWJlcl9tYXgpKTsKIAkJc3RhdHVzID0gQUVfQkFEX1ZBTFVFOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCi1jbGVhbnVwOgotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisgICAgICBjbGVhbnVwOgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMKaW5kZXggNjU5ZTkwOS4uN2U1N2I4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCkBAIC00NywxMiArNDcsMTAgQEAKICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXZtaXNjIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiZXZtaXNjIikKIAogI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi1zdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAqYWNwaV9ub3RpZnlfdmFsdWVfbmFtZXNbXSA9Ci17CitzdGF0aWMgY29uc3QgY2hhciAqYWNwaV9ub3RpZnlfdmFsdWVfbmFtZXNbXSA9IHsKIAkiQnVzIENoZWNrIiwKIAkiRGV2aWNlIENoZWNrIiwKIAkiRGV2aWNlIFdha2UiLApAQCAtNjYsMTggKzY0LDExIEBACiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KIAotc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UKLWFjcGlfZXZfbm90aWZ5X2Rpc3BhdGNoICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK3N0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfbm90aWZ5X2Rpc3BhdGNoKHZvaWQgKmNvbnRleHQpOwogCi1zdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQotYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQodm9pZCAqY29udGV4dCk7CiAKLXN0YXRpYyB1MzIKLWFjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlciAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KK3N0YXRpYyB1MzIgYWNwaV9ldl9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQgKmNvbnRleHQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTkzLDkgKzg0LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11OAotYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQordTggYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0KHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKQogewogCXN3aXRjaCAobm9kZS0+dHlwZSkgewogCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKQEAgLTExMiw3ICsxMDEsNiBAQAogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3F1ZXVlX25vdGlmeV9yZXF1ZXN0CkBAIC0xMjgsMTggKzExNiwxNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfcXVldWVfbm90aWZ5X3JlcXVlc3QgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfdmFsdWUpCithY3BpX2V2X3F1ZXVlX25vdGlmeV9yZXF1ZXN0KHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogbm9kZSwKKwkJCSAgICAgdTMyIG5vdGlmeV92YWx1ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpoYW5kbGVyX29iaiA9IE5VTEw7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqbm90aWZ5X2luZm87Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iaiA9IE5VTEw7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpub3RpZnlfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZXZfcXVldWVfbm90aWZ5X3JlcXVlc3QiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZXZfcXVldWVfbm90aWZ5X3JlcXVlc3QiKTsKIAogCS8qCiAJICogRm9yIHZhbHVlIDMgKEVqZWN0aW9uIFJlcXVlc3QpLCBzb21lIGRldmljZSBtZXRob2QgbWF5IG5lZWQgdG8gYmUgcnVuLgpAQCAtMTQ4LDIyICsxMzMsMjIgQEAKIAkgKiBGb3IgdmFsdWUgMHg4MCAoU3RhdHVzIENoYW5nZSkgb24gdGhlIHBvd2VyIGJ1dHRvbiBvciBzbGVlcCBidXR0b24sCiAJICogICBpbml0aWF0ZSBzb2Z0LW9mZiBvciBzbGVlcCBvcGVyYXRpb24/CiAJICovCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJIkRpc3BhdGNoaW5nIE5vdGlmeSglWCkgb24gbm9kZSAlcFxuIiwgbm90aWZ5X3ZhbHVlLCBub2RlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiRGlzcGF0Y2hpbmcgTm90aWZ5KCVYKSBvbiBub2RlICVwXG4iLCBub3RpZnlfdmFsdWUsCisJCQkgIG5vZGUpKTsKIAogCWlmIChub3RpZnlfdmFsdWUgPD0gNykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiTm90aWZ5IHZhbHVlOiAlc1xuIiwKLQkJCQlhY3BpX25vdGlmeV92YWx1ZV9uYW1lc1tub3RpZnlfdmFsdWVdKSk7Ci0JfQotCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJIk5vdGlmeSB2YWx1ZTogMHglMi4yWCAqKkRldmljZSBTcGVjaWZpYyoqXG4iLAotCQkJbm90aWZ5X3ZhbHVlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk5vdGlmeSB2YWx1ZTogJXNcbiIsCisJCQkJICBhY3BpX25vdGlmeV92YWx1ZV9uYW1lc1tub3RpZnlfdmFsdWVdKSk7CisJfSBlbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIk5vdGlmeSB2YWx1ZTogMHglMi4yWCAqKkRldmljZSBTcGVjaWZpYyoqXG4iLAorCQkJCSAgbm90aWZ5X3ZhbHVlKSk7CiAJfQogCiAJLyogR2V0IHRoZSBub3RpZnkgb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBOUyBOb2RlICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAJaWYgKG9ial9kZXNjKSB7CiAJCS8qIFdlIGhhdmUgdGhlIG5vdGlmeSBvYmplY3QsIEdldCB0aGUgcmlnaHQgaGFuZGxlciAqLwogCkBAIC0xNzQsMTAgKzE1OSwxMSBAQAogCQljYXNlIEFDUElfVFlQRV9QT1dFUjoKIAogCQkJaWYgKG5vdGlmeV92YWx1ZSA8PSBBQ1BJX01BWF9TWVNfTk9USUZZKSB7Ci0JCQkJaGFuZGxlcl9vYmogPSBvYmpfZGVzYy0+Y29tbW9uX25vdGlmeS5zeXN0ZW1fbm90aWZ5OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaGFuZGxlcl9vYmogPSBvYmpfZGVzYy0+Y29tbW9uX25vdGlmeS5kZXZpY2Vfbm90aWZ5OworCQkJCWhhbmRsZXJfb2JqID0KKwkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuc3lzdGVtX25vdGlmeTsKKwkJCX0gZWxzZSB7CisJCQkJaGFuZGxlcl9vYmogPQorCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX25vdGlmeS5kZXZpY2Vfbm90aWZ5OwogCQkJfQogCQkJYnJlYWs7CiAKQEAgLTE4OSwyMyArMTc1LDI1IEBACiAKIAkvKiBJZiB0aGVyZSBpcyBhbnkgaGFuZGxlciB0byBydW4sIHNjaGVkdWxlIHRoZSBkaXNwYXRjaGVyICovCiAKLQlpZiAoKGFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuaGFuZGxlciAmJiAobm90aWZ5X3ZhbHVlIDw9IEFDUElfTUFYX1NZU19OT1RJRlkpKSB8fAotCQkoYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyICYmIChub3RpZnlfdmFsdWUgPiBBQ1BJX01BWF9TWVNfTk9USUZZKSkgfHwKLQkJaGFuZGxlcl9vYmopIHsKLQkJbm90aWZ5X2luZm8gPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlICgpOworCWlmICgoYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyCisJICAgICAmJiAobm90aWZ5X3ZhbHVlIDw9IEFDUElfTUFYX1NZU19OT1RJRlkpKQorCSAgICB8fCAoYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyCisJCSYmIChub3RpZnlfdmFsdWUgPiBBQ1BJX01BWF9TWVNfTk9USUZZKSkgfHwgaGFuZGxlcl9vYmopIHsKKwkJbm90aWZ5X2luZm8gPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CiAJCWlmICghbm90aWZ5X2luZm8pIHsKIAkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCW5vdGlmeV9pbmZvLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfTk9USUZZOwotCQlub3RpZnlfaW5mby0+bm90aWZ5Lm5vZGUgICAgICA9IG5vZGU7Ci0JCW5vdGlmeV9pbmZvLT5ub3RpZnkudmFsdWUgICAgID0gKHUxNikgbm90aWZ5X3ZhbHVlOworCQlub3RpZnlfaW5mby0+bm90aWZ5Lm5vZGUgPSBub2RlOworCQlub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlID0gKHUxNikgbm90aWZ5X3ZhbHVlOwogCQlub3RpZnlfaW5mby0+bm90aWZ5LmhhbmRsZXJfb2JqID0gaGFuZGxlcl9vYmo7CiAKLQkJc3RhdHVzID0gYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uIChPU0RfUFJJT1JJVFlfSElHSCwKLQkJCQkgIGFjcGlfZXZfbm90aWZ5X2Rpc3BhdGNoLCBub3RpZnlfaW5mbyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKG5vdGlmeV9pbmZvKTsKKwkJc3RhdHVzID0gYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKE9TRF9QUklPUklUWV9ISUdILAorCQkJCQkJICAgICBhY3BpX2V2X25vdGlmeV9kaXNwYXRjaCwKKwkJCQkJCSAgICAgbm90aWZ5X2luZm8pOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUobm90aWZ5X2luZm8pOwogCQl9CiAJfQogCkBAIC0yMTQsMTUgKzIwMiwxNSBAQAogCQkgKiBUaGVyZSBpcyBubyBwZXItZGV2aWNlIG5vdGlmeSBoYW5kbGVyIGZvciB0aGlzIGRldmljZS4KIAkJICogVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSBhIHByb2JsZW0uCiAJCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJIk5vIG5vdGlmeSBoYW5kbGVyIGZvciBOb3RpZnkoJTQuNHMsICVYKSBub2RlICVwXG4iLAotCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChub2RlKSwgbm90aWZ5X3ZhbHVlLCBub2RlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJObyBub3RpZnkgaGFuZGxlciBmb3IgTm90aWZ5KCU0LjRzLCAlWCkgbm9kZSAlcFxuIiwKKwkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm90aWZ5X3ZhbHVlLAorCQkJCSAgbm9kZSkpOwogCX0KIAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X25vdGlmeV9kaXNwYXRjaApAQCAtMjM2LDE4ICsyMjQsMTUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQotYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2ggKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpCitzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X25vdGlmeV9kaXNwYXRjaCh2b2lkICpjb250ZXh0KQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKm5vdGlmeV9pbmZvID0gKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKSBjb250ZXh0OwotCWFjcGlfbm90aWZ5X2hhbmRsZXIgICAgICAgICAgICAgZ2xvYmFsX2hhbmRsZXIgPSBOVUxMOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmdsb2JhbF9jb250ZXh0ID0gTlVMTDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpoYW5kbGVyX29iajsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKm5vdGlmeV9pbmZvID0KKwkgICAgKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKWNvbnRleHQ7CisJYWNwaV9ub3RpZnlfaGFuZGxlciBnbG9iYWxfaGFuZGxlciA9IE5VTEw7CisJdm9pZCAqZ2xvYmFsX2NvbnRleHQgPSBOVUxMOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyoKIAkgKiBXZSB3aWxsIGludm9rZSBhIGdsb2JhbCBub3RpZnkgaGFuZGxlciBpZiBpbnN0YWxsZWQuCkBAIC0yNjEsOCArMjQ2LDcgQEAKIAkJCWdsb2JhbF9oYW5kbGVyID0gYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyOwogCQkJZ2xvYmFsX2NvbnRleHQgPSBhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmNvbnRleHQ7CiAJCX0KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogR2xvYmFsIGRyaXZlciBub3RpZmljYXRpb24gaGFuZGxlciAqLwogCiAJCWlmIChhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIpIHsKQEAgLTI3NCwyNSArMjU4LDI0IEBACiAJLyogSW52b2tlIHRoZSBzeXN0ZW0gaGFuZGxlciBmaXJzdCwgaWYgcHJlc2VudCAqLwogCiAJaWYgKGdsb2JhbF9oYW5kbGVyKSB7Ci0JCWdsb2JhbF9oYW5kbGVyIChub3RpZnlfaW5mby0+bm90aWZ5Lm5vZGUsIG5vdGlmeV9pbmZvLT5ub3RpZnkudmFsdWUsCi0JCQlnbG9iYWxfY29udGV4dCk7CisJCWdsb2JhbF9oYW5kbGVyKG5vdGlmeV9pbmZvLT5ub3RpZnkubm9kZSwKKwkJCSAgICAgICBub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlLCBnbG9iYWxfY29udGV4dCk7CiAJfQogCiAJLyogTm93IGludm9rZSB0aGUgcGVyLWRldmljZSBoYW5kbGVyLCBpZiBwcmVzZW50ICovCiAKIAloYW5kbGVyX29iaiA9IG5vdGlmeV9pbmZvLT5ub3RpZnkuaGFuZGxlcl9vYmo7CiAJaWYgKGhhbmRsZXJfb2JqKSB7Ci0JCWhhbmRsZXJfb2JqLT5ub3RpZnkuaGFuZGxlciAobm90aWZ5X2luZm8tPm5vdGlmeS5ub2RlLAotCQkJbm90aWZ5X2luZm8tPm5vdGlmeS52YWx1ZSwKLQkJCWhhbmRsZXJfb2JqLT5ub3RpZnkuY29udGV4dCk7CisJCWhhbmRsZXJfb2JqLT5ub3RpZnkuaGFuZGxlcihub3RpZnlfaW5mby0+bm90aWZ5Lm5vZGUsCisJCQkJCSAgICBub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlLAorCQkJCQkgICAgaGFuZGxlcl9vYmotPm5vdGlmeS5jb250ZXh0KTsKIAl9CiAKIAkvKiBBbGwgZG9uZSB3aXRoIHRoZSBpbmZvIG9iamVjdCAqLwogCi0JYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAobm90aWZ5X2luZm8pOworCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUobm90aWZ5X2luZm8pOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ2xvYmFsX2xvY2tfdGhyZWFkCkBAIC0zMDcsMjcgKzI5MCwyNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFCi1hY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZCAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCkKK3N0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfZ2xvYmFsX2xvY2tfdGhyZWFkKHZvaWQgKmNvbnRleHQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAkvKiBTaWduYWwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIGZvciB0aGUgbG9jayAqLwogCiAJaWYgKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudCkgewogCQkvKiBTZW5kIHN1ZmZpY2llbnQgdW5pdHMgdG8gdGhlIHNlbWFwaG9yZSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZSAoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlLAotCQkJCSBhY3BpX2dibF9nbG9iYWxfbG9ja190aHJlYWRfY291bnQpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3Qgc2lnbmFsIEdsb2JhbCBMb2NrIHNlbWFwaG9yZVxuIikpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9vc19zaWduYWxfc2VtYXBob3JlKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSwKKwkJCQkJICAgICBhY3BpX2dibF9nbG9iYWxfbG9ja190aHJlYWRfY291bnQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IHNpZ25hbCBHbG9iYWwgTG9jayBzZW1hcGhvcmVcbiIpKTsKIAkJfQogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIKQEAgLTM0MiwyMCArMzIyLDE3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHUzMgotYWNwaV9ldl9nbG9iYWxfbG9ja19oYW5kbGVyICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KQorc3RhdGljIHUzMiBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIodm9pZCAqY29udGV4dCkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gRkFMU0U7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KKwl1OCBhY3F1aXJlZCA9IEZBTFNFOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCS8qCiAJICogQXR0ZW1wdCB0byBnZXQgdGhlIGxvY2sKIAkgKiBJZiB3ZSBkb24ndCBnZXQgaXQgbm93LCBpdCB3aWxsIGJlIG1hcmtlZCBwZW5kaW5nIGFuZCB3ZSB3aWxsCiAJICogdGFrZSBhbm90aGVyIGludGVycnVwdCB3aGVuIGl0IGJlY29tZXMgZnJlZS4KIAkgKi8KLQlBQ1BJX0FDUVVJUkVfR0xPQkFMX0xPQ0sgKGFjcGlfZ2JsX2NvbW1vbl9mQUNTLmdsb2JhbF9sb2NrLCBhY3F1aXJlZCk7CisJQUNQSV9BQ1FVSVJFX0dMT0JBTF9MT0NLKGFjcGlfZ2JsX2NvbW1vbl9mQUNTLmdsb2JhbF9sb2NrLCBhY3F1aXJlZCk7CiAJaWYgKGFjcXVpcmVkKSB7CiAJCS8qIEdvdCB0aGUgbG9jaywgbm93IHdha2UgYWxsIHRocmVhZHMgd2FpdGluZyBmb3IgaXQgKi8KIApAQCAtMzYzLDExICszNDAsMTEgQEAKIAogCQkvKiBSdW4gdGhlIEdsb2JhbCBMb2NrIHRocmVhZCB3aGljaCB3aWxsIHNpZ25hbCBhbGwgd2FpdGluZyB0aHJlYWRzICovCiAKLQkJc3RhdHVzID0gYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uIChPU0RfUFJJT1JJVFlfSElHSCwKLQkJCQkgIGFjcGlfZXZfZ2xvYmFsX2xvY2tfdGhyZWFkLCBjb250ZXh0KTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IHF1ZXVlIEdsb2JhbCBMb2NrIHRocmVhZCwgJXNcbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCXN0YXR1cyA9IGFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbihPU0RfUFJJT1JJVFlfSElHSCwKKwkJCQkJCSAgICAgYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQsCisJCQkJCQkgICAgIGNvbnRleHQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IHF1ZXVlIEdsb2JhbCBMb2NrIHRocmVhZCwgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAKIAkJCXJldHVybiAoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwogCQl9CkBAIC0zNzYsNyArMzUzLDYgQEAKIAlyZXR1cm4gKEFDUElfSU5URVJSVVBUX0hBTkRMRUQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyCkBAIC0zODksMTkgKzM2NSwxNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2luaXRfZ2xvYmFsX2xvY2tfaGFuZGxlciAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIiKTsKIAogCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3ByZXNlbnQgPSBUUlVFOwotCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyIChBQ1BJX0VWRU5UX0dMT0JBTCwKLQkJCSBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIsIE5VTEwpOworCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKEFDUElfRVZFTlRfR0xPQkFMLAorCQkJCQkJICBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIsCisJCQkJCQkgIE5VTEwpOwogCiAJLyoKIAkgKiBJZiB0aGUgZ2xvYmFsIGxvY2sgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBwbGF0Zm9ybSwgdGhlIGF0dGVtcHQKQEAgLTQxMSwxNCArMzg0LDE1IEBACiAJICogd2l0aCBhbiBlcnJvci4KIAkgKi8KIAlpZiAoc3RhdHVzID09IEFFX05PX0hBUkRXQVJFX1JFU1BPTlNFKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gcmVzcG9uc2UgZnJvbSBHbG9iYWwgTG9jayBoYXJkd2FyZSwgZGlzYWJsaW5nIGxvY2tcbiIpKTsKKwogCQlhY3BpX2dibF9nbG9iYWxfbG9ja19wcmVzZW50ID0gRkFMU0U7CiAJCXN0YXR1cyA9IEFFX09LOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jawpAQCAtNDMxLDIyICs0MDUsMTggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2sgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCkKK2FjcGlfc3RhdHVzIGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jayh1MTYgdGltZW91dCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBGQUxTRTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1OCBhY3F1aXJlZCA9IEZBTFNFOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfYWNxdWlyZV9nbG9iYWxfbG9jayIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfYWNxdWlyZV9nbG9iYWxfbG9jayIpOwogCiAjaWZuZGVmIEFDUElfQVBQTElDQVRJT04KIAkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIGEgZ2xvYmFsIGxvY2sgKi8KIAogCWlmICghYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0dMT0JBTF9MT0NLKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0dMT0JBTF9MT0NLKTsKIAl9CiAjZW5kaWYKIApAQCAtNDU5LDM3ICs0MjksMzcgQEAKIAkgKiB3ZSBhcmUgZG9uZQogCSAqLwogCWlmIChhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBXZSBtdXN0IGFjcXVpcmUgdGhlIGFjdHVhbCBoYXJkd2FyZSBsb2NrICovCiAKLQlBQ1BJX0FDUVVJUkVfR0xPQkFMX0xPQ0sgKGFjcGlfZ2JsX2NvbW1vbl9mQUNTLmdsb2JhbF9sb2NrLCBhY3F1aXJlZCk7CisJQUNQSV9BQ1FVSVJFX0dMT0JBTF9MT0NLKGFjcGlfZ2JsX2NvbW1vbl9mQUNTLmdsb2JhbF9sb2NrLCBhY3F1aXJlZCk7CiAJaWYgKGFjcXVpcmVkKSB7Ci0JICAgLyogV2UgZ290IHRoZSBsb2NrICovCisJCS8qIFdlIGdvdCB0aGUgbG9jayAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJBY3F1aXJlZCB0aGUgSFcgR2xvYmFsIExvY2tcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIkFjcXVpcmVkIHRoZSBIVyBHbG9iYWwgTG9ja1xuIikpOwogCiAJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkID0gVFJVRTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyoKIAkgKiBEaWQgbm90IGdldCB0aGUgbG9jay4gIFRoZSBwZW5kaW5nIGJpdCB3YXMgc2V0IGFib3ZlLCBhbmQgd2UgbXVzdCBub3cKIAkgKiB3YWl0IHVudGlsIHdlIGdldCB0aGUgZ2xvYmFsIGxvY2sgcmVsZWFzZWQgaW50ZXJydXB0LgogCSAqLwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJXYWl0aW5nIGZvciB0aGUgSFcgR2xvYmFsIExvY2tcbiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJXYWl0aW5nIGZvciB0aGUgSFcgR2xvYmFsIExvY2tcbiIpKTsKIAogCS8qCiAJICogQWNxdWlyZSB0aGUgZ2xvYmFsIGxvY2sgc2VtYXBob3JlIGZpcnN0LgogCSAqIFNpbmNlIHRoaXMgd2FpdCB3aWxsIGJsb2NrLCB3ZSBtdXN0IHJlbGVhc2UgdGhlIGludGVycHJldGVyCiAJICovCi0Jc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUgKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSwKLQkJCSAgdGltZW91dCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSwKKwkJCQkJICAgICAgIHRpbWVvdXQpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jawpAQCAtNTAyLDIxICs0NzIsMTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9yZWxlYXNlX2dsb2JhbF9sb2NrICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9ldl9yZWxlYXNlX2dsb2JhbF9sb2NrKHZvaWQpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nID0gRkFMU0U7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwl1OCBwZW5kaW5nID0gRkFMU0U7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9yZWxlYXNlX2dsb2JhbF9sb2NrIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9yZWxlYXNlX2dsb2JhbF9sb2NrIik7CiAKIAlpZiAoIWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudCkgewotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgKLQkJCSJDYW5ub3QgcmVsZWFzZSBIVyBHbG9iYWwgTG9jaywgaXQgaGFzIG5vdCBiZWVuIGFjcXVpcmVkXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0FDUVVJUkVEKTsKKwkJQUNQSV9SRVBPUlRfV0FSTklORygoIkNhbm5vdCByZWxlYXNlIEhXIEdsb2JhbCBMb2NrLCBpdCBoYXMgbm90IGJlZW4gYWNxdWlyZWRcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9BQ1FVSVJFRCk7CiAJfQogCiAJLyogT25lIGZld2VyIHRocmVhZCBoYXMgdGhlIGdsb2JhbCBsb2NrICovCkBAIC01MjUsMTQgKzQ5MCwxNCBAQAogCWlmIChhY3BpX2dibF9nbG9iYWxfbG9ja190aHJlYWRfY291bnQpIHsKIAkJLyogVGhlcmUgYXJlIHN0aWxsIHNvbWUgdGhyZWFkcyBob2xkaW5nIHRoZSBsb2NrLCBjYW5ub3QgcmVsZWFzZSAqLwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qCiAJICogTm8gbW9yZSB0aHJlYWRzIGhvbGRpbmcgbG9jaywgd2UgY2FuIGRvIHRoZSBhY3R1YWwgaGFyZHdhcmUKIAkgKiByZWxlYXNlCiAJICovCi0JQUNQSV9SRUxFQVNFX0dMT0JBTF9MT0NLIChhY3BpX2dibF9jb21tb25fZkFDUy5nbG9iYWxfbG9jaywgcGVuZGluZyk7CisJQUNQSV9SRUxFQVNFX0dMT0JBTF9MT0NLKGFjcGlfZ2JsX2NvbW1vbl9mQUNTLmdsb2JhbF9sb2NrLCBwZW5kaW5nKTsKIAlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IEZBTFNFOwogCiAJLyoKQEAgLTU0MCwxNCArNTA1LDEzIEBACiAJICogcmVnaXN0ZXIKIAkgKi8KIAlpZiAocGVuZGluZykgewotCQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlciAoQUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfUkVMRUFTRSwKLQkJCQkgMSwgQUNQSV9NVFhfTE9DSyk7CisJCXN0YXR1cyA9IGFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0dMT0JBTF9MT0NLX1JFTEVBU0UsCisJCQkJCSAgIDEsIEFDUElfTVRYX0xPQ0spOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfdGVybWluYXRlCkBAIC01NjAsMTYgKzUyNCwxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfZXZfdGVybWluYXRlICgKLQl2b2lkKQordm9pZCBhY3BpX2V2X3Rlcm1pbmF0ZSh2b2lkKQogewotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX25hdGl2ZV91aW50IGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfdGVybWluYXRlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl90ZXJtaW5hdGUiKTsKIAogCWlmIChhY3BpX2dibF9ldmVudHNfaW5pdGlhbGl6ZWQpIHsKIAkJLyoKQEAgLTU4MCwzOCArNTQwLDM5IEBACiAJCS8qIERpc2FibGUgYWxsIGZpeGVkIGV2ZW50cyAqLwogCiAJCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9GSVhFRF9FVkVOVFM7IGkrKykgewotCQkJc3RhdHVzID0gYWNwaV9kaXNhYmxlX2V2ZW50ICgodTMyKSBpLCAwKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkNvdWxkIG5vdCBkaXNhYmxlIGZpeGVkIGV2ZW50ICVkXG4iLCAodTMyKSBpKSk7CisJCQlzdGF0dXMgPSBhY3BpX2Rpc2FibGVfZXZlbnQoKHUzMikgaSwgMCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiQ291bGQgbm90IGRpc2FibGUgZml4ZWQgZXZlbnQgJWRcbiIsCisJCQkJCQkgICh1MzIpIGkpKTsKIAkJCX0KIAkJfQogCiAJCS8qIERpc2FibGUgYWxsIEdQRXMgaW4gYWxsIEdQRSBibG9ja3MgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QgKGFjcGlfaHdfZGlzYWJsZV9ncGVfYmxvY2ssIEFDUElfTk9UX0lTUik7CisJCXN0YXR1cyA9IGFjcGlfZXZfd2Fsa19ncGVfbGlzdChhY3BpX2h3X2Rpc2FibGVfZ3BlX2Jsb2NrKTsKIAogCQkvKiBSZW1vdmUgU0NJIGhhbmRsZXIgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V2X3JlbW92ZV9zY2lfaGFuZGxlciAoKTsKKwkJc3RhdHVzID0gYWNwaV9ldl9yZW1vdmVfc2NpX2hhbmRsZXIoKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiQ291bGQgbm90IHJlbW92ZSBTQ0kgaGFuZGxlclxuIikpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiQ291bGQgbm90IHJlbW92ZSBTQ0kgaGFuZGxlclxuIikpOwogCQl9CiAJfQogCiAJLyogRGVhbGxvY2F0ZSBhbGwgaGFuZGxlciBvYmplY3RzIGluc3RhbGxlZCB3aXRoaW4gR1BFIGluZm8gc3RydWN0cyAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0IChhY3BpX2V2X2RlbGV0ZV9ncGVfaGFuZGxlcnMsIEFDUElfTk9UX0lTUik7CisJc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycyk7CiAKIAkvKiBSZXR1cm4gdG8gb3JpZ2luYWwgbW9kZSBpZiBuZWNlc3NhcnkgKi8KIAogCWlmIChhY3BpX2dibF9vcmlnaW5hbF9tb2RlID09IEFDUElfU1lTX01PREVfTEVHQUNZKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZGlzYWJsZSAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfV0FSTiwgImFjcGlfZGlzYWJsZSBmYWlsZWRcbiIpKTsKKwkJc3RhdHVzID0gYWNwaV9kaXNhYmxlKCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCQkgICJhY3BpX2Rpc2FibGUgZmFpbGVkXG4iKSk7CiAJCX0KIAl9CiAJcmV0dXJuX1ZPSUQ7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYwppbmRleCBhMWQ3Mjc2Yy4uODRmYWQwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYwpAQCAtNDEsMzkgKzQxLDMwIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXZyZWdpb24iKQotCitBQ1BJX01PRFVMRV9OQU1FKCJldnJlZ2lvbiIpCiAjZGVmaW5lIEFDUElfTlVNX0RFRkFVTFRfU1BBQ0VTICAgICA0Ci0KLXN0YXRpYyB1OCAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9kZWZhdWx0X2FkZHJlc3Nfc3BhY2VzW0FDUElfTlVNX0RFRkFVTFRfU1BBQ0VTXSA9IHsKLQkJCSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZLAotCQkJIEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTywKLQkJCSBBQ1BJX0FEUl9TUEFDRV9QQ0lfQ09ORklHLAotCQkJIEFDUElfQURSX1NQQUNFX0RBVEFfVEFCTEV9Oworc3RhdGljIHU4IGFjcGlfZ2JsX2RlZmF1bHRfYWRkcmVzc19zcGFjZXNbQUNQSV9OVU1fREVGQVVMVF9TUEFDRVNdID0geworCUFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlksCisJQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPLAorCUFDUElfQURSX1NQQUNFX1BDSV9DT05GSUcsCisJQUNQSV9BRFJfU1BBQ0VfREFUQV9UQUJMRQorfTsKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfcmVnX3J1biAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKK2FjcGlfZXZfcmVnX3J1bihhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5zdGFsbF9oYW5kbGVyICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCithY3BpX2V2X2luc3RhbGxfaGFuZGxlcihhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC04NywxOSArNzgsMTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9pbnN0YWxsX3JlZ2lvbl9oYW5kbGVycyAoCi0Jdm9pZCkgewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5zdGFsbF9yZWdpb25faGFuZGxlcnModm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9uYXRpdmVfdWludCBpOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5zdGFsbF9yZWdpb25faGFuZGxlcnMiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9pbnN0YWxsX3JlZ2lvbl9oYW5kbGVycyIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCkBAIC0xMjEsOSArMTA5LDExIEBACiAJICogU2ltaWxhciBmb3IgQUVfU0FNRV9IQU5ETEVSLgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9ERUZBVUxUX1NQQUNFUzsgaSsrKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZXZfaW5zdGFsbF9zcGFjZV9oYW5kbGVyIChhY3BpX2dibF9yb290X25vZGUsCi0JCQkJICBhY3BpX2dibF9kZWZhdWx0X2FkZHJlc3Nfc3BhY2VzW2ldLAotCQkJCSAgQUNQSV9ERUZBVUxUX0hBTkRMRVIsIE5VTEwsIE5VTEwpOworCQlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfc3BhY2VfaGFuZGxlcihhY3BpX2dibF9yb290X25vZGUsCisJCQkJCQkgICAgICAgYWNwaV9nYmxfZGVmYXVsdF9hZGRyZXNzX3NwYWNlcworCQkJCQkJICAgICAgIFtpXSwKKwkJCQkJCSAgICAgICBBQ1BJX0RFRkFVTFRfSEFORExFUiwKKwkJCQkJCSAgICAgICBOVUxMLCBOVUxMKTsKIAkJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSBBRV9PSzoKIAkJY2FzZSBBRV9TQU1FX0hBTkRMRVI6CkBAIC0xNDAsMTIgKzEzMCwxMSBAQAogCQl9CiAJfQogCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbml0aWFsaXplX29wX3JlZ2lvbnMKQEAgLTE1OSwyMCArMTQ4LDE2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9ldl9pbml0aWFsaXplX29wX3JlZ2lvbnModm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2luaXRpYWxpemVfb3BfcmVnaW9ucyIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2luaXRpYWxpemVfb3BfcmVnaW9ucyIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCkBAIC0xODIsMTUgKzE2NywxNSBAQAogCQkvKiBUQkQ6IE1ha2Ugc3VyZSBoYW5kbGVyIGlzIHRoZSBERUZBVUxUIGhhbmRsZXIsIG90aGVyd2lzZQogCQkgKiBfUkVHIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gcnVuLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2RzIChhY3BpX2dibF9yb290X25vZGUsCi0JCQkJICBhY3BpX2dibF9kZWZhdWx0X2FkZHJlc3Nfc3BhY2VzW2ldKTsKKwkJc3RhdHVzID0gYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2RzKGFjcGlfZ2JsX3Jvb3Rfbm9kZSwKKwkJCQkJCSAgICAgYWNwaV9nYmxfZGVmYXVsdF9hZGRyZXNzX3NwYWNlcworCQkJCQkJICAgICBbaV0pOwogCX0KIAotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kCkBAIC0yMDUsMjYgKzE5MCwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZWdpb25fb2JqLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24pCithY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLCB1MzIgZnVuY3Rpb24pCiB7Ci0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICBpbmZvOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnBhcmFtc1szXTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZWdpb25fb2JqMjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyBpbmZvOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnBhcmFtc1szXTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqMjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9leGVjdXRlX3JlZ19tZXRob2QiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9leGVjdXRlX3JlZ19tZXRob2QiKTsKLQotCi0JcmVnaW9uX29iajIgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0IChyZWdpb25fb2JqKTsKKwlyZWdpb25fb2JqMiA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QocmVnaW9uX29iaik7CiAJaWYgKCFyZWdpb25fb2JqMikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9FWElTVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCX0KIAogCWlmIChyZWdpb25fb2JqMi0+ZXh0cmEubWV0aG9kX1JFRyA9PSBOVUxMKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qCkBAIC0yMzcsMTIgKzIxOCwxMiBAQAogCSAqICAgICAgICAgIDAgZm9yIGRpc2Nvbm5lY3RpbmcgdGhlIGhhbmRsZXIKIAkgKiAgICAgICAgICBQYXNzZWQgYXMgYSBwYXJhbWV0ZXIKIAkgKi8KLQlwYXJhbXNbMF0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwlwYXJhbXNbMF0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCWlmICghcGFyYW1zWzBdKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCi0JcGFyYW1zWzFdID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJcGFyYW1zWzFdID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAlpZiAoIXBhcmFtc1sxXSkgewogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTI2MCwxOSArMjQxLDE4IEBACiAKIAkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHJldHVybiB2YWx1ZSAqLwogCi0JQUNQSV9ERUJVR19FWEVDIChhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSAoCi0JCQkgICBBQ1BJX1RZUEVfTUVUSE9ELCBpbmZvLm5vZGUsIE5VTEwpKTsKLQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZSAoJmluZm8pOworCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZQorCQkJKEFDUElfVFlQRV9NRVRIT0QsIGluZm8ubm9kZSwgTlVMTCkpOworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlKCZpbmZvKTsKIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocGFyYW1zWzFdKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocGFyYW1zWzFdKTsKIAotY2xlYW51cDoKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHBhcmFtc1swXSk7CisgICAgICBjbGVhbnVwOgorCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwYXJhbXNbMF0pOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaApAQCAtMjkxLDQwICsyNzEsMzggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2ggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmosCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIGFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfd2lkdGgsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUpCithY3BpX2V2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2godW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKKwkJCSAgICAgICB1MzIgZnVuY3Rpb24sCisJCQkgICAgICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkgICAgICAgdTMyIGJpdF93aWR0aCwgdm9pZCAqdmFsdWUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyOwotCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgICAgICAgICAgaGFuZGxlcjsKLQlhY3BpX2Fkcl9zcGFjZV9zZXR1cCAgICAgICAgICAgIHJlZ2lvbl9zZXR1cDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpoYW5kbGVyX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVnaW9uX29iajI7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW9uX2NvbnRleHQgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXMyOworCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgaGFuZGxlcjsKKwlhY3BpX2Fkcl9zcGFjZV9zZXR1cCByZWdpb25fc2V0dXA7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOworCXZvaWQgKnJlZ2lvbl9jb250ZXh0ID0gTlVMTDsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2giKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoIik7Ci0KLQotCXJlZ2lvbl9vYmoyID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdCAocmVnaW9uX29iaik7CisJcmVnaW9uX29iajIgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KHJlZ2lvbl9vYmopOwogCWlmICghcmVnaW9uX29iajIpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRVhJU1QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKIAl9CiAKIAkvKiBFbnN1cmUgdGhhdCB0aGVyZSBpcyBhIGhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVnaW9uICovCiAKIAloYW5kbGVyX2Rlc2MgPSByZWdpb25fb2JqLT5yZWdpb24uaGFuZGxlcjsKIAlpZiAoIWhhbmRsZXJfZGVzYykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJObyBoYW5kbGVyIGZvciBSZWdpb24gWyU0LjRzXSAoJXApIFslc11cbiIsCi0JCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHJlZ2lvbl9vYmotPnJlZ2lvbi5ub2RlKSwKLQkJCXJlZ2lvbl9vYmosIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTm8gaGFuZGxlciBmb3IgUmVnaW9uIFslNC40c10gKCVwKSBbJXNdXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHJlZ2lvbl9vYmotPnJlZ2lvbi4KKwkJCQkJCQlub2RlKSwgcmVnaW9uX29iaiwKKwkJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZ2lvbl9vYmotPnJlZ2lvbi4KKwkJCQkJCQkgIHNwYWNlX2lkKSkpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CiAJfQogCiAJLyoKQEAgLTMzOSwxMCArMzE3LDEzIEBACiAJCWlmICghcmVnaW9uX3NldHVwKSB7CiAJCQkvKiBObyBpbml0aWFsaXphdGlvbiByb3V0aW5lLCBleGl0IHdpdGggZXJyb3IgKi8KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIk5vIGluaXQgcm91dGluZSBmb3IgcmVnaW9uKCVwKSBbJXNdXG4iLAotCQkJCXJlZ2lvbl9vYmosIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9FWElTVCk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJObyBpbml0IHJvdXRpbmUgZm9yIHJlZ2lvbiglcCkgWyVzXVxuIiwKKwkJCQkJICByZWdpb25fb2JqLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZ2lvbl9vYmotPgorCQkJCQkJCQkgIHJlZ2lvbi4KKwkJCQkJCQkJICBzcGFjZV9pZCkpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCQl9CiAKIAkJLyoKQEAgLTM1MCwyNSArMzMxLDI5IEBACiAJCSAqIHNldHVwIHdpbGwgcG90ZW50aWFsbHkgZXhlY3V0ZSBjb250cm9sIG1ldGhvZHMKIAkJICogKGUuZy4sIF9SRUcgbWV0aG9kIGZvciB0aGlzIHJlZ2lvbikKIAkJICovCi0JCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlciAoKTsKKwkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAKLQkJc3RhdHVzID0gcmVnaW9uX3NldHVwIChyZWdpb25fb2JqLCBBQ1BJX1JFR0lPTl9BQ1RJVkFURSwKLQkJCQkgIGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5jb250ZXh0LCAmcmVnaW9uX2NvbnRleHQpOworCQlzdGF0dXMgPSByZWdpb25fc2V0dXAocmVnaW9uX29iaiwgQUNQSV9SRUdJT05fQUNUSVZBVEUsCisJCQkJICAgICAgaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLmNvbnRleHQsCisJCQkJICAgICAgJnJlZ2lvbl9jb250ZXh0KTsKIAogCQkvKiBSZS1lbnRlciB0aGUgaW50ZXJwcmV0ZXIgKi8KIAotCQlzdGF0dXMyID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlciAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzMikpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzMik7CisJCXN0YXR1czIgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKIAkJfQogCiAJCS8qIENoZWNrIGZvciBmYWlsdXJlIG9mIHRoZSBSZWdpb24gU2V0dXAgKi8KIAotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlJlZ2lvbiBJbml0OiAlcyBbJXNdXG4iLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSwKLQkJCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkKSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIlJlZ2lvbiBJbml0OiAlcyBbJXNdXG4iLAorCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZ2lvbl9vYmotPgorCQkJCQkJCQkgIHJlZ2lvbi4KKwkJCQkJCQkJICBzcGFjZV9pZCkpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJLyoKQEAgLTM4MCwxNCArMzY1LDE0IEBACiAJCQlpZiAocmVnaW9uX29iajItPmV4dHJhLnJlZ2lvbl9jb250ZXh0KSB7CiAJCQkJLyogVGhlIGhhbmRsZXIgZm9yIHRoaXMgcmVnaW9uIHdhcyBhbHJlYWR5IGluc3RhbGxlZCAqLwogCi0JCQkJQUNQSV9NRU1fRlJFRSAocmVnaW9uX2NvbnRleHQpOwotCQkJfQotCQkJZWxzZSB7CisJCQkJQUNQSV9NRU1fRlJFRShyZWdpb25fY29udGV4dCk7CisJCQl9IGVsc2UgewogCQkJCS8qCiAJCQkJICogU2F2ZSB0aGUgcmV0dXJuZWQgY29udGV4dCBmb3IgdXNlIGluIGFsbCBhY2Nlc3NlcyB0bwogCQkJCSAqIHRoaXMgcGFydGljdWxhciByZWdpb24KIAkJCQkgKi8KLQkJCQlyZWdpb25fb2JqMi0+ZXh0cmEucmVnaW9uX2NvbnRleHQgPSByZWdpb25fY29udGV4dDsKKwkJCQlyZWdpb25fb2JqMi0+ZXh0cmEucmVnaW9uX2NvbnRleHQgPQorCQkJCSAgICByZWdpb25fY29udGV4dDsKIAkJCX0KIAkJfQogCX0KQEAgLTM5NiwxMyArMzgxLDE2IEBACiAKIAloYW5kbGVyID0gaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLmhhbmRsZXI7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9PUFJFR0lPTiwKLQkJIkhhbmRsZXIgJXAgKEAlcCkgQWRkcmVzcyAlOC44WCU4LjhYIFslc11cbiIsCi0JCSZyZWdpb25fb2JqLT5yZWdpb24uaGFuZGxlci0+YWRkcmVzc19zcGFjZSwgaGFuZGxlciwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSwKLQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZ2lvbl9vYmotPnJlZ2lvbi5zcGFjZV9pZCkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJICAiSGFuZGxlciAlcCAoQCVwKSBBZGRyZXNzICU4LjhYJTguOFggWyVzXVxuIiwKKwkJCSAgJnJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyLT5hZGRyZXNzX3NwYWNlLCBoYW5kbGVyLAorCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcyksCisJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZ2lvbl9vYmotPnJlZ2lvbi4KKwkJCQkJCSAgc3BhY2VfaWQpKSk7CiAKLQlpZiAoIShoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuaGZsYWdzICYgQUNQSV9BRERSX0hBTkRMRVJfREVGQVVMVF9JTlNUQUxMRUQpKSB7CisJaWYgKCEKKwkgICAgKGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS4KKwkgICAgIGhmbGFncyAmIEFDUElfQUREUl9IQU5ETEVSX0RFRkFVTFRfSU5TVEFMTEVEKSkgewogCQkvKgogCQkgKiBGb3IgaGFuZGxlcnMgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCAoc3VwcGxpZWQpIGhhbmRsZXJzLCB3ZSBtdXN0CiAJCSAqIGV4aXQgdGhlIGludGVycHJldGVyIGJlY2F1c2UgdGhlIGhhbmRsZXIgKm1pZ2h0KiBibG9jayAtLSB3ZSBkb24ndApAQCAtNDEzLDMxICs0MDEsMzMgQEAKIAogCS8qIENhbGwgdGhlIGhhbmRsZXIgKi8KIAotCXN0YXR1cyA9IGhhbmRsZXIgKGZ1bmN0aW9uLCBhZGRyZXNzLCBiaXRfd2lkdGgsIHZhbHVlLAorCXN0YXR1cyA9IGhhbmRsZXIoZnVuY3Rpb24sIGFkZHJlc3MsIGJpdF93aWR0aCwgdmFsdWUsCiAJCQkgaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLmNvbnRleHQsCiAJCQkgcmVnaW9uX29iajItPmV4dHJhLnJlZ2lvbl9jb250ZXh0KTsKIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSGFuZGxlciBmb3IgWyVzXSByZXR1cm5lZCAlc1xuIiwKLQkJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQpLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiSGFuZGxlciBmb3IgWyVzXSByZXR1cm5lZCAlc1xuIiwKKwkJCQkgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWdpb25fb2JqLT5yZWdpb24uCisJCQkJCQkJICAgc3BhY2VfaWQpLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJfQogCi0JaWYgKCEoaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLmhmbGFncyAmIEFDUElfQUREUl9IQU5ETEVSX0RFRkFVTFRfSU5TVEFMTEVEKSkgeworCWlmICghCisJICAgIChoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuCisJICAgICBoZmxhZ3MgJiBBQ1BJX0FERFJfSEFORExFUl9ERUZBVUxUX0lOU1RBTExFRCkpIHsKIAkJLyoKIAkJICogV2UganVzdCByZXR1cm5lZCBmcm9tIGEgbm9uLWRlZmF1bHQgaGFuZGxlciwgd2UgbXVzdCByZS1lbnRlciB0aGUKIAkJICogaW50ZXJwcmV0ZXIKIAkJICovCi0JCXN0YXR1czIgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMyKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMyKTsKKwkJc3RhdHVzMiA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOwogCQl9CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZGV0YWNoX3JlZ2lvbgpAQCAtNDUzLDIzICs0NDMsMjAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfZXZfZGV0YWNoX3JlZ2lvbigKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZWdpb25fb2JqLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9uc19pc19sb2NrZWQpCithY3BpX2V2X2RldGFjaF9yZWdpb24odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKKwkJICAgICAgdTggYWNwaV9uc19pc19sb2NrZWQpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaGFuZGxlcl9vYmo7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmxhc3Rfb2JqX3B0cjsKLQlhY3BpX2Fkcl9zcGFjZV9zZXR1cCAgICAgICAgICAgIHJlZ2lvbl9zZXR1cDsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVnaW9uX2NvbnRleHQ7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVnaW9uX29iajI7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9vYmo7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmxhc3Rfb2JqX3B0cjsKKwlhY3BpX2Fkcl9zcGFjZV9zZXR1cCByZWdpb25fc2V0dXA7CisJdm9pZCAqKnJlZ2lvbl9jb250ZXh0OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2RldGFjaF9yZWdpb24iKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9kZXRhY2hfcmVnaW9uIik7Ci0KLQotCXJlZ2lvbl9vYmoyID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdCAocmVnaW9uX29iaik7CisJcmVnaW9uX29iajIgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KHJlZ2lvbl9vYmopOwogCWlmICghcmVnaW9uX29iajIpIHsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQpAQCAtNDkzLDM0ICs0ODAsMzkgQEAKIAkJLyogSXMgdGhpcyB0aGUgY29ycmVjdCBSZWdpb24/ICovCiAKIAkJaWYgKG9ial9kZXNjID09IHJlZ2lvbl9vYmopIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX09QUkVHSU9OLAotCQkJCSJSZW1vdmluZyBSZWdpb24gJXAgZnJvbSBhZGRyZXNzIGhhbmRsZXIgJXBcbiIsCi0JCQkJcmVnaW9uX29iaiwgaGFuZGxlcl9vYmopKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkJCSAgIlJlbW92aW5nIFJlZ2lvbiAlcCBmcm9tIGFkZHJlc3MgaGFuZGxlciAlcFxuIiwKKwkJCQkJICByZWdpb25fb2JqLCBoYW5kbGVyX29iaikpOwogCiAJCQkvKiBUaGlzIGlzIGl0LCByZW1vdmUgaXQgZnJvbSB0aGUgaGFuZGxlcidzIGxpc3QgKi8KIAogCQkJKmxhc3Rfb2JqX3B0ciA9IG9ial9kZXNjLT5yZWdpb24ubmV4dDsKLQkJCW9ial9kZXNjLT5yZWdpb24ubmV4dCA9IE5VTEw7ICAgICAgICAgICAvKiBNdXN0IGNsZWFyIGZpZWxkICovCisJCQlvYmpfZGVzYy0+cmVnaW9uLm5leHQgPSBOVUxMOwkvKiBNdXN0IGNsZWFyIGZpZWxkICovCiAKIAkJCWlmIChhY3BpX25zX2lzX2xvY2tlZCkgewotCQkJCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJCXJldHVybl9WT0lEOwogCQkJCX0KIAkJCX0KIAogCQkJLyogTm93IHN0b3AgcmVnaW9uIGFjY2Vzc2VzIGJ5IGV4ZWN1dGluZyB0aGUgX1JFRyBtZXRob2QgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QgKHJlZ2lvbl9vYmosIDApOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiJXMgZnJvbSByZWdpb24gX1JFRywgWyVzXVxuIiwKLQkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLAotCQkJCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkKSkpOworCQkJc3RhdHVzID0gYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QocmVnaW9uX29iaiwgMCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiJXMgZnJvbSByZWdpb24gX1JFRywgWyVzXVxuIiwKKwkJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksCisJCQkJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lCisJCQkJCQkgIChyZWdpb25fb2JqLT5yZWdpb24uCisJCQkJCQkgICBzcGFjZV9pZCkpKTsKIAkJCX0KIAogCQkJaWYgKGFjcGlfbnNfaXNfbG9ja2VkKSB7Ci0JCQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkJcmV0dXJuX1ZPSUQ7CiAJCQkJfQogCQkJfQpAQCAtNTI4LDE1ICs1MjAsMjAgQEAKIAkJCS8qIENhbGwgdGhlIHNldHVwIGhhbmRsZXIgd2l0aCB0aGUgZGVhY3RpdmF0ZSBub3RpZmljYXRpb24gKi8KIAogCQkJcmVnaW9uX3NldHVwID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc2V0dXA7Ci0JCQlzdGF0dXMgPSByZWdpb25fc2V0dXAgKHJlZ2lvbl9vYmosIEFDUElfUkVHSU9OX0RFQUNUSVZBVEUsCi0JCQkJCSAgaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuY29udGV4dCwgcmVnaW9uX2NvbnRleHQpOworCQkJc3RhdHVzID0KKwkJCSAgICByZWdpb25fc2V0dXAocmVnaW9uX29iaiwgQUNQSV9SRUdJT05fREVBQ1RJVkFURSwKKwkJCQkJIGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmNvbnRleHQsCisJCQkJCSByZWdpb25fY29udGV4dCk7CiAKIAkJCS8qIEluaXQgcm91dGluZSBtYXkgZmFpbCwgSnVzdCBpZ25vcmUgZXJyb3JzICovCiAKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIiVzIGZyb20gcmVnaW9uIGluaXQsIFslc11cbiIsCi0JCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSwKLQkJCQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZ2lvbl9vYmotPnJlZ2lvbi5zcGFjZV9pZCkpKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICIlcyBmcm9tIHJlZ2lvbiBpbml0LCBbJXNdXG4iLAorCQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwKKwkJCQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUKKwkJCQkJCSAgKHJlZ2lvbl9vYmotPnJlZ2lvbi4KKwkJCQkJCSAgIHNwYWNlX2lkKSkpOwogCQkJfQogCiAJCQlyZWdpb25fb2JqLT5yZWdpb24uZmxhZ3MgJj0gfihBT1BPQkpfU0VUVVBfQ09NUExFVEUpOwpAQCAtNTUyLDcgKzU0OSw3IEBACiAJCQkgKiB0aGlzIGJldHRlciBiZSB0aGUgcmVnaW9uJ3MgaGFuZGxlcgogCQkJICovCiAJCQlyZWdpb25fb2JqLT5yZWdpb24uaGFuZGxlciA9IE5VTEw7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGhhbmRsZXJfb2JqKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShoYW5kbGVyX29iaik7CiAKIAkJCXJldHVybl9WT0lEOwogCQl9CkBAIC01NjUsMTQgKzU2MiwxMyBAQAogCiAJLyogSWYgd2UgZ2V0IGhlcmUsIHRoZSByZWdpb24gd2FzIG5vdCBpbiB0aGUgaGFuZGxlcidzIHJlZ2lvbiBsaXN0ICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9PUFJFR0lPTiwKLQkJIkNhbm5vdCByZW1vdmUgcmVnaW9uICVwIGZyb20gYWRkcmVzcyBoYW5kbGVyICVwXG4iLAotCQlyZWdpb25fb2JqLCBoYW5kbGVyX29iaikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkgICJDYW5ub3QgcmVtb3ZlIHJlZ2lvbiAlcCBmcm9tIGFkZHJlc3MgaGFuZGxlciAlcFxuIiwKKwkJCSAgcmVnaW9uX29iaiwgaGFuZGxlcl9vYmopKTsKIAogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfYXR0YWNoX3JlZ2lvbgpAQCAtNTg5LDIwICs1ODUsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2F0dGFjaF9yZWdpb24gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmhhbmRsZXJfb2JqLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmosCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX25zX2lzX2xvY2tlZCkKK2FjcGlfZXZfYXR0YWNoX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iaiwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKKwkJICAgICAgdTggYWNwaV9uc19pc19sb2NrZWQpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfYXR0YWNoX3JlZ2lvbiIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2F0dGFjaF9yZWdpb24iKTsKIAotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfT1BSRUdJT04sCi0JCSJBZGRpbmcgUmVnaW9uIFslNC40c10gJXAgdG8gYWRkcmVzcyBoYW5kbGVyICVwIFslc11cbiIsCi0JCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocmVnaW9uX29iai0+cmVnaW9uLm5vZGUpLAotCQlyZWdpb25fb2JqLCBoYW5kbGVyX29iaiwKLQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZ2lvbl9vYmotPnJlZ2lvbi5zcGFjZV9pZCkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJICAiQWRkaW5nIFJlZ2lvbiBbJTQuNHNdICVwIHRvIGFkZHJlc3MgaGFuZGxlciAlcCBbJXNdXG4iLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocmVnaW9uX29iai0+cmVnaW9uLm5vZGUpLAorCQkJICByZWdpb25fb2JqLCBoYW5kbGVyX29iaiwKKwkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+cmVnaW9uLgorCQkJCQkJICBzcGFjZV9pZCkpKTsKIAogCS8qIExpbmsgdGhpcyByZWdpb24gdG8gdGhlIGZyb250IG9mIHRoZSBoYW5kbGVyJ3MgbGlzdCAqLwogCkBAIC02MTIsMTYgKzYwNywxNSBAQAogCS8qIEluc3RhbGwgdGhlIHJlZ2lvbidzIGhhbmRsZXIgKi8KIAogCWlmIChyZWdpb25fb2JqLT5yZWdpb24uaGFuZGxlcikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FMUkVBRFlfRVhJU1RTKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FMUkVBRFlfRVhJU1RTKTsKIAl9CiAKIAlyZWdpb25fb2JqLT5yZWdpb24uaGFuZGxlciA9IGhhbmRsZXJfb2JqOwotCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAoaGFuZGxlcl9vYmopOworCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShoYW5kbGVyX29iaik7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW5zdGFsbF9oYW5kbGVyCkBAIC02NDAsMjMgKzYzNCwxOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2luc3RhbGxfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKQorYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpoYW5kbGVyX29iajsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpuZXh0X2hhbmRsZXJfb2JqOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9vYmo7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dF9oYW5kbGVyX29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImV2X2luc3RhbGxfaGFuZGxlciIpOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZXZfaW5zdGFsbF9oYW5kbGVyIik7Ci0KLQotCWhhbmRsZXJfb2JqID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAqKSBjb250ZXh0OworCWhhbmRsZXJfb2JqID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiljb250ZXh0OwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIApAQCAtNjY2LDcgKzY1NSw3IEBACiAKIAkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgZGV2aWNlIGhhbmRsZSAqLwogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChvYmpfaGFuZGxlKTsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7CiAJaWYgKCFub2RlKSB7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQpAQCAtNjc2LDE0ICs2NjUsMTMgQEAKIAkgKiB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgYWRkcmVzcyBzcGFjZSBoYW5kbGVycwogCSAqLwogCWlmICgobm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfREVWSUNFKSAmJgotCQkobm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfUkVHSU9OKSAmJgotCQkobm9kZSAhPSBhY3BpX2dibF9yb290X25vZGUpKSB7CisJICAgIChub2RlLT50eXBlICE9IEFDUElfVFlQRV9SRUdJT04pICYmIChub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpIHsKIAkJcmV0dXJuIChBRV9PSyk7CiAJfQogCiAJLyogQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIGludGVybmFsIG9iamVjdCAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCWlmICghb2JqX2Rlc2MpIHsKIAkJLyogTm8gb2JqZWN0LCBqdXN0IGV4aXQgKi8KIApAQCAtNjkyLDE4ICs2ODAsMjIgQEAKIAogCS8qIERldmljZXMgYXJlIGhhbmRsZWQgZGlmZmVyZW50IHRoYW4gcmVnaW9ucyAqLwogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0RFVklDRSkgeworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0RFVklDRSkgewogCQkvKiBDaGVjayBpZiB0aGlzIERldmljZSBhbHJlYWR5IGhhcyBhIGhhbmRsZXIgZm9yIHRoaXMgYWRkcmVzcyBzcGFjZSAqLwogCiAJCW5leHRfaGFuZGxlcl9vYmogPSBvYmpfZGVzYy0+ZGV2aWNlLmhhbmRsZXI7CiAJCXdoaWxlIChuZXh0X2hhbmRsZXJfb2JqKSB7CiAJCQkvKiBGb3VuZCBhIGhhbmRsZXIsIGlzIGl0IGZvciB0aGUgc2FtZSBhZGRyZXNzIHNwYWNlPyAqLwogCi0JCQlpZiAobmV4dF9oYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCA9PSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX09QUkVHSU9OLAotCQkJCQkiRm91bmQgaGFuZGxlciBmb3IgcmVnaW9uIFslc10gaW4gZGV2aWNlICVwKCVwKSBoYW5kbGVyICVwXG4iLAotCQkJCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQpLAotCQkJCQlvYmpfZGVzYywgbmV4dF9oYW5kbGVyX29iaiwgaGFuZGxlcl9vYmopKTsKKwkJCWlmIChuZXh0X2hhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkID09CisJCQkgICAgaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQpIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJCQkJICAiRm91bmQgaGFuZGxlciBmb3IgcmVnaW9uIFslc10gaW4gZGV2aWNlICVwKCVwKSBoYW5kbGVyICVwXG4iLAorCQkJCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZQorCQkJCQkJICAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuCisJCQkJCQkgICBzcGFjZV9pZCksIG9ial9kZXNjLAorCQkJCQkJICBuZXh0X2hhbmRsZXJfb2JqLAorCQkJCQkJICBoYW5kbGVyX29iaikpOwogCiAJCQkJLyoKIAkJCQkgKiBTaW5jZSB0aGUgb2JqZWN0IHdlIGZvdW5kIGl0IG9uIHdhcyBhIGRldmljZSwgdGhlbiBpdApAQCAtNzQ0LDE1ICs3MzYsMTQgQEAKIAkgKgogCSAqIEZpcnN0IGRpc2Nvbm5lY3QgcmVnaW9uIGZvciBhbnkgcHJldmlvdXMgaGFuZGxlciAoaWYgYW55KQogCSAqLwotCWFjcGlfZXZfZGV0YWNoX3JlZ2lvbiAob2JqX2Rlc2MsIEZBTFNFKTsKKwlhY3BpX2V2X2RldGFjaF9yZWdpb24ob2JqX2Rlc2MsIEZBTFNFKTsKIAogCS8qIENvbm5lY3QgdGhlIHJlZ2lvbiB0byB0aGUgbmV3IGhhbmRsZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZfYXR0YWNoX3JlZ2lvbiAoaGFuZGxlcl9vYmosIG9ial9kZXNjLCBGQUxTRSk7CisJc3RhdHVzID0gYWNwaV9ldl9hdHRhY2hfcmVnaW9uKGhhbmRsZXJfb2JqLCBvYmpfZGVzYywgRkFMU0UpOwogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luc3RhbGxfc3BhY2VfaGFuZGxlcgpAQCAtNzcxLDMyICs3NjIsMjcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2luc3RhbGxfc3BhY2VfaGFuZGxlciAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQlhY3BpX2Fkcl9zcGFjZV90eXBlICAgICAgICAgICAgIHNwYWNlX2lkLAotCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgICAgICAgICAgaGFuZGxlciwKLQlhY3BpX2Fkcl9zcGFjZV9zZXR1cCAgICAgICAgICAgIHNldHVwLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpCithY3BpX2V2X2luc3RhbGxfc3BhY2VfaGFuZGxlcihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqIG5vZGUsCisJCQkgICAgICBhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkLAorCQkJICAgICAgYWNwaV9hZHJfc3BhY2VfaGFuZGxlciBoYW5kbGVyLAorCQkJICAgICAgYWNwaV9hZHJfc3BhY2Vfc2V0dXAgc2V0dXAsIHZvaWQgKmNvbnRleHQpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaGFuZGxlcl9vYmo7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSAwOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX29iamVjdF90eXBlIHR5cGU7CisJdTE2IGZsYWdzID0gMDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2luc3RhbGxfc3BhY2VfaGFuZGxlciIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5zdGFsbF9zcGFjZV9oYW5kbGVyIik7CiAKIAkvKgogCSAqIFRoaXMgcmVnaXN0cmF0aW9uIGlzIHZhbGlkIGZvciBvbmx5IHRoZSB0eXBlcyBiZWxvdwogCSAqIGFuZCB0aGUgcm9vdC4gIFRoaXMgaXMgd2hlcmUgdGhlIGRlZmF1bHQgaGFuZGxlcnMKIAkgKiBnZXQgcGxhY2VkLgogCSAqLwotCWlmICgobm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfREVWSUNFKSAgICAgJiYKLQkJKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1BST0NFU1NPUikgICYmCi0JCShub2RlLT50eXBlICE9IEFDUElfVFlQRV9USEVSTUFMKSAgICAmJgotCQkobm9kZSAhPSBhY3BpX2dibF9yb290X25vZGUpKSB7CisJaWYgKChub2RlLT50eXBlICE9IEFDUElfVFlQRV9ERVZJQ0UpICYmCisJICAgIChub2RlLT50eXBlICE9IEFDUElfVFlQRV9QUk9DRVNTT1IpICYmCisJICAgIChub2RlLT50eXBlICE9IEFDUElfVFlQRV9USEVSTUFMKSAmJiAobm9kZSAhPSBhY3BpX2dibF9yb290X25vZGUpKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KQEAgLTgwNywzMiArNzkzLDMyIEBACiAJCXN3aXRjaCAoc3BhY2VfaWQpIHsKIAkJY2FzZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZOgogCQkJaGFuZGxlciA9IGFjcGlfZXhfc3lzdGVtX21lbW9yeV9zcGFjZV9oYW5kbGVyOwotCQkJc2V0dXAgICA9IGFjcGlfZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXA7CisJCQlzZXR1cCA9IGFjcGlfZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXA7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTzoKIAkJCWhhbmRsZXIgPSBhY3BpX2V4X3N5c3RlbV9pb19zcGFjZV9oYW5kbGVyOwotCQkJc2V0dXAgICA9IGFjcGlfZXZfaW9fc3BhY2VfcmVnaW9uX3NldHVwOworCQkJc2V0dXAgPSBhY3BpX2V2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9BRFJfU1BBQ0VfUENJX0NPTkZJRzoKIAkJCWhhbmRsZXIgPSBhY3BpX2V4X3BjaV9jb25maWdfc3BhY2VfaGFuZGxlcjsKLQkJCXNldHVwICAgPSBhY3BpX2V2X3BjaV9jb25maWdfcmVnaW9uX3NldHVwOworCQkJc2V0dXAgPSBhY3BpX2V2X3BjaV9jb25maWdfcmVnaW9uX3NldHVwOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0FEUl9TUEFDRV9DTU9TOgogCQkJaGFuZGxlciA9IGFjcGlfZXhfY21vc19zcGFjZV9oYW5kbGVyOwotCQkJc2V0dXAgICA9IGFjcGlfZXZfY21vc19yZWdpb25fc2V0dXA7CisJCQlzZXR1cCA9IGFjcGlfZXZfY21vc19yZWdpb25fc2V0dXA7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfQURSX1NQQUNFX1BDSV9CQVJfVEFSR0VUOgogCQkJaGFuZGxlciA9IGFjcGlfZXhfcGNpX2Jhcl9zcGFjZV9oYW5kbGVyOwotCQkJc2V0dXAgICA9IGFjcGlfZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXA7CisJCQlzZXR1cCA9IGFjcGlfZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXA7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfQURSX1NQQUNFX0RBVEFfVEFCTEU6CiAJCQloYW5kbGVyID0gYWNwaV9leF9kYXRhX3RhYmxlX3NwYWNlX2hhbmRsZXI7Ci0JCQlzZXR1cCAgID0gTlVMTDsKKwkJCXNldHVwID0gTlVMTDsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC04NDksNyArODM1LDcgQEAKIAogCS8qIENoZWNrIGZvciBhbiBleGlzdGluZyBpbnRlcm5hbCBvYmplY3QgKi8KIAotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAob2JqX2Rlc2MpIHsKIAkJLyoKIAkJICogVGhlIGF0dGFjaGVkIGRldmljZSBvYmplY3QgYWxyZWFkeSBleGlzdHMuCkBAIC04NjMsNyArODQ5LDggQEAKIAkJCS8qIFNhbWUgc3BhY2VfaWQgaW5kaWNhdGVzIGEgaGFuZGxlciBhbHJlYWR5IGluc3RhbGxlZCAqLwogCiAJCQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQgPT0gc3BhY2VfaWQpIHsKLQkJCQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuaGFuZGxlciA9PSBoYW5kbGVyKSB7CisJCQkJaWYgKGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmhhbmRsZXIgPT0KKwkJCQkgICAgaGFuZGxlcikgewogCQkJCQkvKgogCQkJCQkgKiBJdCBpcyAocmVsYXRpdmVseSkgT0sgdG8gYXR0ZW1wdCB0byBpbnN0YWxsIHRoZSBTQU1FCiAJCQkJCSAqIGhhbmRsZXIgdHdpY2UuIFRoaXMgY2FuIGVhc2lseSBoYXBwZW4KQEAgLTg3MSw4ICs4NTgsNyBAQAogCQkJCQkgKi8KIAkJCQkJc3RhdHVzID0gQUVfU0FNRV9IQU5ETEVSOwogCQkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJCQl9Ci0JCQkJZWxzZSB7CisJCQkJfSBlbHNlIHsKIAkJCQkJLyogQSBoYW5kbGVyIGlzIGFscmVhZHkgaW5zdGFsbGVkICovCiAKIAkJCQkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7CkBAIC04ODQsMjEgKzg3MCwyMCBAQAogCiAJCQloYW5kbGVyX29iaiA9IGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5leHQ7CiAJCX0KLQl9Ci0JZWxzZSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX09QUkVHSU9OLAotCQkJIkNyZWF0aW5nIG9iamVjdCBvbiBEZXZpY2UgJXAgd2hpbGUgaW5zdGFsbGluZyBoYW5kbGVyXG4iLCBub2RlKSk7CisJfSBlbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKKwkJCQkgICJDcmVhdGluZyBvYmplY3Qgb24gRGV2aWNlICVwIHdoaWxlIGluc3RhbGxpbmcgaGFuZGxlclxuIiwKKwkJCQkgIG5vZGUpKTsKIAogCQkvKiBvYmpfZGVzYyBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIG9uZSAqLwogCiAJCWlmIChub2RlLT50eXBlID09IEFDUElfVFlQRV9BTlkpIHsKIAkJCXR5cGUgPSBBQ1BJX1RZUEVfREVWSUNFOwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJdHlwZSA9IG5vZGUtPnR5cGU7CiAJCX0KIAotCQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAodHlwZSk7CisJCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KHR5cGUpOwogCQlpZiAoIW9ial9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTkxMCwyMSArODk1LDIxIEBACiAKIAkJLyogQXR0YWNoIHRoZSBuZXcgb2JqZWN0IHRvIHRoZSBOb2RlICovCiAKLQkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChub2RlLCBvYmpfZGVzYywgdHlwZSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdChub2RlLCBvYmpfZGVzYywgdHlwZSk7CiAKIAkJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfT1BSRUdJT04sCi0JCSJJbnN0YWxsaW5nIGFkZHJlc3MgaGFuZGxlciBmb3IgcmVnaW9uICVzKCVYKSBvbiBEZXZpY2UgJTQuNHMgJXAoJXApXG4iLAotCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAoc3BhY2VfaWQpLCBzcGFjZV9pZCwKLQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChub2RlKSwgbm9kZSwgb2JqX2Rlc2MpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJICAiSW5zdGFsbGluZyBhZGRyZXNzIGhhbmRsZXIgZm9yIHJlZ2lvbiAlcyglWCkgb24gRGV2aWNlICU0LjRzICVwKCVwKVxuIiwKKwkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUoc3BhY2VfaWQpLCBzcGFjZV9pZCwKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLCBub2RlLCBvYmpfZGVzYykpOwogCiAJLyoKIAkgKiBJbnN0YWxsIHRoZSBoYW5kbGVyCkBAIC05MzMsNyArOTE4LDggQEAKIAkgKiBKdXN0IGFsbG9jYXRlIHRoZSBvYmplY3QgZm9yIHRoZSBoYW5kbGVyIGFuZCBsaW5rIGl0CiAJICogaW50byB0aGUgbGlzdC4KIAkgKi8KLQloYW5kbGVyX29iaiA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0xPQ0FMX0FERFJFU1NfSEFORExFUik7CisJaGFuZGxlcl9vYmogPQorCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0xPQ0FMX0FERFJFU1NfSEFORExFUik7CiAJaWYgKCFoYW5kbGVyX29iaikgewogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtOTQxLDE3ICs5MjcsMTcgQEAKIAogCS8qIEluaXQgaGFuZGxlciBvYmogKi8KIAotCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkICA9ICh1OCkgc3BhY2VfaWQ7Ci0JaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuaGZsYWdzICAgID0gZmxhZ3M7CisJaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQgPSAodTgpIHNwYWNlX2lkOworCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmhmbGFncyA9IGZsYWdzOwogCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0ID0gTlVMTDsKLQloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5ub2RlICAgICAgPSBub2RlOwotCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmhhbmRsZXIgICA9IGhhbmRsZXI7Ci0JaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuY29udGV4dCAgID0gY29udGV4dDsKLQloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zZXR1cCAgICAgPSBzZXR1cDsKKwloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5ub2RlID0gbm9kZTsKKwloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5oYW5kbGVyID0gaGFuZGxlcjsKKwloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5jb250ZXh0ID0gY29udGV4dDsKKwloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zZXR1cCA9IHNldHVwOwogCiAJLyogSW5zdGFsbCBhdCBoZWFkIG9mIERldmljZS5hZGRyZXNzX3NwYWNlIGxpc3QgKi8KIAotCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5leHQgICAgICA9IG9ial9kZXNjLT5kZXZpY2UuaGFuZGxlcjsKKwloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5uZXh0ID0gb2JqX2Rlc2MtPmRldmljZS5oYW5kbGVyOwogCiAJLyoKIAkgKiBUaGUgRGV2aWNlIG9iamVjdCBpcyB0aGUgZmlyc3QgcmVmZXJlbmNlIG9uIHRoZSBoYW5kbGVyX29iai4KQEAgLTk3MSwxNSArOTU3LDE1IEBACiAJICogSW4gZWl0aGVyIGNhc2UsIGJhY2sgdXAgYW5kIHNlYXJjaCBkb3duIHRoZSByZW1haW5kZXIKIAkgKiBvZiB0aGUgYnJhbmNoCiAJICovCi0Jc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZSAoQUNQSV9UWVBFX0FOWSwgbm9kZSwgQUNQSV9VSU5UMzJfTUFYLAotCQkJICBBQ1BJX05TX1dBTEtfVU5MT0NLLCBhY3BpX2V2X2luc3RhbGxfaGFuZGxlciwKLQkJCSAgaGFuZGxlcl9vYmosIE5VTEwpOworCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0FOWSwgbm9kZSwgQUNQSV9VSU5UMzJfTUFYLAorCQkJCQlBQ1BJX05TX1dBTEtfVU5MT0NLLAorCQkJCQlhY3BpX2V2X2luc3RhbGxfaGFuZGxlciwgaGFuZGxlcl9vYmosCisJCQkJCU5VTEwpOwogCi11bmxvY2tfYW5kX2V4aXQ6Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcwpAQCAtOTk1LDE1ICs5ODEsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZHMgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9hZHJfc3BhY2VfdHlwZSAgICAgICAgICAgICBzcGFjZV9pZCkKK2FjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICBhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2V4ZWN1dGVfcmVnX21ldGhvZHMiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2V4ZWN1dGVfcmVnX21ldGhvZHMiKTsKIAogCS8qCiAJICogUnVuIGFsbCBfUkVHIG1ldGhvZHMgZm9yIGFsbCBPcGVyYXRpb24gUmVnaW9ucyBmb3IgdGhpcwpAQCAtMTAxMiwxNCArOTk1LDEzIEBACiAJICogbXVzdCBiZSBpbnN0YWxsZWQgZm9yIGFsbCByZWdpb25zIG9mIHRoaXMgU3BhY2UgSUQgYmVmb3JlIHdlCiAJICogY2FuIHJ1biBhbnkgX1JFRyBtZXRob2RzKQogCSAqLwotCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgKEFDUElfVFlQRV9BTlksIG5vZGUsIEFDUElfVUlOVDMyX01BWCwKLQkJCSAgQUNQSV9OU19XQUxLX1VOTE9DSywgYWNwaV9ldl9yZWdfcnVuLAotCQkJICAmc3BhY2VfaWQsIE5VTEwpOworCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0FOWSwgbm9kZSwgQUNQSV9VSU5UMzJfTUFYLAorCQkJCQlBQ1BJX05TX1dBTEtfVU5MT0NLLCBhY3BpX2V2X3JlZ19ydW4sCisJCQkJCSZzcGFjZV9pZCwgTlVMTCk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9yZWdfcnVuCkBAIC0xMDMxLDIzICsxMDEzLDE5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfcmVnX3J1biAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKQorYWNwaV9ldl9yZWdfcnVuKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfYWRyX3NwYWNlX3R5cGUgICAgICAgICAgICAgc3BhY2VfaWQ7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9hZHJfc3BhY2VfdHlwZSBzcGFjZV9pZDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCXNwYWNlX2lkID0gKkFDUElfQ0FTVF9QVFIgKGFjcGlfYWRyX3NwYWNlX3R5cGUsIGNvbnRleHQpOworCXNwYWNlX2lkID0gKkFDUElfQ0FTVF9QVFIoYWNwaV9hZHJfc3BhY2VfdHlwZSwgY29udGV4dCk7CiAKIAkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgZGV2aWNlIGhhbmRsZSAqLwogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChvYmpfaGFuZGxlKTsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7CiAJaWYgKCFub2RlKSB7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQpAQCAtMTA1NiwxNCArMTAzNCwxMyBAQAogCSAqIFdlIG9ubHkgY2FyZSBhYm91dCByZWdpb25zLmFuZCBvYmplY3RzCiAJICogdGhhdCBhcmUgYWxsb3dlZCB0byBoYXZlIGFkZHJlc3Mgc3BhY2UgaGFuZGxlcnMKIAkgKi8KLQlpZiAoKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1JFR0lPTikgJiYKLQkJKG5vZGUgIT0gYWNwaV9nYmxfcm9vdF9ub2RlKSkgeworCWlmICgobm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfUkVHSU9OKSAmJiAobm9kZSAhPSBhY3BpX2dibF9yb290X25vZGUpKSB7CiAJCXJldHVybiAoQUVfT0spOwogCX0KIAogCS8qIENoZWNrIGZvciBhbiBleGlzdGluZyBpbnRlcm5hbCBvYmplY3QgKi8KIAotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAoIW9ial9kZXNjKSB7CiAJCS8qIE5vIG9iamVjdCwganVzdCBleGl0ICovCiAKQEAgLTEwODAsNyArMTA1Nyw2IEBACiAJCXJldHVybiAoQUVfT0spOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kIChvYmpfZGVzYywgMSk7CisJc3RhdHVzID0gYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2Qob2JqX2Rlc2MsIDEpOwogCXJldHVybiAoc3RhdHVzKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jCmluZGV4IDk1YmMwOWMuLmExYmQyZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMKQEAgLTQxLDE0ICs0MSwxMiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXZyZ25pbmkiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJldnJnbmluaSIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjQsMzQgKzYyLDMxIEBACiAgKiBERVNDUklQVElPTjogU2V0dXAgYSBzeXN0ZW1fbWVtb3J5IG9wZXJhdGlvbiByZWdpb24KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9zeXN0ZW1fbWVtb3J5X3JlZ2lvbl9zZXR1cCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlZ2lvbl9jb250ZXh0KQorYWNwaV9ldl9zeXN0ZW1fbWVtb3J5X3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJICAgdTMyIGZ1bmN0aW9uLAorCQkJCSAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9kZXNjID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikgaGFuZGxlOwotCXN0cnVjdCBhY3BpX21lbV9zcGFjZV9jb250ZXh0ICAgKmxvY2FsX3JlZ2lvbl9jb250ZXh0OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9kZXNjID0KKwkgICAgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiloYW5kbGU7CisJc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQgKmxvY2FsX3JlZ2lvbl9jb250ZXh0OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXAiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3N5c3RlbV9tZW1vcnlfcmVnaW9uX3NldHVwIik7CiAKIAlpZiAoZnVuY3Rpb24gPT0gQUNQSV9SRUdJT05fREVBQ1RJVkFURSkgewogCQlpZiAoKnJlZ2lvbl9jb250ZXh0KSB7Ci0JCQlBQ1BJX01FTV9GUkVFICgqcmVnaW9uX2NvbnRleHQpOworCQkJQUNQSV9NRU1fRlJFRSgqcmVnaW9uX2NvbnRleHQpOwogCQkJKnJlZ2lvbl9jb250ZXh0ID0gTlVMTDsKIAkJfQotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBDcmVhdGUgYSBuZXcgY29udGV4dCAqLwogCi0JbG9jYWxfcmVnaW9uX2NvbnRleHQgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKHNpemVvZiAoc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQpKTsKKwlsb2NhbF9yZWdpb25fY29udGV4dCA9CisJICAgIEFDUElfTUVNX0NBTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQpKTsKIAlpZiAoIShsb2NhbF9yZWdpb25fY29udGV4dCkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBTYXZlIHRoZSByZWdpb24gbGVuZ3RoIGFuZCBhZGRyZXNzIGZvciB1c2UgaW4gdGhlIGhhbmRsZXIgKi8KQEAgLTEwMCwxMCArOTUsOSBAQAogCWxvY2FsX3JlZ2lvbl9jb250ZXh0LT5hZGRyZXNzID0gcmVnaW9uX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzOwogCiAJKnJlZ2lvbl9jb250ZXh0ID0gbG9jYWxfcmVnaW9uX2NvbnRleHQ7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cApAQCAtMTIwLDI2ICsxMTQsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlZ2lvbl9jb250ZXh0KQorYWNwaV9ldl9pb19zcGFjZV9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICAgdTMyIGZ1bmN0aW9uLAorCQkJICAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW9fc3BhY2VfcmVnaW9uX3NldHVwIik7CiAKIAlpZiAoZnVuY3Rpb24gPT0gQUNQSV9SRUdJT05fREVBQ1RJVkFURSkgewogCQkqcmVnaW9uX2NvbnRleHQgPSBOVUxMOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkqcmVnaW9uX2NvbnRleHQgPSBoYW5kbGVyX2NvbnRleHQ7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3BjaV9jb25maWdfcmVnaW9uX3NldHVwCkBAIC0xNTgsMjQgKzE0NywyMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXAgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZWdpb25fY29udGV4dCkKK2FjcGlfZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJCXUzMiBmdW5jdGlvbiwKKwkJCQl2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgcGNpX3ZhbHVlOwotCXN0cnVjdCBhY3BpX3BjaV9pZCAgICAgICAgICAgICAgKnBjaV9pZCA9ICpyZWdpb25fY29udGV4dDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpoYW5kbGVyX29iajsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwY2lfcm9vdF9ub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmogPSAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICopIGhhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgICAgICAgICAgIG9iamVjdF9oSUQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9pbnRlZ2VyIHBjaV92YWx1ZTsKKwlzdHJ1Y3QgYWNwaV9wY2lfaWQgKnBjaV9pZCA9ICpyZWdpb25fY29udGV4dDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBjaV9yb290X25vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiA9CisJICAgICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopaGFuZGxlOworCXN0cnVjdCBhY3BpX2RldmljZV9pZCBvYmplY3RfaElEOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXAiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3BjaV9jb25maWdfcmVnaW9uX3NldHVwIik7CiAKIAloYW5kbGVyX29iaiA9IHJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyOwogCWlmICghaGFuZGxlcl9vYmopIHsKQEAgLTE4MywyMCArMTY5LDIxIEBACiAJCSAqIE5vIGluc3RhbGxlZCBoYW5kbGVyLiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYmVjYXVzZSB0aGUgZGlzcGF0Y2gKIAkJICogcm91dGluZSBjaGVja3MgYmVmb3JlIHdlIGdldCBoZXJlLCBidXQgd2UgY2hlY2sgYWdhaW4ganVzdCBpbiBjYXNlLgogCQkgKi8KLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfT1BSRUdJT04sCi0JCQkiQXR0ZW1wdGluZyB0byBpbml0IGEgcmVnaW9uICVwLCB3aXRoIG5vIGhhbmRsZXJcbiIsIHJlZ2lvbl9vYmopKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRVhJU1QpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJCSAgIkF0dGVtcHRpbmcgdG8gaW5pdCBhIHJlZ2lvbiAlcCwgd2l0aCBubyBoYW5kbGVyXG4iLAorCQkJCSAgcmVnaW9uX29iaikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKIAl9CiAKIAkqcmVnaW9uX2NvbnRleHQgPSBOVUxMOwogCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSB7CiAJCWlmIChwY2lfaWQpIHsKLQkJCUFDUElfTUVNX0ZSRUUgKHBjaV9pZCk7CisJCQlBQ1BJX01FTV9GUkVFKHBjaV9pZCk7CiAJCX0KLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlIChyZWdpb25fb2JqLT5yZWdpb24ubm9kZSk7CisJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShyZWdpb25fb2JqLT5yZWdpb24ubm9kZSk7CiAKIAkvKgogCSAqIEdldCB0aGUgX1NFRyBhbmQgX0JCTiB2YWx1ZXMgZnJvbSB0aGUgZGV2aWNlIHVwb24gd2hpY2ggdGhlIGhhbmRsZXIKQEAgLTIxNiwxOCArMjAzLDI4IEBACiAKIAkJcGNpX3Jvb3Rfbm9kZSA9IHBhcmVudF9ub2RlOwogCQl3aGlsZSAocGNpX3Jvb3Rfbm9kZSAhPSBhY3BpX2dibF9yb290X25vZGUpIHsKLQkJCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9ISUQgKHBjaV9yb290X25vZGUsICZvYmplY3RfaElEKTsKLQkJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJCQkvKiBHb3QgYSB2YWxpZCBfSElELCBjaGVjayBpZiB0aGlzIGlzIGEgUENJIHJvb3QgKi8KLQotCQkJCWlmICghKEFDUElfU1RSTkNNUCAob2JqZWN0X2hJRC52YWx1ZSwgUENJX1JPT1RfSElEX1NUUklORywKLQkJCQkJCSAgIHNpemVvZiAoUENJX1JPT1RfSElEX1NUUklORykpKSkgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3V0X2V4ZWN1dGVfSElEKHBjaV9yb290X25vZGUsICZvYmplY3RfaElEKTsKKwkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCS8qCisJCQkJICogR290IGEgdmFsaWQgX0hJRCBzdHJpbmcsIGNoZWNrIGlmIHRoaXMgaXMgYSBQQ0kgcm9vdC4KKwkJCQkgKiBOZXcgZm9yIEFDUEkgMy4wOiBjaGVjayBmb3IgYSBQQ0kgRXhwcmVzcyByb290IGFsc28uCisJCQkJICovCisJCQkJaWYgKCEKKwkJCQkgICAgKEFDUElfU1RSTkNNUAorCQkJCSAgICAgKG9iamVjdF9oSUQudmFsdWUsIFBDSV9ST09UX0hJRF9TVFJJTkcsCisJCQkJICAgICAgc2l6ZW9mKFBDSV9ST09UX0hJRF9TVFJJTkcpKQorCQkJCSAgICAgfHwKKwkJCQkgICAgICEoQUNQSV9TVFJOQ01QCisJCQkJICAgICAgIChvYmplY3RfaElELnZhbHVlLAorCQkJCQlQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcsCisJCQkJCXNpemVvZihQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcpKSkpKQorCQkJCXsKIAkJCQkJLyogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIHRoaXMgUENJIHJvb3QgYnJpZGdlICovCiAKLQkJCQkJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlciAoKGFjcGlfaGFuZGxlKSBwY2lfcm9vdF9ub2RlLAotCQkJCQkJCSAgIEFDUElfQURSX1NQQUNFX1BDSV9DT05GSUcsCi0JCQkJCQkJICAgQUNQSV9ERUZBVUxUX0hBTkRMRVIsIE5VTEwsIE5VTEwpOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKChhY3BpX2hhbmRsZSkgcGNpX3Jvb3Rfbm9kZSwgQUNQSV9BRFJfU1BBQ0VfUENJX0NPTkZJRywgQUNQSV9ERUZBVUxUX0hBTkRMRVIsIE5VTEwsIE5VTEwpOworCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkJCWlmIChzdGF0dXMgPT0gQUVfU0FNRV9IQU5ETEVSKSB7CiAJCQkJCQkJLyoKIAkJCQkJCQkgKiBJdCBpcyBPSyBpZiB0aGUgaGFuZGxlciBpcyBhbHJlYWR5IGluc3RhbGxlZCBvbiB0aGUgcm9vdApAQCAtMjM1LDIzICsyMzIsMTkgQEAKIAkJCQkJCQkgKiBuZXcgUENJX0NvbmZpZyBvcGVyYXRpb24gcmVnaW9uLCBob3dldmVyLgogCQkJCQkJCSAqLwogCQkJCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkJCQkJIkNvdWxkIG5vdCBpbnN0YWxsIHBjaV9jb25maWcgaGFuZGxlciBmb3IgUm9vdCBCcmlkZ2UgJTQuNHMsICVzXG4iLAotCQkJCQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHBjaV9yb290X25vZGUpLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgaW5zdGFsbCBwY2lfY29uZmlnIGhhbmRsZXIgZm9yIFJvb3QgQnJpZGdlICU0LjRzLCAlc1xuIiwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHBjaV9yb290X25vZGUpLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQkJCQkJfQogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KIAotCQkJcGNpX3Jvb3Rfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlIChwY2lfcm9vdF9ub2RlKTsKKwkJCXBjaV9yb290X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShwY2lfcm9vdF9ub2RlKTsKIAkJfQogCiAJCS8qIFBDSSByb290IGJyaWRnZSBub3QgZm91bmQsIHVzZSBuYW1lc3BhY2Ugcm9vdCBub2RlICovCi0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCXBjaV9yb290X25vZGUgPSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5ub2RlOwogCX0KIApAQCAtMjYwLDE0ICsyNTMsMTQgQEAKIAkgKiAoaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIgY291bGQgaGF2ZSBpbml0aWFsaXplZCBpdCkKIAkgKi8KIAlpZiAocmVnaW9uX29iai0+cmVnaW9uLmZsYWdzICYgQU9QT0JKX1NFVFVQX0NPTVBMRVRFKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIFJlZ2lvbiBpcyBzdGlsbCBub3QgaW5pdGlhbGl6ZWQuIENyZWF0ZSBhIG5ldyBjb250ZXh0ICovCiAKLQlwY2lfaWQgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKHNpemVvZiAoc3RydWN0IGFjcGlfcGNpX2lkKSk7CisJcGNpX2lkID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV9wY2lfaWQpKTsKIAlpZiAoIXBjaV9pZCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCS8qCkBAIC0yNzksNDAgKzI3Miw0NSBAQAogCSAqIEdldCB0aGUgUENJIGRldmljZSBhbmQgZnVuY3Rpb24gbnVtYmVycyBmcm9tIHRoZSBfQURSIG9iamVjdAogCSAqIGNvbnRhaW5lZCBpbiB0aGUgcGFyZW50J3Mgc2NvcGUuCiAJICovCi0Jc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdCAoTUVUSE9EX05BTUVfX0FEUiwgcGFyZW50X25vZGUsICZwY2lfdmFsdWUpOworCXN0YXR1cyA9CisJICAgIGFjcGlfdXRfZXZhbHVhdGVfbnVtZXJpY19vYmplY3QoTUVUSE9EX05BTUVfX0FEUiwgcGFyZW50X25vZGUsCisJCQkJCSAgICAmcGNpX3ZhbHVlKTsKIAogCS8qCiAJICogVGhlIGRlZmF1bHQgaXMgemVybywgYW5kIHNpbmNlIHRoZSBhbGxvY2F0aW9uIGFib3ZlIHplcm9lZAogCSAqIHRoZSBkYXRhLCBqdXN0IGRvIG5vdGhpbmcgb24gZmFpbHVyZS4KIAkgKi8KLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCXBjaV9pZC0+ZGV2aWNlICA9IEFDUElfSElXT1JEIChBQ1BJX0xPRFdPUkQgKHBjaV92YWx1ZSkpOwotCQlwY2lfaWQtPmZ1bmN0aW9uID0gQUNQSV9MT1dPUkQgKEFDUElfTE9EV09SRCAocGNpX3ZhbHVlKSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXBjaV9pZC0+ZGV2aWNlID0gQUNQSV9ISVdPUkQoQUNQSV9MT0RXT1JEKHBjaV92YWx1ZSkpOworCQlwY2lfaWQtPmZ1bmN0aW9uID0gQUNQSV9MT1dPUkQoQUNQSV9MT0RXT1JEKHBjaV92YWx1ZSkpOwogCX0KIAogCS8qIFRoZSBQQ0kgc2VnbWVudCBudW1iZXIgY29tZXMgZnJvbSB0aGUgX1NFRyBtZXRob2QgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfbnVtZXJpY19vYmplY3QgKE1FVEhPRF9OQU1FX19TRUcsIHBjaV9yb290X25vZGUsICZwY2lfdmFsdWUpOwotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJcGNpX2lkLT5zZWdtZW50ID0gQUNQSV9MT1dPUkQgKHBjaV92YWx1ZSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdChNRVRIT0RfTkFNRV9fU0VHLCBwY2lfcm9vdF9ub2RlLAorCQkJCQkgICAgJnBjaV92YWx1ZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXBjaV9pZC0+c2VnbWVudCA9IEFDUElfTE9XT1JEKHBjaV92YWx1ZSk7CiAJfQogCiAJLyogVGhlIFBDSSBidXMgbnVtYmVyIGNvbWVzIGZyb20gdGhlIF9CQk4gbWV0aG9kICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0IChNRVRIT0RfTkFNRV9fQkJOLCBwY2lfcm9vdF9ub2RlLCAmcGNpX3ZhbHVlKTsKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCXBjaV9pZC0+YnVzID0gQUNQSV9MT1dPUkQgKHBjaV92YWx1ZSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdChNRVRIT0RfTkFNRV9fQkJOLCBwY2lfcm9vdF9ub2RlLAorCQkJCQkgICAgJnBjaV92YWx1ZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXBjaV9pZC0+YnVzID0gQUNQSV9MT1dPUkQocGNpX3ZhbHVlKTsKIAl9CiAKIAkvKiBDb21wbGV0ZSB0aGlzIGRldmljZSdzIHBjaV9pZCAqLwogCi0JYWNwaV9vc19kZXJpdmVfcGNpX2lkIChwY2lfcm9vdF9ub2RlLCByZWdpb25fb2JqLT5yZWdpb24ubm9kZSwgJnBjaV9pZCk7CisJYWNwaV9vc19kZXJpdmVfcGNpX2lkKHBjaV9yb290X25vZGUsIHJlZ2lvbl9vYmotPnJlZ2lvbi5ub2RlLCAmcGNpX2lkKTsKIAogCSpyZWdpb25fY29udGV4dCA9IHBjaV9pZDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXAKQEAgLTMzMSwxOSArMzI5LDE1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlZ2lvbl9jb250ZXh0KQorYWNwaV9ldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkgICAgIHUzMiBmdW5jdGlvbiwKKwkJCSAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X3BjaV9iYXJfcmVnaW9uX3NldHVwIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXAiKTsKIAotCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2Ntb3NfcmVnaW9uX3NldHVwCkBAIC0zNjIsMTkgKzM1NiwxNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfY21vc19yZWdpb25fc2V0dXAgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZWdpb25fY29udGV4dCkKK2FjcGlfZXZfY21vc19yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICB1MzIgZnVuY3Rpb24sCisJCQkgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9jbW9zX3JlZ2lvbl9zZXR1cCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2Ntb3NfcmVnaW9uX3NldHVwIik7CiAKLQotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9kZWZhdWx0X3JlZ2lvbl9zZXR1cApAQCAtMzkxLDI2ICszODEsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2RlZmF1bHRfcmVnaW9uX3NldHVwICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVnaW9uX2NvbnRleHQpCithY3BpX2V2X2RlZmF1bHRfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCSAgICAgdTMyIGZ1bmN0aW9uLAorCQkJICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCkKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfZGVmYXVsdF9yZWdpb25fc2V0dXAiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2RlZmF1bHRfcmVnaW9uX3NldHVwIik7CiAKIAlpZiAoZnVuY3Rpb24gPT0gQUNQSV9SRUdJT05fREVBQ1RJVkFURSkgewogCQkqcmVnaW9uX2NvbnRleHQgPSBOVUxMOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkqcmVnaW9uX2NvbnRleHQgPSBoYW5kbGVyX2NvbnRleHQ7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luaXRpYWxpemVfcmVnaW9uCkBAIC00MzQsMzcgKzQxOSwzNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmosCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX25zX2xvY2tlZCkKK2FjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKKwkJCSAgdTggYWNwaV9uc19sb2NrZWQpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaGFuZGxlcl9vYmo7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9hZHJfc3BhY2VfdHlwZSAgICAgICAgICAgICBzcGFjZV9pZDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm1ldGhvZF9ub2RlOwotCWFjcGlfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgKnJlZ19uYW1lX3B0ciA9IChhY3BpX25hbWUgKikgTUVUSE9EX05BTUVfX1JFRzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZWdpb25fb2JqMjsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGU7CisJYWNwaV9uYW1lICpyZWdfbmFtZV9wdHIgPSAoYWNwaV9uYW1lICopIE1FVEhPRF9OQU1FX19SRUc7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iajI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgiZXZfaW5pdGlhbGl6ZV9yZWdpb24iLCBhY3BpX25zX2xvY2tlZCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigiZXZfaW5pdGlhbGl6ZV9yZWdpb24iLCBhY3BpX25zX2xvY2tlZCk7CiAKIAlpZiAoIXJlZ2lvbl9vYmopIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCWlmIChyZWdpb25fb2JqLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfT0JKRUNUX0lOSVRJQUxJWkVEKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAotCXJlZ2lvbl9vYmoyID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdCAocmVnaW9uX29iaik7CisJcmVnaW9uX29iajIgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KHJlZ2lvbl9vYmopOwogCWlmICghcmVnaW9uX29iajIpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRVhJU1QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKIAl9CiAKLQlub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKHJlZ2lvbl9vYmotPnJlZ2lvbi5ub2RlKTsKKwlub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocmVnaW9uX29iai0+cmVnaW9uLm5vZGUpOwogCXNwYWNlX2lkID0gcmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkOwogCiAJLyogU2V0dXAgZGVmYXVsdHMgKi8KQEAgLTQ3Niw5ICs0NTgsOSBAQAogCiAJLyogRmluZCBhbnkgIl9SRUciIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWdpb24gZGVmaW5pdGlvbiAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19zZWFyY2hfbm9kZSAoKnJlZ19uYW1lX3B0ciwgbm9kZSwKLQkJCSAgQUNQSV9UWVBFX01FVEhPRCwgJm1ldGhvZF9ub2RlKTsKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9uc19zZWFyY2hfbm9kZSgqcmVnX25hbWVfcHRyLCBub2RlLAorCQkJCSAgICAgQUNQSV9UWVBFX01FVEhPRCwgJm1ldGhvZF9ub2RlKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJLyoKIAkJICogVGhlIF9SRUcgbWV0aG9kIGlzIG9wdGlvbmFsIGFuZCB0aGVyZSBjYW4gYmUgb25seSBvbmUgcGVyIHJlZ2lvbgogCQkgKiBkZWZpbml0aW9uLiAgVGhpcyB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGhhbmRsZXIgaXMgYXR0YWNoZWQKQEAgLTQ5NSw3ICs0NzcsNyBAQAogCQkvKiBDaGVjayB0byBzZWUgaWYgYSBoYW5kbGVyIGV4aXN0cyAqLwogCiAJCWhhbmRsZXJfb2JqID0gTlVMTDsKLQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAkJaWYgKG9ial9kZXNjKSB7CiAJCQkvKiBDYW4gb25seSBiZSBhIGhhbmRsZXIgaWYgdGhlIG9iamVjdCBleGlzdHMgKi8KIApAQCAtNTIzLDM3ICs1MDUsNTAgQEAKIAkJCXdoaWxlIChoYW5kbGVyX29iaikgewogCQkJCS8qIElzIHRoaXMgaGFuZGxlciBvZiB0aGUgY29ycmVjdCB0eXBlPyAqLwogCi0JCQkJaWYgKGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkID09IHNwYWNlX2lkKSB7CisJCQkJaWYgKGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkID09CisJCQkJICAgIHNwYWNlX2lkKSB7CiAJCQkJCS8qIEZvdW5kIGNvcnJlY3QgaGFuZGxlciAqLwogCi0JCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX09QUkVHSU9OLAotCQkJCQkJIkZvdW5kIGhhbmRsZXIgJXAgZm9yIHJlZ2lvbiAlcCBpbiBvYmogJXBcbiIsCi0JCQkJCQloYW5kbGVyX29iaiwgcmVnaW9uX29iaiwgb2JqX2Rlc2MpKTsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKKwkJCQkJCQkgICJGb3VuZCBoYW5kbGVyICVwIGZvciByZWdpb24gJXAgaW4gb2JqICVwXG4iLAorCQkJCQkJCSAgaGFuZGxlcl9vYmosCisJCQkJCQkJICByZWdpb25fb2JqLAorCQkJCQkJCSAgb2JqX2Rlc2MpKTsKIAotCQkJCQlzdGF0dXMgPSBhY3BpX2V2X2F0dGFjaF9yZWdpb24gKGhhbmRsZXJfb2JqLCByZWdpb25fb2JqLAotCQkJCQkJCSBhY3BpX25zX2xvY2tlZCk7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX2V2X2F0dGFjaF9yZWdpb24oaGFuZGxlcl9vYmosCisJCQkJCQkJCSAgcmVnaW9uX29iaiwKKwkJCQkJCQkJICBhY3BpX25zX2xvY2tlZCk7CiAKIAkJCQkJLyoKIAkJCQkJICogVGVsbCBhbGwgdXNlcnMgdGhhdCB0aGlzIHJlZ2lvbiBpcyB1c2FibGUgYnkgcnVubmluZyB0aGUgX1JFRwogCQkJCQkgKiBtZXRob2QKIAkJCQkJICovCiAJCQkJCWlmIChhY3BpX25zX2xvY2tlZCkgewotCQkJCQkJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQkJCXN0YXR1cyA9CisJCQkJCQkgICAgYWNwaV91dF9yZWxlYXNlX211dGV4CisJCQkJCQkgICAgKEFDUElfTVRYX05BTUVTUEFDRSk7CisJCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMKKwkJCQkJCQkgICAgKHN0YXR1cyk7CiAJCQkJCQl9CiAJCQkJCX0KIAotCQkJCQlzdGF0dXMgPSBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZCAocmVnaW9uX29iaiwgMSk7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZAorCQkJCQkgICAgKHJlZ2lvbl9vYmosIDEpOwogCiAJCQkJCWlmIChhY3BpX25zX2xvY2tlZCkgewotCQkJCQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQkJCXN0YXR1cyA9CisJCQkJCQkgICAgYWNwaV91dF9hY3F1aXJlX211dGV4CisJCQkJCQkgICAgKEFDUElfTVRYX05BTUVTUEFDRSk7CisJCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMKKwkJCQkJCQkgICAgKHN0YXR1cyk7CiAJCQkJCQl9CiAJCQkJCX0KIAotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJCQl9CiAKIAkJCQkvKiBUcnkgbmV4dCBoYW5kbGVyIGluIHRoZSBsaXN0ICovCkBAIC01NjYsMTUgKzU2MSwxNSBAQAogCQkgKiBUaGlzIG5vZGUgZG9lcyBub3QgaGF2ZSB0aGUgaGFuZGxlciB3ZSBuZWVkOwogCQkgKiBQb3AgdXAgb25lIGxldmVsCiAJCSAqLwotCQlub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKG5vZGUpOworCQlub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSk7CiAJfQogCiAJLyogSWYgd2UgZ2V0IGhlcmUsIHRoZXJlIGlzIG5vIGhhbmRsZXIgZm9yIHRoaXMgcmVnaW9uICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9PUFJFR0lPTiwKLQkJIk5vIGhhbmRsZXIgZm9yIHJlZ2lvbl90eXBlICVzKCVYKSAocmVnaW9uX29iaiAlcClcbiIsCi0JCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChzcGFjZV9pZCksIHNwYWNlX2lkLCByZWdpb25fb2JqKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKKwkJCSAgIk5vIGhhbmRsZXIgZm9yIHJlZ2lvbl90eXBlICVzKCVYKSAocmVnaW9uX29iaiAlcClcbiIsCisJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHNwYWNlX2lkKSwgc3BhY2VfaWQsCisJCQkgIHJlZ2lvbl9vYmopKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnNjaS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnNjaS5jCmluZGV4IGYzMTIzYzIuLjE0MTgzNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZzY2kuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2c2NpLmMKQEAgLTQ1LDE2ICs0NSwxMSBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV2c2NpIikKK0FDUElfTU9EVUxFX05BTUUoImV2c2NpIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgdTMyIEFDUElfU1lTVEVNX1hGQUNFCi1hY3BpX2V2X3NjaV94cnVwdF9oYW5kbGVyICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQorc3RhdGljIHUzMiBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X3NjaV94cnVwdF9oYW5kbGVyKHZvaWQgKmNvbnRleHQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY5LDE3ICs2NCwxMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB1MzIgQUNQSV9TWVNURU1fWEZBQ0UKLWFjcGlfZXZfc2NpX3hydXB0X2hhbmRsZXIgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpCitzdGF0aWMgdTMyIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfc2NpX3hydXB0X2hhbmRsZXIodm9pZCAqY29udGV4dCkKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfbGlzdCA9IGNvbnRleHQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfaGFuZGxlZCA9IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwotCisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9saXN0ID0gY29udGV4dDsKKwl1MzIgaW50ZXJydXB0X2hhbmRsZWQgPSBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3NjaV94cnVwdF9oYW5kbGVyIik7CiAKLQogCS8qCiAJICogV2UgYXJlIGd1YXJhbnRlZWQgYnkgdGhlIEFDUEkgQ0EgaW5pdGlhbGl6YXRpb24vc2h1dGRvd24gY29kZSB0aGF0CiAJICogaWYgdGhpcyBpbnRlcnJ1cHQgaGFuZGxlciBpcyBpbnN0YWxsZWQsIEFDUEkgaXMgZW5hYmxlZC4KQEAgLTg5LDE4ICs4MCwxNyBAQAogCSAqIEZpeGVkIEV2ZW50czoKIAkgKiBDaGVjayBmb3IgYW5kIGRpc3BhdGNoIGFueSBGaXhlZCBFdmVudHMgdGhhdCBoYXZlIG9jY3VycmVkCiAJICovCi0JaW50ZXJydXB0X2hhbmRsZWQgfD0gYWNwaV9ldl9maXhlZF9ldmVudF9kZXRlY3QgKCk7CisJaW50ZXJydXB0X2hhbmRsZWQgfD0gYWNwaV9ldl9maXhlZF9ldmVudF9kZXRlY3QoKTsKIAogCS8qCiAJICogR2VuZXJhbCBQdXJwb3NlIEV2ZW50czoKIAkgKiBDaGVjayBmb3IgYW5kIGRpc3BhdGNoIGFueSBHUEVzIHRoYXQgaGF2ZSBvY2N1cnJlZAogCSAqLwotCWludGVycnVwdF9oYW5kbGVkIHw9IGFjcGlfZXZfZ3BlX2RldGVjdCAoZ3BlX3hydXB0X2xpc3QpOworCWludGVycnVwdF9oYW5kbGVkIHw9IGFjcGlfZXZfZ3BlX2RldGVjdChncGVfeHJ1cHRfbGlzdCk7CiAKLQlyZXR1cm5fVkFMVUUgKGludGVycnVwdF9oYW5kbGVkKTsKKwlyZXR1cm5fVkFMVUUoaW50ZXJydXB0X2hhbmRsZWQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ3BlX3hydXB0X2hhbmRsZXIKQEAgLTExMywxNyArMTAzLDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyIEFDUElfU1lTVEVNX1hGQUNFCi1hY3BpX2V2X2dwZV94cnVwdF9oYW5kbGVyICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KQordTMyIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfZ3BlX3hydXB0X2hhbmRsZXIodm9pZCAqY29udGV4dCkKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfbGlzdCA9IGNvbnRleHQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfaGFuZGxlZCA9IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwotCisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9saXN0ID0gY29udGV4dDsKKwl1MzIgaW50ZXJydXB0X2hhbmRsZWQgPSBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2dwZV94cnVwdF9oYW5kbGVyIik7CiAKLQogCS8qCiAJICogV2UgYXJlIGd1YXJhbnRlZWQgYnkgdGhlIEFDUEkgQ0EgaW5pdGlhbGl6YXRpb24vc2h1dGRvd24gY29kZSB0aGF0CiAJICogaWYgdGhpcyBpbnRlcnJ1cHQgaGFuZGxlciBpcyBpbnN0YWxsZWQsIEFDUEkgaXMgZW5hYmxlZC4KQEAgLTEzMywxMiArMTE5LDExIEBACiAJICogR1BFczoKIAkgKiBDaGVjayBmb3IgYW5kIGRpc3BhdGNoIGFueSBHUEVzIHRoYXQgaGF2ZSBvY2N1cnJlZAogCSAqLwotCWludGVycnVwdF9oYW5kbGVkIHw9IGFjcGlfZXZfZ3BlX2RldGVjdCAoZ3BlX3hydXB0X2xpc3QpOworCWludGVycnVwdF9oYW5kbGVkIHw9IGFjcGlfZXZfZ3BlX2RldGVjdChncGVfeHJ1cHRfbGlzdCk7CiAKLQlyZXR1cm5fVkFMVUUgKGludGVycnVwdF9oYW5kbGVkKTsKKwlyZXR1cm5fVkFMVUUoaW50ZXJydXB0X2hhbmRsZWQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbnN0YWxsX3NjaV9oYW5kbGVyCkBAIC0xNTEsMjIgKzEzNiwxOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXUzMgotYWNwaV9ldl9pbnN0YWxsX3NjaV9oYW5kbGVyICgKLQl2b2lkKQordTMyIGFjcGlfZXZfaW5zdGFsbF9zY2lfaGFuZGxlcih2b2lkKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJdTMyIHN0YXR1cyA9IEFFX09LOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5zdGFsbF9zY2lfaGFuZGxlciIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2luc3RhbGxfc2NpX2hhbmRsZXIiKTsKLQotCi0Jc3RhdHVzID0gYWNwaV9vc19pbnN0YWxsX2ludGVycnVwdF9oYW5kbGVyICgodTMyKSBhY3BpX2dibF9GQURULT5zY2lfaW50LAotCQkJICAgYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlciwgYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfb3NfaW5zdGFsbF9pbnRlcnJ1cHRfaGFuZGxlcigodTMyKSBhY3BpX2dibF9GQURULT5zY2lfaW50LAorCQkJCQkJICAgYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlciwKKwkJCQkJCSAgIGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9yZW1vdmVfc2NpX2hhbmRsZXIKQEAgLTE4NiwyMiArMTY3LDE2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfcmVtb3ZlX3NjaV9oYW5kbGVyICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9ldl9yZW1vdmVfc2NpX2hhbmRsZXIodm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9yZW1vdmVfc2NpX2hhbmRsZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3JlbW92ZV9zY2lfaGFuZGxlciIpOwogCiAJLyogSnVzdCBsZXQgdGhlIE9TIHJlbW92ZSB0aGUgaGFuZGxlciBhbmQgZGlzYWJsZSB0aGUgbGV2ZWwgKi8KIAotCXN0YXR1cyA9IGFjcGlfb3NfcmVtb3ZlX2ludGVycnVwdF9oYW5kbGVyICgodTMyKSBhY3BpX2dibF9GQURULT5zY2lfaW50LAotCQkJICAgYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlcik7CisJc3RhdHVzID0gYWNwaV9vc19yZW1vdmVfaW50ZXJydXB0X2hhbmRsZXIoKHUzMikgYWNwaV9nYmxfRkFEVC0+c2NpX2ludCwKKwkJCQkJCSAgYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlcik7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYwppbmRleCA0MDkyZDQ3Li40M2IzM2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYwpAQCAtNDksOCArNDksNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJldnhmYWNlIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiZXZ4ZmFjZSIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjQsMjEgKzYzLDE2IEBACiAgKiBERVNDUklQVElPTjogU2F2ZXMgdGhlIHBvaW50ZXIgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLWFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfZXhjZXB0aW9uX2hhbmRsZXIgKAotCWFjcGlfZXhjZXB0aW9uX2hhbmRsZXIgICAgICAgICAgaGFuZGxlcikKK2FjcGlfc3RhdHVzIGFjcGlfaW5zdGFsbF9leGNlcHRpb25faGFuZGxlcihhY3BpX2V4Y2VwdGlvbl9oYW5kbGVyIGhhbmRsZXIpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9pbnN0YWxsX2V4Y2VwdGlvbl9oYW5kbGVyIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9pbnN0YWxsX2V4Y2VwdGlvbl9oYW5kbGVyIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogRG9uJ3QgYWxsb3cgdHdvIGhhbmRsZXJzLiAqLwpAQCAtOTIsMTIgKzg2LDExIEBACiAKIAlhY3BpX2dibF9leGNlcHRpb25faGFuZGxlciA9IGhhbmRsZXI7CiAKLWNsZWFudXA6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICBjbGVhbnVwOgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTE2LDI2ICsxMDksMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLQlhY3BpX2V2ZW50X2hhbmRsZXIgICAgICAgICAgICAgIGhhbmRsZXIsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCkKK2FjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKHUzMiBldmVudCwKKwkJCQkgYWNwaV9ldmVudF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmNvbnRleHQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyIik7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCiAJaWYgKGV2ZW50ID4gQUNQSV9FVkVOVF9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogRG9uJ3QgYWxsb3cgdHdvIGhhbmRsZXJzLiAqLwpAQCAtMTUwLDI5ICsxMzksMjkgQEAKIAlhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uaGFuZGxlciA9IGhhbmRsZXI7CiAJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmNvbnRleHQgPSBjb250ZXh0OwogCi0Jc3RhdHVzID0gYWNwaV9jbGVhcl9ldmVudCAoZXZlbnQpOworCXN0YXR1cyA9IGFjcGlfY2xlYXJfZXZlbnQoZXZlbnQpOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKLQkJc3RhdHVzID0gYWNwaV9lbmFibGVfZXZlbnQgKGV2ZW50LCAwKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1dBUk4sICJDb3VsZCBub3QgZW5hYmxlIGZpeGVkIGV2ZW50LlxuIikpOworCQlzdGF0dXMgPSBhY3BpX2VuYWJsZV9ldmVudChldmVudCwgMCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkgICJDb3VsZCBub3QgZW5hYmxlIGZpeGVkIGV2ZW50LlxuIikpOwogCiAJCS8qIFJlbW92ZSB0aGUgaGFuZGxlciAqLwogCiAJCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5oYW5kbGVyID0gTlVMTDsKIAkJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmNvbnRleHQgPSBOVUxMOwotCX0KLQllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJCSJFbmFibGVkIGZpeGVkIGV2ZW50ICVYLCBIYW5kbGVyPSVwXG4iLCBldmVudCwgaGFuZGxlcikpOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJFbmFibGVkIGZpeGVkIGV2ZW50ICVYLCBIYW5kbGVyPSVwXG4iLCBldmVudCwKKwkJCQkgIGhhbmRsZXIpKTsKIAl9CiAKLQotY2xlYW51cDoKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKyAgICAgIGNsZWFudXA6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTg4LDQ5ICsxNzcsNDUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAotCWFjcGlfZXZlbnRfaGFuZGxlciAgICAgICAgICAgICAgaGFuZGxlcikKK2FjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIodTMyIGV2ZW50LCBhY3BpX2V2ZW50X2hhbmRsZXIgaGFuZGxlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlciIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlciIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAogCWlmIChldmVudCA+IEFDUElfRVZFTlRfTUFYKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIERpc2FibGUgdGhlIGV2ZW50IGJlZm9yZSByZW1vdmluZyB0aGUgaGFuZGxlciAqLwogCi0Jc3RhdHVzID0gYWNwaV9kaXNhYmxlX2V2ZW50IChldmVudCwgMCk7CisJc3RhdHVzID0gYWNwaV9kaXNhYmxlX2V2ZW50KGV2ZW50LCAwKTsKIAogCS8qIEFsd2F5cyBSZW1vdmUgdGhlIGhhbmRsZXIgKi8KIAogCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5oYW5kbGVyID0gTlVMTDsKIAlhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uY29udGV4dCA9IE5VTEw7CiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1dBUk4sCi0JCQkiQ291bGQgbm90IHdyaXRlIHRvIGZpeGVkIGV2ZW50IGVuYWJsZSByZWdpc3Rlci5cbiIpKTsKLQl9Ci0JZWxzZSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJEaXNhYmxlZCBmaXhlZCBldmVudCAlWC5cbiIsIGV2ZW50KSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkgICJDb3VsZCBub3Qgd3JpdGUgdG8gZml4ZWQgZXZlbnQgZW5hYmxlIHJlZ2lzdGVyLlxuIikpOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRpc2FibGVkIGZpeGVkIGV2ZW50ICVYLlxuIiwKKwkJCQkgIGV2ZW50KSk7CiAJfQogCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTI1MSwzNyArMjM2LDMyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfdHlwZSwKLQlhY3BpX25vdGlmeV9oYW5kbGVyICAgICAgICAgICAgIGhhbmRsZXIsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCkKK2FjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBkZXZpY2UsCisJCQkgICAgdTMyIGhhbmRsZXJfdHlwZSwKKwkJCSAgICBhY3BpX25vdGlmeV9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmNvbnRleHQpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbm90aWZ5X29iajsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5vdGlmeV9vYmo7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIiKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKLQlpZiAoKCFkZXZpY2UpICB8fAotCQkoIWhhbmRsZXIpIHx8Ci0JCShoYW5kbGVyX3R5cGUgPiBBQ1BJX01BWF9OT1RJRllfSEFORExFUl9UWVBFKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCWlmICgoIWRldmljZSkgfHwKKwkgICAgKCFoYW5kbGVyKSB8fCAoaGFuZGxlcl90eXBlID4gQUNQSV9NQVhfTk9USUZZX0hBTkRMRVJfVFlQRSkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGRldmljZSBoYW5kbGUgKi8KIAotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAoZGV2aWNlKTsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoZGV2aWNlKTsKIAlpZiAoIW5vZGUpIHsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC0yOTcsMjEgKzI3NywyMSBAQAogCQkvKiBNYWtlIHN1cmUgdGhlIGhhbmRsZXIgaXMgbm90IGFscmVhZHkgaW5zdGFsbGVkICovCiAKIAkJaWYgKCgoaGFuZGxlcl90eXBlICYgQUNQSV9TWVNURU1fTk9USUZZKSAmJgotCQkJCWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuaGFuZGxlcikgICAgIHx8Ci0JCQkoKGhhbmRsZXJfdHlwZSAmIEFDUElfREVWSUNFX05PVElGWSkgJiYKLQkJCQlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIpKSB7CisJCSAgICAgYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyKSB8fAorCQkgICAgKChoYW5kbGVyX3R5cGUgJiBBQ1BJX0RFVklDRV9OT1RJRlkpICYmCisJCSAgICAgYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyKSkgewogCQkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCiAJCWlmIChoYW5kbGVyX3R5cGUgJiBBQ1BJX1NZU1RFTV9OT1RJRlkpIHsKLQkJCWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkubm9kZSAgPSBub2RlOworCQkJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5ub2RlID0gbm9kZTsKIAkJCWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuaGFuZGxlciA9IGhhbmRsZXI7CiAJCQlhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmNvbnRleHQgPSBjb250ZXh0OwogCQl9CiAKIAkJaWYgKGhhbmRsZXJfdHlwZSAmIEFDUElfREVWSUNFX05PVElGWSkgewotCQkJYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5ub2RlICA9IG5vZGU7CisJCQlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5Lm5vZGUgPSBub2RlOwogCQkJYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyID0gaGFuZGxlcjsKIAkJCWFjcGlfZ2JsX2RldmljZV9ub3RpZnkuY29udGV4dCA9IGNvbnRleHQ7CiAJCX0KQEAgLTMyNywyOSArMzA3LDI4IEBACiAJZWxzZSB7CiAJCS8qIE5vdGlmaWVzIGFsbG93ZWQgb24gdGhpcyBvYmplY3Q/ICovCiAKLQkJaWYgKCFhY3BpX2V2X2lzX25vdGlmeV9vYmplY3QgKG5vZGUpKSB7CisJCWlmICghYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0KG5vZGUpKSB7CiAJCQlzdGF0dXMgPSBBRV9UWVBFOwogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KIAogCQkvKiBDaGVjayBmb3IgYW4gZXhpc3RpbmcgaW50ZXJuYWwgb2JqZWN0ICovCiAKLQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAkJaWYgKG9ial9kZXNjKSB7CiAJCQkvKiBPYmplY3QgZXhpc3RzIC0gbWFrZSBzdXJlIHRoZXJlJ3Mgbm8gaGFuZGxlciAqLwogCiAJCQlpZiAoKChoYW5kbGVyX3R5cGUgJiBBQ1BJX1NZU1RFTV9OT1RJRlkpICYmCi0JCQkJCW9ial9kZXNjLT5jb21tb25fbm90aWZ5LnN5c3RlbV9ub3RpZnkpIHx8Ci0JCQkJKChoYW5kbGVyX3R5cGUgJiBBQ1BJX0RFVklDRV9OT1RJRlkpICYmCi0JCQkJCW9ial9kZXNjLT5jb21tb25fbm90aWZ5LmRldmljZV9ub3RpZnkpKSB7CisJCQkgICAgIG9ial9kZXNjLT5jb21tb25fbm90aWZ5LnN5c3RlbV9ub3RpZnkpIHx8CisJCQkgICAgKChoYW5kbGVyX3R5cGUgJiBBQ1BJX0RFVklDRV9OT1RJRlkpICYmCisJCQkgICAgIG9ial9kZXNjLT5jb21tb25fbm90aWZ5LmRldmljZV9ub3RpZnkpKSB7CiAJCQkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7CiAJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCQl9Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQkvKiBDcmVhdGUgYSBuZXcgb2JqZWN0ICovCiAKLQkJCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChub2RlLT50eXBlKTsKKwkJCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KG5vZGUtPnR5cGUpOwogCQkJaWYgKCFvYmpfZGVzYykgewogCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTM1NywyNSArMzM2LDI3IEBACiAKIAkJCS8qIEF0dGFjaCBuZXcgb2JqZWN0IHRvIHRoZSBOb2RlICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCAoZGV2aWNlLCBvYmpfZGVzYywgbm9kZS0+dHlwZSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfbnNfYXR0YWNoX29iamVjdChkZXZpY2UsIG9ial9kZXNjLCBub2RlLT50eXBlKTsKIAogCQkJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQkJfQogCQl9CiAKIAkJLyogSW5zdGFsbCB0aGUgaGFuZGxlciAqLwogCi0JCW5vdGlmeV9vYmogPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9MT0NBTF9OT1RJRlkpOworCQlub3RpZnlfb2JqID0KKwkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfTE9DQUxfTk9USUZZKTsKIAkJaWYgKCFub3RpZnlfb2JqKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCi0JCW5vdGlmeV9vYmotPm5vdGlmeS5ub2RlICAgPSBub2RlOworCQlub3RpZnlfb2JqLT5ub3RpZnkubm9kZSA9IG5vZGU7CiAJCW5vdGlmeV9vYmotPm5vdGlmeS5oYW5kbGVyID0gaGFuZGxlcjsKIAkJbm90aWZ5X29iai0+bm90aWZ5LmNvbnRleHQgPSBjb250ZXh0OwogCkBAIC0zOTAsMTcgKzM3MSwxNiBAQAogCQlpZiAoaGFuZGxlcl90eXBlID09IEFDUElfQUxMX05PVElGWSkgewogCQkJLyogRXh0cmEgcmVmIGlmIGluc3RhbGxlZCBpbiBib3RoICovCiAKLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAobm90aWZ5X29iaik7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uobm90aWZ5X29iaik7CiAJCX0KIAl9CiAKLQotdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDIwLDM2ICs0MDAsMzEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyX3R5cGUsCi0JYWNwaV9ub3RpZnlfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyKQorYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoYWNwaV9oYW5kbGUgZGV2aWNlLAorCQkJICAgdTMyIGhhbmRsZXJfdHlwZSwgYWNwaV9ub3RpZnlfaGFuZGxlciBoYW5kbGVyKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm5vdGlmeV9vYmo7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpub3RpZnlfb2JqOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlciIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAotCWlmICgoIWRldmljZSkgIHx8Ci0JCSghaGFuZGxlcikgfHwKLQkJKGhhbmRsZXJfdHlwZSA+IEFDUElfTUFYX05PVElGWV9IQU5ETEVSX1RZUEUpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJaWYgKCghZGV2aWNlKSB8fAorCSAgICAoIWhhbmRsZXIpIHx8IChoYW5kbGVyX3R5cGUgPiBBQ1BJX01BWF9OT1RJRllfSEFORExFUl9UWVBFKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgZGV2aWNlIGhhbmRsZSAqLwogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChkZXZpY2UpOworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShkZXZpY2UpOwogCWlmICghbm9kZSkgewogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTQ1OCwzNCArNDMzLDM0IEBACiAJLyogUm9vdCBPYmplY3QgKi8KIAogCWlmIChkZXZpY2UgPT0gQUNQSV9ST09UX09CSkVDVCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJIlJlbW92aW5nIG5vdGlmeSBoYW5kbGVyIGZvciBST09UIG9iamVjdC5cbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIlJlbW92aW5nIG5vdGlmeSBoYW5kbGVyIGZvciBST09UIG9iamVjdC5cbiIpKTsKIAogCQlpZiAoKChoYW5kbGVyX3R5cGUgJiBBQ1BJX1NZU1RFTV9OT1RJRlkpICYmCi0JCQkgICFhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIpICAgICAgfHwKLQkJCSgoaGFuZGxlcl90eXBlICYgQUNQSV9ERVZJQ0VfTk9USUZZKSAmJgotCQkJICAhYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyKSkgeworCQkgICAgICFhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIpIHx8CisJCSAgICAoKGhhbmRsZXJfdHlwZSAmIEFDUElfREVWSUNFX05PVElGWSkgJiYKKwkJICAgICAhYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyKSkgewogCQkJc3RhdHVzID0gQUVfTk9UX0VYSVNUOwogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KIAogCQkvKiBNYWtlIHN1cmUgYWxsIGRlZmVycmVkIHRhc2tzIGFyZSBjb21wbGV0ZWQgKi8KIAotCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAkJYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZShOVUxMKTsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7Ci0gCQl9CisJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CiAKIAkJaWYgKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgewotCQkJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5ub2RlICA9IE5VTEw7CisJCQlhY3BpX2dibF9zeXN0ZW1fbm90aWZ5Lm5vZGUgPSBOVUxMOwogCQkJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyID0gTlVMTDsKIAkJCWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuY29udGV4dCA9IE5VTEw7CiAJCX0KIAogCQlpZiAoaGFuZGxlcl90eXBlICYgQUNQSV9ERVZJQ0VfTk9USUZZKSB7Ci0JCQlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5Lm5vZGUgID0gTlVMTDsKKwkJCWFjcGlfZ2JsX2RldmljZV9ub3RpZnkubm9kZSA9IE5VTEw7CiAJCQlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIgPSBOVUxMOwogCQkJYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5jb250ZXh0ID0gTlVMTDsKIAkJfQpAQCAtNDk2LDE0ICs0NzEsMTQgQEAKIAllbHNlIHsKIAkJLyogTm90aWZpZXMgYWxsb3dlZCBvbiB0aGlzIG9iamVjdD8gKi8KIAotCQlpZiAoIWFjcGlfZXZfaXNfbm90aWZ5X29iamVjdCAobm9kZSkpIHsKKwkJaWYgKCFhY3BpX2V2X2lzX25vdGlmeV9vYmplY3Qobm9kZSkpIHsKIAkJCXN0YXR1cyA9IEFFX1RZUEU7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCiAJCS8qIENoZWNrIGZvciBhbiBleGlzdGluZyBpbnRlcm5hbCBvYmplY3QgKi8KIAotCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCQlpZiAoIW9ial9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTUxNCw1MyArNDg5LDUyIEBACiAJCWlmIChoYW5kbGVyX3R5cGUgJiBBQ1BJX1NZU1RFTV9OT1RJRlkpIHsKIAkJCW5vdGlmeV9vYmogPSBvYmpfZGVzYy0+Y29tbW9uX25vdGlmeS5zeXN0ZW1fbm90aWZ5OwogCQkJaWYgKCghbm90aWZ5X29iaikgfHwKLQkJCQkgKG5vdGlmeV9vYmotPm5vdGlmeS5oYW5kbGVyICE9IGhhbmRsZXIpKSB7CisJCQkgICAgKG5vdGlmeV9vYmotPm5vdGlmeS5oYW5kbGVyICE9IGhhbmRsZXIpKSB7CiAJCQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJCX0KIAkJCS8qIE1ha2Ugc3VyZSBhbGwgZGVmZXJyZWQgdGFza3MgYXJlIGNvbXBsZXRlZCAqLwogCi0JCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJCQlhY3BpX29zX3dhaXRfZXZlbnRzX2NvbXBsZXRlKE5VTEwpOwotCQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLSAJCQl9CisJCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQogCiAJCQkvKiBSZW1vdmUgdGhlIGhhbmRsZXIgKi8KIAkJCW9ial9kZXNjLT5jb21tb25fbm90aWZ5LnN5c3RlbV9ub3RpZnkgPSBOVUxMOwotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChub3RpZnlfb2JqKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShub3RpZnlfb2JqKTsKIAkJfQogCiAJCWlmIChoYW5kbGVyX3R5cGUgJiBBQ1BJX0RFVklDRV9OT1RJRlkpIHsKIAkJCW5vdGlmeV9vYmogPSBvYmpfZGVzYy0+Y29tbW9uX25vdGlmeS5kZXZpY2Vfbm90aWZ5OwogCQkJaWYgKCghbm90aWZ5X29iaikgfHwKLQkJCQkgKG5vdGlmeV9vYmotPm5vdGlmeS5oYW5kbGVyICE9IGhhbmRsZXIpKSB7CisJCQkgICAgKG5vdGlmeV9vYmotPm5vdGlmeS5oYW5kbGVyICE9IGhhbmRsZXIpKSB7CiAJCQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJCX0KIAkJCS8qIE1ha2Ugc3VyZSBhbGwgZGVmZXJyZWQgdGFza3MgYXJlIGNvbXBsZXRlZCAqLwogCi0JCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJCQlhY3BpX29zX3dhaXRfZXZlbnRzX2NvbXBsZXRlKE5VTEwpOwotCQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLSAJCQl9CisJCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQogCiAJCQkvKiBSZW1vdmUgdGhlIGhhbmRsZXIgKi8KIAkJCW9ial9kZXNjLT5jb21tb25fbm90aWZ5LmRldmljZV9ub3RpZnkgPSBOVUxMOwotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChub3RpZnlfb2JqKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShub3RpZnlfb2JqKTsKIAkJfQogCX0KIAotCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNTgxLDM1ICs1NTUsMzEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotCWFjcGlfZXZlbnRfaGFuZGxlciAgICAgICAgICAgICAgYWRkcmVzcywKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KQorYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCisJCQkgdTMyIGdwZV9udW1iZXIsCisJCQkgdTMyIHR5cGUsIGFjcGlfZXZlbnRfaGFuZGxlciBhZGRyZXNzLCB2b2lkICpjb250ZXh0KQogewotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvOwotCXN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbyAgICAgICAgKmhhbmRsZXI7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOworCXN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbyAqaGFuZGxlcjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGZsYWdzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIiKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKIAlpZiAoKCFhZGRyZXNzKSB8fCAodHlwZSA+IEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgKi8KIAotCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8gKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOworCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CiAJaWYgKCFncGVfZXZlbnRfaW5mbykgewogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTYxNyw0OSArNTg3LDQ5IEBACiAKIAkvKiBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpc24ndCBhIGhhbmRsZXIgdGhlcmUgYWxyZWFkeSAqLwogCi0JaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PSBBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKSB7CisJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PQorCSAgICBBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKSB7CiAJCXN0YXR1cyA9IEFFX0FMUkVBRFlfRVhJU1RTOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKIAkvKiBBbGxvY2F0ZSBhbmQgaW5pdCBoYW5kbGVyIG9iamVjdCAqLwogCi0JaGFuZGxlciA9IEFDUElfTUVNX0NBTExPQ0FURSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV9oYW5kbGVyX2luZm8pKTsKKwloYW5kbGVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV9oYW5kbGVyX2luZm8pKTsKIAlpZiAoIWhhbmRsZXIpIHsKIAkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKLQloYW5kbGVyLT5hZGRyZXNzICAgID0gYWRkcmVzczsKLQloYW5kbGVyLT5jb250ZXh0ICAgID0gY29udGV4dDsKKwloYW5kbGVyLT5hZGRyZXNzID0gYWRkcmVzczsKKwloYW5kbGVyLT5jb250ZXh0ID0gY29udGV4dDsKIAloYW5kbGVyLT5tZXRob2Rfbm9kZSA9IGdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5tZXRob2Rfbm9kZTsKIAogCS8qIERpc2FibGUgdGhlIEdQRSBiZWZvcmUgaW5zdGFsbGluZyB0aGUgaGFuZGxlciAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZSAoZ3BlX2V2ZW50X2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQogCiAJLyogSW5zdGFsbCB0aGUgaGFuZGxlciAqLwogCi0JYWNwaV9vc19hY3F1aXJlX2xvY2sgKGFjcGlfZ2JsX2dwZV9sb2NrLCBBQ1BJX05PVF9JU1IpOworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOwogCWdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5oYW5kbGVyID0gaGFuZGxlcjsKIAogCS8qIFNldHVwIHVwIGRpc3BhdGNoIGZsYWdzIHRvIGluZGljYXRlIGhhbmRsZXIgKHZzLiBtZXRob2QpICovCiAKLQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJj0gfihBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0sgfCBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKTsgLyogQ2xlYXIgYml0cyAqLworCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPSB+KEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSyB8IEFDUElfR1BFX0RJU1BBVENIX01BU0spOwkvKiBDbGVhciBiaXRzICovCiAJZ3BlX2V2ZW50X2luZm8tPmZsYWdzIHw9ICh1OCkgKHR5cGUgfCBBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKTsKIAotCWFjcGlfb3NfcmVsZWFzZV9sb2NrIChhY3BpX2dibF9ncGVfbG9jaywgQUNQSV9OT1RfSVNSKTsKKwlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOwogCi0KLXVubG9ja19hbmRfZXhpdDoKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY3NywzMyArNjQ3LDMwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JYWNwaV9ldmVudF9oYW5kbGVyICAgICAgICAgICAgICBhZGRyZXNzKQorYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJCXUzMiBncGVfbnVtYmVyLCBhY3BpX2V2ZW50X2hhbmRsZXIgYWRkcmVzcykKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9oYW5kbGVyX2luZm8gICAgICAgICpoYW5kbGVyOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKwlzdHJ1Y3QgYWNwaV9oYW5kbGVyX2luZm8gKmhhbmRsZXI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBmbGFnczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3JlbW92ZV9ncGVfaGFuZGxlciIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAogCWlmICghYWRkcmVzcykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLwogCi0JZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyAoZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CisJZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKIAlpZiAoIWdwZV9ldmVudF9pbmZvKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtNzExLDcgKzY3OCw4IEBACiAKIAkvKiBNYWtlIHN1cmUgdGhhdCBhIGhhbmRsZXIgaXMgaW5kZWVkIGluc3RhbGxlZCAqLwogCi0JaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSAhPSBBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKSB7CisJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSAhPQorCSAgICBBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKSB7CiAJCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQpAQCAtNzI1LDQ1ICs2OTMsNDQgQEAKIAogCS8qIERpc2FibGUgdGhlIEdQRSBiZWZvcmUgcmVtb3ZpbmcgdGhlIGhhbmRsZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZfZGlzYWJsZV9ncGUgKGdwZV9ldmVudF9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAogCS8qIE1ha2Ugc3VyZSBhbGwgZGVmZXJyZWQgdGFza3MgYXJlIGNvbXBsZXRlZCAqLwogCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKIAlhY3BpX29zX3dhaXRfZXZlbnRzX2NvbXBsZXRlKE5VTEwpOwotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLSAJfQorCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CiAKIAkvKiBSZW1vdmUgdGhlIGhhbmRsZXIgKi8KIAotCWFjcGlfb3NfYWNxdWlyZV9sb2NrIChhY3BpX2dibF9ncGVfbG9jaywgQUNQSV9OT1RfSVNSKTsKKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKIAloYW5kbGVyID0gZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXI7CiAKIAkvKiBSZXN0b3JlIE1ldGhvZCBub2RlIChpZiBhbnkpLCBzZXQgZGlzcGF0Y2ggZmxhZ3MgKi8KIAogCWdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5tZXRob2Rfbm9kZSA9IGhhbmRsZXItPm1ldGhvZF9ub2RlOwotCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPSB+QUNQSV9HUEVfRElTUEFUQ0hfTUFTSzsgLyogQ2xlYXIgYml0cyAqLworCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPSB+QUNQSV9HUEVfRElTUEFUQ0hfTUFTSzsJLyogQ2xlYXIgYml0cyAqLwogCWlmIChoYW5kbGVyLT5tZXRob2Rfbm9kZSkgewogCQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgfD0gQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EOwogCX0KLQlhY3BpX29zX3JlbGVhc2VfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIEFDUElfTk9UX0lTUik7CisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKIAogCS8qIE5vdyB3ZSBjYW4gZnJlZSB0aGUgaGFuZGxlciBvYmplY3QgKi8KIAotCUFDUElfTUVNX0ZSRUUgKGhhbmRsZXIpOworCUFDUElfTUVNX0ZSRUUoaGFuZGxlcik7CiAKLQotdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcik7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc3OSwzNSArNzQ2LDMxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZSkKK2FjcGlfc3RhdHVzIGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayh1MTYgdGltZW91dCwgdTMyICogaGFuZGxlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJaWYgKCFoYW5kbGUpIHsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybiAoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2sgKHRpbWVvdXQpOwotCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlciAoKTsKKwlzdGF0dXMgPSBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2sodGltZW91dCk7CisJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2hhbmRsZSsrOwogCQkqaGFuZGxlID0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlOwogCX0KIAogCXJldHVybiAoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2spOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTgyMSwxOSArNzg0LDE2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpCithY3BpX3N0YXR1cyBhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2sodTMyIGhhbmRsZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQorCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCWlmIChoYW5kbGUgIT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlKSB7CiAJCXJldHVybiAoQUVfTk9UX0FDUVVJUkVEKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2sgKCk7CisJc3RhdHVzID0gYWNwaV9ldl9yZWxlYXNlX2dsb2JhbF9sb2NrKCk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2spOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZldm50LmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZldm50LmMKaW5kZXggZjMzN2RjMi4uODg3ZmY5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmZXZudC5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYwpAQCAtNDgsOCArNDgsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJldnhmZXZudCIpCi0KK0FDUElfTU9EVUxFX05BTUUoImV2eGZldm50IikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02Miw0NCArNjEsMzkgQEAKICAqIERFU0NSSVBUSU9OOiBUcmFuc2ZlcnMgdGhlIHN5c3RlbSBpbnRvIEFDUEkgbW9kZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9lbmFibGUgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX2VuYWJsZSh2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VuYWJsZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZW5hYmxlIik7Ci0KLQotCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBGQURUKi8KKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgRkFEVCAqLwogCiAJaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1dBUk4sICJObyBGQURUIGluZm9ybWF0aW9uIHByZXNlbnQhXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fQUNQSV9UQUJMRVMpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJICAiTm8gRkFEVCBpbmZvcm1hdGlvbiBwcmVzZW50IVxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fQUNQSV9UQUJMRVMpOwogCX0KIAogCWlmIChhY3BpX2h3X2dldF9tb2RlKCkgPT0gQUNQSV9TWVNfTU9ERV9BQ1BJKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsICJTeXN0ZW0gaXMgYWxyZWFkeSBpbiBBQ1BJIG1vZGVcbiIpKTsKLQl9Ci0JZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5JVCwKKwkJCQkgICJTeXN0ZW0gaXMgYWxyZWFkeSBpbiBBQ1BJIG1vZGVcbiIpKTsKKwl9IGVsc2UgewogCQkvKiBUcmFuc2l0aW9uIHRvIEFDUEkgbW9kZSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfc2V0X21vZGUgKEFDUElfU1lTX01PREVfQUNQSSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCB0cmFuc2l0aW9uIHRvIEFDUEkgbW9kZS5cbiIpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9od19zZXRfbW9kZShBQ1BJX1NZU19NT0RFX0FDUEkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IHRyYW5zaXRpb24gdG8gQUNQSSBtb2RlLlxuIikpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULAotCQkJIlRyYW5zaXRpb24gdG8gQUNQSSBtb2RlIHN1Y2Nlc3NmdWxcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULAorCQkJCSAgIlRyYW5zaXRpb24gdG8gQUNQSSBtb2RlIHN1Y2Nlc3NmdWxcbiIpKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kaXNhYmxlCkBAIC0xMTIsNDMgKzEwNiwzOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2Rpc2FibGUgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGUodm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9kaXNhYmxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2Rpc2FibGUiKTsKIAogCWlmICghYWNwaV9nYmxfRkFEVCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9XQVJOLCAiTm8gRkFEVCBpbmZvcm1hdGlvbiBwcmVzZW50IVxuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0FDUElfVEFCTEVTKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCSAgIk5vIEZBRFQgaW5mb3JtYXRpb24gcHJlc2VudCFcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKIAl9CiAKIAlpZiAoYWNwaV9od19nZXRfbW9kZSgpID09IEFDUElfU1lTX01PREVfTEVHQUNZKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsCi0JCQkiU3lzdGVtIGlzIGFscmVhZHkgaW4gbGVnYWN5IChub24tQUNQSSkgbW9kZVxuIikpOwotCX0KLQllbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULAorCQkJCSAgIlN5c3RlbSBpcyBhbHJlYWR5IGluIGxlZ2FjeSAobm9uLUFDUEkpIG1vZGVcbiIpKTsKKwl9IGVsc2UgewogCQkvKiBUcmFuc2l0aW9uIHRvIExFR0FDWSBtb2RlICovCiAKLQkJc3RhdHVzID0gYWNwaV9od19zZXRfbW9kZSAoQUNQSV9TWVNfTU9ERV9MRUdBQ1kpOworCQlzdGF0dXMgPSBhY3BpX2h3X3NldF9tb2RlKEFDUElfU1lTX01PREVfTEVHQUNZKTsKIAotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiQ291bGQgbm90IGV4aXQgQUNQSSBtb2RlIHRvIGxlZ2FjeSBtb2RlIikpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkNvdWxkIG5vdCBleGl0IEFDUEkgbW9kZSB0byBsZWdhY3kgbW9kZSIpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5JVCwgIkFDUEkgbW9kZSBkaXNhYmxlZFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsICJBQ1BJIG1vZGUgZGlzYWJsZWRcbiIpKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9lbmFibGVfZXZlbnQKQEAgLTE2Miw1MiArMTUxLDUwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZW5hYmxlX2V2ZW50ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2VuYWJsZV9ldmVudCh1MzIgZXZlbnQsIHUzMiBmbGFncykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIHZhbHVlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9lbmFibGVfZXZlbnQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW5hYmxlX2V2ZW50Iik7CiAKIAkvKiBEZWNvZGUgdGhlIEZpeGVkIEV2ZW50ICovCiAKIAlpZiAoZXZlbnQgPiBBQ1BJX0VWRU5UX01BWCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyoKIAkgKiBFbmFibGUgdGhlIHJlcXVlc3RlZCBmaXhlZCBldmVudCAoYnkgd3JpdGluZyBhIG9uZSB0byB0aGUKIAkgKiBlbmFibGUgcmVnaXN0ZXIgYml0KQogCSAqLwotCXN0YXR1cyA9IGFjcGlfc2V0X3JlZ2lzdGVyIChhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS5lbmFibGVfcmVnaXN0ZXJfaWQsCi0JCQkgMSwgQUNQSV9NVFhfTE9DSyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uCisJCQkgICAgICBlbmFibGVfcmVnaXN0ZXJfaWQsIDEsIEFDUElfTVRYX0xPQ0spOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgaGFyZHdhcmUgcmVzcG9uZGVkICovCiAKLQlzdGF0dXMgPSBhY3BpX2dldF9yZWdpc3RlciAoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uZW5hYmxlX3JlZ2lzdGVyX2lkLAotCQkJICAmdmFsdWUsIEFDUElfTVRYX0xPQ0spOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZ2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgorCQkJICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkLCAmdmFsdWUsIEFDUElfTVRYX0xPQ0spOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAlpZiAodmFsdWUgIT0gMSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJDb3VsZCBub3QgZW5hYmxlICVzIGV2ZW50XG4iLCBhY3BpX3V0X2dldF9ldmVudF9uYW1lIChldmVudCkpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19IQVJEV0FSRV9SRVNQT05TRSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQ291bGQgbm90IGVuYWJsZSAlcyBldmVudFxuIiwKKwkJCQkgIGFjcGlfdXRfZ2V0X2V2ZW50X25hbWUoZXZlbnQpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19IQVJEV0FSRV9SRVNQT05TRSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2VuYWJsZV9ldmVudCk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9lbmFibGVfZXZlbnQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTIyMyw0MCArMjEwLDM0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfc2V0X2dwZV90eXBlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGdwZV9kZXZpY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfbnVtYmVyLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSkKK2FjcGlfc3RhdHVzIGFjcGlfc2V0X2dwZV90eXBlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyLCB1OCB0eXBlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9zZXRfZ3BlX3R5cGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfc2V0X2dwZV90eXBlIik7CiAKIAkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLwogCi0JZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyAoZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CisJZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKIAlpZiAoIWdwZV9ldmVudF9pbmZvKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAogCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfVFlQRV9NQVNLKSA9PSB0eXBlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIFNldCB0aGUgbmV3IHR5cGUgKHdpbGwgZGlzYWJsZSBHUEUgaWYgY3VycmVudGx5IGVuYWJsZWQpICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X3NldF9ncGVfdHlwZSAoZ3BlX2V2ZW50X2luZm8sIHR5cGUpOworCXN0YXR1cyA9IGFjcGlfZXZfc2V0X2dwZV90eXBlKGdwZV9ldmVudF9pbmZvLCB0eXBlKTsKIAotdW5sb2NrX2FuZF9leGl0OgotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9zZXRfZ3BlX3R5cGUpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfc2V0X2dwZV90eXBlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yNzMsMzEgKzI1NCwyNSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2VuYWJsZV9ncGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK2FjcGlfc3RhdHVzIGFjcGlfZW5hYmxlX2dwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlciwgdTMyIGZsYWdzKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9lbmFibGVfZ3BlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VuYWJsZV9ncGUiKTsKIAogCS8qIFVzZSBzZW1hcGhvcmUgbG9jayBpZiBub3QgZXhlY3V0aW5nIGF0IGludGVycnVwdCBsZXZlbCAqLwogCiAJaWYgKGZsYWdzICYgQUNQSV9OT1RfSVNSKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCiAKLQlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvIChncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKKwlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOwogCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC0zMDUsMTYgKzI4MCwxNiBAQAogCiAJLyogUGVyZm9ybSB0aGUgZW5hYmxlICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X2VuYWJsZV9ncGUgKGdwZV9ldmVudF9pbmZvLCBUUlVFKTsKKwlzdGF0dXMgPSBhY3BpX2V2X2VuYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8sIFRSVUUpOwogCi11bmxvY2tfYW5kX2V4aXQ6CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CiAJaWYgKGZsYWdzICYgQUNQSV9OT1RfSVNSKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwogCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZW5hYmxlX2dwZSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9lbmFibGVfZ3BlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0zMzEsNDYgKzMwNiwzOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2Rpc2FibGVfZ3BlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGdwZV9kZXZpY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGVfZ3BlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyLCB1MzIgZmxhZ3MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2Rpc2FibGVfZ3BlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2Rpc2FibGVfZ3BlIik7CiAKIAkvKiBVc2Ugc2VtYXBob3JlIGxvY2sgaWYgbm90IGV4ZWN1dGluZyBhdCBpbnRlcnJ1cHQgbGV2ZWwgKi8KIAogCWlmIChmbGFncyAmIEFDUElfTk9UX0lTUikgewotCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLwogCi0JZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyAoZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CisJZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKIAlpZiAoIWdwZV9ldmVudF9pbmZvKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZXZfZGlzYWJsZV9ncGUgKGdwZV9ldmVudF9pbmZvKTsKKwlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKIAotdW5sb2NrX2FuZF9leGl0OgorICAgICAgdW5sb2NrX2FuZF9leGl0OgogCWlmIChmbGFncyAmIEFDUElfTk9UX0lTUikgewotCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOworCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKIAl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZGlzYWJsZV9ldmVudApAQCAtMzg0LDUwICszNTIsNDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9kaXNhYmxlX2V2ZW50ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGVfZXZlbnQodTMyIGV2ZW50LCB1MzIgZmxhZ3MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXUzMiB2YWx1ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZGlzYWJsZV9ldmVudCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9kaXNhYmxlX2V2ZW50Iik7CiAKIAkvKiBEZWNvZGUgdGhlIEZpeGVkIEV2ZW50ICovCiAKIAlpZiAoZXZlbnQgPiBBQ1BJX0VWRU5UX01BWCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyoKIAkgKiBEaXNhYmxlIHRoZSByZXF1ZXN0ZWQgZml4ZWQgZXZlbnQgKGJ5IHdyaXRpbmcgYSB6ZXJvIHRvIHRoZQogCSAqIGVuYWJsZSByZWdpc3RlciBiaXQpCiAJICovCi0Jc3RhdHVzID0gYWNwaV9zZXRfcmVnaXN0ZXIgKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLmVuYWJsZV9yZWdpc3Rlcl9pZCwKLQkJCSAwLCBBQ1BJX01UWF9MT0NLKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KKwkJCSAgICAgIGVuYWJsZV9yZWdpc3Rlcl9pZCwgMCwgQUNQSV9NVFhfTE9DSyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyIChhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS5lbmFibGVfcmVnaXN0ZXJfaWQsCi0JCQkgJnZhbHVlLCBBQ1BJX01UWF9MT0NLKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2dldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KKwkJCSAgICAgIGVuYWJsZV9yZWdpc3Rlcl9pZCwgJnZhbHVlLCBBQ1BJX01UWF9MT0NLKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJaWYgKHZhbHVlICE9IDApIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiQ291bGQgbm90IGRpc2FibGUgJXMgZXZlbnRzXG4iLCBhY3BpX3V0X2dldF9ldmVudF9uYW1lIChldmVudCkpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19IQVJEV0FSRV9SRVNQT05TRSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQ291bGQgbm90IGRpc2FibGUgJXMgZXZlbnRzXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfZXZlbnRfbmFtZShldmVudCkpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0hBUkRXQVJFX1JFU1BPTlNFKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZGlzYWJsZV9ldmVudCk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9kaXNhYmxlX2V2ZW50KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC00NDEsMzMgKzQwNywzMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2NsZWFyX2V2ZW50ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KQorYWNwaV9zdGF0dXMgYWNwaV9jbGVhcl9ldmVudCh1MzIgZXZlbnQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfY2xlYXJfZXZlbnQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfY2xlYXJfZXZlbnQiKTsKIAogCS8qIERlY29kZSB0aGUgRml4ZWQgRXZlbnQgKi8KIAogCWlmIChldmVudCA+IEFDUElfRVZFTlRfTUFYKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKgogCSAqIENsZWFyIHRoZSByZXF1ZXN0ZWQgZml4ZWQgZXZlbnQgKEJ5IHdyaXRpbmcgYSBvbmUgdG8gdGhlCiAJICogc3RhdHVzIHJlZ2lzdGVyIGJpdCkKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlciAoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uc3RhdHVzX3JlZ2lzdGVyX2lkLAotCQkJMSwgQUNQSV9NVFhfTE9DSyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uCisJCQkgICAgICBzdGF0dXNfcmVnaXN0ZXJfaWQsIDEsIEFDUElfTVRYX0xPQ0spOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2NsZWFyX2V2ZW50KTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2NsZWFyX2V2ZW50KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC00ODMsNDYgKzQ0NiwzOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2NsZWFyX2dwZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQorYWNwaV9zdGF0dXMgYWNwaV9jbGVhcl9ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIsIHUzMiBmbGFncykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfY2xlYXJfZ3BlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2NsZWFyX2dwZSIpOwogCiAJLyogVXNlIHNlbWFwaG9yZSBsb2NrIGlmIG5vdCBleGVjdXRpbmcgYXQgaW50ZXJydXB0IGxldmVsICovCiAKIAlpZiAoZmxhZ3MgJiBBQ1BJX05PVF9JU1IpIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCiAJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgKi8KIAotCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8gKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOworCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CiAJaWYgKCFncGVfZXZlbnRfaW5mbykgewogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZSAoZ3BlX2V2ZW50X2luZm8pOworCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlKGdwZV9ldmVudF9pbmZvKTsKIAotdW5sb2NrX2FuZF9leGl0OgorICAgICAgdW5sb2NrX2FuZF9leGl0OgogCWlmIChmbGFncyAmIEFDUElfTk9UX0lTUikgewotCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOworCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKIAl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01MzgsMzYgKzQ5NCwzMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9ldmVudF9zdGF0dXMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0JYWNwaV9ldmVudF9zdGF0dXMgICAgICAgICAgICAgICAqZXZlbnRfc3RhdHVzKQorYWNwaV9zdGF0dXMgYWNwaV9nZXRfZXZlbnRfc3RhdHVzKHUzMiBldmVudCwgYWNwaV9ldmVudF9zdGF0dXMgKiBldmVudF9zdGF0dXMpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X2V2ZW50X3N0YXR1cyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfZXZlbnRfc3RhdHVzIik7CiAKIAlpZiAoIWV2ZW50X3N0YXR1cykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogRGVjb2RlIHRoZSBGaXhlZCBFdmVudCAqLwogCiAJaWYgKGV2ZW50ID4gQUNQSV9FVkVOVF9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0ZWQgZml4ZWQgZXZlbnQgKi8KIAotCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyIChhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS5zdGF0dXNfcmVnaXN0ZXJfaWQsCi0JCQkgIGV2ZW50X3N0YXR1cywgQUNQSV9NVFhfTE9DSyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uCisJCQkgICAgICBzdGF0dXNfcmVnaXN0ZXJfaWQsIGV2ZW50X3N0YXR1cywgQUNQSV9NVFhfTE9DSyk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfZ3BlX3N0YXR1cwpAQCAtNTg1LDMxICs1MzYsMjYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9ncGVfc3RhdHVzICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGdwZV9kZXZpY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JYWNwaV9ldmVudF9zdGF0dXMgICAgICAgICAgICAgICAqZXZlbnRfc3RhdHVzKQorYWNwaV9nZXRfZ3BlX3N0YXR1cyhhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAorCQkgICAgdTMyIGdwZV9udW1iZXIsIHUzMiBmbGFncywgYWNwaV9ldmVudF9zdGF0dXMgKiBldmVudF9zdGF0dXMpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF9ncGVfc3RhdHVzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9ncGVfc3RhdHVzIik7CiAKIAkvKiBVc2Ugc2VtYXBob3JlIGxvY2sgaWYgbm90IGV4ZWN1dGluZyBhdCBpbnRlcnJ1cHQgbGV2ZWwgKi8KIAogCWlmIChmbGFncyAmIEFDUElfTk9UX0lTUikgewotCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLwogCi0JZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyAoZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CisJZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKIAlpZiAoIWdwZV9ldmVudF9pbmZvKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtNjE3LDE2ICs1NjMsMTUgQEAKIAogCS8qIE9idGFpbiBzdGF0dXMgb24gdGhlIHJlcXVlc3RlZCBHUEUgbnVtYmVyICovCiAKLQlzdGF0dXMgPSBhY3BpX2h3X2dldF9ncGVfc3RhdHVzIChncGVfZXZlbnRfaW5mbywgZXZlbnRfc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X2dldF9ncGVfc3RhdHVzKGdwZV9ldmVudF9pbmZvLCBldmVudF9zdGF0dXMpOwogCi11bmxvY2tfYW5kX2V4aXQ6CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CiAJaWYgKGZsYWdzICYgQUNQSV9OT1RfSVNSKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwogCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQorI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MzUsNyArNTgwLDcgQEAKICAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgICAgIC0gSGFuZGxlIHRvIHRoZSBwYXJlbnQgR1BFIEJsb2NrIERldmljZQogICogICAgICAgICAgICAgIGdwZV9ibG9ja19hZGRyZXNzICAgLSBBZGRyZXNzIGFuZCBzcGFjZV9pRAogICogICAgICAgICAgICAgIHJlZ2lzdGVyX2NvdW50ICAgICAgLSBOdW1iZXIgb2YgR1BFIHJlZ2lzdGVyIHBhaXJzIGluIHRoZSBibG9jawotICogICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbCAgICAgLSBIL1cgaW50ZXJydXB0IGZvciB0aGUgYmxvY2sKKyAqICAgICAgICAgICAgICBpbnRlcnJ1cHRfbnVtYmVyICAgIC0gSC9XIGludGVycnVwdCBmb3IgdGhlIGJsb2NrCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTY0NCwzMyArNTg5LDI3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9pbnN0YWxsX2dwZV9ibG9jayAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgKmdwZV9ibG9ja19hZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWwpCithY3BpX2luc3RhbGxfZ3BlX2Jsb2NrKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmdwZV9ibG9ja19hZGRyZXNzLAorCQkgICAgICAgdTMyIHJlZ2lzdGVyX2NvdW50LCB1MzIgaW50ZXJydXB0X251bWJlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jazsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfaW5zdGFsbF9ncGVfYmxvY2siKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2luc3RhbGxfZ3BlX2Jsb2NrIik7Ci0KLQotCWlmICgoIWdwZV9kZXZpY2UpICAgICAgfHwKLQkJKCFncGVfYmxvY2tfYWRkcmVzcykgfHwKLQkJKCFyZWdpc3Rlcl9jb3VudCkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwlpZiAoKCFncGVfZGV2aWNlKSB8fCAoIWdwZV9ibG9ja19hZGRyZXNzKSB8fCAoIXJlZ2lzdGVyX2NvdW50KSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KIAotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAoZ3BlX2RldmljZSk7CisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGdwZV9kZXZpY2UpOwogCWlmICghbm9kZSkgewogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTY4MCwzMSArNjE5LDMzIEBACiAJICogRm9yIHVzZXItaW5zdGFsbGVkIEdQRSBCbG9jayBEZXZpY2VzLCB0aGUgZ3BlX2Jsb2NrX2Jhc2VfbnVtYmVyCiAJICogaXMgYWx3YXlzIHplcm8KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2sgKG5vZGUsIGdwZV9ibG9ja19hZGRyZXNzLCByZWdpc3Rlcl9jb3VudCwKLQkJCSAgMCwgaW50ZXJydXB0X2xldmVsLCAmZ3BlX2Jsb2NrKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0KKwkgICAgYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrKG5vZGUsIGdwZV9ibG9ja19hZGRyZXNzLCByZWdpc3Rlcl9jb3VudCwgMCwKKwkJCQkgICAgIGludGVycnVwdF9udW1iZXIsICZncGVfYmxvY2spOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKIAkvKiBHZXQgdGhlIGRldmljZV9vYmplY3QgYXR0YWNoZWQgdG8gdGhlIG5vZGUgKi8KIAotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAoIW9ial9kZXNjKSB7CiAJCS8qIE5vIG9iamVjdCwgY3JlYXRlIGEgbmV3IG9uZSAqLwogCi0JCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfREVWSUNFKTsKKwkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0RFVklDRSk7CiAJCWlmICghb2JqX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAKLQkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChub2RlLCBvYmpfZGVzYywgQUNQSV9UWVBFX0RFVklDRSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2F0dGFjaF9vYmplY3Qobm9kZSwgb2JqX2Rlc2MsIEFDUElfVFlQRV9ERVZJQ0UpOwogCiAJCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwogCi0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCi0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCX0KQEAgLTcxMywxMyArNjU0LDEyIEBACiAKIAlvYmpfZGVzYy0+ZGV2aWNlLmdwZV9ibG9jayA9IGdwZV9ibG9jazsKIAotCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9ncGVfYmxvY2spOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9ncGVfYmxvY2spOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTczMywyOCArNjczLDI0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfcmVtb3ZlX2dwZV9ibG9jayAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlKQorYWNwaV9zdGF0dXMgYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX3JlbW92ZV9ncGVfYmxvY2siKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcmVtb3ZlX2dwZV9ibG9jayIpOwogCiAJaWYgKCFncGVfZGV2aWNlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChncGVfZGV2aWNlKTsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoZ3BlX2RldmljZSk7CiAJaWYgKCFub2RlKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtNzYyLDIyICs2OTgsMjEgQEAKIAogCS8qIEdldCB0aGUgZGV2aWNlX29iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOwotCWlmICghb2JqX2Rlc2MgfHwKLQkJIW9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTlVMTF9PQkpFQ1QpOworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCWlmICghb2JqX2Rlc2MgfHwgIW9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OVUxMX09CSkVDVCk7CiAJfQogCiAJLyogRGVsZXRlIHRoZSBHUEUgYmxvY2sgKGJ1dCBub3QgdGhlIGRldmljZV9vYmplY3QpICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X2RlbGV0ZV9ncGVfYmxvY2sgKG9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrKTsKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrKG9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJb2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2sgPSBOVUxMOwogCX0KIAotdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCiBFWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2dwZV9ibG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZyZWduLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZyZWduLmMKaW5kZXggZDA1ODU4Ny4uNmYyOGVhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmcmVnbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZnJlZ24uYwpAQCAtNDksOCArNDksNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJldnhmcmVnbiIpCi0KK0FDUElfTU9EVUxFX05BTUUoImV2eGZyZWduIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02NywzNiArNjYsMzEgQEAKICAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGEgaGFuZGxlciBmb3IgYWxsIG9wX3JlZ2lvbnMgb2YgYSBnaXZlbiBzcGFjZV9pZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0JYWNwaV9hZHJfc3BhY2VfdHlwZSAgICAgICAgICAgICBzcGFjZV9pZCwKLQlhY3BpX2Fkcl9zcGFjZV9oYW5kbGVyICAgICAgICAgIGhhbmRsZXIsCi0JYWNwaV9hZHJfc3BhY2Vfc2V0dXAgICAgICAgICAgICBzZXR1cCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KQorYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihhY3BpX2hhbmRsZSBkZXZpY2UsCisJCQkJICAgYWNwaV9hZHJfc3BhY2VfdHlwZSBzcGFjZV9pZCwKKwkJCQkgICBhY3BpX2Fkcl9zcGFjZV9oYW5kbGVyIGhhbmRsZXIsCisJCQkJICAgYWNwaV9hZHJfc3BhY2Vfc2V0dXAgc2V0dXAsIHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyIik7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCiAJaWYgKCFkZXZpY2UpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGRldmljZSBoYW5kbGUgKi8KIAotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAoZGV2aWNlKTsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoZGV2aWNlKTsKIAlpZiAoIW5vZGUpIHsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC0xMDQsMjEgKzk4LDIzIEBACiAKIAkvKiBJbnN0YWxsIHRoZSBoYW5kbGVyIGZvciBhbGwgUmVnaW9ucyBmb3IgdGhpcyBTcGFjZSBJRCAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX3NwYWNlX2hhbmRsZXIgKG5vZGUsIHNwYWNlX2lkLCBoYW5kbGVyLCBzZXR1cCwgY29udGV4dCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9CisJICAgIGFjcGlfZXZfaW5zdGFsbF9zcGFjZV9oYW5kbGVyKG5vZGUsIHNwYWNlX2lkLCBoYW5kbGVyLCBzZXR1cCwKKwkJCQkJICBjb250ZXh0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQogCiAJLyogUnVuIGFsbCBfUkVHIG1ldGhvZHMgZm9yIHRoaXMgYWRkcmVzcyBzcGFjZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2RzIChub2RlLCBzcGFjZV9pZCk7CisJc3RhdHVzID0gYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2RzKG5vZGUsIHNwYWNlX2lkKTsKIAotdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMzUsMzYgKzEzMSwzMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0JYWNwaV9hZHJfc3BhY2VfdHlwZSAgICAgICAgICAgICBzcGFjZV9pZCwKLQlhY3BpX2Fkcl9zcGFjZV9oYW5kbGVyICAgICAgICAgIGhhbmRsZXIpCithY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZGV2aWNlLAorCQkJCSAgYWNwaV9hZHJfc3BhY2VfdHlwZSBzcGFjZV9pZCwKKwkJCQkgIGFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgaGFuZGxlcikKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpoYW5kbGVyX29iajsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZWdpb25fb2JqOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipsYXN0X29ial9wdHI7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipsYXN0X29ial9wdHI7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9yZW1vdmVfYWRkcmVzc19zcGFjZV9oYW5kbGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIiKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKIAlpZiAoIWRldmljZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgZGV2aWNlIGhhbmRsZSAqLwogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChkZXZpY2UpOworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShkZXZpY2UpOwogCWlmICghbm9kZSkgewogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTE3Miw3ICsxNjUsNyBAQAogCiAJLyogTWFrZSBzdXJlIHRoZSBpbnRlcm5hbCBvYmplY3QgZXhpc3RzICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAJaWYgKCFvYmpfZGVzYykgewogCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtMTg4LDEwICsxODEsMTEgQEAKIAkJaWYgKGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkID09IHNwYWNlX2lkKSB7CiAJCQkvKiBNYXRjaGVkIHNwYWNlX2lkLCBmaXJzdCBkZXJlZmVyZW5jZSB0aGlzIGluIHRoZSBSZWdpb25zICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX09QUkVHSU9OLAotCQkJCSJSZW1vdmluZyBhZGRyZXNzIGhhbmRsZXIgJXAoJXApIGZvciByZWdpb24gJXMgb24gRGV2aWNlICVwKCVwKVxuIiwKLQkJCQloYW5kbGVyX29iaiwgaGFuZGxlciwgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHNwYWNlX2lkKSwKLQkJCQlub2RlLCBvYmpfZGVzYykpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKKwkJCQkJICAiUmVtb3ZpbmcgYWRkcmVzcyBoYW5kbGVyICVwKCVwKSBmb3IgcmVnaW9uICVzIG9uIERldmljZSAlcCglcClcbiIsCisJCQkJCSAgaGFuZGxlcl9vYmosIGhhbmRsZXIsCisJCQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUoc3BhY2VfaWQpLAorCQkJCQkgIG5vZGUsIG9ial9kZXNjKSk7CiAKIAkJCXJlZ2lvbl9vYmogPSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5yZWdpb25fbGlzdDsKIApAQCAtMjA1LDEzICsxOTksMTQgQEAKIAkJCQkgKiBUaGUgcmVnaW9uIGlzIGp1c3QgaW5hY2Nlc3NpYmxlIGFzIGluZGljYXRlZCB0bwogCQkJCSAqIHRoZSBfUkVHIG1ldGhvZAogCQkJCSAqLwotCQkJCWFjcGlfZXZfZGV0YWNoX3JlZ2lvbiAocmVnaW9uX29iaiwgVFJVRSk7CisJCQkJYWNwaV9ldl9kZXRhY2hfcmVnaW9uKHJlZ2lvbl9vYmosIFRSVUUpOwogCiAJCQkJLyoKIAkJCQkgKiBXYWxrIHRoZSBsaXN0OiBKdXN0IGdyYWIgdGhlIGhlYWQgYmVjYXVzZSB0aGUKIAkJCQkgKiBkZXRhY2hfcmVnaW9uIHJlbW92ZWQgdGhlIHByZXZpb3VzIGhlYWQuCiAJCQkJICovCi0JCQkJcmVnaW9uX29iaiA9IGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0OworCQkJCXJlZ2lvbl9vYmogPQorCQkJCSAgICBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5yZWdpb25fbGlzdDsKIAogCQkJfQogCkBAIC0yMjEsNyArMjE2LDcgQEAKIAogCQkJLyogTm93IHdlIGNhbiBkZWxldGUgdGhlIGhhbmRsZXIgb2JqZWN0ICovCiAKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoaGFuZGxlcl9vYmopOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGhhbmRsZXJfb2JqKTsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAKQEAgLTIzMywxNSArMjI4LDE2IEBACiAKIAkvKiBUaGUgaGFuZGxlciBkb2VzIG5vdCBleGlzdCAqLwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfT1BSRUdJT04sCi0JCSJVbmFibGUgdG8gcmVtb3ZlIGFkZHJlc3MgaGFuZGxlciAlcCBmb3IgJXMoJVgpLCBkZXZfbm9kZSAlcCwgb2JqICVwXG4iLAotCQloYW5kbGVyLCBhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAoc3BhY2VfaWQpLCBzcGFjZV9pZCwgbm9kZSwgb2JqX2Rlc2MpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJICAiVW5hYmxlIHRvIHJlbW92ZSBhZGRyZXNzIGhhbmRsZXIgJXAgZm9yICVzKCVYKSwgZGV2X25vZGUgJXAsIG9iaiAlcFxuIiwKKwkJCSAgaGFuZGxlciwgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUoc3BhY2VfaWQpLCBzcGFjZV9pZCwKKwkJCSAgbm9kZSwgb2JqX2Rlc2MpKTsKIAogCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKIAotdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb25maWcuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbmZpZy5jCmluZGV4IDczNGIyZjIuLjFjZTM2NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbmZpZy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbmZpZy5jCkBAIC00MSw3ICs0MSw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgpAQCAtNTAsMTggKzQ5LDE0IEBACiAjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhjb25maWciKQorQUNQSV9NT0RVTEVfTkFNRSgiZXhjb25maWciKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9hZGRfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipkZGJfaGFuZGxlKTsKLQorYWNwaV9leF9hZGRfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwKKwkJICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUsCisJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmRkYl9oYW5kbGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc5LDY0ICs3NCw2NyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2FkZF90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X25vZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRkYl9oYW5kbGUpCithY3BpX2V4X2FkZF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlLAorCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZSwKKwkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZGRiX2hhbmRsZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgIHRhYmxlX2luZm87Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgdGFibGVfaW5mbzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2FkZF90YWJsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfYWRkX3RhYmxlIik7CiAKIAkvKiBDcmVhdGUgYW4gb2JqZWN0IHRvIGJlIHRoZSB0YWJsZSBoYW5kbGUgKi8KIAotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKTsKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKTsKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQkvKiBJbnN0YWxsIHRoZSBuZXcgdGFibGUgaW50byB0aGUgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLQlBQ1BJX01FTVNFVCAoJnRhYmxlX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwotCi0JdGFibGVfaW5mby50eXBlICAgICAgPSBBQ1BJX1RBQkxFX1NTRFQ7Ci0JdGFibGVfaW5mby5wb2ludGVyICAgPSB0YWJsZTsKLQl0YWJsZV9pbmZvLmxlbmd0aCAgICA9IChhY3BpX3NpemUpIHRhYmxlLT5sZW5ndGg7Ci0JdGFibGVfaW5mby5hbGxvY2F0aW9uID0gQUNQSV9NRU1fQUxMT0NBVEVEOwotCi0Jc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3RhYmxlICgmdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyogQWRkIHRoZSB0YWJsZSB0byB0aGUgbmFtZXNwYWNlICovCi0KLQlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUgKHRhYmxlX2luZm8uaW5zdGFsbGVkX2Rlc2MsIHBhcmVudF9ub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCS8qIFVuaW5zdGFsbCB0YWJsZSBvbiBlcnJvciAqLwotCi0JCSh2b2lkKSBhY3BpX3RiX3VuaW5zdGFsbF90YWJsZSAodGFibGVfaW5mby5pbnN0YWxsZWRfZGVzYyk7Ci0JCWdvdG8gY2xlYW51cDsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogSW5pdCB0aGUgdGFibGUgaGFuZGxlICovCiAKIAlvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9IEFNTF9MT0FEX09QOwotCW9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0ID0gdGFibGVfaW5mby5pbnN0YWxsZWRfZGVzYzsKIAkqZGRiX2hhbmRsZSA9IG9ial9kZXNjOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCisJLyogSW5zdGFsbCB0aGUgbmV3IHRhYmxlIGludG8gdGhlIGxvY2FsIGRhdGEgc3RydWN0dXJlcyAqLwogCi1jbGVhbnVwOgotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlBQ1BJX01FTVNFVCgmdGFibGVfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKKworCXRhYmxlX2luZm8udHlwZSA9IEFDUElfVEFCTEVfU1NEVDsKKwl0YWJsZV9pbmZvLnBvaW50ZXIgPSB0YWJsZTsKKwl0YWJsZV9pbmZvLmxlbmd0aCA9IChhY3BpX3NpemUpIHRhYmxlLT5sZW5ndGg7CisJdGFibGVfaW5mby5hbGxvY2F0aW9uID0gQUNQSV9NRU1fQUxMT0NBVEVEOworCisJc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3RhYmxlKCZ0YWJsZV9pbmZvKTsKKwlvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCA9IHRhYmxlX2luZm8uaW5zdGFsbGVkX2Rlc2M7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJaWYgKHN0YXR1cyA9PSBBRV9BTFJFQURZX0VYSVNUUykgeworCQkJLyogVGFibGUgYWxyZWFkeSBleGlzdHMsIGp1c3QgcmV0dXJuIHRoZSBoYW5kbGUgKi8KKworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJfQorCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogQWRkIHRoZSB0YWJsZSB0byB0aGUgbmFtZXNwYWNlICovCisKKwlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUodGFibGVfaW5mby5pbnN0YWxsZWRfZGVzYywgcGFyZW50X25vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkvKiBVbmluc3RhbGwgdGFibGUgb24gZXJyb3IgKi8KKworCQkodm9pZClhY3BpX3RiX3VuaW5zdGFsbF90YWJsZSh0YWJsZV9pbmZvLmluc3RhbGxlZF9kZXNjKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisKKyAgICAgIGNsZWFudXA6CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkqZGRiX2hhbmRsZSA9IE5VTEw7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9sb2FkX3RhYmxlX29wCkBAIC0xNTEsNTYgKzE0OSw1MyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfbG9hZF90YWJsZV9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmV0dXJuX2Rlc2MpCithY3BpX2V4X2xvYWRfdGFibGVfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9kZXNjKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnN0YXJ0X25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyYW1ldGVyX25vZGUgPSBOVUxMOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRkYl9oYW5kbGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzdGFydF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJhbWV0ZXJfbm9kZSA9IE5VTEw7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGRiX2hhbmRsZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2xvYWRfdGFibGVfb3AiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2xvYWRfdGFibGVfb3AiKTsKIAogI2lmIDAKIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2ggb25lIG9mIHRoZSB0YWJsZXMgdGhhdAogCSAqIGlzIGFscmVhZHkgbG9hZGVkLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlIChvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciwgTlVMTCk7CisJc3RhdHVzID0gYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUob3BlcmFuZFswXS0+c3RyaW5nLnBvaW50ZXIsIE5VTEwpOwogCWlmIChzdGF0dXMgPT0gQUVfT0spIHsKIAkJLyogU2lnbmF0dXJlIG1hdGNoZWQgLS0gZG9uJ3QgYWxsb3cgb3ZlcnJpZGUgKi8KIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FMUkVBRFlfRVhJU1RTKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FMUkVBRFlfRVhJU1RTKTsKIAl9CiAjZW5kaWYKIAogCS8qIEZpbmQgdGhlIEFDUEkgdGFibGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfZmluZF90YWJsZSAob3BlcmFuZFswXS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkgICBvcGVyYW5kWzFdLT5zdHJpbmcucG9pbnRlciwKLQkJCSAgIG9wZXJhbmRbMl0tPnN0cmluZy5wb2ludGVyLCAmdGFibGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3RiX2ZpbmRfdGFibGUob3BlcmFuZFswXS0+c3RyaW5nLnBvaW50ZXIsCisJCQkJICAgIG9wZXJhbmRbMV0tPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICBvcGVyYW5kWzJdLT5zdHJpbmcucG9pbnRlciwgJnRhYmxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJaWYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJLyogVGFibGUgbm90IGZvdW5kLCByZXR1cm4gYW4gSW50ZWdlcj0wIGFuZCBBRV9PSyAqLwogCi0JCWRkYl9oYW5kbGUgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJZGRiX2hhbmRsZSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CiAJCWlmICghZGRiX2hhbmRsZSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAogCQlkZGJfaGFuZGxlLT5pbnRlZ2VyLnZhbHVlID0gMDsKIAkJKnJldHVybl9kZXNjID0gZGRiX2hhbmRsZTsKIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBEZWZhdWx0IG5vZGVzICovCkBAIC0yMTUsMTAgKzIxMCwxMiBAQAogCQkgKiBGaW5kIHRoZSBub2RlIHJlZmVyZW5jZWQgYnkgdGhlIHJvb3RfcGF0aF9zdHJpbmcuIFRoaXMgaXMgdGhlCiAJCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgbmFtZXNwYWNlIHdoZXJlIHRoZSB0YWJsZSB3aWxsIGJlIGxvYWRlZC4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aCAob3BlcmFuZFszXS0+c3RyaW5nLnBvaW50ZXIsIHN0YXJ0X25vZGUsCi0JCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCAmcGFyZW50X25vZGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2dldF9ub2RlX2J5X3BhdGgob3BlcmFuZFszXS0+c3RyaW5nLnBvaW50ZXIsCisJCQkJCSAgICAgc3RhcnRfbm9kZSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCQkgICAgICZwYXJlbnRfbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKQEAgLTIyNiw3ICsyMjMsNyBAQAogCiAJaWYgKG9wZXJhbmRbNF0tPnN0cmluZy5sZW5ndGggPiAwKSB7CiAJCWlmICgob3BlcmFuZFs0XS0+c3RyaW5nLnBvaW50ZXJbMF0gIT0gJ1xcJykgJiYKLQkJCShvcGVyYW5kWzRdLT5zdHJpbmcucG9pbnRlclswXSAhPSAnXicpKSB7CisJCSAgICAob3BlcmFuZFs0XS0+c3RyaW5nLnBvaW50ZXJbMF0gIT0gJ14nKSkgewogCQkJLyoKIAkJCSAqIFBhdGggaXMgbm90IGFic29sdXRlLCBzbyBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBub2RlCiAJCQkgKiByZWZlcmVuY2VkIGJ5IHRoZSByb290X3BhdGhfc3RyaW5nIChvciB0aGUgTlMgcm9vdCBpZiBvbWl0dGVkKQpAQCAtMjM2LDE4ICsyMzMsMjAgQEAKIAogCQkvKiBGaW5kIHRoZSBub2RlIHJlZmVyZW5jZWQgYnkgdGhlIHBhcmFtZXRlcl9wYXRoX3N0cmluZyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aCAob3BlcmFuZFs0XS0+c3RyaW5nLnBvaW50ZXIsIHN0YXJ0X25vZGUsCi0JCQkJIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgJnBhcmFtZXRlcl9ub2RlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoKG9wZXJhbmRbNF0tPnN0cmluZy5wb2ludGVyLAorCQkJCQkgICAgIHN0YXJ0X25vZGUsIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwKKwkJCQkJICAgICAmcGFyYW1ldGVyX25vZGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCiAJLyogTG9hZCB0aGUgdGFibGUgaW50byB0aGUgbmFtZXNwYWNlICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X2FkZF90YWJsZSAodGFibGUsIHBhcmVudF9ub2RlLCAmZGRiX2hhbmRsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9leF9hZGRfdGFibGUodGFibGUsIHBhcmVudF9ub2RlLCAmZGRiX2hhbmRsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFBhcmFtZXRlciBEYXRhIChvcHRpb25hbCkgKi8KQEAgLTI1NSwyMCArMjU0LDIwIEBACiAJaWYgKHBhcmFtZXRlcl9ub2RlKSB7CiAJCS8qIFN0b3JlIHRoZSBwYXJhbWV0ZXIgZGF0YSBpbnRvIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgb2JqZWN0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZSAob3BlcmFuZFs1XSwKLQkJCQkgQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgcGFyYW1ldGVyX25vZGUpLAotCQkJCSB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJKHZvaWQpIGFjcGlfZXhfdW5sb2FkX3RhYmxlIChkZGJfaGFuZGxlKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9leF9zdG9yZShvcGVyYW5kWzVdLAorCQkJCSAgICAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsCisJCQkJCQkgICAgIHBhcmFtZXRlcl9ub2RlKSwKKwkJCQkgICAgICAgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJKHZvaWQpYWNwaV9leF91bmxvYWRfdGFibGUoZGRiX2hhbmRsZSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCSpyZXR1cm5fZGVzYyA9IGRkYl9oYW5kbGU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTICAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2xvYWRfb3AKQEAgLTI4NSwzOCArMjg0LDM3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9sb2FkX29wICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YXJnZXQsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZXhfbG9hZF9vcCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGFyZ2V0LAorCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRkYl9oYW5kbGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqYnVmZmVyX2Rlc2MgPSBOVUxMOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlX3B0ciA9IE5VTEw7Ci0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgdGFibGVfaGVhZGVyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGRiX2hhbmRsZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpidWZmZXJfZGVzYyA9IE5VTEw7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9wdHIgPSBOVUxMOworCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciB0YWJsZV9oZWFkZXI7CisJdTMyIGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfbG9hZF9vcCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfbG9hZF9vcCIpOwogCiAJLyogT2JqZWN0IGNhbiBiZSBlaXRoZXIgYW4gb3BfcmVnaW9uIG9yIGEgRmllbGQgKi8KIAotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJMb2FkIGZyb20gUmVnaW9uICVwICVzXG4iLAotCQkJb2JqX2Rlc2MsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJMb2FkIGZyb20gUmVnaW9uICVwICVzXG4iLAorCQkJCSAgb2JqX2Rlc2MsCisJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSkpOwogCiAJCS8qCiAJCSAqIElmIHRoZSBSZWdpb24gQWRkcmVzcyBhbmQgTGVuZ3RoIGhhdmUgbm90IGJlZW4gcHJldmlvdXNseSBldmFsdWF0ZWQsCiAJCSAqIGV2YWx1YXRlIHRoZW0gbm93IGFuZCBzYXZlIHRoZSByZXN1bHRzLgogCQkgKi8KIAkJaWYgKCEob2JqX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSkgewotCQkJc3RhdHVzID0gYWNwaV9kc19nZXRfcmVnaW9uX2FyZ3VtZW50cyAob2JqX2Rlc2MpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHMob2JqX2Rlc2MpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CiAJCX0KIApAQCAtMzI4LDExNiArMzI2LDEyNyBAQAogCiAJCXRhYmxlX2hlYWRlci5sZW5ndGggPSAwOwogCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2V2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2ggKG9ial9kZXNjLCBBQ1BJX1JFQUQsCi0JCQkJCSAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIChpICsgYWRkcmVzcyksIDgsCi0JCQkJCSAgICgodTggKikgJnRhYmxlX2hlYWRlcikgKyBpKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaChvYmpfZGVzYywgQUNQSV9SRUFELAorCQkJCQkJCSAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCQkJICAgKGkgKyBhZGRyZXNzKSwgOCwKKwkJCQkJCQkgICAoKHU4ICopICYKKwkJCQkJCQkgICAgdGFibGVfaGVhZGVyKSArIGkpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CiAJCX0KIAogCQkvKiBTYW5pdHkgY2hlY2sgdGhlIHRhYmxlIGxlbmd0aCAqLwogCi0JCWlmICh0YWJsZV9oZWFkZXIubGVuZ3RoIDwgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9IRUFERVIpOworCQlpZiAodGFibGVfaGVhZGVyLmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0hFQURFUik7CiAJCX0KIAogCQkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGVudGlyZSB0YWJsZSAqLwogCi0JCXRhYmxlX3B0ciA9IEFDUElfTUVNX0FMTE9DQVRFICh0YWJsZV9oZWFkZXIubGVuZ3RoKTsKKwkJdGFibGVfcHRyID0gQUNQSV9NRU1fQUxMT0NBVEUodGFibGVfaGVhZGVyLmxlbmd0aCk7CiAJCWlmICghdGFibGVfcHRyKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCS8qIEdldCB0aGUgZW50aXJlIHRhYmxlIGZyb20gdGhlIG9wIHJlZ2lvbiAqLwogCiAJCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9oZWFkZXIubGVuZ3RoOyBpKyspIHsKLQkJCXN0YXR1cyA9IGFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaCAob2JqX2Rlc2MsIEFDUElfUkVBRCwKLQkJCQkJICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgKGkgKyBhZGRyZXNzKSwgOCwKLQkJCQkJICAgKCh1OCAqKSB0YWJsZV9wdHIgKyBpKSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaChvYmpfZGVzYywgQUNQSV9SRUFELAorCQkJCQkJCSAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCQkJICAgKGkgKyBhZGRyZXNzKSwgOCwKKwkJCQkJCQkgICAoKHU4ICopIHRhYmxlX3B0ciArCisJCQkJCQkJICAgIGkpKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCWdvdG8gY2xlYW51cDsKIAkJCX0KIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIkxvYWQgZnJvbSBGaWVsZCAlcCAlc1xuIiwKLQkJCW9ial9kZXNjLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYykpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiTG9hZCBmcm9tIEZpZWxkICVwICVzXG4iLAorCQkJCSAgb2JqX2Rlc2MsCisJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSkpOwogCiAJCS8qCiAJCSAqIFRoZSBsZW5ndGggb2YgdGhlIGZpZWxkIG11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIHRhYmxlLgogCQkgKiBSZWFkIHRoZSBlbnRpcmUgZmllbGQgYW5kIHRodXMgdGhlIGVudGlyZSB0YWJsZS4gIEJ1ZmZlciBpcwogCQkgKiBhbGxvY2F0ZWQgZHVyaW5nIHRoZSByZWFkLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9yZWFkX2RhdGFfZnJvbV9maWVsZCAod2Fsa19zdGF0ZSwgb2JqX2Rlc2MsICZidWZmZXJfZGVzYyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCWdvdG8gY2xlYW51cDsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQod2Fsa19zdGF0ZSwgb2JqX2Rlc2MsCisJCQkJCQkgJmJ1ZmZlcl9kZXNjKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCi0JCXRhYmxlX3B0ciA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwKLQkJCQkgIGJ1ZmZlcl9kZXNjLT5idWZmZXIucG9pbnRlcik7CisJCXRhYmxlX3B0ciA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyLAorCQkJCQkgIGJ1ZmZlcl9kZXNjLT5idWZmZXIucG9pbnRlcik7CiAKLQkJIC8qIFNhbml0eSBjaGVjayB0aGUgdGFibGUgbGVuZ3RoICovCisJCS8qIEFsbCBkb25lIHdpdGggdGhlIGJ1ZmZlcl9kZXNjLCBkZWxldGUgaXQgKi8KIAotCQlpZiAodGFibGVfcHRyLT5sZW5ndGggPCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX0hFQURFUik7CisJCWJ1ZmZlcl9kZXNjLT5idWZmZXIucG9pbnRlciA9IE5VTEw7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShidWZmZXJfZGVzYyk7CisKKwkJLyogU2FuaXR5IGNoZWNrIHRoZSB0YWJsZSBsZW5ndGggKi8KKworCQlpZiAodGFibGVfcHRyLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgeworCQkJc3RhdHVzID0gQUVfQkFEX0hFQURFUjsKKwkJCWdvdG8gY2xlYW51cDsKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCX0KIAogCS8qIFRoZSB0YWJsZSBtdXN0IGJlIGVpdGhlciBhbiBTU0RUIG9yIGEgUFNEVCAqLwogCi0JaWYgKCghQUNQSV9TVFJOQ01QICh0YWJsZV9wdHItPnNpZ25hdHVyZSwKLQkJCSAgYWNwaV9nYmxfdGFibGVfZGF0YVtBQ1BJX1RBQkxFX1BTRFRdLnNpZ25hdHVyZSwKLQkJCSAgYWNwaV9nYmxfdGFibGVfZGF0YVtBQ1BJX1RBQkxFX1BTRFRdLnNpZ19sZW5ndGgpKSAmJgotCQkoIUFDUElfU1RSTkNNUCAodGFibGVfcHRyLT5zaWduYXR1cmUsCi0JCQkJIGFjcGlfZ2JsX3RhYmxlX2RhdGFbQUNQSV9UQUJMRV9TU0RUXS5zaWduYXR1cmUsCi0JCQkJIGFjcGlfZ2JsX3RhYmxlX2RhdGFbQUNQSV9UQUJMRV9TU0RUXS5zaWdfbGVuZ3RoKSkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiVGFibGUgaGFzIGludmFsaWQgc2lnbmF0dXJlIFslNC40c10sIG11c3QgYmUgU1NEVCBvciBQU0RUXG4iLAotCQkJdGFibGVfcHRyLT5zaWduYXR1cmUpKTsKKwlpZiAoKCFBQ1BJX1NUUk5DTVAodGFibGVfcHRyLT5zaWduYXR1cmUsCisJCQkgICBhY3BpX2dibF90YWJsZV9kYXRhW0FDUElfVEFCTEVfUFNEVF0uc2lnbmF0dXJlLAorCQkJICAgYWNwaV9nYmxfdGFibGVfZGF0YVtBQ1BJX1RBQkxFX1BTRFRdLnNpZ19sZW5ndGgpKSAmJgorCSAgICAoIUFDUElfU1RSTkNNUCh0YWJsZV9wdHItPnNpZ25hdHVyZSwKKwkJCSAgIGFjcGlfZ2JsX3RhYmxlX2RhdGFbQUNQSV9UQUJMRV9TU0RUXS5zaWduYXR1cmUsCisJCQkgICBhY3BpX2dibF90YWJsZV9kYXRhW0FDUElfVEFCTEVfU1NEVF0uc2lnX2xlbmd0aCkpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVGFibGUgaGFzIGludmFsaWQgc2lnbmF0dXJlIFslNC40c10sIG11c3QgYmUgU1NEVCBvciBQU0RUXG4iLAorCQkJCSAgdGFibGVfcHRyLT5zaWduYXR1cmUpKTsKIAkJc3RhdHVzID0gQUVfQkFEX1NJR05BVFVSRTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIEluc3RhbGwgdGhlIG5ldyB0YWJsZSBpbnRvIHRoZSBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXhfYWRkX3RhYmxlICh0YWJsZV9wdHIsIGFjcGlfZ2JsX3Jvb3Rfbm9kZSwgJmRkYl9oYW5kbGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwOworCXN0YXR1cyA9IGFjcGlfZXhfYWRkX3RhYmxlKHRhYmxlX3B0ciwgYWNwaV9nYmxfcm9vdF9ub2RlLCAmZGRiX2hhbmRsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCS8qIE9uIGVycm9yLCB0YWJsZV9wdHIgd2FzIGRlYWxsb2NhdGVkIGFib3ZlICovCisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogU3RvcmUgdGhlIGRkYl9oYW5kbGUgaW50byB0aGUgVGFyZ2V0IG9wZXJhbmQgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUgKGRkYl9oYW5kbGUsIHRhcmdldCwgd2Fsa19zdGF0ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkodm9pZCkgYWNwaV9leF91bmxvYWRfdGFibGUgKGRkYl9oYW5kbGUpOworCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUoZGRiX2hhbmRsZSwgdGFyZ2V0LCB3YWxrX3N0YXRlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJKHZvaWQpYWNwaV9leF91bmxvYWRfdGFibGUoZGRiX2hhbmRsZSk7CisKKwkJLyogdGFibGVfcHRyIHdhcyBkZWFsbG9jYXRlZCBhYm92ZSAqLworCisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLQotCi1jbGVhbnVwOgotCi0JaWYgKGJ1ZmZlcl9kZXNjKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoYnVmZmVyX2Rlc2MpOworICAgICAgY2xlYW51cDoKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9NRU1fRlJFRSh0YWJsZV9wdHIpOwogCX0KLQllbHNlIHsKLQkJQUNQSV9NRU1fRlJFRSAodGFibGVfcHRyKTsKLQl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfdW5sb2FkX3RhYmxlCkBAIC00NTAsMTcgKzQ1OSwxMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3VubG9hZF90YWJsZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGRiX2hhbmRsZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfdW5sb2FkX3RhYmxlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRkYl9oYW5kbGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YWJsZV9kZXNjID0gZGRiX2hhbmRsZTsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhYmxlX2Rlc2MgPSBkZGJfaGFuZGxlOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm87CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF91bmxvYWRfdGFibGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3VubG9hZF90YWJsZSIpOwogCiAJLyoKIAkgKiBWYWxpZGF0ZSB0aGUgaGFuZGxlCkBAIC00NjksMjggKzQ3NCwyOCBAQAogCSAqIHZhbGlkYXRlZCBoZXJlLgogCSAqLwogCWlmICgoIWRkYl9oYW5kbGUpIHx8Ci0JCShBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKGRkYl9oYW5kbGUpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHx8Ci0JCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoZGRiX2hhbmRsZSkgIT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkgICAgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShkZGJfaGFuZGxlKSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB8fAorCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoZGRiX2hhbmRsZSkgIT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIEdldCB0aGUgYWN0dWFsIHRhYmxlIGRlc2NyaXB0b3IgZnJvbSB0aGUgZGRiX2hhbmRsZSAqLwogCi0JdGFibGVfaW5mbyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICopIHRhYmxlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3Q7CisJdGFibGVfaW5mbyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICopdGFibGVfZGVzYy0+cmVmZXJlbmNlLm9iamVjdDsKIAogCS8qCiAJICogRGVsZXRlIHRoZSBlbnRpcmUgbmFtZXNwYWNlIHVuZGVyIHRoaXMgdGFibGUgTm9kZQogCSAqIChPZmZzZXQgY29udGFpbnMgdGhlIHRhYmxlX2lkKQogCSAqLwotCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lciAodGFibGVfaW5mby0+dGFibGVfaWQpOworCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcih0YWJsZV9pbmZvLT5vd25lcl9pZCk7CisJYWNwaV91dF9yZWxlYXNlX293bmVyX2lkKCZ0YWJsZV9pbmZvLT5vd25lcl9pZCk7CiAKIAkvKiBEZWxldGUgdGhlIHRhYmxlIGl0c2VsZiAqLwogCi0JKHZvaWQpIGFjcGlfdGJfdW5pbnN0YWxsX3RhYmxlICh0YWJsZV9pbmZvLT5pbnN0YWxsZWRfZGVzYyk7CisJKHZvaWQpYWNwaV90Yl91bmluc3RhbGxfdGFibGUodGFibGVfaW5mby0+aW5zdGFsbGVkX2Rlc2MpOwogCiAJLyogRGVsZXRlIHRoZSB0YWJsZSBkZXNjcmlwdG9yIChkZGJfaGFuZGxlKSAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlICh0YWJsZV9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHRhYmxlX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbnZydC5jCmluZGV4IDk3ODU2YzQuLjA0ZTUxOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbnZydC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbnZydC5jCkBAIC00MSwyNCArNDEsMTcgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4Y29udnJ0IikKK0FDUElfTU9EVUxFX05BTUUoImV4Y29udnJ0IikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCiBzdGF0aWMgdTMyCi1hY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW50ZWdlciwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2xlbmd0aCk7Ci0KK2FjcGlfZXhfY29udmVydF90b19hc2NpaShhY3BpX2ludGVnZXIgaW50ZWdlciwKKwkJCSB1MTYgYmFzZSwgdTggKiBzdHJpbmcsIHU4IG1heF9sZW5ndGgpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc2LDI5ICs2OSwyNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmVzdWx0X2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK2FjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJlc3VsdF9kZXNjLCB1MzIgZmxhZ3MpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9pbnRlcjsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHJlc3VsdDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKKwl1OCAqcG9pbnRlcjsKKwlhY3BpX2ludGVnZXIgcmVzdWx0OworCXUzMiBpOworCXUzMiBjb3VudDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfY29udmVydF90b19pbnRlZ2VyIiwgb2JqX2Rlc2MpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9jb252ZXJ0X3RvX2ludGVnZXIiLCBvYmpfZGVzYyk7Ci0KLQotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAogCQkvKiBObyBjb252ZXJzaW9uIG5lY2Vzc2FyeSAqLwogCiAJCSpyZXN1bHRfZGVzYyA9IG9ial9kZXNjOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6CkBAIC0xMDYsMTEgKzk1LDExIEBACiAJCS8qIE5vdGU6IFRha2VzIGFkdmFudGFnZSBvZiBjb21tb24gYnVmZmVyL3N0cmluZyBmaWVsZHMgKi8KIAogCQlwb2ludGVyID0gb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOwotCQljb3VudCAgID0gb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7CisJCWNvdW50ID0gb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9UWVBFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1RZUEUpOwogCX0KIAogCS8qCkBAIC0xMjYsNyArMTE1LDcgQEAKIAogCS8qIFN0cmluZyBjb252ZXJzaW9uIGlzIGRpZmZlcmVudCB0aGFuIEJ1ZmZlciBjb252ZXJzaW9uICovCiAKLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAogCQkvKgpAQCAtMTM1LDE5ICsxMjQsMTggQEAKIAkJICogb2YgQUNQSSAzLjApIGlzIHRoYXQgdGhlIHRvX2ludGVnZXIoKSBvcGVyYXRvciBhbGxvd3MgYm90aCBkZWNpbWFsCiAJCSAqIGFuZCBoZXhhZGVjaW1hbCBzdHJpbmdzIChoZXggcHJlZml4ZWQgd2l0aCAiMHgiKS4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfdXRfc3RydG91bDY0ICgoY2hhciAqKSBwb2ludGVyLCBmbGFncywgJnJlc3VsdCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV91dF9zdHJ0b3VsNjQoKGNoYXIgKilwb2ludGVyLCBmbGFncywgJnJlc3VsdCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAogCQkvKiBDaGVjayBmb3IgemVyby1sZW5ndGggYnVmZmVyICovCiAKIAkJaWYgKCFjb3VudCkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQlVGRkVSX0xJTUlUKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQlVGRkVSX0xJTUlUKTsKIAkJfQogCiAJCS8qIFRyYW5zZmVyIG5vIG1vcmUgdGhhbiBhbiBpbnRlZ2VyJ3Mgd29ydGggb2YgZGF0YSAqLwpAQCAtMTcwLDcgKzE1OCw2IEBACiAJCX0KIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAJCS8qIE5vIG90aGVyIHR5cGVzIGNhbiBnZXQgaGVyZSAqLwogCQlicmVhazsKQEAgLTE3OCwyMCArMTY1LDE5IEBACiAKIAkvKiBDcmVhdGUgYSBuZXcgaW50ZWdlciAqLwogCi0JcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CiAJaWYgKCFyZXR1cm5fZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCS8qIFNhdmUgdGhlIFJlc3VsdCAqLwogCiAJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSByZXN1bHQ7Ci0JYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZSAocmV0dXJuX2Rlc2MpOworCWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUocmV0dXJuX2Rlc2MpOwogCSpyZXN1bHRfZGVzYyA9IHJldHVybl9kZXNjOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcgpAQCAtMjA3LDI1ICsxOTMsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmVzdWx0X2Rlc2MpCithY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmVzdWx0X2Rlc2MpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmV3X2J1ZjsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKKwl1OCAqbmV3X2J1ZjsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9jb252ZXJ0X3RvX2J1ZmZlciIsIG9ial9kZXNjKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfY29udmVydF90b19idWZmZXIiLCBvYmpfZGVzYyk7Ci0KLQotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCiAJCS8qIE5vIGNvbnZlcnNpb24gbmVjZXNzYXJ5ICovCiAKIAkJKnJlc3VsdF9kZXNjID0gb2JqX2Rlc2M7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwotCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCkBAIC0yMzMsMjAgKzIxNSwyMCBAQAogCQkgKiBDcmVhdGUgYSBuZXcgQnVmZmVyIG9iamVjdC4KIAkJICogTmVlZCBlbm91Z2ggc3BhY2UgZm9yIG9uZSBpbnRlZ2VyCiAJCSAqLwotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QgKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7CisJCXJldHVybl9kZXNjID0KKwkJICAgIGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAogCQkvKiBDb3B5IHRoZSBpbnRlZ2VyIHRvIHRoZSBidWZmZXIsIExTQiBmaXJzdCAqLwogCiAJCW5ld19idWYgPSByZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7Ci0JCUFDUElfTUVNQ1BZIChuZXdfYnVmLAotCQkJCSAgJm9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlLAotCQkJCSAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKKwkJQUNQSV9NRU1DUFkobmV3X2J1ZiwKKwkJCSAgICAmb2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCisJCQkgICAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAogCQkvKgpAQCAtMjU4LDMyICsyNDAsMzEgQEAKIAkJICogQVNML0FNTCBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgbnVsbCBiZWluZyB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3CiAJCSAqIGJ1ZmZlci4KIAkJICovCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCAoCi0JCQkJICAoYWNwaV9zaXplKSBvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCArIDEpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgICBvYmpfZGVzYy0+c3RyaW5nLgorCQkJCQkJCSAgIGxlbmd0aCArIDEpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCS8qIENvcHkgdGhlIHN0cmluZyB0byB0aGUgYnVmZmVyICovCiAKIAkJbmV3X2J1ZiA9IHJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlcjsKLQkJQUNQSV9TVFJOQ1BZICgoY2hhciAqKSBuZXdfYnVmLCAoY2hhciAqKSBvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCi0JCQlvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCk7CisJCUFDUElfU1RSTkNQWSgoY2hhciAqKW5ld19idWYsIChjaGFyICopb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLAorCQkJICAgICBvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCk7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiAJfQogCiAJLyogTWFyayBidWZmZXIgaW5pdGlhbGl6ZWQgKi8KIAogCXJldHVybl9kZXNjLT5jb21tb24uZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7CiAJKnJlc3VsdF9kZXNjID0gcmV0dXJuX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkKQEAgLTMwMCwyNCArMjgxLDE5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdTMyCi1hY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW50ZWdlciwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV93aWR0aCkKK2FjcGlfZXhfY29udmVydF90b19hc2NpaShhY3BpX2ludGVnZXIgaW50ZWdlciwKKwkJCSB1MTYgYmFzZSwgdTggKiBzdHJpbmcsIHU4IGRhdGFfd2lkdGgpCiB7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBkaWdpdDsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBqOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgayA9IDA7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBoZXhfbGVuZ3RoOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgZGVjaW1hbF9sZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXByZXNzX3plcm9zOworCWFjcGlfaW50ZWdlciBkaWdpdDsKKwlhY3BpX25hdGl2ZV91aW50IGk7CisJYWNwaV9uYXRpdmVfdWludCBqOworCWFjcGlfbmF0aXZlX3VpbnQgayA9IDA7CisJYWNwaV9uYXRpdmVfdWludCBoZXhfbGVuZ3RoOworCWFjcGlfbmF0aXZlX3VpbnQgZGVjaW1hbF9sZW5ndGg7CisJdTMyIHJlbWFpbmRlcjsKKwl1OCBzdXByZXNzX3plcm9zOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJc3dpdGNoIChiYXNlKSB7CiAJY2FzZSAxMDoKQEAgLTMzOSw3ICszMTUsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlzdXByZXNzX3plcm9zID0gVFJVRTsgICAgLyogTm8gbGVhZGluZyB6ZXJvcyAqLworCQlzdXByZXNzX3plcm9zID0gVFJVRTsJLyogTm8gbGVhZGluZyB6ZXJvcyAqLwogCQlyZW1haW5kZXIgPSAwOwogCiAJCWZvciAoaSA9IGRlY2ltYWxfbGVuZ3RoOyBpID4gMDsgaS0tKSB7CkBAIC0zNDcsNyArMzIzLDggQEAKIAogCQkJZGlnaXQgPSBpbnRlZ2VyOwogCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgewotCQkJCSh2b2lkKSBhY3BpX3V0X3Nob3J0X2RpdmlkZSAoZGlnaXQsIDEwLCAmZGlnaXQsICZyZW1haW5kZXIpOworCQkJCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKGRpZ2l0LCAxMCwgJmRpZ2l0LAorCQkJCQkJCSAgICZyZW1haW5kZXIpOwogCQkJfQogCiAJCQkvKiBIYW5kbGUgbGVhZGluZyB6ZXJvcyAqLwpAQCAtMzY3LDExICszNDQsMTMgQEAKIAogCQkvKiBoZXhfbGVuZ3RoOiAyIGFzY2lpIGhleCBjaGFycyBwZXIgZGF0YSBieXRlICovCiAKLQkJaGV4X2xlbmd0aCA9IEFDUElfTVVMXzIgKGRhdGFfd2lkdGgpOwotCQlmb3IgKGkgPSAwLCBqID0gKGhleF9sZW5ndGgtMSk7IGkgPCBoZXhfbGVuZ3RoOyBpKyssIGotLSkgeworCQloZXhfbGVuZ3RoID0gKGFjcGlfbmF0aXZlX3VpbnQpIEFDUElfTVVMXzIoZGF0YV93aWR0aCk7CisJCWZvciAoaSA9IDAsIGogPSAoaGV4X2xlbmd0aCAtIDEpOyBpIDwgaGV4X2xlbmd0aDsgaSsrLCBqLS0pIHsKIAkJCS8qIEdldCBvbmUgaGV4IGRpZ2l0LCBtb3N0IHNpZ25pZmljYW50IGRpZ2l0cyBmaXJzdCAqLwogCi0JCQlzdHJpbmdba10gPSAodTgpIGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIgKGludGVnZXIsIEFDUElfTVVMXzQgKGopKTsKKwkJCXN0cmluZ1trXSA9CisJCQkgICAgKHU4KSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKGludGVnZXIsCisJCQkJCQkJICAgQUNQSV9NVUxfNChqKSk7CiAJCQlrKys7CiAJCX0KIAkJYnJlYWs7CkBAIC0zODcsMTUgKzM2NiwxNCBAQAogCSAqIEZpbmFsbHksIG51bGwgdGVybWluYXRlIHRoZSBzdHJpbmcgYW5kIHJldHVybiB0aGUgbGVuZ3RoCiAJICovCiAJaWYgKCFrKSB7Ci0JCXN0cmluZyBbMF0gPSBBQ1BJX0FTQ0lJX1pFUk87CisJCXN0cmluZ1swXSA9IEFDUElfQVNDSUlfWkVSTzsKIAkJayA9IDE7CiAJfQogCi0Jc3RyaW5nIFtrXSA9IDA7CisJc3RyaW5nW2tdID0gMDsKIAlyZXR1cm4gKCh1MzIpIGspOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY29udmVydF90b19zdHJpbmcKQEAgLTQxMiwzMCArMzkwLDI1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJlc3VsdF9kZXNjLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSkKK2FjcGlfZXhfY29udmVydF90b19zdHJpbmcodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqIG9ial9kZXNjLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqIHJlc3VsdF9kZXNjLCB1MzIgdHlwZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYzsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXdfYnVmOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGggPSAwOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDE2OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gJywnOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOworCXU4ICpuZXdfYnVmOworCXUzMiBpOworCXUzMiBzdHJpbmdfbGVuZ3RoID0gMDsKKwl1MTYgYmFzZSA9IDE2OworCXU4IHNlcGFyYXRvciA9ICcsJzsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9jb252ZXJ0X3RvX3N0cmluZyIsIG9ial9kZXNjKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfY29udmVydF90b19zdHJpbmciLCBvYmpfZGVzYyk7Ci0KLQotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCS8qIE5vIGNvbnZlcnNpb24gbmVjZXNzYXJ5ICovCiAKIAkJKnJlc3VsdF9kZXNjID0gb2JqX2Rlc2M7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwotCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCkBAIC00NTIsNyArNDI1LDcgQEAKIAogCQkJLyogVHdvIGhleCBzdHJpbmcgY2hhcmFjdGVycyBmb3IgZWFjaCBpbnRlZ2VyIGJ5dGUgKi8KIAotCQkJc3RyaW5nX2xlbmd0aCA9IEFDUElfTVVMXzIgKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7CisJCQlzdHJpbmdfbGVuZ3RoID0gQUNQSV9NVUxfMihhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNDYwLDMxICs0MzMsMzMgQEAKIAkJICogQ3JlYXRlIGEgbmV3IFN0cmluZwogCQkgKiBOZWVkIGVub3VnaCBzcGFjZSBmb3Igb25lIEFTQ0lJIGludGVnZXIgKHBsdXMgbnVsbCB0ZXJtaW5hdG9yKQogCQkgKi8KLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0ICgoYWNwaV9zaXplKSBzdHJpbmdfbGVuZ3RoKTsKKwkJcmV0dXJuX2Rlc2MgPQorCQkgICAgYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdCgoYWNwaV9zaXplKSBzdHJpbmdfbGVuZ3RoKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAogCQluZXdfYnVmID0gcmV0dXJuX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOwogCiAJCS8qIENvbnZlcnQgaW50ZWdlciB0byBzdHJpbmcgKi8KIAotCQlzdHJpbmdfbGVuZ3RoID0gYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpIChvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSwgYmFzZSwKLQkJCQkgICBuZXdfYnVmLCBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpOworCQlzdHJpbmdfbGVuZ3RoID0KKwkJICAgIGFjcGlfZXhfY29udmVydF90b19hc2NpaShvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSwgYmFzZSwKKwkJCQkJICAgICBuZXdfYnVmLAorCQkJCQkgICAgIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7CiAKIAkJLyogTnVsbCB0ZXJtaW5hdGUgYXQgdGhlIGNvcnJlY3QgcGxhY2UgKi8KIAogCQlyZXR1cm5fZGVzYy0+c3RyaW5nLmxlbmd0aCA9IHN0cmluZ19sZW5ndGg7Ci0JCW5ld19idWYgW3N0cmluZ19sZW5ndGhdID0gMDsKKwkJbmV3X2J1ZltzdHJpbmdfbGVuZ3RoXSA9IDA7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAKIAkJLyogU2V0dXAgc3RyaW5nIGxlbmd0aCwgYmFzZSwgYW5kIHNlcGFyYXRvciAqLwogCiAJCXN3aXRjaCAodHlwZSkgewotCQljYXNlIEFDUElfRVhQTElDSVRfQ09OVkVSVF9ERUNJTUFMOiAvKiBVc2VkIGJ5IHRvX2RlY2ltYWxfc3RyaW5nICovCisJCWNhc2UgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0RFQ0lNQUw6CS8qIFVzZWQgYnkgdG9fZGVjaW1hbF9zdHJpbmcgKi8KIAkJCS8qCiAJCQkgKiBGcm9tIEFDUEk6ICJJZiBEYXRhIGlzIGEgYnVmZmVyLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgb2YKIAkJCSAqIGRlY2ltYWwgdmFsdWVzIHNlcGFyYXRlZCBieSBjb21tYXMuIgpAQCAtNDk4LDExICs0NzMsOSBAQAogCQkJZm9yIChpID0gMDsgaSA8IG9ial9kZXNjLT5idWZmZXIubGVuZ3RoOyBpKyspIHsKIAkJCQlpZiAob2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyW2ldID49IDEwMCkgewogCQkJCQlzdHJpbmdfbGVuZ3RoICs9IDQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG9ial9kZXNjLT5idWZmZXIucG9pbnRlcltpXSA+PSAxMCkgeworCQkJCX0gZWxzZSBpZiAob2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyW2ldID49IDEwKSB7CiAJCQkJCXN0cmluZ19sZW5ndGggKz0gMzsKLQkJCQl9Ci0JCQkJZWxzZSB7CisJCQkJfSBlbHNlIHsKIAkJCQkJc3RyaW5nX2xlbmd0aCArPSAyOwogCQkJCX0KIAkJCX0KQEAgLTUxOCw3ICs0OTEsNyBAQAogCQkJc3RyaW5nX2xlbmd0aCA9IChvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCAqIDMpOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfSEVYOiAgICAgLyogVXNlZCBieSB0b19oZXhfc3RyaW5nICovCisJCWNhc2UgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0hFWDoJLyogVXNlZCBieSB0b19oZXhfc3RyaW5nICovCiAJCQkvKgogCQkJICogRnJvbSBBQ1BJOiAiSWYgRGF0YSBpcyBhIGJ1ZmZlciwgaXQgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIG9mCiAJCQkgKiBoZXhhZGVjaW1hbCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iCkBAIC01MjcsNyArNTAwLDcgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCQl9CiAKIAkJLyoKQEAgLTUzNSwxNSArNTA4LDE2IEBACiAJCSAqICgtMSBiZWNhdXNlIG9mIGV4dHJhIHNlcGFyYXRvciBpbmNsdWRlZCBpbiBzdHJpbmdfbGVuZ3RoIGZyb20gYWJvdmUpCiAJCSAqLwogCQlzdHJpbmdfbGVuZ3RoLS07Ci0JCWlmIChzdHJpbmdfbGVuZ3RoID4gQUNQSV9NQVhfU1RSSU5HX0NPTlZFUlNJT04pIC8qIEFDUEkgbGltaXQgKi8gewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfU1RSSU5HX0xJTUlUKTsKKwkJaWYgKHN0cmluZ19sZW5ndGggPiBBQ1BJX01BWF9TVFJJTkdfQ09OVkVSU0lPTikgewkvKiBBQ1BJIGxpbWl0ICovCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1NUUklOR19MSU1JVCk7CiAJCX0KIAogCQkvKiBDcmVhdGUgYSBuZXcgc3RyaW5nIG9iamVjdCBhbmQgc3RyaW5nIGJ1ZmZlciAqLwogCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdCAoKGFjcGlfc2l6ZSkgc3RyaW5nX2xlbmd0aCk7CisJCXJldHVybl9kZXNjID0KKwkJICAgIGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QoKGFjcGlfc2l6ZSkgc3RyaW5nX2xlbmd0aCk7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJbmV3X2J1ZiA9IHJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlcjsKQEAgLTU1MywxMCArNTI3LDExIEBACiAJCSAqIChzZXBhcmF0ZWQgYnkgY29tbWFzIG9yIHNwYWNlcykKIAkJICovCiAJCWZvciAoaSA9IDA7IGkgPCBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aDsgaSsrKSB7Ci0JCQluZXdfYnVmICs9IGFjcGlfZXhfY29udmVydF90b19hc2NpaSAoCi0JCQkJCSAoYWNwaV9pbnRlZ2VyKSBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXJbaV0sIGJhc2UsCi0JCQkJCSBuZXdfYnVmLCAxKTsKLQkJCSpuZXdfYnVmKysgPSBzZXBhcmF0b3I7IC8qIGVhY2ggc2VwYXJhdGVkIGJ5IGEgY29tbWEgb3Igc3BhY2UgKi8KKwkJCW5ld19idWYgKz0gYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpKChhY3BpX2ludGVnZXIpCisJCQkJCQkJICAgIG9ial9kZXNjLT5idWZmZXIuCisJCQkJCQkJICAgIHBvaW50ZXJbaV0sIGJhc2UsCisJCQkJCQkJICAgIG5ld19idWYsIDEpOworCQkJKm5ld19idWYrKyA9IHNlcGFyYXRvcjsJLyogZWFjaCBzZXBhcmF0ZWQgYnkgYSBjb21tYSBvciBzcGFjZSAqLwogCQl9CiAKIAkJLyoKQEAgLTU2OCwxNCArNTQzLDEzIEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9UWVBFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1RZUEUpOwogCX0KIAogCSpyZXN1bHRfZGVzYyA9IHJldHVybl9kZXNjOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jb252ZXJ0X3RvX3RhcmdldF90eXBlCkBAIC01OTIsMTcgKzU2NiwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfY29udmVydF90b190YXJnZXRfdHlwZSAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl90eXBlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXN1bHRfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9leF9jb252ZXJ0X3RvX3RhcmdldF90eXBlKGFjcGlfb2JqZWN0X3R5cGUgZGVzdGluYXRpb25fdHlwZSwKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmVzdWx0X2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfY29udmVydF90b190YXJnZXRfdHlwZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfY29udmVydF90b190YXJnZXRfdHlwZSIpOwogCiAJLyogRGVmYXVsdCBiZWhhdmlvciAqLwogCkBAIC02MTIsMTAgKzU4MywxMCBAQAogCSAqIElmIHJlcXVpcmVkIGJ5IHRoZSB0YXJnZXQsCiAJICogcGVyZm9ybSBpbXBsaWNpdCBjb252ZXJzaW9uIG9uIHRoZSBzb3VyY2UgYmVmb3JlIHdlIHN0b3JlIGl0LgogCSAqLwotCXN3aXRjaCAoR0VUX0NVUlJFTlRfQVJHX1RZUEUgKHdhbGtfc3RhdGUtPm9wX2luZm8tPnJ1bnRpbWVfYXJncykpIHsKKwlzd2l0Y2ggKEdFVF9DVVJSRU5UX0FSR19UWVBFKHdhbGtfc3RhdGUtPm9wX2luZm8tPnJ1bnRpbWVfYXJncykpIHsKIAljYXNlIEFSR0lfU0lNUExFX1RBUkdFVDoKIAljYXNlIEFSR0lfRklYRURfVEFSR0VUOgotCWNhc2UgQVJHSV9JTlRFR0VSX1JFRjogICAgICAvKiBIYW5kbGVzIEluY3JlbWVudCwgRGVjcmVtZW50IGNhc2VzICovCisJY2FzZSBBUkdJX0lOVEVHRVJfUkVGOgkvKiBIYW5kbGVzIEluY3JlbWVudCwgRGVjcmVtZW50IGNhc2VzICovCiAKIAkJc3dpdGNoIChkZXN0aW5hdGlvbl90eXBlKSB7CiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKQEAgLTYyNywxNyArNTk4LDE5IEBACiAJCWRlZmF1bHQ6CiAJCQkvKiBObyBjb252ZXJzaW9uIGFsbG93ZWQgZm9yIHRoZXNlIHR5cGVzICovCiAKLQkJCWlmIChkZXN0aW5hdGlvbl90eXBlICE9IEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJCQkiRXhwbGljaXQgb3BlcmF0b3IsIHdpbGwgc3RvcmUgKCVzKSBvdmVyIGV4aXN0aW5nIHR5cGUgKCVzKVxuIiwKLQkJCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpLAotCQkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKGRlc3RpbmF0aW9uX3R5cGUpKSk7CisJCQlpZiAoZGVzdGluYXRpb25fdHlwZSAhPQorCQkJICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSkgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJCSAgIkV4cGxpY2l0IG9wZXJhdG9yLCB3aWxsIHN0b3JlICglcykgb3ZlciBleGlzdGluZyB0eXBlICglcylcbiIsCisJCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJCSAgKHNvdXJjZV9kZXNjKSwKKwkJCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lCisJCQkJCQkgIChkZXN0aW5hdGlvbl90eXBlKSkpOwogCQkJCXN0YXR1cyA9IEFFX1RZUEU7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQVJHSV9UQVJHRVRSRUY6CiAKIAkJc3dpdGNoIChkZXN0aW5hdGlvbl90eXBlKSB7CkBAIC02NDksNTUgKzYyMiw1NSBAQAogCQkJICogVGhlc2UgdHlwZXMgcmVxdWlyZSBhbiBJbnRlZ2VyIG9wZXJhbmQuICBXZSBjYW4gY29udmVydAogCQkJICogYSBCdWZmZXIgb3IgYSBTdHJpbmcgdG8gYW4gSW50ZWdlciBpZiBuZWNlc3NhcnkuCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyIChzb3VyY2VfZGVzYywgcmVzdWx0X2Rlc2MsCi0JCQkJCSAxNik7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKHNvdXJjZV9kZXNjLCByZXN1bHRfZGVzYywKKwkJCQkJCSAgICAgICAxNik7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAkJCS8qCiAJCQkgKiBUaGUgb3BlcmFuZCBtdXN0IGJlIGEgU3RyaW5nLiAgV2UgY2FuIGNvbnZlcnQgYW4KIAkJCSAqIEludGVnZXIgb3IgQnVmZmVyIGlmIG5lY2Vzc2FyeQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nIChzb3VyY2VfZGVzYywgcmVzdWx0X2Rlc2MsCi0JCQkJCSBBQ1BJX0lNUExJQ0lUX0NPTlZFUlRfSEVYKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyhzb3VyY2VfZGVzYywgcmVzdWx0X2Rlc2MsCisJCQkJCQkgICAgICBBQ1BJX0lNUExJQ0lUX0NPTlZFUlRfSEVYKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCQkJLyoKIAkJCSAqIFRoZSBvcGVyYW5kIG11c3QgYmUgYSBCdWZmZXIuICBXZSBjYW4gY29udmVydCBhbgogCQkJICogSW50ZWdlciBvciBTdHJpbmcgaWYgbmVjZXNzYXJ5CiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19idWZmZXIgKHNvdXJjZV9kZXNjLCByZXN1bHRfZGVzYyk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfY29udmVydF90b19idWZmZXIoc291cmNlX2Rlc2MsIHJlc3VsdF9kZXNjKTsKIAkJCWJyZWFrOwogCi0KIAkJZGVmYXVsdDoKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkJhZCBkZXN0aW5hdGlvbiB0eXBlIGR1cmluZyBjb252ZXJzaW9uOiAlWFxuIiwKLQkJCQlkZXN0aW5hdGlvbl90eXBlKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkJhZCBkZXN0aW5hdGlvbiB0eXBlIGR1cmluZyBjb252ZXJzaW9uOiAlWFxuIiwgZGVzdGluYXRpb25fdHlwZSkpOwogCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQVJHSV9SRUZFUkVOQ0U6CiAJCS8qCiAJCSAqIGNyZWF0ZV94eHh4X2ZpZWxkIGNhc2VzIC0gd2UgYXJlIHN0b3JpbmcgdGhlIGZpZWxkIG9iamVjdCBpbnRvIHRoZSBuYW1lCiAJCSAqLwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiVW5rbm93biBUYXJnZXQgdHlwZSBJRCAweCVYIE9wICVzIGRlc3RfdHlwZSAlc1xuIiwKLQkJCUdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5ydW50aW1lX2FyZ3MpLAotCQkJd2Fsa19zdGF0ZS0+b3BfaW5mby0+bmFtZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChkZXN0aW5hdGlvbl90eXBlKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVua25vd24gVGFyZ2V0IHR5cGUgSUQgMHglWCBPcCAlcyBkZXN0X3R5cGUgJXNcbiIsCisJCQkJICBHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT5vcF9pbmZvLT4KKwkJCQkJCSAgICAgICBydW50aW1lX2FyZ3MpLAorCQkJCSAgd2Fsa19zdGF0ZS0+b3BfaW5mby0+bmFtZSwKKwkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShkZXN0aW5hdGlvbl90eXBlKSkpOwogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkJhZCBUYXJnZXQgVHlwZSAoQVJHSSk6ICVYXG4iLAotCQkJR0VUX0NVUlJFTlRfQVJHX1RZUEUgKHdhbGtfc3RhdGUtPm9wX2luZm8tPnJ1bnRpbWVfYXJncykpKQotCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQmFkIFRhcmdldCBUeXBlIChBUkdJKTogJVhcbiIsCisJCQkJICAgR0VUX0NVUlJFTlRfQVJHX1RZUEUod2Fsa19zdGF0ZS0+b3BfaW5mby0+CisJCQkJCQkJcnVudGltZV9hcmdzKSkpCisJCSAgICBzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CiAJfQogCiAJLyoKQEAgLTcxMCw3ICs2ODMsNSBAQAogCQlzdGF0dXMgPSBBRV9PSzsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y3JlYXRlLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjcmVhdGUuYwppbmRleCA4MTJjZGNiLi45MWM0OTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjcmVhdGUuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjcmVhdGUuYwpAQCAtNDEsNyArNDEsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KQEAgLTQ5LDEwICs0OCw4IEBACiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhjcmVhdGUiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJleGNyZWF0ZSIpCiAKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjYsMzMgKzYzLDMwIEBACiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IG5hbWVkIGFsaWFzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfY3JlYXRlX2FsaWFzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9leF9jcmVhdGVfYWxpYXMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICp0YXJnZXRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICphbGlhc19ub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnRhcmdldF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphbGlhc19ub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfY3JlYXRlX2FsaWFzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9jcmVhdGVfYWxpYXMiKTsKIAogCS8qIEdldCB0aGUgc291cmNlL2FsaWFzIG9wZXJhbmRzIChib3RoIG5hbWVzcGFjZSBub2RlcykgKi8KIAotCWFsaWFzX25vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JdGFyZ2V0X25vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV07CisJYWxpYXNfbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXRhcmdldF9ub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV07CiAKIAlpZiAoKHRhcmdldF9ub2RlLT50eXBlID09IEFDUElfVFlQRV9MT0NBTF9BTElBUykgfHwKLQkJKHRhcmdldF9ub2RlLT50eXBlID09IEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVMpKSB7CisJICAgICh0YXJnZXRfbm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSkgewogCQkvKgogCQkgKiBEZXJlZmVyZW5jZSBhbiBleGlzdGluZyBhbGlhcyBzbyB0aGF0IHdlIGRvbid0IGNyZWF0ZSBhIGNoYWluCiAJCSAqIG9mIGFsaWFzZXMuICBXaXRoIHRoaXMgY29kZSwgd2UgZ3VhcmFudGVlIHRoYXQgYW4gYWxpYXMgaXMKIAkJICogYWx3YXlzIGV4YWN0bHkgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uIGF3YXkgZnJvbSB0aGUKIAkJICogYWN0dWFsIGFsaWFzZWQgbmFtZS4KIAkJICovCi0JCXRhcmdldF9ub2RlID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsIHRhcmdldF9ub2RlLT5vYmplY3QpOworCQl0YXJnZXRfbm9kZSA9CisJCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLAorCQkJCSAgdGFyZ2V0X25vZGUtPm9iamVjdCk7CiAJfQogCiAJLyoKQEAgLTExNSw3ICsxMDksOCBAQAogCQkgKiB0eXBlcywgdGhlIG9iamVjdCBjYW4gY2hhbmdlIGR5bmFtaWNhbGx5IHZpYSBhIFN0b3JlLgogCQkgKi8KIAkJYWxpYXNfbm9kZS0+dHlwZSA9IEFDUElfVFlQRV9MT0NBTF9BTElBUzsKLQkJYWxpYXNfbm9kZS0+b2JqZWN0ID0gQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgdGFyZ2V0X25vZGUpOworCQlhbGlhc19ub2RlLT5vYmplY3QgPQorCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCB0YXJnZXRfbm9kZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgpAQCAtMTI2LDcgKzEyMSw4IEBACiAJCSAqIHR5cGVzLCB0aGUgb2JqZWN0IGNhbiBjaGFuZ2UgZHluYW1pY2FsbHkgdmlhIGEgU3RvcmUuCiAJCSAqLwogCQlhbGlhc19ub2RlLT50eXBlID0gQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUzsKLQkJYWxpYXNfbm9kZS0+b2JqZWN0ID0gQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgdGFyZ2V0X25vZGUpOworCQlhbGlhc19ub2RlLT5vYmplY3QgPQorCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCB0YXJnZXRfbm9kZSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTEzOSwxNyArMTM1LDE4IEBACiAJCSAqIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHByZXZlbnQgZGVsZXRpb24gb3V0IGZyb20gdW5kZXIgZWl0aGVyIHRoZQogCQkgKiB0YXJnZXQgbm9kZSBvciB0aGUgYWxpYXMgTm9kZQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChhbGlhc19ub2RlLAotCQkJCSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKHRhcmdldF9ub2RlKSwgdGFyZ2V0X25vZGUtPnR5cGUpOworCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QoYWxpYXNfbm9kZSwKKwkJCQkJICAgICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdAorCQkJCQkgICAgICAgKHRhcmdldF9ub2RlKSwKKwkJCQkJICAgICAgIHRhcmdldF9ub2RlLT50eXBlKTsKIAkJYnJlYWs7CiAJfQogCiAJLyogU2luY2UgYm90aCBvcGVyYW5kcyBhcmUgTm9kZXMsIHdlIGRvbid0IG5lZWQgdG8gZGVsZXRlIHRoZW0gKi8KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9ldmVudApAQCAtMTYyLDE4ICsxNTksMTQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfZXZlbnQgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV9ldmVudChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2NyZWF0ZV9ldmVudCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2NyZWF0ZV9ldmVudCIpOwotCi0KLQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0VWRU5UKTsKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfRVZFTlQpOwogCWlmICghb2JqX2Rlc2MpIHsKIAkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQlnb3RvIGNsZWFudXA7CkBAIC0xODMsMjcgKzE3NiwyNyBAQAogCSAqIENyZWF0ZSB0aGUgYWN0dWFsIE9TIHNlbWFwaG9yZSwgd2l0aCB6ZXJvIGluaXRpYWwgdW5pdHMgLS0gbWVhbmluZwogCSAqIHRoYXQgdGhlIGV2ZW50IGlzIGNyZWF0ZWQgaW4gYW4gdW5zaWduYWxsZWQgc3RhdGUKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUgKEFDUElfTk9fVU5JVF9MSU1JVCwgMCwKLQkJCSAmb2JqX2Rlc2MtPmV2ZW50LnNlbWFwaG9yZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZShBQ1BJX05PX1VOSVRfTElNSVQsIDAsCisJCQkJCSAgJm9ial9kZXNjLT5ldmVudC5zZW1hcGhvcmUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyogQXR0YWNoIG9iamVjdCB0byB0aGUgTm9kZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0sCi0JCQkgb2JqX2Rlc2MsIEFDUElfVFlQRV9FVkVOVCk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9uc19hdHRhY2hfb2JqZWN0KChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKXdhbGtfc3RhdGUtPgorCQkJCSAgb3BlcmFuZHNbMF0sIG9ial9kZXNjLCBBQ1BJX1RZUEVfRVZFTlQpOwogCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAkvKgogCSAqIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAob24gZXJyb3IsIHdpbGwgY2F1c2UgZGVsZXRpb24KIAkgKiBvZiBib3RoIG9iamVjdCBhbmQgc2VtYXBob3JlIGlmIHByZXNlbnQuKQogCSAqLwotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX211dGV4CkBAIC0yMTgsMjAgKzIxMSwxNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2NyZWF0ZV9tdXRleCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX211dGV4KHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9jcmVhdGVfbXV0ZXgiLCBBQ1BJX1dBTEtfT1BFUkFORFMpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2NyZWF0ZV9tdXRleCIsIEFDUElfV0FMS19PUEVSQU5EUyk7CiAKIAkvKiBDcmVhdGUgdGhlIG5ldyBtdXRleCBvYmplY3QgKi8KIAotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfTVVURVgpOworCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9NVVRFWCk7CiAJaWYgKCFvYmpfZGVzYykgewogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTI0MiwzMCArMjMxLDMwIEBACiAJICogT25lIHVuaXQgbWF4IHRvIG1ha2UgaXQgYSBtdXRleCwgd2l0aCBvbmUgaW5pdGlhbCB1bml0IHRvIGFsbG93CiAJICogdGhlIG11dGV4IHRvIGJlIGFjcXVpcmVkLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSAoMSwgMSwgJm9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUoMSwgMSwgJm9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyogSW5pdCBvYmplY3QgYW5kIGF0dGFjaCB0byBOUyBub2RlICovCiAKLQlvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbCA9ICh1OCkgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0tPmludGVnZXIudmFsdWU7Ci0Jb2JqX2Rlc2MtPm11dGV4Lm5vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJb2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwgPQorCSAgICAodTgpIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzFdLT5pbnRlZ2VyLnZhbHVlOworCW9ial9kZXNjLT5tdXRleC5ub2RlID0KKwkgICAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CiAKLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKG9ial9kZXNjLT5tdXRleC5ub2RlLAotCQkJIG9ial9kZXNjLCBBQ1BJX1RZUEVfTVVURVgpOworCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdChvYmpfZGVzYy0+bXV0ZXgubm9kZSwKKwkJCQkgICAgICAgb2JqX2Rlc2MsIEFDUElfVFlQRV9NVVRFWCk7CiAKLQotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAJLyoKIAkgKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKG9uIGVycm9yLCB3aWxsIGNhdXNlIGRlbGV0aW9uCiAJICogb2YgYm90aCBvYmplY3QgYW5kIHNlbWFwaG9yZSBpZiBwcmVzZW50LikKIAkgKi8KLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9yZWdpb24KQEAgLTI4MiwyMCArMjcxLDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfcmVnaW9uICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uX3NwYWNlLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2V4X2NyZWF0ZV9yZWdpb24odTggKiBhbWxfc3RhcnQsCisJCSAgICAgIHUzMiBhbWxfbGVuZ3RoLAorCQkgICAgICB1OCByZWdpb25fc3BhY2UsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZWdpb25fb2JqMjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iajI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9jcmVhdGVfcmVnaW9uIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9jcmVhdGVfcmVnaW9uIik7CiAKIAkvKiBHZXQgdGhlIE5hbWVzcGFjZSBOb2RlICovCiAKQEAgLTMwNSw4ICsyOTAsOCBAQAogCSAqIElmIHRoZSByZWdpb24gb2JqZWN0IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhpcyBub2RlLAogCSAqIGp1c3QgcmV0dXJuCiAJICovCi0JaWYgKGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJaWYgKGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qCkBAIC0zMTQsMTcgKzI5OSwxOCBAQAogCSAqIHJhbmdlCiAJICovCiAJaWYgKChyZWdpb25fc3BhY2UgPj0gQUNQSV9OVU1fUFJFREVGSU5FRF9SRUdJT05TKSAmJgotCQkocmVnaW9uX3NwYWNlIDwgQUNQSV9VU0VSX1JFR0lPTl9CRUdJTikpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW52YWxpZCBhZGRyZXNzX3NwYWNlIHR5cGUgJVhcbiIsIHJlZ2lvbl9zcGFjZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlZBTElEX1NQQUNFX0lEKTsKKwkgICAgKHJlZ2lvbl9zcGFjZSA8IEFDUElfVVNFUl9SRUdJT05fQkVHSU4pKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52YWxpZCBhZGRyZXNzX3NwYWNlIHR5cGUgJVhcbiIsCisJCQkJICAgcmVnaW9uX3NwYWNlKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5WQUxJRF9TUEFDRV9JRCk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgIlJlZ2lvbiBUeXBlIC0gJXMgKCVYKVxuIiwKLQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZ2lvbl9zcGFjZSksIHJlZ2lvbl9zcGFjZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwgIlJlZ2lvbiBUeXBlIC0gJXMgKCVYKVxuIiwKKwkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX3NwYWNlKSwgcmVnaW9uX3NwYWNlKSk7CiAKIAkvKiBDcmVhdGUgdGhlIHJlZ2lvbiBkZXNjcmlwdG9yICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX1JFR0lPTik7CisJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX1JFR0lPTik7CiAJaWYgKCFvYmpfZGVzYykgewogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTMzNCw3ICszMjAsNyBAQAogCSAqIFJlbWVtYmVyIGxvY2F0aW9uIGluIEFNTCBzdHJlYW0gb2YgYWRkcmVzcyAmIGxlbmd0aAogCSAqIG9wZXJhbmRzIHNpbmNlIHRoZXkgbmVlZCB0byBiZSBldmFsdWF0ZWQgYXQgcnVuIHRpbWUuCiAJICovCi0JcmVnaW9uX29iajIgICAgICAgICAgICAgICAgID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKKwlyZWdpb25fb2JqMiA9IG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7CiAJcmVnaW9uX29iajItPmV4dHJhLmFtbF9zdGFydCA9IGFtbF9zdGFydDsKIAlyZWdpb25fb2JqMi0+ZXh0cmEuYW1sX2xlbmd0aCA9IGFtbF9sZW5ndGg7CiAKQEAgLTM0MywyMiArMzI5LDIwIEBACiAJb2JqX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCA9IHJlZ2lvbl9zcGFjZTsKIAlvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MgPSAwOwogCW9ial9kZXNjLT5yZWdpb24ubGVuZ3RoID0gMDsKLQlvYmpfZGVzYy0+cmVnaW9uLm5vZGUgICA9IG5vZGU7CisJb2JqX2Rlc2MtPnJlZ2lvbi5ub2RlID0gbm9kZTsKIAogCS8qIEluc3RhbGwgdGhlIG5ldyByZWdpb24gb2JqZWN0IGluIHRoZSBwYXJlbnQgTm9kZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChub2RlLCBvYmpfZGVzYywgQUNQSV9UWVBFX1JFR0lPTik7CisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5vZGUsIG9ial9kZXNjLCBBQ1BJX1RZUEVfUkVHSU9OKTsKIAotCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAogCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfdGFibGVfcmVnaW9uCkBAIC0zNzEsMjAgKzM1NSwxNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2NyZWF0ZV90YWJsZV9yZWdpb24gKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV90YWJsZV9yZWdpb24oc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmoyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfY3JlYXRlX3RhYmxlX3JlZ2lvbiIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfY3JlYXRlX3RhYmxlX3JlZ2lvbiIpOwogCiAJLyogR2V0IHRoZSBOb2RlIGZyb20gdGhlIG9iamVjdCBzdGFjayAgKi8KIApAQCAtMzk0LDY2ICszNzQsNjQgQEAKIAkgKiBJZiB0aGUgcmVnaW9uIG9iamVjdCBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoaXMgbm9kZSwKIAkgKiBqdXN0IHJldHVybgogCSAqLwotCWlmIChhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCWlmIChhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBGaW5kIHRoZSBBQ1BJIHRhYmxlICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2ZpbmRfdGFibGUgKG9wZXJhbmRbMV0tPnN0cmluZy5wb2ludGVyLAotCQkJICAgb3BlcmFuZFsyXS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkgICBvcGVyYW5kWzNdLT5zdHJpbmcucG9pbnRlciwgJnRhYmxlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2ZpbmRfdGFibGUob3BlcmFuZFsxXS0+c3RyaW5nLnBvaW50ZXIsCisJCQkJICAgIG9wZXJhbmRbMl0tPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICBvcGVyYW5kWzNdLT5zdHJpbmcucG9pbnRlciwgJnRhYmxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogQ3JlYXRlIHRoZSByZWdpb24gZGVzY3JpcHRvciAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9SRUdJT04pOworCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9SRUdJT04pOwogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQlyZWdpb25fb2JqMiAgICAgICAgICAgICAgICAgICAgID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKKwlyZWdpb25fb2JqMiA9IG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7CiAJcmVnaW9uX29iajItPmV4dHJhLnJlZ2lvbl9jb250ZXh0ID0gTlVMTDsKIAogCS8qIEluaXQgdGhlIHJlZ2lvbiBmcm9tIHRoZSBvcGVyYW5kcyAqLwogCiAJb2JqX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCA9IFJFR0lPTl9EQVRBX1RBQkxFOwotCW9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyA9IChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIEFDUElfVE9fSU5URUdFUiAodGFibGUpOworCW9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyA9CisJICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIEFDUElfVE9fSU5URUdFUih0YWJsZSk7CiAJb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGggPSB0YWJsZS0+bGVuZ3RoOwotCW9ial9kZXNjLT5yZWdpb24ubm9kZSAgID0gbm9kZTsKLQlvYmpfZGVzYy0+cmVnaW9uLmZsYWdzICA9IEFPUE9CSl9EQVRBX1ZBTElEOworCW9ial9kZXNjLT5yZWdpb24ubm9kZSA9IG5vZGU7CisJb2JqX2Rlc2MtPnJlZ2lvbi5mbGFncyA9IEFPUE9CSl9EQVRBX1ZBTElEOwogCiAJLyogSW5zdGFsbCB0aGUgbmV3IHJlZ2lvbiBvYmplY3QgaW4gdGhlIHBhcmVudCBOb2RlICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKG5vZGUsIG9ial9kZXNjLCBBQ1BJX1RZUEVfUkVHSU9OKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5vZGUsIG9ial9kZXNjLCBBQ1BJX1RZUEVfUkVHSU9OKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24gKG9ial9kZXNjLCBGQUxTRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24ob2JqX2Rlc2MsIEZBTFNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRVhJU1QpIHsKIAkJCXN0YXR1cyA9IEFFX09LOwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJZ290byBjbGVhbnVwOwogCQl9CiAJfQogCiAJb2JqX2Rlc2MtPnJlZ2lvbi5mbGFncyB8PSBBT1BPQkpfU0VUVVBfQ09NUExFVEU7CiAKLQotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAKIAkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX3Byb2Nlc3NvcgpAQCAtNDY4LDQzICs0NDYsMzkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfcHJvY2Vzc29yICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9leF9jcmVhdGVfcHJvY2Vzc29yKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X2NyZWF0ZV9wcm9jZXNzb3IiLCB3YWxrX3N0YXRlKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9jcmVhdGVfcHJvY2Vzc29yIiwgd2Fsa19zdGF0ZSk7CiAKIAkvKiBDcmVhdGUgdGhlIHByb2Nlc3NvciBvYmplY3QgKi8KIAotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfUFJPQ0VTU09SKTsKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfUFJPQ0VTU09SKTsKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogSW5pdGlhbGl6ZSB0aGUgcHJvY2Vzc29yIG9iamVjdCBmcm9tIHRoZSBvcGVyYW5kcyAqLwogCi0Jb2JqX2Rlc2MtPnByb2Nlc3Nvci5wcm9jX2lkID0gKHU4KSAgICAgICAgICBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOwotCW9ial9kZXNjLT5wcm9jZXNzb3IuYWRkcmVzcyA9IChhY3BpX2lvX2FkZHJlc3MpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWU7Ci0Jb2JqX2Rlc2MtPnByb2Nlc3Nvci5sZW5ndGggPSAodTgpICAgICAgICAgICBvcGVyYW5kWzNdLT5pbnRlZ2VyLnZhbHVlOworCW9ial9kZXNjLT5wcm9jZXNzb3IucHJvY19pZCA9ICh1OCkgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKKwlvYmpfZGVzYy0+cHJvY2Vzc29yLmFkZHJlc3MgPQorCSAgICAoYWNwaV9pb19hZGRyZXNzKSBvcGVyYW5kWzJdLT5pbnRlZ2VyLnZhbHVlOworCW9ial9kZXNjLT5wcm9jZXNzb3IubGVuZ3RoID0gKHU4KSBvcGVyYW5kWzNdLT5pbnRlZ2VyLnZhbHVlOwogCiAJLyogSW5zdGFsbCB0aGUgcHJvY2Vzc29yIG9iamVjdCBpbiB0aGUgcGFyZW50IE5vZGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9wZXJhbmRbMF0sCi0JCQkgIG9ial9kZXNjLCBBQ1BJX1RZUEVfUFJPQ0VTU09SKTsKKwlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb3BlcmFuZFswXSwKKwkJCQkgICAgICAgb2JqX2Rlc2MsIEFDUElfVFlQRV9QUk9DRVNTT1IpOwogCiAJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZQpAQCAtNTE5LDQzICs0OTMsMzkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfcG93ZXJfcmVzb3VyY2UgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9jcmVhdGVfcG93ZXJfcmVzb3VyY2UiLCB3YWxrX3N0YXRlKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9jcmVhdGVfcG93ZXJfcmVzb3VyY2UiLCB3YWxrX3N0YXRlKTsKIAogCS8qIENyZWF0ZSB0aGUgcG93ZXIgcmVzb3VyY2Ugb2JqZWN0ICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX1BPV0VSKTsKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfUE9XRVIpOwogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBJbml0aWFsaXplIHRoZSBwb3dlciBvYmplY3QgZnJvbSB0aGUgb3BlcmFuZHMgKi8KIAogCW9ial9kZXNjLT5wb3dlcl9yZXNvdXJjZS5zeXN0ZW1fbGV2ZWwgPSAodTgpIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7Ci0Jb2JqX2Rlc2MtPnBvd2VyX3Jlc291cmNlLnJlc291cmNlX29yZGVyID0gKHUxNikgb3BlcmFuZFsyXS0+aW50ZWdlci52YWx1ZTsKKwlvYmpfZGVzYy0+cG93ZXJfcmVzb3VyY2UucmVzb3VyY2Vfb3JkZXIgPQorCSAgICAodTE2KSBvcGVyYW5kWzJdLT5pbnRlZ2VyLnZhbHVlOwogCiAJLyogSW5zdGFsbCB0aGUgIHBvd2VyIHJlc291cmNlIG9iamVjdCBpbiB0aGUgcGFyZW50IE5vZGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9wZXJhbmRbMF0sCi0JCQkgIG9ial9kZXNjLCBBQ1BJX1RZUEVfUE9XRVIpOworCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvcGVyYW5kWzBdLAorCQkJCSAgICAgICBvYmpfZGVzYywgQUNQSV9UWVBFX1BPV0VSKTsKIAogCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAjZW5kaWYKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9tZXRob2QKQEAgLTU3MSwyNSArNTQxLDIxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfbWV0aG9kICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2V4X2NyZWF0ZV9tZXRob2QodTggKiBhbWxfc3RhcnQsCisJCSAgICAgIHUzMiBhbWxfbGVuZ3RoLCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2ZsYWdzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1OCBtZXRob2RfZmxhZ3M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfY3JlYXRlX21ldGhvZCIsIHdhbGtfc3RhdGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2NyZWF0ZV9tZXRob2QiLCB3YWxrX3N0YXRlKTsKIAogCS8qIENyZWF0ZSBhIG5ldyBtZXRob2Qgb2JqZWN0ICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX01FVEhPRCk7CisJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX01FVEhPRCk7CiAJaWYgKCFvYmpfZGVzYykgewotCSAgIHJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogU2F2ZSB0aGUgbWV0aG9kJ3MgQU1MIHBvaW50ZXIgYW5kIGxlbmd0aCAgKi8KQEAgLTYwMyw4ICs1NjksMTAgQEAKIAkgKi8KIAltZXRob2RfZmxhZ3MgPSAodTgpIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7CiAKLQlvYmpfZGVzYy0+bWV0aG9kLm1ldGhvZF9mbGFncyA9ICh1OCkgKG1ldGhvZF9mbGFncyAmIH5BTUxfTUVUSE9EX0FSR19DT1VOVCk7Ci0Jb2JqX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudCA9ICh1OCkgKG1ldGhvZF9mbGFncyAmIEFNTF9NRVRIT0RfQVJHX0NPVU5UKTsKKwlvYmpfZGVzYy0+bWV0aG9kLm1ldGhvZF9mbGFncyA9CisJICAgICh1OCkgKG1ldGhvZF9mbGFncyAmIH5BTUxfTUVUSE9EX0FSR19DT1VOVCk7CisJb2JqX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudCA9CisJICAgICh1OCkgKG1ldGhvZF9mbGFncyAmIEFNTF9NRVRIT0RfQVJHX0NPVU5UKTsKIAogCS8qCiAJICogR2V0IHRoZSBjb25jdXJyZW5jeSBjb3VudC4gIElmIHJlcXVpcmVkLCBhIHNlbWFwaG9yZSB3aWxsIGJlCkBAIC02MTMsMzIgKzU4MSwyOCBAQAogCWlmIChhY3BpX2dibF9hbGxfbWV0aG9kc19zZXJpYWxpemVkKSB7CiAJCW9ial9kZXNjLT5tZXRob2QuY29uY3VycmVuY3kgPSAxOwogCQlvYmpfZGVzYy0+bWV0aG9kLm1ldGhvZF9mbGFncyB8PSBBTUxfTUVUSE9EX1NFUklBTElaRUQ7Ci0JfQotCWVsc2UgaWYgKG1ldGhvZF9mbGFncyAmIEFNTF9NRVRIT0RfU0VSSUFMSVpFRCkgeworCX0gZWxzZSBpZiAobWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9TRVJJQUxJWkVEKSB7CiAJCS8qCiAJCSAqIEFDUEkgMS4wOiBDb25jdXJyZW5jeSA9IDEKIAkJICogQUNQSSAyLjA6IENvbmN1cnJlbmN5ID0gKHN5bmNfbGV2ZWwgKGluIG1ldGhvZCBkZWNsYXJhdGlvbikgKyAxKQogCQkgKi8KIAkJb2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSA9ICh1OCkKLQkJCQkgICgoKG1ldGhvZF9mbGFncyAmIEFNTF9NRVRIT0RfU1lOQ0hfTEVWRUwpID4+IDQpICsgMSk7Ci0JfQotCWVsc2UgeworCQkgICAgKCgobWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9TWU5DSF9MRVZFTCkgPj4gNCkgKyAxKTsKKwl9IGVsc2UgewogCQlvYmpfZGVzYy0+bWV0aG9kLmNvbmN1cnJlbmN5ID0gQUNQSV9JTkZJTklURV9DT05DVVJSRU5DWTsKIAl9CiAKIAkvKiBBdHRhY2ggdGhlIG5ldyBvYmplY3QgdG8gdGhlIG1ldGhvZCBOb2RlICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvcGVyYW5kWzBdLAotCQkJICBvYmpfZGVzYywgQUNQSV9UWVBFX01FVEhPRCk7CisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9wZXJhbmRbMF0sCisJCQkJICAgICAgIG9ial9kZXNjLCBBQ1BJX1RZUEVfTUVUSE9EKTsKIAogCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAogCS8qIFJlbW92ZSBhIHJlZmVyZW5jZSB0byB0aGUgb3BlcmFuZCAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvcGVyYW5kWzFdKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9wZXJhbmRbMV0pOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGR1bXAuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGR1bXAuYwppbmRleCA0MDg1MDA2Li5iYzJmYTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jCkBAIC00MSw3ICs0MSw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgpAQCAtNDksMzcgKzQ4LDI3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhkdW1wIikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLXN0YXRpYyB2b2lkCi1hY3BpX2V4X291dF9zdHJpbmcgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlKTsKLQotc3RhdGljIHZvaWQKLWFjcGlfZXhfb3V0X3BvaW50ZXIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlKTsKLQotc3RhdGljIHZvaWQKLWFjcGlfZXhfb3V0X2ludGVnZXIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCi1zdGF0aWMgdm9pZAotYWNwaV9leF9vdXRfYWRkcmVzcyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICB2YWx1ZSk7Ci0jZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KLQorQUNQSV9NT0RVTEVfTkFNRSgiZXhkdW1wIikKIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHVzZWQgZm9yIGRlYnVnIG91dHB1dCBvbmx5CiAgKi8KICNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKK3N0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X3N0cmluZyhjaGFyICp0aXRsZSwgY2hhciAqdmFsdWUpOworCitzdGF0aWMgdm9pZCBhY3BpX2V4X291dF9wb2ludGVyKGNoYXIgKnRpdGxlLCB2b2lkICp2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X2ludGVnZXIoY2hhciAqdGl0bGUsIHUzMiB2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X2FkZHJlc3MoY2hhciAqdGl0bGUsIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyB2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfZXhfZHVtcF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOworCitzdGF0aWMgdm9pZAorYWNwaV9leF9kdW1wX3BhY2thZ2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsIHUzMiBsZXZlbCwgdTMyIGluZGV4KTsKKyNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTk0LDE0MyArODMsMTQwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9leF9kdW1wX29wZXJhbmQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgpCit2b2lkIGFjcGlfZXhfZHVtcF9vcGVyYW5kKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLCB1MzIgZGVwdGgpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKKwl1MzIgbGVuZ3RoOworCXUzMiBpbmRleDsKIAorCUFDUElfRlVOQ1RJT05fTkFNRSgiZXhfZHVtcF9vcGVyYW5kIikKIAotCUFDUElfRlVOQ1RJT05fTkFNRSAoImV4X2R1bXBfb3BlcmFuZCIpCi0KLQotCWlmICghKChBQ1BJX0xWX0VYRUMgJiBhY3BpX2RiZ19sZXZlbCkgJiYgKF9DT01QT05FTlQgJiBhY3BpX2RiZ19sYXllcikpKSB7CisJICAgIGlmICghCisJCSgoQUNQSV9MVl9FWEVDICYgYWNwaV9kYmdfbGV2ZWwpCisJCSAmJiAoX0NPTVBPTkVOVCAmIGFjcGlfZGJnX2xheWVyKSkpIHsKIAkJcmV0dXJuOwogCX0KIAogCWlmICghb2JqX2Rlc2MpIHsKIAkJLyogVGhpcyBjb3VsZCBiZSBhIG51bGwgZWxlbWVudCBvZiBhIHBhY2thZ2UgKi8KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiTnVsbCBPYmplY3QgRGVzY3JpcHRvclxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJOdWxsIE9iamVjdCBEZXNjcmlwdG9yXG4iKSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIiVwIGlzIGEgTlMgTm9kZTogIiwgb2JqX2Rlc2MpKTsKLQkJQUNQSV9EVU1QX0VOVFJZIChvYmpfZGVzYywgQUNQSV9MVl9FWEVDKTsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICIlcCBOYW1lc3BhY2UgTm9kZTogIiwKKwkJCQkgIG9ial9kZXNjKSk7CisJCUFDUElfRFVNUF9FTlRSWShvYmpfZGVzYywgQUNQSV9MVl9FWEVDKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkiJXAgaXMgbm90IGEgbm9kZSBvciBvcGVyYW5kIG9iamVjdDogWyVzXVxuIiwKLQkJCW9ial9kZXNjLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKG9ial9kZXNjKSkpOwotCQlBQ1BJX0RVTVBfQlVGRkVSIChvYmpfZGVzYywgc2l6ZW9mICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0KSk7CisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiJXAgaXMgbm90IGEgbm9kZSBvciBvcGVyYW5kIG9iamVjdDogWyVzXVxuIiwKKwkJCQkgIG9ial9kZXNjLAorCQkJCSAgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKG9ial9kZXNjKSkpOworCQlBQ1BJX0RVTVBfQlVGRkVSKG9ial9kZXNjLCBzaXplb2YodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCkpOwogCQlyZXR1cm47CiAJfQogCiAJLyogb2JqX2Rlc2MgaXMgYSB2YWxpZCBvYmplY3QgKi8KIAogCWlmIChkZXB0aCA+IDApIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIiUqc1sldV0gJXAgIiwKLQkJCWRlcHRoLCAiICIsIGRlcHRoLCBvYmpfZGVzYykpOwotCX0KLQllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIiVwICIsIG9ial9kZXNjKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIiUqc1sldV0gJXAgIiwKKwkJCQkgIGRlcHRoLCAiICIsIGRlcHRoLCBvYmpfZGVzYykpOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIiVwICIsIG9ial9kZXNjKSk7CiAJfQogCiAJLyogRGVjb2RlIG9iamVjdCB0eXBlICovCiAKLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKIAogCQlzd2l0Y2ggKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSB7CiAJCWNhc2UgQU1MX0RFQlVHX09QOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIlJlZmVyZW5jZTogRGVidWdcbiIpOworCQkJYWNwaV9vc19wcmludGYoIlJlZmVyZW5jZTogRGVidWdcbiIpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFNTF9OQU1FX09QOgogCi0JCQlBQ1BJX0RVTVBfUEFUSE5BTUUgKG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0LAotCQkJCSJSZWZlcmVuY2U6IE5hbWU6ICIsIEFDUElfTFZfSU5GTywgX0NPTVBPTkVOVCk7Ci0JCQlBQ1BJX0RVTVBfRU5UUlkgKG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0LCBBQ1BJX0xWX0lORk8pOworCQkJQUNQSV9EVU1QX1BBVEhOQU1FKG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0LAorCQkJCQkgICAiUmVmZXJlbmNlOiBOYW1lOiAiLCBBQ1BJX0xWX0lORk8sCisJCQkJCSAgIF9DT01QT05FTlQpOworCQkJQUNQSV9EVU1QX0VOVFJZKG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0LAorCQkJCQlBQ1BJX0xWX0lORk8pOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFNTF9JTkRFWF9PUDoKIAotCQkJYWNwaV9vc19wcmludGYgKCJSZWZlcmVuY2U6IEluZGV4ICVwXG4iLAotCQkJCW9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJSZWZlcmVuY2U6IEluZGV4ICVwXG4iLAorCQkJCSAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX1JFRl9PRl9PUDoKIAotCQkJYWNwaV9vc19wcmludGYgKCJSZWZlcmVuY2U6IChyZWZfb2YpICVwXG4iLAotCQkJCW9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJSZWZlcmVuY2U6IChyZWZfb2YpICVwXG4iLAorCQkJCSAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX0FSR19PUDoKIAotCQkJYWNwaV9vc19wcmludGYgKCJSZWZlcmVuY2U6IEFyZyVkIiwKLQkJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCk7CisJCQlhY3BpX29zX3ByaW50ZigiUmVmZXJlbmNlOiBBcmclZCIsCisJCQkJICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0KTsKIAotCQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJCQkvKiBWYWx1ZSBpcyBhbiBJbnRlZ2VyICovCiAKLQkJCQlhY3BpX29zX3ByaW50ZiAoIiB2YWx1ZSBpcyBbJTguOFglOC44eF0iLAotCQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlKSk7CisJCQkJYWNwaV9vc19wcmludGYoIiB2YWx1ZSBpcyBbJTguOFglOC44eF0iLAorCQkJCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KG9ial9kZXNjLT4KKwkJCQkJCQkJICBpbnRlZ2VyLgorCQkJCQkJCQkgIHZhbHVlKSk7CiAJCQl9CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFNTF9MT0NBTF9PUDoKIAotCQkJYWNwaV9vc19wcmludGYgKCJSZWZlcmVuY2U6IExvY2FsJWQiLAotCQkJCW9ial9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0KTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJSZWZlcmVuY2U6IExvY2FsJWQiLAorCQkJCSAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCk7CiAKLQkJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CisJCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAKIAkJCQkvKiBWYWx1ZSBpcyBhbiBJbnRlZ2VyICovCiAKLQkJCQlhY3BpX29zX3ByaW50ZiAoIiB2YWx1ZSBpcyBbJTguOFglOC44eF0iLAotCQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlKSk7CisJCQkJYWNwaV9vc19wcmludGYoIiB2YWx1ZSBpcyBbJTguOFglOC44eF0iLAorCQkJCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KG9ial9kZXNjLT4KKwkJCQkJCQkJICBpbnRlZ2VyLgorCQkJCQkJCQkgIHZhbHVlKSk7CiAJCQl9CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiUmVmZXJlbmNlLk5vZGUtPk5hbWUgJVhcbiIsCi0JCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlLT5uYW1lLmludGVnZXIpOworCQkJYWNwaV9vc19wcmludGYoIlJlZmVyZW5jZS5Ob2RlLT5OYW1lICVYXG4iLAorCQkJCSAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUtPm5hbWUuaW50ZWdlcik7CiAJCQlicmVhazsKIAotCiAJCWRlZmF1bHQ6CiAKIAkJCS8qIFVua25vd24gb3Bjb2RlICovCiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiVW5rbm93biBSZWZlcmVuY2Ugb3Bjb2RlPSVYXG4iLAotCQkJCW9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJVbmtub3duIFJlZmVyZW5jZSBvcGNvZGU9JVhcbiIsCisJCQkJICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKTsKIAkJCWJyZWFrOwogCiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAotCQlhY3BpX29zX3ByaW50ZiAoIkJ1ZmZlciBsZW4gJVggQCAlcCBcbiIsCi0JCQlvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCwgb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKKwkJYWNwaV9vc19wcmludGYoIkJ1ZmZlciBsZW4gJVggQCAlcCBcbiIsCisJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgsCisJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKIAogCQlsZW5ndGggPSBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aDsKIAkJaWYgKGxlbmd0aCA+IDY0KSB7CkBAIC0yNDAsMTc4ICsyMjYsMTY2IEBACiAJCS8qIERlYnVnIG9ubHkgLS0gZHVtcCB0aGUgYnVmZmVyIGNvbnRlbnRzICovCiAKIAkJaWYgKG9ial9kZXNjLT5idWZmZXIucG9pbnRlcikgewotCQkJYWNwaV9vc19wcmludGYgKCJCdWZmZXIgQ29udGVudHM6ICIpOworCQkJYWNwaV9vc19wcmludGYoIkJ1ZmZlciBDb250ZW50czogIik7CiAKIAkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiICUwMngiLCBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXJbaW5kZXhdKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiICUwMngiLAorCQkJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyW2luZGV4XSk7CiAJCQl9Ci0JCQlhY3BpX29zX3ByaW50ZiAoIlxuIik7CisJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAotCQlhY3BpX29zX3ByaW50ZiAoIkludGVnZXIgJTguOFglOC44WFxuIiwKLQkJCUFDUElfRk9STUFUX1VJTlQ2NCAob2JqX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKKwkJYWNwaV9vc19wcmludGYoIkludGVnZXIgJTguOFglOC44WFxuIiwKKwkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAKLQkJYWNwaV9vc19wcmludGYgKCJQYWNrYWdlIFtMZW4gJVhdIGVsZW1lbnRfYXJyYXkgJXBcbiIsCi0JCQlvYmpfZGVzYy0+cGFja2FnZS5jb3VudCwgb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMpOworCQlhY3BpX29zX3ByaW50ZigiUGFja2FnZSBbTGVuICVYXSBlbGVtZW50X2FycmF5ICVwXG4iLAorCQkJICAgICAgIG9ial9kZXNjLT5wYWNrYWdlLmNvdW50LAorCQkJICAgICAgIG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzKTsKIAogCQkvKgogCQkgKiBJZiBlbGVtZW50cyBleGlzdCwgcGFja2FnZSBlbGVtZW50IHBvaW50ZXIgaXMgdmFsaWQsCiAJCSAqIGFuZCBkZWJ1Z19sZXZlbCBleGNlZWRzIDEsIGR1bXAgcGFja2FnZSdzIGVsZW1lbnRzLgogCQkgKi8KIAkJaWYgKG9ial9kZXNjLT5wYWNrYWdlLmNvdW50ICYmCi0JCQlvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50cyAmJgotCQkJYWNwaV9kYmdfbGV2ZWwgPiAxKSB7Ci0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBvYmpfZGVzYy0+cGFja2FnZS5jb3VudDsgaW5kZXgrKykgewotCQkJCWFjcGlfZXhfZHVtcF9vcGVyYW5kIChvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpbmRleF0sIGRlcHRoKzEpOworCQkgICAgb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMgJiYgYWNwaV9kYmdfbGV2ZWwgPiAxKSB7CisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBvYmpfZGVzYy0+cGFja2FnZS5jb3VudDsKKwkJCSAgICAgaW5kZXgrKykgeworCQkJCWFjcGlfZXhfZHVtcF9vcGVyYW5kKG9ial9kZXNjLT5wYWNrYWdlLgorCQkJCQkJICAgICBlbGVtZW50c1tpbmRleF0sCisJCQkJCQkgICAgIGRlcHRoICsgMSk7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKIAotCQlhY3BpX29zX3ByaW50ZiAoIlJlZ2lvbiAlcyAoJVgpIiwKLQkJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChvYmpfZGVzYy0+cmVnaW9uLnNwYWNlX2lkKSwKLQkJCW9ial9kZXNjLT5yZWdpb24uc3BhY2VfaWQpOworCQlhY3BpX29zX3ByaW50ZigiUmVnaW9uICVzICglWCkiLAorCQkJICAgICAgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKG9ial9kZXNjLT5yZWdpb24uCisJCQkJCQkgICAgICAgc3BhY2VfaWQpLAorCQkJICAgICAgIG9ial9kZXNjLT5yZWdpb24uc3BhY2VfaWQpOwogCiAJCS8qCiAJCSAqIElmIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggaGF2ZSBub3QgYmVlbiBldmFsdWF0ZWQsCiAJCSAqIGRvbid0IHByaW50IHRoZW0uCiAJCSAqLwogCQlpZiAoIShvYmpfZGVzYy0+cmVnaW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpKSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoIlxuIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiBiYXNlICU4LjhYJTguOFggTGVuZ3RoICVYXG4iLAotCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAob2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzKSwKLQkJCQlvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCk7CisJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWFjcGlfb3NfcHJpbnRmKCIgYmFzZSAlOC44WCU4LjhYIExlbmd0aCAlWFxuIiwKKwkJCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KG9ial9kZXNjLT5yZWdpb24uCisJCQkJCQkJICBhZGRyZXNzKSwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKLQkJYWNwaV9vc19wcmludGYgKCJTdHJpbmcgbGVuZ3RoICVYIEAgJXAgIiwKLQkJCW9ial9kZXNjLT5zdHJpbmcubGVuZ3RoLAotCQkJb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKKwkJYWNwaV9vc19wcmludGYoIlN0cmluZyBsZW5ndGggJVggQCAlcCAiLAorCQkJICAgICAgIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoLAorCQkJICAgICAgIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcik7CiAKLQkJYWNwaV91dF9wcmludF9zdHJpbmcgKG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwgQUNQSV9VSU5UOF9NQVgpOwotCQlhY3BpX29zX3ByaW50ZiAoIlxuIik7CisJCWFjcGlfdXRfcHJpbnRfc3RyaW5nKG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwgQUNQSV9VSU5UOF9NQVgpOworCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CiAKLQkJYWNwaV9vc19wcmludGYgKCJiYW5rX2ZpZWxkXG4iKTsKKwkJYWNwaV9vc19wcmludGYoImJhbmtfZmllbGRcbiIpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgogCi0JCWFjcGlfb3NfcHJpbnRmICgKLQkJCSJyZWdpb25fZmllbGQ6IEJpdHM9JVggYWNjX3dpZHRoPSVYIExvY2s9JVggVXBkYXRlPSVYIGF0IGJ5dGU9JVggYml0PSVYIG9mIGJlbG93OlxuIiwKLQkJCW9ial9kZXNjLT5maWVsZC5iaXRfbGVuZ3RoLAotCQkJb2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAotCQkJb2JqX2Rlc2MtPmZpZWxkLmZpZWxkX2ZsYWdzICYgQU1MX0ZJRUxEX0xPQ0tfUlVMRV9NQVNLLAotCQkJb2JqX2Rlc2MtPmZpZWxkLmZpZWxkX2ZsYWdzICYgQU1MX0ZJRUxEX1VQREFURV9SVUxFX01BU0ssCi0JCQlvYmpfZGVzYy0+ZmllbGQuYmFzZV9ieXRlX29mZnNldCwKLQkJCW9ial9kZXNjLT5maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwkJYWNwaV9vc19wcmludGYKKwkJICAgICgicmVnaW9uX2ZpZWxkOiBCaXRzPSVYIGFjY193aWR0aD0lWCBMb2NrPSVYIFVwZGF0ZT0lWCBhdCBieXRlPSVYIGJpdD0lWCBvZiBiZWxvdzpcbiIsCisJCSAgICAgb2JqX2Rlc2MtPmZpZWxkLmJpdF9sZW5ndGgsCisJCSAgICAgb2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAorCQkgICAgIG9ial9kZXNjLT5maWVsZC5maWVsZF9mbGFncyAmIEFNTF9GSUVMRF9MT0NLX1JVTEVfTUFTSywKKwkJICAgICBvYmpfZGVzYy0+ZmllbGQuZmllbGRfZmxhZ3MgJiBBTUxfRklFTERfVVBEQVRFX1JVTEVfTUFTSywKKwkJICAgICBvYmpfZGVzYy0+ZmllbGQuYmFzZV9ieXRlX29mZnNldCwKKwkJICAgICBvYmpfZGVzYy0+ZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CiAKLQkJYWNwaV9leF9kdW1wX29wZXJhbmQgKG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqLCBkZXB0aCsxKTsKKwkJYWNwaV9leF9kdW1wX29wZXJhbmQob2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmosIGRlcHRoICsgMSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAotCQlhY3BpX29zX3ByaW50ZiAoImluZGV4X2ZpZWxkXG4iKTsKKwkJYWNwaV9vc19wcmludGYoImluZGV4X2ZpZWxkXG4iKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAotCQlhY3BpX29zX3ByaW50ZiAoCi0JCQkiYnVmZmVyX2ZpZWxkOiAlWCBiaXRzIGF0IGJ5dGUgJVggYml0ICVYIG9mIFxuIiwKLQkJCW9ial9kZXNjLT5idWZmZXJfZmllbGQuYml0X2xlbmd0aCwKLQkJCW9ial9kZXNjLT5idWZmZXJfZmllbGQuYmFzZV9ieXRlX29mZnNldCwKLQkJCW9ial9kZXNjLT5idWZmZXJfZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CisJCWFjcGlfb3NfcHJpbnRmKCJidWZmZXJfZmllbGQ6ICVYIGJpdHMgYXQgYnl0ZSAlWCBiaXQgJVggb2YgXG4iLAorCQkJICAgICAgIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYml0X2xlbmd0aCwKKwkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCisJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKIAogCQlpZiAoIW9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaikgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIipOVUxMKiBcbiIpKTsKLQkJfQotCQllbHNlIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKSAhPQotCQkJCSBBQ1BJX1RZUEVfQlVGRkVSKSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoIipub3QgYSBCdWZmZXIqIFxuIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhY3BpX2V4X2R1bXBfb3BlcmFuZCAob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqLCBkZXB0aCsxKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIipOVUxMKiBcbiIpKTsKKwkJfSBlbHNlCisJCSAgICBpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKQorCQkJIT0gQUNQSV9UWVBFX0JVRkZFUikgeworCQkJYWNwaV9vc19wcmludGYoIipub3QgYSBCdWZmZXIqIFxuIik7CisJCX0gZWxzZSB7CisJCQlhY3BpX2V4X2R1bXBfb3BlcmFuZChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmosCisJCQkJCSAgICAgZGVwdGggKyAxKTsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfRVZFTlQ6CiAKLQkJYWNwaV9vc19wcmludGYgKCJFdmVudFxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCJFdmVudFxuIik7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CiAKLQkJYWNwaV9vc19wcmludGYgKCJNZXRob2QoJVgpIEAgJXA6JVhcbiIsCi0JCQlvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50LAotCQkJb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCi0JCQlvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgpOworCQlhY3BpX29zX3ByaW50ZigiTWV0aG9kKCVYKSBAICVwOiVYXG4iLAorCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQsCisJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCisJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX01VVEVYOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiTXV0ZXhcbiIpOworCQlhY3BpX29zX3ByaW50ZigiTXV0ZXhcbiIpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiRGV2aWNlXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIkRldmljZVxuIik7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9QT1dFUjoKIAotCQlhY3BpX29zX3ByaW50ZiAoIlBvd2VyXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIlBvd2VyXG4iKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKIAotCQlhY3BpX29zX3ByaW50ZiAoIlByb2Nlc3NvclxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCJQcm9jZXNzb3JcbiIpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfVEhFUk1BTDoKIAotCQlhY3BpX29zX3ByaW50ZiAoIlRoZXJtYWxcbiIpOworCQlhY3BpX29zX3ByaW50ZigiVGhlcm1hbFxuIik7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCQkvKiBVbmtub3duIFR5cGUgKi8KIAotCQlhY3BpX29zX3ByaW50ZiAoIlVua25vd24gVHlwZSAlWFxuIiwgQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSk7CisJCWFjcGlfb3NfcHJpbnRmKCJVbmtub3duIFR5cGUgJVhcbiIsCisJCQkgICAgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZHVtcF9vcGVyYW5kcwpAQCAtNDI5LDIwICs0MDMsMTUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfZXhfZHVtcF9vcGVyYW5kcyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmRzLAotCWFjcGlfaW50ZXJwcmV0ZXJfbW9kZSAgICAgICAgICAgaW50ZXJwcmV0ZXJfbW9kZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICppZGVudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9sZXZlbHMsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbm90ZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyKQorYWNwaV9leF9kdW1wX29wZXJhbmRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kcywKKwkJICAgICAgYWNwaV9pbnRlcnByZXRlcl9tb2RlIGludGVycHJldGVyX21vZGUsCisJCSAgICAgIGNoYXIgKmlkZW50LAorCQkgICAgICB1MzIgbnVtX2xldmVscywKKwkJICAgICAgY2hhciAqbm90ZSwgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlcikKIHsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGk7CisJYWNwaV9uYXRpdmVfdWludCBpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJleF9kdW1wX29wZXJhbmRzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImV4X2R1bXBfb3BlcmFuZHMiKTsKIAogCWlmICghaWRlbnQpIHsKIAkJaWRlbnQgPSAiPyI7CkBAIC00NTIsOSArNDIxLDkgQEAKIAkJbm90ZSA9ICI/IjsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkiKioqKioqKioqKioqKiBPcGVyYW5kIFN0YWNrIENvbnRlbnRzIChPcGNvZGUgWyVzXSwgJWQgT3BlcmFuZHMpXG4iLAotCQlpZGVudCwgbnVtX2xldmVscykpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCSAgIioqKioqKioqKioqKiogT3BlcmFuZCBTdGFjayBDb250ZW50cyAoT3Bjb2RlIFslc10sICVkIE9wZXJhbmRzKVxuIiwKKwkJCSAgaWRlbnQsIG51bV9sZXZlbHMpKTsKIAogCWlmIChudW1fbGV2ZWxzID09IDApIHsKIAkJbnVtX2xldmVscyA9IDE7CkBAIC00NjMsMTYgKzQzMiwxNSBAQAogCS8qIER1bXAgdGhlIG9wZXJhbmQgc3RhY2sgc3RhcnRpbmcgYXQgdGhlIHRvcCAqLwogCiAJZm9yIChpID0gMDsgbnVtX2xldmVscyA+IDA7IGktLSwgbnVtX2xldmVscy0tKSB7Ci0JCWFjcGlfZXhfZHVtcF9vcGVyYW5kIChvcGVyYW5kc1tpXSwgMCk7CisJCWFjcGlfZXhfZHVtcF9vcGVyYW5kKG9wZXJhbmRzW2ldLCAwKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkiKioqKioqKioqKioqKiBTdGFjayBkdW1wIGZyb20gJXMoJWQpLCAlc1xuIiwKLQkJbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyLCBub3RlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJICAiKioqKioqKioqKioqKiBPcGVyYW5kIFN0YWNrIGR1bXAgZnJvbSAlcyglZCksICVzXG4iLAorCQkJICBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIsIG5vdGUpKTsKIAlyZXR1cm47CiB9CiAKLQogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTQ4Nyw0NCArNDU1LDMxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfZXhfb3V0X3N0cmluZyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUpCitzdGF0aWMgdm9pZCBhY3BpX2V4X291dF9zdHJpbmcoY2hhciAqdGl0bGUsIGNoYXIgKnZhbHVlKQogewotCWFjcGlfb3NfcHJpbnRmICgiJTIwcyA6ICVzXG4iLCB0aXRsZSwgdmFsdWUpOworCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJXNcbiIsIHRpdGxlLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1hY3BpX2V4X291dF9wb2ludGVyICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSkKK3N0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X3BvaW50ZXIoY2hhciAqdGl0bGUsIHZvaWQgKnZhbHVlKQogewotCWFjcGlfb3NfcHJpbnRmICgiJTIwcyA6ICVwXG4iLCB0aXRsZSwgdmFsdWUpOworCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJXBcbiIsIHRpdGxlLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1hY3BpX2V4X291dF9pbnRlZ2VyICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKQorc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfaW50ZWdlcihjaGFyICp0aXRsZSwgdTMyIHZhbHVlKQogewotCWFjcGlfb3NfcHJpbnRmICgiJTIwcyA6ICVYXG4iLCB0aXRsZSwgdmFsdWUpOworCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJS4yWFxuIiwgdGl0bGUsIHZhbHVlKTsKIH0KIAotc3RhdGljIHZvaWQKLWFjcGlfZXhfb3V0X2FkZHJlc3MgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgdmFsdWUpCitzdGF0aWMgdm9pZCBhY3BpX2V4X291dF9hZGRyZXNzKGNoYXIgKnRpdGxlLCBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgdmFsdWUpCiB7CiAKICNpZiBBQ1BJX01BQ0hJTkVfV0lEVEggPT0gMTYKLQlhY3BpX29zX3ByaW50ZiAoIiUyMHMgOiAlcFxuIiwgdGl0bGUsIHZhbHVlKTsKKwlhY3BpX29zX3ByaW50ZigiJTIwcyA6ICVwXG4iLCB0aXRsZSwgdmFsdWUpOwogI2Vsc2UKLQlhY3BpX29zX3ByaW50ZiAoIiUyMHMgOiAlOC44WCU4LjhYXG4iLCB0aXRsZSwgQUNQSV9GT1JNQVRfVUlOVDY0ICh2YWx1ZSkpOworCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTguOFglOC44WFxuIiwgdGl0bGUsIEFDUElfRk9STUFUX1VJTlQ2NCh2YWx1ZSkpOwogI2VuZGlmCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX25vZGUKQEAgLTUzNiwzOCArNDkxLDE2MSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfZXhfZHVtcF9ub2RlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCit2b2lkIGFjcGlfZXhfZHVtcF9ub2RlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLCB1MzIgZmxhZ3MpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJaWYgKCFmbGFncykgewotCQlpZiAoISgoQUNQSV9MVl9PQkpFQ1RTICYgYWNwaV9kYmdfbGV2ZWwpICYmIChfQ09NUE9ORU5UICYgYWNwaV9kYmdfbGF5ZXIpKSkgeworCQlpZiAoIQorCQkgICAgKChBQ1BJX0xWX09CSkVDVFMgJiBhY3BpX2RiZ19sZXZlbCkKKwkJICAgICAmJiAoX0NPTVBPTkVOVCAmIGFjcGlfZGJnX2xheWVyKSkpIHsKIAkJCXJldHVybjsKIAkJfQogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiJTIwcyA6ICU0LjRzXG4iLCAgICAgIk5hbWUiLCBhY3BpX3V0X2dldF9ub2RlX25hbWUgKG5vZGUpKTsKLQlhY3BpX2V4X291dF9zdHJpbmcgKCJUeXBlIiwgICAgICAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAobm9kZS0+dHlwZSkpOwotCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJGbGFncyIsICAgICAgICAgbm9kZS0+ZmxhZ3MpOwotCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJPd25lciBJZCIsICAgICAgbm9kZS0+b3duZXJfaWQpOwotCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJSZWZlcmVuY2UgQ291bnQiLCBub2RlLT5yZWZlcmVuY2VfY291bnQpOwotCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJBdHRhY2hlZCBPYmplY3QiLCBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpKTsKLQlhY3BpX2V4X291dF9wb2ludGVyICgiY2hpbGRfbGlzdCIsICAgIG5vZGUtPmNoaWxkKTsKLQlhY3BpX2V4X291dF9wb2ludGVyICgibmV4dF9wZWVyIiwgICAgIG5vZGUtPnBlZXIpOwotCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJQYXJlbnQiLCAgICAgICAgYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKG5vZGUpKTsKKwlhY3BpX29zX3ByaW50ZigiJTIwcyA6ICU0LjRzXG4iLCAiTmFtZSIsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSk7CisJYWNwaV9leF9vdXRfc3RyaW5nKCJUeXBlIiwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpKTsKKwlhY3BpX2V4X291dF9pbnRlZ2VyKCJGbGFncyIsIG5vZGUtPmZsYWdzKTsKKwlhY3BpX2V4X291dF9pbnRlZ2VyKCJPd25lciBJZCIsIG5vZGUtPm93bmVyX2lkKTsKKwlhY3BpX2V4X291dF9pbnRlZ2VyKCJSZWZlcmVuY2UgQ291bnQiLCBub2RlLT5yZWZlcmVuY2VfY291bnQpOworCWFjcGlfZXhfb3V0X3BvaW50ZXIoIkF0dGFjaGVkIE9iamVjdCIsCisJCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpKTsKKwlhY3BpX2V4X291dF9wb2ludGVyKCJjaGlsZF9saXN0Iiwgbm9kZS0+Y2hpbGQpOworCWFjcGlfZXhfb3V0X3BvaW50ZXIoIm5leHRfcGVlciIsIG5vZGUtPnBlZXIpOworCWFjcGlfZXhfb3V0X3BvaW50ZXIoIlBhcmVudCIsIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX3JlZmVyZW5jZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCisgKgorICogREVTQ1JJUFRJT046IER1bXBzIGEgcmVmZXJlbmNlIG9iamVjdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGFjcGlfZXhfZHVtcF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCit7CisJc3RydWN0IGFjcGlfYnVmZmVyIHJldF9idWY7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9JTlRfTkFNRVBBVEhfT1ApIHsKKwkJYWNwaV9vc19wcmludGYoIk5hbWVkIE9iamVjdCAlcCAiLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUpOworCQlyZXRfYnVmLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfTE9DQUxfQlVGRkVSOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUob2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlLAorCQkJCQkgICAgICAgJnJldF9idWYpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWFjcGlfb3NfcHJpbnRmKCJDb3VsZCBub3QgY29udmVydCBuYW1lIHRvIHBhdGhuYW1lXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWFjcGlfb3NfcHJpbnRmKCIlc1xuIiwgKGNoYXIgKilyZXRfYnVmLnBvaW50ZXIpOworCQkJQUNQSV9NRU1fRlJFRShyZXRfYnVmLnBvaW50ZXIpOworCQl9CisJfSBlbHNlIGlmIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCkgeworCQlhY3BpX29zX3ByaW50ZigiXG5SZWZlcmVuY2VkIE9iamVjdDogJXBcbiIsCisJCQkgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX3BhY2thZ2UKKyAqCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgICAgICAtIERlc2NyaXB0b3IgdG8gZHVtcAorICogICAgICAgICAgICAgIExldmVsICAgICAgICAgICAgICAgLSBJbmRlbnRhdGlvbiBMZXZlbAorICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBQYWNrYWdlIGluZGV4IGZvciB0aGlzIG9iamVjdAorICoKKyAqIERFU0NSSVBUSU9OOiBEdW1wcyB0aGUgZWxlbWVudHMgb2YgdGhlIHBhY2thZ2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorYWNwaV9leF9kdW1wX3BhY2thZ2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsIHUzMiBsZXZlbCwgdTMyIGluZGV4KQoreworCXUzMiBpOworCisJLyogSW5kZW50YXRpb24gYW5kIGluZGV4IG91dHB1dCAqLworCisJaWYgKGxldmVsID4gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWw7IGkrKykgeworCQkJYWNwaV9vc19wcmludGYoIiAiKTsKKwkJfQorCisJCWFjcGlfb3NfcHJpbnRmKCJbJS4yZF0gIiwgaW5kZXgpOworCX0KKworCWFjcGlfb3NfcHJpbnRmKCIlcCAiLCBvYmpfZGVzYyk7CisKKwkvKiBOdWxsIHBhY2thZ2UgZWxlbWVudHMgYXJlIGFsbG93ZWQgKi8KKworCWlmICghb2JqX2Rlc2MpIHsKKwkJYWNwaV9vc19wcmludGYoIltOdWxsIE9iamVjdF1cbiIpOworCQlyZXR1cm47CisJfQorCisJLyogUGFja2FnZXMgbWF5IG9ubHkgY29udGFpbiBhIGZldyBvYmplY3QgdHlwZXMgKi8KKworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CisJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKworCQlhY3BpX29zX3ByaW50ZigiW0ludGVnZXJdID0gJTguOFglOC44WFxuIiwKKwkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisKKwkJYWNwaV9vc19wcmludGYoIltTdHJpbmddIFZhbHVlOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoOyBpKyspIHsKKwkJCWFjcGlfb3NfcHJpbnRmKCIlYyIsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcltpXSk7CisJCX0KKwkJYWNwaV9vc19wcmludGYoIlxuIik7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCisJCWFjcGlfb3NfcHJpbnRmKCJbQnVmZmVyXSBMZW5ndGggJS4yWCA9ICIsCisJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQlpZiAob2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpIHsKKwkJCWFjcGlfdXRfZHVtcF9idWZmZXIoKHU4ICopIG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkJICAgIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoLAorCQkJCQkgICAgREJfRFdPUkRfRElTUExBWSwgX0NPTVBPTkVOVCk7CisJCX0gZWxzZSB7CisJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CisKKwkJYWNwaV9vc19wcmludGYoIltQYWNrYWdlXSBDb250YWlucyAlZCBFbGVtZW50czogXG4iLAorCQkJICAgICAgIG9ial9kZXNjLT5wYWNrYWdlLmNvdW50KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgb2JqX2Rlc2MtPnBhY2thZ2UuY291bnQ7IGkrKykgeworCQkJYWNwaV9leF9kdW1wX3BhY2thZ2Uob2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0sCisJCQkJCSAgICAgbGV2ZWwgKyAxLCBpKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKKworCQlhY3BpX29zX3ByaW50ZigiW09iamVjdCBSZWZlcmVuY2VdICIpOworCQlhY3BpX2V4X2R1bXBfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCWFjcGlfb3NfcHJpbnRmKCJbVW5rbm93biBUeXBlXSAlWFxuIiwKKwkJCSAgICAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpOworCQlicmVhazsKKwl9Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcgogICoKLSAqIFBBUkFNRVRFUlM6ICAqT2JqZWN0ICAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgICAgICAtIERlc2NyaXB0b3IgdG8gZHVtcAogICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBGb3JjZSBkaXNwbGF5IGlmIFRSVUUKICAqCiAgKiBERVNDUklQVElPTjogRHVtcHMgdGhlIG1lbWJlcnMgb2YgdGhlIG9iamVjdCBkZXNjcmlwdG9yIGdpdmVuLgpAQCAtNTc1LDIwMiArNjUzLDIxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQorYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLCB1MzIgZmxhZ3MpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvciIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvciIpOwogCiAJaWYgKCFvYmpfZGVzYykgewogCQlyZXR1cm5fVk9JRDsKIAl9CiAKIAlpZiAoIWZsYWdzKSB7Ci0JCWlmICghKChBQ1BJX0xWX09CSkVDVFMgJiBhY3BpX2RiZ19sZXZlbCkgJiYgKF9DT01QT05FTlQgJiBhY3BpX2RiZ19sYXllcikpKSB7CisJCWlmICghCisJCSAgICAoKEFDUElfTFZfT0JKRUNUUyAmIGFjcGlfZGJnX2xldmVsKQorCQkgICAgICYmIChfQ09NUE9ORU5UICYgYWNwaV9kYmdfbGF5ZXIpKSkgewogCQkJcmV0dXJuX1ZPSUQ7CiAJCX0KIAl9CiAKLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJYWNwaV9leF9kdW1wX25vZGUgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmpfZGVzYywgZmxhZ3MpOwotCQlhY3BpX29zX3ByaW50ZiAoIlxuQXR0YWNoZWQgT2JqZWN0ICglcCk6XG4iLAotCQkJKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmpfZGVzYyktPm9iamVjdCk7Ci0JCWFjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvciAoCi0JCQkoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9kZXNjKS0+b2JqZWN0LCBmbGFncyk7CisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJYWNwaV9leF9kdW1wX25vZGUoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2Rlc2MsCisJCQkJICBmbGFncyk7CisJCWFjcGlfb3NfcHJpbnRmKCJcbkF0dGFjaGVkIE9iamVjdCAoJXApOlxuIiwKKwkJCSAgICAgICAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2Rlc2MpLT4KKwkJCSAgICAgICBvYmplY3QpOworCQlhY3BpX2V4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3IoKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQorCQkJCQkJb2JqX2Rlc2MpLT5vYmplY3QsIGZsYWdzKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKLQkJYWNwaV9vc19wcmludGYgKAotCQkJImV4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3I6ICVwIGlzIG5vdCBhbiBBQ1BJIG9wZXJhbmQgb2JqZWN0OiBbJXNdXG4iLAotCQkJb2JqX2Rlc2MsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAob2JqX2Rlc2MpKTsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7CisJCWFjcGlfb3NfcHJpbnRmCisJCSAgICAoImV4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3I6ICVwIGlzIG5vdCBhbiBBQ1BJIG9wZXJhbmQgb2JqZWN0OiBbJXNdXG4iLAorCQkgICAgIG9ial9kZXNjLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUob2JqX2Rlc2MpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCiAJLyogQ29tbW9uIEZpZWxkcyAqLwogCi0JYWNwaV9leF9vdXRfc3RyaW5nICgiVHlwZSIsICAgICAgICAgICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSk7Ci0JYWNwaV9leF9vdXRfaW50ZWdlciAoIlJlZmVyZW5jZSBDb3VudCIsIG9ial9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50KTsKLQlhY3BpX2V4X291dF9pbnRlZ2VyICgiRmxhZ3MiLCAgICAgICAgICAgb2JqX2Rlc2MtPmNvbW1vbi5mbGFncyk7CisJYWNwaV9leF9vdXRfc3RyaW5nKCJUeXBlIiwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShvYmpfZGVzYykpOworCWFjcGlfZXhfb3V0X2ludGVnZXIoIlJlZmVyZW5jZSBDb3VudCIsCisJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOworCWFjcGlfZXhfb3V0X2ludGVnZXIoIkZsYWdzIiwgb2JqX2Rlc2MtPmNvbW1vbi5mbGFncyk7CiAKIAkvKiBPYmplY3Qtc3BlY2lmaWMgRmllbGRzICovCiAKLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKLQkJYWNwaV9vc19wcmludGYgKCIlMjBzIDogJTguOFglOC44WFxuIiwgIlZhbHVlIiwKLQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlKSk7CisJCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTguOFglOC44WFxuIiwgIlZhbHVlIiwKKwkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiTGVuZ3RoIiwgICAgICBvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoIkxlbmd0aCIsIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoKTsKIAotCQlhY3BpX29zX3ByaW50ZiAoIiUyMHMgOiAlcCAiLCAiUG9pbnRlciIsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcik7Ci0JCWFjcGlfdXRfcHJpbnRfc3RyaW5nIChvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIEFDUElfVUlOVDhfTUFYKTsKLQkJYWNwaV9vc19wcmludGYgKCJcbiIpOworCQlhY3BpX29zX3ByaW50ZigiJTIwcyA6ICVwICIsICJQb2ludGVyIiwKKwkJCSAgICAgICBvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIpOworCQlhY3BpX3V0X3ByaW50X3N0cmluZyhvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIEFDUElfVUlOVDhfTUFYKTsKKwkJYWNwaV9vc19wcmludGYoIlxuIik7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoIkxlbmd0aCIsICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiUG9pbnRlciIsICAgICBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIpOwotCQlBQ1BJX0RVTVBfQlVGRkVSIChvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigiTGVuZ3RoIiwgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJQb2ludGVyIiwgb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKKwkJQUNQSV9EVU1QX0JVRkZFUihvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCisJCQkJIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoIkZsYWdzIiwgICAgICAgb2JqX2Rlc2MtPnBhY2thZ2UuZmxhZ3MpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiQ291bnQiLCAgICAgICBvYmpfZGVzYy0+cGFja2FnZS5jb3VudCk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJFbGVtZW50cyIsICAgIG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigiRmxhZ3MiLCBvYmpfZGVzYy0+cGFja2FnZS5mbGFncyk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoIkVsZW1lbnRzIiwgb2JqX2Rlc2MtPnBhY2thZ2UuY291bnQpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJFbGVtZW50IExpc3QiLCBvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50cyk7CiAKIAkJLyogRHVtcCB0aGUgcGFja2FnZSBjb250ZW50cyAqLwogCi0JCWlmIChvYmpfZGVzYy0+cGFja2FnZS5jb3VudCA+IDApIHsKLQkJCWFjcGlfb3NfcHJpbnRmICgiXG5QYWNrYWdlIENvbnRlbnRzOlxuIik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgb2JqX2Rlc2MtPnBhY2thZ2UuY291bnQ7IGkrKykgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiWyUuM2RdICVwIiwgaSwgb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0pOwotCQkJCWlmIChvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSkgewotCQkJCQlhY3BpX29zX3ByaW50ZiAoIiAlcyIsCi0JCQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSkpOwotCQkJCX0KLQkJCQlhY3BpX29zX3ByaW50ZiAoIlxuIik7Ci0JCQl9Ci0JCX0KKwkJYWNwaV9vc19wcmludGYoIlxuUGFja2FnZSBDb250ZW50czpcbiIpOworCQlhY3BpX2V4X2R1bXBfcGFja2FnZShvYmpfZGVzYywgMCwgMCk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CiAKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIkhhbmRsZXIiLCAgICAgb2JqX2Rlc2MtPmRldmljZS5oYW5kbGVyKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoInN5c3RlbV9ub3RpZnkiLCBvYmpfZGVzYy0+ZGV2aWNlLnN5c3RlbV9ub3RpZnkpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiZGV2aWNlX25vdGlmeSIsIG9ial9kZXNjLT5kZXZpY2UuZGV2aWNlX25vdGlmeSk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIkhhbmRsZXIiLCBvYmpfZGVzYy0+ZGV2aWNlLmhhbmRsZXIpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJzeXN0ZW1fbm90aWZ5IiwKKwkJCQkgICAgb2JqX2Rlc2MtPmRldmljZS5zeXN0ZW1fbm90aWZ5KTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiZGV2aWNlX25vdGlmeSIsCisJCQkJICAgIG9ial9kZXNjLT5kZXZpY2UuZGV2aWNlX25vdGlmeSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9FVkVOVDoKIAotCQlhY3BpX2V4X291dF9wb2ludGVyICgiU2VtYXBob3JlIiwgICBvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlKTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiU2VtYXBob3JlIiwgb2JqX2Rlc2MtPmV2ZW50LnNlbWFwaG9yZSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CiAKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoInBhcmFtX2NvdW50Iiwgb2JqX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudCk7Ci0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJDb25jdXJyZW5jeSIsIG9ial9kZXNjLT5tZXRob2QuY29uY3VycmVuY3kpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiU2VtYXBob3JlIiwgICBvYmpfZGVzYy0+bWV0aG9kLnNlbWFwaG9yZSk7Ci0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJvd25pbmdfaWQiLCAgIG9ial9kZXNjLT5tZXRob2Qub3duaW5nX2lkKTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoImFtbF9sZW5ndGgiLCAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoImFtbF9zdGFydCIsICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJwYXJhbV9jb3VudCIsCisJCQkJICAgIG9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJDb25jdXJyZW5jeSIsCisJCQkJICAgIG9ial9kZXNjLT5tZXRob2QuY29uY3VycmVuY3kpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJTZW1hcGhvcmUiLCBvYmpfZGVzYy0+bWV0aG9kLnNlbWFwaG9yZSk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoIm93bmVyX2lkIiwgb2JqX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoImFtbF9sZW5ndGgiLCBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJhbWxfc3RhcnQiLCBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9NVVRFWDoKIAotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgic3luY19sZXZlbCIsICBvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbCk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJvd25lcl90aHJlYWQiLCBvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkKTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoImFjcXVpcmVfZGVwdGgiLCBvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGgpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiU2VtYXBob3JlIiwgICBvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigic3luY19sZXZlbCIsIG9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsKTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigib3duZXJfdGhyZWFkIiwKKwkJCQkgICAgb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZCk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoImFjcXVpcmVfZGVwdGgiLAorCQkJCSAgICBvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGgpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJTZW1hcGhvcmUiLCBvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKIAotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgic3BhY2VfaWQiLCAgICBvYmpfZGVzYy0+cmVnaW9uLnNwYWNlX2lkKTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoIkZsYWdzIiwgICAgICAgb2JqX2Rlc2MtPnJlZ2lvbi5mbGFncyk7Ci0JCWFjcGlfZXhfb3V0X2FkZHJlc3MgKCJBZGRyZXNzIiwgICAgIG9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyk7Ci0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJMZW5ndGgiLCAgICAgIG9ial9kZXNjLT5yZWdpb24ubGVuZ3RoKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIkhhbmRsZXIiLCAgICAgb2JqX2Rlc2MtPnJlZ2lvbi5oYW5kbGVyKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIk5leHQiLCAgICAgICAgb2JqX2Rlc2MtPnJlZ2lvbi5uZXh0KTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigic3BhY2VfaWQiLCBvYmpfZGVzYy0+cmVnaW9uLnNwYWNlX2lkKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigiRmxhZ3MiLCBvYmpfZGVzYy0+cmVnaW9uLmZsYWdzKTsKKwkJYWNwaV9leF9vdXRfYWRkcmVzcygiQWRkcmVzcyIsIG9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoIkxlbmd0aCIsIG9ial9kZXNjLT5yZWdpb24ubGVuZ3RoKTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiSGFuZGxlciIsIG9ial9kZXNjLT5yZWdpb24uaGFuZGxlcik7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIk5leHQiLCBvYmpfZGVzYy0+cmVnaW9uLm5leHQpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6CiAKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoInN5c3RlbV9sZXZlbCIsIG9ial9kZXNjLT5wb3dlcl9yZXNvdXJjZS5zeXN0ZW1fbGV2ZWwpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgicmVzb3VyY2Vfb3JkZXIiLCBvYmpfZGVzYy0+cG93ZXJfcmVzb3VyY2UucmVzb3VyY2Vfb3JkZXIpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgic3lzdGVtX25vdGlmeSIsIG9ial9kZXNjLT5wb3dlcl9yZXNvdXJjZS5zeXN0ZW1fbm90aWZ5KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoImRldmljZV9ub3RpZnkiLCBvYmpfZGVzYy0+cG93ZXJfcmVzb3VyY2UuZGV2aWNlX25vdGlmeSk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoInN5c3RlbV9sZXZlbCIsCisJCQkJICAgIG9ial9kZXNjLT5wb3dlcl9yZXNvdXJjZS5zeXN0ZW1fbGV2ZWwpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJyZXNvdXJjZV9vcmRlciIsCisJCQkJICAgIG9ial9kZXNjLT5wb3dlcl9yZXNvdXJjZS5yZXNvdXJjZV9vcmRlcik7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoInN5c3RlbV9ub3RpZnkiLAorCQkJCSAgICBvYmpfZGVzYy0+cG93ZXJfcmVzb3VyY2Uuc3lzdGVtX25vdGlmeSk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoImRldmljZV9ub3RpZnkiLAorCQkJCSAgICBvYmpfZGVzYy0+cG93ZXJfcmVzb3VyY2UuZGV2aWNlX25vdGlmeSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6CiAKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoIlByb2Nlc3NvciBJRCIsIG9ial9kZXNjLT5wcm9jZXNzb3IucHJvY19pZCk7Ci0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJMZW5ndGgiLCAgICAgIG9ial9kZXNjLT5wcm9jZXNzb3IubGVuZ3RoKTsKLQkJYWNwaV9leF9vdXRfYWRkcmVzcyAoIkFkZHJlc3MiLCAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgb2JqX2Rlc2MtPnByb2Nlc3Nvci5hZGRyZXNzKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoInN5c3RlbV9ub3RpZnkiLCBvYmpfZGVzYy0+cHJvY2Vzc29yLnN5c3RlbV9ub3RpZnkpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiZGV2aWNlX25vdGlmeSIsIG9ial9kZXNjLT5wcm9jZXNzb3IuZGV2aWNlX25vdGlmeSk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJIYW5kbGVyIiwgICAgIG9ial9kZXNjLT5wcm9jZXNzb3IuaGFuZGxlcik7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoIlByb2Nlc3NvciBJRCIsCisJCQkJICAgIG9ial9kZXNjLT5wcm9jZXNzb3IucHJvY19pZCk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoIkxlbmd0aCIsIG9ial9kZXNjLT5wcm9jZXNzb3IubGVuZ3RoKTsKKwkJYWNwaV9leF9vdXRfYWRkcmVzcygiQWRkcmVzcyIsCisJCQkJICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIG9ial9kZXNjLT5wcm9jZXNzb3IuCisJCQkJICAgIGFkZHJlc3MpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJzeXN0ZW1fbm90aWZ5IiwKKwkJCQkgICAgb2JqX2Rlc2MtPnByb2Nlc3Nvci5zeXN0ZW1fbm90aWZ5KTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiZGV2aWNlX25vdGlmeSIsCisJCQkJICAgIG9ial9kZXNjLT5wcm9jZXNzb3IuZGV2aWNlX25vdGlmeSk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIkhhbmRsZXIiLCBvYmpfZGVzYy0+cHJvY2Vzc29yLmhhbmRsZXIpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfVEhFUk1BTDoKIAotCQlhY3BpX2V4X291dF9wb2ludGVyICgic3lzdGVtX25vdGlmeSIsIG9ial9kZXNjLT50aGVybWFsX3pvbmUuc3lzdGVtX25vdGlmeSk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJkZXZpY2Vfbm90aWZ5Iiwgb2JqX2Rlc2MtPnRoZXJtYWxfem9uZS5kZXZpY2Vfbm90aWZ5KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIkhhbmRsZXIiLCAgICAgb2JqX2Rlc2MtPnRoZXJtYWxfem9uZS5oYW5kbGVyKTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigic3lzdGVtX25vdGlmeSIsCisJCQkJICAgIG9ial9kZXNjLT50aGVybWFsX3pvbmUuc3lzdGVtX25vdGlmeSk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoImRldmljZV9ub3RpZnkiLAorCQkJCSAgICBvYmpfZGVzYy0+dGhlcm1hbF96b25lLmRldmljZV9ub3RpZnkpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJIYW5kbGVyIiwgb2JqX2Rlc2MtPnRoZXJtYWxfem9uZS5oYW5kbGVyKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiZmllbGRfZmxhZ3MiLCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoImFjY2Vzc19ieXRlX3dpZHRoIixvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoImJpdF9sZW5ndGgiLCAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoKTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoImZsZF9iaXRfb2Zmc2V0Iiwgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoImJhc2VfYnl0ZV9vZmZzZXQiLCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgicGFyZW50X25vZGUiLCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJmaWVsZF9mbGFncyIsCisJCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuZmllbGRfZmxhZ3MpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJhY2Nlc3NfYnl0ZV93aWR0aCIsCisJCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJiaXRfbGVuZ3RoIiwKKwkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigiZmxkX2JpdF9vZmZzZXQiLAorCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCSAgICBzdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigiYmFzZV9ieXRlX29mZnNldCIsCisJCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoInBhcmVudF9ub2RlIiwgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5ub2RlKTsKIAotCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKKwkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgotCQkJYWNwaV9leF9vdXRfcG9pbnRlciAoImJ1ZmZlcl9vYmoiLCBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopOworCQkJYWNwaV9leF9vdXRfcG9pbnRlcigiYnVmZmVyX29iaiIsCisJCQkJCSAgICBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgotCQkJYWNwaV9leF9vdXRfcG9pbnRlciAoInJlZ2lvbl9vYmoiLCBvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaik7CisJCQlhY3BpX2V4X291dF9wb2ludGVyKCJyZWdpb25fb2JqIiwKKwkJCQkJICAgIG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6Ci0JCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiVmFsdWUiLCAgIG9ial9kZXNjLT5iYW5rX2ZpZWxkLnZhbHVlKTsKLQkJCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJyZWdpb25fb2JqIiwgb2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaik7Ci0JCQlhY3BpX2V4X291dF9wb2ludGVyICgiYmFua19vYmoiLCBvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaik7CisJCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJWYWx1ZSIsCisJCQkJCSAgICBvYmpfZGVzYy0+YmFua19maWVsZC52YWx1ZSk7CisJCQlhY3BpX2V4X291dF9wb2ludGVyKCJyZWdpb25fb2JqIiwKKwkJCQkJICAgIG9ial9kZXNjLT5iYW5rX2ZpZWxkLnJlZ2lvbl9vYmopOworCQkJYWNwaV9leF9vdXRfcG9pbnRlcigiYmFua19vYmoiLAorCQkJCQkgICAgb2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmopOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6Ci0JCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiVmFsdWUiLCAgIG9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSk7Ci0JCQlhY3BpX2V4X291dF9wb2ludGVyICgiSW5kZXgiLCAgIG9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmopOwotCQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIkRhdGEiLCAgICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmopOworCQkJYWNwaV9leF9vdXRfaW50ZWdlcigiVmFsdWUiLAorCQkJCQkgICAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLnZhbHVlKTsKKwkJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIkluZGV4IiwKKwkJCQkJICAgIG9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmopOworCQkJYWNwaV9leF9vdXRfcG9pbnRlcigiRGF0YSIsCisJCQkJCSAgICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmopOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKQEAgLTc3OSw1NiArODY4LDUyIEBACiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKIAotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgidGFyZ2V0X3R5cGUiLCBvYmpfZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlKTsKLQkJYWNwaV9leF9vdXRfc3RyaW5nICgiT3Bjb2RlIiwgICAgICAgKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvICgKLQkJCQkgIG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSktPm5hbWUpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiT2Zmc2V0IiwgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJvYmpfZGVzYyIsICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIk5vZGUiLCAgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIldoZXJlIiwgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS53aGVyZSk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoInRhcmdldF90eXBlIiwKKwkJCQkgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSk7CisJCWFjcGlfZXhfb3V0X3N0cmluZygiT3Bjb2RlIiwKKwkJCQkgICAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8KKwkJCQkgICAgKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSktPm5hbWUpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJPZmZzZXQiLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIm9ial9kZXNjIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJOb2RlIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiV2hlcmUiLCBvYmpfZGVzYy0+cmVmZXJlbmNlLndoZXJlKTsKIAotCQlpZiAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpIHsKLQkJCWFjcGlfb3NfcHJpbnRmICgiXG5SZWZlcmVuY2VkIE9iamVjdDpcbiIpOwotCQkJYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCwgZmxhZ3MpOwotCQl9CisJCWFjcGlfZXhfZHVtcF9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQUREUkVTU19IQU5ETEVSOgogCi0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJzcGFjZV9pZCIsICAgIG9ial9kZXNjLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIk5leHQiLCAgICAgICAgb2JqX2Rlc2MtPmFkZHJlc3Nfc3BhY2UubmV4dCk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJyZWdpb25fbGlzdCIsIG9ial9kZXNjLT5hZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIk5vZGUiLCAgICAgICAgb2JqX2Rlc2MtPmFkZHJlc3Nfc3BhY2Uubm9kZSk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJDb250ZXh0IiwgICAgIG9ial9kZXNjLT5hZGRyZXNzX3NwYWNlLmNvbnRleHQpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJzcGFjZV9pZCIsCisJCQkJICAgIG9ial9kZXNjLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkKTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiTmV4dCIsIG9ial9kZXNjLT5hZGRyZXNzX3NwYWNlLm5leHQpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJyZWdpb25fbGlzdCIsCisJCQkJICAgIG9ial9kZXNjLT5hZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0KTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiTm9kZSIsIG9ial9kZXNjLT5hZGRyZXNzX3NwYWNlLm5vZGUpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJDb250ZXh0Iiwgb2JqX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuY29udGV4dCk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9OT1RJRlk6CiAKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIk5vZGUiLCAgICAgICAgb2JqX2Rlc2MtPm5vdGlmeS5ub2RlKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIkNvbnRleHQiLCAgICAgb2JqX2Rlc2MtPm5vdGlmeS5jb250ZXh0KTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiTm9kZSIsIG9ial9kZXNjLT5ub3RpZnkubm9kZSk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIkNvbnRleHQiLCBvYmpfZGVzYy0+bm90aWZ5LmNvbnRleHQpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVM6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0VYVFJBOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0RBVEE6CiAJZGVmYXVsdDoKIAotCQlhY3BpX29zX3ByaW50ZiAoCi0JCQkiZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcjogRGlzcGxheSBub3QgaW1wbGVtZW50ZWQgZm9yIG9iamVjdCB0eXBlICVzXG4iLAotCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpKTsKKwkJYWNwaV9vc19wcmludGYKKwkJICAgICgiZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcjogRGlzcGxheSBub3QgaW1wbGVtZW50ZWQgZm9yIG9iamVjdCB0eXBlICVzXG4iLAorCQkgICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqX2Rlc2MpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KICNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmaWVsZC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmllbGQuYwppbmRleCAyMmM4ZmE0Li5hYjFiYTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmaWVsZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMKQEAgLTQxLDE1ICs0MSwxMiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4ZmllbGQiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJleGZpZWxkIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02NSw2NCArNjIsNzAgQEAKICAqICAgICAgICAgICAgICBCdWZmZXIsIGRlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgZmllbGQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldF9idWZmZXJfZGVzYykKK2FjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXRfYnVmZmVyX2Rlc2MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqYnVmZmVyX2Rlc2M7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2VkOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpidWZmZXJfZGVzYzsKKwlhY3BpX3NpemUgbGVuZ3RoOworCXZvaWQgKmJ1ZmZlcjsKKwl1OCBsb2NrZWQ7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQiLCBvYmpfZGVzYyk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQiLCBvYmpfZGVzYyk7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCiAJaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9OT19PUEVSQU5EKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKKwl9CisJaWYgKCFyZXRfYnVmZmVyX2Rlc2MpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9CVUZGRVJfRklFTEQpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9CVUZGRVJfRklFTEQpIHsKIAkJLyoKIAkJICogSWYgdGhlIGJ1ZmZlcl9maWVsZCBhcmd1bWVudHMgaGF2ZSBub3QgYmVlbiBwcmV2aW91c2x5IGV2YWx1YXRlZCwKIAkJICogZXZhbHVhdGUgdGhlbSBub3cgYW5kIHNhdmUgdGhlIHJlc3VsdHMuCiAJCSAqLwogCQlpZiAoIShvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzIChvYmpfZGVzYyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cyhvYmpfZGVzYyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAkJfQotCX0KLQllbHNlIGlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEKSAmJgotCQkJIChvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NNQlVTKSkgeworCX0gZWxzZQorCSAgICBpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEKQorCQkmJiAob2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmotPnJlZ2lvbi5zcGFjZV9pZCA9PQorCQkgICAgQUNQSV9BRFJfU1BBQ0VfU01CVVMpKSB7CiAJCS8qCiAJCSAqIFRoaXMgaXMgYW4gU01CdXMgcmVhZC4gIFdlIG11c3QgY3JlYXRlIGEgYnVmZmVyIHRvIGhvbGQgdGhlIGRhdGEKIAkJICogYW5kIGRpcmVjdGx5IGFjY2VzcyB0aGUgcmVnaW9uIGhhbmRsZXIuCiAJCSAqLwotCQlidWZmZXJfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QgKEFDUElfU01CVVNfQlVGRkVSX1NJWkUpOworCQlidWZmZXJfZGVzYyA9CisJCSAgICBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KEFDUElfU01CVVNfQlVGRkVSX1NJWkUpOwogCQlpZiAoIWJ1ZmZlcl9kZXNjKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCS8qIExvY2sgZW50aXJlIHRyYW5zYWN0aW9uIGlmIHJlcXVlc3RlZCAqLwogCi0JCWxvY2tlZCA9IGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyk7CisJCWxvY2tlZCA9CisJCSAgICBhY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJCWZpZWxkX2ZsYWdzKTsKIAogCQkvKgogCQkgKiBQZXJmb3JtIHRoZSByZWFkLgogCQkgKiBOb3RlOiBTbWJ1cyBwcm90b2NvbCB2YWx1ZSBpcyBwYXNzZWQgaW4gdXBwZXIgMTYtYml0cyBvZiBGdW5jdGlvbgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9hY2Nlc3NfcmVnaW9uIChvYmpfZGVzYywgMCwKLQkJCQkgQUNQSV9DQVNUX1BUUiAoYWNwaV9pbnRlZ2VyLCBidWZmZXJfZGVzYy0+YnVmZmVyLnBvaW50ZXIpLAotCQkJCSBBQ1BJX1JFQUQgfCAob2JqX2Rlc2MtPmZpZWxkLmF0dHJpYnV0ZSA8PCAxNikpOwotCQlhY3BpX2V4X3JlbGVhc2VfZ2xvYmFsX2xvY2sgKGxvY2tlZCk7CisJCXN0YXR1cyA9IGFjcGlfZXhfYWNjZXNzX3JlZ2lvbihvYmpfZGVzYywgMCwKKwkJCQkJICAgICAgIEFDUElfQ0FTVF9QVFIoYWNwaV9pbnRlZ2VyLAorCQkJCQkJCSAgICAgYnVmZmVyX2Rlc2MtPgorCQkJCQkJCSAgICAgYnVmZmVyLnBvaW50ZXIpLAorCQkJCQkgICAgICAgQUNQSV9SRUFEIHwgKG9ial9kZXNjLT5maWVsZC4KKwkJCQkJCQkgICAgYXR0cmlidXRlIDw8IDE2KSk7CisJCWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayhsb2NrZWQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMzYsMjIgKzEzOSwyMiBAQAogCSAqCiAJICogTm90ZTogRmllbGQubGVuZ3RoIGlzIGluIGJpdHMuCiAJICovCi0JbGVuZ3RoID0gKGFjcGlfc2l6ZSkgQUNQSV9ST1VORF9CSVRTX1VQX1RPX0JZVEVTIChvYmpfZGVzYy0+ZmllbGQuYml0X2xlbmd0aCk7CisJbGVuZ3RoID0KKwkgICAgKGFjcGlfc2l6ZSkgQUNQSV9ST1VORF9CSVRTX1VQX1RPX0JZVEVTKG9ial9kZXNjLT5maWVsZC5iaXRfbGVuZ3RoKTsKIAlpZiAobGVuZ3RoID4gYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKSB7CiAJCS8qIEZpZWxkIGlzIHRvbyBsYXJnZSBmb3IgYW4gSW50ZWdlciwgY3JlYXRlIGEgQnVmZmVyIGluc3RlYWQgKi8KIAotCQlidWZmZXJfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QgKGxlbmd0aCk7CisJCWJ1ZmZlcl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdChsZW5ndGgpOwogCQlpZiAoIWJ1ZmZlcl9kZXNjKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCQlidWZmZXIgPSBidWZmZXJfZGVzYy0+YnVmZmVyLnBvaW50ZXI7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIEZpZWxkIHdpbGwgZml0IHdpdGhpbiBhbiBJbnRlZ2VyIChub3JtYWwgY2FzZSkgKi8KIAotCQlidWZmZXJfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlidWZmZXJfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CiAJCWlmICghYnVmZmVyX2Rlc2MpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJbGVuZ3RoID0gYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoOwpAQCAtMTU5LDM3ICsxNjIsMzYgQEAKIAkJYnVmZmVyID0gJmJ1ZmZlcl9kZXNjLT5pbnRlZ2VyLnZhbHVlOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKLQkJImZpZWxkX3JlYWQgW1RPXTogIE9iaiAlcCwgVHlwZSAlWCwgQnVmICVwLCBieXRlX2xlbiAlWFxuIiwKLQkJb2JqX2Rlc2MsIEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYyksIGJ1ZmZlciwgKHUzMikgbGVuZ3RoKSk7Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkiZmllbGRfcmVhZCBbRlJPTV06IGJpdF9sZW4gJVgsIGJpdF9vZmYgJVgsIGJ5dGVfb2ZmICVYXG4iLAotCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCi0JCW9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKLQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0KSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkgICJmaWVsZF9yZWFkIFtUT106ICBPYmogJXAsIFR5cGUgJVgsIEJ1ZiAlcCwgYnl0ZV9sZW4gJVhcbiIsCisJCQkgIG9ial9kZXNjLCBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYyksIGJ1ZmZlciwKKwkJCSAgKHUzMikgbGVuZ3RoKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkgICJmaWVsZF9yZWFkIFtGUk9NXTogYml0X2xlbiAlWCwgYml0X29mZiAlWCwgYnl0ZV9vZmYgJVhcbiIsCisJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKKwkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAorCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQpKTsKIAogCS8qIExvY2sgZW50aXJlIHRyYW5zYWN0aW9uIGlmIHJlcXVlc3RlZCAqLwogCi0JbG9ja2VkID0gYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKKwlsb2NrZWQgPQorCSAgICBhY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyk7CiAKIAkvKiBSZWFkIGZyb20gdGhlIGZpZWxkICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X2V4dHJhY3RfZnJvbV9maWVsZCAob2JqX2Rlc2MsIGJ1ZmZlciwgKHUzMikgbGVuZ3RoKTsKLQlhY3BpX2V4X3JlbGVhc2VfZ2xvYmFsX2xvY2sgKGxvY2tlZCk7CisJc3RhdHVzID0gYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQob2JqX2Rlc2MsIGJ1ZmZlciwgKHUzMikgbGVuZ3RoKTsKKwlhY3BpX2V4X3JlbGVhc2VfZ2xvYmFsX2xvY2sobG9ja2VkKTsKIAotCi1leGl0OgotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChidWZmZXJfZGVzYyk7Ci0JfQotCWVsc2UgaWYgKHJldF9idWZmZXJfZGVzYykgeworICAgICAgZXhpdDoKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGJ1ZmZlcl9kZXNjKTsKKwl9IGVsc2UgewogCQkqcmV0X2J1ZmZlcl9kZXNjID0gYnVmZmVyX2Rlc2M7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfd3JpdGVfZGF0YV90b19maWVsZApAQCAtMjA1LDk3ICsyMDcsOTYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3dyaXRlX2RhdGFfdG9fZmllbGQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXN1bHRfZGVzYykKK2FjcGlfZXhfd3JpdGVfZGF0YV90b19maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmVzdWx0X2Rlc2MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9sZW5ndGg7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5ld19idWZmZXI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrZWQ7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqYnVmZmVyX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBsZW5ndGg7CisJdTMyIHJlcXVpcmVkX2xlbmd0aDsKKwl2b2lkICpidWZmZXI7CisJdm9pZCAqbmV3X2J1ZmZlcjsKKwl1OCBsb2NrZWQ7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYnVmZmVyX2Rlc2M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfd3JpdGVfZGF0YV90b19maWVsZCIsIG9ial9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF93cml0ZV9kYXRhX3RvX2ZpZWxkIiwgb2JqX2Rlc2MpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAogCWlmICghc291cmNlX2Rlc2MgfHwgIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX05PX09QRVJBTkQpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwogCX0KIAotCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9CVUZGRVJfRklFTEQpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9CVUZGRVJfRklFTEQpIHsKIAkJLyoKIAkJICogSWYgdGhlIGJ1ZmZlcl9maWVsZCBhcmd1bWVudHMgaGF2ZSBub3QgYmVlbiBwcmV2aW91c2x5IGV2YWx1YXRlZCwKIAkJICogZXZhbHVhdGUgdGhlbSBub3cgYW5kIHNhdmUgdGhlIHJlc3VsdHMuCiAJCSAqLwogCQlpZiAoIShvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzIChvYmpfZGVzYyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cyhvYmpfZGVzYyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAkJfQotCX0KLQllbHNlIGlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEKSAmJgotCQkJIChvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NNQlVTKSkgeworCX0gZWxzZQorCSAgICBpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEKQorCQkmJiAob2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmotPnJlZ2lvbi5zcGFjZV9pZCA9PQorCQkgICAgQUNQSV9BRFJfU1BBQ0VfU01CVVMpKSB7CiAJCS8qCiAJCSAqIFRoaXMgaXMgYW4gU01CdXMgd3JpdGUuICBXZSB3aWxsIGJ5cGFzcyB0aGUgZW50aXJlIGZpZWxkIG1lY2hhbmlzbQogCQkgKiBhbmQgaGFuZG9mZiB0aGUgYnVmZmVyIGRpcmVjdGx5IHRvIHRoZSBoYW5kbGVyLgogCQkgKgogCQkgKiBTb3VyY2UgbXVzdCBiZSBhIGJ1ZmZlciBvZiBzdWZmaWNpZW50IHNpemUgKEFDUElfU01CVVNfQlVGRkVSX1NJWkUpLgogCQkgKi8KLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiU01CdXMgd3JpdGUgcmVxdWlyZXMgQnVmZmVyLCBmb3VuZCB0eXBlICVzXG4iLAotCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSkpOworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiU01CdXMgd3JpdGUgcmVxdWlyZXMgQnVmZmVyLCBmb3VuZCB0eXBlICVzXG4iLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKHNvdXJjZV9kZXNjKSkpOwogCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKIAkJaWYgKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDwgQUNQSV9TTUJVU19CVUZGRVJfU0laRSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiU01CdXMgd3JpdGUgcmVxdWlyZXMgQnVmZmVyIG9mIGxlbmd0aCAlWCwgZm91bmQgbGVuZ3RoICVYXG4iLAotCQkJCUFDUElfU01CVVNfQlVGRkVSX1NJWkUsIHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlNNQnVzIHdyaXRlIHJlcXVpcmVzIEJ1ZmZlciBvZiBsZW5ndGggJVgsIGZvdW5kIGxlbmd0aCAlWFxuIiwgQUNQSV9TTUJVU19CVUZGRVJfU0laRSwgc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKTsKIAotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQlVGRkVSX0xJTUlUKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQlVGRkVSX0xJTUlUKTsKIAkJfQogCi0JCWJ1ZmZlcl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCAoQUNQSV9TTUJVU19CVUZGRVJfU0laRSk7CisJCWJ1ZmZlcl9kZXNjID0KKwkJICAgIGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoQUNQSV9TTUJVU19CVUZGRVJfU0laRSk7CiAJCWlmICghYnVmZmVyX2Rlc2MpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJYnVmZmVyID0gYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOwotCQlBQ1BJX01FTUNQWSAoYnVmZmVyLCBzb3VyY2VfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCi0JCQlBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFKTsKKwkJQUNQSV9NRU1DUFkoYnVmZmVyLCBzb3VyY2VfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCisJCQkgICAgQUNQSV9TTUJVU19CVUZGRVJfU0laRSk7CiAKIAkJLyogTG9jayBlbnRpcmUgdHJhbnNhY3Rpb24gaWYgcmVxdWVzdGVkICovCiAKLQkJbG9ja2VkID0gYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKKwkJbG9ja2VkID0KKwkJICAgIGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkJZmllbGRfZmxhZ3MpOwogCiAJCS8qCiAJCSAqIFBlcmZvcm0gdGhlIHdyaXRlIChyZXR1cm5zIHN0YXR1cyBhbmQgcGVyaGFwcyBkYXRhIGluIHRoZQogCQkgKiBzYW1lIGJ1ZmZlcikKIAkJICogTm90ZTogU01CdXMgcHJvdG9jb2wgdHlwZSBpcyBwYXNzZWQgaW4gdXBwZXIgMTYtYml0cyBvZiBGdW5jdGlvbi4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfYWNjZXNzX3JlZ2lvbiAob2JqX2Rlc2MsIDAsCi0JCQkJICAoYWNwaV9pbnRlZ2VyICopIGJ1ZmZlciwKLQkJCQkgIEFDUElfV1JJVEUgfCAob2JqX2Rlc2MtPmZpZWxkLmF0dHJpYnV0ZSA8PCAxNikpOwotCQlhY3BpX2V4X3JlbGVhc2VfZ2xvYmFsX2xvY2sgKGxvY2tlZCk7CisJCXN0YXR1cyA9IGFjcGlfZXhfYWNjZXNzX3JlZ2lvbihvYmpfZGVzYywgMCwKKwkJCQkJICAgICAgIChhY3BpX2ludGVnZXIgKikgYnVmZmVyLAorCQkJCQkgICAgICAgQUNQSV9XUklURSB8IChvYmpfZGVzYy0+ZmllbGQuCisJCQkJCQkJICAgICBhdHRyaWJ1dGUgPDwgMTYpKTsKKwkJYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrKGxvY2tlZCk7CiAKIAkJKnJlc3VsdF9kZXNjID0gYnVmZmVyX2Rlc2M7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogR2V0IGEgcG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSB3cml0dGVuICovCiAKLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAJCWJ1ZmZlciA9ICZzb3VyY2VfZGVzYy0+aW50ZWdlci52YWx1ZTsKLQkJbGVuZ3RoID0gc2l6ZW9mIChzb3VyY2VfZGVzYy0+aW50ZWdlci52YWx1ZSk7CisJCWxlbmd0aCA9IHNpemVvZihzb3VyY2VfZGVzYy0+aW50ZWdlci52YWx1ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgpAQCAtMzA5LDcgKzMxMCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCX0KIAogCS8qCkBAIC0zMTksMTUgKzMyMCwxNSBAQAogCSAqIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24uCiAJICovCiAJbmV3X2J1ZmZlciA9IE5VTEw7Ci0JcmVxdWlyZWRfbGVuZ3RoID0gQUNQSV9ST1VORF9CSVRTX1VQX1RPX0JZVEVTICgKLQkJCSAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCk7CisJcmVxdWlyZWRfbGVuZ3RoID0KKwkgICAgQUNQSV9ST1VORF9CSVRTX1VQX1RPX0JZVEVTKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCk7CiAKIAlpZiAobGVuZ3RoIDwgcmVxdWlyZWRfbGVuZ3RoKSB7CiAJCS8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGJ1ZmZlciAqLwogCi0JCW5ld19idWZmZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKHJlcXVpcmVkX2xlbmd0aCk7CisJCW5ld19idWZmZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUocmVxdWlyZWRfbGVuZ3RoKTsKIAkJaWYgKCFuZXdfYnVmZmVyKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCS8qCkBAIC0zMzUsNDAgKzMzNiw0MiBAQAogCQkgKiBhdCBCeXRlIHplcm8uICBBbGwgdW51c2VkICh1cHBlcikgYnl0ZXMgb2YgdGhlCiAJCSAqIGJ1ZmZlciB3aWxsIGJlIDAuCiAJCSAqLwotCQlBQ1BJX01FTUNQWSAoKGNoYXIgKikgbmV3X2J1ZmZlciwgKGNoYXIgKikgYnVmZmVyLCBsZW5ndGgpOworCQlBQ1BJX01FTUNQWSgoY2hhciAqKW5ld19idWZmZXIsIChjaGFyICopYnVmZmVyLCBsZW5ndGgpOwogCQlidWZmZXIgPSBuZXdfYnVmZmVyOwogCQlsZW5ndGggPSByZXF1aXJlZF9sZW5ndGg7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkiZmllbGRfd3JpdGUgW0ZST01dOiBPYmogJXAgKCVzOiVYKSwgQnVmICVwLCBieXRlX2xlbiAlWFxuIiwKLQkJc291cmNlX2Rlc2MsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSksCi0JCUFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYyksIGJ1ZmZlciwgbGVuZ3RoKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkgICJmaWVsZF93cml0ZSBbRlJPTV06IE9iaiAlcCAoJXM6JVgpLCBCdWYgJXAsIGJ5dGVfbGVuICVYXG4iLAorCQkJICBzb3VyY2VfZGVzYywKKwkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKEFDUElfR0VUX09CSkVDVF9UWVBFCisJCQkJCQkoc291cmNlX2Rlc2MpKSwKKwkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpLCBidWZmZXIsIGxlbmd0aCkpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkiZmllbGRfd3JpdGUgW1RPXTogIE9iaiAlcCAoJXM6JVgpLCBiaXRfbGVuICVYLCBiaXRfb2ZmICVYLCBieXRlX29mZiAlWFxuIiwKLQkJb2JqX2Rlc2MsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSksCi0JCUFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYyksCi0JCW9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKLQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAotCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgImZpZWxkX3dyaXRlIFtUT106ICBPYmogJXAgKCVzOiVYKSwgYml0X2xlbiAlWCwgYml0X29mZiAlWCwgYnl0ZV9vZmYgJVhcbiIsCisJCQkgIG9ial9kZXNjLAorCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSwKKwkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpLAorCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCisJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKKwkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0KSk7CiAKIAkvKiBMb2NrIGVudGlyZSB0cmFuc2FjdGlvbiBpZiByZXF1ZXN0ZWQgKi8KIAotCWxvY2tlZCA9IGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyk7CisJbG9ja2VkID0KKwkgICAgYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrKG9ial9kZXNjLT5jb21tb25fZmllbGQuZmllbGRfZmxhZ3MpOwogCiAJLyogV3JpdGUgdG8gdGhlIGZpZWxkICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkIChvYmpfZGVzYywgYnVmZmVyLCBsZW5ndGgpOwotCWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayAobG9ja2VkKTsKKwlzdGF0dXMgPSBhY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkKG9ial9kZXNjLCBidWZmZXIsIGxlbmd0aCk7CisJYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrKGxvY2tlZCk7CiAKIAkvKiBGcmVlIHRlbXBvcmFyeSBidWZmZXIgaWYgd2UgdXNlZCBvbmUgKi8KIAogCWlmIChuZXdfYnVmZmVyKSB7Ci0JCUFDUElfTUVNX0ZSRUUgKG5ld19idWZmZXIpOworCQlBQ1BJX01FTV9GUkVFKG5ld19idWZmZXIpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmbGRpby5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmxkaW8uYwppbmRleCAzYzJmODllLi5iYTZlMDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmbGRpby5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMKQEAgLTQxLDM2ICs0MSwyOCBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleGZsZGlvIikKK0FDUElfTU9EVUxFX05BTUUoImV4ZmxkaW8iKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9maWVsZF9kYXR1bV9pbyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfd3JpdGUpOworYWNwaV9leF9maWVsZF9kYXR1bV9pbyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICAgIHUzMiBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJICAgICAgIGFjcGlfaW50ZWdlciAqIHZhbHVlLCB1MzIgcmVhZF93cml0ZSk7CiAKIHN0YXRpYyB1OAotYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CithY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICBhY3BpX2ludGVnZXIgdmFsdWUpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfc2V0dXBfcmVnaW9uICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKLQorYWNwaV9leF9zZXR1cF9yZWdpb24odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCSAgICAgdTMyIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC04OSwyNyArODEsMjUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9zZXR1cF9yZWdpb24gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpCithY3BpX2V4X3NldHVwX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICB1MzIgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZ25fZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZ25fZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIgKCJleF9zZXR1cF9yZWdpb24iLCBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigiZXhfc2V0dXBfcmVnaW9uIiwgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpOwogCiAJcmduX2Rlc2MgPSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnJlZ2lvbl9vYmo7CiAKIAkvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCByZWdpb24gKi8KIAotCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAocmduX2Rlc2MpICE9IEFDUElfVFlQRV9SRUdJT04pIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJOZWVkZWQgUmVnaW9uLCBmb3VuZCB0eXBlICVYICglcylcbiIsCi0JCQlBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAocmduX2Rlc2MpLAotCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAocmduX2Rlc2MpKSk7CisJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKHJnbl9kZXNjKSAhPSBBQ1BJX1RZUEVfUkVHSU9OKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTmVlZGVkIFJlZ2lvbiwgZm91bmQgdHlwZSAlWCAoJXMpXG4iLAorCQkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUocmduX2Rlc2MpLAorCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShyZ25fZGVzYykpKTsKIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJfQogCiAJLyoKQEAgLTExNywyNiArMTA3LDI1IEBACiAJICogZXZhbHVhdGUgdGhlbSBub3cgYW5kIHNhdmUgdGhlIHJlc3VsdHMuCiAJICovCiAJaWYgKCEocmduX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSkgewotCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9yZWdpb25fYXJndW1lbnRzIChyZ25fZGVzYyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfcmVnaW9uX2FyZ3VtZW50cyhyZ25fZGVzYyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAlpZiAocmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TTUJVUykgewogCQkvKiBTTUJ1cyBoYXMgYSBub24tbGluZWFyIGFkZHJlc3Mgc3BhY2UgKi8KIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9Ci0KICNpZmRlZiBBQ1BJX1VOREVSX0RFVkVMT1BNRU5UCiAJLyoKIAkgKiBJZiB0aGUgRmllbGQgYWNjZXNzIGlzIGFueV9hY2MsIHdlIGNhbiBub3cgY29tcHV0ZSB0aGUgb3B0aW1hbAogCSAqIGFjY2VzcyAoYmVjYXVzZSB3ZSBrbm93IGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgcGFyZW50IHJlZ2lvbikKIAkgKi8KIAlpZiAoIShvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpKSB7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KICNlbmRpZgpAQCAtMTQ3LDU2ICsxMzYsNjQgQEAKIAkgKiAoUmVnaW9uIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4gYnl0ZXMpCiAJICovCiAJaWYgKHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoIDwgKG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCArCi0JCQkgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCArCi0JCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSkgeworCQkJCSAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCArCisJCQkJICAgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJICAgICAgIGFjY2Vzc19ieXRlX3dpZHRoKSkgewogCQlpZiAoYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKSB7CiAJCQkvKgogCQkJICogU2xhY2sgbW9kZSBvbmx5OiAgV2Ugd2lsbCBnbyBhaGVhZCBhbmQgYWxsb3cgYWNjZXNzIHRvIHRoaXMKIAkJCSAqIGZpZWxkIGlmIGl0IGlzIHdpdGhpbiB0aGUgcmVnaW9uIGxlbmd0aCByb3VuZGVkIHVwIHRvIHRoZSBuZXh0CiAJCQkgKiBhY2Nlc3Mgd2lkdGggYm91bmRhcnkuCiAJCQkgKi8KLQkJCWlmIChBQ1BJX1JPVU5EX1VQIChyZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCwKLQkJCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkgPj0KLQkJCQkob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICsKLQkJCQkgKGFjcGlfbmF0aXZlX3VpbnQpIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGggKwotCQkJCSBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCWlmIChBQ1BJX1JPVU5EX1VQKHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoLAorCQkJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpID49CisJCQkgICAgKG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCArCisJCQkgICAgIChhY3BpX25hdGl2ZV91aW50KSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJICAgICBhY2Nlc3NfYnl0ZV93aWR0aCArIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCQl9CiAJCX0KIAotCQlpZiAocmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGggPCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSB7CisJCWlmIChyZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCA8CisJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSB7CiAJCQkvKgogCQkJICogVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGUgYWNjZXNzX3R5cGUgKGFjY193b3JkLCBldGMuKSBpcyB3aWRlcgogCQkJICogdGhhbiB0aGUgcmVnaW9uIGl0c2VsZi4gIEZvciBleGFtcGxlLCBhIHJlZ2lvbiBvZiBsZW5ndGggb25lCiAJCQkgKiBieXRlLCBhbmQgYSBmaWVsZCB3aXRoIER3b3JkIGFjY2VzcyBzcGVjaWZpZWQuCiAJCQkgKi8KLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJGaWVsZCBbJTQuNHNdIGFjY2VzcyB3aWR0aCAoJWQgYnl0ZXMpIHRvbyBsYXJnZSBmb3IgcmVnaW9uIFslNC40c10gKGxlbmd0aCAlWClcbiIsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUpLAotCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChyZ25fZGVzYy0+cmVnaW9uLm5vZGUpLAotCQkJCXJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJGaWVsZCBbJTQuNHNdIGFjY2VzcyB3aWR0aCAoJWQgYnl0ZXMpIHRvbyBsYXJnZSBmb3IgcmVnaW9uIFslNC40c10gKGxlbmd0aCAlWClcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT4KKwkJCQkJCQkJY29tbW9uX2ZpZWxkLgorCQkJCQkJCQlub2RlKSwKKwkJCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoLAorCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShyZ25fZGVzYy0+CisJCQkJCQkJCXJlZ2lvbi5ub2RlKSwKKwkJCQkJICByZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCkpOwogCQl9CiAKIAkJLyoKIAkJICogT2Zmc2V0IHJvdW5kZWQgdXAgdG8gbmV4dCBtdWx0aXBsZSBvZiBmaWVsZCB3aWR0aAogCQkgKiBleGNlZWRzIHJlZ2lvbiBsZW5ndGgsIGluZGljYXRlIGFuIGVycm9yCiAJCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJGaWVsZCBbJTQuNHNdIEJhc2UrT2Zmc2V0K1dpZHRoICVYKyVYKyVYIGlzIGJleW9uZCBlbmQgb2YgcmVnaW9uIFslNC40c10gKGxlbmd0aCAlWClcbiIsCi0JCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5jb21tb25fZmllbGQubm9kZSksCi0JCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCi0JCQlmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocmduX2Rlc2MtPnJlZ2lvbi5ub2RlKSwKLQkJCXJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiRmllbGQgWyU0LjRzXSBCYXNlK09mZnNldCtXaWR0aCAlWCslWCslWCBpcyBiZXlvbmQgZW5kIG9mIHJlZ2lvbiBbJTQuNHNdIChsZW5ndGggJVgpXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCQkJbm9kZSksCisJCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCisJCQkJICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocmduX2Rlc2MtPnJlZ2lvbi5ub2RlKSwKKwkJCQkgIHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfUkVHSU9OX0xJTUlUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9SRUdJT05fTElNSVQpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9hY2Nlc3NfcmVnaW9uCkBAIC0yMTYsMjcgKzIxMywyMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfYWNjZXNzX3JlZ2lvbiAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKQorYWNwaV9leF9hY2Nlc3NfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkgICAgICB1MzIgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCSAgICAgIGFjcGlfaW50ZWdlciAqIHZhbHVlLCB1MzIgZnVuY3Rpb24pCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmduX2Rlc2M7Ci0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZ25fZGVzYzsKKwlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2FjY2Vzc19yZWdpb24iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2FjY2Vzc19yZWdpb24iKTsKIAogCS8qCiAJICogRW5zdXJlIHRoYXQgdGhlIHJlZ2lvbiBvcGVyYW5kcyBhcmUgZnVsbHkgZXZhbHVhdGVkIGFuZCB2ZXJpZnkKIAkgKiB0aGUgdmFsaWRpdHkgb2YgdGhlIHJlcXVlc3QKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2V4X3NldHVwX3JlZ2lvbiAob2JqX2Rlc2MsIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V4X3NldHVwX3JlZ2lvbihvYmpfZGVzYywgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtMjQ4LDUwICsyNDEsNTMgQEAKIAkgKi8KIAlyZ25fZGVzYyA9IG9ial9kZXNjLT5jb21tb25fZmllbGQucmVnaW9uX29iajsKIAlhZGRyZXNzID0gcmduX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzICsKLQkJCSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKwotCQkJIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0OworCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKyBmaWVsZF9kYXR1bV9ieXRlX29mZnNldDsKIAogCWlmICgoZnVuY3Rpb24gJiBBQ1BJX0lPX01BU0spID09IEFDUElfUkVBRCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsICJbUkVBRF0iKSk7Ci0JfQotCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsICJbV1JJVEVdIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwgIltSRUFEXSIpKTsKKwl9IGVsc2UgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwgIltXUklURV0iKSk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0JGSUVMRCwKLQkJIiBSZWdpb24gWyVzOiVYXSwgV2lkdGggJVgsIGJ5dGVfYmFzZSAlWCwgT2Zmc2V0ICVYIGF0ICU4LjhYJTguOFhcbiIsCi0JCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZ25fZGVzYy0+cmVnaW9uLnNwYWNlX2lkKSwKLQkJcmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCwKLQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAotCQlmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSkpOworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgICAgICIgUmVnaW9uIFslczolWF0sIFdpZHRoICVYLCBieXRlX2Jhc2UgJVgsIE9mZnNldCAlWCBhdCAlOC44WCU4LjhYXG4iLAorCQkJICAgICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmduX2Rlc2MtPnJlZ2lvbi4KKwkJCQkJCSAgICAgIHNwYWNlX2lkKSwKKwkJCSAgICAgIHJnbl9kZXNjLT5yZWdpb24uc3BhY2VfaWQsCisJCQkgICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAorCQkJICAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAorCQkJICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCQkgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcykpKTsKIAogCS8qIEludm9rZSB0aGUgYXBwcm9wcmlhdGUgYWRkcmVzc19zcGFjZS9vcF9yZWdpb24gaGFuZGxlciAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoIChyZ25fZGVzYywgZnVuY3Rpb24sCi0JCQkgYWRkcmVzcywKLQkJCSBBQ1BJX01VTF84IChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSwgdmFsdWUpOworCXN0YXR1cyA9IGFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaChyZ25fZGVzYywgZnVuY3Rpb24sCisJCQkJCQlhZGRyZXNzLAorCQkJCQkJQUNQSV9NVUxfOChvYmpfZGVzYy0+CisJCQkJCQkJICAgY29tbW9uX2ZpZWxkLgorCQkJCQkJCSAgIGFjY2Vzc19ieXRlX3dpZHRoKSwKKwkJCQkJCXZhbHVlKTsKIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfSU1QTEVNRU5URUQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJSZWdpb24gJXMoJVgpIG5vdCBpbXBsZW1lbnRlZFxuIiwKLQkJCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCksCi0JCQkJcmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCkpOwotCQl9Ci0JCWVsc2UgaWYgKHN0YXR1cyA9PSBBRV9OT1RfRVhJU1QpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJIlJlZ2lvbiAlcyglWCkgaGFzIG5vIGhhbmRsZXJcbiIsCi0JCQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJnbl9kZXNjLT5yZWdpb24uc3BhY2VfaWQpLAotCQkJCXJnbl9kZXNjLT5yZWdpb24uc3BhY2VfaWQpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIlJlZ2lvbiAlcyglWCkgbm90IGltcGxlbWVudGVkXG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJnbl9kZXNjLT4KKwkJCQkJCQkJICByZWdpb24uCisJCQkJCQkJCSAgc3BhY2VfaWQpLAorCQkJCQkgIHJnbl9kZXNjLT5yZWdpb24uc3BhY2VfaWQpKTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgPT0gQUVfTk9UX0VYSVNUKSB7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlJlZ2lvbiAlcyglWCkgaGFzIG5vIGhhbmRsZXJcbiIsCisJCQkJCSAgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJnbl9kZXNjLT4KKwkJCQkJCQkJICAgcmVnaW9uLgorCQkJCQkJCQkgICBzcGFjZV9pZCksCisJCQkJCSAgIHJnbl9kZXNjLT5yZWdpb24uc3BhY2VfaWQpKTsKIAkJfQogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93CkBAIC0zMTAsOSArMzA2LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB1OAotYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSkKK2FjcGlfZXhfcmVnaXN0ZXJfb3ZlcmZsb3codW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgIGFjcGlfaW50ZWdlciB2YWx1ZSkKIHsKIAogCWlmIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggPj0gQUNQSV9JTlRFR0VSX0JJVF9TSVpFKSB7CkBAIC0zMzYsNyArMzMxLDYgQEAKIAlyZXR1cm4gKEZBTFNFKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2ZpZWxkX2RhdHVtX2lvCkBAIC0zNTYsMTggKzM1MCwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2ZpZWxkX2RhdHVtX2lvICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF93cml0ZSkKK2FjcGlfZXhfZmllbGRfZGF0dW1faW8odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCSAgICAgICB1MzIgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCSAgICAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwgdTMyIHJlYWRfd3JpdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBsb2NhbF92YWx1ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9pbnRlZ2VyIGxvY2FsX3ZhbHVlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMiAoImV4X2ZpZWxkX2RhdHVtX2lvIiwgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoImV4X2ZpZWxkX2RhdHVtX2lvIiwgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpOwogCiAJaWYgKHJlYWRfd3JpdGUgPT0gQUNQSV9SRUFEKSB7CiAJCWlmICghdmFsdWUpIHsKQEAgLTM5MiwxNiArMzgyLDE2IEBACiAJICogaW5kZXhfZmllbGQgLSBXcml0ZSB0byBhbiBJbmRleCBSZWdpc3RlciwgdGhlbiByZWFkL3dyaXRlIGZyb20vdG8gYQogCSAqICAgICAgICAgICAgICAgRGF0YSBSZWdpc3RlcgogCSAqLwotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgogCQkvKgogCQkgKiBJZiB0aGUgYnVmZmVyX2ZpZWxkIGFyZ3VtZW50cyBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgZXZhbHVhdGVkLAogCQkgKiBldmFsdWF0ZSB0aGVtIG5vdyBhbmQgc2F2ZSB0aGUgcmVzdWx0cy4KIAkJICovCiAJCWlmICghKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKLQkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMgKG9ial9kZXNjKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzKG9ial9kZXNjKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCQl9CiAKQEAgLTQxMCw0NyArNDAwLDUwIEBACiAJCQkgKiBDb3B5IHRoZSBkYXRhIGZyb20gdGhlIHNvdXJjZSBidWZmZXIuCiAJCQkgKiBMZW5ndGggaXMgdGhlIGZpZWxkIHdpZHRoIGluIGJ5dGVzLgogCQkJICovCi0JCQlBQ1BJX01FTUNQWSAodmFsdWUsCi0JCQkJKG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiktPmJ1ZmZlci5wb2ludGVyICsKLQkJCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICsKLQkJCQkJZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCk7Ci0JCX0KLQkJZWxzZSB7CisJCQlBQ1BJX01FTUNQWSh2YWx1ZSwKKwkJCQkgICAgKG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiktPmJ1ZmZlci4KKwkJCQkgICAgcG9pbnRlciArCisJCQkJICAgIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYmFzZV9ieXRlX29mZnNldCArCisJCQkJICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKTsKKwkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSB0YXJnZXQgYnVmZmVyLgogCQkJICogTGVuZ3RoIGlzIHRoZSBmaWVsZCB3aWR0aCBpbiBieXRlcy4KIAkJCSAqLwotCQkJQUNQSV9NRU1DUFkgKChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopLT5idWZmZXIucG9pbnRlciArCi0JCQkJCW9ial9kZXNjLT5idWZmZXJfZmllbGQuYmFzZV9ieXRlX29mZnNldCArCi0JCQkJCWZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCQkJCQl2YWx1ZSwgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCk7CisJCQlBQ1BJX01FTUNQWSgob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKS0+YnVmZmVyLgorCQkJCSAgICBwb2ludGVyICsKKwkJCQkgICAgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICsKKwkJCQkgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsIHZhbHVlLAorCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKTsKIAkJfQogCiAJCXN0YXR1cyA9IEFFX09LOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAogCQkvKgogCQkgKiBFbnN1cmUgdGhhdCB0aGUgYmFua192YWx1ZSBpcyBub3QgYmV5b25kIHRoZSBjYXBhY2l0eSBvZgogCQkgKiB0aGUgcmVnaXN0ZXIKIAkJICovCi0JCWlmIChhY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93IChvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaiwKLQkJCQkgIChhY3BpX2ludGVnZXIpIG9ial9kZXNjLT5iYW5rX2ZpZWxkLnZhbHVlKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfUkVHSVNURVJfTElNSVQpOworCQlpZiAoYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdyhvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaiwKKwkJCQkJICAgICAgKGFjcGlfaW50ZWdlcikgb2JqX2Rlc2MtPgorCQkJCQkgICAgICBiYW5rX2ZpZWxkLnZhbHVlKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9SRUdJU1RFUl9MSU1JVCk7CiAJCX0KIAogCQkvKgogCQkgKiBGb3IgYmFua19maWVsZHMsIHdlIG11c3Qgd3JpdGUgdGhlIGJhbmtfdmFsdWUgdG8gdGhlIGJhbmtfcmVnaXN0ZXIKIAkJICogKGl0c2VsZiBhIHJlZ2lvbl9maWVsZCkgYmVmb3JlIHdlIGNhbiBhY2Nlc3MgdGhlIGRhdGEuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkIChvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaiwKLQkJCQkgJm9ial9kZXNjLT5iYW5rX2ZpZWxkLnZhbHVlLAotCQkJCSBzaXplb2YgKG9ial9kZXNjLT5iYW5rX2ZpZWxkLnZhbHVlKSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQob2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmosCisJCQkJCSAgICAgICZvYmpfZGVzYy0+YmFua19maWVsZC52YWx1ZSwKKwkJCQkJICAgICAgc2l6ZW9mKG9ial9kZXNjLT5iYW5rX2ZpZWxkLgorCQkJCQkJICAgICB2YWx1ZSkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJLyoKQEAgLTQ2MCw5MCArNDUzLDkyIEBACiAKIAkJLypsaW50IC1mYWxsdGhyb3VnaCAqLwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAJCS8qCiAJCSAqIEZvciBzaW1wbGUgcmVnaW9uX2ZpZWxkcywgd2UganVzdCBkaXJlY3RseSBhY2Nlc3MgdGhlIG93bmluZwogCQkgKiBPcGVyYXRpb24gUmVnaW9uLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9hY2Nlc3NfcmVnaW9uIChvYmpfZGVzYywgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsIHZhbHVlLAotCQkJCSAgcmVhZF93cml0ZSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2FjY2Vzc19yZWdpb24ob2JqX2Rlc2MsIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCQkJCQkgIHZhbHVlLCByZWFkX3dyaXRlKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCi0KIAkJLyoKIAkJICogRW5zdXJlIHRoYXQgdGhlIGluZGV4X3ZhbHVlIGlzIG5vdCBiZXlvbmQgdGhlIGNhcGFjaXR5IG9mCiAJCSAqIHRoZSByZWdpc3RlcgogCQkgKi8KLQkJaWYgKGFjcGlfZXhfcmVnaXN0ZXJfb3ZlcmZsb3cgKG9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmosCi0JCQkJICAoYWNwaV9pbnRlZ2VyKSBvYmpfZGVzYy0+aW5kZXhfZmllbGQudmFsdWUpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9SRUdJU1RFUl9MSU1JVCk7CisJCWlmIChhY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93KG9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmosCisJCQkJCSAgICAgIChhY3BpX2ludGVnZXIpIG9ial9kZXNjLT4KKwkJCQkJICAgICAgaW5kZXhfZmllbGQudmFsdWUpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1JFR0lTVEVSX0xJTUlUKTsKIAkJfQogCiAJCS8qIFdyaXRlIHRoZSBpbmRleCB2YWx1ZSB0byB0aGUgaW5kZXhfcmVnaXN0ZXIgKGl0c2VsZiBhIHJlZ2lvbl9maWVsZCkgKi8KIAogCQlmaWVsZF9kYXR1bV9ieXRlX29mZnNldCArPSBvYmpfZGVzYy0+aW5kZXhfZmllbGQudmFsdWU7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJCSJXcml0ZSB0byBJbmRleCBSZWdpc3RlcjogVmFsdWUgJTguOFhcbiIsCi0JCQkJZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJICAiV3JpdGUgdG8gSW5kZXggUmVnaXN0ZXI6IFZhbHVlICU4LjhYXG4iLAorCQkJCSAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpKTsKIAotCQlzdGF0dXMgPSBhY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkIChvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqLAotCQkJCSAmZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JCQkJIHNpemVvZiAoZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9pbnNlcnRfaW50b19maWVsZChvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqLAorCQkJCQkgICAgICAmZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCQkJCSAgICAgIHNpemVvZihmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJCSJJL08gdG8gRGF0YSBSZWdpc3RlcjogdmFsdWVfcHRyICVwXG4iLAotCQkJCXZhbHVlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCSAgIkkvTyB0byBEYXRhIFJlZ2lzdGVyOiB2YWx1ZV9wdHIgJXBcbiIsCisJCQkJICB2YWx1ZSkpOwogCiAJCWlmIChyZWFkX3dyaXRlID09IEFDUElfUkVBRCkgewogCQkJLyogUmVhZCB0aGUgZGF0dW0gZnJvbSB0aGUgZGF0YV9yZWdpc3RlciAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX2V4X2V4dHJhY3RfZnJvbV9maWVsZCAob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqLAotCQkJCQkgIHZhbHVlLCBzaXplb2YgKGFjcGlfaW50ZWdlcikpOwotCQl9Ci0JCWVsc2UgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X2V4dHJhY3RfZnJvbV9maWVsZChvYmpfZGVzYy0+aW5kZXhfZmllbGQuCisJCQkJCQkgICAgICAgZGF0YV9vYmosIHZhbHVlLAorCQkJCQkJICAgICAgIHNpemVvZihhY3BpX2ludGVnZXIpKTsKKwkJfSBlbHNlIHsKIAkJCS8qIFdyaXRlIHRoZSBkYXR1bSB0byB0aGUgZGF0YV9yZWdpc3RlciAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkIChvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmosCi0JCQkJCSAgdmFsdWUsIHNpemVvZiAoYWNwaV9pbnRlZ2VyKSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLgorCQkJCQkJICAgICAgZGF0YV9vYmosIHZhbHVlLAorCQkJCQkJICAgICAgc2l6ZW9mKGFjcGlfaW50ZWdlcikpOwogCQl9CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoIldyb25nIG9iamVjdCB0eXBlIGluIGZpZWxkIEkvTyAlWFxuIiwKLQkJCUFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJXcm9uZyBvYmplY3QgdHlwZSBpbiBmaWVsZCBJL08gJVhcbiIsCisJCQkJICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlpZiAocmVhZF93cml0ZSA9PSBBQ1BJX1JFQUQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkiVmFsdWUgUmVhZCAlOC44WCU4LjhYLCBXaWR0aCAlZFxuIiwKLQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKCp2YWx1ZSksCi0JCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpOwotCQl9Ci0JCWVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJCSJWYWx1ZSBXcml0dGVuICU4LjhYJTguOFgsIFdpZHRoICVkXG4iLAotCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoKnZhbHVlKSwKLQkJCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCQkJICAiVmFsdWUgUmVhZCAlOC44WCU4LjhYLCBXaWR0aCAlZFxuIiwKKwkJCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoKnZhbHVlKSwKKwkJCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCQkJICAiVmFsdWUgV3JpdHRlbiAlOC44WCU4LjhYLCBXaWR0aCAlZFxuIiwKKwkJCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoKnZhbHVlKSwKKwkJCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSk7CiAJCX0KIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlCkBAIC01NjAsMTkgKzU1NSwxNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBtYXNrLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgZmllbGRfdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkKK2FjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgICAgICBhY3BpX2ludGVnZXIgbWFzaywKKwkJCSAgICAgICBhY3BpX2ludGVnZXIgZmllbGRfdmFsdWUsCisJCQkgICAgICAgdTMyIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBtZXJnZWRfdmFsdWU7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWFjcGlfaW50ZWdlciBtZXJnZWRfdmFsdWU7CisJYWNwaV9pbnRlZ2VyIGN1cnJlbnRfdmFsdWU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgiZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSIsIG1hc2spOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoImV4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUiLCBtYXNrKTsKIAogCS8qIFN0YXJ0IHdpdGggdGhlIG5ldyBiaXRzICAqLwogCkBAIC01ODMsMjIgKzU3NSwyNyBAQAogCWlmIChtYXNrICE9IEFDUElfSU5URUdFUl9NQVgpIHsKIAkJLyogRGVjb2RlIHRoZSB1cGRhdGUgcnVsZSAqLwogCi0JCXN3aXRjaCAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyAmIEFNTF9GSUVMRF9VUERBVEVfUlVMRV9NQVNLKSB7CisJCXN3aXRjaCAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCWZpZWxkX2ZsYWdzICYgQU1MX0ZJRUxEX1VQREFURV9SVUxFX01BU0spIHsKIAkJY2FzZSBBTUxfRklFTERfVVBEQVRFX1BSRVNFUlZFOgogCQkJLyoKIAkJCSAqIENoZWNrIGlmIHVwZGF0ZSBydWxlIG5lZWRzIHRvIGJlIGFwcGxpZWQgKG5vdCBpZiBtYXNrIGlzIGFsbAogCQkJICogb25lcykgIFRoZSBsZWZ0IHNoaWZ0IGRyb3BzIHRoZSBiaXRzIHdlIHdhbnQgdG8gaWdub3JlLgogCQkJICovCi0JCQlpZiAoKH5tYXNrIDw8IChBQ1BJX01VTF84IChzaXplb2YgKG1hc2spKSAtCi0JCQkJCSBBQ1BJX01VTF84IChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSkpICE9IDApIHsKKwkJCWlmICgofm1hc2sgPDwgKEFDUElfTVVMXzgoc2l6ZW9mKG1hc2spKSAtCisJCQkJICAgICAgIEFDUElfTVVMXzgob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpKSkgIT0gMCkgewogCQkJCS8qCiAJCQkJICogUmVhZCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgYnl0ZS93b3JkL2R3b3JkIGNvbnRhaW5pbmcKIAkJCQkgKiB0aGUgZmllbGQsIGFuZCBtZXJnZSB3aXRoIHRoZSBuZXcgZmllbGQgdmFsdWUuCiAJCQkJICovCi0JCQkJc3RhdHVzID0gYWNwaV9leF9maWVsZF9kYXR1bV9pbyAob2JqX2Rlc2MsIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCQkJCQkJICAmY3VycmVudF92YWx1ZSwgQUNQSV9SRUFEKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2V4X2ZpZWxkX2RhdHVtX2lvKG9ial9kZXNjLAorCQkJCQkJCSAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCQkJCQkJCSAgICZjdXJyZW50X3ZhbHVlLAorCQkJCQkJCSAgIEFDUElfUkVBRCk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJCX0KIAogCQkJCW1lcmdlZF92YWx1ZSB8PSAoY3VycmVudF92YWx1ZSAmIH5tYXNrKTsKQEAgLTYyMSwzMCArNjE4LDMxIEBACiAKIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIndyaXRlX3dpdGhfdXBkYXRlX3J1bGU6IFVua25vd24gdXBkYXRlX3J1bGUgc2V0dGluZzogJVhcbiIsCi0JCQkJKG9ial9kZXNjLT5jb21tb25fZmllbGQuZmllbGRfZmxhZ3MgJiBBTUxfRklFTERfVVBEQVRFX1JVTEVfTUFTSykpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVkFMVUUpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAid3JpdGVfd2l0aF91cGRhdGVfcnVsZTogVW5rbm93biB1cGRhdGVfcnVsZSBzZXR0aW5nOiAlWFxuIiwKKwkJCQkJICAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJICAgZmllbGRfZmxhZ3MgJgorCQkJCQkgICBBTUxfRklFTERfVVBEQVRFX1JVTEVfTUFTSykpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9WQUxVRSk7CiAJCX0KIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCSJNYXNrICU4LjhYJTguOFgsIGRhdHVtX29mZnNldCAlWCwgV2lkdGggJVgsIFZhbHVlICU4LjhYJTguOFgsIG1lcmdlZF92YWx1ZSAlOC44WCU4LjhYXG4iLAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKG1hc2spLAotCQlmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKLQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChmaWVsZF92YWx1ZSksCi0JCUFDUElfRk9STUFUX1VJTlQ2NCAobWVyZ2VkX3ZhbHVlKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJICAiTWFzayAlOC44WCU4LjhYLCBkYXR1bV9vZmZzZXQgJVgsIFdpZHRoICVYLCBWYWx1ZSAlOC44WCU4LjhYLCBtZXJnZWRfdmFsdWUgJTguOFglOC44WFxuIiwKKwkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KG1hc2spLAorCQkJICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKKwkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGZpZWxkX3ZhbHVlKSwKKwkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KG1lcmdlZF92YWx1ZSkpKTsKIAogCS8qIFdyaXRlIHRoZSBtZXJnZWQgdmFsdWUgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXhfZmllbGRfZGF0dW1faW8gKG9ial9kZXNjLCBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKLQkJCSAgJm1lcmdlZF92YWx1ZSwgQUNQSV9XUklURSk7CisJc3RhdHVzID0gYWNwaV9leF9maWVsZF9kYXR1bV9pbyhvYmpfZGVzYywgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCQkJCSZtZXJnZWRfdmFsdWUsIEFDUElfV1JJVEUpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZXh0cmFjdF9mcm9tX2ZpZWxkCkBAIC02NjAsNTQgKzY1OCw1NCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZXh0cmFjdF9mcm9tX2ZpZWxkICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoKQorYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICB2b2lkICpidWZmZXIsIHUzMiBidWZmZXJfbGVuZ3RoKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgcmF3X2RhdHVtOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgbWVyZ2VkX2RhdHVtOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfb2Zmc2V0ID0gMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9vZmZzZXQgPSAwOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3RhaWxfYml0czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdHVtX2NvdW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fY291bnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2ludGVnZXIgcmF3X2RhdHVtOworCWFjcGlfaW50ZWdlciBtZXJnZWRfZGF0dW07CisJdTMyIGZpZWxkX29mZnNldCA9IDA7CisJdTMyIGJ1ZmZlcl9vZmZzZXQgPSAwOworCXUzMiBidWZmZXJfdGFpbF9iaXRzOworCXUzMiBkYXR1bV9jb3VudDsKKwl1MzIgZmllbGRfZGF0dW1fY291bnQ7CisJdTMyIGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9leHRyYWN0X2Zyb21fZmllbGQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2V4dHJhY3RfZnJvbV9maWVsZCIpOwogCiAJLyogVmFsaWRhdGUgdGFyZ2V0IGJ1ZmZlciBhbmQgY2xlYXIgaXQgKi8KIAotCWlmIChidWZmZXJfbGVuZ3RoIDwgQUNQSV9ST1VORF9CSVRTX1VQX1RPX0JZVEVTICgKLQkJCSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIkZpZWxkIHNpemUgJVggKGJpdHMpIGlzIHRvbyBsYXJnZSBmb3IgYnVmZmVyICglWClcbiIsCi0JCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsIGJ1ZmZlcl9sZW5ndGgpKTsKKwlpZiAoYnVmZmVyX2xlbmd0aCA8CisJICAgIEFDUElfUk9VTkRfQklUU19VUF9UT19CWVRFUyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiRmllbGQgc2l6ZSAlWCAoYml0cykgaXMgdG9vIGxhcmdlIGZvciBidWZmZXIgKCVYKVxuIiwKKwkJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKKwkJCQkgIGJ1ZmZlcl9sZW5ndGgpKTsKIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JVRkZFUl9PVkVSRkxPVyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CVUZGRVJfT1ZFUkZMT1cpOwogCX0KLQlBQ1BJX01FTVNFVCAoYnVmZmVyLCAwLCBidWZmZXJfbGVuZ3RoKTsKKwlBQ1BJX01FTVNFVChidWZmZXIsIDAsIGJ1ZmZlcl9sZW5ndGgpOwogCiAJLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGRhdHVtcyAoYWNjZXNzIHdpZHRoIGRhdGEgaXRlbXMpICovCiAKLQlkYXR1bV9jb3VudCA9IEFDUElfUk9VTkRfVVBfVE8gKAotCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAotCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoKTsKLQlmaWVsZF9kYXR1bV9jb3VudCA9IEFDUElfUk9VTkRfVVBfVE8gKAotCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoICsKLQkJCSAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKLQkJCSAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCk7CisJZGF0dW1fY291bnQgPSBBQ1BJX1JPVU5EX1VQX1RPKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoKTsKKwlmaWVsZF9kYXR1bV9jb3VudCA9IEFDUElfUk9VTkRfVVBfVE8ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoICsKKwkJCQkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkgICAgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCisJCQkJCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJICAgICBhY2Nlc3NfYml0X3dpZHRoKTsKIAogCS8qIFByaW1pbmcgcmVhZCBmcm9tIHRoZSBmaWVsZCAqLwogCi0Jc3RhdHVzID0gYWNwaV9leF9maWVsZF9kYXR1bV9pbyAob2JqX2Rlc2MsIGZpZWxkX29mZnNldCwgJnJhd19kYXR1bSwgQUNQSV9SRUFEKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V4X2ZpZWxkX2RhdHVtX2lvKG9ial9kZXNjLCBmaWVsZF9vZmZzZXQsICZyYXdfZGF0dW0sCisJCQkJICAgQUNQSV9SRUFEKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQotCW1lcmdlZF9kYXR1bSA9IHJhd19kYXR1bSA+PiBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQ7CisJbWVyZ2VkX2RhdHVtID0KKwkgICAgcmF3X2RhdHVtID4+IG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldDsKIAogCS8qIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkICovCiAKQEAgLTcxNSwxNyArNzEzLDE3IEBACiAJCS8qIEdldCBuZXh0IGlucHV0IGRhdHVtIGZyb20gdGhlIGZpZWxkICovCiAKIAkJZmllbGRfb2Zmc2V0ICs9IG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGg7Ci0JCXN0YXR1cyA9IGFjcGlfZXhfZmllbGRfZGF0dW1faW8gKG9ial9kZXNjLCBmaWVsZF9vZmZzZXQsCi0JCQkJICAmcmF3X2RhdHVtLCBBQ1BJX1JFQUQpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZXhfZmllbGRfZGF0dW1faW8ob2JqX2Rlc2MsIGZpZWxkX29mZnNldCwKKwkJCQkJCSZyYXdfZGF0dW0sIEFDUElfUkVBRCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQkvKiBNZXJnZSB3aXRoIHByZXZpb3VzIGRhdHVtIGlmIG5lY2Vzc2FyeSAqLwogCiAJCW1lcmdlZF9kYXR1bSB8PSByYXdfZGF0dW0gPDwKLQkJCShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggLQotCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CisJCSAgICAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoIC0KKwkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOwogCiAJCWlmIChpID09IGRhdHVtX2NvdW50KSB7CiAJCQlicmVhazsKQEAgLTczMywzMiArNzMxLDMyIEBACiAKIAkJLyogV3JpdGUgbWVyZ2VkIGRhdHVtIHRvIHRhcmdldCBidWZmZXIgKi8KIAotCQlBQ1BJX01FTUNQWSAoKChjaGFyICopIGJ1ZmZlcikgKyBidWZmZXJfb2Zmc2V0LCAmbWVyZ2VkX2RhdHVtLAotCQkJQUNQSV9NSU4ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCQkJIGJ1ZmZlcl9sZW5ndGggLSBidWZmZXJfb2Zmc2V0KSk7CisJCUFDUElfTUVNQ1BZKCgoY2hhciAqKWJ1ZmZlcikgKyBidWZmZXJfb2Zmc2V0LCAmbWVyZ2VkX2RhdHVtLAorCQkJICAgIEFDUElfTUlOKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkJICAgICBidWZmZXJfbGVuZ3RoIC0gYnVmZmVyX29mZnNldCkpOwogCiAJCWJ1ZmZlcl9vZmZzZXQgKz0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aDsKLQkJbWVyZ2VkX2RhdHVtID0gcmF3X2RhdHVtID4+IG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldDsKKwkJbWVyZ2VkX2RhdHVtID0KKwkJICAgIHJhd19kYXR1bSA+PiBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQ7CiAJfQogCiAJLyogTWFzayBvZmYgYW55IGV4dHJhIGJpdHMgaW4gdGhlIGxhc3QgZGF0dW0gKi8KIAogCWJ1ZmZlcl90YWlsX2JpdHMgPSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggJQotCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoOworCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGg7CiAJaWYgKGJ1ZmZlcl90YWlsX2JpdHMpIHsKLQkJbWVyZ2VkX2RhdHVtICY9IEFDUElfTUFTS19CSVRTX0FCT1ZFIChidWZmZXJfdGFpbF9iaXRzKTsKKwkJbWVyZ2VkX2RhdHVtICY9IEFDUElfTUFTS19CSVRTX0FCT1ZFKGJ1ZmZlcl90YWlsX2JpdHMpOwogCX0KIAogCS8qIFdyaXRlIHRoZSBsYXN0IGRhdHVtIHRvIHRoZSBidWZmZXIgKi8KIAotCUFDUElfTUVNQ1BZICgoKGNoYXIgKikgYnVmZmVyKSArIGJ1ZmZlcl9vZmZzZXQsICZtZXJnZWRfZGF0dW0sCi0JCUFDUElfTUlOKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCQkJIGJ1ZmZlcl9sZW5ndGggLSBidWZmZXJfb2Zmc2V0KSk7CisJQUNQSV9NRU1DUFkoKChjaGFyICopYnVmZmVyKSArIGJ1ZmZlcl9vZmZzZXQsICZtZXJnZWRfZGF0dW0sCisJCSAgICBBQ1BJX01JTihvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAorCQkJICAgICBidWZmZXJfbGVuZ3RoIC0gYnVmZmVyX29mZnNldCkpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkCkBAIC03NzQsNTMgKzc3Miw1NCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgpCithY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICB2b2lkICpidWZmZXIsIHUzMiBidWZmZXJfbGVuZ3RoKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgbWFzazsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIG1lcmdlZF9kYXR1bTsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHJhd19kYXR1bSA9IDA7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9vZmZzZXQgPSAwOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX29mZnNldCA9IDA7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfdGFpbF9iaXRzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1fY291bnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9jb3VudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaW50ZWdlciBtYXNrOworCWFjcGlfaW50ZWdlciBtZXJnZWRfZGF0dW07CisJYWNwaV9pbnRlZ2VyIHJhd19kYXR1bSA9IDA7CisJdTMyIGZpZWxkX29mZnNldCA9IDA7CisJdTMyIGJ1ZmZlcl9vZmZzZXQgPSAwOworCXUzMiBidWZmZXJfdGFpbF9iaXRzOworCXUzMiBkYXR1bV9jb3VudDsKKwl1MzIgZmllbGRfZGF0dW1fY291bnQ7CisJdTMyIGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9pbnNlcnRfaW50b19maWVsZCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfaW5zZXJ0X2ludG9fZmllbGQiKTsKIAogCS8qIFZhbGlkYXRlIGlucHV0IGJ1ZmZlciAqLwogCi0JaWYgKGJ1ZmZlcl9sZW5ndGggPCBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMgKAotCQkJIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiRmllbGQgc2l6ZSAlWCAoYml0cykgaXMgdG9vIGxhcmdlIGZvciBidWZmZXIgKCVYKVxuIiwKLQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwgYnVmZmVyX2xlbmd0aCkpOworCWlmIChidWZmZXJfbGVuZ3RoIDwKKwkgICAgQUNQSV9ST1VORF9CSVRTX1VQX1RPX0JZVEVTKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJGaWVsZCBzaXplICVYIChiaXRzKSBpcyB0b28gbGFyZ2UgZm9yIGJ1ZmZlciAoJVgpXG4iLAorCQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAorCQkJCSAgYnVmZmVyX2xlbmd0aCkpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQlVGRkVSX09WRVJGTE9XKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JVRkZFUl9PVkVSRkxPVyk7CiAJfQogCiAJLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGRhdHVtcyAoYWNjZXNzIHdpZHRoIGRhdGEgaXRlbXMpICovCiAKLQltYXNrID0gQUNQSV9NQVNLX0JJVFNfQkVMT1cgKG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7Ci0JZGF0dW1fY291bnQgPSBBQ1BJX1JPVU5EX1VQX1RPIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCi0JCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCk7Ci0JZmllbGRfZGF0dW1fY291bnQgPSBBQ1BJX1JPVU5EX1VQX1RPIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggKwotCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAotCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoKTsKKwltYXNrID0KKwkgICAgQUNQSV9NQVNLX0JJVFNfQkVMT1cob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwlkYXR1bV9jb3VudCA9CisJICAgIEFDUElfUk9VTkRfVVBfVE8ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAorCQkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGgpOworCWZpZWxkX2RhdHVtX2NvdW50ID0KKwkgICAgQUNQSV9ST1VORF9VUF9UTyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggKworCQkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCisJCQkgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCk7CiAKIAkvKiBHZXQgaW5pdGlhbCBEYXR1bSBmcm9tIHRoZSBpbnB1dCBidWZmZXIgKi8KIAotCUFDUElfTUVNQ1BZICgmcmF3X2RhdHVtLCBidWZmZXIsCi0JCUFDUElfTUlOKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCQkJIGJ1ZmZlcl9sZW5ndGggLSBidWZmZXJfb2Zmc2V0KSk7CisJQUNQSV9NRU1DUFkoJnJhd19kYXR1bSwgYnVmZmVyLAorCQkgICAgQUNQSV9NSU4ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKKwkJCSAgICAgYnVmZmVyX2xlbmd0aCAtIGJ1ZmZlcl9vZmZzZXQpKTsKIAotCW1lcmdlZF9kYXR1bSA9IHJhd19kYXR1bSA8PCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQ7CisJbWVyZ2VkX2RhdHVtID0KKwkgICAgcmF3X2RhdHVtIDw8IG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldDsKIAogCS8qIFdyaXRlIHRoZSBlbnRpcmUgZmllbGQgKi8KIApAQCAtODI4LDE4ICs4MjcsMTkgQEAKIAkJLyogV3JpdGUgbWVyZ2VkIGRhdHVtIHRvIHRoZSB0YXJnZXQgZmllbGQgKi8KIAogCQltZXJnZWRfZGF0dW0gJj0gbWFzazsKLQkJc3RhdHVzID0gYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlIChvYmpfZGVzYywgbWFzaywKLQkJCQkgbWVyZ2VkX2RhdHVtLCBmaWVsZF9vZmZzZXQpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZShvYmpfZGVzYywgbWFzaywKKwkJCQkJCQltZXJnZWRfZGF0dW0sCisJCQkJCQkJZmllbGRfb2Zmc2V0KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qIFN0YXJ0IG5ldyBvdXRwdXQgZGF0dW0gYnkgbWVyZ2luZyB3aXRoIHByZXZpb3VzIGlucHV0IGRhdHVtICovCiAKIAkJZmllbGRfb2Zmc2V0ICs9IG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGg7CiAJCW1lcmdlZF9kYXR1bSA9IHJhd19kYXR1bSA+PgotCQkJKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCAtCi0JCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwkJICAgIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggLQorCQkgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CiAJCW1hc2sgPSBBQ1BJX0lOVEVHRVJfTUFYOwogCiAJCWlmIChpID09IGRhdHVtX2NvdW50KSB7CkBAIC04NDksMjggKzg0OSwyOCBAQAogCQkvKiBHZXQgdGhlIG5leHQgaW5wdXQgZGF0dW0gZnJvbSB0aGUgYnVmZmVyICovCiAKIAkJYnVmZmVyX29mZnNldCArPSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoOwotCQlBQ1BJX01FTUNQWSAoJnJhd19kYXR1bSwgKChjaGFyICopIGJ1ZmZlcikgKyBidWZmZXJfb2Zmc2V0LAotCQkJQUNQSV9NSU4ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCQkJIGJ1ZmZlcl9sZW5ndGggLSBidWZmZXJfb2Zmc2V0KSk7Ci0JCW1lcmdlZF9kYXR1bSB8PSByYXdfZGF0dW0gPDwgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0OworCQlBQ1BJX01FTUNQWSgmcmF3X2RhdHVtLCAoKGNoYXIgKilidWZmZXIpICsgYnVmZmVyX29mZnNldCwKKwkJCSAgICBBQ1BJX01JTihvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAorCQkJCSAgICAgYnVmZmVyX2xlbmd0aCAtIGJ1ZmZlcl9vZmZzZXQpKTsKKwkJbWVyZ2VkX2RhdHVtIHw9CisJCSAgICByYXdfZGF0dW0gPDwgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0OwogCX0KIAogCS8qIE1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIHRoZSBsYXN0IGRhdHVtICovCiAKIAlidWZmZXJfdGFpbF9iaXRzID0gKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCArCi0JCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpICUKLQkJCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGg7CisJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KSAlCisJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aDsKIAlpZiAoYnVmZmVyX3RhaWxfYml0cykgewotCQltYXNrICY9IEFDUElfTUFTS19CSVRTX0FCT1ZFIChidWZmZXJfdGFpbF9iaXRzKTsKKwkJbWFzayAmPSBBQ1BJX01BU0tfQklUU19BQk9WRShidWZmZXJfdGFpbF9iaXRzKTsKIAl9CiAKIAkvKiBXcml0ZSB0aGUgbGFzdCBkYXR1bSB0byB0aGUgZmllbGQgKi8KIAogCW1lcmdlZF9kYXR1bSAmPSBtYXNrOwotCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSAob2JqX2Rlc2MsCi0JCQkgbWFzaywgbWVyZ2VkX2RhdHVtLCBmaWVsZF9vZmZzZXQpOworCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZShvYmpfZGVzYywKKwkJCQkJCW1hc2ssIG1lcmdlZF9kYXR1bSwKKwkJCQkJCWZpZWxkX29mZnNldCk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jCmluZGV4IDAyMmYyODEuLmEzZjRkNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtaXNjLmMKQEAgLTQyLDE1ICs0MiwxMiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhtaXNjIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiZXhtaXNjIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02NiwyNyArNjMsMjMgQEAKICAqICAgICAgICAgICAgICBDb21tb24gY29kZSBmb3IgdGhlIHJlZl9vZl9vcCBhbmQgdGhlIGNvbmRfcmVmX29mX29wLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2dldF9vYmplY3RfcmVmZXJlbmNlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmV0dXJuX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXR1cm5fZGVzYywKKwkJCSAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZWZlcmVuY2Vfb2JqOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZmVyZW5jZWRfb2JqOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZmVyZW5jZV9vYmo7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVmZXJlbmNlZF9vYmo7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UiLCBvYmpfZGVzYyk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UiLCBvYmpfZGVzYyk7CiAKIAkqcmV0dXJuX2Rlc2MgPSBOVUxMOwogCi0Jc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSkgewogCWNhc2UgQUNQSV9ERVNDX1RZUEVfT1BFUkFORDoKIAotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCiAJCS8qCkBAIC0xMDQsMTMgKzk3LDExIEBACiAKIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiVW5rbm93biBSZWZlcmVuY2Ugb3Bjb2RlIGluIGdldF9yZWZlcmVuY2UgJVhcbiIsCi0JCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5rbm93biBSZWZlcmVuY2Ugb3Bjb2RlIGluIGdldF9yZWZlcmVuY2UgJVhcbiIsIG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDoKIAogCQkvKgpAQCAtMTE5LDM0ICsxMTAsMzIgQEAKIAkJcmVmZXJlbmNlZF9vYmogPSBvYmpfZGVzYzsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW52YWxpZCBkZXNjcmlwdG9yIHR5cGUgaW4gZ2V0X3JlZmVyZW5jZTogJVhcbiIsCi0JCQkJQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9UWVBFKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIGRlc2NyaXB0b3IgdHlwZSBpbiBnZXRfcmVmZXJlbmNlOiAlWFxuIiwgQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiAJfQogCi0KIAkvKiBDcmVhdGUgYSBuZXcgcmVmZXJlbmNlIG9iamVjdCAqLwogCi0JcmVmZXJlbmNlX29iaiA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSk7CisJcmVmZXJlbmNlX29iaiA9CisJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKTsKIAlpZiAoIXJlZmVyZW5jZV9vYmopIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAlyZWZlcmVuY2Vfb2JqLT5yZWZlcmVuY2Uub3Bjb2RlID0gQU1MX1JFRl9PRl9PUDsKIAlyZWZlcmVuY2Vfb2JqLT5yZWZlcmVuY2Uub2JqZWN0ID0gcmVmZXJlbmNlZF9vYmo7CiAJKnJldHVybl9kZXNjID0gcmVmZXJlbmNlX29iajsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCSJPYmplY3QgJXAgVHlwZSBbJXNdLCByZXR1cm5pbmcgUmVmZXJlbmNlICVwXG4iLAotCQlvYmpfZGVzYywgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpLCAqcmV0dXJuX2Rlc2MpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkgICJPYmplY3QgJXAgVHlwZSBbJXNdLCByZXR1cm5pbmcgUmVmZXJlbmNlICVwXG4iLAorCQkJICBvYmpfZGVzYywgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShvYmpfZGVzYyksCisJCQkgICpyZXR1cm5fZGVzYykpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZQpAQCAtMTYzLDYzICsxNTIsNTggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb3BlcmFuZDAsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb3BlcmFuZDEsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmFjdHVhbF9yZXR1cm5fZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9leF9jb25jYXRfdGVtcGxhdGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZDAsCisJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMSwKKwkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCisJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5ld19idWY7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZW5kX3RhZzE7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZW5kX3RhZzI7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgxOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoMjsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKKwl1OCAqbmV3X2J1ZjsKKwl1OCAqZW5kX3RhZzE7CisJdTggKmVuZF90YWcyOworCWFjcGlfc2l6ZSBsZW5ndGgxOworCWFjcGlfc2l6ZSBsZW5ndGgyOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfY29uY2F0X3RlbXBsYXRlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9jb25jYXRfdGVtcGxhdGUiKTsKIAogCS8qIEZpbmQgdGhlIGVuZF90YWdzIGluIGVhY2ggcmVzb3VyY2UgdGVtcGxhdGUgKi8KIAotCWVuZF90YWcxID0gYWNwaV91dF9nZXRfcmVzb3VyY2VfZW5kX3RhZyAob3BlcmFuZDApOwotCWVuZF90YWcyID0gYWNwaV91dF9nZXRfcmVzb3VyY2VfZW5kX3RhZyAob3BlcmFuZDEpOworCWVuZF90YWcxID0gYWNwaV91dF9nZXRfcmVzb3VyY2VfZW5kX3RhZyhvcGVyYW5kMCk7CisJZW5kX3RhZzIgPSBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnKG9wZXJhbmQxKTsKIAlpZiAoIWVuZF90YWcxIHx8ICFlbmRfdGFnMikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJfQogCiAJLyogQ29tcHV0ZSB0aGUgbGVuZ3RoIG9mIGVhY2ggcGFydCAqLwogCi0JbGVuZ3RoMSA9IEFDUElfUFRSX0RJRkYgKGVuZF90YWcxLCBvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIpOwotCWxlbmd0aDIgPSBBQ1BJX1BUUl9ESUZGIChlbmRfdGFnMiwgb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyKSArCi0JCQkgIDI7IC8qIFNpemUgb2YgRU5EX1RBRyAqLworCWxlbmd0aDEgPSBBQ1BJX1BUUl9ESUZGKGVuZF90YWcxLCBvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIpOworCWxlbmd0aDIgPSBBQ1BJX1BUUl9ESUZGKGVuZF90YWcyLCBvcGVyYW5kMS0+YnVmZmVyLnBvaW50ZXIpICsgMjsJLyogU2l6ZSBvZiBFTkRfVEFHICovCiAKIAkvKiBDcmVhdGUgYSBuZXcgYnVmZmVyIG9iamVjdCBmb3IgdGhlIHJlc3VsdCAqLwogCi0JcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0IChsZW5ndGgxICsgbGVuZ3RoMik7CisJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KGxlbmd0aDEgKyBsZW5ndGgyKTsKIAlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogQ29weSB0aGUgdGVtcGxhdGVzIHRvIHRoZSBuZXcgZGVzY3JpcHRvciAqLwogCiAJbmV3X2J1ZiA9IHJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlcjsKLQlBQ1BJX01FTUNQWSAobmV3X2J1Ziwgb3BlcmFuZDAtPmJ1ZmZlci5wb2ludGVyLCBsZW5ndGgxKTsKLQlBQ1BJX01FTUNQWSAobmV3X2J1ZiArIGxlbmd0aDEsIG9wZXJhbmQxLT5idWZmZXIucG9pbnRlciwgbGVuZ3RoMik7CisJQUNQSV9NRU1DUFkobmV3X2J1Ziwgb3BlcmFuZDAtPmJ1ZmZlci5wb2ludGVyLCBsZW5ndGgxKTsKKwlBQ1BJX01FTUNQWShuZXdfYnVmICsgbGVuZ3RoMSwgb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyLCBsZW5ndGgyKTsKIAogCS8qIENvbXB1dGUgdGhlIG5ldyBjaGVja3N1bSAqLwogCiAJbmV3X2J1ZltyZXR1cm5fZGVzYy0+YnVmZmVyLmxlbmd0aCAtIDFdID0KLQkJCWFjcGlfdXRfZ2VuZXJhdGVfY2hlY2tzdW0gKHJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlciwKLQkJCQkJICAgKHJldHVybl9kZXNjLT5idWZmZXIubGVuZ3RoIC0gMSkpOworCSAgICBhY3BpX3V0X2dlbmVyYXRlX2NoZWNrc3VtKHJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkgICAgICAocmV0dXJuX2Rlc2MtPmJ1ZmZlci5sZW5ndGggLSAxKSk7CiAKIAkvKiBSZXR1cm4gdGhlIGNvbXBsZXRlZCB0ZW1wbGF0ZSBkZXNjcmlwdG9yICovCiAKIAkqYWN0dWFsX3JldHVybl9kZXNjID0gcmV0dXJuX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RvX2NvbmNhdGVuYXRlCkBAIC0yMzYsMjEgKzIyMCwxOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZG9fY29uY2F0ZW5hdGUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9wZXJhbmQwLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9wZXJhbmQxLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZXhfZG9fY29uY2F0ZW5hdGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZDAsCisJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMSwKKwkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmxvY2FsX29wZXJhbmQxID0gb3BlcmFuZDE7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2M7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmV3X2J1ZjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIG5ld19sZW5ndGg7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbG9jYWxfb3BlcmFuZDEgPSBvcGVyYW5kMTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKKwljaGFyICpuZXdfYnVmOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3NpemUgbmV3X2xlbmd0aDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2RvX2NvbmNhdGVuYXRlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9kb19jb25jYXRlbmF0ZSIpOwogCiAJLyoKIAkgKiBDb252ZXJ0IHRoZSBzZWNvbmQgb3BlcmFuZCBpZiBuZWNlc3NhcnkuICBUaGUgZmlyc3Qgb3BlcmFuZApAQCAtMjU5LDI3ICsyNDAsMjggQEAKIAkgKiBndWFyYW50ZWVkIHRvIGJlIGVpdGhlciBJbnRlZ2VyL1N0cmluZy9CdWZmZXIgYnkgdGhlIG9wZXJhbmQKIAkgKiByZXNvbHV0aW9uIG1lY2hhbmlzbS4KIAkgKi8KLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvcGVyYW5kMCkpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9wZXJhbmQwKSkgewogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0JCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyIChvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxLCAxNik7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcihvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxLCAxNik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nIChvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxLAotCQkJCSBBQ1BJX0lNUExJQ0lUX0NPTlZFUlRfSEVYKTsKKwkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyhvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxLAorCQkJCQkJICAgQUNQSV9JTVBMSUNJVF9DT05WRVJUX0hFWCk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyIChvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxKTsKKwkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcihvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb25jYXQgLSBpbnZhbGlkIG9iaiB0eXBlOiAlWFxuIiwKLQkJCQlBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob3BlcmFuZDApKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ29uY2F0IC0gaW52YWxpZCBvYmogdHlwZTogJVhcbiIsCisJCQkJICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZDApKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKIAl9CiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKQEAgLTI5NiwzMiArMjc4LDMzIEBACiAJICogMikgVHdvIFN0cmluZ3MgY29uY2F0ZW5hdGVkIHRvIHByb2R1Y2UgYSBuZXcgU3RyaW5nCiAJICogMykgVHdvIEJ1ZmZlcnMgY29uY2F0ZW5hdGVkIHRvIHByb2R1Y2UgYSBuZXcgQnVmZmVyCiAJICovCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob3BlcmFuZDApKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kMCkpIHsKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCiAJCS8qIFJlc3VsdCBvZiB0d28gSW50ZWdlcnMgaXMgYSBCdWZmZXIgKi8KIAkJLyogTmVlZCBlbm91Z2ggYnVmZmVyIHNwYWNlIGZvciB0d28gaW50ZWdlcnMgKi8KIAotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QgKAotCQkJCSAgIEFDUElfTVVMXzIgKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCkpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgICBBQ1BJX01VTF8yCisJCQkJCQkJICAgKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCkpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAotCQluZXdfYnVmID0gKGNoYXIgKikgcmV0dXJuX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOworCQluZXdfYnVmID0gKGNoYXIgKilyZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7CiAKIAkJLyogQ29weSB0aGUgZmlyc3QgaW50ZWdlciwgTFNCIGZpcnN0ICovCiAKLQkJQUNQSV9NRU1DUFkgKG5ld19idWYsCi0JCQkJICAmb3BlcmFuZDAtPmludGVnZXIudmFsdWUsCi0JCQkJICBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpOworCQlBQ1BJX01FTUNQWShuZXdfYnVmLAorCQkJICAgICZvcGVyYW5kMC0+aW50ZWdlci52YWx1ZSwKKwkJCSAgICBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpOwogCiAJCS8qIENvcHkgdGhlIHNlY29uZCBpbnRlZ2VyIChMU0IgZmlyc3QpIGFmdGVyIHRoZSBmaXJzdCAqLwogCi0JCUFDUElfTUVNQ1BZIChuZXdfYnVmICsgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoLAotCQkJCSAgJmxvY2FsX29wZXJhbmQxLT5pbnRlZ2VyLnZhbHVlLAotCQkJCSAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKKwkJQUNQSV9NRU1DUFkobmV3X2J1ZiArIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCwKKwkJCSAgICAmbG9jYWxfb3BlcmFuZDEtPmludGVnZXIudmFsdWUsCisJCQkgICAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6CkBAIC0zMjksMTMgKzMxMiwxMyBAQAogCQkvKiBSZXN1bHQgb2YgdHdvIFN0cmluZ3MgaXMgYSBTdHJpbmcgKi8KIAogCQluZXdfbGVuZ3RoID0gKGFjcGlfc2l6ZSkgb3BlcmFuZDAtPnN0cmluZy5sZW5ndGggKwotCQkJCSAoYWNwaV9zaXplKSBsb2NhbF9vcGVyYW5kMS0+c3RyaW5nLmxlbmd0aDsKKwkJICAgIChhY3BpX3NpemUpIGxvY2FsX29wZXJhbmQxLT5zdHJpbmcubGVuZ3RoOwogCQlpZiAobmV3X2xlbmd0aCA+IEFDUElfTUFYX1NUUklOR19DT05WRVJTSU9OKSB7CiAJCQlzdGF0dXMgPSBBRV9BTUxfU1RSSU5HX0xJTUlUOwogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0IChuZXdfbGVuZ3RoKTsKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0KG5ld19sZW5ndGgpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC0zNDUsNTYgKzMyOCw1NiBAQAogCiAJCS8qIENvbmNhdGVuYXRlIHRoZSBzdHJpbmdzICovCiAKLQkJQUNQSV9TVFJDUFkgKG5ld19idWYsCi0JCQkJICBvcGVyYW5kMC0+c3RyaW5nLnBvaW50ZXIpOwotCQlBQ1BJX1NUUkNQWSAobmV3X2J1ZiArIG9wZXJhbmQwLT5zdHJpbmcubGVuZ3RoLAotCQkJCSAgbG9jYWxfb3BlcmFuZDEtPnN0cmluZy5wb2ludGVyKTsKKwkJQUNQSV9TVFJDUFkobmV3X2J1Ziwgb3BlcmFuZDAtPnN0cmluZy5wb2ludGVyKTsKKwkJQUNQSV9TVFJDUFkobmV3X2J1ZiArIG9wZXJhbmQwLT5zdHJpbmcubGVuZ3RoLAorCQkJICAgIGxvY2FsX29wZXJhbmQxLT5zdHJpbmcucG9pbnRlcik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCiAJCS8qIFJlc3VsdCBvZiB0d28gQnVmZmVycyBpcyBhIEJ1ZmZlciAqLwogCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCAoCi0JCQkJICAgKGFjcGlfc2l6ZSkgb3BlcmFuZDAtPmJ1ZmZlci5sZW5ndGggKwotCQkJCSAgIChhY3BpX3NpemUpIGxvY2FsX29wZXJhbmQxLT5idWZmZXIubGVuZ3RoKTsKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KChhY3BpX3NpemUpCisJCQkJCQkJICAgb3BlcmFuZDAtPmJ1ZmZlci4KKwkJCQkJCQkgICBsZW5ndGggKworCQkJCQkJCSAgIChhY3BpX3NpemUpCisJCQkJCQkJICAgbG9jYWxfb3BlcmFuZDEtPgorCQkJCQkJCSAgIGJ1ZmZlci5sZW5ndGgpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAotCQluZXdfYnVmID0gKGNoYXIgKikgcmV0dXJuX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOworCQluZXdfYnVmID0gKGNoYXIgKilyZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7CiAKIAkJLyogQ29uY2F0ZW5hdGUgdGhlIGJ1ZmZlcnMgKi8KIAotCQlBQ1BJX01FTUNQWSAobmV3X2J1ZiwKLQkJCQkgIG9wZXJhbmQwLT5idWZmZXIucG9pbnRlciwKLQkJCQkgIG9wZXJhbmQwLT5idWZmZXIubGVuZ3RoKTsKLQkJQUNQSV9NRU1DUFkgKG5ld19idWYgKyBvcGVyYW5kMC0+YnVmZmVyLmxlbmd0aCwKLQkJCQkgIGxvY2FsX29wZXJhbmQxLT5idWZmZXIucG9pbnRlciwKLQkJCQkgIGxvY2FsX29wZXJhbmQxLT5idWZmZXIubGVuZ3RoKTsKKwkJQUNQSV9NRU1DUFkobmV3X2J1ZiwKKwkJCSAgICBvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsIG9wZXJhbmQwLT5idWZmZXIubGVuZ3RoKTsKKwkJQUNQSV9NRU1DUFkobmV3X2J1ZiArIG9wZXJhbmQwLT5idWZmZXIubGVuZ3RoLAorCQkJICAgIGxvY2FsX29wZXJhbmQxLT5idWZmZXIucG9pbnRlciwKKwkJCSAgICBsb2NhbF9vcGVyYW5kMS0+YnVmZmVyLmxlbmd0aCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAogCQkvKiBJbnZhbGlkIG9iamVjdCB0eXBlLCBzaG91bGQgbm90IGhhcHBlbiBoZXJlICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ29uY2F0ZW5hdGUgLSBJbnZhbGlkIG9iamVjdCB0eXBlOiAlWFxuIiwKLQkJCQlBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob3BlcmFuZDApKSk7Ci0JCXN0YXR1cyA9QUVfQU1MX0lOVEVSTkFMOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvbmNhdGVuYXRlIC0gSW52YWxpZCBvYmplY3QgdHlwZTogJVhcbiIsCisJCQkJICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZDApKSk7CisJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCSphY3R1YWxfcmV0dXJuX2Rlc2MgPSByZXR1cm5fZGVzYzsKIAotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAJaWYgKGxvY2FsX29wZXJhbmQxICE9IG9wZXJhbmQxKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAobG9jYWxfb3BlcmFuZDEpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UobG9jYWxfb3BlcmFuZDEpOwogCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kb19tYXRoX29wCkBAIC00MTIsNjIgKzM5NSw0OSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9pbnRlZ2VyCi1hY3BpX2V4X2RvX21hdGhfb3AgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjAsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyMSkKK2FjcGlfZXhfZG9fbWF0aF9vcCh1MTYgb3Bjb2RlLCBhY3BpX2ludGVnZXIgaW50ZWdlcjAsIGFjcGlfaW50ZWdlciBpbnRlZ2VyMSkKIHsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAlzd2l0Y2ggKG9wY29kZSkgewotCWNhc2UgQU1MX0FERF9PUDogICAgICAgICAgICAgICAgLyogQWRkIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KKwljYXNlIEFNTF9BRERfT1A6CS8qIEFkZCAoSW50ZWdlcjAsIEludGVnZXIxLCBSZXN1bHQpICovCiAKIAkJcmV0dXJuIChpbnRlZ2VyMCArIGludGVnZXIxKTsKIAotCi0JY2FzZSBBTUxfQklUX0FORF9PUDogICAgICAgICAgICAvKiBBbmQgKEludGVnZXIwLCBJbnRlZ2VyMSwgUmVzdWx0KSAqLworCWNhc2UgQU1MX0JJVF9BTkRfT1A6CS8qIEFuZCAoSW50ZWdlcjAsIEludGVnZXIxLCBSZXN1bHQpICovCiAKIAkJcmV0dXJuIChpbnRlZ2VyMCAmIGludGVnZXIxKTsKIAotCi0JY2FzZSBBTUxfQklUX05BTkRfT1A6ICAgICAgICAgICAvKiBOQW5kIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KKwljYXNlIEFNTF9CSVRfTkFORF9PUDoJLyogTkFuZCAoSW50ZWdlcjAsIEludGVnZXIxLCBSZXN1bHQpICovCiAKIAkJcmV0dXJuICh+KGludGVnZXIwICYgaW50ZWdlcjEpKTsKIAotCi0JY2FzZSBBTUxfQklUX09SX09QOiAgICAgICAgICAgICAvKiBPciAoSW50ZWdlcjAsIEludGVnZXIxLCBSZXN1bHQpICovCisJY2FzZSBBTUxfQklUX09SX09QOgkvKiBPciAoSW50ZWdlcjAsIEludGVnZXIxLCBSZXN1bHQpICovCiAKIAkJcmV0dXJuIChpbnRlZ2VyMCB8IGludGVnZXIxKTsKIAotCi0JY2FzZSBBTUxfQklUX05PUl9PUDogICAgICAgICAgICAvKiBOT3IgKEludGVnZXIwLCBJbnRlZ2VyMSwgUmVzdWx0KSAqLworCWNhc2UgQU1MX0JJVF9OT1JfT1A6CS8qIE5PciAoSW50ZWdlcjAsIEludGVnZXIxLCBSZXN1bHQpICovCiAKIAkJcmV0dXJuICh+KGludGVnZXIwIHwgaW50ZWdlcjEpKTsKIAotCi0JY2FzZSBBTUxfQklUX1hPUl9PUDogICAgICAgICAgICAvKiBYT3IgKEludGVnZXIwLCBJbnRlZ2VyMSwgUmVzdWx0KSAqLworCWNhc2UgQU1MX0JJVF9YT1JfT1A6CS8qIFhPciAoSW50ZWdlcjAsIEludGVnZXIxLCBSZXN1bHQpICovCiAKIAkJcmV0dXJuIChpbnRlZ2VyMCBeIGludGVnZXIxKTsKIAotCi0JY2FzZSBBTUxfTVVMVElQTFlfT1A6ICAgICAgICAgICAvKiBNdWx0aXBseSAoSW50ZWdlcjAsIEludGVnZXIxLCBSZXN1bHQpICovCisJY2FzZSBBTUxfTVVMVElQTFlfT1A6CS8qIE11bHRpcGx5IChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KIAogCQlyZXR1cm4gKGludGVnZXIwICogaW50ZWdlcjEpOwogCi0KLQljYXNlIEFNTF9TSElGVF9MRUZUX09QOiAgICAgICAgIC8qIHNoaWZ0X2xlZnQgKE9wZXJhbmQsIHNoaWZ0X2NvdW50LCBSZXN1bHQpKi8KKwljYXNlIEFNTF9TSElGVF9MRUZUX09QOgkvKiBzaGlmdF9sZWZ0IChPcGVyYW5kLCBzaGlmdF9jb3VudCwgUmVzdWx0KSAqLwogCiAJCXJldHVybiAoaW50ZWdlcjAgPDwgaW50ZWdlcjEpOwogCi0KLQljYXNlIEFNTF9TSElGVF9SSUdIVF9PUDogICAgICAgIC8qIHNoaWZ0X3JpZ2h0IChPcGVyYW5kLCBzaGlmdF9jb3VudCwgUmVzdWx0KSAqLworCWNhc2UgQU1MX1NISUZUX1JJR0hUX09QOgkvKiBzaGlmdF9yaWdodCAoT3BlcmFuZCwgc2hpZnRfY291bnQsIFJlc3VsdCkgKi8KIAogCQlyZXR1cm4gKGludGVnZXIwID4+IGludGVnZXIxKTsKIAotCi0JY2FzZSBBTUxfU1VCVFJBQ1RfT1A6ICAgICAgICAgICAvKiBTdWJ0cmFjdCAoSW50ZWdlcjAsIEludGVnZXIxLCBSZXN1bHQpICovCisJY2FzZSBBTUxfU1VCVFJBQ1RfT1A6CS8qIFN1YnRyYWN0IChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KIAogCQlyZXR1cm4gKGludGVnZXIwIC0gaW50ZWdlcjEpOwogCkBAIC00NzcsNyArNDQ3LDYgQEAKIAl9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kb19sb2dpY2FsX251bWVyaWNfb3AKQEAgLTQ5OSwyOCArNDY4LDI0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9kb19sb2dpY2FsX251bWVyaWNfb3AgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjAsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyMSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2dpY2FsX3Jlc3VsdCkKK2FjcGlfZXhfZG9fbG9naWNhbF9udW1lcmljX29wKHUxNiBvcGNvZGUsCisJCQkgICAgICBhY3BpX2ludGVnZXIgaW50ZWdlcjAsCisJCQkgICAgICBhY3BpX2ludGVnZXIgaW50ZWdlcjEsIHU4ICogbG9naWNhbF9yZXN1bHQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3Jlc3VsdCA9IEZBTFNFOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXU4IGxvY2FsX3Jlc3VsdCA9IEZBTFNFOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfZG9fbG9naWNhbF9udW1lcmljX29wIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9kb19sb2dpY2FsX251bWVyaWNfb3AiKTsKIAogCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBBTUxfTEFORF9PUDogICAgICAgICAgICAgICAvKiBMQW5kIChJbnRlZ2VyMCwgSW50ZWdlcjEpICovCisJY2FzZSBBTUxfTEFORF9PUDoJLyogTEFuZCAoSW50ZWdlcjAsIEludGVnZXIxKSAqLwogCiAJCWlmIChpbnRlZ2VyMCAmJiBpbnRlZ2VyMSkgewogCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKIAkJfQogCQlicmVhazsKIAotCWNhc2UgQU1MX0xPUl9PUDogICAgICAgICAgICAgICAgLyogTE9yIChJbnRlZ2VyMCwgSW50ZWdlcjEpICovCisJY2FzZSBBTUxfTE9SX09QOgkvKiBMT3IgKEludGVnZXIwLCBJbnRlZ2VyMSkgKi8KIAogCQlpZiAoaW50ZWdlcjAgfHwgaW50ZWdlcjEpIHsKIAkJCWxvY2FsX3Jlc3VsdCA9IFRSVUU7CkBAIC01MzUsMTAgKzUwMCw5IEBACiAJLyogUmV0dXJuIHRoZSBsb2dpY2FsIHJlc3VsdCBhbmQgc3RhdHVzICovCiAKIAkqbG9naWNhbF9yZXN1bHQgPSBsb2NhbF9yZXN1bHQ7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZG9fbG9naWNhbF9vcApAQCAtNTY2LDI0ICs1MzAsMjAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2RvX2xvZ2ljYWxfb3AgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9wZXJhbmQwLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9wZXJhbmQxLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvZ2ljYWxfcmVzdWx0KQorYWNwaV9leF9kb19sb2dpY2FsX29wKHUxNiBvcGNvZGUsCisJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmQwLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMSwgdTggKiBsb2dpY2FsX3Jlc3VsdCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpsb2NhbF9vcGVyYW5kMSA9IG9wZXJhbmQxOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjA7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyMTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDA7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgxOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9yZXN1bHQgPSBGQUxTRTsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbG9jYWxfb3BlcmFuZDEgPSBvcGVyYW5kMTsKKwlhY3BpX2ludGVnZXIgaW50ZWdlcjA7CisJYWNwaV9pbnRlZ2VyIGludGVnZXIxOworCXUzMiBsZW5ndGgwOworCXUzMiBsZW5ndGgxOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXU4IGxvY2FsX3Jlc3VsdCA9IEZBTFNFOworCWludCBjb21wYXJlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfZG9fbG9naWNhbF9vcCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfZG9fbG9naWNhbF9vcCIpOwogCiAJLyoKIAkgKiBDb252ZXJ0IHRoZSBzZWNvbmQgb3BlcmFuZCBpZiBuZWNlc3NhcnkuICBUaGUgZmlyc3Qgb3BlcmFuZApAQCAtNTkyLDE4ICs1NTIsMTkgQEAKIAkgKiBndWFyYW50ZWVkIHRvIGJlIGVpdGhlciBJbnRlZ2VyL1N0cmluZy9CdWZmZXIgYnkgdGhlIG9wZXJhbmQKIAkgKiByZXNvbHV0aW9uIG1lY2hhbmlzbS4KIAkgKi8KLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvcGVyYW5kMCkpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9wZXJhbmQwKSkgewogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0JCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyIChvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxLCAxNik7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcihvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxLCAxNik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nIChvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxLAotCQkJCSBBQ1BJX0lNUExJQ0lUX0NPTlZFUlRfSEVYKTsKKwkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyhvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxLAorCQkJCQkJICAgQUNQSV9JTVBMSUNJVF9DT05WRVJUX0hFWCk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyIChvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxKTsKKwkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcihvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNjExLDE0ICs1NzIsMTQgQEAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyoKIAkgKiBUd28gY2FzZXM6IDEpIEJvdGggSW50ZWdlcnMsIDIpIEJvdGggU3RyaW5ncyBvciBCdWZmZXJzCiAJICovCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvcGVyYW5kMCkgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZDApID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCS8qCiAJCSAqIDEpIEJvdGggb3BlcmFuZHMgYXJlIG9mIHR5cGUgaW50ZWdlcgogCQkgKiAgICBOb3RlOiBsb2NhbF9vcGVyYW5kMSBtYXkgaGF2ZSBjaGFuZ2VkIGFib3ZlCkBAIC02MjcsMjEgKzU4OCwyMSBAQAogCQlpbnRlZ2VyMSA9IGxvY2FsX29wZXJhbmQxLT5pbnRlZ2VyLnZhbHVlOwogCiAJCXN3aXRjaCAob3Bjb2RlKSB7Ci0JCWNhc2UgQU1MX0xFUVVBTF9PUDogICAgICAgICAgICAgLyogTEVxdWFsIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCisJCWNhc2UgQU1MX0xFUVVBTF9PUDoJLyogTEVxdWFsIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCiAKIAkJCWlmIChpbnRlZ2VyMCA9PSBpbnRlZ2VyMSkgewogCQkJCWxvY2FsX3Jlc3VsdCA9IFRSVUU7CiAJCQl9CiAJCQlicmVhazsKIAotCQljYXNlIEFNTF9MR1JFQVRFUl9PUDogICAgICAgICAgIC8qIExHcmVhdGVyIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCisJCWNhc2UgQU1MX0xHUkVBVEVSX09QOgkvKiBMR3JlYXRlciAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLwogCiAJCQlpZiAoaW50ZWdlcjAgPiBpbnRlZ2VyMSkgewogCQkJCWxvY2FsX3Jlc3VsdCA9IFRSVUU7CiAJCQl9CiAJCQlicmVhazsKIAotCQljYXNlIEFNTF9MTEVTU19PUDogICAgICAgICAgICAgIC8qIExMZXNzIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCisJCWNhc2UgQU1MX0xMRVNTX09QOgkvKiBMTGVzcyAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLwogCiAJCQlpZiAoaW50ZWdlcjAgPCBpbnRlZ2VyMSkgewogCQkJCWxvY2FsX3Jlc3VsdCA9IFRSVUU7CkBAIC02NTIsOCArNjEzLDcgQEAKIAkJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKIAkJCWJyZWFrOwogCQl9Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qCiAJCSAqIDIpIEJvdGggb3BlcmFuZHMgYXJlIFN0cmluZ3Mgb3IgYm90aCBhcmUgQnVmZmVycwogCQkgKiAgICBOb3RlOiBDb2RlIGJlbG93IHRha2VzIGFkdmFudGFnZSBvZiBjb21tb24gQnVmZmVyL1N0cmluZwpAQCAtNjY1LDMxICs2MjUsMzEgQEAKIAogCQkvKiBMZXhpY29ncmFwaGljIGNvbXBhcmU6IGNvbXBhcmUgdGhlIGRhdGEgYnl0ZXMgKi8KIAotCQljb21wYXJlID0gQUNQSV9NRU1DTVAgKChjb25zdCBjaGFyICogKSBvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJIChjb25zdCBjaGFyICogKSBsb2NhbF9vcGVyYW5kMS0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJIChsZW5ndGgwID4gbGVuZ3RoMSkgPyBsZW5ndGgxIDogbGVuZ3RoMCk7CisJCWNvbXBhcmUgPSBBQ1BJX01FTUNNUCgoY29uc3QgY2hhciAqKW9wZXJhbmQwLT5idWZmZXIucG9pbnRlciwKKwkJCQkgICAgICAoY29uc3QgY2hhciAqKWxvY2FsX29wZXJhbmQxLT5idWZmZXIuCisJCQkJICAgICAgcG9pbnRlciwKKwkJCQkgICAgICAobGVuZ3RoMCA+IGxlbmd0aDEpID8gbGVuZ3RoMSA6IGxlbmd0aDApOwogCiAJCXN3aXRjaCAob3Bjb2RlKSB7Ci0JCWNhc2UgQU1MX0xFUVVBTF9PUDogICAgICAgICAgICAgLyogTEVxdWFsIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCisJCWNhc2UgQU1MX0xFUVVBTF9PUDoJLyogTEVxdWFsIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCiAKIAkJCS8qIExlbmd0aCBhbmQgYWxsIGJ5dGVzIG11c3QgYmUgZXF1YWwgKi8KIAotCQkJaWYgKChsZW5ndGgwID09IGxlbmd0aDEpICYmCi0JCQkJKGNvbXBhcmUgPT0gMCkpIHsKKwkJCWlmICgobGVuZ3RoMCA9PSBsZW5ndGgxKSAmJiAoY29tcGFyZSA9PSAwKSkgewogCQkJCS8qIExlbmd0aCBhbmQgYWxsIGJ5dGVzIG1hdGNoID09PiBUUlVFICovCiAKIAkJCQlsb2NhbF9yZXN1bHQgPSBUUlVFOwogCQkJfQogCQkJYnJlYWs7CiAKLQkJY2FzZSBBTUxfTEdSRUFURVJfT1A6ICAgICAgICAgICAvKiBMR3JlYXRlciAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLworCQljYXNlIEFNTF9MR1JFQVRFUl9PUDoJLyogTEdyZWF0ZXIgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KIAogCQkJaWYgKGNvbXBhcmUgPiAwKSB7CiAJCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKLQkJCQlnb3RvIGNsZWFudXA7ICAgLyogVFJVRSAqLworCQkJCWdvdG8gY2xlYW51cDsJLyogVFJVRSAqLwogCQkJfQogCQkJaWYgKGNvbXBhcmUgPCAwKSB7Ci0JCQkJZ290byBjbGVhbnVwOyAgIC8qIEZBTFNFICovCisJCQkJZ290byBjbGVhbnVwOwkvKiBGQUxTRSAqLwogCQkJfQogCiAJCQkvKiBCeXRlcyBtYXRjaCAodG8gc2hvcnRlc3QgbGVuZ3RoKSwgY29tcGFyZSBsZW5ndGhzICovCkBAIC02OTksMTQgKzY1OSwxNCBAQAogCQkJfQogCQkJYnJlYWs7CiAKLQkJY2FzZSBBTUxfTExFU1NfT1A6ICAgICAgICAgICAgICAvKiBMTGVzcyAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLworCQljYXNlIEFNTF9MTEVTU19PUDoJLyogTExlc3MgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KIAogCQkJaWYgKGNvbXBhcmUgPiAwKSB7Ci0JCQkJZ290byBjbGVhbnVwOyAgIC8qIEZBTFNFICovCisJCQkJZ290byBjbGVhbnVwOwkvKiBGQUxTRSAqLwogCQkJfQogCQkJaWYgKGNvbXBhcmUgPCAwKSB7CiAJCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKLQkJCQlnb3RvIGNsZWFudXA7ICAgLyogVFJVRSAqLworCQkJCWdvdG8gY2xlYW51cDsJLyogVFJVRSAqLwogCQkJfQogCiAJCQkvKiBCeXRlcyBtYXRjaCAodG8gc2hvcnRlc3QgbGVuZ3RoKSwgY29tcGFyZSBsZW5ndGhzICovCkBAIC03MjIsMTggKzY4MiwxNiBAQAogCQl9CiAJfQogCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAogCS8qIE5ldyBvYmplY3Qgd2FzIGNyZWF0ZWQgaWYgaW1wbGljaXQgY29udmVyc2lvbiBwZXJmb3JtZWQgLSBkZWxldGUgKi8KIAogCWlmIChsb2NhbF9vcGVyYW5kMSAhPSBvcGVyYW5kMSkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGxvY2FsX29wZXJhbmQxKTsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGxvY2FsX29wZXJhbmQxKTsKIAl9CiAKIAkvKiBSZXR1cm4gdGhlIGxvZ2ljYWwgcmVzdWx0IGFuZCBzdGF0dXMgKi8KIAogCSpsb2dpY2FsX3Jlc3VsdCA9IGxvY2FsX3Jlc3VsdDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bXV0ZXguYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMKaW5kZXggYzNjYjcxNC4uYWI0N2Y2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bXV0ZXguYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jCkBAIC00MiwyMCArNDIsMTYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleG11dGV4IikKK0FDUElfTU9EVUxFX05BTUUoImV4bXV0ZXgiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyB2b2lkCi1hY3BpX2V4X2xpbmtfbXV0ZXggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgKnRocmVhZCk7Ci0KK2FjcGlfZXhfbGlua19tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY5LDEyICs2NSw5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9leF91bmxpbmtfbXV0ZXggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKQordm9pZCBhY3BpX2V4X3VubGlua19tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKIHsKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQgPSBvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkOwotCisJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQgPSBvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkOwogCiAJaWYgKCF0aHJlYWQpIHsKIAkJcmV0dXJuOwpAQCAtODgsMTMgKzgxLDExIEBACiAKIAlpZiAob2JqX2Rlc2MtPm11dGV4LnByZXYpIHsKIAkJKG9ial9kZXNjLT5tdXRleC5wcmV2KS0+bXV0ZXgubmV4dCA9IG9ial9kZXNjLT5tdXRleC5uZXh0OwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQl0aHJlYWQtPmFjcXVpcmVkX211dGV4X2xpc3QgPSBvYmpfZGVzYy0+bXV0ZXgubmV4dDsKIAl9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9saW5rX211dGV4CkBAIC0xMDksMTIgKzEwMCwxMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLWFjcGlfZXhfbGlua19tdXRleCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkKQorYWNwaV9leF9saW5rX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkgICBzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKnRocmVhZCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpsaXN0X2hlYWQ7Ci0KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpsaXN0X2hlYWQ7CiAKIAlsaXN0X2hlYWQgPSB0aHJlYWQtPmFjcXVpcmVkX211dGV4X2xpc3Q7CiAKQEAgLTEzNCw3ICsxMjMsNiBAQAogCXRocmVhZC0+YWNxdWlyZWRfbXV0ZXhfbGlzdCA9IG9ial9kZXNjOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfYWNxdWlyZV9tdXRleApAQCAtMTUwLDI3ICsxMzgsMjMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2FjcXVpcmVfbXV0ZXggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRpbWVfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9leF9hY3F1aXJlX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRpbWVfZGVzYywKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X2FjcXVpcmVfbXV0ZXgiLCBvYmpfZGVzYyk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfYWNxdWlyZV9tdXRleCIsIG9ial9kZXNjKTsKIAogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIFNhbml0eSBjaGVjayAtLSB3ZSBtdXN0IGhhdmUgYSB2YWxpZCB0aHJlYWQgSUQgKi8KIAogCWlmICghd2Fsa19zdGF0ZS0+dGhyZWFkKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkNhbm5vdCBhY3F1aXJlIE11dGV4IFslNC40c10sIG51bGwgdGhyZWFkIGluZm9cbiIsCi0JCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ2Fubm90IGFjcXVpcmUgTXV0ZXggWyU0LjRzXSwgbnVsbCB0aHJlYWQgaW5mb1xuIiwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKIAl9CiAKIAkvKgpAQCAtMTc4LDEwICsxNjIsOCBAQAogCSAqIG11dGV4LiAgVGhpcyBtZWNoYW5pc20gcHJvdmlkZXMgc29tZSBkZWFkbG9jayBwcmV2ZW50aW9uCiAJICovCiAJaWYgKHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsID4gb2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCSJDYW5ub3QgYWNxdWlyZSBNdXRleCBbJTQuNHNdLCBpbmNvcnJlY3Qgc3luY19sZXZlbFxuIiwKLQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX01VVEVYX09SREVSKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDYW5ub3QgYWNxdWlyZSBNdXRleCBbJTQuNHNdLCBpbmNvcnJlY3Qgc3luY19sZXZlbFxuIiwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX01VVEVYX09SREVSKTsKIAl9CiAKIAkvKiBTdXBwb3J0IGZvciBtdWx0aXBsZSBhY3F1aXJlcyBieSB0aGUgb3duaW5nIHRocmVhZCAqLwpAQCAtMTkwLDQzICsxNzIsNDMgQEAKIAkJLyogU3BlY2lhbCBjYXNlIGZvciBHbG9iYWwgTG9jaywgYWxsb3cgYWxsIHRocmVhZHMgKi8KIAogCQlpZiAoKG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQtPnRocmVhZF9pZCA9PQotCQkJCXdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkKSAgICAgIHx8Ci0JCQkob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSA9PQotCQkJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSkpIHsKKwkJICAgICB3YWxrX3N0YXRlLT50aHJlYWQtPnRocmVhZF9pZCkgfHwKKwkJICAgIChvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlID09CisJCSAgICAgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlKSkgewogCQkJLyoKIAkJCSAqIFRoZSBtdXRleCBpcyBhbHJlYWR5IG93bmVkIGJ5IHRoaXMgdGhyZWFkLAogCQkJICoganVzdCBpbmNyZW1lbnQgdGhlIGFjcXVpc2l0aW9uIGRlcHRoCiAJCQkgKi8KIAkJCW9ial9kZXNjLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCsrOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQl9CiAJfQogCiAJLyogQWNxdWlyZSB0aGUgbXV0ZXgsIHdhaXQgaWYgbmVjZXNzYXJ5ICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9hY3F1aXJlX211dGV4ICh0aW1lX2Rlc2MsIG9ial9kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fYWNxdWlyZV9tdXRleCh0aW1lX2Rlc2MsIG9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJLyogSW5jbHVkZXMgZmFpbHVyZSBmcm9tIGEgdGltZW91dCBvbiB0aW1lX2Rlc2MgKi8KIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEhhdmUgdGhlIG11dGV4OiB1cGRhdGUgbXV0ZXggYW5kIHdhbGsgaW5mbyBhbmQgc2F2ZSB0aGUgc3luY19sZXZlbCAqLwogCi0Jb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZCAgICAgPSB3YWxrX3N0YXRlLT50aHJlYWQ7CisJb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZCA9IHdhbGtfc3RhdGUtPnRocmVhZDsKIAlvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGggPSAxOwotCW9ial9kZXNjLT5tdXRleC5vcmlnaW5hbF9zeW5jX2xldmVsID0gd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWw7CisJb2JqX2Rlc2MtPm11dGV4Lm9yaWdpbmFsX3N5bmNfbGV2ZWwgPQorCSAgICB3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbDsKIAogCXdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsID0gb2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWw7CiAKIAkvKiBMaW5rIHRoZSBtdXRleCB0byB0aGUgY3VycmVudCB0aHJlYWQgZm9yIGZvcmNlLXVubG9jayBhdCBtZXRob2QgZXhpdCAqLwogCi0JYWNwaV9leF9saW5rX211dGV4IChvYmpfZGVzYywgd2Fsa19zdGF0ZS0+dGhyZWFkKTsKKwlhY3BpX2V4X2xpbmtfbXV0ZXgob2JqX2Rlc2MsIHdhbGtfc3RhdGUtPnRocmVhZCk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVsZWFzZV9tdXRleApAQCAtMjQxLDQ4ICsyMjMsNDAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3JlbGVhc2VfbXV0ZXggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2V4X3JlbGVhc2VfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfcmVsZWFzZV9tdXRleCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfcmVsZWFzZV9tdXRleCIpOwogCiAJaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogVGhlIG11dGV4IG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgYWNxdWlyZWQgaW4gb3JkZXIgdG8gcmVsZWFzZSBpdCAqLwogCiAJaWYgKCFvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkNhbm5vdCByZWxlYXNlIE11dGV4IFslNC40c10sIG5vdCBhY3F1aXJlZFxuIiwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9NVVRFWF9OT1RfQUNRVUlSRUQpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNhbm5vdCByZWxlYXNlIE11dGV4IFslNC40c10sIG5vdCBhY3F1aXJlZFxuIiwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX01VVEVYX05PVF9BQ1FVSVJFRCk7CiAJfQogCiAJLyogU2FuaXR5IGNoZWNrIC0tIHdlIG11c3QgaGF2ZSBhIHZhbGlkIHRocmVhZCBJRCAqLwogCiAJaWYgKCF3YWxrX3N0YXRlLT50aHJlYWQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSwgbnVsbCB0aHJlYWQgaW5mb1xuIiwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSwgbnVsbCB0aHJlYWQgaW5mb1xuIiwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKIAl9CiAKIAkvKgogCSAqIFRoZSBNdXRleCBpcyBvd25lZCwgYnV0IHRoaXMgdGhyZWFkIG11c3QgYmUgdGhlIG93bmVyLgogCSAqIFNwZWNpYWwgY2FzZSBmb3IgR2xvYmFsIExvY2ssIGFueSB0aHJlYWQgY2FuIHJlbGVhc2UKIAkgKi8KLQlpZiAoKG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQtPnRocmVhZF9pZCAhPSB3YWxrX3N0YXRlLT50aHJlYWQtPnRocmVhZF9pZCkgJiYKLQkJKG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUgIT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJIlRocmVhZCAlWCBjYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdIGFjcXVpcmVkIGJ5IHRocmVhZCAlWFxuIiwKLQkJCXdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkLAotCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+bXV0ZXgubm9kZSksCi0JCQlvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkLT50aHJlYWRfaWQpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTk9UX09XTkVSKTsKKwlpZiAoKG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQtPnRocmVhZF9pZCAhPQorCSAgICAgd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQpCisJICAgICYmIChvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlICE9IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSkpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJUaHJlYWQgJVggY2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSBhY3F1aXJlZCBieSB0aHJlYWQgJVhcbiIsIHdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkLCBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPm11dGV4Lm5vZGUpLCBvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkLT50aHJlYWRfaWQpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT1RfT1dORVIpOwogCX0KIAogCS8qCkBAIC0yOTAsMTAgKzI2NCw4IEBACiAJICogZXF1YWwgdG8gdGhlIGN1cnJlbnQgc3luYyBsZXZlbAogCSAqLwogCWlmIChvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbCA+IHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkiQ2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSwgaW5jb3JyZWN0IHN5bmNfbGV2ZWxcbiIsCi0JCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9NVVRFWF9PUkRFUik7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSwgaW5jb3JyZWN0IHN5bmNfbGV2ZWxcbiIsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9NVVRFWF9PUkRFUik7CiAJfQogCiAJLyogTWF0Y2ggbXVsdGlwbGUgQWNxdWlyZXMgd2l0aCBtdWx0aXBsZSBSZWxlYXNlcyAqLwpAQCAtMzAyLDI2ICsyNzQsMjYgQEAKIAlpZiAob2JqX2Rlc2MtPm11dGV4LmFjcXVpc2l0aW9uX2RlcHRoICE9IDApIHsKIAkJLyogSnVzdCBkZWNyZW1lbnQgdGhlIGRlcHRoIGFuZCByZXR1cm4gKi8KIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBVbmxpbmsgdGhlIG11dGV4IGZyb20gdGhlIG93bmVyJ3MgbGlzdCAqLwogCi0JYWNwaV9leF91bmxpbmtfbXV0ZXggKG9ial9kZXNjKTsKKwlhY3BpX2V4X3VubGlua19tdXRleChvYmpfZGVzYyk7CiAKIAkvKiBSZWxlYXNlIHRoZSBtdXRleCAqLwogCi0Jc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fcmVsZWFzZV9tdXRleCAob2JqX2Rlc2MpOworCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgob2JqX2Rlc2MpOwogCiAJLyogVXBkYXRlIHRoZSBtdXRleCBhbmQgd2FsayBzdGF0ZSwgcmVzdG9yZSBzeW5jX2xldmVsIGJlZm9yZSBhY3F1aXJlICovCiAKIAlvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkID0gTlVMTDsKLQl3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA9IG9ial9kZXNjLT5tdXRleC5vcmlnaW5hbF9zeW5jX2xldmVsOworCXdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsID0KKwkgICAgb2JqX2Rlc2MtPm11dGV4Lm9yaWdpbmFsX3N5bmNfbGV2ZWw7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxlYXNlX2FsbF9tdXRleGVzCkBAIC0zMzQsMTcgKzMwNiwxMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfZXhfcmVsZWFzZV9hbGxfbXV0ZXhlcyAoCi0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkKQordm9pZCBhY3BpX2V4X3JlbGVhc2VfYWxsX211dGV4ZXMoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbmV4dCA9IHRocmVhZC0+YWNxdWlyZWRfbXV0ZXhfbGlzdDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0aGlzOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5leHQgPSB0aHJlYWQtPmFjcXVpcmVkX211dGV4X2xpc3Q7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGhpczsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKiBUcmF2ZXJzZSB0aGUgbGlzdCBvZiBvd25lZCBtdXRleGVzLCByZWxlYXNpbmcgZWFjaCBvbmUgKi8KIApAQCAtMzUzLDEzICszMjEsMTMgQEAKIAkJbmV4dCA9IHRoaXMtPm11dGV4Lm5leHQ7CiAKIAkJdGhpcy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGggPSAxOwotCQl0aGlzLT5tdXRleC5wcmV2ICAgICAgICAgICAgID0gTlVMTDsKLQkJdGhpcy0+bXV0ZXgubmV4dCAgICAgICAgICAgICA9IE5VTEw7CisJCXRoaXMtPm11dGV4LnByZXYgPSBOVUxMOworCQl0aGlzLT5tdXRleC5uZXh0ID0gTlVMTDsKIAotCQkgLyogUmVsZWFzZSB0aGUgbXV0ZXggKi8KKwkJLyogUmVsZWFzZSB0aGUgbXV0ZXggKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9yZWxlYXNlX211dGV4ICh0aGlzKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9yZWxlYXNlX211dGV4KHRoaXMpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTM3Miw1ICszNDAsMyBAQAogCQl0aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA9IHRoaXMtPm11dGV4Lm9yaWdpbmFsX3N5bmNfbGV2ZWw7CiAJfQogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG5hbWVzLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhuYW1lcy5jCmluZGV4IDYzOWYwYmQuLjIzOWQ4NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG5hbWVzLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYwpAQCAtNDIsMjYgKzQyLDE4IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhuYW1lcyIpCitBQ1BJX01PRFVMRV9OQU1FKCJleG5hbWVzIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgY2hhciAqCi1hY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9jb3VudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9uYW1lX3NlZ3MpOworc3RhdGljIGNoYXIgKmFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcodTMyIHByZWZpeF9jb3VudCwgdTMyIG51bV9uYW1lX3NlZ3MpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfbmFtZV9zZWdtZW50ICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqaW5fYW1sX2FkZHJlc3MsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9zdHJpbmcpOwotCithY3BpX2V4X25hbWVfc2VnbWVudCh1OCAqKiBpbl9hbWxfYWRkcmVzcywgY2hhciAqbmFtZV9zdHJpbmcpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc5LDE3ICs3MSwxMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBjaGFyICoKLWFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4X2NvdW50LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX25hbWVfc2VncykKK3N0YXRpYyBjaGFyICphY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nKHUzMiBwcmVmaXhfY291bnQsIHUzMiBudW1fbmFtZV9zZWdzKQogewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfcHRyOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVfc3RyaW5nOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfbmVlZGVkOworCWNoYXIgKnRlbXBfcHRyOworCWNoYXIgKm5hbWVfc3RyaW5nOworCXUzMiBzaXplX25lZWRlZDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9hbGxvY2F0ZV9uYW1lX3N0cmluZyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmciKTsKIAogCS8qCiAJICogQWxsb3cgcm9vbSBmb3IgYWxsIFwgYW5kIF4gcHJlZml4ZXMsIGFsbCBzZWdtZW50cyBhbmQgYSBtdWx0aV9uYW1lX3ByZWZpeC4KQEAgLTEwMCwyMCArODgsMTkgQEAKIAkJLyogU3BlY2lhbCBjYXNlIGZvciByb290ICovCiAKIAkJc2l6ZV9uZWVkZWQgPSAxICsgKEFDUElfTkFNRV9TSVpFICogbnVtX25hbWVfc2VncykgKyAyICsgMTsKLQl9Ci0JZWxzZSB7Ci0JCXNpemVfbmVlZGVkID0gcHJlZml4X2NvdW50ICsgKEFDUElfTkFNRV9TSVpFICogbnVtX25hbWVfc2VncykgKyAyICsgMTsKKwl9IGVsc2UgeworCQlzaXplX25lZWRlZCA9CisJCSAgICBwcmVmaXhfY291bnQgKyAoQUNQSV9OQU1FX1NJWkUgKiBudW1fbmFtZV9zZWdzKSArIDIgKyAxOwogCX0KIAogCS8qCiAJICogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBuYW1lLgogCSAqIFRoaXMgYnVmZmVyIG11c3QgYmUgZGVsZXRlZCBieSB0aGUgY2FsbGVyIQogCSAqLwotCW5hbWVfc3RyaW5nID0gQUNQSV9NRU1fQUxMT0NBVEUgKHNpemVfbmVlZGVkKTsKKwluYW1lX3N0cmluZyA9IEFDUElfTUVNX0FMTE9DQVRFKHNpemVfbmVlZGVkKTsKIAlpZiAoIW5hbWVfc3RyaW5nKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkiZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmc6IENvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVkXG4iLCBzaXplX25lZWRlZCkpOwotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJleF9hbGxvY2F0ZV9uYW1lX3N0cmluZzogQ291bGQgbm90IGFsbG9jYXRlIHNpemUgJWRcbiIsIHNpemVfbmVlZGVkKSk7CisJCXJldHVybl9QVFIoTlVMTCk7CiAJfQogCiAJdGVtcF9wdHIgPSBuYW1lX3N0cmluZzsKQEAgLTEyMiwyMyArMTA5LDIwIEBACiAKIAlpZiAocHJlZml4X2NvdW50ID09IEFDUElfVUlOVDMyX01BWCkgewogCQkqdGVtcF9wdHIrKyA9IEFNTF9ST09UX1BSRUZJWDsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJd2hpbGUgKHByZWZpeF9jb3VudC0tKSB7CiAJCQkqdGVtcF9wdHIrKyA9IEFNTF9QQVJFTlRfUFJFRklYOwogCQl9CiAJfQogCi0KIAkvKiBTZXQgdXAgRHVhbCBvciBNdWx0aSBwcmVmaXhlcyBpZiBuZWVkZWQgKi8KIAogCWlmIChudW1fbmFtZV9zZWdzID4gMikgewogCQkvKiBTZXQgdXAgbXVsdGkgcHJlZml4ZXMgICAqLwogCiAJCSp0ZW1wX3B0cisrID0gQU1MX01VTFRJX05BTUVfUFJFRklYX09QOwotCQkqdGVtcF9wdHIrKyA9IChjaGFyKSBudW1fbmFtZV9zZWdzOwotCX0KLQllbHNlIGlmICgyID09IG51bV9uYW1lX3NlZ3MpIHsKKwkJKnRlbXBfcHRyKysgPSAoY2hhciludW1fbmFtZV9zZWdzOworCX0gZWxzZSBpZiAoMiA9PSBudW1fbmFtZV9zZWdzKSB7CiAJCS8qIFNldCB1cCBkdWFsIHByZWZpeGVzICovCiAKIAkJKnRlbXBfcHRyKysgPSBBTUxfRFVBTF9OQU1FX1BSRUZJWDsKQEAgLTE1MCw3ICsxMzQsNyBAQAogCSAqLwogCSp0ZW1wX3B0ciA9IDA7CiAKLQlyZXR1cm5fUFRSIChuYW1lX3N0cmluZyk7CisJcmV0dXJuX1BUUihuYW1lX3N0cmluZyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNjcsMTkgKzE1MSwxNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9uYW1lX3NlZ21lbnQgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKippbl9hbWxfYWRkcmVzcywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lX3N0cmluZykKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX2V4X25hbWVfc2VnbWVudCh1OCAqKiBpbl9hbWxfYWRkcmVzcywgY2hhciAqbmFtZV9zdHJpbmcpCiB7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sX2FkZHJlc3MgPSAodm9pZCAqKSAqaW5fYW1sX2FkZHJlc3M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9idWZbNV07CisJY2hhciAqYW1sX2FkZHJlc3MgPSAodm9pZCAqKSppbl9hbWxfYWRkcmVzczsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgaW5kZXg7CisJY2hhciBjaGFyX2J1Zls1XTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X25hbWVfc2VnbWVudCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfbmFtZV9zZWdtZW50Iik7CiAKIAkvKgogCSAqIElmIGZpcnN0IGNoYXJhY3RlciBpcyBhIGRpZ2l0LCB0aGVuIHdlIGtub3cgdGhhdCB3ZSBhcmVuJ3QgbG9va2luZyBhdCBhCkBAIC0xODgsMjAgKzE2NywyMCBAQAogCWNoYXJfYnVmWzBdID0gKmFtbF9hZGRyZXNzOwogCiAJaWYgKCcwJyA8PSBjaGFyX2J1ZlswXSAmJiBjaGFyX2J1ZlswXSA8PSAnOScpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJsZWFkaW5nIGRpZ2l0OiAlY1xuIiwgY2hhcl9idWZbMF0pKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9DVFJMX1BFTkRJTkcpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAibGVhZGluZyBkaWdpdDogJWNcbiIsCisJCQkJICBjaGFyX2J1ZlswXSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQ1RSTF9QRU5ESU5HKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAiQnl0ZXMgZnJvbSBzdHJlYW06XG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELCAiQnl0ZXMgZnJvbSBzdHJlYW06XG4iKSk7CiAKIAlmb3IgKGluZGV4ID0gMDsKLQkJKGluZGV4IDwgQUNQSV9OQU1FX1NJWkUpICYmIChhY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcmFjdGVyICgqYW1sX2FkZHJlc3MpKTsKLQkJaW5kZXgrKykgeworCSAgICAgKGluZGV4IDwgQUNQSV9OQU1FX1NJWkUpCisJICAgICAmJiAoYWNwaV91dF92YWxpZF9hY3BpX2NoYXJhY3RlcigqYW1sX2FkZHJlc3MpKTsgaW5kZXgrKykgewogCQljaGFyX2J1ZltpbmRleF0gPSAqYW1sX2FkZHJlc3MrKzsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgIiVjXG4iLCBjaGFyX2J1ZltpbmRleF0pKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELCAiJWNcbiIsIGNoYXJfYnVmW2luZGV4XSkpOwogCX0KIAotCiAJLyogVmFsaWQgbmFtZSBzZWdtZW50ICAqLwogCiAJaWYgKGluZGV4ID09IDQpIHsKQEAgLTIxMCw0MSArMTg5LDM3IEBACiAJCWNoYXJfYnVmWzRdID0gJ1wwJzsKIAogCQlpZiAobmFtZV9zdHJpbmcpIHsKLQkJCUFDUElfU1RSQ0FUIChuYW1lX3N0cmluZywgY2hhcl9idWYpOwotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCQkJIkFwcGVuZGVkIHRvIC0gJXMgXG4iLCBuYW1lX3N0cmluZykpOworCQkJQUNQSV9TVFJDQVQobmFtZV9zdHJpbmcsIGNoYXJfYnVmKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCSAgIkFwcGVuZGVkIHRvIC0gJXMgXG4iLCBuYW1lX3N0cmluZykpOworCQl9IGVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJICAiTm8gTmFtZSBzdHJpbmcgLSAlcyBcbiIsIGNoYXJfYnVmKSk7CiAJCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCQkiTm8gTmFtZSBzdHJpbmcgLSAlcyBcbiIsIGNoYXJfYnVmKSk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoaW5kZXggPT0gMCkgeworCX0gZWxzZSBpZiAoaW5kZXggPT0gMCkgewogCQkvKgogCQkgKiBGaXJzdCBjaGFyYWN0ZXIgd2FzIG5vdCBhIHZhbGlkIG5hbWUgY2hhcmFjdGVyLAogCQkgKiBzbyB3ZSBhcmUgbG9va2luZyBhdCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIG5hbWUuCiAJCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJIkxlYWRpbmcgY2hhcmFjdGVyIGlzIG5vdCBhbHBoYTogJTAyWGggKG5vdCBhIG5hbWUpXG4iLAotCQkJY2hhcl9idWZbMF0pKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIkxlYWRpbmcgY2hhcmFjdGVyIGlzIG5vdCBhbHBoYTogJTAyWGggKG5vdCBhIG5hbWUpXG4iLAorCQkJCSAgY2hhcl9idWZbMF0pKTsKIAkJc3RhdHVzID0gQUVfQ1RSTF9QRU5ESU5HOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBTZWdtZW50IHN0YXJ0ZWQgd2l0aCBvbmUgb3IgbW9yZSB2YWxpZCBjaGFyYWN0ZXJzLCBidXQgZmV3ZXIgdGhhbgogCQkgKiB0aGUgcmVxdWlyZWQgNAogCQkgKi8KIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9OQU1FOwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJCYWQgY2hhcmFjdGVyICUwMnggaW4gbmFtZSwgYXQgJXBcbiIsCi0JCQkqYW1sX2FkZHJlc3MsIGFtbF9hZGRyZXNzKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQmFkIGNoYXJhY3RlciAlMDJ4IGluIG5hbWUsIGF0ICVwXG4iLAorCQkJCSAgKmFtbF9hZGRyZXNzLCBhbWxfYWRkcmVzcykpOwogCX0KIAogCSppbl9hbWxfYWRkcmVzcyA9ICh1OCAqKSBhbWxfYWRkcmVzczsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9nZXRfbmFtZV9zdHJpbmcKQEAgLTI2MywzNyArMjM4LDMyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9nZXRfbmFtZV9zdHJpbmcgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgZGF0YV90eXBlLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmluX2FtbF9hZGRyZXNzLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRfbmFtZV9zdHJpbmcsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0X25hbWVfbGVuZ3RoKQorYWNwaV9leF9nZXRfbmFtZV9zdHJpbmcoYWNwaV9vYmplY3RfdHlwZSBkYXRhX3R5cGUsCisJCQl1OCAqIGluX2FtbF9hZGRyZXNzLAorCQkJY2hhciAqKm91dF9uYW1lX3N0cmluZywgdTMyICogb3V0X25hbWVfbGVuZ3RoKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sX2FkZHJlc3MgPSBpbl9hbWxfYWRkcmVzczsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lX3N0cmluZyA9IE5VTEw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2VnbWVudHM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhfY291bnQgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX3ByZWZpeCA9IEZBTFNFOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXU4ICphbWxfYWRkcmVzcyA9IGluX2FtbF9hZGRyZXNzOworCWNoYXIgKm5hbWVfc3RyaW5nID0gTlVMTDsKKwl1MzIgbnVtX3NlZ21lbnRzOworCXUzMiBwcmVmaXhfY291bnQgPSAwOworCXU4IGhhc19wcmVmaXggPSBGQUxTRTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9nZXRfbmFtZV9zdHJpbmciLCBhbWxfYWRkcmVzcyk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X2dldF9uYW1lX3N0cmluZyIsIGFtbF9hZGRyZXNzKTsKLQotCi0JaWYgKEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQgPT0gZGF0YV90eXBlICB8fAotCQlBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRCA9PSBkYXRhX3R5cGUgICAgfHwKLQkJQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEID09IGRhdGFfdHlwZSkgeworCWlmIChBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEID09IGRhdGFfdHlwZSB8fAorCSAgICBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRCA9PSBkYXRhX3R5cGUgfHwKKwkgICAgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEID09IGRhdGFfdHlwZSkgewogCQkvKiBEaXNhbGxvdyBwcmVmaXhlcyBmb3IgdHlwZXMgYXNzb2NpYXRlZCB3aXRoIGZpZWxkX3VuaXQgbmFtZXMgKi8KIAotCQluYW1lX3N0cmluZyA9IGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcgKDAsIDEpOworCQluYW1lX3N0cmluZyA9IGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcoMCwgMSk7CiAJCWlmICghbmFtZV9zdHJpbmcpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9uYW1lX3NlZ21lbnQoJmFtbF9hZGRyZXNzLCBuYW1lX3N0cmluZyk7CiAJCX0KLQkJZWxzZSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2V4X25hbWVfc2VnbWVudCAoJmFtbF9hZGRyZXNzLCBuYW1lX3N0cmluZyk7Ci0JCX0KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogZGF0YV90eXBlIGlzIG5vdCBhIGZpZWxkIG5hbWUuCiAJCSAqIEV4YW1pbmUgZmlyc3QgY2hhcmFjdGVyIG9mIG5hbWUgZm9yIHJvb3Qgb3IgcGFyZW50IHByZWZpeCBvcGVyYXRvcnMKQEAgLTMwMSw4ICsyNzEsOSBAQAogCQlzd2l0Y2ggKCphbWxfYWRkcmVzcykgewogCQljYXNlIEFNTF9ST09UX1BSRUZJWDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgInJvb3RfcHJlZml4KFxcKSBhdCAlcFxuIiwKLQkJCQlhbWxfYWRkcmVzcykpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAorCQkJCQkgICJyb290X3ByZWZpeChcXCkgYXQgJXBcbiIsCisJCQkJCSAgYW1sX2FkZHJlc3MpKTsKIAogCQkJLyoKIAkJCSAqIFJlbWVtYmVyIHRoYXQgd2UgaGF2ZSBhIHJvb3RfcHJlZml4IC0tCkBAIC0zMTMsMTQgKzI4NCwxNCBAQAogCQkJaGFzX3ByZWZpeCA9IFRSVUU7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX1BBUkVOVF9QUkVGSVg6CiAKIAkJCS8qIEluY3JlbWVudCBwYXN0IHBvc3NpYmx5IG11bHRpcGxlIHBhcmVudCBwcmVmaXhlcyAqLwogCiAJCQlkbyB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgInBhcmVudF9wcmVmaXggKF4pIGF0ICVwXG4iLAotCQkJCQlhbWxfYWRkcmVzcykpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwKKwkJCQkJCSAgInBhcmVudF9wcmVmaXggKF4pIGF0ICVwXG4iLAorCQkJCQkJICBhbWxfYWRkcmVzcykpOwogCiAJCQkJYW1sX2FkZHJlc3MrKzsKIAkJCQlwcmVmaXhfY291bnQrKzsKQEAgLTMzMCw3ICszMDEsNiBAQAogCQkJaGFzX3ByZWZpeCA9IFRSVUU7CiAJCQlicmVhazsKIAotCiAJCWRlZmF1bHQ6CiAKIAkJCS8qIE5vdCBhIHByZWZpeCBjaGFyYWN0ZXIgKi8KQEAgLTM0MywxMSArMzEzLDEzIEBACiAJCXN3aXRjaCAoKmFtbF9hZGRyZXNzKSB7CiAJCWNhc2UgQU1MX0RVQUxfTkFNRV9QUkVGSVg6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0xPQUQsICJkdWFsX25hbWVfcHJlZml4IGF0ICVwXG4iLAotCQkJCWFtbF9hZGRyZXNzKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0xPQUQsCisJCQkJCSAgImR1YWxfbmFtZV9wcmVmaXggYXQgJXBcbiIsCisJCQkJCSAgYW1sX2FkZHJlc3MpKTsKIAogCQkJYW1sX2FkZHJlc3MrKzsKLQkJCW5hbWVfc3RyaW5nID0gYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyAocHJlZml4X2NvdW50LCAyKTsKKwkJCW5hbWVfc3RyaW5nID0KKwkJCSAgICBhY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nKHByZWZpeF9jb3VudCwgMik7CiAJCQlpZiAoIW5hbWVfc3RyaW5nKSB7CiAJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJCWJyZWFrOwpAQCAtMzU3LDI0ICszMjksMjkgQEAKIAogCQkJaGFzX3ByZWZpeCA9IFRSVUU7CiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfbmFtZV9zZWdtZW50ICgmYW1sX2FkZHJlc3MsIG5hbWVfc3RyaW5nKTsKLQkJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJCQlzdGF0dXMgPSBhY3BpX2V4X25hbWVfc2VnbWVudCAoJmFtbF9hZGRyZXNzLCBuYW1lX3N0cmluZyk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfbmFtZV9zZWdtZW50KCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpOworCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9leF9uYW1lX3NlZ21lbnQoJmFtbF9hZGRyZXNzLAorCQkJCQkJCSBuYW1lX3N0cmluZyk7CiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX01VTFRJX05BTUVfUFJFRklYX09QOgogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAibXVsdGlfbmFtZV9wcmVmaXggYXQgJXBcbiIsCi0JCQkJYW1sX2FkZHJlc3MpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwKKwkJCQkJICAibXVsdGlfbmFtZV9wcmVmaXggYXQgJXBcbiIsCisJCQkJCSAgYW1sX2FkZHJlc3MpKTsKIAogCQkJLyogRmV0Y2ggY291bnQgb2Ygc2VnbWVudHMgcmVtYWluaW5nIGluIG5hbWUgcGF0aCAqLwogCiAJCQlhbWxfYWRkcmVzcysrOwogCQkJbnVtX3NlZ21lbnRzID0gKmFtbF9hZGRyZXNzOwogCi0JCQluYW1lX3N0cmluZyA9IGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcgKHByZWZpeF9jb3VudCwgbnVtX3NlZ21lbnRzKTsKKwkJCW5hbWVfc3RyaW5nID0KKwkJCSAgICBhY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nKHByZWZpeF9jb3VudCwKKwkJCQkJCQkgbnVtX3NlZ21lbnRzKTsKIAkJCWlmICghbmFtZV9zdHJpbmcpIHsKIAkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQkJYnJlYWs7CkBAIC0zODYsMjcgKzM2MywyOCBAQAogCQkJaGFzX3ByZWZpeCA9IFRSVUU7CiAKIAkJCXdoaWxlIChudW1fc2VnbWVudHMgJiYKLQkJCQkJKHN0YXR1cyA9IGFjcGlfZXhfbmFtZV9zZWdtZW50ICgmYW1sX2FkZHJlc3MsIG5hbWVfc3RyaW5nKSkgPT0KLQkJCQkJCUFFX09LKSB7CisJCQkgICAgICAgKHN0YXR1cyA9CisJCQkJYWNwaV9leF9uYW1lX3NlZ21lbnQoJmFtbF9hZGRyZXNzLAorCQkJCQkJICAgICBuYW1lX3N0cmluZykpID09IEFFX09LKSB7CiAJCQkJbnVtX3NlZ21lbnRzLS07CiAJCQl9CiAKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSAwOgogCiAJCQkvKiBudWxsX25hbWUgdmFsaWQgYXMgb2YgOC0xMi05OCBBU0wvQU1MIEdyYW1tYXIgVXBkYXRlICovCiAKIAkJCWlmIChwcmVmaXhfY291bnQgPT0gQUNQSV9VSU5UMzJfTUFYKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCQkJIm5hbWVfc2VnIGlzIFwiXFxcIiBmb2xsb3dlZCBieSBOVUxMXG4iKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCQkJICAibmFtZV9zZWcgaXMgXCJcXFwiIGZvbGxvd2VkIGJ5IE5VTExcbiIpKTsKIAkJCX0KIAogCQkJLyogQ29uc3VtZSB0aGUgTlVMTCBieXRlICovCiAKIAkJCWFtbF9hZGRyZXNzKys7Ci0JCQluYW1lX3N0cmluZyA9IGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcgKHByZWZpeF9jb3VudCwgMCk7CisJCQluYW1lX3N0cmluZyA9CisJCQkgICAgYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyhwcmVmaXhfY291bnQsIDApOwogCQkJaWYgKCFuYW1lX3N0cmluZykgewogCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCQlicmVhazsKQEAgLTQxNCwxOCArMzkyLDE5IEBACiAKIAkJCWJyZWFrOwogCi0KIAkJZGVmYXVsdDoKIAogCQkJLyogTmFtZSBzZWdtZW50IHN0cmluZyAqLwogCi0JCQluYW1lX3N0cmluZyA9IGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcgKHByZWZpeF9jb3VudCwgMSk7CisJCQluYW1lX3N0cmluZyA9CisJCQkgICAgYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyhwcmVmaXhfY291bnQsIDEpOwogCQkJaWYgKCFuYW1lX3N0cmluZykgewogCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJc3RhdHVzID0gYWNwaV9leF9uYW1lX3NlZ21lbnQgKCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X25hbWVfc2VnbWVudCgmYW1sX2FkZHJlc3MsIG5hbWVfc3RyaW5nKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNDMzLDE1ICs0MTIsMjAgQEAKIAlpZiAoQUVfQ1RSTF9QRU5ESU5HID09IHN0YXR1cyAmJiBoYXNfcHJlZml4KSB7CiAJCS8qIFJhbiBvdXQgb2Ygc2VnbWVudHMgYWZ0ZXIgcHJvY2Vzc2luZyBhIHByZWZpeCAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgKLQkJCSgiZXhfZG9fbmFtZTogTWFsZm9ybWVkIE5hbWUgYXQgJXBcbiIsIG5hbWVfc3RyaW5nKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiZXhfZG9fbmFtZTogTWFsZm9ybWVkIE5hbWUgYXQgJXBcbiIsCisJCQkJICAgbmFtZV9zdHJpbmcpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9OQU1FOwogCX0KIAorCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlpZiAobmFtZV9zdHJpbmcpIHsKKwkJCUFDUElfTUVNX0ZSRUUobmFtZV9zdHJpbmcpOworCQl9CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKwogCSpvdXRfbmFtZV9zdHJpbmcgPSBuYW1lX3N0cmluZzsKIAkqb3V0X25hbWVfbGVuZ3RoID0gKHUzMikgKGFtbF9hZGRyZXNzIC0gaW5fYW1sX2FkZHJlc3MpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMS5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcxLmMKaW5kZXggZGJkZjgyNi4uOTdlMzQ1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcxLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcxLmMKQEAgLTQyLDcgKzQyLDYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgpAQCAtNTAsMTAgKzQ5LDggQEAKICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4b3BhcmcxIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiZXhvcGFyZzEiKQogCiAvKiEKICAqIE5hbWluZyBjb252ZW50aW9uIGZvciBBTUwgaW50ZXJwcmV0ZXIgZXhlY3V0aW9uIHJvdXRpbmVzLgpAQCAtNzYsNyArNzMsNiBAQAogICogVGhlIEFjcGlFeE9wY29kZSogZnVuY3Rpb25zIGFyZSBjYWxsZWQgdmlhIHRoZSBEaXNwYXRjaGVyIGNvbXBvbmVudCB3aXRoCiAgKiBmdWxseSByZXNvbHZlZCBvcGVyYW5kcy4KICEqLwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8wQV8wVF8xUgpAQCAtODgsNTkgKzg0LDUzIEBACiAgKiBERVNDUklQVElPTjogRXhlY3V0ZSBvcGVyYXRvciB3aXRoIG5vIG9wZXJhbmRzLCBvbmUgcmV0dXJuIHZhbHVlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzBBXzBUXzFSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMEFfMFRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYyA9IE5VTEw7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzBBXzBUXzFSIiwKLQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoImV4X29wY29kZV8wQV8wVF8xUiIsCisJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX1RJTUVSX09QOiAgICAgIC8qICBUaW1lciAoKSAqLworCWNhc2UgQU1MX1RJTUVSX09QOgkvKiAgVGltZXIgKCkgKi8KIAogCQkvKiBDcmVhdGUgYSByZXR1cm4gb2JqZWN0IG9mIHR5cGUgSW50ZWdlciAqLwogCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byBjbGVhbnVwOwogCQl9Ci0KLQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBhY3BpX29zX2dldF90aW1lciAoKTsKKyNpZiBBQ1BJX01BQ0hJTkVfV0lEVEggIT0gMTYKKwkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBhY3BpX29zX2dldF90aW1lcigpOworI2VuZGlmCiAJCWJyZWFrOwogCi0JZGVmYXVsdDogICAgICAgICAgICAgICAgLyogIFVua25vd24gb3Bjb2RlICAqLworCWRlZmF1bHQ6CQkvKiAgVW5rbm93biBvcGNvZGUgICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9leF9vcGNvZGVfMEFfMFRfMVI6IFVua25vd24gb3Bjb2RlICVYXG4iLAotCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9vcGNvZGVfMEFfMFRfMVI6IFVua25vd24gb3Bjb2RlICVYXG4iLCB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWJyZWFrOwogCX0KIAotY2xlYW51cDoKLQotCWlmICghd2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgewotCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7Ci0JfQorICAgICAgY2xlYW51cDoKIAogCS8qIERlbGV0ZSByZXR1cm4gb2JqZWN0IG9uIGVycm9yICovCiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocmV0dXJuX2Rlc2MpOworCWlmICgoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHx8IHdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKKwl9IGVsc2UgeworCQkvKiBTYXZlIHRoZSByZXR1cm4gdmFsdWUgKi8KKworCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzBSCkBAIC0xNTQsNjkgKzE0NCw1OCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8xQV8wVF8wUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzBSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMUFfMFRfMFIiLAotCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzFBXzBUXzBSIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KIAogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7Ci0JY2FzZSBBTUxfUkVMRUFTRV9PUDogICAgLyogIFJlbGVhc2UgKG11dGV4X29iamVjdCkgKi8KKwljYXNlIEFNTF9SRUxFQVNFX09QOgkvKiAgUmVsZWFzZSAobXV0ZXhfb2JqZWN0KSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfcmVsZWFzZV9tdXRleCAob3BlcmFuZFswXSwgd2Fsa19zdGF0ZSk7CisJCXN0YXR1cyA9IGFjcGlfZXhfcmVsZWFzZV9tdXRleChvcGVyYW5kWzBdLCB3YWxrX3N0YXRlKTsKIAkJYnJlYWs7CiAKKwljYXNlIEFNTF9SRVNFVF9PUDoJLyogIFJlc2V0IChldmVudF9vYmplY3QpICovCiAKLQljYXNlIEFNTF9SRVNFVF9PUDogICAgICAvKiAgUmVzZXQgKGV2ZW50X29iamVjdCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9yZXNldF9ldmVudCAob3BlcmFuZFswXSk7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3Jlc2V0X2V2ZW50KG9wZXJhbmRbMF0pOwogCQlicmVhazsKIAorCWNhc2UgQU1MX1NJR05BTF9PUDoJLyogIFNpZ25hbCAoZXZlbnRfb2JqZWN0KSAqLwogCi0JY2FzZSBBTUxfU0lHTkFMX09QOiAgICAgLyogIFNpZ25hbCAoZXZlbnRfb2JqZWN0KSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3NpZ25hbF9ldmVudCAob3BlcmFuZFswXSk7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3NpZ25hbF9ldmVudChvcGVyYW5kWzBdKTsKIAkJYnJlYWs7CiAKKwljYXNlIEFNTF9TTEVFUF9PUDoJLyogIFNsZWVwIChtc2VjX3RpbWUpICovCiAKLQljYXNlIEFNTF9TTEVFUF9PUDogICAgICAvKiAgU2xlZXAgKG1zZWNfdGltZSkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9kb19zdXNwZW5kIChvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlKTsKKwkJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fZG9fc3VzcGVuZChvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlKTsKIAkJYnJlYWs7CiAKKwljYXNlIEFNTF9TVEFMTF9PUDoJLyogIFN0YWxsICh1c2VjX3RpbWUpICovCiAKLQljYXNlIEFNTF9TVEFMTF9PUDogICAgICAvKiAgU3RhbGwgKHVzZWNfdGltZSkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9kb19zdGFsbCAoKHUzMikgb3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3N5c3RlbV9kb19zdGFsbCgodTMyKSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlKTsKIAkJYnJlYWs7CiAKKwljYXNlIEFNTF9VTkxPQURfT1A6CS8qICBVbmxvYWQgKEhhbmRsZSkgKi8KIAotCWNhc2UgQU1MX1VOTE9BRF9PUDogICAgIC8qICBVbmxvYWQgKEhhbmRsZSkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X3VubG9hZF90YWJsZSAob3BlcmFuZFswXSk7CisJCXN0YXR1cyA9IGFjcGlfZXhfdW5sb2FkX3RhYmxlKG9wZXJhbmRbMF0pOwogCQlicmVhazsKIAorCWRlZmF1bHQ6CQkvKiAgVW5rbm93biBvcGNvZGUgICovCiAKLQlkZWZhdWx0OiAgICAgICAgICAgICAgICAvKiAgVW5rbm93biBvcGNvZGUgICovCi0KLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9leF9vcGNvZGVfMUFfMFRfMFI6IFVua25vd24gb3Bjb2RlICVYXG4iLAotCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9vcGNvZGVfMUFfMFRfMFI6IFVua25vd24gb3Bjb2RlICVYXG4iLCB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWJyZWFrOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8xQV8xVF8wUgpAQCAtMjMwLDQxICsyMDksMzQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfMUFfMVRfMFIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8xQV8xVF8wUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzFBXzFUXzBSIiwKLQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoImV4X29wY29kZV8xQV8xVF8wUiIsCisJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewogCWNhc2UgQU1MX0xPQURfT1A6CiAKLQkJc3RhdHVzID0gYWNwaV9leF9sb2FkX29wIChvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9leF9sb2FkX29wKG9wZXJhbmRbMF0sIG9wZXJhbmRbMV0sIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAotCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5rbm93biBvcGNvZGUgKi8KKwlkZWZhdWx0OgkJLyogVW5rbm93biBvcGNvZGUgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV8xQV8xVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCi0JCQl3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8xQV8xVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAorICAgICAgY2xlYW51cDoKIAotY2xlYW51cDoKLQotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8xQV8xVF8xUgpAQCAtMjc4LDIzICsyNTAsMTkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfMUFfMVRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8xQV8xVF8xUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MgPSBOVUxMOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjMiA9IE5VTEw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMzI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgcG93ZXJfb2ZfdGVuOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgZGlnaXQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MgPSBOVUxMOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjMiA9IE5VTEw7CisJdTMyIHRlbXAzMjsKKwl1MzIgaTsKKwlhY3BpX2ludGVnZXIgcG93ZXJfb2ZfdGVuOworCWFjcGlfaW50ZWdlciBkaWdpdDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMUFfMVRfMVIiLAotCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzFBXzFUXzFSIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KIApAQCAtMzA4LDIwICsyNzYsMTkgQEAKIAogCQkvKiBDcmVhdGUgYSByZXR1cm4gb2JqZWN0IG9mIHR5cGUgSW50ZWdlciBmb3IgdGhlc2Ugb3Bjb2RlcyAqLwogCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKIAkJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQkJY2FzZSBBTUxfQklUX05PVF9PUDogICAgICAgICAgICAvKiBOb3QgKE9wZXJhbmQsIFJlc3VsdCkgICovCisJCWNhc2UgQU1MX0JJVF9OT1RfT1A6CS8qIE5vdCAoT3BlcmFuZCwgUmVzdWx0KSAgKi8KIAogCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSB+b3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZTsKIAkJCWJyZWFrOwogCi0KLQkJY2FzZSBBTUxfRklORF9TRVRfTEVGVF9CSVRfT1A6ICAvKiBmaW5kX3NldF9sZWZ0X2JpdCAoT3BlcmFuZCwgUmVzdWx0KSAqLworCQljYXNlIEFNTF9GSU5EX1NFVF9MRUZUX0JJVF9PUDoJLyogZmluZF9zZXRfbGVmdF9iaXQgKE9wZXJhbmQsIFJlc3VsdCkgKi8KIAogCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlOwogCkBAIC0zMzAsMTUgKzI5NywxNCBAQAogCQkJICogZW5kaWFuIHVuc2lnbmVkIHZhbHVlLCBzbyB0aGlzIGJvdW5kYXJ5IGNvbmRpdGlvbiBpcyB2YWxpZC4KIAkJCSAqLwogCQkJZm9yICh0ZW1wMzIgPSAwOyByZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSAmJgotCQkJCQkgICB0ZW1wMzIgPCBBQ1BJX0lOVEVHRVJfQklUX1NJWkU7ICsrdGVtcDMyKSB7CisJCQkgICAgIHRlbXAzMiA8IEFDUElfSU5URUdFUl9CSVRfU0laRTsgKyt0ZW1wMzIpIHsKIAkJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA+Pj0gMTsKIAkJCX0KIAogCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSB0ZW1wMzI7CiAJCQlicmVhazsKIAotCi0JCWNhc2UgQU1MX0ZJTkRfU0VUX1JJR0hUX0JJVF9PUDogLyogZmluZF9zZXRfcmlnaHRfYml0IChPcGVyYW5kLCBSZXN1bHQpICovCisJCWNhc2UgQU1MX0ZJTkRfU0VUX1JJR0hUX0JJVF9PUDoJLyogZmluZF9zZXRfcmlnaHRfYml0IChPcGVyYW5kLCBSZXN1bHQpICovCiAKIAkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gb3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZTsKIApAQCAtMzQ3LDE4ICszMTMsMTcgQEAKIAkJCSAqIGVuZGlhbiB1bnNpZ25lZCB2YWx1ZSwgc28gdGhpcyBib3VuZGFyeSBjb25kaXRpb24gaXMgdmFsaWQuCiAJCQkgKi8KIAkJCWZvciAodGVtcDMyID0gMDsgcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgJiYKLQkJCQkJICAgdGVtcDMyIDwgQUNQSV9JTlRFR0VSX0JJVF9TSVpFOyArK3RlbXAzMikgeworCQkJICAgICB0ZW1wMzIgPCBBQ1BJX0lOVEVHRVJfQklUX1NJWkU7ICsrdGVtcDMyKSB7CiAJCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPDw9IDE7CiAJCQl9CiAKIAkJCS8qIFNpbmNlIHRoZSBiaXQgcG9zaXRpb24gaXMgb25lLWJhc2VkLCBzdWJ0cmFjdCBmcm9tIDMzICg2NSkgKi8KIAogCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSB0ZW1wMzIgPT0gMCA/IDAgOgotCQkJCQkgIChBQ1BJX0lOVEVHRVJfQklUX1NJWkUgKyAxKSAtIHRlbXAzMjsKKwkJCSAgICAoQUNQSV9JTlRFR0VSX0JJVF9TSVpFICsgMSkgLSB0ZW1wMzI7CiAJCQlicmVhazsKIAotCi0JCWNhc2UgQU1MX0ZST01fQkNEX09QOiAgICAgICAgICAgLyogZnJvbV9iY2QgKEJDRFZhbHVlLCBSZXN1bHQpICovCisJCWNhc2UgQU1MX0ZST01fQkNEX09QOgkvKiBmcm9tX2JjZCAoQkNEVmFsdWUsIFJlc3VsdCkgKi8KIAogCQkJLyoKIAkJCSAqIFRoZSA2NC1iaXQgQUNQSSBpbnRlZ2VyIGNhbiBob2xkIDE2IDQtYml0IEJDRCBjaGFyYWN0ZXJzCkBAIC0zNzEsNyArMzM2LDkgQEAKIAogCQkJLyogQ29udmVydCBlYWNoIEJDRCBkaWdpdCAoZWFjaCBpcyBvbmUgbnliYmxlIHdpZGUpICovCiAKLQkJCWZvciAoaSA9IDA7IChpIDwgYWNwaV9nYmxfaW50ZWdlcl9ueWJibGVfd2lkdGgpICYmIChkaWdpdCA+IDApOyBpKyspIHsKKwkJCWZvciAoaSA9IDA7CisJCQkgICAgIChpIDwgYWNwaV9nYmxfaW50ZWdlcl9ueWJibGVfd2lkdGgpICYmIChkaWdpdCA+IDApOworCQkJICAgICBpKyspIHsKIAkJCQkvKiBHZXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IDQtYml0IEJDRCBkaWdpdCAqLwogCiAJCQkJdGVtcDMyID0gKCh1MzIpIGRpZ2l0KSAmIDB4RjsKQEAgLTM3OSw5ICszNDYsOSBAQAogCQkJCS8qIENoZWNrIHRoZSByYW5nZSBvZiB0aGUgZGlnaXQgKi8KIAogCQkJCWlmICh0ZW1wMzIgPiA5KSB7Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJIkJDRCBkaWdpdCB0b28gbGFyZ2UgKG5vdCBkZWNpbWFsKTogMHglWFxuIiwKLQkJCQkJCXRlbXAzMikpOworCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJCSAgIkJDRCBkaWdpdCB0b28gbGFyZ2UgKG5vdCBkZWNpbWFsKTogMHglWFxuIiwKKwkJCQkJCQkgIHRlbXAzMikpOwogCiAJCQkJCXN0YXR1cyA9IEFFX0FNTF9OVU1FUklDX09WRVJGTE9XOwogCQkJCQlnb3RvIGNsZWFudXA7CkBAIC0zODksOCArMzU2LDggQEAKIAogCQkJCS8qIFN1bSB0aGUgZGlnaXQgaW50byB0aGUgcmVzdWx0IHdpdGggdGhlIGN1cnJlbnQgcG93ZXIgb2YgMTAgKi8KIAotCQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlICs9ICgoKGFjcGlfaW50ZWdlcikgdGVtcDMyKSAqCi0JCQkJCQkgcG93ZXJfb2ZfdGVuKTsKKwkJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSArPQorCQkJCSAgICAoKChhY3BpX2ludGVnZXIpIHRlbXAzMikgKiBwb3dlcl9vZl90ZW4pOwogCiAJCQkJLyogU2hpZnQgdG8gbmV4dCBCQ0QgZGlnaXQgKi8KIApAQCAtNDAyLDQ1ICszNjksNTAgQEAKIAkJCX0KIAkJCWJyZWFrOwogCi0KLQkJY2FzZSBBTUxfVE9fQkNEX09QOiAgICAgICAgICAgICAvKiB0b19iY2QgKE9wZXJhbmQsIFJlc3VsdCkgKi8KKwkJY2FzZSBBTUxfVE9fQkNEX09QOgkvKiB0b19iY2QgKE9wZXJhbmQsIFJlc3VsdCkgKi8KIAogCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSAwOwogCQkJZGlnaXQgPSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlOwogCiAJCQkvKiBFYWNoIEJDRCBkaWdpdCBpcyBvbmUgbnliYmxlIHdpZGUgKi8KIAotCQkJZm9yIChpID0gMDsgKGkgPCBhY3BpX2dibF9pbnRlZ2VyX255YmJsZV93aWR0aCkgJiYgKGRpZ2l0ID4gMCk7IGkrKykgewotCQkJCSh2b2lkKSBhY3BpX3V0X3Nob3J0X2RpdmlkZSAoZGlnaXQsIDEwLCAmZGlnaXQsICZ0ZW1wMzIpOworCQkJZm9yIChpID0gMDsKKwkJCSAgICAgKGkgPCBhY3BpX2dibF9pbnRlZ2VyX255YmJsZV93aWR0aCkgJiYgKGRpZ2l0ID4gMCk7CisJCQkgICAgIGkrKykgeworCQkJCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKGRpZ2l0LCAxMCwgJmRpZ2l0LAorCQkJCQkJCSAgICZ0ZW1wMzIpOwogCiAJCQkJLyoKIAkJCQkgKiBJbnNlcnQgdGhlIEJDRCBkaWdpdCB0aGF0IHJlc2lkZXMgaW4gdGhlCiAJCQkJICogcmVtYWluZGVyIGZyb20gYWJvdmUKIAkJCQkgKi8KLQkJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSB8PSAoKChhY3BpX2ludGVnZXIpIHRlbXAzMikgPDwKLQkJCQkJCSAgIEFDUElfTVVMXzQgKGkpKTsKKwkJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSB8PQorCQkJCSAgICAoKChhY3BpX2ludGVnZXIpIHRlbXAzMikgPDwgQUNQSV9NVUxfNChpKSk7CiAJCQl9CiAKIAkJCS8qIE92ZXJmbG93IGlmIHRoZXJlIGlzIGFueSBkYXRhIGxlZnQgaW4gRGlnaXQgKi8KIAogCQkJaWYgKGRpZ2l0ID4gMCkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiSW50ZWdlciB0b28gbGFyZ2UgdG8gY29udmVydCB0byBCQ0Q6ICU4LjhYJTguOFhcbiIsCi0JCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAob3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSkpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiSW50ZWdlciB0b28gbGFyZ2UgdG8gY29udmVydCB0byBCQ0Q6ICU4LjhYJTguOFhcbiIsCisJCQkJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChvcGVyYW5kCisJCQkJCQkJCSAgICAgWzBdLT4KKwkJCQkJCQkJICAgICBpbnRlZ2VyLgorCQkJCQkJCQkgICAgIHZhbHVlKSkpOwogCQkJCXN0YXR1cyA9IEFFX0FNTF9OVU1FUklDX09WRVJGTE9XOwogCQkJCWdvdG8gY2xlYW51cDsKIAkJCX0KIAkJCWJyZWFrOwogCi0KLQkJY2FzZSBBTUxfQ09ORF9SRUZfT0ZfT1A6ICAgICAgICAvKiBjb25kX3JlZl9vZiAoc291cmNlX29iamVjdCwgUmVzdWx0KSAqLworCQljYXNlIEFNTF9DT05EX1JFRl9PRl9PUDoJLyogY29uZF9yZWZfb2YgKHNvdXJjZV9vYmplY3QsIFJlc3VsdCkgKi8KIAogCQkJLyoKIAkJCSAqIFRoaXMgb3AgaXMgYSBsaXR0bGUgc3RyYW5nZSBiZWNhdXNlIHRoZSBpbnRlcm5hbCByZXR1cm4gdmFsdWUgaXMKIAkJCSAqIGRpZmZlcmVudCB0aGFuIHRoZSByZXR1cm4gdmFsdWUgc3RvcmVkIGluIHRoZSByZXN1bHQgZGVzY3JpcHRvcgogCQkJICogKFRoZXJlIGFyZSByZWFsbHkgdHdvIHJldHVybiB2YWx1ZXMpCiAJCQkgKi8KLQkJCWlmICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb3BlcmFuZFswXSA9PSBhY3BpX2dibF9yb290X25vZGUpIHsKKwkJCWlmICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvcGVyYW5kWzBdID09CisJCQkgICAgYWNwaV9nYmxfcm9vdF9ub2RlKSB7CiAJCQkJLyoKIAkJCQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIG9iamVjdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbmFtZXNwYWNlLAogCQkJCSAqIHJldHVybiBGQUxTRQpAQCAtNDUxLDM4ICs0MjMsMzggQEAKIAogCQkJLyogR2V0IHRoZSBvYmplY3QgcmVmZXJlbmNlLCBzdG9yZSBpdCwgYW5kIHJlbW92ZSBvdXIgcmVmZXJlbmNlICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UgKG9wZXJhbmRbMF0sCi0JCQkJCSAmcmV0dXJuX2Rlc2MyLCB3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IGFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2Uob3BlcmFuZFswXSwKKwkJCQkJCQkgICAgICAmcmV0dXJuX2Rlc2MyLAorCQkJCQkJCSAgICAgIHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJZ290byBjbGVhbnVwOwogCQkJfQogCi0JCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChyZXR1cm5fZGVzYzIsIG9wZXJhbmRbMV0sIHdhbGtfc3RhdGUpOwotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChyZXR1cm5fZGVzYzIpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X3N0b3JlKHJldHVybl9kZXNjMiwgb3BlcmFuZFsxXSwgd2Fsa19zdGF0ZSk7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MyKTsKIAogCQkJLyogVGhlIG9iamVjdCBleGlzdHMgaW4gdGhlIG5hbWVzcGFjZSwgcmV0dXJuIFRSVUUgKi8KIAogCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBBQ1BJX0lOVEVHRVJfTUFYOwogCQkJZ290byBjbGVhbnVwOwogCi0KIAkJZGVmYXVsdDoKIAkJCS8qIE5vIG90aGVyIG9wY29kZXMgZ2V0IGhlcmUgKi8KIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCi0KLQljYXNlIEFNTF9TVE9SRV9PUDogICAgICAgICAgICAgIC8qIFN0b3JlIChTb3VyY2UsIFRhcmdldCkgKi8KKwljYXNlIEFNTF9TVE9SRV9PUDoJLyogU3RvcmUgKFNvdXJjZSwgVGFyZ2V0KSAqLwogCiAJCS8qCiAJCSAqIEEgc3RvcmUgb3BlcmFuZCBpcyB0eXBpY2FsbHkgYSBudW1iZXIsIHN0cmluZywgYnVmZmVyIG9yIGx2YWx1ZQogCQkgKiBCZSBjYXJlZnVsIGFib3V0IGRlbGV0aW5nIHRoZSBzb3VyY2Ugb2JqZWN0LAogCQkgKiBzaW5jZSB0aGUgb2JqZWN0IGl0c2VsZiBtYXkgaGF2ZSBiZWVuIHN0b3JlZC4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUgKG9wZXJhbmRbMF0sIG9wZXJhbmRbMV0sIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUob3BlcmFuZFswXSwgb3BlcmFuZFsxXSwgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBTdG9yZSBhbHJlYWR5IHByb2R1Y2VkIGEgcmV0dXJuIG9iamVjdCAqLwpAQCAtNDk1LDkyICs0NjcsODQgQEAKIAkJCSAqIGNhbmNlbCBvdXQsIGFuZCB3ZSBzaW1wbHkgZG9uJ3QgZG8gYW55dGhpbmcuCiAJCQkgKi8KIAkJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSBvcGVyYW5kWzBdOwotCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSBOVUxMOyAvKiBQcmV2ZW50IGRlbGV0aW9uICovCisJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9IE5VTEw7CS8qIFByZXZlbnQgZGVsZXRpb24gKi8KIAkJfQotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCisJCS8qCisJCSAqIEFDUEkgMi4wIE9wY29kZXMKKwkJICovCisJY2FzZSBBTUxfQ09QWV9PUDoJLyogQ29weSAoU291cmNlLCBUYXJnZXQpICovCiAKLQkvKgotCSAqIEFDUEkgMi4wIE9wY29kZXMKLQkgKi8KLQljYXNlIEFNTF9DT1BZX09QOiAgICAgICAgICAgICAgIC8qIENvcHkgKFNvdXJjZSwgVGFyZ2V0KSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QgKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYywKLQkJCQkgd2Fsa19zdGF0ZSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0KG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYywKKwkJCQkJCSAgICB3YWxrX3N0YXRlKTsKIAkJYnJlYWs7CiAKKwljYXNlIEFNTF9UT19ERUNTVFJJTkdfT1A6CS8qIHRvX2RlY2ltYWxfc3RyaW5nIChEYXRhLCBSZXN1bHQpICovCiAKLQljYXNlIEFNTF9UT19ERUNTVFJJTkdfT1A6ICAgICAgIC8qIHRvX2RlY2ltYWxfc3RyaW5nIChEYXRhLCBSZXN1bHQpICovCi0KLQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyAob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAotCQkJCSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfREVDSU1BTCk7CisJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19zdHJpbmcob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAorCQkJCQkJICAgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0RFQ0lNQUwpOwogCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgewogCQkJLyogTm8gY29udmVyc2lvbiBwZXJmb3JtZWQsIGFkZCByZWYgdG8gaGFuZGxlIHJldHVybiB2YWx1ZSAqLwotCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChyZXR1cm5fZGVzYyk7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCQl9CiAJCWJyZWFrOwogCisJY2FzZSBBTUxfVE9fSEVYU1RSSU5HX09QOgkvKiB0b19oZXhfc3RyaW5nIChEYXRhLCBSZXN1bHQpICovCiAKLQljYXNlIEFNTF9UT19IRVhTVFJJTkdfT1A6ICAgICAgIC8qIHRvX2hleF9zdHJpbmcgKERhdGEsIFJlc3VsdCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nIChvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MsCi0JCQkJIEFDUElfRVhQTElDSVRfQ09OVkVSVF9IRVgpOworCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYywKKwkJCQkJCSAgIEFDUElfRVhQTElDSVRfQ09OVkVSVF9IRVgpOwogCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgewogCQkJLyogTm8gY29udmVyc2lvbiBwZXJmb3JtZWQsIGFkZCByZWYgdG8gaGFuZGxlIHJldHVybiB2YWx1ZSAqLwotCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChyZXR1cm5fZGVzYyk7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCQl9CiAJCWJyZWFrOwogCisJY2FzZSBBTUxfVE9fQlVGRkVSX09QOgkvKiB0b19idWZmZXIgKERhdGEsIFJlc3VsdCkgKi8KIAotCWNhc2UgQU1MX1RPX0JVRkZFUl9PUDogICAgICAgICAgLyogdG9fYnVmZmVyIChEYXRhLCBSZXN1bHQpICovCi0KLQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlciAob3BlcmFuZFswXSwgJnJldHVybl9kZXNjKTsKKwkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcihvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MpOwogCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgewogCQkJLyogTm8gY29udmVyc2lvbiBwZXJmb3JtZWQsIGFkZCByZWYgdG8gaGFuZGxlIHJldHVybiB2YWx1ZSAqLwotCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChyZXR1cm5fZGVzYyk7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCQl9CiAJCWJyZWFrOwogCisJY2FzZSBBTUxfVE9fSU5URUdFUl9PUDoJLyogdG9faW50ZWdlciAoRGF0YSwgUmVzdWx0KSAqLwogCi0JY2FzZSBBTUxfVE9fSU5URUdFUl9PUDogICAgICAgICAvKiB0b19pbnRlZ2VyIChEYXRhLCBSZXN1bHQpICovCi0KLQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIgKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYywKLQkJCQkgQUNQSV9BTllfQkFTRSk7CisJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYywKKwkJCQkJCSAgICBBQ1BJX0FOWV9CQVNFKTsKIAkJaWYgKHJldHVybl9kZXNjID09IG9wZXJhbmRbMF0pIHsKIAkJCS8qIE5vIGNvbnZlcnNpb24gcGVyZm9ybWVkLCBhZGQgcmVmIHRvIGhhbmRsZSByZXR1cm4gdmFsdWUgKi8KLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAocmV0dXJuX2Rlc2MpOworCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKIAkJfQogCQlicmVhazsKIAotCi0JY2FzZSBBTUxfU0hJRlRfTEVGVF9CSVRfT1A6ICAgICAvKiBzaGlmdF9sZWZ0X2JpdCAoU291cmNlLCBiaXRfbnVtKSAqLwotCWNhc2UgQU1MX1NISUZUX1JJR0hUX0JJVF9PUDogICAgLyogc2hpZnRfcmlnaHRfYml0IChTb3VyY2UsIGJpdF9udW0pICovCisJY2FzZSBBTUxfU0hJRlRfTEVGVF9CSVRfT1A6CS8qIHNoaWZ0X2xlZnRfYml0IChTb3VyY2UsIGJpdF9udW0pICovCisJY2FzZSBBTUxfU0hJRlRfUklHSFRfQklUX09QOgkvKiBzaGlmdF9yaWdodF9iaXQgKFNvdXJjZSwgYml0X251bSkgKi8KIAogCQkvKiBUaGVzZSBhcmUgdHdvIG9ic29sZXRlIG9wY29kZXMgKi8KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSIlcyBpcyBvYnNvbGV0ZSBhbmQgbm90IGltcGxlbWVudGVkXG4iLAotCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICIlcyBpcyBvYnNvbGV0ZSBhbmQgbm90IGltcGxlbWVudGVkXG4iLAorCQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSkpOwogCQlzdGF0dXMgPSBBRV9TVVBQT1JUOwogCQlnb3RvIGNsZWFudXA7CiAKKwlkZWZhdWx0OgkJLyogVW5rbm93biBvcGNvZGUgKi8KIAotCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5rbm93biBvcGNvZGUgKi8KLQotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV8xQV8xVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCi0JCQl3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8xQV8xVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJLyogU3RvcmUgdGhlIHJldHVybiB2YWx1ZSBjb21wdXRlZCBhYm92ZSBpbnRvIHRoZSB0YXJnZXQgb2JqZWN0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZSAocmV0dXJuX2Rlc2MsIG9wZXJhbmRbMV0sIHdhbGtfc3RhdGUpOworCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlKHJldHVybl9kZXNjLCBvcGVyYW5kWzFdLCB3YWxrX3N0YXRlKTsKIAl9CiAKLQotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAKIAlpZiAoIXdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKIAkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IHJldHVybl9kZXNjOwpAQCAtNTg4LDE0ICs1NTIsMTMgQEAKIAogCS8qIERlbGV0ZSByZXR1cm4gb2JqZWN0IG9uIGVycm9yICovCiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocmV0dXJuX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8xQV8wVF8xUgpAQCAtNjA4LDI4ICs1NzEsMjQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfMUFfMFRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8xQV8wVF8xUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRlbXBfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYyA9IE5VTEw7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0ZW1wX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXUzMiB0eXBlOworCWFjcGlfaW50ZWdlciB2YWx1ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMUFfMFRfMVIiLAotCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzFBXzBUXzFSIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KIAogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7Ci0JY2FzZSBBTUxfTE5PVF9PUDogICAgICAgICAgICAgICAvKiBMTm90IChPcGVyYW5kKSAqLworCWNhc2UgQU1MX0xOT1RfT1A6CS8qIExOb3QgKE9wZXJhbmQpICovCiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC02NDQsMTUgKzYwMywxNCBAQAogCQl9CiAJCWJyZWFrOwogCi0KLQljYXNlIEFNTF9ERUNSRU1FTlRfT1A6ICAgICAgICAgIC8qIERlY3JlbWVudCAoT3BlcmFuZCkgICovCi0JY2FzZSBBTUxfSU5DUkVNRU5UX09QOiAgICAgICAgICAvKiBJbmNyZW1lbnQgKE9wZXJhbmQpICAqLworCWNhc2UgQU1MX0RFQ1JFTUVOVF9PUDoJLyogRGVjcmVtZW50IChPcGVyYW5kKSAgKi8KKwljYXNlIEFNTF9JTkNSRU1FTlRfT1A6CS8qIEluY3JlbWVudCAoT3BlcmFuZCkgICovCiAKIAkJLyoKIAkJICogQ3JlYXRlIGEgbmV3IGludGVnZXIuICBDYW4ndCBqdXN0IGdldCB0aGUgYmFzZSBpbnRlZ2VyIGFuZAogCQkgKiBpbmNyZW1lbnQgaXQgYmVjYXVzZSBpdCBtYXkgYmUgYW4gQXJnIG9yIEZpZWxkLgogCQkgKi8KLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC02NjMsMTAgKzYyMSwxMSBAQAogCQkgKiBOUyBOb2RlIG9yIGFuIGludGVybmFsIG9iamVjdC4KIAkJICovCiAJCXRlbXBfZGVzYyA9IG9wZXJhbmRbMF07Ci0JCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHRlbXBfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgeworCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHRlbXBfZGVzYykgPT0KKwkJICAgIEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKIAkJCS8qIEludGVybmFsIHJlZmVyZW5jZSBvYmplY3QgLSBwcmV2ZW50IGRlbGV0aW9uICovCiAKLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAodGVtcF9kZXNjKTsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSh0ZW1wX2Rlc2MpOwogCQl9CiAKIAkJLyoKQEAgLTY3NiwxMSArNjM1LDE1IEBACiAJCSAqIE5PVEU6ICBXZSB1c2UgTE5PVF9PUCBoZXJlIGluIG9yZGVyIHRvIGZvcmNlIHJlc29sdXRpb24gb2YgdGhlCiAJCSAqIHJlZmVyZW5jZSBvcGVyYW5kIHRvIGFuIGFjdHVhbCBpbnRlZ2VyLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzIChBTUxfTE5PVF9PUCwgJnRlbXBfZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiJXM6IGJhZCBvcGVyYW5kKHMpICVzXG4iLAotCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMoQU1MX0xOT1RfT1AsICZ0ZW1wX2Rlc2MsCisJCQkJCSAgICAgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiJXM6IGJhZCBvcGVyYW5kKHMpICVzXG4iLAorCQkJCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPgorCQkJCQkJCQkgIG9wY29kZSksCisJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAogCQkJZ290byBjbGVhbnVwOwogCQl9CkBAIC02OTAsMjUgKzY1MywyNSBAQAogCQkgKiBQZXJmb3JtIHRoZSBhY3R1YWwgaW5jcmVtZW50IG9yIGRlY3JlbWVudAogCQkgKi8KIAkJaWYgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfSU5DUkVNRU5UX09QKSB7Ci0JCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IHRlbXBfZGVzYy0+aW50ZWdlci52YWx1ZSArMTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gdGVtcF9kZXNjLT5pbnRlZ2VyLnZhbHVlIC0xOworCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPQorCQkJICAgIHRlbXBfZGVzYy0+aW50ZWdlci52YWx1ZSArIDE7CisJCX0gZWxzZSB7CisJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9CisJCQkgICAgdGVtcF9kZXNjLT5pbnRlZ2VyLnZhbHVlIC0gMTsKIAkJfQogCiAJCS8qIEZpbmlzaGVkIHdpdGggdGhpcyBJbnRlZ2VyIG9iamVjdCAqLwogCi0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAodGVtcF9kZXNjKTsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHRlbXBfZGVzYyk7CiAKIAkJLyoKIAkJICogU3RvcmUgdGhlIHJlc3VsdCBiYWNrIChpbmRpcmVjdGx5KSB0aHJvdWdoIHRoZSBvcmlnaW5hbAogCQkgKiBSZWZlcmVuY2Ugb2JqZWN0CiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChyZXR1cm5fZGVzYywgb3BlcmFuZFswXSwgd2Fsa19zdGF0ZSk7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MsIG9wZXJhbmRbMF0sIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAotCi0JY2FzZSBBTUxfVFlQRV9PUDogICAgICAgICAgICAgICAvKiBvYmplY3RfdHlwZSAoc291cmNlX29iamVjdCkgKi8KKwljYXNlIEFNTF9UWVBFX09QOgkvKiBvYmplY3RfdHlwZSAoc291cmNlX29iamVjdCkgKi8KIAogCQkvKgogCQkgKiBOb3RlOiBUaGUgb3BlcmFuZCBpcyBub3QgcmVzb2x2ZWQgYXQgdGhpcyBwb2ludCBiZWNhdXNlIHdlIHdhbnQgdG8KQEAgLTcxOSwxMyArNjgyLDE1IEBACiAKIAkJLyogR2V0IHRoZSB0eXBlIG9mIHRoZSBiYXNlIG9iamVjdCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZSAod2Fsa19zdGF0ZSwgb3BlcmFuZFswXSwgJnR5cGUsIE5VTEwpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUod2Fsa19zdGF0ZSwgb3BlcmFuZFswXSwgJnR5cGUsCisJCQkJCSAgICAgTlVMTCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byBjbGVhbnVwOwogCQl9CiAJCS8qIEFsbG9jYXRlIGEgZGVzY3JpcHRvciB0byBob2xkIHRoZSB0eXBlLiAqLwogCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byBjbGVhbnVwOwpAQCAtNzM0LDggKzY5OSw3IEBACiAJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gdHlwZTsKIAkJYnJlYWs7CiAKLQotCWNhc2UgQU1MX1NJWkVfT0ZfT1A6ICAgICAgICAgICAgLyogc2l6ZV9vZiAoc291cmNlX29iamVjdCkgKi8KKwljYXNlIEFNTF9TSVpFX09GX09QOgkvKiBzaXplX29mIChzb3VyY2Vfb2JqZWN0KSAqLwogCiAJCS8qCiAJCSAqIE5vdGU6IFRoZSBvcGVyYW5kIGlzIG5vdCByZXNvbHZlZCBhdCB0aGlzIHBvaW50IGJlY2F1c2Ugd2Ugd2FudCB0bwpAQCAtNzQ0LDkgKzcwOCwxMCBAQAogCiAJCS8qIEdldCB0aGUgYmFzZSBvYmplY3QgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUgKHdhbGtfc3RhdGUsCi0JCQkJIG9wZXJhbmRbMF0sICZ0eXBlLCAmdGVtcF9kZXNjKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUod2Fsa19zdGF0ZSwKKwkJCQkJCSAgb3BlcmFuZFswXSwgJnR5cGUsCisJCQkJCQkgICZ0ZW1wX2Rlc2MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCkBAIC03NzcsOSArNzQyLDkgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkic2l6ZV9vZiAtIE9wZXJhbmQgaXMgbm90IEJ1Zi9JbnQvU3RyL1BrZyAtIGZvdW5kIHR5cGUgJXNcbiIsCi0JCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlKSkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAic2l6ZV9vZiAtIE9wZXJhbmQgaXMgbm90IEJ1Zi9JbnQvU3RyL1BrZyAtIGZvdW5kIHR5cGUgJXNcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpKSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQkJZ290byBjbGVhbnVwOwogCQl9CkBAIC03ODgsNyArNzUzLDcgQEAKIAkJICogTm93IHRoYXQgd2UgaGF2ZSB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0LCBjcmVhdGUgYSByZXN1bHQKIAkJICogb2JqZWN0IHRvIGhvbGQgdGhlIHZhbHVlCiAJCSAqLwotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKQEAgLTc5NywyMiArNzYyLDIzIEBACiAJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gdmFsdWU7CiAJCWJyZWFrOwogCisJY2FzZSBBTUxfUkVGX09GX09QOgkvKiByZWZfb2YgKHNvdXJjZV9vYmplY3QpICovCiAKLQljYXNlIEFNTF9SRUZfT0ZfT1A6ICAgICAgICAgICAgIC8qIHJlZl9vZiAoc291cmNlX29iamVjdCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X2dldF9vYmplY3RfcmVmZXJlbmNlIChvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2dldF9vYmplY3RfcmVmZXJlbmNlKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYywKKwkJCQkJCSB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAkJYnJlYWs7CiAKLQotCWNhc2UgQU1MX0RFUkVGX09GX09QOiAgICAgICAgICAgLyogZGVyZWZfb2YgKG9ial9yZWZlcmVuY2UgfCBTdHJpbmcpICovCisJY2FzZSBBTUxfREVSRUZfT0ZfT1A6CS8qIGRlcmVmX29mIChvYmpfcmVmZXJlbmNlIHwgU3RyaW5nKSAqLwogCiAJCS8qIENoZWNrIGZvciBhIG1ldGhvZCBsb2NhbCBvciBhcmd1bWVudCwgb3Igc3RhbmRhbG9uZSBTdHJpbmcgKi8KIAotCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvcGVyYW5kWzBdKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob3BlcmFuZFswXSkpIHsKKwkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvcGVyYW5kWzBdKSAhPQorCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZFswXSkpIHsKIAkJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKIAkJCQkvKgogCQkJCSAqIFRoaXMgaXMgYSBkZXJlZl9vZiAobG9jYWxfeCB8IGFyZ194KQpAQCAtODI1LDExICs3OTEsMTIgQEAKIAogCQkJCQkvKiBTZXQgT3BlcmFuZFswXSB0byB0aGUgdmFsdWUgb2YgdGhlIGxvY2FsL2FyZyAqLwogCi0JCQkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlICgKLQkJCQkJCQkgb3BlcmFuZFswXS0+cmVmZXJlbmNlLm9wY29kZSwKLQkJCQkJCQkgb3BlcmFuZFswXS0+cmVmZXJlbmNlLm9mZnNldCwKLQkJCQkJCQkgd2Fsa19zdGF0ZSwgJnRlbXBfZGVzYyk7Ci0JCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCQkJc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlCisJCQkJCSAgICAob3BlcmFuZFswXS0+cmVmZXJlbmNlLm9wY29kZSwKKwkJCQkJICAgICBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2Zmc2V0LAorCQkJCQkgICAgIHdhbGtfc3RhdGUsICZ0ZW1wX2Rlc2MpOworCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkJCWdvdG8gY2xlYW51cDsKIAkJCQkJfQogCkBAIC04MzcsNyArODA0LDcgQEAKIAkJCQkJICogRGVsZXRlIG91ciByZWZlcmVuY2UgdG8gdGhlIGlucHV0IG9iamVjdCBhbmQKIAkJCQkJICogcG9pbnQgdG8gdGhlIG9iamVjdCBqdXN0IHJldHJpZXZlZAogCQkJCQkgKi8KLQkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvcGVyYW5kWzBdKTsKKwkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9wZXJhbmRbMF0pOwogCQkJCQlvcGVyYW5kWzBdID0gdGVtcF9kZXNjOwogCQkJCQlicmVhazsKIApAQCAtODQ1LDggKzgxMiw5IEBACiAKIAkJCQkJLyogR2V0IHRoZSBvYmplY3QgdG8gd2hpY2ggdGhlIHJlZmVyZW5jZSByZWZlcnMgKi8KIAotCQkJCQl0ZW1wX2Rlc2MgPSBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2JqZWN0OwotCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9wZXJhbmRbMF0pOworCQkJCQl0ZW1wX2Rlc2MgPQorCQkJCQkgICAgb3BlcmFuZFswXS0+cmVmZXJlbmNlLm9iamVjdDsKKwkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9wZXJhbmRbMF0pOwogCQkJCQlvcGVyYW5kWzBdID0gdGVtcF9kZXNjOwogCQkJCQlicmVhazsKIApAQCAtODU3LDcgKzgyNSw2IEBACiAJCQkJfQogCQkJCWJyZWFrOwogCi0KIAkJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAogCQkJCS8qCkBAIC04NjgsMjIgKzgzNSwyOCBAQAogCQkJCSAqIDIpIERlcmVmZXJlbmNlIHRoZSBub2RlIHRvIGFuIGFjdHVhbCBvYmplY3QuICBDb3VsZCBiZSBhCiAJCQkJICogICAgRmllbGQsIHNvIHdlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgbm9kZSB0byBhIHZhbHVlLgogCQkJCSAqLwotCQkJCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aCAob3BlcmFuZFswXS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJCQkgd2Fsa19zdGF0ZS0+c2NvcGVfaW5mby0+c2NvcGUubm9kZSwKLQkJCQkJCSBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCi0JCQkJCQkgQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoCi0JCQkJCQkJCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCAmcmV0dXJuX2Rlc2MpKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoKG9wZXJhbmRbMF0tPnN0cmluZy4KKwkJCQkJCQkgICAgIHBvaW50ZXIsCisJCQkJCQkJICAgICB3YWxrX3N0YXRlLT4KKwkJCQkJCQkgICAgIHNjb3BlX2luZm8tPnNjb3BlLgorCQkJCQkJCSAgICAgbm9kZSwKKwkJCQkJCQkgICAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwKKwkJCQkJCQkgICAgIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIKKwkJCQkJCQkgICAgIChzdHJ1Y3QKKwkJCQkJCQkgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlLAorCQkJCQkJCSAgICAgICZyZXR1cm5fZGVzYykpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCQlnb3RvIGNsZWFudXA7CiAJCQkJfQogCi0JCQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUgKAotCQkJCQkJICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSICgKLQkJCQkJCQkJIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCAmcmV0dXJuX2Rlc2MpLAotCQkJCQkJCQl3YWxrX3N0YXRlKTsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZQorCQkJCSAgICAoQUNQSV9DQVNUX0lORElSRUNUX1BUUgorCQkJCSAgICAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCAmcmV0dXJuX2Rlc2MpLAorCQkJCSAgICAgd2Fsa19zdGF0ZSk7CiAJCQkJZ290byBjbGVhbnVwOwogCi0KIAkJCWRlZmF1bHQ6CiAKIAkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwpAQCAtODkzLDE3ICs4NjYsMjAgQEAKIAogCQkvKiBPcGVyYW5kWzBdIG1heSBoYXZlIGNoYW5nZWQgZnJvbSB0aGUgY29kZSBhYm92ZSAqLwogCi0JCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9wZXJhbmRbMF0pID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob3BlcmFuZFswXSkgPT0KKwkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CiAJCQkvKgogCQkJICogVGhpcyBpcyBhIGRlcmVmX29mIChvYmplY3RfcmVmZXJlbmNlKQogCQkJICogR2V0IHRoZSBhY3R1YWwgb2JqZWN0IGZyb20gdGhlIE5vZGUgKFRoaXMgaXMgdGhlIGRlcmVmZXJlbmNlKS4KIAkJCSAqIFRoaXMgY2FzZSBtYXkgb25seSBoYXBwZW4gd2hlbiBhIGxvY2FsX3ggb3IgYXJnX3ggaXMKIAkJCSAqIGRlcmVmZXJlbmNlZCBhYm92ZS4KIAkJCSAqLwotCQkJcmV0dXJuX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKAotCQkJCQkgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvcGVyYW5kWzBdKTsKLQkJfQotCQllbHNlIHsKKwkJCXJldHVybl9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KChzdHJ1Y3QKKwkJCQkJCQkJICAgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJCQkgICAqKQorCQkJCQkJCQkgIG9wZXJhbmRbMF0pOworCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKKwkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBUaGlzIG11c3QgYmUgYSByZWZlcmVuY2Ugb2JqZWN0IHByb2R1Y2VkIGJ5IGVpdGhlciB0aGUKIAkJCSAqIEluZGV4KCkgb3IgcmVmX29mKCkgb3BlcmF0b3IKQEAgLTkxOCw3ICs4OTQsOCBAQAogCQkJCXN3aXRjaCAob3BlcmFuZFswXS0+cmVmZXJlbmNlLnRhcmdldF90eXBlKSB7CiAJCQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgogCi0JCQkJCXRlbXBfZGVzYyA9IG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vYmplY3Q7CisJCQkJCXRlbXBfZGVzYyA9CisJCQkJCSAgICBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2JqZWN0OwogCiAJCQkJCS8qCiAJCQkJCSAqIENyZWF0ZSBhIG5ldyBvYmplY3QgdGhhdCBjb250YWlucyBvbmUgZWxlbWVudCBvZiB0aGUKQEAgLTkyOCw3ICs5MDUsOSBAQAogCQkJCQkgKiBzdWItYnVmZmVyIG9mIHRoZSBtYWluIGJ1ZmZlciwgaXQgaXMgb25seSBhIHBvaW50ZXIgdG8gYQogCQkJCQkgKiBzaW5nbGUgZWxlbWVudCAoYnl0ZSkgb2YgdGhlIGJ1ZmZlciEKIAkJCQkJICovCi0JCQkJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJCQkJCXJldHVybl9kZXNjID0KKwkJCQkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdAorCQkJCQkgICAgKEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJCQkJaWYgKCFyZXR1cm5fZGVzYykgewogCQkJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJCQkJZ290byBjbGVhbnVwOwpAQCAtOTQwLDY2ICs5MTksNjMgQEAKIAkJCQkJICogcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgaXRzZWxmLgogCQkJCQkgKi8KIAkJCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPQotCQkJCQkJdGVtcF9kZXNjLT5idWZmZXIucG9pbnRlcltvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2Zmc2V0XTsKKwkJCQkJICAgIHRlbXBfZGVzYy0+YnVmZmVyLgorCQkJCQkgICAgcG9pbnRlcltvcGVyYW5kWzBdLT5yZWZlcmVuY2UuCisJCQkJCQkgICAgb2Zmc2V0XTsKIAkJCQkJYnJlYWs7CiAKLQogCQkJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAKIAkJCQkJLyoKIAkJCQkJICogUmV0dXJuIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgb2YgdGhlIHBhY2thZ2UuICBXZSBtdXN0CiAJCQkJCSAqIGFkZCBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QsIGhvd2V2ZXIuCiAJCQkJCSAqLwotCQkJCQlyZXR1cm5fZGVzYyA9ICoob3BlcmFuZFswXS0+cmVmZXJlbmNlLndoZXJlKTsKLQkJCQkJaWYgKCFyZXR1cm5fZGVzYykgewotCQkJCQkJLyoKLQkJCQkJCSAqIFdlIGNhbid0IHJldHVybiBhIE5VTEwgZGVyZWZlcmVuY2VkIHZhbHVlLiAgVGhpcyBpcwotCQkJCQkJICogYW4gdW5pbml0aWFsaXplZCBwYWNrYWdlIGVsZW1lbnQgYW5kIGlzIHRodXMgYQotCQkJCQkJICogc2V2ZXJlIGVycm9yLgotCQkJCQkJICovCi0JCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCQkiTlVMTCBwYWNrYWdlIGVsZW1lbnQgb2JqICVwXG4iLAotCQkJCQkJCW9wZXJhbmRbMF0pKTsKLQkJCQkJCXN0YXR1cyA9IEFFX0FNTF9VTklOSVRJQUxJWkVEX0VMRU1FTlQ7Ci0JCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJCXJldHVybl9kZXNjID0KKwkJCQkJICAgICoob3BlcmFuZFswXS0+cmVmZXJlbmNlLndoZXJlKTsKKwkJCQkJaWYgKHJldHVybl9kZXNjKSB7CisJCQkJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UKKwkJCQkJCSAgICAocmV0dXJuX2Rlc2MpOwogCQkJCQl9CiAKLQkJCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChyZXR1cm5fZGVzYyk7CiAJCQkJCWJyZWFrOwogCi0KIAkJCQlkZWZhdWx0OgogCi0JCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJIlVua25vd24gSW5kZXggdGFyZ2V0X3R5cGUgJVggaW4gb2JqICVwXG4iLAotCQkJCQkJb3BlcmFuZFswXS0+cmVmZXJlbmNlLnRhcmdldF90eXBlLCBvcGVyYW5kWzBdKSk7CisJCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkJICAiVW5rbm93biBJbmRleCB0YXJnZXRfdHlwZSAlWCBpbiBvYmogJXBcbiIsCisJCQkJCQkJICBvcGVyYW5kWzBdLT5yZWZlcmVuY2UuCisJCQkJCQkJICB0YXJnZXRfdHlwZSwKKwkJCQkJCQkgIG9wZXJhbmRbMF0pKTsKIAkJCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJCQkJZ290byBjbGVhbnVwOwogCQkJCX0KIAkJCQlicmVhazsKIAotCiAJCQljYXNlIEFNTF9SRUZfT0ZfT1A6CiAKIAkJCQlyZXR1cm5fZGVzYyA9IG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vYmplY3Q7CiAKLQkJCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChyZXR1cm5fZGVzYykgPT0KLQkJCQkJCUFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShyZXR1cm5fZGVzYykgPT0KKwkJCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKIAotCQkJCQlyZXR1cm5fZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoCi0JCQkJCQkJICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgcmV0dXJuX2Rlc2MpOworCQkJCQlyZXR1cm5fZGVzYyA9CisJCQkJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoKHN0cnVjdAorCQkJCQkJCQkJIGFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCQkJCSAqKQorCQkJCQkJCQkJcmV0dXJuX2Rlc2MpOwogCQkJCX0KIAogCQkJCS8qIEFkZCBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ISAqLwogCi0JCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChyZXR1cm5fZGVzYyk7CisJCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKIAkJCQlicmVhazsKIAotCiAJCQlkZWZhdWx0OgotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiVW5rbm93biBvcGNvZGUgaW4gcmVmKCVwKSAtICVYXG4iLAotCQkJCQlvcGVyYW5kWzBdLCBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub3Bjb2RlKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIlVua25vd24gb3Bjb2RlIGluIHJlZiglcCkgLSAlWFxuIiwKKwkJCQkJCSAgb3BlcmFuZFswXSwKKwkJCQkJCSAgb3BlcmFuZFswXS0+cmVmZXJlbmNlLgorCQkJCQkJICBvcGNvZGUpKTsKIAogCQkJCXN0YXR1cyA9IEFFX1RZUEU7CiAJCQkJZ290byBjbGVhbnVwOwpAQCAtMTAwNywyNSArOTgzLDIxIEBACiAJCX0KIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9leF9vcGNvZGVfMUFfMFRfMVI6IFVua25vd24gb3Bjb2RlICVYXG4iLAotCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9vcGNvZGVfMUFfMFRfMVI6IFVua25vd24gb3Bjb2RlICVYXG4iLCB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAKIAkvKiBEZWxldGUgcmV0dXJuIG9iamVjdCBvbiBlcnJvciAqLwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHJldHVybl9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKIAl9CiAKIAl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzIuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMi5jCmluZGV4IDc0MjkwMzIuLjhkNzBjNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMi5jCkBAIC00MSwxNyArNDEsMTQgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhvcGFyZzIiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJleG9wYXJnMiIpCiAKIC8qIQogICogTmFtaW5nIGNvbnZlbnRpb24gZm9yIEFNTCBpbnRlcnByZXRlciBleGVjdXRpb24gcm91dGluZXMuCkBAIC03NCw4ICs3MSw2IEBACiAgKiBUaGUgQWNwaUV4T3Bjb2RlKiBmdW5jdGlvbnMgYXJlIGNhbGxlZCB2aWEgdGhlIERpc3BhdGNoZXIgY29tcG9uZW50IHdpdGgKICAqIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmRzLgogISovCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfMkFfMFRfMFIKQEAgLTkwLDI5ICs4NSwyNCBAQAogICogQUxMT0NBVElPTjogIERlbGV0ZXMgYm90aCBvcGVyYW5kcwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8yQV8wVF8wUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzJBXzBUXzBSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdTMyIHZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8yQV8wVF8wUiIsCi0JCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzJBXzBUXzBSIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCS8qIEV4YW1pbmUgdGhlIG9wY29kZSAqLwogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9OT1RJRllfT1A6ICAgICAgICAgLyogTm90aWZ5IChub3RpZnlfb2JqZWN0LCBub3RpZnlfdmFsdWUpICovCisJY2FzZSBBTUxfTk9USUZZX09QOgkvKiBOb3RpZnkgKG5vdGlmeV9vYmplY3QsIG5vdGlmeV92YWx1ZSkgKi8KIAogCQkvKiBUaGUgZmlyc3Qgb3BlcmFuZCBpcyBhIG5hbWVzcGFjZSBub2RlICovCiAKLQkJbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvcGVyYW5kWzBdOworCQlub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb3BlcmFuZFswXTsKIAogCQkvKiBTZWNvbmQgdmFsdWUgaXMgdGhlIG5vdGlmeSB2YWx1ZSAqLwogCkBAIC0xMjAsMTUgKzExMCwxNCBAQAogCiAJCS8qIEFyZSBub3RpZmllcyBhbGxvd2VkIG9uIHRoaXMgb2JqZWN0PyAqLwogCi0JCWlmICghYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0IChub2RlKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJVbmV4cGVjdGVkIG5vdGlmeSBvYmplY3QgdHlwZSBbJXNdXG4iLAotCQkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKG5vZGUtPnR5cGUpKSk7CisJCWlmICghYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0KG5vZGUpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJVbmV4cGVjdGVkIG5vdGlmeSBvYmplY3QgdHlwZSBbJXNdXG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShub2RlLT50eXBlKSkpOwogCiAJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQkJYnJlYWs7CiAJCX0KLQogI2lmZGVmIEFDUElfR1BFX05PVElGWV9DSEVDSwogCQkvKgogCQkgKiBHUEUgbWV0aG9kIHdha2Uvbm90aWZ5IGNoZWNrLiAgSGVyZSwgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCB3ZQpAQCAtMTQ0LDEyICsxMzMsMTQgQEAKIAkJICogSWYgYWxsIHRocmVlIGNhc2VzIGFyZSB0cnVlLCB0aGlzIGlzIGEgd2FrZS1vbmx5IEdQRSB0aGF0IHNob3VsZAogCQkgKiBiZSBkaXNhYmxlZCBhdCBydW50aW1lLgogCQkgKi8KLQkJaWYgKHZhbHVlID09IDIpICAgICAvKiBkZXZpY2Vfd2FrZSAqLyB7Ci0JCQlzdGF0dXMgPSBhY3BpX2V2X2NoZWNrX2Zvcl93YWtlX29ubHlfZ3BlICh3YWxrX3N0YXRlLT5ncGVfZXZlbnRfaW5mbyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCWlmICh2YWx1ZSA9PSAyKSB7CS8qIGRldmljZV93YWtlICovCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUod2Fsa19zdGF0ZS0+CisJCQkJCQkJICAgIGdwZV9ldmVudF9pbmZvKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCS8qIEFFX1dBS0VfT05MWV9HUEUgb25seSBlcnJvciwgbWVhbnMgaWdub3JlIHRoaXMgbm90aWZ5ICovCiAKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKQorCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSykKIAkJCX0KIAkJfQogI2VuZGlmCkBAIC0xNjEsMjEgKzE1MiwxOCBAQAogCQkgKiBmcm9tIHRoaXMgdGhyZWFkIC0tIGJlY2F1c2UgaGFuZGxlcnMgbWF5IGluIHR1cm4gcnVuIG90aGVyCiAJCSAqIGNvbnRyb2wgbWV0aG9kcy4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXZfcXVldWVfbm90aWZ5X3JlcXVlc3QgKG5vZGUsIHZhbHVlKTsKKwkJc3RhdHVzID0gYWNwaV9ldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdChub2RlLCB2YWx1ZSk7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfZXhfb3Bjb2RlXzJBXzBUXzBSOiBVbmtub3duIG9wY29kZSAlWFxuIiwKLQkJCQl3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8yQV8wVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfMkFfMlRfMVIKQEAgLTE4OSwxOSArMTc3LDE1IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzJBXzJUXzFSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMkFfMlRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYzEgPSBOVUxMOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjMiA9IE5VTEw7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MxID0gTlVMTDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzIgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMkFfMlRfMVIiLAotCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzJBXzJUXzFSIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCS8qIEV4ZWN1dGUgdGhlIG9wY29kZSAqLwogCkBAIC0yMTAsMTMgKzE5NCwxNSBAQAogCiAJCS8qIERpdmlkZSAoRGl2aWRlbmQsIERpdmlzb3IsIHJlbWFpbmRlcl9yZXN1bHQgcXVvdGllbnRfcmVzdWx0KSAqLwogCi0JCXJldHVybl9kZXNjMSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlyZXR1cm5fZGVzYzEgPQorCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJaWYgKCFyZXR1cm5fZGVzYzEpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCXJldHVybl9kZXNjMiA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlyZXR1cm5fZGVzYzIgPQorCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJaWYgKCFyZXR1cm5fZGVzYzIpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKQEAgLTIyNCwzMyArMjEwLDMxIEBACiAKIAkJLyogUXVvdGllbnQgdG8gcmV0dXJuX2Rlc2MxLCByZW1haW5kZXIgdG8gcmV0dXJuX2Rlc2MyICovCiAKLQkJc3RhdHVzID0gYWNwaV91dF9kaXZpZGUgKG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsCi0JCQkJICAgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKLQkJCQkgICAmcmV0dXJuX2Rlc2MxLT5pbnRlZ2VyLnZhbHVlLAotCQkJCSAgICZyZXR1cm5fZGVzYzItPmludGVnZXIudmFsdWUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfZGl2aWRlKG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsCisJCQkJCW9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUsCisJCQkJCSZyZXR1cm5fZGVzYzEtPmludGVnZXIudmFsdWUsCisJCQkJCSZyZXR1cm5fZGVzYzItPmludGVnZXIudmFsdWUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV8yQV8yVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCi0JCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9vcGNvZGVfMkFfMlRfMVI6IFVua25vd24gb3Bjb2RlICVYXG4iLCB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBTdG9yZSB0aGUgcmVzdWx0cyB0byB0aGUgdGFyZ2V0IHJlZmVyZW5jZSBvcGVyYW5kcyAqLwogCi0Jc3RhdHVzID0gYWNwaV9leF9zdG9yZSAocmV0dXJuX2Rlc2MyLCBvcGVyYW5kWzJdLCB3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9leF9zdG9yZShyZXR1cm5fZGVzYzIsIG9wZXJhbmRbMl0sIHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9leF9zdG9yZSAocmV0dXJuX2Rlc2MxLCBvcGVyYW5kWzNdLCB3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9leF9zdG9yZShyZXR1cm5fZGVzYzEsIG9wZXJhbmRbM10sIHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCkBAIC0yNTgsMjQgKzI0MiwyMiBAQAogCiAJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IHJldHVybl9kZXNjMTsKIAotCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAkvKgogCSAqIFNpbmNlIHRoZSByZW1haW5kZXIgaXMgbm90IHJldHVybmVkIGluZGlyZWN0bHksIHJlbW92ZSBhIHJlZmVyZW5jZSB0bwogCSAqIGl0LiBPbmx5IHRoZSBxdW90aWVudCBpcyByZXR1cm5lZCBpbmRpcmVjdGx5LgogCSAqLwotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocmV0dXJuX2Rlc2MyKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MyKTsKIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJLyogRGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCiAKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChyZXR1cm5fZGVzYzEpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MxKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfMkFfMVRfMVIKQEAgLTI4OSw0MiArMjcxLDM5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzJBXzFUXzFSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMkFfMVRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYyA9IE5VTEw7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKKwlhY3BpX2ludGVnZXIgaW5kZXg7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zaXplIGxlbmd0aDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMkFfMVRfMVIiLAotCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzJBXzFUXzFSIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCS8qIEV4ZWN1dGUgdGhlIG9wY29kZSAqLwogCiAJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX01BVEgpIHsKIAkJLyogQWxsIHNpbXBsZSBtYXRoIG9wY29kZXMgKGFkZCwgZXRjLikgKi8KIAotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gYWNwaV9leF9kb19tYXRoX29wICh3YWxrX3N0YXRlLT5vcGNvZGUsCi0JCQkJICBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlLAotCQkJCSAgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSk7CisJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0KKwkJICAgIGFjcGlfZXhfZG9fbWF0aF9vcCh3YWxrX3N0YXRlLT5vcGNvZGUsCisJCQkJICAgICAgIG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsCisJCQkJICAgICAgIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUpOwogCQlnb3RvIHN0b3JlX3Jlc3VsdF90b190YXJnZXQ7CiAJfQogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9NT0RfT1A6IC8qIE1vZCAoRGl2aWRlbmQsIERpdmlzb3IsIHJlbWFpbmRlcl9yZXN1bHQgKEFDUEkgMi4wKSAqLworCWNhc2UgQU1MX01PRF9PUDoJLyogTW9kIChEaXZpZGVuZCwgRGl2aXNvciwgcmVtYWluZGVyX3Jlc3VsdCAoQUNQSSAyLjApICovCiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC0zMzIsMjEgKzMxMSwxOCBAQAogCiAJCS8qIHJldHVybl9kZXNjIHdpbGwgY29udGFpbiB0aGUgcmVtYWluZGVyICovCiAKLQkJc3RhdHVzID0gYWNwaV91dF9kaXZpZGUgKG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsCi0JCQkJICAgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKLQkJCQkgICBOVUxMLAotCQkJCSAgICZyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSk7CisJCXN0YXR1cyA9IGFjcGlfdXRfZGl2aWRlKG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsCisJCQkJCW9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUsCisJCQkJCU5VTEwsICZyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSk7CiAJCWJyZWFrOwogCisJY2FzZSBBTUxfQ09OQ0FUX09QOgkvKiBDb25jYXRlbmF0ZSAoRGF0YTEsIERhdGEyLCBSZXN1bHQpICovCiAKLQljYXNlIEFNTF9DT05DQVRfT1A6IC8qIENvbmNhdGVuYXRlIChEYXRhMSwgRGF0YTIsIFJlc3VsdCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2NvbmNhdGVuYXRlIChvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLAotCQkJCSAmcmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUpOworCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2NvbmNhdGVuYXRlKG9wZXJhbmRbMF0sIG9wZXJhbmRbMV0sCisJCQkJCQkmcmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAotCi0JY2FzZSBBTUxfVE9fU1RSSU5HX09QOiAvKiB0b19zdHJpbmcgKEJ1ZmZlciwgTGVuZ3RoLCBSZXN1bHQpIChBQ1BJIDIuMCkgKi8KKwljYXNlIEFNTF9UT19TVFJJTkdfT1A6CS8qIHRvX3N0cmluZyAoQnVmZmVyLCBMZW5ndGgsIFJlc3VsdCkgKEFDUEkgMi4wKSAqLwogCiAJCS8qCiAJCSAqIElucHV0IG9iamVjdCBpcyBndWFyYW50ZWVkIHRvIGJlIGEgYnVmZmVyIGF0IHRoaXMgcG9pbnQgKGl0IG1heSBoYXZlCkBAIC0zNjUsOCArMzQxLDggQEAKIAkJICovCiAJCWxlbmd0aCA9IDA7CiAJCXdoaWxlICgobGVuZ3RoIDwgb3BlcmFuZFswXS0+YnVmZmVyLmxlbmd0aCkgJiYKLQkJCSAgIChsZW5ndGggPCBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlKSAmJgotCQkJICAgKG9wZXJhbmRbMF0tPmJ1ZmZlci5wb2ludGVyW2xlbmd0aF0pKSB7CisJCSAgICAgICAobGVuZ3RoIDwgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSkgJiYKKwkJICAgICAgIChvcGVyYW5kWzBdLT5idWZmZXIucG9pbnRlcltsZW5ndGhdKSkgewogCQkJbGVuZ3RoKys7CiAJCQlpZiAobGVuZ3RoID4gQUNQSV9NQVhfU1RSSU5HX0NPTlZFUlNJT04pIHsKIAkJCQlzdGF0dXMgPSBBRV9BTUxfU1RSSU5HX0xJTUlUOwpAQCAtMzc2LDMzICszNTIsMzIgQEAKIAogCQkvKiBBbGxvY2F0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0ICovCiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0IChsZW5ndGgpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QobGVuZ3RoKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKLQkJLyogQ29weSB0aGUgcmF3IGJ1ZmZlciBkYXRhIHdpdGggbm8gdHJhbnNmb3JtLiBOVUxMIHRlcm1pbmF0ZWQgYWxyZWFkeSovCisJCS8qIENvcHkgdGhlIHJhdyBidWZmZXIgZGF0YSB3aXRoIG5vIHRyYW5zZm9ybS4gTlVMTCB0ZXJtaW5hdGVkIGFscmVhZHkgKi8KIAotCQlBQ1BJX01FTUNQWSAocmV0dXJuX2Rlc2MtPnN0cmluZy5wb2ludGVyLAotCQkJb3BlcmFuZFswXS0+YnVmZmVyLnBvaW50ZXIsIGxlbmd0aCk7CisJCUFDUElfTUVNQ1BZKHJldHVybl9kZXNjLT5zdHJpbmcucG9pbnRlciwKKwkJCSAgICBvcGVyYW5kWzBdLT5idWZmZXIucG9pbnRlciwgbGVuZ3RoKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX0NPTkNBVF9SRVNfT1A6CiAKIAkJLyogY29uY2F0ZW5hdGVfcmVzX3RlbXBsYXRlIChCdWZmZXIsIEJ1ZmZlciwgUmVzdWx0KSAoQUNQSSAyLjApICovCiAKLQkJc3RhdHVzID0gYWNwaV9leF9jb25jYXRfdGVtcGxhdGUgKG9wZXJhbmRbMF0sIG9wZXJhbmRbMV0sCi0JCQkJICZyZXR1cm5fZGVzYywgd2Fsa19zdGF0ZSk7CisJCXN0YXR1cyA9IGFjcGlfZXhfY29uY2F0X3RlbXBsYXRlKG9wZXJhbmRbMF0sIG9wZXJhbmRbMV0sCisJCQkJCQkgJnJldHVybl9kZXNjLCB3YWxrX3N0YXRlKTsKIAkJYnJlYWs7CiAKLQotCWNhc2UgQU1MX0lOREVYX09QOiAgICAgICAgICAgICAgLyogSW5kZXggKFNvdXJjZSBJbmRleCBSZXN1bHQpICovCisJY2FzZSBBTUxfSU5ERVhfT1A6CS8qIEluZGV4IChTb3VyY2UgSW5kZXggUmVzdWx0KSAqLwogCiAJCS8qIENyZWF0ZSB0aGUgaW50ZXJuYWwgcmV0dXJuIG9iamVjdCAqLwogCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKTsKKwkJcmV0dXJuX2Rlc2MgPQorCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC00MTIsNzYgKzM4Nyw3NSBAQAogCiAJCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBTb3VyY2Ugb3BlcmFuZCBpcyBhIFBhY2thZ2UsIEJ1ZmZlciwgb3IgU3RyaW5nICovCiAKLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvcGVyYW5kWzBdKSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgeworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZFswXSkgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKIAkJCS8qIE9iamVjdCB0byBiZSBpbmRleGVkIGlzIGEgUGFja2FnZSAqLwogCiAJCQlpZiAoaW5kZXggPj0gb3BlcmFuZFswXS0+cGFja2FnZS5jb3VudCkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiSW5kZXggdmFsdWUgKCVYJTguOFgpIGJleW9uZCBwYWNrYWdlIGVuZCAoJVgpXG4iLAotCQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGluZGV4KSwgb3BlcmFuZFswXS0+cGFja2FnZS5jb3VudCkpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJJbmRleCB2YWx1ZSAoJVglOC44WCkgYmV5b25kIHBhY2thZ2UgZW5kICglWClcbiIsCisJCQkJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChpbmRleCksCisJCQkJCQkgIG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpKTsKIAkJCQlzdGF0dXMgPSBBRV9BTUxfUEFDS0FHRV9MSU1JVDsKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQl9CiAKIAkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUgPSBBQ1BJX1RZUEVfUEFDS0FHRTsKLQkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0ICAgID0gb3BlcmFuZFswXTsKLQkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uud2hlcmUgICAgID0gJm9wZXJhbmRbMF0tPnBhY2thZ2UuZWxlbWVudHMgWwotCQkJCQkgIGluZGV4XTsKLQkJfQotCQllbHNlIHsKKwkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0ID0gb3BlcmFuZFswXTsKKwkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uud2hlcmUgPQorCQkJICAgICZvcGVyYW5kWzBdLT5wYWNrYWdlLmVsZW1lbnRzW2luZGV4XTsKKwkJfSBlbHNlIHsKIAkJCS8qIE9iamVjdCB0byBiZSBpbmRleGVkIGlzIGEgQnVmZmVyL1N0cmluZyAqLwogCiAJCQlpZiAoaW5kZXggPj0gb3BlcmFuZFswXS0+YnVmZmVyLmxlbmd0aCkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiSW5kZXggdmFsdWUgKCVYJTguOFgpIGJleW9uZCBlbmQgb2YgYnVmZmVyICglWClcbiIsCi0JCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoaW5kZXgpLCBvcGVyYW5kWzBdLT5idWZmZXIubGVuZ3RoKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIkluZGV4IHZhbHVlICglWCU4LjhYKSBiZXlvbmQgZW5kIG9mIGJ1ZmZlciAoJVgpXG4iLAorCQkJCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoaW5kZXgpLAorCQkJCQkJICBvcGVyYW5kWzBdLT5idWZmZXIubGVuZ3RoKSk7CiAJCQkJc3RhdHVzID0gQUVfQU1MX0JVRkZFUl9MSU1JVDsKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQl9CiAKLQkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOwotCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QgICAgPSBvcGVyYW5kWzBdOworCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSA9CisJCQkgICAgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDsKKwkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0ID0gb3BlcmFuZFswXTsKIAkJfQogCiAJCS8qCiAJCSAqIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgdGFyZ2V0IHBhY2thZ2UvYnVmZmVyL3N0cmluZyBmb3IgdGhlIGxpZmUKIAkJICogb2YgdGhlIGluZGV4LgogCQkgKi8KLQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvcGVyYW5kWzBdKTsKKwkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9wZXJhbmRbMF0pOwogCiAJCS8qIENvbXBsZXRlIHRoZSBJbmRleCByZWZlcmVuY2Ugb2JqZWN0ICovCiAKLQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgICAgPSBBTUxfSU5ERVhfT1A7Ci0JCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0ICAgID0gKHUzMikgaW5kZXg7CisJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlID0gQU1MX0lOREVYX09QOworCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLm9mZnNldCA9ICh1MzIpIGluZGV4OwogCiAJCS8qIFN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIFRhcmdldCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUgKHJldHVybl9kZXNjLCBvcGVyYW5kWzJdLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9leF9zdG9yZShyZXR1cm5fZGVzYywgb3BlcmFuZFsyXSwgd2Fsa19zdGF0ZSk7CiAKIAkJLyogUmV0dXJuIHRoZSByZWZlcmVuY2UgKi8KIAogCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7CiAJCWdvdG8gY2xlYW51cDsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV8yQV8xVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCi0JCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9vcGNvZGVfMkFfMVRfMVI6IFVua25vd24gb3Bjb2RlICVYXG4iLCB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWJyZWFrOwogCX0KIAorICAgICAgc3RvcmVfcmVzdWx0X3RvX3RhcmdldDoKIAotc3RvcmVfcmVzdWx0X3RvX3RhcmdldDoKLQotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJLyoKIAkJICogU3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICh3aGljaCBpcyBub3cgaW4gcmV0dXJuX2Rlc2MpIGludG8KIAkJICogdGhlIFRhcmdldCBkZXNjcmlwdG9yLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZSAocmV0dXJuX2Rlc2MsIG9wZXJhbmRbMl0sIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MsIG9wZXJhbmRbMl0sIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCkBAIC00OTAsMTkgKzQ2NCwxNyBAQAogCQl9CiAJfQogCi0KLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCiAJLyogRGVsZXRlIHJldHVybiBvYmplY3Qgb24gZXJyb3IgKi8KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChyZXR1cm5fZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzJBXzBUXzFSCkBAIC01MTUsMjMgKzQ4NywxOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8yQV8wVF8xUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzJBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MgPSBOVUxMOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsX3Jlc3VsdCA9IEZBTFNFOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1OCBsb2dpY2FsX3Jlc3VsdCA9IEZBTFNFOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8yQV8wVF8xUiIsCi0JCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfMkFfMFRfMVIiLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAJLyogQ3JlYXRlIHRoZSBpbnRlcm5hbCByZXR1cm4gb2JqZWN0ICovCiAKLQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAlpZiAoIXJldHVybl9kZXNjKSB7CiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byBjbGVhbnVwOwpAQCAtNTQyLDUwICs1MTAsNDggQEAKIAlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTE9HSUNBTF9OVU1FUklDKSB7CiAJCS8qIGxvZ2ljYWxfb3AgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2xvZ2ljYWxfbnVtZXJpY19vcCAod2Fsa19zdGF0ZS0+b3Bjb2RlLAotCQkJCSAgb3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSwgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKLQkJCQkgICZsb2dpY2FsX3Jlc3VsdCk7CisJCXN0YXR1cyA9IGFjcGlfZXhfZG9fbG9naWNhbF9udW1lcmljX29wKHdhbGtfc3RhdGUtPm9wY29kZSwKKwkJCQkJCSAgICAgICBvcGVyYW5kWzBdLT5pbnRlZ2VyLgorCQkJCQkJICAgICAgIHZhbHVlLAorCQkJCQkJICAgICAgIG9wZXJhbmRbMV0tPmludGVnZXIuCisJCQkJCQkgICAgICAgdmFsdWUsICZsb2dpY2FsX3Jlc3VsdCk7CiAJCWdvdG8gc3RvcmVfbG9naWNhbF9yZXN1bHQ7Ci0JfQotCWVsc2UgaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0xPR0lDQUwpIHsKKwl9IGVsc2UgaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0xPR0lDQUwpIHsKIAkJLyogbG9naWNhbF9vcCAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfZG9fbG9naWNhbF9vcCAod2Fsa19zdGF0ZS0+b3Bjb2RlLCBvcGVyYW5kWzBdLAotCQkJCSBvcGVyYW5kWzFdLCAmbG9naWNhbF9yZXN1bHQpOworCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2xvZ2ljYWxfb3Aod2Fsa19zdGF0ZS0+b3Bjb2RlLCBvcGVyYW5kWzBdLAorCQkJCQkgICAgICAgb3BlcmFuZFsxXSwgJmxvZ2ljYWxfcmVzdWx0KTsKIAkJZ290byBzdG9yZV9sb2dpY2FsX3Jlc3VsdDsKIAl9CiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX0FDUVVJUkVfT1A6ICAgICAgICAgICAgLyogQWNxdWlyZSAobXV0ZXhfb2JqZWN0LCBUaW1lb3V0KSAqLworCWNhc2UgQU1MX0FDUVVJUkVfT1A6CS8qIEFjcXVpcmUgKG11dGV4X29iamVjdCwgVGltZW91dCkgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X2FjcXVpcmVfbXV0ZXggKG9wZXJhbmRbMV0sIG9wZXJhbmRbMF0sIHdhbGtfc3RhdGUpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9hY3F1aXJlX211dGV4KG9wZXJhbmRbMV0sIG9wZXJhbmRbMF0sIHdhbGtfc3RhdGUpOwogCQlpZiAoc3RhdHVzID09IEFFX1RJTUUpIHsKLQkJCWxvZ2ljYWxfcmVzdWx0ID0gVFJVRTsgICAgICAvKiBUUlVFID0gQWNxdWlyZSB0aW1lZCBvdXQgKi8KKwkJCWxvZ2ljYWxfcmVzdWx0ID0gVFJVRTsJLyogVFJVRSA9IEFjcXVpcmUgdGltZWQgb3V0ICovCiAJCQlzdGF0dXMgPSBBRV9PSzsKIAkJfQogCQlicmVhazsKIAorCWNhc2UgQU1MX1dBSVRfT1A6CS8qIFdhaXQgKGV2ZW50X29iamVjdCwgVGltZW91dCkgKi8KIAotCWNhc2UgQU1MX1dBSVRfT1A6ICAgICAgICAgICAgICAgLyogV2FpdCAoZXZlbnRfb2JqZWN0LCBUaW1lb3V0KSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3dhaXRfZXZlbnQgKG9wZXJhbmRbMV0sIG9wZXJhbmRbMF0pOworCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV93YWl0X2V2ZW50KG9wZXJhbmRbMV0sIG9wZXJhbmRbMF0pOwogCQlpZiAoc3RhdHVzID09IEFFX1RJTUUpIHsKLQkJCWxvZ2ljYWxfcmVzdWx0ID0gVFJVRTsgICAgICAvKiBUUlVFLCBXYWl0IHRpbWVkIG91dCAqLworCQkJbG9naWNhbF9yZXN1bHQgPSBUUlVFOwkvKiBUUlVFLCBXYWl0IHRpbWVkIG91dCAqLwogCQkJc3RhdHVzID0gQUVfT0s7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9leF9vcGNvZGVfMkFfMFRfMVI6IFVua25vd24gb3Bjb2RlICVYXG4iLAotCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9vcGNvZGVfMkFfMFRfMVI6IFVua25vd24gb3Bjb2RlICVYXG4iLCB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQotc3RvcmVfbG9naWNhbF9yZXN1bHQ6CisgICAgICBzdG9yZV9sb2dpY2FsX3Jlc3VsdDoKIAkvKgogCSAqIFNldCByZXR1cm4gdmFsdWUgdG8gYWNjb3JkaW5nIHRvIGxvZ2ljYWxfcmVzdWx0LiBsb2dpY2FsIFRSVUUgKGFsbCBvbmVzKQogCSAqIERlZmF1bHQgaXMgRkFMU0UgKHplcm8pCkBAIC01OTYsMTYgKzU2MiwxMyBAQAogCiAJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IHJldHVybl9kZXNjOwogCi0KLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCiAJLyogRGVsZXRlIHJldHVybiBvYmplY3Qgb24gZXJyb3IgKi8KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChyZXR1cm5fZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKaW5kZXggMjNiMDY4YS4uNDgzMzY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKQEAgLTQyLDE2ICs0MiwxMyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4b3BhcmczIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiZXhvcGFyZzMiKQogCiAvKiEKICAqIE5hbWluZyBjb252ZW50aW9uIGZvciBBTUwgaW50ZXJwcmV0ZXIgZXhlY3V0aW9uIHJvdXRpbmVzLgpAQCAtNzQsOCArNzEsNiBAQAogICogVGhlIEFjcGlFeE9wY29kZSogZnVuY3Rpb25zIGFyZSBjYWxsZWQgdmlhIHRoZSBEaXNwYXRjaGVyIGNvbXBvbmVudCB3aXRoCiAgKiBmdWxseSByZXNvbHZlZCBvcGVyYW5kcy4KICEqLwotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSCkBAIC04Nyw2MSArODIsNTMgQEAKICAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIFRyaWFkaWMgb3BlcmF0b3IgKDMgb3BlcmFuZHMpCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfM0FfMFRfMFIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQlzdHJ1Y3QgYWNwaV9zaWduYWxfZmF0YWxfaW5mbyAgICpmYXRhbDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXN0cnVjdCBhY3BpX3NpZ25hbF9mYXRhbF9pbmZvICpmYXRhbDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfM0FfMFRfMFIiLAotCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzNBXzBUXzBSIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7Ci0JY2FzZSBBTUxfRkFUQUxfT1A6ICAgICAgICAgIC8qIEZhdGFsIChmYXRhbF90eXBlIGZhdGFsX2NvZGUgZmF0YWxfYXJnKSAqLworCWNhc2UgQU1MX0ZBVEFMX09QOgkvKiBGYXRhbCAoZmF0YWxfdHlwZSBmYXRhbF9jb2RlIGZhdGFsX2FyZykgKi8KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJImZhdGFsX29wOiBUeXBlICVYIENvZGUgJVggQXJnICVYIDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDxcbiIsCi0JCQkodTMyKSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlLAotCQkJKHUzMikgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKLQkJCSh1MzIpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgImZhdGFsX29wOiBUeXBlICVYIENvZGUgJVggQXJnICVYIDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDxcbiIsCisJCQkJICAodTMyKSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlLAorCQkJCSAgKHUzMikgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKKwkJCQkgICh1MzIpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWUpKTsKIAotCQlmYXRhbCA9IEFDUElfTUVNX0FMTE9DQVRFIChzaXplb2YgKHN0cnVjdCBhY3BpX3NpZ25hbF9mYXRhbF9pbmZvKSk7CisJCWZhdGFsID0KKwkJICAgIEFDUElfTUVNX0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV9zaWduYWxfZmF0YWxfaW5mbykpOwogCQlpZiAoZmF0YWwpIHsKLQkJCWZhdGFsLT50eXBlICAgICA9ICh1MzIpIG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWU7Ci0JCQlmYXRhbC0+Y29kZSAgICAgPSAodTMyKSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOworCQkJZmF0YWwtPnR5cGUgPSAodTMyKSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlOworCQkJZmF0YWwtPmNvZGUgPSAodTMyKSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOwogCQkJZmF0YWwtPmFyZ3VtZW50ID0gKHUzMikgb3BlcmFuZFsyXS0+aW50ZWdlci52YWx1ZTsKIAkJfQogCiAJCS8qIEFsd2F5cyBzaWduYWwgdGhlIE9TISAqLwogCi0JCXN0YXR1cyA9IGFjcGlfb3Nfc2lnbmFsIChBQ1BJX1NJR05BTF9GQVRBTCwgZmF0YWwpOworCQlzdGF0dXMgPSBhY3BpX29zX3NpZ25hbChBQ1BJX1NJR05BTF9GQVRBTCwgZmF0YWwpOwogCiAJCS8qIE1pZ2h0IHJldHVybiB3aGlsZSBPUyBpcyBzaHV0dGluZyBkb3duLCBqdXN0IGNvbnRpbnVlICovCiAKLQkJQUNQSV9NRU1fRlJFRSAoZmF0YWwpOworCQlBQ1BJX01FTV9GUkVFKGZhdGFsKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9leF9vcGNvZGVfM0FfMFRfMFI6IFVua25vd24gb3Bjb2RlICVYXG4iLAotCQkJCXdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSOiBVbmtub3duIG9wY29kZSAlWFxuIiwgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCisgICAgICBjbGVhbnVwOgogCi1jbGVhbnVwOgotCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzNBXzFUXzFSCkBAIC0xNTQsMzEgKzE0MSwyOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8zQV8xVF8xUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzNBXzFUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MgPSBOVUxMOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MgPSBOVUxMOworCWNoYXIgKmJ1ZmZlciA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9pbnRlZ2VyIGluZGV4OworCWFjcGlfc2l6ZSBsZW5ndGg7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzNBXzFUXzFSIiwKLQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoImV4X29wY29kZV8zQV8xVF8xUiIsCisJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX01JRF9PUDogICAgLyogTWlkIChTb3VyY2VbMF0sIEluZGV4WzFdLCBMZW5ndGhbMl0sIFJlc3VsdFszXSkgKi8KKwljYXNlIEFNTF9NSURfT1A6CS8qIE1pZCAoU291cmNlWzBdLCBJbmRleFsxXSwgTGVuZ3RoWzJdLCBSZXN1bHRbM10pICovCiAKIAkJLyoKIAkJICogQ3JlYXRlIHRoZSByZXR1cm4gb2JqZWN0LiAgVGhlIFNvdXJjZSBvcGVyYW5kIGlzIGd1YXJhbnRlZWQgdG8gYmUKIAkJICogZWl0aGVyIGEgU3RyaW5nIG9yIGEgQnVmZmVyLCBzbyBqdXN0IHVzZSBpdHMgdHlwZS4KIAkJICovCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0ICgKLQkJCQkgIEFDUElfR0VUX09CSkVDVF9UWVBFIChvcGVyYW5kWzBdKSk7CisJCXJldHVybl9kZXNjID0KKwkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX0dFVF9PQkpFQ1RfVFlQRQorCQkJCQkJICAgKG9wZXJhbmRbMF0pKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byBjbGVhbnVwOwpAQCAtMTkzLDY3ICsxNzcsOTIgQEAKIAkJICogSWYgdGhlIGluZGV4IGlzIGJleW9uZCB0aGUgbGVuZ3RoIG9mIHRoZSBTdHJpbmcvQnVmZmVyLCBvciBpZiB0aGUKIAkJICogcmVxdWVzdGVkIGxlbmd0aCBpcyB6ZXJvLCByZXR1cm4gYSB6ZXJvLWxlbmd0aCBTdHJpbmcvQnVmZmVyCiAJCSAqLwotCQlpZiAoKGluZGV4IDwgb3BlcmFuZFswXS0+c3RyaW5nLmxlbmd0aCkgJiYKLQkJCShsZW5ndGggPiAwKSkgewotCQkJLyogVHJ1bmNhdGUgcmVxdWVzdCBpZiBsYXJnZXIgdGhhbiB0aGUgYWN0dWFsIFN0cmluZy9CdWZmZXIgKi8KKwkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPnN0cmluZy5sZW5ndGgpIHsKKwkJCWxlbmd0aCA9IDA7CisJCX0KIAotCQkJaWYgKChpbmRleCArIGxlbmd0aCkgPgotCQkJCW9wZXJhbmRbMF0tPnN0cmluZy5sZW5ndGgpIHsKLQkJCQlsZW5ndGggPSAoYWNwaV9zaXplKSBvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoIC0KLQkJCQkJCSAoYWNwaV9zaXplKSBpbmRleDsKLQkJCX0KKwkJLyogVHJ1bmNhdGUgcmVxdWVzdCBpZiBsYXJnZXIgdGhhbiB0aGUgYWN0dWFsIFN0cmluZy9CdWZmZXIgKi8KIAotCQkJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIGZvciB0aGUgU3RyaW5nL0J1ZmZlciAqLworCQllbHNlIGlmICgoaW5kZXggKyBsZW5ndGgpID4gb3BlcmFuZFswXS0+c3RyaW5nLmxlbmd0aCkgeworCQkJbGVuZ3RoID0gKGFjcGlfc2l6ZSkgb3BlcmFuZFswXS0+c3RyaW5nLmxlbmd0aCAtCisJCQkgICAgKGFjcGlfc2l6ZSkgaW5kZXg7CisJCX0KIAotCQkJYnVmZmVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFICgoYWNwaV9zaXplKSBsZW5ndGggKyAxKTsKKwkJLyogU3RyaW5ncyBhbHdheXMgaGF2ZSBhIHN1Yi1wb2ludGVyLCBub3Qgc28gZm9yIGJ1ZmZlcnMgKi8KKworCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9wZXJhbmRbMF0pKSB7CisJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKworCQkJLyogQWx3YXlzIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBmb3IgdGhlIFN0cmluZyAqLworCisJCQlidWZmZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUoKGFjcGlfc2l6ZSkgbGVuZ3RoICsgMSk7CiAJCQlpZiAoIWJ1ZmZlcikgewogCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQl9CisJCQlicmVhazsKIAorCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJCS8qIElmIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIGlzIHplcm8sIGRvbid0IGFsbG9jYXRlIGEgYnVmZmVyICovCisKKwkJCWlmIChsZW5ndGggPiAwKSB7CisJCQkJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIGZvciB0aGUgQnVmZmVyICovCisKKwkJCQlidWZmZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUobGVuZ3RoKTsKKwkJCQlpZiAoIWJ1ZmZlcikgeworCQkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgkvKiBTaG91bGQgbm90IGhhcHBlbiAqLworCisJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJaWYgKGxlbmd0aCA+IDApIHsKIAkJCS8qIENvcHkgdGhlIHBvcnRpb24gcmVxdWVzdGVkICovCiAKLQkJCUFDUElfTUVNQ1BZIChidWZmZXIsIG9wZXJhbmRbMF0tPnN0cmluZy5wb2ludGVyICsgaW5kZXgsCi0JCQkJCSAgbGVuZ3RoKTsKLQotCQkJLyogU2V0IHRoZSBsZW5ndGggb2YgdGhlIG5ldyBTdHJpbmcvQnVmZmVyICovCi0KLQkJCXJldHVybl9kZXNjLT5zdHJpbmcucG9pbnRlciA9IGJ1ZmZlcjsKLQkJCXJldHVybl9kZXNjLT5zdHJpbmcubGVuZ3RoID0gKHUzMikgbGVuZ3RoOworCQkJQUNQSV9NRU1DUFkoYnVmZmVyLCBvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciArIGluZGV4LAorCQkJCSAgICBsZW5ndGgpOwogCQl9CiAKKwkJLyogU2V0IHRoZSBsZW5ndGggb2YgdGhlIG5ldyBTdHJpbmcvQnVmZmVyICovCisKKwkJcmV0dXJuX2Rlc2MtPnN0cmluZy5wb2ludGVyID0gYnVmZmVyOworCQlyZXR1cm5fZGVzYy0+c3RyaW5nLmxlbmd0aCA9ICh1MzIpIGxlbmd0aDsKKwogCQkvKiBNYXJrIGJ1ZmZlciBpbml0aWFsaXplZCAqLwogCiAJCXJldHVybl9kZXNjLT5idWZmZXIuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSOiBVbmtub3duIG9wY29kZSAlWFxuIiwKLQkJCQl3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8zQV8wVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIFN0b3JlIHRoZSByZXN1bHQgaW4gdGhlIHRhcmdldCAqLwogCi0Jc3RhdHVzID0gYWNwaV9leF9zdG9yZSAocmV0dXJuX2Rlc2MsIG9wZXJhbmRbM10sIHdhbGtfc3RhdGUpOworCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MsIG9wZXJhbmRbM10sIHdhbGtfc3RhdGUpOwogCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAogCS8qIERlbGV0ZSByZXR1cm4gb2JqZWN0IG9uIGVycm9yICovCiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocmV0dXJuX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCB3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CiAJfQogCiAJLyogU2V0IHRoZSByZXR1cm4gb2JqZWN0IGFuZCBleGl0ICovCiAKLQlpZiAoIXdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKKwllbHNlIHsKIAkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IHJldHVybl9kZXNjOwogCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3Bhcmc2LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYwppbmRleCAxN2Y4MWQ0Li41ZGVlNzcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYwpAQCAtNDIsMTYgKzQyLDEzIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhvcGFyZzYiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJleG9wYXJnNiIpCiAKIC8qIQogICogTmFtaW5nIGNvbnZlbnRpb24gZm9yIEFNTCBpbnRlcnByZXRlciBleGVjdXRpb24gcm91dGluZXMuCkBAIC03NCwxNSArNzEsMTEgQEAKICAqIFRoZSBBY3BpRXhPcGNvZGUqIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHZpYSB0aGUgRGlzcGF0Y2hlciBjb21wb25lbnQgd2l0aAogICogZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZHMuCiAhKi8KLQogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCiBzdGF0aWMgdTgKLWFjcGlfZXhfZG9fbWF0Y2ggKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfb3AsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcGFja2FnZV9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbWF0Y2hfb2JqKTsKLQorYWNwaV9leF9kb19tYXRjaCh1MzIgbWF0Y2hfb3AsCisJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX29iaiwKKwkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm1hdGNoX29iaik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTAxLDE0ICs5NCwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHU4Ci1hY3BpX2V4X2RvX21hdGNoICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX29wLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnBhY2thZ2Vfb2JqLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm1hdGNoX29iaikKK2FjcGlfZXhfZG9fbWF0Y2godTMyIG1hdGNoX29wLAorCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFja2FnZV9vYmosCisJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICptYXRjaF9vYmopCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsX3Jlc3VsdCA9IFRSVUU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KKwl1OCBsb2dpY2FsX3Jlc3VsdCA9IFRSVUU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJLyoKIAkgKiBOb3RlOiBTaW5jZSB0aGUgcGFja2FnZV9vYmovbWF0Y2hfb2JqIG9yZGVyaW5nIGlzIG9wcG9zaXRlIHRvIHRoYXQgb2YKQEAgLTEzMyw5ICsxMjQsMTAgQEAKIAkJICogVHJ1ZSBpZiBlcXVhbDogKFBbaV0gPT0gTSkKIAkJICogQ2hhbmdlIHRvOiAgICAgKE0gPT0gUFtpXSkKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfZG9fbG9naWNhbF9vcCAoQU1MX0xFUVVBTF9PUCwgbWF0Y2hfb2JqLCBwYWNrYWdlX29iaiwKLQkJCQkgJmxvZ2ljYWxfcmVzdWx0KTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9kb19sb2dpY2FsX29wKEFNTF9MRVFVQUxfT1AsIG1hdGNoX29iaiwgcGFja2FnZV9vYmosCisJCQkJCSAgJmxvZ2ljYWxfcmVzdWx0KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm4gKEZBTFNFKTsKIAkJfQogCQlicmVhazsKQEAgLTE0NiwxMiArMTM4LDEzIEBACiAJCSAqIFRydWUgaWYgbGVzcyB0aGFuIG9yIGVxdWFsOiAoUFtpXSA8PSBNKSAoUFtpXSBub3RfZ3JlYXRlciB0aGFuIE0pCiAJCSAqIENoYW5nZSB0bzogICAgICAgICAgICAgICAgICAoTSA+PSBQW2ldKSAoTSBub3RfbGVzcyB0aGFuIFBbaV0pCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2xvZ2ljYWxfb3AgKEFNTF9MTEVTU19PUCwgbWF0Y2hfb2JqLCBwYWNrYWdlX29iaiwKLQkJCQkgJmxvZ2ljYWxfcmVzdWx0KTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9kb19sb2dpY2FsX29wKEFNTF9MTEVTU19PUCwgbWF0Y2hfb2JqLCBwYWNrYWdlX29iaiwKKwkJCQkJICAmbG9naWNhbF9yZXN1bHQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybiAoRkFMU0UpOwogCQl9Ci0JCWxvZ2ljYWxfcmVzdWx0ID0gKHU4KSAhbG9naWNhbF9yZXN1bHQ7CisJCWxvZ2ljYWxfcmVzdWx0ID0gKHU4KSAhIGxvZ2ljYWxfcmVzdWx0OwogCQlicmVhazsKIAogCWNhc2UgTUFUQ0hfTUxUOgpAQCAtMTYwLDkgKzE1MywxMCBAQAogCQkgKiBUcnVlIGlmIGxlc3MgdGhhbjogKFBbaV0gPCBNKQogCQkgKiBDaGFuZ2UgdG86ICAgICAgICAgKE0gPiBQW2ldKQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9kb19sb2dpY2FsX29wIChBTUxfTEdSRUFURVJfT1AsIG1hdGNoX29iaiwgcGFja2FnZV9vYmosCi0JCQkJICZsb2dpY2FsX3Jlc3VsdCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfZG9fbG9naWNhbF9vcChBTUxfTEdSRUFURVJfT1AsIG1hdGNoX29iaiwKKwkJCQkJICBwYWNrYWdlX29iaiwgJmxvZ2ljYWxfcmVzdWx0KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm4gKEZBTFNFKTsKIAkJfQogCQlicmVhazsKQEAgLTE3MywxMiArMTY3LDEzIEBACiAJCSAqIFRydWUgaWYgZ3JlYXRlciB0aGFuIG9yIGVxdWFsOiAoUFtpXSA+PSBNKSAoUFtpXSBub3RfbGVzcyB0aGFuIE0pCiAJCSAqIENoYW5nZSB0bzogICAgICAgICAgICAgICAgICAgICAoTSA8PSBQW2ldKSAoTSBub3RfZ3JlYXRlciB0aGFuIFBbaV0pCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2xvZ2ljYWxfb3AgKEFNTF9MR1JFQVRFUl9PUCwgbWF0Y2hfb2JqLCBwYWNrYWdlX29iaiwKLQkJCQkgJmxvZ2ljYWxfcmVzdWx0KTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9kb19sb2dpY2FsX29wKEFNTF9MR1JFQVRFUl9PUCwgbWF0Y2hfb2JqLAorCQkJCQkgIHBhY2thZ2Vfb2JqLCAmbG9naWNhbF9yZXN1bHQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybiAoRkFMU0UpOwogCQl9Ci0JCWxvZ2ljYWxfcmVzdWx0ID0gKHU4KSFsb2dpY2FsX3Jlc3VsdDsKKwkJbG9naWNhbF9yZXN1bHQgPSAodTgpICEgbG9naWNhbF9yZXN1bHQ7CiAJCWJyZWFrOwogCiAJY2FzZSBNQVRDSF9NR1Q6CkBAIC0xODcsOSArMTgyLDEwIEBACiAJCSAqIFRydWUgaWYgZ3JlYXRlciB0aGFuOiAoUFtpXSA+IE0pCiAJCSAqIENoYW5nZSB0bzogICAgICAgICAgICAoTSA8IFBbaV0pCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2xvZ2ljYWxfb3AgKEFNTF9MTEVTU19PUCwgbWF0Y2hfb2JqLCBwYWNrYWdlX29iaiwKLQkJCQkgJmxvZ2ljYWxfcmVzdWx0KTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9kb19sb2dpY2FsX29wKEFNTF9MTEVTU19PUCwgbWF0Y2hfb2JqLCBwYWNrYWdlX29iaiwKKwkJCQkJICAmbG9naWNhbF9yZXN1bHQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybiAoRkFMU0UpOwogCQl9CiAJCWJyZWFrOwpAQCAtMjA0LDcgKzIwMCw2IEBACiAJcmV0dXJuIGxvZ2ljYWxfcmVzdWx0OwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSCkBAIC0yMTcsMjAgKzIxMiwxNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV82QV8wVF8xUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjID0gTlVMTDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGhpc19lbGVtZW50OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX2ludGVnZXIgaW5kZXg7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGhpc19lbGVtZW50OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV82QV8wVF8xUiIsCi0JCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfNkFfMFRfMVIiLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKIAljYXNlIEFNTF9NQVRDSF9PUDoKQEAgLTI0Miw4ICsyMzMsOSBAQAogCQkvKiBWYWxpZGF0ZSBib3RoIE1hdGNoIFRlcm0gT3BlcmF0b3JzIChNVFIsIE1FUSwgZXRjLikgKi8KIAogCQlpZiAoKG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUgPiBNQVhfTUFUQ0hfT1BFUkFUT1IpIHx8Ci0JCQkob3BlcmFuZFszXS0+aW50ZWdlci52YWx1ZSA+IE1BWF9NQVRDSF9PUEVSQVRPUikpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTWF0Y2ggb3BlcmF0b3Igb3V0IG9mIHJhbmdlXG4iKSk7CisJCSAgICAob3BlcmFuZFszXS0+aW50ZWdlci52YWx1ZSA+IE1BWF9NQVRDSF9PUEVSQVRPUikpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIk1hdGNoIG9wZXJhdG9yIG91dCBvZiByYW5nZVxuIikpOwogCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVkFMVUU7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KQEAgLTI1MiwxNiArMjQ0LDE3IEBACiAKIAkJaW5kZXggPSBvcGVyYW5kWzVdLT5pbnRlZ2VyLnZhbHVlOwogCQlpZiAoaW5kZXggPj0gb3BlcmFuZFswXS0+cGFja2FnZS5jb3VudCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkluZGV4ICglWCU4LjhYKSBiZXlvbmQgcGFja2FnZSBlbmQgKCVYKVxuIiwKLQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGluZGV4KSwgb3BlcmFuZFswXS0+cGFja2FnZS5jb3VudCkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiSW5kZXggKCVYJTguOFgpIGJleW9uZCBwYWNrYWdlIGVuZCAoJVgpXG4iLAorCQkJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChpbmRleCksCisJCQkJCSAgb3BlcmFuZFswXS0+cGFja2FnZS5jb3VudCkpOwogCQkJc3RhdHVzID0gQUVfQU1MX1BBQ0tBR0VfTElNSVQ7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAogCQkvKiBDcmVhdGUgYW4gaW50ZWdlciBmb3IgdGhlIHJldHVybiB2YWx1ZSAqLwogCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byBjbGVhbnVwOwpAQCAtMjgzLDcgKzI3Niw3IEBACiAJCSAqIEFDUElfSU5URUdFUl9NQVggKE9uZXMpIChpdHMgaW5pdGlhbCB2YWx1ZSkgaW5kaWNhdGluZyB0aGF0IG5vCiAJCSAqIG1hdGNoIHdhcyBmb3VuZC4KIAkJICovCi0JCWZvciAoIDsgaW5kZXggPCBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50OyBpbmRleCsrKSB7CisJCWZvciAoOyBpbmRleCA8IG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQ7IGluZGV4KyspIHsKIAkJCS8qIEdldCB0aGUgY3VycmVudCBwYWNrYWdlIGVsZW1lbnQgKi8KIAogCQkJdGhpc19lbGVtZW50ID0gb3BlcmFuZFswXS0+cGFja2FnZS5lbGVtZW50c1tpbmRleF07CkBAIC0yOTksMTMgKzI5MiwxMyBAQAogCQkJICogKHByb2NlZWQgdG8gbmV4dCBpdGVyYXRpb24gb2YgZW5jbG9zaW5nIGZvciBsb29wKSBzaWduaWZpZXMgYQogCQkJICogbm9uLW1hdGNoLgogCQkJICovCi0JCQlpZiAoIWFjcGlfZXhfZG9fbWF0Y2ggKCh1MzIpIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUsCi0JCQkJCSAgIHRoaXNfZWxlbWVudCwgb3BlcmFuZFsyXSkpIHsKKwkJCWlmICghYWNwaV9leF9kb19tYXRjaCgodTMyKSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlLAorCQkJCQkgICAgICB0aGlzX2VsZW1lbnQsIG9wZXJhbmRbMl0pKSB7CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCWlmICghYWNwaV9leF9kb19tYXRjaCAoKHUzMikgb3BlcmFuZFszXS0+aW50ZWdlci52YWx1ZSwKLQkJCQkJICAgdGhpc19lbGVtZW50LCBvcGVyYW5kWzRdKSkgeworCQkJaWYgKCFhY3BpX2V4X2RvX21hdGNoKCh1MzIpIG9wZXJhbmRbM10tPmludGVnZXIudmFsdWUsCisJCQkJCSAgICAgIHRoaXNfZWxlbWVudCwgb3BlcmFuZFs0XSkpIHsKIAkJCQljb250aW51ZTsKIAkJCX0KIApAQCAtMzE2LDMxICszMDksMjcgQEAKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBTUxfTE9BRF9UQUJMRV9PUDoKIAotCQlzdGF0dXMgPSBhY3BpX2V4X2xvYWRfdGFibGVfb3AgKHdhbGtfc3RhdGUsICZyZXR1cm5fZGVzYyk7CisJCXN0YXR1cyA9IGFjcGlfZXhfbG9hZF90YWJsZV9vcCh3YWxrX3N0YXRlLCAmcmV0dXJuX2Rlc2MpOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV82QV8wVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCi0JCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9vcGNvZGVfNkFfMFRfMVI6IFVua25vd24gb3Bjb2RlICVYXG4iLCB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7CiAKLQotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAKIAkvKiBEZWxldGUgcmV0dXJuIG9iamVjdCBvbiBlcnJvciAqLwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHJldHVybl9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMKaW5kZXggYzllM2M2OC4uNzQ3NmMzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYwpAQCAtNDIsMzIgKzQyLDI0IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhwcmVwIikKK0FDUElfTU9EVUxFX05BTUUoImV4cHJlcCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIHUzMgotYWNwaV9leF9kZWNvZGVfZmllbGRfYWNjZXNzICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2ZsYWdzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJldHVybl9ieXRlX2FsaWdubWVudCk7Ci0KK2FjcGlfZXhfZGVjb2RlX2ZpZWxkX2FjY2Vzcyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgICB1OCBmaWVsZF9mbGFncywgdTMyICogcmV0dXJuX2J5dGVfYWxpZ25tZW50KTsKIAogI2lmZGVmIEFDUElfVU5ERVJfREVWRUxPUE1FTlQKIAogc3RhdGljIHUzMgotYWNwaV9leF9nZW5lcmF0ZV9hY2Nlc3MgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYml0X29mZnNldCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fbGVuZ3RoKTsKK2FjcGlfZXhfZ2VuZXJhdGVfYWNjZXNzKHUzMiBmaWVsZF9iaXRfb2Zmc2V0LAorCQkJdTMyIGZpZWxkX2JpdF9sZW5ndGgsIHUzMiByZWdpb25fbGVuZ3RoKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC05MiwzOSArODQsMzYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB1MzIKLWFjcGlfZXhfZ2VuZXJhdGVfYWNjZXNzICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9vZmZzZXQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9iaXRfbGVuZ3RoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uX2xlbmd0aCkKK2FjcGlfZXhfZ2VuZXJhdGVfYWNjZXNzKHUzMiBmaWVsZF9iaXRfb2Zmc2V0LAorCQkJdTMyIGZpZWxkX2JpdF9sZW5ndGgsIHUzMiByZWdpb25fbGVuZ3RoKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYnl0ZV9sZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9ieXRlX29mZnNldDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2J5dGVfZW5kX29mZnNldDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc19ieXRlX3dpZHRoOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfc3RhcnRfb2Zmc2V0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZW5kX29mZnNldDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1fYWNjZXNzX3dpZHRoID0gMHhGRkZGRkZGRjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1fYWNjZXNzZXMgPSAweEZGRkZGRkZGOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzZXM7CisJdTMyIGZpZWxkX2J5dGVfbGVuZ3RoOworCXUzMiBmaWVsZF9ieXRlX29mZnNldDsKKwl1MzIgZmllbGRfYnl0ZV9lbmRfb2Zmc2V0OworCXUzMiBhY2Nlc3NfYnl0ZV93aWR0aDsKKwl1MzIgZmllbGRfc3RhcnRfb2Zmc2V0OworCXUzMiBmaWVsZF9lbmRfb2Zmc2V0OworCXUzMiBtaW5pbXVtX2FjY2Vzc193aWR0aCA9IDB4RkZGRkZGRkY7CisJdTMyIG1pbmltdW1fYWNjZXNzZXMgPSAweEZGRkZGRkZGOworCXUzMiBhY2Nlc3NlczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2dlbmVyYXRlX2FjY2VzcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfZ2VuZXJhdGVfYWNjZXNzIik7CiAKIAkvKiBSb3VuZCBGaWVsZCBzdGFydCBvZmZzZXQgYW5kIGxlbmd0aCB0byAibWluaW1hbCIgYnl0ZSBib3VuZGFyaWVzICovCiAKLQlmaWVsZF9ieXRlX29mZnNldCAgPSBBQ1BJX0RJVl84IChBQ1BJX1JPVU5EX0RPV04gKGZpZWxkX2JpdF9vZmZzZXQsIDgpKTsKLQlmaWVsZF9ieXRlX2VuZF9vZmZzZXQgPSBBQ1BJX0RJVl84IChBQ1BJX1JPVU5EX1VQIChmaWVsZF9iaXRfbGVuZ3RoICsKLQkJCSAgIGZpZWxkX2JpdF9vZmZzZXQsIDgpKTsKLQlmaWVsZF9ieXRlX2xlbmd0aCAgPSBmaWVsZF9ieXRlX2VuZF9vZmZzZXQgLSBmaWVsZF9ieXRlX29mZnNldDsKKwlmaWVsZF9ieXRlX29mZnNldCA9IEFDUElfRElWXzgoQUNQSV9ST1VORF9ET1dOKGZpZWxkX2JpdF9vZmZzZXQsIDgpKTsKKwlmaWVsZF9ieXRlX2VuZF9vZmZzZXQgPSBBQ1BJX0RJVl84KEFDUElfUk9VTkRfVVAoZmllbGRfYml0X2xlbmd0aCArCisJCQkJCQkJIGZpZWxkX2JpdF9vZmZzZXQsIDgpKTsKKwlmaWVsZF9ieXRlX2xlbmd0aCA9IGZpZWxkX2J5dGVfZW5kX29mZnNldCAtIGZpZWxkX2J5dGVfb2Zmc2V0OwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJIkJpdCBsZW5ndGggJWQsIEJpdCBvZmZzZXQgJWRcbiIsCi0JCQlmaWVsZF9iaXRfbGVuZ3RoLCBmaWVsZF9iaXRfb2Zmc2V0KSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkgICJCaXQgbGVuZ3RoICVkLCBCaXQgb2Zmc2V0ICVkXG4iLAorCQkJICBmaWVsZF9iaXRfbGVuZ3RoLCBmaWVsZF9iaXRfb2Zmc2V0KSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkiQnl0ZSBMZW5ndGggJWQsIEJ5dGUgT2Zmc2V0ICVkLCBFbmQgT2Zmc2V0ICVkXG4iLAotCQkJZmllbGRfYnl0ZV9sZW5ndGgsIGZpZWxkX2J5dGVfb2Zmc2V0LCBmaWVsZF9ieXRlX2VuZF9vZmZzZXQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgIkJ5dGUgTGVuZ3RoICVkLCBCeXRlIE9mZnNldCAlZCwgRW5kIE9mZnNldCAlZFxuIiwKKwkJCSAgZmllbGRfYnl0ZV9sZW5ndGgsIGZpZWxkX2J5dGVfb2Zmc2V0LAorCQkJICBmaWVsZF9ieXRlX2VuZF9vZmZzZXQpKTsKIAogCS8qCiAJICogSXRlcmF0aXZlIHNlYXJjaCBmb3IgdGhlIG1heGltdW0gYWNjZXNzIHdpZHRoIHRoYXQgaXMgYm90aCBhbGlnbmVkCkBAIC0xMzIsNyArMTIxLDggQEAKIAkgKgogCSAqIFN0YXJ0IGF0IGJ5dGVfYWNjIGFuZCB3b3JrIHVwd2FyZHMgdG8gcXdvcmRfYWNjIG1heC4gKDEsMiw0LDggYnl0ZXMpCiAJICovCi0JZm9yIChhY2Nlc3NfYnl0ZV93aWR0aCA9IDE7IGFjY2Vzc19ieXRlX3dpZHRoIDw9IDg7IGFjY2Vzc19ieXRlX3dpZHRoIDw8PSAxKSB7CisJZm9yIChhY2Nlc3NfYnl0ZV93aWR0aCA9IDE7IGFjY2Vzc19ieXRlX3dpZHRoIDw9IDg7CisJICAgICBhY2Nlc3NfYnl0ZV93aWR0aCA8PD0gMSkgewogCQkvKgogCQkgKiAxKSBSb3VuZCBlbmQgb2Zmc2V0IHVwIHRvIG5leHQgYWNjZXNzIGJvdW5kYXJ5IGFuZCBtYWtlIHN1cmUgdGhhdAogCQkgKiAgICB0aGlzIGRvZXMgbm90IGdvIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgcmVnaW9uLgpAQCAtMTQwLDMxICsxMzAsMzcgQEAKIAkJICogICAgYXJlIGRvbmUuIChUaGlzIGRvZXMgbm90IG9wdGltaXplIGZvciB0aGUgcGVyZmVjdGx5IGFsaWduZWQKIAkJICogICAgY2FzZSB5ZXQpLgogCQkgKi8KLQkJaWYgKEFDUElfUk9VTkRfVVAgKGZpZWxkX2J5dGVfZW5kX29mZnNldCwgYWNjZXNzX2J5dGVfd2lkdGgpIDw9IHJlZ2lvbl9sZW5ndGgpIHsKKwkJaWYgKEFDUElfUk9VTkRfVVAoZmllbGRfYnl0ZV9lbmRfb2Zmc2V0LCBhY2Nlc3NfYnl0ZV93aWR0aCkgPD0KKwkJICAgIHJlZ2lvbl9sZW5ndGgpIHsKIAkJCWZpZWxkX3N0YXJ0X29mZnNldCA9Ci0JCQkJQUNQSV9ST1VORF9ET1dOIChmaWVsZF9ieXRlX29mZnNldCwgYWNjZXNzX2J5dGVfd2lkdGgpIC8KLQkJCQlhY2Nlc3NfYnl0ZV93aWR0aDsKKwkJCSAgICBBQ1BJX1JPVU5EX0RPV04oZmllbGRfYnl0ZV9vZmZzZXQsCisJCQkJCSAgICBhY2Nlc3NfYnl0ZV93aWR0aCkgLworCQkJICAgIGFjY2Vzc19ieXRlX3dpZHRoOwogCiAJCQlmaWVsZF9lbmRfb2Zmc2V0ID0KLQkJCQlBQ1BJX1JPVU5EX1VQICgoZmllbGRfYnl0ZV9sZW5ndGggKyBmaWVsZF9ieXRlX29mZnNldCksCi0JCQkJCWFjY2Vzc19ieXRlX3dpZHRoKSAvIGFjY2Vzc19ieXRlX3dpZHRoOworCQkJICAgIEFDUElfUk9VTkRfVVAoKGZpZWxkX2J5dGVfbGVuZ3RoICsKKwkJCQkJICAgZmllbGRfYnl0ZV9vZmZzZXQpLAorCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSAvCisJCQkgICAgYWNjZXNzX2J5dGVfd2lkdGg7CiAKIAkJCWFjY2Vzc2VzID0gZmllbGRfZW5kX29mZnNldCAtIGZpZWxkX3N0YXJ0X29mZnNldDsKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJCQkiYWNjZXNzX3dpZHRoICVkIGVuZCBpcyB3aXRoaW4gcmVnaW9uXG4iLCBhY2Nlc3NfYnl0ZV93aWR0aCkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJCSAgImFjY2Vzc193aWR0aCAlZCBlbmQgaXMgd2l0aGluIHJlZ2lvblxuIiwKKwkJCQkJICBhY2Nlc3NfYnl0ZV93aWR0aCkpOwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkJCSJGaWVsZCBTdGFydCAlZCwgRmllbGQgRW5kICVkIC0tIHJlcXVpcmVzICVkIGFjY2Vzc2VzXG4iLAotCQkJCQlmaWVsZF9zdGFydF9vZmZzZXQsIGZpZWxkX2VuZF9vZmZzZXQsIGFjY2Vzc2VzKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCQkJICAiRmllbGQgU3RhcnQgJWQsIEZpZWxkIEVuZCAlZCAtLSByZXF1aXJlcyAlZCBhY2Nlc3Nlc1xuIiwKKwkJCQkJICBmaWVsZF9zdGFydF9vZmZzZXQsIGZpZWxkX2VuZF9vZmZzZXQsCisJCQkJCSAgYWNjZXNzZXMpKTsKIAogCQkJLyogU2luZ2xlIGFjY2VzcyBpcyBvcHRpbWFsICovCiAKIAkJCWlmIChhY2Nlc3NlcyA8PSAxKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJCQkiRW50aXJlIGZpZWxkIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIG9uZSBvcGVyYXRpb24gb2Ygc2l6ZSAlZFxuIiwKLQkJCQkJYWNjZXNzX2J5dGVfd2lkdGgpKTsKLQkJCQlyZXR1cm5fVkFMVUUgKGFjY2Vzc19ieXRlX3dpZHRoKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCQkJCSAgIkVudGlyZSBmaWVsZCBjYW4gYmUgYWNjZXNzZWQgd2l0aCBvbmUgb3BlcmF0aW9uIG9mIHNpemUgJWRcbiIsCisJCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCQkJcmV0dXJuX1ZBTFVFKGFjY2Vzc19ieXRlX3dpZHRoKTsKIAkJCX0KIAogCQkJLyoKQEAgLTE3MiwzMCArMTY4LDMwIEBACiAJCQkgKiB0cnkgdGhlIG5leHQgd2lkZXIgYWNjZXNzIG9uIG5leHQgaXRlcmF0aW9uCiAJCQkgKi8KIAkJCWlmIChhY2Nlc3NlcyA8IG1pbmltdW1fYWNjZXNzZXMpIHsKLQkJCQltaW5pbXVtX2FjY2Vzc2VzICAgPSBhY2Nlc3NlczsKKwkJCQltaW5pbXVtX2FjY2Vzc2VzID0gYWNjZXNzZXM7CiAJCQkJbWluaW11bV9hY2Nlc3Nfd2lkdGggPSBhY2Nlc3NfYnl0ZV93aWR0aDsKIAkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkiYWNjZXNzX3dpZHRoICVkIGVuZCBpcyBOT1Qgd2l0aGluIHJlZ2lvblxuIiwgYWNjZXNzX2J5dGVfd2lkdGgpKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCQkgICJhY2Nlc3Nfd2lkdGggJWQgZW5kIGlzIE5PVCB3aXRoaW4gcmVnaW9uXG4iLAorCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSk7CiAJCQlpZiAoYWNjZXNzX2J5dGVfd2lkdGggPT0gMSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkJCSJGaWVsZCBnb2VzIGJleW9uZCBlbmQtb2YtcmVnaW9uIVxuIikpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCQkJICAiRmllbGQgZ29lcyBiZXlvbmQgZW5kLW9mLXJlZ2lvbiFcbiIpKTsKIAogCQkJCS8qIEZpZWxkIGRvZXMgbm90IGZpdCBpbiB0aGUgcmVnaW9uIGF0IGFsbCAqLwogCi0JCQkJcmV0dXJuX1ZBTFVFICgwKTsKKwkJCQlyZXR1cm5fVkFMVUUoMCk7CiAJCQl9CiAKIAkJCS8qCiAJCQkgKiBUaGlzIHdpZHRoIGdvZXMgYmV5b25kIHRoZSBlbmQtb2YtcmVnaW9uLCBiYWNrIG9mZiB0bwogCQkJICogcHJldmlvdXMgYWNjZXNzCiAJCQkgKi8KLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkJIkJhY2tpbmcgb2ZmIHRvIHByZXZpb3VzIG9wdGltYWwgYWNjZXNzIHdpZHRoIG9mICVkXG4iLAotCQkJCQltaW5pbXVtX2FjY2Vzc193aWR0aCkpOwotCQkJcmV0dXJuX1ZBTFVFIChtaW5pbXVtX2FjY2Vzc193aWR0aCk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCQkJICAiQmFja2luZyBvZmYgdG8gcHJldmlvdXMgb3B0aW1hbCBhY2Nlc3Mgd2lkdGggb2YgJWRcbiIsCisJCQkJCSAgbWluaW11bV9hY2Nlc3Nfd2lkdGgpKTsKKwkJCXJldHVybl9WQUxVRShtaW5pbXVtX2FjY2Vzc193aWR0aCk7CiAJCX0KIAl9CiAKQEAgLTIwMywxMiArMTk5LDExIEBACiAJICogQ291bGQgbm90IHJlYWQvd3JpdGUgZmllbGQgd2l0aCBvbmUgb3BlcmF0aW9uLAogCSAqIGp1c3QgdXNlIG1heCBhY2Nlc3Mgd2lkdGgKIAkgKi8KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkiQ2Fubm90IGFjY2VzcyBmaWVsZCBpbiBvbmUgb3BlcmF0aW9uLCB1c2luZyB3aWR0aCA4XG4iKSk7Ci0JcmV0dXJuX1ZBTFVFICg4KTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgIkNhbm5vdCBhY2Nlc3MgZmllbGQgaW4gb25lIG9wZXJhdGlvbiwgdXNpbmcgd2lkdGggOFxuIikpOworCXJldHVybl9WQUxVRSg4KTsKIH0KLSNlbmRpZiAvKiBBQ1BJX1VOREVSX0RFVkVMT1BNRU5UICovCi0KKyNlbmRpZgkJCQkvKiBBQ1BJX1VOREVSX0RFVkVMT1BNRU5UICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjI2LDE4ICsyMjEsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB1MzIKLWFjcGlfZXhfZGVjb2RlX2ZpZWxkX2FjY2VzcyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9mbGFncywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXR1cm5fYnl0ZV9hbGlnbm1lbnQpCithY3BpX2V4X2RlY29kZV9maWVsZF9hY2Nlc3ModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgdTggZmllbGRfZmxhZ3MsIHUzMiAqIHJldHVybl9ieXRlX2FsaWdubWVudCkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzczsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfYWxpZ25tZW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X2xlbmd0aDsKKwl1MzIgYWNjZXNzOworCXUzMiBieXRlX2FsaWdubWVudDsKKwl1MzIgYml0X2xlbmd0aDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2RlY29kZV9maWVsZF9hY2Nlc3MiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2RlY29kZV9maWVsZF9hY2Nlc3MiKTsKIAogCWFjY2VzcyA9IChmaWVsZF9mbGFncyAmIEFNTF9GSUVMRF9BQ0NFU1NfVFlQRV9NQVNLKTsKIApAQCAtMjQ2LDkgKzIzNywxMiBAQAogCiAjaWZkZWYgQUNQSV9VTkRFUl9ERVZFTE9QTUVOVAogCQlieXRlX2FsaWdubWVudCA9Ci0JCQlhY3BpX2V4X2dlbmVyYXRlX2FjY2VzcyAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAotCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKLQkJCQkweEZGRkZGRkZGIC8qIFRlbXAgdW50aWwgd2UgcGFzcyByZWdpb25fbGVuZ3RoIGFzIHBhcmFtZXRlciAqLyk7CisJCSAgICBhY3BpX2V4X2dlbmVyYXRlX2FjY2VzcyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkgICAgc3RhcnRfZmllbGRfYml0X29mZnNldCwKKwkJCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKKwkJCQkJICAgIDB4RkZGRkZGRkYKKwkJCQkJICAgIC8qIFRlbXAgdW50aWwgd2UgcGFzcyByZWdpb25fbGVuZ3RoIGFzIHBhcmFtZXRlciAqLworCQkJCQkgICAgKTsKIAkJYml0X2xlbmd0aCA9IGJ5dGVfYWxpZ25tZW50ICogODsKICNlbmRpZgogCkBAIC0yNTcsMzYgKzI1MSwzNSBAQAogCQlicmVhazsKIAogCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19CWVRFOgotCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19CVUZGRVI6ICAgLyogQUNQSSAyLjAgKFNNQnVzIEJ1ZmZlcikgKi8KKwljYXNlIEFNTF9GSUVMRF9BQ0NFU1NfQlVGRkVSOgkvKiBBQ1BJIDIuMCAoU01CdXMgQnVmZmVyKSAqLwogCQlieXRlX2FsaWdubWVudCA9IDE7Ci0JCWJpdF9sZW5ndGggICAgPSA4OworCQliaXRfbGVuZ3RoID0gODsKIAkJYnJlYWs7CiAKIAljYXNlIEFNTF9GSUVMRF9BQ0NFU1NfV09SRDoKIAkJYnl0ZV9hbGlnbm1lbnQgPSAyOwotCQliaXRfbGVuZ3RoICAgID0gMTY7CisJCWJpdF9sZW5ndGggPSAxNjsKIAkJYnJlYWs7CiAKIAljYXNlIEFNTF9GSUVMRF9BQ0NFU1NfRFdPUkQ6CiAJCWJ5dGVfYWxpZ25tZW50ID0gNDsKLQkJYml0X2xlbmd0aCAgICA9IDMyOworCQliaXRfbGVuZ3RoID0gMzI7CiAJCWJyZWFrOwogCi0JY2FzZSBBTUxfRklFTERfQUNDRVNTX1FXT1JEOiAgICAvKiBBQ1BJIDIuMCAqLworCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19RV09SRDoJLyogQUNQSSAyLjAgKi8KIAkJYnl0ZV9hbGlnbm1lbnQgPSA4OwotCQliaXRfbGVuZ3RoICAgID0gNjQ7CisJCWJpdF9sZW5ndGggPSA2NDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQkvKiBJbnZhbGlkIGZpZWxkIGFjY2VzcyB0eXBlICovCiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiVW5rbm93biBmaWVsZCBhY2Nlc3MgdHlwZSAlWFxuIiwKLQkJCWFjY2VzcykpOwotCQlyZXR1cm5fVkFMVUUgKDApOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVua25vd24gZmllbGQgYWNjZXNzIHR5cGUgJVhcbiIsIGFjY2VzcykpOworCQlyZXR1cm5fVkFMVUUoMCk7CiAJfQogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgeworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgewogCQkvKgogCQkgKiBidWZmZXJfZmllbGQgYWNjZXNzIGNhbiBiZSBvbiBhbnkgYnl0ZSBib3VuZGFyeSwgc28gdGhlCiAJCSAqIGJ5dGVfYWxpZ25tZW50IGlzIGFsd2F5cyAxIGJ5dGUgLS0gcmVnYXJkbGVzcyBvZiBhbnkgYnl0ZV9hbGlnbm1lbnQKQEAgLTI5NiwxMCArMjg5LDkgQEAKIAl9CiAKIAkqcmV0dXJuX2J5dGVfYWxpZ25tZW50ID0gYnl0ZV9hbGlnbm1lbnQ7Ci0JcmV0dXJuX1ZBTFVFIChiaXRfbGVuZ3RoKTsKKwlyZXR1cm5fVkFMVUUoYml0X2xlbmd0aCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3QKQEAgLTMyMiwyMCArMzE0LDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZmxhZ3MsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hdHRyaWJ1dGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9iaXRfcG9zaXRpb24sCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9iaXRfbGVuZ3RoKQorYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkJIHU4IGZpZWxkX2ZsYWdzLAorCQkJCSB1OCBmaWVsZF9hdHRyaWJ1dGUsCisJCQkJIHUzMiBmaWVsZF9iaXRfcG9zaXRpb24sIHUzMiBmaWVsZF9iaXRfbGVuZ3RoKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2JpdF93aWR0aDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfYWxpZ25tZW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVhcmVzdF9ieXRlX2FkZHJlc3M7CisJdTMyIGFjY2Vzc19iaXRfd2lkdGg7CisJdTMyIGJ5dGVfYWxpZ25tZW50OworCXUzMiBuZWFyZXN0X2J5dGVfYWRkcmVzczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfcHJlcF9jb21tb25fZmllbGRfb2JqZWN0Iik7CiAKIAkvKgogCSAqIE5vdGU6IHRoZSBzdHJ1Y3R1cmUgYmVpbmcgaW5pdGlhbGl6ZWQgaXMgdGhlCkBAIC0zNjEsMTYgKzM0OSwxNiBAQAogCSAqIEZvciBhbGwgb3RoZXIgYWNjZXNzIHR5cGVzIChCeXRlLCBXb3JkLCBEd29yZCwgUXdvcmQpLCB0aGUgQml0d2lkdGggaXMKIAkgKiB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYXMgdGhlIGJ5dGVfYWxpZ25tZW50LgogCSAqLwotCWFjY2Vzc19iaXRfd2lkdGggPSBhY3BpX2V4X2RlY29kZV9maWVsZF9hY2Nlc3MgKG9ial9kZXNjLCBmaWVsZF9mbGFncywKLQkJCSAgJmJ5dGVfYWxpZ25tZW50KTsKKwlhY2Nlc3NfYml0X3dpZHRoID0gYWNwaV9leF9kZWNvZGVfZmllbGRfYWNjZXNzKG9ial9kZXNjLCBmaWVsZF9mbGFncywKKwkJCQkJCSAgICAgICAmYnl0ZV9hbGlnbm1lbnQpOwogCWlmICghYWNjZXNzX2JpdF93aWR0aCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1ZBTFVFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1ZBTFVFKTsKIAl9CiAKIAkvKiBTZXR1cCB3aWR0aCAoYWNjZXNzIGdyYW51bGFyaXR5KSBmaWVsZHMgKi8KIAogCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGggPSAodTgpCi0JCQlBQ1BJX0RJVl84IChhY2Nlc3NfYml0X3dpZHRoKTsgICAgICAgICAgLyogMSwgIDIsICA0LCAgOCAqLworCSAgICBBQ1BJX0RJVl84KGFjY2Vzc19iaXRfd2lkdGgpOwkvKiAxLCAgMiwgIDQsICA4ICovCiAKIAlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggPSAodTgpIGFjY2Vzc19iaXRfd2lkdGg7CiAKQEAgLTM4NSwzMCArMzczLDMwIEBACiAJICogcmVnaW9uIG9yIGJ1ZmZlci4KIAkgKi8KIAluZWFyZXN0X2J5dGVfYWRkcmVzcyA9Ci0JCQlBQ1BJX1JPVU5EX0JJVFNfRE9XTl9UT19CWVRFUyAoZmllbGRfYml0X3Bvc2l0aW9uKTsKKwkgICAgQUNQSV9ST1VORF9CSVRTX0RPV05fVE9fQllURVMoZmllbGRfYml0X3Bvc2l0aW9uKTsKIAlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgPSAodTMyKQotCQkJQUNQSV9ST1VORF9ET1dOIChuZWFyZXN0X2J5dGVfYWRkcmVzcywgYnl0ZV9hbGlnbm1lbnQpOworCSAgICBBQ1BJX1JPVU5EX0RPV04obmVhcmVzdF9ieXRlX2FkZHJlc3MsIGJ5dGVfYWxpZ25tZW50KTsKIAogCS8qCiAJICogc3RhcnRfZmllbGRfYml0X29mZnNldCBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBiaXQgb2YgdGhlIGZpZWxkIHdpdGhpbgogCSAqIGEgZmllbGQgZGF0dW0uCiAJICovCiAJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0ID0gKHU4KQotCQkoZmllbGRfYml0X3Bvc2l0aW9uIC0gQUNQSV9NVUxfOCAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0KSk7CisJICAgIChmaWVsZF9iaXRfcG9zaXRpb24gLQorCSAgICAgQUNQSV9NVUxfOChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQpKTsKIAogCS8qCiAJICogRG9lcyB0aGUgZW50aXJlIGZpZWxkIGZpdCB3aXRoaW4gYSBzaW5nbGUgZmllbGQgYWNjZXNzIGVsZW1lbnQ/IChkYXR1bSkKIAkgKiAoaS5lLiwgd2l0aG91dCBjcm9zc2luZyBhIGRhdHVtIGJvdW5kYXJ5KQogCSAqLwotCWlmICgob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0ICsgZmllbGRfYml0X2xlbmd0aCkgPD0KLQkJCSh1MTYpIGFjY2Vzc19iaXRfd2lkdGgpIHsKKwlpZiAoKG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCArCisJICAgICBmaWVsZF9iaXRfbGVuZ3RoKSA8PSAodTE2KSBhY2Nlc3NfYml0X3dpZHRoKSB7CiAJCW9ial9kZXNjLT5jb21tb24uZmxhZ3MgfD0gQU9QT0JKX1NJTkdMRV9EQVRVTTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcHJlcF9maWVsZF92YWx1ZQpAQCAtNDIyLDUxICs0MTAsNDkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9wcmVwX2ZpZWxkX3ZhbHVlICgKLQlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAgICppbmZvKQorYWNwaV9zdGF0dXMgYWNwaV9leF9wcmVwX2ZpZWxkX3ZhbHVlKHN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICppbmZvKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1MzIgdHlwZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9wcmVwX2ZpZWxkX3ZhbHVlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9wcmVwX2ZpZWxkX3ZhbHVlIik7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCiAJaWYgKGluZm8tPmZpZWxkX3R5cGUgIT0gQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEKSB7CiAJCWlmICghaW5mby0+cmVnaW9uX25vZGUpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTnVsbCByZWdpb25fbm9kZVxuIikpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTk9fT1BFUkFORCk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiTnVsbCByZWdpb25fbm9kZVxuIikpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKIAkJfQogCi0JCXR5cGUgPSBhY3BpX25zX2dldF90eXBlIChpbmZvLT5yZWdpb25fbm9kZSk7CisJCXR5cGUgPSBhY3BpX25zX2dldF90eXBlKGluZm8tPnJlZ2lvbl9ub2RlKTsKIAkJaWYgKHR5cGUgIT0gQUNQSV9UWVBFX1JFR0lPTikgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIk5lZWRlZCBSZWdpb24sIGZvdW5kIHR5cGUgJVggKCVzKVxuIiwKLQkJCQl0eXBlLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKHR5cGUpKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJOZWVkZWQgUmVnaW9uLCBmb3VuZCB0eXBlICVYICglcylcbiIsCisJCQkJCSAgdHlwZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpKSk7CiAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KIAl9CiAKIAkvKiBBbGxvY2F0ZSBhIG5ldyBmaWVsZCBvYmplY3QgKi8KIAotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChpbmZvLT5maWVsZF90eXBlKTsKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChpbmZvLT5maWVsZF90eXBlKTsKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogSW5pdGlhbGl6ZSBhcmVhcyBvZiB0aGUgb2JqZWN0IHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgZmllbGRzICovCiAKIAlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUgPSBpbmZvLT5maWVsZF9ub2RlOwotCXN0YXR1cyA9IGFjcGlfZXhfcHJlcF9jb21tb25fZmllbGRfb2JqZWN0IChvYmpfZGVzYywgaW5mby0+ZmllbGRfZmxhZ3MsCi0JCQkgaW5mby0+YXR0cmlidXRlLCBpbmZvLT5maWVsZF9iaXRfcG9zaXRpb24sIGluZm8tPmZpZWxkX2JpdF9sZW5ndGgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKG9ial9kZXNjKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXhfcHJlcF9jb21tb25fZmllbGRfb2JqZWN0KG9ial9kZXNjLCBpbmZvLT5maWVsZF9mbGFncywKKwkJCQkJCSAgaW5mby0+YXR0cmlidXRlLAorCQkJCQkJICBpbmZvLT5maWVsZF9iaXRfcG9zaXRpb24sCisJCQkJCQkgIGluZm8tPmZpZWxkX2JpdF9sZW5ndGgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyhvYmpfZGVzYyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEluaXRpYWxpemUgYXJlYXMgb2YgdGhlIG9iamVjdCB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgZmllbGQgdHlwZSAqLwpAQCAtNDc0LDcxICs0NjAsNzMgQEAKIAlzd2l0Y2ggKGluZm8tPmZpZWxkX3R5cGUpIHsKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAKLQkJb2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmogPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKGluZm8tPnJlZ2lvbl9ub2RlKTsKKwkJb2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmogPQorCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPnJlZ2lvbl9ub2RlKTsKIAogCQkvKiBBbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSBmb3IgdGhlIGNvbnRhaW5lciAqLwogCi0JCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmopOworCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmopOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKLQkJCSJyZWdpb25fZmllbGQ6IGJpdF9vZmYgJVgsIE9mZiAlWCwgR3JhbiAlWCwgUmVnaW9uICVwXG4iLAotCQkJb2JqX2Rlc2MtPmZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsIG9ial9kZXNjLT5maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAotCQkJb2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLCBvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCQkgICJyZWdpb25fZmllbGQ6IGJpdF9vZmYgJVgsIE9mZiAlWCwgR3JhbiAlWCwgUmVnaW9uICVwXG4iLAorCQkJCSAgb2JqX2Rlc2MtPmZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCisJCQkJICBvYmpfZGVzYy0+ZmllbGQuYmFzZV9ieXRlX29mZnNldCwKKwkJCQkgIG9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKKwkJCQkgIG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqKSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgogCi0JCW9ial9kZXNjLT5iYW5rX2ZpZWxkLnZhbHVlICAgPSBpbmZvLT5iYW5rX3ZhbHVlOwotCQlvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKLQkJCQkgaW5mby0+cmVnaW9uX25vZGUpOwotCQlvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaiA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoCi0JCQkJIGluZm8tPnJlZ2lzdGVyX25vZGUpOworCQlvYmpfZGVzYy0+YmFua19maWVsZC52YWx1ZSA9IGluZm8tPmJhbmtfdmFsdWU7CisJCW9ial9kZXNjLT5iYW5rX2ZpZWxkLnJlZ2lvbl9vYmogPQorCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPnJlZ2lvbl9ub2RlKTsKKwkJb2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmogPQorCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPnJlZ2lzdGVyX25vZGUpOwogCiAJCS8qIEFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGZvciB0aGUgYXR0YWNoZWQgb2JqZWN0cyAqLwogCi0JCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaik7Ci0JCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmopOworCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaik7CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaik7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJIkJhbmsgRmllbGQ6IGJpdF9vZmYgJVgsIE9mZiAlWCwgR3JhbiAlWCwgUmVnaW9uICVwLCBiYW5rX3JlZyAlcFxuIiwKLQkJCW9ial9kZXNjLT5iYW5rX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCi0JCQlvYmpfZGVzYy0+YmFua19maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAotCQkJb2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAotCQkJb2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaiwKLQkJCW9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCSAgIkJhbmsgRmllbGQ6IGJpdF9vZmYgJVgsIE9mZiAlWCwgR3JhbiAlWCwgUmVnaW9uICVwLCBiYW5rX3JlZyAlcFxuIiwKKwkJCQkgIG9ial9kZXNjLT5iYW5rX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCisJCQkJICBvYmpfZGVzYy0+YmFua19maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAorCQkJCSAgb2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAorCQkJCSAgb2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaiwKKwkJCQkgIG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqKSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAotCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKLQkJCQkgaW5mby0+cmVnaXN0ZXJfbm9kZSk7Ci0JCW9ial9kZXNjLT5pbmRleF9maWVsZC5kYXRhX29iaiA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoCi0JCQkJIGluZm8tPmRhdGFfcmVnaXN0ZXJfbm9kZSk7Ci0JCW9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSAgPSAodTMyKQotCQkJKGluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbiAvIEFDUElfTVVMXzggKAotCQkJCQkgIG9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpOworCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqID0KKwkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChpbmZvLT5yZWdpc3Rlcl9ub2RlKTsKKwkJb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqID0KKwkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChpbmZvLT5kYXRhX3JlZ2lzdGVyX25vZGUpOworCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQudmFsdWUgPSAodTMyKQorCQkgICAgKGluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbiAvCisJCSAgICAgQUNQSV9NVUxfOChvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpKTsKIAotCQlpZiAoIW9ial9kZXNjLT5pbmRleF9maWVsZC5kYXRhX29iaiB8fCAhb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaikgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTnVsbCBJbmRleCBPYmplY3QgZHVyaW5nIGZpZWxkIHByZXBcbiIpKTsKLQkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjIChvYmpfZGVzYyk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CisJCWlmICghb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqCisJCSAgICB8fCAhb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaikgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJOdWxsIEluZGV4IE9iamVjdCBkdXJpbmcgZmllbGQgcHJlcFxuIikpOworCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Mob2JqX2Rlc2MpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJCX0KIAogCQkvKiBBbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSBmb3IgdGhlIGF0dGFjaGVkIG9iamVjdHMgKi8KIAotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKG9ial9kZXNjLT5pbmRleF9maWVsZC5kYXRhX29iaik7Ci0JCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaik7CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmopOworCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaik7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJImluZGV4X2ZpZWxkOiBiaXRfb2ZmICVYLCBPZmYgJVgsIFZhbHVlICVYLCBHcmFuICVYLCBJbmRleCAlcCwgRGF0YSAlcFxuIiwKLQkJCW9ial9kZXNjLT5pbmRleF9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAotCQkJb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCi0JCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQudmFsdWUsCi0JCQlvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqLAotCQkJb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCSAgImluZGV4X2ZpZWxkOiBiaXRfb2ZmICVYLCBPZmYgJVgsIFZhbHVlICVYLCBHcmFuICVYLCBJbmRleCAlcCwgRGF0YSAlcFxuIiwKKwkJCQkgIG9ial9kZXNjLT5pbmRleF9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAorCQkJCSAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCisJCQkJICBvYmpfZGVzYy0+aW5kZXhfZmllbGQudmFsdWUsCisJCQkJICBvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkJICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqLAorCQkJCSAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqKSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTU1MCwxNSArNTM4LDE2IEBACiAJICogU3RvcmUgdGhlIGNvbnN0cnVjdGVkIGRlc2NyaXB0b3IgKG9ial9kZXNjKSBpbnRvIHRoZSBwYXJlbnQgTm9kZSwKIAkgKiBwcmVzZXJ2aW5nIHRoZSBjdXJyZW50IHR5cGUgb2YgdGhhdCBuYW1lZF9vYmouCiAJICovCi0Jc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChpbmZvLT5maWVsZF9ub2RlLCBvYmpfZGVzYywKLQkJCSAgYWNwaV9uc19nZXRfdHlwZSAoaW5mby0+ZmllbGRfbm9kZSkpOworCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdChpbmZvLT5maWVsZF9ub2RlLCBvYmpfZGVzYywKKwkJCQkgICAgICAgYWNwaV9uc19nZXRfdHlwZShpbmZvLT5maWVsZF9ub2RlKSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsICJTZXQgbmFtZWRfb2JqICVwIFslNC40c10sIG9ial9kZXNjICVwXG4iLAotCQkJaW5mby0+ZmllbGRfbm9kZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChpbmZvLT5maWVsZF9ub2RlKSwgb2JqX2Rlc2MpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgIlNldCBuYW1lZF9vYmogJXAgWyU0LjRzXSwgb2JqX2Rlc2MgJXBcbiIsCisJCQkgIGluZm8tPmZpZWxkX25vZGUsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShpbmZvLT5maWVsZF9ub2RlKSwgb2JqX2Rlc2MpKTsKIAogCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlZ2lvbi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVnaW9uLmMKaW5kZXggNzIzYWFlZi4uOWEyZjViZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVnaW9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVnaW9uLmMKQEAgLTQyLDE0ICs0MiwxMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhyZWdpb24iKQotCitBQ1BJX01PRFVMRV9OQU1FKCJleHJlZ2lvbiIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjgsMjcgKzY1LDIzIEBACiAgKiBERVNDUklQVElPTjogSGFuZGxlciBmb3IgdGhlIFN5c3RlbSBNZW1vcnkgYWRkcmVzcyBzcGFjZSAoT3AgUmVnaW9uKQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV9tZW1vcnlfc3BhY2VfaGFuZGxlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIGFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfd2lkdGgsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2lvbl9jb250ZXh0KQorYWNwaV9leF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXIodTMyIGZ1bmN0aW9uLAorCQkJCSAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCQkgICAgdTMyIGJpdF93aWR0aCwKKwkJCQkgICAgYWNwaV9pbnRlZ2VyICogdmFsdWUsCisJCQkJICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqcmVnaW9uX2NvbnRleHQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2dpY2FsX2FkZHJfcHRyID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9tZW1fc3BhY2VfY29udGV4dCAgICptZW1faW5mbyA9IHJlZ2lvbl9jb250ZXh0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgd2luZG93X3NpemU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdm9pZCAqbG9naWNhbF9hZGRyX3B0ciA9IE5VTEw7CisJc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQgKm1lbV9pbmZvID0gcmVnaW9uX2NvbnRleHQ7CisJdTMyIGxlbmd0aDsKKwlhY3BpX3NpemUgd2luZG93X3NpemU7CiAjaWZuZGVmIEFDUElfTUlTQUxJR05FRF9UUkFOU0ZFUlMKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcjsKKwl1MzIgcmVtYWluZGVyOwogI2VuZGlmCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfc3lzdGVtX21lbW9yeV9zcGFjZV9oYW5kbGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXIiKTsKIAogCS8qIFZhbGlkYXRlIGFuZCB0cmFuc2xhdGUgdGhlIGJpdCB3aWR0aCAqLwogCkBAIC0xMTAsOSArMTAzLDEwIEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIHN5c3RlbV9tZW1vcnkgd2lkdGggJWRcbiIsCi0JCQliaXRfd2lkdGgpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9WQUxVRSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSW52YWxpZCBzeXN0ZW1fbWVtb3J5IHdpZHRoICVkXG4iLAorCQkJCSAgYml0X3dpZHRoKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9WQUxVRSk7CiAJfQogCiAjaWZuZGVmIEFDUElfTUlTQUxJR05FRF9UUkFOU0ZFUlMKQEAgLTEyMCw5ICsxMTQsMTAgQEAKIAkgKiBIYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IG5vbi1hbGlnbmVkIGRhdGEgdHJhbnNmZXJzLCB3ZSBtdXN0IHZlcmlmeQogCSAqIHRoZSByZXF1ZXN0LgogCSAqLwotCSh2b2lkKSBhY3BpX3V0X3Nob3J0X2RpdmlkZSAoKGFjcGlfaW50ZWdlcikgYWRkcmVzcywgbGVuZ3RoLCBOVUxMLCAmcmVtYWluZGVyKTsKKwkodm9pZClhY3BpX3V0X3Nob3J0X2RpdmlkZSgoYWNwaV9pbnRlZ2VyKSBhZGRyZXNzLCBsZW5ndGgsIE5VTEwsCisJCQkJICAgJnJlbWFpbmRlcik7CiAJaWYgKHJlbWFpbmRlciAhPSAwKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0FMSUdOTUVOVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQUxJR05NRU5UKTsKIAl9CiAjZW5kaWYKIApAQCAtMTMyLDkgKzEyNywxMCBAQAogCSAqICAgIDIpIEFkZHJlc3MgYmV5b25kIHRoZSBjdXJyZW50IG1hcHBpbmc/CiAJICovCiAJaWYgKChhZGRyZXNzIDwgbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzKSB8fAotCQkoKChhY3BpX2ludGVnZXIpIGFkZHJlc3MgKyBsZW5ndGgpID4KLQkJCSgoYWNwaV9pbnRlZ2VyKQotCQkJbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzICsgbWVtX2luZm8tPm1hcHBlZF9sZW5ndGgpKSkgeworCSAgICAoKChhY3BpX2ludGVnZXIpIGFkZHJlc3MgKyBsZW5ndGgpID4gKChhY3BpX2ludGVnZXIpCisJCQkJCQkgIG1lbV9pbmZvLT4KKwkJCQkJCSAgbWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MgKworCQkJCQkJICBtZW1faW5mby0+bWFwcGVkX2xlbmd0aCkpKSB7CiAJCS8qCiAJCSAqIFRoZSByZXF1ZXN0IGNhbm5vdCBiZSByZXNvbHZlZCBieSB0aGUgY3VycmVudCBtZW1vcnkgbWFwcGluZzsKIAkJICogRGVsZXRlIHRoZSBleGlzdGluZyBtYXBwaW5nIGFuZCBjcmVhdGUgYSBuZXcgb25lLgpAQCAtMTQyLDggKzEzOCw4IEBACiAJCWlmIChtZW1faW5mby0+bWFwcGVkX2xlbmd0aCkgewogCQkJLyogVmFsaWQgbWFwcGluZywgZGVsZXRlIGl0ICovCiAKLQkJCWFjcGlfb3NfdW5tYXBfbWVtb3J5IChtZW1faW5mby0+bWFwcGVkX2xvZ2ljYWxfYWRkcmVzcywKLQkJCQkJICAgbWVtX2luZm8tPm1hcHBlZF9sZW5ndGgpOworCQkJYWNwaV9vc191bm1hcF9tZW1vcnkobWVtX2luZm8tPm1hcHBlZF9sb2dpY2FsX2FkZHJlc3MsCisJCQkJCSAgICAgbWVtX2luZm8tPm1hcHBlZF9sZW5ndGgpOwogCQl9CiAKIAkJLyoKQEAgLTE1MSw3ICsxNDcsNyBAQAogCQkgKiBjb25zdHJhaW4gdGhlIG1heGltdW0gbWFwcGluZyBzaXplIHRvIHNvbWV0aGluZyByZWFzb25hYmxlLgogCQkgKi8KIAkJd2luZG93X3NpemUgPSAoYWNwaV9zaXplKQotCQkJKChtZW1faW5mby0+YWRkcmVzcyArIG1lbV9pbmZvLT5sZW5ndGgpIC0gYWRkcmVzcyk7CisJCSAgICAoKG1lbV9pbmZvLT5hZGRyZXNzICsgbWVtX2luZm8tPmxlbmd0aCkgLSBhZGRyZXNzKTsKIAogCQlpZiAod2luZG93X3NpemUgPiBBQ1BJX1NZU01FTV9SRUdJT05fV0lORE9XX1NJWkUpIHsKIAkJCXdpbmRvd19zaXplID0gQUNQSV9TWVNNRU1fUkVHSU9OX1dJTkRPV19TSVpFOwpAQCAtMTU5LDE0ICsxNTUsMTYgQEAKIAogCQkvKiBDcmVhdGUgYSBuZXcgbWFwcGluZyBzdGFydGluZyBhdCB0aGUgYWRkcmVzcyBnaXZlbiAqLwogCi0JCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoYWRkcmVzcywgd2luZG93X3NpemUsCi0JCQkJICAodm9pZCAqKikgJm1lbV9pbmZvLT5tYXBwZWRfbG9naWNhbF9hZGRyZXNzKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYJTguOFgsIHNpemUgJVhcbiIsCi0JCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSwgKHUzMikgd2luZG93X3NpemUpKTsKKwkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5KGFkZHJlc3MsIHdpbmRvd19zaXplLAorCQkJCQkgICAgKHZvaWQgKiopJm1lbV9pbmZvLT4KKwkJCQkJICAgIG1hcHBlZF9sb2dpY2FsX2FkZHJlc3MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYJTguOFgsIHNpemUgJVhcbiIsCisJCQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MpLAorCQkJCQkgICh1MzIpIHdpbmRvd19zaXplKSk7CiAJCQltZW1faW5mby0+bWFwcGVkX2xlbmd0aCA9IDA7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qIFNhdmUgdGhlIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG1hcHBpbmcgc2l6ZSAqLwpAQCAtMTgwLDQyICsxNzgsNDEgQEAKIAkgKiBhY2Nlc3MKIAkgKi8KIAlsb2dpY2FsX2FkZHJfcHRyID0gbWVtX2luZm8tPm1hcHBlZF9sb2dpY2FsX2FkZHJlc3MgKwotCQkJICAgKChhY3BpX2ludGVnZXIpIGFkZHJlc3MgLQotCQkJCQkgIChhY3BpX2ludGVnZXIpIG1lbV9pbmZvLT5tYXBwZWRfcGh5c2ljYWxfYWRkcmVzcyk7CisJICAgICgoYWNwaV9pbnRlZ2VyKSBhZGRyZXNzIC0KKwkgICAgIChhY3BpX2ludGVnZXIpIG1lbV9pbmZvLT5tYXBwZWRfcGh5c2ljYWxfYWRkcmVzcyk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJInN5c3RlbV9tZW1vcnkgJWQgKCVkIHdpZHRoKSBBZGRyZXNzPSU4LjhYJTguOFhcbiIsCi0JCQlmdW5jdGlvbiwgYml0X3dpZHRoLAotCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgInN5c3RlbV9tZW1vcnkgJWQgKCVkIHdpZHRoKSBBZGRyZXNzPSU4LjhYJTguOFhcbiIsCisJCQkgIGZ1bmN0aW9uLCBiaXRfd2lkdGgsIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSkpOwogCi0gICAvKgotCSogUGVyZm9ybSB0aGUgbWVtb3J5IHJlYWQgb3Igd3JpdGUKLQkqCi0JKiBOb3RlOiBGb3IgbWFjaGluZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBub24tYWxpZ25lZCB0cmFuc2ZlcnMsIHRoZSB0YXJnZXQKLQkqIGFkZHJlc3Mgd2FzIGNoZWNrZWQgZm9yIGFsaWdubWVudCBhYm92ZS4gIFdlIGRvIG5vdCBhdHRlbXB0IHRvIGJyZWFrIHRoZQotCSogdHJhbnNmZXIgdXAgaW50byBzbWFsbGVyIChieXRlLXNpemUpIGNodW5rcyBiZWNhdXNlIHRoZSBBTUwgc3BlY2lmaWNhbGx5Ci0JKiBhc2tlZCBmb3IgYSB0cmFuc2ZlciB3aWR0aCB0aGF0IHRoZSBoYXJkd2FyZSBtYXkgcmVxdWlyZS4KLQkqLworCS8qCisJICogUGVyZm9ybSB0aGUgbWVtb3J5IHJlYWQgb3Igd3JpdGUKKwkgKgorCSAqIE5vdGU6IEZvciBtYWNoaW5lcyB0aGF0IGRvIG5vdCBzdXBwb3J0IG5vbi1hbGlnbmVkIHRyYW5zZmVycywgdGhlIHRhcmdldAorCSAqIGFkZHJlc3Mgd2FzIGNoZWNrZWQgZm9yIGFsaWdubWVudCBhYm92ZS4gIFdlIGRvIG5vdCBhdHRlbXB0IHRvIGJyZWFrIHRoZQorCSAqIHRyYW5zZmVyIHVwIGludG8gc21hbGxlciAoYnl0ZS1zaXplKSBjaHVua3MgYmVjYXVzZSB0aGUgQU1MIHNwZWNpZmljYWxseQorCSAqIGFza2VkIGZvciBhIHRyYW5zZmVyIHdpZHRoIHRoYXQgdGhlIGhhcmR3YXJlIG1heSByZXF1aXJlLgorCSAqLwogCXN3aXRjaCAoZnVuY3Rpb24pIHsKIAljYXNlIEFDUElfUkVBRDoKIAogCQkqdmFsdWUgPSAwOwogCQlzd2l0Y2ggKGJpdF93aWR0aCkgewogCQljYXNlIDg6Ci0JCQkqdmFsdWUgPSAoYWNwaV9pbnRlZ2VyKSAqKCh1OCAqKSBsb2dpY2FsX2FkZHJfcHRyKTsKKwkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpICogKCh1OCAqKSBsb2dpY2FsX2FkZHJfcHRyKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgMTY6Ci0JCQkqdmFsdWUgPSAoYWNwaV9pbnRlZ2VyKSAqKCh1MTYgKikgbG9naWNhbF9hZGRyX3B0cik7CisJCQkqdmFsdWUgPSAoYWNwaV9pbnRlZ2VyKSAqICgodTE2ICopIGxvZ2ljYWxfYWRkcl9wdHIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSAzMjoKLQkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpICooKHUzMiAqKSBsb2dpY2FsX2FkZHJfcHRyKTsKKwkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpICogKCh1MzIgKikgbG9naWNhbF9hZGRyX3B0cik7CiAJCQlicmVhazsKIAogI2lmIEFDUElfTUFDSElORV9XSURUSCAhPSAxNgogCQljYXNlIDY0OgotCQkJKnZhbHVlID0gKGFjcGlfaW50ZWdlcikgKigodTY0ICopIGxvZ2ljYWxfYWRkcl9wdHIpOworCQkJKnZhbHVlID0gKGFjcGlfaW50ZWdlcikgKiAoKHU2NCAqKSBsb2dpY2FsX2FkZHJfcHRyKTsKIAkJCWJyZWFrOwogI2VuZGlmCiAJCWRlZmF1bHQ6CkBAIC0yMjgsMjAgKzIyNSwyMCBAQAogCiAJCXN3aXRjaCAoYml0X3dpZHRoKSB7CiAJCWNhc2UgODoKLQkJCSoodTggKikgbG9naWNhbF9hZGRyX3B0ciA9ICh1OCkgKnZhbHVlOworCQkJKih1OCAqKSBsb2dpY2FsX2FkZHJfcHRyID0gKHU4KSAqIHZhbHVlOwogCQkJYnJlYWs7CiAKIAkJY2FzZSAxNjoKLQkJCSoodTE2ICopIGxvZ2ljYWxfYWRkcl9wdHIgPSAodTE2KSAqdmFsdWU7CisJCQkqKHUxNiAqKSBsb2dpY2FsX2FkZHJfcHRyID0gKHUxNikgKiB2YWx1ZTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgMzI6Ci0JCQkqKHUzMiAqKSBsb2dpY2FsX2FkZHJfcHRyID0gKHUzMikgKnZhbHVlOworCQkJKih1MzIgKikgbG9naWNhbF9hZGRyX3B0ciA9ICh1MzIpICogdmFsdWU7CiAJCQlicmVhazsKIAogI2lmIEFDUElfTUFDSElORV9XSURUSCAhPSAxNgogCQljYXNlIDY0OgotCQkJKih1NjQgKikgbG9naWNhbF9hZGRyX3B0ciA9ICh1NjQpICp2YWx1ZTsKKwkJCSoodTY0ICopIGxvZ2ljYWxfYWRkcl9wdHIgPSAodTY0KSAqIHZhbHVlOwogCQkJYnJlYWs7CiAjZW5kaWYKIApAQCAtMjU2LDEwICsyNTMsOSBAQAogCQlicmVhazsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1faW9fc3BhY2VfaGFuZGxlcgpAQCAtMjc5LDM5ICsyNzUsMzUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV9pb19zcGFjZV9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW9uX2NvbnRleHQpCithY3BpX2V4X3N5c3RlbV9pb19zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKKwkJCQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCQl1MzIgYml0X3dpZHRoLAorCQkJCWFjcGlfaW50ZWdlciAqIHZhbHVlLAorCQkJCXZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqcmVnaW9uX2NvbnRleHQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMzI7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIHZhbHVlMzI7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9zeXN0ZW1faW9fc3BhY2VfaGFuZGxlciIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X3N5c3RlbV9pb19zcGFjZV9oYW5kbGVyIik7Ci0KLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkic3lzdGVtX2lPICVkICglZCB3aWR0aCkgQWRkcmVzcz0lOC44WCU4LjhYXG4iLCBmdW5jdGlvbiwgYml0X3dpZHRoLAotCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgInN5c3RlbV9pTyAlZCAoJWQgd2lkdGgpIEFkZHJlc3M9JTguOFglOC44WFxuIiwKKwkJCSAgZnVuY3Rpb24sIGJpdF93aWR0aCwgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MpKSk7CiAKIAkvKiBEZWNvZGUgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlciAqLwogCiAJc3dpdGNoIChmdW5jdGlvbikgewogCWNhc2UgQUNQSV9SRUFEOgogCi0JCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wb3J0ICgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLAotCQkJCSAmdmFsdWUzMiwgYml0X3dpZHRoKTsKKwkJc3RhdHVzID0gYWNwaV9vc19yZWFkX3BvcnQoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywKKwkJCQkJICAgJnZhbHVlMzIsIGJpdF93aWR0aCk7CiAJCSp2YWx1ZSA9IHZhbHVlMzI7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1dSSVRFOgogCi0JCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCAoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywKLQkJCQkgKHUzMikgKnZhbHVlLCBiaXRfd2lkdGgpOworCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywKKwkJCQkJICAgICh1MzIpICogdmFsdWUsIGJpdF93aWR0aCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTMxOSwxMCArMzExLDkgQEAKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcGNpX2NvbmZpZ19zcGFjZV9oYW5kbGVyCkBAIC0zNDIsMjEgKzMzMywxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcGNpX2NvbmZpZ19zcGFjZV9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW9uX2NvbnRleHQpCithY3BpX2V4X3BjaV9jb25maWdfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkJIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJCSB1MzIgYml0X3dpZHRoLAorCQkJCSBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCQkgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX3BjaV9pZCAgICAgICAgICAgICAgKnBjaV9pZDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9yZWdpc3RlcjsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9wY2lfaWQgKnBjaV9pZDsKKwl1MTYgcGNpX3JlZ2lzdGVyOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfcGNpX2NvbmZpZ19zcGFjZV9oYW5kbGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9wY2lfY29uZmlnX3NwYWNlX2hhbmRsZXIiKTsKIAogCS8qCiAJICogIFRoZSBhcmd1bWVudHMgdG8gYWNwaV9vcyhSZWFkfFdyaXRlKXBjaV9jb25maWd1cmF0aW9uIGFyZToKQEAgLTM3MCwyNiArMzU3LDI2IEBACiAJICogIFZhbHVlIC0gaW5wdXQgdmFsdWUgZm9yIHdyaXRlLCBvdXRwdXQgYWRkcmVzcyBmb3IgcmVhZAogCSAqCiAJICovCi0JcGNpX2lkICAgICAgPSAoc3RydWN0IGFjcGlfcGNpX2lkICopIHJlZ2lvbl9jb250ZXh0OworCXBjaV9pZCA9IChzdHJ1Y3QgYWNwaV9wY2lfaWQgKilyZWdpb25fY29udGV4dDsKIAlwY2lfcmVnaXN0ZXIgPSAodTE2KSAodTMyKSBhZGRyZXNzOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJInBjaV9jb25maWcgJWQgKCVkKSBTZWcoJTA0eCkgQnVzKCUwNHgpIERldiglMDR4KSBGdW5jKCUwNHgpIFJlZyglMDR4KVxuIiwKLQkJZnVuY3Rpb24sIGJpdF93aWR0aCwgcGNpX2lkLT5zZWdtZW50LCBwY2lfaWQtPmJ1cywgcGNpX2lkLT5kZXZpY2UsCi0JCXBjaV9pZC0+ZnVuY3Rpb24sIHBjaV9yZWdpc3RlcikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgInBjaV9jb25maWcgJWQgKCVkKSBTZWcoJTA0eCkgQnVzKCUwNHgpIERldiglMDR4KSBGdW5jKCUwNHgpIFJlZyglMDR4KVxuIiwKKwkJCSAgZnVuY3Rpb24sIGJpdF93aWR0aCwgcGNpX2lkLT5zZWdtZW50LCBwY2lfaWQtPmJ1cywKKwkJCSAgcGNpX2lkLT5kZXZpY2UsIHBjaV9pZC0+ZnVuY3Rpb24sIHBjaV9yZWdpc3RlcikpOwogCiAJc3dpdGNoIChmdW5jdGlvbikgewogCWNhc2UgQUNQSV9SRUFEOgogCiAJCSp2YWx1ZSA9IDA7Ci0JCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbiAocGNpX2lkLCBwY2lfcmVnaXN0ZXIsCi0JCQkJIHZhbHVlLCBiaXRfd2lkdGgpOworCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24ocGNpX2lkLCBwY2lfcmVnaXN0ZXIsCisJCQkJCQkJdmFsdWUsIGJpdF93aWR0aCk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1dSSVRFOgogCi0JCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcGNpX2NvbmZpZ3VyYXRpb24gKHBjaV9pZCwgcGNpX3JlZ2lzdGVyLAotCQkJCSAqdmFsdWUsIGJpdF93aWR0aCk7CisJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcGNpX2NvbmZpZ3VyYXRpb24ocGNpX2lkLCBwY2lfcmVnaXN0ZXIsCisJCQkJCQkJICp2YWx1ZSwgYml0X3dpZHRoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzk4LDEwICszODUsOSBAQAogCQlicmVhazsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jbW9zX3NwYWNlX2hhbmRsZXIKQEAgLTQyMSwyNCArNDA3LDE5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jbW9zX3NwYWNlX2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCkKK2FjcGlfZXhfY21vc19zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKKwkJCSAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJICAgdTMyIGJpdF93aWR0aCwKKwkJCSAgIGFjcGlfaW50ZWdlciAqIHZhbHVlLAorCQkJICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfY21vc19zcGFjZV9oYW5kbGVyIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfY21vc19zcGFjZV9oYW5kbGVyIik7Ci0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3BjaV9iYXJfc3BhY2VfaGFuZGxlcgpAQCAtNDU4LDI0ICs0MzksMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3BjaV9iYXJfc3BhY2VfaGFuZGxlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIGFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfd2lkdGgsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2lvbl9jb250ZXh0KQorYWNwaV9leF9wY2lfYmFyX3NwYWNlX2hhbmRsZXIodTMyIGZ1bmN0aW9uLAorCQkJICAgICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkgICAgICB1MzIgYml0X3dpZHRoLAorCQkJICAgICAgYWNwaV9pbnRlZ2VyICogdmFsdWUsCisJCQkgICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9wY2lfYmFyX3NwYWNlX2hhbmRsZXIiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9wY2lfYmFyX3NwYWNlX2hhbmRsZXIiKTsKLQotCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZGF0YV90YWJsZV9zcGFjZV9oYW5kbGVyCkBAIC00OTUsMjQgKzQ3MSwyMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZGF0YV90YWJsZV9zcGFjZV9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW9uX2NvbnRleHQpCithY3BpX2V4X2RhdGFfdGFibGVfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkJIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJCSB1MzIgYml0X3dpZHRoLAorCQkJCSBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCQkgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV93aWR0aCA9IEFDUElfRElWXzggKGJpdF93aWR0aCk7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvZ2ljYWxfYWRkcl9wdHI7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIGJ5dGVfd2lkdGggPSBBQ1BJX0RJVl84KGJpdF93aWR0aCk7CisJdTMyIGk7CisJY2hhciAqbG9naWNhbF9hZGRyX3B0cjsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2RhdGFfdGFibGVfc3BhY2VfaGFuZGxlciIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2RhdGFfdGFibGVfc3BhY2VfaGFuZGxlciIpOwotCi0KLQlsb2dpY2FsX2FkZHJfcHRyID0gQUNQSV9QSFlTQUREUl9UT19QVFIgKGFkZHJlc3MpOworCWxvZ2ljYWxfYWRkcl9wdHIgPSBBQ1BJX1BIWVNBRERSX1RPX1BUUihhZGRyZXNzKTsKIAogCS8qIFBlcmZvcm0gdGhlIG1lbW9yeSByZWFkIG9yIHdyaXRlICovCiAKQEAgLTUyMCwxNyArNDkyLDE1IEBACiAJY2FzZSBBQ1BJX1JFQUQ6CiAKIAkJZm9yIChpID0gMDsgaSA8IGJ5dGVfd2lkdGg7IGkrKykgewotCQkJKChjaGFyICopIHZhbHVlKSBbaV0gPSBsb2dpY2FsX2FkZHJfcHRyW2ldOworCQkJKChjaGFyICopdmFsdWUpW2ldID0gbG9naWNhbF9hZGRyX3B0cltpXTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQUNQSV9XUklURToKIAlkZWZhdWx0OgogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfU1VQUE9SVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzbnRlLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNudGUuYwppbmRleCAyMWQ1Yzc0Li5mZjVkOGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNudGUuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNudGUuYwpAQCAtNDIsNyArNDIsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CkBAIC01MCwxMCArNDksOCBAQAogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhyZXNudGUiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJleHJlc250ZSIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODAsNDEgKzc3LDM3IEBACiAgKiAgICAgIEFDUElfVFlQRV9QQUNLQUdFCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqb2JqZWN0X3B0ciwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQotCithY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKm9iamVjdF9wdHIsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MgPSBOVUxMOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICBlbnRyeV90eXBlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX29iamVjdF90eXBlIGVudHJ5X3R5cGU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9yZXNvbHZlX25vZGVfdG9fdmFsdWUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3Jlc29sdmVfbm9kZV90b192YWx1ZSIpOwogCiAJLyoKIAkgKiBUaGUgc3RhY2sgcG9pbnRlciBwb2ludHMgdG8gYSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAoTm9kZSkuICBHZXQgdGhlCiAJICogb2JqZWN0IHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIE5vZGUuCiAJICovCi0Jbm9kZSAgICAgICA9ICpvYmplY3RfcHRyOwotCXNvdXJjZV9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKLQllbnRyeV90eXBlID0gYWNwaV9uc19nZXRfdHlwZSAoKGFjcGlfaGFuZGxlKSBub2RlKTsKKwlub2RlID0gKm9iamVjdF9wdHI7CisJc291cmNlX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJZW50cnlfdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUoKGFjcGlfaGFuZGxlKSBub2RlKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJFbnRyeT0lcCBzb3VyY2VfZGVzYz0lcCBbJXNdXG4iLAotCQkgbm9kZSwgc291cmNlX2Rlc2MsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoZW50cnlfdHlwZSkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJFbnRyeT0lcCBzb3VyY2VfZGVzYz0lcCBbJXNdXG4iLAorCQkJICBub2RlLCBzb3VyY2VfZGVzYywKKwkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKGVudHJ5X3R5cGUpKSk7CiAKIAlpZiAoKGVudHJ5X3R5cGUgPT0gQUNQSV9UWVBFX0xPQ0FMX0FMSUFTKSB8fAotCQkoZW50cnlfdHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSkgeworCSAgICAoZW50cnlfdHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSkgewogCQkvKiBUaGVyZSBpcyBhbHdheXMgZXhhY3RseSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KIAotCQlub2RlICAgICAgID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsIG5vZGUtPm9iamVjdCk7Ci0JCXNvdXJjZV9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKLQkJZW50cnlfdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUgKChhY3BpX2hhbmRsZSkgbm9kZSk7CisJCW5vZGUgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCBub2RlLT5vYmplY3QpOworCQlzb3VyY2VfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKKwkJZW50cnlfdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUoKGFjcGlfaGFuZGxlKSBub2RlKTsKIAkJKm9iamVjdF9wdHIgPSBub2RlOwogCX0KIApAQCAtMTI0LDE0ICsxMTcsMTQgQEAKIAkgKiAyKSBNZXRob2QgbG9jYWxzIGFuZCBhcmd1bWVudHMgaGF2ZSBhIHBzZXVkby1Ob2RlCiAJICovCiAJaWYgKGVudHJ5X3R5cGUgPT0gQUNQSV9UWVBFX0RFVklDRSB8fAotCQkobm9kZS0+ZmxhZ3MgJiAoQU5PQkpfTUVUSE9EX0FSRyB8IEFOT0JKX01FVEhPRF9MT0NBTCkpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCSAgICAobm9kZS0+ZmxhZ3MgJiAoQU5PQkpfTUVUSE9EX0FSRyB8IEFOT0JKX01FVEhPRF9MT0NBTCkpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJaWYgKCFzb3VyY2VfZGVzYykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIG9iamVjdCBhdHRhY2hlZCB0byBub2RlICVwXG4iLAotCQkJbm9kZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9OT19PUEVSQU5EKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJObyBvYmplY3QgYXR0YWNoZWQgdG8gbm9kZSAlcFxuIiwgbm9kZSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwogCX0KIAogCS8qCkBAIC0xNDEsODMgKzEzNCw4OSBAQAogCXN3aXRjaCAoZW50cnlfdHlwZSkgewogCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAKLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiT2JqZWN0IG5vdCBhIFBhY2thZ2UsIHR5cGUgJXNcbiIsCi0JCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9QQUNLQUdFKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJPYmplY3Qgbm90IGEgUGFja2FnZSwgdHlwZSAlc1xuIiwKKwkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgKHNvdXJjZV9kZXNjKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKLQkJc3RhdHVzID0gYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMgKHNvdXJjZV9kZXNjKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyhzb3VyY2VfZGVzYyk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAogCQkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCi0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiT2JqZWN0IG5vdCBhIEJ1ZmZlciwgdHlwZSAlc1xuIiwKLQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYykpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiT2JqZWN0IG5vdCBhIEJ1ZmZlciwgdHlwZSAlc1xuIiwKKwkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgKHNvdXJjZV9kZXNjKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKLQkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyAoc291cmNlX2Rlc2MpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9hcmd1bWVudHMoc291cmNlX2Rlc2MpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCS8qIFJldHVybiBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKIAkJCW9ial9kZXNjID0gc291cmNlX2Rlc2M7Ci0JCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfU1RSSU5HKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk9iamVjdCBub3QgYSBTdHJpbmcsIHR5cGUgJXNcbiIsCi0JCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9TVFJJTkcpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIk9iamVjdCBub3QgYSBTdHJpbmcsIHR5cGUgJXNcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgIChzb3VyY2VfZGVzYykpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCiAJCS8qIFJldHVybiBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKIAkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKLQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCi0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk9iamVjdCBub3QgYSBJbnRlZ2VyLCB0eXBlICVzXG4iLAotCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiT2JqZWN0IG5vdCBhIEludGVnZXIsIHR5cGUgJXNcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgIChzb3VyY2VfZGVzYykpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCiAJCS8qIFJldHVybiBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKIAkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKLQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSJmaWVsZF9yZWFkIE5vZGU9JXAgc291cmNlX2Rlc2M9JXAgVHlwZT0lWFxuIiwKLQkJCW5vZGUsIHNvdXJjZV9kZXNjLCBlbnRyeV90eXBlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICJmaWVsZF9yZWFkIE5vZGU9JXAgc291cmNlX2Rlc2M9JXAgVHlwZT0lWFxuIiwKKwkJCQkgIG5vZGUsIHNvdXJjZV9kZXNjLCBlbnRyeV90eXBlKSk7CiAKLQkJc3RhdHVzID0gYWNwaV9leF9yZWFkX2RhdGFfZnJvbV9maWVsZCAod2Fsa19zdGF0ZSwgc291cmNlX2Rlc2MsICZvYmpfZGVzYyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkKHdhbGtfc3RhdGUsIHNvdXJjZV9kZXNjLAorCQkJCQkJICZvYmpfZGVzYyk7CiAJCWJyZWFrOwogCi0JLyogRm9yIHRoZXNlIG9iamVjdHMsIGp1c3QgcmV0dXJuIHRoZSBvYmplY3QgYXR0YWNoZWQgdG8gdGhlIE5vZGUgKi8KKwkJLyogRm9yIHRoZXNlIG9iamVjdHMsIGp1c3QgcmV0dXJuIHRoZSBvYmplY3QgYXR0YWNoZWQgdG8gdGhlIE5vZGUgKi8KIAogCWNhc2UgQUNQSV9UWVBFX01VVEVYOgogCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKQEAgLTIzMCwxOSArMjI5LDE4IEBACiAJCS8qIFJldHVybiBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKIAkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKLQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCWJyZWFrOwogCi0JLyogVFlQRV9BTlkgaXMgdW50eXBlZCwgYW5kIHRodXMgdGhlcmUgaXMgbm8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBpdCAqLworCQkvKiBUWVBFX0FOWSBpcyB1bnR5cGVkLCBhbmQgdGh1cyB0aGVyZSBpcyBubyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGl0ICovCiAKIAljYXNlIEFDUElfVFlQRV9BTlk6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiVW50eXBlZCBlbnRyeSAlcCwgbm8gYXR0YWNoZWQgb2JqZWN0IVxuIiwKLQkJCW5vZGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbnR5cGVkIGVudHJ5ICVwLCBubyBhdHRhY2hlZCBvYmplY3QhXG4iLAorCQkJCSAgbm9kZSkpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7ICAvKiBDYW5ub3QgYmUgQUVfVFlQRSAqLwotCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsJLyogQ2Fubm90IGJlIEFFX1RZUEUgKi8KIAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKIApAQCAtMjUzLDM5ICsyNTEsMzcgQEAKIAkJCS8qIFJldHVybiBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKIAkJCW9ial9kZXNjID0gc291cmNlX2Rlc2M7Ci0JCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgogCQkJLyogTm8gbmFtZWQgcmVmZXJlbmNlcyBhcmUgYWxsb3dlZCBoZXJlICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJVbnN1cHBvcnRlZCBSZWZlcmVuY2Ugb3Bjb2RlICVYICglcylcbiIsCi0JCQkJc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUsCi0JCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiVW5zdXBwb3J0ZWQgUmVmZXJlbmNlIG9wY29kZSAlWCAoJXMpXG4iLAorCQkJCQkgIHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlLAorCQkJCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHNvdXJjZV9kZXNjLT4KKwkJCQkJCQkJICByZWZlcmVuY2UuCisJCQkJCQkJCSAgb3Bjb2RlKSkpOwogCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCiAJCS8qIERlZmF1bHQgY2FzZSBpcyBmb3IgdW5rbm93biB0eXBlcyAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIk5vZGUgJXAgLSBVbmtub3duIG9iamVjdCB0eXBlICVYXG4iLAotCQkJbm9kZSwgZW50cnlfdHlwZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk5vZGUgJXAgLSBVbmtub3duIG9iamVjdCB0eXBlICVYXG4iLAorCQkJCSAgbm9kZSwgZW50cnlfdHlwZSkpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAotCX0gLyogc3dpdGNoIChlbnRyeV90eXBlKSAqLwotCisJfQkJCS8qIHN3aXRjaCAoZW50cnlfdHlwZSkgKi8KIAogCS8qIFJldHVybiB0aGUgb2JqZWN0IGRlc2NyaXB0b3IgKi8KIAotCSpvYmplY3RfcHRyID0gKHZvaWQgKikgb2JqX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCSpvYmplY3RfcHRyID0gKHZvaWQgKilvYmpfZGVzYzsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvbHYuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCmluZGV4IDNkZTQ1NjcuLjk3ZWVjYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCkBAIC00Miw3ICs0Miw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgpAQCAtNTAsMTcgKzQ5LDEzIEBACiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhyZXNvbHYiKQorQUNQSV9NT0RVTEVfTkFNRSgiZXhyZXNvbHYiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX29iamVjdF90b192YWx1ZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnN0YWNrX3B0ciwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9leF9yZXNvbHZlX29iamVjdF90b192YWx1ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqc3RhY2tfcHRyLAorCQkJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc4LDE5ICs3MywxNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnN0YWNrX3B0ciwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipzdGFja19wdHIsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfcmVzb2x2ZV90b192YWx1ZSIsIHN0YWNrX3B0cik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfcmVzb2x2ZV90b192YWx1ZSIsIHN0YWNrX3B0cik7CiAKIAlpZiAoIXN0YWNrX3B0ciB8fCAhKnN0YWNrX3B0cikgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkludGVybmFsIC0gbnVsbCBwb2ludGVyXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX05PX09QRVJBTkQpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW50ZXJuYWwgLSBudWxsIHBvaW50ZXJcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKIAl9CiAKIAkvKgpAQCAtOTgsMTUgKzkwLDE2IEBACiAJICogMSkgQSB2YWxpZCB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCBvcgogCSAqIDIpIEEgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKG5hbWVkX29iaikKIAkgKi8KLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFICgqc3RhY2tfcHRyKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUgKHN0YWNrX3B0ciwgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKCpzdGFja19wdHIpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKKwkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29iamVjdF90b192YWx1ZShzdGFja19wdHIsIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJaWYgKCEqc3RhY2tfcHRyKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkludGVybmFsIC0gbnVsbCBwb2ludGVyXG4iKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9OT19PUEVSQU5EKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkludGVybmFsIC0gbnVsbCBwb2ludGVyXG4iKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwogCQl9CiAJfQogCkBAIC0xMTQsMjAgKzEwNywyMCBAQAogCSAqIE9iamVjdCBvbiB0aGUgc3RhY2sgbWF5IGhhdmUgY2hhbmdlZCBpZiBhY3BpX2V4X3Jlc29sdmVfb2JqZWN0X3RvX3ZhbHVlKCkKIAkgKiB3YXMgY2FsbGVkIChpLmUuLCB3ZSBjYW4ndCB1c2UgYW4gX2Vsc2VfIGhlcmUuKQogCSAqLwotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKCpzdGFja19wdHIpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlICgKLQkJCQkgIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCBzdGFja19wdHIpLAotCQkJCSAgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKCpzdGFja19wdHIpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZShBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSCisJCQkJCQkgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKKwkJCQkJCSAgIHN0YWNrX3B0ciksIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIlJlc29sdmVkIG9iamVjdCAlcFxuIiwgKnN0YWNrX3B0cikpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlJlc29sdmVkIG9iamVjdCAlcFxuIiwgKnN0YWNrX3B0cikpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZXNvbHZlX29iamVjdF90b192YWx1ZQpAQCAtMTQzLDI1ICsxMzYsMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX29iamVjdF90b192YWx1ZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnN0YWNrX3B0ciwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9leF9yZXNvbHZlX29iamVjdF90b192YWx1ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqc3RhY2tfcHRyLAorCQkJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzdGFja19kZXNjOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfbm9kZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzdGFja19kZXNjOworCXZvaWQgKnRlbXBfbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1MTYgb3Bjb2RlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3Jlc29sdmVfb2JqZWN0X3RvX3ZhbHVlIik7CiAKIAlzdGFja19kZXNjID0gKnN0YWNrX3B0cjsKIAogCS8qIFRoaXMgaXMgYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAqLwogCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc3RhY2tfZGVzYykpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKHN0YWNrX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCiAJCW9wY29kZSA9IHN0YWNrX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGU7CkBAIC0xNzcsMTQgKzE2NywxMyBAQAogCiAJCQkvKiBEZWxldGUgdGhlIFJlZmVyZW5jZSBPYmplY3QgKi8KIAotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChzdGFja19kZXNjKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShzdGFja19kZXNjKTsKIAogCQkJLyogUmV0dXJuIHRoZSBuYW1lc3BhY2Ugbm9kZSAqLwogCiAJCQkoKnN0YWNrX3B0cikgPSB0ZW1wX25vZGU7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX0xPQ0FMX09QOgogCQljYXNlIEFNTF9BUkdfT1A6CiAKQEAgLTE5MiwyNCArMTgxLDI4IEBACiAJCQkgKiBHZXQgdGhlIGxvY2FsIGZyb20gdGhlIG1ldGhvZCdzIHN0YXRlIGluZm8KIAkJCSAqIE5vdGU6IHRoaXMgaW5jcmVtZW50cyB0aGUgbG9jYWwncyBvYmplY3QgcmVmZXJlbmNlIGNvdW50CiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlIChvcGNvZGUsCi0JCQkJCSAgc3RhY2tfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwgd2Fsa19zdGF0ZSwgJm9ial9kZXNjKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF92YWx1ZShvcGNvZGUsCisJCQkJCQkJICAgICAgIHN0YWNrX2Rlc2MtPgorCQkJCQkJCSAgICAgICByZWZlcmVuY2Uub2Zmc2V0LAorCQkJCQkJCSAgICAgICB3YWxrX3N0YXRlLAorCQkJCQkJCSAgICAgICAmb2JqX2Rlc2MpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJbQXJnL0xvY2FsICVYXSB2YWx1ZV9vYmogaXMgJXBcbiIsCi0JCQkJc3RhY2tfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwgb2JqX2Rlc2MpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkJICAiW0FyZy9Mb2NhbCAlWF0gdmFsdWVfb2JqIGlzICVwXG4iLAorCQkJCQkgIHN0YWNrX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsCisJCQkJCSAgb2JqX2Rlc2MpKTsKIAogCQkJLyoKIAkJCSAqIE5vdyB3ZSBjYW4gZGVsZXRlIHRoZSBvcmlnaW5hbCBSZWZlcmVuY2UgT2JqZWN0IGFuZAogCQkJICogcmVwbGFjZSBpdCB3aXRoIHRoZSByZXNvbHZlZCB2YWx1ZQogCQkJICovCi0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHN0YWNrX2Rlc2MpOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHN0YWNrX2Rlc2MpOwogCQkJKnN0YWNrX3B0ciA9IG9ial9kZXNjOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFNTF9JTkRFWF9PUDoKIAogCQkJc3dpdGNoIChzdGFja19kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUpIHsKQEAgLTIxOCw3ICsyMTEsNiBAQAogCQkJCS8qIEp1c3QgcmV0dXJuIC0gbGVhdmUgdGhlIFJlZmVyZW5jZSBvbiB0aGUgc3RhY2sgKi8KIAkJCQlicmVhazsKIAotCiAJCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgogCiAJCQkJb2JqX2Rlc2MgPSAqc3RhY2tfZGVzYy0+cmVmZXJlbmNlLndoZXJlOwpAQCAtMjI4LDM2ICsyMjAsMzEgQEAKIAkJCQkJICogKGkuZS4sIGRlcmVmZXJlbmNlIHRoZSBwYWNrYWdlIGluZGV4KQogCQkJCQkgKiBEZWxldGUgdGhlIHJlZiBvYmplY3QsIGluY3JlbWVudCB0aGUgcmV0dXJuZWQgb2JqZWN0CiAJCQkJCSAqLwotCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHN0YWNrX2Rlc2MpOwotCQkJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHN0YWNrX2Rlc2MpOworCQkJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCQkJCQkqc3RhY2tfcHRyID0gb2JqX2Rlc2M7Ci0JCQkJfQotCQkJCWVsc2UgeworCQkJCX0gZWxzZSB7CiAJCQkJCS8qCiAJCQkJCSAqIEEgTlVMTCBvYmplY3QgZGVzY3JpcHRvciBtZWFucyBhbiB1bml0aWFsaXplZCBlbGVtZW50IG9mCiAJCQkJCSAqIHRoZSBwYWNrYWdlLCBjYW4ndCBkZXJlZmVyZW5jZSBpdAogCQkJCQkgKi8KLQkJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCQkiQXR0ZW1wdCB0byBkZXJlZiBhbiBJbmRleCB0byBOVUxMIHBrZyBlbGVtZW50IElkeD0lcFxuIiwKLQkJCQkJCXN0YWNrX2Rlc2MpKTsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCQkgICJBdHRlbXB0IHRvIGRlcmVmIGFuIEluZGV4IHRvIE5VTEwgcGtnIGVsZW1lbnQgSWR4PSVwXG4iLAorCQkJCQkJCSAgc3RhY2tfZGVzYykpOwogCQkJCQlzdGF0dXMgPSBBRV9BTUxfVU5JTklUSUFMSVpFRF9FTEVNRU5UOwogCQkJCX0KIAkJCQlicmVhazsKIAotCiAJCQlkZWZhdWx0OgogCiAJCQkJLyogSW52YWxpZCByZWZlcmVuY2Ugb2JqZWN0ICovCiAKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCQkiRHVyaW5nIHJlc29sdmUsIFVua25vd24gdGFyZ2V0X3R5cGUgJVggaW4gSW5kZXgvUmVmZXJlbmNlIG9iaiAlcFxuIiwKLQkJCQkJc3RhY2tfZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlLCBzdGFja19kZXNjKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJEdXJpbmcgcmVzb2x2ZSwgVW5rbm93biB0YXJnZXRfdHlwZSAlWCBpbiBJbmRleC9SZWZlcmVuY2Ugb2JqICVwXG4iLCBzdGFja19kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUsIHN0YWNrX2Rlc2MpKTsKIAkJCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX1JFRl9PRl9PUDoKIAkJY2FzZSBBTUxfREVCVUdfT1A6CiAJCWNhc2UgQU1MX0xPQURfT1A6CkBAIC0yNjYsNjAgKzI1Myw1OCBAQAogCiAJCQlicmVhazsKIAotCQljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6ICAgLyogUmVmZXJlbmNlIHRvIGEgbmFtZWQgb2JqZWN0ICovCisJCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDoJLyogUmVmZXJlbmNlIHRvIGEgbmFtZWQgb2JqZWN0ICovCiAKIAkJCS8qIEdldCB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIG5hbWVzcGFjZSBub2RlICovCiAKIAkJCSpzdGFja19wdHIgPSAoc3RhY2tfZGVzYy0+cmVmZXJlbmNlLm5vZGUpLT5vYmplY3Q7Ci0JCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKCpzdGFja19wdHIpOwotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChzdGFja19kZXNjKTsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSgqc3RhY2tfcHRyKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShzdGFja19kZXNjKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJIkR1cmluZyByZXNvbHZlLCBVbmtub3duIFJlZmVyZW5jZSBvcGNvZGUgJVggKCVzKSBpbiAlcFxuIiwKLQkJCQlvcGNvZGUsIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcGNvZGUpLCBzdGFja19kZXNjKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkR1cmluZyByZXNvbHZlLCBVbmtub3duIFJlZmVyZW5jZSBvcGNvZGUgJVggKCVzKSBpbiAlcFxuIiwgb3Bjb2RlLCBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcGNvZGUpLCBzdGFja19kZXNjKSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCi0JCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9hcmd1bWVudHMgKHN0YWNrX2Rlc2MpOworCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfYXJndW1lbnRzKHN0YWNrX2Rlc2MpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAotCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyAoc3RhY2tfZGVzYyk7CisJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzKHN0YWNrX2Rlc2MpOwogCQlicmVhazsKIAotCi0JLyogVGhlc2UgY2FzZXMgbWF5IG5ldmVyIGhhcHBlbiBoZXJlLCBidXQganVzdCBpbiBjYXNlLi4gKi8KKwkJLyogVGhlc2UgY2FzZXMgbWF5IG5ldmVyIGhhcHBlbiBoZXJlLCBidXQganVzdCBpbiBjYXNlLi4gKi8KIAogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiZmllbGRfcmVhZCBzb3VyY2VfZGVzYz0lcCBUeXBlPSVYXG4iLAotCQkJc3RhY2tfZGVzYywgQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHN0YWNrX2Rlc2MpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICJmaWVsZF9yZWFkIHNvdXJjZV9kZXNjPSVwIFR5cGU9JVhcbiIsCisJCQkJICBzdGFja19kZXNjLAorCQkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUoc3RhY2tfZGVzYykpKTsKIAotCQlzdGF0dXMgPSBhY3BpX2V4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkICh3YWxrX3N0YXRlLCBzdGFja19kZXNjLCAmb2JqX2Rlc2MpOwotCQkqc3RhY2tfcHRyID0gKHZvaWQgKikgb2JqX2Rlc2M7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkKHdhbGtfc3RhdGUsIHN0YWNrX2Rlc2MsCisJCQkJCQkgJm9ial9kZXNjKTsKKwkJKnN0YWNrX3B0ciA9ICh2b2lkICopb2JqX2Rlc2M7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZQpAQCAtMzM3LDQyICszMjIsNDQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb3BlcmFuZCwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgICpyZXR1cm5fdHlwZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmV0dXJuX2Rlc2MpCithY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kLAorCQkJIGFjcGlfb2JqZWN0X3R5cGUgKiByZXR1cm5fdHlwZSwKKwkJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX2Rlc2MpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MgPSAodm9pZCAqKSBvcGVyYW5kOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjID0gKHZvaWQgKilvcGVyYW5kOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfb2JqZWN0X3R5cGUgdHlwZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZSIpOwogCiAJLyogT3BlcmFuZCBjYW4gYmUgZWl0aGVyIGEgbmFtZXNwYWNlIG5vZGUgb3IgYW4gb3BlcmFuZCBkZXNjcmlwdG9yICovCiAKLQlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EOgogCQl0eXBlID0gb2JqX2Rlc2MtPmNvbW1vbi50eXBlOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9ERVNDX1RZUEVfTkFNRUQ6Ci0JCXR5cGUgPSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9kZXNjKS0+dHlwZTsKLQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmpfZGVzYyk7CisJCXR5cGUgPSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2Rlc2MpLT50eXBlOworCQlvYmpfZGVzYyA9CisJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCisJCQkJCQlvYmpfZGVzYyk7CiAKIAkJLyogSWYgd2UgaGFkIGFuIEFsaWFzIG5vZGUsIHVzZSB0aGUgYXR0YWNoZWQgb2JqZWN0IGZvciB0eXBlIGluZm8gKi8KIAogCQlpZiAodHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVMpIHsKLQkJCXR5cGUgPSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9kZXNjKS0+dHlwZTsKLQkJCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2Rlc2MpOworCQkJdHlwZSA9ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfZGVzYyktPnR5cGU7CisJCQlvYmpfZGVzYyA9CisJCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KChzdHJ1Y3QKKwkJCQkJCQkgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQorCQkJCQkJCW9ial9kZXNjKTsKIAkJfQogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAl9CiAKIAkvKiBJZiB0eXBlIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gYSByZWZlcmVuY2UsIHdlIGFyZSBkb25lICovCkBAIC0zODcsNyArMzc0LDcgQEAKIAkgKiBvZiB0aGUgb2JqZWN0X3R5cGUgYW5kIHNpemVfb2Ygb3BlcmF0b3JzKS4gVGhpcyBtZWFucyB0cmF2ZXJzaW5nCiAJICogdGhlIGxpc3Qgb2YgcG9zc2libHkgbWFueSBuZXN0ZWQgcmVmZXJlbmNlcy4KIAkgKi8KLQl3aGlsZSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7CisJd2hpbGUgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7CiAJCXN3aXRjaCAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpIHsKIAkJY2FzZSBBTUxfUkVGX09GX09QOgogCkBAIC0zOTcsMzEgKzM4NCwyOSBAQAogCiAJCQkvKiBBbGwgIlJlZmVyZW5jZXMiIHBvaW50IHRvIGEgTlMgbm9kZSAqLwogCi0JCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChub2RlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJCSJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IE5vdCBhIE5TIG5vZGUgJXAgWyVzXVxuIiwKLQkJCQkJbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChub2RlKSkpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKKwkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUobm9kZSkgIT0KKwkJCSAgICBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlOiBOb3QgYSBOUyBub2RlICVwIFslc11cbiIsIG5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShub2RlKSkpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogCQkJfQogCiAJCQkvKiBHZXQgdGhlIGF0dGFjaGVkIG9iamVjdCAqLwogCi0JCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAkJCWlmICghb2JqX2Rlc2MpIHsKIAkJCQkvKiBObyBvYmplY3QsIHVzZSB0aGUgTlMgbm9kZSB0eXBlICovCiAKLQkJCQl0eXBlID0gYWNwaV9uc19nZXRfdHlwZSAobm9kZSk7CisJCQkJdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUobm9kZSk7CiAJCQkJZ290byBleGl0OwogCQkJfQogCiAJCQkvKiBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyAqLwogCiAJCQlpZiAob2JqX2Rlc2MgPT0gb3BlcmFuZCkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0NJUkNVTEFSX1JFRkVSRU5DRSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9DSVJDVUxBUl9SRUZFUkVOQ0UpOwogCQkJfQogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFNTF9JTkRFWF9PUDoKIAogCQkJLyogR2V0IHRoZSB0eXBlIG9mIHRoaXMgcmVmZXJlbmNlIChpbmRleCBpbnRvIGFub3RoZXIgb2JqZWN0KSAqLwpAQCAtNDQyLDEyICs0MjcsMTEgQEAKIAkJCWlmICghb2JqX2Rlc2MpIHsKIAkJCQkvKiBOVUxMIHBhY2thZ2UgZWxlbWVudHMgYXJlIGFsbG93ZWQgKi8KIAotCQkJCXR5cGUgPSAwOyAvKiBVbmluaXRpYWxpemVkICovCisJCQkJdHlwZSA9IDA7CS8qIFVuaW5pdGlhbGl6ZWQgKi8KIAkJCQlnb3RvIGV4aXQ7CiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDoKIAogCQkJLyogRGVyZWZlcmVuY2UgdGhlIHJlZmVyZW5jZSBwb2ludGVyICovCkBAIC00NTYsNTAgKzQ0MCw2MSBAQAogCiAJCQkvKiBBbGwgIlJlZmVyZW5jZXMiIHBvaW50IHRvIGEgTlMgbm9kZSAqLwogCi0JCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChub2RlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJCSJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IE5vdCBhIE5TIG5vZGUgJXAgWyVzXVxuIiwKLQkJCQkJbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChub2RlKSkpOwotCQkJICAgcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOworCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShub2RlKSAhPQorCQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IE5vdCBhIE5TIG5vZGUgJXAgWyVzXVxuIiwgbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKG5vZGUpKSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJCQl9CiAKIAkJCS8qIEdldCB0aGUgYXR0YWNoZWQgb2JqZWN0ICovCiAKLQkJCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwkJCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCQkJaWYgKCFvYmpfZGVzYykgewogCQkJCS8qIE5vIG9iamVjdCwgdXNlIHRoZSBOUyBub2RlIHR5cGUgKi8KIAotCQkJCXR5cGUgPSBhY3BpX25zX2dldF90eXBlIChub2RlKTsKKwkJCQl0eXBlID0gYWNwaV9uc19nZXRfdHlwZShub2RlKTsKIAkJCQlnb3RvIGV4aXQ7CiAJCQl9CiAKIAkJCS8qIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzICovCiAKIAkJCWlmIChvYmpfZGVzYyA9PSBvcGVyYW5kKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQ0lSQ1VMQVJfUkVGRVJFTkNFKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0NJUkNVTEFSX1JFRkVSRU5DRSk7CiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX0xPQ0FMX09QOgogCQljYXNlIEFNTF9BUkdfT1A6CiAKIAkJCWlmIChyZXR1cm5fZGVzYykgewotCQkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSwKLQkJCQkJCSBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwgd2Fsa19zdGF0ZSwgJm9ial9kZXNjKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF92YWx1ZShvYmpfZGVzYy0+CisJCQkJCQkJCSAgcmVmZXJlbmNlLgorCQkJCQkJCQkgIG9wY29kZSwKKwkJCQkJCQkJICBvYmpfZGVzYy0+CisJCQkJCQkJCSAgcmVmZXJlbmNlLgorCQkJCQkJCQkgIG9mZnNldCwKKwkJCQkJCQkJICB3YWxrX3N0YXRlLAorCQkJCQkJCQkgICZvYmpfZGVzYyk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJCX0KLQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlLAotCQkJCQkJIG9ial9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0LCB3YWxrX3N0YXRlLCAmbm9kZSk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZShvYmpfZGVzYy0+CisJCQkJCQkJCSByZWZlcmVuY2UuCisJCQkJCQkJCSBvcGNvZGUsCisJCQkJCQkJCSBvYmpfZGVzYy0+CisJCQkJCQkJCSByZWZlcmVuY2UuCisJCQkJCQkJCSBvZmZzZXQsCisJCQkJCQkJCSB3YWxrX3N0YXRlLAorCQkJCQkJCQkgJm5vZGUpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCQl9CiAKLQkJCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJCQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAJCQkJaWYgKCFvYmpfZGVzYykgewogCQkJCQl0eXBlID0gQUNQSV9UWVBFX0FOWTsKIAkJCQkJZ290byBleGl0OwpAQCAtNTA3LDcgKzUwMiw2IEBACiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX0RFQlVHX09QOgogCiAJCQkvKiBUaGUgRGVidWcgT2JqZWN0IGlzIG9mIHR5cGUgImRlYnVnX29iamVjdCIgKi8KQEAgLTUxNSwxMyArNTA5LDEwIEBACiAJCQl0eXBlID0gQUNQSV9UWVBFX0RFQlVHX09CSkVDVDsKIAkJCWdvdG8gZXhpdDsKIAotCiAJCWRlZmF1bHQ6CiAKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJImFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZTogVW5rbm93biBSZWZlcmVuY2Ugc3VidHlwZSAlWFxuIiwKLQkJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IFVua25vd24gUmVmZXJlbmNlIHN1YnR5cGUgJVhcbiIsIG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKIAkJfQogCX0KIApAQCAtNTI5LDEwICs1MjAsOSBAQAogCSAqIE5vdyB3ZSBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIGFuIG9iamVjdCB0aGF0IGhhcyBub3QgYmVlbiBjcmVhdGVkCiAJICogdmlhIHRoZSByZWZfb2Ygb3IgSW5kZXggb3BlcmF0b3JzLgogCSAqLwotCXR5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpOworCXR5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYyk7CiAKLQotZXhpdDoKKyAgICAgIGV4aXQ6CiAJLyogQ29udmVydCBpbnRlcm5hbCB0eXBlcyB0byBleHRlcm5hbCB0eXBlcyAqLwogCiAJc3dpdGNoICh0eXBlKSB7CkBAIC01NTksNyArNTQ5LDUgQEAKIAlpZiAocmV0dXJuX2Rlc2MpIHsKIAkJKnJldHVybl9kZXNjID0gb2JqX2Rlc2M7CiAJfQotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb3AuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29wLmMKaW5kZXggZDhiNDcwZS4uZmYwNjRlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb3AuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvcC5jCkBAIC00MiwyNCArNDIsMTggQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHJlc29wIikKK0FDUElfTU9EVUxFX05BTUUoImV4cmVzb3AiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9jaGVja19vYmplY3RfdHlwZSAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlX25lZWRlZCwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHRoaXNfdHlwZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QpOwotCithY3BpX2V4X2NoZWNrX29iamVjdF90eXBlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZV9uZWVkZWQsCisJCQkgIGFjcGlfb2JqZWN0X3R5cGUgdGhpc190eXBlLCB2b2lkICpvYmplY3QpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc2LDEzICs3MCwxMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NoZWNrX29iamVjdF90eXBlICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGVfbmVlZGVkLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdGhpc190eXBlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCkKK2FjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlX25lZWRlZCwKKwkJCSAgYWNwaV9vYmplY3RfdHlwZSB0aGlzX3R5cGUsIHZvaWQgKm9iamVjdCkKIHsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJleF9jaGVja19vYmplY3RfdHlwZSIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJleF9jaGVja19vYmplY3RfdHlwZSIpOwogCiAJaWYgKHR5cGVfbmVlZGVkID09IEFDUElfVFlQRV9BTlkpIHsKIAkJLyogQWxsIHR5cGVzIE9LLCBzbyB3ZSBkb24ndCBwZXJmb3JtIGFueSB0eXBlY2hlY2tzICovCkBAIC05NywxNiArODgsMTcgQEAKIAkJICogc3BlY2lmaWNhdGlvbiwgYSBzdG9yZSB0byBhIGNvbnN0YW50IGlzIGEgbm9vcC4pCiAJCSAqLwogCQlpZiAoKHRoaXNfdHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgJiYKLQkJCSgoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikgb2JqZWN0KS0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0FNTF9DT05TVEFOVCkpIHsKKwkJICAgICgoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKilvYmplY3QpLT5jb21tb24uCisJCSAgICAgZmxhZ3MgJiBBT1BPQkpfQU1MX0NPTlNUQU5UKSkgewogCQkJcmV0dXJuIChBRV9PSyk7CiAJCX0KIAl9CiAKIAlpZiAodHlwZV9uZWVkZWQgIT0gdGhpc190eXBlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIk5lZWRlZCBbJXNdLCBmb3VuZCBbJXNdICVwXG4iLAotCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlX25lZWRlZCksCi0JCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKHRoaXNfdHlwZSksIG9iamVjdCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk5lZWRlZCBbJXNdLCBmb3VuZCBbJXNdICVwXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGVfbmVlZGVkKSwKKwkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0aGlzX3R5cGUpLCBvYmplY3QpKTsKIAogCQlyZXR1cm4gKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCX0KQEAgLTExNCw3ICsxMDYsNiBAQAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcwpAQCAtMTM3LDQxICsxMjgsMzcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipzdGFja19wdHIsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyh1MTYgb3Bjb2RlLAorCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiogc3RhY2tfcHRyLAorCQkJIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZTsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0ZW1wX25vZGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfdHlwZXM7Ci0JY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gICAqb3BfaW5mbzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfYXJnX3R5cGU7Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlX25lZWRlZDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9vcCA9IDA7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTggb2JqZWN0X3R5cGU7CisJdm9pZCAqdGVtcF9ub2RlOworCXUzMiBhcmdfdHlwZXM7CisJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wX2luZm87CisJdTMyIHRoaXNfYXJnX3R5cGU7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlX25lZWRlZDsKKwl1MTYgdGFyZ2V0X29wID0gMDsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJleF9yZXNvbHZlX29wZXJhbmRzIiwgb3Bjb2RlKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgiZXhfcmVzb2x2ZV9vcGVyYW5kcyIsIG9wY29kZSk7Ci0KLQotCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3Bjb2RlKTsKKwlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3Bjb2RlKTsKIAlpZiAob3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX1VOS05PV04pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX09QQ09ERSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX09QQ09ERSk7CiAJfQogCiAJYXJnX3R5cGVzID0gb3BfaW5mby0+cnVudGltZV9hcmdzOwogCWlmIChhcmdfdHlwZXMgPT0gQVJHSV9JTlZBTElEX09QQ09ERSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJyZXNvbHZlX29wZXJhbmRzOiAlWCBpcyBub3QgYSB2YWxpZCBBTUwgb3Bjb2RlXG4iLAotCQkJb3Bjb2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgicmVzb2x2ZV9vcGVyYW5kczogJVggaXMgbm90IGEgdmFsaWQgQU1MIG9wY29kZVxuIiwgb3Bjb2RlKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkiT3Bjb2RlICVYIFslc10gcmVxdWlyZWRfb3BlcmFuZF90eXBlcz0lOC44WCBcbiIsCi0JCW9wY29kZSwgb3BfaW5mby0+bmFtZSwgYXJnX3R5cGVzKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJICAiT3Bjb2RlICVYIFslc10gcmVxdWlyZWRfb3BlcmFuZF90eXBlcz0lOC44WCBcbiIsCisJCQkgIG9wY29kZSwgb3BfaW5mby0+bmFtZSwgYXJnX3R5cGVzKSk7CiAKIAkvKgogCSAqIE5vcm1hbCBleGl0IGlzIHdpdGggKGFyZ190eXBlcyA9PSAwKSBhdCBlbmQgb2YgYXJndW1lbnQgbGlzdC4KQEAgLTE4MCwxMiArMTY3LDExIEBACiAJICogdG8pIHRoZSByZXF1aXJlZCB0eXBlOyBpZiBzdGFjayB1bmRlcmZsb3dzOyBvciB1cG9uCiAJICogZmluZGluZyBhIE5VTEwgc3RhY2sgZW50cnkgKHdoaWNoIHNob3VsZCBub3QgaGFwcGVuKS4KIAkgKi8KLQl3aGlsZSAoR0VUX0NVUlJFTlRfQVJHX1RZUEUgKGFyZ190eXBlcykpIHsKKwl3aGlsZSAoR0VUX0NVUlJFTlRfQVJHX1RZUEUoYXJnX3R5cGVzKSkgewogCQlpZiAoIXN0YWNrX3B0ciB8fCAhKnN0YWNrX3B0cikgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgicmVzb2x2ZV9vcGVyYW5kczogTnVsbCBzdGFjayBlbnRyeSBhdCAlcFxuIiwKLQkJCQlzdGFja19wdHIpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgicmVzb2x2ZV9vcGVyYW5kczogTnVsbCBzdGFjayBlbnRyeSBhdCAlcFxuIiwgc3RhY2tfcHRyKSk7CiAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogCQl9CiAKIAkJLyogRXh0cmFjdCB1c2VmdWwgaXRlbXMgKi8KQEAgLTE5NCwzNyArMTgwLDM3IEBACiAKIAkJLyogRGVjb2RlIHRoZSBkZXNjcmlwdG9yIHR5cGUgKi8KIAotCQlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpKSB7CisJCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSkgewogCQljYXNlIEFDUElfREVTQ19UWVBFX05BTUVEOgogCiAJCQkvKiBOYW1lc3BhY2UgTm9kZSAqLwogCi0JCQlvYmplY3RfdHlwZSA9ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2Rlc2MpLT50eXBlOworCQkJb2JqZWN0X3R5cGUgPQorCQkJICAgICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfZGVzYyktPnR5cGU7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9ERVNDX1RZUEVfT1BFUkFORDoKIAogCQkJLyogQUNQSSBpbnRlcm5hbCBvYmplY3QgKi8KIAotCQkJb2JqZWN0X3R5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpOworCQkJb2JqZWN0X3R5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYyk7CiAKIAkJCS8qIENoZWNrIGZvciBiYWQgYWNwaV9vYmplY3RfdHlwZSAqLwogCi0JCQlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUgKG9iamVjdF90eXBlKSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiQmFkIG9wZXJhbmQgb2JqZWN0IHR5cGUgWyVYXVxuIiwKLQkJCQkJb2JqZWN0X3R5cGUpKTsKKwkJCWlmICghYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZShvYmplY3RfdHlwZSkpIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiQmFkIG9wZXJhbmQgb2JqZWN0IHR5cGUgWyVYXVxuIiwKKwkJCQkJCSAgb2JqZWN0X3R5cGUpKTsKIAotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJfQogCiAJCQlpZiAob2JqZWN0X3R5cGUgPT0gKHU4KSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7CiAJCQkJLyogRGVjb2RlIHRoZSBSZWZlcmVuY2UgKi8KIAotCQkJCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3Bjb2RlKTsKKwkJCQlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3Bjb2RlKTsKIAkJCQlpZiAob3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX1VOS05PV04pIHsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX09QQ09ERSk7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX09QQ09ERSk7CiAJCQkJfQogCiAJCQkJc3dpdGNoIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkgewpAQCAtMjM4LDUxICsyMjQsNjIgQEAKIAkJCQljYXNlIEFNTF9SRUZfT0ZfT1A6CiAJCQkJY2FzZSBBTUxfQVJHX09QOgogCQkJCWNhc2UgQU1MX0xPQ0FMX09QOgotCQkJCWNhc2UgQU1MX0xPQURfT1A6IC8qIGRkYl9oYW5kbGUgZnJvbSBMT0FEX09QIG9yIExPQURfVEFCTEVfT1AgKi8KLQkJCQljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6IC8qIFJlZmVyZW5jZSB0byBhIG5hbWVkIG9iamVjdCAqLworCQkJCWNhc2UgQU1MX0xPQURfT1A6CS8qIGRkYl9oYW5kbGUgZnJvbSBMT0FEX09QIG9yIExPQURfVEFCTEVfT1AgKi8KKwkJCQljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6CS8qIFJlZmVyZW5jZSB0byBhIG5hbWVkIG9iamVjdCAqLwogCi0JCQkJCUFDUElfREVCVUdfT05MWV9NRU1CRVJTIChBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJCQkJIk9wZXJhbmQgaXMgYSBSZWZlcmVuY2UsIHJlZl9vcGNvZGUgWyVzXVxuIiwKLQkJCQkJCShhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKS0+bmFtZSkpKTsKKwkJCQkJQUNQSV9ERUJVR19PTkxZX01FTUJFUlMoQUNQSV9ERUJVR19QUklOVAorCQkJCQkJCQkoKEFDUElfREJfRVhFQywKKwkJCQkJCQkJICAiT3BlcmFuZCBpcyBhIFJlZmVyZW5jZSwgcmVmX29wY29kZSBbJXNdXG4iLAorCQkJCQkJCQkgIChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbworCQkJCQkJCQkgICAob2JqX2Rlc2MtPgorCQkJCQkJCQkgICAgcmVmZXJlbmNlLgorCQkJCQkJCQkgICAgb3Bjb2RlKSktPgorCQkJCQkJCQkgIG5hbWUpKSk7CiAJCQkJCWJyZWFrOwogCiAJCQkJZGVmYXVsdDoKLQkJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCQkiT3BlcmFuZCBpcyBhIFJlZmVyZW5jZSwgVW5rbm93biBSZWZlcmVuY2UgT3Bjb2RlICVYIFslc11cbiIsCi0JCQkJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSwKLQkJCQkJCShhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKS0+bmFtZSkpOworCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJCSAgIk9wZXJhbmQgaXMgYSBSZWZlcmVuY2UsIFVua25vd24gUmVmZXJlbmNlIE9wY29kZSAlWCBbJXNdXG4iLAorCQkJCQkJCSAgb2JqX2Rlc2MtPnJlZmVyZW5jZS4KKwkJCQkJCQkgIG9wY29kZSwKKwkJCQkJCQkgIChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbworCQkJCQkJCSAgIChvYmpfZGVzYy0+cmVmZXJlbmNlLgorCQkJCQkJCSAgICBvcGNvZGUpKS0+bmFtZSkpOwogCi0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWRlZmF1bHQ6CiAKIAkJCS8qIEludmFsaWQgZGVzY3JpcHRvciAqLwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkludmFsaWQgZGVzY3JpcHRvciAlcCBbJXNdXG4iLAotCQkJCQlvYmpfZGVzYywgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChvYmpfZGVzYykpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkludmFsaWQgZGVzY3JpcHRvciAlcCBbJXNdXG4iLAorCQkJCQkgIG9ial9kZXNjLAorCQkJCQkgIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZQorCQkJCQkgIChvYmpfZGVzYykpKTsKIAotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCiAJCS8qIEdldCBvbmUgYXJndW1lbnQgdHlwZSwgcG9pbnQgdG8gdGhlIG5leHQgKi8KIAotCQl0aGlzX2FyZ190eXBlID0gR0VUX0NVUlJFTlRfQVJHX1RZUEUgKGFyZ190eXBlcyk7Ci0JCUlOQ1JFTUVOVF9BUkdfTElTVCAoYXJnX3R5cGVzKTsKKwkJdGhpc19hcmdfdHlwZSA9IEdFVF9DVVJSRU5UX0FSR19UWVBFKGFyZ190eXBlcyk7CisJCUlOQ1JFTUVOVF9BUkdfTElTVChhcmdfdHlwZXMpOwogCiAJCS8qCiAJCSAqIEhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgb2JqZWN0IGRvZXMgbm90IG5lZWQgdG8gYmUKIAkJICogcmVzb2x2ZWQgdG8gYSB2YWx1ZQogCQkgKi8KIAkJc3dpdGNoICh0aGlzX2FyZ190eXBlKSB7Ci0JCWNhc2UgQVJHSV9SRUZfT1JfU1RSSU5HOiAgICAgICAgLyogQ2FuIGJlIGEgU3RyaW5nIG9yIFJlZmVyZW5jZSAqLworCQljYXNlIEFSR0lfUkVGX09SX1NUUklORzoJLyogQ2FuIGJlIGEgU3RyaW5nIG9yIFJlZmVyZW5jZSAqLwogCi0JCQlpZiAoKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpICYmCi0JCQkJKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX1NUUklORykpIHsKKwkJCWlmICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSA9PQorCQkJICAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKQorCQkJICAgICYmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0KKwkJCQlBQ1BJX1RZUEVfU1RSSU5HKSkgewogCQkJCS8qCiAJCQkJICogU3RyaW5nIGZvdW5kIC0gdGhlIHN0cmluZyByZWZlcmVuY2VzIGEgbmFtZWQgb2JqZWN0IGFuZAogCQkJCSAqIG11c3QgYmUgcmVzb2x2ZWQgdG8gYSBub2RlCkBAIC0yOTYsMzkgKzI5Myw0MCBAQAogCQkJICovCiAJCQkvKmxpbnQgLWZhbGx0aHJvdWdoICovCiAKLQkJY2FzZSBBUkdJX1JFRkVSRU5DRTogICAgICAgICAgICAvKiBSZWZlcmVuY2VzOiAqLworCQljYXNlIEFSR0lfUkVGRVJFTkNFOgkvKiBSZWZlcmVuY2VzOiAqLwogCQljYXNlIEFSR0lfSU5URUdFUl9SRUY6CiAJCWNhc2UgQVJHSV9PQkpFQ1RfUkVGOgogCQljYXNlIEFSR0lfREVWSUNFX1JFRjoKLQkJY2FzZSBBUkdJX1RBUkdFVFJFRjogICAgIC8qIEFsbG93cyBpbXBsaWNpdCBjb252ZXJzaW9uIHJ1bGVzIGJlZm9yZSBzdG9yZSAqLwotCQljYXNlIEFSR0lfRklYRURfVEFSR0VUOiAgLyogTm8gaW1wbGljaXQgY29udmVyc2lvbiBiZWZvcmUgc3RvcmUgdG8gdGFyZ2V0ICovCi0JCWNhc2UgQVJHSV9TSU1QTEVfVEFSR0VUOiAvKiBOYW1lLCBMb2NhbCwgb3IgQXJnIC0gbm8gaW1wbGljaXQgY29udmVyc2lvbiAgKi8KKwkJY2FzZSBBUkdJX1RBUkdFVFJFRjoJLyogQWxsb3dzIGltcGxpY2l0IGNvbnZlcnNpb24gcnVsZXMgYmVmb3JlIHN0b3JlICovCisJCWNhc2UgQVJHSV9GSVhFRF9UQVJHRVQ6CS8qIE5vIGltcGxpY2l0IGNvbnZlcnNpb24gYmVmb3JlIHN0b3JlIHRvIHRhcmdldCAqLworCQljYXNlIEFSR0lfU0lNUExFX1RBUkdFVDoJLyogTmFtZSwgTG9jYWwsIG9yIEFyZyAtIG5vIGltcGxpY2l0IGNvbnZlcnNpb24gICovCiAKIAkJCS8qCiAJCQkgKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFCiAJCQkgKiBBIE5hbWVzcGFjZSBOb2RlIGlzIE9LIGFzLWlzCiAJCQkgKi8KLQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykgPT0KKwkJCSAgICBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewogCQkJCWdvdG8gbmV4dF9vcGVyYW5kOwogCQkJfQogCi0JCQlzdGF0dXMgPSBhY3BpX2V4X2NoZWNrX29iamVjdF90eXBlIChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLAotCQkJCQkgIG9iamVjdF90eXBlLCBvYmpfZGVzYyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X2NoZWNrX29iamVjdF90eXBlKEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsCisJCQkJCQkgICAgICBvYmplY3RfdHlwZSwgb2JqX2Rlc2MpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CiAKIAkJCWlmIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9PSBBTUxfTkFNRV9PUCkgewogCQkJCS8qIENvbnZlcnQgYSBuYW1lZCByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBuYW1lZCBvYmplY3QgKi8KIAogCQkJCXRlbXBfbm9kZSA9IG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0OwotCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCQkJKCpzdGFja19wdHIpID0gdGVtcF9ub2RlOwogCQkJfQogCQkJZ290byBuZXh0X29wZXJhbmQ7CiAKLQotCQljYXNlIEFSR0lfREFUQVJFRk9CSjogIC8qIFN0b3JlIG9wZXJhdG9yIG9ubHkgKi8KKwkJY2FzZSBBUkdJX0RBVEFSRUZPQko6CS8qIFN0b3JlIG9wZXJhdG9yIG9ubHkgKi8KIAogCQkJLyoKIAkJCSAqIFdlIGRvbid0IHdhbnQgdG8gcmVzb2x2ZSBpbmRleF9vcCByZWZlcmVuY2Ugb2JqZWN0cyBkdXJpbmcKQEAgLTMzNyw4ICszMzUsMTAgQEAKIAkJCSAqIC0tIEFsbCBvdGhlcnMgbXVzdCBiZSByZXNvbHZlZCBiZWxvdy4KIAkJCSAqLwogCQkJaWYgKChvcGNvZGUgPT0gQU1MX1NUT1JFX09QKSAmJgotCQkJCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoKnN0YWNrX3B0cikgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgJiYKLQkJCQkoKCpzdGFja19wdHIpLT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9JTkRFWF9PUCkpIHsKKwkJCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoKnN0YWNrX3B0cikgPT0KKwkJCSAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkKKwkJCSAgICAmJiAoKCpzdGFja19wdHIpLT5yZWZlcmVuY2Uub3Bjb2RlID09CisJCQkJQU1MX0lOREVYX09QKSkgewogCQkJCWdvdG8gbmV4dF9vcGVyYW5kOwogCQkJfQogCQkJYnJlYWs7CkBAIC0zNTEsOSArMzUxLDkgQEAKIAkJLyoKIAkJICogUmVzb2x2ZSB0aGlzIG9iamVjdCB0byBhIHZhbHVlCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUgKHN0YWNrX3B0ciwgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKHN0YWNrX3B0ciwgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQkvKiBHZXQgdGhlIHJlc29sdmVkIG9iamVjdCAqLwpAQCAtMzY0LDEwICszNjQsMTAgQEAKIAkJICogQ2hlY2sgdGhlIHJlc3VsdGluZyBvYmplY3QgKHZhbHVlKSB0eXBlCiAJCSAqLwogCQlzd2l0Y2ggKHRoaXNfYXJnX3R5cGUpIHsKLQkJLyoKLQkJICogRm9yIHRoZSBzaW1wbGUgY2FzZXMsIG9ubHkgb25lIHR5cGUgb2YgcmVzb2x2ZWQgb2JqZWN0Ci0JCSAqIGlzIGFsbG93ZWQKLQkJICovCisJCQkvKgorCQkJICogRm9yIHRoZSBzaW1wbGUgY2FzZXMsIG9ubHkgb25lIHR5cGUgb2YgcmVzb2x2ZWQgb2JqZWN0CisJCQkgKiBpcyBhbGxvd2VkCisJCQkgKi8KIAkJY2FzZSBBUkdJX01VVEVYOgogCiAJCQkvKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfTVVURVggKi8KQEAgLTM4Miw3ICszODIsNyBAQAogCQkJdHlwZV9uZWVkZWQgPSBBQ1BJX1RZUEVfRVZFTlQ7CiAJCQlicmVhazsKIAotCQljYXNlIEFSR0lfUEFDS0FHRTogICAvKiBQYWNrYWdlICovCisJCWNhc2UgQVJHSV9QQUNLQUdFOgkvKiBQYWNrYWdlICovCiAKIAkJCS8qIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIEFDUElfVFlQRV9QQUNLQUdFICovCiAKQEAgLTQwMywxMCArNDAzLDkgQEAKIAkJCXR5cGVfbmVlZGVkID0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRTsKIAkJCWJyZWFrOwogCi0KLQkJLyoKLQkJICogVGhlIG1vcmUgY29tcGxleCBjYXNlcyBhbGxvdyBtdWx0aXBsZSByZXNvbHZlZCBvYmplY3QgdHlwZXMKLQkJICovCisJCQkvKgorCQkJICogVGhlIG1vcmUgY29tcGxleCBjYXNlcyBhbGxvdyBtdWx0aXBsZSByZXNvbHZlZCBvYmplY3QgdHlwZXMKKwkJCSAqLwogCQljYXNlIEFSR0lfSU5URUdFUjoKIAogCQkJLyoKQEAgLTQxNCwyMSArNDEzLDI3IEBACiAJCQkgKiBCdXQgd2UgY2FuIGltcGxpY2l0bHkgY29udmVydCBmcm9tIGEgU1RSSU5HIG9yIEJVRkZFUgogCQkJICogQWthIC0gIkltcGxpY2l0IFNvdXJjZSBPcGVyYW5kIENvbnZlcnNpb24iCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyIChvYmpfZGVzYywgc3RhY2tfcHRyLCAxNik7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9ial9kZXNjLCBzdGFja19wdHIsIDE2KTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCWlmIChzdGF0dXMgPT0gQUVfVFlQRSkgewotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCSJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsCi0JCQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CisJCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkJICAiTmVlZGVkIFtJbnRlZ2VyL1N0cmluZy9CdWZmZXJdLCBmb3VuZCBbJXNdICVwXG4iLAorCQkJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkJCSAgKG9ial9kZXNjKSwKKwkJCQkJCQkgIG9ial9kZXNjKSk7CiAKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJCX0KIAotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KKworCQkJaWYgKG9ial9kZXNjICE9ICpzdGFja19wdHIpIHsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCQkJfQogCQkJZ290byBuZXh0X29wZXJhbmQ7CiAKLQogCQljYXNlIEFSR0lfQlVGRkVSOgogCiAJCQkvKgpAQCAtNDM2LDIxICs0NDEsMjYgQEAKIAkJCSAqIEJ1dCB3ZSBjYW4gaW1wbGljaXRseSBjb252ZXJ0IGZyb20gYSBTVFJJTkcgb3IgSU5URUdFUgogCQkJICogQWthIC0gIkltcGxpY2l0IFNvdXJjZSBPcGVyYW5kIENvbnZlcnNpb24iCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19idWZmZXIgKG9ial9kZXNjLCBzdGFja19wdHIpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcihvYmpfZGVzYywgc3RhY2tfcHRyKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCWlmIChzdGF0dXMgPT0gQUVfVFlQRSkgewotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCSJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsCi0JCQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CisJCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkJICAiTmVlZGVkIFtJbnRlZ2VyL1N0cmluZy9CdWZmZXJdLCBmb3VuZCBbJXNdICVwXG4iLAorCQkJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkJCSAgKG9ial9kZXNjKSwKKwkJCQkJCQkgIG9ial9kZXNjKSk7CiAKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJCX0KIAotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KKworCQkJaWYgKG9ial9kZXNjICE9ICpzdGFja19wdHIpIHsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCQkJfQogCQkJZ290byBuZXh0X29wZXJhbmQ7CiAKLQogCQljYXNlIEFSR0lfU1RSSU5HOgogCiAJCQkvKgpAQCAtNDU4LDc1ICs0NjgsODYgQEAKIAkJCSAqIEJ1dCB3ZSBjYW4gaW1wbGljaXRseSBjb252ZXJ0IGZyb20gYSBCVUZGRVIgb3IgSU5URUdFUgogCQkJICogQWthIC0gIkltcGxpY2l0IFNvdXJjZSBPcGVyYW5kIENvbnZlcnNpb24iCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19zdHJpbmcgKG9ial9kZXNjLCBzdGFja19wdHIsCi0JCQkJCSBBQ1BJX0lNUExJQ0lUX0NPTlZFUlRfSEVYKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19zdHJpbmcob2JqX2Rlc2MsIHN0YWNrX3B0ciwKKwkJCQkJCQkgICBBQ1BJX0lNUExJQ0lUX0NPTlZFUlRfSEVYKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCWlmIChzdGF0dXMgPT0gQUVfVFlQRSkgewotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCSJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsCi0JCQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CisJCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkJICAiTmVlZGVkIFtJbnRlZ2VyL1N0cmluZy9CdWZmZXJdLCBmb3VuZCBbJXNdICVwXG4iLAorCQkJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkJCSAgKG9ial9kZXNjKSwKKwkJCQkJCQkgIG9ial9kZXNjKSk7CiAKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJCX0KIAotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KKworCQkJaWYgKG9ial9kZXNjICE9ICpzdGFja19wdHIpIHsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCQkJfQogCQkJZ290byBuZXh0X29wZXJhbmQ7CiAKLQogCQljYXNlIEFSR0lfQ09NUFVURURBVEE6CiAKIAkJCS8qIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIElOVEVHRVIsIFNUUklORyBvciBCVUZGRVIgKi8KIAotCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewogCQkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAkJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAkJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAogCQkJCS8qIFZhbGlkIG9wZXJhbmQgKi8KLQkJCSAgIGJyZWFrOworCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiTmVlZGVkIFtJbnRlZ2VyL1N0cmluZy9CdWZmZXJdLCBmb3VuZCBbJXNdICVwXG4iLAotCQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIk5lZWRlZCBbSW50ZWdlci9TdHJpbmcvQnVmZmVyXSwgZm91bmQgWyVzXSAlcFxuIiwKKwkJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkJICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwogCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCQl9CiAJCQlnb3RvIG5leHRfb3BlcmFuZDsKIAotCiAJCWNhc2UgQVJHSV9CVUZGRVJfT1JfU1RSSU5HOgogCiAJCQkvKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBTVFJJTkcgb3IgQlVGRkVSICovCiAKLQkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAkJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAkJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAogCQkJCS8qIFZhbGlkIG9wZXJhbmQgKi8KLQkJCSAgIGJyZWFrOworCQkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCiAJCQkJLyogSGlnaGVzdCBwcmlvcml0eSBjb252ZXJzaW9uIGlzIHRvIHR5cGUgQnVmZmVyICovCiAKLQkJCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyIChvYmpfZGVzYywgc3RhY2tfcHRyKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyKG9ial9kZXNjLAorCQkJCQkJCSAgICAgIHN0YWNrX3B0cik7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKworCQkJCWlmIChvYmpfZGVzYyAhPSAqc3RhY2tfcHRyKSB7CisJCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCQkJfQogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiTmVlZGVkIFtJbnRlZ2VyL1N0cmluZy9CdWZmZXJdLCBmb3VuZCBbJXNdICVwXG4iLAotCQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIk5lZWRlZCBbSW50ZWdlci9TdHJpbmcvQnVmZmVyXSwgZm91bmQgWyVzXSAlcFxuIiwKKwkJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkJICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwogCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCQl9CiAJCQlnb3RvIG5leHRfb3BlcmFuZDsKIAotCiAJCWNhc2UgQVJHSV9EQVRBT0JKRUNUOgogCQkJLyoKIAkJCSAqIEFSR0lfREFUQU9CSkVDVCBpcyBvbmx5IHVzZWQgYnkgdGhlIHNpemVfb2Ygb3BlcmF0b3IuCkBAIC01MzUsNyArNTU2LDcgQEAKIAkJCSAqIFRoZSBvbmx5IHJlZmVyZW5jZSBhbGxvd2VkIGhlcmUgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvCiAJCQkgKiBhIG5hbWVzcGFjZSBub2RlLgogCQkJICovCi0JCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKKwkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgogCQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgpAQCAtNTQ1LDIwICs1NjYsMjAgQEAKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIk5lZWRlZCBbQnVmZmVyL1N0cmluZy9QYWNrYWdlL1JlZmVyZW5jZV0sIGZvdW5kIFslc10gJXBcbiIsCi0JCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiTmVlZGVkIFtCdWZmZXIvU3RyaW5nL1BhY2thZ2UvUmVmZXJlbmNlXSwgZm91bmQgWyVzXSAlcFxuIiwKKwkJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkJICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwogCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCQl9CiAJCQlnb3RvIG5leHRfb3BlcmFuZDsKIAotCiAJCWNhc2UgQVJHSV9DT01QTEVYT0JKOgogCiAJCQkvKiBOZWVkIGEgYnVmZmVyIG9yIHBhY2thZ2Ugb3IgKEFDUEkgMi4wKSBTdHJpbmcgKi8KIAotCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewogCQkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAkJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAkJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKQEAgLTU2NywyMCArNTg4LDIwIEBACiAJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJOZWVkZWQgW0J1ZmZlci9TdHJpbmcvUGFja2FnZV0sIGZvdW5kIFslc10gJXBcbiIsCi0JCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiTmVlZGVkIFtCdWZmZXIvU3RyaW5nL1BhY2thZ2VdLCBmb3VuZCBbJXNdICVwXG4iLAorCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCQkgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CiAKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCX0KIAkJCWdvdG8gbmV4dF9vcGVyYW5kOwogCi0KIAkJY2FzZSBBUkdJX1JFR0lPTl9PUl9GSUVMRDoKIAogCQkJLyogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgUkVHSU9OIG9yIGEgRklFTEQgaW4gYSByZWdpb24gKi8KIAotCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewogCQkJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgogCQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgogCQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKQEAgLTU5MCwyMCArNjExLDIwIEBACiAJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJOZWVkZWQgW1JlZ2lvbi9yZWdpb25fZmllbGRdLCBmb3VuZCBbJXNdICVwXG4iLAotCQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIk5lZWRlZCBbUmVnaW9uL3JlZ2lvbl9maWVsZF0sIGZvdW5kIFslc10gJXBcbiIsCisJCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJCSAgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKIAotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJfQogCQkJZ290byBuZXh0X29wZXJhbmQ7CiAKLQogCQljYXNlIEFSR0lfREFUQVJFRk9CSjoKIAogCQkJLyogVXNlZCBieSB0aGUgU3RvcmUoKSBvcGVyYXRvciBvbmx5ICovCiAKLQkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAkJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAJCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgogCQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgpAQCAtNjM1LDQ3ICs2NTYsNDYgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCi0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJOZWVkZWQgSW50ZWdlci9CdWZmZXIvU3RyaW5nL1BhY2thZ2UvUmVmL0RkYl0sIGZvdW5kIFslc10gJXBcbiIsCi0JCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiTmVlZGVkIEludGVnZXIvQnVmZmVyL1N0cmluZy9QYWNrYWdlL1JlZi9EZGJdLCBmb3VuZCBbJXNdICVwXG4iLAorCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCQkgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CiAKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCX0KIAkJCWdvdG8gbmV4dF9vcGVyYW5kOwogCi0KIAkJZGVmYXVsdDoKIAogCQkJLyogVW5rbm93biB0eXBlICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJJbnRlcm5hbCAtIFVua25vd24gQVJHSSAocmVxdWlyZWQgb3BlcmFuZCkgdHlwZSAlWFxuIiwKLQkJCQl0aGlzX2FyZ190eXBlKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJJbnRlcm5hbCAtIFVua25vd24gQVJHSSAocmVxdWlyZWQgb3BlcmFuZCkgdHlwZSAlWFxuIiwKKwkJCQkJICB0aGlzX2FyZ190eXBlKSk7CiAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJCX0KIAogCQkvKgogCQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyByZXNvbHZlZCB0byB0aGUKIAkJICogcmVxdWlyZWQgb2JqZWN0IHR5cGUgKFNpbXBsZSBjYXNlcyBvbmx5KS4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUgKHR5cGVfbmVlZGVkLAotCQkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUgKCpzdGFja19wdHIpLCAqc3RhY2tfcHRyKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2V4X2NoZWNrX29iamVjdF90eXBlKHR5cGVfbmVlZGVkLAorCQkJCQkJICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUKKwkJCQkJCSAgICgqc3RhY2tfcHRyKSwgKnN0YWNrX3B0cik7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAotbmV4dF9vcGVyYW5kOgorCSAgICAgIG5leHRfb3BlcmFuZDoKIAkJLyoKIAkJICogSWYgbW9yZSBvcGVyYW5kcyBuZWVkZWQsIGRlY3JlbWVudCBzdGFja19wdHIgdG8gcG9pbnQKIAkJICogdG8gbmV4dCBvcGVyYW5kIG9uIHN0YWNrCiAJCSAqLwotCQlpZiAoR0VUX0NVUlJFTlRfQVJHX1RZUEUgKGFyZ190eXBlcykpIHsKKwkJaWYgKEdFVF9DVVJSRU5UX0FSR19UWVBFKGFyZ190eXBlcykpIHsKIAkJCXN0YWNrX3B0ci0tOwogCQl9CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jCmluZGV4IDI3MjVkYjAuLmE3ZDhlZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYwpAQCAtNDIsNyArNDIsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CkBAIC01MCwyNCArNDksMTggQEAKICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHN0b3JlIikKK0FDUElfTU9EVUxFX05BTUUoImV4c3RvcmUiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyB2b2lkCi1hY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKK2FjcGlfZXhfZG9fZGVidWdfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJdTMyIGxldmVsLCB1MzIgaW5kZXgpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp2YWxfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KK2FjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnZhbF9kZXNjLAorCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9kZXNjLAorCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODQsMTM2ICs3NywxNDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1hY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KQorYWNwaV9leF9kb19kZWJ1Z19vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQl1MzIgbGV2ZWwsIHUzMiBpbmRleCkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJdTMyIGk7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfZG9fZGVidWdfb2JqZWN0Iiwgc291cmNlX2Rlc2MpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9kb19kZWJ1Z19vYmplY3QiLCBzb3VyY2VfZGVzYyk7Ci0KLQotCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbQUNQSSBEZWJ1Z10gJSpzIiwKLQkJbGV2ZWwsICIgIikpOworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIltBQ1BJIERlYnVnXSAlKnMiLAorCQkJICAgICAgbGV2ZWwsICIgIikpOwogCiAJLyogRGlzcGxheSBpbmRleCBmb3IgcGFja2FnZSBvdXRwdXQgb25seSAqLwogCiAJaWYgKGluZGV4ID4gMCkgewotCSAgIEFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsCi0JCSAgICIoJS4ydSkgIiwgaW5kZXggLTEpKTsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULAorCQkJCSAgICAgICIoJS4ydSkgIiwgaW5kZXggLSAxKSk7CiAJfQogCiAJaWYgKCFzb3VyY2VfZGVzYykgewotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiPE51bGwgT2JqZWN0PlxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICI8TnVsbCBPYmplY3Q+XG4iKSk7CiAJCXJldHVybl9WT0lEOwogCX0KIAotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHNvdXJjZV9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIlczogIiwKLQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSkpOworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoc291cmNlX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULCAiJXM6ICIsCisJCQkJICAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCSAgICAgIChzb3VyY2VfZGVzYykpKTsKIAotCQlpZiAoIWFjcGlfdXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0IChzb3VyY2VfZGVzYykpIHsKLQkJICAgQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKLQkJCSAgICIlcCwgSW52YWxpZCBJbnRlcm5hbCBPYmplY3QhXG4iLCBzb3VyY2VfZGVzYykpOwotCQkgICByZXR1cm5fVk9JRDsKKwkJaWYgKCFhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdChzb3VyY2VfZGVzYykpIHsKKwkJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKKwkJCQkJICAgICAgIiVwLCBJbnZhbGlkIEludGVybmFsIE9iamVjdCFcbiIsCisJCQkJCSAgICAgIHNvdXJjZV9kZXNjKSk7CisJCQlyZXR1cm5fVk9JRDsKIAkJfQotCX0KLQllbHNlIGlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHNvdXJjZV9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiJXM6ICVwXG4iLAotCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lICgoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIHNvdXJjZV9kZXNjKS0+dHlwZSksCi0JCQlzb3VyY2VfZGVzYykpOworCX0gZWxzZSBpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHNvdXJjZV9kZXNjKSA9PQorCQkgICBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIlczogJXBcbiIsCisJCQkJICAgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKCgoc3RydWN0CisJCQkJCQkJICAgICAgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJCSAgICAgICopc291cmNlX2Rlc2MpLT4KKwkJCQkJCQkgICAgdHlwZSksCisJCQkJICAgICAgc291cmNlX2Rlc2MpKTsKIAkJcmV0dXJuX1ZPSUQ7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCXJldHVybl9WT0lEOwogCX0KIAotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAogCQkvKiBPdXRwdXQgY29ycmVjdCBpbnRlZ2VyIHdpZHRoICovCiAKIAkJaWYgKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9PSA0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiMHglOC44WFxuIiwKLQkJCQkodTMyKSBzb3VyY2VfZGVzYy0+aW50ZWdlci52YWx1ZSkpOwotCQl9Ci0JCWVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIjB4JTguOFglOC44WFxuIiwKLQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKHNvdXJjZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKSkpOworCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULCAiMHglOC44WFxuIiwKKwkJCQkJICAgICAgKHUzMikgc291cmNlX2Rlc2MtPmludGVnZXIuCisJCQkJCSAgICAgIHZhbHVlKSk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsCisJCQkJCSAgICAgICIweCU4LjhYJTguOFhcbiIsCisJCQkJCSAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChzb3VyY2VfZGVzYy0+CisJCQkJCQkJCSBpbnRlZ2VyLgorCQkJCQkJCQkgdmFsdWUpKSk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlsweCUuMlhdIiwKLQkJCSh1MzIpIHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKSk7Ci0JCUFDUElfRFVNUF9CVUZGRVIgKHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwKLQkJCShzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCA8IDMyKSA/IHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDogMzIpOworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbMHglLjJYXVxuIiwKKwkJCQkgICAgICAodTMyKSBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOworCQlBQ1BJX0RVTVBfQlVGRkVSKHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkgKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDwKKwkJCQkgIDMyKSA/IHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDogMzIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWzB4JS4yWF0gXCIlc1wiXG4iLAotCQkJc291cmNlX2Rlc2MtPnN0cmluZy5sZW5ndGgsIHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcikpOworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbMHglLjJYXSBcIiVzXCJcbiIsCisJCQkJICAgICAgc291cmNlX2Rlc2MtPnN0cmluZy5sZW5ndGgsCisJCQkJICAgICAgc291cmNlX2Rlc2MtPnN0cmluZy5wb2ludGVyKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWzB4JS4yWCBFbGVtZW50c11cbiIsCi0JCQlzb3VyY2VfZGVzYy0+cGFja2FnZS5jb3VudCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsCisJCQkJICAgICAgIlsweCUuMlggRWxlbWVudHNdXG4iLAorCQkJCSAgICAgIHNvdXJjZV9kZXNjLT5wYWNrYWdlLmNvdW50KSk7CiAKIAkJLyogT3V0cHV0IHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIHBhY2thZ2UgKi8KIAogCQlmb3IgKGkgPSAwOyBpIDwgc291cmNlX2Rlc2MtPnBhY2thZ2UuY291bnQ7IGkrKykgewotCQkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3QgKHNvdXJjZV9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzW2ldLAotCQkJCWxldmVsKzQsIGkrMSk7CisJCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdChzb3VyY2VfZGVzYy0+cGFja2FnZS4KKwkJCQkJCWVsZW1lbnRzW2ldLCBsZXZlbCArIDQsIGkgKyAxKTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKIAogCQlpZiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX0lOREVYX09QKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWyVzLCAweCVYXVxuIiwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpLAotCQkJCXNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0KSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsCisJCQkJCSAgICAgICJbJXMsIDB4JVhdXG4iLAorCQkJCQkgICAgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZQorCQkJCQkgICAgICAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpLAorCQkJCQkgICAgICBzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCkpOworCQl9IGVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWyVzXVxuIiwKKwkJCQkJICAgICAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUKKwkJCQkJICAgICAgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSkpOwogCQl9Ci0JCWVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlslc11cbiIsCi0JCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSkpOwotCQl9Ci0KIAogCQlpZiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpIHsKLQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KSA9PQotCQkJCQlBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkJCWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0ICgoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCi0JCQkJCXNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KS0+b2JqZWN0LAotCQkJCQlsZXZlbCs0LCAwKTsKKwkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUKKwkJCSAgICAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpID09CisJCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCgoKHN0cnVjdAorCQkJCQkJCSAgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQorCQkJCQkJCSBzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLgorCQkJCQkJCSBvYmplY3QpLT5vYmplY3QsCisJCQkJCQkJbGV2ZWwgKyA0LCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3Qoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS4KKwkJCQkJCQlvYmplY3QsIGxldmVsICsgNCwgMCk7CiAJCQl9Ci0JCQllbHNlIHsKLQkJCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QsIGxldmVsKzQsIDApOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uubm9kZSkgewotCQkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3QgKChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm5vZGUpLT5vYmplY3QsCi0JCQkJbGV2ZWwrNCwgMCk7CisJCX0gZWxzZSBpZiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKSB7CisJCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCgoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKS0+CisJCQkJCQlvYmplY3QsIGxldmVsICsgNCwgMCk7CiAJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCi0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIlcCAlc1xuIiwKLQkJCXNvdXJjZV9kZXNjLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYykpKTsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULCAiJXAgJXNcbiIsCisJCQkJICAgICAgc291cmNlX2Rlc2MsCisJCQkJICAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCSAgICAgIChzb3VyY2VfZGVzYykpKTsKIAkJYnJlYWs7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0VYRUMsICJcbiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9FWEVDLCAiXG4iKSk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zdG9yZQpAQCAtMjM1LDQyICsyMzgsNDEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N0b3JlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZXhfc3RvcmUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9kZXNjLAorCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZWZfZGVzYyA9IGRlc3RfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWZfZGVzYyA9IGRlc3RfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9zdG9yZSIsIGRlc3RfZGVzYyk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfc3RvcmUiLCBkZXN0X2Rlc2MpOwogCiAJLyogVmFsaWRhdGUgcGFyYW1ldGVycyAqLwogCiAJaWYgKCFzb3VyY2VfZGVzYyB8fCAhZGVzdF9kZXNjKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTnVsbCBwYXJhbWV0ZXJcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTk9fT1BFUkFORCk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJOdWxsIHBhcmFtZXRlclxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwogCX0KIAogCS8qIGRlc3RfZGVzYyBjYW4gYmUgZWl0aGVyIGEgbmFtZXNwYWNlIG5vZGUgb3IgYW4gQUNQSSBvYmplY3QgKi8KIAotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKGRlc3RfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKGRlc3RfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKIAkJLyoKIAkJICogRGVzdCBpcyBhIG5hbWVzcGFjZSBub2RlLAogCQkgKiBTdG9yaW5nIGFuIG9iamVjdCBpbnRvIGEgTmFtZWQgbm9kZS4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUgKHNvdXJjZV9kZXNjLAotCQkJCSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgZGVzdF9kZXNjLCB3YWxrX3N0YXRlLAotCQkJCSBBQ1BJX0lNUExJQ0lUX0NPTlZFUlNJT04pOworCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlX29iamVjdF90b19ub2RlKHNvdXJjZV9kZXNjLAorCQkJCQkJICAgICAgKHN0cnVjdAorCQkJCQkJICAgICAgIGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJCQkJCSAgICAgIGRlc3RfZGVzYywgd2Fsa19zdGF0ZSwKKwkJCQkJCSAgICAgIEFDUElfSU1QTElDSVRfQ09OVkVSU0lPTik7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBEZXN0aW5hdGlvbiBvYmplY3QgbXVzdCBiZSBhIFJlZmVyZW5jZSBvciBhIENvbnN0YW50IG9iamVjdCAqLwogCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoZGVzdF9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoZGVzdF9kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKIAkJYnJlYWs7CiAKQEAgLTI3OSw3ICsyODEsNyBAQAogCQkvKiBBbGxvdyBzdG9yZXMgdG8gQ29uc3RhbnRzIC0tIGEgTm9vcCBhcyBwZXIgQUNQSSBzcGVjICovCiAKIAkJaWYgKGRlc3RfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0FNTF9DT05TVEFOVCkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQl9CiAKIAkJLypsaW50IC1mYWxsdGhyb3VnaCAqLwpAQCAtMjg4LDE2ICsyOTAsMTggQEAKIAogCQkvKiBEZXN0aW5hdGlvbiBpcyBub3QgYSBSZWZlcmVuY2Ugb2JqZWN0ICovCiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiVGFyZ2V0IGlzIG5vdCBhIFJlZmVyZW5jZSBvciBDb25zdGFudCBvYmplY3QgLSAlcyBbJXBdXG4iLAotCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoZGVzdF9kZXNjKSwgZGVzdF9kZXNjKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVGFyZ2V0IGlzIG5vdCBhIFJlZmVyZW5jZSBvciBDb25zdGFudCBvYmplY3QgLSAlcyBbJXBdXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShkZXN0X2Rlc2MpLAorCQkJCSAgZGVzdF9kZXNjKSk7CiAKLQkJQUNQSV9EVU1QX1NUQUNLX0VOVFJZIChzb3VyY2VfZGVzYyk7Ci0JCUFDUElfRFVNUF9TVEFDS19FTlRSWSAoZGVzdF9kZXNjKTsKLQkJQUNQSV9EVU1QX09QRVJBTkRTICgmZGVzdF9kZXNjLCBBQ1BJX0lNT0RFX0VYRUNVVEUsICJleF9zdG9yZSIsCi0JCQkJICAyLCAiVGFyZ2V0IGlzIG5vdCBhIFJlZmVyZW5jZSBvciBDb25zdGFudCBvYmplY3QiKTsKKwkJQUNQSV9EVU1QX1NUQUNLX0VOVFJZKHNvdXJjZV9kZXNjKTsKKwkJQUNQSV9EVU1QX1NUQUNLX0VOVFJZKGRlc3RfZGVzYyk7CisJCUFDUElfRFVNUF9PUEVSQU5EUygmZGVzdF9kZXNjLCBBQ1BJX0lNT0RFX0VYRUNVVEUsICJleF9zdG9yZSIsCisJCQkJICAgMiwKKwkJCQkgICAiVGFyZ2V0IGlzIG5vdCBhIFJlZmVyZW5jZSBvciBDb25zdGFudCBvYmplY3QiKTsKIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJfQogCiAJLyoKQEAgLTMxNCw1OCArMzE4LDU5IEBACiAKIAkJLyogU3RvcmluZyBhbiBvYmplY3QgaW50byBhIE5hbWUgImNvbnRhaW5lciIgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlX29iamVjdF90b19ub2RlIChzb3VyY2VfZGVzYywKLQkJCQkgcmVmX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QsCi0JCQkJIHdhbGtfc3RhdGUsIEFDUElfSU1QTElDSVRfQ09OVkVSU0lPTik7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUoc291cmNlX2Rlc2MsCisJCQkJCQkgICAgICByZWZfZGVzYy0+cmVmZXJlbmNlLgorCQkJCQkJICAgICAgb2JqZWN0LCB3YWxrX3N0YXRlLAorCQkJCQkJICAgICAgQUNQSV9JTVBMSUNJVF9DT05WRVJTSU9OKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX0lOREVYX09QOgogCiAJCS8qIFN0b3JpbmcgdG8gYW4gSW5kZXggKHBvaW50ZXIgaW50byBhIHBhY2thZ2VyIG9yIGJ1ZmZlcikgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlX29iamVjdF90b19pbmRleCAoc291cmNlX2Rlc2MsIHJlZl9kZXNjLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4KHNvdXJjZV9kZXNjLCByZWZfZGVzYywKKwkJCQkJCSAgd2Fsa19zdGF0ZSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9MT0NBTF9PUDoKIAljYXNlIEFNTF9BUkdfT1A6CiAKIAkJLyogU3RvcmUgdG8gYSBtZXRob2QgbG9jYWwvYXJnICAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZHNfc3RvcmVfb2JqZWN0X3RvX2xvY2FsIChyZWZfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSwKLQkJCQkgcmVmX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsIHNvdXJjZV9kZXNjLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZHNfc3RvcmVfb2JqZWN0X3RvX2xvY2FsKHJlZl9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlLAorCQkJCQkJICByZWZfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwKKwkJCQkJCSAgc291cmNlX2Rlc2MsIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAotCiAJY2FzZSBBTUxfREVCVUdfT1A6CiAKIAkJLyoKIAkJICogU3RvcmluZyB0byB0aGUgRGVidWcgb2JqZWN0IGNhdXNlcyB0aGUgdmFsdWUgc3RvcmVkIHRvIGJlCiAJCSAqIGRpc3BsYXllZCBhbmQgb3RoZXJ3aXNlIGhhcyBubyBlZmZlY3QgLS0gc2VlIEFDUEkgU3BlY2lmaWNhdGlvbgogCQkgKi8KLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSIqKioqIFdyaXRlIHRvIERlYnVnIE9iamVjdDogT2JqZWN0ICVwICVzICoqKio6XG5cbiIsCi0JCQlzb3VyY2VfZGVzYywgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICIqKioqIFdyaXRlIHRvIERlYnVnIE9iamVjdDogT2JqZWN0ICVwICVzICoqKio6XG5cbiIsCisJCQkJICBzb3VyY2VfZGVzYywKKwkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoc291cmNlX2Rlc2MpKSk7CiAKLQkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3QgKHNvdXJjZV9kZXNjLCAwLCAwKTsKKwkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3Qoc291cmNlX2Rlc2MsIDAsIDApOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJleF9zdG9yZTogVW5rbm93biBSZWZlcmVuY2Ugb3Bjb2RlICVYXG4iLAotCQkJcmVmX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKTsKLQkJQUNQSV9EVU1QX0VOVFJZIChyZWZfZGVzYywgQUNQSV9MVl9FUlJPUik7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiZXhfc3RvcmU6IFVua25vd24gUmVmZXJlbmNlIG9wY29kZSAlWFxuIiwKKwkJCQkgICByZWZfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpOworCQlBQ1BJX0RVTVBfRU5UUlkocmVmX2Rlc2MsIEFDUElfTFZfRVJST1IpOwogCiAJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4CkBAIC0zODEsMjAgKzM4NiwxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N0b3JlX29iamVjdF90b19pbmRleCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaW5kZXhfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9leF9zdG9yZV9vYmplY3RfdG9faW5kZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbmRleF9kZXNjLAorCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm5ld19kZXNjOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXdfZGVzYzsKKwl1OCB2YWx1ZSA9IDA7CisJdTMyIGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9zdG9yZV9vYmplY3RfdG9faW5kZXgiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3N0b3JlX29iamVjdF90b19pbmRleCIpOwogCiAJLyoKIAkgKiBEZXN0aW5hdGlvbiBtdXN0IGJlIGEgcmVmZXJlbmNlIHBvaW50ZXIsIGFuZApAQCAtNDEzLDE5ICs0MTUsMjAgQEAKIAkJICovCiAJCW9ial9kZXNjID0gKihpbmRleF9kZXNjLT5yZWZlcmVuY2Uud2hlcmUpOwogCi0JCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QgKHNvdXJjZV9kZXNjLCAmbmV3X2Rlc2MsIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0KHNvdXJjZV9kZXNjLCAmbmV3X2Rlc2MsCisJCQkJCQkgICAgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQlpZiAob2JqX2Rlc2MpIHsKIAkJCS8qIERlY3JlbWVudCByZWZlcmVuY2UgY291bnQgYnkgdGhlIHJlZiBjb3VudCBvZiB0aGUgcGFyZW50IHBhY2thZ2UgKi8KIAotCQkJZm9yIChpID0gMDsKLQkJCQkgaSA8ICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKQotCQkJCQkJaW5kZXhfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCktPmNvbW1vbi5yZWZlcmVuY2VfY291bnQ7Ci0JCQkJIGkrKykgewotCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJZm9yIChpID0gMDsgaSA8ICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKQorCQkJCQkgaW5kZXhfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCktPmNvbW1vbi4KKwkJCSAgICAgcmVmZXJlbmNlX2NvdW50OyBpKyspIHsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCQkJfQogCQl9CiAKQEAgLTQzMywxNiArNDM2LDE0IEBACiAKIAkJLyogSW5jcmVtZW50IHJlZiBjb3VudCBieSB0aGUgcmVmIGNvdW50IG9mIHRoZSBwYXJlbnQgcGFja2FnZS0xICovCiAKLQkJZm9yIChpID0gMTsKLQkJCSBpIDwgKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopCi0JCQkJCWluZGV4X2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpLT5jb21tb24ucmVmZXJlbmNlX2NvdW50OwotCQkJIGkrKykgewotCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChuZXdfZGVzYyk7CisJCWZvciAoaSA9IDE7IGkgPCAoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikKKwkJCQkgaW5kZXhfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCktPmNvbW1vbi4KKwkJICAgICByZWZlcmVuY2VfY291bnQ7IGkrKykgeworCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG5ld19kZXNjKTsKIAkJfQogCiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAKIAkJLyoKQEAgLTQ2MCwxNiArNDYxLDE2IEBACiAJCSAqIGJ5IHRoZSBJTkRFWF9PUCBjb2RlLgogCQkgKi8KIAkJb2JqX2Rlc2MgPSBpbmRleF9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0OwotCQlpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgJiYKLQkJCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9TVFJJTkcpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQlpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSAmJgorCQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfU1RSSU5HKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKIAkJLyoKIAkJICogVGhlIGFzc2lnbm1lbnQgb2YgdGhlIGluZGl2aWR1YWwgZWxlbWVudHMgd2lsbCBiZSBzbGlnaHRseQogCQkgKiBkaWZmZXJlbnQgZm9yIGVhY2ggc291cmNlIHR5cGUuCiAJCSAqLwotCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykpIHsKKwkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykpIHsKIAkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAogCQkJLyogVXNlIHRoZSBsZWFzdC1zaWduaWZpY2FudCBieXRlIG9mIHRoZSBpbnRlZ2VyICovCkBAIC00ODksMTAgKzQ5MCwxMSBAQAogCiAJCQkvKiBBbGwgb3RoZXIgdHlwZXMgYXJlIGludmFsaWQgKi8KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIlNvdXJjZSBtdXN0IGJlIEludGVnZXIvQnVmZmVyL1N0cmluZyB0eXBlLCBub3QgJXNcbiIsCi0JCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiU291cmNlIG11c3QgYmUgSW50ZWdlci9CdWZmZXIvU3RyaW5nIHR5cGUsIG5vdCAlc1xuIiwKKwkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgKHNvdXJjZV9kZXNjKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKIAkJLyogU3RvcmUgdGhlIHNvdXJjZSB2YWx1ZSBpbnRvIHRoZSB0YXJnZXQgYnVmZmVyIGJ5dGUgKi8KQEAgLTUwMCwxOCArNTAyLDE2IEBACiAJCW9ial9kZXNjLT5idWZmZXIucG9pbnRlcltpbmRleF9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0XSA9IHZhbHVlOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiVGFyZ2V0IGlzIG5vdCBhIFBhY2thZ2Ugb3IgYnVmZmVyX2ZpZWxkXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVGFyZ2V0IGlzIG5vdCBhIFBhY2thZ2Ugb3IgYnVmZmVyX2ZpZWxkXG4iKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCWJyZWFrOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N0b3JlX29iamVjdF90b19ub2RlCkBAIC01MzksNDIgKzUzOSw0MCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0X2NvbnZlcnNpb24pCithY3BpX2V4X3N0b3JlX29iamVjdF90b19ub2RlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgdTggaW1wbGljaXRfY29udmVyc2lvbikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRhcmdldF9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm5ld19kZXNjOwotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdGFyZ2V0X3R5cGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGFyZ2V0X2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV3X2Rlc2M7CisJYWNwaV9vYmplY3RfdHlwZSB0YXJnZXRfdHlwZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9zdG9yZV9vYmplY3RfdG9fbm9kZSIsIHNvdXJjZV9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9zdG9yZV9vYmplY3RfdG9fbm9kZSIsIHNvdXJjZV9kZXNjKTsKIAogCS8qIEdldCBjdXJyZW50IHR5cGUgb2YgdGhlIG5vZGUsIGFuZCBvYmplY3QgYXR0YWNoZWQgdG8gTm9kZSAqLwogCi0JdGFyZ2V0X3R5cGUgPSBhY3BpX25zX2dldF90eXBlIChub2RlKTsKLQl0YXJnZXRfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJdGFyZ2V0X3R5cGUgPSBhY3BpX25zX2dldF90eXBlKG5vZGUpOworCXRhcmdldF9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIlN0b3JpbmcgJXAoJXMpIGludG8gbm9kZSAlcCglcylcbiIsCi0JCXNvdXJjZV9kZXNjLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYyksCi0JCQkgIG5vZGUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodGFyZ2V0X3R5cGUpKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiU3RvcmluZyAlcCglcykgaW50byBub2RlICVwKCVzKVxuIiwKKwkJCSAgc291cmNlX2Rlc2MsCisJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoc291cmNlX2Rlc2MpLCBub2RlLAorCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUodGFyZ2V0X3R5cGUpKSk7CiAKIAkvKgogCSAqIFJlc29sdmUgdGhlIHNvdXJjZSBvYmplY3QgdG8gYW4gYWN0dWFsIHZhbHVlCiAJICogKElmIGl0IGlzIGEgcmVmZXJlbmNlIG9iamVjdCkKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb2JqZWN0ICgmc291cmNlX2Rlc2MsIHRhcmdldF90eXBlLCB3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb2JqZWN0KCZzb3VyY2VfZGVzYywgdGFyZ2V0X3R5cGUsIHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBJZiBubyBpbXBsaWNpdCBjb252ZXJzaW9uLCBkcm9wIGludG8gdGhlIGRlZmF1bHQgY2FzZSBiZWxvdyAqLwogCi0JaWYgKCFpbXBsaWNpdF9jb252ZXJzaW9uKSB7CisJaWYgKCghaW1wbGljaXRfY29udmVyc2lvbikgfHwgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfQ09QWV9PUCkpIHsKIAkJLyogRm9yY2UgZXhlY3V0aW9uIG9mIGRlZmF1bHQgKG5vIGltcGxpY2l0IGNvbnZlcnNpb24pICovCiAKIAkJdGFyZ2V0X3R5cGUgPSBBQ1BJX1RZUEVfQU5ZOwpAQCAtNTkwLDExICs1ODgsMTAgQEAKIAogCQkvKiBGb3IgZmllbGRzLCBjb3B5IHRoZSBzb3VyY2UgZGF0YSB0byB0aGUgdGFyZ2V0IGZpZWxkLiAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfZGF0YV90b19maWVsZCAoc291cmNlX2Rlc2MsIHRhcmdldF9kZXNjLAotCQkJCSAmd2Fsa19zdGF0ZS0+cmVzdWx0X29iaik7CisJCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfZGF0YV90b19maWVsZChzb3VyY2VfZGVzYywgdGFyZ2V0X2Rlc2MsCisJCQkJCQkgICAgICZ3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKQEAgLTYwNSwxMCArNjAyLDExIEBACiAJCSAqCiAJCSAqIENvcHkgYW5kL29yIGNvbnZlcnQgdGhlIHNvdXJjZSBvYmplY3QgdG8gYSBuZXcgdGFyZ2V0IG9iamVjdAogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0IChzb3VyY2VfZGVzYywgdGFyZ2V0X2Rlc2MsCi0JCQkJICZuZXdfZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX29iamVjdChzb3VyY2VfZGVzYywgdGFyZ2V0X2Rlc2MsCisJCQkJCQkgICAmbmV3X2Rlc2MsIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJaWYgKG5ld19kZXNjICE9IHRhcmdldF9kZXNjKSB7CkBAIC02MjEsMzAgKzYxOSwzMyBAQAogCQkJICogaGFzIGJlZW4gcGVyZm9ybWVkIHN1Y2ggdGhhdCB0aGUgbm9kZS9vYmplY3QgdHlwZSBoYXMgYmVlbgogCQkJICogY2hhbmdlZC4KIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChub2RlLCBuZXdfZGVzYywgbmV3X2Rlc2MtPmNvbW1vbi50eXBlKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5vZGUsIG5ld19kZXNjLAorCQkJCQkJICBuZXdfZGVzYy0+Y29tbW9uLnR5cGUpOwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJCSJTdG9yZSAlcyBpbnRvICVzIHZpYSBDb252ZXJ0L0F0dGFjaFxuIiwKLQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYyksCi0JCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAobmV3X2Rlc2MpKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCSAgIlN0b3JlICVzIGludG8gJXMgdmlhIENvbnZlcnQvQXR0YWNoXG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAoc291cmNlX2Rlc2MpLAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAobmV3X2Rlc2MpKSk7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSJTdG9yaW5nICVzICglcCkgZGlyZWN0bHkgaW50byBub2RlICglcCksIG5vIGltcGxpY2l0IGNvbnZlcnNpb25cbiIsCi0JCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYyksIHNvdXJjZV9kZXNjLCBub2RlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICJTdG9yaW5nICVzICglcCkgZGlyZWN0bHkgaW50byBub2RlICglcCkgd2l0aCBubyBpbXBsaWNpdCBjb252ZXJzaW9uXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShzb3VyY2VfZGVzYyksCisJCQkJICBzb3VyY2VfZGVzYywgbm9kZSkpOwogCiAJCS8qIE5vIGNvbnZlcnNpb25zIGZvciBhbGwgb3RoZXIgdHlwZXMuICBKdXN0IGF0dGFjaCB0aGUgc291cmNlIG9iamVjdCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCAobm9kZSwgc291cmNlX2Rlc2MsCi0JCQkJIEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykpOworCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3Qobm9kZSwgc291cmNlX2Rlc2MsCisJCQkJCSAgICAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRQorCQkJCQkgICAgICAgKHNvdXJjZV9kZXNjKSk7CiAJCWJyZWFrOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZW4uYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3Jlbi5jCmluZGV4IDEyMGYzMGUuLjM4MmY2M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3Jlbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3Jlbi5jCkBAIC00MywxNSArNDMsMTIgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4c3RvcmVuIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiZXhzdG9yZW4iKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY3LDE5ICs2NCwxNSBAQAogICogICAgICAgICAgICAgIGl0IGFuZCByZXR1cm4gdGhlIGFjdHVhbCBvYmplY3QgaW4gdGhlIHNvdXJjZV9kZXNjX3B0ci4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnNvdXJjZV9kZXNjX3B0ciwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHRhcmdldF90eXBlLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2V4X3Jlc29sdmVfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipzb3VyY2VfZGVzY19wdHIsCisJCSAgICAgICBhY3BpX29iamVjdF90eXBlIHRhcmdldF90eXBlLAorCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYyA9ICpzb3VyY2VfZGVzY19wdHI7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYyA9ICpzb3VyY2VfZGVzY19wdHI7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9yZXNvbHZlX29iamVjdCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfcmVzb2x2ZV9vYmplY3QiKTsKIAogCS8qIEVuc3VyZSB3ZSBoYXZlIGEgVGFyZ2V0IHRoYXQgY2FuIGJlIHN0b3JlZCB0byAqLwogCkBAIC0xMDIsMTEgKzk1LDE0IEBACiAJCSAqIGFyZSBhbGwgZXNzZW50aWFsbHkgdGhlIHNhbWUuICBUaGlzIGNhc2UgaGFuZGxlcyB0aGUKIAkJICogImludGVyY2hhbmdlYWJsZSIgdHlwZXMgSW50ZWdlciwgU3RyaW5nLCBhbmQgQnVmZmVyLgogCQkgKi8KLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgeworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpID09CisJCSAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7CiAJCQkvKiBSZXNvbHZlIGEgcmVmZXJlbmNlIG9iamVjdCBmaXJzdCAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUgKHNvdXJjZV9kZXNjX3B0ciwgd2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZShzb3VyY2VfZGVzY19wdHIsCisJCQkJCQkgICAgIHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTExOSwzMSArMTE1LDMyIEBACiAKIAkJLyogTXVzdCBoYXZlIGEgSW50ZWdlciwgQnVmZmVyLCBvciBTdHJpbmcgKi8KIAotCQlpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0lOVEVHRVIpICAgJiYKLQkJCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9CVUZGRVIpICAgICYmCi0JCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfU1RSSU5HKSAgICAmJgotCQkJISgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSAmJiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX0xPQURfT1ApKSkgeworCQlpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgJiYKKwkJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgJiYKKwkJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX1NUUklORykgJiYKKwkJICAgICEoKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSA9PQorCQkgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkKKwkJICAgICAgJiYgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9MT0FEX09QKSkpIHsKIAkJCS8qIENvbnZlcnNpb24gc3VjY2Vzc2Z1bCBidXQgc3RpbGwgbm90IGEgdmFsaWQgdHlwZSAqLwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiQ2Fubm90IGFzc2lnbiB0eXBlICVzIHRvICVzIChtdXN0IGJlIHR5cGUgSW50L1N0ci9CdWYpXG4iLAotCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSwKLQkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKHRhcmdldF90eXBlKSkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiQ2Fubm90IGFzc2lnbiB0eXBlICVzIHRvICVzIChtdXN0IGJlIHR5cGUgSW50L1N0ci9CdWYpXG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAoc291cmNlX2Rlc2MpLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0YXJnZXRfdHlwZSkpKTsKIAkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0FMSUFTOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUzoKIAogCQkvKiBBbGlhc2VzIGFyZSByZXNvbHZlZCBieSBhY3BpX2V4X3ByZXBfb3BlcmFuZHMgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTdG9yZSBpbnRvIEFsaWFzIC0gc2hvdWxkIG5ldmVyIGhhcHBlblxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlN0b3JlIGludG8gQWxpYXMgLSBzaG91bGQgbmV2ZXIgaGFwcGVuXG4iKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAJZGVmYXVsdDoKIApAQCAtMTU0LDEwICsxNTEsOSBAQAogCQlicmVhazsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0CkBAIC0xOTQsMTggKzE5MCwxNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipuZXdfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRlc3RfZGVzYywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqbmV3X2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICphY3R1YWxfc3JjX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3R1YWxfc3JjX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfc3RvcmVfb2JqZWN0X3RvX29iamVjdCIsIHNvdXJjZV9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0Iiwgc291cmNlX2Rlc2MpOwogCiAJYWN0dWFsX3NyY19kZXNjID0gc291cmNlX2Rlc2M7CiAJaWYgKCFkZXN0X2Rlc2MpIHsKQEAgLTIxNCwxMSArMjA3LDE0IEBACiAJCSAqIHBhY2thZ2UgZWxlbWVudCksIHNvIHdlIGNhbiBzaW1wbHkgY29weSB0aGUgc291cmNlIG9iamVjdAogCQkgKiBjcmVhdGluZyBhIG5ldyBkZXN0aW5hdGlvbiBvYmplY3QKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QgKGFjdHVhbF9zcmNfZGVzYywgbmV3X2Rlc2MsIHdhbGtfc3RhdGUpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0KGFjdHVhbF9zcmNfZGVzYywgbmV3X2Rlc2MsCisJCQkJCQkgICAgd2Fsa19zdGF0ZSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpICE9IEFDUElfR0VUX09CSkVDVF9UWVBFIChkZXN0X2Rlc2MpKSB7CisJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPQorCSAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShkZXN0X2Rlc2MpKSB7CiAJCS8qCiAJCSAqIFRoZSBzb3VyY2UgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgZGVzdGluYXRpb24uCiAJCSAqIFBlcmZvcm0gdGhlICJpbXBsaWNpdCBjb252ZXJzaW9uIiBvZiB0aGUgc291cmNlIHRvIHRoZSBjdXJyZW50IHR5cGUKQEAgLTIyOCwxMCArMjI0LDEzIEBACiAJCSAqIE90aGVyd2lzZSwgYWN0dWFsX3NyY19kZXNjIGlzIGEgdGVtcG9yYXJ5IG9iamVjdCB0byBob2xkIHRoZQogCQkgKiBjb252ZXJ0ZWQgb2JqZWN0LgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX3RhcmdldF90eXBlIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoZGVzdF9kZXNjKSwKLQkJCQkgIHNvdXJjZV9kZXNjLCAmYWN0dWFsX3NyY19kZXNjLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX3RhcmdldF90eXBlKEFDUElfR0VUX09CSkVDVF9UWVBFCisJCQkJCQkgICAoZGVzdF9kZXNjKSwgc291cmNlX2Rlc2MsCisJCQkJCQkgICAmYWN0dWFsX3NyY19kZXNjLAorCQkJCQkJICAgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQlpZiAoc291cmNlX2Rlc2MgPT0gYWN0dWFsX3NyY19kZXNjKSB7CkBAIC0yNDAsNyArMjM5LDcgQEAKIAkJCSAqIG5ldyBvYmplY3QuCiAJCQkgKi8KIAkJCSpuZXdfZGVzYyA9IHNvdXJjZV9kZXNjOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQl9CiAJfQogCkBAIC0yNDgsNDIgKzI0Nyw0MiBAQAogCSAqIFdlIG5vdyBoYXZlIHR3byBvYmplY3RzIG9mIGlkZW50aWNhbCB0eXBlcywgYW5kIHdlIGNhbiBwZXJmb3JtIGEKIAkgKiBjb3B5IG9mIHRoZSAqdmFsdWUqIG9mIHRoZSBzb3VyY2Ugb2JqZWN0LgogCSAqLwotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGRlc3RfZGVzYykpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKGRlc3RfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCiAJCWRlc3RfZGVzYy0+aW50ZWdlci52YWx1ZSA9IGFjdHVhbF9zcmNfZGVzYy0+aW50ZWdlci52YWx1ZTsKIAogCQkvKiBUcnVuY2F0ZSB2YWx1ZSBpZiB3ZSBhcmUgZXhlY3V0aW5nIGZyb20gYSAzMi1iaXQgQUNQSSB0YWJsZSAqLwogCi0JCWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUgKGRlc3RfZGVzYyk7CisJCWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUoZGVzdF9kZXNjKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZV9zdHJpbmdfdG9fc3RyaW5nIChhY3R1YWxfc3JjX2Rlc2MsIGRlc3RfZGVzYyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3N0b3JlX3N0cmluZ190b19zdHJpbmcoYWN0dWFsX3NyY19kZXNjLCBkZXN0X2Rlc2MpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAotCQkvKgotCQkgKiBOb3RlOiBUaGVyZSBpcyBkaWZmZXJlbnQgc3RvcmUgYmVoYXZpb3IgZGVwZW5kaW5nIG9uIHRoZSBvcmlnaW5hbAotCQkgKiBzb3VyY2UgdHlwZQotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZV9idWZmZXJfdG9fYnVmZmVyIChhY3R1YWxfc3JjX2Rlc2MsIGRlc3RfZGVzYyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3N0b3JlX2J1ZmZlcl90b19idWZmZXIoYWN0dWFsX3NyY19kZXNjLCBkZXN0X2Rlc2MpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAKLQkJc3RhdHVzID0gYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCAoYWN0dWFsX3NyY19kZXNjLCAmZGVzdF9kZXNjLAotCQkJCSB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QoYWN0dWFsX3NyY19kZXNjLCAmZGVzdF9kZXNjLAorCQkJCQkJICAgIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCS8qCiAJCSAqIEFsbCBvdGhlciB0eXBlcyBjb21lIGhlcmUuCiAJCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9XQVJOLCAiU3RvcmUgaW50byB0eXBlICVzIG5vdCBpbXBsZW1lbnRlZFxuIiwKLQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKGRlc3RfZGVzYykpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCSAgIlN0b3JlIGludG8gdHlwZSAlcyBub3QgaW1wbGVtZW50ZWRcbiIsCisJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGRlc3RfZGVzYykpKTsKIAogCQlzdGF0dXMgPSBBRV9OT1RfSU1QTEVNRU5URUQ7CiAJCWJyZWFrOwpAQCAtMjkyLDExICsyOTEsOSBAQAogCWlmIChhY3R1YWxfc3JjX2Rlc2MgIT0gc291cmNlX2Rlc2MpIHsKIAkJLyogRGVsZXRlIHRoZSBpbnRlcm1lZGlhdGUgKHRlbXBvcmFyeSkgc291cmNlIG9iamVjdCAqLwogCi0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoYWN0dWFsX3NyY19kZXNjKTsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGFjdHVhbF9zcmNfZGVzYyk7CiAJfQogCiAJKm5ld19kZXNjID0gZGVzdF9kZXNjOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yb2IuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JvYi5jCmluZGV4IDEyZDE1MjcuLmM0ZmY2NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JvYi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JvYi5jCkBAIC00MiwxNCArNDIsMTEgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4c3Rvcm9iIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiZXhzdG9yb2IiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYzLDE4ICs2MCwxNCBAQAogICogREVTQ1JJUFRJT046IENvcHkgYSBidWZmZXIgb2JqZWN0IHRvIGFub3RoZXIgYnVmZmVyIG9iamVjdC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zdG9yZV9idWZmZXJfdG9fYnVmZmVyICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YXJnZXRfZGVzYykKK2FjcGlfZXhfc3RvcmVfYnVmZmVyX3RvX2J1ZmZlcih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXRfZGVzYykKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXI7CisJdTMyIGxlbmd0aDsKKwl1OCAqYnVmZmVyOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X3N0b3JlX2J1ZmZlcl90b19idWZmZXIiLCBzb3VyY2VfZGVzYyk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfc3RvcmVfYnVmZmVyX3RvX2J1ZmZlciIsIHNvdXJjZV9kZXNjKTsKIAogCS8qIFdlIGtub3cgdGhhdCBzb3VyY2VfZGVzYyBpcyBhIGJ1ZmZlciBieSBub3cgKi8KIApAQCAtODYsMTAgKzc5LDEwIEBACiAJICogYWxsb2NhdGUgYSBuZXcgYnVmZmVyIG9mIHRoZSBwcm9wZXIgbGVuZ3RoCiAJICovCiAJaWYgKCh0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCA9PSAwKSB8fAotCQkodGFyZ2V0X2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9TVEFUSUNfUE9JTlRFUikpIHsKLQkJdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyID0gQUNQSV9NRU1fQUxMT0NBVEUgKGxlbmd0aCk7CisJICAgICh0YXJnZXRfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkgeworCQl0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIgPSBBQ1BJX01FTV9BTExPQ0FURShsZW5ndGgpOwogCQlpZiAoIXRhcmdldF9kZXNjLT5idWZmZXIucG9pbnRlcikgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAogCQl0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCA9IGxlbmd0aDsKQEAgLTEwMCw4ICs5Myw5IEBACiAJaWYgKGxlbmd0aCA8PSB0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCkgewogCQkvKiBDbGVhciBleGlzdGluZyBidWZmZXIgYW5kIGNvcHkgaW4gdGhlIG5ldyBvbmUgKi8KIAotCQlBQ1BJX01FTVNFVCAodGFyZ2V0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyLCAwLCB0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCk7Ci0JCUFDUElfTUVNQ1BZICh0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKKwkJQUNQSV9NRU1TRVQodGFyZ2V0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyLCAwLAorCQkJICAgIHRhcmdldF9kZXNjLT5idWZmZXIubGVuZ3RoKTsKKwkJQUNQSV9NRU1DUFkodGFyZ2V0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyLCBidWZmZXIsIGxlbmd0aCk7CiAKICNpZmRlZiBBQ1BJX09CU09MRVRFX0JFSEFWSU9SCiAJCS8qCkBAIC0xMjQsMjYgKzExOCwyNCBAQAogCQkJdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGggPSBsZW5ndGg7CiAJCX0KICNlbmRpZgotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBUcnVuY2F0ZSB0aGUgc291cmNlLCBjb3B5IG9ubHkgd2hhdCB3aWxsIGZpdCAqLwogCi0JCUFDUElfTUVNQ1BZICh0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIGJ1ZmZlciwKLQkJCXRhcmdldF9kZXNjLT5idWZmZXIubGVuZ3RoKTsKKwkJQUNQSV9NRU1DUFkodGFyZ2V0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyLCBidWZmZXIsCisJCQkgICAgdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkiVHJ1bmNhdGluZyBzb3VyY2UgYnVmZmVyIGZyb20gJVggdG8gJVhcbiIsCi0JCQlsZW5ndGgsIHRhcmdldF9kZXNjLT5idWZmZXIubGVuZ3RoKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJUcnVuY2F0aW5nIHNvdXJjZSBidWZmZXIgZnJvbSAlWCB0byAlWFxuIiwKKwkJCQkgIGxlbmd0aCwgdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKTsKIAl9CiAKIAkvKiBDb3B5IGZsYWdzICovCiAKIAl0YXJnZXRfZGVzYy0+YnVmZmVyLmZsYWdzID0gc291cmNlX2Rlc2MtPmJ1ZmZlci5mbGFnczsKIAl0YXJnZXRfZGVzYy0+Y29tbW9uLmZsYWdzICY9IH5BT1BPQkpfU1RBVElDX1BPSU5URVI7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N0b3JlX3N0cmluZ190b19zdHJpbmcKQEAgLTE1OCwxNiArMTUwLDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zdG9yZV9zdHJpbmdfdG9fc3RyaW5nICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YXJnZXRfZGVzYykKK2FjcGlfZXhfc3RvcmVfc3RyaW5nX3RvX3N0cmluZyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXRfZGVzYykKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXI7CisJdTMyIGxlbmd0aDsKKwl1OCAqYnVmZmVyOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X3N0b3JlX3N0cmluZ190b19zdHJpbmciLCBzb3VyY2VfZGVzYyk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfc3RvcmVfc3RyaW5nX3RvX3N0cmluZyIsIHNvdXJjZV9kZXNjKTsKIAogCS8qIFdlIGtub3cgdGhhdCBzb3VyY2VfZGVzYyBpcyBhIHN0cmluZyBieSBub3cgKi8KIApAQCAtMTc5LDQxICsxNjgsMzggQEAKIAkgKiBwb2ludGVyIGlzIG5vdCBhIHN0YXRpYyBwb2ludGVyIChwYXJ0IG9mIGFuIEFDUEkgdGFibGUpCiAJICovCiAJaWYgKChsZW5ndGggPCB0YXJnZXRfZGVzYy0+c3RyaW5nLmxlbmd0aCkgJiYKLQkgICAoISh0YXJnZXRfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkpIHsKKwkgICAgKCEodGFyZ2V0X2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9TVEFUSUNfUE9JTlRFUikpKSB7CiAJCS8qCiAJCSAqIFN0cmluZyB3aWxsIGZpdCBpbiBleGlzdGluZyBub24tc3RhdGljIGJ1ZmZlci4KIAkJICogQ2xlYXIgb2xkIHN0cmluZyBhbmQgY29weSBpbiB0aGUgbmV3IG9uZQogCQkgKi8KLQkJQUNQSV9NRU1TRVQgKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciwgMCwKLQkJCShhY3BpX3NpemUpIHRhcmdldF9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7Ci0JCUFDUElfTUVNQ1BZICh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKLQl9Ci0JZWxzZSB7CisJCUFDUElfTUVNU0VUKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciwgMCwKKwkJCSAgICAoYWNwaV9zaXplKSB0YXJnZXRfZGVzYy0+c3RyaW5nLmxlbmd0aCArIDEpOworCQlBQ1BJX01FTUNQWSh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBGcmVlIHRoZSBjdXJyZW50IGJ1ZmZlciwgdGhlbiBhbGxvY2F0ZSBhIG5ldyBidWZmZXIKIAkJICogbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHZhbHVlCiAJCSAqLwogCQlpZiAodGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyICYmCi0JCSAgICghKHRhcmdldF9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfU1RBVElDX1BPSU5URVIpKSkgeworCQkgICAgKCEodGFyZ2V0X2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9TVEFUSUNfUE9JTlRFUikpKSB7CiAJCQkvKiBPbmx5IGZyZWUgaWYgbm90IGEgcG9pbnRlciBpbnRvIHRoZSBEU0RUICovCiAKLQkJCUFDUElfTUVNX0ZSRUUgKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlcik7CisJCQlBQ1BJX01FTV9GUkVFKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlcik7CiAJCX0KIAotCQl0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKAotCQkJCSAgIChhY3BpX3NpemUpIGxlbmd0aCArIDEpOworCQl0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUoKGFjcGlfc2l6ZSkKKwkJCQkJCQkJIGxlbmd0aCArIDEpOwogCQlpZiAoIXRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlcikgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAogCQl0YXJnZXRfZGVzYy0+Y29tbW9uLmZsYWdzICY9IH5BT1BPQkpfU1RBVElDX1BPSU5URVI7Ci0JCUFDUElfTUVNQ1BZICh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKKwkJQUNQSV9NRU1DUFkodGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyLCBidWZmZXIsIGxlbmd0aCk7CiAJfQogCiAJLyogU2V0IHRoZSBuZXcgdGFyZ2V0IGxlbmd0aCAqLwogCiAJdGFyZ2V0X2Rlc2MtPnN0cmluZy5sZW5ndGggPSBsZW5ndGg7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCmluZGV4IGNhZmE3MDIuLjhhODhiODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCkBAIC00MiwxNCArNDIsMTIgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhzeXN0ZW0iKQotCitBQ1BJX01PRFVMRV9OQU1FKCJleHN5c3RlbSIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjUsNDkgKzYzLDQyIEBACiAgKiAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIgaXMgcmVsZWFzZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZSwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpCithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV93YWl0X3NlbWFwaG9yZShhY3BpX2hhbmRsZSBzZW1hcGhvcmUsIHUxNiB0aW1lb3V0KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzMjsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3N5c3RlbV93YWl0X3NlbWFwaG9yZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X3N5c3RlbV93YWl0X3NlbWFwaG9yZSIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX29zX3dhaXRfc2VtYXBob3JlIChzZW1hcGhvcmUsIDEsIDApOwotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfb3Nfd2FpdF9zZW1hcGhvcmUoc2VtYXBob3JlLCAxLCAwKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJaWYgKHN0YXR1cyA9PSBBRV9USU1FKSB7CiAJCS8qIFdlIG11c3Qgd2FpdCwgc28gdW5sb2NrIHRoZSBpbnRlcnByZXRlciAqLwogCi0JCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlciAoKTsKKwkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAKLQkJc3RhdHVzID0gYWNwaV9vc193YWl0X3NlbWFwaG9yZSAoc2VtYXBob3JlLCAxLCB0aW1lb3V0KTsKKwkJc3RhdHVzID0gYWNwaV9vc193YWl0X3NlbWFwaG9yZShzZW1hcGhvcmUsIDEsIHRpbWVvdXQpOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkiKioqIFRocmVhZCBhd2FrZSBhZnRlciBibG9ja2luZywgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIioqKiBUaHJlYWQgYXdha2UgYWZ0ZXIgYmxvY2tpbmcsICVzXG4iLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAogCQkvKiBSZWFjcXVpcmUgdGhlIGludGVycHJldGVyICovCiAKLQkJc3RhdHVzMiA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIgKCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1czIpKSB7CisJCXN0YXR1czIgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKIAkJCS8qIFJlcG9ydCBmYXRhbCBlcnJvciwgY291bGQgbm90IGFjcXVpcmUgaW50ZXJwcmV0ZXIgKi8KIAotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMyKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKIAkJfQogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV9kb19zdGFsbApAQCAtMTI1LDM1ICsxMTYsMjkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fZG9fc3RhbGwgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG93X2xvbmcpCithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9kb19zdGFsbCh1MzIgaG93X2xvbmcpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCWlmIChob3dfbG9uZyA+IDI1NSkgLyogMjU1IG1pY3Jvc2Vjb25kcyAqLyB7CisJaWYgKGhvd19sb25nID4gMjU1KSB7CS8qIDI1NSBtaWNyb3NlY29uZHMgKi8KIAkJLyoKIAkJICogTG9uZ2VyIHRoYW4gMjU1IHVzZWMsIHRoaXMgaXMgYW4gZXJyb3IKIAkJICoKIAkJICogKEFDUEkgc3BlY2lmaWVzIDEwMCB1c2VjIGFzIG1heCwgYnV0IHRoaXMgZ2l2ZXMgc29tZSBzbGFjayBpbgogCQkgKiBvcmRlciB0byBzdXBwb3J0IGV4aXN0aW5nIEJJT1NzKQogCQkgKi8KLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiU3RhbGw6IFRpbWUgcGFyYW1ldGVyIGlzIHRvbyBsYXJnZSAoJWQpXG4iLAotCQkJaG93X2xvbmcpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJTdGFsbDogVGltZSBwYXJhbWV0ZXIgaXMgdG9vIGxhcmdlICglZClcbiIsCisJCQkJICAgaG93X2xvbmcpKTsKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVkFMVUU7Ci0JfQotCWVsc2UgewotCQlhY3BpX29zX3N0YWxsIChob3dfbG9uZyk7CisJfSBlbHNlIHsKKwkJYWNwaV9vc19zdGFsbChob3dfbG9uZyk7CiAJfQogCiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX2RvX3N1c3BlbmQKQEAgLTE2NywyOSArMTUyLDI0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3lzdGVtX2RvX3N1c3BlbmQgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaG93X2xvbmcpCithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9kb19zdXNwZW5kKGFjcGlfaW50ZWdlciBob3dfbG9uZykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKiBTaW5jZSB0aGlzIHRocmVhZCB3aWxsIHNsZWVwLCB3ZSBtdXN0IHJlbGVhc2UgdGhlIGludGVycHJldGVyICovCiAKLQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIgKCk7CisJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAKLQlhY3BpX29zX3NsZWVwIChob3dfbG9uZyk7CisJYWNwaV9vc19zbGVlcChob3dfbG9uZyk7CiAKIAkvKiBBbmQgbm93IHdlIG11c3QgZ2V0IHRoZSBpbnRlcnByZXRlciBhZ2FpbiAqLwogCi0Jc3RhdHVzID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlciAoKTsKKwlzdGF0dXMgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX2FjcXVpcmVfbXV0ZXgKQEAgLTIwNiwzMyArMTg2LDMwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fYWNxdWlyZV9tdXRleCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGltZV9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKQorYWNwaV9leF9zeXN0ZW1fYWNxdWlyZV9tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogdGltZV9kZXNjLAorCQkJICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogb2JqX2Rlc2MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9zeXN0ZW1fYWNxdWlyZV9tdXRleCIsIG9ial9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9zeXN0ZW1fYWNxdWlyZV9tdXRleCIsIG9ial9kZXNjKTsKIAogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIFN1cHBvcnQgZm9yIHRoZSBfR0xfIE11dGV4IG9iamVjdCAtLSBnbyBnZXQgdGhlIGdsb2JhbCBsb2NrICovCiAKIAlpZiAob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSA9PSBhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUpIHsKLQkJc3RhdHVzID0gYWNwaV9ldl9hY3F1aXJlX2dsb2JhbF9sb2NrICgodTE2KSB0aW1lX2Rlc2MtPmludGVnZXIudmFsdWUpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2soKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUgKG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUsCi0JCQkgKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSwKKwkJCQkJICAgICAgICh1MTYpIHRpbWVfZGVzYy0+aW50ZWdlci52YWx1ZSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fcmVsZWFzZV9tdXRleApAQCAtMjQ4LDMyICsyMjUsMjcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fcmVsZWFzZV9tdXRleCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpCithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9yZWxlYXNlX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9zeXN0ZW1fcmVsZWFzZV9tdXRleCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgiKTsKIAogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIFN1cHBvcnQgZm9yIHRoZSBfR0xfIE11dGV4IG9iamVjdCAtLSByZWxlYXNlIHRoZSBnbG9iYWwgbG9jayAqLwogCiAJaWYgKG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUgPT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jayAoKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2soKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9vc19zaWduYWxfc2VtYXBob3JlIChvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlLCAxKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9vc19zaWduYWxfc2VtYXBob3JlKG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUsIDEpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX3NpZ25hbF9ldmVudApAQCAtMjg3LDI0ICsyNTksMTkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fc2lnbmFsX2V2ZW50ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYykKK2FjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX3NpZ25hbF9ldmVudCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfc3lzdGVtX3NpZ25hbF9ldmVudCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfc3lzdGVtX3NpZ25hbF9ldmVudCIpOwogCiAJaWYgKG9ial9kZXNjKSB7Ci0JCXN0YXR1cyA9IGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZSAob2JqX2Rlc2MtPmV2ZW50LnNlbWFwaG9yZSwgMSk7CisJCXN0YXR1cyA9IGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZShvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlLCAxKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fd2FpdF9ldmVudApAQCAtMzIxLDI1ICsyODgsMjMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV93YWl0X2V2ZW50ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0aW1lX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpCithY3BpX2V4X3N5c3RlbV93YWl0X2V2ZW50KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRpbWVfZGVzYywKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X3N5c3RlbV93YWl0X2V2ZW50Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9zeXN0ZW1fd2FpdF9ldmVudCIpOwogCiAJaWYgKG9ial9kZXNjKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlIChvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlLAotCQkJCSAodTE2KSB0aW1lX2Rlc2MtPmludGVnZXIudmFsdWUpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUob2JqX2Rlc2MtPmV2ZW50LnNlbWFwaG9yZSwKKwkJCQkJCSAgKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLgorCQkJCQkJICB2YWx1ZSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX3Jlc2V0X2V2ZW50CkBAIC0zNTIsMjcgKzMxNywyMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV9yZXNldF9ldmVudCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpCithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9yZXNldF9ldmVudCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfc2VtYXBob3JlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXZvaWQgKnRlbXBfc2VtYXBob3JlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyoKIAkgKiBXZSBhcmUgZ29pbmcgdG8gc2ltcGx5IGRlbGV0ZSB0aGUgZXhpc3Rpbmcgc2VtYXBob3JlIGFuZAogCSAqIGNyZWF0ZSBhIG5ldyBvbmUhCiAJICovCi0Jc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlIChBQ1BJX05PX1VOSVRfTElNSVQsIDAsICZ0ZW1wX3NlbWFwaG9yZSk7Ci0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQkodm9pZCkgYWNwaV9vc19kZWxldGVfc2VtYXBob3JlIChvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUoQUNQSV9OT19VTklUX0xJTUlULCAwLCAmdGVtcF9zZW1hcGhvcmUpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkodm9pZClhY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUob2JqX2Rlc2MtPmV2ZW50LnNlbWFwaG9yZSk7CiAJCW9ial9kZXNjLT5ldmVudC5zZW1hcGhvcmUgPSB0ZW1wX3NlbWFwaG9yZTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXh1dGlscy5jCmluZGV4IDVjN2VjMGMuLjFlZTc5ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4dXRpbHMuYwpAQCAtNDIsNyArNDIsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogLyoKICAqIERFRklORV9BTUxfR0xPQkFMUyBpcyB0ZXN0ZWQgaW4gYW1sY29kZS5oCiAgKiB0byBkZXRlcm1pbmUgd2hldGhlciBjZXJ0YWluIGdsb2JhbCBuYW1lcyBzaG91bGQgYmUgImRlZmluZWQiIG9yIG9ubHkKQEAgLTY1LDE1ICs2NCwxMCBAQAogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4dXRpbHMiKQorQUNQSV9NT0RVTEVfTkFNRSgiZXh1dGlscyIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIHUzMgotYWNwaV9leF9kaWdpdHNfbmVlZGVkICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSk7Ci0KK3N0YXRpYyB1MzIgYWNwaV9leF9kaWdpdHNfbmVlZGVkKGFjcGlfaW50ZWdlciB2YWx1ZSwgdTMyIGJhc2UpOwogCiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTg5LDI0ICs4MywyMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcih2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9lbnRlcl9pbnRlcnByZXRlciIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2VudGVyX2ludGVycHJldGVyIik7CiAKLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfRVhFQ1VURSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgYWNxdWlyZSBpbnRlcnByZXRlciBtdXRleFxuIikpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FWEVDVVRFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgYWNxdWlyZSBpbnRlcnByZXRlciBtdXRleFxuIikpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIKQEAgLTEyOSwyNSArMTE5LDIwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9leF9leGl0X2ludGVycHJldGVyICgKLQl2b2lkKQordm9pZCBhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIodm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9leGl0X2ludGVycHJldGVyIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfZXhpdF9pbnRlcnByZXRlciIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VYRUNVVEUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IHJlbGVhc2UgaW50ZXJwcmV0ZXIgbXV0ZXhcbiIpKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVhFQ1VURSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IHJlbGVhc2UgaW50ZXJwcmV0ZXIgbXV0ZXhcbiIpKTsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlCkBAIC0xNjEsMjAgKzE0NiwxNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKQordm9pZCBhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQogewogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qCiAJICogT2JqZWN0IG11c3QgYmUgYSB2YWxpZCBudW1iZXIgYW5kIHdlIG11c3QgYmUgZXhlY3V0aW5nCiAJICogYSBjb250cm9sIG1ldGhvZAogCSAqLwogCWlmICgoIW9ial9kZXNjKSB8fAotCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikpIHsKKwkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikpIHsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTg3LDcgKzE2OSw2IEBACiAJfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jawpAQCAtMjAzLDM3ICsxODQsMzEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11OAotYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2ZsYWdzKQordTggYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrKHUzMiBmaWVsZF9mbGFncykKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tlZCA9IEZBTFNFOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXU4IGxvY2tlZCA9IEZBTFNFOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2FjcXVpcmVfZ2xvYmFsX2xvY2siKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2FjcXVpcmVfZ2xvYmFsX2xvY2siKTsKIAogCS8qIE9ubHkgYXR0ZW1wdCBsb2NrIGlmIHRoZSBhbHdheXNfbG9jayBiaXQgaXMgc2V0ICovCiAKIAlpZiAoZmllbGRfZmxhZ3MgJiBBTUxfRklFTERfTE9DS19SVUxFX01BU0spIHsKIAkJLyogV2Ugc2hvdWxkIGF0dGVtcHQgdG8gZ2V0IHRoZSBsb2NrLCB3YWl0IGZvcmV2ZXIgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2sgKEFDUElfV0FJVF9GT1JFVkVSKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2soQUNQSV9XQUlUX0ZPUkVWRVIpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCWxvY2tlZCA9IFRSVUU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiQ291bGQgbm90IGFjcXVpcmUgR2xvYmFsIExvY2ssICVzXG4iLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQl9IGVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiQ291bGQgbm90IGFjcXVpcmUgR2xvYmFsIExvY2ssICVzXG4iLAorCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJCX0KIAl9CiAKLQlyZXR1cm5fVkFMVUUgKGxvY2tlZCk7CisJcmV0dXJuX1ZBTFVFKGxvY2tlZCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrCkBAIC0yNDcsMzQgKzIyMiwyOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrZWRfYnlfbWUpCit2b2lkIGFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayh1OCBsb2NrZWRfYnlfbWUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfcmVsZWFzZV9nbG9iYWxfbG9jayIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfcmVsZWFzZV9nbG9iYWxfbG9jayIpOwogCiAJLyogT25seSBhdHRlbXB0IHVubG9jayBpZiB0aGUgY2FsbGVyIGxvY2tlZCBpdCAqLwogCiAJaWYgKGxvY2tlZF9ieV9tZSkgewogCQkvKiBPSywgbm93IHJlbGVhc2UgdGhlIGxvY2sgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2sgKCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV9ldl9yZWxlYXNlX2dsb2JhbF9sb2NrKCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJLyogUmVwb3J0IHRoZSBlcnJvciwgYnV0IHRoZXJlIGlzbid0IG11Y2ggZWxzZSB3ZSBjYW4gZG8gKi8KIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IHJlbGVhc2UgQUNQSSBHbG9iYWwgTG9jaywgJXNcbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCByZWxlYXNlIEFDUEkgR2xvYmFsIExvY2ssICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQl9CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kaWdpdHNfbmVlZGVkCkBAIC0yODksMjIgKzI1OCwxNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB1MzIKLWFjcGlfZXhfZGlnaXRzX25lZWRlZCAoCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UpCitzdGF0aWMgdTMyIGFjcGlfZXhfZGlnaXRzX25lZWRlZChhY3BpX2ludGVnZXIgdmFsdWUsIHUzMiBiYXNlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2RpZ2l0czsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdmFsdWU7CisJdTMyIG51bV9kaWdpdHM7CisJYWNwaV9pbnRlZ2VyIGN1cnJlbnRfdmFsdWU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9kaWdpdHNfbmVlZGVkIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9kaWdpdHNfbmVlZGVkIik7CiAKIAkvKiBhY3BpX2ludGVnZXIgaXMgdW5zaWduZWQsIHNvIHdlIGRvbid0IHdvcnJ5IGFib3V0IGEgJy0nIHByZWZpeCAqLwogCiAJaWYgKHZhbHVlID09IDApIHsKLQkJcmV0dXJuX1ZBTFVFICgxKTsKKwkJcmV0dXJuX1ZBTFVFKDEpOwogCX0KIAogCWN1cnJlbnRfdmFsdWUgPSB2YWx1ZTsKQEAgLTMxMywxNCArMjc3LDE0IEBACiAJLyogQ291bnQgdGhlIGRpZ2l0cyBpbiB0aGUgcmVxdWVzdGVkIGJhc2UgKi8KIAogCXdoaWxlIChjdXJyZW50X3ZhbHVlKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X3Nob3J0X2RpdmlkZSAoY3VycmVudF92YWx1ZSwgYmFzZSwgJmN1cnJlbnRfdmFsdWUsIE5VTEwpOworCQkodm9pZClhY3BpX3V0X3Nob3J0X2RpdmlkZShjdXJyZW50X3ZhbHVlLCBiYXNlLCAmY3VycmVudF92YWx1ZSwKKwkJCQkJICAgTlVMTCk7CiAJCW51bV9kaWdpdHMrKzsKIAl9CiAKLQlyZXR1cm5fVkFMVUUgKG51bV9kaWdpdHMpOworCXJldHVybl9WQUxVRShudW1fZGlnaXRzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2Vpc2FfaWRfdG9fc3RyaW5nCkBAIC0zMzQsMzIgKzI5OCwyNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY19pZCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfc3RyaW5nKQordm9pZCBhY3BpX2V4X2Vpc2FfaWRfdG9fc3RyaW5nKHUzMiBudW1lcmljX2lkLCBjaGFyICpvdXRfc3RyaW5nKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWlzYV9pZDsKKwl1MzIgZWlzYV9pZDsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qIFN3YXAgSUQgdG8gYmlnLWVuZGlhbiB0byBnZXQgY29udGlndW91cyBiaXRzICovCiAKLQllaXNhX2lkID0gYWNwaV91dF9kd29yZF9ieXRlX3N3YXAgKG51bWVyaWNfaWQpOworCWVpc2FfaWQgPSBhY3BpX3V0X2R3b3JkX2J5dGVfc3dhcChudW1lcmljX2lkKTsKIAotCW91dF9zdHJpbmdbMF0gPSAoY2hhcikgKCdAJyArICgoKHVuc2lnbmVkIGxvbmcpIGVpc2FfaWQgPj4gMjYpICYgMHgxZikpOwotCW91dF9zdHJpbmdbMV0gPSAoY2hhcikgKCdAJyArICgoZWlzYV9pZCA+PiAyMSkgJiAweDFmKSk7Ci0Jb3V0X3N0cmluZ1syXSA9IChjaGFyKSAoJ0AnICsgKChlaXNhX2lkID4+IDE2KSAmIDB4MWYpKTsKLQlvdXRfc3RyaW5nWzNdID0gYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhciAoKGFjcGlfaW50ZWdlcikgZWlzYV9pZCwgMTIpOwotCW91dF9zdHJpbmdbNF0gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyICgoYWNwaV9pbnRlZ2VyKSBlaXNhX2lkLCA4KTsKLQlvdXRfc3RyaW5nWzVdID0gYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhciAoKGFjcGlfaW50ZWdlcikgZWlzYV9pZCwgNCk7Ci0Jb3V0X3N0cmluZ1s2XSA9IGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIgKChhY3BpX2ludGVnZXIpIGVpc2FfaWQsIDApOworCW91dF9zdHJpbmdbMF0gPSAoY2hhcikoJ0AnICsgKCgodW5zaWduZWQgbG9uZyllaXNhX2lkID4+IDI2KSAmIDB4MWYpKTsKKwlvdXRfc3RyaW5nWzFdID0gKGNoYXIpKCdAJyArICgoZWlzYV9pZCA+PiAyMSkgJiAweDFmKSk7CisJb3V0X3N0cmluZ1syXSA9IChjaGFyKSgnQCcgKyAoKGVpc2FfaWQgPj4gMTYpICYgMHgxZikpOworCW91dF9zdHJpbmdbM10gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKChhY3BpX2ludGVnZXIpIGVpc2FfaWQsIDEyKTsKKwlvdXRfc3RyaW5nWzRdID0gYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhcigoYWNwaV9pbnRlZ2VyKSBlaXNhX2lkLCA4KTsKKwlvdXRfc3RyaW5nWzVdID0gYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhcigoYWNwaV9pbnRlZ2VyKSBlaXNhX2lkLCA0KTsKKwlvdXRfc3RyaW5nWzZdID0gYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhcigoYWNwaV9pbnRlZ2VyKSBlaXNhX2lkLCAwKTsKIAlvdXRfc3RyaW5nWzddID0gMDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3Vuc2lnbmVkX2ludGVnZXJfdG9fc3RyaW5nCkBAIC0zNjksMzAgKzMyNywyNSBAQAogICoKICAqIFJFVFVSTjogICAgICBOb25lLCBzdHJpbmcKICAqCi0gKiBERVNDUklQVE9JTjogQ29udmVydCBhIG51bWJlciB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24uIEFzc3VtZXMgc3RyaW5nCisgKiBERVNDUklQVElPTjogQ29udmVydCBhIG51bWJlciB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24uIEFzc3VtZXMgc3RyaW5nCiAgKiAgICAgICAgICAgICAgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBzdHJpbmcuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9leF91bnNpZ25lZF9pbnRlZ2VyX3RvX3N0cmluZyAoCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfc3RyaW5nKQordm9pZCBhY3BpX2V4X3Vuc2lnbmVkX2ludGVnZXJfdG9fc3RyaW5nKGFjcGlfaW50ZWdlciB2YWx1ZSwgY2hhciAqb3V0X3N0cmluZykKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzX25lZWRlZDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcjsKKwl1MzIgY291bnQ7CisJdTMyIGRpZ2l0c19uZWVkZWQ7CisJdTMyIHJlbWFpbmRlcjsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCWRpZ2l0c19uZWVkZWQgPSBhY3BpX2V4X2RpZ2l0c19uZWVkZWQgKHZhbHVlLCAxMCk7CisJZGlnaXRzX25lZWRlZCA9IGFjcGlfZXhfZGlnaXRzX25lZWRlZCh2YWx1ZSwgMTApOwogCW91dF9zdHJpbmdbZGlnaXRzX25lZWRlZF0gPSAwOwogCiAJZm9yIChjb3VudCA9IGRpZ2l0c19uZWVkZWQ7IGNvdW50ID4gMDsgY291bnQtLSkgewotCQkodm9pZCkgYWNwaV91dF9zaG9ydF9kaXZpZGUgKHZhbHVlLCAxMCwgJnZhbHVlLCAmcmVtYWluZGVyKTsKLQkJb3V0X3N0cmluZ1tjb3VudC0xXSA9IChjaGFyKSAoJzAnICsgcmVtYWluZGVyKTtcCisJCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKHZhbHVlLCAxMCwgJnZhbHVlLCAmcmVtYWluZGVyKTsKKwkJb3V0X3N0cmluZ1tjb3VudCAtIDFdID0gKGNoYXIpKCcwJyArIHJlbWFpbmRlcik7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZmFuLmMgYi9kcml2ZXJzL2FjcGkvZmFuLmMKaW5kZXggMTQxOTJlZS4uZTgxNjVjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Zhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9mYW4uYwpAQCAtMzQsNTIgKzM0LDQ1IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKLQogI2RlZmluZSBBQ1BJX0ZBTl9DT01QT05FTlQJCTB4MDAyMDAwMDAKICNkZWZpbmUgQUNQSV9GQU5fQ0xBU1MJCQkiZmFuIgotI2RlZmluZSBBQ1BJX0ZBTl9ISUQJCQkiUE5QMEMwQiIKICNkZWZpbmUgQUNQSV9GQU5fRFJJVkVSX05BTUUJCSJBQ1BJIEZhbiBEcml2ZXIiCi0jZGVmaW5lIEFDUElfRkFOX0RFVklDRV9OQU1FCQkiRmFuIgogI2RlZmluZSBBQ1BJX0ZBTl9GSUxFX1NUQVRFCQkic3RhdGUiCi0jZGVmaW5lIEFDUElfRkFOX05PVElGWV9TVEFUVVMJCTB4ODAKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0ZBTl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgiYWNwaV9mYW4iKQorQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9mYW4iKQogCi1NT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7CisgICAgTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfRkFOX0RSSVZFUl9OQU1FKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIGludCBhY3BpX2Zhbl9hZGQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV9mYW5fcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX2Zhbl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX2Zhbl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2Zhbl9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJQUNQSV9GQU5fRFJJVkVSX05BTUUsCi0JLmNsYXNzID0JQUNQSV9GQU5fQ0xBU1MsCi0JLmlkcyA9CQlBQ1BJX0ZBTl9ISUQsCi0JLm9wcyA9CQl7Ci0JCQkJLmFkZCA9CQlhY3BpX2Zhbl9hZGQsCi0JCQkJLnJlbW92ZSA9CWFjcGlfZmFuX3JlbW92ZSwKLQkJCX0sCisJLm5hbWUgPSBBQ1BJX0ZBTl9EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX0ZBTl9DTEFTUywKKwkuaWRzID0gIlBOUDBDMEIiLAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX2Zhbl9hZGQsCisJCS5yZW1vdmUgPSBhY3BpX2Zhbl9yZW1vdmUsCisJCX0sCiB9OwogCiBzdHJ1Y3QgYWNwaV9mYW4gewotCWFjcGlfaGFuZGxlCQloYW5kbGU7CisJYWNwaV9oYW5kbGUgaGFuZGxlOwogfTsKIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmFjcGlfZmFuX2RpcjsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfZmFuX2RpcjsKIAotCi1zdGF0aWMgaW50Ci1hY3BpX2Zhbl9yZWFkX3N0YXRlIChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQorc3RhdGljIGludCBhY3BpX2Zhbl9yZWFkX3N0YXRlKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfZmFuCQkqZmFuID0gc2VxLT5wcml2YXRlOwotCWludAkJCXN0YXRlID0gMDsKKwlzdHJ1Y3QgYWNwaV9mYW4gKmZhbiA9IHNlcS0+cHJpdmF0ZTsKKwlpbnQgc3RhdGUgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9mYW5fcmVhZF9zdGF0ZSIpOwogCkBAIC04OCw3ICs4MSw3IEBACiAJCQlzZXFfcHJpbnRmKHNlcSwgInN0YXR1czogICAgICAgICAgICAgICAgICBFUlJPUlxuIik7CiAJCWVsc2UKIAkJCXNlcV9wcmludGYoc2VxLCAic3RhdHVzOiAgICAgICAgICAgICAgICAgICVzXG4iLAotCQkJCSAgICAgIXN0YXRlPyJvbiI6Im9mZiIpOworCQkJCSAgICFzdGF0ZSA/ICJvbiIgOiAib2ZmIik7CiAJfQogCXJldHVybl9WQUxVRSgwKTsKIH0KQEAgLTk5LDI5ICs5MiwyNiBAQAogfQogCiBzdGF0aWMgc3NpemVfdAotYWNwaV9mYW5fd3JpdGVfc3RhdGUgKAotCXN0cnVjdCBmaWxlCQkqZmlsZSwKLQljb25zdCBjaGFyCQlfX3VzZXIgKmJ1ZmZlciwKLQlzaXplX3QJCQljb3VudCwKLQlsb2ZmX3QJCQkqcHBvcykKK2FjcGlfZmFuX3dyaXRlX3N0YXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYWNwaV9mYW4JCSpmYW4gPSAoc3RydWN0IGFjcGlfZmFuICopIG0tPnByaXZhdGU7Ci0JY2hhcgkJCXN0YXRlX3N0cmluZ1sxMl0gPSB7J1wwJ307CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV9mYW4gKmZhbiA9IChzdHJ1Y3QgYWNwaV9mYW4gKiltLT5wcml2YXRlOworCWNoYXIgc3RhdGVfc3RyaW5nWzEyXSA9IHsgJ1wwJyB9OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9mYW5fd3JpdGVfc3RhdGUiKTsKIAogCWlmICghZmFuIHx8IChjb3VudCA+IHNpemVvZihzdGF0ZV9zdHJpbmcpIC0gMSkpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKLQkKKwogCWlmIChjb3B5X2Zyb21fdXNlcihzdGF0ZV9zdHJpbmcsIGJ1ZmZlciwgY291bnQpKQogCQlyZXR1cm5fVkFMVUUoLUVGQVVMVCk7Ci0JCisKIAlzdGF0ZV9zdHJpbmdbY291bnRdID0gJ1wwJzsKLQkKLQlyZXN1bHQgPSBhY3BpX2J1c19zZXRfcG93ZXIoZmFuLT5oYW5kbGUsIAotCQlzaW1wbGVfc3RydG91bChzdGF0ZV9zdHJpbmcsIE5VTEwsIDApKTsKKworCXJlc3VsdCA9IGFjcGlfYnVzX3NldF9wb3dlcihmYW4tPmhhbmRsZSwKKwkJCQkgICAgc2ltcGxlX3N0cnRvdWwoc3RhdGVfc3RyaW5nLCBOVUxMLCAwKSk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiAKQEAgLTEyOSwxOSArMTE5LDE3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfZmFuX3N0YXRlX29wcyA9IHsKLQkub3BlbgkJPSBhY3BpX2Zhbl9zdGF0ZV9vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS53cml0ZQkJPSBhY3BpX2Zhbl93cml0ZV9zdGF0ZSwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV9mYW5fc3RhdGVfb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS53cml0ZSA9IGFjcGlfZmFuX3dyaXRlX3N0YXRlLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBpbnQKLWFjcGlfZmFuX2FkZF9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfZmFuX2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZmFuX2FkZF9mcyIpOwogCkBAIC0xNTAsNyArMTM4LDcgQEAKIAogCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJYWNwaV9mYW5fZGlyKTsKKwkJCQkJCSAgICAgYWNwaV9mYW5fZGlyKTsKIAkJaWYgKCFhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSktPm93bmVyID0gVEhJU19NT0RVTEU7CkBAIC0xNTgsMTEgKzE0NiwxMiBAQAogCiAJLyogJ3N0YXR1cycgW1IvV10gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfRkFOX0ZJTEVfU1RBVEUsCi0JCVNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQkJICBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkJICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJaWYgKCFlbnRyeSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCi0JCQlBQ1BJX0ZBTl9GSUxFX1NUQVRFKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9GQU5fRklMRV9TVEFURSkpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfZmFuX3N0YXRlX29wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC0xNzIsMTYgKzE2MSwxMiBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2Zhbl9yZW1vdmVfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2Zhbl9yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9mYW5fcmVtb3ZlX2ZzIik7CiAKIAlpZiAoYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9GQU5fRklMRV9TVEFURSwKLQkJCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9GQU5fRklMRV9TVEFURSwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCQlyZW1vdmVfcHJvY19lbnRyeShhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwgYWNwaV9mYW5fZGlyKTsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBOVUxMOwogCX0KQEAgLTE4OSwxOCArMTc0LDE1IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50Ci1hY3BpX2Zhbl9hZGQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2Zhbl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9mYW4JCSpmYW4gPSBOVUxMOwotCWludAkJCXN0YXRlID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9mYW4gKmZhbiA9IE5VTEw7CisJaW50IHN0YXRlID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZmFuX2FkZCIpOwogCkBAIC0yMTMsMTQgKzE5NSwxNCBAQAogCW1lbXNldChmYW4sIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9mYW4pKTsKIAogCWZhbi0+aGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7Ci0Jc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9GQU5fREVWSUNFX05BTUUpOworCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksICJGYW4iKTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgQUNQSV9GQU5fQ0xBU1MpOwogCWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSA9IGZhbjsKIAogCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9wb3dlcihmYW4tPmhhbmRsZSwgJnN0YXRlKTsKIAlpZiAocmVzdWx0KSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgcmVhZGluZyBwb3dlciBzdGF0ZVxuIikpOworCQkJCSAgIkVycm9yIHJlYWRpbmcgcG93ZXIgc3RhdGVcbiIpKTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC0yMjksMzAgKzIxMSwyNiBAQAogCQlnb3RvIGVuZDsKIAogCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdICglcylcbiIsCi0JCWFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JCSFkZXZpY2UtPnBvd2VyLnN0YXRlPyJvbiI6Im9mZiIpOworCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAorCSAgICAgICAhZGV2aWNlLT5wb3dlci5zdGF0ZSA/ICJvbiIgOiAib2ZmIik7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAocmVzdWx0KQogCQlrZnJlZShmYW4pOwogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9mYW5fcmVtb3ZlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlpbnQJCQl0eXBlKQorc3RhdGljIGludCBhY3BpX2Zhbl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewotCXN0cnVjdCBhY3BpX2ZhbgkJKmZhbiA9IE5VTEw7CisJc3RydWN0IGFjcGlfZmFuICpmYW4gPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9mYW5fcmVtb3ZlIik7CiAKIAlpZiAoIWRldmljZSB8fCAhYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlmYW4gPSAoc3RydWN0IGFjcGlfZmFuICopIGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKwlmYW4gPSAoc3RydWN0IGFjcGlfZmFuICopYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCiAJYWNwaV9mYW5fcmVtb3ZlX2ZzKGRldmljZSk7CiAKQEAgLTI2MSwxMSArMjM5LDkgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQKLWFjcGlfZmFuX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2Zhbl9pbml0KHZvaWQpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZmFuX2luaXQiKTsKIApAQCAtMjgzLDkgKzI1OSw3IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyB2b2lkIF9fZXhpdAotYWNwaV9mYW5fZXhpdCAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX2Zhbl9leGl0KHZvaWQpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9mYW5fZXhpdCIpOwogCkBAIC0yOTYsNyArMjcwLDUgQEAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiBtb2R1bGVfaW5pdChhY3BpX2Zhbl9pbml0KTsKIG1vZHVsZV9leGl0KGFjcGlfZmFuX2V4aXQpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZ2x1ZS5jIGIvZHJpdmVycy9hY3BpL2dsdWUuYwppbmRleCA3NzBjZmM4Li5lMzZjNWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZ2x1ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9nbHVlLmMKQEAgLTI5LDcgKzI5LDggQEAKIAkJZG93bl93cml0ZSgmYnVzX3R5cGVfc2VtKTsKIAkJbGlzdF9hZGRfdGFpbCgmdHlwZS0+bGlzdCwgJmJ1c190eXBlX2xpc3QpOwogCQl1cF93cml0ZSgmYnVzX3R5cGVfc2VtKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggImJ1cyB0eXBlICVzIHJlZ2lzdGVyZWRcbiIsIHR5cGUtPmJ1cy0+bmFtZSk7CisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJidXMgdHlwZSAlcyByZWdpc3RlcmVkXG4iLAorCQkgICAgICAgdHlwZS0+YnVzLT5uYW1lKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAtRU5PREVWOwpAQCAtNDUsNyArNDYsOCBAQAogCQlkb3duX3dyaXRlKCZidXNfdHlwZV9zZW0pOwogCQlsaXN0X2RlbF9pbml0KCZ0eXBlLT5saXN0KTsKIAkJdXBfd3JpdGUoJmJ1c190eXBlX3NlbSk7Ci0JCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJBQ1BJIGJ1cyB0eXBlICVzIHVucmVnaXN0ZXJlZFxuIiwgdHlwZS0+YnVzLT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkFDUEkgYnVzIHR5cGUgJXMgdW5yZWdpc3RlcmVkXG4iLAorCQkgICAgICAgdHlwZS0+YnVzLT5uYW1lKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAtRU5PREVWOwpAQCAtMTY4LDkgKzE3MCw2IEBACiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgTUVUSE9EX05BTUVfX1NFRywgTlVMTCwgJnNlZyk7CiAJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKIAkJLyogQXNzdW1lIHNlZyA9IDAgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKLQkJICAgICAgICJBc3N1bWUgcm9vdCBicmlkZ2UgWyVzXSBzZWdtZW50IGlzIDBcbiIsCi0JCSAgICAgICAoY2hhciAqKWJ1ZmZlci5wb2ludGVyKTsKIAkJc3RhdHVzID0gQUVfT0s7CiAJCXNlZyA9IDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3YWNwaS5jIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3YWNwaS5jCmluZGV4IGI1MTAwMWUuLjFiYjM0NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMKQEAgLTQyLDEzICs0MiwxMCBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJod2FjcGkiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJod2FjcGkiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjIsMzYgKzU5LDMwIEBACiAgKiAgICAgICAgICAgICAgdGhlIEZBRFQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfaW5pdGlhbGl6ZSAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfaHdfaW5pdGlhbGl6ZSh2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImh3X2luaXRpYWxpemUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImh3X2luaXRpYWxpemUiKTsKIAogCS8qIFdlIG11c3QgaGF2ZSB0aGUgQUNQSSB0YWJsZXMgYnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUgKi8KIAogCWlmICghYWNwaV9nYmxfRkFEVCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIEZBRFQgaXMgcHJlc2VudFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiTm8gRkFEVCBpcyBwcmVzZW50XG4iKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19BQ1BJX1RBQkxFUyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7CiAJfQogCiAJLyogU2FuaXR5IGNoZWNrIHRoZSBGQURUIGZvciB2YWxpZCB2YWx1ZXMgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfZmFkdCAoKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2ZhZHQoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaHdfc2V0X21vZGUKQEAgLTEwNCwyNCArOTUsMjEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9od19zZXRfbW9kZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlKQorYWNwaV9zdGF0dXMgYWNwaV9od19zZXRfbW9kZSh1MzIgbW9kZSkKIHsKIAotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiByZXRyeTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImh3X3NldF9tb2RlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaHdfc2V0X21vZGUiKTsKIAogCS8qCiAJICogQUNQSSAyLjAgY2xhcmlmaWVkIHRoYXQgaWYgU01JX0NNRCBpbiBGQURUIGlzIHplcm8sCiAJICogc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgbW9kZSB0cmFuc2l0aW9uLgogCSAqLwogCWlmICghYWNwaV9nYmxfRkFEVC0+c21pX2NtZCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJObyBTTUlfQ01EIGluIEZBRFQsIG1vZGUgdHJhbnNpdGlvbiBmYWlsZWQuXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIFNNSV9DTUQgaW4gRkFEVCwgbW9kZSB0cmFuc2l0aW9uIGZhaWxlZC5cbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0hBUkRXQVJFX1JFU1BPTlNFKTsKIAl9CiAKIAkvKgpAQCAtMTMyLDkgKzEyMCw4IEBACiAJICogdHJhbnNpdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuCiAJICovCiAJaWYgKCFhY3BpX2dibF9GQURULT5hY3BpX2VuYWJsZSAmJiAhYWNwaV9nYmxfRkFEVC0+YWNwaV9kaXNhYmxlKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkiTm8gQUNQSSBtb2RlIHRyYW5zaXRpb24gc3VwcG9ydGVkIGluIHRoaXMgc3lzdGVtIChlbmFibGUvZGlzYWJsZSBib3RoIHplcm8pXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIEFDUEkgbW9kZSB0cmFuc2l0aW9uIHN1cHBvcnRlZCBpbiB0aGlzIHN5c3RlbSAoZW5hYmxlL2Rpc2FibGUgYm90aCB6ZXJvKVxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCXN3aXRjaCAobW9kZSkgewpAQCAtMTQyLDkgKzEyOSwxMSBAQAogCiAJCS8qIEJJT1Mgc2hvdWxkIGhhdmUgZGlzYWJsZWQgQUxMIGZpeGVkIGFuZCBHUCBldmVudHMgKi8KIAotCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQgKGFjcGlfZ2JsX0ZBRFQtPnNtaV9jbWQsCi0JCQkJICAodTMyKSBhY3BpX2dibF9GQURULT5hY3BpX2VuYWJsZSwgOCk7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJBdHRlbXB0aW5nIHRvIGVuYWJsZSBBQ1BJIG1vZGVcbiIpKTsKKwkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZ2JsX0ZBRFQtPnNtaV9jbWQsCisJCQkJCSAgICAodTMyKSBhY3BpX2dibF9GQURULT5hY3BpX2VuYWJsZSwKKwkJCQkJICAgIDgpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiQXR0ZW1wdGluZyB0byBlbmFibGUgQUNQSSBtb2RlXG4iKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1NZU19NT0RFX0xFR0FDWToKQEAgLTE1MywyMCArMTQyLDIxIEBACiAJCSAqIEJJT1Mgc2hvdWxkIGNsZWFyIGFsbCBmaXhlZCBzdGF0dXMgYml0cyBhbmQgcmVzdG9yZSBmaXhlZCBldmVudAogCQkgKiBlbmFibGUgYml0cyB0byBkZWZhdWx0CiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQgKGFjcGlfZ2JsX0ZBRFQtPnNtaV9jbWQsCi0JCQkJICh1MzIpIGFjcGlfZ2JsX0ZBRFQtPmFjcGlfZGlzYWJsZSwgOCk7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkJICJBdHRlbXB0aW5nIHRvIGVuYWJsZSBMZWdhY3kgKG5vbi1BQ1BJKSBtb2RlXG4iKSk7CisJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydChhY3BpX2dibF9GQURULT5zbWlfY21kLAorCQkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC0+YWNwaV9kaXNhYmxlLAorCQkJCQkgICAgOCk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJBdHRlbXB0aW5nIHRvIGVuYWJsZSBMZWdhY3kgKG5vbi1BQ1BJKSBtb2RlXG4iKSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IHdyaXRlIG1vZGUgY2hhbmdlLCAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IHdyaXRlIG1vZGUgY2hhbmdlLCAlc1xuIiwKKwkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtMTc2LDE5ICsxNjYsMTkgQEAKIAlyZXRyeSA9IDMwMDA7CiAJd2hpbGUgKHJldHJ5KSB7CiAJCWlmIChhY3BpX2h3X2dldF9tb2RlKCkgPT0gbW9kZSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIk1vZGUgJVggc3VjY2Vzc2Z1bGx5IGVuYWJsZWRcbiIsCi0JCQkJbW9kZSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCSAgIk1vZGUgJVggc3VjY2Vzc2Z1bGx5IGVuYWJsZWRcbiIsCisJCQkJCSAgbW9kZSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJfQogCQlhY3BpX29zX3N0YWxsKDEwMDApOwogCQlyZXRyeS0tOwogCX0KIAotCUFDUElfUkVQT1JUX0VSUk9SICgoIkhhcmR3YXJlIG5ldmVyIGNoYW5nZWQgbW9kZXNcbiIpKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0hBUkRXQVJFX1JFU1BPTlNFKTsKKwlBQ1BJX1JFUE9SVF9FUlJPUigoIkhhcmR3YXJlIG5ldmVyIGNoYW5nZWQgbW9kZXNcbiIpKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaHdfZ2V0X21vZGUKQEAgLTIwMiwzNCArMTkyLDMwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyCi1hY3BpX2h3X2dldF9tb2RlICgKLQl2b2lkKQordTMyIGFjcGlfaHdfZ2V0X21vZGUodm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgdmFsdWU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJod19nZXRfbW9kZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaHdfZ2V0X21vZGUiKTsKIAogCS8qCiAJICogQUNQSSAyLjAgY2xhcmlmaWVkIHRoYXQgaWYgU01JX0NNRCBpbiBGQURUIGlzIHplcm8sCiAJICogc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgbW9kZSB0cmFuc2l0aW9uLgogCSAqLwogCWlmICghYWNwaV9nYmxfRkFEVC0+c21pX2NtZCkgewotCQlyZXR1cm5fVkFMVUUgKEFDUElfU1lTX01PREVfQUNQSSk7CisJCXJldHVybl9WQUxVRShBQ1BJX1NZU19NT0RFX0FDUEkpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyIChBQ1BJX0JJVFJFR19TQ0lfRU5BQkxFLCAmdmFsdWUsIEFDUElfTVRYX0xPQ0spOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX1ZBTFVFIChBQ1BJX1NZU19NT0RFX0xFR0FDWSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfU0NJX0VOQUJMRSwgJnZhbHVlLCBBQ1BJX01UWF9MT0NLKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX1ZBTFVFKEFDUElfU1lTX01PREVfTEVHQUNZKTsKIAl9CiAKIAlpZiAodmFsdWUpIHsKLQkJcmV0dXJuX1ZBTFVFIChBQ1BJX1NZU19NT0RFX0FDUEkpOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuX1ZBTFVFIChBQ1BJX1NZU19NT0RFX0xFR0FDWSk7CisJCXJldHVybl9WQUxVRShBQ1BJX1NZU19NT0RFX0FDUEkpOworCX0gZWxzZSB7CisJCXJldHVybl9WQUxVRShBQ1BJX1NZU19NT0RFX0xFR0FDWSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3Z3BlLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdncGUuYwppbmRleCA4ZGFlYWJiLi41YzhlNWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdncGUuYworKysgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdncGUuYwpAQCAtNDYsMTUgKzQ2LDEyIEBACiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9IQVJEV0FSRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiaHdncGUiKQorQUNQSV9NT0RVTEVfTkFNRSgiaHdncGUiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9od19lbmFibGVfd2FrZXVwX2dwZV9ibG9jayAoCi0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKTsKLQorYWNwaV9od19lbmFibGVfd2FrZXVwX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCisJCQkJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jayk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC03MSwxNSArNjgsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbykKK2FjcGlfaHdfd3JpdGVfZ3BlX2VuYWJsZV9yZWcoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKQogewotCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICAgKmdwZV9yZWdpc3Rlcl9pbmZvOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKiBHZXQgdGhlIGluZm8gYmxvY2sgZm9yIHRoZSBlbnRpcmUgR1BFIHJlZ2lzdGVyICovCiAKQEAgLTkwLDEzICs4NCwxMiBAQAogCiAJLyogV3JpdGUgdGhlIGVudGlyZSBHUEUgKHJ1bnRpbWUpIGVuYWJsZSByZWdpc3RlciAqLwogCi0Jc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDgsIGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3J1biwKLQkJCSAgJmdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfYWRkcmVzcyk7CisJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLAorCQkJCQkgJmdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfYWRkcmVzcyk7CiAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2NsZWFyX2dwZQpAQCAtMTA5LDI3ICsxMDIsMjMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9od19jbGVhcl9ncGUgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKQorYWNwaV9zdGF0dXMgYWNwaV9od19jbGVhcl9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKiBncGVfZXZlbnRfaW5mbykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKgogCSAqIFdyaXRlIGEgb25lIHRvIHRoZSBhcHByb3ByaWF0ZSBiaXQgaW4gdGhlIHN0YXR1cyByZWdpc3RlciB0bwogCSAqIGNsZWFyIHRoaXMgR1BFLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlICg4LCBncGVfZXZlbnRfaW5mby0+cmVnaXN0ZXJfYml0LAotCQkJICAmZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm8tPnN0YXR1c19hZGRyZXNzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBncGVfZXZlbnRfaW5mby0+cmVnaXN0ZXJfYml0LAorCQkJCQkgJmdwZV9ldmVudF9pbmZvLT5yZWdpc3Rlcl9pbmZvLT4KKwkJCQkJIHN0YXR1c19hZGRyZXNzKTsKIAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaHdfZ2V0X2dwZV9zdGF0dXMKQEAgLTE0NSwxOSArMTM0LDE2IEBACiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfaHdfZ2V0X2dwZV9zdGF0dXMgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLAotCWFjcGlfZXZlbnRfc3RhdHVzICAgICAgICAgICAgICAgKmV2ZW50X3N0YXR1cykKK2FjcGlfaHdfZ2V0X2dwZV9zdGF0dXMoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKiBncGVfZXZlbnRfaW5mbywKKwkJICAgICAgIGFjcGlfZXZlbnRfc3RhdHVzICogZXZlbnRfc3RhdHVzKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYnl0ZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2JpdDsKLQlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAgICpncGVfcmVnaXN0ZXJfaW5mbzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlhY3BpX2V2ZW50X3N0YXR1cyAgICAgICAgICAgICAgIGxvY2FsX2V2ZW50X3N0YXR1cyA9IDA7CisJdTMyIGluX2J5dGU7CisJdTggcmVnaXN0ZXJfYml0OworCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9ldmVudF9zdGF0dXMgbG9jYWxfZXZlbnRfc3RhdHVzID0gMDsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWlmICghZXZlbnRfc3RhdHVzKSB7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CkBAIC0xODUsOCArMTcxLDEwIEBACiAKIAkvKiBHUEUgY3VycmVudGx5IGFjdGl2ZSAoc3RhdHVzIGJpdCA9PSAxKT8gKi8KIAotCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3JlYWQgKDgsICZpbl9ieXRlLCAmZ3BlX3JlZ2lzdGVyX2luZm8tPnN0YXR1c19hZGRyZXNzKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0KKwkgICAgYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCAmaW5fYnl0ZSwKKwkJCQkgICAmZ3BlX3JlZ2lzdGVyX2luZm8tPnN0YXR1c19hZGRyZXNzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQogCkBAIC0xOTgsMTIgKzE4NiwxMCBAQAogCiAJKCpldmVudF9zdGF0dXMpID0gbG9jYWxfZXZlbnRfc3RhdHVzOwogCi0KLXVubG9ja19hbmRfZXhpdDoKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKIAlyZXR1cm4gKHN0YXR1cyk7CiB9Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQorI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTIxOSwyMiArMjA1LDIxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jayAoCi0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKQorYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqIGdwZV94cnVwdF9pbmZvLAorCQkJICBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqIGdwZV9ibG9jaykKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KKwl1MzIgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAkvKiBFeGFtaW5lIGVhY2ggR1BFIFJlZ2lzdGVyIHdpdGhpbiB0aGUgYmxvY2sgKi8KIAogCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKIAkJLyogRGlzYWJsZSBhbGwgR1BFcyBpbiB0aGlzIHJlZ2lzdGVyICovCiAKLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDgsIDB4MDAsCi0JCQkJICZncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uZW5hYmxlX2FkZHJlc3MpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIDB4MDAsCisJCQkJCQkgJmdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS4KKwkJCQkJCSBlbmFibGVfYWRkcmVzcyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAJfQpAQCAtMjQyLDcgKzIyNyw2IEBACiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2NsZWFyX2dwZV9ibG9jawpAQCAtMjU3LDIyICsyNDEsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2h3X2NsZWFyX2dwZV9ibG9jayAoCi0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKQorYWNwaV9od19jbGVhcl9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKiBncGVfeHJ1cHRfaW5mbywKKwkJCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICogZ3BlX2Jsb2NrKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQorCXUzMiBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCS8qIEV4YW1pbmUgZWFjaCBHUEUgUmVnaXN0ZXIgd2l0aGluIHRoZSBibG9jayAqLwogCiAJZm9yIChpID0gMDsgaSA8IGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQ7IGkrKykgewogCQkvKiBDbGVhciBzdGF0dXMgb24gYWxsIEdQRXMgaW4gdGhpcyByZWdpc3RlciAqLwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlICg4LCAweEZGLAotCQkJCSAmZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLnN0YXR1c19hZGRyZXNzKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCAweEZGLAorCQkJCQkJICZncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uCisJCQkJCQkgc3RhdHVzX2FkZHJlc3MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybiAoc3RhdHVzKTsKIAkJfQogCX0KQEAgLTI4MCw3ICsyNjMsNiBAQAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9od19lbmFibGVfcnVudGltZV9ncGVfYmxvY2sKQEAgLTI5NiwxMyArMjc4LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19lbmFibGVfcnVudGltZV9ncGVfYmxvY2sgKAotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvLAotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jaykKK2FjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICogZ3BlX3hydXB0X2luZm8sCisJCQkJIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICogZ3BlX2Jsb2NrKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQorCXUzMiBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCS8qIE5PVEU6IGFzc3VtZXMgdGhhdCBhbGwgR1BFcyBhcmUgY3VycmVudGx5IGRpc2FibGVkICovCiAKQEAgLTMxNSw5ICsyOTUsMTMgQEAKIAogCQkvKiBFbmFibGUgYWxsICJydW50aW1lIiBHUEVzIGluIHRoaXMgcmVnaXN0ZXIgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoOCwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLmVuYWJsZV9mb3JfcnVuLAotCQkJCSAmZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLmVuYWJsZV9hZGRyZXNzKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwKKwkJCQkJICAgIGdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS4KKwkJCQkJICAgIGVuYWJsZV9mb3JfcnVuLAorCQkJCQkgICAgJmdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS4KKwkJCQkJICAgIGVuYWJsZV9hZGRyZXNzKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCX0KIAl9CkBAIC0zMjUsNyArMzA5LDYgQEAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaHdfZW5hYmxlX3dha2V1cF9ncGVfYmxvY2sKQEAgLTM0MSwxMyArMzI0LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfaHdfZW5hYmxlX3dha2V1cF9ncGVfYmxvY2sgKAotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvLAotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jaykKK2FjcGlfaHdfZW5hYmxlX3dha2V1cF9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAorCQkJCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCisJdTMyIGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJLyogRXhhbWluZSBlYWNoIEdQRSBSZWdpc3RlciB3aXRoaW4gdGhlIGJsb2NrICovCiAKQEAgLTM1OCwxMCArMzM5LDEyIEBACiAKIAkJLyogRW5hYmxlIGFsbCAid2FrZSIgR1BFcyBpbiB0aGlzIHJlZ2lzdGVyICovCiAKLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDgsCi0JCQkJIGdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS5lbmFibGVfZm9yX3dha2UsCi0JCQkJICZncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uZW5hYmxlX2FkZHJlc3MpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsCisJCQkJCQkgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLgorCQkJCQkJIGVuYWJsZV9mb3Jfd2FrZSwKKwkJCQkJCSAmZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLgorCQkJCQkJIGVuYWJsZV9hZGRyZXNzKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCX0KIAl9CkBAIC0zNjksMTIgKzM1MiwxMSBAQAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzCiAgKgotICogUEFSQU1FVEVSUzogIEZsYWdzICAgICAgICAgICAtIEFDUElfTk9UX0lTUiBvciBBQ1BJX0lTUgorICogUEFSQU1FVEVSUzogIE5vbmUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzgyLDI3ICszNjQsMjIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQorYWNwaV9zdGF0dXMgYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaHdfZGlzYWJsZV9hbGxfZ3BlcyIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImh3X2Rpc2FibGVfYWxsX2dwZXMiKTsKLQotCi0Jc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0IChhY3BpX2h3X2Rpc2FibGVfZ3BlX2Jsb2NrLCBmbGFncyk7Ci0Jc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0IChhY3BpX2h3X2NsZWFyX2dwZV9ibG9jaywgZmxhZ3MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jayk7CisJc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaHdfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMKICAqCi0gKiBQQVJBTUVURVJTOiAgRmxhZ3MgICAgICAgICAgIC0gQUNQSV9OT1RfSVNSIG9yIEFDUElfSVNSCisgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC00MTAsMjYgKzM4NywyMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2h3X2VuYWJsZV9hbGxfcnVudGltZV9ncGVzICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQorYWNwaV9zdGF0dXMgYWNwaV9od19lbmFibGVfYWxsX3J1bnRpbWVfZ3Blcyh2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImh3X2VuYWJsZV9hbGxfcnVudGltZV9ncGVzIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiaHdfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMiKTsKLQotCi0Jc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0IChhY3BpX2h3X2VuYWJsZV9ydW50aW1lX2dwZV9ibG9jaywgZmxhZ3MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19lbmFibGVfcnVudGltZV9ncGVfYmxvY2spOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzCiAgKgotICogUEFSQU1FVEVSUzogIEZsYWdzICAgICAgICAgICAtIEFDUElfTk9UX0lTUiBvciBBQ1BJX0lTUgorICogUEFSQU1FVEVSUzogIE5vbmUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDM3LDE3ICs0MDksMTIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQorYWNwaV9zdGF0dXMgYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaHdfZW5hYmxlX2FsbF93YWtldXBfZ3BlcyIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImh3X2VuYWJsZV9hbGxfd2FrZXVwX2dwZXMiKTsKLQotCi0Jc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0IChhY3BpX2h3X2VuYWJsZV93YWtldXBfZ3BlX2Jsb2NrLCBmbGFncyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXZfd2Fsa19ncGVfbGlzdChhY3BpX2h3X2VuYWJsZV93YWtldXBfZ3BlX2Jsb2NrKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3cmVncy5jIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3cmVncy5jCmluZGV4IDZkOWU0ZWIuLjUzNmE3YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3JlZ3MuYworKysgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMKQEAgLTUwLDggKzUwLDcgQEAKICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJod3JlZ3MiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJod3JlZ3MiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY1LDU3ICs2NCw1MiBAQAogICogICAgICAgICAgICAgIFRISVMgRlVOQ1RJT04gTVVTVCBCRSBDQUxMRUQgV0lUSCBJTlRFUlJVUFRTIERJU0FCTEVECiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2h3X2NsZWFyX2FjcGlfc3RhdHVzKHUzMiBmbGFncykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJod19jbGVhcl9hY3BpX3N0YXR1cyIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImh3X2NsZWFyX2FjcGlfc3RhdHVzIik7Ci0KLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lPLCAiQWJvdXQgdG8gd3JpdGUgJTA0WCB0byAlMDRYXG4iLAotCQlBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUywKLQkJKHUxNikgYWNwaV9nYmxfRkFEVC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTywgIkFib3V0IHRvIHdyaXRlICUwNFggdG8gJTA0WFxuIiwKKwkJCSAgQUNQSV9CSVRNQVNLX0FMTF9GSVhFRF9TVEFUVVMsCisJCQkgICh1MTYpIGFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcykpOwogCiAJaWYgKGZsYWdzICYgQUNQSV9NVFhfTE9DSykgewotCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX0hBUkRXQVJFKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfSEFSRFdBUkUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkgQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAotCQkJIEFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCQkJQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAorCQkJCQlBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAogCS8qIENsZWFyIHRoZSBmaXhlZCBldmVudHMgKi8KIAogCWlmIChhY3BpX2dibF9GQURULT54cG0xYl9ldnRfYmxrLmFkZHJlc3MpIHsKLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDE2LCBBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUywKLQkJCQkgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2V2dF9ibGspOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSgxNiwgQUNQSV9CSVRNQVNLX0FMTF9GSVhFRF9TVEFUVVMsCisJCQkJCSAgICAmYWNwaV9nYmxfRkFEVC0+eHBtMWJfZXZ0X2Jsayk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KIAl9CiAKIAkvKiBDbGVhciB0aGUgR1BFIEJpdHMgaW4gYWxsIEdQRSByZWdpc3RlcnMgaW4gYWxsIEdQRSBibG9ja3MgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZfd2Fsa19ncGVfbGlzdCAoYWNwaV9od19jbGVhcl9ncGVfYmxvY2ssIEFDUElfSVNSKTsKKwlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19jbGVhcl9ncGVfYmxvY2spOwogCi11bmxvY2tfYW5kX2V4aXQ6CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CiAJaWYgKGZsYWdzICYgQUNQSV9NVFhfTE9DSykgewotCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9IQVJEV0FSRSk7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7CiAJfQotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEKQEAgLTEzMiw1MyArMTI2LDQ4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwX3N0YXRlLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNsZWVwX3R5cGVfYSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzbGVlcF90eXBlX2IpCithY3BpX2dldF9zbGVlcF90eXBlX2RhdGEodTggc2xlZXBfc3RhdGUsIHU4ICogc2xlZXBfdHlwZV9hLCB1OCAqIHNsZWVwX3R5cGVfYikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgaW5mbzsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzbGVlcF9zdGF0ZV9uYW1lOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIGluZm87CisJY2hhciAqc2xlZXBfc3RhdGVfbmFtZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhIik7CiAKIAkvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzICovCiAKLQlpZiAoKHNsZWVwX3N0YXRlID4gQUNQSV9TX1NUQVRFU19NQVgpIHx8Ci0JCSFzbGVlcF90eXBlX2EgfHwgIXNsZWVwX3R5cGVfYikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCWlmICgoc2xlZXBfc3RhdGUgPiBBQ1BJX1NfU1RBVEVTX01BWCkgfHwgIXNsZWVwX3R5cGVfYSB8fCAhc2xlZXBfdHlwZV9iKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBFdmFsdWF0ZSB0aGUgbmFtZXNwYWNlIG9iamVjdCBjb250YWluaW5nIHRoZSB2YWx1ZXMgZm9yIHRoaXMgc3RhdGUgKi8KIAogCWluZm8ucGFyYW1ldGVycyA9IE5VTEw7CiAJaW5mby5yZXR1cm5fb2JqZWN0ID0gTlVMTDsKLQlzbGVlcF9zdGF0ZV9uYW1lID0gKGNoYXIgKikgYWNwaV9nYmxfc2xlZXBfc3RhdGVfbmFtZXNbc2xlZXBfc3RhdGVdOworCXNsZWVwX3N0YXRlX25hbWUgPSAoY2hhciAqKWFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW3NsZWVwX3N0YXRlXTsKIAotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfbmFtZSAoc2xlZXBfc3RhdGVfbmFtZSwgJmluZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSIlcyB3aGlsZSBldmFsdWF0aW5nIHNsZWVwX3N0YXRlIFslc11cbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksIHNsZWVwX3N0YXRlX25hbWUpKTsKKwlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X25hbWUoc2xlZXBfc3RhdGVfbmFtZSwgJmluZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiJXMgd2hpbGUgZXZhbHVhdGluZyBzbGVlcF9zdGF0ZSBbJXNdXG4iLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksCisJCQkJICBzbGVlcF9zdGF0ZV9uYW1lKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBNdXN0IGhhdmUgYSByZXR1cm4gb2JqZWN0ICovCiAKIAlpZiAoIWluZm8ucmV0dXJuX29iamVjdCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJObyBTbGVlcCBTdGF0ZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBbJXNdXG4iLAotCQkJc2xlZXBfc3RhdGVfbmFtZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIFNsZWVwIFN0YXRlIG9iamVjdCByZXR1cm5lZCBmcm9tIFslc11cbiIsCisJCQkJICAgc2xlZXBfc3RhdGVfbmFtZSkpOwogCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CiAJfQogCiAJLyogSXQgbXVzdCBiZSBvZiB0eXBlIFBhY2thZ2UgKi8KIAotCWVsc2UgaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChpbmZvLnJldHVybl9vYmplY3QpICE9IEFDUElfVFlQRV9QQUNLQUdFKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIlNsZWVwIFN0YXRlIHJldHVybiBvYmplY3QgaXMgbm90IGEgUGFja2FnZVxuIikpOworCWVsc2UgaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKGluZm8ucmV0dXJuX29iamVjdCkgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJTbGVlcCBTdGF0ZSByZXR1cm4gb2JqZWN0IGlzIG5vdCBhIFBhY2thZ2VcbiIpKTsKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAl9CiAKQEAgLTE5MCw0NSArMTc5LDQxIEBACiAJICogb25lIHBlciBzbGVlcCB0eXBlIChBL0IpLgogCSAqLwogCWVsc2UgaWYgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5jb3VudCA8IDIpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCSJTbGVlcCBTdGF0ZSByZXR1cm4gcGFja2FnZSBkb2VzIG5vdCBoYXZlIGF0IGxlYXN0IHR3byBlbGVtZW50c1xuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlNsZWVwIFN0YXRlIHJldHVybiBwYWNrYWdlIGRvZXMgbm90IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzXG4iKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9OT19PUEVSQU5EOwogCX0KIAogCS8qIFRoZSBmaXJzdCB0d28gZWxlbWVudHMgbXVzdCBib3RoIGJlIG9mIHR5cGUgSW50ZWdlciAqLwogCi0JZWxzZSBpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMF0pCi0JCQkgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHx8Ci0JCQkgKEFDUElfR0VUX09CSkVDVF9UWVBFIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMV0pCi0JCQkJIT0gQUNQSV9UWVBFX0lOVEVHRVIpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkiU2xlZXAgU3RhdGUgcmV0dXJuIHBhY2thZ2UgZWxlbWVudHMgYXJlIG5vdCBib3RoIEludGVnZXJzICglcywgJXMpXG4iLAotCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzBdKSwKLQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSkpKTsKKwllbHNlIGlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzBdKQorCQkgICE9IEFDUElfVFlQRV9JTlRFR0VSKSB8fAorCQkgKEFDUElfR0VUX09CSkVDVF9UWVBFKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSkKKwkJICAhPSBBQ1BJX1RZUEVfSU5URUdFUikpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJTbGVlcCBTdGF0ZSByZXR1cm4gcGFja2FnZSBlbGVtZW50cyBhcmUgbm90IGJvdGggSW50ZWdlcnMgKCVzLCAlcylcbiIsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzBdKSwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMV0pKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIFZhbGlkIF9TeF8gcGFja2FnZSBzaXplLCB0eXBlLCBhbmQgdmFsdWUgKi8KIAogCQkqc2xlZXBfdHlwZV9hID0gKHU4KQotCQkJKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSktPmludGVnZXIudmFsdWU7CisJCSAgICAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzBdKS0+aW50ZWdlci52YWx1ZTsKIAkJKnNsZWVwX3R5cGVfYiA9ICh1OCkKLQkJCShpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMV0pLT5pbnRlZ2VyLnZhbHVlOworCQkgICAgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSktPmludGVnZXIudmFsdWU7CiAJfQogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSIlcyBXaGlsZSBldmFsdWF0aW5nIHNsZWVwX3N0YXRlIFslc10sIGJhZCBTbGVlcCBvYmplY3QgJXAgdHlwZSAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSwKLQkJCXNsZWVwX3N0YXRlX25hbWUsIGluZm8ucmV0dXJuX29iamVjdCwKLQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKGluZm8ucmV0dXJuX29iamVjdCkpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICIlcyBXaGlsZSBldmFsdWF0aW5nIHNsZWVwX3N0YXRlIFslc10sIGJhZCBTbGVlcCBvYmplY3QgJXAgdHlwZSAlc1xuIiwKKwkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLAorCQkJCSAgc2xlZXBfc3RhdGVfbmFtZSwgaW5mby5yZXR1cm5fb2JqZWN0LAorCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLgorCQkJCQkJCSAgICAgICByZXR1cm5fb2JqZWN0KSkpOwogCX0KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoaW5mby5yZXR1cm5fb2JqZWN0KTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8ucmV0dXJuX29iamVjdCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yNDIsMjIgKzIyNywyMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICoKLWFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2lkKQorc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKmFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvKHUzMiByZWdpc3Rlcl9pZCkKIHsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJod19nZXRfYml0X3JlZ2lzdGVyX2luZm8iKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvIik7CiAKIAlpZiAocmVnaXN0ZXJfaWQgPiBBQ1BJX0JJVFJFR19NQVgpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGJpdF9yZWdpc3RlciBJRDogJVhcbiIsIHJlZ2lzdGVyX2lkKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSW52YWxpZCBiaXRfcmVnaXN0ZXIgSUQ6ICVYXG4iLAorCQkJCSAgcmVnaXN0ZXJfaWQpKTsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAKIAlyZXR1cm4gKCZhY3BpX2dibF9iaXRfcmVnaXN0ZXJfaW5mb1tyZWdpc3Rlcl9pZF0pOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3JlZ2lzdGVyCkBAIC0yNzMsNTkgKzI1Niw1NiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9yZWdpc3RlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9pZCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXR1cm5fdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3JlZ2lzdGVyKHUzMiByZWdpc3Rlcl9pZCwgdTMyICogcmV0dXJuX3ZhbHVlLCB1MzIgZmxhZ3MpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl92YWx1ZSA9IDA7Ci0Jc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gICAqYml0X3JlZ19pbmZvOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXUzMiByZWdpc3Rlcl92YWx1ZSA9IDA7CisJc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKmJpdF9yZWdfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF9yZWdpc3RlciIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfcmVnaXN0ZXIiKTsKIAogCS8qIEdldCB0aGUgaW5mbyBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIEFDUEkgUmVnaXN0ZXIgKi8KIAotCWJpdF9yZWdfaW5mbyA9IGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvIChyZWdpc3Rlcl9pZCk7CisJYml0X3JlZ19pbmZvID0gYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8ocmVnaXN0ZXJfaWQpOwogCWlmICghYml0X3JlZ19pbmZvKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAlpZiAoZmxhZ3MgJiBBQ1BJX01UWF9MT0NLKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfSEFSRFdBUkUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAkvKiBSZWFkIGZyb20gdGhlIHJlZ2lzdGVyICovCiAKLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJICBiaXRfcmVnX2luZm8tPnBhcmVudF9yZWdpc3RlciwgJnJlZ2lzdGVyX3ZhbHVlKTsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJICAgICAgIGJpdF9yZWdfaW5mby0+cGFyZW50X3JlZ2lzdGVyLAorCQkJCSAgICAgICAmcmVnaXN0ZXJfdmFsdWUpOwogCiAJaWYgKGZsYWdzICYgQUNQSV9NVFhfTE9DSykgewotCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9IQVJEV0FSRSk7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7CiAJfQogCi0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkvKiBOb3JtYWxpemUgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQgKi8KIAotCQlyZWdpc3Rlcl92YWx1ZSA9ICgocmVnaXN0ZXJfdmFsdWUgJiBiaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaykKLQkJCQkgICA+PiBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbik7CisJCXJlZ2lzdGVyX3ZhbHVlID0KKwkJICAgICgocmVnaXN0ZXJfdmFsdWUgJiBiaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaykKKwkJICAgICA+PiBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbik7CiAKIAkJKnJldHVybl92YWx1ZSA9IHJlZ2lzdGVyX3ZhbHVlOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lPLCAiUmVhZCB2YWx1ZSAlOC44WCByZWdpc3RlciAlWFxuIiwKLQkJCQlyZWdpc3Rlcl92YWx1ZSwgYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTywgIlJlYWQgdmFsdWUgJTguOFggcmVnaXN0ZXIgJVhcbiIsCisJCQkJICByZWdpc3Rlcl92YWx1ZSwKKwkJCQkgIGJpdF9yZWdfaW5mby0+cGFyZW50X3JlZ2lzdGVyKSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2dldF9yZWdpc3Rlcik7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfcmVnaXN0ZXIpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTM0Miw0MCArMzIyLDM2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfc2V0X3JlZ2lzdGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2lkLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK2FjcGlfc3RhdHVzIGFjcGlfc2V0X3JlZ2lzdGVyKHUzMiByZWdpc3Rlcl9pZCwgdTMyIHZhbHVlLCB1MzIgZmxhZ3MpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl92YWx1ZSA9IDA7Ci0Jc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gICAqYml0X3JlZ19pbmZvOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXUzMiByZWdpc3Rlcl92YWx1ZSA9IDA7CisJc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKmJpdF9yZWdfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgiYWNwaV9zZXRfcmVnaXN0ZXIiLCByZWdpc3Rlcl9pZCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigiYWNwaV9zZXRfcmVnaXN0ZXIiLCByZWdpc3Rlcl9pZCk7CiAKIAkvKiBHZXQgdGhlIGluZm8gc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBBQ1BJIFJlZ2lzdGVyICovCiAKLQliaXRfcmVnX2luZm8gPSBhY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyAocmVnaXN0ZXJfaWQpOworCWJpdF9yZWdfaW5mbyA9IGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvKHJlZ2lzdGVyX2lkKTsKIAlpZiAoIWJpdF9yZWdfaW5mbykgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJCYWQgQUNQSSBIVyByZWdpc3Rlcl9pZDogJVhcbiIsIHJlZ2lzdGVyX2lkKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQmFkIEFDUEkgSFcgcmVnaXN0ZXJfaWQ6ICVYXG4iLAorCQkJCSAgIHJlZ2lzdGVyX2lkKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAlpZiAoZmxhZ3MgJiBBQ1BJX01UWF9MT0NLKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfSEFSRFdBUkUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAkvKiBBbHdheXMgZG8gYSByZWdpc3RlciByZWFkIGZpcnN0IHNvIHdlIGNhbiBpbnNlcnQgdGhlIG5ldyBiaXRzICAqLwogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywKLQkJCSBiaXRfcmVnX2luZm8tPnBhcmVudF9yZWdpc3RlciwgJnJlZ2lzdGVyX3ZhbHVlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCSAgICAgICBiaXRfcmVnX2luZm8tPnBhcmVudF9yZWdpc3RlciwKKwkJCQkgICAgICAgJnJlZ2lzdGVyX3ZhbHVlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQogCkBAIC0zOTUsMjYgKzM3MSwzMCBAQAogCQkgKiBpbmZvcm1hdGlvbiBpcyB0aGUgc2luZ2xlIGJpdCB3ZSdyZSBpbnRlcmVzdGVkIGluLCBhbGwgb3RoZXJzIHNob3VsZAogCQkgKiBiZSB3cml0dGVuIGFzIDAgc28gdGhleSB3aWxsIGJlIGxlZnQgdW5jaGFuZ2VkLgogCQkgKi8KLQkJdmFsdWUgPSBBQ1BJX1JFR0lTVEVSX1BSRVBBUkVfQklUUyAodmFsdWUsCi0JCQkJIGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uLCBiaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayk7CisJCXZhbHVlID0gQUNQSV9SRUdJU1RFUl9QUkVQQVJFX0JJVFModmFsdWUsCisJCQkJCQkgICBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbiwKKwkJCQkJCSAgIGJpdF9yZWdfaW5mby0+CisJCQkJCQkgICBhY2Nlc3NfYml0X21hc2spOwogCQlpZiAodmFsdWUpIHsKLQkJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCQkgQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLCAodTE2KSB2YWx1ZSk7CisJCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCQkJCUFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCQkJCQkodTE2KSB2YWx1ZSk7CiAJCQlyZWdpc3Rlcl92YWx1ZSA9IDA7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFOgogCi0JCUFDUElfUkVHSVNURVJfSU5TRVJUX1ZBTFVFIChyZWdpc3Rlcl92YWx1ZSwgYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24sCi0JCQkJYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2ssIHZhbHVlKTsKKwkJQUNQSV9SRUdJU1RFUl9JTlNFUlRfVkFMVUUocmVnaXN0ZXJfdmFsdWUsCisJCQkJCSAgIGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uLAorCQkJCQkgICBiaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaywKKwkJCQkJICAgdmFsdWUpOwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCSBBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsICh1MTYpIHJlZ2lzdGVyX3ZhbHVlKTsKKwkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCQkJCUFDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwKKwkJCQkJCSh1MTYpIHJlZ2lzdGVyX3ZhbHVlKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTDoKIAogCQkvKgpAQCAtNDIyLDY1ICs0MDIsNzMgQEAKIAkJICogTm90ZSB0aGF0IGF0IHRoaXMgbGV2ZWwsIHRoZSBmYWN0IHRoYXQgdGhlcmUgYXJlIGFjdHVhbGx5IFRXTwogCQkgKiByZWdpc3RlcnMgKEEgYW5kIEIgLSBhbmQgQiBtYXkgbm90IGV4aXN0KSBpcyBhYnN0cmFjdGVkLgogCQkgKi8KLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU8sICJQTTEgY29udHJvbDogUmVhZCAlWFxuIiwgcmVnaXN0ZXJfdmFsdWUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTywgIlBNMSBjb250cm9sOiBSZWFkICVYXG4iLAorCQkJCSAgcmVnaXN0ZXJfdmFsdWUpKTsKIAotCQlBQ1BJX1JFR0lTVEVSX0lOU0VSVF9WQUxVRSAocmVnaXN0ZXJfdmFsdWUsIGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uLAotCQkJCWJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrLCB2YWx1ZSk7CisJCUFDUElfUkVHSVNURVJfSU5TRVJUX1ZBTFVFKHJlZ2lzdGVyX3ZhbHVlLAorCQkJCQkgICBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbiwKKwkJCQkJICAgYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2ssCisJCQkJCSAgIHZhbHVlKTsKIAotCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywKLQkJCQkgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwgKHUxNikgcmVnaXN0ZXJfdmFsdWUpOworCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCQkJQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKKwkJCQkJCSh1MTYpIHJlZ2lzdGVyX3ZhbHVlKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTDoKIAotCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCSBBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MLCAmcmVnaXN0ZXJfdmFsdWUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCQkJICAgICAgIEFDUElfUkVHSVNURVJfUE0yX0NPTlRST0wsCisJCQkJCSAgICAgICAmcmVnaXN0ZXJfdmFsdWUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU8sICJQTTIgY29udHJvbDogUmVhZCAlWCBmcm9tICU4LjhYJTguOFhcbiIsCi0JCQlyZWdpc3Rlcl92YWx1ZSwKLQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoCi0JCQkJYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrLmFkZHJlc3MpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU8sCisJCQkJICAiUE0yIGNvbnRyb2w6IFJlYWQgJVggZnJvbSAlOC44WCU4LjhYXG4iLAorCQkJCSAgcmVnaXN0ZXJfdmFsdWUsCisJCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWNwaV9nYmxfRkFEVC0+CisJCQkJCQkgICAgIHhwbTJfY250X2Jsay5hZGRyZXNzKSkpOwogCi0JCUFDUElfUkVHSVNURVJfSU5TRVJUX1ZBTFVFIChyZWdpc3Rlcl92YWx1ZSwgYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24sCi0JCQkJYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2ssIHZhbHVlKTsKKwkJQUNQSV9SRUdJU1RFUl9JTlNFUlRfVkFMVUUocmVnaXN0ZXJfdmFsdWUsCisJCQkJCSAgIGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uLAorCQkJCQkgICBiaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaywKKwkJCQkJICAgdmFsdWUpOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lPLCAiQWJvdXQgdG8gd3JpdGUgJTQuNFggdG8gJTguOFglOC44WFxuIiwKLQkJCXJlZ2lzdGVyX3ZhbHVlLAotCQkJQUNQSV9GT1JNQVRfVUlOVDY0ICgKLQkJCQlhY3BpX2dibF9GQURULT54cG0yX2NudF9ibGsuYWRkcmVzcykpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTywKKwkJCQkgICJBYm91dCB0byB3cml0ZSAlNC40WCB0byAlOC44WCU4LjhYXG4iLAorCQkJCSAgcmVnaXN0ZXJfdmFsdWUsCisJCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWNwaV9nYmxfRkFEVC0+CisJCQkJCQkgICAgIHhwbTJfY250X2Jsay5hZGRyZXNzKSkpOwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCSBBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MLCAodTgpIChyZWdpc3Rlcl92YWx1ZSkpOworCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCQkJQUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTCwKKwkJCQkJCSh1OCkgKHJlZ2lzdGVyX3ZhbHVlKSk7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKLQotdW5sb2NrX2FuZF9leGl0OgorICAgICAgdW5sb2NrX2FuZF9leGl0OgogCiAJaWYgKGZsYWdzICYgQUNQSV9NVFhfTE9DSykgewotCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9IQVJEV0FSRSk7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7CiAJfQogCiAJLyogTm9ybWFsaXplIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkICovCiAKLQlBQ1BJX0RFQlVHX0VYRUMgKHJlZ2lzdGVyX3ZhbHVlID0KLQkJKChyZWdpc3Rlcl92YWx1ZSAmIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKSA+PgotCQkJYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24pKTsKKwlBQ1BJX0RFQlVHX0VYRUMocmVnaXN0ZXJfdmFsdWUgPQorCQkJKChyZWdpc3Rlcl92YWx1ZSAmIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKSA+PgorCQkJIGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywgIlNldCBiaXRzOiAlOC44WCBhY3R1YWwgJTguOFggcmVnaXN0ZXIgJVhcbiIsCi0JCQl2YWx1ZSwgcmVnaXN0ZXJfdmFsdWUsIGJpdF9yZWdfaW5mby0+cGFyZW50X3JlZ2lzdGVyKSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU8sCisJCQkgICJTZXQgYml0czogJTguOFggYWN0dWFsICU4LjhYIHJlZ2lzdGVyICVYXG4iLCB2YWx1ZSwKKwkJCSAgcmVnaXN0ZXJfdmFsdWUsIGJpdF9yZWdfaW5mby0+cGFyZW50X3JlZ2lzdGVyKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfc2V0X3JlZ2lzdGVyKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX3NldF9yZWdpc3Rlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC00OTgsMTAzICs0ODYsMTA3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19yZWdpc3Rlcl9yZWFkICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9sb2NrLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfaWQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmV0dXJuX3ZhbHVlKQorYWNwaV9od19yZWdpc3Rlcl9yZWFkKHU4IHVzZV9sb2NrLCB1MzIgcmVnaXN0ZXJfaWQsIHUzMiAqIHJldHVybl92YWx1ZSkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMSA9IDA7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTIgPSAwOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXUzMiB2YWx1ZTEgPSAwOworCXUzMiB2YWx1ZTIgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImh3X3JlZ2lzdGVyX3JlYWQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImh3X3JlZ2lzdGVyX3JlYWQiKTsKIAogCWlmIChBQ1BJX01UWF9MT0NLID09IHVzZV9sb2NrKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfSEFSRFdBUkUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAlzd2l0Y2ggKHJlZ2lzdGVyX2lkKSB7Ci0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVM6ICAgICAgICAgICAvKiAxNi1iaXQgYWNjZXNzICovCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVM6CS8qIDE2LWJpdCBhY2Nlc3MgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF9yZWFkICgxNiwgJnZhbHVlMSwgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2V2dF9ibGspOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDE2LCAmdmFsdWUxLAorCQkJCQkgICAmYWNwaV9nYmxfRkFEVC0+eHBtMWFfZXZ0X2Jsayk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KIAogCQkvKiBQTTFCIGlzIG9wdGlvbmFsICovCiAKLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfcmVhZCAoMTYsICZ2YWx1ZTIsICZhY3BpX2dibF9GQURULT54cG0xYl9ldnRfYmxrKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoMTYsICZ2YWx1ZTIsCisJCQkJCSAgICZhY3BpX2dibF9GQURULT54cG0xYl9ldnRfYmxrKTsKIAkJdmFsdWUxIHw9IHZhbHVlMjsKIAkJYnJlYWs7CiAKKwljYXNlIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRToJLyogMTYtYml0IGFjY2VzcyAqLwogCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEU6ICAgICAgICAgICAvKiAxNi1iaXQgYWNjZXNzICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfcmVhZCAoMTYsICZ2YWx1ZTEsICZhY3BpX2dibF94cG0xYV9lbmFibGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDE2LCAmdmFsdWUxLCAmYWNwaV9nYmxfeHBtMWFfZW5hYmxlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCiAJCS8qIFBNMUIgaXMgb3B0aW9uYWwgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF9yZWFkICgxNiwgJnZhbHVlMiwgJmFjcGlfZ2JsX3hwbTFiX2VuYWJsZSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDE2LCAmdmFsdWUyLCAmYWNwaV9nYmxfeHBtMWJfZW5hYmxlKTsKIAkJdmFsdWUxIHw9IHZhbHVlMjsKIAkJYnJlYWs7CiAKKwljYXNlIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0w6CS8qIDE2LWJpdCBhY2Nlc3MgKi8KIAotCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTDogICAgICAgICAgLyogMTYtYml0IGFjY2VzcyAqLwotCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3JlYWQgKDE2LCAmdmFsdWUxLCAmYWNwaV9nYmxfRkFEVC0+eHBtMWFfY250X2Jsayk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoMTYsICZ2YWx1ZTEsCisJCQkJCSAgICZhY3BpX2dibF9GQURULT54cG0xYV9jbnRfYmxrKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3JlYWQgKDE2LCAmdmFsdWUyLCAmYWNwaV9nYmxfRkFEVC0+eHBtMWJfY250X2Jsayk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDE2LCAmdmFsdWUyLAorCQkJCQkgICAmYWNwaV9nYmxfRkFEVC0+eHBtMWJfY250X2Jsayk7CiAJCXZhbHVlMSB8PSB2YWx1ZTI7CiAJCWJyZWFrOwogCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MOgkvKiA4LWJpdCBhY2Nlc3MgKi8KIAotCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTDogICAgICAgICAgLyogOC1iaXQgYWNjZXNzICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfcmVhZCAoOCwgJnZhbHVlMSwgJmFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsayk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZ2YWx1ZTEsCisJCQkJCSAgICZhY3BpX2dibF9GQURULT54cG0yX2NudF9ibGspOwogCQlicmVhazsKIAorCWNhc2UgQUNQSV9SRUdJU1RFUl9QTV9USU1FUjoJLyogMzItYml0IGFjY2VzcyAqLwogCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNX1RJTUVSOiAgICAgICAgICAgICAvKiAzMi1iaXQgYWNjZXNzICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfcmVhZCAoMzIsICZ2YWx1ZTEsICZhY3BpX2dibF9GQURULT54cG1fdG1yX2Jsayk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDMyLCAmdmFsdWUxLAorCQkJCQkgICAmYWNwaV9nYmxfRkFEVC0+eHBtX3Rtcl9ibGspOwogCQlicmVhazsKIAotCWNhc2UgQUNQSV9SRUdJU1RFUl9TTUlfQ09NTUFORF9CTE9DSzogICAgLyogOC1iaXQgYWNjZXNzICovCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1NNSV9DT01NQU5EX0JMT0NLOgkvKiA4LWJpdCBhY2Nlc3MgKi8KIAotCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcG9ydCAoYWNwaV9nYmxfRkFEVC0+c21pX2NtZCwgJnZhbHVlMSwgOCk7CisJCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wb3J0KGFjcGlfZ2JsX0ZBRFQtPnNtaV9jbWQsICZ2YWx1ZTEsIDgpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBSZWdpc3RlciBJRDogJVhcbiIsCi0JCQlyZWdpc3Rlcl9pZCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBSZWdpc3RlciBJRDogJVhcbiIsCisJCQkJICByZWdpc3Rlcl9pZCkpOwogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlicmVhazsKIAl9CiAKLXVubG9ja19hbmRfZXhpdDoKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKIAlpZiAoQUNQSV9NVFhfTE9DSyA9PSB1c2VfbG9jaykgewotCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9IQVJEV0FSRSk7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7CiAJfQogCi0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkqcmV0dXJuX3ZhbHVlID0gdmFsdWUxOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUKQEAgLTYxMCwxMDkgKzYwMiwxMTIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfbG9jaywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2lkLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpCithY3BpX3N0YXR1cyBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKHU4IHVzZV9sb2NrLCB1MzIgcmVnaXN0ZXJfaWQsIHUzMiB2YWx1ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJod19yZWdpc3Rlcl93cml0ZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaHdfcmVnaXN0ZXJfd3JpdGUiKTsKIAogCWlmIChBQ1BJX01UWF9MT0NLID09IHVzZV9sb2NrKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfSEFSRFdBUkUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAlzd2l0Y2ggKHJlZ2lzdGVyX2lkKSB7Ci0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVM6ICAgICAgICAgICAvKiAxNi1iaXQgYWNjZXNzICovCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVM6CS8qIDE2LWJpdCBhY2Nlc3MgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoMTYsIHZhbHVlLCAmYWNwaV9nYmxfRkFEVC0+eHBtMWFfZXZ0X2Jsayk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCB2YWx1ZSwKKwkJCQkJICAgICZhY3BpX2dibF9GQURULT54cG0xYV9ldnRfYmxrKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCiAJCS8qIFBNMUIgaXMgb3B0aW9uYWwgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoMTYsIHZhbHVlLCAmYWNwaV9nYmxfRkFEVC0+eHBtMWJfZXZ0X2Jsayk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSgxNiwgdmFsdWUsCisJCQkJCSAgICAmYWNwaV9nYmxfRkFEVC0+eHBtMWJfZXZ0X2Jsayk7CiAJCWJyZWFrOwogCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEU6CS8qIDE2LWJpdCBhY2Nlc3MgKi8KIAotCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFOiAgICAgICAgICAgLyogMTYtYml0IGFjY2VzcyovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDE2LCB2YWx1ZSwgJmFjcGlfZ2JsX3hwbTFhX2VuYWJsZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCB2YWx1ZSwgJmFjcGlfZ2JsX3hwbTFhX2VuYWJsZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KIAogCQkvKiBQTTFCIGlzIG9wdGlvbmFsICovCiAKLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDE2LCB2YWx1ZSwgJmFjcGlfZ2JsX3hwbTFiX2VuYWJsZSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSgxNiwgdmFsdWUsICZhY3BpX2dibF94cG0xYl9lbmFibGUpOwogCQlicmVhazsKIAorCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTDoJLyogMTYtYml0IGFjY2VzcyAqLwogCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MOiAgICAgICAgICAvKiAxNi1iaXQgYWNjZXNzICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDE2LCB2YWx1ZSwgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2NudF9ibGspOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSgxNiwgdmFsdWUsCisJCQkJCSAgICAmYWNwaV9nYmxfRkFEVC0+eHBtMWFfY250X2Jsayk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KIAotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoMTYsIHZhbHVlLCAmYWNwaV9nYmxfRkFEVC0+eHBtMWJfY250X2Jsayk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSgxNiwgdmFsdWUsCisJCQkJCSAgICAmYWNwaV9nYmxfRkFEVC0+eHBtMWJfY250X2Jsayk7CiAJCWJyZWFrOwogCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMUFfQ09OVFJPTDoJLyogMTYtYml0IGFjY2VzcyAqLwogCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMUFfQ09OVFJPTDogICAgICAgICAvKiAxNi1iaXQgYWNjZXNzICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDE2LCB2YWx1ZSwgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2NudF9ibGspOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoMTYsIHZhbHVlLAorCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2NudF9ibGspOwogCQlicmVhazsKIAorCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0w6CS8qIDE2LWJpdCBhY2Nlc3MgKi8KIAotCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0w6ICAgICAgICAgLyogMTYtYml0IGFjY2VzcyAqLwotCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlICgxNiwgdmFsdWUsICZhY3BpX2dibF9GQURULT54cG0xYl9jbnRfYmxrKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCB2YWx1ZSwKKwkJCQkJICAgICZhY3BpX2dibF9GQURULT54cG0xYl9jbnRfYmxrKTsKIAkJYnJlYWs7CiAKKwljYXNlIEFDUElfUkVHSVNURVJfUE0yX0NPTlRST0w6CS8qIDgtYml0IGFjY2VzcyAqLwogCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MOiAgICAgICAgICAvKiA4LWJpdCBhY2Nlc3MgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoOCwgdmFsdWUsICZhY3BpX2dibF9GQURULT54cG0yX2NudF9ibGspOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgdmFsdWUsCisJCQkJCSAgICAmYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrKTsKIAkJYnJlYWs7CiAKKwljYXNlIEFDUElfUkVHSVNURVJfUE1fVElNRVI6CS8qIDMyLWJpdCBhY2Nlc3MgKi8KIAotCWNhc2UgQUNQSV9SRUdJU1RFUl9QTV9USU1FUjogICAgICAgICAgICAgLyogMzItYml0IGFjY2VzcyAqLwotCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlICgzMiwgdmFsdWUsICZhY3BpX2dibF9GQURULT54cG1fdG1yX2Jsayk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSgzMiwgdmFsdWUsCisJCQkJCSAgICAmYWNwaV9nYmxfRkFEVC0+eHBtX3Rtcl9ibGspOwogCQlicmVhazsKIAotCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1NNSV9DT01NQU5EX0JMT0NLOiAgICAvKiA4LWJpdCBhY2Nlc3MgKi8KKwljYXNlIEFDUElfUkVHSVNURVJfU01JX0NPTU1BTkRfQkxPQ0s6CS8qIDgtYml0IGFjY2VzcyAqLwogCiAJCS8qIFNNSV9DTUQgaXMgY3VycmVudGx5IGFsd2F5cyBpbiBJTyBzcGFjZSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCAoYWNwaV9nYmxfRkFEVC0+c21pX2NtZCwgdmFsdWUsIDgpOworCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoYWNwaV9nYmxfRkFEVC0+c21pX2NtZCwgdmFsdWUsIDgpOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJYnJlYWs7CiAJfQogCi11bmxvY2tfYW5kX2V4aXQ6CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CiAJaWYgKEFDUElfTVRYX0xPQ0sgPT0gdXNlX2xvY2spIHsKLQkJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfSEFSRFdBUkUpOworCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfSEFSRFdBUkUpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQKQEAgLTcyOCwxNyArNzIzLDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19sb3dfbGV2ZWxfcmVhZCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgICpyZWcpCithY3BpX2h3X2xvd19sZXZlbF9yZWFkKHUzMiB3aWR0aCwgdTMyICogdmFsdWUsIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqcmVnKQogewotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1NjQgYWRkcmVzczsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoImh3X2xvd19sZXZlbF9yZWFkIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImh3X2xvd19sZXZlbF9yZWFkIik7CiAKIAkvKgogCSAqIE11c3QgaGF2ZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBHQVMgc3RydWN0dXJlLCBhbmQKQEAgLTc1MSw3ICs3NDEsNyBAQAogCiAJLyogR2V0IGEgbG9jYWwgY29weSBvZiB0aGUgYWRkcmVzcy4gIEhhbmRsZXMgcG9zc2libGUgYWxpZ25tZW50IGlzc3VlcyAqLwogCi0JQUNQSV9NT1ZFXzY0X1RPXzY0ICgmYWRkcmVzcywgJnJlZy0+YWRkcmVzcyk7CisJQUNQSV9NT1ZFXzY0X1RPXzY0KCZhZGRyZXNzLCAmcmVnLT5hZGRyZXNzKTsKIAlpZiAoIWFkZHJlc3MpIHsKIAkJcmV0dXJuIChBRV9PSyk7CiAJfQpAQCAtNzY0LDM1ICs3NTQsMzIgQEAKIAlzd2l0Y2ggKHJlZy0+YWRkcmVzc19zcGFjZV9pZCkgewogCWNhc2UgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWToKIAotCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfbWVtb3J5ICgKLQkJCQkgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgYWRkcmVzcywKLQkJCQkgdmFsdWUsIHdpZHRoKTsKKwkJc3RhdHVzID0gYWNwaV9vc19yZWFkX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBhZGRyZXNzLAorCQkJCQkgICAgIHZhbHVlLCB3aWR0aCk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTzoKIAotCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcG9ydCAoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywKLQkJCQkgdmFsdWUsIHdpZHRoKTsKKwkJc3RhdHVzID0gYWNwaV9vc19yZWFkX3BvcnQoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywKKwkJCQkJICAgdmFsdWUsIHdpZHRoKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2U6ICVYXG4iLCByZWctPmFkZHJlc3Nfc3BhY2VfaWQpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlOiAlWFxuIiwKKwkJCQkgIHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpOwogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lPLAotCQkiUmVhZDogICU4LjhYIHdpZHRoICUyZCBmcm9tICU4LjhYJTguOFggKCVzKVxuIiwKLQkJKnZhbHVlLCB3aWR0aCwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSwKLQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLAorCQkJICAiUmVhZDogICU4LjhYIHdpZHRoICUyZCBmcm9tICU4LjhYJTguOFggKCVzKVxuIiwKKwkJCSAgKnZhbHVlLCB3aWR0aCwKKwkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MpLAorCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWctPmFkZHJlc3Nfc3BhY2VfaWQpKSk7CiAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZQpAQCAtODA4LDE3ICs3OTUsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgKnJlZykKK2FjcGlfaHdfbG93X2xldmVsX3dyaXRlKHUzMiB3aWR0aCwgdTMyIHZhbHVlLCBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKiByZWcpCiB7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXU2NCBhZGRyZXNzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiaHdfbG93X2xldmVsX3dyaXRlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImh3X2xvd19sZXZlbF93cml0ZSIpOwogCiAJLyoKIAkgKiBNdXN0IGhhdmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgR0FTIHN0cnVjdHVyZSwgYW5kCkBAIC04MzEsNyArODEzLDcgQEAKIAogCS8qIEdldCBhIGxvY2FsIGNvcHkgb2YgdGhlIGFkZHJlc3MuICBIYW5kbGVzIHBvc3NpYmxlIGFsaWdubWVudCBpc3N1ZXMgKi8KIAotCUFDUElfTU9WRV82NF9UT182NCAoJmFkZHJlc3MsICZyZWctPmFkZHJlc3MpOworCUFDUElfTU9WRV82NF9UT182NCgmYWRkcmVzcywgJnJlZy0+YWRkcmVzcyk7CiAJaWYgKCFhZGRyZXNzKSB7CiAJCXJldHVybiAoQUVfT0spOwogCX0KQEAgLTg0MywzMCArODI1LDI4IEBACiAJc3dpdGNoIChyZWctPmFkZHJlc3Nfc3BhY2VfaWQpIHsKIAljYXNlIEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlk6CiAKLQkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9tZW1vcnkgKAotCQkJCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBhZGRyZXNzLAotCQkJCSB2YWx1ZSwgd2lkdGgpOworCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBhZGRyZXNzLAorCQkJCQkgICAgICB2YWx1ZSwgd2lkdGgpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU86CiAKLQkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0ICgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLAotCQkJCSB2YWx1ZSwgd2lkdGgpOworCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywKKwkJCQkJICAgIHZhbHVlLCB3aWR0aCk7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlOiAlWFxuIiwgcmVnLT5hZGRyZXNzX3NwYWNlX2lkKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVW5zdXBwb3J0ZWQgYWRkcmVzcyBzcGFjZTogJVhcbiIsCisJCQkJICByZWctPmFkZHJlc3Nfc3BhY2VfaWQpKTsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywKLQkJIldyb3RlOiAlOC44WCB3aWR0aCAlMmQgICB0byAlOC44WCU4LjhYICglcylcbiIsCi0JCXZhbHVlLCB3aWR0aCwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSwKLQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLAorCQkJICAiV3JvdGU6ICU4LjhYIHdpZHRoICUyZCAgIHRvICU4LjhYJTguOFggKCVzKVxuIiwKKwkJCSAgdmFsdWUsIHdpZHRoLAorCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcyksCisJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpKTsKIAogCXJldHVybiAoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jCmluZGV4IDQxNWQzNDIuLjM0NTE5MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMKKysrIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYwpAQCAtNDYsOCArNDYsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9IQVJEV0FSRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiaHdzbGVlcCIpCi0KK0FDUElfTU9EVUxFX05BTUUoImh3c2xlZXAiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYxLDMwICs2MCwyNSBAQAogICogREVTQ1JJUFRJT046IEFjY2VzcyBmdW5jdGlvbiBmb3IgdGhlIGZpcm13YXJlX3dha2luZ192ZWN0b3IgZmllbGQgaW4gRkFDUwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yICgKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcGh5c2ljYWxfYWRkcmVzcykKK2FjcGlfc2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHBoeXNpY2FsX2FkZHJlc3MpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvciIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvciIpOwogCiAJLyogU2V0IHRoZSB2ZWN0b3IgKi8KIAogCWlmIChhY3BpX2dibF9jb21tb25fZkFDUy52ZWN0b3Jfd2lkdGggPT0gMzIpIHsKLQkJKihBQ1BJX0NBU1RfUFRSICh1MzIsIGFjcGlfZ2JsX2NvbW1vbl9mQUNTLmZpcm13YXJlX3dha2luZ192ZWN0b3IpKQotCQkJCT0gKHUzMikgcGh5c2ljYWxfYWRkcmVzczsKLQl9Ci0JZWxzZSB7Ci0JCSphY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yCi0JCQkJPSBwaHlzaWNhbF9hZGRyZXNzOworCQkqKEFDUElfQ0FTVF9QVFIKKwkJICAodTMyLCBhY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yKSkKKwkJICAgID0gKHUzMikgcGh5c2ljYWxfYWRkcmVzczsKKwl9IGVsc2UgeworCQkqYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZmlybXdhcmVfd2FraW5nX3ZlY3RvciA9IHBoeXNpY2FsX2FkZHJlc3M7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yCkBAIC0xMDEsMzMgKzk1LDMxIEBACiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IgKAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAqcGh5c2ljYWxfYWRkcmVzcykKK2FjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IoYWNwaV9waHlzaWNhbF9hZGRyZXNzICogcGh5c2ljYWxfYWRkcmVzcykKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yIik7CiAKIAlpZiAoIXBoeXNpY2FsX2FkZHJlc3MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIEdldCB0aGUgdmVjdG9yICovCiAKIAlpZiAoYWNwaV9nYmxfY29tbW9uX2ZBQ1MudmVjdG9yX3dpZHRoID09IDMyKSB7CiAJCSpwaHlzaWNhbF9hZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCSooQUNQSV9DQVNUX1BUUiAodTMyLCBhY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yKSk7Ci0JfQotCWVsc2UgeworCQkgICAgKgorCQkgICAgKEFDUElfQ0FTVF9QVFIKKwkJICAgICAodTMyLCBhY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yKSk7CisJfSBlbHNlIHsKIAkJKnBoeXNpY2FsX2FkZHJlc3MgPQotCQkJKmFjcGlfZ2JsX2NvbW1vbl9mQUNTLmZpcm13YXJlX3dha2luZ192ZWN0b3I7CisJCSAgICAqYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwCkBAIC0xNDMsMjUgKzEzNSwyMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcF9zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcCh1OCBzbGVlcF9zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICAgICBhcmdfbGlzdDsKLQl1bmlvbiBhY3BpX29iamVjdCAgICAgICAgICAgYXJnOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdDsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmc7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcCIpOwogCiAJLyoKIAkgKiBfUFNXIG1ldGhvZHMgY291bGQgYmUgcnVuIGhlcmUgdG8gZW5hYmxlIHdha2Utb24ga2V5Ym9hcmQsIExBTiwgZXRjLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YSAoc2xlZXBfc3RhdGUsCi0JCQkgICZhY3BpX2dibF9zbGVlcF90eXBlX2EsICZhY3BpX2dibF9zbGVlcF90eXBlX2IpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YShzbGVlcF9zdGF0ZSwKKwkJCQkJICAmYWNwaV9nYmxfc2xlZXBfdHlwZV9hLAorCQkJCQkgICZhY3BpX2dibF9zbGVlcF90eXBlX2IpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBTZXR1cCBwYXJhbWV0ZXIgb2JqZWN0ICovCkBAIC0xNzQsMTQgKzE2MywxNCBAQAogCiAJLyogUnVuIHRoZSBfUFRTIGFuZCBfR1RTIG1ldGhvZHMgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0IChOVUxMLCBNRVRIT0RfTkFNRV9fUFRTLCAmYXJnX2xpc3QsIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgTUVUSE9EX05BTUVfX1BUUywgJmFyZ19saXN0LCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCAoTlVMTCwgTUVUSE9EX05BTUVfX0dUUywgJmFyZ19saXN0LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsIE1FVEhPRF9OQU1FX19HVFMsICZhcmdfbGlzdCwgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogU2V0dXAgdGhlIGFyZ3VtZW50IHRvIF9TU1QgKi8KQEAgLTIwMiwyMiArMTkxLDIxIEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9JTkRJQ0FUT1JfT0ZGOyAvKiBEZWZhdWx0IGlzIG9mZiAqLworCQlhcmcuaW50ZWdlci52YWx1ZSA9IEFDUElfU1NUX0lORElDQVRPUl9PRkY7CS8qIERlZmF1bHQgaXMgb2ZmICovCiAJCWJyZWFrOwogCX0KIAogCS8qIFNldCB0aGUgc3lzdGVtIGluZGljYXRvcnMgdG8gc2hvdyB0aGUgZGVzaXJlZCBzbGVlcCBzdGF0ZS4gKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0IChOVUxMLCBNRVRIT0RfTkFNRV9fU1NULCAmYXJnX2xpc3QsIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQkgQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9TU1QgZmFpbGVkLCAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsIE1FVEhPRF9OQU1FX19TU1QsICZhcmdfbGlzdCwgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJNZXRob2QgX1NTVCBmYWlsZWQsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2VudGVyX3NsZWVwX3N0YXRlCkBAIC0yMzEsODAgKzIxOSw4MiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzIGFzbWxpbmthZ2UKLWFjcGlfZW50ZXJfc2xlZXBfc3RhdGUgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBfc3RhdGUpCithY3BpX3N0YXR1cyBhc21saW5rYWdlIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUodTggc2xlZXBfc3RhdGUpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTTFBY29udHJvbDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNMUJjb250cm9sOwotCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICAgKnNsZWVwX3R5cGVfcmVnX2luZm87Ci0Jc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gICAqc2xlZXBfZW5hYmxlX3JlZ19pbmZvOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fdmFsdWU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdTMyIFBNMUFjb250cm9sOworCXUzMiBQTTFCY29udHJvbDsKKwlzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqc2xlZXBfdHlwZV9yZWdfaW5mbzsKKwlzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqc2xlZXBfZW5hYmxlX3JlZ19pbmZvOworCXUzMiBpbl92YWx1ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2VudGVyX3NsZWVwX3N0YXRlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VudGVyX3NsZWVwX3N0YXRlIik7CiAKIAlpZiAoKGFjcGlfZ2JsX3NsZWVwX3R5cGVfYSA+IEFDUElfU0xFRVBfVFlQRV9NQVgpIHx8Ci0JCShhY3BpX2dibF9zbGVlcF90eXBlX2IgPiBBQ1BJX1NMRUVQX1RZUEVfTUFYKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTbGVlcCB2YWx1ZXMgb3V0IG9mIHJhbmdlOiBBPSVYIEI9JVhcbiIsCi0JCQlhY3BpX2dibF9zbGVlcF90eXBlX2EsIGFjcGlfZ2JsX3NsZWVwX3R5cGVfYikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1ZBTFVFKTsKKwkgICAgKGFjcGlfZ2JsX3NsZWVwX3R5cGVfYiA+IEFDUElfU0xFRVBfVFlQRV9NQVgpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiU2xlZXAgdmFsdWVzIG91dCBvZiByYW5nZTogQT0lWCBCPSVYXG4iLAorCQkJCSAgIGFjcGlfZ2JsX3NsZWVwX3R5cGVfYSwKKwkJCQkgICBhY3BpX2dibF9zbGVlcF90eXBlX2IpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1ZBTFVFKTsKIAl9CiAKLQlzbGVlcF90eXBlX3JlZ19pbmZvID0gYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8gKEFDUElfQklUUkVHX1NMRUVQX1RZUEVfQSk7Ci0Jc2xlZXBfZW5hYmxlX3JlZ19pbmZvID0gYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8gKEFDUElfQklUUkVHX1NMRUVQX0VOQUJMRSk7CisJc2xlZXBfdHlwZV9yZWdfaW5mbyA9CisJICAgIGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvKEFDUElfQklUUkVHX1NMRUVQX1RZUEVfQSk7CisJc2xlZXBfZW5hYmxlX3JlZ19pbmZvID0KKwkgICAgYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8oQUNQSV9CSVRSRUdfU0xFRVBfRU5BQkxFKTsKIAogCS8qIENsZWFyIHdha2Ugc3RhdHVzICovCiAKLQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlciAoQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMsIDEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBDbGVhciBhbGwgZml4ZWQgYW5kIGdlbmVyYWwgcHVycG9zZSBzdGF0dXMgYml0cyAqLwogCi0Jc3RhdHVzID0gYWNwaV9od19jbGVhcl9hY3BpX3N0YXR1cyAoQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXMoQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgogCSAqIDEpIERpc2FibGUvQ2xlYXIgYWxsIEdQRXMKIAkgKiAyKSBFbmFibGUgYWxsIHdha2V1cCBHUEVzCiAJICovCi0Jc3RhdHVzID0gYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzIChBQ1BJX0lTUik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAlhY3BpX2dibF9zeXN0ZW1fYXdha2VfYW5kX3J1bm5pbmcgPSBGQUxTRTsKIAotCXN0YXR1cyA9IGFjcGlfaHdfZW5hYmxlX2FsbF93YWtldXBfZ3BlcyAoQUNQSV9JU1IpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfaHdfZW5hYmxlX2FsbF93YWtldXBfZ3BlcygpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBHZXQgY3VycmVudCB2YWx1ZSBvZiBQTTFBIGNvbnRyb2wgKi8KIAotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwgJlBNMUFjb250cm9sKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJICAgICAgIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsICZQTTFBY29udHJvbCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULAotCQkiRW50ZXJpbmcgc2xlZXAgc3RhdGUgW1MlZF1cbiIsIHNsZWVwX3N0YXRlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULAorCQkJICAiRW50ZXJpbmcgc2xlZXAgc3RhdGUgW1MlZF1cbiIsIHNsZWVwX3N0YXRlKSk7CiAKIAkvKiBDbGVhciBTTFBfRU4gYW5kIFNMUF9UWVAgZmllbGRzICovCiAKIAlQTTFBY29udHJvbCAmPSB+KHNsZWVwX3R5cGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayB8Ci0JCQkgICBzbGVlcF9lbmFibGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayk7CisJCQkgc2xlZXBfZW5hYmxlX3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2spOwogCVBNMUJjb250cm9sID0gUE0xQWNvbnRyb2w7CiAKIAkvKiBJbnNlcnQgU0xQX1RZUCBiaXRzICovCiAKLQlQTTFBY29udHJvbCB8PSAoYWNwaV9nYmxfc2xlZXBfdHlwZV9hIDw8IHNsZWVwX3R5cGVfcmVnX2luZm8tPmJpdF9wb3NpdGlvbik7Ci0JUE0xQmNvbnRyb2wgfD0gKGFjcGlfZ2JsX3NsZWVwX3R5cGVfYiA8PCBzbGVlcF90eXBlX3JlZ19pbmZvLT5iaXRfcG9zaXRpb24pOworCVBNMUFjb250cm9sIHw9CisJICAgIChhY3BpX2dibF9zbGVlcF90eXBlX2EgPDwgc2xlZXBfdHlwZV9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKTsKKwlQTTFCY29udHJvbCB8PQorCSAgICAoYWNwaV9nYmxfc2xlZXBfdHlwZV9iIDw8IHNsZWVwX3R5cGVfcmVnX2luZm8tPmJpdF9wb3NpdGlvbik7CiAKIAkvKgogCSAqIFdlIHNwbGl0IHRoZSB3cml0ZXMgb2YgU0xQX1RZUCBhbmQgU0xQX0VOIHRvIHdvcmthcm91bmQKQEAgLTMxMywxNiArMzAzLDE4IEBACiAKIAkvKiBXcml0ZSAjMTogZmlsbCBpbiBTTFBfVFlQIGRhdGEgKi8KIAotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MLCBQTTFBY29udHJvbCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCQkJQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0wsCisJCQkJCVBNMUFjb250cm9sKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkgQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0wsIFBNMUJjb250cm9sKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCQlBQ1BJX1JFR0lTVEVSX1BNMUJfQ09OVFJPTCwKKwkJCQkJUE0xQmNvbnRyb2wpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBJbnNlcnQgU0xQX0VOQUJMRSBiaXQgKi8KQEAgLTMzMiwxOCArMzI0LDIwIEBACiAKIAkvKiBXcml0ZSAjMjogU0xQX1RZUCArIFNMUF9FTiAqLwogCi0JQUNQSV9GTFVTSF9DUFVfQ0FDSEUgKCk7CisJQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKIAotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MLCBQTTFBY29udHJvbCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCQkJQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0wsCisJCQkJCVBNMUFjb250cm9sKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkgQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0wsIFBNMUJjb250cm9sKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCQlBQ1BJX1JFR0lTVEVSX1BNMUJfQ09OVFJPTCwKKwkJCQkJUE0xQmNvbnRyb2wpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAlpZiAoc2xlZXBfc3RhdGUgPiBBQ1BJX1NUQVRFX1MzKSB7CkBAIC0zNTgsMzMgKzM1MiwzNCBAQAogCQkgKiBzdGlsbCByZWFkIHRoZSByaWdodCB2YWx1ZS4gSWRlYWxseSwgdGhpcyBibG9jayB3b3VsZCBnbwogCQkgKiBhd2F5IGVudGlyZWx5LgogCQkgKi8KLQkJYWNwaV9vc19zdGFsbCAoMTAwMDAwMDApOworCQlhY3BpX29zX3N0YWxsKDEwMDAwMDAwKTsKIAotCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywKLQkJCQkgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKLQkJCQkgc2xlZXBfZW5hYmxlX3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2spOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJCQlBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAorCQkJCQkJc2xlZXBfZW5hYmxlX3JlZ19pbmZvLT4KKwkJCQkJCWFjY2Vzc19iaXRfbWFzayk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAkvKiBXYWl0IHVudGlsIHdlIGVudGVyIHNsZWVwIHN0YXRlICovCiAKIAlkbyB7Ci0JCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyIChBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgJmluX3ZhbHVlLAotCQkJQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAmaW5fdmFsdWUsCisJCQkJCSAgIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qIFNwaW4gdW50aWwgd2Ugd2FrZSAqLwogCiAJfSB3aGlsZSAoIWluX3ZhbHVlKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTM5OSw2MCArMzk0LDU3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgYXNtbGlua2FnZQotYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9zNGJpb3MgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhc21saW5rYWdlIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zKHZvaWQpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl92YWx1ZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1MzIgaW5fdmFsdWU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9zNGJpb3MiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0YmlvcyIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlciAoQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMsIDEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2FjcGlfc3RhdHVzIChBQ1BJX01UWF9ET19OT1RfTE9DSyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9od19jbGVhcl9hY3BpX3N0YXR1cyhBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCiAJICogMSkgRGlzYWJsZS9DbGVhciBhbGwgR1BFcwogCSAqIDIpIEVuYWJsZSBhbGwgd2FrZXVwIEdQRXMKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2h3X2Rpc2FibGVfYWxsX2dwZXMgKEFDUElfSVNSKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X2Rpc2FibGVfYWxsX2dwZXMoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCWFjcGlfZ2JsX3N5c3RlbV9hd2FrZV9hbmRfcnVubmluZyA9IEZBTFNFOwogCi0Jc3RhdHVzID0gYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzIChBQ1BJX0lTUik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCUFDUElfRkxVU0hfQ1BVX0NBQ0hFICgpOworCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CiAKLQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQgKGFjcGlfZ2JsX0ZBRFQtPnNtaV9jbWQsCi0JCQkgKHUzMikgYWNwaV9nYmxfRkFEVC0+UzRiaW9zX3JlcSwgOCk7CisJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZ2JsX0ZBRFQtPnNtaV9jbWQsCisJCQkJICAgICh1MzIpIGFjcGlfZ2JsX0ZBRFQtPlM0Ymlvc19yZXEsIDgpOwogCiAJZG8gewogCQlhY3BpX29zX3N0YWxsKDEwMDApOwotCQlzdGF0dXMgPSBhY3BpX2dldF9yZWdpc3RlciAoQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMsICZpbl92YWx1ZSwKLQkJCUFDUElfTVRYX0RPX05PVF9MT0NLKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2dldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgJmluX3ZhbHVlLAorCQkJCQkgICBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9IHdoaWxlICghaW5fdmFsdWUpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9zNGJpb3MpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC00NjcsNTUgKzQ1OSw2MiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2xlYXZlX3NsZWVwX3N0YXRlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZSh1OCBzbGVlcF9zdGF0ZSkKIHsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAgICAgICAgIGFyZ19saXN0OwotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgYXJnOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICAgKnNsZWVwX3R5cGVfcmVnX2luZm87Ci0Jc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gICAqc2xlZXBfZW5hYmxlX3JlZ19pbmZvOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE0xQWNvbnRyb2w7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTTFCY29udHJvbDsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdDsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmc7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICpzbGVlcF90eXBlX3JlZ19pbmZvOworCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICpzbGVlcF9lbmFibGVfcmVnX2luZm87CisJdTMyIFBNMUFjb250cm9sOworCXUzMiBQTTFCY29udHJvbDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfbGVhdmVfc2xlZXBfc3RhdGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfbGVhdmVfc2xlZXBfc3RhdGUiKTsKIAogCS8qCiAJICogU2V0IFNMUF9UWVBFIGFuZCBTTFBfRU4gdG8gc3RhdGUgUzAuCiAJICogVGhpcyBpcyB1bmNsZWFyIGZyb20gdGhlIEFDUEkgU3BlYywgYnV0IGl0IGlzIHJlcXVpcmVkCiAJICogYnkgc29tZSBtYWNoaW5lcy4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEgKEFDUElfU1RBVEVfUzAsCi0JCQkgICZhY3BpX2dibF9zbGVlcF90eXBlX2EsICZhY3BpX2dibF9zbGVlcF90eXBlX2IpOwotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJc2xlZXBfdHlwZV9yZWdfaW5mbyA9IGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvIChBQ1BJX0JJVFJFR19TTEVFUF9UWVBFX0EpOwotCQlzbGVlcF9lbmFibGVfcmVnX2luZm8gPSBhY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyAoQUNQSV9CSVRSRUdfU0xFRVBfRU5BQkxFKTsKKwlzdGF0dXMgPSBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEoQUNQSV9TVEFURV9TMCwKKwkJCQkJICAmYWNwaV9nYmxfc2xlZXBfdHlwZV9hLAorCQkJCQkgICZhY3BpX2dibF9zbGVlcF90eXBlX2IpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzbGVlcF90eXBlX3JlZ19pbmZvID0KKwkJICAgIGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvKEFDUElfQklUUkVHX1NMRUVQX1RZUEVfQSk7CisJCXNsZWVwX2VuYWJsZV9yZWdfaW5mbyA9CisJCSAgICBhY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyhBQ1BJX0JJVFJFR19TTEVFUF9FTkFCTEUpOwogCiAJCS8qIEdldCBjdXJyZW50IHZhbHVlIG9mIFBNMUEgY29udHJvbCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkJIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsICZQTTFBY29udHJvbCk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCQkgICAgICAgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKKwkJCQkJICAgICAgICZQTTFBY29udHJvbCk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJLyogQ2xlYXIgU0xQX0VOIGFuZCBTTFBfVFlQIGZpZWxkcyAqLwogCiAJCQlQTTFBY29udHJvbCAmPSB+KHNsZWVwX3R5cGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayB8Ci0JCQkJCSAgIHNsZWVwX2VuYWJsZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKTsKKwkJCQkJIHNsZWVwX2VuYWJsZV9yZWdfaW5mby0+CisJCQkJCSBhY2Nlc3NfYml0X21hc2spOwogCQkJUE0xQmNvbnRyb2wgPSBQTTFBY29udHJvbDsKIAogCQkJLyogSW5zZXJ0IFNMUF9UWVAgYml0cyAqLwogCi0JCQlQTTFBY29udHJvbCB8PSAoYWNwaV9nYmxfc2xlZXBfdHlwZV9hIDw8IHNsZWVwX3R5cGVfcmVnX2luZm8tPmJpdF9wb3NpdGlvbik7Ci0JCQlQTTFCY29udHJvbCB8PSAoYWNwaV9nYmxfc2xlZXBfdHlwZV9iIDw8IHNsZWVwX3R5cGVfcmVnX2luZm8tPmJpdF9wb3NpdGlvbik7CisJCQlQTTFBY29udHJvbCB8PQorCQkJICAgIChhY3BpX2dibF9zbGVlcF90eXBlX2EgPDwgc2xlZXBfdHlwZV9yZWdfaW5mby0+CisJCQkgICAgIGJpdF9wb3NpdGlvbik7CisJCQlQTTFCY29udHJvbCB8PQorCQkJICAgIChhY3BpX2dibF9zbGVlcF90eXBlX2IgPDwgc2xlZXBfdHlwZV9yZWdfaW5mby0+CisJCQkgICAgIGJpdF9wb3NpdGlvbik7CiAKIAkJCS8qIEp1c3QgaWdub3JlIGFueSBlcnJvcnMgKi8KIAotCQkJKHZvaWQpIGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCQkgIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MLCBQTTFBY29udHJvbCk7Ci0JCQkodm9pZCkgYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkJCSAgQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0wsIFBNMUJjb250cm9sKTsKKwkJCSh2b2lkKWFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJCQkgICAgIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MLAorCQkJCQkJICAgICBQTTFBY29udHJvbCk7CisJCQkodm9pZClhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCQkJICAgICBBQ1BJX1JFR0lTVEVSX1BNMUJfQ09OVFJPTCwKKwkJCQkJCSAgICAgUE0xQmNvbnRyb2wpOwogCQl9CiAJfQogCkBAIC01MzIsMjMgKzUzMSwyMyBAQAogCS8qIElnbm9yZSBhbnkgZXJyb3JzIGZyb20gdGhlc2UgbWV0aG9kcyAqLwogCiAJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9XQUtJTkc7Ci0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QgKE5VTEwsIE1FVEhPRF9OQU1FX19TU1QsICZhcmdfbGlzdCwgTlVMTCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfU1NUIGZhaWxlZCwgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBNRVRIT0RfTkFNRV9fU1NULCAmYXJnX2xpc3QsIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTWV0aG9kIF9TU1QgZmFpbGVkLCAlc1xuIiwKKwkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCX0KIAogCWFyZy5pbnRlZ2VyLnZhbHVlID0gc2xlZXBfc3RhdGU7Ci0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QgKE5VTEwsIE1FVEhPRF9OQU1FX19CRlMsICZhcmdfbGlzdCwgTlVMTCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfQkZTIGZhaWxlZCwgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBNRVRIT0RfTkFNRV9fQkZTLCAmYXJnX2xpc3QsIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTWV0aG9kIF9CRlMgZmFpbGVkLCAlc1xuIiwKKwkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0IChOVUxMLCBNRVRIT0RfTkFNRV9fV0FLLCAmYXJnX2xpc3QsIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNZXRob2QgX1dBSyBmYWlsZWQsICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgTUVUSE9EX05BTUVfX1dBSywgJmFyZ19saXN0LCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk1ldGhvZCBfV0FLIGZhaWxlZCwgJXNcbiIsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAJLyogVEJEOiBfV0FLICJzb21ldGltZXMiIHJldHVybnMgc3R1ZmYgLSBkbyB3ZSB3YW50IHRvIGxvb2sgYXQgaXQ/ICovCiAKQEAgLTU1NywzMyArNTU2LDM1IEBACiAJICogMSkgRGlzYWJsZS9DbGVhciBhbGwgR1BFcwogCSAqIDIpIEVuYWJsZSBhbGwgcnVudGltZSBHUEVzCiAJICovCi0Jc3RhdHVzID0gYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzIChBQ1BJX05PVF9JU1IpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcygpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAJYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nID0gVFJVRTsKIAotCXN0YXR1cyA9IGFjcGlfaHdfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMgKEFDUElfTk9UX0lTUik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9od19lbmFibGVfYWxsX3J1bnRpbWVfZ3BlcygpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBFbmFibGUgcG93ZXIgYnV0dG9uICovCiAKLQkodm9pZCkgYWNwaV9zZXRfcmVnaXN0ZXIoCi0JCQlhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfRVZFTlRfUE9XRVJfQlVUVE9OXS5lbmFibGVfcmVnaXN0ZXJfaWQsCi0JCQkxLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJKHZvaWQpCisJICAgIGFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm8KKwkJCSAgICAgIFtBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uZW5hYmxlX3JlZ2lzdGVyX2lkLCAxLAorCQkJICAgICAgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCi0JKHZvaWQpIGFjcGlfc2V0X3JlZ2lzdGVyKAotCQkJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uc3RhdHVzX3JlZ2lzdGVyX2lkLAotCQkJMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCSh2b2lkKQorCSAgICBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvCisJCQkgICAgICBbQUNQSV9FVkVOVF9QT1dFUl9CVVRUT05dLnN0YXR1c19yZWdpc3Rlcl9pZCwgMSwKKwkJCSAgICAgIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKIAogCWFyZy5pbnRlZ2VyLnZhbHVlID0gQUNQSV9TU1RfV09SS0lORzsKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCAoTlVMTCwgTUVUSE9EX05BTUVfX1NTVCwgJmFyZ19saXN0LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9TU1QgZmFpbGVkLCAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsIE1FVEhPRF9OQU1FX19TU1QsICZhcmdfbGlzdCwgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJNZXRob2QgX1NTVCBmYWlsZWQsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMKaW5kZXggNDlkN2IzOS4uYWZmNmRjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYworKysgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jCkBAIC00Niw4ICs0Niw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJod3RpbWVyIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiaHd0aW1lciIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MCwyOSArNTksMjMgQEAKICAqIERFU0NSSVBUSU9OOiBPYnRhaW5zIHJlc29sdXRpb24gb2YgdGhlIEFDUEkgUE0gVGltZXIgKDI0IG9yIDMyIGJpdHMpLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2dldF90aW1lcl9yZXNvbHV0aW9uICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXNvbHV0aW9uKQorYWNwaV9zdGF0dXMgYWNwaV9nZXRfdGltZXJfcmVzb2x1dGlvbih1MzIgKiByZXNvbHV0aW9uKQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF90aW1lcl9yZXNvbHV0aW9uIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF90aW1lcl9yZXNvbHV0aW9uIik7CiAKIAlpZiAoIXJlc29sdXRpb24pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCWlmICgwID09IGFjcGlfZ2JsX0ZBRFQtPnRtcl92YWxfZXh0KSB7CiAJCSpyZXNvbHV0aW9uID0gMjQ7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCSpyZXNvbHV0aW9uID0gMzI7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3RpbWVyCkBAIC05NSwyNiArODgsMjIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfdGltZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpY2tzKQorYWNwaV9zdGF0dXMgYWNwaV9nZXRfdGltZXIodTMyICogdGlja3MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9nZXRfdGltZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X3RpbWVyIik7CiAKIAlpZiAoIXRpY2tzKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF9yZWFkICgzMiwgdGlja3MsICZhY3BpX2dibF9GQURULT54cG1fdG1yX2Jsayk7CisJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfcmVhZCgzMiwgdGlja3MsICZhY3BpX2dibF9GQURULT54cG1fdG1yX2Jsayk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3RpbWVyKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF90aW1lcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xNDYsMjEgKzEzNSwxNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3RpbWVyX2R1cmF0aW9uICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3RpY2tzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3RpY2tzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWVfZWxhcHNlZCkKK2FjcGlfZ2V0X3RpbWVyX2R1cmF0aW9uKHUzMiBzdGFydF90aWNrcywgdTMyIGVuZF90aWNrcywgdTMyICogdGltZV9lbGFwc2VkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFfdGlja3M7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBxdW90aWVudDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGRlbHRhX3RpY2tzOworCWFjcGlfaW50ZWdlciBxdW90aWVudDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X3RpbWVyX2R1cmF0aW9uIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF90aW1lcl9kdXJhdGlvbiIpOwogCiAJaWYgKCF0aW1lX2VsYXBzZWQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qCkBAIC0xNjksMjIgKzE1MywyMiBAQAogCSAqLwogCWlmIChzdGFydF90aWNrcyA8IGVuZF90aWNrcykgewogCQlkZWx0YV90aWNrcyA9IGVuZF90aWNrcyAtIHN0YXJ0X3RpY2tzOwotCX0KLQllbHNlIGlmIChzdGFydF90aWNrcyA+IGVuZF90aWNrcykgeworCX0gZWxzZSBpZiAoc3RhcnRfdGlja3MgPiBlbmRfdGlja3MpIHsKIAkJaWYgKDAgPT0gYWNwaV9nYmxfRkFEVC0+dG1yX3ZhbF9leHQpIHsKIAkJCS8qIDI0LWJpdCBUaW1lciAqLwogCi0JCQlkZWx0YV90aWNrcyA9ICgoKDB4MDBGRkZGRkYgLSBzdGFydF90aWNrcykgKyBlbmRfdGlja3MpICYgMHgwMEZGRkZGRik7Ci0JCX0KLQkJZWxzZSB7CisJCQlkZWx0YV90aWNrcyA9CisJCQkgICAgKCgoMHgwMEZGRkZGRiAtIHN0YXJ0X3RpY2tzKSArCisJCQkgICAgICBlbmRfdGlja3MpICYgMHgwMEZGRkZGRik7CisJCX0gZWxzZSB7CiAJCQkvKiAzMi1iaXQgVGltZXIgKi8KIAogCQkJZGVsdGFfdGlja3MgPSAoMHhGRkZGRkZGRiAtIHN0YXJ0X3RpY2tzKSArIGVuZF90aWNrczsKIAkJfQotCX0KLQllbHNlIC8qIHN0YXJ0X3RpY2tzID09IGVuZF90aWNrcyAqLyB7CisJfSBlbHNlIHsJCS8qIHN0YXJ0X3RpY2tzID09IGVuZF90aWNrcyAqLworCiAJCSp0aW1lX2VsYXBzZWQgPSAwOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKgpAQCAtMTkyLDEyICsxNzYsMTEgQEAKIAkgKgogCSAqIHRpbWVfZWxhcHNlZCA9IChkZWx0YV90aWNrcyAqIDEwMDAwMDApIC8gUE1fVElNRVJfRlJFUVVFTkNZOwogCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfc2hvcnRfZGl2aWRlICgoKHU2NCkgZGVsdGFfdGlja3MpICogMTAwMDAwMCwKLQkJCSBQTV9USU1FUl9GUkVRVUVOQ1ksICZxdW90aWVudCwgTlVMTCk7CisJc3RhdHVzID0gYWNwaV91dF9zaG9ydF9kaXZpZGUoKCh1NjQpIGRlbHRhX3RpY2tzKSAqIDEwMDAwMDAsCisJCQkJICAgICAgUE1fVElNRVJfRlJFUVVFTkNZLCAmcXVvdGllbnQsIE5VTEwpOwogCiAJKnRpbWVfZWxhcHNlZCA9ICh1MzIpIHF1b3RpZW50OwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAogRVhQT1JUX1NZTUJPTChhY3BpX2dldF90aW1lcl9kdXJhdGlvbik7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ob3RrZXkuYyBiL2RyaXZlcnMvYWNwaS9ob3RrZXkuYwppbmRleCAxZjc2YTQwLi4yZTJlNDA1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hvdGtleS5jCisrKyBiL2RyaXZlcnMvYWNwaS9ob3RrZXkuYwpAQCAtNjIsNyArNjIsNyBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgICAgICBBQ1BJX0hPVEtFWV9DT01QT05FTlQKIEFDUElfTU9EVUxFX05BTUUoImFjcGlfaG90a2V5IikKIAotTU9EVUxFX0FVVEhPUigibHVtaW5nLnl1QGludGVsLmNvbSIpOworICAgIE1PRFVMRV9BVVRIT1IoImx1bWluZy55dUBpbnRlbC5jb20iKTsKIE1PRFVMRV9ERVNDUklQVElPTihBQ1BJX0hPVEtfTkFNRSk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKQEAgLTE4MCw4ICsxODAsOCBAQAogc3RhdGljIGludCBob3RrZXlfcG9sbF9jb25maWdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CiBzdGF0aWMgaW50IGhvdGtleV9wb2xsaW5nX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIHVuaW9uIGFjcGlfaG90a2V5ICpnZXRfaG90a2V5X2J5X2V2ZW50KHN0cnVjdAotCQkJICAgICAgYWNwaV9ob3RrZXlfbGlzdAotCQkJICAgICAgKmhvdGtleV9saXN0LCBpbnQgZXZlbnQpOworCQkJCQkgICAgICBhY3BpX2hvdGtleV9saXN0CisJCQkJCSAgICAgICpob3RrZXlfbGlzdCwgaW50IGV2ZW50KTsKIAogLyogZXZlbnQgYmFzZWQgY29uZmlnICovCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3RrZXlfY29uZmlnX2ZvcHMgPSB7CkBAIC0yNDYsNyArMjQ2LDcgQEAKIHN0YXRpYyBjaGFyICpmb3JtYXRfcmVzdWx0KHVuaW9uIGFjcGlfb2JqZWN0ICpvYmplY3QpCiB7CiAJY2hhciAqYnVmID0gTlVMTDsKLQkKKwogCWJ1ZiA9IChjaGFyICopa21hbGxvYyhSRVNVTFRfU1RSX0xFTiwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ1ZikKIAkJbWVtc2V0KGJ1ZiwgMCwgUkVTVUxUX1NUUl9MRU4pOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJLyogTm93LCBqdXN0IHN1cHBvcnQgaW50ZWdlciB0eXBlICovCiAJaWYgKG9iamVjdC0+dHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikKIAkJc3ByaW50ZihidWYsICIlZFxuIiwgKHUzMikgb2JqZWN0LT5pbnRlZ2VyLnZhbHVlKTsKLWRvX2ZhaWw6CisgICAgICBkb19mYWlsOgogCXJldHVybiAoYnVmKTsKIH0KIApAQCAtMjY4LDkgKzI2OCw5IEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfcG9sbGluZ19zZXFfc2hvdyIpOwogCi0JaWYgKHBvbGxfaG90a2V5LT5wb2xsX3Jlc3VsdCl7CisJaWYgKHBvbGxfaG90a2V5LT5wb2xsX3Jlc3VsdCkgewogCQlidWYgPSBmb3JtYXRfcmVzdWx0KHBvbGxfaG90a2V5LT5wb2xsX3Jlc3VsdCk7Ci0JCWlmKGJ1ZikKKwkJaWYgKGJ1ZikKIAkJCXNlcV9wcmludGYoc2VxLCAiJXMiLCBidWYpOwogCQlrZnJlZShidWYpOwogCX0KQEAgLTI5OSw3ICsyOTksNyBAQAogCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KIAkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7CiAJCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQKLQkJICAgICYmIGtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW0gPT0gZXZlbnQpeworCQkgICAgJiYga2V5LT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSA9PSBldmVudCkgewogCQkJdmFsID0ga2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW07CiAJCQlicmVhazsKIAkJfQpAQCAtMzQzLDcgKzM0Myw3IEBACiBzdGF0aWMgaW50IGNyZWF0ZV9wb2xsaW5nX3Byb2ModW5pb24gYWNwaV9ob3RrZXkgKmRldmljZSkKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7Ci0JY2hhciAgcHJvY19uYW1lWzgwXTsKKwljaGFyIHByb2NfbmFtZVs4MF07CiAJbW9kZV90IG1vZGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJjcmVhdGVfcG9sbGluZ19wcm9jIik7CkBAIC0zNTEsOCArMzUxLDggQEAKIAogCXNwcmludGYocHJvY19uYW1lLCAiJWQiLCBkZXZpY2UtPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSk7CiAJLyoKLQlzdHJjYXQocHJvY19uYW1lLCBkZXZpY2UtPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kKTsKLQkqLworCSAgIHN0cmNhdChwcm9jX25hbWUsIGRldmljZS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QpOworCSAqLwogCXByb2MgPSBjcmVhdGVfcHJvY19lbnRyeShwcm9jX25hbWUsIG1vZGUsIGhvdGtleV9wcm9jX2Rpcik7CiAKIAlpZiAoIXByb2MpIHsKQEAgLTQxNSw1MCArNDE1LDUwIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgaW50ICBob3RrZXlfdXBkYXRlKHVuaW9uIGFjcGlfaG90a2V5ICprZXkpCitzdGF0aWMgaW50IGhvdGtleV91cGRhdGUodW5pb24gYWNwaV9ob3RrZXkgKmtleSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiaG90a2V5X3VwZGF0ZSIpOwogCiAJbGlzdF9mb3JfZWFjaChlbnRyaWVzLCBnbG9iYWxfaG90a2V5X2xpc3QuZW50cmllcykgewotCQl1bmlvbiBhY3BpX2hvdGtleSAqdG1wPQorCQl1bmlvbiBhY3BpX2hvdGtleSAqdG1wID0KIAkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7CiAJCWlmICh0bXAtPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSA9PQogCQkgICAga2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0pIHsKIAkJCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQpIHsKIAkJCQlmcmVlX2hvdGtleV9idWZmZXIodG1wKTsKIAkJCQl0bXAtPmV2ZW50X2hvdGtleS5idXNfaGFuZGxlID0KLQkJCSAgICAJCWtleS0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGU7CisJCQkJICAgIGtleS0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGU7CiAJCQkJdG1wLT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSA9Ci0JCQkgICAgCQlrZXktPmV2ZW50X2hvdGtleS5leHRlcm5hbF9ob3RrZXlfbnVtOworCQkJCSAgICBrZXktPmV2ZW50X2hvdGtleS5leHRlcm5hbF9ob3RrZXlfbnVtOwogCQkJCXRtcC0+ZXZlbnRfaG90a2V5LmFjdGlvbl9oYW5kbGUgPQotCQkJICAgIAkJa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZTsKKwkJCQkgICAga2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZTsKIAkJCQl0bXAtPmV2ZW50X2hvdGtleS5hY3Rpb25fbWV0aG9kID0KLQkJCSAgICAJCWtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2Q7CisJCQkJICAgIGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2Q7CiAJCQkJa2ZyZWUoa2V5KTsKIAkJCX0gZWxzZSB7CiAJCQkJLyoKLQkJCQljaGFyICBwcm9jX25hbWVbODBdOworCQkJCSAgIGNoYXIgIHByb2NfbmFtZVs4MF07CiAKLQkJCQlzcHJpbnRmKHByb2NfbmFtZSwgIiVkIiwgdG1wLT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0pOwotCQkJCXN0cmNhdChwcm9jX25hbWUsIHRtcC0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QpOwotCQkJCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfbmFtZSxob3RrZXlfcHJvY19kaXIpOwotCQkJCSovCisJCQkJICAgc3ByaW50Zihwcm9jX25hbWUsICIlZCIsIHRtcC0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKTsKKwkJCQkgICBzdHJjYXQocHJvY19uYW1lLCB0bXAtPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kKTsKKwkJCQkgICByZW1vdmVfcHJvY19lbnRyeShwcm9jX25hbWUsaG90a2V5X3Byb2NfZGlyKTsKKwkJCQkgKi8KIAkJCQlmcmVlX3BvbGxfaG90a2V5X2J1ZmZlcih0bXApOwogCQkJCXRtcC0+cG9sbF9ob3RrZXkucG9sbF9oYW5kbGUgPQotCQkJCQlrZXktPnBvbGxfaG90a2V5LnBvbGxfaGFuZGxlOworCQkJCSAgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfaGFuZGxlOwogCQkJCXRtcC0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QgPQotCQkJCQlrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kOworCQkJCSAgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kOwogCQkJCXRtcC0+cG9sbF9ob3RrZXkuYWN0aW9uX2hhbmRsZSA9Ci0JCQkJCWtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX2hhbmRsZTsKKwkJCQkgICAga2V5LT5wb2xsX2hvdGtleS5hY3Rpb25faGFuZGxlOwogCQkJCXRtcC0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9Ci0JCQkJCWtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZDsKKwkJCQkgICAga2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kOwogCQkJCXRtcC0+cG9sbF9ob3RrZXkucG9sbF9yZXN1bHQgPQotCQkJCQlrZXktPnBvbGxfaG90a2V5LnBvbGxfcmVzdWx0OworCQkJCSAgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfcmVzdWx0OwogCQkJCS8qCi0JCQkJY3JlYXRlX3BvbGxpbmdfcHJvYyh0bXApOwotCQkJCSovCisJCQkJICAgY3JlYXRlX3BvbGxpbmdfcHJvYyh0bXApOworCQkJCSAqLwogCQkJCWtmcmVlKGtleSk7CiAJCQl9CiAJCQlyZXR1cm5fVkFMVUUoMCk7CkBAIC00ODMsMjcgKzQ4MywyNSBAQAogCQkJCQkJICAgYWNwaV9ob3RrZXlfbm90aWZ5X2hhbmRsZXIpOwogCQlmcmVlX2hvdGtleV9idWZmZXIoa2V5KTsKIAl9IGVsc2UgewotCQljaGFyICBwcm9jX25hbWVbODBdOworCQljaGFyIHByb2NfbmFtZVs4MF07CiAKIAkJc3ByaW50Zihwcm9jX25hbWUsICIlZCIsIGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKTsKIAkJLyoKLQkJc3RyY2F0KHByb2NfbmFtZSwga2V5LT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCk7Ci0JCSovCi0JCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfbmFtZSxob3RrZXlfcHJvY19kaXIpOworCQkgICBzdHJjYXQocHJvY19uYW1lLCBrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kKTsKKwkJICovCisJCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfbmFtZSwgaG90a2V5X3Byb2NfZGlyKTsKIAkJZnJlZV9wb2xsX2hvdGtleV9idWZmZXIoa2V5KTsKIAl9CiAJa2ZyZWUoa2V5KTsKIAlyZXR1cm5fVk9JRDsKIH0KIAotc3RhdGljIHZvaWQKLWZyZWVfaG90a2V5X2J1ZmZlcih1bmlvbiBhY3BpX2hvdGtleSAqa2V5KQorc3RhdGljIHZvaWQgZnJlZV9ob3RrZXlfYnVmZmVyKHVuaW9uIGFjcGlfaG90a2V5ICprZXkpCiB7CiAJa2ZyZWUoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCk7CiB9CiAKLXN0YXRpYyB2b2lkCi1mcmVlX3BvbGxfaG90a2V5X2J1ZmZlcih1bmlvbiBhY3BpX2hvdGtleSAqa2V5KQorc3RhdGljIHZvaWQgZnJlZV9wb2xsX2hvdGtleV9idWZmZXIodW5pb24gYWNwaV9ob3RrZXkgKmtleSkKIHsKIAlrZnJlZShrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2QpOwogCWtmcmVlKGtleS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QpOwpAQCAtNTEzLDE1ICs1MTEsMTUgQEAKIGluaXRfaG90a2V5X2RldmljZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5LCBjaGFyICpidXNfc3RyLCBjaGFyICphY3Rpb25fc3RyLAogCQkgICBjaGFyICptZXRob2QsIGludCBzdGRfbnVtLCBpbnQgZXh0ZXJuYWxfbnVtKQogewotCWFjcGlfaGFuZGxlCXRtcF9oYW5kbGU7CisJYWNwaV9oYW5kbGUgdG1wX2hhbmRsZTsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImluaXRfaG90a2V5X2RldmljZSIpOwogCi0JaWYoc3RkX251bSA8IDAgfHwgSVNfUE9MTChzdGRfbnVtKSB8fCAha2V5ICkKKwlpZiAoc3RkX251bSA8IDAgfHwgSVNfUE9MTChzdGRfbnVtKSB8fCAha2V5KQogCQlnb3RvIGRvX2ZhaWw7CiAKLQlpZighYnVzX3N0ciB8fCAhYWN0aW9uX3N0ciB8fCAhbWV0aG9kKQorCWlmICghYnVzX3N0ciB8fCAhYWN0aW9uX3N0ciB8fCAhbWV0aG9kKQogCQlnb3RvIGRvX2ZhaWw7CiAKIAlrZXktPmxpbmsuaG90a2V5X3R5cGUgPSBBQ1BJX0hPVEtFWV9FVkVOVDsKQEAgLTUyOSwxOSArNTI3LDIyIEBACiAJa2V5LT5ldmVudF9ob3RrZXkuZmxhZyA9IDA7CiAJa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9IG1ldGhvZDsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLGJ1c19zdHIsICYoa2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZSkpOwotCWlmKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCXN0YXR1cyA9CisJICAgIGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBidXNfc3RyLCAmKGtleS0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGUpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCWdvdG8gZG9fZmFpbDsKIAlrZXktPmV2ZW50X2hvdGtleS5leHRlcm5hbF9ob3RrZXlfbnVtID0gZXh0ZXJuYWxfbnVtOwotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLGFjdGlvbl9zdHIsICYoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZSkpOwotCWlmKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCXN0YXR1cyA9CisJICAgIGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBhY3Rpb25fc3RyLAorCQkJICAgICYoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZSkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJZ290byBkb19mYWlsOwogCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlLAotCQkJCW1ldGhvZCwgJnRtcF9oYW5kbGUpOworCQkJCSBtZXRob2QsICZ0bXBfaGFuZGxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCWdvdG8gZG9fZmFpbDsKIAlyZXR1cm5fVkFMVUUoQUVfT0spOwotZG9fZmFpbDoKKyAgICAgIGRvX2ZhaWw6CiAJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogfQogCkBAIC01NTIsMTQgKzU1MywxNCBAQAogCQkJY2hhciAqYWN0aW9uX3N0ciwgY2hhciAqYWN0aW9uX21ldGhvZCwgaW50IHN0ZF9udW0pCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9oYW5kbGUJdG1wX2hhbmRsZTsKKwlhY3BpX2hhbmRsZSB0bXBfaGFuZGxlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiaW5pdF9wb2xsX2hvdGtleV9kZXZpY2UiKTsKIAotCWlmKHN0ZF9udW0gPCAwIHx8IElTX0VWRU5UKHN0ZF9udW0pIHx8ICFrZXkpCisJaWYgKHN0ZF9udW0gPCAwIHx8IElTX0VWRU5UKHN0ZF9udW0pIHx8ICFrZXkpCiAJCWdvdG8gZG9fZmFpbDsKIAotCWlmKCFwb2xsX3N0ciB8fCAhcG9sbF9tZXRob2QgfHwgIWFjdGlvbl9zdHIgfHwgIWFjdGlvbl9tZXRob2QpCisJaWYgKCFwb2xsX3N0ciB8fCAhcG9sbF9tZXRob2QgfHwgIWFjdGlvbl9zdHIgfHwgIWFjdGlvbl9tZXRob2QpCiAJCWdvdG8gZG9fZmFpbDsKIAogCWtleS0+bGluay5ob3RrZXlfdHlwZSA9IEFDUElfSE9US0VZX1BPTExJTkc7CkBAIC01NjgsMzAgKzU2OSwzMiBAQAogCWtleS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QgPSBwb2xsX21ldGhvZDsKIAlrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2QgPSBhY3Rpb25fbWV0aG9kOwogCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwscG9sbF9zdHIsICYoa2V5LT5wb2xsX2hvdGtleS5wb2xsX2hhbmRsZSkpOwotCWlmKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCXN0YXR1cyA9CisJICAgIGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBwb2xsX3N0ciwgJihrZXktPnBvbGxfaG90a2V5LnBvbGxfaGFuZGxlKSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlnb3RvIGRvX2ZhaWw7CiAJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGtleS0+cG9sbF9ob3RrZXkucG9sbF9oYW5kbGUsCi0JCQkJcG9sbF9tZXRob2QsICZ0bXBfaGFuZGxlKTsKLSAgICAgICAgaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotICAgICAgIAkJZ290byBkb19mYWlsOwotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLGFjdGlvbl9zdHIsICYoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25faGFuZGxlKSk7CisJCQkJIHBvbGxfbWV0aG9kLCAmdG1wX2hhbmRsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlnb3RvIGRvX2ZhaWw7CisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGFjdGlvbl9zdHIsCisJCQkgICAgJihrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9oYW5kbGUpKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCWdvdG8gZG9fZmFpbDsKIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25faGFuZGxlLAotCQkJCWFjdGlvbl9tZXRob2QsICZ0bXBfaGFuZGxlKTsKKwkJCQkgYWN0aW9uX21ldGhvZCwgJnRtcF9oYW5kbGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJZ290byBkb19mYWlsOwogCWtleS0+cG9sbF9ob3RrZXkucG9sbF9yZXN1bHQgPQogCSAgICAodW5pb24gYWNwaV9vYmplY3QgKilrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCksIEdGUF9LRVJORUwpOwotCWlmKCFrZXktPnBvbGxfaG90a2V5LnBvbGxfcmVzdWx0KQorCWlmICgha2V5LT5wb2xsX2hvdGtleS5wb2xsX3Jlc3VsdCkKIAkJZ290byBkb19mYWlsOwogCXJldHVybl9WQUxVRShBRV9PSyk7Ci1kb19mYWlsOgorICAgICAgZG9fZmFpbDoKIAlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiB9CiAKLQogc3RhdGljIGludCBob3RrZXlfb3Blbl9jb25maWcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiaG90a2V5X29wZW5fY29uZmlnIik7CkBAIC02NzksOCArNjgyLDkgQEAKIAogCXNzY2FuZihjb25maWdfcmVjb3JkLCAiJWQiLCBjbWQpOwogCi0JaWYoKmNtZCA9PSAxKXsKLQkJaWYoc3NjYW5mKGNvbmZpZ19yZWNvcmQsICIlZDolZCIsIGNtZCwgaW50ZXJuYWxfZXZlbnRfbnVtKSE9MikKKwlpZiAoKmNtZCA9PSAxKSB7CisJCWlmIChzc2NhbmYoY29uZmlnX3JlY29yZCwgIiVkOiVkIiwgY21kLCBpbnRlcm5hbF9ldmVudF9udW0pICE9CisJCSAgICAyKQogCQkJZ290byBkb19mYWlsOwogCQllbHNlCiAJCQlyZXR1cm4gKDYpOwpAQCAtNjk0LDggKzY5OCw4IEBACiAJCWdvdG8gZG9fZmFpbDsKIAogCWNvdW50ID0gdG1wMSAtIHRtcDsKLQkqYnVzX2hhbmRsZSA9IChjaGFyICopIGttYWxsb2MoY291bnQrMSwgR0ZQX0tFUk5FTCk7Ci0JaWYoISpidXNfaGFuZGxlKQorCSpidXNfaGFuZGxlID0gKGNoYXIgKilrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEqYnVzX2hhbmRsZSkKIAkJZ290byBkb19mYWlsOwogCXN0cm5jcHkoKmJ1c19oYW5kbGUsIHRtcCwgY291bnQpOwogCSooKmJ1c19oYW5kbGUgKyBjb3VudCkgPSAwOwpAQCAtNzA2LDggKzcxMCw4IEBACiAJaWYgKCF0bXAxKQogCQlnb3RvIGRvX2ZhaWw7CiAJY291bnQgPSB0bXAxIC0gdG1wOwotCSpidXNfbWV0aG9kID0gKGNoYXIgKikga21hbGxvYyhjb3VudCsxLCBHRlBfS0VSTkVMKTsKLQlpZighKmJ1c19tZXRob2QpCisJKmJ1c19tZXRob2QgPSAoY2hhciAqKWttYWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoISpidXNfbWV0aG9kKQogCQlnb3RvIGRvX2ZhaWw7CiAJc3RybmNweSgqYnVzX21ldGhvZCwgdG1wLCBjb3VudCk7CiAJKigqYnVzX21ldGhvZCArIGNvdW50KSA9IDA7CkBAIC03MTgsNyArNzIyLDcgQEAKIAlpZiAoIXRtcDEpCiAJCWdvdG8gZG9fZmFpbDsKIAljb3VudCA9IHRtcDEgLSB0bXA7Ci0JKmFjdGlvbl9oYW5kbGUgPSAoY2hhciAqKSBrbWFsbG9jKGNvdW50KzEsIEdGUF9LRVJORUwpOworCSphY3Rpb25faGFuZGxlID0gKGNoYXIgKilrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7CiAJc3RybmNweSgqYWN0aW9uX2hhbmRsZSwgdG1wLCBjb3VudCk7CiAJKigqYWN0aW9uX2hhbmRsZSArIGNvdW50KSA9IDA7CiAKQEAgLTcyOCwxNyArNzMyLDE4IEBACiAJaWYgKCF0bXAxKQogCQlnb3RvIGRvX2ZhaWw7CiAJY291bnQgPSB0bXAxIC0gdG1wOwotCSptZXRob2QgPSAoY2hhciAqKSBrbWFsbG9jKGNvdW50KzEsIEdGUF9LRVJORUwpOwotCWlmKCEqbWV0aG9kKQorCSptZXRob2QgPSAoY2hhciAqKWttYWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoISptZXRob2QpCiAJCWdvdG8gZG9fZmFpbDsKIAlzdHJuY3B5KCptZXRob2QsIHRtcCwgY291bnQpOwogCSooKm1ldGhvZCArIGNvdW50KSA9IDA7CiAKLQlpZihzc2NhbmYodG1wMSArIDEsICIlZDolZCIsIGludGVybmFsX2V2ZW50X251bSwgZXh0ZXJuYWxfZXZlbnRfbnVtKTw9MCkKKwlpZiAoc3NjYW5mKHRtcDEgKyAxLCAiJWQ6JWQiLCBpbnRlcm5hbF9ldmVudF9udW0sIGV4dGVybmFsX2V2ZW50X251bSkgPD0KKwkgICAgMCkKIAkJZ290byBkb19mYWlsOwogCiAJcmV0dXJuX1ZBTFVFKDYpOwotZG9fZmFpbDoKKyAgICAgIGRvX2ZhaWw6CiAJcmV0dXJuX1ZBTFVFKC0xKTsKIH0KIApAQCAtNzU4LDggKzc2Myw4IEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCgiaG90a2V5X3dyaXRlX2NvbmZpZyIpKTsKIAotCWNvbmZpZ19yZWNvcmQgPSAoY2hhciAqKSBrbWFsbG9jKGNvdW50KzEsIEdGUF9LRVJORUwpOwotCWlmKCFjb25maWdfcmVjb3JkKQorCWNvbmZpZ19yZWNvcmQgPSAoY2hhciAqKWttYWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbmZpZ19yZWNvcmQpCiAJCXJldHVybl9WQUxVRSgtRU5PTUVNKTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcihjb25maWdfcmVjb3JkLCBidWZmZXIsIGNvdW50KSkgewpAQCAtNzc3LDEwICs3ODIsMTAgQEAKIAkJCSZtZXRob2QsICZpbnRlcm5hbF9ldmVudF9udW0sICZleHRlcm5hbF9ldmVudF9udW0pOwogCiAJa2ZyZWUoY29uZmlnX3JlY29yZCk7Ci0JaWYoSVNfT1RIRVJTKGludGVybmFsX2V2ZW50X251bSkpCisJaWYgKElTX09USEVSUyhpbnRlcm5hbF9ldmVudF9udW0pKQogCQlnb3RvIGRvX2ZhaWw7CiAJaWYgKHJldCAhPSA2KSB7Ci1kb19mYWlsOgkKKwkgICAgICBkb19mYWlsOgogCQlrZnJlZShidXNfaGFuZGxlKTsKIAkJa2ZyZWUoYnVzX21ldGhvZCk7CiAJCWtmcmVlKGFjdGlvbl9oYW5kbGUpOwpAQCAtNzkxLDE0ICs3OTYsMTQgQEAKIAl9CiAKIAlrZXkgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX2hvdGtleSksIEdGUF9LRVJORUwpOwotCWlmKCFrZXkpCisJaWYgKCFrZXkpCiAJCWdvdG8gZG9fZmFpbDsKIAltZW1zZXQoa2V5LCAwLCBzaXplb2YodW5pb24gYWNwaV9ob3RrZXkpKTsKLQlpZihjbWQgPT0gMSkgeworCWlmIChjbWQgPT0gMSkgewogCQl1bmlvbiBhY3BpX2hvdGtleSAqdG1wID0gTlVMTDsKIAkJdG1wID0gZ2V0X2hvdGtleV9ieV9ldmVudCgmZ2xvYmFsX2hvdGtleV9saXN0LAotCQkJCWludGVybmFsX2V2ZW50X251bSk7Ci0JCWlmKCF0bXApCisJCQkJCSAgaW50ZXJuYWxfZXZlbnRfbnVtKTsKKwkJaWYgKCF0bXApCiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBrZXkiKSk7CiAJCWVsc2UKIAkJCW1lbWNweShrZXksIHRtcCwgc2l6ZW9mKHVuaW9uIGFjcGlfaG90a2V5KSk7CkBAIC04MDcsMTUgKzgxMiwxNiBAQAogCWlmIChJU19FVkVOVChpbnRlcm5hbF9ldmVudF9udW0pKSB7CiAJCWtmcmVlKGJ1c19tZXRob2QpOwogCQlyZXQgPSBpbml0X2hvdGtleV9kZXZpY2Uoa2V5LCBidXNfaGFuZGxlLCBhY3Rpb25faGFuZGxlLCBtZXRob2QsCi0JCQkJIGludGVybmFsX2V2ZW50X251bSwgZXh0ZXJuYWxfZXZlbnRfbnVtKTsKKwkJCQkJIGludGVybmFsX2V2ZW50X251bSwKKwkJCQkJIGV4dGVybmFsX2V2ZW50X251bSk7CiAJfSBlbHNlCiAJCXJldCA9IGluaXRfcG9sbF9ob3RrZXlfZGV2aWNlKGtleSwgYnVzX2hhbmRsZSwgYnVzX21ldGhvZCwKLQkJCQkgICAgICBhY3Rpb25faGFuZGxlLCBtZXRob2QsCi0JCQkJICAgICAgaW50ZXJuYWxfZXZlbnRfbnVtKTsKKwkJCQkJICAgICAgYWN0aW9uX2hhbmRsZSwgbWV0aG9kLAorCQkJCQkgICAgICBpbnRlcm5hbF9ldmVudF9udW0pOwogCWlmIChyZXQpIHsKIAkJa2ZyZWUoYnVzX2hhbmRsZSk7CiAJCWtmcmVlKGFjdGlvbl9oYW5kbGUpOwotCQlpZihJU19FVkVOVChpbnRlcm5hbF9ldmVudF9udW0pKQorCQlpZiAoSVNfRVZFTlQoaW50ZXJuYWxfZXZlbnRfbnVtKSkKIAkJCWZyZWVfaG90a2V5X2J1ZmZlcihrZXkpOwogCQllbHNlCiAJCQlmcmVlX3BvbGxfaG90a2V5X2J1ZmZlcihrZXkpOwpAQCAtODI0LDEzICs4MzAsMTQgQEAKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCX0KIAotY29udF9jbWQ6CisgICAgICBjb250X2NtZDoKIAlrZnJlZShidXNfaGFuZGxlKTsKIAlrZnJlZShhY3Rpb25faGFuZGxlKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSAwOgotCQlpZihnZXRfaG90a2V5X2J5X2V2ZW50KCZnbG9iYWxfaG90a2V5X2xpc3Qsa2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0pKQorCQlpZiAoZ2V0X2hvdGtleV9ieV9ldmVudAorCQkgICAgKCZnbG9iYWxfaG90a2V5X2xpc3QsIGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKSkKIAkJCWdvdG8gZmFpbF9vdXQ7CiAJCWVsc2UKIAkJCWhvdGtleV9hZGQoa2V5KTsKQEAgLTgzOSw3ICs4NDYsNyBAQAogCQlob3RrZXlfcmVtb3ZlKGtleSk7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJaWYoaG90a2V5X3VwZGF0ZShrZXkpKQorCQlpZiAoaG90a2V5X3VwZGF0ZShrZXkpKQogCQkJZ290byBmYWlsX291dDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTg0Nyw4ICs4NTQsOCBAQAogCQlicmVhazsKIAl9CiAJcmV0dXJuX1ZBTFVFKGNvdW50KTsKLWZhaWxfb3V0OgotCWlmKElTX0VWRU5UKGludGVybmFsX2V2ZW50X251bSkpCisgICAgICBmYWlsX291dDoKKwlpZiAoSVNfRVZFTlQoaW50ZXJuYWxfZXZlbnRfbnVtKSkKIAkJZnJlZV9ob3RrZXlfYnVmZmVyKGtleSk7CiAJZWxzZQogCQlmcmVlX3BvbGxfaG90a2V5X2J1ZmZlcihrZXkpOwpAQCAtODgyLDcgKzg4OSw4IEBACiAJcmV0dXJuX1ZBTFVFKHN0YXR1cyA9PSBBRV9PSyk7CiB9CiAKLXN0YXRpYyBpbnQgcmVhZF9hY3BpX2ludChhY3BpX2hhbmRsZSBoYW5kbGUsIGNvbnN0IGNoYXIgKm1ldGhvZCwgdW5pb24gYWNwaV9vYmplY3QgKnZhbCkKK3N0YXRpYyBpbnQgcmVhZF9hY3BpX2ludChhY3BpX2hhbmRsZSBoYW5kbGUsIGNvbnN0IGNoYXIgKm1ldGhvZCwKKwkJCSB1bmlvbiBhY3BpX29iamVjdCAqdmFsKQogewogCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQ7CiAJdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKQEAgLTg5Myw3ICs5MDEsNyBAQAogCW91dHB1dC5wb2ludGVyID0gJm91dF9vYmo7CiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIChjaGFyICopbWV0aG9kLCBOVUxMLCAmb3V0cHV0KTsKLQlpZih2YWwpeworCWlmICh2YWwpIHsKIAkJdmFsLT5pbnRlZ2VyLnZhbHVlID0gb3V0X29iai5pbnRlZ2VyLnZhbHVlOwogCQl2YWwtPnR5cGUgPSBvdXRfb2JqLnR5cGU7CiAJfSBlbHNlCkBAIC05MDMsOCArOTExLDggQEAKIH0KIAogc3RhdGljIHVuaW9uIGFjcGlfaG90a2V5ICpnZXRfaG90a2V5X2J5X2V2ZW50KHN0cnVjdAotCQkJICAgICAgYWNwaV9ob3RrZXlfbGlzdAotCQkJICAgICAgKmhvdGtleV9saXN0LCBpbnQgZXZlbnQpCisJCQkJCSAgICAgIGFjcGlfaG90a2V5X2xpc3QKKwkJCQkJICAgICAgKmhvdGtleV9saXN0LCBpbnQgZXZlbnQpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllczsKIApAQCAtOTEyLDEwICs5MjAsMTAgQEAKIAkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CiAJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOwogCQlpZiAoa2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0gPT0gZXZlbnQpIHsKLQkJCXJldHVybihrZXkpOworCQkJcmV0dXJuIChrZXkpOwogCQl9CiAJfQotCXJldHVybihOVUxMKTsKKwlyZXR1cm4gKE5VTEwpOwogfQogCiAvKgpAQCAtOTMyLDE1ICs5NDAsMTUgQEAKIHsKIAlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QgPSAmZ2xvYmFsX2hvdGtleV9saXN0OwogCWNoYXIgKmFyZzsKLQlpbnQgZXZlbnQsbWV0aG9kX3R5cGUsdHlwZSwgdmFsdWU7CisJaW50IGV2ZW50LCBtZXRob2RfdHlwZSwgdHlwZSwgdmFsdWU7CiAJdW5pb24gYWNwaV9ob3RrZXkgKmtleTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImhvdGtleV9leGVjdGVfYW1sX21ldGhvZCIpOwogCi0JYXJnID0gKGNoYXIgKikga21hbGxvYyhjb3VudCsxLCBHRlBfS0VSTkVMKTsKLQlpZighYXJnKQorCWFyZyA9IChjaGFyICopa21hbGxvYyhjb3VudCArIDEsIEdGUF9LRVJORUwpOworCWlmICghYXJnKQogCQlyZXR1cm5fVkFMVUUoLUVOT01FTSk7Ci0JYXJnW2NvdW50XT0wOworCWFyZ1tjb3VudF0gPSAwOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKGFyZywgYnVmZmVyLCBjb3VudCkpIHsKIAkJa2ZyZWUoYXJnKTsKQEAgLTk0OCw3ICs5NTYsOCBAQAogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAJfQogCi0JaWYgKHNzY2FuZihhcmcsICIlZDolZDolZDolZCIsICZldmVudCwgJm1ldGhvZF90eXBlLCAmdHlwZSwgJnZhbHVlKSAhPSA0KSB7CisJaWYgKHNzY2FuZihhcmcsICIlZDolZDolZDolZCIsICZldmVudCwgJm1ldGhvZF90eXBlLCAmdHlwZSwgJnZhbHVlKSAhPQorCSAgICA0KSB7CiAJCWtmcmVlKGFyZyk7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGFyZ3VtZW50IDMiKSk7CiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKQEAgLTk1NiwxOSArOTY1LDIxIEBACiAJa2ZyZWUoYXJnKTsKIAlpZiAodHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgewogCQlrZXkgPSBnZXRfaG90a2V5X2J5X2V2ZW50KGhvdGtleV9saXN0LCBldmVudCk7Ci0JCWlmKCFrZXkpCisJCWlmICgha2V5KQogCQkJZ290byBkb19mYWlsOwogCQlpZiAoSVNfRVZFTlQoZXZlbnQpKQogCQkJd3JpdGVfYWNwaV9pbnQoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZSwKLQkJCQkJa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCwgdmFsdWUsIE5VTEwpOworCQkJCSAgICAgICBrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25fbWV0aG9kLCB2YWx1ZSwKKwkJCQkgICAgICAgTlVMTCk7CiAJCWVsc2UgaWYgKElTX1BPTEwoZXZlbnQpKSB7Ci0JCQlpZiAoIG1ldGhvZF90eXBlID09IFBPTExfTUVUSE9EICkKKwkJCWlmIChtZXRob2RfdHlwZSA9PSBQT0xMX01FVEhPRCkKIAkJCQlyZWFkX2FjcGlfaW50KGtleS0+cG9sbF9ob3RrZXkucG9sbF9oYW5kbGUsCi0JCQkJCWtleS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QsCi0JCQkJCWtleS0+cG9sbF9ob3RrZXkucG9sbF9yZXN1bHQpOwotCQkJZWxzZSBpZiAoIG1ldGhvZF90eXBlID09IEFDVElPTl9NRVRIT0QgKQorCQkJCQkgICAgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kLAorCQkJCQkgICAgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfcmVzdWx0KTsKKwkJCWVsc2UgaWYgKG1ldGhvZF90eXBlID09IEFDVElPTl9NRVRIT0QpCiAJCQkJd3JpdGVfYWNwaV9pbnQoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25faGFuZGxlLAotCQkJCQlrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2QsIHZhbHVlLCBOVUxMKTsKKwkJCQkJICAgICAgIGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCwKKwkJCQkJICAgICAgIHZhbHVlLCBOVUxMKTsKIAkJCWVsc2UKIAkJCQlnb3RvIGRvX2ZhaWw7CiAKQEAgLTk3OCw3ICs5ODksNyBAQAogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAJfQogCXJldHVybl9WQUxVRShjb3VudCk7Ci1kb19mYWlsOgorICAgICAgZG9fZmFpbDoKIAlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKIH0KQEAgLTEwNzQsMTUgKzEwODUsMTUgQEAKIAogCXJldHVybiAoMCk7CiAKLWRvX2ZhaWw1OgorICAgICAgZG9fZmFpbDU6CiAJcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX0lORk8sIGhvdGtleV9wcm9jX2Rpcik7Ci1kb19mYWlsNDoKKyAgICAgIGRvX2ZhaWw0OgogCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9BQ1RJT04sIGhvdGtleV9wcm9jX2Rpcik7Ci1kb19mYWlsMzoKKyAgICAgIGRvX2ZhaWwzOgogCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9QTF9DT05GSUcsIGhvdGtleV9wcm9jX2Rpcik7Ci1kb19mYWlsMjoKKyAgICAgIGRvX2ZhaWwyOgogCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9FVl9DT05GSUcsIGhvdGtleV9wcm9jX2Rpcik7Ci1kb19mYWlsMToKKyAgICAgIGRvX2ZhaWwxOgogCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9QUk9DLCBhY3BpX3Jvb3RfZGlyKTsKIAlyZXR1cm4gKC1FTk9ERVYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2libV9hY3BpLmMgYi9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYwppbmRleCBhZDg1ZTEwLi41Y2MwOTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYwpAQCAtMiw3ICsyLDcgQEAKICAqICBpYm1fYWNwaS5jIC0gSUJNIFRoaW5rUGFkIEFDUEkgRXh0cmFzCiAgKgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQgQm9yaXNsYXYgRGVpYW5vdgorICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEJvcmlzbGF2IERlaWFub3YgPGJvcmlzbGF2QHVzZXJzLnNmLm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTcsMzggKzE3LDYyIEBACiAgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqCisgKi8KKworI2RlZmluZSBJQk1fVkVSU0lPTiAiMC4xMmEiCisKKy8qCiAgKiAgQ2hhbmdlbG9nOgotICoKLSAqICAyMDA0LTA4LTA5CTAuMQlpbml0aWFsIHJlbGVhc2UsIHN1cHBvcnQgZm9yIFggc2VyaWVzCi0gKiAgMjAwNC0wOC0xNAkwLjIJc3VwcG9ydCBmb3IgVCBzZXJpZXMsIFgyMAotICoJCQlibHVldG9vdGggZW5hYmxlL2Rpc2FibGUKLSAqCQkJaG90a2V5IGV2ZW50cyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gKgkJCXJlbW92ZWQgZmFuIGNvbnRyb2wsIGN1cnJlbnRseSB1c2VsZXNzCi0gKiAgMjAwNC0wOC0xNwkwLjMJc3VwcG9ydCBmb3IgUjQwCi0gKgkJCWxjZCBvZmYsIGJyaWdodG5lc3MgY29udHJvbAotICoJCQl0aGlua2xpZ2h0IG9uL29mZgotICogIDIwMDQtMDktMTYJMC40CXN1cHBvcnQgZm9yIG1vZHVsZSBwYXJhbWV0ZXJzCi0gKgkJCWhvdGtleSBtYXNrIGNhbiBiZSBwcmVmaXhlZCBieSAweAotICoJCQl2aWRlbyBvdXRwdXQgc3dpdGNoaW5nCi0gKgkJCXZpZGVvIGV4cGFuc2lvbiBjb250cm9sCi0gKgkJCXVsdHJhYmF5IGVqZWN0IHN1cHBvcnQKLSAqCQkJcmVtb3ZlZCBsY2QgYnJpZ2h0bmVzcy9vbi9vZmYgY29udHJvbCwgZGlkbid0IHdvcmsKKyAqICAKKyAqICAyMDA1LTA4LTE3ICAwLjEyCWZpeCBjb21waWxhdGlvbiBvbiAyLjYuMTMtcmMga2VybmVscworICogIDIwMDUtMDMtMTcJMC4xMQlzdXBwb3J0IGZvciA2MDBlLCA3NzB4CisgKgkJCSAgICB0aGFua3MgdG8gSmFtaWUgTGVudGluIDxsZW50aW5qQGRpYWwucGlwZXguY29tPgorICoJCQlzdXBwb3J0IGZvciA3NzBlLCBHNDEKKyAqCQkJRzQwIGFuZCBHNDEgZG9uJ3QgaGF2ZSBhIHRoaW5rbGlnaHQKKyAqCQkJdGVtcGVyYXR1cmVzIG5vIGxvbmdlciBleHBlcmltZW50YWwKKyAqCQkJZXhwZXJpbWVudGFsIGJyaWdodG5lc3MgY29udHJvbAorICoJCQlleHBlcmltZW50YWwgdm9sdW1lIGNvbnRyb2wKKyAqCQkJZXhwZXJpbWVudGFsIGZhbiBlbmFibGUvZGlzYWJsZQorICogIDIwMDUtMDEtMTYJMC4xMAlmaXggbW9kdWxlIGxvYWRpbmcgb24gUjMwLCBSMzEgCisgKiAgMjAwNS0wMS0xNgkwLjkJc3VwcG9ydCBmb3IgNTcwLCBSMzAsIFIzMQorICoJCQl1bHRyYWJheSBzdXBwb3J0IG9uIEEyMnAsIEEzeAorICoJCQlsaW1pdCBhcmcgZm9yIGNtb3MsIGxlZCwgYmVlcCwgZHJvcCBleHBlcmltZW50YWwgc3RhdHVzCisgKgkJCW1vcmUgY2FwYWJsZSBsZWQgY29udHJvbCBvbiBBMjFlLCBBMjJwLCBUMjAtMjIsIFgyMAorICoJCQlleHBlcmltZW50YWwgdGVtcGVyYXR1cmVzIGFuZCBmYW4gc3BlZWQKKyAqCQkJZXhwZXJpbWVudGFsIGVtYmVkZGVkIGNvbnRyb2xsZXIgcmVnaXN0ZXIgZHVtcAorICoJCQltYXJrIG1vcmUgZnVuY3Rpb25zIGFzIF9faW5pdCwgZHJvcCBpbmNvcnJlY3QgX19leGl0CisgKgkJCXVzZSBNT0RVTEVfVkVSU0lPTgorICoJCQkgICAgdGhhbmtzIHRvIEhlbnJpayBCcml4IEFuZGVyc2VuIDxicml4QGdlbnRvby5vcmc+CisgKgkJCWZpeCBwYXJhbWV0ZXIgcGFzc2luZyBvbiBtb2R1bGUgbG9hZGluZworICoJCQkgICAgdGhhbmtzIHRvIFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4KKyAqCQkJICAgIHRoYW5rcyB0byBKaW0gUmFkZm9yZCA8cmFkZm9yZEBibGFja2JlYW4ub3JnPgorICogIDIwMDQtMTEtMDgJMC44CWZpeCBpbml0IGVycm9yIGNhc2UsIGRvbid0IHJldHVybiBmcm9tIGEgbWFjcm8KKyAqCQkJICAgIHRoYW5rcyB0byBDaHJpcyBXcmlnaHQgPGNocmlzd0Bvc2RsLm9yZz4KKyAqICAyMDA0LTEwLTIzCTAuNwlmaXggbW9kdWxlIGxvYWRpbmcgb24gQTIxZSwgQTIycCwgVDIwLCBUMjEsIFgyMAorICoJCQlmaXggbGVkIGNvbnRyb2wgb24gQTIxZQorICogIDIwMDQtMTAtMTkJMC42CXVzZSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoKSB0byBjbGFpbSBIS0VZIGRldmljZQogICogIDIwMDQtMTAtMTgJMC41CXRoaW5rbGlnaHQgc3VwcG9ydCBvbiBBMjFlLCBHNDAsIFIzMiwgVDIwLCBUMjEsIFgyMAogICoJCQlwcm9jIGZpbGUgZm9ybWF0IGNoYW5nZWQKICAqCQkJdmlkZW9fc3dpdGNoIGNvbW1hbmQKICAqCQkJZXhwZXJpbWVudGFsIGNtb3MgY29udHJvbAogICoJCQlleHBlcmltZW50YWwgbGVkIGNvbnRyb2wKICAqCQkJZXhwZXJpbWVudGFsIGFjcGkgc291bmRzCi0gKiAgMjAwNC0xMC0xOQkwLjYJdXNlIGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigpIHRvIGNsYWltIEhLRVkgZGV2aWNlCi0gKiAgMjAwNC0xMC0yMwkwLjcJZml4IG1vZHVsZSBsb2FkaW5nIG9uIEEyMWUsIEEyMnAsIFQyMCwgVDIxLCBYMjAKLSAqCQkJZml4IExFRCBjb250cm9sIG9uIEEyMWUKLSAqICAyMDA0LTExLTA4CTAuOAlmaXggaW5pdCBlcnJvciBjYXNlLCBkb24ndCByZXR1cm4gZnJvbSBhIG1hY3JvCi0gKgkJCQl0aGFua3MgdG8gQ2hyaXMgV3JpZ2h0IDxjaHJpc3dAb3NkbC5vcmc+CisgKiAgMjAwNC0wOS0xNgkwLjQJc3VwcG9ydCBmb3IgbW9kdWxlIHBhcmFtZXRlcnMKKyAqCQkJaG90a2V5IG1hc2sgY2FuIGJlIHByZWZpeGVkIGJ5IDB4CisgKgkJCXZpZGVvIG91dHB1dCBzd2l0Y2hpbmcKKyAqCQkJdmlkZW8gZXhwYW5zaW9uIGNvbnRyb2wKKyAqCQkJdWx0cmFiYXkgZWplY3Qgc3VwcG9ydAorICoJCQlyZW1vdmVkIGxjZCBicmlnaHRuZXNzL29uL29mZiBjb250cm9sLCBkaWRuJ3Qgd29yaworICogIDIwMDQtMDgtMTcJMC4zCXN1cHBvcnQgZm9yIFI0MAorICoJCQlsY2Qgb2ZmLCBicmlnaHRuZXNzIGNvbnRyb2wKKyAqCQkJdGhpbmtsaWdodCBvbi9vZmYKKyAqICAyMDA0LTA4LTE0CTAuMglzdXBwb3J0IGZvciBUIHNlcmllcywgWDIwCisgKgkJCWJsdWV0b290aCBlbmFibGUvZGlzYWJsZQorICoJCQlob3RrZXkgZXZlbnRzIGRpc2FibGVkIGJ5IGRlZmF1bHQKKyAqCQkJcmVtb3ZlZCBmYW4gY29udHJvbCwgY3VycmVudGx5IHVzZWxlc3MKKyAqICAyMDA0LTA4LTA5CTAuMQlpbml0aWFsIHJlbGVhc2UsIHN1cHBvcnQgZm9yIFggc2VyaWVzCiAgKi8KIAotI2RlZmluZSBJQk1fVkVSU0lPTiAiMC44IgotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNjQsNiArODgsMTEgQEAKICNkZWZpbmUgSUJNX0ZJTEUgImlibV9hY3BpIgogI2RlZmluZSBJQk1fVVJMICJodHRwOi8vaWJtLWFjcGkuc2YubmV0LyIKIAorTU9EVUxFX0FVVEhPUigiQm9yaXNsYXYgRGVpYW5vdiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKElCTV9ERVNDKTsKK01PRFVMRV9WRVJTSU9OKElCTV9WRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwogI2RlZmluZSBJQk1fRElSIElCTV9OQU1FCiAKICNkZWZpbmUgSUJNX0xPRyBJQk1fRklMRSAiOiAiCkBAIC04NCw1NCArMTEzLDEyMiBAQAogI2RlZmluZSBJQk1fSEFORExFKG9iamVjdCwgcGFyZW50LCBwYXRocy4uLikJCQlcCiAJc3RhdGljIGFjcGlfaGFuZGxlICBvYmplY3QjI19oYW5kbGU7CQkJXAogCXN0YXRpYyBhY3BpX2hhbmRsZSAqb2JqZWN0IyNfcGFyZW50ID0gJnBhcmVudCMjX2hhbmRsZTsJXAorCXN0YXRpYyBjaGFyICAgICAgICAqb2JqZWN0IyNfcGF0aDsJCQlcCiAJc3RhdGljIGNoYXIgICAgICAgICpvYmplY3QjI19wYXRoc1tdID0geyBwYXRocyB9CiAKLUlCTV9IQU5ETEUoZWMsIHJvb3QsCi0JICAgIlxcX1NCLlBDSTAuSVNBLkVDIiwgICAgLyogQTIxZSwgQTIycCwgVDIwLCBUMjEsIFgyMCAqLwotCSAgICJcXF9TQi5QQ0kwLkxQQy5FQyIsICAgIC8qIGFsbCBvdGhlcnMgKi8KLSk7CisvKgorICogVGhlIGZvbGxvd2luZyBtb2RlbHMgYXJlIHN1cHBvcnRlZCB0byB2YXJpb3VzIGRlZ3JlZXM6CisgKgorICogNTcwLCA2MDBlLCA2MDB4LCA3NzBlLCA3NzB4CisgKiBBMjBtLCBBMjFlLCBBMjFtLCBBMjFwLCBBMjJwLCBBMzAsIEEzMHAsIEEzMSwgQTMxcAorICogRzQwLCBHNDEKKyAqIFIzMCwgUjMxLCBSMzIsIFI0MCwgUjQwZSwgUjUwLCBSNTBlLCBSNTBwLCBSNTEKKyAqIFQyMCwgVDIxLCBUMjIsIFQyMywgVDMwLCBUNDAsIFQ0MHAsIFQ0MSwgVDQxcCwgVDQyLCBUNDJwLCBUNDMKKyAqIFgyMCwgWDIxLCBYMjIsIFgyMywgWDI0LCBYMzAsIFgzMSwgWDQwCisgKgorICogVGhlIGZvbGxvd2luZyBtb2RlbHMgaGF2ZSBubyBzdXBwb3J0ZWQgZmVhdHVyZXM6CisgKgorICogMjQwLCAyNDB4LCBpMTQwMAorICoKKyAqIFN0aWxsIG1pc3NpbmcgRFNEVHMgZm9yIHRoZSBmb2xsb3dpbmcgbW9kZWxzOgorICoKKyAqIEEyMHAsIEEyMmUsIEEyMm0KKyAqIFI1MgorICogUzMxCisgKiBUNDNwCisgKi8KIAotSUJNX0hBTkRMRSh2aWQsIHJvb3QsIAotCSAgICJcXF9TQi5QQ0kwLlZJRCIsICAgICAgIC8qIEEyMWUsIEc0MCwgWDMwLCBYNDAgKi8KLQkgICAiXFxfU0IuUENJMC5BR1AuVklEIiwgICAvKiBhbGwgb3RoZXJzICovCi0pOworSUJNX0hBTkRMRShlYywgcm9vdCwgIlxcX1NCLlBDSTAuSVNBLkVDMCIsCS8qIDI0MCwgMjQweCAqLworCSAgICJcXF9TQi5QQ0kuSVNBLkVDIiwJLyogNTcwICovCisJICAgIlxcX1NCLlBDSTAuSVNBMC5FQzAiLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkgICAiXFxfU0IuUENJMC5JU0EuRUMiLAkvKiBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwLTIxICovCisJICAgIlxcX1NCLlBDSTAuQUQ0Uy5FQzAiLAkvKiBpMTQwMCwgUjMwICovCisJICAgIlxcX1NCLlBDSTAuSUNIMy5FQzAiLAkvKiBSMzEgKi8KKwkgICAiXFxfU0IuUENJMC5MUEMuRUMiLAkvKiBhbGwgb3RoZXJzICovCisgICAgKTsKIAotSUJNX0hBTkRMRShjbW9zLCByb290LAotCSAgICJcXFVDTVMiLCAgICAgICAgICAgICAgIC8qIFI1MCwgUjUwcCwgUjUxLCBUNHgsIFgzMSwgWDQwICovCi0JICAgIlxcQ01PUyIsICAgICAgICAgICAgICAgLyogQTN4LCBHNDAsIFIzMiwgVDIzLCBUMzAsIFgyMiwgWDI0LCBYMzAgKi8KLQkgICAiXFxDTVMiLCAgICAgICAgICAgICAgICAvKiBSNDAsIFI0MGUgKi8KLSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQTIxZSwgQTIycCwgVDIwLCBUMjEsIFgyMCAqLworSUJNX0hBTkRMRSh2aWQsIHJvb3QsICJcXF9TQi5QQ0kuQUdQLlZHQSIsCS8qIDU3MCAqLworCSAgICJcXF9TQi5QQ0kwLkFHUDAuVklEMCIsCS8qIDYwMGUveCwgNzcweCAqLworCSAgICJcXF9TQi5QQ0kwLlZJRDAiLAkvKiA3NzBlICovCisJICAgIlxcX1NCLlBDSTAuVklEIiwJLyogQTIxZSwgRzR4LCBSNTBlLCBYMzAsIFg0MCAqLworCSAgICJcXF9TQi5QQ0kwLkFHUC5WSUQiLAkvKiBhbGwgb3RoZXJzICovCisgICAgKTsJCQkJLyogUjMwLCBSMzEgKi8KIAotSUJNX0hBTkRMRShkb2NrLCByb290LAotCSAgICJcXF9TQi5HRENLIiwgICAgICAgICAgIC8qIFgzMCwgWDMxLCBYNDAgKi8KLQkgICAiXFxfU0IuUENJMC5ET0NLIiwgICAgICAvKiBBMjJwLCBUMjAsIFQyMSwgWDIwICovCi0JICAgIlxcX1NCLlBDSTAuUENJMS5ET0NLIiwgLyogYWxsIG90aGVycyAqLwotKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMjFlLCBHNDAsIFIzMiwgUjQwLCBSNDBlICovCitJQk1fSEFORExFKHZpZDIsIHJvb3QsICJcXF9TQi5QQ0kwLkFHUEIuVklEIik7CS8qIEc0MSAqLwogCi1JQk1fSEFORExFKGJheSwgcm9vdCwKLQkgICAiXFxfU0IuUENJMC5JREUwLlNDTkQuTVNUUiIpOyAgICAgIC8qIGFsbCBleGNlcHQgQTIxZSAqLwotSUJNX0hBTkRMRShiYXllaiwgcm9vdCwKLQkgICAiXFxfU0IuUENJMC5JREUwLlNDTkQuTVNUUi5fRUowIik7IC8qIGFsbCBleGNlcHQgQTJ4LCBBM3ggKi8KK0lCTV9IQU5ETEUoY21vcywgcm9vdCwgIlxcVUNNUyIsCS8qIFI1MCwgUjUwZSwgUjUwcCwgUjUxLCBUNHgsIFgzMSwgWDQwICovCisJICAgIlxcQ01PUyIsCQkvKiBBM3gsIEc0eCwgUjMyLCBUMjMsIFQzMCwgWDIyLTI0LCBYMzAgKi8KKwkgICAiXFxDTVMiLAkJLyogUjQwLCBSNDBlICovCisgICAgKTsJCQkJLyogYWxsIG90aGVycyAqLwogCi1JQk1fSEFORExFKGxnaHQsIHJvb3QsICJcXExHSFQiKTsgIC8qIEEyMWUsIEEyMnAsIFQyMCwgVDIxLCBYMjAgKi8KLUlCTV9IQU5ETEUoaGtleSwgZWMsICAgIkhLRVkiKTsgICAgLyogYWxsICovCi1JQk1fSEFORExFKGxlZCwgIGVjLCAgICJMRUQiKTsgICAgIC8qIGFsbCBleGNlcHQgQTIxZSwgQTIycCwgVDIwLCBUMjEsIFgyMCAqLwotSUJNX0hBTkRMRShzeXNsLCBlYywgICAiU1lTTCIpOyAgICAvKiBBMjFlLCBBMjJwLCBUMjAsIFQyMSwgWDIwICovCi1JQk1fSEFORExFKGJsZWQsIGVjLCAgICJCTEVEIik7ICAgIC8qIEEyMnAsIFQyMCwgVDIxLCBYMjAgKi8KLUlCTV9IQU5ETEUoYmVlcCwgZWMsICAgIkJFRVAiKTsgICAgLyogYWxsIG1vZGVscyAqLworSUJNX0hBTkRMRShkb2NrLCByb290LCAiXFxfU0IuR0RDSyIsCS8qIFgzMCwgWDMxLCBYNDAgKi8KKwkgICAiXFxfU0IuUENJMC5ET0NLIiwJLyogNjAwZS94LDc3MGUsNzcweCxBMnhtL3AsVDIwLTIyLFgyMC0yMSAqLworCSAgICJcXF9TQi5QQ0kwLlBDSTEuRE9DSyIsCS8qIGFsbCBvdGhlcnMgKi8KKwkgICAiXFxfU0IuUENJLklTQS5TTENFIiwJLyogNTcwICovCisgICAgKTsJCQkJLyogQTIxZSxHNHgsUjMwLFIzMSxSMzIsUjQwLFI0MGUsUjUwZSAqLworCitJQk1fSEFORExFKGJheSwgcm9vdCwgIlxcX1NCLlBDSS5JREUuU0VDTi5NQVNUIiwJLyogNTcwICovCisJICAgIlxcX1NCLlBDSTAuSURFMC5JREVTLklEU00iLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkgICAiXFxfU0IuUENJMC5JREUwLlNDTkQuTVNUUiIsCS8qIGFsbCBvdGhlcnMgKi8KKyAgICApOwkJCQkvKiBBMjFlLCBSMzAsIFIzMSAqLworCitJQk1fSEFORExFKGJheV9laiwgYmF5LCAiX0VKMyIsCS8qIDYwMGUveCwgQTJ4bS9wLCBBM3ggKi8KKwkgICAiX0VKMCIsCQkvKiBhbGwgb3RoZXJzICovCisgICAgKTsJCQkJLyogNTcwLEEyMWUsRzR4LFIzMCxSMzEsUjMyLFI0MGUsUjUwZSAqLworCitJQk1fSEFORExFKGJheTIsIHJvb3QsICJcXF9TQi5QQ0kwLklERTAuUFJJTS5TTEFWIiwJLyogQTN4LCBSMzIgKi8KKwkgICAiXFxfU0IuUENJMC5JREUwLklERVAuSURQUyIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworICAgICk7CQkJCS8qIGFsbCBvdGhlcnMgKi8KKworSUJNX0hBTkRMRShiYXkyX2VqLCBiYXkyLCAiX0VKMyIsCS8qIDYwMGUveCwgNzcwZSwgQTN4ICovCisJICAgIl9FSjAiLAkJLyogNzcweCAqLworICAgICk7CQkJCS8qIGFsbCBvdGhlcnMgKi8KKworLyogZG9uJ3QgbGlzdCBvdGhlciBhbHRlcm5hdGl2ZXMgYXMgd2UgaW5zdGFsbCBhIG5vdGlmeSBoYW5kbGVyIG9uIHRoZSA1NzAgKi8KK0lCTV9IQU5ETEUocGNpLCByb290LCAiXFxfU0IuUENJIik7CS8qIDU3MCAqLworCitJQk1fSEFORExFKGhrZXksIGVjLCAiXFxfU0IuSEtFWSIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworCSAgICJeSEtFWSIsCQkvKiBSMzAsIFIzMSAqLworCSAgICJIS0VZIiwJCS8qIGFsbCBvdGhlcnMgKi8KKyAgICApOwkJCQkvKiA1NzAgKi8KKworSUJNX0hBTkRMRShsZ2h0LCByb290LCAiXFxMR0hUIik7CS8qIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAtMjEgKi8KK0lCTV9IQU5ETEUobGVkYiwgZWMsICJMRURCIik7CS8qIEc0eCAqLworCitJQk1fSEFORExFKGxlZCwgZWMsICJTTEVEIiwJLyogNTcwICovCisJICAgIlNZU0wiLAkJLyogNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwLTIxICovCisJICAgIkxFRCIsCQkvKiBhbGwgb3RoZXJzICovCisgICAgKTsJCQkJLyogUjMwLCBSMzEgKi8KKworSUJNX0hBTkRMRShiZWVwLCBlYywgIkJFRVAiKTsJLyogYWxsIGV4Y2VwdCBSMzAsIFIzMSAqLworSUJNX0hBTkRMRShlY3JkLCBlYywgIkVDUkQiKTsJLyogNTcwICovCitJQk1fSEFORExFKGVjd3IsIGVjLCAiRUNXUiIpOwkvKiA1NzAgKi8KK0lCTV9IQU5ETEUoZmFucywgZWMsICJGQU5TIik7CS8qIFgzMSwgWDQwICovCisKK0lCTV9IQU5ETEUoZ2ZhbiwgZWMsICJHRkFOIiwJLyogNTcwICovCisJICAgIlxcRlNQRCIsCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKyAgICApOwkJCQkvKiBhbGwgb3RoZXJzICovCisKK0lCTV9IQU5ETEUoc2ZhbiwgZWMsICJTRkFOIiwJLyogNTcwICovCisJICAgIkpGTlMiLAkJLyogNzcweC1KTCAqLworICAgICk7CQkJCS8qIGFsbCBvdGhlcnMgKi8KKworI2RlZmluZSBJQk1fSEtFWV9ISUQJIklCTTAwNjgiCisjZGVmaW5lIElCTV9QQ0lfSElECSJQTlAwQTAzIgogCiBzdHJ1Y3QgaWJtX3N0cnVjdCB7CiAJY2hhciAqbmFtZTsKKwljaGFyIHBhcmFtWzMyXTsKIAogCWNoYXIgKmhpZDsKIAlzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcjsKLQkKLQlpbnQgICgqaW5pdCkgICAoc3RydWN0IGlibV9zdHJ1Y3QgKik7Ci0JaW50ICAoKnJlYWQpICAgKHN0cnVjdCBpYm1fc3RydWN0ICosIGNoYXIgKik7Ci0JaW50ICAoKndyaXRlKSAgKHN0cnVjdCBpYm1fc3RydWN0ICosIGNoYXIgKik7Ci0Jdm9pZCAoKmV4aXQpICAgKHN0cnVjdCBpYm1fc3RydWN0ICopOwogCi0Jdm9pZCAoKm5vdGlmeSkgKHN0cnVjdCBpYm1fc3RydWN0ICosIHUzMik7CQorCWludCAoKmluaXQpICh2b2lkKTsKKwlpbnQgKCpyZWFkKSAoY2hhciAqKTsKKwlpbnQgKCp3cml0ZSkgKGNoYXIgKik7CisJdm9pZCAoKmV4aXQpICh2b2lkKTsKKworCXZvaWQgKCpub3RpZnkpIChzdHJ1Y3QgaWJtX3N0cnVjdCAqLCB1MzIpOwogCWFjcGlfaGFuZGxlICpoYW5kbGU7CiAJaW50IHR5cGU7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7CkBAIC0xNDEsMTcgKzIzOCw2IEBACiAJaW50IGluaXRfY2FsbGVkOwogCWludCBub3RpZnlfaW5zdGFsbGVkOwogCi0JaW50IHN1cHBvcnRlZDsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlpbnQgc3RhdHVzOwotCQkJaW50IG1hc2s7Ci0JCX0gaG90a2V5OwotCQlzdHJ1Y3QgewotCQkJaW50IGF1dG9zd2l0Y2g7Ci0JCX0gdmlkZW87Ci0JfSBzdGF0ZTsKLQogCWludCBleHBlcmltZW50YWw7CiB9OwogCkBAIC0xNjUsMTUgKzI1MSwxNSBAQAogCQkgICAgICB2b2lkICpyZXMsIGNoYXIgKm1ldGhvZCwgY2hhciAqZm10LCAuLi4pCiB7CiAJY2hhciAqZm10MCA9IGZtdDsKLSAgICAgICAgc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJcGFyYW1zOwotICAgICAgICB1bmlvbiBhY3BpX29iamVjdAlpbl9vYmpzW0lCTV9NQVhfQUNQSV9BUkdTXTsKLSAgICAgICAgc3RydWN0IGFjcGlfYnVmZmVyCXJlc3VsdDsKLSAgICAgICAgdW5pb24gYWNwaV9vYmplY3QJb3V0X29iajsKLSAgICAgICAgYWNwaV9zdGF0dXMJCXN0YXR1czsKLQl2YV9saXN0CQkJYXA7Ci0JY2hhcgkJCXJlc190eXBlOwotCWludAkJCXN1Y2Nlc3M7Ci0JaW50CQkJcXVpZXQ7CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgcGFyYW1zOworCXVuaW9uIGFjcGlfb2JqZWN0IGluX29ianNbSUJNX01BWF9BQ1BJX0FSR1NdOworCXN0cnVjdCBhY3BpX2J1ZmZlciByZXN1bHQsICpyZXN1bHRwOworCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmo7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXZhX2xpc3QgYXA7CisJY2hhciByZXNfdHlwZTsKKwlpbnQgc3VjY2VzczsKKwlpbnQgcXVpZXQ7CiAKIAlpZiAoISpmbXQpIHsKIAkJcHJpbnRrKElCTV9FUlIgImFjcGlfZXZhbGYoKSBjYWxsZWQgd2l0aCBlbXB0eSBmb3JtYXRcbiIpOwpAQCAtMTk5LDcgKzI4NSw3IEBACiAJCQlpbl9vYmpzW3BhcmFtcy5jb3VudF0uaW50ZWdlci52YWx1ZSA9IHZhX2FyZyhhcCwgaW50KTsKIAkJCWluX29ianNbcGFyYW1zLmNvdW50KytdLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKIAkJCWJyZWFrOwotCQkvKiBhZGQgbW9yZSB0eXBlcyBhcyBuZWVkZWQgKi8KKwkJCS8qIGFkZCBtb3JlIHR5cGVzIGFzIG5lZWRlZCAqLwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKElCTV9FUlIgImFjcGlfZXZhbGYoKSBjYWxsZWQgIgogCQkJICAgICAgICJ3aXRoIGludmFsaWQgZm9ybWF0IGNoYXJhY3RlciAnJWMnXG4iLCBjKTsKQEAgLTIwOCwyMSArMjk0LDI1IEBACiAJfQogCXZhX2VuZChhcCk7CiAKLQlyZXN1bHQubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmopOwotCXJlc3VsdC5wb2ludGVyID0gJm91dF9vYmo7CisJaWYgKHJlc190eXBlICE9ICd2JykgeworCQlyZXN1bHQubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmopOworCQlyZXN1bHQucG9pbnRlciA9ICZvdXRfb2JqOworCQlyZXN1bHRwID0gJnJlc3VsdDsKKwl9IGVsc2UKKwkJcmVzdWx0cCA9IE5VTEw7CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIG1ldGhvZCwgJnBhcmFtcywgJnJlc3VsdCk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBtZXRob2QsICZwYXJhbXMsIHJlc3VsdHApOwogCiAJc3dpdGNoIChyZXNfdHlwZSkgewotCWNhc2UgJ2QnOgkvKiBpbnQgKi8KKwljYXNlICdkJzoJCS8qIGludCAqLwogCQlpZiAocmVzKQogCQkJKihpbnQgKilyZXMgPSBvdXRfb2JqLmludGVnZXIudmFsdWU7CiAJCXN1Y2Nlc3MgPSBzdGF0dXMgPT0gQUVfT0sgJiYgb3V0X29iai50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSOwogCQlicmVhazsKLQljYXNlICd2JzoJLyogdm9pZCAqLworCWNhc2UgJ3YnOgkJLyogdm9pZCAqLwogCQlzdWNjZXNzID0gc3RhdHVzID09IEFFX09LOwogCQlicmVhazsKLQkvKiBhZGQgbW9yZSB0eXBlcyBhcyBuZWVkZWQgKi8KKwkJLyogYWRkIG1vcmUgdHlwZXMgYXMgbmVlZGVkICovCiAJZGVmYXVsdDoKIAkJcHJpbnRrKElCTV9FUlIgImFjcGlfZXZhbGYoKSBjYWxsZWQgIgogCQkgICAgICAgIndpdGggaW52YWxpZCBmb3JtYXQgY2hhcmFjdGVyICclYydcbiIsIHJlc190eXBlKTsKQEAgLTI2Miw3ICszNTIsNyBAQAogCXJldHVybiBzdGFydDsKIH0KIAotc3RhdGljIGludCBkcml2ZXJfaW5pdChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQorc3RhdGljIGludCBkcml2ZXJfaW5pdCh2b2lkKQogewogCXByaW50ayhJQk1fSU5GTyAiJXMgdiVzXG4iLCBJQk1fREVTQywgSUJNX1ZFUlNJT04pOwogCXByaW50ayhJQk1fSU5GTyAiJXNcbiIsIElCTV9VUkwpOwpAQCAtMjcwLDcgKzM2MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHJpdmVyX3JlYWQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgY2hhciAqcCkKK3N0YXRpYyBpbnQgZHJpdmVyX3JlYWQoY2hhciAqcCkKIHsKIAlpbnQgbGVuID0gMDsKIApAQCAtMjgwLDY3ICszNzAsNzQgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IGhvdGtleV9nZXQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgaW50ICpzdGF0dXMsIGludCAqbWFzaykKK3N0YXRpYyBpbnQgaG90a2V5X3N1cHBvcnRlZDsKK3N0YXRpYyBpbnQgaG90a2V5X21hc2tfc3VwcG9ydGVkOworc3RhdGljIGludCBob3RrZXlfb3JpZ19zdGF0dXM7CitzdGF0aWMgaW50IGhvdGtleV9vcmlnX21hc2s7CisKK3N0YXRpYyBpbnQgaG90a2V5X2dldChpbnQgKnN0YXR1cywgaW50ICptYXNrKQogewogCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgc3RhdHVzLCAiREhLQyIsICJkIikpCi0JCXJldHVybiAtRUlPOwotCWlmIChpYm0tPnN1cHBvcnRlZCkgewotCQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIG1hc2ssICJESEtOIiwgInFkIikpCi0JCQlyZXR1cm4gLUVJTzsKLQl9IGVsc2UgewotCQkqbWFzayA9IGlibS0+c3RhdGUuaG90a2V5Lm1hc2s7Ci0JfQotCXJldHVybiAwOworCQlyZXR1cm4gMDsKKworCWlmIChob3RrZXlfbWFza19zdXBwb3J0ZWQpCisJCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgbWFzaywgIkRIS04iLCAiZCIpKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBob3RrZXlfc2V0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGludCBzdGF0dXMsIGludCBtYXNrKQorc3RhdGljIGludCBob3RrZXlfc2V0KGludCBzdGF0dXMsIGludCBtYXNrKQogewogCWludCBpOwogCiAJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBOVUxMLCAiTUhLQyIsICJ2ZCIsIHN0YXR1cykpCi0JCXJldHVybiAtRUlPOwotCi0JaWYgKCFpYm0tPnN1cHBvcnRlZCkKIAkJcmV0dXJuIDA7CiAKLQlmb3IgKGk9MDsgaTwzMjsgaSsrKSB7Ci0JCWludCBiaXQgPSAoKDEgPDwgaSkgJiBtYXNrKSAhPSAwOwotCQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJNSEtNIiwgInZkZCIsIGkrMSwgYml0KSkKLQkJCXJldHVybiAtRUlPOworCWlmIChob3RrZXlfbWFza19zdXBwb3J0ZWQpCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlpbnQgYml0ID0gKCgxIDw8IGkpICYgbWFzaykgIT0gMDsKKwkJCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwKKwkJCQkJTlVMTCwgIk1IS00iLCAidmRkIiwgaSArIDEsIGJpdCkpCisJCQkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhvdGtleV9pbml0KHZvaWQpCit7CisJLyogaG90a2V5IG5vdCBzdXBwb3J0ZWQgb24gNTcwICovCisJaG90a2V5X3N1cHBvcnRlZCA9IGhrZXlfaGFuZGxlICE9IE5VTEw7CisKKwlpZiAoaG90a2V5X3N1cHBvcnRlZCkgeworCQkvKiBtYXNrIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwKKwkJICAgQTMwLCBSMzAsIFIzMSwgVDIwLTIyLCBYMjAtMjEsIFgyMi0yNCAqLworCQlob3RrZXlfbWFza19zdXBwb3J0ZWQgPQorCQkgICAgYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgTlVMTCwgIkRIS04iLCAicXYiKTsKKworCQlpZiAoIWhvdGtleV9nZXQoJmhvdGtleV9vcmlnX3N0YXR1cywgJmhvdGtleV9vcmlnX21hc2spKQorCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaG90a2V5X2luaXQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKLXsKLQlpbnQgcmV0OwotCi0JaWJtLT5zdXBwb3J0ZWQgPSAxOwotCXJldCA9IGhvdGtleV9nZXQoaWJtLAotCQkJICZpYm0tPnN0YXRlLmhvdGtleS5zdGF0dXMsCi0JCQkgJmlibS0+c3RhdGUuaG90a2V5Lm1hc2spOwotCWlmIChyZXQgPCAwKSB7Ci0JCS8qIG1hc2sgbm90IHN1cHBvcnRlZCBvbiBBMjFlLCBBMjJwLCBUMjAsIFQyMSwgWDIwLCBYMjIsIFgyNCAqLwotCQlpYm0tPnN1cHBvcnRlZCA9IDA7Ci0JCXJldCA9IGhvdGtleV9nZXQoaWJtLAotCQkJCSAmaWJtLT5zdGF0ZS5ob3RrZXkuc3RhdHVzLAotCQkJCSAmaWJtLT5zdGF0ZS5ob3RrZXkubWFzayk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0JCi0KLXN0YXRpYyBpbnQgaG90a2V5X3JlYWQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgY2hhciAqcCkKK3N0YXRpYyBpbnQgaG90a2V5X3JlYWQoY2hhciAqcCkKIHsKIAlpbnQgc3RhdHVzLCBtYXNrOwogCWludCBsZW4gPSAwOwogCi0JaWYgKGhvdGtleV9nZXQoaWJtLCAmc3RhdHVzLCAmbWFzaykgPCAwKQorCWlmICghaG90a2V5X3N1cHBvcnRlZCkgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlpZiAoIWhvdGtleV9nZXQoJnN0YXR1cywgJm1hc2spKQogCQlyZXR1cm4gLUVJTzsKIAogCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMCkpOwotCWlmIChpYm0tPnN1cHBvcnRlZCkgeworCWlmIChob3RrZXlfbWFza19zdXBwb3J0ZWQpIHsKIAkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIm1hc2s6XHRcdDB4JTA0eFxuIiwgbWFzayk7CiAJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sCiAJCQkgICAgICAgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlLCByZXNldCwgPG1hc2s+XG4iKTsKQEAgLTM1MiwyMyArNDQ5LDI2IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCBob3RrZXlfd3JpdGUoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgY2hhciAqYnVmKQorc3RhdGljIGludCBob3RrZXlfd3JpdGUoY2hhciAqYnVmKQogewogCWludCBzdGF0dXMsIG1hc2s7CiAJY2hhciAqY21kOwogCWludCBkb19jbWQgPSAwOwogCi0JaWYgKGhvdGtleV9nZXQoaWJtLCAmc3RhdHVzLCAmbWFzaykgPCAwKQorCWlmICghaG90a2V5X3N1cHBvcnRlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAoIWhvdGtleV9nZXQoJnN0YXR1cywgJm1hc2spKQorCQlyZXR1cm4gLUVJTzsKKwogCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CiAJCWlmIChzdHJsZW5jbXAoY21kLCAiZW5hYmxlIikgPT0gMCkgewogCQkJc3RhdHVzID0gMTsKIAkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZGlzYWJsZSIpID09IDApIHsKIAkJCXN0YXR1cyA9IDA7CiAJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgInJlc2V0IikgPT0gMCkgewotCQkJc3RhdHVzID0gaWJtLT5zdGF0ZS5ob3RrZXkuc3RhdHVzOwotCQkJbWFzayAgID0gaWJtLT5zdGF0ZS5ob3RrZXkubWFzazsKKwkJCXN0YXR1cyA9IGhvdGtleV9vcmlnX3N0YXR1czsKKwkJCW1hc2sgPSBob3RrZXlfb3JpZ19tYXNrOwogCQl9IGVsc2UgaWYgKHNzY2FuZihjbWQsICIweCV4IiwgJm1hc2spID09IDEpIHsKIAkJCS8qIG1hc2sgc2V0ICovCiAJCX0gZWxzZSBpZiAoc3NjYW5mKGNtZCwgIiV4IiwgJm1hc2spID09IDEpIHsKQEAgLTM3OCwxNSArNDc4LDE2IEBACiAJCWRvX2NtZCA9IDE7CiAJfQogCi0JaWYgKGRvX2NtZCAmJiBob3RrZXlfc2V0KGlibSwgc3RhdHVzLCBtYXNrKSA8IDApCisJaWYgKGRvX2NtZCAmJiAhaG90a2V5X3NldChzdGF0dXMsIG1hc2spKQogCQlyZXR1cm4gLUVJTzsKIAogCXJldHVybiAwOwotfQkKK30KIAotc3RhdGljIHZvaWQgaG90a2V5X2V4aXQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKK3N0YXRpYyB2b2lkIGhvdGtleV9leGl0KHZvaWQpCiB7Ci0JaG90a2V5X3NldChpYm0sIGlibS0+c3RhdGUuaG90a2V5LnN0YXR1cywgaWJtLT5zdGF0ZS5ob3RrZXkubWFzayk7CisJaWYgKGhvdGtleV9zdXBwb3J0ZWQpCisJCWhvdGtleV9zZXQoaG90a2V5X29yaWdfc3RhdHVzLCBob3RrZXlfb3JpZ19tYXNrKTsKIH0KIAogc3RhdGljIHZvaWQgaG90a2V5X25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCB1MzIgZXZlbnQpCkBAIC0zOTgsMzMgKzQ5OSwzOCBAQAogCWVsc2UgewogCQlwcmludGsoSUJNX0VSUiAidW5rbm93biBob3RrZXkgZXZlbnQgJWRcbiIsIGV2ZW50KTsKIAkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAwKTsKLQl9CQorCX0KIH0KIAotc3RhdGljIGludCBibHVldG9vdGhfaW5pdChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQorc3RhdGljIGludCBibHVldG9vdGhfc3VwcG9ydGVkOworCitzdGF0aWMgaW50IGJsdWV0b290aF9pbml0KHZvaWQpCiB7Ci0JLyogYmx1ZXRvb3RoIG5vdCBzdXBwb3J0ZWQgb24gQTIxZSwgRzQwLCBUMjAsIFQyMSwgWDIwICovCi0JaWJtLT5zdXBwb3J0ZWQgPSBhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBOVUxMLCAiR0JEQyIsICJxdiIpOworCS8qIGJsdWV0b290aCBub3Qgc3VwcG9ydGVkIG9uIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsCisJICAgRzR4LCBSMzAsIFIzMSwgUjQwZSwgUjUwZSwgVDIwLTIyLCBYMjAtMjEgKi8KKwlibHVldG9vdGhfc3VwcG9ydGVkID0gaGtleV9oYW5kbGUgJiYKKwkgICAgYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgTlVMTCwgIkdCREMiLCAicXYiKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJsdWV0b290aF9zdGF0dXMoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKK3N0YXRpYyBpbnQgYmx1ZXRvb3RoX3N0YXR1cyh2b2lkKQogewogCWludCBzdGF0dXM7CiAKLQlpZiAoIWlibS0+c3VwcG9ydGVkIHx8ICFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR0JEQyIsICJkIikpCisJaWYgKCFibHVldG9vdGhfc3VwcG9ydGVkIHx8CisJICAgICFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR0JEQyIsICJkIikpCiAJCXN0YXR1cyA9IDA7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50IGJsdWV0b290aF9yZWFkKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKnApCitzdGF0aWMgaW50IGJsdWV0b290aF9yZWFkKGNoYXIgKnApCiB7CiAJaW50IGxlbiA9IDA7Ci0JaW50IHN0YXR1cyA9IGJsdWV0b290aF9zdGF0dXMoaWJtKTsKKwlpbnQgc3RhdHVzID0gYmx1ZXRvb3RoX3N0YXR1cygpOwogCi0JaWYgKCFpYm0tPnN1cHBvcnRlZCkKKwlpZiAoIWJsdWV0b290aF9zdXBwb3J0ZWQpCiAJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOwogCWVsc2UgaWYgKCEoc3RhdHVzICYgMSkpCiAJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBpbnN0YWxsZWRcbiIpOwpAQCAtNDM2LDE0ICs1NDIsMTQgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IGJsdWV0b290aF93cml0ZShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpidWYpCitzdGF0aWMgaW50IGJsdWV0b290aF93cml0ZShjaGFyICpidWYpCiB7Ci0JaW50IHN0YXR1cyA9IGJsdWV0b290aF9zdGF0dXMoaWJtKTsKKwlpbnQgc3RhdHVzID0gYmx1ZXRvb3RoX3N0YXR1cygpOwogCWNoYXIgKmNtZDsKIAlpbnQgZG9fY21kID0gMDsKIAotCWlmICghaWJtLT5zdXBwb3J0ZWQpCi0JCXJldHVybiAtRUlOVkFMOworCWlmICghYmx1ZXRvb3RoX3N1cHBvcnRlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewogCQlpZiAoc3RybGVuY21wKGNtZCwgImVuYWJsZSIpID09IDApIHsKQEAgLTQ1Niw2NCArNTYyLDE2NiBAQAogCX0KIAogCWlmIChkb19jbWQgJiYgIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJTQkRDIiwgInZkIiwgc3RhdHVzKSkKLQkgICAgcmV0dXJuIC1FSU87CisJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmlkZW9faW5pdChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQorc3RhdGljIGludCB2aWRlb19zdXBwb3J0ZWQ7CitzdGF0aWMgaW50IHZpZGVvX29yaWdfYXV0b3N3OworCisjZGVmaW5lIFZJREVPXzU3MCAxCisjZGVmaW5lIFZJREVPXzc3MCAyCisjZGVmaW5lIFZJREVPX05FVyAzCisKK3N0YXRpYyBpbnQgdmlkZW9faW5pdCh2b2lkKQogewotCWlmICghYWNwaV9ldmFsZih2aWRfaGFuZGxlLAotCQkJJmlibS0+c3RhdGUudmlkZW8uYXV0b3N3aXRjaCwgIl5WREVFIiwgImQiKSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJaW50IGl2Z2E7CisKKwlpZiAodmlkMl9oYW5kbGUgJiYgYWNwaV9ldmFsZihOVUxMLCAmaXZnYSwgIlxcSVZHQSIsICJkIikgJiYgaXZnYSkKKwkJLyogRzQxLCBhc3N1bWUgSVZHQSBkb2Vzbid0IGNoYW5nZSAqLworCQl2aWRfaGFuZGxlID0gdmlkMl9oYW5kbGU7CisKKwlpZiAoIXZpZF9oYW5kbGUpCisJCS8qIHZpZGVvIHN3aXRjaGluZyBub3Qgc3VwcG9ydGVkIG9uIFIzMCwgUjMxICovCisJCXZpZGVvX3N1cHBvcnRlZCA9IDA7CisJZWxzZSBpZiAoYWNwaV9ldmFsZih2aWRfaGFuZGxlLCAmdmlkZW9fb3JpZ19hdXRvc3csICJTV0lUIiwgInFkIikpCisJCS8qIDU3MCAqLworCQl2aWRlb19zdXBwb3J0ZWQgPSBWSURFT181NzA7CisJZWxzZSBpZiAoYWNwaV9ldmFsZih2aWRfaGFuZGxlLCAmdmlkZW9fb3JpZ19hdXRvc3csICJeVkFETCIsICJxZCIpKQorCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkJdmlkZW9fc3VwcG9ydGVkID0gVklERU9fNzcwOworCWVsc2UKKwkJLyogYWxsIG90aGVycyAqLworCQl2aWRlb19zdXBwb3J0ZWQgPSBWSURFT19ORVc7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2aWRlb19zdGF0dXMoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKK3N0YXRpYyBpbnQgdmlkZW9fc3RhdHVzKHZvaWQpCiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJaW50IGk7CiAKLQlhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZVUFMiLCAidmQiLCAxKTsKLQlpZiAoYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNEQyIsICJkIikpCi0JCXN0YXR1cyB8PSAweDAyICogaTsKKwlpZiAodmlkZW9fc3VwcG9ydGVkID09IFZJREVPXzU3MCkgeworCQlpZiAoYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcX1NCLlBIUyIsICJkZCIsIDB4ODcpKQorCQkJc3RhdHVzID0gaSAmIDM7CisJfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fNzcwKSB7CisJCWlmIChhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxWQ0RMIiwgImQiKSkKKwkJCXN0YXR1cyB8PSAweDAxICogaTsKKwkJaWYgKGFjcGlfZXZhbGYoTlVMTCwgJmksICJcXFZDREMiLCAiZCIpKQorCQkJc3RhdHVzIHw9IDB4MDIgKiBpOworCX0gZWxzZSBpZiAodmlkZW9fc3VwcG9ydGVkID09IFZJREVPX05FVykgeworCQlhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZVUFMiLCAidmQiLCAxKTsKKwkJaWYgKGFjcGlfZXZhbGYoTlVMTCwgJmksICJcXFZDREMiLCAiZCIpKQorCQkJc3RhdHVzIHw9IDB4MDIgKiBpOwogCi0JYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWVVBTIiwgInZkIiwgMCk7Ci0JaWYgKGFjcGlfZXZhbGYoTlVMTCwgJmksICJcXFZDREwiLCAiZCIpKQotCQlzdGF0dXMgfD0gMHgwMSAqIGk7Ci0JaWYgKGFjcGlfZXZhbGYoTlVMTCwgJmksICJcXFZDREQiLCAiZCIpKQotCQlzdGF0dXMgfD0gMHgwOCAqIGk7Ci0KLQlpZiAoYWNwaV9ldmFsZih2aWRfaGFuZGxlLCAmaSwgIl5WREVFIiwgImQiKSkKLQkJc3RhdHVzIHw9IDB4MTAgKiAoaSAmIDEpOworCQlhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZVUFMiLCAidmQiLCAwKTsKKwkJaWYgKGFjcGlfZXZhbGYoTlVMTCwgJmksICJcXFZDREwiLCAiZCIpKQorCQkJc3RhdHVzIHw9IDB4MDEgKiBpOworCQlpZiAoYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNERCIsICJkIikpCisJCQlzdGF0dXMgfD0gMHgwOCAqIGk7CisJfQogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCB2aWRlb19yZWFkKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKnApCitzdGF0aWMgaW50IHZpZGVvX2F1dG9zdyh2b2lkKQogewotCWludCBzdGF0dXMgPSB2aWRlb19zdGF0dXMoaWJtKTsKKwlpbnQgYXV0b3N3ID0gMDsKKworCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fNTcwKQorCQlhY3BpX2V2YWxmKHZpZF9oYW5kbGUsICZhdXRvc3csICJTV0lUIiwgImQiKTsKKwllbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fNzcwIHx8IHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT19ORVcpCisJCWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgJmF1dG9zdywgIl5WREVFIiwgImQiKTsKKworCXJldHVybiBhdXRvc3cgJiAxOworfQorCitzdGF0aWMgaW50IHZpZGVvX3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgc3RhdHVzID0gdmlkZW9fc3RhdHVzKCk7CisJaW50IGF1dG9zdyA9IHZpZGVvX2F1dG9zdygpOwogCWludCBsZW4gPSAwOwogCisJaWYgKCF2aWRlb19zdXBwb3J0ZWQpIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiBsZW47CisJfQorCisJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0c3VwcG9ydGVkXG4iKTsKIAlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGNkOlx0XHQlc1xuIiwgZW5hYmxlZChzdGF0dXMsIDApKTsKIAlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY3J0Olx0XHQlc1xuIiwgZW5hYmxlZChzdGF0dXMsIDEpKTsKLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiZHZpOlx0XHQlc1xuIiwgZW5hYmxlZChzdGF0dXMsIDMpKTsKLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiYXV0bzpcdFx0JXNcbiIsIGVuYWJsZWQoc3RhdHVzLCA0KSk7Ci0JbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0bGNkX2VuYWJsZSwgbGNkX2Rpc2FibGUsICIKLQkJICAgICAgICJjcnRfZW5hYmxlLCBjcnRfZGlzYWJsZVxuIik7Ci0JbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZHZpX2VuYWJsZSwgZHZpX2Rpc2FibGUsICIKLQkJICAgICAgICJhdXRvX2VuYWJsZSwgYXV0b19kaXNhYmxlXG4iKTsKKwlpZiAodmlkZW9fc3VwcG9ydGVkID09IFZJREVPX05FVykKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImR2aTpcdFx0JXNcbiIsIGVuYWJsZWQoc3RhdHVzLCAzKSk7CisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImF1dG86XHRcdCVzXG4iLCBlbmFibGVkKGF1dG9zdywgMCkpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGxjZF9lbmFibGUsIGxjZF9kaXNhYmxlXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRjcnRfZW5hYmxlLCBjcnRfZGlzYWJsZVxuIik7CisJaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT19ORVcpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGR2aV9lbmFibGUsIGR2aV9kaXNhYmxlXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRhdXRvX2VuYWJsZSwgYXV0b19kaXNhYmxlXG4iKTsKIAlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHR2aWRlb19zd2l0Y2gsIGV4cGFuZF90b2dnbGVcbiIpOwogCiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCB2aWRlb193cml0ZShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpidWYpCitzdGF0aWMgaW50IHZpZGVvX3N3aXRjaCh2b2lkKQoreworCWludCBhdXRvc3cgPSB2aWRlb19hdXRvc3coKTsKKwlpbnQgcmV0OworCisJaWYgKCFhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwgMSkpCisJCXJldHVybiAtRUlPOworCXJldCA9IHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT181NzAgPworCSAgICBhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIl9RMTYiLCAidiIpIDoKKwkgICAgYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiVlNXVCIsICJ2Iik7CisJYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiX0RPUyIsICJ2ZCIsIGF1dG9zdyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZpZGVvX2V4cGFuZCh2b2lkKQoreworCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fNTcwKQorCQlyZXR1cm4gYWNwaV9ldmFsZihlY19oYW5kbGUsIE5VTEwsICJfUTE3IiwgInYiKTsKKwllbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fNzcwKQorCQlyZXR1cm4gYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiVkVYUCIsICJ2Iik7CisJZWxzZQorCQlyZXR1cm4gYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWRVhQIiwgInYiKTsKK30KKworc3RhdGljIGludCB2aWRlb19zd2l0Y2gyKGludCBzdGF0dXMpCit7CisJaW50IHJldDsKKworCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fNTcwKSB7CisJCXJldCA9IGFjcGlfZXZhbGYoTlVMTCwgTlVMTCwKKwkJCQkgIlxcX1NCLlBIUzIiLCAidmRkIiwgMHg4Yiwgc3RhdHVzIHwgMHg4MCk7CisJfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fNzcwKSB7CisJCWludCBhdXRvc3cgPSB2aWRlb19hdXRvc3coKTsKKwkJaWYgKCFhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwgMSkpCisJCQlyZXR1cm4gLUVJTzsKKworCQlyZXQgPSBhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsCisJCQkJICJBU1dUIiwgInZkZCIsIHN0YXR1cyAqIDB4MTAwLCAwKTsKKworCQlhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwgYXV0b3N3KTsKKwl9IGVsc2UgeworCQlyZXQgPSBhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZVUFMiLCAidmQiLCAweDgwKSAmJgorCQkgICAgYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWU0RTIiwgInZkZCIsIHN0YXR1cywgMSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aWRlb193cml0ZShjaGFyICpidWYpCiB7CiAJY2hhciAqY21kOwogCWludCBlbmFibGUsIGRpc2FibGUsIHN0YXR1czsKIAorCWlmICghdmlkZW9fc3VwcG9ydGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWVuYWJsZSA9IGRpc2FibGUgPSAwOwogCiAJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKQEAgLTUyNSw5ICs3MzMsMTEgQEAKIAkJCWVuYWJsZSB8PSAweDAyOwogCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJjcnRfZGlzYWJsZSIpID09IDApIHsKIAkJCWRpc2FibGUgfD0gMHgwMjsKLQkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZHZpX2VuYWJsZSIpID09IDApIHsKKwkJfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fTkVXICYmCisJCQkgICBzdHJsZW5jbXAoY21kLCAiZHZpX2VuYWJsZSIpID09IDApIHsKIAkJCWVuYWJsZSB8PSAweDA4OwotCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJkdmlfZGlzYWJsZSIpID09IDApIHsKKwkJfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fTkVXICYmCisJCQkgICBzdHJsZW5jbXAoY21kLCAiZHZpX2Rpc2FibGUiKSA9PSAwKSB7CiAJCQlkaXNhYmxlIHw9IDB4MDg7CiAJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImF1dG9fZW5hYmxlIikgPT0gMCkgewogCQkJaWYgKCFhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwgMSkpCkBAIC01MzYsNzEgKzc0Niw3NSBAQAogCQkJaWYgKCFhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwgMCkpCiAJCQkJcmV0dXJuIC1FSU87CiAJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgInZpZGVvX3N3aXRjaCIpID09IDApIHsKLQkJCWludCBhdXRvc3dpdGNoOwotCQkJaWYgKCFhY3BpX2V2YWxmKHZpZF9oYW5kbGUsICZhdXRvc3dpdGNoLCAiXlZERUUiLCAiZCIpKQotCQkJCXJldHVybiAtRUlPOwotCQkJaWYgKCFhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwgMSkpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlpZiAoIWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIlZTV1QiLCAidiIpKQotCQkJCXJldHVybiAtRUlPOwotCQkJaWYgKCFhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwKLQkJCQkJYXV0b3N3aXRjaCkpCisJCQlpZiAoIXZpZGVvX3N3aXRjaCgpKQogCQkJCXJldHVybiAtRUlPOwogCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJleHBhbmRfdG9nZ2xlIikgPT0gMCkgewotCQkJaWYgKCFhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZFWFAiLCAidiIpKQorCQkJaWYgKCF2aWRlb19leHBhbmQoKSkKIAkJCQlyZXR1cm4gLUVJTzsKIAkJfSBlbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoZW5hYmxlIHx8IGRpc2FibGUpIHsKLQkJc3RhdHVzID0gKHZpZGVvX3N0YXR1cyhpYm0pICYgMHgwZiAmIH5kaXNhYmxlKSB8IGVuYWJsZTsKLQkJaWYgKCFhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZVUFMiLCAidmQiLCAweDgwKSkKLQkJCXJldHVybiAtRUlPOwotCQlpZiAoIWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlNEUyIsICJ2ZGQiLCBzdGF0dXMsIDEpKQorCQlzdGF0dXMgPSAodmlkZW9fc3RhdHVzKCkgJiAweDBmICYgfmRpc2FibGUpIHwgZW5hYmxlOworCQlpZiAoIXZpZGVvX3N3aXRjaDIoc3RhdHVzKSkKIAkJCXJldHVybiAtRUlPOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB2aWRlb19leGl0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCitzdGF0aWMgdm9pZCB2aWRlb19leGl0KHZvaWQpCiB7Ci0JYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiX0RPUyIsICJ2ZCIsCi0JCSAgIGlibS0+c3RhdGUudmlkZW8uYXV0b3N3aXRjaCk7CisJYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiX0RPUyIsICJ2ZCIsIHZpZGVvX29yaWdfYXV0b3N3KTsKIH0KIAotc3RhdGljIGludCBsaWdodF9pbml0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCitzdGF0aWMgaW50IGxpZ2h0X3N1cHBvcnRlZDsKK3N0YXRpYyBpbnQgbGlnaHRfc3RhdHVzX3N1cHBvcnRlZDsKKworc3RhdGljIGludCBsaWdodF9pbml0KHZvaWQpCiB7Ci0JLyoga2JsdCBub3Qgc3VwcG9ydGVkIG9uIEc0MCwgUjMyLCBYMjAgKi8KLQlpYm0tPnN1cHBvcnRlZCA9IGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiS0JMVCIsICJxdiIpOworCS8qIGxpZ2h0IG5vdCBzdXBwb3J0ZWQgb24gNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEc0eCwgUjMwLCBSMzEgKi8KKwlsaWdodF9zdXBwb3J0ZWQgPSAoY21vc19oYW5kbGUgfHwgbGdodF9oYW5kbGUpICYmICFsZWRiX2hhbmRsZTsKKworCWlmIChsaWdodF9zdXBwb3J0ZWQpCisJCS8qIGxpZ2h0IHN0YXR1cyBub3Qgc3VwcG9ydGVkIG9uCisJCSAgIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4LCBHNHgsIFIzMCwgUjMxLCBSMzIsIFgyMCAqLworCQlsaWdodF9zdGF0dXNfc3VwcG9ydGVkID0gYWNwaV9ldmFsZihlY19oYW5kbGUsIE5VTEwsCisJCQkJCQkgICAgIktCTFQiLCAicXYiKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxpZ2h0X3JlYWQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgY2hhciAqcCkKK3N0YXRpYyBpbnQgbGlnaHRfcmVhZChjaGFyICpwKQogewogCWludCBsZW4gPSAwOwogCWludCBzdGF0dXMgPSAwOwogCi0JaWYgKGlibS0+c3VwcG9ydGVkKSB7CisJaWYgKCFsaWdodF9zdXBwb3J0ZWQpIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7CisJfSBlbHNlIGlmICghbGlnaHRfc3RhdHVzX3N1cHBvcnRlZCkgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHR1bmtub3duXG4iKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0b24sIG9mZlxuIik7CisJfSBlbHNlIHsKIAkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnN0YXR1cywgIktCTFQiLCAiZCIpKQogCQkJcmV0dXJuIC1FSU87CiAJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdCVzXG4iLCBvbm9mZihzdGF0dXMsIDApKTsKLQl9IGVsc2UKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0dW5rbm93blxuIik7Ci0KLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRvbiwgb2ZmXG4iKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0b24sIG9mZlxuIik7CisJfQogCiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCBsaWdodF93cml0ZShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpidWYpCitzdGF0aWMgaW50IGxpZ2h0X3dyaXRlKGNoYXIgKmJ1ZikKIHsKIAlpbnQgY21vc19jbWQsIGxnaHRfY21kOwogCWNoYXIgKmNtZDsKIAlpbnQgc3VjY2VzczsKLQkKKworCWlmICghbGlnaHRfc3VwcG9ydGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CiAJCWlmIChzdHJsZW5jbXAoY21kLCAib24iKSA9PSAwKSB7CiAJCQljbW9zX2NtZCA9IDB4MGM7CkBAIC02MTAsMTAgKzgyNCwxMCBAQAogCQkJbGdodF9jbWQgPSAwOwogCQl9IGVsc2UKIAkJCXJldHVybiAtRUlOVkFMOwotCQkKKwogCQlzdWNjZXNzID0gY21vc19oYW5kbGUgPwotCQkJYWNwaV9ldmFsZihjbW9zX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgY21vc19jbWQpIDoKLQkJCWFjcGlfZXZhbGYobGdodF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIGxnaHRfY21kKTsKKwkJICAgIGFjcGlfZXZhbGYoY21vc19oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIGNtb3NfY21kKSA6CisJCSAgICBhY3BpX2V2YWxmKGxnaHRfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCBsZ2h0X2NtZCk7CiAJCWlmICghc3VjY2VzcykKIAkJCXJldHVybiAtRUlPOwogCX0KQEAgLTYzMyw3ICs4NDcsNyBAQAogCiAjZGVmaW5lIGRvY2tfZG9ja2VkKCkgKF9zdGEoZG9ja19oYW5kbGUpICYgMSkKIAotc3RhdGljIGludCBkb2NrX3JlYWQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgY2hhciAqcCkKK3N0YXRpYyBpbnQgZG9ja19yZWFkKGNoYXIgKnApCiB7CiAJaW50IGxlbiA9IDA7CiAJaW50IGRvY2tlZCA9IGRvY2tfZG9ja2VkKCk7CkBAIC02NTAsMTggKzg2NCwxNyBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBpbnQgZG9ja193cml0ZShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpidWYpCitzdGF0aWMgaW50IGRvY2tfd3JpdGUoY2hhciAqYnVmKQogewogCWNoYXIgKmNtZDsKIAogCWlmICghZG9ja19kb2NrZWQoKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRU5PREVWOwogCiAJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKIAkJaWYgKHN0cmxlbmNtcChjbWQsICJ1bmRvY2siKSA9PSAwKSB7Ci0JCQlpZiAoIWFjcGlfZXZhbGYoZG9ja19oYW5kbGUsIE5VTEwsICJfRENLIiwgInZkIiwgMCkpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlpZiAoIWFjcGlfZXZhbGYoZG9ja19oYW5kbGUsIE5VTEwsICJfRUowIiwgInZkIiwgMSkpCisJCQlpZiAoIWFjcGlfZXZhbGYoZG9ja19oYW5kbGUsIE5VTEwsICJfRENLIiwgInZkIiwgMCkgfHwKKwkJCSAgICAhYWNwaV9ldmFsZihkb2NrX2hhbmRsZSwgTlVMTCwgIl9FSjAiLCAidmQiLCAxKSkKIAkJCQlyZXR1cm4gLUVJTzsKIAkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZG9jayIpID09IDApIHsKIAkJCWlmICghYWNwaV9ldmFsZihkb2NrX2hhbmRsZSwgTlVMTCwgIl9EQ0siLCAidmQiLCAxKSkKQEAgLTY3MSw5MCArODg0LDEzMSBAQAogCX0KIAogCXJldHVybiAwOwotfQkKK30KIAogc3RhdGljIHZvaWQgZG9ja19ub3RpZnkoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgdTMyIGV2ZW50KQogewogCWludCBkb2NrZWQgPSBkb2NrX2RvY2tlZCgpOworCWludCBwY2kgPSBpYm0tPmhpZCAmJiBzdHJzdHIoaWJtLT5oaWQsIElCTV9QQ0lfSElEKTsKIAotCWlmIChldmVudCA9PSAzICYmIGRvY2tlZCkKLQkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAxKTsgLyogYnV0dG9uICovCisJaWYgKGV2ZW50ID09IDEgJiYgIXBjaSkJLyogNTcwICovCisJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+ZGV2aWNlLCBldmVudCwgMSk7CS8qIGJ1dHRvbiAqLworCWVsc2UgaWYgKGV2ZW50ID09IDEgJiYgcGNpKQkvKiA1NzAgKi8KKwkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAzKTsJLyogZG9jayAqLworCWVsc2UgaWYgKGV2ZW50ID09IDMgJiYgZG9ja2VkKQorCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmRldmljZSwgZXZlbnQsIDEpOwkvKiBidXR0b24gKi8KIAllbHNlIGlmIChldmVudCA9PSAzICYmICFkb2NrZWQpCi0JCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+ZGV2aWNlLCBldmVudCwgMik7IC8qIHVuZG9jayAqLworCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmRldmljZSwgZXZlbnQsIDIpOwkvKiB1bmRvY2sgKi8KIAllbHNlIGlmIChldmVudCA9PSAwICYmIGRvY2tlZCkKLQkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAzKTsgLyogZG9jayAqLworCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmRldmljZSwgZXZlbnQsIDMpOwkvKiBkb2NrICovCiAJZWxzZSB7CiAJCXByaW50ayhJQk1fRVJSICJ1bmtub3duIGRvY2sgZXZlbnQgJWQsIHN0YXR1cyAlZFxuIiwKIAkJICAgICAgIGV2ZW50LCBfc3RhKGRvY2tfaGFuZGxlKSk7Ci0JCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+ZGV2aWNlLCBldmVudCwgMCk7IC8qIHVua25vd24gKi8KKwkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAwKTsJLyogdW5rbm93biAqLwogCX0KIH0KIAotI2RlZmluZSBiYXlfb2NjdXBpZWQoKSAoX3N0YShiYXlfaGFuZGxlKSAmIDEpCitzdGF0aWMgaW50IGJheV9zdGF0dXNfc3VwcG9ydGVkOworc3RhdGljIGludCBiYXlfc3RhdHVzMl9zdXBwb3J0ZWQ7CitzdGF0aWMgaW50IGJheV9lamVjdF9zdXBwb3J0ZWQ7CitzdGF0aWMgaW50IGJheV9lamVjdDJfc3VwcG9ydGVkOwogCi1zdGF0aWMgaW50IGJheV9pbml0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCitzdGF0aWMgaW50IGJheV9pbml0KHZvaWQpCiB7Ci0JLyogYmF5IG5vdCBzdXBwb3J0ZWQgb24gQTIxZSwgQTIycCwgQTMxLCBBMzFwLCBHNDAsIFIzMiwgUjQwZSAqLwotCWlibS0+c3VwcG9ydGVkID0gYmF5X2hhbmRsZSAmJiBiYXllal9oYW5kbGUgJiYKLQkJYWNwaV9ldmFsZihiYXlfaGFuZGxlLCBOVUxMLCAiX1NUQSIsICJxdiIpOworCWJheV9zdGF0dXNfc3VwcG9ydGVkID0gYmF5X2hhbmRsZSAmJgorCSAgICBhY3BpX2V2YWxmKGJheV9oYW5kbGUsIE5VTEwsICJfU1RBIiwgInF2Iik7CisJYmF5X3N0YXR1czJfc3VwcG9ydGVkID0gYmF5Ml9oYW5kbGUgJiYKKwkgICAgYWNwaV9ldmFsZihiYXkyX2hhbmRsZSwgTlVMTCwgIl9TVEEiLCAicXYiKTsKKworCWJheV9lamVjdF9zdXBwb3J0ZWQgPSBiYXlfaGFuZGxlICYmIGJheV9lal9oYW5kbGUgJiYKKwkgICAgKHN0cmxlbmNtcChiYXlfZWpfcGF0aCwgIl9FSjAiKSA9PSAwIHx8IGV4cGVyaW1lbnRhbCk7CisJYmF5X2VqZWN0Ml9zdXBwb3J0ZWQgPSBiYXkyX2hhbmRsZSAmJiBiYXkyX2VqX2hhbmRsZSAmJgorCSAgICAoc3RybGVuY21wKGJheTJfZWpfcGF0aCwgIl9FSjAiKSA9PSAwIHx8IGV4cGVyaW1lbnRhbCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBiYXlfcmVhZChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpwKQorI2RlZmluZSBiYXlfb2NjdXBpZWQoYikgKF9zdGEoYiMjX2hhbmRsZSkgJiAxKQorCitzdGF0aWMgaW50IGJheV9yZWFkKGNoYXIgKnApCiB7CiAJaW50IGxlbiA9IDA7Ci0JaW50IG9jY3VwaWVkID0gYmF5X29jY3VwaWVkKCk7Ci0JCi0JaWYgKCFpYm0tPnN1cHBvcnRlZCkKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7Ci0JZWxzZSBpZiAoIW9jY3VwaWVkKQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHR1bm9jY3VwaWVkXG4iKTsKLQllbHNlIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0b2NjdXBpZWRcbiIpOworCWludCBvY2N1cGllZCA9IGJheV9vY2N1cGllZChiYXkpOworCWludCBvY2N1cGllZDIgPSBiYXlfb2NjdXBpZWQoYmF5Mik7CisJaW50IGVqZWN0LCBlamVjdDI7CisKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIiwgYmF5X3N0YXR1c19zdXBwb3J0ZWQgPworCQkgICAgICAgKG9jY3VwaWVkID8gIm9jY3VwaWVkIiA6ICJ1bm9jY3VwaWVkIikgOgorCQkgICAgICAgIm5vdCBzdXBwb3J0ZWQiKTsKKwlpZiAoYmF5X3N0YXR1czJfc3VwcG9ydGVkKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzMjpcdCVzXG4iLCBvY2N1cGllZDIgPworCQkJICAgICAgICJvY2N1cGllZCIgOiAidW5vY2N1cGllZCIpOworCisJZWplY3QgPSBiYXlfZWplY3Rfc3VwcG9ydGVkICYmIG9jY3VwaWVkOworCWVqZWN0MiA9IGJheV9lamVjdDJfc3VwcG9ydGVkICYmIG9jY3VwaWVkMjsKKworCWlmIChlamVjdCAmJiBlamVjdDIpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGVqZWN0LCBlamVjdDJcbiIpOworCWVsc2UgaWYgKGVqZWN0KQogCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlamVjdFxuIik7Ci0JfQorCWVsc2UgaWYgKGVqZWN0MikKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZWplY3QyXG4iKTsKIAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBpbnQgYmF5X3dyaXRlKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgYmF5X3dyaXRlKGNoYXIgKmJ1ZikKIHsKIAljaGFyICpjbWQ7CiAKKwlpZiAoIWJheV9lamVjdF9zdXBwb3J0ZWQgJiYgIWJheV9lamVjdDJfc3VwcG9ydGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7Ci0JCWlmIChzdHJsZW5jbXAoY21kLCAiZWplY3QiKSA9PSAwKSB7Ci0JCQlpZiAoIWlibS0+c3VwcG9ydGVkIHx8Ci0JCQkgICAgIWFjcGlfZXZhbGYoYmF5X2hhbmRsZSwgTlVMTCwgIl9FSjAiLCAidmQiLCAxKSkKKwkJaWYgKGJheV9lamVjdF9zdXBwb3J0ZWQgJiYgc3RybGVuY21wKGNtZCwgImVqZWN0IikgPT0gMCkgeworCQkJaWYgKCFhY3BpX2V2YWxmKGJheV9lal9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIDEpKQorCQkJCXJldHVybiAtRUlPOworCQl9IGVsc2UgaWYgKGJheV9lamVjdDJfc3VwcG9ydGVkICYmCisJCQkgICBzdHJsZW5jbXAoY21kLCAiZWplY3QyIikgPT0gMCkgeworCQkJaWYgKCFhY3BpX2V2YWxmKGJheTJfZWpfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCAxKSkKIAkJCQlyZXR1cm4gLUVJTzsKIAkJfSBlbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlyZXR1cm4gMDsKLX0JCit9CiAKIHN0YXRpYyB2b2lkIGJheV9ub3RpZnkoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgdTMyIGV2ZW50KQogewogCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+ZGV2aWNlLCBldmVudCwgMCk7CiB9CiAKLXN0YXRpYyBpbnQgY21vc19yZWFkKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKnApCitzdGF0aWMgaW50IGNtb3NfcmVhZChjaGFyICpwKQogewogCWludCBsZW4gPSAwOwogCi0JLyogY21vcyBub3Qgc3VwcG9ydGVkIG9uIEEyMWUsIEEyMnAsIFQyMCwgVDIxLCBYMjAgKi8KKwkvKiBjbW9zIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwKKwkgICBSMzAsIFIzMSwgVDIwLTIyLCBYMjAtMjEgKi8KIAlpZiAoIWNtb3NfaGFuZGxlKQogCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKIAllbHNlIHsKIAkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0c3VwcG9ydGVkXG4iKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0PGludD5cbiIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHQ8Y21kPiAoPGNtZD4gaXMgMC0yMSlcbiIpOwogCX0KIAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBpbnQgY21vc193cml0ZShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpidWYpCitzdGF0aWMgaW50IGNtb3NfZXZhbChpbnQgY21vc19jbWQpCit7CisJaWYgKGNtb3NfaGFuZGxlKQorCQlyZXR1cm4gYWNwaV9ldmFsZihjbW9zX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgY21vc19jbWQpOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY21vc193cml0ZShjaGFyICpidWYpCiB7CiAJY2hhciAqY21kOwogCWludCBjbW9zX2NtZDsKQEAgLTc2MywxODMgKzEwMTcsNjQ0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKHNzY2FuZihjbWQsICIldSIsICZjbW9zX2NtZCkgPT0gMSkgeworCQlpZiAoc3NjYW5mKGNtZCwgIiV1IiwgJmNtb3NfY21kKSA9PSAxICYmCisJCSAgICBjbW9zX2NtZCA+PSAwICYmIGNtb3NfY21kIDw9IDIxKSB7CiAJCQkvKiBjbW9zX2NtZCBzZXQgKi8KIAkJfSBlbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlpZiAoIWFjcGlfZXZhbGYoY21vc19oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIGNtb3NfY21kKSkKKwkJaWYgKCFjbW9zX2V2YWwoY21vc19jbWQpKQogCQkJcmV0dXJuIC1FSU87CiAJfQogCiAJcmV0dXJuIDA7Ci19CQotCQkKLXN0YXRpYyBpbnQgbGVkX3JlYWQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgY2hhciAqcCkKK30KKworc3RhdGljIGludCBsZWRfc3VwcG9ydGVkOworCisjZGVmaW5lIExFRF81NzAgMQorI2RlZmluZSBMRURfT0xEIDIKKyNkZWZpbmUgTEVEX05FVyAzCisKK3N0YXRpYyBpbnQgbGVkX2luaXQodm9pZCkKK3sKKwlpZiAoIWxlZF9oYW5kbGUpCisJCS8qIGxlZCBub3Qgc3VwcG9ydGVkIG9uIFIzMCwgUjMxICovCisJCWxlZF9zdXBwb3J0ZWQgPSAwOworCWVsc2UgaWYgKHN0cmxlbmNtcChsZWRfcGF0aCwgIlNMRUQiKSA9PSAwKQorCQkvKiA1NzAgKi8KKwkJbGVkX3N1cHBvcnRlZCA9IExFRF81NzA7CisJZWxzZSBpZiAoc3RybGVuY21wKGxlZF9wYXRoLCAiU1lTTCIpID09IDApCisJCS8qIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMC0yMSAqLworCQlsZWRfc3VwcG9ydGVkID0gTEVEX09MRDsKKwllbHNlCisJCS8qIGFsbCBvdGhlcnMgKi8KKwkJbGVkX3N1cHBvcnRlZCA9IExFRF9ORVc7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBsZWRfc3RhdHVzKHMpICgocykgPT0gMCA/ICJvZmYiIDogKChzKSA9PSAxID8gIm9uIiA6ICJibGlua2luZyIpKQorCitzdGF0aWMgaW50IGxlZF9yZWFkKGNoYXIgKnApCiB7CiAJaW50IGxlbiA9IDA7CiAKKwlpZiAoIWxlZF9zdXBwb3J0ZWQpIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiBsZW47CisJfQorCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHN1cHBvcnRlZFxuIik7CisKKwlpZiAobGVkX3N1cHBvcnRlZCA9PSBMRURfNTcwKSB7CisJCS8qIDU3MCAqLworCQlpbnQgaSwgc3RhdHVzOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAoIWFjcGlfZXZhbGYoZWNfaGFuZGxlLAorCQkJCQkmc3RhdHVzLCAiR0xFRCIsICJkZCIsIDEgPDwgaSkpCisJCQkJcmV0dXJuIC1FSU87CisJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiJWQ6XHRcdCVzXG4iLAorCQkJCSAgICAgICBpLCBsZWRfc3RhdHVzKHN0YXR1cykpOworCQl9CisJfQorCiAJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0IgotCQkgICAgICAgIjxpbnQ+IG9uLCA8aW50PiBvZmYsIDxpbnQ+IGJsaW5rXG4iKTsKKwkJICAgICAgICI8bGVkPiBvbiwgPGxlZD4gb2ZmLCA8bGVkPiBibGluayAoPGxlZD4gaXMgMC03KVxuIik7CiAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IGxlZF93cml0ZShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpidWYpCisvKiBvZmYsIG9uLCBibGluayAqLworc3RhdGljIGNvbnN0IGludCBsZWRfc2xlZF9hcmcxW10gPSB7IDAsIDEsIDMgfTsKK3N0YXRpYyBjb25zdCBpbnQgbGVkX2V4cF9obGJsW10gPSB7IDAsIDAsIDEgfTsJLyogbGVkIyAqICovCitzdGF0aWMgY29uc3QgaW50IGxlZF9leHBfaGxjbFtdID0geyAwLCAxLCAxIH07CS8qIGxlZCMgKiAqLworc3RhdGljIGNvbnN0IGludCBsZWRfbGVkX2FyZzFbXSA9IHsgMCwgMHg4MCwgMHhjMCB9OworCisjZGVmaW5lIEVDX0hMQ0wgMHgwYworI2RlZmluZSBFQ19ITEJMIDB4MGQKKyNkZWZpbmUgRUNfSExNUyAweDBlCisKK3N0YXRpYyBpbnQgbGVkX3dyaXRlKGNoYXIgKmJ1ZikKIHsKIAljaGFyICpjbWQ7Ci0JdW5zaWduZWQgaW50IGxlZDsKLQlpbnQgbGVkX2NtZCwgc3lzbF9jbWQsIGJsZWRfYSwgYmxlZF9iOworCWludCBsZWQsIGluZCwgcmV0OworCisJaWYgKCFsZWRfc3VwcG9ydGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7Ci0JCWlmIChzc2NhbmYoY21kLCAiJXUiLCAmbGVkKSAhPSAxKQorCQlpZiAoc3NjYW5mKGNtZCwgIiVkIiwgJmxlZCkgIT0gMSB8fCBsZWQgPCAwIHx8IGxlZCA+IDcpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlpZiAoc3Ryc3RyKGNtZCwgImJsaW5rIikpIHsKLQkJCWxlZF9jbWQgPSAweGMwOwotCQkJc3lzbF9jbWQgPSAyOwotCQkJYmxlZF9hID0gMjsKLQkJCWJsZWRfYiA9IDE7CisJCWlmIChzdHJzdHIoY21kLCAib2ZmIikpIHsKKwkJCWluZCA9IDA7CiAJCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgIm9uIikpIHsKLQkJCWxlZF9jbWQgPSAweDgwOwotCQkJc3lzbF9jbWQgPSAxOwotCQkJYmxlZF9hID0gMjsKLQkJCWJsZWRfYiA9IDA7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgIm9mZiIpKSB7Ci0JCQlsZWRfY21kID0gc3lzbF9jbWQgPSBibGVkX2EgPSBibGVkX2IgPSAwOworCQkJaW5kID0gMTsKKwkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAiYmxpbmsiKSkgeworCQkJaW5kID0gMjsKIAkJfSBlbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCi0JCWlmIChsZWRfaGFuZGxlKSB7CisKKwkJaWYgKGxlZF9zdXBwb3J0ZWQgPT0gTEVEXzU3MCkgeworCQkJLyogNTcwICovCisJCQlsZWQgPSAxIDw8IGxlZDsKIAkJCWlmICghYWNwaV9ldmFsZihsZWRfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmRkIiwKLQkJCQkJbGVkLCBsZWRfY21kKSkKKwkJCQkJbGVkLCBsZWRfc2xlZF9hcmcxW2luZF0pKQogCQkJCXJldHVybiAtRUlPOwotCQl9IGVsc2UgaWYgKGxlZCA8IDIpIHsKLQkJCWlmIChhY3BpX2V2YWxmKHN5c2xfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmRkIiwKLQkJCQkgICAgICAgbGVkLCBzeXNsX2NtZCkpCisJCX0gZWxzZSBpZiAobGVkX3N1cHBvcnRlZCA9PSBMRURfT0xEKSB7CisJCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAgKi8KKwkJCWxlZCA9IDEgPDwgbGVkOworCQkJcmV0ID0gZWNfd3JpdGUoRUNfSExNUywgbGVkKTsKKwkJCWlmIChyZXQgPj0gMCkKKwkJCQlyZXQgPQorCQkJCSAgICBlY193cml0ZShFQ19ITEJMLCBsZWQgKiBsZWRfZXhwX2hsYmxbaW5kXSk7CisJCQlpZiAocmV0ID49IDApCisJCQkJcmV0ID0KKwkJCQkgICAgZWNfd3JpdGUoRUNfSExDTCwgbGVkICogbGVkX2V4cF9obGNsW2luZF0pOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCS8qIGFsbCBvdGhlcnMgKi8KKwkJCWlmICghYWNwaV9ldmFsZihsZWRfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmRkIiwKKwkJCQkJbGVkLCBsZWRfbGVkX2FyZzFbaW5kXSkpCiAJCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZSBpZiAobGVkID09IDIgJiYgYmxlZF9oYW5kbGUpIHsKLQkJCWlmIChhY3BpX2V2YWxmKGJsZWRfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmRkIiwKLQkJCQkgICAgICAgYmxlZF9hLCBibGVkX2IpKQotCQkJCXJldHVybiAtRUlPOwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJfQogCiAJcmV0dXJuIDA7Ci19CQotCQkKLXN0YXRpYyBpbnQgYmVlcF9yZWFkKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKnApCit9CisKK3N0YXRpYyBpbnQgYmVlcF9yZWFkKGNoYXIgKnApCiB7CiAJaW50IGxlbiA9IDA7CiAKLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHQ8aW50PlxuIik7CisJaWYgKCFiZWVwX2hhbmRsZSkKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7CisJZWxzZSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHN1cHBvcnRlZFxuIik7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdDxjbWQ+ICg8Y21kPiBpcyAwLTE3KVxuIik7CisJfQogCiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCBiZWVwX3dyaXRlKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgYmVlcF93cml0ZShjaGFyICpidWYpCiB7CiAJY2hhciAqY21kOwogCWludCBiZWVwX2NtZDsKIAorCWlmICghYmVlcF9oYW5kbGUpCisJCXJldHVybiAtRU5PREVWOworCiAJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKHNzY2FuZihjbWQsICIldSIsICZiZWVwX2NtZCkgPT0gMSkgeworCQlpZiAoc3NjYW5mKGNtZCwgIiV1IiwgJmJlZXBfY21kKSA9PSAxICYmCisJCSAgICBiZWVwX2NtZCA+PSAwICYmIGJlZXBfY21kIDw9IDE3KSB7CiAJCQkvKiBiZWVwX2NtZCBzZXQgKi8KIAkJfSBlbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoIWFjcGlfZXZhbGYoYmVlcF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIGJlZXBfY21kKSkKKwkJaWYgKCFhY3BpX2V2YWxmKGJlZXBfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmRkIiwgYmVlcF9jbWQsIDApKQogCQkJcmV0dXJuIC1FSU87CiAJfQogCiAJcmV0dXJuIDA7Ci19CQotCQkKK30KKworc3RhdGljIGludCBhY3BpX2VjX3JlYWQoaW50IGksIHU4ICogcCkKK3sKKwlpbnQgdjsKKworCWlmIChlY3JkX2hhbmRsZSkgeworCQlpZiAoIWFjcGlfZXZhbGYoZWNyZF9oYW5kbGUsICZ2LCBOVUxMLCAiZGQiLCBpKSkKKwkJCXJldHVybiAwOworCQkqcCA9IHY7CisJfSBlbHNlIHsKKwkJaWYgKGVjX3JlYWQoaSwgcCkgPCAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9lY193cml0ZShpbnQgaSwgdTggdikKK3sKKwlpZiAoZWN3cl9oYW5kbGUpIHsKKwkJaWYgKCFhY3BpX2V2YWxmKGVjd3JfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmRkIiwgaSwgdikpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpZiAoZWNfd3JpdGUoaSwgdikgPCAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGhlcm1hbF90bXBfc3VwcG9ydGVkOworc3RhdGljIGludCB0aGVybWFsX3VwZHRfc3VwcG9ydGVkOworCitzdGF0aWMgaW50IHRoZXJtYWxfaW5pdCh2b2lkKQoreworCS8qIHRlbXBlcmF0dXJlcyBub3Qgc3VwcG9ydGVkIG9uIDU3MCwgRzR4LCBSMzAsIFIzMSwgUjMyICovCisJdGhlcm1hbF90bXBfc3VwcG9ydGVkID0gYWNwaV9ldmFsZihlY19oYW5kbGUsIE5VTEwsICJUTVA3IiwgInF2Iik7CisKKwkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwl0aGVybWFsX3VwZHRfc3VwcG9ydGVkID0gYWNwaV9ldmFsZihlY19oYW5kbGUsIE5VTEwsICJVUERUIiwgInF2Iik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aGVybWFsX3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgbGVuID0gMDsKKworCWlmICghdGhlcm1hbF90bXBfc3VwcG9ydGVkKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAidGVtcGVyYXR1cmVzOlx0bm90IHN1cHBvcnRlZFxuIik7CisJZWxzZSB7CisJCWludCBpLCB0OworCQljaGFyIHRtcGlbXSA9ICJUTVBpIjsKKwkJczggdG1wWzhdOworCisJCWlmICh0aGVybWFsX3VwZHRfc3VwcG9ydGVkKQorCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlVQRFQiLCAidiIpKQorCQkJCXJldHVybiAtRUlPOworCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXRtcGlbM10gPSAnMCcgKyBpOworCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCisJCQkJcmV0dXJuIC1FSU87CisJCQlpZiAodGhlcm1hbF91cGR0X3N1cHBvcnRlZCkKKwkJCQl0bXBbaV0gPSAodCAtIDI3MzIgKyA1KSAvIDEwOworCQkJZWxzZQorCQkJCXRtcFtpXSA9IHQ7CisJCX0KKworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLAorCQkJICAgICAgICJ0ZW1wZXJhdHVyZXM6XHQlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJCSAgICAgICB0bXBbMF0sIHRtcFsxXSwgdG1wWzJdLCB0bXBbM10sCisJCQkgICAgICAgdG1wWzRdLCB0bXBbNV0sIHRtcFs2XSwgdG1wWzddKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdTggZWNkdW1wX3JlZ3NbMjU2XTsKKworc3RhdGljIGludCBlY2R1bXBfcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCWludCBpLCBqOworCXU4IHY7CisKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiRUMgICAgICAiCisJCSAgICAgICAiICswMCArMDEgKzAyICswMyArMDQgKzA1ICswNiArMDciCisJCSAgICAgICAiICswOCArMDkgKzBhICswYiArMGMgKzBkICswZSArMGZcbiIpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gMTYpIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIkVDIDB4JTAyeDoiLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCWlmICghYWNwaV9lY19yZWFkKGkgKyBqLCAmdikpCisJCQkJYnJlYWs7CisJCQlpZiAodiAhPSBlY2R1bXBfcmVnc1tpICsgal0pCisJCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiAqJTAyeCIsIHYpOworCQkJZWxzZQorCQkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIgICUwMngiLCB2KTsKKwkJCWVjZHVtcF9yZWdzW2kgKyBqXSA9IHY7CisJCX0KKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIlxuIik7CisJCWlmIChqICE9IDE2KQorCQkJYnJlYWs7CisJfQorCisJLyogVGhlc2UgYXJlIHdheSB0b28gZGFuZ2Vyb3VzIHRvIGFkdmVydGlzZSBvcGVubHkuLi4gKi8KKyNpZiAwCisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0MHg8b2Zmc2V0PiAweDx2YWx1ZT4iCisJCSAgICAgICAiICg8b2Zmc2V0PiBpcyAwMC1mZiwgPHZhbHVlPiBpcyAwMC1mZilcbiIpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdDB4PG9mZnNldD4gPHZhbHVlPiAgIgorCQkgICAgICAgIiAoPG9mZnNldD4gaXMgMDAtZmYsIDx2YWx1ZT4gaXMgMC0yNTUpXG4iKTsKKyNlbmRpZgorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgZWNkdW1wX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisJaW50IGksIHY7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoc3NjYW5mKGNtZCwgIjB4JXggMHgleCIsICZpLCAmdikgPT0gMikgeworCQkJLyogaSBhbmQgdiBzZXQgKi8KKwkJfSBlbHNlIGlmIChzc2NhbmYoY21kLCAiMHgleCAldSIsICZpLCAmdikgPT0gMikgeworCQkJLyogaSBhbmQgdiBzZXQgKi8KKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGkgPj0gMCAmJiBpIDwgMjU2ICYmIHYgPj0gMCAmJiB2IDwgMjU2KSB7CisJCQlpZiAoIWFjcGlfZWNfd3JpdGUoaSwgdikpCisJCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19vZmZzZXQgPSAweDMxOworCitzdGF0aWMgaW50IGJyaWdodG5lc3NfcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCXU4IGxldmVsOworCisJaWYgKCFhY3BpX2VjX3JlYWQoYnJpZ2h0bmVzc19vZmZzZXQsICZsZXZlbCkpIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHR1bnJlYWRhYmxlXG4iKTsKKwl9IGVsc2UgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdCVkXG4iLCBsZXZlbCAmIDB4Nyk7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdHVwLCBkb3duXG4iKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0bGV2ZWwgPGxldmVsPiIKKwkJCSAgICAgICAiICg8bGV2ZWw+IGlzIDAtNylcbiIpOworCX0KKworCXJldHVybiBsZW47Cit9CisKKyNkZWZpbmUgQlJJR0hUTkVTU19VUAk0CisjZGVmaW5lIEJSSUdIVE5FU1NfRE9XTgk1CisKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc193cml0ZShjaGFyICpidWYpCit7CisJaW50IGNtb3NfY21kLCBpbmMsIGk7CisJdTggbGV2ZWw7CisJaW50IG5ld19sZXZlbDsKKwljaGFyICpjbWQ7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoIWFjcGlfZWNfcmVhZChicmlnaHRuZXNzX29mZnNldCwgJmxldmVsKSkKKwkJCXJldHVybiAtRUlPOworCQlsZXZlbCAmPSA3OworCisJCWlmIChzdHJsZW5jbXAoY21kLCAidXAiKSA9PSAwKSB7CisJCQluZXdfbGV2ZWwgPSBsZXZlbCA9PSA3ID8gNyA6IGxldmVsICsgMTsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZG93biIpID09IDApIHsKKwkJCW5ld19sZXZlbCA9IGxldmVsID09IDAgPyAwIDogbGV2ZWwgLSAxOworCQl9IGVsc2UgaWYgKHNzY2FuZihjbWQsICJsZXZlbCAlZCIsICZuZXdfbGV2ZWwpID09IDEgJiYKKwkJCSAgIG5ld19sZXZlbCA+PSAwICYmIG5ld19sZXZlbCA8PSA3KSB7CisJCQkvKiBuZXdfbGV2ZWwgc2V0ICovCisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY21vc19jbWQgPSBuZXdfbGV2ZWwgPiBsZXZlbCA/IEJSSUdIVE5FU1NfVVAgOiBCUklHSFRORVNTX0RPV047CisJCWluYyA9IG5ld19sZXZlbCA+IGxldmVsID8gMSA6IC0xOworCQlmb3IgKGkgPSBsZXZlbDsgaSAhPSBuZXdfbGV2ZWw7IGkgKz0gaW5jKSB7CisJCQlpZiAoIWNtb3NfZXZhbChjbW9zX2NtZCkpCisJCQkJcmV0dXJuIC1FSU87CisJCQlpZiAoIWFjcGlfZWNfd3JpdGUoYnJpZ2h0bmVzc19vZmZzZXQsIGkgKyBpbmMpKQorCQkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm9sdW1lX29mZnNldCA9IDB4MzA7CisKK3N0YXRpYyBpbnQgdm9sdW1lX3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgbGVuID0gMDsKKwl1OCBsZXZlbDsKKworCWlmICghYWNwaV9lY19yZWFkKHZvbHVtZV9vZmZzZXQsICZsZXZlbCkpIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHR1bnJlYWRhYmxlXG4iKTsKKwl9IGVsc2UgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdCVkXG4iLCBsZXZlbCAmIDB4Zik7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJtdXRlOlx0XHQlc1xuIiwgb25vZmYobGV2ZWwsIDYpKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0dXAsIGRvd24sIG11dGVcbiIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRsZXZlbCA8bGV2ZWw+IgorCQkJICAgICAgICIgKDxsZXZlbD4gaXMgMC0xNSlcbiIpOworCX0KKworCXJldHVybiBsZW47Cit9CisKKyNkZWZpbmUgVk9MVU1FX0RPV04JMAorI2RlZmluZSBWT0xVTUVfVVAJMQorI2RlZmluZSBWT0xVTUVfTVVURQkyCisKK3N0YXRpYyBpbnQgdm9sdW1lX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwlpbnQgY21vc19jbWQsIGluYywgaTsKKwl1OCBsZXZlbCwgbXV0ZTsKKwlpbnQgbmV3X2xldmVsLCBuZXdfbXV0ZTsKKwljaGFyICpjbWQ7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoIWFjcGlfZWNfcmVhZCh2b2x1bWVfb2Zmc2V0LCAmbGV2ZWwpKQorCQkJcmV0dXJuIC1FSU87CisJCW5ld19tdXRlID0gbXV0ZSA9IGxldmVsICYgMHg0MDsKKwkJbmV3X2xldmVsID0gbGV2ZWwgPSBsZXZlbCAmIDB4ZjsKKworCQlpZiAoc3RybGVuY21wKGNtZCwgInVwIikgPT0gMCkgeworCQkJaWYgKG11dGUpCisJCQkJbmV3X211dGUgPSAwOworCQkJZWxzZQorCQkJCW5ld19sZXZlbCA9IGxldmVsID09IDE1ID8gMTUgOiBsZXZlbCArIDE7CisJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImRvd24iKSA9PSAwKSB7CisJCQlpZiAobXV0ZSkKKwkJCQluZXdfbXV0ZSA9IDA7CisJCQllbHNlCisJCQkJbmV3X2xldmVsID0gbGV2ZWwgPT0gMCA/IDAgOiBsZXZlbCAtIDE7CisJCX0gZWxzZSBpZiAoc3NjYW5mKGNtZCwgImxldmVsICVkIiwgJm5ld19sZXZlbCkgPT0gMSAmJgorCQkJICAgbmV3X2xldmVsID49IDAgJiYgbmV3X2xldmVsIDw9IDE1KSB7CisJCQkvKiBuZXdfbGV2ZWwgc2V0ICovCisJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgIm11dGUiKSA9PSAwKSB7CisJCQluZXdfbXV0ZSA9IDB4NDA7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKG5ld19sZXZlbCAhPSBsZXZlbCkgewkvKiBtdXRlIGRvZXNuJ3QgY2hhbmdlICovCisJCQljbW9zX2NtZCA9IG5ld19sZXZlbCA+IGxldmVsID8gVk9MVU1FX1VQIDogVk9MVU1FX0RPV047CisJCQlpbmMgPSBuZXdfbGV2ZWwgPiBsZXZlbCA/IDEgOiAtMTsKKworCQkJaWYgKG11dGUgJiYgKCFjbW9zX2V2YWwoY21vc19jbWQpIHx8CisJCQkJICAgICAhYWNwaV9lY193cml0ZSh2b2x1bWVfb2Zmc2V0LCBsZXZlbCkpKQorCQkJCXJldHVybiAtRUlPOworCisJCQlmb3IgKGkgPSBsZXZlbDsgaSAhPSBuZXdfbGV2ZWw7IGkgKz0gaW5jKQorCQkJCWlmICghY21vc19ldmFsKGNtb3NfY21kKSB8fAorCQkJCSAgICAhYWNwaV9lY193cml0ZSh2b2x1bWVfb2Zmc2V0LCBpICsgaW5jKSkKKwkJCQkJcmV0dXJuIC1FSU87CisKKwkJCWlmIChtdXRlICYmICghY21vc19ldmFsKFZPTFVNRV9NVVRFKSB8fAorCQkJCSAgICAgIWFjcGlfZWNfd3JpdGUodm9sdW1lX29mZnNldCwKKwkJCQkJCSAgICBuZXdfbGV2ZWwgKyBtdXRlKSkpCisJCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAobmV3X211dGUgIT0gbXV0ZSkgewkvKiBsZXZlbCBkb2Vzbid0IGNoYW5nZSAqLworCQkJY21vc19jbWQgPSBuZXdfbXV0ZSA/IFZPTFVNRV9NVVRFIDogVk9MVU1FX1VQOworCisJCQlpZiAoIWNtb3NfZXZhbChjbW9zX2NtZCkgfHwKKwkJCSAgICAhYWNwaV9lY193cml0ZSh2b2x1bWVfb2Zmc2V0LCBsZXZlbCArIG5ld19tdXRlKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhbl9zdGF0dXNfb2Zmc2V0ID0gMHgyZjsKK3N0YXRpYyBpbnQgZmFuX3JwbV9vZmZzZXQgPSAweDg0OworCitzdGF0aWMgaW50IGZhbl9yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisJaW50IHM7CisJdTggbG8sIGhpLCBzdGF0dXM7CisKKwlpZiAoZ2Zhbl9oYW5kbGUpIHsKKwkJLyogNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkJaWYgKCFhY3BpX2V2YWxmKGdmYW5faGFuZGxlLCAmcywgTlVMTCwgImQiKSkKKwkJCXJldHVybiAtRUlPOworCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsZXZlbDpcdFx0JWRcbiIsIHMpOworCX0gZWxzZSB7CisJCS8qIGFsbCBleGNlcHQgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkJaWYgKCFhY3BpX2VjX3JlYWQoZmFuX3N0YXR1c19vZmZzZXQsICZzdGF0dXMpKQorCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0dW5yZWFkYWJsZVxuIik7CisJCWVsc2UKKwkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdCVzXG4iLAorCQkJCSAgICAgICBlbmFibGVkKHN0YXR1cywgNykpOworCisJCWlmICghYWNwaV9lY19yZWFkKGZhbl9ycG1fb2Zmc2V0LCAmbG8pIHx8CisJCSAgICAhYWNwaV9lY19yZWFkKGZhbl9ycG1fb2Zmc2V0ICsgMSwgJmhpKSkKKwkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzcGVlZDpcdFx0dW5yZWFkYWJsZVxuIik7CisJCWVsc2UKKwkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzcGVlZDpcdFx0JWRcbiIsCisJCQkJICAgICAgIChoaSA8PCA4KSArIGxvKTsKKwl9CisKKwlpZiAoc2Zhbl9oYW5kbGUpCisJCS8qIDU3MCwgNzcweC1KTCAqLworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRsZXZlbCA8bGV2ZWw+IgorCQkJICAgICAgICIgKDxsZXZlbD4gaXMgMC03KVxuIik7CisJaWYgKCFnZmFuX2hhbmRsZSkKKwkJLyogYWxsIGV4Y2VwdCA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlbmFibGUsIGRpc2FibGVcbiIpOworCWlmIChmYW5zX2hhbmRsZSkKKwkJLyogWDMxLCBYNDAgKi8KKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0c3BlZWQgPHNwZWVkPiIKKwkJCSAgICAgICAiICg8c3BlZWQ+IGlzIDAtNjU1MzUpXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgZmFuX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisJaW50IGxldmVsLCBzcGVlZDsKKworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmIChzZmFuX2hhbmRsZSAmJgorCQkgICAgc3NjYW5mKGNtZCwgImxldmVsICVkIiwgJmxldmVsKSA9PSAxICYmCisJCSAgICBsZXZlbCA+PSAwICYmIGxldmVsIDw9IDcpIHsKKwkJCS8qIDU3MCwgNzcweC1KTCAqLworCQkJaWYgKCFhY3BpX2V2YWxmKHNmYW5faGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCBsZXZlbCkpCisJCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSBpZiAoIWdmYW5faGFuZGxlICYmIHN0cmxlbmNtcChjbWQsICJlbmFibGUiKSA9PSAwKSB7CisJCQkvKiBhbGwgZXhjZXB0IDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCisJCQlpZiAoIWFjcGlfZWNfd3JpdGUoZmFuX3N0YXR1c19vZmZzZXQsIDB4ODApKQorCQkJCXJldHVybiAtRUlPOworCQl9IGVsc2UgaWYgKCFnZmFuX2hhbmRsZSAmJiBzdHJsZW5jbXAoY21kLCAiZGlzYWJsZSIpID09IDApIHsKKwkJCS8qIGFsbCBleGNlcHQgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkJCWlmICghYWNwaV9lY193cml0ZShmYW5fc3RhdHVzX29mZnNldCwgMHgwMCkpCisJCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSBpZiAoZmFuc19oYW5kbGUgJiYKKwkJCSAgIHNzY2FuZihjbWQsICJzcGVlZCAlZCIsICZzcGVlZCkgPT0gMSAmJgorCQkJICAgc3BlZWQgPj0gMCAmJiBzcGVlZCA8PSA2NTUzNSkgeworCQkJLyogWDMxLCBYNDAgKi8KKwkJCWlmICghYWNwaV9ldmFsZihmYW5zX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkZGQiLAorCQkJCQlzcGVlZCwgc3BlZWQsIHNwZWVkKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGlibXNbXSA9IHsKIAl7Ci0JCS5uYW1lCT0gImRyaXZlciIsCi0JCS5pbml0CT0gZHJpdmVyX2luaXQsCi0JCS5yZWFkCT0gZHJpdmVyX3JlYWQsCi0JfSwKKwkgLm5hbWUgPSAiZHJpdmVyIiwKKwkgLmluaXQgPSBkcml2ZXJfaW5pdCwKKwkgLnJlYWQgPSBkcml2ZXJfcmVhZCwKKwkgfSwKIAl7Ci0JCS5uYW1lCT0gImhvdGtleSIsCi0JCS5oaWQJPSAiSUJNMDA2OCIsCi0JCS5pbml0CT0gaG90a2V5X2luaXQsCi0JCS5yZWFkCT0gaG90a2V5X3JlYWQsCi0JCS53cml0ZQk9IGhvdGtleV93cml0ZSwKLQkJLmV4aXQJPSBob3RrZXlfZXhpdCwKLQkJLm5vdGlmeQk9IGhvdGtleV9ub3RpZnksCi0JCS5oYW5kbGUJPSAmaGtleV9oYW5kbGUsCi0JCS50eXBlCT0gQUNQSV9ERVZJQ0VfTk9USUZZLAotCX0sCisJIC5uYW1lID0gImhvdGtleSIsCisJIC5oaWQgPSBJQk1fSEtFWV9ISUQsCisJIC5pbml0ID0gaG90a2V5X2luaXQsCisJIC5yZWFkID0gaG90a2V5X3JlYWQsCisJIC53cml0ZSA9IGhvdGtleV93cml0ZSwKKwkgLmV4aXQgPSBob3RrZXlfZXhpdCwKKwkgLm5vdGlmeSA9IGhvdGtleV9ub3RpZnksCisJIC5oYW5kbGUgPSAmaGtleV9oYW5kbGUsCisJIC50eXBlID0gQUNQSV9ERVZJQ0VfTk9USUZZLAorCSB9LAogCXsKLQkJLm5hbWUJPSAiYmx1ZXRvb3RoIiwKLQkJLmluaXQJPSBibHVldG9vdGhfaW5pdCwKLQkJLnJlYWQJPSBibHVldG9vdGhfcmVhZCwKLQkJLndyaXRlCT0gYmx1ZXRvb3RoX3dyaXRlLAotCX0sCisJIC5uYW1lID0gImJsdWV0b290aCIsCisJIC5pbml0ID0gYmx1ZXRvb3RoX2luaXQsCisJIC5yZWFkID0gYmx1ZXRvb3RoX3JlYWQsCisJIC53cml0ZSA9IGJsdWV0b290aF93cml0ZSwKKwkgfSwKIAl7Ci0JCS5uYW1lCT0gInZpZGVvIiwKLQkJLmluaXQJPSB2aWRlb19pbml0LAotCQkucmVhZAk9IHZpZGVvX3JlYWQsCi0JCS53cml0ZQk9IHZpZGVvX3dyaXRlLAotCQkuZXhpdAk9IHZpZGVvX2V4aXQsCi0JfSwKKwkgLm5hbWUgPSAidmlkZW8iLAorCSAuaW5pdCA9IHZpZGVvX2luaXQsCisJIC5yZWFkID0gdmlkZW9fcmVhZCwKKwkgLndyaXRlID0gdmlkZW9fd3JpdGUsCisJIC5leGl0ID0gdmlkZW9fZXhpdCwKKwkgfSwKIAl7Ci0JCS5uYW1lCT0gImxpZ2h0IiwKLQkJLmluaXQJPSBsaWdodF9pbml0LAotCQkucmVhZAk9IGxpZ2h0X3JlYWQsCi0JCS53cml0ZQk9IGxpZ2h0X3dyaXRlLAotCX0sCisJIC5uYW1lID0gImxpZ2h0IiwKKwkgLmluaXQgPSBsaWdodF9pbml0LAorCSAucmVhZCA9IGxpZ2h0X3JlYWQsCisJIC53cml0ZSA9IGxpZ2h0X3dyaXRlLAorCSB9LAogCXsKLQkJLm5hbWUJPSAiZG9jayIsCi0JCS5yZWFkCT0gZG9ja19yZWFkLAotCQkud3JpdGUJPSBkb2NrX3dyaXRlLAotCQkubm90aWZ5CT0gZG9ja19ub3RpZnksCi0JCS5oYW5kbGUJPSAmZG9ja19oYW5kbGUsCi0JCS50eXBlCT0gQUNQSV9TWVNURU1fTk9USUZZLAotCX0sCisJIC5uYW1lID0gImRvY2siLAorCSAucmVhZCA9IGRvY2tfcmVhZCwKKwkgLndyaXRlID0gZG9ja193cml0ZSwKKwkgLm5vdGlmeSA9IGRvY2tfbm90aWZ5LAorCSAuaGFuZGxlID0gJmRvY2tfaGFuZGxlLAorCSAudHlwZSA9IEFDUElfU1lTVEVNX05PVElGWSwKKwkgfSwKIAl7Ci0JCS5uYW1lCT0gImJheSIsCi0JCS5pbml0CT0gYmF5X2luaXQsCi0JCS5yZWFkCT0gYmF5X3JlYWQsCi0JCS53cml0ZQk9IGJheV93cml0ZSwKLQkJLm5vdGlmeQk9IGJheV9ub3RpZnksCi0JCS5oYW5kbGUJPSAmYmF5X2hhbmRsZSwKLQkJLnR5cGUJPSBBQ1BJX1NZU1RFTV9OT1RJRlksCi0JfSwKKwkgLm5hbWUgPSAiZG9jayIsCisJIC5oaWQgPSBJQk1fUENJX0hJRCwKKwkgLm5vdGlmeSA9IGRvY2tfbm90aWZ5LAorCSAuaGFuZGxlID0gJnBjaV9oYW5kbGUsCisJIC50eXBlID0gQUNQSV9TWVNURU1fTk9USUZZLAorCSB9LAogCXsKLQkJLm5hbWUJPSAiY21vcyIsCi0JCS5yZWFkCT0gY21vc19yZWFkLAotCQkud3JpdGUJPSBjbW9zX3dyaXRlLAotCQkuZXhwZXJpbWVudGFsID0gMSwKLQl9LAorCSAubmFtZSA9ICJiYXkiLAorCSAuaW5pdCA9IGJheV9pbml0LAorCSAucmVhZCA9IGJheV9yZWFkLAorCSAud3JpdGUgPSBiYXlfd3JpdGUsCisJIC5ub3RpZnkgPSBiYXlfbm90aWZ5LAorCSAuaGFuZGxlID0gJmJheV9oYW5kbGUsCisJIC50eXBlID0gQUNQSV9TWVNURU1fTk9USUZZLAorCSB9LAogCXsKLQkJLm5hbWUJPSAibGVkIiwKLQkJLnJlYWQJPSBsZWRfcmVhZCwKLQkJLndyaXRlCT0gbGVkX3dyaXRlLAotCQkuZXhwZXJpbWVudGFsID0gMSwKLQl9LAorCSAubmFtZSA9ICJjbW9zIiwKKwkgLnJlYWQgPSBjbW9zX3JlYWQsCisJIC53cml0ZSA9IGNtb3Nfd3JpdGUsCisJIH0sCiAJewotCQkubmFtZQk9ICJiZWVwIiwKLQkJLnJlYWQJPSBiZWVwX3JlYWQsCi0JCS53cml0ZQk9IGJlZXBfd3JpdGUsCi0JCS5leHBlcmltZW50YWwgPSAxLAotCX0sCisJIC5uYW1lID0gImxlZCIsCisJIC5pbml0ID0gbGVkX2luaXQsCisJIC5yZWFkID0gbGVkX3JlYWQsCisJIC53cml0ZSA9IGxlZF93cml0ZSwKKwkgfSwKKwl7CisJIC5uYW1lID0gImJlZXAiLAorCSAucmVhZCA9IGJlZXBfcmVhZCwKKwkgLndyaXRlID0gYmVlcF93cml0ZSwKKwkgfSwKKwl7CisJIC5uYW1lID0gInRoZXJtYWwiLAorCSAuaW5pdCA9IHRoZXJtYWxfaW5pdCwKKwkgLnJlYWQgPSB0aGVybWFsX3JlYWQsCisJIH0sCisJeworCSAubmFtZSA9ICJlY2R1bXAiLAorCSAucmVhZCA9IGVjZHVtcF9yZWFkLAorCSAud3JpdGUgPSBlY2R1bXBfd3JpdGUsCisJIC5leHBlcmltZW50YWwgPSAxLAorCSB9LAorCXsKKwkgLm5hbWUgPSAiYnJpZ2h0bmVzcyIsCisJIC5yZWFkID0gYnJpZ2h0bmVzc19yZWFkLAorCSAud3JpdGUgPSBicmlnaHRuZXNzX3dyaXRlLAorCSAuZXhwZXJpbWVudGFsID0gMSwKKwkgfSwKKwl7CisJIC5uYW1lID0gInZvbHVtZSIsCisJIC5yZWFkID0gdm9sdW1lX3JlYWQsCisJIC53cml0ZSA9IHZvbHVtZV93cml0ZSwKKwkgLmV4cGVyaW1lbnRhbCA9IDEsCisJIH0sCisJeworCSAubmFtZSA9ICJmYW4iLAorCSAucmVhZCA9IGZhbl9yZWFkLAorCSAud3JpdGUgPSBmYW5fd3JpdGUsCisJIC5leHBlcmltZW50YWwgPSAxLAorCSB9LAogfTsKLSNkZWZpbmUgTlVNX0lCTVMgKHNpemVvZihpYm1zKS9zaXplb2YoaWJtc1swXSkpCiAKIHN0YXRpYyBpbnQgZGlzcGF0Y2hfcmVhZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LAogCQkJIGludCAqZW9mLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBpYm1fc3RydWN0ICppYm0gPSAoc3RydWN0IGlibV9zdHJ1Y3QgKilkYXRhOwogCWludCBsZW47Ci0JCisKIAlpZiAoIWlibSB8fCAhaWJtLT5yZWFkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxlbiA9IGlibS0+cmVhZChpYm0sIHBhZ2UpOworCWxlbiA9IGlibS0+cmVhZChwYWdlKTsKIAlpZiAobGVuIDwgMCkKIAkJcmV0dXJuIGxlbjsKIApAQCAtOTU1LDcgKzE2NzAsNyBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBpbnQgZGlzcGF0Y2hfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorc3RhdGljIGludCBkaXNwYXRjaF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiB1c2VyYnVmLAogCQkJICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBpYm1fc3RydWN0ICppYm0gPSAoc3RydWN0IGlibV9zdHJ1Y3QgKilkYXRhOwpAQCAtOTY5LDIwICsxNjg0LDIwIEBACiAJaWYgKCFrZXJuYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoa2VybmJ1ZiwgdXNlcmJ1ZiwgY291bnQpKSB7CisJaWYgKGNvcHlfZnJvbV91c2VyKGtlcm5idWYsIHVzZXJidWYsIGNvdW50KSkgewogCQlrZnJlZShrZXJuYnVmKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJa2VybmJ1Zltjb3VudF0gPSAwOwogCXN0cmNhdChrZXJuYnVmLCAiLCIpOwotCXJldCA9IGlibS0+d3JpdGUoaWJtLCBrZXJuYnVmKTsKKwlyZXQgPSBpYm0tPndyaXRlKGtlcm5idWYpOwogCWlmIChyZXQgPT0gMCkKIAkJcmV0ID0gY291bnQ7CiAKIAlrZnJlZShrZXJuYnVmKTsKIAotICAgICAgICByZXR1cm4gcmV0OworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc3BhdGNoX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKQEAgLTk5NSw3ICsxNzEwLDcgQEAKIAlpYm0tPm5vdGlmeShpYm0sIGV2ZW50KTsKIH0KIAotc3RhdGljIGludCBzZXR1cF9ub3RpZnkoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlpbnQgcmV0OwpAQCAtMTAyMCwxNyArMTczNSwxNSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpYm0tPm5vdGlmeV9pbnN0YWxsZWQgPSAxOwotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaWJtYWNwaV9kZXZpY2VfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBfX2luaXQgaWJtX2RldmljZV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCitzdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKIHsKIAlpbnQgcmV0OwogCkBAIC0xMDQzLDcgKzE3NTYsNyBAQAogCW1lbXNldChpYm0tPmRyaXZlciwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX2RyaXZlcikpOwogCXNwcmludGYoaWJtLT5kcml2ZXItPm5hbWUsICIlcy8lcyIsIElCTV9OQU1FLCBpYm0tPm5hbWUpOwogCWlibS0+ZHJpdmVyLT5pZHMgPSBpYm0tPmhpZDsKLQlpYm0tPmRyaXZlci0+b3BzLmFkZCA9ICZpYm1hY3BpX2RldmljZV9hZGQ7CisJaWJtLT5kcml2ZXItPm9wcy5hZGQgPSAmaWJtX2RldmljZV9hZGQ7CiAKIAlyZXQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoaWJtLT5kcml2ZXIpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0xMDU1LDcgKzE3NjgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaWJtX2luaXQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKK3N0YXRpYyBpbnQgX19pbml0IGlibV9pbml0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwpAQCAtMTA3MSwzMSArMTc4NCwzNCBAQAogCX0KIAogCWlmIChpYm0tPmluaXQpIHsKLQkJcmV0ID0gaWJtLT5pbml0KGlibSk7CisJCXJldCA9IGlibS0+aW5pdCgpOwogCQlpZiAocmV0ICE9IDApCiAJCQlyZXR1cm4gcmV0OwogCQlpYm0tPmluaXRfY2FsbGVkID0gMTsKIAl9CiAKLQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGlibS0+bmFtZSwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAotCQkJCSAgcHJvY19kaXIpOwotCWlmICghZW50cnkpIHsKLQkJcHJpbnRrKElCTV9FUlIgInVuYWJsZSB0byBjcmVhdGUgcHJvYyBlbnRyeSAlc1xuIiwgaWJtLT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwotCWlibS0+cHJvY19jcmVhdGVkID0gMTsKLQkKLQllbnRyeS0+ZGF0YSA9IGlibTsKLQlpZiAoaWJtLT5yZWFkKQorCWlmIChpYm0tPnJlYWQpIHsKKwkJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShpYm0tPm5hbWUsCisJCQkJCSAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCQkgIHByb2NfZGlyKTsKKwkJaWYgKCFlbnRyeSkgeworCQkJcHJpbnRrKElCTV9FUlIgInVuYWJsZSB0byBjcmVhdGUgcHJvYyBlbnRyeSAlc1xuIiwKKwkJCSAgICAgICBpYm0tPm5hbWUpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJCWVudHJ5LT5kYXRhID0gaWJtOwogCQllbnRyeS0+cmVhZF9wcm9jID0gJmRpc3BhdGNoX3JlYWQ7Ci0JaWYgKGlibS0+d3JpdGUpCi0JCWVudHJ5LT53cml0ZV9wcm9jID0gJmRpc3BhdGNoX3dyaXRlOworCQlpZiAoaWJtLT53cml0ZSkKKwkJCWVudHJ5LT53cml0ZV9wcm9jID0gJmRpc3BhdGNoX3dyaXRlOworCQlpYm0tPnByb2NfY3JlYXRlZCA9IDE7CisJfQogCiAJaWYgKGlibS0+bm90aWZ5KSB7CiAJCXJldCA9IHNldHVwX25vdGlmeShpYm0pOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CisJCWlibS0+bm90aWZ5X2luc3RhbGxlZCA9IDE7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMTExLDcgKzE4MjcsNyBAQAogCQlyZW1vdmVfcHJvY19lbnRyeShpYm0tPm5hbWUsIHByb2NfZGlyKTsKIAogCWlmIChpYm0tPmluaXRfY2FsbGVkICYmIGlibS0+ZXhpdCkKLQkJaWJtLT5leGl0KGlibSk7CisJCWlibS0+ZXhpdCgpOwogCiAJaWYgKGlibS0+ZHJpdmVyX3JlZ2lzdGVyZWQpIHsKIAkJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoaWJtLT5kcml2ZXIpOwpAQCAtMTExOSw2MCArMTgzNSw2NiBAQAogCX0KIH0KIAotc3RhdGljIGludCBpYm1faGFuZGxlX2luaXQoY2hhciAqbmFtZSwKLQkJCSAgIGFjcGlfaGFuZGxlICpoYW5kbGUsIGFjcGlfaGFuZGxlIHBhcmVudCwKLQkJCSAgIGNoYXIgKipwYXRocywgaW50IG51bV9wYXRocywgaW50IHJlcXVpcmVkKQorc3RhdGljIHZvaWQgX19pbml0IGlibV9oYW5kbGVfaW5pdChjaGFyICpuYW1lLAorCQkJCSAgIGFjcGlfaGFuZGxlICogaGFuZGxlLCBhY3BpX2hhbmRsZSBwYXJlbnQsCisJCQkJICAgY2hhciAqKnBhdGhzLCBpbnQgbnVtX3BhdGhzLCBjaGFyICoqcGF0aCkKIHsKIAlpbnQgaTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlmb3IgKGk9MDsgaTxudW1fcGF0aHM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBudW1fcGF0aHM7IGkrKykgewogCQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocGFyZW50LCBwYXRoc1tpXSwgaGFuZGxlKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQotCQkJcmV0dXJuIDA7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJKnBhdGggPSBwYXRoc1tpXTsKKwkJCXJldHVybjsKKwkJfQogCX0KLQkKKwogCSpoYW5kbGUgPSBOVUxMOwotCi0JaWYgKHJlcXVpcmVkKSB7Ci0JCXByaW50ayhJQk1fRVJSICIlcyBvYmplY3Qgbm90IGZvdW5kXG4iLCBuYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwogfQogCi0jZGVmaW5lIElCTV9IQU5ETEVfSU5JVChvYmplY3QsIHJlcXVpcmVkKQkJCQlcCisjZGVmaW5lIElCTV9IQU5ETEVfSU5JVChvYmplY3QpCQkJCQkJXAogCWlibV9oYW5kbGVfaW5pdCgjb2JqZWN0LCAmb2JqZWN0IyNfaGFuZGxlLCAqb2JqZWN0IyNfcGFyZW50LAlcCi0JCW9iamVjdCMjX3BhdGhzLCBzaXplb2Yob2JqZWN0IyNfcGF0aHMpL3NpemVvZihjaGFyKiksIHJlcXVpcmVkKQotCisJCW9iamVjdCMjX3BhdGhzLCBBUlJBWV9TSVpFKG9iamVjdCMjX3BhdGhzKSwgJm9iamVjdCMjX3BhdGgpCiAKIHN0YXRpYyBpbnQgc2V0X2libV9wYXJhbShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQogewogCXVuc2lnbmVkIGludCBpOwotCWNoYXIgYXJnX3dpdGhfY29tbWFbMzJdOwogCi0JaWYgKHN0cmxlbih2YWwpID4gMzApCi0JCXJldHVybiAtRU5PU1BDOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlibXMpOyBpKyspCisJCWlmIChzdHJjbXAoaWJtc1tpXS5uYW1lLCBrcC0+bmFtZSkgPT0gMCAmJiBpYm1zW2ldLndyaXRlKSB7CisJCQlpZiAoc3RybGVuKHZhbCkgPiBzaXplb2YoaWJtc1tpXS5wYXJhbSkgLSAyKQorCQkJCXJldHVybiAtRU5PU1BDOworCQkJc3RyY3B5KGlibXNbaV0ucGFyYW0sIHZhbCk7CisJCQlzdHJjYXQoaWJtc1tpXS5wYXJhbSwgIiwiKTsKKwkJCXJldHVybiAwOworCQl9CiAKLQlzdHJjcHkoYXJnX3dpdGhfY29tbWEsIHZhbCk7Ci0Jc3RyY2F0KGFyZ193aXRoX2NvbW1hLCAiLCIpOwotCi0JZm9yIChpPTA7IGk8TlVNX0lCTVM7IGkrKykKLQkJaWYgKHN0cmNtcChpYm1zW2ldLm5hbWUsIGtwLT5uYW1lKSA9PSAwKQotCQkJcmV0dXJuIGlibXNbaV0ud3JpdGUoJmlibXNbaV0sIGFyZ193aXRoX2NvbW1hKTsKLQlCVUcoKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAogI2RlZmluZSBJQk1fUEFSQU0oZmVhdHVyZSkgXAogCW1vZHVsZV9wYXJhbV9jYWxsKGZlYXR1cmUsIHNldF9pYm1fcGFyYW0sIE5VTEwsIE5VTEwsIDApCiAKK0lCTV9QQVJBTShob3RrZXkpOworSUJNX1BBUkFNKGJsdWV0b290aCk7CitJQk1fUEFSQU0odmlkZW8pOworSUJNX1BBUkFNKGxpZ2h0KTsKK0lCTV9QQVJBTShkb2NrKTsKK0lCTV9QQVJBTShiYXkpOworSUJNX1BBUkFNKGNtb3MpOworSUJNX1BBUkFNKGxlZCk7CitJQk1fUEFSQU0oYmVlcCk7CitJQk1fUEFSQU0oZWNkdW1wKTsKK0lCTV9QQVJBTShicmlnaHRuZXNzKTsKK0lCTV9QQVJBTSh2b2x1bWUpOworSUJNX1BBUkFNKGZhbik7CisKIHN0YXRpYyB2b2lkIGFjcGlfaWJtX2V4aXQodm9pZCkKIHsKIAlpbnQgaTsKIAotCWZvciAoaT1OVU1fSUJNUy0xOyBpPj0wOyBpLS0pCisJZm9yIChpID0gQVJSQVlfU0laRShpYm1zKSAtIDE7IGkgPj0gMDsgaS0tKQogCQlpYm1fZXhpdCgmaWJtc1tpXSk7CiAKIAlyZW1vdmVfcHJvY19lbnRyeShJQk1fRElSLCBhY3BpX3Jvb3RfZGlyKTsKQEAgLTExODUsMzAgKzE5MDcsNDAgQEAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoIWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpewotCQlwcmludGsoSUJNX0VSUiAiVXNpbmcgZ2VuZXJpYyBob3RrZXkgZHJpdmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CQorCWlmICghYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCkgeworCQlwcmludGsoSUJNX0VSUiAidXNpbmcgZ2VuZXJpYyBob3RrZXkgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCS8qIHRoZXNlIGhhbmRsZXMgYXJlIHJlcXVpcmVkICovCi0JaWYgKElCTV9IQU5ETEVfSU5JVChlYywJICAxKSA8IDAgfHwKLQkgICAgSUJNX0hBTkRMRV9JTklUKGhrZXksIDEpIDwgMCB8fAotCSAgICBJQk1fSEFORExFX0lOSVQodmlkLCAgMSkgPCAwIHx8Ci0JICAgIElCTV9IQU5ETEVfSU5JVChiZWVwLCAxKSA8IDApCi0JCXJldHVybiAtRU5PREVWOwogCi0JLyogdGhlc2UgaGFuZGxlcyBoYXZlIGFsdGVybmF0aXZlcyAqLwotCUlCTV9IQU5ETEVfSU5JVChsZ2h0LCAwKTsKLQlpZiAoSUJNX0hBTkRMRV9JTklUKGNtb3MsICFsZ2h0X2hhbmRsZSkgPCAwKQorCS8qIGVjIGlzIHJlcXVpcmVkIGJlY2F1c2UgbWFueSBvdGhlciBoYW5kbGVzIGFyZSByZWxhdGl2ZSB0byBpdCAqLworCUlCTV9IQU5ETEVfSU5JVChlYyk7CisJaWYgKCFlY19oYW5kbGUpIHsKKwkJcHJpbnRrKElCTV9FUlIgImVjIG9iamVjdCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKLQlJQk1fSEFORExFX0lOSVQoc3lzbCwgMCk7Ci0JaWYgKElCTV9IQU5ETEVfSU5JVChsZWQsICFzeXNsX2hhbmRsZSkgPCAwKQotCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAkvKiB0aGVzZSBoYW5kbGVzIGFyZSBub3QgcmVxdWlyZWQgKi8KLQlJQk1fSEFORExFX0lOSVQoZG9jaywgIDApOwotCUlCTV9IQU5ETEVfSU5JVChiYXksICAgMCk7Ci0JSUJNX0hBTkRMRV9JTklUKGJheWVqLCAwKTsKLQlJQk1fSEFORExFX0lOSVQoYmxlZCwgIDApOworCUlCTV9IQU5ETEVfSU5JVCh2aWQpOworCUlCTV9IQU5ETEVfSU5JVCh2aWQyKTsKKwlJQk1fSEFORExFX0lOSVQobGVkYik7CisJSUJNX0hBTkRMRV9JTklUKGxlZCk7CisJSUJNX0hBTkRMRV9JTklUKGhrZXkpOworCUlCTV9IQU5ETEVfSU5JVChsZ2h0KTsKKwlJQk1fSEFORExFX0lOSVQoY21vcyk7CisJSUJNX0hBTkRMRV9JTklUKGRvY2spOworCUlCTV9IQU5ETEVfSU5JVChwY2kpOworCUlCTV9IQU5ETEVfSU5JVChiYXkpOworCWlmIChiYXlfaGFuZGxlKQorCQlJQk1fSEFORExFX0lOSVQoYmF5X2VqKTsKKwlJQk1fSEFORExFX0lOSVQoYmF5Mik7CisJaWYgKGJheTJfaGFuZGxlKQorCQlJQk1fSEFORExFX0lOSVQoYmF5Ml9laik7CisJSUJNX0hBTkRMRV9JTklUKGJlZXApOworCUlCTV9IQU5ETEVfSU5JVChlY3JkKTsKKwlJQk1fSEFORExFX0lOSVQoZWN3cik7CisJSUJNX0hBTkRMRV9JTklUKGZhbnMpOworCUlCTV9IQU5ETEVfSU5JVChnZmFuKTsKKwlJQk1fSEFORExFX0lOSVQoc2Zhbik7CiAKIAlwcm9jX2RpciA9IHByb2NfbWtkaXIoSUJNX0RJUiwgYWNwaV9yb290X2Rpcik7CiAJaWYgKCFwcm9jX2RpcikgewpAQCAtMTIxNiw5ICsxOTQ4LDExIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlwcm9jX2Rpci0+b3duZXIgPSBUSElTX01PRFVMRTsKLQkKLQlmb3IgKGk9MDsgaTxOVU1fSUJNUzsgaSsrKSB7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpYm1zKTsgaSsrKSB7CiAJCXJldCA9IGlibV9pbml0KCZpYm1zW2ldKTsKKwkJaWYgKHJldCA+PSAwICYmICppYm1zW2ldLnBhcmFtKQorCQkJcmV0ID0gaWJtc1tpXS53cml0ZShpYm1zW2ldLnBhcmFtKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWFjcGlfaWJtX2V4aXQoKTsKIAkJCXJldHVybiByZXQ7CkBAIC0xMjMwLDE3ICsxOTY0LDMgQEAKIAogbW9kdWxlX2luaXQoYWNwaV9pYm1faW5pdCk7CiBtb2R1bGVfZXhpdChhY3BpX2libV9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiQm9yaXNsYXYgRGVpYW5vdiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKElCTV9ERVNDKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotSUJNX1BBUkFNKGhvdGtleSk7Ci1JQk1fUEFSQU0oYmx1ZXRvb3RoKTsKLUlCTV9QQVJBTSh2aWRlbyk7Ci1JQk1fUEFSQU0obGlnaHQpOwotSUJNX1BBUkFNKGRvY2spOwotSUJNX1BBUkFNKGJheSk7Ci1JQk1fUEFSQU0oY21vcyk7Ci1JQk1fUEFSQU0obGVkKTsKLUlCTV9QQVJBTShiZWVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9tb3RoZXJib2FyZC5jIGIvZHJpdmVycy9hY3BpL21vdGhlcmJvYXJkLmMKaW5kZXggNjFlYTcwNy4uZTkyOGU4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL21vdGhlcmJvYXJkLmMKKysrIGIvZHJpdmVycy9hY3BpL21vdGhlcmJvYXJkLmMKQEAgLTMwLDEyICszMCwxMSBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9TWVNURU1fQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImFjcGlfbW90aGVyYm9hcmQiKQorQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9tb3RoZXJib2FyZCIpCiAKIC8qIERlbGwgdXNlIFBOUDBDMDEgaW5zdGVhZCBvZiBQTlAwQzAyICovCiAjZGVmaW5lIEFDUElfTUJfSElEMQkJCSJQTlAwQzAxIgogI2RlZmluZSBBQ1BJX01CX0hJRDIJCQkiUE5QMEMwMiIKLQogLyoqCiAgKiBEb2Vzbid0IGNhcmUgYWJvdXQgbGVnYWN5IElPIHBvcnRzLCBvbmx5IElPIHBvcnRzIGJleW9uZCAweDEwMDAgYXJlIHJlc2VydmVkCiAgKiBEb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGZhaWx1cmUgb2YgJ3JlcXVlc3RfcmVnaW9uJywgc2luY2Ugb3RoZXIgbWF5IHJlc2VydmUgCkBAIC00NCwxNSArNDMsMTIgQEAKICNkZWZpbmUgSVNfUkVTRVJWRURfQUREUihiYXNlLCBsZW4pIFwKIAkoKChsZW4pID4gMCkgJiYgKChiYXNlKSA+IDApICYmICgoYmFzZSkgKyAobGVuKSA8IElPX1NQQUNFX0xJTUlUKSBcCiAJJiYgKChiYXNlKSArIChsZW4pID4gUENJQklPU19NSU5fSU8pKQotCiAvKgogICogQ2xlYXJpbmcgdGhlIGZsYWcgKElPUkVTT1VSQ0VfQlVTWSkgYWxsb3dzIGRyaXZlcnMgdG8gdXNlCiAgKiB0aGUgaW8gcG9ydHMgaWYgdGhleSByZWFsbHkga25vdyB0aGV5IGNhbiB1c2UgaXQsIHdoaWxlCiAgKiBzdGlsbCBwcmV2ZW50aW5nIGhvdHBsdWcgUENJIGRldmljZXMgZnJvbSB1c2luZyBpdC4gCiAgKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3Jlc2VydmVfaW9fcmFuZ2VzIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzLCB2b2lkICpkYXRhKQorc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfcmVzZXJ2ZV9pb19yYW5nZXMoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlcywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcXVlc3RlZF9yZXMgPSBOVUxMOwogCkBAIC02MywyMiArNTksMzIgQEAKIAogCQlpZiAoaW9fcmVzLT5taW5fYmFzZV9hZGRyZXNzICE9IGlvX3Jlcy0+bWF4X2Jhc2VfYWRkcmVzcykKIAkJCXJldHVybl9WQUxVRShBRV9PSyk7Ci0JCWlmIChJU19SRVNFUlZFRF9BRERSKGlvX3Jlcy0+bWluX2Jhc2VfYWRkcmVzcywgaW9fcmVzLT5yYW5nZV9sZW5ndGgpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJNb3RoZXJib2FyZCByZXNvdXJjZXMgMHglMDh4IC0gMHglMDh4XG4iLAotCQkJCWlvX3Jlcy0+bWluX2Jhc2VfYWRkcmVzcywgCi0JCQkJaW9fcmVzLT5taW5fYmFzZV9hZGRyZXNzICsgaW9fcmVzLT5yYW5nZV9sZW5ndGgpKTsKLQkJCXJlcXVlc3RlZF9yZXMgPSByZXF1ZXN0X3JlZ2lvbihpb19yZXMtPm1pbl9iYXNlX2FkZHJlc3MsIAotCQkJCWlvX3Jlcy0+cmFuZ2VfbGVuZ3RoLCAibW90aGVyYm9hcmQiKTsKKwkJaWYgKElTX1JFU0VSVkVEX0FERFIKKwkJICAgIChpb19yZXMtPm1pbl9iYXNlX2FkZHJlc3MsIGlvX3Jlcy0+cmFuZ2VfbGVuZ3RoKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkgICJNb3RoZXJib2FyZCByZXNvdXJjZXMgMHglMDh4IC0gMHglMDh4XG4iLAorCQkJCQkgIGlvX3Jlcy0+bWluX2Jhc2VfYWRkcmVzcywKKwkJCQkJICBpb19yZXMtPm1pbl9iYXNlX2FkZHJlc3MgKworCQkJCQkgIGlvX3Jlcy0+cmFuZ2VfbGVuZ3RoKSk7CisJCQlyZXF1ZXN0ZWRfcmVzID0KKwkJCSAgICByZXF1ZXN0X3JlZ2lvbihpb19yZXMtPm1pbl9iYXNlX2FkZHJlc3MsCisJCQkJCSAgIGlvX3Jlcy0+cmFuZ2VfbGVuZ3RoLCAibW90aGVyYm9hcmQiKTsKIAkJfQogCX0gZWxzZSBpZiAocmVzLT5pZCA9PSBBQ1BJX1JTVFlQRV9GSVhFRF9JTykgewotCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyAqZml4ZWRfaW9fcmVzID0gJnJlcy0+ZGF0YS5maXhlZF9pbzsKKwkJc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8gKmZpeGVkX2lvX3JlcyA9CisJCSAgICAmcmVzLT5kYXRhLmZpeGVkX2lvOwogCi0JCWlmIChJU19SRVNFUlZFRF9BRERSKGZpeGVkX2lvX3Jlcy0+YmFzZV9hZGRyZXNzLCBmaXhlZF9pb19yZXMtPnJhbmdlX2xlbmd0aCkpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk1vdGhlcmJvYXJkIHJlc291cmNlcyAweCUwOHggLSAweCUwOHhcbiIsCi0JCQkJZml4ZWRfaW9fcmVzLT5iYXNlX2FkZHJlc3MsIAotCQkJCWZpeGVkX2lvX3Jlcy0+YmFzZV9hZGRyZXNzICsgZml4ZWRfaW9fcmVzLT5yYW5nZV9sZW5ndGgpKTsKLQkJCXJlcXVlc3RlZF9yZXMgPSByZXF1ZXN0X3JlZ2lvbihmaXhlZF9pb19yZXMtPmJhc2VfYWRkcmVzcywgCi0JCQkJZml4ZWRfaW9fcmVzLT5yYW5nZV9sZW5ndGgsICJtb3RoZXJib2FyZCIpOworCQlpZiAoSVNfUkVTRVJWRURfQUREUgorCQkgICAgKGZpeGVkX2lvX3Jlcy0+YmFzZV9hZGRyZXNzLCBmaXhlZF9pb19yZXMtPnJhbmdlX2xlbmd0aCkpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiTW90aGVyYm9hcmQgcmVzb3VyY2VzIDB4JTA4eCAtIDB4JTA4eFxuIiwKKwkJCQkJICBmaXhlZF9pb19yZXMtPmJhc2VfYWRkcmVzcywKKwkJCQkJICBmaXhlZF9pb19yZXMtPmJhc2VfYWRkcmVzcyArCisJCQkJCSAgZml4ZWRfaW9fcmVzLT5yYW5nZV9sZW5ndGgpKTsKKwkJCXJlcXVlc3RlZF9yZXMgPQorCQkJICAgIHJlcXVlc3RfcmVnaW9uKGZpeGVkX2lvX3Jlcy0+YmFzZV9hZGRyZXNzLAorCQkJCQkgICBmaXhlZF9pb19yZXMtPnJhbmdlX2xlbmd0aCwKKwkJCQkJICAgIm1vdGhlcmJvYXJkIik7CiAJCX0KIAl9IGVsc2UgewogCQkvKiBNZW1vcnkgbWFwcGVkIElPPyAqLwpAQCAtODksNzIgKzk1LDcwIEBACiAJcmV0dXJuX1ZBTFVFKEFFX09LKTsKIH0KIAotc3RhdGljIGludCBhY3BpX21vdGhlcmJvYXJkX2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfbW90aGVyYm9hcmRfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlhY3BpX3dhbGtfcmVzb3VyY2VzKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLCAKLQkJYWNwaV9yZXNlcnZlX2lvX3JhbmdlcywgTlVMTCk7CisJYWNwaV93YWxrX3Jlc291cmNlcyhkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKKwkJCSAgICBhY3BpX3Jlc2VydmVfaW9fcmFuZ2VzLCBOVUxMKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfbW90aGVyYm9hcmRfZHJpdmVyMSA9IHsKLQkubmFtZSA9CQkibW90aGVyYm9hcmQiLAotCS5jbGFzcyA9CSIiLAotCS5pZHMgPQkJQUNQSV9NQl9ISUQxLAotCS5vcHMgPQl7Ci0JCS5hZGQgPQkJYWNwaV9tb3RoZXJib2FyZF9hZGQsCi0JfSwKKwkubmFtZSA9ICJtb3RoZXJib2FyZCIsCisJLmNsYXNzID0gIiIsCisJLmlkcyA9IEFDUElfTUJfSElEMSwKKwkub3BzID0geworCQkuYWRkID0gYWNwaV9tb3RoZXJib2FyZF9hZGQsCisJCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfbW90aGVyYm9hcmRfZHJpdmVyMiA9IHsKLQkubmFtZSA9CQkibW90aGVyYm9hcmQiLAotCS5jbGFzcyA9CSIiLAotCS5pZHMgPQkJQUNQSV9NQl9ISUQyLAotCS5vcHMgPQl7Ci0JCS5hZGQgPQkJYWNwaV9tb3RoZXJib2FyZF9hZGQsCi0JfSwKKwkubmFtZSA9ICJtb3RoZXJib2FyZCIsCisJLmNsYXNzID0gIiIsCisJLmlkcyA9IEFDUElfTUJfSElEMiwKKwkub3BzID0geworCQkuYWRkID0gYWNwaV9tb3RoZXJib2FyZF9hZGQsCisJCX0sCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQKLWFjcGlfcmVzZXJ2ZV9yZXNvdXJjZXMgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgYWNwaV9yZXNlcnZlX3Jlc291cmNlcyh2b2lkKQogewogCWlmIChhY3BpX2dibF9GQURULT54cG0xYV9ldnRfYmxrLmFkZHJlc3MgJiYgYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pCi0JCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcywgCi0JCQlhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiwgIlBNMWFfRVZUX0JMSyIpOworCQlyZXF1ZXN0X3JlZ2lvbihhY3BpX2dibF9GQURULT54cG0xYV9ldnRfYmxrLmFkZHJlc3MsCisJCQkgICAgICAgYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4sICJQTTFhX0VWVF9CTEsiKTsKIAogCWlmIChhY3BpX2dibF9GQURULT54cG0xYl9ldnRfYmxrLmFkZHJlc3MgJiYgYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pCiAJCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcywKLQkJCWFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuLCAiUE0xYl9FVlRfQkxLIik7CisJCQkgICAgICAgYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4sICJQTTFiX0VWVF9CTEsiKTsKIAogCWlmIChhY3BpX2dibF9GQURULT54cG0xYV9jbnRfYmxrLmFkZHJlc3MgJiYgYWNwaV9nYmxfRkFEVC0+cG0xX2NudF9sZW4pCi0JCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2NudF9ibGsuYWRkcmVzcywgCi0JCQlhY3BpX2dibF9GQURULT5wbTFfY250X2xlbiwgIlBNMWFfQ05UX0JMSyIpOworCQlyZXF1ZXN0X3JlZ2lvbihhY3BpX2dibF9GQURULT54cG0xYV9jbnRfYmxrLmFkZHJlc3MsCisJCQkgICAgICAgYWNwaV9nYmxfRkFEVC0+cG0xX2NudF9sZW4sICJQTTFhX0NOVF9CTEsiKTsKIAogCWlmIChhY3BpX2dibF9GQURULT54cG0xYl9jbnRfYmxrLmFkZHJlc3MgJiYgYWNwaV9nYmxfRkFEVC0+cG0xX2NudF9sZW4pCi0JCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2NudF9ibGsuYWRkcmVzcywgCi0JCQlhY3BpX2dibF9GQURULT5wbTFfY250X2xlbiwgIlBNMWJfQ05UX0JMSyIpOworCQlyZXF1ZXN0X3JlZ2lvbihhY3BpX2dibF9GQURULT54cG0xYl9jbnRfYmxrLmFkZHJlc3MsCisJCQkgICAgICAgYWNwaV9nYmxfRkFEVC0+cG0xX2NudF9sZW4sICJQTTFiX0NOVF9CTEsiKTsKIAogCWlmIChhY3BpX2dibF9GQURULT54cG1fdG1yX2Jsay5hZGRyZXNzICYmIGFjcGlfZ2JsX0ZBRFQtPnBtX3RtX2xlbiA9PSA0KQotCQlyZXF1ZXN0X3JlZ2lvbihhY3BpX2dibF9GQURULT54cG1fdG1yX2Jsay5hZGRyZXNzLAotCQkJNCwgIlBNX1RNUiIpOworCQlyZXF1ZXN0X3JlZ2lvbihhY3BpX2dibF9GQURULT54cG1fdG1yX2Jsay5hZGRyZXNzLCA0LCAiUE1fVE1SIik7CiAKIAlpZiAoYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrLmFkZHJlc3MgJiYgYWNwaV9nYmxfRkFEVC0+cG0yX2NudF9sZW4pCiAJCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsay5hZGRyZXNzLAotCQkJYWNwaV9nYmxfRkFEVC0+cG0yX2NudF9sZW4sICJQTTJfQ05UX0JMSyIpOworCQkJICAgICAgIGFjcGlfZ2JsX0ZBRFQtPnBtMl9jbnRfbGVuLCAiUE0yX0NOVF9CTEsiKTsKIAogCS8qIExlbmd0aCBvZiBHUEUgYmxvY2tzIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbXVsdGlwbGUgb2YgMiAqLwogCiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPnhncGUwX2Jsay5hZGRyZXNzICYmIGFjcGlfZ2JsX0ZBRFQtPmdwZTBfYmxrX2xlbiAmJgotCQkJIShhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4gJiAweDEpKQorCSAgICAhKGFjcGlfZ2JsX0ZBRFQtPmdwZTBfYmxrX2xlbiAmIDB4MSkpCiAJCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhncGUwX2Jsay5hZGRyZXNzLAotCQkJYWNwaV9nYmxfRkFEVC0+Z3BlMF9ibGtfbGVuLCAiR1BFMF9CTEsiKTsKKwkJCSAgICAgICBhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4sICJHUEUwX0JMSyIpOwogCiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPnhncGUxX2Jsay5hZGRyZXNzICYmIGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmxrX2xlbiAmJgotCQkJIShhY3BpX2dibF9GQURULT5ncGUxX2Jsa19sZW4gJiAweDEpKQorCSAgICAhKGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmxrX2xlbiAmIDB4MSkpCiAJCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhncGUxX2Jsay5hZGRyZXNzLAotCQkJYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuLCAiR1BFMV9CTEsiKTsKKwkJCSAgICAgICBhY3BpX2dibF9GQURULT5ncGUxX2Jsa19sZW4sICJHUEUxX0JMSyIpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX21vdGhlcmJvYXJkX2luaXQodm9pZCkKQEAgLTE2Niw3ICsxNzAsNyBAQAogCSAqIFRoaXMgbW9kdWxlIG11c3QgcnVuIGFmdGVyIHNjYW4uYwogCSAqLwogCWlmICghYWNwaV9kaXNhYmxlZCkKLQkJYWNwaV9yZXNlcnZlX3Jlc291cmNlcyAoKTsKKwkJYWNwaV9yZXNlcnZlX3Jlc291cmNlcygpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWNjZXNzLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWNjZXNzLmMKaW5kZXggZWNlN2E5ZC4uZWRmYmUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FjY2Vzcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYwpAQCAtNDEsMTYgKzQxLDEzIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zYWNjZXNzIikKLQorQUNQSV9NT0RVTEVfTkFNRSgibnNhY2Nlc3MiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY1LDI0ICs2MiwxOSBAQAogICogTVVURVg6ICAgICAgIExvY2tzIG5hbWVzcGFjZSBmb3IgZW50aXJlIGV4ZWN1dGlvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX3Jvb3RfaW5pdGlhbGl6ZSAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfbnNfcm9vdF9pbml0aWFsaXplKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAljb25zdCBzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzICppbml0X3ZhbCA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgKm5ld19ub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBOVUxMOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpuZXdfbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0cmluZyB2YWwgPSBOVUxMOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfcm9vdF9pbml0aWFsaXplIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfcm9vdF9pbml0aWFsaXplIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTEwMiwyNCArOTQsMjYgQEAKIAogCS8qIEVudGVyIHRoZSBwcmUtZGVmaW5lZCBuYW1lcyBpbiB0aGUgbmFtZSB0YWJsZSAqLwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJIkVudGVyaW5nIHByZWRlZmluZWQgZW50cmllcyBpbnRvIG5hbWVzcGFjZVxuIikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIkVudGVyaW5nIHByZWRlZmluZWQgZW50cmllcyBpbnRvIG5hbWVzcGFjZVxuIikpOwogCiAJZm9yIChpbml0X3ZhbCA9IGFjcGlfZ2JsX3ByZV9kZWZpbmVkX25hbWVzOyBpbml0X3ZhbC0+bmFtZTsgaW5pdF92YWwrKykgewogCQkvKiBfT1NJIGlzIG9wdGlvbmFsIGZvciBub3csIHdpbGwgYmUgcGVybWFuZW50IGxhdGVyICovCiAKLQkJaWYgKCFBQ1BJX1NUUkNNUCAoaW5pdF92YWwtPm5hbWUsICJfT1NJIikgJiYgIWFjcGlfZ2JsX2NyZWF0ZV9vc2lfbWV0aG9kKSB7CisJCWlmICghQUNQSV9TVFJDTVAoaW5pdF92YWwtPm5hbWUsICJfT1NJIikKKwkJICAgICYmICFhY3BpX2dibF9jcmVhdGVfb3NpX21ldGhvZCkgewogCQkJY29udGludWU7CiAJCX0KIAotCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAoTlVMTCwgaW5pdF92YWwtPm5hbWUsIGluaXRfdmFsLT50eXBlLAotCQkJCSAgQUNQSV9JTU9ERV9MT0FEX1BBU1MyLCBBQ1BJX05TX05PX1VQU0VBUkNILAotCQkJCSAgTlVMTCwgJm5ld19ub2RlKTsKKwkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAoTlVMTCwgaW5pdF92YWwtPm5hbWUsIGluaXRfdmFsLT50eXBlLAorCQkJCQlBQ1BJX0lNT0RFX0xPQURfUEFTUzIsCisJCQkJCUFDUElfTlNfTk9fVVBTRUFSQ0gsIE5VTEwsICZuZXdfbm9kZSk7CiAKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSB8fCAoIW5ld19ub2RlKSkgLyogTXVzdCBiZSBvbiBzYW1lIGxpbmUgZm9yIGNvZGUgY29udmVydGVyICovIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJDb3VsZCBub3QgY3JlYXRlIHByZWRlZmluZWQgbmFtZSAlcywgJXNcbiIsCi0JCQkJaW5pdF92YWwtPm5hbWUsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgKCFuZXdfbm9kZSkpIHsJLyogTXVzdCBiZSBvbiBzYW1lIGxpbmUgZm9yIGNvZGUgY29udmVydGVyICovCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJDb3VsZCBub3QgY3JlYXRlIHByZWRlZmluZWQgbmFtZSAlcywgJXNcbiIsCisJCQkJCSAgaW5pdF92YWwtPm5hbWUsCisJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJfQogCiAJCS8qCkBAIC0xMjgsMTEgKzEyMiwxMSBAQAogCQkgKiBpbml0aWFsIHZhbHVlLCBjcmVhdGUgdGhlIGluaXRpYWwgdmFsdWUuCiAJCSAqLwogCQlpZiAoaW5pdF92YWwtPnZhbCkgewotCQkJc3RhdHVzID0gYWNwaV9vc19wcmVkZWZpbmVkX292ZXJyaWRlIChpbml0X3ZhbCwgJnZhbCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJDb3VsZCBub3Qgb3ZlcnJpZGUgcHJlZGVmaW5lZCAlc1xuIiwKLQkJCQkJaW5pdF92YWwtPm5hbWUpKTsKKwkJCXN0YXR1cyA9IGFjcGlfb3NfcHJlZGVmaW5lZF9vdmVycmlkZShpbml0X3ZhbCwgJnZhbCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiQ291bGQgbm90IG92ZXJyaWRlIHByZWRlZmluZWQgJXNcbiIsCisJCQkJCQkgIGluaXRfdmFsLT5uYW1lKSk7CiAJCQl9CiAKIAkJCWlmICghdmFsKSB7CkBAIC0xNDMsNyArMTM3LDggQEAKIAkJCSAqIEVudHJ5IHJlcXVlc3RzIGFuIGluaXRpYWwgdmFsdWUsIGFsbG9jYXRlIGEKIAkJCSAqIGRlc2NyaXB0b3IgZm9yIGl0LgogCQkJICovCi0JCQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoaW5pdF92YWwtPnR5cGUpOworCQkJb2JqX2Rlc2MgPQorCQkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChpbml0X3ZhbC0+dHlwZSk7CiAJCQlpZiAoIW9ial9kZXNjKSB7CiAJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtMTU2LDU1ICsxNTEsNjIgQEAKIAkJCSAqLwogCQkJc3dpdGNoIChpbml0X3ZhbC0+dHlwZSkgewogCQkJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgotCQkJCW9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQgPSAodTgpIEFDUElfVE9fSU5URUdFUiAodmFsKTsKKwkJCQlvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50ID0KKwkJCQkgICAgKHU4KSBBQ1BJX1RPX0lOVEVHRVIodmFsKTsKIAkJCQlvYmpfZGVzYy0+Y29tbW9uLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOwogCi0jaWYgZGVmaW5lZCAoX0FDUElfQVNMX0NPTVBJTEVSKSB8fCBkZWZpbmVkIChfQUNQSV9EVU1QX0FwcCkKKyNpZiBkZWZpbmVkIChBQ1BJX0FTTF9DT01QSUxFUikKIAotCQkJCS8qCi0JCQkJICogaV9hU0wgQ29tcGlsZXIgY2hlYXRzIGJ5IHB1dHRpbmcgcGFyYW1ldGVyIGNvdW50Ci0JCQkJICogaW4gdGhlIG93bmVyX2lECi0JCQkJICovCi0JCQkJbmV3X25vZGUtPm93bmVyX2lkID0gb2JqX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudDsKKwkJCQkvKiBzYXZlIHRoZSBwYXJhbWV0ZXIgY291bnQgZm9yIHRoZSBpX2FTTCBjb21waWxlciAqLworCisJCQkJbmV3X25vZGUtPnZhbHVlID0gb2JqX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudDsKICNlbHNlCiAJCQkJLyogTWFyayB0aGlzIGFzIGEgdmVyeSBTUEVDSUFMIG1ldGhvZCAqLwogCi0JCQkJb2JqX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgPSBBTUxfTUVUSE9EX0lOVEVSTkFMX09OTFk7Ci0JCQkJb2JqX2Rlc2MtPm1ldGhvZC5pbXBsZW1lbnRhdGlvbiA9IGFjcGlfdXRfb3NpX2ltcGxlbWVudGF0aW9uOworCQkJCW9ial9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzID0KKwkJCQkgICAgQU1MX01FVEhPRF9JTlRFUk5BTF9PTkxZOworCisjaWZuZGVmIEFDUElfRFVNUF9BUFAKKwkJCQlvYmpfZGVzYy0+bWV0aG9kLmltcGxlbWVudGF0aW9uID0KKwkJCQkgICAgYWNwaV91dF9vc2lfaW1wbGVtZW50YXRpb247CisjZW5kaWYKICNlbmRpZgogCQkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCi0JCQkJb2JqX2Rlc2MtPmludGVnZXIudmFsdWUgPSBBQ1BJX1RPX0lOVEVHRVIgKHZhbCk7CisJCQkJb2JqX2Rlc2MtPmludGVnZXIudmFsdWUgPSBBQ1BJX1RPX0lOVEVHRVIodmFsKTsKIAkJCQlicmVhazsKIAotCiAJCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKIAkJCQkvKgogCQkJCSAqIEJ1aWxkIGFuIG9iamVjdCBhcm91bmQgdGhlIHN0YXRpYyBzdHJpbmcKIAkJCQkgKi8KLQkJCQlvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCA9ICh1MzIpIEFDUElfU1RSTEVOICh2YWwpOworCQkJCW9ial9kZXNjLT5zdHJpbmcubGVuZ3RoID0KKwkJCQkgICAgKHUzMikgQUNQSV9TVFJMRU4odmFsKTsKIAkJCQlvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIgPSB2YWw7CiAJCQkJb2JqX2Rlc2MtPmNvbW1vbi5mbGFncyB8PSBBT1BPQkpfU1RBVElDX1BPSU5URVI7CiAJCQkJYnJlYWs7CiAKLQogCQkJY2FzZSBBQ1BJX1RZUEVfTVVURVg6CiAKIAkJCQlvYmpfZGVzYy0+bXV0ZXgubm9kZSA9IG5ld19ub2RlOwotCQkJCW9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsID0gKHU4KSAoQUNQSV9UT19JTlRFR0VSICh2YWwpIC0gMSk7CisJCQkJb2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwgPQorCQkJCSAgICAodTgpIChBQ1BJX1RPX0lOVEVHRVIodmFsKSAtIDEpOwogCi0JCQkJaWYgKEFDUElfU1RSQ01QIChpbml0X3ZhbC0+bmFtZSwgIl9HTF8iKSA9PSAwKSB7CisJCQkJaWYgKEFDUElfU1RSQ01QKGluaXRfdmFsLT5uYW1lLCAiX0dMXyIpID09IDApIHsKIAkJCQkJLyoKIAkJCQkJICogQ3JlYXRlIGEgY291bnRpbmcgc2VtYXBob3JlIGZvciB0aGUKIAkJCQkJICogZ2xvYmFsIGxvY2sKIAkJCQkJICovCi0JCQkJCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSAoQUNQSV9OT19VTklUX0xJTUlULAotCQkJCQkJCSAxLCAmb2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSk7Ci0JCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlCisJCQkJCSAgICAoQUNQSV9OT19VTklUX0xJTUlULCAxLAorCQkJCQkgICAgICZvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlKTsKKwkJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UKKwkJCQkJCSAgICAob2JqX2Rlc2MpOwogCQkJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCQkJCX0KIApAQCAtMjEyLDU2ICsyMTQsNTggQEAKIAkJCQkJICogV2UganVzdCBjcmVhdGVkIHRoZSBtdXRleCBmb3IgdGhlCiAJCQkJCSAqIGdsb2JhbCBsb2NrLCBzYXZlIGl0CiAJCQkJCSAqLwotCQkJCQlhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUgPSBvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlOwotCQkJCX0KLQkJCQllbHNlIHsKKwkJCQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlID0KKwkJCQkJICAgIG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmU7CisJCQkJfSBlbHNlIHsKIAkJCQkJLyogQ3JlYXRlIGEgbXV0ZXggKi8KIAotCQkJCQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUgKDEsIDEsCi0JCQkJCQkJICAgJm9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUpOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwkJCQkJc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlKDEsIDEsCisJCQkJCQkJCQkgICZvYmpfZGVzYy0+CisJCQkJCQkJCQkgIG11dGV4LgorCQkJCQkJCQkJICBzZW1hcGhvcmUpOworCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZQorCQkJCQkJICAgIChvYmpfZGVzYyk7CiAJCQkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJCQkJfQogCQkJCX0KIAkJCQlicmVhazsKIAotCiAJCQlkZWZhdWx0OgogCi0JCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiVW5zdXBwb3J0ZWQgaW5pdGlhbCB0eXBlIHZhbHVlICVYXG4iLAotCQkJCQlpbml0X3ZhbC0+dHlwZSkpOwotCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5zdXBwb3J0ZWQgaW5pdGlhbCB0eXBlIHZhbHVlICVYXG4iLCBpbml0X3ZhbC0+dHlwZSkpOworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCQkJb2JqX2Rlc2MgPSBOVUxMOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCiAJCQkvKiBTdG9yZSBwb2ludGVyIHRvIHZhbHVlIGRlc2NyaXB0b3IgaW4gdGhlIE5vZGUgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChuZXdfbm9kZSwgb2JqX2Rlc2MsCi0JCQkJCSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKTsKKwkJCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdChuZXdfbm9kZSwgb2JqX2Rlc2MsCisJCQkJCQkgICAgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUKKwkJCQkJCSAgICAgICAob2JqX2Rlc2MpKTsKIAogCQkJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJfQogCX0KIAotCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAogCS8qIFNhdmUgYSBoYW5kbGUgdG8gIl9HUEUiLCBpdCBpcyBhbHdheXMgcHJlc2VudCAqLwogCi0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQlzdGF0dXMgPSBhY3BpX25zX2dldF9ub2RlX2J5X3BhdGggKCJcXF9HUEUiLCBOVUxMLCBBQ1BJX05TX05PX1VQU0VBUkNILAotCQkJCSAgJmFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2dldF9ub2RlX2J5X3BhdGgoIlxcX0dQRSIsIE5VTEwsCisJCQkJCSAgICAgQUNQSV9OU19OT19VUFNFQVJDSCwKKwkJCQkJICAgICAmYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19sb29rdXAKQEAgLTI4Niw2MiArMjkwLDU3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19sb29rdXAgKAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnNjb3BlX2luZm8sCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aG5hbWUsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCWFjcGlfaW50ZXJwcmV0ZXJfbW9kZSAgICAgICAgICAgaW50ZXJwcmV0ZXJfbW9kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqKnJldHVybl9ub2RlKQorYWNwaV9uc19sb29rdXAodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZV9pbmZvLAorCSAgICAgICBjaGFyICpwYXRobmFtZSwKKwkgICAgICAgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCSAgICAgICBhY3BpX2ludGVycHJldGVyX21vZGUgaW50ZXJwcmV0ZXJfbW9kZSwKKwkgICAgICAgdTMyIGZsYWdzLAorCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCSAgICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGggPSBwYXRobmFtZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwcmVmaXhfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpjdXJyZW50X25vZGUgPSBOVUxMOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnRoaXNfbm9kZSA9IE5VTEw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2VnbWVudHM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2FyYXRzOwotCWFjcGlfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX25hbWU7Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlX3RvX2NoZWNrX2ZvcjsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHRoaXNfc2VhcmNoX3R5cGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfcGFyZW50X2ZsYWcgPSBBQ1BJX05TX1NFQVJDSF9QQVJFTlQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9mbGFncyA9IGZsYWdzICYgfihBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EIHwKLQkJCSAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWNoYXIgKnBhdGggPSBwYXRobmFtZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmN1cnJlbnRfbm9kZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnRoaXNfbm9kZSA9IE5VTEw7CisJdTMyIG51bV9zZWdtZW50czsKKwl1MzIgbnVtX2NhcmF0czsKKwlhY3BpX25hbWUgc2ltcGxlX25hbWU7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlX3RvX2NoZWNrX2ZvcjsKKwlhY3BpX29iamVjdF90eXBlIHRoaXNfc2VhcmNoX3R5cGU7CisJdTMyIHNlYXJjaF9wYXJlbnRfZmxhZyA9IEFDUElfTlNfU0VBUkNIX1BBUkVOVDsKKwl1MzIgbG9jYWxfZmxhZ3MgPSBmbGFncyAmIH4oQUNQSV9OU19FUlJPUl9JRl9GT1VORCB8CisJCQkJICAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19sb29rdXAiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2xvb2t1cCIpOwogCiAJaWYgKCFyZXR1cm5fbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJYWNwaV9nYmxfbnNfbG9va3VwX2NvdW50Kys7CiAJKnJldHVybl9ub2RlID0gQUNQSV9FTlRSWV9OT1RfRk9VTkQ7CiAKIAlpZiAoIWFjcGlfZ2JsX3Jvb3Rfbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX05BTUVTUEFDRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19OQU1FU1BBQ0UpOwogCX0KIAogCS8qCiAJICogR2V0IHRoZSBwcmVmaXggc2NvcGUuCiAJICogQSBudWxsIHNjb3BlIG1lYW5zIHVzZSB0aGUgcm9vdCBzY29wZQogCSAqLwotCWlmICgoIXNjb3BlX2luZm8pIHx8Ci0JCSghc2NvcGVfaW5mby0+c2NvcGUubm9kZSkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCQkiTnVsbCBzY29wZSBwcmVmaXgsIHVzaW5nIHJvb3Qgbm9kZSAoJXApXG4iLAotCQkJYWNwaV9nYmxfcm9vdF9ub2RlKSk7CisJaWYgKCghc2NvcGVfaW5mbykgfHwgKCFzY29wZV9pbmZvLT5zY29wZS5ub2RlKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCSAgIk51bGwgc2NvcGUgcHJlZml4LCB1c2luZyByb290IG5vZGUgKCVwKVxuIiwKKwkJCQkgIGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpOwogCiAJCXByZWZpeF9ub2RlID0gYWNwaV9nYmxfcm9vdF9ub2RlOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQlwcmVmaXhfbm9kZSA9IHNjb3BlX2luZm8tPnNjb3BlLm5vZGU7Ci0JCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHByZWZpeF9ub2RlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgibnNfbG9va3VwOiAlcCBpcyBub3QgYSBuYW1lc3BhY2Ugbm9kZSBbJXNdXG4iLAotCQkJCQlwcmVmaXhfbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChwcmVmaXhfbm9kZSkpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKKwkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShwcmVmaXhfbm9kZSkgIT0KKwkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIm5zX2xvb2t1cDogJXAgaXMgbm90IGEgbmFtZXNwYWNlIG5vZGUgWyVzXVxuIiwgcHJlZml4X25vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShwcmVmaXhfbm9kZSkpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogCQl9CiAKIAkJLyoKQEAgLTM0OSw5ICszNDgsOSBAQAogCQkgKiBEZXZpY2UvTWV0aG9kLCBldGMuKSAgSXQgY291bGQgYmUgYSBQYWNrYWdlIG9yIG90aGVyIG9iamVjdCBub2RlLgogCQkgKiBCYWNrdXAgdXAgdGhlIHRyZWUgdG8gZmluZCB0aGUgY29udGFpbmluZyBzY29wZSBub2RlLgogCQkgKi8KLQkJd2hpbGUgKCFhY3BpX25zX29wZW5zX3Njb3BlIChwcmVmaXhfbm9kZS0+dHlwZSkgJiYKLQkJCQlwcmVmaXhfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfQU5ZKSB7Ci0JCQlwcmVmaXhfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlIChwcmVmaXhfbm9kZSk7CisJCXdoaWxlICghYWNwaV9uc19vcGVuc19zY29wZShwcmVmaXhfbm9kZS0+dHlwZSkgJiYKKwkJICAgICAgIHByZWZpeF9ub2RlLT50eXBlICE9IEFDUElfVFlQRV9BTlkpIHsKKwkJCXByZWZpeF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocHJlZml4X25vZGUpOwogCQl9CiAJfQogCkBAIC0zNjYsMTMgKzM2NSwxMyBAQAogCQkvKiBBIE51bGwgbmFtZV9wYXRoIGlzIGFsbG93ZWQgYW5kIHJlZmVycyB0byB0aGUgcm9vdCAqLwogCiAJCW51bV9zZWdtZW50cyA9IDA7Ci0JCXRoaXNfbm9kZSAgICA9IGFjcGlfZ2JsX3Jvb3Rfbm9kZTsKLQkJcGF0aCAgICAgPSAiIjsKKwkJdGhpc19ub2RlID0gYWNwaV9nYmxfcm9vdF9ub2RlOworCQlwYXRoID0gIiI7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCQkiTnVsbCBQYXRobmFtZSAoWmVybyBzZWdtZW50cyksIEZsYWdzPSVYXG4iLCBmbGFncykpOwotCX0KLQllbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkgICJOdWxsIFBhdGhuYW1lIChaZXJvIHNlZ21lbnRzKSwgRmxhZ3M9JVhcbiIsCisJCQkJICBmbGFncykpOworCX0gZWxzZSB7CiAJCS8qCiAJCSAqIE5hbWUgcG9pbnRlciBpcyB2YWxpZCAoYW5kIG11c3QgYmUgaW4gaW50ZXJuYWwgbmFtZSBmb3JtYXQpCiAJCSAqCkBAIC0zOTYsMTUgKzM5NSwxNiBAQAogCiAJCQlwYXRoKys7CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLAotCQkJCSJQYXRoIGlzIGFic29sdXRlIGZyb20gcm9vdCBbJXBdXG4iLCB0aGlzX25vZGUpKTsKLQkJfQotCQllbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCSAgIlBhdGggaXMgYWJzb2x1dGUgZnJvbSByb290IFslcF1cbiIsCisJCQkJCSAgdGhpc19ub2RlKSk7CisJCX0gZWxzZSB7CiAJCQkvKiBQYXRobmFtZSBpcyByZWxhdGl2ZSB0byBjdXJyZW50IHNjb3BlLCBzdGFydCB0aGVyZSAqLwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCQkiU2VhcmNoaW5nIHJlbGF0aXZlIHRvIHByZWZpeCBzY29wZSBbJTQuNHNdICglcClcbiIsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChwcmVmaXhfbm9kZSksIHByZWZpeF9ub2RlKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCQkgICJTZWFyY2hpbmcgcmVsYXRpdmUgdG8gcHJlZml4IHNjb3BlIFslNC40c10gKCVwKVxuIiwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocHJlZml4X25vZGUpLAorCQkJCQkgIHByZWZpeF9ub2RlKSk7CiAKIAkJCS8qCiAJCQkgKiBIYW5kbGUgbXVsdGlwbGUgUGFyZW50IFByZWZpeGVzIChjYXJhdCkgYnkganVzdCBnZXR0aW5nCkBAIC00MjUsMjAgKzQyNSwyMCBAQAogCQkJCS8qIEJhY2t1cCB0byB0aGUgcGFyZW50IG5vZGUgKi8KIAogCQkJCW51bV9jYXJhdHMrKzsKLQkJCQl0aGlzX25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAodGhpc19ub2RlKTsKKwkJCQl0aGlzX25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSh0aGlzX25vZGUpOwogCQkJCWlmICghdGhpc19ub2RlKSB7CiAJCQkJCS8qIEN1cnJlbnQgc2NvcGUgaGFzIG5vIHBhcmVudCBzY29wZSAqLwogCi0JCQkJCUFDUElfUkVQT1JUX0VSUk9SICgKLQkJCQkJCSgiQUNQSSBwYXRoIGhhcyB0b28gbWFueSBwYXJlbnQgcHJlZml4ZXMgKF4pIC0gcmVhY2hlZCBiZXlvbmQgcm9vdCBub2RlXG4iKSk7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0ZPVU5EKTsKKwkJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJBQ1BJIHBhdGggaGFzIHRvbyBtYW55IHBhcmVudCBwcmVmaXhlcyAoXikgLSByZWFjaGVkIGJleW9uZCByb290IG5vZGVcbiIpKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7CiAJCQkJfQogCQkJfQogCiAJCQlpZiAoc2VhcmNoX3BhcmVudF9mbGFnID09IEFDUElfTlNfTk9fVVBTRUFSQ0gpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCQkJIlNlYXJjaCBzY29wZSBpcyBbJTQuNHNdLCBwYXRoIGhhcyAlZCBjYXJhdChzKVxuIiwKLQkJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lICh0aGlzX25vZGUpLCBudW1fY2FyYXRzKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJCSAgIlNlYXJjaCBzY29wZSBpcyBbJTQuNHNdLCBwYXRoIGhhcyAlZCBjYXJhdChzKVxuIiwKKwkJCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lCisJCQkJCQkgICh0aGlzX25vZGUpLCBudW1fY2FyYXRzKSk7CiAJCQl9CiAJCX0KIApAQCAtNDY0LDkgKzQ2NCw5IEBACiAJCQludW1fc2VnbWVudHMgPSAwOwogCQkJdHlwZSA9IHRoaXNfbm9kZS0+dHlwZTsKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCQkJIlByZWZpeC1vbmx5IFBhdGhuYW1lIChaZXJvIG5hbWUgc2VnbWVudHMpLCBGbGFncz0lWFxuIiwKLQkJCQlmbGFncykpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJICAiUHJlZml4LW9ubHkgUGF0aG5hbWUgKFplcm8gbmFtZSBzZWdtZW50cyksIEZsYWdzPSVYXG4iLAorCQkJCQkgIGZsYWdzKSk7CiAJCQlicmVhazsKIAogCQljYXNlIEFNTF9EVUFMX05BTUVfUFJFRklYOgpAQCAtNDgwLDggKzQ4MCw5IEBACiAJCQludW1fc2VnbWVudHMgPSAyOwogCQkJcGF0aCsrOwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCQkiRHVhbCBQYXRobmFtZSAoMiBzZWdtZW50cywgRmxhZ3M9JVgpXG4iLCBmbGFncykpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJICAiRHVhbCBQYXRobmFtZSAoMiBzZWdtZW50cywgRmxhZ3M9JVgpXG4iLAorCQkJCQkgIGZsYWdzKSk7CiAJCQlicmVhazsKIAogCQljYXNlIEFNTF9NVUxUSV9OQU1FX1BSRUZJWF9PUDoKQEAgLTQ5MywxMiArNDk0LDEyIEBACiAJCQkvKiBFeHRyYWN0IHNlZ21lbnQgY291bnQsIHBvaW50IHRvIGZpcnN0IG5hbWUgc2VnbWVudCAqLwogCiAJCQlwYXRoKys7Ci0JCQludW1fc2VnbWVudHMgPSAodTMyKSAodTgpICpwYXRoOworCQkJbnVtX3NlZ21lbnRzID0gKHUzMikgKHU4KSAqIHBhdGg7CiAJCQlwYXRoKys7CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLAotCQkJCSJNdWx0aSBQYXRobmFtZSAoJWQgU2VnbWVudHMsIEZsYWdzPSVYKSBcbiIsCi0JCQkJbnVtX3NlZ21lbnRzLCBmbGFncykpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJICAiTXVsdGkgUGF0aG5hbWUgKCVkIFNlZ21lbnRzLCBGbGFncz0lWCkgXG4iLAorCQkJCQkgIG51bV9zZWdtZW50cywgZmxhZ3MpKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC01MDgsMTUgKzUwOSwxNSBAQAogCQkJICovCiAJCQludW1fc2VnbWVudHMgPSAxOwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCQkiU2ltcGxlIFBhdGhuYW1lICgxIHNlZ21lbnQsIEZsYWdzPSVYKVxuIiwgZmxhZ3MpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCSAgIlNpbXBsZSBQYXRobmFtZSAoMSBzZWdtZW50LCBGbGFncz0lWClcbiIsCisJCQkJCSAgZmxhZ3MpKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJQUNQSV9ERUJVR19FWEVDIChhY3BpX25zX3ByaW50X3BhdGhuYW1lIChudW1fc2VnbWVudHMsIHBhdGgpKTsKKwkJQUNQSV9ERUJVR19FWEVDKGFjcGlfbnNfcHJpbnRfcGF0aG5hbWUobnVtX3NlZ21lbnRzLCBwYXRoKSk7CiAJfQogCi0KIAkvKgogCSAqIFNlYXJjaCBuYW1lc3BhY2UgZm9yIGVhY2ggc2VnbWVudCBvZiB0aGUgbmFtZS4gIExvb3AgdGhyb3VnaCBhbmQKIAkgKiB2ZXJpZnkgKG9yIGFkZCB0byB0aGUgbmFtZXNwYWNlKSBlYWNoIG5hbWUgc2VnbWVudC4KQEAgLTU0MCw3ICs1NDEsNyBAQAogCQkJICogcmVxdWVzdGVkIGl0IEFORCB3ZSBoYXZlIGEgc2luZ2xlLCBub24tZnVsbHktcXVhbGlmaWVkIG5hbWVfc2VnCiAJCQkgKi8KIAkJCWlmICgoc2VhcmNoX3BhcmVudF9mbGFnICE9IEFDUElfTlNfTk9fVVBTRUFSQ0gpICYmCi0JCQkJKGZsYWdzICYgQUNQSV9OU19TRUFSQ0hfUEFSRU5UKSkgeworCQkJICAgIChmbGFncyAmIEFDUElfTlNfU0VBUkNIX1BBUkVOVCkpIHsKIAkJCQlsb2NhbF9mbGFncyB8PSBBQ1BJX05TX1NFQVJDSF9QQVJFTlQ7CiAJCQl9CiAKQEAgLTU1MywyNCArNTU0LDI4IEBACiAKIAkJLyogRXh0cmFjdCBvbmUgQUNQSSBuYW1lIGZyb20gdGhlIGZyb250IG9mIHRoZSBwYXRobmFtZSAqLwogCi0JCUFDUElfTU9WRV8zMl9UT18zMiAoJnNpbXBsZV9uYW1lLCBwYXRoKTsKKwkJQUNQSV9NT1ZFXzMyX1RPXzMyKCZzaW1wbGVfbmFtZSwgcGF0aCk7CiAKIAkJLyogVHJ5IHRvIGZpbmQgdGhlIHNpbmdsZSAoNCBjaGFyYWN0ZXIpIEFDUEkgbmFtZSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfbnNfc2VhcmNoX2FuZF9lbnRlciAoc2ltcGxlX25hbWUsIHdhbGtfc3RhdGUsIGN1cnJlbnRfbm9kZSwKLQkJCQkgaW50ZXJwcmV0ZXJfbW9kZSwgdGhpc19zZWFyY2hfdHlwZSwgbG9jYWxfZmxhZ3MsICZ0aGlzX25vZGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIoc2ltcGxlX25hbWUsIHdhbGtfc3RhdGUsCisJCQkJCSAgICAgY3VycmVudF9ub2RlLCBpbnRlcnByZXRlcl9tb2RlLAorCQkJCQkgICAgIHRoaXNfc2VhcmNoX3R5cGUsIGxvY2FsX2ZsYWdzLAorCQkJCQkgICAgICZ0aGlzX25vZGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CiAJCQkJLyogTmFtZSBub3QgZm91bmQgaW4gQUNQSSBuYW1lc3BhY2UgKi8KIAotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLAotCQkJCQkiTmFtZSBbJTQuNHNdIG5vdCBmb3VuZCBpbiBzY29wZSBbJTQuNHNdICVwXG4iLAotCQkJCQkoY2hhciAqKSAmc2ltcGxlX25hbWUsIChjaGFyICopICZjdXJyZW50X25vZGUtPm5hbWUsCi0JCQkJCWN1cnJlbnRfbm9kZSkpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCQkgICJOYW1lIFslNC40c10gbm90IGZvdW5kIGluIHNjb3BlIFslNC40c10gJXBcbiIsCisJCQkJCQkgIChjaGFyICopJnNpbXBsZV9uYW1lLAorCQkJCQkJICAoY2hhciAqKSZjdXJyZW50X25vZGUtPm5hbWUsCisJCQkJCQkgIGN1cnJlbnRfbm9kZSkpOwogCQkJfQogCiAJCQkqcmV0dXJuX25vZGUgPSB0aGlzX25vZGU7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qCkBAIC01ODYsMTkgKzU5MSwxNiBAQAogCQkgKgogCQkgKiBUaGVuIHdlIGhhdmUgYSB0eXBlIG1pc21hdGNoLiAgSnVzdCB3YXJuIGFuZCBpZ25vcmUgaXQuCiAJCSAqLwotCQlpZiAoKG51bV9zZWdtZW50cyAgICAgICA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotCQkJKHR5cGVfdG9fY2hlY2tfZm9yICAhPSBBQ1BJX1RZUEVfQU5ZKSAgICAgICAgICAgICAgICAgICAmJgotCQkJKHR5cGVfdG9fY2hlY2tfZm9yICAhPSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVMpICAgICAgICAgICAmJgotCQkJKHR5cGVfdG9fY2hlY2tfZm9yICAhPSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSAgICAmJgotCQkJKHR5cGVfdG9fY2hlY2tfZm9yICAhPSBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUpICAgICAgICAgICAmJgotCQkJKHRoaXNfbm9kZS0+dHlwZSAgICAhPSBBQ1BJX1RZUEVfQU5ZKSAgICAgICAgICAgICAgICAgICAmJgotCQkJKHRoaXNfbm9kZS0+dHlwZSAgICAhPSB0eXBlX3RvX2NoZWNrX2ZvcikpIHsKKwkJaWYgKChudW1fc2VnbWVudHMgPT0gMCkgJiYKKwkJICAgICh0eXBlX3RvX2NoZWNrX2ZvciAhPSBBQ1BJX1RZUEVfQU5ZKSAmJgorCQkgICAgKHR5cGVfdG9fY2hlY2tfZm9yICE9IEFDUElfVFlQRV9MT0NBTF9BTElBUykgJiYKKwkJICAgICh0eXBlX3RvX2NoZWNrX2ZvciAhPSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSAmJgorCQkgICAgKHR5cGVfdG9fY2hlY2tfZm9yICE9IEFDUElfVFlQRV9MT0NBTF9TQ09QRSkgJiYKKwkJICAgICh0aGlzX25vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0FOWSkgJiYKKwkJICAgICh0aGlzX25vZGUtPnR5cGUgIT0gdHlwZV90b19jaGVja19mb3IpKSB7CiAJCQkvKiBDb21wbGFpbiBhYm91dCBhIHR5cGUgbWlzbWF0Y2ggKi8KIAotCQkJQUNQSV9SRVBPUlRfV0FSTklORyAoCi0JCQkJKCJuc19sb29rdXA6IFR5cGUgbWlzbWF0Y2ggb24gJTQuNHMgKCVzKSwgc2VhcmNoaW5nIGZvciAoJXMpXG4iLAotCQkJCShjaGFyICopICZzaW1wbGVfbmFtZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0aGlzX25vZGUtPnR5cGUpLAotCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZV90b19jaGVja19mb3IpKSk7CisJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgibnNfbG9va3VwOiBUeXBlIG1pc21hdGNoIG9uICU0LjRzICglcyksIHNlYXJjaGluZyBmb3IgKCVzKVxuIiwgKGNoYXIgKikmc2ltcGxlX25hbWUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0aGlzX25vZGUtPnR5cGUpLCBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZV90b19jaGVja19mb3IpKSk7CiAJCX0KIAogCQkvKgpAQCAtNjI0LDE1ICs2MjYsMTYgQEAKIAkJICogSWYgZW50cnkgaXMgYSB0eXBlIHdoaWNoIG9wZW5zIGEgc2NvcGUsIHB1c2ggdGhlIG5ldyBzY29wZSBvbiB0aGUKIAkJICogc2NvcGUgc3RhY2suCiAJCSAqLwotCQlpZiAoYWNwaV9uc19vcGVuc19zY29wZSAodHlwZSkpIHsKLQkJCXN0YXR1cyA9IGFjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaCAodGhpc19ub2RlLCB0eXBlLCB3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCWlmIChhY3BpX25zX29wZW5zX3Njb3BlKHR5cGUpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaCh0aGlzX25vZGUsIHR5cGUsCisJCQkJCQkgICAgIHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CiAJCX0KIAl9CiAKIAkqcmV0dXJuX25vZGUgPSB0aGlzX25vZGU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FsbG9jLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWxsb2MuYwppbmRleCA1NjUzYTE5Li5jYzdhODVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWxsb2MuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWxsb2MuYwpAQCAtNDEsMjAgKzQxLDE0IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNhbGxvYyIpCitBQ1BJX01PRFVMRV9OQU1FKCJuc2FsbG9jIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgdm9pZAotYWNwaV9uc19yZW1vdmVfcmVmZXJlbmNlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKLQorc3RhdGljIHZvaWQgYWNwaV9uc19yZW1vdmVfcmVmZXJlbmNlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02OCwzMSArNjIsMjYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqCi1hY3BpX25zX2NyZWF0ZV9ub2RlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpCitzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19jcmVhdGVfbm9kZSh1MzIgbmFtZSkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfY3JlYXRlX25vZGUiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19jcmVhdGVfbm9kZSIpOwotCi0KLQlub2RlID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChzaXplb2YgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlKSk7CisJbm9kZSA9IEFDUElfTUVNX0NBTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUpKTsKIAlpZiAoIW5vZGUpIHsKLQkJcmV0dXJuX1BUUiAoTlVMTCk7CisJCXJldHVybl9QVFIoTlVMTCk7CiAJfQogCi0JQUNQSV9NRU1fVFJBQ0tJTkcgKGFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX05TTk9ERV0udG90YWxfYWxsb2NhdGVkKyspOworCUFDUElfTUVNX1RSQUNLSU5HKGFjcGlfZ2JsX25zX25vZGVfbGlzdC0+dG90YWxfYWxsb2NhdGVkKyspOwogCi0Jbm9kZS0+bmFtZS5pbnRlZ2VyICAgPSBuYW1lOworCW5vZGUtPm5hbWUuaW50ZWdlciA9IG5hbWU7CiAJbm9kZS0+cmVmZXJlbmNlX2NvdW50ID0gMTsKLQlBQ1BJX1NFVF9ERVNDUklQVE9SX1RZUEUgKG5vZGUsIEFDUElfREVTQ19UWVBFX05BTUVEKTsKKwlBQ1BJX1NFVF9ERVNDUklQVE9SX1RZUEUobm9kZSwgQUNQSV9ERVNDX1RZUEVfTkFNRUQpOwogCi0JcmV0dXJuX1BUUiAobm9kZSk7CisJcmV0dXJuX1BUUihub2RlKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2RlbGV0ZV9ub2RlCkBAIC0xMDUsMTkgKzk0LDE1IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9uc19kZWxldGVfbm9kZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSkKK3ZvaWQgYWNwaV9uc19kZWxldGVfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwcmV2X25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbmV4dF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJldl9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpuZXh0X25vZGU7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigibnNfZGVsZXRlX25vZGUiLCBub2RlKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgibnNfZGVsZXRlX25vZGUiLCBub2RlKTsKLQotCi0JcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAobm9kZSk7CisJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKTsKIAogCXByZXZfbm9kZSA9IE5VTEw7CiAJbmV4dF9ub2RlID0gcGFyZW50X25vZGUtPmNoaWxkOwpAQCAtMTM2LDMyICsxMjEsMjkgQEAKIAkJaWYgKG5leHRfbm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSB7CiAJCQlwcmV2X25vZGUtPmZsYWdzIHw9IEFOT0JKX0VORF9PRl9QRUVSX0xJU1Q7CiAJCX0KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogTm9kZSBpcyBmaXJzdCBjaGlsZCAoaGFzIG5vIHByZXZpb3VzIHBlZXIpICovCiAKIAkJaWYgKG5leHRfbm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSB7CiAJCQkvKiBObyBwZWVycyBhdCBhbGwgKi8KIAogCQkJcGFyZW50X25vZGUtPmNoaWxkID0gTlVMTDsKLQkJfQotCQllbHNlIHsgICAvKiBMaW5rIHBlZXIgbGlzdCB0byBwYXJlbnQgKi8KKwkJfSBlbHNlIHsJLyogTGluayBwZWVyIGxpc3QgdG8gcGFyZW50ICovCiAKIAkJCXBhcmVudF9ub2RlLT5jaGlsZCA9IG5leHRfbm9kZS0+cGVlcjsKIAkJfQogCX0KIAotCUFDUElfTUVNX1RSQUNLSU5HIChhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9OU05PREVdLnRvdGFsX2ZyZWVkKyspOworCUFDUElfTUVNX1RSQUNLSU5HKGFjcGlfZ2JsX25zX25vZGVfbGlzdC0+dG90YWxfZnJlZWQrKyk7CiAKIAkvKgogCSAqIERldGFjaCBhbiBvYmplY3QgaWYgdGhlcmUgaXMgb25lIHRoZW4gZGVsZXRlIHRoZSBub2RlCiAJICovCi0JYWNwaV9uc19kZXRhY2hfb2JqZWN0IChub2RlKTsKLQlBQ1BJX01FTV9GUkVFIChub2RlKTsKKwlhY3BpX25zX2RldGFjaF9vYmplY3Qobm9kZSk7CisJQUNQSV9NRU1fRlJFRShub2RlKTsKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2luc3RhbGxfbm9kZQpAQCAtMTc2LDMwICsxNTgsMjAgQEAKICAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGEgbmV3IG5hbWVzcGFjZSBub2RlIGFuZCBpbnN0YWxsIGl0IGFtb25nc3QKICAqICAgICAgICAgICAgICBpdHMgcGVlcnMuCiAgKgotICogICAgICAgICAgICAgIE5vdGU6IEN1cnJlbnQgbmFtZXNwYWNlIGxvb2t1cCBpcyBsaW5lYXIgc2VhcmNoLiAgSG93ZXZlciwgdGhlCi0gKiAgICAgICAgICAgICAgbm9kZXMgYXJlIGxpbmtlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIgdG8gMSkgcHV0IGFsbCByZXNlcnZlZAotICogICAgICAgICAgICAgIG5hbWVzIChzdGFydCB3aXRoIHVuZGVyc2NvcmUpIGZpcnN0LCBhbmQgdG8gMikgbWFrZSBhIHJlYWRhYmxlCi0gKiAgICAgICAgICAgICAgbmFtZXNwYWNlIGR1bXAuCisgKiAgICAgICAgICAgICAgTm90ZTogQ3VycmVudCBuYW1lc3BhY2UgbG9va3VwIGlzIGxpbmVhciBzZWFyY2guIFRoaXMgYXBwZWFycworICogICAgICAgICAgICAgIHRvIGJlIHN1ZmZpY2llbnQgYXMgbmFtZXNwYWNlIHNlYXJjaGVzIGNvbnN1bWUgb25seSBhIHNtYWxsCisgKiAgICAgICAgICAgICAgZnJhY3Rpb24gb2YgdGhlIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBBQ1BJIHN1YnN5c3RlbS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX25zX2luc3RhbGxfbm9kZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZSwgICAvKiBQYXJlbnQgKi8KLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLCAgICAgICAgICAvKiBOZXcgQ2hpbGQqLwotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSkKK3ZvaWQgYWNwaV9uc19pbnN0YWxsX25vZGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlLAkvKiBQYXJlbnQgKi8KKwkJCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCS8qIE5ldyBDaGlsZCAqLworCQkJICBhY3BpX29iamVjdF90eXBlIHR5cGUpCiB7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcl9pZCA9IDA7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqY2hpbGRfbm9kZTsKLSNpZmRlZiBBQ1BJX0FMUEhBQkVUSUNfTkFNRVNQQUNFCisJYWNwaV9vd25lcl9pZCBvd25lcl9pZCA9IDA7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkX25vZGU7CiAKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwcmV2aW91c19jaGlsZF9ub2RlOwotI2VuZGlmCi0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19pbnN0YWxsX25vZGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2luc3RhbGxfbm9kZSIpOwogCiAJLyoKIAkgKiBHZXQgdGhlIG93bmVyIElEIGZyb20gdGhlIFdhbGsgc3RhdGUKQEAgLTIxNyw1OSArMTg5LDcgQEAKIAkJcGFyZW50X25vZGUtPmNoaWxkID0gbm9kZTsKIAkJbm9kZS0+ZmxhZ3MgfD0gQU5PQkpfRU5EX09GX1BFRVJfTElTVDsKIAkJbm9kZS0+cGVlciA9IHBhcmVudF9ub2RlOwotCX0KLQllbHNlIHsKLSNpZmRlZiBBQ1BJX0FMUEhBQkVUSUNfTkFNRVNQQUNFCi0JCS8qCi0JCSAqIFdhbGsgdGhlIGxpc3Qgd2hpbHN0IHNlYXJjaGluZyBmb3IgdGhlIGNvcnJlY3QKLQkJICogYWxwaGFiZXRpYyBwbGFjZW1lbnQuCi0JCSAqLwotCQlwcmV2aW91c19jaGlsZF9ub2RlID0gTlVMTDsKLQkJd2hpbGUgKGFjcGlfbnNfY29tcGFyZV9uYW1lcyAoYWNwaV91dF9nZXRfbm9kZV9uYW1lIChjaGlsZF9ub2RlKSwKLQkJCQkgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChub2RlKSkgPCAwKSB7Ci0JCQlpZiAoY2hpbGRfbm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSB7Ci0JCQkJLyogTGFzdCBwZWVyOyAgQ2xlYXIgZW5kLW9mLWxpc3QgZmxhZyAqLwotCi0JCQkJY2hpbGRfbm9kZS0+ZmxhZ3MgJj0gfkFOT0JKX0VORF9PRl9QRUVSX0xJU1Q7Ci0KLQkJCQkvKiBUaGlzIG5vZGUgaXMgdGhlIG5ldyBwZWVyIHRvIHRoZSBjaGlsZCBub2RlICovCi0KLQkJCQljaGlsZF9ub2RlLT5wZWVyID0gbm9kZTsKLQotCQkJCS8qIFRoaXMgbm9kZSBpcyB0aGUgbmV3IGVuZC1vZi1saXN0ICovCi0KLQkJCQlub2RlLT5mbGFncyB8PSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUOwotCQkJCW5vZGUtPnBlZXIgPSBwYXJlbnRfbm9kZTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogR2V0IG5leHQgcGVlciAqLwotCi0JCQlwcmV2aW91c19jaGlsZF9ub2RlID0gY2hpbGRfbm9kZTsKLQkJCWNoaWxkX25vZGUgPSBjaGlsZF9ub2RlLT5wZWVyOwotCQl9Ci0KLQkJLyogRGlkIHRoZSBub2RlIGdldCBpbnNlcnRlZCBhdCB0aGUgZW5kLW9mLWxpc3Q/ICovCi0KLQkJaWYgKCEobm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSkgewotCQkJLyoKLQkJCSAqIExvb3AgYWJvdmUgdGVybWluYXRlZCB3aXRob3V0IHJlYWNoaW5nIHRoZSBlbmQtb2YtbGlzdC4KLQkJCSAqIEluc2VydCB0aGUgbmV3IG5vZGUgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24KLQkJCSAqLwotCQkJaWYgKHByZXZpb3VzX2NoaWxkX25vZGUpIHsKLQkJCQkvKiBJbnNlcnQgbm9kZSBhbHBoYWJldGljYWxseSAqLwotCi0JCQkJbm9kZS0+cGVlciA9IGNoaWxkX25vZGU7Ci0JCQkJcHJldmlvdXNfY2hpbGRfbm9kZS0+cGVlciA9IG5vZGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBJbnNlcnQgbm9kZSBhbHBoYWJldGljYWxseSBhdCBzdGFydCBvZiBsaXN0ICovCi0KLQkJCQlub2RlLT5wZWVyID0gY2hpbGRfbm9kZTsKLQkJCQlwYXJlbnRfbm9kZS0+Y2hpbGQgPSBub2RlOwotCQkJfQotCQl9Ci0jZWxzZQorCX0gZWxzZSB7CiAJCXdoaWxlICghKGNoaWxkX25vZGUtPmZsYWdzICYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCkpIHsKIAkJCWNoaWxkX25vZGUgPSBjaGlsZF9ub2RlLT5wZWVyOwogCQl9CkBAIC0yNzksOSArMTk5LDggQEAKIAkJLyogQ2xlYXIgZW5kLW9mLWxpc3QgZmxhZyAqLwogCiAJCWNoaWxkX25vZGUtPmZsYWdzICY9IH5BTk9CSl9FTkRfT0ZfUEVFUl9MSVNUOwotCQlub2RlLT5mbGFncyAgICAgfD0gQU5PQkpfRU5EX09GX1BFRVJfTElTVDsKKwkJbm9kZS0+ZmxhZ3MgfD0gQU5PQkpfRU5EX09GX1BFRVJfTElTVDsKIAkJbm9kZS0+cGVlciA9IHBhcmVudF9ub2RlOwotI2VuZGlmCiAJfQogCiAJLyogSW5pdCB0aGUgbmV3IGVudHJ5ICovCkBAIC0yODksMjQgKzIwOCwyNSBAQAogCW5vZGUtPm93bmVyX2lkID0gb3duZXJfaWQ7CiAJbm9kZS0+dHlwZSA9ICh1OCkgdHlwZTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLAotCQkiJTQuNHMgKCVzKSBbTm9kZSAlcCBPd25lciAlWF0gYWRkZWQgdG8gJTQuNHMgKCVzKSBbTm9kZSAlcF1cbiIsCi0JCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAobm9kZSksIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAobm9kZS0+dHlwZSksIG5vZGUsIG93bmVyX2lkLAotCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHBhcmVudF9ub2RlKSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChwYXJlbnRfbm9kZS0+dHlwZSksCi0JCXBhcmVudF9ub2RlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCSAgIiU0LjRzICglcykgW05vZGUgJXAgT3duZXIgJVhdIGFkZGVkIHRvICU0LjRzICglcykgW05vZGUgJXBdXG4iLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksCisJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShub2RlLT50eXBlKSwgbm9kZSwgb3duZXJfaWQsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShwYXJlbnRfbm9kZSksCisJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShwYXJlbnRfbm9kZS0+dHlwZSksCisJCQkgIHBhcmVudF9ub2RlKSk7CiAKIAkvKgogCSAqIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50KHMpIG9mIGFsbCBwYXJlbnRzIHVwIHRvCiAJICogdGhlIHJvb3QhCiAJICovCi0Jd2hpbGUgKChub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKG5vZGUpKSAhPSBOVUxMKSB7CisJd2hpbGUgKChub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSkpICE9IE5VTEwpIHsKIAkJbm9kZS0+cmVmZXJlbmNlX2NvdW50Kys7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19kZWxldGVfY2hpbGRyZW4KQEAgLTMyMCwxOCArMjQwLDE0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9uc19kZWxldGVfY2hpbGRyZW4gKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlKQordm9pZCBhY3BpX25zX2RlbGV0ZV9jaGlsZHJlbihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUpCiB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqY2hpbGRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpuZXh0X25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpjaGlsZF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpuZXh0X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdTggZmxhZ3M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgibnNfZGVsZXRlX2NoaWxkcmVuIiwgcGFyZW50X25vZGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoIm5zX2RlbGV0ZV9jaGlsZHJlbiIsIHBhcmVudF9ub2RlKTsKIAogCWlmICghcGFyZW50X25vZGUpIHsKIAkJcmV0dXJuX1ZPSUQ7CkBAIC0zNTAsNDggKzI2Niw0OCBAQAogCWRvIHsKIAkJLyogR2V0IHRoZSB0aGluZ3Mgd2UgbmVlZCAqLwogCi0JCW5leHRfbm9kZSAgID0gY2hpbGRfbm9kZS0+cGVlcjsKLQkJZmxhZ3MgICAgICAgPSBjaGlsZF9ub2RlLT5mbGFnczsKKwkJbmV4dF9ub2RlID0gY2hpbGRfbm9kZS0+cGVlcjsKKwkJZmxhZ3MgPSBjaGlsZF9ub2RlLT5mbGFnczsKIAogCQkvKiBHcmFuZGNoaWxkcmVuIHNob3VsZCBoYXZlIGFsbCBiZWVuIGRlbGV0ZWQgYWxyZWFkeSAqLwogCiAJCWlmIChjaGlsZF9ub2RlLT5jaGlsZCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJGb3VuZCBhIGdyYW5kY2hpbGQhIFA9JXAgQz0lcFxuIiwKLQkJCQlwYXJlbnRfbm9kZSwgY2hpbGRfbm9kZSkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiRm91bmQgYSBncmFuZGNoaWxkISBQPSVwIEM9JXBcbiIsCisJCQkJCSAgcGFyZW50X25vZGUsIGNoaWxkX25vZGUpKTsKIAkJfQogCiAJCS8qIE5vdyB3ZSBjYW4gZnJlZSB0aGlzIGNoaWxkIG9iamVjdCAqLwogCi0JCUFDUElfTUVNX1RSQUNLSU5HIChhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9OU05PREVdLnRvdGFsX2ZyZWVkKyspOworCQlBQ1BJX01FTV9UUkFDS0lORyhhY3BpX2dibF9uc19ub2RlX2xpc3QtPnRvdGFsX2ZyZWVkKyspOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiT2JqZWN0ICVwLCBSZW1haW5pbmcgJVhcbiIsCi0JCQljaGlsZF9ub2RlLCBhY3BpX2dibF9jdXJyZW50X25vZGVfY291bnQpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICJPYmplY3QgJXAsIFJlbWFpbmluZyAlWFxuIiwgY2hpbGRfbm9kZSwKKwkJCQkgIGFjcGlfZ2JsX2N1cnJlbnRfbm9kZV9jb3VudCkpOwogCiAJCS8qCiAJCSAqIERldGFjaCBhbiBvYmplY3QgaWYgdGhlcmUgaXMgb25lLCB0aGVuIGZyZWUgdGhlIGNoaWxkIG5vZGUKIAkJICovCi0JCWFjcGlfbnNfZGV0YWNoX29iamVjdCAoY2hpbGRfbm9kZSk7CisJCWFjcGlfbnNfZGV0YWNoX29iamVjdChjaGlsZF9ub2RlKTsKIAogCQkvKgogCQkgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudChzKSBvZiBhbGwgcGFyZW50cyB1cCB0bwogCQkgKiB0aGUgcm9vdCEgKGNvdW50cyB3ZXJlIGluY3JlbWVudGVkIHdoZW4gdGhlIG5vZGUgd2FzIGNyZWF0ZWQpCiAJCSAqLwogCQlub2RlID0gY2hpbGRfbm9kZTsKLQkJd2hpbGUgKChub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKG5vZGUpKSAhPSBOVUxMKSB7CisJCXdoaWxlICgobm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpKSAhPSBOVUxMKSB7CiAJCQlub2RlLT5yZWZlcmVuY2VfY291bnQtLTsKIAkJfQogCiAJCS8qIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSByZWZlcmVuY2UgcmVtYWluaW5nIG9uIHRoaXMgbm9kZSAqLwogCiAJCWlmIChjaGlsZF9ub2RlLT5yZWZlcmVuY2VfY291bnQgIT0gMSkgewotCQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKAotCQkJCSJFeGlzdGluZyByZWZlcmVuY2VzICglZCkgb24gbm9kZSBiZWluZyBkZWxldGVkICglcClcbiIsCi0JCQkJY2hpbGRfbm9kZS0+cmVmZXJlbmNlX2NvdW50LCBjaGlsZF9ub2RlKSk7CisJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiRXhpc3RpbmcgcmVmZXJlbmNlcyAoJWQpIG9uIG5vZGUgYmVpbmcgZGVsZXRlZCAoJXApXG4iLCBjaGlsZF9ub2RlLT5yZWZlcmVuY2VfY291bnQsIGNoaWxkX25vZGUpKTsKIAkJfQogCiAJCS8qIE5vdyB3ZSBjYW4gZGVsZXRlIHRoZSBub2RlICovCiAKLQkJQUNQSV9NRU1fRlJFRSAoY2hpbGRfbm9kZSk7CisJCUFDUElfTUVNX0ZSRUUoY2hpbGRfbm9kZSk7CiAKIAkJLyogQW5kIG1vdmUgb24gdG8gdGhlIG5leHQgY2hpbGQgaW4gdGhlIGxpc3QgKi8KIApAQCAtMzk5LDcgKzMxNSw2IEBACiAKIAl9IHdoaWxlICghKGZsYWdzICYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCkpOwogCi0KIAkvKiBDbGVhciB0aGUgcGFyZW50J3MgY2hpbGQgcG9pbnRlciAqLwogCiAJcGFyZW50X25vZGUtPmNoaWxkID0gTlVMTDsKQEAgLTQwNyw3ICszMjIsNiBAQAogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9zdWJ0cmVlCkBAIC00MjEsMTYgKzMzNSwxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9zdWJ0cmVlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZSkKK3ZvaWQgYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmNoaWxkX25vZGUgPSBOVUxMOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAxOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpjaGlsZF9ub2RlID0gTlVMTDsKKwl1MzIgbGV2ZWwgPSAxOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfZGVsZXRlX25hbWVzcGFjZV9zdWJ0cmVlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUiKTsKIAogCWlmICghcGFyZW50X25vZGUpIHsKIAkJcmV0dXJuX1ZPSUQ7CkBAIC00NDMsMTYgKzM1MywxNyBAQAogCXdoaWxlIChsZXZlbCA+IDApIHsKIAkJLyogR2V0IHRoZSBuZXh0IG5vZGUgaW4gdGhpcyBzY29wZSAoTlVMTCBpZiBub25lKSAqLwogCi0JCWNoaWxkX25vZGUgPSBhY3BpX25zX2dldF9uZXh0X25vZGUgKEFDUElfVFlQRV9BTlksIHBhcmVudF9ub2RlLAotCQkJCSBjaGlsZF9ub2RlKTsKKwkJY2hpbGRfbm9kZSA9IGFjcGlfbnNfZ2V0X25leHRfbm9kZShBQ1BJX1RZUEVfQU5ZLCBwYXJlbnRfbm9kZSwKKwkJCQkJCSAgIGNoaWxkX25vZGUpOwogCQlpZiAoY2hpbGRfbm9kZSkgewogCQkJLyogRm91bmQgYSBjaGlsZCBub2RlIC0gZGV0YWNoIGFueSBhdHRhY2hlZCBvYmplY3QgKi8KIAotCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0IChjaGlsZF9ub2RlKTsKKwkJCWFjcGlfbnNfZGV0YWNoX29iamVjdChjaGlsZF9ub2RlKTsKIAogCQkJLyogQ2hlY2sgaWYgdGhpcyBub2RlIGhhcyBhbnkgY2hpbGRyZW4gKi8KIAotCQkJaWYgKGFjcGlfbnNfZ2V0X25leHRfbm9kZSAoQUNQSV9UWVBFX0FOWSwgY2hpbGRfbm9kZSwgTlVMTCkpIHsKKwkJCWlmIChhY3BpX25zX2dldF9uZXh0X25vZGUKKwkJCSAgICAoQUNQSV9UWVBFX0FOWSwgY2hpbGRfbm9kZSwgTlVMTCkpIHsKIAkJCQkvKgogCQkJCSAqIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGlsZCBvZiB0aGlzIG5vZGUsCiAJCQkJICogdmlzaXQgdGhlIG5vZGUKQEAgLTQ2MSw4ICszNzIsNyBAQAogCQkJCXBhcmVudF9ub2RlID0gY2hpbGRfbm9kZTsKIAkJCQljaGlsZF9ub2RlID0gTlVMTDsKIAkJCX0KLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBObyBtb3JlIGNoaWxkcmVuIG9mIHRoaXMgcGFyZW50IG5vZGUuCiAJCQkgKiBNb3ZlIHVwIHRvIHRoZSBncmFuZHBhcmVudC4KQEAgLTQ3Myw3ICszODMsNyBAQAogCQkJICogTm93IGRlbGV0ZSBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgcGFyZW50CiAJCQkgKiBhbGwgYXQgdGhlIHNhbWUgdGltZS4KIAkJCSAqLwotCQkJYWNwaV9uc19kZWxldGVfY2hpbGRyZW4gKHBhcmVudF9ub2RlKTsKKwkJCWFjcGlfbnNfZGVsZXRlX2NoaWxkcmVuKHBhcmVudF9ub2RlKTsKIAogCQkJLyogTmV3ICJsYXN0IGNoaWxkIiBpcyB0aGlzIHBhcmVudCBub2RlICovCiAKQEAgLTQ4MSwxNCArMzkxLDEzIEBACiAKIAkJCS8qIE1vdmUgdXAgdGhlIHRyZWUgdG8gdGhlIGdyYW5kcGFyZW50ICovCiAKLQkJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKHBhcmVudF9ub2RlKTsKKwkJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocGFyZW50X25vZGUpOwogCQl9CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19yZW1vdmVfcmVmZXJlbmNlCkBAIC01MDQsMTYgKzQxMywxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX25zX3JlbW92ZV9yZWZlcmVuY2UgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCitzdGF0aWMgdm9pZCBhY3BpX25zX3JlbW92ZV9yZWZlcmVuY2Uoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCiB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqdGhpc19ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqdGhpc19ub2RlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyoKIAkgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudChzKSBvZiB0aGlzIG5vZGUgYW5kIGFsbApAQCAtNTIzLDcgKzQyOCw3IEBACiAJd2hpbGUgKHRoaXNfbm9kZSkgewogCQkvKiBQcmVwYXJlIHRvIG1vdmUgdXAgdG8gcGFyZW50ICovCiAKLQkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAodGhpc19ub2RlKTsKKwkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSh0aGlzX25vZGUpOwogCiAJCS8qIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoaXMgbm9kZSAqLwogCkBAIC01MzQsMTUgKzQzOSwxNCBAQAogCQlpZiAoIXRoaXNfbm9kZS0+cmVmZXJlbmNlX2NvdW50KSB7CiAJCQkvKiBEZWxldGUgYWxsIGNoaWxkcmVuIGFuZCBkZWxldGUgdGhlIG5vZGUgKi8KIAotCQkJYWNwaV9uc19kZWxldGVfY2hpbGRyZW4gKHRoaXNfbm9kZSk7Ci0JCQlhY3BpX25zX2RlbGV0ZV9ub2RlICh0aGlzX25vZGUpOworCQkJYWNwaV9uc19kZWxldGVfY2hpbGRyZW4odGhpc19ub2RlKTsKKwkJCWFjcGlfbnNfZGVsZXRlX25vZGUodGhpc19ub2RlKTsKIAkJfQogCiAJCXRoaXNfbm9kZSA9IHBhcmVudF9ub2RlOwogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIKQEAgLTU1NywyMyArNDYxLDIzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyX2lkKQordm9pZCBhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIoYWNwaV9vd25lcl9pZCBvd25lcl9pZCkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpjaGlsZF9ub2RlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmRlbGV0aW9uX25vZGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY2hpbGRfbm9kZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGVsZXRpb25fbm9kZTsKKwl1MzIgbGV2ZWw7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoIm5zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIiLCBvd25lcl9pZCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMiAoIm5zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIiLCBvd25lcl9pZCk7CisJaWYgKG93bmVyX2lkID09IDApIHsKKwkJcmV0dXJuX1ZPSUQ7CisJfQogCi0KLQlwYXJlbnRfbm9kZSAgID0gYWNwaV9nYmxfcm9vdF9ub2RlOwotCWNoaWxkX25vZGUgICAgPSBOVUxMOworCXBhcmVudF9ub2RlID0gYWNwaV9nYmxfcm9vdF9ub2RlOworCWNoaWxkX25vZGUgPSBOVUxMOwogCWRlbGV0aW9uX25vZGUgPSBOVUxMOwotCWxldmVsICAgICAgICAgPSAxOworCWxldmVsID0gMTsKIAogCS8qCiAJICogVHJhdmVyc2UgdGhlIHRyZWUgb2Ygbm9kZXMgdW50aWwgd2UgYnViYmxlIGJhY2sgdXAKQEAgLTU4NCwxMCArNDg4LDEyIEBACiAJCSAqIEdldCB0aGUgbmV4dCBjaGlsZCBvZiB0aGlzIHBhcmVudCBub2RlLiBXaGVuIGNoaWxkX25vZGUgaXMgTlVMTCwKIAkJICogdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBwYXJlbnQgaXMgcmV0dXJuZWQKIAkJICovCi0JCWNoaWxkX25vZGUgPSBhY3BpX25zX2dldF9uZXh0X25vZGUgKEFDUElfVFlQRV9BTlksIHBhcmVudF9ub2RlLCBjaGlsZF9ub2RlKTsKKwkJY2hpbGRfbm9kZSA9CisJCSAgICBhY3BpX25zX2dldF9uZXh0X25vZGUoQUNQSV9UWVBFX0FOWSwgcGFyZW50X25vZGUsCisJCQkJCSAgY2hpbGRfbm9kZSk7CiAKIAkJaWYgKGRlbGV0aW9uX25vZGUpIHsKLQkJCWFjcGlfbnNfcmVtb3ZlX3JlZmVyZW5jZSAoZGVsZXRpb25fbm9kZSk7CisJCQlhY3BpX25zX3JlbW92ZV9yZWZlcmVuY2UoZGVsZXRpb25fbm9kZSk7CiAJCQlkZWxldGlvbl9ub2RlID0gTlVMTDsKIAkJfQogCkBAIC01OTUsMTIgKzUwMSwxMyBAQAogCQkJaWYgKGNoaWxkX25vZGUtPm93bmVyX2lkID09IG93bmVyX2lkKSB7CiAJCQkJLyogRm91bmQgYSBtYXRjaGluZyBjaGlsZCBub2RlIC0gZGV0YWNoIGFueSBhdHRhY2hlZCBvYmplY3QgKi8KIAotCQkJCWFjcGlfbnNfZGV0YWNoX29iamVjdCAoY2hpbGRfbm9kZSk7CisJCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KGNoaWxkX25vZGUpOwogCQkJfQogCiAJCQkvKiBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIGFueSBjaGlsZHJlbiAqLwogCi0JCQlpZiAoYWNwaV9uc19nZXRfbmV4dF9ub2RlIChBQ1BJX1RZUEVfQU5ZLCBjaGlsZF9ub2RlLCBOVUxMKSkgeworCQkJaWYgKGFjcGlfbnNfZ2V0X25leHRfbm9kZQorCQkJICAgIChBQ1BJX1RZUEVfQU5ZLCBjaGlsZF9ub2RlLCBOVUxMKSkgewogCQkJCS8qCiAJCQkJICogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoaWxkIG9mIHRoaXMgbm9kZSwKIAkJCQkgKiB2aXNpdCB0aGUgbm9kZQpAQCAtNjA4LDEyICs1MTUsMTAgQEAKIAkJCQlsZXZlbCsrOwogCQkJCXBhcmVudF9ub2RlID0gY2hpbGRfbm9kZTsKIAkJCQljaGlsZF9ub2RlID0gTlVMTDsKLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkX25vZGUtPm93bmVyX2lkID09IG93bmVyX2lkKSB7CisJCQl9IGVsc2UgaWYgKGNoaWxkX25vZGUtPm93bmVyX2lkID09IG93bmVyX2lkKSB7CiAJCQkJZGVsZXRpb25fbm9kZSA9IGNoaWxkX25vZGU7CiAJCQl9Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogTm8gbW9yZSBjaGlsZHJlbiBvZiB0aGlzIHBhcmVudCBub2RlLgogCQkJICogTW92ZSB1cCB0byB0aGUgZ3JhbmRwYXJlbnQuCkBAIC02MzEsNjIgKzUzNiw5IEBACiAKIAkJCS8qIE1vdmUgdXAgdGhlIHRyZWUgdG8gdGhlIGdyYW5kcGFyZW50ICovCiAKLQkJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKHBhcmVudF9ub2RlKTsKKwkJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocGFyZW50X25vZGUpOwogCQl9CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9Ci0KLQotI2lmZGVmIEFDUElfQUxQSEFCRVRJQ19OQU1FU1BBQ0UKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY29tcGFyZV9uYW1lcwotICoKLSAqIFBBUkFNRVRFUlM6ICBOYW1lMSAgICAgICAgICAgLSBGaXJzdCBuYW1lIHRvIGNvbXBhcmUKLSAqICAgICAgICAgICAgICBOYW1lMiAgICAgICAgICAgLSBTZWNvbmQgbmFtZSB0byBjb21wYXJlCi0gKgotICogUkVUVVJOOiAgICAgIHZhbHVlIGZyb20gc3RybmNtcAotICoKLSAqIERFU0NSSVBUSU9OOiBDb21wYXJlIHR3byBBQ1BJIG5hbWVzLiAgTmFtZXMgdGhhdCBhcmUgcHJlZml4ZWQgd2l0aCBhbgotICogICAgICAgICAgICAgIHVuZGVyc2NvcmUgYXJlIGZvcmNlZCB0byBiZSBhbHBoYWJldGljYWxseSBmaXJzdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQKLWFjcGlfbnNfY29tcGFyZV9uYW1lcyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTEsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTIpCi17Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlZF9uYW1lMVtBQ1BJX05BTUVfU0laRV07Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlZF9uYW1lMltBQ1BJX05BTUVfU0laRV07Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgajsKLQotCi0JLyoKLQkgKiBSZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgInVuZGVyc2NvcmUiIHdpdGggYSB2YWx1ZSB0aGF0IGlzIHNtYWxsZXIgc28KLQkgKiB0aGF0IGFsbCBuYW1lcyB0aGF0IGFyZSBwcmVmaXhlZCB3aXRoIHVuZGVyc2NvcmUocykgYXJlIGFscGhhYmV0aWNhbGx5Ci0JICogZmlyc3QuCi0JICoKLQkgKiBSZXZlcnNlIHRoZSBuYW1lIGJ5dGV3aXNlIHNvIHdlIGNhbiBqdXN0IGRvIGEgMzItYml0IGNvbXBhcmUgaW5zdGVhZAotCSAqIG9mIGEgc3RybmNtcC4KLQkgKi8KLQlmb3IgKGkgPSAwLCBqPSAoQUNQSV9OQU1FX1NJWkUgLSAxKTsgaSA8IEFDUElfTkFNRV9TSVpFOyBpKyssIGotLSkgewotCQlyZXZlcnNlZF9uYW1lMVtqXSA9IG5hbWUxW2ldOwotCQlpZiAobmFtZTFbaV0gPT0gJ18nKSB7Ci0JCQlyZXZlcnNlZF9uYW1lMVtqXSA9ICcqJzsKLQkJfQotCi0JCXJldmVyc2VkX25hbWUyW2pdID0gbmFtZTJbaV07Ci0JCWlmIChuYW1lMltpXSA9PSAnXycpIHsKLQkJCXJldmVyc2VkX25hbWUyW2pdID0gJyonOwotCQl9Ci0JfQotCi0JcmV0dXJuICgqKGludCAqKSByZXZlcnNlZF9uYW1lMSAtICooaW50ICopIHJldmVyc2VkX25hbWUyKTsKLX0KLSNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcC5jCmluZGV4IDZjMmFlZjAuLjlmYWYxZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYwpAQCAtNDEsMzEgKzQxLDIyIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zZHVtcCIpCitBQ1BJX01PRFVMRV9OQU1FKCJuc2R1bXAiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KICNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwotdm9pZAotYWNwaV9uc19kdW1wX3Jvb3RfZGV2aWNlcyAoCi0Jdm9pZCk7Cit2b2lkIGFjcGlfbnNfZHVtcF9yb290X2RldmljZXModm9pZCk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19kdW1wX29uZV9kZXZpY2UgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CithY3BpX25zX2R1bXBfb25lX2RldmljZShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKICNlbmRpZgogCi0KICNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTgwLDM2ICs3MSwzOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfbnNfcHJpbnRfcGF0aG5hbWUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3NlZ21lbnRzLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGhuYW1lKQordm9pZCBhY3BpX25zX3ByaW50X3BhdGhuYW1lKHUzMiBudW1fc2VnbWVudHMsIGNoYXIgKnBhdGhuYW1lKQogewotCUFDUElfRlVOQ1RJT05fTkFNRSAoIm5zX3ByaW50X3BhdGhuYW1lIik7CisJYWNwaV9uYXRpdmVfdWludCBpOwogCisJQUNQSV9GVU5DVElPTl9OQU1FKCJuc19wcmludF9wYXRobmFtZSIpOwogCi0JaWYgKCEoYWNwaV9kYmdfbGV2ZWwgJiBBQ1BJX0xWX05BTUVTKSB8fCAhKGFjcGlfZGJnX2xheWVyICYgQUNQSV9OQU1FU1BBQ0UpKSB7CisJaWYgKCEoYWNwaV9kYmdfbGV2ZWwgJiBBQ1BJX0xWX05BTUVTKQorCSAgICB8fCAhKGFjcGlfZGJnX2xheWVyICYgQUNQSV9OQU1FU1BBQ0UpKSB7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBQcmludCB0aGUgZW50aXJlIG5hbWUgKi8KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLCAiWyIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLCAiWyIpKTsKIAogCXdoaWxlIChudW1fc2VnbWVudHMpIHsKLQkJYWNwaV9vc19wcmludGYgKCIlNC40cyIsIHBhdGhuYW1lKTsKLQkJcGF0aG5hbWUgKz0gQUNQSV9OQU1FX1NJWkU7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCUFDUElfSVNfUFJJTlQocGF0aG5hbWVbaV0pID8KKwkJCSAgICBhY3BpX29zX3ByaW50ZigiJWMiLCBwYXRobmFtZVtpXSkgOgorCQkJICAgIGFjcGlfb3NfcHJpbnRmKCI/Iik7CisJCX0KIAorCQlwYXRobmFtZSArPSBBQ1BJX05BTUVfU0laRTsKIAkJbnVtX3NlZ21lbnRzLS07CiAJCWlmIChudW1fc2VnbWVudHMpIHsKLQkJCWFjcGlfb3NfcHJpbnRmICgiLiIpOworCQkJYWNwaV9vc19wcmludGYoIi4iKTsKIAkJfQogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiXVxuIik7CisJYWNwaV9vc19wcmludGYoIl1cbiIpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF9wYXRobmFtZQpAQCAtMTI3LDE1ICsxMjAsMTAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfbnNfZHVtcF9wYXRobmFtZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbXNnLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQpCithY3BpX25zX2R1bXBfcGF0aG5hbWUoYWNwaV9oYW5kbGUgaGFuZGxlLCBjaGFyICptc2csIHUzMiBsZXZlbCwgdTMyIGNvbXBvbmVudCkKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19kdW1wX3BhdGhuYW1lIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19kdW1wX3BhdGhuYW1lIik7CiAKIAkvKiBEbyB0aGlzIG9ubHkgaWYgdGhlIHJlcXVlc3RlZCBkZWJ1ZyBsZXZlbCBhbmQgY29tcG9uZW50IGFyZSBlbmFibGVkICovCiAKQEAgLTE0NSwxMiArMTMzLDExIEBACiAKIAkvKiBDb252ZXJ0IGhhbmRsZSB0byBhIGZ1bGwgcGF0aG5hbWUgYW5kIHByaW50IGl0ICh3aXRoIHN1cHBsaWVkIG1lc3NhZ2UpICovCiAKLQlhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUgKGhhbmRsZSwgbXNnKTsKLQlhY3BpX29zX3ByaW50ZiAoIlxuIik7CisJYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKGhhbmRsZSwgbXNnKTsKKwlhY3BpX29zX3ByaW50ZigiXG4iKTsKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2R1bXBfb25lX29iamVjdApAQCAtMTY4LDI0ICsxNTUsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2R1bXBfb25lX29iamVjdCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKQorYWNwaV9uc19kdW1wX29uZV9vYmplY3QoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKLQlzdHJ1Y3QgYWNwaV93YWxrX2luZm8gICAgICAgICAgICppbmZvID0gKHN0cnVjdCBhY3BpX3dhbGtfaW5mbyAqKSBjb250ZXh0OwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnRoaXNfbm9kZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyA9IE5VTEw7Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICBvYmpfdHlwZTsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc190b19kdW1wOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJnX2xldmVsOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKwlzdHJ1Y3QgYWNwaV93YWxrX2luZm8gKmluZm8gPSAoc3RydWN0IGFjcGlfd2Fsa19pbmZvICopY29udGV4dDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqdGhpc19ub2RlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjID0gTlVMTDsKKwlhY3BpX29iamVjdF90eXBlIG9ial90eXBlOworCWFjcGlfb2JqZWN0X3R5cGUgdHlwZTsKKwl1MzIgYnl0ZXNfdG9fZHVtcDsKKwl1MzIgZGJnX2xldmVsOworCXUzMiBpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJuc19kdW1wX29uZV9vYmplY3QiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgibnNfZHVtcF9vbmVfb2JqZWN0Iik7CiAKIAkvKiBJcyBvdXRwdXQgZW5hYmxlZD8gKi8KIApAQCAtMTk0LDE5MyArMTc2LDIxNSBAQAogCX0KIAogCWlmICghb2JqX2hhbmRsZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiTnVsbCBvYmplY3QgaGFuZGxlXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk51bGwgb2JqZWN0IGhhbmRsZVxuIikpOwogCQlyZXR1cm4gKEFFX09LKTsKIAl9CiAKLQl0aGlzX25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAob2JqX2hhbmRsZSk7CisJdGhpc19ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7CiAJdHlwZSA9IHRoaXNfbm9kZS0+dHlwZTsKIAogCS8qIENoZWNrIGlmIHRoZSBvd25lciBtYXRjaGVzICovCiAKLQlpZiAoKGluZm8tPm93bmVyX2lkICE9IEFDUElfVUlOVDMyX01BWCkgJiYKLQkJKGluZm8tPm93bmVyX2lkICE9IHRoaXNfbm9kZS0+b3duZXJfaWQpKSB7CisJaWYgKChpbmZvLT5vd25lcl9pZCAhPSBBQ1BJX09XTkVSX0lEX01BWCkgJiYKKwkgICAgKGluZm8tPm93bmVyX2lkICE9IHRoaXNfbm9kZS0+b3duZXJfaWQpKSB7CiAJCXJldHVybiAoQUVfT0spOwogCX0KIAotCS8qIEluZGVudCB0aGUgb2JqZWN0IGFjY29yZGluZyB0byB0aGUgbGV2ZWwgKi8KKwlpZiAoIShpbmZvLT5kaXNwbGF5X3R5cGUgJiBBQ1BJX0RJU1BMQVlfU0hPUlQpKSB7CisJCS8qIEluZGVudCB0aGUgb2JqZWN0IGFjY29yZGluZyB0byB0aGUgbGV2ZWwgKi8KIAotCWFjcGlfb3NfcHJpbnRmICgiJTJkJSpzIiwgKHUzMikgbGV2ZWwgLSAxLCAoaW50KSBsZXZlbCAqIDIsICIgIik7CisJCWFjcGlfb3NfcHJpbnRmKCIlMmQlKnMiLCAodTMyKSBsZXZlbCAtIDEsIChpbnQpbGV2ZWwgKiAyLCAiICIpOwogCi0JLyogQ2hlY2sgdGhlIG5vZGUgdHlwZSBhbmQgbmFtZSAqLworCQkvKiBDaGVjayB0aGUgbm9kZSB0eXBlIGFuZCBuYW1lICovCiAKLQlpZiAodHlwZSA+IEFDUElfVFlQRV9MT0NBTF9NQVgpIHsKLQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJJbnZhbGlkIEFDUEkgVHlwZSAlMDhYXG4iLCB0eXBlKSk7Ci0JfQorCQlpZiAodHlwZSA+IEFDUElfVFlQRV9MT0NBTF9NQVgpIHsKKwkJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJJbnZhbGlkIEFDUEkgVHlwZSAlMDhYXG4iLCB0eXBlKSk7CisJCX0KIAotCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUgKHRoaXNfbm9kZS0+bmFtZS5pbnRlZ2VyKSkgewotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIkludmFsaWQgQUNQSSBOYW1lICUwOFhcbiIsCi0JCQl0aGlzX25vZGUtPm5hbWUuaW50ZWdlcikpOworCQlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKHRoaXNfbm9kZS0+bmFtZS5pbnRlZ2VyKSkgeworCQkJQUNQSV9SRVBPUlRfV0FSTklORygoIkludmFsaWQgQUNQSSBOYW1lICUwOFhcbiIsCisJCQkJCSAgICAgdGhpc19ub2RlLT5uYW1lLmludGVnZXIpKTsKKwkJfQorCisJCWFjcGlfb3NfcHJpbnRmKCIlNC40cyIsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSh0aGlzX25vZGUpKTsKIAl9CiAKIAkvKgogCSAqIE5vdyB3ZSBjYW4gcHJpbnQgb3V0IHRoZSBwZXJ0aW5lbnQgaW5mb3JtYXRpb24KIAkgKi8KLQlhY3BpX29zX3ByaW50ZiAoIiU0LjRzICUtMTJzICVwICIsCi0JCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHRoaXNfbm9kZSksIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZSksIHRoaXNfbm9kZSk7CisJYWNwaV9vc19wcmludGYoIiAlLTEycyAlcCAiLCBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSksIHRoaXNfbm9kZSk7CiAKIAlkYmdfbGV2ZWwgPSBhY3BpX2RiZ19sZXZlbDsKIAlhY3BpX2RiZ19sZXZlbCA9IDA7Ci0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKHRoaXNfbm9kZSk7CisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QodGhpc19ub2RlKTsKIAlhY3BpX2RiZ19sZXZlbCA9IGRiZ19sZXZlbDsKIAotCXN3aXRjaCAoaW5mby0+ZGlzcGxheV90eXBlKSB7CisJc3dpdGNoIChpbmZvLT5kaXNwbGF5X3R5cGUgJiBBQ1BJX0RJU1BMQVlfTUFTSykgewogCWNhc2UgQUNQSV9ESVNQTEFZX1NVTU1BUlk6CiAKIAkJaWYgKCFvYmpfZGVzYykgewogCQkJLyogTm8gYXR0YWNoZWQgb2JqZWN0LCB3ZSBhcmUgZG9uZSAqLwogCi0JCQlhY3BpX29zX3ByaW50ZiAoIlxuIik7CisJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKIAkJCXJldHVybiAoQUVfT0spOwogCQl9CiAKIAkJc3dpdGNoICh0eXBlKSB7CiAJCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKIAotCQkJYWNwaV9vc19wcmludGYgKCJJRCAlWCBMZW4gJS40WCBBZGRyICVwXG4iLAotCQkJCW9ial9kZXNjLT5wcm9jZXNzb3IucHJvY19pZCwgb2JqX2Rlc2MtPnByb2Nlc3Nvci5sZW5ndGgsCi0JCQkJKGNoYXIgKikgb2JqX2Rlc2MtPnByb2Nlc3Nvci5hZGRyZXNzKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJJRCAlWCBMZW4gJS40WCBBZGRyICVwXG4iLAorCQkJCSAgICAgICBvYmpfZGVzYy0+cHJvY2Vzc29yLnByb2NfaWQsCisJCQkJICAgICAgIG9ial9kZXNjLT5wcm9jZXNzb3IubGVuZ3RoLAorCQkJCSAgICAgICAoY2hhciAqKW9ial9kZXNjLT5wcm9jZXNzb3IuYWRkcmVzcyk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKIAotCQkJYWNwaV9vc19wcmludGYgKCJOb3RpZnkgT2JqZWN0OiAlcFxuIiwgb2JqX2Rlc2MpOworCQkJYWNwaV9vc19wcmludGYoIk5vdGlmeSBPYmplY3Q6ICVwXG4iLCBvYmpfZGVzYyk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKIAotCQkJYWNwaV9vc19wcmludGYgKCJBcmdzICVYIExlbiAlLjRYIEFtbCAlcFxuIiwKLQkJCQkodTMyKSBvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50LAotCQkJCW9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQpOworCQkJYWNwaV9vc19wcmludGYoIkFyZ3MgJVggTGVuICUuNFggQW1sICVwXG4iLAorCQkJCSAgICAgICAodTMyKSBvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50LAorCQkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsCisJCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0KTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAotCQkJYWNwaV9vc19wcmludGYgKCI9ICU4LjhYJTguOFhcbiIsCi0JCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSkpOworCQkJYWNwaV9vc19wcmludGYoIj0gJTguOFglOC44WFxuIiwKKwkJCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KG9ial9kZXNjLT5pbnRlZ2VyLgorCQkJCQkJCSAgdmFsdWUpKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAogCQkJaWYgKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiRWxlbWVudHMgJS4yWFxuIiwKLQkJCQkJb2JqX2Rlc2MtPnBhY2thZ2UuY291bnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCJbTGVuZ3RoIG5vdCB5ZXQgZXZhbHVhdGVkXVxuIik7CisJCQkJYWNwaV9vc19wcmludGYoIkVsZW1lbnRzICUuMlhcbiIsCisJCQkJCSAgICAgICBvYmpfZGVzYy0+cGFja2FnZS5jb3VudCk7CisJCQl9IGVsc2UgeworCQkJCWFjcGlfb3NfcHJpbnRmKCJbTGVuZ3RoIG5vdCB5ZXQgZXZhbHVhdGVkXVxuIik7CiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAogCQkJaWYgKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiTGVuICUuMlgiLAotCQkJCQkJIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiTGVuICUuMlgiLAorCQkJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOwogCiAJCQkJLyogRHVtcCBzb21lIG9mIHRoZSBidWZmZXIgKi8KIAogCQkJCWlmIChvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCA+IDApIHsKLQkJCQkJYWNwaV9vc19wcmludGYgKCIgPSIpOwotCQkJCQlmb3IgKGkgPSAwOyAoaSA8IG9ial9kZXNjLT5idWZmZXIubGVuZ3RoICYmIGkgPCAxMik7IGkrKykgewotCQkJCQkJYWNwaV9vc19wcmludGYgKCIgJS4yaFgiLCBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXJbaV0pOworCQkJCQlhY3BpX29zX3ByaW50ZigiID0iKTsKKwkJCQkJZm9yIChpID0gMDsKKwkJCQkJICAgICAoaSA8IG9ial9kZXNjLT5idWZmZXIubGVuZ3RoCisJCQkJCSAgICAgICYmIGkgPCAxMik7IGkrKykgeworCQkJCQkJYWNwaV9vc19wcmludGYoIiAlLjJoWCIsCisJCQkJCQkJICAgICAgIG9ial9kZXNjLT5idWZmZXIuCisJCQkJCQkJICAgICAgIHBvaW50ZXJbaV0pOwogCQkJCQl9CiAJCQkJfQotCQkJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiW0xlbmd0aCBub3QgeWV0IGV2YWx1YXRlZF1cbiIpOworCQkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlhY3BpX29zX3ByaW50ZigiW0xlbmd0aCBub3QgeWV0IGV2YWx1YXRlZF1cbiIpOwogCQkJfQogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiTGVuICUuMlggIiwgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgpOwotCQkJYWNwaV91dF9wcmludF9zdHJpbmcgKG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwgMzIpOwotCQkJYWNwaV9vc19wcmludGYgKCJcbiIpOworCQkJYWNwaV9vc19wcmludGYoIkxlbiAlLjJYICIsIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoKTsKKwkJCWFjcGlfdXRfcHJpbnRfc3RyaW5nKG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwgMzIpOworCQkJYWNwaV9vc19wcmludGYoIlxuIik7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKIAotCQkJYWNwaV9vc19wcmludGYgKCJbJXNdIiwKLQkJCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAob2JqX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCkpOworCQkJYWNwaV9vc19wcmludGYoIlslc10iLAorCQkJCSAgICAgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShvYmpfZGVzYy0+cmVnaW9uLgorCQkJCQkJCSAgICAgICBzcGFjZV9pZCkpOwogCQkJaWYgKG9ial9kZXNjLT5yZWdpb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiIEFkZHIgJTguOFglOC44WCBMZW4gJS40WFxuIiwKLQkJCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MpLAotCQkJCQlvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIiBbQWRkcmVzcy9MZW5ndGggbm90IHlldCBldmFsdWF0ZWRdXG4iKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiIEFkZHIgJTguOFglOC44WCBMZW4gJS40WFxuIiwKKwkJCQkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChvYmpfZGVzYy0+CisJCQkJCQkJCSAgcmVnaW9uLgorCQkJCQkJCQkgIGFkZHJlc3MpLAorCQkJCQkgICAgICAgb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpOworCQkJfSBlbHNlIHsKKwkJCQlhY3BpX29zX3ByaW50ZgorCQkJCSAgICAoIiBbQWRkcmVzcy9MZW5ndGggbm90IHlldCBldmFsdWF0ZWRdXG4iKTsKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIlslc11cbiIsCi0JCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSk7CisJCQlhY3BpX29zX3ByaW50ZigiWyVzXVxuIiwKKwkJCQkgICAgICAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob2JqX2Rlc2MtPgorCQkJCQkJCSAgICAgICByZWZlcmVuY2UuCisJCQkJCQkJICAgICAgIG9wY29kZSkpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAKIAkJCWlmIChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmogJiYKLQkJCQlvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmotPmJ1ZmZlci5ub2RlKSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCJCdWYgWyU0LjRzXSIsCi0JCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqLT5idWZmZXIubm9kZSkpOworCQkJICAgIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iai0+YnVmZmVyLm5vZGUpIHsKKwkJCQlhY3BpX29zX3ByaW50ZigiQnVmIFslNC40c10iLAorCQkJCQkgICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT4KKwkJCQkJCQkJICAgICBidWZmZXJfZmllbGQuCisJCQkJCQkJCSAgICAgYnVmZmVyX29iai0+CisJCQkJCQkJCSAgICAgYnVmZmVyLgorCQkJCQkJCQkgICAgIG5vZGUpKTsKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIlJnbiBbJTQuNHNdIiwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5jb21tb25fZmllbGQucmVnaW9uX29iai0+cmVnaW9uLm5vZGUpKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJSZ24gWyU0LjRzXSIsCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+CisJCQkJCQkJICAgICBjb21tb25fZmllbGQuCisJCQkJCQkJICAgICByZWdpb25fb2JqLT5yZWdpb24uCisJCQkJCQkJICAgICBub2RlKSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiUmduIFslNC40c10gQm5rIFslNC40c10iLAotCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5yZWdpb25fb2JqLT5yZWdpb24ubm9kZSksCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iai0+Y29tbW9uX2ZpZWxkLm5vZGUpKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJSZ24gWyU0LjRzXSBCbmsgWyU0LjRzXSIsCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+CisJCQkJCQkJICAgICBjb21tb25fZmllbGQuCisJCQkJCQkJICAgICByZWdpb25fb2JqLT5yZWdpb24uCisJCQkJCQkJICAgICBub2RlKSwKKwkJCQkgICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT4KKwkJCQkJCQkgICAgIGJhbmtfZmllbGQuCisJCQkJCQkJICAgICBiYW5rX29iai0+CisJCQkJCQkJICAgICBjb21tb25fZmllbGQuCisJCQkJCQkJICAgICBub2RlKSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIklkeCBbJTQuNHNdIERhdCBbJTQuNHNdIiwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmotPmNvbW1vbl9maWVsZC5ub2RlKSwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5pbmRleF9maWVsZC5kYXRhX29iai0+Y29tbW9uX2ZpZWxkLm5vZGUpKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJJZHggWyU0LjRzXSBEYXQgWyU0LjRzXSIsCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+CisJCQkJCQkJICAgICBpbmRleF9maWVsZC4KKwkJCQkJCQkgICAgIGluZGV4X29iai0+CisJCQkJCQkJICAgICBjb21tb25fZmllbGQubm9kZSksCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+CisJCQkJCQkJICAgICBpbmRleF9maWVsZC4KKwkJCQkJCQkgICAgIGRhdGFfb2JqLT4KKwkJCQkJCQkgICAgIGNvbW1vbl9maWVsZC4KKwkJCQkJCQkgICAgIG5vZGUpKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVM6CiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUzoKIAotCQkJYWNwaV9vc19wcmludGYgKCJUYXJnZXQgJTQuNHMgKCVwKVxuIiwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjKSwgb2JqX2Rlc2MpOworCQkJYWNwaV9vc19wcmludGYoIlRhcmdldCAlNC40cyAoJXApXG4iLAorCQkJCSAgICAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MpLAorCQkJCSAgICAgICBvYmpfZGVzYyk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIk9iamVjdCAlcFxuIiwgb2JqX2Rlc2MpOworCQkJYWNwaV9vc19wcmludGYoIk9iamVjdCAlcFxuIiwgb2JqX2Rlc2MpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMzkyLDExICszOTYsMTUgQEAKIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiIE9mZiAlLjNYIExlbiAlLjJYIEFjYyAlLjJoZFxuIiwKLQkJCQkob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICogOCkKLQkJCQkJKyBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCi0JCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAotCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpOworCQkJYWNwaV9vc19wcmludGYoIiBPZmYgJS4zWCBMZW4gJS4yWCBBY2MgJS4yaGRcbiIsCisJCQkJICAgICAgIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQliYXNlX2J5dGVfb2Zmc2V0ICogOCkKKwkJCQkgICAgICAgKworCQkJCSAgICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCSAgICAgICBzdGFydF9maWVsZF9iaXRfb2Zmc2V0LAorCQkJCSAgICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCisJCQkJICAgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJICAgICAgIGFjY2Vzc19ieXRlX3dpZHRoKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC00MDQsNTYgKzQxMiw1NSBAQAogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfRElTUExBWV9PQkpFQ1RTOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiTzolcCIsIG9ial9kZXNjKTsKKwkJYWNwaV9vc19wcmludGYoIk86JXAiLCBvYmpfZGVzYyk7CiAJCWlmICghb2JqX2Rlc2MpIHsKIAkJCS8qIE5vIGF0dGFjaGVkIG9iamVjdCwgd2UgYXJlIGRvbmUgKi8KIAotCQkJYWNwaV9vc19wcmludGYgKCJcbiIpOworCQkJYWNwaV9vc19wcmludGYoIlxuIik7CiAJCQlyZXR1cm4gKEFFX09LKTsKIAkJfQogCi0JCWFjcGlfb3NfcHJpbnRmICgiKFIlZCkiLCBvYmpfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCk7CisJCWFjcGlfb3NfcHJpbnRmKCIoUiVkKSIsIG9ial9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50KTsKIAogCQlzd2l0Y2ggKHR5cGUpIHsKIAkJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgogCiAJCQkvKiBOYW1lIGlzIGEgTWV0aG9kIGFuZCBpdHMgQU1MIG9mZnNldC9sZW5ndGggYXJlIHNldCAqLwogCi0JCQlhY3BpX29zX3ByaW50ZiAoIiBNOiVwLSVYXG4iLCBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKLQkJCQkJICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgpOworCQkJYWNwaV9vc19wcmludGYoIiBNOiVwLSVYXG4iLCBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiIEk6JTguOFg4LjglWFxuIiwKLQkJCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSkpOworCQkJYWNwaV9vc19wcmludGYoIiBJOiU4LjhYOC44JVhcbiIsCisJCQkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChvYmpfZGVzYy0+aW50ZWdlci4KKwkJCQkJCQkgIHZhbHVlKSk7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiIFM6JXAtJVhcbiIsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQkJICBvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCk7CisJCQlhY3BpX29zX3ByaW50ZigiIFM6JXAtJVhcbiIsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIiBCOiVwLSVYXG4iLCBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJCSAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQkJYWNwaV9vc19wcmludGYoIiBCOiVwLSVYXG4iLCBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCisJCQkJICAgICAgIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6Ci0JCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIlxuIik7CiAJCWJyZWFrOwogCX0KIApAQCAtNDYzLDYxICs0NzAsNTggQEAKIAkJcmV0dXJuIChBRV9PSyk7CiAJfQogCi0KIAkvKiBJZiB0aGVyZSBpcyBhbiBhdHRhY2hlZCBvYmplY3QsIGRpc3BsYXkgaXQgKi8KIAotCWRiZ19sZXZlbCAgICA9IGFjcGlfZGJnX2xldmVsOworCWRiZ19sZXZlbCA9IGFjcGlfZGJnX2xldmVsOwogCWFjcGlfZGJnX2xldmVsID0gMDsKLQlvYmpfZGVzYyAgICAgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKHRoaXNfbm9kZSk7CisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QodGhpc19ub2RlKTsKIAlhY3BpX2RiZ19sZXZlbCA9IGRiZ19sZXZlbDsKIAogCS8qIER1bXAgYXR0YWNoZWQgb2JqZWN0cyAqLwogCiAJd2hpbGUgKG9ial9kZXNjKSB7CiAJCW9ial90eXBlID0gQUNQSV9UWVBFX0lOVkFMSUQ7Ci0JCWFjcGlfb3NfcHJpbnRmICgiICAgICAgQXR0YWNoZWQgT2JqZWN0ICVwOiAiLCBvYmpfZGVzYyk7CisJCWFjcGlfb3NfcHJpbnRmKCJBdHRhY2hlZCBPYmplY3QgJXA6ICIsIG9ial9kZXNjKTsKIAogCQkvKiBEZWNvZGUgdGhlIHR5cGUgb2YgYXR0YWNoZWQgb2JqZWN0IGFuZCBkdW1wIHRoZSBjb250ZW50cyAqLwogCi0JCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykpIHsKKwkJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpKSB7CiAJCWNhc2UgQUNQSV9ERVNDX1RZUEVfTkFNRUQ6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiKFB0ciB0byBOb2RlKVxuIik7Ci0JCQlieXRlc190b19kdW1wID0gc2l6ZW9mIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSk7CisJCQlhY3BpX29zX3ByaW50ZigiKFB0ciB0byBOb2RlKVxuIik7CisJCQlieXRlc190b19kdW1wID0gc2l6ZW9mKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlKTsKKwkJCUFDUElfRFVNUF9CVUZGRVIob2JqX2Rlc2MsIGJ5dGVzX3RvX2R1bXApOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6CiAKLQkJCW9ial90eXBlID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKTsKKwkJCW9ial90eXBlID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpOwogCiAJCQlpZiAob2JqX3R5cGUgPiBBQ1BJX1RZUEVfTE9DQUxfTUFYKSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCIoUHRyIHRvIEFDUEkgT2JqZWN0IHR5cGUgJVggW1VOS05PV05dKVxuIiwKLQkJCQkJb2JqX3R5cGUpOworCQkJCWFjcGlfb3NfcHJpbnRmCisJCQkJICAgICgiKFB0ciB0byBBQ1BJIE9iamVjdCB0eXBlICVYIFtVTktOT1dOXSlcbiIsCisJCQkJICAgICBvYmpfdHlwZSk7CiAJCQkJYnl0ZXNfdG9fZHVtcCA9IDMyOworCQkJfSBlbHNlIHsKKwkJCQlhY3BpX29zX3ByaW50ZgorCQkJCSAgICAoIihQdHIgdG8gQUNQSSBPYmplY3QgdHlwZSAlWCBbJXNdKVxuIiwKKwkJCQkgICAgIG9ial90eXBlLCBhY3BpX3V0X2dldF90eXBlX25hbWUob2JqX3R5cGUpKTsKKwkJCQlieXRlc190b19kdW1wID0KKwkJCQkgICAgc2l6ZW9mKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpOwogCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCIoUHRyIHRvIEFDUEkgT2JqZWN0IHR5cGUgJXMsICVYKVxuIiwKLQkJCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChvYmpfdHlwZSksIG9ial90eXBlKTsKLQkJCQlieXRlc190b19kdW1wID0gc2l6ZW9mICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0KTsKLQkJCX0KLQkJCWJyZWFrOwogCisJCQlBQ1BJX0RVTVBfQlVGRkVSKG9ial9kZXNjLCBieXRlc190b19kdW1wKTsKKwkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgKLQkJCQkiKFN0cmluZyBvciBCdWZmZXIgcHRyIC0gbm90IGFuIG9iamVjdCBkZXNjcmlwdG9yKSBbJXNdXG4iLAotCQkJCWFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAob2JqX2Rlc2MpKTsKLQkJCWJ5dGVzX3RvX2R1bXAgPSAxNjsKIAkJCWJyZWFrOwogCQl9CiAKLQkJQUNQSV9EVU1QX0JVRkZFUiAob2JqX2Rlc2MsIGJ5dGVzX3RvX2R1bXApOwotCiAJCS8qIElmIHZhbHVlIGlzIE5PVCBhbiBpbnRlcm5hbCBvYmplY3QsIHdlIGFyZSBkb25lICovCiAKLQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKKwkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykgIT0KKwkJICAgIEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCkBAIC01MjUsNTEgKzUyOSw1NiBAQAogCQkgKiBWYWxpZCBvYmplY3QsIGdldCB0aGUgcG9pbnRlciB0byBuZXh0IGxldmVsLCBpZiBhbnkKIAkJICovCiAJCXN3aXRjaCAob2JqX3R5cGUpIHsKLQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCQkJb2JqX2Rlc2MgPSAodm9pZCAqKSBvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXI7Ci0JCQlicmVhazsKLQogCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0JCQlvYmpfZGVzYyA9ICh2b2lkICopIG9ial9kZXNjLT5idWZmZXIucG9pbnRlcjsKLQkJCWJyZWFrOworCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisJCQkvKgorCQkJICogTk9URTogdGFrZXMgYWR2YW50YWdlIG9mIGNvbW1vbiBmaWVsZHMgYmV0d2VlbiBzdHJpbmcvYnVmZmVyCisJCQkgKi8KKwkJCWJ5dGVzX3RvX2R1bXAgPSBvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aDsKKwkJCW9ial9kZXNjID0gKHZvaWQgKilvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXI7CisJCQlhY3BpX29zX3ByaW50ZigiKEJ1ZmZlci9TdHJpbmcgcG9pbnRlciAlcCBsZW5ndGggJVgpXG4iLAorCQkJCSAgICAgICBvYmpfZGVzYywgYnl0ZXNfdG9fZHVtcCk7CisJCQlBQ1BJX0RVTVBfQlVGRkVSKG9ial9kZXNjLCBieXRlc190b19kdW1wKTsKKwkJCWdvdG8gY2xlYW51cDsKIAogCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6Ci0JCQlvYmpfZGVzYyA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iajsKKwkJCW9ial9kZXNjID0KKwkJCSAgICAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKW9ial9kZXNjLT5idWZmZXJfZmllbGQuCisJCQkgICAgYnVmZmVyX29iajsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6Ci0JCQlvYmpfZGVzYyA9ICh2b2lkICopIG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzOworCQkJb2JqX2Rlc2MgPSAodm9pZCAqKW9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgotCQkJb2JqX2Rlc2MgPSAodm9pZCAqKSBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydDsKKwkJCW9ial9kZXNjID0gKHZvaWQgKilvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKLQkJCW9ial9kZXNjID0gKHZvaWQgKikgb2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmo7CisJCQlvYmpfZGVzYyA9ICh2b2lkICopb2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmo7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgotCQkJb2JqX2Rlc2MgPSAodm9pZCAqKSBvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqOworCQkJb2JqX2Rlc2MgPSAodm9pZCAqKW9ial9kZXNjLT5iYW5rX2ZpZWxkLnJlZ2lvbl9vYmo7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKLQkJCW9ial9kZXNjID0gKHZvaWQgKikgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iajsKKwkJCW9ial9kZXNjID0gKHZvaWQgKilvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCW9ial90eXBlID0gQUNQSV9UWVBFX0lOVkFMSUQ7ICAvKiBUZXJtaW5hdGUgbG9vcCBhZnRlciBuZXh0IHBhc3MgKi8KKwkJb2JqX3R5cGUgPSBBQ1BJX1RZUEVfSU5WQUxJRDsJLyogVGVybWluYXRlIGxvb3AgYWZ0ZXIgbmV4dCBwYXNzICovCiAJfQogCi1jbGVhbnVwOgotCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKyAgICAgIGNsZWFudXA6CisJYWNwaV9vc19wcmludGYoIlxuIik7CiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTU5MSwyOSArNjAwLDI1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX25zX2R1bXBfb2JqZWN0cyAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV90eXBlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RlcHRoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJfaWQsCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUpCithY3BpX25zX2R1bXBfb2JqZWN0cyhhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCSAgICAgdTggZGlzcGxheV90eXBlLAorCQkgICAgIHUzMiBtYXhfZGVwdGgsCisJCSAgICAgYWNwaV9vd25lcl9pZCBvd25lcl9pZCwgYWNwaV9oYW5kbGUgc3RhcnRfaGFuZGxlKQogewotCXN0cnVjdCBhY3BpX3dhbGtfaW5mbyAgICAgICAgICAgaW5mbzsKKwlzdHJ1Y3QgYWNwaV93YWxrX2luZm8gaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWluZm8uZGVidWdfbGV2ZWwgPSBBQ1BJX0xWX1RBQkxFUzsKIAlpbmZvLm93bmVyX2lkID0gb3duZXJfaWQ7CiAJaW5mby5kaXNwbGF5X3R5cGUgPSBkaXNwbGF5X3R5cGU7CiAKLQkodm9pZCkgYWNwaV9uc193YWxrX25hbWVzcGFjZSAodHlwZSwgc3RhcnRfaGFuZGxlLCBtYXhfZGVwdGgsCi0JCQkgQUNQSV9OU19XQUxLX05PX1VOTE9DSywgYWNwaV9uc19kdW1wX29uZV9vYmplY3QsCi0JCQkgKHZvaWQgKikgJmluZm8sIE5VTEwpOworCSh2b2lkKWFjcGlfbnNfd2Fsa19uYW1lc3BhY2UodHlwZSwgc3RhcnRfaGFuZGxlLCBtYXhfZGVwdGgsCisJCQkJICAgICBBQ1BJX05TX1dBTEtfTk9fVU5MT0NLLAorCQkJCSAgICAgYWNwaV9uc19kdW1wX29uZV9vYmplY3QsICh2b2lkICopJmluZm8sCisJCQkJICAgICBOVUxMKTsKIH0KLSNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwotCisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MjgsMjYgKzYzMywyMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfbnNfZHVtcF9lbnRyeSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19sZXZlbCkKK3ZvaWQgYWNwaV9uc19kdW1wX2VudHJ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGRlYnVnX2xldmVsKQogewotCXN0cnVjdCBhY3BpX3dhbGtfaW5mbyAgICAgICAgICAgaW5mbzsKKwlzdHJ1Y3QgYWNwaV93YWxrX2luZm8gaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWluZm8uZGVidWdfbGV2ZWwgPSBkZWJ1Z19sZXZlbDsKLQlpbmZvLm93bmVyX2lkID0gQUNQSV9VSU5UMzJfTUFYOworCWluZm8ub3duZXJfaWQgPSBBQ1BJX09XTkVSX0lEX01BWDsKIAlpbmZvLmRpc3BsYXlfdHlwZSA9IEFDUElfRElTUExBWV9TVU1NQVJZOwogCi0JKHZvaWQpIGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0IChoYW5kbGUsIDEsICZpbmZvLCBOVUxMKTsKKwkodm9pZClhY3BpX25zX2R1bXBfb25lX29iamVjdChoYW5kbGUsIDEsICZpbmZvLCBOVUxMKTsKIH0KIAotCi0jaWZkZWYgX0FDUElfQVNMX0NPTVBJTEVSCisjaWZkZWYgQUNQSV9BU0xfQ09NUElMRVIKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF90YWJsZXMKQEAgLTY2MywyMyArNjYyLDE5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9uc19kdW1wX3RhYmxlcyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfYmFzZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXB0aCkKK3ZvaWQgYWNwaV9uc19kdW1wX3RhYmxlcyhhY3BpX2hhbmRsZSBzZWFyY2hfYmFzZSwgdTMyIG1heF9kZXB0aCkKIHsKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF9oYW5kbGUgPSBzZWFyY2hfYmFzZTsKKwlhY3BpX2hhbmRsZSBzZWFyY2hfaGFuZGxlID0gc2VhcmNoX2Jhc2U7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19kdW1wX3RhYmxlcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZHVtcF90YWJsZXMiKTsKIAogCWlmICghYWNwaV9nYmxfcm9vdF9ub2RlKSB7CiAJCS8qCiAJCSAqIElmIHRoZSBuYW1lIHNwYWNlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCwKIAkJICogdGhlcmUgaXMgbm90aGluZyB0byBkdW1wLgogCQkgKi8KLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfVEFCTEVTLCAibmFtZXNwYWNlIG5vdCBpbml0aWFsaXplZCFcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9UQUJMRVMsCisJCQkJICAibmFtZXNwYWNlIG5vdCBpbml0aWFsaXplZCFcbiIpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCkBAIC02ODcsMTIgKzY4MiwxMiBAQAogCQkvKiBFbnRpcmUgbmFtZXNwYWNlICovCiAKIAkJc2VhcmNoX2hhbmRsZSA9IGFjcGlfZ2JsX3Jvb3Rfbm9kZTsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfVEFCTEVTLCAiXFxcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9UQUJMRVMsICJcXFxuIikpOwogCX0KIAotCWFjcGlfbnNfZHVtcF9vYmplY3RzIChBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0RJU1BMQVlfT0JKRUNUUywgbWF4X2RlcHRoLAotCQkJQUNQSV9VSU5UMzJfTUFYLCBzZWFyY2hfaGFuZGxlKTsKKwlhY3BpX25zX2R1bXBfb2JqZWN0cyhBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0RJU1BMQVlfT0JKRUNUUywgbWF4X2RlcHRoLAorCQkJICAgICBBQ1BJX09XTkVSX0lEX01BWCwgc2VhcmNoX2hhbmRsZSk7CiAJcmV0dXJuX1ZPSUQ7CiB9Ci0jZW5kaWYJLyogX0FDUElfQVNMX0NPTVBJTEVSICovCi0jZW5kaWYJLyogZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKSAqLworI2VuZGlmCQkJCS8qIF9BQ1BJX0FTTF9DT01QSUxFUiAqLworI2VuZGlmCQkJCS8qIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wZHYuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wZHYuYwppbmRleCAyN2M0ZjdjLi41NWRlODgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcGR2LmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jCkBAIC00MSwyMCArNDEsMTUgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KIAotCiAvKiBUQkQ6IFRoaXMgZW50aXJlIG1vZHVsZSBpcyBhcHBhcmVudGx5IG9ic29sZXRlIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCAqLwogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zZHVtcGR2IikKLQorQUNQSV9NT0RVTEVfTkFNRSgibnNkdW1wZHYiKQogI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCiAjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQotCiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2R1bXBfb25lX2RldmljZQpAQCAtNzAsNDQgKzY1LDM5IEBACiAgKiAgICAgICAgICAgICAgVGhpcyBwcm9jZWR1cmUgaXMgYSB1c2VyX2Z1bmN0aW9uIGNhbGxlZCBieSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19kdW1wX29uZV9kZXZpY2UgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSkKK2FjcGlfbnNfZHVtcF9vbmVfZGV2aWNlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCiB7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICBidWZmZXI7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gICAgICAgICAqaW5mbzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyAqaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGk7CiAKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoIm5zX2R1bXBfb25lX2RldmljZSIpOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FICgibnNfZHVtcF9vbmVfZGV2aWNlIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0IChvYmpfaGFuZGxlLCBsZXZlbCwgY29udGV4dCwgcmV0dXJuX3ZhbHVlKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX25zX2R1bXBfb25lX29iamVjdChvYmpfaGFuZGxlLCBsZXZlbCwgY29udGV4dCwgcmV0dXJuX3ZhbHVlKTsKIAogCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUjsKLQlzdGF0dXMgPSBhY3BpX2dldF9vYmplY3RfaW5mbyAob2JqX2hhbmRsZSwgJmJ1ZmZlcik7Ci0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfZ2V0X29iamVjdF9pbmZvKG9ial9oYW5kbGUsICZidWZmZXIpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlpbmZvID0gYnVmZmVyLnBvaW50ZXI7CiAJCWZvciAoaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfVEFCTEVTLCAiICIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX1RBQkxFUywgIiAiKSk7CiAJCX0KIAotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfVEFCTEVTLAotCQkJIiAgICBISUQ6ICVzLCBBRFI6ICU4LjhYJTguOFgsIFN0YXR1czogJVhcbiIsCi0JCQlpbmZvLT5oYXJkd2FyZV9pZC52YWx1ZSwgQUNQSV9GT1JNQVRfVUlOVDY0IChpbmZvLT5hZGRyZXNzKSwKLQkJCWluZm8tPmN1cnJlbnRfc3RhdHVzKSk7Ci0JCUFDUElfTUVNX0ZSRUUgKGluZm8pOworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9UQUJMRVMsCisJCQkJICAgICAgIiAgICBISUQ6ICVzLCBBRFI6ICU4LjhYJTguOFgsIFN0YXR1czogJVhcbiIsCisJCQkJICAgICAgaW5mby0+aGFyZHdhcmVfaWQudmFsdWUsCisJCQkJICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGluZm8tPmFkZHJlc3MpLAorCQkJCSAgICAgIGluZm8tPmN1cnJlbnRfc3RhdHVzKSk7CisJCUFDUElfTUVNX0ZSRUUoaW5mbyk7CiAJfQogCiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF9yb290X2RldmljZXMKQEAgLTEyMCwxNiArMTEwLDEyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9uc19kdW1wX3Jvb3RfZGV2aWNlcyAoCi0Jdm9pZCkKK3ZvaWQgYWNwaV9uc19kdW1wX3Jvb3RfZGV2aWNlcyh2b2lkKQogewotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc3lzX2J1c19oYW5kbGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9oYW5kbGUgc3lzX2J1c19oYW5kbGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJuc19kdW1wX3Jvb3RfZGV2aWNlcyIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJuc19kdW1wX3Jvb3RfZGV2aWNlcyIpOwogCiAJLyogT25seSBkdW1wIHRoZSB0YWJsZSBpZiB0cmFjaW5nIGlzIGVuYWJsZWQgKi8KIApAQCAtMTM4LDE5ICsxMjQsMTcgQEAKIAl9CiAKIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoTlVMTCwgQUNQSV9OU19TWVNURU1fQlVTLCAmc3lzX2J1c19oYW5kbGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1RBQkxFUywKLQkJIkRpc3BsYXkgb2YgYWxsIGRldmljZXMgaW4gdGhlIG5hbWVzcGFjZTpcbiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1RBQkxFUywKKwkJCSAgIkRpc3BsYXkgb2YgYWxsIGRldmljZXMgaW4gdGhlIG5hbWVzcGFjZTpcbiIpKTsKIAotCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgKEFDUElfVFlQRV9ERVZJQ0UsIHN5c19idXNfaGFuZGxlLAotCQkJIEFDUElfVUlOVDMyX01BWCwgQUNQSV9OU19XQUxLX05PX1VOTE9DSywKLQkJCSBhY3BpX25zX2R1bXBfb25lX2RldmljZSwgTlVMTCwgTlVMTCk7CisJc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBzeXNfYnVzX2hhbmRsZSwKKwkJCQkJQUNQSV9VSU5UMzJfTUFYLCBBQ1BJX05TX1dBTEtfTk9fVU5MT0NLLAorCQkJCQlhY3BpX25zX2R1bXBfb25lX2RldmljZSwgTlVMTCwgTlVMTCk7CiB9CiAKICNlbmRpZgogI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMKaW5kZXggMWFlODlhMS4uMDE5MWM3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZXZhbC5jCkBAIC00MiwyNiArNDIsMTkgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zZXZhbCIpCitBQ1BJX01PRFVMRV9OQU1FKCJuc2V2YWwiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kICgKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKTsKK2FjcGlfbnNfZXhlY3V0ZV9jb250cm9sX21ldGhvZChzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbyk7CiAKLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19nZXRfb2JqZWN0X3ZhbHVlICgKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKTsKLQorc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfbnNfZ2V0X29iamVjdF92YWx1ZShzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODUsNDggKzc4LDQ0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aG5hbWUsCi0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbykKK2FjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUoY2hhciAqcGF0aG5hbWUsIHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUgPSBOVUxMOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnNjb3BlX2luZm87Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW50ZXJuYWxfcGF0aCA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlID0gTlVMTDsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm87CisJY2hhciAqaW50ZXJuYWxfcGF0aCA9IE5VTEw7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19ldmFsdWF0ZV9yZWxhdGl2ZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZXZhbHVhdGVfcmVsYXRpdmUiKTsKIAogCS8qCiAJICogTXVzdCBoYXZlIGEgdmFsaWQgb2JqZWN0IGhhbmRsZQogCSAqLwogCWlmICghaW5mbyB8fCAhaW5mby0+bm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogQnVpbGQgYW4gaW50ZXJuYWwgbmFtZSBzdHJpbmcgZm9yIHRoZSBtZXRob2QgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfaW50ZXJuYWxpemVfbmFtZSAocGF0aG5hbWUsICZpbnRlcm5hbF9wYXRoKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX25zX2ludGVybmFsaXplX25hbWUocGF0aG5hbWUsICZpbnRlcm5hbF9wYXRoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc2NvcGVfaW5mbyA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKCk7CisJc2NvcGVfaW5mbyA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKIAlpZiAoIXNjb3BlX2luZm8pIHsKIAkJZ290byBjbGVhbnVwMTsKIAl9CiAKIAkvKiBHZXQgdGhlIHByZWZpeCBoYW5kbGUgYW5kIE5vZGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQlpbmZvLT5ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKGluZm8tPm5vZGUpOworCWluZm8tPm5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShpbmZvLT5ub2RlKTsKIAlpZiAoIWluZm8tPm5vZGUpIHsKLQkJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC0xMzQsMzkgKzEyMywzOCBAQAogCS8qIExvb2t1cCB0aGUgbmFtZSBpbiB0aGUgbmFtZXNwYWNlICovCiAKIAlzY29wZV9pbmZvLT5zY29wZS5ub2RlID0gaW5mby0+bm9kZTsKLQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAoc2NvcGVfaW5mbywgaW50ZXJuYWxfcGF0aCwgQUNQSV9UWVBFX0FOWSwKLQkJCSBBQ1BJX0lNT0RFX0VYRUNVVEUsIEFDUElfTlNfTk9fVVBTRUFSQ0gsIE5VTEwsCi0JCQkgJm5vZGUpOworCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwKHNjb3BlX2luZm8sIGludGVybmFsX3BhdGgsIEFDUElfVFlQRV9BTlksCisJCQkJQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX05PX1VQU0VBUkNILCBOVUxMLAorCQkJCSZub2RlKTsKIAotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLCAiT2JqZWN0IFslc10gbm90IGZvdW5kIFslc11cbiIsCi0JCQlwYXRobmFtZSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsICJPYmplY3QgWyVzXSBub3QgZm91bmQgWyVzXVxuIiwKKwkJCQkgIHBhdGhuYW1lLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyoKIAkgKiBOb3cgdGhhdCB3ZSBoYXZlIGEgaGFuZGxlIHRvIHRoZSBvYmplY3QsIHdlIGNhbiBhdHRlbXB0IHRvIGV2YWx1YXRlIGl0LgogCSAqLwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLCAiJXMgWyVwXSBWYWx1ZSAlcFxuIiwKLQkJcGF0aG5hbWUsIG5vZGUsIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLCAiJXMgWyVwXSBWYWx1ZSAlcFxuIiwKKwkJCSAgcGF0aG5hbWUsIG5vZGUsIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKSkpOwogCiAJaW5mby0+bm9kZSA9IG5vZGU7Ci0Jc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9ieV9oYW5kbGUgKGluZm8pOworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlKGluZm8pOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsICIqKiogQ29tcGxldGVkIGV2YWwgb2Ygb2JqZWN0ICVzICoqKlxuIiwKLQkJcGF0aG5hbWUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJICAiKioqIENvbXBsZXRlZCBldmFsIG9mIG9iamVjdCAlcyAqKipcbiIsIHBhdGhuYW1lKSk7CiAKLWNsZWFudXA6Ci0JYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoc2NvcGVfaW5mbyk7CisgICAgICBjbGVhbnVwOgorCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc2NvcGVfaW5mbyk7CiAKLWNsZWFudXAxOgotCUFDUElfTUVNX0ZSRUUgKGludGVybmFsX3BhdGgpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKyAgICAgIGNsZWFudXAxOgorCUFDUElfTUVNX0ZSRUUoaW50ZXJuYWxfcGF0aCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19ldmFsdWF0ZV9ieV9uYW1lCkBAIC0xODksNjggKzE3Nyw2MyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfZXZhbHVhdGVfYnlfbmFtZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aG5hbWUsCi0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbykKK2FjcGlfbnNfZXZhbHVhdGVfYnlfbmFtZShjaGFyICpwYXRobmFtZSwgc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW50ZXJuYWxfcGF0aCA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWNoYXIgKmludGVybmFsX3BhdGggPSBOVUxMOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfZXZhbHVhdGVfYnlfbmFtZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZXZhbHVhdGVfYnlfbmFtZSIpOwogCiAJLyogQnVpbGQgYW4gaW50ZXJuYWwgbmFtZSBzdHJpbmcgZm9yIHRoZSBtZXRob2QgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfaW50ZXJuYWxpemVfbmFtZSAocGF0aG5hbWUsICZpbnRlcm5hbF9wYXRoKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX25zX2ludGVybmFsaXplX25hbWUocGF0aG5hbWUsICZpbnRlcm5hbF9wYXRoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIExvb2t1cCB0aGUgbmFtZSBpbiB0aGUgbmFtZXNwYWNlICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAoTlVMTCwgaW50ZXJuYWxfcGF0aCwgQUNQSV9UWVBFX0FOWSwKLQkJCSBBQ1BJX0lNT0RFX0VYRUNVVEUsIEFDUElfTlNfTk9fVVBTRUFSQ0gsIE5VTEwsCi0JCQkgJmluZm8tPm5vZGUpOworCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwKE5VTEwsIGludGVybmFsX3BhdGgsIEFDUElfVFlQRV9BTlksCisJCQkJQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX05PX1VQU0VBUkNILCBOVUxMLAorCQkJCSZpbmZvLT5ub2RlKTsKIAotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLAotCQkJIk9iamVjdCBhdCBbJXNdIHdhcyBub3QgZm91bmQsIHN0YXR1cz0lLjRYXG4iLAotCQkJcGF0aG5hbWUsIHN0YXR1cykpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCSAgIk9iamVjdCBhdCBbJXNdIHdhcyBub3QgZm91bmQsIHN0YXR1cz0lLjRYXG4iLAorCQkJCSAgcGF0aG5hbWUsIHN0YXR1cykpOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyoKIAkgKiBOb3cgdGhhdCB3ZSBoYXZlIGEgaGFuZGxlIHRvIHRoZSBvYmplY3QsIHdlIGNhbiBhdHRlbXB0IHRvIGV2YWx1YXRlIGl0LgogCSAqLwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLCAiJXMgWyVwXSBWYWx1ZSAlcFxuIiwKLQkJcGF0aG5hbWUsIGluZm8tPm5vZGUsIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoaW5mby0+bm9kZSkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLCAiJXMgWyVwXSBWYWx1ZSAlcFxuIiwKKwkJCSAgcGF0aG5hbWUsIGluZm8tPm5vZGUsCisJCQkgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChpbmZvLT5ub2RlKSkpOwogCi0Jc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9ieV9oYW5kbGUgKGluZm8pOworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlKGluZm8pOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsICIqKiogQ29tcGxldGVkIGV2YWwgb2Ygb2JqZWN0ICVzICoqKlxuIiwKLQkJcGF0aG5hbWUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJICAiKioqIENvbXBsZXRlZCBldmFsIG9mIG9iamVjdCAlcyAqKipcbiIsIHBhdGhuYW1lKSk7CiAKLQotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAKIAkvKiBDbGVhbnVwICovCiAKIAlpZiAoaW50ZXJuYWxfcGF0aCkgewotCQlBQ1BJX01FTV9GUkVFIChpbnRlcm5hbF9wYXRoKTsKKwkJQUNQSV9NRU1fRlJFRShpbnRlcm5hbF9wYXRoKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19ldmFsdWF0ZV9ieV9oYW5kbGUKQEAgLTI3NSwyNiArMjU4LDIyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlICgKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKQorYWNwaV9zdGF0dXMgYWNwaV9uc19ldmFsdWF0ZV9ieV9oYW5kbGUoc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfZXZhbHVhdGVfYnlfaGFuZGxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19ldmFsdWF0ZV9ieV9oYW5kbGUiKTsKIAogCS8qIENoZWNrIGlmIG5hbWVzcGFjZSBoYXMgYmVlbiBpbml0aWFsaXplZCAqLwogCiAJaWYgKCFhY3BpX2dibF9yb290X25vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19OQU1FU1BBQ0UpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTkFNRVNQQUNFKTsKIAl9CiAKIAkvKiBQYXJhbWV0ZXIgVmFsaWRhdGlvbiAqLwogCiAJaWYgKCFpbmZvKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBJbml0aWFsaXplIHRoZSByZXR1cm4gdmFsdWUgdG8gYW4gaW52YWxpZCBvYmplY3QgKi8KQEAgLTMwMywyMyArMjgyLDI1IEBACiAKIAkvKiBHZXQgdGhlIHByZWZpeCBoYW5kbGUgYW5kIE5vZGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JaW5mby0+bm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChpbmZvLT5ub2RlKTsKKwlpbmZvLT5ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoaW5mby0+bm9kZSk7CiAJaWYgKCFpbmZvLT5ub2RlKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyoKIAkgKiBGb3IgYSBtZXRob2QgYWxpYXMsIHdlIG11c3QgZ3JhYiB0aGUgYWN0dWFsIG1ldGhvZCBub2RlIHNvIHRoYXQgcHJvcGVyCiAJICogc2NvcGluZyBjb250ZXh0IHdpbGwgYmUgZXN0YWJsaXNoZWQgYmVmb3JlIGV4ZWN1dGlvbi4KIAkgKi8KLQlpZiAoYWNwaV9uc19nZXRfdHlwZSAoaW5mby0+bm9kZSkgPT0gQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUykgewotCQlpbmZvLT5ub2RlID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsIGluZm8tPm5vZGUtPm9iamVjdCk7CisJaWYgKGFjcGlfbnNfZ2V0X3R5cGUoaW5mby0+bm9kZSkgPT0gQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUykgeworCQlpbmZvLT5ub2RlID0KKwkJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsCisJCQkJICBpbmZvLT5ub2RlLT5vYmplY3QpOwogCX0KIAogCS8qCkBAIC0zMjksMTcgKzMxMCwxNiBAQAogCSAqCiAJICogSW4gYm90aCBjYXNlcywgdGhlIG5hbWVzcGFjZSBpcyB1bmxvY2tlZCBieSB0aGUgYWNwaV9ucyogcHJvY2VkdXJlCiAJICovCi0JaWYgKGFjcGlfbnNfZ2V0X3R5cGUgKGluZm8tPm5vZGUpID09IEFDUElfVFlQRV9NRVRIT0QpIHsKKwlpZiAoYWNwaV9uc19nZXRfdHlwZShpbmZvLT5ub2RlKSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSB7CiAJCS8qCiAJCSAqIENhc2UgMSkgV2UgaGF2ZSBhbiBhY3R1YWwgY29udHJvbCBtZXRob2QgdG8gZXhlY3V0ZQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kIChpbmZvKTsKLQl9Ci0JZWxzZSB7CisJCXN0YXR1cyA9IGFjcGlfbnNfZXhlY3V0ZV9jb250cm9sX21ldGhvZChpbmZvKTsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBDYXNlIDIpIE9iamVjdCBpcyBOT1QgYSBtZXRob2QsIGp1c3QgcmV0dXJuIGl0cyBjdXJyZW50IHZhbHVlCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX25zX2dldF9vYmplY3RfdmFsdWUgKGluZm8pOworCQlzdGF0dXMgPSBhY3BpX25zX2dldF9vYmplY3RfdmFsdWUoaW5mbyk7CiAJfQogCiAJLyoKQEAgLTM1NSwxNiArMzM1LDE2IEBACiAJICogTmFtZXNwYWNlIHdhcyB1bmxvY2tlZCBieSB0aGUgaGFuZGxpbmcgYWNwaV9ucyogZnVuY3Rpb24sIHNvIHdlCiAJICoganVzdCByZXR1cm4KIAkgKi8KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kCiAgKgogICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKICAqICAgICAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gTWV0aG9kIE5vZGUgdG8gZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgLSBNZXRob2Qgb2JqZWN0CiAgKiAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gUGFyYW1zIGl0c2VsZiBtYXkgYmUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBubyBwYXJhbWV0ZXJzIGFyZSBiZWluZyBwYXNzZWQuCkBAIC0zODMsMzEgKzM2MywyOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2V4ZWN1dGVfY29udHJvbF9tZXRob2QgKAotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pCithY3BpX25zX2V4ZWN1dGVfY29udHJvbF9tZXRob2Qoc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfZXhlY3V0ZV9jb250cm9sX21ldGhvZCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZXhlY3V0ZV9jb250cm9sX21ldGhvZCIpOwogCiAJLyogVmVyaWZ5IHRoYXQgdGhlcmUgaXMgYSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0ICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoaW5mby0+bm9kZSk7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIGF0dGFjaGVkIG1ldGhvZCBvYmplY3RcbiIpKTsKKwlpbmZvLT5vYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChpbmZvLT5ub2RlKTsKKwlpZiAoIWluZm8tPm9ial9kZXNjKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTm8gYXR0YWNoZWQgbWV0aG9kIG9iamVjdFxuIikpOwogCi0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTlVMTF9PQkpFQ1QpOworCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfT0JKRUNUKTsKIAl9CiAKLQlBQ1BJX0RVTVBfUEFUSE5BTUUgKGluZm8tPm5vZGUsICJFeGVjdXRlIE1ldGhvZDoiLAotCQlBQ1BJX0xWX0lORk8sIF9DT01QT05FTlQpOworCUFDUElfRFVNUF9QQVRITkFNRShpbmZvLT5ub2RlLCAiRXhlY3V0ZSBNZXRob2Q6IiwKKwkJCSAgIEFDUElfTFZfSU5GTywgX0NPTVBPTkVOVCk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiTWV0aG9kIGF0IEFNTCBhZGRyZXNzICVwIExlbmd0aCAlWFxuIiwKLQkJb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQgKyAxLCBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGggLSAxKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiTWV0aG9kIGF0IEFNTCBhZGRyZXNzICVwIExlbmd0aCAlWFxuIiwKKwkJCSAgaW5mby0+b2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQgKyAxLAorCQkJICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGggLSAxKSk7CiAKIAkvKgogCSAqIFVubG9jayB0aGUgbmFtZXNwYWNlIGJlZm9yZSBleGVjdXRpb24uICBUaGlzIGFsbG93cyBuYW1lc3BhY2UgYWNjZXNzCkBAIC00MTYsMjcgKzM5NCwyNiBAQAogCSAqIGludGVycHJldGVyIGxvY2tzIHRvIGVuc3VyZSB0aGF0IG5vIHRocmVhZCBpcyB1c2luZyB0aGUgcG9ydGlvbiBvZiB0aGUKIAkgKiBuYW1lc3BhY2UgdGhhdCBpcyBiZWluZyBkZWxldGVkLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKIAkgKiBFeGVjdXRlIHRoZSBtZXRob2QgdmlhIHRoZSBpbnRlcnByZXRlci4gIFRoZSBpbnRlcnByZXRlciBpcyBsb2NrZWQKIAkgKiBoZXJlIGJlZm9yZSBjYWxsaW5nIGludG8gdGhlIEFNTCBwYXJzZXIKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9wc3hfZXhlY3V0ZSAoaW5mbyk7Ci0JYWNwaV9leF9leGl0X2ludGVycHJldGVyICgpOworCXN0YXR1cyA9IGFjcGlfcHNfZXhlY3V0ZV9tZXRob2QoaW5mbyk7CisJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfb2JqZWN0X3ZhbHVlCkBAIC00NTQsMTYgKzQzMSwxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19nZXRfb2JqZWN0X3ZhbHVlICgKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKQorc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfbnNfZ2V0X29iamVjdF92YWx1ZShzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnJlc29sdmVkX25vZGUgPSBpbmZvLT5ub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZXNvbHZlZF9ub2RlID0gaW5mby0+bm9kZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2dldF9vYmplY3RfdmFsdWUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2dldF9vYmplY3RfdmFsdWUiKTsKIAogCS8qCiAJICogT2JqZWN0cyByZXF1aXJlIGFkZGl0aW9uYWwgcmVzb2x1dGlvbiBzdGVwcyAoZS5nLiwgdGhlIE5vZGUgbWF5IGJlIGEKQEAgLTQ4NiwzMiArNDU5LDMzIEBACiAJICoKIAkgKiBXZSBtdXN0IHJlbGVhc2UgdGhlIG5hbWVzcGFjZSBsb2NrIGJlZm9yZSBlbnRlcmluZyB0aGUgaW50ZXByZXRlci4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIgKCk7Ci0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZSAoJnJlc29sdmVkX25vZGUsIE5VTEwpOworCXN0YXR1cyA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUoJnJlc29sdmVkX25vZGUsIE5VTEwpOwogCQkvKgogCQkgKiBJZiBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZSgpIHN1Y2NlZWRlZCwgdGhlIHJldHVybiB2YWx1ZSB3YXMgcGxhY2VkCiAJCSAqIGluIHJlc29sdmVkX25vZGUuCiAJCSAqLwotCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIgKCk7CisJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwogCi0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQlzdGF0dXMgPSBBRV9DVFJMX1JFVFVSTl9WQUxVRTsKIAkJCWluZm8tPnJldHVybl9vYmplY3QgPSBBQ1BJX0NBU1RfUFRSCi0JCQkJCSAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgcmVzb2x2ZWRfbm9kZSk7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywgIlJldHVybmluZyBvYmplY3QgJXAgWyVzXVxuIiwKLQkJCQlpbmZvLT5yZXR1cm5fb2JqZWN0LAotCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKGluZm8tPnJldHVybl9vYmplY3QpKSk7CisJCQkgICAgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIHJlc29sdmVkX25vZGUpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJICAiUmV0dXJuaW5nIG9iamVjdCAlcCBbJXNdXG4iLAorCQkJCQkgIGluZm8tPnJldHVybl9vYmplY3QsCisJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLT4KKwkJCQkJCQkJICAgICAgIHJldHVybl9vYmplY3QpKSk7CiAJCX0KIAl9CiAKIAkvKiBOYW1lc3BhY2UgaXMgdW5sb2NrZWQgKi8KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNpbml0LmMKaW5kZXggMzYyODAyYS4uMGEwOGQyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jCkBAIC00MSwzMSArNDEsMjIgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc2luaXQiKQorQUNQSV9NT0RVTEVfTkFNRSgibnNpbml0IikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2luaXRfb25lX29iamVjdChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2luaXRfb25lX29iamVjdCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2luaXRfb25lX2RldmljZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCithY3BpX25zX2luaXRfb25lX2RldmljZShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIG5lc3RpbmdfbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTgwLDUyICs3MSw0OCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cyAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfbnNfaW5pdGlhbGl6ZV9vYmplY3RzKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gICAgICBpbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbyBpbmZvOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfaW5pdGlhbGl6ZV9vYmplY3RzIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfaW5pdGlhbGl6ZV9vYmplY3RzIik7Ci0KLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkiKioqKiBTdGFydGluZyBpbml0aWFsaXphdGlvbiBvZiBuYW1lc3BhY2Ugb2JqZWN0cyAqKioqXG4iKSk7Ci0JQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0lOSVQsCi0JCSJDb21wbGV0aW5nIFJlZ2lvbi9GaWVsZC9CdWZmZXIvUGFja2FnZSBpbml0aWFsaXphdGlvbjoiKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIioqKiogU3RhcnRpbmcgaW5pdGlhbGl6YXRpb24gb2YgbmFtZXNwYWNlIG9iamVjdHMgKioqKlxuIikpOworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsCisJCQkgICAgICAiQ29tcGxldGluZyBSZWdpb24vRmllbGQvQnVmZmVyL1BhY2thZ2UgaW5pdGlhbGl6YXRpb246IikpOwogCiAJLyogU2V0IGFsbCBpbml0IGluZm8gdG8gemVybyAqLwogCi0JQUNQSV9NRU1TRVQgKCZpbmZvLCAwLCBzaXplb2YgKHN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvKSk7CisJQUNQSV9NRU1TRVQoJmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbykpOwogCiAJLyogV2FsayBlbnRpcmUgbmFtZXNwYWNlIGZyb20gdGhlIHN1cHBsaWVkIHJvb3QgKi8KIAotCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UgKEFDUElfVFlQRV9BTlksIEFDUElfUk9PVF9PQkpFQ1QsCi0JCQkgIEFDUElfVUlOVDMyX01BWCwgYWNwaV9uc19pbml0X29uZV9vYmplY3QsCi0JCQkgICZpbmZvLCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAid2Fsa19uYW1lc3BhY2UgZmFpbGVkISAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0FOWSwgQUNQSV9ST09UX09CSkVDVCwKKwkJCQkgICAgIEFDUElfVUlOVDMyX01BWCwgYWNwaV9uc19pbml0X29uZV9vYmplY3QsCisJCQkJICAgICAmaW5mbywgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJ3YWxrX25hbWVzcGFjZSBmYWlsZWQhICVzXG4iLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfSU5JVCwKLQkJIlxuSW5pdGlhbGl6ZWQgJWhkLyVoZCBSZWdpb25zICVoZC8laGQgRmllbGRzICVoZC8laGQgQnVmZmVycyAlaGQvJWhkIFBhY2thZ2VzICglaGQgbm9kZXMpXG4iLAotCQlpbmZvLm9wX3JlZ2lvbl9pbml0LCBpbmZvLm9wX3JlZ2lvbl9jb3VudCwKLQkJaW5mby5maWVsZF9pbml0LCAgICBpbmZvLmZpZWxkX2NvdW50LAotCQlpbmZvLmJ1ZmZlcl9pbml0LCAgIGluZm8uYnVmZmVyX2NvdW50LAotCQlpbmZvLnBhY2thZ2VfaW5pdCwgIGluZm8ucGFja2FnZV9jb3VudCwgaW5mby5vYmplY3RfY291bnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULAorCQkJICAgICAgIlxuSW5pdGlhbGl6ZWQgJWhkLyVoZCBSZWdpb25zICVoZC8laGQgRmllbGRzICVoZC8laGQgQnVmZmVycyAlaGQvJWhkIFBhY2thZ2VzICglaGQgbm9kZXMpXG4iLAorCQkJICAgICAgaW5mby5vcF9yZWdpb25faW5pdCwgaW5mby5vcF9yZWdpb25fY291bnQsCisJCQkgICAgICBpbmZvLmZpZWxkX2luaXQsIGluZm8uZmllbGRfY291bnQsCisJCQkgICAgICBpbmZvLmJ1ZmZlcl9pbml0LCBpbmZvLmJ1ZmZlcl9jb3VudCwKKwkJCSAgICAgIGluZm8ucGFja2FnZV9pbml0LCBpbmZvLnBhY2thZ2VfY291bnQsCisJCQkgICAgICBpbmZvLm9iamVjdF9jb3VudCkpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCSIlaGQgQ29udHJvbCBNZXRob2RzIGZvdW5kXG4iLCBpbmZvLm1ldGhvZF9jb3VudCkpOwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkiJWhkIE9wIFJlZ2lvbnMgZm91bmRcbiIsIGluZm8ub3BfcmVnaW9uX2NvdW50KSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIiVoZCBDb250cm9sIE1ldGhvZHMgZm91bmRcbiIsIGluZm8ubWV0aG9kX2NvdW50KSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIiVoZCBPcCBSZWdpb25zIGZvdW5kXG4iLCBpbmZvLm9wX3JlZ2lvbl9jb3VudCkpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcwpAQCAtMTQyLDE2ICsxMjksMTIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9uc19pbml0aWFsaXplX2RldmljZXMgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcyh2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2RldmljZV93YWxrX2luZm8gICAgaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfZGV2aWNlX3dhbGtfaW5mbyBpbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfaW5pdGlhbGl6ZV9kZXZpY2VzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19pbml0aWFsaXplX2RldmljZXMiKTsKIAogCS8qIEluaXQgY291bnRlcnMgKi8KIApAQCAtMTU5LDM0ICsxNDIsMzQgQEAKIAlpbmZvLm51bV9TVEEgPSAwOwogCWluZm8ubnVtX0lOSSA9IDA7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfSU5JVCwKLQkJIkV4ZWN1dGluZyBhbGwgRGV2aWNlIF9TVEEgYW5kX0lOSSBtZXRob2RzOiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULAorCQkJICAgICAgIkV4ZWN1dGluZyBhbGwgRGV2aWNlIF9TVEEgYW5kX0lOSSBtZXRob2RzOiIpKTsKIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogV2FsayBuYW1lc3BhY2UgZm9yIGFsbCBvYmplY3RzICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlIChBQ1BJX1RZUEVfQU5ZLCBBQ1BJX1JPT1RfT0JKRUNULAotCQkJICBBQ1BJX1VJTlQzMl9NQVgsIFRSVUUsIGFjcGlfbnNfaW5pdF9vbmVfZGV2aWNlLCAmaW5mbywgTlVMTCk7CisJc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfQU5ZLCBBQ1BJX1JPT1RfT0JKRUNULAorCQkJCQlBQ1BJX1VJTlQzMl9NQVgsIFRSVUUsCisJCQkJCWFjcGlfbnNfaW5pdF9vbmVfZGV2aWNlLCAmaW5mbywgTlVMTCk7CiAKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIndhbGtfbmFtZXNwYWNlIGZhaWxlZCEgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIndhbGtfbmFtZXNwYWNlIGZhaWxlZCEgJXNcbiIsCisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9JTklULAotCQkiXG4laGQgRGV2aWNlcyBmb3VuZCBjb250YWluaW5nOiAlaGQgX1NUQSwgJWhkIF9JTkkgbWV0aG9kc1xuIiwKLQkJaW5mby5kZXZpY2VfY291bnQsIGluZm8ubnVtX1NUQSwgaW5mby5udW1fSU5JKSk7CisJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwKKwkJCSAgICAgICJcbiVoZCBEZXZpY2VzIGZvdW5kIGNvbnRhaW5pbmc6ICVoZCBfU1RBLCAlaGQgX0lOSSBtZXRob2RzXG4iLAorCQkJICAgICAgaW5mby5kZXZpY2VfY291bnQsIGluZm8ubnVtX1NUQSwgaW5mby5udW1fSU5JKSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19pbml0X29uZV9vYmplY3QKQEAgLTIwOCwyOCArMTkxLDI1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfaW5pdF9vbmVfb2JqZWN0ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpCithY3BpX25zX2luaXRfb25lX29iamVjdChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQogewotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbyAgICAgICppbmZvID0gKHN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvICopIGNvbnRleHQ7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmpfaGFuZGxlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOworCWFjcGlfb2JqZWN0X3R5cGUgdHlwZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gKmluZm8gPQorCSAgICAoc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gKiljb250ZXh0OworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlID0KKwkgICAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2hhbmRsZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgibnNfaW5pdF9vbmVfb2JqZWN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoIm5zX2luaXRfb25lX29iamVjdCIpOwogCiAJaW5mby0+b2JqZWN0X2NvdW50Kys7CiAKIAkvKiBBbmQgZXZlbiB0aGVuLCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGEgZmV3IG9iamVjdCB0eXBlcyAqLwogCi0JdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUgKG9ial9oYW5kbGUpOwotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwl0eXBlID0gYWNwaV9uc19nZXRfdHlwZShvYmpfaGFuZGxlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAoIW9ial9kZXNjKSB7CiAJCXJldHVybiAoQUVfT0spOwogCX0KQEAgLTI2OSw4ICsyNDksOCBAQAogCS8qCiAJICogTXVzdCBsb2NrIHRoZSBpbnRlcnByZXRlciBiZWZvcmUgZXhlY3V0aW5nIEFNTCBjb2RlCiAJICovCi0Jc3RhdHVzID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlciAoKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCkBAIC0yODIsMjUgKzI2MiwyNSBAQAogCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKIAogCQlpbmZvLT5vcF9yZWdpb25faW5pdCsrOwotCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9yZWdpb25fYXJndW1lbnRzIChvYmpfZGVzYyk7CisJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHMob2JqX2Rlc2MpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAogCQlpbmZvLT5maWVsZF9pbml0Kys7Ci0JCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMgKG9ial9kZXNjKTsKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cyhvYmpfZGVzYyk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCiAJCWluZm8tPmJ1ZmZlcl9pbml0Kys7Ci0JCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9hcmd1bWVudHMgKG9ial9kZXNjKTsKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyhvYmpfZGVzYyk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAogCQlpbmZvLT5wYWNrYWdlX2luaXQrKzsKLQkJc3RhdHVzID0gYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMgKG9ial9kZXNjKTsKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMob2JqX2Rlc2MpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0zMDgsMTIgKzI4OCwxMyBAQAogCQlicmVhazsKIAl9CiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9FUlJPUiwgIlxuIikpOwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiQ291bGQgbm90IGV4ZWN1dGUgYXJndW1lbnRzIGZvciBbJTQuNHNdICglcyksICVzXG4iLAotCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAobm9kZSksIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZSksCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0VSUk9SLCAiXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQ291bGQgbm90IGV4ZWN1dGUgYXJndW1lbnRzIGZvciBbJTQuNHNdICglcyksICVzXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLAorCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKIAkvKgpAQCAtMzIxLDE4ICszMDIsMTcgQEAKIAkgKiBwYXRobmFtZQogCSAqLwogCWlmICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9JTklUX05BTUVTKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfSU5JVCwgIi4iKSk7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsICIuIikpOwogCX0KIAogCS8qCiAJICogV2UgaWdub3JlIGVycm9ycyBmcm9tIGFib3ZlLCBhbmQgYWx3YXlzIHJldHVybiBPSywgc2luY2Ugd2UgZG9uJ3Qgd2FudAogCSAqIHRvIGFib3J0IHRoZSB3YWxrIG9uIGFueSBzaW5nbGUgZXJyb3IuCiAJICovCi0JYWNwaV9leF9leGl0X2ludGVycHJldGVyICgpOworCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfaW5pdF9vbmVfZGV2aWNlCkBAIC0zNDgsNDEgKzMyOCwzNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2luaXRfb25lX2RldmljZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpCithY3BpX25zX2luaXRfb25lX2RldmljZShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIG5lc3RpbmdfbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCiB7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX3dhbGtfaW5mbyAgICppbmZvID0gKHN0cnVjdCBhY3BpX2RldmljZV93YWxrX2luZm8gKikgY29udGV4dDsKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgIHBpbmZvOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfZGV2aWNlX3dhbGtfaW5mbyAqaW5mbyA9CisJICAgIChzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2Fsa19pbmZvICopY29udGV4dDsKKwlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyBwaW5mbzsKKwl1MzIgZmxhZ3M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfaW5pdF9vbmVfZGV2aWNlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19pbml0X29uZV9kZXZpY2UiKTsKIAogCXBpbmZvLnBhcmFtZXRlcnMgPSBOVUxMOwogCXBpbmZvLnBhcmFtZXRlcl90eXBlID0gQUNQSV9QQVJBTV9BUkdTOwogCi0JcGluZm8ubm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChvYmpfaGFuZGxlKTsKKwlwaW5mby5ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7CiAJaWYgKCFwaW5mby5ub2RlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKgogCSAqIFdlIHdpbGwgcnVuIF9TVEEvX0lOSSBvbiBEZXZpY2VzLCBQcm9jZXNzb3JzIGFuZCB0aGVybWFsX3pvbmVzIG9ubHkKIAkgKi8KLQlpZiAoKHBpbmZvLm5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkgICAgICAmJgotCQkocGluZm8ubm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfUFJPQ0VTU09SKSAgICYmCi0JCShwaW5mby5ub2RlLT50eXBlICE9IEFDUElfVFlQRV9USEVSTUFMKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlpZiAoKHBpbmZvLm5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkgJiYKKwkgICAgKHBpbmZvLm5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1BST0NFU1NPUikgJiYKKwkgICAgKHBpbmZvLm5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1RIRVJNQUwpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJaWYgKChhY3BpX2RiZ19sZXZlbCA8PSBBQ1BJX0xWX0FMTF9FWENFUFRJT05TKSAmJgotCQkoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfSU5GTykpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9JTklULCAiLiIpKTsKKwkgICAgKCEoYWNwaV9kYmdfbGV2ZWwgJiBBQ1BJX0xWX0lORk8pKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULCAiLiIpKTsKIAl9CiAKIAlpbmZvLT5kZXZpY2VfY291bnQrKzsKQEAgLTM5MCwyMCArMzY2LDIwIEBACiAJLyoKIAkgKiBSdW4gX1NUQSB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIHJ1biBfSU5JIG9uIHRoZSBkZXZpY2UuCiAJICovCi0JQUNQSV9ERUJVR19FWEVDIChhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSAoQUNQSV9UWVBFX01FVEhPRCwKLQkJCSAgIHBpbmZvLm5vZGUsIE1FVEhPRF9OQU1FX19TVEEpKTsKLQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfU1RBIChwaW5mby5ub2RlLCAmZmxhZ3MpOworCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZShBQ1BJX1RZUEVfTUVUSE9ELAorCQkJCQkJICAgICAgcGluZm8ubm9kZSwKKwkJCQkJCSAgICAgIE1FVEhPRF9OQU1FX19TVEEpKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfU1RBKHBpbmZvLm5vZGUsICZmbGFncyk7CiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWlmIChwaW5mby5ub2RlLT50eXBlID09IEFDUElfVFlQRV9ERVZJQ0UpIHsKIAkJCS8qIElnbm9yZSBlcnJvciBhbmQgbW92ZSBvbiB0byBuZXh0IGRldmljZSAqLwogCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCX0KIAogCQkvKiBfU1RBIGlzIG5vdCByZXF1aXJlZCBmb3IgUHJvY2Vzc29yIG9yIHRoZXJtYWxfem9uZSBvYmplY3RzICovCi0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCWluZm8tPm51bV9TVEErKzsKIAogCQlpZiAoIShmbGFncyAmIDB4MDEpKSB7CkBAIC00MTYsMzIgKzM5MiwzNCBAQAogCS8qCiAJICogVGhlIGRldmljZSBpcyBwcmVzZW50LiBSdW4gX0lOSS4KIAkgKi8KLQlBQ1BJX0RFQlVHX0VYRUMgKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lIChBQ1BJX1RZUEVfTUVUSE9ELAotCQkJICAgcGluZm8ubm9kZSwgTUVUSE9EX05BTUVfX0lOSSkpOwotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKE1FVEhPRF9OQU1FX19JTkksICZwaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZShBQ1BJX1RZUEVfTUVUSE9ELAorCQkJCQkJICAgICAgcGluZm8ubm9kZSwKKwkJCQkJCSAgICAgIE1FVEhPRF9OQU1FX19JTkkpKTsKKwlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlKE1FVEhPRF9OQU1FX19JTkksICZwaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCS8qIE5vIF9JTkkgKEFFX05PVF9GT1VORCkgbWVhbnMgZGV2aWNlIHJlcXVpcmVzIG5vIGluaXRpYWxpemF0aW9uICovCiAKIAkJaWYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKIAkJCS8qIElnbm9yZSBlcnJvciBhbmQgbW92ZSBvbiB0byBuZXh0IGRldmljZSAqLwogCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKLQkJCWNoYXIgICAgICAgICAgICAgICAgKnNjb3BlX25hbWUgPSBhY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZSAocGluZm8ubm9kZSk7CisJCQljaGFyICpzY29wZV9uYW1lID0KKwkJCSAgICBhY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZShwaW5mby5ub2RlKTsKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfV0FSTiwgIiVzLl9JTkkgZmFpbGVkOiAlc1xuIiwKLQkJCQkJc2NvcGVfbmFtZSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICIlcy5fSU5JIGZhaWxlZDogJXNcbiIsCisJCQkJCSAgc2NvcGVfbmFtZSwKKwkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCi0JCQlBQ1BJX01FTV9GUkVFIChzY29wZV9uYW1lKTsKKwkJCUFDUElfTUVNX0ZSRUUoc2NvcGVfbmFtZSk7CiAjZW5kaWYKIAkJfQogCiAJCXN0YXR1cyA9IEFFX09LOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBEZWxldGUgYW55IHJldHVybiBvYmplY3QgKGVzcGVjaWFsbHkgaWYgaW1wbGljaXRfcmV0dXJuIGlzIGVuYWJsZWQpICovCiAKIAkJaWYgKHBpbmZvLnJldHVybl9vYmplY3QpIHsKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocGluZm8ucmV0dXJuX29iamVjdCk7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocGluZm8ucmV0dXJuX29iamVjdCk7CiAJCX0KIAogCQkvKiBDb3VudCBvZiBzdWNjZXNzZnVsIElOSXMgKi8KQEAgLTQ1Miw4ICs0MzAsOSBAQAogCWlmIChhY3BpX2dibF9pbml0X2hhbmRsZXIpIHsKIAkJLyogRXh0ZXJuYWwgaW5pdGlhbGl6YXRpb24gaGFuZGxlciBpcyBwcmVzZW50LCBjYWxsIGl0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9nYmxfaW5pdF9oYW5kbGVyIChwaW5mby5ub2RlLCBBQ1BJX0lOSVRfREVWSUNFX0lOSSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2dibF9pbml0X2hhbmRsZXIocGluZm8ubm9kZSwgQUNQSV9JTklUX0RFVklDRV9JTkkpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNsb2FkLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbG9hZC5jCmluZGV4IDM0ZTQ5NzAuLmMyODg0OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNsb2FkLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2xvYWQuYwpAQCAtNDEsMzIgKzQxLDIyIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zbG9hZCIpCitBQ1BJX01PRFVMRV9OQU1FKCJuc2xvYWQiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19sb2FkX3RhYmxlX2J5X3R5cGUgKAotCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdGFibGVfdHlwZSk7CitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9uc19sb2FkX3RhYmxlX2J5X3R5cGUoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUpOwogCiAjaWZkZWYgQUNQSV9GVVRVUkVfSU1QTEVNRU5UQVRJT04KLWFjcGlfc3RhdHVzCi1hY3BpX25zX3VubG9hZF9uYW1lc3BhY2UgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKK2FjcGlfc3RhdHVzIGFjcGlfbnNfdW5sb2FkX25hbWVzcGFjZShhY3BpX2hhbmRsZSBoYW5kbGUpOwogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfZGVsZXRlX3N1YnRyZWUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc3RhcnRfaGFuZGxlKTsKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX25zX2RlbGV0ZV9zdWJ0cmVlKGFjcGlfaGFuZGxlIHN0YXJ0X2hhbmRsZSk7CiAjZW5kaWYKIAotCiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC04Miw0MCArNzIsMzkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSkKK2FjcGlfbnNfbG9hZF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjLAorCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19sb2FkX3RhYmxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19sb2FkX3RhYmxlIik7CiAKIAkvKiBDaGVjayBpZiB0YWJsZSBjb250YWlucyB2YWxpZCBBTUwgKG11c3QgYmUgRFNEVCwgUFNEVCwgU1NEVCwgZXRjLikgKi8KIAotCWlmICghKGFjcGlfZ2JsX3RhYmxlX2RhdGFbdGFibGVfZGVzYy0+dHlwZV0uZmxhZ3MgJiBBQ1BJX1RBQkxFX0VYRUNVVEFCTEUpKSB7CisJaWYgKCEKKwkgICAgKGFjcGlfZ2JsX3RhYmxlX2RhdGFbdGFibGVfZGVzYy0+dHlwZV0uCisJICAgICBmbGFncyAmIEFDUElfVEFCTEVfRVhFQ1VUQUJMRSkpIHsKIAkJLyogSnVzdCBpZ25vcmUgdGhpcyB0YWJsZSAqLwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIENoZWNrIHZhbGlkaXR5IG9mIHRoZSBBTUwgc3RhcnQgYW5kIGxlbmd0aCAqLwogCiAJaWYgKCF0YWJsZV9kZXNjLT5hbWxfc3RhcnQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJOdWxsIEFNTCBwb2ludGVyXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJOdWxsIEFNTCBwb2ludGVyXG4iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiQU1MIGJsb2NrIGF0ICVwXG4iLAotCQl0YWJsZV9kZXNjLT5hbWxfc3RhcnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJBTUwgYmxvY2sgYXQgJXBcbiIsCisJCQkgIHRhYmxlX2Rlc2MtPmFtbF9zdGFydCkpOwogCiAJLyogSWdub3JlIHRhYmxlIGlmIHRoZXJlIGlzIG5vIEFNTCBjb250YWluZWQgd2l0aGluICovCiAKIAlpZiAoIXRhYmxlX2Rlc2MtPmFtbF9sZW5ndGgpIHsKLQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJaZXJvLWxlbmd0aCBBTUwgYmxvY2sgaW4gdGFibGUgWyU0LjRzXVxuIiwKLQkJCXRhYmxlX2Rlc2MtPnBvaW50ZXItPnNpZ25hdHVyZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJQUNQSV9SRVBPUlRfV0FSTklORygoIlplcm8tbGVuZ3RoIEFNTCBibG9jayBpbiB0YWJsZSBbJTQuNHNdXG4iLAorCQkJCSAgICAgdGFibGVfZGVzYy0+cG9pbnRlci0+c2lnbmF0dXJlKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyoKQEAgLTEyNywxOSArMTE2LDE5IEBACiAJICogdG8gYW5vdGhlciBjb250cm9sIG1ldGhvZCwgd2UgY2FuJ3QgY29udGludWUgcGFyc2luZwogCSAqIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgbWFueSBhcmd1bWVudHMgdG8gcGFyc2UgbmV4dCEKIAkgKi8KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkiKioqKiBMb2FkaW5nIHRhYmxlIGludG8gbmFtZXNwYWNlICoqKipcbiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICIqKioqIExvYWRpbmcgdGFibGUgaW50byBuYW1lc3BhY2UgKioqKlxuIikpOwogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX25zX3BhcnNlX3RhYmxlICh0YWJsZV9kZXNjLCBub2RlLT5jaGlsZCk7Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlzdGF0dXMgPSBhY3BpX25zX3BhcnNlX3RhYmxlKHRhYmxlX2Rlc2MsIG5vZGUtPmNoaWxkKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtMTQ4LDE4ICsxMzcsMTcgQEAKIAkgKiBqdXN0LWluLXRpbWUgcGFyc2luZywgd2UgZGVsZXRlIHRoZSBjb250cm9sIG1ldGhvZAogCSAqIHBhcnNlIHRyZWVzLgogCSAqLwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCSIqKioqIEJlZ2luIFRhYmxlIE1ldGhvZCBQYXJzaW5nIGFuZCBPYmplY3QgSW5pdGlhbGl6YXRpb24gKioqKlxuIikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIioqKiogQmVnaW4gVGFibGUgTWV0aG9kIFBhcnNpbmcgYW5kIE9iamVjdCBJbml0aWFsaXphdGlvbiAqKioqXG4iKSk7CiAKLQlzdGF0dXMgPSBhY3BpX2RzX2luaXRpYWxpemVfb2JqZWN0cyAodGFibGVfZGVzYywgbm9kZSk7CisJc3RhdHVzID0gYWNwaV9kc19pbml0aWFsaXplX29iamVjdHModGFibGVfZGVzYywgbm9kZSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkiKioqKiBDb21wbGV0ZWQgVGFibGUgTWV0aG9kIFBhcnNpbmcgYW5kIE9iamVjdCBJbml0aWFsaXphdGlvbiAqKioqXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiKioqKiBDb21wbGV0ZWQgVGFibGUgTWV0aG9kIFBhcnNpbmcgYW5kIE9iamVjdCBJbml0aWFsaXphdGlvbiAqKioqXG4iKSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19sb2FkX3RhYmxlX2J5X3R5cGUKQEAgLTE3NCwyMSArMTYyLDE3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZSAoCi0JYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlKQorc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjOworCXUzMiBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfbG9hZF90YWJsZV9ieV90eXBlIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfbG9hZF90YWJsZV9ieV90eXBlIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfVEFCTEVTKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTE5OCw3ICsxODIsNyBAQAogCXN3aXRjaCAodGFibGVfdHlwZSkgewogCWNhc2UgQUNQSV9UQUJMRV9EU0RUOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJMb2FkaW5nIERTRFRcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTmFtZXNwYWNlIGxvYWQ6IERTRFRcbiIpKTsKIAogCQl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbQUNQSV9UQUJMRV9EU0RUXS5uZXh0OwogCkBAIC0yMTAsMzAgKzE5NCwzMyBAQAogCiAJCS8qIE5vdyBsb2FkIHRoZSBzaW5nbGUgRFNEVCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSAodGFibGVfZGVzYywgYWNwaV9nYmxfcm9vdF9ub2RlKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUodGFibGVfZGVzYywgYWNwaV9nYmxfcm9vdF9ub2RlKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQl0YWJsZV9kZXNjLT5sb2FkZWRfaW50b19uYW1lc3BhY2UgPSBUUlVFOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVEFCTEVfU1NEVDoKKwljYXNlIEFDUElfVEFCTEVfUFNEVDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiTG9hZGluZyAlZCBTU0RUc1xuIiwKLQkJCWFjcGlfZ2JsX3RhYmxlX2xpc3RzW0FDUElfVEFCTEVfU1NEVF0uY291bnQpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIk5hbWVzcGFjZSBsb2FkOiAlZCBTU0RUIG9yIFBTRFRzXG4iLAorCQkJCSAgYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0uY291bnQpKTsKIAogCQkvKgotCQkgKiBUcmF2ZXJzZSBsaXN0IG9mIFNTRFQgdGFibGVzCisJCSAqIFRyYXZlcnNlIGxpc3Qgb2YgU1NEVCBvciBQU0RUIHRhYmxlcwogCQkgKi8KLQkJdGFibGVfZGVzYyA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW0FDUElfVEFCTEVfU1NEVF0ubmV4dDsKLQkJZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW0FDUElfVEFCTEVfU1NEVF0uY291bnQ7IGkrKykgeworCQl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0ubmV4dDsKKwkJZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW3RhYmxlX3R5cGVdLmNvdW50OyBpKyspIHsKIAkJCS8qCi0JCQkgKiBPbmx5IGF0dGVtcHQgdG8gbG9hZCB0YWJsZSBpZiBpdCBpcyBub3QKKwkJCSAqIE9ubHkgYXR0ZW1wdCB0byBsb2FkIHRhYmxlIGludG8gbmFtZXNwYWNlIGlmIGl0IGlzIG5vdAogCQkJICogYWxyZWFkeSBsb2FkZWQhCiAJCQkgKi8KIAkJCWlmICghdGFibGVfZGVzYy0+bG9hZGVkX2ludG9fbmFtZXNwYWNlKSB7Ci0JCQkJc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlICh0YWJsZV9kZXNjLCBhY3BpX2dibF9yb290X25vZGUpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX25zX2xvYWRfdGFibGUodGFibGVfZGVzYywKKwkJCQkJCSAgICAgICBhY3BpX2dibF9yb290X25vZGUpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCQlicmVhazsKIAkJCQl9CiAKQEAgLTI0NCw0NiArMjMxLDE2IEBACiAJCX0KIAkJYnJlYWs7CiAKLQotCWNhc2UgQUNQSV9UQUJMRV9QU0RUOgotCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJMb2FkaW5nICVkIFBTRFRzXG4iLAotCQkJYWNwaV9nYmxfdGFibGVfbGlzdHNbQUNQSV9UQUJMRV9QU0RUXS5jb3VudCkpOwotCi0JCS8qCi0JCSAqIFRyYXZlcnNlIGxpc3Qgb2YgUFNEVCB0YWJsZXMKLQkJICovCi0JCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1tBQ1BJX1RBQkxFX1BTRFRdLm5leHQ7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW0FDUElfVEFCTEVfUFNEVF0uY291bnQ7IGkrKykgewotCQkJLyogT25seSBhdHRlbXB0IHRvIGxvYWQgdGFibGUgaWYgaXQgaXMgbm90IGFscmVhZHkgbG9hZGVkISAqLwotCi0JCQlpZiAoIXRhYmxlX2Rlc2MtPmxvYWRlZF9pbnRvX25hbWVzcGFjZSkgewotCQkJCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSAodGFibGVfZGVzYywgYWNwaV9nYmxfcm9vdF9ub2RlKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXRhYmxlX2Rlc2MtPmxvYWRlZF9pbnRvX25hbWVzcGFjZSA9IFRSVUU7Ci0JCQl9Ci0KLQkJCXRhYmxlX2Rlc2MgPSB0YWJsZV9kZXNjLT5uZXh0OwotCQl9Ci0JCWJyZWFrOwotCi0KIAlkZWZhdWx0OgogCQlzdGF0dXMgPSBBRV9TVVBQT1JUOwogCQlicmVhazsKIAl9CiAKLQotdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX1RBQkxFUyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbG9hZF9uYW1lc3BhY2UKQEAgLTI5Nyw0NSArMjU0LDQwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfbnNfbG9hZF9uYW1lc3BhY2UgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX25zX2xvYWRfbmFtZXNwYWNlKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9sb2FkX25hbWVfc3BhY2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfbG9hZF9uYW1lX3NwYWNlIik7CiAKIAkvKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IGEgRFNEVCBpbnN0YWxsZWQgKi8KIAogCWlmIChhY3BpX2dibF9EU0RUID09IE5VTEwpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJEU0RUIGlzIG5vdCBpbiBtZW1vcnlcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19BQ1BJX1RBQkxFUyk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJEU0RUIGlzIG5vdCBpbiBtZW1vcnlcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKIAl9CiAKIAkvKgogCSAqIExvYWQgdGhlIG5hbWVzcGFjZS4gIFRoZSBEU0RUIGlzIHJlcXVpcmVkLAogCSAqIGJ1dCB0aGUgU1NEVCBhbmQgUFNEVCB0YWJsZXMgYXJlIG9wdGlvbmFsLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlIChBQ1BJX1RBQkxFX0RTRFQpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlKEFDUElfVEFCTEVfRFNEVCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIElnbm9yZSBleGNlcHRpb25zIGZyb20gdGhlc2UgKi8KIAotCSh2b2lkKSBhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZSAoQUNQSV9UQUJMRV9TU0RUKTsKLQkodm9pZCkgYWNwaV9uc19sb2FkX3RhYmxlX2J5X3R5cGUgKEFDUElfVEFCTEVfUFNEVCk7CisJKHZvaWQpYWNwaV9uc19sb2FkX3RhYmxlX2J5X3R5cGUoQUNQSV9UQUJMRV9TU0RUKTsKKwkodm9pZClhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZShBQ1BJX1RBQkxFX1BTRFQpOwogCi0JQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0lOSVQsCi0JCSJBQ1BJIE5hbWVzcGFjZSBzdWNjZXNzZnVsbHkgbG9hZGVkIGF0IHJvb3QgJXBcbiIsCi0JCWFjcGlfZ2JsX3Jvb3Rfbm9kZSkpOworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsCisJCQkgICAgICAiQUNQSSBOYW1lc3BhY2Ugc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhdCByb290ICVwXG4iLAorCQkJICAgICAgYWNwaV9nYmxfcm9vdF9ub2RlKSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogI2lmZGVmIEFDUElfRlVUVVJFX0lNUExFTUVOVEFUSU9OCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTM1MywyNCArMzA1LDIwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2RlbGV0ZV9zdWJ0cmVlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2hhbmRsZSkKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX25zX2RlbGV0ZV9zdWJ0cmVlKGFjcGlfaGFuZGxlIHN0YXJ0X2hhbmRsZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2hhbmRsZTsKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9oYW5kbGU7Ci0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBuZXh0X2NoaWxkX2hhbmRsZTsKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGR1bW15OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaGFuZGxlIGNoaWxkX2hhbmRsZTsKKwlhY3BpX2hhbmRsZSBwYXJlbnRfaGFuZGxlOworCWFjcGlfaGFuZGxlIG5leHRfY2hpbGRfaGFuZGxlOworCWFjcGlfaGFuZGxlIGR1bW15OworCXUzMiBsZXZlbDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2RlbGV0ZV9zdWJ0cmVlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19kZWxldGVfc3VidHJlZSIpOwogCiAJcGFyZW50X2hhbmRsZSA9IHN0YXJ0X2hhbmRsZTsKIAljaGlsZF9oYW5kbGUgPSBOVUxMOwotCWxldmVsICAgICAgICA9IDE7CisJbGV2ZWwgPSAxOwogCiAJLyoKIAkgKiBUcmF2ZXJzZSB0aGUgdHJlZSBvZiBvYmplY3RzIHVudGlsIHdlIGJ1YmJsZSBiYWNrIHVwCkBAIC0zNzksMTggKzMyNywxOSBAQAogCXdoaWxlIChsZXZlbCA+IDApIHsKIAkJLyogQXR0ZW1wdCB0byBnZXQgdGhlIG5leHQgb2JqZWN0IGluIHRoaXMgc2NvcGUgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2dldF9uZXh0X29iamVjdCAoQUNQSV9UWVBFX0FOWSwgcGFyZW50X2hhbmRsZSwKLQkJCQkgIGNoaWxkX2hhbmRsZSwgJm5leHRfY2hpbGRfaGFuZGxlKTsKKwkJc3RhdHVzID0gYWNwaV9nZXRfbmV4dF9vYmplY3QoQUNQSV9UWVBFX0FOWSwgcGFyZW50X2hhbmRsZSwKKwkJCQkJICAgICAgY2hpbGRfaGFuZGxlLCAmbmV4dF9jaGlsZF9oYW5kbGUpOwogCiAJCWNoaWxkX2hhbmRsZSA9IG5leHRfY2hpbGRfaGFuZGxlOwogCiAJCS8qIERpZCB3ZSBnZXQgYSBuZXcgb2JqZWN0PyAqLwogCi0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQkvKiBDaGVjayBpZiB0aGlzIG9iamVjdCBoYXMgYW55IGNoaWxkcmVuICovCiAKLQkJCWlmIChBQ1BJX1NVQ0NFU1MgKGFjcGlfZ2V0X25leHRfb2JqZWN0IChBQ1BJX1RZUEVfQU5ZLCBjaGlsZF9oYW5kbGUsCi0JCQkJCSBOVUxMLCAmZHVtbXkpKSkgeworCQkJaWYgKEFDUElfU1VDQ0VTUworCQkJICAgIChhY3BpX2dldF9uZXh0X29iamVjdAorCQkJICAgICAoQUNQSV9UWVBFX0FOWSwgY2hpbGRfaGFuZGxlLCBOVUxMLCAmZHVtbXkpKSkgewogCQkJCS8qCiAJCQkJICogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoaWxkIG9mIHRoaXMgb2JqZWN0LAogCQkJCSAqIHZpc2l0IHRoZSBvYmplY3QKQEAgLTM5OSw4ICszNDgsNyBAQAogCQkJCXBhcmVudF9oYW5kbGUgPSBjaGlsZF9oYW5kbGU7CiAJCQkJY2hpbGRfaGFuZGxlID0gTlVMTDsKIAkJCX0KLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBObyBtb3JlIGNoaWxkcmVuIGluIHRoaXMgb2JqZWN0LCBnbyBiYWNrIHVwIHRvCiAJCQkgKiB0aGUgb2JqZWN0J3MgcGFyZW50CkBAIC00MDksMjQgKzM1NywyMyBAQAogCiAJCQkvKiBEZWxldGUgYWxsIGNoaWxkcmVuIG5vdyAqLwogCi0JCQlhY3BpX25zX2RlbGV0ZV9jaGlsZHJlbiAoY2hpbGRfaGFuZGxlKTsKKwkJCWFjcGlfbnNfZGVsZXRlX2NoaWxkcmVuKGNoaWxkX2hhbmRsZSk7CiAKIAkJCWNoaWxkX2hhbmRsZSA9IHBhcmVudF9oYW5kbGU7Ci0JCQlzdGF0dXMgPSBhY3BpX2dldF9wYXJlbnQgKHBhcmVudF9oYW5kbGUsICZwYXJlbnRfaGFuZGxlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPSBhY3BpX2dldF9wYXJlbnQocGFyZW50X2hhbmRsZSwgJnBhcmVudF9oYW5kbGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CiAJCX0KIAl9CiAKIAkvKiBOb3cgZGVsZXRlIHRoZSBzdGFydGluZyBvYmplY3QsIGFuZCB3ZSBhcmUgZG9uZSAqLwogCi0JYWNwaV9uc19kZWxldGVfbm9kZSAoY2hpbGRfaGFuZGxlKTsKKwlhY3BpX25zX2RlbGV0ZV9ub2RlKGNoaWxkX2hhbmRsZSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogIEZVTkNUSU9OOiAgICAgICBhY3BpX25zX3VubG9hZF9uYW1lX3NwYWNlCkBAIC00NDEsMzIgKzM4OCwyNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX25zX3VubG9hZF9uYW1lc3BhY2UgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKQorYWNwaV9zdGF0dXMgYWNwaV9uc191bmxvYWRfbmFtZXNwYWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc191bmxvYWRfbmFtZV9zcGFjZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfdW5sb2FkX25hbWVfc3BhY2UiKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKIAlpZiAoIWFjcGlfZ2JsX3Jvb3Rfbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX05BTUVTUEFDRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19OQU1FU1BBQ0UpOwogCX0KIAogCWlmICghaGFuZGxlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHJlYWwgd29yayAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19kZWxldGVfc3VidHJlZSAoaGFuZGxlKTsKKwlzdGF0dXMgPSBhY3BpX25zX2RlbGV0ZV9zdWJ0cmVlKGhhbmRsZSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAjZW5kaWYKICNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbmFtZXMuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jCmluZGV4IGQ4Y2U3ZTMuLmQ1ZThkZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jCkBAIC00MSwyMyArNDEsMTcgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc25hbWVzIikKK0FDUElfTU9EVUxFX05BTUUoIm5zbmFtZXMiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyB2b2lkCi1hY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGggKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVfYnVmZmVyKTsKLQorYWNwaV9uc19idWlsZF9leHRlcm5hbF9wYXRoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIGFjcGlfc2l6ZSBzaXplLCBjaGFyICpuYW1lX2J1ZmZlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzUsMTcgKzY5LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotYWNwaV9uc19idWlsZF9leHRlcm5hbF9wYXRoICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lX2J1ZmZlcikKK2FjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICBhY3BpX3NpemUgc2l6ZSwgY2hhciAqbmFtZV9idWZmZXIpCiB7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZTsKKwlhY3BpX3NpemUgaW5kZXg7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJuc19idWlsZF9leHRlcm5hbF9wYXRoIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoIm5zX2J1aWxkX2V4dGVybmFsX3BhdGgiKTsKIAogCS8qIFNwZWNpYWwgY2FzZSBmb3Igcm9vdCAqLwogCkBAIC0xMDYsOCArOTYsOCBAQAogCiAJCS8qIFB1dCB0aGUgbmFtZSBpbnRvIHRoZSBidWZmZXIgKi8KIAotCQlBQ1BJX01PVkVfMzJfVE9fMzIgKChuYW1lX2J1ZmZlciArIGluZGV4KSwgJnBhcmVudF9ub2RlLT5uYW1lKTsKLQkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAocGFyZW50X25vZGUpOworCQlBQ1BJX01PVkVfMzJfVE9fMzIoKG5hbWVfYnVmZmVyICsgaW5kZXgpLCAmcGFyZW50X25vZGUtPm5hbWUpOworCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHBhcmVudF9ub2RlKTsKIAogCQkvKiBQcmVmaXggbmFtZSB3aXRoIHRoZSBwYXRoIHNlcGFyYXRvciAqLwogCkBAIC0xMjAsMTUgKzExMCwxNCBAQAogCW5hbWVfYnVmZmVyW2luZGV4XSA9IEFNTF9ST09UX1BSRUZJWDsKIAogCWlmIChpbmRleCAhPSAwKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIkNvdWxkIG5vdCBjb25zdHJ1Y3QgcGF0aG5hbWU7IGluZGV4PSVYLCBzaXplPSVYLCBQYXRoPSVzXG4iLAotCQkJKHUzMikgaW5kZXgsICh1MzIpIHNpemUsICZuYW1lX2J1ZmZlcltzaXplXSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkNvdWxkIG5vdCBjb25zdHJ1Y3QgcGF0aG5hbWU7IGluZGV4PSVYLCBzaXplPSVYLCBQYXRoPSVzXG4iLAorCQkJCSAgKHUzMikgaW5kZXgsICh1MzIpIHNpemUsICZuYW1lX2J1ZmZlcltzaXplXSkpOwogCX0KIAogCXJldHVybjsKIH0KIAotCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTQ0LDM3ICsxMzMsMzIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1jaGFyICoKLWFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQorY2hhciAqYWNwaV9uc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCiB7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9idWZmZXI7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplOworCWNoYXIgKm5hbWVfYnVmZmVyOworCWFjcGlfc2l6ZSBzaXplOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoIm5zX2dldF9leHRlcm5hbF9wYXRobmFtZSIsIG5vZGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoIm5zX2dldF9leHRlcm5hbF9wYXRobmFtZSIsIG5vZGUpOwogCiAJLyogQ2FsY3VsYXRlIHJlcXVpcmVkIGJ1ZmZlciBzaXplIGJhc2VkIG9uIGRlcHRoIGJlbG93IHJvb3QgKi8KIAotCXNpemUgPSBhY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGggKG5vZGUpOworCXNpemUgPSBhY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGgobm9kZSk7CiAKIAkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBiZSByZXR1cm5lZCB0byBjYWxsZXIgKi8KIAotCW5hbWVfYnVmZmVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChzaXplKTsKKwluYW1lX2J1ZmZlciA9IEFDUElfTUVNX0NBTExPQ0FURShzaXplKTsKIAlpZiAoIW5hbWVfYnVmZmVyKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIm5zX2dldF90YWJsZV9wYXRobmFtZTogYWxsb2NhdGlvbiBmYWlsdXJlXG4iKSk7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIm5zX2dldF90YWJsZV9wYXRobmFtZTogYWxsb2NhdGlvbiBmYWlsdXJlXG4iKSk7CisJCXJldHVybl9QVFIoTlVMTCk7CiAJfQogCiAJLyogQnVpbGQgdGhlIHBhdGggaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIgKi8KIAotCWFjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aCAobm9kZSwgc2l6ZSwgbmFtZV9idWZmZXIpOwotCXJldHVybl9QVFIgKG5hbWVfYnVmZmVyKTsKKwlhY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGgobm9kZSwgc2l6ZSwgbmFtZV9idWZmZXIpOworCXJldHVybl9QVFIobmFtZV9idWZmZXIpOwogfQogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoCkBAIC0xODcsMTYgKzE3MSwxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc2l6ZQotYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQorYWNwaV9zaXplIGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKIHsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbmV4dF9ub2RlOworCWFjcGlfc2l6ZSBzaXplOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpuZXh0X25vZGU7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKgogCSAqIENvbXB1dGUgbGVuZ3RoIG9mIHBhdGhuYW1lIGFzIDUgKiBudW1iZXIgb2YgbmFtZSBzZWdtZW50cy4KQEAgLTIwNywxNyArMTg3LDE2IEBACiAKIAl3aGlsZSAobmV4dF9ub2RlICYmIChuZXh0X25vZGUgIT0gYWNwaV9nYmxfcm9vdF9ub2RlKSkgewogCQlzaXplICs9IEFDUElfUEFUSF9TRUdNRU5UX0xFTkdUSDsKLQkJbmV4dF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKG5leHRfbm9kZSk7CisJCW5leHRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5leHRfbm9kZSk7CiAJfQogCiAJaWYgKCFzaXplKSB7Ci0JCXNpemUgPSAxOyAgICAgICAvKiBSb290IG5vZGUgY2FzZSAqLworCQlzaXplID0gMTsJLyogUm9vdCBub2RlIGNhc2UgKi8KIAl9CiAKLQlyZXR1cm4gKHNpemUgKyAxKTsgIC8qICsxIGZvciBudWxsIHN0cmluZyB0ZXJtaW5hdG9yICovCisJcmV0dXJuIChzaXplICsgMSk7CS8qICsxIGZvciBudWxsIHN0cmluZyB0ZXJtaW5hdG9yICovCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUKQEAgLTIzMyw0MSArMjEyLDM2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2hhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpidWZmZXIpCithY3BpX25zX2hhbmRsZV90b19wYXRobmFtZShhY3BpX2hhbmRsZSB0YXJnZXRfaGFuZGxlLAorCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICogYnVmZmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9zaXplOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3NpemUgcmVxdWlyZWRfc2l6ZTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJuc19oYW5kbGVfdG9fcGF0aG5hbWUiLCB0YXJnZXRfaGFuZGxlKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgibnNfaGFuZGxlX3RvX3BhdGhuYW1lIiwgdGFyZ2V0X2hhbmRsZSk7Ci0KLQotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAodGFyZ2V0X2hhbmRsZSk7CisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKHRhcmdldF9oYW5kbGUpOwogCWlmICghbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogRGV0ZXJtaW5lIHNpemUgcmVxdWlyZWQgZm9yIHRoZSBjYWxsZXIgYnVmZmVyICovCiAKLQlyZXF1aXJlZF9zaXplID0gYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoIChub2RlKTsKKwlyZXF1aXJlZF9zaXplID0gYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoKG5vZGUpOwogCiAJLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlciAoYnVmZmVyLCByZXF1aXJlZF9zaXplKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyKGJ1ZmZlciwgcmVxdWlyZWRfc2l6ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEJ1aWxkIHRoZSBwYXRoIGluIHRoZSBjYWxsZXIgYnVmZmVyICovCiAKLQlhY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGggKG5vZGUsIHJlcXVpcmVkX3NpemUsIGJ1ZmZlci0+cG9pbnRlcik7CisJYWNwaV9uc19idWlsZF9leHRlcm5hbF9wYXRoKG5vZGUsIHJlcXVpcmVkX3NpemUsIGJ1ZmZlci0+cG9pbnRlcik7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiJXMgWyVYXSBcbiIsCi0JCShjaGFyICopIGJ1ZmZlci0+cG9pbnRlciwgKHUzMikgcmVxdWlyZWRfc2l6ZSkpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIiVzIFslWF0gXG4iLAorCQkJICAoY2hhciAqKWJ1ZmZlci0+cG9pbnRlciwgKHUzMikgcmVxdWlyZWRfc2l6ZSkpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc29iamVjdC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc29iamVjdC5jCmluZGV4IDI3MjU4YzEuLmZjOWJlOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNvYmplY3QuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMKQEAgLTQyLDE0ICs0MiwxMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zb2JqZWN0IikKLQorQUNQSV9NT0RVTEVfTkFNRSgibnNvYmplY3QiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTcxLDIwICs2OCwxNSBAQAogICogTVVURVg6ICAgICAgIEFzc3VtZXMgbmFtZXNwYWNlIGlzIGxvY2tlZAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX25zX2F0dGFjaF9vYmplY3QgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSkKK2FjcGlfbnNfYXR0YWNoX29iamVjdChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LCBhY3BpX29iamVjdF90eXBlIHR5cGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbGFzdF9vYmpfZGVzYzsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIG9iamVjdF90eXBlID0gQUNQSV9UWVBFX0FOWTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpsYXN0X29ial9kZXNjOworCWFjcGlfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGUgPSBBQ1BJX1RZUEVfQU5ZOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfYXR0YWNoX29iamVjdCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfYXR0YWNoX29iamVjdCIpOwogCiAJLyoKIAkgKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbgpAQCAtOTIsNDAgKzg0LDM5IEBACiAJaWYgKCFub2RlKSB7CiAJCS8qIEludmFsaWQgaGFuZGxlICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgibnNfYXR0YWNoX29iamVjdDogTnVsbCBuYW1lZF9vYmogaGFuZGxlXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgibnNfYXR0YWNoX29iamVjdDogTnVsbCBuYW1lZF9vYmogaGFuZGxlXG4iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAlpZiAoIW9iamVjdCAmJiAoQUNQSV9UWVBFX0FOWSAhPSB0eXBlKSkgewogCQkvKiBOdWxsIG9iamVjdCAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkibnNfYXR0YWNoX29iamVjdDogTnVsbCBvYmplY3QsIGJ1dCB0eXBlIG5vdCBBQ1BJX1RZUEVfQU5ZXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgibnNfYXR0YWNoX29iamVjdDogTnVsbCBvYmplY3QsIGJ1dCB0eXBlIG5vdCBBQ1BJX1RZUEVfQU5ZXG4iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChub2RlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUobm9kZSkgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKIAkJLyogTm90IGEgbmFtZSBoYW5kbGUgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJuc19hdHRhY2hfb2JqZWN0OiBJbnZhbGlkIGhhbmRsZSAlcCBbJXNdXG4iLAotCQkJCW5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAobm9kZSkpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJuc19hdHRhY2hfb2JqZWN0OiBJbnZhbGlkIGhhbmRsZSAlcCBbJXNdXG4iLAorCQkJCSAgIG5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShub2RlKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogQ2hlY2sgaWYgdGhpcyBvYmplY3QgaXMgYWxyZWFkeSBhdHRhY2hlZCAqLwogCiAJaWYgKG5vZGUtPm9iamVjdCA9PSBvYmplY3QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSJPYmogJXAgYWxyZWFkeSBpbnN0YWxsZWQgaW4gbmFtZV9vYmogJXBcbiIsCi0JCQlvYmplY3QsIG5vZGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIk9iaiAlcCBhbHJlYWR5IGluc3RhbGxlZCBpbiBuYW1lX29iaiAlcFxuIiwKKwkJCQkgIG9iamVjdCwgbm9kZSkpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIElmIG51bGwgb2JqZWN0LCB3ZSB3aWxsIGp1c3QgaW5zdGFsbCBpdCAqLwogCiAJaWYgKCFvYmplY3QpIHsKLQkJb2JqX2Rlc2MgICA9IE5VTEw7CisJCW9ial9kZXNjID0gTlVMTDsKIAkJb2JqZWN0X3R5cGUgPSBBQ1BJX1RZUEVfQU5ZOwogCX0KIApAQCAtMTMzLDE0ICsxMjQsMTQgQEAKIAkgKiBJZiB0aGUgc291cmNlIG9iamVjdCBpcyBhIG5hbWVzcGFjZSBOb2RlIHdpdGggYW4gYXR0YWNoZWQgb2JqZWN0LAogCSAqIHdlIHdpbGwgdXNlIHRoYXQgKGF0dGFjaGVkKSBvYmplY3QKIAkgKi8KLQllbHNlIGlmICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSAmJgotCQkJKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmplY3QpLT5vYmplY3QpIHsKKwllbHNlIGlmICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpICYmCisJCSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqZWN0KS0+b2JqZWN0KSB7CiAJCS8qCiAJCSAqIFZhbHVlIHBhc3NlZCBpcyBhIG5hbWUgaGFuZGxlIGFuZCB0aGF0IG5hbWUgaGFzIGEKIAkJICogbm9uLW51bGwgdmFsdWUuICBVc2UgdGhhdCBuYW1lJ3MgdmFsdWUgYW5kIHR5cGUuCiAJCSAqLwotCQlvYmpfZGVzYyAgID0gKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmplY3QpLT5vYmplY3Q7Ci0JCW9iamVjdF90eXBlID0gKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmplY3QpLT50eXBlOworCQlvYmpfZGVzYyA9ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmplY3QpLT5vYmplY3Q7CisJCW9iamVjdF90eXBlID0gKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9iamVjdCktPnR5cGU7CiAJfQogCiAJLyoKQEAgLTE0OCwyMCArMTM5LDIwIEBACiAJICogaXQgZmlyc3QKIAkgKi8KIAllbHNlIHsKLQkJb2JqX2Rlc2MgPSAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICopIG9iamVjdDsKKwkJb2JqX2Rlc2MgPSAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKW9iamVjdDsKIAogCQkvKiBVc2UgdGhlIGdpdmVuIHR5cGUgKi8KIAogCQlvYmplY3RfdHlwZSA9IHR5cGU7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIkluc3RhbGxpbmcgJXAgaW50byBOb2RlICVwIFslNC40c11cbiIsCi0JCW9ial9kZXNjLCBub2RlLCBhY3BpX3V0X2dldF9ub2RlX25hbWUgKG5vZGUpKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiSW5zdGFsbGluZyAlcCBpbnRvIE5vZGUgJXAgWyU0LjRzXVxuIiwKKwkJCSAgb2JqX2Rlc2MsIG5vZGUsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSkpOwogCiAJLyogRGV0YWNoIGFuIGV4aXN0aW5nIGF0dGFjaGVkIG9iamVjdCBpZiBwcmVzZW50ICovCiAKIAlpZiAobm9kZS0+b2JqZWN0KSB7Ci0JCWFjcGlfbnNfZGV0YWNoX29iamVjdCAobm9kZSk7CisJCWFjcGlfbnNfZGV0YWNoX29iamVjdChub2RlKTsKIAl9CiAKIAlpZiAob2JqX2Rlc2MpIHsKQEAgLTE2OSw3ICsxNjAsNyBAQAogCQkgKiBNdXN0IGluY3JlbWVudCB0aGUgbmV3IHZhbHVlJ3MgcmVmZXJlbmNlIGNvdW50CiAJCSAqIChpZiBpdCBpcyBhbiBpbnRlcm5hbCBvYmplY3QpCiAJCSAqLwotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAogCQkvKgogCQkgKiBIYW5kbGUgb2JqZWN0cyB3aXRoIG11bHRpcGxlIGRlc2NyaXB0b3JzIC0gd2FsawpAQCAtMTg1LDEzICsxNzYsMTIgQEAKIAkJbGFzdF9vYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0ID0gbm9kZS0+b2JqZWN0OwogCX0KIAotCW5vZGUtPnR5cGUgICAgID0gKHU4KSBvYmplY3RfdHlwZTsKLQlub2RlLT5vYmplY3QgICA9IG9ial9kZXNjOworCW5vZGUtPnR5cGUgPSAodTgpIG9iamVjdF90eXBlOworCW5vZGUtPm9iamVjdCA9IG9ial9kZXNjOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2RldGFjaF9vYmplY3QKQEAgLTIwNiwzMCArMTk2LDI3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9uc19kZXRhY2hfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQordm9pZCBhY3BpX25zX2RldGFjaF9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19kZXRhY2hfb2JqZWN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19kZXRhY2hfb2JqZWN0Iik7CiAKIAlvYmpfZGVzYyA9IG5vZGUtPm9iamVjdDsKIAogCWlmICghb2JqX2Rlc2MgfHwKLQkJKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpKSB7CisJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpKSB7CiAJCXJldHVybl9WT0lEOwogCX0KIAogCS8qIENsZWFyIHRoZSBlbnRyeSBpbiBhbGwgY2FzZXMgKi8KIAogCW5vZGUtPm9iamVjdCA9IE5VTEw7Ci0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7CiAJCW5vZGUtPm9iamVjdCA9IG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7CiAJCWlmIChub2RlLT5vYmplY3QgJiYKLQkJICAgKEFDUElfR0VUX09CSkVDVF9UWVBFIChub2RlLT5vYmplY3QpICE9IEFDUElfVFlQRV9MT0NBTF9EQVRBKSkgeworCQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKG5vZGUtPm9iamVjdCkgIT0KKwkJICAgICBBQ1BJX1RZUEVfTE9DQUxfREFUQSkpIHsKIAkJCW5vZGUtPm9iamVjdCA9IG5vZGUtPm9iamVjdC0+Y29tbW9uLm5leHRfb2JqZWN0OwogCQl9CiAJfQpAQCAtMjM4LDE2ICsyMjUsMTUgQEAKIAogCW5vZGUtPnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsICJOb2RlICVwIFslNC40c10gT2JqZWN0ICVwXG4iLAotCQlub2RlLCBhY3BpX3V0X2dldF9ub2RlX25hbWUgKG5vZGUpLCBvYmpfZGVzYykpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsICJOb2RlICVwIFslNC40c10gT2JqZWN0ICVwXG4iLAorCQkJICBub2RlLCBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksIG9ial9kZXNjKSk7CiAKIAkvKiBSZW1vdmUgb25lIHJlZmVyZW5jZSBvbiB0aGUgb2JqZWN0IChhbmQgYWxsIHN1Ym9iamVjdHMpICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdApAQCAtMjYxLDI5ICsyNDcsMjggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoKLWFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSkKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChzdHJ1Y3QKKwkJCQkJCSAgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICAgICAgKm5vZGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJuc19nZXRfYXR0YWNoZWRfb2JqZWN0Iiwgbm9kZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigibnNfZ2V0X2F0dGFjaGVkX29iamVjdCIsIG5vZGUpOwogCiAJaWYgKCFub2RlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1dBUk4sICJOdWxsIE5vZGUgcHRyXG4iKSk7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJOdWxsIE5vZGUgcHRyXG4iKSk7CisJCXJldHVybl9QVFIoTlVMTCk7CiAJfQogCiAJaWYgKCFub2RlLT5vYmplY3QgfHwKLQkJCSgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChub2RlLT5vYmplY3QpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpICYmCi0JCQkgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAobm9kZS0+b2JqZWN0KSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkpICB8fAotCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG5vZGUtPm9iamVjdCkgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpKSB7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCSAgICAoKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShub2RlLT5vYmplY3QpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpCisJICAgICAmJiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG5vZGUtPm9iamVjdCkgIT0KKwkJIEFDUElfREVTQ19UWVBFX05BTUVEKSkKKwkgICAgfHwgKEFDUElfR0VUX09CSkVDVF9UWVBFKG5vZGUtPm9iamVjdCkgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpKSB7CisJCXJldHVybl9QVFIoTlVMTCk7CiAJfQogCi0JcmV0dXJuX1BUUiAobm9kZS0+b2JqZWN0KTsKKwlyZXR1cm5fUFRSKG5vZGUtPm9iamVjdCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdApAQCAtMjk3LDI0ICsyODIsMjMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoKLWFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKQordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdCh1bmlvbgorCQkJCQkJCWFjcGlfb3BlcmFuZF9vYmplY3QKKwkJCQkJCQkqb2JqX2Rlc2MpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJuc19nZXRfc2Vjb25kYXJ5X29iamVjdCIsIG9ial9kZXNjKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigibnNfZ2V0X3NlY29uZGFyeV9vYmplY3QiLCBvYmpfZGVzYyk7CiAKLQotCWlmICgoIW9ial9kZXNjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLQkJKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpIHx8Ci0JCSghb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QpID09IEFDUElfVFlQRV9MT0NBTF9EQVRBKSkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwlpZiAoKCFvYmpfZGVzYykgfHwKKwkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkgfHwKKwkgICAgKCFvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0KSB8fAorCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdCkgPT0KKwkgICAgIEFDUElfVFlQRV9MT0NBTF9EQVRBKSkgeworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAotCXJldHVybl9QVFIgKG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QpOworCXJldHVybl9QVFIob2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19hdHRhY2hfZGF0YQpAQCAtMzMwLDIzICszMTQsMjAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2F0dGFjaF9kYXRhICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfb2JqZWN0X2hhbmRsZXIgICAgICAgICAgICAgaGFuZGxlciwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQorYWNwaV9uc19hdHRhY2hfZGF0YShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJICAgIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqZGF0YSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpwcmV2X29ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRhdGFfZGVzYzsKLQorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnByZXZfb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGF0YV9kZXNjOwogCiAJLyogV2Ugb25seSBhbGxvdyBvbmUgYXR0YWNobWVudCBwZXIgaGFuZGxlciAqLwogCiAJcHJldl9vYmpfZGVzYyA9IE5VTEw7CiAJb2JqX2Rlc2MgPSBub2RlLT5vYmplY3Q7CiAJd2hpbGUgKG9ial9kZXNjKSB7Ci0JCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkgJiYKLQkJCShvYmpfZGVzYy0+ZGF0YS5oYW5kbGVyID09IGhhbmRsZXIpKSB7CisJCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9EQVRBKSAmJgorCQkgICAgKG9ial9kZXNjLT5kYXRhLmhhbmRsZXIgPT0gaGFuZGxlcikpIHsKIAkJCXJldHVybiAoQUVfQUxSRUFEWV9FWElTVFMpOwogCQl9CiAKQEAgLTM1Niw3ICszMzcsNyBAQAogCiAJLyogQ3JlYXRlIGFuIGludGVybmFsIG9iamVjdCBmb3IgdGhlIGRhdGEgKi8KIAotCWRhdGFfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0xPQ0FMX0RBVEEpOworCWRhdGFfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfTE9DQUxfREFUQSk7CiAJaWYgKCFkYXRhX2Rlc2MpIHsKIAkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCX0KQEAgLTM2OCwxNSArMzQ5LDEzIEBACiAKIAlpZiAocHJldl9vYmpfZGVzYykgewogCQlwcmV2X29ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QgPSBkYXRhX2Rlc2M7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCW5vZGUtPm9iamVjdCA9IGRhdGFfZGVzYzsKIAl9CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2RldGFjaF9kYXRhCkBAIC0zOTIsMjcgKzM3MSwyNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfZGV0YWNoX2RhdGEgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyKQorYWNwaV9uc19kZXRhY2hfZGF0YShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqIG5vZGUsCisJCSAgICBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcHJldl9vYmpfZGVzYzsKLQorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnByZXZfb2JqX2Rlc2M7CiAKIAlwcmV2X29ial9kZXNjID0gTlVMTDsKIAlvYmpfZGVzYyA9IG5vZGUtPm9iamVjdDsKIAl3aGlsZSAob2JqX2Rlc2MpIHsKLQkJaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9EQVRBKSAmJgotCQkJKG9ial9kZXNjLT5kYXRhLmhhbmRsZXIgPT0gaGFuZGxlcikpIHsKKwkJaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpICYmCisJCSAgICAob2JqX2Rlc2MtPmRhdGEuaGFuZGxlciA9PSBoYW5kbGVyKSkgewogCQkJaWYgKHByZXZfb2JqX2Rlc2MpIHsKLQkJCQlwcmV2X29ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OwotCQkJfQotCQkJZWxzZSB7CisJCQkJcHJldl9vYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0ID0KKwkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKKwkJCX0gZWxzZSB7CiAJCQkJbm9kZS0+b2JqZWN0ID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKIAkJCX0KIAotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCQkJcmV0dXJuIChBRV9PSyk7CiAJCX0KIApAQCAtNDIzLDcgKzQwMCw2IEBACiAJcmV0dXJuIChBRV9OT1RfRk9VTkQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX2RhdGEKQEAgLTQ0MCwxOCArNDE2LDE1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19nZXRfYXR0YWNoZWRfZGF0YSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQlhY3BpX29iamVjdF9oYW5kbGVyICAgICAgICAgICAgIGhhbmRsZXIsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmRhdGEpCithY3BpX25zX2dldF9hdHRhY2hlZF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogbm9kZSwKKwkJCSAgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICoqZGF0YSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCiAJb2JqX2Rlc2MgPSBub2RlLT5vYmplY3Q7CiAJd2hpbGUgKG9ial9kZXNjKSB7Ci0JCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkgJiYKLQkJCShvYmpfZGVzYy0+ZGF0YS5oYW5kbGVyID09IGhhbmRsZXIpKSB7CisJCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9EQVRBKSAmJgorCQkgICAgKG9ial9kZXNjLT5kYXRhLmhhbmRsZXIgPT0gaGFuZGxlcikpIHsKIAkJCSpkYXRhID0gb2JqX2Rlc2MtPmRhdGEucG9pbnRlcjsKIAkJCXJldHVybiAoQUVfT0spOwogCQl9CkBAIC00NjEsNSArNDM0LDMgQEAKIAogCXJldHVybiAoQUVfTk9UX0ZPVU5EKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zcGFyc2UuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNwYXJzZS5jCmluZGV4IGEwZTEzZTguLjQzMzQ0MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNwYXJzZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNwYXJzZS5jCkBAIC00MSwxNiArNDEsMTMgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zcGFyc2UiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJuc3BhcnNlIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02NCw1NCArNjEsNTAgQEAKICAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIG9uZSBjb21wbGV0ZSBwYXJzZSBvZiBhbiBBQ1BJL0FNTCB0YWJsZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc19udW1iZXIsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYykKK2FjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKHU4IHBhc3NfbnVtYmVyLCBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICogdGFibGVfZGVzYykKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpwYXJzZV9yb290OwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGU7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcnNlX3Jvb3Q7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19vbmVfY29tcGxldGVfcGFyc2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX29uZV9jb21wbGV0ZV9wYXJzZSIpOwogCiAJLyogQ3JlYXRlIGFuZCBpbml0IGEgUm9vdCBOb2RlICovCiAKLQlwYXJzZV9yb290ID0gYWNwaV9wc19jcmVhdGVfc2NvcGVfb3AgKCk7CisJcGFyc2Vfcm9vdCA9IGFjcGlfcHNfY3JlYXRlX3Njb3BlX29wKCk7CiAJaWYgKCFwYXJzZV9yb290KSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHdhbGsgc3RhdGUgKi8KIAotCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlICh0YWJsZV9kZXNjLT50YWJsZV9pZCwKLQkJCSAgIE5VTEwsIE5VTEwsIE5VTEwpOworCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKHRhYmxlX2Rlc2MtPm93bmVyX2lkLAorCQkJCQkgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CiAJaWYgKCF3YWxrX3N0YXRlKSB7Ci0JCWFjcGlfcHNfZnJlZV9vcCAocGFyc2Vfcm9vdCk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJYWNwaV9wc19mcmVlX29wKHBhcnNlX3Jvb3QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsgKHdhbGtfc3RhdGUsIHBhcnNlX3Jvb3QsIE5VTEwsCi0JCQkgIHRhYmxlX2Rlc2MtPmFtbF9zdGFydCwgdGFibGVfZGVzYy0+YW1sX2xlbmd0aCwKLQkJCSAgTlVMTCwgcGFzc19udW1iZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSAod2Fsa19zdGF0ZSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgcGFyc2Vfcm9vdCwgTlVMTCwKKwkJCQkgICAgICAgdGFibGVfZGVzYy0+YW1sX3N0YXJ0LAorCQkJCSAgICAgICB0YWJsZV9kZXNjLT5hbWxfbGVuZ3RoLCBOVUxMLAorCQkJCSAgICAgICBwYXNzX251bWJlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFBhcnNlIHRoZSBBTUwgKi8KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLCAiKlBBUlNFKiBwYXNzICVkIHBhcnNlXG4iLCBwYXNzX251bWJlcikpOwotCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfYW1sICh3YWxrX3N0YXRlKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiKlBBUlNFKiBwYXNzICVkIHBhcnNlXG4iLAorCQkJICBwYXNzX251bWJlcikpOworCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfYW1sKHdhbGtfc3RhdGUpOwogCi0JYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSAocGFyc2Vfcm9vdCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUocGFyc2Vfcm9vdCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19wYXJzZV90YWJsZQpAQCAtMTI2LDE1ICsxMTksMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX3BhcnNlX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnN0YXJ0X25vZGUpCithY3BpX25zX3BhcnNlX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2MsCisJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19wYXJzZV90YWJsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfcGFyc2VfdGFibGUiKTsKIAogCS8qCiAJICogQU1MIFBhcnNlLCBwYXNzIDEKQEAgLTE0Niw5ICsxMzYsMTAgQEAKIAkgKiB0byBzZXJ2aWNlIHRoZSBlbnRpcmUgcGFyc2UuICBUaGUgc2Vjb25kIHBhc3Mgb2YgdGhlIHBhcnNlIHRoZW4KIAkgKiBwZXJmb3JtcyBhbm90aGVyIGNvbXBsZXRlIHBhcnNlIG9mIHRoZSBBTUwuLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlICgxLCB0YWJsZV9kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiKioqKiBTdGFydCBwYXNzIDFcbiIpKTsKKwlzdGF0dXMgPSBhY3BpX25zX29uZV9jb21wbGV0ZV9wYXJzZSgxLCB0YWJsZV9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTE2MCwxMiArMTUxLDExIEBACiAJICogb3ZlcmhlYWQgb2YgdGhpcyBpcyBjb21wZW5zYXRlZCBmb3IgYnkgdGhlIGZhY3QgdGhhdCB0aGUKIAkgKiBwYXJzZSBvYmplY3RzIGFyZSBhbGwgY2FjaGVkLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlICgyLCB0YWJsZV9kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiKioqKiBTdGFydCBwYXNzIDJcbiIpKTsKKwlzdGF0dXMgPSBhY3BpX25zX29uZV9jb21wbGV0ZV9wYXJzZSgyLCB0YWJsZV9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNzZWFyY2guYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNzZWFyY2guYwppbmRleCBhZjhhYWE5Li41MGEzY2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zc2VhcmNoLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jCkBAIC00MSwyMyArNDEsMTggQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc3NlYXJjaCIpCitBQ1BJX01PRFVMRV9OQU1FKCJuc3NlYXJjaCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX3NlYXJjaF9wYXJlbnRfdHJlZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbmFtZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqcmV0dXJuX25vZGUpOwotCithY3BpX25zX3NlYXJjaF9wYXJlbnRfdHJlZSh1MzIgdGFyZ2V0X25hbWUsCisJCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0dXJuX25vZGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTg3LDMwICs4MiwyOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfc2VhcmNoX25vZGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X25hbWUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqKnJldHVybl9ub2RlKQorYWNwaV9uc19zZWFyY2hfbm9kZSh1MzIgdGFyZ2V0X25hbWUsCisJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJICAgIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0dXJuX25vZGUpCiB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbmV4dF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpuZXh0X25vZGU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19zZWFyY2hfbm9kZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfc2VhcmNoX25vZGUiKTsKIAogI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCiAJaWYgKEFDUElfTFZfTkFNRVMgJiBhY3BpX2RiZ19sZXZlbCkgewotCQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgKnNjb3BlX25hbWU7CisJCWNoYXIgKnNjb3BlX25hbWU7CiAKLQkJc2NvcGVfbmFtZSA9IGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lIChub2RlKTsKKwkJc2NvcGVfbmFtZSA9IGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lKG5vZGUpOwogCQlpZiAoc2NvcGVfbmFtZSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCQkJIlNlYXJjaGluZyAlcyAoJXApIEZvciBbJTQuNHNdICglcylcbiIsCi0JCQkJc2NvcGVfbmFtZSwgbm9kZSwgKGNoYXIgKikgJnRhcmdldF9uYW1lLAotCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZSkpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCSAgIlNlYXJjaGluZyAlcyAoJXApIEZvciBbJTQuNHNdICglcylcbiIsCisJCQkJCSAgc2NvcGVfbmFtZSwgbm9kZSwKKwkJCQkJICAoY2hhciAqKSZ0YXJnZXRfbmFtZSwKKwkJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpKTsKIAotCQkJQUNQSV9NRU1fRlJFRSAoc2NvcGVfbmFtZSk7CisJCQlBQ1BJX01FTV9GUkVFKHNjb3BlX25hbWUpOwogCQl9CiAJfQogI2VuZGlmCkBAIC0xMjYsMjAgKzExOSwyNiBAQAogCQlpZiAobmV4dF9ub2RlLT5uYW1lLmludGVnZXIgPT0gdGFyZ2V0X25hbWUpIHsKIAkJCS8qIFJlc29sdmUgYSBjb250cm9sIG1ldGhvZCBhbGlhcyBpZiBhbnkgKi8KIAotCQkJaWYgKGFjcGlfbnNfZ2V0X3R5cGUgKG5leHRfbm9kZSkgPT0gQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUykgewotCQkJCW5leHRfbm9kZSA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCBuZXh0X25vZGUtPm9iamVjdCk7CisJCQlpZiAoYWNwaV9uc19nZXRfdHlwZShuZXh0X25vZGUpID09CisJCQkgICAgQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUykgeworCQkJCW5leHRfbm9kZSA9CisJCQkJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsCisJCQkJCQkgIG5leHRfbm9kZS0+b2JqZWN0KTsKIAkJCX0KIAogCQkJLyoKIAkJCSAqIEZvdW5kIG1hdGNoaW5nIGVudHJ5LgogCQkJICovCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCQkiTmFtZSBbJTQuNHNdICglcykgJXAgZm91bmQgaW4gc2NvcGUgWyU0LjRzXSAlcFxuIiwKLQkJCQkoY2hhciAqKSAmdGFyZ2V0X25hbWUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAobmV4dF9ub2RlLT50eXBlKSwKLQkJCQluZXh0X25vZGUsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSAobm9kZSksIG5vZGUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCSAgIk5hbWUgWyU0LjRzXSAoJXMpICVwIGZvdW5kIGluIHNjb3BlIFslNC40c10gJXBcbiIsCisJCQkJCSAgKGNoYXIgKikmdGFyZ2V0X25hbWUsCisJCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5leHRfbm9kZS0+CisJCQkJCQkJCXR5cGUpLAorCQkJCQkgIG5leHRfbm9kZSwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksIG5vZGUpKTsKIAogCQkJKnJldHVybl9ub2RlID0gbmV4dF9ub2RlOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQl9CiAKIAkJLyoKQEAgLTE1OSwxNSArMTU4LDE0IEBACiAKIAkvKiBTZWFyY2hlZCBlbnRpcmUgbmFtZXNwYWNlIGxldmVsLCBub3QgZm91bmQgKi8KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLAotCQkiTmFtZSBbJTQuNHNdICglcykgbm90IGZvdW5kIGluIHNlYXJjaCBpbiBzY29wZSBbJTQuNHNdICVwIGZpcnN0IGNoaWxkICVwXG4iLAotCQkoY2hhciAqKSAmdGFyZ2V0X25hbWUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZSksCi0JCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAobm9kZSksIG5vZGUsIG5vZGUtPmNoaWxkKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCSAgIk5hbWUgWyU0LjRzXSAoJXMpIG5vdCBmb3VuZCBpbiBzZWFyY2ggaW4gc2NvcGUgWyU0LjRzXSAlcCBmaXJzdCBjaGlsZCAlcFxuIiwKKwkJCSAgKGNoYXIgKikmdGFyZ2V0X25hbWUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSwKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLCBub2RlLCBub2RlLT5jaGlsZCkpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRk9VTkQpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRk9VTkQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfc2VhcmNoX3BhcmVudF90cmVlCkBAIC0xOTQsNDMgKzE5Miw0MiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX3NlYXJjaF9wYXJlbnRfdHJlZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbmFtZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqcmV0dXJuX25vZGUpCithY3BpX25zX3NlYXJjaF9wYXJlbnRfdHJlZSh1MzIgdGFyZ2V0X25hbWUsCisJCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0dXJuX25vZGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X25vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX3NlYXJjaF9wYXJlbnRfdHJlZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX3NlYXJjaF9wYXJlbnRfdHJlZSIpOwotCi0KLQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlIChub2RlKTsKKwlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpOwogCiAJLyoKIAkgKiBJZiB0aGVyZSBpcyBubyBwYXJlbnQgKGkuZS4sIHdlIGFyZSBhdCB0aGUgcm9vdCkgb3IgdHlwZSBpcyAibG9jYWwiLAogCSAqIHdlIHdvbid0IGJlIHNlYXJjaGluZyB0aGUgcGFyZW50IHRyZWUuCiAJICovCiAJaWYgKCFwYXJlbnRfbm9kZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywgIlslNC40c10gaGFzIG5vIHBhcmVudFxuIiwKLQkJCShjaGFyICopICZ0YXJnZXRfbmFtZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9GT1VORCk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsICJbJTQuNHNdIGhhcyBubyBwYXJlbnRcbiIsCisJCQkJICAoY2hhciAqKSZ0YXJnZXRfbmFtZSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKIAl9CiAKLQlpZiAoYWNwaV9uc19sb2NhbCAodHlwZSkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCQkiWyU0LjRzXSB0eXBlIFslc10gbXVzdCBiZSBsb2NhbCB0byB0aGlzIHNjb3BlIChubyBwYXJlbnQgc2VhcmNoKVxuIiwKLQkJCShjaGFyICopICZ0YXJnZXRfbmFtZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9GT1VORCk7CisJaWYgKGFjcGlfbnNfbG9jYWwodHlwZSkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkgICJbJTQuNHNdIHR5cGUgWyVzXSBtdXN0IGJlIGxvY2FsIHRvIHRoaXMgc2NvcGUgKG5vIHBhcmVudCBzZWFyY2gpXG4iLAorCQkJCSAgKGNoYXIgKikmdGFyZ2V0X25hbWUsCisJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7CiAJfQogCiAJLyogU2VhcmNoIHRoZSBwYXJlbnQgdHJlZSAqLwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCSJTZWFyY2hpbmcgcGFyZW50IFslNC40c10gZm9yIFslNC40c11cbiIsCi0JCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocGFyZW50X25vZGUpLCAoY2hhciAqKSAmdGFyZ2V0X25hbWUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJICAiU2VhcmNoaW5nIHBhcmVudCBbJTQuNHNdIGZvciBbJTQuNHNdXG4iLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocGFyZW50X25vZGUpLAorCQkJICAoY2hhciAqKSZ0YXJnZXRfbmFtZSkpOwogCiAJLyoKIAkgKiBTZWFyY2ggcGFyZW50cyB1bnRpbCB0YXJnZXQgaXMgZm91bmQgb3Igd2UgaGF2ZSBiYWNrZWQgdXAgdG8gdGhlIHJvb3QKQEAgLTI0MSwyNSArMjM4LDI0IEBACiAJCSAqIG9iamVjdCB0eXBlIGF0IHRoaXMgcG9pbnQsIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIG9mCiAJCSAqIHRoZSBhY3R1YWwgbmFtZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gIFR5cGVjaGVja2luZyBjb21lcyBsYXRlci4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfc2VhcmNoX25vZGUgKHRhcmdldF9uYW1lLCBwYXJlbnRfbm9kZSwKLQkJCQkgIEFDUElfVFlQRV9BTlksIHJldHVybl9ub2RlKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX25zX3NlYXJjaF9ub2RlKHRhcmdldF9uYW1lLCBwYXJlbnRfbm9kZSwKKwkJCQkJICAgICBBQ1BJX1RZUEVfQU5ZLCByZXR1cm5fbm9kZSk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQkvKgogCQkgKiBOb3QgZm91bmQgaGVyZSwgZ28gdXAgYW5vdGhlciBsZXZlbAogCQkgKiAodW50aWwgd2UgcmVhY2ggdGhlIHJvb3QpCiAJCSAqLwotCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlIChwYXJlbnRfbm9kZSk7CisJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocGFyZW50X25vZGUpOwogCX0KIAogCS8qIE5vdCBmb3VuZCBpbiBwYXJlbnQgdHJlZSAqLwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRk9VTkQpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRk9VTkQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfc2VhcmNoX2FuZF9lbnRlcgpAQCAtMjg2LDUyICsyODIsNDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X25hbWUsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfaW50ZXJwcmV0ZXJfbW9kZSAgICAgICAgICAgaW50ZXJwcmV0ZXJfbW9kZSwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqcmV0dXJuX25vZGUpCithY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIodTMyIHRhcmdldF9uYW1lLAorCQkJIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgYWNwaV9pbnRlcnByZXRlcl9tb2RlIGludGVycHJldGVyX21vZGUsCisJCQkgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkJIHUzMiBmbGFncywgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpuZXdfbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5ld19ub2RlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfc2VhcmNoX2FuZF9lbnRlciIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfc2VhcmNoX2FuZF9lbnRlciIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAogCWlmICghbm9kZSB8fCAhdGFyZ2V0X25hbWUgfHwgIXJldHVybl9ub2RlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIk51bGwgcGFyYW06IE5vZGUgJXAgTmFtZSAlWCByZXR1cm5fbm9kZSAlcFxuIiwKLQkJCW5vZGUsIHRhcmdldF9uYW1lLCByZXR1cm5fbm9kZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk51bGwgcGFyYW06IE5vZGUgJXAgTmFtZSAlWCByZXR1cm5fbm9kZSAlcFxuIiwKKwkJCQkgIG5vZGUsIHRhcmdldF9uYW1lLCByZXR1cm5fbm9kZSkpOwogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoIm5zX3NlYXJjaF9hbmRfZW50ZXI6IE51bGwgcGFyYW1ldGVyXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgibnNfc2VhcmNoX2FuZF9lbnRlcjogTnVsbCBwYXJhbWV0ZXJcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIE5hbWUgbXVzdCBjb25zaXN0IG9mIHByaW50YWJsZSBjaGFyYWN0ZXJzICovCiAKLQlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lICh0YXJnZXRfbmFtZSkpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgibnNfc2VhcmNoX2FuZF9lbnRlcjogQmFkIGNoYXJhY3RlciBpbiBBQ1BJIE5hbWU6ICVYXG4iLAotCQkJdGFyZ2V0X25hbWUpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfQ0hBUkFDVEVSKTsKKwlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKHRhcmdldF9uYW1lKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIm5zX3NlYXJjaF9hbmRfZW50ZXI6IEJhZCBjaGFyYWN0ZXIgaW4gQUNQSSBOYW1lOiAlWFxuIiwgdGFyZ2V0X25hbWUpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9DSEFSQUNURVIpOwogCX0KIAogCS8qIFRyeSB0byBmaW5kIHRoZSBuYW1lIGluIHRoZSBuYW1lc3BhY2UgbGV2ZWwgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIgKi8KIAogCSpyZXR1cm5fbm9kZSA9IEFDUElfRU5UUllfTk9UX0ZPVU5EOwotCXN0YXR1cyA9IGFjcGlfbnNfc2VhcmNoX25vZGUgKHRhcmdldF9uYW1lLCBub2RlLCB0eXBlLCByZXR1cm5fbm9kZSk7CisJc3RhdHVzID0gYWNwaV9uc19zZWFyY2hfbm9kZSh0YXJnZXRfbmFtZSwgbm9kZSwgdHlwZSwgcmV0dXJuX25vZGUpOwogCWlmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CiAJCS8qCiAJCSAqIElmIHdlIGZvdW5kIGl0IEFORCB0aGUgcmVxdWVzdCBzcGVjaWZpZXMgdGhhdCBhIGZpbmQgaXMgYW4gZXJyb3IsCiAJCSAqIHJldHVybiB0aGUgZXJyb3IKIAkJICovCi0JCWlmICgoc3RhdHVzID09IEFFX09LKSAmJgotCQkJKGZsYWdzICYgQUNQSV9OU19FUlJPUl9JRl9GT1VORCkpIHsKKwkJaWYgKChzdGF0dXMgPT0gQUVfT0spICYmIChmbGFncyAmIEFDUElfTlNfRVJST1JfSUZfRk9VTkQpKSB7CiAJCQlzdGF0dXMgPSBBRV9BTFJFQURZX0VYSVNUUzsKIAkJfQogCkBAIC0zMzksNyArMzI5LDcgQEAKIAkJICogRWl0aGVyIGZvdW5kIGl0IG9yIHRoZXJlIHdhcyBhbiBlcnJvcgogCQkgKiAtLSBmaW5pc2hlZCBlaXRoZXIgd2F5CiAJCSAqLwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCkBAIC0zNTEsMTQgKzM0MSwxNiBAQAogCSAqIGFuZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBwaGFzZS4KIAkgKi8KIAlpZiAoKGludGVycHJldGVyX21vZGUgIT0gQUNQSV9JTU9ERV9MT0FEX1BBU1MxKSAmJgotCQkoZmxhZ3MgJiBBQ1BJX05TX1NFQVJDSF9QQVJFTlQpKSB7CisJICAgIChmbGFncyAmIEFDUElfTlNfU0VBUkNIX1BBUkVOVCkpIHsKIAkJLyoKIAkJICogTm90IGZvdW5kIGF0IHRoaXMgbGV2ZWwgLSBzZWFyY2ggcGFyZW50IHRyZWUgYWNjb3JkaW5nIHRvIHRoZQogCQkgKiBBQ1BJIHNwZWNpZmljYXRpb24KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfc2VhcmNoX3BhcmVudF90cmVlICh0YXJnZXRfbmFtZSwgbm9kZSwgdHlwZSwgcmV0dXJuX25vZGUpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX3NlYXJjaF9wYXJlbnRfdHJlZSh0YXJnZXRfbmFtZSwgbm9kZSwgdHlwZSwKKwkJCQkJICAgICAgIHJldHVybl9ub2RlKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIApAQCAtMzY2LDI1ICszNTgsMjQgQEAKIAkgKiBJbiBleGVjdXRlIG1vZGUsIGp1c3Qgc2VhcmNoLCBuZXZlciBhZGQgbmFtZXMuICBFeGl0IG5vdy4KIAkgKi8KIAlpZiAoaW50ZXJwcmV0ZXJfbW9kZSA9PSBBQ1BJX0lNT0RFX0VYRUNVVEUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCQkiJTQuNHMgTm90IGZvdW5kIGluICVwIFtOb3QgYWRkaW5nXVxuIiwKLQkJCShjaGFyICopICZ0YXJnZXRfbmFtZSwgbm9kZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCSAgIiU0LjRzIE5vdCBmb3VuZCBpbiAlcCBbTm90IGFkZGluZ11cbiIsCisJCQkJICAoY2hhciAqKSZ0YXJnZXRfbmFtZSwgbm9kZSkpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0ZPVU5EKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7CiAJfQogCiAJLyogQ3JlYXRlIHRoZSBuZXcgbmFtZWQgb2JqZWN0ICovCiAKLQluZXdfbm9kZSA9IGFjcGlfbnNfY3JlYXRlX25vZGUgKHRhcmdldF9uYW1lKTsKKwluZXdfbm9kZSA9IGFjcGlfbnNfY3JlYXRlX25vZGUodGFyZ2V0X25hbWUpOwogCWlmICghbmV3X25vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBJbnN0YWxsIHRoZSBuZXcgb2JqZWN0IGludG8gdGhlIHBhcmVudCdzIGxpc3Qgb2YgY2hpbGRyZW4gKi8KIAotCWFjcGlfbnNfaW5zdGFsbF9ub2RlICh3YWxrX3N0YXRlLCBub2RlLCBuZXdfbm9kZSwgdHlwZSk7CisJYWNwaV9uc19pbnN0YWxsX25vZGUod2Fsa19zdGF0ZSwgbm9kZSwgbmV3X25vZGUsIHR5cGUpOwogCSpyZXR1cm5fbm9kZSA9IG5ld19ub2RlOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zdXRpbHMuYwppbmRleCBjNTNiODJlLi5lYmVjMDM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zdXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zdXRpbHMuYwpAQCAtNDIsMjggKzQyLDIxIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc3V0aWxzIikKK0FDUElfTU9EVUxFX05BTUUoIm5zdXRpbHMiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KLXN0YXRpYyB1OAotYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXApOworc3RhdGljIHU4IGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IoY2hhciBzZXApOwogCiAjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKLWFjcGlfbmFtZQotYWNwaV9uc19maW5kX3BhcmVudF9uYW1lICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlX3RvX3NlYXJjaCk7CithY3BpX25hbWUgYWNwaV9uc19maW5kX3BhcmVudF9uYW1lKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlX3RvX3NlYXJjaCk7CiAjZW5kaWYKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3JlcG9ydF9lcnJvcgpAQCAtODEsNTEgKzc0LDQ1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX25zX3JlcG9ydF9lcnJvciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnRlcm5hbF9uYW1lLAotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgbG9va3VwX3N0YXR1cykKK2FjcGlfbnNfcmVwb3J0X2Vycm9yKGNoYXIgKm1vZHVsZV9uYW1lLAorCQkgICAgIHUzMiBsaW5lX251bWJlciwKKwkJICAgICB1MzIgY29tcG9uZW50X2lkLAorCQkgICAgIGNoYXIgKmludGVybmFsX25hbWUsIGFjcGlfc3RhdHVzIGxvb2t1cF9zdGF0dXMpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWNoYXIgKm5hbWUgPSBOVUxMOwogCi0KLQlhY3BpX29zX3ByaW50ZiAoIiU4cy0lMDRkOiAqKiogRXJyb3I6IExvb2tpbmcgdXAgIiwKLQkJbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKKwlhY3BpX29zX3ByaW50ZigiJThzLSUwNGQ6ICoqKiBFcnJvcjogTG9va2luZyB1cCAiLAorCQkgICAgICAgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKIAogCWlmIChsb29rdXBfc3RhdHVzID09IEFFX0JBRF9DSEFSQUNURVIpIHsKIAkJLyogVGhlcmUgaXMgYSBub24tYXNjaWkgY2hhcmFjdGVyIGluIHRoZSBuYW1lICovCiAKLQkJYWNwaV9vc19wcmludGYgKCJbMHglNC40WF0gKE5PTi1BU0NJSSlcbiIsCi0JCQkqKEFDUElfQ0FTVF9QVFIgKHUzMiwgaW50ZXJuYWxfbmFtZSkpKTsKLQl9Ci0JZWxzZSB7CisJCWFjcGlfb3NfcHJpbnRmKCJbMHglNC40WF0gKE5PTi1BU0NJSSlcbiIsCisJCQkgICAgICAgKihBQ1BJX0NBU1RfUFRSKHUzMiwgaW50ZXJuYWxfbmFtZSkpKTsKKwl9IGVsc2UgewogCQkvKiBDb252ZXJ0IHBhdGggdG8gZXh0ZXJuYWwgZm9ybWF0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9uc19leHRlcm5hbGl6ZV9uYW1lIChBQ1BJX1VJTlQzMl9NQVgsCi0JCQkJIGludGVybmFsX25hbWUsIE5VTEwsICZuYW1lKTsKKwkJc3RhdHVzID0gYWNwaV9uc19leHRlcm5hbGl6ZV9uYW1lKEFDUElfVUlOVDMyX01BWCwKKwkJCQkJCSAgaW50ZXJuYWxfbmFtZSwgTlVMTCwgJm5hbWUpOwogCiAJCS8qIFByaW50IHRhcmdldCBuYW1lICovCiAKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQkJYWNwaV9vc19wcmludGYgKCJbJXNdIiwgbmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoIltDT1VMRCBOT1QgRVhURVJOQUxJWkUgTkFNRV0iKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlhY3BpX29zX3ByaW50ZigiWyVzXSIsIG5hbWUpOworCQl9IGVsc2UgeworCQkJYWNwaV9vc19wcmludGYoIltDT1VMRCBOT1QgRVhURVJOQUxJWkUgTkFNRV0iKTsKIAkJfQogCiAJCWlmIChuYW1lKSB7Ci0JCQlBQ1BJX01FTV9GUkVFIChuYW1lKTsKKwkJCUFDUElfTUVNX0ZSRUUobmFtZSk7CiAJCX0KIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIiBpbiBuYW1lc3BhY2UsICVzXG4iLAotCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKGxvb2t1cF9zdGF0dXMpKTsKKwlhY3BpX29zX3ByaW50ZigiIGluIG5hbWVzcGFjZSwgJXNcbiIsCisJCSAgICAgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24obG9va3VwX3N0YXR1cykpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvcgpAQCAtMTQ1LDM0ICsxMzIsMzEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptZXNzYWdlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnByZWZpeF9ub2RlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGgsCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfc3RhdHVzKQorYWNwaV9uc19yZXBvcnRfbWV0aG9kX2Vycm9yKGNoYXIgKm1vZHVsZV9uYW1lLAorCQkJICAgIHUzMiBsaW5lX251bWJlciwKKwkJCSAgICB1MzIgY29tcG9uZW50X2lkLAorCQkJICAgIGNoYXIgKm1lc3NhZ2UsCisJCQkgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAorCQkJICAgIGNoYXIgKnBhdGgsIGFjcGlfc3RhdHVzIG1ldGhvZF9zdGF0dXMpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSA9IHByZWZpeF9ub2RlOwotCisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlID0gcHJlZml4X25vZGU7CiAKIAlpZiAocGF0aCkgewotCQlzdGF0dXMgPSBhY3BpX25zX2dldF9ub2RlX2J5X3BhdGggKHBhdGgsIHByZWZpeF9ub2RlLAotCQkJCSBBQ1BJX05TX05PX1VQU0VBUkNILCAmbm9kZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCWFjcGlfb3NfcHJpbnRmICgicmVwb3J0X21ldGhvZF9lcnJvcjogQ291bGQgbm90IGdldCBub2RlXG4iKTsKKwkJc3RhdHVzID0gYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoKHBhdGgsIHByZWZpeF9ub2RlLAorCQkJCQkJICBBQ1BJX05TX05PX1VQU0VBUkNILCAmbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoInJlcG9ydF9tZXRob2RfZXJyb3I6IENvdWxkIG5vdCBnZXQgbm9kZVxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIiU4cy0lMDRkOiAqKiogRXJyb3I6ICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7Ci0JYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lIChub2RlLCBtZXNzYWdlKTsKLQlhY3BpX29zX3ByaW50ZiAoIiwgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAobWV0aG9kX3N0YXR1cykpOworCWFjcGlfb3NfcHJpbnRmKCIlOHMtJTA0ZDogKioqIEVycm9yOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCWFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZShub2RlLCBtZXNzYWdlKTsKKwlhY3BpX29zX3ByaW50ZigiLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKG1ldGhvZF9zdGF0dXMpKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUKQEAgLTE4NiwxNiArMTcwLDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbWVzc2FnZSkKK2FjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwgY2hhciAqbWVzc2FnZSkKIHsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgIGJ1ZmZlcjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQorCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJaWYgKCFub2RlKSB7Ci0JCWFjcGlfb3NfcHJpbnRmICgiW05VTEwgTkFNRV0iKTsKKwkJYWNwaV9vc19wcmludGYoIltOVUxMIE5BTUVdIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIwMywxOCArMTg0LDE3IEBACiAKIAlidWZmZXIubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI7CiAKLQlzdGF0dXMgPSBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZSAobm9kZSwgJmJ1ZmZlcik7Ci0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lKG5vZGUsICZidWZmZXIpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlpZiAobWVzc2FnZSkgewotCQkJYWNwaV9vc19wcmludGYgKCIlcyAiLCBtZXNzYWdlKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIlcyAiLCBtZXNzYWdlKTsKIAkJfQogCi0JCWFjcGlfb3NfcHJpbnRmICgiWyVzXSAoTm9kZSAlcCkiLCAoY2hhciAqKSBidWZmZXIucG9pbnRlciwgbm9kZSk7Ci0JCUFDUElfTUVNX0ZSRUUgKGJ1ZmZlci5wb2ludGVyKTsKKwkJYWNwaV9vc19wcmludGYoIlslc10gKE5vZGUgJXApIiwgKGNoYXIgKilidWZmZXIucG9pbnRlciwgbm9kZSk7CisJCUFDUElfTUVNX0ZSRUUoYnVmZmVyLnBvaW50ZXIpOwogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3ZhbGlkX3Jvb3RfcHJlZml4CkBAIC0yMjcsMTUgKzIwNywxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4Ci1hY3BpX25zX3ZhbGlkX3Jvb3RfcHJlZml4ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCkKK3U4IGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgoY2hhciBwcmVmaXgpCiB7CiAKIAlyZXR1cm4gKCh1OCkgKHByZWZpeCA9PSAnXFwnKSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvcgpAQCAtMjQ4LDE1ICsyMjUsMTIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdTgKLWFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwKQorc3RhdGljIHU4IGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IoY2hhciBzZXApCiB7CiAKIAlyZXR1cm4gKCh1OCkgKHNlcCA9PSAnLicpKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF90eXBlCkBAIC0yNjksMjIgKzI0MywxOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfb2JqZWN0X3R5cGUKLWFjcGlfbnNfZ2V0X3R5cGUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCithY3BpX29iamVjdF90eXBlIGFjcGlfbnNfZ2V0X3R5cGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBub2RlKQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19nZXRfdHlwZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZ2V0X3R5cGUiKTsKIAogCWlmICghbm9kZSkgewotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIm5zX2dldF90eXBlOiBOdWxsIE5vZGUgaW5wdXQgcG9pbnRlclxuIikpOwotCQlyZXR1cm5fVkFMVUUgKEFDUElfVFlQRV9BTlkpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgibnNfZ2V0X3R5cGU6IE51bGwgTm9kZSBpbnB1dCBwb2ludGVyXG4iKSk7CisJCXJldHVybl9WQUxVRShBQ1BJX1RZUEVfQU5ZKTsKIAl9CiAKLQlyZXR1cm5fVkFMVUUgKChhY3BpX29iamVjdF90eXBlKSBub2RlLT50eXBlKTsKKwlyZXR1cm5fVkFMVUUoKGFjcGlfb2JqZWN0X3R5cGUpIG5vZGUtPnR5cGUpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfbG9jYWwKQEAgLTI5OCwyNCArMjY4LDIwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyCi1hY3BpX25zX2xvY2FsICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUpCit1MzIgYWNwaV9uc19sb2NhbChhY3BpX29iamVjdF90eXBlIHR5cGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2xvY2FsIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfbG9jYWwiKTsKIAotCi0JaWYgKCFhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlICh0eXBlKSkgeworCWlmICghYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZSh0eXBlKSkgewogCQkvKiBUeXBlIGNvZGUgb3V0IG9mIHJhbmdlICAqLwogCi0JCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgibnNfbG9jYWw6IEludmFsaWQgT2JqZWN0IFR5cGVcbiIpKTsKLQkJcmV0dXJuX1ZBTFVFIChBQ1BJX05TX05PUk1BTCk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJuc19sb2NhbDogSW52YWxpZCBPYmplY3QgVHlwZVxuIikpOworCQlyZXR1cm5fVkFMVUUoQUNQSV9OU19OT1JNQUwpOwogCX0KIAotCXJldHVybl9WQUxVRSAoKHUzMikgYWNwaV9nYmxfbnNfcHJvcGVydGllc1t0eXBlXSAmIEFDUElfTlNfTE9DQUwpOworCXJldHVybl9WQUxVRSgodTMyKSBhY3BpX2dibF9uc19wcm9wZXJ0aWVzW3R5cGVdICYgQUNQSV9OU19MT0NBTCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfaW50ZXJuYWxfbmFtZV9sZW5ndGgKQEAgLTMzMCwxNiArMjk2LDEyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9uc19nZXRfaW50ZXJuYWxfbmFtZV9sZW5ndGggKAotCXN0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbyAgICAgKmluZm8pCit2b2lkIGFjcGlfbnNfZ2V0X2ludGVybmFsX25hbWVfbGVuZ3RoKHN0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbyAqaW5mbykKIHsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0X2V4dGVybmFsX2NoYXI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCWNoYXIgKm5leHRfZXh0ZXJuYWxfY2hhcjsKKwl1MzIgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCW5leHRfZXh0ZXJuYWxfY2hhciA9IGluZm8tPmV4dGVybmFsX25hbWU7CiAJaW5mby0+bnVtX2NhcmF0cyA9IDA7CkBAIC0zNTMsMTEgKzMxNSwxMCBAQAogCSAqCiAJICogc3RybGVuKCkgKyAxIGNvdmVycyB0aGUgZmlyc3QgbmFtZV9zZWcsIHdoaWNoIGhhcyBubyBwYXRoIHNlcGFyYXRvcgogCSAqLwotCWlmIChhY3BpX25zX3ZhbGlkX3Jvb3RfcHJlZml4IChuZXh0X2V4dGVybmFsX2NoYXJbMF0pKSB7CisJaWYgKGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgobmV4dF9leHRlcm5hbF9jaGFyWzBdKSkgewogCQlpbmZvLT5mdWxseV9xdWFsaWZpZWQgPSBUUlVFOwogCQluZXh0X2V4dGVybmFsX2NoYXIrKzsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogSGFuZGxlIENhcmF0IHByZWZpeGVzCiAJCSAqLwpAQCAtMzc1LDE5ICszMzYsMTggQEAKIAlpZiAoKm5leHRfZXh0ZXJuYWxfY2hhcikgewogCQlpbmZvLT5udW1fc2VnbWVudHMgPSAxOwogCQlmb3IgKGkgPSAwOyBuZXh0X2V4dGVybmFsX2NoYXJbaV07IGkrKykgewotCQkJaWYgKGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IgKG5leHRfZXh0ZXJuYWxfY2hhcltpXSkpIHsKKwkJCWlmIChhY3BpX25zX3ZhbGlkX3BhdGhfc2VwYXJhdG9yKG5leHRfZXh0ZXJuYWxfY2hhcltpXSkpIHsKIAkJCQlpbmZvLT5udW1fc2VnbWVudHMrKzsKIAkJCX0KIAkJfQogCX0KIAogCWluZm8tPmxlbmd0aCA9IChBQ1BJX05BTUVfU0laRSAqIGluZm8tPm51bV9zZWdtZW50cykgKwotCQkJICA0ICsgaW5mby0+bnVtX2NhcmF0czsKKwkgICAgNCArIGluZm8tPm51bV9jYXJhdHM7CiAKIAlpbmZvLT5uZXh0X2V4dGVybmFsX2NoYXIgPSBuZXh0X2V4dGVybmFsX2NoYXI7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19idWlsZF9pbnRlcm5hbF9uYW1lCkBAIC00MDEsMTkgKzM2MSwxNSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX25zX2J1aWxkX2ludGVybmFsX25hbWUgKAotCXN0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbyAgICAgKmluZm8pCithY3BpX3N0YXR1cyBhY3BpX25zX2J1aWxkX2ludGVybmFsX25hbWUoc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvICppbmZvKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3NlZ21lbnRzID0gaW5mby0+bnVtX3NlZ21lbnRzOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmludGVybmFsX25hbWUgPSBpbmZvLT5pbnRlcm5hbF9uYW1lOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVybmFsX25hbWUgPSBpbmZvLT5uZXh0X2V4dGVybmFsX2NoYXI7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVzdWx0ID0gTlVMTDsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGk7CisJdTMyIG51bV9zZWdtZW50cyA9IGluZm8tPm51bV9zZWdtZW50czsKKwljaGFyICppbnRlcm5hbF9uYW1lID0gaW5mby0+aW50ZXJuYWxfbmFtZTsKKwljaGFyICpleHRlcm5hbF9uYW1lID0gaW5mby0+bmV4dF9leHRlcm5hbF9jaGFyOworCWNoYXIgKnJlc3VsdCA9IE5VTEw7CisJYWNwaV9uYXRpdmVfdWludCBpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfYnVpbGRfaW50ZXJuYWxfbmFtZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfYnVpbGRfaW50ZXJuYWxfbmFtZSIpOwogCiAJLyogU2V0dXAgdGhlIGNvcnJlY3QgcHJlZml4ZXMsIGNvdW50cywgYW5kIHBvaW50ZXJzICovCiAKQEAgLTQyMiwxOCArMzc4LDE1IEBACiAKIAkJaWYgKG51bV9zZWdtZW50cyA8PSAxKSB7CiAJCQlyZXN1bHQgPSAmaW50ZXJuYWxfbmFtZVsxXTsKLQkJfQotCQllbHNlIGlmIChudW1fc2VnbWVudHMgPT0gMikgeworCQl9IGVsc2UgaWYgKG51bV9zZWdtZW50cyA9PSAyKSB7CiAJCQlpbnRlcm5hbF9uYW1lWzFdID0gQU1MX0RVQUxfTkFNRV9QUkVGSVg7CiAJCQlyZXN1bHQgPSAmaW50ZXJuYWxfbmFtZVsyXTsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCWludGVybmFsX25hbWVbMV0gPSBBTUxfTVVMVElfTkFNRV9QUkVGSVhfT1A7Ci0JCQlpbnRlcm5hbF9uYW1lWzJdID0gKGNoYXIpIG51bV9zZWdtZW50czsKKwkJCWludGVybmFsX25hbWVbMl0gPSAoY2hhciludW1fc2VnbWVudHM7CiAJCQlyZXN1bHQgPSAmaW50ZXJuYWxfbmFtZVszXTsKIAkJfQotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBOb3QgZnVsbHkgcXVhbGlmaWVkLgogCQkgKiBIYW5kbGUgQ2FyYXRzIGZpcnN0LCB0aGVuIGFwcGVuZCB0aGUgbmFtZSBzZWdtZW50cwpAQCAtNDQ3LDE1ICs0MDAsMTQgQEAKIAogCQlpZiAobnVtX3NlZ21lbnRzIDw9IDEpIHsKIAkJCXJlc3VsdCA9ICZpbnRlcm5hbF9uYW1lW2ldOwotCQl9Ci0JCWVsc2UgaWYgKG51bV9zZWdtZW50cyA9PSAyKSB7CisJCX0gZWxzZSBpZiAobnVtX3NlZ21lbnRzID09IDIpIHsKIAkJCWludGVybmFsX25hbWVbaV0gPSBBTUxfRFVBTF9OQU1FX1BSRUZJWDsKLQkJCXJlc3VsdCA9ICZpbnRlcm5hbF9uYW1lWyhhY3BpX25hdGl2ZV91aW50KSAoaSsxKV07Ci0JCX0KLQkJZWxzZSB7CisJCQlyZXN1bHQgPSAmaW50ZXJuYWxfbmFtZVsoYWNwaV9uYXRpdmVfdWludCkgKGkgKyAxKV07CisJCX0gZWxzZSB7CiAJCQlpbnRlcm5hbF9uYW1lW2ldID0gQU1MX01VTFRJX05BTUVfUFJFRklYX09QOwotCQkJaW50ZXJuYWxfbmFtZVsoYWNwaV9uYXRpdmVfdWludCkgKGkrMSldID0gKGNoYXIpIG51bV9zZWdtZW50czsKLQkJCXJlc3VsdCA9ICZpbnRlcm5hbF9uYW1lWyhhY3BpX25hdGl2ZV91aW50KSAoaSsyKV07CisJCQlpbnRlcm5hbF9uYW1lWyhhY3BpX25hdGl2ZV91aW50KSAoaSArIDEpXSA9CisJCQkgICAgKGNoYXIpbnVtX3NlZ21lbnRzOworCQkJcmVzdWx0ID0gJmludGVybmFsX25hbWVbKGFjcGlfbmF0aXZlX3VpbnQpIChpICsgMildOwogCQl9CiAJfQogCkBAIC00NjMsMjUgKzQxNSwyNSBAQAogCiAJZm9yICg7IG51bV9zZWdtZW50czsgbnVtX3NlZ21lbnRzLS0pIHsKIAkJZm9yIChpID0gMDsgaSA8IEFDUElfTkFNRV9TSVpFOyBpKyspIHsKLQkJCWlmIChhY3BpX25zX3ZhbGlkX3BhdGhfc2VwYXJhdG9yICgqZXh0ZXJuYWxfbmFtZSkgfHwKLQkJCSAgICgqZXh0ZXJuYWxfbmFtZSA9PSAwKSkgeworCQkJaWYgKGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IoKmV4dGVybmFsX25hbWUpIHx8CisJCQkgICAgKCpleHRlcm5hbF9uYW1lID09IDApKSB7CiAJCQkJLyogUGFkIHRoZSBzZWdtZW50IHdpdGggdW5kZXJzY29yZShzKSBpZiBzZWdtZW50IGlzIHNob3J0ICovCiAKIAkJCQlyZXN1bHRbaV0gPSAnXyc7Ci0JCQl9Ci0JCQllbHNlIHsKKwkJCX0gZWxzZSB7CiAJCQkJLyogQ29udmVydCB0aGUgY2hhcmFjdGVyIHRvIHVwcGVyY2FzZSBhbmQgc2F2ZSBpdCAqLwogCi0JCQkJcmVzdWx0W2ldID0gKGNoYXIpIEFDUElfVE9VUFBFUiAoKGludCkgKmV4dGVybmFsX25hbWUpOworCQkJCXJlc3VsdFtpXSA9CisJCQkJICAgIChjaGFyKUFDUElfVE9VUFBFUigoaW50KSpleHRlcm5hbF9uYW1lKTsKIAkJCQlleHRlcm5hbF9uYW1lKys7CiAJCQl9CiAJCX0KIAogCQkvKiBOb3cgd2UgbXVzdCBoYXZlIGEgcGF0aCBzZXBhcmF0b3IsIG9yIHRoZSBwYXRobmFtZSBpcyBiYWQgKi8KIAotCQlpZiAoIWFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IgKCpleHRlcm5hbF9uYW1lKSAmJgotCQkJKCpleHRlcm5hbF9uYW1lICE9IDApKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlpZiAoIWFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IoKmV4dGVybmFsX25hbWUpICYmCisJCSAgICAoKmV4dGVybmFsX25hbWUgIT0gMCkpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAkJfQogCiAJCS8qIE1vdmUgb24gdGhlIG5leHQgc2VnbWVudCAqLwpAQCAtNDk1LDE4ICs0NDcsMTcgQEAKIAkqcmVzdWx0ID0gMDsKIAogCWlmIChpbmZvLT5mdWxseV9xdWFsaWZpZWQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIlJldHVybmluZyBbJXBdIChhYnMpIFwiXFwlc1wiXG4iLAotCQkJaW50ZXJuYWxfbmFtZSwgaW50ZXJuYWxfbmFtZSkpOwotCX0KLQllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIlJldHVybmluZyBbJXBdIChyZWwpIFwiJXNcIlxuIiwKLQkJCWludGVybmFsX25hbWUsIGludGVybmFsX25hbWUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIlJldHVybmluZyBbJXBdIChhYnMpIFwiXFwlc1wiXG4iLAorCQkJCSAgaW50ZXJuYWxfbmFtZSwgaW50ZXJuYWxfbmFtZSkpOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlJldHVybmluZyBbJXBdIChyZWwpIFwiJXNcIlxuIiwKKwkJCQkgIGludGVybmFsX25hbWUsIGludGVybmFsX25hbWUpKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfaW50ZXJuYWxpemVfbmFtZQpAQCAtNTIyLDUxICs0NzMsNDMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfbnNfaW50ZXJuYWxpemVfbmFtZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXh0ZXJuYWxfbmFtZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqY29udmVydGVkX25hbWUpCithY3BpX3N0YXR1cyBhY3BpX25zX2ludGVybmFsaXplX25hbWUoY2hhciAqZXh0ZXJuYWxfbmFtZSwgY2hhciAqKmNvbnZlcnRlZF9uYW1lKQogewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmludGVybmFsX25hbWU7Ci0Jc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvICAgICBpbmZvOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWNoYXIgKmludGVybmFsX25hbWU7CisJc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvIGluZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfaW50ZXJuYWxpemVfbmFtZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2ludGVybmFsaXplX25hbWUiKTsKLQotCi0JaWYgKCghZXh0ZXJuYWxfbmFtZSkgICAgIHx8Ci0JCSgqZXh0ZXJuYWxfbmFtZSA9PSAwKSB8fAotCQkoIWNvbnZlcnRlZF9uYW1lKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCWlmICgoIWV4dGVybmFsX25hbWUpIHx8ICgqZXh0ZXJuYWxfbmFtZSA9PSAwKSB8fCAoIWNvbnZlcnRlZF9uYW1lKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIG5ldyBpbnRlcm5hbCBuYW1lICovCiAKIAlpbmZvLmV4dGVybmFsX25hbWUgPSBleHRlcm5hbF9uYW1lOwotCWFjcGlfbnNfZ2V0X2ludGVybmFsX25hbWVfbGVuZ3RoICgmaW5mbyk7CisJYWNwaV9uc19nZXRfaW50ZXJuYWxfbmFtZV9sZW5ndGgoJmluZm8pOwogCiAJLyogV2UgbmVlZCBhIHNlZ21lbnQgdG8gc3RvcmUgdGhlIGludGVybmFsICBuYW1lICovCiAKLQlpbnRlcm5hbF9uYW1lID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChpbmZvLmxlbmd0aCk7CisJaW50ZXJuYWxfbmFtZSA9IEFDUElfTUVNX0NBTExPQ0FURShpbmZvLmxlbmd0aCk7CiAJaWYgKCFpbnRlcm5hbF9uYW1lKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogQnVpbGQgdGhlIG5hbWUgKi8KIAogCWluZm8uaW50ZXJuYWxfbmFtZSA9IGludGVybmFsX25hbWU7Ci0Jc3RhdHVzID0gYWNwaV9uc19idWlsZF9pbnRlcm5hbF9uYW1lICgmaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX01FTV9GUkVFIChpbnRlcm5hbF9uYW1lKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfbnNfYnVpbGRfaW50ZXJuYWxfbmFtZSgmaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfTUVNX0ZSRUUoaW50ZXJuYWxfbmFtZSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCSpjb252ZXJ0ZWRfbmFtZSA9IGludGVybmFsX25hbWU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2V4dGVybmFsaXplX25hbWUKQEAgLTU4NSwyNyArNTI4LDIxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19leHRlcm5hbGl6ZV9uYW1lICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsX25hbWVfbGVuZ3RoLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmludGVybmFsX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udmVydGVkX25hbWVfbGVuZ3RoLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipjb252ZXJ0ZWRfbmFtZSkKK2FjcGlfbnNfZXh0ZXJuYWxpemVfbmFtZSh1MzIgaW50ZXJuYWxfbmFtZV9sZW5ndGgsCisJCQkgY2hhciAqaW50ZXJuYWxfbmFtZSwKKwkJCSB1MzIgKiBjb252ZXJ0ZWRfbmFtZV9sZW5ndGgsIGNoYXIgKipjb252ZXJ0ZWRfbmFtZSkKIHsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIG5hbWVzX2luZGV4ID0gMDsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIG51bV9zZWdtZW50cyA9IDA7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICByZXF1aXJlZF9sZW5ndGg7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBwcmVmaXhfbGVuZ3RoID0gMDsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGkgPSAwOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaiA9IDA7CisJYWNwaV9uYXRpdmVfdWludCBuYW1lc19pbmRleCA9IDA7CisJYWNwaV9uYXRpdmVfdWludCBudW1fc2VnbWVudHMgPSAwOworCWFjcGlfbmF0aXZlX3VpbnQgcmVxdWlyZWRfbGVuZ3RoOworCWFjcGlfbmF0aXZlX3VpbnQgcHJlZml4X2xlbmd0aCA9IDA7CisJYWNwaV9uYXRpdmVfdWludCBpID0gMDsKKwlhY3BpX25hdGl2ZV91aW50IGogPSAwOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZXh0ZXJuYWxpemVfbmFtZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2V4dGVybmFsaXplX25hbWUiKTsKLQotCi0JaWYgKCFpbnRlcm5hbF9uYW1lX2xlbmd0aCAgIHx8Ci0JCSFpbnRlcm5hbF9uYW1lICAgICAgICAgIHx8Ci0JCSFjb252ZXJ0ZWRfbmFtZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCWlmICghaW50ZXJuYWxfbmFtZV9sZW5ndGggfHwgIWludGVybmFsX25hbWUgfHwgIWNvbnZlcnRlZF9uYW1lKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKgpAQCAtNjIwLDggKzU1Nyw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBpbnRlcm5hbF9uYW1lX2xlbmd0aDsgaSsrKSB7CiAJCQlpZiAoaW50ZXJuYWxfbmFtZVtpXSA9PSAnXicpIHsKIAkJCQlwcmVmaXhfbGVuZ3RoID0gaSArIDE7Ci0JCQl9Ci0JCQllbHNlIHsKKwkJCX0gZWxzZSB7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTY0OCw3ICs1ODQsOCBAQAogCiAJCQluYW1lc19pbmRleCA9IHByZWZpeF9sZW5ndGggKyAyOwogCQkJbnVtX3NlZ21lbnRzID0gKGFjcGlfbmF0aXZlX3VpbnQpICh1OCkKLQkJCQkJICAgaW50ZXJuYWxfbmFtZVsoYWNwaV9uYXRpdmVfdWludCkgKHByZWZpeF9sZW5ndGggKyAxKV07CisJCQkgICAgaW50ZXJuYWxfbmFtZVsoYWNwaV9uYXRpdmVfdWludCkKKwkJCQkJICAocHJlZml4X2xlbmd0aCArIDEpXTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQU1MX0RVQUxfTkFNRV9QUkVGSVg6CkBAIC02ODMsMjMgKzYyMCwyMyBAQAogCSAqIHB1bmN0dWF0aW9uICgnLicpIGJldHdlZW4gb2JqZWN0IG5hbWVzLCBwbHVzIHRoZSBOVUxMIHRlcm1pbmF0b3IuCiAJICovCiAJcmVxdWlyZWRfbGVuZ3RoID0gcHJlZml4X2xlbmd0aCArICg0ICogbnVtX3NlZ21lbnRzKSArCi0JCQkgICAoKG51bV9zZWdtZW50cyA+IDApID8gKG51bV9zZWdtZW50cyAtIDEpIDogMCkgKyAxOworCSAgICAoKG51bV9zZWdtZW50cyA+IDApID8gKG51bV9zZWdtZW50cyAtIDEpIDogMCkgKyAxOwogCiAJLyoKIAkgKiBDaGVjayB0byBzZWUgaWYgd2UncmUgc3RpbGwgaW4gYm91bmRzLiAgSWYgbm90LCB0aGVyZSdzIGEgcHJvYmxlbQogCSAqIHdpdGggaW50ZXJuYWxfbmFtZSAoaW52YWxpZCBmb3JtYXQpLgogCSAqLwogCWlmIChyZXF1aXJlZF9sZW5ndGggPiBpbnRlcm5hbF9uYW1lX2xlbmd0aCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJuc19leHRlcm5hbGl6ZV9uYW1lOiBJbnZhbGlkIGludGVybmFsIG5hbWVcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFUSE5BTUUpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIm5zX2V4dGVybmFsaXplX25hbWU6IEludmFsaWQgaW50ZXJuYWwgbmFtZVxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBVEhOQU1FKTsKIAl9CiAKIAkvKgogCSAqIEJ1aWxkIGNvbnZlcnRlZF9uYW1lCiAJICovCi0JKmNvbnZlcnRlZF9uYW1lID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChyZXF1aXJlZF9sZW5ndGgpOworCSpjb252ZXJ0ZWRfbmFtZSA9IEFDUElfTUVNX0NBTExPQ0FURShyZXF1aXJlZF9sZW5ndGgpOwogCWlmICghKCpjb252ZXJ0ZWRfbmFtZSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAlqID0gMDsKQEAgLTcyNSwxMCArNjYyLDkgQEAKIAkJKmNvbnZlcnRlZF9uYW1lX2xlbmd0aCA9ICh1MzIpIHJlcXVpcmVkX2xlbmd0aDsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlCkBAIC03NDUsMTMgKzY4MSwxMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSkKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShhY3BpX2hhbmRsZSBoYW5kbGUpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyoKIAkgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24uCkBAIC03NjYsMTQgKzY5OSwxMyBAQAogCiAJLyogV2UgY2FuIGF0IGxlYXN0IGF0dGVtcHQgdG8gdmVyaWZ5IHRoZSBoYW5kbGUgKi8KIAotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKGhhbmRsZSkgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKGhhbmRsZSkgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAKLQlyZXR1cm4gKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBoYW5kbGUpOworCXJldHVybiAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopaGFuZGxlKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlCkBAIC03ODYsMTggKzcxOCwxNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfaGFuZGxlCi1hY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAqbm9kZSkKK2FjcGlfaGFuZGxlIGFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCiB7CiAKLQogCS8qCiAJICogU2ltcGxlIGltcGxlbWVudGF0aW9uIGZvciBub3c7CiAJICovCiAJcmV0dXJuICgoYWNwaV9oYW5kbGUpIG5vZGUpOwogCi0KIC8qIEV4YW1wbGUgZnV0dXJlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAJaWYgKCFOb2RlKQpAQCAtODEwLDEyICs3MzgsMTAgQEAKIAkJcmV0dXJuIChBQ1BJX1JPT1RfT0JKRUNUKTsKIAl9CiAKLQogCXJldHVybiAoKGFjcGlfaGFuZGxlKSBOb2RlKTsKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc190ZXJtaW5hdGUKQEAgLTgyOCw0MiArNzU0LDM3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9uc190ZXJtaW5hdGUgKAotCXZvaWQpCit2b2lkIGFjcGlfbnNfdGVybWluYXRlKHZvaWQpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc190ZXJtaW5hdGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX3Rlcm1pbmF0ZSIpOwogCiAJLyoKIAkgKiAxKSBGcmVlIHRoZSBlbnRpcmUgbmFtZXNwYWNlIC0tIGFsbCBub2RlcyBhbmQgb2JqZWN0cwogCSAqCiAJICogRGVsZXRlIGFsbCBvYmplY3QgZGVzY3JpcHRvcnMgYXR0YWNoZWQgdG8gbmFtZXBzYWNlIG5vZGVzCiAJICovCi0JYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUgKGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUoYWNwaV9nYmxfcm9vdF9ub2RlKTsKIAogCS8qIERldGFjaCBhbnkgb2JqZWN0cyBhdHRhY2hlZCB0byB0aGUgcm9vdCAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoYWNwaV9nYmxfcm9vdF9ub2RlKTsKIAlpZiAob2JqX2Rlc2MpIHsKLQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0IChhY3BpX2dibF9yb290X25vZGUpOworCQlhY3BpX25zX2RldGFjaF9vYmplY3QoYWNwaV9nYmxfcm9vdF9ub2RlKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiTmFtZXNwYWNlIGZyZWVkXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTmFtZXNwYWNlIGZyZWVkXG4iKSk7CiAKIAkvKgogCSAqIDIpIE5vdyB3ZSBjYW4gZGVsZXRlIHRoZSBBQ1BJIHRhYmxlcwogCSAqLwotCWFjcGlfdGJfZGVsZXRlX2FsbF90YWJsZXMgKCk7Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIkFDUEkgVGFibGVzIGZyZWVkXG4iKSk7CisJYWNwaV90Yl9kZWxldGVfYWxsX3RhYmxlcygpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkFDUEkgVGFibGVzIGZyZWVkXG4iKSk7CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX29wZW5zX3Njb3BlCkBAIC04NzUsMjQgKzc5NiwyMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXUzMgotYWNwaV9uc19vcGVuc19zY29wZSAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlKQordTMyIGFjcGlfbnNfb3BlbnNfc2NvcGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlKQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgibnNfb3BlbnNfc2NvcGUiLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKHR5cGUpKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigibnNfb3BlbnNfc2NvcGUiLCBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpOwogCi0KLQlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUgKHR5cGUpKSB7CisJaWYgKCFhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlKHR5cGUpKSB7CiAJCS8qIHR5cGUgY29kZSBvdXQgb2YgcmFuZ2UgICovCiAKLQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJuc19vcGVuc19zY29wZTogSW52YWxpZCBPYmplY3QgVHlwZSAlWFxuIiwgdHlwZSkpOwotCQlyZXR1cm5fVkFMVUUgKEFDUElfTlNfTk9STUFMKTsKKwkJQUNQSV9SRVBPUlRfV0FSTklORygoIm5zX29wZW5zX3Njb3BlOiBJbnZhbGlkIE9iamVjdCBUeXBlICVYXG4iLAorCQkJCSAgICAgdHlwZSkpOworCQlyZXR1cm5fVkFMVUUoQUNQSV9OU19OT1JNQUwpOwogCX0KIAotCXJldHVybl9WQUxVRSAoKCh1MzIpIGFjcGlfZ2JsX25zX3Byb3BlcnRpZXNbdHlwZV0pICYgQUNQSV9OU19ORVdTQ09QRSk7CisJcmV0dXJuX1ZBTFVFKCgodTMyKSBhY3BpX2dibF9uc19wcm9wZXJ0aWVzW3R5cGVdKSAmIEFDUElfTlNfTkVXU0NPUEUpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aApAQCAtOTE2LDMzICs4MzQsMjkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2dldF9ub2RlX2J5X3BhdGggKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGhuYW1lLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnN0YXJ0X25vZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqcmV0dXJuX25vZGUpCithY3BpX25zX2dldF9ub2RlX2J5X3BhdGgoY2hhciAqcGF0aG5hbWUsCisJCQkgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGUsCisJCQkgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgc2NvcGVfaW5mbzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnRlcm5hbF9wYXRoID0gTlVMTDsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgc2NvcGVfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJY2hhciAqaW50ZXJuYWxfcGF0aCA9IE5VTEw7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgibnNfZ2V0X25vZGVfYnlfcGF0aCIsIHBhdGhuYW1lKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJuc19nZXRfbm9kZV9ieV9wYXRoIiwgcGF0aG5hbWUpOwogCiAJaWYgKHBhdGhuYW1lKSB7CiAJCS8qIENvbnZlcnQgcGF0aCB0byBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAqLwogCi0JCXN0YXR1cyA9IGFjcGlfbnNfaW50ZXJuYWxpemVfbmFtZSAocGF0aG5hbWUsICZpbnRlcm5hbF9wYXRoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX25zX2ludGVybmFsaXplX25hbWUocGF0aG5hbWUsICZpbnRlcm5hbF9wYXRoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIE11c3QgbG9jayBuYW1lc3BhY2UgZHVyaW5nIGxvb2t1cCAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIApAQCAtOTUyLDI1ICs4NjYsMjUgQEAKIAogCS8qIExvb2t1cCB0aGUgbmFtZSBpbiB0aGUgbmFtZXNwYWNlICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAoJnNjb3BlX2luZm8sIGludGVybmFsX3BhdGgsCi0JCQkgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJIChmbGFncyB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFKSwKLQkJCSBOVUxMLCByZXR1cm5fbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiJXMsICVzXG4iLAotCQkJCWludGVybmFsX3BhdGgsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwKCZzY29wZV9pbmZvLCBpbnRlcm5hbF9wYXRoLAorCQkJCUFDUElfVFlQRV9BTlksIEFDUElfSU1PREVfRVhFQ1VURSwKKwkJCQkoZmxhZ3MgfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSksCisJCQkJTlVMTCwgcmV0dXJuX25vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICIlcywgJXNcbiIsCisJCQkJICBpbnRlcm5hbF9wYXRoLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAlpZiAoaW50ZXJuYWxfcGF0aCkgewotCQlBQ1BJX01FTV9GUkVFIChpbnRlcm5hbF9wYXRoKTsKKwkJQUNQSV9NRU1fRlJFRShpbnRlcm5hbF9wYXRoKTsKIAl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlCkBAIC05ODMsMTIgKzg5NywxMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQorc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICAgKm5vZGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWlmICghbm9kZSkgewogCQlyZXR1cm4gKE5VTEwpOwpAQCAtMTAwNiw3ICs5MTgsNiBAQAogCXJldHVybiAobm9kZS0+cGVlcik7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlCkBAIC0xMDIxLDkgKzkzMiw5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgotYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQorc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZShzdHJ1Y3QKKwkJCQkJCQlhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkJKm5vZGUpCiB7CiAKIAkvKiBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGlzIHBlZXIgbGlzdCwgcmV0dXJuIE5VTEwgKi8KQEAgLTEwMzcsNyArOTQ4LDYgQEAKIAlyZXR1cm4gKG5vZGUtPnBlZXIpOwogfQogCi0KICNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMDUzLDM4ICs5NjMsMzYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX25hbWUKLWFjcGlfbnNfZmluZF9wYXJlbnRfbmFtZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqY2hpbGRfbm9kZSkKK2FjcGlfbmFtZSBhY3BpX25zX2ZpbmRfcGFyZW50X25hbWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBjaGlsZF9ub2RlKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2ZpbmRfcGFyZW50X25hbWUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2ZpbmRfcGFyZW50X25hbWUiKTsKIAogCWlmIChjaGlsZF9ub2RlKSB7CiAJCS8qIFZhbGlkIGVudHJ5LiAgR2V0IHRoZSBwYXJlbnQgTm9kZSAqLwogCi0JCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKGNoaWxkX25vZGUpOworCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKGNoaWxkX25vZGUpOwogCQlpZiAocGFyZW50X25vZGUpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkJIlBhcmVudCBvZiAlcCBbJTQuNHNdIGlzICVwIFslNC40c11cbiIsCi0JCQkJY2hpbGRfbm9kZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChjaGlsZF9ub2RlKSwKLQkJCQlwYXJlbnRfbm9kZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChwYXJlbnRfbm9kZSkpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkJICAiUGFyZW50IG9mICVwIFslNC40c10gaXMgJXAgWyU0LjRzXVxuIiwKKwkJCQkJICBjaGlsZF9ub2RlLAorCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShjaGlsZF9ub2RlKSwKKwkJCQkJICBwYXJlbnRfbm9kZSwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocGFyZW50X25vZGUpKSk7CiAKIAkJCWlmIChwYXJlbnRfbm9kZS0+bmFtZS5pbnRlZ2VyKSB7Ci0JCQkJcmV0dXJuX1ZBTFVFICgoYWNwaV9uYW1lKSBwYXJlbnRfbm9kZS0+bmFtZS5pbnRlZ2VyKTsKKwkJCQlyZXR1cm5fVkFMVUUoKGFjcGlfbmFtZSkgcGFyZW50X25vZGUtPm5hbWUuCisJCQkJCSAgICAgaW50ZWdlcik7CiAJCQl9CiAJCX0KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIlVuYWJsZSB0byBmaW5kIHBhcmVudCBvZiAlcCAoJTQuNHMpXG4iLAotCQkJY2hpbGRfbm9kZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChjaGlsZF9ub2RlKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiVW5hYmxlIHRvIGZpbmQgcGFyZW50IG9mICVwICglNC40cylcbiIsCisJCQkJICBjaGlsZF9ub2RlLAorCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKGNoaWxkX25vZGUpKSk7CiAJfQogCi0JcmV0dXJuX1ZBTFVFIChBQ1BJX1VOS05PV05fTkFNRSk7CisJcmV0dXJuX1ZBTFVFKEFDUElfVU5LTk9XTl9OQU1FKTsKIH0KICNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN3YWxrLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jCmluZGV4IGY5YTcyNzcuLjVmMTY0YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN3YWxrLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3dhbGsuYwpAQCAtNDEsMTQgKzQxLDExIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnN3YWxrIikKLQorQUNQSV9NT0RVTEVfTkFNRSgibnN3YWxrIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02OCwxOCArNjUsMTUgQEAKICAqICAgICAgICAgICAgICB3aXRoaW4gU2NvcGUgaXMgcmV0dXJuZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgotYWNwaV9uc19nZXRfbmV4dF9ub2RlICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X25vZGUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqY2hpbGRfbm9kZSkKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX2dldF9uZXh0X25vZGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkJCQkJICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJICAqcGFyZW50X25vZGUsCisJCQkJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICpjaGlsZF9ub2RlKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5leHRfbm9kZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5leHRfbm9kZSA9IE5VTEw7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAlpZiAoIWNoaWxkX25vZGUpIHsKIAkJLyogSXQncyByZWFsbHkgdGhlIHBhcmVudCdzIF9zY29wZV8gdGhhdCB3ZSB3YW50ICovCkBAIC05Miw3ICs4Niw3IEBACiAJZWxzZSB7CiAJCS8qIFN0YXJ0IHNlYXJjaCBhdCB0aGUgTkVYVCBub2RlICovCiAKLQkJbmV4dF9ub2RlID0gYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlIChjaGlsZF9ub2RlKTsKKwkJbmV4dF9ub2RlID0gYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlKGNoaWxkX25vZGUpOwogCX0KIAogCS8qIElmIGFueSB0eXBlIGlzIE9LLCB3ZSBhcmUgZG9uZSAqLwpAQCAtMTE0LDcgKzEwOCw3IEBACiAKIAkJLyogT3RoZXJ3aXNlLCBtb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGUgKi8KIAotCQluZXh0X25vZGUgPSBhY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUgKG5leHRfbm9kZSk7CisJCW5leHRfbm9kZSA9IGFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZShuZXh0X25vZGUpOwogCX0KIAogCS8qIE5vdCBmb3VuZCAqLwpAQCAtMTIyLDcgKzExNiw2IEBACiAJcmV0dXJuIChOVUxMKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3dhbGtfbmFtZXNwYWNlCkBAIC0xNTQsMjUgKzE0NywyMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X25vZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGVwdGgsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxvY2tfYmVmb3JlX2NhbGxiYWNrLAotCWFjcGlfd2Fsa19jYWxsYmFjayAgICAgICAgICAgICAgdXNlcl9mdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpCithY3BpX25zX3dhbGtfbmFtZXNwYWNlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJICAgICAgIGFjcGlfaGFuZGxlIHN0YXJ0X25vZGUsCisJCSAgICAgICB1MzIgbWF4X2RlcHRoLAorCQkgICAgICAgdTggdW5sb2NrX2JlZm9yZV9jYWxsYmFjaywKKwkJICAgICAgIGFjcGlfd2Fsa19jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLAorCQkgICAgICAgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIG11dGV4X3N0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpjaGlsZF9ub2RlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlOwotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgY2hpbGRfdHlwZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBtdXRleF9zdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkX25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOworCWFjcGlfb2JqZWN0X3R5cGUgY2hpbGRfdHlwZTsKKwl1MzIgbGV2ZWw7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc193YWxrX25hbWVzcGFjZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfd2Fsa19uYW1lc3BhY2UiKTsKIAogCS8qIFNwZWNpYWwgY2FzZSBmb3IgdGhlIG5hbWVzcGFjZSBSb290IE5vZGUgKi8KIApAQCAtMTgzLDkgKzE3Miw5IEBACiAJLyogTnVsbCBjaGlsZCBtZWFucyAiZ2V0IGZpcnN0IG5vZGUiICovCiAKIAlwYXJlbnRfbm9kZSA9IHN0YXJ0X25vZGU7Ci0JY2hpbGRfbm9kZSAgPSBOVUxMOwotCWNoaWxkX3R5cGUgID0gQUNQSV9UWVBFX0FOWTsKLQlsZXZlbCAgICAgICA9IDE7CisJY2hpbGRfbm9kZSA9IE5VTEw7CisJY2hpbGRfdHlwZSA9IEFDUElfVFlQRV9BTlk7CisJbGV2ZWwgPSAxOwogCiAJLyoKIAkgKiBUcmF2ZXJzZSB0aGUgdHJlZSBvZiBub2RlcyB1bnRpbCB3ZSBidWJibGUgYmFjayB1cCB0byB3aGVyZSB3ZQpAQCAtMTk2LDcgKzE4NSw5IEBACiAJCS8qIEdldCB0aGUgbmV4dCBub2RlIGluIHRoaXMgc2NvcGUuICBOdWxsIGlmIG5vdCBmb3VuZCAqLwogCiAJCXN0YXR1cyA9IEFFX09LOwotCQljaGlsZF9ub2RlID0gYWNwaV9uc19nZXRfbmV4dF9ub2RlIChBQ1BJX1RZUEVfQU5ZLCBwYXJlbnRfbm9kZSwgY2hpbGRfbm9kZSk7CisJCWNoaWxkX25vZGUgPQorCQkgICAgYWNwaV9uc19nZXRfbmV4dF9ub2RlKEFDUElfVFlQRV9BTlksIHBhcmVudF9ub2RlLAorCQkJCQkgIGNoaWxkX25vZGUpOwogCQlpZiAoY2hpbGRfbm9kZSkgewogCQkJLyoKIAkJCSAqIEZvdW5kIG5vZGUsIEdldCB0aGUgdHlwZSBpZiB3ZSBhcmUgbm90CkBAIC0yMTIsMTkgKzIwMywyNSBAQAogCQkJCSAqIGNhbGxiYWNrIGZ1bmN0aW9uCiAJCQkJICovCiAJCQkJaWYgKHVubG9ja19iZWZvcmVfY2FsbGJhY2spIHsKLQkJCQkJbXV0ZXhfc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFIChtdXRleF9zdGF0dXMpKSB7Ci0JCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKG11dGV4X3N0YXR1cyk7CisJCQkJCW11dGV4X3N0YXR1cyA9CisJCQkJCSAgICBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgKKwkJCQkJICAgIChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQkJCQlpZiAoQUNQSV9GQUlMVVJFKG11dGV4X3N0YXR1cykpIHsKKwkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUworCQkJCQkJICAgIChtdXRleF9zdGF0dXMpOwogCQkJCQl9CiAJCQkJfQogCi0JCQkJc3RhdHVzID0gdXNlcl9mdW5jdGlvbiAoY2hpbGRfbm9kZSwgbGV2ZWwsCi0JCQkJCQkgY29udGV4dCwgcmV0dXJuX3ZhbHVlKTsKKwkJCQlzdGF0dXMgPSB1c2VyX2Z1bmN0aW9uKGNoaWxkX25vZGUsIGxldmVsLAorCQkJCQkJICAgICAgIGNvbnRleHQsIHJldHVybl92YWx1ZSk7CiAKIAkJCQlpZiAodW5sb2NrX2JlZm9yZV9jYWxsYmFjaykgewotCQkJCQltdXRleF9zdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKG11dGV4X3N0YXR1cykpIHsKLQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAobXV0ZXhfc3RhdHVzKTsKKwkJCQkJbXV0ZXhfc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfdXRfYWNxdWlyZV9tdXRleAorCQkJCQkgICAgKEFDUElfTVRYX05BTUVTUEFDRSk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUobXV0ZXhfc3RhdHVzKSkgeworCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTCisJCQkJCQkgICAgKG11dGV4X3N0YXR1cyk7CiAJCQkJCX0KIAkJCQl9CiAKQEAgLTIzOSwxMyArMjM2LDEzIEBACiAKIAkJCQkJLyogRXhpdCBub3csIHdpdGggT0sgc3RhdHVzICovCiAKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAKIAkJCQlkZWZhdWx0OgogCiAJCQkJCS8qIEFsbCBvdGhlcnMgYXJlIHZhbGlkIGV4Y2VwdGlvbnMgKi8KIAotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJCX0KIAkJCX0KIApAQCAtMjU4LDcgKzI1NSw4IEBACiAJCQkgKiBtYXhpbXVtIGRlcHRoIGhhcyBiZWVuIHJlYWNoZWQuCiAJCQkgKi8KIAkJCWlmICgobGV2ZWwgPCBtYXhfZGVwdGgpICYmIChzdGF0dXMgIT0gQUVfQ1RSTF9ERVBUSCkpIHsKLQkJCQlpZiAoYWNwaV9uc19nZXRfbmV4dF9ub2RlIChBQ1BJX1RZUEVfQU5ZLCBjaGlsZF9ub2RlLCBOVUxMKSkgeworCQkJCWlmIChhY3BpX25zX2dldF9uZXh0X25vZGUKKwkJCQkgICAgKEFDUElfVFlQRV9BTlksIGNoaWxkX25vZGUsIE5VTEwpKSB7CiAJCQkJCS8qCiAJCQkJCSAqIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGlsZCBvZiB0aGlzCiAJCQkJCSAqIG5vZGUsIHZpc2l0IHRoZSBvbmRlCkBAIC0yNjgsOCArMjY2LDcgQEAKIAkJCQkJY2hpbGRfbm9kZSA9IE5VTEw7CiAJCQkJfQogCQkJfQotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIE5vIG1vcmUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIChhY3BpX25zX2dldF9uZXh0X25vZGUKIAkJCSAqIGZhaWxlZCksIGdvIGJhY2sgdXB3YXJkcyBpbiB0aGUgbmFtZXNwYWNlIHRyZWUgdG8KQEAgLTI3NywxMyArMjc0LDExIEBACiAJCQkgKi8KIAkJCWxldmVsLS07CiAJCQljaGlsZF9ub2RlID0gcGFyZW50X25vZGU7Ci0JCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlIChwYXJlbnRfbm9kZSk7CisJCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHBhcmVudF9ub2RlKTsKIAkJfQogCX0KIAogCS8qIENvbXBsZXRlIHdhbGssIG5vdCB0ZXJtaW5hdGVkIGJ5IHVzZXIgZnVuY3Rpb24gKi8KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jCmluZGV4IDEyZWEyMDIuLmMwN2IwNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4ZmV2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMKQEAgLTQ4LDEwICs0OCw4IEBACiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zeGZldmFsIikKLQorQUNQSV9NT0RVTEVfTkFNRSgibnN4ZmV2YWwiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTczLDI3ICs3MSwyMyBAQAogICogICAgICAgICAgICAgIGJlIHZhbGlkIChub24tbnVsbCkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCi1hY3BpX2V2YWx1YXRlX29iamVjdF90eXBlZCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JYWNwaV9zdHJpbmcgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSwKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAgICAgICAgICpleHRlcm5hbF9wYXJhbXMsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0dXJuX2J1ZmZlciwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHJldHVybl90eXBlKQorYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgYWNwaV9zdHJpbmcgcGF0aG5hbWUsCisJCQkgICBzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqZXh0ZXJuYWxfcGFyYW1zLAorCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXR1cm5fYnVmZmVyLAorCQkJICAgYWNwaV9vYmplY3RfdHlwZSByZXR1cm5fdHlwZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3RfZnJlZSA9IEZBTFNFOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1OCBtdXN0X2ZyZWUgPSBGQUxTRTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZXZhbHVhdGVfb2JqZWN0X3R5cGVkIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2V2YWx1YXRlX29iamVjdF90eXBlZCIpOwogCiAJLyogUmV0dXJuIGJ1ZmZlciBtdXN0IGJlIHZhbGlkICovCiAKIAlpZiAoIXJldHVybl9idWZmZXIpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCWlmIChyZXR1cm5fYnVmZmVyLT5sZW5ndGggPT0gQUNQSV9BTExPQ0FURV9CVUZGRVIpIHsKQEAgLTEwMiw1MSArOTYsNTIgQEAKIAogCS8qIEV2YWx1YXRlIHRoZSBvYmplY3QgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0IChoYW5kbGUsIHBhdGhuYW1lLCBleHRlcm5hbF9wYXJhbXMsIHJldHVybl9idWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgcGF0aG5hbWUsIGV4dGVybmFsX3BhcmFtcywKKwkJCQkgcmV0dXJuX2J1ZmZlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFR5cGUgQU5ZIG1lYW5zICJkb24ndCBjYXJlIiAqLwogCiAJaWYgKHJldHVybl90eXBlID09IEFDUElfVFlQRV9BTlkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJaWYgKHJldHVybl9idWZmZXItPmxlbmd0aCA9PSAwKSB7CiAJCS8qIEVycm9yIGJlY2F1c2UgY2FsbGVyIHNwZWNpZmljYWxseSBhc2tlZCBmb3IgYSByZXR1cm4gdmFsdWUgKi8KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJObyByZXR1cm4gdmFsdWVcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIk5vIHJldHVybiB2YWx1ZVxuIikpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTlVMTF9PQkpFQ1QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9PQkpFQ1QpOwogCX0KIAogCS8qIEV4YW1pbmUgdGhlIG9iamVjdCB0eXBlIHJldHVybmVkIGZyb20gZXZhbHVhdGVfb2JqZWN0ICovCiAKLQlpZiAoKCh1bmlvbiBhY3BpX29iamVjdCAqKSByZXR1cm5fYnVmZmVyLT5wb2ludGVyKS0+dHlwZSA9PSByZXR1cm5fdHlwZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlpZiAoKCh1bmlvbiBhY3BpX29iamVjdCAqKXJldHVybl9idWZmZXItPnBvaW50ZXIpLT50eXBlID09IHJldHVybl90eXBlKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogUmV0dXJuIG9iamVjdCB0eXBlIGRvZXMgbm90IG1hdGNoIHJlcXVlc3RlZCB0eXBlICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJIkluY29ycmVjdCByZXR1cm4gdHlwZSBbJXNdIHJlcXVlc3RlZCBbJXNdXG4iLAotCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKCgodW5pb24gYWNwaV9vYmplY3QgKikgcmV0dXJuX2J1ZmZlci0+cG9pbnRlciktPnR5cGUpLAotCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKHJldHVybl90eXBlKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkgICJJbmNvcnJlY3QgcmV0dXJuIHR5cGUgWyVzXSByZXF1ZXN0ZWQgWyVzXVxuIiwKKwkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKCgodW5pb24gYWNwaV9vYmplY3QgKikKKwkJCQkJCSByZXR1cm5fYnVmZmVyLT5wb2ludGVyKS0+dHlwZSksCisJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShyZXR1cm5fdHlwZSkpKTsKIAogCWlmIChtdXN0X2ZyZWUpIHsKIAkJLyogQ2FsbGVyIHVzZWQgQUNQSV9BTExPQ0FURV9CVUZGRVIsIGZyZWUgdGhlIHJldHVybiBidWZmZXIgKi8KIAotCQlhY3BpX29zX2ZyZWUgKHJldHVybl9idWZmZXItPnBvaW50ZXIpOworCQlhY3BpX29zX2ZyZWUocmV0dXJuX2J1ZmZlci0+cG9pbnRlcik7CiAJCXJldHVybl9idWZmZXItPnBvaW50ZXIgPSBOVUxMOwogCX0KIAogCXJldHVybl9idWZmZXItPmxlbmd0aCA9IDA7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9UWVBFKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiB9Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQorI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xNjksMjEgKzE2NCwxOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZhbHVhdGVfb2JqZWN0ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQlhY3BpX3N0cmluZyAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLAotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICAgICAgICAgKmV4dGVybmFsX3BhcmFtcywKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXR1cm5fYnVmZmVyKQorYWNwaV9ldmFsdWF0ZV9vYmplY3QoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkgICAgIGFjcGlfc3RyaW5nIHBhdGhuYW1lLAorCQkgICAgIHN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpleHRlcm5hbF9wYXJhbXMsCisJCSAgICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXR1cm5fYnVmZmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzMjsKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgIGluZm87Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfc3BhY2VfbmVlZGVkOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzMjsKKwlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyBpbmZvOworCWFjcGlfc2l6ZSBidWZmZXJfc3BhY2VfbmVlZGVkOworCXUzMiBpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9ldmFsdWF0ZV9vYmplY3QiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZXZhbHVhdGVfb2JqZWN0Iik7CiAKIAlpbmZvLm5vZGUgPSBoYW5kbGU7CiAJaW5mby5wYXJhbWV0ZXJzID0gTlVMTDsKQEAgLTIwMCwxMSArMTkyLDExIEBACiAJCSAqIEFsbG9jYXRlIGEgbmV3IHBhcmFtZXRlciBibG9jayBmb3IgdGhlIGludGVybmFsIG9iamVjdHMKIAkJICogQWRkIDEgdG8gY291bnQgdG8gYWxsb3cgZm9yIG51bGwgdGVybWluYXRlZCBpbnRlcm5hbCBsaXN0CiAJCSAqLwotCQlpbmZvLnBhcmFtZXRlcnMgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKAotCQkJCSAoKGFjcGlfc2l6ZSkgZXh0ZXJuYWxfcGFyYW1zLT5jb3VudCArIDEpICoKLQkJCQkgc2l6ZW9mICh2b2lkICopKTsKKwkJaW5mby5wYXJhbWV0ZXJzID0gQUNQSV9NRU1fQ0FMTE9DQVRFKCgoYWNwaV9zaXplKQorCQkJCQkJICAgICAgZXh0ZXJuYWxfcGFyYW1zLT5jb3VudCArCisJCQkJCQkgICAgICAxKSAqIHNpemVvZih2b2lkICopKTsKIAkJaWYgKCFpbmZvLnBhcmFtZXRlcnMpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJLyoKQEAgLTIxMiw0OCArMjA0LDQ3IEBACiAJCSAqIGludGVybmFsIG9iamVjdAogCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IGV4dGVybmFsX3BhcmFtcy0+Y291bnQ7IGkrKykgewotCQkJc3RhdHVzID0gYWNwaV91dF9jb3B5X2VvYmplY3RfdG9faW9iamVjdCAoJmV4dGVybmFsX3BhcmFtcy0+cG9pbnRlcltpXSwKLQkJCQkJICAmaW5mby5wYXJhbWV0ZXJzW2ldKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdCAoaW5mby5wYXJhbWV0ZXJzKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfdXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QoJmV4dGVybmFsX3BhcmFtcy0+CisJCQkJCQkJICAgIHBvaW50ZXJbaV0sCisJCQkJCQkJICAgICZpbmZvLgorCQkJCQkJCSAgICBwYXJhbWV0ZXJzW2ldKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0KGluZm8uCisJCQkJCQkJCSAgICBwYXJhbWV0ZXJzKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAkJfQogCQlpbmZvLnBhcmFtZXRlcnNbZXh0ZXJuYWxfcGFyYW1zLT5jb3VudF0gPSBOVUxMOwogCX0KIAotCiAJLyoKIAkgKiBUaHJlZSBtYWpvciBjYXNlczoKIAkgKiAxKSBGdWxseSBxdWFsaWZpZWQgcGF0aG5hbWUKIAkgKiAyKSBObyBoYW5kbGUsIG5vdCBmdWxseSBxdWFsaWZpZWQgcGF0aG5hbWUgKGVycm9yKQogCSAqIDMpIFZhbGlkIGhhbmRsZQogCSAqLwotCWlmICgocGF0aG5hbWUpICYmCi0JCShhY3BpX25zX3ZhbGlkX3Jvb3RfcHJlZml4IChwYXRobmFtZVswXSkpKSB7CisJaWYgKChwYXRobmFtZSkgJiYgKGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgocGF0aG5hbWVbMF0pKSkgewogCQkvKgogCQkgKiAgVGhlIHBhdGggaXMgZnVsbHkgcXVhbGlmaWVkLCBqdXN0IGV2YWx1YXRlIGJ5IG5hbWUKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfbmFtZSAocGF0aG5hbWUsICZpbmZvKTsKLQl9Ci0JZWxzZSBpZiAoIWhhbmRsZSkgeworCQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X25hbWUocGF0aG5hbWUsICZpbmZvKTsKKwl9IGVsc2UgaWYgKCFoYW5kbGUpIHsKIAkJLyoKIAkJICogQSBoYW5kbGUgaXMgb3B0aW9uYWwgaWZmIGEgZnVsbHkgcXVhbGlmaWVkIHBhdGhuYW1lCiAJCSAqIGlzIHNwZWNpZmllZC4gIFNpbmNlIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCBmdWxseQogCQkgKiBxdWFsaWZpZWQgbmFtZXMgYWJvdmUsIHRoaXMgaXMgYW4gZXJyb3IKIAkJICovCiAJCWlmICghcGF0aG5hbWUpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJCb3RoIEhhbmRsZSBhbmQgUGF0aG5hbWUgYXJlIE5VTExcbiIpKTsKLQkJfQotCQllbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJIYW5kbGUgaXMgTlVMTCBhbmQgUGF0aG5hbWUgaXMgcmVsYXRpdmVcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkJvdGggSGFuZGxlIGFuZCBQYXRobmFtZSBhcmUgTlVMTFxuIikpOworCQl9IGVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiSGFuZGxlIGlzIE5VTEwgYW5kIFBhdGhuYW1lIGlzIHJlbGF0aXZlXG4iKSk7CiAJCX0KIAogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBXZSBnZXQgaGVyZSBpZiB3ZSBoYXZlIGEgaGFuZGxlIC0tIGFuZCBpZiB3ZSBoYXZlIGEKIAkJICogcGF0aG5hbWUgaXQgaXMgcmVsYXRpdmUuICBUaGUgaGFuZGxlIHdpbGwgYmUgdmFsaWRhdGVkCkBAIC0yNjQsMTcgKzI1NSwxNSBAQAogCQkJICogVGhlIG51bGwgcGF0aG5hbWUgY2FzZSBtZWFucyB0aGUgaGFuZGxlIGlzIGZvcgogCQkJICogdGhlIGFjdHVhbCBvYmplY3QgdG8gYmUgZXZhbHVhdGVkCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlICgmaW5mbyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgIC8qCi0JCQkqIEJvdGggYSBIYW5kbGUgYW5kIGEgcmVsYXRpdmUgUGF0aG5hbWUKLQkJCSovCi0JCQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlIChwYXRobmFtZSwgJmluZm8pOworCQkJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9ieV9oYW5kbGUoJmluZm8pOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEJvdGggYSBIYW5kbGUgYW5kIGEgcmVsYXRpdmUgUGF0aG5hbWUKKwkJCSAqLworCQkJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZShwYXRobmFtZSwgJmluZm8pOwogCQl9CiAJfQogCi0KIAkvKgogCSAqIElmIHdlIGFyZSBleHBlY3RpbmcgYSByZXR1cm4gdmFsdWUsIGFuZCBhbGwgd2VudCB3ZWxsIGFib3ZlLAogCSAqIGNvcHkgdGhlIHJldHVybiB2YWx1ZSB0byBhbiBleHRlcm5hbCBvYmplY3QuCkBAIC0yODIsOSArMjcxLDkgQEAKIAlpZiAocmV0dXJuX2J1ZmZlcikgewogCQlpZiAoIWluZm8ucmV0dXJuX29iamVjdCkgewogCQkJcmV0dXJuX2J1ZmZlci0+bGVuZ3RoID0gMDsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKGluZm8ucmV0dXJuX29iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJfSBlbHNlIHsKKwkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoaW5mby5yZXR1cm5fb2JqZWN0KSA9PQorCQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CiAJCQkJLyoKIAkJCQkgKiBJZiB3ZSByZWNlaXZlZCBhIE5TIE5vZGUgYXMgYSByZXR1cm4gb2JqZWN0LCB0aGlzIG1lYW5zIHRoYXQKIAkJCQkgKiB0aGUgb2JqZWN0IHdlIGFyZSBldmFsdWF0aW5nIGhhcyBub3RoaW5nIGludGVyZXN0aW5nIHRvCkBAIC0yOTQsMzcgKzI4Myw0MyBAQAogCQkJCSAqIHN1cHBvcnQgZm9yIHZhcmlvdXMgdHlwZXMgYXQgYSBsYXRlciBkYXRlIGlmIG5lY2Vzc2FyeS4KIAkJCQkgKi8KIAkJCQlzdGF0dXMgPSBBRV9UWVBFOwotCQkJCWluZm8ucmV0dXJuX29iamVjdCA9IE5VTEw7ICAvKiBObyBuZWVkIHRvIGRlbGV0ZSBhIE5TIE5vZGUgKi8KKwkJCQlpbmZvLnJldHVybl9vYmplY3QgPSBOVUxMOwkvKiBObyBuZWVkIHRvIGRlbGV0ZSBhIE5TIE5vZGUgKi8KIAkJCQlyZXR1cm5fYnVmZmVyLT5sZW5ndGggPSAwOwogCQkJfQogCi0JCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCQkvKgogCQkJCSAqIEZpbmQgb3V0IGhvdyBsYXJnZSBhIGJ1ZmZlciBpcyBuZWVkZWQKIAkJCQkgKiB0byBjb250YWluIHRoZSByZXR1cm5lZCBvYmplY3QKIAkJCQkgKi8KLQkJCQlzdGF0dXMgPSBhY3BpX3V0X2dldF9vYmplY3Rfc2l6ZSAoaW5mby5yZXR1cm5fb2JqZWN0LAotCQkJCQkJICAgJmJ1ZmZlcl9zcGFjZV9uZWVkZWQpOwotCQkJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3Rfc2l6ZShpbmZvLnJldHVybl9vYmplY3QsCisJCQkJCQkJICAgICZidWZmZXJfc3BhY2VfbmVlZGVkKTsKKwkJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCQkJLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLwogCi0JCQkJCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIgKHJldHVybl9idWZmZXIsCi0JCQkJCQkJICBidWZmZXJfc3BhY2VfbmVlZGVkKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcgorCQkJCQkgICAgKHJldHVybl9idWZmZXIsCisJCQkJCSAgICAgYnVmZmVyX3NwYWNlX25lZWRlZCk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCQkJLyoKIAkJCQkJCSAqIENhbGxlcidzIGJ1ZmZlciBpcyB0b28gc21hbGwgb3IgYSBuZXcgb25lIGNhbid0IGJlIGFsbG9jYXRlZAogCQkJCQkJICovCi0JCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJCQkJCSJOZWVkZWQgYnVmZmVyIHNpemUgJVgsICVzXG4iLAotCQkJCQkJCSh1MzIpIGJ1ZmZlcl9zcGFjZV9uZWVkZWQsCi0JCQkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7CisJCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCQkJCSAgIk5lZWRlZCBidWZmZXIgc2l6ZSAlWCwgJXNcbiIsCisJCQkJCQkJCSAgKHUzMikKKwkJCQkJCQkJICBidWZmZXJfc3BhY2VfbmVlZGVkLAorCQkJCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbgorCQkJCQkJCQkgIChzdGF0dXMpKSk7CisJCQkJCX0gZWxzZSB7CiAJCQkJCQkvKgogCQkJCQkJICogIFdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgb2JqZWN0LCBidWlsZCBpdAogCQkJCQkJICovCi0JCQkJCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0IChpbmZvLnJldHVybl9vYmplY3QsCi0JCQkJCQkJCSAgcmV0dXJuX2J1ZmZlcik7CisJCQkJCQlzdGF0dXMgPQorCQkJCQkJICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2VvYmplY3QKKwkJCQkJCSAgICAoaW5mby5yZXR1cm5fb2JqZWN0LAorCQkJCQkJICAgICByZXR1cm5fYnVmZmVyKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTMzNiwxNCArMzMxLDE0IEBACiAJCSAqIERlbGV0ZSB0aGUgaW50ZXJuYWwgcmV0dXJuIG9iamVjdC4gIE5PVEU6IEludGVycHJldGVyCiAJCSAqIG11c3QgYmUgbG9ja2VkIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uLgogCQkgKi8KLQkJc3RhdHVzMiA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIgKCk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1czIpKSB7CisJCXN0YXR1czIgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzMikpIHsKIAkJCS8qCiAJCQkgKiBEZWxldGUgdGhlIGludGVybmFsIHJldHVybiBvYmplY3QuIChPciBhdCBsZWFzdAogCQkJICogZGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgYnkgb25lKQogCQkJICovCi0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGluZm8ucmV0dXJuX29iamVjdCk7Ci0JCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIgKCk7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaW5mby5yZXR1cm5fb2JqZWN0KTsKKwkJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwogCQl9CiAJfQogCkBAIC0zNTMsMTMgKzM0OCwxMyBAQAogCWlmIChpbmZvLnBhcmFtZXRlcnMpIHsKIAkJLyogRnJlZSB0aGUgYWxsb2NhdGVkIHBhcmFtZXRlciBibG9jayAqLwogCi0JCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0IChpbmZvLnBhcmFtZXRlcnMpOworCQlhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdChpbmZvLnBhcmFtZXRlcnMpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9ldmFsdWF0ZV9vYmplY3QpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfZXZhbHVhdGVfb2JqZWN0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0zOTIsMjYgKzM4NywyMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfd2Fsa19uYW1lc3BhY2UgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X29iamVjdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXB0aCwKLQlhY3BpX3dhbGtfY2FsbGJhY2sgICAgICAgICAgICAgIHVzZXJfZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKQorYWNwaV93YWxrX25hbWVzcGFjZShhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCSAgICBhY3BpX2hhbmRsZSBzdGFydF9vYmplY3QsCisJCSAgICB1MzIgbWF4X2RlcHRoLAorCQkgICAgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCisJCSAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfd2Fsa19uYW1lc3BhY2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfd2Fsa19uYW1lc3BhY2UiKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKLQlpZiAoKHR5cGUgPiBBQ1BJX1RZUEVfRVhURVJOQUxfTUFYKSB8fAotCQkoIW1heF9kZXB0aCkgICAgICAgICAgICAgICAgICAgIHx8Ci0JCSghdXNlcl9mdW5jdGlvbikpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwlpZiAoKHR5cGUgPiBBQ1BJX1RZUEVfRVhURVJOQUxfTUFYKSB8fCAoIW1heF9kZXB0aCkgfHwgKCF1c2VyX2Z1bmN0aW9uKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyoKQEAgLTQyMCwyMCArNDA5LDIwIEBACiAJICogdG8gdGhlIHVzZXIgZnVuY3Rpb24gLSBzaW5jZSB0aGlzIGZ1bmN0aW9uCiAJICogbXVzdCBiZSBhbGxvd2VkIHRvIG1ha2UgQWNwaSBjYWxscyBpdHNlbGYuCiAJICovCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlICh0eXBlLCBzdGFydF9vYmplY3QsIG1heF9kZXB0aCwKLQkJCSAgQUNQSV9OU19XQUxLX1VOTE9DSywKLQkJCSAgdXNlcl9mdW5jdGlvbiwgY29udGV4dCwgcmV0dXJuX3ZhbHVlKTsKKwlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKHR5cGUsIHN0YXJ0X29iamVjdCwgbWF4X2RlcHRoLAorCQkJCQlBQ1BJX05TX1dBTEtfVU5MT0NLLAorCQkJCQl1c2VyX2Z1bmN0aW9uLCBjb250ZXh0LCByZXR1cm5fdmFsdWUpOwogCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfd2Fsa19uYW1lc3BhY2UpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfd2Fsa19uYW1lc3BhY2UpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTQ1MCwyOSArNDM5LDI2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfZ2V0X2RldmljZV9jYWxsYmFjayAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpCithY3BpX25zX2dldF9kZXZpY2VfY2FsbGJhY2soYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCSAgICB1MzIgbmVzdGluZ19sZXZlbCwKKwkJCSAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQogewotCXN0cnVjdCBhY3BpX2dldF9kZXZpY2VzX2luZm8gICAgKmluZm8gPSBjb250ZXh0OwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgICAgICAgICAgIGhpZDsKKwlzdHJ1Y3QgYWNwaV9nZXRfZGV2aWNlc19pbmZvICppbmZvID0gY29udGV4dDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdTMyIGZsYWdzOworCXN0cnVjdCBhY3BpX2RldmljZV9pZCBoaWQ7CiAJc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICpjaWQ7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOworCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KIAotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAob2JqX2hhbmRsZSk7Ci0Jc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7CisJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybiAoc3RhdHVzKTsKIAl9CiAKQEAgLTQ4Miw4ICs0NjgsOCBAQAogCiAJLyogUnVuIF9TVEEgdG8gZGV0ZXJtaW5lIGlmIGRldmljZSBpcyBwcmVzZW50ICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfU1RBIChub2RlLCAmZmxhZ3MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfU1RBKG5vZGUsICZmbGFncyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybiAoQUVfQ1RSTF9ERVBUSCk7CiAJfQogCkBAIC00OTYsNDQgKzQ4Miw0MyBAQAogCS8qIEZpbHRlciBiYXNlZCBvbiBkZXZpY2UgSElEICYgQ0lEICovCiAKIAlpZiAoaW5mby0+aGlkICE9IE5VTEwpIHsKLQkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0hJRCAobm9kZSwgJmhpZCk7CisJCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9ISUQobm9kZSwgJmhpZCk7CiAJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CiAJCQlyZXR1cm4gKEFFX09LKTsKLQkJfQotCQllbHNlIGlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJfSBlbHNlIGlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuIChBRV9DVFJMX0RFUFRIKTsKIAkJfQogCi0JCWlmIChBQ1BJX1NUUk5DTVAgKGhpZC52YWx1ZSwgaW5mby0+aGlkLCBzaXplb2YgKGhpZC52YWx1ZSkpICE9IDApIHsKKwkJaWYgKEFDUElfU1RSTkNNUChoaWQudmFsdWUsIGluZm8tPmhpZCwgc2l6ZW9mKGhpZC52YWx1ZSkpICE9IDApIHsKIAkJCS8qIEdldCB0aGUgbGlzdCBvZiBDb21wYXRpYmxlIElEcyAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfQ0lEIChub2RlLCAmY2lkKTsKKwkJCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9DSUQobm9kZSwgJmNpZCk7CiAJCQlpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkgewogCQkJCXJldHVybiAoQUVfT0spOwotCQkJfQotCQkJZWxzZSBpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQl9IGVsc2UgaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJcmV0dXJuIChBRV9DVFJMX0RFUFRIKTsKIAkJCX0KIAogCQkJLyogV2FsayB0aGUgQ0lEIGxpc3QgKi8KIAogCQkJZm9yIChpID0gMDsgaSA8IGNpZC0+Y291bnQ7IGkrKykgewotCQkJCWlmIChBQ1BJX1NUUk5DTVAgKGNpZC0+aWRbaV0udmFsdWUsIGluZm8tPmhpZCwKLQkJCQkJCSBzaXplb2YgKHN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWQpKSAhPSAwKSB7Ci0JCQkJCUFDUElfTUVNX0ZSRUUgKGNpZCk7CisJCQkJaWYgKEFDUElfU1RSTkNNUChjaWQtPmlkW2ldLnZhbHVlLCBpbmZvLT5oaWQsCisJCQkJCQkgc2l6ZW9mKHN0cnVjdAorCQkJCQkJCWFjcGlfY29tcGF0aWJsZV9pZCkpICE9CisJCQkJICAgIDApIHsKKwkJCQkJQUNQSV9NRU1fRlJFRShjaWQpOwogCQkJCQlyZXR1cm4gKEFFX09LKTsKIAkJCQl9CiAJCQl9Ci0JCQlBQ1BJX01FTV9GUkVFIChjaWQpOworCQkJQUNQSV9NRU1fRlJFRShjaWQpOwogCQl9CiAJfQogCi0Jc3RhdHVzID0gaW5mby0+dXNlcl9mdW5jdGlvbiAob2JqX2hhbmRsZSwgbmVzdGluZ19sZXZlbCwgaW5mby0+Y29udGV4dCwKLQkJCSByZXR1cm5fdmFsdWUpOworCXN0YXR1cyA9IGluZm8tPnVzZXJfZnVuY3Rpb24ob2JqX2hhbmRsZSwgbmVzdGluZ19sZXZlbCwgaW5mby0+Y29udGV4dCwKKwkJCQkgICAgIHJldHVybl92YWx1ZSk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2RldmljZXMKQEAgLTU2MCwzMiArNTQ1LDI4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfZGV2aWNlcyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqSElELAotCWFjcGlfd2Fsa19jYWxsYmFjayAgICAgICAgICAgICAgdXNlcl9mdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpCithY3BpX2dldF9kZXZpY2VzKGNoYXIgKkhJRCwKKwkJIGFjcGlfd2Fsa19jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLAorCQkgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9nZXRfZGV2aWNlc19pbmZvICAgIGluZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2dldF9kZXZpY2VzX2luZm8gaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X2RldmljZXMiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X2RldmljZXMiKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKIAlpZiAoIXVzZXJfZnVuY3Rpb24pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qCiAJICogV2UncmUgZ29pbmcgdG8gY2FsbCB0aGVpciBjYWxsYmFjayBmcm9tIE9VUiBjYWxsYmFjaywgc28gd2UgbmVlZAogCSAqIHRvIGtub3cgd2hhdCBpdCBpcywgYW5kIHRoZWlyIGNvbnRleHQgcGFyYW1ldGVyLgogCSAqLwotCWluZm8uY29udGV4dCAgICAgID0gY29udGV4dDsKKwlpbmZvLmNvbnRleHQgPSBjb250ZXh0OwogCWluZm8udXNlcl9mdW5jdGlvbiA9IHVzZXJfZnVuY3Rpb247Ci0JaW5mby5oaWQgICAgICAgICAgPSBISUQ7CisJaW5mby5oaWQgPSBISUQ7CiAKIAkvKgogCSAqIExvY2sgdGhlIG5hbWVzcGFjZSBhcm91bmQgdGhlIHdhbGsuCkBAIC01OTMsMjIgKzU3NCwyMiBAQAogCSAqIHRvIHRoZSB1c2VyIGZ1bmN0aW9uIC0gc2luY2UgdGhpcyBmdW5jdGlvbgogCSAqIG11c3QgYmUgYWxsb3dlZCB0byBtYWtlIEFjcGkgY2FsbHMgaXRzZWxmLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZSAoQUNQSV9UWVBFX0RFVklDRSwKLQkJCSAgIEFDUElfUk9PVF9PQkpFQ1QsIEFDUElfVUlOVDMyX01BWCwKLQkJCSAgIEFDUElfTlNfV0FMS19VTkxPQ0ssCi0JCQkgICBhY3BpX25zX2dldF9kZXZpY2VfY2FsbGJhY2ssICZpbmZvLAotCQkJICAgcmV0dXJuX3ZhbHVlKTsKKwlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsCisJCQkJCUFDUElfUk9PVF9PQkpFQ1QsIEFDUElfVUlOVDMyX01BWCwKKwkJCQkJQUNQSV9OU19XQUxLX1VOTE9DSywKKwkJCQkJYWNwaV9uc19nZXRfZGV2aWNlX2NhbGxiYWNrLCAmaW5mbywKKwkJCQkJcmV0dXJuX3ZhbHVlKTsKIAotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2dldF9kZXZpY2VzKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF9kZXZpY2VzKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MjUsNDQgKzYwNiwzOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfYXR0YWNoX2RhdGEgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQlhY3BpX29iamVjdF9oYW5kbGVyICAgICAgICAgICAgIGhhbmRsZXIsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK2FjcGlfYXR0YWNoX2RhdGEoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAotCWlmICghb2JqX2hhbmRsZSB8fAotCQkhaGFuZGxlciAgICB8fAotCQkhZGF0YSkgeworCWlmICghb2JqX2hhbmRsZSB8fCAhaGFuZGxlciB8fCAhZGF0YSkgewogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybiAoc3RhdHVzKTsKIAl9CiAKIAkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgaGFuZGxlICovCiAKLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKG9ial9oYW5kbGUpOworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKIAlpZiAoIW5vZGUpIHsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfZGF0YSAobm9kZSwgaGFuZGxlciwgZGF0YSk7CisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfZGF0YShub2RlLCBoYW5kbGVyLCBkYXRhKTsKIAotdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZGV0YWNoX2RhdGEKQEAgLTY3Nyw0MiArNjUyLDM3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kZXRhY2hfZGF0YSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCWFjcGlfb2JqZWN0X2hhbmRsZXIgICAgICAgICAgICAgaGFuZGxlcikKK2FjcGlfZGV0YWNoX2RhdGEoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCi0JaWYgKCFvYmpfaGFuZGxlIHx8Ci0JCSFoYW5kbGVyKSB7CisJaWYgKCFvYmpfaGFuZGxlIHx8ICFoYW5kbGVyKSB7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KIAogCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBoYW5kbGUgKi8KIAotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAob2JqX2hhbmRsZSk7CisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKG9ial9oYW5kbGUpOwogCWlmICghbm9kZSkgewogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX25zX2RldGFjaF9kYXRhIChub2RlLCBoYW5kbGVyKTsKKwlzdGF0dXMgPSBhY3BpX25zX2RldGFjaF9kYXRhKG5vZGUsIGhhbmRsZXIpOwogCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfZGF0YQpAQCAtNzI4LDQxICs2OTgsMzMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9kYXRhICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JYWNwaV9vYmplY3RfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipkYXRhKQorYWNwaV9nZXRfZGF0YShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLCBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKipkYXRhKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCi0JaWYgKCFvYmpfaGFuZGxlIHx8Ci0JCSFoYW5kbGVyICAgIHx8Ci0JCSFkYXRhKSB7CisJaWYgKCFvYmpfaGFuZGxlIHx8ICFoYW5kbGVyIHx8ICFkYXRhKSB7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KIAogCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBoYW5kbGUgKi8KIAotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAob2JqX2hhbmRsZSk7CisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKG9ial9oYW5kbGUpOwogCWlmICghbm9kZSkgewogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9kYXRhIChub2RlLCBoYW5kbGVyLCBkYXRhKTsKKwlzdGF0dXMgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9kYXRhKG5vZGUsIGhhbmRsZXIsIGRhdGEpOwogCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jCmluZGV4IDhkMDk3OTEuLjZiNWY4ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm5hbWUuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMKQEAgLTQ3LDEwICs0Nyw4IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnN4Zm5hbWUiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJuc3hmbmFtZSIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02OSwyMCArNjcsMTUgQEAKICAqICAgICAgICAgICAgICBuYW1lc3BhY2UgaGFuZGxlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9oYW5kbGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgcGFyZW50LAotCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUsCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAqcmV0X2hhbmRsZSkKK2FjcGlfZ2V0X2hhbmRsZShhY3BpX2hhbmRsZSBwYXJlbnQsCisJCWFjcGlfc3RyaW5nIHBhdGhuYW1lLCBhY3BpX2hhbmRsZSAqIHJldF9oYW5kbGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcHJlZml4X25vZGUgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlID0gTlVMTDsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qIFBhcmFtZXRlciBWYWxpZGF0aW9uICovCiAKQEAgLTkzLDQ1ICs4Niw0NyBAQAogCS8qIENvbnZlcnQgYSBwYXJlbnQgaGFuZGxlIHRvIGEgcHJlZml4IG5vZGUgKi8KIAogCWlmIChwYXJlbnQpIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybiAoc3RhdHVzKTsKIAkJfQogCi0JCXByZWZpeF9ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKHBhcmVudCk7CisJCXByZWZpeF9ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUocGFyZW50KTsKIAkJaWYgKCFwcmVmaXhfbm9kZSkgewotCQkJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAkJfQogCi0JCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAkvKiBTcGVjaWFsIGNhc2UgZm9yIHJvb3QsIHNpbmNlIHdlIGNhbid0IHNlYXJjaCBmb3IgaXQgKi8KIAotCWlmIChBQ1BJX1NUUkNNUCAocGF0aG5hbWUsIEFDUElfTlNfUk9PVF9QQVRIKSA9PSAwKSB7Ci0JCSpyZXRfaGFuZGxlID0gYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZSAoYWNwaV9nYmxfcm9vdF9ub2RlKTsKKwlpZiAoQUNQSV9TVFJDTVAocGF0aG5hbWUsIEFDUElfTlNfUk9PVF9QQVRIKSA9PSAwKSB7CisJCSpyZXRfaGFuZGxlID0KKwkJICAgIGFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUoYWNwaV9nYmxfcm9vdF9ub2RlKTsKIAkJcmV0dXJuIChBRV9PSyk7CiAJfQogCiAJLyoKIAkgKiAgRmluZCB0aGUgTm9kZSBhbmQgY29udmVydCB0byBhIGhhbmRsZQogCSAqLwotCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aCAocGF0aG5hbWUsIHByZWZpeF9ub2RlLCBBQ1BJX05TX05PX1VQU0VBUkNILAotCQkJICAmbm9kZSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoKHBhdGhuYW1lLCBwcmVmaXhfbm9kZSwgQUNQSV9OU19OT19VUFNFQVJDSCwKKwkJCQkgICAgICZub2RlKTsKIAogCSpyZXRfaGFuZGxlID0gTlVMTDsKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCSpyZXRfaGFuZGxlID0gYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZSAobm9kZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCSpyZXRfaGFuZGxlID0gYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZShub2RlKTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2hhbmRsZSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfaGFuZGxlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE1MCwxNCArMTQ1LDEwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfbmFtZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3R5cGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqYnVmZmVyKQorYWNwaV9nZXRfbmFtZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBuYW1lX3R5cGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqIGJ1ZmZlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIApAQCAtMTY1LDE1ICsxNTYsMTUgQEAKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlciAoYnVmZmVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIoYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KIAogCWlmIChuYW1lX3R5cGUgPT0gQUNQSV9GVUxMX1BBVEhOQU1FKSB7CiAJCS8qIEdldCB0aGUgZnVsbCBwYXRobmFtZSAoRnJvbSB0aGUgbmFtZXNwYWNlIHJvb3QpICovCiAKLQkJc3RhdHVzID0gYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUgKGhhbmRsZSwgYnVmZmVyKTsKKwkJc3RhdHVzID0gYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUoaGFuZGxlLCBidWZmZXIpOwogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCkBAIC0xODEsMTIgKzE3MiwxMiBAQAogCSAqIFdhbnRzIHRoZSBzaW5nbGUgc2VnbWVudCBBQ1BJIG5hbWUuCiAJICogVmFsaWRhdGUgaGFuZGxlIGFuZCBjb252ZXJ0IHRvIGEgbmFtZXNwYWNlIE5vZGUKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChoYW5kbGUpOworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShoYW5kbGUpOwogCWlmICghbm9kZSkgewogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTE5NCwyNiArMTg1LDI1IEBACiAKIAkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyIChidWZmZXIsIEFDUElfUEFUSF9TRUdNRU5UX0xFTkdUSCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIoYnVmZmVyLCBBQ1BJX1BBVEhfU0VHTUVOVF9MRU5HVEgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKIAkvKiBKdXN0IGNvcHkgdGhlIEFDUEkgbmFtZSBmcm9tIHRoZSBOb2RlIGFuZCB6ZXJvIHRlcm1pbmF0ZSBpdCAqLwogCi0JQUNQSV9TVFJOQ1BZIChidWZmZXItPnBvaW50ZXIsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSAobm9kZSksCi0JCQkgQUNQSV9OQU1FX1NJWkUpOwotCSgoY2hhciAqKSBidWZmZXItPnBvaW50ZXIpIFtBQ1BJX05BTUVfU0laRV0gPSAwOworCUFDUElfU1RSTkNQWShidWZmZXItPnBvaW50ZXIsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwKKwkJICAgICBBQ1BJX05BTUVfU0laRSk7CisJKChjaGFyICopYnVmZmVyLT5wb2ludGVyKVtBQ1BJX05BTUVfU0laRV0gPSAwOwogCXN0YXR1cyA9IEFFX09LOwogCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CiAKLXVubG9ja19hbmRfZXhpdDoKLQotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2dldF9uYW1lKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF9uYW1lKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTIzMSwxNyArMjIxLDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfb2JqZWN0X2luZm8gKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKmJ1ZmZlcikKK2FjcGlfZ2V0X29iamVjdF9pbmZvKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfYnVmZmVyICogYnVmZmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gICAgICAgICAqaW5mbzsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyAgICAgICAgICpyZXR1cm5faW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gKmluZm87CisJc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gKnJldHVybl9pbmZvOwogCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkX2xpc3QgPSBOVUxMOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKLQorCWFjcGlfc2l6ZSBzaXplOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIApAQCAtMjQ5LDM3ICsyMzYsMzcgQEAKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlciAoYnVmZmVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIoYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KIAotCWluZm8gPSBBQ1BJX01FTV9DQUxMT0NBVEUgKHNpemVvZiAoc3RydWN0IGFjcGlfZGV2aWNlX2luZm8pKTsKKwlpbmZvID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbykpOwogCWlmICghaW5mbykgewogCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAoaGFuZGxlKTsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoaGFuZGxlKTsKIAlpZiAoIW5vZGUpIHsKLQkJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBJbml0IHJldHVybiBzdHJ1Y3R1cmUgKi8KIAotCXNpemUgPSBzaXplb2YgKHN0cnVjdCBhY3BpX2RldmljZV9pbmZvKTsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBhY3BpX2RldmljZV9pbmZvKTsKIAotCWluZm8tPnR5cGUgID0gbm9kZS0+dHlwZTsKLQlpbmZvLT5uYW1lICA9IG5vZGUtPm5hbWUuaW50ZWdlcjsKKwlpbmZvLT50eXBlID0gbm9kZS0+dHlwZTsKKwlpbmZvLT5uYW1lID0gbm9kZS0+bmFtZS5pbnRlZ2VyOwogCWluZm8tPnZhbGlkID0gMDsKIAotCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKQEAgLTI5Nyw3MyArMjg0LDczIEBACiAKIAkJLyogRXhlY3V0ZSB0aGUgRGV2aWNlLl9ISUQgbWV0aG9kICovCiAKLQkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0hJRCAobm9kZSwgJmluZm8tPmhhcmR3YXJlX2lkKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfSElEKG5vZGUsICZpbmZvLT5oYXJkd2FyZV9pZCk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJaW5mby0+dmFsaWQgfD0gQUNQSV9WQUxJRF9ISUQ7CiAJCX0KIAogCQkvKiBFeGVjdXRlIHRoZSBEZXZpY2UuX1VJRCBtZXRob2QgKi8KIAotCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfVUlEIChub2RlLCAmaW5mby0+dW5pcXVlX2lkKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfVUlEKG5vZGUsICZpbmZvLT51bmlxdWVfaWQpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCWluZm8tPnZhbGlkIHw9IEFDUElfVkFMSURfVUlEOwogCQl9CiAKIAkJLyogRXhlY3V0ZSB0aGUgRGV2aWNlLl9DSUQgbWV0aG9kICovCiAKLQkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0NJRCAobm9kZSwgJmNpZF9saXN0KTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfQ0lEKG5vZGUsICZjaWRfbGlzdCk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJc2l6ZSArPSAoKGFjcGlfc2l6ZSkgY2lkX2xpc3QtPmNvdW50IC0gMSkgKgotCQkJCQkgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkKTsKKwkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZCk7CiAJCQlpbmZvLT52YWxpZCB8PSBBQ1BJX1ZBTElEX0NJRDsKIAkJfQogCiAJCS8qIEV4ZWN1dGUgdGhlIERldmljZS5fU1RBIG1ldGhvZCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9TVEEgKG5vZGUsICZpbmZvLT5jdXJyZW50X3N0YXR1cyk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX1NUQShub2RlLCAmaW5mby0+Y3VycmVudF9zdGF0dXMpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCWluZm8tPnZhbGlkIHw9IEFDUElfVkFMSURfU1RBOwogCQl9CiAKIAkJLyogRXhlY3V0ZSB0aGUgRGV2aWNlLl9BRFIgbWV0aG9kICovCiAKLQkJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdCAoTUVUSE9EX05BTUVfX0FEUiwgbm9kZSwKLQkJCQkgICZpbmZvLT5hZGRyZXNzKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0KE1FVEhPRF9OQU1FX19BRFIsIG5vZGUsCisJCQkJCQkJICZpbmZvLT5hZGRyZXNzKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQlpbmZvLT52YWxpZCB8PSBBQ1BJX1ZBTElEX0FEUjsKIAkJfQogCiAJCS8qIEV4ZWN1dGUgdGhlIERldmljZS5fc3hfZCBtZXRob2RzICovCiAKLQkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX3N4ZHMgKG5vZGUsIGluZm8tPmhpZ2hlc3RfZHN0YXRlcyk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX3N4ZHMobm9kZSwgaW5mby0+aGlnaGVzdF9kc3RhdGVzKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQlpbmZvLT52YWxpZCB8PSBBQ1BJX1ZBTElEX1NYRFM7CiAJCX0KIAl9CiAKIAkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyIChidWZmZXIsIHNpemUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyKGJ1ZmZlciwgc2l6ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBQb3B1bGF0ZSB0aGUgcmV0dXJuIGJ1ZmZlciAqLwogCiAJcmV0dXJuX2luZm8gPSBidWZmZXItPnBvaW50ZXI7Ci0JQUNQSV9NRU1DUFkgKHJldHVybl9pbmZvLCBpbmZvLCBzaXplb2YgKHN0cnVjdCBhY3BpX2RldmljZV9pbmZvKSk7CisJQUNQSV9NRU1DUFkocmV0dXJuX2luZm8sIGluZm8sIHNpemVvZihzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbykpOwogCiAJaWYgKGNpZF9saXN0KSB7Ci0JCUFDUElfTUVNQ1BZICgmcmV0dXJuX2luZm8tPmNvbXBhdGliaWxpdHlfaWQsIGNpZF9saXN0LCBjaWRfbGlzdC0+c2l6ZSk7CisJCUFDUElfTUVNQ1BZKCZyZXR1cm5faW5mby0+Y29tcGF0aWJpbGl0eV9pZCwgY2lkX2xpc3QsCisJCQkgICAgY2lkX2xpc3QtPnNpemUpOwogCX0KIAotCi1jbGVhbnVwOgotCUFDUElfTUVNX0ZSRUUgKGluZm8pOworICAgICAgY2xlYW51cDoKKwlBQ1BJX01FTV9GUkVFKGluZm8pOwogCWlmIChjaWRfbGlzdCkgewotCQlBQ1BJX01FTV9GUkVFIChjaWRfbGlzdCk7CisJCUFDUElfTUVNX0ZSRUUoY2lkX2xpc3QpOwogCX0KIAlyZXR1cm4gKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X29iamVjdF9pbmZvKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF9vYmplY3RfaW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZvYmouYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jCmluZGV4IDM2M2UxZjYuLjA4NTZkNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jCkBAIC00Nyw5ICs0Nyw4IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnN4Zm9iaiIpCitBQ1BJX01PRFVMRV9OQU1FKCJuc3hmb2JqIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MywxNSArNjIsMTAgQEAKICAqIERFU0NSSVBUSU9OOiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgdHlwZSBhc3NvY2lhdGQgd2l0aCBhIHBhcnRpY3VsYXIgaGFuZGxlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3R5cGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgKnJldF90eXBlKQorYWNwaV9zdGF0dXMgYWNwaV9nZXRfdHlwZShhY3BpX2hhbmRsZSBoYW5kbGUsIGFjcGlfb2JqZWN0X3R5cGUgKiByZXRfdHlwZSkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJLyogUGFyYW1ldGVyIFZhbGlkYXRpb24gKi8KIApAQCAtODgsMjcgKzgyLDI2IEBACiAJCXJldHVybiAoQUVfT0spOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybiAoc3RhdHVzKTsKIAl9CiAKIAkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgaGFuZGxlICovCiAKLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKGhhbmRsZSk7CisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGhhbmRsZSk7CiAJaWYgKCFub2RlKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCSpyZXRfdHlwZSA9IG5vZGUtPnR5cGU7CiAKLQotCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3R5cGUpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3R5cGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEyNCwxNCArMTE3LDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3BhcmVudCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAqcmV0X2hhbmRsZSkKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3BhcmVudChhY3BpX2hhbmRsZSBoYW5kbGUsIGFjcGlfaGFuZGxlICogcmV0X2hhbmRsZSkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJaWYgKCFyZXRfaGFuZGxlKSB7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CkBAIC0xNDMsMTQgKzEzMiwxNCBAQAogCQlyZXR1cm4gKEFFX05VTExfRU5UUlkpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybiAoc3RhdHVzKTsKIAl9CiAKIAkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgaGFuZGxlICovCiAKLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKGhhbmRsZSk7CisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGhhbmRsZSk7CiAJaWYgKCFub2RlKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtMTU5LDIyICsxNDgsMjEgQEAKIAkvKiBHZXQgdGhlIHBhcmVudCBlbnRyeSAqLwogCiAJKnJldF9oYW5kbGUgPQotCQlhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlIChhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAobm9kZSkpOworCSAgICBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlKGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpKTsKIAogCS8qIFJldHVybiBleGNlcHRpb24gaWYgcGFyZW50IGlzIG51bGwgKi8KIAotCWlmICghYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKG5vZGUpKSB7CisJaWYgKCFhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKSkgewogCQlzdGF0dXMgPSBBRV9OVUxMX0VOVFJZOwogCX0KIAorICAgICAgdW5sb2NrX2FuZF9leGl0OgogCi11bmxvY2tfYW5kX2V4aXQ6Ci0KLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCXJldHVybiAoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfcGFyZW50KTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF9wYXJlbnQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE5NSwxNyArMTgzLDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfbmV4dF9vYmplY3QgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGNoaWxkLAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgKnJldF9oYW5kbGUpCithY3BpX2dldF9uZXh0X29iamVjdChhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCSAgICAgYWNwaV9oYW5kbGUgcGFyZW50LAorCQkgICAgIGFjcGlfaGFuZGxlIGNoaWxkLCBhY3BpX2hhbmRsZSAqIHJldF9oYW5kbGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqY2hpbGRfbm9kZSA9IE5VTEw7Ci0KKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY2hpbGRfbm9kZSA9IE5VTEw7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCkBAIC0yMTMsOCArMTk4LDggQEAKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCkBAIC0yMjMsMTcgKzIwOCwxNiBAQAogCWlmICghY2hpbGQpIHsKIAkJLyogU3RhcnQgc2VhcmNoIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNwZWNpZmllZCBzY29wZSAqLwogCi0JCXBhcmVudF9ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKHBhcmVudCk7CisJCXBhcmVudF9ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUocGFyZW50KTsKIAkJaWYgKCFwYXJlbnRfbm9kZSkgewogCQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIE5vbi1udWxsIGhhbmRsZSwgaWdub3JlIHRoZSBwYXJlbnQgKi8KIAkJLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGhhbmRsZSAqLwogCi0JCWNoaWxkX25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAoY2hpbGQpOworCQljaGlsZF9ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoY2hpbGQpOwogCQlpZiAoIWNoaWxkX25vZGUpIHsKIAkJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTI0MiwyMCArMjI2LDE5IEBACiAKIAkvKiBJbnRlcm5hbCBmdW5jdGlvbiBkb2VzIHRoZSByZWFsIHdvcmsgKi8KIAotCW5vZGUgPSBhY3BpX25zX2dldF9uZXh0X25vZGUgKHR5cGUsIHBhcmVudF9ub2RlLCBjaGlsZF9ub2RlKTsKKwlub2RlID0gYWNwaV9uc19nZXRfbmV4dF9ub2RlKHR5cGUsIHBhcmVudF9ub2RlLCBjaGlsZF9ub2RlKTsKIAlpZiAoIW5vZGUpIHsKIAkJc3RhdHVzID0gQUVfTk9UX0ZPVU5EOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKIAlpZiAocmV0X2hhbmRsZSkgewotCQkqcmV0X2hhbmRsZSA9IGFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUgKG5vZGUpOworCQkqcmV0X2hhbmRsZSA9IGFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUobm9kZSk7CiAJfQogCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CiAKLXVubG9ja19hbmRfZXhpdDoKLQotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbnVtYS5jIGIvZHJpdmVycy9hY3BpL251bWEuYwppbmRleCBhODI4MzRiLi42NGI5OGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbnVtYS5jCisrKyBiL2RyaXZlcnMvYWNwaS9udW1hLmMKQEAgLTM0LDE2ICszNCwxOCBAQAogCiAjZGVmaW5lIEFDUElfTlVNQQkweDgwMDAwMDAwCiAjZGVmaW5lIF9DT01QT05FTlQJQUNQSV9OVU1BCi0JQUNQSV9NT0RVTEVfTkFNRSAoIm51bWEiKQorQUNQSV9NT0RVTEVfTkFNRSgibnVtYSIpCiAKLWV4dGVybiBpbnQgX19pbml0IGFjcGlfdGFibGVfcGFyc2VfbWFkdF9mYW1pbHkgKGVudW0gYWNwaV90YWJsZV9pZCBpZCwgdW5zaWduZWQgbG9uZyBtYWR0X3NpemUsIGludCBlbnRyeV9pZCwgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKTsKK2V4dGVybiBpbnQgX19pbml0IGFjcGlfdGFibGVfcGFyc2VfbWFkdF9mYW1pbHkoZW51bSBhY3BpX3RhYmxlX2lkIGlkLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBtYWR0X3NpemUsCisJCQkJCSAgICAgICBpbnQgZW50cnlfaWQsCisJCQkJCSAgICAgICBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKTsKIAotdm9pZCBfX2luaXQKLWFjcGlfdGFibGVfcHJpbnRfc3JhdF9lbnRyeSAoCi0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIJKmhlYWRlcikKK3ZvaWQgX19pbml0IGFjcGlfdGFibGVfcHJpbnRfc3JhdF9lbnRyeShhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlcikKIHsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSAoImFjcGlfdGFibGVfcHJpbnRfc3JhdF9lbnRyeSIpOworCUFDUElfRlVOQ1RJT05fTkFNRSgiYWNwaV90YWJsZV9wcmludF9zcmF0X2VudHJ5Iik7CiAKIAlpZiAoIWhlYWRlcikKIAkJcmV0dXJuOwpAQCAtNTIsNDggKzU0LDU1IEBACiAKIAljYXNlIEFDUElfU1JBVF9QUk9DRVNTT1JfQUZGSU5JVFk6CiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKLQl7Ci0JCXN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqcCA9Ci0JCQkoc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5KikgaGVhZGVyOwotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJTUkFUIFByb2Nlc3NvciAoaWRbMHglMDJ4XSBlaWRbMHglMDJ4XSkgaW4gcHJveGltaXR5IGRvbWFpbiAlZCAlc1xuIiwKLQkJICAgICAgIHAtPmFwaWNfaWQsIHAtPmxzYXBpY19laWQsIHAtPnByb3hpbWl0eV9kb21haW4sCi0JCSAgICAgICBwLT5mbGFncy5lbmFibGVkPyJlbmFibGVkIjoiZGlzYWJsZWQiKSk7Ci0JfQotI2VuZGlmIC8qIEFDUElfREVCVUdfT1VUUFVUICovCisJCXsKKwkJCXN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqcCA9CisJCQkgICAgKHN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqKWhlYWRlcjsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiU1JBVCBQcm9jZXNzb3IgKGlkWzB4JTAyeF0gZWlkWzB4JTAyeF0pIGluIHByb3hpbWl0eSBkb21haW4gJWQgJXNcbiIsCisJCQkJCSAgcC0+YXBpY19pZCwgcC0+bHNhcGljX2VpZCwKKwkJCQkJICBwLT5wcm94aW1pdHlfZG9tYWluLAorCQkJCQkgIHAtPmZsYWdzLgorCQkJCQkgIGVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSk7CisJCX0KKyNlbmRpZgkJCQkvKiBBQ1BJX0RFQlVHX09VVFBVVCAqLwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9TUkFUX01FTU9SWV9BRkZJTklUWToKICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAotCXsKLQkJc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICpwID0KLQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9tZW1vcnlfYWZmaW5pdHkqKSBoZWFkZXI7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlNSQVQgTWVtb3J5ICgweCUwOHglMDh4IGxlbmd0aCAweCUwOHglMDh4IHR5cGUgMHgleCkgaW4gcHJveGltaXR5IGRvbWFpbiAlZCAlcyVzXG4iLAotCQkgICAgICAgcC0+YmFzZV9hZGRyX2hpLCBwLT5iYXNlX2FkZHJfbG8sIHAtPmxlbmd0aF9oaSwgcC0+bGVuZ3RoX2xvLAotCQkgICAgICAgcC0+bWVtb3J5X3R5cGUsIHAtPnByb3hpbWl0eV9kb21haW4sCi0JCSAgICAgICBwLT5mbGFncy5lbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKLQkJICAgICAgIHAtPmZsYWdzLmhvdF9wbHVnZ2FibGUgPyAiIGhvdC1wbHVnZ2FibGUiIDogIiIpKTsKLQl9Ci0jZW5kaWYgLyogQUNQSV9ERUJVR19PVVRQVVQgKi8KKwkJeworCQkJc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICpwID0KKwkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICopaGVhZGVyOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkgICJTUkFUIE1lbW9yeSAoMHglMDh4JTA4eCBsZW5ndGggMHglMDh4JTA4eCB0eXBlIDB4JXgpIGluIHByb3hpbWl0eSBkb21haW4gJWQgJXMlc1xuIiwKKwkJCQkJICBwLT5iYXNlX2FkZHJfaGksIHAtPmJhc2VfYWRkcl9sbywKKwkJCQkJICBwLT5sZW5ndGhfaGksIHAtPmxlbmd0aF9sbywKKwkJCQkJICBwLT5tZW1vcnlfdHlwZSwgcC0+cHJveGltaXR5X2RvbWFpbiwKKwkJCQkJICBwLT5mbGFncy4KKwkJCQkJICBlbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKKwkJCQkJICBwLT5mbGFncy4KKwkJCQkJICBob3RfcGx1Z2dhYmxlID8gIiBob3QtcGx1Z2dhYmxlIiA6CisJCQkJCSAgIiIpKTsKKwkJfQorI2VuZGlmCQkJCS8qIEFDUElfREVCVUdfT1VUUFVUICovCiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIkZvdW5kIHVuc3VwcG9ydGVkIFNSQVQgZW50cnkgKHR5cGUgPSAweCV4KVxuIiwKLQkJCWhlYWRlci0+dHlwZSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCSAgICAgICAiRm91bmQgdW5zdXBwb3J0ZWQgU1JBVCBlbnRyeSAodHlwZSA9IDB4JXgpXG4iLAorCQkgICAgICAgaGVhZGVyLT50eXBlKTsKIAkJYnJlYWs7CiAJfQogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX3NsaXQgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX3NsaXQodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9zbGl0CSpzbGl0OwotCXUzMgkJCWxvY2FsaXRpZXM7CisJc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqc2xpdDsKKwl1MzIgbG9jYWxpdGllczsKIAogCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNsaXQgPSAoc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqKSBfX3ZhKHBoeXNfYWRkcik7CisJc2xpdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9zbGl0ICopX192YShwaHlzX2FkZHIpOwogCiAJLyogZG93bmNhc3QganVzdCBmb3IgJWxsdSB2cyAlbHUgZm9yIGkzODYvaWE2NCAgKi8KIAlsb2NhbGl0aWVzID0gKHUzMikgc2xpdC0+bG9jYWxpdGllczsKQEAgLTEwMywxNSArMTEyLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfcHJvY2Vzc29yX2FmZmluaXR5ICgKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLAotCWNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQorYWNwaV9wYXJzZV9wcm9jZXNzb3JfYWZmaW5pdHkoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9wcm9jZXNzb3JfYWZmaW5pdHkgKnByb2Nlc3Nvcl9hZmZpbml0eTsKIAotCXByb2Nlc3Nvcl9hZmZpbml0eSA9IChzdHJ1Y3QgYWNwaV90YWJsZV9wcm9jZXNzb3JfYWZmaW5pdHkqKSBoZWFkZXI7CisJcHJvY2Vzc29yX2FmZmluaXR5ID0gKHN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqKWhlYWRlcjsKIAlpZiAoIXByb2Nlc3Nvcl9hZmZpbml0eSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTEyMywxNSArMTMwLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfbWVtb3J5X2FmZmluaXR5ICgKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLAotCWNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQorYWNwaV9wYXJzZV9tZW1vcnlfYWZmaW5pdHkoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsCisJCQkgICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9tZW1vcnlfYWZmaW5pdHkgKm1lbW9yeV9hZmZpbml0eTsKIAotCW1lbW9yeV9hZmZpbml0eSA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tZW1vcnlfYWZmaW5pdHkqKSBoZWFkZXI7CisJbWVtb3J5X2FmZmluaXR5ID0gKHN0cnVjdCBhY3BpX3RhYmxlX21lbW9yeV9hZmZpbml0eSAqKWhlYWRlcjsKIAlpZiAoIW1lbW9yeV9hZmZpbml0eSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE0MywzNiArMTQ4LDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2Vfc3JhdCAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2Vfc3JhdCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX3NyYXQJKnNyYXQ7CisJc3RydWN0IGFjcGlfdGFibGVfc3JhdCAqc3JhdDsKIAogCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNyYXQgPSAoc3RydWN0IGFjcGlfdGFibGVfc3JhdCAqKSBfX3ZhKHBoeXNfYWRkcik7CisJc3JhdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9zcmF0ICopX192YShwaHlzX2FkZHIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLQogaW50IF9faW5pdAotYWNwaV90YWJsZV9wYXJzZV9zcmF0ICgKLQllbnVtIGFjcGlfc3JhdF9lbnRyeV9pZAlpZCwKLQlhY3BpX21hZHRfZW50cnlfaGFuZGxlcgloYW5kbGVyLAotCXVuc2lnbmVkIGludCBtYXhfZW50cmllcykKK2FjcGlfdGFibGVfcGFyc2Vfc3JhdChlbnVtIGFjcGlfc3JhdF9lbnRyeV9pZCBpZCwKKwkJICAgICAgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKQogewotCXJldHVybiBhY3BpX3RhYmxlX3BhcnNlX21hZHRfZmFtaWx5KEFDUElfU1JBVCwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX3NyYXQpLAotCQkJCQkgICAgaWQsIGhhbmRsZXIsIG1heF9lbnRyaWVzKTsKKwlyZXR1cm4gYWNwaV90YWJsZV9wYXJzZV9tYWR0X2ZhbWlseShBQ1BJX1NSQVQsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfc3JhdCksIGlkLAorCQkJCQkgICAgaGFuZGxlciwgbWF4X2VudHJpZXMpOwogfQogCi0KLWludCBfX2luaXQKLWFjcGlfbnVtYV9pbml0KHZvaWQpCitpbnQgX19pbml0IGFjcGlfbnVtYV9pbml0KHZvaWQpCiB7Ci0JaW50CQkJcmVzdWx0OworCWludCByZXN1bHQ7CiAKIAkvKiBTUkFUOiBTdGF0aWMgUmVzb3VyY2UgQWZmaW5pdHkgVGFibGUgKi8KIAlyZXN1bHQgPSBhY3BpX3RhYmxlX3BhcnNlKEFDUElfU1JBVCwgYWNwaV9wYXJzZV9zcmF0KTsKQEAgLTE4MSw5ICsxODAsNyBAQAogCQlyZXN1bHQgPSBhY3BpX3RhYmxlX3BhcnNlX3NyYXQoQUNQSV9TUkFUX1BST0NFU1NPUl9BRkZJTklUWSwKIAkJCQkJICAgICAgIGFjcGlfcGFyc2VfcHJvY2Vzc29yX2FmZmluaXR5LAogCQkJCQkgICAgICAgTlJfQ1BVUyk7Ci0JCXJlc3VsdCA9IGFjcGlfdGFibGVfcGFyc2Vfc3JhdChBQ1BJX1NSQVRfTUVNT1JZX0FGRklOSVRZLAotCQkJCQkgICAgICAgYWNwaV9wYXJzZV9tZW1vcnlfYWZmaW5pdHksCi0JCQkJCSAgICAgICBOUl9OT0RFX01FTUJMS1MpOwkvLyBJQTY0IHNwZWNpZmljCisJCXJlc3VsdCA9IGFjcGlfdGFibGVfcGFyc2Vfc3JhdChBQ1BJX1NSQVRfTUVNT1JZX0FGRklOSVRZLCBhY3BpX3BhcnNlX21lbW9yeV9hZmZpbml0eSwgTlJfTk9ERV9NRU1CTEtTKTsJLy8gSUE2NCBzcGVjaWZpYwogCX0KIAogCS8qIFNMSVQ6IFN5c3RlbSBMb2NhbGl0eSBJbmZvcm1hdGlvbiBUYWJsZSAqLwpAQCAtMTkzLDggKzE5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludAotYWNwaV9nZXRfcHhtKGFjcGlfaGFuZGxlIGgpCitpbnQgYWNwaV9nZXRfcHhtKGFjcGlfaGFuZGxlIGgpCiB7CiAJdW5zaWduZWQgbG9uZyBweG07CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwpAQCAtMjA3LDcgKzIwMyw4IEBACiAJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKIAkJCXJldHVybiAoaW50KXB4bTsKIAkJc3RhdHVzID0gYWNwaV9nZXRfcGFyZW50KGhhbmRsZSwgJnBoYW5kbGUpOwotCX0gd2hpbGUoQUNQSV9TVUNDRVNTKHN0YXR1cykpOworCX0gd2hpbGUgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKTsKIAlyZXR1cm4gLTE7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9nZXRfcHhtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9vc2wuYyBiL2RyaXZlcnMvYWNwaS9vc2wuYwppbmRleCAwZDExZDZlLi5kNTI4Yzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvb3NsLmMKKysrIGIvZHJpdmVycy9hY3BpL29zbC5jCkBAIC00NSwxNiArNDUsMTIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9PU19TRVJWSUNFUwotQUNQSV9NT0RVTEVfTkFNRQkoIm9zbCIpCi0KK0FDUElfTU9EVUxFX05BTUUoIm9zbCIpCiAjZGVmaW5lIFBSRUZJWAkJIkFDUEk6ICIKLQotc3RydWN0IGFjcGlfb3NfZHBjCi17Ci0gICAgYWNwaV9vc2RfZXhlY19jYWxsYmFjayAgZnVuY3Rpb247Ci0gICAgdm9pZAkJICAgICpjb250ZXh0Oworc3RydWN0IGFjcGlfb3NfZHBjIHsKKwlhY3BpX29zZF9leGVjX2NhbGxiYWNrIGZ1bmN0aW9uOworCXZvaWQgKmNvbnRleHQ7CiB9OwogCiAjaWZkZWYgQ09ORklHX0FDUElfQ1VTVE9NX0RTRFQKQEAgLTY5LDcgKzY1LDcgQEAKIEVYUE9SVF9TWU1CT0woYWNwaV9pbl9kZWJ1Z2dlcik7CiAKIGV4dGVybiBjaGFyIGxpbmVfYnVmWzgwXTsKLSNlbmRpZiAvKkVOQUJMRV9ERUJVR0dFUiovCisjZW5kaWYJCQkJLypFTkFCTEVfREVCVUdHRVIgKi8KIAogaW50IGFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQgPSBUUlVFOwogRVhQT1JUX1NZTUJPTChhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKTsKQEAgLTc5LDMzICs3NSwyOSBAQAogc3RhdGljIHZvaWQgKmFjcGlfaXJxX2NvbnRleHQ7CiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmthY3BpZF93cTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfb3NfaW5pdGlhbGl6ZSh2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9vc19pbml0aWFsaXplKHZvaWQpCiB7CiAJcmV0dXJuIEFFX09LOwogfQogCi1hY3BpX3N0YXR1cwotYWNwaV9vc19pbml0aWFsaXplMSh2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9vc19pbml0aWFsaXplMSh2b2lkKQogewogCS8qCiAJICogSW5pdGlhbGl6ZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBhY2Nlc3MsIGFzIHdlJ2xsIG5lZWQgdG8gYWNjZXNzCiAJICogaXQgd2hpbGUgd2Fsa2luZyB0aGUgbmFtZXNwYWNlIChidXMgMCBhbmQgcm9vdCBicmlkZ2VzIHcvIF9CQk5zKS4KIAkgKi8KLSNpZmRlZiBDT05GSUdfQUNQSV9QQ0kKIAlpZiAoIXJhd19wY2lfb3BzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkFjY2VzcyB0byBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB1bmF2YWlsYWJsZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJBY2Nlc3MgdG8gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgdW5hdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gQUVfTlVMTF9FTlRSWTsKIAl9Ci0jZW5kaWYKIAlrYWNwaWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia2FjcGlkIik7CiAJQlVHX09OKCFrYWNwaWRfd3EpOwogCiAJcmV0dXJuIEFFX09LOwogfQogCi1hY3BpX3N0YXR1cwotYWNwaV9vc190ZXJtaW5hdGUodm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfb3NfdGVybWluYXRlKHZvaWQpCiB7CiAJaWYgKGFjcGlfaXJxX2hhbmRsZXIpIHsKIAkJYWNwaV9vc19yZW1vdmVfaW50ZXJydXB0X2hhbmRsZXIoYWNwaV9pcnFfaXJxLApAQCAtMTE3LDIxICsxMDksMjAgQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLXZvaWQKLWFjcGlfb3NfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwuLi4pCit2b2lkIGFjcGlfb3NfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKIAl2YV9zdGFydChhcmdzLCBmbXQpOwogCWFjcGlfb3NfdnByaW50ZihmbXQsIGFyZ3MpOwogCXZhX2VuZChhcmdzKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX29zX3ByaW50Zik7CiAKLXZvaWQKLWFjcGlfb3NfdnByaW50Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3ZvaWQgYWNwaV9vc192cHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQogewogCXN0YXRpYyBjaGFyIGJ1ZmZlcls1MTJdOwotCQorCiAJdnNwcmludGYoYnVmZmVyLCBmbXQsIGFyZ3MpOwogCiAjaWZkZWYgRU5BQkxFX0RFQlVHR0VSCkBAIC0xNDYsOCArMTM3LDcgQEAKIH0KIAogZXh0ZXJuIGludCBhY3BpX2luX3Jlc3VtZTsKLXZvaWQgKgotYWNwaV9vc19hbGxvY2F0ZShhY3BpX3NpemUgc2l6ZSkKK3ZvaWQgKmFjcGlfb3NfYWxsb2NhdGUoYWNwaV9zaXplIHNpemUpCiB7CiAJaWYgKGFjcGlfaW5fcmVzdW1lKQogCQlyZXR1cm4ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKQEAgLTE1NSwzMSArMTQ1LDMyIEBACiAJCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogfQogCi12b2lkCi1hY3BpX29zX2ZyZWUodm9pZCAqcHRyKQordm9pZCBhY3BpX29zX2ZyZWUodm9pZCAqcHRyKQogewogCWtmcmVlKHB0cik7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9vc19mcmVlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfb3NfZ2V0X3Jvb3RfcG9pbnRlcih1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHIpCithY3BpX3N0YXR1cyBhY3BpX29zX2dldF9yb290X3BvaW50ZXIodTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyKQogewogCWlmIChlZmlfZW5hYmxlZCkgewogCQlhZGRyLT5wb2ludGVyX3R5cGUgPSBBQ1BJX1BIWVNJQ0FMX1BPSU5URVI7CiAJCWlmIChlZmkuYWNwaTIwKQogCQkJYWRkci0+cG9pbnRlci5waHlzaWNhbCA9Ci0JCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgdmlydF90b19waHlzKGVmaS5hY3BpMjApOworCQkJICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHZpcnRfdG9fcGh5cyhlZmkuYWNwaTIwKTsKIAkJZWxzZSBpZiAoZWZpLmFjcGkpCiAJCQlhZGRyLT5wb2ludGVyLnBoeXNpY2FsID0KLQkJCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSB2aXJ0X3RvX3BoeXMoZWZpLmFjcGkpOworCQkJICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHZpcnRfdG9fcGh5cyhlZmkuYWNwaSk7CiAJCWVsc2UgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiU3lzdGVtIGRlc2NyaXB0aW9uIHRhYmxlcyBub3QgZm91bmRcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkJICAgICAgICJTeXN0ZW0gZGVzY3JpcHRpb24gdGFibGVzIG5vdCBmb3VuZFxuIik7CiAJCQlyZXR1cm4gQUVfTk9UX0ZPVU5EOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKEFDUElfRkFJTFVSRShhY3BpX2ZpbmRfcm9vdF9wb2ludGVyKGZsYWdzLCBhZGRyKSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlN5c3RlbSBkZXNjcmlwdGlvbiB0YWJsZXMgbm90IGZvdW5kXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJCSAgICAgICAiU3lzdGVtIGRlc2NyaXB0aW9uIHRhYmxlcyBub3QgZm91bmRcbiIpOwogCQkJcmV0dXJuIEFFX05PVF9GT1VORDsKIAkJfQogCX0KQEAgLTE4OCwxMSArMTc5LDEyIEBACiB9CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX21hcF9tZW1vcnkoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHBoeXMsIGFjcGlfc2l6ZSBzaXplLCB2b2lkIF9faW9tZW0gKip2aXJ0KQorYWNwaV9vc19tYXBfbWVtb3J5KGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBwaHlzLCBhY3BpX3NpemUgc2l6ZSwKKwkJICAgdm9pZCBfX2lvbWVtICoqIHZpcnQpCiB7CiAJaWYgKGVmaV9lbmFibGVkKSB7CiAJCWlmIChFRklfTUVNT1JZX1dCICYgZWZpX21lbV9hdHRyaWJ1dGVzKHBoeXMpKSB7Ci0JCQkqdmlydCA9ICh2b2lkIF9faW9tZW0gKikgcGh5c190b192aXJ0KHBoeXMpOworCQkJKnZpcnQgPSAodm9pZCBfX2lvbWVtICopcGh5c190b192aXJ0KHBoeXMpOwogCQl9IGVsc2UgewogCQkJKnZpcnQgPSBpb3JlbWFwKHBoeXMsIHNpemUpOwogCQl9CkBAIC0yMDIsOSArMTk0LDkgQEAKIAkJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOwogCQl9CiAJCS8qCi0JIAkgKiBpb3JlbWFwIGNoZWNrcyB0byBlbnN1cmUgdGhpcyBpcyBpbiByZXNlcnZlZCBzcGFjZQotCSAJICovCi0JCSp2aXJ0ID0gaW9yZW1hcCgodW5zaWduZWQgbG9uZykgcGh5cywgc2l6ZSk7CisJCSAqIGlvcmVtYXAgY2hlY2tzIHRvIGVuc3VyZSB0aGlzIGlzIGluIHJlc2VydmVkIHNwYWNlCisJCSAqLworCQkqdmlydCA9IGlvcmVtYXAoKHVuc2lnbmVkIGxvbmcpcGh5cywgc2l6ZSk7CiAJfQogCiAJaWYgKCEqdmlydCkKQEAgLTIxMywxNyArMjA1LDE2IEBACiAJcmV0dXJuIEFFX09LOwogfQogCi12b2lkCi1hY3BpX29zX3VubWFwX21lbW9yeSh2b2lkIF9faW9tZW0gKnZpcnQsIGFjcGlfc2l6ZSBzaXplKQordm9pZCBhY3BpX29zX3VubWFwX21lbW9yeSh2b2lkIF9faW9tZW0gKiB2aXJ0LCBhY3BpX3NpemUgc2l6ZSkKIHsKIAlpb3VubWFwKHZpcnQpOwogfQogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCi1hY3BpX29zX2dldF9waHlzaWNhbF9hZGRyZXNzKHZvaWQgKnZpcnQsIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyAqcGh5cykKK2FjcGlfb3NfZ2V0X3BoeXNpY2FsX2FkZHJlc3Modm9pZCAqdmlydCwgYWNwaV9waHlzaWNhbF9hZGRyZXNzICogcGh5cykKIHsKLQlpZighcGh5cyB8fCAhdmlydCkKKwlpZiAoIXBoeXMgfHwgIXZpcnQpCiAJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOwogCiAJKnBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7CkBAIC0yMzcsMTYgKzIyOCwxNiBAQAogc3RhdGljIGNoYXIgYWNwaV9vc19uYW1lW0FDUElfTUFYX09WRVJSSURFX0xFTl07CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX3ByZWRlZmluZWRfb3ZlcnJpZGUgKGNvbnN0IHN0cnVjdCBhY3BpX3ByZWRlZmluZWRfbmFtZXMgKmluaXRfdmFsLAotCQkgICAgICAgICAgICAgYWNwaV9zdHJpbmcgKm5ld192YWwpCithY3BpX29zX3ByZWRlZmluZWRfb3ZlcnJpZGUoY29uc3Qgc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyAqaW5pdF92YWwsCisJCQkgICAgYWNwaV9zdHJpbmcgKiBuZXdfdmFsKQogewogCWlmICghaW5pdF92YWwgfHwgIW5ld192YWwpCiAJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOwogCiAJKm5ld192YWwgPSBOVUxMOwotCWlmICghbWVtY21wIChpbml0X3ZhbC0+bmFtZSwgIl9PU18iLCA0KSAmJiBzdHJsZW4oYWNwaV9vc19uYW1lKSkgeworCWlmICghbWVtY21wKGluaXRfdmFsLT5uYW1lLCAiX09TXyIsIDQpICYmIHN0cmxlbihhY3BpX29zX25hbWUpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJPdmVycmlkaW5nIF9PUyBkZWZpbml0aW9uIHRvICclcydcbiIsCi0JCQlhY3BpX29zX25hbWUpOworCQkgICAgICAgYWNwaV9vc19uYW1lKTsKIAkJKm5ld192YWwgPSBhY3BpX29zX25hbWU7CiAJfQogCkBAIC0yNTQsMTUgKzI0NSwxNSBAQAogfQogCiBhY3BpX3N0YXR1cwotYWNwaV9vc190YWJsZV9vdmVycmlkZSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpleGlzdGluZ190YWJsZSwKLQkJCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKm5ld190YWJsZSkKK2FjcGlfb3NfdGFibGVfb3ZlcnJpZGUoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICogZXhpc3RpbmdfdGFibGUsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiogbmV3X3RhYmxlKQogewogCWlmICghZXhpc3RpbmdfdGFibGUgfHwgIW5ld190YWJsZSkKIAkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CiAKICNpZmRlZiBDT05GSUdfQUNQSV9DVVNUT01fRFNEVAogCWlmIChzdHJuY21wKGV4aXN0aW5nX3RhYmxlLT5zaWduYXR1cmUsICJEU0RUIiwgNCkgPT0gMCkKLQkJKm5ld190YWJsZSA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIqKUFtbENvZGU7CisJCSpuZXdfdGFibGUgPSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICopQW1sQ29kZTsKIAllbHNlCiAJCSpuZXdfdGFibGUgPSBOVUxMOwogI2Vsc2UKQEAgLTI3MSwxNCArMjYyLDE0IEBACiAJcmV0dXJuIEFFX09LOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QKLWFjcGlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3QgYWNwaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlyZXR1cm4gKCphY3BpX2lycV9oYW5kbGVyKShhY3BpX2lycV9jb250ZXh0KSA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7CisJcmV0dXJuICgqYWNwaV9pcnFfaGFuZGxlcikgKGFjcGlfaXJxX2NvbnRleHQpID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKIH0KIAogYWNwaV9zdGF0dXMKLWFjcGlfb3NfaW5zdGFsbF9pbnRlcnJ1cHRfaGFuZGxlcih1MzIgZ3NpLCBhY3BpX29zZF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmNvbnRleHQpCithY3BpX29zX2luc3RhbGxfaW50ZXJydXB0X2hhbmRsZXIodTMyIGdzaSwgYWNwaV9vc2RfaGFuZGxlciBoYW5kbGVyLAorCQkJCSAgdm9pZCAqY29udGV4dCkKIHsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCkBAIC0zMDUsOCArMjk2LDcgQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX3JlbW92ZV9pbnRlcnJ1cHRfaGFuZGxlcih1MzIgaXJxLCBhY3BpX29zZF9oYW5kbGVyIGhhbmRsZXIpCithY3BpX3N0YXR1cyBhY3BpX29zX3JlbW92ZV9pbnRlcnJ1cHRfaGFuZGxlcih1MzIgaXJxLCBhY3BpX29zZF9oYW5kbGVyIGhhbmRsZXIpCiB7CiAJaWYgKGlycSkgewogCQlmcmVlX2lycShpcnEsIGFjcGlfaXJxKTsKQEAgLTMyMSwxNiArMzExLDE1IEBACiAgKiBSdW5uaW5nIGluIGludGVycHJldGVyIHRocmVhZCBjb250ZXh0LCBzYWZlIHRvIHNsZWVwCiAgKi8KIAotdm9pZAotYWNwaV9vc19zbGVlcChhY3BpX2ludGVnZXIgbXMpCit2b2lkIGFjcGlfb3Nfc2xlZXAoYWNwaV9pbnRlZ2VyIG1zKQogewogCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCXNjaGVkdWxlX3RpbWVvdXQoKChzaWduZWQgbG9uZykgbXMgKiBIWikgLyAxMDAwKTsKKwlzY2hlZHVsZV90aW1lb3V0KCgoc2lnbmVkIGxvbmcpbXMgKiBIWikgLyAxMDAwKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX29zX3NsZWVwKTsKIAotdm9pZAotYWNwaV9vc19zdGFsbCh1MzIgdXMpCit2b2lkIGFjcGlfb3Nfc3RhbGwodTMyIHVzKQogewogCXdoaWxlICh1cykgewogCQl1MzIgZGVsYXkgPSAxMDAwOwpAQCAtMzQyLDYgKzMzMSw3IEBACiAJCXVzIC09IGRlbGF5OwogCX0KIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX29zX3N0YWxsKTsKIAogLyoKQEAgLTM0OSw4ICszMzksNyBAQAogICogUmV0dXJucyA2NC1iaXQgZnJlZS1ydW5uaW5nLCBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdGltZXIKICAqIHdpdGggMTAwbnMgZ3JhbnVsYXJpdHkKICAqLwotdTY0Ci1hY3BpX29zX2dldF90aW1lciAodm9pZCkKK3U2NCBhY3BpX29zX2dldF90aW1lcih2b2lkKQogewogCXN0YXRpYyB1NjQgdDsKIApAQCAtMzY3LDI3ICszNTYsMjIgQEAKIAlyZXR1cm4gKyt0OwogfQogCi1hY3BpX3N0YXR1cwotYWNwaV9vc19yZWFkX3BvcnQoCi0JYWNwaV9pb19hZGRyZXNzCXBvcnQsCi0JdTMyCQkqdmFsdWUsCi0JdTMyCQl3aWR0aCkKK2FjcGlfc3RhdHVzIGFjcGlfb3NfcmVhZF9wb3J0KGFjcGlfaW9fYWRkcmVzcyBwb3J0LCB1MzIgKiB2YWx1ZSwgdTMyIHdpZHRoKQogewogCXUzMiBkdW1teTsKIAogCWlmICghdmFsdWUpCiAJCXZhbHVlID0gJmR1bW15OwogCi0Jc3dpdGNoICh3aWR0aCkKLQl7CisJc3dpdGNoICh3aWR0aCkgewogCWNhc2UgODoKLQkJKih1OCopICB2YWx1ZSA9IGluYihwb3J0KTsKKwkJKih1OCAqKSB2YWx1ZSA9IGluYihwb3J0KTsKIAkJYnJlYWs7CiAJY2FzZSAxNjoKLQkJKih1MTYqKSB2YWx1ZSA9IGludyhwb3J0KTsKKwkJKih1MTYgKikgdmFsdWUgPSBpbncocG9ydCk7CiAJCWJyZWFrOwogCWNhc2UgMzI6Ci0JCSoodTMyKikgdmFsdWUgPSBpbmwocG9ydCk7CisJCSoodTMyICopIHZhbHVlID0gaW5sKHBvcnQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKQEAgLTM5NSwxNiArMzc5LDEyIEBACiAKIAlyZXR1cm4gQUVfT0s7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9vc19yZWFkX3BvcnQpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9vc193cml0ZV9wb3J0KAotCWFjcGlfaW9fYWRkcmVzcwlwb3J0LAotCXUzMgkJdmFsdWUsCi0JdTMyCQl3aWR0aCkKK2FjcGlfc3RhdHVzIGFjcGlfb3Nfd3JpdGVfcG9ydChhY3BpX2lvX2FkZHJlc3MgcG9ydCwgdTMyIHZhbHVlLCB1MzIgd2lkdGgpCiB7Ci0Jc3dpdGNoICh3aWR0aCkKLQl7CisJc3dpdGNoICh3aWR0aCkgewogCWNhc2UgODoKIAkJb3V0Yih2YWx1ZSwgcG9ydCk7CiAJCWJyZWFrOwpAQCAtNDIwLDQwICs0MDAsMzggQEAKIAogCXJldHVybiBBRV9PSzsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX29zX3dyaXRlX3BvcnQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9vc19yZWFkX21lbW9yeSgKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MJcGh5c19hZGRyLAotCXUzMgkJCSp2YWx1ZSwKLQl1MzIJCQl3aWR0aCkKK2FjcGlfb3NfcmVhZF9tZW1vcnkoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHBoeXNfYWRkciwgdTMyICogdmFsdWUsIHUzMiB3aWR0aCkKIHsKLQl1MzIJCQlkdW1teTsKLQl2b2lkIF9faW9tZW0JCSp2aXJ0X2FkZHI7Ci0JaW50CQkJaW9tZW0gPSAwOworCXUzMiBkdW1teTsKKwl2b2lkIF9faW9tZW0gKnZpcnRfYWRkcjsKKwlpbnQgaW9tZW0gPSAwOwogCiAJaWYgKGVmaV9lbmFibGVkKSB7CiAJCWlmIChFRklfTUVNT1JZX1dCICYgZWZpX21lbV9hdHRyaWJ1dGVzKHBoeXNfYWRkcikpIHsKIAkJCS8qIEhBQ0sgQUxFUlQhIFdlIGNhbiB1c2UgcmVhZGIvdy9sIG9uIHJlYWwgbWVtb3J5IHRvby4uICovCi0JCQl2aXJ0X2FkZHIgPSAodm9pZCBfX2lvbWVtICopIHBoeXNfdG9fdmlydChwaHlzX2FkZHIpOworCQkJdmlydF9hZGRyID0gKHZvaWQgX19pb21lbSAqKXBoeXNfdG9fdmlydChwaHlzX2FkZHIpOwogCQl9IGVsc2UgewogCQkJaW9tZW0gPSAxOwogCQkJdmlydF9hZGRyID0gaW9yZW1hcChwaHlzX2FkZHIsIHdpZHRoKTsKIAkJfQogCX0gZWxzZQotCQl2aXJ0X2FkZHIgPSAodm9pZCBfX2lvbWVtICopIHBoeXNfdG9fdmlydChwaHlzX2FkZHIpOworCQl2aXJ0X2FkZHIgPSAodm9pZCBfX2lvbWVtICopcGh5c190b192aXJ0KHBoeXNfYWRkcik7CiAJaWYgKCF2YWx1ZSkKIAkJdmFsdWUgPSAmZHVtbXk7CiAKIAlzd2l0Y2ggKHdpZHRoKSB7CiAJY2FzZSA4OgotCQkqKHU4KikgdmFsdWUgPSByZWFkYih2aXJ0X2FkZHIpOworCQkqKHU4ICopIHZhbHVlID0gcmVhZGIodmlydF9hZGRyKTsKIAkJYnJlYWs7CiAJY2FzZSAxNjoKLQkJKih1MTYqKSB2YWx1ZSA9IHJlYWR3KHZpcnRfYWRkcik7CisJCSoodTE2ICopIHZhbHVlID0gcmVhZHcodmlydF9hZGRyKTsKIAkJYnJlYWs7CiAJY2FzZSAzMjoKLQkJKih1MzIqKSB2YWx1ZSA9IHJlYWRsKHZpcnRfYWRkcik7CisJCSoodTMyICopIHZhbHVlID0gcmVhZGwodmlydF9hZGRyKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CkBAIC00NjgsMjQgKzQ0NiwyMSBAQAogfQogCiBhY3BpX3N0YXR1cwotYWNwaV9vc193cml0ZV9tZW1vcnkoCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzCXBoeXNfYWRkciwKLQl1MzIJCQl2YWx1ZSwKLQl1MzIJCQl3aWR0aCkKK2FjcGlfb3Nfd3JpdGVfbWVtb3J5KGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBwaHlzX2FkZHIsIHUzMiB2YWx1ZSwgdTMyIHdpZHRoKQogewotCXZvaWQgX19pb21lbQkJKnZpcnRfYWRkcjsKLQlpbnQJCQlpb21lbSA9IDA7CisJdm9pZCBfX2lvbWVtICp2aXJ0X2FkZHI7CisJaW50IGlvbWVtID0gMDsKIAogCWlmIChlZmlfZW5hYmxlZCkgewogCQlpZiAoRUZJX01FTU9SWV9XQiAmIGVmaV9tZW1fYXR0cmlidXRlcyhwaHlzX2FkZHIpKSB7CiAJCQkvKiBIQUNLIEFMRVJUISBXZSBjYW4gdXNlIHdyaXRlYi93L2wgb24gcmVhbCBtZW1vcnkgdG9vICovCi0JCQl2aXJ0X2FkZHIgPSAodm9pZCBfX2lvbWVtICopIHBoeXNfdG9fdmlydChwaHlzX2FkZHIpOworCQkJdmlydF9hZGRyID0gKHZvaWQgX19pb21lbSAqKXBoeXNfdG9fdmlydChwaHlzX2FkZHIpOwogCQl9IGVsc2UgewogCQkJaW9tZW0gPSAxOwogCQkJdmlydF9hZGRyID0gaW9yZW1hcChwaHlzX2FkZHIsIHdpZHRoKTsKIAkJfQogCX0gZWxzZQotCQl2aXJ0X2FkZHIgPSAodm9pZCBfX2lvbWVtICopIHBoeXNfdG9fdmlydChwaHlzX2FkZHIpOworCQl2aXJ0X2FkZHIgPSAodm9pZCBfX2lvbWVtICopcGh5c190b192aXJ0KHBoeXNfYWRkcik7CiAKIAlzd2l0Y2ggKHdpZHRoKSB7CiAJY2FzZSA4OgpAQCAtNTA3LDEwICs0ODIsOSBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotI2lmZGVmIENPTkZJR19BQ1BJX1BDSQotCiBhY3BpX3N0YXR1cwotYWNwaV9vc19yZWFkX3BjaV9jb25maWd1cmF0aW9uIChzdHJ1Y3QgYWNwaV9wY2lfaWQgKnBjaV9pZCwgdTMyIHJlZywgdm9pZCAqdmFsdWUsIHUzMiB3aWR0aCkKK2FjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbihzdHJ1Y3QgYWNwaV9wY2lfaWQgKiBwY2lfaWQsIHUzMiByZWcsCisJCQkgICAgICAgdm9pZCAqdmFsdWUsIHUzMiB3aWR0aCkKIHsKIAlpbnQgcmVzdWx0LCBzaXplOwogCkBAIC01MzQsMTUgKzUwOCwxNyBAQAogCUJVR19PTighcmF3X3BjaV9vcHMpOwogCiAJcmVzdWx0ID0gcmF3X3BjaV9vcHMtPnJlYWQocGNpX2lkLT5zZWdtZW50LCBwY2lfaWQtPmJ1cywKLQkJCQlQQ0lfREVWRk4ocGNpX2lkLT5kZXZpY2UsIHBjaV9pZC0+ZnVuY3Rpb24pLAotCQkJCXJlZywgc2l6ZSwgdmFsdWUpOworCQkJCSAgIFBDSV9ERVZGTihwY2lfaWQtPmRldmljZSwgcGNpX2lkLT5mdW5jdGlvbiksCisJCQkJICAgcmVnLCBzaXplLCB2YWx1ZSk7CiAKIAlyZXR1cm4gKHJlc3VsdCA/IEFFX0VSUk9SIDogQUVfT0spOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX3dyaXRlX3BjaV9jb25maWd1cmF0aW9uIChzdHJ1Y3QgYWNwaV9wY2lfaWQgKnBjaV9pZCwgdTMyIHJlZywgYWNwaV9pbnRlZ2VyIHZhbHVlLCB1MzIgd2lkdGgpCithY3BpX29zX3dyaXRlX3BjaV9jb25maWd1cmF0aW9uKHN0cnVjdCBhY3BpX3BjaV9pZCAqIHBjaV9pZCwgdTMyIHJlZywKKwkJCQlhY3BpX2ludGVnZXIgdmFsdWUsIHUzMiB3aWR0aCkKIHsKIAlpbnQgcmVzdWx0LCBzaXplOwogCkBAIC01NjMsNTYgKzUzOSw2MiBAQAogCUJVR19PTighcmF3X3BjaV9vcHMpOwogCiAJcmVzdWx0ID0gcmF3X3BjaV9vcHMtPndyaXRlKHBjaV9pZC0+c2VnbWVudCwgcGNpX2lkLT5idXMsCi0JCQkJUENJX0RFVkZOKHBjaV9pZC0+ZGV2aWNlLCBwY2lfaWQtPmZ1bmN0aW9uKSwKLQkJCQlyZWcsIHNpemUsIHZhbHVlKTsKKwkJCQkgICAgUENJX0RFVkZOKHBjaV9pZC0+ZGV2aWNlLCBwY2lfaWQtPmZ1bmN0aW9uKSwKKwkJCQkgICAgcmVnLCBzaXplLCB2YWx1ZSk7CiAKIAlyZXR1cm4gKHJlc3VsdCA/IEFFX0VSUk9SIDogQUVfT0spOwogfQogCiAvKiBUT0RPOiBDaGFuZ2UgY29kZSB0byB0YWtlIGFkdmFudGFnZSBvZiBkcml2ZXIgbW9kZWwgbW9yZSAqLwotc3RhdGljIHZvaWQKLWFjcGlfb3NfZGVyaXZlX3BjaV9pZF8yICgKLQlhY3BpX2hhbmRsZQkJcmhhbmRsZSwgICAgICAgIC8qIHVwcGVyIGJvdW5kICAqLwotCWFjcGlfaGFuZGxlCQljaGFuZGxlLCAgICAgICAgLyogY3VycmVudCBub2RlICovCi0Jc3RydWN0IGFjcGlfcGNpX2lkCSoqaWQsCi0JaW50CQkJKmlzX2JyaWRnZSwKLQl1OAkJCSpidXNfbnVtYmVyKQorc3RhdGljIHZvaWQgYWNwaV9vc19kZXJpdmVfcGNpX2lkXzIoYWNwaV9oYW5kbGUgcmhhbmRsZSwJLyogdXBwZXIgYm91bmQgICovCisJCQkJICAgIGFjcGlfaGFuZGxlIGNoYW5kbGUsCS8qIGN1cnJlbnQgbm9kZSAqLworCQkJCSAgICBzdHJ1Y3QgYWNwaV9wY2lfaWQgKippZCwKKwkJCQkgICAgaW50ICppc19icmlkZ2UsIHU4ICogYnVzX251bWJlcikKIHsKLQlhY3BpX2hhbmRsZQkJaGFuZGxlOwotCXN0cnVjdCBhY3BpX3BjaV9pZAkqcGNpX2lkID0gKmlkOwotCWFjcGlfc3RhdHVzCQlzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwkJdGVtcDsKLQlhY3BpX29iamVjdF90eXBlCXR5cGU7Ci0JdTgJCQl0dTg7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXN0cnVjdCBhY3BpX3BjaV9pZCAqcGNpX2lkID0gKmlkOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHRlbXA7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCXU4IHR1ODsKIAogCWFjcGlfZ2V0X3BhcmVudChjaGFuZGxlLCAmaGFuZGxlKTsKIAlpZiAoaGFuZGxlICE9IHJoYW5kbGUpIHsKLQkJYWNwaV9vc19kZXJpdmVfcGNpX2lkXzIocmhhbmRsZSwgaGFuZGxlLCAmcGNpX2lkLCBpc19icmlkZ2UsIGJ1c19udW1iZXIpOworCQlhY3BpX29zX2Rlcml2ZV9wY2lfaWRfMihyaGFuZGxlLCBoYW5kbGUsICZwY2lfaWQsIGlzX2JyaWRnZSwKKwkJCQkJYnVzX251bWJlcik7CiAKIAkJc3RhdHVzID0gYWNwaV9nZXRfdHlwZShoYW5kbGUsICZ0eXBlKTsKLQkJaWYgKCAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHx8ICh0eXBlICE9IEFDUElfVFlQRV9ERVZJQ0UpICkKKwkJaWYgKChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgfHwgKHR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkpCiAJCQlyZXR1cm47CiAKLQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgTUVUSE9EX05BTUVfX0FEUiwgTlVMTCwgJnRlbXApOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgTUVUSE9EX05BTUVfX0FEUiwgTlVMTCwKKwkJCQkJICAmdGVtcCk7CiAJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkJcGNpX2lkLT5kZXZpY2UgID0gQUNQSV9ISVdPUkQgKEFDUElfTE9EV09SRCAodGVtcCkpOwotCQkJcGNpX2lkLT5mdW5jdGlvbiA9IEFDUElfTE9XT1JEIChBQ1BJX0xPRFdPUkQgKHRlbXApKTsKKwkJCXBjaV9pZC0+ZGV2aWNlID0gQUNQSV9ISVdPUkQoQUNQSV9MT0RXT1JEKHRlbXApKTsKKwkJCXBjaV9pZC0+ZnVuY3Rpb24gPSBBQ1BJX0xPV09SRChBQ1BJX0xPRFdPUkQodGVtcCkpOwogCiAJCQlpZiAoKmlzX2JyaWRnZSkKIAkJCQlwY2lfaWQtPmJ1cyA9ICpidXNfbnVtYmVyOwogCiAJCQkvKiBhbnkgbmljZXIgd2F5IHRvIGdldCBidXMgbnVtYmVyIG9mIGJyaWRnZSA/ICovCi0JCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24ocGNpX2lkLCAweDBlLCAmdHU4LCA4KTsKLQkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJgotCQkJICAgICgodHU4ICYgMHg3ZikgPT0gMSB8fCAodHU4ICYgMHg3ZikgPT0gMikpIHsKLQkJCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24ocGNpX2lkLCAweDE4LCAmdHU4LCA4KTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9vc19yZWFkX3BjaV9jb25maWd1cmF0aW9uKHBjaV9pZCwgMHgwZSwgJnR1OCwKKwkJCQkJCQkgICA4KTsKKwkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKQorCQkJICAgICYmICgodHU4ICYgMHg3ZikgPT0gMSB8fCAodHU4ICYgMHg3ZikgPT0gMikpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24ocGNpX2lkLCAweDE4LAorCQkJCQkJCQkgICAmdHU4LCA4KTsKIAkJCQlpZiAoIUFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQkJCS8qIENlcnRhaW5seSBicm9rZW4uLi4gIEZJWCBNRSAqLwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJCSppc19icmlkZ2UgPSAxOwogCQkJCXBjaV9pZC0+YnVzID0gdHU4OwotCQkJCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbihwY2lfaWQsIDB4MTksICZ0dTgsIDgpOworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbihwY2lfaWQsIDB4MTksCisJCQkJCQkJCSAgICZ0dTgsIDgpOwogCQkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJCQkqYnVzX251bWJlciA9IHR1ODsKIAkJCQl9CkBAIC02MjIsMTEgKzYwNCw5IEBACiAJfQogfQogCi12b2lkCi1hY3BpX29zX2Rlcml2ZV9wY2lfaWQgKAotCWFjcGlfaGFuZGxlCQlyaGFuZGxlLCAgICAgICAgLyogdXBwZXIgYm91bmQgICovCi0JYWNwaV9oYW5kbGUJCWNoYW5kbGUsICAgICAgICAvKiBjdXJyZW50IG5vZGUgKi8KLQlzdHJ1Y3QgYWNwaV9wY2lfaWQJKippZCkKK3ZvaWQgYWNwaV9vc19kZXJpdmVfcGNpX2lkKGFjcGlfaGFuZGxlIHJoYW5kbGUsCS8qIHVwcGVyIGJvdW5kICAqLworCQkJICAgYWNwaV9oYW5kbGUgY2hhbmRsZSwJLyogY3VycmVudCBub2RlICovCisJCQkgICBzdHJ1Y3QgYWNwaV9wY2lfaWQgKippZCkKIHsKIAlpbnQgaXNfYnJpZGdlID0gMTsKIAl1OCBidXNfbnVtYmVyID0gKCppZCktPmJ1czsKQEAgLTYzNCw0OSArNjE0LDE1IEBACiAJYWNwaV9vc19kZXJpdmVfcGNpX2lkXzIocmhhbmRsZSwgY2hhbmRsZSwgaWQsICZpc19icmlkZ2UsICZidXNfbnVtYmVyKTsKIH0KIAotI2Vsc2UgLyohQ09ORklHX0FDUElfUENJKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfb3Nfd3JpdGVfcGNpX2NvbmZpZ3VyYXRpb24gKAotCXN0cnVjdCBhY3BpX3BjaV9pZAkqcGNpX2lkLAotCXUzMgkJCXJlZywKLQlhY3BpX2ludGVnZXIJCXZhbHVlLAotCXUzMgkJCXdpZHRoKQorc3RhdGljIHZvaWQgYWNwaV9vc19leGVjdXRlX2RlZmVycmVkKHZvaWQgKmNvbnRleHQpCiB7Ci0JcmV0dXJuIEFFX1NVUFBPUlQ7Ci19CisJc3RydWN0IGFjcGlfb3NfZHBjICpkcGMgPSBOVUxMOwogCi1hY3BpX3N0YXR1cwotYWNwaV9vc19yZWFkX3BjaV9jb25maWd1cmF0aW9uICgKLQlzdHJ1Y3QgYWNwaV9wY2lfaWQJKnBjaV9pZCwKLQl1MzIJCQlyZWcsCi0Jdm9pZAkJCSp2YWx1ZSwKLQl1MzIJCQl3aWR0aCkKLXsKLQlyZXR1cm4gQUVfU1VQUE9SVDsKLX0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJvc19leGVjdXRlX2RlZmVycmVkIik7CiAKLXZvaWQKLWFjcGlfb3NfZGVyaXZlX3BjaV9pZCAoCi0JYWNwaV9oYW5kbGUJCXJoYW5kbGUsICAgICAgICAvKiB1cHBlciBib3VuZCAgKi8KLQlhY3BpX2hhbmRsZQkJY2hhbmRsZSwgICAgICAgIC8qIGN1cnJlbnQgbm9kZSAqLwotCXN0cnVjdCBhY3BpX3BjaV9pZAkqKmlkKQotewotfQotCi0jZW5kaWYgLypDT05GSUdfQUNQSV9QQ0kqLwotCi1zdGF0aWMgdm9pZAotYWNwaV9vc19leGVjdXRlX2RlZmVycmVkICgKLQl2b2lkICpjb250ZXh0KQotewotCXN0cnVjdCBhY3BpX29zX2RwYwkqZHBjID0gTlVMTDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJvc19leGVjdXRlX2RlZmVycmVkIik7Ci0KLQlkcGMgPSAoc3RydWN0IGFjcGlfb3NfZHBjICopIGNvbnRleHQ7CisJZHBjID0gKHN0cnVjdCBhY3BpX29zX2RwYyAqKWNvbnRleHQ7CiAJaWYgKCFkcGMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIChOVUxMKSBjb250ZXh0LlxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCAoTlVMTCkgY29udGV4dC5cbiIpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCkBAIC02ODgsMjEgKzYzNCwyMSBAQAogfQogCiBhY3BpX3N0YXR1cwotYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKAotCXUzMgkJCXByaW9yaXR5LAotCWFjcGlfb3NkX2V4ZWNfY2FsbGJhY2sJZnVuY3Rpb24sCi0Jdm9pZAkJCSpjb250ZXh0KQorYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKHUzMiBwcmlvcml0eSwKKwkJCSAgICBhY3BpX29zZF9leGVjX2NhbGxiYWNrIGZ1bmN0aW9uLCB2b2lkICpjb250ZXh0KQogewotCWFjcGlfc3RhdHVzIAkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfb3NfZHBjCSpkcGM7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CSp0YXNrOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX29zX2RwYyAqZHBjOworCXN0cnVjdCB3b3JrX3N0cnVjdCAqdGFzazsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJvc19xdWV1ZV9mb3JfZXhlY3V0aW9uIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgib3NfcXVldWVfZm9yX2V4ZWN1dGlvbiIpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIlNjaGVkdWxpbmcgZnVuY3Rpb24gWyVwKCVwKV0gZm9yIGRlZmVycmVkIGV4ZWN1dGlvbi5cbiIsIGZ1bmN0aW9uLCBjb250ZXh0KSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJICAiU2NoZWR1bGluZyBmdW5jdGlvbiBbJXAoJXApXSBmb3IgZGVmZXJyZWQgZXhlY3V0aW9uLlxuIiwKKwkJCSAgZnVuY3Rpb24sIGNvbnRleHQpKTsKIAogCWlmICghZnVuY3Rpb24pCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAogCS8qCiAJICogQWxsb2NhdGUvaW5pdGlhbGl6ZSBEUEMgc3RydWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgbWVtb3J5IHdpbGwgYmUKQEAgLTcxNSwxNDYgKzY2MSw5NCBAQAogCSAqIGZyb20gdGhlIHNhbWUgbWVtb3J5LgogCSAqLwogCi0JZHBjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfb3NfZHBjKStzaXplb2Yoc3RydWN0IHdvcmtfc3RydWN0KSwgR0ZQX0FUT01JQyk7CisJZHBjID0KKwkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfb3NfZHBjKSArIHNpemVvZihzdHJ1Y3Qgd29ya19zdHJ1Y3QpLAorCQkgICAgR0ZQX0FUT01JQyk7CiAJaWYgKCFkcGMpCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAKIAlkcGMtPmZ1bmN0aW9uID0gZnVuY3Rpb247CiAJZHBjLT5jb250ZXh0ID0gY29udGV4dDsKIAotCXRhc2sgPSAodm9pZCAqKShkcGMrMSk7Ci0JSU5JVF9XT1JLKHRhc2ssIGFjcGlfb3NfZXhlY3V0ZV9kZWZlcnJlZCwgKHZvaWQqKWRwYyk7CisJdGFzayA9ICh2b2lkICopKGRwYyArIDEpOworCUlOSVRfV09SSyh0YXNrLCBhY3BpX29zX2V4ZWN1dGVfZGVmZXJyZWQsICh2b2lkICopZHBjKTsKIAogCWlmICghcXVldWVfd29yayhrYWNwaWRfd3EsIHRhc2spKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQ2FsbCB0byBxdWV1ZV93b3JrKCkgZmFpbGVkLlxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkNhbGwgdG8gcXVldWVfd29yaygpIGZhaWxlZC5cbiIpKTsKIAkJa2ZyZWUoZHBjKTsKIAkJc3RhdHVzID0gQUVfRVJST1I7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbik7CiAKLXZvaWQKLWFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUoCi0Jdm9pZCAqY29udGV4dCkKK3ZvaWQgYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZSh2b2lkICpjb250ZXh0KQogewogCWZsdXNoX3dvcmtxdWV1ZShrYWNwaWRfd3EpOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUpOwogCiAvKgogICogQWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgYSBzcGlubG9jayBhbmQgaW5pdGlhbGl6ZSBpdC4KICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfb3NfY3JlYXRlX2xvY2sgKAotCWFjcGlfaGFuZGxlCSpvdXRfaGFuZGxlKQorYWNwaV9zdGF0dXMgYWNwaV9vc19jcmVhdGVfbG9jayhhY3BpX2hhbmRsZSAqIG91dF9oYW5kbGUpCiB7CiAJc3BpbmxvY2tfdCAqbG9ja19wdHI7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgib3NfY3JlYXRlX2xvY2siKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJvc19jcmVhdGVfbG9jayIpOwogCiAJbG9ja19wdHIgPSBhY3BpX29zX2FsbG9jYXRlKHNpemVvZihzcGlubG9ja190KSk7CiAKIAlzcGluX2xvY2tfaW5pdChsb2NrX3B0cik7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9NVVRFWCwgIkNyZWF0aW5nIHNwaW5sb2NrWyVwXS5cbiIsIGxvY2tfcHRyKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwgIkNyZWF0aW5nIHNwaW5sb2NrWyVwXS5cbiIsIGxvY2tfcHRyKSk7CiAKIAkqb3V0X2hhbmRsZSA9IGxvY2tfcHRyOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKgogICogRGVhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciBhIHNwaW5sb2NrLgogICovCi12b2lkCi1hY3BpX29zX2RlbGV0ZV9sb2NrICgKLQlhY3BpX2hhbmRsZQloYW5kbGUpCit2b2lkIGFjcGlfb3NfZGVsZXRlX2xvY2soYWNwaV9oYW5kbGUgaGFuZGxlKQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJvc19jcmVhdGVfbG9jayIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm9zX2NyZWF0ZV9sb2NrIik7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9NVVRFWCwgIkRlbGV0aW5nIHNwaW5sb2NrWyVwXS5cbiIsIGhhbmRsZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTVVURVgsICJEZWxldGluZyBzcGlubG9ja1slcF0uXG4iLCBoYW5kbGUpKTsKIAogCWFjcGlfb3NfZnJlZShoYW5kbGUpOwogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLS8qCi0gKiBBY3F1aXJlIGEgc3BpbmxvY2suCi0gKgotICogaGFuZGxlIGlzIGEgcG9pbnRlciB0byB0aGUgc3BpbmxvY2tfdC4KLSAqIGZsYWdzIGlzICpub3QqIHRoZSByZXN1bHQgb2Ygc2F2ZV9mbGFncyAtIGl0IGlzIGFuIEFDUEktc3BlY2lmaWMgZmxhZyB2YXJpYWJsZQotICogICB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSBhdCBpbnRlcnJ1cHQgbGV2ZWwuCi0gKi8KLXZvaWQKLWFjcGlfb3NfYWNxdWlyZV9sb2NrICgKLQlhY3BpX2hhbmRsZQloYW5kbGUsCi0JdTMyCQlmbGFncykKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgib3NfYWNxdWlyZV9sb2NrIik7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9NVVRFWCwgIkFjcXVpcmluZyBzcGlubG9ja1slcF0gZnJvbSAlcyBsZXZlbFxuIiwgaGFuZGxlLAotCQkoKGZsYWdzICYgQUNQSV9OT1RfSVNSKSA/ICJub24taW50ZXJydXB0IiA6ICJpbnRlcnJ1cHQiKSkpOwotCi0JaWYgKGZsYWdzICYgQUNQSV9OT1RfSVNSKQotCQlBQ1BJX0RJU0FCTEVfSVJRUygpOwotCi0Jc3Bpbl9sb2NrKChzcGlubG9ja190ICopaGFuZGxlKTsKLQotCXJldHVybl9WT0lEOwotfQotCi0KLS8qCi0gKiBSZWxlYXNlIGEgc3BpbmxvY2suIFNlZSBhYm92ZS4KLSAqLwotdm9pZAotYWNwaV9vc19yZWxlYXNlX2xvY2sgKAotCWFjcGlfaGFuZGxlCWhhbmRsZSwKLQl1MzIJCWZsYWdzKQotewotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJvc19yZWxlYXNlX2xvY2siKTsKLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLCAiUmVsZWFzaW5nIHNwaW5sb2NrWyVwXSBmcm9tICVzIGxldmVsXG4iLCBoYW5kbGUsCi0JCSgoZmxhZ3MgJiBBQ1BJX05PVF9JU1IpID8gIm5vbi1pbnRlcnJ1cHQiIDogImludGVycnVwdCIpKSk7Ci0KLQlzcGluX3VubG9jaygoc3BpbmxvY2tfdCAqKWhhbmRsZSk7Ci0KLQlpZiAoZmxhZ3MgJiBBQ1BJX05PVF9JU1IpCi0JCUFDUElfRU5BQkxFX0lSUVMoKTsKLQotCXJldHVybl9WT0lEOwotfQotCi0KIGFjcGlfc3RhdHVzCi1hY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUoCi0JdTMyCQltYXhfdW5pdHMsCi0JdTMyCQlpbml0aWFsX3VuaXRzLAotCWFjcGlfaGFuZGxlCSpoYW5kbGUpCithY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUodTMyIG1heF91bml0cywgdTMyIGluaXRpYWxfdW5pdHMsIGFjcGlfaGFuZGxlICogaGFuZGxlKQogewotCXN0cnVjdCBzZW1hcGhvcmUJKnNlbSA9IE5VTEw7CisJc3RydWN0IHNlbWFwaG9yZSAqc2VtID0gTlVMTDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJvc19jcmVhdGVfc2VtYXBob3JlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgib3NfY3JlYXRlX3NlbWFwaG9yZSIpOwogCiAJc2VtID0gYWNwaV9vc19hbGxvY2F0ZShzaXplb2Yoc3RydWN0IHNlbWFwaG9yZSkpOwogCWlmICghc2VtKQotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCW1lbXNldChzZW0sIDAsIHNpemVvZihzdHJ1Y3Qgc2VtYXBob3JlKSk7CiAKIAlzZW1hX2luaXQoc2VtLCBpbml0aWFsX3VuaXRzKTsKIAotCSpoYW5kbGUgPSAoYWNwaV9oYW5kbGUqKXNlbTsKKwkqaGFuZGxlID0gKGFjcGlfaGFuZGxlICopIHNlbTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLCAiQ3JlYXRpbmcgc2VtYXBob3JlWyVwfCVkXS5cbiIsICpoYW5kbGUsIGluaXRpYWxfdW5pdHMpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX01VVEVYLCAiQ3JlYXRpbmcgc2VtYXBob3JlWyVwfCVkXS5cbiIsCisJCQkgICpoYW5kbGUsIGluaXRpYWxfdW5pdHMpKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlKTsKIAogLyoKICAqIFRPRE86IEEgYmV0dGVyIHdheSB0byBkZWxldGUgc2VtYXBob3Jlcz8gIExpbnV4IGRvZXNuJ3QgaGF2ZSBhCkBAIC04NjMsMjUgKzc1NywyNCBAQAogICogd2UgYXQgbGVhc3QgY2hlY2sgZm9yIGJsb2NrZWQgdGhyZWFkcyBhbmQgc2lnbmFsL2NhbmNlbCB0aGVtPwogICovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUoCi0JYWNwaV9oYW5kbGUJaGFuZGxlKQorYWNwaV9zdGF0dXMgYWNwaV9vc19kZWxldGVfc2VtYXBob3JlKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKLQlzdHJ1Y3Qgc2VtYXBob3JlICpzZW0gPSAoc3RydWN0IHNlbWFwaG9yZSopIGhhbmRsZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlICpzZW0gPSAoc3RydWN0IHNlbWFwaG9yZSAqKWhhbmRsZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJvc19kZWxldGVfc2VtYXBob3JlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgib3NfZGVsZXRlX3NlbWFwaG9yZSIpOwogCiAJaWYgKCFzZW0pCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLCAiRGVsZXRpbmcgc2VtYXBob3JlWyVwXS5cbiIsIGhhbmRsZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTVVURVgsICJEZWxldGluZyBzZW1hcGhvcmVbJXBdLlxuIiwgaGFuZGxlKSk7CiAKLQlhY3BpX29zX2ZyZWUoc2VtKTsgc2VtID0gIE5VTEw7CisJYWNwaV9vc19mcmVlKHNlbSk7CisJc2VtID0gTlVMTDsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9vc19kZWxldGVfc2VtYXBob3JlKTsKIAogLyoKICAqIFRPRE86IFRoZSBrZXJuZWwgZG9lc24ndCBoYXZlIGEgJ2Rvd25fdGltZW91dCcgZnVuY3Rpb24gLS0gaGFkIHRvCkBAIC04OTIsMzEgKzc4NSwyNyBAQAogICoKICAqIFRPRE86IFN1cHBvcnQgZm9yIHVuaXRzID4gMT8KICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfb3Nfd2FpdF9zZW1hcGhvcmUoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQl1MzIJCQl1bml0cywKLQl1MTYJCQl0aW1lb3V0KQorYWNwaV9zdGF0dXMgYWNwaV9vc193YWl0X3NlbWFwaG9yZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiB1bml0cywgdTE2IHRpbWVvdXQpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBzZW1hcGhvcmUJKnNlbSA9IChzdHJ1Y3Qgc2VtYXBob3JlKiloYW5kbGU7Ci0JaW50CQkJcmV0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3Qgc2VtYXBob3JlICpzZW0gPSAoc3RydWN0IHNlbWFwaG9yZSAqKWhhbmRsZTsKKwlpbnQgcmV0ID0gMDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJvc193YWl0X3NlbWFwaG9yZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm9zX3dhaXRfc2VtYXBob3JlIik7CiAKIAlpZiAoIXNlbSB8fCAodW5pdHMgPCAxKSkKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCiAJaWYgKHVuaXRzID4gMSkKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9TVVBQT1JUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NVUFBPUlQpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsICJXYWl0aW5nIGZvciBzZW1hcGhvcmVbJXB8JWR8JWRdXG4iLCBoYW5kbGUsIHVuaXRzLCB0aW1lb3V0KSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwgIldhaXRpbmcgZm9yIHNlbWFwaG9yZVslcHwlZHwlZF1cbiIsCisJCQkgIGhhbmRsZSwgdW5pdHMsIHRpbWVvdXQpKTsKIAogCWlmIChpbl9hdG9taWMoKSkKIAkJdGltZW91dCA9IDA7CiAKLQlzd2l0Y2ggKHRpbWVvdXQpCi0JeworCXN3aXRjaCAodGltZW91dCkgewogCQkvKgogCQkgKiBObyBXYWl0OgogCQkgKiAtLS0tLS0tLQpAQCAtOTI0LDggKzgxMyw4IEBACiAJCSAqIGFjcXVpcmUgdGhlIHNlbWFwaG9yZSBpZiBhdmFpbGFibGUgb3RoZXJ3aXNlIHJldHVybiBBRV9USU1FCiAJCSAqIChhLmsuYS4gJ3dvdWxkIGJsb2NrJykuCiAJCSAqLwotCQljYXNlIDA6Ci0JCWlmKGRvd25fdHJ5bG9jayhzZW0pKQorCWNhc2UgMDoKKwkJaWYgKGRvd25fdHJ5bG9jayhzZW0pKQogCQkJc3RhdHVzID0gQUVfVElNRTsKIAkJYnJlYWs7CiAKQEAgLTkzMyw3ICs4MjIsNyBAQAogCQkgKiBXYWl0IEluZGVmaW5pdGVseToKIAkJICogLS0tLS0tLS0tLS0tLS0tLS0tCiAJCSAqLwotCQljYXNlIEFDUElfV0FJVF9GT1JFVkVSOgorCWNhc2UgQUNQSV9XQUlUX0ZPUkVWRVI6CiAJCWRvd24oc2VtKTsKIAkJYnJlYWs7CiAKQEAgLTk0MSwxMSArODMwLDExIEBACiAJCSAqIFdhaXQgdy8gVGltZW91dDoKIAkJICogLS0tLS0tLS0tLS0tLS0tLQogCQkgKi8KLQkJZGVmYXVsdDoKKwlkZWZhdWx0OgogCQkvLyBUT0RPOiBBIGJldHRlciB0aW1lb3V0IGFsZ29yaXRobT8KIAkJewogCQkJaW50IGkgPSAwOwotCQkJc3RhdGljIGNvbnN0IGludCBxdWFudHVtX21zID0gMTAwMC9IWjsKKwkJCXN0YXRpYyBjb25zdCBpbnQgcXVhbnR1bV9tcyA9IDEwMDAgLyBIWjsKIAogCQkJcmV0ID0gZG93bl90cnlsb2NrKHNlbSk7CiAJCQlmb3IgKGkgPSB0aW1lb3V0OyAoaSA+IDAgJiYgcmV0IDwgMCk7IGkgLT0gcXVhbnR1bV9tcykgewpAQCAtOTUzLDcgKzg0Miw3IEBACiAJCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKIAkJCQlyZXQgPSBkb3duX3RyeWxvY2soc2VtKTsKIAkJCX0KLQkKKwogCQkJaWYgKHJldCAhPSAwKQogCQkJCXN0YXR1cyA9IEFFX1RJTUU7CiAJCX0KQEAgLTk2MSw0NyArODUwLDQ4IEBACiAJfQogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiRmFpbGVkIHRvIGFjcXVpcmUgc2VtYXBob3JlWyVwfCVkfCVkXSwgJXNcbiIsIAotCQkJaGFuZGxlLCB1bml0cywgdGltZW91dCwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKLQl9Ci0JZWxzZSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLCAiQWNxdWlyZWQgc2VtYXBob3JlWyVwfCVkfCVkXVxuIiwgaGFuZGxlLCB1bml0cywgdGltZW91dCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkZhaWxlZCB0byBhY3F1aXJlIHNlbWFwaG9yZVslcHwlZHwlZF0sICVzXG4iLAorCQkJCSAgaGFuZGxlLCB1bml0cywgdGltZW91dCwKKwkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJfSBlbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwKKwkJCQkgICJBY3F1aXJlZCBzZW1hcGhvcmVbJXB8JWR8JWRdXG4iLCBoYW5kbGUsCisJCQkJICB1bml0cywgdGltZW91dCkpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9vc193YWl0X3NlbWFwaG9yZSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9vc193YWl0X3NlbWFwaG9yZSk7CiAKIC8qCiAgKiBUT0RPOiBTdXBwb3J0IGZvciB1bml0cyA+IDE/CiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUoCi0gICAgYWNwaV9oYW5kbGUgCSAgICBoYW5kbGUsCi0gICAgdTMyIAkJICAgIHVuaXRzKQorYWNwaV9zdGF0dXMgYWNwaV9vc19zaWduYWxfc2VtYXBob3JlKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHVuaXRzKQogewotCXN0cnVjdCBzZW1hcGhvcmUgKnNlbSA9IChzdHJ1Y3Qgc2VtYXBob3JlICopIGhhbmRsZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlICpzZW0gPSAoc3RydWN0IHNlbWFwaG9yZSAqKWhhbmRsZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJvc19zaWduYWxfc2VtYXBob3JlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgib3Nfc2lnbmFsX3NlbWFwaG9yZSIpOwogCiAJaWYgKCFzZW0gfHwgKHVuaXRzIDwgMSkpCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAogCWlmICh1bml0cyA+IDEpCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfU1VQUE9SVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLCAiU2lnbmFsaW5nIHNlbWFwaG9yZVslcHwlZF1cbiIsIGhhbmRsZSwgdW5pdHMpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX01VVEVYLCAiU2lnbmFsaW5nIHNlbWFwaG9yZVslcHwlZF1cbiIsIGhhbmRsZSwKKwkJCSAgdW5pdHMpKTsKIAogCXVwKHNlbSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZSk7CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotdTMyCi1hY3BpX29zX2dldF9saW5lKGNoYXIgKmJ1ZmZlcikKK3UzMiBhY3BpX29zX2dldF9saW5lKGNoYXIgKmJ1ZmZlcikKIHsKIAogI2lmZGVmIEVOQUJMRV9ERUJVR0dFUgpAQCAtMTAxOCwyMiArOTA4LDIxIEBACiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogLyogQXNzdW1lcyBubyB1bnJlYWRhYmxlIGhvbGVzIGluYmV0d2VlbiAqLwotdTgKLWFjcGlfb3NfcmVhZGFibGUodm9pZCAqcHRyLCBhY3BpX3NpemUgbGVuKQordTggYWNwaV9vc19yZWFkYWJsZSh2b2lkICpwdHIsIGFjcGlfc2l6ZSBsZW4pCiB7Ci0jaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCiAJY2hhciB0bXA7Ci0JcmV0dXJuICFfX2dldF91c2VyKHRtcCwgKGNoYXIgX191c2VyICopcHRyKSAmJiAhX19nZXRfdXNlcih0bXAsIChjaGFyIF9fdXNlciAqKXB0ciArIGxlbiAtIDEpOworCXJldHVybiAhX19nZXRfdXNlcih0bXAsIChjaGFyIF9fdXNlciAqKXB0cikKKwkgICAgJiYgIV9fZ2V0X3VzZXIodG1wLCAoY2hhciBfX3VzZXIgKilwdHIgKyBsZW4gLSAxKTsKICNlbmRpZgogCXJldHVybiAxOwogfQogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLXU4Ci1hY3BpX29zX3dyaXRhYmxlKHZvaWQgKnB0ciwgYWNwaV9zaXplIGxlbikKK3U4IGFjcGlfb3Nfd3JpdGFibGUodm9pZCAqcHRyLCBhY3BpX3NpemUgbGVuKQogewogCS8qIGNvdWxkIGRvIGR1bW15IHdyaXRlIChyYWN5KSBvciBhIGtlcm5lbCBwYWdlIHRhYmxlIGxvb2t1cC4KIAkgICBUaGUgbGF0ZXIgbWF5IGJlIGRpZmZpY3VsdCBhdCBlYXJseSBib290IHdoZW4ga21hcCBkb2Vzbid0IHdvcmsgeWV0LiAqLwpAQCAtMTA0MSw4ICs5MzAsNyBAQAogfQogI2VuZGlmCiAKLXUzMgotYWNwaV9vc19nZXRfdGhyZWFkX2lkICh2b2lkKQordTMyIGFjcGlfb3NfZ2V0X3RocmVhZF9pZCh2b2lkKQogewogCWlmICghaW5fYXRvbWljKCkpCiAJCXJldHVybiBjdXJyZW50LT5waWQ7CkBAIC0xMDUwLDEzICs5MzgsOSBAQAogCXJldHVybiAwOwogfQogCi1hY3BpX3N0YXR1cwotYWNwaV9vc19zaWduYWwgKAotICAgIHUzMgkJZnVuY3Rpb24sCi0gICAgdm9pZAkqaW5mbykKK2FjcGlfc3RhdHVzIGFjcGlfb3Nfc2lnbmFsKHUzMiBmdW5jdGlvbiwgdm9pZCAqaW5mbykKIHsKLQlzd2l0Y2ggKGZ1bmN0aW9uKQotCXsKKwlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBBQ1BJX1NJR05BTF9GQVRBTDoKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRmF0YWwgb3Bjb2RlIGV4ZWN1dGVkXG4iKTsKIAkJYnJlYWs7CkBAIC0xMDc2LDEzICs5NjAsMTMgQEAKIAogCXJldHVybiBBRV9PSzsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX29zX3NpZ25hbCk7CiAKLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX29zX25hbWVfc2V0dXAoY2hhciAqc3RyKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9vc19uYW1lX3NldHVwKGNoYXIgKnN0cikKIHsKIAljaGFyICpwID0gYWNwaV9vc19uYW1lOwotCWludCBjb3VudCA9IEFDUElfTUFYX09WRVJSSURFX0xFTi0xOworCWludCBjb3VudCA9IEFDUElfTUFYX09WRVJSSURFX0xFTiAtIDE7CiAKIAlpZiAoIXN0ciB8fCAhKnN0cikKIAkJcmV0dXJuIDA7CkBAIC0xMDk4LDcgKzk4Miw3IEBACiAJKnAgPSAwOwogCiAJcmV0dXJuIDE7Ci0JCQorCiB9CiAKIF9fc2V0dXAoImFjcGlfb3NfbmFtZT0iLCBhY3BpX29zX25hbWVfc2V0dXApOwpAQCAtMTEwOCwxNiArOTkyLDE1IEBACiAgKiBlbXB0eSBzdHJpbmcgZGlzYWJsZXMgX09TSQogICogVEJEIGFkZGl0aW9uYWwgc3RyaW5nIGFkZHMgdG8gX09TSQogICovCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV9vc2lfc2V0dXAoY2hhciAqc3RyKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9vc2lfc2V0dXAoY2hhciAqc3RyKQogewogCWlmIChzdHIgPT0gTlVMTCB8fCAqc3RyID09ICdcMCcpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIl9PU0kgbWV0aG9kIGRpc2FibGVkXG4iKTsKIAkJYWNwaV9nYmxfY3JlYXRlX29zaV9tZXRob2QgPSBGQUxTRTsKLQl9IGVsc2UKLQl7CisJfSBlbHNlIHsKIAkJLyogVEJEICovCi0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIl9PU0kgYWRkaXRpb25hbCBzdHJpbmcgaWdub3JlZCAtLSAlc1xuIiwgc3RyKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiX09TSSBhZGRpdGlvbmFsIHN0cmluZyBpZ25vcmVkIC0tICVzXG4iLAorCQkgICAgICAgc3RyKTsKIAl9CiAKIAlyZXR1cm4gMTsKQEAgLTExMjYsOCArMTAwOSw3IEBACiBfX3NldHVwKCJhY3BpX29zaT0iLCBhY3BpX29zaV9zZXR1cCk7CiAKIC8qIGVuYWJsZSBzZXJpYWxpemF0aW9uIHRvIGNvbWJhdCBBRV9BTFJFQURZX0VYSVNUUyBlcnJvcnMgKi8KLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3NlcmlhbGl6ZV9zZXR1cChjaGFyICpzdHIpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3NlcmlhbGl6ZV9zZXR1cChjaGFyICpzdHIpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggInNlcmlhbGl6ZSBlbmFibGVkXG4iKTsKIApAQCAtMTE0Nyw4ICsxMDI5LDcgQEAKICAqIFJ1bi10aW1lIGV2ZW50cyBvbiB0aGUgc2FtZSBHUEUgdGhpcyBmbGFnIGlzIGF2YWlsYWJsZQogICogdG8gdGVsbCBMaW51eCB0byBrZWVwIHRoZSB3YWtlLXRpbWUgR1BFcyBlbmFibGVkIGF0IHJ1bi10aW1lLgogICovCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV93YWtlX2dwZXNfYWx3YXlzX29uX3NldHVwKGNoYXIgKnN0cikKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfd2FrZV9ncGVzX2Fsd2F5c19vbl9zZXR1cChjaGFyICpzdHIpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIndha2UgR1BFcyBub3QgZGlzYWJsZWRcbiIpOwogCkBAIC0xMTU5LDggKzEwNDAsNyBAQAogCiBfX3NldHVwKCJhY3BpX3dha2VfZ3Blc19hbHdheXNfb24iLCBhY3BpX3dha2VfZ3Blc19hbHdheXNfb25fc2V0dXApOwogCi1pbnQgX19pbml0Ci1hY3BpX2hvdGtleV9zZXR1cChjaGFyICpzdHIpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2hvdGtleV9zZXR1cChjaGFyICpzdHIpCiB7CiAJYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCA9IEZBTFNFOwogCXJldHVybiAxOwpAQCAtMTE3NCw1ICsxMDU0LDEzMiBAQAogICovCiB1bnNpZ25lZCBpbnQgbWF4X2NzdGF0ZSA9IEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUjsKIAotCiBFWFBPUlRfU1lNQk9MKG1heF9jc3RhdGUpOworCisvKgorICogQWNxdWlyZSBhIHNwaW5sb2NrLgorICoKKyAqIGhhbmRsZSBpcyBhIHBvaW50ZXIgdG8gdGhlIHNwaW5sb2NrX3QuCisgKiBmbGFncyBpcyAqbm90KiB0aGUgcmVzdWx0IG9mIHNhdmVfZmxhZ3MgLSBpdCBpcyBhbiBBQ1BJLXNwZWNpZmljIGZsYWcgdmFyaWFibGUKKyAqICAgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB3ZSBhcmUgYXQgaW50ZXJydXB0IGxldmVsLgorICovCisKK3Vuc2lnbmVkIGxvbmcgYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoKHNwaW5sb2NrX3QgKikgaGFuZGxlLCBmbGFncyk7CisJcmV0dXJuIGZsYWdzOworfQorCisvKgorICogUmVsZWFzZSBhIHNwaW5sb2NrLiBTZWUgYWJvdmUuCisgKi8KKwordm9pZCBhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2hhbmRsZSBoYW5kbGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgoc3BpbmxvY2tfdCAqKSBoYW5kbGUsIGZsYWdzKTsKK30KKworI2lmbmRlZiBBQ1BJX1VTRV9MT0NBTF9DQUNIRQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX29zX2NyZWF0ZV9jYWNoZQorICoKKyAqIFBBUkFNRVRFUlM6ICBDYWNoZU5hbWUgICAgICAgLSBBc2NpaSBuYW1lIGZvciB0aGUgY2FjaGUKKyAqICAgICAgICAgICAgICBPYmplY3RTaXplICAgICAgLSBTaXplIG9mIGVhY2ggY2FjaGVkIG9iamVjdAorICogICAgICAgICAgICAgIE1heERlcHRoICAgICAgICAtIE1heGltdW0gZGVwdGggb2YgdGhlIGNhY2hlIChpbiBvYmplY3RzKQorICogICAgICAgICAgICAgIFJldHVybkNhY2hlICAgICAtIFdoZXJlIHRoZSBuZXcgY2FjaGUgb2JqZWN0IGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBjYWNoZSBvYmplY3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9vc19jcmVhdGVfY2FjaGUoY2hhciAqbmFtZSwgdTE2IHNpemUsIHUxNiBkZXB0aCwgYWNwaV9jYWNoZV90ICoqIGNhY2hlKQoreworCSpjYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKG5hbWUsIHNpemUsIDAsIDAsIE5VTEwsIE5VTEwpOworCXJldHVybiBBRV9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9vc19wdXJnZV9jYWNoZQorICoKKyAqIFBBUkFNRVRFUlM6ICBDYWNoZSAgICAgICAgICAgLSBIYW5kbGUgdG8gY2FjaGUgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBGcmVlIGFsbCBvYmplY3RzIHdpdGhpbiB0aGUgcmVxdWVzdGVkIGNhY2hlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfb3NfcHVyZ2VfY2FjaGUoYWNwaV9jYWNoZV90ICogY2FjaGUpCit7CisJKHZvaWQpa21lbV9jYWNoZV9zaHJpbmsoY2FjaGUpOworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX29zX2RlbGV0ZV9jYWNoZQorICoKKyAqIFBBUkFNRVRFUlM6ICBDYWNoZSAgICAgICAgICAgLSBIYW5kbGUgdG8gY2FjaGUgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBGcmVlIGFsbCBvYmplY3RzIHdpdGhpbiB0aGUgcmVxdWVzdGVkIGNhY2hlIGFuZCBkZWxldGUgdGhlCisgKiAgICAgICAgICAgICAgY2FjaGUgb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfb3NfZGVsZXRlX2NhY2hlKGFjcGlfY2FjaGVfdCAqIGNhY2hlKQoreworCSh2b2lkKWttZW1fY2FjaGVfZGVzdHJveShjYWNoZSk7CisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfb3NfcmVsZWFzZV9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgQ2FjaGUgICAgICAgLSBIYW5kbGUgdG8gY2FjaGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgT2JqZWN0ICAgICAgLSBUaGUgb2JqZWN0IHRvIGJlIHJlbGVhc2VkCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUmVsZWFzZSBhbiBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBjYWNoZS4gIElmIGNhY2hlIGlzIGZ1bGwsCisgKiAgICAgICAgICAgICAgdGhlIG9iamVjdCBpcyBkZWxldGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfb3NfcmVsZWFzZV9vYmplY3QoYWNwaV9jYWNoZV90ICogY2FjaGUsIHZvaWQgKm9iamVjdCkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoY2FjaGUsIG9iamVjdCk7CisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfb3NfYWNxdWlyZV9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgQ2FjaGUgICAgICAgICAgIC0gSGFuZGxlIHRvIGNhY2hlIG9iamVjdAorICogICAgICAgICAgICAgIFJldHVybk9iamVjdCAgICAtIFdoZXJlIHRoZSBvYmplY3QgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEdldCBhbiBvYmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkIGNhY2hlLiAgSWYgY2FjaGUgaXMgZW1wdHksCisgKiAgICAgICAgICAgICAgdGhlIG9iamVjdCBpcyBhbGxvY2F0ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAqYWNwaV9vc19hY3F1aXJlX29iamVjdChhY3BpX2NhY2hlX3QgKiBjYWNoZSkKK3sKKwl2b2lkICpvYmplY3QgPSBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlLCBHRlBfS0VSTkVMKTsKKwlXQVJOX09OKCFvYmplY3QpOworCXJldHVybiBvYmplY3Q7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvTWFrZWZpbGUKaW5kZXggYmJkZDI4Ni4uZGIyNGVlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgYWxsIExpbnV4IEFDUEkgaW50ZXJwcmV0ZXIgc3ViZGlyZWN0b3JpZXMKICMKIAotb2JqLXkgOj0gcHNhcmdzLm8gICAgcHNwYXJzZS5vICBwc3RyZWUubyAgIHBzd2Fsay5vICBcCitvYmoteSA6PSBwc2FyZ3MubyAgICBwc3BhcnNlLm8gIHBzbG9vcC5vIHBzdHJlZS5vICAgcHN3YWxrLm8gIFwKIAkgcHNvcGNvZGUubyAgcHNzY29wZS5vICBwc3V0aWxzLm8gIHBzeGZhY2UubwogCiBFWFRSQV9DRkxBR1MgKz0gJChBQ1BJX0NGTEFHUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNhcmdzLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jCmluZGV4IGI3YWM2OGMuLjU4NTgxODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNhcmdzLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc2FyZ3MuYwpAQCAtNDEsMjUgKzQxLDIwIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJwc2FyZ3MiKQorQUNQSV9NT0RVTEVfTkFNRSgicHNhcmdzIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCiBzdGF0aWMgdTMyCi1hY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpOworYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aChzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlKTsKIAotc3RhdGljIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZ2V0X25leHRfZmllbGQgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSk7Ci0KK3N0YXRpYyB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19nZXRfbmV4dF9maWVsZChzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZQorCQkJCQkJICAgICAgICpwYXJzZXJfc3RhdGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc1LDQ5ICs3MCw0MyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHUzMgotYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aCAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKQorYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aChzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZF9sZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAwOworCXUzMiBlbmNvZGVkX2xlbmd0aDsKKwl1MzIgbGVuZ3RoID0gMDsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInBzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGgiKTsKLQotCi0JZW5jb2RlZF9sZW5ndGggPSAodTMyKSBBQ1BJX0dFVDggKHBhcnNlcl9zdGF0ZS0+YW1sKTsKKwllbmNvZGVkX2xlbmd0aCA9ICh1MzIpIEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCk7CiAJcGFyc2VyX3N0YXRlLT5hbWwrKzsKIAotCXN3aXRjaCAoZW5jb2RlZF9sZW5ndGggPj4gNikgLyogYml0cyA2LTcgY29udGFpbiBlbmNvZGluZyBzY2hlbWUgKi8gewotCWNhc2UgMDogLyogMS1ieXRlIGVuY29kaW5nIChiaXRzIDAtNSkgKi8KKwlzd2l0Y2ggKGVuY29kZWRfbGVuZ3RoID4+IDYpIHsJLyogYml0cyA2LTcgY29udGFpbiBlbmNvZGluZyBzY2hlbWUgKi8KKwljYXNlIDA6CQkvKiAxLWJ5dGUgZW5jb2RpbmcgKGJpdHMgMC01KSAqLwogCiAJCWxlbmd0aCA9IChlbmNvZGVkX2xlbmd0aCAmIDB4M0YpOwogCQlicmVhazsKIAorCWNhc2UgMToJCS8qIDItYnl0ZSBlbmNvZGluZyAobmV4dCBieXRlICsgYml0cyAwLTMpICovCiAKLQljYXNlIDE6IC8qIDItYnl0ZSBlbmNvZGluZyAobmV4dCBieXRlICsgYml0cyAwLTMpICovCi0KLQkJbGVuZ3RoID0gKChBQ1BJX0dFVDggKHBhcnNlcl9zdGF0ZS0+YW1sKSA8PCAwNCkgfAotCQkJCSAoZW5jb2RlZF9sZW5ndGggJiAweDBGKSk7CisJCWxlbmd0aCA9ICgoQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sKSA8PCAwNCkgfAorCQkJICAoZW5jb2RlZF9sZW5ndGggJiAweDBGKSk7CiAJCXBhcnNlcl9zdGF0ZS0+YW1sKys7CiAJCWJyZWFrOwogCisJY2FzZSAyOgkJLyogMy1ieXRlIGVuY29kaW5nIChuZXh0IDIgYnl0ZXMgKyBiaXRzIDAtMykgKi8KIAotCWNhc2UgMjogLyogMy1ieXRlIGVuY29kaW5nIChuZXh0IDIgYnl0ZXMgKyBiaXRzIDAtMykgKi8KLQotCQlsZW5ndGggPSAoKEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwgKyAxKSA8PCAxMikgfAotCQkJCSAgKEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwpICAgIDw8IDA0KSB8Ci0JCQkJICAoZW5jb2RlZF9sZW5ndGggJiAweDBGKSk7CisJCWxlbmd0aCA9ICgoQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sICsgMSkgPDwgMTIpIHwKKwkJCSAgKEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCkgPDwgMDQpIHwKKwkJCSAgKGVuY29kZWRfbGVuZ3RoICYgMHgwRikpOwogCQlwYXJzZXJfc3RhdGUtPmFtbCArPSAyOwogCQlicmVhazsKIAorCWNhc2UgMzoJCS8qIDQtYnl0ZSBlbmNvZGluZyAobmV4dCAzIGJ5dGVzICsgYml0cyAwLTMpICovCiAKLQljYXNlIDM6IC8qIDQtYnl0ZSBlbmNvZGluZyAobmV4dCAzIGJ5dGVzICsgYml0cyAwLTMpICovCi0KLQkJbGVuZ3RoID0gKChBQ1BJX0dFVDggKHBhcnNlcl9zdGF0ZS0+YW1sICsgMikgPDwgMjApIHwKLQkJCQkgIChBQ1BJX0dFVDggKHBhcnNlcl9zdGF0ZS0+YW1sICsgMSkgPDwgMTIpIHwKLQkJCQkgIChBQ1BJX0dFVDggKHBhcnNlcl9zdGF0ZS0+YW1sKSAgICA8PCAwNCkgfAotCQkJCSAgKGVuY29kZWRfbGVuZ3RoICYgMHgwRikpOworCQlsZW5ndGggPSAoKEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCArIDIpIDw8IDIwKSB8CisJCQkgIChBQ1BJX0dFVDgocGFyc2VyX3N0YXRlLT5hbWwgKyAxKSA8PCAxMikgfAorCQkJICAoQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sKSA8PCAwNCkgfAorCQkJICAoZW5jb2RlZF9sZW5ndGggJiAweDBGKSk7CiAJCXBhcnNlcl9zdGF0ZS0+YW1sICs9IDM7CiAJCWJyZWFrOwogCkBAIC0xMjcsMTAgKzExNiw5IEBACiAJCWJyZWFrOwogCX0KIAotCXJldHVybl9WQUxVRSAobGVuZ3RoKTsKKwlyZXR1cm5fVkFMVUUobGVuZ3RoKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kCkBAIC0xNDQsMjUgKzEzMiwyMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4ICoKLWFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9lbmQgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSkKK3U4ICphY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhcnQgPSBwYXJzZXJfc3RhdGUtPmFtbDsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGxlbmd0aDsKKwl1OCAqc3RhcnQgPSBwYXJzZXJfc3RhdGUtPmFtbDsKKwlhY3BpX25hdGl2ZV91aW50IGxlbmd0aDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInBzX2dldF9uZXh0X3BhY2thZ2VfZW5kIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJwc19nZXRfbmV4dF9wYWNrYWdlX2VuZCIpOwogCiAJLyogRnVuY3Rpb24gYmVsb3cgY2hhbmdlcyBwYXJzZXJfc3RhdGUtPkFtbCAqLwogCi0JbGVuZ3RoID0gKGFjcGlfbmF0aXZlX3VpbnQpIGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGggKHBhcnNlcl9zdGF0ZSk7CisJbGVuZ3RoID0KKwkgICAgKGFjcGlfbmF0aXZlX3VpbnQpIGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGgocGFyc2VyX3N0YXRlKTsKIAotCXJldHVybl9QVFIgKHN0YXJ0ICsgbGVuZ3RoKTsgLyogZW5kIG9mIHBhY2thZ2UgKi8KKwlyZXR1cm5fUFRSKHN0YXJ0ICsgbGVuZ3RoKTsJLyogZW5kIG9mIHBhY2thZ2UgKi8KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcKQEAgLTE3OCwyMCArMTYyLDE2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotY2hhciAqCi1hY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSkKK2NoYXIgKmFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyhzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZW5kID0gcGFyc2VyX3N0YXRlLT5hbWw7CisJdTggKnN0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7CisJdTggKmVuZCA9IHBhcnNlcl9zdGF0ZS0+YW1sOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicHNfZ2V0X25leHRfbmFtZXN0cmluZyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicHNfZ2V0X25leHRfbmFtZXN0cmluZyIpOwogCiAJLyogSGFuZGxlIG11bHRpcGxlIHByZWZpeCBjaGFyYWN0ZXJzICovCiAKLQl3aGlsZSAoYWNwaV9wc19pc19wcmVmaXhfY2hhciAoQUNQSV9HRVQ4IChlbmQpKSkgeworCXdoaWxlIChhY3BpX3BzX2lzX3ByZWZpeF9jaGFyKEFDUElfR0VUOChlbmQpKSkgewogCQkvKiBJbmNsdWRlIHByZWZpeCAnXFwnIG9yICdeJyAqLwogCiAJCWVuZCsrOwpAQCAtMTk5LDcgKzE3OSw3IEBACiAKIAkvKiBEZWNvZGUgdGhlIHBhdGggKi8KIAotCXN3aXRjaCAoQUNQSV9HRVQ4IChlbmQpKSB7CisJc3dpdGNoIChBQ1BJX0dFVDgoZW5kKSkgewogCWNhc2UgMDoKIAogCQkvKiBudWxsX25hbWUgKi8KQEAgLTIyMSw3ICsyMDEsNyBAQAogCiAJCS8qIE11bHRpcGxlIG5hbWUgc2VnbWVudHMsIDQgY2hhcnMgZWFjaCAqLwogCi0JCWVuZCArPSAyICsgKChhY3BpX3NpemUpIEFDUElfR0VUOCAoZW5kICsgMSkgKiBBQ1BJX05BTUVfU0laRSk7CisJCWVuZCArPSAyICsgKChhY3BpX3NpemUpIEFDUElfR0VUOChlbmQgKyAxKSAqIEFDUElfTkFNRV9TSVpFKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjMyLDExICsyMTIsMTAgQEAKIAkJYnJlYWs7CiAJfQogCi0JcGFyc2VyX3N0YXRlLT5hbWwgPSAodTgqKSBlbmQ7Ci0JcmV0dXJuX1BUUiAoKGNoYXIgKikgc3RhcnQpOworCXBhcnNlcl9zdGF0ZS0+YW1sID0gKHU4ICopIGVuZDsKKwlyZXR1cm5fUFRSKChjaGFyICopc3RhcnQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X25leHRfbmFtZXBhdGgKQEAgLTI1OSwyNCArMjM4LDIwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9wc19nZXRfbmV4dF9uYW1lcGF0aCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwpCithY3BpX3BzX2dldF9uZXh0X25hbWVwYXRoKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgIHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCisJCQkgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcsIHU4IG1ldGhvZF9jYWxsKQogewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGg7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqbmFtZV9vcDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm1ldGhvZF9kZXNjOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICBzY29wZV9pbmZvOworCWNoYXIgKnBhdGg7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm5hbWVfb3A7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbWV0aG9kX2Rlc2M7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlIHNjb3BlX2luZm87CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJwc19nZXRfbmV4dF9uYW1lcGF0aCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInBzX2dldF9uZXh0X25hbWVwYXRoIik7Ci0KLQotCXBhdGggPSBhY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcgKHBhcnNlcl9zdGF0ZSk7CisJcGF0aCA9IGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyhwYXJzZXJfc3RhdGUpOwogCiAJLyogTnVsbCBwYXRoIGNhc2UgaXMgYWxsb3dlZCAqLwogCkBAIC0yOTYsNDkgKzI3MSw1MCBAQAogCQkgKiBwYXJlbnQgdHJlZSwgYnV0IGRvbid0IG9wZW4gYSBuZXcgc2NvcGUgLS0gd2UganVzdCB3YW50IHRvIGxvb2t1cCB0aGUKIAkJICogb2JqZWN0ICAoTVVTVCBCRSBtb2RlIEVYRUNVVEUgdG8gcGVyZm9ybSB1cHNlYXJjaCkKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICgmc2NvcGVfaW5mbywgcGF0aCwgQUNQSV9UWVBFX0FOWSwKLQkJCQkgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJCSBBQ1BJX05TX1NFQVJDSF9QQVJFTlQgfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwKLQkJCQkgTlVMTCwgJm5vZGUpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpICYmIG1ldGhvZF9jYWxsKSB7CisJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwKCZzY29wZV9pbmZvLCBwYXRoLCBBQ1BJX1RZUEVfQU5ZLAorCQkJCQlBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkJCUFDUElfTlNfU0VBUkNIX1BBUkVOVCB8CisJCQkJCUFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLCBOVUxMLCAmbm9kZSk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBtZXRob2RfY2FsbCkgewogCQkJaWYgKG5vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX01FVEhPRCkgewogCQkJCS8qIFRoaXMgbmFtZSBpcyBhY3R1YWxseSBhIGNvbnRyb2wgbWV0aG9kIGludm9jYXRpb24gKi8KIAotCQkJCW1ldGhvZF9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwKLQkJCQkJIkNvbnRyb2wgTWV0aG9kIC0gJXAgRGVzYyAlcCBQYXRoPSVwXG4iLAotCQkJCQlub2RlLCBtZXRob2RfZGVzYywgcGF0aCkpOworCQkJCW1ldGhvZF9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkJCQkgICJDb250cm9sIE1ldGhvZCAtICVwIERlc2MgJXAgUGF0aD0lcFxuIiwKKwkJCQkJCSAgbm9kZSwgbWV0aG9kX2Rlc2MsIHBhdGgpKTsKIAotCQkJCW5hbWVfb3AgPSBhY3BpX3BzX2FsbG9jX29wIChBTUxfSU5UX05BTUVQQVRIX09QKTsKKwkJCQluYW1lX29wID0gYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX05BTUVQQVRIX09QKTsKIAkJCQlpZiAoIW5hbWVfb3ApIHsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJCQl9CiAKIAkJCQkvKiBDaGFuZ2UgYXJnIGludG8gYSBNRVRIT0QgQ0FMTCBhbmQgYXR0YWNoIG5hbWUgdG8gaXQgKi8KIAotCQkJCWFjcGlfcHNfaW5pdF9vcCAoYXJnLCBBTUxfSU5UX01FVEhPRENBTExfT1ApOworCQkJCWFjcGlfcHNfaW5pdF9vcChhcmcsIEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCk7CiAJCQkJbmFtZV9vcC0+Y29tbW9uLnZhbHVlLm5hbWUgPSBwYXRoOwogCiAJCQkJLyogUG9pbnQgTUVUSE9EQ0FMTC9OQU1FIHRvIHRoZSBNRVRIT0QgTm9kZSAqLwogCiAJCQkJbmFtZV9vcC0+Y29tbW9uLm5vZGUgPSBub2RlOwotCQkJCWFjcGlfcHNfYXBwZW5kX2FyZyAoYXJnLCBuYW1lX29wKTsKKwkJCQlhY3BpX3BzX2FwcGVuZF9hcmcoYXJnLCBuYW1lX29wKTsKIAogCQkJCWlmICghbWV0aG9kX2Rlc2MpIHsKLQkJCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkJCSJwc19nZXRfbmV4dF9uYW1lcGF0aDogQ29udHJvbCBNZXRob2QgJXAgaGFzIG5vIGF0dGFjaGVkIG9iamVjdFxuIiwKLQkJCQkJCW5vZGUpKTsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOworCQkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoInBzX2dldF9uZXh0X25hbWVwYXRoOiBDb250cm9sIE1ldGhvZCAlcCBoYXMgbm8gYXR0YWNoZWQgb2JqZWN0XG4iLCBub2RlKSk7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogCQkJCX0KIAotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAotCQkJCQkiQ29udHJvbCBNZXRob2QgLSAlcCBBcmdzICVYXG4iLAotCQkJCQlub2RlLCBtZXRob2RfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50KSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCQkJCSAgIkNvbnRyb2wgTWV0aG9kIC0gJXAgQXJncyAlWFxuIiwKKwkJCQkJCSAgbm9kZSwKKwkJCQkJCSAgbWV0aG9kX2Rlc2MtPm1ldGhvZC4KKwkJCQkJCSAgcGFyYW1fY291bnQpKTsKIAogCQkJCS8qIEdldCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBleHBlY3QgKi8KIAotCQkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IG1ldGhvZF9kZXNjLT5tZXRob2QucGFyYW1fY291bnQ7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0KKwkJCQkgICAgbWV0aG9kX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudDsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQkJfQogCiAJCQkvKgpAQCAtMzQ4LDI1ICszMjQsMjYgQEAKIAkJCSAqLwogCQl9CiAKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCS8qCiAJCQkgKiAxKSBBbnkgZXJyb3Igb3RoZXIgdGhhbiBOT1RfRk9VTkQgaXMgYWx3YXlzIHNldmVyZQogCQkJICogMikgTk9UX0ZPVU5EIGlzIG9ubHkgaW1wb3J0YW50IGlmIHdlIGFyZSBleGVjdXRpbmcgYSBtZXRob2QuCiAJCQkgKiAzKSBJZiBleGVjdXRpbmcgYSBjb25kX3JlZl9vZiBvcGNvZGUsIE5PVF9GT1VORCBpcyBvay4KIAkJCSAqLwotCQkJaWYgKCgoKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RFX01BU0spID09IEFDUElfUEFSU0VfRVhFQ1VURSkgJiYKLQkJCQkoc3RhdHVzID09IEFFX05PVF9GT1VORCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotCQkJCSh3YWxrX3N0YXRlLT5vcC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX0NPTkRfUkVGX09GX09QKSkgfHwKKwkJCWlmICgoKCh3YWxrX3N0YXRlLT4KKwkJCSAgICAgICBwYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfTU9ERV9NQVNLKSA9PQorCQkJICAgICAgQUNQSV9QQVJTRV9FWEVDVVRFKSAmJiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkKKwkJCSAgICAgJiYgKHdhbGtfc3RhdGUtPm9wLT5jb21tb24uYW1sX29wY29kZSAhPQorCQkJCSBBTUxfQ09ORF9SRUZfT0ZfT1ApKQorCQkJICAgIHx8IChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSkgeworCQkJCUFDUElfUkVQT1JUX05TRVJST1IocGF0aCwgc3RhdHVzKTsKIAotCQkJCShzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSkgewotCQkJCUFDUElfUkVQT1JUX05TRVJST1IgKHBhdGgsIHN0YXR1cyk7CisJCQkJYWNwaV9vc19wcmludGYKKwkJCQkgICAgKCJzZWFyY2hfbm9kZSAlcCBzdGFydF9ub2RlICVwIHJldHVybl9ub2RlICVwXG4iLAorCQkJCSAgICAgc2NvcGVfaW5mby5zY29wZS5ub2RlLAorCQkJCSAgICAgcGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlLCBub2RlKTsKIAotCQkJCWFjcGlfb3NfcHJpbnRmICgic2VhcmNoX25vZGUgJXAgc3RhcnRfbm9kZSAlcCByZXR1cm5fbm9kZSAlcFxuIiwKLQkJCQkJc2NvcGVfaW5mby5zY29wZS5ub2RlLCBwYXJzZXJfc3RhdGUtPnN0YXJ0X25vZGUsIG5vZGUpOwotCi0KLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQkvKgogCQkJCSAqIFdlIGdvdCBhIE5PVF9GT1VORCBkdXJpbmcgdGFibGUgbG9hZCBvciB3ZSBlbmNvdW50ZXJlZAogCQkJCSAqIGEgY29uZF9yZWZfb2YoeCkgd2hlcmUgdGhlIHRhcmdldCBkb2VzIG5vdCBleGlzdC4KQEAgLTM4MSwxMyArMzU4LDEyIEBACiAJICogUmVnYXJkbGVzcyBvZiBzdWNjZXNzL2ZhaWx1cmUgYWJvdmUsCiAJICogSnVzdCBpbml0aWFsaXplIHRoZSBPcCB3aXRoIHRoZSBwYXRobmFtZS4KIAkgKi8KLQlhY3BpX3BzX2luaXRfb3AgKGFyZywgQU1MX0lOVF9OQU1FUEFUSF9PUCk7CisJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX0lOVF9OQU1FUEFUSF9PUCk7CiAJYXJnLT5jb21tb24udmFsdWUubmFtZSA9IHBhdGg7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfbmV4dF9zaW1wbGVfYXJnCkBAIC00MDMsODcgKzM3OSw4MSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV9wc19nZXRfbmV4dF9zaW1wbGVfYXJnICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfdHlwZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcpCithY3BpX3BzX2dldF9uZXh0X3NpbXBsZV9hcmcoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSwKKwkJCSAgICB1MzIgYXJnX3R5cGUsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMiAoInBzX2dldF9uZXh0X3NpbXBsZV9hcmciLCBhcmdfdHlwZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigicHNfZ2V0X25leHRfc2ltcGxlX2FyZyIsIGFyZ190eXBlKTsKIAogCXN3aXRjaCAoYXJnX3R5cGUpIHsKIAljYXNlIEFSR1BfQllURURBVEE6CiAKLQkJYWNwaV9wc19pbml0X29wIChhcmcsIEFNTF9CWVRFX09QKTsKLQkJYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciA9ICh1MzIpIEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwpOworCQlhY3BpX3BzX2luaXRfb3AoYXJnLCBBTUxfQllURV9PUCk7CisJCWFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIgPSAodTMyKSBBQ1BJX0dFVDgocGFyc2VyX3N0YXRlLT5hbWwpOwogCQlwYXJzZXJfc3RhdGUtPmFtbCsrOwogCQlicmVhazsKIAotCiAJY2FzZSBBUkdQX1dPUkREQVRBOgogCi0JCWFjcGlfcHNfaW5pdF9vcCAoYXJnLCBBTUxfV09SRF9PUCk7CisJCWFjcGlfcHNfaW5pdF9vcChhcmcsIEFNTF9XT1JEX09QKTsKIAogCQkvKiBHZXQgMiBieXRlcyBmcm9tIHRoZSBBTUwgc3RyZWFtICovCiAKLQkJQUNQSV9NT1ZFXzE2X1RPXzMyICgmYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciwgcGFyc2VyX3N0YXRlLT5hbWwpOworCQlBQ1BJX01PVkVfMTZfVE9fMzIoJmFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIsCisJCQkJICAgcGFyc2VyX3N0YXRlLT5hbWwpOwogCQlwYXJzZXJfc3RhdGUtPmFtbCArPSAyOwogCQlicmVhazsKIAotCiAJY2FzZSBBUkdQX0RXT1JEREFUQToKIAotCQlhY3BpX3BzX2luaXRfb3AgKGFyZywgQU1MX0RXT1JEX09QKTsKKwkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX0RXT1JEX09QKTsKIAogCQkvKiBHZXQgNCBieXRlcyBmcm9tIHRoZSBBTUwgc3RyZWFtICovCiAKLQkJQUNQSV9NT1ZFXzMyX1RPXzMyICgmYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciwgcGFyc2VyX3N0YXRlLT5hbWwpOworCQlBQ1BJX01PVkVfMzJfVE9fMzIoJmFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIsCisJCQkJICAgcGFyc2VyX3N0YXRlLT5hbWwpOwogCQlwYXJzZXJfc3RhdGUtPmFtbCArPSA0OwogCQlicmVhazsKIAotCiAJY2FzZSBBUkdQX1FXT1JEREFUQToKIAotCQlhY3BpX3BzX2luaXRfb3AgKGFyZywgQU1MX1FXT1JEX09QKTsKKwkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX1FXT1JEX09QKTsKIAogCQkvKiBHZXQgOCBieXRlcyBmcm9tIHRoZSBBTUwgc3RyZWFtICovCiAKLQkJQUNQSV9NT1ZFXzY0X1RPXzY0ICgmYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciwgcGFyc2VyX3N0YXRlLT5hbWwpOworCQlBQ1BJX01PVkVfNjRfVE9fNjQoJmFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIsCisJCQkJICAgcGFyc2VyX3N0YXRlLT5hbWwpOwogCQlwYXJzZXJfc3RhdGUtPmFtbCArPSA4OwogCQlicmVhazsKIAotCiAJY2FzZSBBUkdQX0NIQVJMSVNUOgogCi0JCWFjcGlfcHNfaW5pdF9vcCAoYXJnLCBBTUxfU1RSSU5HX09QKTsKLQkJYXJnLT5jb21tb24udmFsdWUuc3RyaW5nID0gKGNoYXIgKikgcGFyc2VyX3N0YXRlLT5hbWw7CisJCWFjcGlfcHNfaW5pdF9vcChhcmcsIEFNTF9TVFJJTkdfT1ApOworCQlhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcgPSAoY2hhciAqKXBhcnNlcl9zdGF0ZS0+YW1sOwogCi0JCXdoaWxlIChBQ1BJX0dFVDggKHBhcnNlcl9zdGF0ZS0+YW1sKSAhPSAnXDAnKSB7CisJCXdoaWxlIChBQ1BJX0dFVDgocGFyc2VyX3N0YXRlLT5hbWwpICE9ICdcMCcpIHsKIAkJCXBhcnNlcl9zdGF0ZS0+YW1sKys7CiAJCX0KIAkJcGFyc2VyX3N0YXRlLT5hbWwrKzsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQVJHUF9OQU1FOgogCWNhc2UgQVJHUF9OQU1FU1RSSU5HOgogCi0JCWFjcGlfcHNfaW5pdF9vcCAoYXJnLCBBTUxfSU5UX05BTUVQQVRIX09QKTsKLQkJYXJnLT5jb21tb24udmFsdWUubmFtZSA9IGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyAocGFyc2VyX3N0YXRlKTsKKwkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX0lOVF9OQU1FUEFUSF9PUCk7CisJCWFyZy0+Y29tbW9uLnZhbHVlLm5hbWUgPQorCQkgICAgYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nKHBhcnNlcl9zdGF0ZSk7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkludmFsaWQgYXJnX3R5cGUgJVhcbiIsIGFyZ190eXBlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52YWxpZCBhcmdfdHlwZSAlWFxuIiwgYXJnX3R5cGUpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfbmV4dF9maWVsZApAQCAtNDk2LDI0ICs0NjYsMjEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgotYWNwaV9wc19nZXRfbmV4dF9maWVsZCAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKQorc3RhdGljIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9uZXh0X2ZpZWxkKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlCisJCQkJCQkgICAgICAgKnBhcnNlcl9zdGF0ZSkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vZmZzZXQgPSAodTMyKQotCQkJICBBQ1BJX1BUUl9ESUZGIChwYXJzZXJfc3RhdGUtPmFtbCwKLQkJCQkJICAgcGFyc2VyX3N0YXRlLT5hbWxfc3RhcnQpOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmZpZWxkOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKKwl1MzIgYW1sX29mZnNldCA9ICh1MzIpCisJICAgIEFDUElfUFRSX0RJRkYocGFyc2VyX3N0YXRlLT5hbWwsCisJCQkgIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqZmllbGQ7CisJdTE2IG9wY29kZTsKKwl1MzIgbmFtZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInBzX2dldF9uZXh0X2ZpZWxkIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJwc19nZXRfbmV4dF9maWVsZCIpOwogCiAJLyogRGV0ZXJtaW5lIGZpZWxkIHR5cGUgKi8KIAotCXN3aXRjaCAoQUNQSV9HRVQ4IChwYXJzZXJfc3RhdGUtPmFtbCkpIHsKKwlzd2l0Y2ggKEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCkpIHsKIAlkZWZhdWx0OgogCiAJCW9wY29kZSA9IEFNTF9JTlRfTkFNRURGSUVMRF9PUDsKQEAgLTUzNCw5ICs1MDEsOSBAQAogCiAJLyogQWxsb2NhdGUgYSBuZXcgZmllbGQgb3AgKi8KIAotCWZpZWxkID0gYWNwaV9wc19hbGxvY19vcCAob3Bjb2RlKTsKKwlmaWVsZCA9IGFjcGlfcHNfYWxsb2Nfb3Aob3Bjb2RlKTsKIAlpZiAoIWZpZWxkKSB7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAogCWZpZWxkLT5jb21tb24uYW1sX29mZnNldCA9IGFtbF9vZmZzZXQ7CkBAIC01NDgsMzMgKzUxNSwzNCBAQAogCiAJCS8qIEdldCB0aGUgNC1jaGFyYWN0ZXIgbmFtZSAqLwogCi0JCUFDUElfTU9WRV8zMl9UT18zMiAoJm5hbWUsIHBhcnNlcl9zdGF0ZS0+YW1sKTsKLQkJYWNwaV9wc19zZXRfbmFtZSAoZmllbGQsIG5hbWUpOworCQlBQ1BJX01PVkVfMzJfVE9fMzIoJm5hbWUsIHBhcnNlcl9zdGF0ZS0+YW1sKTsKKwkJYWNwaV9wc19zZXRfbmFtZShmaWVsZCwgbmFtZSk7CiAJCXBhcnNlcl9zdGF0ZS0+YW1sICs9IEFDUElfTkFNRV9TSVpFOwogCiAJCS8qIEdldCB0aGUgbGVuZ3RoIHdoaWNoIGlzIGVuY29kZWQgYXMgYSBwYWNrYWdlIGxlbmd0aCAqLwogCi0JCWZpZWxkLT5jb21tb24udmFsdWUuc2l6ZSA9IGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGggKHBhcnNlcl9zdGF0ZSk7CisJCWZpZWxkLT5jb21tb24udmFsdWUuc2l6ZSA9CisJCSAgICBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoKHBhcnNlcl9zdGF0ZSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9JTlRfUkVTRVJWRURGSUVMRF9PUDoKIAogCQkvKiBHZXQgdGhlIGxlbmd0aCB3aGljaCBpcyBlbmNvZGVkIGFzIGEgcGFja2FnZSBsZW5ndGggKi8KIAotCQlmaWVsZC0+Y29tbW9uLnZhbHVlLnNpemUgPSBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoIChwYXJzZXJfc3RhdGUpOworCQlmaWVsZC0+Y29tbW9uLnZhbHVlLnNpemUgPQorCQkgICAgYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aChwYXJzZXJfc3RhdGUpOwogCQlicmVhazsKIAotCiAJY2FzZSBBTUxfSU5UX0FDQ0VTU0ZJRUxEX09QOgogCiAJCS8qCiAJCSAqIEdldCBhY2Nlc3NfdHlwZSBhbmQgYWNjZXNzX2F0dHJpYiBhbmQgbWVyZ2UgaW50byB0aGUgZmllbGQgT3AKIAkJICogYWNjZXNzX3R5cGUgaXMgZmlyc3Qgb3BlcmFuZCwgYWNjZXNzX2F0dHJpYnV0ZSBpcyBzZWNvbmQKIAkJICovCi0JCWZpZWxkLT5jb21tb24udmFsdWUuaW50ZWdlciA9IChBQ1BJX0dFVDggKHBhcnNlcl9zdGF0ZS0+YW1sKSA8PCA4KTsKKwkJZmllbGQtPmNvbW1vbi52YWx1ZS5pbnRlZ2VyID0KKwkJICAgIChBQ1BJX0dFVDgocGFyc2VyX3N0YXRlLT5hbWwpIDw8IDgpOwogCQlwYXJzZXJfc3RhdGUtPmFtbCsrOwotCQlmaWVsZC0+Y29tbW9uLnZhbHVlLmludGVnZXIgfD0gQUNQSV9HRVQ4IChwYXJzZXJfc3RhdGUtPmFtbCk7CisJCWZpZWxkLT5jb21tb24udmFsdWUuaW50ZWdlciB8PSBBQ1BJX0dFVDgocGFyc2VyX3N0YXRlLT5hbWwpOwogCQlwYXJzZXJfc3RhdGUtPmFtbCsrOwogCQlicmVhazsKIApAQCAtNTg0LDEwICs1NTIsOSBAQAogCQlicmVhazsKIAl9CiAKLQlyZXR1cm5fUFRSIChmaWVsZCk7CisJcmV0dXJuX1BUUihmaWVsZCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfbmV4dF9hcmcKQEAgLTYwNSwyMSArNTcyLDE3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9wc19nZXRfbmV4dF9hcmcgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX3R5cGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqKnJldHVybl9hcmcpCithY3BpX3BzX2dldF9uZXh0X2FyZyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkgICAgIHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCisJCSAgICAgdTMyIGFyZ190eXBlLCB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKnJldHVybl9hcmcpCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnID0gTlVMTDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpwcmV2ID0gTlVMTDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpmaWVsZDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym9wOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZyA9IE5VTEw7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnByZXYgPSBOVUxMOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpmaWVsZDsKKwl1MzIgc3Vib3A7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgicHNfZ2V0X25leHRfYXJnIiwgcGFyc2VyX3N0YXRlKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJwc19nZXRfbmV4dF9hcmciLCBwYXJzZXJfc3RhdGUpOwogCiAJc3dpdGNoIChhcmdfdHlwZSkgewogCWNhc2UgQVJHUF9CWVRFREFUQToKQEAgLTYzMSwzNyArNTk0LDM1IEBACiAKIAkJLyogQ29uc3RhbnRzLCBzdHJpbmdzLCBhbmQgbmFtZXN0cmluZ3MgYXJlIGFsbCB0aGUgc2FtZSBzaXplICovCiAKLQkJYXJnID0gYWNwaV9wc19hbGxvY19vcCAoQU1MX0JZVEVfT1ApOworCQlhcmcgPSBhY3BpX3BzX2FsbG9jX29wKEFNTF9CWVRFX09QKTsKIAkJaWYgKCFhcmcpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9Ci0JCWFjcGlfcHNfZ2V0X25leHRfc2ltcGxlX2FyZyAocGFyc2VyX3N0YXRlLCBhcmdfdHlwZSwgYXJnKTsKKwkJYWNwaV9wc19nZXRfbmV4dF9zaW1wbGVfYXJnKHBhcnNlcl9zdGF0ZSwgYXJnX3R5cGUsIGFyZyk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFSR1BfUEtHTEVOR1RIOgogCiAJCS8qIFBhY2thZ2UgbGVuZ3RoLCBub3RoaW5nIHJldHVybmVkICovCiAKLQkJcGFyc2VyX3N0YXRlLT5wa2dfZW5kID0gYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2VuZCAocGFyc2VyX3N0YXRlKTsKKwkJcGFyc2VyX3N0YXRlLT5wa2dfZW5kID0KKwkJICAgIGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9lbmQocGFyc2VyX3N0YXRlKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQVJHUF9GSUVMRExJU1Q6CiAKIAkJaWYgKHBhcnNlcl9zdGF0ZS0+YW1sIDwgcGFyc2VyX3N0YXRlLT5wa2dfZW5kKSB7CiAJCQkvKiBOb24tZW1wdHkgbGlzdCAqLwogCiAJCQl3aGlsZSAocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPnBrZ19lbmQpIHsKLQkJCQlmaWVsZCA9IGFjcGlfcHNfZ2V0X25leHRfZmllbGQgKHBhcnNlcl9zdGF0ZSk7CisJCQkJZmllbGQgPSBhY3BpX3BzX2dldF9uZXh0X2ZpZWxkKHBhcnNlcl9zdGF0ZSk7CiAJCQkJaWYgKCFmaWVsZCkgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQkJCX0KIAogCQkJCWlmIChwcmV2KSB7CiAJCQkJCXByZXYtPmNvbW1vbi5uZXh0ID0gZmllbGQ7Ci0JCQkJfQotCQkJCWVsc2UgeworCQkJCX0gZWxzZSB7CiAJCQkJCWFyZyA9IGZpZWxkOwogCQkJCX0KIAkJCQlwcmV2ID0gZmllbGQ7CkBAIC02NzMsMjEgKzYzNCwyMSBAQAogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFSR1BfQllURUxJU1Q6CiAKIAkJaWYgKHBhcnNlcl9zdGF0ZS0+YW1sIDwgcGFyc2VyX3N0YXRlLT5wa2dfZW5kKSB7CiAJCQkvKiBOb24tZW1wdHkgbGlzdCAqLwogCi0JCQlhcmcgPSBhY3BpX3BzX2FsbG9jX29wIChBTUxfSU5UX0JZVEVMSVNUX09QKTsKKwkJCWFyZyA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX0lOVF9CWVRFTElTVF9PUCk7CiAJCQlpZiAoIWFyZykgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJCX0KIAogCQkJLyogRmlsbCBpbiBieXRlbGlzdCBkYXRhICovCiAKIAkJCWFyZy0+Y29tbW9uLnZhbHVlLnNpemUgPSAodTMyKQotCQkJCUFDUElfUFRSX0RJRkYgKHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCwgcGFyc2VyX3N0YXRlLT5hbWwpOworCQkJICAgIEFDUElfUFRSX0RJRkYocGFyc2VyX3N0YXRlLT5wa2dfZW5kLAorCQkJCQkgIHBhcnNlcl9zdGF0ZS0+YW1sKTsKIAkJCWFyZy0+bmFtZWQuZGF0YSA9IHBhcnNlcl9zdGF0ZS0+YW1sOwogCiAJCQkvKiBTa2lwIHRvIEVuZCBvZiBieXRlIGRhdGEgKi8KQEAgLTY5NiwzMiArNjU3LDMxIEBACiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQVJHUF9UQVJHRVQ6CiAJY2FzZSBBUkdQX1NVUEVSTkFNRToKIAljYXNlIEFSR1BfU0lNUExFTkFNRToKIAotCQlzdWJvcCA9IGFjcGlfcHNfcGVla19vcGNvZGUgKHBhcnNlcl9zdGF0ZSk7Ci0JCWlmIChzdWJvcCA9PSAwICAgICAgICAgICAgICAgICAgfHwKLQkJCWFjcGlfcHNfaXNfbGVhZGluZ19jaGFyIChzdWJvcCkgfHwKLQkJCWFjcGlfcHNfaXNfcHJlZml4X2NoYXIgKHN1Ym9wKSkgeworCQlzdWJvcCA9IGFjcGlfcHNfcGVla19vcGNvZGUocGFyc2VyX3N0YXRlKTsKKwkJaWYgKHN1Ym9wID09IDAgfHwKKwkJICAgIGFjcGlfcHNfaXNfbGVhZGluZ19jaGFyKHN1Ym9wKSB8fAorCQkgICAgYWNwaV9wc19pc19wcmVmaXhfY2hhcihzdWJvcCkpIHsKIAkJCS8qIG51bGxfbmFtZSBvciBuYW1lX3N0cmluZyAqLwogCi0JCQlhcmcgPSBhY3BpX3BzX2FsbG9jX29wIChBTUxfSU5UX05BTUVQQVRIX09QKTsKKwkJCWFyZyA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX0lOVF9OQU1FUEFUSF9PUCk7CiAJCQlpZiAoIWFyZykgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJCX0KIAotCQkJc3RhdHVzID0gYWNwaV9wc19nZXRfbmV4dF9uYW1lcGF0aCAod2Fsa19zdGF0ZSwgcGFyc2VyX3N0YXRlLCBhcmcsIDApOwotCQl9Ci0JCWVsc2UgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3BzX2dldF9uZXh0X25hbWVwYXRoKHdhbGtfc3RhdGUsIHBhcnNlcl9zdGF0ZSwKKwkJCQkJCSAgICAgIGFyZywgMCk7CisJCX0gZWxzZSB7CiAJCQkvKiBTaW5nbGUgY29tcGxleCBhcmd1bWVudCwgbm90aGluZyByZXR1cm5lZCAqLwogCiAJCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAxOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFSR1BfREFUQU9CSjoKIAljYXNlIEFSR1BfVEVSTUFSRzoKIApAQCAtNzMwLDcgKzY5MCw2IEBACiAJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDE7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFSR1BfREFUQU9CSkxJU1Q6CiAJY2FzZSBBUkdQX1RFUk1MSVNUOgogCWNhc2UgQVJHUF9PQkpMSVNUOgpAQCAtNzQyLDE0ICs3MDEsMTMgQEAKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJJbnZhbGlkIGFyZ190eXBlOiAlWFxuIiwgYXJnX3R5cGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIGFyZ190eXBlOiAlWFxuIiwgYXJnX3R5cGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJYnJlYWs7CiAJfQogCiAJKnJldHVybl9hcmcgPSBhcmc7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc2xvb3AuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNsb29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4ZDMzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNsb29wLmMKQEAgLTAsMCArMSw4NzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogcHNsb29wIC0gTWFpbiBBTUwgcGFyc2UgbG9vcAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworLyoKKyAqIFBhcnNlIHRoZSBBTUwgYW5kIGJ1aWxkIGFuIG9wZXJhdGlvbiB0cmVlIGFzIG1vc3QgaW50ZXJwcmV0ZXJzLAorICogbGlrZSBQZXJsLCBkby4gIFBhcnNpbmcgaXMgZG9uZSBieSBoYW5kIHJhdGhlciB0aGFuIHdpdGggYSBZQUNDCisgKiBnZW5lcmF0ZWQgcGFyc2VyIHRvIHRpZ2h0bHkgY29uc3RyYWluIHN0YWNrIGFuZCBkeW5hbWljIG1lbW9yeQorICogdXNhZ2UuICBBdCB0aGUgc2FtZSB0aW1lLCBwYXJzaW5nIGlzIGtlcHQgZmxleGlibGUgYW5kIHRoZSBjb2RlCisgKiBmYWlybHkgY29tcGFjdCBieSBwYXJzaW5nIGJhc2VkIG9uIGEgbGlzdCBvZiBBTUwgb3Bjb2RlCisgKiB0ZW1wbGF0ZXMgaW4gYW1sX29wX2luZm9bXQorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CisjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgorI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKK0FDUElfTU9EVUxFX05BTUUoInBzbG9vcCIpCisKK3N0YXRpYyB1MzIgYWNwaV9nYmxfZGVwdGggPSAwOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX3BhcnNlX2xvb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFBhcnNlIEFNTCAocG9pbnRlZCB0byBieSB0aGUgY3VycmVudCBwYXJzZXIgc3RhdGUpIGFuZCByZXR1cm4KKyAqICAgICAgICAgICAgICBhIHRyZWUgb2Ygb3BzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfcHNfcGFyc2VfbG9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1czI7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wID0gTlVMTDsJLyogY3VycmVudCBvcCAqLworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcgPSBOVUxMOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwcmVfb3AgPSBOVUxMOworCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGU7CisJdTggKmFtbF9vcF9zdGFydCA9IE5VTEw7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigicHNfcGFyc2VfbG9vcCIsIHdhbGtfc3RhdGUpOworCisJaWYgKHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgPT0gTlVMTCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJcGFyc2VyX3N0YXRlID0gJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZTsKKwl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSAwOworCisjaWYgKCFkZWZpbmVkIChBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04pICYmICFkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkpCisKKwlpZiAod2Fsa19zdGF0ZS0+d2Fsa190eXBlICYgQUNQSV9XQUxLX01FVEhPRF9SRVNUQVJUKSB7CisJCS8qIFdlIGFyZSByZXN0YXJ0aW5nIGEgcHJlZW1wdGVkIGNvbnRyb2wgbWV0aG9kICovCisKKwkJaWYgKGFjcGlfcHNfaGFzX2NvbXBsZXRlZF9zY29wZShwYXJzZXJfc3RhdGUpKSB7CisJCQkvKgorCQkJICogV2UgbXVzdCBjaGVjayBpZiBhIHByZWRpY2F0ZSB0byBhbiBJRiBvciBXSElMRSBzdGF0ZW1lbnQKKwkJCSAqIHdhcyBqdXN0IGNvbXBsZXRlZAorCQkJICovCisJCQlpZiAoKHBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLm9wKSAmJgorCQkJICAgICgocGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUub3AtPmNvbW1vbi4KKwkJCSAgICAgIGFtbF9vcGNvZGUgPT0gQU1MX0lGX09QKQorCQkJICAgICB8fCAocGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUub3AtPmNvbW1vbi4KKwkJCQkgYW1sX29wY29kZSA9PSBBTUxfV0hJTEVfT1ApKQorCQkJICAgICYmICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKQorCQkJICAgICYmICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPT0KKwkJCQlBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0VYRUNVVElORykpIHsKKwkJCQkvKgorCQkJCSAqIEEgcHJlZGljYXRlIHdhcyBqdXN0IGNvbXBsZXRlZCwgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUKKwkJCQkgKiBwcmVkaWNhdGUgYW5kIGJyYW5jaCBiYXNlZCBvbiB0aGF0IHZhbHVlCisJCQkJICovCisJCQkJd2Fsa19zdGF0ZS0+b3AgPSBOVUxMOworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSh3YWxrX3N0YXRlLAorCQkJCQkJCQlBQ1BJX1RPX1BPSU5URVIKKwkJCQkJCQkJKFRSVUUpKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykKKwkJCQkgICAgJiYgKChzdGF0dXMgJiBBRV9DT0RFX01BU0spICE9CisJCQkJCUFFX0NPREVfQ09OVFJPTCkpIHsKKwkJCQkJaWYgKHN0YXR1cyA9PSBBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKSB7CisJCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJCQkgICJJbnZva2VkIG1ldGhvZCBkaWQgbm90IHJldHVybiBhIHZhbHVlLCAlc1xuIiwKKwkJCQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24KKwkJCQkJCQkJICAoc3RhdHVzKSkpOworCisJCQkJCX0KKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCQkgICJnZXRfcHJlZGljYXRlIEZhaWxlZCwgJXNcbiIsCisJCQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24KKwkJCQkJCQkgIChzdGF0dXMpKSk7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLCBvcCwKKwkJCQkJCQkgICAgIHN0YXR1cyk7CisJCQl9CisKKwkJCWFjcGlfcHNfcG9wX3Njb3BlKHBhcnNlcl9zdGF0ZSwgJm9wLAorCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCisJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJCQkgICJQb3BwZWQgc2NvcGUsIE9wPSVwXG4iLCBvcCkpOworCQl9IGVsc2UgaWYgKHdhbGtfc3RhdGUtPnByZXZfb3ApIHsKKwkJCS8qIFdlIHdlcmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBvcCAqLworCisJCQlvcCA9IHdhbGtfc3RhdGUtPnByZXZfb3A7CisJCQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSB3YWxrX3N0YXRlLT5wcmV2X2FyZ190eXBlczsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogSXRlcmF0aXZlIHBhcnNpbmcgbG9vcCwgd2hpbGUgdGhlcmUgaXMgbW9yZSBBTUwgdG8gcHJvY2VzczogKi8KKworCXdoaWxlICgocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPmFtbF9lbmQpIHx8IChvcCkpIHsKKwkJYW1sX29wX3N0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7CisJCWlmICghb3ApIHsKKwkJCS8qIEdldCB0aGUgbmV4dCBvcGNvZGUgZnJvbSB0aGUgQU1MIHN0cmVhbSAqLworCisJCQl3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0ID0KKwkJCSAgICAodTMyKSBBQ1BJX1BUUl9ESUZGKHBhcnNlcl9zdGF0ZS0+YW1sLAorCQkJCQkJcGFyc2VyX3N0YXRlLT5hbWxfc3RhcnQpOworCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gYWNwaV9wc19wZWVrX29wY29kZShwYXJzZXJfc3RhdGUpOworCisJCQkvKgorCQkJICogRmlyc3QgY3V0IHRvIGRldGVybWluZSB3aGF0IHdlIGhhdmUgZm91bmQ6CisJCQkgKiAxKSBBIHZhbGlkIEFNTCBvcGNvZGUKKwkJCSAqIDIpIEEgbmFtZSBzdHJpbmcKKwkJCSAqIDMpIEFuIHVua25vd24vaW52YWxpZCBvcGNvZGUKKwkJCSAqLworCQkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9CisJCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8od2Fsa19zdGF0ZS0+b3Bjb2RlKTsKKwkJCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MpIHsKKwkJCWNhc2UgQU1MX0NMQVNTX0FTQ0lJOgorCQkJY2FzZSBBTUxfQ0xBU1NfUFJFRklYOgorCQkJCS8qCisJCQkJICogU3RhcnRzIHdpdGggYSB2YWxpZCBwcmVmaXggb3IgQVNDSUkgY2hhciwgdGhpcyBpcyBhIG5hbWUKKwkJCQkgKiBzdHJpbmcuICBDb252ZXJ0IHRoZSBiYXJlIG5hbWUgc3RyaW5nIHRvIGEgbmFtZXBhdGguCisJCQkJICovCisJCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gQU1MX0lOVF9OQU1FUEFUSF9PUDsKKwkJCQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSBBUkdQX05BTUVTVFJJTkc7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQU1MX0NMQVNTX1VOS05PV046CisKKwkJCQkvKiBUaGUgb3Bjb2RlIGlzIHVucmVjb2duaXplZC4gIEp1c3Qgc2tpcCB1bmtub3duIG9wY29kZXMgKi8KKworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJGb3VuZCB1bmtub3duIG9wY29kZSAlWCBhdCBBTUwgYWRkcmVzcyAlcCBvZmZzZXQgJVgsIGlnbm9yaW5nXG4iLAorCQkJCQkJICB3YWxrX3N0YXRlLT5vcGNvZGUsCisJCQkJCQkgIHBhcnNlcl9zdGF0ZS0+YW1sLAorCQkJCQkJICB3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0KSk7CisKKwkJCQlBQ1BJX0RVTVBfQlVGRkVSKHBhcnNlcl9zdGF0ZS0+YW1sLCAxMjgpOworCisJCQkJLyogQXNzdW1lIG9uZS1ieXRlIGJhZCBvcGNvZGUgKi8KKworCQkJCXBhcnNlcl9zdGF0ZS0+YW1sKys7CisJCQkJY29udGludWU7CisKKwkJCWRlZmF1bHQ6CisKKwkJCQkvKiBGb3VuZCBvcGNvZGUgaW5mbywgdGhpcyBpcyBhIG5vcm1hbCBvcGNvZGUgKi8KKworCQkJCXBhcnNlcl9zdGF0ZS0+YW1sICs9CisJCQkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9zaXplKHdhbGtfc3RhdGUtPm9wY29kZSk7CisJCQkJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0KKwkJCQkgICAgd2Fsa19zdGF0ZS0+b3BfaW5mby0+cGFyc2VfYXJnczsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogQ3JlYXRlIE9wIHN0cnVjdHVyZSBhbmQgYXBwZW5kIHRvIHBhcmVudCdzIGFyZ3VtZW50IGxpc3QgKi8KKworCQkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7CisJCQkJLyogQWxsb2NhdGUgYSBuZXcgcHJlX29wIGlmIG5lY2Vzc2FyeSAqLworCisJCQkJaWYgKCFwcmVfb3ApIHsKKwkJCQkJcHJlX29wID0KKwkJCQkJICAgIGFjcGlfcHNfYWxsb2Nfb3Aod2Fsa19zdGF0ZS0+CisJCQkJCQkJICAgICBvcGNvZGUpOworCQkJCQlpZiAoIXByZV9vcCkgeworCQkJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJCQl9CisJCQkJfQorCisJCQkJcHJlX29wLT5jb21tb24udmFsdWUuYXJnID0gTlVMTDsKKwkJCQlwcmVfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlID0gd2Fsa19zdGF0ZS0+b3Bjb2RlOworCisJCQkJLyoKKwkJCQkgKiBHZXQgYW5kIGFwcGVuZCBhcmd1bWVudHMgdW50aWwgd2UgZmluZCB0aGUgbm9kZSB0aGF0IGNvbnRhaW5zCisJCQkJICogdGhlIG5hbWUgKHRoZSB0eXBlIEFSR1BfTkFNRSkuCisJCQkJICovCisJCQkJd2hpbGUgKEdFVF9DVVJSRU5UX0FSR19UWVBFCisJCQkJICAgICAgICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpCisJCQkJICAgICAgICYmCisJCQkJICAgICAgIChHRVRfQ1VSUkVOVF9BUkdfVFlQRQorCQkJCQkod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSAhPSBBUkdQX05BTUUpKSB7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX3BzX2dldF9uZXh0X2FyZyh3YWxrX3N0YXRlLAorCQkJCQkJCQkgcGFyc2VyX3N0YXRlLAorCQkJCQkJCQkgR0VUX0NVUlJFTlRfQVJHX1RZUEUKKwkJCQkJCQkJICh3YWxrX3N0YXRlLT4KKwkJCQkJCQkJICBhcmdfdHlwZXMpLAorCQkJCQkJCQkgJmFyZyk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJCQl9CisKKwkJCQkJYWNwaV9wc19hcHBlbmRfYXJnKHByZV9vcCwgYXJnKTsKKwkJCQkJSU5DUkVNRU5UX0FSR19MSVNUKHdhbGtfc3RhdGUtPgorCQkJCQkJCSAgIGFyZ190eXBlcyk7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBNYWtlIHN1cmUgdGhhdCB3ZSBmb3VuZCBhIE5BTUUgYW5kIGRpZG4ndCBydW4gb3V0IG9mCisJCQkJICogYXJndW1lbnRzCisJCQkJICovCisJCQkJaWYgKCFHRVRfQ1VSUkVOVF9BUkdfVFlQRQorCQkJCSAgICAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSkgeworCQkJCQlzdGF0dXMgPSBBRV9BTUxfTk9fT1BFUkFORDsKKwkJCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJCX0KKworCQkJCS8qIFdlIGtub3cgdGhhdCB0aGlzIGFyZyBpcyBhIG5hbWUsIG1vdmUgdG8gbmV4dCBhcmcgKi8KKworCQkJCUlOQ1JFTUVOVF9BUkdfTElTVCh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpOworCisJCQkJLyoKKwkJCQkgKiBGaW5kIHRoZSBvYmplY3QuICBUaGlzIHdpbGwgZWl0aGVyIGluc2VydCB0aGUgb2JqZWN0IGludG8KKwkJCQkgKiB0aGUgbmFtZXNwYWNlIG9yIHNpbXBseSBsb29rIGl0IHVwCisJCQkJICovCisJCQkJd2Fsa19zdGF0ZS0+b3AgPSBOVUxMOworCisJCQkJc3RhdHVzID0KKwkJCQkgICAgd2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayh3YWxrX3N0YXRlLAorCQkJCQkJCQkgICAgJm9wKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCQkgICJEdXJpbmcgbmFtZSBsb29rdXAvY2F0YWxvZywgJXNcbiIsCisJCQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24KKwkJCQkJCQkgIChzdGF0dXMpKSk7CisJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKKwkJCQl9CisKKwkJCQlpZiAoIW9wKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLCBvcCwKKwkJCQkJCQkgICAgIHN0YXR1cyk7CisJCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BFTkRJTkcpIHsKKwkJCQkJc3RhdHVzID0gQUVfT0s7CisJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKKwkJCQl9CisKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJCX0KKworCQkJCWFjcGlfcHNfYXBwZW5kX2FyZyhvcCwKKwkJCQkJCSAgIHByZV9vcC0+Y29tbW9uLnZhbHVlLmFyZyk7CisJCQkJYWNwaV9nYmxfZGVwdGgrKzsKKworCQkJCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCkgeworCQkJCQkvKgorCQkJCQkgKiBEZWZlciBmaW5hbCBwYXJzaW5nIG9mIGFuIG9wZXJhdGlvbl9yZWdpb24gYm9keSwKKwkJCQkJICogYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvIGluIHRoZSBmaXJzdCBwYXNzCisJCQkJCSAqIHRvIHBhcnNlIGl0IGNvcnJlY3RseSAoaS5lLiwgdGhlcmUgbWF5IGJlIG1ldGhvZAorCQkJCQkgKiBjYWxscyB3aXRoaW4gdGhlIHRlcm1fYXJnIGVsZW1lbnRzIG9mIHRoZSBib2R5LikKKwkJCQkJICoKKwkJCQkJICogSG93ZXZlciwgd2UgbXVzdCBjb250aW51ZSBwYXJzaW5nIGJlY2F1c2UKKwkJCQkJICogdGhlIG9wcmVnaW9uIGlzIG5vdCBhIHN0YW5kYWxvbmUgcGFja2FnZSAtLQorCQkJCQkgKiB3ZSBkb24ndCBrbm93IHdoZXJlIHRoZSBlbmQgaXMgYXQgdGhpcyBwb2ludC4KKwkJCQkJICoKKwkJCQkJICogKExlbmd0aCBpcyB1bmtub3duIHVudGlsIHBhcnNlIG9mIHRoZSBib2R5IGNvbXBsZXRlKQorCQkJCQkgKi8KKwkJCQkJb3AtPm5hbWVkLmRhdGEgPSBhbWxfb3Bfc3RhcnQ7CisJCQkJCW9wLT5uYW1lZC5sZW5ndGggPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogTm90IGEgbmFtZWQgb3Bjb2RlLCBqdXN0IGFsbG9jYXRlIE9wIGFuZCBhcHBlbmQgdG8gcGFyZW50ICovCisKKwkJCQl3YWxrX3N0YXRlLT5vcF9pbmZvID0KKwkJCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8od2Fsa19zdGF0ZS0+b3Bjb2RlKTsKKwkJCQlvcCA9IGFjcGlfcHNfYWxsb2Nfb3Aod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKKwkJCQlpZiAoIW9wKSB7CisJCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJCX0KKworCQkJCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9DUkVBVEUpIHsKKwkJCQkJLyoKKwkJCQkJICogQmFja3VwIHRvIGJlZ2lubmluZyBvZiBjcmVhdGVfeFhYZmllbGQgZGVjbGFyYXRpb24KKwkJCQkJICogYm9keV9sZW5ndGggaXMgdW5rbm93biB1bnRpbCB3ZSBwYXJzZSB0aGUgYm9keQorCQkJCQkgKi8KKwkJCQkJb3AtPm5hbWVkLmRhdGEgPSBhbWxfb3Bfc3RhcnQ7CisJCQkJCW9wLT5uYW1lZC5sZW5ndGggPSAwOworCQkJCX0KKworCQkJCWFjcGlfcHNfYXBwZW5kX2FyZyhhY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUKKwkJCQkJCSAgIChwYXJzZXJfc3RhdGUpLCBvcCk7CisKKwkJCQlpZiAoKHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgIT0gTlVMTCkpIHsKKwkJCQkJLyoKKwkJCQkJICogRmluZCB0aGUgb2JqZWN0LiBUaGlzIHdpbGwgZWl0aGVyIGluc2VydCB0aGUgb2JqZWN0IGludG8KKwkJCQkJICogdGhlIG5hbWVzcGFjZSBvciBzaW1wbHkgbG9vayBpdCB1cAorCQkJCQkgKi8KKwkJCQkJd2Fsa19zdGF0ZS0+b3AgPSBvcDsKKworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgd2Fsa19zdGF0ZS0+CisJCQkJCSAgICBkZXNjZW5kaW5nX2NhbGxiYWNrKHdhbGtfc3RhdGUsCisJCQkJCQkJCSZvcCk7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUod2Fsa19zdGF0ZSwKKwkJCQkJCQkJICAgICBvcCwKKwkJCQkJCQkJICAgICBzdGF0dXMpOworCQkJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgeworCQkJCQkJc3RhdHVzID0gQUVfT0s7CisJCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7CisJCQkJCX0KKworCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJb3AtPmNvbW1vbi5hbWxfb2Zmc2V0ID0gd2Fsa19zdGF0ZS0+YW1sX29mZnNldDsKKworCQkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8pIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJCQkJICAiT3Bjb2RlICU0LjRYIFslc10gT3AgJXAgQW1sICVwIGFtbF9vZmZzZXQgJTUuNVhcbiIsCisJCQkJCQkgICh1MzIpIG9wLT5jb21tb24uYW1sX29wY29kZSwKKwkJCQkJCSAgd2Fsa19zdGF0ZS0+b3BfaW5mby0+bmFtZSwgb3AsCisJCQkJCQkgIHBhcnNlcl9zdGF0ZS0+YW1sLAorCQkJCQkJICBvcC0+Y29tbW9uLmFtbF9vZmZzZXQpKTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFN0YXJ0IGFyZ19jb3VudCBhdCB6ZXJvIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGVyZSBhcmUKKwkJICogYW55IGFyZ3MgeWV0CisJCSAqLworCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAwOworCisJCS8qIEFyZSB0aGVyZSBhbnkgYXJndW1lbnRzIHRoYXQgbXVzdCBiZSBwcm9jZXNzZWQ/ICovCisKKwkJaWYgKHdhbGtfc3RhdGUtPmFyZ190eXBlcykgeworCQkJLyogR2V0IGFyZ3VtZW50cyAqLworCisJCQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgeworCQkJY2FzZSBBTUxfQllURV9PUDoJLyogQU1MX0JZVEVEQVRBX0FSRyAqLworCQkJY2FzZSBBTUxfV09SRF9PUDoJLyogQU1MX1dPUkREQVRBX0FSRyAqLworCQkJY2FzZSBBTUxfRFdPUkRfT1A6CS8qIEFNTF9EV09SREFUQV9BUkcgKi8KKwkJCWNhc2UgQU1MX1FXT1JEX09QOgkvKiBBTUxfUVdPUkRBVEFfQVJHICovCisJCQljYXNlIEFNTF9TVFJJTkdfT1A6CS8qIEFNTF9BU0NJSUNIQVJMSVNUX0FSRyAqLworCisJCQkJLyogRmlsbCBpbiBjb25zdGFudCBvciBzdHJpbmcgYXJndW1lbnQgZGlyZWN0bHkgKi8KKworCQkJCWFjcGlfcHNfZ2V0X25leHRfc2ltcGxlX2FyZyhwYXJzZXJfc3RhdGUsCisJCQkJCQkJICAgIEdFVF9DVVJSRU5UX0FSR19UWVBFCisJCQkJCQkJICAgICh3YWxrX3N0YXRlLT4KKwkJCQkJCQkgICAgIGFyZ190eXBlcyksIG9wKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBTUxfSU5UX05BTUVQQVRIX09QOgkvKiBBTUxfTkFNRVNUUklOR19BUkcgKi8KKworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfcHNfZ2V0X25leHRfbmFtZXBhdGgod2Fsa19zdGF0ZSwKKwkJCQkJCQkgICAgICBwYXJzZXJfc3RhdGUsIG9wLAorCQkJCQkJCSAgICAgIDEpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7CisJCQkJfQorCisJCQkJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gMDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkvKgorCQkJCSAqIE9wIGlzIG5vdCBhIGNvbnN0YW50IG9yIHN0cmluZywgYXBwZW5kIGVhY2ggYXJndW1lbnQKKwkJCQkgKiB0byB0aGUgT3AKKwkJCQkgKi8KKwkJCQl3aGlsZSAoR0VUX0NVUlJFTlRfQVJHX1RZUEUKKwkJCQkgICAgICAgKHdhbGtfc3RhdGUtPmFyZ190eXBlcykKKwkJCQkgICAgICAgJiYgIXdhbGtfc3RhdGUtPmFyZ19jb3VudCkgeworCQkJCQl3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0ID0gKHUzMikKKwkJCQkJICAgIEFDUElfUFRSX0RJRkYocGFyc2VyX3N0YXRlLT5hbWwsCisJCQkJCQkJICBwYXJzZXJfc3RhdGUtPgorCQkJCQkJCSAgYW1sX3N0YXJ0KTsKKworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgYWNwaV9wc19nZXRfbmV4dF9hcmcod2Fsa19zdGF0ZSwKKwkJCQkJCQkJIHBhcnNlcl9zdGF0ZSwKKwkJCQkJCQkJIEdFVF9DVVJSRU5UX0FSR19UWVBFCisJCQkJCQkJCSAod2Fsa19zdGF0ZS0+CisJCQkJCQkJCSAgYXJnX3R5cGVzKSwKKwkJCQkJCQkJICZhcmcpOworCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKKwkJCQkJfQorCisJCQkJCWlmIChhcmcpIHsKKwkJCQkJCWFyZy0+Y29tbW9uLmFtbF9vZmZzZXQgPQorCQkJCQkJICAgIHdhbGtfc3RhdGUtPmFtbF9vZmZzZXQ7CisJCQkJCQlhY3BpX3BzX2FwcGVuZF9hcmcob3AsIGFyZyk7CisJCQkJCX0KKwkJCQkJSU5DUkVNRU5UX0FSR19MSVNUKHdhbGtfc3RhdGUtPgorCQkJCQkJCSAgIGFyZ190eXBlcyk7CisJCQkJfQorCisJCQkJLyogU3BlY2lhbCBwcm9jZXNzaW5nIGZvciBjZXJ0YWluIG9wY29kZXMgKi8KKworCQkJCS8qIFRCRCAocmVtb3ZlKTogVGVtcG9yYXJ5IG1lY2hhbmlzbSB0byBkaXNhYmxlIHRoaXMgY29kZSBpZiBuZWVkZWQgKi8KKworI2lmZGVmIEFDUElfRU5BQkxFX01PRFVMRV9MRVZFTF9DT0RFCisKKwkJCQlpZiAoKHdhbGtfc3RhdGUtPnBhc3NfbnVtYmVyIDw9CisJCQkJICAgICBBQ1BJX0lNT0RFX0xPQURfUEFTUzEpCisJCQkJICAgICYmCisJCQkJICAgICgod2Fsa19zdGF0ZS0+CisJCQkJICAgICAgcGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX0RJU0FTU0VNQkxFKSA9PQorCQkJCSAgICAgMCkpIHsKKwkJCQkJLyoKKwkJCQkJICogV2Ugd2FudCB0byBza2lwIElmL0Vsc2UvV2hpbGUgY29uc3RydWN0cyBkdXJpbmcgUGFzczEKKwkJCQkJICogYmVjYXVzZSB3ZSB3YW50IHRvIGFjdHVhbGx5IGNvbmRpdGlvbmFsbHkgZXhlY3V0ZSB0aGUKKwkJCQkJICogY29kZSBkdXJpbmcgUGFzczIuCisJCQkJCSAqCisJCQkJCSAqIEV4Y2VwdCBmb3IgZGlzYXNzZW1ibHksIHdoZXJlIHdlIGFsd2F5cyB3YW50IHRvCisJCQkJCSAqIHdhbGsgdGhlIElmL0Vsc2UvV2hpbGUgcGFja2FnZXMKKwkJCQkJICovCisJCQkJCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CisJCQkJCWNhc2UgQU1MX0lGX09QOgorCQkJCQljYXNlIEFNTF9FTFNFX09QOgorCQkJCQljYXNlIEFNTF9XSElMRV9PUDoKKworCQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCQkJCQkJICAiUGFzczE6IFNraXBwaW5nIGFuIElmL0Vsc2UvV2hpbGUgYm9keVxuIikpOworCisJCQkJCQkvKiBTa2lwIGJvZHkgb2YgaWYvZWxzZS93aGlsZSBpbiBwYXNzIDEgKi8KKworCQkJCQkJcGFyc2VyX3N0YXRlLT5hbWwgPQorCQkJCQkJICAgIHBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKKwkJCQkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisjZW5kaWYKKwkJCQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgeworCQkJCWNhc2UgQU1MX01FVEhPRF9PUDoKKworCQkJCQkvKgorCQkJCQkgKiBTa2lwIHBhcnNpbmcgb2YgY29udHJvbCBtZXRob2QKKwkJCQkJICogYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvIGluIHRoZSBmaXJzdCBwYXNzCisJCQkJCSAqIHRvIHBhcnNlIGl0IGNvcnJlY3RseS4KKwkJCQkJICoKKwkJCQkJICogU2F2ZSB0aGUgbGVuZ3RoIGFuZCBhZGRyZXNzIG9mIHRoZSBib2R5CisJCQkJCSAqLworCQkJCQlvcC0+bmFtZWQuZGF0YSA9IHBhcnNlcl9zdGF0ZS0+YW1sOworCQkJCQlvcC0+bmFtZWQubGVuZ3RoID0KKwkJCQkJICAgICh1MzIpIChwYXJzZXJfc3RhdGUtPnBrZ19lbmQgLQorCQkJCQkJICAgcGFyc2VyX3N0YXRlLT5hbWwpOworCisJCQkJCS8qIFNraXAgYm9keSBvZiBtZXRob2QgKi8KKworCQkJCQlwYXJzZXJfc3RhdGUtPmFtbCA9CisJCQkJCSAgICBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7CisJCQkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBBTUxfQlVGRkVSX09QOgorCQkJCWNhc2UgQU1MX1BBQ0tBR0VfT1A6CisJCQkJY2FzZSBBTUxfVkFSX1BBQ0tBR0VfT1A6CisKKwkJCQkJaWYgKChvcC0+Y29tbW9uLnBhcmVudCkgJiYKKwkJCQkJICAgIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLgorCQkJCQkgICAgIGFtbF9vcGNvZGUgPT0gQU1MX05BTUVfT1ApCisJCQkJCSAgICAmJiAod2Fsa19zdGF0ZS0+cGFzc19udW1iZXIgPD0KKwkJCQkJCUFDUElfSU1PREVfTE9BRF9QQVNTMikpIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBTa2lwIHBhcnNpbmcgb2YgQnVmZmVycyBhbmQgUGFja2FnZXMKKwkJCQkJCSAqIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mbyBpbiB0aGUgZmlyc3QgcGFzcworCQkJCQkJICogdG8gcGFyc2UgdGhlbSBjb3JyZWN0bHkuCisJCQkJCQkgKi8KKwkJCQkJCW9wLT5uYW1lZC5kYXRhID0gYW1sX29wX3N0YXJ0OworCQkJCQkJb3AtPm5hbWVkLmxlbmd0aCA9CisJCQkJCQkgICAgKHUzMikgKHBhcnNlcl9zdGF0ZS0+CisJCQkJCQkJICAgcGtnX2VuZCAtCisJCQkJCQkJICAgYW1sX29wX3N0YXJ0KTsKKworCQkJCQkJLyogU2tpcCBib2R5ICovCisKKwkJCQkJCXBhcnNlcl9zdGF0ZS0+YW1sID0KKwkJCQkJCSAgICBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7CisJCQkJCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAwOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBBTUxfV0hJTEVfT1A6CisKKwkJCQkJaWYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpIHsKKwkJCQkJCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPgorCQkJCQkJICAgIGNvbnRyb2wucGFja2FnZV9lbmQgPQorCQkJCQkJICAgIHBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisKKwkJCQkJLyogTm8gYWN0aW9uIGZvciBhbGwgb3RoZXIgb3Bjb2RlcyAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBDaGVjayBmb3IgYXJndW1lbnRzIHRoYXQgbmVlZCB0byBiZSBwcm9jZXNzZWQgKi8KKworCQlpZiAod2Fsa19zdGF0ZS0+YXJnX2NvdW50KSB7CisJCQkvKgorCQkJICogVGhlcmUgYXJlIGFyZ3VtZW50cyAoY29tcGxleCBvbmVzKSwgcHVzaCBPcCBhbmQKKwkJCSAqIHByZXBhcmUgZm9yIGFyZ3VtZW50CisJCQkgKi8KKwkJCXN0YXR1cyA9IGFjcGlfcHNfcHVzaF9zY29wZShwYXJzZXJfc3RhdGUsIG9wLAorCQkJCQkJICAgIHdhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkJCSAgICB3YWxrX3N0YXRlLT5hcmdfY291bnQpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJfQorCQkJb3AgPSBOVUxMOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBBbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQgLS0gT3AgaXMgY29tcGxldGUsCisJCSAqIHByZXBhcmUgZm9yIG5leHQKKwkJICovCisJCXdhbGtfc3RhdGUtPm9wX2luZm8gPQorCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKKwkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7CisJCQlpZiAoYWNwaV9nYmxfZGVwdGgpIHsKKwkJCQlhY3BpX2dibF9kZXB0aC0tOworCQkJfQorCisJCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApIHsKKwkJCQkvKgorCQkJCSAqIFNraXAgcGFyc2luZyBvZiBjb250cm9sIG1ldGhvZCBvciBvcHJlZ2lvbiBib2R5LAorCQkJCSAqIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mbyBpbiB0aGUgZmlyc3QgcGFzcworCQkJCSAqIHRvIHBhcnNlIHRoZW0gY29ycmVjdGx5LgorCQkJCSAqCisJCQkJICogQ29tcGxldGVkIHBhcnNpbmcgYW4gb3BfcmVnaW9uIGRlY2xhcmF0aW9uLCB3ZSBub3cKKwkJCQkgKiBrbm93IHRoZSBsZW5ndGguCisJCQkJICovCisJCQkJb3AtPm5hbWVkLmxlbmd0aCA9CisJCQkJICAgICh1MzIpIChwYXJzZXJfc3RhdGUtPmFtbCAtIG9wLT5uYW1lZC5kYXRhKTsKKwkJCX0KKwkJfQorCisJCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9DUkVBVEUpIHsKKwkJCS8qCisJCQkgKiBCYWNrdXAgdG8gYmVnaW5uaW5nIG9mIGNyZWF0ZV94WFhmaWVsZCBkZWNsYXJhdGlvbiAoMSBmb3IKKwkJCSAqIE9wY29kZSkKKwkJCSAqCisJCQkgKiBib2R5X2xlbmd0aCBpcyB1bmtub3duIHVudGlsIHdlIHBhcnNlIHRoZSBib2R5CisJCQkgKi8KKwkJCW9wLT5uYW1lZC5sZW5ndGggPQorCQkJICAgICh1MzIpIChwYXJzZXJfc3RhdGUtPmFtbCAtIG9wLT5uYW1lZC5kYXRhKTsKKwkJfQorCisJCS8qIFRoaXMgb3AgY29tcGxldGUsIG5vdGlmeSB0aGUgZGlzcGF0Y2hlciAqLworCisJCWlmICh3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sgIT0gTlVMTCkgeworCQkJd2Fsa19zdGF0ZS0+b3AgPSBvcDsKKwkJCXdhbGtfc3RhdGUtPm9wY29kZSA9IG9wLT5jb21tb24uYW1sX29wY29kZTsKKworCQkJc3RhdHVzID0gd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrKHdhbGtfc3RhdGUpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUod2Fsa19zdGF0ZSwgb3AsIHN0YXR1cyk7CisJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgeworCQkJCXN0YXR1cyA9IEFFX09LOworCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKKwkJCX0KKwkJfQorCisJICAgICAgY2xvc2VfdGhpc19vcDoKKwkJLyoKKwkJICogRmluaXNoZWQgb25lIGFyZ3VtZW50IG9mIHRoZSBjb250YWluaW5nIHNjb3BlCisJCSAqLworCQlwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQtLTsKKworCQkvKiBGaW5pc2hlZCB3aXRoIHByZV9vcCAqLworCisJCWlmIChwcmVfb3ApIHsKKwkJCWFjcGlfcHNfZnJlZV9vcChwcmVfb3ApOworCQkJcHJlX29wID0gTlVMTDsKKwkJfQorCisJCS8qIENsb3NlIHRoaXMgT3AgKHdpbGwgcmVzdWx0IGluIHBhcnNlIHN1YnRyZWUgZGVsZXRpb24pICovCisKKwkJc3RhdHVzMiA9IGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCh3YWxrX3N0YXRlLCBvcCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKKwkJfQorCQlvcCA9IE5VTEw7CisKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBBRV9PSzoKKwkJCWJyZWFrOworCisJCWNhc2UgQUVfQ1RSTF9UUkFOU0ZFUjoKKworCQkJLyogV2UgYXJlIGFib3V0IHRvIHRyYW5zZmVyIHRvIGEgY2FsbGVkIG1ldGhvZC4gKi8KKworCQkJd2Fsa19zdGF0ZS0+cHJldl9vcCA9IG9wOworCQkJd2Fsa19zdGF0ZS0+cHJldl9hcmdfdHlwZXMgPSB3YWxrX3N0YXRlLT5hcmdfdHlwZXM7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKworCQljYXNlIEFFX0NUUkxfRU5EOgorCisJCQlhY3BpX3BzX3BvcF9zY29wZShwYXJzZXJfc3RhdGUsICZvcCwKKwkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAorCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOworCisJCQlpZiAob3ApIHsKKwkJCQl3YWxrX3N0YXRlLT5vcCA9IG9wOworCQkJCXdhbGtfc3RhdGUtPm9wX2luZm8gPQorCQkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLgorCQkJCQkJCSAgICBhbWxfb3Bjb2RlKTsKKwkJCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7CisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICB3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sod2Fsa19zdGF0ZSk7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsIG9wLAorCQkJCQkJCSAgICAgc3RhdHVzKTsKKworCQkJCXN0YXR1czIgPQorCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgb3ApOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOworCQkJCX0KKwkJCQlvcCA9IE5VTEw7CisJCQl9CisJCQlzdGF0dXMgPSBBRV9PSzsKKwkJCWJyZWFrOworCisJCWNhc2UgQUVfQ1RSTF9CUkVBSzoKKwkJY2FzZSBBRV9DVFJMX0NPTlRJTlVFOgorCisJCQkvKiBQb3Agb2ZmIHNjb3BlcyB1bnRpbCB3ZSBmaW5kIHRoZSBXaGlsZSAqLworCisJCQl3aGlsZSAoIW9wIHx8IChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX1dISUxFX09QKSkgeworCQkJCWFjcGlfcHNfcG9wX3Njb3BlKHBhcnNlcl9zdGF0ZSwgJm9wLAorCQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAorCQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKKwkJCX0KKworCQkJLyogQ2xvc2UgdGhpcyBpdGVyYXRpb24gb2YgdGhlIFdoaWxlIGxvb3AgKi8KKworCQkJd2Fsa19zdGF0ZS0+b3AgPSBvcDsKKwkJCXdhbGtfc3RhdGUtPm9wX2luZm8gPQorCQkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wLT5jb21tb24uYW1sX29wY29kZSk7CisJCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7CisKKwkJCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayh3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsIG9wLCBzdGF0dXMpOworCisJCQlzdGF0dXMyID0gYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHdhbGtfc3RhdGUsIG9wKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7CisJCQl9CisJCQlvcCA9IE5VTEw7CisKKwkJCXN0YXR1cyA9IEFFX09LOworCQkJYnJlYWs7CisKKwkJY2FzZSBBRV9DVFJMX1RFUk1JTkFURToKKworCQkJc3RhdHVzID0gQUVfT0s7CisKKwkJCS8qIENsZWFuIHVwICovCisJCQlkbyB7CisJCQkJaWYgKG9wKSB7CisJCQkJCXN0YXR1czIgPQorCQkJCQkgICAgYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHdhbGtfc3RhdGUsCisJCQkJCQkJCSAgICAgb3ApOworCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7CisJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7CisJCQkJCX0KKwkJCQl9CisJCQkJYWNwaV9wc19wb3Bfc2NvcGUocGFyc2VyX3N0YXRlLCAmb3AsCisJCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCisJCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOworCisJCQl9IHdoaWxlIChvcCk7CisKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCisJCWRlZmF1bHQ6CS8qIEFsbCBvdGhlciBub24tQUVfT0sgc3RhdHVzICovCisKKwkJCWRvIHsKKwkJCQlpZiAob3ApIHsKKwkJCQkJc3RhdHVzMiA9CisJCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwKKwkJCQkJCQkJICAgICBvcCk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKKwkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlhY3BpX3BzX3BvcF9zY29wZShwYXJzZXJfc3RhdGUsICZvcCwKKwkJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7CisKKwkJCX0gd2hpbGUgKG9wKTsKKworCQkJLyoKKwkJCSAqIFRCRDogQ2xlYW51cCBwYXJzZSBvcHMgb24gZXJyb3IKKwkJCSAqLworI2lmIDAKKwkJCWlmIChvcCA9PSBOVUxMKSB7CisJCQkJYWNwaV9wc19wb3Bfc2NvcGUocGFyc2VyX3N0YXRlLCAmb3AsCisJCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCisJCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOworCQkJfQorI2VuZGlmCisJCQl3YWxrX3N0YXRlLT5wcmV2X29wID0gb3A7CisJCQl3YWxrX3N0YXRlLT5wcmV2X2FyZ190eXBlcyA9IHdhbGtfc3RhdGUtPmFyZ190eXBlczsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJLyogVGhpcyBzY29wZSBjb21wbGV0ZT8gKi8KKworCQlpZiAoYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlKHBhcnNlcl9zdGF0ZSkpIHsKKwkJCWFjcGlfcHNfcG9wX3Njb3BlKHBhcnNlcl9zdGF0ZSwgJm9wLAorCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCisJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJCQkgICJQb3BwZWQgc2NvcGUsIE9wPSVwXG4iLCBvcCkpOworCQl9IGVsc2UgeworCQkJb3AgPSBOVUxMOworCQl9CisKKwl9CQkJLyogd2hpbGUgcGFyc2VyX3N0YXRlLT5BbWwgKi8KKworCS8qCisJICogQ29tcGxldGUgdGhlIGxhc3QgT3AgKGlmIG5vdCBjb21wbGV0ZWQpLCBhbmQgY2xlYXIgdGhlIHNjb3BlIHN0YWNrLgorCSAqIEl0IGlzIGVhc2lseSBwb3NzaWJsZSB0byBlbmQgYW4gQU1MICJwYWNrYWdlIiB3aXRoIGFuIHVuYm91bmRlZCBudW1iZXIKKwkgKiBvZiBvcGVuIHNjb3BlcyAoc3VjaCBhcyB3aGVuIHNldmVyYWwgQVNMIGJsb2NrcyBhcmUgY2xvc2VkIHdpdGgKKwkgKiBzZXF1ZW50aWFsIGNsb3NpbmcgYnJhY2VzKS4gIFdlIHdhbnQgdG8gdGVybWluYXRlIGVhY2ggb25lIGNsZWFubHkuCisJICovCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIkFNTCBwYWNrYWdlIGNvbXBsZXRlIGF0IE9wICVwXG4iLAorCQkJICBvcCkpOworCWRvIHsKKwkJaWYgKG9wKSB7CisJCQlpZiAod2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrICE9IE5VTEwpIHsKKwkJCQl3YWxrX3N0YXRlLT5vcCA9IG9wOworCQkJCXdhbGtfc3RhdGUtPm9wX2luZm8gPQorCQkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLgorCQkJCQkJCSAgICBhbWxfb3Bjb2RlKTsKKwkJCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7CisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICB3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sod2Fsa19zdGF0ZSk7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsIG9wLAorCQkJCQkJCSAgICAgc3RhdHVzKTsKKwkJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgeworCQkJCQlzdGF0dXMgPSBBRV9PSzsKKwkJCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJCX0KKworCQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9URVJNSU5BVEUpIHsKKwkJCQkJc3RhdHVzID0gQUVfT0s7CisKKwkJCQkJLyogQ2xlYW4gdXAgKi8KKwkJCQkJZG8geworCQkJCQkJaWYgKG9wKSB7CisJCQkJCQkJc3RhdHVzMiA9CisJCQkJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfdGhpc19vcAorCQkJCQkJCSAgICAod2Fsa19zdGF0ZSwgb3ApOworCQkJCQkJCWlmIChBQ1BJX0ZBSUxVUkUKKwkJCQkJCQkgICAgKHN0YXR1czIpKSB7CisJCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUworCQkJCQkJCQkgICAgKHN0YXR1czIpOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJYWNwaV9wc19wb3Bfc2NvcGUocGFyc2VyX3N0YXRlLAorCQkJCQkJCQkgICZvcCwKKwkJCQkJCQkJICAmd2Fsa19zdGF0ZS0+CisJCQkJCQkJCSAgYXJnX3R5cGVzLAorCQkJCQkJCQkgICZ3YWxrX3N0YXRlLT4KKwkJCQkJCQkJICBhcmdfY291bnQpOworCisJCQkJCX0gd2hpbGUgKG9wKTsKKworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCQl9CisKKwkJCQllbHNlIGlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkvKiBGaXJzdCBlcnJvciBpcyBtb3N0IGltcG9ydGFudCAqLworCisJCQkJCSh2b2lkKQorCQkJCQkgICAgYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHdhbGtfc3RhdGUsCisJCQkJCQkJCSAgICAgb3ApOworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCQl9CisJCQl9CisKKwkJCXN0YXR1czIgPSBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgb3ApOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKKwkJCX0KKwkJfQorCisJCWFjcGlfcHNfcG9wX3Njb3BlKHBhcnNlcl9zdGF0ZSwgJm9wLCAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAorCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7CisKKwl9IHdoaWxlIChvcCk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNvcGNvZGUuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNvcGNvZGUuYwppbmRleCA1NzQ0NjczLi4yMjlhZTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzb3Bjb2RlLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jCkBAIC00MSwxNiArNDEsMTMgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hY29wY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicHNvcGNvZGUiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJwc29wY29kZSIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjIsNyArNTksNiBAQAogICogICAgICAgICAgICAgIHRoZSBvcGVyYW5kIHR5cGUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogLyoKICAqIFN1bW1hcnkgb2Ygb3Bjb2RlIHR5cGVzL2ZsYWdzCiAgKgpAQCAtMTgwLDE1NiArMTc2LDQ2OCBAQAogCUFNTF9DUkVBVEVfUVdPUkRfRklFTERfT1AKIAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCiAvKgogICogTWFzdGVyIE9wY29kZSBpbmZvcm1hdGlvbiB0YWJsZS4gIEEgc3VtbWFyeSBvZiBldmVyeXRoaW5nIHdlIGtub3cgYWJvdXQgZWFjaAogICogb3Bjb2RlLCBhbGwgaW4gb25lIHBsYWNlLgogICovCi1jb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAgICAgYWNwaV9nYmxfYW1sX29wX2luZm9bQU1MX05VTV9PUENPREVTXSA9Ci17Citjb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyBhY3BpX2dibF9hbWxfb3BfaW5mb1tBTUxfTlVNX09QQ09ERVNdID0gewogLyohIFtCZWdpbl0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gKi8KIC8qIEluZGV4ICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICBQYXJzZXIgQXJncyAgICAgICAgICAgICAgIEludGVycHJldGVyIEFyZ3MgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgIEZsYWdzICovCiAKLS8qIDAwICovIEFDUElfT1AgKCJaZXJvIiwgICAgICAgICAgICAgICBBUkdQX1pFUk9fT1AsICAgICAgICAgICAgICBBUkdJX1pFUk9fT1AsICAgICAgICAgICAgICAgQUNQSV9UWVBFX0lOVEVHRVIsICAgICAgICAgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9DT05TVEFOVCwgICAgICAgIEFNTF9DT05TVEFOVCksCi0vKiAwMSAqLyBBQ1BJX09QICgiT25lIiwgICAgICAgICAgICAgICAgQVJHUF9PTkVfT1AsICAgICAgICAgICAgICAgQVJHSV9PTkVfT1AsICAgICAgICAgICAgICAgIEFDUElfVFlQRV9JTlRFR0VSLCAgICAgICAgICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfQ09OU1RBTlQsICAgICAgICBBTUxfQ09OU1RBTlQpLAotLyogMDIgKi8gQUNQSV9PUCAoIkFsaWFzIiwgICAgICAgICAgICAgIEFSR1BfQUxJQVNfT1AsICAgICAgICAgICAgIEFSR0lfQUxJQVNfT1AsICAgICAgICAgICAgICBBQ1BJX1RZUEVfTE9DQUxfQUxJQVMsICAgICAgIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsICAgIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwgICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCi0vKiAwMyAqLyBBQ1BJX09QICgiTmFtZSIsICAgICAgICAgICAgICAgQVJHUF9OQU1FX09QLCAgICAgICAgICAgICAgQVJHSV9OQU1FX09QLCAgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgICAgQU1MX1RZUEVfTkFNRURfQ09NUExFWCwgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKLS8qIDA0ICovIEFDUElfT1AgKCJCeXRlQ29uc3QiLCAgICAgICAgICBBUkdQX0JZVEVfT1AsICAgICAgICAgICAgICBBUkdJX0JZVEVfT1AsICAgICAgICAgICAgICAgQUNQSV9UWVBFX0lOVEVHRVIsICAgICAgICAgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9MSVRFUkFMLCAgICAgICAgIEFNTF9DT05TVEFOVCksCi0vKiAwNSAqLyBBQ1BJX09QICgiV29yZENvbnN0IiwgICAgICAgICAgQVJHUF9XT1JEX09QLCAgICAgICAgICAgICAgQVJHSV9XT1JEX09QLCAgICAgICAgICAgICAgIEFDUElfVFlQRV9JTlRFR0VSLCAgICAgICAgICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTElURVJBTCwgICAgICAgICBBTUxfQ09OU1RBTlQpLAotLyogMDYgKi8gQUNQSV9PUCAoIkR3b3JkQ29uc3QiLCAgICAgICAgIEFSR1BfRFdPUkRfT1AsICAgICAgICAgICAgIEFSR0lfRFdPUkRfT1AsICAgICAgICAgICAgICBBQ1BJX1RZUEVfSU5URUdFUiwgICAgICAgICAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX0xJVEVSQUwsICAgICAgICAgQU1MX0NPTlNUQU5UKSwKLS8qIDA3ICovIEFDUElfT1AgKCJTdHJpbmciLCAgICAgICAgICAgICBBUkdQX1NUUklOR19PUCwgICAgICAgICAgICBBUkdJX1NUUklOR19PUCwgICAgICAgICAgICAgQUNQSV9UWVBFX1NUUklORywgICAgICAgICAgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9MSVRFUkFMLCAgICAgICAgIEFNTF9DT05TVEFOVCksCi0vKiAwOCAqLyBBQ1BJX09QICgiU2NvcGUiLCAgICAgICAgICAgICAgQVJHUF9TQ09QRV9PUCwgICAgICAgICAgICAgQVJHSV9TQ09QRV9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9TQ09QRSwgICAgICAgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgICAgQU1MX1RZUEVfTkFNRURfTk9fT0JKLCAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKLS8qIDA5ICovIEFDUElfT1AgKCJCdWZmZXIiLCAgICAgICAgICAgICBBUkdQX0JVRkZFUl9PUCwgICAgICAgICAgICBBUkdJX0JVRkZFUl9PUCwgICAgICAgICAgICAgQUNQSV9UWVBFX0JVRkZFUiwgICAgICAgICAgICBBTUxfQ0xBU1NfQ1JFQVRFLCAgICAgICAgICBBTUxfVFlQRV9DUkVBVEVfT0JKRUNULCAgIEFNTF9IQVNfQVJHUyB8IEFNTF9ERUZFUiB8IEFNTF9DT05TVEFOVCksCi0vKiAwQSAqLyBBQ1BJX09QICgiUGFja2FnZSIsICAgICAgICAgICAgQVJHUF9QQUNLQUdFX09QLCAgICAgICAgICAgQVJHSV9QQUNLQUdFX09QLCAgICAgICAgICAgIEFDUElfVFlQRV9QQUNLQUdFLCAgICAgICAgICAgQU1MX0NMQVNTX0NSRUFURSwgICAgICAgICAgQU1MX1RZUEVfQ1JFQVRFX09CSkVDVCwgICBBTUxfSEFTX0FSR1MgfCBBTUxfREVGRVIgfCBBTUxfQ09OU1RBTlQpLAotLyogMEIgKi8gQUNQSV9PUCAoIk1ldGhvZCIsICAgICAgICAgICAgIEFSR1BfTUVUSE9EX09QLCAgICAgICAgICAgIEFSR0lfTUVUSE9EX09QLCAgICAgICAgICAgICBBQ1BJX1RZUEVfTUVUSE9ELCAgICAgICAgICAgIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsICAgIEFNTF9UWVBFX05BTUVEX0NPTVBMRVgsICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCB8IEFNTF9ERUZFUiksCi0vKiAwQyAqLyBBQ1BJX09QICgiTG9jYWwwIiwgICAgICAgICAgICAgQVJHUF9MT0NBTDAsICAgICAgICAgICAgICAgQVJHSV9MT0NBTDAsICAgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTE9DQUxfVkFSSUFCTEUsICAwKSwKLS8qIDBEICovIEFDUElfT1AgKCJMb2NhbDEiLCAgICAgICAgICAgICBBUkdQX0xPQ0FMMSwgICAgICAgICAgICAgICBBUkdJX0xPQ0FMMSwgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgIDApLAotLyogMEUgKi8gQUNQSV9PUCAoIkxvY2FsMiIsICAgICAgICAgICAgIEFSR1BfTE9DQUwyLCAgICAgICAgICAgICAgIEFSR0lfTE9DQUwyLCAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX0xPQ0FMX1ZBUklBQkxFLCAgMCksCi0vKiAwRiAqLyBBQ1BJX09QICgiTG9jYWwzIiwgICAgICAgICAgICAgQVJHUF9MT0NBTDMsICAgICAgICAgICAgICAgQVJHSV9MT0NBTDMsICAgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTE9DQUxfVkFSSUFCTEUsICAwKSwKLS8qIDEwICovIEFDUElfT1AgKCJMb2NhbDQiLCAgICAgICAgICAgICBBUkdQX0xPQ0FMNCwgICAgICAgICAgICAgICBBUkdJX0xPQ0FMNCwgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgIDApLAotLyogMTEgKi8gQUNQSV9PUCAoIkxvY2FsNSIsICAgICAgICAgICAgIEFSR1BfTE9DQUw1LCAgICAgICAgICAgICAgIEFSR0lfTE9DQUw1LCAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX0xPQ0FMX1ZBUklBQkxFLCAgMCksCi0vKiAxMiAqLyBBQ1BJX09QICgiTG9jYWw2IiwgICAgICAgICAgICAgQVJHUF9MT0NBTDYsICAgICAgICAgICAgICAgQVJHSV9MT0NBTDYsICAgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTE9DQUxfVkFSSUFCTEUsICAwKSwKLS8qIDEzICovIEFDUElfT1AgKCJMb2NhbDciLCAgICAgICAgICAgICBBUkdQX0xPQ0FMNywgICAgICAgICAgICAgICBBUkdJX0xPQ0FMNywgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgIDApLAotLyogMTQgKi8gQUNQSV9PUCAoIkFyZzAiLCAgICAgICAgICAgICAgIEFSR1BfQVJHMCwgICAgICAgICAgICAgICAgIEFSR0lfQVJHMCwgICAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCi0vKiAxNSAqLyBBQ1BJX09QICgiQXJnMSIsICAgICAgICAgICAgICAgQVJHUF9BUkcxLCAgICAgICAgICAgICAgICAgQVJHSV9BUkcxLCAgICAgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTUVUSE9EX0FSR1VNRU5ULCAwKSwKLS8qIDE2ICovIEFDUElfT1AgKCJBcmcyIiwgICAgICAgICAgICAgICBBUkdQX0FSRzIsICAgICAgICAgICAgICAgICBBUkdJX0FSRzIsICAgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAotLyogMTcgKi8gQUNQSV9PUCAoIkFyZzMiLCAgICAgICAgICAgICAgIEFSR1BfQVJHMywgICAgICAgICAgICAgICAgIEFSR0lfQVJHMywgICAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCi0vKiAxOCAqLyBBQ1BJX09QICgiQXJnNCIsICAgICAgICAgICAgICAgQVJHUF9BUkc0LCAgICAgICAgICAgICAgICAgQVJHSV9BUkc0LCAgICAgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTUVUSE9EX0FSR1VNRU5ULCAwKSwKLS8qIDE5ICovIEFDUElfT1AgKCJBcmc1IiwgICAgICAgICAgICAgICBBUkdQX0FSRzUsICAgICAgICAgICAgICAgICBBUkdJX0FSRzUsICAgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAotLyogMUEgKi8gQUNQSV9PUCAoIkFyZzYiLCAgICAgICAgICAgICAgIEFSR1BfQVJHNiwgICAgICAgICAgICAgICAgIEFSR0lfQVJHNiwgICAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCi0vKiAxQiAqLyBBQ1BJX09QICgiU3RvcmUiLCAgICAgICAgICAgICAgQVJHUF9TVE9SRV9PUCwgICAgICAgICAgICAgQVJHSV9TVE9SRV9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiksCi0vKiAxQyAqLyBBQ1BJX09QICgiUmVmT2YiLCAgICAgICAgICAgICAgQVJHUF9SRUZfT0ZfT1AsICAgICAgICAgICAgQVJHSV9SRUZfT0ZfT1AsICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiksCi0vKiAxRCAqLyBBQ1BJX09QICgiQWRkIiwgICAgICAgICAgICAgICAgQVJHUF9BRERfT1AsICAgICAgICAgICAgICAgQVJHSV9BRERfT1AsICAgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDFFICovIEFDUElfT1AgKCJDb25jYXRlbmF0ZSIsICAgICAgICBBUkdQX0NPTkNBVF9PUCwgICAgICAgICAgICBBUkdJX0NPTkNBVF9PUCwgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDFGICovIEFDUElfT1AgKCJTdWJ0cmFjdCIsICAgICAgICAgICBBUkdQX1NVQlRSQUNUX09QLCAgICAgICAgICBBUkdJX1NVQlRSQUNUX09QLCAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAotLyogMjAgKi8gQUNQSV9PUCAoIkluY3JlbWVudCIsICAgICAgICAgIEFSR1BfSU5DUkVNRU5UX09QLCAgICAgICAgIEFSR0lfSU5DUkVNRU5UX09QLCAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogMjEgKi8gQUNQSV9PUCAoIkRlY3JlbWVudCIsICAgICAgICAgIEFSR1BfREVDUkVNRU5UX09QLCAgICAgICAgIEFSR0lfREVDUkVNRU5UX09QLCAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogMjIgKi8gQUNQSV9PUCAoIk11bHRpcGx5IiwgICAgICAgICAgIEFSR1BfTVVMVElQTFlfT1AsICAgICAgICAgIEFSR0lfTVVMVElQTFlfT1AsICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCi0vKiAyMyAqLyBBQ1BJX09QICgiRGl2aWRlIiwgICAgICAgICAgICAgQVJHUF9ESVZJREVfT1AsICAgICAgICAgICAgQVJHSV9ESVZJREVfT1AsICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8yVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8yVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiAyNCAqLyBBQ1BJX09QICgiU2hpZnRMZWZ0IiwgICAgICAgICAgQVJHUF9TSElGVF9MRUZUX09QLCAgICAgICAgQVJHSV9TSElGVF9MRUZUX09QLCAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDI1ICovIEFDUElfT1AgKCJTaGlmdFJpZ2h0IiwgICAgICAgICBBUkdQX1NISUZUX1JJR0hUX09QLCAgICAgICBBUkdJX1NISUZUX1JJR0hUX09QLCAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAotLyogMjYgKi8gQUNQSV9PUCAoIkFuZCIsICAgICAgICAgICAgICAgIEFSR1BfQklUX0FORF9PUCwgICAgICAgICAgIEFSR0lfQklUX0FORF9PUCwgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCi0vKiAyNyAqLyBBQ1BJX09QICgiTkFuZCIsICAgICAgICAgICAgICAgQVJHUF9CSVRfTkFORF9PUCwgICAgICAgICAgQVJHSV9CSVRfTkFORF9PUCwgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDI4ICovIEFDUElfT1AgKCJPciIsICAgICAgICAgICAgICAgICBBUkdQX0JJVF9PUl9PUCwgICAgICAgICAgICBBUkdJX0JJVF9PUl9PUCwgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAotLyogMjkgKi8gQUNQSV9PUCAoIk5PciIsICAgICAgICAgICAgICAgIEFSR1BfQklUX05PUl9PUCwgICAgICAgICAgIEFSR0lfQklUX05PUl9PUCwgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCi0vKiAyQSAqLyBBQ1BJX09QICgiWE9yIiwgICAgICAgICAgICAgICAgQVJHUF9CSVRfWE9SX09QLCAgICAgICAgICAgQVJHSV9CSVRfWE9SX09QLCAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDJCICovIEFDUElfT1AgKCJOb3QiLCAgICAgICAgICAgICAgICBBUkdQX0JJVF9OT1RfT1AsICAgICAgICAgICBBUkdJX0JJVF9OT1RfT1AsICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDJDICovIEFDUElfT1AgKCJGaW5kU2V0TGVmdEJpdCIsICAgICBBUkdQX0ZJTkRfU0VUX0xFRlRfQklUX09QLCBBUkdJX0ZJTkRfU0VUX0xFRlRfQklUX09QLCAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDJEICovIEFDUElfT1AgKCJGaW5kU2V0UmlnaHRCaXQiLCAgICBBUkdQX0ZJTkRfU0VUX1JJR0hUX0JJVF9PUCxBUkdJX0ZJTkRfU0VUX1JJR0hUX0JJVF9PUCwgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDJFICovIEFDUElfT1AgKCJEZXJlZk9mIiwgICAgICAgICAgICBBUkdQX0RFUkVGX09GX09QLCAgICAgICAgICBBUkdJX0RFUkVGX09GX09QLCAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSKSwKLS8qIDJGICovIEFDUElfT1AgKCJOb3RpZnkiLCAgICAgICAgICAgICBBUkdQX05PVElGWV9PUCwgICAgICAgICAgICBBUkdJX05PVElGWV9PUCwgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzBUXzBSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzBUXzBSKSwKLS8qIDMwICovIEFDUElfT1AgKCJTaXplT2YiLCAgICAgICAgICAgICBBUkdQX1NJWkVfT0ZfT1AsICAgICAgICAgICBBUkdJX1NJWkVfT0ZfT1AsICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSIHwgQU1MX05PX09QRVJBTkRfUkVTT0xWRSksCi0vKiAzMSAqLyBBQ1BJX09QICgiSW5kZXgiLCAgICAgICAgICAgICAgQVJHUF9JTkRFWF9PUCwgICAgICAgICAgICAgQVJHSV9JTkRFWF9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiksCi0vKiAzMiAqLyBBQ1BJX09QICgiTWF0Y2giLCAgICAgICAgICAgICAgQVJHUF9NQVRDSF9PUCwgICAgICAgICAgICAgQVJHSV9NQVRDSF9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ182QV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ182QV8wVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiAzMyAqLyBBQ1BJX09QICgiQ3JlYXRlRFdvcmRGaWVsZCIsICAgQVJHUF9DUkVBVEVfRFdPUkRfRklFTERfT1AsQVJHSV9DUkVBVEVfRFdPUkRfRklFTERfT1AsIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsICAgICAgQU1MX0NMQVNTX0NSRUFURSwgICAgICAgICAgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELCAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwgQU1MX0RFRkVSIHwgQU1MX0NSRUFURSksCi0vKiAzNCAqLyBBQ1BJX09QICgiQ3JlYXRlV29yZEZpZWxkIiwgICAgQVJHUF9DUkVBVEVfV09SRF9GSUVMRF9PUCwgQVJHSV9DUkVBVEVfV09SRF9GSUVMRF9PUCwgIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsICAgICAgQU1MX0NMQVNTX0NSRUFURSwgICAgICAgICAgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELCAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwgQU1MX0RFRkVSIHwgQU1MX0NSRUFURSksCi0vKiAzNSAqLyBBQ1BJX09QICgiQ3JlYXRlQnl0ZUZpZWxkIiwgICAgQVJHUF9DUkVBVEVfQllURV9GSUVMRF9PUCwgQVJHSV9DUkVBVEVfQllURV9GSUVMRF9PUCwgIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsICAgICAgQU1MX0NMQVNTX0NSRUFURSwgICAgICAgICAgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELCAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwgQU1MX0RFRkVSIHwgQU1MX0NSRUFURSksCi0vKiAzNiAqLyBBQ1BJX09QICgiQ3JlYXRlQml0RmllbGQiLCAgICAgQVJHUF9DUkVBVEVfQklUX0ZJRUxEX09QLCAgQVJHSV9DUkVBVEVfQklUX0ZJRUxEX09QLCAgIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsICAgICAgQU1MX0NMQVNTX0NSRUFURSwgICAgICAgICAgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELCAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwgQU1MX0RFRkVSIHwgQU1MX0NSRUFURSksCi0vKiAzNyAqLyBBQ1BJX09QICgiT2JqZWN0VHlwZSIsICAgICAgICAgQVJHUF9UWVBFX09QLCAgICAgICAgICAgICAgQVJHSV9UWVBFX09QLCAgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiB8IEFNTF9OT19PUEVSQU5EX1JFU09MVkUpLAotLyogMzggKi8gQUNQSV9PUCAoIkxBbmQiLCAgICAgICAgICAgICAgIEFSR1BfTEFORF9PUCwgICAgICAgICAgICAgIEFSR0lfTEFORF9PUCwgICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMFRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIgfCBBTUxfTE9HSUNBTF9OVU1FUklDIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDM5ICovIEFDUElfT1AgKCJMT3IiLCAgICAgICAgICAgICAgICBBUkdQX0xPUl9PUCwgICAgICAgICAgICAgICBBUkdJX0xPUl9PUCwgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUxfTlVNRVJJQyB8IEFNTF9DT05TVEFOVCksCi0vKiAzQSAqLyBBQ1BJX09QICgiTE5vdCIsICAgICAgICAgICAgICAgQVJHUF9MTk9UX09QLCAgICAgICAgICAgICAgQVJHSV9MTk9UX09QLCAgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiAzQiAqLyBBQ1BJX09QICgiTEVxdWFsIiwgICAgICAgICAgICAgQVJHUF9MRVFVQUxfT1AsICAgICAgICAgICAgQVJHSV9MRVFVQUxfT1AsICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiB8IEFNTF9MT0dJQ0FMIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDNDICovIEFDUElfT1AgKCJMR3JlYXRlciIsICAgICAgICAgICBBUkdQX0xHUkVBVEVSX09QLCAgICAgICAgICBBUkdJX0xHUkVBVEVSX09QLCAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUwgfCBBTUxfQ09OU1RBTlQpLAotLyogM0QgKi8gQUNQSV9PUCAoIkxMZXNzIiwgICAgICAgICAgICAgIEFSR1BfTExFU1NfT1AsICAgICAgICAgICAgIEFSR0lfTExFU1NfT1AsICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMFRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIgfCBBTUxfTE9HSUNBTCB8IEFNTF9DT05TVEFOVCksCi0vKiAzRSAqLyBBQ1BJX09QICgiSWYiLCAgICAgICAgICAgICAgICAgQVJHUF9JRl9PUCwgICAgICAgICAgICAgICAgQVJHSV9JRl9PUCwgICAgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0NPTlRST0wsICAgICAgICAgQU1MX1RZUEVfQ09OVFJPTCwgICAgICAgICBBTUxfSEFTX0FSR1MpLAotLyogM0YgKi8gQUNQSV9PUCAoIkVsc2UiLCAgICAgICAgICAgICAgIEFSR1BfRUxTRV9PUCwgICAgICAgICAgICAgIEFSR0lfRUxTRV9PUCwgICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19DT05UUk9MLCAgICAgICAgIEFNTF9UWVBFX0NPTlRST0wsICAgICAgICAgQU1MX0hBU19BUkdTKSwKLS8qIDQwICovIEFDUElfT1AgKCJXaGlsZSIsICAgICAgICAgICAgICBBUkdQX1dISUxFX09QLCAgICAgICAgICAgICBBUkdJX1dISUxFX09QLCAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfQ09OVFJPTCwgICAgICAgICBBTUxfVFlQRV9DT05UUk9MLCAgICAgICAgIEFNTF9IQVNfQVJHUyksCi0vKiA0MSAqLyBBQ1BJX09QICgiTm9vcCIsICAgICAgICAgICAgICAgQVJHUF9OT09QX09QLCAgICAgICAgICAgICAgQVJHSV9OT09QX09QLCAgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0NPTlRST0wsICAgICAgICAgQU1MX1RZUEVfQ09OVFJPTCwgICAgICAgICAwKSwKLS8qIDQyICovIEFDUElfT1AgKCJSZXR1cm4iLCAgICAgICAgICAgICBBUkdQX1JFVFVSTl9PUCwgICAgICAgICAgICBBUkdJX1JFVFVSTl9PUCwgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfQ09OVFJPTCwgICAgICAgICBBTUxfVFlQRV9DT05UUk9MLCAgICAgICAgIEFNTF9IQVNfQVJHUyksCi0vKiA0MyAqLyBBQ1BJX09QICgiQnJlYWsiLCAgICAgICAgICAgICAgQVJHUF9CUkVBS19PUCwgICAgICAgICAgICAgQVJHSV9CUkVBS19PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0NPTlRST0wsICAgICAgICAgQU1MX1RZUEVfQ09OVFJPTCwgICAgICAgICAwKSwKLS8qIDQ0ICovIEFDUElfT1AgKCJCcmVha1BvaW50IiwgICAgICAgICBBUkdQX0JSRUFLX1BPSU5UX09QLCAgICAgICBBUkdJX0JSRUFLX1BPSU5UX09QLCAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfQ09OVFJPTCwgICAgICAgICBBTUxfVFlQRV9DT05UUk9MLCAgICAgICAgIDApLAotLyogNDUgKi8gQUNQSV9PUCAoIk9uZXMiLCAgICAgICAgICAgICAgIEFSR1BfT05FU19PUCwgICAgICAgICAgICAgIEFSR0lfT05FU19PUCwgICAgICAgICAgICAgICBBQ1BJX1RZUEVfSU5URUdFUiwgICAgICAgICAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX0NPTlNUQU5ULCAgICAgICAgQU1MX0NPTlNUQU5UKSwKKy8qIDAwICovIEFDUElfT1AoIlplcm8iLCBBUkdQX1pFUk9fT1AsIEFSR0lfWkVST19PUCwgQUNQSV9UWVBFX0lOVEVHRVIsCisJCQkgQU1MX0NMQVNTX0FSR1VNRU5ULCBBTUxfVFlQRV9DT05TVEFOVCwgQU1MX0NPTlNUQU5UKSwKKy8qIDAxICovIEFDUElfT1AoIk9uZSIsIEFSR1BfT05FX09QLCBBUkdJX09ORV9PUCwgQUNQSV9UWVBFX0lOVEVHRVIsCisJCQkgQU1MX0NMQVNTX0FSR1VNRU5ULCBBTUxfVFlQRV9DT05TVEFOVCwgQU1MX0NPTlNUQU5UKSwKKy8qIDAyICovIEFDUElfT1AoIkFsaWFzIiwgQVJHUF9BTElBU19PUCwgQVJHSV9BTElBU19PUCwKKwkJCSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVMsIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsCisJCQkgQU1MX1RZUEVfTkFNRURfU0lNUExFLAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8CisJCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCisvKiAwMyAqLyBBQ1BJX09QKCJOYW1lIiwgQVJHUF9OQU1FX09QLCBBUkdJX05BTUVfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgQU1MX1RZUEVfTkFNRURfQ09NUExFWCwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAorLyogMDQgKi8gQUNQSV9PUCgiQnl0ZUNvbnN0IiwgQVJHUF9CWVRFX09QLCBBUkdJX0JZVEVfT1AsCisJCQkgQUNQSV9UWVBFX0lOVEVHRVIsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9MSVRFUkFMLCBBTUxfQ09OU1RBTlQpLAorLyogMDUgKi8gQUNQSV9PUCgiV29yZENvbnN0IiwgQVJHUF9XT1JEX09QLCBBUkdJX1dPUkRfT1AsCisJCQkgQUNQSV9UWVBFX0lOVEVHRVIsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9MSVRFUkFMLCBBTUxfQ09OU1RBTlQpLAorLyogMDYgKi8gQUNQSV9PUCgiRHdvcmRDb25zdCIsIEFSR1BfRFdPUkRfT1AsIEFSR0lfRFdPUkRfT1AsCisJCQkgQUNQSV9UWVBFX0lOVEVHRVIsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9MSVRFUkFMLCBBTUxfQ09OU1RBTlQpLAorLyogMDcgKi8gQUNQSV9PUCgiU3RyaW5nIiwgQVJHUF9TVFJJTkdfT1AsIEFSR0lfU1RSSU5HX09QLAorCQkJIEFDUElfVFlQRV9TVFJJTkcsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9MSVRFUkFMLCBBTUxfQ09OU1RBTlQpLAorLyogMDggKi8gQUNQSV9PUCgiU2NvcGUiLCBBUkdQX1NDT1BFX09QLCBBUkdJX1NDT1BFX09QLAorCQkJIEFDUElfVFlQRV9MT0NBTF9TQ09QRSwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKKwkJCSBBTUxfVFlQRV9OQU1FRF9OT19PQkosCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKKy8qIDA5ICovIEFDUElfT1AoIkJ1ZmZlciIsIEFSR1BfQlVGRkVSX09QLCBBUkdJX0JVRkZFUl9PUCwKKwkJCSBBQ1BJX1RZUEVfQlVGRkVSLCBBTUxfQ0xBU1NfQ1JFQVRFLAorCQkJIEFNTF9UWVBFX0NSRUFURV9PQkpFQ1QsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX0RFRkVSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDBBICovIEFDUElfT1AoIlBhY2thZ2UiLCBBUkdQX1BBQ0tBR0VfT1AsIEFSR0lfUEFDS0FHRV9PUCwKKwkJCSBBQ1BJX1RZUEVfUEFDS0FHRSwgQU1MX0NMQVNTX0NSRUFURSwKKwkJCSBBTUxfVFlQRV9DUkVBVEVfT0JKRUNULAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9ERUZFUiB8IEFNTF9DT05TVEFOVCksCisvKiAwQiAqLyBBQ1BJX09QKCJNZXRob2QiLCBBUkdQX01FVEhPRF9PUCwgQVJHSV9NRVRIT0RfT1AsCisJCQkgQUNQSV9UWVBFX01FVEhPRCwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKKwkJCSBBTUxfVFlQRV9OQU1FRF9DT01QTEVYLAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8CisJCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCB8IEFNTF9ERUZFUiksCisvKiAwQyAqLyBBQ1BJX09QKCJMb2NhbDAiLCBBUkdQX0xPQ0FMMCwgQVJHSV9MT0NBTDAsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX0xPQ0FMX1ZBUklBQkxFLCAwKSwKKy8qIDBEICovIEFDUElfT1AoIkxvY2FsMSIsIEFSR1BfTE9DQUwxLCBBUkdJX0xPQ0FMMSwKKwkJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCQkgQU1MX1RZUEVfTE9DQUxfVkFSSUFCTEUsIDApLAorLyogMEUgKi8gQUNQSV9PUCgiTG9jYWwyIiwgQVJHUF9MT0NBTDIsIEFSR0lfTE9DQUwyLAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAwRiAqLyBBQ1BJX09QKCJMb2NhbDMiLCBBUkdQX0xPQ0FMMywgQVJHSV9MT0NBTDMsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX0xPQ0FMX1ZBUklBQkxFLCAwKSwKKy8qIDEwICovIEFDUElfT1AoIkxvY2FsNCIsIEFSR1BfTE9DQUw0LCBBUkdJX0xPQ0FMNCwKKwkJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCQkgQU1MX1RZUEVfTE9DQUxfVkFSSUFCTEUsIDApLAorLyogMTEgKi8gQUNQSV9PUCgiTG9jYWw1IiwgQVJHUF9MT0NBTDUsIEFSR0lfTE9DQUw1LAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAxMiAqLyBBQ1BJX09QKCJMb2NhbDYiLCBBUkdQX0xPQ0FMNiwgQVJHSV9MT0NBTDYsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX0xPQ0FMX1ZBUklBQkxFLCAwKSwKKy8qIDEzICovIEFDUElfT1AoIkxvY2FsNyIsIEFSR1BfTE9DQUw3LCBBUkdJX0xPQ0FMNywKKwkJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCQkgQU1MX1RZUEVfTE9DQUxfVkFSSUFCTEUsIDApLAorLyogMTQgKi8gQUNQSV9PUCgiQXJnMCIsIEFSR1BfQVJHMCwgQVJHSV9BUkcwLAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAorLyogMTUgKi8gQUNQSV9PUCgiQXJnMSIsIEFSR1BfQVJHMSwgQVJHSV9BUkcxLAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAorLyogMTYgKi8gQUNQSV9PUCgiQXJnMiIsIEFSR1BfQVJHMiwgQVJHSV9BUkcyLAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAorLyogMTcgKi8gQUNQSV9PUCgiQXJnMyIsIEFSR1BfQVJHMywgQVJHSV9BUkczLAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAorLyogMTggKi8gQUNQSV9PUCgiQXJnNCIsIEFSR1BfQVJHNCwgQVJHSV9BUkc0LAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAorLyogMTkgKi8gQUNQSV9PUCgiQXJnNSIsIEFSR1BfQVJHNSwgQVJHSV9BUkc1LAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAorLyogMUEgKi8gQUNQSV9PUCgiQXJnNiIsIEFSR1BfQVJHNiwgQVJHSV9BUkc2LAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAorLyogMUIgKi8gQUNQSV9PUCgiU3RvcmUiLCBBUkdQX1NUT1JFX09QLCBBUkdJX1NUT1JFX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSKSwKKy8qIDFDICovIEFDUElfT1AoIlJlZk9mIiwgQVJHUF9SRUZfT0ZfT1AsIEFSR0lfUkVGX09GX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSKSwKKy8qIDFEICovIEFDUElfT1AoIkFkZCIsIEFSR1BfQUREX09QLCBBUkdJX0FERF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDFFICovIEFDUElfT1AoIkNvbmNhdGVuYXRlIiwgQVJHUF9DT05DQVRfT1AsIEFSR0lfQ09OQ0FUX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogMUYgKi8gQUNQSV9PUCgiU3VidHJhY3QiLCBBUkdQX1NVQlRSQUNUX09QLCBBUkdJX1NVQlRSQUNUX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCisvKiAyMCAqLyBBQ1BJX09QKCJJbmNyZW1lbnQiLCBBUkdQX0lOQ1JFTUVOVF9PUCwgQVJHSV9JTkNSRU1FTlRfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiAyMSAqLyBBQ1BJX09QKCJEZWNyZW1lbnQiLCBBUkdQX0RFQ1JFTUVOVF9PUCwgQVJHSV9ERUNSRU1FTlRfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiAyMiAqLyBBQ1BJX09QKCJNdWx0aXBseSIsIEFSR1BfTVVMVElQTFlfT1AsIEFSR0lfTVVMVElQTFlfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDIzICovIEFDUElfT1AoIkRpdmlkZSIsIEFSR1BfRElWSURFX09QLCBBUkdJX0RJVklERV9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzJBXzJUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzJUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDI0ICovIEFDUElfT1AoIlNoaWZ0TGVmdCIsIEFSR1BfU0hJRlRfTEVGVF9PUCwgQVJHSV9TSElGVF9MRUZUX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCisvKiAyNSAqLyBBQ1BJX09QKCJTaGlmdFJpZ2h0IiwgQVJHUF9TSElGVF9SSUdIVF9PUCwgQVJHSV9TSElGVF9SSUdIVF9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAorLyogMjYgKi8gQUNQSV9PUCgiQW5kIiwgQVJHUF9CSVRfQU5EX09QLCBBUkdJX0JJVF9BTkRfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCisvKiAyNyAqLyBBQ1BJX09QKCJOQW5kIiwgQVJHUF9CSVRfTkFORF9PUCwgQVJHSV9CSVRfTkFORF9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAorLyogMjggKi8gQUNQSV9PUCgiT3IiLCBBUkdQX0JJVF9PUl9PUCwgQVJHSV9CSVRfT1JfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCisvKiAyOSAqLyBBQ1BJX09QKCJOT3IiLCBBUkdQX0JJVF9OT1JfT1AsIEFSR0lfQklUX05PUl9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDJBICovIEFDUElfT1AoIlhPciIsIEFSR1BfQklUX1hPUl9PUCwgQVJHSV9CSVRfWE9SX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAorLyogMkIgKi8gQUNQSV9PUCgiTm90IiwgQVJHUF9CSVRfTk9UX09QLCBBUkdJX0JJVF9OT1RfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogMkMgKi8gQUNQSV9PUCgiRmluZFNldExlZnRCaXQiLCBBUkdQX0ZJTkRfU0VUX0xFRlRfQklUX09QLAorCQkJIEFSR0lfRklORF9TRVRfTEVGVF9CSVRfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogMkQgKi8gQUNQSV9PUCgiRmluZFNldFJpZ2h0Qml0IiwgQVJHUF9GSU5EX1NFVF9SSUdIVF9CSVRfT1AsCisJCQkgQVJHSV9GSU5EX1NFVF9SSUdIVF9CSVRfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogMkUgKi8gQUNQSV9PUCgiRGVyZWZPZiIsIEFSR1BfREVSRUZfT0ZfT1AsIEFSR0lfREVSRUZfT0ZfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIpLAorLyogMkYgKi8gQUNQSV9PUCgiTm90aWZ5IiwgQVJHUF9OT1RJRllfT1AsIEFSR0lfTk9USUZZX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMkFfMFRfMFIsIEFNTF9GTEFHU19FWEVDXzJBXzBUXzBSKSwKKy8qIDMwICovIEFDUElfT1AoIlNpemVPZiIsIEFSR1BfU0laRV9PRl9PUCwgQVJHSV9TSVpFX09GX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIgfCBBTUxfTk9fT1BFUkFORF9SRVNPTFZFKSwKKy8qIDMxICovIEFDUElfT1AoIkluZGV4IiwgQVJHUF9JTkRFWF9PUCwgQVJHSV9JTkRFWF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiksCisvKiAzMiAqLyBBQ1BJX09QKCJNYXRjaCIsIEFSR1BfTUFUQ0hfT1AsIEFSR0lfTUFUQ0hfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfNkFfMFRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfNkFfMFRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogMzMgKi8gQUNQSV9PUCgiQ3JlYXRlRFdvcmRGaWVsZCIsIEFSR1BfQ1JFQVRFX0RXT1JEX0ZJRUxEX09QLAorCQkJIEFSR0lfQ1JFQVRFX0RXT1JEX0ZJRUxEX09QLAorCQkJIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsIEFNTF9DTEFTU19DUkVBVEUsCisJCQkgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgfAorCQkJIEFNTF9ERUZFUiB8IEFNTF9DUkVBVEUpLAorLyogMzQgKi8gQUNQSV9PUCgiQ3JlYXRlV29yZEZpZWxkIiwgQVJHUF9DUkVBVEVfV09SRF9GSUVMRF9PUCwKKwkJCSBBUkdJX0NSRUFURV9XT1JEX0ZJRUxEX09QLAorCQkJIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsIEFNTF9DTEFTU19DUkVBVEUsCisJCQkgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgfAorCQkJIEFNTF9ERUZFUiB8IEFNTF9DUkVBVEUpLAorLyogMzUgKi8gQUNQSV9PUCgiQ3JlYXRlQnl0ZUZpZWxkIiwgQVJHUF9DUkVBVEVfQllURV9GSUVMRF9PUCwKKwkJCSBBUkdJX0NSRUFURV9CWVRFX0ZJRUxEX09QLAorCQkJIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsIEFNTF9DTEFTU19DUkVBVEUsCisJCQkgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgfAorCQkJIEFNTF9ERUZFUiB8IEFNTF9DUkVBVEUpLAorLyogMzYgKi8gQUNQSV9PUCgiQ3JlYXRlQml0RmllbGQiLCBBUkdQX0NSRUFURV9CSVRfRklFTERfT1AsCisJCQkgQVJHSV9DUkVBVEVfQklUX0ZJRUxEX09QLAorCQkJIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsIEFNTF9DTEFTU19DUkVBVEUsCisJCQkgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgfAorCQkJIEFNTF9ERUZFUiB8IEFNTF9DUkVBVEUpLAorLyogMzcgKi8gQUNQSV9PUCgiT2JqZWN0VHlwZSIsIEFSR1BfVFlQRV9PUCwgQVJHSV9UWVBFX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIgfCBBTUxfTk9fT1BFUkFORF9SRVNPTFZFKSwKKy8qIDM4ICovIEFDUElfT1AoIkxBbmQiLCBBUkdQX0xBTkRfT1AsIEFSR0lfTEFORF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiB8IEFNTF9MT0dJQ0FMX05VTUVSSUMgfAorCQkJIEFNTF9DT05TVEFOVCksCisvKiAzOSAqLyBBQ1BJX09QKCJMT3IiLCBBUkdQX0xPUl9PUCwgQVJHSV9MT1JfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMFRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIgfCBBTUxfTE9HSUNBTF9OVU1FUklDIHwKKwkJCSBBTUxfQ09OU1RBTlQpLAorLyogM0EgKi8gQUNQSV9PUCgiTE5vdCIsIEFSR1BfTE5PVF9PUCwgQVJHSV9MTk9UX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDNCICovIEFDUElfT1AoIkxFcXVhbCIsIEFSR1BfTEVRVUFMX09QLCBBUkdJX0xFUVVBTF9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUwgfCBBTUxfQ09OU1RBTlQpLAorLyogM0MgKi8gQUNQSV9PUCgiTEdyZWF0ZXIiLCBBUkdQX0xHUkVBVEVSX09QLCBBUkdJX0xHUkVBVEVSX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMkFfMFRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIgfCBBTUxfTE9HSUNBTCB8IEFNTF9DT05TVEFOVCksCisvKiAzRCAqLyBBQ1BJX09QKCJMTGVzcyIsIEFSR1BfTExFU1NfT1AsIEFSR0lfTExFU1NfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMFRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIgfCBBTUxfTE9HSUNBTCB8IEFNTF9DT05TVEFOVCksCisvKiAzRSAqLyBBQ1BJX09QKCJJZiIsIEFSR1BfSUZfT1AsIEFSR0lfSUZfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIEFNTF9IQVNfQVJHUyksCisvKiAzRiAqLyBBQ1BJX09QKCJFbHNlIiwgQVJHUF9FTFNFX09QLCBBUkdJX0VMU0VfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIEFNTF9IQVNfQVJHUyksCisvKiA0MCAqLyBBQ1BJX09QKCJXaGlsZSIsIEFSR1BfV0hJTEVfT1AsIEFSR0lfV0hJTEVfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIEFNTF9IQVNfQVJHUyksCisvKiA0MSAqLyBBQ1BJX09QKCJOb29wIiwgQVJHUF9OT09QX09QLCBBUkdJX05PT1BfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIDApLAorLyogNDIgKi8gQUNQSV9PUCgiUmV0dXJuIiwgQVJHUF9SRVRVUk5fT1AsIEFSR0lfUkVUVVJOX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19DT05UUk9MLAorCQkJIEFNTF9UWVBFX0NPTlRST0wsIEFNTF9IQVNfQVJHUyksCisvKiA0MyAqLyBBQ1BJX09QKCJCcmVhayIsIEFSR1BfQlJFQUtfT1AsIEFSR0lfQlJFQUtfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIDApLAorLyogNDQgKi8gQUNQSV9PUCgiQnJlYWtQb2ludCIsIEFSR1BfQlJFQUtfUE9JTlRfT1AsIEFSR0lfQlJFQUtfUE9JTlRfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIDApLAorLyogNDUgKi8gQUNQSV9PUCgiT25lcyIsIEFSR1BfT05FU19PUCwgQVJHSV9PTkVTX09QLCBBQ1BJX1RZUEVfSU5URUdFUiwKKwkJCSBBTUxfQ0xBU1NfQVJHVU1FTlQsIEFNTF9UWVBFX0NPTlNUQU5ULCBBTUxfQ09OU1RBTlQpLAogCiAvKiBQcmVmaXhlZCBvcGNvZGVzIChUd28tYnl0ZSBvcGNvZGVzIHdpdGggYSBwcmVmaXggb3ApICovCiAKLS8qIDQ2ICovIEFDUElfT1AgKCJNdXRleCIsICAgICAgICAgICAgICBBUkdQX01VVEVYX09QLCAgICAgICAgICAgICBBUkdJX01VVEVYX09QLCAgICAgICAgICAgICAgQUNQSV9UWVBFX01VVEVYLCAgICAgICAgICAgICBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCAgICBBTUxfVFlQRV9OQU1FRF9TSU1QTEUsICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAotLyogNDcgKi8gQUNQSV9PUCAoIkV2ZW50IiwgICAgICAgICAgICAgIEFSR1BfRVZFTlRfT1AsICAgICAgICAgICAgIEFSR0lfRVZFTlRfT1AsICAgICAgICAgICAgICBBQ1BJX1RZUEVfRVZFTlQsICAgICAgICAgICAgIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsICAgIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwgICAgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCApLAotLyogNDggKi8gQUNQSV9PUCAoIkNvbmRSZWZPZiIsICAgICAgICAgIEFSR1BfQ09ORF9SRUZfT0ZfT1AsICAgICAgIEFSR0lfQ09ORF9SRUZfT0ZfT1AsICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIpLAotLyogNDkgKi8gQUNQSV9PUCAoIkNyZWF0ZUZpZWxkIiwgICAgICAgIEFSR1BfQ1JFQVRFX0ZJRUxEX09QLCAgICAgIEFSR0lfQ1JFQVRFX0ZJRUxEX09QLCAgICAgICBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxELCAgICAgIEFNTF9DTEFTU19DUkVBVEUsICAgICAgICAgIEFNTF9UWVBFX0NSRUFURV9GSUVMRCwgICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSB8IEFNTF9ERUZFUiB8IEFNTF9GSUVMRCB8IEFNTF9DUkVBVEUpLAotLyogNEEgKi8gQUNQSV9PUCAoIkxvYWQiLCAgICAgICAgICAgICAgIEFSR1BfTE9BRF9PUCwgICAgICAgICAgICAgIEFSR0lfTE9BRF9PUCwgICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMVRfMFIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMFIpLAotLyogNEIgKi8gQUNQSV9PUCAoIlN0YWxsIiwgICAgICAgICAgICAgIEFSR1BfU1RBTExfT1AsICAgICAgICAgICAgIEFSR0lfU1RBTExfT1AsICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAotLyogNEMgKi8gQUNQSV9PUCAoIlNsZWVwIiwgICAgICAgICAgICAgIEFSR1BfU0xFRVBfT1AsICAgICAgICAgICAgIEFSR0lfU0xFRVBfT1AsICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAotLyogNEQgKi8gQUNQSV9PUCAoIkFjcXVpcmUiLCAgICAgICAgICAgIEFSR1BfQUNRVUlSRV9PUCwgICAgICAgICAgIEFSR0lfQUNRVUlSRV9PUCwgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMFRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIpLAotLyogNEUgKi8gQUNQSV9PUCAoIlNpZ25hbCIsICAgICAgICAgICAgIEFSR1BfU0lHTkFMX09QLCAgICAgICAgICAgIEFSR0lfU0lHTkFMX09QLCAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAotLyogNEYgKi8gQUNQSV9PUCAoIldhaXQiLCAgICAgICAgICAgICAgIEFSR1BfV0FJVF9PUCwgICAgICAgICAgICAgIEFSR0lfV0FJVF9PUCwgICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMFRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIpLAotLyogNTAgKi8gQUNQSV9PUCAoIlJlc2V0IiwgICAgICAgICAgICAgIEFSR1BfUkVTRVRfT1AsICAgICAgICAgICAgIEFSR0lfUkVTRVRfT1AsICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAotLyogNTEgKi8gQUNQSV9PUCAoIlJlbGVhc2UiLCAgICAgICAgICAgIEFSR1BfUkVMRUFTRV9PUCwgICAgICAgICAgIEFSR0lfUkVMRUFTRV9PUCwgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAotLyogNTIgKi8gQUNQSV9PUCAoIkZyb21CQ0QiLCAgICAgICAgICAgIEFSR1BfRlJPTV9CQ0RfT1AsICAgICAgICAgIEFSR0lfRlJPTV9CQ0RfT1AsICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogNTMgKi8gQUNQSV9PUCAoIlRvQkNEIiwgICAgICAgICAgICAgIEFSR1BfVE9fQkNEX09QLCAgICAgICAgICAgIEFSR0lfVE9fQkNEX09QLCAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogNTQgKi8gQUNQSV9PUCAoIlVubG9hZCIsICAgICAgICAgICAgIEFSR1BfVU5MT0FEX09QLCAgICAgICAgICAgIEFSR0lfVU5MT0FEX09QLCAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAotLyogNTUgKi8gQUNQSV9PUCAoIlJldmlzaW9uIiwgICAgICAgICAgIEFSR1BfUkVWSVNJT05fT1AsICAgICAgICAgIEFSR0lfUkVWSVNJT05fT1AsICAgICAgICAgICBBQ1BJX1RZUEVfSU5URUdFUiwgICAgICAgICAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX0NPTlNUQU5ULCAgICAgICAgMCksCi0vKiA1NiAqLyBBQ1BJX09QICgiRGVidWciLCAgICAgICAgICAgICAgQVJHUF9ERUJVR19PUCwgICAgICAgICAgICAgQVJHSV9ERUJVR19PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfQ09OU1RBTlQsICAgICAgICAwKSwKLS8qIDU3ICovIEFDUElfT1AgKCJGYXRhbCIsICAgICAgICAgICAgICBBUkdQX0ZBVEFMX09QLCAgICAgICAgICAgICBBUkdJX0ZBVEFMX09QLCAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzNBXzBUXzBSLCAgIEFNTF9GTEFHU19FWEVDXzNBXzBUXzBSKSwKLS8qIDU4ICovIEFDUElfT1AgKCJPcGVyYXRpb25SZWdpb24iLCAgICBBUkdQX1JFR0lPTl9PUCwgICAgICAgICAgICBBUkdJX1JFR0lPTl9PUCwgICAgICAgICAgICAgQUNQSV9UWVBFX1JFR0lPTiwgICAgICAgICAgICBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCAgICBBTUxfVFlQRV9OQU1FRF9DT01QTEVYLCAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9OU05PREUgfCBBTUxfTkFNRUQgfCBBTUxfREVGRVIpLAotLyogNTkgKi8gQUNQSV9PUCAoIkZpZWxkIiwgICAgICAgICAgICAgIEFSR1BfRklFTERfT1AsICAgICAgICAgICAgIEFSR0lfRklFTERfT1AsICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsICAgIEFNTF9UWVBFX05BTUVEX0ZJRUxELCAgICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX0ZJRUxEKSwKLS8qIDVBICovIEFDUElfT1AgKCJEZXZpY2UiLCAgICAgICAgICAgICBBUkdQX0RFVklDRV9PUCwgICAgICAgICAgICBBUkdJX0RFVklDRV9PUCwgICAgICAgICAgICAgQUNQSV9UWVBFX0RFVklDRSwgICAgICAgICAgICBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCAgICBBTUxfVFlQRV9OQU1FRF9OT19PQkosICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAotLyogNUIgKi8gQUNQSV9PUCAoIlByb2Nlc3NvciIsICAgICAgICAgIEFSR1BfUFJPQ0VTU09SX09QLCAgICAgICAgIEFSR0lfUFJPQ0VTU09SX09QLCAgICAgICAgICBBQ1BJX1RZUEVfUFJPQ0VTU09SLCAgICAgICAgIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsICAgIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwgICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCi0vKiA1QyAqLyBBQ1BJX09QICgiUG93ZXJSZXNvdXJjZSIsICAgICAgQVJHUF9QT1dFUl9SRVNfT1AsICAgICAgICAgQVJHSV9QT1dFUl9SRVNfT1AsICAgICAgICAgIEFDUElfVFlQRV9QT1dFUiwgICAgICAgICAgICAgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgICAgQU1MX1RZUEVfTkFNRURfU0lNUExFLCAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKLS8qIDVEICovIEFDUElfT1AgKCJUaGVybWFsWm9uZSIsICAgICAgICBBUkdQX1RIRVJNQUxfWk9ORV9PUCwgICAgICBBUkdJX1RIRVJNQUxfWk9ORV9PUCwgICAgICAgQUNQSV9UWVBFX1RIRVJNQUwsICAgICAgICAgICBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCAgICBBTUxfVFlQRV9OQU1FRF9OT19PQkosICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAotLyogNUUgKi8gQUNQSV9PUCAoIkluZGV4RmllbGQiLCAgICAgICAgIEFSR1BfSU5ERVhfRklFTERfT1AsICAgICAgIEFSR0lfSU5ERVhfRklFTERfT1AsICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsICAgIEFNTF9UWVBFX05BTUVEX0ZJRUxELCAgICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX0ZJRUxEKSwKLS8qIDVGICovIEFDUElfT1AgKCJCYW5rRmllbGQiLCAgICAgICAgICBBUkdQX0JBTktfRklFTERfT1AsICAgICAgICBBUkdJX0JBTktfRklFTERfT1AsICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCAgICBBTUxfVFlQRV9OQU1FRF9GSUVMRCwgICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9GSUVMRCksCisvKiA0NiAqLyBBQ1BJX09QKCJNdXRleCIsIEFSR1BfTVVURVhfT1AsIEFSR0lfTVVURVhfT1AsIEFDUElfVFlQRV9NVVRFWCwKKwkJCSBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCBBTUxfVFlQRV9OQU1FRF9TSU1QTEUsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKKy8qIDQ3ICovIEFDUElfT1AoIkV2ZW50IiwgQVJHUF9FVkVOVF9PUCwgQVJHSV9FVkVOVF9PUCwgQUNQSV9UWVBFX0VWRU5ULAorCQkJIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwKKwkJCSBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKKy8qIDQ4ICovIEFDUElfT1AoIkNvbmRSZWZPZiIsIEFSR1BfQ09ORF9SRUZfT0ZfT1AsIEFSR0lfQ09ORF9SRUZfT0ZfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIpLAorLyogNDkgKi8gQUNQSV9PUCgiQ3JlYXRlRmllbGQiLCBBUkdQX0NSRUFURV9GSUVMRF9PUCwKKwkJCSBBUkdJX0NSRUFURV9GSUVMRF9PUCwgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwKKwkJCSBBTUxfQ0xBU1NfQ1JFQVRFLCBBTUxfVFlQRV9DUkVBVEVfRklFTEQsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSB8CisJCQkgQU1MX0RFRkVSIHwgQU1MX0ZJRUxEIHwgQU1MX0NSRUFURSksCisvKiA0QSAqLyBBQ1BJX09QKCJMb2FkIiwgQVJHUF9MT0FEX09QLCBBUkdJX0xPQURfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMFIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMFIpLAorLyogNEIgKi8gQUNQSV9PUCgiU3RhbGwiLCBBUkdQX1NUQUxMX09QLCBBUkdJX1NUQUxMX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzFBXzBUXzBSLAorCQkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSKSwKKy8qIDRDICovIEFDUElfT1AoIlNsZWVwIiwgQVJHUF9TTEVFUF9PUCwgQVJHSV9TTEVFUF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8wUiksCisvKiA0RCAqLyBBQ1BJX09QKCJBY3F1aXJlIiwgQVJHUF9BQ1FVSVJFX09QLCBBUkdJX0FDUVVJUkVfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIpLAorLyogNEUgKi8gQUNQSV9PUCgiU2lnbmFsIiwgQVJHUF9TSUdOQUxfT1AsIEFSR0lfU0lHTkFMX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSKSwKKy8qIDRGICovIEFDUElfT1AoIldhaXQiLCBBUkdQX1dBSVRfT1AsIEFSR0lfV0FJVF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiksCisvKiA1MCAqLyBBQ1BJX09QKCJSZXNldCIsIEFSR1BfUkVTRVRfT1AsIEFSR0lfUkVTRVRfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAorLyogNTEgKi8gQUNQSV9PUCgiUmVsZWFzZSIsIEFSR1BfUkVMRUFTRV9PUCwgQVJHSV9SRUxFQVNFX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSKSwKKy8qIDUyICovIEFDUElfT1AoIkZyb21CQ0QiLCBBUkdQX0ZST01fQkNEX09QLCBBUkdJX0ZST01fQkNEX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogNTMgKi8gQUNQSV9PUCgiVG9CQ0QiLCBBUkdQX1RPX0JDRF9PUCwgQVJHSV9UT19CQ0RfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogNTQgKi8gQUNQSV9PUCgiVW5sb2FkIiwgQVJHUF9VTkxPQURfT1AsIEFSR0lfVU5MT0FEX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSKSwKKy8qIDU1ICovIEFDUElfT1AoIlJldmlzaW9uIiwgQVJHUF9SRVZJU0lPTl9PUCwgQVJHSV9SRVZJU0lPTl9PUCwKKwkJCSBBQ1BJX1RZUEVfSU5URUdFUiwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX0NPTlNUQU5ULCAwKSwKKy8qIDU2ICovIEFDUElfT1AoIkRlYnVnIiwgQVJHUF9ERUJVR19PUCwgQVJHSV9ERUJVR19PUCwKKwkJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCQkgQU1MX1RZUEVfQ09OU1RBTlQsIDApLAorLyogNTcgKi8gQUNQSV9PUCgiRmF0YWwiLCBBUkdQX0ZBVEFMX09QLCBBUkdJX0ZBVEFMX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzNBXzBUXzBSLAorCQkJIEFNTF9GTEFHU19FWEVDXzNBXzBUXzBSKSwKKy8qIDU4ICovIEFDUElfT1AoIk9wZXJhdGlvblJlZ2lvbiIsIEFSR1BfUkVHSU9OX09QLCBBUkdJX1JFR0lPTl9PUCwKKwkJCSBBQ1BJX1RZUEVfUkVHSU9OLCBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULAorCQkJIEFNTF9UWVBFX05BTUVEX0NPTVBMRVgsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEIHwgQU1MX0RFRkVSKSwKKy8qIDU5ICovIEFDUElfT1AoIkZpZWxkIiwgQVJHUF9GSUVMRF9PUCwgQVJHSV9GSUVMRF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCBBTUxfVFlQRV9OQU1FRF9GSUVMRCwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkJIEFNTF9GSUVMRCksCisvKiA1QSAqLyBBQ1BJX09QKCJEZXZpY2UiLCBBUkdQX0RFVklDRV9PUCwgQVJHSV9ERVZJQ0VfT1AsCisJCQkgQUNQSV9UWVBFX0RFVklDRSwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKKwkJCSBBTUxfVFlQRV9OQU1FRF9OT19PQkosCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKKy8qIDVCICovIEFDUElfT1AoIlByb2Nlc3NvciIsIEFSR1BfUFJPQ0VTU09SX09QLCBBUkdJX1BST0NFU1NPUl9PUCwKKwkJCSBBQ1BJX1RZUEVfUFJPQ0VTU09SLCBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULAorCQkJIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAorLyogNUMgKi8gQUNQSV9PUCgiUG93ZXJSZXNvdXJjZSIsIEFSR1BfUE9XRVJfUkVTX09QLCBBUkdJX1BPV0VSX1JFU19PUCwKKwkJCSBBQ1BJX1RZUEVfUE9XRVIsIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsCisJCQkgQU1MX1RZUEVfTkFNRURfU0lNUExFLAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8CisJCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCisvKiA1RCAqLyBBQ1BJX09QKCJUaGVybWFsWm9uZSIsIEFSR1BfVEhFUk1BTF9aT05FX09QLAorCQkJIEFSR0lfVEhFUk1BTF9aT05FX09QLCBBQ1BJX1RZUEVfVEhFUk1BTCwKKwkJCSBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCBBTUxfVFlQRV9OQU1FRF9OT19PQkosCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKKy8qIDVFICovIEFDUElfT1AoIkluZGV4RmllbGQiLCBBUkdQX0lOREVYX0ZJRUxEX09QLCBBUkdJX0lOREVYX0ZJRUxEX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsCisJCQkgQU1MX1RZUEVfTkFNRURfRklFTEQsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJCSBBTUxfRklFTEQpLAorLyogNUYgKi8gQUNQSV9PUCgiQmFua0ZpZWxkIiwgQVJHUF9CQU5LX0ZJRUxEX09QLCBBUkdJX0JBTktfRklFTERfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKKwkJCSBBTUxfVFlQRV9OQU1FRF9GSUVMRCwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkJIEFNTF9GSUVMRCksCiAKIC8qIEludGVybmFsIG9wY29kZXMgdGhhdCBtYXAgdG8gaW52YWxpZCBBTUwgb3Bjb2RlcyAqLwogCi0vKiA2MCAqLyBBQ1BJX09QICgiTE5vdEVxdWFsIiwgICAgICAgICAgQVJHUF9MTk9URVFVQUxfT1AsICAgICAgICAgQVJHSV9MTk9URVFVQUxfT1AsICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0lOVEVSTkFMLCAgICAgICAgQU1MX1RZUEVfQk9HVVMsICAgICAgICAgICBBTUxfSEFTX0FSR1MgfCBBTUxfQ09OU1RBTlQpLAotLyogNjEgKi8gQUNQSV9PUCAoIkxMZXNzRXF1YWwiLCAgICAgICAgIEFSR1BfTExFU1NFUVVBTF9PUCwgICAgICAgIEFSR0lfTExFU1NFUVVBTF9PUCwgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19JTlRFUk5BTCwgICAgICAgIEFNTF9UWVBFX0JPR1VTLCAgICAgICAgICAgQU1MX0hBU19BUkdTIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDYyICovIEFDUElfT1AgKCJMR3JlYXRlckVxdWFsIiwgICAgICBBUkdQX0xHUkVBVEVSRVFVQUxfT1AsICAgICBBUkdJX0xHUkVBVEVSRVFVQUxfT1AsICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfSU5URVJOQUwsICAgICAgICBBTUxfVFlQRV9CT0dVUywgICAgICAgICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9DT05TVEFOVCksCi0vKiA2MyAqLyBBQ1BJX09QICgiLU5hbWVQYXRoLSIsICAgICAgICAgQVJHUF9OQU1FUEFUSF9PUCwgICAgICAgICAgQVJHSV9OQU1FUEFUSF9PUCwgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTElURVJBTCwgICAgICAgICBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFICksCi0vKiA2NCAqLyBBQ1BJX09QICgiLU1ldGhvZENhbGwtIiwgICAgICAgQVJHUF9NRVRIT0RDQUxMX09QLCAgICAgICAgQVJHSV9NRVRIT0RDQUxMX09QLCAgICAgICAgIEFDUElfVFlQRV9NRVRIT0QsICAgICAgICAgICAgQU1MX0NMQVNTX01FVEhPRF9DQUxMLCAgICAgQU1MX1RZUEVfTUVUSE9EX0NBTEwsICAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFKSwKLS8qIDY1ICovIEFDUElfT1AgKCItQnl0ZUxpc3QtIiwgICAgICAgICBBUkdQX0JZVEVMSVNUX09QLCAgICAgICAgICBBUkdJX0JZVEVMSVNUX09QLCAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9MSVRFUkFMLCAgICAgICAgIDApLAotLyogNjYgKi8gQUNQSV9PUCAoIi1SZXNlcnZlZEZpZWxkLSIsICAgIEFSR1BfUkVTRVJWRURGSUVMRF9PUCwgICAgIEFSR0lfUkVTRVJWRURGSUVMRF9PUCwgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19JTlRFUk5BTCwgICAgICAgIEFNTF9UWVBFX0JPR1VTLCAgICAgICAgICAgMCksCi0vKiA2NyAqLyBBQ1BJX09QICgiLU5hbWVkRmllbGQtIiwgICAgICAgQVJHUF9OQU1FREZJRUxEX09QLCAgICAgICAgQVJHSV9OQU1FREZJRUxEX09QLCAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0lOVEVSTkFMLCAgICAgICAgQU1MX1RZUEVfQk9HVVMsICAgICAgICAgICBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFIHwgQU1MX05BTUVEICksCi0vKiA2OCAqLyBBQ1BJX09QICgiLUFjY2Vzc0ZpZWxkLSIsICAgICAgQVJHUF9BQ0NFU1NGSUVMRF9PUCwgICAgICAgQVJHSV9BQ0NFU1NGSUVMRF9PUCwgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0lOVEVSTkFMLCAgICAgICAgQU1MX1RZUEVfQk9HVVMsICAgICAgICAgICAwKSwKLS8qIDY5ICovIEFDUElfT1AgKCItU3RhdGljU3RyaW5nIiwgICAgICBBUkdQX1NUQVRJQ1NUUklOR19PUCwgICAgICBBUkdJX1NUQVRJQ1NUUklOR19PUCwgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfSU5URVJOQUwsICAgICAgICBBTUxfVFlQRV9CT0dVUywgICAgICAgICAgIDApLAotLyogNkEgKi8gQUNQSV9PUCAoIi1SZXR1cm4gVmFsdWUtIiwgICAgIEFSR19OT05FLCAgICAgICAgICAgICAgICAgIEFSR19OT05FLCAgICAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19SRVRVUk5fVkFMVUUsICAgIEFNTF9UWVBFX1JFVFVSTiwgICAgICAgICAgQU1MX0hBU19BUkdTIHwgQU1MX0hBU19SRVRWQUwpLAotLyogNkIgKi8gQUNQSV9PUCAoIi1VTktOT1dOX09QLSIsICAgICAgIEFSR19OT05FLCAgICAgICAgICAgICAgICAgIEFSR19OT05FLCAgICAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfSU5WQUxJRCwgICAgICAgICAgIEFNTF9DTEFTU19VTktOT1dOLCAgICAgICAgIEFNTF9UWVBFX0JPR1VTLCAgICAgICAgICAgQU1MX0hBU19BUkdTKSwKLS8qIDZDICovIEFDUElfT1AgKCItQVNDSUlfT05MWS0iLCAgICAgICBBUkdfTk9ORSwgICAgICAgICAgICAgICAgICBBUkdfTk9ORSwgICAgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfQVNDSUksICAgICAgICAgICBBTUxfVFlQRV9CT0dVUywgICAgICAgICAgIEFNTF9IQVNfQVJHUyksCi0vKiA2RCAqLyBBQ1BJX09QICgiLVBSRUZJWF9PTkxZLSIsICAgICAgQVJHX05PTkUsICAgICAgICAgICAgICAgICAgQVJHX05PTkUsICAgICAgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX1BSRUZJWCwgICAgICAgICAgQU1MX1RZUEVfQk9HVVMsICAgICAgICAgICBBTUxfSEFTX0FSR1MpLAorLyogNjAgKi8gQUNQSV9PUCgiTE5vdEVxdWFsIiwgQVJHUF9MTk9URVFVQUxfT1AsIEFSR0lfTE5PVEVRVUFMX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19JTlRFUk5BTCwKKwkJCSBBTUxfVFlQRV9CT0dVUywgQU1MX0hBU19BUkdTIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDYxICovIEFDUElfT1AoIkxMZXNzRXF1YWwiLCBBUkdQX0xMRVNTRVFVQUxfT1AsIEFSR0lfTExFU1NFUVVBTF9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfSU5URVJOQUwsCisJCQkgQU1MX1RZUEVfQk9HVVMsIEFNTF9IQVNfQVJHUyB8IEFNTF9DT05TVEFOVCksCisvKiA2MiAqLyBBQ1BJX09QKCJMR3JlYXRlckVxdWFsIiwgQVJHUF9MR1JFQVRFUkVRVUFMX09QLAorCQkJIEFSR0lfTEdSRUFURVJFUVVBTF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfSU5URVJOQUwsIEFNTF9UWVBFX0JPR1VTLAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9DT05TVEFOVCksCisvKiA2MyAqLyBBQ1BJX09QKCItTmFtZVBhdGgtIiwgQVJHUF9OQU1FUEFUSF9PUCwgQVJHSV9OQU1FUEFUSF9PUCwKKwkJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCQkgQU1MX1RZUEVfTElURVJBTCwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSksCisvKiA2NCAqLyBBQ1BJX09QKCItTWV0aG9kQ2FsbC0iLCBBUkdQX01FVEhPRENBTExfT1AsIEFSR0lfTUVUSE9EQ0FMTF9PUCwKKwkJCSBBQ1BJX1RZUEVfTUVUSE9ELCBBTUxfQ0xBU1NfTUVUSE9EX0NBTEwsCisJCQkgQU1MX1RZUEVfTUVUSE9EX0NBTEwsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSksCisvKiA2NSAqLyBBQ1BJX09QKCItQnl0ZUxpc3QtIiwgQVJHUF9CWVRFTElTVF9PUCwgQVJHSV9CWVRFTElTVF9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCQkgQU1MX1RZUEVfTElURVJBTCwgMCksCisvKiA2NiAqLyBBQ1BJX09QKCItUmVzZXJ2ZWRGaWVsZC0iLCBBUkdQX1JFU0VSVkVERklFTERfT1AsCisJCQkgQVJHSV9SRVNFUlZFREZJRUxEX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19JTlRFUk5BTCwgQU1MX1RZUEVfQk9HVVMsIDApLAorLyogNjcgKi8gQUNQSV9PUCgiLU5hbWVkRmllbGQtIiwgQVJHUF9OQU1FREZJRUxEX09QLCBBUkdJX05BTUVERklFTERfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0lOVEVSTkFMLAorCQkJIEFNTF9UWVBFX0JPR1VTLAorCQkJIEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAorLyogNjggKi8gQUNQSV9PUCgiLUFjY2Vzc0ZpZWxkLSIsIEFSR1BfQUNDRVNTRklFTERfT1AsCisJCQkgQVJHSV9BQ0NFU1NGSUVMRF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfSU5URVJOQUwsIEFNTF9UWVBFX0JPR1VTLCAwKSwKKy8qIDY5ICovIEFDUElfT1AoIi1TdGF0aWNTdHJpbmciLCBBUkdQX1NUQVRJQ1NUUklOR19PUCwKKwkJCSBBUkdJX1NUQVRJQ1NUUklOR19PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfSU5URVJOQUwsIEFNTF9UWVBFX0JPR1VTLCAwKSwKKy8qIDZBICovIEFDUElfT1AoIi1SZXR1cm4gVmFsdWUtIiwgQVJHX05PTkUsIEFSR19OT05FLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19SRVRVUk5fVkFMVUUsIEFNTF9UWVBFX1JFVFVSTiwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfSEFTX1JFVFZBTCksCisvKiA2QiAqLyBBQ1BJX09QKCItVU5LTk9XTl9PUC0iLCBBUkdfTk9ORSwgQVJHX05PTkUsIEFDUElfVFlQRV9JTlZBTElELAorCQkJIEFNTF9DTEFTU19VTktOT1dOLCBBTUxfVFlQRV9CT0dVUywgQU1MX0hBU19BUkdTKSwKKy8qIDZDICovIEFDUElfT1AoIi1BU0NJSV9PTkxZLSIsIEFSR19OT05FLCBBUkdfTk9ORSwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfQVNDSUksIEFNTF9UWVBFX0JPR1VTLCBBTUxfSEFTX0FSR1MpLAorLyogNkQgKi8gQUNQSV9PUCgiLVBSRUZJWF9PTkxZLSIsIEFSR19OT05FLCBBUkdfTk9ORSwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfUFJFRklYLCBBTUxfVFlQRV9CT0dVUywgQU1MX0hBU19BUkdTKSwKIAogLyogQUNQSSAyLjAgb3Bjb2RlcyAqLwogCi0vKiA2RSAqLyBBQ1BJX09QICgiUXdvcmRDb25zdCIsICAgICAgICAgQVJHUF9RV09SRF9PUCwgICAgICAgICAgICAgQVJHSV9RV09SRF9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9JTlRFR0VSLCAgICAgICAgICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTElURVJBTCwgICAgICAgICBBTUxfQ09OU1RBTlQpLAotLyogNkYgKi8gQUNQSV9PUCAoIlBhY2thZ2UgLypWYXIqLyIsICAgIEFSR1BfVkFSX1BBQ0tBR0VfT1AsICAgICAgIEFSR0lfVkFSX1BBQ0tBR0VfT1AsICAgICAgICBBQ1BJX1RZUEVfUEFDS0FHRSwgICAgICAgICAgIEFNTF9DTEFTU19DUkVBVEUsICAgICAgICAgIEFNTF9UWVBFX0NSRUFURV9PQkpFQ1QsICAgQU1MX0hBU19BUkdTIHwgQU1MX0RFRkVSKSwKLS8qIDcwICovIEFDUElfT1AgKCJDb25jYXRlbmF0ZVJlc1RlbXBsYXRlIiwgQVJHUF9DT05DQVRfUkVTX09QLCAgICBBUkdJX0NPTkNBVF9SRVNfT1AsICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDcxICovIEFDUElfT1AgKCJNb2QiLCAgICAgICAgICAgICAgICBBUkdQX01PRF9PUCwgICAgICAgICAgICAgICBBUkdJX01PRF9PUCwgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDcyICovIEFDUElfT1AgKCJDcmVhdGVRV29yZEZpZWxkIiwgICBBUkdQX0NSRUFURV9RV09SRF9GSUVMRF9PUCxBUkdJX0NSRUFURV9RV09SRF9GSUVMRF9PUCwgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgICAgICBBTUxfQ0xBU1NfQ1JFQVRFLCAgICAgICAgICBBTUxfVFlQRV9DUkVBVEVfRklFTEQsICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgfCBBTUxfREVGRVIgfCBBTUxfQ1JFQVRFKSwKLS8qIDczICovIEFDUElfT1AgKCJUb0J1ZmZlciIsICAgICAgICAgICBBUkdQX1RPX0JVRkZFUl9PUCwgICAgICAgICBBUkdJX1RPX0JVRkZFUl9PUCwgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDc0ICovIEFDUElfT1AgKCJUb0RlY2ltYWxTdHJpbmciLCAgICBBUkdQX1RPX0RFQ19TVFJfT1AsICAgICAgICBBUkdJX1RPX0RFQ19TVFJfT1AsICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDc1ICovIEFDUElfT1AgKCJUb0hleFN0cmluZyIsICAgICAgICBBUkdQX1RPX0hFWF9TVFJfT1AsICAgICAgICBBUkdJX1RPX0hFWF9TVFJfT1AsICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDc2ICovIEFDUElfT1AgKCJUb0ludGVnZXIiLCAgICAgICAgICBBUkdQX1RPX0lOVEVHRVJfT1AsICAgICAgICBBUkdJX1RPX0lOVEVHRVJfT1AsICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDc3ICovIEFDUElfT1AgKCJUb1N0cmluZyIsICAgICAgICAgICBBUkdQX1RPX1NUUklOR19PUCwgICAgICAgICBBUkdJX1RPX1NUUklOR19PUCwgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDc4ICovIEFDUElfT1AgKCJDb3B5T2JqZWN0IiwgICAgICAgICBBUkdQX0NPUFlfT1AsICAgICAgICAgICAgICBBUkdJX0NPUFlfT1AsICAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSKSwKLS8qIDc5ICovIEFDUElfT1AgKCJNaWQiLCAgICAgICAgICAgICAgICBBUkdQX01JRF9PUCwgICAgICAgICAgICAgICBBUkdJX01JRF9PUCwgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzNBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzNBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDdBICovIEFDUElfT1AgKCJDb250aW51ZSIsICAgICAgICAgICBBUkdQX0NPTlRJTlVFX09QLCAgICAgICAgICBBUkdJX0NPTlRJTlVFX09QLCAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfQ09OVFJPTCwgICAgICAgICBBTUxfVFlQRV9DT05UUk9MLCAgICAgICAgIDApLAotLyogN0IgKi8gQUNQSV9PUCAoIkxvYWRUYWJsZSIsICAgICAgICAgIEFSR1BfTE9BRF9UQUJMRV9PUCwgICAgICAgIEFSR0lfTE9BRF9UQUJMRV9PUCwgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfNkFfMFRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfNkFfMFRfMVIpLAotLyogN0MgKi8gQUNQSV9PUCAoIkRhdGFUYWJsZVJlZ2lvbiIsICAgIEFSR1BfREFUQV9SRUdJT05fT1AsICAgICAgIEFSR0lfREFUQV9SRUdJT05fT1AsICAgICAgICBBQ1BJX1RZUEVfUkVHSU9OLCAgICAgICAgICAgIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsICAgIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwgICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCi0vKiA3RCAqLyBBQ1BJX09QICgiW0V2YWxTdWJUcmVlXSIsICAgICAgQVJHUF9TQ09QRV9PUCwgICAgICAgICAgICAgQVJHSV9TQ09QRV9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgICAgQU1MX1RZUEVfTkFNRURfTk9fT0JKLCAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFKSwKKy8qIDZFICovIEFDUElfT1AoIlF3b3JkQ29uc3QiLCBBUkdQX1FXT1JEX09QLCBBUkdJX1FXT1JEX09QLAorCQkJIEFDUElfVFlQRV9JTlRFR0VSLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCQkgQU1MX1RZUEVfTElURVJBTCwgQU1MX0NPTlNUQU5UKSwKKwkvKiA2RiAqLyBBQ1BJX09QKCJQYWNrYWdlIiwgLyogVmFyICovIEFSR1BfVkFSX1BBQ0tBR0VfT1AsCisJCQkgQVJHSV9WQVJfUEFDS0FHRV9PUCwgQUNQSV9UWVBFX1BBQ0tBR0UsCisJCQkgQU1MX0NMQVNTX0NSRUFURSwgQU1MX1RZUEVfQ1JFQVRFX09CSkVDVCwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfREVGRVIpLAorLyogNzAgKi8gQUNQSV9PUCgiQ29uY2F0ZW5hdGVSZXNUZW1wbGF0ZSIsIEFSR1BfQ09OQ0FUX1JFU19PUCwKKwkJCSBBUkdJX0NPTkNBVF9SRVNfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogNzEgKi8gQUNQSV9PUCgiTW9kIiwgQVJHUF9NT0RfT1AsIEFSR0lfTU9EX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDcyICovIEFDUElfT1AoIkNyZWF0ZVFXb3JkRmllbGQiLCBBUkdQX0NSRUFURV9RV09SRF9GSUVMRF9PUCwKKwkJCSBBUkdJX0NSRUFURV9RV09SRF9GSUVMRF9PUCwKKwkJCSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxELCBBTUxfQ0xBU1NfQ1JFQVRFLAorCQkJIEFNTF9UWVBFX0NSRUFURV9GSUVMRCwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwKKwkJCSBBTUxfREVGRVIgfCBBTUxfQ1JFQVRFKSwKKy8qIDczICovIEFDUElfT1AoIlRvQnVmZmVyIiwgQVJHUF9UT19CVUZGRVJfT1AsIEFSR0lfVE9fQlVGRkVSX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogNzQgKi8gQUNQSV9PUCgiVG9EZWNpbWFsU3RyaW5nIiwgQVJHUF9UT19ERUNfU1RSX09QLAorCQkJIEFSR0lfVE9fREVDX1NUUl9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiA3NSAqLyBBQ1BJX09QKCJUb0hleFN0cmluZyIsIEFSR1BfVE9fSEVYX1NUUl9PUCwgQVJHSV9UT19IRVhfU1RSX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogNzYgKi8gQUNQSV9PUCgiVG9JbnRlZ2VyIiwgQVJHUF9UT19JTlRFR0VSX09QLCBBUkdJX1RPX0lOVEVHRVJfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiA3NyAqLyBBQ1BJX09QKCJUb1N0cmluZyIsIEFSR1BfVE9fU1RSSU5HX09QLCBBUkdJX1RPX1NUUklOR19PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDc4ICovIEFDUElfT1AoIkNvcHlPYmplY3QiLCBBUkdQX0NPUFlfT1AsIEFSR0lfQ09QWV9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiksCisvKiA3OSAqLyBBQ1BJX09QKCJNaWQiLCBBUkdQX01JRF9PUCwgQVJHSV9NSURfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfM0FfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfM0FfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogN0EgKi8gQUNQSV9PUCgiQ29udGludWUiLCBBUkdQX0NPTlRJTlVFX09QLCBBUkdJX0NPTlRJTlVFX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19DT05UUk9MLCBBTUxfVFlQRV9DT05UUk9MLCAwKSwKKy8qIDdCICovIEFDUElfT1AoIkxvYWRUYWJsZSIsIEFSR1BfTE9BRF9UQUJMRV9PUCwgQVJHSV9MT0FEX1RBQkxFX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfNkFfMFRfMVIsIEFNTF9GTEFHU19FWEVDXzZBXzBUXzFSKSwKKy8qIDdDICovIEFDUElfT1AoIkRhdGFUYWJsZVJlZ2lvbiIsIEFSR1BfREFUQV9SRUdJT05fT1AsCisJCQkgQVJHSV9EQVRBX1JFR0lPTl9PUCwgQUNQSV9UWVBFX1JFR0lPTiwKKwkJCSBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCBBTUxfVFlQRV9OQU1FRF9TSU1QTEUsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKKy8qIDdEICovIEFDUElfT1AoIltFdmFsU3ViVHJlZV0iLCBBUkdQX1NDT1BFX09QLCBBUkdJX1NDT1BFX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsCisJCQkgQU1MX1RZUEVfTkFNRURfTk9fT0JKLAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8CisJCQkgQU1MX05TTk9ERSksCiAKIC8qIEFDUEkgMy4wIG9wY29kZXMgKi8KIAotLyogN0UgKi8gQUNQSV9PUCAoIlRpbWVyIiwgICAgICAgICAgICAgIEFSR1BfVElNRVJfT1AsICAgICAgICAgICAgIEFSR0lfVElNRVJfT1AsICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMEFfMFRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMEFfMFRfMVIpCisvKiA3RSAqLyBBQ1BJX09QKCJUaW1lciIsIEFSR1BfVElNRVJfT1AsIEFSR0lfVElNRVJfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMEFfMFRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMEFfMFRfMVIpCiAKIC8qISBbRW5kXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAhKi8KIH07CkBAIC0zMzgsNzMgKzY0Niw3MCBAQAogICogVGhpcyB0YWJsZSBpcyBkaXJlY3RseSBpbmRleGVkIGJ5IHRoZSBvcGNvZGVzLCBhbmQgcmV0dXJucyBhbgogICogaW5kZXggaW50byB0aGUgdGFibGUgYWJvdmUKICAqLwotc3RhdGljIGNvbnN0IHU4IGFjcGlfZ2JsX3Nob3J0X29wX2luZGV4WzI1Nl0gPQoteworc3RhdGljIGNvbnN0IHU4IGFjcGlfZ2JsX3Nob3J0X29wX2luZGV4WzI1Nl0gPSB7CiAvKiAgICAgICAgICAgICAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgKi8KIC8qICAgICAgICAgICAgICA4ICAgICA5ICAgICBBICAgICBCICAgICBDICAgICBEICAgICBFICAgICBGICAqLwotLyogMHgwMCAqLwkweDAwLCAweDAxLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDAyLCBfVU5LLAotLyogMHgwOCAqLwkweDAzLCBfVU5LLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDZFLCBfVU5LLAotLyogMHgxMCAqLwkweDA4LCAweDA5LCAweDBhLCAweDZGLCAweDBiLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHgxOCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHgyMCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHgyOCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDYzLCBfUEZYLCBfUEZYLAotLyogMHgzMCAqLwkweDY3LCAweDY2LCAweDY4LCAweDY1LCAweDY5LCAweDY0LCAweDZBLCAweDdELAotLyogMHgzOCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHg0MCAqLwlfVU5LLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLAotLyogMHg0OCAqLwlfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLAotLyogMHg1MCAqLwlfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLAotLyogMHg1OCAqLwlfQVNDLCBfQVNDLCBfQVNDLCBfVU5LLCBfUEZYLCBfVU5LLCBfUEZYLCBfQVNDLAotLyogMHg2MCAqLwkweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLAotLyogMHg2OCAqLwkweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCBfVU5LLAotLyogMHg3MCAqLwkweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxLCAweDIyLAotLyogMHg3OCAqLwkweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLAotLyogMHg4MCAqLwkweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDcwLCAweDcxLCAweDJmLCAweDMwLAotLyogMHg4OCAqLwkweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDcyLAotLyogMHg5MCAqLwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDczLCAweDc0LAotLyogMHg5OCAqLwkweDc1LCAweDc2LCBfVU5LLCBfVU5LLCAweDc3LCAweDc4LCAweDc5LCAweDdBLAotLyogMHhBMCAqLwkweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDYwLCAweDYxLAotLyogMHhBOCAqLwkweDYyLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhCMCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhCOCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhDMCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhDOCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDQ0LCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhEMCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhEOCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhFMCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhFOCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhGMCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhGOCAqLwlfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDQ1LAorLyogMHgwMCAqLyAweDAwLCAweDAxLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDAyLCBfVU5LLAorLyogMHgwOCAqLyAweDAzLCBfVU5LLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDZFLCBfVU5LLAorLyogMHgxMCAqLyAweDA4LCAweDA5LCAweDBhLCAweDZGLCAweDBiLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHgxOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHgyMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHgyOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDYzLCBfUEZYLCBfUEZYLAorLyogMHgzMCAqLyAweDY3LCAweDY2LCAweDY4LCAweDY1LCAweDY5LCAweDY0LCAweDZBLCAweDdELAorLyogMHgzOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHg0MCAqLyBfVU5LLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLAorLyogMHg0OCAqLyBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLAorLyogMHg1MCAqLyBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLAorLyogMHg1OCAqLyBfQVNDLCBfQVNDLCBfQVNDLCBfVU5LLCBfUEZYLCBfVU5LLCBfUEZYLCBfQVNDLAorLyogMHg2MCAqLyAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLAorLyogMHg2OCAqLyAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCBfVU5LLAorLyogMHg3MCAqLyAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxLCAweDIyLAorLyogMHg3OCAqLyAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLAorLyogMHg4MCAqLyAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDcwLCAweDcxLCAweDJmLCAweDMwLAorLyogMHg4OCAqLyAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDcyLAorLyogMHg5MCAqLyAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDczLCAweDc0LAorLyogMHg5OCAqLyAweDc1LCAweDc2LCBfVU5LLCBfVU5LLCAweDc3LCAweDc4LCAweDc5LCAweDdBLAorLyogMHhBMCAqLyAweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDYwLCAweDYxLAorLyogMHhBOCAqLyAweDYyLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhCMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhCOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhDMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhDOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDQ0LCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhEMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhEOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhFMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhFOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhGMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhGOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDQ1LAogfTsKIAogLyoKICAqIFRoaXMgdGFibGUgaXMgaW5kZXhlZCBieSB0aGUgc2Vjb25kIG9wY29kZSBvZiB0aGUgZXh0ZW5kZWQgb3Bjb2RlCiAgKiBwYWlyLiAgSXQgcmV0dXJucyBhbiBpbmRleCBpbnRvIHRoZSBvcGNvZGUgdGFibGUgKGFjcGlfZ2JsX2FtbF9vcF9pbmZvKQogICovCi1zdGF0aWMgY29uc3QgdTggYWNwaV9nYmxfbG9uZ19vcF9pbmRleFtOVU1fRVhURU5ERURfT1BDT0RFXSA9Ci17CitzdGF0aWMgY29uc3QgdTggYWNwaV9nYmxfbG9uZ19vcF9pbmRleFtOVU1fRVhURU5ERURfT1BDT0RFXSA9IHsKIC8qICAgICAgICAgICAgICAwICAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3ICAqLwogLyogICAgICAgICAgICAgIDggICAgIDkgICAgIEEgICAgIEIgICAgIEMgICAgIEQgICAgIEUgICAgIEYgICovCi0vKiAweDAwICovCV9VTkssIDB4NDYsIDB4NDcsIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDA4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDEwICovCV9VTkssIF9VTkssIDB4NDgsIDB4NDksIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDE4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIDB4N0IsCi0vKiAweDIwICovCTB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsIDB4NTEsCi0vKiAweDI4ICovCTB4NTIsIDB4NTMsIDB4NTQsIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDMwICovCTB4NTUsIDB4NTYsIDB4NTcsIDB4N2UsIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDM4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDQwICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDQ4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDUwICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDU4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDYwICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDY4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDcwICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDc4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDgwICovCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsCi0vKiAweDg4ICovCTB4N0MsCisvKiAweDAwICovIF9VTkssIDB4NDYsIDB4NDcsIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDA4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDEwICovIF9VTkssIF9VTkssIDB4NDgsIDB4NDksIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDE4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIDB4N0IsCisvKiAweDIwICovIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsIDB4NTEsCisvKiAweDI4ICovIDB4NTIsIDB4NTMsIDB4NTQsIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDMwICovIDB4NTUsIDB4NTYsIDB4NTcsIDB4N2UsIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDM4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDQwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDQ4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDUwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDU4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDYwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDY4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDcwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDc4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDgwICovIDB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsCisvKiAweDg4ICovIDB4N0MsCiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvCkBAIC00MTgsNDggKzcyMywzNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICoKLWFjcGlfcHNfZ2V0X29wY29kZV9pbmZvICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSkKK2NvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICphY3BpX3BzX2dldF9vcGNvZGVfaW5mbyh1MTYgb3Bjb2RlKQogewotCUFDUElfRlVOQ1RJT05fTkFNRSAoInBzX2dldF9vcGNvZGVfaW5mbyIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJwc19nZXRfb3Bjb2RlX2luZm8iKTsKIAogCS8qCiAJICogRGV0ZWN0IG5vcm1hbCA4LWJpdCBvcGNvZGUgb3IgZXh0ZW5kZWQgMTYtYml0IG9wY29kZQogCSAqLwotCXN3aXRjaCAoKHU4KSAob3Bjb2RlID4+IDgpKSB7Ci0JY2FzZSAwOgotCisJaWYgKCEob3Bjb2RlICYgMHhGRjAwKSkgewogCQkvKiBTaW1wbGUgKDgtYml0KSBvcGNvZGU6IDAtMjU1LCBjYW4ndCBpbmRleCBiZXlvbmQgdGFibGUgICovCiAKLQkJcmV0dXJuICgmYWNwaV9nYmxfYW1sX29wX2luZm8gW2FjcGlfZ2JsX3Nob3J0X29wX2luZGV4IFsodTgpIG9wY29kZV1dKTsKLQotCWNhc2UgQU1MX0VYVE9QOgotCi0JCS8qIEV4dGVuZGVkICgxNi1iaXQsIHByZWZpeCtvcGNvZGUpIG9wY29kZSAqLwotCi0JCWlmICgoKHU4KSBvcGNvZGUpIDw9IE1BWF9FWFRFTkRFRF9PUENPREUpIHsKLQkJCXJldHVybiAoJmFjcGlfZ2JsX2FtbF9vcF9pbmZvIFthY3BpX2dibF9sb25nX29wX2luZGV4IFsodTgpIG9wY29kZV1dKTsKLQkJfQotCi0JCS8qIEVsc2UgZmFsbCB0aHJvdWdoIHRvIGVycm9yIGNhc2UgYmVsb3cgKi8KLQkJLypsaW50IC1mYWxsdGhyb3VnaCAqLwotCi0JZGVmYXVsdDoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmtub3duIEFNTCBvcGNvZGUgWyU0LjRYXVxuIiwgb3Bjb2RlKSk7Ci0JCWJyZWFrOworCQlyZXR1cm4gKCZhY3BpX2dibF9hbWxfb3BfaW5mbworCQkJW2FjcGlfZ2JsX3Nob3J0X29wX2luZGV4Wyh1OCkgb3Bjb2RlXV0pOwogCX0KIAorCWlmICgoKG9wY29kZSAmIDB4RkYwMCkgPT0gQU1MX0VYVEVOREVEX09QQ09ERSkgJiYKKwkgICAgKCgodTgpIG9wY29kZSkgPD0gTUFYX0VYVEVOREVEX09QQ09ERSkpIHsKKwkJLyogVmFsaWQgZXh0ZW5kZWQgKDE2LWJpdCkgb3Bjb2RlICovCiAKLQkvKiBEZWZhdWx0IGlzICJ1bmtub3duIG9wY29kZSIgKi8KKwkJcmV0dXJuICgmYWNwaV9nYmxfYW1sX29wX2luZm8KKwkJCVthY3BpX2dibF9sb25nX29wX2luZGV4Wyh1OCkgb3Bjb2RlXV0pOworCX0KIAotCXJldHVybiAoJmFjcGlfZ2JsX2FtbF9vcF9pbmZvIFtfVU5LXSk7CisJLyogVW5rbm93biBBTUwgb3Bjb2RlICovCisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJICAiVW5rbm93biBBTUwgb3Bjb2RlIFslNC40WF1cbiIsIG9wY29kZSkpOworCisJcmV0dXJuICgmYWNwaV9nYmxfYW1sX29wX2luZm9bX1VOS10pOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lCkBAIC00NzMsMTYgKzc2NiwxMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWNoYXIgKgotYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKQorY2hhciAqYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUodTE2IG9wY29kZSkKIHsKICNpZiBkZWZpbmVkKEFDUElfRElTQVNTRU1CTEVSKSB8fCBkZWZpbmVkIChBQ1BJX0RFQlVHX09VVFBVVCkKIAotCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICAgKm9wOworCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICpvcDsKIAotCi0Jb3AgPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3Bjb2RlKTsKKwlvcCA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wY29kZSk7CiAKIAkvKiBBbHdheXMgZ3VhcmFudGVlZCB0byByZXR1cm4gYSB2YWxpZCBwb2ludGVyICovCiAKQEAgLTQ5Myw0ICs3ODMsMyBAQAogCiAjZW5kaWYKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYwppbmRleCBiYmZkYzFhLi43NmQ0ZDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYwpAQCAtNDEsNyArNDEsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogLyoKICAqIFBhcnNlIHRoZSBBTUwgYW5kIGJ1aWxkIGFuIG9wZXJhdGlvbiB0cmVlIGFzIG1vc3QgaW50ZXJwcmV0ZXJzLAogICogbGlrZSBQZXJsLCBkby4gIFBhcnNpbmcgaXMgZG9uZSBieSBoYW5kIHJhdGhlciB0aGFuIHdpdGggYSBZQUNDCkBAIC01OSwyOCArNTgsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJwc3BhcnNlIikKLQotCi1zdGF0aWMgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9kZXB0aCA9IDA7Ci0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIHZvaWQKLWFjcGlfcHNfY29tcGxldGVfdGhpc19vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfc3RhdHVzKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3BzX3BhcnNlX2xvb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCitBQ1BJX01PRFVMRV9OQU1FKCJwc3BhcnNlIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC05MywxMCArNzEsNyBAQAogICogREVTQ1JJUFRJT046IEdldCB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBvcGNvZGUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTMyCi1hY3BpX3BzX2dldF9vcGNvZGVfc2l6ZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpCit1MzIgYWNwaV9wc19nZXRfb3Bjb2RlX3NpemUodTMyIG9wY29kZSkKIHsKIAogCS8qIEV4dGVuZGVkICgyLWJ5dGUpIG9wY29kZSBpZiA+IDI1NSAqLwpAQCAtMTEwLDcgKzg1LDYgQEAKIAlyZXR1cm4gKDEpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfcGVla19vcGNvZGUKQEAgLTEyMywyOCArOTcsMjQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MTYKLWFjcGlfcHNfcGVla19vcGNvZGUgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSkKK3UxNiBhY3BpX3BzX3BlZWtfb3Bjb2RlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICogcGFyc2VyX3N0YXRlKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZTsKLQorCXU4ICphbWw7CisJdTE2IG9wY29kZTsKIAogCWFtbCA9IHBhcnNlcl9zdGF0ZS0+YW1sOwotCW9wY29kZSA9ICh1MTYpIEFDUElfR0VUOCAoYW1sKTsKKwlvcGNvZGUgPSAodTE2KSBBQ1BJX0dFVDgoYW1sKTsKIAotCWlmIChvcGNvZGUgPT0gQU1MX0VYVE9QKSB7Ci0JCS8qIEV4dGVuZGVkIG9wY29kZSAqLworCWlmIChvcGNvZGUgPT0gQU1MX0VYVEVOREVEX09QX1BSRUZJWCkgeworCQkvKiBFeHRlbmRlZCBvcGNvZGUsIGdldCB0aGUgc2Vjb25kIG9wY29kZSBieXRlICovCiAKIAkJYW1sKys7Ci0JCW9wY29kZSA9ICh1MTYpICgob3Bjb2RlIDw8IDgpIHwgQUNQSV9HRVQ4IChhbWwpKTsKKwkJb3Bjb2RlID0gKHUxNikgKChvcGNvZGUgPDwgOCkgfCBBQ1BJX0dFVDgoYW1sKSk7CiAJfQogCiAJcmV0dXJuIChvcGNvZGUpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfY29tcGxldGVfdGhpc19vcApAQCAtMTUyLDQ3ICsxMjIsNTQgQEAKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IFN0YXRlCiAgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gT3AgdG8gY29tcGxldGUKICAqCi0gKiBSRVRVUk46ICAgICAgTm9uZS4KKyAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogUGVyZm9ybSBhbnkgY2xlYW51cCBhdCB0aGUgY29tcGxldGlvbiBvZiBhbiBPcC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotYWNwaV9wc19jb21wbGV0ZV90aGlzX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKQorYWNwaV9zdGF0dXMKK2FjcGlfcHNfY29tcGxldGVfdGhpc19vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSwKKwkJCSB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqIG9wKQogewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnByZXY7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqbmV4dDsKLQljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAgICpwYXJlbnRfaW5mbzsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpyZXBsYWNlbWVudF9vcCA9IE5VTEw7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnByZXY7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm5leHQ7CisJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKnBhcmVudF9pbmZvOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpyZXBsYWNlbWVudF9vcCA9IE5VTEw7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgicHNfY29tcGxldGVfdGhpc19vcCIsIG9wKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJwc19jb21wbGV0ZV90aGlzX29wIiwgb3ApOwogCiAJLyogQ2hlY2sgZm9yIG51bGwgT3AsIGNhbiBoYXBwZW4gaWYgQU1MIGNvZGUgaXMgY29ycnVwdCAqLwogCiAJaWYgKCFvcCkgewotCQlyZXR1cm5fVk9JRDsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsJLyogT0sgZm9yIG5vdyAqLwogCX0KIAogCS8qIERlbGV0ZSB0aGlzIG9wIGFuZCB0aGUgc3VidHJlZSBiZWxvdyBpdCBpZiBhc2tlZCB0byAqLwogCi0JaWYgKCgod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX1RSRUVfTUFTSykgIT0gQUNQSV9QQVJTRV9ERUxFVEVfVFJFRSkgfHwKLQkJICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfQVJHVU1FTlQpKSB7Ci0JCXJldHVybl9WT0lEOworCWlmICgoKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9UUkVFX01BU0spICE9CisJICAgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFKQorCSAgICB8fCAod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX0FSR1VNRU5UKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIG9ubHkgZGVsZXRlIHRoaXMgc3VidHJlZSAqLwogCiAJaWYgKG9wLT5jb21tb24ucGFyZW50KSB7CisJCXByZXYgPSBvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLnZhbHVlLmFyZzsKKwkJaWYgKCFwcmV2KSB7CisJCQkvKiBOb3RoaW5nIG1vcmUgdG8gZG8gKi8KKworCQkJZ290byBjbGVhbnVwOworCQl9CisKIAkJLyoKIAkJICogQ2hlY2sgaWYgd2UgbmVlZCB0byByZXBsYWNlIHRoZSBvcGVyYXRvciBhbmQgaXRzIHN1YnRyZWUKIAkJICogd2l0aCBhIHJldHVybiB2YWx1ZSBvcCAocGxhY2Vob2xkZXIgb3ApCiAJCSAqLwotCQlwYXJlbnRfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpOworCQlwYXJlbnRfaW5mbyA9CisJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLgorCQkJCQkgICAgYW1sX29wY29kZSk7CiAKIAkJc3dpdGNoIChwYXJlbnRfaW5mby0+Y2xhc3MpIHsKIAkJY2FzZSBBTUxfQ0xBU1NfQ09OVFJPTDoKQEAgLTIwNCw5ICsxODEsMTAgQEAKIAkJCSAqIFRoZXNlIG9wY29kZXMgY29udGFpbiB0ZXJtX2FyZyBvcGVyYW5kcy4gVGhlIGN1cnJlbnQKIAkJCSAqIG9wIG11c3QgYmUgcmVwbGFjZWQgYnkgYSBwbGFjZWhvbGRlciByZXR1cm4gb3AKIAkJCSAqLwotCQkJcmVwbGFjZW1lbnRfb3AgPSBhY3BpX3BzX2FsbG9jX29wIChBTUxfSU5UX1JFVFVSTl9WQUxVRV9PUCk7CisJCQlyZXBsYWNlbWVudF9vcCA9CisJCQkgICAgYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX1JFVFVSTl9WQUxVRV9PUCk7CiAJCQlpZiAoIXJlcGxhY2VtZW50X29wKSB7Ci0JCQkJZ290byBjbGVhbnVwOworCQkJCWdvdG8gYWxsb2NhdGVfZXJyb3I7CiAJCQl9CiAJCQlicmVhazsKIApAQCAtMjE2LDkxICsxOTQsMTE3IEBACiAJCQkgKiBUaGVzZSBvcGNvZGVzIGNvbnRhaW4gdGVybV9hcmcgb3BlcmFuZHMuIFRoZSBjdXJyZW50CiAJCQkgKiBvcCBtdXN0IGJlIHJlcGxhY2VkIGJ5IGEgcGxhY2Vob2xkZXIgcmV0dXJuIG9wCiAJCQkgKi8KLQkJCWlmICgob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApICAgICAgfHwKLQkJCQkob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9EQVRBX1JFR0lPTl9PUCkgfHwKLQkJCQkob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9CVUZGRVJfT1ApICAgICAgfHwKLQkJCQkob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9QQUNLQUdFX09QKSAgICAgfHwKLQkJCQkob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9WQVJfUEFDS0FHRV9PUCkpIHsKLQkJCQlyZXBsYWNlbWVudF9vcCA9IGFjcGlfcHNfYWxsb2Nfb3AgKEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKTsKKwkJCWlmICgob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkgICAgIEFNTF9SRUdJT05fT1ApCisJCQkgICAgfHwgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQorCQkJCUFNTF9EQVRBX1JFR0lPTl9PUCkKKwkJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkJQU1MX0JVRkZFUl9PUCkKKwkJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkJQU1MX1BBQ0tBR0VfT1ApCisJCQkgICAgfHwgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQorCQkJCUFNTF9WQVJfUEFDS0FHRV9PUCkpIHsKKwkJCQlyZXBsYWNlbWVudF9vcCA9CisJCQkJICAgIGFjcGlfcHNfYWxsb2Nfb3AoQU1MX0lOVF9SRVRVUk5fVkFMVUVfT1ApOwogCQkJCWlmICghcmVwbGFjZW1lbnRfb3ApIHsKLQkJCQkJZ290byBjbGVhbnVwOworCQkJCQlnb3RvIGFsbG9jYXRlX2Vycm9yOwogCQkJCX0KLQkJCX0KLQotCQkJaWYgKChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX05BTUVfT1ApICYmCi0JCQkJKHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgIT0gYWNwaV9kc19leGVjX2JlZ2luX29wKSkgewotCQkJCWlmICgob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9CVUZGRVJfT1ApIHx8Ci0JCQkJCShvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApIHx8Ci0JCQkJCShvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1ZBUl9QQUNLQUdFX09QKSkgewotCQkJCQlyZXBsYWNlbWVudF9vcCA9IGFjcGlfcHNfYWxsb2Nfb3AgKG9wLT5jb21tb24uYW1sX29wY29kZSk7CisJCQl9IGVsc2UKKwkJCSAgICBpZiAoKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQorCQkJCSBBTUxfTkFNRV9PUCkKKwkJCQkmJiAod2Fsa19zdGF0ZS0+cGFzc19udW1iZXIgPD0KKwkJCQkgICAgQUNQSV9JTU9ERV9MT0FEX1BBU1MyKSkgeworCQkJCWlmICgob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9CVUZGRVJfT1ApCisJCQkJICAgIHx8IChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApCisJCQkJICAgIHx8IChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCQkJQU1MX1ZBUl9QQUNLQUdFX09QKSkgeworCQkJCQlyZXBsYWNlbWVudF9vcCA9CisJCQkJCSAgICBhY3BpX3BzX2FsbG9jX29wKG9wLT5jb21tb24uCisJCQkJCQkJICAgICBhbWxfb3Bjb2RlKTsKIAkJCQkJaWYgKCFyZXBsYWNlbWVudF9vcCkgewotCQkJCQkJZ290byBjbGVhbnVwOworCQkJCQkJZ290byBhbGxvY2F0ZV9lcnJvcjsKIAkJCQkJfQogCi0JCQkJCXJlcGxhY2VtZW50X29wLT5uYW1lZC5kYXRhID0gb3AtPm5hbWVkLmRhdGE7Ci0JCQkJCXJlcGxhY2VtZW50X29wLT5uYW1lZC5sZW5ndGggPSBvcC0+bmFtZWQubGVuZ3RoOworCQkJCQlyZXBsYWNlbWVudF9vcC0+bmFtZWQuZGF0YSA9CisJCQkJCSAgICBvcC0+bmFtZWQuZGF0YTsKKwkJCQkJcmVwbGFjZW1lbnRfb3AtPm5hbWVkLmxlbmd0aCA9CisJCQkJCSAgICBvcC0+bmFtZWQubGVuZ3RoOwogCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlyZXBsYWNlbWVudF9vcCA9IGFjcGlfcHNfYWxsb2Nfb3AgKEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKTsKKworCQkJcmVwbGFjZW1lbnRfb3AgPQorCQkJICAgIGFjcGlfcHNfYWxsb2Nfb3AoQU1MX0lOVF9SRVRVUk5fVkFMVUVfT1ApOwogCQkJaWYgKCFyZXBsYWNlbWVudF9vcCkgewotCQkJCWdvdG8gY2xlYW51cDsKKwkJCQlnb3RvIGFsbG9jYXRlX2Vycm9yOwogCQkJfQogCQl9CiAKIAkJLyogV2UgbXVzdCB1bmxpbmsgdGhpcyBvcCBmcm9tIHRoZSBwYXJlbnQgdHJlZSAqLwogCi0JCXByZXYgPSBvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLnZhbHVlLmFyZzsKIAkJaWYgKHByZXYgPT0gb3ApIHsKIAkJCS8qIFRoaXMgb3AgaXMgdGhlIGZpcnN0IGluIHRoZSBsaXN0ICovCiAKIAkJCWlmIChyZXBsYWNlbWVudF9vcCkgewotCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24ucGFyZW50ICAgICAgID0gb3AtPmNvbW1vbi5wYXJlbnQ7Ci0JCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi52YWx1ZS5hcmcgICAgPSBOVUxMOwotCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24ubm9kZSAgICAgICAgID0gb3AtPmNvbW1vbi5ub2RlOwotCQkJCW9wLT5jb21tb24ucGFyZW50LT5jb21tb24udmFsdWUuYXJnID0gcmVwbGFjZW1lbnRfb3A7Ci0JCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi5uZXh0ICAgICAgICAgPSBvcC0+Y29tbW9uLm5leHQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLnZhbHVlLmFyZyA9IG9wLT5jb21tb24ubmV4dDsKKwkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLnBhcmVudCA9CisJCQkJICAgIG9wLT5jb21tb24ucGFyZW50OworCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24udmFsdWUuYXJnID0gTlVMTDsKKwkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLm5vZGUgPSBvcC0+Y29tbW9uLm5vZGU7CisJCQkJb3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi52YWx1ZS5hcmcgPQorCQkJCSAgICByZXBsYWNlbWVudF9vcDsKKwkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLm5leHQgPSBvcC0+Y29tbW9uLm5leHQ7CisJCQl9IGVsc2UgeworCQkJCW9wLT5jb21tb24ucGFyZW50LT5jb21tb24udmFsdWUuYXJnID0KKwkJCQkgICAgb3AtPmNvbW1vbi5uZXh0OwogCQkJfQogCQl9CiAKIAkJLyogU2VhcmNoIHRoZSBwYXJlbnQgbGlzdCAqLwogCi0JCWVsc2Ugd2hpbGUgKHByZXYpIHsKLQkJCS8qIFRyYXZlcnNlIGFsbCBzaWJsaW5ncyBpbiB0aGUgcGFyZW50J3MgYXJndW1lbnQgbGlzdCAqLworCQllbHNlCisJCQl3aGlsZSAocHJldikgeworCQkJCS8qIFRyYXZlcnNlIGFsbCBzaWJsaW5ncyBpbiB0aGUgcGFyZW50J3MgYXJndW1lbnQgbGlzdCAqLwogCi0JCQluZXh0ID0gcHJldi0+Y29tbW9uLm5leHQ7Ci0JCQlpZiAobmV4dCA9PSBvcCkgewotCQkJCWlmIChyZXBsYWNlbWVudF9vcCkgewotCQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLnBhcmVudCAgID0gb3AtPmNvbW1vbi5wYXJlbnQ7Ci0JCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24udmFsdWUuYXJnID0gTlVMTDsKLQkJCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi5ub2RlICAgICA9IG9wLT5jb21tb24ubm9kZTsKLQkJCQkJcHJldi0+Y29tbW9uLm5leHQgICAgICAgICAgICAgICA9IHJlcGxhY2VtZW50X29wOwotCQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLm5leHQgICAgID0gb3AtPmNvbW1vbi5uZXh0OwotCQkJCQluZXh0ID0gTlVMTDsKKwkJCQluZXh0ID0gcHJldi0+Y29tbW9uLm5leHQ7CisJCQkJaWYgKG5leHQgPT0gb3ApIHsKKwkJCQkJaWYgKHJlcGxhY2VtZW50X29wKSB7CisJCQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLnBhcmVudCA9CisJCQkJCQkgICAgb3AtPmNvbW1vbi5wYXJlbnQ7CisJCQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLnZhbHVlLgorCQkJCQkJICAgIGFyZyA9IE5VTEw7CisJCQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLm5vZGUgPQorCQkJCQkJICAgIG9wLT5jb21tb24ubm9kZTsKKwkJCQkJCXByZXYtPmNvbW1vbi5uZXh0ID0KKwkJCQkJCSAgICByZXBsYWNlbWVudF9vcDsKKwkJCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24ubmV4dCA9CisJCQkJCQkgICAgb3AtPmNvbW1vbi5uZXh0OworCQkJCQkJbmV4dCA9IE5VTEw7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmV2LT5jb21tb24ubmV4dCA9CisJCQkJCQkgICAgb3AtPmNvbW1vbi5uZXh0OworCQkJCQkJbmV4dCA9IE5VTEw7CisJCQkJCX0KIAkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXByZXYtPmNvbW1vbi5uZXh0ID0gb3AtPmNvbW1vbi5uZXh0OwotCQkJCQluZXh0ID0gTlVMTDsKLQkJCQl9CisJCQkJcHJldiA9IG5leHQ7CiAJCQl9Ci0JCQlwcmV2ID0gbmV4dDsKLQkJfQogCX0KIAotCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAogCS8qIE5vdyB3ZSBjYW4gYWN0dWFsbHkgZGVsZXRlIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCBPcCAqLwogCi0JYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSAob3ApOwotCXJldHVybl9WT0lEOwotfQorCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUob3ApOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAKKyAgICAgIGFsbG9jYXRlX2Vycm9yOgorCisJLyogQWx3YXlzIGRlbGV0ZSB0aGUgc3VidHJlZSwgZXZlbiBvbiBlcnJvciAqLworCisJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzE3LDE4ICszMjEsMTUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3N0YXR1cykKK2FjcGlfc3RhdHVzCithY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgYWNwaV9zdGF0dXMgY2FsbGJhY2tfc3RhdHVzKQogewotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSA9ICZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9DVFJMX1BFTkRJTkc7CisJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSA9ICZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfQ1RSTF9QRU5ESU5HOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInBzX25leHRfcGFyc2Vfc3RhdGUiLCBvcCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigicHNfbmV4dF9wYXJzZV9zdGF0ZSIsIG9wKTsKIAogCXN3aXRjaCAoY2FsbGJhY2tfc3RhdHVzKSB7CiAJY2FzZSBBRV9DVFJMX1RFUk1JTkFURToKQEAgLTM0MSw3ICszNDIsNiBAQAogCQlzdGF0dXMgPSBBRV9DVFJMX1RFUk1JTkFURTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUVfQ1RSTF9CUkVBSzoKIAogCQlwYXJzZXJfc3RhdGUtPmFtbCA9IHdhbGtfc3RhdGUtPmFtbF9sYXN0X3doaWxlOwpAQCAtMzUxLDcgKzM1MSw2IEBACiAKIAljYXNlIEFFX0NUUkxfQ09OVElOVUU6CiAKLQogCQlwYXJzZXJfc3RhdGUtPmFtbCA9IHdhbGtfc3RhdGUtPmFtbF9sYXN0X3doaWxlOwogCQlzdGF0dXMgPSBBRV9DVFJMX0NPTlRJTlVFOwogCQlicmVhazsKQEAgLTM3NSwxMCArMzc0LDkgQEAKIAkJICogUHJlZGljYXRlIG9mIGFuIElGIHdhcyB0cnVlLCBhbmQgd2UgYXJlIGF0IHRoZSBtYXRjaGluZyBFTFNFLgogCQkgKiBKdXN0IGNsb3NlIG91dCB0aGlzIHBhY2thZ2UKIAkJICovCi0JCXBhcnNlcl9zdGF0ZS0+YW1sID0gYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2VuZCAocGFyc2VyX3N0YXRlKTsKKwkJcGFyc2VyX3N0YXRlLT5hbWwgPSBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kKHBhcnNlcl9zdGF0ZSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFFX0NUUkxfRkFMU0U6CiAKIAkJLyoKQEAgLTM5Niw3ICszOTQsNiBAQAogCQlzdGF0dXMgPSBBRV9DVFJMX0VORDsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUVfQ1RSTF9UUkFOU0ZFUjoKIAogCQkvKiBBIG1ldGhvZCBjYWxsIChpbnZvY2F0aW9uKSAtLSB0cmFuc2ZlciBjb250cm9sICovCkBAIC00MDQsMTQgKzQwMSwxNSBAQAogCQlzdGF0dXMgPSBBRV9DVFJMX1RSQU5TRkVSOwogCQl3YWxrX3N0YXRlLT5wcmV2X29wID0gb3A7CiAJCXdhbGtfc3RhdGUtPm1ldGhvZF9jYWxsX29wID0gb3A7Ci0JCXdhbGtfc3RhdGUtPm1ldGhvZF9jYWxsX25vZGUgPSAob3AtPmNvbW1vbi52YWx1ZS5hcmcpLT5jb21tb24ubm9kZTsKKwkJd2Fsa19zdGF0ZS0+bWV0aG9kX2NhbGxfbm9kZSA9CisJCSAgICAob3AtPmNvbW1vbi52YWx1ZS5hcmcpLT5jb21tb24ubm9kZTsKIAogCQkvKiBXaWxsIHJldHVybiB2YWx1ZSAoaWYgYW55KSBiZSB1c2VkIGJ5IHRoZSBjYWxsZXI/ICovCiAKLQkJd2Fsa19zdGF0ZS0+cmV0dXJuX3VzZWQgPSBhY3BpX2RzX2lzX3Jlc3VsdF91c2VkIChvcCwgd2Fsa19zdGF0ZSk7CisJCXdhbGtfc3RhdGUtPnJldHVybl91c2VkID0KKwkJICAgIGFjcGlfZHNfaXNfcmVzdWx0X3VzZWQob3AsIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAogCQlzdGF0dXMgPSBjYWxsYmFja19zdGF0dXM7CkBAIC00MjEsNjY3ICs0MTksOSBAQAogCQlicmVhazsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19wYXJzZV9sb29wCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQYXJzZSBBTUwgKHBvaW50ZWQgdG8gYnkgdGhlIGN1cnJlbnQgcGFyc2VyIHN0YXRlKSBhbmQgcmV0dXJuCi0gKiAgICAgICAgICAgICAgYSB0cmVlIG9mIG9wcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfcHNfcGFyc2VfbG9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKLXsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wID0gTlVMTDsgICAgIC8qIGN1cnJlbnQgb3AgKi8KLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcgPSBOVUxMOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnByZV9vcCA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9vcF9zdGFydCA9IE5VTEw7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgicHNfcGFyc2VfbG9vcCIsIHdhbGtfc3RhdGUpOwotCi0JaWYgKHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgPT0gTlVMTCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXBhcnNlcl9zdGF0ZSA9ICZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGU7Ci0Jd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gMDsKLQotI2lmICghZGVmaW5lZCAoQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OKSAmJiAhZGVmaW5lZCAoQUNQSV9DT05TVEFOVF9FVkFMX09OTFkpKQotCi0JaWYgKHdhbGtfc3RhdGUtPndhbGtfdHlwZSAmIEFDUElfV0FMS19NRVRIT0RfUkVTVEFSVCkgewotCQkvKiBXZSBhcmUgcmVzdGFydGluZyBhIHByZWVtcHRlZCBjb250cm9sIG1ldGhvZCAqLwotCi0JCWlmIChhY3BpX3BzX2hhc19jb21wbGV0ZWRfc2NvcGUgKHBhcnNlcl9zdGF0ZSkpIHsKLQkJCS8qCi0JCQkgKiBXZSBtdXN0IGNoZWNrIGlmIGEgcHJlZGljYXRlIHRvIGFuIElGIG9yIFdISUxFIHN0YXRlbWVudAotCQkJICogd2FzIGp1c3QgY29tcGxldGVkCi0JCQkgKi8KLQkJCWlmICgocGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUub3ApICYmCi0JCQkgICAoKHBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLm9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSUZfT1ApIHx8Ci0JCQkJKHBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLm9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfV0hJTEVfT1ApKSAmJgotCQkJCSh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKSAmJgotCQkJCSh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPT0KLQkJCQkJQUNQSV9DT05UUk9MX1BSRURJQ0FURV9FWEVDVVRJTkcpKSB7Ci0JCQkJLyoKLQkJCQkgKiBBIHByZWRpY2F0ZSB3YXMganVzdCBjb21wbGV0ZWQsIGdldCB0aGUgdmFsdWUgb2YgdGhlCi0JCQkJICogcHJlZGljYXRlIGFuZCBicmFuY2ggYmFzZWQgb24gdGhhdCB2YWx1ZQotCQkJCSAqLwotCQkJCXdhbGtfc3RhdGUtPm9wID0gTlVMTDsKLQkJCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9wcmVkaWNhdGVfdmFsdWUgKHdhbGtfc3RhdGUsIEFDUElfVE9fUE9JTlRFUiAoVFJVRSkpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykgJiYKLQkJCQkJKChzdGF0dXMgJiBBRV9DT0RFX01BU0spICE9IEFFX0NPREVfQ09OVFJPTCkpIHsKLQkJCQkJaWYgKHN0YXR1cyA9PSBBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKSB7Ci0JCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCQkiSW52b2tlZCBtZXRob2QgZGlkIG5vdCByZXR1cm4gYSB2YWx1ZSwgJXNcbiIsCi0JCQkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0KLQkJCQkJfQotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCSJnZXRfcHJlZGljYXRlIEZhaWxlZCwgJXNcbiIsCi0JCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotCQkJCX0KLQotCQkJCXN0YXR1cyA9IGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSAod2Fsa19zdGF0ZSwgb3AsIHN0YXR1cyk7Ci0JCQl9Ci0KLQkJCWFjcGlfcHNfcG9wX3Njb3BlIChwYXJzZXJfc3RhdGUsICZvcCwKLQkJCQkmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLCAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLCAiUG9wcGVkIHNjb3BlLCBPcD0lcFxuIiwgb3ApKTsKLQkJfQotCQllbHNlIGlmICh3YWxrX3N0YXRlLT5wcmV2X29wKSB7Ci0JCQkvKiBXZSB3ZXJlIGluIHRoZSBtaWRkbGUgb2YgYW4gb3AgKi8KLQotCQkJb3AgPSB3YWxrX3N0YXRlLT5wcmV2X29wOwotCQkJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gd2Fsa19zdGF0ZS0+cHJldl9hcmdfdHlwZXM7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCS8qIEl0ZXJhdGl2ZSBwYXJzaW5nIGxvb3AsIHdoaWxlIHRoZXJlIGlzIG1vcmUgQU1MIHRvIHByb2Nlc3M6ICovCi0KLQl3aGlsZSAoKHBhcnNlcl9zdGF0ZS0+YW1sIDwgcGFyc2VyX3N0YXRlLT5hbWxfZW5kKSB8fCAob3ApKSB7Ci0JCWFtbF9vcF9zdGFydCA9IHBhcnNlcl9zdGF0ZS0+YW1sOwotCQlpZiAoIW9wKSB7Ci0JCQkvKiBHZXQgdGhlIG5leHQgb3Bjb2RlIGZyb20gdGhlIEFNTCBzdHJlYW0gKi8KLQotCQkJd2Fsa19zdGF0ZS0+YW1sX29mZnNldCA9ICh1MzIpIEFDUElfUFRSX0RJRkYgKHBhcnNlcl9zdGF0ZS0+YW1sLAotCQkJCQkgIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKLQkJCXdhbGtfc3RhdGUtPm9wY29kZSAgID0gYWNwaV9wc19wZWVrX29wY29kZSAocGFyc2VyX3N0YXRlKTsKLQotCQkJLyoKLQkJCSAqIEZpcnN0IGN1dCB0byBkZXRlcm1pbmUgd2hhdCB3ZSBoYXZlIGZvdW5kOgotCQkJICogMSkgQSB2YWxpZCBBTUwgb3Bjb2RlCi0JCQkgKiAyKSBBIG5hbWUgc3RyaW5nCi0JCQkgKiAzKSBBbiB1bmtub3duL2ludmFsaWQgb3Bjb2RlCi0JCQkgKi8KLQkJCXdhbGtfc3RhdGUtPm9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKLQkJCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MpIHsKLQkJCWNhc2UgQU1MX0NMQVNTX0FTQ0lJOgotCQkJY2FzZSBBTUxfQ0xBU1NfUFJFRklYOgotCQkJCS8qCi0JCQkJICogU3RhcnRzIHdpdGggYSB2YWxpZCBwcmVmaXggb3IgQVNDSUkgY2hhciwgdGhpcyBpcyBhIG5hbWUKLQkJCQkgKiBzdHJpbmcuICBDb252ZXJ0IHRoZSBiYXJlIG5hbWUgc3RyaW5nIHRvIGEgbmFtZXBhdGguCi0JCQkJICovCi0JCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gQU1MX0lOVF9OQU1FUEFUSF9PUDsKLQkJCQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSBBUkdQX05BTUVTVFJJTkc7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQU1MX0NMQVNTX1VOS05PV046Ci0KLQkJCQkvKiBUaGUgb3Bjb2RlIGlzIHVucmVjb2duaXplZC4gIEp1c3Qgc2tpcCB1bmtub3duIG9wY29kZXMgKi8KLQotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiRm91bmQgdW5rbm93biBvcGNvZGUgJVggYXQgQU1MIGFkZHJlc3MgJXAgb2Zmc2V0ICVYLCBpZ25vcmluZ1xuIiwKLQkJCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlLCBwYXJzZXJfc3RhdGUtPmFtbCwgd2Fsa19zdGF0ZS0+YW1sX29mZnNldCkpOwotCi0JCQkJQUNQSV9EVU1QX0JVRkZFUiAocGFyc2VyX3N0YXRlLT5hbWwsIDEyOCk7Ci0KLQkJCQkvKiBBc3N1bWUgb25lLWJ5dGUgYmFkIG9wY29kZSAqLwotCi0JCQkJcGFyc2VyX3N0YXRlLT5hbWwrKzsKLQkJCQljb250aW51ZTsKLQotCQkJZGVmYXVsdDoKLQotCQkJCS8qIEZvdW5kIG9wY29kZSBpbmZvLCB0aGlzIGlzIGEgbm9ybWFsIG9wY29kZSAqLwotCi0JCQkJcGFyc2VyX3N0YXRlLT5hbWwgKz0gYWNwaV9wc19nZXRfb3Bjb2RlX3NpemUgKHdhbGtfc3RhdGUtPm9wY29kZSk7Ci0JCQkJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+cGFyc2VfYXJnczsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogQ3JlYXRlIE9wIHN0cnVjdHVyZSBhbmQgYXBwZW5kIHRvIHBhcmVudCdzIGFyZ3VtZW50IGxpc3QgKi8KLQotCQkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7Ci0JCQkJLyogQWxsb2NhdGUgYSBuZXcgcHJlX29wIGlmIG5lY2Vzc2FyeSAqLwotCi0JCQkJaWYgKCFwcmVfb3ApIHsKLQkJCQkJcHJlX29wID0gYWNwaV9wc19hbGxvY19vcCAod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKLQkJCQkJaWYgKCFwcmVfb3ApIHsKLQkJCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXByZV9vcC0+Y29tbW9uLnZhbHVlLmFyZyA9IE5VTEw7Ci0JCQkJcHJlX29wLT5jb21tb24uYW1sX29wY29kZSA9IHdhbGtfc3RhdGUtPm9wY29kZTsKLQotCQkJCS8qCi0JCQkJICogR2V0IGFuZCBhcHBlbmQgYXJndW1lbnRzIHVudGlsIHdlIGZpbmQgdGhlIG5vZGUgdGhhdCBjb250YWlucwotCQkJCSAqIHRoZSBuYW1lICh0aGUgdHlwZSBBUkdQX05BTUUpLgotCQkJCSAqLwotCQkJCXdoaWxlIChHRVRfQ1VSUkVOVF9BUkdfVFlQRSAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSAmJgotCQkJCQkgIChHRVRfQ1VSUkVOVF9BUkdfVFlQRSAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSAhPSBBUkdQX05BTUUpKSB7Ci0JCQkJCXN0YXR1cyA9IGFjcGlfcHNfZ2V0X25leHRfYXJnICh3YWxrX3N0YXRlLCBwYXJzZXJfc3RhdGUsCi0JCQkJCQkJIEdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpLCAmYXJnKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCQkJZ290byBjbG9zZV90aGlzX29wOwotCQkJCQl9Ci0KLQkJCQkJYWNwaV9wc19hcHBlbmRfYXJnIChwcmVfb3AsIGFyZyk7Ci0JCQkJCUlOQ1JFTUVOVF9BUkdfTElTVCAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGZvdW5kIGEgTkFNRSBhbmQgZGlkbid0IHJ1biBvdXQgb2YKLQkJCQkgKiBhcmd1bWVudHMKLQkJCQkgKi8KLQkJCQlpZiAoIUdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpKSB7Ci0JCQkJCXN0YXR1cyA9IEFFX0FNTF9OT19PUEVSQU5EOwotCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJfQotCi0JCQkJLyogV2Uga25vdyB0aGF0IHRoaXMgYXJnIGlzIGEgbmFtZSwgbW92ZSB0byBuZXh0IGFyZyAqLwotCi0JCQkJSU5DUkVNRU5UX0FSR19MSVNUICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpOwotCi0JCQkJLyoKLQkJCQkgKiBGaW5kIHRoZSBvYmplY3QuICBUaGlzIHdpbGwgZWl0aGVyIGluc2VydCB0aGUgb2JqZWN0IGludG8KLQkJCQkgKiB0aGUgbmFtZXNwYWNlIG9yIHNpbXBseSBsb29rIGl0IHVwCi0JCQkJICovCi0JCQkJd2Fsa19zdGF0ZS0+b3AgPSBOVUxMOwotCi0JCQkJc3RhdHVzID0gd2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayAod2Fsa19zdGF0ZSwgJm9wKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJIkR1cmluZyBuYW1lIGxvb2t1cC9jYXRhbG9nLCAlc1xuIiwKLQkJCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJfQotCi0JCQkJaWYgKCFvcCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlzdGF0dXMgPSBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUgKHdhbGtfc3RhdGUsIG9wLCBzdGF0dXMpOwotCQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QRU5ESU5HKSB7Ci0JCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJfQotCi0JCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJfQotCi0JCQkJYWNwaV9wc19hcHBlbmRfYXJnIChvcCwgcHJlX29wLT5jb21tb24udmFsdWUuYXJnKTsKLQkJCQlhY3BpX2dibF9kZXB0aCsrOwotCi0JCQkJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUkVHSU9OX09QKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIERlZmVyIGZpbmFsIHBhcnNpbmcgb2YgYW4gb3BlcmF0aW9uX3JlZ2lvbiBib2R5LAotCQkJCQkgKiBiZWNhdXNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIGluZm8gaW4gdGhlIGZpcnN0IHBhc3MKLQkJCQkJICogdG8gcGFyc2UgaXQgY29ycmVjdGx5IChpLmUuLCB0aGVyZSBtYXkgYmUgbWV0aG9kCi0JCQkJCSAqIGNhbGxzIHdpdGhpbiB0aGUgdGVybV9hcmcgZWxlbWVudHMgb2YgdGhlIGJvZHkuKQotCQkJCQkgKgotCQkJCQkgKiBIb3dldmVyLCB3ZSBtdXN0IGNvbnRpbnVlIHBhcnNpbmcgYmVjYXVzZQotCQkJCQkgKiB0aGUgb3ByZWdpb24gaXMgbm90IGEgc3RhbmRhbG9uZSBwYWNrYWdlIC0tCi0JCQkJCSAqIHdlIGRvbid0IGtub3cgd2hlcmUgdGhlIGVuZCBpcyBhdCB0aGlzIHBvaW50LgotCQkJCQkgKgotCQkJCQkgKiAoTGVuZ3RoIGlzIHVua25vd24gdW50aWwgcGFyc2Ugb2YgdGhlIGJvZHkgY29tcGxldGUpCi0JCQkJCSAqLwotCQkJCQlvcC0+bmFtZWQuZGF0YSAgICA9IGFtbF9vcF9zdGFydDsKLQkJCQkJb3AtPm5hbWVkLmxlbmd0aCAgPSAwOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIE5vdCBhIG5hbWVkIG9wY29kZSwganVzdCBhbGxvY2F0ZSBPcCBhbmQgYXBwZW5kIHRvIHBhcmVudCAqLwotCi0JCQkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvICh3YWxrX3N0YXRlLT5vcGNvZGUpOwotCQkJCW9wID0gYWNwaV9wc19hbGxvY19vcCAod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKLQkJCQlpZiAoIW9wKSB7Ci0JCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJCQkJZ290byBjbG9zZV90aGlzX29wOwotCQkJCX0KLQotCQkJCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9DUkVBVEUpIHsKLQkJCQkJLyoKLQkJCQkJICogQmFja3VwIHRvIGJlZ2lubmluZyBvZiBjcmVhdGVfeFhYZmllbGQgZGVjbGFyYXRpb24KLQkJCQkJICogYm9keV9sZW5ndGggaXMgdW5rbm93biB1bnRpbCB3ZSBwYXJzZSB0aGUgYm9keQotCQkJCQkgKi8KLQkJCQkJb3AtPm5hbWVkLmRhdGEgICAgPSBhbWxfb3Bfc3RhcnQ7Ci0JCQkJCW9wLT5uYW1lZC5sZW5ndGggID0gMDsKLQkJCQl9Ci0KLQkJCQlhY3BpX3BzX2FwcGVuZF9hcmcgKGFjcGlfcHNfZ2V0X3BhcmVudF9zY29wZSAocGFyc2VyX3N0YXRlKSwgb3ApOwotCi0JCQkJaWYgKCh3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrICE9IE5VTEwpKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEZpbmQgdGhlIG9iamVjdC4gVGhpcyB3aWxsIGVpdGhlciBpbnNlcnQgdGhlIG9iamVjdCBpbnRvCi0JCQkJCSAqIHRoZSBuYW1lc3BhY2Ugb3Igc2ltcGx5IGxvb2sgaXQgdXAKLQkJCQkJICovCi0JCQkJCXdhbGtfc3RhdGUtPm9wID0gb3A7Ci0KLQkJCQkJc3RhdHVzID0gd2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayAod2Fsa19zdGF0ZSwgJm9wKTsKLQkJCQkJc3RhdHVzID0gYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlICh3YWxrX3N0YXRlLCBvcCwgc3RhdHVzKTsKLQkJCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BFTkRJTkcpIHsKLQkJCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJCQkJZ290byBjbG9zZV90aGlzX29wOwotCQkJCQl9Ci0KLQkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCQkJZ290byBjbG9zZV90aGlzX29wOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlvcC0+Y29tbW9uLmFtbF9vZmZzZXQgPSB3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0OwotCi0JCQlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mbykgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAotCQkJCQkiT3Bjb2RlICU0LjRYIFslc10gT3AgJXAgQW1sICVwIGFtbF9vZmZzZXQgJTUuNVhcbiIsCi0JCQkJCSAodTMyKSBvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIHdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUsCi0JCQkJCSBvcCwgcGFyc2VyX3N0YXRlLT5hbWwsIG9wLT5jb21tb24uYW1sX29mZnNldCkpOwotCQkJfQotCQl9Ci0KLQotCQkvKgotCQkgKiBTdGFydCBhcmdfY291bnQgYXQgemVybyBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgdGhlcmUgYXJlCi0JCSAqIGFueSBhcmdzIHlldAotCQkgKi8KLQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMDsKLQotCQkvKiBBcmUgdGhlcmUgYW55IGFyZ3VtZW50cyB0aGF0IG11c3QgYmUgcHJvY2Vzc2VkPyAqLwotCi0JCWlmICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpIHsKLQkJCS8qIEdldCBhcmd1bWVudHMgKi8KLQotCQkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKLQkJCWNhc2UgQU1MX0JZVEVfT1A6ICAgICAgIC8qIEFNTF9CWVRFREFUQV9BUkcgKi8KLQkJCWNhc2UgQU1MX1dPUkRfT1A6ICAgICAgIC8qIEFNTF9XT1JEREFUQV9BUkcgKi8KLQkJCWNhc2UgQU1MX0RXT1JEX09QOiAgICAgIC8qIEFNTF9EV09SREFUQV9BUkcgKi8KLQkJCWNhc2UgQU1MX1FXT1JEX09QOiAgICAgIC8qIEFNTF9RV09SREFUQV9BUkcgKi8KLQkJCWNhc2UgQU1MX1NUUklOR19PUDogICAgIC8qIEFNTF9BU0NJSUNIQVJMSVNUX0FSRyAqLwotCi0JCQkJLyogRmlsbCBpbiBjb25zdGFudCBvciBzdHJpbmcgYXJndW1lbnQgZGlyZWN0bHkgKi8KLQotCQkJCWFjcGlfcHNfZ2V0X25leHRfc2ltcGxlX2FyZyAocGFyc2VyX3N0YXRlLAotCQkJCQlHRVRfQ1VSUkVOVF9BUkdfVFlQRSAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSwgb3ApOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6ICAgLyogQU1MX05BTUVTVFJJTkdfQVJHICovCi0KLQkJCQlzdGF0dXMgPSBhY3BpX3BzX2dldF9uZXh0X25hbWVwYXRoICh3YWxrX3N0YXRlLCBwYXJzZXJfc3RhdGUsIG9wLCAxKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKLQkJCQl9Ci0KLQkJCQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSAwOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCi0JCQkJLyoKLQkJCQkgKiBPcCBpcyBub3QgYSBjb25zdGFudCBvciBzdHJpbmcsIGFwcGVuZCBlYWNoIGFyZ3VtZW50Ci0JCQkJICogdG8gdGhlIE9wCi0JCQkJICovCi0JCQkJd2hpbGUgKEdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpICYmCi0JCQkJCQkhd2Fsa19zdGF0ZS0+YXJnX2NvdW50KSB7Ci0JCQkJCXdhbGtfc3RhdGUtPmFtbF9vZmZzZXQgPSAodTMyKQotCQkJCQkJQUNQSV9QVFJfRElGRiAocGFyc2VyX3N0YXRlLT5hbWwsIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKLQotCQkJCQlzdGF0dXMgPSBhY3BpX3BzX2dldF9uZXh0X2FyZyAod2Fsa19zdGF0ZSwgcGFyc2VyX3N0YXRlLAotCQkJCQkJCSBHRVRfQ1VSUkVOVF9BUkdfVFlQRSAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSwKLQkJCQkJCQkgJmFyZyk7Ci0JCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKLQkJCQkJfQotCi0JCQkJCWlmIChhcmcpIHsKLQkJCQkJCWFyZy0+Y29tbW9uLmFtbF9vZmZzZXQgPSB3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0OwotCQkJCQkJYWNwaV9wc19hcHBlbmRfYXJnIChvcCwgYXJnKTsKLQkJCQkJfQotCQkJCQlJTkNSRU1FTlRfQVJHX0xJU1QgKHdhbGtfc3RhdGUtPmFyZ190eXBlcyk7Ci0JCQkJfQotCi0JCQkJLyogU3BlY2lhbCBwcm9jZXNzaW5nIGZvciBjZXJ0YWluIG9wY29kZXMgKi8KLQotCQkJCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7Ci0JCQkJY2FzZSBBTUxfTUVUSE9EX09QOgotCi0JCQkJCS8qCi0JCQkJCSAqIFNraXAgcGFyc2luZyBvZiBjb250cm9sIG1ldGhvZAotCQkJCQkgKiBiZWNhdXNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIGluZm8gaW4gdGhlIGZpcnN0IHBhc3MKLQkJCQkJICogdG8gcGFyc2UgaXQgY29ycmVjdGx5LgotCQkJCQkgKgotCQkJCQkgKiBTYXZlIHRoZSBsZW5ndGggYW5kIGFkZHJlc3Mgb2YgdGhlIGJvZHkKLQkJCQkJICovCi0JCQkJCW9wLT5uYW1lZC5kYXRhICAgPSBwYXJzZXJfc3RhdGUtPmFtbDsKLQkJCQkJb3AtPm5hbWVkLmxlbmd0aCA9ICh1MzIpIChwYXJzZXJfc3RhdGUtPnBrZ19lbmQgLQotCQkJCQkJCSAgIHBhcnNlcl9zdGF0ZS0+YW1sKTsKLQotCQkJCQkvKiBTa2lwIGJvZHkgb2YgbWV0aG9kICovCi0KLQkJCQkJcGFyc2VyX3N0YXRlLT5hbWwgICA9IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKLQkJCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMDsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEFNTF9CVUZGRVJfT1A6Ci0JCQkJY2FzZSBBTUxfUEFDS0FHRV9PUDoKLQkJCQljYXNlIEFNTF9WQVJfUEFDS0FHRV9PUDoKLQotCQkJCQlpZiAoKG9wLT5jb21tb24ucGFyZW50KSAmJgotCQkJCQkJKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfTkFNRV9PUCkgJiYKLQkJCQkJCSh3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrICE9IGFjcGlfZHNfZXhlY19iZWdpbl9vcCkpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBTa2lwIHBhcnNpbmcgb2YgQnVmZmVycyBhbmQgUGFja2FnZXMKLQkJCQkJCSAqIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mbyBpbiB0aGUgZmlyc3QgcGFzcwotCQkJCQkJICogdG8gcGFyc2UgdGhlbSBjb3JyZWN0bHkuCi0JCQkJCQkgKi8KLQkJCQkJCW9wLT5uYW1lZC5kYXRhICAgPSBhbWxfb3Bfc3RhcnQ7Ci0JCQkJCQlvcC0+bmFtZWQubGVuZ3RoID0gKHUzMikgKHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCAtCi0JCQkJCQkJCSAgIGFtbF9vcF9zdGFydCk7Ci0KLQkJCQkJCS8qIFNraXAgYm9keSAqLwotCi0JCQkJCQlwYXJzZXJfc3RhdGUtPmFtbCAgID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOwotCQkJCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQU1MX1dISUxFX09QOgotCi0JCQkJCWlmICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKSB7Ci0JCQkJCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnBhY2thZ2VfZW5kID0KLQkJCQkJCQlwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0OgotCi0JCQkJCS8qIE5vIGFjdGlvbiBmb3IgYWxsIG90aGVyIG9wY29kZXMgKi8KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLyogQ2hlY2sgZm9yIGFyZ3VtZW50cyB0aGF0IG5lZWQgdG8gYmUgcHJvY2Vzc2VkICovCi0KLQkJaWYgKHdhbGtfc3RhdGUtPmFyZ19jb3VudCkgewotCQkJLyoKLQkJCSAqIFRoZXJlIGFyZSBhcmd1bWVudHMgKGNvbXBsZXggb25lcyksIHB1c2ggT3AgYW5kCi0JCQkgKiBwcmVwYXJlIGZvciBhcmd1bWVudAotCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3BzX3B1c2hfc2NvcGUgKHBhcnNlcl9zdGF0ZSwgb3AsCi0JCQkJCSB3YWxrX3N0YXRlLT5hcmdfdHlwZXMsIHdhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJZ290byBjbG9zZV90aGlzX29wOwotCQkJfQotCQkJb3AgPSBOVUxMOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKgotCQkgKiBBbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQgLS0gT3AgaXMgY29tcGxldGUsCi0JCSAqIHByZXBhcmUgZm9yIG5leHQKLQkJICovCi0JCXdhbGtfc3RhdGUtPm9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKLQkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7Ci0JCQlpZiAoYWNwaV9nYmxfZGVwdGgpIHsKLQkJCQlhY3BpX2dibF9kZXB0aC0tOwotCQkJfQotCi0JCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApIHsKLQkJCQkvKgotCQkJCSAqIFNraXAgcGFyc2luZyBvZiBjb250cm9sIG1ldGhvZCBvciBvcHJlZ2lvbiBib2R5LAotCQkJCSAqIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mbyBpbiB0aGUgZmlyc3QgcGFzcwotCQkJCSAqIHRvIHBhcnNlIHRoZW0gY29ycmVjdGx5LgotCQkJCSAqCi0JCQkJICogQ29tcGxldGVkIHBhcnNpbmcgYW4gb3BfcmVnaW9uIGRlY2xhcmF0aW9uLCB3ZSBub3cKLQkJCQkgKiBrbm93IHRoZSBsZW5ndGguCi0JCQkJICovCi0JCQkJb3AtPm5hbWVkLmxlbmd0aCA9ICh1MzIpIChwYXJzZXJfc3RhdGUtPmFtbCAtIG9wLT5uYW1lZC5kYXRhKTsKLQkJCX0KLQkJfQotCi0JCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9DUkVBVEUpIHsKLQkJCS8qCi0JCQkgKiBCYWNrdXAgdG8gYmVnaW5uaW5nIG9mIGNyZWF0ZV94WFhmaWVsZCBkZWNsYXJhdGlvbiAoMSBmb3IKLQkJCSAqIE9wY29kZSkKLQkJCSAqCi0JCQkgKiBib2R5X2xlbmd0aCBpcyB1bmtub3duIHVudGlsIHdlIHBhcnNlIHRoZSBib2R5Ci0JCQkgKi8KLQkJCW9wLT5uYW1lZC5sZW5ndGggPSAodTMyKSAocGFyc2VyX3N0YXRlLT5hbWwgLSBvcC0+bmFtZWQuZGF0YSk7Ci0JCX0KLQotCQkvKiBUaGlzIG9wIGNvbXBsZXRlLCBub3RpZnkgdGhlIGRpc3BhdGNoZXIgKi8KLQotCQlpZiAod2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrICE9IE5VTEwpIHsKLQkJCXdhbGtfc3RhdGUtPm9wICAgID0gb3A7Ci0JCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7Ci0KLQkJCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayAod2Fsa19zdGF0ZSk7Ci0JCQlzdGF0dXMgPSBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUgKHdhbGtfc3RhdGUsIG9wLCBzdGF0dXMpOwotCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BFTkRJTkcpIHsKLQkJCQlzdGF0dXMgPSBBRV9PSzsKLQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQl9Ci0JCX0KLQotCi1jbG9zZV90aGlzX29wOgotCQkvKgotCQkgKiBGaW5pc2hlZCBvbmUgYXJndW1lbnQgb2YgdGhlIGNvbnRhaW5pbmcgc2NvcGUKLQkJICovCi0JCXBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudC0tOwotCi0JCS8qIENsb3NlIHRoaXMgT3AgKHdpbGwgcmVzdWx0IGluIHBhcnNlIHN1YnRyZWUgZGVsZXRpb24pICovCi0KLQkJYWNwaV9wc19jb21wbGV0ZV90aGlzX29wICh3YWxrX3N0YXRlLCBvcCk7Ci0JCW9wID0gTlVMTDsKLQkJaWYgKHByZV9vcCkgewotCQkJYWNwaV9wc19mcmVlX29wIChwcmVfb3ApOwotCQkJcHJlX29wID0gTlVMTDsKLQkJfQotCi0JCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCWNhc2UgQUVfT0s6Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgQUVfQ1RSTF9UUkFOU0ZFUjoKLQotCQkJLyogV2UgYXJlIGFib3V0IHRvIHRyYW5zZmVyIHRvIGEgY2FsbGVkIG1ldGhvZC4gKi8KLQotCQkJd2Fsa19zdGF0ZS0+cHJldl9vcCA9IG9wOwotCQkJd2Fsa19zdGF0ZS0+cHJldl9hcmdfdHlwZXMgPSB3YWxrX3N0YXRlLT5hcmdfdHlwZXM7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7Ci0KLQotCQljYXNlIEFFX0NUUkxfRU5EOgotCi0JCQlhY3BpX3BzX3BvcF9zY29wZSAocGFyc2VyX3N0YXRlLCAmb3AsCi0JCQkJJndhbGtfc3RhdGUtPmFyZ190eXBlcywgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0KLQkJCWlmIChvcCkgewotCQkJCXdhbGtfc3RhdGUtPm9wICAgID0gb3A7Ci0JCQkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOwotCQkJCXdhbGtfc3RhdGUtPm9wY29kZSA9IG9wLT5jb21tb24uYW1sX29wY29kZTsKLQotCQkJCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayAod2Fsa19zdGF0ZSk7Ci0JCQkJc3RhdHVzID0gYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlICh3YWxrX3N0YXRlLCBvcCwgc3RhdHVzKTsKLQotCQkJCWFjcGlfcHNfY29tcGxldGVfdGhpc19vcCAod2Fsa19zdGF0ZSwgb3ApOwotCQkJCW9wID0gTlVMTDsKLQkJCX0KLQkJCXN0YXR1cyA9IEFFX09LOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIEFFX0NUUkxfQlJFQUs6Ci0JCWNhc2UgQUVfQ1RSTF9DT05USU5VRToKLQotCQkJLyogUG9wIG9mZiBzY29wZXMgdW50aWwgd2UgZmluZCB0aGUgV2hpbGUgKi8KLQotCQkJd2hpbGUgKCFvcCB8fCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9XSElMRV9PUCkpIHsKLQkJCQlhY3BpX3BzX3BvcF9zY29wZSAocGFyc2VyX3N0YXRlLCAmb3AsCi0JCQkJCSZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOwotCQkJfQotCi0JCQkvKiBDbG9zZSB0aGlzIGl0ZXJhdGlvbiBvZiB0aGUgV2hpbGUgbG9vcCAqLwotCi0JCQl3YWxrX3N0YXRlLT5vcCAgICA9IG9wOwotCQkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOwotCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gb3AtPmNvbW1vbi5hbWxfb3Bjb2RlOwotCi0JCQlzdGF0dXMgPSB3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sgKHdhbGtfc3RhdGUpOwotCQkJc3RhdHVzID0gYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlICh3YWxrX3N0YXRlLCBvcCwgc3RhdHVzKTsKLQotCQkJYWNwaV9wc19jb21wbGV0ZV90aGlzX29wICh3YWxrX3N0YXRlLCBvcCk7Ci0JCQlvcCA9IE5VTEw7Ci0KLQkJCXN0YXR1cyA9IEFFX09LOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIEFFX0NUUkxfVEVSTUlOQVRFOgotCi0JCQlzdGF0dXMgPSBBRV9PSzsKLQotCQkJLyogQ2xlYW4gdXAgKi8KLQkJCWRvIHsKLQkJCQlpZiAob3ApIHsKLQkJCQkJYWNwaV9wc19jb21wbGV0ZV90aGlzX29wICh3YWxrX3N0YXRlLCBvcCk7Ci0JCQkJfQotCQkJCWFjcGlfcHNfcG9wX3Njb3BlIChwYXJzZXJfc3RhdGUsICZvcCwKLQkJCQkJJndhbGtfc3RhdGUtPmFyZ190eXBlcywgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0KLQkJCX0gd2hpbGUgKG9wKTsKLQotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotCi0KLQkJZGVmYXVsdDogIC8qIEFsbCBvdGhlciBub24tQUVfT0sgc3RhdHVzICovCi0KLQkJCWRvIHsKLQkJCQlpZiAob3ApIHsKLQkJCQkJYWNwaV9wc19jb21wbGV0ZV90aGlzX29wICh3YWxrX3N0YXRlLCBvcCk7Ci0JCQkJfQotCQkJCWFjcGlfcHNfcG9wX3Njb3BlIChwYXJzZXJfc3RhdGUsICZvcCwKLQkJCQkJJndhbGtfc3RhdGUtPmFyZ190eXBlcywgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0KLQkJCX0gd2hpbGUgKG9wKTsKLQotCi0JCQkvKgotCQkJICogVEJEOiBDbGVhbnVwIHBhcnNlIG9wcyBvbiBlcnJvcgotCQkJICovCi0jaWYgMAotCQkJaWYgKG9wID09IE5VTEwpIHsKLQkJCQlhY3BpX3BzX3BvcF9zY29wZSAocGFyc2VyX3N0YXRlLCAmb3AsCi0JCQkJCSZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOwotCQkJfQotI2VuZGlmCi0JCQl3YWxrX3N0YXRlLT5wcmV2X29wID0gb3A7Ci0JCQl3YWxrX3N0YXRlLT5wcmV2X2FyZ190eXBlcyA9IHdhbGtfc3RhdGUtPmFyZ190eXBlczsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLQkJfQotCi0JCS8qIFRoaXMgc2NvcGUgY29tcGxldGU/ICovCi0KLQkJaWYgKGFjcGlfcHNfaGFzX2NvbXBsZXRlZF9zY29wZSAocGFyc2VyX3N0YXRlKSkgewotCQkJYWNwaV9wc19wb3Bfc2NvcGUgKHBhcnNlcl9zdGF0ZSwgJm9wLAotCQkJCSZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOwotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsICJQb3BwZWQgc2NvcGUsIE9wPSVwXG4iLCBvcCkpOwotCQl9Ci0JCWVsc2UgewotCQkJb3AgPSBOVUxMOwotCQl9Ci0KLQl9IC8qIHdoaWxlIHBhcnNlcl9zdGF0ZS0+QW1sICovCi0KLQotCS8qCi0JICogQ29tcGxldGUgdGhlIGxhc3QgT3AgKGlmIG5vdCBjb21wbGV0ZWQpLCBhbmQgY2xlYXIgdGhlIHNjb3BlIHN0YWNrLgotCSAqIEl0IGlzIGVhc2lseSBwb3NzaWJsZSB0byBlbmQgYW4gQU1MICJwYWNrYWdlIiB3aXRoIGFuIHVuYm91bmRlZCBudW1iZXIKLQkgKiBvZiBvcGVuIHNjb3BlcyAoc3VjaCBhcyB3aGVuIHNldmVyYWwgQVNMIGJsb2NrcyBhcmUgY2xvc2VkIHdpdGgKLQkgKiBzZXF1ZW50aWFsIGNsb3NpbmcgYnJhY2VzKS4gIFdlIHdhbnQgdG8gdGVybWluYXRlIGVhY2ggb25lIGNsZWFubHkuCi0JICovCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsICJBTUwgcGFja2FnZSBjb21wbGV0ZSBhdCBPcCAlcFxuIiwgb3ApKTsKLQlkbyB7Ci0JCWlmIChvcCkgewotCQkJaWYgKHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayAhPSBOVUxMKSB7Ci0JCQkJd2Fsa19zdGF0ZS0+b3AgICAgPSBvcDsKLQkJCQl3YWxrX3N0YXRlLT5vcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wLT5jb21tb24uYW1sX29wY29kZSk7Ci0JCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gb3AtPmNvbW1vbi5hbWxfb3Bjb2RlOwotCi0JCQkJc3RhdHVzID0gd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrICh3YWxrX3N0YXRlKTsKLQkJCQlzdGF0dXMgPSBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUgKHdhbGtfc3RhdGUsIG9wLCBzdGF0dXMpOwotCQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QRU5ESU5HKSB7Ci0JCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJfQotCi0JCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1RFUk1JTkFURSkgewotCQkJCQlzdGF0dXMgPSBBRV9PSzsKLQotCQkJCQkvKiBDbGVhbiB1cCAqLwotCQkJCQlkbyB7Ci0JCQkJCQlpZiAob3ApIHsKLQkJCQkJCQlhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3AgKHdhbGtfc3RhdGUsIG9wKTsKLQkJCQkJCX0KLQotCQkJCQkJYWNwaV9wc19wb3Bfc2NvcGUgKHBhcnNlcl9zdGF0ZSwgJm9wLAotCQkJCQkJCSZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOwotCi0JCQkJCX0gd2hpbGUgKG9wKTsKLQotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7Ci0JCQkJfQotCi0JCQkJZWxzZSBpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCWFjcGlfcHNfY29tcGxldGVfdGhpc19vcCAod2Fsa19zdGF0ZSwgb3ApOwotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7Ci0JCQkJfQotCQkJfQotCi0JCQlhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3AgKHdhbGtfc3RhdGUsIG9wKTsKLQkJfQotCi0JCWFjcGlfcHNfcG9wX3Njb3BlIChwYXJzZXJfc3RhdGUsICZvcCwgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKLQkJCSZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOwotCi0JfSB3aGlsZSAob3ApOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfcGFyc2VfYW1sCkBAIC0xMDk1LDM0ICs0MzUsMjkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9wc19wYXJzZV9hbWwgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX3BzX3BhcnNlX2FtbChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlX3N0YXR1czsKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQ7Ci0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqcHJldl93YWxrX2xpc3QgPSBhY3BpX2dibF9jdXJyZW50X3dhbGtfbGlzdDsKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICpwcmV2aW91c193YWxrX3N0YXRlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKnRocmVhZDsKKwlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKnByZXZfd2Fsa19saXN0ID0gYWNwaV9nYmxfY3VycmVudF93YWxrX2xpc3Q7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqcHJldmlvdXNfd2Fsa19zdGF0ZTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInBzX3BhcnNlX2FtbCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInBzX3BhcnNlX2FtbCIpOwotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCi0JCSJFbnRlcmVkIHdpdGggd2Fsa19zdGF0ZT0lcCBBbWw9JXAgc2l6ZT0lWFxuIiwKLQkJd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCwKLQkJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbF9zaXplKSk7Ci0KKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJICAiRW50ZXJlZCB3aXRoIHdhbGtfc3RhdGU9JXAgQW1sPSVwIHNpemU9JVhcbiIsCisJCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwsCisJCQkgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc2l6ZSkpOwogCiAJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHRocmVhZCBzdGF0ZSAqLwogCi0JdGhyZWFkID0gYWNwaV91dF9jcmVhdGVfdGhyZWFkX3N0YXRlICgpOworCXRocmVhZCA9IGFjcGlfdXRfY3JlYXRlX3RocmVhZF9zdGF0ZSgpOwogCWlmICghdGhyZWFkKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJd2Fsa19zdGF0ZS0+dGhyZWFkID0gdGhyZWFkOwotCWFjcGlfZHNfcHVzaF93YWxrX3N0YXRlICh3YWxrX3N0YXRlLCB0aHJlYWQpOworCWFjcGlfZHNfcHVzaF93YWxrX3N0YXRlKHdhbGtfc3RhdGUsIHRocmVhZCk7CiAKIAkvKgogCSAqIFRoaXMgZ2xvYmFsIGFsbG93cyB0aGUgQU1MIGRlYnVnZ2VyIHRvIGdldCBhIGhhbmRsZSB0byB0aGUgY3VycmVudGx5CkBAIC0xMTM0LDEzMCArNDY5LDEzNiBAQAogCSAqIEV4ZWN1dGUgdGhlIHdhbGsgbG9vcCBhcyBsb25nIGFzIHRoZXJlIGlzIGEgdmFsaWQgV2FsayBTdGF0ZS4gIFRoaXMKIAkgKiBoYW5kbGVzIG5lc3RlZCBjb250cm9sIG1ldGhvZCBpbnZvY2F0aW9ucyB3aXRob3V0IHJlY3Vyc2lvbi4KIAkgKi8KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwgIlN0YXRlPSVwXG4iLCB3YWxrX3N0YXRlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIlN0YXRlPSVwXG4iLCB3YWxrX3N0YXRlKSk7CiAKIAlzdGF0dXMgPSBBRV9PSzsKIAl3aGlsZSAod2Fsa19zdGF0ZSkgewotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJLyoKIAkJCSAqIFRoZSBwYXJzZV9sb29wIGV4ZWN1dGVzIEFNTCB1bnRpbCB0aGUgbWV0aG9kIHRlcm1pbmF0ZXMKIAkJCSAqIG9yIGNhbGxzIGFub3RoZXIgbWV0aG9kLgogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2xvb3AgKHdhbGtfc3RhdGUpOworCQkJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9sb29wKHdhbGtfc3RhdGUpOwogCQl9CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCi0JCQkiQ29tcGxldGVkIG9uZSBjYWxsIHRvIHdhbGsgbG9vcCwgJXMgU3RhdGU9JXBcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksIHdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCQkgICJDb21wbGV0ZWQgb25lIGNhbGwgdG8gd2FsayBsb29wLCAlcyBTdGF0ZT0lcFxuIiwKKwkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLCB3YWxrX3N0YXRlKSk7CiAKIAkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1RSQU5TRkVSKSB7CiAJCQkvKgogCQkJICogQSBtZXRob2QgY2FsbCB3YXMgZGV0ZWN0ZWQuCiAJCQkgKiBUcmFuc2ZlciBjb250cm9sIHRvIHRoZSBjYWxsZWQgY29udHJvbCBtZXRob2QKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9kc19jYWxsX2NvbnRyb2xfbWV0aG9kICh0aHJlYWQsIHdhbGtfc3RhdGUsIE5VTEwpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2RzX2NhbGxfY29udHJvbF9tZXRob2QodGhyZWFkLCB3YWxrX3N0YXRlLAorCQkJCQkJCU5VTEwpOwogCiAJCQkvKgogCQkJICogSWYgdGhlIHRyYW5zZmVyIHRvIHRoZSBuZXcgbWV0aG9kIG1ldGhvZCBjYWxsIHdvcmtlZCwgYSBuZXcgd2FsawogCQkJICogc3RhdGUgd2FzIGNyZWF0ZWQgLS0gZ2V0IGl0CiAJCQkgKi8KLQkJCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2dldF9jdXJyZW50X3dhbGtfc3RhdGUgKHRocmVhZCk7CisJCQl3YWxrX3N0YXRlID0gYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlKHRocmVhZCk7CiAJCQljb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChzdGF0dXMgPT0gQUVfQ1RSTF9URVJNSU5BVEUpIHsKKwkJfSBlbHNlIGlmIChzdGF0dXMgPT0gQUVfQ1RSTF9URVJNSU5BVEUpIHsKIAkJCXN0YXR1cyA9IEFFX09LOwotCQl9Ci0JCWVsc2UgaWYgKChzdGF0dXMgIT0gQUVfT0spICYmICh3YWxrX3N0YXRlLT5tZXRob2RfZGVzYykpIHsKLQkJCUFDUElfUkVQT1JUX01FVEhPRF9FUlJPUiAoIk1ldGhvZCBleGVjdXRpb24gZmFpbGVkIiwKLQkJCQl3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSwgTlVMTCwgc3RhdHVzKTsKKwkJfSBlbHNlIGlmICgoc3RhdHVzICE9IEFFX09LKSAmJiAod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MpKSB7CisJCQlBQ1BJX1JFUE9SVF9NRVRIT0RfRVJST1IoIk1ldGhvZCBleGVjdXRpb24gZmFpbGVkIiwKKwkJCQkJCSB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSwgTlVMTCwKKwkJCQkJCSBzdGF0dXMpOworCisJCQkvKiBFbnN1cmUgcHJvcGVyIGNsZWFudXAgKi8KKworCQkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgfD0gQUNQSV9QQVJTRV9FWEVDVVRFOwogCiAJCQkvKiBDaGVjayBmb3IgcG9zc2libGUgbXVsdGktdGhyZWFkIHJlZW50cmFuY3kgcHJvYmxlbSAqLwogCiAJCQlpZiAoKHN0YXR1cyA9PSBBRV9BTFJFQURZX0VYSVNUUykgJiYKLQkJCQkoIXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2Quc2VtYXBob3JlKSkgeworCQkJICAgICghd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpKSB7CiAJCQkJLyoKIAkJCQkgKiBUaGlzIG1ldGhvZCBpcyBtYXJrZWQgbm90X3NlcmlhbGl6ZWQsIGJ1dCBpdCB0cmllZCB0byBjcmVhdGUKIAkJCQkgKiBhIG5hbWVkIG9iamVjdCwgY2F1c2luZyB0aGUgc2Vjb25kIHRocmVhZCBlbnRyYW5jZSB0byBmYWlsLgogCQkJCSAqIFdlIHdpbGwgd29ya2Fyb3VuZCB0aGlzIGJ5IG1hcmtpbmcgdGhlIG1ldGhvZCBwZXJtYW5lbnRseQogCQkJCSAqIGFzIFNlcmlhbGl6ZWQuCiAJCQkJICovCi0JCQkJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgfD0gQU1MX01FVEhPRF9TRVJJQUxJWkVEOworCQkJCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzIHw9CisJCQkJICAgIEFNTF9NRVRIT0RfU0VSSUFMSVpFRDsKIAkJCQl3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLmNvbmN1cnJlbmN5ID0gMTsKIAkJCX0KIAkJfQogCi0JCWlmICh3YWxrX3N0YXRlLT5tZXRob2RfZGVzYykgewotCQkJLyogRGVjcmVtZW50IHRoZSB0aHJlYWQgY291bnQgb24gdGhlIG1ldGhvZCBwYXJzZSB0cmVlICovCi0KLQkJCWlmICh3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudCkgewotCQkJCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50LS07Ci0JCQl9Ci0JCX0KLQogCQkvKiBXZSBhcmUgZG9uZSB3aXRoIHRoaXMgd2FsaywgbW92ZSBvbiB0byB0aGUgcGFyZW50IGlmIGFueSAqLwogCi0JCXdhbGtfc3RhdGUgPSBhY3BpX2RzX3BvcF93YWxrX3N0YXRlICh0aHJlYWQpOworCQl3YWxrX3N0YXRlID0gYWNwaV9kc19wb3Bfd2Fsa19zdGF0ZSh0aHJlYWQpOwogCiAJCS8qIFJlc2V0IHRoZSBjdXJyZW50IHNjb3BlIHRvIHRoZSBiZWdpbm5pbmcgb2Ygc2NvcGUgc3RhY2sgKi8KIAotCQlhY3BpX2RzX3Njb3BlX3N0YWNrX2NsZWFyICh3YWxrX3N0YXRlKTsKKwkJYWNwaV9kc19zY29wZV9zdGFja19jbGVhcih3YWxrX3N0YXRlKTsKIAogCQkvKgogCQkgKiBJZiB3ZSBqdXN0IHJldHVybmVkIGZyb20gdGhlIGV4ZWN1dGlvbiBvZiBhIGNvbnRyb2wgbWV0aG9kLAogCQkgKiB0aGVyZSdzIGxvdHMgb2YgY2xlYW51cCB0byBkbwogCQkgKi8KLQkJaWYgKCh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfTU9ERV9NQVNLKSA9PSBBQ1BJX1BBUlNFX0VYRUNVVEUpIHsKLQkJCXRlcm1pbmF0ZV9zdGF0dXMgPSBhY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZCAod2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFICh0ZXJtaW5hdGVfc3RhdHVzKSkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJCSJDb3VsZCBub3QgdGVybWluYXRlIGNvbnRyb2wgbWV0aG9kIHByb3Blcmx5XG4iKSk7CisJCWlmICgod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX01PREVfTUFTSykgPT0KKwkJICAgIEFDUElfUEFSU0VfRVhFQ1VURSkgeworCQkJaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjKSB7CisJCQkJLyogRGVjcmVtZW50IHRoZSB0aHJlYWQgY291bnQgb24gdGhlIG1ldGhvZCBwYXJzZSB0cmVlICovCiAKLQkJCQkvKiBJZ25vcmUgZXJyb3IgYW5kIGNvbnRpbnVlICovCisJCQkJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQtLTsKIAkJCX0KKworCQkJYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2Qod2Fsa19zdGF0ZSk7CiAJCX0KIAogCQkvKiBEZWxldGUgdGhpcyB3YWxrIHN0YXRlIGFuZCBhbGwgbGlua2VkIGNvbnRyb2wgc3RhdGVzICovCiAKLQkJYWNwaV9wc19jbGVhbnVwX3Njb3BlICgmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKTsKKwkJYWNwaV9wc19jbGVhbnVwX3Njb3BlKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpOwogCiAJCXByZXZpb3VzX3dhbGtfc3RhdGUgPSB3YWxrX3N0YXRlOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAotCQkJInJldHVybl92YWx1ZT0lcCwgaW1wbGljaXRfdmFsdWU9JXAgU3RhdGU9JXBcbiIsCi0JCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYywgd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaiwgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJCSAgInJldHVybl92YWx1ZT0lcCwgaW1wbGljaXRfdmFsdWU9JXAgU3RhdGU9JXBcbiIsCisJCQkJICB3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYywKKwkJCQkgIHdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmosIHdhbGtfc3RhdGUpKTsKIAogCQkvKiBDaGVjayBpZiB3ZSBoYXZlIHJlc3RhcnRlZCBhIHByZWVtcHRlZCB3YWxrICovCiAKLQkJd2Fsa19zdGF0ZSA9IGFjcGlfZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZSAodGhyZWFkKTsKKwkJd2Fsa19zdGF0ZSA9IGFjcGlfZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZSh0aHJlYWQpOwogCQlpZiAod2Fsa19zdGF0ZSkgewotCQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQkJLyoKIAkJCQkgKiBUaGVyZSBpcyBhbm90aGVyIHdhbGsgc3RhdGUsIHJlc3RhcnQgaXQuCiAJCQkJICogSWYgdGhlIG1ldGhvZCByZXR1cm4gdmFsdWUgaXMgbm90IHVzZWQgYnkgdGhlIHBhcmVudCwKIAkJCQkgKiBUaGUgb2JqZWN0IGlzIGRlbGV0ZWQKIAkJCQkgKi8KIAkJCQlpZiAoIXByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjKSB7Ci0JCQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdGFydF9jb250cm9sX21ldGhvZCAod2Fsa19zdGF0ZSwKLQkJCQkJCQkgcHJldmlvdXNfd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaik7Ci0JCQkJfQotCQkJCWVsc2UgeworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgYWNwaV9kc19yZXN0YXJ0X2NvbnRyb2xfbWV0aG9kCisJCQkJCSAgICAod2Fsa19zdGF0ZSwKKwkJCQkJICAgICBwcmV2aW91c193YWxrX3N0YXRlLT4KKwkJCQkJICAgICBpbXBsaWNpdF9yZXR1cm5fb2JqKTsKKwkJCQl9IGVsc2UgewogCQkJCQkvKgogCQkJCQkgKiBXZSBoYXZlIGEgdmFsaWQgcmV0dXJuIHZhbHVlLCBkZWxldGUgYW55IGltcGxpY2l0CiAJCQkJCSAqIHJldHVybiB2YWx1ZS4KIAkJCQkJICovCi0JCQkJCWFjcGlfZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuIChwcmV2aW91c193YWxrX3N0YXRlKTsKKwkJCQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4KKwkJCQkJICAgIChwcmV2aW91c193YWxrX3N0YXRlKTsKIAotCQkJCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3RhcnRfY29udHJvbF9tZXRob2QgKHdhbGtfc3RhdGUsCi0JCQkJCQkJIHByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjKTsKKwkJCQkJc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfZHNfcmVzdGFydF9jb250cm9sX21ldGhvZAorCQkJCQkgICAgKHdhbGtfc3RhdGUsCisJCQkJCSAgICAgcHJldmlvdXNfd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MpOwogCQkJCX0KLQkJCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCQkJCXdhbGtfc3RhdGUtPndhbGtfdHlwZSB8PSBBQ1BJX1dBTEtfTUVUSE9EX1JFU1RBUlQ7CisJCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJCXdhbGtfc3RhdGUtPndhbGtfdHlwZSB8PQorCQkJCQkgICAgQUNQSV9XQUxLX01FVEhPRF9SRVNUQVJUOwogCQkJCX0KLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQkvKiBPbiBlcnJvciwgZGVsZXRlIGFueSByZXR1cm4gb2JqZWN0ICovCiAKLQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjKTsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocHJldmlvdXNfd2Fsa19zdGF0ZS0+CisJCQkJCQkJIHJldHVybl9kZXNjKTsKIAkJCX0KIAkJfQogCkBAIC0xMjY4LDM3ICs2MDksMzYgQEAKIAkJZWxzZSBpZiAocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSB7CiAJCQlpZiAocHJldmlvdXNfd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikgewogCQkJCSoocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSA9Ci0JCQkJCXByZXZpb3VzX3dhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmo7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkgLyogTlVMTCBpZiBubyByZXR1cm4gdmFsdWUgKi8KKwkJCQkgICAgcHJldmlvdXNfd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iajsKKwkJCX0gZWxzZSB7CisJCQkJLyogTlVMTCBpZiBubyByZXR1cm4gdmFsdWUgKi8KIAogCQkJCSoocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSA9Ci0JCQkJCXByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjOworCQkJCSAgICBwcmV2aW91c193YWxrX3N0YXRlLT5yZXR1cm5fZGVzYzsKIAkJCX0KLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCWlmIChwcmV2aW91c193YWxrX3N0YXRlLT5yZXR1cm5fZGVzYykgewogCQkJCS8qIENhbGxlciBkb2Vzbid0IHdhbnQgaXQsIG11c3QgZGVsZXRlIGl0ICovCiAKLQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjKTsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocHJldmlvdXNfd2Fsa19zdGF0ZS0+CisJCQkJCQkJIHJldHVybl9kZXNjKTsKIAkJCX0KIAkJCWlmIChwcmV2aW91c193YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqKSB7CiAJCQkJLyogQ2FsbGVyIGRvZXNuJ3Qgd2FudCBpdCwgbXVzdCBkZWxldGUgaXQgKi8KIAotCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocHJldmlvdXNfd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaik7CisJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHByZXZpb3VzX3dhbGtfc3RhdGUtPgorCQkJCQkJCSBpbXBsaWNpdF9yZXR1cm5fb2JqKTsKIAkJCX0KIAkJfQogCi0JCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUgKHByZXZpb3VzX3dhbGtfc3RhdGUpOworCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHByZXZpb3VzX3dhbGtfc3RhdGUpOwogCX0KIAogCS8qIE5vcm1hbCBleGl0ICovCiAKLQlhY3BpX2V4X3JlbGVhc2VfYWxsX211dGV4ZXMgKHRocmVhZCk7Ci0JYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlLCB0aHJlYWQpKTsKKwlhY3BpX2V4X3JlbGVhc2VfYWxsX211dGV4ZXModGhyZWFkKTsKKwlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKEFDUElfQ0FTVF9QVFIKKwkJCQkgICAgICh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUsIHRocmVhZCkpOwogCWFjcGlfZ2JsX2N1cnJlbnRfd2Fsa19saXN0ID0gcHJldl93YWxrX2xpc3Q7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNzY29wZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3Njb3BlLmMKaW5kZXggOGRjZDFiMS4uMWM5NTNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3Njb3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3Njb3BlLmMKQEAgLTQxLDEzICs0MSwxMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJwc3Njb3BlIikKLQorQUNQSV9NT0RVTEVfTkFNRSgicHNzY29wZSIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjAsMTYgKzU4LDEzIEBACiAgKiBERVNDUklQVElPTjogR2V0IHBhcmVudCBvZiBjdXJyZW50IG9wIGJlaW5nIHBhcnNlZAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZ2V0X3BhcmVudF9zY29wZSAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKQordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZ2V0X3BhcmVudF9zY29wZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZQorCQkJCQkJICAqcGFyc2VyX3N0YXRlKQogewogCiAJcmV0dXJuIChwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5vcCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlCkBAIC04NCwxNyArNzksMTQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11OAotYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpCit1OCBhY3BpX3BzX2hhc19jb21wbGV0ZWRfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKiBwYXJzZXJfc3RhdGUpCiB7CiAKIAlyZXR1cm4gKCh1OCkKLQkJCSgocGFyc2VyX3N0YXRlLT5hbWwgPj0gcGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2VuZCB8fAotCQkJICFwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQpKSk7CisJCSgocGFyc2VyX3N0YXRlLT5hbWwgPj0gcGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2VuZAorCQkgIHx8ICFwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQpKSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19pbml0X3Njb3BlCkBAIC0xMDksMzQgKzEwMSwzMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcHNfaW5pdF9zY29wZSAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnJvb3Rfb3ApCithY3BpX3BzX2luaXRfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKiBwYXJzZXJfc3RhdGUsCisJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICogcm9vdF9vcCkKIHsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzY29wZTsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInBzX2luaXRfc2NvcGUiLCByb290X29wKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgicHNfaW5pdF9zY29wZSIsIHJvb3Rfb3ApOwotCi0KLQlzY29wZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKCk7CisJc2NvcGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CiAJaWYgKCFzY29wZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAotCXNjb3BlLT5jb21tb24uZGF0YV90eXBlICAgICA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1JQU0NPUEU7Ci0Jc2NvcGUtPnBhcnNlX3Njb3BlLm9wICAgICAgID0gcm9vdF9vcDsKKwlzY29wZS0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1JQU0NPUEU7CisJc2NvcGUtPnBhcnNlX3Njb3BlLm9wID0gcm9vdF9vcDsKIAlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50ID0gQUNQSV9WQVJfQVJHUzsKLQlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2VuZCAgPSBwYXJzZXJfc3RhdGUtPmFtbF9lbmQ7Ci0Jc2NvcGUtPnBhcnNlX3Njb3BlLnBrZ19lbmQgID0gcGFyc2VyX3N0YXRlLT5hbWxfZW5kOworCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kID0gcGFyc2VyX3N0YXRlLT5hbWxfZW5kOworCXNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kID0gcGFyc2VyX3N0YXRlLT5hbWxfZW5kOwogCi0JcGFyc2VyX3N0YXRlLT5zY29wZSAgICAgICAgID0gc2NvcGU7Ci0JcGFyc2VyX3N0YXRlLT5zdGFydF9vcCAgICAgID0gcm9vdF9vcDsKKwlwYXJzZXJfc3RhdGUtPnNjb3BlID0gc2NvcGU7CisJcGFyc2VyX3N0YXRlLT5zdGFydF9vcCA9IHJvb3Rfb3A7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfcHVzaF9zY29wZQpAQCAtMTUzLDQ4ICsxNDEsNDIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3BzX3B1c2hfc2NvcGUgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ19hcmdzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX2NvdW50KQorYWNwaV9wc19wdXNoX3Njb3BlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCisJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJICAgdTMyIHJlbWFpbmluZ19hcmdzLCB1MzIgYXJnX2NvdW50KQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnNjb3BlOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc2NvcGU7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigicHNfcHVzaF9zY29wZSIsIG9wKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgicHNfcHVzaF9zY29wZSIsIG9wKTsKLQotCi0Jc2NvcGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlICgpOworCXNjb3BlID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSgpOwogCWlmICghc2NvcGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQlzY29wZS0+Y29tbW9uLmRhdGFfdHlwZSAgICA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1BTQ09QRTsKLQlzY29wZS0+cGFyc2Vfc2NvcGUub3AgICAgICA9IG9wOworCXNjb3BlLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfUFNDT1BFOworCXNjb3BlLT5wYXJzZV9zY29wZS5vcCA9IG9wOwogCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfbGlzdCA9IHJlbWFpbmluZ19hcmdzOwogCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQgPSBhcmdfY291bnQ7CiAJc2NvcGUtPnBhcnNlX3Njb3BlLnBrZ19lbmQgPSBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7CiAKIAkvKiBQdXNoIG9udG8gc2NvcGUgc3RhY2sgKi8KIAotCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlICgmcGFyc2VyX3N0YXRlLT5zY29wZSwgc2NvcGUpOworCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlKCZwYXJzZXJfc3RhdGUtPnNjb3BlLCBzY29wZSk7CiAKIAlpZiAoYXJnX2NvdW50ID09IEFDUElfVkFSX0FSR1MpIHsKIAkJLyogTXVsdGlwbGUgYXJndW1lbnRzICovCiAKIAkJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19lbmQgPSBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIFNpbmdsZSBhcmd1bWVudCAqLwogCi0JCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kID0gQUNQSV9UT19QT0lOVEVSIChBQ1BJX01BWF9QVFIpOworCQlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2VuZCA9IEFDUElfVE9fUE9JTlRFUihBQ1BJX01BWF9QVFIpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19wb3Bfc2NvcGUKQEAgLTIxMiw0OCArMTk0LDQxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3BzX3BvcF9zY29wZSAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKipvcCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmdfbGlzdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmdfY291bnQpCithY3BpX3BzX3BvcF9zY29wZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlLAorCQkgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqb3AsIHUzMiAqIGFyZ19saXN0LCB1MzIgKiBhcmdfY291bnQpCiB7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc2NvcGUgPSBwYXJzZXJfc3RhdGUtPnNjb3BlOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc2NvcGUgPSBwYXJzZXJfc3RhdGUtPnNjb3BlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicHNfcG9wX3Njb3BlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJwc19wb3Bfc2NvcGUiKTsKIAogCS8qIE9ubHkgcG9wIHRoZSBzY29wZSBpZiB0aGVyZSBpcyBpbiBmYWN0IGEgbmV4dCBzY29wZSAqLwogCiAJaWYgKHNjb3BlLT5jb21tb24ubmV4dCkgewotCQlzY29wZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUgKCZwYXJzZXJfc3RhdGUtPnNjb3BlKTsKKwkJc2NvcGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZwYXJzZXJfc3RhdGUtPnNjb3BlKTsKIAogCQkvKiByZXR1cm4gdG8gcGFyc2luZyBwcmV2aW91cyBvcCAqLwogCi0JCSpvcCAgICAgICAgICAgICAgICAgPSBzY29wZS0+cGFyc2Vfc2NvcGUub3A7Ci0JCSphcmdfbGlzdCAgICAgICAgICAgPSBzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2xpc3Q7Ci0JCSphcmdfY291bnQgICAgICAgICAgPSBzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50OworCQkqb3AgPSBzY29wZS0+cGFyc2Vfc2NvcGUub3A7CisJCSphcmdfbGlzdCA9IHNjb3BlLT5wYXJzZV9zY29wZS5hcmdfbGlzdDsKKwkJKmFyZ19jb3VudCA9IHNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQ7CiAJCXBhcnNlcl9zdGF0ZS0+cGtnX2VuZCA9IHNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kOwogCiAJCS8qIEFsbCBkb25lIHdpdGggdGhpcyBzY29wZSBzdGF0ZSBzdHJ1Y3R1cmUgKi8KIAotCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIChzY29wZSk7Ci0JfQotCWVsc2UgeworCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHNjb3BlKTsKKwl9IGVsc2UgewogCQkvKiBlbXB0eSBwYXJzZSBzdGFjaywgcHJlcGFyZSB0byBmZXRjaCBuZXh0IG9wY29kZSAqLwogCi0JCSpvcCAgICAgICA9IE5VTEw7CisJCSpvcCA9IE5VTEw7CiAJCSphcmdfbGlzdCA9IDA7CiAJCSphcmdfY291bnQgPSAwOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAotCQkiUG9wcGVkIE9wICVwIEFyZ3MgJVhcbiIsICpvcCwgKmFyZ19jb3VudCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkgICJQb3BwZWQgT3AgJXAgQXJncyAlWFxuIiwgKm9wLCAqYXJnX2NvdW50KSk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19jbGVhbnVwX3Njb3BlCkBAIC0yNjcsMTUgKzI0MiwxMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfcHNfY2xlYW51cF9zY29wZSAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKQordm9pZCBhY3BpX3BzX2NsZWFudXBfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzY29wZTsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInBzX2NsZWFudXBfc2NvcGUiLCBwYXJzZXJfc3RhdGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInBzX2NsZWFudXBfc2NvcGUiLCBwYXJzZXJfc3RhdGUpOwogCiAJaWYgKCFwYXJzZXJfc3RhdGUpIHsKIAkJcmV0dXJuX1ZPSUQ7CkBAIC0yODQsMTAgKzI1NSw5IEBACiAJLyogRGVsZXRlIGFueXRoaW5nIG9uIHRoZSBzY29wZSBzdGFjayAqLwogCiAJd2hpbGUgKHBhcnNlcl9zdGF0ZS0+c2NvcGUpIHsKLQkJc2NvcGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlICgmcGFyc2VyX3N0YXRlLT5zY29wZSk7Ci0JCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKHNjb3BlKTsKKwkJc2NvcGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZwYXJzZXJfc3RhdGUtPnNjb3BlKTsKKwkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzY29wZSk7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdHJlZS5jCmluZGV4IGQ1YWFmZTcuLmYwZTc1NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3RyZWUuYwpAQCAtNDEsMjMgKzQxLDE4IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInBzdHJlZSIpCitBQ1BJX01PRFVMRV9OQU1FKCJwc3RyZWUiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KICNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgotYWNwaV9wc19nZXRfY2hpbGQgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9jaGlsZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfYXJnCkBAIC03MSwyMSArNjYsMTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCi1hY3BpX3BzX2dldF9hcmcgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnbikKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9hcmcodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLCB1MzIgYXJnbikKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICAgKm9wX2luZm87CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZyA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wX2luZm87CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKiBHZXQgdGhlIGluZm8gc3RydWN0dXJlIGZvciB0aGlzIG9wY29kZSAqLwogCi0Jb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOworCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOwogCWlmIChvcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgewogCQkvKiBJbnZhbGlkIG9wY29kZSBvciBBU0NJSSBjaGFyYWN0ZXIgKi8KIApAQCAtMTExLDcgKzEwMSw2IEBACiAJcmV0dXJuIChhcmcpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfYXBwZW5kX2FyZwpAQCAtMTI2LDE2ICsxMTUsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfcHNfYXBwZW5kX2FyZyAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnKQorYWNwaV9wc19hcHBlbmRfYXJnKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZykKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpwcmV2X2FyZzsKLQljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAgICpvcF9pbmZvOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwcmV2X2FyZzsKKwljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqb3BfaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWlmICghb3ApIHsKIAkJcmV0dXJuOwpAQCAtMTQzLDEyICsxMjgsMTEgQEAKIAogCS8qIEdldCB0aGUgaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoaXMgb3Bjb2RlICovCiAKLQlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wLT5jb21tb24uYW1sX29wY29kZSk7CisJb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wLT5jb21tb24uYW1sX29wY29kZSk7CiAJaWYgKG9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7CiAJCS8qIEludmFsaWQgb3Bjb2RlICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgicHNfYXBwZW5kX2FyZzogSW52YWxpZCBBTUwgT3Bjb2RlOiAweCUyLjJYXG4iLAotCQkJb3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgicHNfYXBwZW5kX2FyZzogSW52YWxpZCBBTUwgT3Bjb2RlOiAweCUyLjJYXG4iLCBvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTcwLDggKzE1NCw3IEBACiAJCQlwcmV2X2FyZyA9IHByZXZfYXJnLT5jb21tb24ubmV4dDsKIAkJfQogCQlwcmV2X2FyZy0+Y29tbW9uLm5leHQgPSBhcmc7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIE5vIGFyZ3VtZW50IGxpc3QsIHRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgYXJndW1lbnQgKi8KIAogCQlvcC0+Y29tbW9uLnZhbHVlLmFyZyA9IGFyZzsKQEAgLTE4NSw3ICsxNjgsNiBAQAogCX0KIH0KIAotCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjAxLDE4ICsxODMsMTQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCi1hY3BpX3BzX2dldF9kZXB0aF9uZXh0ICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcmlnaW4sCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApCit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19nZXRfZGVwdGhfbmV4dCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3JpZ2luLAorCQkJCQkJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQogewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm5leHQgPSBOVUxMOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnBhcmVudDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmc7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm5leHQgPSBOVUxMOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwYXJlbnQ7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWlmICghb3ApIHsKIAkJcmV0dXJuIChOVUxMKTsKQEAgLTIyMCw3ICsxOTgsNyBAQAogCiAJLyogTG9vayBmb3IgYW4gYXJndW1lbnQgb3IgY2hpbGQgKi8KIAotCW5leHQgPSBhY3BpX3BzX2dldF9hcmcgKG9wLCAwKTsKKwluZXh0ID0gYWNwaV9wc19nZXRfYXJnKG9wLCAwKTsKIAlpZiAobmV4dCkgewogCQlyZXR1cm4gKG5leHQpOwogCX0KQEAgLTIzNyw3ICsyMTUsNyBAQAogCXBhcmVudCA9IG9wLT5jb21tb24ucGFyZW50OwogCiAJd2hpbGUgKHBhcmVudCkgewotCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcgKHBhcmVudCwgMCk7CisJCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyhwYXJlbnQsIDApOwogCQl3aGlsZSAoYXJnICYmIChhcmcgIT0gb3JpZ2luKSAmJiAoYXJnICE9IG9wKSkgewogCQkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKIAkJfQpAQCAtMjYxLDcgKzIzOSw2IEBACiAJcmV0dXJuIChuZXh0KTsKIH0KIAotCiAjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjc1LDE1ICsyNTIsMTEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCi1hY3BpX3BzX2dldF9jaGlsZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApCit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19nZXRfY2hpbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQogewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmNoaWxkID0gTlVMTDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqY2hpbGQgPSBOVUxMOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKIAljYXNlIEFNTF9TQ09QRV9PUDoKQEAgLTI5MiwxMCArMjY1LDkgQEAKIAljYXNlIEFNTF9USEVSTUFMX1pPTkVfT1A6CiAJY2FzZSBBTUxfSU5UX01FVEhPRENBTExfT1A6CiAKLQkJY2hpbGQgPSBhY3BpX3BzX2dldF9hcmcgKG9wLCAwKTsKKwkJY2hpbGQgPSBhY3BpX3BzX2dldF9hcmcob3AsIDApOwogCQlicmVhazsKIAotCiAJY2FzZSBBTUxfQlVGRkVSX09QOgogCWNhc2UgQU1MX1BBQ0tBR0VfT1A6CiAJY2FzZSBBTUxfTUVUSE9EX09QOgpAQCAtMzAzLDI0ICsyNzUsMjEgQEAKIAljYXNlIEFNTF9XSElMRV9PUDoKIAljYXNlIEFNTF9GSUVMRF9PUDoKIAotCQljaGlsZCA9IGFjcGlfcHNfZ2V0X2FyZyAob3AsIDEpOworCQljaGlsZCA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9QT1dFUl9SRVNfT1A6CiAJY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6CiAKLQkJY2hpbGQgPSBhY3BpX3BzX2dldF9hcmcgKG9wLCAyKTsKKwkJY2hpbGQgPSBhY3BpX3BzX2dldF9hcmcob3AsIDIpOwogCQlicmVhazsKIAotCiAJY2FzZSBBTUxfUFJPQ0VTU09SX09QOgogCWNhc2UgQU1MX0JBTktfRklFTERfT1A6CiAKLQkJY2hpbGQgPSBhY3BpX3BzX2dldF9hcmcgKG9wLCAzKTsKKwkJY2hpbGQgPSBhY3BpX3BzX2dldF9hcmcob3AsIDMpOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAkJLyogQWxsIG90aGVycyBoYXZlIG5vIGNoaWxkcmVuICovCiAJCWJyZWFrOwpAQCAtMzMwLDUgKzI5OSw0IEBACiB9CiAjZW5kaWYKIAotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCmluZGV4IGExMGY4ODcuLjIwNzVlZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCkBAIC00MSwxNCArNDEsMTIgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicHN1dGlscyIpCi0KK0FDUElfTU9EVUxFX05BTUUoInBzdXRpbHMiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYxLDE1ICs1OSwxMSBAQAogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIFNjb3BlIGFuZCBhc3NvY2lhdGVkIG5hbWVwYXRoIG9wIHdpdGggdGhlIHJvb3QgbmFtZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfY3JlYXRlX3Njb3BlX29wICgKLQl2b2lkKQordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfY3JlYXRlX3Njb3BlX29wKHZvaWQpCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqc2NvcGVfb3A7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnNjb3BlX29wOwogCi0KLQlzY29wZV9vcCA9IGFjcGlfcHNfYWxsb2Nfb3AgKEFNTF9TQ09QRV9PUCk7CisJc2NvcGVfb3AgPSBhY3BpX3BzX2FsbG9jX29wKEFNTF9TQ09QRV9PUCk7CiAJaWYgKCFzY29wZV9vcCkgewogCQlyZXR1cm4gKE5VTEwpOwogCX0KQEAgLTc4LDcgKzcyLDYgQEAKIAlyZXR1cm4gKHNjb3BlX29wKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2luaXRfb3AKQEAgLTkyLDIzICs4NSwxOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfcHNfaW5pdF9vcCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpCit2b2lkIGFjcGlfcHNfaW5pdF9vcCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsIHUxNiBvcGNvZGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCW9wLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfUEFSU0VSOwogCW9wLT5jb21tb24uYW1sX29wY29kZSA9IG9wY29kZTsKIAotCUFDUElfRElTQVNNX09OTFlfTUVNQkVSUyAoQUNQSV9TVFJOQ1BZIChvcC0+Y29tbW9uLmFtbF9vcF9uYW1lLAotCQkJKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcGNvZGUpKS0+bmFtZSwKLQkJCQlzaXplb2YgKG9wLT5jb21tb24uYW1sX29wX25hbWUpKSk7CisJQUNQSV9ESVNBU01fT05MWV9NRU1CRVJTKEFDUElfU1RSTkNQWShvcC0+Y29tbW9uLmFtbF9vcF9uYW1lLAorCQkJCQkgICAgICAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8KKwkJCQkJICAgICAgIChvcGNvZGUpKS0+bmFtZSwKKwkJCQkJICAgICAgc2l6ZW9mKG9wLT5jb21tb24uYW1sX29wX25hbWUpKSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19hbGxvY19vcApAQCAtMTIzLDI5ICsxMTIsMjMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCoKLWFjcGlfcHNfYWxsb2Nfb3AgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKQordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfYWxsb2Nfb3AodTE2IG9wY29kZSkKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcDsKLQljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAgICpvcF9pbmZvOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBBQ1BJX1BBUlNFT1BfR0VORVJJQzsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wX2luZm87CisJdTggZmxhZ3MgPSBBQ1BJX1BBUlNFT1BfR0VORVJJQzsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3Bjb2RlKTsKKwlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3Bjb2RlKTsKIAogCS8qIERldGVybWluZSB0eXBlIG9mIHBhcnNlX29wIHJlcXVpcmVkICovCiAKIAlpZiAob3BfaW5mby0+ZmxhZ3MgJiBBTUxfREVGRVIpIHsKIAkJZmxhZ3MgPSBBQ1BJX1BBUlNFT1BfREVGRVJSRUQ7Ci0JfQotCWVsc2UgaWYgKG9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7CisJfSBlbHNlIGlmIChvcF9pbmZvLT5mbGFncyAmIEFNTF9OQU1FRCkgewogCQlmbGFncyA9IEFDUElfUEFSU0VPUF9OQU1FRDsKLQl9Ci0JZWxzZSBpZiAob3Bjb2RlID09IEFNTF9JTlRfQllURUxJU1RfT1ApIHsKKwl9IGVsc2UgaWYgKG9wY29kZSA9PSBBTUxfSU5UX0JZVEVMSVNUX09QKSB7CiAJCWZsYWdzID0gQUNQSV9QQVJTRU9QX0JZVEVMSVNUOwogCX0KIApAQCAtMTU0LDI1ICsxMzcsMjUgQEAKIAlpZiAoZmxhZ3MgPT0gQUNQSV9QQVJTRU9QX0dFTkVSSUMpIHsKIAkJLyogVGhlIGdlbmVyaWMgb3AgKGRlZmF1bHQpIGlzIGJ5IGZhciB0aGUgbW9zdCBjb21tb24gKDE2IHRvIDEpICovCiAKLQkJb3AgPSBhY3BpX3V0X2FjcXVpcmVfZnJvbV9jYWNoZSAoQUNQSV9NRU1fTElTVF9QU05PREUpOwotCX0KLQllbHNlIHsKKwkJb3AgPSBhY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfZ2JsX3BzX25vZGVfY2FjaGUpOworCQltZW1zZXQob3AsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfY29tbW9uKSk7CisJfSBlbHNlIHsKIAkJLyogRXh0ZW5kZWQgcGFyc2VvcCAqLwogCi0JCW9wID0gYWNwaV91dF9hY3F1aXJlX2Zyb21fY2FjaGUgKEFDUElfTUVNX0xJU1RfUFNOT0RFX0VYVCk7CisJCW9wID0gYWNwaV9vc19hY3F1aXJlX29iamVjdChhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSk7CisJCW1lbXNldChvcCwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX3BhcnNlX29ial9uYW1lZCkpOwogCX0KIAogCS8qIEluaXRpYWxpemUgdGhlIE9wICovCiAKIAlpZiAob3ApIHsKLQkJYWNwaV9wc19pbml0X29wIChvcCwgb3Bjb2RlKTsKKwkJYWNwaV9wc19pbml0X29wKG9wLCBvcGNvZGUpOwogCQlvcC0+Y29tbW9uLmZsYWdzID0gZmxhZ3M7CiAJfQogCiAJcmV0dXJuIChvcCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19mcmVlX29wCkBAIC0xODYsNTMgKzE2OSwyMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfcHNfZnJlZV9vcCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApCit2b2lkIGFjcGlfcHNfZnJlZV9vcCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCiB7Ci0JQUNQSV9GVU5DVElPTl9OQU1FICgicHNfZnJlZV9vcCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJwc19mcmVlX29wIik7CiAKIAlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiRnJlZSByZXR2YWwgb3A6ICVwXG4iLCBvcCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiRnJlZSByZXR2YWwgb3A6ICVwXG4iLAorCQkJCSAgb3ApKTsKIAl9CiAKIAlpZiAob3AtPmNvbW1vbi5mbGFncyAmIEFDUElfUEFSU0VPUF9HRU5FUklDKSB7Ci0JCWFjcGlfdXRfcmVsZWFzZV90b19jYWNoZSAoQUNQSV9NRU1fTElTVF9QU05PREUsIG9wKTsKLQl9Ci0JZWxzZSB7Ci0JCWFjcGlfdXRfcmVsZWFzZV90b19jYWNoZSAoQUNQSV9NRU1fTElTVF9QU05PREVfRVhULCBvcCk7CisJCSh2b2lkKWFjcGlfb3NfcmVsZWFzZV9vYmplY3QoYWNwaV9nYmxfcHNfbm9kZV9jYWNoZSwgb3ApOworCX0gZWxzZSB7CisJCSh2b2lkKWFjcGlfb3NfcmVsZWFzZV9vYmplY3QoYWNwaV9nYmxfcHNfbm9kZV9leHRfY2FjaGUsIG9wKTsKIAl9CiB9CiAKLQotI2lmZGVmIEFDUElfRU5BQkxFX09CSkVDVF9DQUNIRQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19kZWxldGVfcGFyc2VfY2FjaGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IEZyZWUgYWxsIG9iamVjdHMgdGhhdCBhcmUgb24gdGhlIHBhcnNlIGNhY2hlIGxpc3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV9wc19kZWxldGVfcGFyc2VfY2FjaGUgKAotCXZvaWQpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInBzX2RlbGV0ZV9wYXJzZV9jYWNoZSIpOwotCi0KLQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX2NhY2hlIChBQ1BJX01FTV9MSVNUX1BTTk9ERSk7Ci0JYWNwaV91dF9kZWxldGVfZ2VuZXJpY19jYWNoZSAoQUNQSV9NRU1fTElTVF9QU05PREVfRVhUKTsKLQlyZXR1cm5fVk9JRDsKLX0KLSNlbmRpZgotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIFV0aWxpdHkgZnVuY3Rpb25zCkBAIC0yNDEsMzYgKzE5MywyNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLyoKICAqIElzICJjIiBhIG5hbWVzdHJpbmcgbGVhZCBjaGFyYWN0ZXI/CiAgKi8KLXU4Ci1hY3BpX3BzX2lzX2xlYWRpbmdfY2hhciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKQordTggYWNwaV9wc19pc19sZWFkaW5nX2NoYXIodTMyIGMpCiB7CiAJcmV0dXJuICgodTgpIChjID09ICdfJyB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSk7CiB9CiAKLQogLyoKICAqIElzICJjIiBhIG5hbWVzdHJpbmcgcHJlZml4IGNoYXJhY3Rlcj8KICAqLwotdTgKLWFjcGlfcHNfaXNfcHJlZml4X2NoYXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYykKK3U4IGFjcGlfcHNfaXNfcHJlZml4X2NoYXIodTMyIGMpCiB7CiAJcmV0dXJuICgodTgpIChjID09ICdcXCcgfHwgYyA9PSAnXicpKTsKIH0KIAotCiAvKgogICogR2V0IG9wJ3MgbmFtZSAoNC1ieXRlIG5hbWUgc2VnbWVudCkgb3IgMCBpZiB1bm5hbWVkCiAgKi8KICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotdTMyCi1hY3BpX3BzX2dldF9uYW1lICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKK3UzMiBhY3BpX3BzX2dldF9uYW1lKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICogb3ApCiB7CiAKIAkvKiBUaGUgImdlbmVyaWMiIG9iamVjdCBoYXMgbm8gbmFtZSBhc3NvY2lhdGVkIHdpdGggaXQgKi8KQEAgLTI4MywxNiArMjI2LDEyIEBACiAKIAlyZXR1cm4gKG9wLT5uYW1lZC5uYW1lKTsKIH0KLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiAvKgogICogU2V0IG9wJ3MgbmFtZQogICovCi12b2lkCi1hY3BpX3BzX3NldF9uYW1lICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpCit2b2lkIGFjcGlfcHNfc2V0X25hbWUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLCB1MzIgbmFtZSkKIHsKIAogCS8qIFRoZSAiZ2VuZXJpYyIgb2JqZWN0IGhhcyBubyBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdCAqLwpAQCAtMzAzLDQgKzI0MiwzIEBACiAKIAlvcC0+bmFtZWQubmFtZSA9IG5hbWU7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN3YWxrLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzd2Fsay5jCmluZGV4IDlkMjBjYjIuLjA4ZjIzMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN3YWxrLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYwpAQCAtNDEsMTMgKzQxLDExIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInBzd2FsayIpCi0KK0FDUElfTU9EVUxFX05BTUUoInBzd2FsayIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjAsMTggKzU4LDEzIEBACiAgKiBERVNDUklQVElPTjogRGVsZXRlIGEgcG9ydGlvbiBvZiBvciBhbiBlbnRpcmUgcGFyc2UgdHJlZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpzdWJ0cmVlX3Jvb3QpCit2b2lkIGFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnN1YnRyZWVfcm9vdCkKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCA9IHN1YnRyZWVfcm9vdDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpuZXh0ID0gTlVMTDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpwYXJlbnQgPSBOVUxMOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCA9IHN1YnRyZWVfcm9vdDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dCA9IE5VTEw7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcmVudCA9IE5VTEw7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgicHNfZGVsZXRlX3BhcnNlX3RyZWUiLCBzdWJ0cmVlX3Jvb3QpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInBzX2RlbGV0ZV9wYXJzZV90cmVlIiwgc3VidHJlZV9yb290KTsKIAogCS8qIFZpc2l0IGFsbCBub2RlcyBpbiB0aGUgc3VidHJlZSAqLwogCkBAIC04MSw3ICs3NCw3IEBACiAJCWlmIChvcCAhPSBwYXJlbnQpIHsKIAkJCS8qIExvb2sgZm9yIGFuIGFyZ3VtZW50IG9yIGNoaWxkIG9mIHRoZSBjdXJyZW50IG9wICovCiAKLQkJCW5leHQgPSBhY3BpX3BzX2dldF9hcmcgKG9wLCAwKTsKKwkJCW5leHQgPSBhY3BpX3BzX2dldF9hcmcob3AsIDApOwogCQkJaWYgKG5leHQpIHsKIAkJCQkvKiBTdGlsbCBnb2luZyBkb3dud2FyZCBpbiB0cmVlIChPcCBpcyBub3QgY29tcGxldGVkIHlldCkgKi8KIApAQCAtOTUsNyArODgsNyBAQAogCQluZXh0ID0gb3AtPmNvbW1vbi5uZXh0OwogCQlwYXJlbnQgPSBvcC0+Y29tbW9uLnBhcmVudDsKIAotCQlhY3BpX3BzX2ZyZWVfb3AgKG9wKTsKKwkJYWNwaV9wc19mcmVlX29wKG9wKTsKIAogCQkvKiBJZiB3ZSBhcmUgYmFjayB0byB0aGUgc3RhcnRpbmcgcG9pbnQsIHRoZSB3YWxrIGlzIGNvbXBsZXRlLiAqLwogCkBAIC0xMDQsOCArOTcsNyBAQAogCQl9CiAJCWlmIChuZXh0KSB7CiAJCQlvcCA9IG5leHQ7Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlvcCA9IHBhcmVudDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3hmYWNlLmMKaW5kZXggZGJhODkzNi4uNGRjYmQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3hmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3hmYWNlLmMKQEAgLTQxLDI0ICs0MSwyNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLQogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInBzeGZhY2UiKQorQUNQSV9NT0RVTEVfTkFNRSgicHN4ZmFjZSIpCiAKKy8qIExvY2FsIFByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3BzX2V4ZWN1dGVfcGFzcyhzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkCithY3BpX3BzX3VwZGF0ZV9wYXJhbWV0ZXJfbGlzdChzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbywgdTE2IGFjdGlvbik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHN4X2V4ZWN1dGUKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2V4ZWN1dGVfbWV0aG9kCiAgKgogICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKICAqICAgICAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gTWV0aG9kIE5vZGUgdG8gZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgLSBNZXRob2Qgb2JqZWN0CiAgKiAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gUGFyYW1zIGl0c2VsZiBtYXkgYmUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBubyBwYXJhbWV0ZXJzIGFyZSBiZWluZyBwYXNzZWQuCkBAIC02Nyw2ICs3MCw3IEBACiAgKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl90eXBlICAtIFR5cGUgb2YgUGFyYW1ldGVyIGxpc3QKICAqICAgICAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCisgKiAgICAgICAgICAgICAgICAgIHBhc3NfbnVtYmVyICAgICAtIFBhcnNlIG9yIGV4ZWN1dGUgcGFzcwogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC03NCwxNTggKzc4LDY1IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfcHN4X2V4ZWN1dGUgKAotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pCithY3BpX3N0YXR1cyBhY3BpX3BzX2V4ZWN1dGVfbWV0aG9kKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcDsKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInBzX2V4ZWN1dGVfbWV0aG9kIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicHN4X2V4ZWN1dGUiKTsKLQotCi0JLyogVmFsaWRhdGUgdGhlIE5vZGUgYW5kIGdldCB0aGUgYXR0YWNoZWQgb2JqZWN0ICovCisJLyogVmFsaWRhdGUgdGhlIEluZm8gYW5kIG1ldGhvZCBOb2RlICovCiAKIAlpZiAoIWluZm8gfHwgIWluZm8tPm5vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OVUxMX0VOVFJZKTsKLQl9Ci0KLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoaW5mby0+bm9kZSk7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05VTExfT0JKRUNUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfRU5UUlkpOwogCX0KIAogCS8qIEluaXQgZm9yIG5ldyBtZXRob2QsIHdhaXQgb24gY29uY3VycmVuY3kgc2VtYXBob3JlICovCiAKLQlzdGF0dXMgPSBhY3BpX2RzX2JlZ2luX21ldGhvZF9leGVjdXRpb24gKGluZm8tPm5vZGUsIG9ial9kZXNjLCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2RzX2JlZ2luX21ldGhvZF9leGVjdXRpb24oaW5mby0+bm9kZSwgaW5mby0+b2JqX2Rlc2MsIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlpZiAoKGluZm8tPnBhcmFtZXRlcl90eXBlID09IEFDUElfUEFSQU1fQVJHUykgJiYKLQkJKGluZm8tPnBhcmFtZXRlcnMpKSB7Ci0JCS8qCi0JCSAqIFRoZSBjYWxsZXIgIm93bnMiIHRoZSBwYXJhbWV0ZXJzLCBzbyBnaXZlIGVhY2ggb25lIGFuIGV4dHJhCi0JCSAqIHJlZmVyZW5jZQotCQkgKi8KLQkJZm9yIChpID0gMDsgaW5mby0+cGFyYW1ldGVyc1tpXTsgaSsrKSB7Ci0JCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKGluZm8tPnBhcmFtZXRlcnNbaV0pOwotCQl9Ci0JfQorCS8qCisJICogVGhlIGNhbGxlciAib3ducyIgdGhlIHBhcmFtZXRlcnMsIHNvIGdpdmUgZWFjaCBvbmUgYW4gZXh0cmEKKwkgKiByZWZlcmVuY2UKKwkgKi8KKwlhY3BpX3BzX3VwZGF0ZV9wYXJhbWV0ZXJfbGlzdChpbmZvLCBSRUZfSU5DUkVNRU5UKTsKIAogCS8qCiAJICogMSkgUGVyZm9ybSB0aGUgZmlyc3QgcGFzcyBwYXJzZSBvZiB0aGUgbWV0aG9kIHRvIGVudGVyIGFueQotCSAqIG5hbWVkIG9iamVjdHMgdGhhdCBpdCBjcmVhdGVzIGludG8gdGhlIG5hbWVzcGFjZQorCSAqICAgIG5hbWVkIG9iamVjdHMgdGhhdCBpdCBjcmVhdGVzIGludG8gdGhlIG5hbWVzcGFjZQogCSAqLwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAotCQkiKioqKiBCZWdpbiBNZXRob2QgUGFyc2UgKioqKiBFbnRyeT0lcCBvYmo9JXBcbiIsCi0JCWluZm8tPm5vZGUsIG9ial9kZXNjKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCSAgIioqKiogQmVnaW4gTWV0aG9kIFBhcnNlICoqKiogRW50cnk9JXAgb2JqPSVwXG4iLAorCQkJICBpbmZvLT5ub2RlLCBpbmZvLT5vYmpfZGVzYykpOwogCi0JLyogQ3JlYXRlIGFuZCBpbml0IGEgUm9vdCBOb2RlICovCi0KLQlvcCA9IGFjcGlfcHNfY3JlYXRlX3Njb3BlX29wICgpOwotCWlmICghb3ApIHsKLQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQlnb3RvIGNsZWFudXAxOworCWluZm8tPnBhc3NfbnVtYmVyID0gMTsKKwlzdGF0dXMgPSBhY3BpX3BzX2V4ZWN1dGVfcGFzcyhpbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qCi0JICogR2V0IGEgbmV3IG93bmVyX2lkIGZvciBvYmplY3RzIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QuIE5hbWVzcGFjZQotCSAqIG9iamVjdHMgKHN1Y2ggYXMgT3BlcmF0aW9uIFJlZ2lvbnMpIGNhbiBiZSBjcmVhdGVkIGR1cmluZyB0aGUKLQkgKiBmaXJzdCBwYXNzIHBhcnNlLgorCSAqIDIpIEV4ZWN1dGUgdGhlIG1ldGhvZC4gUGVyZm9ybXMgc2Vjb25kIHBhc3MgcGFyc2Ugc2ltdWx0YW5lb3VzbHkKIAkgKi8KLQlvYmpfZGVzYy0+bWV0aG9kLm93bmluZ19pZCA9IGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQgKEFDUElfT1dORVJfVFlQRV9NRVRIT0QpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkgICIqKioqIEJlZ2luIE1ldGhvZCBFeGVjdXRpb24gKioqKiBFbnRyeT0lcCBvYmo9JXBcbiIsCisJCQkgIGluZm8tPm5vZGUsIGluZm8tPm9ial9kZXNjKSk7CiAKLQkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgd2FsayBzdGF0ZSAqLworCWluZm8tPnBhc3NfbnVtYmVyID0gMzsKKwlzdGF0dXMgPSBhY3BpX3BzX2V4ZWN1dGVfcGFzcyhpbmZvKTsKIAotCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlIChvYmpfZGVzYy0+bWV0aG9kLm93bmluZ19pZCwKLQkJCSAgIE5VTEwsIE5VTEwsIE5VTEwpOwotCWlmICghd2Fsa19zdGF0ZSkgewotCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCWdvdG8gY2xlYW51cDI7Ci0JfQorICAgICAgY2xlYW51cDoKKwkvKiBUYWtlIGF3YXkgdGhlIGV4dHJhIHJlZmVyZW5jZSB0aGF0IHdlIGdhdmUgdGhlIHBhcmFtZXRlcnMgYWJvdmUgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2FsayAod2Fsa19zdGF0ZSwgb3AsIGluZm8tPm5vZGUsCi0JCQkgIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAotCQkJICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsIE5VTEwsIDEpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwMzsKLQl9CisJYWNwaV9wc191cGRhdGVfcGFyYW1ldGVyX2xpc3QoaW5mbywgUkVGX0RFQ1JFTUVOVCk7CiAKLQkvKiBQYXJzZSB0aGUgQU1MICovCisJLyogRXhpdCBub3cgaWYgZXJyb3IgYWJvdmUgKi8KIAotCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfYW1sICh3YWxrX3N0YXRlKTsKLQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlIChvcCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXAxOyAvKiBXYWxrIHN0YXRlIGlzIGFscmVhZHkgZGVsZXRlZCAqLwotCX0KLQotCS8qCi0JICogMikgRXhlY3V0ZSB0aGUgbWV0aG9kLiAgUGVyZm9ybXMgc2Vjb25kIHBhc3MgcGFyc2Ugc2ltdWx0YW5lb3VzbHkKLQkgKi8KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwKLQkJIioqKiogQmVnaW4gTWV0aG9kIEV4ZWN1dGlvbiAqKioqIEVudHJ5PSVwIG9iaj0lcFxuIiwKLQkJaW5mby0+bm9kZSwgb2JqX2Rlc2MpKTsKLQotCS8qIENyZWF0ZSBhbmQgaW5pdCBhIFJvb3QgTm9kZSAqLwotCi0Jb3AgPSBhY3BpX3BzX2NyZWF0ZV9zY29wZV9vcCAoKTsKLQlpZiAoIW9wKSB7Ci0JCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJZ290byBjbGVhbnVwMTsKLQl9Ci0KLQkvKiBJbml0IG5ldyBvcCB3aXRoIHRoZSBtZXRob2QgbmFtZSBhbmQgcG9pbnRlciBiYWNrIHRvIHRoZSBOUyBub2RlICovCi0KLQlhY3BpX3BzX3NldF9uYW1lIChvcCwgaW5mby0+bm9kZS0+bmFtZS5pbnRlZ2VyKTsKLQlvcC0+Y29tbW9uLm5vZGUgPSBpbmZvLT5ub2RlOwotCi0JLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHdhbGsgc3RhdGUgKi8KLQotCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlICgwLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlpZiAoIXdhbGtfc3RhdGUpIHsKLQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQlnb3RvIGNsZWFudXAyOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2FsayAod2Fsa19zdGF0ZSwgb3AsIGluZm8tPm5vZGUsCi0JCQkgIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAotCQkJICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsIGluZm8sIDMpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwMzsKLQl9Ci0KLQkvKiBUaGUgd2FsayBvZiB0aGUgcGFyc2UgdHJlZSBpcyB3aGVyZSB3ZSBhY3R1YWxseSBleGVjdXRlIHRoZSBtZXRob2QgKi8KLQotCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfYW1sICh3YWxrX3N0YXRlKTsKLQlnb3RvIGNsZWFudXAyOyAvKiBXYWxrIHN0YXRlIGFscmVhZHkgZGVsZXRlZCAqLwotCi0KLWNsZWFudXAzOgotCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUgKHdhbGtfc3RhdGUpOwotCi1jbGVhbnVwMjoKLQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlIChvcCk7Ci0KLWNsZWFudXAxOgotCWlmICgoaW5mby0+cGFyYW1ldGVyX3R5cGUgPT0gQUNQSV9QQVJBTV9BUkdTKSAmJgotCQkoaW5mby0+cGFyYW1ldGVycykpIHsKLQkJLyogVGFrZSBhd2F5IHRoZSBleHRyYSByZWZlcmVuY2UgdGhhdCB3ZSBnYXZlIHRoZSBwYXJhbWV0ZXJzIGFib3ZlICovCi0KLQkJZm9yIChpID0gMDsgaW5mby0+cGFyYW1ldGVyc1tpXTsgaSsrKSB7Ci0JCQkvKiBJZ25vcmUgZXJyb3JzLCBqdXN0IGRvIHRoZW0gYWxsICovCi0KLQkJCSh2b2lkKSBhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlICgKLQkJCQkJIGluZm8tPnBhcmFtZXRlcnNbaV0sIFJFRl9ERUNSRU1FTlQpOwotCQl9Ci0JfQotCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCkBAIC0yMzMsMTQgKzE0NCwxMDQgQEAKIAkgKiBhIGNvbnRyb2wgZXhjZXB0aW9uIGNvZGUKIAkgKi8KIAlpZiAoaW5mby0+cmV0dXJuX29iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwgIk1ldGhvZCByZXR1cm5lZCBvYmpfZGVzYz0lcFxuIiwKLQkJCWluZm8tPnJldHVybl9vYmplY3QpKTsKLQkJQUNQSV9EVU1QX1NUQUNLX0VOVFJZIChpbmZvLT5yZXR1cm5fb2JqZWN0KTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCQkgICJNZXRob2QgcmV0dXJuZWQgb2JqX2Rlc2M9JXBcbiIsCisJCQkJICBpbmZvLT5yZXR1cm5fb2JqZWN0KSk7CisJCUFDUElfRFVNUF9TVEFDS19FTlRSWShpbmZvLT5yZXR1cm5fb2JqZWN0KTsKIAogCQlzdGF0dXMgPSBBRV9DVFJMX1JFVFVSTl9WQUxVRTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfdXBkYXRlX3BhcmFtZXRlcl9saXN0CisgKgorICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIFNlZSBzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVc2VkOiBwYXJhbWV0ZXJfdHlwZSBhbmQgUGFyYW1ldGVycykKKyAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBBZGQgb3IgUmVtb3ZlIHJlZmVyZW5jZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVXBkYXRlIHJlZmVyZW5jZSBjb3VudCBvbiBhbGwgbWV0aG9kIHBhcmFtZXRlciBvYmplY3RzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorc3RhdGljIHZvaWQKK2FjcGlfcHNfdXBkYXRlX3BhcmFtZXRlcl9saXN0KHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvLCB1MTYgYWN0aW9uKQoreworCWFjcGlfbmF0aXZlX3VpbnQgaTsKKworCWlmICgoaW5mby0+cGFyYW1ldGVyX3R5cGUgPT0gQUNQSV9QQVJBTV9BUkdTKSAmJiAoaW5mby0+cGFyYW1ldGVycykpIHsKKwkJLyogVXBkYXRlIHJlZmVyZW5jZSBjb3VudCBmb3IgZWFjaCBwYXJhbWV0ZXIgKi8KKworCQlmb3IgKGkgPSAwOyBpbmZvLT5wYXJhbWV0ZXJzW2ldOyBpKyspIHsKKwkJCS8qIElnbm9yZSBlcnJvcnMsIGp1c3QgZG8gdGhlbSBhbGwgKi8KKworCQkJKHZvaWQpYWNwaV91dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZShpbmZvLT4KKwkJCQkJCQkgICAgICBwYXJhbWV0ZXJzW2ldLAorCQkJCQkJCSAgICAgIGFjdGlvbik7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZXhlY3V0ZV9wYXNzCisgKgorICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIFNlZSBzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVc2VkOiBwYXNzX251bWJlciwgTm9kZSwgYW5kIG9ial9kZXNjKQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU2luZ2xlIEFNTCBwYXNzOiBQYXJzZSBvciBFeGVjdXRlIGEgY29udHJvbCBtZXRob2QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX3Bhc3Moc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicHNfZXhlY3V0ZV9wYXNzIik7CisKKwkvKiBDcmVhdGUgYW5kIGluaXQgYSBSb290IE5vZGUgKi8KKworCW9wID0gYWNwaV9wc19jcmVhdGVfc2NvcGVfb3AoKTsKKwlpZiAoIW9wKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyB3YWxrIHN0YXRlICovCisKKwl3YWxrX3N0YXRlID0KKwkgICAgYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZShpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkLCBOVUxMLAorCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCWlmICghd2Fsa19zdGF0ZSkgeworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIGluZm8tPm5vZGUsCisJCQkJICAgICAgIGluZm8tPm9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAorCQkJCSAgICAgICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsCisJCQkJICAgICAgIGluZm8tPnBhc3NfbnVtYmVyID09IDEgPyBOVUxMIDogaW5mbywKKwkJCQkgICAgICAgaW5mby0+cGFzc19udW1iZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHdhbGtfc3RhdGUpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogUGFyc2UgdGhlIEFNTCAqLworCisJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwod2Fsa19zdGF0ZSk7CisKKwkvKiBXYWxrIHN0YXRlIHdhcyBkZWxldGVkIGJ5IHBhcnNlX2FtbCAqLworCisgICAgICBjbGVhbnVwOgorCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUob3ApOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2JpbmQuYwppbmRleCA1MTQ4ZjNjLi4yYTcxOGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX2JpbmQuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2JpbmQuYwpAQCAtMzUsMjIgKzM1LDE3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BDSV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgicGNpX2JpbmQiKQorQUNQSV9NT0RVTEVfTkFNRSgicGNpX2JpbmQiKQogCiBzdHJ1Y3QgYWNwaV9wY2lfZGF0YSB7Ci0Jc3RydWN0IGFjcGlfcGNpX2lkCWlkOwotCXN0cnVjdCBwY2lfYnVzCQkqYnVzOwotCXN0cnVjdCBwY2lfZGV2CQkqZGV2OworCXN0cnVjdCBhY3BpX3BjaV9pZCBpZDsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiB9OwogCi0KLXZvaWQKLWFjcGlfcGNpX2RhdGFfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQl1MzIJCQlmdW5jdGlvbiwKLQl2b2lkCQkJKmNvbnRleHQpCitzdGF0aWMgdm9pZCBhY3BpX3BjaV9kYXRhX2hhbmRsZXIoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZnVuY3Rpb24sCisJCQkJICB2b2lkICpjb250ZXh0KQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2RhdGFfaGFuZGxlciIpOwogCkBAIC01OSw3ICs1NCw2IEBACiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqCiAgKiBhY3BpX2dldF9wY2lfaWQKICAqIC0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjcsMTUgKzYxLDEyIEBACiAgKiB0byByZXNvbHZlIFBDSSBpbmZvcm1hdGlvbiBmb3IgQUNQSS1QQ0kgZGV2aWNlcyBkZWZpbmVkIGluIHRoZSBuYW1lc3BhY2UuCiAgKiBUaGlzIHR5cGljYWxseSBvY2N1cnMgd2hlbiByZXNvbHZpbmcgUENJIG9wZXJhdGlvbiByZWdpb24gaW5mb3JtYXRpb24uCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9wY2lfaWQgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0Jc3RydWN0IGFjcGlfcGNpX2lkCSppZCkKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3BjaV9pZChhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX3BjaV9pZCAqaWQpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOwotCXN0cnVjdCBhY3BpX3BjaV9kYXRhCSpkYXRhID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfcGNpX2RhdGEgKmRhdGEgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfcGNpX2lkIik7CiAKQEAgLTg0LDUyICs3NSw1MCBAQAogCiAJcmVzdWx0ID0gYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCi0JCQkiSW52YWxpZCBBQ1BJIEJ1cyBjb250ZXh0IGZvciBkZXZpY2UgJXNcbiIsCi0JCQlhY3BpX2RldmljZV9iaWQoZGV2aWNlKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkludmFsaWQgQUNQSSBCdXMgY29udGV4dCBmb3IgZGV2aWNlICVzXG4iLAorCQkJCSAgYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9nZXRfZGF0YShoYW5kbGUsIGFjcGlfcGNpX2RhdGFfaGFuZGxlciwgKHZvaWQqKikgJmRhdGEpOworCXN0YXR1cyA9IGFjcGlfZ2V0X2RhdGEoaGFuZGxlLCBhY3BpX3BjaV9kYXRhX2hhbmRsZXIsICh2b2lkICoqKSZkYXRhKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIWRhdGEpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCi0JCQkiSW52YWxpZCBBQ1BJLVBDSSBjb250ZXh0IGZvciBkZXZpY2UgJXNcbiIsCi0JCQlhY3BpX2RldmljZV9iaWQoZGV2aWNlKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkludmFsaWQgQUNQSS1QQ0kgY29udGV4dCBmb3IgZGV2aWNlICVzXG4iLAorCQkJCSAgYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJKmlkID0gZGF0YS0+aWQ7Ci0JCi0JLyoKLQlpZC0+c2VnbWVudCA9IGRhdGEtPmlkLnNlZ21lbnQ7Ci0JaWQtPmJ1cyA9IGRhdGEtPmlkLmJ1czsKLQlpZC0+ZGV2aWNlID0gZGF0YS0+aWQuZGV2aWNlOwotCWlkLT5mdW5jdGlvbiA9IGRhdGEtPmlkLmZ1bmN0aW9uOwotCSovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sIAotCQkiRGV2aWNlICVzIGhhcyBQQ0kgYWRkcmVzcyAlMDJ4OiUwMng6JTAyeC4lMDJ4XG4iLCAKLQkJYWNwaV9kZXZpY2VfYmlkKGRldmljZSksIGlkLT5zZWdtZW50LCBpZC0+YnVzLCAKLQkJaWQtPmRldmljZSwgaWQtPmZ1bmN0aW9uKSk7CisJLyoKKwkgICBpZC0+c2VnbWVudCA9IGRhdGEtPmlkLnNlZ21lbnQ7CisJICAgaWQtPmJ1cyA9IGRhdGEtPmlkLmJ1czsKKwkgICBpZC0+ZGV2aWNlID0gZGF0YS0+aWQuZGV2aWNlOworCSAgIGlkLT5mdW5jdGlvbiA9IGRhdGEtPmlkLmZ1bmN0aW9uOworCSAqLworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiRGV2aWNlICVzIGhhcyBQQ0kgYWRkcmVzcyAlMDJ4OiUwMng6JTAyeC4lMDJ4XG4iLAorCQkJICBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwgaWQtPnNlZ21lbnQsIGlkLT5idXMsCisJCQkgIGlkLT5kZXZpY2UsIGlkLT5mdW5jdGlvbikpOwogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX2dldF9wY2lfaWQpOwogCi0JCi1pbnQKLWFjcGlfcGNpX2JpbmQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQoraW50IGFjcGlfcGNpX2JpbmQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfcGNpX2RhdGEJKmRhdGEgPSBOVUxMOwotCXN0cnVjdCBhY3BpX3BjaV9kYXRhCSpwZGF0YSA9IE5VTEw7Ci0JY2hhcgkJCSpwYXRobmFtZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHswLCBOVUxMfTsKLQlhY3BpX2hhbmRsZQkJaGFuZGxlID0gTlVMTDsKLQlzdHJ1Y3QgcGNpX2RldgkJKmRldjsKLQlzdHJ1Y3QgcGNpX2J1cyAJCSpidXM7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfcGNpX2RhdGEgKmRhdGEgPSBOVUxMOworCXN0cnVjdCBhY3BpX3BjaV9kYXRhICpwZGF0YSA9IE5VTEw7CisJY2hhciAqcGF0aG5hbWUgPSBOVUxMOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IDAsIE5VTEwgfTsKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBOVUxMOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2JpbmQiKTsKIApAQCAtMTM3LDM0ICsxMjYsMzQgQEAKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCiAJcGF0aG5hbWUgPSBrbWFsbG9jKEFDUElfUEFUSE5BTUVfTUFYLCBHRlBfS0VSTkVMKTsKLQlpZighcGF0aG5hbWUpCisJaWYgKCFwYXRobmFtZSkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9NRU0pOwogCW1lbXNldChwYXRobmFtZSwgMCwgQUNQSV9QQVRITkFNRV9NQVgpOwogCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX1BBVEhOQU1FX01BWDsKIAlidWZmZXIucG9pbnRlciA9IHBhdGhuYW1lOwogCiAJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3BjaV9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkYXRhKXsKLQkJa2ZyZWUgKHBhdGhuYW1lKTsKKwlpZiAoIWRhdGEpIHsKKwkJa2ZyZWUocGF0aG5hbWUpOwogCQlyZXR1cm5fVkFMVUUoLUVOT01FTSk7CiAJfQogCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfcGNpX2RhdGEpKTsKIAogCWFjcGlfZ2V0X25hbWUoZGV2aWNlLT5oYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwgJmJ1ZmZlcik7Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQmluZGluZyBQQ0kgZGV2aWNlIFslc10uLi5cbiIsIAotCQlwYXRobmFtZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkJpbmRpbmcgUENJIGRldmljZSBbJXNdLi4uXG4iLAorCQkJICBwYXRobmFtZSkpOwogCiAJLyogCiAJICogU2VnbWVudCAmIEJ1cwogCSAqIC0tLS0tLS0tLS0tLS0KIAkgKiBUaGVzZSBhcmUgb2J0YWluZWQgdmlhIHRoZSBwYXJlbnQgZGV2aWNlJ3MgQUNQSS1QQ0kgY29udGV4dC4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2dldF9kYXRhKGRldmljZS0+cGFyZW50LT5oYW5kbGUsIGFjcGlfcGNpX2RhdGFfaGFuZGxlciwgCi0JCSh2b2lkKiopICZwZGF0YSk7CisJc3RhdHVzID0gYWNwaV9nZXRfZGF0YShkZXZpY2UtPnBhcmVudC0+aGFuZGxlLCBhY3BpX3BjaV9kYXRhX2hhbmRsZXIsCisJCQkgICAgICAgKHZvaWQgKiopJnBkYXRhKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIXBkYXRhIHx8ICFwZGF0YS0+YnVzKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIAotCQkJIkludmFsaWQgQUNQSS1QQ0kgY29udGV4dCBmb3IgcGFyZW50IGRldmljZSAlc1xuIiwKLQkJCWFjcGlfZGV2aWNlX2JpZChkZXZpY2UtPnBhcmVudCkpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJJbnZhbGlkIEFDUEktUENJIGNvbnRleHQgZm9yIHBhcmVudCBkZXZpY2UgJXNcbiIsCisJCQkJICBhY3BpX2RldmljZV9iaWQoZGV2aWNlLT5wYXJlbnQpKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZW5kOwogCX0KQEAgLTE4MSw4ICsxNzAsOCBAQAogCWRhdGEtPmlkLmZ1bmN0aW9uID0gZGV2aWNlLT5wbnAuYnVzX2FkZHJlc3MgJiAweEZGRkY7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICIuLi50byAlMDJ4OiUwMng6JTAyeC4lMDJ4XG4iLAotCQlkYXRhLT5pZC5zZWdtZW50LCBkYXRhLT5pZC5idXMsIGRhdGEtPmlkLmRldmljZSwgCi0JCWRhdGEtPmlkLmZ1bmN0aW9uKSk7CisJCQkgIGRhdGEtPmlkLnNlZ21lbnQsIGRhdGEtPmlkLmJ1cywgZGF0YS0+aWQuZGV2aWNlLAorCQkJICBkYXRhLT5pZC5mdW5jdGlvbikpOwogCiAJLyoKIAkgKiBUQkQ6IFN1cHBvcnQgc2xvdCBkZXZpY2VzIChlLmcuIGZ1bmN0aW9uPTB4RkZGRikuCkBAIC0yMDIsMjUgKzE5MSwyNSBAQAogCWlmIChidXMpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCQlpZiAoZGV2LT5kZXZmbiA9PSBQQ0lfREVWRk4oZGF0YS0+aWQuZGV2aWNlLAotCQkJCQkJZGF0YS0+aWQuZnVuY3Rpb24pKSB7CisJCQkJCQkgICAgZGF0YS0+aWQuZnVuY3Rpb24pKSB7CiAJCQkJZGF0YS0+ZGV2ID0gZGV2OwogCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJfQogCWlmICghZGF0YS0+ZGV2KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgCi0JCQkiRGV2aWNlICUwMng6JTAyeDolMDJ4LiUwMnggbm90IHByZXNlbnQgaW4gUENJIG5hbWVzcGFjZVxuIiwKLQkJCWRhdGEtPmlkLnNlZ21lbnQsIGRhdGEtPmlkLmJ1cywgCi0JCQlkYXRhLT5pZC5kZXZpY2UsIGRhdGEtPmlkLmZ1bmN0aW9uKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJEZXZpY2UgJTAyeDolMDJ4OiUwMnguJTAyeCBub3QgcHJlc2VudCBpbiBQQ0kgbmFtZXNwYWNlXG4iLAorCQkJCSAgZGF0YS0+aWQuc2VnbWVudCwgZGF0YS0+aWQuYnVzLAorCQkJCSAgZGF0YS0+aWQuZGV2aWNlLCBkYXRhLT5pZC5mdW5jdGlvbikpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CiAJaWYgKCFkYXRhLT5kZXYtPmJ1cykgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAKLQkJCSJEZXZpY2UgJTAyeDolMDJ4OiUwMnguJTAyeCBoYXMgaW52YWxpZCAnYnVzJyBmaWVsZFxuIiwKLQkJCWRhdGEtPmlkLnNlZ21lbnQsIGRhdGEtPmlkLmJ1cywgCi0JCQlkYXRhLT5pZC5kZXZpY2UsIGRhdGEtPmlkLmZ1bmN0aW9uKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiRGV2aWNlICUwMng6JTAyeDolMDJ4LiUwMnggaGFzIGludmFsaWQgJ2J1cycgZmllbGRcbiIsCisJCQkJICBkYXRhLT5pZC5zZWdtZW50LCBkYXRhLT5pZC5idXMsCisJCQkJICBkYXRhLT5pZC5kZXZpY2UsIGRhdGEtPmlkLmZ1bmN0aW9uKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZW5kOwogCX0KQEAgLTIzMiwxMCArMjIxLDEwIEBACiAJICogZmFjaWxpdGF0ZSBjYWxsYmFja3MgZm9yIGFsbCBvZiBpdHMgY2hpbGRyZW4uCiAJICovCiAJaWYgKGRhdGEtPmRldi0+c3Vib3JkaW5hdGUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAKLQkJCSJEZXZpY2UgJTAyeDolMDJ4OiUwMnguJTAyeCBpcyBhIFBDSSBicmlkZ2VcbiIsCi0JCQlkYXRhLT5pZC5zZWdtZW50LCBkYXRhLT5pZC5idXMsIAotCQkJZGF0YS0+aWQuZGV2aWNlLCBkYXRhLT5pZC5mdW5jdGlvbikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiRGV2aWNlICUwMng6JTAyeDolMDJ4LiUwMnggaXMgYSBQQ0kgYnJpZGdlXG4iLAorCQkJCSAgZGF0YS0+aWQuc2VnbWVudCwgZGF0YS0+aWQuYnVzLAorCQkJCSAgZGF0YS0+aWQuZGV2aWNlLCBkYXRhLT5pZC5mdW5jdGlvbikpOwogCQlkYXRhLT5idXMgPSBkYXRhLT5kZXYtPnN1Ym9yZGluYXRlOwogCQlkZXZpY2UtPm9wcy5iaW5kID0gYWNwaV9wY2lfYmluZDsKIAkJZGV2aWNlLT5vcHMudW5iaW5kID0gYWNwaV9wY2lfdW5iaW5kOwpAQCAtMjQ5LDggKzIzOCw4IEBACiAJc3RhdHVzID0gYWNwaV9hdHRhY2hfZGF0YShkZXZpY2UtPmhhbmRsZSwgYWNwaV9wY2lfZGF0YV9oYW5kbGVyLCBkYXRhKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gYXR0YWNoIEFDUEktUENJIGNvbnRleHQgdG8gZGV2aWNlICVzXG4iLAotCQkJYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpKTsKKwkJCQkgICJVbmFibGUgdG8gYXR0YWNoIEFDUEktUENJIGNvbnRleHQgdG8gZGV2aWNlICVzXG4iLAorCQkJCSAgYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlbmQ7CiAJfQpAQCAtMjY3LDE1ICsyNTYsMTUgQEAKIAkgKi8KIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19QUlQsICZoYW5kbGUpOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlpZiAoZGF0YS0+YnVzKQkJCQkgICAgLyogUENJLVBDSSBicmlkZ2UgKi8KLQkJCWFjcGlfcGNpX2lycV9hZGRfcHJ0KGRldmljZS0+aGFuZGxlLCBkYXRhLT5pZC5zZWdtZW50LCAKLQkJCQlkYXRhLT5idXMtPm51bWJlcik7Ci0JCWVsc2UJCQkJICAgICAvKiBub24tYnJpZGdlIFBDSSBkZXZpY2UgKi8KKwkJaWYgKGRhdGEtPmJ1cykJLyogUENJLVBDSSBicmlkZ2UgKi8KIAkJCWFjcGlfcGNpX2lycV9hZGRfcHJ0KGRldmljZS0+aGFuZGxlLCBkYXRhLT5pZC5zZWdtZW50LAotCQkJCWRhdGEtPmlkLmJ1cyk7CisJCQkJCSAgICAgZGF0YS0+YnVzLT5udW1iZXIpOworCQllbHNlCQkvKiBub24tYnJpZGdlIFBDSSBkZXZpY2UgKi8KKwkJCWFjcGlfcGNpX2lycV9hZGRfcHJ0KGRldmljZS0+aGFuZGxlLCBkYXRhLT5pZC5zZWdtZW50LAorCQkJCQkgICAgIGRhdGEtPmlkLmJ1cyk7CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAJa2ZyZWUocGF0aG5hbWUpOwogCWlmIChyZXN1bHQpCiAJCWtmcmVlKGRhdGEpOwpAQCAtMjgzLDIyICsyNzIsMjEgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotaW50IGFjcGlfcGNpX3VuYmluZCgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgICAgICAqZGV2aWNlKQoraW50IGFjcGlfcGNpX3VuYmluZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX3BjaV9kYXRhICAgICpkYXRhID0gTlVMTDsKLQljaGFyICAgICAgICAgICAgICAgICAgICAqcGF0aG5hbWUgPSBOVUxMOwotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgIGJ1ZmZlciA9IHswLCBOVUxMfTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9wY2lfZGF0YSAqZGF0YSA9IE5VTEw7CisJY2hhciAqcGF0aG5hbWUgPSBOVUxMOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IDAsIE5VTEwgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX3VuYmluZCIpOwogCiAJaWYgKCFkZXZpY2UgfHwgIWRldmljZS0+cGFyZW50KQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlwYXRobmFtZSA9IChjaGFyICopIGttYWxsb2MoQUNQSV9QQVRITkFNRV9NQVgsIEdGUF9LRVJORUwpOwotCWlmKCFwYXRobmFtZSkKKwlwYXRobmFtZSA9IChjaGFyICopa21hbGxvYyhBQ1BJX1BBVEhOQU1FX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXRobmFtZSkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9NRU0pOwogCW1lbXNldChwYXRobmFtZSwgMCwgQUNQSV9QQVRITkFNRV9NQVgpOwogCkBAIC0zMDYsMTQgKzI5NCwxNiBAQAogCWJ1ZmZlci5wb2ludGVyID0gcGF0aG5hbWU7CiAJYWNwaV9nZXRfbmFtZShkZXZpY2UtPmhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJVbmJpbmRpbmcgUENJIGRldmljZSBbJXNdLi4uXG4iLAotCQlwYXRobmFtZSkpOworCQkJICBwYXRobmFtZSkpOwogCWtmcmVlKHBhdGhuYW1lKTsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2RhdGEoZGV2aWNlLT5oYW5kbGUsIGFjcGlfcGNpX2RhdGFfaGFuZGxlciwgKHZvaWQqKikmZGF0YSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfZGF0YShkZXZpY2UtPmhhbmRsZSwgYWNwaV9wY2lfZGF0YV9oYW5kbGVyLAorCQkJICAodm9pZCAqKikmZGF0YSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGdldCBkYXRhIGZyb20gZGV2aWNlICVzXG4iLAotCQkJYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpKTsKKwkJCQkgICJVbmFibGUgdG8gZ2V0IGRhdGEgZnJvbSBkZXZpY2UgJXNcbiIsCisJCQkJICBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSkpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0zMjEsOCArMzExLDggQEAKIAlzdGF0dXMgPSBhY3BpX2RldGFjaF9kYXRhKGRldmljZS0+aGFuZGxlLCBhY3BpX3BjaV9kYXRhX2hhbmRsZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBkZXRhY2ggZGF0YSBmcm9tIGRldmljZSAlc1xuIiwKLQkJCWFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKSk7CisJCQkJICAiVW5hYmxlIHRvIGRldGFjaCBkYXRhIGZyb20gZGV2aWNlICVzXG4iLAorCQkJCSAgYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlbmQ7CiAJfQpAQCAtMzMxLDM5ICszMjEsMzcgQEAKIAl9CiAJa2ZyZWUoZGF0YSk7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotaW50IAotYWNwaV9wY2lfYmluZF9yb290ICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlzdHJ1Y3QgYWNwaV9wY2lfaWQJKmlkLAotCXN0cnVjdCBwY2lfYnVzCQkqYnVzKSAKK2ludAorYWNwaV9wY2lfYmluZF9yb290KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAorCQkgICBzdHJ1Y3QgYWNwaV9wY2lfaWQgKmlkLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX3BjaV9kYXRhCSpkYXRhID0gTlVMTDsKLQljaGFyCQkJKnBhdGhuYW1lID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0gezAsIE5VTEx9OworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX3BjaV9kYXRhICpkYXRhID0gTlVMTDsKKwljaGFyICpwYXRobmFtZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgMCwgTlVMTCB9OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfYmluZF9yb290Iik7CiAKIAlwYXRobmFtZSA9IChjaGFyICopa21hbGxvYyhBQ1BJX1BBVEhOQU1FX01BWCwgR0ZQX0tFUk5FTCk7Ci0JaWYoIXBhdGhuYW1lKQorCWlmICghcGF0aG5hbWUpCiAJCXJldHVybl9WQUxVRSgtRU5PTUVNKTsKIAltZW1zZXQocGF0aG5hbWUsIDAsIEFDUElfUEFUSE5BTUVfTUFYKTsKIAogCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX1BBVEhOQU1FX01BWDsKIAlidWZmZXIucG9pbnRlciA9IHBhdGhuYW1lOwogCi0JaWYgKCFkZXZpY2UgfHwgIWlkIHx8ICFidXMpeworCWlmICghZGV2aWNlIHx8ICFpZCB8fCAhYnVzKSB7CiAJCWtmcmVlKHBhdGhuYW1lKTsKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCX0KIAogCWRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9wY2lfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghZGF0YSl7CisJaWYgKCFkYXRhKSB7CiAJCWtmcmVlKHBhdGhuYW1lKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9NRU0pOwogCX0KQEAgLTM3NywxOCArMzY1LDE4IEBACiAJYWNwaV9nZXRfbmFtZShkZXZpY2UtPmhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkJpbmRpbmcgUENJIHJvb3QgYnJpZGdlIFslc10gdG8gIgotCQkiJTAyeDolMDJ4XG4iLCBwYXRobmFtZSwgaWQtPnNlZ21lbnQsIGlkLT5idXMpKTsKKwkJCSAgIiUwMng6JTAyeFxuIiwgcGF0aG5hbWUsIGlkLT5zZWdtZW50LCBpZC0+YnVzKSk7CiAKIAlzdGF0dXMgPSBhY3BpX2F0dGFjaF9kYXRhKGRldmljZS0+aGFuZGxlLCBhY3BpX3BjaV9kYXRhX2hhbmRsZXIsIGRhdGEpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBhdHRhY2ggQUNQSS1QQ0kgY29udGV4dCB0byBkZXZpY2UgJXNcbiIsCi0JCQlwYXRobmFtZSkpOworCQkJCSAgIlVuYWJsZSB0byBhdHRhY2ggQUNQSS1QQ0kgY29udGV4dCB0byBkZXZpY2UgJXNcbiIsCisJCQkJICBwYXRobmFtZSkpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlrZnJlZShwYXRobmFtZSk7CiAJaWYgKHJlc3VsdCAhPSAwKQogCQlrZnJlZShkYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCmluZGV4IGJiOTczZDIuLjA5NTY3YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9pcnEuYwpAQCAtMzgsMjYgKzM4LDIyIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BDSV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgicGNpX2lycSIpCitBQ1BJX01PRFVMRV9OQU1FKCJwY2lfaXJxIikKIAotc3RhdGljIHN0cnVjdCBhY3BpX3BydF9saXN0CWFjcGlfcHJ0Oworc3RhdGljIHN0cnVjdCBhY3BpX3BydF9saXN0IGFjcGlfcHJ0Owogc3RhdGljIERFRklORV9TUElOTE9DSyhhY3BpX3BydF9sb2NrKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0kgSVJRIFJvdXRpbmcgVGFibGUgKFBSVCkgU3VwcG9ydAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHN0cnVjdCBhY3BpX3BydF9lbnRyeSAqCi1hY3BpX3BjaV9pcnFfZmluZF9wcnRfZW50cnkgKAotCWludAkJCXNlZ21lbnQsCi0JaW50CQkJYnVzLAotCWludAkJCWRldmljZSwKLQlpbnQJCQlwaW4pCitzdGF0aWMgc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICphY3BpX3BjaV9pcnFfZmluZF9wcnRfZW50cnkoaW50IHNlZ21lbnQsCisJCQkJCQkJICBpbnQgYnVzLAorCQkJCQkJCSAgaW50IGRldmljZSwgaW50IHBpbikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCSpub2RlID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9wcnRfZW50cnkJKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2lycV9maW5kX3BydF9lbnRyeSIpOwogCkBAIC03MiwxMCArNjgsMTAgQEAKIAlzcGluX2xvY2soJmFjcGlfcHJ0X2xvY2spOwogCWxpc3RfZm9yX2VhY2gobm9kZSwgJmFjcGlfcHJ0LmVudHJpZXMpIHsKIAkJZW50cnkgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBhY3BpX3BydF9lbnRyeSwgbm9kZSk7Ci0JCWlmICgoc2VnbWVudCA9PSBlbnRyeS0+aWQuc2VnbWVudCkgCi0JCQkmJiAoYnVzID09IGVudHJ5LT5pZC5idXMpIAotCQkJJiYgKGRldmljZSA9PSBlbnRyeS0+aWQuZGV2aWNlKQotCQkJJiYgKHBpbiA9PSBlbnRyeS0+cGluKSkgeworCQlpZiAoKHNlZ21lbnQgPT0gZW50cnktPmlkLnNlZ21lbnQpCisJCSAgICAmJiAoYnVzID09IGVudHJ5LT5pZC5idXMpCisJCSAgICAmJiAoZGV2aWNlID09IGVudHJ5LT5pZC5kZXZpY2UpCisJCSAgICAmJiAocGluID09IGVudHJ5LT5waW4pKSB7CiAJCQlzcGluX3VubG9jaygmYWNwaV9wcnRfbG9jayk7CiAJCQlyZXR1cm5fUFRSKGVudHJ5KTsKIAkJfQpAQCAtODUsMTUgKzgxLDExIEBACiAJcmV0dXJuX1BUUihOVUxMKTsKIH0KIAotCiBzdGF0aWMgaW50Ci1hY3BpX3BjaV9pcnFfYWRkX2VudHJ5ICgKLQlhY3BpX2hhbmRsZQkJCWhhbmRsZSwKLQlpbnQJCQkJc2VnbWVudCwKLQlpbnQJCQkJYnVzLAotCXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlCSpwcnQpCithY3BpX3BjaV9pcnFfYWRkX2VudHJ5KGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJICAgICAgIGludCBzZWdtZW50LCBpbnQgYnVzLCBzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSAqcHJ0KQogewotCXN0cnVjdCBhY3BpX3BydF9lbnRyeQkqZW50cnkgPSBOVUxMOworCXN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnkgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfaXJxX2FkZF9lbnRyeSIpOwogCkBAIC0xMzksOSArMTMxLDEwIEBACiAJCWVudHJ5LT5saW5rLmluZGV4ID0gcHJ0LT5zb3VyY2VfaW5kZXg7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTkZPLAotCQkiICAgICAgJTAyWDolMDJYOiUwMlhbJWNdIC0+ICVzWyVkXVxuIiwgCi0JCWVudHJ5LT5pZC5zZWdtZW50LCBlbnRyeS0+aWQuYnVzLCBlbnRyeS0+aWQuZGV2aWNlLCAKLQkJKCdBJyArIGVudHJ5LT5waW4pLCBwcnQtPnNvdXJjZSwgZW50cnktPmxpbmsuaW5kZXgpKTsKKwkJCSAgICAgICIgICAgICAlMDJYOiUwMlg6JTAyWFslY10gLT4gJXNbJWRdXG4iLAorCQkJICAgICAgZW50cnktPmlkLnNlZ21lbnQsIGVudHJ5LT5pZC5idXMsCisJCQkgICAgICBlbnRyeS0+aWQuZGV2aWNlLCAoJ0EnICsgZW50cnktPnBpbiksIHBydC0+c291cmNlLAorCQkJICAgICAgZW50cnktPmxpbmsuaW5kZXgpKTsKIAogCXNwaW5fbG9jaygmYWNwaV9wcnRfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmZW50cnktPm5vZGUsICZhY3BpX3BydC5lbnRyaWVzKTsKQEAgLTE1MSwzOCArMTQ0LDI5IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIHN0YXRpYyB2b2lkCi1hY3BpX3BjaV9pcnFfZGVsX2VudHJ5ICgKLQlpbnQJCQkJc2VnbWVudCwKLQlpbnQJCQkJYnVzLAotCXN0cnVjdCBhY3BpX3BydF9lbnRyeQkJKmVudHJ5KQorYWNwaV9wY2lfaXJxX2RlbF9lbnRyeShpbnQgc2VnbWVudCwgaW50IGJ1cywgc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICplbnRyeSkKIHsKLQlpZiAoc2VnbWVudCA9PSBlbnRyeS0+aWQuc2VnbWVudCAmJiBidXMgPT0gZW50cnktPmlkLmJ1cyl7CisJaWYgKHNlZ21lbnQgPT0gZW50cnktPmlkLnNlZ21lbnQgJiYgYnVzID09IGVudHJ5LT5pZC5idXMpIHsKIAkJYWNwaV9wcnQuY291bnQtLTsKIAkJbGlzdF9kZWwoJmVudHJ5LT5ub2RlKTsKIAkJa2ZyZWUoZW50cnkpOwogCX0KIH0KIAotCi1pbnQKLWFjcGlfcGNpX2lycV9hZGRfcHJ0ICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCWludAkJCXNlZ21lbnQsCi0JaW50CQkJYnVzKQoraW50IGFjcGlfcGNpX2lycV9hZGRfcHJ0KGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHNlZ21lbnQsIGludCBidXMpCiB7Ci0JYWNwaV9zdGF0dXMJCQlzdGF0dXMgPSBBRV9PSzsKLQljaGFyCQkJCSpwYXRobmFtZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCQlidWZmZXIgPSB7MCwgTlVMTH07Ci0Jc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUJKnBydCA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUJKmVudHJ5ID0gTlVMTDsKLQlzdGF0aWMgaW50CQkJZmlyc3RfdGltZSA9IDE7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJY2hhciAqcGF0aG5hbWUgPSBOVUxMOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IDAsIE5VTEwgfTsKKwlzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSAqcHJ0ID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSAqZW50cnkgPSBOVUxMOworCXN0YXRpYyBpbnQgZmlyc3RfdGltZSA9IDE7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9pcnFfYWRkX3BydCIpOwogCi0JcGF0aG5hbWUgPSAoY2hhciAqKSBrbWFsbG9jKEFDUElfUEFUSE5BTUVfTUFYLCBHRlBfS0VSTkVMKTsKLQlpZighcGF0aG5hbWUpCisJcGF0aG5hbWUgPSAoY2hhciAqKWttYWxsb2MoQUNQSV9QQVRITkFNRV9NQVgsIEdGUF9LRVJORUwpOworCWlmICghcGF0aG5hbWUpCiAJCXJldHVybl9WQUxVRSgtRU5PTUVNKTsKIAltZW1zZXQocGF0aG5hbWUsIDAsIEFDUElfUEFUSE5BTUVfTUFYKTsKIApAQCAtMjAyLDcgKzE4Niw3IEBACiAJYWNwaV9nZXRfbmFtZShoYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwgJmJ1ZmZlcik7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiQUNQSTogUENJIEludGVycnVwdCBSb3V0aW5nIFRhYmxlIFslcy5fUFJUXVxuIiwKLQkJcGF0aG5hbWUpOworCSAgICAgICBwYXRobmFtZSk7CiAKIAkvKiAKIAkgKiBFdmFsdWF0ZSB0aGlzIF9QUlQgYW5kIGFkZCBpdHMgZW50cmllcyB0byBvdXIgZ2xvYmFsIGxpc3QgKGFjcGlfcHJ0KS4KQEAgLTIxNCwxMiArMTk4LDEyIEBACiAJc3RhdHVzID0gYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUoaGFuZGxlLCAmYnVmZmVyKTsKIAlpZiAoc3RhdHVzICE9IEFFX0JVRkZFUl9PVkVSRkxPVykgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRXJyb3IgZXZhbHVhdGluZyBfUFJUIFslc11cbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAogCXBydCA9IGttYWxsb2MoYnVmZmVyLmxlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcnQpeworCWlmICghcHJ0KSB7CiAJCXJldHVybl9WQUxVRSgtRU5PTUVNKTsKIAl9CiAJbWVtc2V0KHBydCwgMCwgYnVmZmVyLmxlbmd0aCk7CkBAIC0yMjgsNyArMjEyLDcgQEAKIAlzdGF0dXMgPSBhY3BpX2dldF9pcnFfcm91dGluZ190YWJsZShoYW5kbGUsICZidWZmZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRXJyb3IgZXZhbHVhdGluZyBfUFJUIFslc11cbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQpAQCAtMjM4LDcgKzIyMiw3IEBACiAJd2hpbGUgKGVudHJ5ICYmIChlbnRyeS0+bGVuZ3RoID4gMCkpIHsKIAkJYWNwaV9wY2lfaXJxX2FkZF9lbnRyeShoYW5kbGUsIHNlZ21lbnQsIGJ1cywgZW50cnkpOwogCQllbnRyeSA9IChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSAqKQotCQkJKCh1bnNpZ25lZCBsb25nKSBlbnRyeSArIGVudHJ5LT5sZW5ndGgpOworCQkgICAgKCh1bnNpZ25lZCBsb25nKWVudHJ5ICsgZW50cnktPmxlbmd0aCk7CiAJfQogCiAJa2ZyZWUocHJ0KTsKQEAgLTI0NiwxOCArMjMwLDE4IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi12b2lkCi1hY3BpX3BjaV9pcnFfZGVsX3BydCAoaW50IHNlZ21lbnQsIGludCBidXMpCit2b2lkIGFjcGlfcGNpX2lycV9kZWxfcHJ0KGludCBzZWdtZW50LCBpbnQgYnVzKQogewotCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICpub2RlID0gTlVMTCwgKm4gPSBOVUxMOwotCXN0cnVjdCBhY3BpX3BydF9lbnRyeSAgICplbnRyeSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSA9IE5VTEwsICpuID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAotCWlmICghYWNwaV9wcnQuY291bnQpICAgIHsKKwlpZiAoIWFjcGlfcHJ0LmNvdW50KSB7CiAJCXJldHVybjsKIAl9CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiQUNQSTogRGVsZXRlIFBDSSBJbnRlcnJ1cHQgUm91dGluZyBUYWJsZSBmb3IgJXg6JXhcbiIsCi0JCXNlZ21lbnQsIGJ1cyk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIkFDUEk6IERlbGV0ZSBQQ0kgSW50ZXJydXB0IFJvdXRpbmcgVGFibGUgZm9yICV4OiV4XG4iLCBzZWdtZW50LAorCSAgICAgICBidXMpOwogCXNwaW5fbG9jaygmYWNwaV9wcnRfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG4sICZhY3BpX3BydC5lbnRyaWVzKSB7CiAJCWVudHJ5ID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYWNwaV9wcnRfZW50cnksIG5vZGUpOwpAQCAtMjY2LDI2ICsyNTAsMjcgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmFjcGlfcHJ0X2xvY2spOwogfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0kgSW50ZXJydXB0IFJvdXRpbmcgU3VwcG9ydAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXR5cGVkZWYgaW50ICgqaXJxX2xvb2t1cF9mdW5jKShzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKiwgaW50ICosIGludCAqLCBjaGFyICoqKTsKK3R5cGVkZWYgaW50ICgqaXJxX2xvb2t1cF9mdW5jKSAoc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICosIGludCAqLCBpbnQgKiwgY2hhciAqKik7CiAKIHN0YXRpYyBpbnQKIGFjcGlfcGNpX2FsbG9jYXRlX2lycShzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5LAotCWludAkqZWRnZV9sZXZlbCwKLQlpbnQJKmFjdGl2ZV9oaWdoX2xvdywKLQljaGFyCSoqbGluaykKKwkJICAgICAgaW50ICplZGdlX2xldmVsLCBpbnQgKmFjdGl2ZV9oaWdoX2xvdywgY2hhciAqKmxpbmspCiB7Ci0JaW50CWlycTsKKwlpbnQgaXJxOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfYWxsb2NhdGVfaXJxIik7CiAKIAlpZiAoZW50cnktPmxpbmsuaGFuZGxlKSB7CiAJCWlycSA9IGFjcGlfcGNpX2xpbmtfYWxsb2NhdGVfaXJxKGVudHJ5LT5saW5rLmhhbmRsZSwKLQkJCWVudHJ5LT5saW5rLmluZGV4LCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3csIGxpbmspOworCQkJCQkJIGVudHJ5LT5saW5rLmluZGV4LCBlZGdlX2xldmVsLAorCQkJCQkJIGFjdGl2ZV9oaWdoX2xvdywgbGluayk7CiAJCWlmIChpcnEgPCAwKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJJbnZhbGlkIElSUSBsaW5rIHJvdXRpbmcgZW50cnlcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkJICAiSW52YWxpZCBJUlEgbGluayByb3V0aW5nIGVudHJ5XG4iKSk7CiAJCQlyZXR1cm5fVkFMVUUoLTEpOwogCQl9CiAJfSBlbHNlIHsKQEAgLTMwMCwxMSArMjg1LDkgQEAKIAogc3RhdGljIGludAogYWNwaV9wY2lfZnJlZV9pcnEoc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICplbnRyeSwKLQlpbnQJKmVkZ2VfbGV2ZWwsCi0JaW50CSphY3RpdmVfaGlnaF9sb3csCi0JY2hhcgkqKmxpbmspCisJCSAgaW50ICplZGdlX2xldmVsLCBpbnQgKmFjdGl2ZV9oaWdoX2xvdywgY2hhciAqKmxpbmspCiB7Ci0JaW50CWlycTsKKwlpbnQgaXJxOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfZnJlZV9pcnEiKTsKIAlpZiAoZW50cnktPmxpbmsuaGFuZGxlKSB7CkBAIC0zMTQsMzggKzI5NywzNiBAQAogCX0KIAlyZXR1cm5fVkFMVUUoaXJxKTsKIH0KKwogLyoKICAqIGFjcGlfcGNpX2lycV9sb29rdXAKICAqIHN1Y2Nlc3M6IHJldHVybiBJUlEgPj0gMAogICogZmFpbHVyZTogcmV0dXJuIC0xCiAgKi8KIHN0YXRpYyBpbnQKLWFjcGlfcGNpX2lycV9sb29rdXAgKAotCXN0cnVjdCBwY2lfYnVzCQkqYnVzLAotCWludAkJCWRldmljZSwKLQlpbnQJCQlwaW4sCi0JaW50CQkJKmVkZ2VfbGV2ZWwsCi0JaW50CQkJKmFjdGl2ZV9oaWdoX2xvdywKLQljaGFyCQkJKipsaW5rLAotCWlycV9sb29rdXBfZnVuYwkJZnVuYykKK2FjcGlfcGNpX2lycV9sb29rdXAoc3RydWN0IHBjaV9idXMgKmJ1cywKKwkJICAgIGludCBkZXZpY2UsCisJCSAgICBpbnQgcGluLAorCQkgICAgaW50ICplZGdlX2xldmVsLAorCQkgICAgaW50ICphY3RpdmVfaGlnaF9sb3csIGNoYXIgKipsaW5rLCBpcnFfbG9va3VwX2Z1bmMgZnVuYykKIHsKLQlzdHJ1Y3QgYWNwaV9wcnRfZW50cnkJKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAlpbnQgc2VnbWVudCA9IHBjaV9kb21haW5fbnIoYnVzKTsKIAlpbnQgYnVzX25yID0gYnVzLT5udW1iZXI7CiAJaW50IHJldDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2lycV9sb29rdXAiKTsKIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgCi0JCSJTZWFyY2hpbmcgZm9yIFBSVCBlbnRyeSBmb3IgJTAyeDolMDJ4OiUwMnhbJWNdXG4iLCAKLQkJc2VnbWVudCwgYnVzX25yLCBkZXZpY2UsICgnQScgKyBwaW4pKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiU2VhcmNoaW5nIGZvciBQUlQgZW50cnkgZm9yICUwMng6JTAyeDolMDJ4WyVjXVxuIiwKKwkJCSAgc2VnbWVudCwgYnVzX25yLCBkZXZpY2UsICgnQScgKyBwaW4pKSk7CiAKLQllbnRyeSA9IGFjcGlfcGNpX2lycV9maW5kX3BydF9lbnRyeShzZWdtZW50LCBidXNfbnIsIGRldmljZSwgcGluKTsgCisJZW50cnkgPSBhY3BpX3BjaV9pcnFfZmluZF9wcnRfZW50cnkoc2VnbWVudCwgYnVzX25yLCBkZXZpY2UsIHBpbik7CiAJaWYgKCFlbnRyeSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJQUlQgZW50cnkgbm90IGZvdW5kXG4iKSk7CiAJCXJldHVybl9WQUxVRSgtMSk7CiAJfQotCQorCiAJcmV0ID0gZnVuYyhlbnRyeSwgZWRnZV9sZXZlbCwgYWN0aXZlX2hpZ2hfbG93LCBsaW5rKTsKIAlyZXR1cm5fVkFMVUUocmV0KTsKIH0KQEAgLTM1NiwxNyArMzM3LDE0IEBACiAgKiBmYWlsdXJlOiByZXR1cm4gPCAwCiAgKi8KIHN0YXRpYyBpbnQKLWFjcGlfcGNpX2lycV9kZXJpdmUgKAotCXN0cnVjdCBwY2lfZGV2CQkqZGV2LAotCWludAkJCXBpbiwKLQlpbnQJCQkqZWRnZV9sZXZlbCwKLQlpbnQJCQkqYWN0aXZlX2hpZ2hfbG93LAotCWNoYXIJCQkqKmxpbmssCi0JaXJxX2xvb2t1cF9mdW5jCQlmdW5jKQorYWNwaV9wY2lfaXJxX2Rlcml2ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkgICAgaW50IHBpbiwKKwkJICAgIGludCAqZWRnZV9sZXZlbCwKKwkJICAgIGludCAqYWN0aXZlX2hpZ2hfbG93LCBjaGFyICoqbGluaywgaXJxX2xvb2t1cF9mdW5jIGZ1bmMpCiB7Ci0Jc3RydWN0IHBjaV9kZXYJCSpicmlkZ2UgPSBkZXY7Ci0JaW50CQkJaXJxID0gLTE7Ci0JdTgJCQlicmlkZ2VfcGluID0gMDsKKwlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlID0gZGV2OworCWludCBpcnEgPSAtMTsKKwl1OCBicmlkZ2VfcGluID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2lycV9kZXJpdmUiKTsKIApAQCAtMzgzLDI4ICszNjEsMzMgQEAKIAogCQlpZiAoKGJyaWRnZS0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9DQVJEQlVTKSB7CiAJCQkvKiBQQyBjYXJkIGhhcyB0aGUgc2FtZSBJUlEgYXMgaXRzIGNhcmRicmlkZ2UgKi8KLQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJyaWRnZSwgUENJX0lOVEVSUlVQVF9QSU4sICZicmlkZ2VfcGluKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJyaWRnZSwgUENJX0lOVEVSUlVQVF9QSU4sCisJCQkJCSAgICAgJmJyaWRnZV9waW4pOwogCQkJaWYgKCFicmlkZ2VfcGluKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAKLQkJCQkJIk5vIGludGVycnVwdCBwaW4gY29uZmlndXJlZCBmb3IgZGV2aWNlICVzXG4iLCBwY2lfbmFtZShicmlkZ2UpKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkJICAiTm8gaW50ZXJydXB0IHBpbiBjb25maWd1cmVkIGZvciBkZXZpY2UgJXNcbiIsCisJCQkJCQkgIHBjaV9uYW1lKGJyaWRnZSkpKTsKIAkJCQlyZXR1cm5fVkFMVUUoLTEpOwogCQkJfQogCQkJLyogUGluIGlzIGZyb20gMCB0byAzICovCi0JCQlicmlkZ2VfcGluIC0tOworCQkJYnJpZGdlX3Bpbi0tOwogCQkJcGluID0gYnJpZGdlX3BpbjsKIAkJfQogCiAJCWlycSA9IGFjcGlfcGNpX2lycV9sb29rdXAoYnJpZGdlLT5idXMsIFBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pLAotCQkJcGluLCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3csIGxpbmssIGZ1bmMpOworCQkJCQkgIHBpbiwgZWRnZV9sZXZlbCwgYWN0aXZlX2hpZ2hfbG93LAorCQkJCQkgIGxpbmssIGZ1bmMpOwogCX0KIAogCWlmIChpcnEgPCAwKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIlVuYWJsZSB0byBkZXJpdmUgSVJRIGZvciBkZXZpY2UgJXNcbiIsIHBjaV9uYW1lKGRldikpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCSAgIlVuYWJsZSB0byBkZXJpdmUgSVJRIGZvciBkZXZpY2UgJXNcbiIsCisJCQkJICBwY2lfbmFtZShkZXYpKSk7CiAJCXJldHVybl9WQUxVRSgtMSk7CiAJfQogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGVyaXZlIElSUSAlZCBmb3IgZGV2aWNlICVzIGZyb20gJXNcbiIsCi0JCWlycSwgcGNpX25hbWUoZGV2KSwgcGNpX25hbWUoYnJpZGdlKSkpOworCQkJICBpcnEsIHBjaV9uYW1lKGRldiksIHBjaV9uYW1lKGJyaWRnZSkpKTsKIAogCXJldHVybl9WQUxVRShpcnEpOwogfQpAQCAtNDE1LDMwICszOTgsMzIgQEAKICAqIGZhaWx1cmU6IHJldHVybiA8IDAKICAqLwogCi1pbnQKLWFjcGlfcGNpX2lycV9lbmFibGUgKAotCXN0cnVjdCBwY2lfZGV2CQkqZGV2KQoraW50IGFjcGlfcGNpX2lycV9lbmFibGUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQJCQlpcnEgPSAwOwotCXU4CQkJcGluID0gMDsKLQlpbnQJCQllZGdlX2xldmVsID0gQUNQSV9MRVZFTF9TRU5TSVRJVkU7Ci0JaW50CQkJYWN0aXZlX2hpZ2hfbG93ID0gQUNQSV9BQ1RJVkVfTE9XOwotCWNoYXIJCQkqbGluayA9IE5VTEw7CisJaW50IGlycSA9IDA7CisJdTggcGluID0gMDsKKwlpbnQgZWRnZV9sZXZlbCA9IEFDUElfTEVWRUxfU0VOU0lUSVZFOworCWludCBhY3RpdmVfaGlnaF9sb3cgPSBBQ1BJX0FDVElWRV9MT1c7CisJY2hhciAqbGluayA9IE5VTEw7CisJaW50IHJjOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfaXJxX2VuYWJsZSIpOwogCiAJaWYgKCFkZXYpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKLQkKKwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOwogCWlmICghcGluKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk5vIGludGVycnVwdCBwaW4gY29uZmlndXJlZCBmb3IgZGV2aWNlICVzXG4iLCBwY2lfbmFtZShkZXYpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJObyBpbnRlcnJ1cHQgcGluIGNvbmZpZ3VyZWQgZm9yIGRldmljZSAlc1xuIiwKKwkJCQkgIHBjaV9uYW1lKGRldikpKTsKIAkJcmV0dXJuX1ZBTFVFKDApOwogCX0KIAlwaW4tLTsKIAogCWlmICghZGV2LT5idXMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgKE5VTEwpICdidXMnIGZpZWxkXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSW52YWxpZCAoTlVMTCkgJ2J1cycgZmllbGRcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIApAQCAtNDQ2LDY5ICs0MzEsNzYgQEAKIAkgKiBGaXJzdCB3ZSBjaGVjayB0aGUgUENJIElSUSByb3V0aW5nIHRhYmxlIChQUlQpIGZvciBhbiBJUlEuICBQUlQKIAkgKiB2YWx1ZXMgb3ZlcnJpZGUgYW55IEJJT1MtYXNzaWduZWQgSVJRcyBzZXQgZHVyaW5nIGJvb3QuCiAJICovCi0gCWlycSA9IGFjcGlfcGNpX2lycV9sb29rdXAoZGV2LT5idXMsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4sCi0JCSZlZGdlX2xldmVsLCAmYWN0aXZlX2hpZ2hfbG93LCAmbGluaywgYWNwaV9wY2lfYWxsb2NhdGVfaXJxKTsKKwlpcnEgPSBhY3BpX3BjaV9pcnFfbG9va3VwKGRldi0+YnVzLCBQQ0lfU0xPVChkZXYtPmRldmZuKSwgcGluLAorCQkJCSAgJmVkZ2VfbGV2ZWwsICZhY3RpdmVfaGlnaF9sb3csICZsaW5rLAorCQkJCSAgYWNwaV9wY2lfYWxsb2NhdGVfaXJxKTsKIAogCS8qCiAJICogSWYgbm8gUFJUIGVudHJ5IHdhcyBmb3VuZCwgd2UnbGwgdHJ5IHRvIGRlcml2ZSBhbiBJUlEgZnJvbSB0aGUKIAkgKiBkZXZpY2UncyBwYXJlbnQgYnJpZGdlLgogCSAqLwogCWlmIChpcnEgPCAwKQotIAkJaXJxID0gYWNwaV9wY2lfaXJxX2Rlcml2ZShkZXYsIHBpbiwgJmVkZ2VfbGV2ZWwsCi0JCQkmYWN0aXZlX2hpZ2hfbG93LCAmbGluaywgYWNwaV9wY2lfYWxsb2NhdGVfaXJxKTsKLSAKKwkJaXJxID0gYWNwaV9wY2lfaXJxX2Rlcml2ZShkZXYsIHBpbiwgJmVkZ2VfbGV2ZWwsCisJCQkJCSAgJmFjdGl2ZV9oaWdoX2xvdywgJmxpbmssCisJCQkJCSAgYWNwaV9wY2lfYWxsb2NhdGVfaXJxKTsKKwogCS8qCiAJICogTm8gSVJRIGtub3duIHRvIHRoZSBBQ1BJIHN1YnN5c3RlbSAtIG1heWJlIHRoZSBCSU9TIC8gCiAJICogZHJpdmVyIHJlcG9ydGVkIG9uZSwgdGhlbiB1c2UgaXQuIEV4aXQgaW4gYW55IGNhc2UuCiAJICovCiAJaWYgKGlycSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlBDSSBJbnRlcnJ1cHQgJXNbJWNdOiBubyBHU0kiLAotCQkJcGNpX25hbWUoZGV2KSwgKCdBJyArIHBpbikpOworCQkgICAgICAgcGNpX25hbWUoZGV2KSwgKCdBJyArIHBpbikpOwogCQkvKiBJbnRlcnJ1cHQgTGluZSB2YWx1ZXMgYWJvdmUgMHhGIGFyZSBmb3JiaWRkZW4gKi8KIAkJaWYgKGRldi0+aXJxID4gMCAmJiAoZGV2LT5pcnEgPD0gMHhGKSkgewogCQkJcHJpbnRrKCIgLSB1c2luZyBJUlEgJWRcbiIsIGRldi0+aXJxKTsKLQkJCWFjcGlfcmVnaXN0ZXJfZ3NpKGRldi0+aXJxLCBBQ1BJX0xFVkVMX1NFTlNJVElWRSwgQUNQSV9BQ1RJVkVfTE9XKTsKKwkJCWFjcGlfcmVnaXN0ZXJfZ3NpKGRldi0+aXJxLCBBQ1BJX0xFVkVMX1NFTlNJVElWRSwKKwkJCQkJICBBQ1BJX0FDVElWRV9MT1cpOwogCQkJcmV0dXJuX1ZBTFVFKDApOwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJcHJpbnRrKCJcbiIpOwogCQkJcmV0dXJuX1ZBTFVFKDApOwogCQl9Ci0gCX0KKwl9CiAKLQlkZXYtPmlycSA9IGFjcGlfcmVnaXN0ZXJfZ3NpKGlycSwgZWRnZV9sZXZlbCwgYWN0aXZlX2hpZ2hfbG93KTsKKwlyYyA9IGFjcGlfcmVnaXN0ZXJfZ3NpKGlycSwgZWRnZV9sZXZlbCwgYWN0aXZlX2hpZ2hfbG93KTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJQQ0kgSW50ZXJydXB0ICVzWyVjXTogZmFpbGVkICIKKwkJICAgICAgICJ0byByZWdpc3RlciBHU0lcbiIsIHBjaV9uYW1lKGRldiksICgnQScgKyBwaW4pKTsKKwkJcmV0dXJuX1ZBTFVFKHJjKTsKKwl9CisJZGV2LT5pcnEgPSByYzsKIAogCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJQQ0kgSW50ZXJydXB0ICVzWyVjXSAtPiAiLAotCQlwY2lfbmFtZShkZXYpLCAnQScgKyBwaW4pOworCSAgICAgICBwY2lfbmFtZShkZXYpLCAnQScgKyBwaW4pOwogCiAJaWYgKGxpbmspCiAJCXByaW50aygiTGluayBbJXNdIC0+ICIsIGxpbmspOwogCiAJcHJpbnRrKCJHU0kgJXUgKCVzLCAlcykgLT4gSVJRICVkXG4iLCBpcnEsCi0JCShlZGdlX2xldmVsID09IEFDUElfTEVWRUxfU0VOU0lUSVZFKSA/ICJsZXZlbCIgOiAiZWRnZSIsCi0JCShhY3RpdmVfaGlnaF9sb3cgPT0gQUNQSV9BQ1RJVkVfTE9XKSA/ICJsb3ciIDogImhpZ2giLAotCQlkZXYtPmlycSk7CisJICAgICAgIChlZGdlX2xldmVsID09IEFDUElfTEVWRUxfU0VOU0lUSVZFKSA/ICJsZXZlbCIgOiAiZWRnZSIsCisJICAgICAgIChhY3RpdmVfaGlnaF9sb3cgPT0gQUNQSV9BQ1RJVkVfTE9XKSA/ICJsb3ciIDogImhpZ2giLCBkZXYtPmlycSk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9wY2lfaXJxX2VuYWJsZSk7CiAKLQogLyogRklYTUU6IGltcGxlbWVudCB4ODYveDg2XzY0IHZlcnNpb24gKi8KLXZvaWQgX19hdHRyaWJ1dGVfXygod2VhaykpIGFjcGlfdW5yZWdpc3Rlcl9nc2kodTMyIGkpIHt9Ci0KLXZvaWQKLWFjcGlfcGNpX2lycV9kaXNhYmxlICgKLQlzdHJ1Y3QgcGNpX2RldgkJKmRldikKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKHdlYWspKSBhY3BpX3VucmVnaXN0ZXJfZ3NpKHUzMiBpKQogewotCWludAkJCWdzaSA9IDA7Ci0JdTgJCQlwaW4gPSAwOwotCWludAkJCWVkZ2VfbGV2ZWwgPSBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKLQlpbnQJCQlhY3RpdmVfaGlnaF9sb3cgPSBBQ1BJX0FDVElWRV9MT1c7Cit9CisKK3ZvaWQgYWNwaV9wY2lfaXJxX2Rpc2FibGUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgZ3NpID0gMDsKKwl1OCBwaW4gPSAwOworCWludCBlZGdlX2xldmVsID0gQUNQSV9MRVZFTF9TRU5TSVRJVkU7CisJaW50IGFjdGl2ZV9oaWdoX2xvdyA9IEFDUElfQUNUSVZFX0xPVzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2lycV9kaXNhYmxlIik7CiAKLQlpZiAoIWRldikKKwlpZiAoIWRldiB8fCAhZGV2LT5idXMpCiAJCXJldHVybl9WT0lEOwogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CkBAIC01MTYsMjEgKzUwOCwyMCBAQAogCQlyZXR1cm5fVk9JRDsKIAlwaW4tLTsKIAotCWlmICghZGV2LT5idXMpCi0JCXJldHVybl9WT0lEOwotCiAJLyoKIAkgKiBGaXJzdCB3ZSBjaGVjayB0aGUgUENJIElSUSByb3V0aW5nIHRhYmxlIChQUlQpIGZvciBhbiBJUlEuCiAJICovCi0gCWdzaSA9IGFjcGlfcGNpX2lycV9sb29rdXAoZGV2LT5idXMsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4sCi0JCQkmZWRnZV9sZXZlbCwgJmFjdGl2ZV9oaWdoX2xvdywgTlVMTCwgYWNwaV9wY2lfZnJlZV9pcnEpOworCWdzaSA9IGFjcGlfcGNpX2lycV9sb29rdXAoZGV2LT5idXMsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4sCisJCQkJICAmZWRnZV9sZXZlbCwgJmFjdGl2ZV9oaWdoX2xvdywgTlVMTCwKKwkJCQkgIGFjcGlfcGNpX2ZyZWVfaXJxKTsKIAkvKgogCSAqIElmIG5vIFBSVCBlbnRyeSB3YXMgZm91bmQsIHdlJ2xsIHRyeSB0byBkZXJpdmUgYW4gSVJRIGZyb20gdGhlCiAJICogZGV2aWNlJ3MgcGFyZW50IGJyaWRnZS4KIAkgKi8KIAlpZiAoZ3NpIDwgMCkKLSAJCWdzaSA9IGFjcGlfcGNpX2lycV9kZXJpdmUoZGV2LCBwaW4sCi0JCQkmZWRnZV9sZXZlbCwgJmFjdGl2ZV9oaWdoX2xvdywgTlVMTCwgYWNwaV9wY2lfZnJlZV9pcnEpOworCQlnc2kgPSBhY3BpX3BjaV9pcnFfZGVyaXZlKGRldiwgcGluLAorCQkJCQkgICZlZGdlX2xldmVsLCAmYWN0aXZlX2hpZ2hfbG93LCBOVUxMLAorCQkJCQkgIGFjcGlfcGNpX2ZyZWVfaXJxKTsKIAlpZiAoZ3NpIDwgMCkKIAkJcmV0dXJuX1ZPSUQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jIGIvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKaW5kZXggODM0YzJjZS4uODIyOTJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKQEAgLTQyLDMwICs0MiwyNiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9QQ0lfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoInBjaV9saW5rIikKLQorQUNQSV9NT0RVTEVfTkFNRSgicGNpX2xpbmsiKQogI2RlZmluZSBBQ1BJX1BDSV9MSU5LX0NMQVNTCQkicGNpX2lycV9yb3V0aW5nIgogI2RlZmluZSBBQ1BJX1BDSV9MSU5LX0hJRAkJIlBOUDBDMEYiCiAjZGVmaW5lIEFDUElfUENJX0xJTktfRFJJVkVSX05BTUUJIkFDUEkgUENJIEludGVycnVwdCBMaW5rIERyaXZlciIKICNkZWZpbmUgQUNQSV9QQ0lfTElOS19ERVZJQ0VfTkFNRQkiUENJIEludGVycnVwdCBMaW5rIgogI2RlZmluZSBBQ1BJX1BDSV9MSU5LX0ZJTEVfSU5GTwkJImluZm8iCiAjZGVmaW5lIEFDUElfUENJX0xJTktfRklMRV9TVEFUVVMJInN0YXRlIgotCiAjZGVmaW5lIEFDUElfUENJX0xJTktfTUFYX1BPU1NJQkxFIDE2Ci0KLXN0YXRpYyBpbnQgYWNwaV9wY2lfbGlua19hZGQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV9wY2lfbGlua19yZW1vdmUgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfcGNpX2xpbmtfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV9wY2lfbGlua19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3BjaV9saW5rX2RyaXZlciA9IHsKLQkubmFtZSA9CQlBQ1BJX1BDSV9MSU5LX0RSSVZFUl9OQU1FLAotCS5jbGFzcyA9CUFDUElfUENJX0xJTktfQ0xBU1MsCi0JLmlkcyA9CQlBQ1BJX1BDSV9MSU5LX0hJRCwKLQkub3BzID0JCXsKLQkJCQkuYWRkID0gICAgYWNwaV9wY2lfbGlua19hZGQsCi0JCQkJLnJlbW92ZSA9IGFjcGlfcGNpX2xpbmtfcmVtb3ZlLAotCQkJfSwKKwkubmFtZSA9IEFDUElfUENJX0xJTktfRFJJVkVSX05BTUUsCisJLmNsYXNzID0gQUNQSV9QQ0lfTElOS19DTEFTUywKKwkuaWRzID0gQUNQSV9QQ0lfTElOS19ISUQsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFjcGlfcGNpX2xpbmtfYWRkLAorCQkucmVtb3ZlID0gYWNwaV9wY2lfbGlua19yZW1vdmUsCisJCX0sCiB9OwogCiAvKgpAQCAtNzMsMzEgKzY5LDMwIEBACiAgKiBsYXRlciBldmVuIHRoZSBsaW5rIGlzIGRpc2FibGUuIEluc3RlYWQsIHdlIGp1c3QgcmVwaWNrIHRoZSBhY3RpdmUgaXJxCiAgKi8KIHN0cnVjdCBhY3BpX3BjaV9saW5rX2lycSB7Ci0JdTgJCQlhY3RpdmU7CQkJLyogQ3VycmVudCBJUlEgKi8KLQl1OAkJCWVkZ2VfbGV2ZWw7CQkvKiBBbGwgSVJRcyAqLwotCXU4CQkJYWN0aXZlX2hpZ2hfbG93OwkvKiBBbGwgSVJRcyAqLwotCXU4CQkJcmVzb3VyY2VfdHlwZTsKLQl1OAkJCXBvc3NpYmxlX2NvdW50OwotCXU4CQkJcG9zc2libGVbQUNQSV9QQ0lfTElOS19NQVhfUE9TU0lCTEVdOwotCXU4CQkJaW5pdGlhbGl6ZWQ6MTsKLQl1OAkJCXJlc2VydmVkOjc7CisJdTggYWN0aXZlOwkJLyogQ3VycmVudCBJUlEgKi8KKwl1OCBlZGdlX2xldmVsOwkJLyogQWxsIElSUXMgKi8KKwl1OCBhY3RpdmVfaGlnaF9sb3c7CS8qIEFsbCBJUlFzICovCisJdTggcmVzb3VyY2VfdHlwZTsKKwl1OCBwb3NzaWJsZV9jb3VudDsKKwl1OCBwb3NzaWJsZVtBQ1BJX1BDSV9MSU5LX01BWF9QT1NTSUJMRV07CisJdTggaW5pdGlhbGl6ZWQ6MTsKKwl1OCByZXNlcnZlZDo3OwogfTsKIAogc3RydWN0IGFjcGlfcGNpX2xpbmsgewotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZTsKLQlhY3BpX2hhbmRsZQkJaGFuZGxlOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CiAJc3RydWN0IGFjcGlfcGNpX2xpbmtfaXJxIGlycTsKLQlpbnQJCQlyZWZjbnQ7CisJaW50IHJlZmNudDsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgewotCWludAkJCWNvdW50OwotCXN0cnVjdCBsaXN0X2hlYWQJZW50cmllczsKLX0JCQkJYWNwaV9saW5rOworCWludCBjb3VudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJpZXM7Cit9IGFjcGlfbGluazsKIERFQ0xBUkVfTVVURVgoYWNwaV9saW5rX2xvY2spOwogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJIExpbmsgRGV2aWNlIE1hbmFnZW1lbnQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMDYsMTIgKzEwMSwxMCBAQAogICogc2V0IGNvbnRleHQgKGxpbmspIHBvc3NpYmxlIGxpc3QgZnJvbSByZXNvdXJjZSBsaXN0CiAgKi8KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9wY2lfbGlua19jaGVja19wb3NzaWJsZSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UJKnJlc291cmNlLAotCXZvaWQJCQkqY29udGV4dCkKK2FjcGlfcGNpX2xpbmtfY2hlY2tfcG9zc2libGUoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLCB2b2lkICpjb250ZXh0KQogewotCXN0cnVjdCBhY3BpX3BjaV9saW5rCSpsaW5rID0gKHN0cnVjdCBhY3BpX3BjaV9saW5rICopIGNvbnRleHQ7Ci0JdTMyCQkJaSA9IDA7CisJc3RydWN0IGFjcGlfcGNpX2xpbmsgKmxpbmsgPSAoc3RydWN0IGFjcGlfcGNpX2xpbmsgKiljb250ZXh0OworCXUzMiBpID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2xpbmtfY2hlY2tfcG9zc2libGUiKTsKIApAQCAtMTE5LDYxICsxMTIsNjggQEAKIAljYXNlIEFDUElfUlNUWVBFX1NUQVJUX0RQRjoKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAljYXNlIEFDUElfUlNUWVBFX0lSUToKLQl7Ci0JCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSAqcCA9ICZyZXNvdXJjZS0+ZGF0YS5pcnE7Ci0JCWlmICghcCB8fCAhcC0+bnVtYmVyX29mX2ludGVycnVwdHMpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkJsYW5rIElSUSByZXNvdXJjZVxuIikpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJfQotCQlmb3IgKGkgPSAwOyAoaTxwLT5udW1iZXJfb2ZfaW50ZXJydXB0cyAmJiBpPEFDUElfUENJX0xJTktfTUFYX1BPU1NJQkxFKTsgaSsrKSB7Ci0JCQlpZiAoIXAtPmludGVycnVwdHNbaV0pIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJJbnZhbGlkIElSUSAlZFxuIiwgcC0+aW50ZXJydXB0c1tpXSkpOwotCQkJCWNvbnRpbnVlOworCQl7CisJCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgKnAgPSAmcmVzb3VyY2UtPmRhdGEuaXJxOworCQkJaWYgKCFwIHx8ICFwLT5udW1iZXJfb2ZfaW50ZXJydXB0cykgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkJCSAgIkJsYW5rIElSUSByZXNvdXJjZVxuIikpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCQl9Ci0JCQlsaW5rLT5pcnEucG9zc2libGVbaV0gPSBwLT5pbnRlcnJ1cHRzW2ldOwotCQkJbGluay0+aXJxLnBvc3NpYmxlX2NvdW50Kys7CisJCQlmb3IgKGkgPSAwOworCQkJICAgICAoaSA8IHAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzCisJCQkgICAgICAmJiBpIDwgQUNQSV9QQ0lfTElOS19NQVhfUE9TU0lCTEUpOyBpKyspIHsKKwkJCQlpZiAoIXAtPmludGVycnVwdHNbaV0pIHsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCQkJCSAgIkludmFsaWQgSVJRICVkXG4iLAorCQkJCQkJCSAgcC0+aW50ZXJydXB0c1tpXSkpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJbGluay0+aXJxLnBvc3NpYmxlW2ldID0gcC0+aW50ZXJydXB0c1tpXTsKKwkJCQlsaW5rLT5pcnEucG9zc2libGVfY291bnQrKzsKKwkJCX0KKwkJCWxpbmstPmlycS5lZGdlX2xldmVsID0gcC0+ZWRnZV9sZXZlbDsKKwkJCWxpbmstPmlycS5hY3RpdmVfaGlnaF9sb3cgPSBwLT5hY3RpdmVfaGlnaF9sb3c7CisJCQlsaW5rLT5pcnEucmVzb3VyY2VfdHlwZSA9IEFDUElfUlNUWVBFX0lSUTsKKwkJCWJyZWFrOwogCQl9Ci0JCWxpbmstPmlycS5lZGdlX2xldmVsID0gcC0+ZWRnZV9sZXZlbDsKLQkJbGluay0+aXJxLmFjdGl2ZV9oaWdoX2xvdyA9IHAtPmFjdGl2ZV9oaWdoX2xvdzsKLQkJbGluay0+aXJxLnJlc291cmNlX3R5cGUgPSBBQ1BJX1JTVFlQRV9JUlE7Ci0JCWJyZWFrOwotCX0KIAljYXNlIEFDUElfUlNUWVBFX0VYVF9JUlE6Ci0JewotCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxICpwID0gJnJlc291cmNlLT5kYXRhLmV4dGVuZGVkX2lycTsKLQkJaWYgKCFwIHx8ICFwLT5udW1iZXJfb2ZfaW50ZXJydXB0cykgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAKLQkJCQkiQmxhbmsgRVhUIElSUSByZXNvdXJjZVxuIikpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJfQotCQlmb3IgKGkgPSAwOyAoaTxwLT5udW1iZXJfb2ZfaW50ZXJydXB0cyAmJiBpPEFDUElfUENJX0xJTktfTUFYX1BPU1NJQkxFKTsgaSsrKSB7Ci0JCQlpZiAoIXAtPmludGVycnVwdHNbaV0pIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJJbnZhbGlkIElSUSAlZFxuIiwgcC0+aW50ZXJydXB0c1tpXSkpOwotCQkJCWNvbnRpbnVlOworCQl7CisJCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxICpwID0KKwkJCSAgICAmcmVzb3VyY2UtPmRhdGEuZXh0ZW5kZWRfaXJxOworCQkJaWYgKCFwIHx8ICFwLT5udW1iZXJfb2ZfaW50ZXJydXB0cykgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkJCSAgIkJsYW5rIEVYVCBJUlEgcmVzb3VyY2VcbiIpKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQkJfQotCQkJbGluay0+aXJxLnBvc3NpYmxlW2ldID0gcC0+aW50ZXJydXB0c1tpXTsKLQkJCWxpbmstPmlycS5wb3NzaWJsZV9jb3VudCsrOworCQkJZm9yIChpID0gMDsKKwkJCSAgICAgKGkgPCBwLT5udW1iZXJfb2ZfaW50ZXJydXB0cworCQkJICAgICAgJiYgaSA8IEFDUElfUENJX0xJTktfTUFYX1BPU1NJQkxFKTsgaSsrKSB7CisJCQkJaWYgKCFwLT5pbnRlcnJ1cHRzW2ldKSB7CisJCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkJCQkgICJJbnZhbGlkIElSUSAlZFxuIiwKKwkJCQkJCQkgIHAtPmludGVycnVwdHNbaV0pKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWxpbmstPmlycS5wb3NzaWJsZVtpXSA9IHAtPmludGVycnVwdHNbaV07CisJCQkJbGluay0+aXJxLnBvc3NpYmxlX2NvdW50Kys7CisJCQl9CisJCQlsaW5rLT5pcnEuZWRnZV9sZXZlbCA9IHAtPmVkZ2VfbGV2ZWw7CisJCQlsaW5rLT5pcnEuYWN0aXZlX2hpZ2hfbG93ID0gcC0+YWN0aXZlX2hpZ2hfbG93OworCQkJbGluay0+aXJxLnJlc291cmNlX3R5cGUgPSBBQ1BJX1JTVFlQRV9FWFRfSVJROworCQkJYnJlYWs7CiAJCX0KLQkJbGluay0+aXJxLmVkZ2VfbGV2ZWwgPSBwLT5lZGdlX2xldmVsOwotCQlsaW5rLT5pcnEuYWN0aXZlX2hpZ2hfbG93ID0gcC0+YWN0aXZlX2hpZ2hfbG93OwotCQlsaW5rLT5pcnEucmVzb3VyY2VfdHlwZSA9IEFDUElfUlNUWVBFX0VYVF9JUlE7Ci0JCWJyZWFrOwotCX0KIAlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAKLQkJCSJSZXNvdXJjZSBpcyBub3QgYW4gSVJRIGVudHJ5XG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiUmVzb3VyY2UgaXMgbm90IGFuIElSUSBlbnRyeVxuIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9DVFJMX1RFUk1JTkFURSk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9wY2lfbGlua19nZXRfcG9zc2libGUgKAotCXN0cnVjdCBhY3BpX3BjaV9saW5rCSpsaW5rKQorc3RhdGljIGludCBhY3BpX3BjaV9saW5rX2dldF9wb3NzaWJsZShzdHJ1Y3QgYWNwaV9wY2lfbGluayAqbGluaykKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2xpbmtfZ2V0X3Bvc3NpYmxlIik7CiAKQEAgLTE4MSw2MiArMTgxLDYwIEBACiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAogCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMobGluay0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fUFJTLAotCQkJYWNwaV9wY2lfbGlua19jaGVja19wb3NzaWJsZSwgbGluayk7CisJCQkJICAgICBhY3BpX3BjaV9saW5rX2NoZWNrX3Bvc3NpYmxlLCBsaW5rKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkVycm9yIGV2YWx1YXRpbmcgX1BSU1xuIikpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAKLQkJIkZvdW5kICVkIHBvc3NpYmxlIElSUXNcbiIsIGxpbmstPmlycS5wb3NzaWJsZV9jb3VudCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIkZvdW5kICVkIHBvc3NpYmxlIElSUXNcbiIsCisJCQkgIGxpbmstPmlycS5wb3NzaWJsZV9jb3VudCkpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9wY2lfbGlua19jaGVja19jdXJyZW50ICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZQkqcmVzb3VyY2UsCi0Jdm9pZAkJCSpjb250ZXh0KQorYWNwaV9wY2lfbGlua19jaGVja19jdXJyZW50KHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwgdm9pZCAqY29udGV4dCkKIHsKLQlpbnQJCQkqaXJxID0gKGludCAqKSBjb250ZXh0OworCWludCAqaXJxID0gKGludCAqKWNvbnRleHQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9saW5rX2NoZWNrX2N1cnJlbnQiKTsKIAogCXN3aXRjaCAocmVzb3VyY2UtPmlkKSB7CiAJY2FzZSBBQ1BJX1JTVFlQRV9JUlE6Ci0JewotCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgKnAgPSAmcmVzb3VyY2UtPmRhdGEuaXJxOwotCQlpZiAoIXAgfHwgIXAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKSB7Ci0JCQkvKgotCQkJICogSVJRIGRlc2NyaXB0b3JzIG1heSBoYXZlIG5vIElSUSMgYml0cyBzZXQsCi0JCQkgKiBwYXJ0aWN1bGFybHkgdGhvc2UgdGhvc2Ugdy8gX1NUQSBkaXNhYmxlZAotCQkJICovCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJIkJsYW5rIElSUSByZXNvdXJjZVxuIikpOyAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCXsKKwkJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSAqcCA9ICZyZXNvdXJjZS0+ZGF0YS5pcnE7CisJCQlpZiAoIXAgfHwgIXAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKSB7CisJCQkJLyoKKwkJCQkgKiBJUlEgZGVzY3JpcHRvcnMgbWF5IGhhdmUgbm8gSVJRIyBiaXRzIHNldCwKKwkJCQkgKiBwYXJ0aWN1bGFybHkgdGhvc2UgdGhvc2Ugdy8gX1NUQSBkaXNhYmxlZAorCQkJCSAqLworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJCSAgIkJsYW5rIElSUSByZXNvdXJjZVxuIikpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCQl9CisJCQkqaXJxID0gcC0+aW50ZXJydXB0c1swXTsKKwkJCWJyZWFrOwogCQl9Ci0JCSppcnEgPSBwLT5pbnRlcnJ1cHRzWzBdOwotCQlicmVhazsKLQl9CiAJY2FzZSBBQ1BJX1JTVFlQRV9FWFRfSVJROgotCXsKLQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSAqcCA9ICZyZXNvdXJjZS0+ZGF0YS5leHRlbmRlZF9pcnE7Ci0JCWlmICghcCB8fCAhcC0+bnVtYmVyX29mX2ludGVycnVwdHMpIHsKLQkJCS8qCi0JCQkgKiBleHRlbmRlZCBJUlEgZGVzY3JpcHRvcnMgbXVzdAotCQkJICogcmV0dXJuIGF0IGxlYXN0IDEgSVJRCi0JCQkgKi8KLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKLQkJCQkiQmxhbmsgRVhUIElSUSByZXNvdXJjZVxuIikpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJeworCQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSAqcCA9CisJCQkgICAgJnJlc291cmNlLT5kYXRhLmV4dGVuZGVkX2lycTsKKwkJCWlmICghcCB8fCAhcC0+bnVtYmVyX29mX2ludGVycnVwdHMpIHsKKwkJCQkvKgorCQkJCSAqIGV4dGVuZGVkIElSUSBkZXNjcmlwdG9ycyBtdXN0CisJCQkJICogcmV0dXJuIGF0IGxlYXN0IDEgSVJRCisJCQkJICovCisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCQkJICAiQmxhbmsgRVhUIElSUSByZXNvdXJjZVxuIikpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCQl9CisJCQkqaXJxID0gcC0+aW50ZXJydXB0c1swXTsKKwkJCWJyZWFrOwogCQl9Ci0JCSppcnEgPSBwLT5pbnRlcnJ1cHRzWzBdOwotCQlicmVhazsKLQl9CiAJZGVmYXVsdDoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJSZXNvdXJjZSBpc24ndCBhbiBJUlFcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIlJlc291cmNlIGlzbid0IGFuIElSUVxuIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQ1RSTF9URVJNSU5BVEUpOwpAQCAtMjQ5LDEzICsyNDcsMTEgQEAKICAqIDAgLSBzdWNjZXNzCiAgKiAhMCAtIGZhaWx1cmUKICAqLwotc3RhdGljIGludAotYWNwaV9wY2lfbGlua19nZXRfY3VycmVudCAoCi0Jc3RydWN0IGFjcGlfcGNpX2xpbmsJKmxpbmspCitzdGF0aWMgaW50IGFjcGlfcGNpX2xpbmtfZ2V0X2N1cnJlbnQoc3RydWN0IGFjcGlfcGNpX2xpbmsgKmxpbmspCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JaW50CQkJaXJxID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlpbnQgaXJxID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2xpbmtfZ2V0X2N1cnJlbnQiKTsKIApAQCAtMjY5LDcgKzI2NSw4IEBACiAJCS8qIFF1ZXJ5IF9TVEEsIHNldCBsaW5rLT5kZXZpY2UtPnN0YXR1cyAqLwogCQlyZXN1bHQgPSBhY3BpX2J1c19nZXRfc3RhdHVzKGxpbmstPmRldmljZSk7CiAJCWlmIChyZXN1bHQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJVbmFibGUgdG8gcmVhZCBzdGF0dXNcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIlVuYWJsZSB0byByZWFkIHN0YXR1c1xuIikpOwogCQkJZ290byBlbmQ7CiAJCX0KIApAQCAtMjg0LDcgKzI4MSw3IEBACiAJICovCiAKIAlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGxpbmstPmhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKLQkJCWFjcGlfcGNpX2xpbmtfY2hlY2tfY3VycmVudCwgJmlycSk7CisJCQkJICAgICBhY3BpX3BjaV9saW5rX2NoZWNrX2N1cnJlbnQsICZpcnEpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRXJyb3IgZXZhbHVhdGluZyBfQ1JTXG4iKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CkBAIC0zMDAsNTggKzI5Nyw2MSBAQAogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTGluayBhdCBJUlEgJWQgXG4iLCBsaW5rLT5pcnEuYWN0aXZlKSk7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotc3RhdGljIGludAotYWNwaV9wY2lfbGlua19zZXQgKAotCXN0cnVjdCBhY3BpX3BjaV9saW5rCSpsaW5rLAotCWludAkJCWlycSkKK3N0YXRpYyBpbnQgYWNwaV9wY2lfbGlua19zZXQoc3RydWN0IGFjcGlfcGNpX2xpbmsgKmxpbmssIGludCBpcnEpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJc3RydWN0IHsKLQkJc3RydWN0IGFjcGlfcmVzb3VyY2UJcmVzOwotCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZQllbmQ7Ci0JfSAgICAqcmVzb3VyY2U7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHswLCBOVUxMfTsKKwkJc3RydWN0IGFjcGlfcmVzb3VyY2UgcmVzOworCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSBlbmQ7CisJfSAqcmVzb3VyY2U7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgMCwgTlVMTCB9OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfbGlua19zZXQiKTsKIAogCWlmICghbGluayB8fCAhaXJxKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlyZXNvdXJjZSA9IGttYWxsb2MoIHNpemVvZigqcmVzb3VyY2UpKzEsIEdGUF9LRVJORUwpOwotCWlmKCFyZXNvdXJjZSkKKwlyZXNvdXJjZSA9IGttYWxsb2Moc2l6ZW9mKCpyZXNvdXJjZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc291cmNlKQogCQlyZXR1cm5fVkFMVUUoLUVOT01FTSk7CiAKLQltZW1zZXQocmVzb3VyY2UsIDAsIHNpemVvZigqcmVzb3VyY2UpKzEpOwotCWJ1ZmZlci5sZW5ndGggPSBzaXplb2YoKnJlc291cmNlKSArMTsKKwltZW1zZXQocmVzb3VyY2UsIDAsIHNpemVvZigqcmVzb3VyY2UpICsgMSk7CisJYnVmZmVyLmxlbmd0aCA9IHNpemVvZigqcmVzb3VyY2UpICsgMTsKIAlidWZmZXIucG9pbnRlciA9IHJlc291cmNlOwogCi0Jc3dpdGNoKGxpbmstPmlycS5yZXNvdXJjZV90eXBlKSB7CisJc3dpdGNoIChsaW5rLT5pcnEucmVzb3VyY2VfdHlwZSkgewogCWNhc2UgQUNQSV9SU1RZUEVfSVJROgogCQlyZXNvdXJjZS0+cmVzLmlkID0gQUNQSV9SU1RZUEVfSVJROwogCQlyZXNvdXJjZS0+cmVzLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSk7CiAJCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuZWRnZV9sZXZlbCA9IGxpbmstPmlycS5lZGdlX2xldmVsOwotCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLmFjdGl2ZV9oaWdoX2xvdyA9IGxpbmstPmlycS5hY3RpdmVfaGlnaF9sb3c7CisJCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuYWN0aXZlX2hpZ2hfbG93ID0KKwkJICAgIGxpbmstPmlycS5hY3RpdmVfaGlnaF9sb3c7CiAJCWlmIChsaW5rLT5pcnEuZWRnZV9sZXZlbCA9PSBBQ1BJX0VER0VfU0VOU0lUSVZFKQotCQkJcmVzb3VyY2UtPnJlcy5kYXRhLmlycS5zaGFyZWRfZXhjbHVzaXZlID0gQUNQSV9FWENMVVNJVkU7CisJCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgPQorCQkJICAgIEFDUElfRVhDTFVTSVZFOwogCQllbHNlCiAJCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgPSBBQ1BJX1NIQVJFRDsKIAkJcmVzb3VyY2UtPnJlcy5kYXRhLmlycS5udW1iZXJfb2ZfaW50ZXJydXB0cyA9IDE7CiAJCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuaW50ZXJydXB0c1swXSA9IGlycTsKIAkJYnJlYWs7Ci0JICAgCisKIAljYXNlIEFDUElfUlNUWVBFX0VYVF9JUlE6CiAJCXJlc291cmNlLT5yZXMuaWQgPSBBQ1BJX1JTVFlQRV9FWFRfSVJROwogCQlyZXNvdXJjZS0+cmVzLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSk7Ci0JCXJlc291cmNlLT5yZXMuZGF0YS5leHRlbmRlZF9pcnEucHJvZHVjZXJfY29uc3VtZXIgPSBBQ1BJX0NPTlNVTUVSOwotCQlyZXNvdXJjZS0+cmVzLmRhdGEuZXh0ZW5kZWRfaXJxLmVkZ2VfbGV2ZWwgPSBsaW5rLT5pcnEuZWRnZV9sZXZlbDsKLQkJcmVzb3VyY2UtPnJlcy5kYXRhLmV4dGVuZGVkX2lycS5hY3RpdmVfaGlnaF9sb3cgPSBsaW5rLT5pcnEuYWN0aXZlX2hpZ2hfbG93OworCQlyZXNvdXJjZS0+cmVzLmRhdGEuZXh0ZW5kZWRfaXJxLnByb2R1Y2VyX2NvbnN1bWVyID0KKwkJICAgIEFDUElfQ09OU1VNRVI7CisJCXJlc291cmNlLT5yZXMuZGF0YS5leHRlbmRlZF9pcnEuZWRnZV9sZXZlbCA9CisJCSAgICBsaW5rLT5pcnEuZWRnZV9sZXZlbDsKKwkJcmVzb3VyY2UtPnJlcy5kYXRhLmV4dGVuZGVkX2lycS5hY3RpdmVfaGlnaF9sb3cgPQorCQkgICAgbGluay0+aXJxLmFjdGl2ZV9oaWdoX2xvdzsKIAkJaWYgKGxpbmstPmlycS5lZGdlX2xldmVsID09IEFDUElfRURHRV9TRU5TSVRJVkUpCi0JCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgPSBBQ1BJX0VYQ0xVU0lWRTsKKwkJCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSA9CisJCQkgICAgQUNQSV9FWENMVVNJVkU7CiAJCWVsc2UKIAkJCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSA9IEFDUElfU0hBUkVEOwogCQlyZXNvdXJjZS0+cmVzLmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzID0gMTsKQEAgLTM4NCw5ICszODQsOSBAQAogCX0KIAlpZiAoIWxpbmstPmRldmljZS0+c3RhdHVzLmVuYWJsZWQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKLQkJCSIlcyBbJXNdIGRpc2FibGVkIGFuZCByZWZlcmVuY2VkLCBCSU9TIGJ1Zy5cbiIsCi0JCQlhY3BpX2RldmljZV9uYW1lKGxpbmstPmRldmljZSksCi0JCQlhY3BpX2RldmljZV9iaWQobGluay0+ZGV2aWNlKSk7CisJCSAgICAgICAiJXMgWyVzXSBkaXNhYmxlZCBhbmQgcmVmZXJlbmNlZCwgQklPUyBidWcuXG4iLAorCQkgICAgICAgYWNwaV9kZXZpY2VfbmFtZShsaW5rLT5kZXZpY2UpLAorCQkgICAgICAgYWNwaV9kZXZpY2VfYmlkKGxpbmstPmRldmljZSkpOwogCX0KIAogCS8qIFF1ZXJ5IF9DUlMsIHNldCBsaW5rLT5pcnEuYWN0aXZlICovCkBAIC00MDQsMjIgKzQwNCwyMCBAQAogCQkgKiBwb2xpY3k6IHdoZW4gX0NSUyBkb2Vzbid0IHJldHVybiB3aGF0IHdlIGp1c3QgX1NSUwogCQkgKiBhc3N1bWUgX1NSUyB3b3JrZWQgYW5kIG92ZXJyaWRlIF9DUlMgdmFsdWUuCiAJCSAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAKLQkJCSIlcyBbJXNdIEJJT1MgcmVwb3J0ZWQgSVJRICVkLCB1c2luZyBJUlEgJWRcbiIsCi0JCQlhY3BpX2RldmljZV9uYW1lKGxpbmstPmRldmljZSksCi0JCQlhY3BpX2RldmljZV9iaWQobGluay0+ZGV2aWNlKSwKLQkJCWxpbmstPmlycS5hY3RpdmUsIGlycSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCSAgICAgICAiJXMgWyVzXSBCSU9TIHJlcG9ydGVkIElSUSAlZCwgdXNpbmcgSVJRICVkXG4iLAorCQkgICAgICAgYWNwaV9kZXZpY2VfbmFtZShsaW5rLT5kZXZpY2UpLAorCQkgICAgICAgYWNwaV9kZXZpY2VfYmlkKGxpbmstPmRldmljZSksIGxpbmstPmlycS5hY3RpdmUsIGlycSk7CiAJCWxpbmstPmlycS5hY3RpdmUgPSBpcnE7CiAJfQogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiU2V0IElSUSAlZFxuIiwgbGluay0+aXJxLmFjdGl2ZSkpOwotCQotZW5kOgorCisgICAgICBlbmQ6CiAJa2ZyZWUocmVzb3VyY2UpOwogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJIExpbmsgSVJRIE1hbmFnZW1lbnQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00NjksOCArNDY3LDggQEAKIAlQSVJRX1BFTkFMVFlfSVNBX0FMV0FZUywJLyogSVJRMCB0aW1lciAqLwogCVBJUlFfUEVOQUxUWV9JU0FfQUxXQVlTLAkvKiBJUlExIGtleWJvYXJkICovCiAJUElSUV9QRU5BTFRZX0lTQV9BTFdBWVMsCS8qIElSUTIgY2FzY2FkZSAqLwotCVBJUlFfUEVOQUxUWV9JU0FfVFlQSUNBTCwJLyogSVJRMwlzZXJpYWwgKi8KLQlQSVJRX1BFTkFMVFlfSVNBX1RZUElDQUwsCS8qIElSUTQJc2VyaWFsICovCisJUElSUV9QRU5BTFRZX0lTQV9UWVBJQ0FMLAkvKiBJUlEzIHNlcmlhbCAqLworCVBJUlFfUEVOQUxUWV9JU0FfVFlQSUNBTCwJLyogSVJRNCBzZXJpYWwgKi8KIAlQSVJRX1BFTkFMVFlfSVNBX1RZUElDQUwsCS8qIElSUTUgc29tZXRpbWVzIFNvdW5kQmxhc3RlciAqLwogCVBJUlFfUEVOQUxUWV9JU0FfVFlQSUNBTCwJLyogSVJRNiAqLwogCVBJUlFfUEVOQUxUWV9JU0FfVFlQSUNBTCwJLyogSVJRNyBwYXJhbGxlbCwgc3B1cmlvdXMgKi8KQEAgLTQ4MiwxNSArNDgwLDE0IEBACiAJUElSUV9QRU5BTFRZX0lTQV9VU0VELAkvKiBJUlExMyBmcGUsIHNvbWV0aW1lcyAqLwogCVBJUlFfUEVOQUxUWV9JU0FfVVNFRCwJLyogSVJRMTQgaWRlMCAqLwogCVBJUlFfUEVOQUxUWV9JU0FfVVNFRCwJLyogSVJRMTUgaWRlMSAqLwotCQkJLyogPklSUTE1ICovCisJLyogPklSUTE1ICovCiB9OwogCi1pbnQgX19pbml0Ci1hY3BpX2lycV9wZW5hbHR5X2luaXQodm9pZCkKK2ludCBfX2luaXQgYWNwaV9pcnFfcGVuYWx0eV9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZAkqbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfcGNpX2xpbmsgICAgKmxpbmsgPSBOVUxMOwotCWludAkJCWkgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUgPSBOVUxMOworCXN0cnVjdCBhY3BpX3BjaV9saW5rICpsaW5rID0gTlVMTDsKKwlpbnQgaSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2lycV9wZW5hbHR5X2luaXQiKTsKIApAQCAtNTAxLDcgKzQ5OCw4IEBACiAKIAkJbGluayA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGFjcGlfcGNpX2xpbmssIG5vZGUpOwogCQlpZiAoIWxpbmspIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGxpbmsgY29udGV4dFxuIikpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiSW52YWxpZCBsaW5rIGNvbnRleHRcbiIpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTUxMCwxNSArNTA4LDIwIEBACiAJCSAqIHVzZWZ1bCBmb3IgYnJlYWtpbmcgdGllcy4KIAkJICovCiAJCWlmIChsaW5rLT5pcnEucG9zc2libGVfY291bnQpIHsKLQkJCWludCBwZW5hbHR5ID0gUElSUV9QRU5BTFRZX1BDSV9QT1NTSUJMRSAvIGxpbmstPmlycS5wb3NzaWJsZV9jb3VudDsKKwkJCWludCBwZW5hbHR5ID0KKwkJCSAgICBQSVJRX1BFTkFMVFlfUENJX1BPU1NJQkxFIC8KKwkJCSAgICBsaW5rLT5pcnEucG9zc2libGVfY291bnQ7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCBsaW5rLT5pcnEucG9zc2libGVfY291bnQ7IGkrKykgewogCQkJCWlmIChsaW5rLT5pcnEucG9zc2libGVbaV0gPCBBQ1BJX01BWF9JU0FfSVJRKQotCQkJCQlhY3BpX2lycV9wZW5hbHR5W2xpbmstPmlycS5wb3NzaWJsZVtpXV0gKz0gcGVuYWx0eTsKKwkJCQkJYWNwaV9pcnFfcGVuYWx0eVtsaW5rLT5pcnEuCisJCQkJCQkJIHBvc3NpYmxlW2ldXSArPQorCQkJCQkgICAgcGVuYWx0eTsKIAkJCX0KIAogCQl9IGVsc2UgaWYgKGxpbmstPmlycS5hY3RpdmUpIHsKLQkJCWFjcGlfaXJxX3BlbmFsdHlbbGluay0+aXJxLmFjdGl2ZV0gKz0gUElSUV9QRU5BTFRZX1BDSV9QT1NTSUJMRTsKKwkJCWFjcGlfaXJxX3BlbmFsdHlbbGluay0+aXJxLmFjdGl2ZV0gKz0KKwkJCSAgICBQSVJRX1BFTkFMVFlfUENJX1BPU1NJQkxFOwogCQl9CiAJfQogCS8qIEFkZCBhIHBlbmFsdHkgZm9yIHRoZSBTQ0kgKi8KQEAgLTUyOSwxMSArNTMyLDEwIEBACiAKIHN0YXRpYyBpbnQgYWNwaV9pcnFfYmFsYW5jZTsJLyogMDogc3RhdGljLCAxOiBiYWxhbmNlICovCiAKLXN0YXRpYyBpbnQgYWNwaV9wY2lfbGlua19hbGxvY2F0ZSgKLQlzdHJ1Y3QgYWNwaV9wY2lfbGluawkqbGluaykKK3N0YXRpYyBpbnQgYWNwaV9wY2lfbGlua19hbGxvY2F0ZShzdHJ1Y3QgYWNwaV9wY2lfbGluayAqbGluaykKIHsKLQlpbnQJCQlpcnE7Ci0JaW50CQkJaTsKKwlpbnQgaXJxOworCWludCBpOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfbGlua19hbGxvY2F0ZSIpOwogCkBAIC01NTcsNyArNTU5LDcgQEAKIAlpZiAoaSA9PSBsaW5rLT5pcnEucG9zc2libGVfY291bnQpIHsKIAkJaWYgKGFjcGlfc3RyaWN0KQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIl9DUlMgJWQgbm90IGZvdW5kIgotCQkJCSIgaW4gX1BSU1xuIiwgbGluay0+aXJxLmFjdGl2ZSk7CisJCQkgICAgICAgIiBpbiBfUFJTXG4iLCBsaW5rLT5pcnEuYWN0aXZlKTsKIAkJbGluay0+aXJxLmFjdGl2ZSA9IDA7CiAJfQogCkBAIC01NzYsMjMgKzU3OCwyNSBAQAogCQkgKiB0aGUgdXNlIG9mIElSUXMgOSwgMTAsIDExLCBhbmQgPjE1LgogCQkgKi8KIAkJZm9yIChpID0gKGxpbmstPmlycS5wb3NzaWJsZV9jb3VudCAtIDEpOyBpID49IDA7IGktLSkgewotCQkJaWYgKGFjcGlfaXJxX3BlbmFsdHlbaXJxXSA+IGFjcGlfaXJxX3BlbmFsdHlbbGluay0+aXJxLnBvc3NpYmxlW2ldXSkKKwkJCWlmIChhY3BpX2lycV9wZW5hbHR5W2lycV0gPgorCQkJICAgIGFjcGlfaXJxX3BlbmFsdHlbbGluay0+aXJxLnBvc3NpYmxlW2ldXSkKIAkJCQlpcnEgPSBsaW5rLT5pcnEucG9zc2libGVbaV07CiAJCX0KIAl9CiAKIAkvKiBBdHRlbXB0IHRvIGVuYWJsZSB0aGUgbGluayBkZXZpY2UgYXQgdGhpcyBJUlEuICovCiAJaWYgKGFjcGlfcGNpX2xpbmtfc2V0KGxpbmssIGlycSkpIHsKLQkJcHJpbnRrKFBSRUZJWCAiVW5hYmxlIHRvIHNldCBJUlEgZm9yICVzIFslc10gKGxpa2VseSBidWdneSBBQ1BJIEJJT1MpLlxuIgotCQkJCSJUcnkgcGNpPW5vYWNwaSBvciBhY3BpPW9mZlxuIiwKLQkJCWFjcGlfZGV2aWNlX25hbWUobGluay0+ZGV2aWNlKSwKLQkJCWFjcGlfZGV2aWNlX2JpZChsaW5rLT5kZXZpY2UpKTsKKwkJcHJpbnRrKFBSRUZJWAorCQkgICAgICAgIlVuYWJsZSB0byBzZXQgSVJRIGZvciAlcyBbJXNdIChsaWtlbHkgYnVnZ3kgQUNQSSBCSU9TKS5cbiIKKwkJICAgICAgICJUcnkgcGNpPW5vYWNwaSBvciBhY3BpPW9mZlxuIiwKKwkJICAgICAgIGFjcGlfZGV2aWNlX25hbWUobGluay0+ZGV2aWNlKSwKKwkJICAgICAgIGFjcGlfZGV2aWNlX2JpZChsaW5rLT5kZXZpY2UpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0gZWxzZSB7CiAJCWFjcGlfaXJxX3BlbmFsdHlbbGluay0+aXJxLmFjdGl2ZV0gKz0gUElSUV9QRU5BTFRZX1BDSV9VU0lORzsKLQkJcHJpbnRrKFBSRUZJWCAiJXMgWyVzXSBlbmFibGVkIGF0IElSUSAlZFxuIiwgCi0JCQlhY3BpX2RldmljZV9uYW1lKGxpbmstPmRldmljZSksCi0JCQlhY3BpX2RldmljZV9iaWQobGluay0+ZGV2aWNlKSwgbGluay0+aXJxLmFjdGl2ZSk7CisJCXByaW50ayhQUkVGSVggIiVzIFslc10gZW5hYmxlZCBhdCBJUlEgJWRcbiIsCisJCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGxpbmstPmRldmljZSksCisJCSAgICAgICBhY3BpX2RldmljZV9iaWQobGluay0+ZGV2aWNlKSwgbGluay0+aXJxLmFjdGl2ZSk7CiAJfQogCiAJbGluay0+aXJxLmluaXRpYWxpemVkID0gMTsKQEAgLTYwNywxNiArNjExLDEzIEBACiAgKi8KIAogaW50Ci1hY3BpX3BjaV9saW5rX2FsbG9jYXRlX2lycSAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQlpbnQJCQlpbmRleCwKLQlpbnQJCQkqZWRnZV9sZXZlbCwKLQlpbnQJCQkqYWN0aXZlX2hpZ2hfbG93LAotCWNoYXIJCQkqKm5hbWUpCithY3BpX3BjaV9saW5rX2FsbG9jYXRlX2lycShhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkgICBpbnQgaW5kZXgsCisJCQkgICBpbnQgKmVkZ2VfbGV2ZWwsIGludCAqYWN0aXZlX2hpZ2hfbG93LCBjaGFyICoqbmFtZSkKIHsKLQlpbnQgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9wY2lfbGluawkqbGluayA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOworCXN0cnVjdCBhY3BpX3BjaV9saW5rICpsaW5rID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2xpbmtfYWxsb2NhdGVfaXJxIik7CiAKQEAgLTYyNiw3ICs2MjcsNyBAQAogCQlyZXR1cm5fVkFMVUUoLTEpOwogCX0KIAotCWxpbmsgPSAoc3RydWN0IGFjcGlfcGNpX2xpbmsgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCWxpbmsgPSAoc3RydWN0IGFjcGlfcGNpX2xpbmsgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAJaWYgKCFsaW5rKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGxpbmsgY29udGV4dFxuIikpOwogCQlyZXR1cm5fVkFMVUUoLTEpOwpAQCAtNjQzLDIwICs2NDQsMjQgQEAKIAkJdXAoJmFjcGlfbGlua19sb2NrKTsKIAkJcmV0dXJuX1ZBTFVFKC0xKTsKIAl9Ci0JICAgCisKIAlpZiAoIWxpbmstPmlycS5hY3RpdmUpIHsKIAkJdXAoJmFjcGlfbGlua19sb2NrKTsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkxpbmsgYWN0aXZlIElSUSBpcyAwIVxuIikpOwogCQlyZXR1cm5fVkFMVUUoLTEpOwogCX0KLQlsaW5rLT5yZWZjbnQgKys7CisJbGluay0+cmVmY250Kys7CiAJdXAoJmFjcGlfbGlua19sb2NrKTsKIAotCWlmIChlZGdlX2xldmVsKSAqZWRnZV9sZXZlbCA9IGxpbmstPmlycS5lZGdlX2xldmVsOwotCWlmIChhY3RpdmVfaGlnaF9sb3cpICphY3RpdmVfaGlnaF9sb3cgPSBsaW5rLT5pcnEuYWN0aXZlX2hpZ2hfbG93OwotCWlmIChuYW1lKSAqbmFtZSA9IGFjcGlfZGV2aWNlX2JpZChsaW5rLT5kZXZpY2UpOworCWlmIChlZGdlX2xldmVsKQorCQkqZWRnZV9sZXZlbCA9IGxpbmstPmlycS5lZGdlX2xldmVsOworCWlmIChhY3RpdmVfaGlnaF9sb3cpCisJCSphY3RpdmVfaGlnaF9sb3cgPSBsaW5rLT5pcnEuYWN0aXZlX2hpZ2hfbG93OworCWlmIChuYW1lKQorCQkqbmFtZSA9IGFjcGlfZGV2aWNlX2JpZChsaW5rLT5kZXZpY2UpOwogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJIkxpbmsgJXMgaXMgcmVmZXJlbmNlZFxuIiwgYWNwaV9kZXZpY2VfYmlkKGxpbmstPmRldmljZSkpKTsKKwkJCSAgIkxpbmsgJXMgaXMgcmVmZXJlbmNlZFxuIiwKKwkJCSAgYWNwaV9kZXZpY2VfYmlkKGxpbmstPmRldmljZSkpKTsKIAlyZXR1cm5fVkFMVUUobGluay0+aXJxLmFjdGl2ZSk7CiB9CiAKQEAgLTY2NCwxMiArNjY5LDExIEBACiAgKiBXZSBkb24ndCBjaGFuZ2UgbGluaydzIGlycSBpbmZvcm1hdGlvbiBoZXJlLiAgQWZ0ZXIgaXQgaXMgcmVlbmFibGVkLCB3ZQogICogY29udGludWUgdXNlIHRoZSBpbmZvCiAgKi8KLWludAotYWNwaV9wY2lfbGlua19mcmVlX2lycShhY3BpX2hhbmRsZSBoYW5kbGUpCitpbnQgYWNwaV9wY2lfbGlua19mcmVlX2lycShhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOwotCXN0cnVjdCBhY3BpX3BjaV9saW5rCSpsaW5rID0gTlVMTDsKLQlhY3BpX3N0YXR1cwkJcmVzdWx0OworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wY2lfbGluayAqbGluayA9IE5VTEw7CisJYWNwaV9zdGF0dXMgcmVzdWx0OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfbGlua19mcmVlX2lycSIpOwogCkBAIC02NzksNyArNjgzLDcgQEAKIAkJcmV0dXJuX1ZBTFVFKC0xKTsKIAl9CiAKLQlsaW5rID0gKHN0cnVjdCBhY3BpX3BjaV9saW5rICopIGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKwlsaW5rID0gKHN0cnVjdCBhY3BpX3BjaV9saW5rICopYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCWlmICghbGluaykgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBsaW5rIGNvbnRleHRcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC0xKTsKQEAgLTY5MSw3ICs2OTUsNiBAQAogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiTGluayBpc24ndCBpbml0aWFsaXplZFxuIikpOwogCQlyZXR1cm5fVkFMVUUoLTEpOwogCX0KLQogI2lmZGVmCUZVVFVSRV9VU0UKIAkvKgogCSAqIFRoZSBMaW5rIHJlZmVyZW5jZSBjb3VudCBhbGxvd3MgdXMgdG8gX0RJU2FibGUgYW4gdW51c2VkIGxpbmsKQEAgLTcwMiwxMCArNzA1LDExIEBACiAJICogdG8gcHJldmVudCBkdXBsaWNhdGUgYWNwaV9wY2lfbGlua19zZXQoKQogCSAqIHdoaWNoIHdvdWxkIGhhcm0gc29tZSBzeXN0ZW1zCiAJICovCi0JbGluay0+cmVmY250IC0tOworCWxpbmstPnJlZmNudC0tOwogI2VuZGlmCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkiTGluayAlcyBpcyBkZXJlZmVyZW5jZWRcbiIsIGFjcGlfZGV2aWNlX2JpZChsaW5rLT5kZXZpY2UpKSk7CisJCQkgICJMaW5rICVzIGlzIGRlcmVmZXJlbmNlZFxuIiwKKwkJCSAgYWNwaV9kZXZpY2VfYmlkKGxpbmstPmRldmljZSkpKTsKIAogCWlmIChsaW5rLT5yZWZjbnQgPT0gMCkgewogCQlhY3BpX3V0X2V2YWx1YXRlX29iamVjdChsaW5rLT5oYW5kbGUsICJfRElTIiwgMCwgTlVMTCk7CkBAIC03MTMsMTggKzcxNywxNyBAQAogCXVwKCZhY3BpX2xpbmtfbG9jayk7CiAJcmV0dXJuX1ZBTFVFKGxpbmstPmlycS5hY3RpdmUpOwogfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyIEludGVyZmFjZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludAotYWNwaV9wY2lfbGlua19hZGQgKAotCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3BjaV9saW5rX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX3BjaV9saW5rCSpsaW5rID0gTlVMTDsKLQlpbnQJCQlpID0gMDsKLQlpbnQJCQlmb3VuZCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfcGNpX2xpbmsgKmxpbmsgPSBOVUxMOworCWludCBpID0gMDsKKwlpbnQgZm91bmQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfbGlua19hZGQiKTsKIApAQCAtNzUxLDEzICs3NTQsMTIgQEAKIAlhY3BpX3BjaV9saW5rX2dldF9jdXJyZW50KGxpbmspOwogCiAJcHJpbnRrKFBSRUZJWCAiJXMgWyVzXSAoSVJRcyIsIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwKLQkJYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpOworCSAgICAgICBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSk7CiAJZm9yIChpID0gMDsgaSA8IGxpbmstPmlycS5wb3NzaWJsZV9jb3VudDsgaSsrKSB7CiAJCWlmIChsaW5rLT5pcnEuYWN0aXZlID09IGxpbmstPmlycS5wb3NzaWJsZVtpXSkgewogCQkJcHJpbnRrKCIgKiVkIiwgbGluay0+aXJxLnBvc3NpYmxlW2ldKTsKIAkJCWZvdW5kID0gMTsKLQkJfQotCQllbHNlCisJCX0gZWxzZQogCQkJcHJpbnRrKCIgJWQiLCBsaW5rLT5pcnEucG9zc2libGVbaV0pOwogCX0KIApAQCAtNzY2LDcgKzc2OCw3IEBACiAJaWYgKCFmb3VuZCkKIAkJcHJpbnRrKCIgKiVkIiwgbGluay0+aXJxLmFjdGl2ZSk7CiAKLQlpZighbGluay0+ZGV2aWNlLT5zdGF0dXMuZW5hYmxlZCkKKwlpZiAoIWxpbmstPmRldmljZS0+c3RhdHVzLmVuYWJsZWQpCiAJCXByaW50aygiLCBkaXNhYmxlZC4iKTsKIAogCXByaW50aygiXG4iKTsKQEAgLTc3NSw3ICs3NzcsNyBAQAogCWxpc3RfYWRkX3RhaWwoJmxpbmstPm5vZGUsICZhY3BpX2xpbmsuZW50cmllcyk7CiAJYWNwaV9saW5rLmNvdW50Kys7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAkvKiBkaXNhYmxlIGFsbCBsaW5rcyAtLSB0byBiZSBhY3RpdmF0ZWQgb24gdXNlICovCiAJYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QobGluay0+aGFuZGxlLCAiX0RJUyIsIDAsIE5VTEwpOwogCXVwKCZhY3BpX2xpbmtfbG9jayk7CkBAIC03ODYsOSArNzg4LDcgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotc3RhdGljIGludAotYWNwaV9wY2lfbGlua19yZXN1bWUoCi0Jc3RydWN0IGFjcGlfcGNpX2xpbmsgKmxpbmspCitzdGF0aWMgaW50IGFjcGlfcGNpX2xpbmtfcmVzdW1lKHN0cnVjdCBhY3BpX3BjaV9saW5rICpsaW5rKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2xpbmtfcmVzdW1lIik7CiAKQEAgLTgwMywxMiArODAzLDEwIEBACiAgKiBhZnRlciBldmVyeSBkZXZpY2UgY2FsbHMgcGNpX2Rpc2FibGVfZGV2aWNlIGluIC5yZXN1bWUuCiAgKi8KIGludCBhY3BpX2luX3Jlc3VtZTsKLXN0YXRpYyBpbnQKLWlycXJvdXRlcl9yZXN1bWUoCi0Jc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaXJxcm91dGVyX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICpub2RlID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9wY2lfbGluayAgICAqbGluayA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfcGNpX2xpbmsgKmxpbmsgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiaXJxcm91dGVyX3Jlc3VtZSIpOwogCkBAIC04MTcsNyArODE1LDcgQEAKIAkJbGluayA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGFjcGlfcGNpX2xpbmssIG5vZGUpOwogCQlpZiAoIWxpbmspIHsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJIkludmFsaWQgbGluayBjb250ZXh0XG4iKSk7CisJCQkJCSAgIkludmFsaWQgbGluayBjb250ZXh0XG4iKSk7CiAJCQljb250aW51ZTsKIAkJfQogCQlhY3BpX3BjaV9saW5rX3Jlc3VtZShsaW5rKTsKQEAgLTgyNiwxMSArODI0LDcgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9wY2lfbGlua19yZW1vdmUgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCWludAkJCXR5cGUpCitzdGF0aWMgaW50IGFjcGlfcGNpX2xpbmtfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgYWNwaV9wY2lfbGluayAqbGluayA9IE5VTEw7CiAKQEAgLTgzOSw3ICs4MzMsNyBAQAogCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCWxpbmsgPSAoc3RydWN0IGFjcGlfcGNpX2xpbmsgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCWxpbmsgPSAoc3RydWN0IGFjcGlfcGNpX2xpbmsgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKIAlkb3duKCZhY3BpX2xpbmtfbG9jayk7CiAJbGlzdF9kZWwoJmxpbmstPm5vZGUpOwpAQCAtODYxLDE0ICs4NTUsMTQgQEAKIAkJaW50IHJldHZhbDsKIAkJaW50IGlycTsKIAotCQlyZXR2YWwgPSBnZXRfb3B0aW9uKCZzdHIsJmlycSk7CisJCXJldHZhbCA9IGdldF9vcHRpb24oJnN0ciwgJmlycSk7CiAKIAkJaWYgKCFyZXR2YWwpCiAJCQlicmVhazsJLyogbm8gbnVtYmVyIGZvdW5kICovCiAKIAkJaWYgKGlycSA8IDApCiAJCQljb250aW51ZTsKLQkJCisKIAkJaWYgKGlycSA+PSBBQ1BJX01BWF9JUlFTKQogCQkJY29udGludWU7CiAKQEAgLTkwNyw2ICs5MDEsNyBAQAogewogCXJldHVybiBhY3BpX2lycV9wZW5hbHR5X3VwZGF0ZShzdHIsIDEpOwogfQorCiBfX3NldHVwKCJhY3BpX2lycV9pc2E9IiwgYWNwaV9pcnFfaXNhKTsKIAogLyoKQEAgLTkxOCw2ICs5MTMsNyBAQAogewogCXJldHVybiBhY3BpX2lycV9wZW5hbHR5X3VwZGF0ZShzdHIsIDApOwogfQorCiBfX3NldHVwKCJhY3BpX2lycV9wY2k9IiwgYWNwaV9pcnFfcGNpKTsKIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9pcnFfbm9iYWxhbmNlX3NldChjaGFyICpzdHIpCkBAIC05MjUsNiArOTIxLDcgQEAKIAlhY3BpX2lycV9iYWxhbmNlID0gMDsKIAlyZXR1cm4gMTsKIH0KKwogX19zZXR1cCgiYWNwaV9pcnFfbm9iYWxhbmNlIiwgYWNwaV9pcnFfbm9iYWxhbmNlX3NldCk7CiAKIGludCBfX2luaXQgYWNwaV9pcnFfYmFsYW5jZV9zZXQoY2hhciAqc3RyKQpAQCAtOTMyLDIyICs5MjksMjAgQEAKIAlhY3BpX2lycV9iYWxhbmNlID0gMTsKIAlyZXR1cm4gMTsKIH0KLV9fc2V0dXAoImFjcGlfaXJxX2JhbGFuY2UiLCBhY3BpX2lycV9iYWxhbmNlX3NldCk7CiAKK19fc2V0dXAoImFjcGlfaXJxX2JhbGFuY2UiLCBhY3BpX2lycV9iYWxhbmNlX3NldCk7CiAKIC8qIEZJWE1FOiB3ZSB3aWxsIHJlbW92ZSB0aGlzIGludGVyZmFjZSBhZnRlciBhbGwgZHJpdmVycyBjYWxsIHBjaV9kaXNhYmxlX2RldmljZSAqLwogc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgaXJxcm91dGVyX3N5c2Rldl9jbGFzcyA9IHsKLSAgICAgICAgc2V0X2tzZXRfbmFtZSgiaXJxcm91dGVyIiksCi0gICAgICAgIC5yZXN1bWUgPSBpcnFyb3V0ZXJfcmVzdW1lLAorCXNldF9rc2V0X25hbWUoImlycXJvdXRlciIpLAorCS5yZXN1bWUgPSBpcnFyb3V0ZXJfcmVzdW1lLAogfTsKIAotCiBzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2lycXJvdXRlciA9IHsKLQkuaWQgICAgID0gMCwKLQkuY2xzICAgID0gJmlycXJvdXRlcl9zeXNkZXZfY2xhc3MsCisJLmlkID0gMCwKKwkuY2xzID0gJmlycXJvdXRlcl9zeXNkZXZfY2xhc3MsCiB9OwogCi0KIHN0YXRpYyBpbnQgX19pbml0IGlycXJvdXRlcl9pbml0X3N5c2ZzKHZvaWQpCiB7CiAJaW50IGVycm9yOwpAQCAtOTYyLDEyICs5NTcsMTEgQEAKIAkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV9pcnFyb3V0ZXIpOwogCiAJcmV0dXJuX1ZBTFVFKGVycm9yKTsKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9CiAKIGRldmljZV9pbml0Y2FsbChpcnFyb3V0ZXJfaW5pdF9zeXNmcyk7CiAKLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9wY2lfbGlua19pbml0ICh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9wY2lfbGlua19pbml0KHZvaWQpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfbGlua19pbml0Iik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKaW5kZXggNWQyZjc3Zi4uMGZkOTk4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKQEAgLTM1LDM1ICszNSwzMiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9QQ0lfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoInBjaV9yb290IikKLQorQUNQSV9NT0RVTEVfTkFNRSgicGNpX3Jvb3QiKQogI2RlZmluZSBBQ1BJX1BDSV9ST09UX0NMQVNTCQkicGNpX2JyaWRnZSIKICNkZWZpbmUgQUNQSV9QQ0lfUk9PVF9ISUQJCSJQTlAwQTAzIgogI2RlZmluZSBBQ1BJX1BDSV9ST09UX0RSSVZFUl9OQU1FCSJBQ1BJIFBDSSBSb290IEJyaWRnZSBEcml2ZXIiCiAjZGVmaW5lIEFDUElfUENJX1JPT1RfREVWSUNFX05BTUUJIlBDSSBSb290IEJyaWRnZSIKLQotc3RhdGljIGludCBhY3BpX3BjaV9yb290X2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX3BjaV9yb290X3JlbW92ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLXN0YXRpYyBpbnQgYWNwaV9wY2lfcm9vdF9zdGFydCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX3BjaV9yb290X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3RfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3Rfc3RhcnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfcGNpX3Jvb3RfZHJpdmVyID0gewotCS5uYW1lID0JCUFDUElfUENJX1JPT1RfRFJJVkVSX05BTUUsCi0JLmNsYXNzID0JQUNQSV9QQ0lfUk9PVF9DTEFTUywKLQkuaWRzID0JCUFDUElfUENJX1JPT1RfSElELAotCS5vcHMgPQkJewotCQkJCS5hZGQgPSAgICBhY3BpX3BjaV9yb290X2FkZCwKLQkJCQkucmVtb3ZlID0gYWNwaV9wY2lfcm9vdF9yZW1vdmUsCi0JCQkJLnN0YXJ0ID0gIGFjcGlfcGNpX3Jvb3Rfc3RhcnQsCi0JCQl9LAorCS5uYW1lID0gQUNQSV9QQ0lfUk9PVF9EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX1BDSV9ST09UX0NMQVNTLAorCS5pZHMgPSBBQ1BJX1BDSV9ST09UX0hJRCwKKwkub3BzID0geworCQkuYWRkID0gYWNwaV9wY2lfcm9vdF9hZGQsCisJCS5yZW1vdmUgPSBhY3BpX3BjaV9yb290X3JlbW92ZSwKKwkJLnN0YXJ0ID0gYWNwaV9wY2lfcm9vdF9zdGFydCwKKwkJfSwKIH07CiAKIHN0cnVjdCBhY3BpX3BjaV9yb290IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7Ci0JYWNwaV9oYW5kbGUJCWhhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9wY2lfaWQJaWQ7Ci0Jc3RydWN0IHBjaV9idXMJCSpidXM7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlzdHJ1Y3QgYWNwaV9wY2lfaWQgaWQ7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKIH07CiAKIHN0YXRpYyBMSVNUX0hFQUQoYWNwaV9wY2lfcm9vdHMpOwpAQCAtOTIsNiArODksNyBAQAogCiAJcmV0dXJuIG47CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9wY2lfcmVnaXN0ZXJfZHJpdmVyKTsKIAogdm9pZCBhY3BpX3BjaV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgYWNwaV9wY2lfZHJpdmVyICpkcml2ZXIpCkBAIC0xMTUsMTAgKzExMywxMSBAQAogCQlkcml2ZXItPnJlbW92ZShyb290LT5oYW5kbGUpOwogCX0KIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX3BjaV91bnJlZ2lzdGVyX2RyaXZlcik7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotZ2V0X3Jvb3RfYnJpZGdlX2J1c25yX2NhbGxiYWNrIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmRhdGEpCitnZXRfcm9vdF9icmlkZ2VfYnVzbnJfY2FsbGJhY2soc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLCB2b2lkICpkYXRhKQogewogCWludCAqYnVzbnIgPSAoaW50ICopZGF0YTsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgYWRkcmVzczsKQEAgLTEyOSwyMCArMTI4LDIxIEBACiAJCXJldHVybiBBRV9PSzsKIAogCWFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KHJlc291cmNlLCAmYWRkcmVzcyk7Ci0JaWYgKChhZGRyZXNzLmFkZHJlc3NfbGVuZ3RoID4gMCkgJiYgCi0JICAgKGFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0JVU19OVU1CRVJfUkFOR0UpKQorCWlmICgoYWRkcmVzcy5hZGRyZXNzX2xlbmd0aCA+IDApICYmCisJICAgIChhZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9CVVNfTlVNQkVSX1JBTkdFKSkKIAkJKmJ1c25yID0gYWRkcmVzcy5taW5fYWRkcmVzc19yYW5nZTsKIAogCXJldHVybiBBRV9PSzsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIAotdHJ5X2dldF9yb290X2JyaWRnZV9idXNucihhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqYnVzbnVtKQorc3RhdGljIGFjcGlfc3RhdHVzIHRyeV9nZXRfcm9vdF9icmlkZ2VfYnVzbnIoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKmJ1c251bSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAkqYnVzbnVtID0gLTE7Ci0Jc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsIGdldF9yb290X2JyaWRnZV9idXNucl9jYWxsYmFjaywgYnVzbnVtKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKKwkJCQlnZXRfcm9vdF9icmlkZ2VfYnVzbnJfY2FsbGJhY2ssIGJ1c251bSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm4gc3RhdHVzOwogCS8qIENoZWNrIGlmIHdlIHJlYWxseSBnZXQgYSBidXMgbnVtYmVyIGZyb20gX0NSUyAqLwpAQCAtMTUxLDE2ICsxNTEsMTQgQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfcGNpX3Jvb3RfYWRkICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9wY2lfcm9vdF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9wY2lfcm9vdAkqcm9vdCA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfcGNpX3Jvb3QJKnRtcDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdW5zaWduZWQgbG9uZwkJdmFsdWUgPSAwOwotCWFjcGlfaGFuZGxlCQloYW5kbGUgPSBOVUxMOworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBhY3BpX3BjaV9yb290ICpyb290ID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqdG1wOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuc2lnbmVkIGxvbmcgdmFsdWUgPSAwOworCWFjcGlfaGFuZGxlIGhhbmRsZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9yb290X2FkZCIpOwogCkBAIC0xODgsMTUgKzE4NiwxNSBAQAogCSAqIC0tLS0tLS0KIAkgKiBPYnRhaW5lZCB2aWEgX1NFRywgaWYgZXhpc3RzLCBvdGhlcndpc2UgYXNzdW1lZCB0byBiZSB6ZXJvICgwKS4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIocm9vdC0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fU0VHLCBOVUxMLCAKLQkJJnZhbHVlKTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIocm9vdC0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fU0VHLCBOVUxMLAorCQkJCSAgICAgICAmdmFsdWUpOwogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSBBRV9PSzoKIAkJcm9vdC0+aWQuc2VnbWVudCA9ICh1MTYpIHZhbHVlOwogCQlicmVhazsKIAljYXNlIEFFX05PVF9GT1VORDoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAKLQkJCSJBc3N1bWluZyBzZWdtZW50IDAgKG5vIF9TRUcpXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJBc3N1bWluZyBzZWdtZW50IDAgKG5vIF9TRUcpXG4iKSk7CiAJCXJvb3QtPmlkLnNlZ21lbnQgPSAwOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMjEwLDggKzIwOCw4IEBACiAJICogLS0tCiAJICogT2J0YWluZWQgdmlhIF9CQk4sIGlmIGV4aXN0cywgb3RoZXJ3aXNlIGFzc3VtZWQgdG8gYmUgemVybyAoMCkuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHJvb3QtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0JCTiwgTlVMTCwgCi0JCSZ2YWx1ZSk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHJvb3QtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0JCTiwgTlVMTCwKKwkJCQkgICAgICAgJnZhbHVlKTsKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgQUVfT0s6CiAJCXJvb3QtPmlkLmJ1cyA9ICh1MTYpIHZhbHVlOwpAQCAtMjI5LDE4ICsyMjcsMTkgQEAKIAkvKiBTb21lIHN5c3RlbXMgaGF2ZSB3cm9uZyBfQkJOICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZhY3BpX3BjaV9yb290cywgbm9kZSkgewogCQlpZiAoKHRtcC0+aWQuc2VnbWVudCA9PSByb290LT5pZC5zZWdtZW50KQotCQkJCSYmICh0bXAtPmlkLmJ1cyA9PSByb290LT5pZC5idXMpKSB7CisJCSAgICAmJiAodG1wLT5pZC5idXMgPT0gcm9vdC0+aWQuYnVzKSkgewogCQkJaW50IGJ1cyA9IDA7CiAJCQlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIAotCQkJCSJXcm9uZyBfQkJOIHZhbHVlLCBwbGVhc2UgcmVib290IGFuZCB1c2luZyBvcHRpb24gJ3BjaT1ub2FjcGknXG4iKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJXcm9uZyBfQkJOIHZhbHVlLCBwbGVhc2UgcmVib290IGFuZCB1c2luZyBvcHRpb24gJ3BjaT1ub2FjcGknXG4iKSk7CiAKIAkJCXN0YXR1cyA9IHRyeV9nZXRfcm9vdF9icmlkZ2VfYnVzbnIocm9vdC0+aGFuZGxlLCAmYnVzKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJCQlicmVhazsKIAkJCWlmIChidXMgIT0gcm9vdC0+aWQuYnVzKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlBDSSBfQ1JTICVkIG92ZXJyaWRlcyBfQkJOIDBcbiIsIGJ1cyk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJCQkgICAgICAgIlBDSSBfQ1JTICVkIG92ZXJyaWRlcyBfQkJOIDBcbiIsIGJ1cyk7CiAJCQkJcm9vdC0+aWQuYnVzID0gYnVzOwogCQkJfQogCQkJYnJlYWs7CkBAIC0yNTgsMTIgKzI1NywxMiBAQAogCSAqIFRCRDogTmVlZCBQQ0kgaW50ZXJmYWNlIGZvciBlbnVtZXJhdGlvbi9jb25maWd1cmF0aW9uIG9mIHJvb3RzLgogCSAqLwogCi0gCS8qIFRCRDogTG9ja2luZyAqLwotIAlsaXN0X2FkZF90YWlsKCZyb290LT5ub2RlLCAmYWNwaV9wY2lfcm9vdHMpOworCS8qIFRCRDogTG9ja2luZyAqLworCWxpc3RfYWRkX3RhaWwoJnJvb3QtPm5vZGUsICZhY3BpX3BjaV9yb290cyk7CiAKLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoJTA0eDolMDJ4KVxuIiwgCi0JCWFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JCXJvb3QtPmlkLnNlZ21lbnQsIHJvb3QtPmlkLmJ1cyk7CisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc10gKCUwNHg6JTAyeClcbiIsCisJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCisJICAgICAgIHJvb3QtPmlkLnNlZ21lbnQsIHJvb3QtPmlkLmJ1cyk7CiAKIAkvKgogCSAqIFNjYW4gdGhlIFJvb3QgQnJpZGdlCkBAIC0yNzQsOSArMjczLDkgQEAKIAkgKi8KIAlyb290LT5idXMgPSBwY2lfYWNwaV9zY2FuX3Jvb3QoZGV2aWNlLCByb290LT5pZC5zZWdtZW50LCByb290LT5pZC5idXMpOwogCWlmICghcm9vdC0+YnVzKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIAotCQkJIkJ1cyAlMDR4OiUwMnggbm90IHByZXNlbnQgaW4gUENJIG5hbWVzcGFjZVxuIiwgCi0JCQlyb290LT5pZC5zZWdtZW50LCByb290LT5pZC5idXMpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJCdXMgJTA0eDolMDJ4IG5vdCBwcmVzZW50IGluIFBDSSBuYW1lc3BhY2VcbiIsCisJCQkJICByb290LT5pZC5zZWdtZW50LCByb290LT5pZC5idXMpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlbmQ7CiAJfQpAQCAtMjk4LDkgKzI5Nyw5IEBACiAJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKHJvb3QtPmhhbmRsZSwgTUVUSE9EX05BTUVfX1BSVCwgJmhhbmRsZSk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQogCQlyZXN1bHQgPSBhY3BpX3BjaV9pcnFfYWRkX3BydChyb290LT5oYW5kbGUsIHJvb3QtPmlkLnNlZ21lbnQsCi0JCQlyb290LT5pZC5idXMpOworCQkJCQkgICAgICByb290LT5pZC5idXMpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkgewogCQlpZiAoIWxpc3RfZW1wdHkoJnJvb3QtPm5vZGUpKQogCQkJbGlzdF9kZWwoJnJvb3QtPm5vZGUpOwpAQCAtMzEwLDExICszMDksOSBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3BjaV9yb290X3N0YXJ0ICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9wY2lfcm9vdF9zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgYWNwaV9wY2lfcm9vdAkqcm9vdDsKKwlzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqcm9vdDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX3Jvb3Rfc3RhcnQiKTsKIApAQCAtMzI3LDI3ICszMjQsMjMgQEAKIAlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfcGNpX3Jvb3RfcmVtb3ZlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlpbnQJCQl0eXBlKQorc3RhdGljIGludCBhY3BpX3BjaV9yb290X3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7Ci0Jc3RydWN0IGFjcGlfcGNpX3Jvb3QJKnJvb3QgPSBOVUxMOworCXN0cnVjdCBhY3BpX3BjaV9yb290ICpyb290ID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX3Jvb3RfcmVtb3ZlIik7CiAKIAlpZiAoIWRldmljZSB8fCAhYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlyb290ID0gKHN0cnVjdCBhY3BpX3BjaV9yb290ICopIGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKwlyb290ID0gKHN0cnVjdCBhY3BpX3BjaV9yb290ICopYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCiAJa2ZyZWUocm9vdCk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9wY2lfcm9vdF9pbml0ICh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9wY2lfcm9vdF9pbml0KHZvaWQpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfcm9vdF9pbml0Iik7CiAKQEAgLTM1NSw4ICszNDgsOCBAQAogCQlyZXR1cm5fVkFMVUUoMCk7CiAKIAkvKiBERUJVRzoKLQlhY3BpX2RiZ19sYXllciA9IEFDUElfUENJX0NPTVBPTkVOVDsKLQlhY3BpX2RiZ19sZXZlbCA9IDB4RkZGRkZGRkY7CisJICAgYWNwaV9kYmdfbGF5ZXIgPSBBQ1BJX1BDSV9DT01QT05FTlQ7CisJICAgYWNwaV9kYmdfbGV2ZWwgPSAweEZGRkZGRkZGOwogCSAqLwogCiAJaWYgKGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9wY2lfcm9vdF9kcml2ZXIpIDwgMCkKQEAgLTM2Niw0ICszNTksMyBAQAogfQogCiBzdWJzeXNfaW5pdGNhbGwoYWNwaV9wY2lfcm9vdF9pbml0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Bvd2VyLmMgYi9kcml2ZXJzL2FjcGkvcG93ZXIuYwppbmRleCAzNzNhM2E5Li42MmE1NTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcG93ZXIuYworKysgYi9kcml2ZXJzL2FjcGkvcG93ZXIuYwpAQCAtNDQsMTAgKzQ0LDggQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUE9XRVJfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImFjcGlfcG93ZXIiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3Bvd2VyIikKICNkZWZpbmUgQUNQSV9QT1dFUl9DT01QT05FTlQJCTB4MDA4MDAwMDAKICNkZWZpbmUgQUNQSV9QT1dFUl9DTEFTUwkJInBvd2VyX3Jlc291cmNlIgogI2RlZmluZSBBQ1BJX1BPV0VSX0RSSVZFUl9OQU1FCQkiQUNQSSBQb3dlciBSZXNvdXJjZSBEcml2ZXIiCkBAIC01NywzOCArNTUsMzYgQEAKICNkZWZpbmUgQUNQSV9QT1dFUl9SRVNPVVJDRV9TVEFURV9PRkYJMHgwMAogI2RlZmluZSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX09OCTB4MDEKICNkZWZpbmUgQUNQSV9QT1dFUl9SRVNPVVJDRV9TVEFURV9VTktOT1dOIDB4RkYKLQotc3RhdGljIGludCBhY3BpX3Bvd2VyX2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX3Bvd2VyX3JlbW92ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgYWNwaV9wb3dlcl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX3Bvd2VyX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogc3RhdGljIGludCBhY3BpX3Bvd2VyX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfcG93ZXJfZHJpdmVyID0gewotCS5uYW1lID0JCUFDUElfUE9XRVJfRFJJVkVSX05BTUUsCi0JLmNsYXNzID0JQUNQSV9QT1dFUl9DTEFTUywKLQkuaWRzID0JCUFDUElfUE9XRVJfSElELAotCS5vcHMgPQkJewotCQkJCS5hZGQgPQkJYWNwaV9wb3dlcl9hZGQsCi0JCQkJLnJlbW92ZSA9CWFjcGlfcG93ZXJfcmVtb3ZlLAotCQkJfSwKKwkubmFtZSA9IEFDUElfUE9XRVJfRFJJVkVSX05BTUUsCisJLmNsYXNzID0gQUNQSV9QT1dFUl9DTEFTUywKKwkuaWRzID0gQUNQSV9QT1dFUl9ISUQsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFjcGlfcG93ZXJfYWRkLAorCQkucmVtb3ZlID0gYWNwaV9wb3dlcl9yZW1vdmUsCisJCX0sCiB9OwogCi1zdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZQotewotCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0JYWNwaV9idXNfaWQJCW5hbWU7Ci0JdTMyCQkJc3lzdGVtX2xldmVsOwotCXUzMgkJCW9yZGVyOwotCWludAkJCXN0YXRlOwotCWludAkJCXJlZmVyZW5jZXM7CitzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSB7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCWFjcGlfYnVzX2lkIG5hbWU7CisJdTMyIHN5c3RlbV9sZXZlbDsKKwl1MzIgb3JkZXI7CisJaW50IHN0YXRlOworCWludCByZWZlcmVuY2VzOwogfTsKIAotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQJCWFjcGlfcG93ZXJfcmVzb3VyY2VfbGlzdDsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGFjcGlfcG93ZXJfcmVzb3VyY2VfbGlzdDsKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9wb3dlcl9mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfcG93ZXJfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV9wb3dlcl9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk2LDEyICs5MiwxMSBAQAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIGludAotYWNwaV9wb3dlcl9nZXRfY29udGV4dCAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSAqKnJlc291cmNlKQorYWNwaV9wb3dlcl9nZXRfY29udGV4dChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSAqKnJlc291cmNlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcG93ZXJfZ2V0X2NvbnRleHQiKTsKIApAQCAtMTExLDI0ICsxMDYsMjEgQEAKIAlyZXN1bHQgPSBhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmRldmljZSk7CiAJaWYgKHJlc3VsdCkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJFcnJvciBnZXR0aW5nIGNvbnRleHQgWyVwXVxuIiwKLQkJCWhhbmRsZSkpOworCQkJCSAgaGFuZGxlKSk7CiAJCXJldHVybl9WQUxVRShyZXN1bHQpOwogCX0KIAotCSpyZXNvdXJjZSA9IChzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSAqKSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJKnJlc291cmNlID0gKHN0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlICopYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCWlmICghcmVzb3VyY2UpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3Bvd2VyX2dldF9zdGF0ZSAoCi0Jc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKnJlc291cmNlKQorc3RhdGljIGludCBhY3BpX3Bvd2VyX2dldF9zdGF0ZShzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSAqcmVzb3VyY2UpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuc2lnbmVkIGxvbmcJCXN0YSA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5zaWduZWQgbG9uZyBzdGEgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wb3dlcl9nZXRfc3RhdGUiKTsKIApAQCAtMTQ1LDIwICsxMzcsMTYgQEAKIAkJcmVzb3VyY2UtPnN0YXRlID0gQUNQSV9QT1dFUl9SRVNPVVJDRV9TVEFURV9PRkY7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZXNvdXJjZSBbJXNdIGlzICVzXG4iLAotCQlyZXNvdXJjZS0+bmFtZSwgcmVzb3VyY2UtPnN0YXRlPyJvbiI6Im9mZiIpKTsKKwkJCSAgcmVzb3VyY2UtPm5hbWUsIHJlc291cmNlLT5zdGF0ZSA/ICJvbiIgOiAib2ZmIikpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcG93ZXJfZ2V0X2xpc3Rfc3RhdGUgKAotCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0CSpsaXN0LAotCWludAkJCSpzdGF0ZSkKK3N0YXRpYyBpbnQgYWNwaV9wb3dlcl9nZXRfbGlzdF9zdGF0ZShzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCAqbGlzdCwgaW50ICpzdGF0ZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7Ci0JdTMyCQkJaSA9IDA7CisJdTMyIGkgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wb3dlcl9nZXRfbGlzdF9zdGF0ZSIpOwogCkBAIC0xNjcsNyArMTU1LDcgQEAKIAogCS8qIFRoZSBzdGF0ZSBvZiB0aGUgbGlzdCBpcyAnb24nIElGRiBhbGwgcmVzb3VyY2VzIGFyZSAnb24nLiAqLwogCi0JZm9yIChpPTA7IGk8bGlzdC0+Y291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5jb3VudDsgaSsrKSB7CiAJCXJlc3VsdCA9IGFjcGlfcG93ZXJfZ2V0X2NvbnRleHQobGlzdC0+aGFuZGxlc1tpXSwgJnJlc291cmNlKTsKIAkJaWYgKHJlc3VsdCkKIAkJCXJldHVybl9WQUxVRShyZXN1bHQpOwpAQCAtMTgyLDE5ICsxNzAsMTYgQEAKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZXNvdXJjZSBsaXN0IGlzICVzXG4iLAotCQkqc3RhdGU/Im9uIjoib2ZmIikpOworCQkJICAqc3RhdGUgPyAib24iIDogIm9mZiIpKTsKIAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcG93ZXJfb24gKAotCWFjcGlfaGFuZGxlCQloYW5kbGUpCitzdGF0aWMgaW50IGFjcGlfcG93ZXJfb24oYWNwaV9oYW5kbGUgaGFuZGxlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAJc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcG93ZXJfb24iKTsKQEAgLTIwNSwxMCArMTkwLDEwIEBACiAKIAlyZXNvdXJjZS0+cmVmZXJlbmNlcysrOwogCi0JaWYgKChyZXNvdXJjZS0+cmVmZXJlbmNlcyA+IDEpIAotCQl8fCAocmVzb3VyY2UtPnN0YXRlID09IEFDUElfUE9XRVJfUkVTT1VSQ0VfU1RBVEVfT04pKSB7CisJaWYgKChyZXNvdXJjZS0+cmVmZXJlbmNlcyA+IDEpCisJICAgIHx8IChyZXNvdXJjZS0+c3RhdGUgPT0gQUNQSV9QT1dFUl9SRVNPVVJDRV9TVEFURV9PTikpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUmVzb3VyY2UgWyVzXSBhbHJlYWR5IG9uXG4iLAotCQkJcmVzb3VyY2UtPm5hbWUpKTsKKwkJCQkgIHJlc291cmNlLT5uYW1lKSk7CiAJCXJldHVybl9WQUxVRSgwKTsKIAl9CiAKQEAgLTIyOSwxOSArMjE0LDE2IEBACiAJZGV2aWNlLT5wb3dlci5zdGF0ZSA9IEFDUElfU1RBVEVfRDA7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZXNvdXJjZSBbJXNdIHR1cm5lZCBvblxuIiwKLQkJcmVzb3VyY2UtPm5hbWUpKTsKKwkJCSAgcmVzb3VyY2UtPm5hbWUpKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3Bvd2VyX29mZl9kZXZpY2UgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUpCitzdGF0aWMgaW50IGFjcGlfcG93ZXJfb2ZmX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAlzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSAqcmVzb3VyY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wb3dlcl9vZmZfZGV2aWNlIik7CkBAIC0yNTQsMTUgKzIzNiwxNSBAQAogCQlyZXNvdXJjZS0+cmVmZXJlbmNlcy0tOwogCiAJaWYgKHJlc291cmNlLT5yZWZlcmVuY2VzKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgCi0JCQkiUmVzb3VyY2UgWyVzXSBpcyBzdGlsbCBpbiB1c2UsIGRlcmVmZXJlbmNpbmdcbiIsCi0JCQlkZXZpY2UtPnBucC5idXNfaWQpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIlJlc291cmNlIFslc10gaXMgc3RpbGwgaW4gdXNlLCBkZXJlZmVyZW5jaW5nXG4iLAorCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkKSk7CiAJCXJldHVybl9WQUxVRSgwKTsKIAl9CiAKIAlpZiAocmVzb3VyY2UtPnN0YXRlID09IEFDUElfUE9XRVJfUkVTT1VSQ0VfU1RBVEVfT0ZGKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlc291cmNlIFslc10gYWxyZWFkeSBvZmZcbiIsCi0JCQlkZXZpY2UtPnBucC5idXNfaWQpKTsKKwkJCQkgIGRldmljZS0+cG5wLmJ1c19pZCkpOwogCQlyZXR1cm5fVkFMVUUoMCk7CiAJfQogCkBAIC0yODMsNyArMjY1LDcgQEAKIAlkZXZpY2UtPnBvd2VyLnN0YXRlID0gQUNQSV9TVEFURV9EMzsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlc291cmNlIFslc10gdHVybmVkIG9mZlxuIiwKLQkJcmVzb3VyY2UtPm5hbWUpKTsKKwkJCSAgcmVzb3VyY2UtPm5hbWUpKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KQEAgLTI5MywxMyArMjc1LDEzIEBACiAgKiAxLiBQb3dlciBvbiB0aGUgcG93ZXIgcmVzb3VyY2VzIHJlcXVpcmVkIGZvciB0aGUgd2FrZXVwIGRldmljZSAKICAqIDIuIEVuYWJsZSBfUFNXIChwb3dlciBzdGF0ZSB3YWtlKSBmb3IgdGhlIGRldmljZSBpZiBwcmVzZW50CiAgKi8KLWludCBhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3Bvd2VyIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldikKK2ludCBhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3Bvd2VyKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2KQogewotCXVuaW9uIGFjcGlfb2JqZWN0IAkJYXJnID0ge0FDUElfVFlQRV9JTlRFR0VSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdfbGlzdCA9IHsxLCAmYXJnfTsKLQlhY3BpX3N0YXR1cwkJCXN0YXR1cyA9IEFFX09LOwotCWludAkJCQkJaTsKLQlpbnQgCQkJCQlyZXQgPSAwOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZyA9IHsgQUNQSV9UWVBFX0lOVEVHRVIgfTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdCA9IHsgMSwgJmFyZyB9OworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWludCBpOworCWludCByZXQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZV9wb3dlciIpOwogCWlmICghZGV2IHx8ICFkZXYtPndha2V1cC5mbGFncy52YWxpZCkKQEAgLTMxMCw4ICsyOTIsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPndha2V1cC5yZXNvdXJjZXMuY291bnQ7IGkrKykgewogCQlyZXQgPSBhY3BpX3Bvd2VyX29uKGRldi0+d2FrZXVwLnJlc291cmNlcy5oYW5kbGVzW2ldKTsKIAkJaWYgKHJldCkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCi0JCQkJIkVycm9yIHRyYW5zaXRpb24gcG93ZXIgc3RhdGVcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkVycm9yIHRyYW5zaXRpb24gcG93ZXIgc3RhdGVcbiIpKTsKIAkJCWRldi0+d2FrZXVwLmZsYWdzLnZhbGlkID0gMDsKIAkJCXJldHVybl9WQUxVRSgtMSk7CiAJCX0KQEAgLTMzMywyMCArMzE1LDIwIEBACiAgKiAxLiBEaXNhYmxlIF9QU1cgKHBvd2VyIHN0YXRlIHdha2UpCiAgKiAyLiBTaHV0ZG93biBkb3duIHRoZSBwb3dlciByZXNvdXJjZXMKICAqLwotaW50IGFjcGlfZGlzYWJsZV93YWtldXBfZGV2aWNlX3Bvd2VyIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldikKK2ludCBhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZV9wb3dlcihzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldikKIHsKLQl1bmlvbiBhY3BpX29iamVjdCAJCWFyZyA9IHtBQ1BJX1RZUEVfSU5URUdFUn07Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJYXJnX2xpc3QgPSB7MSwgJmFyZ307Ci0JYWNwaV9zdGF0dXMJCQlzdGF0dXMgPSBBRV9PSzsKLQlpbnQJCQkJCWk7Ci0JaW50IAkJCQkJcmV0ID0gMDsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmcgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3QgPSB7IDEsICZhcmcgfTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZGlzYWJsZV93YWtldXBfZGV2aWNlX3Bvd2VyIik7CiAKIAlpZiAoIWRldiB8fCAhZGV2LT53YWtldXAuZmxhZ3MudmFsaWQpCiAJCXJldHVybl9WQUxVRSgtMSk7CiAKLQlhcmcuaW50ZWdlci52YWx1ZSA9IDA7CQorCWFyZy5pbnRlZ2VyLnZhbHVlID0gMDsKIAkvKiBFeGVjdXRlIFBTVyAqLwogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldi0+aGFuZGxlLCAiX1BTVyIsICZhcmdfbGlzdCwgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSkgewpAQCAtMzU5LDggKzM0MSw4IEBACiAJZm9yIChpID0gMDsgaSA8IGRldi0+d2FrZXVwLnJlc291cmNlcy5jb3VudDsgaSsrKSB7CiAJCXJldCA9IGFjcGlfcG93ZXJfb2ZmX2RldmljZShkZXYtPndha2V1cC5yZXNvdXJjZXMuaGFuZGxlc1tpXSk7CiAJCWlmIChyZXQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIAotCQkJCSJFcnJvciB0cmFuc2l0aW9uIHBvd2VyIHN0YXRlXG4iKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJFcnJvciB0cmFuc2l0aW9uIHBvd2VyIHN0YXRlXG4iKSk7CiAJCQlkZXYtPndha2V1cC5mbGFncy52YWxpZCA9IDA7CiAJCQlyZXR1cm5fVkFMVUUoLTEpOwogCQl9CkBAIC0zNzMsMTQgKzM1NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UgUG93ZXIgTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotaW50Ci1hY3BpX3Bvd2VyX2dldF9pbmZlcnJlZF9zdGF0ZSAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitpbnQgYWNwaV9wb3dlcl9nZXRfaW5mZXJyZWRfc3RhdGUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdAkqbGlzdCA9IE5VTEw7Ci0JaW50CQkJbGlzdF9zdGF0ZSA9IDA7Ci0JaW50CQkJaSA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgKmxpc3QgPSBOVUxMOworCWludCBsaXN0X3N0YXRlID0gMDsKKwlpbnQgaSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Bvd2VyX2dldF9pbmZlcnJlZF9zdGF0ZSIpOwogCkBAIC0zOTMsNyArMzczLDcgQEAKIAkgKiBXZSBrbm93IGEgZGV2aWNlJ3MgaW5mZXJyZWQgcG93ZXIgc3RhdGUgd2hlbiBhbGwgdGhlIHJlc291cmNlcwogCSAqIHJlcXVpcmVkIGZvciBhIGdpdmVuIEQtc3RhdGUgYXJlICdvbicuCiAJICovCi0JZm9yIChpPUFDUElfU1RBVEVfRDA7IGk8QUNQSV9TVEFURV9EMzsgaSsrKSB7CisJZm9yIChpID0gQUNQSV9TVEFURV9EMDsgaSA8IEFDUElfU1RBVEVfRDM7IGkrKykgewogCQlsaXN0ID0gJmRldmljZS0+cG93ZXIuc3RhdGVzW2ldLnJlc291cmNlczsKIAkJaWYgKGxpc3QtPmNvdW50IDwgMSkKIAkJCWNvbnRpbnVlOwpAQCAtNDEzLDIzICszOTMsMjAgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotaW50Ci1hY3BpX3Bvd2VyX3RyYW5zaXRpb24gKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCWludAkJCXN0YXRlKQoraW50IGFjcGlfcG93ZXJfdHJhbnNpdGlvbihzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0Jc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QJKmNsID0gTlVMTDsJLyogQ3VycmVudCBSZXNvdXJjZXMgKi8KLQlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdAkqdGwgPSBOVUxMOwkvKiBUYXJnZXQgUmVzb3VyY2VzICovCi0JaW50CQkJaSA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgKmNsID0gTlVMTDsJLyogQ3VycmVudCBSZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCAqdGwgPSBOVUxMOwkvKiBUYXJnZXQgUmVzb3VyY2VzICovCisJaW50IGkgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wb3dlcl90cmFuc2l0aW9uIik7CiAKIAlpZiAoIWRldmljZSB8fCAoc3RhdGUgPCBBQ1BJX1NUQVRFX0QwKSB8fCAoc3RhdGUgPiBBQ1BJX1NUQVRFX0QzKSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCi0JaWYgKChkZXZpY2UtPnBvd2VyLnN0YXRlIDwgQUNQSV9TVEFURV9EMCkgfHwgKGRldmljZS0+cG93ZXIuc3RhdGUgPiBBQ1BJX1NUQVRFX0QzKSkKKwlpZiAoKGRldmljZS0+cG93ZXIuc3RhdGUgPCBBQ1BJX1NUQVRFX0QwKQorCSAgICB8fCAoZGV2aWNlLT5wb3dlci5zdGF0ZSA+IEFDUElfU1RBVEVfRDMpKQogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKIAljbCA9ICZkZXZpY2UtPnBvd2VyLnN0YXRlc1tkZXZpY2UtPnBvd2VyLnN0YXRlXS5yZXNvdXJjZXM7CkBAIC00NDgsNyArNDI1LDcgQEAKIAkgKiBGaXJzdCB3ZSByZWZlcmVuY2UgYWxsIHBvd2VyIHJlc291cmNlcyByZXF1aXJlZCBpbiB0aGUgdGFyZ2V0IGxpc3QKIAkgKiAoZS5nLiBzbyB0aGUgZGV2aWNlIGRvZXNuJ3QgbG9zZSBwb3dlciB3aGlsZSB0cmFuc2l0aW9uaW5nKS4KIAkgKi8KLQlmb3IgKGk9MDsgaTx0bC0+Y291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCB0bC0+Y291bnQ7IGkrKykgewogCQlyZXN1bHQgPSBhY3BpX3Bvd2VyX29uKHRsLT5oYW5kbGVzW2ldKTsKIAkJaWYgKHJlc3VsdCkKIAkJCWdvdG8gZW5kOwpAQCAtNDU3LDcgKzQzNCw3IEBACiAJLyoKIAkgKiBUaGVuIHdlIGRlcmVmZXJlbmNlIGFsbCBwb3dlciByZXNvdXJjZXMgdXNlZCBpbiB0aGUgY3VycmVudCBsaXN0LgogCSAqLwotCWZvciAoaT0wOyBpPGNsLT5jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGNsLT5jb3VudDsgaSsrKSB7CiAJCXJlc3VsdCA9IGFjcGlfcG93ZXJfb2ZmX2RldmljZShjbC0+aGFuZGxlc1tpXSk7CiAJCWlmIChyZXN1bHQpCiAJCQlnb3RvIGVuZDsKQEAgLTQ2NSwyMSArNDQyLDIwIEBACiAKIAkvKiBXZSBzaG91bGRuJ3QgY2hhbmdlIHRoZSBzdGF0ZSB0aWxsIGFsbCBhYm92ZSBvcGVyYXRpb25zIHN1Y2NlZWQgKi8KIAlkZXZpY2UtPnBvd2VyLnN0YXRlID0gc3RhdGU7Ci1lbmQ6CisgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAKLQkJCSJFcnJvciB0cmFuc2l0aW9uaW5nIGRldmljZSBbJXNdIHRvIEQlZFxuIiwKLQkJCWRldmljZS0+cG5wLmJ1c19pZCwgc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCSAgIkVycm9yIHRyYW5zaXRpb25pbmcgZGV2aWNlIFslc10gdG8gRCVkXG4iLAorCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkLCBzdGF0ZSkpOwogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5CSphY3BpX3Bvd2VyX2RpcjsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfcG93ZXJfZGlyOwogCiBzdGF0aWMgaW50IGFjcGlfcG93ZXJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKQEAgLTUwNiwxMyArNDgyLDEyIEBACiAJfQogCiAJc2VxX3ByaW50ZihzZXEsICJzeXN0ZW0gbGV2ZWw6ICAgICAgICAgICAgUyVkXG4iCi0JCQkib3JkZXI6ICAgICAgICAgICAgICAgICAgICVkXG4iCi0JCQkicmVmZXJlbmNlIGNvdW50OiAgICAgICAgICVkXG4iLAotCQkJcmVzb3VyY2UtPnN5c3RlbV9sZXZlbCwKLQkJCXJlc291cmNlLT5vcmRlciwKLQkJCXJlc291cmNlLT5yZWZlcmVuY2VzKTsKKwkJICAgIm9yZGVyOiAgICAgICAgICAgICAgICAgICAlZFxuIgorCQkgICAicmVmZXJlbmNlIGNvdW50OiAgICAgICAgICVkXG4iLAorCQkgICByZXNvdXJjZS0+c3lzdGVtX2xldmVsLAorCQkgICByZXNvdXJjZS0+b3JkZXIsIHJlc291cmNlLT5yZWZlcmVuY2VzKTsKIAotZW5kOgorICAgICAgZW5kOgogCXJldHVybl9WQUxVRSgwKTsKIH0KIApAQCAtNTIxLDExICs0OTYsOSBAQAogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3Bvd2VyX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAotc3RhdGljIGludAotYWNwaV9wb3dlcl9hZGRfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3Bvd2VyX2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcG93ZXJfYWRkX2ZzIik7CiAKQEAgLTUzNCwxOCArNTA3LDE4IEBACiAKIAlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKSB7CiAJCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gcHJvY19ta2RpcihhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJCWFjcGlfcG93ZXJfZGlyKTsKKwkJCQkJCSAgICAgYWNwaV9wb3dlcl9kaXIpOwogCQlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKQogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAogCS8qICdzdGF0dXMnIFtSXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9QT1dFUl9GSUxFX1NUQVRVUywKLQkJU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9QT1dFUl9GSUxFX1NUQVRVUykpOworCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkgIEFDUElfUE9XRVJfRklMRV9TVEFUVVMpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3Bvd2VyX2ZvcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtNTU0LDEwICs1MjcsNyBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3Bvd2VyX3JlbW92ZV9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfcG93ZXJfcmVtb3ZlX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcG93ZXJfcmVtb3ZlX2ZzIik7CiAKQEAgLTU3MSwyMCArNTQxLDE3IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBJbnRlcmZhY2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQKLWFjcGlfcG93ZXJfYWRkICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9wb3dlcl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKLQl1bmlvbiBhY3BpX29iamVjdAlhY3BpX29iamVjdDsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0ge3NpemVvZihhY3BpX29iamVjdCksICZhY3BpX29iamVjdH07CisJdW5pb24gYWNwaV9vYmplY3QgYWNwaV9vYmplY3Q7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgc2l6ZW9mKGFjcGlfb2JqZWN0KSwgJmFjcGlfb2JqZWN0IH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Bvd2VyX2FkZCIpOwogCkBAIC02MzAsMjIgKzU5NywxOCBAQAogCXJlc3VsdCA9IGFjcGlfcG93ZXJfYWRkX2ZzKGRldmljZSk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBlbmQ7Ci0JCi0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc10gKCVzKVxuIiwgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLAotCQlhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwgcmVzb3VyY2UtPnN0YXRlPyJvbiI6Im9mZiIpOwogCi1lbmQ6CisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc10gKCVzKVxuIiwgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLAorCSAgICAgICBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwgcmVzb3VyY2UtPnN0YXRlID8gIm9uIiA6ICJvZmYiKTsKKworICAgICAgZW5kOgogCWlmIChyZXN1bHQpCiAJCWtmcmVlKHJlc291cmNlKTsKLQkKKwogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcG93ZXJfcmVtb3ZlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlpbnQJCQl0eXBlKQorc3RhdGljIGludCBhY3BpX3Bvd2VyX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7CiAJc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKIApAQCAtNjU0LDcgKzYxNyw3IEBACiAJaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCi0JcmVzb3VyY2UgPSAoc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXJlc291cmNlID0gKHN0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlICopYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCiAJYWNwaV9wb3dlcl9yZW1vdmVfZnMoZGV2aWNlKTsKIApAQCAtNjYzLDEwICs2MjYsOSBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX3Bvd2VyX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3Bvd2VyX2luaXQodm9pZCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wb3dlcl9pbml0Iik7CiAKQEAgLTY4OSw0ICs2NTEsMyBAQAogfQogCiBzdWJzeXNfaW5pdGNhbGwoYWNwaV9wb3dlcl9pbml0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwppbmRleCBkNTZhNDM5Li40MjE3OTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtNTgsNyArNTgsNiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KIAotCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVAkweDAxMDAwMDAwCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NMQVNTCQkicHJvY2Vzc29yIgogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9EUklWRVJfTkFNRQkiQUNQSSBQcm9jZXNzb3IgRHJpdmVyIgpAQCAtNzUsNTkgKzc0LDUzIEBACiAjZGVmaW5lIEFDUElfU1RBX1BSRVNFTlQgMHgwMDAwMDAwMQogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJhY3BpX3Byb2Nlc3NvciIpCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3Byb2Nlc3NvciIpCiAKLU1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKKyAgICBNT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9QUk9DRVNTT1JfRFJJVkVSX05BTUUpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0KLXN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfYWRkIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3N0YXJ0IChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3JlbW92ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3Jfc3RhcnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyB2b2lkIGFjcGlfcHJvY2Vzc29yX25vdGlmeSAoIGFjcGlfaGFuZGxlCWhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGFjcGlfcHJvY2Vzc29yX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSk7CiBzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9wcm9jZXNzb3JfaG90YWRkX2luaXQoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKnBfY3B1KTsKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfaGFuZGxlX2VqZWN0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfcHJvY2Vzc29yX2RyaXZlciA9IHsKLQkubmFtZSA9CQlBQ1BJX1BST0NFU1NPUl9EUklWRVJfTkFNRSwKLQkuY2xhc3MgPQlBQ1BJX1BST0NFU1NPUl9DTEFTUywKLQkuaWRzID0JCUFDUElfUFJPQ0VTU09SX0hJRCwKLQkub3BzID0JCXsKLQkJCQkuYWRkID0JCWFjcGlfcHJvY2Vzc29yX2FkZCwKLQkJCQkucmVtb3ZlID0JYWNwaV9wcm9jZXNzb3JfcmVtb3ZlLAotCQkJCS5zdGFydAk9IAlhY3BpX3Byb2Nlc3Nvcl9zdGFydCwKLQkJCX0sCisJLm5hbWUgPSBBQ1BJX1BST0NFU1NPUl9EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX1BST0NFU1NPUl9DTEFTUywKKwkuaWRzID0gQUNQSV9QUk9DRVNTT1JfSElELAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX3Byb2Nlc3Nvcl9hZGQsCisJCS5yZW1vdmUgPSBhY3BpX3Byb2Nlc3Nvcl9yZW1vdmUsCisJCS5zdGFydCA9IGFjcGlfcHJvY2Vzc29yX3N0YXJ0LAorCQl9LAogfTsKIAogI2RlZmluZSBJTlNUQUxMX05PVElGWV9IQU5ETEVSCQkxCiAjZGVmaW5lIFVOSU5TVEFMTF9OT1RJRllfSEFORExFUgkyCiAKLQogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9wcm9jZXNzb3JfaW5mb19mb3BzID0gewotCS5vcGVuIAkJPSBhY3BpX3Byb2Nlc3Nvcl9pbmZvX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfcHJvY2Vzc29yX2luZm9fb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKLQotc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwcm9jZXNzb3JzW05SX0NQVVNdOworc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcm9jZXNzb3JzW05SX0NQVVNdOwogc3RydWN0IGFjcGlfcHJvY2Vzc29yX2VycmF0YSBlcnJhdGE7CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyYXRhIEhhbmRsaW5nCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50Ci1hY3BpX3Byb2Nlc3Nvcl9lcnJhdGFfcGlpeDQgKAotCXN0cnVjdCBwY2lfZGV2CQkqZGV2KQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9lcnJhdGFfcGlpeDQoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQl1OAkJCXJldiA9IDA7Ci0JdTgJCQl2YWx1ZTEgPSAwOwotCXU4CQkJdmFsdWUyID0gMDsKKwl1OCByZXYgPSAwOworCXU4IHZhbHVlMSA9IDA7CisJdTggdmFsdWUyID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2VycmF0YV9waWl4NCIpOwogCkBAIC0xODgsOCArMTgxLDggQEAKIAkJICogRE1BIGFjdGl2aXR5LgogCQkgKi8KIAkJZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJICAgICAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKKwkJCQkgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQiwKKwkJCQkgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOwogCQlpZiAoZGV2KSB7CiAJCQllcnJhdGEucGlpeDQuYm1pc3ggPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCA0KTsKIAkJCXBjaV9kZXZfcHV0KGRldik7CkBAIC0yMDUsOCArMTk4LDggQEAKIAkJICogZGV2aWNlcyB3b24ndCBvcGVyYXRlIHdlbGwgaWYgZmFzdCBETUEgaXMgZGlzYWJsZWQuCiAJCSAqLwogCQlkZXYgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkJUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzAsCi0JCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKKwkJCQkgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8wLAorCQkJCSAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7CiAJCWlmIChkZXYpIHsKIAkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg3NiwgJnZhbHVlMSk7CiAJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NzcsICZ2YWx1ZTIpOwpAQCAtMjIwLDIxICsyMTMsMTggQEAKIAogCWlmIChlcnJhdGEucGlpeDQuYm1pc3gpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJCdXMgbWFzdGVyIGFjdGl2aXR5IGRldGVjdGlvbiAoQk0tSURFKSBlcnJhdHVtIGVuYWJsZWRcbiIpKTsKKwkJCQkgICJCdXMgbWFzdGVyIGFjdGl2aXR5IGRldGVjdGlvbiAoQk0tSURFKSBlcnJhdHVtIGVuYWJsZWRcbiIpKTsKIAlpZiAoZXJyYXRhLnBpaXg0LmZkbWEpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJUeXBlLUYgRE1BIGxpdmVsb2NrIGVycmF0dW0gKEMzIGRpc2FibGVkKVxuIikpOworCQkJCSAgIlR5cGUtRiBETUEgbGl2ZWxvY2sgZXJyYXR1bSAoQzMgZGlzYWJsZWQpXG4iKSk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotaW50Ci1hY3BpX3Byb2Nlc3Nvcl9lcnJhdGEgKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2VycmF0YShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0Jc3RydWN0IHBjaV9kZXYJCSpkZXYgPSBOVUxMOworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZXJyYXRhIik7CiAKQEAgLTI0NSw3ICsyMzUsOCBAQAogCSAqIFBJSVg0CiAJICovCiAJZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOworCQkJICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywgUENJX0FOWV9JRCwKKwkJCSAgICAgUENJX0FOWV9JRCwgTlVMTCk7CiAJaWYgKGRldikgewogCQlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9lcnJhdGFfcGlpeDQoZGV2KTsKIAkJcGNpX2Rldl9wdXQoZGV2KTsKQEAgLTI1NCw3ICsyNDUsNiBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb24gQUNQSSBwcm9jZXNzb3IgZnVjbnRpb25zCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjY1LDEzICsyNTUsMTMgQEAKICAqLwogCiBpbnQgYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAotCQkJCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGNfaW4pCisJCQkgICBzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqcGRjX2luKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQl1MzIJCQlhcmcwX2J1ZlszXTsKLQl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9CVUZGRVJ9OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0CW5vX29iamVjdCA9IHsxLCAmYXJnMH07Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJKnBkYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgYXJnMF9idWZbM107CisJdW5pb24gYWNwaV9vYmplY3QgYXJnMCA9IHsgQUNQSV9UWVBFX0JVRkZFUiB9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IG5vX29iamVjdCA9IHsgMSwgJmFyZzAgfTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqcGRjOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyIpOwogCkBAIC0yODYsMjEgKzI3NiwyMSBAQAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KHByLT5oYW5kbGUsICJfUERDIiwgcGRjLCBOVUxMKTsKIAogCWlmICgoQUNQSV9GQUlMVVJFKHN0YXR1cykpICYmIChwZGNfaW4pKQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJFcnJvciBldmFsdWF0aW5nIF9QREMsIHVzaW5nIGxlZ2FjeSBwZXJmLiBjb250cm9sLi4uXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJFcnJvciBldmFsdWF0aW5nIF9QREMsIHVzaW5nIGxlZ2FjeSBwZXJmLiBjb250cm9sLi4uXG4iKSk7CiAKIAlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKIH0KIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmFjcGlfcHJvY2Vzc29yX2RpciA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICphY3BpX3Byb2Nlc3Nvcl9kaXIgPSBOVUxMOwogCiBzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2luZm9fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKXNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKXNlcS0+cHJpdmF0ZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2luZm9fc2VxX3Nob3ciKTsKIApAQCAtMzA4LDQwICsyOTgsMzcgQEAKIAkJZ290byBlbmQ7CiAKIAlzZXFfcHJpbnRmKHNlcSwgInByb2Nlc3NvciBpZDogICAgICAgICAgICAlZFxuIgotCQkJImFjcGkgaWQ6ICAgICAgICAgICAgICAgICAlZFxuIgotCQkJImJ1cyBtYXN0ZXJpbmcgY29udHJvbDogICAlc1xuIgotCQkJInBvd2VyIG1hbmFnZW1lbnQ6ICAgICAgICAlc1xuIgotCQkJInRocm90dGxpbmcgY29udHJvbDogICAgICAlc1xuIgotCQkJImxpbWl0IGludGVyZmFjZTogICAgICAgICAlc1xuIiwKLQkJCXByLT5pZCwKLQkJCXByLT5hY3BpX2lkLAotCQkJcHItPmZsYWdzLmJtX2NvbnRyb2wgPyAieWVzIiA6ICJubyIsCi0JCQlwci0+ZmxhZ3MucG93ZXIgPyAieWVzIiA6ICJubyIsCi0JCQlwci0+ZmxhZ3MudGhyb3R0bGluZyA/ICJ5ZXMiIDogIm5vIiwKLQkJCXByLT5mbGFncy5saW1pdCA/ICJ5ZXMiIDogIm5vIik7CisJCSAgICJhY3BpIGlkOiAgICAgICAgICAgICAgICAgJWRcbiIKKwkJICAgImJ1cyBtYXN0ZXJpbmcgY29udHJvbDogICAlc1xuIgorCQkgICAicG93ZXIgbWFuYWdlbWVudDogICAgICAgICVzXG4iCisJCSAgICJ0aHJvdHRsaW5nIGNvbnRyb2w6ICAgICAgJXNcbiIKKwkJICAgImxpbWl0IGludGVyZmFjZTogICAgICAgICAlc1xuIiwKKwkJICAgcHItPmlkLAorCQkgICBwci0+YWNwaV9pZCwKKwkJICAgcHItPmZsYWdzLmJtX2NvbnRyb2wgPyAieWVzIiA6ICJubyIsCisJCSAgIHByLT5mbGFncy5wb3dlciA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgcHItPmZsYWdzLnRocm90dGxpbmcgPyAieWVzIiA6ICJubyIsCisJCSAgIHByLT5mbGFncy5saW1pdCA/ICJ5ZXMiIDogIm5vIik7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3Byb2Nlc3Nvcl9pbmZvX3NlcV9zaG93LAotCQkJCQkJUERFKGlub2RlKS0+ZGF0YSk7CisJCQkgICBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3Byb2Nlc3Nvcl9hZGRfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9hZGRfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeSA9IE5VTEw7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9hZGRfZnMiKTsKIAogCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJYWNwaV9wcm9jZXNzb3JfZGlyKTsKKwkJCQkJCSAgICAgYWNwaV9wcm9jZXNzb3JfZGlyKTsKIAkJaWYgKCFhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CkBAIC0zNDksMTEgKzMzNiwxMSBAQAogCiAJLyogJ2luZm8nIFtSXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9QUk9DRVNTT1JfRklMRV9JTkZPLAotCQlTX0lSVUdPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQkJICBTX0lSVUdPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJaWYgKCFlbnRyeSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCi0JCQlBQ1BJX1BST0NFU1NPUl9GSUxFX0lORk8pKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCisJCQkJICBBQ1BJX1BST0NFU1NPUl9GSUxFX0lORk8pKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3Byb2Nlc3Nvcl9pbmZvX2ZvcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtMzYyLDExICszNDksMTIgQEAKIAogCS8qICd0aHJvdHRsaW5nJyBbUi9XXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9QUk9DRVNTT1JfRklMRV9USFJPVFRMSU5HLAotCQlTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9QUk9DRVNTT1JfRklMRV9USFJPVFRMSU5HKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9QUk9DRVNTT1JfRklMRV9USFJPVFRMSU5HKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19mb3BzOwogCQllbnRyeS0+cHJvY19mb3BzLT53cml0ZSA9IGFjcGlfcHJvY2Vzc29yX3dyaXRlX3Rocm90dGxpbmc7CkBAIC0zNzYsMTEgKzM2NCwxMiBAQAogCiAJLyogJ2xpbWl0JyBbUi9XXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9QUk9DRVNTT1JfRklMRV9MSU1JVCwKLQkJU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfUFJPQ0VTU09SX0ZJTEVfTElNSVQpKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCisJCQkJICBBQ1BJX1BST0NFU1NPUl9GSUxFX0xJTUlUKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9wcm9jZXNzb3JfbGltaXRfZm9wczsKIAkJZW50cnktPnByb2NfZm9wcy0+d3JpdGUgPSBhY3BpX3Byb2Nlc3Nvcl93cml0ZV9saW1pdDsKQEAgLTM5MSwxOCArMzgwLDE3IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX3JlbW92ZV9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3JlbW92ZV9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9yZW1vdmVfZnMiKTsKIAogCWlmIChhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgewotCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX1BST0NFU1NPUl9GSUxFX0lORk8sYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX1BST0NFU1NPUl9GSUxFX0lORk8sCisJCQkJICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfUFJPQ0VTU09SX0ZJTEVfVEhST1RUTElORywKLQkJCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9QUk9DRVNTT1JfRklMRV9MSU1JVCxhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQkJICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfUFJPQ0VTU09SX0ZJTEVfTElNSVQsCisJCQkJICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLCBhY3BpX3Byb2Nlc3Nvcl9kaXIpOwogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IE5VTEw7CiAJfQpAQCAtNDQ2LDE1ICs0MzQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBJbnRlcmZhY2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX2dldF9pbmZvICgKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfaW5mbyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSAwOwotCXVuaW9uIGFjcGlfb2JqZWN0CW9iamVjdCA9IHswfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0ge3NpemVvZih1bmlvbiBhY3BpX29iamVjdCksICZvYmplY3R9OwotCXU4CQkJY3B1X2luZGV4OwotCXN0YXRpYyBpbnQJCWNwdTBfaW5pdGlhbGl6ZWQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKKwl1bmlvbiBhY3BpX29iamVjdCBvYmplY3QgPSB7IDAgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBzaXplb2YodW5pb24gYWNwaV9vYmplY3QpLCAmb2JqZWN0IH07CisJdTggY3B1X2luZGV4OworCXN0YXRpYyBpbnQgY3B1MF9pbml0aWFsaXplZDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2dldF9pbmZvIik7CiAKQEAgLTQ3MywxMSArNDU5LDEwIEBACiAJaWYgKGFjcGlfZmFkdC5WMV9wbTJfY250X2JsayAmJiBhY3BpX2ZhZHQucG0yX2NudF9sZW4pIHsKIAkJcHItPmZsYWdzLmJtX2NvbnRyb2wgPSAxOwogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiQnVzIG1hc3RlcmluZyBhcmJpdHJhdGlvbiBjb250cm9sIHByZXNlbnRcbiIpKTsKLQl9Ci0JZWxzZQorCQkJCSAgIkJ1cyBtYXN0ZXJpbmcgYXJiaXRyYXRpb24gY29udHJvbCBwcmVzZW50XG4iKSk7CisJfSBlbHNlCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJObyBidXMgbWFzdGVyaW5nIGFyYml0cmF0aW9uIGNvbnRyb2xcbiIpKTsKKwkJCQkgICJObyBidXMgbWFzdGVyaW5nIGFyYml0cmF0aW9uIGNvbnRyb2xcbiIpKTsKIAogCS8qCiAJICogRXZhbHV0ZSB0aGUgcHJvY2Vzc29yIG9iamVjdC4gIE5vdGUgdGhhdCBpdCBpcyBjb21tb24gb24gU01QIHRvCkBAIC00ODcsNTAgKzQ3Miw1MSBAQAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KHByLT5oYW5kbGUsIE5VTEwsIE5VTEwsICZidWZmZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIkVycm9yIGV2YWx1YXRpbmcgcHJvY2Vzc29yIG9iamVjdFxuIikpOworCQkJCSAgIkVycm9yIGV2YWx1YXRpbmcgcHJvY2Vzc29yIG9iamVjdFxuIikpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCiAJLyoKIAkgKiBUQkQ6IFN5bmNoIHByb2Nlc3NvciBJRCAodmlhIExBUElDL0xTQVBJQyBzdHJ1Y3R1cmVzKSBvbiBTTVAuCi0JICoJPj4+ICdhY3BpX2dldF9wcm9jZXNzb3JfaWQoYWNwaV9pZCwgJmlkKScgaW4gYXJjaC94eHgvYWNwaS5jCisJICogICAgICA+Pj4gJ2FjcGlfZ2V0X3Byb2Nlc3Nvcl9pZChhY3BpX2lkLCAmaWQpJyBpbiBhcmNoL3h4eC9hY3BpLmMKIAkgKi8KIAlwci0+YWNwaV9pZCA9IG9iamVjdC5wcm9jZXNzb3IucHJvY19pZDsKIAogCWNwdV9pbmRleCA9IGNvbnZlcnRfYWNwaWlkX3RvX2NwdShwci0+YWNwaV9pZCk7CiAKLSAgCS8qIEhhbmRsZSBVUCBzeXN0ZW0gcnVubmluZyBTTVAga2VybmVsLCB3aXRoIG5vIExBUElDIGluIE1BRFQgKi8KLSAgCWlmICggIWNwdTBfaW5pdGlhbGl6ZWQgJiYgKGNwdV9pbmRleCA9PSAweGZmKSAmJgotICAJCSAgICAgICAJKG51bV9vbmxpbmVfY3B1cygpID09IDEpKSB7Ci0gICAJCWNwdV9pbmRleCA9IDA7Ci0gICAJfQorCS8qIEhhbmRsZSBVUCBzeXN0ZW0gcnVubmluZyBTTVAga2VybmVsLCB3aXRoIG5vIExBUElDIGluIE1BRFQgKi8KKwlpZiAoIWNwdTBfaW5pdGlhbGl6ZWQgJiYgKGNwdV9pbmRleCA9PSAweGZmKSAmJgorCSAgICAobnVtX29ubGluZV9jcHVzKCkgPT0gMSkpIHsKKwkJY3B1X2luZGV4ID0gMDsKKwl9CiAKLSAgIAljcHUwX2luaXRpYWxpemVkID0gMTsKKwljcHUwX2luaXRpYWxpemVkID0gMTsKIAotICAgCXByLT5pZCA9IGNwdV9pbmRleDsKKwlwci0+aWQgPSBjcHVfaW5kZXg7CiAKLSAgCS8qCi0gIAkgKiAgRXh0cmEgUHJvY2Vzc29yIG9iamVjdHMgbWF5IGJlIGVudW1lcmF0ZWQgb24gTVAgc3lzdGVtcyB3aXRoCi0gIAkgKiAgbGVzcyB0aGFuIHRoZSBtYXggIyBvZiBDUFVzLiBUaGV5IHNob3VsZCBiZSBpZ25vcmVkIF9pZmYKLSAgCSAqICB0aGV5IGFyZSBwaHlzaWNhbGx5IG5vdCBwcmVzZW50LgotICAJICovCi0gICAJaWYgKGNwdV9pbmRleCA+PSAgTlJfQ1BVUykgewotICAgCQlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfcHJvY2Vzc29yX2hvdGFkZF9pbml0KHByLT5oYW5kbGUsICZwci0+aWQpKSkgewotICAgCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLSAgIAkJCQkiRXJyb3IgZ2V0dGluZyBjcHVpbmRleCBmb3IgYWNwaWlkIDB4JXhcbiIsCi0gICAJCQkJcHItPmFjcGlfaWQpKTsKLSAgIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKLSAgIAkJfQotICAgIAl9CisJLyoKKwkgKiAgRXh0cmEgUHJvY2Vzc29yIG9iamVjdHMgbWF5IGJlIGVudW1lcmF0ZWQgb24gTVAgc3lzdGVtcyB3aXRoCisJICogIGxlc3MgdGhhbiB0aGUgbWF4ICMgb2YgQ1BVcy4gVGhleSBzaG91bGQgYmUgaWdub3JlZCBfaWZmCisJICogIHRoZXkgYXJlIHBoeXNpY2FsbHkgbm90IHByZXNlbnQuCisJICovCisJaWYgKGNwdV9pbmRleCA+PSBOUl9DUFVTKSB7CisJCWlmIChBQ1BJX0ZBSUxVUkUKKwkJICAgIChhY3BpX3Byb2Nlc3Nvcl9ob3RhZGRfaW5pdChwci0+aGFuZGxlLCAmcHItPmlkKSkpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkVycm9yIGdldHRpbmcgY3B1aW5kZXggZm9yIGFjcGlpZCAweCV4XG4iLAorCQkJCQkgIHByLT5hY3BpX2lkKSk7CisJCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CisJCX0KKwl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJQcm9jZXNzb3IgWyVkOiVkXVxuIiwgcHItPmlkLAotCQlwci0+YWNwaV9pZCkpOworCQkJICBwci0+YWNwaV9pZCkpOwogCiAJaWYgKCFvYmplY3QucHJvY2Vzc29yLnBibGtfYWRkcmVzcykKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTm8gUEJMSyAoTlVMTCBhZGRyZXNzKVxuIikpOwogCWVsc2UgaWYgKG9iamVjdC5wcm9jZXNzb3IucGJsa19sZW5ndGggIT0gNikKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgUEJMSyBsZW5ndGggWyVkXVxuIiwKLQkJCW9iamVjdC5wcm9jZXNzb3IucGJsa19sZW5ndGgpKTsKKwkJCQkgIG9iamVjdC5wcm9jZXNzb3IucGJsa19sZW5ndGgpKTsKIAllbHNlIHsKIAkJcHItPnRocm90dGxpbmcuYWRkcmVzcyA9IG9iamVjdC5wcm9jZXNzb3IucGJsa19hZGRyZXNzOwogCQlwci0+dGhyb3R0bGluZy5kdXR5X29mZnNldCA9IGFjcGlfZmFkdC5kdXR5X29mZnNldDsKQEAgLTU1NywxMyArNTQzLDExIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3Byb2Nlc3Nvcl9zdGFydCgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3Jfc3RhcnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwcjsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3Jfc3RhcnQiKTsKIApAQCAtNTg0LDM2ICs1NjgsMzAgQEAKIAkJZ290byBlbmQ7CiAKIAlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIocHItPmhhbmRsZSwgQUNQSV9ERVZJQ0VfTk9USUZZLAotCQlhY3BpX3Byb2Nlc3Nvcl9ub3RpZnksIHByKTsKKwkJCQkJICAgICBhY3BpX3Byb2Nlc3Nvcl9ub3RpZnksIHByKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciBpbnN0YWxsaW5nIGRldmljZSBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIGluc3RhbGxpbmcgZGV2aWNlIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAJfQogCiAJYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdChwciwgZGV2aWNlKTsKIAogCWlmIChwci0+ZmxhZ3MudGhyb3R0bGluZykgewogCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoc3VwcG9ydHMiLAotCQkJYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSk7CisJCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKTsKIAkJcHJpbnRrKCIgJWQgdGhyb3R0bGluZyBzdGF0ZXMiLCBwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCk7CiAJCXByaW50aygiKVxuIik7CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCi0KLXN0YXRpYyB2b2lkCi1hY3BpX3Byb2Nlc3Nvcl9ub3RpZnkgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0JdTMyCQkJZXZlbnQsCi0Jdm9pZAkJCSpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3Jfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopIGRhdGE7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopZGF0YTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9ub3RpZnkiKTsKIApAQCAtNjI3LDcgKzYwNSw3IEBACiAJY2FzZSBBQ1BJX1BST0NFU1NPUl9OT1RJRllfUEVSRk9STUFOQ0U6CiAJCWFjcGlfcHJvY2Vzc29yX3BwY19oYXNfY2hhbmdlZChwcik7CiAJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGRldmljZSwgZXZlbnQsCi0JCQlwci0+cGVyZm9ybWFuY2VfcGxhdGZvcm1fbGltaXQpOworCQkJCQlwci0+cGVyZm9ybWFuY2VfcGxhdGZvcm1fbGltaXQpOwogCQlicmVhazsKIAljYXNlIEFDUElfUFJPQ0VTU09SX05PVElGWV9QT1dFUjoKIAkJYWNwaV9wcm9jZXNzb3JfY3N0X2hhc19jaGFuZ2VkKHByKTsKQEAgLTYzNSwxOSArNjEzLDE2IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJVbnN1cHBvcnRlZCBldmVudCBbMHgleF1cbiIsIGV2ZW50KSk7CisJCQkJICAiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOwogCQlicmVhazsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3Byb2Nlc3Nvcl9hZGQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwciA9IE5VTEw7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9hZGQiKTsKIApAQCAtNjY3LDIxICs2NDIsMTcgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9wcm9jZXNzb3JfcmVtb3ZlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlpbnQJCQl0eXBlKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3JlbW92ZSIpOwogCiAJaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCi0JcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopIGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKwlwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKIAlpZiAocHItPmlkID49IE5SX0NQVVMpIHsKIAkJa2ZyZWUocHIpOwpAQCAtNjk2LDEwICs2NjcsMTAgQEAKIAlhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9leGl0KHByLCBkZXZpY2UpOwogCiAJc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIocHItPmhhbmRsZSwgQUNQSV9ERVZJQ0VfTk9USUZZLAotCQlhY3BpX3Byb2Nlc3Nvcl9ub3RpZnkpOworCQkJCQkgICAgYWNwaV9wcm9jZXNzb3Jfbm90aWZ5KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAJfQogCiAJYWNwaV9wcm9jZXNzb3JfcmVtb3ZlX2ZzKGRldmljZSk7CkBAIC03MTgsMzMgKzY4OSwyOCBAQAogCiBzdGF0aWMgaW50IGlzX3Byb2Nlc3Nvcl9wcmVzZW50KGFjcGlfaGFuZGxlIGhhbmRsZSk7CiAKLXN0YXRpYyBpbnQKLWlzX3Byb2Nlc3Nvcl9wcmVzZW50KAotCWFjcGlfaGFuZGxlIGhhbmRsZSkKK3N0YXRpYyBpbnQgaXNfcHJvY2Vzc29yX3ByZXNlbnQoYWNwaV9oYW5kbGUgaGFuZGxlKQogewotCWFjcGlfc3RhdHVzIAkJc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcJCXN0YSA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgc3RhID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImlzX3Byb2Nlc3Nvcl9wcmVzZW50Iik7CiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhKHN0YSAmIEFDUElfU1RBX1BSRVNFTlQpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiUHJvY2Vzc29yIERldmljZSBpcyBub3QgcHJlc2VudFxuIikpOworCQkJCSAgIlByb2Nlc3NvciBEZXZpY2UgaXMgbm90IHByZXNlbnRcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKDApOwogCX0KIAlyZXR1cm5fVkFMVUUoMSk7CiB9CiAKLQogc3RhdGljCi1pbnQgYWNwaV9wcm9jZXNzb3JfZGV2aWNlX2FkZCgKLQlhY3BpX2hhbmRsZQloYW5kbGUsCi0Jc3RydWN0IGFjcGlfZGV2aWNlICoqZGV2aWNlKQoraW50IGFjcGlfcHJvY2Vzc29yX2RldmljZV9hZGQoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UgKipkZXZpY2UpCiB7Ci0JYWNwaV9oYW5kbGUJCXBoYW5kbGU7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlIAkqcGRldjsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByOworCWFjcGlfaGFuZGxlIHBoYW5kbGU7CisJc3RydWN0IGFjcGlfZGV2aWNlICpwZGV2OworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHI7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9kZXZpY2VfYWRkIik7CiAKQEAgLTc2NiwyMSArNzMyLDE3IEBACiAJaWYgKCFwcikKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCi0JaWYgKChwci0+aWQgPj0wKSAmJiAocHItPmlkIDwgTlJfQ1BVUykpIHsKKwlpZiAoKHByLT5pZCA+PSAwKSAmJiAocHItPmlkIDwgTlJfQ1BVUykpIHsKIAkJa29iamVjdF9ob3RwbHVnKCYoKmRldmljZSktPmtvYmosIEtPQkpfT05MSU5FKTsKIAl9CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIHN0YXRpYyB2b2lkCi1hY3BpX3Byb2Nlc3Nvcl9ob3RwbHVnX25vdGlmeSAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQl1MzIJCQlldmVudCwKLQl2b2lkCQkJKmRhdGEpCithY3BpX3Byb2Nlc3Nvcl9ob3RwbHVnX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAlpbnQgcmVzdWx0OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfaG90cGx1Z19ub3RpZnkiKTsKQEAgLTc4OSw4ICs3NTEsOCBAQAogCWNhc2UgQUNQSV9OT1RJRllfQlVTX0NIRUNLOgogCWNhc2UgQUNQSV9OT1RJRllfREVWSUNFX0NIRUNLOgogCQlwcmludGsoIlByb2Nlc3NvciBkcml2ZXIgcmVjZWl2ZWQgJXMgZXZlbnRcbiIsCi0JCQkoZXZlbnQ9PUFDUElfTk9USUZZX0JVU19DSEVDSyk/Ci0JCQkiQUNQSV9OT1RJRllfQlVTX0NIRUNLIjoiQUNQSV9OT1RJRllfREVWSUNFX0NIRUNLIik7CisJCSAgICAgICAoZXZlbnQgPT0gQUNQSV9OT1RJRllfQlVTX0NIRUNLKSA/CisJCSAgICAgICAiQUNQSV9OT1RJRllfQlVTX0NIRUNLIiA6ICJBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0siKTsKIAogCQlpZiAoIWlzX3Byb2Nlc3Nvcl9wcmVzZW50KGhhbmRsZSkpCiAJCQlicmVhazsKQEAgLTc5OSwxNCArNzYxLDE0IEBACiAJCQlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9kZXZpY2VfYWRkKGhhbmRsZSwgJmRldmljZSk7CiAJCQlpZiAocmVzdWx0KQogCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSJVbmFibGUgdG8gYWRkIHRoZSBkZXZpY2VcbiIpKTsKKwkJCQkJCSAgIlVuYWJsZSB0byBhZGQgdGhlIGRldmljZVxuIikpOwogCQkJYnJlYWs7CiAJCX0KIAogCQlwciA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAkJaWYgKCFwcikgewogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiRHJpdmVyIGRhdGEgaXMgTlVMTFxuIikpOworCQkJCQkgICJEcml2ZXIgZGF0YSBpcyBOVUxMXG4iKSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC04MTYsMjQgKzc3OCwyNyBAQAogCQl9CiAKIAkJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3Jfc3RhcnQoZGV2aWNlKTsKLQkJaWYgKCghcmVzdWx0KSAmJiAoKHByLT5pZCA+PTApICYmIChwci0+aWQgPCBOUl9DUFVTKSkpIHsKKwkJaWYgKCghcmVzdWx0KSAmJiAoKHByLT5pZCA+PSAwKSAmJiAocHItPmlkIDwgTlJfQ1BVUykpKSB7CiAJCQlrb2JqZWN0X2hvdHBsdWcoJmRldmljZS0+a29iaiwgS09CSl9PTkxJTkUpOwogCQl9IGVsc2UgewogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiRGV2aWNlIFslc10gZmFpbGVkIHRvIHN0YXJ0XG4iLAotCQkJCWFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKSk7CisJCQkJCSAgIkRldmljZSBbJXNdIGZhaWxlZCB0byBzdGFydFxuIiwKKwkJCQkJICBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSkpOwogCQl9Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgQUNQSV9OT1RJRllfRUpFQ1RfUkVRVUVTVDoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJyZWNlaXZlZCBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJyZWNlaXZlZCBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUXG4iKSk7CiAKIAkJaWYgKGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmZGV2aWNlKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwiRGV2aWNlIGRvbid0IGV4aXN0LCBkcm9wcGluZyBFSkVDVFxuIikpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiRGV2aWNlIGRvbid0IGV4aXN0LCBkcm9wcGluZyBFSkVDVFxuIikpOwogCQkJYnJlYWs7CiAJCX0KIAkJcHIgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAJCWlmICghcHIpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIkRyaXZlciBkYXRhIGlzIE5VTEwsIGRyb3BwaW5nIEVKRUNUXG4iKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJEcml2ZXIgZGF0YSBpcyBOVUxMLCBkcm9wcGluZyBFSkVDVFxuIikpOwogCQkJcmV0dXJuX1ZPSUQ7CiAJCX0KIApAQCAtODQyLDcgKzgwNyw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJVbnN1cHBvcnRlZCBldmVudCBbMHgleF1cbiIsIGV2ZW50KSk7CisJCQkJICAiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOwogCQlicmVhazsKIAl9CiAKQEAgLTg1MSw0NSArODE2LDM5IEBACiAKIHN0YXRpYyBhY3BpX3N0YXR1cwogcHJvY2Vzc29yX3dhbGtfbmFtZXNwYWNlX2NiKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQl1MzIgbHZsLAotCXZvaWQgKmNvbnRleHQsCi0Jdm9pZCAqKnJ2KQorCQkJICAgIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKIHsKLQlhY3BpX3N0YXR1cyAJCQlzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWludCAqYWN0aW9uID0gY29udGV4dDsKLQlhY3BpX29iamVjdF90eXBlCXR5cGUgPSAwOworCWFjcGlfb2JqZWN0X3R5cGUgdHlwZSA9IDA7CiAKIAlzdGF0dXMgPSBhY3BpX2dldF90eXBlKGhhbmRsZSwgJnR5cGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuKEFFX09LKTsKKwkJcmV0dXJuIChBRV9PSyk7CiAKIAlpZiAodHlwZSAhPSBBQ1BJX1RZUEVfUFJPQ0VTU09SKQotCQlyZXR1cm4oQUVfT0spOworCQlyZXR1cm4gKEFFX09LKTsKIAotCXN3aXRjaCgqYWN0aW9uKSB7CisJc3dpdGNoICgqYWN0aW9uKSB7CiAJY2FzZSBJTlNUQUxMX05PVElGWV9IQU5ETEVSOgogCQlhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoaGFuZGxlLAotCQkJQUNQSV9TWVNURU1fTk9USUZZLAotCQkJYWNwaV9wcm9jZXNzb3JfaG90cGx1Z19ub3RpZnksCi0JCQlOVUxMKTsKKwkJCQkJICAgIEFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJICAgIGFjcGlfcHJvY2Vzc29yX2hvdHBsdWdfbm90aWZ5LAorCQkJCQkgICAgTlVMTCk7CiAJCWJyZWFrOwogCWNhc2UgVU5JTlNUQUxMX05PVElGWV9IQU5ETEVSOgogCQlhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihoYW5kbGUsCi0JCQlBQ1BJX1NZU1RFTV9OT1RJRlksCi0JCQlhY3BpX3Byb2Nlc3Nvcl9ob3RwbHVnX25vdGlmeSk7CisJCQkJCSAgIEFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJICAgYWNwaV9wcm9jZXNzb3JfaG90cGx1Z19ub3RpZnkpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKLQlyZXR1cm4oQUVfT0spOworCXJldHVybiAoQUVfT0spOwogfQogCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9wcm9jZXNzb3JfaG90YWRkX2luaXQoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQlpbnQJCQkqcF9jcHUpCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9wcm9jZXNzb3JfaG90YWRkX2luaXQoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKnBfY3B1KQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2hvdGFkZF9pbml0Iik7CiAKQEAgLTkwOCw1NyArODY3LDQ3IEBACiAJcmV0dXJuX1ZBTFVFKEFFX09LKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3Byb2Nlc3Nvcl9oYW5kbGVfZWplY3Qoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfaGFuZGxlX2VqZWN0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7CiAJaWYgKGNwdV9vbmxpbmUocHItPmlkKSkgewotCQlyZXR1cm4oLUVJTlZBTCk7CisJCXJldHVybiAoLUVJTlZBTCk7CiAJfQogCWFyY2hfdW5yZWdpc3Rlcl9jcHUocHItPmlkKTsKIAlhY3BpX3VubWFwX2xzYXBpYyhwci0+aWQpOwotCXJldHVybigwKTsKKwlyZXR1cm4gKDApOwogfQogI2Vsc2UKLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9wcm9jZXNzb3JfaG90YWRkX2luaXQoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQlpbnQJCQkqcF9jcHUpCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9wcm9jZXNzb3JfaG90YWRkX2luaXQoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKnBfY3B1KQogewogCXJldHVybiBBRV9FUlJPUjsKIH0KLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX2hhbmRsZV9lamVjdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9oYW5kbGVfZWplY3Qoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKLQlyZXR1cm4oLUVJTlZBTCk7CisJcmV0dXJuICgtRUlOVkFMKTsKIH0KICNlbmRpZgogCi0KIHN0YXRpYwogdm9pZCBhY3BpX3Byb2Nlc3Nvcl9pbnN0YWxsX2hvdHBsdWdfbm90aWZ5KHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19DUFUKIAlpbnQgYWN0aW9uID0gSU5TVEFMTF9OT1RJRllfSEFORExFUjsKIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9QUk9DRVNTT1IsCi0JCQkJICAgICBBQ1BJX1JPT1RfT0JKRUNULAotCQkJCSAgICAgQUNQSV9VSU5UMzJfTUFYLAotCQkJCSAgICAgcHJvY2Vzc29yX3dhbGtfbmFtZXNwYWNlX2NiLAotCQkJCSAgICAgJmFjdGlvbiwgTlVMTCk7CisJCQkgICAgQUNQSV9ST09UX09CSkVDVCwKKwkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsCisJCQkgICAgcHJvY2Vzc29yX3dhbGtfbmFtZXNwYWNlX2NiLCAmYWN0aW9uLCBOVUxMKTsKICNlbmRpZgogfQogCi0KIHN0YXRpYwogdm9pZCBhY3BpX3Byb2Nlc3Nvcl91bmluc3RhbGxfaG90cGx1Z19ub3RpZnkodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVQogCWludCBhY3Rpb24gPSBVTklOU1RBTExfTk9USUZZX0hBTkRMRVI7CiAJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfUFJPQ0VTU09SLAotCQkJCSAgICAgQUNQSV9ST09UX09CSkVDVCwKLQkJCQkgICAgIEFDUElfVUlOVDMyX01BWCwKLQkJCQkgICAgIHByb2Nlc3Nvcl93YWxrX25hbWVzcGFjZV9jYiwKLQkJCQkgICAgICZhY3Rpb24sIE5VTEwpOworCQkJICAgIEFDUElfUk9PVF9PQkpFQ1QsCisJCQkgICAgQUNQSV9VSU5UMzJfTUFYLAorCQkJICAgIHByb2Nlc3Nvcl93YWxrX25hbWVzcGFjZV9jYiwgJmFjdGlvbiwgTlVMTCk7CiAjZW5kaWYKIH0KIApAQCAtOTY4LDEwICs5MTcsOSBAQAogICogQUNQSSwgYnV0IG5lZWRzIHN5bWJvbHMgZnJvbSB0aGlzIGRyaXZlcgogICovCiAKLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3Byb2Nlc3Nvcl9pbml0ICh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9wcm9jZXNzb3JfaW5pdCh2b2lkKQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9pbml0Iik7CiAKQEAgLTk5OCw5ICs5NDYsNyBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWFjcGlfcHJvY2Vzc29yX2V4aXQgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNwaV9wcm9jZXNzb3JfZXhpdCh2b2lkKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2V4aXQiKTsKIApAQCAtMTAxNyw3ICs5NjMsNiBAQAogCXJldHVybl9WT0lEOwogfQogCi0KIG1vZHVsZV9pbml0KGFjcGlfcHJvY2Vzc29yX2luaXQpOwogbW9kdWxlX2V4aXQoYWNwaV9wcm9jZXNzb3JfZXhpdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKaW5kZXggMmMwNDc0MC4uMjZhM2E0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKQEAgLTQ4LDE1ICs0OCwxMiBAQAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9DTEFTUyAgICAgICAgICAgICJwcm9jZXNzb3IiCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0RSSVZFUl9OQU1FICAgICAgIkFDUEkgUHJvY2Vzc29yIERyaXZlciIKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICAgICAgQUNQSV9QUk9DRVNTT1JfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FICAgICAgICAgICAgICAgICgiYWNwaV9wcm9jZXNzb3IiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3Byb2Nlc3NvciIpCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0ZJTEVfUE9XRVIJInBvd2VyIgotCiAjZGVmaW5lIFVTX1RPX1BNX1RJTUVSX1RJQ0tTKHQpCQkoKHQgKiAoUE1fVElNRVJfRlJFUVVFTkNZLzEwMDApKSAvIDEwMDApCiAjZGVmaW5lIEMyX09WRVJIRUFECQkJNAkvKiAxdXMgKDMuNTc5IHRpY2tzIHBlciB1cykgKi8KICNkZWZpbmUgQzNfT1ZFUkhFQUQJCQk0CS8qIDF1cyAoMy41NzkgdGlja3MgcGVyIHVzKSAqLwotCi1zdGF0aWMgdm9pZCAoKnBtX2lkbGVfc2F2ZSkodm9pZCk7CitzdGF0aWMgdm9pZCAoKnBtX2lkbGVfc2F2ZSkgKHZvaWQpOwogbW9kdWxlX3BhcmFtKG1heF9jc3RhdGUsIHVpbnQsIDA2NDQpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IG5vY3N0ID0gMDsKQEAgLTY5LDcgKzY2LDggQEAKICAqIDEwMCBIWjogMHgwMDAwMDAwRjogNCBqaWZmaWVzID0gNDBtcwogICogcmVkdWNlIGhpc3RvcnkgZm9yIG1vcmUgYWdncmVzc2l2ZSBlbnRyeSBpbnRvIEMzCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYm1faGlzdG9yeSA9IChIWiA+PSA4MDAgPyAweEZGRkZGRkZGIDogKCgxVSA8PCAoSFogLyAyNSkpIC0gMSkpOworc3RhdGljIHVuc2lnbmVkIGludCBibV9oaXN0b3J5ID0KKyAgICAoSFogPj0gODAwID8gMHhGRkZGRkZGRiA6ICgoMVUgPDwgKEhaIC8gMjUpKSAtIDEpKTsKIG1vZHVsZV9wYXJhbShibV9oaXN0b3J5LCB1aW50LCAwNjQ0KTsKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyIE1hbmFnZW1lbnQKQEAgLTg3LDM0ICs4NSwzNiBAQAogCQlyZXR1cm4gMDsKIAogCXByaW50ayhLRVJOX05PVElDRSBQUkVGSVggIiVzIGRldGVjdGVkIC0gbGltaXRpbmcgdG8gQyVsZCBtYXhfY3N0YXRlLiIKLQkJIiBPdmVycmlkZSB3aXRoIFwicHJvY2Vzc29yLm1heF9jc3RhdGU9JWRcIlxuIiwgaWQtPmlkZW50LAotCQkobG9uZylpZC0+ZHJpdmVyX2RhdGEsIEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUiArIDEpOworCSAgICAgICAiIE92ZXJyaWRlIHdpdGggXCJwcm9jZXNzb3IubWF4X2NzdGF0ZT0lZFwiXG4iLCBpZC0+aWRlbnQsCisJICAgICAgIChsb25nKWlkLT5kcml2ZXJfZGF0YSwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSICsgMSk7CiAKIAltYXhfY3N0YXRlID0gKGxvbmcpaWQtPmRyaXZlcl9kYXRhOwogCiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgcHJvY2Vzc29yX3Bvd2VyX2RtaV90YWJsZVtdID0gewotCXsgc2V0X21heF9jc3RhdGUsICJJQk0gVGhpbmtQYWQgUjQwZSIsIHsKLQkgIERNSV9NQVRDSChETUlfQklPU19WRU5ET1IsIklCTSIpLAotCSAgRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sIjFTRVQ2MFdXIikgfSwgKHZvaWQqKTF9LAotCXsgc2V0X21heF9jc3RhdGUsICJNZWRpb24gNDE3MDAiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKLQkgIERNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCJSMDEtQTFKIikgfSwgKHZvaWQqKTF9LAotCXsgc2V0X21heF9jc3RhdGUsICJDbGV2byA1NjAwRCIsIHsKLQkgIERNSV9NQVRDSChETUlfQklPU19WRU5ET1IsIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAotCSAgRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sIlNIRTg0NU0wLjg2Qy4wMDEzLkQuMDMwMjEzMTMwNyIpIH0sCi0JICAodm9pZCopMn0sCisJe3NldF9tYXhfY3N0YXRlLCAiSUJNIFRoaW5rUGFkIFI0MGUiLCB7CisJCQkJCSAgICAgICBETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLAorCQkJCQkJCSAiSUJNIiksCisJCQkJCSAgICAgICBETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwKKwkJCQkJCQkgIjFTRVQ2MFdXIil9LAorCSAodm9pZCAqKTF9LAorCXtzZXRfbWF4X2NzdGF0ZSwgIk1lZGlvbiA0MTcwMCIsIHsKKwkJCQkJICBETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLAorCQkJCQkJICAgICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCQkJICBETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwKKwkJCQkJCSAgICAiUjAxLUExSiIpfSwgKHZvaWQgKikxfSwKKwl7c2V0X21heF9jc3RhdGUsICJDbGV2byA1NjAwRCIsIHsKKwkJCQkJIERNSV9NQVRDSChETUlfQklPU19WRU5ET1IsCisJCQkJCQkgICAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQkJCSBETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwKKwkJCQkJCSAgICJTSEU4NDVNMC44NkMuMDAxMy5ELjAzMDIxMzEzMDciKX0sCisJICh2b2lkICopMn0sCiAJe30sCiB9OwogCi0KLXN0YXRpYyBpbmxpbmUgdTMyCi10aWNrc19lbGFwc2VkICgKLQl1MzIJCQl0MSwKLQl1MzIJCQl0MikKK3N0YXRpYyBpbmxpbmUgdTMyIHRpY2tzX2VsYXBzZWQodTMyIHQxLCB1MzIgdDIpCiB7CiAJaWYgKHQyID49IHQxKQogCQlyZXR1cm4gKHQyIC0gdDEpOwpAQCAtMTI0LDEzICsxMjQsMTEgQEAKIAkJcmV0dXJuICgoMHhGRkZGRkZGRiAtIHQxKSArIHQyKTsKIH0KIAotCiBzdGF0aWMgdm9pZAotYWNwaV9wcm9jZXNzb3JfcG93ZXJfYWN0aXZhdGUgKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIsCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICAqbmV3KQorYWNwaV9wcm9jZXNzb3JfcG93ZXJfYWN0aXZhdGUoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqbmV3KQogewotCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAgKm9sZDsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKm9sZDsKIAogCWlmICghcHIgfHwgIW5ldykKIAkJcmV0dXJuOwpAQCAtMTM5LDcgKzEzNyw3IEBACiAKIAlpZiAob2xkKQogCQlvbGQtPnByb21vdGlvbi5jb3VudCA9IDA7Ci0gCW5ldy0+ZGVtb3Rpb24uY291bnQgPSAwOworCW5ldy0+ZGVtb3Rpb24uY291bnQgPSAwOwogCiAJLyogQ2xlYW51cCBmcm9tIG9sZCBzdGF0ZS4gKi8KIAlpZiAob2xkKSB7CkBAIC0xNDcsNyArMTQ1LDggQEAKIAkJY2FzZSBBQ1BJX1NUQVRFX0MzOgogCQkJLyogRGlzYWJsZSBidXMgbWFzdGVyIHJlbG9hZCAqLwogCQkJaWYgKG5ldy0+dHlwZSAhPSBBQ1BJX1NUQVRFX0MzICYmIHByLT5mbGFncy5ibV9jaGVjaykKLQkJCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1JMRCwgMCwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxELCAwLAorCQkJCQkJICBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE1Nyw3ICsxNTYsOCBAQAogCWNhc2UgQUNQSV9TVEFURV9DMzoKIAkJLyogRW5hYmxlIGJ1cyBtYXN0ZXIgcmVsb2FkICovCiAJCWlmIChvbGQtPnR5cGUgIT0gQUNQSV9TVEFURV9DMyAmJiBwci0+ZmxhZ3MuYm1fY2hlY2spCi0JCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1JMRCwgMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9STEQsIDEsCisJCQkJCSAgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCQlicmVhazsKIAl9CiAKQEAgLTE2NiwxNyArMTY2LDE1IEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgYXRvbWljX3QgYzNfY3B1X2NvdW50OwogCi1zdGF0aWMgYXRvbWljX3QgCWMzX2NwdV9jb3VudDsKLQotCi1zdGF0aWMgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9pZGxlICh2b2lkKQorc3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3JfaWRsZSh2b2lkKQogewotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIgPSBOVUxMOworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSBOVUxMOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3ggPSBOVUxMOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqbmV4dF9zdGF0ZSA9IE5VTEw7Ci0JaW50CQkJc2xlZXBfdGlja3MgPSAwOwotCXUzMgkJCXQxLCB0MiA9IDA7CisJaW50IHNsZWVwX3RpY2tzID0gMDsKKwl1MzIgdDEsIHQyID0gMDsKIAogCXByID0gcHJvY2Vzc29yc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKIAlpZiAoIXByKQpAQCAtMjA4LDggKzIwNiw4IEBACiAJICogZm9yIGRlbW90aW9uLgogCSAqLwogCWlmIChwci0+ZmxhZ3MuYm1fY2hlY2spIHsKLQkJdTMyCQlibV9zdGF0dXMgPSAwOwotCQl1bnNpZ25lZCBsb25nCWRpZmYgPSBqaWZmaWVzIC0gcHItPnBvd2VyLmJtX2NoZWNrX3RpbWVzdGFtcDsKKwkJdTMyIGJtX3N0YXR1cyA9IDA7CisJCXVuc2lnbmVkIGxvbmcgZGlmZiA9IGppZmZpZXMgLSBwci0+cG93ZXIuYm1fY2hlY2tfdGltZXN0YW1wOwogCiAJCWlmIChkaWZmID4gMzIpCiAJCQlkaWZmID0gMzI7CkBAIC0yMjMsMTEgKzIyMSwxMSBAQAogCQl9CiAKIAkJYWNwaV9nZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9TVEFUVVMsCi0JCQkmYm1fc3RhdHVzLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCQkJICAmYm1fc3RhdHVzLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAJCWlmIChibV9zdGF0dXMpIHsKIAkJCXByLT5wb3dlci5ibV9hY3Rpdml0eSsrOwogCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9TVEFUVVMsCi0JCQkJMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkJCQkgIDEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKIAkJfQogCQkvKgogCQkgKiBQSUlYNCBFcnJhdHVtICMxODogTm90ZSB0aGF0IEJNX1NUUyBkb2Vzbid0IGFsd2F5cyByZWZsZWN0CkBAIC0yMzYsNyArMjM0LDcgQEAKIAkJICovCiAJCWVsc2UgaWYgKGVycmF0YS5waWl4NC5ibWlzeCkgewogCQkJaWYgKChpbmJfcChlcnJhdGEucGlpeDQuYm1pc3ggKyAweDAyKSAmIDB4MDEpCi0JCQkJfHwgKGluYl9wKGVycmF0YS5waWl4NC5ibWlzeCArIDB4MEEpICYgMHgwMSkpCisJCQkgICAgfHwgKGluYl9wKGVycmF0YS5waWl4NC5ibWlzeCArIDB4MEEpICYgMHgwMSkpCiAJCQkJcHItPnBvd2VyLmJtX2FjdGl2aXR5Kys7CiAJCX0KIApAQCAtMjgxLDcgKzI3OSw3IEBACiAJCWVsc2UKIAkJCXNhZmVfaGFsdCgpOwogCQkvKgotICAgICAgICAgICAgICAgICAqIFRCRDogQ2FuJ3QgZ2V0IHRpbWUgZHVyYXRpb24gd2hpbGUgaW4gQzEsIGFzIHJlc3VtZXMKKwkJICogVEJEOiBDYW4ndCBnZXQgdGltZSBkdXJhdGlvbiB3aGlsZSBpbiBDMSwgYXMgcmVzdW1lcwogCQkgKiAgICAgIGdvIHRvIGFuIElTUiByYXRoZXIgdGhhbiBoZXJlLiAgTmVlZCB0byBpbnN0cnVtZW50CiAJCSAqICAgICAgYmFzZSBpbnRlcnJ1cHQgaGFuZGxlci4KIAkJICovCkBAIC0zMDAsMjYgKzI5OCwyNyBAQAogCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAqLwogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCS8qIENvbXB1dGUgdGltZSAodGlja3MpIHRoYXQgd2Ugd2VyZSBhY3R1YWxseSBhc2xlZXAgKi8KLQkJc2xlZXBfdGlja3MgPSB0aWNrc19lbGFwc2VkKHQxLCB0MikgLSBjeC0+bGF0ZW5jeV90aWNrcyAtIEMyX09WRVJIRUFEOworCQlzbGVlcF90aWNrcyA9CisJCSAgICB0aWNrc19lbGFwc2VkKHQxLCB0MikgLSBjeC0+bGF0ZW5jeV90aWNrcyAtIEMyX09WRVJIRUFEOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9TVEFURV9DMzoKLQkJCisKIAkJaWYgKHByLT5mbGFncy5ibV9jaGVjaykgewogCQkJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZjM19jcHVfY291bnQpID09Ci0JCQkJCW51bV9vbmxpbmVfY3B1cygpKSB7CisJCQkgICAgbnVtX29ubGluZV9jcHVzKCkpIHsKIAkJCQkvKgogCQkJCSAqIEFsbCBDUFVzIGFyZSB0cnlpbmcgdG8gZ28gdG8gQzMKIAkJCQkgKiBEaXNhYmxlIGJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24KIAkJCQkgKi8KIAkJCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19BUkJfRElTQUJMRSwgMSwKLQkJCQkJQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkJCQkJICBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKiBTTVAgd2l0aCBubyBzaGFyZWQgY2FjaGUuLi4gSW52YWxpZGF0ZSBjYWNoZSAgKi8KIAkJCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CiAJCX0KLQkJCisKIAkJLyogR2V0IHN0YXJ0IHRpbWUgKHRpY2tzKSAqLwogCQl0MSA9IGlubChhY3BpX2ZhZHQueHBtX3Rtcl9ibGsuYWRkcmVzcyk7CiAJCS8qIEludm9rZSBDMyAqLwpAQCAtMzMxLDEzICszMzAsMTUgQEAKIAkJaWYgKHByLT5mbGFncy5ibV9jaGVjaykgewogCQkJLyogRW5hYmxlIGJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gKi8KIAkJCWF0b21pY19kZWMoJmMzX2NwdV9jb3VudCk7Ci0JCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19BUkJfRElTQUJMRSwgMCwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQVJCX0RJU0FCTEUsIDAsCisJCQkJCSAgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCQl9CiAKIAkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8KIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQkvKiBDb21wdXRlIHRpbWUgKHRpY2tzKSB0aGF0IHdlIHdlcmUgYWN0dWFsbHkgYXNsZWVwICovCi0JCXNsZWVwX3RpY2tzID0gdGlja3NfZWxhcHNlZCh0MSwgdDIpIC0gY3gtPmxhdGVuY3lfdGlja3MgLSBDM19PVkVSSEVBRDsKKwkJc2xlZXBfdGlja3MgPQorCQkgICAgdGlja3NfZWxhcHNlZCh0MSwgdDIpIC0gY3gtPmxhdGVuY3lfdGlja3MgLSBDM19PVkVSSEVBRDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzU5LDE1ICszNjAsMTggQEAKIAkgICAgKChjeC0+cHJvbW90aW9uLnN0YXRlIC0gcHItPnBvd2VyLnN0YXRlcykgPD0gbWF4X2NzdGF0ZSkpIHsKIAkJaWYgKHNsZWVwX3RpY2tzID4gY3gtPnByb21vdGlvbi50aHJlc2hvbGQudGlja3MpIHsKIAkJCWN4LT5wcm9tb3Rpb24uY291bnQrKzsKLSAJCQljeC0+ZGVtb3Rpb24uY291bnQgPSAwOwotCQkJaWYgKGN4LT5wcm9tb3Rpb24uY291bnQgPj0gY3gtPnByb21vdGlvbi50aHJlc2hvbGQuY291bnQpIHsKKwkJCWN4LT5kZW1vdGlvbi5jb3VudCA9IDA7CisJCQlpZiAoY3gtPnByb21vdGlvbi5jb3VudCA+PQorCQkJICAgIGN4LT5wcm9tb3Rpb24udGhyZXNob2xkLmNvdW50KSB7CiAJCQkJaWYgKHByLT5mbGFncy5ibV9jaGVjaykgewotCQkJCQlpZiAoIShwci0+cG93ZXIuYm1fYWN0aXZpdHkgJiBjeC0+cHJvbW90aW9uLnRocmVzaG9sZC5ibSkpIHsKLQkJCQkJCW5leHRfc3RhdGUgPSBjeC0+cHJvbW90aW9uLnN0YXRlOworCQkJCQlpZiAoIQorCQkJCQkgICAgKHByLT5wb3dlci5ibV9hY3Rpdml0eSAmIGN4LT4KKwkJCQkJICAgICBwcm9tb3Rpb24udGhyZXNob2xkLmJtKSkgeworCQkJCQkJbmV4dF9zdGF0ZSA9CisJCQkJCQkgICAgY3gtPnByb21vdGlvbi5zdGF0ZTsKIAkJCQkJCWdvdG8gZW5kOwogCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgeworCQkJCX0gZWxzZSB7CiAJCQkJCW5leHRfc3RhdGUgPSBjeC0+cHJvbW90aW9uLnN0YXRlOwogCQkJCQlnb3RvIGVuZDsKIAkJCQl9CkBAIC0zOTIsNyArMzk2LDcgQEAKIAkJfQogCX0KIAotZW5kOgorICAgICAgZW5kOgogCS8qCiAJICogRGVtb3RlIGlmIGN1cnJlbnQgc3RhdGUgZXhjZWVkcyBtYXhfY3N0YXRlCiAJICovCkBAIC00MTIsNyArNDE2LDcgQEAKIAogCXJldHVybjsKIAotIGVhc3lfb3V0OgorICAgICAgZWFzeV9vdXQ6CiAJLyogZG8gQzEgaW5zdGVhZCBvZiBidXN5IGxvb3AgKi8KIAlpZiAocG1faWRsZV9zYXZlKQogCQlwbV9pZGxlX3NhdmUoKTsKQEAgLTQyMSwxMCArNDI1LDcgQEAKIAlyZXR1cm47CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9wcm9jZXNzb3Jfc2V0X3Bvd2VyX3BvbGljeSAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwcikKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3Jfc2V0X3Bvd2VyX3BvbGljeShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGludCBzdGF0ZV9pc19zZXQgPSAwOwpAQCAtNDMyLDcgKzQzMyw3IEBACiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpoaWdoZXIgPSBOVUxMOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3g7CiAKLSAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3Jfc2V0X3Bvd2VyX3BvbGljeSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3NldF9wb3dlcl9wb2xpY3kiKTsKIAogCWlmICghcHIpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKQEAgLTQ0Nyw3ICs0NDgsNyBAQAogCSAqLwogCiAJLyogc3RhcnR1cCBzdGF0ZSAqLwotCWZvciAoaT0xOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspIHsKKwlmb3IgKGkgPSAxOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspIHsKIAkJY3ggPSAmcHItPnBvd2VyLnN0YXRlc1tpXTsKIAkJaWYgKCFjeC0+dmFsaWQpCiAJCQljb250aW51ZTsKQEAgLTQ1NiwxMyArNDU3LDEzIEBACiAJCQlwci0+cG93ZXIuc3RhdGUgPSBjeDsKIAkJc3RhdGVfaXNfc2V0Kys7CiAJCWJyZWFrOwotIAl9CisJfQogCiAJaWYgKCFzdGF0ZV9pc19zZXQpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAogCS8qIGRlbW90aW9uICovCi0JZm9yIChpPTE7IGkgPCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVI7IGkrKykgeworCWZvciAoaSA9IDE7IGkgPCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVI7IGkrKykgewogCQljeCA9ICZwci0+cG93ZXIuc3RhdGVzW2ldOwogCQlpZiAoIWN4LT52YWxpZCkKIAkJCWNvbnRpbnVlOwpAQCAtNDg1LDcgKzQ4Niw3IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoaGlnaGVyKSB7Ci0JCQljeC0+cHJvbW90aW9uLnN0YXRlICA9IGhpZ2hlcjsKKwkJCWN4LT5wcm9tb3Rpb24uc3RhdGUgPSBoaWdoZXI7CiAJCQljeC0+cHJvbW90aW9uLnRocmVzaG9sZC50aWNrcyA9IGN4LT5sYXRlbmN5X3RpY2tzOwogCQkJaWYgKGN4LT50eXBlID49IEFDUElfU1RBVEVfQzIpCiAJCQkJY3gtPnByb21vdGlvbi50aHJlc2hvbGQuY291bnQgPSA0OwpAQCAtNDk4LDExICs0OTksMTAgQEAKIAkJaGlnaGVyID0gY3g7CiAJfQogCi0gCXJldHVybl9WQUxVRSgwKTsKKwlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19mYWR0IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19mYWR0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7CiAJaW50IGk7CiAKQEAgLTU0MywxNSArNTQzLDE0IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fZGVmYXVsdF9jMSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fZGVmYXVsdF9jMShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewogCWludCBpOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fZGVmYXVsdF9jMSIpOwogCiAJZm9yIChpID0gMDsgaSA8IEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUjsgaSsrKQotCQltZW1zZXQoJihwci0+cG93ZXIuc3RhdGVzW2ldKSwgMCwgCisJCW1lbXNldCgmKHByLT5wb3dlci5zdGF0ZXNbaV0pLCAwLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCkpOwogCiAJLyogaWYgaW5mbyBpcyBvYnRhaW5lZCBmcm9tIHBibGsvZmFkdCwgdHlwZSBlcXVhbHMgc3RhdGUgKi8KQEAgLTU2NywxNCArNTY2LDEzIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fY3N0IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19jc3Qoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gMDsKLQlhY3BpX2ludGVnZXIJCWNvdW50OwotCWludAkJCWk7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0JdW5pb24gYWNwaV9vYmplY3QJKmNzdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCWFjcGlfaW50ZWdlciBjb3VudDsKKwlpbnQgaTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXVuaW9uIGFjcGlfb2JqZWN0ICpjc3Q7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19jc3QiKTsKIApAQCAtNTgzLDIwICs1ODEsMjEgQEAKIAogCXByLT5wb3dlci5jb3VudCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUjsgaSsrKQotCQltZW1zZXQoJihwci0+cG93ZXIuc3RhdGVzW2ldKSwgMCwgCisJCW1lbXNldCgmKHByLT5wb3dlci5zdGF0ZXNbaV0pLCAwLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCkpOwogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QocHItPmhhbmRsZSwgIl9DU1QiLCBOVUxMLCAmYnVmZmVyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTm8gX0NTVCwgZ2l2aW5nIHVwXG4iKSk7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKLSAJfQorCX0KIAotCWNzdCA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKKwljc3QgPSAodW5pb24gYWNwaV9vYmplY3QgKilidWZmZXIucG9pbnRlcjsKIAogCS8qIFRoZXJlIG11c3QgYmUgYXQgbGVhc3QgMiBlbGVtZW50cyAqLwogCWlmICghY3N0IHx8IChjc3QtPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHx8IGNzdC0+cGFja2FnZS5jb3VudCA8IDIpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIm5vdCBlbm91Z2ggZWxlbWVudHMgaW4gX0NTVFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIm5vdCBlbm91Z2ggZWxlbWVudHMgaW4gX0NTVFxuIikpOwogCQlzdGF0dXMgPSAtRUZBVUxUOwogCQlnb3RvIGVuZDsKIAl9CkBAIC02MDUsMTUgKzYwNCwxOSBAQAogCiAJLyogVmFsaWRhdGUgbnVtYmVyIG9mIHBvd2VyIHN0YXRlcy4gKi8KIAlpZiAoY291bnQgPCAxIHx8IGNvdW50ICE9IGNzdC0+cGFja2FnZS5jb3VudCAtIDEpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgImNvdW50IGdpdmVuIGJ5IF9DU1QgaXMgbm90IHZhbGlkXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiY291bnQgZ2l2ZW4gYnkgX0NTVCBpcyBub3QgdmFsaWRcbiIpKTsKIAkJc3RhdHVzID0gLUVGQVVMVDsKIAkJZ290byBlbmQ7CiAJfQogCiAJLyogV2Ugc3VwcG9ydCB1cCB0byBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIuICovCiAJaWYgKGNvdW50ID4gQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkxpbWl0aW5nIG51bWJlciBvZiBwb3dlciBzdGF0ZXMgdG8gbWF4ICglZClcbiIsIEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUik7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlBsZWFzZSBpbmNyZWFzZSBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIgaWYgbmVlZGVkLlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJMaW1pdGluZyBudW1iZXIgb2YgcG93ZXIgc3RhdGVzIHRvIG1heCAoJWQpXG4iLAorCQkgICAgICAgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlBsZWFzZSBpbmNyZWFzZSBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIgaWYgbmVlZGVkLlxuIik7CiAJCWNvdW50ID0gQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOwogCX0KIApAQCAtNjI4LDI5ICs2MzEsMjkgQEAKIAogCQltZW1zZXQoJmN4LCAwLCBzaXplb2YoY3gpKTsKIAotCQllbGVtZW50ID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopICYoY3N0LT5wYWNrYWdlLmVsZW1lbnRzW2ldKTsKKwkJZWxlbWVudCA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSYoY3N0LT5wYWNrYWdlLmVsZW1lbnRzW2ldKTsKIAkJaWYgKGVsZW1lbnQtPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpCiAJCQljb250aW51ZTsKIAogCQlpZiAoZWxlbWVudC0+cGFja2FnZS5jb3VudCAhPSA0KQogCQkJY29udGludWU7CiAKLQkJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopICYoZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1swXSk7CisJCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSYoZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1swXSk7CiAKIAkJaWYgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfQlVGRkVSKQogCQkJY29udGludWU7CiAKLQkJcmVnID0gKHN0cnVjdCBhY3BpX3Bvd2VyX3JlZ2lzdGVyICopIG9iai0+YnVmZmVyLnBvaW50ZXI7CisJCXJlZyA9IChzdHJ1Y3QgYWNwaV9wb3dlcl9yZWdpc3RlciAqKW9iai0+YnVmZmVyLnBvaW50ZXI7CiAKIAkJaWYgKHJlZy0+c3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPICYmCi0JCQkocmVnLT5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkpCisJCSAgICAocmVnLT5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkpCiAJCQljb250aW51ZTsKIAogCQljeC5hZGRyZXNzID0gKHJlZy0+c3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpID8KLQkJCTAgOiByZWctPmFkZHJlc3M7CisJCSAgICAwIDogcmVnLT5hZGRyZXNzOwogCiAJCS8qIFRoZXJlIHNob3VsZCBiZSBhbiBlYXN5IHdheSB0byBleHRyYWN0IGFuIGludGVnZXIuLi4gKi8KLQkJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopICYoZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1sxXSk7CisJCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSYoZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1sxXSk7CiAJCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpCiAJCQljb250aW51ZTsKIApAQCAtNjYwLDE3ICs2NjMsMTYgQEAKIAkJICAgIChyZWctPnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykpCiAJCQljb250aW51ZTsKIAotCQlpZiAoKGN4LnR5cGUgPCBBQ1BJX1NUQVRFX0MxKSB8fAotCQkgICAgKGN4LnR5cGUgPiBBQ1BJX1NUQVRFX0MzKSkKKwkJaWYgKChjeC50eXBlIDwgQUNQSV9TVEFURV9DMSkgfHwgKGN4LnR5cGUgPiBBQ1BJX1NUQVRFX0MzKSkKIAkJCWNvbnRpbnVlOwogCi0JCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSAmKGVsZW1lbnQtPnBhY2thZ2UuZWxlbWVudHNbMl0pOworCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKikmKGVsZW1lbnQtPnBhY2thZ2UuZWxlbWVudHNbMl0pOwogCQlpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKQogCQkJY29udGludWU7CiAKIAkJY3gubGF0ZW5jeSA9IG9iai0+aW50ZWdlci52YWx1ZTsKIAotCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKikgJihlbGVtZW50LT5wYWNrYWdlLmVsZW1lbnRzWzNdKTsKKwkJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopJihlbGVtZW50LT5wYWNrYWdlLmVsZW1lbnRzWzNdKTsKIAkJaWYgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUikKIAkJCWNvbnRpbnVlOwogCkBAIC02ODAsMTkgKzY4MiwxOSBAQAogCQltZW1jcHkoJihwci0+cG93ZXIuc3RhdGVzW3ByLT5wb3dlci5jb3VudF0pLCAmY3gsIHNpemVvZihjeCkpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kICVkIHBvd2VyIHN0YXRlc1xuIiwgcHItPnBvd2VyLmNvdW50KSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRm91bmQgJWQgcG93ZXIgc3RhdGVzXG4iLAorCQkJICBwci0+cG93ZXIuY291bnQpKTsKIAogCS8qIFZhbGlkYXRlIG51bWJlciBvZiBwb3dlciBzdGF0ZXMgZGlzY292ZXJlZCAqLwogCWlmIChwci0+cG93ZXIuY291bnQgPCAyKQogCQlzdGF0dXMgPSAtRU5PREVWOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAogCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQogCi0KIHN0YXRpYyB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX3ZlcmlmeV9jMihzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4KQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl92ZXJpZnlfYzIiKTsKQEAgLTcwNiw4ICs3MDgsNyBAQAogCSAqLwogCWVsc2UgaWYgKGN4LT5sYXRlbmN5ID4gQUNQSV9QUk9DRVNTT1JfTUFYX0MyX0xBVEVOQ1kpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCSAgImxhdGVuY3kgdG9vIGxhcmdlIFslZF1cbiIsCi0JCQkJICBjeC0+bGF0ZW5jeSkpOworCQkJCSAgImxhdGVuY3kgdG9vIGxhcmdlIFslZF1cbiIsIGN4LT5sYXRlbmN5KSk7CiAJCXJldHVybl9WT0lEOwogCX0KIApAQCAtNzIxLDEwICs3MjIsOCBAQAogCXJldHVybl9WT0lEOwogfQogCi0KLXN0YXRpYyB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX3ZlcmlmeV9jMygKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAotCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3gpCitzdGF0aWMgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl92ZXJpZnlfYzMoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJCQkJICAgc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCkKIHsKIAlzdGF0aWMgaW50IGJtX2NoZWNrX2ZsYWc7CiAKQEAgLTczOSw4ICs3MzgsNyBAQAogCSAqLwogCWVsc2UgaWYgKGN4LT5sYXRlbmN5ID4gQUNQSV9QUk9DRVNTT1JfTUFYX0MzX0xBVEVOQ1kpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCSAgImxhdGVuY3kgdG9vIGxhcmdlIFslZF1cbiIsCi0JCQkJICBjeC0+bGF0ZW5jeSkpOworCQkJCSAgImxhdGVuY3kgdG9vIGxhcmdlIFslZF1cbiIsIGN4LT5sYXRlbmN5KSk7CiAJCXJldHVybl9WT0lEOwogCX0KIApAQCAtNzUzLDcgKzc1MSw3IEBACiAJICovCiAJZWxzZSBpZiAoZXJyYXRhLnBpaXg0LmZkbWEpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIkMzIG5vdCBzdXBwb3J0ZWQgb24gUElJWDQgd2l0aCBUeXBlLUYgRE1BXG4iKSk7CisJCQkJICAiQzMgbm90IHN1cHBvcnRlZCBvbiBQSUlYNCB3aXRoIFR5cGUtRiBETUFcbiIpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCkBAIC03NzAsNyArNzY4LDcgQEAKIAkJLyogYnVzIG1hc3RlcmluZyBjb250cm9sIGlzIG5lY2Vzc2FyeSAqLwogCQlpZiAoIXByLT5mbGFncy5ibV9jb250cm9sKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkgICJDMyBzdXBwb3J0IHJlcXVpcmVzIGJ1cyBtYXN0ZXJpbmcgY29udHJvbFxuIikpOworCQkJCQkgICJDMyBzdXBwb3J0IHJlcXVpcmVzIGJ1cyBtYXN0ZXJpbmcgY29udHJvbFxuIikpOwogCQkJcmV0dXJuX1ZPSUQ7CiAJCX0KIAl9IGVsc2UgewpAQCAtNzgwLDEyICs3NzgsMTIgQEAKIAkJICovCiAJCWlmIChhY3BpX2ZhZHQud2JfaW52ZCAhPSAxKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkgICJDYWNoZSBpbnZhbGlkYXRpb24gc2hvdWxkIHdvcmsgcHJvcGVybHkiCi0JCQkgICIgZm9yIEMzIHRvIGJlIGVuYWJsZWQgb24gU01QIHN5c3RlbXNcbiIpKTsKKwkJCQkJICAiQ2FjaGUgaW52YWxpZGF0aW9uIHNob3VsZCB3b3JrIHByb3Blcmx5IgorCQkJCQkgICIgZm9yIEMzIHRvIGJlIGVuYWJsZWQgb24gU01QIHN5c3RlbXNcbiIpKTsKIAkJCXJldHVybl9WT0lEOwogCQl9CiAJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxELAotCQkJCTAsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJCQkgIDAsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKIAl9CiAKIAkvKgpAQCAtODAwLDEzICs3OTgsMTIgQEAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiBzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX3ZlcmlmeShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGludCB3b3JraW5nID0gMDsKIAotCWZvciAoaT0xOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspIHsKKwlmb3IgKGkgPSAxOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspIHsKIAkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCA9ICZwci0+cG93ZXIuc3RhdGVzW2ldOwogCiAJCXN3aXRjaCAoY3gtPnR5cGUpIHsKQEAgLTgzMCw4ICs4MjcsNyBAQAogCXJldHVybiAod29ya2luZyk7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm8gKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAJaW50IHJlc3VsdDsKQEAgLTg3NCwxNiArODcwLDE2IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1pbnQgYWNwaV9wcm9jZXNzb3JfY3N0X2hhc19jaGFuZ2VkIChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQoraW50IGFjcGlfcHJvY2Vzc29yX2NzdF9oYXNfY2hhbmdlZChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotIAlpbnQJCQlyZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfY3N0X2hhc19jaGFuZ2VkIik7CiAKIAlpZiAoIXByKQotIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlpZiAoIG5vY3N0KSB7CisJaWYgKG5vY3N0KSB7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKQEAgLTg5Miw3ICs4ODgsNyBAQAogCiAJLyogRmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGlkbGUgbG9vcCAqLwogCXBtX2lkbGUgPSBwbV9pZGxlX3NhdmU7Ci0Jc3luY2hyb25pemVfc2NoZWQoKTsgIC8qIFJlbGllcyBvbiBpbnRlcnJ1cHRzIGZvcmNpbmcgZXhpdCBmcm9tIGlkbGUuICovCisJc3luY2hyb25pemVfc2NoZWQoKTsJLyogUmVsaWVzIG9uIGludGVycnVwdHMgZm9yY2luZyBleGl0IGZyb20gaWRsZS4gKi8KIAogCXByLT5mbGFncy5wb3dlciA9IDA7CiAJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm8ocHIpOwpAQCAtOTA2LDggKzkwMiw4IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKXNlcS0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQJCWk7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKilzZXEtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGk7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9zZXFfc2hvdyIpOwogCkBAIC05MTUsMTcgKzkxMSwxNyBAQAogCQlnb3RvIGVuZDsKIAogCXNlcV9wcmludGYoc2VxLCAiYWN0aXZlIHN0YXRlOiAgICAgICAgICAgIEMlemRcbiIKLQkJCSJtYXhfY3N0YXRlOiAgICAgICAgICAgICAgQyVkXG4iCi0JCQkiYnVzIG1hc3RlciBhY3Rpdml0eTogICAgICUwOHhcbiIsCi0JCQlwci0+cG93ZXIuc3RhdGUgPyBwci0+cG93ZXIuc3RhdGUgLSBwci0+cG93ZXIuc3RhdGVzIDogMCwKLQkJCW1heF9jc3RhdGUsCi0JCQkodW5zaWduZWQpcHItPnBvd2VyLmJtX2FjdGl2aXR5KTsKKwkJICAgIm1heF9jc3RhdGU6ICAgICAgICAgICAgICBDJWRcbiIKKwkJICAgImJ1cyBtYXN0ZXIgYWN0aXZpdHk6ICAgICAlMDh4XG4iLAorCQkgICBwci0+cG93ZXIuc3RhdGUgPyBwci0+cG93ZXIuc3RhdGUgLSBwci0+cG93ZXIuc3RhdGVzIDogMCwKKwkJICAgbWF4X2NzdGF0ZSwgKHVuc2lnbmVkKXByLT5wb3dlci5ibV9hY3Rpdml0eSk7CiAKIAlzZXFfcHV0cyhzZXEsICJzdGF0ZXM6XG4iKTsKIAogCWZvciAoaSA9IDE7IGkgPD0gcHItPnBvd2VyLmNvdW50OyBpKyspIHsKIAkJc2VxX3ByaW50ZihzZXEsICIgICAlY0MlZDogICAgICAgICAgICAgICAgICAiLAotCQkJKCZwci0+cG93ZXIuc3RhdGVzW2ldID09IHByLT5wb3dlci5zdGF0ZT8nKic6JyAnKSwgaSk7CisJCQkgICAoJnByLT5wb3dlci5zdGF0ZXNbaV0gPT0KKwkJCSAgICBwci0+cG93ZXIuc3RhdGUgPyAnKicgOiAnICcpLCBpKTsKIAogCQlpZiAoIXByLT5wb3dlci5zdGF0ZXNbaV0udmFsaWQpIHsKIAkJCXNlcV9wdXRzKHNlcSwgIjxub3Qgc3VwcG9ydGVkPlxuIik7CkBAIC05NDksNDUgKzk0NSw0NiBAQAogCiAJCWlmIChwci0+cG93ZXIuc3RhdGVzW2ldLnByb21vdGlvbi5zdGF0ZSkKIAkJCXNlcV9wcmludGYoc2VxLCAicHJvbW90aW9uW0MlemRdICIsCi0JCQkJKHByLT5wb3dlci5zdGF0ZXNbaV0ucHJvbW90aW9uLnN0YXRlIC0KLQkJCQkgcHItPnBvd2VyLnN0YXRlcykpOworCQkJCSAgIChwci0+cG93ZXIuc3RhdGVzW2ldLnByb21vdGlvbi5zdGF0ZSAtCisJCQkJICAgIHByLT5wb3dlci5zdGF0ZXMpKTsKIAkJZWxzZQogCQkJc2VxX3B1dHMoc2VxLCAicHJvbW90aW9uWy0tXSAiKTsKIAogCQlpZiAocHItPnBvd2VyLnN0YXRlc1tpXS5kZW1vdGlvbi5zdGF0ZSkKIAkJCXNlcV9wcmludGYoc2VxLCAiZGVtb3Rpb25bQyV6ZF0gIiwKLQkJCQkocHItPnBvd2VyLnN0YXRlc1tpXS5kZW1vdGlvbi5zdGF0ZSAtCi0JCQkJIHByLT5wb3dlci5zdGF0ZXMpKTsKKwkJCQkgICAocHItPnBvd2VyLnN0YXRlc1tpXS5kZW1vdGlvbi5zdGF0ZSAtCisJCQkJICAgIHByLT5wb3dlci5zdGF0ZXMpKTsKIAkJZWxzZQogCQkJc2VxX3B1dHMoc2VxLCAiZGVtb3Rpb25bLS1dICIpOwogCiAJCXNlcV9wcmludGYoc2VxLCAibGF0ZW5jeVslMDNkXSB1c2FnZVslMDhkXVxuIiwKLQkJCXByLT5wb3dlci5zdGF0ZXNbaV0ubGF0ZW5jeSwKLQkJCXByLT5wb3dlci5zdGF0ZXNbaV0udXNhZ2UpOworCQkJICAgcHItPnBvd2VyLnN0YXRlc1tpXS5sYXRlbmN5LAorCQkJICAgcHItPnBvd2VyLnN0YXRlc1tpXS51c2FnZSk7CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCiBzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX3NlcV9zaG93LAotCQkJCQkJUERFKGlub2RlKS0+ZGF0YSk7CisJCQkgICBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9wcm9jZXNzb3JfcG93ZXJfZm9wcyA9IHsKLQkub3BlbiAJCT0gYWNwaV9wcm9jZXNzb3JfcG93ZXJfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV9wcm9jZXNzb3JfcG93ZXJfb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKLWludCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoraW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSAwOwotCXN0YXRpYyBpbnQJCWZpcnN0X3J1biA9IDA7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeSA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKKwlzdGF0aWMgaW50IGZpcnN0X3J1biA9IDA7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGk7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0Iik7CkBAIC05OTUsNyArOTkyLDkgQEAKIAlpZiAoIWZpcnN0X3J1bikgewogCQlkbWlfY2hlY2tfc3lzdGVtKHByb2Nlc3Nvcl9wb3dlcl9kbWlfdGFibGUpOwogCQlpZiAobWF4X2NzdGF0ZSA8IEFDUElfQ19TVEFURVNfTUFYKQotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJBQ1BJOiBwcm9jZXNzb3IgbGltaXRlZCB0byBtYXggQy1zdGF0ZSAlZFxuIiwgbWF4X2NzdGF0ZSk7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCSAgICAgICAiQUNQSTogcHJvY2Vzc29yIGxpbWl0ZWQgdG8gbWF4IEMtc3RhdGUgJWRcbiIsCisJCQkgICAgICAgbWF4X2NzdGF0ZSk7CiAJCWZpcnN0X3J1bisrOwogCX0KIApAQCAtMTAwMyw3ICsxMDAyLDggQEAKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCiAJaWYgKGFjcGlfZmFkdC5jc3RfY250ICYmICFub2NzdCkgewotCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoYWNwaV9mYWR0LnNtaV9jbWQsIGFjcGlfZmFkdC5jc3RfY250LCA4KTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfb3Nfd3JpdGVfcG9ydChhY3BpX2ZhZHQuc21pX2NtZCwgYWNwaV9mYWR0LmNzdF9jbnQsIDgpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCiAJCQkJCSAgIk5vdGlmeWluZyBCSU9TIG9mIF9DU1QgYWJpbGl0eSBmYWlsZWRcbiIpKTsKQEAgLTEwMjMsNyArMTAyMyw4IEBACiAJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJDUFUlZCAocG93ZXIgc3RhdGVzOiIsIHByLT5pZCk7CiAJCWZvciAoaSA9IDE7IGkgPD0gcHItPnBvd2VyLmNvdW50OyBpKyspCiAJCQlpZiAocHItPnBvd2VyLnN0YXRlc1tpXS52YWxpZCkKLQkJCQlwcmludGsoIiBDJWRbQyVkXSIsIGksIHByLT5wb3dlci5zdGF0ZXNbaV0udHlwZSk7CisJCQkJcHJpbnRrKCIgQyVkW0MlZF0iLCBpLAorCQkJCSAgICAgICBwci0+cG93ZXIuc3RhdGVzW2ldLnR5cGUpOwogCQlwcmludGsoIilcbiIpOwogCiAJCWlmIChwci0+aWQgPT0gMCkgewpAQCAtMTAzNCwxMSArMTAzNSwxMSBAQAogCiAJLyogJ3Bvd2VyJyBbUl0gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfUFJPQ0VTU09SX0ZJTEVfUE9XRVIsCi0JCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfUFJPQ0VTU09SX0ZJTEVfUE9XRVIpKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCisJCQkJICBBQ1BJX1BST0NFU1NPUl9GSUxFX1BPV0VSKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9wcm9jZXNzb3JfcG93ZXJfZm9wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC0xMDUwLDE0ICsxMDUxLDE2IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1pbnQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfZXhpdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK2ludCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9leGl0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9leGl0Iik7CiAKIAlwci0+ZmxhZ3MucG93ZXJfc2V0dXBfZG9uZSA9IDA7CiAKIAlpZiAoYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpCi0JCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfUFJPQ0VTU09SX0ZJTEVfUE9XRVIsYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX1BST0NFU1NPUl9GSUxFX1BPV0VSLAorCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCiAJLyogVW5yZWdpc3RlciB0aGUgaWRsZSBoYW5kbGVyIHdoZW4gcHJvY2Vzc29yICMwIGlzIHJlbW92ZWQuICovCiAJaWYgKHByLT5pZCA9PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCmluZGV4IDFmMGQ2MjUuLjIyYzdiYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCkBAIC0yNiw3ICsyNiw2IEBACiAgKgogICovCiAKLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTQyLDE0ICs0MSwxMiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgogCi0KICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ09NUE9ORU5UCTB4MDEwMDAwMDAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ0xBU1MJCSJwcm9jZXNzb3IiCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0RSSVZFUl9OQU1FCSJBQ1BJIFByb2Nlc3NvciBEcml2ZXIiCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0ZJTEVfUEVSRk9STUFOQ0UJInBlcmZvcm1hbmNlIgogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgiYWNwaV9wcm9jZXNzb3IiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3Byb2Nlc3NvciIpCiAKIHN0YXRpYyBERUNMQVJFX01VVEVYKHBlcmZvcm1hbmNlX3NlbSk7CiAKQEAgLTY5LDggKzY2LDcgQEAKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfcHBjX3N0YXR1cyA9IDA7CiAKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfcHBjX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JdW5zaWduZWQgbG9uZyBldmVudCwKLQl2b2lkICpkYXRhKQorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gZGF0YTsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByOwpAQCAtODUsNyArODEsNyBAQAogCWlmICghcHIgfHwgIXByLT5wZXJmb3JtYW5jZSkKIAkJZ290byBvdXQ7CiAKLQlwcGMgPSAodW5zaWduZWQgaW50KSBwci0+cGVyZm9ybWFuY2VfcGxhdGZvcm1fbGltaXQ7CisJcHBjID0gKHVuc2lnbmVkIGludClwci0+cGVyZm9ybWFuY2VfcGxhdGZvcm1fbGltaXQ7CiAJaWYgKCFwcGMpCiAJCWdvdG8gb3V0OwogCkBAIC05MywyNiArODksMjMgQEAKIAkJZ290byBvdXQ7CiAKIAljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwgMCwKLQkJcHItPnBlcmZvcm1hbmNlLT5zdGF0ZXNbcHBjXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDApOworCQkJCSAgICAgcHItPnBlcmZvcm1hbmNlLT5zdGF0ZXNbcHBjXS4KKwkJCQkgICAgIGNvcmVfZnJlcXVlbmN5ICogMTAwMCk7CiAKLSBvdXQ6CisgICAgICBvdXQ6CiAJdXAoJnBlcmZvcm1hbmNlX3NlbSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFjcGlfcHBjX25vdGlmaWVyX2Jsb2NrID0gewogCS5ub3RpZmllcl9jYWxsID0gYWNwaV9wcm9jZXNzb3JfcHBjX25vdGlmaWVyLAogfTsKIAotCi1zdGF0aWMgaW50Ci1hY3BpX3Byb2Nlc3Nvcl9nZXRfcGxhdGZvcm1fbGltaXQgKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcioJcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9wbGF0Zm9ybV9saW1pdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSAwOwotCXVuc2lnbmVkIGxvbmcJCXBwYyA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIHBwYyA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9nZXRfcGxhdGZvcm1fbGltaXQiKTsKIApAQCAtMTI4LDE5ICsxMjEsMTcgQEAKIAlpZiAoc3RhdHVzICE9IEFFX05PVF9GT1VORCkKIAkJYWNwaV9wcm9jZXNzb3JfcHBjX3N0YXR1cyB8PSBQUENfSU5fVVNFOwogCi0JaWYoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJFcnJvciBldmFsdWF0aW5nIF9QUENcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAotCXByLT5wZXJmb3JtYW5jZV9wbGF0Zm9ybV9saW1pdCA9IChpbnQpIHBwYzsKKwlwci0+cGVyZm9ybWFuY2VfcGxhdGZvcm1fbGltaXQgPSAoaW50KXBwYzsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1pbnQgYWNwaV9wcm9jZXNzb3JfcHBjX2hhc19jaGFuZ2VkKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCitpbnQgYWNwaV9wcm9jZXNzb3JfcHBjX2hhc19jaGFuZ2VkKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7CiAJaW50IHJldCA9IGFjcGlfcHJvY2Vzc29yX2dldF9wbGF0Zm9ybV9saW1pdChwcik7CiAJaWYgKHJldCA8IDApCkBAIC0xNDksNDQgKzE0MCw0NCBAQAogCQlyZXR1cm4gY3B1ZnJlcV91cGRhdGVfcG9saWN5KHByLT5pZCk7CiB9CiAKLQotdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wcGNfaW5pdCh2b2lkKSB7Ci0JaWYgKCFjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZhY3BpX3BwY19ub3RpZmllcl9ibG9jaywgQ1BVRlJFUV9QT0xJQ1lfTk9USUZJRVIpKQordm9pZCBhY3BpX3Byb2Nlc3Nvcl9wcGNfaW5pdCh2b2lkKQoreworCWlmICghY3B1ZnJlcV9yZWdpc3Rlcl9ub3RpZmllcgorCSAgICAoJmFjcGlfcHBjX25vdGlmaWVyX2Jsb2NrLCBDUFVGUkVRX1BPTElDWV9OT1RJRklFUikpCiAJCWFjcGlfcHJvY2Vzc29yX3BwY19zdGF0dXMgfD0gUFBDX1JFR0lTVEVSRUQ7CiAJZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAiV2FybmluZzogUHJvY2Vzc29yIFBsYXRmb3JtIExpbWl0IG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJXYXJuaW5nOiBQcm9jZXNzb3IgUGxhdGZvcm0gTGltaXQgbm90IHN1cHBvcnRlZC5cbiIpOwogfQogCi0KLXZvaWQgYWNwaV9wcm9jZXNzb3JfcHBjX2V4aXQodm9pZCkgewordm9pZCBhY3BpX3Byb2Nlc3Nvcl9wcGNfZXhpdCh2b2lkKQorewogCWlmIChhY3BpX3Byb2Nlc3Nvcl9wcGNfc3RhdHVzICYgUFBDX1JFR0lTVEVSRUQpCi0JCWNwdWZyZXFfdW5yZWdpc3Rlcl9ub3RpZmllcigmYWNwaV9wcGNfbm90aWZpZXJfYmxvY2ssIENQVUZSRVFfUE9MSUNZX05PVElGSUVSKTsKKwkJY3B1ZnJlcV91bnJlZ2lzdGVyX25vdGlmaWVyKCZhY3BpX3BwY19ub3RpZmllcl9ibG9jaywKKwkJCQkJICAgIENQVUZSRVFfUE9MSUNZX05PVElGSUVSKTsKIAogCWFjcGlfcHJvY2Vzc29yX3BwY19zdGF0dXMgJj0gflBQQ19SRUdJU1RFUkVEOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX2dldF9wZXJmb3JtYW5jZV9jb250cm9sICgKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcGVyZm9ybWFuY2VfY29udHJvbChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IDA7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0JdW5pb24gYWNwaV9vYmplY3QJKnBjdCA9IE5VTEw7Ci0JdW5pb24gYWNwaV9vYmplY3QJb2JqID0gezB9OworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqcGN0ID0gTlVMTDsKKwl1bmlvbiBhY3BpX29iamVjdCBvYmogPSB7IDAgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2dldF9wZXJmb3JtYW5jZV9jb250cm9sIik7CiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChwci0+aGFuZGxlLCAiX1BDVCIsIE5VTEwsICZidWZmZXIpOwotCWlmKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJFcnJvciBldmFsdWF0aW5nIF9QQ1RcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAotCXBjdCA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKKwlwY3QgPSAodW5pb24gYWNwaV9vYmplY3QgKilidWZmZXIucG9pbnRlcjsKIAlpZiAoIXBjdCB8fCAocGN0LT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFKQotCQl8fCAocGN0LT5wYWNrYWdlLmNvdW50ICE9IDIpKSB7CisJICAgIHx8IChwY3QtPnBhY2thZ2UuY291bnQgIT0gMikpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgX1BDVCBkYXRhXG4iKSk7CiAJCXJlc3VsdCA9IC1FRkFVTFQ7CiAJCWdvdG8gZW5kOwpAQCAtMTk5LDE1ICsxOTAsMTUgQEAKIAlvYmogPSBwY3QtPnBhY2thZ2UuZWxlbWVudHNbMF07CiAKIAlpZiAoKG9iai50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpCi0JCXx8IChvYmouYnVmZmVyLmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV9wY3RfcmVnaXN0ZXIpKQotCQl8fCAob2JqLmJ1ZmZlci5wb2ludGVyID09IE5VTEwpKSB7CisJICAgIHx8IChvYmouYnVmZmVyLmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV9wY3RfcmVnaXN0ZXIpKQorCSAgICB8fCAob2JqLmJ1ZmZlci5wb2ludGVyID09IE5VTEwpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiSW52YWxpZCBfUENUIGRhdGEgKGNvbnRyb2xfcmVnaXN0ZXIpXG4iKSk7CisJCQkJICAiSW52YWxpZCBfUENUIGRhdGEgKGNvbnRyb2xfcmVnaXN0ZXIpXG4iKSk7CiAJCXJlc3VsdCA9IC1FRkFVTFQ7CiAJCWdvdG8gZW5kOwogCX0KLQltZW1jcHkoJnByLT5wZXJmb3JtYW5jZS0+Y29udHJvbF9yZWdpc3Rlciwgb2JqLmJ1ZmZlci5wb2ludGVyLCBzaXplb2Yoc3RydWN0IGFjcGlfcGN0X3JlZ2lzdGVyKSk7Ci0KKwltZW1jcHkoJnByLT5wZXJmb3JtYW5jZS0+Y29udHJvbF9yZWdpc3Rlciwgb2JqLmJ1ZmZlci5wb2ludGVyLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGFjcGlfcGN0X3JlZ2lzdGVyKSk7CiAKIAkvKgogCSAqIHN0YXR1c19yZWdpc3RlcgpAQCAtMjE2LDQ0ICsyMDcsNDIgQEAKIAlvYmogPSBwY3QtPnBhY2thZ2UuZWxlbWVudHNbMV07CiAKIAlpZiAoKG9iai50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpCi0JCXx8IChvYmouYnVmZmVyLmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV9wY3RfcmVnaXN0ZXIpKQotCQl8fCAob2JqLmJ1ZmZlci5wb2ludGVyID09IE5VTEwpKSB7CisJICAgIHx8IChvYmouYnVmZmVyLmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV9wY3RfcmVnaXN0ZXIpKQorCSAgICB8fCAob2JqLmJ1ZmZlci5wb2ludGVyID09IE5VTEwpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiSW52YWxpZCBfUENUIGRhdGEgKHN0YXR1c19yZWdpc3RlcilcbiIpKTsKKwkJCQkgICJJbnZhbGlkIF9QQ1QgZGF0YSAoc3RhdHVzX3JlZ2lzdGVyKVxuIikpOwogCQlyZXN1bHQgPSAtRUZBVUxUOwogCQlnb3RvIGVuZDsKIAl9CiAKLQltZW1jcHkoJnByLT5wZXJmb3JtYW5jZS0+c3RhdHVzX3JlZ2lzdGVyLCBvYmouYnVmZmVyLnBvaW50ZXIsIHNpemVvZihzdHJ1Y3QgYWNwaV9wY3RfcmVnaXN0ZXIpKTsKKwltZW1jcHkoJnByLT5wZXJmb3JtYW5jZS0+c3RhdHVzX3JlZ2lzdGVyLCBvYmouYnVmZmVyLnBvaW50ZXIsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9wY3RfcmVnaXN0ZXIpKTsKIAotZW5kOgorICAgICAgZW5kOgogCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3Byb2Nlc3Nvcl9nZXRfcGVyZm9ybWFuY2Vfc3RhdGVzICgKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcGVyZm9ybWFuY2Vfc3RhdGVzKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWZvcm1hdCA9IHtzaXplb2YoIk5OTk5OTiIpLCAiTk5OTk5OIn07Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCXN0YXRlID0gezAsIE5VTEx9OwotCXVuaW9uIGFjcGlfb2JqZWN0IAkqcHNzID0gTlVMTDsKLQlpbnQJCQlpOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGZvcm1hdCA9IHsgc2l6ZW9mKCJOTk5OTk4iKSwgIk5OTk5OTiIgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgc3RhdGUgPSB7IDAsIE5VTEwgfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqcHNzID0gTlVMTDsKKwlpbnQgaTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2dldF9wZXJmb3JtYW5jZV9zdGF0ZXMiKTsKIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KHByLT5oYW5kbGUsICJfUFNTIiwgTlVMTCwgJmJ1ZmZlcik7Ci0JaWYoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkVycm9yIGV2YWx1YXRpbmcgX1BTU1xuIikpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCi0JcHNzID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIGJ1ZmZlci5wb2ludGVyOworCXBzcyA9ICh1bmlvbiBhY3BpX29iamVjdCAqKWJ1ZmZlci5wb2ludGVyOwogCWlmICghcHNzIHx8IChwc3MtPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIF9QU1MgZGF0YVxuIikpOwogCQlyZXN1bHQgPSAtRUZBVUxUOwpAQCAtMjYxLDEwICsyNTAsMTIgQEAKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCAlZCBwZXJmb3JtYW5jZSBzdGF0ZXNcbiIsCi0JCXBzcy0+cGFja2FnZS5jb3VudCkpOworCQkJICBwc3MtPnBhY2thZ2UuY291bnQpKTsKIAogCXByLT5wZXJmb3JtYW5jZS0+c3RhdGVfY291bnQgPSBwc3MtPnBhY2thZ2UuY291bnQ7Ci0JcHItPnBlcmZvcm1hbmNlLT5zdGF0ZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcHgpICogcHNzLT5wYWNrYWdlLmNvdW50LCBHRlBfS0VSTkVMKTsKKwlwci0+cGVyZm9ybWFuY2UtPnN0YXRlcyA9CisJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9weCkgKiBwc3MtPnBhY2thZ2UuY291bnQsCisJCSAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIXByLT5wZXJmb3JtYW5jZS0+c3RhdGVzKSB7CiAJCXJlc3VsdCA9IC1FTk9NRU07CiAJCWdvdG8gZW5kOwpAQCAtMjgwLDQ2ICsyNzEsNDQgQEAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRXh0cmFjdGluZyBzdGF0ZSAlZFxuIiwgaSkpOwogCiAJCXN0YXR1cyA9IGFjcGlfZXh0cmFjdF9wYWNrYWdlKCYocHNzLT5wYWNrYWdlLmVsZW1lbnRzW2ldKSwKLQkJCSZmb3JtYXQsICZzdGF0ZSk7CisJCQkJCSAgICAgICZmb3JtYXQsICZzdGF0ZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgX1BTUyBkYXRhXG4iKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJJbnZhbGlkIF9QU1MgZGF0YVxuIikpOwogCQkJcmVzdWx0ID0gLUVGQVVMVDsKIAkJCWtmcmVlKHByLT5wZXJmb3JtYW5jZS0+c3RhdGVzKTsKIAkJCWdvdG8gZW5kOwogCQl9CiAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIlN0YXRlIFslZF06IGNvcmVfZnJlcXVlbmN5WyVkXSBwb3dlclslZF0gdHJhbnNpdGlvbl9sYXRlbmN5WyVkXSBidXNfbWFzdGVyX2xhdGVuY3lbJWRdIGNvbnRyb2xbMHgleF0gc3RhdHVzWzB4JXhdXG4iLAotCQkJaSwKLQkJCSh1MzIpIHB4LT5jb3JlX2ZyZXF1ZW5jeSwKLQkJCSh1MzIpIHB4LT5wb3dlciwKLQkJCSh1MzIpIHB4LT50cmFuc2l0aW9uX2xhdGVuY3ksCi0JCQkodTMyKSBweC0+YnVzX21hc3Rlcl9sYXRlbmN5LAotCQkJKHUzMikgcHgtPmNvbnRyb2wsCi0JCQkodTMyKSBweC0+c3RhdHVzKSk7CisJCQkJICAiU3RhdGUgWyVkXTogY29yZV9mcmVxdWVuY3lbJWRdIHBvd2VyWyVkXSB0cmFuc2l0aW9uX2xhdGVuY3lbJWRdIGJ1c19tYXN0ZXJfbGF0ZW5jeVslZF0gY29udHJvbFsweCV4XSBzdGF0dXNbMHgleF1cbiIsCisJCQkJICBpLAorCQkJCSAgKHUzMikgcHgtPmNvcmVfZnJlcXVlbmN5LAorCQkJCSAgKHUzMikgcHgtPnBvd2VyLAorCQkJCSAgKHUzMikgcHgtPnRyYW5zaXRpb25fbGF0ZW5jeSwKKwkJCQkgICh1MzIpIHB4LT5idXNfbWFzdGVyX2xhdGVuY3ksCisJCQkJICAodTMyKSBweC0+Y29udHJvbCwgKHUzMikgcHgtPnN0YXR1cykpOwogCiAJCWlmICghcHgtPmNvcmVfZnJlcXVlbmN5KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBfUFNTIGRhdGE6IGZyZXEgaXMgemVyb1xuIikpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiSW52YWxpZCBfUFNTIGRhdGE6IGZyZXEgaXMgemVyb1xuIikpOwogCQkJcmVzdWx0ID0gLUVGQVVMVDsKIAkJCWtmcmVlKHByLT5wZXJmb3JtYW5jZS0+c3RhdGVzKTsKIAkJCWdvdG8gZW5kOwogCQl9CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX2dldF9wZXJmb3JtYW5jZV9pbmZvICgKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcGVyZm9ybWFuY2VfaW5mbyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCWFjcGlfaGFuZGxlCQloYW5kbGUgPSBOVUxMOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWFjcGlfaGFuZGxlIGhhbmRsZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9nZXRfcGVyZm9ybWFuY2VfaW5mbyIpOwogCkBAIC0zMzEsNyArMzIwLDcgQEAKIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocHItPmhhbmRsZSwgIl9QQ1QiLCAmaGFuZGxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIkFDUEktYmFzZWQgcHJvY2Vzc29yIHBlcmZvcm1hbmNlIGNvbnRyb2wgdW5hdmFpbGFibGVcbiIpKTsKKwkJCQkgICJBQ1BJLWJhc2VkIHByb2Nlc3NvciBwZXJmb3JtYW5jZSBjb250cm9sIHVuYXZhaWxhYmxlXG4iKSk7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKQEAgLTM1MCwxMCArMzM5LDEwIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLWludCBhY3BpX3Byb2Nlc3Nvcl9ub3RpZnlfc21tKHN0cnVjdCBtb2R1bGUgKmNhbGxpbmdfbW9kdWxlKSB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1czsKLQlzdGF0aWMgaW50CQlpc19kb25lID0gMDsKK2ludCBhY3BpX3Byb2Nlc3Nvcl9ub3RpZnlfc21tKHN0cnVjdCBtb2R1bGUgKmNhbGxpbmdfbW9kdWxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdGF0aWMgaW50IGlzX2RvbmUgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3Jfbm90aWZ5X3NtbSIpOwogCkBAIC0zNzEsOCArMzYwLDcgQEAKIAlpZiAoaXNfZG9uZSA+IDApIHsKIAkJbW9kdWxlX3B1dChjYWxsaW5nX21vZHVsZSk7CiAJCXJldHVybl9WQUxVRSgwKTsKLQl9Ci0JZWxzZSBpZiAoaXNfZG9uZSA8IDApIHsKKwl9IGVsc2UgaWYgKGlzX2RvbmUgPCAwKSB7CiAJCW1vZHVsZV9wdXQoY2FsbGluZ19tb2R1bGUpOwogCQlyZXR1cm5fVkFMVUUoaXNfZG9uZSk7CiAJfQpAQCAtMzgwLDI4ICszNjgsMzAgQEAKIAlpc19kb25lID0gLUVJTzsKIAogCS8qIENhbid0IHdyaXRlIHBzdGF0ZV9jbnQgdG8gc21pX2NtZCBpZiBlaXRoZXIgdmFsdWUgaXMgemVybyAqLwotCWlmICgoIWFjcGlfZmFkdC5zbWlfY21kKSB8fAotCSAgICAoIWFjcGlfZmFkdC5wc3RhdGVfY250KSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiTm8gU01JIHBvcnQgb3IgcHN0YXRlX2NudFxuIikpOworCWlmICgoIWFjcGlfZmFkdC5zbWlfY21kKSB8fCAoIWFjcGlfZmFkdC5wc3RhdGVfY250KSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJObyBTTUkgcG9ydCBvciBwc3RhdGVfY250XG4iKSk7CiAJCW1vZHVsZV9wdXQoY2FsbGluZ19tb2R1bGUpOwogCQlyZXR1cm5fVkFMVUUoMCk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiV3JpdGluZyBwc3RhdGVfY250IFsweCV4XSB0byBzbWlfY21kIFsweCV4XVxuIiwgYWNwaV9mYWR0LnBzdGF0ZV9jbnQsIGFjcGlfZmFkdC5zbWlfY21kKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiV3JpdGluZyBwc3RhdGVfY250IFsweCV4XSB0byBzbWlfY21kIFsweCV4XVxuIiwKKwkJCSAgYWNwaV9mYWR0LnBzdGF0ZV9jbnQsIGFjcGlfZmFkdC5zbWlfY21kKSk7CiAKIAkvKiBGQURUIHYxIGRvZXNuJ3Qgc3VwcG9ydCBwc3RhdGVfY250LCBtYW55IEJJT1MgdmVuZG9ycyB1c2UKIAkgKiBpdCBhbnl3YXksIHNvIHdlIG5lZWQgdG8gc3VwcG9ydCBpdC4uLiAqLwogCWlmIChhY3BpX2ZhZHRfaXNfdjEpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiVXNpbmcgdjEuMCBGQURUIHJlc2VydmVkIHZhbHVlIGZvciBwc3RhdGVfY250XG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJVc2luZyB2MS4wIEZBRFQgcmVzZXJ2ZWQgdmFsdWUgZm9yIHBzdGF0ZV9jbnRcbiIpKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQgKGFjcGlfZmFkdC5zbWlfY21kLAotCQkJCSAgICAgKHUzMikgYWNwaV9mYWR0LnBzdGF0ZV9jbnQsIDgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoYWNwaV9mYWR0LnNtaV9jbWQsCisJCQkJICAgICh1MzIpIGFjcGlfZmFkdC5wc3RhdGVfY250LCA4KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKIAkJCQkgICJGYWlsZWQgdG8gd3JpdGUgcHN0YXRlX2NudCBbMHgleF0gdG8gIgotCQkJCSAgInNtaV9jbWQgWzB4JXhdXG4iLCBhY3BpX2ZhZHQucHN0YXRlX2NudCwgYWNwaV9mYWR0LnNtaV9jbWQpKTsKKwkJCQkgICJzbWlfY21kIFsweCV4XVxuIiwgYWNwaV9mYWR0LnBzdGF0ZV9jbnQsCisJCQkJICBhY3BpX2ZhZHQuc21pX2NtZCkpOwogCQltb2R1bGVfcHV0KGNhbGxpbmdfbW9kdWxlKTsKIAkJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiAJfQpAQCAtNDE1LDI0ICs0MDUsMjQgQEAKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9wcm9jZXNzb3Jfbm90aWZ5X3NtbSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9wcm9jZXNzb3Jfbm90aWZ5X3NtbSk7CiAKICNpZmRlZiBDT05GSUdfWDg2X0FDUElfQ1BVRlJFUV9QUk9DX0lOVEYKIC8qIC9wcm9jL2FjcGkvcHJvY2Vzc29yLy4uL3BlcmZvcm1hbmNlIGludGVyZmFjZSAoREVQUkVDQVRFRCkgKi8KIAogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9wZXJmX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9wcm9jZXNzb3JfcGVyZl9mb3BzID0gewotCS5vcGVuIAkJPSBhY3BpX3Byb2Nlc3Nvcl9wZXJmX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfcHJvY2Vzc29yX3BlcmZfb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfcGVyZl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopc2VxLT5wcml2YXRlOwotCWludAkJCWk7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKilzZXEtPnByaXZhdGU7CisJaW50IGk7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9wZXJmX3NlcV9zaG93Iik7CiAKQEAgLTQ0NSw0MiArNDM1LDQwIEBACiAJfQogCiAJc2VxX3ByaW50ZihzZXEsICJzdGF0ZSBjb3VudDogICAgICAgICAgICAgJWRcbiIKLQkJCSJhY3RpdmUgc3RhdGU6ICAgICAgICAgICAgUCVkXG4iLAotCQkJcHItPnBlcmZvcm1hbmNlLT5zdGF0ZV9jb3VudCwKLQkJCXByLT5wZXJmb3JtYW5jZS0+c3RhdGUpOworCQkgICAiYWN0aXZlIHN0YXRlOiAgICAgICAgICAgIFAlZFxuIiwKKwkJICAgcHItPnBlcmZvcm1hbmNlLT5zdGF0ZV9jb3VudCwgcHItPnBlcmZvcm1hbmNlLT5zdGF0ZSk7CiAKIAlzZXFfcHV0cyhzZXEsICJzdGF0ZXM6XG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgcHItPnBlcmZvcm1hbmNlLT5zdGF0ZV9jb3VudDsgaSsrKQotCQlzZXFfcHJpbnRmKHNlcSwgIiAgICVjUCVkOiAgICAgICAgICAgICAgICAgICVkIE1IeiwgJWQgbVcsICVkIHVTXG4iLAotCQkJKGkgPT0gcHItPnBlcmZvcm1hbmNlLT5zdGF0ZT8nKic6JyAnKSwgaSwKLQkJCSh1MzIpIHByLT5wZXJmb3JtYW5jZS0+c3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5LAotCQkJKHUzMikgcHItPnBlcmZvcm1hbmNlLT5zdGF0ZXNbaV0ucG93ZXIsCi0JCQkodTMyKSBwci0+cGVyZm9ybWFuY2UtPnN0YXRlc1tpXS50cmFuc2l0aW9uX2xhdGVuY3kpOworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICIgICAlY1AlZDogICAgICAgICAgICAgICAgICAlZCBNSHosICVkIG1XLCAlZCB1U1xuIiwKKwkJCSAgIChpID09IHByLT5wZXJmb3JtYW5jZS0+c3RhdGUgPyAnKicgOiAnICcpLCBpLAorCQkJICAgKHUzMikgcHItPnBlcmZvcm1hbmNlLT5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3ksCisJCQkgICAodTMyKSBwci0+cGVyZm9ybWFuY2UtPnN0YXRlc1tpXS5wb3dlciwKKwkJCSAgICh1MzIpIHByLT5wZXJmb3JtYW5jZS0+c3RhdGVzW2ldLnRyYW5zaXRpb25fbGF0ZW5jeSk7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfcGVyZl9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3Byb2Nlc3Nvcl9wZXJmX3NlcV9zaG93LAotCQkJCQkJUERFKGlub2RlKS0+ZGF0YSk7CisJCQkgICBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAogc3RhdGljIHNzaXplX3QKLWFjcGlfcHJvY2Vzc29yX3dyaXRlX3BlcmZvcm1hbmNlICgKLSAgICAgICAgc3RydWN0IGZpbGUJCSpmaWxlLAotICAgICAgICBjb25zdCBjaGFyCQlfX3VzZXIgKmJ1ZmZlciwKLSAgICAgICAgc2l6ZV90CQkJY291bnQsCi0gICAgICAgIGxvZmZfdAkJCSpkYXRhKQorYWNwaV9wcm9jZXNzb3Jfd3JpdGVfcGVyZm9ybWFuY2Uoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSptID0gKHN0cnVjdCBzZXFfZmlsZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKikgbS0+cHJpdmF0ZTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKnBlcmY7Ci0JY2hhcgkJCXN0YXRlX3N0cmluZ1sxMl0gPSB7J1wwJ307Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgbmV3X3N0YXRlID0gMDsKLQlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICBwb2xpY3k7CisJY2hhciBzdGF0ZV9zdHJpbmdbMTJdID0geyAnXDAnIH07CisJdW5zaWduZWQgaW50IG5ld19zdGF0ZSA9IDA7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5IHBvbGljeTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3dyaXRlX3BlcmZvcm1hbmNlIik7CiAKQEAgLTUxMywxMiArNTAxLDEwIEBACiAJcmV0dXJuX1ZBTFVFKGNvdW50KTsKIH0KIAotc3RhdGljIHZvaWQKLWFjcGlfY3B1ZnJlcV9hZGRfZmlsZSAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKK3N0YXRpYyB2b2lkIGFjcGlfY3B1ZnJlcV9hZGRfZmlsZShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnkgPSBOVUxMOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2NwdWZyZXFfYWRkZmlsZSIpOwogCkBAIC01MjcsMTEgKzUxMywxMiBAQAogCiAJLyogYWRkIGZpbGUgJ3BlcmZvcm1hbmNlJyBbUi9XXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9QUk9DRVNTT1JfRklMRV9QRVJGT1JNQU5DRSwKLQkJICBTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9QUk9DRVNTT1JfRklMRV9QRVJGT1JNQU5DRSkpOworCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkgIEFDUElfUFJPQ0VTU09SX0ZJTEVfUEVSRk9STUFOQ0UpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3Byb2Nlc3Nvcl9wZXJmX2ZvcHM7CiAJCWVudHJ5LT5wcm9jX2ZvcHMtPndyaXRlID0gYWNwaV9wcm9jZXNzb3Jfd3JpdGVfcGVyZm9ybWFuY2U7CkBAIC01NDEsMTEgKzUyOCw5IEBACiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLXN0YXRpYyB2b2lkCi1hY3BpX2NwdWZyZXFfcmVtb3ZlX2ZpbGUgKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCitzdGF0aWMgdm9pZCBhY3BpX2NwdWZyZXFfcmVtb3ZlX2ZpbGUoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9jcHVmcmVxX2FkZGZpbGUiKTsKIApAQCAtNTU0LDIxICs1MzksMjUgQEAKIAogCS8qIHJlbW92ZSBmaWxlICdwZXJmb3JtYW5jZScgKi8KIAlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX1BST0NFU1NPUl9GSUxFX1BFUkZPUk1BTkNFLAotCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKICNlbHNlCi1zdGF0aWMgdm9pZCBhY3BpX2NwdWZyZXFfYWRkX2ZpbGUgKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpIHsgcmV0dXJuOyB9Ci1zdGF0aWMgdm9pZCBhY3BpX2NwdWZyZXFfcmVtb3ZlX2ZpbGUgKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpIHsgcmV0dXJuOyB9Ci0jZW5kaWYgLyogQ09ORklHX1g4Nl9BQ1BJX0NQVUZSRVFfUFJPQ19JTlRGICovCi0KK3N0YXRpYyB2b2lkIGFjcGlfY3B1ZnJlcV9hZGRfZmlsZShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQoreworCXJldHVybjsKK30KK3N0YXRpYyB2b2lkIGFjcGlfY3B1ZnJlcV9yZW1vdmVfZmlsZShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQoreworCXJldHVybjsKK30KKyNlbmRpZgkJCQkvKiBDT05GSUdfWDg2X0FDUElfQ1BVRlJFUV9QUk9DX0lOVEYgKi8KIAogaW50Ci1hY3BpX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wZXJmb3JtYW5jZSAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICogcGVyZm9ybWFuY2UsCi0JdW5zaWduZWQgaW50IGNwdSkKK2FjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQorCQkJCSAgICAqcGVyZm9ybWFuY2UsIHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcjsKIApAQCAtNjAzLDEzICs1OTIsMTIgQEAKIAl1cCgmcGVyZm9ybWFuY2Vfc2VtKTsKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJfcGVyZm9ybWFuY2UpOwogCi0KIHZvaWQKLWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UgKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqIHBlcmZvcm1hbmNlLAotCXVuc2lnbmVkIGludCBjcHUpCithY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQorCQkJCSAgICAgICpwZXJmb3JtYW5jZSwgdW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByOwogCkBAIC02MzIsNCArNjIwLDUgQEAKIAogCXJldHVybl9WT0lEOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aGVybWFsLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYwppbmRleCAxMmJkOTgwLi4zNzUyOGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYwpAQCAtNDMsMjAgKzQzLDE2IEBACiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NMQVNTICAgICAgICAgICAgInByb2Nlc3NvciIKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfRFJJVkVSX05BTUUgICAgICAiQUNQSSBQcm9jZXNzb3IgRHJpdmVyIgogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgICAgICBBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUgICAgICAgICAgICAgICAgKCJhY3BpX3Byb2Nlc3NvciIpCi0KK0FDUElfTU9EVUxFX05BTUUoImFjcGlfcHJvY2Vzc29yIikKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbWl0IEludGVyZmFjZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludAotYWNwaV9wcm9jZXNzb3JfYXBwbHlfbGltaXQgKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciogCXByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9hcHBseV9saW1pdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JdTE2CQkJcHggPSAwOwotCXUxNgkJCXR4ID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKwl1MTYgcHggPSAwOworCXUxNiB0eCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9hcHBseV9saW1pdCIpOwogCkBAIC04MCwxOSArNzYsMTcgQEAKIAlwci0+bGltaXQuc3RhdGUucHggPSBweDsKIAlwci0+bGltaXQuc3RhdGUudHggPSB0eDsKIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlByb2Nlc3NvciBbJWRdIGxpbWl0IHNldCB0byAoUCVkOlQlZClcbiIsCi0JCXByLT5pZCwKLQkJcHItPmxpbWl0LnN0YXRlLnB4LAotCQlwci0+bGltaXQuc3RhdGUudHgpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJQcm9jZXNzb3IgWyVkXSBsaW1pdCBzZXQgdG8gKFAlZDpUJWQpXG4iLCBwci0+aWQsCisJCQkgIHByLT5saW1pdC5zdGF0ZS5weCwgcHItPmxpbWl0LnN0YXRlLnR4KSk7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAocmVzdWx0KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiVW5hYmxlIHRvIHNldCBsaW1pdFxuIikpOwogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQogI2lmZGVmIENPTkZJR19DUFVfRlJFUQogCiAvKiBJZiBhIHBhc3NpdmUgY29vbGluZyBzaXR1YXRpb24gaXMgZGV0ZWN0ZWQsIHByaW1hcmlseSBDUFVmcmVxIGlzIHVzZWQsIGFzIGl0CkBAIC0xMDQsNyArOTgsNiBAQAogc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX3RoZXJtYWxfcmVkdWN0aW9uX3BjdGdbTlJfQ1BVU107CiBzdGF0aWMgdW5zaWduZWQgaW50IGFjcGlfdGhlcm1hbF9jcHVmcmVxX2lzX2luaXQgPSAwOwogCi0KIHN0YXRpYyBpbnQgY3B1X2hhc19jcHVmcmVxKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5IHBvbGljeTsKQEAgLTExNSw3ICsxMDgsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgYWNwaV90aGVybWFsX2NwdWZyZXFfaW5jcmVhc2UodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpZiAoIWNwdV9oYXNfY3B1ZnJlcShjcHUpKQpAQCAtMTMwLDcgKzEyMiw2IEBACiAJcmV0dXJuIC1FUkFOR0U7CiB9CiAKLQogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9kZWNyZWFzZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCWlmICghY3B1X2hhc19jcHVmcmVxKGNwdSkpCkBAIC0xNDUsMTEgKzEzNiw4IEBACiAJcmV0dXJuIC1FUkFOR0U7CiB9CiAKLQotc3RhdGljIGludCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9ub3RpZmllcigKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAotCXVuc2lnbmVkIGxvbmcgZXZlbnQsCi0Jdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV90aGVybWFsX2NwdWZyZXFfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBkYXRhOwogCXVuc2lnbmVkIGxvbmcgbWF4X2ZyZXEgPSAwOwpAQCAtMTU3LDY4ICsxNDUsNzQgQEAKIAlpZiAoZXZlbnQgIT0gQ1BVRlJFUV9BREpVU1QpCiAJCWdvdG8gb3V0OwogCi0JbWF4X2ZyZXEgPSAocG9saWN5LT5jcHVpbmZvLm1heF9mcmVxICogKDEwMCAtIGNwdWZyZXFfdGhlcm1hbF9yZWR1Y3Rpb25fcGN0Z1twb2xpY3ktPmNwdV0pKSAvIDEwMDsKKwltYXhfZnJlcSA9CisJICAgIChwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEgKgorCSAgICAgKDEwMCAtIGNwdWZyZXFfdGhlcm1hbF9yZWR1Y3Rpb25fcGN0Z1twb2xpY3ktPmNwdV0pKSAvIDEwMDsKIAogCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCAwLCBtYXhfZnJlcSk7CiAKLSBvdXQ6CisgICAgICBvdXQ6CiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9ub3RpZmllcl9ibG9jayA9IHsKIAkubm90aWZpZXJfY2FsbCA9IGFjcGlfdGhlcm1hbF9jcHVmcmVxX25vdGlmaWVyLAogfTsKIAotCi12b2lkIGFjcGlfdGhlcm1hbF9jcHVmcmVxX2luaXQodm9pZCkgewordm9pZCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pbml0KHZvaWQpCit7CiAJaW50IGk7CiAKLQlmb3IgKGk9MDsgaTxOUl9DUFVTOyBpKyspCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKIAkJY3B1ZnJlcV90aGVybWFsX3JlZHVjdGlvbl9wY3RnW2ldID0gMDsKIAotCWkgPSBjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZhY3BpX3RoZXJtYWxfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywgQ1BVRlJFUV9QT0xJQ1lfTk9USUZJRVIpOworCWkgPSBjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZhY3BpX3RoZXJtYWxfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywKKwkJCQkgICAgICBDUFVGUkVRX1BPTElDWV9OT1RJRklFUik7CiAJaWYgKCFpKQogCQlhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pc19pbml0ID0gMTsKIH0KIAotdm9pZCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9leGl0KHZvaWQpIHsKK3ZvaWQgYWNwaV90aGVybWFsX2NwdWZyZXFfZXhpdCh2b2lkKQorewogCWlmIChhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pc19pbml0KQotCQljcHVmcmVxX3VucmVnaXN0ZXJfbm90aWZpZXIoJmFjcGlfdGhlcm1hbF9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrLCBDUFVGUkVRX1BPTElDWV9OT1RJRklFUik7CisJCWNwdWZyZXFfdW5yZWdpc3Rlcl9ub3RpZmllcgorCQkgICAgKCZhY3BpX3RoZXJtYWxfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywKKwkJICAgICBDUFVGUkVRX1BPTElDWV9OT1RJRklFUik7CiAKIAlhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pc19pbml0ID0gMDsKIH0KIAotI2Vsc2UgLyogISBDT05GSUdfQ1BVX0ZSRVEgKi8KKyNlbHNlCQkJCS8qICEgQ09ORklHX0NQVV9GUkVRICovCiAKLXN0YXRpYyBpbnQgYWNwaV90aGVybWFsX2NwdWZyZXFfaW5jcmVhc2UodW5zaWduZWQgaW50IGNwdSkgeyByZXR1cm4gLUVOT0RFVjsgfQotc3RhdGljIGludCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9kZWNyZWFzZSh1bnNpZ25lZCBpbnQgY3B1KSB7IHJldHVybiAtRU5PREVWOyB9Ci0KK3N0YXRpYyBpbnQgYWNwaV90aGVybWFsX2NwdWZyZXFfaW5jcmVhc2UodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KK3N0YXRpYyBpbnQgYWNwaV90aGVybWFsX2NwdWZyZXFfZGVjcmVhc2UodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KIAogI2VuZGlmCiAKLQotaW50Ci1hY3BpX3Byb2Nlc3Nvcl9zZXRfdGhlcm1hbF9saW1pdCAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQlpbnQJCQl0eXBlKQoraW50IGFjcGlfcHJvY2Vzc29yX3NldF90aGVybWFsX2xpbWl0KGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7Ci0JaW50CQkJdHggPSAwOworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSBOVUxMOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKKwlpbnQgdHggPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3Jfc2V0X3RoZXJtYWxfbGltaXQiKTsKIAogCWlmICgodHlwZSA8IEFDUElfUFJPQ0VTU09SX0xJTUlUX05PTkUpCi0JCXx8ICh0eXBlID4gQUNQSV9QUk9DRVNTT1JfTElNSVRfREVDUkVNRU5UKSkKKwkgICAgfHwgKHR5cGUgPiBBQ1BJX1BST0NFU1NPUl9MSU1JVF9ERUNSRU1FTlQpKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKIAlyZXN1bHQgPSBhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmRldmljZSk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiAKLQlwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAlpZiAoIXByKQogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKQEAgLTI1MCwxMiArMjQ0LDEyIEBACiAJCQlnb3RvIGVuZDsKIAkJZWxzZSBpZiAocmVzdWx0ID09IC1FUkFOR0UpCiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJCSJBdCBtYXhpbXVtIHBlcmZvcm1hbmNlIHN0YXRlXG4iKSk7CisJCQkJCSAgIkF0IG1heGltdW0gcGVyZm9ybWFuY2Ugc3RhdGVcbiIpKTsKIAogCQlpZiAocHItPmZsYWdzLnRocm90dGxpbmcpIHsKIAkJCWlmICh0eCA9PSAocHItPnRocm90dGxpbmcuc3RhdGVfY291bnQgLSAxKSkKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJCSJBdCBtYXhpbXVtIHRocm90dGxpbmcgc3RhdGVcbiIpKTsKKwkJCQkJCSAgIkF0IG1heGltdW0gdGhyb3R0bGluZyBzdGF0ZVxuIikpOwogCQkJZWxzZQogCQkJCXR4Kys7CiAJCX0KQEAgLTI2Nyw3ICsyNjEsNyBAQAogCQlpZiAocHItPmZsYWdzLnRocm90dGxpbmcpIHsKIAkJCWlmICh0eCA9PSAwKQogCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkJIkF0IG1pbmltdW0gdGhyb3R0bGluZyBzdGF0ZVxuIikpOworCQkJCQkJICAiQXQgbWluaW11bSB0aHJvdHRsaW5nIHN0YXRlXG4iKSk7CiAJCQllbHNlIHsKIAkJCQl0eC0tOwogCQkJCWdvdG8gZW5kOwpAQCAtMjc3LDEyICsyNzEsMTIgQEAKIAkJcmVzdWx0ID0gYWNwaV90aGVybWFsX2NwdWZyZXFfZGVjcmVhc2UocHItPmlkKTsKIAkJaWYgKHJlc3VsdCA9PSAtRVJBTkdFKQogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCQkiQXQgbWluaW11bSBwZXJmb3JtYW5jZSBzdGF0ZVxuIikpOworCQkJCQkgICJBdCBtaW5pbXVtIHBlcmZvcm1hbmNlIHN0YXRlXG4iKSk7CiAKIAkJYnJlYWs7CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAJaWYgKHByLT5mbGFncy50aHJvdHRsaW5nKSB7CiAJCXByLT5saW1pdC50aGVybWFsLnB4ID0gMDsKIAkJcHItPmxpbWl0LnRoZXJtYWwudHggPSB0eDsKQEAgLTI5MywxOCArMjg3LDE0IEBACiAJCQkJCSAgIlVuYWJsZSB0byBzZXQgdGhlcm1hbCBsaW1pdFxuIikpOwogCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlRoZXJtYWwgbGltaXQgbm93IChQJWQ6VCVkKVxuIiwKLQkJCQkgIHByLT5saW1pdC50aGVybWFsLnB4LAotCQkJCSAgcHItPmxpbWl0LnRoZXJtYWwudHgpKTsKKwkJCQkgIHByLT5saW1pdC50aGVybWFsLnB4LCBwci0+bGltaXQudGhlcm1hbC50eCkpOwogCX0gZWxzZQogCQlyZXN1bHQgPSAwOwogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQotaW50Ci1hY3BpX3Byb2Nlc3Nvcl9nZXRfbGltaXRfaW5mbyAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwcikKK2ludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfbGltaXRfaW5mbyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2dldF9saW1pdF9pbmZvIik7CiAKQEAgLTMxNywxMiArMzA3LDExIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIC8qIC9wcm9jIGludGVyZmFjZSAqLwogCiBzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2xpbWl0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKilzZXEtPnByaXZhdGU7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKilzZXEtPnByaXZhdGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9saW1pdF9zZXFfc2hvdyIpOwogCkBAIC0zMzUsMzQgKzMyNCwzMiBAQAogCX0KIAogCXNlcV9wcmludGYoc2VxLCAiYWN0aXZlIGxpbWl0OiAgICAgICAgICAgIFAlZDpUJWRcbiIKLQkJCSJ1c2VyIGxpbWl0OiAgICAgICAgICAgICAgUCVkOlQlZFxuIgotCQkJInRoZXJtYWwgbGltaXQ6ICAgICAgICAgICBQJWQ6VCVkXG4iLAotCQkJcHItPmxpbWl0LnN0YXRlLnB4LCBwci0+bGltaXQuc3RhdGUudHgsCi0JCQlwci0+bGltaXQudXNlci5weCwgcHItPmxpbWl0LnVzZXIudHgsCi0JCQlwci0+bGltaXQudGhlcm1hbC5weCwgcHItPmxpbWl0LnRoZXJtYWwudHgpOworCQkgICAidXNlciBsaW1pdDogICAgICAgICAgICAgIFAlZDpUJWRcbiIKKwkJICAgInRoZXJtYWwgbGltaXQ6ICAgICAgICAgICBQJWQ6VCVkXG4iLAorCQkgICBwci0+bGltaXQuc3RhdGUucHgsIHByLT5saW1pdC5zdGF0ZS50eCwKKwkJICAgcHItPmxpbWl0LnVzZXIucHgsIHByLT5saW1pdC51c2VyLnR4LAorCQkgICBwci0+bGltaXQudGhlcm1hbC5weCwgcHItPmxpbWl0LnRoZXJtYWwudHgpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCiBzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2xpbWl0X29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfcHJvY2Vzc29yX2xpbWl0X3NlcV9zaG93LAotCQkJCQkJUERFKGlub2RlKS0+ZGF0YSk7CisJCQkgICBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAotc3NpemVfdCBhY3BpX3Byb2Nlc3Nvcl93cml0ZV9saW1pdCAoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCWNvbnN0IGNoYXIJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpkYXRhKQorc3NpemVfdCBhY3BpX3Byb2Nlc3Nvcl93cml0ZV9saW1pdChzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0gICAgICAgIHN0cnVjdCBzZXFfZmlsZSAJKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopbS0+cHJpdmF0ZTsKLQljaGFyCQkJbGltaXRfc3RyaW5nWzI1XSA9IHsnXDAnfTsKLQlpbnQJCQlweCA9IDA7Ci0JaW50CQkJdHggPSAwOworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBzZXFfZmlsZSAqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKiltLT5wcml2YXRlOworCWNoYXIgbGltaXRfc3RyaW5nWzI1XSA9IHsgJ1wwJyB9OworCWludCBweCA9IDA7CisJaW50IHR4ID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3dyaXRlX2xpbWl0Iik7CiAKQEAgLTM5NiwxMSArMzgzLDkgQEAKIAlyZXR1cm5fVkFMVUUoY291bnQpOwogfQogCi0KIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9wcm9jZXNzb3JfbGltaXRfZm9wcyA9IHsKLQkub3BlbiAJCT0gYWNwaV9wcm9jZXNzb3JfbGltaXRfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV9wcm9jZXNzb3JfbGltaXRfb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aHJvdHRsaW5nLmMKaW5kZXggYmU5ZjU2OS4uNzRhNTJkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aHJvdHRsaW5nLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aHJvdHRsaW5nLmMKQEAgLTQzLDIxICs0MywxNyBAQAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9DTEFTUyAgICAgICAgICAgICJwcm9jZXNzb3IiCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0RSSVZFUl9OQU1FICAgICAgIkFDUEkgUHJvY2Vzc29yIERyaXZlciIKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICAgICAgQUNQSV9QUk9DRVNTT1JfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FICAgICAgICAgICAgICAgICgiYWNwaV9wcm9jZXNzb3IiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3Byb2Nlc3NvciIpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvdHRsaW5nIENvbnRyb2wKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX2dldF90aHJvdHRsaW5nICgKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotCWludAkJCXN0YXRlID0gMDsKLQl1MzIJCQl2YWx1ZSA9IDA7Ci0JdTMyCQkJZHV0eV9tYXNrID0gMDsKLQl1MzIJCQlkdXR5X3ZhbHVlID0gMDsKKwlpbnQgc3RhdGUgPSAwOworCXUzMiB2YWx1ZSA9IDA7CisJdTMyIGR1dHlfbWFzayA9IDA7CisJdTMyIGR1dHlfdmFsdWUgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmciKTsKIApAQCAtODYsNyArODIsNyBAQAogCQlkdXR5X3ZhbHVlID4+PSBwci0+dGhyb3R0bGluZy5kdXR5X29mZnNldDsKIAogCQlpZiAoZHV0eV92YWx1ZSkKLQkJCXN0YXRlID0gcHItPnRocm90dGxpbmcuc3RhdGVfY291bnQtZHV0eV92YWx1ZTsKKwkJCXN0YXRlID0gcHItPnRocm90dGxpbmcuc3RhdGVfY291bnQgLSBkdXR5X3ZhbHVlOwogCX0KIAogCXByLT50aHJvdHRsaW5nLnN0YXRlID0gc3RhdGU7CkBAIC05NCwyMCArOTAsMTcgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCSJUaHJvdHRsaW5nIHN0YXRlIGlzIFQlZCAoJWQlJSB0aHJvdHRsaW5nIGFwcGxpZWQpXG4iLAotCQlzdGF0ZSwgcHItPnRocm90dGxpbmcuc3RhdGVzW3N0YXRlXS5wZXJmb3JtYW5jZSkpOworCQkJICAiVGhyb3R0bGluZyBzdGF0ZSBpcyBUJWQgKCVkJSUgdGhyb3R0bGluZyBhcHBsaWVkKVxuIiwKKwkJCSAgc3RhdGUsIHByLT50aHJvdHRsaW5nLnN0YXRlc1tzdGF0ZV0ucGVyZm9ybWFuY2UpKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1pbnQgYWNwaV9wcm9jZXNzb3Jfc2V0X3Rocm90dGxpbmcgKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIsCi0JaW50CQkJc3RhdGUpCitpbnQgYWNwaV9wcm9jZXNzb3Jfc2V0X3Rocm90dGxpbmcoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwgaW50IHN0YXRlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBkdXR5X21hc2sgPSAwOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIGR1dHlfdmFsdWUgPSAwOworCXUzMiB2YWx1ZSA9IDA7CisJdTMyIGR1dHlfbWFzayA9IDA7CisJdTMyIGR1dHlfdmFsdWUgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3Jfc2V0X3Rocm90dGxpbmciKTsKIApAQCAtMTY4LDI4ICsxNjEsMjYgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCSJUaHJvdHRsaW5nIHN0YXRlIHNldCB0byBUJWQgKCVkJSUpXG4iLCBzdGF0ZSwKLQkJKHByLT50aHJvdHRsaW5nLnN0YXRlc1tzdGF0ZV0ucGVyZm9ybWFuY2U/cHItPnRocm90dGxpbmcuc3RhdGVzW3N0YXRlXS5wZXJmb3JtYW5jZS8xMDowKSkpOworCQkJICAiVGhyb3R0bGluZyBzdGF0ZSBzZXQgdG8gVCVkICglZCUlKVxuIiwgc3RhdGUsCisJCQkgIChwci0+dGhyb3R0bGluZy5zdGF0ZXNbc3RhdGVdLnBlcmZvcm1hbmNlID8gcHItPgorCQkJICAgdGhyb3R0bGluZy5zdGF0ZXNbc3RhdGVdLnBlcmZvcm1hbmNlIC8gMTAgOiAwKSkpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLWludAotYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmdfaW5mbyAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwcikKK2ludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZ19pbmZvKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlpbnQJCQlzdGVwID0gMDsKLQlpbnQJCQlpID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgc3RlcCA9IDA7CisJaW50IGkgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmdfaW5mbyIpOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkicGJsa19hZGRyZXNzWzB4JTA4eF0gZHV0eV9vZmZzZXRbJWRdIGR1dHlfd2lkdGhbJWRdXG4iLAotCQlwci0+dGhyb3R0bGluZy5hZGRyZXNzLAotCQlwci0+dGhyb3R0bGluZy5kdXR5X29mZnNldCwKLQkJcHItPnRocm90dGxpbmcuZHV0eV93aWR0aCkpOworCQkJICAicGJsa19hZGRyZXNzWzB4JTA4eF0gZHV0eV9vZmZzZXRbJWRdIGR1dHlfd2lkdGhbJWRdXG4iLAorCQkJICBwci0+dGhyb3R0bGluZy5hZGRyZXNzLAorCQkJICBwci0+dGhyb3R0bGluZy5kdXR5X29mZnNldCwKKwkJCSAgcHItPnRocm90dGxpbmcuZHV0eV93aWR0aCkpOwogCiAJaWYgKCFwcikKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwpAQCAtMTk5LDE0ICsxOTAsMTIgQEAKIAlpZiAoIXByLT50aHJvdHRsaW5nLmFkZHJlc3MpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTm8gdGhyb3R0bGluZyByZWdpc3RlclxuIikpOwogCQlyZXR1cm5fVkFMVUUoMCk7Ci0JfQotCWVsc2UgaWYgKCFwci0+dGhyb3R0bGluZy5kdXR5X3dpZHRoKSB7CisJfSBlbHNlIGlmICghcHItPnRocm90dGxpbmcuZHV0eV93aWR0aCkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJObyB0aHJvdHRsaW5nIHN0YXRlc1xuIikpOwogCQlyZXR1cm5fVkFMVUUoMCk7CiAJfQogCS8qIFRCRDogU3VwcG9ydCBkdXR5X2N5Y2xlIHZhbHVlcyB0aGF0IHNwYW4gYml0IDQuICovCi0JZWxzZSBpZiAoKHByLT50aHJvdHRsaW5nLmR1dHlfb2Zmc2V0Ci0JCSsgcHItPnRocm90dGxpbmcuZHV0eV93aWR0aCkgPiA0KSB7CisJZWxzZSBpZiAoKHByLT50aHJvdHRsaW5nLmR1dHlfb2Zmc2V0ICsgcHItPnRocm90dGxpbmcuZHV0eV93aWR0aCkgPiA0KSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgImR1dHlfY3ljbGUgc3BhbnMgYml0IDRcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKDApOwogCX0KQEAgLTIxOCw3ICsyMDcsNyBAQAogCSAqLwogCWlmIChlcnJhdGEucGlpeDQudGhyb3R0bGUpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIlRocm90dGxpbmcgbm90IHN1cHBvcnRlZCBvbiBQSUlYNCBBLSBvciBCLXN0ZXBcbiIpKTsKKwkJCQkgICJUaHJvdHRsaW5nIG5vdCBzdXBwb3J0ZWQgb24gUElJWDQgQS0gb3IgQi1zdGVwXG4iKSk7CiAJCXJldHVybl9WQUxVRSgwKTsKIAl9CiAKQEAgLTIzMiwxMyArMjIxLDEzIEBACiAKIAlzdGVwID0gKDEwMDAgLyBwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCk7CiAKLQlmb3IgKGk9MDsgaTxwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHByLT50aHJvdHRsaW5nLnN0YXRlX2NvdW50OyBpKyspIHsKIAkJcHItPnRocm90dGxpbmcuc3RhdGVzW2ldLnBlcmZvcm1hbmNlID0gc3RlcCAqIGk7CiAJCXByLT50aHJvdHRsaW5nLnN0YXRlc1tpXS5wb3dlciA9IHN0ZXAgKiBpOwogCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kICVkIHRocm90dGxpbmcgc3RhdGVzXG4iLAotCQlwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCkpOworCQkJICBwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCkpOwogCiAJcHItPmZsYWdzLnRocm90dGxpbmcgPSAxOwogCkBAIC0yNTMsMjggKzI0MiwyOSBAQAogCQlnb3RvIGVuZDsKIAogCWlmIChwci0+dGhyb3R0bGluZy5zdGF0ZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEaXNhYmxpbmcgdGhyb3R0bGluZyAod2FzIFQlZClcbiIsCi0JCQlwci0+dGhyb3R0bGluZy5zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiRGlzYWJsaW5nIHRocm90dGxpbmcgKHdhcyBUJWQpXG4iLAorCQkJCSAgcHItPnRocm90dGxpbmcuc3RhdGUpKTsKIAkJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3Jfc2V0X3Rocm90dGxpbmcocHIsIDApOwogCQlpZiAocmVzdWx0KQogCQkJZ290byBlbmQ7CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkKIAkJcHItPmZsYWdzLnRocm90dGxpbmcgPSAwOwogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQogLyogcHJvYyBpbnRlcmZhY2UgKi8KIAotc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJCSAgICAgIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKXNlcS0+cHJpdmF0ZTsKLQlpbnQJCQlpID0gMDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAwOworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopc2VxLT5wcml2YXRlOworCWludCBpID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfc2VxX3Nob3ciKTsKIApAQCAtMjg5LDQxICsyNzksNDEgQEAKIAlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZyhwcik7CiAKIAlpZiAocmVzdWx0KSB7Ci0JCXNlcV9wdXRzKHNlcSwgIkNvdWxkIG5vdCBkZXRlcm1pbmUgY3VycmVudCB0aHJvdHRsaW5nIHN0YXRlLlxuIik7CisJCXNlcV9wdXRzKHNlcSwKKwkJCSAiQ291bGQgbm90IGRldGVybWluZSBjdXJyZW50IHRocm90dGxpbmcgc3RhdGUuXG4iKTsKIAkJZ290byBlbmQ7CiAJfQogCiAJc2VxX3ByaW50ZihzZXEsICJzdGF0ZSBjb3VudDogICAgICAgICAgICAgJWRcbiIKLQkJCSJhY3RpdmUgc3RhdGU6ICAgICAgICAgICAgVCVkXG4iLAotCQkJcHItPnRocm90dGxpbmcuc3RhdGVfY291bnQsCi0JCQlwci0+dGhyb3R0bGluZy5zdGF0ZSk7CisJCSAgICJhY3RpdmUgc3RhdGU6ICAgICAgICAgICAgVCVkXG4iLAorCQkgICBwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCwgcHItPnRocm90dGxpbmcuc3RhdGUpOwogCiAJc2VxX3B1dHMoc2VxLCAic3RhdGVzOlxuIik7CiAJZm9yIChpID0gMDsgaSA8IHByLT50aHJvdHRsaW5nLnN0YXRlX2NvdW50OyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICAgJWNUJWQ6ICAgICAgICAgICAgICAgICAgJTAyZCUlXG4iLAotCQkJKGkgPT0gcHItPnRocm90dGxpbmcuc3RhdGU/JyonOicgJyksIGksCi0JCQkocHItPnRocm90dGxpbmcuc3RhdGVzW2ldLnBlcmZvcm1hbmNlP3ByLT50aHJvdHRsaW5nLnN0YXRlc1tpXS5wZXJmb3JtYW5jZS8xMDowKSk7CisJCQkgICAoaSA9PSBwci0+dGhyb3R0bGluZy5zdGF0ZSA/ICcqJyA6ICcgJyksIGksCisJCQkgICAocHItPnRocm90dGxpbmcuc3RhdGVzW2ldLnBlcmZvcm1hbmNlID8gcHItPgorCQkJICAgIHRocm90dGxpbmcuc3RhdGVzW2ldLnBlcmZvcm1hbmNlIC8gMTAgOiAwKSk7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19zZXFfc2hvdywKLQkJCQkJCVBERShpbm9kZSktPmRhdGEpOworCQkJICAgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKLXNzaXplX3QgYWNwaV9wcm9jZXNzb3Jfd3JpdGVfdGhyb3R0bGluZyAoCi0gICAgICAgIHN0cnVjdCBmaWxlCQkqZmlsZSwKLSAgICAgICAgY29uc3QgY2hhcgkJX191c2VyICpidWZmZXIsCi0gICAgICAgIHNpemVfdAkJCWNvdW50LAotICAgICAgICBsb2ZmX3QJCQkqZGF0YSkKK3NzaXplX3QgYWNwaV9wcm9jZXNzb3Jfd3JpdGVfdGhyb3R0bGluZyhzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCQkJCWNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLSAgICAgICAgc3RydWN0IHNlcV9maWxlIAkqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKiltLT5wcml2YXRlOwotCWNoYXIJCQlzdGF0ZV9zdHJpbmdbMTJdID0geydcMCd9OworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBzZXFfZmlsZSAqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKiltLT5wcml2YXRlOworCWNoYXIgc3RhdGVfc3RyaW5nWzEyXSA9IHsgJ1wwJyB9OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3Jfd3JpdGVfdGhyb3R0bGluZyIpOwogCkBAIC0zMzYsNyArMzI2LDggQEAKIAlzdGF0ZV9zdHJpbmdbY291bnRdID0gJ1wwJzsKIAogCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX3NldF90aHJvdHRsaW5nKHByLAotCQlzaW1wbGVfc3RydG91bChzdGF0ZV9zdHJpbmcsIE5VTEwsIDApKTsKKwkJCQkJICAgICAgIHNpbXBsZV9zdHJ0b3VsKHN0YXRlX3N0cmluZywKKwkJCQkJCQkgICAgICBOVUxMLCAwKSk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiAKQEAgLTM0NCw4ICszMzUsOCBAQAogfQogCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfZm9wcyA9IHsKLQkub3BlbiAJCT0gYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2FkZHIuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNhZGRyLmMKaW5kZXggNTVkMjY0Ny4uMjNiNTRiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2FkZHIuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzYWRkci5jCkBAIC00MSwxMyArNDEsMTg1IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3Jlc3JjLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicnNhZGRyIikKK0FDUElfTU9EVUxFX05BTUUoInJzYWRkciIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkCithY3BpX3JzX2RlY29kZV9nZW5lcmFsX2ZsYWdzKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqcmVzb3VyY2UsIHU4IGZsYWdzKTsKKworc3RhdGljIHU4IGFjcGlfcnNfZW5jb2RlX2dlbmVyYWxfZmxhZ3ModW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpyZXNvdXJjZSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2RlY29kZV9zcGVjaWZpY19mbGFncyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKnJlc291cmNlLCB1OCBmbGFncyk7CisKK3N0YXRpYyB1OCBhY3BpX3JzX2VuY29kZV9zcGVjaWZpY19mbGFncyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKnJlc291cmNlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19kZWNvZGVfZ2VuZXJhbF9mbGFncworICoKKyAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgICAgIC0gQWRkcmVzcyByZXNvdXJjZSBkYXRhIHN0cnVjdAorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBBY3R1YWwgZmxhZyBieXRlCisgKgorICogUkVUVVJOOiAgICAgIERlY29kZWQgZmxhZyBiaXRzIGluIHJlc291cmNlIHN0cnVjdAorICoKKyAqIERFU0NSSVBUSU9OOiBEZWNvZGUgYSBnZW5lcmFsIGZsYWcgYnl0ZSB0byBhbiBhZGRyZXNzIHJlc291cmNlIHN0cnVjdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2RlY29kZV9nZW5lcmFsX2ZsYWdzKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqcmVzb3VyY2UsIHU4IGZsYWdzKQoreworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qIFByb2R1Y2VyIC8gQ29uc3VtZXIgLSBmbGFnIGJpdFswXSAqLworCisJcmVzb3VyY2UtPmFkZHJlc3MucHJvZHVjZXJfY29uc3VtZXIgPSAodTMyKSAoZmxhZ3MgJiAweDAxKTsKKworCS8qIERlY29kZSAoX0RFQykgLSBmbGFnIGJpdFsxXSAqLworCisJcmVzb3VyY2UtPmFkZHJlc3MuZGVjb2RlID0gKHUzMikgKChmbGFncyA+PiAxKSAmIDB4MDEpOworCisJLyogTWluIEFkZHJlc3MgRml4ZWQgKF9NSUYpIC0gZmxhZyBiaXRbMl0gKi8KKworCXJlc291cmNlLT5hZGRyZXNzLm1pbl9hZGRyZXNzX2ZpeGVkID0gKHUzMikgKChmbGFncyA+PiAyKSAmIDB4MDEpOworCisJLyogTWF4IEFkZHJlc3MgRml4ZWQgKF9NQUYpIC0gZmxhZyBiaXRbM10gKi8KKworCXJlc291cmNlLT5hZGRyZXNzLm1heF9hZGRyZXNzX2ZpeGVkID0gKHUzMikgKChmbGFncyA+PiAzKSAmIDB4MDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2VuY29kZV9nZW5lcmFsX2ZsYWdzCisgKgorICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAgICAgLSBBZGRyZXNzIHJlc291cmNlIGRhdGEgc3RydWN0CisgKgorICogUkVUVVJOOiAgICAgIEVuY29kZWQgZ2VuZXJhbCBmbGFnIGJ5dGUKKyAqCisgKiBERVNDUklQVElPTjogQ29uc3RydWN0IGEgZ2VuZXJhbCBmbGFnIGJ5dGUgZnJvbSBhbiBhZGRyZXNzIHJlc291cmNlIHN0cnVjdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1OCBhY3BpX3JzX2VuY29kZV9nZW5lcmFsX2ZsYWdzKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqcmVzb3VyY2UpCit7CisJdTggZmxhZ3M7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKiBQcm9kdWNlciAvIENvbnN1bWVyIC0gZmxhZyBiaXRbMF0gKi8KKworCWZsYWdzID0gKHU4KSAocmVzb3VyY2UtPmFkZHJlc3MucHJvZHVjZXJfY29uc3VtZXIgJiAweDAxKTsKKworCS8qIERlY29kZSAoX0RFQykgLSBmbGFnIGJpdFsxXSAqLworCisJZmxhZ3MgfD0gKHU4KSAoKHJlc291cmNlLT5hZGRyZXNzLmRlY29kZSAmIDB4MDEpIDw8IDEpOworCisJLyogTWluIEFkZHJlc3MgRml4ZWQgKF9NSUYpIC0gZmxhZyBiaXRbMl0gKi8KKworCWZsYWdzIHw9ICh1OCkgKChyZXNvdXJjZS0+YWRkcmVzcy5taW5fYWRkcmVzc19maXhlZCAmIDB4MDEpIDw8IDIpOworCisJLyogTWF4IEFkZHJlc3MgRml4ZWQgKF9NQUYpIC0gZmxhZyBiaXRbM10gKi8KKworCWZsYWdzIHw9ICh1OCkgKChyZXNvdXJjZS0+YWRkcmVzcy5tYXhfYWRkcmVzc19maXhlZCAmIDB4MDEpIDw8IDMpOworCisJcmV0dXJuIChmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZGVjb2RlX3NwZWNpZmljX2ZsYWdzCisgKgorICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAgICAgLSBBZGRyZXNzIHJlc291cmNlIGRhdGEgc3RydWN0CisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIEFjdHVhbCBmbGFnIGJ5dGUKKyAqCisgKiBSRVRVUk46ICAgICAgRGVjb2RlZCBmbGFnIGJpdHMgaW4gYXR0cmlidXRlIHN0cnVjdAorICoKKyAqIERFU0NSSVBUSU9OOiBEZWNvZGUgYSB0eXBlLXNwZWNpZmljIGZsYWcgYnl0ZSB0byBhbiBhdHRyaWJ1dGUgc3RydWN0LgorICogICAgICAgICAgICAgIFR5cGUtc3BlY2lmaWMgZmxhZ3MgYXJlIG9ubHkgZGVmaW5lZCBmb3IgdGhlIE1lbW9yeSBhbmQgSU8KKyAqICAgICAgICAgICAgICByZXNvdXJjZSB0eXBlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kZWNvZGVfc3BlY2lmaWNfZmxhZ3ModW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpyZXNvdXJjZSwgdTggZmxhZ3MpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJaWYgKHJlc291cmNlLT5hZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9NRU1PUllfUkFOR0UpIHsKKwkJLyogV3JpdGUgU3RhdHVzIChfUlcpIC0gZmxhZyBiaXRbMF0gKi8KKworCQlyZXNvdXJjZS0+YWRkcmVzcy5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlID0KKwkJICAgICh1MTYpIChmbGFncyAmIDB4MDEpOworCisJCS8qIE1lbW9yeSBBdHRyaWJ1dGVzIChfTUVNKSAtIGZsYWcgYml0c1syOjFdICovCisKKwkJcmVzb3VyY2UtPmFkZHJlc3MuYXR0cmlidXRlLm1lbW9yeS5jYWNoZV9hdHRyaWJ1dGUgPQorCQkgICAgKHUxNikgKChmbGFncyA+PiAxKSAmIDB4MDMpOworCX0gZWxzZSBpZiAocmVzb3VyY2UtPmFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0lPX1JBTkdFKSB7CisJCS8qIFJhbmdlcyAoX1JORykgLSBmbGFnIGJpdHNbMTowXSAqLworCisJCXJlc291cmNlLT5hZGRyZXNzLmF0dHJpYnV0ZS5pby5yYW5nZV9hdHRyaWJ1dGUgPQorCQkgICAgKHUxNikgKGZsYWdzICYgMHgwMyk7CisKKwkJLyogVHJhbnNsYXRpb25zIChfVFRQIGFuZCBfVFJTKSAtIGZsYWcgYml0c1s1OjRdICovCisKKwkJcmVzb3VyY2UtPmFkZHJlc3MuYXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA9CisJCSAgICAodTE2KSAoKGZsYWdzID4+IDQpICYgMHgwMyk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2VuY29kZV9zcGVjaWZpY19mbGFncworICoKKyAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgICAgIC0gQWRkcmVzcyByZXNvdXJjZSBkYXRhIHN0cnVjdAorICoKKyAqIFJFVFVSTjogICAgICBFbmNvZGVkIHR5cGUtc3BlY2lmaWMgZmxhZyBieXRlCisgKgorICogREVTQ1JJUFRJT046IENvbnN0cnVjdCBhIHR5cGUtc3BlY2lmaWMgZmxhZyBieXRlIGZyb20gYW4gYXR0cmlidXRlIHN0cnVjdC4KKyAqICAgICAgICAgICAgICBUeXBlLXNwZWNpZmljIGZsYWdzIGFyZSBvbmx5IGRlZmluZWQgZm9yIHRoZSBNZW1vcnkgYW5kIElPCisgKiAgICAgICAgICAgICAgcmVzb3VyY2UgdHlwZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHU4IGFjcGlfcnNfZW5jb2RlX3NwZWNpZmljX2ZsYWdzKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqcmVzb3VyY2UpCit7CisJdTggZmxhZ3MgPSAwOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJaWYgKHJlc291cmNlLT5hZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9NRU1PUllfUkFOR0UpIHsKKwkJLyogV3JpdGUgU3RhdHVzIChfUlcpIC0gZmxhZyBiaXRbMF0gKi8KKworCQlmbGFncyA9ICh1OCkKKwkJICAgIChyZXNvdXJjZS0+YWRkcmVzcy5hdHRyaWJ1dGUubWVtb3J5LgorCQkgICAgIHJlYWRfd3JpdGVfYXR0cmlidXRlICYgMHgwMSk7CisKKwkJLyogTWVtb3J5IEF0dHJpYnV0ZXMgKF9NRU0pIC0gZmxhZyBiaXRzWzI6MV0gKi8KKworCQlmbGFncyB8PSAodTgpCisJCSAgICAoKHJlc291cmNlLT5hZGRyZXNzLmF0dHJpYnV0ZS5tZW1vcnkuCisJCSAgICAgIGNhY2hlX2F0dHJpYnV0ZSAmIDB4MDMpIDw8IDEpOworCX0gZWxzZSBpZiAocmVzb3VyY2UtPmFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0lPX1JBTkdFKSB7CisJCS8qIFJhbmdlcyAoX1JORykgLSBmbGFnIGJpdHNbMTowXSAqLworCisJCWZsYWdzID0gKHU4KQorCQkgICAgKHJlc291cmNlLT5hZGRyZXNzLmF0dHJpYnV0ZS5pby5yYW5nZV9hdHRyaWJ1dGUgJiAweDAzKTsKKworCQkvKiBUcmFuc2xhdGlvbnMgKF9UVFAgYW5kIF9UUlMpIC0gZmxhZyBiaXRzWzU6NF0gKi8KKworCQlmbGFncyB8PSAodTgpCisJCSAgICAoKHJlc291cmNlLT5hZGRyZXNzLmF0dHJpYnV0ZS5pby4KKwkJICAgICAgdHJhbnNsYXRpb25fYXR0cmlidXRlICYgMHgwMykgPDwgNCk7CisJfQorCisJcmV0dXJuIChmbGFncyk7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzEsMzQgKzI0MywzMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfYWRkcmVzczE2X3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpCithY3BpX3JzX2FkZHJlc3MxNl9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfcHRyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKLQkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2KTsKKwl1MzIgaW5kZXg7CisJdTE2IHRlbXAxNjsKKwl1OCB0ZW1wODsKKwl1OCAqdGVtcF9wdHI7CisJdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7CisJYWNwaV9zaXplIHN0cnVjdF9zaXplID0KKwkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2KTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2FkZHJlc3MxNl9yZXNvdXJjZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2FkZHJlc3MxNl9yZXNvdXJjZSIpOwotCi0KLQkvKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkICovCisJLyogR2V0IHRoZSBEZXNjcmlwdG9yIExlbmd0aCBmaWVsZCAqLwogCiAJYnVmZmVyICs9IDE7Ci0JQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCiAJLyogVmFsaWRhdGUgbWluaW11bSBkZXNjcmlwdG9yIGxlbmd0aCAqLwogCiAJaWYgKHRlbXAxNiA8IDEzKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEgpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEgpOwogCX0KIAogCSpieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7CkBAIC0xMTIsNyArMjgwLDcgQEAKIAkvKiBWYWx1ZXMgMC0yIGFuZCAweEMwLTB4RkYgYXJlIHZhbGlkICovCiAKIAlpZiAoKHRlbXA4ID4gMikgJiYgKHRlbXA4IDwgMHhDMCkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOwogCX0KIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3R5cGUgPSB0ZW1wODsKQEAgLTEyMCw3MyArMjg4LDQxIEBACiAJLyogR2V0IHRoZSBHZW5lcmFsIEZsYWdzIChCeXRlNCkgKi8KIAogCWJ1ZmZlciArPSAxOwotCXRlbXA4ID0gKmJ1ZmZlcjsKLQotCS8qIFByb2R1Y2VyIC8gQ29uc3VtZXIgKi8KLQotCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnByb2R1Y2VyX2NvbnN1bWVyID0gdGVtcDggJiAweDAxOwotCi0JLyogRGVjb2RlICovCi0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5kZWNvZGUgPSAodGVtcDggPj4gMSkgJiAweDAxOwotCi0JLyogTWluIEFkZHJlc3MgRml4ZWQgKi8KLQotCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2Lm1pbl9hZGRyZXNzX2ZpeGVkID0gKHRlbXA4ID4+IDIpICYgMHgwMTsKLQotCS8qIE1heCBBZGRyZXNzIEZpeGVkICovCi0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5tYXhfYWRkcmVzc19maXhlZCA9ICh0ZW1wOCA+PiAzKSAmIDB4MDE7CisJYWNwaV9yc19kZWNvZGVfZ2VuZXJhbF9mbGFncygmb3V0cHV0X3N0cnVjdC0+ZGF0YSwgKmJ1ZmZlcik7CiAKIAkvKiBHZXQgdGhlIFR5cGUgU3BlY2lmaWMgRmxhZ3MgKEJ5dGU1KSAqLwogCiAJYnVmZmVyICs9IDE7Ci0JdGVtcDggPSAqYnVmZmVyOwotCi0JaWYgKEFDUElfTUVNT1JZX1JBTkdFID09IG91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3R5cGUpIHsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYuYXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA9Ci0JCQkJKHUxNikgKHRlbXA4ICYgMHgwMSk7Ci0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlID0KLQkJCQkodTE2KSAoKHRlbXA4ID4+IDEpICYgMHgwMyk7Ci0JfQotCWVsc2UgewotCQlpZiAoQUNQSV9JT19SQU5HRSA9PSBvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV90eXBlKSB7Ci0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlID0KLQkJCQkodTE2KSAodGVtcDggJiAweDAzKTsKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPQotCQkJCSh1MTYpICgodGVtcDggPj4gNCkgJiAweDAzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIEJVU19OVU1CRVJfUkFOR0UgPT0gQWRkcmVzczE2LkRhdGEtPnJlc291cmNlX3R5cGUgKi8KLQkJCS8qIE5vdGhpbmcgbmVlZHMgdG8gYmUgZmlsbGVkIGluICovCi0JCX0KLQl9CisJYWNwaV9yc19kZWNvZGVfc3BlY2lmaWNfZmxhZ3MoJm91dHB1dF9zdHJ1Y3QtPmRhdGEsICpidWZmZXIpOwogCiAJLyogR2V0IEdyYW51bGFyaXR5IChCeXRlcyA2LTcpICovCiAKIAlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfMTZfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5ncmFudWxhcml0eSwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmdyYW51bGFyaXR5LCBidWZmZXIpOwogCiAJLyogR2V0IG1pbl9hZGRyZXNzX3JhbmdlIChCeXRlcyA4LTkpICovCiAKIAlidWZmZXIgKz0gMjsKLQlBQ1BJX01PVkVfMTZfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5taW5fYWRkcmVzc19yYW5nZSwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2Lm1pbl9hZGRyZXNzX3JhbmdlLAorCQkJICAgYnVmZmVyKTsKIAogCS8qIEdldCBtYXhfYWRkcmVzc19yYW5nZSAoQnl0ZXMgMTAtMTEpICovCiAKIAlidWZmZXIgKz0gMjsKLQlBQ1BJX01PVkVfMTZfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5tYXhfYWRkcmVzc19yYW5nZSwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2Lm1heF9hZGRyZXNzX3JhbmdlLAorCQkJICAgYnVmZmVyKTsKIAogCS8qIEdldCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCAoQnl0ZXMgMTItMTMpICovCiAKIAlidWZmZXIgKz0gMjsKLQlBQ1BJX01PVkVfMTZfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCwKLQkJYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LgorCQkJICAgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQsIGJ1ZmZlcik7CiAKIAkvKiBHZXQgYWRkcmVzc19sZW5ndGggKEJ5dGVzIDE0LTE1KSAqLwogCiAJYnVmZmVyICs9IDI7Ci0JQUNQSV9NT1ZFXzE2X1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYuYWRkcmVzc19sZW5ndGgsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzE2X1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5hZGRyZXNzX2xlbmd0aCwKKwkJCSAgIGJ1ZmZlcik7CiAKIAkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggKGlmIHByZXNlbnQpICovCiAKQEAgLTIwNSw4ICszNDEsOCBAQAogCWlmICgqYnl0ZXNfY29uc3VtZWQgPiAoMTYgKyAxKSkgewogCQkvKiBEZXJlZmVyZW5jZSB0aGUgSW5kZXggKi8KIAotCQl0ZW1wOCA9ICpidWZmZXI7Ci0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5pbmRleCA9ICh1MzIpIHRlbXA4OworCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UuaW5kZXggPQorCQkgICAgKHUzMikgKiBidWZmZXI7CiAKIAkJLyogUG9pbnQgdG8gdGhlIFN0cmluZyAqLwogCkBAIC0yMTUsMjggKzM1MSwyNyBAQAogCQkvKiBQb2ludCB0aGUgU3RyaW5nIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGlzIHN0cnVjdHVyZSAqLwogCiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0KLQkJCQkoY2hhciAqKSgodTggKiApb3V0cHV0X3N0cnVjdCArIHN0cnVjdF9zaXplKTsKKwkJICAgIChjaGFyICopKCh1OCAqKSBvdXRwdXRfc3RydWN0ICsgc3RydWN0X3NpemUpOwogCiAJCXRlbXBfcHRyID0gKHU4ICopCi0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cjsKKwkJICAgIG91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOwogCi0JCS8qIENvcHkgdGhlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KKwkJLyogQ29weSB0aGUgcmVzb3VyY2Vfc291cmNlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KIAogCQlpbmRleCA9IDA7Ci0KLQkJd2hpbGUgKDB4MDAgIT0gKmJ1ZmZlcikgeworCQl3aGlsZSAoKmJ1ZmZlcikgewogCQkJKnRlbXBfcHRyID0gKmJ1ZmZlcjsKIAotCQkJdGVtcF9wdHIgKz0gMTsKLQkJCWJ1ZmZlciArPSAxOwotCQkJaW5kZXggKz0gMTsKKwkJCXRlbXBfcHRyKys7CisJCQlidWZmZXIrKzsKKwkJCWluZGV4Kys7CiAJCX0KIAotCQkvKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwgKi8KKwkJLyogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsIGFuZCBzZXQgdGhlIHN0cmluZyBsZW5ndGggKi8KIAotCQkqdGVtcF9wdHIgPSAweDAwOwotCi0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0gaW5kZXggKyAxOworCQkqdGVtcF9wdHIgPSAwOworCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9CisJCSAgICBpbmRleCArIDE7CiAKIAkJLyoKIAkJICogSW4gb3JkZXIgZm9yIHRoZSBzdHJ1Y3Rfc2l6ZSB0byBmYWxsIG9uIGEgMzItYml0IGJvdW5kYXJ5LApAQCAtMjQ0LDEwICszNzksOSBAQAogCQkgKiBzdHJ1Y3Rfc2l6ZSB0byB0aGUgbmV4dCAzMi1iaXQgYm91bmRhcnkuCiAJCSAqLwogCQl0ZW1wOCA9ICh1OCkgKGluZGV4ICsgMSk7Ci0JCXN0cnVjdF9zaXplICs9IEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyAodGVtcDgpOwotCX0KLQllbHNlIHsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLmluZGV4ID0gMHgwMDsKKwkJc3RydWN0X3NpemUgKz0gQUNQSV9ST1VORF9VUF90b18zMl9iSVRTKHRlbXA4KTsKKwl9IGVsc2UgeworCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UuaW5kZXggPSAwOwogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9IDA7CiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0gTlVMTDsKIAl9CkBAIC0yNTksMTAgKzM5Myw5IEBACiAJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KIAogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19hZGRyZXNzMTZfc3RyZWFtCkBAIC0yODAsMjQgKzQxMywxOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfYWRkcmVzczE2X3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpCithY3BpX3JzX2FkZHJlc3MxNl9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF9maWVsZDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4OwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfcG9pbnRlciA9IE5VTEw7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfYnl0ZXM7CisJdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOworCXU4ICpsZW5ndGhfZmllbGQ7CisJYWNwaV9zaXplIGFjdHVhbF9ieXRlczsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2FkZHJlc3MxNl9zdHJlYW0iKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19hZGRyZXNzMTZfc3RyZWFtIik7CisJLyogU2V0IHRoZSBEZXNjcmlwdG9yIFR5cGUgZmllbGQgKi8KIAotCi0JLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCi0KLQkqYnVmZmVyID0gMHg4ODsKKwkqYnVmZmVyID0gQUNQSV9SREVTQ19UWVBFX1dPUkRfQUREUkVTU19TUEFDRTsKIAlidWZmZXIgKz0gMTsKIAogCS8qIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIgKi8KQEAgLTMwNyw5OCArNDM0LDc0IEBACiAKIAkvKiBTZXQgdGhlIFJlc291cmNlIFR5cGUgKE1lbW9yeSwgSW8sIGJ1c19udW1iZXIpICovCiAKLQl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV90eXBlICYgMHgwMyk7Ci0JKmJ1ZmZlciA9IHRlbXA4OworCSpidWZmZXIgPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2VfdHlwZSAmIDB4MDMpOwogCWJ1ZmZlciArPSAxOwogCiAJLyogU2V0IHRoZSBnZW5lcmFsIGZsYWdzICovCiAKLQl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5wcm9kdWNlcl9jb25zdW1lciAmIDB4MDEpOwotCi0JdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5kZWNvZGUgJiAweDAxKSA8PCAxOwotCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYubWluX2FkZHJlc3NfZml4ZWQgJiAweDAxKSA8PCAyOwotCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYubWF4X2FkZHJlc3NfZml4ZWQgJiAweDAxKSA8PCAzOwotCi0JKmJ1ZmZlciA9IHRlbXA4OworCSpidWZmZXIgPSBhY3BpX3JzX2VuY29kZV9nZW5lcmFsX2ZsYWdzKCZsaW5rZWRfbGlzdC0+ZGF0YSk7CiAJYnVmZmVyICs9IDE7CiAKIAkvKiBTZXQgdGhlIHR5cGUgc3BlY2lmaWMgZmxhZ3MgKi8KIAotCXRlbXA4ID0gMDsKLQotCWlmIChBQ1BJX01FTU9SWV9SQU5HRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2VfdHlwZSkgewotCQl0ZW1wOCA9ICh1OCkKLQkJCShsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuYXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSAmCi0JCQkgMHgwMSk7Ci0KLQkJdGVtcDggfD0KLQkJCShsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuYXR0cmlidXRlLm1lbW9yeS5jYWNoZV9hdHRyaWJ1dGUgJgotCQkJIDB4MDMpIDw8IDE7Ci0JfQotCWVsc2UgaWYgKEFDUElfSU9fUkFOR0UgPT0gbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3R5cGUpIHsKLQkJdGVtcDggPSAodTgpCi0JCQkobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LmF0dHJpYnV0ZS5pby5yYW5nZV9hdHRyaWJ1dGUgJgotCQkJIDB4MDMpOwotCQl0ZW1wOCB8PQotCQkJKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5hdHRyaWJ1dGUuaW8udHJhbnNsYXRpb25fYXR0cmlidXRlICYKLQkJCSAweDAzKSA8PCA0OwotCX0KLQotCSpidWZmZXIgPSB0ZW1wODsKKwkqYnVmZmVyID0gYWNwaV9yc19lbmNvZGVfc3BlY2lmaWNfZmxhZ3MoJmxpbmtlZF9saXN0LT5kYXRhKTsKIAlidWZmZXIgKz0gMTsKIAogCS8qIFNldCB0aGUgYWRkcmVzcyBzcGFjZSBncmFudWxhcml0eSAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuZ3JhbnVsYXJpdHkpOworCUFDUElfTU9WRV8zMl9UT18xNihidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuZ3JhbnVsYXJpdHkpOwogCWJ1ZmZlciArPSAyOwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1pbmltdW0gKi8KIAotCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2Lm1pbl9hZGRyZXNzX3JhbmdlKTsKKwlBQ1BJX01PVkVfMzJfVE9fMTYoYnVmZmVyLAorCQkJICAgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5taW5fYWRkcmVzc19yYW5nZSk7CiAJYnVmZmVyICs9IDI7CiAKIAkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWF4aW11bSAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYubWF4X2FkZHJlc3NfcmFuZ2UpOworCUFDUElfTU9WRV8zMl9UT18xNihidWZmZXIsCisJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2Lm1heF9hZGRyZXNzX3JhbmdlKTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQgKi8KIAotCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLAotCQkmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKKwlBQ1BJX01PVkVfMzJfVE9fMTYoYnVmZmVyLAorCQkJICAgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi4KKwkJCSAgIGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgYWRkcmVzcyBsZW5ndGggKi8KIAotCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LmFkZHJlc3NfbGVuZ3RoKTsKKwlBQ1BJX01PVkVfMzJfVE9fMTYoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LmFkZHJlc3NfbGVuZ3RoKTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFJlc291cmNlIFNvdXJjZSBJbmRleCBhbmQgUmVzb3VyY2UgU291cmNlIGFyZSBvcHRpb25hbCAqLwogCi0JaWYgKDAgIT0gbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoKSB7Ci0JCXRlbXA4ID0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLmluZGV4OwotCi0JCSpidWZmZXIgPSB0ZW1wODsKKwlpZiAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoKSB7CisJCSpidWZmZXIgPQorCQkgICAgKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLmluZGV4OwogCQlidWZmZXIgKz0gMTsKIAotCQl0ZW1wX3BvaW50ZXIgPSAoY2hhciAqKSBidWZmZXI7CisJCS8qIENvcHkgdGhlIHJlc291cmNlX3NvdXJjZSBzdHJpbmcgKi8KIAotCQkvKiBDb3B5IHRoZSBzdHJpbmcgKi8KLQotCQlBQ1BJX1NUUkNQWSAodGVtcF9wb2ludGVyLAotCQkJCWxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CisJCUFDUElfU1RSQ1BZKChjaGFyICopYnVmZmVyLAorCQkJICAgIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UuCisJCQkgICAgc3RyaW5nX3B0cik7CiAKIAkJLyoKLQkJICogQnVmZmVyIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdGluZyArIG9uZSBmb3IgdGhlCisJCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICsgb25lIGZvciB0aGUKIAkJICogdGVybWluYXRpbmcgbnVsbAogCQkgKi8KLQkJYnVmZmVyICs9IChhY3BpX3NpemUpKEFDUElfU1RSTEVOICgKLQkJCQkgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSArIDEpOworCQlidWZmZXIgKz0KKwkJICAgIChhY3BpX3NpemUpIChBQ1BJX1NUUkxFTgorCQkJCSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS4KKwkJCQkgIHN0cmluZ19wdHIpICsgMSk7CiAJfQogCiAJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KIAotCWFjdHVhbF9ieXRlcyA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOworCWFjdHVhbF9ieXRlcyA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJKmJ5dGVzX2NvbnN1bWVkID0gYWN0dWFsX2J5dGVzOwogCiAJLyoKQEAgLTQwNiwxMSArNTA5LDEwIEBACiAJICogbWludXMgdGhlIGhlYWRlciBzaXplICgzIGJ5dGVzKQogCSAqLwogCWFjdHVhbF9ieXRlcyAtPSAzOwotCUFDUElfTU9WRV9TSVpFX1RPXzE2IChsZW5ndGhfZmllbGQsICZhY3R1YWxfYnl0ZXMpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCUFDUElfTU9WRV9TSVpFX1RPXzE2KGxlbmd0aF9maWVsZCwgJmFjdHVhbF9ieXRlcyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2FkZHJlc3MzMl9yZXNvdXJjZQpAQCAtNDMzLDM2ICs1MzUsMzAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3MzMl9yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKQorYWNwaV9yc19hZGRyZXNzMzJfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCSAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0PSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfcHRyOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKKwl1MTYgdGVtcDE2OworCXU4IHRlbXA4OworCXU4ICp0ZW1wX3B0cjsKKwl1MzIgaW5kZXg7CisJdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7CisJYWNwaV9zaXplIHN0cnVjdF9zaXplID0KKwkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyKTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2FkZHJlc3MzMl9yZXNvdXJjZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2FkZHJlc3MzMl9yZXNvdXJjZSIpOwotCi0KLQlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyKTsKLQotCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwkvKiBHZXQgdGhlIERlc2NyaXB0b3IgTGVuZ3RoIGZpZWxkICovCiAKIAlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAkvKiBWYWxpZGF0ZSBtaW5pbXVtIGRlc2NyaXB0b3IgbGVuZ3RoICovCiAKIAlpZiAodGVtcDE2IDwgMjMpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCk7CiAJfQogCiAJKmJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKQEAgLTQ3Niw3ICs1NzIsNyBAQAogCS8qIFZhbHVlcyAwLTIgYW5kIDB4QzAtMHhGRiBhcmUgdmFsaWQgKi8KIAogCWlmICgodGVtcDggPiAyKSAmJiAodGVtcDggPCAweEMwKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CiAJfQogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2VfdHlwZSA9IHRlbXA4OwpAQCAtNDg0LDc0ICs1ODAsNDEgQEAKIAkvKiBHZXQgdGhlIEdlbmVyYWwgRmxhZ3MgKEJ5dGU0KSAqLwogCiAJYnVmZmVyICs9IDE7Ci0JdGVtcDggPSAqYnVmZmVyOwotCi0JLyogUHJvZHVjZXIgLyBDb25zdW1lciAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucHJvZHVjZXJfY29uc3VtZXIgPSB0ZW1wOCAmIDB4MDE7Ci0KLQkvKiBEZWNvZGUgKi8KLQotCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmRlY29kZSA9ICh0ZW1wOCA+PiAxKSAmIDB4MDE7Ci0KLQkvKiBNaW4gQWRkcmVzcyBGaXhlZCAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIubWluX2FkZHJlc3NfZml4ZWQgPSAodGVtcDggPj4gMikgJiAweDAxOwotCi0JLyogTWF4IEFkZHJlc3MgRml4ZWQgKi8KLQotCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLm1heF9hZGRyZXNzX2ZpeGVkID0gKHRlbXA4ID4+IDMpICYgMHgwMTsKKwlhY3BpX3JzX2RlY29kZV9nZW5lcmFsX2ZsYWdzKCZvdXRwdXRfc3RydWN0LT5kYXRhLCAqYnVmZmVyKTsKIAogCS8qIEdldCB0aGUgVHlwZSBTcGVjaWZpYyBGbGFncyAoQnl0ZTUpICovCiAKIAlidWZmZXIgKz0gMTsKLQl0ZW1wOCA9ICpidWZmZXI7Ci0KLQlpZiAoQUNQSV9NRU1PUllfUkFOR0UgPT0gb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2VfdHlwZSkgewotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlID0KLQkJCQkodTE2KSAodGVtcDggJiAweDAxKTsKLQotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5hdHRyaWJ1dGUubWVtb3J5LmNhY2hlX2F0dHJpYnV0ZSA9Ci0JCQkJKHUxNikgKCh0ZW1wOCA+PiAxKSAmIDB4MDMpOwotCX0KLQllbHNlIHsKLQkJaWYgKEFDUElfSU9fUkFOR0UgPT0gb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2VfdHlwZSkgewotCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuYXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSA9Ci0JCQkJKHUxNikgKHRlbXA4ICYgMHgwMyk7Ci0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5hdHRyaWJ1dGUuaW8udHJhbnNsYXRpb25fYXR0cmlidXRlID0KLQkJCQkodTE2KSAoKHRlbXA4ID4+IDQpICYgMHgwMyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBCVVNfTlVNQkVSX1JBTkdFID09IG91dHB1dF9zdHJ1Y3QtPkRhdGEuQWRkcmVzczMyLnJlc291cmNlX3R5cGUgKi8KLQkJCS8qIE5vdGhpbmcgbmVlZHMgdG8gYmUgZmlsbGVkIGluICovCi0JCX0KLQl9CisJYWNwaV9yc19kZWNvZGVfc3BlY2lmaWNfZmxhZ3MoJm91dHB1dF9zdHJ1Y3QtPmRhdGEsICpidWZmZXIpOwogCiAJLyogR2V0IEdyYW51bGFyaXR5IChCeXRlcyA2LTkpICovCiAKIAlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5ncmFudWxhcml0eSwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMzJfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmdyYW51bGFyaXR5LCBidWZmZXIpOwogCiAJLyogR2V0IG1pbl9hZGRyZXNzX3JhbmdlIChCeXRlcyAxMC0xMykgKi8KIAogCWJ1ZmZlciArPSA0OwotCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLm1pbl9hZGRyZXNzX3JhbmdlLCBidWZmZXIpOworCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIubWluX2FkZHJlc3NfcmFuZ2UsCisJCQkgICBidWZmZXIpOwogCiAJLyogR2V0IG1heF9hZGRyZXNzX3JhbmdlIChCeXRlcyAxNC0xNykgKi8KIAogCWJ1ZmZlciArPSA0OwotCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLm1heF9hZGRyZXNzX3JhbmdlLCBidWZmZXIpOworCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIubWF4X2FkZHJlc3NfcmFuZ2UsCisJCQkgICBidWZmZXIpOwogCiAJLyogR2V0IGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0IChCeXRlcyAxOC0yMSkgKi8KIAogCWJ1ZmZlciArPSA0OwotCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0LAotCQlidWZmZXIpOworCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuCisJCQkgICBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCwgYnVmZmVyKTsKIAogCS8qIEdldCBhZGRyZXNzX2xlbmd0aCAoQnl0ZXMgMjItMjUpICovCiAKIAlidWZmZXIgKz0gNDsKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5hZGRyZXNzX2xlbmd0aCwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMzJfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmFkZHJlc3NfbGVuZ3RoLAorCQkJICAgYnVmZmVyKTsKIAogCS8qIFJlc291cmNlIFNvdXJjZSBJbmRleCAoaWYgcHJlc2VudCkgKi8KIApAQCAtNTY4LDkgKzYzMSw4IEBACiAJaWYgKCpieXRlc19jb25zdW1lZCA+ICgyNiArIDEpKSB7CiAJCS8qIERlcmVmZXJlbmNlIHRoZSBJbmRleCAqLwogCi0JCXRlbXA4ID0gKmJ1ZmZlcjsKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLmluZGV4ID0KLQkJCQkodTMyKSB0ZW1wODsKKwkJICAgICh1MzIpICogYnVmZmVyOwogCiAJCS8qIFBvaW50IHRvIHRoZSBTdHJpbmcgKi8KIApAQCAtNTc5LDI2ICs2NDEsMjcgQEAKIAkJLyogUG9pbnQgdGhlIFN0cmluZyBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KIAogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9Ci0JCQkJKGNoYXIgKikoKHU4ICopb3V0cHV0X3N0cnVjdCArIHN0cnVjdF9zaXplKTsKKwkJICAgIChjaGFyICopKCh1OCAqKSBvdXRwdXRfc3RydWN0ICsgc3RydWN0X3NpemUpOwogCiAJCXRlbXBfcHRyID0gKHU4ICopCi0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cjsKKwkJICAgIG91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOwogCi0JCS8qIENvcHkgdGhlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KKwkJLyogQ29weSB0aGUgcmVzb3VyY2Vfc291cmNlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KIAogCQlpbmRleCA9IDA7Ci0JCXdoaWxlICgweDAwICE9ICpidWZmZXIpIHsKKwkJd2hpbGUgKCpidWZmZXIpIHsKIAkJCSp0ZW1wX3B0ciA9ICpidWZmZXI7CiAKLQkJCXRlbXBfcHRyICs9IDE7Ci0JCQlidWZmZXIgKz0gMTsKLQkJCWluZGV4ICs9IDE7CisJCQl0ZW1wX3B0cisrOworCQkJYnVmZmVyKys7CisJCQlpbmRleCsrOwogCQl9CiAKLQkJLyogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsICovCisJCS8qIEFkZCB0aGUgdGVybWluYXRpbmcgbnVsbCBhbmQgc2V0IHRoZSBzdHJpbmcgbGVuZ3RoICovCiAKLQkJKnRlbXBfcHRyID0gMHgwMDsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPSBpbmRleCArIDE7CisJCSp0ZW1wX3B0ciA9IDA7CisJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0KKwkJICAgIGluZGV4ICsgMTsKIAogCQkvKgogCQkgKiBJbiBvcmRlciBmb3IgdGhlIHN0cnVjdF9zaXplIHRvIGZhbGwgb24gYSAzMi1iaXQgYm91bmRhcnksCkBAIC02MDYsMTAgKzY2OSw5IEBACiAJCSAqIHN0cnVjdF9zaXplIHRvIHRoZSBuZXh0IDMyLWJpdCBib3VuZGFyeS4KIAkJICovCiAJCXRlbXA4ID0gKHU4KSAoaW5kZXggKyAxKTsKLQkJc3RydWN0X3NpemUgKz0gQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wOCk7Ci0JfQotCWVsc2UgewotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UuaW5kZXggPSAweDAwOworCQlzdHJ1Y3Rfc2l6ZSArPSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFModGVtcDgpOworCX0gZWxzZSB7CisJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5pbmRleCA9IDA7CiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0gMDsKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPSBOVUxMOwogCX0KQEAgLTYyMSwxMCArNjgzLDkgQEAKIAkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwogCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2FkZHJlc3MzMl9zdHJlYW0KQEAgLTY0MiwxMzYgKzcwMywxMDUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3MzMl9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKQorYWNwaV9yc19hZGRyZXNzMzJfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCSB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX2ZpZWxkOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDg7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9wb2ludGVyOworCXU4ICpidWZmZXI7CisJdTE2ICpsZW5ndGhfZmllbGQ7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19hZGRyZXNzMzJfc3RyZWFtIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19hZGRyZXNzMzJfc3RyZWFtIik7CiAKIAlidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKIAotCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCS8qIFNldCB0aGUgRGVzY3JpcHRvciBUeXBlIGZpZWxkICovCiAKLQkqYnVmZmVyID0gMHg4NzsKKwkqYnVmZmVyID0gQUNQSV9SREVTQ19UWVBFX0RXT1JEX0FERFJFU1NfU1BBQ0U7CiAJYnVmZmVyICs9IDE7CiAKLQkvKiBTZXQgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIgKi8KKwkvKiBTYXZlIGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyICovCiAKLQlsZW5ndGhfZmllbGQgPSBBQ1BJX0NBU1RfUFRSICh1MTYsIGJ1ZmZlcik7CisJbGVuZ3RoX2ZpZWxkID0gQUNQSV9DQVNUX1BUUih1MTYsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDI7CiAKIAkvKiBTZXQgdGhlIFJlc291cmNlIFR5cGUgKE1lbW9yeSwgSW8sIGJ1c19udW1iZXIpICovCiAKLQl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV90eXBlICYgMHgwMyk7Ci0KLQkqYnVmZmVyID0gdGVtcDg7CisJKmJ1ZmZlciA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV90eXBlICYgMHgwMyk7CiAJYnVmZmVyICs9IDE7CiAKIAkvKiBTZXQgdGhlIGdlbmVyYWwgZmxhZ3MgKi8KIAotCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnByb2R1Y2VyX2NvbnN1bWVyICYgMHgwMSk7Ci0JdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5kZWNvZGUgJiAweDAxKSA8PCAxOwotCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIubWluX2FkZHJlc3NfZml4ZWQgJiAweDAxKSA8PCAyOwotCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIubWF4X2FkZHJlc3NfZml4ZWQgJiAweDAxKSA8PCAzOwotCi0JKmJ1ZmZlciA9IHRlbXA4OworCSpidWZmZXIgPSBhY3BpX3JzX2VuY29kZV9nZW5lcmFsX2ZsYWdzKCZsaW5rZWRfbGlzdC0+ZGF0YSk7CiAJYnVmZmVyICs9IDE7CiAKIAkvKiBTZXQgdGhlIHR5cGUgc3BlY2lmaWMgZmxhZ3MgKi8KIAotCXRlbXA4ID0gMDsKLQotCWlmIChBQ1BJX01FTU9SWV9SQU5HRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2VfdHlwZSkgewotCQl0ZW1wOCA9ICh1OCkKLQkJCShsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIuYXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSAmCi0JCQkweDAxKTsKLQotCQl0ZW1wOCB8PQotCQkJKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5hdHRyaWJ1dGUubWVtb3J5LmNhY2hlX2F0dHJpYnV0ZSAmCi0JCQkgMHgwMykgPDwgMTsKLQl9Ci0JZWxzZSBpZiAoQUNQSV9JT19SQU5HRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2VfdHlwZSkgewotCQl0ZW1wOCA9ICh1OCkKLQkJCShsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIuYXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSAmCi0JCQkgMHgwMyk7Ci0JCXRlbXA4IHw9Ci0JCQkobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgJgotCQkJIDB4MDMpIDw8IDQ7Ci0JfQotCi0JKmJ1ZmZlciA9IHRlbXA4OworCSpidWZmZXIgPSBhY3BpX3JzX2VuY29kZV9zcGVjaWZpY19mbGFncygmbGlua2VkX2xpc3QtPmRhdGEpOwogCWJ1ZmZlciArPSAxOwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIHNwYWNlIGdyYW51bGFyaXR5ICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5ncmFudWxhcml0eSk7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5ncmFudWxhcml0eSk7CiAJYnVmZmVyICs9IDQ7CiAKIAkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWluaW11bSAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIubWluX2FkZHJlc3NfcmFuZ2UpOworCUFDUElfTU9WRV8zMl9UT18zMihidWZmZXIsCisJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLm1pbl9hZGRyZXNzX3JhbmdlKTsKIAlidWZmZXIgKz0gNDsKIAogCS8qIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtYXhpbXVtICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5tYXhfYWRkcmVzc19yYW5nZSk7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwKKwkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIubWF4X2FkZHJlc3NfcmFuZ2UpOwogCWJ1ZmZlciArPSA0OwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldCAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsCi0JCSZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOworCUFDUElfTU9WRV8zMl9UT18zMihidWZmZXIsCisJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLgorCQkJICAgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwogCWJ1ZmZlciArPSA0OwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aCAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc19sZW5ndGgpOworCUFDUElfTU9WRV8zMl9UT18zMihidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc19sZW5ndGgpOwogCWJ1ZmZlciArPSA0OwogCiAJLyogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsICovCiAKLQlpZiAoMCAhPSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKLQkJdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7Ci0KLQkJKmJ1ZmZlciA9IHRlbXA4OworCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKKwkJKmJ1ZmZlciA9CisJCSAgICAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7CiAJCWJ1ZmZlciArPSAxOwogCi0JCXRlbXBfcG9pbnRlciA9IChjaGFyICopIGJ1ZmZlcjsKKwkJLyogQ29weSB0aGUgcmVzb3VyY2Vfc291cmNlIHN0cmluZyAqLwogCi0JCS8qIENvcHkgdGhlIHN0cmluZyAqLwotCi0JCUFDUElfU1RSQ1BZICh0ZW1wX3BvaW50ZXIsCi0JCQlsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOworCQlBQ1BJX1NUUkNQWSgoY2hhciAqKWJ1ZmZlciwKKwkJCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLgorCQkJICAgIHN0cmluZ19wdHIpOwogCiAJCS8qCi0JCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RpbmcgKyBvbmUgZm9yIHRoZQorCQkgKiBCdWZmZXIgbmVlZHMgdG8gYmUgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyArIG9uZSBmb3IgdGhlCiAJCSAqICB0ZXJtaW5hdGluZyBudWxsCiAJCSAqLwotCQlidWZmZXIgKz0gKGFjcGlfc2l6ZSkoQUNQSV9TVFJMRU4gKAotCQkJCSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpICsgMSk7CisJCWJ1ZmZlciArPQorCQkgICAgKGFjcGlfc2l6ZSkgKEFDUElfU1RSTEVOCisJCQkJIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLgorCQkJCSAgc3RyaW5nX3B0cikgKyAxKTsKIAl9CiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwogCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CisJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAogCS8qCiAJICogU2V0IHRoZSBsZW5ndGggZmllbGQgdG8gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZAotCSAqICBtaW51cyB0aGUgaGVhZGVyIHNpemUgKDMgYnl0ZXMpCisJICogbWludXMgdGhlIGhlYWRlciBzaXplICgzIGJ5dGVzKQogCSAqLwogCSpsZW5ndGhfZmllbGQgPSAodTE2KSAoKmJ5dGVzX2NvbnN1bWVkIC0gMyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2FkZHJlc3M2NF9yZXNvdXJjZQpAQCAtNzk0LDM4ICs4MjQsMzUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3M2NF9yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKQorYWNwaV9yc19hZGRyZXNzNjRfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCSAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTY7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wODsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3R5cGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9wdHI7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OworCXUxNiB0ZW1wMTY7CisJdTggdGVtcDg7CisJdTggcmVzb3VyY2VfdHlwZTsKKwl1OCAqdGVtcF9wdHI7CisJdTMyIGluZGV4OworCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOworCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9CisJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCk7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19hZGRyZXNzNjRfcmVzb3VyY2UiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19hZGRyZXNzNjRfcmVzb3VyY2UiKTsKKwkvKiBHZXQgdGhlIERlc2NyaXB0b3IgVHlwZSAqLwogCi0KLQlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KTsKIAlyZXNvdXJjZV90eXBlID0gKmJ1ZmZlcjsKIAotCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwkvKiBHZXQgdGhlIERlc2NyaXB0b3IgTGVuZ3RoIGZpZWxkICovCiAKIAlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAkvKiBWYWxpZGF0ZSBtaW5pbXVtIGRlc2NyaXB0b3IgbGVuZ3RoICovCiAKIAlpZiAodGVtcDE2IDwgNDMpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCk7CiAJfQogCiAJKmJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKQEAgLTgzOSw3ICs4NjYsNyBAQAogCS8qIFZhbHVlcyAwLTIgYW5kIDB4QzAtMHhGRiBhcmUgdmFsaWQgKi8KIAogCWlmICgodGVtcDggPiAyKSAmJiAodGVtcDggPCAweEMwKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CiAJfQogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2VfdHlwZSA9IHRlbXA4OwpAQCAtODQ3LDQ4ICs4NzQsMTIgQEAKIAkvKiBHZXQgdGhlIEdlbmVyYWwgRmxhZ3MgKEJ5dGU0KSAqLwogCiAJYnVmZmVyICs9IDE7Ci0JdGVtcDggPSAqYnVmZmVyOwotCi0JLyogUHJvZHVjZXIgLyBDb25zdW1lciAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucHJvZHVjZXJfY29uc3VtZXIgPSB0ZW1wOCAmIDB4MDE7Ci0KLQkvKiBEZWNvZGUgKi8KLQotCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmRlY29kZSA9ICh0ZW1wOCA+PiAxKSAmIDB4MDE7Ci0KLQkvKiBNaW4gQWRkcmVzcyBGaXhlZCAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQubWluX2FkZHJlc3NfZml4ZWQgPSAodGVtcDggPj4gMikgJiAweDAxOwotCi0JLyogTWF4IEFkZHJlc3MgRml4ZWQgKi8KLQotCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0Lm1heF9hZGRyZXNzX2ZpeGVkID0gKHRlbXA4ID4+IDMpICYgMHgwMTsKKwlhY3BpX3JzX2RlY29kZV9nZW5lcmFsX2ZsYWdzKCZvdXRwdXRfc3RydWN0LT5kYXRhLCAqYnVmZmVyKTsKIAogCS8qIEdldCB0aGUgVHlwZSBTcGVjaWZpYyBGbGFncyAoQnl0ZTUpICovCiAKIAlidWZmZXIgKz0gMTsKLQl0ZW1wOCA9ICpidWZmZXI7Ci0KLQlpZiAoQUNQSV9NRU1PUllfUkFOR0UgPT0gb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2VfdHlwZSkgewotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlID0KLQkJCQkodTE2KSAodGVtcDggJiAweDAxKTsKLQotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5hdHRyaWJ1dGUubWVtb3J5LmNhY2hlX2F0dHJpYnV0ZSA9Ci0JCQkJKHUxNikgKCh0ZW1wOCA+PiAxKSAmIDB4MDMpOwotCX0KLQllbHNlIHsKLQkJaWYgKEFDUElfSU9fUkFOR0UgPT0gb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2VfdHlwZSkgewotCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuYXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSA9Ci0JCQkJKHUxNikgKHRlbXA4ICYgMHgwMyk7Ci0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5hdHRyaWJ1dGUuaW8udHJhbnNsYXRpb25fYXR0cmlidXRlID0KLQkJCQkodTE2KSAoKHRlbXA4ID4+IDQpICYgMHgwMyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBCVVNfTlVNQkVSX1JBTkdFID09IG91dHB1dF9zdHJ1Y3QtPkRhdGEuQWRkcmVzczY0LnJlc291cmNlX3R5cGUgKi8KLQkJCS8qIE5vdGhpbmcgbmVlZHMgdG8gYmUgZmlsbGVkIGluICovCi0JCX0KLQl9CisJYWNwaV9yc19kZWNvZGVfc3BlY2lmaWNfZmxhZ3MoJm91dHB1dF9zdHJ1Y3QtPmRhdGEsICpidWZmZXIpOwogCiAJaWYgKHJlc291cmNlX3R5cGUgPT0gQUNQSV9SREVTQ19UWVBFX0VYVEVOREVEX0FERFJFU1NfU1BBQ0UpIHsKIAkJLyogTW92ZSBwYXN0IHJldmlzaW9uX2lkIGFuZCBSZXNlcnZlZCBieXRlICovCkBAIC04OTksMzAgKzg5MCwzMyBAQAogCS8qIEdldCBHcmFudWxhcml0eSAoQnl0ZXMgNi0xMykgb3IgKEJ5dGVzIDgtMTUpICovCiAKIAlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfNjRfVE9fNjQgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5ncmFudWxhcml0eSwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfNjRfVE9fNjQoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmdyYW51bGFyaXR5LCBidWZmZXIpOwogCiAJLyogR2V0IG1pbl9hZGRyZXNzX3JhbmdlIChCeXRlcyAxNC0yMSkgb3IgKEJ5dGVzIDE2LTIzKSAqLwogCiAJYnVmZmVyICs9IDg7Ci0JQUNQSV9NT1ZFXzY0X1RPXzY0ICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQubWluX2FkZHJlc3NfcmFuZ2UsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzY0X1RPXzY0KCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5taW5fYWRkcmVzc19yYW5nZSwKKwkJCSAgIGJ1ZmZlcik7CiAKIAkvKiBHZXQgbWF4X2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDIyLTI5KSBvciAoQnl0ZXMgMjQtMzEpICovCiAKIAlidWZmZXIgKz0gODsKLQlBQ1BJX01PVkVfNjRfVE9fNjQgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5tYXhfYWRkcmVzc19yYW5nZSwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfNjRfVE9fNjQoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0Lm1heF9hZGRyZXNzX3JhbmdlLAorCQkJICAgYnVmZmVyKTsKIAogCS8qIEdldCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCAoQnl0ZXMgMzAtMzcpIG9yIChCeXRlcyAzMi0zOSkgKi8KIAogCWJ1ZmZlciArPSA4OwotCUFDUElfTU9WRV82NF9UT182NCAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0LAotCQlidWZmZXIpOworCUFDUElfTU9WRV82NF9UT182NCgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuCisJCQkgICBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCwgYnVmZmVyKTsKIAogCS8qIEdldCBhZGRyZXNzX2xlbmd0aCAoQnl0ZXMgMzgtNDUpIG9yIChCeXRlcyA0MC00NykgKi8KIAogCWJ1ZmZlciArPSA4OwotCUFDUElfTU9WRV82NF9UT182NCAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmFkZHJlc3NfbGVuZ3RoLCBidWZmZXIpOworCUFDUElfTU9WRV82NF9UT182NCgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc19sZW5ndGgsCisJCQkgICBidWZmZXIpOwogCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLmluZGV4ID0gMHgwMDsKKwlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuaW5kZXggPSAwOwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0gMDsKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9IE5VTEw7CiAKQEAgLTkzMCwxMSArOTI0LDkgQEAKIAkJLyogR2V0IHR5cGVfc3BlY2lmaWNfYXR0cmlidXRlIChCeXRlcyA0OC01NSkgKi8KIAogCQlidWZmZXIgKz0gODsKLQkJQUNQSV9NT1ZFXzY0X1RPXzY0ICgKLQkJCSZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC50eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXMsCi0JCQlidWZmZXIpOwotCX0KLQllbHNlIHsKKwkJQUNQSV9NT1ZFXzY0X1RPXzY0KCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC4KKwkJCQkgICB0eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXMsIGJ1ZmZlcik7CisJfSBlbHNlIHsKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQudHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzID0gMDsKIAogCQkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggKGlmIHByZXNlbnQpICovCkBAIC05NTQsOSArOTQ2LDggQEAKIAkJaWYgKCpieXRlc19jb25zdW1lZCA+ICg0NiArIDEpKSB7CiAJCQkvKiBEZXJlZmVyZW5jZSB0aGUgSW5kZXggKi8KIAotCQkJdGVtcDggPSAqYnVmZmVyOwogCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLmluZGV4ID0KLQkJCQkJKHUzMikgdGVtcDg7CisJCQkgICAgKHUzMikgKiBidWZmZXI7CiAKIAkJCS8qIFBvaW50IHRvIHRoZSBTdHJpbmcgKi8KIApAQCAtOTY0LDI5ICs5NTUsMzEgQEAKIAogCQkJLyogUG9pbnQgdGhlIFN0cmluZyBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KIAotCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPQotCQkJCQkoY2hhciAqKSgodTggKilvdXRwdXRfc3RydWN0ICsgc3RydWN0X3NpemUpOworCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLgorCQkJICAgIHN0cmluZ19wdHIgPQorCQkJICAgIChjaGFyICopKCh1OCAqKSBvdXRwdXRfc3RydWN0ICsgc3RydWN0X3NpemUpOwogCiAJCQl0ZW1wX3B0ciA9ICh1OCAqKQotCQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOworCQkJICAgIG91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS4KKwkJCSAgICBzdHJpbmdfcHRyOwogCi0JCQkvKiBDb3B5IHRoZSBzdHJpbmcgaW50byB0aGUgYnVmZmVyICovCisJCQkvKiBDb3B5IHRoZSByZXNvdXJjZV9zb3VyY2Ugc3RyaW5nIGludG8gdGhlIGJ1ZmZlciAqLwogCiAJCQlpbmRleCA9IDA7Ci0JCQl3aGlsZSAoMHgwMCAhPSAqYnVmZmVyKSB7CisJCQl3aGlsZSAoKmJ1ZmZlcikgewogCQkJCSp0ZW1wX3B0ciA9ICpidWZmZXI7CiAKLQkJCQl0ZW1wX3B0ciArPSAxOwotCQkJCWJ1ZmZlciArPSAxOwotCQkJCWluZGV4ICs9IDE7CisJCQkJdGVtcF9wdHIrKzsKKwkJCQlidWZmZXIrKzsKKwkJCQlpbmRleCsrOwogCQkJfQogCiAJCQkvKgotCQkJICogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsCisJCQkgKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwgYW5kIHNldCB0aGUgc3RyaW5nIGxlbmd0aAogCQkJICovCi0JCQkqdGVtcF9wdHIgPSAweDAwOwotCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPQotCQkJCWluZGV4ICsgMTsKKwkJCSp0ZW1wX3B0ciA9IDA7CisJCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuCisJCQkgICAgc3RyaW5nX2xlbmd0aCA9IGluZGV4ICsgMTsKIAogCQkJLyoKIAkJCSAqIEluIG9yZGVyIGZvciB0aGUgc3RydWN0X3NpemUgdG8gZmFsbCBvbiBhIDMyLWJpdCBib3VuZGFyeSwKQEAgLTk5NCw3ICs5ODcsNyBAQAogCQkJICogc3RydWN0X3NpemUgdG8gdGhlIG5leHQgMzItYml0IGJvdW5kYXJ5LgogCQkJICovCiAJCQl0ZW1wOCA9ICh1OCkgKGluZGV4ICsgMSk7Ci0JCQlzdHJ1Y3Rfc2l6ZSArPSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXA4KTsKKwkJCXN0cnVjdF9zaXplICs9IEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyh0ZW1wOCk7CiAJCX0KIAl9CiAKQEAgLTEwMDUsMTAgKzk5OCw5IEBACiAJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KIAogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19hZGRyZXNzNjRfc3RyZWFtCkBAIC0xMDI2LDEzMiArMTAxOCwxMDEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3M2NF9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKQorYWNwaV9yc19hZGRyZXNzNjRfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCSB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX2ZpZWxkOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDg7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9wb2ludGVyOworCXU4ICpidWZmZXI7CisJdTE2ICpsZW5ndGhfZmllbGQ7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19hZGRyZXNzNjRfc3RyZWFtIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19hZGRyZXNzNjRfc3RyZWFtIik7CiAKIAlidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKIAotCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCS8qIFNldCB0aGUgRGVzY3JpcHRvciBUeXBlIGZpZWxkICovCiAKLQkqYnVmZmVyID0gMHg4QTsKKwkqYnVmZmVyID0gQUNQSV9SREVTQ19UWVBFX1FXT1JEX0FERFJFU1NfU1BBQ0U7CiAJYnVmZmVyICs9IDE7CiAKLQkvKiBTZXQgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIgKi8KKwkvKiBTYXZlIGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyICovCiAKLQlsZW5ndGhfZmllbGQgPSBBQ1BJX0NBU1RfUFRSICh1MTYsIGJ1ZmZlcik7CisJbGVuZ3RoX2ZpZWxkID0gQUNQSV9DQVNUX1BUUih1MTYsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDI7CiAKIAkvKiBTZXQgdGhlIFJlc291cmNlIFR5cGUgKE1lbW9yeSwgSW8sIGJ1c19udW1iZXIpICovCiAKLQl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV90eXBlICYgMHgwMyk7Ci0KLQkqYnVmZmVyID0gdGVtcDg7CisJKmJ1ZmZlciA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV90eXBlICYgMHgwMyk7CiAJYnVmZmVyICs9IDE7CiAKIAkvKiBTZXQgdGhlIGdlbmVyYWwgZmxhZ3MgKi8KIAotCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnByb2R1Y2VyX2NvbnN1bWVyICYgMHgwMSk7Ci0JdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5kZWNvZGUgJiAweDAxKSA8PCAxOwotCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQubWluX2FkZHJlc3NfZml4ZWQgJiAweDAxKSA8PCAyOwotCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQubWF4X2FkZHJlc3NfZml4ZWQgJiAweDAxKSA8PCAzOwotCi0JKmJ1ZmZlciA9IHRlbXA4OworCSpidWZmZXIgPSBhY3BpX3JzX2VuY29kZV9nZW5lcmFsX2ZsYWdzKCZsaW5rZWRfbGlzdC0+ZGF0YSk7CiAJYnVmZmVyICs9IDE7CiAKIAkvKiBTZXQgdGhlIHR5cGUgc3BlY2lmaWMgZmxhZ3MgKi8KIAotCXRlbXA4ID0gMDsKLQotCWlmIChBQ1BJX01FTU9SWV9SQU5HRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2VfdHlwZSkgewotCQl0ZW1wOCA9ICh1OCkKLQkJCShsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQuYXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSAmCi0JCQkweDAxKTsKLQotCQl0ZW1wOCB8PQotCQkJKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5hdHRyaWJ1dGUubWVtb3J5LmNhY2hlX2F0dHJpYnV0ZSAmCi0JCQkgMHgwMykgPDwgMTsKLQl9Ci0JZWxzZSBpZiAoQUNQSV9JT19SQU5HRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2VfdHlwZSkgewotCQl0ZW1wOCA9ICh1OCkKLQkJCShsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQuYXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSAmCi0JCQkgMHgwMyk7Ci0JCXRlbXA4IHw9Ci0JCQkobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LmF0dHJpYnV0ZS5pby5yYW5nZV9hdHRyaWJ1dGUgJgotCQkJIDB4MDMpIDw8IDQ7Ci0JfQotCi0JKmJ1ZmZlciA9IHRlbXA4OworCSpidWZmZXIgPSBhY3BpX3JzX2VuY29kZV9zcGVjaWZpY19mbGFncygmbGlua2VkX2xpc3QtPmRhdGEpOwogCWJ1ZmZlciArPSAxOwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIHNwYWNlIGdyYW51bGFyaXR5ICovCiAKLQlBQ1BJX01PVkVfNjRfVE9fNjQgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5ncmFudWxhcml0eSk7CisJQUNQSV9NT1ZFXzY0X1RPXzY0KGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5ncmFudWxhcml0eSk7CiAJYnVmZmVyICs9IDg7CiAKIAkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWluaW11bSAqLwogCi0JQUNQSV9NT1ZFXzY0X1RPXzY0IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQubWluX2FkZHJlc3NfcmFuZ2UpOworCUFDUElfTU9WRV82NF9UT182NChidWZmZXIsCisJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0Lm1pbl9hZGRyZXNzX3JhbmdlKTsKIAlidWZmZXIgKz0gODsKIAogCS8qIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtYXhpbXVtICovCiAKLQlBQ1BJX01PVkVfNjRfVE9fNjQgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5tYXhfYWRkcmVzc19yYW5nZSk7CisJQUNQSV9NT1ZFXzY0X1RPXzY0KGJ1ZmZlciwKKwkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQubWF4X2FkZHJlc3NfcmFuZ2UpOwogCWJ1ZmZlciArPSA4OwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldCAqLwogCi0JQUNQSV9NT1ZFXzY0X1RPXzY0IChidWZmZXIsCi0JCSZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOworCUFDUElfTU9WRV82NF9UT182NChidWZmZXIsCisJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LgorCQkJICAgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwogCWJ1ZmZlciArPSA4OwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aCAqLwogCi0JQUNQSV9NT1ZFXzY0X1RPXzY0IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc19sZW5ndGgpOworCUFDUElfTU9WRV82NF9UT182NChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc19sZW5ndGgpOwogCWJ1ZmZlciArPSA4OwogCiAJLyogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsICovCiAKLQlpZiAoMCAhPSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKLQkJdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7Ci0KLQkJKmJ1ZmZlciA9IHRlbXA4OworCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKKwkJKmJ1ZmZlciA9CisJCSAgICAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7CiAJCWJ1ZmZlciArPSAxOwogCi0JCXRlbXBfcG9pbnRlciA9IChjaGFyICopIGJ1ZmZlcjsKKwkJLyogQ29weSB0aGUgcmVzb3VyY2Vfc291cmNlIHN0cmluZyAqLwogCi0JCS8qIENvcHkgdGhlIHN0cmluZyAqLwotCi0JCUFDUElfU1RSQ1BZICh0ZW1wX3BvaW50ZXIsCi0JCQlsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOworCQlBQ1BJX1NUUkNQWSgoY2hhciAqKWJ1ZmZlciwKKwkJCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLgorCQkJICAgIHN0cmluZ19wdHIpOwogCiAJCS8qCi0JCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RpbmcgKyBvbmUgZm9yIHRoZQorCQkgKiBCdWZmZXIgbmVlZHMgdG8gYmUgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyArIG9uZSBmb3IgdGhlCiAJCSAqIHRlcm1pbmF0aW5nIG51bGwKIAkJICovCi0JCWJ1ZmZlciArPSAoYWNwaV9zaXplKShBQ1BJX1NUUkxFTiAoCi0JCQkJIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgKyAxKTsKKwkJYnVmZmVyICs9CisJCSAgICAoYWNwaV9zaXplKSAoQUNQSV9TVFJMRU4KKwkJCQkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuCisJCQkJICBzdHJpbmdfcHRyKSArIDEpOwogCX0KIAogCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCiAKLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKKwkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCiAJLyoKIAkgKiBTZXQgdGhlIGxlbmd0aCBmaWVsZCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCiAJICogbWludXMgdGhlIGhlYWRlciBzaXplICgzIGJ5dGVzKQogCSAqLwogCSpsZW5ndGhfZmllbGQgPSAodTE2KSAoKmJ5dGVzX2NvbnN1bWVkIC0gMyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NhbGMuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjYWxjLmMKaW5kZXggOTgxNzZmMi4uMzc4ZjU4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NhbGMuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY2FsYy5jCkBAIC00MSwxNSArNDEsMTMgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicnNjYWxjIikKLQorQUNQSV9NT0RVTEVfTkFNRSgicnNjYWxjIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02NiwxOSArNjQsMTUgQEAKICAqICAgICAgICAgICAgICB0aGUgcmVzb3VyY2UgZGF0YS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfYnl0ZV9zdHJlYW1fbGVuZ3RoICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzaXplX25lZWRlZCkKK2FjcGlfcnNfZ2V0X2J5dGVfc3RyZWFtX2xlbmd0aChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQkgICAgICAgYWNwaV9zaXplICogc2l6ZV9uZWVkZWQpCiB7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBieXRlX3N0cmVhbV9zaXplX25lZWRlZCA9IDA7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50X3NpemU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gRkFMU0U7CisJYWNwaV9zaXplIGJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkID0gMDsKKwlhY3BpX3NpemUgc2VnbWVudF9zaXplOworCXU4IGRvbmUgPSBGQUxTRTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2dldF9ieXRlX3N0cmVhbV9sZW5ndGgiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2dldF9ieXRlX3N0cmVhbV9sZW5ndGgiKTsKIAogCXdoaWxlICghZG9uZSkgewogCQkvKiBJbml0IHRoZSB2YXJpYWJsZSB0aGF0IHdpbGwgaG9sZCB0aGUgc2l6ZSB0byBhZGQgdG8gdGhlIHRvdGFsLiAqLwpAQCAtMTQ1LDExICsxMzksMTEgQEAKIAkJCSAqLwogCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5sZW5ndGggPiA3KSB7CiAJCQkJc2VnbWVudF9zaXplID0gMzsKLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQlzZWdtZW50X3NpemUgPSAxOwogCQkJfQotCQkJc2VnbWVudF9zaXplICs9IGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5sZW5ndGg7CisJCQlzZWdtZW50X3NpemUgKz0KKwkJCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS52ZW5kb3Jfc3BlY2lmaWMubGVuZ3RoOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JTVFlQRV9FTkRfVEFHOgpAQCAtMTk0LDkgKzE4OCwxMSBAQAogCQkJICovCiAJCQlzZWdtZW50X3NpemUgPSAxNjsKIAotCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgeworCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UuCisJCQkgICAgc3RyaW5nX3B0cikgewogCQkJCXNlZ21lbnRfc2l6ZSArPQotCQkJCQlsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGg7CisJCQkJICAgIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UuCisJCQkJICAgIHN0cmluZ19sZW5ndGg7CiAJCQkJc2VnbWVudF9zaXplKys7CiAJCQl9CiAJCQlicmVhazsKQEAgLTIxMSw5ICsyMDcsMTEgQEAKIAkJCSAqLwogCQkJc2VnbWVudF9zaXplID0gMjY7CiAKLQkJCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpIHsKKwkJCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLgorCQkJICAgIHN0cmluZ19wdHIpIHsKIAkJCQlzZWdtZW50X3NpemUgKz0KLQkJCQkJbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoOworCQkJCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLgorCQkJCSAgICBzdHJpbmdfbGVuZ3RoOwogCQkJCXNlZ21lbnRfc2l6ZSsrOwogCQkJfQogCQkJYnJlYWs7CkBAIC0yMjcsOSArMjI1LDExIEBACiAJCQkgKi8KIAkJCXNlZ21lbnRfc2l6ZSA9IDQ2OwogCi0JCQlpZiAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSB7CisJCQlpZiAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS4KKwkJCSAgICBzdHJpbmdfcHRyKSB7CiAJCQkJc2VnbWVudF9zaXplICs9Ci0JCQkJCWxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKKwkJCQkgICAgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS4KKwkJCQkgICAgc3RyaW5nX2xlbmd0aDsKIAkJCQlzZWdtZW50X3NpemUrKzsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjQ0LDExICsyNDQsMTQgQEAKIAkJCSAqIFJlc291cmNlIFNvdXJjZSArIDEgZm9yIHRoZSBudWxsLgogCQkJICovCiAJCQlzZWdtZW50X3NpemUgPSA5ICsgKCgoYWNwaV9zaXplKQotCQkJCWxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0cyAtIDEpICogNCk7CisJCQkJCSAgICAgbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLgorCQkJCQkgICAgIG51bWJlcl9vZl9pbnRlcnJ1cHRzIC0gMSkgKiA0KTsKIAotCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgeworCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2UuCisJCQkgICAgc3RyaW5nX3B0cikgewogCQkJCXNlZ21lbnRfc2l6ZSArPQotCQkJCQlsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGg7CisJCQkJICAgIGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS4KKwkJCQkgICAgcmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGg7CiAJCQkJc2VnbWVudF9zaXplKys7CiAJCQl9CiAJCQlicmVhazsKQEAgLTI1Nyw5ICsyNjAsOSBAQAogCiAJCQkvKiBJZiB3ZSBnZXQgaGVyZSwgZXZlcnl0aGluZyBpcyBvdXQgb2Ygc3luYywgZXhpdCB3aXRoIGVycm9yICovCiAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CiAKLQkJfSAvKiBzd2l0Y2ggKGxpbmtlZF9saXN0LT5JZCkgKi8KKwkJfQkJLyogc3dpdGNoIChsaW5rZWRfbGlzdC0+SWQpICovCiAKIAkJLyogVXBkYXRlIHRoZSB0b3RhbCAqLwogCkBAIC0yNjcsMTcgKzI3MCwxNiBAQAogCiAJCS8qIFBvaW50IHRvIHRoZSBuZXh0IG9iamVjdCAqLwogCi0JCWxpbmtlZF9saXN0ID0gQUNQSV9QVFJfQUREIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwKLQkJCQkgIGxpbmtlZF9saXN0LCBsaW5rZWRfbGlzdC0+bGVuZ3RoKTsKKwkJbGlua2VkX2xpc3QgPSBBQ1BJX1BUUl9BREQoc3RydWN0IGFjcGlfcmVzb3VyY2UsCisJCQkJCSAgIGxpbmtlZF9saXN0LCBsaW5rZWRfbGlzdC0+bGVuZ3RoKTsKIAl9CiAKIAkvKiBUaGlzIGlzIHRoZSBkYXRhIHRoZSBjYWxsZXIgbmVlZHMgKi8KIAogCSpzaXplX25lZWRlZCA9IGJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19nZXRfbGlzdF9sZW5ndGgKQEAgLTI5NywzMiArMjk5LDI4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfbGlzdF9sZW5ndGggKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZV9uZWVkZWQpCithY3BpX3JzX2dldF9saXN0X2xlbmd0aCh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCXUzMiBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoLCBhY3BpX3NpemUgKiBzaXplX25lZWRlZCkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplID0gMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3BhcnNlZCA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfaW50ZXJydXB0cyA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfY2hhbm5lbHMgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfdHlwZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZV9zaXplOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQ7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDg7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTY7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfYnl0ZXM7CisJdTMyIGJ1ZmZlcl9zaXplID0gMDsKKwl1MzIgYnl0ZXNfcGFyc2VkID0gMDsKKwl1OCBudW1iZXJfb2ZfaW50ZXJydXB0cyA9IDA7CisJdTggbnVtYmVyX29mX2NoYW5uZWxzID0gMDsKKwl1OCByZXNvdXJjZV90eXBlOworCXUzMiBzdHJ1Y3R1cmVfc2l6ZTsKKwl1MzIgYnl0ZXNfY29uc3VtZWQ7CisJdTggKmJ1ZmZlcjsKKwl1OCB0ZW1wODsKKwl1MTYgdGVtcDE2OworCXU4IGluZGV4OworCXU4IGFkZGl0aW9uYWxfYnl0ZXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19nZXRfbGlzdF9sZW5ndGgiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2dldF9saXN0X2xlbmd0aCIpOwogCiAJd2hpbGUgKGJ5dGVzX3BhcnNlZCA8IGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgpIHsKIAkJLyogVGhlIG5leHQgYnl0ZSBpbiB0aGUgc3RyZWFtIGlzIHRoZSByZXNvdXJjZSB0eXBlICovCiAKLQkJcmVzb3VyY2VfdHlwZSA9IGFjcGlfcnNfZ2V0X3Jlc291cmNlX3R5cGUgKCpieXRlX3N0cmVhbV9idWZmZXIpOworCQlyZXNvdXJjZV90eXBlID0gYWNwaV9yc19nZXRfcmVzb3VyY2VfdHlwZSgqYnl0ZV9zdHJlYW1fYnVmZmVyKTsKIAogCQlzd2l0Y2ggKHJlc291cmNlX3R5cGUpIHsKIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfTUVNT1JZXzI0OgpAQCAtMzMxLDEwICszMjksMTAgQEAKIAkJCSAqLwogCQkJYnl0ZXNfY29uc3VtZWQgPSAxMjsKIAotCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQpOworCQkJc3RydWN0dXJlX3NpemUgPQorCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTI0KTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfTEFSR0VfVkVORE9SOgogCQkJLyoKIAkJCSAqIFZlbmRvciBEZWZpbmVkIFJlc291cmNlCkBAIC0zNDIsMzggKzM0MCwzOSBAQAogCQkJYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwogCQkJKytidWZmZXI7CiAKLQkJCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwkJCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCQkJYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwogCiAJCQkvKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KIAotCQkJdGVtcDE2ID0gKHUxNikgQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wMTYpOworCQkJdGVtcDE2ID0gKHUxNikgQUNQSV9ST1VORF9VUF90b18zMl9iSVRTKHRlbXAxNik7CiAKLQkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcikgKwotCQkJCQkgICAodGVtcDE2ICogc2l6ZW9mICh1OCkpOworCQkJc3RydWN0dXJlX3NpemUgPQorCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcikgKworCQkJICAgICh0ZW1wMTYgKiBzaXplb2YodTgpKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfTUVNT1JZXzMyOgogCQkJLyoKIAkJCSAqIDMyLUJpdCBNZW1vcnkgUmFuZ2UgUmVzb3VyY2UKIAkJCSAqLwogCQkJYnl0ZXNfY29uc3VtZWQgPSAyMDsKIAotCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIpOworCQkJc3RydWN0dXJlX3NpemUgPQorCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTMyKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRklYRURfTUVNT1JZXzMyOgogCQkJLyoKIAkJCSAqIDMyLUJpdCBGaXhlZCBNZW1vcnkgUmVzb3VyY2UKIAkJCSAqLwogCQkJYnl0ZXNfY29uc3VtZWQgPSAxMjsKIAotCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIpOworCQkJc3RydWN0dXJlX3NpemUgPQorCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdAorCQkJCQkJIGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9FWFRFTkRFRF9BRERSRVNTX1NQQUNFOgogCQkJLyoKIAkJCSAqIDY0LUJpdCBBZGRyZXNzIFJlc291cmNlCkBAIC0zODEsMTMgKzM4MCwxNCBAQAogCQkJYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwogCiAJCQkrK2J1ZmZlcjsKLQkJCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwkJCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCiAJCQlieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7Ci0JCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQpOworCQkJc3RydWN0dXJlX3NpemUgPQorCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdAorCQkJCQkJIGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfUVdPUkRfQUREUkVTU19TUEFDRToKIAkJCS8qCiAJCQkgKiA2NC1CaXQgQWRkcmVzcyBSZXNvdXJjZQpAQCAtMzk1LDcgKzM5NSw3IEBACiAJCQlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CiAKIAkJCSsrYnVmZmVyOwotCQkJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAkJCWJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKIApAQCAtNDA5LDIwICs0MDksMTkgQEAKIAkJCSAqLwogCQkJaWYgKDQzIDwgdGVtcDE2KSB7CiAJCQkJdGVtcDggPSAodTgpICh0ZW1wMTYgLSA0NCk7Ci0JCQl9Ci0JCQllbHNlIHsKKwkJCX0gZWxzZSB7CiAJCQkJdGVtcDggPSAwOwogCQkJfQogCiAJCQkvKiBFbnN1cmUgYSA2NC1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KIAotCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fNjRfYklUUyAodGVtcDgpOworCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fNjRfYklUUyh0ZW1wOCk7CiAKLQkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCkgKwotCQkJCQkgICAodGVtcDggKiBzaXplb2YgKHU4KSk7CisJCQlzdHJ1Y3R1cmVfc2l6ZSA9CisJCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KQorCQkJICAgICsgKHRlbXA4ICogc2l6ZW9mKHU4KSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0RXT1JEX0FERFJFU1NfU1BBQ0U6CiAJCQkvKgogCQkJICogMzItQml0IEFkZHJlc3MgUmVzb3VyY2UKQEAgLTQzMCw3ICs0MjksNyBAQAogCQkJYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwogCiAJCQkrK2J1ZmZlcjsKLQkJCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwkJCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCiAJCQlieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7CiAKQEAgLTQ0NCwyMCArNDQzLDE5IEBACiAJCQkgKi8KIAkJCWlmICgyMyA8IHRlbXAxNikgewogCQkJCXRlbXA4ID0gKHU4KSAodGVtcDE2IC0gMjQpOwotCQkJfQotCQkJZWxzZSB7CisJCQl9IGVsc2UgewogCQkJCXRlbXA4ID0gMDsKIAkJCX0KIAogCQkJLyogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlICovCiAKLQkJCXRlbXA4ID0gKHU4KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXA4KTsKKwkJCXRlbXA4ID0gKHU4KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFModGVtcDgpOwogCi0JCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIpICsKLQkJCQkJICAgKHRlbXA4ICogc2l6ZW9mICh1OCkpOworCQkJc3RydWN0dXJlX3NpemUgPQorCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMikKKwkJCSAgICArICh0ZW1wOCAqIHNpemVvZih1OCkpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9XT1JEX0FERFJFU1NfU1BBQ0U6CiAJCQkvKgogCQkJICogMTYtQml0IEFkZHJlc3MgUmVzb3VyY2UKQEAgLTQ2NSw3ICs0NjMsNyBAQAogCQkJYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwogCiAJCQkrK2J1ZmZlcjsKLQkJCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwkJCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCiAJCQlieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7CiAKQEAgLTQ3OSwyMCArNDc3LDE5IEBACiAJCQkgKi8KIAkJCWlmICgxMyA8IHRlbXAxNikgewogCQkJCXRlbXA4ID0gKHU4KSAodGVtcDE2IC0gMTQpOwotCQkJfQotCQkJZWxzZSB7CisJCQl9IGVsc2UgewogCQkJCXRlbXA4ID0gMDsKIAkJCX0KIAogCQkJLyogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlICovCiAKLQkJCXRlbXA4ID0gKHU4KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXA4KTsKKwkJCXRlbXA4ID0gKHU4KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFModGVtcDgpOwogCi0JCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYpICsKLQkJCQkJICAgKHRlbXA4ICogc2l6ZW9mICh1OCkpOworCQkJc3RydWN0dXJlX3NpemUgPQorCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNikKKwkJCSAgICArICh0ZW1wOCAqIHNpemVvZih1OCkpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9FWFRFTkRFRF9YUlVQVDoKIAkJCS8qCiAJCQkgKiBFeHRlbmRlZCBJUlEKQEAgLTUwMCw3ICs0OTcsNyBAQAogCQkJYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwogCiAJCQkrK2J1ZmZlcjsKLQkJCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwkJCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCiAJCQlieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7CiAKQEAgLTUyNywyMSArNTI0LDIwIEBACiAJCQkgKi8KIAkJCWlmICg5ICsgYWRkaXRpb25hbF9ieXRlcyA8IHRlbXAxNikgewogCQkJCXRlbXA4ID0gKHU4KSAodGVtcDE2IC0gKDkgKyBhZGRpdGlvbmFsX2J5dGVzKSk7Ci0JCQl9Ci0JCQllbHNlIHsKKwkJCX0gZWxzZSB7CiAJCQkJdGVtcDggPSAwOwogCQkJfQogCiAJCQkvKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KIAotCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyAodGVtcDgpOworCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyh0ZW1wOCk7CiAKLQkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEpICsKLQkJCQkJICAgKGFkZGl0aW9uYWxfYnl0ZXMgKiBzaXplb2YgKHU4KSkgKwotCQkJCQkgICAodGVtcDggKiBzaXplb2YgKHU4KSk7CisJCQlzdHJ1Y3R1cmVfc2l6ZSA9CisJCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSkgKworCQkJICAgIChhZGRpdGlvbmFsX2J5dGVzICogc2l6ZW9mKHU4KSkgKworCQkJICAgICh0ZW1wOCAqIHNpemVvZih1OCkpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9JUlFfRk9STUFUOgogCQkJLyoKIAkJCSAqIElSUSBSZXNvdXJjZS4KQEAgLTU1MCwxMCArNTQ2LDkgQEAKIAkJCWJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKIAkJCXRlbXA4ID0gKmJ1ZmZlcjsKIAotCQkJaWYodGVtcDggJiAweDAxKSB7CisJCQlpZiAodGVtcDggJiAweDAxKSB7CiAJCQkJYnl0ZXNfY29uc3VtZWQgPSA0OwotCQkJfQotCQkJZWxzZSB7CisJCQl9IGVsc2UgewogCQkJCWJ5dGVzX2NvbnN1bWVkID0gMzsKIAkJCX0KIApAQCAtNTYzLDcgKzU1OCw3IEBACiAKIAkJCS8qIExvb2sgYXQgdGhlIG51bWJlciBvZiBiaXRzIHNldCAqLwogCi0JCQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJCQlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAogCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMTY7IGluZGV4KyspIHsKIAkJCQlpZiAodGVtcDE2ICYgMHgxKSB7CkBAIC01NzMsMTEgKzU2OCwxMSBAQAogCQkJCXRlbXAxNiA+Pj0gMTsKIAkJCX0KIAotCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pICsKLQkJCQkJICAgKG51bWJlcl9vZl9pbnRlcnJ1cHRzICogc2l6ZW9mICh1MzIpKTsKKwkJCXN0cnVjdHVyZV9zaXplID0KKwkJCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbykgKworCQkJICAgIChudW1iZXJfb2ZfaW50ZXJydXB0cyAqIHNpemVvZih1MzIpKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRE1BX0ZPUk1BVDoKIAkJCS8qCiAJCQkgKiBETUEgUmVzb3VyY2UKQEAgLTU5MywxOSArNTg4LDE5IEBACiAKIAkJCXRlbXA4ID0gKmJ1ZmZlcjsKIAotCQkJZm9yKGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSB7Ci0JCQkJaWYodGVtcDggJiAweDEpIHsKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspIHsKKwkJCQlpZiAodGVtcDggJiAweDEpIHsKIAkJCQkJKytudW1iZXJfb2ZfY2hhbm5lbHM7CiAJCQkJfQogCiAJCQkJdGVtcDggPj49IDE7CiAJCQl9CiAKLQkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSkgKwotCQkJCQkgICAobnVtYmVyX29mX2NoYW5uZWxzICogc2l6ZW9mICh1MzIpKTsKKwkJCXN0cnVjdHVyZV9zaXplID0KKwkJCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEpICsKKwkJCSAgICAobnVtYmVyX29mX2NoYW5uZWxzICogc2l6ZW9mKHUzMikpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9TVEFSVF9ERVBFTkRFTlQ6CiAJCQkvKgogCQkJICogU3RhcnQgRGVwZW5kZW50IEZ1bmN0aW9ucyBSZXNvdXJjZQpAQCAtNjE0LDE3ICs2MDksMTcgQEAKIAkJCWJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKIAkJCXRlbXA4ID0gKmJ1ZmZlcjsKIAotCQkJaWYodGVtcDggJiAweDAxKSB7CisJCQlpZiAodGVtcDggJiAweDAxKSB7CiAJCQkJYnl0ZXNfY29uc3VtZWQgPSAyOwotCQkJfQotCQkJZWxzZSB7CisJCQl9IGVsc2UgewogCQkJCWJ5dGVzX2NvbnN1bWVkID0gMTsKIAkJCX0KIAotCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmKTsKKwkJCXN0cnVjdHVyZV9zaXplID0KKwkJCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QKKwkJCQkJCSBhY3BpX3Jlc291cmNlX3N0YXJ0X2RwZik7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0VORF9ERVBFTkRFTlQ6CiAJCQkvKgogCQkJICogRW5kIERlcGVuZGVudCBGdW5jdGlvbnMgUmVzb3VyY2UKQEAgLTYzMywyNSArNjI4LDI0IEBACiAJCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfUkVTT1VSQ0VfTEVOR1RIOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9JT19QT1JUOgogCQkJLyoKIAkJCSAqIElPIFBvcnQgUmVzb3VyY2UKIAkJCSAqLwogCQkJYnl0ZXNfY29uc3VtZWQgPSA4OwotCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pOworCQkJc3RydWN0dXJlX3NpemUgPQorCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRklYRURfSU9fUE9SVDoKIAkJCS8qCiAJCQkgKiBGaXhlZCBJTyBQb3J0IFJlc291cmNlCiAJCQkgKi8KIAkJCWJ5dGVzX2NvbnN1bWVkID0gNDsKLQkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvKTsKKwkJCXN0cnVjdHVyZV9zaXplID0KKwkJCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX1NNQUxMX1ZFTkRPUjoKIAkJCS8qCiAJCQkgKiBWZW5kb3IgU3BlY2lmaWMgUmVzb3VyY2UKQEAgLTY2NCwxMiArNjU4LDEyIEBACiAKIAkJCS8qIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZSAqLwogCi0JCQl0ZW1wOCA9ICh1OCkgQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wOCk7Ci0JCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpICsKLQkJCQkJICAgKHRlbXA4ICogc2l6ZW9mICh1OCkpOworCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyh0ZW1wOCk7CisJCQlzdHJ1Y3R1cmVfc2l6ZSA9CisJCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yKSArCisJCQkgICAgKHRlbXA4ICogc2l6ZW9mKHU4KSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0VORF9UQUc6CiAJCQkvKgogCQkJICogRW5kIFRhZwpAQCAtNjc5LDE4ICs2NzMsMTcgQEAKIAkJCWJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGggPSBieXRlc19wYXJzZWQ7CiAJCQlicmVhazsKIAotCiAJCWRlZmF1bHQ6CiAJCQkvKgogCQkJICogSWYgd2UgZ2V0IGhlcmUsIGV2ZXJ5dGhpbmcgaXMgb3V0IG9mIHN5bmMsCiAJCQkgKiBleGl0IHdpdGggYW4gZXJyb3IKIAkJCSAqLwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKIAkJfQogCiAJCS8qIFVwZGF0ZSB0aGUgcmV0dXJuIHZhbHVlIGFuZCBjb3VudGVyICovCiAKLQkJYnVmZmVyX3NpemUgKz0gKHUzMikgQUNQSV9BTElHTl9SRVNPVVJDRV9TSVpFIChzdHJ1Y3R1cmVfc2l6ZSk7CisJCWJ1ZmZlcl9zaXplICs9ICh1MzIpIEFDUElfQUxJR05fUkVTT1VSQ0VfU0laRShzdHJ1Y3R1cmVfc2l6ZSk7CiAJCWJ5dGVzX3BhcnNlZCArPSBieXRlc19jb25zdW1lZDsKIAogCQkvKiBTZXQgdGhlIGJ5dGUgc3RyZWFtIHRvIHBvaW50IHRvIHRoZSBuZXh0IHJlc291cmNlICovCkBAIC03MDEsMTAgKzY5NCw5IEBACiAJLyogVGhpcyBpcyB0aGUgZGF0YSB0aGUgY2FsbGVyIG5lZWRzICovCiAKIAkqc2l6ZV9uZWVkZWQgPSBidWZmZXJfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X3BjaV9yb3V0aW5nX3RhYmxlX2xlbmd0aApAQCAtNzIzLDIyICs3MTUsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9wY2lfcm91dGluZ190YWJsZV9sZW5ndGggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnBhY2thZ2Vfb2JqZWN0LAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcl9zaXplX25lZWRlZCkKK2FjcGlfcnNfZ2V0X3BjaV9yb3V0aW5nX3RhYmxlX2xlbmd0aCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX29iamVjdCwKKwkJCQkgICAgIGFjcGlfc2l6ZSAqIGJ1ZmZlcl9zaXplX25lZWRlZCkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9lbGVtZW50czsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfc2l6ZV9uZWVkZWQgPSAwOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKip0b3Bfb2JqZWN0X2xpc3Q7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpwYWNrYWdlX2VsZW1lbnQ7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnN1Yl9vYmplY3RfbGlzdDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfZm91bmQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9pbmRleDsKKwl1MzIgbnVtYmVyX29mX2VsZW1lbnRzOworCWFjcGlfc2l6ZSB0ZW1wX3NpemVfbmVlZGVkID0gMDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqdG9wX29iamVjdF9saXN0OworCXUzMiBpbmRleDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX2VsZW1lbnQ7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnN1Yl9vYmplY3RfbGlzdDsKKwl1OCBuYW1lX2ZvdW5kOworCXUzMiB0YWJsZV9pbmRleDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2dldF9wY2lfcm91dGluZ190YWJsZV9sZW5ndGgiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2dldF9wY2lfcm91dGluZ190YWJsZV9sZW5ndGgiKTsKIAogCW51bWJlcl9vZl9lbGVtZW50cyA9IHBhY2thZ2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50OwogCkBAIC03NjksNTMgKzc1OCw1MSBAQAogCiAJCW5hbWVfZm91bmQgPSBGQUxTRTsKIAotCQlmb3IgKHRhYmxlX2luZGV4ID0gMDsgdGFibGVfaW5kZXggPCA0ICYmICFuYW1lX2ZvdW5kOyB0YWJsZV9pbmRleCsrKSB7CisJCWZvciAodGFibGVfaW5kZXggPSAwOyB0YWJsZV9pbmRleCA8IDQgJiYgIW5hbWVfZm91bmQ7CisJCSAgICAgdGFibGVfaW5kZXgrKykgewogCQkJaWYgKChBQ1BJX1RZUEVfU1RSSU5HID09Ci0JCQkJCUFDUElfR0VUX09CSkVDVF9UWVBFICgqc3ViX29iamVjdF9saXN0KSkgfHwKLQotCQkJCSgoQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSA9PQotCQkJCQlBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoKnN1Yl9vYmplY3RfbGlzdCkpICYmCi0KLQkJCQkJKCgqc3ViX29iamVjdF9saXN0KS0+cmVmZXJlbmNlLm9wY29kZSA9PQotCQkJCQkJQU1MX0lOVF9OQU1FUEFUSF9PUCkpKSB7CisJCQkgICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKCpzdWJfb2JqZWN0X2xpc3QpKQorCQkJICAgIHx8CisJCQkgICAgKChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFID09CisJCQkgICAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSgqc3ViX29iamVjdF9saXN0KSkKKwkJCSAgICAgJiYgKCgqc3ViX29iamVjdF9saXN0KS0+cmVmZXJlbmNlLm9wY29kZSA9PQorCQkJCSBBTUxfSU5UX05BTUVQQVRIX09QKSkpIHsKIAkJCQluYW1lX2ZvdW5kID0gVFJVRTsKLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQkvKiBMb29rIGF0IHRoZSBuZXh0IGVsZW1lbnQgKi8KIAogCQkJCXN1Yl9vYmplY3RfbGlzdCsrOwogCQkJfQogCQl9CiAKLQkJdGVtcF9zaXplX25lZWRlZCArPSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSkgLSA0KTsKKwkJdGVtcF9zaXplX25lZWRlZCArPSAoc2l6ZW9mKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlKSAtIDQpOwogCiAJCS8qIFdhcyBhIFN0cmluZyB0eXBlIGZvdW5kPyAqLwogCiAJCWlmIChuYW1lX2ZvdW5kKSB7Ci0JCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKCpzdWJfb2JqZWN0X2xpc3QpID09IEFDUElfVFlQRV9TVFJJTkcpIHsKKwkJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSgqc3ViX29iamVjdF9saXN0KSA9PQorCQkJICAgIEFDUElfVFlQRV9TVFJJTkcpIHsKIAkJCQkvKgogCQkJCSAqIFRoZSBsZW5ndGggU3RyaW5nLkxlbmd0aCBmaWVsZCBkb2VzIG5vdCBpbmNsdWRlIHRoZQogCQkJCSAqIHRlcm1pbmF0aW5nIE5VTEwsIGFkZCAxCiAJCQkJICovCiAJCQkJdGVtcF9zaXplX25lZWRlZCArPSAoKGFjcGlfc2l6ZSkKLQkJCQkJKCpzdWJfb2JqZWN0X2xpc3QpLT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCQkJCQkgICAgICgqc3ViX29iamVjdF9saXN0KS0+c3RyaW5nLgorCQkJCQkJICAgICBsZW5ndGggKyAxKTsKKwkJCX0gZWxzZSB7CisJCQkJdGVtcF9zaXplX25lZWRlZCArPSBhY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGgoKCpzdWJfb2JqZWN0X2xpc3QpLT5yZWZlcmVuY2Uubm9kZSk7CiAJCQl9Ci0JCQllbHNlIHsKLQkJCQl0ZW1wX3NpemVfbmVlZGVkICs9IGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aCAoCi0JCQkJCQkgICAoKnN1Yl9vYmplY3RfbGlzdCktPnJlZmVyZW5jZS5ub2RlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBJZiBubyBuYW1lIHdhcyBmb3VuZCwgdGhlbiB0aGlzIGlzIGEgTlVMTCwgd2hpY2ggaXMKIAkJCSAqIHRyYW5zbGF0ZWQgYXMgYSB1MzIgemVyby4KIAkJCSAqLwotCQkJdGVtcF9zaXplX25lZWRlZCArPSBzaXplb2YgKHUzMik7CisJCQl0ZW1wX3NpemVfbmVlZGVkICs9IHNpemVvZih1MzIpOwogCQl9CiAKIAkJLyogUm91bmQgdXAgdGhlIHNpemUgc2luY2UgZWFjaCBlbGVtZW50IG11c3QgYmUgYWxpZ25lZCAqLwogCi0JCXRlbXBfc2l6ZV9uZWVkZWQgPSBBQ1BJX1JPVU5EX1VQX3RvXzY0X2JJVFMgKHRlbXBfc2l6ZV9uZWVkZWQpOworCQl0ZW1wX3NpemVfbmVlZGVkID0gQUNQSV9ST1VORF9VUF90b182NF9iSVRTKHRlbXBfc2l6ZV9uZWVkZWQpOwogCiAJCS8qIFBvaW50IHRvIHRoZSBuZXh0IHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKi8KIApAQCAtODI2LDYgKzgxMyw3IEBACiAJICogQWRkaW5nIGFuIGV4dHJhIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgZXNzZW50aWFsbHkgYQogCSAqIE5VTEwgdGVybWluYXRvcgogCSAqLwotCSpidWZmZXJfc2l6ZV9uZWVkZWQgPSB0ZW1wX3NpemVfbmVlZGVkICsgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJKmJ1ZmZlcl9zaXplX25lZWRlZCA9CisJICAgIHRlbXBfc2l6ZV9uZWVkZWQgKyBzaXplb2Yoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMKaW5kZXggOGUwZWFlMC4uMDkxMTUyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NyZWF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYwpAQCAtNDEsMTUgKzQxLDEzIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3Jlc3JjLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInJzY3JlYXRlIikKLQorQUNQSV9NT0RVTEVfTkFNRSgicnNjcmVhdGUiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY4LDI0ICs2NiwyMCBAQAogICogICAgICAgICAgICAgIG9mIGRldmljZSByZXNvdXJjZXMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpvdXRwdXRfYnVmZmVyKQorYWNwaV9yc19jcmVhdGVfcmVzb3VyY2VfbGlzdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpieXRlX3N0cmVhbV9idWZmZXIsCisJCQkgICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0X2J1ZmZlcikKIHsKIAotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX3N0YXJ0OwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9zaXplX25lZWRlZCA9IDA7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1OCAqYnl0ZV9zdHJlYW1fc3RhcnQ7CisJYWNwaV9zaXplIGxpc3Rfc2l6ZV9uZWVkZWQgPSAwOworCXUzMiBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfY3JlYXRlX3Jlc291cmNlX2xpc3QiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19jcmVhdGVfcmVzb3VyY2VfbGlzdCIpOwotCi0KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiYnl0ZV9zdHJlYW1fYnVmZmVyID0gJXBcbiIsCi0JCWJ5dGVfc3RyZWFtX2J1ZmZlcikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgImJ5dGVfc3RyZWFtX2J1ZmZlciA9ICVwXG4iLAorCQkJICBieXRlX3N0cmVhbV9idWZmZXIpKTsKIAogCS8qIFBhcmFtcyBhbHJlYWR5IHZhbGlkYXRlZCwgc28gd2UgZG9uJ3QgcmUtdmFsaWRhdGUgaGVyZSAqLwogCkBAIC05NiwzNiArOTAsMzkgQEAKIAkgKiBQYXNzIHRoZSBieXRlX3N0cmVhbV9idWZmZXIgaW50byBhIG1vZHVsZSB0aGF0IGNhbiBjYWxjdWxhdGUKIAkgKiB0aGUgYnVmZmVyIHNpemUgbmVlZGVkIGZvciB0aGUgbGlua2VkIGxpc3QKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3JzX2dldF9saXN0X2xlbmd0aCAoYnl0ZV9zdHJlYW1fc3RhcnQsIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgsCi0JCQkgJmxpc3Rfc2l6ZV9uZWVkZWQpOworCXN0YXR1cyA9CisJICAgIGFjcGlfcnNfZ2V0X2xpc3RfbGVuZ3RoKGJ5dGVfc3RyZWFtX3N0YXJ0LAorCQkJCSAgICBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoLAorCQkJCSAgICAmbGlzdF9zaXplX25lZWRlZCk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiU3RhdHVzPSVYIGxpc3Rfc2l6ZV9uZWVkZWQ9JVhcbiIsCi0JCXN0YXR1cywgKHUzMikgbGlzdF9zaXplX25lZWRlZCkpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlN0YXR1cz0lWCBsaXN0X3NpemVfbmVlZGVkPSVYXG4iLAorCQkJICBzdGF0dXMsICh1MzIpIGxpc3Rfc2l6ZV9uZWVkZWQpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlciAob3V0cHV0X2J1ZmZlciwgbGlzdF9zaXplX25lZWRlZCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihvdXRwdXRfYnVmZmVyLCBsaXN0X3NpemVfbmVlZGVkKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogRG8gdGhlIGNvbnZlcnNpb24gKi8KIAotCXN0YXR1cyA9IGFjcGlfcnNfYnl0ZV9zdHJlYW1fdG9fbGlzdCAoYnl0ZV9zdHJlYW1fc3RhcnQsIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgsCi0JCQkgIG91dHB1dF9idWZmZXItPnBvaW50ZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfcnNfYnl0ZV9zdHJlYW1fdG9fbGlzdChieXRlX3N0cmVhbV9zdGFydCwKKwkJCQkJYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCwKKwkJCQkJb3V0cHV0X2J1ZmZlci0+cG9pbnRlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJvdXRwdXRfYnVmZmVyICVwIExlbmd0aCAlWFxuIiwKLQkJCW91dHB1dF9idWZmZXItPnBvaW50ZXIsICh1MzIpIG91dHB1dF9idWZmZXItPmxlbmd0aCkpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIm91dHB1dF9idWZmZXIgJXAgTGVuZ3RoICVYXG4iLAorCQkJICBvdXRwdXRfYnVmZmVyLT5wb2ludGVyLCAodTMyKSBvdXRwdXRfYnVmZmVyLT5sZW5ndGgpKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfY3JlYXRlX3BjaV9yb3V0aW5nX3RhYmxlCkBAIC0xNDgsNDQgKzE0NSw0MSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfY3JlYXRlX3BjaV9yb3V0aW5nX3RhYmxlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpwYWNrYWdlX29iamVjdCwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpvdXRwdXRfYnVmZmVyKQorYWNwaV9yc19jcmVhdGVfcGNpX3JvdXRpbmdfdGFibGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFja2FnZV9vYmplY3QsCisJCQkJIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0X2J1ZmZlcikKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXI7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnRvcF9vYmplY3RfbGlzdDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3ViX29iamVjdF9saXN0OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemVfbmVlZGVkID0gMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9lbGVtZW50czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICAgKnVzZXJfcHJ0OwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICBwYXRoX2J1ZmZlcjsKKwl1OCAqYnVmZmVyOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKip0b3Bfb2JqZWN0X2xpc3Q7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnN1Yl9vYmplY3RfbGlzdDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3NpemUgYnVmZmVyX3NpemVfbmVlZGVkID0gMDsKKwl1MzIgbnVtYmVyX29mX2VsZW1lbnRzOworCXUzMiBpbmRleDsKKwlzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSAqdXNlcl9wcnQ7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2J1ZmZlciBwYXRoX2J1ZmZlcjsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2NyZWF0ZV9wY2lfcm91dGluZ190YWJsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfY3JlYXRlX3BjaV9yb3V0aW5nX3RhYmxlIik7CiAKIAkvKiBQYXJhbXMgYWxyZWFkeSB2YWxpZGF0ZWQsIHNvIHdlIGRvbid0IHJlLXZhbGlkYXRlIGhlcmUgKi8KIAogCS8qIEdldCB0aGUgcmVxdWlyZWQgYnVmZmVyIGxlbmd0aCAqLwogCi0Jc3RhdHVzID0gYWNwaV9yc19nZXRfcGNpX3JvdXRpbmdfdGFibGVfbGVuZ3RoIChwYWNrYWdlX29iamVjdCwKLQkJCSAmYnVmZmVyX3NpemVfbmVlZGVkKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2dldF9wY2lfcm91dGluZ190YWJsZV9sZW5ndGgocGFja2FnZV9vYmplY3QsCisJCQkJCQkgICAgICAmYnVmZmVyX3NpemVfbmVlZGVkKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgImJ1ZmZlcl9zaXplX25lZWRlZCA9ICVYXG4iLAotCQkodTMyKSBidWZmZXJfc2l6ZV9uZWVkZWQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJidWZmZXJfc2l6ZV9uZWVkZWQgPSAlWFxuIiwKKwkJCSAgKHUzMikgYnVmZmVyX3NpemVfbmVlZGVkKSk7CiAKIAkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyIChvdXRwdXRfYnVmZmVyLCBidWZmZXJfc2l6ZV9uZWVkZWQpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIob3V0cHV0X2J1ZmZlciwgYnVmZmVyX3NpemVfbmVlZGVkKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTE5MywxMCArMTg3LDEwIEBACiAJICogc2hvdWxkIGJlIGEgcGFja2FnZSB0aGF0IGluIHR1cm4gY29udGFpbnMgYW4KIAkgKiBhY3BpX2ludGVnZXIgQWRkcmVzcywgYSB1OCBQaW4sIGEgTmFtZSBhbmQgYSB1OCBzb3VyY2VfaW5kZXguCiAJICovCi0JdG9wX29iamVjdF9saXN0ICA9IHBhY2thZ2Vfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzOworCXRvcF9vYmplY3RfbGlzdCA9IHBhY2thZ2Vfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzOwogCW51bWJlcl9vZl9lbGVtZW50cyA9IHBhY2thZ2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50OwotCWJ1ZmZlciAgICAgICAgICAgPSBvdXRwdXRfYnVmZmVyLT5wb2ludGVyOwotCXVzZXJfcHJ0ICAgICAgICAgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSwgYnVmZmVyKTsKKwlidWZmZXIgPSBvdXRwdXRfYnVmZmVyLT5wb2ludGVyOworCXVzZXJfcHJ0ID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSwgYnVmZmVyKTsKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWJlcl9vZl9lbGVtZW50czsgaW5kZXgrKykgewogCQkvKgpAQCAtMjA2LDMxICsyMDAsMzQgQEAKIAkJICogYmUgemVybyBiZWNhdXNlIHdlIGNsZWFyZWQgdGhlIHJldHVybiBidWZmZXIgZWFybGllcgogCQkgKi8KIAkJYnVmZmVyICs9IHVzZXJfcHJ0LT5sZW5ndGg7Ci0JCXVzZXJfcHJ0ID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUsIGJ1ZmZlcik7CisJCXVzZXJfcHJ0ID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSwgYnVmZmVyKTsKIAogCQkvKgogCQkgKiBGaWxsIGluIHRoZSBMZW5ndGggZmllbGQgd2l0aCB0aGUgaW5mb3JtYXRpb24gd2UgaGF2ZSBhdCB0aGlzIHBvaW50LgogCQkgKiBUaGUgbWludXMgZm91ciBpcyB0byBzdWJ0cmFjdCB0aGUgc2l6ZSBvZiB0aGUgdTggU291cmNlWzRdIG1lbWJlcgogCQkgKiBiZWNhdXNlIGl0IGlzIGFkZGVkIGJlbG93LgogCQkgKi8KLQkJdXNlcl9wcnQtPmxlbmd0aCA9IChzaXplb2YgKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlKSAtIDQpOworCQl1c2VyX3BydC0+bGVuZ3RoID0gKHNpemVvZihzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSkgLSA0KTsKIAogCQkvKiBFYWNoIGVsZW1lbnQgb2YgdGhlIHRvcC1sZXZlbCBwYWNrYWdlIG11c3QgYWxzbyBiZSBhIHBhY2thZ2UgKi8KIAotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKCp0b3Bfb2JqZWN0X2xpc3QpICE9IEFDUElfVFlQRV9QQUNLQUdFKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiKFBSVFslWF0pIE5lZWQgc3ViLXBhY2thZ2UsIGZvdW5kICVzXG4iLAotCQkJCWluZGV4LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lICgqdG9wX29iamVjdF9saXN0KSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKCp0b3Bfb2JqZWN0X2xpc3QpICE9IEFDUElfVFlQRV9QQUNLQUdFKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICIoUFJUWyVYXSkgTmVlZCBzdWItcGFja2FnZSwgZm91bmQgJXNcbiIsCisJCQkJCSAgaW5kZXgsCisJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgICgqdG9wX29iamVjdF9saXN0KSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKIAkJLyogRWFjaCBzdWItcGFja2FnZSBtdXN0IGJlIG9mIGxlbmd0aCA0ICovCiAKIAkJaWYgKCgqdG9wX29iamVjdF9saXN0KS0+cGFja2FnZS5jb3VudCAhPSA0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiKFBSVFslWF0pIE5lZWQgcGFja2FnZSBvZiBsZW5ndGggNCwgZm91bmQgbGVuZ3RoICVkXG4iLAotCQkJCWluZGV4LCAoKnRvcF9vYmplY3RfbGlzdCktPnBhY2thZ2UuY291bnQpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1BBQ0tBR0VfTElNSVQpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiKFBSVFslWF0pIE5lZWQgcGFja2FnZSBvZiBsZW5ndGggNCwgZm91bmQgbGVuZ3RoICVkXG4iLAorCQkJCQkgIGluZGV4LAorCQkJCQkgICgqdG9wX29iamVjdF9saXN0KS0+cGFja2FnZS5jb3VudCkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9QQUNLQUdFX0xJTUlUKTsKIAkJfQogCiAJCS8qCkBAIC0yNDMsNDAgKzI0MCw0MyBAQAogCQkvKiAxKSBGaXJzdCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuQWRkcmVzcyAqLwogCiAJCW9ial9kZXNjID0gc3ViX29iamVjdF9saXN0WzBdOwotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCQl1c2VyX3BydC0+YWRkcmVzcyA9IG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCQl9Ci0JCWVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIihQUlRbJVhdLkFkZHJlc3MpIE5lZWQgSW50ZWdlciwgZm91bmQgJXNcbiIsCi0JCQkJaW5kZXgsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfREFUQSk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICIoUFJUWyVYXS5BZGRyZXNzKSBOZWVkIEludGVnZXIsIGZvdW5kICVzXG4iLAorCQkJCQkgIGluZGV4LAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAob2JqX2Rlc2MpKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwogCQl9CiAKIAkJLyogMikgU2Vjb25kIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5QaW4gKi8KIAogCQlvYmpfZGVzYyA9IHN1Yl9vYmplY3RfbGlzdFsxXTsKLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgewogCQkJdXNlcl9wcnQtPnBpbiA9ICh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCQl9Ci0JCWVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIihQUlRbJVhdLlBpbikgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlc1xuIiwKLQkJCQlpbmRleCwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9EQVRBKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIihQUlRbJVhdLlBpbikgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlc1xuIiwKKwkJCQkJICBpbmRleCwKKwkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgKG9ial9kZXNjKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAkJfQogCiAJCS8qIDMpIFRoaXJkIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5zb3VyY2VfbmFtZSAqLwogCiAJCW9ial9kZXNjID0gc3ViX29iamVjdF9saXN0WzJdOwotCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKKwkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCiAJCQlpZiAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgIT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiKFBSVFslWF0uU291cmNlKSBOZWVkIG5hbWUsIGZvdW5kIHJlZmVyZW5jZSBvcCAlWFxuIiwKLQkJCQkJaW5kZXgsIG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfREFUQSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIihQUlRbJVhdLlNvdXJjZSkgTmVlZCBuYW1lLCBmb3VuZCByZWZlcmVuY2Ugb3AgJVhcbiIsCisJCQkJCQkgIGluZGV4LAorCQkJCQkJICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREFUQSk7CiAJCQl9CiAKIAkJCW5vZGUgPSBvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGU7CkBAIC0yODQsMjEgKzI4NCwyMyBAQAogCQkJLyogVXNlICpyZW1haW5pbmcqIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGFzIG1heCBmb3IgcGF0aG5hbWUgKi8KIAogCQkJcGF0aF9idWZmZXIubGVuZ3RoID0gb3V0cHV0X2J1ZmZlci0+bGVuZ3RoIC0KLQkJCQkJICAgKHUzMikgKCh1OCAqKSB1c2VyX3BydC0+c291cmNlIC0KLQkJCQkJICAgKHU4ICopIG91dHB1dF9idWZmZXItPnBvaW50ZXIpOworCQkJICAgICh1MzIpICgodTggKikgdXNlcl9wcnQtPnNvdXJjZSAtCisJCQkJICAgKHU4ICopIG91dHB1dF9idWZmZXItPnBvaW50ZXIpOwogCQkJcGF0aF9idWZmZXIucG9pbnRlciA9IHVzZXJfcHJ0LT5zb3VyY2U7CiAKLQkJCXN0YXR1cyA9IGFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lICgoYWNwaV9oYW5kbGUpIG5vZGUsICZwYXRoX2J1ZmZlcik7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lKChhY3BpX2hhbmRsZSkgbm9kZSwKKwkJCQkJCSAgICAgICAmcGF0aF9idWZmZXIpOwogCiAJCQkvKiArMSB0byBpbmNsdWRlIG51bGwgdGVybWluYXRvciAqLwogCi0JCQl1c2VyX3BydC0+bGVuZ3RoICs9ICh1MzIpIEFDUElfU1RSTEVOICh1c2VyX3BydC0+c291cmNlKSArIDE7CisJCQl1c2VyX3BydC0+bGVuZ3RoICs9CisJCQkgICAgKHUzMikgQUNQSV9TVFJMRU4odXNlcl9wcnQtPnNvdXJjZSkgKyAxOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKLQkJCUFDUElfU1RSQ1BZICh1c2VyX3BydC0+c291cmNlLCBvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIpOworCQkJQUNQSV9TVFJDUFkodXNlcl9wcnQtPnNvdXJjZSwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKIAogCQkJLyoKIAkJCSAqIEFkZCB0byB0aGUgTGVuZ3RoIGZpZWxkIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZwpAQCAtMzA3LDcgKzMwOSw2IEBACiAJCQl1c2VyX3BydC0+bGVuZ3RoICs9IG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAkJCS8qCiAJCQkgKiBJZiB0aGlzIGlzIGEgbnVtYmVyLCB0aGVuIHRoZSBTb3VyY2UgTmFtZSBpcyBOVUxMLCBzaW5jZSB0aGUKQEAgLTMxNSwzMyArMzE2LDM2IEBACiAJCQkgKgogCQkJICogQWRkIHRvIHRoZSBMZW5ndGggZmllbGQgdGhlIGxlbmd0aCBvZiB0aGUgdTMyIE5VTEwKIAkJCSAqLwotCQkJdXNlcl9wcnQtPmxlbmd0aCArPSBzaXplb2YgKHUzMik7CisJCQl1c2VyX3BydC0+bGVuZ3RoICs9IHNpemVvZih1MzIpOwogCQkJYnJlYWs7CiAKLQogCQlkZWZhdWx0OgogCi0JCSAgIEFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJICAgIihQUlRbJVhdLlNvdXJjZSkgTmVlZCBSZWYvU3RyaW5nL0ludGVnZXIsIGZvdW5kICVzXG4iLAotCQkJCWluZGV4LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYykpKTsKLQkJICAgcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfREFUQSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICIoUFJUWyVYXS5Tb3VyY2UpIE5lZWQgUmVmL1N0cmluZy9JbnRlZ2VyLCBmb3VuZCAlc1xuIiwKKwkJCQkJICBpbmRleCwKKwkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgKG9ial9kZXNjKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAkJfQogCiAJCS8qIE5vdyBhbGlnbiB0aGUgY3VycmVudCBsZW5ndGggKi8KIAotCQl1c2VyX3BydC0+bGVuZ3RoID0gKHUzMikgQUNQSV9ST1VORF9VUF90b182NF9iSVRTICh1c2VyX3BydC0+bGVuZ3RoKTsKKwkJdXNlcl9wcnQtPmxlbmd0aCA9CisJCSAgICAodTMyKSBBQ1BJX1JPVU5EX1VQX3RvXzY0X2JJVFModXNlcl9wcnQtPmxlbmd0aCk7CiAKIAkJLyogNCkgRm91cnRoIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5zb3VyY2VfaW5kZXggKi8KIAogCQlvYmpfZGVzYyA9IHN1Yl9vYmplY3RfbGlzdFszXTsKLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgewogCQkJdXNlcl9wcnQtPnNvdXJjZV9pbmRleCA9ICh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCQl9Ci0JCWVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIihQUlRbJVhdLnNvdXJjZV9pbmRleCkgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlc1xuIiwKLQkJCQlpbmRleCwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9EQVRBKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIihQUlRbJVhdLnNvdXJjZV9pbmRleCkgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlc1xuIiwKKwkJCQkJICBpbmRleCwKKwkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgKG9ial9kZXNjKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAkJfQogCiAJCS8qIFBvaW50IHRvIHRoZSBuZXh0IHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgaW4gdGhlIHRvcCBsZXZlbCBwYWNrYWdlICovCkBAIC0zNDksMTIgKzM1MywxMSBAQAogCQl0b3Bfb2JqZWN0X2xpc3QrKzsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAib3V0cHV0X2J1ZmZlciAlcCBMZW5ndGggJVhcbiIsCi0JCQlvdXRwdXRfYnVmZmVyLT5wb2ludGVyLCAodTMyKSBvdXRwdXRfYnVmZmVyLT5sZW5ndGgpKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJvdXRwdXRfYnVmZmVyICVwIExlbmd0aCAlWFxuIiwKKwkJCSAgb3V0cHV0X2J1ZmZlci0+cG9pbnRlciwgKHUzMikgb3V0cHV0X2J1ZmZlci0+bGVuZ3RoKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2NyZWF0ZV9ieXRlX3N0cmVhbQpAQCAtMzc0LDE5ICszNzcsMTYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2NyZWF0ZV9ieXRlX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3RfYnVmZmVyLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKm91dHB1dF9idWZmZXIpCithY3BpX3JzX2NyZWF0ZV9ieXRlX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3RfYnVmZmVyLAorCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXRfYnVmZmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3NpemUgYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQgPSAwOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfY3JlYXRlX2J5dGVfc3RyZWFtIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfY3JlYXRlX2J5dGVfc3RyZWFtIik7Ci0KLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJsaW5rZWRfbGlzdF9idWZmZXIgPSAlcFxuIiwKLQkJbGlua2VkX2xpc3RfYnVmZmVyKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAibGlua2VkX2xpc3RfYnVmZmVyID0gJXBcbiIsCisJCQkgIGxpbmtlZF9saXN0X2J1ZmZlcikpOwogCiAJLyoKIAkgKiBQYXJhbXMgYWxyZWFkeSB2YWxpZGF0ZWQsIHNvIHdlIGRvbid0IHJlLXZhbGlkYXRlIGhlcmUKQEAgLTM5NCwzMiArMzk0LDM1IEBACiAJICogUGFzcyB0aGUgbGlua2VkX2xpc3RfYnVmZmVyIGludG8gYSBtb2R1bGUgdGhhdCBjYWxjdWxhdGVzCiAJICogdGhlIGJ1ZmZlciBzaXplIG5lZWRlZCBmb3IgdGhlIGJ5dGUgc3RyZWFtLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X2J5dGVfc3RyZWFtX2xlbmd0aCAobGlua2VkX2xpc3RfYnVmZmVyLAotCQkJICZieXRlX3N0cmVhbV9zaXplX25lZWRlZCk7CisJc3RhdHVzID0gYWNwaV9yc19nZXRfYnl0ZV9zdHJlYW1fbGVuZ3RoKGxpbmtlZF9saXN0X2J1ZmZlciwKKwkJCQkJCSZieXRlX3N0cmVhbV9zaXplX25lZWRlZCk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQ9JVgsICVzXG4iLAotCQkodTMyKSBieXRlX3N0cmVhbV9zaXplX25lZWRlZCwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQ9JVgsICVzXG4iLAorCQkJICAodTMyKSBieXRlX3N0cmVhbV9zaXplX25lZWRlZCwKKwkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlciAob3V0cHV0X2J1ZmZlciwgYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIob3V0cHV0X2J1ZmZlciwgYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBEbyB0aGUgY29udmVyc2lvbiAqLwogCi0Jc3RhdHVzID0gYWNwaV9yc19saXN0X3RvX2J5dGVfc3RyZWFtIChsaW5rZWRfbGlzdF9idWZmZXIsIGJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkLAotCQkJICBvdXRwdXRfYnVmZmVyLT5wb2ludGVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX3JzX2xpc3RfdG9fYnl0ZV9zdHJlYW0obGlua2VkX2xpc3RfYnVmZmVyLAorCQkJCQlieXRlX3N0cmVhbV9zaXplX25lZWRlZCwKKwkJCQkJb3V0cHV0X2J1ZmZlci0+cG9pbnRlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJvdXRwdXRfYnVmZmVyICVwIExlbmd0aCAlWFxuIiwKLQkJCW91dHB1dF9idWZmZXItPnBvaW50ZXIsICh1MzIpIG91dHB1dF9idWZmZXItPmxlbmd0aCkpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIm91dHB1dF9idWZmZXIgJXAgTGVuZ3RoICVYXG4iLAorCQkJICBvdXRwdXRfYnVmZmVyLT5wb2ludGVyLCAodTMyKSBvdXRwdXRfYnVmZmVyLT5sZW5ndGgpKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2R1bXAuYwppbmRleCAxOTM1ZGFiLi43NWJkMzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNkdW1wLmMKQEAgLTQxLDY5ICs0MSw0MCBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNyZXNyYy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInJzZHVtcCIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9pcnEgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX2FkZHJlc3MxNiAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfYWRkcmVzczMyICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9hZGRyZXNzNjQgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX2RtYSAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfaW8gKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX2V4dGVuZGVkX2lycSAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfZml4ZWRfaW8gKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9tZW1vcnkyNCAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfbWVtb3J5MzIgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX3N0YXJ0X2RlcGVuZF9mbnMgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX3ZlbmRvcl9zcGVjaWZpYyAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KK0FDUElfTU9EVUxFX05BTUUoInJzZHVtcCIpCiAKICNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfaXJxKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9hZGRyZXNzMTYodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2FkZHJlc3MzMih1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpOworCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfYWRkcmVzczY0KHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9kbWEodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2lvKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9leHRlbmRlZF9pcnEodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2ZpeGVkX2lvKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9maXhlZF9tZW1vcnkzMih1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpOworCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfbWVtb3J5MjQodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX21lbW9yeTMyKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9zdGFydF9kZXBlbmRfZm5zKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF92ZW5kb3Jfc3BlY2lmaWModW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2lycQpAQCAtMTE2LDM5ICs4NywzNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfaXJxICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2lycSh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxICAgICAgICAqaXJxX2RhdGEgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxICopIGRhdGE7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxICppcnFfZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgKilkYXRhOworCXU4IGluZGV4ID0gMDsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisJYWNwaV9vc19wcmludGYoIklSUSBSZXNvdXJjZVxuIik7CiAKKwlhY3BpX29zX3ByaW50ZigiICAlcyBUcmlnZ2VyZWRcbiIsCisJCSAgICAgICBBQ1BJX0xFVkVMX1NFTlNJVElWRSA9PQorCQkgICAgICAgaXJxX2RhdGEtPmVkZ2VfbGV2ZWwgPyAiTGV2ZWwiIDogIkVkZ2UiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiSVJRIFJlc291cmNlXG4iKTsKKwlhY3BpX29zX3ByaW50ZigiICBBY3RpdmUgJXNcbiIsCisJCSAgICAgICBBQ1BJX0FDVElWRV9MT1cgPT0KKwkJICAgICAgIGlycV9kYXRhLT5hY3RpdmVfaGlnaF9sb3cgPyAiTG93IiA6ICJIaWdoIik7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgJXMgVHJpZ2dlcmVkXG4iLAotCQlBQ1BJX0xFVkVMX1NFTlNJVElWRSA9PSBpcnFfZGF0YS0+ZWRnZV9sZXZlbCA/ICJMZXZlbCIgOiAiRWRnZSIpOworCWFjcGlfb3NfcHJpbnRmKCIgICVzXG4iLAorCQkgICAgICAgQUNQSV9TSEFSRUQgPT0KKwkJICAgICAgIGlycV9kYXRhLT5zaGFyZWRfZXhjbHVzaXZlID8gIlNoYXJlZCIgOiAiRXhjbHVzaXZlIik7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgQWN0aXZlICVzXG4iLAotCQlBQ1BJX0FDVElWRV9MT1cgPT0gaXJxX2RhdGEtPmFjdGl2ZV9oaWdoX2xvdyA/ICJMb3ciIDogIkhpZ2giKTsKLQotCWFjcGlfb3NfcHJpbnRmICgiICAlc1xuIiwKLQkJQUNQSV9TSEFSRUQgPT0gaXJxX2RhdGEtPnNoYXJlZF9leGNsdXNpdmUgPyAiU2hhcmVkIiA6ICJFeGNsdXNpdmUiKTsKLQotCWFjcGlfb3NfcHJpbnRmICgiICAlWCBJbnRlcnJ1cHRzICggIiwgaXJxX2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKTsKKwlhY3BpX29zX3ByaW50ZigiICAlWCBJbnRlcnJ1cHRzICggIiwgaXJxX2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKTsKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGlycV9kYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0czsgaW5kZXgrKykgewotCQlhY3BpX29zX3ByaW50ZiAoIiVYICIsIGlycV9kYXRhLT5pbnRlcnJ1cHRzW2luZGV4XSk7CisJCWFjcGlfb3NfcHJpbnRmKCIlWCAiLCBpcnFfZGF0YS0+aW50ZXJydXB0c1tpbmRleF0pOwogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiKVxuIik7CisJYWNwaV9vc19wcmludGYoIilcbiIpOwogCXJldHVybjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfZG1hCkBAIC0xNjEsNzUgKzEzMCw2OSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfZG1hICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2RtYSh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hICAgICAgICAqZG1hX2RhdGEgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hICopIGRhdGE7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hICpkbWFfZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEgKilkYXRhOworCXU4IGluZGV4ID0gMDsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCWFjcGlfb3NfcHJpbnRmICgiRE1BIFJlc291cmNlXG4iKTsKKwlhY3BpX29zX3ByaW50ZigiRE1BIFJlc291cmNlXG4iKTsKIAogCXN3aXRjaCAoZG1hX2RhdGEtPnR5cGUpIHsKIAljYXNlIEFDUElfQ09NUEFUSUJJTElUWToKLQkJYWNwaV9vc19wcmludGYgKCIgIENvbXBhdGliaWxpdHkgbW9kZVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIENvbXBhdGliaWxpdHkgbW9kZVxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfQToKLQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgQVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgQVxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfQjoKLQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgQlxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgQlxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfRjoKLQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgRlxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgRlxuIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYWNwaV9vc19wcmludGYgKCIgIEludmFsaWQgRE1BIHR5cGVcbiIpOworCQlhY3BpX29zX3ByaW50ZigiICBJbnZhbGlkIERNQSB0eXBlXG4iKTsKIAkJYnJlYWs7CiAJfQogCi0JYWNwaV9vc19wcmludGYgKCIgICVzQnVzIE1hc3RlclxuIiwKLQkJQUNQSV9CVVNfTUFTVEVSID09IGRtYV9kYXRhLT5idXNfbWFzdGVyID8gIiIgOiAiTm90IGEgIik7Ci0KKwlhY3BpX29zX3ByaW50ZigiICAlc0J1cyBNYXN0ZXJcbiIsCisJCSAgICAgICBBQ1BJX0JVU19NQVNURVIgPT0gZG1hX2RhdGEtPmJ1c19tYXN0ZXIgPyAiIiA6ICJOb3QgYSAiKTsKIAogCXN3aXRjaCAoZG1hX2RhdGEtPnRyYW5zZmVyKSB7CiAJY2FzZSBBQ1BJX1RSQU5TRkVSXzg6Ci0JCWFjcGlfb3NfcHJpbnRmICgiICA4LWJpdCBvbmx5IHRyYW5zZmVyXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgOC1iaXQgb25seSB0cmFuc2ZlclxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RSQU5TRkVSXzhfMTY6Ci0JCWFjcGlfb3NfcHJpbnRmICgiICA4IGFuZCAxNi1iaXQgdHJhbnNmZXJcbiIpOworCQlhY3BpX29zX3ByaW50ZigiICA4IGFuZCAxNi1iaXQgdHJhbnNmZXJcbiIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9UUkFOU0ZFUl8xNjoKLQkJYWNwaV9vc19wcmludGYgKCIgIDE2IGJpdCBvbmx5IHRyYW5zZmVyXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgMTYgYml0IG9ubHkgdHJhbnNmZXJcbiIpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWFjcGlfb3NfcHJpbnRmICgiICBJbnZhbGlkIHRyYW5zZmVyIHByZWZlcmVuY2VcbiIpOworCQlhY3BpX29zX3ByaW50ZigiICBJbnZhbGlkIHRyYW5zZmVyIHByZWZlcmVuY2VcbiIpOwogCQlicmVhazsKIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgTnVtYmVyIG9mIENoYW5uZWxzOiAlWCAoICIsCi0JCWRtYV9kYXRhLT5udW1iZXJfb2ZfY2hhbm5lbHMpOworCWFjcGlfb3NfcHJpbnRmKCIgIE51bWJlciBvZiBDaGFubmVsczogJVggKCAiLAorCQkgICAgICAgZG1hX2RhdGEtPm51bWJlcl9vZl9jaGFubmVscyk7CiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBkbWFfZGF0YS0+bnVtYmVyX29mX2NoYW5uZWxzOyBpbmRleCsrKSB7Ci0JCWFjcGlfb3NfcHJpbnRmICgiJVggIiwgZG1hX2RhdGEtPmNoYW5uZWxzW2luZGV4XSk7CisJCWFjcGlfb3NfcHJpbnRmKCIlWCAiLCBkbWFfZGF0YS0+Y2hhbm5lbHNbaW5kZXhdKTsKIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIilcbiIpOworCWFjcGlfb3NfcHJpbnRmKCIpXG4iKTsKIAlyZXR1cm47CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX3N0YXJ0X2RlcGVuZF9mbnMKQEAgLTI0Miw1OCArMjA1LDU0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9zdGFydF9kZXBlbmRfZm5zICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX3N0YXJ0X2RlcGVuZF9mbnModW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RwZiAqc2RmX2RhdGEgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmICopIGRhdGE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmICpzZGZfZGF0YSA9CisJICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kcGYgKilkYXRhOwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JYWNwaV9vc19wcmludGYgKCJTdGFydCBEZXBlbmRlbnQgRnVuY3Rpb25zIFJlc291cmNlXG4iKTsKKwlhY3BpX29zX3ByaW50ZigiU3RhcnQgRGVwZW5kZW50IEZ1bmN0aW9ucyBSZXNvdXJjZVxuIik7CiAKIAlzd2l0Y2ggKHNkZl9kYXRhLT5jb21wYXRpYmlsaXR5X3ByaW9yaXR5KSB7CiAJY2FzZSBBQ1BJX0dPT0RfQ09ORklHVVJBVElPTjoKLQkJYWNwaV9vc19wcmludGYgKCIgIEdvb2QgY29uZmlndXJhdGlvblxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIEdvb2QgY29uZmlndXJhdGlvblxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjoKLQkJYWNwaV9vc19wcmludGYgKCIgIEFjY2VwdGFibGUgY29uZmlndXJhdGlvblxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIEFjY2VwdGFibGUgY29uZmlndXJhdGlvblxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1NVQl9PUFRJTUFMX0NPTkZJR1VSQVRJT046Ci0JCWFjcGlfb3NfcHJpbnRmICgiICBTdWItb3B0aW1hbCBjb25maWd1cmF0aW9uXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgU3ViLW9wdGltYWwgY29uZmlndXJhdGlvblxuIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYWNwaV9vc19wcmludGYgKCIgIEludmFsaWQgY29tcGF0aWJpbGl0eSBwcmlvcml0eVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIEludmFsaWQgY29tcGF0aWJpbGl0eSBwcmlvcml0eVxuIik7CiAJCWJyZWFrOwogCX0KIAotCXN3aXRjaChzZGZfZGF0YS0+cGVyZm9ybWFuY2Vfcm9idXN0bmVzcykgeworCXN3aXRjaCAoc2RmX2RhdGEtPnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MpIHsKIAljYXNlIEFDUElfR09PRF9DT05GSUdVUkFUSU9OOgotCQlhY3BpX29zX3ByaW50ZiAoIiAgR29vZCBjb25maWd1cmF0aW9uXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgR29vZCBjb25maWd1cmF0aW9uXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OOgotCQlhY3BpX29zX3ByaW50ZiAoIiAgQWNjZXB0YWJsZSBjb25maWd1cmF0aW9uXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgQWNjZXB0YWJsZSBjb25maWd1cmF0aW9uXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfU1VCX09QVElNQUxfQ09ORklHVVJBVElPTjoKLQkJYWNwaV9vc19wcmludGYgKCIgIFN1Yi1vcHRpbWFsIGNvbmZpZ3VyYXRpb25cbiIpOworCQlhY3BpX29zX3ByaW50ZigiICBTdWItb3B0aW1hbCBjb25maWd1cmF0aW9uXG4iKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlhY3BpX29zX3ByaW50ZiAoIiAgSW52YWxpZCBwZXJmb3JtYW5jZSByb2J1c3RuZXNzIHByZWZlcmVuY2VcbiIpOworCQlhY3BpX29zX3ByaW50ZigiICBJbnZhbGlkIHBlcmZvcm1hbmNlIHJvYnVzdG5lc3MgcHJlZmVyZW5jZVxuIik7CiAJCWJyZWFrOwogCX0KIAogCXJldHVybjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfaW8KQEAgLTMwNiwzMyArMjY1LDMwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9pbyAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9pbyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8gICAgICAgICAqaW9fZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyAqKSBkYXRhOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lvICppb19kYXRhID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvICopZGF0YTsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisJYWNwaV9vc19wcmludGYoIklvIFJlc291cmNlXG4iKTsKIAorCWFjcGlfb3NfcHJpbnRmKCIgICVkIGJpdCBkZWNvZGVcbiIsCisJCSAgICAgICBBQ1BJX0RFQ09ERV8xNiA9PSBpb19kYXRhLT5pb19kZWNvZGUgPyAxNiA6IDEwKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiSW8gUmVzb3VyY2VcbiIpOworCWFjcGlfb3NfcHJpbnRmKCIgIFJhbmdlIG1pbmltdW0gYmFzZTogJTA4WFxuIiwKKwkJICAgICAgIGlvX2RhdGEtPm1pbl9iYXNlX2FkZHJlc3MpOwogCi0JYWNwaV9vc19wcmludGYgKCIgICVkIGJpdCBkZWNvZGVcbiIsCi0JCUFDUElfREVDT0RFXzE2ID09IGlvX2RhdGEtPmlvX2RlY29kZSA/IDE2IDogMTApOworCWFjcGlfb3NfcHJpbnRmKCIgIFJhbmdlIG1heGltdW0gYmFzZTogJTA4WFxuIiwKKwkJICAgICAgIGlvX2RhdGEtPm1heF9iYXNlX2FkZHJlc3MpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIG1pbmltdW0gYmFzZTogJTA4WFxuIiwgaW9fZGF0YS0+bWluX2Jhc2VfYWRkcmVzcyk7CisJYWNwaV9vc19wcmludGYoIiAgQWxpZ25tZW50OiAlMDhYXG4iLCBpb19kYXRhLT5hbGlnbm1lbnQpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIG1heGltdW0gYmFzZTogJTA4WFxuIiwgaW9fZGF0YS0+bWF4X2Jhc2VfYWRkcmVzcyk7Ci0KLQlhY3BpX29zX3ByaW50ZiAoIiAgQWxpZ25tZW50OiAlMDhYXG4iLCBpb19kYXRhLT5hbGlnbm1lbnQpOwotCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIExlbmd0aDogJTA4WFxuIiwgaW9fZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKKwlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBMZW5ndGg6ICUwOFhcbiIsIGlvX2RhdGEtPnJhbmdlX2xlbmd0aCk7CiAKIAlyZXR1cm47CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2ZpeGVkX2lvCkBAIC0zNDUsMjUgKzMwMSwyMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfZml4ZWRfaW8gKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfZml4ZWRfaW8odW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvICAgKmZpeGVkX2lvX2RhdGEgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8gKikgZGF0YTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyAqZml4ZWRfaW9fZGF0YSA9CisJICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyAqKWRhdGE7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOworCWFjcGlfb3NfcHJpbnRmKCJGaXhlZCBJbyBSZXNvdXJjZVxuIik7CisJYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgYmFzZSBhZGRyZXNzOiAlMDhYIiwKKwkJICAgICAgIGZpeGVkX2lvX2RhdGEtPmJhc2VfYWRkcmVzcyk7CiAKLQotCWFjcGlfb3NfcHJpbnRmICgiRml4ZWQgSW8gUmVzb3VyY2VcbiIpOwotCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBiYXNlIGFkZHJlc3M6ICUwOFgiLCBmaXhlZF9pb19kYXRhLT5iYXNlX2FkZHJlc3MpOwotCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGxlbmd0aDogJTA4WCIsIGZpeGVkX2lvX2RhdGEtPnJhbmdlX2xlbmd0aCk7CisJYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYIiwgZml4ZWRfaW9fZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKIAogCXJldHVybjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfdmVuZG9yX3NwZWNpZmljCkBAIC0zNzYsMzAgKzMyOSwyNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfdmVuZG9yX3NwZWNpZmljICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX3ZlbmRvcl9zcGVjaWZpYyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yICAgICAqdmVuZG9yX2RhdGEgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yICopIGRhdGE7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yICp2ZW5kb3JfZGF0YSA9CisJICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IgKilkYXRhOworCXUxNiBpbmRleCA9IDA7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOworCWFjcGlfb3NfcHJpbnRmKCJWZW5kb3IgU3BlY2lmaWMgUmVzb3VyY2VcbiIpOwogCi0KLQlhY3BpX29zX3ByaW50ZiAoIlZlbmRvciBTcGVjaWZpYyBSZXNvdXJjZVxuIik7Ci0KLQlhY3BpX29zX3ByaW50ZiAoIiAgTGVuZ3RoOiAlMDhYXG4iLCB2ZW5kb3JfZGF0YS0+bGVuZ3RoKTsKKwlhY3BpX29zX3ByaW50ZigiICBMZW5ndGg6ICUwOFhcbiIsIHZlbmRvcl9kYXRhLT5sZW5ndGgpOwogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdmVuZG9yX2RhdGEtPmxlbmd0aDsgaW5kZXgrKykgewotCQlhY3BpX29zX3ByaW50ZiAoIiAgQnl0ZSAlWDogJTA4WFxuIiwKLQkJCWluZGV4LCB2ZW5kb3JfZGF0YS0+cmVzZXJ2ZWRbaW5kZXhdKTsKKwkJYWNwaV9vc19wcmludGYoIiAgQnl0ZSAlWDogJTA4WFxuIiwKKwkJCSAgICAgICBpbmRleCwgdmVuZG9yX2RhdGEtPnJlc2VydmVkW2luZGV4XSk7CiAJfQogCiAJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9tZW1vcnkyNApAQCAtNDEyLDM3ICszNjEsMzMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX21lbW9yeTI0ICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX21lbW9yeTI0KHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0yNCAgICAgICptZW1vcnkyNF9kYXRhID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTI0ICopIGRhdGE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQgKm1lbW9yeTI0X2RhdGEgPQorCSAgICAoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQgKilkYXRhOwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKKwlhY3BpX29zX3ByaW50ZigiMjQtQml0IE1lbW9yeSBSYW5nZSBSZXNvdXJjZVxuIik7CiAKKwlhY3BpX29zX3ByaW50ZigiICBSZWFkJXNcbiIsCisJCSAgICAgICBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09CisJCSAgICAgICBtZW1vcnkyNF9kYXRhLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/CisJCSAgICAgICAiL1dyaXRlIiA6ICIgb25seSIpOwogCi0JYWNwaV9vc19wcmludGYgKCIyNC1CaXQgTWVtb3J5IFJhbmdlIFJlc291cmNlXG4iKTsKKwlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBtaW5pbXVtIGJhc2U6ICUwOFhcbiIsCisJCSAgICAgICBtZW1vcnkyNF9kYXRhLT5taW5fYmFzZV9hZGRyZXNzKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBSZWFkJXNcbiIsCi0JCUFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KLQkJCW1lbW9yeTI0X2RhdGEtPnJlYWRfd3JpdGVfYXR0cmlidXRlID8KLQkJCSIvV3JpdGUiIDogIiBvbmx5Iik7CisJYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgbWF4aW11bSBiYXNlOiAlMDhYXG4iLAorCQkgICAgICAgbWVtb3J5MjRfZGF0YS0+bWF4X2Jhc2VfYWRkcmVzcyk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWluaW11bSBiYXNlOiAlMDhYXG4iLAotCQltZW1vcnkyNF9kYXRhLT5taW5fYmFzZV9hZGRyZXNzKTsKKwlhY3BpX29zX3ByaW50ZigiICBBbGlnbm1lbnQ6ICUwOFhcbiIsIG1lbW9yeTI0X2RhdGEtPmFsaWdubWVudCk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWF4aW11bSBiYXNlOiAlMDhYXG4iLAotCQltZW1vcnkyNF9kYXRhLT5tYXhfYmFzZV9hZGRyZXNzKTsKLQotCWFjcGlfb3NfcHJpbnRmICgiICBBbGlnbm1lbnQ6ICUwOFhcbiIsIG1lbW9yeTI0X2RhdGEtPmFsaWdubWVudCk7Ci0KLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYXG4iLCBtZW1vcnkyNF9kYXRhLT5yYW5nZV9sZW5ndGgpOworCWFjcGlfb3NfcHJpbnRmKCIgIFJhbmdlIGxlbmd0aDogJTA4WFxuIiwgbWVtb3J5MjRfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKIAogCXJldHVybjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfbWVtb3J5MzIKQEAgLTQ1NSwzNyArNDAwLDMzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9tZW1vcnkzMiAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9tZW1vcnkzMih1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIgICAgICAqbWVtb3J5MzJfZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMiAqKSBkYXRhOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTMyICptZW1vcnkzMl9kYXRhID0KKwkgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTMyICopZGF0YTsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisJYWNwaV9vc19wcmludGYoIjMyLUJpdCBNZW1vcnkgUmFuZ2UgUmVzb3VyY2VcbiIpOwogCisJYWNwaV9vc19wcmludGYoIiAgUmVhZCVzXG4iLAorCQkgICAgICAgQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQorCQkgICAgICAgbWVtb3J5MzJfZGF0YS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUgPworCQkgICAgICAgIi9Xcml0ZSIgOiAiIG9ubHkiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiMzItQml0IE1lbW9yeSBSYW5nZSBSZXNvdXJjZVxuIik7CisJYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgbWluaW11bSBiYXNlOiAlMDhYXG4iLAorCQkgICAgICAgbWVtb3J5MzJfZGF0YS0+bWluX2Jhc2VfYWRkcmVzcyk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmVhZCVzXG4iLAotCQlBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09Ci0JCQltZW1vcnkzMl9kYXRhLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/Ci0JCQkiL1dyaXRlIiA6ICIgb25seSIpOworCWFjcGlfb3NfcHJpbnRmKCIgIFJhbmdlIG1heGltdW0gYmFzZTogJTA4WFxuIiwKKwkJICAgICAgIG1lbW9yeTMyX2RhdGEtPm1heF9iYXNlX2FkZHJlc3MpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIG1pbmltdW0gYmFzZTogJTA4WFxuIiwKLQkJbWVtb3J5MzJfZGF0YS0+bWluX2Jhc2VfYWRkcmVzcyk7CisJYWNwaV9vc19wcmludGYoIiAgQWxpZ25tZW50OiAlMDhYXG4iLCBtZW1vcnkzMl9kYXRhLT5hbGlnbm1lbnQpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIG1heGltdW0gYmFzZTogJTA4WFxuIiwKLQkJbWVtb3J5MzJfZGF0YS0+bWF4X2Jhc2VfYWRkcmVzcyk7Ci0KLQlhY3BpX29zX3ByaW50ZiAoIiAgQWxpZ25tZW50OiAlMDhYXG4iLCBtZW1vcnkzMl9kYXRhLT5hbGlnbm1lbnQpOwotCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGxlbmd0aDogJTA4WFxuIiwgbWVtb3J5MzJfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKKwlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBsZW5ndGg6ICUwOFhcbiIsIG1lbW9yeTMyX2RhdGEtPnJhbmdlX2xlbmd0aCk7CiAKIAlyZXR1cm47CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyCkBAIC00OTgsMzMgKzQzOSwyOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMiAgICAqZml4ZWRfbWVtb3J5MzJfZGF0YSA9Ci0JCQkgICAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIgKikgZGF0YTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMiAqZml4ZWRfbWVtb3J5MzJfZGF0YSA9CisJICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMiAqKWRhdGE7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOworCWFjcGlfb3NfcHJpbnRmKCIzMi1CaXQgRml4ZWQgTG9jYXRpb24gTWVtb3J5IFJhbmdlIFJlc291cmNlXG4iKTsKIAorCWFjcGlfb3NfcHJpbnRmKCIgIFJlYWQlc1xuIiwKKwkJICAgICAgIEFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KKwkJICAgICAgIGZpeGVkX21lbW9yeTMyX2RhdGEtPgorCQkgICAgICAgcmVhZF93cml0ZV9hdHRyaWJ1dGUgPyAiL1dyaXRlIiA6ICIgT25seSIpOwogCi0JYWNwaV9vc19wcmludGYgKCIzMi1CaXQgRml4ZWQgTG9jYXRpb24gTWVtb3J5IFJhbmdlIFJlc291cmNlXG4iKTsKKwlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBiYXNlIGFkZHJlc3M6ICUwOFhcbiIsCisJCSAgICAgICBmaXhlZF9tZW1vcnkzMl9kYXRhLT5yYW5nZV9iYXNlX2FkZHJlc3MpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJlYWQlc1xuIiwKLQkJQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQotCQkJZml4ZWRfbWVtb3J5MzJfZGF0YS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUgPyAiL1dyaXRlIiA6ICIgT25seSIpOwotCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGJhc2UgYWRkcmVzczogJTA4WFxuIiwKLQkJZml4ZWRfbWVtb3J5MzJfZGF0YS0+cmFuZ2VfYmFzZV9hZGRyZXNzKTsKLQotCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBsZW5ndGg6ICUwOFhcbiIsCi0JCWZpeGVkX21lbW9yeTMyX2RhdGEtPnJhbmdlX2xlbmd0aCk7CisJYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYXG4iLAorCQkgICAgICAgZml4ZWRfbWVtb3J5MzJfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKIAogCXJldHVybjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfYWRkcmVzczE2CkBAIC01MzcsMTM0ICs0NzQsMTM2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9hZGRyZXNzMTYgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfYWRkcmVzczE2KHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYgKmFkZHJlc3MxNl9kYXRhID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiAqKSBkYXRhOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiAqYWRkcmVzczE2X2RhdGEgPQorCSAgICAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2ICopZGF0YTsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCWFjcGlfb3NfcHJpbnRmICgiMTYtQml0IEFkZHJlc3MgU3BhY2UgUmVzb3VyY2VcbiIpOwotCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiAiKTsKKwlhY3BpX29zX3ByaW50ZigiMTYtQml0IEFkZHJlc3MgU3BhY2UgUmVzb3VyY2VcbiIpOworCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFR5cGU6ICIpOwogCiAJc3dpdGNoIChhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2VfdHlwZSkgewogCWNhc2UgQUNQSV9NRU1PUllfUkFOR0U6CiAKLQkJYWNwaV9vc19wcmludGYgKCJNZW1vcnkgUmFuZ2VcbiIpOworCQlhY3BpX29zX3ByaW50ZigiTWVtb3J5IFJhbmdlXG4iKTsKIAogCQlzd2l0Y2ggKGFkZHJlc3MxNl9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LmNhY2hlX2F0dHJpYnV0ZSkgewogCQljYXNlIEFDUElfTk9OX0NBQ0hFQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogTm9uY2FjaGVhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBOb25jYWNoZWFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9DQUNIQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogQ2FjaGVhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZigiICBUeXBlIFNwZWNpZmljOiBDYWNoZWFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9XUklURV9DT01CSU5JTkdfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFdyaXRlLWNvbWJpbmluZyBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogV3JpdGUtY29tYmluaW5nIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUFJFRkVUQ0hBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBQcmVmZXRjaGFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IFByZWZldGNoYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIGNhY2hlIGF0dHJpYnV0ZVxuIik7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIGNhY2hlIGF0dHJpYnV0ZVxuIik7CiAJCQlicmVhazsKIAkJfQogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBSZWFkJXNcbiIsCi0JCQlBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09Ci0JCQkJYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkucmVhZF93cml0ZV9hdHRyaWJ1dGUgPwotCQkJCSIvV3JpdGUiIDogIiBPbmx5Iik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6IFJlYWQlc1xuIiwKKwkJCSAgICAgICBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09CisJCQkgICAgICAgYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkuCisJCQkgICAgICAgcmVhZF93cml0ZV9hdHRyaWJ1dGUgPyAiL1dyaXRlIiA6ICIgT25seSIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9JT19SQU5HRToKIAotCQlhY3BpX29zX3ByaW50ZiAoIkkvTyBSYW5nZVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCJJL08gUmFuZ2VcbiIpOwogCiAJCXN3aXRjaCAoYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5pby5yYW5nZV9hdHRyaWJ1dGUpIHsKIAkJY2FzZSBBQ1BJX05PTl9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0VOVElSRV9SQU5HRToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBhbmQgbm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIHJhbmdlIGF0dHJpYnV0ZVxuIik7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIHJhbmdlIGF0dHJpYnV0ZVxuIik7CiAJCQlicmVhazsKIAkJfQogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAlcyBUcmFuc2xhdGlvblxuIiwKLQkJCUFDUElfU1BBUlNFX1RSQU5TTEFUSU9OID09Ci0JCQkJYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPwotCQkJCSJTcGFyc2UiIDogIkRlbnNlIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6ICVzIFRyYW5zbGF0aW9uXG4iLAorCQkJICAgICAgIEFDUElfU1BBUlNFX1RSQU5TTEFUSU9OID09CisJCQkgICAgICAgYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5pby4KKwkJCSAgICAgICB0cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPyAiU3BhcnNlIiA6ICJEZW5zZSIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9CVVNfTlVNQkVSX1JBTkdFOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiQnVzIE51bWJlciBSYW5nZVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCJCdXMgTnVtYmVyIFJhbmdlXG4iKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCi0JCWFjcGlfb3NfcHJpbnRmICgiMHglMi4yWFxuIiwgYWRkcmVzczE2X2RhdGEtPnJlc291cmNlX3R5cGUpOworCQlhY3BpX29zX3ByaW50ZigiMHglMi4yWFxuIiwgYWRkcmVzczE2X2RhdGEtPnJlc291cmNlX3R5cGUpOwogCQlicmVhazsKIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgJXNcbiIsCi0JCUFDUElfQ09OU1VNRVIgPT0gYWRkcmVzczE2X2RhdGEtPnByb2R1Y2VyX2NvbnN1bWVyID8KLQkJCSJDb25zdW1lciIgOiAiUHJvZHVjZXIiKTsKKwlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSAlc1xuIiwKKwkJICAgICAgIEFDUElfQ09OU1VNRVIgPT0gYWRkcmVzczE2X2RhdGEtPnByb2R1Y2VyX2NvbnN1bWVyID8KKwkJICAgICAgICJDb25zdW1lciIgOiAiUHJvZHVjZXIiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICAlcyBkZWNvZGVcbiIsCi0JCUFDUElfU1VCX0RFQ09ERSA9PSBhZGRyZXNzMTZfZGF0YS0+ZGVjb2RlID8KLQkJCSJTdWJ0cmFjdGl2ZSIgOiAiUG9zaXRpdmUiKTsKKwlhY3BpX29zX3ByaW50ZigiICAlcyBkZWNvZGVcbiIsCisJCSAgICAgICBBQ1BJX1NVQl9ERUNPREUgPT0gYWRkcmVzczE2X2RhdGEtPmRlY29kZSA/CisJCSAgICAgICAiU3VidHJhY3RpdmUiIDogIlBvc2l0aXZlIik7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgTWluIGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCi0JCUFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMTZfZGF0YS0+bWluX2FkZHJlc3NfZml4ZWQgPwotCQkJIiIgOiAibm90Iik7CisJYWNwaV9vc19wcmludGYoIiAgTWluIGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCisJCSAgICAgICBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczE2X2RhdGEtPm1pbl9hZGRyZXNzX2ZpeGVkID8KKwkJICAgICAgICIiIDogIm5vdCIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIE1heCBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQlBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczE2X2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KLQkJCSIiIDogIm5vdCIpOworCWFjcGlfb3NfcHJpbnRmKCIgIE1heCBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAorCQkgICAgICAgQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MxNl9kYXRhLT5tYXhfYWRkcmVzc19maXhlZCA/CisJCSAgICAgICAiIiA6ICJub3QiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBHcmFudWxhcml0eTogJTA4WFxuIiwKLQkJYWRkcmVzczE2X2RhdGEtPmdyYW51bGFyaXR5KTsKKwlhY3BpX29zX3ByaW50ZigiICBHcmFudWxhcml0eTogJTA4WFxuIiwgYWRkcmVzczE2X2RhdGEtPmdyYW51bGFyaXR5KTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHJhbmdlIG1pbjogJTA4WFxuIiwKLQkJYWRkcmVzczE2X2RhdGEtPm1pbl9hZGRyZXNzX3JhbmdlKTsKKwlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHJhbmdlIG1pbjogJTA4WFxuIiwKKwkJICAgICAgIGFkZHJlc3MxNl9kYXRhLT5taW5fYWRkcmVzc19yYW5nZSk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyByYW5nZSBtYXg6ICUwOFhcbiIsCi0JCWFkZHJlc3MxNl9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSk7CisJYWNwaV9vc19wcmludGYoIiAgQWRkcmVzcyByYW5nZSBtYXg6ICUwOFhcbiIsCisJCSAgICAgICBhZGRyZXNzMTZfZGF0YS0+bWF4X2FkZHJlc3NfcmFuZ2UpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0OiAlMDhYXG4iLAotCQlhZGRyZXNzMTZfZGF0YS0+YWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0OiAlMDhYXG4iLAorCQkgICAgICAgYWRkcmVzczE2X2RhdGEtPmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIExlbmd0aDogJTA4WFxuIiwKLQkJYWRkcmVzczE2X2RhdGEtPmFkZHJlc3NfbGVuZ3RoKTsKKwlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIExlbmd0aDogJTA4WFxuIiwKKwkJICAgICAgIGFkZHJlc3MxNl9kYXRhLT5hZGRyZXNzX2xlbmd0aCk7CiAKIAlpZiAoMHhGRiAhPSBhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KSB7Ci0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBTb3VyY2UgSW5kZXg6ICVYXG4iLAotCQkJYWRkcmVzczE2X2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVhcbiIsCisJCQkgICAgICAgYWRkcmVzczE2X2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZTogJXNcbiIsCi0JCQlhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOworCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBTb3VyY2U6ICVzXG4iLAorCQkJICAgICAgIGFkZHJlc3MxNl9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CiAJfQogCiAJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9hZGRyZXNzMzIKQEAgLTY3NywxMzQgKzYxNiwxMzYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX2FkZHJlc3MzMiAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9hZGRyZXNzMzIodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiAqYWRkcmVzczMyX2RhdGEgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyICopIGRhdGE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyICphZGRyZXNzMzJfZGF0YSA9CisJICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIgKilkYXRhOwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JYWNwaV9vc19wcmludGYgKCIzMi1CaXQgQWRkcmVzcyBTcGFjZSBSZXNvdXJjZVxuIik7CisJYWNwaV9vc19wcmludGYoIjMyLUJpdCBBZGRyZXNzIFNwYWNlIFJlc291cmNlXG4iKTsKIAogCXN3aXRjaCAoYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3R5cGUpIHsKIAljYXNlIEFDUElfTUVNT1JZX1JBTkdFOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiBNZW1vcnkgUmFuZ2VcbiIpOworCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBUeXBlOiBNZW1vcnkgUmFuZ2VcbiIpOwogCiAJCXN3aXRjaCAoYWRkcmVzczMyX2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlKSB7CiAJCWNhc2UgQUNQSV9OT05fQ0FDSEVBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBOb25jYWNoZWFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbmNhY2hlYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0NBQ0hBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBDYWNoZWFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6IENhY2hlYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1dSSVRFX0NPTUJJTklOR19NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogV3JpdGUtY29tYmluaW5nIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBXcml0ZS1jb21iaW5pbmcgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9QUkVGRVRDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFByZWZldGNoYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogUHJlZmV0Y2hhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgY2FjaGUgYXR0cmlidXRlXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgY2FjaGUgYXR0cmlidXRlXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFJlYWQlc1xuIiwKLQkJCUFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KLQkJCQlhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/Ci0JCQkJIi9Xcml0ZSIgOiAiIE9ubHkiKTsKKwkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogUmVhZCVzXG4iLAorCQkJICAgICAgIEFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KKwkJCSAgICAgICBhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS4KKwkJCSAgICAgICByZWFkX3dyaXRlX2F0dHJpYnV0ZSA/ICIvV3JpdGUiIDogIiBPbmx5Iik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0lPX1JBTkdFOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiBJbyBSYW5nZVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFR5cGU6IElvIFJhbmdlXG4iKTsKIAogCQlzd2l0Y2ggKGFkZHJlc3MzMl9kYXRhLT5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlKSB7CiAJCWNhc2UgQUNQSV9OT05fSVNBX09OTFlfUkFOR0VTOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZigiICBUeXBlIFNwZWNpZmljOiBJU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9FTlRJUkVfUkFOR0U6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSVNBIGFuZCBub24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBSYW5nZSBhdHRyaWJ1dGUiKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgUmFuZ2UgYXR0cmlidXRlIik7CiAJCQlicmVhazsKIAkJfQogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAlcyBUcmFuc2xhdGlvblxuIiwKLQkJCUFDUElfU1BBUlNFX1RSQU5TTEFUSU9OID09Ci0JCQkJYWRkcmVzczMyX2RhdGEtPmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPwotCQkJCSJTcGFyc2UiIDogIkRlbnNlIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6ICVzIFRyYW5zbGF0aW9uXG4iLAorCQkJICAgICAgIEFDUElfU1BBUlNFX1RSQU5TTEFUSU9OID09CisJCQkgICAgICAgYWRkcmVzczMyX2RhdGEtPmF0dHJpYnV0ZS5pby4KKwkJCSAgICAgICB0cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPyAiU3BhcnNlIiA6ICJEZW5zZSIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9CVVNfTlVNQkVSX1JBTkdFOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiBCdXMgTnVtYmVyIFJhbmdlXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgVHlwZTogQnVzIE51bWJlciBSYW5nZVxuIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAotCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgVHlwZTogMHglMi4yWFxuIiwKLQkJCWFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV90eXBlKTsKKwkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgVHlwZTogMHglMi4yWFxuIiwKKwkJCSAgICAgICBhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2VfdHlwZSk7CiAJCWJyZWFrOwogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSAlc1xuIiwKLQkJQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzMzJfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPwotCQkJIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOworCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlICVzXG4iLAorCQkgICAgICAgQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzMzJfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPworCQkgICAgICAgIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgICVzIGRlY29kZVxuIiwKLQkJQUNQSV9TVUJfREVDT0RFID09IGFkZHJlc3MzMl9kYXRhLT5kZWNvZGUgPwotCQkJIlN1YnRyYWN0aXZlIiA6ICJQb3NpdGl2ZSIpOworCWFjcGlfb3NfcHJpbnRmKCIgICVzIGRlY29kZVxuIiwKKwkJICAgICAgIEFDUElfU1VCX0RFQ09ERSA9PSBhZGRyZXNzMzJfZGF0YS0+ZGVjb2RlID8KKwkJICAgICAgICJTdWJ0cmFjdGl2ZSIgOiAiUG9zaXRpdmUiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBNaW4gYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MzMl9kYXRhLT5taW5fYWRkcmVzc19maXhlZCA/Ci0JCQkiIiA6ICJub3QgIik7CisJYWNwaV9vc19wcmludGYoIiAgTWluIGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCisJCSAgICAgICBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczMyX2RhdGEtPm1pbl9hZGRyZXNzX2ZpeGVkID8KKwkJICAgICAgICIiIDogIm5vdCAiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBNYXggYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MzMl9kYXRhLT5tYXhfYWRkcmVzc19maXhlZCA/Ci0JCQkiIiA6ICJub3QgIik7CisJYWNwaV9vc19wcmludGYoIiAgTWF4IGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCisJCSAgICAgICBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczMyX2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KKwkJICAgICAgICIiIDogIm5vdCAiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBHcmFudWxhcml0eTogJTA4WFxuIiwKLQkJYWRkcmVzczMyX2RhdGEtPmdyYW51bGFyaXR5KTsKKwlhY3BpX29zX3ByaW50ZigiICBHcmFudWxhcml0eTogJTA4WFxuIiwgYWRkcmVzczMyX2RhdGEtPmdyYW51bGFyaXR5KTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHJhbmdlIG1pbjogJTA4WFxuIiwKLQkJYWRkcmVzczMyX2RhdGEtPm1pbl9hZGRyZXNzX3JhbmdlKTsKKwlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHJhbmdlIG1pbjogJTA4WFxuIiwKKwkJICAgICAgIGFkZHJlc3MzMl9kYXRhLT5taW5fYWRkcmVzc19yYW5nZSk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyByYW5nZSBtYXg6ICUwOFhcbiIsCi0JCWFkZHJlc3MzMl9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSk7CisJYWNwaV9vc19wcmludGYoIiAgQWRkcmVzcyByYW5nZSBtYXg6ICUwOFhcbiIsCisJCSAgICAgICBhZGRyZXNzMzJfZGF0YS0+bWF4X2FkZHJlc3NfcmFuZ2UpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0OiAlMDhYXG4iLAotCQlhZGRyZXNzMzJfZGF0YS0+YWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0OiAlMDhYXG4iLAorCQkgICAgICAgYWRkcmVzczMyX2RhdGEtPmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIExlbmd0aDogJTA4WFxuIiwKLQkJYWRkcmVzczMyX2RhdGEtPmFkZHJlc3NfbGVuZ3RoKTsKKwlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIExlbmd0aDogJTA4WFxuIiwKKwkJICAgICAgIGFkZHJlc3MzMl9kYXRhLT5hZGRyZXNzX2xlbmd0aCk7CiAKLQlpZigweEZGICE9IGFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpIHsKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVhcbiIsCi0JCQlhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKKwlpZiAoMHhGRiAhPSBhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KSB7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVhcbiIsCisJCQkgICAgICAgYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZTogJXNcbiIsCi0JCQlhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOworCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBTb3VyY2U6ICVzXG4iLAorCQkJICAgICAgIGFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CiAJfQogCiAJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9hZGRyZXNzNjQKQEAgLTgxNywxMzcgKzc1OCwxNDIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX2FkZHJlc3M2NCAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9hZGRyZXNzNjQodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCAqYWRkcmVzczY0X2RhdGEgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0ICopIGRhdGE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0ICphZGRyZXNzNjRfZGF0YSA9CisJICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgKilkYXRhOwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JYWNwaV9vc19wcmludGYgKCI2NC1CaXQgQWRkcmVzcyBTcGFjZSBSZXNvdXJjZVxuIik7CisJYWNwaV9vc19wcmludGYoIjY0LUJpdCBBZGRyZXNzIFNwYWNlIFJlc291cmNlXG4iKTsKIAogCXN3aXRjaCAoYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3R5cGUpIHsKIAljYXNlIEFDUElfTUVNT1JZX1JBTkdFOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiBNZW1vcnkgUmFuZ2VcbiIpOworCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBUeXBlOiBNZW1vcnkgUmFuZ2VcbiIpOwogCiAJCXN3aXRjaCAoYWRkcmVzczY0X2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlKSB7CiAJCWNhc2UgQUNQSV9OT05fQ0FDSEVBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBOb25jYWNoZWFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbmNhY2hlYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0NBQ0hBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBDYWNoZWFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6IENhY2hlYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1dSSVRFX0NPTUJJTklOR19NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogV3JpdGUtY29tYmluaW5nIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBXcml0ZS1jb21iaW5pbmcgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9QUkVGRVRDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFByZWZldGNoYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogUHJlZmV0Y2hhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgY2FjaGUgYXR0cmlidXRlXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgY2FjaGUgYXR0cmlidXRlXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFJlYWQlc1xuIiwKLQkJCUFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KLQkJCQlhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/Ci0JCQkJIi9Xcml0ZSIgOiAiIE9ubHkiKTsKKwkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogUmVhZCVzXG4iLAorCQkJICAgICAgIEFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KKwkJCSAgICAgICBhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS4KKwkJCSAgICAgICByZWFkX3dyaXRlX2F0dHJpYnV0ZSA/ICIvV3JpdGUiIDogIiBPbmx5Iik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0lPX1JBTkdFOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiBJbyBSYW5nZVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFR5cGU6IElvIFJhbmdlXG4iKTsKIAogCQlzd2l0Y2ggKGFkZHJlc3M2NF9kYXRhLT5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlKSB7CiAJCWNhc2UgQUNQSV9OT05fSVNBX09OTFlfUkFOR0VTOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZigiICBUeXBlIFNwZWNpZmljOiBJU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9FTlRJUkVfUkFOR0U6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSVNBIGFuZCBub24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBSYW5nZSBhdHRyaWJ1dGUiKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgUmFuZ2UgYXR0cmlidXRlIik7CiAJCQlicmVhazsKIAkJfQogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAlcyBUcmFuc2xhdGlvblxuIiwKLQkJCUFDUElfU1BBUlNFX1RSQU5TTEFUSU9OID09Ci0JCQkJYWRkcmVzczY0X2RhdGEtPmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPwotCQkJCSJTcGFyc2UiIDogIkRlbnNlIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6ICVzIFRyYW5zbGF0aW9uXG4iLAorCQkJICAgICAgIEFDUElfU1BBUlNFX1RSQU5TTEFUSU9OID09CisJCQkgICAgICAgYWRkcmVzczY0X2RhdGEtPmF0dHJpYnV0ZS5pby4KKwkJCSAgICAgICB0cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPyAiU3BhcnNlIiA6ICJEZW5zZSIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9CVVNfTlVNQkVSX1JBTkdFOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiBCdXMgTnVtYmVyIFJhbmdlXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgVHlwZTogQnVzIE51bWJlciBSYW5nZVxuIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAotCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgVHlwZTogMHglMi4yWFxuIiwKLQkJCWFkZHJlc3M2NF9kYXRhLT5yZXNvdXJjZV90eXBlKTsKKwkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgVHlwZTogMHglMi4yWFxuIiwKKwkJCSAgICAgICBhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2VfdHlwZSk7CiAJCWJyZWFrOwogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSAlc1xuIiwKLQkJQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzNjRfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPwotCQkJIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOworCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlICVzXG4iLAorCQkgICAgICAgQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzNjRfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPworCQkgICAgICAgIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgICVzIGRlY29kZVxuIiwKLQkJQUNQSV9TVUJfREVDT0RFID09IGFkZHJlc3M2NF9kYXRhLT5kZWNvZGUgPwotCQkJIlN1YnRyYWN0aXZlIiA6ICJQb3NpdGl2ZSIpOworCWFjcGlfb3NfcHJpbnRmKCIgICVzIGRlY29kZVxuIiwKKwkJICAgICAgIEFDUElfU1VCX0RFQ09ERSA9PSBhZGRyZXNzNjRfZGF0YS0+ZGVjb2RlID8KKwkJICAgICAgICJTdWJ0cmFjdGl2ZSIgOiAiUG9zaXRpdmUiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBNaW4gYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3M2NF9kYXRhLT5taW5fYWRkcmVzc19maXhlZCA/Ci0JCQkiIiA6ICJub3QgIik7CisJYWNwaV9vc19wcmludGYoIiAgTWluIGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCisJCSAgICAgICBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczY0X2RhdGEtPm1pbl9hZGRyZXNzX2ZpeGVkID8KKwkJICAgICAgICIiIDogIm5vdCAiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBNYXggYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3M2NF9kYXRhLT5tYXhfYWRkcmVzc19maXhlZCA/Ci0JCQkiIiA6ICJub3QgIik7CisJYWNwaV9vc19wcmludGYoIiAgTWF4IGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCisJCSAgICAgICBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczY0X2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KKwkJICAgICAgICIiIDogIm5vdCAiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBHcmFudWxhcml0eTogJTguOFglOC44WFxuIiwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+Z3JhbnVsYXJpdHkpKTsKKwlhY3BpX29zX3ByaW50ZigiICBHcmFudWxhcml0eTogJTguOFglOC44WFxuIiwKKwkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjRfZGF0YS0+Z3JhbnVsYXJpdHkpKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHJhbmdlIG1pbjogJTguOFglOC44WFxuIiwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+bWluX2FkZHJlc3NfcmFuZ2UpKTsKKwlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHJhbmdlIG1pbjogJTguOFglOC44WFxuIiwKKwkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjRfZGF0YS0+bWluX2FkZHJlc3NfcmFuZ2UpKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHJhbmdlIG1heDogJTguOFglOC44WFxuIiwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+bWF4X2FkZHJlc3NfcmFuZ2UpKTsKKwlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHJhbmdlIG1heDogJTguOFglOC44WFxuIiwKKwkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjRfZGF0YS0+bWF4X2FkZHJlc3NfcmFuZ2UpKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldDogJTguOFglOC44WFxuIiwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+YWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpKTsKKwlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldDogJTguOFglOC44WFxuIiwKKwkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjRfZGF0YS0+CisJCQkJCSAgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIExlbmd0aDogJTguOFglOC44WFxuIiwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+YWRkcmVzc19sZW5ndGgpKTsKKwlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIExlbmd0aDogJTguOFglOC44WFxuIiwKKwkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjRfZGF0YS0+YWRkcmVzc19sZW5ndGgpKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljIEF0dHJpYnV0ZXM6ICU4LjhYJTguOFhcbiIsCi0JCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPnR5cGVfc3BlY2lmaWNfYXR0cmlidXRlcykpOworCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWMgQXR0cmlidXRlczogJTguOFglOC44WFxuIiwKKwkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjRfZGF0YS0+CisJCQkJCSAgdHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzKSk7CiAKIAlpZiAoMHhGRiAhPSBhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KSB7Ci0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBTb3VyY2UgSW5kZXg6ICVYXG4iLAotCQkJYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVhcbiIsCisJCQkgICAgICAgYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZTogJXNcbiIsCi0JCQlhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOworCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBTb3VyY2U6ICVzXG4iLAorCQkJICAgICAgIGFkZHJlc3M2NF9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CiAJfQogCiAJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9leHRlbmRlZF9pcnEKQEAgLTk2MCw1NSArOTA2LDUyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9leHRlbmRlZF9pcnEgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfZXh0ZW5kZWRfaXJxKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxICAgICpleHRfaXJxX2RhdGEgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSAqKSBkYXRhOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEgKmV4dF9pcnFfZGF0YSA9CisJICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxICopZGF0YTsKKwl1OCBpbmRleCA9IDA7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOworCWFjcGlfb3NfcHJpbnRmKCJFeHRlbmRlZCBJUlEgUmVzb3VyY2VcbiIpOwogCisJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgJXNcbiIsCisJCSAgICAgICBBQ1BJX0NPTlNVTUVSID09IGV4dF9pcnFfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPworCQkgICAgICAgIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOwogCi0JYWNwaV9vc19wcmludGYgKCJFeHRlbmRlZCBJUlEgUmVzb3VyY2VcbiIpOworCWFjcGlfb3NfcHJpbnRmKCIgICVzXG4iLAorCQkgICAgICAgQUNQSV9MRVZFTF9TRU5TSVRJVkUgPT0gZXh0X2lycV9kYXRhLT5lZGdlX2xldmVsID8KKwkJICAgICAgICJMZXZlbCIgOiAiRWRnZSIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlICVzXG4iLAotCQlBQ1BJX0NPTlNVTUVSID09IGV4dF9pcnFfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPwotCQkJIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFjdGl2ZSAlc1xuIiwKKwkJICAgICAgIEFDUElfQUNUSVZFX0xPVyA9PSBleHRfaXJxX2RhdGEtPmFjdGl2ZV9oaWdoX2xvdyA/CisJCSAgICAgICAibG93IiA6ICJoaWdoIik7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgJXNcbiIsCi0JCUFDUElfTEVWRUxfU0VOU0lUSVZFID09IGV4dF9pcnFfZGF0YS0+ZWRnZV9sZXZlbCA/Ci0JCQkiTGV2ZWwiIDogIkVkZ2UiKTsKKwlhY3BpX29zX3ByaW50ZigiICAlc1xuIiwKKwkJICAgICAgIEFDUElfU0hBUkVEID09IGV4dF9pcnFfZGF0YS0+c2hhcmVkX2V4Y2x1c2l2ZSA/CisJCSAgICAgICAiU2hhcmVkIiA6ICJFeGNsdXNpdmUiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBY3RpdmUgJXNcbiIsCi0JCUFDUElfQUNUSVZFX0xPVyA9PSBleHRfaXJxX2RhdGEtPmFjdGl2ZV9oaWdoX2xvdyA/Ci0JCQkibG93IiA6ICJoaWdoIik7Ci0KLQlhY3BpX29zX3ByaW50ZiAoIiAgJXNcbiIsCi0JCUFDUElfU0hBUkVEID09IGV4dF9pcnFfZGF0YS0+c2hhcmVkX2V4Y2x1c2l2ZSA/Ci0JCQkiU2hhcmVkIiA6ICJFeGNsdXNpdmUiKTsKLQotCWFjcGlfb3NfcHJpbnRmICgiICBJbnRlcnJ1cHRzIDogJVggKCAiLCBleHRfaXJxX2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKTsKKwlhY3BpX29zX3ByaW50ZigiICBJbnRlcnJ1cHRzIDogJVggKCAiLAorCQkgICAgICAgZXh0X2lycV9kYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0cyk7CiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBleHRfaXJxX2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzOyBpbmRleCsrKSB7Ci0JCWFjcGlfb3NfcHJpbnRmICgiJVggIiwgZXh0X2lycV9kYXRhLT5pbnRlcnJ1cHRzW2luZGV4XSk7CisJCWFjcGlfb3NfcHJpbnRmKCIlWCAiLCBleHRfaXJxX2RhdGEtPmludGVycnVwdHNbaW5kZXhdKTsKIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIilcbiIpOworCWFjcGlfb3NfcHJpbnRmKCIpXG4iKTsKIAotCWlmKDB4RkYgIT0gZXh0X2lycV9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpIHsKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVgiLAotCQkJZXh0X2lycV9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpOworCWlmICgweEZGICE9IGV4dF9pcnFfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KSB7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVgiLAorCQkJICAgICAgIGV4dF9pcnFfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKIAotCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlOiAlcyIsCi0JCQlleHRfaXJxX2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKKwkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgU291cmNlOiAlcyIsCisJCQkgICAgICAgZXh0X2lycV9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CiAJfQogCiAJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0CkBAIC0xMDIxLDkyICs5NjQsOTEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3JzX2R1bXBfcmVzb3VyY2VfbGlzdCAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICpyZXNvdXJjZSkKK3ZvaWQgYWNwaV9yc19kdW1wX3Jlc291cmNlX2xpc3Qoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBGQUxTRTsKKwl1OCBjb3VudCA9IDA7CisJdTggZG9uZSA9IEZBTFNFOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJaWYgKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9SRVNPVVJDRVMgJiYgX0NPTVBPTkVOVCAmIGFjcGlfZGJnX2xheWVyKSB7CiAJCXdoaWxlICghZG9uZSkgewotCQkJYWNwaV9vc19wcmludGYgKCJSZXNvdXJjZSBzdHJ1Y3R1cmUgJVguXG4iLCBjb3VudCsrKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJSZXNvdXJjZSBzdHJ1Y3R1cmUgJVguXG4iLCBjb3VudCsrKTsKIAogCQkJc3dpdGNoIChyZXNvdXJjZS0+aWQpIHsKIAkJCWNhc2UgQUNQSV9SU1RZUEVfSVJROgotCQkJCWFjcGlfcnNfZHVtcF9pcnEgKCZyZXNvdXJjZS0+ZGF0YSk7CisJCQkJYWNwaV9yc19kdW1wX2lycSgmcmVzb3VyY2UtPmRhdGEpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfUlNUWVBFX0RNQToKLQkJCQlhY3BpX3JzX2R1bXBfZG1hICgmcmVzb3VyY2UtPmRhdGEpOworCQkJCWFjcGlfcnNfZHVtcF9kbWEoJnJlc291cmNlLT5kYXRhKTsKIAkJCQlicmVhazsKIAogCQkJY2FzZSBBQ1BJX1JTVFlQRV9TVEFSVF9EUEY6Ci0JCQkJYWNwaV9yc19kdW1wX3N0YXJ0X2RlcGVuZF9mbnMgKCZyZXNvdXJjZS0+ZGF0YSk7CisJCQkJYWNwaV9yc19kdW1wX3N0YXJ0X2RlcGVuZF9mbnMoJnJlc291cmNlLT5kYXRhKTsKIAkJCQlicmVhazsKIAogCQkJY2FzZSBBQ1BJX1JTVFlQRV9FTkRfRFBGOgotCQkJCWFjcGlfb3NfcHJpbnRmICgiZW5kX2RlcGVuZGVudF9mdW5jdGlvbnMgUmVzb3VyY2VcbiIpOwotCQkJCS8qIGFjcGlfcnNfZHVtcF9lbmRfZGVwZW5kZW50X2Z1bmN0aW9ucyAoUmVzb3VyY2UtPkRhdGEpOyovCisJCQkJYWNwaV9vc19wcmludGYKKwkJCQkgICAgKCJlbmRfZGVwZW5kZW50X2Z1bmN0aW9ucyBSZXNvdXJjZVxuIik7CisJCQkJLyogYWNwaV9yc19kdW1wX2VuZF9kZXBlbmRlbnRfZnVuY3Rpb25zIChSZXNvdXJjZS0+RGF0YSk7ICovCiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9SU1RZUEVfSU86Ci0JCQkJYWNwaV9yc19kdW1wX2lvICgmcmVzb3VyY2UtPmRhdGEpOworCQkJCWFjcGlfcnNfZHVtcF9pbygmcmVzb3VyY2UtPmRhdGEpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfUlNUWVBFX0ZJWEVEX0lPOgotCQkJCWFjcGlfcnNfZHVtcF9maXhlZF9pbyAoJnJlc291cmNlLT5kYXRhKTsKKwkJCQlhY3BpX3JzX2R1bXBfZml4ZWRfaW8oJnJlc291cmNlLT5kYXRhKTsKIAkJCQlicmVhazsKIAogCQkJY2FzZSBBQ1BJX1JTVFlQRV9WRU5ET1I6Ci0JCQkJYWNwaV9yc19kdW1wX3ZlbmRvcl9zcGVjaWZpYyAoJnJlc291cmNlLT5kYXRhKTsKKwkJCQlhY3BpX3JzX2R1bXBfdmVuZG9yX3NwZWNpZmljKCZyZXNvdXJjZS0+ZGF0YSk7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9SU1RZUEVfRU5EX1RBRzoKLQkJCQkvKnJzX2R1bXBfZW5kX3RhZyAoUmVzb3VyY2UtPkRhdGEpOyovCi0JCQkJYWNwaV9vc19wcmludGYgKCJlbmRfdGFnIFJlc291cmNlXG4iKTsKKwkJCQkvKnJzX2R1bXBfZW5kX3RhZyAoUmVzb3VyY2UtPkRhdGEpOyAqLworCQkJCWFjcGlfb3NfcHJpbnRmKCJlbmRfdGFnIFJlc291cmNlXG4iKTsKIAkJCQlkb25lID0gVFJVRTsKIAkJCQlicmVhazsKIAogCQkJY2FzZSBBQ1BJX1JTVFlQRV9NRU0yNDoKLQkJCQlhY3BpX3JzX2R1bXBfbWVtb3J5MjQgKCZyZXNvdXJjZS0+ZGF0YSk7CisJCQkJYWNwaV9yc19kdW1wX21lbW9yeTI0KCZyZXNvdXJjZS0+ZGF0YSk7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9SU1RZUEVfTUVNMzI6Ci0JCQkJYWNwaV9yc19kdW1wX21lbW9yeTMyICgmcmVzb3VyY2UtPmRhdGEpOworCQkJCWFjcGlfcnNfZHVtcF9tZW1vcnkzMigmcmVzb3VyY2UtPmRhdGEpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfUlNUWVBFX0ZJWEVEX01FTTMyOgotCQkJCWFjcGlfcnNfZHVtcF9maXhlZF9tZW1vcnkzMiAoJnJlc291cmNlLT5kYXRhKTsKKwkJCQlhY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIoJnJlc291cmNlLT5kYXRhKTsKIAkJCQlicmVhazsKIAogCQkJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTMTY6Ci0JCQkJYWNwaV9yc19kdW1wX2FkZHJlc3MxNiAoJnJlc291cmNlLT5kYXRhKTsKKwkJCQlhY3BpX3JzX2R1bXBfYWRkcmVzczE2KCZyZXNvdXJjZS0+ZGF0YSk7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzMyOgotCQkJCWFjcGlfcnNfZHVtcF9hZGRyZXNzMzIgKCZyZXNvdXJjZS0+ZGF0YSk7CisJCQkJYWNwaV9yc19kdW1wX2FkZHJlc3MzMigmcmVzb3VyY2UtPmRhdGEpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfUlNUWVBFX0FERFJFU1M2NDoKLQkJCQlhY3BpX3JzX2R1bXBfYWRkcmVzczY0ICgmcmVzb3VyY2UtPmRhdGEpOworCQkJCWFjcGlfcnNfZHVtcF9hZGRyZXNzNjQoJnJlc291cmNlLT5kYXRhKTsKIAkJCQlicmVhazsKIAogCQkJY2FzZSBBQ1BJX1JTVFlQRV9FWFRfSVJROgotCQkJCWFjcGlfcnNfZHVtcF9leHRlbmRlZF9pcnEgKCZyZXNvdXJjZS0+ZGF0YSk7CisJCQkJYWNwaV9yc19kdW1wX2V4dGVuZGVkX2lycSgmcmVzb3VyY2UtPmRhdGEpOwogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCWFjcGlfb3NfcHJpbnRmICgiSW52YWxpZCByZXNvdXJjZSB0eXBlXG4iKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiSW52YWxpZCByZXNvdXJjZSB0eXBlXG4iKTsKIAkJCQlicmVhazsKIAogCQkJfQogCi0JCQlyZXNvdXJjZSA9IEFDUElfUFRSX0FERCAoc3RydWN0IGFjcGlfcmVzb3VyY2UsIHJlc291cmNlLCByZXNvdXJjZS0+bGVuZ3RoKTsKKwkJCXJlc291cmNlID0KKwkJCSAgICBBQ1BJX1BUUl9BREQoc3RydWN0IGFjcGlfcmVzb3VyY2UsIHJlc291cmNlLAorCQkJCQkgcmVzb3VyY2UtPmxlbmd0aCk7CiAJCX0KIAl9CiAKQEAgLTExMjUsMzYgKzEwNjcsMzggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3JzX2R1bXBfaXJxX2xpc3QgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJvdXRlX3RhYmxlKQordm9pZCBhY3BpX3JzX2R1bXBfaXJxX2xpc3QodTggKiByb3V0ZV90YWJsZSkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByb3V0ZV90YWJsZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBGQUxTRTsKLQlzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSAgICpwcnRfZWxlbWVudDsKKwl1OCAqYnVmZmVyID0gcm91dGVfdGFibGU7CisJdTggY291bnQgPSAwOworCXU4IGRvbmUgPSBGQUxTRTsKKwlzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSAqcHJ0X2VsZW1lbnQ7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAlpZiAoYWNwaV9kYmdfbGV2ZWwgJiBBQ1BJX0xWX1JFU09VUkNFUyAmJiBfQ09NUE9ORU5UICYgYWNwaV9kYmdfbGF5ZXIpIHsKLQkJcHJ0X2VsZW1lbnQgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSwgYnVmZmVyKTsKKwkJcHJ0X2VsZW1lbnQgPQorCQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSwgYnVmZmVyKTsKIAogCQl3aGlsZSAoIWRvbmUpIHsKLQkJCWFjcGlfb3NfcHJpbnRmICgiUENJIElSUSBSb3V0aW5nIFRhYmxlIHN0cnVjdHVyZSAlWC5cbiIsIGNvdW50KyspOworCQkJYWNwaV9vc19wcmludGYoIlBDSSBJUlEgUm91dGluZyBUYWJsZSBzdHJ1Y3R1cmUgJVguXG4iLAorCQkJCSAgICAgICBjb3VudCsrKTsKIAotCQkJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3M6ICU4LjhYJTguOFhcbiIsCi0JCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChwcnRfZWxlbWVudC0+YWRkcmVzcykpOworCQkJYWNwaV9vc19wcmludGYoIiAgQWRkcmVzczogJTguOFglOC44WFxuIiwKKwkJCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KHBydF9lbGVtZW50LT4KKwkJCQkJCQkgIGFkZHJlc3MpKTsKIAotCQkJYWNwaV9vc19wcmludGYgKCIgIFBpbjogJVhcbiIsIHBydF9lbGVtZW50LT5waW4pOworCQkJYWNwaV9vc19wcmludGYoIiAgUGluOiAlWFxuIiwgcHJ0X2VsZW1lbnQtPnBpbik7CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBTb3VyY2U6ICVzXG4iLCBwcnRfZWxlbWVudC0+c291cmNlKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIgIFNvdXJjZTogJXNcbiIsIHBydF9lbGVtZW50LT5zb3VyY2UpOwogCi0JCQlhY3BpX29zX3ByaW50ZiAoIiAgc291cmNlX2luZGV4OiAlWFxuIiwgcHJ0X2VsZW1lbnQtPnNvdXJjZV9pbmRleCk7CisJCQlhY3BpX29zX3ByaW50ZigiICBzb3VyY2VfaW5kZXg6ICVYXG4iLAorCQkJCSAgICAgICBwcnRfZWxlbWVudC0+c291cmNlX2luZGV4KTsKIAogCQkJYnVmZmVyICs9IHBydF9lbGVtZW50LT5sZW5ndGg7Ci0JCQlwcnRfZWxlbWVudCA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLCBidWZmZXIpOworCQkJcHJ0X2VsZW1lbnQgPQorCQkJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUsCisJCQkJCSAgYnVmZmVyKTsKIAkJCWlmICgwID09IHBydF9lbGVtZW50LT5sZW5ndGgpIHsKIAkJCQlkb25lID0gVFJVRTsKIAkJCX0KQEAgLTExNjUsNCArMTEwOSwzIEBACiB9CiAKICNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaW8uYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpby5jCmluZGV4IDIzYTRkMTQuLmQ1M2JiZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpby5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpby5jCkBAIC00MSwxMyArNDEsMTEgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJyc2lvIikKLQorQUNQSV9NT0RVTEVfTkFNRSgicnNpbyIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjksMjQgKzY3LDE4IEBACiAgKiAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2lvX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpCithY3BpX3JzX2lvX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkgICAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCSAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAotCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyk7CisJdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7CisJdTE2IHRlbXAxNiA9IDA7CisJdTggdGVtcDggPSAwOworCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvKTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2lvX3Jlc291cmNlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19pb19yZXNvdXJjZSIpOwogCiAJLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgQ29uc3RhbnQgKi8KIApAQCAtMTA0LDE0ICs5NiwxNCBAQAogCS8qIENoZWNrIG1pbl9iYXNlIEFkZHJlc3MgKi8KIAogCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaW8ubWluX2Jhc2VfYWRkcmVzcyA9IHRlbXAxNjsKIAogCS8qIENoZWNrIG1heF9iYXNlIEFkZHJlc3MgKi8KIAogCWJ1ZmZlciArPSAyOwotCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaW8ubWF4X2Jhc2VfYWRkcmVzcyA9IHRlbXAxNjsKIApAQCAtMTM2LDEwICsxMjgsOSBAQAogCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCiAKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZml4ZWRfaW9fcmVzb3VyY2UKQEAgLTE2MiwyMiArMTUzLDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19maXhlZF9pb19yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKQorYWNwaV9yc19maXhlZF9pb19yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCi0JCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvKTsKKwl1OCAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKKwl1MTYgdGVtcDE2ID0gMDsKKwl1OCB0ZW1wOCA9IDA7CisJYWNwaV9zaXplIHN0cnVjdF9zaXplID0KKwkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8pOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZml4ZWRfaW9fcmVzb3VyY2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2ZpeGVkX2lvX3Jlc291cmNlIik7CiAKIAkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBDb25zdGFudCAqLwogCkBAIC0xODgsNyArMTc1LDcgQEAKIAkvKiBDaGVjayBSYW5nZSBCYXNlIEFkZHJlc3MgKi8KIAogCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZml4ZWRfaW8uYmFzZV9hZGRyZXNzID0gdGVtcDE2OwogCkBAIC0yMDYsMTAgKzE5Myw5IEBACiAJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KIAogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19pb19zdHJlYW0KQEAgLTIyNywxOCArMjEzLDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19pb19zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKQorYWNwaV9yc19pb19zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKKwl1OCAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7CisJdTE2IHRlbXAxNiA9IDA7CisJdTggdGVtcDggPSAwOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfaW9fc3RyZWFtIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19pb19zdHJlYW0iKTsKIAogCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLwogCkBAIC0yNTYsMTQgKzIzOCwxNCBAQAogCiAJdGVtcDE2ID0gKHUxNikgbGlua2VkX2xpc3QtPmRhdGEuaW8ubWluX2Jhc2VfYWRkcmVzczsKIAotCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgUmFuZ2UgbWF4aW11bSBiYXNlIGFkZHJlc3MgKi8KIAogCXRlbXAxNiA9ICh1MTYpIGxpbmtlZF9saXN0LT5kYXRhLmlvLm1heF9iYXNlX2FkZHJlc3M7CiAKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKGJ1ZmZlciwgJnRlbXAxNik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KGJ1ZmZlciwgJnRlbXAxNik7CiAJYnVmZmVyICs9IDI7CiAKIAkvKiBTZXQgdGhlIGJhc2UgYWxpZ25tZW50ICovCkBAIC0yODIsMTEgKzI2NCwxMCBAQAogCiAJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KIAotCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2ZpeGVkX2lvX3N0cmVhbQpAQCAtMzA0LDE4ICsyODUsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2ZpeGVkX2lvX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpCithY3BpX3JzX2ZpeGVkX2lvX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQl1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7CisJdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOworCXUxNiB0ZW1wMTYgPSAwOworCXU4IHRlbXA4ID0gMDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2ZpeGVkX2lvX3N0cmVhbSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZml4ZWRfaW9fc3RyZWFtIik7CiAKIAkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KIApAQCAtMzI3LDcgKzMwNCw3IEBACiAKIAl0ZW1wMTYgPSAodTE2KSBsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9pby5iYXNlX2FkZHJlc3M7CiAKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKGJ1ZmZlciwgJnRlbXAxNik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KGJ1ZmZlciwgJnRlbXAxNik7CiAJYnVmZmVyICs9IDI7CiAKIAkvKiBTZXQgdGhlIHJhbmdlIGxlbmd0aCAqLwpAQCAtMzM5LDExICszMTYsMTAgQEAKIAogCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCiAKLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kbWFfcmVzb3VyY2UKQEAgLTM2NiwyMyArMzQyLDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19kbWFfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSkKK2FjcGlfcnNfZG1hX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkgICAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKLQkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hKTsKKwl1OCAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKKwl1OCB0ZW1wOCA9IDA7CisJdTggaW5kZXg7CisJdTggaTsKKwlhY3BpX3NpemUgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZG1hX3Jlc291cmNlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19kbWFfcmVzb3VyY2UiKTsKIAogCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIENvbnN0YW50ICovCiAKQEAgLTQyMiw5ICszOTMsOSBAQAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZG1hLnRyYW5zZmVyID0gdGVtcDggJiAweDAzOwogCiAJaWYgKDB4MDMgPT0gb3V0cHV0X3N0cnVjdC0+ZGF0YS5kbWEudHJhbnNmZXIpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiSW52YWxpZCBETUEuVHJhbnNmZXIgcHJlZmVyZW5jZSAoMylcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfREFUQSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSW52YWxpZCBETUEuVHJhbnNmZXIgcHJlZmVyZW5jZSAoMylcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAl9CiAKIAkvKiBHZXQgYnVzIG1hc3RlciBwcmVmZXJlbmNlIChCaXRbMl0pICovCkBAIC00NDIsMTAgKzQxMyw5IEBACiAJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KIAogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kbWFfc3RyZWFtCkBAIC00NjMsMTkgKzQzMywxNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZG1hX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpCithY3BpX3JzX2RtYV9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKKwl1OCAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7CisJdTE2IHRlbXAxNiA9IDA7CisJdTggdGVtcDggPSAwOworCXU4IGluZGV4OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZG1hX3N0cmVhbSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZG1hX3N0cmVhbSIpOwogCiAJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCiAKQEAgLTQ4Niw4ICs0NTIsNyBAQAogCS8qIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIENoYW5uZWxzIGFuZCBzZXQgdGhlIG1hc2sgYml0cyAqLwogCiAJZm9yIChpbmRleCA9IDA7Ci0JCSBpbmRleCA8IGxpbmtlZF9saXN0LT5kYXRhLmRtYS5udW1iZXJfb2ZfY2hhbm5lbHM7Ci0JCSBpbmRleCsrKSB7CisJICAgICBpbmRleCA8IGxpbmtlZF9saXN0LT5kYXRhLmRtYS5udW1iZXJfb2ZfY2hhbm5lbHM7IGluZGV4KyspIHsKIAkJdGVtcDE2ID0gKHUxNikgbGlua2VkX2xpc3QtPmRhdGEuZG1hLmNoYW5uZWxzW2luZGV4XTsKIAkJdGVtcDggfD0gMHgxIDw8IHRlbXAxNjsKIAl9CkBAIC01MDYsNyArNDcxLDYgQEAKIAogCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCiAKLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpcnEuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpcnEuYwppbmRleCA4YTJiNjMwLi41NjA0M2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaXJxLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lycS5jCkBAIC00MSwxMyArNDEsMTEgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJyc2lycSIpCi0KK0FDUElfTU9EVUxFX05BTUUoInJzaXJxIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02OSwyNiArNjcsMjAgQEAKICAqICAgICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgZnJvbSB0aGUgYnl0ZSBzdHJlYW0uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfcnNfaXJxX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpCithY3BpX3JzX2lycV9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJICAgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAotCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEpOworCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOworCXUxNiB0ZW1wMTYgPSAwOworCXU4IHRlbXA4ID0gMDsKKwl1OCBpbmRleDsKKwl1OCBpOworCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19pcnFfcmVzb3VyY2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2lycV9yZXNvdXJjZSIpOwogCiAJLyoKIAkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBjb250YWluZWQgaW4gdGhlIGRlc2NyaXB0b3IKQEAgLTEwMSw3ICs5Myw3IEBACiAJLyogUG9pbnQgdG8gdGhlIDE2LWJpdHMgb2YgQnl0ZXMgMSBhbmQgMiAqLwogCiAJYnVmZmVyICs9IDE7Ci0JQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pcnEubnVtYmVyX29mX2ludGVycnVwdHMgPSAwOwogCkBAIC0xMzIsMTQgKzEyNCwxOCBAQAogCQkvKiBDaGVjayBmb3IgSEUsIExMIGludGVycnVwdHMgKi8KIAogCQlzd2l0Y2ggKHRlbXA4ICYgMHgwOSkgewotCQljYXNlIDB4MDE6IC8qIEhFICovCi0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5lZGdlX2xldmVsID0gQUNQSV9FREdFX1NFTlNJVElWRTsKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLmFjdGl2ZV9oaWdoX2xvdyA9IEFDUElfQUNUSVZFX0hJR0g7CisJCWNhc2UgMHgwMToJLyogSEUgKi8KKwkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLmVkZ2VfbGV2ZWwgPQorCQkJICAgIEFDUElfRURHRV9TRU5TSVRJVkU7CisJCQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5hY3RpdmVfaGlnaF9sb3cgPQorCQkJICAgIEFDUElfQUNUSVZFX0hJR0g7CiAJCQlicmVhazsKIAotCQljYXNlIDB4MDg6IC8qIExMICovCi0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5lZGdlX2xldmVsID0gQUNQSV9MRVZFTF9TRU5TSVRJVkU7Ci0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5hY3RpdmVfaGlnaF9sb3cgPSBBQ1BJX0FDVElWRV9MT1c7CisJCWNhc2UgMHgwODoJLyogTEwgKi8KKwkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLmVkZ2VfbGV2ZWwgPQorCQkJICAgIEFDUElfTEVWRUxfU0VOU0lUSVZFOworCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pcnEuYWN0aXZlX2hpZ2hfbG93ID0KKwkJCSAgICBBQ1BJX0FDVElWRV9MT1c7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtMTQ4LDE3ICsxNDQsMTYgQEAKIAkJCSAqIGFyZSBhbGxvd2VkIChBQ1BJIHNwZWMsIHNlY3Rpb24gIklSUSBGb3JtYXQiKQogCQkJICogc28gMHgwMCBhbmQgMHgwOSBhcmUgaWxsZWdhbC4KIAkJCSAqLwotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkludmFsaWQgaW50ZXJydXB0IHBvbGFyaXR5L3RyaWdnZXIgaW4gcmVzb3VyY2UgbGlzdCwgJVhcbiIsCi0JCQkJdGVtcDgpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX0RBVEEpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiSW52YWxpZCBpbnRlcnJ1cHQgcG9sYXJpdHkvdHJpZ2dlciBpbiByZXNvdXJjZSBsaXN0LCAlWFxuIiwKKwkJCQkJICB0ZW1wOCkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAkJfQogCiAJCS8qIENoZWNrIGZvciBzaGFyYWJsZSAqLwogCiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgPSAodGVtcDggPj4gMykgJiAweDAxOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBBc3N1bWUgRWRnZSBTZW5zaXRpdmUsIEFjdGl2ZSBIaWdoLCBOb24tU2hhcmFibGUKIAkJICogcGVyIEFDUEkgU3BlY2lmaWNhdGlvbgpAQCAtMTc1LDEwICsxNzAsOSBAQAogCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCiAKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfaXJxX3N0cmVhbQpAQCAtMTk2LDMyICsxOTAsMjcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2lycV9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKQorYWNwaV9yc19pcnFfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUnFpbmZvX2J5dGVfbmVlZGVkOworCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKKwl1MTYgdGVtcDE2ID0gMDsKKwl1OCB0ZW1wOCA9IDA7CisJdTggaW5kZXg7CisJdTggSVJxaW5mb19ieXRlX25lZWRlZDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2lycV9zdHJlYW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2lycV9zdHJlYW0iKTsKIAogCS8qCiAJICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc2V0IGJhc2VkIHVwb24gd2hldGhlciBhIHRoaXJkIGJ5dGUgaXMKIAkgKiBuZWVkZWQgdG8gY29udGFpbiB0aGUgSVJRIEluZm9ybWF0aW9uLgogCSAqLwogCWlmIChBQ1BJX0VER0VfU0VOU0lUSVZFID09IGxpbmtlZF9saXN0LT5kYXRhLmlycS5lZGdlX2xldmVsICYmCi0JCUFDUElfQUNUSVZFX0hJR0ggPT0gbGlua2VkX2xpc3QtPmRhdGEuaXJxLmFjdGl2ZV9oaWdoX2xvdyAmJgotCQlBQ1BJX0VYQ0xVU0lWRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSkgeworCSAgICBBQ1BJX0FDVElWRV9ISUdIID09IGxpbmtlZF9saXN0LT5kYXRhLmlycS5hY3RpdmVfaGlnaF9sb3cgJiYKKwkgICAgQUNQSV9FWENMVVNJVkUgPT0gbGlua2VkX2xpc3QtPmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUpIHsKIAkJKmJ1ZmZlciA9IDB4MjI7CiAJCUlScWluZm9fYnl0ZV9uZWVkZWQgPSBGQUxTRTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJKmJ1ZmZlciA9IDB4MjM7CiAJCUlScWluZm9fYnl0ZV9uZWVkZWQgPSBUUlVFOwogCX0KQEAgLTIzMSwxNCArMjIwLDEzIEBACiAKIAkvKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBpbnRlcnJ1cHRzIGFuZCBzZXQgdGhlIG1hc2sgYml0cyAqLwogCi0JZm9yKGluZGV4ID0gMDsKLQkJaW5kZXggPCBsaW5rZWRfbGlzdC0+ZGF0YS5pcnEubnVtYmVyX29mX2ludGVycnVwdHM7Ci0JCWluZGV4KyspIHsKKwlmb3IgKGluZGV4ID0gMDsKKwkgICAgIGluZGV4IDwgbGlua2VkX2xpc3QtPmRhdGEuaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzOyBpbmRleCsrKSB7CiAJCXRlbXA4ID0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5pcnEuaW50ZXJydXB0c1tpbmRleF07CiAJCXRlbXAxNiB8PSAweDEgPDwgdGVtcDg7CiAJfQogCi0JQUNQSV9NT1ZFXzE2X1RPXzE2IChidWZmZXIsICZ0ZW1wMTYpOworCUFDUElfTU9WRV8xNl9UT18xNihidWZmZXIsICZ0ZW1wMTYpOwogCWJ1ZmZlciArPSAyOwogCiAJLyogU2V0IHRoZSBJUlEgSW5mbyBieXRlIGlmIG5lZWRlZC4gKi8KQEAgLTI0NiwxMyArMjM0LDEyIEBACiAJaWYgKElScWluZm9fYnl0ZV9uZWVkZWQpIHsKIAkJdGVtcDggPSAwOwogCQl0ZW1wOCA9ICh1OCkgKChsaW5rZWRfbGlzdC0+ZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSAmCi0JCQkJIDB4MDEpIDw8IDQpOworCQkJICAgICAgIDB4MDEpIDw8IDQpOwogCiAJCWlmIChBQ1BJX0xFVkVMX1NFTlNJVElWRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5pcnEuZWRnZV9sZXZlbCAmJgotCQkJQUNQSV9BQ1RJVkVfTE9XID09IGxpbmtlZF9saXN0LT5kYXRhLmlycS5hY3RpdmVfaGlnaF9sb3cpIHsKKwkJICAgIEFDUElfQUNUSVZFX0xPVyA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5pcnEuYWN0aXZlX2hpZ2hfbG93KSB7CiAJCQl0ZW1wOCB8PSAweDA4OwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJdGVtcDggfD0gMHgwMTsKIAkJfQogCkBAIC0yNjIsMTEgKzI0OSwxMCBAQAogCiAJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KIAotCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2V4dGVuZGVkX2lycV9yZXNvdXJjZQpAQCAtMjg5LDM0ICsyNzUsMzAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2V4dGVuZGVkX2lycV9yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKQorYWNwaV9yc19leHRlbmRlZF9pcnFfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkgICAgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCSAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfcHRyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKLQkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSk7CisJdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7CisJdTE2IHRlbXAxNiA9IDA7CisJdTggdGVtcDggPSAwOworCXU4ICp0ZW1wX3B0cjsKKwl1OCBpbmRleDsKKwlhY3BpX3NpemUgc3RydWN0X3NpemUgPQorCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxKTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2V4dGVuZGVkX2lycV9yZXNvdXJjZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2V4dGVuZGVkX2lycV9yZXNvdXJjZSIpOwotCi0KLQkvKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkICovCisJLyogR2V0IHRoZSBEZXNjcmlwdG9yIExlbmd0aCBmaWVsZCAqLwogCiAJYnVmZmVyICs9IDE7Ci0JQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCiAJLyogVmFsaWRhdGUgbWluaW11bSBkZXNjcmlwdG9yIGxlbmd0aCAqLwogCiAJaWYgKHRlbXAxNiA8IDYpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCk7CiAJfQogCiAJKmJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKQEAgLTMzOCw3ICszMjAsNyBAQAogCSAqIC0gRWRnZS9MZXZlbCBhcmUgZGVmaW5lZCBvcHBvc2l0ZSBpbiB0aGUgdGFibGUgdnMgdGhlIGhlYWRlcnMKIAkgKi8KIAlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5lZGdlX2xldmVsID0KLQkJKHRlbXA4ICYgMHgyKSA/IEFDUElfRURHRV9TRU5TSVRJVkUgOiBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKKwkgICAgKHRlbXA4ICYgMHgyKSA/IEFDUElfRURHRV9TRU5TSVRJVkUgOiBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKIAogCS8qIENoZWNrIEludGVycnVwdCBQb2xhcml0eSAqLwogCkBAIC0zNTYsNyArMzM4LDcgQEAKIAkvKiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIElSUSAqLwogCiAJaWYgKHRlbXA4IDwgMSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKIAl9CiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0cyA9IHRlbXA4OwpAQCAtMzc0LDggKzM1Niw4IEBACiAJLyogQ3ljbGUgdGhyb3VnaCBldmVyeSBJUlEgaW4gdGhlIHRhYmxlICovCiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0ZW1wODsgaW5kZXgrKykgewotCQlBQ1BJX01PVkVfMzJfVE9fMzIgKAotCQkJJm91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbaW5kZXhdLCBidWZmZXIpOworCQlBQ1BJX01PVkVfMzJfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLgorCQkJCSAgIGludGVycnVwdHNbaW5kZXhdLCBidWZmZXIpOwogCiAJCS8qIFBvaW50IHRvIHRoZSBuZXh0IElSUSAqLwogCkBAIC0zOTMsMTIgKzM3NSwxMyBAQAogCSAqIHdlIGFkZCAxIHRvIHRoZSBsZW5ndGguCiAJICovCiAJaWYgKCpieXRlc19jb25zdW1lZCA+Ci0JCSgoYWNwaV9zaXplKSBvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0cyAqIDQpICsKLQkJKDUgKyAxKSkgeworCSAgICAoKGFjcGlfc2l6ZSkgb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEubnVtYmVyX29mX2ludGVycnVwdHMgKgorCSAgICAgNCkgKyAoNSArIDEpKSB7CiAJCS8qIERlcmVmZXJlbmNlIHRoZSBJbmRleCAqLwogCiAJCXRlbXA4ID0gKmJ1ZmZlcjsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLmluZGV4ID0gKHUzMikgdGVtcDg7CisJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5pbmRleCA9CisJCSAgICAodTMyKSB0ZW1wODsKIAogCQkvKiBQb2ludCB0byB0aGUgU3RyaW5nICovCiAKQEAgLTQwNywxNSArMzkwLDE1IEBACiAJCS8qIFBvaW50IHRoZSBTdHJpbmcgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoaXMgc3RydWN0dXJlLiAqLwogCiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0KLQkJCQkoY2hhciAqKSgoY2hhciAqKSBvdXRwdXRfc3RydWN0ICsgc3RydWN0X3NpemUpOworCQkgICAgKGNoYXIgKikoKGNoYXIgKilvdXRwdXRfc3RydWN0ICsgc3RydWN0X3NpemUpOwogCiAJCXRlbXBfcHRyID0gKHU4ICopCi0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cjsKKwkJICAgIG91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOwogCiAJCS8qIENvcHkgdGhlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KIAogCQlpbmRleCA9IDA7Ci0JCXdoaWxlICgweDAwICE9ICpidWZmZXIpIHsKKwkJd2hpbGUgKCpidWZmZXIpIHsKIAkJCSp0ZW1wX3B0ciA9ICpidWZmZXI7CiAKIAkJCXRlbXBfcHRyICs9IDE7CkBAIC00MjUsOCArNDA4LDkgQEAKIAogCQkvKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwgKi8KIAotCQkqdGVtcF9wdHIgPSAweDAwOwotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9IGluZGV4ICsgMTsKKwkJKnRlbXBfcHRyID0gMDsKKwkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPQorCQkgICAgaW5kZXggKyAxOwogCiAJCS8qCiAJCSAqIEluIG9yZGVyIGZvciB0aGUgc3RydWN0X3NpemUgdG8gZmFsbCBvbiBhIDMyLWJpdCBib3VuZGFyeSwKQEAgLTQzNCwxMiArNDE4LDEzIEBACiAJCSAqIHN0cnVjdF9zaXplIHRvIHRoZSBuZXh0IDMyLWJpdCBib3VuZGFyeS4KIAkJICovCiAJCXRlbXA4ID0gKHU4KSAoaW5kZXggKyAxKTsKLQkJc3RydWN0X3NpemUgKz0gQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wOCk7Ci0JfQotCWVsc2UgewotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2UuaW5kZXggPSAweDAwOwotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9IDA7Ci0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0gTlVMTDsKKwkJc3RydWN0X3NpemUgKz0gQUNQSV9ST1VORF9VUF90b18zMl9iSVRTKHRlbXA4KTsKKwl9IGVsc2UgeworCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2UuaW5kZXggPSAwOworCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9CisJCSAgICAwOworCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9CisJCSAgICBOVUxMOwogCX0KIAogCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLwpAQCAtNDQ5LDEwICs0MzQsOSBAQAogCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCiAKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZXh0ZW5kZWRfaXJxX3N0cmVhbQpAQCAtNDcwLDM1ICs0NTQsMzEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2V4dGVuZGVkX2lycV9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKQorYWNwaV9yc19leHRlbmRlZF9pcnFfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCSAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfZmllbGQ7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0ZW1wX3BvaW50ZXIgPSBOVUxMOworCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKKwl1MTYgKmxlbmd0aF9maWVsZDsKKwl1OCB0ZW1wOCA9IDA7CisJdTggaW5kZXg7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19leHRlbmRlZF9pcnFfc3RyZWFtIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZXh0ZW5kZWRfaXJxX3N0cmVhbSIpOworCS8qIFNldCB0aGUgRGVzY3JpcHRvciBUeXBlIGZpZWxkICovCiAKLQotCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLwotCi0JKmJ1ZmZlciA9IDB4ODk7CisJKmJ1ZmZlciA9IEFDUElfUkRFU0NfVFlQRV9FWFRFTkRFRF9YUlVQVDsKIAlidWZmZXIgKz0gMTsKIAotCS8qIFNldCBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlciAqLworCS8qIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIgKi8KIAotCWxlbmd0aF9maWVsZCA9IEFDUElfQ0FTVF9QVFIgKHUxNiwgYnVmZmVyKTsKKwlsZW5ndGhfZmllbGQgPSBBQ1BJX0NBU1RfUFRSKHUxNiwgYnVmZmVyKTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgSW50ZXJydXB0IHZlY3RvciBmbGFncyAqLwogCi0JdGVtcDggPSAodTgpKGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5wcm9kdWNlcl9jb25zdW1lciAmIDB4MDEpOwotCXRlbXA4IHw9ICgobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnNoYXJlZF9leGNsdXNpdmUgJiAweDAxKSA8PCAzKTsKKwl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5wcm9kdWNlcl9jb25zdW1lciAmIDB4MDEpOworCXRlbXA4IHw9CisJICAgICgobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnNoYXJlZF9leGNsdXNpdmUgJiAweDAxKSA8PCAzKTsKIAogCS8qCiAJICogU2V0IHRoZSBJbnRlcnJ1cHQgTW9kZQpAQCAtNTI3LDQzICs1MDcsNDYgQEAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEubnVtYmVyX29mX2ludGVycnVwdHM7Ci0JCSBpbmRleCsrKSB7Ci0JCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLAotCQkJCSAgJmxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRzW2luZGV4XSk7CisJZm9yIChpbmRleCA9IDA7CisJICAgICBpbmRleCA8IGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0czsKKwkgICAgIGluZGV4KyspIHsKKwkJQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwKKwkJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLgorCQkJCSAgIGludGVycnVwdHNbaW5kZXhdKTsKIAkJYnVmZmVyICs9IDQ7CiAJfQogCiAJLyogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsICovCiAKIAlpZiAoMCAhPSBsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKLQkJKmJ1ZmZlciA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5pbmRleDsKKwkJKmJ1ZmZlciA9CisJCSAgICAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7CiAJCWJ1ZmZlciArPSAxOwogCi0JCXRlbXBfcG9pbnRlciA9IChjaGFyICopIGJ1ZmZlcjsKLQogCQkvKiBDb3B5IHRoZSBzdHJpbmcgKi8KIAotCQlBQ1BJX1NUUkNQWSAodGVtcF9wb2ludGVyLAotCQkJbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKKwkJQUNQSV9TVFJDUFkoKGNoYXIgKilidWZmZXIsCisJCQkgICAgbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS4KKwkJCSAgICBzdHJpbmdfcHRyKTsKIAogCQkvKgotCQkgKiBCdWZmZXIgbmVlZHMgdG8gYmUgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0aW5nICsgb25lIGZvciB0aGUKKwkJICogQnVmZmVyIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKyBvbmUgZm9yIHRoZQogCQkgKiB0ZXJtaW5hdGluZyBudWxsCiAJCSAqLwotCQlidWZmZXIgKz0gKGFjcGlfc2l6ZSkgKEFDUElfU1RSTEVOICgKLQkJCWxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgKyAxKTsKKwkJYnVmZmVyICs9CisJCSAgICAoYWNwaV9zaXplKSAoQUNQSV9TVFJMRU4KKwkJCQkgKGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS4KKwkJCQkgIHJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSArIDEpOwogCX0KIAogCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCiAKLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKKwkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCiAJLyoKIAkgKiBTZXQgdGhlIGxlbmd0aCBmaWVsZCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCiAJICogbWludXMgdGhlIGhlYWRlciBzaXplICgzIGJ5dGVzKQogCSAqLwogCSpsZW5ndGhfZmllbGQgPSAodTE2KSAoKmJ5dGVzX2NvbnN1bWVkIC0gMyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNsaXN0LmMKaW5kZXggZGI3YmNiNC4uMTAzZWIzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbGlzdC5jCkBAIC00MSwxMyArNDEsMTEgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJyc2xpc3QiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJyc2xpc3QiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYxLDE0ICs1OSwxMCBAQAogICogICAgICAgICAgICAgIGEgcmVzb3VyY2UgZGVzY3JpcHRvci4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11OAotYWNwaV9yc19nZXRfcmVzb3VyY2VfdHlwZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9zdGFydF9ieXRlKQordTggYWNwaV9yc19nZXRfcmVzb3VyY2VfdHlwZSh1OCByZXNvdXJjZV9zdGFydF9ieXRlKQogewogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qIERldGVybWluZSBpZiB0aGlzIGlzIGEgc21hbGwgb3IgbGFyZ2UgcmVzb3VyY2UgKi8KIApAQCAtNzksMTQgKzczLDEyIEBACiAKIAkJcmV0dXJuICgodTgpIChyZXNvdXJjZV9zdGFydF9ieXRlICYgQUNQSV9SREVTQ19TTUFMTF9NQVNLKSk7CiAKLQogCWNhc2UgQUNQSV9SREVTQ19UWVBFX0xBUkdFOgogCiAJCS8qIExhcmdlIFJlc291cmNlIFR5cGUgLS0gQWxsIGJpdHMgYXJlIHZhbGlkICovCiAKIAkJcmV0dXJuIChyZXNvdXJjZV9zdGFydF9ieXRlKTsKIAotCiAJZGVmYXVsdDoKIAkJLyogSW52YWxpZCB0eXBlICovCiAJCWJyZWFrOwpAQCAtOTUsNyArODcsNiBAQAogCXJldHVybiAoMHhGRik7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19ieXRlX3N0cmVhbV90b19saXN0CkBAIC0xMTMsMTc2ICsxMDQsMTg5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19ieXRlX3N0cmVhbV90b19saXN0ICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dF9idWZmZXIpCithY3BpX3JzX2J5dGVfc3RyZWFtX3RvX2xpc3QodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkgICAgdTMyIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgsIHU4ICogb3V0cHV0X2J1ZmZlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3BhcnNlZCA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV90eXBlID0gMDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBvdXRwdXRfYnVmZmVyOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlX3NpemUgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3RhZ19wcm9jZXNzZWQgPSBGQUxTRTsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpyZXNvdXJjZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9zaXplIGJ5dGVzX3BhcnNlZCA9IDA7CisJdTggcmVzb3VyY2VfdHlwZSA9IDA7CisJYWNwaV9zaXplIGJ5dGVzX2NvbnN1bWVkID0gMDsKKwl1OCAqYnVmZmVyID0gb3V0cHV0X2J1ZmZlcjsKKwlhY3BpX3NpemUgc3RydWN0dXJlX3NpemUgPSAwOworCXU4IGVuZF90YWdfcHJvY2Vzc2VkID0gRkFMU0U7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2J5dGVfc3RyZWFtX3RvX2xpc3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19ieXRlX3N0cmVhbV90b19saXN0Iik7CiAKLQotCXdoaWxlIChieXRlc19wYXJzZWQgPCBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoICYmCi0JCQkhZW5kX3RhZ19wcm9jZXNzZWQpIHsKKwl3aGlsZSAoYnl0ZXNfcGFyc2VkIDwgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCAmJiAhZW5kX3RhZ19wcm9jZXNzZWQpIHsKIAkJLyogVGhlIG5leHQgYnl0ZSBpbiB0aGUgc3RyZWFtIGlzIHRoZSByZXNvdXJjZSB0eXBlICovCiAKLQkJcmVzb3VyY2VfdHlwZSA9IGFjcGlfcnNfZ2V0X3Jlc291cmNlX3R5cGUgKCpieXRlX3N0cmVhbV9idWZmZXIpOworCQlyZXNvdXJjZV90eXBlID0gYWNwaV9yc19nZXRfcmVzb3VyY2VfdHlwZSgqYnl0ZV9zdHJlYW1fYnVmZmVyKTsKIAogCQlzd2l0Y2ggKHJlc291cmNlX3R5cGUpIHsKIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfTUVNT1JZXzI0OgogCQkJLyoKIAkJCSAqIDI0LUJpdCBNZW1vcnkgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19tZW1vcnkyNF9yZXNvdXJjZSAoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLCAmc3RydWN0dXJlX3NpemUpOworCQkJc3RhdHVzID0gYWNwaV9yc19tZW1vcnkyNF9yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJCQkJICAgJmJ5dGVzX2NvbnN1bWVkLAorCQkJCQkJCSAgICZidWZmZXIsCisJCQkJCQkJICAgJnN0cnVjdHVyZV9zaXplKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfTEFSR0VfVkVORE9SOgogCQkJLyoKIAkJCSAqIFZlbmRvciBEZWZpbmVkIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfdmVuZG9yX3Jlc291cmNlIChieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsICZzdHJ1Y3R1cmVfc2l6ZSk7CisJCQlzdGF0dXMgPSBhY3BpX3JzX3ZlbmRvcl9yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJCQkJICZieXRlc19jb25zdW1lZCwKKwkJCQkJCQkgJmJ1ZmZlciwKKwkJCQkJCQkgJnN0cnVjdHVyZV9zaXplKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfTUVNT1JZXzMyOgogCQkJLyoKIAkJCSAqIDMyLUJpdCBNZW1vcnkgUmFuZ2UgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19tZW1vcnkzMl9yYW5nZV9yZXNvdXJjZSAoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLCAmc3RydWN0dXJlX3NpemUpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3JzX21lbW9yeTMyX3JhbmdlX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkJCQkgICAgJmJ5dGVzX2NvbnN1bWVkLAorCQkJCQkJCSAgICAmYnVmZmVyLAorCQkJCQkJCSAgICAmc3RydWN0dXJlX3NpemUpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9GSVhFRF9NRU1PUllfMzI6CiAJCQkvKgogCQkJICogMzItQml0IEZpeGVkIE1lbW9yeSBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3Jlc291cmNlIChieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsICZzdHJ1Y3R1cmVfc2l6ZSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcnNfZml4ZWRfbWVtb3J5MzJfcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCQkJCSAgICAmYnl0ZXNfY29uc3VtZWQsCisJCQkJCQkJICAgICZidWZmZXIsCisJCQkJCQkJICAgICZzdHJ1Y3R1cmVfc2l6ZSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX1FXT1JEX0FERFJFU1NfU1BBQ0U6CiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0VYVEVOREVEX0FERFJFU1NfU1BBQ0U6CiAJCQkvKgogCQkJICogNjQtQml0IEFkZHJlc3MgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19hZGRyZXNzNjRfcmVzb3VyY2UgKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwgJnN0cnVjdHVyZV9zaXplKTsKKwkJCXN0YXR1cyA9IGFjcGlfcnNfYWRkcmVzczY0X3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkJCQkgICAgJmJ5dGVzX2NvbnN1bWVkLAorCQkJCQkJCSAgICAmYnVmZmVyLAorCQkJCQkJCSAgICAmc3RydWN0dXJlX3NpemUpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9EV09SRF9BRERSRVNTX1NQQUNFOgogCQkJLyoKIAkJCSAqIDMyLUJpdCBBZGRyZXNzIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfYWRkcmVzczMyX3Jlc291cmNlIChieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsICZzdHJ1Y3R1cmVfc2l6ZSk7CisJCQlzdGF0dXMgPSBhY3BpX3JzX2FkZHJlc3MzMl9yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJCQkJICAgICZieXRlc19jb25zdW1lZCwKKwkJCQkJCQkgICAgJmJ1ZmZlciwKKwkJCQkJCQkgICAgJnN0cnVjdHVyZV9zaXplKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfV09SRF9BRERSRVNTX1NQQUNFOgogCQkJLyoKIAkJCSAqIDE2LUJpdCBBZGRyZXNzIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfYWRkcmVzczE2X3Jlc291cmNlIChieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsICZzdHJ1Y3R1cmVfc2l6ZSk7CisJCQlzdGF0dXMgPSBhY3BpX3JzX2FkZHJlc3MxNl9yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJCQkJICAgICZieXRlc19jb25zdW1lZCwKKwkJCQkJCQkgICAgJmJ1ZmZlciwKKwkJCQkJCQkgICAgJnN0cnVjdHVyZV9zaXplKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRVhURU5ERURfWFJVUFQ6CiAJCQkvKgogCQkJICogRXh0ZW5kZWQgSVJRCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfZXh0ZW5kZWRfaXJxX3Jlc291cmNlIChieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsICZzdHJ1Y3R1cmVfc2l6ZSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcnNfZXh0ZW5kZWRfaXJxX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkJCQkgICZieXRlc19jb25zdW1lZCwKKwkJCQkJCQkgICZidWZmZXIsCisJCQkJCQkJICAmc3RydWN0dXJlX3NpemUpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9JUlFfRk9STUFUOgogCQkJLyoKIAkJCSAqIElSUSBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2lycV9yZXNvdXJjZSAoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLCAmc3RydWN0dXJlX3NpemUpOworCQkJc3RhdHVzID0gYWNwaV9yc19pcnFfcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCQkJICAgICAgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLAorCQkJCQkJICAgICAgJnN0cnVjdHVyZV9zaXplKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRE1BX0ZPUk1BVDoKIAkJCS8qCiAJCQkgKiBETUEgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19kbWFfcmVzb3VyY2UgKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwgJnN0cnVjdHVyZV9zaXplKTsKKwkJCXN0YXR1cyA9IGFjcGlfcnNfZG1hX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkJCSAgICAgICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwKKwkJCQkJCSAgICAgICZzdHJ1Y3R1cmVfc2l6ZSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX1NUQVJUX0RFUEVOREVOVDoKIAkJCS8qCiAJCQkgKiBTdGFydCBEZXBlbmRlbnQgRnVuY3Rpb25zIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19yZXNvdXJjZSAoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLCAmc3RydWN0dXJlX3NpemUpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfcmVzb3VyY2UKKwkJCSAgICAoYnl0ZV9zdHJlYW1fYnVmZmVyLCAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsCisJCQkgICAgICZzdHJ1Y3R1cmVfc2l6ZSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0VORF9ERVBFTkRFTlQ6CiAJCQkvKgogCQkJICogRW5kIERlcGVuZGVudCBGdW5jdGlvbnMgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19lbmRfZGVwZW5kX2Zuc19yZXNvdXJjZSAoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLCAmc3RydWN0dXJlX3NpemUpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3JzX2VuZF9kZXBlbmRfZm5zX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkJCQkgICAgJmJ5dGVzX2NvbnN1bWVkLAorCQkJCQkJCSAgICAmYnVmZmVyLAorCQkJCQkJCSAgICAmc3RydWN0dXJlX3NpemUpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9JT19QT1JUOgogCQkJLyoKIAkJCSAqIElPIFBvcnQgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19pb19yZXNvdXJjZSAoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLCAmc3RydWN0dXJlX3NpemUpOworCQkJc3RhdHVzID0gYWNwaV9yc19pb19yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJCQkgICAgICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwKKwkJCQkJCSAgICAgJnN0cnVjdHVyZV9zaXplKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRklYRURfSU9fUE9SVDoKIAkJCS8qCiAJCQkgKiBGaXhlZCBJTyBQb3J0IFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfZml4ZWRfaW9fcmVzb3VyY2UgKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwgJnN0cnVjdHVyZV9zaXplKTsKKwkJCXN0YXR1cyA9IGFjcGlfcnNfZml4ZWRfaW9fcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCQkJCSAgICZieXRlc19jb25zdW1lZCwKKwkJCQkJCQkgICAmYnVmZmVyLAorCQkJCQkJCSAgICZzdHJ1Y3R1cmVfc2l6ZSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX1NNQUxMX1ZFTkRPUjoKIAkJCS8qCiAJCQkgKiBWZW5kb3IgU3BlY2lmaWMgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc192ZW5kb3JfcmVzb3VyY2UgKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwgJnN0cnVjdHVyZV9zaXplKTsKKwkJCXN0YXR1cyA9IGFjcGlfcnNfdmVuZG9yX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLAorCQkJCQkJCSAmYnVmZmVyLAorCQkJCQkJCSAmc3RydWN0dXJlX3NpemUpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9FTkRfVEFHOgogCQkJLyoKIAkJCSAqIEVuZCBUYWcKIAkJCSAqLwogCQkJZW5kX3RhZ19wcm9jZXNzZWQgPSBUUlVFOwotCQkJc3RhdHVzID0gYWNwaV9yc19lbmRfdGFnX3Jlc291cmNlIChieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsICZzdHJ1Y3R1cmVfc2l6ZSk7CisJCQlzdGF0dXMgPSBhY3BpX3JzX2VuZF90YWdfcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCQkJCSAgJmJ5dGVzX2NvbnN1bWVkLAorCQkJCQkJCSAgJmJ1ZmZlciwKKwkJCQkJCQkgICZzdHJ1Y3R1cmVfc2l6ZSk7CiAJCQlicmVhazsKIAotCiAJCWRlZmF1bHQ6CiAJCQkvKgogCQkJICogSW52YWxpZC9Vbmtub3duIHJlc291cmNlIHR5cGUKQEAgLTI5MSw4ICsyOTUsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQkvKiBVcGRhdGUgdGhlIHJldHVybiB2YWx1ZSBhbmQgY291bnRlciAqLwpAQCAtMzA1LDIxICszMDksMjEgQEAKIAogCQkvKiBTZXQgdGhlIEJ1ZmZlciB0byB0aGUgbmV4dCBzdHJ1Y3R1cmUgKi8KIAotCQlyZXNvdXJjZSA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3Jlc291cmNlLCBidWZmZXIpOwotCQlyZXNvdXJjZS0+bGVuZ3RoID0gKHUzMikgQUNQSV9BTElHTl9SRVNPVVJDRV9TSVpFIChyZXNvdXJjZS0+bGVuZ3RoKTsKLQkJYnVmZmVyICs9IEFDUElfQUxJR05fUkVTT1VSQ0VfU0laRSAoc3RydWN0dXJlX3NpemUpOworCQlyZXNvdXJjZSA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIGJ1ZmZlcik7CisJCXJlc291cmNlLT5sZW5ndGggPQorCQkgICAgKHUzMikgQUNQSV9BTElHTl9SRVNPVVJDRV9TSVpFKHJlc291cmNlLT5sZW5ndGgpOworCQlidWZmZXIgKz0gQUNQSV9BTElHTl9SRVNPVVJDRV9TSVpFKHN0cnVjdHVyZV9zaXplKTsKIAl9CiAKIAkvKiBDaGVjayB0aGUgcmVhc29uIGZvciBleGl0aW5nIHRoZSB3aGlsZSBsb29wICovCiAKIAlpZiAoIWVuZF90YWdfcHJvY2Vzc2VkKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX05PX1JFU09VUkNFX0VORF9UQUcpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX1JFU09VUkNFX0VORF9UQUcpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19saXN0X3RvX2J5dGVfc3RyZWFtCkBAIC0zNDIsMTkgKzM0NiwxNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfbGlzdF90b19ieXRlX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBieXRlX3N0cmVhbV9zaXplX25lZWRlZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXRfYnVmZmVyKQorYWNwaV9yc19saXN0X3RvX2J5dGVfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCSAgICBhY3BpX3NpemUgYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQsCisJCQkgICAgdTggKiBvdXRwdXRfYnVmZmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG91dHB1dF9idWZmZXI7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBieXRlc19jb25zdW1lZCA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gRkFMU0U7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4ICpidWZmZXIgPSBvdXRwdXRfYnVmZmVyOworCWFjcGlfc2l6ZSBieXRlc19jb25zdW1lZCA9IDA7CisJdTggZG9uZSA9IEZBTFNFOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfbGlzdF90b19ieXRlX3N0cmVhbSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfbGlzdF90b19ieXRlX3N0cmVhbSIpOwogCiAJd2hpbGUgKCFkb25lKSB7CiAJCXN3aXRjaCAobGlua2VkX2xpc3QtPmlkKSB7CkBAIC0zNjIsNTggKzM2Myw3MiBAQAogCQkJLyoKIAkJCSAqIElSUSBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2lycV9zdHJlYW0gKGxpbmtlZF9saXN0LCAmYnVmZmVyLCAmYnl0ZXNfY29uc3VtZWQpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3JzX2lycV9zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCisJCQkJCSAgICAgICAmYnl0ZXNfY29uc3VtZWQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JTVFlQRV9ETUE6CiAJCQkvKgogCQkJICogRE1BIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfZG1hX3N0cmVhbSAobGlua2VkX2xpc3QsICZidWZmZXIsICZieXRlc19jb25zdW1lZCk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcnNfZG1hX3N0cmVhbShsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKKwkJCQkJICAgICAgICZieXRlc19jb25zdW1lZCk7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUlNUWVBFX1NUQVJUX0RQRjoKIAkJCS8qCiAJCQkgKiBTdGFydCBEZXBlbmRlbnQgRnVuY3Rpb25zIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19zdHJlYW0gKGxpbmtlZF9saXN0LAotCQkJCQkgICZidWZmZXIsICZieXRlc19jb25zdW1lZCk7CisJCQlzdGF0dXMgPSBhY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfc3RyZWFtKGxpbmtlZF9saXN0LAorCQkJCQkJCQkgJmJ1ZmZlciwKKwkJCQkJCQkJICZieXRlc19jb25zdW1lZCk7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUlNUWVBFX0VORF9EUEY6CiAJCQkvKgogCQkJICogRW5kIERlcGVuZGVudCBGdW5jdGlvbnMgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19lbmRfZGVwZW5kX2Zuc19zdHJlYW0gKGxpbmtlZF9saXN0LAotCQkJCQkgICZidWZmZXIsICZieXRlc19jb25zdW1lZCk7CisJCQlzdGF0dXMgPSBhY3BpX3JzX2VuZF9kZXBlbmRfZm5zX3N0cmVhbShsaW5rZWRfbGlzdCwKKwkJCQkJCQkgICAgICAgJmJ1ZmZlciwKKwkJCQkJCQkgICAgICAgJmJ5dGVzX2NvbnN1bWVkKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9SU1RZUEVfSU86CiAJCQkvKgogCQkJICogSU8gUG9ydCBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2lvX3N0cmVhbSAobGlua2VkX2xpc3QsICZidWZmZXIsICZieXRlc19jb25zdW1lZCk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcnNfaW9fc3RyZWFtKGxpbmtlZF9saXN0LCAmYnVmZmVyLAorCQkJCQkgICAgICAmYnl0ZXNfY29uc3VtZWQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JTVFlQRV9GSVhFRF9JTzoKIAkJCS8qCiAJCQkgKiBGaXhlZCBJTyBQb3J0IFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfZml4ZWRfaW9fc3RyZWFtIChsaW5rZWRfbGlzdCwgJmJ1ZmZlciwgJmJ5dGVzX2NvbnN1bWVkKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9yc19maXhlZF9pb19zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCisJCQkJCQkgICAgJmJ5dGVzX2NvbnN1bWVkKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9SU1RZUEVfVkVORE9SOgogCQkJLyoKIAkJCSAqIFZlbmRvciBEZWZpbmVkIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfdmVuZG9yX3N0cmVhbSAobGlua2VkX2xpc3QsICZidWZmZXIsICZieXRlc19jb25zdW1lZCk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcnNfdmVuZG9yX3N0cmVhbShsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKKwkJCQkJCSAgJmJ5dGVzX2NvbnN1bWVkKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9SU1RZUEVfRU5EX1RBRzoKIAkJCS8qCiAJCQkgKiBFbmQgVGFnCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfZW5kX3RhZ19zdHJlYW0gKGxpbmtlZF9saXN0LCAmYnVmZmVyLCAmYnl0ZXNfY29uc3VtZWQpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3JzX2VuZF90YWdfc3RyZWFtKGxpbmtlZF9saXN0LCAmYnVmZmVyLAorCQkJCQkJICAgJmJ5dGVzX2NvbnN1bWVkKTsKIAogCQkJLyogQW4gRW5kIFRhZyBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgUmVzb3VyY2UgVGVtcGxhdGUgKi8KIApAQCAtNDI0LDU1ICs0MzksNjAgQEAKIAkJCS8qCiAJCQkgKiAyNC1CaXQgTWVtb3J5IFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfbWVtb3J5MjRfc3RyZWFtIChsaW5rZWRfbGlzdCwgJmJ1ZmZlciwgJmJ5dGVzX2NvbnN1bWVkKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9yc19tZW1vcnkyNF9zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCisJCQkJCQkgICAgJmJ5dGVzX2NvbnN1bWVkKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9SU1RZUEVfTUVNMzI6CiAJCQkvKgogCQkJICogMzItQml0IE1lbW9yeSBSYW5nZSBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX21lbW9yeTMyX3JhbmdlX3N0cmVhbSAobGlua2VkX2xpc3QsICZidWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3JzX21lbW9yeTMyX3JhbmdlX3N0cmVhbShsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKKwkJCQkJCQkgICZieXRlc19jb25zdW1lZCk7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUlNUWVBFX0ZJWEVEX01FTTMyOgogCQkJLyoKIAkJCSAqIDMyLUJpdCBGaXhlZCBNZW1vcnkgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19maXhlZF9tZW1vcnkzMl9zdHJlYW0gKGxpbmtlZF9saXN0LCAmYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9yc19maXhlZF9tZW1vcnkzMl9zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCisJCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTMTY6CiAJCQkvKgogCQkJICogMTYtQml0IEFkZHJlc3MgRGVzY3JpcHRvciBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2FkZHJlc3MxNl9zdHJlYW0gKGxpbmtlZF9saXN0LCAmYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkKTsKKwkJCXN0YXR1cyA9IGFjcGlfcnNfYWRkcmVzczE2X3N0cmVhbShsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKKwkJCQkJCQkgICZieXRlc19jb25zdW1lZCk7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUlNUWVBFX0FERFJFU1MzMjoKIAkJCS8qCiAJCQkgKiAzMi1CaXQgQWRkcmVzcyBEZXNjcmlwdG9yIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfYWRkcmVzczMyX3N0cmVhbSAobGlua2VkX2xpc3QsICZidWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQpOworCQkJc3RhdHVzID0gYWNwaV9yc19hZGRyZXNzMzJfc3RyZWFtKGxpbmtlZF9saXN0LCAmYnVmZmVyLAorCQkJCQkJCSAgJmJ5dGVzX2NvbnN1bWVkKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzY0OgogCQkJLyoKIAkJCSAqIDY0LUJpdCBBZGRyZXNzIERlc2NyaXB0b3IgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19hZGRyZXNzNjRfc3RyZWFtIChsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCk7CisJCQlzdGF0dXMgPSBhY3BpX3JzX2FkZHJlc3M2NF9zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCisJCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JTVFlQRV9FWFRfSVJROgogCQkJLyoKIAkJCSAqIEV4dGVuZGVkIElSUSBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2V4dGVuZGVkX2lycV9zdHJlYW0gKGxpbmtlZF9saXN0LCAmYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9yc19leHRlbmRlZF9pcnFfc3RyZWFtKGxpbmtlZF9saXN0LCAmYnVmZmVyLAorCQkJCQkJCSZieXRlc19jb25zdW1lZCk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtNDgwLDE1ICs1MDAsMTUgQEAKIAkJCSAqIElmIHdlIGdldCBoZXJlLCBldmVyeXRoaW5nIGlzIG91dCBvZiBzeW5jLAogCQkJICogc28gZXhpdCB3aXRoIGFuIGVycm9yCiAJCQkgKi8KLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJJbnZhbGlkIGRlc2NyaXB0b3IgdHlwZSAoJVgpIGluIHJlc291cmNlIGxpc3RcbiIsCi0JCQkJbGlua2VkX2xpc3QtPmlkKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJJbnZhbGlkIGRlc2NyaXB0b3IgdHlwZSAoJVgpIGluIHJlc291cmNlIGxpc3RcbiIsCisJCQkJCSAgbGlua2VkX2xpc3QtPmlkKSk7CiAJCQlzdGF0dXMgPSBBRV9CQURfREFUQTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJLyogU2V0IHRoZSBCdWZmZXIgdG8gcG9pbnQgdG8gdGhlIG9wZW4gYnl0ZSAqLwpAQCAtNDk3LDEwICs1MTcsOSBAQAogCiAJCS8qIFBvaW50IHRvIHRoZSBuZXh0IG9iamVjdCAqLwogCi0JCWxpbmtlZF9saXN0ID0gQUNQSV9QVFJfQUREIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwKLQkJCQkgIGxpbmtlZF9saXN0LCBsaW5rZWRfbGlzdC0+bGVuZ3RoKTsKKwkJbGlua2VkX2xpc3QgPSBBQ1BJX1BUUl9BREQoc3RydWN0IGFjcGlfcmVzb3VyY2UsCisJCQkJCSAgIGxpbmtlZF9saXN0LCBsaW5rZWRfbGlzdC0+bGVuZ3RoKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWVtb3J5LmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWVtb3J5LmMKaW5kZXggOTFkMDIwNy4uZGFiYTFhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21lbW9yeS5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtZW1vcnkuYwpAQCAtNDEsMTMgKzQxLDExIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3Jlc3JjLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicnNtZW1vcnkiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJyc21lbW9yeSIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjksMzAgKzY3LDI1IEBACiAgKiAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX3JzX21lbW9yeTI0X3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpCithY3BpX3JzX21lbW9yeTI0X3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCSAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKLQkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQpOworCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOworCXUxNiB0ZW1wMTYgPSAwOworCXU4IHRlbXA4ID0gMDsKKwlhY3BpX3NpemUgc3RydWN0X3NpemUgPQorCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0yNCk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19tZW1vcnkyNF9yZXNvdXJjZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfbWVtb3J5MjRfcmVzb3VyY2UiKTsKIAogCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KIAogCWJ1ZmZlciArPSAxOwogCi0JQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCWJ1ZmZlciArPSAyOwogCSpieXRlc19jb25zdW1lZCA9IChhY3BpX3NpemUpIHRlbXAxNiArIDM7CiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9NRU0yNDsKQEAgLTEwNSwyNSArOTgsMjUgQEAKIAogCS8qIEdldCBtaW5fYmFzZV9hZGRyZXNzIChCeXRlcyA0LTUpICovCiAKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDI7CiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkyNC5taW5fYmFzZV9hZGRyZXNzID0gdGVtcDE2OwogCiAJLyogR2V0IG1heF9iYXNlX2FkZHJlc3MgKEJ5dGVzIDYtNykgKi8KIAotCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAlidWZmZXIgKz0gMjsKIAlvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTI0Lm1heF9iYXNlX2FkZHJlc3MgPSB0ZW1wMTY7CiAKIAkvKiBHZXQgQWxpZ25tZW50IChCeXRlcyA4LTkpICovCiAKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDI7CiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkyNC5hbGlnbm1lbnQgPSB0ZW1wMTY7CiAKIAkvKiBHZXQgcmFuZ2VfbGVuZ3RoIChCeXRlcyAxMC0xMSkgKi8KIAotCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAlvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTI0LnJhbmdlX2xlbmd0aCA9IHRlbXAxNjsKIAogCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLwpAQCAtMTMzLDEwICsxMjYsOSBAQAogCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCiAKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfbWVtb3J5MjRfc3RyZWFtCkBAIC0xNTQsMTggKzE0NiwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfbWVtb3J5MjRfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCkKK2FjcGlfcnNfbWVtb3J5MjRfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCXU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKKwl1OCAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7CisJdTE2IHRlbXAxNiA9IDA7CisJdTggdGVtcDggPSAwOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfbWVtb3J5MjRfc3RyZWFtIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19tZW1vcnkyNF9zdHJlYW0iKTsKIAogCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLwogCkBAIC0xNzUsNyArMTYzLDcgQEAKIAkvKiBUaGUgbGVuZ3RoIGZpZWxkIGlzIHN0YXRpYyAqLwogCiAJdGVtcDE2ID0gMHgwOTsKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKGJ1ZmZlciwgJnRlbXAxNik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KGJ1ZmZlciwgJnRlbXAxNik7CiAJYnVmZmVyICs9IDI7CiAKIAkvKiBTZXQgdGhlIEluZm9ybWF0aW9uIEJ5dGUgKi8KQEAgLTE4NiwzMSArMTc0LDMyIEBACiAKIAkvKiBTZXQgdGhlIFJhbmdlIG1pbmltdW0gYmFzZSBhZGRyZXNzICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0Lm1pbl9iYXNlX2FkZHJlc3MpOworCUFDUElfTU9WRV8zMl9UT18xNihidWZmZXIsCisJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MjQubWluX2Jhc2VfYWRkcmVzcyk7CiAJYnVmZmVyICs9IDI7CiAKIAkvKiBTZXQgdGhlIFJhbmdlIG1heGltdW0gYmFzZSBhZGRyZXNzICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0Lm1heF9iYXNlX2FkZHJlc3MpOworCUFDUElfTU9WRV8zMl9UT18xNihidWZmZXIsCisJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MjQubWF4X2Jhc2VfYWRkcmVzcyk7CiAJYnVmZmVyICs9IDI7CiAKIAkvKiBTZXQgdGhlIGJhc2UgYWxpZ25tZW50ICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0LmFsaWdubWVudCk7CisJQUNQSV9NT1ZFXzMyX1RPXzE2KGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0LmFsaWdubWVudCk7CiAJYnVmZmVyICs9IDI7CiAKIAkvKiBTZXQgdGhlIHJhbmdlIGxlbmd0aCAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkyNC5yYW5nZV9sZW5ndGgpOworCUFDUElfTU9WRV8zMl9UT18xNihidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkyNC5yYW5nZV9sZW5ndGgpOwogCWJ1ZmZlciArPSAyOwogCiAJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KIAotCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX21lbW9yeTMyX3JhbmdlX3Jlc291cmNlCkBAIC0yMzMsMjggKzIyMiwyNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfbWVtb3J5MzJfcmFuZ2VfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSkKK2FjcGlfcnNfbWVtb3J5MzJfcmFuZ2VfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkJdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKLQkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIpOworCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOworCXUxNiB0ZW1wMTYgPSAwOworCXU4IHRlbXA4ID0gMDsKKwlhY3BpX3NpemUgc3RydWN0X3NpemUgPQorCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMik7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19tZW1vcnkzMl9yYW5nZV9yZXNvdXJjZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfbWVtb3J5MzJfcmFuZ2VfcmVzb3VyY2UiKTsKIAogCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KIAogCWJ1ZmZlciArPSAxOwogCi0JQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCWJ1ZmZlciArPSAyOwogCSpieXRlc19jb25zdW1lZCA9IChhY3BpX3NpemUpIHRlbXAxNiArIDM7CiAKQEAgLTI3OSwyMiArMjY0LDI0IEBACiAKIAkvKiBHZXQgbWluX2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNC03KSAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkzMi5taW5fYmFzZV9hZGRyZXNzLCBidWZmZXIpOworCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkzMi5taW5fYmFzZV9hZGRyZXNzLAorCQkJICAgYnVmZmVyKTsKIAlidWZmZXIgKz0gNDsKIAogCS8qIEdldCBtYXhfYmFzZV9hZGRyZXNzIChCeXRlcyA4LTExKSAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkzMi5tYXhfYmFzZV9hZGRyZXNzLCBidWZmZXIpOworCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkzMi5tYXhfYmFzZV9hZGRyZXNzLAorCQkJICAgYnVmZmVyKTsKIAlidWZmZXIgKz0gNDsKIAogCS8qIEdldCBBbGlnbm1lbnQgKEJ5dGVzIDEyLTE1KSAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkzMi5hbGlnbm1lbnQsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLmFsaWdubWVudCwgYnVmZmVyKTsKIAlidWZmZXIgKz0gNDsKIAogCS8qIEdldCByYW5nZV9sZW5ndGggKEJ5dGVzIDE2LTE5KSAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkzMi5yYW5nZV9sZW5ndGgsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLnJhbmdlX2xlbmd0aCwgYnVmZmVyKTsKIAogCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLwogCkBAIC0zMDMsMTAgKzI5MCw5IEBACiAJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KIAogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19maXhlZF9tZW1vcnkzMl9yZXNvdXJjZQpAQCAtMzI5LDI3ICszMTUsMjMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpCithY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCWFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJCXU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCi0JCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyKTsKKwl1OCAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKKwl1MTYgdGVtcDE2ID0gMDsKKwl1OCB0ZW1wOCA9IDA7CisJYWNwaV9zaXplIHN0cnVjdF9zaXplID0KKwkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZml4ZWRfbWVtb3J5MzJfcmVzb3VyY2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2ZpeGVkX21lbW9yeTMyX3Jlc291cmNlIik7CiAKIAkvKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkICovCiAKIAlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAlidWZmZXIgKz0gMjsKIAkqYnl0ZXNfY29uc3VtZWQgPSAoYWNwaV9zaXplKSB0ZW1wMTYgKyAzOwpAQCAtMzY0LDEzICszNDYsMTQgQEAKIAogCS8qIEdldCByYW5nZV9iYXNlX2FkZHJlc3MgKEJ5dGVzIDQtNykgKi8KIAotCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfYmFzZV9hZGRyZXNzLAotCQlidWZmZXIpOworCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi4KKwkJCSAgIHJhbmdlX2Jhc2VfYWRkcmVzcywgYnVmZmVyKTsKIAlidWZmZXIgKz0gNDsKIAogCS8qIEdldCByYW5nZV9sZW5ndGggKEJ5dGVzIDgtMTEpICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJhbmdlX2xlbmd0aCwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMzJfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfbGVuZ3RoLAorCQkJICAgYnVmZmVyKTsKIAogCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLwogCkBAIC0zNzksMTAgKzM2Miw5IEBACiAJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KIAogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19tZW1vcnkzMl9yYW5nZV9zdHJlYW0KQEAgLTQwMCwxOCArMzgyLDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19tZW1vcnkzMl9yYW5nZV9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKQorYWNwaV9yc19tZW1vcnkzMl9yYW5nZV9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOworCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKKwl1MTYgdGVtcDE2ID0gMDsKKwl1OCB0ZW1wOCA9IDA7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19tZW1vcnkzMl9yYW5nZV9zdHJlYW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX21lbW9yeTMyX3JhbmdlX3N0cmVhbSIpOwogCiAJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCiAKQEAgLTQyMiw3ICs0MDAsNyBAQAogCiAJdGVtcDE2ID0gMHgxMTsKIAotCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgSW5mb3JtYXRpb24gQnl0ZSAqLwpAQCAtNDMzLDMxICs0MTEsMzIgQEAKIAogCS8qIFNldCB0aGUgUmFuZ2UgbWluaW11bSBiYXNlIGFkZHJlc3MgKi8KIAotCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIubWluX2Jhc2VfYWRkcmVzcyk7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwKKwkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkzMi5taW5fYmFzZV9hZGRyZXNzKTsKIAlidWZmZXIgKz0gNDsKIAogCS8qIFNldCB0aGUgUmFuZ2UgbWF4aW11bSBiYXNlIGFkZHJlc3MgKi8KIAotCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIubWF4X2Jhc2VfYWRkcmVzcyk7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwKKwkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkzMi5tYXhfYmFzZV9hZGRyZXNzKTsKIAlidWZmZXIgKz0gNDsKIAogCS8qIFNldCB0aGUgYmFzZSBhbGlnbm1lbnQgKi8KIAotCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIuYWxpZ25tZW50KTsKKwlBQ1BJX01PVkVfMzJfVE9fMzIoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIuYWxpZ25tZW50KTsKIAlidWZmZXIgKz0gNDsKIAogCS8qIFNldCB0aGUgcmFuZ2UgbGVuZ3RoICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTMyLnJhbmdlX2xlbmd0aCk7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTMyLnJhbmdlX2xlbmd0aCk7CiAJYnVmZmVyICs9IDQ7CiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwogCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZml4ZWRfbWVtb3J5MzJfc3RyZWFtCkBAIC00NzUsMTggKzQ1NCwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZml4ZWRfbWVtb3J5MzJfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCkKK2FjcGlfcnNfZml4ZWRfbWVtb3J5MzJfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCSAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKKwl1OCAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7CisJdTE2IHRlbXAxNiA9IDA7CisJdTggdGVtcDggPSAwOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZml4ZWRfbWVtb3J5MzJfc3RyZWFtIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19maXhlZF9tZW1vcnkzMl9zdHJlYW0iKTsKIAogCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLwogCkBAIC00OTcsMzAgKzQ3MiwzMSBAQAogCiAJdGVtcDE2ID0gMHgwOTsKIAotCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgSW5mb3JtYXRpb24gQnl0ZSAqLwogCi0JdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yZWFkX3dyaXRlX2F0dHJpYnV0ZSAmIDB4MDEpOworCXRlbXA4ID0KKwkgICAgKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmVhZF93cml0ZV9hdHRyaWJ1dGUgJiAweDAxKTsKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKIAkvKiBTZXQgdGhlIFJhbmdlIGJhc2UgYWRkcmVzcyAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsCi0JCSZsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9iYXNlX2FkZHJlc3MpOworCUFDUElfTU9WRV8zMl9UT18zMihidWZmZXIsCisJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIuCisJCQkgICByYW5nZV9iYXNlX2FkZHJlc3MpOwogCWJ1ZmZlciArPSA0OwogCiAJLyogU2V0IHRoZSByYW5nZSBsZW5ndGggKi8KIAotCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLAotCQkmbGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfbGVuZ3RoKTsKKwlBQ1BJX01PVkVfMzJfVE9fMzIoYnVmZmVyLAorCQkJICAgJmxpbmtlZF9saXN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJhbmdlX2xlbmd0aCk7CiAJYnVmZmVyICs9IDQ7CiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwogCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWlzYy5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21pc2MuYwppbmRleCBhMWYxNzQxLi43YThhMzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMKQEAgLTQxLDEzICs0MSwxMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNyZXNyYy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInJzbWlzYyIpCi0KK0FDUElfTU9EVUxFX05BTUUoInJzbWlzYyIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjksMjAgKzY3LDE1IEBACiAgKiAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2VuZF90YWdfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSkKK2FjcGlfcnNfZW5kX3RhZ19yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCSB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfUkVTT1VSQ0VfTEVOR1RIOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKKwlhY3BpX3NpemUgc3RydWN0X3NpemUgPSBBQ1BJX1JFU09VUkNFX0xFTkdUSDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2VuZF90YWdfcmVzb3VyY2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2VuZF90YWdfcmVzb3VyY2UiKTsKIAogCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaXMgc3RhdGljICovCiAKQEAgLTk5LDEwICs5Miw5IEBACiAJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KIAogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19lbmRfdGFnX3N0cmVhbQpAQCAtMTIwLDE3ICsxMTIsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2VuZF90YWdfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCkKK2FjcGlfcnNfZW5kX3RhZ19zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkgICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7CisJdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOworCXU4IHRlbXA4ID0gMDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2VuZF90YWdfc3RyZWFtIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19lbmRfdGFnX3N0cmVhbSIpOwogCiAJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCiAKQEAgLTE0OCwxMSArMTM2LDEwIEBACiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwogCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfdmVuZG9yX3Jlc291cmNlCkBAIC0xNzUsMjMgKzE2MiwxOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfdmVuZG9yX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpCithY3BpX3JzX3ZlbmRvcl9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCWFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAotCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpOworCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOworCXUxNiB0ZW1wMTYgPSAwOworCXU4IHRlbXA4ID0gMDsKKwl1OCBpbmRleDsKKwlhY3BpX3NpemUgc3RydWN0X3NpemUgPQorCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfdmVuZG9yX3Jlc291cmNlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc192ZW5kb3JfcmVzb3VyY2UiKTsKIAogCS8qIERlcmVmZXJlbmNlIHRoZSBEZXNjcmlwdG9yIHRvIGZpbmQgaWYgdGhpcyBpcyBhIGxhcmdlIG9yIHNtYWxsIGl0ZW0uICovCiAKQEAgLTIwNCw3ICsxODcsNyBAQAogCiAJCS8qIERlcmVmZXJlbmNlICovCiAKLQkJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCQlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAogCQkvKiBDYWxjdWxhdGUgYnl0ZXMgY29uc3VtZWQgKi8KIApAQCAtMjEzLDExICsxOTYsMTAgQEAKIAkJLyogUG9pbnQgdG8gdGhlIGZpcnN0IHZlbmRvciBieXRlICovCiAKIAkJYnVmZmVyICs9IDI7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIFNtYWxsIEl0ZW0sIGRlcmVmZXJlbmNlIHRoZSBzaXplICovCiAKLQkJdGVtcDE2ID0gKHU4KSgqYnVmZmVyICYgMHgwNyk7CisJCXRlbXAxNiA9ICh1OCkgKCpidWZmZXIgJiAweDA3KTsKIAogCQkvKiBDYWxjdWxhdGUgYnl0ZXMgY29uc3VtZWQgKi8KIApAQCAtMjQxLDcgKzIyMyw3IEBACiAJICogY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHZlbmRvciBzdHJpbmcgYW5kIGV4cGFuZCB0aGUKIAkgKiBzdHJ1Y3Rfc2l6ZSB0byB0aGUgbmV4dCAzMi1iaXQgYm91bmRhcnkuCiAJICovCi0Jc3RydWN0X3NpemUgKz0gQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wMTYpOworCXN0cnVjdF9zaXplICs9IEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyh0ZW1wMTYpOwogCiAJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCiAKQEAgLTI1MCwxMCArMjMyLDkgQEAKIAkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwogCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX3ZlbmRvcl9zdHJlYW0KQEAgLTI3MSwyMyArMjUyLDE5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc192ZW5kb3Jfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCkKK2FjcGlfcnNfdmVuZG9yX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCSAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OworCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKKwl1MTYgdGVtcDE2ID0gMDsKKwl1OCB0ZW1wOCA9IDA7CisJdTggaW5kZXg7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc192ZW5kb3Jfc3RyZWFtIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc192ZW5kb3Jfc3RyZWFtIik7CiAKIAkvKiBEZXJlZmVyZW5jZSB0aGUgbGVuZ3RoIHRvIGZpbmQgaWYgdGhpcyBpcyBhIGxhcmdlIG9yIHNtYWxsIGl0ZW0uICovCiAKLQlpZihsaW5rZWRfbGlzdC0+ZGF0YS52ZW5kb3Jfc3BlY2lmaWMubGVuZ3RoID4gNykgeworCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS52ZW5kb3Jfc3BlY2lmaWMubGVuZ3RoID4gNykgewogCQkvKiBMYXJnZSBJdGVtLCBTZXQgdGhlIGRlc2NyaXB0b3IgZmllbGQgYW5kIGxlbmd0aCBieXRlcyAqLwogCiAJCSpidWZmZXIgPSAweDg0OwpAQCAtMjk1LDEwICsyNzIsOSBAQAogCiAJCXRlbXAxNiA9ICh1MTYpIGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5sZW5ndGg7CiAKLQkJQUNQSV9NT1ZFXzE2X1RPXzE2IChidWZmZXIsICZ0ZW1wMTYpOworCQlBQ1BJX01PVkVfMTZfVE9fMTYoYnVmZmVyLCAmdGVtcDE2KTsKIAkJYnVmZmVyICs9IDI7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIFNtYWxsIEl0ZW0sIFNldCB0aGUgZGVzY3JpcHRvciBmaWVsZCAqLwogCiAJCXRlbXA4ID0gMHg3MDsKQEAgLTMxMCw3ICsyODYsOCBAQAogCiAJLyogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgVmVuZG9yIFNwZWNpZmljIGZpZWxkcyAqLwogCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGlua2VkX2xpc3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLmxlbmd0aDsgaW5kZXgrKykgeworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5sZW5ndGg7CisJICAgICBpbmRleCsrKSB7CiAJCXRlbXA4ID0gbGlua2VkX2xpc3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLnJlc2VydmVkW2luZGV4XTsKIAogCQkqYnVmZmVyID0gdGVtcDg7CkBAIC0zMTksMTEgKzI5NiwxMCBAQAogCiAJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KIAotCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfcmVzb3VyY2UKQEAgLTM0NiwyMSArMzIyLDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19zdGFydF9kZXBlbmRfZm5zX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpCithY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCQkgIHU4ICoqIG91dHB1dF9idWZmZXIsCisJCQkJICBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCi0JCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RwZik7CisJdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7CisJdTggdGVtcDggPSAwOworCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9CisJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RwZik7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19zdGFydF9kZXBlbmRfZm5zX3Jlc291cmNlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19zdGFydF9kZXBlbmRfZm5zX3Jlc291cmNlIik7CiAKIAkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBmb3VuZCBpbiB0aGUgZGVzY3JpcHRvciAoQml0czowLTEpICovCiAKQEAgLTM3OCwyNiArMzUxLDI3IEBACiAKIAkJLyogQ2hlY2sgQ29tcGF0aWJpbGl0eSBwcmlvcml0eSAqLwogCi0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkgPSB0ZW1wOCAmIDB4MDM7CisJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkgPQorCQkgICAgdGVtcDggJiAweDAzOwogCiAJCWlmICgzID09IG91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0JBRF9SRVNPVVJDRV9WQUxVRSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9SRVNPVVJDRV9WQUxVRSk7CiAJCX0KIAogCQkvKiBDaGVjayBQZXJmb3JtYW5jZS9Sb2J1c3RuZXNzIHByZWZlcmVuY2UgKi8KIAotCQlvdXRwdXRfc3RydWN0LT5kYXRhLnN0YXJ0X2RwZi5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzID0gKHRlbXA4ID4+IDIpICYgMHgwMzsKKwkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcyA9CisJCSAgICAodGVtcDggPj4gMikgJiAweDAzOwogCiAJCWlmICgzID09IG91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0JBRF9SRVNPVVJDRV9WQUxVRSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9SRVNPVVJDRV9WQUxVRSk7CiAJCX0KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSA9Ci0JCQlBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjsKKwkJICAgIEFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OOwogCiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MgPQotCQkJQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT047CisJCSAgICBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjsKIAl9CiAKIAkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KQEAgLTQwNywxMCArMzgxLDkgQEAKIAkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwogCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2VuZF9kZXBlbmRfZm5zX3Jlc291cmNlCkBAIC00MzMsMTggKzQwNiwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZW5kX2RlcGVuZF9mbnNfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSkKK2FjcGlfcnNfZW5kX2RlcGVuZF9mbnNfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkJdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1JFU09VUkNFX0xFTkdUSDsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7CisJYWNwaV9zaXplIHN0cnVjdF9zaXplID0gQUNQSV9SRVNPVVJDRV9MRU5HVEg7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19lbmRfZGVwZW5kX2Zuc19yZXNvdXJjZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZW5kX2RlcGVuZF9mbnNfcmVzb3VyY2UiKTsKIAogCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaXMgc3RhdGljICovCiAKQEAgLTQ2MSwxMCArNDMwLDkgQEAKIAkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwogCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfc3RyZWFtCkBAIC00ODMsMzkgKzQ1MSwzNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKQorYWNwaV9yc19zdGFydF9kZXBlbmRfZm5zX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQkJdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7CisJdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOworCXU4IHRlbXA4ID0gMDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX3N0YXJ0X2RlcGVuZF9mbnNfc3RyZWFtIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19zdGFydF9kZXBlbmRfZm5zX3N0cmVhbSIpOwogCiAJLyoKIAkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzZXQgYmFzZWQgdXBvbiB3aGV0aGVyIGEgYnl0ZSBpcyBuZWVkZWQKIAkgKiB0byBjb250YWluIFByaW9yaXR5IGRhdGEuCiAJICovCiAJaWYgKEFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OID09Ci0JCQlsaW5rZWRfbGlzdC0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSAmJgotCQlBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTiA9PQotCQkJbGlua2VkX2xpc3QtPmRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MpIHsKKwkgICAgbGlua2VkX2xpc3QtPmRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkgJiYKKwkgICAgQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT04gPT0KKwkgICAgbGlua2VkX2xpc3QtPmRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MpIHsKIAkJKmJ1ZmZlciA9IDB4MzA7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCSpidWZmZXIgPSAweDMxOwogCQlidWZmZXIgKz0gMTsKIAogCQkvKiBTZXQgdGhlIFByaW9yaXR5IEJ5dGUgRGVmaW5pdGlvbiAqLwogCiAJCXRlbXA4ID0gMDsKLQkJdGVtcDggPSAodTgpICgobGlua2VkX2xpc3QtPmRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MgJgotCQkJCSAgIDB4MDMpIDw8IDIpOwotCQl0ZW1wOCB8PSAobGlua2VkX2xpc3QtPmRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkgJgotCQkJCSAgIDB4MDMpOworCQl0ZW1wOCA9CisJCSAgICAodTgpICgobGlua2VkX2xpc3QtPmRhdGEuc3RhcnRfZHBmLgorCQkJICAgcGVyZm9ybWFuY2Vfcm9idXN0bmVzcyAmIDB4MDMpIDw8IDIpOworCQl0ZW1wOCB8PQorCQkgICAgKGxpbmtlZF9saXN0LT5kYXRhLnN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5ICYgMHgwMyk7CiAJCSpidWZmZXIgPSB0ZW1wODsKIAl9CiAKQEAgLTUyMywxMSArNDg3LDEwIEBACiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwogCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZW5kX2RlcGVuZF9mbnNfc3RyZWFtCkBAIC01NDUsMTYgKzUwOCwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZW5kX2RlcGVuZF9mbnNfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCkKK2FjcGlfcnNfZW5kX2RlcGVuZF9mbnNfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCSAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOworCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2VuZF9kZXBlbmRfZm5zX3N0cmVhbSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZW5kX2RlcGVuZF9mbnNfc3RyZWFtIik7CiAKIAkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KIApAQCAtNTYzLDcgKzUyMiw2IEBACiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwogCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jCmluZGV4IDcwMGNmN2QuLjQ0NDY3NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jCkBAIC00MSwxNSArNDEsMTIgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3Jlc3JjLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJyc3V0aWxzIikKLQorQUNQSV9NT0RVTEVfTkFNRSgicnN1dGlscyIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjgsNDIgKzY1LDM2IEBACiAgKiAgICAgICAgICAgICAgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgY2FsbGVycyBidWZmZXIgaXMgdW5kZWZpbmVkLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9wcnRfbWV0aG9kX2RhdGEgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpCithY3BpX3JzX2dldF9wcnRfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZ2V0X3BydF9tZXRob2RfZGF0YSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZ2V0X3BydF9tZXRob2RfZGF0YSIpOwogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCiAJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoaGFuZGxlLCBNRVRIT0RfTkFNRV9fUFJULAotCQkJIEFDUElfQlRZUEVfUEFDS0FHRSwgJm9ial9kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChoYW5kbGUsIE1FVEhPRF9OQU1FX19QUlQsCisJCQkJCSBBQ1BJX0JUWVBFX1BBQ0tBR0UsICZvYmpfZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCiAJICogQ3JlYXRlIGEgcmVzb3VyY2UgbGlua2VkIGxpc3QgZnJvbSB0aGUgYnl0ZSBzdHJlYW0gYnVmZmVyIHRoYXQgY29tZXMKIAkgKiBiYWNrIGZyb20gdGhlIF9DUlMgbWV0aG9kIGV4ZWN1dGlvbi4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3JzX2NyZWF0ZV9wY2lfcm91dGluZ190YWJsZSAob2JqX2Rlc2MsIHJldF9idWZmZXIpOworCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX3BjaV9yb3V0aW5nX3RhYmxlKG9ial9kZXNjLCByZXRfYnVmZmVyKTsKIAogCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgZXZhbHVhdGVfb2JqZWN0ICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9jcnNfbWV0aG9kX2RhdGEKQEAgLTEyMywyNSArMTE0LDIxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfY3JzX21ldGhvZF9kYXRhICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKQorYWNwaV9yc19nZXRfY3JzX21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2dldF9jcnNfbWV0aG9kX2RhdGEiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2dldF9jcnNfbWV0aG9kX2RhdGEiKTsKIAogCS8qIFBhcmFtZXRlcnMgZ3VhcmFudGVlZCB2YWxpZCBieSBjYWxsZXIgKi8KIAogCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycyAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QgKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKLQkJCSBBQ1BJX0JUWVBFX0JVRkZFUiwgJm9ial9kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCisJCQkJCSBBQ1BJX0JUWVBFX0JVRkZFUiwgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTE0OSwxNSArMTM2LDE0IEBACiAJICogYnl0ZSBzdHJlYW0gYnVmZmVyIHRoYXQgY29tZXMgYmFjayBmcm9tIHRoZSBfQ1JTIG1ldGhvZAogCSAqIGV4ZWN1dGlvbi4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3JzX2NyZWF0ZV9yZXNvdXJjZV9saXN0IChvYmpfZGVzYywgcmV0X2J1ZmZlcik7CisJc3RhdHVzID0gYWNwaV9yc19jcmVhdGVfcmVzb3VyY2VfbGlzdChvYmpfZGVzYywgcmV0X2J1ZmZlcik7CiAKIAkvKiBvbiBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGV2YWx1YXRlX29iamVjdCAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19nZXRfcHJzX21ldGhvZF9kYXRhCkBAIC0xNzgsMjUgKzE2NCwyMSBAQAogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpCithY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZ2V0X3Byc19tZXRob2RfZGF0YSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZ2V0X3Byc19tZXRob2RfZGF0YSIpOwogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCiAJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoaGFuZGxlLCBNRVRIT0RfTkFNRV9fUFJTLAotCQkJIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgTUVUSE9EX05BTUVfX1BSUywKKwkJCQkJIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtMjA0LDE1ICsxODYsMTQgQEAKIAkgKiBieXRlIHN0cmVhbSBidWZmZXIgdGhhdCBjb21lcyBiYWNrIGZyb20gdGhlIF9DUlMgbWV0aG9kCiAJICogZXhlY3V0aW9uLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3QgKG9ial9kZXNjLCByZXRfYnVmZmVyKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2NyZWF0ZV9yZXNvdXJjZV9saXN0KG9ial9kZXNjLCByZXRfYnVmZmVyKTsKIAogCS8qIG9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgZXZhbHVhdGVfb2JqZWN0ICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTIzNCwyNSArMjE1LDIyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfbWV0aG9kX2RhdGEgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGgsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcikKK2FjcGlfcnNfZ2V0X21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCWNoYXIgKnBhdGgsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19nZXRfbWV0aG9kX2RhdGEiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2dldF9tZXRob2RfZGF0YSIpOwogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCiAJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoaGFuZGxlLCBwYXRoLCBBQ1BJX0JUWVBFX0JVRkZFUiwgJm9ial9kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChoYW5kbGUsIHBhdGgsIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtMjYwLDEyICsyMzgsMTIgQEAKIAkgKiBieXRlIHN0cmVhbSBidWZmZXIgdGhhdCBjb21lcyBiYWNrIGZyb20gdGhlIG1ldGhvZAogCSAqIGV4ZWN1dGlvbi4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3JzX2NyZWF0ZV9yZXNvdXJjZV9saXN0IChvYmpfZGVzYywgcmV0X2J1ZmZlcik7CisJc3RhdHVzID0gYWNwaV9yc19jcmVhdGVfcmVzb3VyY2VfbGlzdChvYmpfZGVzYywgcmV0X2J1ZmZlcik7CiAKIAkvKiBPbiBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGV2YWx1YXRlX29iamVjdCAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yODcsMTggKzI2NSwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfc2V0X3Nyc19tZXRob2RfZGF0YSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqaW5fYnVmZmVyKQorYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfYnVmZmVyICppbl9idWZmZXIpCiB7Ci0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICBpbmZvOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnBhcmFtc1syXTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgIGJ1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyBpbmZvOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnBhcmFtc1syXTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlcjsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX3NldF9zcnNfbWV0aG9kX2RhdGEiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX3NldF9zcnNfbWV0aG9kX2RhdGEiKTsKIAogCS8qIFBhcmFtZXRlcnMgZ3VhcmFudGVlZCB2YWxpZCBieSBjYWxsZXIgKi8KIApAQCAtMzEwLDI0ICsyODQsMjQgQEAKIAkgKiBDb252ZXJ0IHRoZSBsaW5rZWQgbGlzdCBpbnRvIGEgYnl0ZSBzdHJlYW0KIAkgKi8KIAlidWZmZXIubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI7Ci0Jc3RhdHVzID0gYWNwaV9yc19jcmVhdGVfYnl0ZV9zdHJlYW0gKGluX2J1ZmZlci0+cG9pbnRlciwgJmJ1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9yc19jcmVhdGVfYnl0ZV9zdHJlYW0oaW5fYnVmZmVyLT5wb2ludGVyLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogSW5pdCB0aGUgcGFyYW0gb2JqZWN0ICovCiAKLQlwYXJhbXNbMF0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9CVUZGRVIpOworCXBhcmFtc1swXSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfQlVGRkVSKTsKIAlpZiAoIXBhcmFtc1swXSkgewotCQlhY3BpX29zX2ZyZWUgKGJ1ZmZlci5wb2ludGVyKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBTZXQgdXAgdGhlIHBhcmFtZXRlciBvYmplY3QgKi8KIAotCXBhcmFtc1swXS0+YnVmZmVyLmxlbmd0aCAgPSAodTMyKSBidWZmZXIubGVuZ3RoOworCXBhcmFtc1swXS0+YnVmZmVyLmxlbmd0aCA9ICh1MzIpIGJ1ZmZlci5sZW5ndGg7CiAJcGFyYW1zWzBdLT5idWZmZXIucG9pbnRlciA9IGJ1ZmZlci5wb2ludGVyOwotCXBhcmFtc1swXS0+Y29tbW9uLmZsYWdzICAgPSBBT1BPQkpfREFUQV9WQUxJRDsKKwlwYXJhbXNbMF0tPmNvbW1vbi5mbGFncyA9IEFPUE9CSl9EQVRBX1ZBTElEOwogCXBhcmFtc1sxXSA9IE5VTEw7CiAKIAlpbmZvLm5vZGUgPSBoYW5kbGU7CkBAIC0zMzYsMTggKzMxMCwxNyBAQAogCiAJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyByZXR1cm4gdmFsdWUgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKE1FVEhPRF9OQU1FX19TUlMsICZpbmZvKTsKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZShNRVRIT0RfTkFNRV9fU1JTLCAmaW5mbyk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCS8qIERlbGV0ZSBhbnkgcmV0dXJuIG9iamVjdCAoZXNwZWNpYWxseSBpZiBpbXBsaWNpdF9yZXR1cm4gaXMgZW5hYmxlZCkgKi8KIAogCQlpZiAoaW5mby5yZXR1cm5fb2JqZWN0KSB7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGluZm8ucmV0dXJuX29iamVjdCk7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaW5mby5yZXR1cm5fb2JqZWN0KTsKIAkJfQogCX0KIAogCS8qIENsZWFuIHVwIGFuZCByZXR1cm4gdGhlIHN0YXR1cyBmcm9tIGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocGFyYW1zWzBdKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHBhcmFtc1swXSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKaW5kZXggODNjOTQ0Yi4uZWU1YTVjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKQEAgLTQ3LDEwICs0Nyw5IEBACiAjaW5jbHVkZSA8YWNwaS9hY3Jlc3JjLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicnN4ZmFjZSIpCitBQ1BJX01PRFVMRV9OQU1FKCJyc3hmYWNlIikKIAogLyogTG9jYWwgbWFjcm9zIGZvciAxNiwzMi1iaXQgdG8gNjQtYml0IGNvbnZlcnNpb24gKi8KLQogI2RlZmluZSBBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgZmllbGQpICAoKG91dCktPmZpZWxkID0gKGluKS0+ZmllbGQpCiAjZGVmaW5lIEFDUElfQ09QWV9BRERSRVNTKG91dCwgaW4pICAgICAgICAgICAgICAgICAgICAgIFwKIAlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgcmVzb3VyY2VfdHlwZSk7ICAgICAgICAgICAgIFwKQEAgLTY1LDggKzY0LDYgQEAKIAlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOyBcCiAJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGFkZHJlc3NfbGVuZ3RoKTsgICAgICAgICAgICBcCiAJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIHJlc291cmNlX3NvdXJjZSk7Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUKQEAgLTg5LDE3ICs4NiwxMyBAQAogICogICAgICAgICAgICAgIHRoZSBvYmplY3QgaW5kaWNhdGVkIGJ5IHRoZSBwYXNzZWQgZGV2aWNlX2hhbmRsZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2hhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKQorYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF9pcnFfcm91dGluZ190YWJsZSAiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X2lycV9yb3V0aW5nX3RhYmxlICIpOwogCiAJLyoKIAkgKiBNdXN0IGhhdmUgYSB2YWxpZCBoYW5kbGUgYW5kIGJ1ZmZlciwgU28gd2UgaGF2ZSB0byBoYXZlIGEgaGFuZGxlCkBAIC0xMDgsMTkgKzEwMSwxOCBAQAogCSAqIHdlJ2xsIGJlIHJldHVybmluZyB0aGUgbmVlZGVkIGJ1ZmZlciBzaXplLCBzbyBrZWVwIGdvaW5nLgogCSAqLwogCWlmICghZGV2aWNlX2hhbmRsZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIgKHJldF9idWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyKHJldF9idWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3JzX2dldF9wcnRfbWV0aG9kX2RhdGEgKGRldmljZV9oYW5kbGUsIHJldF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2dldF9wcnRfbWV0aG9kX2RhdGEoZGV2aWNlX2hhbmRsZSwgcmV0X2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMKQEAgLTE0NiwxNSArMTM4LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2hhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKQorYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF9jdXJyZW50X3Jlc291cmNlcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMiKTsKIAogCS8qCiAJICogTXVzdCBoYXZlIGEgdmFsaWQgaGFuZGxlIGFuZCBidWZmZXIsIFNvIHdlIGhhdmUgdG8gaGF2ZSBhIGhhbmRsZQpAQCAtMTYzLDE5ICsxNTIsMTkgQEAKIAkgKiB3ZSdsbCBiZSByZXR1cm5pbmcgdGhlIG5lZWRlZCBidWZmZXIgc2l6ZSwgc28ga2VlcCBnb2luZy4KIAkgKi8KIAlpZiAoIWRldmljZV9oYW5kbGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyIChyZXRfYnVmZmVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihyZXRfYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9yc19nZXRfY3JzX21ldGhvZF9kYXRhIChkZXZpY2VfaGFuZGxlLCByZXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9yc19nZXRfY3JzX21ldGhvZF9kYXRhKGRldmljZV9oYW5kbGUsIHJldF9idWZmZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2dldF9jdXJyZW50X3Jlc291cmNlcyk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTIwMCwxNSArMTg5LDEyIEBACiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3Bvc3NpYmxlX3Jlc291cmNlcyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpCithY3BpX2dldF9wb3NzaWJsZV9yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9nZXRfcG9zc2libGVfcmVzb3VyY2VzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9wb3NzaWJsZV9yZXNvdXJjZXMiKTsKIAogCS8qCiAJICogTXVzdCBoYXZlIGEgdmFsaWQgaGFuZGxlIGFuZCBidWZmZXIsIFNvIHdlIGhhdmUgdG8gaGF2ZSBhIGhhbmRsZQpAQCAtMjE3LDIwICsyMDMsMjAgQEAKIAkgKiB3ZSdsbCBiZSByZXR1cm5pbmcgdGhlIG5lZWRlZCBidWZmZXIgc2l6ZSwgc28ga2VlcCBnb2luZy4KIAkgKi8KIAlpZiAoIWRldmljZV9oYW5kbGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyIChyZXRfYnVmZmVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihyZXRfYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9yc19nZXRfcHJzX21ldGhvZF9kYXRhIChkZXZpY2VfaGFuZGxlLCByZXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9yc19nZXRfcHJzX21ldGhvZF9kYXRhKGRldmljZV9oYW5kbGUsIHJldF9idWZmZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2dldF9wb3NzaWJsZV9yZXNvdXJjZXMpOwotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKK0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfcG9zc2libGVfcmVzb3VyY2VzKTsKKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjUyLDM3ICsyMzgsMzMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3dhbGtfcmVzb3VyY2VzICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2hhbmRsZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGgsCi0JQUNQSV9XQUxLX1JFU09VUkNFX0NBTExCQUNLICAgICB1c2VyX2Z1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCkKK2FjcGlfd2Fsa19yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJICAgIGNoYXIgKnBhdGgsCisJCSAgICBBQ1BJX1dBTEtfUkVTT1VSQ0VfQ0FMTEJBQ0sgdXNlcl9mdW5jdGlvbiwgdm9pZCAqY29udGV4dCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAgICAgYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICAgICAqcmVzb3VyY2U7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAgICAgKmJ1ZmZlcl9lbmQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpidWZmZXJfZW5kOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV93YWxrX3Jlc291cmNlcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV93YWxrX3Jlc291cmNlcyIpOwogCiAJaWYgKCFkZXZpY2VfaGFuZGxlIHx8Ci0JCShBQ1BJX1NUUk5DTVAgKHBhdGgsIE1FVEhPRF9OQU1FX19DUlMsIHNpemVvZiAoTUVUSE9EX05BTUVfX0NSUykpICYmCi0JCSBBQ1BJX1NUUk5DTVAgKHBhdGgsIE1FVEhPRF9OQU1FX19QUlMsIHNpemVvZiAoTUVUSE9EX05BTUVfX1BSUykpKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCSAgICAoQUNQSV9TVFJOQ01QKHBhdGgsIE1FVEhPRF9OQU1FX19DUlMsIHNpemVvZihNRVRIT0RfTkFNRV9fQ1JTKSkgJiYKKwkgICAgIEFDUElfU1RSTkNNUChwYXRoLCBNRVRIT0RfTkFNRV9fUFJTLCBzaXplb2YoTUVUSE9EX05BTUVfX1BSUykpKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9yc19nZXRfbWV0aG9kX2RhdGEgKGRldmljZV9oYW5kbGUsIHBhdGgsICZidWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X21ldGhvZF9kYXRhKGRldmljZV9oYW5kbGUsIHBhdGgsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBTZXR1cCBwb2ludGVycyAqLwogCi0JcmVzb3VyY2UgID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlICopIGJ1ZmZlci5wb2ludGVyOwotCWJ1ZmZlcl9lbmQgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwKLQkJCSAgKCh1OCAqKSBidWZmZXIucG9pbnRlciArIGJ1ZmZlci5sZW5ndGgpKTsKKwlyZXNvdXJjZSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqKWJ1ZmZlci5wb2ludGVyOworCWJ1ZmZlcl9lbmQgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3Jlc291cmNlLAorCQkJCSAgICgodTggKikgYnVmZmVyLnBvaW50ZXIgKyBidWZmZXIubGVuZ3RoKSk7CiAKIAkvKiBXYWxrIHRoZSByZXNvdXJjZSBsaXN0ICovCiAKQEAgLTI5MSw3ICsyNzMsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlzdGF0dXMgPSB1c2VyX2Z1bmN0aW9uIChyZXNvdXJjZSwgY29udGV4dCk7CisJCXN0YXR1cyA9IHVzZXJfZnVuY3Rpb24ocmVzb3VyY2UsIGNvbnRleHQpOwogCiAJCXN3aXRjaCAoc3RhdHVzKSB7CiAJCWNhc2UgQUVfT0s6CkBAIC0zMTgsNyArMzAwLDcgQEAKIAogCQkvKiBHZXQgdGhlIG5leHQgcmVzb3VyY2UgZGVzY3JpcHRvciAqLwogCi0JCXJlc291cmNlID0gQUNQSV9ORVhUX1JFU09VUkNFIChyZXNvdXJjZSk7CisJCXJlc291cmNlID0gQUNQSV9ORVhUX1JFU09VUkNFKHJlc291cmNlKTsKIAogCQkvKiBDaGVjayBmb3IgZW5kLW9mLWJ1ZmZlciAqLwogCkBAIC0zMjcsMTMgKzMwOSwxMyBAQAogCQl9CiAJfQogCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAotCWFjcGlfb3NfZnJlZSAoYnVmZmVyLnBvaW50ZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX3dhbGtfcmVzb3VyY2VzKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX3dhbGtfcmVzb3VyY2VzKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0zNTQsMzAgKzMzNiwyNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGRldmljZV9oYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqaW5fYnVmZmVyKQorYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqaW5fYnVmZmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcyIpOwogCiAJLyogTXVzdCBoYXZlIGEgdmFsaWQgaGFuZGxlIGFuZCBidWZmZXIgKi8KIAotCWlmICgoIWRldmljZV9oYW5kbGUpICAgICAgfHwKLQkJKCFpbl9idWZmZXIpICAgICAgICAgIHx8Ci0JCSghaW5fYnVmZmVyLT5wb2ludGVyKSB8fAotCQkoIWluX2J1ZmZlci0+bGVuZ3RoKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCWlmICgoIWRldmljZV9oYW5kbGUpIHx8CisJICAgICghaW5fYnVmZmVyKSB8fCAoIWluX2J1ZmZlci0+cG9pbnRlcikgfHwgKCFpbl9idWZmZXItPmxlbmd0aCkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfcnNfc2V0X3Nyc19tZXRob2RfZGF0YSAoZGV2aWNlX2hhbmRsZSwgaW5fYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhKGRldmljZV9oYW5kbGUsIGluX2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0zOTgsNDEgKzM3NSwzOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0ICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICAgICAqcmVzb3VyY2UsCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0ICAgICAgKm91dCkKK2FjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCSAgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCAqb3V0KQogewotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiAgICAgICphZGRyZXNzMTY7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyICAgICAgKmFkZHJlc3MzMjsKLQorCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiAqYWRkcmVzczE2OworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiAqYWRkcmVzczMyOwogCiAJc3dpdGNoIChyZXNvdXJjZS0+aWQpIHsKIAljYXNlIEFDUElfUlNUWVBFX0FERFJFU1MxNjoKIAotCQlhZGRyZXNzMTYgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2ICopICZyZXNvdXJjZS0+ZGF0YTsKLQkJQUNQSV9DT1BZX0FERFJFU1MgKG91dCwgYWRkcmVzczE2KTsKKwkJYWRkcmVzczE2ID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiAqKSZyZXNvdXJjZS0+ZGF0YTsKKwkJQUNQSV9DT1BZX0FERFJFU1Mob3V0LCBhZGRyZXNzMTYpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTMzI6CiAKLQkJYWRkcmVzczMyID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiAqKSAmcmVzb3VyY2UtPmRhdGE7Ci0JCUFDUElfQ09QWV9BRERSRVNTIChvdXQsIGFkZHJlc3MzMik7CisJCWFkZHJlc3MzMiA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIgKikmcmVzb3VyY2UtPmRhdGE7CisJCUFDUElfQ09QWV9BRERSRVNTKG91dCwgYWRkcmVzczMyKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzY0OgogCiAJCS8qIFNpbXBsZSBjb3B5IGZvciA2NCBiaXQgc291cmNlICovCiAKLQkJQUNQSV9NRU1DUFkgKG91dCwgJnJlc291cmNlLT5kYXRhLCBzaXplb2YgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCkpOworCQlBQ1BJX01FTUNQWShvdXQsICZyZXNvdXJjZS0+ZGF0YSwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KSk7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCXJldHVybiAoQUVfT0spOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zY2FuLmMgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCmluZGV4IGNiY2RhMzAuLmM2ZGI1OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zY2FuLmMKKysrIGIvZHJpdmVycy9hY3BpL3NjYW4uYwpAQCAtOSwxNCArOSwxMCBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgkvKiBmb3IgYWNwaV9leF9laXNhX2lkX3RvX3N0cmluZygpICovCiAKLQogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0JVU19DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgic2NhbiIpCi0KK0FDUElfTU9EVUxFX05BTUUoInNjYW4iKQogI2RlZmluZSBTVFJVQ1RfVE9fSU5UKHMpCSgqKChpbnQqKSZzKSkKLQotZXh0ZXJuIHN0cnVjdCBhY3BpX2RldmljZQkJKmFjcGlfcm9vdDsKLQorZXh0ZXJuIHN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9yb290OwogCiAjZGVmaW5lIEFDUElfQlVTX0NMQVNTCQkJInN5c3RlbV9idXMiCiAjZGVmaW5lIEFDUElfQlVTX0hJRAkJCSJBQ1BJX0JVUyIKQEAgLTI3LDEzICsyMywxMSBAQAogREVGSU5FX1NQSU5MT0NLKGFjcGlfZGV2aWNlX2xvY2spOwogTElTVF9IRUFEKGFjcGlfd2FrZXVwX2RldmljZV9saXN0KTsKIAotc3RhdGljIGludAotYWNwaV9idXNfdHJpbShzdHJ1Y3QgYWNwaV9kZXZpY2UJKnN0YXJ0LAotCQlpbnQgcm1kZXZpY2UpOworc3RhdGljIGludCBhY3BpX2J1c190cmltKHN0cnVjdCBhY3BpX2RldmljZSAqc3RhcnQsIGludCBybWRldmljZSk7CiAKLXN0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKiBrb2JqKQorc3RhdGljIHZvaWQgYWNwaV9kZXZpY2VfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXYgPSBjb250YWluZXJfb2Yoa29iaixzdHJ1Y3QgYWNwaV9kZXZpY2Usa29iaik7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGFjcGlfZGV2aWNlLCBrb2JqKTsKIAlpZiAoZGV2LT5wbnAuY2lkX2xpc3QpCiAJCWtmcmVlKGRldi0+cG5wLmNpZF9saXN0KTsKIAlrZnJlZShkZXYpOwpAQCAtNDEsMzQgKzM1LDM0IEBACiAKIHN0cnVjdCBhY3BpX2RldmljZV9hdHRyaWJ1dGUgewogCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGFjcGlfZGV2aWNlICosIGNoYXIgKik7Ci0Jc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgYWNwaV9kZXZpY2UgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworCSBzc2l6ZV90KCpzaG93KSAoc3RydWN0IGFjcGlfZGV2aWNlICosIGNoYXIgKik7CisJIHNzaXplX3QoKnN0b3JlKSAoc3RydWN0IGFjcGlfZGV2aWNlICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKIH07CiAKIHR5cGVkZWYgdm9pZCBhY3BpX2RldmljZV9zeXNmc19maWxlcyhzdHJ1Y3Qga29iamVjdCAqLAotCQkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKik7CisJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICopOwogCiBzdGF0aWMgdm9pZCBzZXR1cF9zeXNfZnNfZGV2aWNlX2ZpbGVzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2LAotCQlhY3BpX2RldmljZV9zeXNmc19maWxlcyAqZnVuYyk7CisJCQkJICAgICAgYWNwaV9kZXZpY2Vfc3lzZnNfZmlsZXMgKiBmdW5jKTsKIAogI2RlZmluZSBjcmVhdGVfc3lzZnNfZGV2aWNlX2ZpbGVzKGRldikJXAogCXNldHVwX3N5c19mc19kZXZpY2VfZmlsZXMoZGV2LCAoYWNwaV9kZXZpY2Vfc3lzZnNfZmlsZXMgKikmc3lzZnNfY3JlYXRlX2ZpbGUpCiAjZGVmaW5lIHJlbW92ZV9zeXNmc19kZXZpY2VfZmlsZXMoZGV2KQlcCiAJc2V0dXBfc3lzX2ZzX2RldmljZV9maWxlcyhkZXYsIChhY3BpX2RldmljZV9zeXNmc19maWxlcyAqKSZzeXNmc19yZW1vdmVfZmlsZSkKIAotCiAjZGVmaW5lIHRvX2FjcGlfZGV2aWNlKG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIGtvYmopCiAjZGVmaW5lIHRvX2hhbmRsZV9hdHRyKG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgYWNwaV9kZXZpY2VfYXR0cmlidXRlLCBhdHRyKTsKIAogc3RhdGljIHNzaXplX3QgYWNwaV9kZXZpY2VfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCisJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSB0b19hY3BpX2RldmljZShrb2JqKTsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2VfYXR0cmlidXRlICphdHRyaWJ1dGUgPSB0b19oYW5kbGVfYXR0cihhdHRyKTsKIAlyZXR1cm4gYXR0cmlidXRlLT5zaG93ID8gYXR0cmlidXRlLT5zaG93KGRldmljZSwgYnVmKSA6IC1FSU87CiB9CiBzdGF0aWMgc3NpemVfdCBhY3BpX2RldmljZV9hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCisJCQkJICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgICAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSB0b19hY3BpX2RldmljZShrb2JqKTsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2VfYXR0cmlidXRlICphdHRyaWJ1dGUgPSB0b19oYW5kbGVfYXR0cihhdHRyKTsKQEAgLTc2LDEzICs3MCwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBhY3BpX2RldmljZV9zeXNmc19vcHMgPSB7Ci0JLnNob3cJPSBhY3BpX2RldmljZV9hdHRyX3Nob3csCi0JLnN0b3JlCT0gYWNwaV9kZXZpY2VfYXR0cl9zdG9yZSwKKwkuc2hvdyA9IGFjcGlfZGV2aWNlX2F0dHJfc2hvdywKKwkuc3RvcmUgPSBhY3BpX2RldmljZV9hdHRyX3N0b3JlLAogfTsKIAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUga3R5cGVfYWNwaV9ucyA9IHsKLQkuc3lzZnNfb3BzCT0gJmFjcGlfZGV2aWNlX3N5c2ZzX29wcywKLQkucmVsZWFzZQk9IGFjcGlfZGV2aWNlX3JlbGVhc2UsCisJLnN5c2ZzX29wcyA9ICZhY3BpX2RldmljZV9zeXNmc19vcHMsCisJLnJlbGVhc2UgPSBhY3BpX2RldmljZV9yZWxlYXNlLAogfTsKIAogc3RhdGljIGludCBuYW1lc3BhY2VfaG90cGx1ZyhzdHJ1Y3Qga3NldCAqa3NldCwgc3RydWN0IGtvYmplY3QgKmtvYmosCkBAIC0xMTAsMTYgKzEwNCwxNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBrc2V0IGFjcGlfbmFtZXNwYWNlX2tzZXQgPSB7Ci0JLmtvYmoJCT0geyAKLQkJLm5hbWUgPSAibmFtZXNwYWNlIiwKLQl9LAorCS5rb2JqID0geworCQkgLm5hbWUgPSAibmFtZXNwYWNlIiwKKwkJIH0sCiAJLnN1YnN5cyA9ICZhY3BpX3N1YnN5cywKLQkua3R5cGUJPSAma3R5cGVfYWNwaV9ucywKKwkua3R5cGUgPSAma3R5cGVfYWNwaV9ucywKIAkuaG90cGx1Z19vcHMgPSAmbmFtZXNwYWNlX2hvdHBsdWdfb3BzLAogfTsKIAotCi1zdGF0aWMgdm9pZCBhY3BpX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UsIHN0cnVjdCBhY3BpX2RldmljZSAqIHBhcmVudCkKK3N0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAorCQkJCSBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCkKIHsKIAkvKgogCSAqIExpbmthZ2UKQEAgLTEzNCwxNCArMTI4LDE0IEBACiAJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAlpZiAoZGV2aWNlLT5wYXJlbnQpIHsKIAkJbGlzdF9hZGRfdGFpbCgmZGV2aWNlLT5ub2RlLCAmZGV2aWNlLT5wYXJlbnQtPmNoaWxkcmVuKTsKLQkJbGlzdF9hZGRfdGFpbCgmZGV2aWNlLT5nX2xpc3QsJmRldmljZS0+cGFyZW50LT5nX2xpc3QpOworCQlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPmdfbGlzdCwgJmRldmljZS0+cGFyZW50LT5nX2xpc3QpOwogCX0gZWxzZQotCQlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPmdfbGlzdCwmYWNwaV9kZXZpY2VfbGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+Z19saXN0LCAmYWNwaV9kZXZpY2VfbGlzdCk7CiAJaWYgKGRldmljZS0+d2FrZXVwLmZsYWdzLnZhbGlkKQotCQlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPndha2V1cF9saXN0LCZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+d2FrZXVwX2xpc3QsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCk7CiAJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCi0Jc3RybGNweShkZXZpY2UtPmtvYmoubmFtZSxkZXZpY2UtPnBucC5idXNfaWQsS09CSl9OQU1FX0xFTik7CisJc3RybGNweShkZXZpY2UtPmtvYmoubmFtZSwgZGV2aWNlLT5wbnAuYnVzX2lkLCBLT0JKX05BTUVfTEVOKTsKIAlpZiAocGFyZW50KQogCQlkZXZpY2UtPmtvYmoucGFyZW50ID0gJnBhcmVudC0+a29iajsKIAlkZXZpY2UtPmtvYmoua3R5cGUgPSAma3R5cGVfYWNwaV9uczsKQEAgLTE1MCwxMCArMTQ0LDcgQEAKIAljcmVhdGVfc3lzZnNfZGV2aWNlX2ZpbGVzKGRldmljZSk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfZGV2aWNlX3VucmVnaXN0ZXIgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLCAKLQlpbnQJCQl0eXBlKQorc3RhdGljIGludCBhY3BpX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKIAlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCWlmIChkZXZpY2UtPnBhcmVudCkgewpAQCAtMTcyLDExICsxNjMsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkCi1hY3BpX2J1c19kYXRhX2hhbmRsZXIgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0JdTMyCQkJZnVuY3Rpb24sCi0Jdm9pZAkJCSpjb250ZXh0KQordm9pZCBhY3BpX2J1c19kYXRhX2hhbmRsZXIoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZnVuY3Rpb24sIHZvaWQgKmNvbnRleHQpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfZGF0YV9oYW5kbGVyIik7CiAKQEAgLTE4NSwxMyArMTcyLDExIEBACiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfYnVzX2dldF9wb3dlcl9mbGFncyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfYnVzX2dldF9wb3dlcl9mbGFncyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICBzdGF0dXMgPSAwOwotCWFjcGlfaGFuZGxlCQloYW5kbGUgPSBOVUxMOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIGkgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CisJYWNwaV9oYW5kbGUgaGFuZGxlID0gTlVMTDsKKwl1MzIgaSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19nZXRfcG93ZXJfZmxhZ3MiKTsKIApAQCAtMjEwLDExICsxOTUsMTEgQEAKIAkgKi8KIAlmb3IgKGkgPSBBQ1BJX1NUQVRFX0QwOyBpIDw9IEFDUElfU1RBVEVfRDM7IGkrKykgewogCQlzdHJ1Y3QgYWNwaV9kZXZpY2VfcG93ZXJfc3RhdGUgKnBzID0gJmRldmljZS0+cG93ZXIuc3RhdGVzW2ldOwotCQljaGFyCQlvYmplY3RfbmFtZVs1XSA9IHsnXycsJ1AnLCdSJywnMCcraSwnXDAnfTsKKwkJY2hhciBvYmplY3RfbmFtZVs1XSA9IHsgJ18nLCAnUCcsICdSJywgJzAnICsgaSwgJ1wwJyB9OwogCiAJCS8qIEV2YWx1YXRlICJfUFJ4IiB0byBzZSBpZiBwb3dlciByZXNvdXJjZXMgYXJlIHJlZmVyZW5jZWQgKi8KIAkJYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UoZGV2aWNlLT5oYW5kbGUsIG9iamVjdF9uYW1lLCBOVUxMLAotCQkJJnBzLT5yZXNvdXJjZXMpOworCQkJCQkmcHMtPnJlc291cmNlcyk7CiAJCWlmIChwcy0+cmVzb3VyY2VzLmNvdW50KSB7CiAJCQlkZXZpY2UtPnBvd2VyLmZsYWdzLnBvd2VyX3Jlc291cmNlcyA9IDE7CiAJCQlwcy0+ZmxhZ3MudmFsaWQgPSAxOwpAQCAtMjMyLDcgKzIxNyw3IEBACiAJCWlmIChwcy0+cmVzb3VyY2VzLmNvdW50IHx8IHBzLT5mbGFncy5leHBsaWNpdF9zZXQpCiAJCQlwcy0+ZmxhZ3MudmFsaWQgPSAxOwogCi0JCXBzLT5wb3dlciA9IC0xOwkJLyogVW5rbm93biAtIGRyaXZlciBhc3NpZ25lZCAqLworCQlwcy0+cG93ZXIgPSAtMTsJLyogVW5rbm93biAtIGRyaXZlciBhc3NpZ25lZCAqLwogCQlwcy0+bGF0ZW5jeSA9IC0xOwkvKiBVbmtub3duIC0gZHJpdmVyIGFzc2lnbmVkICovCiAJfQogCkBAIC0yNDksMTMgKzIzNCwxMCBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotaW50Ci1hY3BpX21hdGNoX2lkcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsCi0JY2hhcgkJCSppZHMpCitpbnQgYWNwaV9tYXRjaF9pZHMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGNoYXIgKmlkcykKIHsKIAlpbnQgZXJyb3IgPSAwOwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAKIAlpZiAoZGV2aWNlLT5mbGFncy5oYXJkd2FyZV9pZCkKIAkJaWYgKHN0cnN0cihpZHMsIGRldmljZS0+cG5wLmhhcmR3YXJlX2lkKSkKQEAgLTI2NiwyNyArMjQ4LDI1IEBACiAJCWludCBpOwogCiAJCS8qIGNvbXBhcmUgbXVsdGlwbGUgX0NJRCBlbnRyaWVzIGFnYWluc3QgZHJpdmVyIGlkcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgY2lkX2xpc3QtPmNvdW50OyBpKyspCi0JCXsKKwkJZm9yIChpID0gMDsgaSA8IGNpZF9saXN0LT5jb3VudDsgaSsrKSB7CiAJCQlpZiAoc3Ryc3RyKGlkcywgY2lkX2xpc3QtPmlkW2ldLnZhbHVlKSkKIAkJCQlnb3RvIERvbmU7CiAJCX0KIAl9CiAJZXJyb3IgPSAtRU5PRU5UOwogCi0gRG9uZToKKyAgICAgIERvbmU6CiAJaWYgKGJ1ZmZlci5wb2ludGVyKQogCQlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2J1c19leHRyYWN0X3dha2V1cF9kZXZpY2VfcG93ZXJfcGFja2FnZSAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsCi0JdW5pb24gYWNwaV9vYmplY3QJKnBhY2thZ2UpCithY3BpX2J1c19leHRyYWN0X3dha2V1cF9kZXZpY2VfcG93ZXJfcGFja2FnZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgICB1bmlvbiBhY3BpX29iamVjdCAqcGFja2FnZSkKIHsKLQlpbnQgCSBpID0gMDsKLQl1bmlvbiBhY3BpX29iamVjdAkqZWxlbWVudCA9IE5VTEw7CisJaW50IGkgPSAwOworCXVuaW9uIGFjcGlfb2JqZWN0ICplbGVtZW50ID0gTlVMTDsKIAogCWlmICghZGV2aWNlIHx8ICFwYWNrYWdlIHx8IChwYWNrYWdlLT5wYWNrYWdlLmNvdW50IDwgMikpCiAJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOwpAQCAtMjk2LDE0ICsyNzYsMTcgQEAKIAkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CiAJaWYgKGVsZW1lbnQtPnR5cGUgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKIAkJaWYgKChlbGVtZW50LT5wYWNrYWdlLmNvdW50IDwgMikgfHwKLQkJCShlbGVtZW50LT5wYWNrYWdlLmVsZW1lbnRzWzBdLnR5cGUgIT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgfHwKLQkJCShlbGVtZW50LT5wYWNrYWdlLmVsZW1lbnRzWzFdLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpKQorCQkgICAgKGVsZW1lbnQtPnBhY2thZ2UuZWxlbWVudHNbMF0udHlwZSAhPQorCQkgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpCisJCSAgICB8fCAoZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1sxXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKSkKIAkJCXJldHVybiBBRV9CQURfREFUQTsKLQkJZGV2aWNlLT53YWtldXAuZ3BlX2RldmljZSA9IGVsZW1lbnQtPnBhY2thZ2UuZWxlbWVudHNbMF0ucmVmZXJlbmNlLmhhbmRsZTsKLQkJZGV2aWNlLT53YWtldXAuZ3BlX251bWJlciA9ICh1MzIpZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1sxXS5pbnRlZ2VyLnZhbHVlOwotCX1lbHNlIGlmIChlbGVtZW50LT50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CisJCWRldmljZS0+d2FrZXVwLmdwZV9kZXZpY2UgPQorCQkgICAgZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1swXS5yZWZlcmVuY2UuaGFuZGxlOworCQlkZXZpY2UtPndha2V1cC5ncGVfbnVtYmVyID0KKwkJICAgICh1MzIpIGVsZW1lbnQtPnBhY2thZ2UuZWxlbWVudHNbMV0uaW50ZWdlci52YWx1ZTsKKwl9IGVsc2UgaWYgKGVsZW1lbnQtPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJZGV2aWNlLT53YWtldXAuZ3BlX251bWJlciA9IGVsZW1lbnQtPmludGVnZXIudmFsdWU7Ci0JfWVsc2UKKwl9IGVsc2UKIAkJcmV0dXJuIEFFX0JBRF9EQVRBOwogCiAJZWxlbWVudCA9ICYocGFja2FnZS0+cGFja2FnZS5lbGVtZW50c1sxXSk7CkBAIC0zMTYsOSArMjk5LDkgQEAKIAkJcmV0dXJuIEFFX05PX01FTU9SWTsKIAl9CiAJZGV2aWNlLT53YWtldXAucmVzb3VyY2VzLmNvdW50ID0gcGFja2FnZS0+cGFja2FnZS5jb3VudCAtIDI7Ci0JZm9yIChpPTA7IGkgPCBkZXZpY2UtPndha2V1cC5yZXNvdXJjZXMuY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPndha2V1cC5yZXNvdXJjZXMuY291bnQ7IGkrKykgewogCQllbGVtZW50ID0gJihwYWNrYWdlLT5wYWNrYWdlLmVsZW1lbnRzW2kgKyAyXSk7Ci0JCWlmIChlbGVtZW50LT50eXBlICE9IEFDUElfVFlQRV9BTlkgKSB7CisJCWlmIChlbGVtZW50LT50eXBlICE9IEFDUElfVFlQRV9BTlkpIHsKIAkJCXJldHVybiBBRV9CQURfREFUQTsKIAkJfQogCkBAIC0zMjgsMTMgKzMxMSwxMSBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotc3RhdGljIGludAotYWNwaV9idXNfZ2V0X3dha2V1cF9kZXZpY2VfZmxhZ3MgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2J1c19nZXRfd2FrZXVwX2RldmljZV9mbGFncyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlhY3BpX3N0YXR1cwlzdGF0dXMgPSAwOwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwotCXVuaW9uIGFjcGlfb2JqZWN0CSpwYWNrYWdlID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKnBhY2thZ2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfZ2V0X3dha2V1cF9mbGFncyIpOwogCkBAIC0zNDUsMjEgKzMyNiwyMiBAQAogCQlnb3RvIGVuZDsKIAl9CiAKLQlwYWNrYWdlID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIGJ1ZmZlci5wb2ludGVyOworCXBhY2thZ2UgPSAodW5pb24gYWNwaV9vYmplY3QgKilidWZmZXIucG9pbnRlcjsKIAlzdGF0dXMgPSBhY3BpX2J1c19leHRyYWN0X3dha2V1cF9kZXZpY2VfcG93ZXJfcGFja2FnZShkZXZpY2UsIHBhY2thZ2UpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRXJyb3IgZXh0cmFjdGluZyBfUFJXIHBhY2thZ2VcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJFcnJvciBleHRyYWN0aW5nIF9QUlcgcGFja2FnZVxuIikpOwogCQlnb3RvIGVuZDsKIAl9CiAKIAlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCiAJZGV2aWNlLT53YWtldXAuZmxhZ3MudmFsaWQgPSAxOwotCS8qIFBvd2VyIGJ1dHRvbiwgTGlkIHN3aXRjaCBhbHdheXMgZW5hYmxlIHdha2V1cCovCisJLyogUG93ZXIgYnV0dG9uLCBMaWQgc3dpdGNoIGFsd2F5cyBlbmFibGUgd2FrZXVwICovCiAJaWYgKCFhY3BpX21hdGNoX2lkcyhkZXZpY2UsICJQTlAwQzBELFBOUDBDMEMsUE5QMEMwRSIpKQogCQlkZXZpY2UtPndha2V1cC5mbGFncy5ydW5fd2FrZSA9IDE7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCWRldmljZS0+ZmxhZ3Mud2FrZV9jYXBhYmxlID0gMDsKIAlyZXR1cm5fVkFMVUUoMCk7CkBAIC0zNjgsOCArMzUwLDggQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCUFDUEkgaG90cGx1ZyBzeXNmcyBkZXZpY2UgZmlsZSBzdXBwb3J0CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHNzaXplX3QgYWNwaV9lamVjdF9zdG9yZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK3N0YXRpYyBzc2l6ZV90IGFjcGlfZWplY3Rfc3RvcmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogCiAjZGVmaW5lIEFDUElfREVWSUNFX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKSBcCiBzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2F0dHJpYnV0ZSBhY3BpX2RldmljZV9hdHRyXyMjX25hbWUgPSBcCkBAIC0zODMsMTIgKzM2NSwxMSBAQAogICogQGZ1bmM6CWZ1bmN0aW9uIHBvaW50ZXIgdG8gY3JlYXRlIG9yIGRlc3Ryb3kgdGhlIGRldmljZSBmaWxlCiAgKi8KIHN0YXRpYyB2b2lkCi1zZXR1cF9zeXNfZnNfZGV2aWNlX2ZpbGVzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiwKLQlhY3BpX2RldmljZV9zeXNmc19maWxlcyAqZnVuYykKK3NldHVwX3N5c19mc19kZXZpY2VfZmlsZXMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXYsCisJCQkgIGFjcGlfZGV2aWNlX3N5c2ZzX2ZpbGVzICogZnVuYykKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzOwotCWFjcGlfaGFuZGxlCQl0ZW1wID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9oYW5kbGUgdGVtcCA9IE5VTEw7CiAKIAkvKgogCSAqIElmIGRldmljZSBoYXMgX0VKMCwgJ2VqZWN0JyBmaWxlIGlzIGNyZWF0ZWQgdGhhdCBpcyB1c2VkIHRvIHRyaWdnZXIKQEAgLTM5NiwxMSArMzc3LDEwIEBACiAJICovCiAJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGRldi0+aGFuZGxlLCAiX0VKMCIsICZ0ZW1wKTsKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCi0JCSgqKGZ1bmMpKSgmZGV2LT5rb2JqLCZhY3BpX2RldmljZV9hdHRyX2VqZWN0LmF0dHIpOworCQkoKihmdW5jKSkgKCZkZXYtPmtvYmosICZhY3BpX2RldmljZV9hdHRyX2VqZWN0LmF0dHIpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX2VqZWN0X29wZXJhdGlvbihhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBsb2NrYWJsZSkKK3N0YXRpYyBpbnQgYWNwaV9lamVjdF9vcGVyYXRpb24oYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgbG9ja2FibGUpCiB7CiAJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3Q7CiAJdW5pb24gYWNwaV9vYmplY3QgYXJnOwpAQCAtNDI5LDI3ICs0MDksMjUgQEAKIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgIl9FSjAiLCAmYXJnX2xpc3QsIE5VTEwpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4oLUVOT0RFVik7CisJCXJldHVybiAoLUVOT0RFVik7CiAJfQogCi0JcmV0dXJuKDApOworCXJldHVybiAoMCk7CiB9CiAKLQogc3RhdGljIHNzaXplX3QKIGFjcGlfZWplY3Rfc3RvcmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCWludAlyZXN1bHQ7Ci0JaW50CXJldCA9IGNvdW50OwotCWludAlpc2xvY2thYmxlOwotCWFjcGlfc3RhdHVzCXN0YXR1czsKLQlhY3BpX2hhbmRsZQloYW5kbGU7Ci0JYWNwaV9vYmplY3RfdHlwZQl0eXBlID0gMDsKKwlpbnQgcmVzdWx0OworCWludCByZXQgPSBjb3VudDsKKwlpbnQgaXNsb2NrYWJsZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCWFjcGlfb2JqZWN0X3R5cGUgdHlwZSA9IDA7CiAKIAlpZiAoKCFjb3VudCkgfHwgKGJ1ZlswXSAhPSAnMScpKSB7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQogI2lmbmRlZiBGT1JDRV9FSkVDVAogCWlmIChkZXZpY2UtPmRyaXZlciA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9ERVY7CkBAIC00NTcsNyArNDM1LDcgQEAKIAl9CiAjZW5kaWYKIAlzdGF0dXMgPSBhY3BpX2dldF90eXBlKGRldmljZS0+aGFuZGxlLCAmdHlwZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICghZGV2aWNlLT5mbGFncy5lamVjdGFibGUpICkgeworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAoIWRldmljZS0+ZmxhZ3MuZWplY3RhYmxlKSkgewogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycjsKIAl9CkBAIC00NzYsMTggKzQ1NCwxNSBAQAogCWlmIChyZXN1bHQpIHsKIAkJcmV0ID0gLUVCVVNZOwogCX0KLWVycjoKKyAgICAgIGVycjoKIAlyZXR1cm4gcmV0OwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtYW5jZSBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50Ci1hY3BpX2J1c19nZXRfcGVyZl9mbGFncyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfYnVzX2dldF9wZXJmX2ZsYWdzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWRldmljZS0+cGVyZm9ybWFuY2Uuc3RhdGUgPSBBQ1BJX1NUQVRFX1VOS05PV047CiAJcmV0dXJuIDA7CkBAIC01MDAsNyArNDc1LDYgQEAKIHN0YXRpYyBMSVNUX0hFQUQoYWNwaV9idXNfZHJpdmVycyk7CiBzdGF0aWMgREVDTEFSRV9NVVRFWChhY3BpX2J1c19kcml2ZXJzX2xvY2spOwogCi0KIC8qKgogICogYWNwaV9idXNfbWF0Y2ggCiAgKiAtLS0tLS0tLS0tLS0tLQpAQCAtNTA4LDE2ICs0ODIsMTMgQEAKICAqIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBkcml2ZXIncyBjcml0ZXJpYS4KICAqLwogc3RhdGljIGludAotYWNwaV9idXNfbWF0Y2ggKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCXN0cnVjdCBhY3BpX2RyaXZlcgkqZHJpdmVyKQorYWNwaV9idXNfbWF0Y2goc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKQogewogCWlmIChkcml2ZXIgJiYgZHJpdmVyLT5vcHMubWF0Y2gpCiAJCXJldHVybiBkcml2ZXItPm9wcy5tYXRjaChkZXZpY2UsIGRyaXZlcik7CiAJcmV0dXJuIGFjcGlfbWF0Y2hfaWRzKGRldmljZSwgZHJpdmVyLT5pZHMpOwogfQogCi0KIC8qKgogICogYWNwaV9idXNfZHJpdmVyX2luaXQgCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTI1LDExICs0OTYsOSBAQAogICogZHJpdmVyIGlzIGJvdW5kIHRvIGEgZGV2aWNlLiAgSW52b2tlcyB0aGUgZHJpdmVyJ3MgYWRkKCkgYW5kIHN0YXJ0KCkgb3BzLgogICovCiBzdGF0aWMgaW50Ci1hY3BpX2J1c19kcml2ZXJfaW5pdCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsIAotCXN0cnVjdCBhY3BpX2RyaXZlcgkqZHJpdmVyKQorYWNwaV9idXNfZHJpdmVyX2luaXQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19kcml2ZXJfaW5pdCIpOwogCkBAIC01NTMsMTMgKzUyMiwxMiBAQAogCSAqIHVwb24gcG9zc2libGUgY29uZmlndXJhdGlvbiBhbmQgY3VycmVudGx5IGFsbG9jYXRlZCByZXNvdXJjZXMuCiAJICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEcml2ZXIgc3VjY2Vzc2Z1bGx5IGJvdW5kIHRvIGRldmljZVxuIikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIkRyaXZlciBzdWNjZXNzZnVsbHkgYm91bmQgdG8gZGV2aWNlXG4iKSk7CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1pbnQKLWFjcGlfc3RhcnRfc2luZ2xlX29iamVjdCAoCi0JCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3Qoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXI7CkBAIC01NzgsMTYgKzU0NiwxNyBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi1zdGF0aWMgaW50IGFjcGlfZHJpdmVyX2F0dGFjaChzdHJ1Y3QgYWNwaV9kcml2ZXIgKiBkcnYpCitzdGF0aWMgaW50IGFjcGlfZHJpdmVyX2F0dGFjaChzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRydikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZSwgKiBuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OwogCWludCBjb3VudCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2RyaXZlcl9hdHRhY2giKTsKIAogCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX2RldmljZV9saXN0KSB7Ci0JCXN0cnVjdCBhY3BpX2RldmljZSAqIGRldiA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIGdfbGlzdCk7CisJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0KKwkJICAgIGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIGdfbGlzdCk7CiAKIAkJaWYgKGRldi0+ZHJpdmVyIHx8ICFkZXYtPnN0YXR1cy5wcmVzZW50KQogCQkJY29udGludWU7CkBAIC01OTgsNyArNTY3LDggQEAKIAkJCQlhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QoZGV2KTsKIAkJCQlhdG9taWNfaW5jKCZkcnYtPnJlZmVyZW5jZXMpOwogCQkJCWNvdW50Kys7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRm91bmQgZHJpdmVyIFslc10gZm9yIGRldmljZSBbJXNdXG4iLAorCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJCSAgIkZvdW5kIGRyaXZlciBbJXNdIGZvciBkZXZpY2UgWyVzXVxuIiwKIAkJCQkJCSAgZHJ2LT5uYW1lLCBkZXYtPnBucC5idXNfaWQpKTsKIAkJCX0KIAkJfQpAQCAtNjA4LDIwICs1NzgsMjEgQEAKIAlyZXR1cm5fVkFMVUUoY291bnQpOwogfQogCi1zdGF0aWMgaW50IGFjcGlfZHJpdmVyX2RldGFjaChzdHJ1Y3QgYWNwaV9kcml2ZXIgKiBkcnYpCitzdGF0aWMgaW50IGFjcGlfZHJpdmVyX2RldGFjaChzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRydikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZSwgKiBuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9kcml2ZXJfZGV0YWNoIik7CiAKIAlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLG5leHQsJmFjcGlfZGV2aWNlX2xpc3QpIHsKLQkJc3RydWN0IGFjcGlfZGV2aWNlICogZGV2ID0gY29udGFpbmVyX29mKG5vZGUsc3RydWN0IGFjcGlfZGV2aWNlLGdfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX2RldmljZV9saXN0KSB7CisJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0KKwkJICAgIGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIGdfbGlzdCk7CiAKIAkJaWYgKGRldi0+ZHJpdmVyID09IGRydikgewogCQkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCQkJaWYgKGRydi0+b3BzLnJlbW92ZSkKLQkJCQlkcnYtPm9wcy5yZW1vdmUoZGV2LEFDUElfQlVTX1JFTU9WQUxfTk9STUFMKTsKKwkJCQlkcnYtPm9wcy5yZW1vdmUoZGV2LCBBQ1BJX0JVU19SRU1PVkFMX05PUk1BTCk7CiAJCQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCQkJZGV2LT5kcml2ZXIgPSBOVUxMOwogCQkJZGV2LT5kcml2ZXJfZGF0YSA9IE5VTEw7CkBAIC02NDAsOSArNjExLDcgQEAKICAqIG51bWJlciBvZiBkZXZpY2VzIHRoYXQgd2VyZSBjbGFpbWVkIGJ5IHRoZSBkcml2ZXIsIG9yIGEgbmVnYXRpdmUKICAqIGVycm9yIHN0YXR1cyBmb3IgZmFpbHVyZS4KICAqLwotaW50Ci1hY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIgKAotCXN0cnVjdCBhY3BpX2RyaXZlcgkqZHJpdmVyKQoraW50IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcikKIHsKIAlpbnQgY291bnQ7CiAKQEAgLTY2MSw4ICs2MzAsOCBAQAogCiAJcmV0dXJuX1ZBTFVFKGNvdW50KTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIpOwogCiAvKioKICAqIGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyIApAQCAtNjcwLDkgKzYzOSw3IEBACiAgKiBVbnJlZ2lzdGVycyBhIGRyaXZlciB3aXRoIHRoZSBBQ1BJIGJ1cy4gIFNlYXJjaGVzIHRoZSBuYW1lc3BhY2UgZm9yIGFsbAogICogZGV2aWNlcyB0aGF0IG1hdGNoIHRoZSBkcml2ZXIncyBjcml0ZXJpYSBhbmQgdW5iaW5kcy4KICAqLwotaW50Ci1hY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlciAoCi0Jc3RydWN0IGFjcGlfZHJpdmVyCSpkcml2ZXIpCitpbnQgYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpCiB7CiAJaW50IGVycm9yID0gMDsKIApAQCAtNjg1LDExICs2NTIsMTIgQEAKIAkJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJCQlsaXN0X2RlbF9pbml0KCZkcml2ZXItPm5vZGUpOwogCQkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCQl9IAotCX0gZWxzZSAKKwkJfQorCX0gZWxzZQogCQllcnJvciA9IC1FSU5WQUw7CiAJcmV0dXJuX1ZBTFVFKGVycm9yKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcik7CiAKIC8qKgpAQCAtNjk4LDE4ICs2NjYsMTcgQEAKICAqIFBhcnNlcyB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGRyaXZlcnMgbG9va2luZyBmb3IgYSBkcml2ZXIgYXBwbGljYWJsZSBmb3IKICAqIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgogICovCi1zdGF0aWMgaW50Ci1hY3BpX2J1c19maW5kX2RyaXZlciAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfYnVzX2ZpbmRfZHJpdmVyKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZAkqIG5vZGUsICpuZXh0OworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfZmluZF9kcml2ZXIiKTsKIAogCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsbmV4dCwmYWNwaV9idXNfZHJpdmVycykgewotCQlzdHJ1Y3QgYWNwaV9kcml2ZXIgKiBkcml2ZXIgPSBjb250YWluZXJfb2Yobm9kZSxzdHJ1Y3QgYWNwaV9kcml2ZXIsbm9kZSk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX2J1c19kcml2ZXJzKSB7CisJCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyID0KKwkJICAgIGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kcml2ZXIsIG5vZGUpOwogCiAJCWF0b21pY19pbmMoJmRyaXZlci0+cmVmZXJlbmNlcyk7CiAJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKQEAgLTcyMywyMSArNjkwLDE4IEBACiAJfQogCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAotIERvbmU6CisgICAgICBEb25lOgogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UgRW51bWVyYXRpb24KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgCi1hY3BpX2J1c19nZXRfZmxhZ3MgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2J1c19nZXRfZmxhZ3Moc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCWFjcGlfaGFuZGxlCQl0ZW1wID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX2hhbmRsZSB0ZW1wID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2dldF9mbGFncyIpOwogCkBAIC03ODgsMTEgKzc1MiwxMiBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotc3RhdGljIHZvaWQgYWNwaV9kZXZpY2VfZ2V0X2J1c2lkKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSwgYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSkKK3N0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX2dldF9idXNpZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKKwkJCQkgIGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpCiB7Ci0JY2hhcgkJCWJ1c19pZFs1XSA9IHsnPycsMH07Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHtzaXplb2YoYnVzX2lkKSwgYnVzX2lkfTsKLQlpbnQJCQlpID0gMDsKKwljaGFyIGJ1c19pZFs1XSA9IHsgJz8nLCAwIH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgc2l6ZW9mKGJ1c19pZCksIGJ1c19pZCB9OworCWludCBpID0gMDsKIAogCS8qCiAJICogQnVzIElECkBAIC04MjQsMjEgKzc4OSwyMiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYWNwaV9kZXZpY2Vfc2V0X2lkKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSwgc3RydWN0IGFjcGlfZGV2aWNlICogcGFyZW50LAotCQkJICAgICAgIGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpCitzdGF0aWMgdm9pZCBhY3BpX2RldmljZV9zZXRfaWQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCisJCQkgICAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpwYXJlbnQsIGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCSAgICAgICBpbnQgdHlwZSkKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbwkqaW5mbzsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKLQljaGFyCQkJKmhpZCA9IE5VTEw7Ci0JY2hhcgkJCSp1aWQgPSBOVUxMOworCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICppbmZvOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJY2hhciAqaGlkID0gTlVMTDsKKwljaGFyICp1aWQgPSBOVUxMOwogCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkX2xpc3QgPSBOVUxMOwotCWFjcGlfc3RhdHVzCQlzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBBQ1BJX0JVU19UWVBFX0RFVklDRToKIAkJc3RhdHVzID0gYWNwaV9nZXRfb2JqZWN0X2luZm8oaGFuZGxlLCAmYnVmZmVyKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlwcmludGsoIiVzOiBFcnJvciByZWFkaW5nIGRldmljZSBpbmZvXG4iLF9fRlVOQ1RJT05fXyk7CisJCQlwcmludGsoIiVzOiBFcnJvciByZWFkaW5nIGRldmljZSBpbmZvXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTkwNCw3ICs4NzAsNyBAQAogCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9kZXZpY2Vfc2V0X2NvbnRleHQoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlLCBpbnQgdHlwZSkKK3N0YXRpYyBpbnQgYWNwaV9kZXZpY2Vfc2V0X2NvbnRleHQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCWludCByZXN1bHQgPSAwOwpAQCAtOTE2LDEwICs4ODIsMTAgQEAKIAkgKiB0byBiZSBjYXJlZnVsIHdpdGggZml4ZWQtZmVhdHVyZSBkZXZpY2VzIGFzIHRoZXkgYWxsIGF0dGFjaCB0byB0aGUKIAkgKiByb290IG9iamVjdC4KIAkgKi8KLQlpZiAodHlwZSAhPSBBQ1BJX0JVU19UWVBFX1BPV0VSX0JVVFRPTiAmJiAKKwlpZiAodHlwZSAhPSBBQ1BJX0JVU19UWVBFX1BPV0VSX0JVVFRPTiAmJgogCSAgICB0eXBlICE9IEFDUElfQlVTX1RZUEVfU0xFRVBfQlVUVE9OKSB7CiAJCXN0YXR1cyA9IGFjcGlfYXR0YWNoX2RhdGEoZGV2aWNlLT5oYW5kbGUsCi0JCQlhY3BpX2J1c19kYXRhX2hhbmRsZXIsIGRldmljZSk7CisJCQkJCSAgYWNwaV9idXNfZGF0YV9oYW5kbGVyLCBkZXZpY2UpOwogCiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcHJpbnRrKCJFcnJvciBhdHRhY2hpbmcgZGV2aWNlIGRhdGFcbiIpOwpAQCAtOTI5LDEyICs4OTUsMTMgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgdm9pZCBhY3BpX2RldmljZV9nZXRfZGVidWdfaW5mbyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UsIGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpCitzdGF0aWMgdm9pZCBhY3BpX2RldmljZV9nZXRfZGVidWdfaW5mbyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgICAgYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSkKIHsKICNpZmRlZiBDT05GSUdfQUNQSV9ERUJVR19PVVRQVVQKLQljaGFyCQkqdHlwZV9zdHJpbmcgPSBOVUxMOwotCWNoYXIJCW5hbWVbODBdID0geyc/JywnXDAnfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0ge3NpemVvZihuYW1lKSwgbmFtZX07CisJY2hhciAqdHlwZV9zdHJpbmcgPSBOVUxMOworCWNoYXIgbmFtZVs4MF0gPSB7ICc/JywgJ1wwJyB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IHNpemVvZihuYW1lKSwgbmFtZSB9OwogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBBQ1BJX0JVU19UWVBFX0RFVklDRToKQEAgLTk2OCwxOCArOTM1LDE0IEBACiAJfQogCiAJcHJpbnRrKEtFUk5fREVCVUcgIkZvdW5kICVzICVzIFslcF1cbiIsIHR5cGVfc3RyaW5nLCBuYW1lLCBoYW5kbGUpOwotI2VuZGlmIC8qQ09ORklHX0FDUElfREVCVUdfT1VUUFVUKi8KKyNlbmRpZgkJCQkvKkNPTkZJR19BQ1BJX0RFQlVHX09VVFBVVCAqLwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfYnVzX3JlbW92ZSAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlICpkZXYsCi0JaW50IHJtZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2J1c19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXYsIGludCBybWRldmljZSkKIHsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9kcml2ZXIJKmRyaXZlcjsKLQkKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcjsKKwogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX3JlbW92ZSIpOwogCiAJaWYgKCFkZXYpCkBAIC0xMDEyLDIyICs5NzUsMTggQEAKIAkJaWYgKChkZXYtPnBhcmVudCkgJiYgKGRldi0+cGFyZW50LT5vcHMudW5iaW5kKSkKIAkJCWRldi0+cGFyZW50LT5vcHMudW5iaW5kKGRldik7CiAJfQotCQorCiAJYWNwaV9kZXZpY2VfdW5yZWdpc3RlcihkZXYsIEFDUElfQlVTX1JFTU9WQUxfRUpFQ1QpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIHN0YXRpYyBpbnQKLWFjcGlfYWRkX3NpbmdsZV9vYmplY3QgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqKmNoaWxkLAotCXN0cnVjdCBhY3BpX2RldmljZQkqcGFyZW50LAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0JaW50CQkJdHlwZSkKK2FjcGlfYWRkX3NpbmdsZV9vYmplY3Qoc3RydWN0IGFjcGlfZGV2aWNlICoqY2hpbGQsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCwgYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2FkZF9zaW5nbGVfb2JqZWN0Iik7CiAKQEAgLTEwNDQsNyArMTAwMyw3IEBACiAJZGV2aWNlLT5oYW5kbGUgPSBoYW5kbGU7CiAJZGV2aWNlLT5wYXJlbnQgPSBwYXJlbnQ7CiAKLQlhY3BpX2RldmljZV9nZXRfYnVzaWQoZGV2aWNlLGhhbmRsZSx0eXBlKTsKKwlhY3BpX2RldmljZV9nZXRfYnVzaWQoZGV2aWNlLCBoYW5kbGUsIHR5cGUpOwogCiAJLyoKIAkgKiBGbGFncwpAQCAtMTA5Miw3ICsxMDUxLDcgQEAKIAkgKiBIYXJkd2FyZSBJRCwgVW5pcXVlIElELCAmIEJ1cyBBZGRyZXNzCiAJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSAqLwotCWFjcGlfZGV2aWNlX3NldF9pZChkZXZpY2UscGFyZW50LGhhbmRsZSx0eXBlKTsKKwlhY3BpX2RldmljZV9zZXRfaWQoZGV2aWNlLCBwYXJlbnQsIGhhbmRsZSwgdHlwZSk7CiAKIAkvKgogCSAqIFBvd2VyIE1hbmFnZW1lbnQKQEAgLTExMDQsNyArMTA2Myw3IEBACiAJCQlnb3RvIGVuZDsKIAl9CiAKLSAJLyoKKwkvKgogCSAqIFdha2V1cCBkZXZpY2UgbWFuYWdlbWVudAogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkgKi8KQEAgLTExMjQsMTIgKzEwODMsMTIgQEAKIAkJCWdvdG8gZW5kOwogCX0KIAotCWlmICgocmVzdWx0ID0gYWNwaV9kZXZpY2Vfc2V0X2NvbnRleHQoZGV2aWNlLHR5cGUpKSkKKwlpZiAoKHJlc3VsdCA9IGFjcGlfZGV2aWNlX3NldF9jb250ZXh0KGRldmljZSwgdHlwZSkpKQogCQlnb3RvIGVuZDsKIAotCWFjcGlfZGV2aWNlX2dldF9kZWJ1Z19pbmZvKGRldmljZSxoYW5kbGUsdHlwZSk7CisJYWNwaV9kZXZpY2VfZ2V0X2RlYnVnX2luZm8oZGV2aWNlLCBoYW5kbGUsIHR5cGUpOwogCi0JYWNwaV9kZXZpY2VfcmVnaXN0ZXIoZGV2aWNlLHBhcmVudCk7CisJYWNwaV9kZXZpY2VfcmVnaXN0ZXIoZGV2aWNlLCBwYXJlbnQpOwogCiAJLyoKIAkgKiBCaW5kIF9BRFItQmFzZWQgRGV2aWNlcwpAQCAtMTE1NCw3ICsxMTEzLDcgQEAKIAkgKi8KIAlyZXN1bHQgPSBhY3BpX2J1c19maW5kX2RyaXZlcihkZXZpY2UpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJaWYgKCFyZXN1bHQpCiAJCSpjaGlsZCA9IGRldmljZTsKIAllbHNlIHsKQEAgLTExNjYsMTcgKzExMjUsMTUgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCi1zdGF0aWMgaW50IGFjcGlfYnVzX3NjYW4gKHN0cnVjdCBhY3BpX2RldmljZQkqc3RhcnQsCi0JCXN0cnVjdCBhY3BpX2J1c19vcHMgKm9wcykKK3N0YXRpYyBpbnQgYWNwaV9idXNfc2NhbihzdHJ1Y3QgYWNwaV9kZXZpY2UgKnN0YXJ0LCBzdHJ1Y3QgYWNwaV9idXNfb3BzICpvcHMpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2RldmljZQkqcGFyZW50ID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmNoaWxkID0gTlVMTDsKLQlhY3BpX2hhbmRsZQkJcGhhbmRsZSA9IE5VTEw7Ci0JYWNwaV9oYW5kbGUJCWNoYW5kbGUgPSBOVUxMOwotCWFjcGlfb2JqZWN0X3R5cGUJdHlwZSA9IDA7Ci0JdTMyCQkJbGV2ZWwgPSAxOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmNoaWxkID0gTlVMTDsKKwlhY3BpX2hhbmRsZSBwaGFuZGxlID0gTlVMTDsKKwlhY3BpX2hhbmRsZSBjaGFuZGxlID0gTlVMTDsKKwlhY3BpX29iamVjdF90eXBlIHR5cGUgPSAwOworCXUzMiBsZXZlbCA9IDE7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19zY2FuIik7CiAKQEAgLTExODUsNyArMTE0Miw3IEBACiAKIAlwYXJlbnQgPSBzdGFydDsKIAlwaGFuZGxlID0gc3RhcnQtPmhhbmRsZTsKLQkKKwogCS8qCiAJICogUGFyc2UgdGhyb3VnaCB0aGUgQUNQSSBuYW1lc3BhY2UsIGlkZW50aWZ5IGFsbCAnZGV2aWNlcycsIGFuZAogCSAqIGNyZWF0ZSBhIG5ldyAnc3RydWN0IGFjcGlfZGV2aWNlJyBmb3IgZWFjaC4KQEAgLTExOTMsNyArMTE1MCw3IEBACiAJd2hpbGUgKChsZXZlbCA+IDApICYmIHBhcmVudCkgewogCiAJCXN0YXR1cyA9IGFjcGlfZ2V0X25leHRfb2JqZWN0KEFDUElfVFlQRV9BTlksIHBoYW5kbGUsCi0JCQljaGFuZGxlLCAmY2hhbmRsZSk7CisJCQkJCSAgICAgIGNoYW5kbGUsICZjaGFuZGxlKTsKIAogCQkvKgogCQkgKiBJZiB0aGlzIHNjb3BlIGlzIGV4aGF1c3RlZCB0aGVuIG1vdmUgb3VyIHdheSBiYWNrIHVwLgpAQCAtMTI0MywxMiArMTIwMCwxMiBAQAogCiAJCWlmIChvcHMtPmFjcGlfb3BfYWRkKQogCQkJc3RhdHVzID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdCgmY2hpbGQsIHBhcmVudCwKLQkJCQkJY2hhbmRsZSwgdHlwZSk7Ci0JCSBlbHNlCisJCQkJCQkJY2hhbmRsZSwgdHlwZSk7CisJCWVsc2UKIAkJCXN0YXR1cyA9IGFjcGlfYnVzX2dldF9kZXZpY2UoY2hhbmRsZSwgJmNoaWxkKTsKIAotCQkgaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJIGNvbnRpbnVlOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCQljb250aW51ZTsKIAogCQlpZiAob3BzLT5hY3BpX29wX3N0YXJ0KSB7CiAJCQlzdGF0dXMgPSBhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QoY2hpbGQpOwpAQCAtMTI2NCw3ICsxMjIxLDcgQEAKIAkJICogd2hpY2ggd2lsbCBiZSBlbnVtZXJhdGVkIHdoZW4gdGhlIHBhcmVudCBpcyBpbnNlcnRlZCkuCiAJCSAqCiAJCSAqIFRCRDogTmVlZCBub3RpZmljYXRpb25zIGFuZCBvdGhlciBkZXRlY3Rpb24gbWVjaGFuaXNtcwotCQkgKglpbiBwbGFjZSBiZWZvcmUgd2UgY2FuIGZ1bGx5IGltcGxlbWVudCB0aGlzLgorCQkgKiAgICAgIGluIHBsYWNlIGJlZm9yZSB3ZSBjYW4gZnVsbHkgaW1wbGVtZW50IHRoaXMuCiAJCSAqLwogCQlpZiAoY2hpbGQtPnN0YXR1cy5wcmVzZW50KSB7CiAJCQlzdGF0dXMgPSBhY3BpX2dldF9uZXh0X29iamVjdChBQ1BJX1RZUEVfQU5ZLCBjaGFuZGxlLApAQCAtMTI4MiwxMSArMTIzOSw4IEBACiB9CiAKIGludAotYWNwaV9idXNfYWRkICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKipjaGlsZCwKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKnBhcmVudCwKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCWludAkJCXR5cGUpCithY3BpX2J1c19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICoqY2hpbGQsCisJICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCwgYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSkKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBhY3BpX2J1c19vcHMgb3BzOwpAQCAtMTMwMSwxMSArMTI1NSwxMCBAQAogCX0KIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX2J1c19hZGQpOwogCi1pbnQKLWFjcGlfYnVzX3N0YXJ0ICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK2ludCBhY3BpX2J1c19zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBhY3BpX2J1c19vcHMgb3BzOwpAQCAtMTMyMywyNiArMTI3NiwyNSBAQAogCX0KIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX2J1c19zdGFydCk7CiAKLXN0YXRpYyBpbnQKLWFjcGlfYnVzX3RyaW0oc3RydWN0IGFjcGlfZGV2aWNlCSpzdGFydCwKLQkJaW50IHJtZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2J1c190cmltKHN0cnVjdCBhY3BpX2RldmljZSAqc3RhcnQsIGludCBybWRldmljZSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzOwotCXN0cnVjdCBhY3BpX2RldmljZQkqcGFyZW50LCAqY2hpbGQ7Ci0JYWNwaV9oYW5kbGUJCXBoYW5kbGUsIGNoYW5kbGU7Ci0JYWNwaV9vYmplY3RfdHlwZQl0eXBlOwotCXUzMgkJCWxldmVsID0gMTsKLQlpbnQJCQllcnIgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCwgKmNoaWxkOworCWFjcGlfaGFuZGxlIHBoYW5kbGUsIGNoYW5kbGU7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCXUzMiBsZXZlbCA9IDE7CisJaW50IGVyciA9IDA7CiAKLQlwYXJlbnQgID0gc3RhcnQ7CisJcGFyZW50ID0gc3RhcnQ7CiAJcGhhbmRsZSA9IHN0YXJ0LT5oYW5kbGU7CiAJY2hpbGQgPSBjaGFuZGxlID0gTlVMTDsKIAogCXdoaWxlICgobGV2ZWwgPiAwKSAmJiBwYXJlbnQgJiYgKCFlcnIpKSB7CiAJCXN0YXR1cyA9IGFjcGlfZ2V0X25leHRfb2JqZWN0KEFDUElfVFlQRV9BTlksIHBoYW5kbGUsCi0JCQljaGFuZGxlLCAmY2hhbmRsZSk7CisJCQkJCSAgICAgIGNoYW5kbGUsICZjaGFuZGxlKTsKIAogCQkvKgogCQkgKiBJZiB0aGlzIHNjb3BlIGlzIGV4aGF1c3RlZCB0aGVuIG1vdmUgb3VyIHdheSBiYWNrIHVwLgpAQCAtMTM4MSwxMiArMTMzMywxMCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfYnVzX3NjYW5fZml4ZWQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqcm9vdCkKK3N0YXRpYyBpbnQgYWNwaV9idXNfc2Nhbl9maXhlZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKnJvb3QpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfc2Nhbl9maXhlZCIpOwogCkBAIC0xMzk4LDE0ICsxMzQ4LDE2IEBACiAJICovCiAJaWYgKGFjcGlfZmFkdC5wd3JfYnV0dG9uID09IDApIHsKIAkJcmVzdWx0ID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdCgmZGV2aWNlLCBhY3BpX3Jvb3QsCi0JCQlOVUxMLCBBQ1BJX0JVU19UWVBFX1BPV0VSX0JVVFRPTik7CisJCQkJCQlOVUxMLAorCQkJCQkJQUNQSV9CVVNfVFlQRV9QT1dFUl9CVVRUT04pOwogCQlpZiAoIXJlc3VsdCkKIAkJCXJlc3VsdCA9IGFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChkZXZpY2UpOwogCX0KIAogCWlmIChhY3BpX2ZhZHQuc2xlZXBfYnV0dG9uID09IDApIHsKIAkJcmVzdWx0ID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdCgmZGV2aWNlLCBhY3BpX3Jvb3QsCi0JCQlOVUxMLCBBQ1BJX0JVU19UWVBFX1NMRUVQX0JVVFRPTik7CisJCQkJCQlOVUxMLAorCQkJCQkJQUNQSV9CVVNfVFlQRV9TTEVFUF9CVVRUT04pOwogCQlpZiAoIXJlc3VsdCkKIAkJCXJlc3VsdCA9IGFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChkZXZpY2UpOwogCX0KQEAgLTE0MTMsNyArMTM2NSw2IEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQgYWNwaV9zY2FuX2luaXQodm9pZCkKIHsKIAlpbnQgcmVzdWx0OwpAQCAtMTQzMCw3ICsxMzgxLDcgQEAKIAkgKiBDcmVhdGUgdGhlIHJvb3QgZGV2aWNlIGluIHRoZSBidXMncyBkZXZpY2UgdHJlZQogCSAqLwogCXJlc3VsdCA9IGFjcGlfYWRkX3NpbmdsZV9vYmplY3QoJmFjcGlfcm9vdCwgTlVMTCwgQUNQSV9ST09UX09CSkVDVCwKLQkJQUNQSV9CVVNfVFlQRV9TWVNURU0pOworCQkJCQlBQ1BJX0JVU19UWVBFX1NZU1RFTSk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBEb25lOwogCkBAIC0xNDUwLDcgKzE0MDEsNyBAQAogCWlmIChyZXN1bHQpCiAJCWFjcGlfZGV2aWNlX3VucmVnaXN0ZXIoYWNwaV9yb290LCBBQ1BJX0JVU19SRU1PVkFMX05PUk1BTCk7CiAKLSBEb25lOgorICAgICAgRG9uZToKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMKaW5kZXggNzI0OWJhMi4uYWVlNTBiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jCkBAIC0yMyw3ICsyMyw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcG1fb3BzIGFjcGlfcG1fb3BzOwogCi1leHRlcm4gdm9pZCBkb19zdXNwZW5kX2xvd2xldmVsX3M0Ymlvcyh2b2lkKTsKIGV4dGVybiB2b2lkIGRvX3N1c3BlbmRfbG93bGV2ZWwodm9pZCk7CiAKIHN0YXRpYyB1MzIgYWNwaV9zdXNwZW5kX3N0YXRlc1tdID0gewpAQCAtOTgsOCArOTcsNiBAQAogCWNhc2UgUE1fU1VTUEVORF9ESVNLOgogCQlpZiAoYWNwaV9wbV9vcHMucG1fZGlza19tb2RlID09IFBNX0RJU0tfUExBVEZPUk0pCiAJCQlzdGF0dXMgPSBhY3BpX2VudGVyX3NsZWVwX3N0YXRlKGFjcGlfc3RhdGUpOwotCQllbHNlCi0JCQlkb19zdXNwZW5kX2xvd2xldmVsX3M0YmlvcygpOwogCQlicmVhazsKIAljYXNlIFBNX1NVU1BFTkRfTUFYOgogCQlhY3BpX3Bvd2VyX29mZigpOwpAQCAtMjA2LDExICsyMDMsNiBAQAogCQkJcHJpbnRrKCIgUyVkIiwgaSk7CiAJCX0KIAkJaWYgKGkgPT0gQUNQSV9TVEFURV9TNCkgewotCQkJaWYgKGFjcGlfZ2JsX0ZBQ1MtPlM0Ymlvc19mKSB7Ci0JCQkJc2xlZXBfc3RhdGVzW2ldID0gMTsKLQkJCQlwcmludGsoIiBTNGJpb3MiKTsKLQkJCQlhY3BpX3BtX29wcy5wbV9kaXNrX21vZGUgPSBQTV9ESVNLX0ZJUk1XQVJFOwotCQkJfQogCQkJaWYgKHNsZWVwX3N0YXRlc1tpXSkKIAkJCQlhY3BpX3BtX29wcy5wbV9kaXNrX21vZGUgPSBQTV9ESVNLX1BMQVRGT1JNOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvcG93ZXJvZmYuYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9wb3dlcm9mZi5jCmluZGV4IGY5M2QyZWUuLmFmNzkzNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wb3dlcm9mZi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9wb3dlcm9mZi5jCkBAIC0yMSw5ICsyMSw3IEBACiB7CiAjaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKIAkvKiBkbyB3ZSBoYXZlIGEgd2FrZXVwIGFkZHJlc3MgZm9yIFMyIGFuZCBTMz8gKi8KLQkvKiBIZXJlLCB3ZSBzdXBwb3J0IG9ubHkgUzRCSU9TLCB0aG9zZSB3ZSBzZXQgdGhlIHdha2V1cCBhZGRyZXNzICovCi0JLyogUzRPUyBpcyBvbmx5IHN1cHBvcnRlZCBmb3Igbm93IHZpYSBzd3N1c3AuLiAqLwotCWlmIChhY3BpX3N0YXRlID09IEFDUElfU1RBVEVfUzMgfHwgYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1M0KSB7CisJaWYgKGFjcGlfc3RhdGUgPT0gQUNQSV9TVEFURV9TMykgewogCQlpZiAoIWFjcGlfd2FrZXVwX2FkZHJlc3MpIHsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CkBAIC05NSw0ICs5Myw0IEBACiAKIGxhdGVfaW5pdGNhbGwoYWNwaV9wb3dlcm9mZl9pbml0KTsKIAotI2VuZGlmIC8qIENPTkZJR19QTSAqLworI2VuZGlmCQkJCS8qIENPTkZJR19QTSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMKaW5kZXggMWJlOTlmMC4uNDY5NmE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jCkBAIC0xMywyOSArMTMsMTggQEAKIAogI2luY2x1ZGUgInNsZWVwLmgiCiAKLSNpZmRlZglDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQCi0jZGVmaW5lIEFDUElfU1lTVEVNX0ZJTEVfU0xFRVAJCSJzbGVlcCIKLSNlbmRpZgotCi0jZGVmaW5lIEFDUElfU1lTVEVNX0ZJTEVfQUxBUk0JCSJhbGFybSIKLSNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9XQUtFVVBfREVWSUNFICAgIndha2V1cCIKLQogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1NZU1RFTV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgic2xlZXAiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJzbGVlcCIpCiAjaWZkZWYJQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUAotCiBzdGF0aWMgaW50IGFjcGlfc3lzdGVtX3NsZWVwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0JaW50CQkJaTsKKwlpbnQgaTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfc3lzdGVtX3NsZWVwX3NlcV9zaG93Iik7CiAKIAlmb3IgKGkgPSAwOyBpIDw9IEFDUElfU1RBVEVfUzU7IGkrKykgewogCQlpZiAoc2xlZXBfc3RhdGVzW2ldKSB7Ci0JCQlzZXFfcHJpbnRmKHNlcSwiUyVkICIsIGkpOwotCQkJaWYgKGkgPT0gQUNQSV9TVEFURV9TNCAmJiBhY3BpX2dibF9GQUNTLT5TNGJpb3NfZikKLQkJCQlzZXFfcHJpbnRmKHNlcSwgIlM0YmlvcyAiKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiUyVkICIsIGkpOwogCQl9CiAJfQogCkBAIC01MCwyNCArMzksMjEgQEAKIH0KIAogc3RhdGljIHNzaXplX3QKLWFjcGlfc3lzdGVtX3dyaXRlX3NsZWVwICgKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUsCi0JY29uc3QgY2hhciBfX3VzZXIJKmJ1ZmZlciwKLQlzaXplX3QJCQljb3VudCwKLQlsb2ZmX3QJCQkqcHBvcykKK2FjcGlfc3lzdGVtX3dyaXRlX3NsZWVwKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKIHsKLQljaGFyCXN0clsxMl07Ci0JdTMyCXN0YXRlID0gMDsKLQlpbnQJZXJyb3IgPSAwOworCWNoYXIgc3RyWzEyXTsKKwl1MzIgc3RhdGUgPSAwOworCWludCBlcnJvciA9IDA7CiAKIAlpZiAoY291bnQgPiBzaXplb2Yoc3RyKSAtIDEpCiAJCWdvdG8gRG9uZTsKLQltZW1zZXQoc3RyLDAsc2l6ZW9mKHN0cikpOworCW1lbXNldChzdHIsIDAsIHNpemVvZihzdHIpKTsKIAlpZiAoY29weV9mcm9tX3VzZXIoc3RyLCBidWZmZXIsIGNvdW50KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkvKiBDaGVjayBmb3IgUzQgYmlvcyByZXF1ZXN0ICovCi0JaWYgKCFzdHJjbXAoc3RyLCI0YiIpKSB7CisJaWYgKCFzdHJjbXAoc3RyLCAiNGIiKSkgewogCQllcnJvciA9IGFjcGlfc3VzcGVuZCg0KTsKIAkJZ290byBEb25lOwogCX0KQEAgLTc5LDE3ICs2NSwxNyBAQAogCX0KICNlbmRpZgogCWVycm9yID0gYWNwaV9zdXNwZW5kKHN0YXRlKTsKLSBEb25lOgorICAgICAgRG9uZToKIAlyZXR1cm4gZXJyb3IgPyBlcnJvciA6IGNvdW50OwogfQotI2VuZGlmCS8qIENPTkZJR19BQ1BJX1NMRUVQX1BST0NfU0xFRVAgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQICovCiAKIHN0YXRpYyBpbnQgYWNwaV9zeXN0ZW1fYWxhcm1fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQl1MzIJCQlzZWMsIG1pbiwgaHI7Ci0JdTMyCQkJZGF5LCBtbywgeXI7Ci0JdW5zaWduZWQgY2hhcgkJcnRjX2NvbnRyb2wgPSAwOwotCXVuc2lnbmVkIGxvbmcgCQlmbGFnczsKKwl1MzIgc2VjLCBtaW4sIGhyOworCXUzMiBkYXksIG1vLCB5cjsKKwl1bnNpZ25lZCBjaGFyIHJ0Y19jb250cm9sID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zeXN0ZW1fYWxhcm1fc2VxX3Nob3ciKTsKIApAQCAtMTA1LDEzICs5MSwxNCBAQAogCQkvKiBBQ1BJIHNwZWM6IG9ubHkgbG93IDYgaXRzIHNob3VsZCBiZSBjYXJlZCAqLwogCQlkYXkgPSBDTU9TX1JFQUQoYWNwaV9nYmxfRkFEVC0+ZGF5X2Fscm0pICYgMHgzRjsKIAllbHNlCi0JCWRheSA9ICBDTU9TX1JFQUQoUlRDX0RBWV9PRl9NT05USCk7CisJCWRheSA9IENNT1NfUkVBRChSVENfREFZX09GX01PTlRIKTsKIAlpZiAoYWNwaV9nYmxfRkFEVC0+bW9uX2Fscm0pCiAJCW1vID0gQ01PU19SRUFEKGFjcGlfZ2JsX0ZBRFQtPm1vbl9hbHJtKTsKIAllbHNlCiAJCW1vID0gQ01PU19SRUFEKFJUQ19NT05USCk7CiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPmNlbnR1cnkpCi0JCXlyID0gQ01PU19SRUFEKGFjcGlfZ2JsX0ZBRFQtPmNlbnR1cnkpICogMTAwICsgQ01PU19SRUFEKFJUQ19ZRUFSKTsKKwkJeXIgPSBDTU9TX1JFQUQoYWNwaV9nYmxfRkFEVC0+Y2VudHVyeSkgKiAxMDAgKworCQkgICAgQ01PU19SRUFEKFJUQ19ZRUFSKTsKIAllbHNlCiAJCXlyID0gQ01PU19SRUFEKFJUQ19ZRUFSKTsKIApAQCAtMTI2LDMzICsxMTMsMzMgQEAKIAkJQkNEX1RPX0JJTih5cik7CiAJfQogCi0JLyogd2UncmUgdHJ1c3RpbmcgdGhlIEZBRFQgKHNlZSBhYm92ZSkqLworCS8qIHdlJ3JlIHRydXN0aW5nIHRoZSBGQURUIChzZWUgYWJvdmUpICovCiAJaWYgKCFhY3BpX2dibF9GQURULT5jZW50dXJ5KQotCS8qIElmIHdlJ3JlIG5vdCB0cnVzdGluZyB0aGUgRkFEVCwgd2Ugc2hvdWxkIGF0IGxlYXN0IG1ha2UgaXQKLQkgKiByaWdodCBmb3IgX3RoaXNfIGNlbnR1cnkuLi4gZWhtLCB3aGF0IGlzIF90aGlzXyBjZW50dXJ5PwotCSAqCi0JICogVEJEOgotCSAqICBBU0FQOiBmaW5kIHBpZWNlIG9mIGNvZGUgaW4gdGhlIGtlcm5lbCwgZS5nLiBzdGFyIHRyYWNrZXIgZHJpdmVyLAotCSAqICAgICAgICB3aGljaCB3ZSBjYW4gdHJ1c3QgdG8gZGV0ZXJtaW5lIHRoZSBjZW50dXJ5IGNvcnJlY3RseS4gQXRvbQotCSAqICAgICAgICB3YXRjaCBkcml2ZXIgd291bGQgYmUgbmljZSwgdG9vLi4uCi0JICoKLQkgKiAgaWYgdGhhdCBoYXMgbm90IGhhcHBlbmVkLCBjaGFuZ2UgZm9yIGZpcnN0IHJlbGVhc2UgaW4gMjA1MDoKLSAJICogICAgICAgIGlmICh5cjw1MCkKLQkgKiAgICAgICAgICAgICAgICB5ciArPSAyMTAwOwotCSAqICAgICAgICBlbHNlCi0JICogICAgICAgICAgICAgICAgeXIgKz0gMjAwMDsgICAvLyBjdXJyZW50IGxpbmUgb2YgY29kZQotCSAqCi0JICogIGlmIHRoYXQgaGFzIG5vdCBoYXBwZW5lZCBlaXRoZXIsIHBsZWFzZSBkbyBvbiAyMDk5LzEyLzMxOjIzOjU5OjU5Ci0JICogICAgICAgIHMvMjAwMC8yMTAwCi0JICoKLQkgKi8KKwkJLyogSWYgd2UncmUgbm90IHRydXN0aW5nIHRoZSBGQURULCB3ZSBzaG91bGQgYXQgbGVhc3QgbWFrZSBpdAorCQkgKiByaWdodCBmb3IgX3RoaXNfIGNlbnR1cnkuLi4gZWhtLCB3aGF0IGlzIF90aGlzXyBjZW50dXJ5PworCQkgKgorCQkgKiBUQkQ6CisJCSAqICBBU0FQOiBmaW5kIHBpZWNlIG9mIGNvZGUgaW4gdGhlIGtlcm5lbCwgZS5nLiBzdGFyIHRyYWNrZXIgZHJpdmVyLAorCQkgKiAgICAgICAgd2hpY2ggd2UgY2FuIHRydXN0IHRvIGRldGVybWluZSB0aGUgY2VudHVyeSBjb3JyZWN0bHkuIEF0b20KKwkJICogICAgICAgIHdhdGNoIGRyaXZlciB3b3VsZCBiZSBuaWNlLCB0b28uLi4KKwkJICoKKwkJICogIGlmIHRoYXQgaGFzIG5vdCBoYXBwZW5lZCwgY2hhbmdlIGZvciBmaXJzdCByZWxlYXNlIGluIDIwNTA6CisJCSAqICAgICAgICBpZiAoeXI8NTApCisJCSAqICAgICAgICAgICAgICAgIHlyICs9IDIxMDA7CisJCSAqICAgICAgICBlbHNlCisJCSAqICAgICAgICAgICAgICAgIHlyICs9IDIwMDA7ICAgLy8gY3VycmVudCBsaW5lIG9mIGNvZGUKKwkJICoKKwkJICogIGlmIHRoYXQgaGFzIG5vdCBoYXBwZW5lZCBlaXRoZXIsIHBsZWFzZSBkbyBvbiAyMDk5LzEyLzMxOjIzOjU5OjU5CisJCSAqICAgICAgICBzLzIwMDAvMjEwMAorCQkgKgorCQkgKi8KIAkJeXIgKz0gMjAwMDsKIAotCXNlcV9wcmludGYoc2VxLCIlNC40dS0iLCB5cik7Ci0JKG1vID4gMTIpICA/IHNlcV9wdXRzKHNlcSwgIioqLSIpICA6IHNlcV9wcmludGYoc2VxLCAiJTIuMnUtIiwgbW8pOwotCShkYXkgPiAzMSkgPyBzZXFfcHV0cyhzZXEsICIqKiAiKSAgOiBzZXFfcHJpbnRmKHNlcSwgIiUyLjJ1ICIsIGRheSk7Ci0JKGhyID4gMjMpICA/IHNlcV9wdXRzKHNlcSwgIioqOiIpICA6IHNlcV9wcmludGYoc2VxLCAiJTIuMnU6IiwgaHIpOwotCShtaW4gPiA1OSkgPyBzZXFfcHV0cyhzZXEsICIqKjoiKSAgOiBzZXFfcHJpbnRmKHNlcSwgIiUyLjJ1OiIsIG1pbik7CisJc2VxX3ByaW50ZihzZXEsICIlNC40dS0iLCB5cik7CisJKG1vID4gMTIpID8gc2VxX3B1dHMoc2VxLCAiKiotIikgOiBzZXFfcHJpbnRmKHNlcSwgIiUyLjJ1LSIsIG1vKTsKKwkoZGF5ID4gMzEpID8gc2VxX3B1dHMoc2VxLCAiKiogIikgOiBzZXFfcHJpbnRmKHNlcSwgIiUyLjJ1ICIsIGRheSk7CisJKGhyID4gMjMpID8gc2VxX3B1dHMoc2VxLCAiKio6IikgOiBzZXFfcHJpbnRmKHNlcSwgIiUyLjJ1OiIsIGhyKTsKKwkobWluID4gNTkpID8gc2VxX3B1dHMoc2VxLCAiKio6IikgOiBzZXFfcHJpbnRmKHNlcSwgIiUyLjJ1OiIsIG1pbik7CiAJKHNlYyA+IDU5KSA/IHNlcV9wdXRzKHNlcSwgIioqXG4iKSA6IHNlcV9wcmludGYoc2VxLCAiJTIuMnVcbiIsIHNlYyk7CiAKIAlyZXR1cm4gMDsKQEAgLTE2MywxNSArMTUwLDExIEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfc3lzdGVtX2FsYXJtX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1nZXRfZGF0ZV9maWVsZCAoCi0JY2hhcgkJCSoqcCwKLQl1MzIJCQkqdmFsdWUpCitzdGF0aWMgaW50IGdldF9kYXRlX2ZpZWxkKGNoYXIgKipwLCB1MzIgKiB2YWx1ZSkKIHsKLQljaGFyCQkJKm5leHQgPSBOVUxMOwotCWNoYXIJCQkqc3RyaW5nX2VuZCA9IE5VTEw7Ci0JaW50CQkJcmVzdWx0ID0gLUVJTlZBTDsKKwljaGFyICpuZXh0ID0gTlVMTDsKKwljaGFyICpzdHJpbmdfZW5kID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gLUVJTlZBTDsKIAogCS8qCiAJICogVHJ5IHRvIGZpbmQgZGVsaW1ldGVyLCBvbmx5IHRvIGluc2VydCBudWxsLiAgVGhlIGVuZCBvZiB0aGUKQEAgLTE5MywyNiArMTc2LDIyIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotCiBzdGF0aWMgc3NpemVfdAotYWNwaV9zeXN0ZW1fd3JpdGVfYWxhcm0gKAotCXN0cnVjdCBmaWxlCQkqZmlsZSwKLQljb25zdCBjaGFyIF9fdXNlcgkqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpwcG9zKQorYWNwaV9zeXN0ZW1fd3JpdGVfYWxhcm0oc3RydWN0IGZpbGUgKmZpbGUsCisJCQljb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JY2hhcgkJCWFsYXJtX3N0cmluZ1szMF0gPSB7J1wwJ307Ci0JY2hhcgkJCSpwID0gYWxhcm1fc3RyaW5nOwotCXUzMgkJCXNlYywgbWluLCBociwgZGF5LCBtbywgeXI7Ci0JaW50CQkJYWRqdXN0ID0gMDsKLQl1bnNpZ25lZCBjaGFyCQlydGNfY29udHJvbCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJY2hhciBhbGFybV9zdHJpbmdbMzBdID0geyAnXDAnIH07CisJY2hhciAqcCA9IGFsYXJtX3N0cmluZzsKKwl1MzIgc2VjLCBtaW4sIGhyLCBkYXksIG1vLCB5cjsKKwlpbnQgYWRqdXN0ID0gMDsKKwl1bnNpZ25lZCBjaGFyIHJ0Y19jb250cm9sID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfc3lzdGVtX3dyaXRlX2FsYXJtIik7CiAKIAlpZiAoY291bnQgPiBzaXplb2YoYWxhcm1fc3RyaW5nKSAtIDEpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKLQkKKwogCWlmIChjb3B5X2Zyb21fdXNlcihhbGFybV9zdHJpbmcsIGJ1ZmZlciwgY291bnQpKQogCQlyZXR1cm5fVkFMVUUoLUVGQVVMVCk7CiAKQEAgLTI3MSwxMCArMjUwLDEwIEBACiAJfQogCiAJaWYgKGFkanVzdCkgewotCQl5ciAgKz0gQ01PU19SRUFEKFJUQ19ZRUFSKTsKLQkJbW8gICs9IENNT1NfUkVBRChSVENfTU9OVEgpOworCQl5ciArPSBDTU9TX1JFQUQoUlRDX1lFQVIpOworCQltbyArPSBDTU9TX1JFQUQoUlRDX01PTlRIKTsKIAkJZGF5ICs9IENNT1NfUkVBRChSVENfREFZX09GX01PTlRIKTsKLQkJaHIgICs9IENNT1NfUkVBRChSVENfSE9VUlMpOworCQlociArPSBDTU9TX1JFQUQoUlRDX0hPVVJTKTsKIAkJbWluICs9IENNT1NfUkVBRChSVENfTUlOVVRFUyk7CiAJCXNlYyArPSBDTU9TX1JFQUQoUlRDX1NFQ09ORFMpOwogCX0KQEAgLTM0Myw3ICszMjIsNyBAQAogCWlmIChhY3BpX2dibF9GQURULT5tb25fYWxybSkKIAkJQ01PU19XUklURShtbywgYWNwaV9nYmxfRkFEVC0+bW9uX2Fscm0pOwogCWlmIChhY3BpX2dibF9GQURULT5jZW50dXJ5KQotCQlDTU9TX1dSSVRFKHlyLzEwMCwgYWNwaV9nYmxfRkFEVC0+Y2VudHVyeSk7CisJCUNNT1NfV1JJVEUoeXIgLyAxMDAsIGFjcGlfZ2JsX0ZBRFQtPmNlbnR1cnkpOwogCS8qIGVuYWJsZSB0aGUgcnRjIGFsYXJtIGludGVycnVwdCAqLwogCXJ0Y19jb250cm9sIHw9IFJUQ19BSUU7CiAJQ01PU19XUklURShydGNfY29udHJvbCwgUlRDX0NPTlRST0wpOwpAQCAtMzU3LDM1ICszMzYsMzMgQEAKIAkqcHBvcyArPSBjb3VudDsKIAogCXJlc3VsdCA9IDA7Ci1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCA/IHJlc3VsdCA6IGNvdW50KTsKIH0KIAotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQJYWNwaV93YWtldXBfZGV2aWNlX2xpc3Q7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBhY3BpX3dha2V1cF9kZXZpY2VfbGlzdDsKIGV4dGVybiBzcGlubG9ja190IGFjcGlfZGV2aWNlX2xvY2s7CiAKIHN0YXRpYyBpbnQKIGFjcGlfc3lzdGVtX3dha2V1cF9kZXZpY2Vfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZSwgKiBuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OwogCiAJc2VxX3ByaW50ZihzZXEsICJEZXZpY2UJU2xlZXAgc3RhdGUJU3RhdHVzXG4iKTsKIAogCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXYgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7CisJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0KKwkJICAgIGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIHdha2V1cF9saXN0KTsKIAogCQlpZiAoIWRldi0+d2FrZXVwLmZsYWdzLnZhbGlkKQogCQkJY29udGludWU7CiAJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQkJaWYgKGRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlKQotCQkJc2VxX3ByaW50ZihzZXEsICIlNHMJJTRkCQklOHNcbiIsCi0JCQkJZGV2LT5wbnAuYnVzX2lkLCAodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSwKLQkJCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID8gIiplbmFibGVkIiA6ICIqZGlzYWJsZWQiKTsKLQkJZWxzZQotCQkJc2VxX3ByaW50ZihzZXEsICIlNHMJJTRkCQklOHNcbiIsCi0JCQkJZGV2LT5wbnAuYnVzX2lkLCAodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSwKLQkJCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCXNlcV9wcmludGYoc2VxLCAiJTRzCSU0ZAkJJXMlOHNcbiIsCisJCQkgICBkZXYtPnBucC5idXNfaWQsCisJCQkgICAodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSwKKwkJCSAgIGRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlID8gIioiIDogIiIsCisJCQkgICBkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CiAJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJfQogCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKQEAgLTM5MywxOSArMzcwLDE4IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90Ci1hY3BpX3N5c3RlbV93cml0ZV93YWtldXBfZGV2aWNlICgKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUsCi0JY29uc3QgY2hhciBfX3VzZXIJKmJ1ZmZlciwKLQlzaXplX3QJCQljb3VudCwKLQlsb2ZmX3QJCQkqcHBvcykKK2FjcGlfc3lzdGVtX3dyaXRlX3dha2V1cF9kZXZpY2Uoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7Ci0JY2hhcgkJc3RyYnVmWzVdOwotCWNoYXIJCXN0cls1XSA9ICIiOwotCWludCAJCWxlbiA9IGNvdW50OworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OworCWNoYXIgc3RyYnVmWzVdOworCWNoYXIgc3RyWzVdID0gIiI7CisJaW50IGxlbiA9IGNvdW50OwogCXN0cnVjdCBhY3BpX2RldmljZSAqZm91bmRfZGV2ID0gTlVMTDsKIAotCWlmIChsZW4gPiA0KSBsZW4gPSA0OworCWlmIChsZW4gPiA0KQorCQlsZW4gPSA0OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKHN0cmJ1ZiwgYnVmZmVyLCBsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTQxNCwyOCArMzkwLDM2IEBACiAKIAlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmYWNwaV93YWtldXBfZGV2aWNlX2xpc3QpIHsKLQkJc3RydWN0IGFjcGlfZGV2aWNlICogZGV2ID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX2RldmljZSwgd2FrZXVwX2xpc3QpOworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9CisJCSAgICBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7CiAJCWlmICghZGV2LT53YWtldXAuZmxhZ3MudmFsaWQpCiAJCQljb250aW51ZTsKIAogCQlpZiAoIXN0cm5jbXAoZGV2LT5wbnAuYnVzX2lkLCBzdHIsIDQpKSB7Ci0JCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID0gZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCA/IDA6MTsKKwkJCWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgPQorCQkJICAgIGRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgPyAwIDogMTsKIAkJCWZvdW5kX2RldiA9IGRldjsKIAkJCWJyZWFrOwogCQl9CiAJfQogCWlmIChmb3VuZF9kZXYpIHsKIAkJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgewotCQkJc3RydWN0IGFjcGlfZGV2aWNlICogZGV2ID0gY29udGFpbmVyX29mKG5vZGUsCi0JCQkJc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7CisJCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihub2RlLAorCQkJCQkJCSAgICAgICBzdHJ1Y3QKKwkJCQkJCQkgICAgICAgYWNwaV9kZXZpY2UsCisJCQkJCQkJICAgICAgIHdha2V1cF9saXN0KTsKIAogCQkJaWYgKChkZXYgIT0gZm91bmRfZGV2KSAmJgotCQkJCShkZXYtPndha2V1cC5ncGVfbnVtYmVyID09IGZvdW5kX2Rldi0+d2FrZXVwLmdwZV9udW1iZXIpICYmCi0JCQkJKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UgPT0gZm91bmRfZGV2LT53YWtldXAuZ3BlX2RldmljZSkpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBQ1BJOiAnJXMnIGFuZCAnJXMnIGhhdmUgdGhlIHNhbWUgR1BFLCAiCi0JCQkJCSJjYW4ndCBkaXNhYmxlL2VuYWJsZSBvbmUgc2VwZXJhdGVseVxuIiwKLQkJCQkJZGV2LT5wbnAuYnVzX2lkLCBmb3VuZF9kZXYtPnBucC5idXNfaWQpOwotCQkJCWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgPSBmb3VuZF9kZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkOworCQkJICAgIChkZXYtPndha2V1cC5ncGVfbnVtYmVyID09CisJCQkgICAgIGZvdW5kX2Rldi0+d2FrZXVwLmdwZV9udW1iZXIpCisJCQkgICAgJiYgKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UgPT0KKwkJCQlmb3VuZF9kZXYtPndha2V1cC5ncGVfZGV2aWNlKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgIkFDUEk6ICclcycgYW5kICclcycgaGF2ZSB0aGUgc2FtZSBHUEUsICIKKwkJCQkgICAgICAgImNhbid0IGRpc2FibGUvZW5hYmxlIG9uZSBzZXBlcmF0ZWx5XG4iLAorCQkJCSAgICAgICBkZXYtPnBucC5idXNfaWQsIGZvdW5kX2Rldi0+cG5wLmJ1c19pZCk7CisJCQkJZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCA9CisJCQkJICAgIGZvdW5kX2Rldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQ7CiAJCQl9CiAJCX0KIAl9CkBAIC00NDYsMzcgKzQzMCwzNyBAQAogc3RhdGljIGludAogYWNwaV9zeXN0ZW1fd2FrZXVwX2RldmljZV9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3N5c3RlbV93YWtldXBfZGV2aWNlX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9zeXN0ZW1fd2FrZXVwX2RldmljZV9zZXFfc2hvdywKKwkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3N5c3RlbV93YWtldXBfZGV2aWNlX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV9zeXN0ZW1fd2FrZXVwX2RldmljZV9vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS53cml0ZQkJPSBhY3BpX3N5c3RlbV93cml0ZV93YWtldXBfZGV2aWNlLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX3N5c3RlbV93YWtldXBfZGV2aWNlX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBhY3BpX3N5c3RlbV93cml0ZV93YWtldXBfZGV2aWNlLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKICNpZmRlZglDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3N5c3RlbV9zbGVlcF9mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfc3lzdGVtX3NsZWVwX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLndyaXRlCQk9IGFjcGlfc3lzdGVtX3dyaXRlX3NsZWVwLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX3N5c3RlbV9zbGVlcF9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gYWNwaV9zeXN0ZW1fd3JpdGVfc2xlZXAsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKLSNlbmRpZgkvKiBDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQICovCisjZW5kaWYJCQkJLyogQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUCAqLwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3N5c3RlbV9hbGFybV9mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfc3lzdGVtX2FsYXJtX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLndyaXRlCQk9IGFjcGlfc3lzdGVtX3dyaXRlX2FsYXJtLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX3N5c3RlbV9hbGFybV9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gYWNwaV9zeXN0ZW1fd3JpdGVfYWxhcm0sCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotCi1zdGF0aWMgdTMyIHJ0Y19oYW5kbGVyKHZvaWQgKiBjb250ZXh0KQorc3RhdGljIHUzMiBydGNfaGFuZGxlcih2b2lkICpjb250ZXh0KQogewogCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9SVEMpOwogCWFjcGlfZGlzYWJsZV9ldmVudChBQ1BJX0VWRU5UX1JUQywgMCk7CkBAIC00ODYsMjggKzQ3MCwzMSBAQAogCiBzdGF0aWMgaW50IGFjcGlfc2xlZXBfcHJvY19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeSA9IE5VTEw7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7CiAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIDA7Ci0gCisKICNpZmRlZglDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQCi0JLyogJ3NsZWVwJyBbUi9XXSovCi0JZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX1NZU1RFTV9GSUxFX1NMRUVQLAotCQkJCSAgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsIGFjcGlfcm9vdF9kaXIpOworCS8qICdzbGVlcCcgW1IvV10gKi8KKwllbnRyeSA9CisJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KCJzbGVlcCIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgICAgIGFjcGlfcm9vdF9kaXIpOwogCWlmIChlbnRyeSkKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3N5c3RlbV9zbGVlcF9mb3BzOwogI2VuZGlmCiAKIAkvKiAnYWxhcm0nIFtSL1ddICovCi0JZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX1NZU1RFTV9GSUxFX0FMQVJNLAotCQlTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgYWNwaV9yb290X2Rpcik7CisJZW50cnkgPQorCSAgICBjcmVhdGVfcHJvY19lbnRyeSgiYWxhcm0iLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgICAgICBhY3BpX3Jvb3RfZGlyKTsKIAlpZiAoZW50cnkpCiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9zeXN0ZW1fYWxhcm1fZm9wczsKIAotCS8qICd3YWtldXAgZGV2aWNlJyBbUi9XXSovCi0JZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX1NZU1RFTV9GSUxFX1dBS0VVUF9ERVZJQ0UsCi0JCQkJICBTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgYWNwaV9yb290X2Rpcik7CisJLyogJ3dha2V1cCBkZXZpY2UnIFtSL1ddICovCisJZW50cnkgPQorCSAgICBjcmVhdGVfcHJvY19lbnRyeSgid2FrZXVwIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICAgICAgYWNwaV9yb290X2Rpcik7CiAJaWYgKGVudHJ5KQogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfc3lzdGVtX3dha2V1cF9kZXZpY2VfZm9wczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL3dha2V1cC5jIGIvZHJpdmVycy9hY3BpL3NsZWVwL3dha2V1cC5jCmluZGV4IGQ5YjE5OTkuLjQxMzRlZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC93YWtldXAuYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMKQEAgLTEyLDkgKzEyLDkgQEAKICNpbmNsdWRlICJzbGVlcC5oIgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfU1lTVEVNX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJ3YWtldXBfZGV2aWNlcyIpCitBQ1BJX01PRFVMRV9OQU1FKCJ3YWtldXBfZGV2aWNlcyIpCiAKLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkCWFjcGlfd2FrZXVwX2RldmljZV9saXN0OworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYWNwaV93YWtldXBfZGV2aWNlX2xpc3Q7CiBleHRlcm4gc3BpbmxvY2tfdCBhY3BpX2RldmljZV9sb2NrOwogCiAjaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKQEAgLTI1LDIyICsyNSwyMSBAQAogICogaXMgaGlnaGVyIHRoYW4gcmVxdWVzdGVkIHNsZWVwIGxldmVsCiAgKi8KIAotdm9pZAotYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZV9wcmVwKAotCXU4CQlzbGVlcF9zdGF0ZSkKK3ZvaWQgYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZV9wcmVwKHU4IHNsZWVwX3N0YXRlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3ByZXAiKTsKIAogCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXYgPSBjb250YWluZXJfb2Yobm9kZSwgCi0JCQlzdHJ1Y3QgYWNwaV9kZXZpY2UsIHdha2V1cF9saXN0KTsKLQkJCi0JCWlmICghZGV2LT53YWtldXAuZmxhZ3MudmFsaWQgfHwgCi0JCQkhZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCB8fAotCQkJKHNsZWVwX3N0YXRlID4gKHUzMikgZGV2LT53YWtldXAuc2xlZXBfc3RhdGUpKQorCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihub2RlLAorCQkJCQkJICAgICAgIHN0cnVjdCBhY3BpX2RldmljZSwKKwkJCQkJCSAgICAgICB3YWtldXBfbGlzdCk7CisKKwkJaWYgKCFkZXYtPndha2V1cC5mbGFncy52YWxpZCB8fAorCQkgICAgIWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgfHwKKwkJICAgIChzbGVlcF9zdGF0ZSA+ICh1MzIpIGRldi0+d2FrZXVwLnNsZWVwX3N0YXRlKSkKIAkJCWNvbnRpbnVlOwogCiAJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKQEAgLTU1LDExICs1NCw5IEBACiAgKglAc2xlZXBfc3RhdGU6CUFDUEkgc3RhdGUKICAqIEVuYWJsZSBhbGwgd2FrdXAgZGV2aWNlcydzIEdQRQogICovCi12b2lkCi1hY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlKAotCXU4CQlzbGVlcF9zdGF0ZSkKK3ZvaWQgYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZSh1OCBzbGVlcF9zdGF0ZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZSwgKiBuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OwogCiAJLyogCiAJICogQ2F1dGlvbjogdGhpcyByb3V0aW5lIG11c3QgYmUgaW52b2tlZCB3aGVuIGludGVycnVwdCBpcyBkaXNhYmxlZCAKQEAgLTY4LDMzICs2NSwzNSBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2UiKTsKIAlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmYWNwaV93YWtldXBfZGV2aWNlX2xpc3QpIHsKLQkJc3RydWN0IGFjcGlfZGV2aWNlICogZGV2ID0gY29udGFpbmVyX29mKG5vZGUsIAotCQkJc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7CisJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG5vZGUsCisJCQkJCQkgICAgICAgc3RydWN0IGFjcGlfZGV2aWNlLAorCQkJCQkJICAgICAgIHdha2V1cF9saXN0KTsKIAogCQkvKiBJZiB1c2VycyB3YW50IHRvIGRpc2FibGUgcnVuLXdha2UgR1BFLAogCQkgKiB3ZSBvbmx5IGRpc2FibGUgaXQgZm9yIHdha2UgYW5kIGxlYXZlIGl0IGZvciBydW50aW1lCiAJCSAqLwogCQlpZiAoZGV2LT53YWtldXAuZmxhZ3MucnVuX3dha2UgJiYgIWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQpIHsKIAkJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQkJCWFjcGlfc2V0X2dwZV90eXBlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsIAotCQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfR1BFX1RZUEVfUlVOVElNRSk7CisJCQlhY3BpX3NldF9ncGVfdHlwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAorCQkJCQkgIGRldi0+d2FrZXVwLmdwZV9udW1iZXIsCisJCQkJCSAgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKIAkJCS8qIFJlLWVuYWJsZSBpdCwgc2luY2Ugc2V0X2dwZV90eXBlIHdpbGwgZGlzYWJsZSBpdCAqLwotCQkJYWNwaV9lbmFibGVfZ3BlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsIAotCQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfSVNSKTsKKwkJCWFjcGlfZW5hYmxlX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAorCQkJCQlkZXYtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX0lTUik7CiAJCQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCQkJY29udGludWU7CiAJCX0KIAogCQlpZiAoIWRldi0+d2FrZXVwLmZsYWdzLnZhbGlkIHx8Ci0JCQkhZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCB8fAotCQkJKHNsZWVwX3N0YXRlID4gKHUzMikgZGV2LT53YWtldXAuc2xlZXBfc3RhdGUpKQorCQkgICAgIWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgfHwKKwkJICAgIChzbGVlcF9zdGF0ZSA+ICh1MzIpIGRldi0+d2FrZXVwLnNsZWVwX3N0YXRlKSkKIAkJCWNvbnRpbnVlOwogCiAJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAkJLyogcnVuLXdha2UgR1BFIGhhcyBiZWVuIGVuYWJsZWQgKi8KIAkJaWYgKCFkZXYtPndha2V1cC5mbGFncy5ydW5fd2FrZSkKLQkJCWFjcGlfZW5hYmxlX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLCAKLQkJCQlkZXYtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX0lTUik7CisJCQlhY3BpX2VuYWJsZV9ncGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwKKwkJCQkJZGV2LT53YWtldXAuZ3BlX251bWJlciwgQUNQSV9JU1IpOwogCQlkZXYtPndha2V1cC5zdGF0ZS5hY3RpdmUgPSAxOwogCQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCX0KQEAgLTEwNiw0MyArMTA1LDQzIEBACiAgKglAc2xlZXBfc3RhdGU6CUFDUEkgc3RhdGUKICAqIERpc2FibGUgYWxsIHdha3VwIGRldmljZXMncyBHUEUgYW5kIHdha2V1cCBjYXBhYmlsaXR5CiAgKi8KLXZvaWQKLWFjcGlfZGlzYWJsZV93YWtldXBfZGV2aWNlICgKLQl1OAkJc2xlZXBfc3RhdGUpCit2b2lkIGFjcGlfZGlzYWJsZV93YWtldXBfZGV2aWNlKHU4IHNsZWVwX3N0YXRlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZSIpOwogCiAJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KSB7Ci0JCXN0cnVjdCBhY3BpX2RldmljZSAqIGRldiA9IGNvbnRhaW5lcl9vZihub2RlLCAKLQkJCXN0cnVjdCBhY3BpX2RldmljZSwgd2FrZXVwX2xpc3QpOworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihub2RlLAorCQkJCQkJICAgICAgIHN0cnVjdCBhY3BpX2RldmljZSwKKwkJCQkJCSAgICAgICB3YWtldXBfbGlzdCk7CiAKIAkJaWYgKGRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlICYmICFkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkKSB7CiAJCQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JCQlhY3BpX3NldF9ncGVfdHlwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLCAKLQkJCQlkZXYtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX0dQRV9UWVBFX1dBS0VfUlVOKTsKKwkJCWFjcGlfc2V0X2dwZV90eXBlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsCisJCQkJCSAgZGV2LT53YWtldXAuZ3BlX251bWJlciwKKwkJCQkJICBBQ1BJX0dQRV9UWVBFX1dBS0VfUlVOKTsKIAkJCS8qIFJlLWVuYWJsZSBpdCwgc2luY2Ugc2V0X2dwZV90eXBlIHdpbGwgZGlzYWJsZSBpdCAqLwotCQkJYWNwaV9lbmFibGVfZ3BlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsIAotCQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfTk9UX0lTUik7CisJCQlhY3BpX2VuYWJsZV9ncGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwKKwkJCQkJZGV2LT53YWtldXAuZ3BlX251bWJlciwgQUNQSV9OT1RfSVNSKTsKIAkJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmICghZGV2LT53YWtldXAuZmxhZ3MudmFsaWQgfHwgCi0JCQkhZGV2LT53YWtldXAuc3RhdGUuYWN0aXZlIHx8Ci0JCQkoc2xlZXBfc3RhdGUgPiAodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSkpCisJCWlmICghZGV2LT53YWtldXAuZmxhZ3MudmFsaWQgfHwKKwkJICAgICFkZXYtPndha2V1cC5zdGF0ZS5hY3RpdmUgfHwKKwkJICAgIChzbGVlcF9zdGF0ZSA+ICh1MzIpIGRldi0+d2FrZXVwLnNsZWVwX3N0YXRlKSkKIAkJCWNvbnRpbnVlOwogCiAJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAkJYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2VfcG93ZXIoZGV2KTsKIAkJLyogTmV2ZXIgZGlzYWJsZSBydW4td2FrZSBHUEUgKi8KIAkJaWYgKCFkZXYtPndha2V1cC5mbGFncy5ydW5fd2FrZSkgewotCQkJYWNwaV9kaXNhYmxlX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLCAKLQkJCQlkZXYtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX05PVF9JU1IpOwotCQkJYWNwaV9jbGVhcl9ncGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwgCi0JCQkJZGV2LT53YWtldXAuZ3BlX251bWJlciwgQUNQSV9OT1RfSVNSKTsKKwkJCWFjcGlfZGlzYWJsZV9ncGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwKKwkJCQkJIGRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfTk9UX0lTUik7CisJCQlhY3BpX2NsZWFyX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAorCQkJCSAgICAgICBkZXYtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX05PVF9JU1IpOwogCQl9CiAJCWRldi0+d2FrZXVwLnN0YXRlLmFjdGl2ZSA9IDA7CiAJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CkBAIC0xNTIsNyArMTUxLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgYWNwaV93YWtldXBfZGV2aWNlX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZSwgKiBuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OwogCiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAwOwpAQCAtMTYwLDE2ICsxNTksMTggQEAKIAogCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXYgPSBjb250YWluZXJfb2Yobm9kZSwgCi0JCQlzdHJ1Y3QgYWNwaV9kZXZpY2UsIHdha2V1cF9saXN0KTsKLQkJCisJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG5vZGUsCisJCQkJCQkgICAgICAgc3RydWN0IGFjcGlfZGV2aWNlLAorCQkJCQkJICAgICAgIHdha2V1cF9saXN0KTsKKwogCQkvKiBJbiBjYXNlIHVzZXIgZG9lc24ndCBsb2FkIGJ1dHRvbiBkcml2ZXIgKi8KIAkJaWYgKGRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlICYmICFkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkKSB7CiAJCQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JCQlhY3BpX3NldF9ncGVfdHlwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLCAKLQkJCQlkZXYtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX0dQRV9UWVBFX1dBS0VfUlVOKTsKLQkJCWFjcGlfZW5hYmxlX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLCAKLQkJCQlkZXYtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX05PVF9JU1IpOworCQkJYWNwaV9zZXRfZ3BlX3R5cGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwKKwkJCQkJICBkZXYtPndha2V1cC5ncGVfbnVtYmVyLAorCQkJCQkgIEFDUElfR1BFX1RZUEVfV0FLRV9SVU4pOworCQkJYWNwaV9lbmFibGVfZ3BlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsCisJCQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfTk9UX0lTUik7CiAJCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID0gMTsKIAkJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJCX0KQEAgLTE5MywxNyArMTk0LDE5IEBACiAgKi8KIHZvaWQgYWNwaV93YWtldXBfZ3BlX3Bvd2Vyb2ZmX3ByZXBhcmUodm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZSwgKiBuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OwogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXYgPSBjb250YWluZXJfb2Yobm9kZSwKLQkJCXN0cnVjdCBhY3BpX2RldmljZSwgd2FrZXVwX2xpc3QpOworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihub2RlLAorCQkJCQkJICAgICAgIHN0cnVjdCBhY3BpX2RldmljZSwKKwkJCQkJCSAgICAgICB3YWtldXBfbGlzdCk7CiAKIAkJLyogVGhlIEdQRSBjYW4gd2FrZXVwIHN5c3RlbSBmcm9tIFM1LCBkb24ndCB0b3VjaCBpdCAqLwotCQlpZiAoKHUzMilkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1M1KQorCQlpZiAoKHUzMikgZGV2LT53YWtldXAuc2xlZXBfc3RhdGUgPT0gQUNQSV9TVEFURV9TNSkKIAkJCWNvbnRpbnVlOwogCQkvKiBhY3BpX3NldF9ncGVfdHlwZSB3aWxsIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSBHUEUgKi8KIAkJYWNwaV9zZXRfZ3BlX3R5cGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwKLQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfR1BFX1RZUEVfUlVOVElNRSk7CisJCQkJICBkZXYtPndha2V1cC5ncGVfbnVtYmVyLAorCQkJCSAgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc3lzdGVtLmMgYi9kcml2ZXJzL2FjcGkvc3lzdGVtLmMKaW5kZXggODkyNWE2Yy4uZTQzMDhjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3N5c3RlbS5jCisrKyBiL2RyaXZlcnMvYWNwaS9zeXN0ZW0uYwpAQCAtMzAsMTAgKzMwLDggQEAKIAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1NZU1RFTV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgiYWNwaV9zeXN0ZW0iKQotCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3N5c3RlbSIpCiAjZGVmaW5lIEFDUElfU1lTVEVNX0NMQVNTCQkic3lzdGVtIgogI2RlZmluZSBBQ1BJX1NZU1RFTV9EUklWRVJfTkFNRQkJIkFDUEkgU3lzdGVtIERyaXZlciIKICNkZWZpbmUgQUNQSV9TWVNURU1fREVWSUNFX05BTUUJCSJTeXN0ZW0iCkBAIC00MSwxNSArMzksMTMgQEAKICNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9FVkVOVAkJImV2ZW50IgogI2RlZmluZSBBQ1BJX1NZU1RFTV9GSUxFX0RTRFQJCSJkc2R0IgogI2RlZmluZSBBQ1BJX1NZU1RFTV9GSUxFX0ZBRFQJCSJmYWR0IgotCi1leHRlcm4gRkFEVF9ERVNDUklQVE9SCQlhY3BpX2ZhZHQ7CitleHRlcm4gRkFEVF9ERVNDUklQVE9SIGFjcGlfZmFkdDsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50Ci1hY3BpX3N5c3RlbV9yZWFkX2luZm8gKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCitzdGF0aWMgaW50IGFjcGlfc3lzdGVtX3JlYWRfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfc3lzdGVtX3JlYWRfaW5mbyIpOwogCkBAIC02MywyOCArNTksMjYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9zeXN0ZW1faW5mb19vcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV9zeXN0ZW1faW5mb19vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX3N5c3RlbV9pbmZvX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgc3NpemVfdCBhY3BpX3N5c3RlbV9yZWFkX2RzZHQgKHN0cnVjdCBmaWxlKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QqKTsKK3N0YXRpYyBzc2l6ZV90IGFjcGlfc3lzdGVtX3JlYWRfZHNkdChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsCisJCQkJICAgICBsb2ZmX3QgKik7CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfc3lzdGVtX2RzZHRfb3BzID0gewotCS5yZWFkID0JCQlhY3BpX3N5c3RlbV9yZWFkX2RzZHQsCisJLnJlYWQgPSBhY3BpX3N5c3RlbV9yZWFkX2RzZHQsCiB9OwogCiBzdGF0aWMgc3NpemVfdAotYWNwaV9zeXN0ZW1fcmVhZF9kc2R0ICgKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUsCi0JY2hhcgkJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpwcG9zKQorYWNwaV9zeXN0ZW1fcmVhZF9kc2R0KHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJZHNkdCA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0Jc3NpemVfdAkJCXJlczsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgZHNkdCA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwlzc2l6ZV90IHJlczsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfc3lzdGVtX3JlYWRfZHNkdCIpOwogCkBAIC05OSwyMyArOTMsMjAgQEAKIAlyZXR1cm5fVkFMVUUocmVzKTsKIH0KIAotCi1zdGF0aWMgc3NpemVfdCBhY3BpX3N5c3RlbV9yZWFkX2ZhZHQgKHN0cnVjdCBmaWxlKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QqKTsKK3N0YXRpYyBzc2l6ZV90IGFjcGlfc3lzdGVtX3JlYWRfZmFkdChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsCisJCQkJICAgICBsb2ZmX3QgKik7CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfc3lzdGVtX2ZhZHRfb3BzID0gewotCS5yZWFkID0JCQlhY3BpX3N5c3RlbV9yZWFkX2ZhZHQsCisJLnJlYWQgPSBhY3BpX3N5c3RlbV9yZWFkX2ZhZHQsCiB9OwogCiBzdGF0aWMgc3NpemVfdAotYWNwaV9zeXN0ZW1fcmVhZF9mYWR0ICgKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUsCi0JY2hhcgkJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpwcG9zKQorYWNwaV9zeXN0ZW1fcmVhZF9mYWR0KHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJZmFkdCA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0Jc3NpemVfdAkJCXJlczsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgZmFkdCA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwlzc2l6ZV90IHJlczsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfc3lzdGVtX3JlYWRfZmFkdCIpOwogCkBAIC0xMzAsMTIgKzEyMSwxMSBAQAogCXJldHVybl9WQUxVRShyZXMpOwogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfc3lzdGVtX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3N5c3RlbV9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwogCWludCBlcnJvciA9IDA7Ci0JY2hhciAqIG5hbWU7CisJY2hhciAqbmFtZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfc3lzdGVtX2luaXQiKTsKIApAQCAtMTQ0LDggKzEzNCw3IEBACiAKIAkvKiAnaW5mbycgW1JdICovCiAJbmFtZSA9IEFDUElfU1lTVEVNX0ZJTEVfSU5GTzsKLQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsCi0JCVNfSVJVR08sIGFjcGlfcm9vdF9kaXIpOworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkobmFtZSwgU19JUlVHTywgYWNwaV9yb290X2Rpcik7CiAJaWYgKCFlbnRyeSkKIAkJZ290byBFcnJvcjsKIAllbHNlIHsKQEAgLTE1Nyw3ICsxNDYsNyBAQAogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkobmFtZSwgU19JUlVTUiwgYWNwaV9yb290X2Rpcik7CiAJaWYgKGVudHJ5KQogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfc3lzdGVtX2RzZHRfb3BzOwotCWVsc2UgCisJZWxzZQogCQlnb3RvIEVycm9yOwogCiAJLyogJ2ZhZHQnIFtSXSAqLwpAQCAtMTY4LDEyICsxNTcsMTIgQEAKIAllbHNlCiAJCWdvdG8gRXJyb3I7CiAKLSBEb25lOgorICAgICAgRG9uZToKIAlyZXR1cm5fVkFMVUUoZXJyb3IpOwogCi0gRXJyb3I6Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCi0JCQkgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBwcm9jIGZzIGVudHJ5XG4iLCBuYW1lKSk7CisgICAgICBFcnJvcjoKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIHByb2MgZnMgZW50cnlcbiIsIG5hbWUpKTsKIAogCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfU1lTVEVNX0ZJTEVfRkFEVCwgYWNwaV9yb290X2Rpcik7CiAJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9TWVNURU1fRklMRV9EU0RULCBhY3BpX3Jvb3RfZGlyKTsKQEAgLTE4Myw1ICsxNzIsNCBAQAogCWdvdG8gRG9uZTsKIH0KIAotCiBzdWJzeXNfaW5pdGNhbGwoYWNwaV9zeXN0ZW1faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzLmMKaW5kZXggZmI2NGJkNS4uYTJiZjI1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMuYwpAQCAtNDAsMjUgKzQwLDI1IEBACiAjZGVmaW5lIEFDUElfTUFYX1RBQkxFUwkJMjU2CiAKIHN0YXRpYyBjaGFyICphY3BpX3RhYmxlX3NpZ25hdHVyZXNbQUNQSV9UQUJMRV9DT1VOVF0gPSB7Ci0JW0FDUElfVEFCTEVfVU5LTk9XTl0JPSAiPz8/PyIsCi0JW0FDUElfQVBJQ10JCT0gIkFQSUMiLAotCVtBQ1BJX0JPT1RdCQk9ICJCT09UIiwKLQlbQUNQSV9EQkdQXQkJPSAiREJHUCIsCi0JW0FDUElfRFNEVF0JCT0gIkRTRFQiLAotCVtBQ1BJX0VDRFRdCQk9ICJFQ0RUIiwKLQlbQUNQSV9FVERUXQkJPSAiRVREVCIsCi0JW0FDUElfRkFEVF0JCT0gIkZBQ1AiLAotCVtBQ1BJX0ZBQ1NdCQk9ICJGQUNTIiwKLQlbQUNQSV9PRU1YXQkJPSAiT0VNIiwKLQlbQUNQSV9QU0RUXQkJPSAiUFNEVCIsCi0JW0FDUElfU0JTVF0JCT0gIlNCU1QiLAotCVtBQ1BJX1NMSVRdCQk9ICJTTElUIiwKLQlbQUNQSV9TUENSXQkJPSAiU1BDUiIsCi0JW0FDUElfU1JBVF0JCT0gIlNSQVQiLAotCVtBQ1BJX1NTRFRdCQk9ICJTU0RUIiwKLQlbQUNQSV9TUE1JXQkJPSAiU1BNSSIsCi0JW0FDUElfSFBFVF0JCT0gIkhQRVQiLAotCVtBQ1BJX01DRkddCQk9ICJNQ0ZHIiwKKwlbQUNQSV9UQUJMRV9VTktOT1dOXSA9ICI/Pz8/IiwKKwlbQUNQSV9BUElDXSA9ICJBUElDIiwKKwlbQUNQSV9CT09UXSA9ICJCT09UIiwKKwlbQUNQSV9EQkdQXSA9ICJEQkdQIiwKKwlbQUNQSV9EU0RUXSA9ICJEU0RUIiwKKwlbQUNQSV9FQ0RUXSA9ICJFQ0RUIiwKKwlbQUNQSV9FVERUXSA9ICJFVERUIiwKKwlbQUNQSV9GQURUXSA9ICJGQUNQIiwKKwlbQUNQSV9GQUNTXSA9ICJGQUNTIiwKKwlbQUNQSV9PRU1YXSA9ICJPRU0iLAorCVtBQ1BJX1BTRFRdID0gIlBTRFQiLAorCVtBQ1BJX1NCU1RdID0gIlNCU1QiLAorCVtBQ1BJX1NMSVRdID0gIlNMSVQiLAorCVtBQ1BJX1NQQ1JdID0gIlNQQ1IiLAorCVtBQ1BJX1NSQVRdID0gIlNSQVQiLAorCVtBQ1BJX1NTRFRdID0gIlNTRFQiLAorCVtBQ1BJX1NQTUldID0gIlNQTUkiLAorCVtBQ1BJX0hQRVRdID0gIkhQRVQiLAorCVtBQ1BJX01DRkddID0gIk1DRkciLAogfTsKIAogc3RhdGljIGNoYXIgKm1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W10gPSB7ICJkZmwiLCAiaGlnaCIsICJyZXMiLCAibG93IiB9OwpAQCAtNjYsNTIgKzY2LDQ0IEBACiAKIC8qIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAoUlNEVC9YU0RUKSAqLwogc3RydWN0IGFjcGlfdGFibGVfc2R0IHsKLQl1bnNpZ25lZCBsb25nCQlwYTsKLQllbnVtIGFjcGlfdGFibGVfaWQJaWQ7Ci0JdW5zaWduZWQgbG9uZwkJc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHBhOworCWVudW0gYWNwaV90YWJsZV9pZCBpZDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcJCXNkdF9wYTsJCS8qIFBoeXNpY2FsIEFkZHJlc3MgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCQlzZHRfY291bnQ7CS8qIFRhYmxlIGNvdW50ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZHRfcGE7CS8qIFBoeXNpY2FsIEFkZHJlc3MgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNkdF9jb3VudDsJLyogVGFibGUgY291bnQgKi8KIAotc3RhdGljIHN0cnVjdCBhY3BpX3RhYmxlX3NkdAlzZHRfZW50cnlbQUNQSV9NQVhfVEFCTEVTXTsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9zZHQgc2R0X2VudHJ5W0FDUElfTUFYX1RBQkxFU107CiAKLXZvaWQKLWFjcGlfdGFibGVfcHJpbnQgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyLAotCXVuc2lnbmVkIGxvbmcJCXBoeXNfYWRkcikKK3ZvaWQgYWNwaV90YWJsZV9wcmludChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCiB7Ci0JY2hhcgkJCSpuYW1lID0gTlVMTDsKKwljaGFyICpuYW1lID0gTlVMTDsKIAogCWlmICghaGVhZGVyKQogCQlyZXR1cm47CiAKIAkvKiBTb21lIHRhYmxlIHNpZ25hdHVyZXMgYXJlbid0IGdvb2QgdGFibGUgbmFtZXMgKi8KIAotCWlmICghc3RybmNtcCgoY2hhciAqKSAmaGVhZGVyLT5zaWduYXR1cmUsCi0JCWFjcGlfdGFibGVfc2lnbmF0dXJlc1tBQ1BJX0FQSUNdLAotCQlzaXplb2YoaGVhZGVyLT5zaWduYXR1cmUpKSkgeworCWlmICghc3RybmNtcCgoY2hhciAqKSZoZWFkZXItPnNpZ25hdHVyZSwKKwkJICAgICBhY3BpX3RhYmxlX3NpZ25hdHVyZXNbQUNQSV9BUElDXSwKKwkJICAgICBzaXplb2YoaGVhZGVyLT5zaWduYXR1cmUpKSkgewogCQluYW1lID0gIk1BRFQiOwotCX0KLQllbHNlIGlmICghc3RybmNtcCgoY2hhciAqKSAmaGVhZGVyLT5zaWduYXR1cmUsCi0JCWFjcGlfdGFibGVfc2lnbmF0dXJlc1tBQ1BJX0ZBRFRdLAotCQlzaXplb2YoaGVhZGVyLT5zaWduYXR1cmUpKSkgeworCX0gZWxzZSBpZiAoIXN0cm5jbXAoKGNoYXIgKikmaGVhZGVyLT5zaWduYXR1cmUsCisJCQkgICAgYWNwaV90YWJsZV9zaWduYXR1cmVzW0FDUElfRkFEVF0sCisJCQkgICAgc2l6ZW9mKGhlYWRlci0+c2lnbmF0dXJlKSkpIHsKIAkJbmFtZSA9ICJGQURUIjsKLQl9Ci0JZWxzZQorCX0gZWxzZQogCQluYW1lID0gaGVhZGVyLT5zaWduYXR1cmU7CiAKLQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggIiUuNHMgKHYlMy4zZCAlNi42cyAlOC44cyAweCUwOHggJS40cyAweCUwOHgpIEAgMHglcFxuIiwKLQkJbmFtZSwgaGVhZGVyLT5yZXZpc2lvbiwgaGVhZGVyLT5vZW1faWQsCi0JCWhlYWRlci0+b2VtX3RhYmxlX2lkLCBoZWFkZXItPm9lbV9yZXZpc2lvbiwKLQkJaGVhZGVyLT5hc2xfY29tcGlsZXJfaWQsIGhlYWRlci0+YXNsX2NvbXBpbGVyX3JldmlzaW9uLAotCQkodm9pZCAqKSBwaHlzX2FkZHIpOworCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWAorCSAgICAgICAiJS40cyAodiUzLjNkICU2LjZzICU4LjhzIDB4JTA4eCAlLjRzIDB4JTA4eCkgQCAweCVwXG4iLCBuYW1lLAorCSAgICAgICBoZWFkZXItPnJldmlzaW9uLCBoZWFkZXItPm9lbV9pZCwgaGVhZGVyLT5vZW1fdGFibGVfaWQsCisJICAgICAgIGhlYWRlci0+b2VtX3JldmlzaW9uLCBoZWFkZXItPmFzbF9jb21waWxlcl9pZCwKKwkgICAgICAgaGVhZGVyLT5hc2xfY29tcGlsZXJfcmV2aXNpb24sICh2b2lkICopcGh5c19hZGRyKTsKIH0KIAotCi12b2lkCi1hY3BpX3RhYmxlX3ByaW50X21hZHRfZW50cnkgKAotCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyCSpoZWFkZXIpCit2b2lkIGFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlcikKIHsKIAlpZiAoIWhlYWRlcikKIAkJcmV0dXJuOwpAQCAtMTE5LDExMyArMTExLDEyNyBAQAogCXN3aXRjaCAoaGVhZGVyLT50eXBlKSB7CiAKIAljYXNlIEFDUElfTUFEVF9MQVBJQzoKLQl7Ci0JCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljICpwID0KLQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpYyopIGhlYWRlcjsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkxBUElDIChhY3BpX2lkWzB4JTAyeF0gbGFwaWNfaWRbMHglMDJ4XSAlcylcbiIsCi0JCQlwLT5hY3BpX2lkLCBwLT5pZCwgcC0+ZmxhZ3MuZW5hYmxlZD8iZW5hYmxlZCI6ImRpc2FibGVkIik7Ci0JfQorCQl7CisJCQlzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpYyAqcCA9CisJCQkgICAgKHN0cnVjdCBhY3BpX3RhYmxlX2xhcGljICopaGVhZGVyOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJCSAgICAgICAiTEFQSUMgKGFjcGlfaWRbMHglMDJ4XSBsYXBpY19pZFsweCUwMnhdICVzKVxuIiwKKwkJCSAgICAgICBwLT5hY3BpX2lkLCBwLT5pZCwKKwkJCSAgICAgICBwLT5mbGFncy5lbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTUFEVF9JT0FQSUM6Ci0JewotCQlzdHJ1Y3QgYWNwaV90YWJsZV9pb2FwaWMgKnAgPQotCQkJKHN0cnVjdCBhY3BpX3RhYmxlX2lvYXBpYyopIGhlYWRlcjsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIklPQVBJQyAoaWRbMHglMDJ4XSBhZGRyZXNzWzB4JTA4eF0gZ3NpX2Jhc2VbJWRdKVxuIiwKLQkJCXAtPmlkLCBwLT5hZGRyZXNzLCBwLT5nbG9iYWxfaXJxX2Jhc2UpOwotCX0KKwkJeworCQkJc3RydWN0IGFjcGlfdGFibGVfaW9hcGljICpwID0KKwkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfaW9hcGljICopaGVhZGVyOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJCSAgICAgICAiSU9BUElDIChpZFsweCUwMnhdIGFkZHJlc3NbMHglMDh4XSBnc2lfYmFzZVslZF0pXG4iLAorCQkJICAgICAgIHAtPmlkLCBwLT5hZGRyZXNzLCBwLT5nbG9iYWxfaXJxX2Jhc2UpOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX01BRFRfSU5UX1NSQ19PVlI6Ci0JewotCQlzdHJ1Y3QgYWNwaV90YWJsZV9pbnRfc3JjX292ciAqcCA9Ci0JCQkoc3RydWN0IGFjcGlfdGFibGVfaW50X3NyY19vdnIqKSBoZWFkZXI7Ci0JCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJJTlRfU1JDX09WUiAoYnVzICVkIGJ1c19pcnEgJWQgZ2xvYmFsX2lycSAlZCAlcyAlcylcbiIsCi0JCQlwLT5idXMsIHAtPmJ1c19pcnEsIHAtPmdsb2JhbF9pcnEsCi0JCQltcHNfaW50aV9mbGFnc19wb2xhcml0eVtwLT5mbGFncy5wb2xhcml0eV0sCi0JCQltcHNfaW50aV9mbGFnc190cmlnZ2VyW3AtPmZsYWdzLnRyaWdnZXJdKTsKLQkJaWYocC0+ZmxhZ3MucmVzZXJ2ZWQpCi0JCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSU5UX1NSQ19PVlIgdW5leHBlY3RlZCByZXNlcnZlZCBmbGFnczogMHgleFxuIiwKLQkJCQlwLT5mbGFncy5yZXNlcnZlZCk7CisJCXsKKwkJCXN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyICpwID0KKwkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfaW50X3NyY19vdnIgKiloZWFkZXI7CisJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkJICAgICAgICJJTlRfU1JDX09WUiAoYnVzICVkIGJ1c19pcnEgJWQgZ2xvYmFsX2lycSAlZCAlcyAlcylcbiIsCisJCQkgICAgICAgcC0+YnVzLCBwLT5idXNfaXJxLCBwLT5nbG9iYWxfaXJxLAorCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3AtPmZsYWdzLnBvbGFyaXR5XSwKKwkJCSAgICAgICBtcHNfaW50aV9mbGFnc190cmlnZ2VyW3AtPmZsYWdzLnRyaWdnZXJdKTsKKwkJCWlmIChwLT5mbGFncy5yZXNlcnZlZCkKKwkJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkJCSAgICAgICAiSU5UX1NSQ19PVlIgdW5leHBlY3RlZCByZXNlcnZlZCBmbGFnczogMHgleFxuIiwKKwkJCQkgICAgICAgcC0+ZmxhZ3MucmVzZXJ2ZWQpOwogCi0JfQorCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX01BRFRfTk1JX1NSQzoKLQl7Ci0JCXN0cnVjdCBhY3BpX3RhYmxlX25taV9zcmMgKnAgPQotCQkJKHN0cnVjdCBhY3BpX3RhYmxlX25taV9zcmMqKSBoZWFkZXI7Ci0JCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJOTUlfU1JDICglcyAlcyBnbG9iYWxfaXJxICVkKVxuIiwKLQkJCW1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3AtPmZsYWdzLnBvbGFyaXR5XSwKLQkJCW1wc19pbnRpX2ZsYWdzX3RyaWdnZXJbcC0+ZmxhZ3MudHJpZ2dlcl0sIHAtPmdsb2JhbF9pcnEpOwotCX0KKwkJeworCQkJc3RydWN0IGFjcGlfdGFibGVfbm1pX3NyYyAqcCA9CisJCQkgICAgKHN0cnVjdCBhY3BpX3RhYmxlX25taV9zcmMgKiloZWFkZXI7CisJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkJICAgICAgICJOTUlfU1JDICglcyAlcyBnbG9iYWxfaXJxICVkKVxuIiwKKwkJCSAgICAgICBtcHNfaW50aV9mbGFnc19wb2xhcml0eVtwLT5mbGFncy5wb2xhcml0eV0sCisJCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfdHJpZ2dlcltwLT5mbGFncy50cmlnZ2VyXSwKKwkJCSAgICAgICBwLT5nbG9iYWxfaXJxKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQUNQSV9NQURUX0xBUElDX05NSToKLQl7Ci0JCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX25taSAqcCA9Ci0JCQkoc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfbm1pKikgaGVhZGVyOwotCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiTEFQSUNfTk1JIChhY3BpX2lkWzB4JTAyeF0gJXMgJXMgbGludFsweCV4XSlcbiIsCi0JCQlwLT5hY3BpX2lkLAotCQkJbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbcC0+ZmxhZ3MucG9sYXJpdHldLAotCQkJbXBzX2ludGlfZmxhZ3NfdHJpZ2dlcltwLT5mbGFncy50cmlnZ2VyXSwgcC0+bGludCk7Ci0JfQorCQl7CisJCQlzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19ubWkgKnAgPQorCQkJICAgIChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19ubWkgKiloZWFkZXI7CisJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkJICAgICAgICJMQVBJQ19OTUkgKGFjcGlfaWRbMHglMDJ4XSAlcyAlcyBsaW50WzB4JXhdKVxuIiwKKwkJCSAgICAgICBwLT5hY3BpX2lkLAorCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3AtPmZsYWdzLnBvbGFyaXR5XSwKKwkJCSAgICAgICBtcHNfaW50aV9mbGFnc190cmlnZ2VyW3AtPmZsYWdzLnRyaWdnZXJdLAorCQkJICAgICAgIHAtPmxpbnQpOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX01BRFRfTEFQSUNfQUREUl9PVlI6Ci0JewotCQlzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19hZGRyX292ciAqcCA9Ci0JCQkoc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfYWRkcl9vdnIqKSBoZWFkZXI7Ci0JCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJMQVBJQ19BRERSX09WUiAoYWRkcmVzc1slcF0pXG4iLAotCQkJKHZvaWQgKikgKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHJlc3MpOwotCX0KKwkJeworCQkJc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfYWRkcl9vdnIgKnAgPQorCQkJICAgIChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19hZGRyX292ciAqKWhlYWRlcjsKKwkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCisJCQkgICAgICAgIkxBUElDX0FERFJfT1ZSIChhZGRyZXNzWyVwXSlcbiIsCisJCQkgICAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZylwLT5hZGRyZXNzKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQUNQSV9NQURUX0lPU0FQSUM6Ci0JewotCQlzdHJ1Y3QgYWNwaV90YWJsZV9pb3NhcGljICpwID0KLQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9pb3NhcGljKikgaGVhZGVyOwotCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSU9TQVBJQyAoaWRbMHgleF0gYWRkcmVzc1slcF0gZ3NpX2Jhc2VbJWRdKVxuIiwKLQkJCXAtPmlkLCAodm9pZCAqKSAodW5zaWduZWQgbG9uZykgcC0+YWRkcmVzcywgcC0+Z2xvYmFsX2lycV9iYXNlKTsKLQl9CisJCXsKKwkJCXN0cnVjdCBhY3BpX3RhYmxlX2lvc2FwaWMgKnAgPQorCQkJICAgIChzdHJ1Y3QgYWNwaV90YWJsZV9pb3NhcGljICopaGVhZGVyOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJCSAgICAgICAiSU9TQVBJQyAoaWRbMHgleF0gYWRkcmVzc1slcF0gZ3NpX2Jhc2VbJWRdKVxuIiwKKwkJCSAgICAgICBwLT5pZCwgKHZvaWQgKikodW5zaWduZWQgbG9uZylwLT5hZGRyZXNzLAorCQkJICAgICAgIHAtPmdsb2JhbF9pcnFfYmFzZSk7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTUFEVF9MU0FQSUM6Ci0JewotCQlzdHJ1Y3QgYWNwaV90YWJsZV9sc2FwaWMgKnAgPQotCQkJKHN0cnVjdCBhY3BpX3RhYmxlX2xzYXBpYyopIGhlYWRlcjsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkxTQVBJQyAoYWNwaV9pZFsweCUwMnhdIGxzYXBpY19pZFsweCUwMnhdIGxzYXBpY19laWRbMHglMDJ4XSAlcylcbiIsCi0JCQlwLT5hY3BpX2lkLCBwLT5pZCwgcC0+ZWlkLCBwLT5mbGFncy5lbmFibGVkPyJlbmFibGVkIjoiZGlzYWJsZWQiKTsKLQl9CisJCXsKKwkJCXN0cnVjdCBhY3BpX3RhYmxlX2xzYXBpYyAqcCA9CisJCQkgICAgKHN0cnVjdCBhY3BpX3RhYmxlX2xzYXBpYyAqKWhlYWRlcjsKKwkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCisJCQkgICAgICAgIkxTQVBJQyAoYWNwaV9pZFsweCUwMnhdIGxzYXBpY19pZFsweCUwMnhdIGxzYXBpY19laWRbMHglMDJ4XSAlcylcbiIsCisJCQkgICAgICAgcC0+YWNwaV9pZCwgcC0+aWQsIHAtPmVpZCwKKwkJCSAgICAgICBwLT5mbGFncy5lbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTUFEVF9QTEFUX0lOVF9TUkM6Ci0JewotCQlzdHJ1Y3QgYWNwaV90YWJsZV9wbGF0X2ludF9zcmMgKnAgPQotCQkJKHN0cnVjdCBhY3BpX3RhYmxlX3BsYXRfaW50X3NyYyopIGhlYWRlcjsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlBMQVRfSU5UX1NSQyAoJXMgJXMgdHlwZVsweCV4XSBpZFsweCUwNHhdIGVpZFsweCV4XSBpb3NhcGljX3ZlY3RvclsweCV4XSBnbG9iYWxfaXJxWzB4JXhdXG4iLAotCQkJbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbcC0+ZmxhZ3MucG9sYXJpdHldLAotCQkJbXBzX2ludGlfZmxhZ3NfdHJpZ2dlcltwLT5mbGFncy50cmlnZ2VyXSwKLQkJCXAtPnR5cGUsIHAtPmlkLCBwLT5laWQsIHAtPmlvc2FwaWNfdmVjdG9yLCBwLT5nbG9iYWxfaXJxKTsKLQl9CisJCXsKKwkJCXN0cnVjdCBhY3BpX3RhYmxlX3BsYXRfaW50X3NyYyAqcCA9CisJCQkgICAgKHN0cnVjdCBhY3BpX3RhYmxlX3BsYXRfaW50X3NyYyAqKWhlYWRlcjsKKwkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCisJCQkgICAgICAgIlBMQVRfSU5UX1NSQyAoJXMgJXMgdHlwZVsweCV4XSBpZFsweCUwNHhdIGVpZFsweCV4XSBpb3NhcGljX3ZlY3RvclsweCV4XSBnbG9iYWxfaXJxWzB4JXhdXG4iLAorCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3AtPmZsYWdzLnBvbGFyaXR5XSwKKwkJCSAgICAgICBtcHNfaW50aV9mbGFnc190cmlnZ2VyW3AtPmZsYWdzLnRyaWdnZXJdLAorCQkJICAgICAgIHAtPnR5cGUsIHAtPmlkLCBwLT5laWQsIHAtPmlvc2FwaWNfdmVjdG9yLAorCQkJICAgICAgIHAtPmdsb2JhbF9pcnEpOworCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIkZvdW5kIHVuc3VwcG9ydGVkIE1BRFQgZW50cnkgKHR5cGUgPSAweCV4KVxuIiwKLQkJCWhlYWRlci0+dHlwZSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCSAgICAgICAiRm91bmQgdW5zdXBwb3J0ZWQgTUFEVCBlbnRyeSAodHlwZSA9IDB4JXgpXG4iLAorCQkgICAgICAgaGVhZGVyLT50eXBlKTsKIAkJYnJlYWs7CiAJfQogfQogCi0KIHN0YXRpYyBpbnQKLWFjcGlfdGFibGVfY29tcHV0ZV9jaGVja3N1bSAoCi0Jdm9pZAkJCSp0YWJsZV9wb2ludGVyLAotCXVuc2lnbmVkIGxvbmcJCWxlbmd0aCkKK2FjcGlfdGFibGVfY29tcHV0ZV9jaGVja3N1bSh2b2lkICp0YWJsZV9wb2ludGVyLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKIHsKLQl1OAkJCSpwID0gKHU4ICopIHRhYmxlX3BvaW50ZXI7Ci0JdW5zaWduZWQgbG9uZwkJcmVtYWlucyA9IGxlbmd0aDsKLQl1bnNpZ25lZCBsb25nCQlzdW0gPSAwOworCXU4ICpwID0gKHU4ICopIHRhYmxlX3BvaW50ZXI7CisJdW5zaWduZWQgbG9uZyByZW1haW5zID0gbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgc3VtID0gMDsKIAogCWlmICghcCB8fCAhbGVuZ3RoKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI0MSw5ICsyNDcsOCBAQAogICogZm9yIGFjcGlfYmxhY2tsaXN0ZWQoKSwgYWNwaV90YWJsZV9nZXRfc2R0KCkKICAqLwogaW50IF9faW5pdAotYWNwaV9nZXRfdGFibGVfaGVhZGVyX2Vhcmx5ICgKLQllbnVtIGFjcGlfdGFibGVfaWQJaWQsCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqaGVhZGVyKQorYWNwaV9nZXRfdGFibGVfaGVhZGVyX2Vhcmx5KGVudW0gYWNwaV90YWJsZV9pZCBpZCwKKwkJCSAgICBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKipoZWFkZXIpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAJZW51bSBhY3BpX3RhYmxlX2lkIHRlbXBfaWQ7CkBAIC0yNjAsNyArMjY1LDcgQEAKIAkJaWYgKHNkdF9lbnRyeVtpXS5pZCAhPSB0ZW1wX2lkKQogCQkJY29udGludWU7CiAJCSpoZWFkZXIgPSAodm9pZCAqKQotCQkJX19hY3BpX21hcF90YWJsZShzZHRfZW50cnlbaV0ucGEsIHNkdF9lbnRyeVtpXS5zaXplKTsKKwkJICAgIF9fYWNwaV9tYXBfdGFibGUoc2R0X2VudHJ5W2ldLnBhLCBzZHRfZW50cnlbaV0uc2l6ZSk7CiAJCWlmICghKmhlYWRlcikgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgJXNcbiIsCiAJCQkgICAgICAgYWNwaV90YWJsZV9zaWduYXR1cmVzW3RlbXBfaWRdKTsKQEAgLTI3NywxNCArMjgyLDE3IEBACiAKIAkvKiBNYXAgdGhlIERTRFQgaGVhZGVyIHZpYSB0aGUgcG9pbnRlciBpbiB0aGUgRkFEVCAqLwogCWlmIChpZCA9PSBBQ1BJX0RTRFQpIHsKLQkJc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICpmYWR0ID0gKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqKSAqaGVhZGVyOworCQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKmZhZHQgPQorCQkgICAgKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqKSpoZWFkZXI7CiAKIAkJaWYgKGZhZHQtPnJldmlzaW9uID09IDMgJiYgZmFkdC0+WGRzZHQpIHsKLQkJCSpoZWFkZXIgPSAodm9pZCAqKSBfX2FjcGlfbWFwX3RhYmxlKGZhZHQtPlhkc2R0LAotCQkJCQlzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCQkqaGVhZGVyID0gKHZvaWQgKilfX2FjcGlfbWFwX3RhYmxlKGZhZHQtPlhkc2R0LAorCQkJCQkJCSAgIHNpemVvZihzdHJ1Y3QKKwkJCQkJCQkJICBhY3BpX3RhYmxlX2hlYWRlcikpOwogCQl9IGVsc2UgaWYgKGZhZHQtPlYxX2RzZHQpIHsKLQkJCSpoZWFkZXIgPSAodm9pZCAqKSBfX2FjcGlfbWFwX3RhYmxlKGZhZHQtPlYxX2RzZHQsCi0JCQkJCXNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJCSpoZWFkZXIgPSAodm9pZCAqKV9fYWNwaV9tYXBfdGFibGUoZmFkdC0+VjFfZHNkdCwKKwkJCQkJCQkgICBzaXplb2Yoc3RydWN0CisJCQkJCQkJCSAgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAkJfSBlbHNlCiAJCQkqaGVhZGVyID0gTlVMTDsKIApAQCAtMjk2LDIxICszMDQsMTkgQEAKIAogCXJldHVybiAwOwogfQotCSAKIAogaW50IF9faW5pdAotYWNwaV90YWJsZV9wYXJzZV9tYWR0X2ZhbWlseSAoCi0JZW51bSBhY3BpX3RhYmxlX2lkCWlkLAotCXVuc2lnbmVkIGxvbmcJCW1hZHRfc2l6ZSwKLQlpbnQJCQllbnRyeV9pZCwKLQlhY3BpX21hZHRfZW50cnlfaGFuZGxlcgloYW5kbGVyLAotCXVuc2lnbmVkIGludAkJbWF4X2VudHJpZXMpCithY3BpX3RhYmxlX3BhcnNlX21hZHRfZmFtaWx5KGVudW0gYWNwaV90YWJsZV9pZCBpZCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBtYWR0X3NpemUsCisJCQkgICAgIGludCBlbnRyeV9pZCwKKwkJCSAgICAgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwKKwkJCSAgICAgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKQogewotCXZvaWQJCQkqbWFkdCA9IE5VTEw7Ci0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIJKmVudHJ5OwotCXVuc2lnbmVkIGludAkJY291bnQgPSAwOwotCXVuc2lnbmVkIGxvbmcJCW1hZHRfZW5kOwotCXVuc2lnbmVkIGludAkJaTsKKwl2b2lkICptYWR0ID0gTlVMTDsKKwlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqZW50cnk7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIG1hZHRfZW5kOworCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKCFoYW5kbGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMyMSw3ICszMjcsNyBAQAogCQlpZiAoc2R0X2VudHJ5W2ldLmlkICE9IGlkKQogCQkJY29udGludWU7CiAJCW1hZHQgPSAodm9pZCAqKQotCQkJX19hY3BpX21hcF90YWJsZShzZHRfZW50cnlbaV0ucGEsIHNkdF9lbnRyeVtpXS5zaXplKTsKKwkJICAgIF9fYWNwaV9tYXBfdGFibGUoc2R0X2VudHJ5W2ldLnBhLCBzZHRfZW50cnlbaV0uc2l6ZSk7CiAJCWlmICghbWFkdCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgJXNcbiIsCiAJCQkgICAgICAgYWNwaV90YWJsZV9zaWduYXR1cmVzW2lkXSk7CkBAIC0zMzYsMjEgKzM0MiwyMiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQltYWR0X2VuZCA9ICh1bnNpZ25lZCBsb25nKSBtYWR0ICsgc2R0X2VudHJ5W2ldLnNpemU7CisJbWFkdF9lbmQgPSAodW5zaWduZWQgbG9uZyltYWR0ICsgc2R0X2VudHJ5W2ldLnNpemU7CiAKIAkvKiBQYXJzZSBhbGwgZW50cmllcyBsb29raW5nIGZvciBhIG1hdGNoLiAqLwogCiAJZW50cnkgPSAoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKikKLQkJKCh1bnNpZ25lZCBsb25nKSBtYWR0ICsgbWFkdF9zaXplKTsKKwkgICAgKCh1bnNpZ25lZCBsb25nKW1hZHQgKyBtYWR0X3NpemUpOwogCi0Jd2hpbGUgKCgodW5zaWduZWQgbG9uZykgZW50cnkpICsgc2l6ZW9mKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyKSA8IG1hZHRfZW5kKSB7Ci0JCWlmIChlbnRyeS0+dHlwZSA9PSBlbnRyeV9pZCAmJgotCQkgICAgKCFtYXhfZW50cmllcyB8fCBjb3VudCsrIDwgbWF4X2VudHJpZXMpKQorCXdoaWxlICgoKHVuc2lnbmVkIGxvbmcpZW50cnkpICsgc2l6ZW9mKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyKSA8CisJICAgICAgIG1hZHRfZW5kKSB7CisJCWlmIChlbnRyeS0+dHlwZSA9PSBlbnRyeV9pZAorCQkgICAgJiYgKCFtYXhfZW50cmllcyB8fCBjb3VudCsrIDwgbWF4X2VudHJpZXMpKQogCQkJaWYgKGhhbmRsZXIoZW50cnksIG1hZHRfZW5kKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQllbnRyeSA9IChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqKQotCQkJKCh1bnNpZ25lZCBsb25nKSBlbnRyeSArIGVudHJ5LT5sZW5ndGgpOworCQkgICAgKCh1bnNpZ25lZCBsb25nKWVudHJ5ICsgZW50cnktPmxlbmd0aCk7CiAJfQogCWlmIChtYXhfZW50cmllcyAmJiBjb3VudCA+IG1heF9lbnRyaWVzKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJbJXM6MHglMDJ4XSBpZ25vcmVkICVpIGVudHJpZXMgb2YgIgpAQCAtMzYxLDI1ICszNjgsMTkgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLQogaW50IF9faW5pdAotYWNwaV90YWJsZV9wYXJzZV9tYWR0ICgKLQllbnVtIGFjcGlfbWFkdF9lbnRyeV9pZAlpZCwKLQlhY3BpX21hZHRfZW50cnlfaGFuZGxlcgloYW5kbGVyLAotCXVuc2lnbmVkIGludCBtYXhfZW50cmllcykKK2FjcGlfdGFibGVfcGFyc2VfbWFkdChlbnVtIGFjcGlfbWFkdF9lbnRyeV9pZCBpZCwKKwkJICAgICAgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKQogewotCXJldHVybiBhY3BpX3RhYmxlX3BhcnNlX21hZHRfZmFtaWx5KEFDUElfQVBJQywgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX21hZHQpLAotCQkJCQkgICAgaWQsIGhhbmRsZXIsIG1heF9lbnRyaWVzKTsKKwlyZXR1cm4gYWNwaV90YWJsZV9wYXJzZV9tYWR0X2ZhbWlseShBQ1BJX0FQSUMsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfbWFkdCksIGlkLAorCQkJCQkgICAgaGFuZGxlciwgbWF4X2VudHJpZXMpOwogfQogCi0KLWludCBfX2luaXQKLWFjcGlfdGFibGVfcGFyc2UgKAotCWVudW0gYWNwaV90YWJsZV9pZAlpZCwKLQlhY3BpX3RhYmxlX2hhbmRsZXIJaGFuZGxlcikKK2ludCBfX2luaXQgYWNwaV90YWJsZV9wYXJzZShlbnVtIGFjcGlfdGFibGVfaWQgaWQsIGFjcGlfdGFibGVfaGFuZGxlciBoYW5kbGVyKQogewotCWludAkJCWNvdW50ID0gMDsKLQl1bnNpZ25lZCBpbnQJCWkgPSAwOworCWludCBjb3VudCA9IDA7CisJdW5zaWduZWQgaW50IGkgPSAwOwogCiAJaWYgKCFoYW5kbGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM5MiwyMCArMzkzLDE4IEBACiAJCQloYW5kbGVyKHNkdF9lbnRyeVtpXS5wYSwgc2R0X2VudHJ5W2ldLnNpemUpOwogCiAJCWVsc2UKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICIlZCBkdXBsaWNhdGUgJXMgdGFibGUgaWdub3JlZC5cbiIsCi0JCQkJY291bnQsIGFjcGlfdGFibGVfc2lnbmF0dXJlc1tpZF0pOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJCSAgICAgICAiJWQgZHVwbGljYXRlICVzIHRhYmxlIGlnbm9yZWQuXG4iLCBjb3VudCwKKwkJCSAgICAgICBhY3BpX3RhYmxlX3NpZ25hdHVyZXNbaWRdKTsKIAl9CiAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQKLWFjcGlfdGFibGVfZ2V0X3NkdCAoCi0Jc3RydWN0IGFjcGlfdGFibGVfcnNkcAkqcnNkcCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfdGFibGVfZ2V0X3NkdChzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICpyc2RwKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQJCWksIGlkID0gMDsKKwl1bnNpZ25lZCBpbnQgaSwgaWQgPSAwOwogCiAJaWYgKCFyc2RwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQxMywyNCArNDEyLDI1IEBACiAJLyogRmlyc3QgY2hlY2sgWFNEVCAoYnV0IG9ubHkgb24gQUNQSSAyLjAtY29tcGF0aWJsZSBzeXN0ZW1zKSAqLwogCiAJaWYgKChyc2RwLT5yZXZpc2lvbiA+PSAyKSAmJgotCQkoKChzdHJ1Y3QgYWNwaTIwX3RhYmxlX3JzZHAqKXJzZHApLT54c2R0X2FkZHJlc3MpKSB7Ci0JCQkKLQkJc3RydWN0IGFjcGlfdGFibGVfeHNkdAkqbWFwcGVkX3hzZHQgPSBOVUxMOworCSAgICAoKChzdHJ1Y3QgYWNwaTIwX3RhYmxlX3JzZHAgKilyc2RwKS0+eHNkdF9hZGRyZXNzKSkgewogCi0JCXNkdF9wYSA9ICgoc3RydWN0IGFjcGkyMF90YWJsZV9yc2RwKilyc2RwKS0+eHNkdF9hZGRyZXNzOworCQlzdHJ1Y3QgYWNwaV90YWJsZV94c2R0ICptYXBwZWRfeHNkdCA9IE5VTEw7CisKKwkJc2R0X3BhID0gKChzdHJ1Y3QgYWNwaTIwX3RhYmxlX3JzZHAgKilyc2RwKS0+eHNkdF9hZGRyZXNzOwogCiAJCS8qIG1hcCBpbiBqdXN0IHRoZSBoZWFkZXIgKi8KIAkJaGVhZGVyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKQotCQkJX19hY3BpX21hcF90YWJsZShzZHRfcGEsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJICAgIF9fYWNwaV9tYXBfdGFibGUoc2R0X3BhLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CiAKIAkJaWYgKCFoZWFkZXIpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIFhTRFQgaGVhZGVyXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCQkgICAgICAgIlVuYWJsZSB0byBtYXAgWFNEVCBoZWFkZXJcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAogCQkvKiByZW1hcCBpbiB0aGUgZW50aXJlIHRhYmxlIGJlZm9yZSBwcm9jZXNzaW5nICovCiAJCW1hcHBlZF94c2R0ID0gKHN0cnVjdCBhY3BpX3RhYmxlX3hzZHQgKikKLQkJCV9fYWNwaV9tYXBfdGFibGUoc2R0X3BhLCBoZWFkZXItPmxlbmd0aCk7CisJCSAgICBfX2FjcGlfbWFwX3RhYmxlKHNkdF9wYSwgaGVhZGVyLT5sZW5ndGgpOwogCQlpZiAoIW1hcHBlZF94c2R0KSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCBYU0RUXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwpAQCAtNDM4LDcgKzQzOCw4IEBACiAJCWhlYWRlciA9ICZtYXBwZWRfeHNkdC0+aGVhZGVyOwogCiAJCWlmIChzdHJuY21wKGhlYWRlci0+c2lnbmF0dXJlLCAiWFNEVCIsIDQpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiWFNEVCBzaWduYXR1cmUgaW5jb3JyZWN0XG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCQkgICAgICAgIlhTRFQgc2lnbmF0dXJlIGluY29ycmVjdFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCkBAIC00NDcsMzYgKzQ0OCwzOSBAQAogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAotCQlzZHRfY291bnQgPSAoaGVhZGVyLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgPj4gMzsKKwkJc2R0X2NvdW50ID0KKwkJICAgIChoZWFkZXItPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSA+PiAzOwogCQlpZiAoc2R0X2NvdW50ID4gQUNQSV9NQVhfVEFCTEVTKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVHJ1bmNhdGVkICVsdSBYU0RUIGVudHJpZXNcbiIsCi0JCQkJKHNkdF9jb3VudCAtIEFDUElfTUFYX1RBQkxFUykpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJCSAgICAgICAiVHJ1bmNhdGVkICVsdSBYU0RUIGVudHJpZXNcbiIsCisJCQkgICAgICAgKHNkdF9jb3VudCAtIEFDUElfTUFYX1RBQkxFUykpOwogCQkJc2R0X2NvdW50ID0gQUNQSV9NQVhfVEFCTEVTOwogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IHNkdF9jb3VudDsgaSsrKQotCQkJc2R0X2VudHJ5W2ldLnBhID0gKHVuc2lnbmVkIGxvbmcpIG1hcHBlZF94c2R0LT5lbnRyeVtpXTsKKwkJCXNkdF9lbnRyeVtpXS5wYSA9ICh1bnNpZ25lZCBsb25nKW1hcHBlZF94c2R0LT5lbnRyeVtpXTsKIAl9CiAKIAkvKiBUaGVuIGNoZWNrIFJTRFQgKi8KIAogCWVsc2UgaWYgKHJzZHAtPnJzZHRfYWRkcmVzcykgewogCi0JCXN0cnVjdCBhY3BpX3RhYmxlX3JzZHQJKm1hcHBlZF9yc2R0ID0gTlVMTDsKKwkJc3RydWN0IGFjcGlfdGFibGVfcnNkdCAqbWFwcGVkX3JzZHQgPSBOVUxMOwogCiAJCXNkdF9wYSA9IHJzZHAtPnJzZHRfYWRkcmVzczsKIAogCQkvKiBtYXAgaW4ganVzdCB0aGUgaGVhZGVyICovCiAJCWhlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikKLQkJCV9fYWNwaV9tYXBfdGFibGUoc2R0X3BhLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCSAgICBfX2FjcGlfbWFwX3RhYmxlKHNkdF9wYSwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwogCQlpZiAoIWhlYWRlcikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgUlNEVCBoZWFkZXJcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJCSAgICAgICAiVW5hYmxlIHRvIG1hcCBSU0RUIGhlYWRlclxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCiAJCS8qIHJlbWFwIGluIHRoZSBlbnRpcmUgdGFibGUgYmVmb3JlIHByb2Nlc3NpbmcgKi8KIAkJbWFwcGVkX3JzZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfcnNkdCAqKQotCQkJX19hY3BpX21hcF90YWJsZShzZHRfcGEsIGhlYWRlci0+bGVuZ3RoKTsKKwkJICAgIF9fYWNwaV9tYXBfdGFibGUoc2R0X3BhLCBoZWFkZXItPmxlbmd0aCk7CiAJCWlmICghbWFwcGVkX3JzZHQpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIFJTRFRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CkBAIC00ODQsNyArNDg4LDggQEAKIAkJaGVhZGVyID0gJm1hcHBlZF9yc2R0LT5oZWFkZXI7CiAKIAkJaWYgKHN0cm5jbXAoaGVhZGVyLT5zaWduYXR1cmUsICJSU0RUIiwgNCkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJSU0RUIHNpZ25hdHVyZSBpbmNvcnJlY3RcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJCSAgICAgICAiUlNEVCBzaWduYXR1cmUgaW5jb3JyZWN0XG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKQEAgLTQ5MywxOSArNDk4LDIyIEBACiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCi0JCXNkdF9jb3VudCA9IChoZWFkZXItPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSA+PiAyOworCQlzZHRfY291bnQgPQorCQkgICAgKGhlYWRlci0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpID4+IDI7CiAJCWlmIChzZHRfY291bnQgPiBBQ1BJX01BWF9UQUJMRVMpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJUcnVuY2F0ZWQgJWx1IFJTRFQgZW50cmllc1xuIiwKLQkJCQkoc2R0X2NvdW50IC0gQUNQSV9NQVhfVEFCTEVTKSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkJICAgICAgICJUcnVuY2F0ZWQgJWx1IFJTRFQgZW50cmllc1xuIiwKKwkJCSAgICAgICAoc2R0X2NvdW50IC0gQUNQSV9NQVhfVEFCTEVTKSk7CiAJCQlzZHRfY291bnQgPSBBQ1BJX01BWF9UQUJMRVM7CiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgc2R0X2NvdW50OyBpKyspCi0JCQlzZHRfZW50cnlbaV0ucGEgPSAodW5zaWduZWQgbG9uZykgbWFwcGVkX3JzZHQtPmVudHJ5W2ldOworCQkJc2R0X2VudHJ5W2ldLnBhID0gKHVuc2lnbmVkIGxvbmcpbWFwcGVkX3JzZHQtPmVudHJ5W2ldOwogCX0KIAogCWVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiTm8gU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlIChSU0RUL1hTRFQpIHNwZWNpZmllZCBpbiBSU0RQXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJICAgICAgICJObyBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKFJTRFQvWFNEVCkgc3BlY2lmaWVkIGluIFJTRFBcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTUxNSwxOCArNTIzLDE3IEBACiAKIAkJLyogbWFwIGluIGp1c3QgdGhlIGhlYWRlciAqLwogCQloZWFkZXIgPSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICopCi0JCQlfX2FjcGlfbWFwX3RhYmxlKHNkdF9lbnRyeVtpXS5wYSwKLQkJCQlzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCSAgICBfX2FjcGlfbWFwX3RhYmxlKHNkdF9lbnRyeVtpXS5wYSwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAkJaWYgKCFoZWFkZXIpCiAJCQljb250aW51ZTsKIAogCQkvKiByZW1hcCBpbiB0aGUgZW50aXJlIHRhYmxlIGJlZm9yZSBwcm9jZXNzaW5nICovCiAJCWhlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikKLQkJCV9fYWNwaV9tYXBfdGFibGUoc2R0X2VudHJ5W2ldLnBhLAotCQkJCWhlYWRlci0+bGVuZ3RoKTsKKwkJICAgIF9fYWNwaV9tYXBfdGFibGUoc2R0X2VudHJ5W2ldLnBhLCBoZWFkZXItPmxlbmd0aCk7CiAJCWlmICghaGVhZGVyKQogCQkJY29udGludWU7Ci0JICAgICAgICAgICAgICAgCisKIAkJYWNwaV90YWJsZV9wcmludChoZWFkZXIsIHNkdF9lbnRyeVtpXS5wYSk7CiAKIAkJaWYgKGFjcGlfdGFibGVfY29tcHV0ZV9jaGVja3N1bShoZWFkZXIsIGhlYWRlci0+bGVuZ3RoKSkgewpAQCAtNTM3LDkgKzU0NCw5IEBACiAJCXNkdF9lbnRyeVtpXS5zaXplID0gaGVhZGVyLT5sZW5ndGg7CiAKIAkJZm9yIChpZCA9IDA7IGlkIDwgQUNQSV9UQUJMRV9DT1VOVDsgaWQrKykgewotCQkJaWYgKCFzdHJuY21wKChjaGFyICopICZoZWFkZXItPnNpZ25hdHVyZSwKLQkJCQlhY3BpX3RhYmxlX3NpZ25hdHVyZXNbaWRdLAotCQkJCXNpemVvZihoZWFkZXItPnNpZ25hdHVyZSkpKSB7CisJCQlpZiAoIXN0cm5jbXAoKGNoYXIgKikmaGVhZGVyLT5zaWduYXR1cmUsCisJCQkJICAgICBhY3BpX3RhYmxlX3NpZ25hdHVyZXNbaWRdLAorCQkJCSAgICAgc2l6ZW9mKGhlYWRlci0+c2lnbmF0dXJlKSkpIHsKIAkJCQlzZHRfZW50cnlbaV0uaWQgPSBpZDsKIAkJCX0KIAkJfQpAQCAtNTUxLDcgKzU1OCw3IEBACiAJICogYWdhaW5zdC4gVW5mb3J0dW5hdGVseSwgd2UgZG9uJ3Qga25vdyB0aGUgcGh5c19hZGRyLCBzbyBqdXN0CiAJICogcHJpbnQgMC4gTWF5YmUgbm8gb25lIHdpbGwgbm90aWNlLgogCSAqLwotCWlmKCFhY3BpX2dldF90YWJsZV9oZWFkZXJfZWFybHkoQUNQSV9EU0RULCAmaGVhZGVyKSkKKwlpZiAoIWFjcGlfZ2V0X3RhYmxlX2hlYWRlcl9lYXJseShBQ1BJX0RTRFQsICZoZWFkZXIpKQogCQlhY3BpX3RhYmxlX3ByaW50KGhlYWRlciwgMCk7CiAKIAlyZXR1cm4gMDsKQEAgLTU2NiwxMiArNTczLDExIEBACiAgKiByZXN1bHQ6IHNkdF9lbnRyeVtdIGlzIGluaXRpYWxpemVkCiAgKi8KIAotaW50IF9faW5pdAotYWNwaV90YWJsZV9pbml0ICh2b2lkKQoraW50IF9faW5pdCBhY3BpX3RhYmxlX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwCSpyc2RwID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nCQlyc2RwX3BoeXMgPSAwOwotCWludAkJCXJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqcnNkcCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyByc2RwX3BoeXMgPSAwOworCWludCByZXN1bHQgPSAwOwogCiAJLyogTG9jYXRlIGFuZCBtYXAgdGhlIFJvb3QgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlIChSU0RQKSAqLwogCkBAIC01ODEsMTkgKzU4NywyNSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlyc2RwID0gKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHAgKikgX192YShyc2RwX3BoeXMpOworCXJzZHAgPSAoc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqKV9fdmEocnNkcF9waHlzKTsKIAlpZiAoIXJzZHApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgUlNEUFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAiUlNEUCAodiUzLjNkICU2LjZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIEAgMHglcFxuIiwKLQkJcnNkcC0+cmV2aXNpb24sIHJzZHAtPm9lbV9pZCwgKHZvaWQgKikgcnNkcF9waHlzKTsKKwlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVgKKwkgICAgICAgIlJTRFAgKHYlMy4zZCAlNi42cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBAIDB4JXBcbiIsCisJICAgICAgIHJzZHAtPnJldmlzaW9uLCByc2RwLT5vZW1faWQsICh2b2lkICopcnNkcF9waHlzKTsKIAogCWlmIChyc2RwLT5yZXZpc2lvbiA8IDIpCi0JCXJlc3VsdCA9IGFjcGlfdGFibGVfY29tcHV0ZV9jaGVja3N1bShyc2RwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfcnNkcCkpOworCQlyZXN1bHQgPQorCQkgICAgYWNwaV90YWJsZV9jb21wdXRlX2NoZWNrc3VtKHJzZHAsCisJCQkJCQlzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfcnNkcCkpOwogCWVsc2UKLQkJcmVzdWx0ID0gYWNwaV90YWJsZV9jb21wdXRlX2NoZWNrc3VtKHJzZHAsICgoc3RydWN0IGFjcGkyMF90YWJsZV9yc2RwICopcnNkcCktPmxlbmd0aCk7CisJCXJlc3VsdCA9CisJCSAgICBhY3BpX3RhYmxlX2NvbXB1dGVfY2hlY2tzdW0ocnNkcCwKKwkJCQkJCSgoc3RydWN0IGFjcGkyMF90YWJsZV9yc2RwICopCisJCQkJCQkgcnNkcCktPmxlbmd0aCk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgPj4+IEVSUk9SOiBJbnZhbGlkIGNoZWNrc3VtXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJjb252cnQuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJjb252cnQuYwppbmRleCA5MmUwYzMxLi5hMDM5MzkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiY29udnJ0LmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmNvbnZydC5jCkBAIC00NiwyOCArNDYsMjIgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJ0YmNvbnZydCIpCitBQ1BJX01PRFVMRV9OQU1FKCJ0YmNvbnZydCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkCithY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqbmV3X2dhc19zdHJ1Y3QsCisJCQkgICAgIHU4IHJlZ2lzdGVyX2JpdF93aWR0aCwKKwkJCSAgICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MpOwogCiBzdGF0aWMgdm9pZAotYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICAqbmV3X2dhc19zdHJ1Y3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9iaXRfd2lkdGgsCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzKTsKK2FjcGlfdGJfY29udmVydF9mYWR0MShzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKmxvY2FsX2ZhZHQsCisJCSAgICAgIHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MSAqb3JpZ2luYWxfZmFkdCk7CiAKIHN0YXRpYyB2b2lkCi1hY3BpX3RiX2NvbnZlcnRfZmFkdDEgKAotCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAgICAqbG9jYWxfZmFkdCwKLQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEgICAgKm9yaWdpbmFsX2ZhZHQpOwotCi1zdGF0aWMgdm9pZAotYWNwaV90Yl9jb252ZXJ0X2ZhZHQyICgKLQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgICAgKmxvY2FsX2ZhZHQsCi0Jc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICAgICpvcmlnaW5hbF9mYWR0KTsKLQorYWNwaV90Yl9jb252ZXJ0X2ZhZHQyKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqbG9jYWxfZmFkdCwKKwkJICAgICAgc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICpvcmlnaW5hbF9mYWR0KTsKIAogdTggYWNwaV9mYWR0X2lzX3YxOwogRVhQT1JUX1NZTUJPTChhY3BpX2ZhZHRfaXNfdjEpOwpAQCAtODcsMjEgKzgxLDE5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB1MzIKLWFjcGlfdGJfZ2V0X3RhYmxlX2NvdW50ICgKLQlzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yICAgICAgICAgICpSU0RQLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKlJTRFQpCithY3BpX3RiX2dldF90YWJsZV9jb3VudChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yICpSU0RQLAorCQkJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpSU0RUKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9zaXplOworCXUzMiBwb2ludGVyX3NpemU7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOworCS8qIFJTRFQgcG9pbnRlcnMgYXJlIDMyIGJpdHMsIFhTRFQgcG9pbnRlcnMgYXJlIDY0IGJpdHMgKi8KIAotCi0JaWYgKFJTRFAtPnJldmlzaW9uIDwgMikgewotCQlwb2ludGVyX3NpemUgPSBzaXplb2YgKHUzMik7Ci0JfQotCWVsc2UgewotCQlwb2ludGVyX3NpemUgPSBzaXplb2YgKHU2NCk7CisJaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfdHlwZSA9PSBBQ1BJX1RBQkxFX1RZUEVfUlNEVCkgeworCQlwb2ludGVyX3NpemUgPSBzaXplb2YodTMyKTsKKwl9IGVsc2UgeworCQlwb2ludGVyX3NpemUgPSBzaXplb2YodTY0KTsKIAl9CiAKIAkvKgpAQCAtMTEwLDEwICsxMDIsMTAgQEAKIAkgKiBwb2ludGVycyBjb250YWluZWQgd2l0aGluIHRoZSBSU0RUL1hTRFQuICBUaGUgc2l6ZSBvZiB0aGUgcG9pbnRlcnMKIAkgKiBpcyBhcmNoaXRlY3R1cmUtZGVwZW5kZW50LgogCSAqLwotCXJldHVybiAoKFJTRFQtPmxlbmd0aCAtIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgLyBwb2ludGVyX3NpemUpOworCXJldHVybiAoKFJTRFQtPmxlbmd0aCAtCisJCSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgLyBwb2ludGVyX3NpemUpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfY29udmVydF90b194c2R0CkBAIC0xMjYsNjQgKzExOCw2NSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2NvbnZlcnRfdG9feHNkdCAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbykKK2FjcGlfc3RhdHVzIGFjcGlfdGJfY29udmVydF90b194c2R0KHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pCiB7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9zaXplOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlYU0RUX0RFU0NSSVBUT1IgICAgICAgICAqbmV3X3RhYmxlOworCWFjcGlfc2l6ZSB0YWJsZV9zaXplOworCXUzMiBpOworCVhTRFRfREVTQ1JJUFRPUiAqbmV3X3RhYmxlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyogQ29tcHV0ZSBzaXplIG9mIHRoZSBjb252ZXJ0ZWQgWFNEVCAqLwogCi0JdGFibGVfc2l6ZSA9ICgoYWNwaV9zaXplKSBhY3BpX2dibF9yc2R0X3RhYmxlX2NvdW50ICogc2l6ZW9mICh1NjQpKSArCi0JCQkgIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKTsKKwl0YWJsZV9zaXplID0gKChhY3BpX3NpemUpIGFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQgKiBzaXplb2YodTY0KSkgKworCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKTsKIAogCS8qIEFsbG9jYXRlIGFuIFhTRFQgKi8KIAotCW5ld190YWJsZSA9IEFDUElfTUVNX0NBTExPQ0FURSAodGFibGVfc2l6ZSk7CisJbmV3X3RhYmxlID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHRhYmxlX3NpemUpOwogCWlmICghbmV3X3RhYmxlKSB7CiAJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBDb3B5IHRoZSBoZWFkZXIgYW5kIHNldCB0aGUgbGVuZ3RoICovCiAKLQlBQ1BJX01FTUNQWSAobmV3X3RhYmxlLCB0YWJsZV9pbmZvLT5wb2ludGVyLCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCUFDUElfTUVNQ1BZKG5ld190YWJsZSwgdGFibGVfaW5mby0+cG9pbnRlciwKKwkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAluZXdfdGFibGUtPmxlbmd0aCA9ICh1MzIpIHRhYmxlX3NpemU7CiAKIAkvKiBDb3B5IHRoZSB0YWJsZSBwb2ludGVycyAqLwogCiAJZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQ7IGkrKykgewotCQlpZiAoYWNwaV9nYmxfUlNEUC0+cmV2aXNpb24gPCAyKSB7Ci0JCQlBQ1BJX1NUT1JFX0FERFJFU1MgKG5ld190YWJsZS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldLAotCQkJCShBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yX3JldjEsCi0JCQkJCXRhYmxlX2luZm8tPnBvaW50ZXIpKS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldKTsKLQkJfQotCQllbHNlIHsKKwkJLyogUlNEVCBwb2ludGVycyBhcmUgMzIgYml0cywgWFNEVCBwb2ludGVycyBhcmUgNjQgYml0cyAqLworCisJCWlmIChhY3BpX2dibF9yb290X3RhYmxlX3R5cGUgPT0gQUNQSV9UQUJMRV9UWVBFX1JTRFQpIHsKKwkJCUFDUElfU1RPUkVfQUREUkVTUyhuZXdfdGFibGUtPnRhYmxlX29mZnNldF9lbnRyeVtpXSwKKwkJCQkJICAgKEFDUElfQ0FTVF9QVFIKKwkJCQkJICAgIChzdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yX3JldjEsCisJCQkJCSAgICAgdGFibGVfaW5mby0+cG9pbnRlcikpLT4KKwkJCQkJICAgdGFibGVfb2Zmc2V0X2VudHJ5W2ldKTsKKwkJfSBlbHNlIHsKIAkJCW5ld190YWJsZS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldID0KLQkJCQkoQUNQSV9DQVNUX1BUUiAoWFNEVF9ERVNDUklQVE9SLAotCQkJCQl0YWJsZV9pbmZvLT5wb2ludGVyKSktPnRhYmxlX29mZnNldF9lbnRyeVtpXTsKKwkJCSAgICAoQUNQSV9DQVNUX1BUUihYU0RUX0RFU0NSSVBUT1IsCisJCQkJCSAgIHRhYmxlX2luZm8tPnBvaW50ZXIpKS0+CisJCQkgICAgdGFibGVfb2Zmc2V0X2VudHJ5W2ldOwogCQl9CiAJfQogCiAJLyogRGVsZXRlIHRoZSBvcmlnaW5hbCB0YWJsZSAoZWl0aGVyIG1hcHBlZCBvciBpbiBhIGJ1ZmZlcikgKi8KIAotCWFjcGlfdGJfZGVsZXRlX3NpbmdsZV90YWJsZSAodGFibGVfaW5mbyk7CisJYWNwaV90Yl9kZWxldGVfc2luZ2xlX3RhYmxlKHRhYmxlX2luZm8pOwogCiAJLyogUG9pbnQgdGhlIHRhYmxlIGRlc2NyaXB0b3IgdG8gdGhlIG5ldyB0YWJsZSAqLwogCi0JdGFibGVfaW5mby0+cG9pbnRlciAgICAgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsIG5ld190YWJsZSk7Ci0JdGFibGVfaW5mby0+bGVuZ3RoICAgICAgPSB0YWJsZV9zaXplOwotCXRhYmxlX2luZm8tPmFsbG9jYXRpb24gID0gQUNQSV9NRU1fQUxMT0NBVEVEOworCXRhYmxlX2luZm8tPnBvaW50ZXIgPQorCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwgbmV3X3RhYmxlKTsKKwl0YWJsZV9pbmZvLT5sZW5ndGggPSB0YWJsZV9zaXplOworCXRhYmxlX2luZm8tPmFsbG9jYXRpb24gPSBBQ1BJX01FTV9BTExPQ0FURUQ7CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzCkBAIC0xOTksMjEgKzE5MiwxOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKAotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgKm5ld19nYXNfc3RydWN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfYml0X3dpZHRoLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcykKK2FjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3Moc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpuZXdfZ2FzX3N0cnVjdCwKKwkJCSAgICAgdTggcmVnaXN0ZXJfYml0X3dpZHRoLAorCQkJICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcykKIHsKIAotCUFDUElfU1RPUkVfQUREUkVTUyAobmV3X2dhc19zdHJ1Y3QtPmFkZHJlc3MsIGFkZHJlc3MpOworCUFDUElfU1RPUkVfQUREUkVTUyhuZXdfZ2FzX3N0cnVjdC0+YWRkcmVzcywgYWRkcmVzcyk7CiAKIAluZXdfZ2FzX3N0cnVjdC0+YWRkcmVzc19zcGFjZV9pZCA9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTzsKIAluZXdfZ2FzX3N0cnVjdC0+cmVnaXN0ZXJfYml0X3dpZHRoID0gcmVnaXN0ZXJfYml0X3dpZHRoOwogCW5ld19nYXNfc3RydWN0LT5yZWdpc3Rlcl9iaXRfb2Zmc2V0ID0gMDsKLQluZXdfZ2FzX3N0cnVjdC0+YWNjZXNzX3dpZHRoICAgID0gMDsKKwluZXdfZ2FzX3N0cnVjdC0+YWNjZXNzX3dpZHRoID0gMDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2NvbnZlcnRfZmFkdDEKQEAgLTIyOCw5ICsyMTksOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLWFjcGlfdGJfY29udmVydF9mYWR0MSAoCi0Jc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICAgICpsb2NhbF9mYWR0LAotCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MSAgICAqb3JpZ2luYWxfZmFkdCkKK2FjcGlfdGJfY29udmVydF9mYWR0MShzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKmxvY2FsX2ZhZHQsCisJCSAgICAgIHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MSAqb3JpZ2luYWxfZmFkdCkKIHsKIAogCS8qIEFDUEkgMS4wIEZBQ1MgKi8KQEAgLTI0MywxMiArMjMzLDE0IEBACiAJICogVGhlIDIuMCB0YWJsZSBpcyBhbiBleHRlbnNpb24gb2YgdGhlIDEuMCB0YWJsZSwgc28gdGhlIGVudGlyZSAxLjAKIAkgKiB0YWJsZSBjYW4gYmUgY29waWVkIGZpcnN0LCB0aGVuIGV4cGFuZCBzb21lIGZpZWxkcyB0byA2NCBiaXRzLgogCSAqLwotCUFDUElfTUVNQ1BZIChsb2NhbF9mYWR0LCBvcmlnaW5hbF9mYWR0LCBzaXplb2YgKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MSkpOworCUFDUElfTUVNQ1BZKGxvY2FsX2ZhZHQsIG9yaWdpbmFsX2ZhZHQsCisJCSAgICBzaXplb2Yoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYxKSk7CiAKIAkvKiBDb252ZXJ0IHRhYmxlIHBvaW50ZXJzIHRvIDY0LWJpdCBmaWVsZHMgKi8KIAotCUFDUElfU1RPUkVfQUREUkVTUyAobG9jYWxfZmFkdC0+eGZpcm13YXJlX2N0cmwsIGxvY2FsX2ZhZHQtPlYxX2Zpcm13YXJlX2N0cmwpOwotCUFDUElfU1RPUkVfQUREUkVTUyAobG9jYWxfZmFkdC0+WGRzZHQsIGxvY2FsX2ZhZHQtPlYxX2RzZHQpOworCUFDUElfU1RPUkVfQUREUkVTUyhsb2NhbF9mYWR0LT54ZmlybXdhcmVfY3RybCwKKwkJCSAgIGxvY2FsX2ZhZHQtPlYxX2Zpcm13YXJlX2N0cmwpOworCUFDUElfU1RPUkVfQUREUkVTUyhsb2NhbF9mYWR0LT5YZHNkdCwgbG9jYWxfZmFkdC0+VjFfZHNkdCk7CiAKIAkvKgogCSAqIFN5c3RlbSBJbnRlcnJ1cHQgTW9kZWwgaXNuJ3QgdXNlZCBpbiBBQ1BJIDIuMApAQCAtMjgzLDE3ICsyNzUsMTcgQEAKIAkgKiBJdCBwcmltYXJpbHkgYWRkcyB0aGUgRkFEVCByZXNldCBtZWNoYW5pc20uCiAJICovCiAJaWYgKChvcmlnaW5hbF9mYWR0LT5yZXZpc2lvbiA9PSAyKSAmJgotCQkob3JpZ2luYWxfZmFkdC0+bGVuZ3RoID09IHNpemVvZiAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyX21pbnVzKSkpIHsKKwkgICAgKG9yaWdpbmFsX2ZhZHQtPmxlbmd0aCA9PQorCSAgICAgc2l6ZW9mKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2Ml9taW51cykpKSB7CiAJCS8qCiAJCSAqIEdyYWIgdGhlIGVudGlyZSBnZW5lcmljIGFkZHJlc3Mgc3RydWN0LCBwbHVzIHRoZSAxLWJ5dGUgcmVzZXQgdmFsdWUKIAkJICogdGhhdCBpbW1lZGlhdGVseSBmb2xsb3dzLgogCQkgKi8KLQkJQUNQSV9NRU1DUFkgKCZsb2NhbF9mYWR0LT5yZXNldF9yZWdpc3RlciwKLQkJCSYoQUNQSV9DQVNUX1BUUiAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyX21pbnVzLAotCQkJCW9yaWdpbmFsX2ZhZHQpKS0+cmVzZXRfcmVnaXN0ZXIsCi0gIAkJCXNpemVvZiAoc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzKSArIDEpOwotCX0KLQllbHNlIHsKKwkJQUNQSV9NRU1DUFkoJmxvY2FsX2ZhZHQtPnJlc2V0X3JlZ2lzdGVyLAorCQkJICAgICYoQUNQSV9DQVNUX1BUUihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjJfbWludXMsCisJCQkJCSAgICBvcmlnaW5hbF9mYWR0KSktPnJlc2V0X3JlZ2lzdGVyLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MpICsgMSk7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogU2luY2UgdGhlcmUgaXNuJ3QgYW55IGVxdWl2YWxlbmNlIGluIDEuMCBhbmQgc2luY2UgaXQgaXMgaGlnaGx5CiAJCSAqIGxpa2VseSB0aGF0IGEgMS4wIHN5c3RlbSBoYXMgbGVnYWN5IHN1cHBvcnQuCkBAIC0zMDQsNDMgKzI5Niw2MCBAQAogCS8qCiAJICogQ29udmVydCB0aGUgVjEuMCBibG9jayBhZGRyZXNzZXMgdG8gVjIuMCBHQVMgc3RydWN0dXJlcwogCSAqLwotCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLCBsb2NhbF9mYWR0LT5wbTFfZXZ0X2xlbiwKLQkJCSAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgICBsb2NhbF9mYWR0LT5WMV9wbTFhX2V2dF9ibGspOwotCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLCBsb2NhbF9mYWR0LT5wbTFfZXZ0X2xlbiwKLQkJCSAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgICBsb2NhbF9mYWR0LT5WMV9wbTFiX2V2dF9ibGspOwotCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0xYV9jbnRfYmxrLCBsb2NhbF9mYWR0LT5wbTFfY250X2xlbiwKLQkJCSAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgICBsb2NhbF9mYWR0LT5WMV9wbTFhX2NudF9ibGspOwotCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0xYl9jbnRfYmxrLCBsb2NhbF9mYWR0LT5wbTFfY250X2xlbiwKLQkJCSAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgICBsb2NhbF9mYWR0LT5WMV9wbTFiX2NudF9ibGspOwotCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0yX2NudF9ibGssIGxvY2FsX2ZhZHQtPnBtMl9jbnRfbGVuLAotCQkJICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAgIGxvY2FsX2ZhZHQtPlYxX3BtMl9jbnRfYmxrKTsKLQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eHBtX3Rtcl9ibGssIGxvY2FsX2ZhZHQtPnBtX3RtX2xlbiwKLQkJCSAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgICBsb2NhbF9mYWR0LT5WMV9wbV90bXJfYmxrKTsKLQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eGdwZTBfYmxrLCAwLAotCQkJICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAgIGxvY2FsX2ZhZHQtPlYxX2dwZTBfYmxrKTsKLQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eGdwZTFfYmxrLCAwLAotCQkJICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAgIGxvY2FsX2ZhZHQtPlYxX2dwZTFfYmxrKTsKKwlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLAorCQkJCSAgICAgbG9jYWxfZmFkdC0+cG0xX2V2dF9sZW4sCisJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT4KKwkJCQkgICAgIFYxX3BtMWFfZXZ0X2Jsayk7CisJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2JsaywKKwkJCQkgICAgIGxvY2FsX2ZhZHQtPnBtMV9ldnRfbGVuLAorCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+CisJCQkJICAgICBWMV9wbTFiX2V2dF9ibGspOworCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmxvY2FsX2ZhZHQtPnhwbTFhX2NudF9ibGssCisJCQkJICAgICBsb2NhbF9mYWR0LT5wbTFfY250X2xlbiwKKwkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPgorCQkJCSAgICAgVjFfcG0xYV9jbnRfYmxrKTsKKwlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0xYl9jbnRfYmxrLAorCQkJCSAgICAgbG9jYWxfZmFkdC0+cG0xX2NudF9sZW4sCisJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT4KKwkJCQkgICAgIFYxX3BtMWJfY250X2Jsayk7CisJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eHBtMl9jbnRfYmxrLAorCQkJCSAgICAgbG9jYWxfZmFkdC0+cG0yX2NudF9sZW4sCisJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT4KKwkJCQkgICAgIFYxX3BtMl9jbnRfYmxrKTsKKwlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG1fdG1yX2JsaywKKwkJCQkgICAgIGxvY2FsX2ZhZHQtPnBtX3RtX2xlbiwKKwkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPgorCQkJCSAgICAgVjFfcG1fdG1yX2Jsayk7CisJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eGdwZTBfYmxrLCAwLAorCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+CisJCQkJICAgICBWMV9ncGUwX2Jsayk7CisJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eGdwZTFfYmxrLCAwLAorCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+CisJCQkJICAgICBWMV9ncGUxX2Jsayk7CiAKIAkvKiBDcmVhdGUgc2VwYXJhdGUgR0FTIHN0cnVjdHMgZm9yIHRoZSBQTTEgRW5hYmxlIHJlZ2lzdGVycyAqLwogCi0JYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmFjcGlfZ2JsX3hwbTFhX2VuYWJsZSwKLQkJICh1OCkgQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pLAotCQkgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCShsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3MgKwotCQkJQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pKSk7CisJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmYWNwaV9nYmxfeHBtMWFfZW5hYmxlLAorCQkJCSAgICAgKHU4KSBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQtPgorCQkJCQkJICAgICBwbTFfZXZ0X2xlbiksCisJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCSAgICAgKGxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcyArCisJCQkJICAgICAgQUNQSV9ESVZfMihhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikpKTsKIAogCS8qIFBNMUIgaXMgb3B0aW9uYWw7IGxlYXZlIG51bGwgaWYgbm90IHByZXNlbnQgKi8KIAogCWlmIChsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3MpIHsKLQkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmFjcGlfZ2JsX3hwbTFiX2VuYWJsZSwKLQkJCSAodTgpIEFDUElfRElWXzIgKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSwKLQkJCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQotCQkJCShsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3MgKwotCQkJCUFDUElfRElWXzIgKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSkpOworCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZhY3BpX2dibF94cG0xYl9lbmFibGUsCisJCQkJCSAgICAgKHU4KSBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQtPgorCQkJCQkJCSAgICAgcG0xX2V2dF9sZW4pLAorCQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCSAgICAgKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuCisJCQkJCSAgICAgIGFkZHJlc3MgKworCQkJCQkgICAgICBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQtPgorCQkJCQkJCSBwbTFfZXZ0X2xlbikpKTsKIAl9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9jb252ZXJ0X2ZhZHQyCkBAIC0zNTYsMTQgKzM2NSwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLWFjcGlfdGJfY29udmVydF9mYWR0MiAoCi0Jc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICAgICpsb2NhbF9mYWR0LAotCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAgICAqb3JpZ2luYWxfZmFkdCkKK2FjcGlfdGJfY29udmVydF9mYWR0MihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKmxvY2FsX2ZhZHQsCisJCSAgICAgIHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqb3JpZ2luYWxfZmFkdCkKIHsKIAogCS8qIFdlIGhhdmUgYW4gQUNQSSAyLjAgRkFEVCBidXQgd2UgbXVzdCBjb3B5IGl0IHRvIG91ciBsb2NhbCBidWZmZXIgKi8KIAotCUFDUElfTUVNQ1BZIChsb2NhbF9mYWR0LCBvcmlnaW5hbF9mYWR0LCBzaXplb2YgKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MikpOworCUFDUElfTUVNQ1BZKGxvY2FsX2ZhZHQsIG9yaWdpbmFsX2ZhZHQsCisJCSAgICBzaXplb2Yoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyKSk7CiAKIAkvKgogCSAqICJYIiBmaWVsZHMgYXJlIG9wdGlvbmFsIGV4dGVuc2lvbnMgdG8gdGhlIG9yaWdpbmFsIFYxLjAgZmllbGRzLCBzbwpAQCAtMzcxLDg2ICszODAsOTkgQEAKIAkgKiBpcyB6ZXJvLgogCSAqLwogCWlmICghKGxvY2FsX2ZhZHQtPnhmaXJtd2FyZV9jdHJsKSkgewotCQlBQ1BJX1NUT1JFX0FERFJFU1MgKGxvY2FsX2ZhZHQtPnhmaXJtd2FyZV9jdHJsLAotCQkJbG9jYWxfZmFkdC0+VjFfZmlybXdhcmVfY3RybCk7CisJCUFDUElfU1RPUkVfQUREUkVTUyhsb2NhbF9mYWR0LT54ZmlybXdhcmVfY3RybCwKKwkJCQkgICBsb2NhbF9mYWR0LT5WMV9maXJtd2FyZV9jdHJsKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT5YZHNkdCkpIHsKLQkJQUNQSV9TVE9SRV9BRERSRVNTIChsb2NhbF9mYWR0LT5YZHNkdCwgbG9jYWxfZmFkdC0+VjFfZHNkdCk7CisJCUFDUElfU1RPUkVfQUREUkVTUyhsb2NhbF9mYWR0LT5YZHNkdCwgbG9jYWxfZmFkdC0+VjFfZHNkdCk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzKSkgewotCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2JsaywKLQkJCWxvY2FsX2ZhZHQtPnBtMV9ldnRfbGVuLAotCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0xYV9ldnRfYmxrKTsKKwkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2JsaywKKwkJCQkJICAgICBsb2NhbF9mYWR0LT5wbTFfZXZ0X2xlbiwKKwkJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkgICAgIGxvY2FsX2ZhZHQtPlYxX3BtMWFfZXZ0X2Jsayk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzKSkgewotCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2JsaywKLQkJCWxvY2FsX2ZhZHQtPnBtMV9ldnRfbGVuLAotCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0xYl9ldnRfYmxrKTsKKwkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2JsaywKKwkJCQkJICAgICBsb2NhbF9mYWR0LT5wbTFfZXZ0X2xlbiwKKwkJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkgICAgIGxvY2FsX2ZhZHQtPlYxX3BtMWJfZXZ0X2Jsayk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eHBtMWFfY250X2Jsay5hZGRyZXNzKSkgewotCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eHBtMWFfY250X2JsaywKLQkJCWxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLAotCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0xYV9jbnRfYmxrKTsKKwkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eHBtMWFfY250X2JsaywKKwkJCQkJICAgICBsb2NhbF9mYWR0LT5wbTFfY250X2xlbiwKKwkJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkgICAgIGxvY2FsX2ZhZHQtPlYxX3BtMWFfY250X2Jsayk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eHBtMWJfY250X2Jsay5hZGRyZXNzKSkgewotCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eHBtMWJfY250X2JsaywKLQkJCWxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLAotCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0xYl9jbnRfYmxrKTsKKwkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eHBtMWJfY250X2JsaywKKwkJCQkJICAgICBsb2NhbF9mYWR0LT5wbTFfY250X2xlbiwKKwkJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkgICAgIGxvY2FsX2ZhZHQtPlYxX3BtMWJfY250X2Jsayk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eHBtMl9jbnRfYmxrLmFkZHJlc3MpKSB7Ci0JCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0yX2NudF9ibGssCi0JCQlsb2NhbF9mYWR0LT5wbTJfY250X2xlbiwKLQkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtMl9jbnRfYmxrKTsKKwkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eHBtMl9jbnRfYmxrLAorCQkJCQkgICAgIGxvY2FsX2ZhZHQtPnBtMl9jbnRfbGVuLAorCQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCSAgICAgbG9jYWxfZmFkdC0+VjFfcG0yX2NudF9ibGspOwogCX0KIAogCWlmICghKGxvY2FsX2ZhZHQtPnhwbV90bXJfYmxrLmFkZHJlc3MpKSB7Ci0JCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG1fdG1yX2JsaywKLQkJCWxvY2FsX2ZhZHQtPnBtX3RtX2xlbiwKLQkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtX3Rtcl9ibGspOworCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG1fdG1yX2JsaywKKwkJCQkJICAgICBsb2NhbF9mYWR0LT5wbV90bV9sZW4sCisJCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJICAgICBsb2NhbF9mYWR0LT5WMV9wbV90bXJfYmxrKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54Z3BlMF9ibGsuYWRkcmVzcykpIHsKLQkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhncGUwX2JsaywKLQkJCTAsIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX2dwZTBfYmxrKTsKKwkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eGdwZTBfYmxrLAorCQkJCQkgICAgIDAsCisJCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJICAgICBsb2NhbF9mYWR0LT5WMV9ncGUwX2Jsayk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eGdwZTFfYmxrLmFkZHJlc3MpKSB7Ci0JCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54Z3BlMV9ibGssCi0JCQkwLCAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9ncGUxX2Jsayk7CisJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmxvY2FsX2ZhZHQtPnhncGUxX2JsaywKKwkJCQkJICAgICAwLAorCQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCSAgICAgbG9jYWxfZmFkdC0+VjFfZ3BlMV9ibGspOwogCX0KIAogCS8qIENyZWF0ZSBzZXBhcmF0ZSBHQVMgc3RydWN0cyBmb3IgdGhlIFBNMSBFbmFibGUgcmVnaXN0ZXJzICovCiAKLQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmYWNwaV9nYmxfeHBtMWFfZW5hYmxlLAotCQkodTgpIEFDUElfRElWXzIgKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSwKLQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCShsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3MgKwotCQkJQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pKSk7CisJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmYWNwaV9nYmxfeHBtMWFfZW5hYmxlLAorCQkJCSAgICAgKHU4KSBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQtPgorCQkJCQkJICAgICBwbTFfZXZ0X2xlbiksCisJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCSAgICAgKGxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcyArCisJCQkJICAgICAgQUNQSV9ESVZfMihhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikpKTsKIAogCWFjcGlfZ2JsX3hwbTFhX2VuYWJsZS5hZGRyZXNzX3NwYWNlX2lkID0KLQkJbG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzX3NwYWNlX2lkOworCSAgICBsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3Nfc3BhY2VfaWQ7CiAKIAkvKiBQTTFCIGlzIG9wdGlvbmFsOyBsZWF2ZSBudWxsIGlmIG5vdCBwcmVzZW50ICovCiAKIAlpZiAobG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzKSB7Ci0JCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZhY3BpX2dibF94cG0xYl9lbmFibGUsCi0JCQkodTgpIEFDUElfRElWXzIgKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSwKLQkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCi0JCQkJKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcyArCi0JCQkJQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pKSk7CisJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmFjcGlfZ2JsX3hwbTFiX2VuYWJsZSwKKwkJCQkJICAgICAodTgpIEFDUElfRElWXzIoYWNwaV9nYmxfRkFEVC0+CisJCQkJCQkJICAgICBwbTFfZXZ0X2xlbiksCisJCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJICAgICAobG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay4KKwkJCQkJICAgICAgYWRkcmVzcyArCisJCQkJCSAgICAgIEFDUElfRElWXzIoYWNwaV9nYmxfRkFEVC0+CisJCQkJCQkJIHBtMV9ldnRfbGVuKSkpOwogCiAJCWFjcGlfZ2JsX3hwbTFiX2VuYWJsZS5hZGRyZXNzX3NwYWNlX2lkID0KLQkJCWxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzc19zcGFjZV9pZDsKKwkJICAgIGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzc19zcGFjZV9pZDsKIAl9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9jb252ZXJ0X3RhYmxlX2ZhZHQKQEAgLTQ2Nyw4MyArNDg5LDc2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfdGJfY29udmVydF90YWJsZV9mYWR0ICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV90Yl9jb252ZXJ0X3RhYmxlX2ZhZHQodm9pZCkKIHsKLQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgICAgKmxvY2FsX2ZhZHQ7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICp0YWJsZV9kZXNjOworCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqbG9jYWxfZmFkdDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidGJfY29udmVydF90YWJsZV9mYWR0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9jb252ZXJ0X3RhYmxlX2ZhZHQiKTsKIAogCS8qCiAJICogYWNwaV9nYmxfRkFEVCBpcyB2YWxpZC4gVmFsaWRhdGUgdGhlIEZBRFQgbGVuZ3RoLiBUaGUgdGFibGUgbXVzdCBiZQogCSAqIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIHZlcnNpb24gMS4wIEZBRFQKIAkgKi8KLQlpZiAoYWNwaV9nYmxfRkFEVC0+bGVuZ3RoIDwgc2l6ZW9mIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkZBRFQgaXMgaW52YWxpZCwgdG9vIHNob3J0OiAweCVYXG4iLAotCQkJYWNwaV9nYmxfRkFEVC0+bGVuZ3RoKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEgpOworCWlmIChhY3BpX2dibF9GQURULT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYxKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkZBRFQgaXMgaW52YWxpZCwgdG9vIHNob3J0OiAweCVYXG4iLAorCQkJCSAgIGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEgpOwogCX0KIAogCS8qIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIEFDUEkgMi4wKCspIEZBRFQgKi8KIAotCWxvY2FsX2ZhZHQgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKHNpemVvZiAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyKSk7CisJbG9jYWxfZmFkdCA9IEFDUElfTUVNX0NBTExPQ0FURShzaXplb2Yoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyKSk7CiAJaWYgKCFsb2NhbF9mYWR0KSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPnJldmlzaW9uID49IEZBRFQyX1JFVklTSU9OX0lEKSB7Ci0JCWlmIChhY3BpX2dibF9GQURULT5sZW5ndGggPCBzaXplb2YgKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MikpIHsKKwkJaWYgKGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIpKSB7CiAJCQkvKiBMZW5ndGggaXMgdG9vIHNob3J0IHRvIGJlIGEgVjIuMCB0YWJsZSAqLwogCi0JCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCi0JCQkJIkluY29uc2lzdGVudCBGQURUIGxlbmd0aCAoMHglWCkgYW5kIHJldmlzaW9uICgweCVYKSwgdXNpbmcgRkFEVCBWMS4wIHBvcnRpb24gb2YgdGFibGVcbiIsCi0JCQkJYWNwaV9nYmxfRkFEVC0+bGVuZ3RoLCBhY3BpX2dibF9GQURULT5yZXZpc2lvbikpOworCQkJQUNQSV9SRVBPUlRfV0FSTklORygoIkluY29uc2lzdGVudCBGQURUIGxlbmd0aCAoMHglWCkgYW5kIHJldmlzaW9uICgweCVYKSwgdXNpbmcgRkFEVCBWMS4wIHBvcnRpb24gb2YgdGFibGVcbiIsIGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCwgYWNwaV9nYmxfRkFEVC0+cmV2aXNpb24pKTsKIAotCQkJYWNwaV90Yl9jb252ZXJ0X2ZhZHQxIChsb2NhbF9mYWR0LCAodm9pZCAqKSBhY3BpX2dibF9GQURUKTsKLQkJfQotCQllbHNlIHsKKwkJCWFjcGlfdGJfY29udmVydF9mYWR0MShsb2NhbF9mYWR0LAorCQkJCQkgICAgICAodm9pZCAqKWFjcGlfZ2JsX0ZBRFQpOworCQl9IGVsc2UgewogCQkJLyogVmFsaWQgVjIuMCB0YWJsZSAqLwogCi0JCQlhY3BpX3RiX2NvbnZlcnRfZmFkdDIgKGxvY2FsX2ZhZHQsIGFjcGlfZ2JsX0ZBRFQpOworCQkJYWNwaV90Yl9jb252ZXJ0X2ZhZHQyKGxvY2FsX2ZhZHQsIGFjcGlfZ2JsX0ZBRFQpOwogCQl9Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIFZhbGlkIFYxLjAgdGFibGUgKi8KIAotCQlhY3BpX3RiX2NvbnZlcnRfZmFkdDEgKGxvY2FsX2ZhZHQsICh2b2lkICopIGFjcGlfZ2JsX0ZBRFQpOworCQlhY3BpX3RiX2NvbnZlcnRfZmFkdDEobG9jYWxfZmFkdCwgKHZvaWQgKilhY3BpX2dibF9GQURUKTsKIAl9CiAKIAkvKiBHbG9iYWwgRkFEVCBwb2ludGVyIHdpbGwgcG9pbnQgdG8gdGhlIG5ldyBjb21tb24gVjIuMCBGQURUICovCiAKIAlhY3BpX2dibF9GQURUID0gbG9jYWxfZmFkdDsKLQlhY3BpX2dibF9GQURULT5sZW5ndGggPSBzaXplb2YgKEZBRFRfREVTQ1JJUFRPUik7CisJYWNwaV9nYmxfRkFEVC0+bGVuZ3RoID0gc2l6ZW9mKEZBRFRfREVTQ1JJUFRPUik7CiAKIAkvKiBGcmVlIHRoZSBvcmlnaW5hbCB0YWJsZSAqLwogCiAJdGFibGVfZGVzYyA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW0FDUElfVEFCTEVfRkFEVF0ubmV4dDsKLQlhY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUgKHRhYmxlX2Rlc2MpOworCWFjcGlfdGJfZGVsZXRlX3NpbmdsZV90YWJsZSh0YWJsZV9kZXNjKTsKIAogCS8qIEluc3RhbGwgdGhlIG5ldyB0YWJsZSAqLwogCi0JdGFibGVfZGVzYy0+cG9pbnRlciAgICAgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsIGFjcGlfZ2JsX0ZBRFQpOwotCXRhYmxlX2Rlc2MtPmFsbG9jYXRpb24gID0gQUNQSV9NRU1fQUxMT0NBVEVEOwotCXRhYmxlX2Rlc2MtPmxlbmd0aCAgICAgID0gc2l6ZW9mIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIpOworCXRhYmxlX2Rlc2MtPnBvaW50ZXIgPQorCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwgYWNwaV9nYmxfRkFEVCk7CisJdGFibGVfZGVzYy0+YWxsb2NhdGlvbiA9IEFDUElfTUVNX0FMTE9DQVRFRDsKKwl0YWJsZV9kZXNjLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyKTsKIAogCS8qIER1bXAgdGhlIGVudGlyZSBGQURUICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9UQUJMRVMsCi0JCSJIZXggZHVtcCBvZiBjb21tb24gaW50ZXJuYWwgRkFEVCwgc2l6ZSAlZCAoJVgpXG4iLAotCQlhY3BpX2dibF9GQURULT5sZW5ndGgsIGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCkpOwotCUFDUElfRFVNUF9CVUZGRVIgKCh1OCAqKSAoYWNwaV9nYmxfRkFEVCksIGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9UQUJMRVMsCisJCQkgICJIZXggZHVtcCBvZiBjb21tb24gaW50ZXJuYWwgRkFEVCwgc2l6ZSAlZCAoJVgpXG4iLAorCQkJICBhY3BpX2dibF9GQURULT5sZW5ndGgsIGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCkpOworCUFDUElfRFVNUF9CVUZGRVIoKHU4ICopIChhY3BpX2dibF9GQURUKSwgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9idWlsZF9jb21tb25fZmFjcwpAQCAtNTU3LDI2ICs1NzIsMjEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9idWlsZF9jb21tb25fZmFjcyAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbykKK2FjcGlfc3RhdHVzIGFjcGlfdGJfYnVpbGRfY29tbW9uX2ZhY3Moc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9idWlsZF9jb21tb25fZmFjcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfYnVpbGRfY29tbW9uX2ZhY3MiKTsKIAogCS8qIEFic29sdXRlIG1pbmltdW0gbGVuZ3RoIGlzIDI0LCBidXQgdGhlIEFDUEkgc3BlYyBzYXlzIDY0ICovCiAKIAlpZiAoYWNwaV9nYmxfRkFDUy0+bGVuZ3RoIDwgMjQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW52YWxpZCBGQUNTIHRhYmxlIGxlbmd0aDogMHglWFxuIiwKLQkJCWFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0lOVkFMSURfVEFCTEVfTEVOR1RIKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIEZBQ1MgdGFibGUgbGVuZ3RoOiAweCVYXG4iLAorCQkJCSAgIGFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEgpOwogCX0KIAogCWlmIChhY3BpX2dibF9GQUNTLT5sZW5ndGggPCA2NCkgewotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCi0JCQkiRkFDUyBpcyBzaG9ydGVyIHRoYW4gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiBhbGxvd3M6IDB4JVgsIHVzaW5nIGFueXdheVxuIiwKLQkJCWFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCkpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiRkFDUyBpcyBzaG9ydGVyIHRoYW4gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiBhbGxvd3M6IDB4JVgsIHVzaW5nIGFueXdheVxuIiwgYWNwaV9nYmxfRkFDUy0+bGVuZ3RoKSk7CiAJfQogCiAJLyogQ29weSBmaWVsZHMgdG8gdGhlIG5ldyBGQUNTICovCkBAIC01ODQsMjIgKzU5NCwyMiBAQAogCWFjcGlfZ2JsX2NvbW1vbl9mQUNTLmdsb2JhbF9sb2NrID0gJihhY3BpX2dibF9GQUNTLT5nbG9iYWxfbG9jayk7CiAKIAlpZiAoKGFjcGlfZ2JsX1JTRFAtPnJldmlzaW9uIDwgMikgfHwKLQkJKGFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCA8IDMyKSB8fAotCQkoIShhY3BpX2dibF9GQUNTLT54ZmlybXdhcmVfd2FraW5nX3ZlY3RvcikpKSB7CisJICAgIChhY3BpX2dibF9GQUNTLT5sZW5ndGggPCAzMikgfHwKKwkgICAgKCEoYWNwaV9nYmxfRkFDUy0+eGZpcm13YXJlX3dha2luZ192ZWN0b3IpKSkgewogCQkvKiBBQ1BJIDEuMCBGQUNTIG9yIHNob3J0IHRhYmxlIG9yIG9wdGlvbmFsIFhfIGZpZWxkIGlzIHplcm8gKi8KIAotCQlhY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yID0gQUNQSV9DQVNUX1BUUiAodTY0LAotCQkJCSYoYWNwaV9nYmxfRkFDUy0+ZmlybXdhcmVfd2FraW5nX3ZlY3RvcikpOworCQlhY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yID0gQUNQSV9DQVNUX1BUUih1NjQsCisJCQkJCQkJCQkgICAgJgorCQkJCQkJCQkJICAgIChhY3BpX2dibF9GQUNTLT4KKwkJCQkJCQkJCSAgICAgZmlybXdhcmVfd2FraW5nX3ZlY3RvcikpOwogCQlhY3BpX2dibF9jb21tb25fZkFDUy52ZWN0b3Jfd2lkdGggPSAzMjsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogQUNQSSAyLjAgRkFDUyB3aXRoIHZhbGlkIFhfIGZpZWxkICovCiAKLQkJYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZmlybXdhcmVfd2FraW5nX3ZlY3RvciA9ICZhY3BpX2dibF9GQUNTLT54ZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsKKwkJYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZmlybXdhcmVfd2FraW5nX3ZlY3RvciA9CisJCSAgICAmYWNwaV9nYmxfRkFDUy0+eGZpcm13YXJlX3dha2luZ192ZWN0b3I7CiAJCWFjcGlfZ2JsX2NvbW1vbl9mQUNTLnZlY3Rvcl93aWR0aCA9IDY0OwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jCmluZGV4IDRhYjJhYWQuLjZhY2Q1YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXQuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMKQEAgLTQxLDI3ICs0MSwyMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInRiZ2V0IikKK0FDUElfTU9EVUxFX05BTUUoInRiZ2V0IikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3RiX2dldF90aGlzX3RhYmxlKHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHJlc3MsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciwKKwkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3RoaXNfdGFibGUgKAotCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqaGVhZGVyLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfdGFibGVfb3ZlcnJpZGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKLQorYWNwaV90Yl90YWJsZV9vdmVycmlkZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciwKKwkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc4LDM3ICs3MiwzNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pCithY3BpX3RiX2dldF90YWJsZShzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzLAorCQkgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICBoZWFkZXI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9nZXRfdGFibGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2dldF90YWJsZSIpOwogCiAJLyogR2V0IHRoZSBoZWFkZXIgaW4gb3JkZXIgdG8gZ2V0IHNpZ25hdHVyZSBhbmQgdGFibGUgc2l6ZSAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfaGVhZGVyIChhZGRyZXNzLCAmaGVhZGVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIoYWRkcmVzcywgJmhlYWRlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEdldCB0aGUgZW50aXJlIHRhYmxlICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9ib2R5IChhZGRyZXNzLCAmaGVhZGVyLCB0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCBnZXQgQUNQSSB0YWJsZSAoc2l6ZSAlWCksICVzXG4iLAotCQkJaGVhZGVyLmxlbmd0aCwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9ib2R5KGFkZHJlc3MsICZoZWFkZXIsIHRhYmxlX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBnZXQgQUNQSSB0YWJsZSAoc2l6ZSAlWCksICVzXG4iLAorCQkJCSAgIGhlYWRlci5sZW5ndGgsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIKQEAgLTEyNywxNiArMTE4LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGFibGVfaGVhZGVyICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnJldHVybl9oZWFkZXIpCithY3BpX3RiX2dldF90YWJsZV9oZWFkZXIoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKKwkJCSBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnJldHVybl9oZWFkZXIpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpoZWFkZXIgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX2dldF90YWJsZV9oZWFkZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2dldF90YWJsZV9oZWFkZXIiKTsKIAogCS8qCiAJICogRmxhZ3MgY29udGFpbnMgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIG1vZGUgKFZpcnR1YWwgb3IgUGh5c2ljYWwKQEAgLTE0OCw0NiArMTM2LDQyIEBACiAKIAkJLyogUG9pbnRlciBtYXRjaGVzIHByb2Nlc3NvciBtb2RlLCBjb3B5IHRoZSBoZWFkZXIgKi8KIAotCQlBQ1BJX01FTUNQWSAocmV0dXJuX2hlYWRlciwgYWRkcmVzcy0+cG9pbnRlci5sb2dpY2FsLAotCQkJc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJQUNQSV9NRU1DUFkocmV0dXJuX2hlYWRlciwgYWRkcmVzcy0+cG9pbnRlci5sb2dpY2FsLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9MT0dNT0RFX1BIWVNQVFI6CiAKLQkJLyogQ3JlYXRlIGEgbG9naWNhbCBhZGRyZXNzIGZvciB0aGUgcGh5c2ljYWwgcG9pbnRlciovCisJCS8qIENyZWF0ZSBhIGxvZ2ljYWwgYWRkcmVzcyBmb3IgdGhlIHBoeXNpY2FsIHBvaW50ZXIgKi8KIAotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwsCi0JCQkJIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSwgKHZvaWQgKikgJmhlYWRlcik7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKLQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwpLAotCQkJCXNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpLAorCQkJCQkgICAgKHZvaWQgKikmaGVhZGVyKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYJTguOFggZm9yIGxlbmd0aCAlWFxuIiwgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwpLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQkvKiBDb3B5IGhlYWRlciBhbmQgZGVsZXRlIG1hcHBpbmcgKi8KIAotCQlBQ1BJX01FTUNQWSAocmV0dXJuX2hlYWRlciwgaGVhZGVyLCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwotCQlhY3BpX29zX3VubWFwX21lbW9yeSAoaGVhZGVyLCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCQlBQ1BJX01FTUNQWShyZXR1cm5faGVhZGVyLCBoZWFkZXIsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCQlhY3BpX29zX3VubWFwX21lbW9yeShoZWFkZXIsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW52YWxpZCBhZGRyZXNzIGZsYWdzICVYXG4iLAotCQkJYWRkcmVzcy0+cG9pbnRlcl90eXBlKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52YWxpZCBhZGRyZXNzIGZsYWdzICVYXG4iLAorCQkJCSAgIGFkZHJlc3MtPnBvaW50ZXJfdHlwZSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfVEFCTEVTLCAiVGFibGUgU2lnbmF0dXJlOiBbJTQuNHNdXG4iLAotCQlyZXR1cm5faGVhZGVyLT5zaWduYXR1cmUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1RBQkxFUywgIlRhYmxlIFNpZ25hdHVyZTogWyU0LjRzXVxuIiwKKwkJCSAgcmV0dXJuX2hlYWRlci0+c2lnbmF0dXJlKSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkKQEAgLTIwOSwzNyArMTkzLDMzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGFibGVfYm9keSAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpoZWFkZXIsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbykKK2FjcGlfdGJfZ2V0X3RhYmxlX2JvZHkoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKKwkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyLAorCQkgICAgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9nZXRfdGFibGVfYm9keSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfZ2V0X3RhYmxlX2JvZHkiKTsKIAogCWlmICghdGFibGVfaW5mbyB8fCAhYWRkcmVzcykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogQXR0ZW1wdCB0YWJsZSBvdmVycmlkZS4gKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfdGFibGVfb3ZlcnJpZGUgKGhlYWRlciwgdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdGJfdGFibGVfb3ZlcnJpZGUoaGVhZGVyLCB0YWJsZV9pbmZvKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJLyogVGFibGUgd2FzIG92ZXJyaWRkZW4gYnkgdGhlIGhvc3QgT1MgKi8KIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIE5vIG92ZXJyaWRlLCBnZXQgdGhlIG9yaWdpbmFsIHRhYmxlICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90aGlzX3RhYmxlIChhZGRyZXNzLCBoZWFkZXIsIHRhYmxlX2luZm8pOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF90aGlzX3RhYmxlKGFkZHJlc3MsIGhlYWRlciwgdGFibGVfaW5mbyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl90YWJsZV9vdmVycmlkZQpAQCAtMjU1LDYxICsyMzUsNTcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl90YWJsZV9vdmVycmlkZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqaGVhZGVyLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pCithY3BpX3RiX3RhYmxlX292ZXJyaWRlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyLAorCQkgICAgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpuZXdfdGFibGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICBhZGRyZXNzOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqbmV3X3RhYmxlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9wb2ludGVyIGFkZHJlc3M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl90YWJsZV9vdmVycmlkZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfdGFibGVfb3ZlcnJpZGUiKTsKIAogCS8qCiAJICogVGhlIE9TTCB3aWxsIGV4YW1pbmUgdGhlIGhlYWRlciBhbmQgZGVjaWRlIHdoZXRoZXIgdG8gb3ZlcnJpZGUgdGhpcwogCSAqIHRhYmxlLiAgSWYgaXQgZGVjaWRlcyB0byBvdmVycmlkZSwgYSB0YWJsZSB3aWxsIGJlIHJldHVybmVkIGluIG5ld190YWJsZSwKIAkgKiB3aGljaCB3ZSB3aWxsIHRoZW4gY29weS4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX29zX3RhYmxlX292ZXJyaWRlIChoZWFkZXIsICZuZXdfdGFibGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX29zX3RhYmxlX292ZXJyaWRlKGhlYWRlciwgJm5ld190YWJsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCS8qIFNvbWUgc2V2ZXJlIGVycm9yIGZyb20gdGhlIE9TTCwgYnV0IHdlIGJhc2ljYWxseSBpZ25vcmUgaXQgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3Qgb3ZlcnJpZGUgQUNQSSB0YWJsZSwgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBvdmVycmlkZSBBQ1BJIHRhYmxlLCAlc1xuIiwKKwkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAlpZiAoIW5ld190YWJsZSkgewogCQkvKiBObyB0YWJsZSBvdmVycmlkZSAqLwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fQUNQSV9UQUJMRVMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fQUNQSV9UQUJMRVMpOwogCX0KIAogCS8qCiAJICogV2UgaGF2ZSBhIG5ldyB0YWJsZSB0byBvdmVycmlkZSB0aGUgb2xkIG9uZS4gIEdldCBhIGNvcHkgb2YKIAkgKiB0aGUgbmV3IG9uZS4gIFdlIGtub3cgdGhhdCB0aGUgbmV3IHRhYmxlIGhhcyBhIGxvZ2ljYWwgcG9pbnRlci4KIAkgKi8KLQlhZGRyZXNzLnBvaW50ZXJfdHlwZSAgICA9IEFDUElfTE9HSUNBTF9QT0lOVEVSIHwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkc7CisJYWRkcmVzcy5wb2ludGVyX3R5cGUgPSBBQ1BJX0xPR0lDQUxfUE9JTlRFUiB8IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HOwogCWFkZHJlc3MucG9pbnRlci5sb2dpY2FsID0gbmV3X3RhYmxlOwogCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGhpc190YWJsZSAoJmFkZHJlc3MsIG5ld190YWJsZSwgdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgY29weSBvdmVycmlkZSBBQ1BJIHRhYmxlLCAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGhpc190YWJsZSgmYWRkcmVzcywgbmV3X3RhYmxlLCB0YWJsZV9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgY29weSBvdmVycmlkZSBBQ1BJIHRhYmxlLCAlc1xuIiwKKwkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBDb3B5IHRoZSB0YWJsZSBpbmZvICovCiAKLQlBQ1BJX1JFUE9SVF9JTkZPICgoIlRhYmxlIFslNC40c10gcmVwbGFjZWQgYnkgaG9zdCBPU1xuIiwKLQkJdGFibGVfaW5mby0+cG9pbnRlci0+c2lnbmF0dXJlKSk7CisJQUNQSV9SRVBPUlRfSU5GTygoIlRhYmxlIFslNC40c10gcmVwbGFjZWQgYnkgaG9zdCBPU1xuIiwKKwkJCSAgdGFibGVfaW5mby0+cG9pbnRlci0+c2lnbmF0dXJlKSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2V0X3RoaXNfdGFibGUKQEAgLTMyOSwxOCArMzA1LDE1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3RoaXNfdGFibGUgKAotCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqaGVhZGVyLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pCithY3BpX3RiX2dldF90aGlzX3RhYmxlKHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHJlc3MsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciwKKwkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqZnVsbF90YWJsZSA9IE5VTEw7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpmdWxsX3RhYmxlID0gTlVMTDsKKwl1OCBhbGxvY2F0aW9uOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidGJfZ2V0X3RoaXNfdGFibGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2dldF90aGlzX3RhYmxlIik7CiAKIAkvKgogCSAqIEZsYWdzIGNvbnRhaW5zIHRoZSBjdXJyZW50IHByb2Nlc3NvciBtb2RlIChWaXJ0dWFsIG9yIFBoeXNpY2FsCkBAIC0zNTIsMzggKzMyNSwzMyBAQAogCiAJCS8qIFBvaW50ZXIgbWF0Y2hlcyBwcm9jZXNzb3IgbW9kZSwgY29weSB0aGUgdGFibGUgdG8gYSBuZXcgYnVmZmVyICovCiAKLQkJZnVsbF90YWJsZSA9IEFDUElfTUVNX0FMTE9DQVRFIChoZWFkZXItPmxlbmd0aCk7CisJCWZ1bGxfdGFibGUgPSBBQ1BJX01FTV9BTExPQ0FURShoZWFkZXItPmxlbmd0aCk7CiAJCWlmICghZnVsbF90YWJsZSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiQ291bGQgbm90IGFsbG9jYXRlIHRhYmxlIG1lbW9yeSBmb3IgWyU0LjRzXSBsZW5ndGggJVhcbiIsCi0JCQkJaGVhZGVyLT5zaWduYXR1cmUsIGhlYWRlci0+bGVuZ3RoKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBhbGxvY2F0ZSB0YWJsZSBtZW1vcnkgZm9yIFslNC40c10gbGVuZ3RoICVYXG4iLCBoZWFkZXItPnNpZ25hdHVyZSwgaGVhZGVyLT5sZW5ndGgpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJLyogQ29weSB0aGUgZW50aXJlIHRhYmxlIChpbmNsdWRpbmcgaGVhZGVyKSB0byB0aGUgbG9jYWwgYnVmZmVyICovCiAKLQkJQUNQSV9NRU1DUFkgKGZ1bGxfdGFibGUsIGFkZHJlc3MtPnBvaW50ZXIubG9naWNhbCwgaGVhZGVyLT5sZW5ndGgpOworCQlBQ1BJX01FTUNQWShmdWxsX3RhYmxlLCBhZGRyZXNzLT5wb2ludGVyLmxvZ2ljYWwsCisJCQkgICAgaGVhZGVyLT5sZW5ndGgpOwogCiAJCS8qIFNhdmUgYWxsb2NhdGlvbiB0eXBlICovCiAKIAkJYWxsb2NhdGlvbiA9IEFDUElfTUVNX0FMTE9DQVRFRDsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9MT0dNT0RFX1BIWVNQVFI6CiAKIAkJLyoKIAkJICogSnVzdCBtYXAgdGhlIHRhYmxlJ3MgcGh5c2ljYWwgbWVtb3J5CiAJCSAqIGludG8gb3VyIGFkZHJlc3Mgc3BhY2UuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwsCi0JCQkJIChhY3BpX3NpemUpIGhlYWRlci0+bGVuZ3RoLCAodm9pZCAqKSAmZnVsbF90YWJsZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGZvciB0YWJsZSBbJTQuNHNdIGF0ICU4LjhYJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKLQkJCQloZWFkZXItPnNpZ25hdHVyZSwKLQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwpLAotCQkJCWhlYWRlci0+bGVuZ3RoKSk7CisJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeShhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsLAorCQkJCQkgICAgKGFjcGlfc2l6ZSkgaGVhZGVyLT5sZW5ndGgsCisJCQkJCSAgICAodm9pZCAqKSZmdWxsX3RhYmxlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGZvciB0YWJsZSBbJTQuNHNdIGF0ICU4LjhYJTguOFggZm9yIGxlbmd0aCAlWFxuIiwgaGVhZGVyLT5zaWduYXR1cmUsIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsKSwgaGVhZGVyLT5sZW5ndGgpKTsKIAkJCXJldHVybiAoc3RhdHVzKTsKIAkJfQogCkBAIC0zOTIsMTIgKzM2MCwxMSBAQAogCQlhbGxvY2F0aW9uID0gQUNQSV9NRU1fTUFQUEVEOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgYWRkcmVzcyBmbGFncyAlWFxuIiwKLQkJCWFkZHJlc3MtPnBvaW50ZXJfdHlwZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBhZGRyZXNzIGZsYWdzICVYXG4iLAorCQkJCSAgYWRkcmVzcy0+cG9pbnRlcl90eXBlKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKgpAQCAtNDA1LDEwICszNzIsMTAgQEAKIAkgKiBldmVuIHRoZSBvbmVzIHdob3NlIHNpZ25hdHVyZSB3ZSBkb24ndCByZWNvZ25pemUKIAkgKi8KIAlpZiAodGFibGVfaW5mby0+dHlwZSAhPSBBQ1BJX1RBQkxFX0ZBQ1MpIHsKLQkJc3RhdHVzID0gYWNwaV90Yl92ZXJpZnlfdGFibGVfY2hlY2tzdW0gKGZ1bGxfdGFibGUpOworCQlzdGF0dXMgPSBhY3BpX3RiX3ZlcmlmeV90YWJsZV9jaGVja3N1bShmdWxsX3RhYmxlKTsKIAogI2lmICghQUNQSV9DSEVDS1NVTV9BQk9SVCkKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCS8qIElnbm9yZSB0aGUgZXJyb3IgaWYgY29uZmlndXJhdGlvbiBzYXlzIHNvICovCiAKIAkJCXN0YXR1cyA9IEFFX09LOwpAQCAtNDE4LDE5ICszODUsMTkgQEAKIAogCS8qIFJldHVybiB2YWx1ZXMgKi8KIAotCXRhYmxlX2luZm8tPnBvaW50ZXIgICAgID0gZnVsbF90YWJsZTsKLQl0YWJsZV9pbmZvLT5sZW5ndGggICAgICA9IChhY3BpX3NpemUpIGhlYWRlci0+bGVuZ3RoOwotCXRhYmxlX2luZm8tPmFsbG9jYXRpb24gID0gYWxsb2NhdGlvbjsKKwl0YWJsZV9pbmZvLT5wb2ludGVyID0gZnVsbF90YWJsZTsKKwl0YWJsZV9pbmZvLT5sZW5ndGggPSAoYWNwaV9zaXplKSBoZWFkZXItPmxlbmd0aDsKKwl0YWJsZV9pbmZvLT5hbGxvY2F0aW9uID0gYWxsb2NhdGlvbjsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCSJGb3VuZCB0YWJsZSBbJTQuNHNdIGF0ICU4LjhYJTguOFgsIG1hcHBlZC9jb3BpZWQgdG8gJXBcbiIsCi0JCWZ1bGxfdGFibGUtPnNpZ25hdHVyZSwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsKSwgZnVsbF90YWJsZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIkZvdW5kIHRhYmxlIFslNC40c10gYXQgJTguOFglOC44WCwgbWFwcGVkL2NvcGllZCB0byAlcFxuIiwKKwkJCSAgZnVsbF90YWJsZS0+c2lnbmF0dXJlLAorCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCksCisJCQkgIGZ1bGxfdGFibGUpKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF90YWJsZV9wdHIKQEAgLTQ0NywyNCArNDE0LDIwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGFibGVfcHRyICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICoqdGFibGVfcHRyX2xvYykKK2FjcGlfdGJfZ2V0X3RhYmxlX3B0cihhY3BpX3RhYmxlX3R5cGUgdGFibGVfdHlwZSwKKwkJICAgICAgdTMyIGluc3RhbmNlLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKip0YWJsZV9wdHJfbG9jKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7CisJdTMyIGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9nZXRfdGFibGVfcHRyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9nZXRfdGFibGVfcHRyIik7CiAKIAlpZiAoIWFjcGlfZ2JsX0RTRFQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19BQ1BJX1RBQkxFUyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7CiAJfQogCiAJaWYgKHRhYmxlX3R5cGUgPiBBQ1BJX1RBQkxFX01BWCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyoKQEAgLTQ3NiwxNSArNDM5LDE2IEBACiAKIAkJKnRhYmxlX3B0cl9sb2MgPSBOVUxMOwogCQlpZiAoYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0ubmV4dCkgewotCQkJKnRhYmxlX3B0cl9sb2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1t0YWJsZV90eXBlXS5uZXh0LT5wb2ludGVyOworCQkJKnRhYmxlX3B0cl9sb2MgPQorCQkJICAgIGFjcGlfZ2JsX3RhYmxlX2xpc3RzW3RhYmxlX3R5cGVdLm5leHQtPnBvaW50ZXI7CiAJCX0KLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogQ2hlY2sgZm9yIGluc3RhbmNlIG91dCBvZiByYW5nZSAqLwogCiAJaWYgKGluc3RhbmNlID4gYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0uY291bnQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRVhJU1QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKIAl9CiAKIAkvKiBXYWxrIHRoZSBsaXN0IHRvIGdldCB0aGUgZGVzaXJlZCB0YWJsZQpAQCAtNTAzLDYgKzQ2Nyw1IEBACiAKIAkqdGFibGVfcHRyX2xvYyA9IHRhYmxlX2Rlc2MtPnBvaW50ZXI7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0YWxsLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0YWxsLmMKaW5kZXggZWVhNWI4Yy4uOGQ3MjM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldGFsbC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXRhbGwuYwpAQCAtNDEsMjcgKzQxLDIxIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidGJnZXRhbGwiKQorQUNQSV9NT0RVTEVfTkFNRSgidGJnZXRhbGwiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdGJfZ2V0X3ByaW1hcnlfdGFibGUoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKKwkJCSAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbyk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfcHJpbWFyeV90YWJsZSAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF9zZWNvbmRhcnlfdGFibGUgKAotCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCi0JYWNwaV9zdHJpbmcgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7Ci0KK2FjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZShzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzLAorCQkJICAgIGFjcGlfc3RyaW5nIHNpZ25hdHVyZSwKKwkJCSAgICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC03Nyw1OCArNzEsNTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfcHJpbWFyeV90YWJsZSAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKQorYWNwaV90Yl9nZXRfcHJpbWFyeV90YWJsZShzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzLAorCQkJICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgaGVhZGVyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidGJfZ2V0X3ByaW1hcnlfdGFibGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2dldF9wcmltYXJ5X3RhYmxlIik7CiAKIAkvKiBJZ25vcmUgYSBOVUxMIGFkZHJlc3MgaW4gdGhlIFJTRFQgKi8KIAogCWlmICghYWRkcmVzcy0+cG9pbnRlci52YWx1ZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBHZXQgdGhlIGhlYWRlciBpbiBvcmRlciB0byBnZXQgc2lnbmF0dXJlIGFuZCB0YWJsZSBzaXplICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIgKGFkZHJlc3MsICZoZWFkZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2hlYWRlcihhZGRyZXNzLCAmaGVhZGVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogQ2xlYXIgdGhlIHRhYmxlX2luZm8gKi8KIAotCUFDUElfTUVNU0VUICh0YWJsZV9pbmZvLCAwLCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKKwlBQ1BJX01FTVNFVCh0YWJsZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwogCiAJLyoKIAkgKiBDaGVjayB0aGUgdGFibGUgc2lnbmF0dXJlIGFuZCBtYWtlIHN1cmUgaXQgaXMgcmVjb2duaXplZC4KIAkgKiBBbHNvIGNoZWNrcyB0aGUgaGVhZGVyIGNoZWNrc3VtCiAJICovCiAJdGFibGVfaW5mby0+cG9pbnRlciA9ICZoZWFkZXI7Ci0Jc3RhdHVzID0gYWNwaV90Yl9yZWNvZ25pemVfdGFibGUgKHRhYmxlX2luZm8sIEFDUElfVEFCTEVfUFJJTUFSWSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9yZWNvZ25pemVfdGFibGUodGFibGVfaW5mbywgQUNQSV9UQUJMRV9QUklNQVJZKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogR2V0IHRoZSBlbnRpcmUgdGFibGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkgKGFkZHJlc3MsICZoZWFkZXIsIHRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkoYWRkcmVzcywgJmhlYWRlciwgdGFibGVfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEluc3RhbGwgdGhlIHRhYmxlICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2luc3RhbGxfdGFibGUgKHRhYmxlX2luZm8pOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2luc3RhbGxfdGFibGUodGFibGVfaW5mbyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlCkBAIC0xNDMsMzIgKzEzMywyNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF9zZWNvbmRhcnlfdGFibGUgKAotCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCi0JYWNwaV9zdHJpbmcgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbykKK2FjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZShzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzLAorCQkJICAgIGFjcGlfc3RyaW5nIHNpZ25hdHVyZSwKKwkJCSAgICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgaGVhZGVyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoInRiX2dldF9zZWNvbmRhcnlfdGFibGUiLCBzaWduYXR1cmUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoInRiX2dldF9zZWNvbmRhcnlfdGFibGUiLCBzaWduYXR1cmUpOwogCiAJLyogR2V0IHRoZSBoZWFkZXIgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIHNpZ25hdHVyZSAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfaGVhZGVyIChhZGRyZXNzLCAmaGVhZGVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIoYWRkcmVzcywgJmhlYWRlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFNpZ25hdHVyZSBtdXN0IG1hdGNoIHJlcXVlc3QgKi8KIAotCWlmIChBQ1BJX1NUUk5DTVAgKGhlYWRlci5zaWduYXR1cmUsIHNpZ25hdHVyZSwgQUNQSV9OQU1FX1NJWkUpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkiSW5jb3JyZWN0IHRhYmxlIHNpZ25hdHVyZSAtIHdhbnRlZCBbJXNdIGZvdW5kIFslNC40c11cbiIsCi0JCQlzaWduYXR1cmUsIGhlYWRlci5zaWduYXR1cmUpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfU0lHTkFUVVJFKTsKKwlpZiAoQUNQSV9TVFJOQ01QKGhlYWRlci5zaWduYXR1cmUsIHNpZ25hdHVyZSwgQUNQSV9OQU1FX1NJWkUpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW5jb3JyZWN0IHRhYmxlIHNpZ25hdHVyZSAtIHdhbnRlZCBbJXNdIGZvdW5kIFslNC40c11cbiIsIHNpZ25hdHVyZSwgaGVhZGVyLnNpZ25hdHVyZSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1NJR05BVFVSRSk7CiAJfQogCiAJLyoKQEAgLTE3NiwyNSArMTYxLDI0IEBACiAJICogQWxzbyBjaGVja3MgdGhlIGhlYWRlciBjaGVja3N1bQogCSAqLwogCXRhYmxlX2luZm8tPnBvaW50ZXIgPSAmaGVhZGVyOwotCXN0YXR1cyA9IGFjcGlfdGJfcmVjb2duaXplX3RhYmxlICh0YWJsZV9pbmZvLCBBQ1BJX1RBQkxFX1NFQ09OREFSWSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9yZWNvZ25pemVfdGFibGUodGFibGVfaW5mbywgQUNQSV9UQUJMRV9TRUNPTkRBUlkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBHZXQgdGhlIGVudGlyZSB0YWJsZSAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfYm9keSAoYWRkcmVzcywgJmhlYWRlciwgdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfYm9keShhZGRyZXNzLCAmaGVhZGVyLCB0YWJsZV9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogSW5zdGFsbCB0aGUgdGFibGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfaW5zdGFsbF90YWJsZSAodGFibGVfaW5mbyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfaW5zdGFsbF90YWJsZSh0YWJsZV9pbmZvKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF9yZXF1aXJlZF90YWJsZXMKQEAgLTIxNCwyMyArMTk4LDE5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3JlcXVpcmVkX3RhYmxlcyAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfdGJfZ2V0X3JlcXVpcmVkX3RhYmxlcyh2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgdGFibGVfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgIGFkZHJlc3M7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIGk7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyB0YWJsZV9pbmZvOworCXN0cnVjdCBhY3BpX3BvaW50ZXIgYWRkcmVzczsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2dldF9yZXF1aXJlZF90YWJsZXMiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9nZXRfcmVxdWlyZWRfdGFibGVzIik7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiJWQgQUNQSSB0YWJsZXMgaW4gUlNEVFxuIiwKKwkJCSAgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudCkpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIiVkIEFDUEkgdGFibGVzIGluIFJTRFRcbiIsCi0JCWFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQpKTsKLQotCi0JYWRkcmVzcy5wb2ludGVyX3R5cGUgID0gYWNwaV9nYmxfdGFibGVfZmxhZ3MgfCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORzsKKwlhZGRyZXNzLnBvaW50ZXJfdHlwZSA9IGFjcGlfZ2JsX3RhYmxlX2ZsYWdzIHwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkc7CiAKIAkvKgogCSAqIExvb3AgdGhyb3VnaCBhbGwgdGFibGUgcG9pbnRlcnMgZm91bmQgaW4gUlNEVC4KQEAgLTI0Myw4NCArMjIzLDc5IEBACiAJZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQ7IGkrKykgewogCQkvKiBHZXQgdGhlIHRhYmxlIGFkZHJlc3MgZnJvbSB0aGUgY29tbW9uIGludGVybmFsIFhTRFQgKi8KIAotCQlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPQotCQkJCSAgYWNwaV9nYmxfWFNEVC0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldOworCQlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPSBhY3BpX2dibF9YU0RULT50YWJsZV9vZmZzZXRfZW50cnlbaV07CiAKIAkJLyoKIAkJICogR2V0IHRoZSB0YWJsZXMgbmVlZGVkIGJ5IHRoaXMgc3Vic3lzdGVtIChGQURUIGFuZCBhbnkgU1NEVHMpLgogCQkgKiBOT1RFOiBBbGwgb3RoZXIgdGFibGVzIGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQgYXQgdGhpcyB0aW1lLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV90Yl9nZXRfcHJpbWFyeV90YWJsZSAoJmFkZHJlc3MsICZ0YWJsZV9pbmZvKTsKKwkJc3RhdHVzID0gYWNwaV90Yl9nZXRfcHJpbWFyeV90YWJsZSgmYWRkcmVzcywgJnRhYmxlX2luZm8pOwogCQlpZiAoKHN0YXR1cyAhPSBBRV9PSykgJiYgKHN0YXR1cyAhPSBBRV9UQUJMRV9OT1RfU1VQUE9SVEVEKSkgewotCQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCIlcywgd2hpbGUgZ2V0dGluZyB0YWJsZSBhdCAlOC44WCU4LjhYXG4iLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSwKLQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MucG9pbnRlci52YWx1ZSkpKTsKKwkJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCIlcywgd2hpbGUgZ2V0dGluZyB0YWJsZSBhdCAlOC44WCU4LjhYXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MucG9pbnRlci52YWx1ZSkpKTsKIAkJfQogCX0KIAogCS8qIFdlIG11c3QgaGF2ZSBhIEZBRFQgdG8gY29udGludWUgKi8KIAogCWlmICghYWNwaV9nYmxfRkFEVCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJObyBGQURUIHByZXNlbnQgaW4gUlNEVC9YU0RUXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fQUNQSV9UQUJMRVMpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIEZBRFQgcHJlc2VudCBpbiBSU0RUL1hTRFRcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKIAl9CiAKIAkvKgogCSAqIENvbnZlcnQgdGhlIEZBRFQgdG8gYSBjb21tb24gZm9ybWF0LiAgVGhpcyBhbGxvd3MgZWFybGllciByZXZpc2lvbnMgb2YKIAkgKiB0aGUgdGFibGUgdG8gY29leGlzdCB3aXRoIG5ld2VyIHZlcnNpb25zLCB1c2luZyBjb21tb24gYWNjZXNzIGNvZGUuCiAJICovCi0Jc3RhdHVzID0gYWNwaV90Yl9jb252ZXJ0X3RhYmxlX2ZhZHQgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJIkNvdWxkIG5vdCBjb252ZXJ0IEZBRFQgdG8gaW50ZXJuYWwgY29tbW9uIGZvcm1hdFxuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9jb252ZXJ0X3RhYmxlX2ZhZHQoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgY29udmVydCBGQURUIHRvIGludGVybmFsIGNvbW1vbiBmb3JtYXRcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogR2V0IHRoZSBGQUNTIChQb2ludGVkIHRvIGJ5IHRoZSBGQURUKSAqLwogCiAJYWRkcmVzcy5wb2ludGVyLnZhbHVlID0gYWNwaV9nYmxfRkFEVC0+eGZpcm13YXJlX2N0cmw7CiAKLQlzdGF0dXMgPSBhY3BpX3RiX2dldF9zZWNvbmRhcnlfdGFibGUgKCZhZGRyZXNzLCBGQUNTX1NJRywgJnRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IGdldC9pbnN0YWxsIHRoZSBGQUNTLCAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlKCZhZGRyZXNzLCBGQUNTX1NJRywgJnRhYmxlX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBnZXQvaW5zdGFsbCB0aGUgRkFDUywgJXNcbiIsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKIAkgKiBDcmVhdGUgdGhlIGNvbW1vbiBGQUNTIHBvaW50ZXIgdGFibGUKIAkgKiAoQ29udGFpbnMgcG9pbnRlcnMgdG8gdGhlIG9yaWdpbmFsIHRhYmxlKQogCSAqLwotCXN0YXR1cyA9IGFjcGlfdGJfYnVpbGRfY29tbW9uX2ZhY3MgKCZ0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2J1aWxkX2NvbW1vbl9mYWNzKCZ0YWJsZV9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogR2V0L2luc3RhbGwgdGhlIERTRFQgKFBvaW50ZWQgdG8gYnkgdGhlIEZBRFQpICovCiAKIAlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPSBhY3BpX2dibF9GQURULT5YZHNkdDsKIAotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZSAoJmFkZHJlc3MsIERTRFRfU0lHLCAmdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgZ2V0L2luc3RhbGwgdGhlIERTRFRcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZSgmYWRkcmVzcywgRFNEVF9TSUcsICZ0YWJsZV9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgZ2V0L2luc3RhbGwgdGhlIERTRFRcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogU2V0IEludGVnZXIgV2lkdGggKDMyLzY0KSBiYXNlZCB1cG9uIERTRFQgcmV2aXNpb24gKi8KIAotCWFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGggKGFjcGlfZ2JsX0RTRFQtPnJldmlzaW9uKTsKKwlhY3BpX3V0X3NldF9pbnRlZ2VyX3dpZHRoKGFjcGlfZ2JsX0RTRFQtPnJldmlzaW9uKTsKIAogCS8qIER1bXAgdGhlIGVudGlyZSBEU0RUICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9UQUJMRVMsCi0JCSJIZXggZHVtcCBvZiBlbnRpcmUgRFNEVCwgc2l6ZSAlZCAoMHglWCksIEludGVnZXIgd2lkdGggPSAlZFxuIiwKLQkJYWNwaV9nYmxfRFNEVC0+bGVuZ3RoLCBhY3BpX2dibF9EU0RULT5sZW5ndGgsIGFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoKSk7Ci0JQUNQSV9EVU1QX0JVRkZFUiAoKHU4ICopIGFjcGlfZ2JsX0RTRFQsIGFjcGlfZ2JsX0RTRFQtPmxlbmd0aCk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9UQUJMRVMsCisJCQkgICJIZXggZHVtcCBvZiBlbnRpcmUgRFNEVCwgc2l6ZSAlZCAoMHglWCksIEludGVnZXIgd2lkdGggPSAlZFxuIiwKKwkJCSAgYWNwaV9nYmxfRFNEVC0+bGVuZ3RoLCBhY3BpX2dibF9EU0RULT5sZW5ndGgsCisJCQkgIGFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoKSk7CisJQUNQSV9EVU1QX0JVRkZFUigodTggKikgYWNwaV9nYmxfRFNEVCwgYWNwaV9nYmxfRFNEVC0+bGVuZ3RoKTsKIAogCS8qIEFsd2F5cyBkZWxldGUgdGhlIFJTRFAgbWFwcGluZywgd2UgYXJlIGRvbmUgd2l0aCBpdCAqLwogCi0JYWNwaV90Yl9kZWxldGVfdGFibGVzX2J5X3R5cGUgKEFDUElfVEFCTEVfUlNEUCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfdGJfZGVsZXRlX3RhYmxlc19ieV90eXBlKEFDUElfVEFCTEVfUlNEUCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ymluc3RhbC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90Ymluc3RhbC5jCmluZGV4IDYyOWI2NGMuLjEwZGI4NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJpbnN0YWwuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiaW5zdGFsLmMKQEAgLTQxLDIyICs0MSwxNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInRiaW5zdGFsIikKK0FDUElfTU9EVUxFX05BTUUoInRiaW5zdGFsIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaWduYXR1cmUsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF90eXBlKTsKLQorYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUoY2hhciAqc2lnbmF0dXJlLAorCQkJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbywgdTggc2VhcmNoX3R5cGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc0LDE2ICs2OCwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3RiX21hdGNoX3NpZ25hdHVyZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2lnbmF0dXJlLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8sCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfdHlwZSkKK2FjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlKGNoYXIgKnNpZ25hdHVyZSwKKwkJCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8sIHU4IHNlYXJjaF90eXBlKQogewotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKKwlhY3BpX25hdGl2ZV91aW50IGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9tYXRjaF9zaWduYXR1cmUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX21hdGNoX3NpZ25hdHVyZSIpOwogCiAJLyogU2VhcmNoIGZvciBhIHNpZ25hdHVyZSBtYXRjaCBhbW9uZyB0aGUga25vd24gdGFibGUgdHlwZXMgKi8KIApAQCAtOTIsMzAgKzgyLDMwIEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmICghQUNQSV9TVFJOQ01QIChzaWduYXR1cmUsIGFjcGlfZ2JsX3RhYmxlX2RhdGFbaV0uc2lnbmF0dXJlLAotCQkJCSAgIGFjcGlfZ2JsX3RhYmxlX2RhdGFbaV0uc2lnX2xlbmd0aCkpIHsKKwkJaWYgKCFBQ1BJX1NUUk5DTVAoc2lnbmF0dXJlLCBhY3BpX2dibF90YWJsZV9kYXRhW2ldLnNpZ25hdHVyZSwKKwkJCQkgIGFjcGlfZ2JsX3RhYmxlX2RhdGFbaV0uc2lnX2xlbmd0aCkpIHsKIAkJCS8qIEZvdW5kIGEgc2lnbmF0dXJlIG1hdGNoLCByZXR1cm4gaW5kZXggaWYgcmVxdWVzdGVkICovCiAKIAkJCWlmICh0YWJsZV9pbmZvKSB7CiAJCQkJdGFibGVfaW5mby0+dHlwZSA9ICh1OCkgaTsKIAkJCX0KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJCQkiVGFibGUgWyU0LjRzXSBpcyBhbiBBQ1BJIHRhYmxlIGNvbnN1bWVkIGJ5IHRoZSBjb3JlIHN1YnN5c3RlbVxuIiwKLQkJCQkoY2hhciAqKSBhY3BpX2dibF90YWJsZV9kYXRhW2ldLnNpZ25hdHVyZSkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkgICJUYWJsZSBbJTQuNHNdIGlzIGFuIEFDUEkgdGFibGUgY29uc3VtZWQgYnkgdGhlIGNvcmUgc3Vic3lzdGVtXG4iLAorCQkJCQkgIChjaGFyICopYWNwaV9nYmxfdGFibGVfZGF0YVtpXS4KKwkJCQkJICBzaWduYXR1cmUpKTsKIAotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQl9CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJIlRhYmxlIFslNC40c10gaXMgbm90IGFuIEFDUEkgdGFibGUgY29uc3VtZWQgYnkgdGhlIGNvcmUgc3Vic3lzdGVtIC0gaWdub3JlZFxuIiwKLQkJKGNoYXIgKikgc2lnbmF0dXJlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiVGFibGUgWyU0LjRzXSBpcyBub3QgYW4gQUNQSSB0YWJsZSBjb25zdW1lZCBieSB0aGUgY29yZSBzdWJzeXN0ZW0gLSBpZ25vcmVkXG4iLAorCQkJICAoY2hhciAqKXNpZ25hdHVyZSkpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9UQUJMRV9OT1RfU1VQUE9SVEVEKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVEFCTEVfTk9UX1NVUFBPUlRFRCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9pbnN0YWxsX3RhYmxlCkBAIC0xMjQsNDYgKzExNCw1MiBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogTG9hZCBhbmQgdmFsaWRhdGUgYWxsIHRhYmxlcyBvdGhlciB0aGFuIHRoZSBSU0RULiAgVGhlIFJTRFQgbXVzdAotICogICAgICAgICAgICAgIGFscmVhZHkgYmUgbG9hZGVkIGFuZCB2YWxpZGF0ZWQuCi0gKiAgICAgICAgICAgICAgSW5zdGFsbCB0aGUgdGFibGUgaW50byB0aGUgZ2xvYmFsIGRhdGEgc3RydWN0cy4KKyAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIHRoZSB0YWJsZSBpbnRvIHRoZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2luc3RhbGxfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pCithY3BpX3N0YXR1cyBhY3BpX3RiX2luc3RhbGxfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidGJfaW5zdGFsbF90YWJsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfaW5zdGFsbF90YWJsZSIpOwogCiAJLyogTG9jayB0YWJsZXMgd2hpbGUgaW5zdGFsbGluZyAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9UQUJMRVMpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IGFjcXVpcmUgdGFibGUgbXV0ZXggZm9yIFslNC40c10sICVzXG4iLAotCQkJdGFibGVfaW5mby0+cG9pbnRlci0+c2lnbmF0dXJlLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBhY3F1aXJlIHRhYmxlIG11dGV4LCAlc1xuIiwKKwkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIElnbm9yZSBhIHRhYmxlIHRoYXQgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIEZvciBleGFtcGxlLCBzb21lIEJJT1MKKwkgKiBBU0wgY29kZSB3aWxsIHJlcGVhdGVkbHkgYXR0ZW1wdCB0byBsb2FkIHRoZSBzYW1lIFNTRFQuCisJICovCisJc3RhdHVzID0gYWNwaV90Yl9pc190YWJsZV9pbnN0YWxsZWQodGFibGVfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAogCS8qIEluc3RhbGwgdGhlIHRhYmxlIGludG8gdGhlIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9pbml0X3RhYmxlX2Rlc2NyaXB0b3IgKHRhYmxlX2luZm8tPnR5cGUsIHRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IGluc3RhbGwgQUNQSSB0YWJsZSBbJTQuNHNdLCAlc1xuIiwKLQkJCXRhYmxlX2luZm8tPnBvaW50ZXItPnNpZ25hdHVyZSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJc3RhdHVzID0gYWNwaV90Yl9pbml0X3RhYmxlX2Rlc2NyaXB0b3IodGFibGVfaW5mby0+dHlwZSwgdGFibGVfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGluc3RhbGwgdGFibGUgWyU0LjRzXSwgJXNcbiIsCisJCQkJICAgdGFibGVfaW5mby0+cG9pbnRlci0+c2lnbmF0dXJlLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIiVzIGxvY2F0ZWQgYXQgJXBcbiIsCi0JCWFjcGlfZ2JsX3RhYmxlX2RhdGFbdGFibGVfaW5mby0+dHlwZV0ubmFtZSwgdGFibGVfaW5mby0+cG9pbnRlcikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIiVzIGxvY2F0ZWQgYXQgJXBcbiIsCisJCQkgIGFjcGlfZ2JsX3RhYmxlX2RhdGFbdGFibGVfaW5mby0+dHlwZV0ubmFtZSwKKwkJCSAgdGFibGVfaW5mby0+cG9pbnRlcikpOwogCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfVEFCTEVTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9yZWNvZ25pemVfdGFibGUKQEAgLTE4NiwyMiArMTgyLDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl9yZWNvZ25pemVfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8sCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfdHlwZSkKK2FjcGlfdGJfcmVjb2duaXplX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8sIHU4IHNlYXJjaF90eXBlKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlX2hlYWRlcjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX2hlYWRlcjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9yZWNvZ25pemVfdGFibGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX3JlY29nbml6ZV90YWJsZSIpOwogCiAJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIHRhYmxlIHBvaW50ZXIgKi8KIAotCXRhYmxlX2hlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikgdGFibGVfaW5mby0+cG9pbnRlcjsKKwl0YWJsZV9oZWFkZXIgPSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICopdGFibGVfaW5mby0+cG9pbnRlcjsKIAlpZiAoIXRhYmxlX2hlYWRlcikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyoKQEAgLTIxMiwyNSArMjA0LDI0IEBACiAJICogVGhpcyBjYW4gYmUgYW55IG9uZSBvZiBtYW55IHZhbGlkIEFDUEkgdGFibGVzLCBpdCBqdXN0IGlzbid0IG9uZSBvZgogCSAqIHRoZSB0YWJsZXMgdGhhdCBpcyBjb25zdW1lZCBieSB0aGUgY29yZSBzdWJzeXN0ZW0KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3RiX21hdGNoX3NpZ25hdHVyZSAodGFibGVfaGVhZGVyLT5zaWduYXR1cmUsCi0JCQkgdGFibGVfaW5mbywgc2VhcmNoX3R5cGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlKHRhYmxlX2hlYWRlci0+c2lnbmF0dXJlLAorCQkJCQkgdGFibGVfaW5mbywgc2VhcmNoX3R5cGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3RiX3ZhbGlkYXRlX3RhYmxlX2hlYWRlciAodGFibGVfaGVhZGVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX3ZhbGlkYXRlX3RhYmxlX2hlYWRlcih0YWJsZV9oZWFkZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBSZXR1cm4gdGhlIHRhYmxlIHR5cGUgYW5kIGxlbmd0aCB2aWEgdGhlIGluZm8gc3RydWN0ICovCiAKIAl0YWJsZV9pbmZvLT5sZW5ndGggPSAoYWNwaV9zaXplKSB0YWJsZV9oZWFkZXItPmxlbmd0aDsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2luaXRfdGFibGVfZGVzY3JpcHRvcgpAQCAtMjQ1LDIyICsyMzYsMjcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2luaXRfdGFibGVfZGVzY3JpcHRvciAoCi0JYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pCithY3BpX3RiX2luaXRfdGFibGVfZGVzY3JpcHRvcihhY3BpX3RhYmxlX3R5cGUgdGFibGVfdHlwZSwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfbGlzdCAgICAgICAgICAqbGlzdF9oZWFkOwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2M7CisJc3RydWN0IGFjcGlfdGFibGVfbGlzdCAqbGlzdF9oZWFkOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMiAoInRiX2luaXRfdGFibGVfZGVzY3JpcHRvciIsIHRhYmxlX3R5cGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoInRiX2luaXRfdGFibGVfZGVzY3JpcHRvciIsIHRhYmxlX3R5cGUpOwogCiAJLyogQWxsb2NhdGUgYSBkZXNjcmlwdG9yIGZvciB0aGlzIHRhYmxlICovCiAKLQl0YWJsZV9kZXNjID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKKwl0YWJsZV9kZXNjID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7CiAJaWYgKCF0YWJsZV9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJLyogR2V0IGEgbmV3IG93bmVyIElEIGZvciB0aGUgdGFibGUgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQoJnRhYmxlX2Rlc2MtPm93bmVyX2lkKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogSW5zdGFsbCB0aGUgdGFibGUgaW50byB0aGUgZ2xvYmFsIGRhdGEgc3RydWN0dXJlICovCkBAIC0yNzIsMTQgKzI2OCwxNCBAQAogCSAqIGluY2x1ZGVzIG1vc3QgQUNQSSB0YWJsZXMgc3VjaCBhcyB0aGUgRFNEVC4gIDIpIE11bHRpcGxlIGluc3RhbmNlcyBvZgogCSAqIHRoZSB0YWJsZSBhcmUgYWxsb3dlZC4gIFRoaXMgaW5jbHVkZXMgU1NEVCBhbmQgUFNEVHMuCiAJICovCi0JaWYgKEFDUElfSVNfU0lOR0xFX1RBQkxFIChhY3BpX2dibF90YWJsZV9kYXRhW3RhYmxlX3R5cGVdLmZsYWdzKSkgeworCWlmIChBQ1BJX0lTX1NJTkdMRV9UQUJMRShhY3BpX2dibF90YWJsZV9kYXRhW3RhYmxlX3R5cGVdLmZsYWdzKSkgewogCQkvKgogCQkgKiBPbmx5IG9uZSB0YWJsZSBhbGxvd2VkLCBhbmQgYSB0YWJsZSBoYXMgYWxyZWFkIGJlZW4gaW5zdGFsbGVkCiAJCSAqIGF0IHRoaXMgbG9jYXRpb24sIHNvIHJldHVybiBhbiBlcnJvci4KIAkJICovCiAJCWlmIChsaXN0X2hlYWQtPm5leHQpIHsKLQkJCUFDUElfTUVNX0ZSRUUgKHRhYmxlX2Rlc2MpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTFJFQURZX0VYSVNUUyk7CisJCQlBQ1BJX01FTV9GUkVFKHRhYmxlX2Rlc2MpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FMUkVBRFlfRVhJU1RTKTsKIAkJfQogCiAJCXRhYmxlX2Rlc2MtPm5leHQgPSBsaXN0X2hlYWQtPm5leHQ7CkBAIC0yOTAsOCArMjg2LDcgQEAKIAkJfQogCiAJCWxpc3RfaGVhZC0+Y291bnQrKzsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogTGluayB0aGUgbmV3IHRhYmxlIGluIHRvIHRoZSBsaXN0IG9mIHRhYmxlcyBvZiB0aGlzIHR5cGUuCiAJCSAqIEluc2VydCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LCBvcmRlciBJUyBJTVBPUlRBTlQuCkBAIC0zMDIsOCArMjk3LDcgQEAKIAogCQlpZiAoIWxpc3RfaGVhZC0+bmV4dCkgewogCQkJbGlzdF9oZWFkLT5uZXh0ID0gdGFibGVfZGVzYzsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCXRhYmxlX2Rlc2MtPm5leHQgPSBsaXN0X2hlYWQtPm5leHQ7CiAKIAkJCXdoaWxlICh0YWJsZV9kZXNjLT5uZXh0LT5uZXh0KSB7CkBAIC0zMTgsMTUgKzMxMiwxNCBAQAogCiAJLyogRmluaXNoIGluaXRpYWxpemF0aW9uIG9mIHRoZSB0YWJsZSBkZXNjcmlwdG9yICovCiAKLQl0YWJsZV9kZXNjLT50eXBlICAgICAgICAgICAgICAgID0gKHU4KSB0YWJsZV90eXBlOwotCXRhYmxlX2Rlc2MtPnBvaW50ZXIgICAgICAgICAgICAgPSB0YWJsZV9pbmZvLT5wb2ludGVyOwotCXRhYmxlX2Rlc2MtPmxlbmd0aCAgICAgICAgICAgICAgPSB0YWJsZV9pbmZvLT5sZW5ndGg7Ci0JdGFibGVfZGVzYy0+YWxsb2NhdGlvbiAgICAgICAgICA9IHRhYmxlX2luZm8tPmFsbG9jYXRpb247Ci0JdGFibGVfZGVzYy0+YW1sX3N0YXJ0ICAgICAgICAgICA9ICh1OCAqKSAodGFibGVfZGVzYy0+cG9pbnRlciArIDEpLAotCXRhYmxlX2Rlc2MtPmFtbF9sZW5ndGggICAgICAgICAgPSAodTMyKSAodGFibGVfZGVzYy0+bGVuZ3RoIC0KLQkJCSAodTMyKSBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwotCXRhYmxlX2Rlc2MtPnRhYmxlX2lkICAgICAgICAgICAgPSBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkICgKLQkJCSBBQ1BJX09XTkVSX1RZUEVfVEFCTEUpOworCXRhYmxlX2Rlc2MtPnR5cGUgPSAodTgpIHRhYmxlX3R5cGU7CisJdGFibGVfZGVzYy0+cG9pbnRlciA9IHRhYmxlX2luZm8tPnBvaW50ZXI7CisJdGFibGVfZGVzYy0+bGVuZ3RoID0gdGFibGVfaW5mby0+bGVuZ3RoOworCXRhYmxlX2Rlc2MtPmFsbG9jYXRpb24gPSB0YWJsZV9pbmZvLT5hbGxvY2F0aW9uOworCXRhYmxlX2Rlc2MtPmFtbF9zdGFydCA9ICh1OCAqKSAodGFibGVfZGVzYy0+cG9pbnRlciArIDEpLAorCSAgICB0YWJsZV9kZXNjLT5hbWxfbGVuZ3RoID0gKHUzMikgKHRhYmxlX2Rlc2MtPmxlbmd0aCAtCisJCQkJCSAgICAodTMyKSBzaXplb2Yoc3RydWN0CisJCQkJCQkJIGFjcGlfdGFibGVfaGVhZGVyKSk7CiAJdGFibGVfZGVzYy0+bG9hZGVkX2ludG9fbmFtZXNwYWNlID0gRkFMU0U7CiAKIAkvKgpAQCAtMzM0LDE4ICszMjcsMTggQEAKIAkgKiBuZXdseSBpbnN0YWxsZWQgdGFibGUKIAkgKi8KIAlpZiAoYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV90eXBlXS5nbG9iYWxfcHRyKSB7Ci0JCSooYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV90eXBlXS5nbG9iYWxfcHRyKSA9IHRhYmxlX2luZm8tPnBvaW50ZXI7CisJCSooYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV90eXBlXS5nbG9iYWxfcHRyKSA9CisJCSAgICB0YWJsZV9pbmZvLT5wb2ludGVyOwogCX0KIAogCS8qIFJldHVybiBEYXRhICovCiAKLQl0YWJsZV9pbmZvLT50YWJsZV9pZCAgICAgICAgPSB0YWJsZV9kZXNjLT50YWJsZV9pZDsKLQl0YWJsZV9pbmZvLT5pbnN0YWxsZWRfZGVzYyAgPSB0YWJsZV9kZXNjOworCXRhYmxlX2luZm8tPm93bmVyX2lkID0gdGFibGVfZGVzYy0+b3duZXJfaWQ7CisJdGFibGVfaW5mby0+aW5zdGFsbGVkX2Rlc2MgPSB0YWJsZV9kZXNjOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2RlbGV0ZV9hbGxfdGFibGVzCkBAIC0zNTgsMjMgKzM1MSwxOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfdGJfZGVsZXRlX2FsbF90YWJsZXMgKAotCXZvaWQpCit2b2lkIGFjcGlfdGJfZGVsZXRlX2FsbF90YWJsZXModm9pZCkKIHsKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHR5cGU7Ci0KKwlhY3BpX3RhYmxlX3R5cGUgdHlwZTsKIAogCS8qCiAJICogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBBQ1BJIHRhYmxlcwogCSAqIE1lbW9yeSBjYW4gZWl0aGVyIGJlIG1hcHBlZCBvciBhbGxvY2F0ZWQKIAkgKi8KIAlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTlVNX0FDUElfVEFCTEVfVFlQRVM7IHR5cGUrKykgewotCQlhY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZSAodHlwZSk7CisJCWFjcGlfdGJfZGVsZXRlX3RhYmxlc19ieV90eXBlKHR5cGUpOwogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZQpAQCAtMzg4LDIzICszNzcsMTkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZSAoCi0JYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0eXBlKQordm9pZCBhY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZShhY3BpX3RhYmxlX3R5cGUgdHlwZSkKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7CisJdTMyIGNvdW50OworCXUzMiBpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMiAoInRiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZSIsIHR5cGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoInRiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZSIsIHR5cGUpOwogCiAJaWYgKHR5cGUgPiBBQ1BJX1RBQkxFX01BWCkgewogCQlyZXR1cm5fVk9JRDsKIAl9CiAKLQlpZiAoQUNQSV9GQUlMVVJFIChhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX1RBQkxFUykpKSB7CisJaWYgKEFDUElfRkFJTFVSRShhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKSkpIHsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDQyLDIxICs0MjcsMjAgQEAKIAkgKiAxKSBHZXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QKIAkgKi8KIAl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbdHlwZV0ubmV4dDsKLQljb3VudCAgICAgPSBhY3BpX2dibF90YWJsZV9saXN0c1t0eXBlXS5jb3VudDsKKwljb3VudCA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW3R5cGVdLmNvdW50OwogCiAJLyoKIAkgKiAyKSBXYWxrIHRoZSBlbnRpcmUgbGlzdCwgZGVsZXRpbmcgYm90aCB0aGUgYWxsb2NhdGVkIHRhYmxlcwogCSAqICAgIGFuZCB0aGUgdGFibGUgZGVzY3JpcHRvcnMKIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQl0YWJsZV9kZXNjID0gYWNwaV90Yl91bmluc3RhbGxfdGFibGUgKHRhYmxlX2Rlc2MpOworCQl0YWJsZV9kZXNjID0gYWNwaV90Yl91bmluc3RhbGxfdGFibGUodGFibGVfZGVzYyk7CiAJfQogCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfVEFCTEVTKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUKQEAgLTQ3MCwxNSArNDU0LDEyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV90Yl9kZWxldGVfc2luZ2xlX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjKQordm9pZCBhY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYykKIHsKIAogCS8qIE11c3QgaGF2ZSBhIHZhbGlkIHRhYmxlIGRlc2NyaXB0b3IgYW5kIHBvaW50ZXIgKi8KIAotCWlmICgoIXRhYmxlX2Rlc2MpIHx8Ci0JCSAoIXRhYmxlX2Rlc2MtPnBvaW50ZXIpKSB7CisJaWYgKCghdGFibGVfZGVzYykgfHwgKCF0YWJsZV9kZXNjLT5wb2ludGVyKSkgewogCQlyZXR1cm47CiAJfQogCkBAIC00OTAsMTIgKzQ3MSwxMiBAQAogCiAJY2FzZSBBQ1BJX01FTV9BTExPQ0FURUQ6CiAKLQkJQUNQSV9NRU1fRlJFRSAodGFibGVfZGVzYy0+cG9pbnRlcik7CisJCUFDUElfTUVNX0ZSRUUodGFibGVfZGVzYy0+cG9pbnRlcik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX01FTV9NQVBQRUQ6CiAKLQkJYWNwaV9vc191bm1hcF9tZW1vcnkgKHRhYmxlX2Rlc2MtPnBvaW50ZXIsIHRhYmxlX2Rlc2MtPmxlbmd0aCk7CisJCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlX2Rlc2MtPnBvaW50ZXIsIHRhYmxlX2Rlc2MtPmxlbmd0aCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTUwMyw3ICs0ODQsNiBAQAogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3VuaW5zdGFsbF90YWJsZQpAQCAtNTE4LDI2ICs0OTgsMjIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICoKLWFjcGlfdGJfdW5pbnN0YWxsX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjKQorc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqYWNwaV90Yl91bmluc3RhbGxfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYworCQkJCQkJKnRhYmxlX2Rlc2MpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqbmV4dF9kZXNjOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKm5leHRfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJ0Yl91bmluc3RhbGxfdGFibGUiLCB0YWJsZV9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJ0Yl91bmluc3RhbGxfdGFibGUiLCB0YWJsZV9kZXNjKTsKIAogCWlmICghdGFibGVfZGVzYykgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAkvKiBVbmxpbmsgdGhlIGRlc2NyaXB0b3IgZnJvbSB0aGUgZG91Ymx5IGxpbmtlZCBsaXN0ICovCiAKIAlpZiAodGFibGVfZGVzYy0+cHJldikgewogCQl0YWJsZV9kZXNjLT5wcmV2LT5uZXh0ID0gdGFibGVfZGVzYy0+bmV4dDsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogSXMgZmlyc3Qgb24gbGlzdCwgdXBkYXRlIGxpc3QgaGVhZCAqLwogCiAJCWFjcGlfZ2JsX3RhYmxlX2xpc3RzW3RhYmxlX2Rlc2MtPnR5cGVdLm5leHQgPSB0YWJsZV9kZXNjLT5uZXh0OwpAQCAtNTQ5LDE2ICs1MjUsMTQgQEAKIAogCS8qIEZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSB0YWJsZSBpdHNlbGYgKi8KIAotCWFjcGlfdGJfZGVsZXRlX3NpbmdsZV90YWJsZSAodGFibGVfZGVzYyk7CisJYWNwaV90Yl9kZWxldGVfc2luZ2xlX3RhYmxlKHRhYmxlX2Rlc2MpOwogCiAJLyogRnJlZSB0aGUgdGFibGUgZGVzY3JpcHRvciAqLwogCiAJbmV4dF9kZXNjID0gdGFibGVfZGVzYy0+bmV4dDsKLQlBQ1BJX01FTV9GUkVFICh0YWJsZV9kZXNjKTsKKwlBQ1BJX01FTV9GUkVFKHRhYmxlX2Rlc2MpOwogCiAJLyogUmV0dXJuIHBvaW50ZXIgdG8gdGhlIG5leHQgZGVzY3JpcHRvciAqLwogCi0JcmV0dXJuX1BUUiAobmV4dF9kZXNjKTsKKwlyZXR1cm5fUFRSKG5leHRfZGVzYyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJyc2R0LmMKaW5kZXggYjdmZmUzOS4uYWQwMjUyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jCkBAIC00MSwxNCArNDEsMTEgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJ0YnJzZHQiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJ0YnJzZHQiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYxLDE4ICs1OCwxMyBAQAogICogREVTQ1JJUFRJT046IExvYWQgYW5kIHZhbGlkYXRlIHRoZSBSU0RQIChwdHIpIGFuZCBSU0RUICh0YWJsZSkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV90Yl92ZXJpZnlfcnNkcCAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcykKK2FjcGlfc3RhdHVzIGFjcGlfdGJfdmVyaWZ5X3JzZHAoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcykKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgIHRhYmxlX2luZm87Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IHJzZHBfZGVzY3JpcHRvciAgICAgICAgICAqcnNkcDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHRhYmxlX2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgKnJzZHA7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl92ZXJpZnlfcnNkcCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfdmVyaWZ5X3JzZHAiKTsKIAogCXN3aXRjaCAoYWRkcmVzcy0+cG9pbnRlcl90eXBlKSB7CiAJY2FzZSBBQ1BJX0xPR0lDQUxfUE9JTlRFUjoKQEAgLTg0LDczICs3Niw1MyBAQAogCQkvKgogCQkgKiBPYnRhaW4gYWNjZXNzIHRvIHRoZSBSU0RQIHN0cnVjdHVyZQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsLAotCQkJCSBzaXplb2YgKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpLAotCQkJCQkJICAgKHZvaWQgKikgJnJzZHApOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeShhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpLAorCQkJCQkgICAgKHZvaWQgKikmcnNkcCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JLyoKLQkgKiAgVGhlIHNpZ25hdHVyZSBhbmQgY2hlY2tzdW0gbXVzdCBib3RoIGJlIGNvcnJlY3QKLQkgKi8KLQlpZiAoQUNQSV9TVFJOQ01QICgoY2hhciAqKSByc2RwLCBSU0RQX1NJRywgc2l6ZW9mIChSU0RQX1NJRyktMSkgIT0gMCkgewotCQkvKiBOb3BlLCBCQUQgU2lnbmF0dXJlICovCisJLyogVmVyaWZ5IFJTRFAgc2lnbmF0dXJlIGFuZCBjaGVja3N1bSAqLwogCi0JCXN0YXR1cyA9IEFFX0JBRF9TSUdOQVRVUkU7CisJc3RhdHVzID0gYWNwaV90Yl92YWxpZGF0ZV9yc2RwKHJzZHApOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JLyogQ2hlY2sgdGhlIHN0YW5kYXJkIGNoZWNrc3VtICovCi0KLQlpZiAoYWNwaV90Yl9jaGVja3N1bSAocnNkcCwgQUNQSV9SU0RQX0NIRUNLU1VNX0xFTkdUSCkgIT0gMCkgewotCQlzdGF0dXMgPSBBRV9CQURfQ0hFQ0tTVU07Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBDaGVjayBleHRlbmRlZCBjaGVja3N1bSBpZiB0YWJsZSB2ZXJzaW9uID49IDIgKi8KLQotCWlmIChyc2RwLT5yZXZpc2lvbiA+PSAyKSB7Ci0JCWlmIChhY3BpX3RiX2NoZWNrc3VtIChyc2RwLCBBQ1BJX1JTRFBfWENIRUNLU1VNX0xFTkdUSCkgIT0gMCkgewotCQkJc3RhdHVzID0gQUVfQkFEX0NIRUNLU1VNOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JfQotCiAJLyogVGhlIFJTRFAgc3VwcGxpZWQgaXMgT0sgKi8KIAotCXRhYmxlX2luZm8ucG9pbnRlciAgICAgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsIHJzZHApOwotCXRhYmxlX2luZm8ubGVuZ3RoICAgICAgPSBzaXplb2YgKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpOwotCXRhYmxlX2luZm8uYWxsb2NhdGlvbiAgPSBBQ1BJX01FTV9NQVBQRUQ7CisJdGFibGVfaW5mby5wb2ludGVyID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsIHJzZHApOworCXRhYmxlX2luZm8ubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpOworCXRhYmxlX2luZm8uYWxsb2NhdGlvbiA9IEFDUElfTUVNX01BUFBFRDsKIAogCS8qIFNhdmUgdGhlIHRhYmxlIHBvaW50ZXJzIGFuZCBhbGxvY2F0aW9uIGluZm8gKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yIChBQ1BJX1RBQkxFX1JTRFAsICZ0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV90Yl9pbml0X3RhYmxlX2Rlc2NyaXB0b3IoQUNQSV9UQUJMRV9SU0RQLCAmdGFibGVfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBTYXZlIHRoZSBSU0RQIGluIGEgZ2xvYmFsIGZvciBlYXN5IGFjY2VzcyAqLwogCi0JYWNwaV9nYmxfUlNEUCA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IsIHRhYmxlX2luZm8ucG9pbnRlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotCisJYWNwaV9nYmxfUlNEUCA9CisJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IHJzZHBfZGVzY3JpcHRvciwgdGFibGVfaW5mby5wb2ludGVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAogCS8qIEVycm9yIGV4aXQgKi8KLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCiAJaWYgKGFjcGlfZ2JsX3RhYmxlX2ZsYWdzICYgQUNQSV9QSFlTSUNBTF9QT0lOVEVSKSB7Ci0JCWFjcGlfb3NfdW5tYXBfbWVtb3J5IChyc2RwLCBzaXplb2YgKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpKTsKKwkJYWNwaV9vc191bm1hcF9tZW1vcnkocnNkcCwgc2l6ZW9mKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpKTsKIAl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2V0X3JzZHRfYWRkcmVzcwpAQCAtMTU5LDM1ICsxMzEsMzUgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZSwgQWRkcmVzcwogICoKLSAqIERFU0NSSVBUSU9OOiBFeHRyYWN0IHRoZSBhZGRyZXNzIG9mIHRoZSBSU0RUIG9yIFhTRFQsIGRlcGVuZGluZyBvbiB0aGUKLSAqICAgICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBSU0RQCisgKiBERVNDUklQVElPTjogRXh0cmFjdCB0aGUgYWRkcmVzcyBvZiBlaXRoZXIgdGhlIFJTRFQgb3IgWFNEVCwgZGVwZW5kaW5nIG9uIHRoZQorICogICAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIFJTRFAgYW5kIHdoZXRoZXIgdGhlIFhTRFQgcG9pbnRlciBpcyB2YWxpZAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfdGJfZ2V0X3JzZHRfYWRkcmVzcyAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqb3V0X2FkZHJlc3MpCit2b2lkIGFjcGlfdGJfZ2V0X3JzZHRfYWRkcmVzcyhzdHJ1Y3QgYWNwaV9wb2ludGVyICpvdXRfYWRkcmVzcykKIHsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCisJb3V0X2FkZHJlc3MtPnBvaW50ZXJfdHlwZSA9CisJICAgIGFjcGlfZ2JsX3RhYmxlX2ZsYWdzIHwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkc7CiAKLQlvdXRfYWRkcmVzcy0+cG9pbnRlcl90eXBlID0gYWNwaV9nYmxfdGFibGVfZmxhZ3MgfCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORzsKKwkvKiBVc2UgWFNEVCBpZiBpdCBpcyBwcmVzZW50ICovCiAKLQkvKgotCSAqIEZvciBSU0RQIHJldmlzaW9uIDAgb3IgMSwgd2UgdXNlIHRoZSBSU0RULgotCSAqIEZvciBSU0RQIHJldmlzaW9uIDIgKGFuZCBhYm92ZSksIHdlIHVzZSB0aGUgWFNEVAotCSAqLwotCWlmIChhY3BpX2dibF9SU0RQLT5yZXZpc2lvbiA8IDIpIHsKLQkJb3V0X2FkZHJlc3MtPnBvaW50ZXIudmFsdWUgPSBhY3BpX2dibF9SU0RQLT5yc2R0X3BoeXNpY2FsX2FkZHJlc3M7Ci0JfQotCWVsc2UgeworCWlmICgoYWNwaV9nYmxfUlNEUC0+cmV2aXNpb24gPj0gMikgJiYKKwkgICAgYWNwaV9nYmxfUlNEUC0+eHNkdF9waHlzaWNhbF9hZGRyZXNzKSB7CiAJCW91dF9hZGRyZXNzLT5wb2ludGVyLnZhbHVlID0KLQkJCWFjcGlfZ2JsX1JTRFAtPnhzZHRfcGh5c2ljYWxfYWRkcmVzczsKKwkJICAgIGFjcGlfZ2JsX1JTRFAtPnhzZHRfcGh5c2ljYWxfYWRkcmVzczsKKwkJYWNwaV9nYmxfcm9vdF90YWJsZV90eXBlID0gQUNQSV9UQUJMRV9UWVBFX1hTRFQ7CisJfSBlbHNlIHsKKwkJLyogTm8gWFNEVCwgdXNlIHRoZSBSU0RUICovCisKKwkJb3V0X2FkZHJlc3MtPnBvaW50ZXIudmFsdWUgPQorCQkgICAgYWNwaV9nYmxfUlNEUC0+cnNkdF9waHlzaWNhbF9hZGRyZXNzOworCQlhY3BpX2dibF9yb290X3RhYmxlX3R5cGUgPSBBQ1BJX1RBQkxFX1RZUEVfUlNEVDsKIAl9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl92YWxpZGF0ZV9yc2R0CkBAIC0yMDAsNTAgKzE3Miw0MyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX3ZhbGlkYXRlX3JzZHQgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlX3B0cikKK2FjcGlfc3RhdHVzIGFjcGlfdGJfdmFsaWRhdGVfcnNkdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX3B0cikKIHsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vX21hdGNoOworCWludCBub19tYXRjaDsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgidGJfdmFsaWRhdGVfcnNkdCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJ0Yl92YWxpZGF0ZV9yc2R0Iik7CiAKIAkvKgotCSAqIEZvciBSU0RQIHJldmlzaW9uIDAgb3IgMSwgd2UgdXNlIHRoZSBSU0RULgotCSAqIEZvciBSU0RQIHJldmlzaW9uIDIgYW5kIGFib3ZlLCB3ZSB1c2UgdGhlIFhTRFQKKwkgKiBTZWFyY2ggZm9yIGFwcHJvcHJpYXRlIHNpZ25hdHVyZSwgUlNEVCBvciBYU0RUCiAJICovCi0JaWYgKGFjcGlfZ2JsX1JTRFAtPnJldmlzaW9uIDwgMikgewotCQlub19tYXRjaCA9IEFDUElfU1RSTkNNUCAoKGNoYXIgKikgdGFibGVfcHRyLCBSU0RUX1NJRywKLQkJCQkgIHNpemVvZiAoUlNEVF9TSUcpIC0xKTsKLQl9Ci0JZWxzZSB7Ci0JCW5vX21hdGNoID0gQUNQSV9TVFJOQ01QICgoY2hhciAqKSB0YWJsZV9wdHIsIFhTRFRfU0lHLAotCQkJCSAgc2l6ZW9mIChYU0RUX1NJRykgLTEpOworCWlmIChhY3BpX2dibF9yb290X3RhYmxlX3R5cGUgPT0gQUNQSV9UQUJMRV9UWVBFX1JTRFQpIHsKKwkJbm9fbWF0Y2ggPSBBQ1BJX1NUUk5DTVAoKGNoYXIgKil0YWJsZV9wdHIsIFJTRFRfU0lHLAorCQkJCQlzaXplb2YoUlNEVF9TSUcpIC0gMSk7CisJfSBlbHNlIHsKKwkJbm9fbWF0Y2ggPSBBQ1BJX1NUUk5DTVAoKGNoYXIgKil0YWJsZV9wdHIsIFhTRFRfU0lHLAorCQkJCQlzaXplb2YoWFNEVF9TSUcpIC0gMSk7CiAJfQogCiAJaWYgKG5vX21hdGNoKSB7CiAJCS8qIEludmFsaWQgUlNEVCBvciBYU0RUIHNpZ25hdHVyZSAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkiSW52YWxpZCBzaWduYXR1cmUgd2hlcmUgUlNEUCBpbmRpY2F0ZXMgUlNEVC9YU0RUIHNob3VsZCBiZSBsb2NhdGVkXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52YWxpZCBzaWduYXR1cmUgd2hlcmUgUlNEUCBpbmRpY2F0ZXMgUlNEVC9YU0RUIHNob3VsZCBiZSBsb2NhdGVkXG4iKSk7CiAKLQkJQUNQSV9EVU1QX0JVRkZFUiAoYWNwaV9nYmxfUlNEUCwgMjApOworCQlBQ1BJX0RVTVBfQlVGRkVSKGFjcGlfZ2JsX1JTRFAsIDIwKTsKIAotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfRVJST1IsCi0JCQkiUlNEVC9YU0RUIHNpZ25hdHVyZSBhdCAlWCAoJXApIGlzIGludmFsaWRcbiIsCi0JCQlhY3BpX2dibF9SU0RQLT5yc2R0X3BoeXNpY2FsX2FkZHJlc3MsCi0JCQkodm9pZCAqKSAoYWNwaV9uYXRpdmVfdWludCkgYWNwaV9nYmxfUlNEUC0+cnNkdF9waHlzaWNhbF9hZGRyZXNzKSk7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgICAgICJSU0RUL1hTRFQgc2lnbmF0dXJlIGF0ICVYICglcCkgaXMgaW52YWxpZFxuIiwKKwkJCQkgICAgICBhY3BpX2dibF9SU0RQLT5yc2R0X3BoeXNpY2FsX2FkZHJlc3MsCisJCQkJICAgICAgKHZvaWQgKikoYWNwaV9uYXRpdmVfdWludCkgYWNwaV9nYmxfUlNEUC0+CisJCQkJICAgICAgcnNkdF9waHlzaWNhbF9hZGRyZXNzKSk7CiAKLQkJaWYgKGFjcGlfZ2JsX1JTRFAtPnJldmlzaW9uIDwgMikgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTG9va2luZyBmb3IgUlNEVCAoUlNEUC0+UmV2IDwgMilcbiIpKQotCQl9Ci0JCWVsc2UgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTG9va2luZyBmb3IgWFNEVCAoUlNEUC0+UmV2ID49IDIpXG4iKSkKKwkJaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfdHlwZSA9PSBBQ1BJX1RBQkxFX1RZUEVfUlNEVCkgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJMb29raW5nIGZvciBSU0RUXG4iKSkKKwkJfSBlbHNlIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiTG9va2luZyBmb3IgWFNEVFxuIikpCiAJCX0KIAotCQlBQ1BJX0RVTVBfQlVGRkVSICgoY2hhciAqKSB0YWJsZV9wdHIsIDQ4KTsKKwkJQUNQSV9EVU1QX0JVRkZFUigoY2hhciAqKXRhYmxlX3B0ciwgNDgpOwogCiAJCXJldHVybiAoQUVfQkFEX1NJR05BVFVSRSk7CiAJfQpAQCAtMjUxLDcgKzIxNiw2IEBACiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9nZXRfdGFibGVfcnNkdApAQCAtMjY0LDY2ICsyMjgsNjEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGFibGVfcnNkdCAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfdGJfZ2V0X3RhYmxlX3JzZHQodm9pZCkKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgIHRhYmxlX2luZm87Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICBhZGRyZXNzOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgdGFibGVfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfcG9pbnRlciBhZGRyZXNzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidGJfZ2V0X3RhYmxlX3JzZHQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2dldF90YWJsZV9yc2R0Iik7CiAKIAkvKiBHZXQgdGhlIFJTRFQvWFNEVCB2aWEgdGhlIFJTRFAgKi8KIAotCWFjcGlfdGJfZ2V0X3JzZHRfYWRkcmVzcyAoJmFkZHJlc3MpOworCWFjcGlfdGJfZ2V0X3JzZHRfYWRkcmVzcygmYWRkcmVzcyk7CiAKIAl0YWJsZV9pbmZvLnR5cGUgPSBBQ1BJX1RBQkxFX1hTRFQ7Ci0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGUgKCZhZGRyZXNzLCAmdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCBnZXQgdGhlIFJTRFQvWFNEVCwgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZSgmYWRkcmVzcywgJnRhYmxlX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkNvdWxkIG5vdCBnZXQgdGhlIFJTRFQvWFNEVCwgJXNcbiIsCisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJIlJTRFAgbG9jYXRlZCBhdCAlcCwgcG9pbnRzIHRvIFJTRFQgcGh5c2ljYWw9JTguOFglOC44WCBcbiIsCi0JCWFjcGlfZ2JsX1JTRFAsCi0JCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcy5wb2ludGVyLnZhbHVlKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIlJTRFAgbG9jYXRlZCBhdCAlcCwgcG9pbnRzIHRvIFJTRFQgcGh5c2ljYWw9JTguOFglOC44WCBcbiIsCisJCQkgIGFjcGlfZ2JsX1JTRFAsCisJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzLnBvaW50ZXIudmFsdWUpKSk7CiAKIAkvKiBDaGVjayB0aGUgUlNEVCBvciBYU0RUIHNpZ25hdHVyZSAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl92YWxpZGF0ZV9yc2R0ICh0YWJsZV9pbmZvLnBvaW50ZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfdmFsaWRhdGVfcnNkdCh0YWJsZV9pbmZvLnBvaW50ZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBHZXQgdGhlIG51bWJlciBvZiB0YWJsZXMgZGVmaW5lZCBpbiB0aGUgUlNEVCBvciBYU0RUICovCiAKLQlhY3BpX2dibF9yc2R0X3RhYmxlX2NvdW50ID0gYWNwaV90Yl9nZXRfdGFibGVfY291bnQgKGFjcGlfZ2JsX1JTRFAsCi0JCQkgIHRhYmxlX2luZm8ucG9pbnRlcik7CisJYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudCA9IGFjcGlfdGJfZ2V0X3RhYmxlX2NvdW50KGFjcGlfZ2JsX1JTRFAsCisJCQkJCQkJICAgIHRhYmxlX2luZm8ucG9pbnRlcik7CiAKIAkvKiBDb252ZXJ0IGFuZC9vciBjb3B5IHRvIGFuIFhTRFQgc3RydWN0dXJlICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2NvbnZlcnRfdG9feHNkdCAoJnRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfY29udmVydF90b194c2R0KCZ0YWJsZV9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogU2F2ZSB0aGUgdGFibGUgcG9pbnRlcnMgYW5kIGFsbG9jYXRpb24gaW5mbyAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9pbml0X3RhYmxlX2Rlc2NyaXB0b3IgKEFDUElfVEFCTEVfWFNEVCwgJnRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yKEFDUElfVEFCTEVfWFNEVCwgJnRhYmxlX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlhY3BpX2dibF9YU0RUID0gQUNQSV9DQVNUX1BUUiAoWFNEVF9ERVNDUklQVE9SLCB0YWJsZV9pbmZvLnBvaW50ZXIpOworCWFjcGlfZ2JsX1hTRFQgPSBBQ1BJX0NBU1RfUFRSKFhTRFRfREVTQ1JJUFRPUiwgdGFibGVfaW5mby5wb2ludGVyKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJYU0RUIGxvY2F0ZWQgYXQgJXBcbiIsIGFjcGlfZ2JsX1hTRFQpKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiWFNEVCBsb2NhdGVkIGF0ICVwXG4iLCBhY3BpX2dibF9YU0RUKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnV0aWxzLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYwppbmRleCBlNjlkMDFkLi40YjJmYmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYwpAQCAtNDEsMjMgKzQxLDg0IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidGJ1dGlscyIpCitBQ1BJX01PRFVMRV9OQU1FKCJ0YnV0aWxzIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCiAjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2hhbmRsZV90b19vYmplY3QgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfaWQsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqKnRhYmxlX2Rlc2MpOworYWNwaV90Yl9oYW5kbGVfdG9fb2JqZWN0KHUxNiB0YWJsZV9pZCwgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqKnRhYmxlX2Rlc2MpOwogI2VuZGlmCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfaXNfdGFibGVfaW5zdGFsbGVkCisgKgorICogUEFSQU1FVEVSUzogIG5ld190YWJsZV9kZXNjICAgICAgLSBEZXNjcmlwdG9yIGZvciBuZXcgdGFibGUgYmVpbmcgaW5zdGFsbGVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cyAtIEFFX0FMUkVBRFlfRVhJU1RTIGlmIHRoZSB0YWJsZSBpcyBhbHJlYWR5IGluc3RhbGxlZAorICoKKyAqIERFU0NSSVBUSU9OOiBEZXRlcm1pbmUgaWYgYW4gQUNQSSB0YWJsZSBpcyBhbHJlYWR5IGluc3RhbGxlZAorICoKKyAqIE1VVEVYOiAgICAgICBUYWJsZSBkYXRhIHN0cnVjdHVyZXMgc2hvdWxkIGJlIGxvY2tlZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfdGJfaXNfdGFibGVfaW5zdGFsbGVkKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKm5ld190YWJsZV9kZXNjKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9pc190YWJsZV9pbnN0YWxsZWQiKTsKKworCS8qIEdldCB0aGUgbGlzdCBkZXNjcmlwdG9yIGFuZCBmaXJzdCB0YWJsZSBkZXNjcmlwdG9yICovCisKKwl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbbmV3X3RhYmxlX2Rlc2MtPnR5cGVdLm5leHQ7CisKKwkvKiBFeGFtaW5lIGFsbCBpbnN0YWxsZWQgdGFibGVzIG9mIHRoaXMgdHlwZSAqLworCisJd2hpbGUgKHRhYmxlX2Rlc2MpIHsKKwkJLyoKKwkJICogSWYgdGhlIHRhYmxlIGxlbmd0aHMgbWF0Y2gsIHBlcmZvcm0gYSBmdWxsIGJ5dGV3aXNlIGNvbXBhcmUuIFRoaXMKKwkJICogbWVhbnMgdGhhdCB3ZSB3aWxsIGFsbG93IHRhYmxlcyB3aXRoIGR1cGxpY2F0ZSBvZW1fdGFibGVfaWQocyksIGFzCisJCSAqIGxvbmcgYXMgdGhlIHRhYmxlcyBhcmUgZGlmZmVyZW50IGluIHNvbWUgd2F5LgorCQkgKgorCQkgKiBDaGVja2luZyBpZiB0aGUgdGFibGUgaGFzIGJlZW4gbG9hZGVkIGludG8gdGhlIG5hbWVzcGFjZSBtZWFucyB0aGF0CisJCSAqIHdlIGRvbid0IGNoZWNrIGZvciBkdXBsaWNhdGUgdGFibGVzIGR1cmluZyB0aGUgaW5pdGlhbCBpbnN0YWxsYXRpb24KKwkJICogb2YgdGFibGVzIHdpdGhpbiB0aGUgUlNEVC9YU0RULgorCQkgKi8KKwkJaWYgKCh0YWJsZV9kZXNjLT5sb2FkZWRfaW50b19uYW1lc3BhY2UpICYmCisJCSAgICAodGFibGVfZGVzYy0+cG9pbnRlci0+bGVuZ3RoID09CisJCSAgICAgbmV3X3RhYmxlX2Rlc2MtPnBvaW50ZXItPmxlbmd0aCkKKwkJICAgICYmCisJCSAgICAoIUFDUElfTUVNQ01QCisJCSAgICAgKChjb25zdCBjaGFyICopdGFibGVfZGVzYy0+cG9pbnRlciwKKwkJICAgICAgKGNvbnN0IGNoYXIgKiluZXdfdGFibGVfZGVzYy0+cG9pbnRlciwKKwkJICAgICAgKGFjcGlfc2l6ZSkgbmV3X3RhYmxlX2Rlc2MtPnBvaW50ZXItPmxlbmd0aCkpKSB7CisJCQkvKiBNYXRjaDogdGhpcyB0YWJsZSBpcyBhbHJlYWR5IGluc3RhbGxlZCAqLworCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1RBQkxFUywKKwkJCQkJICAiVGFibGUgWyU0LjRzXSBhbHJlYWR5IGluc3RhbGxlZDogUmV2ICVYIG9lbV90YWJsZV9pZCBbJTguOHNdXG4iLAorCQkJCQkgIG5ld190YWJsZV9kZXNjLT5wb2ludGVyLT5zaWduYXR1cmUsCisJCQkJCSAgbmV3X3RhYmxlX2Rlc2MtPnBvaW50ZXItPnJldmlzaW9uLAorCQkJCQkgIG5ld190YWJsZV9kZXNjLT5wb2ludGVyLT4KKwkJCQkJICBvZW1fdGFibGVfaWQpKTsKKworCQkJbmV3X3RhYmxlX2Rlc2MtPm93bmVyX2lkID0gdGFibGVfZGVzYy0+b3duZXJfaWQ7CisJCQluZXdfdGFibGVfZGVzYy0+aW5zdGFsbGVkX2Rlc2MgPSB0YWJsZV9kZXNjOworCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQUxSRUFEWV9FWElTVFMpOworCQl9CisKKwkJLyogR2V0IG5leHQgdGFibGUgb24gdGhlIGxpc3QgKi8KKworCQl0YWJsZV9kZXNjID0gdGFibGVfZGVzYy0+bmV4dDsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTgwLDU3ICsxNDEsNTUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX3ZhbGlkYXRlX3RhYmxlX2hlYWRlciAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGVfaGVhZGVyKQorYWNwaV90Yl92YWxpZGF0ZV90YWJsZV9oZWFkZXIoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9oZWFkZXIpCiB7Ci0JYWNwaV9uYW1lICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmU7CisJYWNwaV9uYW1lIHNpZ25hdHVyZTsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgidGJfdmFsaWRhdGVfdGFibGVfaGVhZGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoInRiX3ZhbGlkYXRlX3RhYmxlX2hlYWRlciIpOwogCiAJLyogVmVyaWZ5IHRoYXQgdGhpcyBpcyBhIHZhbGlkIGFkZHJlc3MgKi8KIAotCWlmICghYWNwaV9vc19yZWFkYWJsZSAodGFibGVfaGVhZGVyLCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIkNhbm5vdCByZWFkIHRhYmxlIGhlYWRlciBhdCAlcFxuIiwgdGFibGVfaGVhZGVyKSk7CisJaWYgKCFhY3BpX29zX3JlYWRhYmxlKHRhYmxlX2hlYWRlciwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQ2Fubm90IHJlYWQgdGFibGUgaGVhZGVyIGF0ICVwXG4iLAorCQkJCSAgdGFibGVfaGVhZGVyKSk7CiAKIAkJcmV0dXJuIChBRV9CQURfQUREUkVTUyk7CiAJfQogCiAJLyogRW5zdXJlIHRoYXQgdGhlIHNpZ25hdHVyZSBpcyA0IEFTQ0lJIGNoYXJhY3RlcnMgKi8KIAotCUFDUElfTU9WRV8zMl9UT18zMiAoJnNpZ25hdHVyZSwgdGFibGVfaGVhZGVyLT5zaWduYXR1cmUpOwotCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUgKHNpZ25hdHVyZSkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiVGFibGUgc2lnbmF0dXJlIGF0ICVwIFslcF0gaGFzIGludmFsaWQgY2hhcmFjdGVyc1xuIiwKLQkJCXRhYmxlX2hlYWRlciwgJnNpZ25hdHVyZSkpOworCUFDUElfTU9WRV8zMl9UT18zMigmc2lnbmF0dXJlLCB0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSk7CisJaWYgKCFhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZShzaWduYXR1cmUpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVGFibGUgc2lnbmF0dXJlIGF0ICVwIFslcF0gaGFzIGludmFsaWQgY2hhcmFjdGVyc1xuIiwKKwkJCQkgIHRhYmxlX2hlYWRlciwgJnNpZ25hdHVyZSkpOwogCi0JCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgiSW52YWxpZCB0YWJsZSBzaWduYXR1cmUgZm91bmQ6IFslNC40c11cbiIsCi0JCQkoY2hhciAqKSAmc2lnbmF0dXJlKSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJJbnZhbGlkIHRhYmxlIHNpZ25hdHVyZSBmb3VuZDogWyU0LjRzXVxuIiwKKwkJCQkgICAgIChjaGFyICopJnNpZ25hdHVyZSkpOwogCi0JCUFDUElfRFVNUF9CVUZGRVIgKHRhYmxlX2hlYWRlciwgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJQUNQSV9EVU1QX0JVRkZFUih0YWJsZV9oZWFkZXIsCisJCQkJIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAkJcmV0dXJuIChBRV9CQURfU0lHTkFUVVJFKTsKIAl9CiAKIAkvKiBWYWxpZGF0ZSB0aGUgdGFibGUgbGVuZ3RoICovCiAKLQlpZiAodGFibGVfaGVhZGVyLT5sZW5ndGggPCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiSW52YWxpZCBsZW5ndGggaW4gdGFibGUgaGVhZGVyICVwIG5hbWUgJTQuNHNcbiIsCi0JCQl0YWJsZV9oZWFkZXIsIChjaGFyICopICZzaWduYXR1cmUpKTsKKwlpZiAodGFibGVfaGVhZGVyLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkludmFsaWQgbGVuZ3RoIGluIHRhYmxlIGhlYWRlciAlcCBuYW1lICU0LjRzXG4iLAorCQkJCSAgdGFibGVfaGVhZGVyLCAoY2hhciAqKSZzaWduYXR1cmUpKTsKIAotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIkludmFsaWQgdGFibGUgaGVhZGVyIGxlbmd0aCAoMHglWCkgZm91bmRcbiIsCi0JCQkodTMyKSB0YWJsZV9oZWFkZXItPmxlbmd0aCkpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiSW52YWxpZCB0YWJsZSBoZWFkZXIgbGVuZ3RoICgweCVYKSBmb3VuZFxuIiwgKHUzMikgdGFibGVfaGVhZGVyLT5sZW5ndGgpKTsKIAotCQlBQ1BJX0RVTVBfQlVGRkVSICh0YWJsZV9oZWFkZXIsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCUFDUElfRFVNUF9CVUZGRVIodGFibGVfaGVhZGVyLAorCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CiAJCXJldHVybiAoQUVfQkFEX0hFQURFUik7CiAJfQogCiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl92ZXJpZnlfdGFibGVfY2hlY2tzdW0KQEAgLTE0NSwzNyArMjA0LDMxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl92ZXJpZnlfdGFibGVfY2hlY2tzdW0gKAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlX2hlYWRlcikKK2FjcGlfdGJfdmVyaWZ5X3RhYmxlX2NoZWNrc3VtKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqIHRhYmxlX2hlYWRlcikKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJdTggY2hlY2tzdW07CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl92ZXJpZnlfdGFibGVfY2hlY2tzdW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX3ZlcmlmeV90YWJsZV9jaGVja3N1bSIpOwogCiAJLyogQ29tcHV0ZSB0aGUgY2hlY2tzdW0gb24gdGhlIHRhYmxlICovCiAKLQljaGVja3N1bSA9IGFjcGlfdGJfY2hlY2tzdW0gKHRhYmxlX2hlYWRlciwgdGFibGVfaGVhZGVyLT5sZW5ndGgpOworCWNoZWNrc3VtID0KKwkgICAgYWNwaV90Yl9nZW5lcmF0ZV9jaGVja3N1bSh0YWJsZV9oZWFkZXIsIHRhYmxlX2hlYWRlci0+bGVuZ3RoKTsKIAogCS8qIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uICovCiAKIAlpZiAoY2hlY2tzdW0pIHsKLQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKAotCQkJIkludmFsaWQgY2hlY2tzdW0gaW4gdGFibGUgWyU0LjRzXSAoJTAyWCwgc3VtICUwMlggaXMgbm90IHplcm8pXG4iLAotCQkJdGFibGVfaGVhZGVyLT5zaWduYXR1cmUsICh1MzIpIHRhYmxlX2hlYWRlci0+Y2hlY2tzdW0sCi0JCQkodTMyKSBjaGVja3N1bSkpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiSW52YWxpZCBjaGVja3N1bSBpbiB0YWJsZSBbJTQuNHNdICglMDJYLCBzdW0gJTAyWCBpcyBub3QgemVybylcbiIsIHRhYmxlX2hlYWRlci0+c2lnbmF0dXJlLCAodTMyKSB0YWJsZV9oZWFkZXItPmNoZWNrc3VtLCAodTMyKSBjaGVja3N1bSkpOwogCiAJCXN0YXR1cyA9IEFFX0JBRF9DSEVDS1NVTTsKIAl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfY2hlY2tzdW0KKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dlbmVyYXRlX2NoZWNrc3VtCiAgKgogICogUEFSQU1FVEVSUzogIEJ1ZmZlciAgICAgICAgICAgICAgLSBCdWZmZXIgdG8gY2hlY2tzdW0KICAqICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgICAgIC0gU2l6ZSBvZiB0aGUgYnVmZmVyCkBAIC0xODYsMTUgKzIzOSwxMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4Ci1hY3BpX3RiX2NoZWNrc3VtICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpCit1OCBhY3BpX3RiX2dlbmVyYXRlX2NoZWNrc3VtKHZvaWQgKmJ1ZmZlciwgdTMyIGxlbmd0aCkKIHsKLQljb25zdCB1OCAgICAgICAgICAgICAgICAgICAgICAgICpsaW1pdDsKLQljb25zdCB1OCAgICAgICAgICAgICAgICAgICAgICAgICpyb3ZlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IDA7Ci0KKwljb25zdCB1OCAqbGltaXQ7CisJY29uc3QgdTggKnJvdmVyOworCXU4IHN1bSA9IDA7CiAKIAlpZiAoYnVmZmVyICYmIGxlbmd0aCkgewogCQkvKiAgQnVmZmVyIGFuZCBMZW5ndGggYXJlIHZhbGlkICAgKi8KQEAgLTIwOCw3ICsyNTcsNiBAQAogCXJldHVybiAoc3VtKTsKIH0KIAotCiAjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjI0LDE2ICsyNzIsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2hhbmRsZV90b19vYmplY3QgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfaWQsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqKnJldHVybl90YWJsZV9kZXNjKQorYWNwaV90Yl9oYW5kbGVfdG9fb2JqZWN0KHUxNiB0YWJsZV9pZCwKKwkJCSBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICoqIHJldHVybl90YWJsZV9kZXNjKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjOworCXUzMiBpOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoInRiX2hhbmRsZV90b19vYmplY3QiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgidGJfaGFuZGxlX3RvX29iamVjdCIpOwogCiAJZm9yIChpID0gMDsgaSA8IEFDUElfVEFCTEVfTUFYOyBpKyspIHsKIAkJdGFibGVfZGVzYyA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW2ldLm5leHQ7CkBAIC0yNDcsOSArMjkyLDggQEAKIAkJfQogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAidGFibGVfaWQ9JVggZG9lcyBub3QgZXhpc3RcbiIsIHRhYmxlX2lkKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgInRhYmxlX2lkPSVYIGRvZXMgbm90IGV4aXN0XG4iLAorCQkJICB0YWJsZV9pZCkpOwogCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiB9CiAjZW5kaWYKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jCmluZGV4IDBjMGI5MDguLjNmOTZhNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jCkBAIC00OCwxMCArNDgsOCBAQAogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJ0YnhmYWNlIikKLQorQUNQSV9NT0RVTEVfTkFNRSgidGJ4ZmFjZSIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjUsMjUgKzYzLDIwIEBACiAgKiAgICAgICAgICAgICAgcHJvdmlkZWQgUlNEVAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2xvYWRfdGFibGVzICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9sb2FkX3RhYmxlcyh2b2lkKQogewotCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgcnNkcF9hZGRyZXNzOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX3BvaW50ZXIgcnNkcF9hZGRyZXNzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfbG9hZF90YWJsZXMiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfbG9hZF90YWJsZXMiKTsKIAogCS8qIEdldCB0aGUgUlNEUCAqLwogCi0Jc3RhdHVzID0gYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyIChBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywKLQkJCSAgJnJzZHBfYWRkcmVzcyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2xvYWRfdGFibGVzOiBDb3VsZCBub3QgZ2V0IFJTRFAsICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJc3RhdHVzID0gYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyKEFDUElfTE9HSUNBTF9BRERSRVNTSU5HLAorCQkJCQkgICZyc2RwX2FkZHJlc3MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBnZXQgUlNEUCwgJXNcbiIsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KIApAQCAtOTEsNTQgKzg0LDQ3IEBACiAKIAlhY3BpX2dibF90YWJsZV9mbGFncyA9IHJzZHBfYWRkcmVzcy5wb2ludGVyX3R5cGU7CiAKLQlzdGF0dXMgPSBhY3BpX3RiX3ZlcmlmeV9yc2RwICgmcnNkcF9hZGRyZXNzKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfbG9hZF90YWJsZXM6IFJTRFAgRmFpbGVkIHZhbGlkYXRpb246ICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJc3RhdHVzID0gYWNwaV90Yl92ZXJpZnlfcnNkcCgmcnNkcF9hZGRyZXNzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2xvYWRfdGFibGVzOiBSU0RQIEZhaWxlZCB2YWxpZGF0aW9uOiAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KIAogCS8qIEdldCB0aGUgUlNEVCB2aWEgdGhlIFJTRFAgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX3JzZHQgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2xvYWRfdGFibGVzOiBDb3VsZCBub3QgbG9hZCBSU0RUOiAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX3JzZHQoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2xvYWRfdGFibGVzOiBDb3VsZCBub3QgbG9hZCBSU0RUOiAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KIAogCS8qIE5vdyBnZXQgdGhlIHRhYmxlcyBuZWVkZWQgYnkgdGhpcyBzdWJzeXN0ZW0gKEZBRFQsIERTRFQsIGV0Yy4pICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2dldF9yZXF1aXJlZF90YWJsZXMgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJImFjcGlfbG9hZF90YWJsZXM6IEVycm9yIGdldHRpbmcgcmVxdWlyZWQgdGFibGVzIChEU0RUL0ZBRFQvRkFDUyk6ICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJc3RhdHVzID0gYWNwaV90Yl9nZXRfcmVxdWlyZWRfdGFibGVzKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9sb2FkX3RhYmxlczogRXJyb3IgZ2V0dGluZyByZXF1aXJlZCB0YWJsZXMgKERTRFQvRkFEVC9GQUNTKTogJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULCAiQUNQSSBUYWJsZXMgc3VjY2Vzc2Z1bGx5IGFjcXVpcmVkXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULCAiQUNQSSBUYWJsZXMgc3VjY2Vzc2Z1bGx5IGFjcXVpcmVkXG4iKSk7CiAKIAkvKiBMb2FkIHRoZSBuYW1lc3BhY2UgZnJvbSB0aGUgdGFibGVzICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX2xvYWRfbmFtZXNwYWNlICgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9sb2FkX3RhYmxlczogQ291bGQgbm90IGxvYWQgbmFtZXNwYWNlOiAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF9uYW1lc3BhY2UoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2xvYWRfdGFibGVzOiBDb3VsZCBub3QgbG9hZCBuYW1lc3BhY2U6ICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAorICAgICAgZXJyb3JfZXhpdDoKKwlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBsb2FkIHRhYmxlczogJXNcbiIsCisJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCi1lcnJvcl9leGl0OgotCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBsb2FkIHRhYmxlczogJXNcbiIsCi0JCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xNTYsNDAgKzE0Miw0OSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2xvYWRfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlX3B0cikKK2FjcGlfc3RhdHVzIGFjcGlfbG9hZF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX3B0cikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgIHRhYmxlX2luZm87Ci0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICBhZGRyZXNzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHRhYmxlX2luZm87CisJc3RydWN0IGFjcGlfcG9pbnRlciBhZGRyZXNzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9sb2FkX3RhYmxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2xvYWRfdGFibGUiKTsKIAogCWlmICghdGFibGVfcHRyKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBDb3B5IHRoZSB0YWJsZSB0byBhIGxvY2FsIGJ1ZmZlciAqLwogCi0JYWRkcmVzcy5wb2ludGVyX3R5cGUgICAgPSBBQ1BJX0xPR0lDQUxfUE9JTlRFUiB8IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HOworCWFkZHJlc3MucG9pbnRlcl90eXBlID0gQUNQSV9MT0dJQ0FMX1BPSU5URVIgfCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORzsKIAlhZGRyZXNzLnBvaW50ZXIubG9naWNhbCA9IHRhYmxlX3B0cjsKIAotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkgKCZhZGRyZXNzLCB0YWJsZV9wdHIsICZ0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9ib2R5KCZhZGRyZXNzLCB0YWJsZV9wdHIsICZ0YWJsZV9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogQ2hlY2sgc2lnbmF0dXJlIGZvciBhIHZhbGlkIHRhYmxlIHR5cGUgKi8KKworCXN0YXR1cyA9IGFjcGlfdGJfcmVjb2duaXplX3RhYmxlKCZ0YWJsZV9pbmZvLCBBQ1BJX1RBQkxFX0FMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEluc3RhbGwgdGhlIG5ldyB0YWJsZSBpbnRvIHRoZSBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfaW5zdGFsbF90YWJsZSAoJnRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3RiX2luc3RhbGxfdGFibGUoJnRhYmxlX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlpZiAoc3RhdHVzID09IEFFX0FMUkVBRFlfRVhJU1RTKSB7CisJCQkvKiBUYWJsZSBhbHJlYWR5IGV4aXN0cywgbm8gZXJyb3IgKi8KKworCQkJc3RhdHVzID0gQUVfT0s7CisJCX0KKwogCQkvKiBGcmVlIHRhYmxlIGFsbG9jYXRlZCBieSBhY3BpX3RiX2dldF90YWJsZV9ib2R5ICovCiAKLQkJYWNwaV90Yl9kZWxldGVfc2luZ2xlX3RhYmxlICgmdGFibGVfaW5mbyk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJYWNwaV90Yl9kZWxldGVfc2luZ2xlX3RhYmxlKCZ0YWJsZV9pbmZvKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogQ29udmVydCB0aGUgdGFibGUgdG8gY29tbW9uIGZvcm1hdCBpZiBuZWNlc3NhcnkgKi8KQEAgLTE5NywzMSArMTkyLDMyIEBACiAJc3dpdGNoICh0YWJsZV9pbmZvLnR5cGUpIHsKIAljYXNlIEFDUElfVEFCTEVfRkFEVDoKIAotCQlzdGF0dXMgPSBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCAoKTsKKwkJc3RhdHVzID0gYWNwaV90Yl9jb252ZXJ0X3RhYmxlX2ZhZHQoKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVEFCTEVfRkFDUzoKIAotCQlzdGF0dXMgPSBhY3BpX3RiX2J1aWxkX2NvbW1vbl9mYWNzICgmdGFibGVfaW5mbyk7CisJCXN0YXR1cyA9IGFjcGlfdGJfYnVpbGRfY29tbW9uX2ZhY3MoJnRhYmxlX2luZm8pOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCS8qIExvYWQgdGFibGUgaW50byBuYW1lc3BhY2UgaWYgaXQgY29udGFpbnMgZXhlY3V0YWJsZSBBTUwgKi8KIAotCQlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUgKHRhYmxlX2luZm8uaW5zdGFsbGVkX2Rlc2MsIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2xvYWRfdGFibGUodGFibGVfaW5mby5pbnN0YWxsZWRfZGVzYywKKwkJCQkgICAgICAgYWNwaV9nYmxfcm9vdF9ub2RlKTsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkvKiBVbmluc3RhbGwgdGFibGUgYW5kIGZyZWUgdGhlIGJ1ZmZlciAqLwogCi0JCSh2b2lkKSBhY3BpX3RiX3VuaW5zdGFsbF90YWJsZSAodGFibGVfaW5mby5pbnN0YWxsZWRfZGVzYyk7CisJCSh2b2lkKWFjcGlfdGJfdW5pbnN0YWxsX3RhYmxlKHRhYmxlX2luZm8uaW5zdGFsbGVkX2Rlc2MpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3VubG9hZF90YWJsZQpAQCAtMjM0LDIwICsyMzAsMTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV91bmxvYWRfdGFibGUgKAotCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdGFibGVfdHlwZSkKK2FjcGlfc3RhdHVzIGFjcGlfdW5sb2FkX3RhYmxlKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2M7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfdW5sb2FkX3RhYmxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3VubG9hZF90YWJsZSIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAogCWlmICh0YWJsZV90eXBlID4gQUNQSV9UQUJMRV9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIEZpbmQgYWxsIHRhYmxlcyBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgKi8KQEAgLTI2MCwxOCArMjUyLDE3IEBACiAJCSAqICJTY29wZSIgb3BlcmF0b3IuICBUaHVzLCB3ZSBuZWVkIHRvIHRyYWNrIG93bmVyc2hpcCBieSBhbiBJRCwgbm90CiAJCSAqIHNpbXBseSBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgaGllcmFyY2h5CiAJCSAqLwotCQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIgKHRhYmxlX2Rlc2MtPnRhYmxlX2lkKTsKLQorCQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIodGFibGVfZGVzYy0+b3duZXJfaWQpOworCQlhY3BpX3V0X3JlbGVhc2Vfb3duZXJfaWQoJnRhYmxlX2Rlc2MtPm93bmVyX2lkKTsKIAkJdGFibGVfZGVzYyA9IHRhYmxlX2Rlc2MtPm5leHQ7CiAJfQogCiAJLyogRGVsZXRlIChvciB1bm1hcCkgYWxsIHRhYmxlcyBvZiB0aGlzIHR5cGUgKi8KIAotCWFjcGlfdGJfZGVsZXRlX3RhYmxlc19ieV90eXBlICh0YWJsZV90eXBlKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlhY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZSh0YWJsZV90eXBlKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3RhYmxlX2hlYWRlcgpAQCAtMjk0LDU0ICsyODUsNDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF90YWJsZV9oZWFkZXIgKAotCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdGFibGVfdHlwZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKm91dF90YWJsZV9oZWFkZXIpCithY3BpX2dldF90YWJsZV9oZWFkZXIoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUsCisJCSAgICAgIHUzMiBpbnN0YW5jZSwgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpvdXRfdGFibGVfaGVhZGVyKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRibF9wdHI7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YmxfcHRyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X3RhYmxlX2hlYWRlciIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X3RhYmxlX2hlYWRlciIpOwotCi0KLQlpZiAoKGluc3RhbmNlID09IDApICAgICAgICAgICAgICAgICB8fAotCQkodGFibGVfdHlwZSA9PSBBQ1BJX1RBQkxFX1JTRFApIHx8Ci0JCSghb3V0X3RhYmxlX2hlYWRlcikpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwlpZiAoKGluc3RhbmNlID09IDApIHx8CisJICAgICh0YWJsZV90eXBlID09IEFDUElfVEFCTEVfUlNEUCkgfHwgKCFvdXRfdGFibGVfaGVhZGVyKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogQ2hlY2sgdGhlIHRhYmxlIHR5cGUgYW5kIGluc3RhbmNlICovCiAKLQlpZiAoKHRhYmxlX3R5cGUgPiBBQ1BJX1RBQkxFX01BWCkgICB8fAotCQkoQUNQSV9JU19TSU5HTEVfVEFCTEUgKGFjcGlfZ2JsX3RhYmxlX2RhdGFbdGFibGVfdHlwZV0uZmxhZ3MpICYmCi0JCSBpbnN0YW5jZSA+IDEpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJaWYgKCh0YWJsZV90eXBlID4gQUNQSV9UQUJMRV9NQVgpIHx8CisJICAgIChBQ1BJX0lTX1NJTkdMRV9UQUJMRShhY3BpX2dibF90YWJsZV9kYXRhW3RhYmxlX3R5cGVdLmZsYWdzKSAmJgorCSAgICAgaW5zdGFuY2UgPiAxKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogR2V0IGEgcG9pbnRlciB0byB0aGUgZW50aXJlIHRhYmxlICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9wdHIgKHRhYmxlX3R5cGUsIGluc3RhbmNlLCAmdGJsX3B0cik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfcHRyKHRhYmxlX3R5cGUsIGluc3RhbmNlLCAmdGJsX3B0cik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhIE5VTEwgcG9pbnRlciBpZiB0aGUgdGFibGUgaXMgbm90IGxvYWRlZCAqLwogCiAJaWYgKHRibF9wdHIgPT0gTlVMTCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9FWElTVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCX0KIAogCS8qIENvcHkgdGhlIGhlYWRlciB0byB0aGUgY2FsbGVyJ3MgYnVmZmVyICovCiAKLQlBQ1BJX01FTUNQWSAoKHZvaWQgKikgb3V0X3RhYmxlX2hlYWRlciwgKHZvaWQgKikgdGJsX3B0ciwKLQkJc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwlBQ1BJX01FTUNQWSgodm9pZCAqKW91dF90YWJsZV9oZWFkZXIsICh2b2lkICopdGJsX3B0ciwKKwkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTM2Nyw0MyArMzUzLDM5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfdGFibGUgKAotCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdGFibGVfdHlwZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpCithY3BpX2dldF90YWJsZShhY3BpX3RhYmxlX3R5cGUgdGFibGVfdHlwZSwKKwkgICAgICAgdTMyIGluc3RhbmNlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGJsX3B0cjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2xlbmd0aDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRibF9wdHI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfc2l6ZSB0YWJsZV9sZW5ndGg7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF90YWJsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfdGFibGUiKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKIAlpZiAoaW5zdGFuY2UgPT0gMCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIgKHJldF9idWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyKHJldF9idWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBDaGVjayB0aGUgdGFibGUgdHlwZSBhbmQgaW5zdGFuY2UgKi8KIAotCWlmICgodGFibGVfdHlwZSA+IEFDUElfVEFCTEVfTUFYKSAgIHx8Ci0JCShBQ1BJX0lTX1NJTkdMRV9UQUJMRSAoYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV90eXBlXS5mbGFncykgJiYKLQkJIGluc3RhbmNlID4gMSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwlpZiAoKHRhYmxlX3R5cGUgPiBBQ1BJX1RBQkxFX01BWCkgfHwKKwkgICAgKEFDUElfSVNfU0lOR0xFX1RBQkxFKGFjcGlfZ2JsX3RhYmxlX2RhdGFbdGFibGVfdHlwZV0uZmxhZ3MpICYmCisJICAgICBpbnN0YW5jZSA+IDEpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBlbnRpcmUgdGFibGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX3B0ciAodGFibGVfdHlwZSwgaW5zdGFuY2UsICZ0YmxfcHRyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9wdHIodGFibGVfdHlwZSwgaW5zdGFuY2UsICZ0YmxfcHRyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTQxMSw3ICszOTMsNyBAQAogCSAqIHRhYmxlIGlzIG5vdCBsb2FkZWQuCiAJICovCiAJaWYgKHRibF9wdHIgPT0gTlVMTCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9FWElTVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCX0KIAogCS8qIEdldCB0aGUgdGFibGUgbGVuZ3RoICovCkBAIC00MTksMjMgKzQwMSwyMiBAQAogCWlmICh0YWJsZV90eXBlID09IEFDUElfVEFCTEVfUlNEUCkgewogCQkvKiBSU0QgUFRSIGlzIHRoZSBvbmx5ICJ0YWJsZSIgd2l0aG91dCBhIGhlYWRlciAqLwogCi0JCXRhYmxlX2xlbmd0aCA9IHNpemVvZiAoc3RydWN0IHJzZHBfZGVzY3JpcHRvcik7Ci0JfQotCWVsc2UgeworCQl0YWJsZV9sZW5ndGggPSBzaXplb2Yoc3RydWN0IHJzZHBfZGVzY3JpcHRvcik7CisJfSBlbHNlIHsKIAkJdGFibGVfbGVuZ3RoID0gKGFjcGlfc2l6ZSkgdGJsX3B0ci0+bGVuZ3RoOwogCX0KIAogCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIgKHJldF9idWZmZXIsIHRhYmxlX2xlbmd0aCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihyZXRfYnVmZmVyLCB0YWJsZV9sZW5ndGgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBDb3B5IHRoZSB0YWJsZSB0byB0aGUgYnVmZmVyICovCiAKLQlBQ1BJX01FTUNQWSAoKHZvaWQgKikgcmV0X2J1ZmZlci0+cG9pbnRlciwgKHZvaWQgKikgdGJsX3B0ciwgdGFibGVfbGVuZ3RoKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlBQ1BJX01FTUNQWSgodm9pZCAqKXJldF9idWZmZXItPnBvaW50ZXIsICh2b2lkICopdGJsX3B0ciwgdGFibGVfbGVuZ3RoKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2dldF90YWJsZSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jCmluZGV4IGRjM2MzZjYuLjNiOGE3ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZnJvb3QuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMKQEAgLTQ2LDIyICs0Niw1NiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInRieGZyb290IikKK0FDUElfTU9EVUxFX05BTUUoInRieGZyb290IikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfZmluZF9yc2RwICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworYWNwaV90Yl9maW5kX3JzZHAoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbywgdTMyIGZsYWdzKTsKIAotc3RhdGljIHU4ICoKLWFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXJ0X2FkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOworc3RhdGljIHU4ICphY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwKHU4ICogc3RhcnRfYWRkcmVzcywgdTMyIGxlbmd0aCk7CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfdmFsaWRhdGVfcnNkcAorICoKKyAqIFBBUkFNRVRFUlM6ICBSc2RwICAgICAgICAtIFBvaW50ZXIgdG8gdW52YWxpZGF0ZWQgUlNEUAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVmFsaWRhdGUgdGhlIFJTRFAgKHB0cikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX3RiX3ZhbGlkYXRlX3JzZHAoc3RydWN0IHJzZHBfZGVzY3JpcHRvciAqcnNkcCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKgorCSAqICBUaGUgc2lnbmF0dXJlIGFuZCBjaGVja3N1bSBtdXN0IGJvdGggYmUgY29ycmVjdAorCSAqLworCWlmIChBQ1BJX1NUUk5DTVAoKGNoYXIgKilyc2RwLCBSU0RQX1NJRywgc2l6ZW9mKFJTRFBfU0lHKSAtIDEpICE9IDApIHsKKwkJLyogTm9wZSwgQkFEIFNpZ25hdHVyZSAqLworCisJCXJldHVybiAoQUVfQkFEX1NJR05BVFVSRSk7CisJfQorCisJLyogQ2hlY2sgdGhlIHN0YW5kYXJkIGNoZWNrc3VtICovCisKKwlpZiAoYWNwaV90Yl9nZW5lcmF0ZV9jaGVja3N1bShyc2RwLCBBQ1BJX1JTRFBfQ0hFQ0tTVU1fTEVOR1RIKSAhPSAwKSB7CisJCXJldHVybiAoQUVfQkFEX0NIRUNLU1VNKTsKKwl9CisKKwkvKiBDaGVjayBleHRlbmRlZCBjaGVja3N1bSBpZiB0YWJsZSB2ZXJzaW9uID49IDIgKi8KKworCWlmICgocnNkcC0+cmV2aXNpb24gPj0gMikgJiYKKwkgICAgKGFjcGlfdGJfZ2VuZXJhdGVfY2hlY2tzdW0ocnNkcCwgQUNQSV9SU0RQX1hDSEVDS1NVTV9MRU5HVEgpICE9CisJICAgICAwKSkgeworCQlyZXR1cm4gKEFFX0JBRF9DSEVDS1NVTSk7CisJfQorCisJcmV0dXJuIChBRV9PSyk7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODAsMjggKzExNCwyNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdGJfZmluZF90YWJsZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2lnbmF0dXJlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9lbV9pZCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvZW1fdGFibGVfaWQsCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqKnRhYmxlX3B0cikKK2FjcGlfdGJfZmluZF90YWJsZShjaGFyICpzaWduYXR1cmUsCisJCSAgIGNoYXIgKm9lbV9pZCwKKwkJICAgY2hhciAqb2VtX3RhYmxlX2lkLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiogdGFibGVfcHRyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidGJfZmluZF90YWJsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfZmluZF90YWJsZSIpOwogCiAJLyogVmFsaWRhdGUgc3RyaW5nIGxlbmd0aHMgKi8KIAotCWlmICgoQUNQSV9TVFJMRU4gKHNpZ25hdHVyZSkgID4gQUNQSV9OQU1FX1NJWkUpIHx8Ci0JCShBQ1BJX1NUUkxFTiAob2VtX2lkKSAgICAgPiBzaXplb2YgKHRhYmxlLT5vZW1faWQpKSB8fAotCQkoQUNQSV9TVFJMRU4gKG9lbV90YWJsZV9pZCkgPiBzaXplb2YgKHRhYmxlLT5vZW1fdGFibGVfaWQpKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9TVFJJTkdfTElNSVQpOworCWlmICgoQUNQSV9TVFJMRU4oc2lnbmF0dXJlKSA+IEFDUElfTkFNRV9TSVpFKSB8fAorCSAgICAoQUNQSV9TVFJMRU4ob2VtX2lkKSA+IHNpemVvZih0YWJsZS0+b2VtX2lkKSkgfHwKKwkgICAgKEFDUElfU1RSTEVOKG9lbV90YWJsZV9pZCkgPiBzaXplb2YodGFibGUtPm9lbV90YWJsZV9pZCkpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfU1RSSU5HX0xJTUlUKTsKIAl9CiAKLQlpZiAoIUFDUElfU1RSTkNNUCAoc2lnbmF0dXJlLCBEU0RUX1NJRywgQUNQSV9OQU1FX1NJWkUpKSB7CisJaWYgKCFBQ1BJX1NUUk5DTVAoc2lnbmF0dXJlLCBEU0RUX1NJRywgQUNQSV9OQU1FX1NJWkUpKSB7CiAJCS8qCiAJCSAqIFRoZSBEU0RUIHBvaW50ZXIgaXMgY29udGFpbmVkIGluIHRoZSBGQURULCBub3QgdGhlIFJTRFQuCiAJCSAqIFRoaXMgY29kZSBzaG91bGQgc3VmZmljZSwgYmVjYXVzZSB0aGUgb25seSBjb2RlIHRoYXQgd291bGQgcGVyZm9ybQpAQCAtMTEwLDQwICsxNDAsMzYgQEAKIAkJICogSWYgdGhpcyBiZWNvbWVzIGluc3VmZmljaWVudCwgdGhlIEZBRFQgd2lsbCBoYXZlIHRvIGJlIGZvdW5kIGZpcnN0LgogCQkgKi8KIAkJaWYgKCFhY3BpX2dibF9EU0RUKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0FDUElfVEFCTEVTKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7CiAJCX0KIAkJdGFibGUgPSBhY3BpX2dibF9EU0RUOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBGaW5kIHRoZSB0YWJsZSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlIChzaWduYXR1cmUsIDEsCi0JCQkJIEFDUElfTE9HSUNBTF9BRERSRVNTSU5HLCAmdGFibGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKHNpZ25hdHVyZSwgMSwKKwkJCQkJCSBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywKKwkJCQkJCSAmdGFibGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCiAJLyogQ2hlY2sgb2VtX2lkIGFuZCBvZW1fdGFibGVfaWQgKi8KIAotCWlmICgob2VtX2lkWzBdICYmIEFDUElfU1RSTkNNUCAoCi0JCQkgICBvZW1faWQsIHRhYmxlLT5vZW1faWQsCi0JCQkgICBzaXplb2YgKHRhYmxlLT5vZW1faWQpKSkgfHwKLQotCQkob2VtX3RhYmxlX2lkWzBdICYmIEFDUElfU1RSTkNNUCAoCi0JCQkJICAgb2VtX3RhYmxlX2lkLCB0YWJsZS0+b2VtX3RhYmxlX2lkLAotCQkJCSAgIHNpemVvZiAodGFibGUtPm9lbV90YWJsZV9pZCkpKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9OQU1FX05PVF9GT1VORCk7CisJaWYgKChvZW1faWRbMF0gJiYgQUNQSV9TVFJOQ01QKG9lbV9pZCwgdGFibGUtPm9lbV9pZCwKKwkJCQkgICAgICAgc2l6ZW9mKHRhYmxlLT5vZW1faWQpKSkgfHwKKwkgICAgKG9lbV90YWJsZV9pZFswXSAmJiBBQ1BJX1NUUk5DTVAob2VtX3RhYmxlX2lkLCB0YWJsZS0+b2VtX3RhYmxlX2lkLAorCQkJCQkgICAgIHNpemVvZih0YWJsZS0+b2VtX3RhYmxlX2lkKSkpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTkFNRV9OT1RfRk9VTkQpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1RBQkxFUywgIkZvdW5kIHRhYmxlIFslNC40c11cbiIsCi0JCXRhYmxlLT5zaWduYXR1cmUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1RBQkxFUywgIkZvdW5kIHRhYmxlIFslNC40c11cbiIsCisJCQkgIHRhYmxlLT5zaWduYXR1cmUpKTsKIAogCSp0YWJsZV9wdHIgPSB0YWJsZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlCkBAIC0xNjQsMzQgKzE5MCwyOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlICgKLQlhY3BpX3N0cmluZyAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqKnRhYmxlX3BvaW50ZXIpCithY3BpX2dldF9maXJtd2FyZV90YWJsZShhY3BpX3N0cmluZyBzaWduYXR1cmUsCisJCQl1MzIgaW5zdGFuY2UsCisJCQl1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKnRhYmxlX3BvaW50ZXIpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICBhZGRyZXNzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqcnNkdF9pbmZvOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfY291bnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgajsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfcG9pbnRlciBhZGRyZXNzOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICpyc2R0X2luZm87CisJdTMyIHRhYmxlX2NvdW50OworCXUzMiBpOworCXUzMiBqOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9nZXRfZmlybXdhcmVfdGFibGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlIik7CiAKIAkvKgogCSAqIEVuc3VyZSB0aGF0IGF0IGxlYXN0IHRoZSB0YWJsZSBtYW5hZ2VyIGlzIGluaXRpYWxpemVkLiAgV2UgZG9uJ3QKIAkgKiByZXF1aXJlIHRoYXQgdGhlIGVudGlyZSBBQ1BJIHN1YnN5c3RlbSBpcyB1cCBmb3IgdGhpcyBpbnRlcmZhY2UuCiAJICogSWYgd2UgaGF2ZSBhIGJ1ZmZlciwgd2UgbXVzdCBoYXZlIGEgbGVuZ3RoIHRvbwogCSAqLwotCWlmICgoaW5zdGFuY2UgPT0gMCkgICAgIHx8Ci0JCSghc2lnbmF0dXJlKSAgICAgICAgfHwKLQkJKCF0YWJsZV9wb2ludGVyKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCWlmICgoaW5zdGFuY2UgPT0gMCkgfHwgKCFzaWduYXR1cmUpIHx8ICghdGFibGVfcG9pbnRlcikpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSBSU0RQICovCkBAIC0xOTksNDggKzIxOSw0MSBAQAogCWlmICghYWNwaV9nYmxfUlNEUCkgewogCQkvKiBHZXQgdGhlIFJTRFAgKi8KIAotCQlzdGF0dXMgPSBhY3BpX29zX2dldF9yb290X3BvaW50ZXIgKGZsYWdzLCAmYWRkcmVzcyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJSU0RQIG5vdCBmb3VuZFxuIikpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19BQ1BJX1RBQkxFUyk7CisJCXN0YXR1cyA9IGFjcGlfb3NfZ2V0X3Jvb3RfcG9pbnRlcihmbGFncywgJmFkZHJlc3MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJTRFAgbm90IGZvdW5kXG4iKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fQUNQSV9UQUJMRVMpOwogCQl9CiAKIAkJLyogTWFwIGFuZCB2YWxpZGF0ZSB0aGUgUlNEUCAqLwogCiAJCWlmICgoZmxhZ3MgJiBBQ1BJX01FTU9SWV9NT0RFKSA9PSBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORykgewotCQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLnBvaW50ZXIucGh5c2ljYWwsCi0JCQkJCSBzaXplb2YgKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpLCAodm9pZCAqKSAmYWNwaV9nYmxfUlNEUCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5KGFkZHJlc3MucG9pbnRlci5waHlzaWNhbCwKKwkJCQkJCSAgICBzaXplb2Yoc3RydWN0CisJCQkJCQkJICAgcnNkcF9kZXNjcmlwdG9yKSwKKwkJCQkJCSAgICAodm9pZCAqKSZhY3BpX2dibF9SU0RQKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJYWNwaV9nYmxfUlNEUCA9IGFkZHJlc3MucG9pbnRlci5sb2dpY2FsOwogCQl9CiAKLQkJLyogVGhlIHNpZ25hdHVyZSBhbmQgY2hlY2tzdW0gbXVzdCBib3RoIGJlIGNvcnJlY3QgKi8KKwkJLyogVGhlIFJEU1Agc2lnbmF0dXJlIGFuZCBjaGVja3N1bSBtdXN0IGJvdGggYmUgY29ycmVjdCAqLwogCi0JCWlmIChBQ1BJX1NUUk5DTVAgKChjaGFyICopIGFjcGlfZ2JsX1JTRFAsIFJTRFBfU0lHLAotCQkJCXNpemVvZiAoUlNEUF9TSUcpLTEpICE9IDApIHsKLQkJCS8qIE5vcGUsIEJBRCBTaWduYXR1cmUgKi8KLQotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfU0lHTkFUVVJFKTsKLQkJfQotCi0JCWlmIChhY3BpX3RiX2NoZWNrc3VtIChhY3BpX2dibF9SU0RQLCBBQ1BJX1JTRFBfQ0hFQ0tTVU1fTEVOR1RIKSAhPSAwKSB7Ci0JCQkvKiBOb3BlLCBCQUQgQ2hlY2tzdW0gKi8KLQotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfQ0hFQ0tTVU0pOworCQlzdGF0dXMgPSBhY3BpX3RiX3ZhbGlkYXRlX3JzZHAoYWNwaV9nYmxfUlNEUCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAkvKiBHZXQgdGhlIFJTRFQgYWRkcmVzcyB2aWEgdGhlIFJTRFAgKi8KIAotCWFjcGlfdGJfZ2V0X3JzZHRfYWRkcmVzcyAoJmFkZHJlc3MpOwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCSJSU0RQIGxvY2F0ZWQgYXQgJXAsIFJTRFQgcGh5c2ljYWw9JTguOFglOC44WCBcbiIsCi0JCWFjcGlfZ2JsX1JTRFAsCi0JCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcy5wb2ludGVyLnZhbHVlKSkpOworCWFjcGlfdGJfZ2V0X3JzZHRfYWRkcmVzcygmYWRkcmVzcyk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiUlNEUCBsb2NhdGVkIGF0ICVwLCBSU0RUIHBoeXNpY2FsPSU4LjhYJTguOFggXG4iLAorCQkJICBhY3BpX2dibF9SU0RQLAorCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcy5wb2ludGVyLnZhbHVlKSkpOwogCiAJLyogSW5zZXJ0IHByb2Nlc3Nvcl9tb2RlIGZsYWdzICovCiAKQEAgLTI0OCwzMCArMjYxLDMwIEBACiAKIAkvKiBHZXQgYW5kIHZhbGlkYXRlIHRoZSBSU0RUICovCiAKLQlyc2R0X2luZm8gPSBBQ1BJX01FTV9DQUxMT0NBVEUgKHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOworCXJzZHRfaW5mbyA9IEFDUElfTUVNX0NBTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwogCWlmICghcnNkdF9pbmZvKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGUgKCZhZGRyZXNzLCByc2R0X2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZSgmYWRkcmVzcywgcnNkdF9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdGJfdmFsaWRhdGVfcnNkdCAocnNkdF9pbmZvLT5wb2ludGVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV90Yl92YWxpZGF0ZV9yc2R0KHJzZHRfaW5mby0+cG9pbnRlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBBbGxvY2F0ZSBhIHNjcmF0Y2ggdGFibGUgaGVhZGVyIGFuZCB0YWJsZSBkZXNjcmlwdG9yICovCiAKLQloZWFkZXIgPSBBQ1BJX01FTV9BTExPQ0FURSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwloZWFkZXIgPSBBQ1BJX01FTV9BTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CiAJaWYgKCFoZWFkZXIpIHsKIAkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JdGFibGVfaW5mbyA9IEFDUElfTUVNX0FMTE9DQVRFIChzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKKwl0YWJsZV9pbmZvID0gQUNQSV9NRU1fQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKIAlpZiAoIXRhYmxlX2luZm8pIHsKIAkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQlnb3RvIGNsZWFudXA7CkBAIC0yNzksNyArMjkyLDggQEAKIAogCS8qIEdldCB0aGUgbnVtYmVyIG9mIHRhYmxlIHBvaW50ZXJzIHdpdGhpbiB0aGUgUlNEVCAqLwogCi0JdGFibGVfY291bnQgPSBhY3BpX3RiX2dldF90YWJsZV9jb3VudCAoYWNwaV9nYmxfUlNEUCwgcnNkdF9pbmZvLT5wb2ludGVyKTsKKwl0YWJsZV9jb3VudCA9CisJICAgIGFjcGlfdGJfZ2V0X3RhYmxlX2NvdW50KGFjcGlfZ2JsX1JTRFAsIHJzZHRfaW5mby0+cG9pbnRlcik7CiAJYWRkcmVzcy5wb2ludGVyX3R5cGUgPSBhY3BpX2dibF90YWJsZV9mbGFncyB8IGZsYWdzOwogCiAJLyoKQEAgLTI4NywzNSArMzAxLDQyIEBACiAJICogcmVxdWVzdGVkIHRhYmxlCiAJICovCiAJZm9yIChpID0gMCwgaiA9IDA7IGkgPCB0YWJsZV9jb3VudDsgaSsrKSB7Ci0JCS8qIEdldCB0aGUgbmV4dCB0YWJsZSBwb2ludGVyLCBoYW5kbGUgUlNEVCB2cy4gWFNEVCAqLwotCi0JCWlmIChhY3BpX2dibF9SU0RQLT5yZXZpc2lvbiA8IDIpIHsKLQkJCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9IChBQ1BJX0NBU1RfUFRSICgKLQkJCQlSU0RUX0RFU0NSSVBUT1IsIHJzZHRfaW5mby0+cG9pbnRlcikpLT50YWJsZV9vZmZzZXRfZW50cnlbaV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPSAoQUNQSV9DQVNUX1BUUiAoCi0JCQkJWFNEVF9ERVNDUklQVE9SLCByc2R0X2luZm8tPnBvaW50ZXIpKS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldOworCQkvKgorCQkgKiBHZXQgdGhlIG5leHQgdGFibGUgcG9pbnRlciwgaGFuZGxlIFJTRFQgdnMuIFhTRFQKKwkJICogUlNEVCBwb2ludGVycyBhcmUgMzIgYml0cywgWFNEVCBwb2ludGVycyBhcmUgNjQgYml0cworCQkgKi8KKwkJaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfdHlwZSA9PSBBQ1BJX1RBQkxFX1RZUEVfUlNEVCkgeworCQkJYWRkcmVzcy5wb2ludGVyLnZhbHVlID0KKwkJCSAgICAoQUNQSV9DQVNUX1BUUgorCQkJICAgICAoUlNEVF9ERVNDUklQVE9SLAorCQkJICAgICAgcnNkdF9pbmZvLT5wb2ludGVyKSktPnRhYmxlX29mZnNldF9lbnRyeVtpXTsKKwkJfSBlbHNlIHsKKwkJCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9CisJCQkgICAgKEFDUElfQ0FTVF9QVFIKKwkJCSAgICAgKFhTRFRfREVTQ1JJUFRPUiwKKwkJCSAgICAgIHJzZHRfaW5mby0+cG9pbnRlcikpLT50YWJsZV9vZmZzZXRfZW50cnlbaV07CiAJCX0KIAogCQkvKiBHZXQgdGhlIHRhYmxlIGhlYWRlciAqLwogCi0JCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2hlYWRlciAoJmFkZHJlc3MsIGhlYWRlcik7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfaGVhZGVyKCZhZGRyZXNzLCBoZWFkZXIpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCiAJCS8qIENvbXBhcmUgdGFibGUgc2lnbmF0dXJlcyBhbmQgdGFibGUgaW5zdGFuY2UgKi8KIAotCQlpZiAoIUFDUElfU1RSTkNNUCAoaGVhZGVyLT5zaWduYXR1cmUsIHNpZ25hdHVyZSwgQUNQSV9OQU1FX1NJWkUpKSB7CisJCWlmICghQUNQSV9TVFJOQ01QKGhlYWRlci0+c2lnbmF0dXJlLCBzaWduYXR1cmUsIEFDUElfTkFNRV9TSVpFKSkgewogCQkJLyogQW4gaW5zdGFuY2Ugb2YgdGhlIHRhYmxlIHdhcyBmb3VuZCAqLwogCiAJCQlqKys7CiAJCQlpZiAoaiA+PSBpbnN0YW5jZSkgewogCQkJCS8qIEZvdW5kIHRoZSBjb3JyZWN0IGluc3RhbmNlLCBnZXQgdGhlIGVudGlyZSB0YWJsZSAqLwogCi0JCQkJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfYm9keSAoJmFkZHJlc3MsIGhlYWRlciwgdGFibGVfaW5mbyk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkoJmFkZHJlc3MsIGhlYWRlciwKKwkJCQkJCQkgICB0YWJsZV9pbmZvKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkJZ290byBjbGVhbnVwOwogCQkJCX0KIApAQCAtMzI5LDIyICszNTAsMjMgQEAKIAogCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKIAotCi1jbGVhbnVwOgotCWFjcGlfb3NfdW5tYXBfbWVtb3J5IChyc2R0X2luZm8tPnBvaW50ZXIsCi0JCShhY3BpX3NpemUpIHJzZHRfaW5mby0+cG9pbnRlci0+bGVuZ3RoKTsKLQlBQ1BJX01FTV9GUkVFIChyc2R0X2luZm8pOworICAgICAgY2xlYW51cDoKKwlpZiAocnNkdF9pbmZvLT5wb2ludGVyKSB7CisJCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHJzZHRfaW5mby0+cG9pbnRlciwKKwkJCQkgICAgIChhY3BpX3NpemUpIHJzZHRfaW5mby0+cG9pbnRlci0+bGVuZ3RoKTsKKwl9CisJQUNQSV9NRU1fRlJFRShyc2R0X2luZm8pOwogCiAJaWYgKGhlYWRlcikgewotCQlBQ1BJX01FTV9GUkVFIChoZWFkZXIpOworCQlBQ1BJX01FTV9GUkVFKGhlYWRlcik7CiAJfQogCWlmICh0YWJsZV9pbmZvKSB7Ci0JCUFDUElfTUVNX0ZSRUUgKHRhYmxlX2luZm8pOworCQlBQ1BJX01FTV9GUkVFKHRhYmxlX2luZm8pOwogCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF9maXJtd2FyZV90YWJsZSk7CiAKIC8qIFRCRDogTW92ZSB0byBhIG5ldyBmaWxlICovCiAKQEAgLTM2MywzNSArMzg1LDI5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZmluZF9yb290X3BvaW50ZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqcnNkcF9hZGRyZXNzKQorYWNwaV9zdGF0dXMgYWNwaV9maW5kX3Jvb3RfcG9pbnRlcih1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX3BvaW50ZXIgKnJzZHBfYWRkcmVzcykKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgIHRhYmxlX2luZm87Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyB0YWJsZV9pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZmluZF9yb290X3BvaW50ZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZmluZF9yb290X3BvaW50ZXIiKTsKIAogCS8qIEdldCB0aGUgUlNEUCAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9maW5kX3JzZHAgKCZ0YWJsZV9pbmZvLCBmbGFncyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJSU0RQIHN0cnVjdHVyZSBub3QgZm91bmQsICVzIEZsYWdzPSVYXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLCBmbGFncykpOworCXN0YXR1cyA9IGFjcGlfdGJfZmluZF9yc2RwKCZ0YWJsZV9pbmZvLCBmbGFncyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiUlNEUCBzdHJ1Y3R1cmUgbm90IGZvdW5kLCAlcyBGbGFncz0lWFxuIiwKKwkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLCBmbGFncykpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fQUNQSV9UQUJMRVMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fQUNQSV9UQUJMRVMpOwogCX0KIAogCXJzZHBfYWRkcmVzcy0+cG9pbnRlcl90eXBlID0gQUNQSV9QSFlTSUNBTF9QT0lOVEVSOwogCXJzZHBfYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCA9IHRhYmxlX2luZm8ucGh5c2ljYWxfYWRkcmVzczsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAKQEAgLTQwNSw2OCArNDIxLDQ1IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHU4ICoKLWFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXJ0X2FkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpCitzdGF0aWMgdTggKmFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAodTggKiBzdGFydF9hZGRyZXNzLCB1MzIgbGVuZ3RoKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1lbV9yb3ZlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICplbmRfYWRkcmVzczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1OCAqbWVtX3JvdmVyOworCXU4ICplbmRfYWRkcmVzczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCIpOwogCiAJZW5kX2FkZHJlc3MgPSBzdGFydF9hZGRyZXNzICsgbGVuZ3RoOwogCiAJLyogU2VhcmNoIGZyb20gZ2l2ZW4gc3RhcnQgYWRkcmVzcyBmb3IgdGhlIHJlcXVlc3RlZCBsZW5ndGggKi8KIAogCWZvciAobWVtX3JvdmVyID0gc3RhcnRfYWRkcmVzczsgbWVtX3JvdmVyIDwgZW5kX2FkZHJlc3M7Ci0JCSBtZW1fcm92ZXIgKz0gQUNQSV9SU0RQX1NDQU5fU1RFUCkgewotCQkvKiBUaGUgc2lnbmF0dXJlIGFuZCBjaGVja3N1bSBtdXN0IGJvdGggYmUgY29ycmVjdCAqLworCSAgICAgbWVtX3JvdmVyICs9IEFDUElfUlNEUF9TQ0FOX1NURVApIHsKKwkJLyogVGhlIFJTRFAgc2lnbmF0dXJlIGFuZCBjaGVja3N1bSBtdXN0IGJvdGggYmUgY29ycmVjdCAqLwogCi0JCWlmIChBQ1BJX1NUUk5DTVAgKChjaGFyICopIG1lbV9yb3ZlciwKLQkJCQlSU0RQX1NJRywgc2l6ZW9mIChSU0RQX1NJRykgLSAxKSAhPSAwKSB7Ci0JCQkvKiBObyBzaWduYXR1cmUgbWF0Y2gsIGtlZXAgbG9va2luZyAqLworCQlzdGF0dXMgPQorCQkgICAgYWNwaV90Yl92YWxpZGF0ZV9yc2RwKEFDUElfQ0FTVF9QVFIKKwkJCQkJICAoc3RydWN0IHJzZHBfZGVzY3JpcHRvciwgbWVtX3JvdmVyKSk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJLyogU2lnIGFuZCBjaGVja3N1bSB2YWxpZCwgd2UgaGF2ZSBmb3VuZCBhIHJlYWwgUlNEUCAqLwogCi0JCQljb250aW51ZTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiUlNEUCBsb2NhdGVkIGF0IHBoeXNpY2FsIGFkZHJlc3MgJXBcbiIsCisJCQkJCSAgbWVtX3JvdmVyKSk7CisJCQlyZXR1cm5fUFRSKG1lbV9yb3Zlcik7CiAJCX0KIAotCQkvKiBTaWduYXR1cmUgbWF0Y2hlcywgY2hlY2sgdGhlIGFwcHJvcHJpYXRlIGNoZWNrc3VtICovCi0KLQkJaWYgKChBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yLCBtZW1fcm92ZXIpKS0+cmV2aXNpb24gPCAyKSB7Ci0JCQkvKiBBQ1BJIHZlcnNpb24gMS4wICovCi0KLQkJCWNoZWNrc3VtID0gYWNwaV90Yl9jaGVja3N1bSAobWVtX3JvdmVyLCBBQ1BJX1JTRFBfQ0hFQ0tTVU1fTEVOR1RIKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIFBvc3QgQUNQSSAxLjAsIHVzZSBleHRlbmRlZF9jaGVja3N1bSAqLwotCi0JCQljaGVja3N1bSA9IGFjcGlfdGJfY2hlY2tzdW0gKG1lbV9yb3ZlciwgQUNQSV9SU0RQX1hDSEVDS1NVTV9MRU5HVEgpOwotCQl9Ci0KLQkJaWYgKGNoZWNrc3VtID09IDApIHsKLQkJCS8qIENoZWNrc3VtIHZhbGlkLCB3ZSBoYXZlIGZvdW5kIGEgdmFsaWQgUlNEUCAqLwotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJCSJSU0RQIGxvY2F0ZWQgYXQgcGh5c2ljYWwgYWRkcmVzcyAlcFxuIiwgbWVtX3JvdmVyKSk7Ci0JCQlyZXR1cm5fUFRSIChtZW1fcm92ZXIpOwotCQl9Ci0KLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJCSJGb3VuZCBhbiBSU0RQIGF0IHBoeXNpY2FsIGFkZHJlc3MgJXAsIGJ1dCBpdCBoYXMgYSBiYWQgY2hlY2tzdW1cbiIsCi0JCQltZW1fcm92ZXIpKTsKKwkJLyogTm8gc2lnIG1hdGNoIG9yIGJhZCBjaGVja3N1bSwga2VlcCBzZWFyY2hpbmcgKi8KIAl9CiAKIAkvKiBTZWFyY2hlZCBlbnRpcmUgYmxvY2ssIG5vIFJTRFAgd2FzIGZvdW5kICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkiU2VhcmNoZWQgZW50aXJlIGJsb2NrLCBubyB2YWxpZCBSU0RQIHdhcyBmb3VuZC5cbiIpKTsKLQlyZXR1cm5fUFRSIChOVUxMKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJTZWFyY2hlZCBlbnRpcmUgYmxvY2sgZnJvbSAlcCwgdmFsaWQgUlNEUCB3YXMgbm90IGZvdW5kXG4iLAorCQkJICBzdGFydF9hZGRyZXNzKSk7CisJcmV0dXJuX1BUUihOVUxMKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2ZpbmRfcnNkcApAQCAtNDkwLDE4ICs0ODMsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl9maW5kX3JzZHAgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8sCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK2FjcGlfdGJfZmluZF9yc2RwKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8sIHUzMiBmbGFncykKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0YWJsZV9wdHI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbWVtX3JvdmVyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxfYWRkcmVzczsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1OCAqdGFibGVfcHRyOworCXU4ICptZW1fcm92ZXI7CisJdTMyIHBoeXNpY2FsX2FkZHJlc3M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidGJfZmluZF9yc2RwIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9maW5kX3JzZHAiKTsKIAogCS8qCiAJICogU2NhbiBzdXBwb3J0cyBlaXRoZXIgbG9naWNhbCBhZGRyZXNzaW5nIG9yIHBoeXNpY2FsIGFkZHJlc3NpbmcKQEAgLTUwOSwyMyArNDk4LDI1IEBACiAJaWYgKChmbGFncyAmIEFDUElfTUVNT1JZX01PREUpID09IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HKSB7CiAJCS8qIDFhKSBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBFeHRlbmRlZCBCSU9TIERhdGEgQXJlYSAoRUJEQSkgKi8KIAotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKAotCQkJCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBBQ1BJX0VCREFfUFRSX0xPQ0FUSU9OLAotCQkJCSBBQ1BJX0VCREFfUFRSX0xFTkdUSCwgKHZvaWQgKikgJnRhYmxlX3B0cik7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCBmb3IgbGVuZ3RoICVYXG4iLAotCQkJCUFDUElfRUJEQV9QVFJfTE9DQVRJT04sIEFDUElfRUJEQV9QVFJfTEVOR1RIKSk7CisJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkgICAgQUNQSV9FQkRBX1BUUl9MT0NBVElPTiwKKwkJCQkJICAgIEFDUElfRUJEQV9QVFJfTEVOR1RILAorCQkJCQkgICAgKHZvaWQgKikmdGFibGVfcHRyKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCBmb3IgbGVuZ3RoICVYXG4iLAorCQkJCQkgIEFDUElfRUJEQV9QVFJfTE9DQVRJT04sCisJCQkJCSAgQUNQSV9FQkRBX1BUUl9MRU5HVEgpKTsKIAotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAotCQlBQ1BJX01PVkVfMTZfVE9fMzIgKCZwaHlzaWNhbF9hZGRyZXNzLCB0YWJsZV9wdHIpOworCQlBQ1BJX01PVkVfMTZfVE9fMzIoJnBoeXNpY2FsX2FkZHJlc3MsIHRhYmxlX3B0cik7CiAKIAkJLyogQ29udmVydCBzZWdtZW50IHBhcnQgdG8gcGh5c2ljYWwgYWRkcmVzcyAqLwogCiAJCXBoeXNpY2FsX2FkZHJlc3MgPDw9IDQ7Ci0JCWFjcGlfb3NfdW5tYXBfbWVtb3J5ICh0YWJsZV9wdHIsIEFDUElfRUJEQV9QVFJfTEVOR1RIKTsKKwkJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGVfcHRyLCBBQ1BJX0VCREFfUFRSX0xFTkdUSCk7CiAKIAkJLyogRUJEQSBwcmVzZW50PyAqLwogCkBAIC01MzQsNTkgKzUyNSw2NyBAQAogCQkJICogMWIpIFNlYXJjaCBFQkRBIHBhcmFncmFwaHMgKEVCRGEgaXMgcmVxdWlyZWQgdG8gYmUgYQogCQkJICogICAgIG1pbmltdW0gb2YgMV9rIGxlbmd0aCkKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5ICgKLQkJCQkJIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3MsCi0JCQkJCSBBQ1BJX0VCREFfV0lORE9XX1NJWkUsICh2b2lkICopICZ0YWJsZV9wdHIpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKLQkJCQkJcGh5c2ljYWxfYWRkcmVzcywgQUNQSV9FQkRBX1dJTkRPV19TSVpFKSk7CisJCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJCSAgICBwaHlzaWNhbF9hZGRyZXNzLAorCQkJCQkJICAgIEFDUElfRUJEQV9XSU5ET1dfU0laRSwKKwkJCQkJCSAgICAodm9pZCAqKSZ0YWJsZV9wdHIpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVhcbiIsCisJCQkJCQkgIHBoeXNpY2FsX2FkZHJlc3MsCisJCQkJCQkgIEFDUElfRUJEQV9XSU5ET1dfU0laRSkpOwogCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCi0JCQltZW1fcm92ZXIgPSBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwICh0YWJsZV9wdHIsCi0JCQkJCSAgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKLQkJCWFjcGlfb3NfdW5tYXBfbWVtb3J5ICh0YWJsZV9wdHIsIEFDUElfRUJEQV9XSU5ET1dfU0laRSk7CisJCQltZW1fcm92ZXIgPSBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwKHRhYmxlX3B0ciwKKwkJCQkJCQkJIEFDUElfRUJEQV9XSU5ET1dfU0laRSk7CisJCQlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZV9wdHIsIEFDUElfRUJEQV9XSU5ET1dfU0laRSk7CiAKIAkJCWlmIChtZW1fcm92ZXIpIHsKLQkJCQkvKiBGb3VuZCBpdCwgcmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCisJCQkJLyogUmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCiAKLQkJCQlwaHlzaWNhbF9hZGRyZXNzICs9IEFDUElfUFRSX0RJRkYgKG1lbV9yb3ZlciwgdGFibGVfcHRyKTsKKwkJCQlwaHlzaWNhbF9hZGRyZXNzICs9CisJCQkJICAgIEFDUElfUFRSX0RJRkYobWVtX3JvdmVyLCB0YWJsZV9wdHIpOwogCiAJCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9Ci0JCQkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3M7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCQkJICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3M7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJCX0KIAkJfQogCiAJCS8qCiAJCSAqIDIpIFNlYXJjaCB1cHBlciBtZW1vcnk6IDE2LWJ5dGUgYm91bmRhcmllcyBpbiBFMDAwMGgtRkZGRkZoCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKAotCQkJCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UsCi0JCQkJIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSwgKHZvaWQgKikgJnRhYmxlX3B0cik7CisJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkgICAgQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFLAorCQkJCQkgICAgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFLAorCQkJCQkgICAgKHZvaWQgKikmdGFibGVfcHRyKTsKIAotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKLQkJCQlBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UsIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVhcbiIsCisJCQkJCSAgQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFLAorCQkJCQkgIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSkpOwogCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCi0JCW1lbV9yb3ZlciA9IGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKHRhYmxlX3B0ciwgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKTsKLQkJYWNwaV9vc191bm1hcF9tZW1vcnkgKHRhYmxlX3B0ciwgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKTsKKwkJbWVtX3JvdmVyID0KKwkJICAgIGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAodGFibGVfcHRyLAorCQkJCQkJIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSk7CisJCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlX3B0ciwgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKTsKIAogCQlpZiAobWVtX3JvdmVyKSB7Ci0JCQkvKiBGb3VuZCBpdCwgcmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCisJCQkvKiBSZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAogCQkJcGh5c2ljYWxfYWRkcmVzcyA9Ci0JCQkJQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFICsgQUNQSV9QVFJfRElGRiAobWVtX3JvdmVyLCB0YWJsZV9wdHIpOworCQkJICAgIEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSArIEFDUElfUFRSX0RJRkYobWVtX3JvdmVyLAorCQkJCQkJCQkgICAgIHRhYmxlX3B0cik7CiAKIAkJCXRhYmxlX2luZm8tPnBoeXNpY2FsX2FkZHJlc3MgPQotCQkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3M7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCSAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBwaHlzaWNhbF9hZGRyZXNzOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJfQogCX0KIApAQCAtNTk2LDggKzU5NSw4IEBACiAJZWxzZSB7CiAJCS8qIDFhKSBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBFQkRBICovCiAKLQkJQUNQSV9NT1ZFXzE2X1RPXzMyICgmcGh5c2ljYWxfYWRkcmVzcywgQUNQSV9FQkRBX1BUUl9MT0NBVElPTik7Ci0JCXBoeXNpY2FsX2FkZHJlc3MgPDw9IDQ7ICAgICAvKiBDb252ZXJ0IHNlZ21lbnQgdG8gcGh5c2ljYWwgYWRkcmVzcyAqLworCQlBQ1BJX01PVkVfMTZfVE9fMzIoJnBoeXNpY2FsX2FkZHJlc3MsIEFDUElfRUJEQV9QVFJfTE9DQVRJT04pOworCQlwaHlzaWNhbF9hZGRyZXNzIDw8PSA0OwkvKiBDb252ZXJ0IHNlZ21lbnQgdG8gcGh5c2ljYWwgYWRkcmVzcyAqLwogCiAJCS8qIEVCREEgcHJlc2VudD8gKi8KIApAQCAtNjA2LDM0ICs2MDUsMzggQEAKIAkJCSAqIDFiKSBTZWFyY2ggRUJEQSBwYXJhZ3JhcGhzIChFQkRhIGlzIHJlcXVpcmVkIHRvIGJlIGEgbWluaW11bSBvZgogCQkJICogICAgIDFfayBsZW5ndGgpCiAJCQkgKi8KLQkJCW1lbV9yb3ZlciA9IGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKAotCQkJCQkgIEFDUElfUEhZU0FERFJfVE9fUFRSIChwaHlzaWNhbF9hZGRyZXNzKSwKLQkJCQkJICBBQ1BJX0VCREFfV0lORE9XX1NJWkUpOworCQkJbWVtX3JvdmVyID0KKwkJCSAgICBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwKEFDUElfUEhZU0FERFJfVE9fUFRSCisJCQkJCQkJIChwaHlzaWNhbF9hZGRyZXNzKSwKKwkJCQkJCQkgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKIAkJCWlmIChtZW1fcm92ZXIpIHsKLQkJCQkvKiBGb3VuZCBpdCwgcmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCisJCQkJLyogUmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCiAKLQkJCQl0YWJsZV9pbmZvLT5waHlzaWNhbF9hZGRyZXNzID0gQUNQSV9UT19JTlRFR0VSIChtZW1fcm92ZXIpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQkJCXRhYmxlX2luZm8tPnBoeXNpY2FsX2FkZHJlc3MgPQorCQkJCSAgICBBQ1BJX1RPX0lOVEVHRVIobWVtX3JvdmVyKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQkJfQogCQl9CiAKIAkJLyogMikgU2VhcmNoIHVwcGVyIG1lbW9yeTogMTYtYnl0ZSBib3VuZGFyaWVzIGluIEUwMDAwaC1GRkZGRmggKi8KIAotCQltZW1fcm92ZXIgPSBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwICgKLQkJCQkgIEFDUElfUEhZU0FERFJfVE9fUFRSIChBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UpLAotCQkJCSAgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKTsKKwkJbWVtX3JvdmVyID0KKwkJICAgIGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAoQUNQSV9QSFlTQUREUl9UT19QVFIKKwkJCQkJCSAoQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFKSwKKwkJCQkJCSBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpOwogCQlpZiAobWVtX3JvdmVyKSB7CiAJCQkvKiBGb3VuZCBpdCwgcmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCiAKLQkJCXRhYmxlX2luZm8tPnBoeXNpY2FsX2FkZHJlc3MgPSBBQ1BJX1RPX0lOVEVHRVIgKG1lbV9yb3Zlcik7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCXRhYmxlX2luZm8tPnBoeXNpY2FsX2FkZHJlc3MgPQorCQkJICAgIEFDUElfVE9fSU5URUdFUihtZW1fcm92ZXIpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJfQogCX0KIAotCS8qIFJTRFAgc2lnbmF0dXJlIHdhcyBub3QgZm91bmQgKi8KKwkvKiBBIHZhbGlkIFJTRFAgd2FzIG5vdCBmb3VuZCAqLwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRk9VTkQpOworCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gdmFsaWQgUlNEUCB3YXMgZm91bmRcbiIpKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKIH0KIAogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMgYi9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCmluZGV4IDc5YzNhNjguLmEyNDg0N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwpAQCAtNzAsOSArNzAsOSBAQAogI2RlZmluZSBDRUxTSVVTX1RPX0tFTFZJTih0KQkoKHQrMjczKSoxMCkKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1RIRVJNQUxfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImFjcGlfdGhlcm1hbCIpCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3RoZXJtYWwiKQogCi1NT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7CisgICAgTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfVEhFUk1BTF9EUklWRVJfTkFNRSk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKQEAgLTgwLDE0MyArODAsMTQ1IEBACiBtb2R1bGVfcGFyYW0odHpwLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh0enAsICJUaGVybWFsIHpvbmUgcG9sbGluZyBmcmVxdWVuY3ksIGluIDEvMTAgc2Vjb25kcy5cbiIpOwogCi0KLXN0YXRpYyBpbnQgYWNwaV90aGVybWFsX2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX3RoZXJtYWxfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV90aGVybWFsX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfc3RhdGVfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF90ZW1wX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfdHJpcF9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBzc2l6ZV90IGFjcGlfdGhlcm1hbF93cml0ZV90cmlwX3BvaW50cyAoc3RydWN0IGZpbGUqLGNvbnN0IGNoYXIgX191c2VyICosc2l6ZV90LGxvZmZfdCAqKTsKK3N0YXRpYyBzc2l6ZV90IGFjcGlfdGhlcm1hbF93cml0ZV90cmlwX3BvaW50cyhzdHJ1Y3QgZmlsZSAqLAorCQkJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsCisJCQkJCSAgICAgIGxvZmZfdCAqKTsKIHN0YXRpYyBpbnQgYWNwaV90aGVybWFsX2Nvb2xpbmdfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgc3NpemVfdCBhY3BpX3RoZXJtYWxfd3JpdGVfY29vbGluZ19tb2RlIChzdHJ1Y3QgZmlsZSosY29uc3QgY2hhciBfX3VzZXIgKixzaXplX3QsbG9mZl90ICopOworc3RhdGljIHNzaXplX3QgYWNwaV90aGVybWFsX3dyaXRlX2Nvb2xpbmdfbW9kZShzdHJ1Y3QgZmlsZSAqLAorCQkJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LAorCQkJCQkgICAgICAgbG9mZl90ICopOwogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcG9sbGluZ19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBzc2l6ZV90IGFjcGlfdGhlcm1hbF93cml0ZV9wb2xsaW5nKHN0cnVjdCBmaWxlKixjb25zdCBjaGFyIF9fdXNlciAqLHNpemVfdCxsb2ZmX3QgKik7CitzdGF0aWMgc3NpemVfdCBhY3BpX3RoZXJtYWxfd3JpdGVfcG9sbGluZyhzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLAorCQkJCQkgIHNpemVfdCwgbG9mZl90ICopOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfdGhlcm1hbF9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJQUNQSV9USEVSTUFMX0RSSVZFUl9OQU1FLAotCS5jbGFzcyA9CUFDUElfVEhFUk1BTF9DTEFTUywKLQkuaWRzID0JCUFDUElfVEhFUk1BTF9ISUQsCi0JLm9wcyA9CQl7Ci0JCQkJLmFkZCA9CQlhY3BpX3RoZXJtYWxfYWRkLAotCQkJCS5yZW1vdmUgPQlhY3BpX3RoZXJtYWxfcmVtb3ZlLAotCQkJfSwKKwkubmFtZSA9IEFDUElfVEhFUk1BTF9EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX1RIRVJNQUxfQ0xBU1MsCisJLmlkcyA9IEFDUElfVEhFUk1BTF9ISUQsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFjcGlfdGhlcm1hbF9hZGQsCisJCS5yZW1vdmUgPSBhY3BpX3RoZXJtYWxfcmVtb3ZlLAorCQl9LAogfTsKIAogc3RydWN0IGFjcGlfdGhlcm1hbF9zdGF0ZSB7Ci0JdTgJCQljcml0aWNhbDoxOwotCXU4CQkJaG90OjE7Ci0JdTgJCQlwYXNzaXZlOjE7Ci0JdTgJCQlhY3RpdmU6MTsKLQl1OAkJCXJlc2VydmVkOjQ7Ci0JaW50CQkJYWN0aXZlX2luZGV4OworCXU4IGNyaXRpY2FsOjE7CisJdTggaG90OjE7CisJdTggcGFzc2l2ZToxOworCXU4IGFjdGl2ZToxOworCXU4IHJlc2VydmVkOjQ7CisJaW50IGFjdGl2ZV9pbmRleDsKIH07CiAKIHN0cnVjdCBhY3BpX3RoZXJtYWxfc3RhdGVfZmxhZ3MgewotCXU4CQkJdmFsaWQ6MTsKLQl1OAkJCWVuYWJsZWQ6MTsKLQl1OAkJCXJlc2VydmVkOjY7CisJdTggdmFsaWQ6MTsKKwl1OCBlbmFibGVkOjE7CisJdTggcmVzZXJ2ZWQ6NjsKIH07CiAKIHN0cnVjdCBhY3BpX3RoZXJtYWxfY3JpdGljYWwgewogCXN0cnVjdCBhY3BpX3RoZXJtYWxfc3RhdGVfZmxhZ3MgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZwkJdGVtcGVyYXR1cmU7CisJdW5zaWduZWQgbG9uZyB0ZW1wZXJhdHVyZTsKIH07CiAKIHN0cnVjdCBhY3BpX3RoZXJtYWxfaG90IHsKIAlzdHJ1Y3QgYWNwaV90aGVybWFsX3N0YXRlX2ZsYWdzIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcJCXRlbXBlcmF0dXJlOworCXVuc2lnbmVkIGxvbmcgdGVtcGVyYXR1cmU7CiB9OwogCiBzdHJ1Y3QgYWNwaV90aGVybWFsX3Bhc3NpdmUgewogCXN0cnVjdCBhY3BpX3RoZXJtYWxfc3RhdGVfZmxhZ3MgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZwkJdGVtcGVyYXR1cmU7Ci0JdW5zaWduZWQgbG9uZwkJdGMxOwotCXVuc2lnbmVkIGxvbmcJCXRjMjsKLQl1bnNpZ25lZCBsb25nCQl0c3A7Ci0Jc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QJZGV2aWNlczsKKwl1bnNpZ25lZCBsb25nIHRlbXBlcmF0dXJlOworCXVuc2lnbmVkIGxvbmcgdGMxOworCXVuc2lnbmVkIGxvbmcgdGMyOworCXVuc2lnbmVkIGxvbmcgdHNwOworCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0IGRldmljZXM7CiB9OwogCiBzdHJ1Y3QgYWNwaV90aGVybWFsX2FjdGl2ZSB7CiAJc3RydWN0IGFjcGlfdGhlcm1hbF9zdGF0ZV9mbGFncyBmbGFnczsKLQl1bnNpZ25lZCBsb25nCQl0ZW1wZXJhdHVyZTsKLQlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdAlkZXZpY2VzOworCXVuc2lnbmVkIGxvbmcgdGVtcGVyYXR1cmU7CisJc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgZGV2aWNlczsKIH07CiAKIHN0cnVjdCBhY3BpX3RoZXJtYWxfdHJpcHMgewogCXN0cnVjdCBhY3BpX3RoZXJtYWxfY3JpdGljYWwgY3JpdGljYWw7Ci0Jc3RydWN0IGFjcGlfdGhlcm1hbF9ob3QJaG90OworCXN0cnVjdCBhY3BpX3RoZXJtYWxfaG90IGhvdDsKIAlzdHJ1Y3QgYWNwaV90aGVybWFsX3Bhc3NpdmUgcGFzc2l2ZTsKIAlzdHJ1Y3QgYWNwaV90aGVybWFsX2FjdGl2ZSBhY3RpdmVbQUNQSV9USEVSTUFMX01BWF9BQ1RJVkVdOwogfTsKIAogc3RydWN0IGFjcGlfdGhlcm1hbF9mbGFncyB7Ci0JdTgJCQljb29saW5nX21vZGU6MTsJCS8qIF9TQ1AgKi8KLQl1OAkJCWRldmljZXM6MTsJCS8qIF9UWkQgKi8KLQl1OAkJCXJlc2VydmVkOjY7CisJdTggY29vbGluZ19tb2RlOjE7CS8qIF9TQ1AgKi8KKwl1OCBkZXZpY2VzOjE7CQkvKiBfVFpEICovCisJdTggcmVzZXJ2ZWQ6NjsKIH07CiAKIHN0cnVjdCBhY3BpX3RoZXJtYWwgewotCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0JYWNwaV9idXNfaWQJCW5hbWU7Ci0JdW5zaWduZWQgbG9uZwkJdGVtcGVyYXR1cmU7Ci0JdW5zaWduZWQgbG9uZwkJbGFzdF90ZW1wZXJhdHVyZTsKLQl1bnNpZ25lZCBsb25nCQlwb2xsaW5nX2ZyZXF1ZW5jeTsKLQl1OAkJCWNvb2xpbmdfbW9kZTsKLQl2b2xhdGlsZSB1OAkJem9tYmllOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlhY3BpX2J1c19pZCBuYW1lOworCXVuc2lnbmVkIGxvbmcgdGVtcGVyYXR1cmU7CisJdW5zaWduZWQgbG9uZyBsYXN0X3RlbXBlcmF0dXJlOworCXVuc2lnbmVkIGxvbmcgcG9sbGluZ19mcmVxdWVuY3k7CisJdTggY29vbGluZ19tb2RlOworCXZvbGF0aWxlIHU4IHpvbWJpZTsKIAlzdHJ1Y3QgYWNwaV90aGVybWFsX2ZsYWdzIGZsYWdzOwogCXN0cnVjdCBhY3BpX3RoZXJtYWxfc3RhdGUgc3RhdGU7CiAJc3RydWN0IGFjcGlfdGhlcm1hbF90cmlwcyB0cmlwczsKLQlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdAlkZXZpY2VzOwotCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0IGRldmljZXM7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiB9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3RoZXJtYWxfc3RhdGVfZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX3RoZXJtYWxfc3RhdGVfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV90aGVybWFsX3N0YXRlX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3RoZXJtYWxfdGVtcF9mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdGhlcm1hbF90ZW1wX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfdGhlcm1hbF90ZW1wX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3RoZXJtYWxfdHJpcF9mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdGhlcm1hbF90cmlwX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLndyaXRlCQk9IGFjcGlfdGhlcm1hbF93cml0ZV90cmlwX3BvaW50cywKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV90aGVybWFsX3RyaXBfb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS53cml0ZSA9IGFjcGlfdGhlcm1hbF93cml0ZV90cmlwX3BvaW50cywKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3RoZXJtYWxfY29vbGluZ19mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdGhlcm1hbF9jb29saW5nX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLndyaXRlCQk9IGFjcGlfdGhlcm1hbF93cml0ZV9jb29saW5nX21vZGUsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfdGhlcm1hbF9jb29saW5nX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBhY3BpX3RoZXJtYWxfd3JpdGVfY29vbGluZ19tb2RlLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfdGhlcm1hbF9wb2xsaW5nX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV90aGVybWFsX3BvbGxpbmdfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkud3JpdGUJCT0gYWNwaV90aGVybWFsX3dyaXRlX3BvbGxpbmcsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfdGhlcm1hbF9wb2xsaW5nX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBhY3BpX3RoZXJtYWxfd3JpdGVfcG9sbGluZywKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVybWFsIFpvbmUgTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludAotYWNwaV90aGVybWFsX2dldF90ZW1wZXJhdHVyZSAoCi0Jc3RydWN0IGFjcGlfdGhlcm1hbCAqdHopCitzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGFjcGlfdGhlcm1hbCAqdHopCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX2dldF90ZW1wZXJhdHVyZSIpOwogCkBAIC0yMjUsNDEgKzIyNywzOSBAQAogCiAJdHotPmxhc3RfdGVtcGVyYXR1cmUgPSB0ei0+dGVtcGVyYXR1cmU7CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmhhbmRsZSwgIl9UTVAiLCBOVUxMLCAmdHotPnRlbXBlcmF0dXJlKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmhhbmRsZSwgIl9UTVAiLCBOVUxMLCAmdHotPnRlbXBlcmF0dXJlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlRlbXBlcmF0dXJlIGlzICVsdSBkS1xuIiwgdHotPnRlbXBlcmF0dXJlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiVGVtcGVyYXR1cmUgaXMgJWx1IGRLXG4iLAorCQkJICB0ei0+dGVtcGVyYXR1cmUpKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3RoZXJtYWxfZ2V0X3BvbGxpbmdfZnJlcXVlbmN5ICgKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eikKK3N0YXRpYyBpbnQgYWNwaV90aGVybWFsX2dldF9wb2xsaW5nX2ZyZXF1ZW5jeShzdHJ1Y3QgYWNwaV90aGVybWFsICp0eikKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfZ2V0X3BvbGxpbmdfZnJlcXVlbmN5Iik7CiAKIAlpZiAoIXR6KQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmhhbmRsZSwgIl9UWlAiLCBOVUxMLCAmdHotPnBvbGxpbmdfZnJlcXVlbmN5KTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmhhbmRsZSwgIl9UWlAiLCBOVUxMLAorCQkJCSAgJnR6LT5wb2xsaW5nX2ZyZXF1ZW5jeSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJQb2xsaW5nIGZyZXF1ZW5jeSBpcyAlbHUgZFNcbiIsIHR6LT5wb2xsaW5nX2ZyZXF1ZW5jeSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlBvbGxpbmcgZnJlcXVlbmN5IGlzICVsdSBkU1xuIiwKKwkJCSAgdHotPnBvbGxpbmdfZnJlcXVlbmN5KSk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV90aGVybWFsX3NldF9wb2xsaW5nICgKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiwKLQlpbnQJCQlzZWNvbmRzKQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfc2V0X3BvbGxpbmcoc3RydWN0IGFjcGlfdGhlcm1hbCAqdHosIGludCBzZWNvbmRzKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGhlcm1hbF9zZXRfcG9sbGluZyIpOwogCkBAIC0yNjgsMjEgKzI2OCwxOSBAQAogCiAJdHotPnBvbGxpbmdfZnJlcXVlbmN5ID0gc2Vjb25kcyAqIDEwOwkvKiBDb252ZXJ0IHZhbHVlIHRvIGRlY2ktc2Vjb25kcyAqLwogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUG9sbGluZyBmcmVxdWVuY3kgc2V0IHRvICVsdSBzZWNvbmRzXG4iLCB0ei0+cG9sbGluZ19mcmVxdWVuY3kpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJQb2xsaW5nIGZyZXF1ZW5jeSBzZXQgdG8gJWx1IHNlY29uZHNcbiIsCisJCQkgIHR6LT5wb2xsaW5nX2ZyZXF1ZW5jeSkpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfdGhlcm1hbF9zZXRfY29vbGluZ19tb2RlICgKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiwKLQlpbnQJCQltb2RlKQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfc2V0X2Nvb2xpbmdfbW9kZShzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiwgaW50IG1vZGUpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb2JqZWN0CWFyZzAgPSB7QUNQSV9UWVBFX0lOVEVHRVJ9OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0CWFyZ19saXN0ID0gezEsICZhcmcwfTsKLQlhY3BpX2hhbmRsZQkJaGFuZGxlID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmcwID0geyBBQ1BJX1RZUEVfSU5URUdFUiB9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0ID0geyAxLCAmYXJnMCB9OworCWFjcGlfaGFuZGxlIGhhbmRsZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfc2V0X2Nvb2xpbmdfbW9kZSIpOwogCkBAIC0zMDMsMTkgKzMwMSwxNiBAQAogCiAJdHotPmNvb2xpbmdfbW9kZSA9IG1vZGU7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJDb29saW5nIG1vZGUgWyVzXVxuIiwgCi0JCW1vZGU/InBhc3NpdmUiOiJhY3RpdmUiKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQ29vbGluZyBtb2RlIFslc11cbiIsCisJCQkgIG1vZGUgPyAicGFzc2l2ZSIgOiAiYWN0aXZlIikpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfdGhlcm1hbF9nZXRfdHJpcF9wb2ludHMgKAotCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6KQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfZ2V0X3RyaXBfcG9pbnRzKHN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6KQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlpbnQJCQlpID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlpbnQgaSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfZ2V0X3RyaXBfcG9pbnRzIik7CiAKQEAgLTMyNCwxMTEgKzMxOSwxMjggQEAKIAogCS8qIENyaXRpY2FsIFNodXRkb3duIChyZXF1aXJlZCkgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+aGFuZGxlLCAiX0NSVCIsIE5VTEwsIAotCQkmdHotPnRyaXBzLmNyaXRpY2FsLnRlbXBlcmF0dXJlKTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmhhbmRsZSwgIl9DUlQiLCBOVUxMLAorCQkJCSAgICAgICAmdHotPnRyaXBzLmNyaXRpY2FsLnRlbXBlcmF0dXJlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJdHotPnRyaXBzLmNyaXRpY2FsLmZsYWdzLnZhbGlkID0gMDsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIk5vIGNyaXRpY2FsIHRocmVzaG9sZFxuIikpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCXR6LT50cmlwcy5jcml0aWNhbC5mbGFncy52YWxpZCA9IDE7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kIGNyaXRpY2FsIHRocmVzaG9sZCBbJWx1XVxuIiwgdHotPnRyaXBzLmNyaXRpY2FsLnRlbXBlcmF0dXJlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJGb3VuZCBjcml0aWNhbCB0aHJlc2hvbGQgWyVsdV1cbiIsCisJCQkJICB0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUpKTsKIAl9CiAKIAkvKiBDcml0aWNhbCBTbGVlcCAob3B0aW9uYWwpICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmhhbmRsZSwgIl9IT1QiLCBOVUxMLCAmdHotPnRyaXBzLmhvdC50ZW1wZXJhdHVyZSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5oYW5kbGUsICJfSE9UIiwgTlVMTCwKKwkJCQkgICZ0ei0+dHJpcHMuaG90LnRlbXBlcmF0dXJlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJdHotPnRyaXBzLmhvdC5mbGFncy52YWxpZCA9IDA7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk5vIGhvdCB0aHJlc2hvbGRcbiIpKTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJdHotPnRyaXBzLmhvdC5mbGFncy52YWxpZCA9IDE7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kIGhvdCB0aHJlc2hvbGQgWyVsdV1cbiIsIHR6LT50cmlwcy5ob3QudGVtcGVyYXR1cmUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRm91bmQgaG90IHRocmVzaG9sZCBbJWx1XVxuIiwKKwkJCQkgIHR6LT50cmlwcy5ob3QudGVtcGVyYXR1cmUpKTsKIAl9CiAKIAkvKiBQYXNzaXZlOiBQcm9jZXNzb3JzIChvcHRpb25hbCkgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+aGFuZGxlLCAiX1BTViIsIE5VTEwsICZ0ei0+dHJpcHMucGFzc2l2ZS50ZW1wZXJhdHVyZSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5oYW5kbGUsICJfUFNWIiwgTlVMTCwKKwkJCQkgICZ0ei0+dHJpcHMucGFzc2l2ZS50ZW1wZXJhdHVyZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkID0gMDsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTm8gcGFzc2l2ZSB0aHJlc2hvbGRcbiIpKTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgPSAxOwogCi0JCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+aGFuZGxlLCAiX1RDMSIsIE5VTEwsICZ0ei0+dHJpcHMucGFzc2l2ZS50YzEpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5oYW5kbGUsICJfVEMxIiwgTlVMTCwKKwkJCQkJICAmdHotPnRyaXBzLnBhc3NpdmUudGMxKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgPSAwOwogCi0JCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+aGFuZGxlLCAiX1RDMiIsIE5VTEwsICZ0ei0+dHJpcHMucGFzc2l2ZS50YzIpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5oYW5kbGUsICJfVEMyIiwgTlVMTCwKKwkJCQkJICAmdHotPnRyaXBzLnBhc3NpdmUudGMyKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgPSAwOwogCi0JCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+aGFuZGxlLCAiX1RTUCIsIE5VTEwsICZ0ei0+dHJpcHMucGFzc2l2ZS50c3ApOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5oYW5kbGUsICJfVFNQIiwgTlVMTCwKKwkJCQkJICAmdHotPnRyaXBzLnBhc3NpdmUudHNwKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgPSAwOwogCi0JCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfcmVmZXJlbmNlKHR6LT5oYW5kbGUsICJfUFNMIiwgTlVMTCwgJnR6LT50cmlwcy5wYXNzaXZlLmRldmljZXMpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UodHotPmhhbmRsZSwgIl9QU0wiLCBOVUxMLAorCQkJCQkgICAgJnR6LT50cmlwcy5wYXNzaXZlLmRldmljZXMpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCQl0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCA9IDA7CiAKIAkJaWYgKCF0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCkKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkludmFsaWQgcGFzc2l2ZSB0aHJlc2hvbGRcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkJICAiSW52YWxpZCBwYXNzaXZlIHRocmVzaG9sZFxuIikpOwogCQllbHNlCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCBwYXNzaXZlIHRocmVzaG9sZCBbJWx1XVxuIiwgdHotPnRyaXBzLnBhc3NpdmUudGVtcGVyYXR1cmUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiRm91bmQgcGFzc2l2ZSB0aHJlc2hvbGQgWyVsdV1cbiIsCisJCQkJCSAgdHotPnRyaXBzLnBhc3NpdmUudGVtcGVyYXR1cmUpKTsKIAl9CiAKIAkvKiBBY3RpdmU6IEZhbnMsIGV0Yy4gKG9wdGlvbmFsKSAqLwogCi0JZm9yIChpPTA7IGk8QUNQSV9USEVSTUFMX01BWF9BQ1RJVkU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRTsgaSsrKSB7CiAKLQkJY2hhciBuYW1lWzVdID0geydfJywnQScsJ0MnLCgnMCcraSksJ1wwJ307CisJCWNoYXIgbmFtZVs1XSA9IHsgJ18nLCAnQScsICdDJywgKCcwJyArIGkpLCAnXDAnIH07CiAKLQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5oYW5kbGUsIG5hbWUsIE5VTEwsICZ0ei0+dHJpcHMuYWN0aXZlW2ldLnRlbXBlcmF0dXJlKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+aGFuZGxlLCBuYW1lLCBOVUxMLAorCQkJCQkgICZ0ei0+dHJpcHMuYWN0aXZlW2ldLnRlbXBlcmF0dXJlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJYnJlYWs7CiAKIAkJbmFtZVsyXSA9ICdMJzsKLQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UodHotPmhhbmRsZSwgbmFtZSwgTlVMTCwgJnR6LT50cmlwcy5hY3RpdmVbaV0uZGV2aWNlcyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V2YWx1YXRlX3JlZmVyZW5jZSh0ei0+aGFuZGxlLCBuYW1lLCBOVUxMLAorCQkJCQkgICAgJnR6LT50cmlwcy5hY3RpdmVbaV0uZGV2aWNlcyk7CiAJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJdHotPnRyaXBzLmFjdGl2ZVtpXS5mbGFncy52YWxpZCA9IDE7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCBhY3RpdmUgdGhyZXNob2xkIFslZF06WyVsdV1cbiIsIGksIHR6LT50cmlwcy5hY3RpdmVbaV0udGVtcGVyYXR1cmUpKTsKLQkJfQotCQllbHNlCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBhY3RpdmUgdGhyZXNob2xkIFslZF1cbiIsIGkpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiRm91bmQgYWN0aXZlIHRocmVzaG9sZCBbJWRdOlslbHVdXG4iLAorCQkJCQkgIGksIHR6LT50cmlwcy5hY3RpdmVbaV0udGVtcGVyYXR1cmUpKTsKKwkJfSBlbHNlCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJJbnZhbGlkIGFjdGl2ZSB0aHJlc2hvbGQgWyVkXVxuIiwKKwkJCQkJICBpKSk7CiAJfQogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfdGhlcm1hbF9nZXRfZGV2aWNlcyAoCi0Jc3RydWN0IGFjcGlfdGhlcm1hbAkqdHopCitzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9nZXRfZGV2aWNlcyhzdHJ1Y3QgYWNwaV90aGVybWFsICp0eikKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfZ2V0X2RldmljZXMiKTsKIAogCWlmICghdHopCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfcmVmZXJlbmNlKHR6LT5oYW5kbGUsICJfVFpEIiwgTlVMTCwgJnR6LT5kZXZpY2VzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX3JlZmVyZW5jZSh0ei0+aGFuZGxlLCAiX1RaRCIsIE5VTEwsICZ0ei0+ZGV2aWNlcyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV90aGVybWFsX2NhbGxfdXNlcm1vZGUgKAotCWNoYXIJCQkqcGF0aCkKK3N0YXRpYyBpbnQgYWNwaV90aGVybWFsX2NhbGxfdXNlcm1vZGUoY2hhciAqcGF0aCkKIHsKLQljaGFyCQkJKmFyZ3ZbMl0gPSB7TlVMTCwgTlVMTH07Ci0JY2hhcgkJCSplbnZwWzNdID0ge05VTEwsIE5VTEwsIE5VTEx9OworCWNoYXIgKmFyZ3ZbMl0gPSB7IE5VTEwsIE5VTEwgfTsKKwljaGFyICplbnZwWzNdID0geyBOVUxMLCBOVUxMLCBOVUxMIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfY2FsbF91c2VybW9kZSIpOwogCkBAIC00NDAsMTkgKzQ1MiwxNiBAQAogCS8qIG1pbmltYWwgY29tbWFuZCBlbnZpcm9ubWVudCAqLwogCWVudnBbMF0gPSAiSE9NRT0vIjsKIAllbnZwWzFdID0gIlBBVEg9L3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4iOwotCQorCiAJY2FsbF91c2VybW9kZWhlbHBlcihhcmd2WzBdLCBhcmd2LCBlbnZwLCAwKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3RoZXJtYWxfY3JpdGljYWwgKAotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6KQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfY3JpdGljYWwoc3RydWN0IGFjcGlfdGhlcm1hbCAqdHopCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX2NyaXRpY2FsIik7CiAKQEAgLTQ2MiwyOSArNDcxLDI4IEBACiAJaWYgKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiQ3JpdGljYWwgdHJpcCBwb2ludFxuIikpOwogCQl0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MuZW5hYmxlZCA9IDE7Ci0JfQotCWVsc2UgaWYgKHR6LT50cmlwcy5jcml0aWNhbC5mbGFncy5lbmFibGVkKQorCX0gZWxzZSBpZiAodHotPnRyaXBzLmNyaXRpY2FsLmZsYWdzLmVuYWJsZWQpCiAJCXR6LT50cmlwcy5jcml0aWNhbC5mbGFncy5lbmFibGVkID0gMDsKIAogCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9kZXZpY2UodHotPmhhbmRsZSwgJmRldmljZSk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiAKLQlwcmludGsoS0VSTl9FTUVSRyAiQ3JpdGljYWwgdGVtcGVyYXR1cmUgcmVhY2hlZCAoJWxkIEMpLCBzaHV0dGluZyBkb3duLlxuIiwgS0VMVklOX1RPX0NFTFNJVVModHotPnRlbXBlcmF0dXJlKSk7Ci0JYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoZGV2aWNlLCBBQ1BJX1RIRVJNQUxfTk9USUZZX0NSSVRJQ0FMLCB0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MuZW5hYmxlZCk7CisJcHJpbnRrKEtFUk5fRU1FUkcKKwkgICAgICAgIkNyaXRpY2FsIHRlbXBlcmF0dXJlIHJlYWNoZWQgKCVsZCBDKSwgc2h1dHRpbmcgZG93bi5cbiIsCisJICAgICAgIEtFTFZJTl9UT19DRUxTSVVTKHR6LT50ZW1wZXJhdHVyZSkpOworCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGRldmljZSwgQUNQSV9USEVSTUFMX05PVElGWV9DUklUSUNBTCwKKwkJCQl0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MuZW5hYmxlZCk7CiAKIAlhY3BpX3RoZXJtYWxfY2FsbF91c2VybW9kZShBQ1BJX1RIRVJNQUxfUEFUSF9QT1dFUk9GRik7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV90aGVybWFsX2hvdCAoCi0Jc3RydWN0IGFjcGlfdGhlcm1hbAkqdHopCitzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9ob3Qoc3RydWN0IGFjcGlfdGhlcm1hbCAqdHopCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX2hvdCIpOwogCkBAIC00OTQsMzAgKzUwMiwyNyBAQAogCWlmICh0ei0+dGVtcGVyYXR1cmUgPj0gdHotPnRyaXBzLmhvdC50ZW1wZXJhdHVyZSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJIb3QgdHJpcCBwb2ludFxuIikpOwogCQl0ei0+dHJpcHMuaG90LmZsYWdzLmVuYWJsZWQgPSAxOwotCX0KLQllbHNlIGlmICh0ei0+dHJpcHMuaG90LmZsYWdzLmVuYWJsZWQpCisJfSBlbHNlIGlmICh0ei0+dHJpcHMuaG90LmZsYWdzLmVuYWJsZWQpCiAJCXR6LT50cmlwcy5ob3QuZmxhZ3MuZW5hYmxlZCA9IDA7CiAKIAlyZXN1bHQgPSBhY3BpX2J1c19nZXRfZGV2aWNlKHR6LT5oYW5kbGUsICZkZXZpY2UpOwogCWlmIChyZXN1bHQpCiAJCXJldHVybl9WQUxVRShyZXN1bHQpOwogCi0JYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoZGV2aWNlLCBBQ1BJX1RIRVJNQUxfTk9USUZZX0hPVCwgdHotPnRyaXBzLmhvdC5mbGFncy5lbmFibGVkKTsKKwlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChkZXZpY2UsIEFDUElfVEhFUk1BTF9OT1RJRllfSE9ULAorCQkJCXR6LT50cmlwcy5ob3QuZmxhZ3MuZW5hYmxlZCk7CiAKIAkvKiBUQkQ6IENhbGwgdXNlci1tb2RlICJzbGVlcChTNCkiIGZ1bmN0aW9uICovCiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV90aGVybWFsX3Bhc3NpdmUgKAotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6KQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcGFzc2l2ZShzdHJ1Y3QgYWNwaV90aGVybWFsICp0eikKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBhY3BpX3RoZXJtYWxfcGFzc2l2ZSAqcGFzc2l2ZSA9IE5VTEw7Ci0JaW50CQkJdHJlbmQgPSAwOwotCWludAkJCWkgPSAwOworCWludCB0cmVuZCA9IDA7CisJaW50IGkgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX3Bhc3NpdmUiKTsKIApAQCAtNTM0LDI1ICs1MzksMjkgQEAKIAkgKiBhY2NvcmRpbmdseS4gIE5vdGUgdGhhdCB3ZSBhc3N1bWUgc3ltbWV0cnkuCiAJICovCiAJaWYgKHR6LT50ZW1wZXJhdHVyZSA+PSBwYXNzaXZlLT50ZW1wZXJhdHVyZSkgewotCQl0cmVuZCA9IChwYXNzaXZlLT50YzEgKiAodHotPnRlbXBlcmF0dXJlIC0gdHotPmxhc3RfdGVtcGVyYXR1cmUpKSArIChwYXNzaXZlLT50YzIgKiAodHotPnRlbXBlcmF0dXJlIC0gcGFzc2l2ZS0+dGVtcGVyYXR1cmUpKTsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAKLQkJCSJ0cmVuZFslZF09KHRjMVslbHVdKih0bXBbJWx1XS1sYXN0WyVsdV0pKSsodGMyWyVsdV0qKHRtcFslbHVdLXBzdlslbHVdKSlcbiIsIAotCQkJdHJlbmQsIHBhc3NpdmUtPnRjMSwgdHotPnRlbXBlcmF0dXJlLCAKLQkJCXR6LT5sYXN0X3RlbXBlcmF0dXJlLCBwYXNzaXZlLT50YzIsIAotCQkJdHotPnRlbXBlcmF0dXJlLCBwYXNzaXZlLT50ZW1wZXJhdHVyZSkpOworCQl0cmVuZCA9CisJCSAgICAocGFzc2l2ZS0+dGMxICogKHR6LT50ZW1wZXJhdHVyZSAtIHR6LT5sYXN0X3RlbXBlcmF0dXJlKSkgKworCQkgICAgKHBhc3NpdmUtPnRjMiAqICh0ei0+dGVtcGVyYXR1cmUgLSBwYXNzaXZlLT50ZW1wZXJhdHVyZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAidHJlbmRbJWRdPSh0YzFbJWx1XSoodG1wWyVsdV0tbGFzdFslbHVdKSkrKHRjMlslbHVdKih0bXBbJWx1XS1wc3ZbJWx1XSkpXG4iLAorCQkJCSAgdHJlbmQsIHBhc3NpdmUtPnRjMSwgdHotPnRlbXBlcmF0dXJlLAorCQkJCSAgdHotPmxhc3RfdGVtcGVyYXR1cmUsIHBhc3NpdmUtPnRjMiwKKwkJCQkgIHR6LT50ZW1wZXJhdHVyZSwgcGFzc2l2ZS0+dGVtcGVyYXR1cmUpKTsKIAkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MuZW5hYmxlZCA9IDE7CiAJCS8qIEhlYXRpbmcgdXA/ICovCiAJCWlmICh0cmVuZCA+IDApCi0JCQlmb3IgKGk9MDsgaTxwYXNzaXZlLT5kZXZpY2VzLmNvdW50OyBpKyspCi0JCQkJYWNwaV9wcm9jZXNzb3Jfc2V0X3RoZXJtYWxfbGltaXQoCi0JCQkJCXBhc3NpdmUtPmRldmljZXMuaGFuZGxlc1tpXSwgCi0JCQkJCUFDUElfUFJPQ0VTU09SX0xJTUlUX0lOQ1JFTUVOVCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgcGFzc2l2ZS0+ZGV2aWNlcy5jb3VudDsgaSsrKQorCQkJCWFjcGlfcHJvY2Vzc29yX3NldF90aGVybWFsX2xpbWl0KHBhc3NpdmUtPgorCQkJCQkJCQkgZGV2aWNlcy4KKwkJCQkJCQkJIGhhbmRsZXNbaV0sCisJCQkJCQkJCSBBQ1BJX1BST0NFU1NPUl9MSU1JVF9JTkNSRU1FTlQpOwogCQkvKiBDb29saW5nIG9mZj8gKi8KIAkJZWxzZSBpZiAodHJlbmQgPCAwKQotCQkJZm9yIChpPTA7IGk8cGFzc2l2ZS0+ZGV2aWNlcy5jb3VudDsgaSsrKQotCQkJCWFjcGlfcHJvY2Vzc29yX3NldF90aGVybWFsX2xpbWl0KAotCQkJCQlwYXNzaXZlLT5kZXZpY2VzLmhhbmRsZXNbaV0sIAotCQkJCQlBQ1BJX1BST0NFU1NPUl9MSU1JVF9ERUNSRU1FTlQpOworCQkJZm9yIChpID0gMDsgaSA8IHBhc3NpdmUtPmRldmljZXMuY291bnQ7IGkrKykKKwkJCQlhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhlcm1hbF9saW1pdChwYXNzaXZlLT4KKwkJCQkJCQkJIGRldmljZXMuCisJCQkJCQkJCSBoYW5kbGVzW2ldLAorCQkJCQkJCQkgQUNQSV9QUk9DRVNTT1JfTElNSVRfREVDUkVNRU5UKTsKIAl9CiAKIAkvKgpAQCAtNTYzLDM3ICs1NzIsMzUgQEAKIAkgKiBhc3N1bWUgc3ltbWV0cnkuCiAJICovCiAJZWxzZSBpZiAodHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MuZW5hYmxlZCkgewotCQlmb3IgKGk9MDsgaTxwYXNzaXZlLT5kZXZpY2VzLmNvdW50OyBpKyspCi0JCQlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhlcm1hbF9saW1pdCgKLQkJCQlwYXNzaXZlLT5kZXZpY2VzLmhhbmRsZXNbaV0sIAotCQkJCUFDUElfUFJPQ0VTU09SX0xJTUlUX0RFQ1JFTUVOVCk7CisJCWZvciAoaSA9IDA7IGkgPCBwYXNzaXZlLT5kZXZpY2VzLmNvdW50OyBpKyspCisJCQlyZXN1bHQgPQorCQkJICAgIGFjcGlfcHJvY2Vzc29yX3NldF90aGVybWFsX2xpbWl0KHBhc3NpdmUtPmRldmljZXMuCisJCQkJCQkJICAgICBoYW5kbGVzW2ldLAorCQkJCQkJCSAgICAgQUNQSV9QUk9DRVNTT1JfTElNSVRfREVDUkVNRU5UKTsKIAkJaWYgKHJlc3VsdCA9PSAxKSB7CiAJCQl0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy5lbmFibGVkID0gMDsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgCi0JCQkJIkRpc2FibGluZyBwYXNzaXZlIGNvb2xpbmcgKHpvbmUgaXMgY29vbClcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiRGlzYWJsaW5nIHBhc3NpdmUgY29vbGluZyAoem9uZSBpcyBjb29sKVxuIikpOwogCQl9CiAJfQogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfdGhlcm1hbF9hY3RpdmUgKAotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6KQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfYWN0aXZlKHN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6KQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IGFjcGlfdGhlcm1hbF9hY3RpdmUgKmFjdGl2ZSA9IE5VTEw7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgaSA9IDA7Ci0JaW50CQkJaiA9IDA7Ci0JdW5zaWduZWQgbG9uZwkJbWF4dGVtcCA9IDA7CisJaW50IGkgPSAwOworCWludCBqID0gMDsKKwl1bnNpZ25lZCBsb25nIG1heHRlbXAgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX2FjdGl2ZSIpOwogCiAJaWYgKCF0eikKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCi0JZm9yIChpPTA7IGk8QUNQSV9USEVSTUFMX01BWF9BQ1RJVkU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRTsgaSsrKSB7CiAKIAkJYWN0aXZlID0gJih0ei0+dHJpcHMuYWN0aXZlW2ldKTsKIAkJaWYgKCFhY3RpdmUgfHwgIWFjdGl2ZS0+ZmxhZ3MudmFsaWQpCkBAIC02MDcsMTYgKzYxNCwyNyBAQAogCQkgKi8KIAkJaWYgKHR6LT50ZW1wZXJhdHVyZSA+PSBhY3RpdmUtPnRlbXBlcmF0dXJlKSB7CiAJCQlpZiAoYWN0aXZlLT50ZW1wZXJhdHVyZSA+IG1heHRlbXApCi0JCQkJdHotPnN0YXRlLmFjdGl2ZV9pbmRleCA9IGksIG1heHRlbXAgPSBhY3RpdmUtPnRlbXBlcmF0dXJlOworCQkJCXR6LT5zdGF0ZS5hY3RpdmVfaW5kZXggPSBpLCBtYXh0ZW1wID0KKwkJCQkgICAgYWN0aXZlLT50ZW1wZXJhdHVyZTsKIAkJCWlmICghYWN0aXZlLT5mbGFncy5lbmFibGVkKSB7CiAJCQkJZm9yIChqID0gMDsgaiA8IGFjdGl2ZS0+ZGV2aWNlcy5jb3VudDsgaisrKSB7Ci0JCQkJCXJlc3VsdCA9IGFjcGlfYnVzX3NldF9wb3dlcihhY3RpdmUtPmRldmljZXMuaGFuZGxlc1tqXSwgQUNQSV9TVEFURV9EMCk7CisJCQkJCXJlc3VsdCA9CisJCQkJCSAgICBhY3BpX2J1c19zZXRfcG93ZXIoYWN0aXZlLT5kZXZpY2VzLgorCQkJCQkJCSAgICAgICBoYW5kbGVzW2pdLAorCQkJCQkJCSAgICAgICBBQ1BJX1NUQVRFX0QwKTsKIAkJCQkJaWYgKHJlc3VsdCkgewotCQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiVW5hYmxlIHRvIHR1cm4gY29vbGluZyBkZXZpY2UgWyVwXSAnb24nXG4iLCBhY3RpdmUtPmRldmljZXMuaGFuZGxlc1tqXSkpOworCQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCQkJCQkgICJVbmFibGUgdG8gdHVybiBjb29saW5nIGRldmljZSBbJXBdICdvbidcbiIsCisJCQkJCQkJCSAgYWN0aXZlLT4KKwkJCQkJCQkJICBkZXZpY2VzLgorCQkJCQkJCQkgIGhhbmRsZXNbal0pKTsKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9CiAJCQkJCWFjdGl2ZS0+ZmxhZ3MuZW5hYmxlZCA9IDE7Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkNvb2xpbmcgZGV2aWNlIFslcF0gbm93ICdvbidcbiIsIGFjdGl2ZS0+ZGV2aWNlcy5oYW5kbGVzW2pdKSk7CisJCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJCQkgICJDb29saW5nIGRldmljZSBbJXBdIG5vdyAnb24nXG4iLAorCQkJCQkJCSAgYWN0aXZlLT5kZXZpY2VzLgorCQkJCQkJCSAgaGFuZGxlc1tqXSkpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtNjI4LDEzICs2NDYsMjEgQEAKIAkJICovCiAJCWVsc2UgaWYgKGFjdGl2ZS0+ZmxhZ3MuZW5hYmxlZCkgewogCQkJZm9yIChqID0gMDsgaiA8IGFjdGl2ZS0+ZGV2aWNlcy5jb3VudDsgaisrKSB7Ci0JCQkJcmVzdWx0ID0gYWNwaV9idXNfc2V0X3Bvd2VyKGFjdGl2ZS0+ZGV2aWNlcy5oYW5kbGVzW2pdLCBBQ1BJX1NUQVRFX0QzKTsKKwkJCQlyZXN1bHQgPQorCQkJCSAgICBhY3BpX2J1c19zZXRfcG93ZXIoYWN0aXZlLT5kZXZpY2VzLgorCQkJCQkJICAgICAgIGhhbmRsZXNbal0sCisJCQkJCQkgICAgICAgQUNQSV9TVEFURV9EMyk7CiAJCQkJaWYgKHJlc3VsdCkgewotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJVbmFibGUgdG8gdHVybiBjb29saW5nIGRldmljZSBbJXBdICdvZmYnXG4iLCBhY3RpdmUtPmRldmljZXMuaGFuZGxlc1tqXSkpOworCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJCQkJICAiVW5hYmxlIHRvIHR1cm4gY29vbGluZyBkZXZpY2UgWyVwXSAnb2ZmJ1xuIiwKKwkJCQkJCQkgIGFjdGl2ZS0+ZGV2aWNlcy4KKwkJCQkJCQkgIGhhbmRsZXNbal0pKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCWFjdGl2ZS0+ZmxhZ3MuZW5hYmxlZCA9IDA7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQ29vbGluZyBkZXZpY2UgWyVwXSBub3cgJ29mZidcbiIsIGFjdGl2ZS0+ZGV2aWNlcy5oYW5kbGVzW2pdKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkJICAiQ29vbGluZyBkZXZpY2UgWyVwXSBub3cgJ29mZidcbiIsCisJCQkJCQkgIGFjdGl2ZS0+ZGV2aWNlcy5oYW5kbGVzW2pdKSk7CiAJCQl9CiAJCX0KIAl9CkBAIC02NDIsMjggKzY2OCwyMiBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAorc3RhdGljIHZvaWQgYWNwaV90aGVybWFsX2NoZWNrKHZvaWQgKmNvbnRleHQpOwogCi1zdGF0aWMgdm9pZCBhY3BpX3RoZXJtYWxfY2hlY2sgKHZvaWQgKmNvbnRleHQpOwotCi1zdGF0aWMgdm9pZAotYWNwaV90aGVybWFsX3J1biAoCi0JdW5zaWduZWQgbG9uZwkJZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfdGhlcm1hbF9ydW4odW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKilkYXRhOwogCWlmICghdHotPnpvbWJpZSkKLQkJYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKE9TRF9QUklPUklUWV9HUEUsICAKLQkJCWFjcGlfdGhlcm1hbF9jaGVjaywgKHZvaWQgKikgZGF0YSk7CisJCWFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbihPU0RfUFJJT1JJVFlfR1BFLAorCQkJCQkgICAgYWNwaV90aGVybWFsX2NoZWNrLCAodm9pZCAqKWRhdGEpOwogfQogCi0KLXN0YXRpYyB2b2lkCi1hY3BpX3RoZXJtYWxfY2hlY2sgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV90aGVybWFsX2NoZWNrKHZvaWQgKmRhdGEpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopIGRhdGE7Ci0JdW5zaWduZWQgbG9uZwkJc2xlZXBfdGltZSA9IDA7Ci0JaW50CQkJaSA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfdGhlcm1hbCAqdHogPSAoc3RydWN0IGFjcGlfdGhlcm1hbCAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBzbGVlcF90aW1lID0gMDsKKwlpbnQgaSA9IDA7CiAJc3RydWN0IGFjcGlfdGhlcm1hbF9zdGF0ZSBzdGF0ZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGhlcm1hbF9jaGVjayIpOwpAQCAtNjc4LDkgKzY5OCw5IEBACiAJcmVzdWx0ID0gYWNwaV90aGVybWFsX2dldF90ZW1wZXJhdHVyZSh0eik7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuX1ZPSUQ7Ci0JCisKIAltZW1zZXQoJnR6LT5zdGF0ZSwgMCwgc2l6ZW9mKHR6LT5zdGF0ZSkpOwotCQorCiAJLyoKIAkgKiBDaGVjayBUcmlwIFBvaW50cwogCSAqIC0tLS0tLS0tLS0tLS0tLS0tCkBAIC02OTAsMTQgKzcxMCwxOCBAQAogCSAqIGluZGl2aWR1YWwgcG9saWN5IGRlY2lkZXMgd2hlbiBpdCBpcyBleGl0ZWQgKGUuZy4gaHlzdGVyZXNpcykuCiAJICovCiAJaWYgKHR6LT50cmlwcy5jcml0aWNhbC5mbGFncy52YWxpZCkKLQkJc3RhdGUuY3JpdGljYWwgfD0gKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUpOworCQlzdGF0ZS5jcml0aWNhbCB8PQorCQkgICAgKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUpOwogCWlmICh0ei0+dHJpcHMuaG90LmZsYWdzLnZhbGlkKQogCQlzdGF0ZS5ob3QgfD0gKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMuaG90LnRlbXBlcmF0dXJlKTsKIAlpZiAodHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQpCi0JCXN0YXRlLnBhc3NpdmUgfD0gKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMucGFzc2l2ZS50ZW1wZXJhdHVyZSk7Ci0JZm9yIChpPTA7IGk8QUNQSV9USEVSTUFMX01BWF9BQ1RJVkU7IGkrKykKKwkJc3RhdGUucGFzc2l2ZSB8PQorCQkgICAgKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMucGFzc2l2ZS50ZW1wZXJhdHVyZSk7CisJZm9yIChpID0gMDsgaSA8IEFDUElfVEhFUk1BTF9NQVhfQUNUSVZFOyBpKyspCiAJCWlmICh0ei0+dHJpcHMuYWN0aXZlW2ldLmZsYWdzLnZhbGlkKQotCQkJc3RhdGUuYWN0aXZlIHw9ICh0ei0+dGVtcGVyYXR1cmUgPj0gdHotPnRyaXBzLmFjdGl2ZVtpXS50ZW1wZXJhdHVyZSk7CisJCQlzdGF0ZS5hY3RpdmUgfD0KKwkJCSAgICAodHotPnRlbXBlcmF0dXJlID49CisJCQkgICAgIHR6LT50cmlwcy5hY3RpdmVbaV0udGVtcGVyYXR1cmUpOwogCiAJLyoKIAkgKiBJbnZva2UgUG9saWN5CkBAIC03MjYsNyArNzUwLDcgQEAKIAkJdHotPnN0YXRlLmhvdCA9IDE7CiAJaWYgKHR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLmVuYWJsZWQpCiAJCXR6LT5zdGF0ZS5wYXNzaXZlID0gMTsKLQlmb3IgKGk9MDsgaTxBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRTsgaSsrKQogCQlpZiAodHotPnRyaXBzLmFjdGl2ZVtpXS5mbGFncy5lbmFibGVkKQogCQkJdHotPnN0YXRlLmFjdGl2ZSA9IDE7CiAKQEAgLTc0NCw4ICs3NjgsOCBAQAogCWVsc2UgaWYgKHR6LT5wb2xsaW5nX2ZyZXF1ZW5jeSA+IDApCiAJCXNsZWVwX3RpbWUgPSB0ei0+cG9sbGluZ19mcmVxdWVuY3kgKiAxMDA7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICIlczogdGVtcGVyYXR1cmVbJWx1XSBzbGVlcFslbHVdXG4iLCAKLQkJdHotPm5hbWUsIHR6LT50ZW1wZXJhdHVyZSwgc2xlZXBfdGltZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIiVzOiB0ZW1wZXJhdHVyZVslbHVdIHNsZWVwWyVsdV1cbiIsCisJCQkgIHR6LT5uYW1lLCB0ei0+dGVtcGVyYXR1cmUsIHNsZWVwX3RpbWUpKTsKIAogCS8qCiAJICogU2NoZWR1bGUgTmV4dCBQb2xsCkBAIC03NTQsMTIgKzc3OCwxMSBAQAogCWlmICghc2xlZXBfdGltZSkgewogCQlpZiAodGltZXJfcGVuZGluZygmKHR6LT50aW1lcikpKQogCQkJZGVsX3RpbWVyKCYodHotPnRpbWVyKSk7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCWlmICh0aW1lcl9wZW5kaW5nKCYodHotPnRpbWVyKSkpCiAJCQltb2RfdGltZXIoJih0ei0+dGltZXIpLCAoSFogKiBzbGVlcF90aW1lKSAvIDEwMDApOwogCQllbHNlIHsKLQkJCXR6LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHR6OworCQkJdHotPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyl0ejsKIAkJCXR6LT50aW1lci5mdW5jdGlvbiA9IGFjcGlfdGhlcm1hbF9ydW47CiAJCQl0ei0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogKiBzbGVlcF90aW1lKSAvIDEwMDA7CiAJCQlhZGRfdGltZXIoJih0ei0+dGltZXIpKTsKQEAgLTc2OSwxNiArNzkyLDE1IEBACiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5CSphY3BpX3RoZXJtYWxfZGlyOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV90aGVybWFsX2RpcjsKIAogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfc3RhdGVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKilzZXEtPnByaXZhdGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfc3RhdGVfc2VxX3Nob3ciKTsKIApAQCAtNzg3LDcgKzgwOSw4IEBACiAKIAlzZXFfcHV0cyhzZXEsICJzdGF0ZTogICAgICAgICAgICAgICAgICAgIik7CiAKLQlpZiAoIXR6LT5zdGF0ZS5jcml0aWNhbCAmJiAhdHotPnN0YXRlLmhvdCAmJiAhdHotPnN0YXRlLnBhc3NpdmUgJiYgIXR6LT5zdGF0ZS5hY3RpdmUpCisJaWYgKCF0ei0+c3RhdGUuY3JpdGljYWwgJiYgIXR6LT5zdGF0ZS5ob3QgJiYgIXR6LT5zdGF0ZS5wYXNzaXZlCisJICAgICYmICF0ei0+c3RhdGUuYWN0aXZlKQogCQlzZXFfcHV0cyhzZXEsICJva1xuIik7CiAJZWxzZSB7CiAJCWlmICh0ei0+c3RhdGUuY3JpdGljYWwpCkBAIC04MDEsNyArODI0LDcgQEAKIAkJc2VxX3B1dHMoc2VxLCAiXG4iKTsKIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKQEAgLTgxMCwxMSArODMzLDEwIEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfdGhlcm1hbF9zdGF0ZV9zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKLQogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfdGVtcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0Jc3RydWN0IGFjcGlfdGhlcm1hbAkqdHogPSAoc3RydWN0IGFjcGlfdGhlcm1hbCAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopc2VxLT5wcml2YXRlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX3RlbXBfc2VxX3Nob3ciKTsKIApAQCAtODI1LDEwICs4NDcsMTAgQEAKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKIAotCXNlcV9wcmludGYoc2VxLCAidGVtcGVyYXR1cmU6ICAgICAgICAgICAgICVsZCBDXG4iLCAKLQkJS0VMVklOX1RPX0NFTFNJVVModHotPnRlbXBlcmF0dXJlKSk7CisJc2VxX3ByaW50ZihzZXEsICJ0ZW1wZXJhdHVyZTogICAgICAgICAgICAgJWxkIENcbiIsCisJCSAgIEtFTFZJTl9UT19DRUxTSVVTKHR6LT50ZW1wZXJhdHVyZSkpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCkBAIC04MzcsMTIgKzg1OSwxMSBAQAogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3RoZXJtYWxfdGVtcF9zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKLQogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfdHJpcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKilzZXEtPnByaXZhdGU7Ci0JaW50CQkJaSA9IDA7Ci0JaW50CQkJaiA9IDA7CisJc3RydWN0IGFjcGlfdGhlcm1hbCAqdHogPSAoc3RydWN0IGFjcGlfdGhlcm1hbCAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgaSA9IDA7CisJaW50IGogPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX3RyaXBfc2VxX3Nob3ciKTsKIApAQCAtODUxLDIxICs4NzIsMjIgQEAKIAogCWlmICh0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MudmFsaWQpCiAJCXNlcV9wcmludGYoc2VxLCAiY3JpdGljYWwgKFM1KTogICAgICAgICAgICVsZCBDXG4iLAotCQkJS0VMVklOX1RPX0NFTFNJVVModHotPnRyaXBzLmNyaXRpY2FsLnRlbXBlcmF0dXJlKSk7CisJCQkgICBLRUxWSU5fVE9fQ0VMU0lVUyh0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUpKTsKIAogCWlmICh0ei0+dHJpcHMuaG90LmZsYWdzLnZhbGlkKQogCQlzZXFfcHJpbnRmKHNlcSwgImhvdCAoUzQpOiAgICAgICAgICAgICAgICAlbGQgQ1xuIiwKLQkJCUtFTFZJTl9UT19DRUxTSVVTKHR6LT50cmlwcy5ob3QudGVtcGVyYXR1cmUpKTsKKwkJCSAgIEtFTFZJTl9UT19DRUxTSVVTKHR6LT50cmlwcy5ob3QudGVtcGVyYXR1cmUpKTsKIAogCWlmICh0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCkgewotCQlzZXFfcHJpbnRmKHNlcSwgInBhc3NpdmU6ICAgICAgICAgICAgICAgICAlbGQgQzogdGMxPSVsdSB0YzI9JWx1IHRzcD0lbHUgZGV2aWNlcz0iLAotCQkJS0VMVklOX1RPX0NFTFNJVVModHotPnRyaXBzLnBhc3NpdmUudGVtcGVyYXR1cmUpLAotCQkJdHotPnRyaXBzLnBhc3NpdmUudGMxLAotCQkJdHotPnRyaXBzLnBhc3NpdmUudGMyLCAKLQkJCXR6LT50cmlwcy5wYXNzaXZlLnRzcCk7Ci0JCWZvciAoaj0wOyBqPHR6LT50cmlwcy5wYXNzaXZlLmRldmljZXMuY291bnQ7IGorKykgeworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICJwYXNzaXZlOiAgICAgICAgICAgICAgICAgJWxkIEM6IHRjMT0lbHUgdGMyPSVsdSB0c3A9JWx1IGRldmljZXM9IiwKKwkJCSAgIEtFTFZJTl9UT19DRUxTSVVTKHR6LT50cmlwcy5wYXNzaXZlLnRlbXBlcmF0dXJlKSwKKwkJCSAgIHR6LT50cmlwcy5wYXNzaXZlLnRjMSwgdHotPnRyaXBzLnBhc3NpdmUudGMyLAorCQkJICAgdHotPnRyaXBzLnBhc3NpdmUudHNwKTsKKwkJZm9yIChqID0gMDsgaiA8IHR6LT50cmlwcy5wYXNzaXZlLmRldmljZXMuY291bnQ7IGorKykgewogCi0JCQlzZXFfcHJpbnRmKHNlcSwgIjB4JXAgIiwgdHotPnRyaXBzLnBhc3NpdmUuZGV2aWNlcy5oYW5kbGVzW2pdKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiMHglcCAiLAorCQkJCSAgIHR6LT50cmlwcy5wYXNzaXZlLmRldmljZXMuaGFuZGxlc1tqXSk7CiAJCX0KIAkJc2VxX3B1dHMoc2VxLCAiXG4iKTsKIAl9CkBAIC04NzQsMTQgKzg5NiwxNSBAQAogCQlpZiAoISh0ei0+dHJpcHMuYWN0aXZlW2ldLmZsYWdzLnZhbGlkKSkKIAkJCWJyZWFrOwogCQlzZXFfcHJpbnRmKHNlcSwgImFjdGl2ZVslZF06ICAgICAgICAgICAgICAgJWxkIEM6IGRldmljZXM9IiwKLQkJCWksIEtFTFZJTl9UT19DRUxTSVVTKHR6LT50cmlwcy5hY3RpdmVbaV0udGVtcGVyYXR1cmUpKTsKLQkJZm9yIChqID0gMDsgaiA8IHR6LT50cmlwcy5hY3RpdmVbaV0uZGV2aWNlcy5jb3VudDsgaisrKSAKKwkJCSAgIGksCisJCQkgICBLRUxWSU5fVE9fQ0VMU0lVUyh0ei0+dHJpcHMuYWN0aXZlW2ldLnRlbXBlcmF0dXJlKSk7CisJCWZvciAoaiA9IDA7IGogPCB0ei0+dHJpcHMuYWN0aXZlW2ldLmRldmljZXMuY291bnQ7IGorKykKIAkJCXNlcV9wcmludGYoc2VxLCAiMHglcCAiLAotCQkJCXR6LT50cmlwcy5hY3RpdmVbaV0uZGV2aWNlcy5oYW5kbGVzW2pdKTsKKwkJCQkgICB0ei0+dHJpcHMuYWN0aXZlW2ldLmRldmljZXMuaGFuZGxlc1tqXSk7CiAJCXNlcV9wdXRzKHNlcSwgIlxuIik7CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCkBAIC04OTEsMzAgKzkxNCwyOCBAQAogfQogCiBzdGF0aWMgc3NpemVfdAotYWNwaV90aGVybWFsX3dyaXRlX3RyaXBfcG9pbnRzICgKLSAgICAgICAgc3RydWN0IGZpbGUJCSpmaWxlLAotICAgICAgICBjb25zdCBjaGFyCQlfX3VzZXIgKmJ1ZmZlciwKLSAgICAgICAgc2l6ZV90CQkJY291bnQsCi0gICAgICAgIGxvZmZfdAkJCSpwcG9zKQorYWNwaV90aGVybWFsX3dyaXRlX3RyaXBfcG9pbnRzKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKIHsKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopbS0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKiltLT5wcml2YXRlOwogCi0JY2hhcgkJCSpsaW1pdF9zdHJpbmc7IAotCWludAkJCW51bSwgY3JpdGljYWwsIGhvdCwgcGFzc2l2ZTsKLQlpbnQJCQkqYWN0aXZlOyAKLQlpbnQJCQlpID0gMDsKKwljaGFyICpsaW1pdF9zdHJpbmc7CisJaW50IG51bSwgY3JpdGljYWwsIGhvdCwgcGFzc2l2ZTsKKwlpbnQgKmFjdGl2ZTsKKwlpbnQgaSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfd3JpdGVfdHJpcF9wb2ludHMiKTsKIAogCWxpbWl0X3N0cmluZyA9IGttYWxsb2MoQUNQSV9USEVSTUFMX01BWF9MSU1JVF9TVFJfTEVOLCBHRlBfS0VSTkVMKTsKLQlpZighbGltaXRfc3RyaW5nKQorCWlmICghbGltaXRfc3RyaW5nKQogCQlyZXR1cm5fVkFMVUUoLUVOT01FTSk7CiAKIAltZW1zZXQobGltaXRfc3RyaW5nLCAwLCBBQ1BJX1RIRVJNQUxfTUFYX0xJTUlUX1NUUl9MRU4pOwogCi0JYWN0aXZlID0ga21hbGxvYyhBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRSAqc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOwotCWlmKCFhY3RpdmUpCisJYWN0aXZlID0ga21hbGxvYyhBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRSAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFjdGl2ZSkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9NRU0pOwogCiAJaWYgKCF0eiB8fCAoY291bnQgPiBBQ1BJX1RIRVJNQUxfTUFYX0xJTUlUX1NUUl9MRU4gLSAxKSkgewpAQCAtOTIyLDIwICs5NDMsMjEgQEAKIAkJY291bnQgPSAtRUlOVkFMOwogCQlnb3RvIGVuZDsKIAl9Ci0JCisKIAlpZiAoY29weV9mcm9tX3VzZXIobGltaXRfc3RyaW5nLCBidWZmZXIsIGNvdW50KSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBkYXRhXG4iKSk7CiAJCWNvdW50ID0gLUVGQVVMVDsKIAkJZ290byBlbmQ7CiAJfQotCQorCiAJbGltaXRfc3RyaW5nW2NvdW50XSA9ICdcMCc7CiAKIAludW0gPSBzc2NhbmYobGltaXRfc3RyaW5nLCAiJWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQiLAotCQkJCSZjcml0aWNhbCwgJmhvdCwgJnBhc3NpdmUsCi0JCQkJJmFjdGl2ZVswXSwgJmFjdGl2ZVsxXSwgJmFjdGl2ZVsyXSwgJmFjdGl2ZVszXSwgJmFjdGl2ZVs0XSwKLQkJCQkmYWN0aXZlWzVdLCAmYWN0aXZlWzZdLCAmYWN0aXZlWzddLCAmYWN0aXZlWzhdLCAmYWN0aXZlWzldKTsKLQlpZighKG51bSA+PTUgJiYgbnVtIDwgKEFDUElfVEhFUk1BTF9NQVhfQUNUSVZFICsgMykpKSB7CisJCSAgICAgJmNyaXRpY2FsLCAmaG90LCAmcGFzc2l2ZSwKKwkJICAgICAmYWN0aXZlWzBdLCAmYWN0aXZlWzFdLCAmYWN0aXZlWzJdLCAmYWN0aXZlWzNdLCAmYWN0aXZlWzRdLAorCQkgICAgICZhY3RpdmVbNV0sICZhY3RpdmVbNl0sICZhY3RpdmVbN10sICZhY3RpdmVbOF0sCisJCSAgICAgJmFjdGl2ZVs5XSk7CisJaWYgKCEobnVtID49IDUgJiYgbnVtIDwgKEFDUElfVEhFUk1BTF9NQVhfQUNUSVZFICsgMykpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGRhdGEgZm9ybWF0XG4iKSk7CiAJCWNvdW50ID0gLUVJTlZBTDsKIAkJZ290byBlbmQ7CkBAIC05NDksMTcgKzk3MSwxNiBAQAogCQkJYnJlYWs7CiAJCXR6LT50cmlwcy5hY3RpdmVbaV0udGVtcGVyYXR1cmUgPSBDRUxTSVVTX1RPX0tFTFZJTihhY3RpdmVbaV0pOwogCX0KLQkKLWVuZDoKKworICAgICAgZW5kOgogCWtmcmVlKGFjdGl2ZSk7CiAJa2ZyZWUobGltaXRfc3RyaW5nKTsKIAlyZXR1cm5fVkFMVUUoY291bnQpOwogfQogCi0KIHN0YXRpYyBpbnQgYWNwaV90aGVybWFsX2Nvb2xpbmdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKilzZXEtPnByaXZhdGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfY29vbGluZ19zZXFfc2hvdyIpOwogCkBAIC05NzAsMzMgKzk5MSwzMSBAQAogCQlzZXFfcHV0cyhzZXEsICI8c2V0dGluZyBub3Qgc3VwcG9ydGVkPlxuIik7CiAJfQogCi0JaWYgKCB0ei0+Y29vbGluZ19tb2RlID09IEFDUElfVEhFUk1BTF9NT0RFX0NSSVRJQ0FMICkKKwlpZiAodHotPmNvb2xpbmdfbW9kZSA9PSBBQ1BJX1RIRVJNQUxfTU9ERV9DUklUSUNBTCkKIAkJc2VxX3ByaW50ZihzZXEsICJjb29saW5nIG1vZGU6CWNyaXRpY2FsXG4iKTsKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAiY29vbGluZyBtb2RlOgklc1xuIiwKLQkJCXR6LT5jb29saW5nX21vZGU/InBhc3NpdmUiOiJhY3RpdmUiKTsKKwkJCSAgIHR6LT5jb29saW5nX21vZGUgPyAicGFzc2l2ZSIgOiAiYWN0aXZlIik7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV90aGVybWFsX2Nvb2xpbmdfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV90aGVybWFsX2Nvb2xpbmdfc2VxX3Nob3csCi0JCQkJCQkJUERFKGlub2RlKS0+ZGF0YSk7CisJCQkgICBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAogc3RhdGljIHNzaXplX3QKLWFjcGlfdGhlcm1hbF93cml0ZV9jb29saW5nX21vZGUgKAotCXN0cnVjdCBmaWxlCQkqZmlsZSwKLQljb25zdCBjaGFyCQlfX3VzZXIgKmJ1ZmZlciwKLQlzaXplX3QJCQljb3VudCwKLQlsb2ZmX3QJCQkqcHBvcykKK2FjcGlfdGhlcm1hbF93cml0ZV9jb29saW5nX21vZGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewotCXN0cnVjdCBzZXFfZmlsZQkJKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKiltLT5wcml2YXRlOwotCWludAkJCXJlc3VsdCA9IDA7Ci0JY2hhcgkJCW1vZGVfc3RyaW5nWzEyXSA9IHsnXDAnfTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKiltLT5wcml2YXRlOworCWludCByZXN1bHQgPSAwOworCWNoYXIgbW9kZV9zdHJpbmdbMTJdID0geyAnXDAnIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfd3JpdGVfY29vbGluZ19tb2RlIik7CiAKQEAgLTEwMDgsMTEgKzEwMjcsMTIgQEAKIAogCWlmIChjb3B5X2Zyb21fdXNlcihtb2RlX3N0cmluZywgYnVmZmVyLCBjb3VudCkpCiAJCXJldHVybl9WQUxVRSgtRUZBVUxUKTsKLQkKKwogCW1vZGVfc3RyaW5nW2NvdW50XSA9ICdcMCc7Ci0JCi0JcmVzdWx0ID0gYWNwaV90aGVybWFsX3NldF9jb29saW5nX21vZGUodHosIAotCQlzaW1wbGVfc3RydG91bChtb2RlX3N0cmluZywgTlVMTCwgMCkpOworCisJcmVzdWx0ID0gYWNwaV90aGVybWFsX3NldF9jb29saW5nX21vZGUodHosCisJCQkJCSAgICAgICBzaW1wbGVfc3RydG91bChtb2RlX3N0cmluZywgTlVMTCwKKwkJCQkJCQkgICAgICAwKSk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiAKQEAgLTEwMjEsMTAgKzEwNDEsOSBAQAogCXJldHVybl9WQUxVRShjb3VudCk7CiB9CiAKLQogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcG9sbGluZ19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKilzZXEtPnByaXZhdGU7CisJc3RydWN0IGFjcGlfdGhlcm1hbCAqdHogPSAoc3RydWN0IGFjcGlfdGhlcm1hbCAqKXNlcS0+cHJpdmF0ZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGhlcm1hbF9wb2xsaW5nX3NlcV9zaG93Iik7CiAKQEAgLTEwMzcsNDMgKzEwNTYsNDEgQEAKIAl9CiAKIAlzZXFfcHJpbnRmKHNlcSwgInBvbGxpbmcgZnJlcXVlbmN5OiAgICAgICAlbHUgc2Vjb25kc1xuIiwKLQkJKHR6LT5wb2xsaW5nX2ZyZXF1ZW5jeSAvIDEwKSk7CisJCSAgICh0ei0+cG9sbGluZ19mcmVxdWVuY3kgLyAxMCkpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCiBzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9wb2xsaW5nX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfdGhlcm1hbF9wb2xsaW5nX3NlcV9zaG93LAotCQkJCQkJCVBERShpbm9kZSktPmRhdGEpOworCQkJICAgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90Ci1hY3BpX3RoZXJtYWxfd3JpdGVfcG9sbGluZyAoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCWNvbnN0IGNoYXIJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpwcG9zKQorYWNwaV90aGVybWFsX3dyaXRlX3BvbGxpbmcoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKIHsKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopbS0+cHJpdmF0ZTsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWNoYXIJCQlwb2xsaW5nX3N0cmluZ1sxMl0gPSB7J1wwJ307Ci0JaW50CQkJc2Vjb25kcyA9IDA7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopbS0+cHJpdmF0ZTsKKwlpbnQgcmVzdWx0ID0gMDsKKwljaGFyIHBvbGxpbmdfc3RyaW5nWzEyXSA9IHsgJ1wwJyB9OworCWludCBzZWNvbmRzID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGhlcm1hbF93cml0ZV9wb2xsaW5nIik7CiAKIAlpZiAoIXR6IHx8IChjb3VudCA+IHNpemVvZihwb2xsaW5nX3N0cmluZykgLSAxKSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwotCQorCiAJaWYgKGNvcHlfZnJvbV91c2VyKHBvbGxpbmdfc3RyaW5nLCBidWZmZXIsIGNvdW50KSkKIAkJcmV0dXJuX1ZBTFVFKC1FRkFVTFQpOwotCQorCiAJcG9sbGluZ19zdHJpbmdbY291bnRdID0gJ1wwJzsKIAogCXNlY29uZHMgPSBzaW1wbGVfc3RydG91bChwb2xsaW5nX3N0cmluZywgTlVMTCwgMCk7Ci0JCisKIAlyZXN1bHQgPSBhY3BpX3RoZXJtYWxfc2V0X3BvbGxpbmcodHosIHNlY29uZHMpOwogCWlmIChyZXN1bHQpCiAJCXJldHVybl9WQUxVRShyZXN1bHQpOwpAQCAtMTA4MywxOCArMTEwMCwxNSBAQAogCXJldHVybl9WQUxVRShjb3VudCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV90aGVybWFsX2FkZF9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9hZGRfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeSA9IE5VTEw7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfYWRkX2ZzIik7CiAKIAlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKSB7CiAJCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gcHJvY19ta2RpcihhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJCWFjcGlfdGhlcm1hbF9kaXIpOworCQkJCQkJICAgICBhY3BpX3RoZXJtYWxfZGlyKTsKIAkJaWYgKCFhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSktPm93bmVyID0gVEhJU19NT0RVTEU7CkBAIC0xMTAyLDExICsxMTE2LDExIEBACiAKIAkvKiAnc3RhdGUnIFtSXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9USEVSTUFMX0ZJTEVfU1RBVEUsCi0JCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfVEhFUk1BTF9GSUxFX1NUQVRFKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9USEVSTUFMX0ZJTEVfU1RBVEUpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3RoZXJtYWxfc3RhdGVfZm9wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC0xMTE1LDExICsxMTI5LDExIEBACiAKIAkvKiAndGVtcGVyYXR1cmUnIFtSXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9USEVSTUFMX0ZJTEVfVEVNUEVSQVRVUkUsCi0JCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfVEhFUk1BTF9GSUxFX1RFTVBFUkFUVVJFKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9USEVSTUFMX0ZJTEVfVEVNUEVSQVRVUkUpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3RoZXJtYWxfdGVtcF9mb3BzOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKQEAgLTExMjgsMTEgKzExNDIsMTIgQEAKIAogCS8qICd0cmlwX3BvaW50cycgW1IvV10gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfVEhFUk1BTF9GSUxFX1RSSVBfUE9JTlRTLAotCQlTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9USEVSTUFMX0ZJTEVfVFJJUF9QT0lOVFMpKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCisJCQkJICBBQ1BJX1RIRVJNQUxfRklMRV9UUklQX1BPSU5UUykpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdGhlcm1hbF90cmlwX2ZvcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtMTE0MSwxMSArMTE1NiwxMiBAQAogCiAJLyogJ2Nvb2xpbmdfbW9kZScgW1IvV10gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfVEhFUk1BTF9GSUxFX0NPT0xJTkdfTU9ERSwKLQkJU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfVEhFUk1BTF9GSUxFX0NPT0xJTkdfTU9ERSkpOworCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkgIEFDUElfVEhFUk1BTF9GSUxFX0NPT0xJTkdfTU9ERSkpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdGhlcm1hbF9jb29saW5nX2ZvcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtMTE1NCwxMSArMTE3MCwxMiBAQAogCiAJLyogJ3BvbGxpbmdfZnJlcXVlbmN5JyBbUi9XXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9USEVSTUFMX0ZJTEVfUE9MTElOR19GUkVRLAotCQlTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9USEVSTUFMX0ZJTEVfUE9MTElOR19GUkVRKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9USEVSTUFMX0ZJTEVfUE9MTElOR19GUkVRKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV90aGVybWFsX3BvbGxpbmdfZm9wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC0xMTY4LDEwICsxMTg1LDcgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV90aGVybWFsX3JlbW92ZV9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX3JlbW92ZV9mcyIpOwogCkBAIC0xMTkzLDE5ICsxMjA3LDE0IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZAotYWNwaV90aGVybWFsX25vdGlmeSAoCi0JYWNwaV9oYW5kbGUgCQloYW5kbGUsCi0JdTMyIAkJCWV2ZW50LAotCXZvaWQgCQkJKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3RoZXJtYWxfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKikgZGF0YTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfdGhlcm1hbCAqdHogPSAoc3RydWN0IGFjcGlfdGhlcm1hbCAqKWRhdGE7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX25vdGlmeSIpOwogCkBAIC0xMjMxLDE5ICsxMjQwLDE2IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJVbnN1cHBvcnRlZCBldmVudCBbMHgleF1cbiIsIGV2ZW50KSk7CisJCQkJICAiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOwogCQlicmVhazsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3RoZXJtYWxfZ2V0X2luZm8gKAotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6KQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfZ2V0X2luZm8oc3RydWN0IGFjcGlfdGhlcm1hbCAqdHopCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGhlcm1hbF9nZXRfaW5mbyIpOwogCkBAIC0xMjYyLDIwICsxMjY4LDI0IEBACiAKIAkvKiBTZXQgdGhlIGNvb2xpbmcgbW9kZSBbX1NDUF0gdG8gYWN0aXZlIGNvb2xpbmcgKGRlZmF1bHQpICovCiAJcmVzdWx0ID0gYWNwaV90aGVybWFsX3NldF9jb29saW5nX21vZGUodHosIEFDUElfVEhFUk1BTF9NT0RFX0FDVElWRSk7Ci0JaWYgKCFyZXN1bHQpIAorCWlmICghcmVzdWx0KQogCQl0ei0+ZmxhZ3MuY29vbGluZ19tb2RlID0gMTsKLQllbHNlIHsgCisJZWxzZSB7CiAJCS8qIE9oLHdlIGhhdmUgbm90IF9TQ1AgbWV0aG9kLgotCQkgICBHZW5lcmFsbHkgc2hvdyBjb29saW5nX21vZGUgYnkgX0FDeCwgX1BTVixzcGVjIDEyLjIqLworCQkgICBHZW5lcmFsbHkgc2hvdyBjb29saW5nX21vZGUgYnkgX0FDeCwgX1BTVixzcGVjIDEyLjIgKi8KIAkJdHotPmZsYWdzLmNvb2xpbmdfbW9kZSA9IDA7Ci0JCWlmICggdHotPnRyaXBzLmFjdGl2ZVswXS5mbGFncy52YWxpZCAmJiB0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCApIHsKLQkJCWlmICggdHotPnRyaXBzLnBhc3NpdmUudGVtcGVyYXR1cmUgPiB0ei0+dHJpcHMuYWN0aXZlWzBdLnRlbXBlcmF0dXJlICkKKwkJaWYgKHR6LT50cmlwcy5hY3RpdmVbMF0uZmxhZ3MudmFsaWQKKwkJICAgICYmIHR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkKSB7CisJCQlpZiAodHotPnRyaXBzLnBhc3NpdmUudGVtcGVyYXR1cmUgPgorCQkJICAgIHR6LT50cmlwcy5hY3RpdmVbMF0udGVtcGVyYXR1cmUpCiAJCQkJdHotPmNvb2xpbmdfbW9kZSA9IEFDUElfVEhFUk1BTF9NT0RFX0FDVElWRTsKLQkJCWVsc2UgCisJCQllbHNlCiAJCQkJdHotPmNvb2xpbmdfbW9kZSA9IEFDUElfVEhFUk1BTF9NT0RFX1BBU1NJVkU7Ci0JCX0gZWxzZSBpZiAoICF0ei0+dHJpcHMuYWN0aXZlWzBdLmZsYWdzLnZhbGlkICYmIHR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkICkgeworCQl9IGVsc2UgaWYgKCF0ei0+dHJpcHMuYWN0aXZlWzBdLmZsYWdzLnZhbGlkCisJCQkgICAmJiB0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCkgewogCQkJdHotPmNvb2xpbmdfbW9kZSA9IEFDUElfVEhFUk1BTF9NT0RFX1BBU1NJVkU7Ci0JCX0gZWxzZSBpZiAoIHR6LT50cmlwcy5hY3RpdmVbMF0uZmxhZ3MudmFsaWQgJiYgIXR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkICkgeworCQl9IGVsc2UgaWYgKHR6LT50cmlwcy5hY3RpdmVbMF0uZmxhZ3MudmFsaWQKKwkJCSAgICYmICF0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCkgewogCQkJdHotPmNvb2xpbmdfbW9kZSA9IEFDUElfVEhFUk1BTF9NT0RFX0FDVElWRTsKIAkJfSBlbHNlIHsKIAkJCS8qIF9BQ3ggYW5kIF9QU1YgYXJlIG9wdGlvbmFsLCBidXQgX0NSVCBpcyByZXF1aXJlZCAqLwpAQCAtMTI5NywxNCArMTMwNywxMSBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3RoZXJtYWxfYWRkICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgCQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6ID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfYWRkIik7CiAKQEAgLTEzMzUsMTkgKzEzNDIsMjAgQEAKIAlhY3BpX3RoZXJtYWxfY2hlY2sodHopOwogCiAJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKHR6LT5oYW5kbGUsCi0JCUFDUElfREVWSUNFX05PVElGWSwgYWNwaV90aGVybWFsX25vdGlmeSwgdHopOworCQkJCQkgICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgICBhY3BpX3RoZXJtYWxfbm90aWZ5LCB0eik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlbmQ7CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc10gKCVsZCBDKVxuIiwKLQkJYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJS0VMVklOX1RPX0NFTFNJVVModHotPnRlbXBlcmF0dXJlKSk7CisJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCisJICAgICAgIEtFTFZJTl9UT19DRUxTSVVTKHR6LT50ZW1wZXJhdHVyZSkpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkgewogCQlhY3BpX3RoZXJtYWxfcmVtb3ZlX2ZzKGRldmljZSk7CiAJCWtmcmVlKHR6KTsKQEAgLTEzNTYsMjEgKzEzNjQsMTcgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3RoZXJtYWxfcmVtb3ZlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlpbnQJCQl0eXBlKQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfdGhlcm1hbAkqdHogPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGhlcm1hbF9yZW1vdmUiKTsKIAogCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCXR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKIAkvKiBhdm9pZCB0aW1lciBhZGRpbmcgbmV3IGRlZmVyIHRhc2sgKi8KIAl0ei0+em9tYmllID0gMTsKQEAgLTEzODIsMTkgKzEzODYsMTkgQEAKIAlkZWxfdGltZXJfc3luYygmKHR6LT50aW1lcikpOwogCiAJc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIodHotPmhhbmRsZSwKLQkJQUNQSV9ERVZJQ0VfTk9USUZZLCBhY3BpX3RoZXJtYWxfbm90aWZ5KTsKKwkJCQkJICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgIGFjcGlfdGhlcm1hbF9ub3RpZnkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAKIAkvKiBUZXJtaW5hdGUgcG9saWN5ICovCi0JaWYgKHR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkCi0JCSYmIHR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLmVuYWJsZWQpIHsKKwlpZiAodHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgJiYgdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MuZW5hYmxlZCkgewogCQl0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy5lbmFibGVkID0gMDsKIAkJYWNwaV90aGVybWFsX3Bhc3NpdmUodHopOwogCX0KIAlpZiAodHotPnRyaXBzLmFjdGl2ZVswXS5mbGFncy52YWxpZAotCQkmJiB0ei0+dHJpcHMuYWN0aXZlWzBdLmZsYWdzLmVuYWJsZWQpIHsKKwkgICAgJiYgdHotPnRyaXBzLmFjdGl2ZVswXS5mbGFncy5lbmFibGVkKSB7CiAJCXR6LT50cmlwcy5hY3RpdmVbMF0uZmxhZ3MuZW5hYmxlZCA9IDA7CiAJCWFjcGlfdGhlcm1hbF9hY3RpdmUodHopOwogCX0KQEAgLTE0MDUsMTEgKzE0MDksOSBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV90aGVybWFsX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3RoZXJtYWxfaW5pdCh2b2lkKQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfaW5pdCIpOwogCkBAIC0xNDI3LDkgKzE0MjksNyBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWFjcGlfdGhlcm1hbF9leGl0ICh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGFjcGlfdGhlcm1hbF9leGl0KHZvaWQpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX2V4aXQiKTsKIApAQCAtMTQ0MCw2ICsxNDQwLDUgQEAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiBtb2R1bGVfaW5pdChhY3BpX3RoZXJtYWxfaW5pdCk7CiBtb2R1bGVfZXhpdChhY3BpX3RoZXJtYWxfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMgYi9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMKaW5kZXggNzNiMWQ4YS4uN2ZlMGI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS90b3NoaWJhX2FjcGkuYwpAQCAtMTAwLDggKzEwMCw3IEBACiAvKiB1dGlsaXR5CiAgKi8KIAotc3RhdGljIF9faW5saW5lX18gdm9pZAotX3NldF9iaXQodTMyKiB3b3JkLCB1MzIgbWFzaywgaW50IHZhbHVlKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfc2V0X2JpdCh1MzIgKiB3b3JkLCB1MzIgbWFzaywgaW50IHZhbHVlKQogewogCSp3b3JkID0gKCp3b3JkICYgfm1hc2spIHwgKG1hc2sgKiB2YWx1ZSk7CiB9CkBAIC0xMDksMzUgKzEwOCwzMiBAQAogLyogYWNwaSBpbnRlcmZhY2Ugd3JhcHBlcnMKICAqLwogCi1zdGF0aWMgaW50Ci1pc192YWxpZF9hY3BpX3BhdGgoY29uc3QgY2hhciogbWV0aG9kTmFtZSkKK3N0YXRpYyBpbnQgaXNfdmFsaWRfYWNwaV9wYXRoKGNvbnN0IGNoYXIgKm1ldGhvZE5hbWUpCiB7CiAJYWNwaV9oYW5kbGUgaGFuZGxlOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCAoY2hhciopbWV0aG9kTmFtZSwgJmhhbmRsZSk7CisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIChjaGFyICopbWV0aG9kTmFtZSwgJmhhbmRsZSk7CiAJcmV0dXJuICFBQ1BJX0ZBSUxVUkUoc3RhdHVzKTsKIH0KIAotc3RhdGljIGludAotd3JpdGVfYWNwaV9pbnQoY29uc3QgY2hhciogbWV0aG9kTmFtZSwgaW50IHZhbCkKK3N0YXRpYyBpbnQgd3JpdGVfYWNwaV9pbnQoY29uc3QgY2hhciAqbWV0aG9kTmFtZSwgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CiAJdW5pb24gYWNwaV9vYmplY3QgaW5fb2Jqc1sxXTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlwYXJhbXMuY291bnQgPSBzaXplb2YoaW5fb2Jqcykvc2l6ZW9mKGluX29ianNbMF0pOworCXBhcmFtcy5jb3VudCA9IHNpemVvZihpbl9vYmpzKSAvIHNpemVvZihpbl9vYmpzWzBdKTsKIAlwYXJhbXMucG9pbnRlciA9IGluX29ianM7CiAJaW5fb2Jqc1swXS50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CiAJaW5fb2Jqc1swXS5pbnRlZ2VyLnZhbHVlID0gdmFsOwogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgKGNoYXIqKW1ldGhvZE5hbWUsICZwYXJhbXMsIE5VTEwpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsIChjaGFyICopbWV0aG9kTmFtZSwgJnBhcmFtcywgTlVMTCk7CiAJcmV0dXJuIChzdGF0dXMgPT0gQUVfT0spOwogfQogCiAjaWYgMAotc3RhdGljIGludAotcmVhZF9hY3BpX2ludChjb25zdCBjaGFyKiBtZXRob2ROYW1lLCBpbnQqIHBWYWwpCitzdGF0aWMgaW50IHJlYWRfYWNwaV9pbnQoY29uc3QgY2hhciAqbWV0aG9kTmFtZSwgaW50ICpwVmFsKQogewogCXN0cnVjdCBhY3BpX2J1ZmZlciByZXN1bHRzOwogCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmpzWzFdOwpAQCAtMTQ2LDI1ICsxNDIsMjQgQEAKIAlyZXN1bHRzLmxlbmd0aCA9IHNpemVvZihvdXRfb2Jqcyk7CiAJcmVzdWx0cy5wb2ludGVyID0gb3V0X29ianM7CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCgwLCAoY2hhciopbWV0aG9kTmFtZSwgMCwgJnJlc3VsdHMpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KDAsIChjaGFyICopbWV0aG9kTmFtZSwgMCwgJnJlc3VsdHMpOwogCSpwVmFsID0gb3V0X29ianNbMF0uaW50ZWdlci52YWx1ZTsKIAogCXJldHVybiAoc3RhdHVzID09IEFFX09LKSAmJiAob3V0X29ianNbMF0udHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUik7CiB9CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IGNoYXIqCQltZXRob2RfaGNpIC8qPSAwKi87CitzdGF0aWMgY29uc3QgY2hhciAqbWV0aG9kX2hjaSAvKj0gMCovIDsKIAogLyogUGVyZm9ybSBhIHJhdyBIQ0kgY2FsbC4gIEhlcmUgd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnB1dCBvciBvdXRwdXQgYnVmZmVyCiAgKiBmb3JtYXQuCiAgKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotaGNpX3Jhdyhjb25zdCB1MzIgaW5bSENJX1dPUkRTXSwgdTMyIG91dFtIQ0lfV09SRFNdKQorc3RhdGljIGFjcGlfc3RhdHVzIGhjaV9yYXcoY29uc3QgdTMyIGluW0hDSV9XT1JEU10sIHUzMiBvdXRbSENJX1dPUkRTXSkKIHsKIAlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CiAJdW5pb24gYWNwaV9vYmplY3QgaW5fb2Jqc1tIQ0lfV09SRFNdOwogCXN0cnVjdCBhY3BpX2J1ZmZlciByZXN1bHRzOwotCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmpzW0hDSV9XT1JEUysxXTsKKwl1bmlvbiBhY3BpX29iamVjdCBvdXRfb2Jqc1tIQ0lfV09SRFMgKyAxXTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJaW50IGk7CiAKQEAgLTE3OCw4ICsxNzMsOCBAQAogCXJlc3VsdHMubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmpzKTsKIAlyZXN1bHRzLnBvaW50ZXIgPSBvdXRfb2JqczsKIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsIChjaGFyKiltZXRob2RfaGNpLCAmcGFyYW1zLAotCQkmcmVzdWx0cyk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgKGNoYXIgKiltZXRob2RfaGNpLCAmcGFyYW1zLAorCQkJCSAgICAgICZyZXN1bHRzKTsKIAlpZiAoKHN0YXR1cyA9PSBBRV9PSykgJiYgKG91dF9vYmpzLT5wYWNrYWdlLmNvdW50IDw9IEhDSV9XT1JEUykpIHsKIAkJZm9yIChpID0gMDsgaSA8IG91dF9vYmpzLT5wYWNrYWdlLmNvdW50OyArK2kpIHsKIAkJCW91dFtpXSA9IG91dF9vYmpzLT5wYWNrYWdlLmVsZW1lbnRzW2ldLmludGVnZXIudmFsdWU7CkBAIC0xOTUsOCArMTkwLDcgQEAKICAqIG1heSBiZSB1c2VmdWwgKHN1Y2ggYXMgIm5vdCBzdXBwb3J0ZWQiKS4KICAqLwogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWhjaV93cml0ZTEodTMyIHJlZywgdTMyIGluMSwgdTMyKiByZXN1bHQpCitzdGF0aWMgYWNwaV9zdGF0dXMgaGNpX3dyaXRlMSh1MzIgcmVnLCB1MzIgaW4xLCB1MzIgKiByZXN1bHQpCiB7CiAJdTMyIGluW0hDSV9XT1JEU10gPSB7IEhDSV9TRVQsIHJlZywgaW4xLCAwLCAwLCAwIH07CiAJdTMyIG91dFtIQ0lfV09SRFNdOwpAQCAtMjA1LDggKzE5OSw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzCi1oY2lfcmVhZDEodTMyIHJlZywgdTMyKiBvdXQxLCB1MzIqIHJlc3VsdCkKK3N0YXRpYyBhY3BpX3N0YXR1cyBoY2lfcmVhZDEodTMyIHJlZywgdTMyICogb3V0MSwgdTMyICogcmVzdWx0KQogewogCXUzMiBpbltIQ0lfV09SRFNdID0geyBIQ0lfR0VULCByZWcsIDAsIDAsIDAsIDAgfTsKIAl1MzIgb3V0W0hDSV9XT1JEU107CkBAIC0yMTYsMjYgKzIwOSwyNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkqCXRvc2hpYmFfcHJvY19kaXIgLyo9IDAqLzsKLXN0YXRpYyBpbnQJCQlmb3JjZV9mYW47Ci1zdGF0aWMgaW50CQkJbGFzdF9rZXlfZXZlbnQ7Ci1zdGF0aWMgaW50CQkJa2V5X2V2ZW50X3ZhbGlkOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdG9zaGliYV9wcm9jX2RpciAvKj0gMCovIDsKK3N0YXRpYyBpbnQgZm9yY2VfZmFuOworc3RhdGljIGludCBsYXN0X2tleV9ldmVudDsKK3N0YXRpYyBpbnQga2V5X2V2ZW50X3ZhbGlkOwogCi10eXBlZGVmIHN0cnVjdCBfUHJvY0l0ZW0KLXsKLQljb25zdCBjaGFyKiBuYW1lOwotCWNoYXIqICgqcmVhZF9mdW5jKShjaGFyKik7Ci0JdW5zaWduZWQgbG9uZyAoKndyaXRlX2Z1bmMpKGNvbnN0IGNoYXIqLCB1bnNpZ25lZCBsb25nKTsKK3R5cGVkZWYgc3RydWN0IF9Qcm9jSXRlbSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyICooKnJlYWRfZnVuYykgKGNoYXIgKik7CisJdW5zaWduZWQgbG9uZyAoKndyaXRlX2Z1bmMpIChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpOwogfSBQcm9jSXRlbTsKIAogLyogcHJvYyBmaWxlIGhhbmRsZXJzCiAgKi8KIAogc3RhdGljIGludAotZGlzcGF0Y2hfcmVhZChjaGFyKiBwYWdlLCBjaGFyKiogc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQqIGVvZiwKLQlQcm9jSXRlbSogaXRlbSkKK2Rpc3BhdGNoX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsCisJICAgICAgUHJvY0l0ZW0gKiBpdGVtKQogewotCWNoYXIqIHAgPSBwYWdlOworCWNoYXIgKnAgPSBwYWdlOwogCWludCBsZW47CiAKIAlpZiAob2ZmID09IDApCkBAIC0yNDMsMzMgKzIzNSwzNSBAQAogCiAJLyogSVNTVUU6IEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGlzIGNvZGUgKi8KIAlsZW4gPSAocCAtIHBhZ2UpOwotCWlmIChsZW4gPD0gb2ZmK2NvdW50KSAqZW9mID0gMTsKKwlpZiAobGVuIDw9IG9mZiArIGNvdW50KQorCQkqZW9mID0gMTsKIAkqc3RhcnQgPSBwYWdlICsgb2ZmOwogCWxlbiAtPSBvZmY7Ci0JaWYgKGxlbj5jb3VudCkgbGVuID0gY291bnQ7Ci0JaWYgKGxlbjwwKSBsZW4gPSAwOworCWlmIChsZW4gPiBjb3VudCkKKwkJbGVuID0gY291bnQ7CisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CiAJcmV0dXJuIGxlbjsKIH0KIAogc3RhdGljIGludAotZGlzcGF0Y2hfd3JpdGUoc3RydWN0IGZpbGUqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAotCXVuc2lnbmVkIGxvbmcgY291bnQsIFByb2NJdGVtKiBpdGVtKQorZGlzcGF0Y2hfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCBQcm9jSXRlbSAqIGl0ZW0pCiB7CiAJaW50IHJlc3VsdDsKLQljaGFyKiB0bXBfYnVmZmVyOworCWNoYXIgKnRtcF9idWZmZXI7CiAKIAkvKiBBcmcgYnVmZmVyIHBvaW50cyB0byB1c2Vyc3BhY2UgbWVtb3J5LCB3aGljaCBjYW4ndCBiZSBhY2Nlc3NlZAogCSAqIGRpcmVjdGx5LiAgU2luY2Ugd2UncmUgbWFraW5nIGEgY29weSwgemVyby10ZXJtaW5hdGUgdGhlCiAJICogZGVzdGluYXRpb24gc28gdGhhdCBzc2NhbmYgY2FuIGJlIHVzZWQgb24gaXQgc2FmZWx5LgogCSAqLwogCXRtcF9idWZmZXIgPSBrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYoIXRtcF9idWZmZXIpCisJaWYgKCF0bXBfYnVmZmVyKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcih0bXBfYnVmZmVyLCBidWZmZXIsIGNvdW50KSkgewogCQlyZXN1bHQgPSAtRUZBVUxUOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQl0bXBfYnVmZmVyW2NvdW50XSA9IDA7CiAJCXJlc3VsdCA9IGl0ZW0tPndyaXRlX2Z1bmModG1wX2J1ZmZlciwgY291bnQpOwogCX0KQEAgLTI3Nyw4ICsyNzEsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBjaGFyKgotcmVhZF9sY2QoY2hhciogcCkKK3N0YXRpYyBjaGFyICpyZWFkX2xjZChjaGFyICpwKQogewogCXUzMiBoY2lfcmVzdWx0OwogCXUzMiB2YWx1ZTsKQEAgLTI4OCw3ICsyODEsNyBAQAogCQl2YWx1ZSA9IHZhbHVlID4+IEhDSV9MQ0RfQlJJR0hUTkVTU19TSElGVDsKIAkJcCArPSBzcHJpbnRmKHAsICJicmlnaHRuZXNzOiAgICAgICAgICAgICAgJWRcbiIsIHZhbHVlKTsKIAkJcCArPSBzcHJpbnRmKHAsICJicmlnaHRuZXNzX2xldmVsczogICAgICAgJWRcbiIsCi0JCQlIQ0lfTENEX0JSSUdIVE5FU1NfTEVWRUxTKTsKKwkJCSAgICAgSENJX0xDRF9CUklHSFRORVNTX0xFVkVMUyk7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKE1ZX0VSUiAiRXJyb3IgcmVhZGluZyBMQ0QgYnJpZ2h0bmVzc1xuIik7CiAJfQpAQCAtMjk2LDE0ICsyODksMTMgQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXdyaXRlX2xjZChjb25zdCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3cml0ZV9sY2QoY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCWludCB2YWx1ZTsKIAl1MzIgaGNpX3Jlc3VsdDsKIAogCWlmIChzc2NhbmYoYnVmZmVyLCAiIGJyaWdodG5lc3MgOiAlaSIsICZ2YWx1ZSkgPT0gMSAmJgotCQkJdmFsdWUgPj0gMCAmJiB2YWx1ZSA8IEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMpIHsKKwkgICAgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8IEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMpIHsKIAkJdmFsdWUgPSB2YWx1ZSA8PCBIQ0lfTENEX0JSSUdIVE5FU1NfU0hJRlQ7CiAJCWhjaV93cml0ZTEoSENJX0xDRF9CUklHSFRORVNTLCB2YWx1ZSwgJmhjaV9yZXN1bHQpOwogCQlpZiAoaGNpX3Jlc3VsdCAhPSBIQ0lfU1VDQ0VTUykKQEAgLTMxNSw4ICszMDcsNyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIGNoYXIqCi1yZWFkX3ZpZGVvKGNoYXIqIHApCitzdGF0aWMgY2hhciAqcmVhZF92aWRlbyhjaGFyICpwKQogewogCXUzMiBoY2lfcmVzdWx0OwogCXUzMiB2YWx1ZTsKQEAgLTMyNSw3ICszMTYsNyBAQAogCWlmIChoY2lfcmVzdWx0ID09IEhDSV9TVUNDRVNTKSB7CiAJCWludCBpc19sY2QgPSAodmFsdWUgJiBIQ0lfVklERU9fT1VUX0xDRCkgPyAxIDogMDsKIAkJaW50IGlzX2NydCA9ICh2YWx1ZSAmIEhDSV9WSURFT19PVVRfQ1JUKSA/IDEgOiAwOwotCQlpbnQgaXNfdHYgID0gKHZhbHVlICYgSENJX1ZJREVPX09VVF9UViApID8gMSA6IDA7CisJCWludCBpc190diA9ICh2YWx1ZSAmIEhDSV9WSURFT19PVVRfVFYpID8gMSA6IDA7CiAJCXAgKz0gc3ByaW50ZihwLCAibGNkX291dDogICAgICAgICAgICAgICAgICVkXG4iLCBpc19sY2QpOwogCQlwICs9IHNwcmludGYocCwgImNydF9vdXQ6ICAgICAgICAgICAgICAgICAlZFxuIiwgaXNfY3J0KTsKIAkJcCArPSBzcHJpbnRmKHAsICJ0dl9vdXQ6ICAgICAgICAgICAgICAgICAgJWRcbiIsIGlzX3R2KTsKQEAgLTMzNiw4ICszMjcsNyBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotd3JpdGVfdmlkZW8oY29uc3QgY2hhciogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KQorc3RhdGljIHVuc2lnbmVkIGxvbmcgd3JpdGVfdmlkZW8oY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCWludCB2YWx1ZTsKIAlpbnQgcmVtYWluID0gY291bnQ7CkBAIC0zNjMsNyArMzUzLDcgQEAKIAkJCSsrYnVmZmVyOwogCQkJLS1yZW1haW47CiAJCX0KLQkJd2hpbGUgKHJlbWFpbiAmJiAqKGJ1ZmZlci0xKSAhPSAnOycpOworCQl3aGlsZSAocmVtYWluICYmICooYnVmZmVyIC0gMSkgIT0gJzsnKTsKIAl9CiAKIAloY2lfcmVhZDEoSENJX1ZJREVPX09VVCwgJnZpZGVvX291dCwgJmhjaV9yZXN1bHQpOwpAQCAtMzg2LDggKzM3Niw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgY2hhcioKLXJlYWRfZmFuKGNoYXIqIHApCitzdGF0aWMgY2hhciAqcmVhZF9mYW4oY2hhciAqcCkKIHsKIAl1MzIgaGNpX3Jlc3VsdDsKIAl1MzIgdmFsdWU7CkBAIC00MDMsMTQgKzM5MiwxMyBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotd3JpdGVfZmFuKGNvbnN0IGNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdyaXRlX2Zhbihjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CiAJaW50IHZhbHVlOwogCXUzMiBoY2lfcmVzdWx0OwogCiAJaWYgKHNzY2FuZihidWZmZXIsICIgZm9yY2Vfb24gOiAlaSIsICZ2YWx1ZSkgPT0gMSAmJgotCQkJdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxKSB7CisJICAgIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMSkgewogCQloY2lfd3JpdGUxKEhDSV9GQU4sIHZhbHVlLCAmaGNpX3Jlc3VsdCk7CiAJCWlmIChoY2lfcmVzdWx0ICE9IEhDSV9TVUNDRVNTKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC00MjMsOCArNDExLDcgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBjaGFyKgotcmVhZF9rZXlzKGNoYXIqIHApCitzdGF0aWMgY2hhciAqcmVhZF9rZXlzKGNoYXIgKnApCiB7CiAJdTMyIGhjaV9yZXN1bHQ7CiAJdTMyIHZhbHVlOwpAQCAtNDUxLDE3ICs0MzgsMTUgQEAKIAlwICs9IHNwcmludGYocCwgImhvdGtleV9yZWFkeTogICAgICAgICAgICAlZFxuIiwga2V5X2V2ZW50X3ZhbGlkKTsKIAlwICs9IHNwcmludGYocCwgImhvdGtleTogICAgICAgICAgICAgICAgICAweCUwNHhcbiIsIGxhc3Rfa2V5X2V2ZW50KTsKIAotZW5kOgorICAgICAgZW5kOgogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotd3JpdGVfa2V5cyhjb25zdCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3cml0ZV9rZXlzKGNvbnN0IGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlpbnQgdmFsdWU7CiAKLQlpZiAoc3NjYW5mKGJ1ZmZlciwgIiBob3RrZXlfcmVhZHkgOiAlaSIsICZ2YWx1ZSkgPT0gMSAmJgotCQkJdmFsdWUgPT0gMCkgeworCWlmIChzc2NhbmYoYnVmZmVyLCAiIGhvdGtleV9yZWFkeSA6ICVpIiwgJnZhbHVlKSA9PSAxICYmIHZhbHVlID09IDApIHsKIAkJa2V5X2V2ZW50X3ZhbGlkID0gMDsKIAl9IGVsc2UgewogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ3MCwxMiArNDU1LDExIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgY2hhcioKLXJlYWRfdmVyc2lvbihjaGFyKiBwKQorc3RhdGljIGNoYXIgKnJlYWRfdmVyc2lvbihjaGFyICpwKQogewogCXAgKz0gc3ByaW50ZihwLCAiZHJpdmVyOiAgICAgICAgICAgICAgICAgICVzXG4iLCBUT1NISUJBX0FDUElfVkVSU0lPTik7CiAJcCArPSBzcHJpbnRmKHAsICJwcm9jX2ludGVyZmFjZTogICAgICAgICAgJWRcbiIsCi0JCVBST0NfSU5URVJGQUNFX1ZFUlNJT04pOworCQkgICAgIFBST0NfSU5URVJGQUNFX1ZFUlNJT04pOwogCXJldHVybiBwOwogfQogCkBAIC00ODQsNDggKzQ2OCw0NSBAQAogCiAjZGVmaW5lIFBST0NfVE9TSElCQQkJInRvc2hpYmEiCiAKLXN0YXRpYyBQcm9jSXRlbSBwcm9jX2l0ZW1zW10gPQotewotCXsgImxjZCIJCSwgcmVhZF9sY2QJLCB3cml0ZV9sY2QJfSwKLQl7ICJ2aWRlbyIJLCByZWFkX3ZpZGVvCSwgd3JpdGVfdmlkZW8JfSwKLQl7ICJmYW4iCQksIHJlYWRfZmFuCSwgd3JpdGVfZmFuCX0sCi0JeyAia2V5cyIJLCByZWFkX2tleXMJLCB3cml0ZV9rZXlzCX0sCi0JeyAidmVyc2lvbiIJLCByZWFkX3ZlcnNpb24JLCBOVUxMCQl9LAotCXsgTlVMTCB9CitzdGF0aWMgUHJvY0l0ZW0gcHJvY19pdGVtc1tdID0geworCXsibGNkIiwgcmVhZF9sY2QsIHdyaXRlX2xjZH0sCisJeyJ2aWRlbyIsIHJlYWRfdmlkZW8sIHdyaXRlX3ZpZGVvfSwKKwl7ImZhbiIsIHJlYWRfZmFuLCB3cml0ZV9mYW59LAorCXsia2V5cyIsIHJlYWRfa2V5cywgd3JpdGVfa2V5c30sCisJeyJ2ZXJzaW9uIiwgcmVhZF92ZXJzaW9uLCBOVUxMfSwKKwl7TlVMTH0KIH07CiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWFkZF9kZXZpY2Uodm9pZCkKK3N0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQgYWRkX2RldmljZSh2b2lkKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSogcHJvYzsKLQlQcm9jSXRlbSogaXRlbTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CisJUHJvY0l0ZW0gKml0ZW07CiAKLQlmb3IgKGl0ZW0gPSBwcm9jX2l0ZW1zOyBpdGVtLT5uYW1lOyArK2l0ZW0pCi0JeworCWZvciAoaXRlbSA9IHByb2NfaXRlbXM7IGl0ZW0tPm5hbWU7ICsraXRlbSkgewogCQlwcm9jID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShpdGVtLT5uYW1lLAotCQkJU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAotCQkJdG9zaGliYV9wcm9jX2RpciwgKHJlYWRfcHJvY190KilkaXNwYXRjaF9yZWFkLCBpdGVtKTsKKwkJCQkJICAgICAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCQkgICAgICB0b3NoaWJhX3Byb2NfZGlyLAorCQkJCQkgICAgICAocmVhZF9wcm9jX3QgKikgZGlzcGF0Y2hfcmVhZCwKKwkJCQkJICAgICAgaXRlbSk7CiAJCWlmIChwcm9jKQogCQkJcHJvYy0+b3duZXIgPSBUSElTX01PRFVMRTsKIAkJaWYgKHByb2MgJiYgaXRlbS0+d3JpdGVfZnVuYykKLQkJCXByb2MtPndyaXRlX3Byb2MgPSAod3JpdGVfcHJvY190KilkaXNwYXRjaF93cml0ZTsKKwkJCXByb2MtPndyaXRlX3Byb2MgPSAod3JpdGVfcHJvY190ICopIGRpc3BhdGNoX3dyaXRlOwogCX0KIAogCXJldHVybiBBRV9PSzsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIF9fZXhpdAotcmVtb3ZlX2RldmljZSh2b2lkKQorc3RhdGljIGFjcGlfc3RhdHVzIF9fZXhpdCByZW1vdmVfZGV2aWNlKHZvaWQpCiB7Ci0JUHJvY0l0ZW0qIGl0ZW07CisJUHJvY0l0ZW0gKml0ZW07CiAKIAlmb3IgKGl0ZW0gPSBwcm9jX2l0ZW1zOyBpdGVtLT5uYW1lOyArK2l0ZW0pCiAJCXJlbW92ZV9wcm9jX2VudHJ5KGl0ZW0tPm5hbWUsIHRvc2hpYmFfcHJvY19kaXIpOwogCXJldHVybiBBRV9PSzsKIH0KIAotc3RhdGljIGludCBfX2luaXQKLXRvc2hpYmFfYWNwaV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB0b3NoaWJhX2FjcGlfaW5pdCh2b2lkKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXUzMiBoY2lfcmVzdWx0OwpAQCAtNTMzLDkgKzUxNCw5IEBACiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKCFhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKXsKKwlpZiAoIWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpIHsKIAkJcHJpbnRrKE1ZX0lORk8gIlVzaW5nIGdlbmVyaWMgaG90a2V5IGRyaXZlclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwkKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCS8qIHNpbXBsZSBkZXZpY2UgZGV0ZWN0aW9uOiBsb29rIGZvciBIQ0kgbWV0aG9kICovCiAJaWYgKGlzX3ZhbGlkX2FjcGlfcGF0aChNRVRIT0RfSENJXzEpKQpAQCAtNTQ2LDcgKzUyNyw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJcHJpbnRrKE1ZX0lORk8gIlRvc2hpYmEgTGFwdG9wIEFDUEkgRXh0cmFzIHZlcnNpb24gJXNcbiIsCi0JCVRPU0hJQkFfQUNQSV9WRVJTSU9OKTsKKwkgICAgICAgVE9TSElCQV9BQ1BJX1ZFUlNJT04pOwogCXByaW50ayhNWV9JTkZPICIgICAgSENJIG1ldGhvZDogJXNcbiIsIG1ldGhvZF9oY2kpOwogCiAJZm9yY2VfZmFuID0gMDsKQEAgLTU2OCw4ICs1NDksNyBAQAogCXJldHVybiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpID8gMCA6IC1FTk9ERVY7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAotdG9zaGliYV9hY3BpX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCB0b3NoaWJhX2FjcGlfZXhpdCh2b2lkKQogewogCXJlbW92ZV9kZXZpY2UoKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvTWFrZWZpbGUKaW5kZXggOTM5YzQ0Ny4uZTg3MTA4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL01ha2VmaWxlCkBAIC0zLDYgKzMsNiBAQAogIwogCiBvYmoteSA6PSB1dGFsbG9jLm8gIHV0ZGVidWcubyAgIHV0ZXZhbC5vICAgIHV0aW5pdC5vICB1dG1pc2MubyAgICB1dHhmYWNlLm8gXAotCSB1dGNvcHkubyAgIHV0ZGVsZXRlLm8gIHV0Z2xvYmFsLm8gIHV0bWF0aC5vICB1dG9iamVjdC5vCisJIHV0Y29weS5vICAgdXRkZWxldGUubyAgdXRnbG9iYWwubyAgdXRtYXRoLm8gIHV0b2JqZWN0Lm8gdXRzdGF0ZS5vIHV0bXV0ZXgubyB1dG9iamVjdC5vIHV0Y2FjaGUubwogCiBFWFRSQV9DRkxBR1MgKz0gJChBQ1BJX0NGTEFHUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGFsbG9jLmMKaW5kZXggYzRlN2Y5OC4uMDY4NDUwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGFsbG9jLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGFsbG9jLmMKQEAgLTEsNiArMSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogTW9kdWxlIE5hbWU6IHV0YWxsb2MgLSBsb2NhbCBjYWNoZSBhbmQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKKyAqIE1vZHVsZSBOYW1lOiB1dGFsbG9jIC0gbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTQxLDIzMiArNDEsMTM0IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRhbGxvYyIpCitBQ1BJX01PRFVMRV9OQU1FKCJ1dGFsbG9jIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCiAjaWZkZWYJQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKgotYWNwaV91dF9maW5kX2FsbG9jYXRpb24gKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY2F0aW9uKTsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmFjcGlfdXRfZmluZF9hbGxvY2F0aW9uKHZvaWQgKmFsbG9jYXRpb24pOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFkZHJlc3MsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfdHlwZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKK2FjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbihzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmFkZHJlc3MsCisJCQkgYWNwaV9zaXplIHNpemUsCisJCQkgdTggYWxsb2NfdHlwZSwgdTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlLCB1MzIgbGluZSk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9yZW1vdmVfYWxsb2NhdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7Ci0jZW5kaWYJLyogQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3JlbGVhc2VfdG9fY2FjaGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgbGlzdF9pZCAgICAgICAgICAgICAtIE1lbW9yeSBsaXN0L2NhY2hlIElECi0gKiAgICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAtIFRoZSBvYmplY3QgdG8gYmUgcmVsZWFzZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGFuIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGNhY2hlLiAgSWYgY2FjaGUgaXMgZnVsbCwKLSAqICAgICAgICAgICAgICB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV91dF9yZWxlYXNlX3RvX2NhY2hlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0KQotewotCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICAgICAgICAgKmNhY2hlX2luZm87Ci0KLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCWNhY2hlX2luZm8gPSAmYWNwaV9nYmxfbWVtb3J5X2xpc3RzW2xpc3RfaWRdOwotCi0jaWZkZWYgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCi0KLQkvKiBJZiB3YWxrIGNhY2hlIGlzIGZ1bGwsIGp1c3QgZnJlZSB0aGlzIHdhbGxrc3RhdGUgb2JqZWN0ICovCi0KLQlpZiAoY2FjaGVfaW5mby0+Y2FjaGVfZGVwdGggPj0gY2FjaGVfaW5mby0+bWF4X2NhY2hlX2RlcHRoKSB7Ci0JCUFDUElfTUVNX0ZSRUUgKG9iamVjdCk7Ci0JCUFDUElfTUVNX1RSQUNLSU5HIChjYWNoZV9pbmZvLT50b3RhbF9mcmVlZCsrKTsKLQl9Ci0KLQkvKiBPdGhlcndpc2UgcHV0IHRoaXMgb2JqZWN0IGJhY2sgaW50byB0aGUgY2FjaGUgKi8KLQotCWVsc2UgewotCQlpZiAoQUNQSV9GQUlMVVJFIChhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX0NBQ0hFUykpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBNYXJrIHRoZSBvYmplY3QgYXMgY2FjaGVkICovCi0KLQkJQUNQSV9NRU1TRVQgKG9iamVjdCwgMHhDQSwgY2FjaGVfaW5mby0+b2JqZWN0X3NpemUpOwotCQlBQ1BJX1NFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCwgQUNQSV9ERVNDX1RZUEVfQ0FDSEVEKTsKLQotCQkvKiBQdXQgdGhlIG9iamVjdCBhdCB0aGUgaGVhZCBvZiB0aGUgY2FjaGUgbGlzdCAqLwotCi0JCSogKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKGNoYXIsCi0JCQkmKCgoY2hhciAqKSBvYmplY3QpW2NhY2hlX2luZm8tPmxpbmtfb2Zmc2V0XSkpKSA9IGNhY2hlX2luZm8tPmxpc3RfaGVhZDsKLQkJY2FjaGVfaW5mby0+bGlzdF9oZWFkID0gb2JqZWN0OwotCQljYWNoZV9pbmZvLT5jYWNoZV9kZXB0aCsrOwotCi0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0NBQ0hFUyk7Ci0JfQotCi0jZWxzZQotCi0JLyogT2JqZWN0IGNhY2hlIGlzIGRpc2FibGVkOyBqdXN0IGZyZWUgdGhlIG9iamVjdCAqLwotCi0JQUNQSV9NRU1fRlJFRSAob2JqZWN0KTsKLQlBQ1BJX01FTV9UUkFDS0lORyAoY2FjaGVfaW5mby0+dG90YWxfZnJlZWQrKyk7Ci0jZW5kaWYKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2FjcXVpcmVfZnJvbV9jYWNoZQotICoKLSAqIFBBUkFNRVRFUlM6ICBsaXN0X2lkICAgICAgICAgICAgIC0gTWVtb3J5IGxpc3QgSUQKLSAqCi0gKiBSRVRVUk46ICAgICAgQSByZXF1ZXN0ZWQgb2JqZWN0LiAgTlVMTCBpZiB0aGUgb2JqZWN0IGNvdWxkIG5vdCBiZQotICogICAgICAgICAgICAgIGFsbG9jYXRlZC4KLSAqCi0gKiBERVNDUklQVElPTjogR2V0IGFuIG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgY2FjaGUuICBJZiBjYWNoZSBpcyBlbXB0eSwKLSAqICAgICAgICAgICAgICB0aGUgb2JqZWN0IGlzIGFsbG9jYXRlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkICoKLWFjcGlfdXRfYWNxdWlyZV9mcm9tX2NhY2hlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQpCi17Ci0Jc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgICAgICAgICAqY2FjaGVfaW5mbzsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3Q7Ci0KLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoInV0X2FjcXVpcmVfZnJvbV9jYWNoZSIpOwotCi0KLQljYWNoZV9pbmZvID0gJmFjcGlfZ2JsX21lbW9yeV9saXN0c1tsaXN0X2lkXTsKLQotI2lmZGVmIEFDUElfRU5BQkxFX09CSkVDVF9DQUNIRQotCi0JaWYgKEFDUElfRkFJTFVSRSAoYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9DQUNIRVMpKSkgewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCUFDUElfTUVNX1RSQUNLSU5HIChjYWNoZV9pbmZvLT5jYWNoZV9yZXF1ZXN0cysrKTsKLQotCS8qIENoZWNrIHRoZSBjYWNoZSBmaXJzdCAqLwotCi0JaWYgKGNhY2hlX2luZm8tPmxpc3RfaGVhZCkgewotCQkvKiBUaGVyZSBpcyBhbiBvYmplY3QgYXZhaWxhYmxlLCB1c2UgaXQgKi8KLQotCQlvYmplY3QgPSBjYWNoZV9pbmZvLT5saXN0X2hlYWQ7Ci0JCWNhY2hlX2luZm8tPmxpc3RfaGVhZCA9ICooQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoY2hhciwKLQkJCQkgJigoKGNoYXIgKikgb2JqZWN0KVtjYWNoZV9pbmZvLT5saW5rX29mZnNldF0pKSk7Ci0KLQkJQUNQSV9NRU1fVFJBQ0tJTkcgKGNhY2hlX2luZm8tPmNhY2hlX2hpdHMrKyk7Ci0JCWNhY2hlX2luZm8tPmNhY2hlX2RlcHRoLS07CithY3BpX3V0X3JlbW92ZV9hbGxvY2F0aW9uKHN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqYWRkcmVzcywKKwkJCSAgdTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlLCB1MzIgbGluZSk7CisjZW5kaWYJCQkJLyogQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMgKi8KIAogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmplY3QgJXAgZnJvbSAlc1xuIiwKLQkJCW9iamVjdCwgYWNwaV9nYmxfbWVtb3J5X2xpc3RzW2xpc3RfaWRdLmxpc3RfbmFtZSkpOworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NyZWF0ZV9saXN0KGNoYXIgKmxpc3RfbmFtZSwKKwkJICAgIHUxNiBvYmplY3Rfc2l6ZSwgc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKipyZXR1cm5fY2FjaGUpOwogI2VuZGlmCiAKLQkJaWYgKEFDUElfRkFJTFVSRSAoYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9DQUNIRVMpKSkgewotCQkJcmV0dXJuIChOVUxMKTsKLQkJfQotCi0JCS8qIENsZWFyICh6ZXJvKSB0aGUgcHJldmlvdXNseSB1c2VkIE9iamVjdCAqLwotCi0JCUFDUElfTUVNU0VUIChvYmplY3QsIDAsIGNhY2hlX2luZm8tPm9iamVjdF9zaXplKTsKLQl9Ci0KLQllbHNlIHsKLQkJLyogVGhlIGNhY2hlIGlzIGVtcHR5LCBjcmVhdGUgYSBuZXcgb2JqZWN0ICovCi0KLQkJLyogQXZvaWQgZGVhZGxvY2sgd2l0aCBBQ1BJX01FTV9DQUxMT0NBVEUgKi8KLQotCQlpZiAoQUNQSV9GQUlMVVJFIChhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0NBQ0hFUykpKSB7Ci0JCQlyZXR1cm4gKE5VTEwpOwotCQl9Ci0KLQkJb2JqZWN0ID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChjYWNoZV9pbmZvLT5vYmplY3Rfc2l6ZSk7Ci0JCUFDUElfTUVNX1RSQUNLSU5HIChjYWNoZV9pbmZvLT50b3RhbF9hbGxvY2F0ZWQrKyk7Ci0JfQotCi0jZWxzZQotCi0JLyogT2JqZWN0IGNhY2hlIGlzIGRpc2FibGVkOyBqdXN0IGFsbG9jYXRlIHRoZSBvYmplY3QgKi8KLQotCW9iamVjdCA9IEFDUElfTUVNX0NBTExPQ0FURSAoY2FjaGVfaW5mby0+b2JqZWN0X3NpemUpOwotCUFDUElfTUVNX1RSQUNLSU5HIChjYWNoZV9pbmZvLT50b3RhbF9hbGxvY2F0ZWQrKyk7Ci0jZW5kaWYKLQotCXJldHVybiAob2JqZWN0KTsKLX0KLQotCi0jaWZkZWYgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX2NhY2hlCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfY2FjaGVzCiAgKgotICogUEFSQU1FVEVSUzogIGxpc3RfaWQgICAgICAgICAtIE1lbW9yeSBsaXN0IElECisgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKLSAqIFJFVFVSTjogICAgICBOb25lCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IEZyZWUgYWxsIG9iamVjdHMgd2l0aGluIHRoZSByZXF1ZXN0ZWQgY2FjaGUuCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGFsbCBsb2NhbCBjYWNoZXMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9nZW5lcmljX2NhY2hlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQpCithY3BpX3N0YXR1cyBhY3BpX3V0X2NyZWF0ZV9jYWNoZXModm9pZCkKIHsKLQlzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAgICAgICAgICpjYWNoZV9pbmZvOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisJLyogTWVtb3J5IGFsbG9jYXRpb24gbGlzdHMgKi8KIAotCi0JY2FjaGVfaW5mbyA9ICZhY3BpX2dibF9tZW1vcnlfbGlzdHNbbGlzdF9pZF07Ci0Jd2hpbGUgKGNhY2hlX2luZm8tPmxpc3RfaGVhZCkgewotCQkvKiBEZWxldGUgb25lIGNhY2hlZCBzdGF0ZSBvYmplY3QgKi8KLQotCQluZXh0ID0gKihBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSIChjaGFyLAotCQkJCSAmKCgoY2hhciAqKSBjYWNoZV9pbmZvLT5saXN0X2hlYWQpW2NhY2hlX2luZm8tPmxpbmtfb2Zmc2V0XSkpKTsKLQkJQUNQSV9NRU1fRlJFRSAoY2FjaGVfaW5mby0+bGlzdF9oZWFkKTsKLQotCQljYWNoZV9pbmZvLT5saXN0X2hlYWQgPSBuZXh0OwotCQljYWNoZV9pbmZvLT5jYWNoZV9kZXB0aC0tOworCXN0YXR1cyA9IGFjcGlfdXRfY3JlYXRlX2xpc3QoIkFjcGktR2xvYmFsIiwgMCwgJmFjcGlfZ2JsX2dsb2JhbF9saXN0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOwogCX0KLX0KKworCXN0YXR1cyA9CisJICAgIGFjcGlfdXRfY3JlYXRlX2xpc3QoIkFjcGktTmFtZXNwYWNlIiwKKwkJCQlzaXplb2Yoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUpLAorCQkJCSZhY3BpX2dibF9uc19ub2RlX2xpc3QpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQogI2VuZGlmCiAKKwkvKiBPYmplY3QgQ2FjaGVzLCBmb3IgZnJlcXVlbnRseSB1c2VkIG9iamVjdHMgKi8KKworCXN0YXR1cyA9CisJICAgIGFjcGlfb3NfY3JlYXRlX2NhY2hlKCJhY3BpX3N0YXRlIiwgc2l6ZW9mKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSksCisJCQkJIEFDUElfTUFYX1NUQVRFX0NBQ0hFX0RFUFRILAorCQkJCSAmYWNwaV9nYmxfc3RhdGVfY2FjaGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0KKwkgICAgYWNwaV9vc19jcmVhdGVfY2FjaGUoImFjcGlfcGFyc2UiLAorCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2NvbW1vbiksCisJCQkJIEFDUElfTUFYX1BBUlNFX0NBQ0hFX0RFUFRILAorCQkJCSAmYWNwaV9nYmxfcHNfbm9kZV9jYWNoZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX29zX2NyZWF0ZV9jYWNoZSgiYWNwaV9wYXJzZV9leHQiLAorCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfcGFyc2Vfb2JqX25hbWVkKSwKKwkJCQkgQUNQSV9NQVhfRVhUUEFSU0VfQ0FDSEVfREVQVEgsCisJCQkJICZhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX29zX2NyZWF0ZV9jYWNoZSgiYWNwaV9vcGVyYW5kIiwKKwkJCQkgc2l6ZW9mKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpLAorCQkJCSBBQ1BJX01BWF9PQkpFQ1RfQ0FDSEVfREVQVEgsCisJCQkJICZhY3BpX2dibF9vcGVyYW5kX2NhY2hlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9jYWNoZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUHVyZ2UgYW5kIGRlbGV0ZSBhbGwgbG9jYWwgY2FjaGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV91dF9kZWxldGVfY2FjaGVzKHZvaWQpCit7CisKKwkodm9pZClhY3BpX29zX2RlbGV0ZV9jYWNoZShhY3BpX2dibF9zdGF0ZV9jYWNoZSk7CisJYWNwaV9nYmxfc3RhdGVfY2FjaGUgPSBOVUxMOworCisJKHZvaWQpYWNwaV9vc19kZWxldGVfY2FjaGUoYWNwaV9nYmxfb3BlcmFuZF9jYWNoZSk7CisJYWNwaV9nYmxfb3BlcmFuZF9jYWNoZSA9IE5VTEw7CisKKwkodm9pZClhY3BpX29zX2RlbGV0ZV9jYWNoZShhY3BpX2dibF9wc19ub2RlX2NhY2hlKTsKKwlhY3BpX2dibF9wc19ub2RlX2NhY2hlID0gTlVMTDsKKworCSh2b2lkKWFjcGlfb3NfZGVsZXRlX2NhY2hlKGFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlKTsKKwlhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSA9IE5VTEw7CisKKwlyZXR1cm4gKEFFX09LKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yODAsOSArMTgyLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF92YWxpZGF0ZV9idWZmZXIgKAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKmJ1ZmZlcikKK2FjcGlfc3RhdHVzIGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyKHN0cnVjdCBhY3BpX2J1ZmZlciAqIGJ1ZmZlcikKIHsKIAogCS8qIE9idmlvdXNseSwgdGhlIHN0cnVjdHVyZSBwb2ludGVyIG11c3QgYmUgdmFsaWQgKi8KQEAgLTI5Myw5ICsxOTMsOSBAQAogCiAJLyogU3BlY2lhbCBzZW1hbnRpY3MgZm9yIHRoZSBsZW5ndGggKi8KIAotCWlmICgoYnVmZmVyLT5sZW5ndGggPT0gQUNQSV9OT19CVUZGRVIpICAgICAgICAgICAgICB8fAotCQkoYnVmZmVyLT5sZW5ndGggPT0gQUNQSV9BTExPQ0FURV9CVUZGRVIpICAgICAgICB8fAotCQkoYnVmZmVyLT5sZW5ndGggPT0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVIpKSB7CisJaWYgKChidWZmZXItPmxlbmd0aCA9PSBBQ1BJX05PX0JVRkZFUikgfHwKKwkgICAgKGJ1ZmZlci0+bGVuZ3RoID09IEFDUElfQUxMT0NBVEVfQlVGRkVSKSB8fAorCSAgICAoYnVmZmVyLT5sZW5ndGggPT0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVIpKSB7CiAJCXJldHVybiAoQUVfT0spOwogCX0KIApAQCAtMzA4LDcgKzIwOCw2IEBACiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcgpAQCAtMzI0LDEyICsyMjMsMTAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyICgKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpidWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9sZW5ndGgpCithY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyKHN0cnVjdCBhY3BpX2J1ZmZlciAqIGJ1ZmZlciwKKwkJCSAgYWNwaV9zaXplIHJlcXVpcmVkX2xlbmd0aCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKIAlzd2l0Y2ggKGJ1ZmZlci0+bGVuZ3RoKSB7CiAJY2FzZSBBQ1BJX05PX0JVRkZFUjoKQEAgLTMzOSwzMyArMjM2LDMwIEBACiAJCXN0YXR1cyA9IEFFX0JVRkZFUl9PVkVSRkxPVzsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9BTExPQ0FURV9CVUZGRVI6CiAKIAkJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyICovCiAKLQkJYnVmZmVyLT5wb2ludGVyID0gYWNwaV9vc19hbGxvY2F0ZSAocmVxdWlyZWRfbGVuZ3RoKTsKKwkJYnVmZmVyLT5wb2ludGVyID0gYWNwaV9vc19hbGxvY2F0ZShyZXF1aXJlZF9sZW5ndGgpOwogCQlpZiAoIWJ1ZmZlci0+cG9pbnRlcikgewogCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJLyogQ2xlYXIgdGhlIGJ1ZmZlciAqLwogCi0JCUFDUElfTUVNU0VUIChidWZmZXItPnBvaW50ZXIsIDAsIHJlcXVpcmVkX2xlbmd0aCk7CisJCUFDUElfTUVNU0VUKGJ1ZmZlci0+cG9pbnRlciwgMCwgcmVxdWlyZWRfbGVuZ3RoKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI6CiAKIAkJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIHdpdGggbG9jYWwgaW50ZXJmYWNlIHRvIGFsbG93IHRyYWNraW5nICovCiAKLQkJYnVmZmVyLT5wb2ludGVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChyZXF1aXJlZF9sZW5ndGgpOworCQlidWZmZXItPnBvaW50ZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUocmVxdWlyZWRfbGVuZ3RoKTsKIAkJaWYgKCFidWZmZXItPnBvaW50ZXIpIHsKIAkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAogCQkvKiBFeGlzdGluZyBidWZmZXI6IFZhbGlkYXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KQEAgLTM3Nyw3ICsyNzEsNyBAQAogCiAJCS8qIENsZWFyIHRoZSBidWZmZXIgKi8KIAotCQlBQ1BJX01FTVNFVCAoYnVmZmVyLT5wb2ludGVyLCAwLCByZXF1aXJlZF9sZW5ndGgpOworCQlBQ1BJX01FTVNFVChidWZmZXItPnBvaW50ZXIsIDAsIHJlcXVpcmVkX2xlbmd0aCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzg1LDcgKzI3OSw2IEBACiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWxsb2NhdGUKQEAgLTQwMSw0MSArMjk0LDM0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAqCi1hY3BpX3V0X2FsbG9jYXRlICgKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSkKK3ZvaWQgKmFjcGlfdXRfYWxsb2NhdGUoYWNwaV9zaXplIHNpemUsIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCiB7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NhdGlvbjsKKwl2b2lkICphbGxvY2F0aW9uOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMiAoInV0X2FsbG9jYXRlIiwgc2l6ZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigidXRfYWxsb2NhdGUiLCBzaXplKTsKIAogCS8qIENoZWNrIGZvciBhbiBpbmFkdmVydGVudCBzaXplIG9mIHplcm8gYnl0ZXMgKi8KIAogCWlmICghc2l6ZSkgewotCQlfQUNQSV9SRVBPUlRfRVJST1IgKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAotCQkJCSgidXRfYWxsb2NhdGU6IEF0dGVtcHQgdG8gYWxsb2NhdGUgemVybyBieXRlc1xuIikpOworCQlfQUNQSV9SRVBPUlRfRVJST1IobW9kdWxlLCBsaW5lLCBjb21wb25lbnQsCisJCQkJICAgKCJ1dF9hbGxvY2F0ZTogQXR0ZW1wdCB0byBhbGxvY2F0ZSB6ZXJvIGJ5dGVzXG4iKSk7CiAJCXNpemUgPSAxOwogCX0KIAotCWFsbG9jYXRpb24gPSBhY3BpX29zX2FsbG9jYXRlIChzaXplKTsKKwlhbGxvY2F0aW9uID0gYWNwaV9vc19hbGxvY2F0ZShzaXplKTsKIAlpZiAoIWFsbG9jYXRpb24pIHsKIAkJLyogUmVwb3J0IGFsbG9jYXRpb24gZXJyb3IgKi8KIAotCQlfQUNQSV9SRVBPUlRfRVJST1IgKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAotCQkJCSgidXRfYWxsb2NhdGU6IENvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYXG4iLCAodTMyKSBzaXplKSk7CisJCV9BQ1BJX1JFUE9SVF9FUlJPUihtb2R1bGUsIGxpbmUsIGNvbXBvbmVudCwKKwkJCQkgICAoInV0X2FsbG9jYXRlOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWFxuIiwKKwkJCQkgICAgKHUzMikgc2l6ZSkpOwogCi0JCXJldHVybl9QVFIgKE5VTEwpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAotCXJldHVybl9QVFIgKGFsbG9jYXRpb24pOworCXJldHVybl9QVFIoYWxsb2NhdGlvbik7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jYWxsb2NhdGUKQEAgLTQ1MSw0MyArMzM3LDM2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAqCi1hY3BpX3V0X2NhbGxvY2F0ZSAoCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpCit2b2lkICphY3BpX3V0X2NhbGxvY2F0ZShhY3BpX3NpemUgc2l6ZSwgdTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlLCB1MzIgbGluZSkKIHsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY2F0aW9uOworCXZvaWQgKmFsbG9jYXRpb247CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgidXRfY2FsbG9jYXRlIiwgc2l6ZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigidXRfY2FsbG9jYXRlIiwgc2l6ZSk7CiAKIAkvKiBDaGVjayBmb3IgYW4gaW5hZHZlcnRlbnQgc2l6ZSBvZiB6ZXJvIGJ5dGVzICovCiAKIAlpZiAoIXNpemUpIHsKLQkJX0FDUElfUkVQT1JUX0VSUk9SIChtb2R1bGUsIGxpbmUsIGNvbXBvbmVudCwKLQkJCQkoInV0X2NhbGxvY2F0ZTogQXR0ZW1wdCB0byBhbGxvY2F0ZSB6ZXJvIGJ5dGVzXG4iKSk7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCQlfQUNQSV9SRVBPUlRfRVJST1IobW9kdWxlLCBsaW5lLCBjb21wb25lbnQsCisJCQkJICAgKCJ1dF9jYWxsb2NhdGU6IEF0dGVtcHQgdG8gYWxsb2NhdGUgemVybyBieXRlc1xuIikpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAotCWFsbG9jYXRpb24gPSBhY3BpX29zX2FsbG9jYXRlIChzaXplKTsKKwlhbGxvY2F0aW9uID0gYWNwaV9vc19hbGxvY2F0ZShzaXplKTsKIAlpZiAoIWFsbG9jYXRpb24pIHsKIAkJLyogUmVwb3J0IGFsbG9jYXRpb24gZXJyb3IgKi8KIAotCQlfQUNQSV9SRVBPUlRfRVJST1IgKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAotCQkJCSgidXRfY2FsbG9jYXRlOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWFxuIiwgKHUzMikgc2l6ZSkpOwotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAorCQkJCSAgICgidXRfY2FsbG9jYXRlOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWFxuIiwKKwkJCQkgICAgKHUzMikgc2l6ZSkpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAogCS8qIENsZWFyIHRoZSBtZW1vcnkgYmxvY2sgKi8KIAotCUFDUElfTUVNU0VUIChhbGxvY2F0aW9uLCAwLCBzaXplKTsKLQlyZXR1cm5fUFRSIChhbGxvY2F0aW9uKTsKKwlBQ1BJX01FTVNFVChhbGxvY2F0aW9uLCAwLCBzaXplKTsKKwlyZXR1cm5fUFRSKGFsbG9jYXRpb24pOwogfQogCi0KICNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUwogLyoKICAqIFRoZXNlIHByb2NlZHVyZXMgYXJlIHVzZWQgZm9yIHRyYWNraW5nIG1lbW9yeSBsZWFrcyBpbiB0aGUgc3Vic3lzdGVtLCBhbmQKQEAgLTUwMCw2ICszNzksMzkgQEAKICAqIG9jY3VycyBpbiB0aGUgYm9keSBvZiBhY3BpX3V0X2ZyZWUuCiAgKi8KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfbGlzdAorICoKKyAqIFBBUkFNRVRFUlM6ICBjYWNoZV9uYW1lICAgICAgLSBBc2NpaSBuYW1lIGZvciB0aGUgY2FjaGUKKyAqICAgICAgICAgICAgICBvYmplY3Rfc2l6ZSAgICAgLSBTaXplIG9mIGVhY2ggY2FjaGVkIG9iamVjdAorICogICAgICAgICAgICAgIHJldHVybl9jYWNoZSAgICAtIFdoZXJlIHRoZSBuZXcgY2FjaGUgb2JqZWN0IGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBsb2NhbCBtZW1vcnkgbGlzdCBmb3IgdHJhY2tpbmcgcHVycG9zZWQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY3JlYXRlX2xpc3QoY2hhciAqbGlzdF9uYW1lLAorCQkgICAgdTE2IG9iamVjdF9zaXplLCBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqKnJldHVybl9jYWNoZSkKK3sKKwlzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqY2FjaGU7CisKKwljYWNoZSA9IGFjcGlfb3NfYWxsb2NhdGUoc2l6ZW9mKHN0cnVjdCBhY3BpX21lbW9yeV9saXN0KSk7CisJaWYgKCFjYWNoZSkgeworCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CisJfQorCisJQUNQSV9NRU1TRVQoY2FjaGUsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCkpOworCisJY2FjaGUtPmxpc3RfbmFtZSA9IGxpc3RfbmFtZTsKKwljYWNoZS0+b2JqZWN0X3NpemUgPSBvYmplY3Rfc2l6ZTsKKworCSpyZXR1cm5fY2FjaGUgPSBjYWNoZTsKKwlyZXR1cm4gKEFFX09LKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01MTYsMzcgKzQyOCwzMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgKgotYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2sgKAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKQordm9pZCAqYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2soYWNwaV9zaXplIHNpemUsCisJCQkJIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCiB7Ci0Jc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqYWxsb2NhdGlvbjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmFsbG9jYXRpb247CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlhbGxvY2F0aW9uID0gYWNwaV91dF9hbGxvY2F0ZSAoc2l6ZSArIHNpemVvZiAoc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlciksCi0JCQkgIGNvbXBvbmVudCwgbW9kdWxlLCBsaW5lKTsKKwlhbGxvY2F0aW9uID0KKwkgICAgYWNwaV91dF9hbGxvY2F0ZShzaXplICsgc2l6ZW9mKHN0cnVjdCBhY3BpX2RlYnVnX21lbV9oZWFkZXIpLAorCQkJICAgICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7CiAJaWYgKCFhbGxvY2F0aW9uKSB7CiAJCXJldHVybiAoTlVMTCk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF90cmFja19hbGxvY2F0aW9uIChBQ1BJX01FTV9MSVNUX0dMT0JBTCwgYWxsb2NhdGlvbiwgc2l6ZSwKLQkJCSAgQUNQSV9NRU1fTUFMTE9DLCBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX29zX2ZyZWUgKGFsbG9jYXRpb24pOworCXN0YXR1cyA9IGFjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbihhbGxvY2F0aW9uLCBzaXplLAorCQkJCQkgIEFDUElfTUVNX01BTExPQywgY29tcG9uZW50LCBtb2R1bGUsCisJCQkJCSAgbGluZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfb3NfZnJlZShhbGxvY2F0aW9uKTsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9HTE9CQUxdLnRvdGFsX2FsbG9jYXRlZCsrOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX0dMT0JBTF0uY3VycmVudF90b3RhbF9zaXplICs9ICh1MzIpIHNpemU7CisJYWNwaV9nYmxfZ2xvYmFsX2xpc3QtPnRvdGFsX2FsbG9jYXRlZCsrOworCWFjcGlfZ2JsX2dsb2JhbF9saXN0LT5jdXJyZW50X3RvdGFsX3NpemUgKz0gKHUzMikgc2l6ZTsKIAotCXJldHVybiAoKHZvaWQgKikgJmFsbG9jYXRpb24tPnVzZXJfc3BhY2UpOworCXJldHVybiAoKHZvaWQgKikmYWxsb2NhdGlvbi0+dXNlcl9zcGFjZSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jYWxsb2NhdGVfYW5kX3RyYWNrCkBAIC01NjIsNDEgKzQ3MCwzOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgKgotYWNwaV91dF9jYWxsb2NhdGVfYW5kX3RyYWNrICgKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSkKK3ZvaWQgKmFjcGlfdXRfY2FsbG9jYXRlX2FuZF90cmFjayhhY3BpX3NpemUgc2l6ZSwKKwkJCQkgIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCiB7Ci0Jc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqYWxsb2NhdGlvbjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmFsbG9jYXRpb247CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlhbGxvY2F0aW9uID0gYWNwaV91dF9jYWxsb2NhdGUgKHNpemUgKyBzaXplb2YgKHN0cnVjdCBhY3BpX2RlYnVnX21lbV9oZWFkZXIpLAotCQkJICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7CisJYWxsb2NhdGlvbiA9CisJICAgIGFjcGlfdXRfY2FsbG9jYXRlKHNpemUgKyBzaXplb2Yoc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlciksCisJCQkgICAgICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7CiAJaWYgKCFhbGxvY2F0aW9uKSB7CiAJCS8qIFJlcG9ydCBhbGxvY2F0aW9uIGVycm9yICovCiAKLQkJX0FDUElfUkVQT1JUX0VSUk9SIChtb2R1bGUsIGxpbmUsIGNvbXBvbmVudCwKLQkJCQkoInV0X2NhbGxvY2F0ZTogQ291bGQgbm90IGFsbG9jYXRlIHNpemUgJVhcbiIsICh1MzIpIHNpemUpKTsKKwkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAorCQkJCSAgICgidXRfY2FsbG9jYXRlOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWFxuIiwKKwkJCQkgICAgKHUzMikgc2l6ZSkpOwogCQlyZXR1cm4gKE5VTEwpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbiAoQUNQSV9NRU1fTElTVF9HTE9CQUwsIGFsbG9jYXRpb24sIHNpemUsCi0JCQkgICBBQ1BJX01FTV9DQUxMT0MsIGNvbXBvbmVudCwgbW9kdWxlLCBsaW5lKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCWFjcGlfb3NfZnJlZSAoYWxsb2NhdGlvbik7CisJc3RhdHVzID0gYWNwaV91dF90cmFja19hbGxvY2F0aW9uKGFsbG9jYXRpb24sIHNpemUsCisJCQkJCSAgQUNQSV9NRU1fQ0FMTE9DLCBjb21wb25lbnQsIG1vZHVsZSwKKwkJCQkJICBsaW5lKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV9vc19mcmVlKGFsbG9jYXRpb24pOwogCQlyZXR1cm4gKE5VTEwpOwogCX0KIAotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX0dMT0JBTF0udG90YWxfYWxsb2NhdGVkKys7Ci0JYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfR0xPQkFMXS5jdXJyZW50X3RvdGFsX3NpemUgKz0gKHUzMikgc2l6ZTsKKwlhY3BpX2dibF9nbG9iYWxfbGlzdC0+dG90YWxfYWxsb2NhdGVkKys7CisJYWNwaV9nYmxfZ2xvYmFsX2xpc3QtPmN1cnJlbnRfdG90YWxfc2l6ZSArPSAodTMyKSBzaXplOwogCi0JcmV0dXJuICgodm9pZCAqKSAmYWxsb2NhdGlvbi0+dXNlcl9zcGFjZSk7CisJcmV0dXJuICgodm9pZCAqKSZhbGxvY2F0aW9uLT51c2VyX3NwYWNlKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2ZyZWVfYW5kX3RyYWNrCkBAIC02MTMsNTMgKzUxOCw0NiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV91dF9mcmVlX2FuZF90cmFjayAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NhdGlvbiwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKQorYWNwaV91dF9mcmVlX2FuZF90cmFjayh2b2lkICphbGxvY2F0aW9uLCB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKQogewotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmRlYnVnX2Jsb2NrOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqZGVidWdfYmxvY2s7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X2ZyZWUiLCBhbGxvY2F0aW9uKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJ1dF9mcmVlIiwgYWxsb2NhdGlvbik7CiAKIAlpZiAoTlVMTCA9PSBhbGxvY2F0aW9uKSB7Ci0JCV9BQ1BJX1JFUE9SVF9FUlJPUiAobW9kdWxlLCBsaW5lLCBjb21wb25lbnQsCi0JCQkoImFjcGlfdXRfZnJlZTogQXR0ZW1wdCB0byBkZWxldGUgYSBOVUxMIGFkZHJlc3NcbiIpKTsKKwkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAorCQkJCSAgICgiYWNwaV91dF9mcmVlOiBBdHRlbXB0IHRvIGRlbGV0ZSBhIE5VTEwgYWRkcmVzc1xuIikpOwogCiAJCXJldHVybl9WT0lEOwogCX0KIAotCWRlYnVnX2Jsb2NrID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrLAotCQkJICAoKChjaGFyICopIGFsbG9jYXRpb24pIC0gc2l6ZW9mIChzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1faGVhZGVyKSkpOworCWRlYnVnX2Jsb2NrID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2ssCisJCQkJICAgICgoKGNoYXIgKilhbGxvY2F0aW9uKSAtCisJCQkJICAgICBzaXplb2Yoc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlcikpKTsKIAotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX0dMT0JBTF0udG90YWxfZnJlZWQrKzsKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9HTE9CQUxdLmN1cnJlbnRfdG90YWxfc2l6ZSAtPSBkZWJ1Z19ibG9jay0+c2l6ZTsKKwlhY3BpX2dibF9nbG9iYWxfbGlzdC0+dG90YWxfZnJlZWQrKzsKKwlhY3BpX2dibF9nbG9iYWxfbGlzdC0+Y3VycmVudF90b3RhbF9zaXplIC09IGRlYnVnX2Jsb2NrLT5zaXplOwogCi0Jc3RhdHVzID0gYWNwaV91dF9yZW1vdmVfYWxsb2NhdGlvbiAoQUNQSV9NRU1fTElTVF9HTE9CQUwsIGRlYnVnX2Jsb2NrLAotCQkJICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCBmcmVlIG1lbW9yeSwgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbW92ZV9hbGxvY2F0aW9uKGRlYnVnX2Jsb2NrLAorCQkJCQkgICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJDb3VsZCBub3QgZnJlZSBtZW1vcnksICVzXG4iLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKLQlhY3BpX29zX2ZyZWUgKGRlYnVnX2Jsb2NrKTsKKwlhY3BpX29zX2ZyZWUoZGVidWdfYmxvY2spOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICIlcCBmcmVlZFxuIiwgYWxsb2NhdGlvbikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsICIlcCBmcmVlZFxuIiwgYWxsb2NhdGlvbikpOwogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9maW5kX2FsbG9jYXRpb24KICAqCi0gKiBQQVJBTUVURVJTOiAgbGlzdF9pZCAgICAgICAgICAgICAgICAgLSBNZW1vcnkgbGlzdCB0byBzZWFyY2gKLSAqICAgICAgICAgICAgICBBbGxvY2F0aW9uICAgICAgICAgICAgICAtIEFkZHJlc3Mgb2YgYWxsb2NhdGVkIG1lbW9yeQorICogUEFSQU1FVEVSUzogIEFsbG9jYXRpb24gICAgICAgICAgICAgIC0gQWRkcmVzcyBvZiBhbGxvY2F0ZWQgbWVtb3J5CiAgKgogICogUkVUVVJOOiAgICAgIEEgbGlzdCBlbGVtZW50IGlmIGZvdW5kOyBOVUxMIG90aGVyd2lzZS4KICAqCkBAIC02NjcsMjIgKzU2NSwxMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKgotYWNwaV91dF9maW5kX2FsbG9jYXRpb24gKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY2F0aW9uKQorc3RhdGljIHN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqYWNwaV91dF9maW5kX2FsbG9jYXRpb24odm9pZCAqYWxsb2NhdGlvbikKIHsKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICplbGVtZW50OworCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqZWxlbWVudDsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCWlmIChsaXN0X2lkID4gQUNQSV9NRU1fTElTVF9NQVgpIHsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0KLQllbGVtZW50ID0gYWNwaV9nYmxfbWVtb3J5X2xpc3RzW2xpc3RfaWRdLmxpc3RfaGVhZDsKKwllbGVtZW50ID0gYWNwaV9nYmxfZ2xvYmFsX2xpc3QtPmxpc3RfaGVhZDsKIAogCS8qIFNlYXJjaCBmb3IgdGhlIGFkZHJlc3MuICovCiAKQEAgLTY5NywxMyArNTg2LDExIEBACiAJcmV0dXJuIChOVUxMKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYWNrX2FsbG9jYXRpb24KICAqCi0gKiBQQVJBTUVURVJTOiAgbGlzdF9pZCAgICAgICAgICAgICAtIE1lbW9yeSBsaXN0IHRvIHNlYXJjaAotICogICAgICAgICAgICAgIEFsbG9jYXRpb24gICAgICAgICAgLSBBZGRyZXNzIG9mIGFsbG9jYXRlZCBtZW1vcnkKKyAqIFBBUkFNRVRFUlM6ICBBbGxvY2F0aW9uICAgICAgICAgIC0gQWRkcmVzcyBvZiBhbGxvY2F0ZWQgbWVtb3J5CiAgKiAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgICAtIFNpemUgb2YgdGhlIGFsbG9jYXRpb24KICAqICAgICAgICAgICAgICBhbGxvY190eXBlICAgICAgICAgIC0gTUVNX01BTExPQyBvciBNRU1fQ0FMTE9DCiAgKiAgICAgICAgICAgICAgQ29tcG9uZW50ICAgICAgICAgICAtIENvbXBvbmVudCB0eXBlIG9mIGNhbGxlcgpAQCAtNzE3LDY0ICs2MDQsNTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF90cmFja19hbGxvY2F0aW9uICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQsCi0Jc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqYWxsb2NhdGlvbiwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY190eXBlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpCithY3BpX3V0X3RyYWNrX2FsbG9jYXRpb24oc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICphbGxvY2F0aW9uLAorCQkJIGFjcGlfc2l6ZSBzaXplLAorCQkJIHU4IGFsbG9jX3R5cGUsIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCiB7Ci0Jc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgICAgICAgICAqbWVtX2xpc3Q7Ci0Jc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqZWxlbWVudDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICptZW1fbGlzdDsKKwlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmVsZW1lbnQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigidXRfdHJhY2tfYWxsb2NhdGlvbiIsIGFsbG9jYXRpb24pOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJ1dF90cmFja19hbGxvY2F0aW9uIiwgYWxsb2NhdGlvbik7Ci0KLQotCWlmIChsaXN0X2lkID4gQUNQSV9NRU1fTElTVF9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQltZW1fbGlzdCA9ICZhY3BpX2dibF9tZW1vcnlfbGlzdHNbbGlzdF9pZF07Ci0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9NRU1PUlkpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCW1lbV9saXN0ID0gYWNwaV9nYmxfZ2xvYmFsX2xpc3Q7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX01FTU9SWSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCiAJICogU2VhcmNoIGxpc3QgZm9yIHRoaXMgYWRkcmVzcyB0byBtYWtlIHN1cmUgaXQgaXMgbm90IGFscmVhZHkgb24gdGhlIGxpc3QuCiAJICogVGhpcyB3aWxsIGNhdGNoIHNldmVyYWwga2luZHMgb2YgcHJvYmxlbXMuCiAJICovCi0KLQllbGVtZW50ID0gYWNwaV91dF9maW5kX2FsbG9jYXRpb24gKGxpc3RfaWQsIGFsbG9jYXRpb24pOworCWVsZW1lbnQgPSBhY3BpX3V0X2ZpbmRfYWxsb2NhdGlvbihhbGxvY2F0aW9uKTsKIAlpZiAoZWxlbWVudCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJInV0X3RyYWNrX2FsbG9jYXRpb246IEFsbG9jYXRpb24gYWxyZWFkeSBwcmVzZW50IGluIGxpc3QhICglcClcbiIsCi0JCQlhbGxvY2F0aW9uKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgidXRfdHJhY2tfYWxsb2NhdGlvbjogQWxsb2NhdGlvbiBhbHJlYWR5IHByZXNlbnQgaW4gbGlzdCEgKCVwKVxuIiwgYWxsb2NhdGlvbikpOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiRWxlbWVudCAlcCBBZGRyZXNzICVwXG4iLAotCQkJZWxlbWVudCwgYWxsb2NhdGlvbikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRWxlbWVudCAlcCBBZGRyZXNzICVwXG4iLAorCQkJCSAgZWxlbWVudCwgYWxsb2NhdGlvbikpOwogCiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAogCS8qIEZpbGwgaW4gdGhlIGluc3RhbmNlIGRhdGEuICovCiAKLQlhbGxvY2F0aW9uLT5zaXplICAgICAgPSAodTMyKSBzaXplOworCWFsbG9jYXRpb24tPnNpemUgPSAodTMyKSBzaXplOwogCWFsbG9jYXRpb24tPmFsbG9jX3R5cGUgPSBhbGxvY190eXBlOwogCWFsbG9jYXRpb24tPmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLQlhbGxvY2F0aW9uLT5saW5lICAgICAgPSBsaW5lOworCWFsbG9jYXRpb24tPmxpbmUgPSBsaW5lOwogCi0JQUNQSV9TVFJOQ1BZIChhbGxvY2F0aW9uLT5tb2R1bGUsIG1vZHVsZSwgQUNQSV9NQVhfTU9EVUxFX05BTUUpOwotCWFsbG9jYXRpb24tPm1vZHVsZVtBQ1BJX01BWF9NT0RVTEVfTkFNRS0xXSA9IDA7CisJQUNQSV9TVFJOQ1BZKGFsbG9jYXRpb24tPm1vZHVsZSwgbW9kdWxlLCBBQ1BJX01BWF9NT0RVTEVfTkFNRSk7CisJYWxsb2NhdGlvbi0+bW9kdWxlW0FDUElfTUFYX01PRFVMRV9OQU1FIC0gMV0gPSAwOwogCiAJLyogSW5zZXJ0IGF0IGxpc3QgaGVhZCAqLwogCiAJaWYgKG1lbV9saXN0LT5saXN0X2hlYWQpIHsKLQkJKChzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKikobWVtX2xpc3QtPmxpc3RfaGVhZCkpLT5wcmV2aW91cyA9IGFsbG9jYXRpb247CisJCSgoc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICopKG1lbV9saXN0LT5saXN0X2hlYWQpKS0+CisJCSAgICBwcmV2aW91cyA9IGFsbG9jYXRpb247CiAJfQogCiAJYWxsb2NhdGlvbi0+bmV4dCA9IG1lbV9saXN0LT5saXN0X2hlYWQ7CkBAIC03ODIsMTkgKzY1NiwxNiBAQAogCiAJbWVtX2xpc3QtPmxpc3RfaGVhZCA9IGFsbG9jYXRpb247CiAKLQotdW5sb2NrX2FuZF9leGl0OgotCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTUVNT1JZKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX01FTU9SWSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZW1vdmVfYWxsb2NhdGlvbgogICoKLSAqIFBBUkFNRVRFUlM6ICBsaXN0X2lkICAgICAgICAgICAgIC0gTWVtb3J5IGxpc3QgdG8gc2VhcmNoCi0gKiAgICAgICAgICAgICAgQWxsb2NhdGlvbiAgICAgICAgICAtIEFkZHJlc3Mgb2YgYWxsb2NhdGVkIG1lbW9yeQorICogUEFSQU1FVEVSUzogIEFsbG9jYXRpb24gICAgICAgICAgLSBBZGRyZXNzIG9mIGFsbG9jYXRlZCBtZW1vcnkKICAqICAgICAgICAgICAgICBDb21wb25lbnQgICAgICAgICAgIC0gQ29tcG9uZW50IHR5cGUgb2YgY2FsbGVyCiAgKiAgICAgICAgICAgICAgTW9kdWxlICAgICAgICAgICAgICAtIFNvdXJjZSBmaWxlIG5hbWUgb2YgY2FsbGVyCiAgKiAgICAgICAgICAgICAgTGluZSAgICAgICAgICAgICAgICAtIExpbmUgbnVtYmVyIG9mIGNhbGxlcgpAQCAtODA2LDQ1ICs2NzcsMzQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9yZW1vdmVfYWxsb2NhdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFsbG9jYXRpb24sCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSkKK2FjcGlfdXRfcmVtb3ZlX2FsbG9jYXRpb24oc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICphbGxvY2F0aW9uLAorCQkJICB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKQogewotCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICAgICAgICAgKm1lbV9saXN0OwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICptZW1fbGlzdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9yZW1vdmVfYWxsb2NhdGlvbiIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X3JlbW92ZV9hbGxvY2F0aW9uIik7Ci0KLQotCWlmIChsaXN0X2lkID4gQUNQSV9NRU1fTElTVF9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQltZW1fbGlzdCA9ICZhY3BpX2dibF9tZW1vcnlfbGlzdHNbbGlzdF9pZF07CisJbWVtX2xpc3QgPSBhY3BpX2dibF9nbG9iYWxfbGlzdDsKIAlpZiAoTlVMTCA9PSBtZW1fbGlzdC0+bGlzdF9oZWFkKSB7CiAJCS8qIE5vIGFsbG9jYXRpb25zISAqLwogCi0JCV9BQ1BJX1JFUE9SVF9FUlJPUiAobW9kdWxlLCBsaW5lLCBjb21wb25lbnQsCi0JCQkoInV0X3JlbW92ZV9hbGxvY2F0aW9uOiBFbXB0eSBhbGxvY2F0aW9uIGxpc3QsIG5vdGhpbmcgdG8gZnJlZSFcbiIpKTsKKwkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAorCQkJCSAgICgidXRfcmVtb3ZlX2FsbG9jYXRpb246IEVtcHR5IGFsbG9jYXRpb24gbGlzdCwgbm90aGluZyB0byBmcmVlIVxuIikpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTUVNT1JZKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTUVNT1JZKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogVW5saW5rICovCiAKIAlpZiAoYWxsb2NhdGlvbi0+cHJldmlvdXMpIHsKIAkJKGFsbG9jYXRpb24tPnByZXZpb3VzKS0+bmV4dCA9IGFsbG9jYXRpb24tPm5leHQ7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCW1lbV9saXN0LT5saXN0X2hlYWQgPSBhbGxvY2F0aW9uLT5uZXh0OwogCX0KIApAQCAtODU0LDE2ICs3MTQsMTUgQEAKIAogCS8qIE1hcmsgdGhlIHNlZ21lbnQgYXMgZGVsZXRlZCAqLwogCi0JQUNQSV9NRU1TRVQgKCZhbGxvY2F0aW9uLT51c2VyX3NwYWNlLCAweEVBLCBhbGxvY2F0aW9uLT5zaXplKTsKKwlBQ1BJX01FTVNFVCgmYWxsb2NhdGlvbi0+dXNlcl9zcGFjZSwgMHhFQSwgYWxsb2NhdGlvbi0+c2l6ZSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIkZyZWVpbmcgc2l6ZSAwJVhcbiIsCi0JCWFsbG9jYXRpb24tPnNpemUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiRnJlZWluZyBzaXplIDAlWFxuIiwKKwkJCSAgYWxsb2NhdGlvbi0+c2l6ZSkpOwogCi0Jc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9NRU1PUlkpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTUVNT1JZKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbl9pbmZvCkBAIC04NzcsMTUgKzczNiwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi12b2lkCi1hY3BpX3V0X2R1bXBfYWxsb2NhdGlvbl9pbmZvICgKLQl2b2lkKQordm9pZCBhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbl9pbmZvKHZvaWQpCiB7CiAvKgogCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICAgICAgICAgKm1lbV9saXN0OwogKi8KIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9kdW1wX2FsbG9jYXRpb25faW5mbyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2R1bXBfYWxsb2NhdGlvbl9pbmZvIik7CiAKIC8qCiAJQUNQSV9ERUJVR19QUklOVCAoVFJBQ0VfQUxMT0NBVElPTlMgfCBUUkFDRV9UQUJMRVMsCkBAIC04OTgsNyArNzU1LDYgQEAKIAkJCSAgbWVtX2xpc3QtPm1heF9jb25jdXJyZW50X2NvdW50LAogCQkJICBST1VORF9VUF9UT18xSyAobWVtX2xpc3QtPm1heF9jb25jdXJyZW50X3NpemUpKSk7CiAKLQogCUFDUElfREVCVUdfUFJJTlQgKFRSQUNFX0FMTE9DQVRJT05TIHwgVFJBQ0VfVEFCTEVTLAogCQkJICAoIiUzMHM6ICU0ZCAoJTNkIEtiKVxuIiwgIlRvdGFsIChhbGwpIGludGVybmFsIG9iamVjdHMiLAogCQkJICBydW5uaW5nX29iamVjdF9jb3VudCwKQEAgLTkwOSw3ICs3NjUsNiBAQAogCQkJICBydW5uaW5nX2FsbG9jX2NvdW50LAogCQkJICBST1VORF9VUF9UT18xSyAocnVubmluZ19hbGxvY19zaXplKSkpOwogCi0KIAlBQ1BJX0RFQlVHX1BSSU5UIChUUkFDRV9BTExPQ0FUSU9OUyB8IFRSQUNFX1RBQkxFUywKIAkJCSAgKCIlMzBzOiAlNGQgKCUzZCBLYilcbiIsICJDdXJyZW50IE5vZGVzIiwKIAkJCSAgYWNwaV9nYmxfY3VycmVudF9ub2RlX2NvdW50LApAQCAtOTIzLDggKzc3OCw3IEBACiAqLwogCXJldHVybl9WT0lEOwogfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtOTM5LDg0ICs3OTMsODcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X2R1bXBfYWxsb2NhdGlvbnMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSkKK3ZvaWQgYWNwaV91dF9kdW1wX2FsbG9jYXRpb25zKHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSkKIHsKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICplbGVtZW50OwotCXVuaW9uIGFjcGlfZGVzY3JpcHRvciAgICAgICAgICAgKmRlc2NyaXB0b3I7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fb3V0c3RhbmRpbmcgPSAwOworCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqZWxlbWVudDsKKwl1bmlvbiBhY3BpX2Rlc2NyaXB0b3IgKmRlc2NyaXB0b3I7CisJdTMyIG51bV9vdXRzdGFuZGluZyA9IDA7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9kdW1wX2FsbG9jYXRpb25zIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9kdW1wX2FsbG9jYXRpb25zIik7CiAKIAkvKgogCSAqIFdhbGsgdGhlIGFsbG9jYXRpb24gbGlzdC4KIAkgKi8KLQlpZiAoQUNQSV9GQUlMVVJFIChhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX01FTU9SWSkpKSB7CisJaWYgKEFDUElfRkFJTFVSRShhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTUVNT1JZKSkpIHsKIAkJcmV0dXJuOwogCX0KIAotCWVsZW1lbnQgPSBhY3BpX2dibF9tZW1vcnlfbGlzdHNbMF0ubGlzdF9oZWFkOworCWVsZW1lbnQgPSBhY3BpX2dibF9nbG9iYWxfbGlzdC0+bGlzdF9oZWFkOwogCXdoaWxlIChlbGVtZW50KSB7CiAJCWlmICgoZWxlbWVudC0+Y29tcG9uZW50ICYgY29tcG9uZW50KSAmJgotCQkJKChtb2R1bGUgPT0gTlVMTCkgfHwgKDAgPT0gQUNQSV9TVFJDTVAgKG1vZHVsZSwgZWxlbWVudC0+bW9kdWxlKSkpKSB7CisJCSAgICAoKG1vZHVsZSA9PSBOVUxMKQorCQkgICAgIHx8ICgwID09IEFDUElfU1RSQ01QKG1vZHVsZSwgZWxlbWVudC0+bW9kdWxlKSkpKSB7CiAJCQkvKiBJZ25vcmUgYWxsb2NhdGVkIG9iamVjdHMgdGhhdCBhcmUgaW4gYSBjYWNoZSAqLwogCi0JCQlkZXNjcmlwdG9yID0gQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9kZXNjcmlwdG9yLCAmZWxlbWVudC0+dXNlcl9zcGFjZSk7CisJCQlkZXNjcmlwdG9yID0KKwkJCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfZGVzY3JpcHRvciwKKwkJCQkJICAmZWxlbWVudC0+dXNlcl9zcGFjZSk7CiAJCQlpZiAoZGVzY3JpcHRvci0+ZGVzY3JpcHRvcl9pZCAhPSBBQ1BJX0RFU0NfVFlQRV9DQUNIRUQpIHsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIiVwIExlbiAlMDRYICU5LjlzLSVkIFslc10gIiwKLQkJCQkJZGVzY3JpcHRvciwgZWxlbWVudC0+c2l6ZSwgZWxlbWVudC0+bW9kdWxlLAotCQkJCQllbGVtZW50LT5saW5lLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKGRlc2NyaXB0b3IpKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiJXAgTGVuICUwNFggJTkuOXMtJWQgWyVzXSAiLAorCQkJCQkgICAgICAgZGVzY3JpcHRvciwgZWxlbWVudC0+c2l6ZSwKKwkJCQkJICAgICAgIGVsZW1lbnQtPm1vZHVsZSwgZWxlbWVudC0+bGluZSwKKwkJCQkJICAgICAgIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZQorCQkJCQkgICAgICAgKGRlc2NyaXB0b3IpKTsKIAogCQkJCS8qIE1vc3Qgb2YgdGhlIGVsZW1lbnRzIHdpbGwgYmUgT3BlcmFuZCBvYmplY3RzLiAqLwogCi0JCQkJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKGRlc2NyaXB0b3IpKSB7CisJCQkJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoZGVzY3JpcHRvcikpIHsKIAkJCQljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6Ci0JCQkJCWFjcGlfb3NfcHJpbnRmICgiJTEyLjEycyBSJWhkIiwKLQkJCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoZGVzY3JpcHRvci0+b2JqZWN0LmNvbW1vbi50eXBlKSwKLQkJCQkJCWRlc2NyaXB0b3ItPm9iamVjdC5jb21tb24ucmVmZXJlbmNlX2NvdW50KTsKKwkJCQkJYWNwaV9vc19wcmludGYoIiUxMi4xMnMgUiVoZCIsCisJCQkJCQkgICAgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lCisJCQkJCQkgICAgICAgKGRlc2NyaXB0b3ItPm9iamVjdC4KKwkJCQkJCQljb21tb24udHlwZSksCisJCQkJCQkgICAgICAgZGVzY3JpcHRvci0+b2JqZWN0LgorCQkJCQkJICAgICAgIGNvbW1vbi5yZWZlcmVuY2VfY291bnQpOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgQUNQSV9ERVNDX1RZUEVfUEFSU0VSOgotCQkJCQlhY3BpX29zX3ByaW50ZiAoImFtbF9vcGNvZGUgJTA0aFgiLAotCQkJCQkJZGVzY3JpcHRvci0+b3AuYXNsLmFtbF9vcGNvZGUpOworCQkJCQlhY3BpX29zX3ByaW50ZigiYW1sX29wY29kZSAlMDRoWCIsCisJCQkJCQkgICAgICAgZGVzY3JpcHRvci0+b3AuYXNsLgorCQkJCQkJICAgICAgIGFtbF9vcGNvZGUpOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgQUNQSV9ERVNDX1RZUEVfTkFNRUQ6Ci0JCQkJCWFjcGlfb3NfcHJpbnRmICgiJTQuNHMiLAotCQkJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lICgmZGVzY3JpcHRvci0+bm9kZSkpOworCQkJCQlhY3BpX29zX3ByaW50ZigiJTQuNHMiLAorCQkJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZQorCQkJCQkJICAgICAgICgmZGVzY3JpcHRvci0+bm9kZSkpOwogCQkJCQlicmVhazsKIAogCQkJCWRlZmF1bHQ6CiAJCQkJCWJyZWFrOwogCQkJCX0KIAotCQkJCWFjcGlfb3NfcHJpbnRmICggIlxuIik7CisJCQkJYWNwaV9vc19wcmludGYoIlxuIik7CiAJCQkJbnVtX291dHN0YW5kaW5nKys7CiAJCQl9CiAJCX0KIAkJZWxlbWVudCA9IGVsZW1lbnQtPm5leHQ7CiAJfQogCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTUVNT1JZKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTUVNT1JZKTsKIAogCS8qIFByaW50IHN1bW1hcnkgKi8KIAogCWlmICghbnVtX291dHN0YW5kaW5nKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIk5vIG91dHN0YW5kaW5nIGFsbG9jYXRpb25zLlxuIikpOwotCX0KLQllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiJWQoJVgpIE91dHN0YW5kaW5nIGFsbG9jYXRpb25zXG4iLAotCQkJbnVtX291dHN0YW5kaW5nLCBudW1fb3V0c3RhbmRpbmcpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJObyBvdXRzdGFuZGluZyBhbGxvY2F0aW9ucy5cbiIpKTsKKwl9IGVsc2UgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIiVkKCVYKSBPdXRzdGFuZGluZyBhbGxvY2F0aW9uc1xuIiwKKwkJCQkgIG51bV9vdXRzdGFuZGluZywgbnVtX291dHN0YW5kaW5nKSk7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLSNlbmRpZiAgLyogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TICovCi0KKyNlbmRpZgkJCQkvKiAjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjYWNoZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkNDg2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjYWNoZS5jCkBAIC0wLDAgKzEsMzA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHV0Y2FjaGUgLSBsb2NhbCBjYWNoZSBhbGxvY2F0aW9uIHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUworQUNQSV9NT0RVTEVfTkFNRSgidXRjYWNoZSIpCisKKyNpZmRlZiBBQ1BJX1VTRV9MT0NBTF9DQUNIRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9vc19jcmVhdGVfY2FjaGUKKyAqCisgKiBQQVJBTUVURVJTOiAgY2FjaGVfbmFtZSAgICAgIC0gQXNjaWkgbmFtZSBmb3IgdGhlIGNhY2hlCisgKiAgICAgICAgICAgICAgb2JqZWN0X3NpemUgICAgIC0gU2l6ZSBvZiBlYWNoIGNhY2hlZCBvYmplY3QKKyAqICAgICAgICAgICAgICBtYXhfZGVwdGggICAgICAgLSBNYXhpbXVtIGRlcHRoIG9mIHRoZSBjYWNoZSAoaW4gb2JqZWN0cykKKyAqICAgICAgICAgICAgICByZXR1cm5fY2FjaGUgICAgLSBXaGVyZSB0aGUgbmV3IGNhY2hlIG9iamVjdCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgY2FjaGUgb2JqZWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX29zX2NyZWF0ZV9jYWNoZShjaGFyICpjYWNoZV9uYW1lLAorCQkgICAgIHUxNiBvYmplY3Rfc2l6ZSwKKwkJICAgICB1MTYgbWF4X2RlcHRoLCBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqKnJldHVybl9jYWNoZSkKK3sKKwlzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqY2FjaGU7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlpZiAoIWNhY2hlX25hbWUgfHwgIXJldHVybl9jYWNoZSB8fCAob2JqZWN0X3NpemUgPCAxNikpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIGNhY2hlIG9iamVjdCAqLworCisJY2FjaGUgPSBhY3BpX29zX2FsbG9jYXRlKHNpemVvZihzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCkpOworCWlmICghY2FjaGUpIHsKKwkJcmV0dXJuIChBRV9OT19NRU1PUlkpOworCX0KKworCS8qIFBvcHVsYXRlIHRoZSBjYWNoZSBvYmplY3QgYW5kIHJldHVybiBpdCAqLworCisJQUNQSV9NRU1TRVQoY2FjaGUsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCkpOworCWNhY2hlLT5saW5rX29mZnNldCA9IDg7CisJY2FjaGUtPmxpc3RfbmFtZSA9IGNhY2hlX25hbWU7CisJY2FjaGUtPm9iamVjdF9zaXplID0gb2JqZWN0X3NpemU7CisJY2FjaGUtPm1heF9kZXB0aCA9IG1heF9kZXB0aDsKKworCSpyZXR1cm5fY2FjaGUgPSBjYWNoZTsKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9vc19wdXJnZV9jYWNoZQorICoKKyAqIFBBUkFNRVRFUlM6ICBDYWNoZSAgICAgICAgICAgLSBIYW5kbGUgdG8gY2FjaGUgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBGcmVlIGFsbCBvYmplY3RzIHdpdGhpbiB0aGUgcmVxdWVzdGVkIGNhY2hlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfb3NfcHVyZ2VfY2FjaGUoc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKiBjYWNoZSkKK3sKKwljaGFyICpuZXh0OworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJaWYgKCFjYWNoZSkgeworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qIFdhbGsgdGhlIGxpc3Qgb2Ygb2JqZWN0cyBpbiB0aGlzIGNhY2hlICovCisKKwl3aGlsZSAoY2FjaGUtPmxpc3RfaGVhZCkgeworCQkvKiBEZWxldGUgYW5kIHVubGluayBvbmUgY2FjaGVkIHN0YXRlIG9iamVjdCAqLworCisJCW5leHQgPSAqKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIoY2hhciwKKwkJCQkJCSYoKChjaGFyICopY2FjaGUtPgorCQkJCQkJICAgbGlzdF9oZWFkKVtjYWNoZS0+CisJCQkJCQkJICAgICAgbGlua19vZmZzZXRdKSkpOworCQlBQ1BJX01FTV9GUkVFKGNhY2hlLT5saXN0X2hlYWQpOworCisJCWNhY2hlLT5saXN0X2hlYWQgPSBuZXh0OworCQljYWNoZS0+Y3VycmVudF9kZXB0aC0tOworCX0KKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX29zX2RlbGV0ZV9jYWNoZQorICoKKyAqIFBBUkFNRVRFUlM6ICBDYWNoZSAgICAgICAgICAgLSBIYW5kbGUgdG8gY2FjaGUgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBGcmVlIGFsbCBvYmplY3RzIHdpdGhpbiB0aGUgcmVxdWVzdGVkIGNhY2hlIGFuZCBkZWxldGUgdGhlCisgKiAgICAgICAgICAgICAgY2FjaGUgb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfb3NfZGVsZXRlX2NhY2hlKHN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICogY2FjaGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogUHVyZ2UgYWxsIG9iamVjdHMgaW4gdGhlIGNhY2hlICovCisKKwlzdGF0dXMgPSBhY3BpX29zX3B1cmdlX2NhY2hlKGNhY2hlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIE5vdyB3ZSBjYW4gZGVsZXRlIHRoZSBjYWNoZSBvYmplY3QgKi8KKworCWFjcGlfb3NfZnJlZShjYWNoZSk7CisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfb3NfcmVsZWFzZV9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgQ2FjaGUgICAgICAgLSBIYW5kbGUgdG8gY2FjaGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgT2JqZWN0ICAgICAgLSBUaGUgb2JqZWN0IHRvIGJlIHJlbGVhc2VkCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUmVsZWFzZSBhbiBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBjYWNoZS4gIElmIGNhY2hlIGlzIGZ1bGwsCisgKiAgICAgICAgICAgICAgdGhlIG9iamVjdCBpcyBkZWxldGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX29zX3JlbGVhc2Vfb2JqZWN0KHN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICogY2FjaGUsIHZvaWQgKm9iamVjdCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlpZiAoIWNhY2hlIHx8ICFvYmplY3QpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBJZiBjYWNoZSBpcyBmdWxsLCBqdXN0IGZyZWUgdGhpcyBvYmplY3QgKi8KKworCWlmIChjYWNoZS0+Y3VycmVudF9kZXB0aCA+PSBjYWNoZS0+bWF4X2RlcHRoKSB7CisJCUFDUElfTUVNX0ZSRUUob2JqZWN0KTsKKwkJQUNQSV9NRU1fVFJBQ0tJTkcoY2FjaGUtPnRvdGFsX2ZyZWVkKyspOworCX0KKworCS8qIE90aGVyd2lzZSBwdXQgdGhpcyBvYmplY3QgYmFjayBpbnRvIHRoZSBjYWNoZSAqLworCisJZWxzZSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybiAoc3RhdHVzKTsKKwkJfQorCisJCS8qIE1hcmsgdGhlIG9iamVjdCBhcyBjYWNoZWQgKi8KKworCQlBQ1BJX01FTVNFVChvYmplY3QsIDB4Q0EsIGNhY2hlLT5vYmplY3Rfc2l6ZSk7CisJCUFDUElfU0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QsIEFDUElfREVTQ19UWVBFX0NBQ0hFRCk7CisKKwkJLyogUHV0IHRoZSBvYmplY3QgYXQgdGhlIGhlYWQgb2YgdGhlIGNhY2hlIGxpc3QgKi8KKworCQkqKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIoY2hhciwKKwkJCQkJICYoKChjaGFyICopb2JqZWN0KVtjYWNoZS0+CisJCQkJCQkJICAgIGxpbmtfb2Zmc2V0XSkpKSA9CisJCSAgICBjYWNoZS0+bGlzdF9oZWFkOworCQljYWNoZS0+bGlzdF9oZWFkID0gb2JqZWN0OworCQljYWNoZS0+Y3VycmVudF9kZXB0aCsrOworCisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOworCX0KKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX29zX2FjcXVpcmVfb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIENhY2hlICAgICAgICAgICAtIEhhbmRsZSB0byBjYWNoZSBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgdGhlIGFjcXVpcmVkIG9iamVjdC4gIE5VTEwgb24gZXJyb3IKKyAqCisgKiBERVNDUklQVElPTjogR2V0IGFuIG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgY2FjaGUuICBJZiBjYWNoZSBpcyBlbXB0eSwKKyAqICAgICAgICAgICAgICB0aGUgb2JqZWN0IGlzIGFsbG9jYXRlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICphY3BpX29zX2FjcXVpcmVfb2JqZWN0KHN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICpjYWNoZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdm9pZCAqb2JqZWN0OworCisJQUNQSV9GVU5DVElPTl9OQU1FKCJvc19hY3F1aXJlX29iamVjdCIpOworCisJaWYgKCFjYWNoZSkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCUFDUElfTUVNX1RSQUNLSU5HKGNhY2hlLT5yZXF1ZXN0cysrKTsKKworCS8qIENoZWNrIHRoZSBjYWNoZSBmaXJzdCAqLworCisJaWYgKGNhY2hlLT5saXN0X2hlYWQpIHsKKwkJLyogVGhlcmUgaXMgYW4gb2JqZWN0IGF2YWlsYWJsZSwgdXNlIGl0ICovCisKKwkJb2JqZWN0ID0gY2FjaGUtPmxpc3RfaGVhZDsKKwkJY2FjaGUtPmxpc3RfaGVhZCA9ICooQUNQSV9DQVNUX0lORElSRUNUX1BUUihjaGFyLAorCQkJCQkJCSAgICAmKCgoY2hhciAqKQorCQkJCQkJCSAgICAgICBvYmplY3QpW2NhY2hlLT4KKwkJCQkJCQkJICAgICAgIGxpbmtfb2Zmc2V0XSkpKTsKKworCQljYWNoZS0+Y3VycmVudF9kZXB0aC0tOworCisJCUFDUElfTUVNX1RSQUNLSU5HKGNhY2hlLT5oaXRzKyspOworCQlBQ1BJX01FTV9UUkFDS0lORyhBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCQkgICAgIk9iamVjdCAlcCBmcm9tICVzIGNhY2hlXG4iLAorCQkJCQkJICAgIG9iamVjdCwgY2FjaGUtPmxpc3RfbmFtZSkpKTsKKworCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisKKwkJLyogQ2xlYXIgKHplcm8pIHRoZSBwcmV2aW91c2x5IHVzZWQgT2JqZWN0ICovCisKKwkJQUNQSV9NRU1TRVQob2JqZWN0LCAwLCBjYWNoZS0+b2JqZWN0X3NpemUpOworCX0gZWxzZSB7CisJCS8qIFRoZSBjYWNoZSBpcyBlbXB0eSwgY3JlYXRlIGEgbmV3IG9iamVjdCAqLworCisJCUFDUElfTUVNX1RSQUNLSU5HKGNhY2hlLT50b3RhbF9hbGxvY2F0ZWQrKyk7CisKKwkJLyogQXZvaWQgZGVhZGxvY2sgd2l0aCBBQ1BJX01FTV9DQUxMT0NBVEUgKi8KKworCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisKKwkJb2JqZWN0ID0gQUNQSV9NRU1fQ0FMTE9DQVRFKGNhY2hlLT5vYmplY3Rfc2l6ZSk7CisJCWlmICghb2JqZWN0KSB7CisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisJfQorCisJcmV0dXJuIChvYmplY3QpOworfQorI2VuZGlmCQkJCS8qIEFDUElfVVNFX0xPQ0FMX0NBQ0hFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y29weS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNvcHkuYwppbmRleCAxMWU4ODQ5Li41NDQyYjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y29weS5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjb3B5LmMKQEAgLTQxLDU5ICs0MSw0NiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRjb3B5IikKK0FDUElfTU9EVUxFX05BTUUoInV0Y29weSIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3QsCisJCQkJdW5pb24gYWNwaV9vYmplY3QgKmV4dGVybmFsX29iamVjdCwKKwkJCQl1OCAqIGRhdGFfc3BhY2UsIGFjcGlfc2l6ZSAqIGJ1ZmZlcl9zcGFjZV91c2VkKTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc3BhY2UsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyX3NwYWNlX3VzZWQpOworYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2llbGVtZW50KHU4IG9iamVjdF90eXBlLAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iamVjdCwKKwkJCQkgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGUsCisJCQkJICB2b2lkICpjb250ZXh0KTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK2FjcGlfdXRfY29weV9pcGFja2FnZV90b19lcGFja2FnZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3QsCisJCQkJICB1OCAqIGJ1ZmZlciwgYWNwaV9zaXplICogc3BhY2VfdXNlZCk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2VwYWNrYWdlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnNwYWNlX3VzZWQpOworYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZSh1bmlvbiBhY3BpX29iamVjdCAqdXNlcl9vYmosCisJCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9vYmopOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUoCi0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqdXNlcl9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9vYmopOworYWNwaV91dF9jb3B5X3NpbXBsZV9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X2Rlc2MpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X2Rlc2MpOworYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2VlbGVtZW50KHU4IG9iamVjdF90eXBlLAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iamVjdCwKKwkJCQkgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGUsCisJCQkJICB2b2lkICpjb250ZXh0KTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9fZWVsZW1lbnQgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9vYmosCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KK2FjcGlfdXRfY29weV9pcGFja2FnZV90b19pcGFja2FnZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2Vfb2JqLAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9vYmosCisJCQkJICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMTYsMTcgKzEwMywxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc3BhY2UsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyX3NwYWNlX3VzZWQpCithY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmludGVybmFsX29iamVjdCwKKwkJCQl1bmlvbiBhY3BpX29iamVjdCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCXU4ICogZGF0YV9zcGFjZSwgYWNwaV9zaXplICogYnVmZmVyX3NwYWNlX3VzZWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZSIpOwogCiAJKmJ1ZmZlcl9zcGFjZV91c2VkID0gMDsKIApAQCAtMTM1LDU0ICsxMTgsNTQgQEAKIAkgKiBwYWNrYWdlIGVsZW1lbnQpCiAJICovCiAJaWYgKCFpbnRlcm5hbF9vYmplY3QpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogQWx3YXlzIGNsZWFyIHRoZSBleHRlcm5hbCBvYmplY3QgKi8KIAotCUFDUElfTUVNU0VUIChleHRlcm5hbF9vYmplY3QsIDAsIHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKTsKKwlBQ1BJX01FTVNFVChleHRlcm5hbF9vYmplY3QsIDAsIHNpemVvZih1bmlvbiBhY3BpX29iamVjdCkpOwogCiAJLyoKIAkgKiBJbiBnZW5lcmFsLCB0aGUgZXh0ZXJuYWwgb2JqZWN0IHdpbGwgYmUgdGhlIHNhbWUgdHlwZSBhcwogCSAqIHRoZSBpbnRlcm5hbCBvYmplY3QKIAkgKi8KLQlleHRlcm5hbF9vYmplY3QtPnR5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoaW50ZXJuYWxfb2JqZWN0KTsKKwlleHRlcm5hbF9vYmplY3QtPnR5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbnRlcm5hbF9vYmplY3QpOwogCiAJLyogSG93ZXZlciwgb25seSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGV4dGVybmFsIHR5cGVzIGFyZSBzdXBwb3J0ZWQgKi8KIAotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGludGVybmFsX29iamVjdCkpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKGludGVybmFsX29iamVjdCkpIHsKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKLQkJZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciA9IChjaGFyICopIGRhdGFfc3BhY2U7CisJCWV4dGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIgPSAoY2hhciAqKWRhdGFfc3BhY2U7CiAJCWV4dGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCA9IGludGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aDsKLQkJKmJ1ZmZlcl9zcGFjZV91c2VkID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoCi0JCQkJICAgKGFjcGlfc2l6ZSkgaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCSpidWZmZXJfc3BhY2VfdXNlZCA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoKGFjcGlfc2l6ZSkKKwkJCQkJCQkJICBpbnRlcm5hbF9vYmplY3QtPgorCQkJCQkJCQkgIHN0cmluZy4KKwkJCQkJCQkJICBsZW5ndGggKyAxKTsKIAotCQlBQ1BJX01FTUNQWSAoKHZvaWQgKikgZGF0YV9zcGFjZSwKLQkJCSh2b2lkICopIGludGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIsCi0JCQkoYWNwaV9zaXplKSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJQUNQSV9NRU1DUFkoKHZvaWQgKilkYXRhX3NwYWNlLAorCQkJICAgICh2b2lkICopaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciwKKwkJCSAgICAoYWNwaV9zaXplKSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggKyAxKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAogCQlleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyID0gZGF0YV9zcGFjZTsKIAkJZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoID0gaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoOwotCQkqYnVmZmVyX3NwYWNlX3VzZWQgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEICgKLQkJCQkgICBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGgpOworCQkqYnVmZmVyX3NwYWNlX3VzZWQgPQorCQkgICAgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChpbnRlcm5hbF9vYmplY3QtPnN0cmluZy4KKwkJCQkJCSBsZW5ndGgpOwogCi0JCUFDUElfTUVNQ1BZICgodm9pZCAqKSBkYXRhX3NwYWNlLAotCQkJKHZvaWQgKikgaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIucG9pbnRlciwKLQkJCWludGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aCk7CisJCUFDUElfTUVNQ1BZKCh2b2lkICopZGF0YV9zcGFjZSwKKwkJCSAgICAodm9pZCAqKWludGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIsCisJCQkgICAgaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKIAkJZXh0ZXJuYWxfb2JqZWN0LT5pbnRlZ2VyLnZhbHVlID0gaW50ZXJuYWxfb2JqZWN0LT5pbnRlZ2VyLnZhbHVlOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCiAJCS8qCkBAIC0xOTksNDEgKzE4Miw0MSBAQAogCQkJICogdG8gb2JqZWN0IGNvbnRhaW5pbmcgYSBoYW5kbGUgdG8gYW4gQUNQSSBuYW1lZCBvYmplY3QuCiAJCQkgKi8KIAkJCWV4dGVybmFsX29iamVjdC0+dHlwZSA9IEFDUElfVFlQRV9BTlk7Ci0JCQlleHRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5oYW5kbGUgPSBpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5ub2RlOworCQkJZXh0ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2UuaGFuZGxlID0KKwkJCSAgICBpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5ub2RlOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKIAotCQlleHRlcm5hbF9vYmplY3QtPnByb2Nlc3Nvci5wcm9jX2lkICAgID0gaW50ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IucHJvY19pZDsKLQkJZXh0ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IucGJsa19hZGRyZXNzID0gaW50ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IuYWRkcmVzczsKLQkJZXh0ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IucGJsa19sZW5ndGggPSBpbnRlcm5hbF9vYmplY3QtPnByb2Nlc3Nvci5sZW5ndGg7CisJCWV4dGVybmFsX29iamVjdC0+cHJvY2Vzc29yLnByb2NfaWQgPQorCQkgICAgaW50ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IucHJvY19pZDsKKwkJZXh0ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IucGJsa19hZGRyZXNzID0KKwkJICAgIGludGVybmFsX29iamVjdC0+cHJvY2Vzc29yLmFkZHJlc3M7CisJCWV4dGVybmFsX29iamVjdC0+cHJvY2Vzc29yLnBibGtfbGVuZ3RoID0KKwkJICAgIGludGVybmFsX29iamVjdC0+cHJvY2Vzc29yLmxlbmd0aDsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1BPV0VSOgogCiAJCWV4dGVybmFsX29iamVjdC0+cG93ZXJfcmVzb3VyY2Uuc3lzdGVtX2xldmVsID0KLQkJCQkgICBpbnRlcm5hbF9vYmplY3QtPnBvd2VyX3Jlc291cmNlLnN5c3RlbV9sZXZlbDsKKwkJICAgIGludGVybmFsX29iamVjdC0+cG93ZXJfcmVzb3VyY2Uuc3lzdGVtX2xldmVsOwogCiAJCWV4dGVybmFsX29iamVjdC0+cG93ZXJfcmVzb3VyY2UucmVzb3VyY2Vfb3JkZXIgPQotCQkJCSAgIGludGVybmFsX29iamVjdC0+cG93ZXJfcmVzb3VyY2UucmVzb3VyY2Vfb3JkZXI7CisJCSAgICBpbnRlcm5hbF9vYmplY3QtPnBvd2VyX3Jlc291cmNlLnJlc291cmNlX29yZGVyOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAkJLyoKIAkJICogVGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBleHRlcm5hbCBvYmplY3QgdHlwZQogCQkgKi8KLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9TVVBQT1JUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NVUFBPUlQpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9fZWVsZW1lbnQKQEAgLTI0NywyNSArMjMwLDIzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pZWxlbWVudF90b19lZWxlbWVudCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpCithY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9fZWVsZW1lbnQodTggb2JqZWN0X3R5cGUsCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2Vfb2JqZWN0LAorCQkJCSAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSwKKwkJCQkgIHZvaWQgKmNvbnRleHQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9wa2dfaW5mbyAgICAgICAgICAgICppbmZvID0gKHN0cnVjdCBhY3BpX3BrZ19pbmZvICopIGNvbnRleHQ7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc3BhY2U7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2luZGV4OwotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKnRhcmdldF9vYmplY3Q7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfcGtnX2luZm8gKmluZm8gPSAoc3RydWN0IGFjcGlfcGtnX2luZm8gKiljb250ZXh0OworCWFjcGlfc2l6ZSBvYmplY3Rfc3BhY2U7CisJdTMyIHRoaXNfaW5kZXg7CisJdW5pb24gYWNwaV9vYmplY3QgKnRhcmdldF9vYmplY3Q7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCi0KLQl0aGlzX2luZGV4ICAgPSBzdGF0ZS0+cGtnLmluZGV4OworCXRoaXNfaW5kZXggPSBzdGF0ZS0+cGtnLmluZGV4OwogCXRhcmdldF9vYmplY3QgPSAodW5pb24gYWNwaV9vYmplY3QgKikKLQkJJigodW5pb24gYWNwaV9vYmplY3QgKikoc3RhdGUtPnBrZy5kZXN0X29iamVjdCkpLT5wYWNrYWdlLmVsZW1lbnRzW3RoaXNfaW5kZXhdOworCSAgICAmKCh1bmlvbiBhY3BpX29iamVjdCAqKShzdGF0ZS0+cGtnLmRlc3Rfb2JqZWN0KSktPnBhY2thZ2UuCisJICAgIGVsZW1lbnRzW3RoaXNfaW5kZXhdOwogCiAJc3dpdGNoIChvYmplY3RfdHlwZSkgewogCWNhc2UgQUNQSV9DT1BZX1RZUEVfU0lNUExFOgpAQCAtMjczLDIzICsyNTQsMjQgQEAKIAkJLyoKIAkJICogVGhpcyBpcyBhIHNpbXBsZSBvciBudWxsIG9iamVjdAogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV91dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZSAoc291cmNlX29iamVjdCwKLQkJCQkgIHRhcmdldF9vYmplY3QsIGluZm8tPmZyZWVfc3BhY2UsICZvYmplY3Rfc3BhY2UpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUoc291cmNlX29iamVjdCwKKwkJCQkJCQkgdGFyZ2V0X29iamVjdCwKKwkJCQkJCQkgaW5mby0+ZnJlZV9zcGFjZSwKKwkJCQkJCQkgJm9iamVjdF9zcGFjZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfQ09QWV9UWVBFX1BBQ0tBR0U6CiAKIAkJLyoKIAkJICogQnVpbGQgdGhlIHBhY2thZ2Ugb2JqZWN0CiAJCSAqLwotCQl0YXJnZXRfb2JqZWN0LT50eXBlICAgICAgICAgICAgID0gQUNQSV9UWVBFX1BBQ0tBR0U7Ci0JCXRhcmdldF9vYmplY3QtPnBhY2thZ2UuY291bnQgICAgPSBzb3VyY2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50OworCQl0YXJnZXRfb2JqZWN0LT50eXBlID0gQUNQSV9UWVBFX1BBQ0tBR0U7CisJCXRhcmdldF9vYmplY3QtPnBhY2thZ2UuY291bnQgPSBzb3VyY2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50OwogCQl0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzID0KLQkJCUFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb2JqZWN0LCBpbmZvLT5mcmVlX3NwYWNlKTsKKwkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vYmplY3QsIGluZm8tPmZyZWVfc3BhY2UpOwogCiAJCS8qCiAJCSAqIFBhc3MgdGhlIG5ldyBwYWNrYWdlIG9iamVjdCBiYWNrIHRvIHRoZSBwYWNrYWdlIHdhbGsgcm91dGluZQpAQCAtMzAwLDIyICsyODIsMjIgQEAKIAkJICogU2F2ZSBzcGFjZSBmb3IgdGhlIGFycmF5IG9mIG9iamVjdHMgKFBhY2thZ2UgZWxlbWVudHMpCiAJCSAqIHVwZGF0ZSB0aGUgYnVmZmVyIGxlbmd0aCBjb3VudGVyCiAJCSAqLwotCQlvYmplY3Rfc3BhY2UgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEICgKLQkJCQkgICAoYWNwaV9zaXplKSB0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmNvdW50ICoKLQkJCQkgICBzaXplb2YgKHVuaW9uIGFjcGlfb2JqZWN0KSk7CisJCW9iamVjdF9zcGFjZSA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgICAgdGFyZ2V0X29iamVjdC0+CisJCQkJCQkJICAgIHBhY2thZ2UuY291bnQgKgorCQkJCQkJCSAgICBzaXplb2YodW5pb24KKwkJCQkJCQkJICAgYWNwaV9vYmplY3QpKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JaW5mby0+ZnJlZV9zcGFjZSAgKz0gb2JqZWN0X3NwYWNlOwotCWluZm8tPmxlbmd0aCAgICAgICs9IG9iamVjdF9zcGFjZTsKKwlpbmZvLT5mcmVlX3NwYWNlICs9IG9iamVjdF9zcGFjZTsKKwlpbmZvLT5sZW5ndGggKz0gb2JqZWN0X3NwYWNlOwogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UKQEAgLTMzNiw1NSArMzE4LDUxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pcGFja2FnZV90b19lcGFja2FnZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaW50ZXJuYWxfb2JqZWN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzcGFjZV91c2VkKQorYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2VwYWNrYWdlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmludGVybmFsX29iamVjdCwKKwkJCQkgIHU4ICogYnVmZmVyLCBhY3BpX3NpemUgKiBzcGFjZV91c2VkKQogewotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKmV4dGVybmFsX29iamVjdDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9wa2dfaW5mbyAgICAgICAgICAgIGluZm87CisJdW5pb24gYWNwaV9vYmplY3QgKmV4dGVybmFsX29iamVjdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfcGtnX2luZm8gaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UiKTsKIAogCS8qCiAJICogRmlyc3QgcGFja2FnZSBhdCBoZWFkIG9mIHRoZSBidWZmZXIKIAkgKi8KLQlleHRlcm5hbF9vYmplY3QgPSBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29iamVjdCwgYnVmZmVyKTsKKwlleHRlcm5hbF9vYmplY3QgPSBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb2JqZWN0LCBidWZmZXIpOwogCiAJLyoKIAkgKiBGcmVlIHNwYWNlIGJlZ2lucyByaWdodCBhZnRlciB0aGUgZmlyc3QgcGFja2FnZQogCSAqLwotCWluZm8ubGVuZ3RoICAgICAgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEIChzaXplb2YgKHVuaW9uIGFjcGlfb2JqZWN0KSk7Ci0JaW5mby5mcmVlX3NwYWNlICA9IGJ1ZmZlciArIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKAotCQkJICAgc2l6ZW9mICh1bmlvbiBhY3BpX29iamVjdCkpOworCWluZm8ubGVuZ3RoID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChzaXplb2YodW5pb24gYWNwaV9vYmplY3QpKTsKKwlpbmZvLmZyZWVfc3BhY2UgPQorCSAgICBidWZmZXIgKyBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCkpOwogCWluZm8ub2JqZWN0X3NwYWNlID0gMDsKIAlpbmZvLm51bV9wYWNrYWdlcyA9IDE7CiAKLQlleHRlcm5hbF9vYmplY3QtPnR5cGUgICAgICAgICAgICA9IEFDUElfR0VUX09CSkVDVF9UWVBFIChpbnRlcm5hbF9vYmplY3QpOwotCWV4dGVybmFsX29iamVjdC0+cGFja2FnZS5jb3VudCAgID0gaW50ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmNvdW50OwotCWV4dGVybmFsX29iamVjdC0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb2JqZWN0LAotCQkJICBpbmZvLmZyZWVfc3BhY2UpOworCWV4dGVybmFsX29iamVjdC0+dHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFKGludGVybmFsX29iamVjdCk7CisJZXh0ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmNvdW50ID0gaW50ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmNvdW50OworCWV4dGVybmFsX29iamVjdC0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vYmplY3QsCisJCQkJCQkJICBpbmZvLmZyZWVfc3BhY2UpOwogCiAJLyoKIAkgKiBMZWF2ZSByb29tIGZvciBhbiBhcnJheSBvZiBBQ1BJX09CSkVDVFMgaW4gdGhlIGJ1ZmZlcgogCSAqIGFuZCBtb3ZlIHRoZSBmcmVlIHNwYWNlIHBhc3QgaXQKIAkgKi8KLQlpbmZvLmxlbmd0aCAgICArPSAoYWNwaV9zaXplKSBleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgKgotCQkJIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKTsKKwlpbmZvLmxlbmd0aCArPSAoYWNwaV9zaXplKSBleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgKgorCSAgICBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCkpOwogCWluZm8uZnJlZV9zcGFjZSArPSBleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgKgotCQkJIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKTsKKwkgICAgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChzaXplb2YodW5pb24gYWNwaV9vYmplY3QpKTsKIAotCXN0YXR1cyA9IGFjcGlfdXRfd2Fsa19wYWNrYWdlX3RyZWUgKGludGVybmFsX29iamVjdCwgZXh0ZXJuYWxfb2JqZWN0LAotCQkJIGFjcGlfdXRfY29weV9pZWxlbWVudF90b19lZWxlbWVudCwgJmluZm8pOworCXN0YXR1cyA9IGFjcGlfdXRfd2Fsa19wYWNrYWdlX3RyZWUoaW50ZXJuYWxfb2JqZWN0LCBleHRlcm5hbF9vYmplY3QsCisJCQkJCSAgIGFjcGlfdXRfY29weV9pZWxlbWVudF90b19lZWxlbWVudCwKKwkJCQkJICAgJmluZm8pOwogCiAJKnNwYWNlX3VzZWQgPSBpbmZvLmxlbmd0aDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2lvYmplY3RfdG9fZW9iamVjdApAQCAtNDAwLDQ0ICszNzgsNDUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcikKK2FjcGlfdXRfY29weV9pb2JqZWN0X3RvX2VvYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAorCQkJCXN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jb3B5X2lvYmplY3RfdG9fZW9iamVjdCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0Iik7Ci0KLQotCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoaW50ZXJuYWxfb2JqZWN0KSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgeworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbnRlcm5hbF9vYmplY3QpID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CiAJCS8qCiAJCSAqIFBhY2thZ2Ugb2JqZWN0OiAgQ29weSBhbGwgc3Vib2JqZWN0cyAoaW5jbHVkaW5nCiAJCSAqIG5lc3RlZCBwYWNrYWdlcykKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pcGFja2FnZV90b19lcGFja2FnZSAoaW50ZXJuYWxfb2JqZWN0LAotCQkJCSAgcmV0X2J1ZmZlci0+cG9pbnRlciwgJnJldF9idWZmZXItPmxlbmd0aCk7Ci0JfQotCWVsc2UgeworCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UoaW50ZXJuYWxfb2JqZWN0LAorCQkJCQkJCSAgIHJldF9idWZmZXItPnBvaW50ZXIsCisJCQkJCQkJICAgJnJldF9idWZmZXItPmxlbmd0aCk7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogQnVpbGQgYSBzaW1wbGUgb2JqZWN0IChubyBuZXN0ZWQgb2JqZWN0cykKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUgKGludGVybmFsX29iamVjdCwKLQkJCQkgKHVuaW9uIGFjcGlfb2JqZWN0ICopIHJldF9idWZmZXItPnBvaW50ZXIsCi0JCQkJICgodTggKikgcmV0X2J1ZmZlci0+cG9pbnRlciArCi0JCQkJIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKSksCi0JCQkJICZyZXRfYnVmZmVyLT5sZW5ndGgpOworCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlKGludGVybmFsX29iamVjdCwKKwkJCQkJCQkgKHVuaW9uIGFjcGlfb2JqZWN0ICopCisJCQkJCQkJIHJldF9idWZmZXItPnBvaW50ZXIsCisJCQkJCQkJICgodTggKikgcmV0X2J1ZmZlci0+CisJCQkJCQkJICBwb2ludGVyICsKKwkJCQkJCQkgIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQKKwkJCQkJCQkgIChzaXplb2YKKwkJCQkJCQkgICAodW5pb24KKwkJCQkJCQkgICAgYWNwaV9vYmplY3QpKSksCisJCQkJCQkJICZyZXRfYnVmZmVyLT5sZW5ndGgpOwogCQkvKgogCQkgKiBidWlsZCBzaW1wbGUgZG9lcyBub3QgaW5jbHVkZSB0aGUgb2JqZWN0IHNpemUgaW4gdGhlIGxlbmd0aAogCQkgKiBzbyB3ZSBhZGQgaXQgaW4gaGVyZQogCQkgKi8KLQkJcmV0X2J1ZmZlci0+bGVuZ3RoICs9IHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpOworCQlyZXRfYnVmZmVyLT5sZW5ndGggKz0gc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZQpAQCAtNDU1LDE1ICs0MzQsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZSAoCi0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXRfaW50ZXJuYWxfb2JqZWN0KQorYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZSh1bmlvbiBhY3BpX29iamVjdCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXRfaW50ZXJuYWxfb2JqZWN0KQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmludGVybmFsX29iamVjdDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3Q7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUiKTsKIAogCS8qCiAJICogU2ltcGxlIHR5cGVzIHN1cHBvcnRlZCBhcmU6IFN0cmluZywgQnVmZmVyLCBJbnRlZ2VyCkBAIC00NzMsNTggKzQ0OSw1NyBAQAogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCi0JCWludGVybmFsX29iamVjdCA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoCi0JCQkJICAgKHU4KSBleHRlcm5hbF9vYmplY3QtPnR5cGUpOworCQlpbnRlcm5hbF9vYmplY3QgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoKHU4KQorCQkJCQkJCQkgZXh0ZXJuYWxfb2JqZWN0LT4KKwkJCQkJCQkJIHR5cGUpOwogCQlpZiAoIWludGVybmFsX29iamVjdCkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQkvKiBBbGwgb3RoZXIgdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1NVUFBPUlQpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7CiAJfQogCi0KIAkvKiBNdXN0IENPUFkgc3RyaW5nIGFuZCBidWZmZXIgY29udGVudHMgKi8KIAogCXN3aXRjaCAoZXh0ZXJuYWxfb2JqZWN0LT50eXBlKSB7CiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCWludGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIgPQotCQkJQUNQSV9NRU1fQ0FMTE9DQVRFICgoYWNwaV9zaXplKSBleHRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJICAgIEFDUElfTUVNX0NBTExPQ0FURSgoYWNwaV9zaXplKSBleHRlcm5hbF9vYmplY3QtPnN0cmluZy4KKwkJCQkgICAgICAgbGVuZ3RoICsgMSk7CiAJCWlmICghaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlcikgewogCQkJZ290byBlcnJvcl9leGl0OwogCQl9CiAKLQkJQUNQSV9NRU1DUFkgKGludGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJICBleHRlcm5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyLAotCQkJCSAgZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoKTsKKwkJQUNQSV9NRU1DUFkoaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciwKKwkJCSAgICBleHRlcm5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyLAorCQkJICAgIGV4dGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCk7CiAKIAkJaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoID0gZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCiAJCWludGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIgPQotCQkJQUNQSV9NRU1fQ0FMTE9DQVRFIChleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5sZW5ndGgpOworCQkgICAgQUNQSV9NRU1fQ0FMTE9DQVRFKGV4dGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aCk7CiAJCWlmICghaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIucG9pbnRlcikgewogCQkJZ290byBlcnJvcl9leGl0OwogCQl9CiAKLQkJQUNQSV9NRU1DUFkgKGludGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJICBleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyLAotCQkJCSAgZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoKTsKKwkJQUNQSV9NRU1DUFkoaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIucG9pbnRlciwKKwkJCSAgICBleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyLAorCQkJICAgIGV4dGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aCk7CiAKIAkJaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoID0gZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAotCQlpbnRlcm5hbF9vYmplY3QtPmludGVnZXIudmFsdWUgID0gZXh0ZXJuYWxfb2JqZWN0LT5pbnRlZ2VyLnZhbHVlOworCQlpbnRlcm5hbF9vYmplY3QtPmludGVnZXIudmFsdWUgPSBleHRlcm5hbF9vYmplY3QtPmludGVnZXIudmFsdWU7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTUzMywxNSArNTA4LDEzIEBACiAJfQogCiAJKnJldF9pbnRlcm5hbF9vYmplY3QgPSBpbnRlcm5hbF9vYmplY3Q7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAotCi1lcnJvcl9leGl0OgotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoaW50ZXJuYWxfb2JqZWN0KTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisgICAgICBlcnJvcl9leGl0OgorCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShpbnRlcm5hbF9vYmplY3QpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogfQogCi0KICNpZmRlZiBBQ1BJX0ZVVFVSRV9JTVBMRU1FTlRBVElPTgogLyogQ29kZSB0byBjb252ZXJ0IHBhY2thZ2VzIHRoYXQgYXJlIHBhcmFtZXRlcnMgdG8gY29udHJvbCBtZXRob2RzICovCiAKQEAgLTU2NSwyMiArNTM4LDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9lcGFja2FnZV90b19pcGFja2FnZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaW50ZXJuYWxfb2JqZWN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcGFjZV91c2VkKQorYWNwaV91dF9jb3B5X2VwYWNrYWdlX3RvX2lwYWNrYWdlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmludGVybmFsX29iamVjdCwKKwkJCQkgIHU4ICogYnVmZmVyLCB1MzIgKiBzcGFjZV91c2VkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZyZWVfc3BhY2U7Ci0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfaW5kZXg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc3BhY2UgPSAwOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRoaXNfaW50ZXJuYWxfb2JqOwotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKnRoaXNfZXh0ZXJuYWxfb2JqOworCXU4ICpmcmVlX3NwYWNlOworCXVuaW9uIGFjcGlfb2JqZWN0ICpleHRlcm5hbF9vYmplY3Q7CisJdTMyIGxlbmd0aCA9IDA7CisJdTMyIHRoaXNfaW5kZXg7CisJdTMyIG9iamVjdF9zcGFjZSA9IDA7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGhpc19pbnRlcm5hbF9vYmo7CisJdW5pb24gYWNwaV9vYmplY3QgKnRoaXNfZXh0ZXJuYWxfb2JqOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfY29weV9lcGFja2FnZV90b19pcGFja2FnZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfY29weV9lcGFja2FnZV90b19pcGFja2FnZSIpOwogCiAJLyoKIAkgKiBGaXJzdCBwYWNrYWdlIGF0IGhlYWQgb2YgdGhlIGJ1ZmZlcgpAQCAtNTkyLDI0ICs1NjEsMjIgQEAKIAkgKi8KIAlmcmVlX3NwYWNlID0gYnVmZmVyICsgc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KTsKIAotCi0JZXh0ZXJuYWxfb2JqZWN0LT50eXBlICAgICAgICAgICAgICA9IEFDUElfR0VUX09CSkVDVF9UWVBFIChpbnRlcm5hbF9vYmplY3QpOwotCWV4dGVybmFsX29iamVjdC0+cGFja2FnZS5jb3VudCAgICAgPSBpbnRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQ7Ci0JZXh0ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzICA9ICh1bmlvbiBhY3BpX29iamVjdCAqKWZyZWVfc3BhY2U7CisJZXh0ZXJuYWxfb2JqZWN0LT50eXBlID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KTsKKwlleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgPSBpbnRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQ7CisJZXh0ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopZnJlZV9zcGFjZTsKIAogCS8qCiAJICogQnVpbGQgYW4gYXJyYXkgb2YgQUNQSV9PQkpFQ1RTIGluIHRoZSBidWZmZXIKIAkgKiBhbmQgbW92ZSB0aGUgZnJlZSBzcGFjZSBwYXN0IGl0CiAJICovCi0JZnJlZV9zcGFjZSArPSBleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgKiBzaXplb2YodW5pb24gYWNwaV9vYmplY3QpOwotCisJZnJlZV9zcGFjZSArPQorCSAgICBleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgKiBzaXplb2YodW5pb24gYWNwaV9vYmplY3QpOwogCiAJLyogQ2FsbCB3YWxrX3BhY2thZ2UgKi8KIAogfQogCi0jZW5kaWYgLyogRnV0dXJlIGltcGxlbWVudGF0aW9uICovCi0KKyNlbmRpZgkJCQkvKiBGdXR1cmUgaW1wbGVtZW50YXRpb24gKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MjUsMzcgKzU5MiwzNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QgKAotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKmV4dGVybmFsX29iamVjdCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqaW50ZXJuYWxfb2JqZWN0KQorYWNwaV91dF9jb3B5X2VvYmplY3RfdG9faW9iamVjdCh1bmlvbiBhY3BpX29iamVjdCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKippbnRlcm5hbF9vYmplY3QpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2NvcHlfZW9iamVjdF90b19pb2JqZWN0Iik7CiAKIAlpZiAoZXh0ZXJuYWxfb2JqZWN0LT50eXBlID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CiAJCS8qCiAJCSAqIFBhY2thZ2VzIGFzIGV4dGVybmFsIGlucHV0IHRvIGNvbnRyb2wgbWV0aG9kcyBhcmUgbm90IHN1cHBvcnRlZCwKIAkJICovCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlBhY2thZ2VzIGFzIHBhcmFtZXRlcnMgbm90IGltcGxlbWVudGVkIVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlBhY2thZ2VzIGFzIHBhcmFtZXRlcnMgbm90IGltcGxlbWVudGVkIVxuIikpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0lNUExFTUVOVEVEKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9JTVBMRU1FTlRFRCk7CiAJfQogCiAJZWxzZSB7CiAJCS8qCiAJCSAqIEJ1aWxkIGEgc2ltcGxlIG9iamVjdCAobm8gbmVzdGVkIG9iamVjdHMpCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfZXNpbXBsZV90b19pc2ltcGxlIChleHRlcm5hbF9vYmplY3QsIGludGVybmFsX29iamVjdCk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2NvcHlfZXNpbXBsZV90b19pc2ltcGxlKGV4dGVybmFsX29iamVjdCwKKwkJCQkJCSAgICBpbnRlcm5hbF9vYmplY3QpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdApAQCAtNjcxLDgzICs2MzYsNzUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X3NpbXBsZV9vYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3RfZGVzYykKK2FjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9kZXNjKQogewotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlX2NvdW50OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm5leHRfb2JqZWN0OwotCisJdTE2IHJlZmVyZW5jZV9jb3VudDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0X29iamVjdDsKIAogCS8qIFNhdmUgZmllbGRzIGZyb20gZGVzdGluYXRpb24gdGhhdCB3ZSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSAqLwogCiAJcmVmZXJlbmNlX2NvdW50ID0gZGVzdF9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50OwogCW5leHRfb2JqZWN0ID0gZGVzdF9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7CiAKLQkvKiBDb3B5IHRoZSBlbnRpcmUgc291cmNlIG9iamVjdCBvdmVyIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QqLworCS8qIENvcHkgdGhlIGVudGlyZSBzb3VyY2Ugb2JqZWN0IG92ZXIgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCAqLwogCi0JQUNQSV9NRU1DUFkgKChjaGFyICopIGRlc3RfZGVzYywgKGNoYXIgKikgc291cmNlX2Rlc2MsCi0JCQkgIHNpemVvZiAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCkpOworCUFDUElfTUVNQ1BZKChjaGFyICopZGVzdF9kZXNjLCAoY2hhciAqKXNvdXJjZV9kZXNjLAorCQkgICAgc2l6ZW9mKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpKTsKIAogCS8qIFJlc3RvcmUgdGhlIHNhdmVkIGZpZWxkcyAqLwogCiAJZGVzdF9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gcmVmZXJlbmNlX2NvdW50OwogCWRlc3RfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0ID0gbmV4dF9vYmplY3Q7CiAKKwkvKiBOZXcgb2JqZWN0IGlzIG5vdCBzdGF0aWMsIHJlZ2FyZGxlc3Mgb2Ygc291cmNlICovCisKKwlkZXN0X2Rlc2MtPmNvbW1vbi5mbGFncyAmPSB+QU9QT0JKX1NUQVRJQ19QT0lOVEVSOworCiAJLyogSGFuZGxlIHRoZSBvYmplY3RzIHdpdGggZXh0cmEgZGF0YSAqLwogCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoZGVzdF9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoZGVzdF9kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQlkZXN0X2Rlc2MtPmJ1ZmZlci5ub2RlID0gTlVMTDsKLQkJZGVzdF9kZXNjLT5jb21tb24uZmxhZ3MgPSBzb3VyY2VfZGVzYy0+Y29tbW9uLmZsYWdzOwotCiAJCS8qCiAJCSAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBhY3R1YWwgYnVmZmVyIGlmIGFuZCBvbmx5IGlmOgogCQkgKiAxKSBUaGVyZSBpcyBhIHZhbGlkIGJ1ZmZlciBwb2ludGVyCi0JCSAqIDIpIFRoZSBidWZmZXIgaXMgbm90IHN0YXRpYyAobm90IGluIGFuIEFDUEkgdGFibGUpIChpbiB0aGlzIGNhc2UsCi0JCSAqICAgIHRoZSBhY3R1YWwgcG9pbnRlciB3YXMgYWxyZWFkeSBjb3BpZWQgYWJvdmUpCisJCSAqIDIpIFRoZSBidWZmZXIgaGFzIGEgbGVuZ3RoID4gMAogCQkgKi8KIAkJaWYgKChzb3VyY2VfZGVzYy0+YnVmZmVyLnBvaW50ZXIpICYmCi0JCQkoIShzb3VyY2VfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkpIHsKLQkJCWRlc3RfZGVzYy0+YnVmZmVyLnBvaW50ZXIgPSBOVUxMOwotCi0JCQkvKiBDcmVhdGUgYW4gYWN0dWFsIGJ1ZmZlciBvbmx5IGlmIGxlbmd0aCA+IDAgKi8KLQotCQkJaWYgKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKSB7Ci0JCQkJZGVzdF9kZXNjLT5idWZmZXIucG9pbnRlciA9Ci0JCQkJCUFDUElfTUVNX0FMTE9DQVRFIChzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCk7Ci0JCQkJaWYgKCFkZXN0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSB7Ci0JCQkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKLQkJCQl9Ci0KLQkJCQkvKiBDb3B5IHRoZSBhY3R1YWwgYnVmZmVyIGRhdGEgKi8KLQotCQkJCUFDUElfTUVNQ1BZIChkZXN0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAotCQkJCQkJc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAotCQkJCQkJc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQkgICAgKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKSkgeworCQkJZGVzdF9kZXNjLT5idWZmZXIucG9pbnRlciA9CisJCQkgICAgQUNQSV9NRU1fQUxMT0NBVEUoc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQkJaWYgKCFkZXN0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSB7CisJCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCQkJfQorCisJCQkvKiBDb3B5IHRoZSBhY3R1YWwgYnVmZmVyIGRhdGEgKi8KKworCQkJQUNQSV9NRU1DUFkoZGVzdF9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkgICAgc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAorCQkJCSAgICBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KIAkJLyoKIAkJICogQWxsb2NhdGUgYW5kIGNvcHkgdGhlIGFjdHVhbCBzdHJpbmcgaWYgYW5kIG9ubHkgaWY6CiAJCSAqIDEpIFRoZXJlIGlzIGEgdmFsaWQgc3RyaW5nIHBvaW50ZXIKLQkJICogMikgVGhlIHN0cmluZyBpcyBub3Qgc3RhdGljIChub3QgaW4gYW4gQUNQSSB0YWJsZSkgKGluIHRoaXMgY2FzZSwKLQkJICogICAgdGhlIGFjdHVhbCBwb2ludGVyIHdhcyBhbHJlYWR5IGNvcGllZCBhYm92ZSkKKwkJICogKFBvaW50ZXIgdG8gYSBOVUxMIHN0cmluZyBpcyBhbGxvd2VkKQogCQkgKi8KLQkJaWYgKChzb3VyY2VfZGVzYy0+c3RyaW5nLnBvaW50ZXIpICYmCi0JCQkoIShzb3VyY2VfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkpIHsKKwkJaWYgKHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcikgewogCQkJZGVzdF9kZXNjLT5zdHJpbmcucG9pbnRlciA9Ci0JCQkJQUNQSV9NRU1fQUxMT0NBVEUgKChhY3BpX3NpemUpIHNvdXJjZV9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCQkgICAgQUNQSV9NRU1fQUxMT0NBVEUoKGFjcGlfc2l6ZSkgc291cmNlX2Rlc2MtPnN0cmluZy4KKwkJCQkJICAgICAgbGVuZ3RoICsgMSk7CiAJCQlpZiAoIWRlc3RfZGVzYy0+c3RyaW5nLnBvaW50ZXIpIHsKIAkJCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CiAJCQl9CiAKLQkJCUFDUElfTUVNQ1BZIChkZXN0X2Rlc2MtPnN0cmluZy5wb2ludGVyLCBzb3VyY2VfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJCSAgKGFjcGlfc2l6ZSkgc291cmNlX2Rlc2MtPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJCS8qIENvcHkgdGhlIGFjdHVhbCBzdHJpbmcgZGF0YSAqLworCisJCQlBQ1BJX01FTUNQWShkZXN0X2Rlc2MtPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICBzb3VyY2VfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCisJCQkJICAgIChhY3BpX3NpemUpIHNvdXJjZV9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTc1Niw3ICs3MTMsNyBAQAogCQkgKiBXZSBjb3BpZWQgdGhlIHJlZmVyZW5jZSBvYmplY3QsIHNvIHdlIG5vdyBtdXN0IGFkZCBhIHJlZmVyZW5jZQogCQkgKiB0byB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIHJlZmVyZW5jZQogCQkgKi8KLQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTc2Nyw3ICs3MjQsNiBAQAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9pZWxlbWVudF90b19pZWxlbWVudApAQCAtNzgxLDI0ICs3MzcsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2llbGVtZW50ICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCkKK2FjcGlfdXRfY29weV9pZWxlbWVudF90b19pZWxlbWVudCh1OCBvYmplY3RfdHlwZSwKKwkJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3QsCisJCQkJICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlLAorCQkJCSAgdm9pZCAqY29udGV4dCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19pbmRleDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqdGhpc190YXJnZXRfcHRyOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRhcmdldF9vYmplY3Q7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIHRoaXNfaW5kZXg7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnRoaXNfdGFyZ2V0X3B0cjsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXRfb2JqZWN0OwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JdGhpc19pbmRleCAgICA9IHN0YXRlLT5wa2cuaW5kZXg7CisJdGhpc19pbmRleCA9IHN0YXRlLT5wa2cuaW5kZXg7CiAJdGhpc190YXJnZXRfcHRyID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiopCi0JCQkgICAmc3RhdGUtPnBrZy5kZXN0X29iamVjdC0+cGFja2FnZS5lbGVtZW50c1t0aGlzX2luZGV4XTsKKwkgICAgJnN0YXRlLT5wa2cuZGVzdF9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbdGhpc19pbmRleF07CiAKIAlzd2l0Y2ggKG9iamVjdF90eXBlKSB7CiAJY2FzZSBBQ1BJX0NPUFlfVFlQRV9TSU1QTEU6CkBAIC04MDksMzQgKzc2MiwzNiBAQAogCQkJLyoKIAkJCSAqIFRoaXMgaXMgYSBzaW1wbGUgb2JqZWN0LCBqdXN0IGNvcHkgaXQKIAkJCSAqLwotCQkJdGFyZ2V0X29iamVjdCA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoCi0JCQkJCSAgIEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2Vfb2JqZWN0KSk7CisJCQl0YXJnZXRfb2JqZWN0ID0KKwkJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9HRVRfT0JKRUNUX1RZUEUKKwkJCQkJCQkgICAoc291cmNlX29iamVjdCkpOwogCQkJaWYgKCF0YXJnZXRfb2JqZWN0KSB7CiAJCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCQkJfQogCi0JCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdCAoc291cmNlX29iamVjdCwgdGFyZ2V0X29iamVjdCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0KHNvdXJjZV9vYmplY3QsCisJCQkJCQkgICAgICAgdGFyZ2V0X29iamVjdCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlnb3RvIGVycm9yX2V4aXQ7CiAJCQl9CiAKIAkJCSp0aGlzX3RhcmdldF9wdHIgPSB0YXJnZXRfb2JqZWN0OwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyogUGFzcyB0aHJvdWdoIGEgbnVsbCBlbGVtZW50ICovCiAKIAkJCSp0aGlzX3RhcmdldF9wdHIgPSBOVUxMOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfQ09QWV9UWVBFX1BBQ0tBR0U6CiAKIAkJLyoKIAkJICogVGhpcyBvYmplY3QgaXMgYSBwYWNrYWdlIC0gZ28gZG93biBhbm90aGVyIG5lc3RpbmcgbGV2ZWwKIAkJICogQ3JlYXRlIGFuZCBidWlsZCB0aGUgcGFja2FnZSBvYmplY3QKIAkJICovCi0JCXRhcmdldF9vYmplY3QgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9QQUNLQUdFKTsKKwkJdGFyZ2V0X29iamVjdCA9CisJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX1BBQ0tBR0UpOwogCQlpZiAoIXRhcmdldF9vYmplY3QpIHsKIAkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAkJfQpAQCAtODQ4LDggKzgwMyw4IEBACiAJCSAqIENyZWF0ZSB0aGUgb2JqZWN0IGFycmF5CiAJCSAqLwogCQl0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzID0KLQkJCUFDUElfTUVNX0NBTExPQ0FURSAoKChhY3BpX3NpemUpIHNvdXJjZV9vYmplY3QtPnBhY2thZ2UuY291bnQgKyAxKSAqCi0JCQkJCSBzaXplb2YgKHZvaWQgKikpOworCQkgICAgQUNQSV9NRU1fQ0FMTE9DQVRFKCgoYWNwaV9zaXplKSBzb3VyY2Vfb2JqZWN0LT5wYWNrYWdlLgorCQkJCQljb3VudCArIDEpICogc2l6ZW9mKHZvaWQgKikpOwogCQlpZiAoIXRhcmdldF9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHMpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gZXJyb3JfZXhpdDsKQEAgLTg2NiwxOSArODIxLDE3IEBACiAJCSp0aGlzX3RhcmdldF9wdHIgPSB0YXJnZXRfb2JqZWN0OwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CiAKLWVycm9yX2V4aXQ6Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlICh0YXJnZXRfb2JqZWN0KTsKKyAgICAgIGVycm9yX2V4aXQ6CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHRhcmdldF9vYmplY3QpOwogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UKQEAgLTg5NCw0OSArODQ3LDQ2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pcGFja2FnZV90b19pcGFja2FnZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iaiwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X29iaiwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2lwYWNrYWdlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmosCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X29iaiwKKwkJCQkgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9jb3B5X2lwYWNrYWdlX3RvX2lwYWNrYWdlIik7Ci0KLQotCWRlc3Rfb2JqLT5jb21tb24udHlwZSAgID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9vYmopOwotCWRlc3Rfb2JqLT5jb21tb24uZmxhZ3MgID0gc291cmNlX29iai0+Y29tbW9uLmZsYWdzOworCWRlc3Rfb2JqLT5jb21tb24udHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9vYmopOworCWRlc3Rfb2JqLT5jb21tb24uZmxhZ3MgPSBzb3VyY2Vfb2JqLT5jb21tb24uZmxhZ3M7CiAJZGVzdF9vYmotPnBhY2thZ2UuY291bnQgPSBzb3VyY2Vfb2JqLT5wYWNrYWdlLmNvdW50OwogCiAJLyoKIAkgKiBDcmVhdGUgdGhlIG9iamVjdCBhcnJheSBhbmQgd2FsayB0aGUgc291cmNlIHBhY2thZ2UgdHJlZQogCSAqLwotCWRlc3Rfb2JqLT5wYWNrYWdlLmVsZW1lbnRzID0gQUNQSV9NRU1fQ0FMTE9DQVRFICgKLQkJCSAgICgoYWNwaV9zaXplKSBzb3VyY2Vfb2JqLT5wYWNrYWdlLmNvdW50ICsgMSkgKgotCQkJICAgc2l6ZW9mICh2b2lkICopKTsKKwlkZXN0X29iai0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfTUVNX0NBTExPQ0FURSgoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgc291cmNlX29iai0+cGFja2FnZS4KKwkJCQkJCQkgY291bnQgKworCQkJCQkJCSAxKSAqIHNpemVvZih2b2lkICopKTsKIAlpZiAoIWRlc3Rfb2JqLT5wYWNrYWdlLmVsZW1lbnRzKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgKLQkJCSgiYW1sX2J1aWxkX2NvcHlfaW50ZXJuYWxfcGFja2FnZV9vYmplY3Q6IFBhY2thZ2UgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhbWxfYnVpbGRfY29weV9pbnRlcm5hbF9wYWNrYWdlX29iamVjdDogUGFja2FnZSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyoKIAkgKiBDb3B5IHRoZSBwYWNrYWdlIGVsZW1lbnQtYnktZWxlbWVudCBieSB3YWxraW5nIHRoZSBwYWNrYWdlICJ0cmVlIi4KIAkgKiBUaGlzIGhhbmRsZXMgbmVzdGVkIHBhY2thZ2VzIG9mIGFyYml0cmFyeSBkZXB0aC4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlIChzb3VyY2Vfb2JqLCBkZXN0X29iaiwKLQkJCSBhY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQsIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlKHNvdXJjZV9vYmosIGRlc3Rfb2JqLAorCQkJCQkgICBhY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQsCisJCQkJCSAgIHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkvKiBPbiBmYWlsdXJlLCBkZWxldGUgdGhlIGRlc3RpbmF0aW9uIHBhY2thZ2Ugb2JqZWN0ICovCiAKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChkZXN0X29iaik7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShkZXN0X29iaik7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QKQEAgLTk1MiwzNSArOTAyLDMxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRlc3RfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZGVzdF9kZXNjLAorCQkJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCIpOwogCiAJLyogQ3JlYXRlIHRoZSB0b3AgbGV2ZWwgb2JqZWN0ICovCiAKLQkqZGVzdF9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpKTsKKwkqZGVzdF9kZXNjID0KKwkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSk7CiAJaWYgKCEqZGVzdF9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogQ29weSB0aGUgb2JqZWN0IGFuZCBwb3NzaWJsZSBzdWJvYmplY3RzICovCiAKLQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UgKHNvdXJjZV9kZXNjLCAqZGVzdF9kZXNjLAotCQkJCSAgd2Fsa19zdGF0ZSk7Ci0JfQotCWVsc2UgewotCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdCAoc291cmNlX2Rlc2MsICpkZXN0X2Rlc2MpOworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfY29weV9pcGFja2FnZV90b19pcGFja2FnZShzb3VyY2VfZGVzYywgKmRlc3RfZGVzYywKKwkJCQkJCSAgICAgIHdhbGtfc3RhdGUpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0KHNvdXJjZV9kZXNjLCAqZGVzdF9kZXNjKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYwppbmRleCA3OTRjN2RmLi5kODBlOTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYwpAQCAtNDYsMTUgKzQ2LDE2IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRkZWJ1ZyIpCi0KK0FDUElfTU9EVUxFX05BTUUoInV0ZGVidWciKQogCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKK3N0YXRpYyB1MzIgYWNwaV9nYmxfcHJldl90aHJlYWRfaWQgPSAweEZGRkZGRkZGOworc3RhdGljIGNoYXIgKmFjcGlfZ2JsX2ZuX2VudHJ5X3N0ciA9ICItLS0tRW50cnkiOworc3RhdGljIGNoYXIgKmFjcGlfZ2JsX2ZuX2V4aXRfc3RyID0gIi0tLS1FeGl0LSI7CiAKLXN0YXRpYyB1MzIgICBhY3BpX2dibF9wcmV2X3RocmVhZF9pZCA9IDB4RkZGRkZGRkY7Ci1zdGF0aWMgY2hhciAgICAgKmFjcGlfZ2JsX2ZuX2VudHJ5X3N0ciA9ICItLS0tRW50cnkiOwotc3RhdGljIGNoYXIgICAgICphY3BpX2dibF9mbl9leGl0X3N0ciA9ICItLS0tRXhpdC0iOworLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCitzdGF0aWMgY29uc3QgY2hhciAqYWNwaV91dF90cmltX2Z1bmN0aW9uX25hbWUoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjgsMTcgKzY5LDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV91dF9pbml0X3N0YWNrX3B0cl90cmFjZSAoCi0Jdm9pZCkKK3ZvaWQgYWNwaV91dF9pbml0X3N0YWNrX3B0cl90cmFjZSh2b2lkKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NwOworCXUzMiBjdXJyZW50X3NwOwogCi0KLQlhY3BpX2dibF9lbnRyeV9zdGFja19wb2ludGVyID0gQUNQSV9QVFJfRElGRiAoJmN1cnJlbnRfc3AsIE5VTEwpOworCWFjcGlfZ2JsX2VudHJ5X3N0YWNrX3BvaW50ZXIgPSBBQ1BJX1BUUl9ESUZGKCZjdXJyZW50X3NwLCBOVUxMKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYWNrX3N0YWNrX3B0cgpAQCAtOTEsMTQgKzg4LDExIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV91dF90cmFja19zdGFja19wdHIgKAotCXZvaWQpCit2b2lkIGFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKHZvaWQpCiB7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfc3A7CisJYWNwaV9zaXplIGN1cnJlbnRfc3A7CiAKLQotCWN1cnJlbnRfc3AgPSBBQ1BJX1BUUl9ESUZGICgmY3VycmVudF9zcCwgTlVMTCk7CisJY3VycmVudF9zcCA9IEFDUElfUFRSX0RJRkYoJmN1cnJlbnRfc3AsIE5VTEwpOwogCiAJaWYgKGN1cnJlbnRfc3AgPCBhY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlcikgewogCQlhY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlciA9IGN1cnJlbnRfc3A7CkBAIC0xMDksNiArMTAzLDM5IEBACiAJfQogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyaW1fZnVuY3Rpb25fbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6ICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQXNjaWkgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcm9jZWR1cmUgbmFtZQorICoKKyAqIFJFVFVSTjogICAgICBVcGRhdGVkIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIG5hbWUKKyAqCisgKiBERVNDUklQVElPTjogUmVtb3ZlIHRoZSAiQWNwaSIgcHJlZml4IGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUsIGlmIHByZXNlbnQuCisgKiAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgY29tcGlsZXIgbWFjcm9zIHN1Y2ggYXMgX19GVU5DVElPTl9fIHRvIGJlIHVzZWQKKyAqICAgICAgICAgICAgICB3aXRoIG5vIGNoYW5nZSB0byB0aGUgZGVidWcgb3V0cHV0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjb25zdCBjaGFyICphY3BpX3V0X3RyaW1fZnVuY3Rpb25fbmFtZShjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lKQoreworCisJLyogQWxsIEZ1bmN0aW9uIG5hbWVzIGFyZSBsb25nZXIgdGhhbiA0IGNoYXJzLCBjaGVjayBpcyBzYWZlICovCisKKwlpZiAoKihBQ1BJX0NBU1RfUFRSKHUzMiwgZnVuY3Rpb25fbmFtZSkpID09IEFDUElfUFJFRklYX01JWEVEKSB7CisJCS8qIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIG9yaWdpbmFsIHNvdXJjZSBoYXMgbm90IGJlZW4gbW9kaWZpZWQgKi8KKworCQlyZXR1cm4gKGZ1bmN0aW9uX25hbWUgKyA0KTsKKwl9CisKKwlpZiAoKihBQ1BJX0NBU1RfUFRSKHUzMiwgZnVuY3Rpb25fbmFtZSkpID09IEFDUElfUFJFRklYX0xPV0VSKSB7CisJCS8qIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIHNvdXJjZSBoYXMgYmVlbiAnbGludXhpemVkJyAqLworCisJCXJldHVybiAoZnVuY3Rpb25fbmFtZSArIDUpOworCX0KKworCXJldHVybiAoZnVuY3Rpb25fbmFtZSk7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTE2LDEwICsxNDMsOSBAQAogICoKICAqIFBBUkFNRVRFUlM6ICByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwgLSBSZXF1ZXN0ZWQgZGVidWcgcHJpbnQgbGV2ZWwKICAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIgKGZvciBlcnJvciBvdXRwdXQpCi0gKiAgICAgICAgICAgICAgZGJnX2luZm8gICAgICAgICAgICAtIENvbnRhaW5zOgotICogICAgICAgICAgICAgICAgICBwcm9jX25hbWUgICAgICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKKyAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKKyAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECiAgKiAgICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAtIFByaW50ZiBmb3JtYXQgZmllbGQKICAqICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgIC0gT3B0aW9uYWwgcHJpbnRmIGFyZ3VtZW50cwogICoKQEAgLTEzMCwzNiArMTU2LDMzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKLWFjcGlfdXRfZGVidWdfcHJpbnQgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2RlYnVnX2xldmVsLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8sCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZm9ybWF0LAotCS4uLikKK3ZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKK2FjcGlfdXRfZGVidWdfcHJpbnQodTMyIHJlcXVlc3RlZF9kZWJ1Z19sZXZlbCwKKwkJICAgIHUzMiBsaW5lX251bWJlciwKKwkJICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgICBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfaWQ7Ci0JdmFfbGlzdCAgICAgICAgICAgICAgICAgYXJnczsKLQorCXUzMiB0aHJlYWRfaWQ7CisJdmFfbGlzdCBhcmdzOwogCiAJLyoKIAkgKiBTdGF5IHNpbGVudCBpZiB0aGUgZGVidWcgbGV2ZWwgb3IgY29tcG9uZW50IElEIGlzIGRpc2FibGVkCiAJICovCiAJaWYgKCEocmVxdWVzdGVkX2RlYnVnX2xldmVsICYgYWNwaV9kYmdfbGV2ZWwpIHx8Ci0JCSEoZGJnX2luZm8tPmNvbXBvbmVudF9pZCAmIGFjcGlfZGJnX2xheWVyKSkgeworCSAgICAhKGNvbXBvbmVudF9pZCAmIGFjcGlfZGJnX2xheWVyKSkgewogCQlyZXR1cm47CiAJfQogCiAJLyoKIAkgKiBUaHJlYWQgdHJhY2tpbmcgYW5kIGNvbnRleHQgc3dpdGNoIG5vdGlmaWNhdGlvbgogCSAqLwotCXRocmVhZF9pZCA9IGFjcGlfb3NfZ2V0X3RocmVhZF9pZCAoKTsKKwl0aHJlYWRfaWQgPSBhY3BpX29zX2dldF90aHJlYWRfaWQoKTsKIAogCWlmICh0aHJlYWRfaWQgIT0gYWNwaV9nYmxfcHJldl90aHJlYWRfaWQpIHsKIAkJaWYgKEFDUElfTFZfVEhSRUFEUyAmIGFjcGlfZGJnX2xldmVsKSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoCi0JCQkJIlxuKioqKiBDb250ZXh0IFN3aXRjaCBmcm9tIFRJRCAlWCB0byBUSUQgJVggKioqKlxuXG4iLAotCQkJCWFjcGlfZ2JsX3ByZXZfdGhyZWFkX2lkLCB0aHJlYWRfaWQpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIlxuKioqKiBDb250ZXh0IFN3aXRjaCBmcm9tIFRJRCAlWCB0byBUSUQgJVggKioqKlxuXG4iLAorCQkJICAgICBhY3BpX2dibF9wcmV2X3RocmVhZF9pZCwgdGhyZWFkX2lkKTsKIAkJfQogCiAJCWFjcGlfZ2JsX3ByZXZfdGhyZWFkX2lkID0gdGhyZWFkX2lkOwpAQCAtMTY5LDE3ICsxOTIsMTggQEAKIAkgKiBEaXNwbGF5IHRoZSBtb2R1bGUgbmFtZSwgY3VycmVudCBsaW5lIG51bWJlciwgdGhyZWFkIElEIChpZiByZXF1ZXN0ZWQpLAogCSAqIGN1cnJlbnQgcHJvY2VkdXJlIG5lc3RpbmcgbGV2ZWwsIGFuZCB0aGUgY3VycmVudCBwcm9jZWR1cmUgbmFtZQogCSAqLwotCWFjcGlfb3NfcHJpbnRmICgiJThzLSUwNGxkICIsIGRiZ19pbmZvLT5tb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCWFjcGlfb3NfcHJpbnRmKCIlOHMtJTA0bGQgIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKIAogCWlmIChBQ1BJX0xWX1RIUkVBRFMgJiBhY3BpX2RiZ19sZXZlbCkgewotCQlhY3BpX29zX3ByaW50ZiAoIlslMDRsWF0gIiwgdGhyZWFkX2lkKTsKKwkJYWNwaV9vc19wcmludGYoIlslMDRsWF0gIiwgdGhyZWFkX2lkKTsKIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIlslMDJsZF0gJS0yMi4yMnM6ICIsCi0JCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwsIGRiZ19pbmZvLT5wcm9jX25hbWUpOworCWFjcGlfb3NfcHJpbnRmKCJbJTAybGRdICUtMjIuMjJzOiAiLAorCQkgICAgICAgYWNwaV9nYmxfbmVzdGluZ19sZXZlbCwKKwkJICAgICAgIGFjcGlfdXRfdHJpbV9mdW5jdGlvbl9uYW1lKGZ1bmN0aW9uX25hbWUpKTsKIAotCXZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotCWFjcGlfb3NfdnByaW50ZiAoZm9ybWF0LCBhcmdzKTsKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCWFjcGlfb3NfdnByaW50Zihmb3JtYXQsIGFyZ3MpOwogfQogCiBFWFBPUlRfU1lNQk9MKGFjcGlfdXRfZGVidWdfcHJpbnQpOwpAQCAtMTkwLDEwICsyMTQsOSBAQAogICoKICAqIFBBUkFNRVRFUlM6ICByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwgLSBSZXF1ZXN0ZWQgZGVidWcgcHJpbnQgbGV2ZWwKICAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBkYmdfaW5mbyAgICAgICAgICAgIC0gQ29udGFpbnM6Ci0gKiAgICAgICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgIC0gUHJpbnRmIGZvcm1hdCBmaWVsZAogICogICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgLSBPcHRpb25hbCBwcmludGYgYXJndW1lbnRzCiAgKgpAQCAtMjA0LDM3ICsyMjcsMzMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkICBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQotYWNwaV91dF9kZWJ1Z19wcmludF9yYXcgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2RlYnVnX2xldmVsLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8sCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZm9ybWF0LAotCS4uLikKK3ZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKK2FjcGlfdXRfZGVidWdfcHJpbnRfcmF3KHUzMiByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwsCisJCQl1MzIgbGluZV9udW1iZXIsCisJCQljb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkJY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgICAgICAgICAgICAgICAgIGFyZ3M7Ci0KKwl2YV9saXN0IGFyZ3M7CiAKIAlpZiAoIShyZXF1ZXN0ZWRfZGVidWdfbGV2ZWwgJiBhY3BpX2RiZ19sZXZlbCkgfHwKLQkJIShkYmdfaW5mby0+Y29tcG9uZW50X2lkICYgYWNwaV9kYmdfbGF5ZXIpKSB7CisJICAgICEoY29tcG9uZW50X2lkICYgYWNwaV9kYmdfbGF5ZXIpKSB7CiAJCXJldHVybjsKIAl9CiAKLQl2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLQlhY3BpX29zX3ZwcmludGYgKGZvcm1hdCwgYXJncyk7CisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlhY3BpX29zX3ZwcmludGYoZm9ybWF0LCBhcmdzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV91dF9kZWJ1Z19wcmludF9yYXcpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfdXRfZGVidWdfcHJpbnRfcmF3KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFjZQogICoKICAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBkYmdfaW5mbyAgICAgICAgICAgIC0gQ29udGFpbnM6Ci0gKiAgICAgICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTI0NCwyOSArMjYzLDI4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3V0X3RyYWNlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvKQorYWNwaV91dF90cmFjZSh1MzIgbGluZV9udW1iZXIsCisJICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQpCiB7CiAKIAlhY3BpX2dibF9uZXN0aW5nX2xldmVsKys7Ci0JYWNwaV91dF90cmFja19zdGFja19wdHIgKCk7CisJYWNwaV91dF90cmFja19zdGFja19wdHIoKTsKIAotCWFjcGlfdXRfZGVidWdfcHJpbnQgKEFDUElfTFZfRlVOQ1RJT05TLCBsaW5lX251bWJlciwgZGJnX2luZm8sCi0JCQkiJXNcbiIsIGFjcGlfZ2JsX2ZuX2VudHJ5X3N0cik7CisJYWNwaV91dF9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKKwkJCSAgICBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsCisJCQkgICAgY29tcG9uZW50X2lkLCAiJXNcbiIsIGFjcGlfZ2JsX2ZuX2VudHJ5X3N0cik7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfdXRfdHJhY2UpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfdXRfdHJhY2UpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYWNlX3B0cgogICoKICAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBkYmdfaW5mbyAgICAgICAgICAgIC0gQ29udGFpbnM6Ci0gKiAgICAgICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqICAgICAgICAgICAgICBQb2ludGVyICAgICAgICAgICAgIC0gUG9pbnRlciB0byBkaXNwbGF5CiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKQEAgLTI3NywyOCArMjk1LDI3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3V0X3RyYWNlX3B0ciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvICAgICpkYmdfaW5mbywKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2ludGVyKQorYWNwaV91dF90cmFjZV9wdHIodTMyIGxpbmVfbnVtYmVyLAorCQkgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHZvaWQgKnBvaW50ZXIpCiB7CiAJYWNwaV9nYmxfbmVzdGluZ19sZXZlbCsrOwotCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyICgpOworCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKCk7CiAKLQlhY3BpX3V0X2RlYnVnX3ByaW50IChBQ1BJX0xWX0ZVTkNUSU9OUywgbGluZV9udW1iZXIsIGRiZ19pbmZvLAotCQkJIiVzICVwXG4iLCBhY3BpX2dibF9mbl9lbnRyeV9zdHIsIHBvaW50ZXIpOworCWFjcGlfdXRfZGVidWdfcHJpbnQoQUNQSV9MVl9GVU5DVElPTlMsCisJCQkgICAgbGluZV9udW1iZXIsIGZ1bmN0aW9uX25hbWUsIG1vZHVsZV9uYW1lLAorCQkJICAgIGNvbXBvbmVudF9pZCwgIiVzICVwXG4iLCBhY3BpX2dibF9mbl9lbnRyeV9zdHIsCisJCQkgICAgcG9pbnRlcik7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFjZV9zdHIKICAqCiAgKiBQQVJBTUVURVJTOiAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyCi0gKiAgICAgICAgICAgICAgZGJnX2luZm8gICAgICAgICAgICAtIENvbnRhaW5zOgotICogICAgICAgICAgICAgICAgICBwcm9jX25hbWUgICAgICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKKyAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKKyAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECiAgKiAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgICAgICAtIEFkZGl0aW9uYWwgc3RyaW5nIHRvIGRpc3BsYXkKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQpAQCAtMzA5LDI5ICszMjYsMjggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfdXRfdHJhY2Vfc3RyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZykKK2FjcGlfdXRfdHJhY2Vfc3RyKHUzMiBsaW5lX251bWJlciwKKwkJICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgIGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCBjaGFyICpzdHJpbmcpCiB7CiAKIAlhY3BpX2dibF9uZXN0aW5nX2xldmVsKys7Ci0JYWNwaV91dF90cmFja19zdGFja19wdHIgKCk7CisJYWNwaV91dF90cmFja19zdGFja19wdHIoKTsKIAotCWFjcGlfdXRfZGVidWdfcHJpbnQgKEFDUElfTFZfRlVOQ1RJT05TLCBsaW5lX251bWJlciwgZGJnX2luZm8sCi0JCQkiJXMgJXNcbiIsIGFjcGlfZ2JsX2ZuX2VudHJ5X3N0ciwgc3RyaW5nKTsKKwlhY3BpX3V0X2RlYnVnX3ByaW50KEFDUElfTFZfRlVOQ1RJT05TLAorCQkJICAgIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwKKwkJCSAgICBjb21wb25lbnRfaWQsICIlcyAlc1xuIiwgYWNwaV9nYmxfZm5fZW50cnlfc3RyLAorCQkJICAgIHN0cmluZyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFjZV91MzIKICAqCiAgKiBQQVJBTUVURVJTOiAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyCi0gKiAgICAgICAgICAgICAgZGJnX2luZm8gICAgICAgICAgICAtIENvbnRhaW5zOgotICogICAgICAgICAgICAgICAgICBwcm9jX25hbWUgICAgICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKKyAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKKyAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECiAgKiAgICAgICAgICAgICAgSW50ZWdlciAgICAgICAgICAgICAtIEludGVnZXIgdG8gZGlzcGxheQogICoKICAqIFJFVFVSTjogICAgICBOb25lCkBAIC0zNDIsMjkgKzM1OCwyOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV91dF90cmFjZV91MzIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8sCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyKQorYWNwaV91dF90cmFjZV91MzIodTMyIGxpbmVfbnVtYmVyLAorCQkgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHUzMiBpbnRlZ2VyKQogewogCiAJYWNwaV9nYmxfbmVzdGluZ19sZXZlbCsrOwotCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyICgpOworCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKCk7CiAKLQlhY3BpX3V0X2RlYnVnX3ByaW50IChBQ1BJX0xWX0ZVTkNUSU9OUywgbGluZV9udW1iZXIsIGRiZ19pbmZvLAotCQkJIiVzICUwOFhcbiIsIGFjcGlfZ2JsX2ZuX2VudHJ5X3N0ciwgaW50ZWdlcik7CisJYWNwaV91dF9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKKwkJCSAgICBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsCisJCQkgICAgY29tcG9uZW50X2lkLCAiJXMgJTA4WFxuIiwgYWNwaV9nYmxfZm5fZW50cnlfc3RyLAorCQkJICAgIGludGVnZXIpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhpdAogICoKICAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBkYmdfaW5mbyAgICAgICAgICAgIC0gQ29udGFpbnM6Ci0gKiAgICAgICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTM3NCwyOCArMzg5LDI3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3V0X2V4aXQgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8pCithY3BpX3V0X2V4aXQodTMyIGxpbmVfbnVtYmVyLAorCSAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQpCiB7CiAKLQlhY3BpX3V0X2RlYnVnX3ByaW50IChBQ1BJX0xWX0ZVTkNUSU9OUywgbGluZV9udW1iZXIsIGRiZ19pbmZvLAotCQkJIiVzXG4iLCBhY3BpX2dibF9mbl9leGl0X3N0cik7CisJYWNwaV91dF9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKKwkJCSAgICBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsCisJCQkgICAgY29tcG9uZW50X2lkLCAiJXNcbiIsIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyKTsKIAogCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwtLTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV91dF9leGl0KTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX3V0X2V4aXQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3N0YXR1c19leGl0CiAgKgogICogUEFSQU1FVEVSUzogIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgotICogICAgICAgICAgICAgIGRiZ19pbmZvICAgICAgICAgICAgLSBDb250YWluczoKLSAqICAgICAgICAgICAgICAgICAgcHJvY19uYW1lICAgICAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQotICogICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECisgKiAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCisgKiAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCisgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAogICogICAgICAgICAgICAgIFN0YXR1cyAgICAgICAgICAgICAgLSBFeGl0IHN0YXR1cyBjb2RlCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKQEAgLTQwNiwzNyArNDIwLDM4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3V0X3N0YXR1c19leGl0ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvLAotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKQorYWNwaV91dF9zdGF0dXNfZXhpdCh1MzIgbGluZV9udW1iZXIsCisJCSAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgICAgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIGFjcGlfc3RhdHVzIHN0YXR1cykKIHsKIAotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJYWNwaV91dF9kZWJ1Z19wcmludCAoQUNQSV9MVl9GVU5DVElPTlMsIGxpbmVfbnVtYmVyLCBkYmdfaW5mbywKLQkJCQkiJXMgJXNcbiIsIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSk7Ci0JfQotCWVsc2UgewotCQlhY3BpX3V0X2RlYnVnX3ByaW50IChBQ1BJX0xWX0ZVTkNUSU9OUywgbGluZV9udW1iZXIsIGRiZ19pbmZvLAotCQkJCSIlcyAqKioqRXhjZXB0aW9uKioqKjogJXNcbiIsIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWFjcGlfdXRfZGVidWdfcHJpbnQoQUNQSV9MVl9GVU5DVElPTlMsCisJCQkJICAgIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwKKwkJCQkgICAgY29tcG9uZW50X2lkLCAiJXMgJXNcbiIsCisJCQkJICAgIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLAorCQkJCSAgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CisJfSBlbHNlIHsKKwkJYWNwaV91dF9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKKwkJCQkgICAgbGluZV9udW1iZXIsIGZ1bmN0aW9uX25hbWUsIG1vZHVsZV9uYW1lLAorCQkJCSAgICBjb21wb25lbnRfaWQsICIlcyAqKioqRXhjZXB0aW9uKioqKjogJXNcbiIsCisJCQkJICAgIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLAorCQkJCSAgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CiAJfQogCiAJYWNwaV9nYmxfbmVzdGluZ19sZXZlbC0tOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX3V0X3N0YXR1c19leGl0KTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX3V0X3N0YXR1c19leGl0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWx1ZV9leGl0CiAgKgogICogUEFSQU1FVEVSUzogIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgotICogICAgICAgICAgICAgIGRiZ19pbmZvICAgICAgICAgICAgLSBDb250YWluczoKLSAqICAgICAgICAgICAgICAgICAgcHJvY19uYW1lICAgICAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQotICogICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECisgKiAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCisgKiAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCisgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAogICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBWYWx1ZSB0byBiZSBwcmludGVkIHdpdGggZXhpdCBtc2cKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQpAQCAtNDQ3LDMwICs0NjIsMjkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfdXRfdmFsdWVfZXhpdCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvICAgICpkYmdfaW5mbywKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlKQorYWNwaV91dF92YWx1ZV9leGl0KHUzMiBsaW5lX251bWJlciwKKwkJICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJICAgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIGFjcGlfaW50ZWdlciB2YWx1ZSkKIHsKIAotCWFjcGlfdXRfZGVidWdfcHJpbnQgKEFDUElfTFZfRlVOQ1RJT05TLCBsaW5lX251bWJlciwgZGJnX2luZm8sCi0JCQkiJXMgJTguOFglOC44WFxuIiwgYWNwaV9nYmxfZm5fZXhpdF9zdHIsCi0JCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKHZhbHVlKSk7CisJYWNwaV91dF9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKKwkJCSAgICBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsCisJCQkgICAgY29tcG9uZW50X2lkLCAiJXMgJTguOFglOC44WFxuIiwKKwkJCSAgICBhY3BpX2dibF9mbl9leGl0X3N0ciwgQUNQSV9GT1JNQVRfVUlOVDY0KHZhbHVlKSk7CiAKIAlhY3BpX2dibF9uZXN0aW5nX2xldmVsLS07CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfdXRfdmFsdWVfZXhpdCk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV91dF92YWx1ZV9leGl0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9wdHJfZXhpdAogICoKICAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBkYmdfaW5mbyAgICAgICAgICAgIC0gQ29udGFpbnM6Ci0gKiAgICAgICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqICAgICAgICAgICAgICBQdHIgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBkaXNwbGF5CiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKQEAgLTQ4MSwyMSArNDk1LDIwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3V0X3B0cl9leGl0ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cikKK2FjcGlfdXRfcHRyX2V4aXQodTMyIGxpbmVfbnVtYmVyLAorCQkgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJIGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCB1OCAqIHB0cikKIHsKIAotCWFjcGlfdXRfZGVidWdfcHJpbnQgKEFDUElfTFZfRlVOQ1RJT05TLCBsaW5lX251bWJlciwgZGJnX2luZm8sCi0JCQkiJXMgJXBcbiIsIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLCBwdHIpOworCWFjcGlfdXRfZGVidWdfcHJpbnQoQUNQSV9MVl9GVU5DVElPTlMsCisJCQkgICAgbGluZV9udW1iZXIsIGZ1bmN0aW9uX25hbWUsIG1vZHVsZV9uYW1lLAorCQkJICAgIGNvbXBvbmVudF9pZCwgIiVzICVwXG4iLCBhY3BpX2dibF9mbl9leGl0X3N0ciwgcHRyKTsKIAogCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwtLTsKIH0KIAogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9kdW1wX2J1ZmZlcgpAQCAtNTExLDIzICs1MjQsMTcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X2R1bXBfYnVmZmVyICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQpCit2b2lkIGFjcGlfdXRfZHVtcF9idWZmZXIodTggKiBidWZmZXIsIHUzMiBjb3VudCwgdTMyIGRpc3BsYXksIHUzMiBjb21wb25lbnRfaWQpCiB7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpID0gMDsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGo7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMzI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfY2hhcjsKLQorCWFjcGlfbmF0aXZlX3VpbnQgaSA9IDA7CisJYWNwaV9uYXRpdmVfdWludCBqOworCXUzMiB0ZW1wMzI7CisJdTggYnVmX2NoYXI7CiAKIAkvKiBPbmx5IGR1bXAgdGhlIGJ1ZmZlciBpZiB0cmFjaW5nIGlzIGVuYWJsZWQgKi8KIAogCWlmICghKChBQ1BJX0xWX1RBQkxFUyAmIGFjcGlfZGJnX2xldmVsKSAmJgotCQkoY29tcG9uZW50X2lkICYgYWNwaV9kYmdfbGF5ZXIpKSkgeworCSAgICAgIChjb21wb25lbnRfaWQgJiBhY3BpX2RiZ19sYXllcikpKSB7CiAJCXJldHVybjsKIAl9CiAKQEAgLTU0MCw3ICs1NDcsNyBAQAogCXdoaWxlIChpIDwgY291bnQpIHsKIAkJLyogUHJpbnQgY3VycmVudCBvZmZzZXQgKi8KIAotCQlhY3BpX29zX3ByaW50ZiAoIiU2LjRYOiAiLCAodTMyKSBpKTsKKwkJYWNwaV9vc19wcmludGYoIiU2LjRYOiAiLCAodTMyKSBpKTsKIAogCQkvKiBQcmludCAxNiBoZXggY2hhcnMgKi8KIApAQCAtNTQ4LDczICs1NTUsNjYgQEAKIAkJCWlmIChpICsgaiA+PSBjb3VudCkgewogCQkJCS8qIER1bXAgZmlsbCBzcGFjZXMgKi8KIAotCQkJCWFjcGlfb3NfcHJpbnRmICgiJSpzIiwgKChkaXNwbGF5ICogMikgKyAxKSwgIiAiKTsKLQkJCQlqICs9IGRpc3BsYXk7CisJCQkJYWNwaV9vc19wcmludGYoIiUqcyIsICgoZGlzcGxheSAqIDIpICsgMSksICIgIik7CisJCQkJaiArPSAoYWNwaV9uYXRpdmVfdWludCkgZGlzcGxheTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAogCQkJc3dpdGNoIChkaXNwbGF5KSB7Ci0JCQlkZWZhdWx0OiAgICAvKiBEZWZhdWx0IGlzIEJZVEUgZGlzcGxheSAqLworCQkJZGVmYXVsdDoJLyogRGVmYXVsdCBpcyBCWVRFIGRpc3BsYXkgKi8KIAotCQkJCWFjcGlfb3NfcHJpbnRmICgiJTAyWCAiLCBidWZmZXJbaSArIGpdKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiJTAyWCAiLCBidWZmZXJbaSArIGpdKTsKIAkJCQlicmVhazsKIAotCiAJCQljYXNlIERCX1dPUkRfRElTUExBWToKIAotCQkJCUFDUElfTU9WRV8xNl9UT18zMiAoJnRlbXAzMiwgJmJ1ZmZlcltpICsgal0pOwotCQkJCWFjcGlfb3NfcHJpbnRmICgiJTA0WCAiLCB0ZW1wMzIpOworCQkJCUFDUElfTU9WRV8xNl9UT18zMigmdGVtcDMyLCAmYnVmZmVyW2kgKyBqXSk7CisJCQkJYWNwaV9vc19wcmludGYoIiUwNFggIiwgdGVtcDMyKTsKIAkJCQlicmVhazsKIAotCiAJCQljYXNlIERCX0RXT1JEX0RJU1BMQVk6CiAKLQkJCQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZ0ZW1wMzIsICZidWZmZXJbaSArIGpdKTsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIiUwOFggIiwgdGVtcDMyKTsKKwkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwgJmJ1ZmZlcltpICsgal0pOworCQkJCWFjcGlfb3NfcHJpbnRmKCIlMDhYICIsIHRlbXAzMik7CiAJCQkJYnJlYWs7CiAKLQogCQkJY2FzZSBEQl9RV09SRF9ESVNQTEFZOgogCi0JCQkJQUNQSV9NT1ZFXzMyX1RPXzMyICgmdGVtcDMyLCAmYnVmZmVyW2kgKyBqXSk7Ci0JCQkJYWNwaV9vc19wcmludGYgKCIlMDhYIiwgdGVtcDMyKTsKKwkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwgJmJ1ZmZlcltpICsgal0pOworCQkJCWFjcGlfb3NfcHJpbnRmKCIlMDhYIiwgdGVtcDMyKTsKIAotCQkJCUFDUElfTU9WRV8zMl9UT18zMiAoJnRlbXAzMiwgJmJ1ZmZlcltpICsgaiArIDRdKTsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIiUwOFggIiwgdGVtcDMyKTsKKwkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwgJmJ1ZmZlcltpICsgaiArIDRdKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiJTA4WCAiLCB0ZW1wMzIpOwogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlqICs9IGRpc3BsYXk7CisJCQlqICs9IChhY3BpX25hdGl2ZV91aW50KSBkaXNwbGF5OwogCQl9CiAKIAkJLyoKLQkJICogUHJpbnQgdGhlIEFTQ0lJIGVxdWl2YWxlbnQgY2hhcmFjdGVycwotCQkgKiBCdXQgd2F0Y2ggb3V0IGZvciB0aGUgYmFkIHVucHJpbnRhYmxlIG9uZXMuLi4KKwkJICogUHJpbnQgdGhlIEFTQ0lJIGVxdWl2YWxlbnQgY2hhcmFjdGVycyBidXQgd2F0Y2ggb3V0IGZvciB0aGUgYmFkCisJCSAqIHVucHJpbnRhYmxlIG9uZXMgKHByaW50YWJsZSBjaGFycyBhcmUgMHgyMCB0aHJvdWdoIDB4N0UpCiAJCSAqLwotCQlhY3BpX29zX3ByaW50ZiAoIiAiKTsKKwkJYWNwaV9vc19wcmludGYoIiAiKTsKIAkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKIAkJCWlmIChpICsgaiA+PSBjb3VudCkgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAKIAkJCWJ1Zl9jaGFyID0gYnVmZmVyW2kgKyBqXTsKLQkJCWlmICgoYnVmX2NoYXIgPiAweDFGICYmIGJ1Zl9jaGFyIDwgMHgyRSkgfHwKLQkJCQkoYnVmX2NoYXIgPiAweDJGICYmIGJ1Zl9jaGFyIDwgMHg2MSkgfHwKLQkJCQkoYnVmX2NoYXIgPiAweDYwICYmIGJ1Zl9jaGFyIDwgMHg3RikpIHsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIiVjIiwgYnVmX2NoYXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCIuIik7CisJCQlpZiAoQUNQSV9JU19QUklOVChidWZfY2hhcikpIHsKKwkJCQlhY3BpX29zX3ByaW50ZigiJWMiLCBidWZfY2hhcik7CisJCQl9IGVsc2UgeworCQkJCWFjcGlfb3NfcHJpbnRmKCIuIik7CiAJCQl9CiAJCX0KIAogCQkvKiBEb25lIHdpdGggdGhhdCBsaW5lLiAqLwogCi0JCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIlxuIik7CiAJCWkgKz0gMTY7CiAJfQogCiAJcmV0dXJuOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMKaW5kZXggYmM1NDAzMC4uMmJjODc4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWxldGUuYwpAQCAtNDEsNyArNDEsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CkBAIC00OSwxOSArNDgsMTMgQEAKICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dGRlbGV0ZSIpCitBQ1BJX01PRFVMRV9OQU1FKCJ1dGRlbGV0ZSIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIGFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpOwogCiBzdGF0aWMgdm9pZAotYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpOwotCi1zdGF0aWMgdm9pZAotYWNwaV91dF91cGRhdGVfcmVmX2NvdW50ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24pOwotCithY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LCB1MzIgYWN0aW9uKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC03NiwxOCArNjksMTQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpCitzdGF0aWMgdm9pZCBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmoodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KQogewotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9ial9wb2ludGVyID0gTlVMTDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpoYW5kbGVyX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc2Vjb25kX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbmV4dF9kZXNjOworCXZvaWQgKm9ial9wb2ludGVyID0gTlVMTDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc2Vjb25kX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dF9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X2RlbGV0ZV9pbnRlcm5hbF9vYmoiLCBvYmplY3QpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2RlbGV0ZV9pbnRlcm5hbF9vYmoiLCBvYmplY3QpOwogCiAJaWYgKCFvYmplY3QpIHsKIAkJcmV0dXJuX1ZPSUQ7CkBAIC05NywxMSArODYsMTIgQEAKIAkgKiBNdXN0IGRlbGV0ZSBvciBmcmVlIGFueSBwb2ludGVycyB3aXRoaW4gdGhlIG9iamVjdCB0aGF0IGFyZSBub3QKIAkgKiBhY3R1YWwgQUNQSSBvYmplY3RzIChmb3IgZXhhbXBsZSwgYSByYXcgYnVmZmVyIHBvaW50ZXIpLgogCSAqLwotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9iamVjdCkpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9iamVjdCkpIHsKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICIqKioqIFN0cmluZyAlcCwgcHRyICVwXG4iLAotCQkJb2JqZWN0LCBvYmplY3QtPnN0cmluZy5wb2ludGVyKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJICAiKioqKiBTdHJpbmcgJXAsIHB0ciAlcFxuIiwgb2JqZWN0LAorCQkJCSAgb2JqZWN0LT5zdHJpbmcucG9pbnRlcikpOwogCiAJCS8qIEZyZWUgdGhlIGFjdHVhbCBzdHJpbmcgYnVmZmVyICovCiAKQEAgLTExMiwxMSArMTAyLDExIEBACiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIioqKiogQnVmZmVyICVwLCBwdHIgJXBcbiIsCi0JCQlvYmplY3QsIG9iamVjdC0+YnVmZmVyLnBvaW50ZXIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICIqKioqIEJ1ZmZlciAlcCwgcHRyICVwXG4iLCBvYmplY3QsCisJCQkJICBvYmplY3QtPmJ1ZmZlci5wb2ludGVyKSk7CiAKIAkJLyogRnJlZSB0aGUgYWN0dWFsIGJ1ZmZlciAqLwogCkBAIC0xMjcsMTEgKzExNywxMSBAQAogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiICoqKiogUGFja2FnZSBvZiBjb3VudCAlWFxuIiwKLQkJCW9iamVjdC0+cGFja2FnZS5jb3VudCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIiAqKioqIFBhY2thZ2Ugb2YgY291bnQgJVhcbiIsCisJCQkJICBvYmplY3QtPnBhY2thZ2UuY291bnQpKTsKIAogCQkvKgogCQkgKiBFbGVtZW50cyBvZiB0aGUgcGFja2FnZSBhcmUgbm90IGhhbmRsZWQgaGVyZSwgdGhleSBhcmUgZGVsZXRlZApAQCAtMTQzLDExICsxMzMsMTEgQEAKIAkJb2JqX3BvaW50ZXIgPSBvYmplY3QtPnBhY2thZ2UuZWxlbWVudHM7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CiAKIAkJaWYgKG9iamVjdC0+ZGV2aWNlLmdwZV9ibG9jaykgewotCQkJKHZvaWQpIGFjcGlfZXZfZGVsZXRlX2dwZV9ibG9jayAob2JqZWN0LT5kZXZpY2UuZ3BlX2Jsb2NrKTsKKwkJCSh2b2lkKWFjcGlfZXZfZGVsZXRlX2dwZV9ibG9jayhvYmplY3QtPmRldmljZS4KKwkJCQkJCSAgICAgICBncGVfYmxvY2spOwogCQl9CiAKIAkJLyogV2FsayB0aGUgaGFuZGxlciBsaXN0IGZvciB0aGlzIGRldmljZSAqLwpAQCAtMTU1LDU0ICsxNDUsNTEgQEAKIAkJaGFuZGxlcl9kZXNjID0gb2JqZWN0LT5kZXZpY2UuaGFuZGxlcjsKIAkJd2hpbGUgKGhhbmRsZXJfZGVzYykgewogCQkJbmV4dF9kZXNjID0gaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLm5leHQ7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGhhbmRsZXJfZGVzYyk7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaGFuZGxlcl9kZXNjKTsKIAkJCWhhbmRsZXJfZGVzYyA9IG5leHRfZGVzYzsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTVVURVg6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkiKioqKiogTXV0ZXggJXAsIFNlbWFwaG9yZSAlcFxuIiwKLQkJCW9iamVjdCwgb2JqZWN0LT5tdXRleC5zZW1hcGhvcmUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICIqKioqKiBNdXRleCAlcCwgU2VtYXBob3JlICVwXG4iLAorCQkJCSAgb2JqZWN0LCBvYmplY3QtPm11dGV4LnNlbWFwaG9yZSkpOwogCi0JCWFjcGlfZXhfdW5saW5rX211dGV4IChvYmplY3QpOwotCQkodm9pZCkgYWNwaV9vc19kZWxldGVfc2VtYXBob3JlIChvYmplY3QtPm11dGV4LnNlbWFwaG9yZSk7CisJCWFjcGlfZXhfdW5saW5rX211dGV4KG9iamVjdCk7CisJCSh2b2lkKWFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZShvYmplY3QtPm11dGV4LnNlbWFwaG9yZSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9FVkVOVDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCSIqKioqKiBFdmVudCAlcCwgU2VtYXBob3JlICVwXG4iLAotCQkJb2JqZWN0LCBvYmplY3QtPmV2ZW50LnNlbWFwaG9yZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIioqKioqIEV2ZW50ICVwLCBTZW1hcGhvcmUgJXBcbiIsCisJCQkJICBvYmplY3QsIG9iamVjdC0+ZXZlbnQuc2VtYXBob3JlKSk7CiAKLQkJKHZvaWQpIGFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZSAob2JqZWN0LT5ldmVudC5zZW1hcGhvcmUpOworCQkodm9pZClhY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUob2JqZWN0LT5ldmVudC5zZW1hcGhvcmUpOwogCQlvYmplY3QtPmV2ZW50LnNlbWFwaG9yZSA9IE5VTEw7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkiKioqKiogTWV0aG9kICVwXG4iLCBvYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICIqKioqKiBNZXRob2QgJXBcbiIsIG9iamVjdCkpOwogCiAJCS8qIERlbGV0ZSB0aGUgbWV0aG9kIHNlbWFwaG9yZSBpZiBpdCBleGlzdHMgKi8KIAogCQlpZiAob2JqZWN0LT5tZXRob2Quc2VtYXBob3JlKSB7Ci0JCQkodm9pZCkgYWNwaV9vc19kZWxldGVfc2VtYXBob3JlIChvYmplY3QtPm1ldGhvZC5zZW1hcGhvcmUpOworCQkJKHZvaWQpYWNwaV9vc19kZWxldGVfc2VtYXBob3JlKG9iamVjdC0+bWV0aG9kLgorCQkJCQkJICAgICAgIHNlbWFwaG9yZSk7CiAJCQlvYmplY3QtPm1ldGhvZC5zZW1hcGhvcmUgPSBOVUxMOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9SRUdJT046CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkiKioqKiogUmVnaW9uICVwXG4iLCBvYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICIqKioqKiBSZWdpb24gJXBcbiIsIG9iamVjdCkpOwogCi0JCXNlY29uZF9kZXNjID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdCAob2JqZWN0KTsKKwkJc2Vjb25kX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KG9iamVjdCk7CiAJCWlmIChzZWNvbmRfZGVzYykgewogCQkJLyoKIAkJCSAqIEZyZWUgdGhlIHJlZ2lvbl9jb250ZXh0IGlmIGFuZCBvbmx5IGlmIHRoZSBoYW5kbGVyIGlzIG9uZSBvZiB0aGUKQEAgLTIxMSwzMiArMTk4LDMzIEBACiAJCQkgKi8KIAkJCWhhbmRsZXJfZGVzYyA9IG9iamVjdC0+cmVnaW9uLmhhbmRsZXI7CiAJCQlpZiAoaGFuZGxlcl9kZXNjKSB7Ci0JCQkJaWYgKGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5oZmxhZ3MgJiBBQ1BJX0FERFJfSEFORExFUl9ERUZBVUxUX0lOU1RBTExFRCkgewotCQkJCQlvYmpfcG9pbnRlciA9IHNlY29uZF9kZXNjLT5leHRyYS5yZWdpb25fY29udGV4dDsKKwkJCQlpZiAoaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLgorCQkJCSAgICBoZmxhZ3MgJgorCQkJCSAgICBBQ1BJX0FERFJfSEFORExFUl9ERUZBVUxUX0lOU1RBTExFRCkgeworCQkJCQlvYmpfcG9pbnRlciA9CisJCQkJCSAgICBzZWNvbmRfZGVzYy0+ZXh0cmEucmVnaW9uX2NvbnRleHQ7CiAJCQkJfQogCi0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChoYW5kbGVyX2Rlc2MpOworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShoYW5kbGVyX2Rlc2MpOwogCQkJfQogCiAJCQkvKiBOb3cgd2UgY2FuIGZyZWUgdGhlIEV4dHJhIG9iamVjdCAqLwogCi0JCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyAoc2Vjb25kX2Rlc2MpOworCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Moc2Vjb25kX2Rlc2MpOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkiKioqKiogQnVmZmVyIEZpZWxkICVwXG4iLCBvYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICIqKioqKiBCdWZmZXIgRmllbGQgJXBcbiIsIG9iamVjdCkpOwogCi0JCXNlY29uZF9kZXNjID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdCAob2JqZWN0KTsKKwkJc2Vjb25kX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KG9iamVjdCk7CiAJCWlmIChzZWNvbmRfZGVzYykgewotCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKHNlY29uZF9kZXNjKTsKKwkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKHNlY29uZF9kZXNjKTsKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMjQ0LDIxICsyMzIsMjAgQEAKIAkvKiBGcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5IChwb2ludGVyIHdpdGhpbiB0aGUgb2JqZWN0KSBmb3VuZCBhYm92ZSAqLwogCiAJaWYgKG9ial9wb2ludGVyKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiRGVsZXRpbmcgT2JqZWN0IFN1YnB0ciAlcFxuIiwKLQkJCQlvYmpfcG9pbnRlcikpOwotCQlBQ1BJX01FTV9GUkVFIChvYmpfcG9pbnRlcik7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJICAiRGVsZXRpbmcgT2JqZWN0IFN1YnB0ciAlcFxuIiwgb2JqX3BvaW50ZXIpKTsKKwkJQUNQSV9NRU1fRlJFRShvYmpfcG9pbnRlcik7CiAJfQogCiAJLyogTm93IHRoZSBvYmplY3QgY2FuIGJlIHNhZmVseSBkZWxldGVkICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIkRlbGV0aW5nIE9iamVjdCAlcCBbJXNdXG4iLAotCQkJb2JqZWN0LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmplY3QpKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIkRlbGV0aW5nIE9iamVjdCAlcCBbJXNdXG4iLAorCQkJICBvYmplY3QsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqZWN0KSkpOwogCi0JYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKG9iamVjdCk7CisJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Mob2JqZWN0KTsKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdApAQCAtMjcyLDI5ICsyNTksMjQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9ial9saXN0KQordm9pZCBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2xpc3QpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmludGVybmFsX29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqaW50ZXJuYWxfb2JqOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9kZWxldGVfaW50ZXJuYWxfb2JqZWN0X2xpc3QiKTsKIAogCS8qIFdhbGsgdGhlIG51bGwtdGVybWluYXRlZCBpbnRlcm5hbCBsaXN0ICovCiAKIAlmb3IgKGludGVybmFsX29iaiA9IG9ial9saXN0OyAqaW50ZXJuYWxfb2JqOyBpbnRlcm5hbF9vYmorKykgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKCppbnRlcm5hbF9vYmopOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoKmludGVybmFsX29iaik7CiAJfQogCiAJLyogRnJlZSB0aGUgY29tYmluZWQgcGFyYW1ldGVyIHBvaW50ZXIgbGlzdCBhbmQgb2JqZWN0IGFycmF5ICovCiAKLQlBQ1BJX01FTV9GUkVFIChvYmpfbGlzdCk7CisJQUNQSV9NRU1fRlJFRShvYmpfbGlzdCk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF91cGRhdGVfcmVmX2NvdW50CkBAIC0zMDksMTYgKzI5MSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLWFjcGlfdXRfdXBkYXRlX3JlZl9jb3VudCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKQorYWNwaV91dF91cGRhdGVfcmVmX2NvdW50KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwgdTMyIGFjdGlvbikKIHsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NvdW50OworCXUxNiBjb3VudDsKKwl1MTYgbmV3X2NvdW50OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJ1dF91cGRhdGVfcmVmX2NvdW50Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoInV0X3VwZGF0ZV9yZWZfY291bnQiKTsKIAogCWlmICghb2JqZWN0KSB7CiAJCXJldHVybjsKQEAgLTMzOCw1OCArMzE2LDU1IEBACiAJCW5ld19jb3VudCsrOwogCQlvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPSBuZXdfY291bnQ7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkiT2JqICVwIFJlZnM9JVgsIFtJbmNyZW1lbnRlZF1cbiIsCi0JCQlvYmplY3QsIG5ld19jb3VudCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIk9iaiAlcCBSZWZzPSVYLCBbSW5jcmVtZW50ZWRdXG4iLAorCQkJCSAgb2JqZWN0LCBuZXdfY291bnQpKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgUkVGX0RFQ1JFTUVOVDoKIAogCQlpZiAoY291bnQgPCAxKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCQkiT2JqICVwIFJlZnM9JVgsIGNhbid0IGRlY3JlbWVudCEgKFNldCB0byAwKVxuIiwKLQkJCQlvYmplY3QsIG5ld19jb3VudCkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkJICAiT2JqICVwIFJlZnM9JVgsIGNhbid0IGRlY3JlbWVudCEgKFNldCB0byAwKVxuIiwKKwkJCQkJICBvYmplY3QsIG5ld19jb3VudCkpOwogCiAJCQluZXdfY291bnQgPSAwOwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJbmV3X2NvdW50LS07CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAotCQkJCSJPYmogJXAgUmVmcz0lWCwgW0RlY3JlbWVudGVkXVxuIiwKLQkJCQlvYmplY3QsIG5ld19jb3VudCkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkJICAiT2JqICVwIFJlZnM9JVgsIFtEZWNyZW1lbnRlZF1cbiIsCisJCQkJCSAgb2JqZWN0LCBuZXdfY291bnQpKTsKIAkJfQogCi0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqZWN0KSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCQkiTWV0aG9kIE9iaiAlcCBSZWZzPSVYLCBbRGVjcmVtZW50ZWRdXG4iLAotCQkJCW9iamVjdCwgbmV3X2NvdW50KSk7CisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmplY3QpID09IEFDUElfVFlQRV9NRVRIT0QpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJCSAgIk1ldGhvZCBPYmogJXAgUmVmcz0lWCwgW0RlY3JlbWVudGVkXVxuIiwKKwkJCQkJICBvYmplY3QsIG5ld19jb3VudCkpOwogCQl9CiAKIAkJb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gbmV3X2NvdW50OwogCQlpZiAobmV3X2NvdW50ID09IDApIHsKLQkJCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaiAob2JqZWN0KTsKKwkJCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaihvYmplY3QpOwogCQl9CiAKIAkJYnJlYWs7CiAKLQogCWNhc2UgUkVGX0ZPUkNFX0RFTEVURToKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCSJPYmogJXAgUmVmcz0lWCwgRm9yY2UgZGVsZXRlISAoU2V0IHRvIDApXG4iLAotCQkJb2JqZWN0LCBjb3VudCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIk9iaiAlcCBSZWZzPSVYLCBGb3JjZSBkZWxldGUhIChTZXQgdG8gMClcbiIsCisJCQkJICBvYmplY3QsIGNvdW50KSk7CiAKIAkJbmV3X2NvdW50ID0gMDsKIAkJb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gbmV3X2NvdW50OwotCQlhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmogKG9iamVjdCk7CisJCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaihvYmplY3QpOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gYWN0aW9uICglWClcbiIsIGFjdGlvbikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBhY3Rpb24gKCVYKVxuIiwKKwkJCQkgIGFjdGlvbikpOwogCQlicmVhazsKIAl9CiAKQEAgLTM5OSwxNSArMzc0LDE0IEBACiAJICovCiAJaWYgKGNvdW50ID4gQUNQSV9NQVhfUkVGRVJFTkNFX0NPVU5UKSB7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfV0FSTiwKLQkJCSIqKioqIFdhcm5pbmcgKioqKiBMYXJnZSBSZWZlcmVuY2UgQ291bnQgKCVYKSBpbiBvYmplY3QgJXBcblxuIiwKLQkJCWNvdW50LCBvYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCSAgIioqKiogV2FybmluZyAqKioqIExhcmdlIFJlZmVyZW5jZSBDb3VudCAoJVgpIGluIG9iamVjdCAlcFxuXG4iLAorCQkJCSAgY291bnQsIG9iamVjdCkpOwogCX0KIAogCXJldHVybjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlCkBAIC00MzEsNjUgKzQwNSw0MiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbikKK2FjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqIG9iamVjdCwgdTE2IGFjdGlvbikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAgKnN0YXRlX2xpc3QgPSBOVUxMOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgICpzdGF0ZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAqdG1wOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGVfbGlzdCA9IE5VTEw7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dF9vYmplY3QgPSBOVUxMOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CisJYWNwaV9uYXRpdmVfdWludCBpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJ1dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZSIsIG9iamVjdCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlIiwgb2JqZWN0KTsKIAorCXdoaWxlIChvYmplY3QpIHsKKwkJLyogTWFrZSBzdXJlIHRoYXQgdGhpcyBpc24ndCBhIG5hbWVzcGFjZSBoYW5kbGUgKi8KIAotCS8qIElnbm9yZSBhIG51bGwgb2JqZWN0IHB0ciAqLwotCi0JaWYgKCFvYmplY3QpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7Ci0JfQotCi0JLyogTWFrZSBzdXJlIHRoYXQgdGhpcyBpc24ndCBhIG5hbWVzcGFjZSBoYW5kbGUgKi8KLQotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkiT2JqZWN0ICVwIGlzIE5TIGhhbmRsZVxuIiwgb2JqZWN0KSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwotCX0KLQotCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlIChvYmplY3QsIGFjdGlvbik7Ci0KLQl3aGlsZSAoc3RhdGUpIHsKLQkJb2JqZWN0ID0gc3RhdGUtPnVwZGF0ZS5vYmplY3Q7Ci0JCWFjdGlvbiA9IHN0YXRlLT51cGRhdGUudmFsdWU7Ci0JCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKHN0YXRlKTsKKwkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCQkgICJPYmplY3QgJXAgaXMgTlMgaGFuZGxlXG4iLCBvYmplY3QpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCX0KIAogCQkvKgogCQkgKiBBbGwgc3ViLW9iamVjdHMgbXVzdCBoYXZlIHRoZWlyIHJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZCBhbHNvLgogCQkgKiBEaWZmZXJlbnQgb2JqZWN0IHR5cGVzIGhhdmUgZGlmZmVyZW50IHN1Ym9iamVjdHMuCiAJCSAqLwotCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmplY3QpKSB7CisJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqZWN0KSkgewogCQljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CiAKLQkJCXRtcCA9IG9iamVjdC0+ZGV2aWNlLnN5c3RlbV9ub3RpZnk7Ci0JCQlpZiAodG1wICYmICh0bXAtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPD0gMSkgJiYgYWN0aW9uID09IFJFRl9ERUNSRU1FTlQpCi0JCQkJb2JqZWN0LT5kZXZpY2Uuc3lzdGVtX25vdGlmeSA9IE5VTEw7Ci0JCQlhY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQgKHRtcCwgYWN0aW9uKTsKLQotCQkJdG1wID0gb2JqZWN0LT5kZXZpY2UuZGV2aWNlX25vdGlmeTsKLQkJCWlmICh0bXAgJiYgKHRtcC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCA8PSAxKSAmJiBhY3Rpb24gPT0gUkVGX0RFQ1JFTUVOVCkKLQkJCQlvYmplY3QtPmRldmljZS5kZXZpY2Vfbm90aWZ5ID0gTlVMTDsKLQkJCWFjcGlfdXRfdXBkYXRlX3JlZl9jb3VudCAodG1wLCBhY3Rpb24pOwotCisJCQlhY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQob2JqZWN0LT5kZXZpY2Uuc3lzdGVtX25vdGlmeSwKKwkJCQkJCSBhY3Rpb24pOworCQkJYWNwaV91dF91cGRhdGVfcmVmX2NvdW50KG9iamVjdC0+ZGV2aWNlLmRldmljZV9ub3RpZnksCisJCQkJCQkgYWN0aW9uKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKLQogCQkJLyoKLQkJCSAqIFdlIG11c3QgdXBkYXRlIGFsbCB0aGUgc3ViLW9iamVjdHMgb2YgdGhlIHBhY2thZ2UKLQkJCSAqIChFYWNoIG9mIHdob20gbWF5IGhhdmUgdGhlaXIgb3duIHN1Yi1vYmplY3RzLCBldGMuCisJCQkgKiBXZSBtdXN0IHVwZGF0ZSBhbGwgdGhlIHN1Yi1vYmplY3RzIG9mIHRoZSBwYWNrYWdlLAorCQkJICogZWFjaCBvZiB3aG9tIG1heSBoYXZlIHRoZWlyIG93biBzdWItb2JqZWN0cy4KIAkJCSAqLwogCQkJZm9yIChpID0gMDsgaSA8IG9iamVjdC0+cGFja2FnZS5jb3VudDsgaSsrKSB7CiAJCQkJLyoKQEAgLTQ5NywxMTYgKzQ0OCw2NyBAQAogCQkJCSAqIE5vdGU6IFRoZXJlIGNhbiBiZSBudWxsIGVsZW1lbnRzIHdpdGhpbiB0aGUgcGFja2FnZSwKIAkJCQkgKiB0aGVzZSBhcmUgc2ltcGx5IGlnbm9yZWQKIAkJCQkgKi8KLQkJCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2ggKAotCQkJCQkJIG9iamVjdC0+cGFja2FnZS5lbGVtZW50c1tpXSwgYWN0aW9uLCAmc3RhdGVfbGlzdCk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZV9hbmRfcHVzaAorCQkJCSAgICAob2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzW2ldLCBhY3Rpb24sCisJCQkJICAgICAmc3RhdGVfbGlzdCk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJCWdvdG8gZXJyb3JfZXhpdDsKIAkJCQl9Ci0KLQkJCQl0bXAgPSBvYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbaV07Ci0JCQkJaWYgKHRtcCAmJiAodG1wLT5jb21tb24ucmVmZXJlbmNlX2NvdW50IDw9IDEpICAmJiBhY3Rpb24gPT0gUkVGX0RFQ1JFTUVOVCkKLQkJCQkJb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzW2ldID0gTlVMTDsKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgogCi0JCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2ggKAotCQkJCQkgb2JqZWN0LT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiwgYWN0aW9uLCAmc3RhdGVfbGlzdCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJZ290byBlcnJvcl9leGl0OwotCQkJfQotCi0JCQl0bXAgPSBvYmplY3QtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqOwotCQkJaWYgKCB0bXAgJiYgKHRtcC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCA8PSAxKSAgJiYgYWN0aW9uID09IFJFRl9ERUNSRU1FTlQpCi0JCQkJb2JqZWN0LT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiA9IE5VTEw7CisJCQluZXh0X29iamVjdCA9IG9iamVjdC0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmo7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKIAotCQkJc3RhdHVzID0gYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoICgKLQkJCQkJIG9iamVjdC0+ZmllbGQucmVnaW9uX29iaiwgYWN0aW9uLCAmc3RhdGVfbGlzdCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJZ290byBlcnJvcl9leGl0OwotCQkJfQotCi0JCQl0bXAgPSBvYmplY3QtPmZpZWxkLnJlZ2lvbl9vYmo7Ci0JCQlpZiAoIHRtcCAmJiAodG1wLT5jb21tb24ucmVmZXJlbmNlX2NvdW50IDw9IDEpICAmJiBhY3Rpb24gPT0gUkVGX0RFQ1JFTUVOVCkKLQkJCQlvYmplY3QtPmZpZWxkLnJlZ2lvbl9vYmogPSBOVUxMOwotCQkgICBicmVhazsKLQorCQkJbmV4dF9vYmplY3QgPSBvYmplY3QtPmZpZWxkLnJlZ2lvbl9vYmo7CisJCQlicmVhazsKIAogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgogCi0JCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2ggKAotCQkJCQkgb2JqZWN0LT5iYW5rX2ZpZWxkLmJhbmtfb2JqLCBhY3Rpb24sICZzdGF0ZV9saXN0KTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCW5leHRfb2JqZWN0ID0gb2JqZWN0LT5iYW5rX2ZpZWxkLmJhbmtfb2JqOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2gob2JqZWN0LT4KKwkJCQkJCQkJIGJhbmtfZmllbGQuCisJCQkJCQkJCSByZWdpb25fb2JqLAorCQkJCQkJCQkgYWN0aW9uLAorCQkJCQkJCQkgJnN0YXRlX2xpc3QpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJZ290byBlcnJvcl9leGl0OwogCQkJfQotCi0JCQl0bXAgPSBvYmplY3QtPmJhbmtfZmllbGQuYmFua19vYmo7Ci0JCQlpZiAoIHRtcCAmJiAodG1wLT5jb21tb24ucmVmZXJlbmNlX2NvdW50IDw9IDEpICAmJiBhY3Rpb24gPT0gUkVGX0RFQ1JFTUVOVCkKLQkJCQlvYmplY3QtPmJhbmtfZmllbGQuYmFua19vYmogPSBOVUxMOwotCi0JCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2ggKAotCQkJCQkgb2JqZWN0LT5iYW5rX2ZpZWxkLnJlZ2lvbl9vYmosIGFjdGlvbiwgJnN0YXRlX2xpc3QpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJCX0KLQotCQkJdG1wID0gb2JqZWN0LT5iYW5rX2ZpZWxkLnJlZ2lvbl9vYmo7Ci0JCQlpZiAoIHRtcCAmJiAodG1wLT5jb21tb24ucmVmZXJlbmNlX2NvdW50IDw9IDEpICAmJiBhY3Rpb24gPT0gUkVGX0RFQ1JFTUVOVCkKLQkJCQlvYmplY3QtPmJhbmtfZmllbGQucmVnaW9uX29iaiA9IE5VTEw7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCi0JCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2ggKAotCQkJCQkgb2JqZWN0LT5pbmRleF9maWVsZC5pbmRleF9vYmosIGFjdGlvbiwgJnN0YXRlX2xpc3QpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJbmV4dF9vYmplY3QgPSBvYmplY3QtPmluZGV4X2ZpZWxkLmluZGV4X29iajsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoKG9iamVjdC0+CisJCQkJCQkJCSBpbmRleF9maWVsZC4KKwkJCQkJCQkJIGRhdGFfb2JqLAorCQkJCQkJCQkgYWN0aW9uLAorCQkJCQkJCQkgJnN0YXRlX2xpc3QpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJZ290byBlcnJvcl9leGl0OwogCQkJfQotCi0JCQl0bXAgPSBvYmplY3QtPmluZGV4X2ZpZWxkLmluZGV4X29iajsKLQkJCWlmICggdG1wICYmICh0bXAtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPD0gMSkgICYmIGFjdGlvbiA9PSBSRUZfREVDUkVNRU5UKQotCQkJCW9iamVjdC0+aW5kZXhfZmllbGQuaW5kZXhfb2JqID0gTlVMTDsKLQotCQkJc3RhdHVzID0gYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoICgKLQkJCQkJIG9iamVjdC0+aW5kZXhfZmllbGQuZGF0YV9vYmosIGFjdGlvbiwgJnN0YXRlX2xpc3QpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJCX0KLQotCQkJdG1wID0gb2JqZWN0LT5pbmRleF9maWVsZC5kYXRhX29iajsKLQkJCWlmICggdG1wICYmICh0bXAtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPD0gMSkgICYmIGFjdGlvbiA9PSBSRUZfREVDUkVNRU5UKQotCQkJCW9iamVjdC0+aW5kZXhfZmllbGQuZGF0YV9vYmogPSBOVUxMOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6Ci0KIAkJCS8qCiAJCQkgKiBUaGUgdGFyZ2V0IG9mIGFuIEluZGV4IChhIHBhY2thZ2UsIHN0cmluZywgb3IgYnVmZmVyKSBtdXN0IHRyYWNrCiAJCQkgKiBjaGFuZ2VzIHRvIHRoZSByZWYgY291bnQgb2YgdGhlIGluZGV4LgogCQkJICovCiAJCQlpZiAob2JqZWN0LT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9JTkRFWF9PUCkgewotCQkJCXN0YXR1cyA9IGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZV9hbmRfcHVzaCAoCi0JCQkJCQkgb2JqZWN0LT5yZWZlcmVuY2Uub2JqZWN0LCBhY3Rpb24sICZzdGF0ZV9saXN0KTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJCQl9CisJCQkJbmV4dF9vYmplY3QgPSBvYmplY3QtPnJlZmVyZW5jZS5vYmplY3Q7CiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKIAkJZGVmYXVsdDoKLQotCQkJLyogTm8gc3Vib2JqZWN0cyAqLwotCQkJYnJlYWs7CisJCQlicmVhazsJLyogTm8gc3Vib2JqZWN0cyAqLwogCQl9CiAKIAkJLyoKQEAgLTYxNCwyNSArNTE2LDMxIEBACiAJCSAqIGhhcHBlbiBhZnRlciB3ZSB1cGRhdGUgdGhlIHN1Yi1vYmplY3RzIGluIGNhc2UgdGhpcyBjYXVzZXMgdGhlCiAJCSAqIG1haW4gb2JqZWN0IHRvIGJlIGRlbGV0ZWQuCiAJCSAqLwotCQlhY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQgKG9iamVjdCwgYWN0aW9uKTsKKwkJYWNwaV91dF91cGRhdGVfcmVmX2NvdW50KG9iamVjdCwgYWN0aW9uKTsKKwkJb2JqZWN0ID0gTlVMTDsKIAogCQkvKiBNb3ZlIG9uIHRvIHRoZSBuZXh0IG9iamVjdCB0byBiZSB1cGRhdGVkICovCiAKLQkJc3RhdGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlICgmc3RhdGVfbGlzdCk7CisJCWlmIChuZXh0X29iamVjdCkgeworCQkJb2JqZWN0ID0gbmV4dF9vYmplY3Q7CisJCQluZXh0X29iamVjdCA9IE5VTEw7CisJCX0gZWxzZSBpZiAoc3RhdGVfbGlzdCkgeworCQkJc3RhdGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZzdGF0ZV9saXN0KTsKKwkJCW9iamVjdCA9IHN0YXRlLT51cGRhdGUub2JqZWN0OworCQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7CisJCX0KIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCisgICAgICBlcnJvcl9leGl0OgogCi1lcnJvcl9leGl0OgorCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IHVwZGF0ZSBvYmplY3QgcmVmZXJlbmNlIGNvdW50LCAlc1xuIiwKKwkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAKLQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgdXBkYXRlIG9iamVjdCByZWZlcmVuY2UgY291bnQsICVzXG4iLAotCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2FkZF9yZWZlcmVuY2UKQEAgLTY0NiwzMSArNTU0LDI3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV91dF9hZGRfcmVmZXJlbmNlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpCit2b2lkIGFjcGlfdXRfYWRkX3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X2FkZF9yZWZlcmVuY2UiLCBvYmplY3QpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2FkZF9yZWZlcmVuY2UiLCBvYmplY3QpOwogCiAJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIG9iamVjdCAqLwogCi0JaWYgKCFhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdCAob2JqZWN0KSkgeworCWlmICghYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3Qob2JqZWN0KSkgewogCQlyZXR1cm5fVk9JRDsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJIk9iaiAlcCBDdXJyZW50IFJlZnM9JVggW1RvIEJlIEluY3JlbWVudGVkXVxuIiwKLQkJb2JqZWN0LCBvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJICAiT2JqICVwIEN1cnJlbnQgUmVmcz0lWCBbVG8gQmUgSW5jcmVtZW50ZWRdXG4iLAorCQkJICBvYmplY3QsIG9iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCkpOwogCiAJLyogSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKi8KIAotCSh2b2lkKSBhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlIChvYmplY3QsIFJFRl9JTkNSRU1FTlQpOworCSh2b2lkKWFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2Uob2JqZWN0LCBSRUZfSU5DUkVNRU5UKTsKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UKQEAgLTY4MywxMyArNTg3LDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpCit2b2lkIGFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X3JlbW92ZV9yZWZlcmVuY2UiLCBvYmplY3QpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X3JlbW92ZV9yZWZlcmVuY2UiLCBvYmplY3QpOwogCiAJLyoKIAkgKiBBbGxvdyBhIE5VTEwgcG9pbnRlciB0byBiZSBwYXNzZWQgaW4sIGp1c3QgaWdub3JlIGl0LiAgVGhpcyBzYXZlcwpAQCAtNjk3LDI3ICs1OTgsMjUgQEAKIAkgKgogCSAqLwogCWlmICghb2JqZWN0IHx8Ci0JCShBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpKSB7CisJICAgIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkpIHsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCiAJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIG9iamVjdCAqLwogCi0JaWYgKCFhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdCAob2JqZWN0KSkgeworCWlmICghYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3Qob2JqZWN0KSkgewogCQlyZXR1cm5fVk9JRDsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJIk9iaiAlcCBDdXJyZW50IFJlZnM9JVggW1RvIEJlIERlY3JlbWVudGVkXVxuIiwKLQkJb2JqZWN0LCBvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJICAiT2JqICVwIEN1cnJlbnQgUmVmcz0lWCBbVG8gQmUgRGVjcmVtZW50ZWRdXG4iLAorCQkJICBvYmplY3QsIG9iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCkpOwogCiAJLyoKIAkgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCwgYW5kIG9ubHkgYWN0dWFsbHkgZGVsZXRlIHRoZSBvYmplY3QKIAkgKiBpZiB0aGUgcmVmZXJlbmNlIGNvdW50IGJlY29tZXMgMC4gIChNdXN0IGFsc28gZGVjcmVtZW50IHRoZSByZWYgY291bnQKIAkgKiBvZiBhbGwgc3Vib2JqZWN0cyEpCiAJICovCi0JKHZvaWQpIGFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UgKG9iamVjdCwgUkVGX0RFQ1JFTUVOVCk7CisJKHZvaWQpYWNwaV91dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZShvYmplY3QsIFJFRl9ERUNSRU1FTlQpOwogCXJldHVybl9WT0lEOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRldmFsLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jCmluZGV4IDAwMDQ2ZGQuLjdiODFkNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRldmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYwpAQCAtNDEsMjggKzQxLDIwIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInV0ZXZhbCIpCitBQ1BJX01PRFVMRV9OQU1FKCJ1dGV2YWwiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyB2b2lkCi1hY3BpX3V0X2NvcHlfaWRfc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0aW5hdGlvbiwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzb3VyY2UsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKTsKK2FjcGlfdXRfY29weV9pZF9zdHJpbmcoY2hhciAqZGVzdGluYXRpb24sIGNoYXIgKnNvdXJjZSwgYWNwaV9zaXplIG1heF9sZW5ndGgpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfdHJhbnNsYXRlX29uZV9jaWQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWQgICAgICAgKm9uZV9jaWQpOwotCithY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICBzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkICpvbmVfY2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC03NywzNyArNjksMzMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF9vc2lfaW1wbGVtZW50YXRpb24gKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX3V0X29zaV9pbXBsZW1lbnRhdGlvbihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnN0cmluZ19kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzdHJpbmdfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKKwlhY3BpX25hdGl2ZV91aW50IGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9vc2lfaW1wbGVtZW50YXRpb24iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X29zaV9pbXBsZW1lbnRhdGlvbiIpOwogCiAJLyogVmFsaWRhdGUgdGhlIHN0cmluZyBpbnB1dCBhcmd1bWVudCAqLwogCiAJc3RyaW5nX2Rlc2MgPSB3YWxrX3N0YXRlLT5hcmd1bWVudHNbMF0ub2JqZWN0OwogCWlmICghc3RyaW5nX2Rlc2MgfHwgKHN0cmluZ19kZXNjLT5jb21tb24udHlwZSAhPSBBQ1BJX1RZUEVfU1RSSU5HKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiAJfQogCiAJLyogQ3JlYXRlIGEgcmV0dXJuIG9iamVjdCAoRGVmYXVsdCB2YWx1ZSA9IDApICovCiAKLQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogQ29tcGFyZSBpbnB1dCBzdHJpbmcgdG8gdGFibGUgb2Ygc3VwcG9ydGVkIHN0cmluZ3MgKi8KIAogCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9PU0lfU1RSSU5HUzsgaSsrKSB7Ci0JCWlmICghQUNQSV9TVFJDTVAgKHN0cmluZ19kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQkgICAoY2hhciAqKSBhY3BpX2dibF92YWxpZF9vc2lfc3RyaW5nc1tpXSkpIHsKKwkJaWYgKCFBQ1BJX1NUUkNNUChzdHJpbmdfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCisJCQkJIChjaGFyICopYWNwaV9nYmxfdmFsaWRfb3NpX3N0cmluZ3NbaV0pKSB7CiAJCQkvKiBUaGlzIHN0cmluZyBpcyBzdXBwb3J0ZWQgKi8KIAogCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSAweEZGRkZGRkZGOwpAQCAtMTE2LDEwICsxMDQsOSBAQAogCX0KIAogCXdhbGtfc3RhdGUtPnJldHVybl9kZXNjID0gcmV0dXJuX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9DVFJMX1RFUk1JTkFURSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfVEVSTUlOQVRFKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V2YWx1YXRlX29iamVjdApAQCAtMTQwLDE5ICsxMjcsMTYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcHJlZml4X25vZGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3JldHVybl9idHlwZXMsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9kZXNjKQorYWNwaV91dF9ldmFsdWF0ZV9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAorCQkJY2hhciAqcGF0aCwKKwkJCXUzMiBleHBlY3RlZF9yZXR1cm5fYnR5cGVzLAorCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9kZXNjKQogewotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgaW5mbzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl9idHlwZTsKKwlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyBpbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgcmV0dXJuX2J0eXBlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfZXZhbHVhdGVfb2JqZWN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9ldmFsdWF0ZV9vYmplY3QiKTsKIAogCWluZm8ubm9kZSA9IHByZWZpeF9ub2RlOwogCWluZm8ucGFyYW1ldGVycyA9IE5VTEw7CkBAIC0xNjAsMzYgKzE0NCwzOCBAQAogCiAJLyogRXZhbHVhdGUgdGhlIG9iamVjdC9tZXRob2QgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKHBhdGgsICZpbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZShwYXRoLCAmaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiWyU0LjRzLiVzXSB3YXMgbm90IGZvdW5kXG4iLAotCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocHJlZml4X25vZGUpLCBwYXRoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX1JFUE9SVF9NRVRIT0RfRVJST1IgKCJNZXRob2QgZXhlY3V0aW9uIGZhaWxlZCIsCi0JCQkJcHJlZml4X25vZGUsIHBhdGgsIHN0YXR1cyk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCSAgIlslNC40cy4lc10gd2FzIG5vdCBmb3VuZFxuIiwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocHJlZml4X25vZGUpLAorCQkJCQkgIHBhdGgpKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfUkVQT1JUX01FVEhPRF9FUlJPUigiTWV0aG9kIGV4ZWN1dGlvbiBmYWlsZWQiLAorCQkJCQkJIHByZWZpeF9ub2RlLCBwYXRoLCBzdGF0dXMpOwogCQl9CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBEaWQgd2UgZ2V0IGEgcmV0dXJuIG9iamVjdD8gKi8KIAogCWlmICghaW5mby5yZXR1cm5fb2JqZWN0KSB7CiAJCWlmIChleHBlY3RlZF9yZXR1cm5fYnR5cGVzKSB7Ci0JCQlBQ1BJX1JFUE9SVF9NRVRIT0RfRVJST1IgKCJObyBvYmplY3Qgd2FzIHJldHVybmVkIGZyb20iLAotCQkJCXByZWZpeF9ub2RlLCBwYXRoLCBBRV9OT1RfRVhJU1QpOworCQkJQUNQSV9SRVBPUlRfTUVUSE9EX0VSUk9SKCJObyBvYmplY3Qgd2FzIHJldHVybmVkIGZyb20iLAorCQkJCQkJIHByZWZpeF9ub2RlLCBwYXRoLAorCQkJCQkJIEFFX05PVF9FWElTVCk7CiAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCQl9CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogTWFwIHRoZSByZXR1cm4gb2JqZWN0IHR5cGUgdG8gdGhlIGJpdG1hcHBlZCB0eXBlICovCiAKLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChpbmZvLnJldHVybl9vYmplY3QpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbmZvLnJldHVybl9vYmplY3QpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAkJcmV0dXJuX2J0eXBlID0gQUNQSV9CVFlQRV9JTlRFR0VSOwogCQlicmVhazsKQEAgLTIxMSw0MSArMTk3LDQxIEBACiAJCWJyZWFrOwogCX0KIAotCWlmICgoYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKSAmJgotCQkoIWV4cGVjdGVkX3JldHVybl9idHlwZXMpKSB7CisJaWYgKChhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2spICYmICghZXhwZWN0ZWRfcmV0dXJuX2J0eXBlcykpIHsKIAkJLyoKIAkJICogV2UgcmVjZWl2ZWQgYSByZXR1cm4gb2JqZWN0LCBidXQgb25lIHdhcyBub3QgZXhwZWN0ZWQuICBUaGlzIGNhbgogCQkgKiBoYXBwZW4gZnJlcXVlbnRseSBpZiB0aGUgImltcGxpY2l0IHJldHVybiIgZmVhdHVyZSBpcyBlbmFibGVkLgogCQkgKiBKdXN0IGRlbGV0ZSB0aGUgcmV0dXJuIG9iamVjdCBhbmQgcmV0dXJuIEFFX09LLgogCQkgKi8KLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChpbmZvLnJldHVybl9vYmplY3QpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8ucmV0dXJuX29iamVjdCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogSXMgdGhlIHJldHVybiBvYmplY3Qgb25lIG9mIHRoZSBleHBlY3RlZCB0eXBlcz8gKi8KIAogCWlmICghKGV4cGVjdGVkX3JldHVybl9idHlwZXMgJiByZXR1cm5fYnR5cGUpKSB7Ci0JCUFDUElfUkVQT1JUX01FVEhPRF9FUlJPUiAoIlJldHVybiBvYmplY3QgdHlwZSBpcyBpbmNvcnJlY3QiLAotCQkJcHJlZml4X25vZGUsIHBhdGgsIEFFX1RZUEUpOworCQlBQ1BJX1JFUE9SVF9NRVRIT0RfRVJST1IoIlJldHVybiBvYmplY3QgdHlwZSBpcyBpbmNvcnJlY3QiLAorCQkJCQkgcHJlZml4X25vZGUsIHBhdGgsIEFFX1RZUEUpOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlR5cGUgcmV0dXJuZWQgZnJvbSAlcyB3YXMgaW5jb3JyZWN0OiAlcywgZXhwZWN0ZWQgQnR5cGVzOiAlWFxuIiwKLQkJCXBhdGgsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKGluZm8ucmV0dXJuX29iamVjdCksCi0JCQlleHBlY3RlZF9yZXR1cm5fYnR5cGVzKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVHlwZSByZXR1cm5lZCBmcm9tICVzIHdhcyBpbmNvcnJlY3Q6ICVzLCBleHBlY3RlZCBCdHlwZXM6ICVYXG4iLAorCQkJCSAgcGF0aCwKKwkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoaW5mby4KKwkJCQkJCQkgICAgICAgcmV0dXJuX29iamVjdCksCisJCQkJICBleHBlY3RlZF9yZXR1cm5fYnR5cGVzKSk7CiAKIAkJLyogT24gZXJyb3IgZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIHJldHVybiBvYmplY3QgKi8KIAotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGluZm8ucmV0dXJuX29iamVjdCk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfVFlQRSk7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShpbmZvLnJldHVybl9vYmplY3QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiAJfQogCiAJLyogT2JqZWN0IHR5cGUgaXMgT0ssIHJldHVybiBpdCAqLwogCiAJKnJldHVybl9kZXNjID0gaW5mby5yZXR1cm5fb2JqZWN0OwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdApAQCAtMjY0LDIyICsyNTAsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3RfbmFtZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpkZXZpY2Vfbm9kZSwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICphZGRyZXNzKQorYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdChjaGFyICpvYmplY3RfbmFtZSwKKwkJCQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCisJCQkJYWNwaV9pbnRlZ2VyICogYWRkcmVzcykKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0Iik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChkZXZpY2Vfbm9kZSwgb2JqZWN0X25hbWUsCi0JCQkgQUNQSV9CVFlQRV9JTlRFR0VSLCAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KGRldmljZV9ub2RlLCBvYmplY3RfbmFtZSwKKwkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiwgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogR2V0IHRoZSByZXR1cm5lZCBJbnRlZ2VyICovCkBAIC0yODgsMTEgKzI3MSwxMCBAQAogCiAJLyogT24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIHJldHVybiBvYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9pZF9zdHJpbmcKQEAgLTMxMCwxMCArMjkyLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1hY3BpX3V0X2NvcHlfaWRfc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0aW5hdGlvbiwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzb3VyY2UsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKQorYWNwaV91dF9jb3B5X2lkX3N0cmluZyhjaGFyICpkZXN0aW5hdGlvbiwgY2hhciAqc291cmNlLCBhY3BpX3NpemUgbWF4X2xlbmd0aCkKIHsKIAogCS8qCkBAIC0zMjgsMTAgKzMwNyw5IEBACiAKIAkvKiBEbyB0aGUgYWN0dWFsIGNvcHkgKi8KIAotCUFDUElfU1RSTkNQWSAoZGVzdGluYXRpb24sIHNvdXJjZSwgbWF4X2xlbmd0aCk7CisJQUNQSV9TVFJOQ1BZKGRlc3RpbmF0aW9uLCBzb3VyY2UsIG1heF9sZW5ndGgpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9ISUQKQEAgLTM0OSw0MiArMzI3LDM5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX0hJRCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0Jc3RydWN0IGFjcGlfZGV2aWNlX2lkICAgICAgICAgICAqaGlkKQorYWNwaV91dF9leGVjdXRlX0hJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCisJCSAgICBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmhpZCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9leGVjdXRlX0hJRCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2V4ZWN1dGVfSElEIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX0hJRCwKLQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIgfCBBQ1BJX0JUWVBFX1NUUklORywgJm9ial9kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX0hJRCwKKwkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HLAorCQkJCQkgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCS8qIENvbnZlcnQgdGhlIE51bWVyaWMgSElEIHRvIHN0cmluZyAqLwogCi0JCWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcgKCh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlLCBoaWQtPnZhbHVlKTsKLQl9Ci0JZWxzZSB7CisJCWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcoKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCisJCQkJCSAgaGlkLT52YWx1ZSk7CisJfSBlbHNlIHsKIAkJLyogQ29weSB0aGUgU3RyaW5nIEhJRCBmcm9tIHRoZSByZXR1cm5lZCBvYmplY3QgKi8KIAotCQlhY3BpX3V0X2NvcHlfaWRfc3RyaW5nIChoaWQtPnZhbHVlLCBvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJc2l6ZW9mIChoaWQtPnZhbHVlKSk7CisJCWFjcGlfdXRfY29weV9pZF9zdHJpbmcoaGlkLT52YWx1ZSwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICAgICBzaXplb2YoaGlkLT52YWx1ZSkpOwogCX0KIAogCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkCkBAIC00MDMsMTggKzM3OCwxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkICAgICAgICpvbmVfY2lkKQorYWNwaV91dF90cmFuc2xhdGVfb25lX2NpZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZCAqb25lX2NpZCkKIHsKIAotCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCiAJCS8qIENvbnZlcnQgdGhlIE51bWVyaWMgQ0lEIHRvIHN0cmluZyAqLwogCi0JCWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcgKCh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlLCBvbmVfY2lkLT52YWx1ZSk7CisJCWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcoKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCisJCQkJCSAgb25lX2NpZC0+dmFsdWUpOwogCQlyZXR1cm4gKEFFX09LKTsKIAogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKQEAgLTQyNSw4ICszOTksOCBAQAogCiAJCS8qIENvcHkgdGhlIFN0cmluZyBDSUQgZnJvbSB0aGUgcmV0dXJuZWQgb2JqZWN0ICovCiAKLQkJYWNwaV91dF9jb3B5X2lkX3N0cmluZyAob25lX2NpZC0+dmFsdWUsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQlBQ1BJX01BWF9DSURfTEVOR1RIKTsKKwkJYWNwaV91dF9jb3B5X2lkX3N0cmluZyhvbmVfY2lkLT52YWx1ZSwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICAgICBBQ1BJX01BWF9DSURfTEVOR1RIKTsKIAkJcmV0dXJuIChBRV9PSyk7CiAKIAlkZWZhdWx0OgpAQCAtNDM1LDcgKzQwOSw2IEBACiAJfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9DSUQKQEAgLTQ1Myw0NSArNDI2LDQyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX0NJRCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0Jc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICoqcmV0dXJuX2NpZF9saXN0KQorYWNwaV91dF9leGVjdXRlX0NJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqIGRldmljZV9ub2RlLAorCQkgICAgc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICoqIHJldHVybl9jaWRfbGlzdCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGNvdW50OworCXUzMiBzaXplOwogCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkX2xpc3Q7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOworCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2V4ZWN1dGVfQ0lEIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9leGVjdXRlX0NJRCIpOwogCiAJLyogRXZhbHVhdGUgdGhlIF9DSUQgbWV0aG9kIGZvciB0aGlzIGRldmljZSAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QgKGRldmljZV9ub2RlLCBNRVRIT0RfTkFNRV9fQ0lELAotCQkJIEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HIHwgQUNQSV9CVFlQRV9QQUNLQUdFLAotCQkJICZvYmpfZGVzYyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlX25vZGUsIE1FVEhPRF9OQU1FX19DSUQsCisJCQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIgfCBBQ1BJX0JUWVBFX1NUUklORworCQkJCQkgfCBBQ1BJX0JUWVBFX1BBQ0tBR0UsICZvYmpfZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEdldCB0aGUgbnVtYmVyIG9mIF9DSURzIHJldHVybmVkICovCiAKIAljb3VudCA9IDE7Ci0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CiAJCWNvdW50ID0gb2JqX2Rlc2MtPnBhY2thZ2UuY291bnQ7CiAJfQogCiAJLyogQWxsb2NhdGUgYSB3b3JzdC1jYXNlIGJ1ZmZlciBmb3IgdGhlIF9DSURzICovCiAKLQlzaXplID0gKCgoY291bnQgLSAxKSAqIHNpemVvZiAoc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZCkpICsKLQkJCSAgIHNpemVvZiAoc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0KSk7CisJc2l6ZSA9ICgoKGNvdW50IC0gMSkgKiBzaXplb2Yoc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZCkpICsKKwkJc2l6ZW9mKHN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCkpOwogCi0JY2lkX2xpc3QgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKChhY3BpX3NpemUpIHNpemUpOworCWNpZF9saXN0ID0gQUNQSV9NRU1fQ0FMTE9DQVRFKChhY3BpX3NpemUpIHNpemUpOwogCWlmICghY2lkX2xpc3QpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBJbml0IENJRCBsaXN0ICovCkBAIC01MDgsMzkgKzQ3OCwzOCBAQAogCiAJLyogVGhlIF9DSUQgb2JqZWN0IGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgQ0lEIG9yIGEgcGFja2FnZSAobGlzdCkgb2YgQ0lEcyAqLwogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CiAJCS8qIFRyYW5zbGF0ZSBlYWNoIHBhY2thZ2UgZWxlbWVudCAqLwogCiAJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkIChvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSwKLQkJCQkJICAmY2lkX2xpc3QtPmlkW2ldKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV91dF90cmFuc2xhdGVfb25lX2NpZChvYmpfZGVzYy0+cGFja2FnZS4KKwkJCQkJCSAgICAgIGVsZW1lbnRzW2ldLAorCQkJCQkJICAgICAgJmNpZF9saXN0LT5pZFtpXSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBPbmx5IG9uZSBDSUQsIHRyYW5zbGF0ZSB0byBhIHN0cmluZyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfdXRfdHJhbnNsYXRlX29uZV9jaWQgKG9ial9kZXNjLCBjaWRfbGlzdC0+aWQpOworCQlzdGF0dXMgPSBhY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkKG9ial9kZXNjLCBjaWRfbGlzdC0+aWQpOwogCX0KIAogCS8qIENsZWFudXAgb24gZXJyb3IgKi8KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9NRU1fRlJFRSAoY2lkX2xpc3QpOwotCX0KLQllbHNlIHsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9NRU1fRlJFRShjaWRfbGlzdCk7CisJfSBlbHNlIHsKIAkJKnJldHVybl9jaWRfbGlzdCA9IGNpZF9saXN0OwogCX0KIAogCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSBfQ0lEIHJldHVybiBvYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9VSUQKQEAgLTU1OCw0MiArNTI3LDM5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX1VJRCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0Jc3RydWN0IGFjcGlfZGV2aWNlX2lkICAgICAgICAgICAqdWlkKQorYWNwaV91dF9leGVjdXRlX1VJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCisJCSAgICBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKnVpZCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9leGVjdXRlX1VJRCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2V4ZWN1dGVfVUlEIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX1VJRCwKLQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIgfCBBQ1BJX0JUWVBFX1NUUklORywgJm9ial9kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX1VJRCwKKwkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HLAorCQkJCQkgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCS8qIENvbnZlcnQgdGhlIE51bWVyaWMgVUlEIHRvIHN0cmluZyAqLwogCi0JCWFjcGlfZXhfdW5zaWduZWRfaW50ZWdlcl90b19zdHJpbmcgKG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlLCB1aWQtPnZhbHVlKTsKLQl9Ci0JZWxzZSB7CisJCWFjcGlfZXhfdW5zaWduZWRfaW50ZWdlcl90b19zdHJpbmcob2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCisJCQkJCQkgICB1aWQtPnZhbHVlKTsKKwl9IGVsc2UgewogCQkvKiBDb3B5IHRoZSBTdHJpbmcgVUlEIGZyb20gdGhlIHJldHVybmVkIG9iamVjdCAqLwogCi0JCWFjcGlfdXRfY29weV9pZF9zdHJpbmcgKHVpZC0+dmFsdWUsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQlzaXplb2YgKHVpZC0+dmFsdWUpKTsKKwkJYWNwaV91dF9jb3B5X2lkX3N0cmluZyh1aWQtPnZhbHVlLCBvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCisJCQkJICAgICAgIHNpemVvZih1aWQtPnZhbHVlKSk7CiAJfQogCiAJLyogT24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIHJldHVybiBvYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9TVEEKQEAgLTYxMSwzMCArNTc3LDI2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX1NUQSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmxhZ3MpCithY3BpX3V0X2V4ZWN1dGVfU1RBKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwgdTMyICogZmxhZ3MpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfZXhlY3V0ZV9TVEEiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9leGVjdXRlX1NUQSIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoZGV2aWNlX25vZGUsIE1FVEhPRF9OQU1FX19TVEEsCi0JCQkgQUNQSV9CVFlQRV9JTlRFR0VSLCAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX1NUQSwKKwkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiwgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJaWYgKEFFX05PVF9GT1VORCA9PSBzdGF0dXMpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkJIl9TVEEgb24gJTQuNHMgd2FzIG5vdCBmb3VuZCwgYXNzdW1pbmcgZGV2aWNlIGlzIHByZXNlbnRcbiIsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChkZXZpY2Vfbm9kZSkpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkJICAiX1NUQSBvbiAlNC40cyB3YXMgbm90IGZvdW5kLCBhc3N1bWluZyBkZXZpY2UgaXMgcHJlc2VudFxuIiwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUoZGV2aWNlX25vZGUpKSk7CiAKIAkJCSpmbGFncyA9IDB4MEY7CiAJCQlzdGF0dXMgPSBBRV9PSzsKIAkJfQogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogRXh0cmFjdCB0aGUgc3RhdHVzIGZsYWdzICovCkBAIC02NDMsMTEgKzYwNSwxMCBAQAogCiAJLyogT24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIHJldHVybiBvYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9TeGRzCkBAIC02NjUsNDQgKzYyNiw0NSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfZXhlY3V0ZV9zeGRzICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpkZXZpY2Vfbm9kZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoaWdoZXN0KQorYWNwaV91dF9leGVjdXRlX3N4ZHMoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRldmljZV9ub2RlLCB1OCAqIGhpZ2hlc3QpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2V4ZWN1dGVfU3hkcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfZXhlY3V0ZV9TeGRzIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCWhpZ2hlc3RbaV0gPSAweEZGOwotCQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoZGV2aWNlX25vZGUsCi0JCQkJIChjaGFyICopIGFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzW2ldLAotCQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIsICZvYmpfZGVzYyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlX25vZGUsCisJCQkJCQkgKGNoYXIgKikKKwkJCQkJCSBhY3BpX2dibF9oaWdoZXN0X2RzdGF0ZV9uYW1lcworCQkJCQkJIFtpXSwgQUNQSV9CVFlQRV9JTlRFR0VSLAorCQkJCQkJICZvYmpfZGVzYyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJaWYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJCQkiJXMgb24gRGV2aWNlICU0LjRzLCAlc1xuIiwKLQkJCQkJKGNoYXIgKikgYWNwaV9nYmxfaGlnaGVzdF9kc3RhdGVfbmFtZXNbaV0sCi0JCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAoZGV2aWNlX25vZGUpLAotCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCQkgICIlcyBvbiBEZXZpY2UgJTQuNHMsICVzXG4iLAorCQkJCQkJICAoY2hhciAqKQorCQkJCQkJICBhY3BpX2dibF9oaWdoZXN0X2RzdGF0ZV9uYW1lcworCQkJCQkJICBbaV0sCisJCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZQorCQkJCQkJICAoZGV2aWNlX25vZGUpLAorCQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24KKwkJCQkJCSAgKHN0YXR1cykpKTsKIAotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCS8qIEV4dHJhY3QgdGhlIERzdGF0ZSB2YWx1ZSAqLwogCiAJCQloaWdoZXN0W2ldID0gKHU4KSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKIAogCQkJLyogRGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCiAKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJfQogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMKaW5kZXggNDE0NjAxOS4uMzk5ZTY0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRnbG9iYWwuYwpAQCAtNDgsOCArNDgsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dGdsb2JhbCIpCi0KK0FDUElfTU9EVUxFX05BTUUoInV0Z2xvYmFsIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MywxNyArNjIsMTIgQEAKICAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgYW4gQUNQSSBleGNlcHRpb24gaW50byBhbiBBU0NJSSBzdHJpbmcuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3QgY2hhciAqCi1hY3BpX2Zvcm1hdF9leGNlcHRpb24gKAotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKQorY29uc3QgY2hhciAqYWNwaV9mb3JtYXRfZXhjZXB0aW9uKGFjcGlfc3RhdHVzIHN0YXR1cykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN1Yl9zdGF0dXM7Ci0JY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqZXhjZXB0aW9uID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdWJfc3RhdHVzOworCWNvbnN0IGNoYXIgKmV4Y2VwdGlvbiA9IE5VTEw7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoImZvcm1hdF9leGNlcHRpb24iKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZm9ybWF0X2V4Y2VwdGlvbiIpOwogCiAJc3ViX3N0YXR1cyA9IChzdGF0dXMgJiB+QUVfQ09ERV9NQVNLKTsKIApAQCAtODEsMzUgKzc1LDM5IEBACiAJY2FzZSBBRV9DT0RFX0VOVklST05NRU5UQUw6CiAKIAkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9FTlZfTUFYKSB7Ci0JCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfZW52IFtzdWJfc3RhdHVzXTsKKwkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19lbnZbc3ViX3N0YXR1c107CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFFX0NPREVfUFJPR1JBTU1FUjoKIAogCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX1BHTV9NQVgpIHsKLQkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19wZ20gW3N1Yl9zdGF0dXMgLTFdOworCQkJZXhjZXB0aW9uID0KKwkJCSAgICBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfcGdtW3N1Yl9zdGF0dXMgLSAxXTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQUVfQ09ERV9BQ1BJX1RBQkxFUzoKIAogCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX1RCTF9NQVgpIHsKLQkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc190YmwgW3N1Yl9zdGF0dXMgLTFdOworCQkJZXhjZXB0aW9uID0KKwkJCSAgICBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfdGJsW3N1Yl9zdGF0dXMgLSAxXTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQUVfQ09ERV9BTUw6CiAKIAkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9BTUxfTUFYKSB7Ci0JCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfYW1sIFtzdWJfc3RhdHVzIC0xXTsKKwkJCWV4Y2VwdGlvbiA9CisJCQkgICAgYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2FtbFtzdWJfc3RhdHVzIC0gMV07CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFFX0NPREVfQ09OVFJPTDoKIAogCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX0NUUkxfTUFYKSB7Ci0JCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfY3RybCBbc3ViX3N0YXR1cyAtMV07CisJCQlleGNlcHRpb24gPQorCQkJICAgIGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19jdHJsW3N1Yl9zdGF0dXMgLSAxXTsKIAkJfQogCQlicmVhazsKIApAQCAtMTIwLDE2ICsxMTgsMTUgQEAKIAlpZiAoIWV4Y2VwdGlvbikgewogCQkvKiBFeGNlcHRpb24gY29kZSB3YXMgbm90IHJlY29nbml6ZWQgKi8KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmtub3duIGV4Y2VwdGlvbiBjb2RlOiAweCU4LjhYXG4iLCBzdGF0dXMpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbmtub3duIGV4Y2VwdGlvbiBjb2RlOiAweCU4LjhYXG4iLCBzdGF0dXMpKTsKIAotCQlyZXR1cm4gKChjb25zdCBjaGFyICopICJVTktOT1dOX1NUQVRVU19DT0RFIik7CisJCXJldHVybiAoKGNvbnN0IGNoYXIgKikiVU5LTk9XTl9TVEFUVVNfQ09ERSIpOwogCX0KIAotCXJldHVybiAoKGNvbnN0IGNoYXIgKikgZXhjZXB0aW9uKTsKKwlyZXR1cm4gKChjb25zdCBjaGFyICopZXhjZXB0aW9uKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFN0YXRpYyBnbG9iYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uCkBAIC0xNDIsMzQgKzEzOSwzMiBAQAogICovCiAKIC8qIERlYnVnIHN3aXRjaCAtIGxldmVsIGFuZCB0cmFjZSBtYXNrICovCi11MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2RiZ19sZXZlbCA9IEFDUElfREVCVUdfREVGQVVMVDsKK3UzMiBhY3BpX2RiZ19sZXZlbCA9IEFDUElfREVCVUdfREVGQVVMVDsKIEVYUE9SVF9TWU1CT0woYWNwaV9kYmdfbGV2ZWwpOwogCiAvKiBEZWJ1ZyBzd2l0Y2ggLSBsYXllciAoY29tcG9uZW50KSBtYXNrICovCiAKLXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZGJnX2xheWVyID0gQUNQSV9DT01QT05FTlRfREVGQVVMVCB8IEFDUElfQUxMX0RSSVZFUlM7Cit1MzIgYWNwaV9kYmdfbGF5ZXIgPSBBQ1BJX0NPTVBPTkVOVF9ERUZBVUxUIHwgQUNQSV9BTExfRFJJVkVSUzsKIEVYUE9SVF9TWU1CT0woYWNwaV9kYmdfbGF5ZXIpOwotdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfbmVzdGluZ19sZXZlbCA9IDA7Ci0KK3UzMiBhY3BpX2dibF9uZXN0aW5nX2xldmVsID0gMDsKIAogLyogRGVidWdnZXIgZ2xvYmFscyAqLwogCi11OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9kYl90ZXJtaW5hdGVfdGhyZWFkcyA9IEZBTFNFOwotdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfYWJvcnRfbWV0aG9kID0gRkFMU0U7Ci11OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9tZXRob2RfZXhlY3V0aW5nID0gRkFMU0U7Cit1OCBhY3BpX2dibF9kYl90ZXJtaW5hdGVfdGhyZWFkcyA9IEZBTFNFOwordTggYWNwaV9nYmxfYWJvcnRfbWV0aG9kID0gRkFMU0U7Cit1OCBhY3BpX2dibF9tZXRob2RfZXhlY3V0aW5nID0gRkFMU0U7CiAKIC8qIFN5c3RlbSBmbGFncyAqLwogCi11MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9zdGFydHVwX2ZsYWdzID0gMDsKK3UzMiBhY3BpX2dibF9zdGFydHVwX2ZsYWdzID0gMDsKIAogLyogU3lzdGVtIHN0YXJ0cyB1bmluaXRpYWxpemVkICovCiAKLXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX3NodXRkb3duID0gVFJVRTsKK3U4IGFjcGlfZ2JsX3NodXRkb3duID0gVFJVRTsKIAotY29uc3QgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGVjb2RlX3RvOGJpdCBbOF0gPSB7MSwyLDQsOCwxNiwzMiw2NCwxMjh9OworY29uc3QgdTggYWNwaV9nYmxfZGVjb2RlX3RvOGJpdFs4XSA9IHsgMSwgMiwgNCwgOCwgMTYsIDMyLCA2NCwgMTI4IH07CiAKLWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9zbGVlcF9zdGF0ZV9uYW1lc1tBQ1BJX1NfU1RBVEVfQ09VTlRdID0KLXsKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW0FDUElfU19TVEFURV9DT1VOVF0gPSB7CiAJIlxcX1MwXyIsCiAJIlxcX1MxXyIsCiAJIlxcX1MyXyIsCkBAIC0xNzgsOCArMTczLDcgQEAKIAkiXFxfUzVfIgogfTsKIAotY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzWzRdID0KLXsKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzWzRdID0gewogCSJfUzFEIiwKIAkiX1MyRCIsCiAJIl9TM0QiLApAQCAtMTkwLDggKzE4NCw3IEBACiAgKiBTdHJpbmdzIHN1cHBvcnRlZCBieSB0aGUgX09TSSBwcmVkZWZpbmVkIChpbnRlcm5hbCkgbWV0aG9kLgogICogV2hlbiBhZGRpbmcgc3RyaW5ncywgYmUgc3VyZSB0byB1cGRhdGUgQUNQSV9OVU1fT1NJX1NUUklOR1MuCiAgKi8KLWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF92YWxpZF9vc2lfc3RyaW5nc1tBQ1BJX05VTV9PU0lfU1RSSU5HU10gPQoteworY29uc3QgY2hhciAqYWNwaV9nYmxfdmFsaWRfb3NpX3N0cmluZ3NbQUNQSV9OVU1fT1NJX1NUUklOR1NdID0gewogCS8qIE9wZXJhdGluZyBTeXN0ZW0gVmVuZG9yIFN0cmluZ3MgKi8KIAogCSJMaW51eCIsCkBAIC0yMDksNyArMjAyLDYgQEAKIAkiRXh0ZW5kZWQgQWRkcmVzcyBTcGFjZSBEZXNjcmlwdG9yIgogfTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIE5hbWVzcGFjZSBnbG9iYWxzCkBAIC0yMjUsNzQgKzIxNyw3MCBAQAogICogMikgX1RaXyBpcyBkZWZpbmVkIHRvIGJlIGEgdGhlcm1hbCB6b25lIGluIG9yZGVyIHRvIGFsbG93IEFTTCBjb2RlIHRvCiAgKiAgICBwZXJmb3JtIGEgTm90aWZ5KCkgb3BlcmF0aW9uIG9uIGl0LgogICovCi1jb25zdCBzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzICAgICAgYWNwaV9nYmxfcHJlX2RlZmluZWRfbmFtZXNbXSA9Ci17IHsiX0dQRSIsICAgIEFDUElfVFlQRV9MT0NBTF9TQ09QRSwgICAgICBOVUxMfSwKLQl7Il9QUl8iLCAgICBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUsICAgICAgTlVMTH0sCi0JeyJfU0JfIiwgICAgQUNQSV9UWVBFX0RFVklDRSwgICAgICAgICAgIE5VTEx9LAotCXsiX1NJXyIsICAgIEFDUElfVFlQRV9MT0NBTF9TQ09QRSwgICAgICBOVUxMfSwKLQl7Il9UWl8iLCAgICBBQ1BJX1RZUEVfVEhFUk1BTCwgICAgICAgICAgTlVMTH0sCi0JeyJfUkVWIiwgICAgQUNQSV9UWVBFX0lOVEVHRVIsICAgICAgICAgIChjaGFyICopIEFDUElfQ0FfU1VQUE9SVF9MRVZFTH0sCi0JeyJfT1NfIiwgICAgQUNQSV9UWVBFX1NUUklORywgICAgICAgICAgIEFDUElfT1NfTkFNRX0sCi0JeyJfR0xfIiwgICAgQUNQSV9UWVBFX01VVEVYLCAgICAgICAgICAgIChjaGFyICopIDF9LAorY29uc3Qgc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyBhY3BpX2dibF9wcmVfZGVmaW5lZF9uYW1lc1tdID0KKyAgICB7IHsiX0dQRSIsIEFDUElfVFlQRV9MT0NBTF9TQ09QRSwgTlVMTH0sCit7Il9QUl8iLCBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUsIE5VTEx9LAoreyJfU0JfIiwgQUNQSV9UWVBFX0RFVklDRSwgTlVMTH0sCit7Il9TSV8iLCBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUsIE5VTEx9LAoreyJfVFpfIiwgQUNQSV9UWVBFX1RIRVJNQUwsIE5VTEx9LAoreyJfUkVWIiwgQUNQSV9UWVBFX0lOVEVHRVIsIChjaGFyICopQUNQSV9DQV9TVVBQT1JUX0xFVkVMfSwKK3siX09TXyIsIEFDUElfVFlQRV9TVFJJTkcsIEFDUElfT1NfTkFNRX0sCit7Il9HTF8iLCBBQ1BJX1RZUEVfTVVURVgsIChjaGFyICopMX0sCiAKICNpZiAhZGVmaW5lZCAoQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OKSB8fCBkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkKLQl7Il9PU0kiLCAgICBBQ1BJX1RZUEVfTUVUSE9ELCAgICAgICAgICAgKGNoYXIgKikgMX0sCit7Il9PU0kiLCBBQ1BJX1RZUEVfTUVUSE9ELCAoY2hhciAqKTF9LAogI2VuZGlmCiAKIAkvKiBUYWJsZSB0ZXJtaW5hdG9yICovCiAKLQl7TlVMTCwgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgTlVMTH0KK3tOVUxMLCBBQ1BJX1RZUEVfQU5ZLCBOVUxMfQogfTsKIAogLyoKICAqIFByb3BlcnRpZXMgb2YgdGhlIEFDUEkgT2JqZWN0IFR5cGVzLCBib3RoIGludGVybmFsIGFuZCBleHRlcm5hbC4KICAqIFRoZSB0YWJsZSBpcyBpbmRleGVkIGJ5IHZhbHVlcyBvZiBhY3BpX29iamVjdF90eXBlCiAgKi8KLWNvbnN0IHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9uc19wcm9wZXJ0aWVzW10gPQotewotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDAwIEFueSAgICAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAwMSBOdW1iZXIgICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMDIgU3RyaW5nICAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDAzIEJ1ZmZlciAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAwNCBQYWNrYWdlICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMDUgZmllbGRfdW5pdCAgICAgICAqLwotCUFDUElfTlNfTkVXU0NPUEUsICAgICAgICAgICAgICAgICAgIC8qIDA2IERldmljZSAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAwNyBFdmVudCAgICAgICAgICAgICovCi0JQUNQSV9OU19ORVdTQ09QRSwgICAgICAgICAgICAgICAgICAgLyogMDggTWV0aG9kICAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDA5IE11dGV4ICAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAxMCBSZWdpb24gICAgICAgICAgICovCi0JQUNQSV9OU19ORVdTQ09QRSwgICAgICAgICAgICAgICAgICAgLyogMTEgUG93ZXIgICAgICAgICAgICAqLwotCUFDUElfTlNfTkVXU0NPUEUsICAgICAgICAgICAgICAgICAgIC8qIDEyIFByb2Nlc3NvciAgICAgICAgKi8KLQlBQ1BJX05TX05FV1NDT1BFLCAgICAgICAgICAgICAgICAgICAvKiAxMyBUaGVybWFsICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMTQgYnVmZmVyX2ZpZWxkICAgICAqLwotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDE1IGRkYl9oYW5kbGUgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAxNiBEZWJ1ZyBPYmplY3QgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMTcgZGVmX2ZpZWxkICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDE4IGJhbmtfZmllbGQgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAxOSBpbmRleF9maWVsZCAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMjAgUmVmZXJlbmNlICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDIxIEFsaWFzICAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAyMiBtZXRob2RfYWxpYXMgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMjMgTm90aWZ5ICAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDI0IEFkZHJlc3MgSGFuZGxlciAgKi8KLQlBQ1BJX05TX05FV1NDT1BFIHwgQUNQSV9OU19MT0NBTCwgICAvKiAyNSBSZXNvdXJjZSBEZXNjICAgICovCi0JQUNQSV9OU19ORVdTQ09QRSB8IEFDUElfTlNfTE9DQUwsICAgLyogMjYgUmVzb3VyY2UgRmllbGQgICAqLwotCUFDUElfTlNfTkVXU0NPUEUsICAgICAgICAgICAgICAgICAgIC8qIDI3IFNjb3BlICAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAyOCBFeHRyYSAgICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMjkgRGF0YSAgICAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMICAgICAgICAgICAgICAgICAgICAgIC8qIDMwIEludmFsaWQgICAgICAgICAgKi8KK2NvbnN0IHU4IGFjcGlfZ2JsX25zX3Byb3BlcnRpZXNbXSA9IHsKKwlBQ1BJX05TX05PUk1BTCwJCS8qIDAwIEFueSAgICAgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDAxIE51bWJlciAgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDAyIFN0cmluZyAgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDAzIEJ1ZmZlciAgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDA0IFBhY2thZ2UgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDA1IGZpZWxkX3VuaXQgICAgICAgKi8KKwlBQ1BJX05TX05FV1NDT1BFLAkvKiAwNiBEZXZpY2UgICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwsCQkvKiAwNyBFdmVudCAgICAgICAgICAgICovCisJQUNQSV9OU19ORVdTQ09QRSwJLyogMDggTWV0aG9kICAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMDkgTXV0ZXggICAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTAgUmVnaW9uICAgICAgICAgICAqLworCUFDUElfTlNfTkVXU0NPUEUsCS8qIDExIFBvd2VyICAgICAgICAgICAgKi8KKwlBQ1BJX05TX05FV1NDT1BFLAkvKiAxMiBQcm9jZXNzb3IgICAgICAgICovCisJQUNQSV9OU19ORVdTQ09QRSwJLyogMTMgVGhlcm1hbCAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTQgYnVmZmVyX2ZpZWxkICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTUgZGRiX2hhbmRsZSAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTYgRGVidWcgT2JqZWN0ICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTcgZGVmX2ZpZWxkICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTggYmFua19maWVsZCAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTkgaW5kZXhfZmllbGQgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMjAgUmVmZXJlbmNlICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMjEgQWxpYXMgICAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMjIgbWV0aG9kX2FsaWFzICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMjMgTm90aWZ5ICAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMjQgQWRkcmVzcyBIYW5kbGVyICAqLworCUFDUElfTlNfTkVXU0NPUEUgfCBBQ1BJX05TX0xPQ0FMLAkvKiAyNSBSZXNvdXJjZSBEZXNjICAgICovCisJQUNQSV9OU19ORVdTQ09QRSB8IEFDUElfTlNfTE9DQUwsCS8qIDI2IFJlc291cmNlIEZpZWxkICAgKi8KKwlBQ1BJX05TX05FV1NDT1BFLAkvKiAyNyBTY29wZSAgICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwsCQkvKiAyOCBFeHRyYSAgICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwsCQkvKiAyOSBEYXRhICAgICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwJCS8qIDMwIEludmFsaWQgICAgICAgICAgKi8KIH07CiAKLQogLyogSGV4IHRvIEFTQ0lJIGNvbnZlcnNpb24gdGFibGUgKi8KIAotc3RhdGljIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfaGV4X3RvX2FzY2lpW10gPQotewotCScwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsCi0JJzgnLCc5JywnQScsJ0InLCdDJywnRCcsJ0UnLCdGJworc3RhdGljIGNvbnN0IGNoYXIgYWNwaV9nYmxfaGV4X3RvX2FzY2lpW10gPSB7CisJJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCisJJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhcgpAQCAtMzA3LDE2ICsyOTUsMTIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1jaGFyCi1hY3BpX3V0X2hleF90b19hc2NpaV9jaGFyICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGludGVnZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbikKK2NoYXIgYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhcihhY3BpX2ludGVnZXIgaW50ZWdlciwgdTMyIHBvc2l0aW9uKQogewogCiAJcmV0dXJuIChhY3BpX2dibF9oZXhfdG9fYXNjaWlbKGludGVnZXIgPj4gcG9zaXRpb24pICYgMHhGXSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBUYWJsZSBuYW1lIGdsb2JhbHMKQEAgLTMzMCw2NyArMzE0LDEzOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBhY3BpX3RhYmxlX2xpc3QgICAgICAgICAgICAgIGFjcGlfZ2JsX3RhYmxlX2xpc3RzW05VTV9BQ1BJX1RBQkxFX1RZUEVTXTsKK3N0cnVjdCBhY3BpX3RhYmxlX2xpc3QgYWNwaV9nYmxfdGFibGVfbGlzdHNbTlVNX0FDUElfVEFCTEVfVFlQRVNdOwogCi1zdHJ1Y3QgYWNwaV90YWJsZV9zdXBwb3J0ICAgICAgICAgICBhY3BpX2dibF90YWJsZV9kYXRhW05VTV9BQ1BJX1RBQkxFX1RZUEVTXSA9Ci17CitzdHJ1Y3QgYWNwaV90YWJsZV9zdXBwb3J0IGFjcGlfZ2JsX3RhYmxlX2RhdGFbTlVNX0FDUElfVEFCTEVfVFlQRVNdID0gewogCS8qKioqKioqKioqKiAgICBOYW1lLCAgIFNpZ25hdHVyZSwgR2xvYmFsIHR5cGVkIHBvaW50ZXIgICAgIFNpZ25hdHVyZSBzaXplLCAgICAgIFR5cGUgICAgICAgICAgICAgICAgICBIb3cgbWFueSBhbGxvd2VkPywgICAgQ29udGFpbnMgdmFsaWQgQU1MPyAqLwogCi0JLyogUlNEUCAwICovIHtSU0RQX05BTUUsIFJTRFBfU0lHLCBOVUxMLCAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChSU0RQX1NJRyktMSwgQUNQSV9UQUJMRV9ST09UICAgICB8IEFDUElfVEFCTEVfU0lOR0xFfSwKLQkvKiBEU0RUIDEgKi8ge0RTRFRfU0lHLCAgRFNEVF9TSUcsICh2b2lkICopICZhY3BpX2dibF9EU0RULCBzaXplb2YgKERTRFRfU0lHKS0xLCBBQ1BJX1RBQkxFX1NFQ09OREFSWXwgQUNQSV9UQUJMRV9TSU5HTEUgICB8IEFDUElfVEFCTEVfRVhFQ1VUQUJMRX0sCi0JLyogRkFEVCAyICovIHtGQURUX1NJRywgIEZBRFRfU0lHLCAodm9pZCAqKSAmYWNwaV9nYmxfRkFEVCwgc2l6ZW9mIChGQURUX1NJRyktMSwgQUNQSV9UQUJMRV9QUklNQVJZICB8IEFDUElfVEFCTEVfU0lOR0xFfSwKLQkvKiBGQUNTIDMgKi8ge0ZBQ1NfU0lHLCAgRkFDU19TSUcsICh2b2lkICopICZhY3BpX2dibF9GQUNTLCBzaXplb2YgKEZBQ1NfU0lHKS0xLCBBQ1BJX1RBQkxFX1NFQ09OREFSWXwgQUNQSV9UQUJMRV9TSU5HTEV9LAotCS8qIFBTRFQgNCAqLyB7UFNEVF9TSUcsICBQU0RUX1NJRywgTlVMTCwgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoUFNEVF9TSUcpLTEsIEFDUElfVEFCTEVfUFJJTUFSWSAgfCBBQ1BJX1RBQkxFX01VTFRJUExFIHwgQUNQSV9UQUJMRV9FWEVDVVRBQkxFfSwKLQkvKiBTU0RUIDUgKi8ge1NTRFRfU0lHLCAgU1NEVF9TSUcsIE5VTEwsICAgICAgICAgICAgICAgICAgICBzaXplb2YgKFNTRFRfU0lHKS0xLCBBQ1BJX1RBQkxFX1BSSU1BUlkgIHwgQUNQSV9UQUJMRV9NVUxUSVBMRSB8IEFDUElfVEFCTEVfRVhFQ1VUQUJMRX0sCi0JLyogWFNEVCA2ICovIHtYU0RUX1NJRywgIFhTRFRfU0lHLCBOVUxMLCAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChSU0RUX1NJRyktMSwgQUNQSV9UQUJMRV9ST09UICAgICB8IEFDUElfVEFCTEVfU0lOR0xFfSwKKwkvKiBSU0RQIDAgKi8ge1JTRFBfTkFNRSwgUlNEUF9TSUcsIE5VTEwsIHNpemVvZihSU0RQX1NJRykgLSAxLAorCQkgICAgICBBQ1BJX1RBQkxFX1JPT1QgfCBBQ1BJX1RBQkxFX1NJTkdMRX0KKwksCisJLyogRFNEVCAxICovIHtEU0RUX1NJRywgRFNEVF9TSUcsICh2b2lkICopJmFjcGlfZ2JsX0RTRFQsCisJCSAgICAgIHNpemVvZihEU0RUX1NJRykgLSAxLAorCQkgICAgICBBQ1BJX1RBQkxFX1NFQ09OREFSWSB8IEFDUElfVEFCTEVfU0lOR0xFIHwKKwkJICAgICAgQUNQSV9UQUJMRV9FWEVDVVRBQkxFfQorCSwKKwkvKiBGQURUIDIgKi8ge0ZBRFRfU0lHLCBGQURUX1NJRywgKHZvaWQgKikmYWNwaV9nYmxfRkFEVCwKKwkJICAgICAgc2l6ZW9mKEZBRFRfU0lHKSAtIDEsCisJCSAgICAgIEFDUElfVEFCTEVfUFJJTUFSWSB8IEFDUElfVEFCTEVfU0lOR0xFfQorCSwKKwkvKiBGQUNTIDMgKi8ge0ZBQ1NfU0lHLCBGQUNTX1NJRywgKHZvaWQgKikmYWNwaV9nYmxfRkFDUywKKwkJICAgICAgc2l6ZW9mKEZBQ1NfU0lHKSAtIDEsCisJCSAgICAgIEFDUElfVEFCTEVfU0VDT05EQVJZIHwgQUNQSV9UQUJMRV9TSU5HTEV9CisJLAorCS8qIFBTRFQgNCAqLyB7UFNEVF9TSUcsIFBTRFRfU0lHLCBOVUxMLCBzaXplb2YoUFNEVF9TSUcpIC0gMSwKKwkJICAgICAgQUNQSV9UQUJMRV9QUklNQVJZIHwgQUNQSV9UQUJMRV9NVUxUSVBMRSB8CisJCSAgICAgIEFDUElfVEFCTEVfRVhFQ1VUQUJMRX0KKwksCisJLyogU1NEVCA1ICovIHtTU0RUX1NJRywgU1NEVF9TSUcsIE5VTEwsIHNpemVvZihTU0RUX1NJRykgLSAxLAorCQkgICAgICBBQ1BJX1RBQkxFX1BSSU1BUlkgfCBBQ1BJX1RBQkxFX01VTFRJUExFIHwKKwkJICAgICAgQUNQSV9UQUJMRV9FWEVDVVRBQkxFfQorCSwKKwkvKiBYU0RUIDYgKi8ge1hTRFRfU0lHLCBYU0RUX1NJRywgTlVMTCwgc2l6ZW9mKFJTRFRfU0lHKSAtIDEsCisJCSAgICAgIEFDUElfVEFCTEVfUk9PVCB8IEFDUElfVEFCTEVfU0lOR0xFfQorCSwKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEV2ZW50IGFuZCBIYXJkd2FyZSBnbG9iYWxzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gICAgICAgYWNwaV9nYmxfYml0X3JlZ2lzdGVyX2luZm9bQUNQSV9OVU1fQklUUkVHXSA9Ci17CitzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyBhY3BpX2dibF9iaXRfcmVnaXN0ZXJfaW5mb1tBQ1BJX05VTV9CSVRSRUddID0gewogCS8qIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50IFJlZ2lzdGVyICAgICAgICAgICAgIFJlZ2lzdGVyIEJpdCBQb3NpdGlvbiAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBCaXQgTWFzayAgICAgICAqLwogCi0JLyogQUNQSV9CSVRSRUdfVElNRVJfU1RBVFVTICAgICAgICAgKi8gICB7QUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLCAgIEFDUElfQklUUE9TSVRJT05fVElNRVJfU1RBVFVTLCAgICAgICAgICBBQ1BJX0JJVE1BU0tfVElNRVJfU1RBVFVTfSwKLQkvKiBBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1NUQVRVUyAgICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsICAgQUNQSV9CSVRQT1NJVElPTl9CVVNfTUFTVEVSX1NUQVRVUywgICAgIEFDUElfQklUTUFTS19CVVNfTUFTVEVSX1NUQVRVU30sCi0JLyogQUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfU1RBVFVTICAgKi8gICB7QUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLCAgIEFDUElfQklUUE9TSVRJT05fR0xPQkFMX0xPQ0tfU1RBVFVTLCAgICBBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfU1RBVFVTfSwKLQkvKiBBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fU1RBVFVTICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsICAgQUNQSV9CSVRQT1NJVElPTl9QT1dFUl9CVVRUT05fU1RBVFVTLCAgIEFDUElfQklUTUFTS19QT1dFUl9CVVRUT05fU1RBVFVTfSwKLQkvKiBBQ1BJX0JJVFJFR19TTEVFUF9CVVRUT05fU1RBVFVTICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsICAgQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9CVVRUT05fU1RBVFVTLCAgIEFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fU1RBVFVTfSwKLQkvKiBBQ1BJX0JJVFJFR19SVF9DTE9DS19TVEFUVVMgICAgICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsICAgQUNQSV9CSVRQT1NJVElPTl9SVF9DTE9DS19TVEFUVVMsICAgICAgIEFDUElfQklUTUFTS19SVF9DTE9DS19TVEFUVVN9LAotCS8qIEFDUElfQklUUkVHX1dBS0VfU1RBVFVTICAgICAgICAgICovICAge0FDUElfUkVHSVNURVJfUE0xX1NUQVRVUywgICBBQ1BJX0JJVFBPU0lUSU9OX1dBS0VfU1RBVFVTLCAgICAgICAgICAgQUNQSV9CSVRNQVNLX1dBS0VfU1RBVFVTfSwKLQkvKiBBQ1BJX0JJVFJFR19QQ0lFWFBfV0FLRV9TVEFUVVMgICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsICAgQUNQSV9CSVRQT1NJVElPTl9QQ0lFWFBfV0FLRV9TVEFUVVMsICAgIEFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9TVEFUVVN9LAorCS8qIEFDUElfQklUUkVHX1RJTUVSX1NUQVRVUyAgICAgICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1RJTUVSX1NUQVRVUywKKwkJCQkJCUFDUElfQklUTUFTS19USU1FUl9TVEFUVVN9LAorCS8qIEFDUElfQklUUkVHX0JVU19NQVNURVJfU1RBVFVTICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX0JVU19NQVNURVJfU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRNQVNLX0JVU19NQVNURVJfU1RBVFVTfSwKKwkvKiBBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19TVEFUVVMgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfU1RBVFVTfSwKKwkvKiBBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fU1RBVFVTICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9QT1dFUl9CVVRUT05fU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9TVEFUVVN9LAorCS8qIEFDUElfQklUUkVHX1NMRUVQX0JVVFRPTl9TVEFUVVMgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0JVVFRPTl9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVE1BU0tfU0xFRVBfQlVUVE9OX1NUQVRVU30sCisJLyogQUNQSV9CSVRSRUdfUlRfQ0xPQ0tfU1RBVFVTICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fUlRfQ0xPQ0tfU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRNQVNLX1JUX0NMT0NLX1NUQVRVU30sCisJLyogQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMgICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fV0FLRV9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVE1BU0tfV0FLRV9TVEFUVVN9LAorCS8qIEFDUElfQklUUkVHX1BDSUVYUF9XQUtFX1NUQVRVUyAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1BDSUVYUF9XQUtFX1NUQVRVUywKKwkJCQkJCUFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9TVEFUVVN9LAogCi0JLyogQUNQSV9CSVRSRUdfVElNRVJfRU5BQkxFICAgICAgICAgKi8gICB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLCAgIEFDUElfQklUUE9TSVRJT05fVElNRVJfRU5BQkxFLCAgICAgICAgICBBQ1BJX0JJVE1BU0tfVElNRVJfRU5BQkxFfSwKLQkvKiBBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19FTkFCTEUgICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsICAgQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19FTkFCTEUsICAgIEFDUElfQklUTUFTS19HTE9CQUxfTE9DS19FTkFCTEV9LAotCS8qIEFDUElfQklUUkVHX1BPV0VSX0JVVFRPTl9FTkFCTEUgICovICAge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgICBBQ1BJX0JJVFBPU0lUSU9OX1BPV0VSX0JVVFRPTl9FTkFCTEUsICAgQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9FTkFCTEV9LAotCS8qIEFDUElfQklUUkVHX1NMRUVQX0JVVFRPTl9FTkFCTEUgICovICAge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgICBBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0JVVFRPTl9FTkFCTEUsICAgQUNQSV9CSVRNQVNLX1NMRUVQX0JVVFRPTl9FTkFCTEV9LAotCS8qIEFDUElfQklUUkVHX1JUX0NMT0NLX0VOQUJMRSAgICAgICovICAge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgICBBQ1BJX0JJVFBPU0lUSU9OX1JUX0NMT0NLX0VOQUJMRSwgICAgICAgQUNQSV9CSVRNQVNLX1JUX0NMT0NLX0VOQUJMRX0sCi0JLyogQUNQSV9CSVRSRUdfV0FLRV9FTkFCTEUgICAgICAgICAgKi8gICB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLCAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfSwKLQkvKiBBQ1BJX0JJVFJFR19QQ0lFWFBfV0FLRV9ESVNBQkxFICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsICAgQUNQSV9CSVRQT1NJVElPTl9QQ0lFWFBfV0FLRV9ESVNBQkxFLCAgIEFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9ESVNBQkxFfSwKKwkvKiBBQ1BJX0JJVFJFR19USU1FUl9FTkFCTEUgICAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9USU1FUl9FTkFCTEUsCisJCQkJCQlBQ1BJX0JJVE1BU0tfVElNRVJfRU5BQkxFfSwKKwkvKiBBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19FTkFCTEUgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19FTkFCTEUsCisJCQkJCQlBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfRU5BQkxFfSwKKwkvKiBBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fRU5BQkxFICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9QT1dFUl9CVVRUT05fRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9FTkFCTEV9LAorCS8qIEFDUElfQklUUkVHX1NMRUVQX0JVVFRPTl9FTkFCTEUgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0JVVFRPTl9FTkFCTEUsCisJCQkJCQlBQ1BJX0JJVE1BU0tfU0xFRVBfQlVUVE9OX0VOQUJMRX0sCisJLyogQUNQSV9CSVRSRUdfUlRfQ0xPQ0tfRU5BQkxFICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fUlRfQ0xPQ0tfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRNQVNLX1JUX0NMT0NLX0VOQUJMRX0sCisJLyogQUNQSV9CSVRSRUdfV0FLRV9FTkFCTEUgICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgMCwgMH0sCisJLyogQUNQSV9CSVRSRUdfUENJRVhQX1dBS0VfRElTQUJMRSAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fUENJRVhQX1dBS0VfRElTQUJMRSwKKwkJCQkJCUFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9ESVNBQkxFfSwKIAotCS8qIEFDUElfQklUUkVHX1NDSV9FTkFCTEUgICAgICAgICAgICovICAge0FDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsICBBQ1BJX0JJVFBPU0lUSU9OX1NDSV9FTkFCTEUsICAgICAgICAgICAgQUNQSV9CSVRNQVNLX1NDSV9FTkFCTEV9LAotCS8qIEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxEICAgICAgICovICAge0FDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsICBBQ1BJX0JJVFBPU0lUSU9OX0JVU19NQVNURVJfUkxELCAgICAgICAgQUNQSV9CSVRNQVNLX0JVU19NQVNURVJfUkxEfSwKLQkvKiBBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19SRUxFQVNFICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLCAgQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19SRUxFQVNFLCAgIEFDUElfQklUTUFTS19HTE9CQUxfTE9DS19SRUxFQVNFfSwKLQkvKiBBQ1BJX0JJVFJFR19TTEVFUF9UWVBFX0EgICAgICAgICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLCAgQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9UWVBFX1gsICAgICAgICAgIEFDUElfQklUTUFTS19TTEVFUF9UWVBFX1h9LAotCS8qIEFDUElfQklUUkVHX1NMRUVQX1RZUEVfQiAgICAgICAgICovICAge0FDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsICBBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX1RZUEVfWCwgICAgICAgICAgQUNQSV9CSVRNQVNLX1NMRUVQX1RZUEVfWH0sCi0JLyogQUNQSV9CSVRSRUdfU0xFRVBfRU5BQkxFICAgICAgICAgKi8gICB7QUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwgIEFDUElfQklUUE9TSVRJT05fU0xFRVBfRU5BQkxFLCAgICAgICAgICBBQ1BJX0JJVE1BU0tfU0xFRVBfRU5BQkxFfSwKKwkvKiBBQ1BJX0JJVFJFR19TQ0lfRU5BQkxFICAgICAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fU0NJX0VOQUJMRSwKKwkJCQkJCUFDUElfQklUTUFTS19TQ0lfRU5BQkxFfSwKKwkvKiBBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1JMRCAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fQlVTX01BU1RFUl9STEQsCisJCQkJCQlBQ1BJX0JJVE1BU0tfQlVTX01BU1RFUl9STER9LAorCS8qIEFDUElfQklUUkVHX0dMT0JBTF9MT0NLX1JFTEVBU0UgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19SRUxFQVNFLAorCQkJCQkJQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX1JFTEVBU0V9LAorCS8qIEFDUElfQklUUkVHX1NMRUVQX1RZUEVfQSAgICAgICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9UWVBFX1gsCisJCQkJCQlBQ1BJX0JJVE1BU0tfU0xFRVBfVFlQRV9YfSwKKwkvKiBBQ1BJX0JJVFJFR19TTEVFUF9UWVBFX0IgICAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fU0xFRVBfVFlQRV9YLAorCQkJCQkJQUNQSV9CSVRNQVNLX1NMRUVQX1RZUEVfWH0sCisJLyogQUNQSV9CSVRSRUdfU0xFRVBfRU5BQkxFICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0VOQUJMRSwKKwkJCQkJCUFDUElfQklUTUFTS19TTEVFUF9FTkFCTEV9LAogCi0JLyogQUNQSV9CSVRSRUdfQVJCX0RJUyAgICAgICAgICAgICAgKi8gICB7QUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTCwgIEFDUElfQklUUE9TSVRJT05fQVJCX0RJU0FCTEUsICAgICAgICAgICBBQ1BJX0JJVE1BU0tfQVJCX0RJU0FCTEV9CisJLyogQUNQSV9CSVRSRUdfQVJCX0RJUyAgICAgICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0yX0NPTlRST0wsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX0FSQl9ESVNBQkxFLAorCQkJCQkJQUNQSV9CSVRNQVNLX0FSQl9ESVNBQkxFfQogfTsKIAotCi1zdHJ1Y3QgYWNwaV9maXhlZF9ldmVudF9pbmZvICAgICAgICBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfTlVNX0ZJWEVEX0VWRU5UU10gPQotewotCS8qIEFDUElfRVZFTlRfUE1USU1FUiAgICAgICAqLyAge0FDUElfQklUUkVHX1RJTUVSX1NUQVRVUywgICAgICAgICAgQUNQSV9CSVRSRUdfVElNRVJfRU5BQkxFLCAgICAgICAgQUNQSV9CSVRNQVNLX1RJTUVSX1NUQVRVUywgICAgICAgICAgQUNQSV9CSVRNQVNLX1RJTUVSX0VOQUJMRX0sCi0JLyogQUNQSV9FVkVOVF9HTE9CQUwgICAgICAgICovICB7QUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfU1RBVFVTLCAgICBBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19FTkFCTEUsICBBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfU1RBVFVTLCAgICBBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfRU5BQkxFfSwKLQkvKiBBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTiAgKi8gIHtBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fU1RBVFVTLCAgIEFDUElfQklUUkVHX1BPV0VSX0JVVFRPTl9FTkFCTEUsIEFDUElfQklUTUFTS19QT1dFUl9CVVRUT05fU1RBVFVTLCAgIEFDUElfQklUTUFTS19QT1dFUl9CVVRUT05fRU5BQkxFfSwKLQkvKiBBQ1BJX0VWRU5UX1NMRUVQX0JVVFRPTiAgKi8gIHtBQ1BJX0JJVFJFR19TTEVFUF9CVVRUT05fU1RBVFVTLCAgIEFDUElfQklUUkVHX1NMRUVQX0JVVFRPTl9FTkFCTEUsIEFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fU1RBVFVTLCAgIEFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fRU5BQkxFfSwKLQkvKiBBQ1BJX0VWRU5UX1JUQyAgICAgICAgICAgKi8gIHtBQ1BJX0JJVFJFR19SVF9DTE9DS19TVEFUVVMsICAgICAgIEFDUElfQklUUkVHX1JUX0NMT0NLX0VOQUJMRSwgICAgIEFDUElfQklUTUFTS19SVF9DTE9DS19TVEFUVVMsICAgICAgIEFDUElfQklUTUFTS19SVF9DTE9DS19FTkFCTEV9LAorc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaW5mbyBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfTlVNX0ZJWEVEX0VWRU5UU10gPSB7CisJLyogQUNQSV9FVkVOVF9QTVRJTUVSICAgICAgICovIHtBQ1BJX0JJVFJFR19USU1FUl9TVEFUVVMsCisJCQkJCUFDUElfQklUUkVHX1RJTUVSX0VOQUJMRSwKKwkJCQkJQUNQSV9CSVRNQVNLX1RJTUVSX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRNQVNLX1RJTUVSX0VOQUJMRX0sCisJLyogQUNQSV9FVkVOVF9HTE9CQUwgICAgICAgICovIHtBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19TVEFUVVMsCisJCQkJCUFDUElfQklUUkVHX0dMT0JBTF9MT0NLX0VOQUJMRSwKKwkJCQkJQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX0VOQUJMRX0sCisJLyogQUNQSV9FVkVOVF9QT1dFUl9CVVRUT04gICovIHtBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fU1RBVFVTLAorCQkJCQlBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fRU5BQkxFLAorCQkJCQlBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9FTkFCTEV9LAorCS8qIEFDUElfRVZFTlRfU0xFRVBfQlVUVE9OICAqLyB7QUNQSV9CSVRSRUdfU0xFRVBfQlVUVE9OX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRSRUdfU0xFRVBfQlVUVE9OX0VOQUJMRSwKKwkJCQkJQUNQSV9CSVRNQVNLX1NMRUVQX0JVVFRPTl9TVEFUVVMsCisJCQkJCUFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fRU5BQkxFfSwKKwkvKiBBQ1BJX0VWRU5UX1JUQyAgICAgICAgICAgKi8ge0FDUElfQklUUkVHX1JUX0NMT0NLX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRSRUdfUlRfQ0xPQ0tfRU5BQkxFLAorCQkJCQlBQ1BJX0JJVE1BU0tfUlRfQ0xPQ0tfU1RBVFVTLAorCQkJCQlBQ1BJX0JJVE1BU0tfUlRfQ0xPQ0tfRU5BQkxFfSwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MDcsOCArNDYzLDcgQEAKIAogLyogUmVnaW9uIHR5cGUgZGVjb2RpbmcgKi8KIAotY29uc3QgY2hhciAgICAgICAgICAgICAgICAqYWNwaV9nYmxfcmVnaW9uX3R5cGVzW0FDUElfTlVNX1BSRURFRklORURfUkVHSU9OU10gPQoteworY29uc3QgY2hhciAqYWNwaV9nYmxfcmVnaW9uX3R5cGVzW0FDUElfTlVNX1BSRURFRklORURfUkVHSU9OU10gPSB7CiAvKiEgW0JlZ2luXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAoa2VlcCB0aGVzZSBBU0wgS2V5d29yZHMgYXMtaXMpICovCiAJIlN5c3RlbU1lbW9yeSIsCiAJIlN5c3RlbUlPIiwKQEAgLTQyMSwyNSArNDc2LDE4IEBACiAvKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCiB9OwogCi0KLWNoYXIgKgotYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VfaWQpCitjaGFyICphY3BpX3V0X2dldF9yZWdpb25fbmFtZSh1OCBzcGFjZV9pZCkKIHsKIAotCWlmIChzcGFjZV9pZCA+PSBBQ1BJX1VTRVJfUkVHSU9OX0JFR0lOKQotCXsKKwlpZiAoc3BhY2VfaWQgPj0gQUNQSV9VU0VSX1JFR0lPTl9CRUdJTikgewogCQlyZXR1cm4gKCJ1c2VyX2RlZmluZWRfcmVnaW9uIik7Ci0JfQotCWVsc2UgaWYgKHNwYWNlX2lkID49IEFDUElfTlVNX1BSRURFRklORURfUkVHSU9OUykKLQl7CisJfSBlbHNlIGlmIChzcGFjZV9pZCA+PSBBQ1BJX05VTV9QUkVERUZJTkVEX1JFR0lPTlMpIHsKIAkJcmV0dXJuICgiaW52YWxpZF9zcGFjZV9pZCIpOwogCX0KIAotCXJldHVybiAoKGNoYXIgKikgYWNwaV9nYmxfcmVnaW9uX3R5cGVzW3NwYWNlX2lkXSk7CisJcmV0dXJuICgoY2hhciAqKWFjcGlfZ2JsX3JlZ2lvbl90eXBlc1tzcGFjZV9pZF0pOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X2V2ZW50X25hbWUKQEAgLTQ1NCw4ICs1MDIsNyBAQAogCiAvKiBFdmVudCB0eXBlIGRlY29kaW5nICovCiAKLXN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICphY3BpX2dibF9ldmVudF90eXBlc1tBQ1BJX05VTV9GSVhFRF9FVkVOVFNdID0KLXsKK3N0YXRpYyBjb25zdCBjaGFyICphY3BpX2dibF9ldmVudF90eXBlc1tBQ1BJX05VTV9GSVhFRF9FVkVOVFNdID0gewogCSJQTV9UaW1lciIsCiAJImdsb2JhbF9sb2NrIiwKIAkicG93ZXJfYnV0dG9uIiwKQEAgLTQ2MywyMSArNTEwLDE2IEBACiAJInJlYWxfdGltZV9jbG9jayIsCiB9OwogCi0KLWNoYXIgKgotYWNwaV91dF9nZXRfZXZlbnRfbmFtZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9pZCkKK2NoYXIgKmFjcGlfdXRfZ2V0X2V2ZW50X25hbWUodTMyIGV2ZW50X2lkKQogewogCi0JaWYgKGV2ZW50X2lkID4gQUNQSV9FVkVOVF9NQVgpCi0JeworCWlmIChldmVudF9pZCA+IEFDUElfRVZFTlRfTUFYKSB7CiAJCXJldHVybiAoImludmFsaWRfZXZlbnRfaUQiKTsKIAl9CiAKLQlyZXR1cm4gKChjaGFyICopIGFjcGlfZ2JsX2V2ZW50X3R5cGVzW2V2ZW50X2lkXSk7CisJcmV0dXJuICgoY2hhciAqKWFjcGlfZ2JsX2V2ZW50X3R5cGVzW2V2ZW50X2lkXSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lCkBAIC00OTgsMTIgKzU0MCwxMSBAQAogICogd2hlbiBzdG9yZWQgaW4gYSB0YWJsZSBpdCByZWFsbHkgbWVhbnMgdGhhdCB3ZSBoYXZlIHRodXMgZmFyIHNlZW4gbm8KICAqIGV2aWRlbmNlIHRvIGluZGljYXRlIHdoYXQgdHlwZSBpcyBhY3R1YWxseSBnb2luZyB0byBiZSBzdG9yZWQgZm9yIHRoaXMgZW50cnkuCiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2JhZF90eXBlW10gPSAiVU5ERUZJTkVEIjsKK3N0YXRpYyBjb25zdCBjaGFyIGFjcGlfZ2JsX2JhZF90eXBlW10gPSAiVU5ERUZJTkVEIjsKIAogLyogUHJpbnRhYmxlIG5hbWVzIG9mIHRoZSBBQ1BJIG9iamVjdCB0eXBlcyAqLwogCi1zdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfbnNfdHlwZV9uYW1lc1tdID0KLXsKK3N0YXRpYyBjb25zdCBjaGFyICphY3BpX2dibF9uc190eXBlX25hbWVzW10gPSB7CiAJLyogMDAgKi8gIlVudHlwZWQiLAogCS8qIDAxICovICJJbnRlZ2VyIiwKIAkvKiAwMiAqLyAiU3RyaW5nIiwKQEAgLTUzNywzNSArNTc4LDI2IEBACiAJLyogMzAgKi8gIkludmFsaWQiCiB9OwogCi0KLWNoYXIgKgotYWNwaV91dF9nZXRfdHlwZV9uYW1lICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUpCitjaGFyICphY3BpX3V0X2dldF90eXBlX25hbWUoYWNwaV9vYmplY3RfdHlwZSB0eXBlKQogewogCi0JaWYgKHR5cGUgPiBBQ1BJX1RZUEVfSU5WQUxJRCkKLQl7Ci0JCXJldHVybiAoKGNoYXIgKikgYWNwaV9nYmxfYmFkX3R5cGUpOworCWlmICh0eXBlID4gQUNQSV9UWVBFX0lOVkFMSUQpIHsKKwkJcmV0dXJuICgoY2hhciAqKWFjcGlfZ2JsX2JhZF90eXBlKTsKIAl9CiAKLQlyZXR1cm4gKChjaGFyICopIGFjcGlfZ2JsX25zX3R5cGVfbmFtZXNbdHlwZV0pOworCXJldHVybiAoKGNoYXIgKilhY3BpX2dibF9uc190eXBlX25hbWVzW3R5cGVdKTsKIH0KIAotCi1jaGFyICoKLWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKQorY2hhciAqYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKIHsKIAotCWlmICghb2JqX2Rlc2MpCi0JeworCWlmICghb2JqX2Rlc2MpIHsKIAkJcmV0dXJuICgiW05VTEwgT2JqZWN0IERlc2NyaXB0b3JdIik7CiAJfQogCi0JcmV0dXJuIChhY3BpX3V0X2dldF90eXBlX25hbWUgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpKTsKKwlyZXR1cm4gKGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUKQEAgLTU3OCwzOSArNjEwLDMxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotY2hhciAqCi1hY3BpX3V0X2dldF9ub2RlX25hbWUgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCkKK2NoYXIgKmFjcGlfdXRfZ2V0X25vZGVfbmFtZSh2b2lkICpvYmplY3QpCiB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmplY3Q7Ci0KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9iamVjdDsKIAogCS8qIE11c3QgcmV0dXJuIGEgc3RyaW5nIG9mIGV4YWN0bHkgNCBjaGFyYWN0ZXJzID09IEFDUElfTkFNRV9TSVpFICovCiAKLQlpZiAoIW9iamVjdCkKLQl7CisJaWYgKCFvYmplY3QpIHsKIAkJcmV0dXJuICgiTlVMTCIpOwogCX0KIAogCS8qIENoZWNrIGZvciBSb290IG5vZGUgKi8KIAotCWlmICgob2JqZWN0ID09IEFDUElfUk9PVF9PQkpFQ1QpIHx8Ci0JCShvYmplY3QgPT0gYWNwaV9nYmxfcm9vdF9ub2RlKSkKLQl7CisJaWYgKChvYmplY3QgPT0gQUNQSV9ST09UX09CSkVDVCkgfHwgKG9iamVjdCA9PSBhY3BpX2dibF9yb290X25vZGUpKSB7CiAJCXJldHVybiAoIlwiXFxcIiAiKTsKIAl9CiAKIAkvKiBEZXNjcmlwdG9yIG11c3QgYmUgYSBuYW1lc3BhY2Ugbm9kZSAqLwogCi0JaWYgKG5vZGUtPmRlc2NyaXB0b3IgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpCi0JeworCWlmIChub2RlLT5kZXNjcmlwdG9yICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CiAJCXJldHVybiAoIiMjIyMiKTsKIAl9CiAKIAkvKiBOYW1lIG11c3QgYmUgYSB2YWxpZCBBQ1BJIG5hbWUgKi8KIAotCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUgKCogKHUzMiAqKSBub2RlLT5uYW1lLmFzY2lpKSkKLQl7CisJaWYgKCFhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSgqKHUzMiAqKSBub2RlLT5uYW1lLmFzY2lpKSkgewogCQlyZXR1cm4gKCI/Pz8/Iik7CiAJfQogCkBAIC02MTksNyArNjQzLDYgQEAKIAlyZXR1cm4gKG5vZGUtPm5hbWUuYXNjaWkpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZQpAQCAtNjM0LDggKzY1Nyw3IEBACiAKIC8qIFByaW50YWJsZSBuYW1lcyBvZiBvYmplY3QgZGVzY3JpcHRvciB0eXBlcyAqLwogCi1zdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfZGVzY190eXBlX25hbWVzW10gPQoteworc3RhdGljIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2Rlc2NfdHlwZV9uYW1lc1tdID0gewogCS8qIDAwICovICJJbnZhbGlkIiwKIAkvKiAwMSAqLyAiQ2FjaGVkIiwKIAkvKiAwMiAqLyAiU3RhdGUtR2VuZXJpYyIsCkBAIC02NTQsMjcgKzY3NiwyMiBAQAogCS8qIDE1ICovICJOb2RlIgogfTsKIAotCi1jaGFyICoKLWFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0KQorY2hhciAqYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKHZvaWQgKm9iamVjdCkKIHsKIAotCWlmICghb2JqZWN0KQotCXsKKwlpZiAoIW9iamVjdCkgewogCQlyZXR1cm4gKCJOVUxMIE9CSkVDVCIpOwogCX0KIAotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCkgPiBBQ1BJX0RFU0NfVFlQRV9NQVgpCi0JewotCQlyZXR1cm4gKChjaGFyICopIGFjcGlfZ2JsX2JhZF90eXBlKTsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkgPiBBQ1BJX0RFU0NfVFlQRV9NQVgpIHsKKwkJcmV0dXJuICgoY2hhciAqKWFjcGlfZ2JsX2JhZF90eXBlKTsKIAl9CiAKLQlyZXR1cm4gKChjaGFyICopIGFjcGlfZ2JsX2Rlc2NfdHlwZV9uYW1lc1tBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCldKTsKKwlyZXR1cm4gKChjaGFyICopCisJCWFjcGlfZ2JsX2Rlc2NfdHlwZV9uYW1lc1tBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KV0pOwogCiB9CiAKLQogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKIC8qCiAgKiBTdHJpbmdzIGFuZCBwcm9jZWR1cmVzIHVzZWQgZm9yIGRlYnVnIG9ubHkKQEAgLTY5MywxMyArNzEwLDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotY2hhciAqCi1hY3BpX3V0X2dldF9tdXRleF9uYW1lICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4X2lkKQorY2hhciAqYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSh1MzIgbXV0ZXhfaWQpCiB7CiAKLQlpZiAobXV0ZXhfaWQgPiBNQVhfTVVURVgpCi0JeworCWlmIChtdXRleF9pZCA+IE1BWF9NVVRFWCkgewogCQlyZXR1cm4gKCJJbnZhbGlkIE11dGV4IElEIik7CiAJfQogCkBAIC03MDcsNyArNzIxLDYgQEAKIH0KICNlbmRpZgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUKQEAgLTcyMCwxMyArNzMzLDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTgKLWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSkKK3U4IGFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlKQogewogCi0JaWYgKHR5cGUgPiBBQ1BJX1RZUEVfTE9DQUxfTUFYKQotCXsKKwlpZiAodHlwZSA+IEFDUElfVFlQRV9MT0NBTF9NQVgpIHsKIAkJLyogTm90ZTogQXNzdW1lcyBhbGwgVFlQRXMgYXJlIGNvbnRpZ3VvdXMgKGV4dGVybmFsL2xvY2FsKSAqLwogCiAJCXJldHVybiAoRkFMU0UpOwpAQCAtNzM1LDc0ICs3NDUsNiBAQAogCXJldHVybiAoVFJVRSk7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZAotICoKLSAqIFBBUkFNRVRFUlM6ICBpZF90eXBlICAgICAgICAgLSBUeXBlIG9mIElEIChtZXRob2Qgb3IgdGFibGUpCi0gKgotICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGEgdGFibGUgb3IgbWV0aG9kIG93bmVyIGlkCi0gKgotICogTk9URTogdGhpcyBhbGdvcml0aG0gaGFzIGEgd3JhcGFyb3VuZCBwcm9ibGVtIGF0IDY0X2sgbWV0aG9kIGludm9jYXRpb25zLCBhbmQKLSAqICAgICAgIHNob3VsZCBiZSByZXZpc2l0ZWQgKFRCRCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX293bmVyX2lkCi1hY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkX3R5cGUpCi17Ci0JYWNwaV9vd25lcl9pZCAgICAgICAgICAgICAgICAgICBvd25lcl9pZCA9IDB4RkZGRjsKLQotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2FsbG9jYXRlX293bmVyX2lkIik7Ci0KLQotCWlmIChBQ1BJX0ZBSUxVUkUgKGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfQ0FDSEVTKSkpCi0JewotCQlyZXR1cm4gKDApOwotCX0KLQotCXN3aXRjaCAoaWRfdHlwZSkKLQl7Ci0JY2FzZSBBQ1BJX09XTkVSX1RZUEVfVEFCTEU6Ci0KLQkJb3duZXJfaWQgPSBhY3BpX2dibF9uZXh0X3RhYmxlX293bmVyX2lkOwotCQlhY3BpX2dibF9uZXh0X3RhYmxlX293bmVyX2lkKys7Ci0KLQkJLyogQ2hlY2sgZm9yIHdyYXBhcm91bmQgKi8KLQotCQlpZiAoYWNwaV9nYmxfbmV4dF90YWJsZV9vd25lcl9pZCA9PSBBQ1BJX0ZJUlNUX01FVEhPRF9JRCkKLQkJewotCQkJYWNwaV9nYmxfbmV4dF90YWJsZV9vd25lcl9pZCA9IEFDUElfRklSU1RfVEFCTEVfSUQ7Ci0JCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIlRhYmxlIG93bmVyIElEIHdyYXBhcm91bmRcbiIpKTsKLQkJfQotCQlicmVhazsKLQotCi0JY2FzZSBBQ1BJX09XTkVSX1RZUEVfTUVUSE9EOgotCi0JCW93bmVyX2lkID0gYWNwaV9nYmxfbmV4dF9tZXRob2Rfb3duZXJfaWQ7Ci0JCWFjcGlfZ2JsX25leHRfbWV0aG9kX293bmVyX2lkKys7Ci0KLQkJaWYgKGFjcGlfZ2JsX25leHRfbWV0aG9kX293bmVyX2lkID09IEFDUElfRklSU1RfVEFCTEVfSUQpCi0JCXsKLQkJCS8qIENoZWNrIGZvciB3cmFwYXJvdW5kICovCi0KLQkJCWFjcGlfZ2JsX25leHRfbWV0aG9kX293bmVyX2lkID0gQUNQSV9GSVJTVF9NRVRIT0RfSUQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9DQUNIRVMpOwotCXJldHVybl9WQUxVRSAob3duZXJfaWQpOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfaW5pdF9nbG9iYWxzCkBAIC04MTYsMTI5ICs3NTgsOTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X2luaXRfZ2xvYmFscyAoCi0Jdm9pZCkKK3ZvaWQgYWNwaV91dF9pbml0X2dsb2JhbHModm9pZCkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBpOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfaW5pdF9nbG9iYWxzIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfaW5pdF9nbG9iYWxzIik7CisJLyogQ3JlYXRlIGFsbCBtZW1vcnkgY2FjaGVzICovCiAKLQotCS8qIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBjYWNoZSBsaXN0cyAqLwotCi0JQUNQSV9NRU1TRVQgKGFjcGlfZ2JsX21lbW9yeV9saXN0cywgMCwgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCkgKiBBQ1BJX05VTV9NRU1fTElTVFMpOwotCi0JYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfU1RBVEVdLmxpbmtfb2Zmc2V0ICAgICAgPSAodTE2KSBBQ1BJX1BUUl9ESUZGICgmKCgodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICopIE5VTEwpLT5jb21tb24ubmV4dCksIE5VTEwpOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX1BTTk9ERV0ubGlua19vZmZzZXQgICAgID0gKHUxNikgQUNQSV9QVFJfRElGRiAoJigoKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICopIE5VTEwpLT5jb21tb24ubmV4dCksIE5VTEwpOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX1BTTk9ERV9FWFRdLmxpbmtfb2Zmc2V0ID0gKHUxNikgQUNQSV9QVFJfRElGRiAoJigoKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICopIE5VTEwpLT5jb21tb24ubmV4dCksIE5VTEwpOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX09QRVJBTkRdLmxpbmtfb2Zmc2V0ICAgID0gKHUxNikgQUNQSV9QVFJfRElGRiAoJigoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikgTlVMTCktPmNhY2hlLm5leHQpLCBOVUxMKTsKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9XQUxLXS5saW5rX29mZnNldCAgICAgICA9ICh1MTYpIEFDUElfUFRSX0RJRkYgKCYoKChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICopIE5VTEwpLT5uZXh0KSwgTlVMTCk7Ci0KLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9OU05PREVdLm9iamVjdF9zaXplICAgICA9IHNpemVvZiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUpOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX1NUQVRFXS5vYmplY3Rfc2l6ZSAgICAgID0gc2l6ZW9mICh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUpOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX1BTTk9ERV0ub2JqZWN0X3NpemUgICAgID0gc2l6ZW9mIChzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfY29tbW9uKTsKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9QU05PREVfRVhUXS5vYmplY3Rfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGFjcGlfcGFyc2Vfb2JqX25hbWVkKTsKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9PUEVSQU5EXS5vYmplY3Rfc2l6ZSAgICA9IHNpemVvZiAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCk7Ci0JYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfV0FMS10ub2JqZWN0X3NpemUgICAgICAgPSBzaXplb2YgKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUpOwotCi0JYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfU1RBVEVdLm1heF9jYWNoZV9kZXB0aCAgPSBBQ1BJX01BWF9TVEFURV9DQUNIRV9ERVBUSDsKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9QU05PREVdLm1heF9jYWNoZV9kZXB0aCA9IEFDUElfTUFYX1BBUlNFX0NBQ0hFX0RFUFRIOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX1BTTk9ERV9FWFRdLm1heF9jYWNoZV9kZXB0aCA9IEFDUElfTUFYX0VYVFBBUlNFX0NBQ0hFX0RFUFRIOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX09QRVJBTkRdLm1heF9jYWNoZV9kZXB0aCA9IEFDUElfTUFYX09CSkVDVF9DQUNIRV9ERVBUSDsKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9XQUxLXS5tYXhfY2FjaGVfZGVwdGggICA9IEFDUElfTUFYX1dBTEtfQ0FDSEVfREVQVEg7Ci0KLQlBQ1BJX01FTV9UUkFDS0lORyAoYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfR0xPQkFMXS5saXN0X25hbWUgICAgPSAiR2xvYmFsIE1lbW9yeSBBbGxvY2F0aW9uIik7Ci0JQUNQSV9NRU1fVFJBQ0tJTkcgKGFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX05TTk9ERV0ubGlzdF9uYW1lICAgID0gIk5hbWVzcGFjZSBOb2RlcyIpOwotCUFDUElfTUVNX1RSQUNLSU5HIChhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9TVEFURV0ubGlzdF9uYW1lICAgICA9ICJTdGF0ZSBPYmplY3QgQ2FjaGUiKTsKLQlBQ1BJX01FTV9UUkFDS0lORyAoYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfUFNOT0RFXS5saXN0X25hbWUgICAgPSAiUGFyc2UgTm9kZSBDYWNoZSIpOwotCUFDUElfTUVNX1RSQUNLSU5HIChhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9QU05PREVfRVhUXS5saXN0X25hbWUgPSAiRXh0ZW5kZWQgUGFyc2UgTm9kZSBDYWNoZSIpOwotCUFDUElfTUVNX1RSQUNLSU5HIChhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9PUEVSQU5EXS5saXN0X25hbWUgICA9ICJPcGVyYW5kIE9iamVjdCBDYWNoZSIpOwotCUFDUElfTUVNX1RSQUNLSU5HIChhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9XQUxLXS5saXN0X25hbWUgICAgICA9ICJUcmVlIFdhbGsgTm9kZSBDYWNoZSIpOworCXN0YXR1cyA9IGFjcGlfdXRfY3JlYXRlX2NhY2hlcygpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm47CisJfQogCiAJLyogQUNQSSB0YWJsZSBzdHJ1Y3R1cmUgKi8KIAotCWZvciAoaSA9IDA7IGkgPCBOVU1fQUNQSV9UQUJMRV9UWVBFUzsgaSsrKQotCXsKLQkJYWNwaV9nYmxfdGFibGVfbGlzdHNbaV0ubmV4dCAgICAgICAgPSBOVUxMOwotCQlhY3BpX2dibF90YWJsZV9saXN0c1tpXS5jb3VudCAgICAgICA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9BQ1BJX1RBQkxFX1RZUEVTOyBpKyspIHsKKwkJYWNwaV9nYmxfdGFibGVfbGlzdHNbaV0ubmV4dCA9IE5VTEw7CisJCWFjcGlfZ2JsX3RhYmxlX2xpc3RzW2ldLmNvdW50ID0gMDsKIAl9CiAKIAkvKiBNdXRleCBsb2NrZWQgZmxhZ3MgKi8KIAotCWZvciAoaSA9IDA7IGkgPCBOVU1fTVVURVg7IGkrKykKLQl7Ci0JCWFjcGlfZ2JsX211dGV4X2luZm9baV0ubXV0ZXggICAgICAgID0gTlVMTDsKLQkJYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS5vd25lcl9pZCAgICAgPSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRDsKLQkJYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS51c2VfY291bnQgICAgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fTVVURVg7IGkrKykgeworCQlhY3BpX2dibF9tdXRleF9pbmZvW2ldLm11dGV4ID0gTlVMTDsKKwkJYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS50aHJlYWRfaWQgPSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRDsKKwkJYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS51c2VfY291bnQgPSAwOwogCX0KIAogCS8qIEdQRSBzdXBwb3J0ICovCiAKLQlhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkICAgICAgICA9IE5VTEw7Ci0JYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzBdICAgICAgICAgPSBOVUxMOwotCWFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1sxXSAgICAgICAgID0gTlVMTDsKKwlhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkID0gTlVMTDsKKwlhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMF0gPSBOVUxMOworCWFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1sxXSA9IE5VTEw7CiAKIAkvKiBHbG9iYWwgbm90aWZ5IGhhbmRsZXJzICovCiAKLQlhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIgICAgICA9IE5VTEw7Ci0JYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyICAgICAgPSBOVUxMOwotCWFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyICAgICAgICAgID0gTlVMTDsKLQlhY3BpX2dibF9pbml0X2hhbmRsZXIgICAgICAgICAgICAgICA9IE5VTEw7CisJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyID0gTlVMTDsKKwlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIgPSBOVUxMOworCWFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyID0gTlVMTDsKKwlhY3BpX2dibF9pbml0X2hhbmRsZXIgPSBOVUxMOwogCiAJLyogR2xvYmFsICJ0eXBlZCIgQUNQSSB0YWJsZSBwb2ludGVycyAqLwogCi0JYWNwaV9nYmxfUlNEUCAgICAgICAgICAgICAgICAgICAgICAgPSBOVUxMOwotCWFjcGlfZ2JsX1hTRFQgICAgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKLQlhY3BpX2dibF9GQUNTICAgICAgICAgICAgICAgICAgICAgICA9IE5VTEw7Ci0JYWNwaV9nYmxfRkFEVCAgICAgICAgICAgICAgICAgICAgICAgPSBOVUxMOwotCWFjcGlfZ2JsX0RTRFQgICAgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKKwlhY3BpX2dibF9SU0RQID0gTlVMTDsKKwlhY3BpX2dibF9YU0RUID0gTlVMTDsKKwlhY3BpX2dibF9GQUNTID0gTlVMTDsKKwlhY3BpX2dibF9GQURUID0gTlVMTDsKKwlhY3BpX2dibF9EU0RUID0gTlVMTDsKIAogCS8qIEdsb2JhbCBMb2NrIHN1cHBvcnQgKi8KIAotCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkICAgICAgID0gRkFMU0U7Ci0JYWNwaV9nYmxfZ2xvYmFsX2xvY2tfdGhyZWFkX2NvdW50ICAgPSAwOwotCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2hhbmRsZSAgICAgICAgID0gMDsKKwlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IEZBTFNFOworCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudCA9IDA7CisJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlID0gMDsKIAogCS8qIE1pc2NlbGxhbmVvdXMgdmFyaWFibGVzICovCiAKLQlhY3BpX2dibF90YWJsZV9mbGFncyAgICAgICAgICAgICAgICA9IEFDUElfUEhZU0lDQUxfUE9JTlRFUjsKLQlhY3BpX2dibF9yc2RwX29yaWdpbmFsX2xvY2F0aW9uICAgICA9IDA7Ci0JYWNwaV9nYmxfY21fc2luZ2xlX3N0ZXAgICAgICAgICAgICAgPSBGQUxTRTsKLQlhY3BpX2dibF9kYl90ZXJtaW5hdGVfdGhyZWFkcyAgICAgICA9IEZBTFNFOwotCWFjcGlfZ2JsX3NodXRkb3duICAgICAgICAgICAgICAgICAgID0gRkFMU0U7Ci0JYWNwaV9nYmxfbnNfbG9va3VwX2NvdW50ICAgICAgICAgICAgPSAwOwotCWFjcGlfZ2JsX3BzX2ZpbmRfY291bnQgICAgICAgICAgICAgID0gMDsKLQlhY3BpX2dibF9hY3BpX2hhcmR3YXJlX3ByZXNlbnQgICAgICA9IFRSVUU7Ci0JYWNwaV9nYmxfbmV4dF90YWJsZV9vd25lcl9pZCAgICAgICAgPSBBQ1BJX0ZJUlNUX1RBQkxFX0lEOwotCWFjcGlfZ2JsX25leHRfbWV0aG9kX293bmVyX2lkICAgICAgID0gQUNQSV9GSVJTVF9NRVRIT0RfSUQ7Ci0JYWNwaV9nYmxfZGVidWdnZXJfY29uZmlndXJhdGlvbiAgICAgPSBERUJVR0dFUl9USFJFQURJTkc7Ci0JYWNwaV9nYmxfZGJfb3V0cHV0X2ZsYWdzICAgICAgICAgICAgPSBBQ1BJX0RCX0NPTlNPTEVfT1VUUFVUOworCWFjcGlfZ2JsX3RhYmxlX2ZsYWdzID0gQUNQSV9QSFlTSUNBTF9QT0lOVEVSOworCWFjcGlfZ2JsX3JzZHBfb3JpZ2luYWxfbG9jYXRpb24gPSAwOworCWFjcGlfZ2JsX2NtX3NpbmdsZV9zdGVwID0gRkFMU0U7CisJYWNwaV9nYmxfZGJfdGVybWluYXRlX3RocmVhZHMgPSBGQUxTRTsKKwlhY3BpX2dibF9zaHV0ZG93biA9IEZBTFNFOworCWFjcGlfZ2JsX25zX2xvb2t1cF9jb3VudCA9IDA7CisJYWNwaV9nYmxfcHNfZmluZF9jb3VudCA9IDA7CisJYWNwaV9nYmxfYWNwaV9oYXJkd2FyZV9wcmVzZW50ID0gVFJVRTsKKwlhY3BpX2dibF9vd25lcl9pZF9tYXNrID0gMDsKKwlhY3BpX2dibF9kZWJ1Z2dlcl9jb25maWd1cmF0aW9uID0gREVCVUdHRVJfVEhSRUFESU5HOworCWFjcGlfZ2JsX2RiX291dHB1dF9mbGFncyA9IEFDUElfREJfQ09OU09MRV9PVVRQVVQ7CiAKIAkvKiBIYXJkd2FyZSBvcmllbnRlZCAqLwogCi0JYWNwaV9nYmxfZXZlbnRzX2luaXRpYWxpemVkICAgICAgICAgPSBGQUxTRTsKLQlhY3BpX2dibF9zeXN0ZW1fYXdha2VfYW5kX3J1bm5pbmcgICA9IFRSVUU7CisJYWNwaV9nYmxfZXZlbnRzX2luaXRpYWxpemVkID0gRkFMU0U7CisJYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nID0gVFJVRTsKIAogCS8qIE5hbWVzcGFjZSAqLwogCi0JYWNwaV9nYmxfcm9vdF9ub2RlICAgICAgICAgICAgICAgICAgPSBOVUxMOworCWFjcGlfZ2JsX3Jvb3Rfbm9kZSA9IE5VTEw7CiAKIAlhY3BpX2dibF9yb290X25vZGVfc3RydWN0Lm5hbWUuaW50ZWdlciA9IEFDUElfUk9PVF9OQU1FOwogCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QuZGVzY3JpcHRvciA9IEFDUElfREVTQ19UWVBFX05BTUVEOwotCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QudHlwZSAgICAgID0gQUNQSV9UWVBFX0RFVklDRTsKLQlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LmNoaWxkICAgICA9IE5VTEw7Ci0JYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdC5wZWVyICAgICAgPSBOVUxMOwotCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3Qub2JqZWN0ICAgID0gTlVMTDsKLQlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LmZsYWdzICAgICA9IEFOT0JKX0VORF9PRl9QRUVSX0xJU1Q7Ci0KKwlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LnR5cGUgPSBBQ1BJX1RZUEVfREVWSUNFOworCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QuY2hpbGQgPSBOVUxMOworCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QucGVlciA9IE5VTEw7CisJYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdC5vYmplY3QgPSBOVUxMOworCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QuZmxhZ3MgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUOwogCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKLQlhY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlciAgICAgICA9IEFDUElfU0laRV9NQVg7CisJYWNwaV9nYmxfbG93ZXN0X3N0YWNrX3BvaW50ZXIgPSBBQ1BJX1NJWkVfTUFYOwogI2VuZGlmCiAKIAlyZXR1cm5fVk9JRDsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0aW5pdC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGluaXQuYwppbmRleCA3ZjM3MTM4Li45ZGRlODJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0aW5pdC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRpbml0LmMKQEAgLTQxLDI1ICs0MSwxOCBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRpbml0IikKK0FDUElfTU9EVUxFX05BTUUoInV0aW5pdCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIHZvaWQKLWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaXN0ZXJfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKK2FjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvcihjaGFyICpyZWdpc3Rlcl9uYW1lLCB1MzIgdmFsdWUsIGFjcGlfc2l6ZSBvZmZzZXQpOwogCi1zdGF0aWMgdm9pZCBhY3BpX3V0X3Rlcm1pbmF0ZSAoCi0Jdm9pZCk7Ci0KK3N0YXRpYyB2b2lkIGFjcGlfdXRfdGVybWluYXRlKHZvaWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc2LDE4ICs2OSwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaXN0ZXJfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KQorYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKGNoYXIgKnJlZ2lzdGVyX25hbWUsIHUzMiB2YWx1ZSwgYWNwaV9zaXplIG9mZnNldCkKIHsKIAotCUFDUElfUkVQT1JUX1dBUk5JTkcgKAotCQkoIkludmFsaWQgRkFEVCB2YWx1ZSAlcz0lWCBhdCBvZmZzZXQgJVggRkFEVD0lcFxuIiwKLQkJcmVnaXN0ZXJfbmFtZSwgdmFsdWUsICh1MzIpIG9mZnNldCwgYWNwaV9nYmxfRkFEVCkpOworCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJJbnZhbGlkIEZBRFQgdmFsdWUgJXM9JVggYXQgb2Zmc2V0ICVYIEZBRFQ9JXBcbiIsCisJCQkgICAgIHJlZ2lzdGVyX25hbWUsIHZhbHVlLCAodTMyKSBvZmZzZXQsCisJCQkgICAgIGFjcGlfZ2JsX0ZBRFQpKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdmFsaWRhdGVfZmFkdApAQCAtMTAwLDkgKzg5LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF92YWxpZGF0ZV9mYWR0ICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV91dF92YWxpZGF0ZV9mYWR0KHZvaWQpCiB7CiAKIAkvKgpAQCAtMTEwLDY0ICs5Nyw2NiBAQAogCSAqIGJ1dCBkb24ndCBhYm9ydCBvbiBhbnkgcHJvYmxlbXMsIGp1c3QgZGlzcGxheSBlcnJvcgogCSAqLwogCWlmIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiA8IDQpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgiUE0xX0VWVF9MRU4iLAotCQkJCSAgKHUzMikgYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4sCi0JCQkJICBBQ1BJX0ZBRFRfT0ZGU0VUIChwbTFfZXZ0X2xlbikpOworCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoIlBNMV9FVlRfTEVOIiwKKwkJCQkJICAgICh1MzIpIGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuLAorCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVChwbTFfZXZ0X2xlbikpOwogCX0KIAogCWlmICghYWNwaV9nYmxfRkFEVC0+cG0xX2NudF9sZW4pIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgiUE0xX0NOVF9MRU4iLCAwLAotCQkJCSAgQUNQSV9GQURUX09GRlNFVCAocG0xX2NudF9sZW4pKTsKKwkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKCJQTTFfQ05UX0xFTiIsIDAsCisJCQkJCSAgICBBQ1BJX0ZBRFRfT0ZGU0VUKHBtMV9jbnRfbGVuKSk7CiAJfQogCiAJaWYgKCFhY3BpX2dibF9GQURULT54cG0xYV9ldnRfYmxrLmFkZHJlc3MpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgiWF9QTTFhX0VWVF9CTEsiLCAwLAotCQkJCSAgQUNQSV9GQURUX09GRlNFVCAoeHBtMWFfZXZ0X2Jsay5hZGRyZXNzKSk7CisJCWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvcigiWF9QTTFhX0VWVF9CTEsiLCAwLAorCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVCh4cG0xYV9ldnRfYmxrLgorCQkJCQkJCSAgICAgYWRkcmVzcykpOwogCX0KIAogCWlmICghYWNwaV9nYmxfRkFEVC0+eHBtMWFfY250X2Jsay5hZGRyZXNzKSB7Ci0JCWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvciAoIlhfUE0xYV9DTlRfQkxLIiwgMCwKLQkJCQkgIEFDUElfRkFEVF9PRkZTRVQgKHhwbTFhX2NudF9ibGsuYWRkcmVzcykpOworCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoIlhfUE0xYV9DTlRfQkxLIiwgMCwKKwkJCQkJICAgIEFDUElfRkFEVF9PRkZTRVQoeHBtMWFfY250X2Jsay4KKwkJCQkJCQkgICAgIGFkZHJlc3MpKTsKIAl9CiAKIAlpZiAoIWFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrLmFkZHJlc3MpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgiWF9QTV9UTVJfQkxLIiwgMCwKLQkJCQkgIEFDUElfRkFEVF9PRkZTRVQgKHhwbV90bXJfYmxrLmFkZHJlc3MpKTsKKwkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKCJYX1BNX1RNUl9CTEsiLCAwLAorCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVCh4cG1fdG1yX2Jsay4KKwkJCQkJCQkgICAgIGFkZHJlc3MpKTsKIAl9CiAKIAlpZiAoKGFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsay5hZGRyZXNzICYmCi0JCSFhY3BpX2dibF9GQURULT5wbTJfY250X2xlbikpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgiUE0yX0NOVF9MRU4iLAotCQkJCSAgKHUzMikgYWNwaV9nYmxfRkFEVC0+cG0yX2NudF9sZW4sCi0JCQkJICBBQ1BJX0ZBRFRfT0ZGU0VUIChwbTJfY250X2xlbikpOworCSAgICAgIWFjcGlfZ2JsX0ZBRFQtPnBtMl9jbnRfbGVuKSkgeworCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoIlBNMl9DTlRfTEVOIiwKKwkJCQkJICAgICh1MzIpIGFjcGlfZ2JsX0ZBRFQtPnBtMl9jbnRfbGVuLAorCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVChwbTJfY250X2xlbikpOwogCX0KIAogCWlmIChhY3BpX2dibF9GQURULT5wbV90bV9sZW4gPCA0KSB7Ci0JCWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvciAoIlBNX1RNX0xFTiIsCi0JCQkJICAodTMyKSBhY3BpX2dibF9GQURULT5wbV90bV9sZW4sCi0JCQkJICBBQ1BJX0ZBRFRfT0ZGU0VUIChwbV90bV9sZW4pKTsKKwkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKCJQTV9UTV9MRU4iLAorCQkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC0+cG1fdG1fbGVuLAorCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVChwbV90bV9sZW4pKTsKIAl9CiAKIAkvKiBMZW5ndGggb2YgR1BFIGJsb2NrcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiAqLwogCiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPnhncGUwX2Jsay5hZGRyZXNzICYmCi0JCShhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4gJiAxKSkgewotCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IgKCIoeClHUEUwX0JMS19MRU4iLAotCQkJCSAgKHUzMikgYWNwaV9nYmxfRkFEVC0+Z3BlMF9ibGtfbGVuLAotCQkJCSAgQUNQSV9GQURUX09GRlNFVCAoZ3BlMF9ibGtfbGVuKSk7CisJICAgIChhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4gJiAxKSkgeworCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoIih4KUdQRTBfQkxLX0xFTiIsCisJCQkJCSAgICAodTMyKSBhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4sCisJCQkJCSAgICBBQ1BJX0ZBRFRfT0ZGU0VUKGdwZTBfYmxrX2xlbikpOwogCX0KIAogCWlmIChhY3BpX2dibF9GQURULT54Z3BlMV9ibGsuYWRkcmVzcyAmJgotCQkoYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuICYgMSkpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgiKHgpR1BFMV9CTEtfTEVOIiwKLQkJCQkgICh1MzIpIGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmxrX2xlbiwKLQkJCQkgIEFDUElfRkFEVF9PRkZTRVQgKGdwZTFfYmxrX2xlbikpOworCSAgICAoYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuICYgMSkpIHsKKwkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKCIoeClHUEUxX0JMS19MRU4iLAorCQkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuLAorCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVChncGUxX2Jsa19sZW4pKTsKIAl9CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdGVybWluYXRlCkBAIC0xODAsMTggKzE2OSwxNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX3V0X3Rlcm1pbmF0ZSAoCi0Jdm9pZCkKK3N0YXRpYyB2b2lkIGFjcGlfdXRfdGVybWluYXRlKHZvaWQpCiB7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrOwotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKm5leHRfZ3BlX2Jsb2NrOwotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvOwotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKm5leHRfZ3BlX3hydXB0X2luZm87CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqbmV4dF9ncGVfYmxvY2s7CisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvOworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpuZXh0X2dwZV94cnVwdF9pbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfdGVybWluYXRlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF90ZXJtaW5hdGUiKTsKIAogCS8qIEZyZWUgZ2xvYmFsIHRhYmxlcywgZXRjLiAqLwogCS8qIEZyZWUgZ2xvYmFsIEdQRSBibG9ja3MgYW5kIHJlbGF0ZWQgaW5mbyBzdHJ1Y3R1cmVzICovCkBAIC0yMDEsMjEgKzE4NiwyMCBAQAogCQlncGVfYmxvY2sgPSBncGVfeHJ1cHRfaW5mby0+Z3BlX2Jsb2NrX2xpc3RfaGVhZDsKIAkJd2hpbGUgKGdwZV9ibG9jaykgewogCQkJbmV4dF9ncGVfYmxvY2sgPSBncGVfYmxvY2stPm5leHQ7Ci0JCQlBQ1BJX01FTV9GUkVFIChncGVfYmxvY2stPmV2ZW50X2luZm8pOwotCQkJQUNQSV9NRU1fRlJFRSAoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvKTsKLQkJCUFDUElfTUVNX0ZSRUUgKGdwZV9ibG9jayk7CisJCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jay0+ZXZlbnRfaW5mbyk7CisJCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mbyk7CisJCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jayk7CiAKIAkJCWdwZV9ibG9jayA9IG5leHRfZ3BlX2Jsb2NrOwogCQl9CiAJCW5leHRfZ3BlX3hydXB0X2luZm8gPSBncGVfeHJ1cHRfaW5mby0+bmV4dDsKLQkJQUNQSV9NRU1fRlJFRSAoZ3BlX3hydXB0X2luZm8pOworCQlBQ1BJX01FTV9GUkVFKGdwZV94cnVwdF9pbmZvKTsKIAkJZ3BlX3hydXB0X2luZm8gPSBuZXh0X2dwZV94cnVwdF9pbmZvOwogCX0KIAogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duCkBAIC0yMjksNTAgKzIxMyw0NSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duICgKLQl2b2lkKQordm9pZCBhY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93bih2b2lkKQogewogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X3N1YnN5c3RlbV9zaHV0ZG93biIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3N1YnN5c3RlbV9zaHV0ZG93biIpOwogCiAJLyogSnVzdCBleGl0IGlmIHN1YnN5c3RlbSBpcyBhbHJlYWR5IHNodXRkb3duICovCiAKIAlpZiAoYWNwaV9nYmxfc2h1dGRvd24pIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiQUNQSSBTdWJzeXN0ZW0gaXMgYWxyZWFkeSB0ZXJtaW5hdGVkXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQUNQSSBTdWJzeXN0ZW0gaXMgYWxyZWFkeSB0ZXJtaW5hdGVkXG4iKSk7CiAJCXJldHVybl9WT0lEOwogCX0KIAogCS8qIFN1YnN5c3RlbSBhcHBlYXJzIGFjdGl2ZSwgZ28gYWhlYWQgYW5kIHNodXQgaXQgZG93biAqLwogCiAJYWNwaV9nYmxfc2h1dGRvd24gPSBUUlVFOwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCSJTaHV0dGluZyBkb3duIEFDUEkgU3Vic3lzdGVtLi4uXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiU2h1dHRpbmcgZG93biBBQ1BJIFN1YnN5c3RlbS4uLlxuIikpOwogCiAJLyogQ2xvc2UgdGhlIGFjcGlfZXZlbnQgSGFuZGxpbmcgKi8KIAotCWFjcGlfZXZfdGVybWluYXRlICgpOworCWFjcGlfZXZfdGVybWluYXRlKCk7CiAKIAkvKiBDbG9zZSB0aGUgTmFtZXNwYWNlICovCiAKLQlhY3BpX25zX3Rlcm1pbmF0ZSAoKTsKKwlhY3BpX25zX3Rlcm1pbmF0ZSgpOwogCiAJLyogQ2xvc2UgdGhlIGdsb2JhbHMgKi8KIAotCWFjcGlfdXRfdGVybWluYXRlICgpOworCWFjcGlfdXRfdGVybWluYXRlKCk7CiAKIAkvKiBQdXJnZSB0aGUgbG9jYWwgY2FjaGVzICovCiAKLQkodm9pZCkgYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyAoKTsKKwkodm9pZClhY3BpX3V0X2RlbGV0ZV9jYWNoZXMoKTsKIAogCS8qIERlYnVnIG9ubHkgLSBkaXNwbGF5IGxlZnRvdmVyIG1lbW9yeSBhbGxvY2F0aW9uLCBpZiBhbnkgKi8KIAogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi0JYWNwaV91dF9kdW1wX2FsbG9jYXRpb25zIChBQ1BJX1VJTlQzMl9NQVgsIE5VTEwpOworCWFjcGlfdXRfZHVtcF9hbGxvY2F0aW9ucyhBQ1BJX1VJTlQzMl9NQVgsIE5VTEwpOwogI2VuZGlmCiAKIAlyZXR1cm5fVk9JRDsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWF0aC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1hdGguYwppbmRleCAwZDUyN2M5Li42OGEwYTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWF0aC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtYXRoLmMKQEAgLTQxLDE5ICs0MSwxNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRtYXRoIikKK0FDUElfTU9EVUxFX05BTUUoInV0bWF0aCIpCiAKIC8qCiAgKiBTdXBwb3J0IGZvciBkb3VibGUtcHJlY2lzaW9uIGludGVnZXIgZGl2aWRlLiAgVGhpcyBjb2RlIGlzIGluY2x1ZGVkIGhlcmUKICAqIGluIG9yZGVyIHRvIHN1cHBvcnQga2VybmVsIGVudmlyb25tZW50cyB3aGVyZSB0aGUgZG91YmxlLXByZWNpc2lvbiBtYXRoCiAgKiBsaWJyYXJ5IGlzIG5vdCBhdmFpbGFibGUuCiAgKi8KLQogI2lmbmRlZiBBQ1BJX1VTRV9OQVRJVkVfRElWSURFCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTcxLDI3ICs2OCwyMiBAQAogICogICAgICAgICAgICAgIDMyLWJpdCByZW1haW5kZXIuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfdXRfc2hvcnRfZGl2aWRlICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGRpdmlkZW5kLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aXNvciwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICpvdXRfcXVvdGllbnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0X3JlbWFpbmRlcikKK2FjcGlfdXRfc2hvcnRfZGl2aWRlKGFjcGlfaW50ZWdlciBkaXZpZGVuZCwKKwkJICAgICB1MzIgZGl2aXNvciwKKwkJICAgICBhY3BpX2ludGVnZXIgKiBvdXRfcXVvdGllbnQsIHUzMiAqIG91dF9yZW1haW5kZXIpCiB7Ci0JdW5pb24gdWludDY0X292ZXJsYXkgICAgICAgICAgICBkaXZpZGVuZF9vdmw7Ci0JdW5pb24gdWludDY0X292ZXJsYXkgICAgICAgICAgICBxdW90aWVudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcjMyOworCXVuaW9uIHVpbnQ2NF9vdmVybGF5IGRpdmlkZW5kX292bDsKKwl1bmlvbiB1aW50NjRfb3ZlcmxheSBxdW90aWVudDsKKwl1MzIgcmVtYWluZGVyMzI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9zaG9ydF9kaXZpZGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3Nob3J0X2RpdmlkZSIpOwogCiAJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwogCiAJaWYgKGRpdmlzb3IgPT0gMCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX3V0X3Nob3J0X2RpdmlkZTogRGl2aWRlIGJ5IHplcm9cbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfRElWSURFX0JZX1pFUk8pOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfdXRfc2hvcnRfZGl2aWRlOiBEaXZpZGUgYnkgemVyb1xuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0RJVklERV9CWV9aRVJPKTsKIAl9CiAKIAlkaXZpZGVuZF9vdmwuZnVsbCA9IGRpdmlkZW5kOwpAQCAtMTAwLDkgKzkyLDkgQEAKIAkgKiBUaGUgcXVvdGllbnQgaXMgNjQgYml0cywgdGhlIHJlbWFpbmRlciBpcyBhbHdheXMgMzIgYml0cywKIAkgKiBhbmQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBzZWNvbmQgZGl2aWRlLgogCSAqLwotCUFDUElfRElWXzY0X0JZXzMyICgwLCBkaXZpZGVuZF9vdmwucGFydC5oaSwgZGl2aXNvciwKKwlBQ1BJX0RJVl82NF9CWV8zMigwLCBkaXZpZGVuZF9vdmwucGFydC5oaSwgZGl2aXNvciwKIAkJCSAgcXVvdGllbnQucGFydC5oaSwgcmVtYWluZGVyMzIpOwotCUFDUElfRElWXzY0X0JZXzMyIChyZW1haW5kZXIzMiwgZGl2aWRlbmRfb3ZsLnBhcnQubG8sIGRpdmlzb3IsCisJQUNQSV9ESVZfNjRfQllfMzIocmVtYWluZGVyMzIsIGRpdmlkZW5kX292bC5wYXJ0LmxvLCBkaXZpc29yLAogCQkJICBxdW90aWVudC5wYXJ0LmxvLCByZW1haW5kZXIzMik7CiAKIAkvKiBSZXR1cm4gb25seSB3aGF0IHdhcyByZXF1ZXN0ZWQgKi8KQEAgLTExNCwxMCArMTA2LDkgQEAKIAkJKm91dF9yZW1haW5kZXIgPSByZW1haW5kZXIzMjsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGl2aWRlCkBAIC0xMzQsMzQgKzEyNSwzMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfZGl2aWRlICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGluX2RpdmlkZW5kLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5fZGl2aXNvciwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICpvdXRfcXVvdGllbnQsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqb3V0X3JlbWFpbmRlcikKK2FjcGlfdXRfZGl2aWRlKGFjcGlfaW50ZWdlciBpbl9kaXZpZGVuZCwKKwkgICAgICAgYWNwaV9pbnRlZ2VyIGluX2Rpdmlzb3IsCisJICAgICAgIGFjcGlfaW50ZWdlciAqIG91dF9xdW90aWVudCwgYWNwaV9pbnRlZ2VyICogb3V0X3JlbWFpbmRlcikKIHsKLQl1bmlvbiB1aW50NjRfb3ZlcmxheSAgICAgICAgICAgIGRpdmlkZW5kOwotCXVuaW9uIHVpbnQ2NF9vdmVybGF5ICAgICAgICAgICAgZGl2aXNvcjsKLQl1bmlvbiB1aW50NjRfb3ZlcmxheSAgICAgICAgICAgIHF1b3RpZW50OwotCXVuaW9uIHVpbnQ2NF9vdmVybGF5ICAgICAgICAgICAgcmVtYWluZGVyOwotCXVuaW9uIHVpbnQ2NF9vdmVybGF5ICAgICAgICAgICAgbm9ybWFsaXplZF9kaXZpZGVuZDsKLQl1bmlvbiB1aW50NjRfb3ZlcmxheSAgICAgICAgICAgIG5vcm1hbGl6ZWRfZGl2aXNvcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWwxOwotCXVuaW9uIHVpbnQ2NF9vdmVybGF5ICAgICAgICAgICAgcGFydGlhbDI7Ci0JdW5pb24gdWludDY0X292ZXJsYXkgICAgICAgICAgICBwYXJ0aWFsMzsKKwl1bmlvbiB1aW50NjRfb3ZlcmxheSBkaXZpZGVuZDsKKwl1bmlvbiB1aW50NjRfb3ZlcmxheSBkaXZpc29yOworCXVuaW9uIHVpbnQ2NF9vdmVybGF5IHF1b3RpZW50OworCXVuaW9uIHVpbnQ2NF9vdmVybGF5IHJlbWFpbmRlcjsKKwl1bmlvbiB1aW50NjRfb3ZlcmxheSBub3JtYWxpemVkX2RpdmlkZW5kOworCXVuaW9uIHVpbnQ2NF9vdmVybGF5IG5vcm1hbGl6ZWRfZGl2aXNvcjsKKwl1MzIgcGFydGlhbDE7CisJdW5pb24gdWludDY0X292ZXJsYXkgcGFydGlhbDI7CisJdW5pb24gdWludDY0X292ZXJsYXkgcGFydGlhbDM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9kaXZpZGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2RpdmlkZSIpOwogCiAJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwogCiAJaWYgKGluX2Rpdmlzb3IgPT0gMCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX3V0X2RpdmlkZTogRGl2aWRlIGJ5IHplcm9cbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfRElWSURFX0JZX1pFUk8pOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfdXRfZGl2aWRlOiBEaXZpZGUgYnkgemVyb1xuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0RJVklERV9CWV9aRVJPKTsKIAl9CiAKLQlkaXZpc29yLmZ1bGwgID0gaW5fZGl2aXNvcjsKKwlkaXZpc29yLmZ1bGwgPSBpbl9kaXZpc29yOwogCWRpdmlkZW5kLmZ1bGwgPSBpbl9kaXZpZGVuZDsKIAlpZiAoZGl2aXNvci5wYXJ0LmhpID09IDApIHsKIAkJLyoKQEAgLTE3NCw5ICsxNjEsOSBAQAogCQkgKiBUaGUgcXVvdGllbnQgaXMgNjQgYml0cywgdGhlIHJlbWFpbmRlciBpcyBhbHdheXMgMzIgYml0cywKIAkJICogYW5kIGlzIGdlbmVyYXRlZCBieSB0aGUgc2Vjb25kIGRpdmlkZS4KIAkJICovCi0JCUFDUElfRElWXzY0X0JZXzMyICgwLCBkaXZpZGVuZC5wYXJ0LmhpLCBkaXZpc29yLnBhcnQubG8sCisJCUFDUElfRElWXzY0X0JZXzMyKDAsIGRpdmlkZW5kLnBhcnQuaGksIGRpdmlzb3IucGFydC5sbywKIAkJCQkgIHF1b3RpZW50LnBhcnQuaGksIHBhcnRpYWwxKTsKLQkJQUNQSV9ESVZfNjRfQllfMzIgKHBhcnRpYWwxLCBkaXZpZGVuZC5wYXJ0LmxvLCBkaXZpc29yLnBhcnQubG8sCisJCUFDUElfRElWXzY0X0JZXzMyKHBhcnRpYWwxLCBkaXZpZGVuZC5wYXJ0LmxvLCBkaXZpc29yLnBhcnQubG8sCiAJCQkJICBxdW90aWVudC5wYXJ0LmxvLCByZW1haW5kZXIucGFydC5sbyk7CiAJfQogCkBAIC0xODUsMjMgKzE3MiwyMyBAQAogCQkgKiAyKSBUaGUgZ2VuZXJhbCBjYXNlIHdoZXJlIHRoZSBkaXZpc29yIGlzIGEgZnVsbCA2NCBiaXRzCiAJCSAqIGlzIG1vcmUgZGlmZmljdWx0CiAJCSAqLwotCQlxdW90aWVudC5wYXJ0LmhpICAgPSAwOworCQlxdW90aWVudC5wYXJ0LmhpID0gMDsKIAkJbm9ybWFsaXplZF9kaXZpZGVuZCA9IGRpdmlkZW5kOwogCQlub3JtYWxpemVkX2Rpdmlzb3IgPSBkaXZpc29yOwogCiAJCS8qIE5vcm1hbGl6ZSB0aGUgb3BlcmFuZHMgKHNoaWZ0IHVudGlsIHRoZSBkaXZpc29yIGlzIDwgMzIgYml0cykgKi8KIAogCQlkbyB7Ci0JCQlBQ1BJX1NISUZUX1JJR0hUXzY0IChub3JtYWxpemVkX2Rpdmlzb3IucGFydC5oaSwKLQkJCQkJIG5vcm1hbGl6ZWRfZGl2aXNvci5wYXJ0LmxvKTsKLQkJCUFDUElfU0hJRlRfUklHSFRfNjQgKG5vcm1hbGl6ZWRfZGl2aWRlbmQucGFydC5oaSwKLQkJCQkJIG5vcm1hbGl6ZWRfZGl2aWRlbmQucGFydC5sbyk7CisJCQlBQ1BJX1NISUZUX1JJR0hUXzY0KG5vcm1hbGl6ZWRfZGl2aXNvci5wYXJ0LmhpLAorCQkJCQkgICAgbm9ybWFsaXplZF9kaXZpc29yLnBhcnQubG8pOworCQkJQUNQSV9TSElGVF9SSUdIVF82NChub3JtYWxpemVkX2RpdmlkZW5kLnBhcnQuaGksCisJCQkJCSAgICBub3JtYWxpemVkX2RpdmlkZW5kLnBhcnQubG8pOwogCiAJCX0gd2hpbGUgKG5vcm1hbGl6ZWRfZGl2aXNvci5wYXJ0LmhpICE9IDApOwogCiAJCS8qIFBhcnRpYWwgZGl2aWRlICovCiAKLQkJQUNQSV9ESVZfNjRfQllfMzIgKG5vcm1hbGl6ZWRfZGl2aWRlbmQucGFydC5oaSwKKwkJQUNQSV9ESVZfNjRfQllfMzIobm9ybWFsaXplZF9kaXZpZGVuZC5wYXJ0LmhpLAogCQkJCSAgbm9ybWFsaXplZF9kaXZpZGVuZC5wYXJ0LmxvLAogCQkJCSAgbm9ybWFsaXplZF9kaXZpc29yLnBhcnQubG8sCiAJCQkJICBxdW90aWVudC5wYXJ0LmxvLCBwYXJ0aWFsMSk7CkBAIC0yMTAsOCArMTk3LDkgQEAKIAkJICogVGhlIHF1b3RpZW50IGlzIGFsd2F5cyAzMiBiaXRzLCBhbmQgc2ltcGx5IHJlcXVpcmVzIGFkanVzdG1lbnQuCiAJCSAqIFRoZSA2NC1iaXQgcmVtYWluZGVyIG11c3QgYmUgZ2VuZXJhdGVkLgogCQkgKi8KLQkJcGFydGlhbDEgICAgICA9IHF1b3RpZW50LnBhcnQubG8gKiBkaXZpc29yLnBhcnQuaGk7Ci0JCXBhcnRpYWwyLmZ1bGwgPSAoYWNwaV9pbnRlZ2VyKSBxdW90aWVudC5wYXJ0LmxvICogZGl2aXNvci5wYXJ0LmxvOworCQlwYXJ0aWFsMSA9IHF1b3RpZW50LnBhcnQubG8gKiBkaXZpc29yLnBhcnQuaGk7CisJCXBhcnRpYWwyLmZ1bGwgPQorCQkgICAgKGFjcGlfaW50ZWdlcikgcXVvdGllbnQucGFydC5sbyAqIGRpdmlzb3IucGFydC5sbzsKIAkJcGFydGlhbDMuZnVsbCA9IChhY3BpX2ludGVnZXIpIHBhcnRpYWwyLnBhcnQuaGkgKyBwYXJ0aWFsMTsKIAogCQlyZW1haW5kZXIucGFydC5oaSA9IHBhcnRpYWwzLnBhcnQubG87CkBAIC0yMjQsMTYgKzIxMiwxNSBAQAogCQkJCQkJcXVvdGllbnQucGFydC5sby0tOwogCQkJCQkJcmVtYWluZGVyLmZ1bGwgLT0gZGl2aXNvci5mdWxsOwogCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgeworCQkJCX0gZWxzZSB7CiAJCQkJCXF1b3RpZW50LnBhcnQubG8tLTsKIAkJCQkJcmVtYWluZGVyLmZ1bGwgLT0gZGl2aXNvci5mdWxsOwogCQkJCX0KIAkJCX0KIAotCQkJcmVtYWluZGVyLmZ1bGwgICAgPSByZW1haW5kZXIuZnVsbCAtIGRpdmlkZW5kLmZ1bGw7Ci0JCQlyZW1haW5kZXIucGFydC5oaSA9ICh1MzIpIC0oKHMzMikgcmVtYWluZGVyLnBhcnQuaGkpOwotCQkJcmVtYWluZGVyLnBhcnQubG8gPSAodTMyKSAtKChzMzIpIHJlbWFpbmRlci5wYXJ0LmxvKTsKKwkJCXJlbWFpbmRlci5mdWxsID0gcmVtYWluZGVyLmZ1bGwgLSBkaXZpZGVuZC5mdWxsOworCQkJcmVtYWluZGVyLnBhcnQuaGkgPSAodTMyKSAtICgoczMyKSByZW1haW5kZXIucGFydC5oaSk7CisJCQlyZW1haW5kZXIucGFydC5sbyA9ICh1MzIpIC0gKChzMzIpIHJlbWFpbmRlci5wYXJ0LmxvKTsKIAogCQkJaWYgKHJlbWFpbmRlci5wYXJ0LmxvKSB7CiAJCQkJcmVtYWluZGVyLnBhcnQuaGktLTsKQEAgLTI1MCwxMSArMjM3LDEwIEBACiAJCSpvdXRfcmVtYWluZGVyID0gcmVtYWluZGVyLmZ1bGw7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAogI2Vsc2UKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9zaG9ydF9kaXZpZGUsIGFjcGlfdXRfZGl2aWRlCkBAIC0yNjksMjMgKzI1NSwxOSBAQAogICogICAgICAgICAgICAgICAgIHBlcmZvcm0gdGhlIGRpdmlkZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV91dF9zaG9ydF9kaXZpZGUgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5fZGl2aWRlbmQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc29yLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKm91dF9xdW90aWVudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfcmVtYWluZGVyKQorYWNwaV91dF9zaG9ydF9kaXZpZGUoYWNwaV9pbnRlZ2VyIGluX2RpdmlkZW5kLAorCQkgICAgIHUzMiBkaXZpc29yLAorCQkgICAgIGFjcGlfaW50ZWdlciAqIG91dF9xdW90aWVudCwgdTMyICogb3V0X3JlbWFpbmRlcikKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9zaG9ydF9kaXZpZGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3Nob3J0X2RpdmlkZSIpOwogCiAJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwogCiAJaWYgKGRpdmlzb3IgPT0gMCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX3V0X3Nob3J0X2RpdmlkZTogRGl2aWRlIGJ5IHplcm9cbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfRElWSURFX0JZX1pFUk8pOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfdXRfc2hvcnRfZGl2aWRlOiBEaXZpZGUgYnkgemVyb1xuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0RJVklERV9CWV9aRVJPKTsKIAl9CiAKIAkvKiBSZXR1cm4gb25seSB3aGF0IHdhcyByZXF1ZXN0ZWQgKi8KQEAgLTI5NywyNyArMjc5LDIzIEBACiAJCSpvdXRfcmVtYWluZGVyID0gKHUzMikgaW5fZGl2aWRlbmQgJSBkaXZpc29yOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2RpdmlkZSAoCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbl9kaXZpZGVuZCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGluX2Rpdmlzb3IsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqb3V0X3F1b3RpZW50LAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKm91dF9yZW1haW5kZXIpCithY3BpX3V0X2RpdmlkZShhY3BpX2ludGVnZXIgaW5fZGl2aWRlbmQsCisJICAgICAgIGFjcGlfaW50ZWdlciBpbl9kaXZpc29yLAorCSAgICAgICBhY3BpX2ludGVnZXIgKiBvdXRfcXVvdGllbnQsIGFjcGlfaW50ZWdlciAqIG91dF9yZW1haW5kZXIpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2RpdmlkZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfZGl2aWRlIik7CiAKIAkvKiBBbHdheXMgY2hlY2sgZm9yIGEgemVybyBkaXZpc29yICovCiAKIAlpZiAoaW5fZGl2aXNvciA9PSAwKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfdXRfZGl2aWRlOiBEaXZpZGUgYnkgemVyb1xuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9ESVZJREVfQllfWkVSTyk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV91dF9kaXZpZGU6IERpdmlkZSBieSB6ZXJvXG4iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfRElWSURFX0JZX1pFUk8pOwogCX0KIAotCiAJLyogUmV0dXJuIG9ubHkgd2hhdCB3YXMgcmVxdWVzdGVkICovCiAKIAlpZiAob3V0X3F1b3RpZW50KSB7CkBAIC0zMjcsOSArMzA1LDcgQEAKIAkJKm91dF9yZW1haW5kZXIgPSBpbl9kaXZpZGVuZCAlIGluX2Rpdmlzb3I7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAogI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1pc2MuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtaXNjLmMKaW5kZXggZjZkZTRlZC4uMGM1YWJjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWlzYy5jCkBAIC00MSwyNCArNDEsMTMwIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRtaXNjIikKK0FDUElfTU9EVUxFX05BTUUoInV0bWlzYyIpCiAKLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQKKyAqCisgKiBQQVJBTUVURVJTOiAgb3duZXJfaWQgICAgICAgIC0gV2hlcmUgdGhlIG5ldyBvd25lciBJRCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQWxsb2NhdGUgYSB0YWJsZSBvciBtZXRob2Qgb3duZXIgSUQuIFRoZSBvd25lciBJRCBpcyB1c2VkIHRvCisgKiAgICAgICAgICAgICAgdHJhY2sgb2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSB0YWJsZSBvciBtZXRob2QsIHRvIGJlIGRlbGV0ZWQKKyAqICAgICAgICAgICAgICB3aGVuIHRoZSBtZXRob2QgZXhpdHMgb3IgdGhlIHRhYmxlIGlzIHVubG9hZGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkKGFjcGlfb3duZXJfaWQgKiBvd25lcl9pZCkKK3sKKwlhY3BpX25hdGl2ZV91aW50IGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY3JlYXRlX211dGV4ICgKLQlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9hbGxvY2F0ZV9vd25lcl9pZCIpOwogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfZGVsZXRlX211dGV4ICgKLQlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKTsKKwkvKiBHdWFyZCBhZ2FpbnN0IG11bHRpcGxlIGFsbG9jYXRpb25zIG9mIElEIHRvIHRoZSBzYW1lIGxvY2F0aW9uICovCiAKKwlpZiAoKm93bmVyX2lkKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiT3duZXIgSUQgWyUyLjJYXSBhbHJlYWR5IGV4aXN0c1xuIiwKKwkJCQkgICAqb3duZXJfaWQpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FMUkVBRFlfRVhJU1RTKTsKKwl9CisKKwkvKiBNdXRleCBmb3IgdGhlIGdsb2JhbCBJRCBtYXNrICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogRmluZCBhIGZyZWUgb3duZXIgSUQgKi8KKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmICghKGFjcGlfZ2JsX293bmVyX2lkX21hc2sgJiAoMSA8PCBpKSkpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVkFMVUVTLAorCQkJCQkgICJDdXJyZW50IG93bmVyX2lkIG1hc2s6ICU4LjhYIE5ldyBJRDogJTIuMlhcbiIsCisJCQkJCSAgYWNwaV9nYmxfb3duZXJfaWRfbWFzaywKKwkJCQkJICAodW5zaWduZWQgaW50KShpICsgMSkpKTsKKworCQkJYWNwaV9nYmxfb3duZXJfaWRfbWFzayB8PSAoMSA8PCBpKTsKKwkJCSpvd25lcl9pZCA9IChhY3BpX293bmVyX2lkKSAoaSArIDEpOworCQkJZ290byBleGl0OworCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSBhcmUgaGVyZSwgYWxsIG93bmVyX2lkcyBoYXZlIGJlZW4gYWxsb2NhdGVkLiBUaGlzIHByb2JhYmx5IHNob3VsZAorCSAqIG5vdCBoYXBwZW4gc2luY2UgdGhlIElEcyBhcmUgcmV1c2VkIGFmdGVyIGRlYWxsb2NhdGlvbi4gVGhlIElEcyBhcmUKKwkgKiBhbGxvY2F0ZWQgdXBvbiB0YWJsZSBsb2FkIChvbmUgcGVyIHRhYmxlKSBhbmQgbWV0aG9kIGV4ZWN1dGlvbiwgYW5kCisJICogdGhleSBhcmUgcmVsZWFzZWQgd2hlbiBhIHRhYmxlIGlzIHVubG9hZGVkIG9yIGEgbWV0aG9kIGNvbXBsZXRlcworCSAqIGV4ZWN1dGlvbi4KKwkgKi8KKwkqb3duZXJfaWQgPSAwOworCXN0YXR1cyA9IEFFX09XTkVSX0lEX0xJTUlUOworCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGFsbG9jYXRlIG5ldyBvd25lcl9pZCAoMzIgbWF4KSwgQUVfT1dORVJfSURfTElNSVRcbiIpKTsKKworICAgICAgZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZWxlYXNlX293bmVyX2lkCisgKgorICogUEFSQU1FVEVSUzogIG93bmVyX2lkX3B0ciAgICAgICAgLSBQb2ludGVyIHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgb3duZXJfaUQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZS4gTm8gZXJyb3IgaXMgcmV0dXJuZWQgYmVjYXVzZSB3ZSBhcmUgZWl0aGVyIGV4aXRpbmcgYQorICogICAgICAgICAgICAgIGNvbnRyb2wgbWV0aG9kIG9yIHVubG9hZGluZyBhIHRhYmxlLiBFaXRoZXIgd2F5LCB3ZSB3b3VsZAorICogICAgICAgICAgICAgIGlnbm9yZSBhbnkgZXJyb3IgYW55d2F5LgorICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGEgdGFibGUgb3IgbWV0aG9kIG93bmVyIElELiAgVmFsaWQgSURzIGFyZSAxIC0gMzIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZChhY3BpX293bmVyX2lkICogb3duZXJfaWRfcHRyKQoreworCWFjcGlfb3duZXJfaWQgb3duZXJfaWQgPSAqb3duZXJfaWRfcHRyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9yZWxlYXNlX293bmVyX2lkIiwgb3duZXJfaWQpOworCisJLyogQWx3YXlzIGNsZWFyIHRoZSBpbnB1dCBvd25lcl9pZCAoemVybyBpcyBhbiBpbnZhbGlkIElEKSAqLworCisJKm93bmVyX2lkX3B0ciA9IDA7CisKKwkvKiBaZXJvIGlzIG5vdCBhIHZhbGlkIG93bmVyX2lEICovCisKKwlpZiAoKG93bmVyX2lkID09IDApIHx8IChvd25lcl9pZCA+IDMyKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgb3duZXJfaWQ6ICUyLjJYXG4iLCBvd25lcl9pZCkpOworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKiBNdXRleCBmb3IgdGhlIGdsb2JhbCBJRCBtYXNrICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJLyogTm9ybWFsaXplIHRoZSBJRCB0byB6ZXJvICovCisKKwlvd25lcl9pZC0tOworCisJLyogRnJlZSB0aGUgb3duZXIgSUQgb25seSBpZiBpdCBpcyB2YWxpZCAqLworCisJaWYgKGFjcGlfZ2JsX293bmVyX2lkX21hc2sgJiAoMSA8PCBvd25lcl9pZCkpIHsKKwkJYWNwaV9nYmxfb3duZXJfaWRfbWFzayBePSAoMSA8PCBvd25lcl9pZCk7CisJfQorCisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0NBQ0hFUyk7CisJcmV0dXJuX1ZPSUQ7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjYsNyArMTcyLDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgc3JjX3N0cmluZyAgICAgIC0gVGhlIHNvdXJjZSBzdHJpbmcgdG8gY29udmVydAogICoKLSAqIFJFVFVSTjogICAgICBDb252ZXJ0ZWQgc3JjX3N0cmluZyAoc2FtZSBhcyBpbnB1dCBwb2ludGVyKQorICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogQ29udmVydCBzdHJpbmcgdG8gdXBwZXJjYXNlCiAgKgpAQCAtNzQsMjYgKzE4MCwyNSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWNoYXIgKgotYWNwaV91dF9zdHJ1cHIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNyY19zdHJpbmcpCit2b2lkIGFjcGlfdXRfc3RydXByKGNoYXIgKnNyY19zdHJpbmcpCiB7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nOworCWNoYXIgKnN0cmluZzsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlpZiAoIXNyY19zdHJpbmcpIHsKKwkJcmV0dXJuOworCX0KIAogCS8qIFdhbGsgZW50aXJlIHN0cmluZywgdXBwZXJjYXNpbmcgdGhlIGxldHRlcnMgKi8KIAogCWZvciAoc3RyaW5nID0gc3JjX3N0cmluZzsgKnN0cmluZzsgc3RyaW5nKyspIHsKLQkJKnN0cmluZyA9IChjaGFyKSBBQ1BJX1RPVVBQRVIgKCpzdHJpbmcpOworCQkqc3RyaW5nID0gKGNoYXIpQUNQSV9UT1VQUEVSKCpzdHJpbmcpOwogCX0KIAotCXJldHVybiAoc3JjX3N0cmluZyk7CisJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcHJpbnRfc3RyaW5nCkBAIC0xMDgsODUgKzIxMyw3NyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfdXRfcHJpbnRfc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKQordm9pZCBhY3BpX3V0X3ByaW50X3N0cmluZyhjaGFyICpzdHJpbmcsIHU4IG1heF9sZW5ndGgpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCisJdTMyIGk7CiAKIAlpZiAoIXN0cmluZykgewotCQlhY3BpX29zX3ByaW50ZiAoIjxcIk5VTEwgU1RSSU5HIFBUUlwiPiIpOworCQlhY3BpX29zX3ByaW50ZigiPFwiTlVMTCBTVFJJTkcgUFRSXCI+Iik7CiAJCXJldHVybjsKIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIlwiIik7CisJYWNwaV9vc19wcmludGYoIlwiIik7CiAJZm9yIChpID0gMDsgc3RyaW5nW2ldICYmIChpIDwgbWF4X2xlbmd0aCk7IGkrKykgewogCQkvKiBFc2NhcGUgc2VxdWVuY2VzICovCiAKIAkJc3dpdGNoIChzdHJpbmdbaV0pIHsKIAkJY2FzZSAweDA3OgotCQkJYWNwaV9vc19wcmludGYgKCJcXGEiKTsgICAgICAvKiBCRUxMICovCisJCQlhY3BpX29zX3ByaW50ZigiXFxhIik7CS8qIEJFTEwgKi8KIAkJCWJyZWFrOwogCiAJCWNhc2UgMHgwODoKLQkJCWFjcGlfb3NfcHJpbnRmICgiXFxiIik7ICAgICAvKiBCQUNLU1BBQ0UgKi8KKwkJCWFjcGlfb3NfcHJpbnRmKCJcXGIiKTsJLyogQkFDS1NQQUNFICovCiAJCQlicmVhazsKIAogCQljYXNlIDB4MEM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIlxcZiIpOyAgICAgLyogRk9STUZFRUQgKi8KKwkJCWFjcGlfb3NfcHJpbnRmKCJcXGYiKTsJLyogRk9STUZFRUQgKi8KIAkJCWJyZWFrOwogCiAJCWNhc2UgMHgwQToKLQkJCWFjcGlfb3NfcHJpbnRmICgiXFxuIik7ICAgICAvKiBMSU5FRkVFRCAqLworCQkJYWNwaV9vc19wcmludGYoIlxcbiIpOwkvKiBMSU5FRkVFRCAqLwogCQkJYnJlYWs7CiAKIAkJY2FzZSAweDBEOgotCQkJYWNwaV9vc19wcmludGYgKCJcXHIiKTsgICAgIC8qIENBUlJJQUdFIFJFVFVSTiovCisJCQlhY3BpX29zX3ByaW50ZigiXFxyIik7CS8qIENBUlJJQUdFIFJFVFVSTiAqLwogCQkJYnJlYWs7CiAKIAkJY2FzZSAweDA5OgotCQkJYWNwaV9vc19wcmludGYgKCJcXHQiKTsgICAgIC8qIEhPUklaT05UQUwgVEFCICovCisJCQlhY3BpX29zX3ByaW50ZigiXFx0Iik7CS8qIEhPUklaT05UQUwgVEFCICovCiAJCQlicmVhazsKIAogCQljYXNlIDB4MEI6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIlxcdiIpOyAgICAgLyogVkVSVElDQUwgVEFCICovCisJCQlhY3BpX29zX3ByaW50ZigiXFx2Iik7CS8qIFZFUlRJQ0FMIFRBQiAqLwogCQkJYnJlYWs7CiAKLQkJY2FzZSAnXCcnOiAgICAgICAgICAgICAgICAgICAgICAvKiBTaW5nbGUgUXVvdGUgKi8KLQkJY2FzZSAnXCInOiAgICAgICAgICAgICAgICAgICAgICAvKiBEb3VibGUgUXVvdGUgKi8KLQkJY2FzZSAnXFwnOiAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrc2xhc2ggKi8KLQkJCWFjcGlfb3NfcHJpbnRmICgiXFwlYyIsIChpbnQpIHN0cmluZ1tpXSk7CisJCWNhc2UgJ1wnJzoJLyogU2luZ2xlIFF1b3RlICovCisJCWNhc2UgJ1wiJzoJLyogRG91YmxlIFF1b3RlICovCisJCWNhc2UgJ1xcJzoJLyogQmFja3NsYXNoICovCisJCQlhY3BpX29zX3ByaW50ZigiXFwlYyIsIChpbnQpc3RyaW5nW2ldKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAKIAkJCS8qIENoZWNrIGZvciBwcmludGFibGUgY2hhcmFjdGVyIG9yIGhleCBlc2NhcGUgKi8KIAotCQkJaWYgKEFDUElfSVNfUFJJTlQgKHN0cmluZ1tpXSkpCi0JCQl7CisJCQlpZiAoQUNQSV9JU19QUklOVChzdHJpbmdbaV0pKSB7CiAJCQkJLyogVGhpcyBpcyBhIG5vcm1hbCBjaGFyYWN0ZXIgKi8KIAotCQkJCWFjcGlfb3NfcHJpbnRmICgiJWMiLCAoaW50KSBzdHJpbmdbaV0pOwotCQkJfQotCQkJZWxzZQotCQkJeworCQkJCWFjcGlfb3NfcHJpbnRmKCIlYyIsIChpbnQpc3RyaW5nW2ldKTsKKwkJCX0gZWxzZSB7CiAJCQkJLyogQWxsIG90aGVycyB3aWxsIGJlIEhleCBlc2NhcGVzICovCiAKLQkJCQlhY3BpX29zX3ByaW50ZiAoIlxceCUyLjJYIiwgKHMzMikgc3RyaW5nW2ldKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiXFx4JTIuMlgiLCAoczMyKSBzdHJpbmdbaV0pOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JYWNwaV9vc19wcmludGYgKCJcIiIpOworCWFjcGlfb3NfcHJpbnRmKCJcIiIpOwogCiAJaWYgKGkgPT0gbWF4X2xlbmd0aCAmJiBzdHJpbmdbaV0pIHsKLQkJYWNwaV9vc19wcmludGYgKCIuLi4iKTsKKwkJYWNwaV9vc19wcmludGYoIi4uLiIpOwogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2R3b3JkX2J5dGVfc3dhcApAQCAtMTk5LDIyICsyOTYsMTggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MzIKLWFjcGlfdXRfZHdvcmRfYnl0ZV9zd2FwICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKQordTMyIGFjcGlfdXRfZHdvcmRfYnl0ZV9zd2FwKHUzMiB2YWx1ZSkKIHsKIAl1bmlvbiB7Ci0JCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKLQkJdTggICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzWzRdOworCQl1MzIgdmFsdWU7CisJCXU4IGJ5dGVzWzRdOwogCX0gb3V0OwogCXVuaW9uIHsKLQkJdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwotCQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNbNF07CisJCXUzMiB2YWx1ZTsKKwkJdTggYnl0ZXNbNF07CiAJfSBpbjsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWluLnZhbHVlID0gdmFsdWU7CiAKQEAgLTIyNiw3ICszMTksNiBAQAogCXJldHVybiAob3V0LnZhbHVlKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3NldF9pbnRlZ2VyX3dpZHRoCkBAIC0yNDIsMjQgKzMzNCwyMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGggKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb24pCit2b2lkIGFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGgodTggcmV2aXNpb24pCiB7CiAKIAlpZiAocmV2aXNpb24gPD0gMSkgewogCQlhY3BpX2dibF9pbnRlZ2VyX2JpdF93aWR0aCA9IDMyOwogCQlhY3BpX2dibF9pbnRlZ2VyX255YmJsZV93aWR0aCA9IDg7CiAJCWFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9IDQ7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCWFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoID0gNjQ7CiAJCWFjcGlfZ2JsX2ludGVnZXJfbnliYmxlX3dpZHRoID0gMTY7CiAJCWFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9IDg7CiAJfQogfQogCi0KICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yNzcsMTcgKzM2NSwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpvYmpfaGFuZGxlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGgpCithY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSh1OCB0eXBlLAorCQkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm9ial9oYW5kbGUsCisJCQkgICAgICBjaGFyICpwYXRoKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgYnVmZmVyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyogT25seSBwcmludCB0aGUgcGF0aCBpZiB0aGUgYXBwcm9wcmlhdGUgZGVidWcgbGV2ZWwgaXMgZW5hYmxlZCAqLwogCkBAIC0yOTgsOCArMzgzLDggQEAKIAkvKiBHZXQgdGhlIGZ1bGwgcGF0aG5hbWUgdG8gdGhlIG5vZGUgKi8KIAogCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUjsKLQlzdGF0dXMgPSBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZSAob2JqX2hhbmRsZSwgJmJ1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lKG9ial9oYW5kbGUsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm47CiAJfQogCkBAIC0zMDcsMzEgKzM5MiwzMCBAQAogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgotCQlhY3BpX29zX3ByaW50ZiAoIkV4ZWN1dGluZyAgIik7CisJCWFjcGlfb3NfcHJpbnRmKCJFeGVjdXRpbmcgICIpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWFjcGlfb3NfcHJpbnRmICgiSW5pdGlhbGl6aW5nICIpOworCQlhY3BpX29zX3ByaW50ZigiSW5pdGlhbGl6aW5nICIpOwogCQlicmVhazsKIAl9CiAKIAkvKiBQcmludCB0aGUgb2JqZWN0IHR5cGUgYW5kIHBhdGhuYW1lICovCiAKLQlhY3BpX29zX3ByaW50ZiAoIiUtMTJzICVzIiwKLQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlKSwgKGNoYXIgKikgYnVmZmVyLnBvaW50ZXIpOworCWFjcGlfb3NfcHJpbnRmKCIlLTEycyAlcyIsCisJCSAgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSksIChjaGFyICopYnVmZmVyLnBvaW50ZXIpOwogCiAJLyogRXh0cmEgcGF0aCBpcyB1c2VkIHRvIGFwcGVuZCBuYW1lcyBsaWtlIF9TVEEsIF9JTkksIGV0Yy4gKi8KIAogCWlmIChwYXRoKSB7Ci0JCWFjcGlfb3NfcHJpbnRmICgiLiVzIiwgcGF0aCk7CisJCWFjcGlfb3NfcHJpbnRmKCIuJXMiLCBwYXRoKTsKIAl9Ci0JYWNwaV9vc19wcmludGYgKCJcbiIpOworCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwogCi0JQUNQSV9NRU1fRlJFRSAoYnVmZmVyLnBvaW50ZXIpOworCUFDUElfTUVNX0ZSRUUoYnVmZmVyLnBvaW50ZXIpOwogfQogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZF9hY3BpX25hbWUKQEAgLTM0NywyNSArNDMxLDIxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTgKLWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpCit1OCBhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSh1MzIgbmFtZSkKIHsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lX3B0ciA9IChjaGFyICopICZuYW1lOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKKwljaGFyICpuYW1lX3B0ciA9IChjaGFyICopJm5hbWU7CisJY2hhciBjaGFyYWN0ZXI7CisJYWNwaV9uYXRpdmVfdWludCBpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJZm9yIChpID0gMDsgaSA8IEFDUElfTkFNRV9TSVpFOyBpKyspIHsKIAkJY2hhcmFjdGVyID0gKm5hbWVfcHRyOwogCQluYW1lX3B0cisrOwogCiAJCWlmICghKChjaGFyYWN0ZXIgPT0gJ18nKSB8fAotCQkJICAoY2hhcmFjdGVyID49ICdBJyAmJiBjaGFyYWN0ZXIgPD0gJ1onKSB8fAotCQkJICAoY2hhcmFjdGVyID49ICcwJyAmJiBjaGFyYWN0ZXIgPD0gJzknKSkpIHsKKwkJICAgICAgKGNoYXJhY3RlciA+PSAnQScgJiYgY2hhcmFjdGVyIDw9ICdaJykgfHwKKwkJICAgICAgKGNoYXJhY3RlciA+PSAnMCcgJiYgY2hhcmFjdGVyIDw9ICc5JykpKSB7CiAJCQlyZXR1cm4gKEZBTFNFKTsKIAkJfQogCX0KQEAgLTM3Myw3ICs0NTMsNiBAQAogCXJldHVybiAoVFJVRSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZF9hY3BpX2NoYXJhY3RlcgpAQCAtMzg2LDE5ICs0NjUsMTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11OAotYWNwaV91dF92YWxpZF9hY3BpX2NoYXJhY3RlciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIpCit1OCBhY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcmFjdGVyKGNoYXIgY2hhcmFjdGVyKQogewogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlyZXR1cm4gKCh1OCkgICAoKGNoYXJhY3RlciA9PSAnXycpIHx8Ci0JCQkgICAoY2hhcmFjdGVyID49ICdBJyAmJiBjaGFyYWN0ZXIgPD0gJ1onKSB8fAotCQkJICAgKGNoYXJhY3RlciA+PSAnMCcgJiYgY2hhcmFjdGVyIDw9ICc5JykpKTsKKwlyZXR1cm4gKCh1OCkgKChjaGFyYWN0ZXIgPT0gJ18nKSB8fAorCQkgICAgICAoY2hhcmFjdGVyID49ICdBJyAmJiBjaGFyYWN0ZXIgPD0gJ1onKSB8fAorCQkgICAgICAoY2hhcmFjdGVyID49ICcwJyAmJiBjaGFyYWN0ZXIgPD0gJzknKSkpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3RydG91bDY0CkBAIC00MTUsMTggKzQ5MSwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfc3RydG91bDY0ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnJldF9pbnRlZ2VyKQorYWNwaV91dF9zdHJ0b3VsNjQoY2hhciAqc3RyaW5nLCB1MzIgYmFzZSwgYWNwaV9pbnRlZ2VyICogcmV0X2ludGVnZXIpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2RpZ2l0ID0gMDsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDA7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBxdW90aWVudDsKKwl1MzIgdGhpc19kaWdpdCA9IDA7CisJYWNwaV9pbnRlZ2VyIHJldHVybl92YWx1ZSA9IDA7CisJYWNwaV9pbnRlZ2VyIHF1b3RpZW50OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfc3Ryb3VsNjQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3N0cm91bDY0Iik7CiAKIAlpZiAoKCFzdHJpbmcpIHx8ICEoKnN0cmluZykpIHsKIAkJZ290byBlcnJvcl9leGl0OwpAQCAtNDQwLDEyICs1MTEsMTIgQEAKIAogCWRlZmF1bHQ6CiAJCS8qIEludmFsaWQgQmFzZSAqLwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogU2tpcCBvdmVyIGFueSB3aGl0ZSBzcGFjZSBpbiB0aGUgYnVmZmVyICovCiAKLQl3aGlsZSAoQUNQSV9JU19TUEFDRSAoKnN0cmluZykgfHwgKnN0cmluZyA9PSAnXHQnKSB7CisJd2hpbGUgKEFDUElfSVNfU1BBQ0UoKnN0cmluZykgfHwgKnN0cmluZyA9PSAnXHQnKSB7CiAJCXN0cmluZysrOwogCX0KIApAQCAtNDU0LDEyICs1MjUsMTAgQEAKIAkgKiBkZXRlcm1pbmUgaWYgaXQgaXMgZGVjaW1hbCBvciBoZXhhZGVjaW1hbDoKIAkgKi8KIAlpZiAoYmFzZSA9PSAwKSB7Ci0JCWlmICgoKnN0cmluZyA9PSAnMCcpICYmCi0JCQkoQUNQSV9UT0xPV0VSICgqKHN0cmluZyArIDEpKSA9PSAneCcpKSB7CisJCWlmICgoKnN0cmluZyA9PSAnMCcpICYmIChBQ1BJX1RPTE9XRVIoKihzdHJpbmcgKyAxKSkgPT0gJ3gnKSkgewogCQkJYmFzZSA9IDE2OwogCQkJc3RyaW5nICs9IDI7Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQliYXNlID0gMTA7CiAJCX0KIAl9CkBAIC00NjksOCArNTM4LDcgQEAKIAkgKiAwIG9yIDB4LCBpZiB0aGV5IGFyZSBwcmVzZW50LgogCSAqLwogCWlmICgoYmFzZSA9PSAxNikgJiYKLQkJKCpzdHJpbmcgPT0gJzAnKSAmJgotCQkoQUNQSV9UT0xPV0VSICgqKHN0cmluZyArIDEpKSA9PSAneCcpKSB7CisJICAgICgqc3RyaW5nID09ICcwJykgJiYgKEFDUElfVE9MT1dFUigqKHN0cmluZyArIDEpKSA9PSAneCcpKSB7CiAJCXN0cmluZyArPSAyOwogCX0KIApAQCAtNDgzLDI1ICs1NTEsMjMgQEAKIAkvKiBNYWluIGxvb3A6IGNvbnZlcnQgdGhlIHN0cmluZyB0byBhIDY0LWJpdCBpbnRlZ2VyICovCiAKIAl3aGlsZSAoKnN0cmluZykgewotCQlpZiAoQUNQSV9JU19ESUdJVCAoKnN0cmluZykpIHsKKwkJaWYgKEFDUElfSVNfRElHSVQoKnN0cmluZykpIHsKIAkJCS8qIENvbnZlcnQgQVNDSUkgMC05IHRvIERlY2ltYWwgdmFsdWUgKi8KIAotCQkJdGhpc19kaWdpdCA9ICgodTgpICpzdHJpbmcpIC0gJzAnOwotCQl9Ci0JCWVsc2UgeworCQkJdGhpc19kaWdpdCA9ICgodTgpICogc3RyaW5nKSAtICcwJzsKKwkJfSBlbHNlIHsKIAkJCWlmIChiYXNlID09IDEwKSB7CiAJCQkJLyogRGlnaXQgaXMgb3V0IG9mIHJhbmdlICovCiAKIAkJCQlnb3RvIGVycm9yX2V4aXQ7CiAJCQl9CiAKLQkJCXRoaXNfZGlnaXQgPSAodTgpIEFDUElfVE9VUFBFUiAoKnN0cmluZyk7Ci0JCQlpZiAoQUNQSV9JU19YRElHSVQgKChjaGFyKSB0aGlzX2RpZ2l0KSkgeworCQkJdGhpc19kaWdpdCA9ICh1OCkgQUNQSV9UT1VQUEVSKCpzdHJpbmcpOworCQkJaWYgKEFDUElfSVNfWERJR0lUKChjaGFyKXRoaXNfZGlnaXQpKSB7CiAJCQkJLyogQ29udmVydCBBU0NJSSBIZXggY2hhciB0byB2YWx1ZSAqLwogCiAJCQkJdGhpc19kaWdpdCA9IHRoaXNfZGlnaXQgLSAnQScgKyAxMDsKLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQkvKgogCQkJCSAqIFdlIGFsbG93IG5vbi1oZXggY2hhcnMsIGp1c3Qgc3RvcCBub3csIHNhbWUgYXMgZW5kLW9mLXN0cmluZy4KIAkJCQkgKiBTZWUgQUNQSSBzcGVjLCBzdHJpbmctdG8taW50ZWdlciBjb252ZXJzaW9uLgpAQCAtNTEyLDggKzU3OCwxMCBAQAogCiAJCS8qIERpdmlkZSB0aGUgZGlnaXQgaW50byB0aGUgY29ycmVjdCBwb3NpdGlvbiAqLwogCi0JCSh2b2lkKSBhY3BpX3V0X3Nob3J0X2RpdmlkZSAoKEFDUElfSU5URUdFUl9NQVggLSAoYWNwaV9pbnRlZ2VyKSB0aGlzX2RpZ2l0KSwKLQkJCQkgYmFzZSwgJnF1b3RpZW50LCBOVUxMKTsKKwkJKHZvaWQpCisJCSAgICBhY3BpX3V0X3Nob3J0X2RpdmlkZSgoQUNQSV9JTlRFR0VSX01BWCAtCisJCQkJCSAgKGFjcGlfaW50ZWdlcikgdGhpc19kaWdpdCksIGJhc2UsCisJCQkJCSAmcXVvdGllbnQsIE5VTEwpOwogCQlpZiAocmV0dXJuX3ZhbHVlID4gcXVvdGllbnQpIHsKIAkJCWdvdG8gZXJyb3JfZXhpdDsKIAkJfQpAQCAtNTI2LDMzNSArNTk0LDE4IEBACiAJLyogQWxsIGRvbmUsIG5vcm1hbCBleGl0ICovCiAKIAkqcmV0X2ludGVnZXIgPSByZXR1cm5fdmFsdWU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAotCi1lcnJvcl9leGl0OgorICAgICAgZXJyb3JfZXhpdDoKIAkvKiBCYXNlIHdhcyBzZXQvdmFsaWRhdGVkIGFib3ZlICovCiAKIAlpZiAoYmFzZSA9PSAxMCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9ERUNJTUFMX0NPTlNUQU5UKTsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX0hFWF9DT05TVEFOVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREVDSU1BTF9DT05TVEFOVCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9IRVhfQ09OU1RBTlQpOwogCX0KIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X211dGV4X2luaXRpYWxpemUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZS4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSB0aGUgc3lzdGVtIG11dGV4IG9iamVjdHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZSAoCi0Jdm9pZCkKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9tdXRleF9pbml0aWFsaXplIik7Ci0KLQotCS8qCi0JICogQ3JlYXRlIGVhY2ggb2YgdGhlIHByZWRlZmluZWQgbXV0ZXggb2JqZWN0cwotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBOVU1fTVVURVg7IGkrKykgewotCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV9tdXRleCAoaSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLQkJfQotCX0KLQotCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX2xvY2sgKCZhY3BpX2dibF9ncGVfbG9jayk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfbXV0ZXhfdGVybWluYXRlCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUuCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUuCi0gKgotICogREVTQ1JJUFRJT046IERlbGV0ZSBhbGwgb2YgdGhlIHN5c3RlbSBtdXRleCBvYmplY3RzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfdXRfbXV0ZXhfdGVybWluYXRlICgKLQl2b2lkKQotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X211dGV4X3Rlcm1pbmF0ZSIpOwotCi0KLQkvKgotCSAqIERlbGV0ZSBlYWNoIHByZWRlZmluZWQgbXV0ZXggb2JqZWN0Ci0JICovCi0JZm9yIChpID0gMDsgaSA8IE5VTV9NVVRFWDsgaSsrKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X2RlbGV0ZV9tdXRleCAoaSk7Ci0JfQotCi0JYWNwaV9vc19kZWxldGVfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2spOwotCXJldHVybl9WT0lEOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX211dGV4Ci0gKgotICogUEFSQU1FVEVSUzogIG11dGV4X2lEICAgICAgICAtIElEIG9mIHRoZSBtdXRleCB0byBiZSBjcmVhdGVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBtdXRleCBvYmplY3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NyZWF0ZV9tdXRleCAoCi0JYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCkKLXsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMiAoInV0X2NyZWF0ZV9tdXRleCIsIG11dGV4X2lkKTsKLQotCi0JaWYgKG11dGV4X2lkID4gTUFYX01VVEVYKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKCFhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCkgewotCQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUgKDEsIDEsCi0JCQkJICAmYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ubXV0ZXgpOwotCQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5vd25lcl9pZCA9IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEOwotCQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS51c2VfY291bnQgPSAwOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9tdXRleAotICoKLSAqIFBBUkFNRVRFUlM6ICBtdXRleF9pRCAgICAgICAgLSBJRCBvZiB0aGUgbXV0ZXggdG8gYmUgZGVsZXRlZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGVsZXRlIGEgbXV0ZXggb2JqZWN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9kZWxldGVfbXV0ZXggKAotCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpCi17Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgidXRfZGVsZXRlX211dGV4IiwgbXV0ZXhfaWQpOwotCi0KLQlpZiAobXV0ZXhfaWQgPiBNQVhfTVVURVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUgKGFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm11dGV4KTsKLQotCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm11dGV4ID0gTlVMTDsKLQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5vd25lcl9pZCA9IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWNxdWlyZV9tdXRleAotICoKLSAqIFBBUkFNRVRFUlM6ICBtdXRleF9pRCAgICAgICAgLSBJRCBvZiB0aGUgbXV0ZXggdG8gYmUgYWNxdWlyZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEFjcXVpcmUgYSBtdXRleCBvYmplY3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfYWNxdWlyZV9tdXRleCAoCi0JYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCkKLXsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyZWFkX2lkOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJ1dF9hY3F1aXJlX211dGV4Iik7Ci0KLQotCWlmIChtdXRleF9pZCA+IE1BWF9NVVRFWCkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXRoaXNfdGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkICgpOwotCi0jaWZkZWYgQUNQSV9NVVRFWF9ERUJVRwotCXsKLQkJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCQkvKgotCQkgKiBNdXRleCBkZWJ1ZyBjb2RlLCBmb3IgaW50ZXJuYWwgZGVidWdnaW5nIG9ubHkuCi0JCSAqCi0JCSAqIERlYWRsb2NrIHByZXZlbnRpb24uICBDaGVjayBpZiB0aGlzIHRocmVhZCBvd25zIGFueSBtdXRleGVzIG9mIHZhbHVlCi0JCSAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIG9uZS4gIElmIHNvLCB0aGUgdGhyZWFkIGhhcyB2aW9sYXRlZAotCQkgKiB0aGUgbXV0ZXggb3JkZXJpbmcgcnVsZS4gIFRoaXMgaW5kaWNhdGVzIGEgY29kaW5nIGVycm9yIHNvbWV3aGVyZSBpbgotCQkgKiB0aGUgQUNQSSBzdWJzeXN0ZW0gY29kZS4KLQkJICovCi0JCWZvciAoaSA9IG11dGV4X2lkOyBpIDwgTUFYX01VVEVYOyBpKyspIHsKLQkJCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW2ldLm93bmVyX2lkID09IHRoaXNfdGhyZWFkX2lkKSB7Ci0JCQkJaWYgKGkgPT0gbXV0ZXhfaWQpIHsKLQkJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCQkiTXV0ZXggWyVzXSBhbHJlYWR5IGFjcXVpcmVkIGJ5IHRoaXMgdGhyZWFkIFslWF1cbiIsCi0JCQkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCksIHRoaXNfdGhyZWFkX2lkKSk7Ci0KLQkJCQkJcmV0dXJuIChBRV9BTFJFQURZX0FDUVVJUkVEKTsKLQkJCQl9Ci0KLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkludmFsaWQgYWNxdWlyZSBvcmRlcjogVGhyZWFkICVYIG93bnMgWyVzXSwgd2FudHMgWyVzXVxuIiwKLQkJCQkJdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKGkpLAotCQkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKLQotCQkJCXJldHVybiAoQUVfQUNRVUlSRV9ERUFETE9DSyk7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLAotCQkiVGhyZWFkICVYIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSBNdXRleCBbJXNdXG4iLAotCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7Ci0KLQlzdGF0dXMgPSBhY3BpX29zX3dhaXRfc2VtYXBob3JlIChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCwKLQkJCSAgIDEsIEFDUElfV0FJVF9GT1JFVkVSKTsKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLCAiVGhyZWFkICVYIGFjcXVpcmVkIE11dGV4IFslc11cbiIsCi0JCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7Ci0KLQkJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udXNlX2NvdW50Kys7Ci0JCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm93bmVyX2lkID0gdGhpc190aHJlYWRfaWQ7Ci0JfQotCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJUaHJlYWQgJVggY291bGQgbm90IGFjcXVpcmUgTXV0ZXggWyVzXSAlc1xuIiwKLQkJCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCX0KLQotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgKLSAqCi0gKiBQQVJBTUVURVJTOiAgbXV0ZXhfaUQgICAgICAgIC0gSUQgb2YgdGhlIG11dGV4IHRvIGJlIHJlbGVhc2VkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGEgbXV0ZXggb2JqZWN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X3JlbGVhc2VfbXV0ZXggKAotCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpCi17Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc190aHJlYWRfaWQ7Ci0KLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoInV0X3JlbGVhc2VfbXV0ZXgiKTsKLQotCi0JdGhpc190aHJlYWRfaWQgPSBhY3BpX29zX2dldF90aHJlYWRfaWQgKCk7Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsCi0JCSJUaHJlYWQgJVggcmVsZWFzaW5nIE11dGV4IFslc11cbiIsIHRoaXNfdGhyZWFkX2lkLAotCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKLQotCWlmIChtdXRleF9pZCA+IE1BWF9NVVRFWCkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qCi0JICogTXV0ZXggbXVzdCBiZSBhY3F1aXJlZCBpbiBvcmRlciB0byByZWxlYXNlIGl0IQotCSAqLwotCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5vd25lcl9pZCA9PSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJNdXRleCBbJXNdIGlzIG5vdCBhY3F1aXJlZCwgY2Fubm90IHJlbGVhc2VcbiIsCi0JCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKLQotCQlyZXR1cm4gKEFFX05PVF9BQ1FVSVJFRCk7Ci0JfQotCi0JLyoKLQkgKiBEZWFkbG9jayBwcmV2ZW50aW9uLiAgQ2hlY2sgaWYgdGhpcyB0aHJlYWQgb3ducyBhbnkgbXV0ZXhlcyBvZiB2YWx1ZQotCSAqIGdyZWF0ZXIgdGhhbiB0aGlzIG9uZS4gIElmIHNvLCB0aGUgdGhyZWFkIGhhcyB2aW9sYXRlZCB0aGUgbXV0ZXgKLQkgKiBvcmRlcmluZyBydWxlLiAgVGhpcyBpbmRpY2F0ZXMgYSBjb2RpbmcgZXJyb3Igc29tZXdoZXJlIGluCi0JICogdGhlIEFDUEkgc3Vic3lzdGVtIGNvZGUuCi0JICovCi0JZm9yIChpID0gbXV0ZXhfaWQ7IGkgPCBNQVhfTVVURVg7IGkrKykgewotCQlpZiAoYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS5vd25lcl9pZCA9PSB0aGlzX3RocmVhZF9pZCkgewotCQkJaWYgKGkgPT0gbXV0ZXhfaWQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkludmFsaWQgcmVsZWFzZSBvcmRlcjogb3ducyBbJXNdLCByZWxlYXNpbmcgWyVzXVxuIiwKLQkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChpKSwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7Ci0KLQkJCXJldHVybiAoQUVfUkVMRUFTRV9ERUFETE9DSyk7Ci0JCX0KLQl9Ci0KLQkvKiBNYXJrIHVubG9ja2VkIEZJUlNUICovCi0KLQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5vd25lcl9pZCA9IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEOwotCi0Jc3RhdHVzID0gYWNwaV9vc19zaWduYWxfc2VtYXBob3JlIChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCwgMSk7Ci0KLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlRocmVhZCAlWCBjb3VsZCBub3QgcmVsZWFzZSBNdXRleCBbJXNdICVzXG4iLAotCQkJdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCX0KLQllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsICJUaHJlYWQgJVggcmVsZWFzZWQgTXV0ZXggWyVzXVxuIiwKLQkJCXRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKLQl9Ci0KLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoCkBAIC04NzAsMTYgKzYyMSwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZV9hbmRfcHVzaCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipzdGF0ZV9saXN0KQorYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwKKwkJCQkgICAgIHUxNiBhY3Rpb24sCisJCQkJICAgICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKipzdGF0ZV9saXN0KQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgICpzdGF0ZTsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyogSWdub3JlIG51bGwgb2JqZWN0czsgdGhlc2UgYXJlIGV4cGVjdGVkICovCiAKQEAgLTg4NywzNzEgKzYzNSwxNSBAQAogCQlyZXR1cm4gKEFFX09LKTsKIAl9CiAKLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZSAob2JqZWN0LCBhY3Rpb24pOworCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlKG9iamVjdCwgYWN0aW9uKTsKIAlpZiAoIXN0YXRlKSB7CiAJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSAoc3RhdGVfbGlzdCwgc3RhdGUpOworCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlKHN0YXRlX2xpc3QsIHN0YXRlKTsKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGVfYW5kX3B1c2gKLSAqCi0gKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgIC0gT2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBuZXcgc3RhdGUKLSAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBJbmNyZW1lbnQvRGVjcmVtZW50Ci0gKiAgICAgICAgICAgICAgc3RhdGVfbGlzdCAgICAgIC0gTGlzdCB0aGUgc3RhdGUgd2lsbCBiZSBhZGRlZCB0bwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IHN0YXRlIGFuZCBwdXNoIGl0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqKnN0YXRlX2xpc3QpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAgKnN0YXRlOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZSAoaW50ZXJuYWxfb2JqZWN0LCBleHRlcm5hbF9vYmplY3QsIGluZGV4KTsKLQlpZiAoIXN0YXRlKSB7Ci0JCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSAoc3RhdGVfbGlzdCwgc3RhdGUpOwotCXJldHVybiAoQUVfT0spOwotfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIGxpc3RfaGVhZCAgICAgICAgICAgLSBIZWFkIG9mIHRoZSBzdGF0ZSBzdGFjawotICogICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgLSBTdGF0ZSBvYmplY3QgdG8gcHVzaAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFB1c2ggYSBzdGF0ZSBvYmplY3Qgb250byBhIHN0YXRlIHN0YWNrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUgKAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipsaXN0X2hlYWQsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X3B1c2hfZ2VuZXJpY19zdGF0ZSIpOwotCi0KLQkvKiBQdXNoIHRoZSBzdGF0ZSBvYmplY3Qgb250byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgKHN0YWNrKSAqLwotCi0Jc3RhdGUtPmNvbW1vbi5uZXh0ID0gKmxpc3RfaGVhZDsKLQkqbGlzdF9oZWFkID0gc3RhdGU7Ci0KLQlyZXR1cm5fVk9JRDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIGxpc3RfaGVhZCAgICAgICAgICAgLSBIZWFkIG9mIHRoZSBzdGF0ZSBzdGFjawotICoKLSAqIFJFVFVSTjogICAgICBUaGUgcG9wcGVkIHN0YXRlIG9iamVjdAotICoKLSAqIERFU0NSSVBUSU9OOiBQb3AgYSBzdGF0ZSBvYmplY3QgZnJvbSBhIHN0YXRlIHN0YWNrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUgKAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipsaXN0X2hlYWQpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9wb3BfZ2VuZXJpY19zdGF0ZSIpOwotCi0KLQkvKiBSZW1vdmUgdGhlIHN0YXRlIG9iamVjdCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAoc3RhY2spICovCi0KLQlzdGF0ZSA9ICpsaXN0X2hlYWQ7Ci0JaWYgKHN0YXRlKSB7Ci0JCS8qIFVwZGF0ZSB0aGUgbGlzdCBoZWFkICovCi0KLQkJKmxpc3RfaGVhZCA9IHN0YXRlLT5jb21tb24ubmV4dDsKLQl9Ci0KLQlyZXR1cm5fUFRSIChzdGF0ZSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFRoZSBuZXcgc3RhdGUgb2JqZWN0LiBOVUxMIG9uIGZhaWx1cmUuCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIGdlbmVyaWMgc3RhdGUgb2JqZWN0LiAgQXR0ZW1wdCB0byBvYnRhaW4gb25lIGZyb20KLSAqICAgICAgICAgICAgICB0aGUgZ2xvYmFsIHN0YXRlIGNhY2hlOyAgSWYgbm9uZSBhdmFpbGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKAotCXZvaWQpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7Ci0KLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCXN0YXRlID0gYWNwaV91dF9hY3F1aXJlX2Zyb21fY2FjaGUgKEFDUElfTUVNX0xJU1RfU1RBVEUpOwotCi0JLyogSW5pdGlhbGl6ZSAqLwotCi0JaWYgKHN0YXRlKSB7Ci0JCXN0YXRlLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEU7Ci0JfQotCi0JcmV0dXJuIChzdGF0ZSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfdGhyZWFkX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgTmV3IFRocmVhZCBTdGF0ZS4gTlVMTCBvbiBmYWlsdXJlCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhICJUaHJlYWQgU3RhdGUiIC0gYSBmbGF2b3Igb2YgdGhlIGdlbmVyaWMgc3RhdGUgdXNlZAotICogICAgICAgICAgICAgIHRvIHRyYWNrIHBlci10aHJlYWQgaW5mbyBkdXJpbmcgbWV0aG9kIGV4ZWN1dGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqCi1hY3BpX3V0X2NyZWF0ZV90aHJlYWRfc3RhdGUgKAotCXZvaWQpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9jcmVhdGVfdGhyZWFkX3N0YXRlIik7Ci0KLQotCS8qIENyZWF0ZSB0aGUgZ2VuZXJpYyBzdGF0ZSBvYmplY3QgKi8KLQotCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSAoKTsKLQlpZiAoIXN0YXRlKSB7Ci0JCXJldHVybl9QVFIgKE5VTEwpOwotCX0KLQotCS8qIEluaXQgZmllbGRzIHNwZWNpZmljIHRvIHRoZSB1cGRhdGUgc3RydWN0ICovCi0KLQlzdGF0ZS0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1RIUkVBRDsKLQlzdGF0ZS0+dGhyZWFkLnRocmVhZF9pZCA9IGFjcGlfb3NfZ2V0X3RocmVhZF9pZCAoKTsKLQotCXJldHVybl9QVFIgKChzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKikgc3RhdGUpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBJbml0aWFsIE9iamVjdCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHN0YXRlCi0gKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gVXBkYXRlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhbiAiVXBkYXRlIFN0YXRlIiAtIGEgZmxhdm9yIG9mIHRoZSBnZW5lcmljIHN0YXRlIHVzZWQKLSAqICAgICAgICAgICAgICB0byB1cGRhdGUgcmVmZXJlbmNlIGNvdW50cyBhbmQgZGVsZXRlIGNvbXBsZXggb2JqZWN0cyBzdWNoCi0gKiAgICAgICAgICAgICAgYXMgcGFja2FnZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKQotewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X2NyZWF0ZV91cGRhdGVfc3RhdGUiLCBvYmplY3QpOwotCi0KLQkvKiBDcmVhdGUgdGhlIGdlbmVyaWMgc3RhdGUgb2JqZWN0ICovCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKCk7Ci0JaWYgKCFzdGF0ZSkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKLQl9Ci0KLQkvKiBJbml0IGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgdXBkYXRlIHN0cnVjdCAqLwotCi0Jc3RhdGUtPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9VUERBVEU7Ci0Jc3RhdGUtPnVwZGF0ZS5vYmplY3QgPSBvYmplY3Q7Ci0Jc3RhdGUtPnVwZGF0ZS52YWx1ZSAgPSBhY3Rpb247Ci0KLQlyZXR1cm5fUFRSIChzdGF0ZSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIEluaXRpYWwgT2JqZWN0IHRvIGJlIGluc3RhbGxlZCBpbiB0aGUgc3RhdGUKLSAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBVcGRhdGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZAotICoKLSAqIFJFVFVSTjogICAgICBOZXcgc3RhdGUgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgIlBhY2thZ2UgU3RhdGUiCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW50ZXJuYWxfb2JqZWN0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVybmFsX29iamVjdCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KQotewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X2NyZWF0ZV9wa2dfc3RhdGUiLCBpbnRlcm5hbF9vYmplY3QpOwotCi0KLQkvKiBDcmVhdGUgdGhlIGdlbmVyaWMgc3RhdGUgb2JqZWN0ICovCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKCk7Ci0JaWYgKCFzdGF0ZSkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKLQl9Ci0KLQkvKiBJbml0IGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgdXBkYXRlIHN0cnVjdCAqLwotCi0Jc3RhdGUtPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9QQUNLQUdFOwotCXN0YXRlLT5wa2cuc291cmNlX29iamVjdCA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopIGludGVybmFsX29iamVjdDsKLQlzdGF0ZS0+cGtnLmRlc3Rfb2JqZWN0ICA9IGV4dGVybmFsX29iamVjdDsKLQlzdGF0ZS0+cGtnLmluZGV4ICAgICAgICA9IGluZGV4OwotCXN0YXRlLT5wa2cubnVtX3BhY2thZ2VzID0gMTsKLQotCXJldHVybl9QVFIgKHN0YXRlKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9jb250cm9sX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhICJDb250cm9sIFN0YXRlIiAtIGEgZmxhdm9yIG9mIHRoZSBnZW5lcmljIHN0YXRlIHVzZWQKLSAqICAgICAgICAgICAgICB0byBzdXBwb3J0IG5lc3RlZCBJRi9XSElMRSBjb25zdHJ1Y3RzIGluIHRoZSBBTUwuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUgKAotCXZvaWQpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9jcmVhdGVfY29udHJvbF9zdGF0ZSIpOwotCi0KLQkvKiBDcmVhdGUgdGhlIGdlbmVyaWMgc3RhdGUgb2JqZWN0ICovCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKCk7Ci0JaWYgKCFzdGF0ZSkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKLQl9Ci0KLQkvKiBJbml0IGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgY29udHJvbCBzdHJ1Y3QgKi8KLQotCXN0YXRlLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfQ09OVFJPTDsKLQlzdGF0ZS0+Y29tbW9uLnN0YXRlICAgICA9IEFDUElfQ09OVFJPTF9DT05ESVRJT05BTF9FWEVDVVRJTkc7Ci0KLQlyZXR1cm5fUFRSIChzdGF0ZSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBTdGF0ZSAgICAgICAgICAgICAgIC0gVGhlIHN0YXRlIG9iamVjdCB0byBiZSBkZWxldGVkCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUHV0IGEgc3RhdGUgb2JqZWN0IGJhY2sgaW50byB0aGUgZ2xvYmFsIHN0YXRlIGNhY2hlLiAgVGhlIG9iamVjdAotICogICAgICAgICAgICAgIGlzIG5vdCBhY3R1YWxseSBmcmVlZCBhdCB0aGlzIHRpbWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIik7Ci0KLQotCWFjcGlfdXRfcmVsZWFzZV90b19jYWNoZSAoQUNQSV9NRU1fTElTVF9TVEFURSwgc3RhdGUpOwotCXJldHVybl9WT0lEOwotfQotCi0KLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGVfY2FjaGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFB1cmdlIHRoZSBnbG9iYWwgc3RhdGUgb2JqZWN0IGNhY2hlLiAgVXNlZCBkdXJpbmcgc3Vic3lzdGVtCi0gKiAgICAgICAgICAgICAgdGVybWluYXRpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZV9jYWNoZSAoCi0Jdm9pZCkKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfZGVsZXRlX2dlbmVyaWNfc3RhdGVfY2FjaGUiKTsKLQotCi0JYWNwaV91dF9kZWxldGVfZ2VuZXJpY19jYWNoZSAoQUNQSV9NRU1fTElTVF9TVEFURSk7Ci0JcmV0dXJuX1ZPSUQ7Ci19Ci0jZW5kaWYKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlCkBAIC0xMjY4LDMzICs2NjAsMjkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhcmdldF9vYmplY3QsCi0JYWNwaV9wa2dfY2FsbGJhY2sgICAgICAgICAgICAgICB3YWxrX2NhbGxiYWNrLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpCithY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiBzb3VyY2Vfb2JqZWN0LAorCQkJICB2b2lkICp0YXJnZXRfb2JqZWN0LAorCQkJICBhY3BpX3BrZ19jYWxsYmFjayB3YWxrX2NhbGxiYWNrLCB2b2lkICpjb250ZXh0KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGVfbGlzdCA9IE5VTEw7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2luZGV4OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRoaXNfc291cmNlX29iajsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlX2xpc3QgPSBOVUxMOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CisJdTMyIHRoaXNfaW5kZXg7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGhpc19zb3VyY2Vfb2JqOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfd2Fsa19wYWNrYWdlX3RyZWUiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF93YWxrX3BhY2thZ2VfdHJlZSIpOwotCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZSAoc291cmNlX29iamVjdCwgdGFyZ2V0X29iamVjdCwgMCk7CisJc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGUoc291cmNlX29iamVjdCwgdGFyZ2V0X29iamVjdCwgMCk7CiAJaWYgKCFzdGF0ZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCXdoaWxlIChzdGF0ZSkgewogCQkvKiBHZXQgb25lIGVsZW1lbnQgb2YgdGhlIHBhY2thZ2UgKi8KIAotCQl0aGlzX2luZGV4ICAgID0gc3RhdGUtPnBrZy5pbmRleDsKKwkJdGhpc19pbmRleCA9IHN0YXRlLT5wa2cuaW5kZXg7CiAJCXRoaXNfc291cmNlX29iaiA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopCi0JCQkJICBzdGF0ZS0+cGtnLnNvdXJjZV9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbdGhpc19pbmRleF07CisJCSAgICBzdGF0ZS0+cGtnLnNvdXJjZV9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbdGhpc19pbmRleF07CiAKIAkJLyoKIAkJICogQ2hlY2sgZm9yOgpAQCAtMTMwNSwxNiArNjkzLDIwIEBACiAJCSAqICAgIGNhc2UgYmVsb3cuCiAJCSAqLwogCQlpZiAoKCF0aGlzX3NvdXJjZV9vYmopIHx8Ci0JCQkoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFICh0aGlzX3NvdXJjZV9vYmopICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHx8Ci0JCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHRoaXNfc291cmNlX29iaikgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7Ci0JCQlzdGF0dXMgPSB3YWxrX2NhbGxiYWNrIChBQ1BJX0NPUFlfVFlQRV9TSU1QTEUsIHRoaXNfc291cmNlX29iaiwKLQkJCQkJIHN0YXRlLCBjb250ZXh0KTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCSAgICAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHRoaXNfc291cmNlX29iaikgIT0KKwkJICAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKQorCQkgICAgfHwgKEFDUElfR0VUX09CSkVDVF9UWVBFKHRoaXNfc291cmNlX29iaikgIT0KKwkJCUFDUElfVFlQRV9QQUNLQUdFKSkgeworCQkJc3RhdHVzID0KKwkJCSAgICB3YWxrX2NhbGxiYWNrKEFDUElfQ09QWV9UWVBFX1NJTVBMRSwKKwkJCQkJICB0aGlzX3NvdXJjZV9vYmosIHN0YXRlLCBjb250ZXh0KTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCiAJCQlzdGF0ZS0+cGtnLmluZGV4Kys7Ci0JCQl3aGlsZSAoc3RhdGUtPnBrZy5pbmRleCA+PSBzdGF0ZS0+cGtnLnNvdXJjZV9vYmplY3QtPnBhY2thZ2UuY291bnQpIHsKKwkJCXdoaWxlIChzdGF0ZS0+cGtnLmluZGV4ID49CisJCQkgICAgICAgc3RhdGUtPnBrZy5zb3VyY2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50KSB7CiAJCQkJLyoKIAkJCQkgKiBXZSd2ZSBoYW5kbGVkIGFsbCBvZiB0aGUgb2JqZWN0cyBhdCB0aGlzIGxldmVsLCAgVGhpcyBtZWFucwogCQkJCSAqIHRoYXQgd2UgaGF2ZSBqdXN0IGNvbXBsZXRlZCBhIHBhY2thZ2UuICBUaGF0IHBhY2thZ2UgbWF5CkBAIC0xMzIyLDggKzcxNCw4IEBACiAJCQkJICoKIAkJCQkgKiBEZWxldGUgdGhpcyBzdGF0ZSBhbmQgcG9wIHRoZSBwcmV2aW91cyBzdGF0ZSAocGFja2FnZSkuCiAJCQkJICovCi0JCQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoc3RhdGUpOwotCQkJCXN0YXRlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSAoJnN0YXRlX2xpc3QpOworCQkJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc3RhdGUpOworCQkJCXN0YXRlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmc3RhdGVfbGlzdCk7CiAKIAkJCQkvKiBGaW5pc2hlZCB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHN0YXRlcyAqLwogCkBAIC0xMzMzLDcgKzcyNSw3IEBACiAJCQkJCSAqIHBhY2thZ2UganVzdCBhZGQgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2FnZSBvYmplY3RzCiAJCQkJCSAqIGFuZCBleGl0CiAJCQkJCSAqLwotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJCQl9CiAKIAkJCQkvKgpAQCAtMTM0MiwzNSArNzM0LDM1IEBACiAJCQkJICovCiAJCQkJc3RhdGUtPnBrZy5pbmRleCsrOwogCQkJfQotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyogVGhpcyBpcyBhIHN1Ym9iamVjdCBvZiB0eXBlIHBhY2thZ2UgKi8KIAotCQkJc3RhdHVzID0gd2Fsa19jYWxsYmFjayAoQUNQSV9DT1BZX1RZUEVfUEFDS0FHRSwgdGhpc19zb3VyY2Vfb2JqLAotCQkJCQkgIHN0YXRlLCBjb250ZXh0KTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPQorCQkJICAgIHdhbGtfY2FsbGJhY2soQUNQSV9DT1BZX1RZUEVfUEFDS0FHRSwKKwkJCQkJICB0aGlzX3NvdXJjZV9vYmosIHN0YXRlLCBjb250ZXh0KTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCiAJCQkvKgogCQkJICogUHVzaCB0aGUgY3VycmVudCBzdGF0ZSBhbmQgY3JlYXRlIGEgbmV3IG9uZQogCQkJICogVGhlIGNhbGxiYWNrIGFib3ZlIHJldHVybmVkIGEgbmV3IHRhcmdldCBwYWNrYWdlIG9iamVjdC4KIAkJCSAqLwotCQkJYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUgKCZzdGF0ZV9saXN0LCBzdGF0ZSk7Ci0JCQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZSAodGhpc19zb3VyY2Vfb2JqLAotCQkJCQkgICBzdGF0ZS0+cGtnLnRoaXNfdGFyZ2V0X29iaiwgMCk7CisJCQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSgmc3RhdGVfbGlzdCwgc3RhdGUpOworCQkJc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGUodGhpc19zb3VyY2Vfb2JqLAorCQkJCQkJCSBzdGF0ZS0+cGtnLgorCQkJCQkJCSB0aGlzX3RhcmdldF9vYmosIDApOwogCQkJaWYgKCFzdGF0ZSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJCX0KIAkJfQogCX0KIAogCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2VuZXJhdGVfY2hlY2tzdW0KQEAgLTEzODQsMjMgKzc3NiwxOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4Ci1hY3BpX3V0X2dlbmVyYXRlX2NoZWNrc3VtICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpCit1OCBhY3BpX3V0X2dlbmVyYXRlX2NoZWNrc3VtKHU4ICogYnVmZmVyLCB1MzIgbGVuZ3RoKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlzaWduZWQgY2hhciAgICAgICAgICAgICAgICAgICAgIHN1bSA9IDA7Ci0KKwl1MzIgaTsKKwlzaWduZWQgY2hhciBzdW0gPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCXN1bSA9IChzaWduZWQgY2hhcikgKHN1bSArIGJ1ZmZlcltpXSk7CisJCXN1bSA9IChzaWduZWQgY2hhcikoc3VtICsgYnVmZmVyW2ldKTsKIAl9CiAKIAlyZXR1cm4gKCh1OCkgKDAgLSBzdW0pKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnCkBAIC0xNDEzLDE3ICs4MDAsMTMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KLXU4ICoKLWFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKQordTggKmFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqIG9ial9kZXNjKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2J5dGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmVuZF9idWZmZXI7CisJdTggYnVmZmVyX2J5dGU7CisJdTggKmJ1ZmZlcjsKKwl1OCAqZW5kX2J1ZmZlcjsKIAotCi0JYnVmZmVyICAgID0gb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOworCWJ1ZmZlciA9IG9ial9kZXNjLT5idWZmZXIucG9pbnRlcjsKIAllbmRfYnVmZmVyID0gYnVmZmVyICsgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7CiAKIAl3aGlsZSAoYnVmZmVyIDwgZW5kX2J1ZmZlcikgewpAQCAtMTQzMSwxMiArODE0LDEyIEBACiAJCWlmIChidWZmZXJfYnl0ZSAmIEFDUElfUkRFU0NfVFlQRV9NQVNLKSB7CiAJCQkvKiBMYXJnZSBEZXNjcmlwdG9yIC0gTGVuZ3RoIGlzIG5leHQgMiBieXRlcyAqLwogCi0JCQlidWZmZXIgKz0gKCgqKGJ1ZmZlcisxKSB8ICgqKGJ1ZmZlcisyKSA8PCA4KSkgKyAzKTsKLQkJfQotCQllbHNlIHsKKwkJCWJ1ZmZlciArPSAoKCooYnVmZmVyICsgMSkgfCAoKihidWZmZXIgKyAyKSA8PCA4KSkgKyAzKTsKKwkJfSBlbHNlIHsKIAkJCS8qIFNtYWxsIERlc2NyaXB0b3IuICBFbmQgVGFnIHdpbGwgYmUgZm91bmQgaGVyZSAqLwogCi0JCQlpZiAoKGJ1ZmZlcl9ieXRlICYgQUNQSV9SREVTQ19TTUFMTF9NQVNLKSA9PSBBQ1BJX1JERVNDX1RZUEVfRU5EX1RBRykgeworCQkJaWYgKChidWZmZXJfYnl0ZSAmIEFDUElfUkRFU0NfU01BTExfTUFTSykgPT0KKwkJCSAgICBBQ1BJX1JERVNDX1RZUEVfRU5EX1RBRykgewogCQkJCS8qIEZvdW5kIHRoZSBlbmQgdGFnIGRlc2NyaXB0b3IsIGFsbCBkb25lLiAqLwogCiAJCQkJcmV0dXJuIChidWZmZXIpOwpAQCAtMTQ1Myw3ICs4MzYsNiBAQAogCXJldHVybiAoTlVMTCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZXBvcnRfZXJyb3IKQEAgLTE0NjgsMTcgKzg1MCwxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfdXRfcmVwb3J0X2Vycm9yICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkKQordm9pZCBhY3BpX3V0X3JlcG9ydF9lcnJvcihjaGFyICptb2R1bGVfbmFtZSwgdTMyIGxpbmVfbnVtYmVyLCB1MzIgY29tcG9uZW50X2lkKQogewogCi0JYWNwaV9vc19wcmludGYgKCIlOHMtJTA0ZDogKioqIEVycm9yOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCWFjcGlfb3NfcHJpbnRmKCIlOHMtJTA0ZDogKioqIEVycm9yOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcmVwb3J0X3dhcm5pbmcKQEAgLTE0OTQsMTYgKzg3MSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV91dF9yZXBvcnRfd2FybmluZyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCkKK2FjcGlfdXRfcmVwb3J0X3dhcm5pbmcoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlciwgdTMyIGNvbXBvbmVudF9pZCkKIHsKIAotCWFjcGlfb3NfcHJpbnRmICgiJThzLSUwNGQ6ICoqKiBXYXJuaW5nOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCWFjcGlfb3NfcHJpbnRmKCIlOHMtJTA0ZDogKioqIFdhcm5pbmc6ICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZXBvcnRfaW5mbwpAQCAtMTUxOCwxNCArODkxLDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X3JlcG9ydF9pbmZvICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkKQordm9pZCBhY3BpX3V0X3JlcG9ydF9pbmZvKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIsIHUzMiBjb21wb25lbnRfaWQpCiB7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiU4cy0lMDRkOiAqKiogSW5mbzogIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKKwlhY3BpX29zX3ByaW50ZigiJThzLSUwNGQ6ICoqKiBJbmZvOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtdXRleC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG11dGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxMzRjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtdXRleC5jCkBAIC0wLDAgKzEsMzU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB1dG11dGV4IC0gbG9jYWwgbXV0ZXggc3VwcG9ydAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCitBQ1BJX01PRFVMRV9OQU1FKCJ1dG11dGV4IikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdXRfY3JlYXRlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKTsKKworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdXRfZGVsZXRlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9tdXRleF9pbml0aWFsaXplCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUuCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDcmVhdGUgdGhlIHN5c3RlbSBtdXRleCBvYmplY3RzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZSh2b2lkKQoreworCXUzMiBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X211dGV4X2luaXRpYWxpemUiKTsKKworCS8qCisJICogQ3JlYXRlIGVhY2ggb2YgdGhlIHByZWRlZmluZWQgbXV0ZXggb2JqZWN0cworCSAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fTVVURVg7IGkrKykgeworCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV9tdXRleChpKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0KKworCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX2xvY2soJmFjcGlfZ2JsX2dwZV9sb2NrKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9tdXRleF90ZXJtaW5hdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZS4KKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZS4KKyAqCisgKiBERVNDUklQVElPTjogRGVsZXRlIGFsbCBvZiB0aGUgc3lzdGVtIG11dGV4IG9iamVjdHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX3V0X211dGV4X3Rlcm1pbmF0ZSh2b2lkKQoreworCXUzMiBpOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfbXV0ZXhfdGVybWluYXRlIik7CisKKwkvKgorCSAqIERlbGV0ZSBlYWNoIHByZWRlZmluZWQgbXV0ZXggb2JqZWN0CisJICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9NVVRFWDsgaSsrKSB7CisJCSh2b2lkKWFjcGlfdXRfZGVsZXRlX211dGV4KGkpOworCX0KKworCWFjcGlfb3NfZGVsZXRlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9tdXRleAorICoKKyAqIFBBUkFNRVRFUlM6ICBtdXRleF9pRCAgICAgICAgLSBJRCBvZiB0aGUgbXV0ZXggdG8gYmUgY3JlYXRlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbXV0ZXggb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3V0X2NyZWF0ZV9tdXRleChhY3BpX211dGV4X2hhbmRsZSBtdXRleF9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9jcmVhdGVfbXV0ZXgiLCBtdXRleF9pZCk7CisKKwlpZiAobXV0ZXhfaWQgPiBNQVhfTVVURVgpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCWlmICghYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ubXV0ZXgpIHsKKwkJc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlKDEsIDEsCisJCQkJCQkgICZhY3BpX2dibF9tdXRleF9pbmZvCisJCQkJCQkgIFttdXRleF9pZF0ubXV0ZXgpOworCQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS50aHJlYWRfaWQgPQorCQkgICAgQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQ7CisJCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLnVzZV9jb3VudCA9IDA7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVsZXRlX211dGV4CisgKgorICogUEFSQU1FVEVSUzogIG11dGV4X2lEICAgICAgICAtIElEIG9mIHRoZSBtdXRleCB0byBiZSBkZWxldGVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEZWxldGUgYSBtdXRleCBvYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdXRfZGVsZXRlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9kZWxldGVfbXV0ZXgiLCBtdXRleF9pZCk7CisKKwlpZiAobXV0ZXhfaWQgPiBNQVhfTVVURVgpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCXN0YXR1cyA9IGFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZShhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCk7CisKKwlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCA9IE5VTEw7CisJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udGhyZWFkX2lkID0gQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQ7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9hY3F1aXJlX211dGV4CisgKgorICogUEFSQU1FVEVSUzogIG11dGV4X2lEICAgICAgICAtIElEIG9mIHRoZSBtdXRleCB0byBiZSBhY3F1aXJlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQWNxdWlyZSBhIG11dGV4IG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoYWNwaV9tdXRleF9oYW5kbGUgbXV0ZXhfaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiB0aGlzX3RocmVhZF9pZDsKKworCUFDUElfRlVOQ1RJT05fTkFNRSgidXRfYWNxdWlyZV9tdXRleCIpOworCisJaWYgKG11dGV4X2lkID4gTUFYX01VVEVYKSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJdGhpc190aHJlYWRfaWQgPSBhY3BpX29zX2dldF90aHJlYWRfaWQoKTsKKworI2lmZGVmIEFDUElfTVVURVhfREVCVUcKKwl7CisJCXUzMiBpOworCQkvKgorCQkgKiBNdXRleCBkZWJ1ZyBjb2RlLCBmb3IgaW50ZXJuYWwgZGVidWdnaW5nIG9ubHkuCisJCSAqCisJCSAqIERlYWRsb2NrIHByZXZlbnRpb24uICBDaGVjayBpZiB0aGlzIHRocmVhZCBvd25zIGFueSBtdXRleGVzIG9mIHZhbHVlCisJCSAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIG9uZS4gIElmIHNvLCB0aGUgdGhyZWFkIGhhcyB2aW9sYXRlZAorCQkgKiB0aGUgbXV0ZXggb3JkZXJpbmcgcnVsZS4gIFRoaXMgaW5kaWNhdGVzIGEgY29kaW5nIGVycm9yIHNvbWV3aGVyZSBpbgorCQkgKiB0aGUgQUNQSSBzdWJzeXN0ZW0gY29kZS4KKwkJICovCisJCWZvciAoaSA9IG11dGV4X2lkOyBpIDwgTUFYX01VVEVYOyBpKyspIHsKKwkJCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW2ldLm93bmVyX2lkID09IHRoaXNfdGhyZWFkX2lkKSB7CisJCQkJaWYgKGkgPT0gbXV0ZXhfaWQpIHsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCQkgICJNdXRleCBbJXNdIGFscmVhZHkgYWNxdWlyZWQgYnkgdGhpcyB0aHJlYWQgWyVYXVxuIiwKKwkJCQkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUKKwkJCQkJCQkgIChtdXRleF9pZCksCisJCQkJCQkJICB0aGlzX3RocmVhZF9pZCkpOworCisJCQkJCXJldHVybiAoQUVfQUxSRUFEWV9BQ1FVSVJFRCk7CisJCQkJfQorCisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIkludmFsaWQgYWNxdWlyZSBvcmRlcjogVGhyZWFkICVYIG93bnMgWyVzXSwgd2FudHMgWyVzXVxuIiwKKwkJCQkJCSAgdGhpc190aHJlYWRfaWQsCisJCQkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUoaSksCisJCQkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUKKwkJCQkJCSAgKG11dGV4X2lkKSkpOworCisJCQkJcmV0dXJuIChBRV9BQ1FVSVJFX0RFQURMT0NLKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwKKwkJCSAgIlRocmVhZCAlWCBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgTXV0ZXggWyVzXVxuIiwKKwkJCSAgdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisKKwlzdGF0dXMgPSBhY3BpX29zX3dhaXRfc2VtYXBob3JlKGFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm11dGV4LAorCQkJCQkxLCBBQ1BJX1dBSVRfRk9SRVZFUik7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTVVURVgsCisJCQkJICAiVGhyZWFkICVYIGFjcXVpcmVkIE11dGV4IFslc11cbiIsCisJCQkJICB0aGlzX3RocmVhZF9pZCwKKwkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisKKwkJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udXNlX2NvdW50Kys7CisJCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLnRocmVhZF9pZCA9IHRoaXNfdGhyZWFkX2lkOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVGhyZWFkICVYIGNvdWxkIG5vdCBhY3F1aXJlIE11dGV4IFslc10gJXNcbiIsCisJCQkJICB0aGlzX3RocmVhZF9pZCwKKwkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwl9CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcmVsZWFzZV9tdXRleAorICoKKyAqIFBBUkFNRVRFUlM6ICBtdXRleF9pRCAgICAgICAgLSBJRCBvZiB0aGUgbXV0ZXggdG8gYmUgcmVsZWFzZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJlbGVhc2UgYSBtdXRleCBvYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV91dF9yZWxlYXNlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgdGhpc190aHJlYWRfaWQ7CisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoInV0X3JlbGVhc2VfbXV0ZXgiKTsKKworCXRoaXNfdGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkKCk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwKKwkJCSAgIlRocmVhZCAlWCByZWxlYXNpbmcgTXV0ZXggWyVzXVxuIiwgdGhpc190aHJlYWRfaWQsCisJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisKKwlpZiAobXV0ZXhfaWQgPiBNQVhfTVVURVgpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKgorCSAqIE11dGV4IG11c3QgYmUgYWNxdWlyZWQgaW4gb3JkZXIgdG8gcmVsZWFzZSBpdCEKKwkgKi8KKwlpZiAoYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udGhyZWFkX2lkID09IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTXV0ZXggWyVzXSBpcyBub3QgYWNxdWlyZWQsIGNhbm5vdCByZWxlYXNlXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCkpKTsKKworCQlyZXR1cm4gKEFFX05PVF9BQ1FVSVJFRCk7CisJfQorI2lmZGVmIEFDUElfTVVURVhfREVCVUcKKwl7CisJCXUzMiBpOworCQkvKgorCQkgKiBNdXRleCBkZWJ1ZyBjb2RlLCBmb3IgaW50ZXJuYWwgZGVidWdnaW5nIG9ubHkuCisJCSAqCisJCSAqIERlYWRsb2NrIHByZXZlbnRpb24uICBDaGVjayBpZiB0aGlzIHRocmVhZCBvd25zIGFueSBtdXRleGVzIG9mIHZhbHVlCisJCSAqIGdyZWF0ZXIgdGhhbiB0aGlzIG9uZS4gIElmIHNvLCB0aGUgdGhyZWFkIGhhcyB2aW9sYXRlZCB0aGUgbXV0ZXgKKwkJICogb3JkZXJpbmcgcnVsZS4gIFRoaXMgaW5kaWNhdGVzIGEgY29kaW5nIGVycm9yIHNvbWV3aGVyZSBpbgorCQkgKiB0aGUgQUNQSSBzdWJzeXN0ZW0gY29kZS4KKwkJICovCisJCWZvciAoaSA9IG11dGV4X2lkOyBpIDwgTUFYX01VVEVYOyBpKyspIHsKKwkJCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW2ldLm93bmVyX2lkID09IHRoaXNfdGhyZWFkX2lkKSB7CisJCQkJaWYgKGkgPT0gbXV0ZXhfaWQpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIkludmFsaWQgcmVsZWFzZSBvcmRlcjogb3ducyBbJXNdLCByZWxlYXNpbmcgWyVzXVxuIiwKKwkJCQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShpKSwKKwkJCQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZQorCQkJCQkJICAobXV0ZXhfaWQpKSk7CisKKwkJCQlyZXR1cm4gKEFFX1JFTEVBU0VfREVBRExPQ0spOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwkvKiBNYXJrIHVubG9ja2VkIEZJUlNUICovCisKKwlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS50aHJlYWRfaWQgPSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRDsKKworCXN0YXR1cyA9CisJICAgIGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZShhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCwgMSk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJUaHJlYWQgJVggY291bGQgbm90IHJlbGVhc2UgTXV0ZXggWyVzXSAlc1xuIiwKKwkJCQkgIHRoaXNfdGhyZWFkX2lkLAorCQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCksCisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTVVURVgsCisJCQkJICAiVGhyZWFkICVYIHJlbGVhc2VkIE11dGV4IFslc11cbiIsCisJCQkJICB0aGlzX3RocmVhZF9pZCwKKwkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisJfQorCisJcmV0dXJuIChzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jCmluZGV4IGNkMzg5OWI5Li4zMDE1ZTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jCkBAIC00MSwzNCArNDEsMjYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dG9iamVjdCIpCitBQ1BJX01PRFVMRV9OQU1FKCJ1dG9iamVjdCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwKKwkJCSAgICAgICBhY3BpX3NpemUgKiBvYmpfbGVuZ3RoKTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9zaW1wbGVfb2JqZWN0X3NpemUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iaiwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpvYmpfbGVuZ3RoKTsKK2FjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqLAorCQkJCWFjcGlfc2l6ZSAqIG9ial9sZW5ndGgpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iaiwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpvYmpfbGVuZ3RoKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCithY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCh1OCBvYmplY3RfdHlwZSwKKwkJCSAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3QsCisJCQkgICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlLCB2b2lkICpjb250ZXh0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC05MSwyNiArODMsMjUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICoKLWFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdF9kYmcgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlKQordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyhjaGFyICptb2R1bGVfbmFtZSwKKwkJCQkJCQkgICAgICB1MzIgbGluZV9udW1iZXIsCisJCQkJCQkJICAgICAgdTMyIGNvbXBvbmVudF9pZCwKKwkJCQkJCQkgICAgICBhY3BpX29iamVjdF90eXBlCisJCQkJCQkJICAgICAgdHlwZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3Q7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc2Vjb25kX29iamVjdDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc2Vjb25kX29iamVjdDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJ1dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyIsCi0JCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZSkpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoInV0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3RfZGJnIiwKKwkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpOwogCiAJLyogQWxsb2NhdGUgdGhlIHJhdyBvYmplY3QgZGVzY3JpcHRvciAqLwogCi0Jb2JqZWN0ID0gYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcgKG1vZHVsZV9uYW1lLCBsaW5lX251bWJlciwgY29tcG9uZW50X2lkKTsKKwlvYmplY3QgPQorCSAgICBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyhtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIsCisJCQkJCSAgICAgY29tcG9uZW50X2lkKTsKIAlpZiAoIW9iamVjdCkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAlzd2l0Y2ggKHR5cGUpIHsKQEAgLTExOSwxMSArMTEwLDEyIEBACiAKIAkJLyogVGhlc2UgdHlwZXMgcmVxdWlyZSBhIHNlY29uZGFyeSBvYmplY3QgKi8KIAotCQlzZWNvbmRfb2JqZWN0ID0gYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcgKG1vZHVsZV9uYW1lLAotCQkJCSAgIGxpbmVfbnVtYmVyLCBjb21wb25lbnRfaWQpOworCQlzZWNvbmRfb2JqZWN0ID0gYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcobW9kdWxlX25hbWUsCisJCQkJCQkJCSBsaW5lX251bWJlciwKKwkJCQkJCQkJIGNvbXBvbmVudF9pZCk7CiAJCWlmICghc2Vjb25kX29iamVjdCkgewotCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKG9iamVjdCk7Ci0JCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKG9iamVjdCk7CisJCQlyZXR1cm5fUFRSKE5VTEwpOwogCQl9CiAKIAkJc2Vjb25kX29iamVjdC0+Y29tbW9uLnR5cGUgPSBBQ1BJX1RZUEVfTE9DQUxfRVhUUkE7CkBAIC0xNDksMTAgKzE0MSw5IEBACiAKIAkvKiBBbnkgcGVyLXR5cGUgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGdvIGhlcmUgKi8KIAotCXJldHVybl9QVFIgKG9iamVjdCk7CisJcmV0dXJuX1BUUihvYmplY3QpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QKQEAgLTE2NSwyMiArMTU2LDE4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqCi1hY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0ICgKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplKQordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdChhY3BpX3NpemUgYnVmZmVyX3NpemUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqYnVmZmVyX2Rlc2M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gTlVMTDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpidWZmZXJfZGVzYzsKKwl1OCAqYnVmZmVyID0gTlVMTDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIgKCJ1dF9jcmVhdGVfYnVmZmVyX29iamVjdCIsIGJ1ZmZlcl9zaXplKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9jcmVhdGVfYnVmZmVyX29iamVjdCIsIGJ1ZmZlcl9zaXplKTsKIAogCS8qIENyZWF0ZSBhIG5ldyBCdWZmZXIgb2JqZWN0ICovCiAKLQlidWZmZXJfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0JVRkZFUik7CisJYnVmZmVyX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0JVRkZFUik7CiAJaWYgKCFidWZmZXJfZGVzYykgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAkvKiBDcmVhdGUgYW4gYWN0dWFsIGJ1ZmZlciBvbmx5IGlmIHNpemUgPiAwICovCkBAIC0xODgsMTIgKzE3NSwxMSBAQAogCWlmIChidWZmZXJfc2l6ZSA+IDApIHsKIAkJLyogQWxsb2NhdGUgdGhlIGFjdHVhbCBidWZmZXIgKi8KIAotCQlidWZmZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKGJ1ZmZlcl9zaXplKTsKKwkJYnVmZmVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFKGJ1ZmZlcl9zaXplKTsKIAkJaWYgKCFidWZmZXIpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoImNyZWF0ZV9idWZmZXI6IGNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYXG4iLAotCQkJCSh1MzIpIGJ1ZmZlcl9zaXplKSk7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGJ1ZmZlcl9kZXNjKTsKLQkJCXJldHVybl9QVFIgKE5VTEwpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJjcmVhdGVfYnVmZmVyOiBjb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWFxuIiwgKHUzMikgYnVmZmVyX3NpemUpKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShidWZmZXJfZGVzYyk7CisJCQlyZXR1cm5fUFRSKE5VTEwpOwogCQl9CiAJfQogCkBAIC0yMDUsMTAgKzE5MSw5IEBACiAKIAkvKiBSZXR1cm4gdGhlIG5ldyBidWZmZXIgZGVzY3JpcHRvciAqLwogCi0JcmV0dXJuX1BUUiAoYnVmZmVyX2Rlc2MpOworCXJldHVybl9QVFIoYnVmZmVyX2Rlc2MpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QKQEAgLTIyMywzNCArMjA4LDI5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqCi1hY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0ICgKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19zaXplKQordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdChhY3BpX3NpemUgc3RyaW5nX3NpemUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc3RyaW5nX2Rlc2M7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnN0cmluZ19kZXNjOworCWNoYXIgKnN0cmluZzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIgKCJ1dF9jcmVhdGVfc3RyaW5nX29iamVjdCIsIHN0cmluZ19zaXplKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9jcmVhdGVfc3RyaW5nX29iamVjdCIsIHN0cmluZ19zaXplKTsKIAogCS8qIENyZWF0ZSBhIG5ldyBTdHJpbmcgb2JqZWN0ICovCiAKLQlzdHJpbmdfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX1NUUklORyk7CisJc3RyaW5nX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX1NUUklORyk7CiAJaWYgKCFzdHJpbmdfZGVzYykgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAkvKgogCSAqIEFsbG9jYXRlIHRoZSBhY3R1YWwgc3RyaW5nIGJ1ZmZlciAtLSAoU2l6ZSArIDEpIGZvciBOVUxMIHRlcm1pbmF0b3IuCiAJICogTk9URTogWmVyby1sZW5ndGggc3RyaW5ncyBhcmUgTlVMTCB0ZXJtaW5hdGVkCiAJICovCi0Jc3RyaW5nID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChzdHJpbmdfc2l6ZSArIDEpOworCXN0cmluZyA9IEFDUElfTUVNX0NBTExPQ0FURShzdHJpbmdfc2l6ZSArIDEpOwogCWlmICghc3RyaW5nKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoImNyZWF0ZV9zdHJpbmc6IGNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYXG4iLAotCQkJKHUzMikgc3RyaW5nX3NpemUpKTsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChzdHJpbmdfZGVzYyk7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImNyZWF0ZV9zdHJpbmc6IGNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYXG4iLCAodTMyKSBzdHJpbmdfc2l6ZSkpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uoc3RyaW5nX2Rlc2MpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAogCS8qIENvbXBsZXRlIHN0cmluZyBvYmplY3QgaW5pdGlhbGl6YXRpb24gKi8KQEAgLTI2MCwxMCArMjQwLDkgQEAKIAogCS8qIFJldHVybiB0aGUgbmV3IHN0cmluZyBkZXNjcmlwdG9yICovCiAKLQlyZXR1cm5fUFRSIChzdHJpbmdfZGVzYyk7CisJcmV0dXJuX1BUUihzdHJpbmdfZGVzYyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3QKQEAgLTI3NiwyNCArMjU1LDIxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTgKLWFjcGlfdXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0ICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QpCit1OCBhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdCh2b2lkICpvYmplY3QpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJ1dF92YWxpZF9pbnRlcm5hbF9vYmplY3QiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgidXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0Iik7CiAKIAkvKiBDaGVjayBmb3IgYSBudWxsIHBvaW50ZXIgKi8KIAogCWlmICghb2JqZWN0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICIqKioqIE51bGwgT2JqZWN0IFB0clxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICIqKioqIE51bGwgT2JqZWN0IFB0clxuIikpOwogCQlyZXR1cm4gKEZBTFNFKTsKIAl9CiAKIAkvKiBDaGVjayB0aGUgZGVzY3JpcHRvciB0eXBlIGZpZWxkICovCiAKLQlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqZWN0KSkgeworCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkpIHsKIAljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6CiAKIAkJLyogVGhlIG9iamVjdCBhcHBlYXJzIHRvIGJlIGEgdmFsaWQgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAqLwpAQCAtMzAxLDE2ICsyNzcsMTUgQEAKIAkJcmV0dXJuIChUUlVFKTsKIAogCWRlZmF1bHQ6Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkJIiVwIGlzIG5vdCBub3QgYW4gQUNQSSBvcGVyYW5kIG9iaiBbJXNdXG4iLAotCQkJCW9iamVjdCwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChvYmplY3QpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICIlcCBpcyBub3Qgbm90IGFuIEFDUEkgb3BlcmFuZCBvYmogWyVzXVxuIiwKKwkJCQkgIG9iamVjdCwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKG9iamVjdCkpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIChGQUxTRSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcKQEAgLTMyNiwzNyArMzAxLDMxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAqCi1hY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCkKK3ZvaWQgKmFjcGlfdXRfYWxsb2NhdGVfb2JqZWN0X2Rlc2NfZGJnKGNoYXIgKm1vZHVsZV9uYW1lLAorCQkJCSAgICAgICB1MzIgbGluZV9udW1iZXIsIHUzMiBjb21wb25lbnRfaWQpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdDsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyIpOwotCi0KLQlvYmplY3QgPSBhY3BpX3V0X2FjcXVpcmVfZnJvbV9jYWNoZSAoQUNQSV9NRU1fTElTVF9PUEVSQU5EKTsKKwlvYmplY3QgPSBhY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfZ2JsX29wZXJhbmRfY2FjaGUpOwogCWlmICghb2JqZWN0KSB7Ci0JCV9BQ1BJX1JFUE9SVF9FUlJPUiAobW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyLCBjb21wb25lbnRfaWQsCi0JCQkJICAoIkNvdWxkIG5vdCBhbGxvY2F0ZSBhbiBvYmplY3QgZGVzY3JpcHRvclxuIikpOworCQlfQUNQSV9SRVBPUlRfRVJST1IobW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyLCBjb21wb25lbnRfaWQsCisJCQkJICAgKCJDb3VsZCBub3QgYWxsb2NhdGUgYW4gb2JqZWN0IGRlc2NyaXB0b3JcbiIpKTsKIAotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAkvKiBNYXJrIHRoZSBkZXNjcmlwdG9yIHR5cGUgKi8KKwltZW1zZXQob2JqZWN0LCAwLCBzaXplb2YodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCkpOworCUFDUElfU0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QsIEFDUElfREVTQ19UWVBFX09QRVJBTkQpOwogCi0JQUNQSV9TRVRfREVTQ1JJUFRPUl9UWVBFIChvYmplY3QsIEFDUElfREVTQ19UWVBFX09QRVJBTkQpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsICIlcCBTaXplICVYXG4iLAorCQkJICBvYmplY3QsICh1MzIpIHNpemVvZih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0KSkpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICIlcCBTaXplICVYXG4iLAotCQkJb2JqZWN0LCAodTMyKSBzaXplb2YgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpKSk7Ci0KLQlyZXR1cm5fUFRSIChvYmplY3QpOworCXJldHVybl9QVFIob2JqZWN0KTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYwpAQCAtMzY5LDU1ICszMzgsMjMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KQordm9pZCBhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJ1dF9kZWxldGVfb2JqZWN0X2Rlc2MiLCBvYmplY3QpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2RlbGV0ZV9vYmplY3RfZGVzYyIsIG9iamVjdCk7CiAKIAkvKiBPYmplY3QgbXVzdCBiZSBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICovCiAKLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmplY3QpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIiVwIGlzIG5vdCBhbiBBQ1BJIE9wZXJhbmQgb2JqZWN0IFslc11cbiIsIG9iamVjdCwKLQkJCQlhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKG9iamVjdCkpKTsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIiVwIGlzIG5vdCBhbiBBQ1BJIE9wZXJhbmQgb2JqZWN0IFslc11cbiIsCisJCQkJICBvYmplY3QsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShvYmplY3QpKSk7CiAJCXJldHVybl9WT0lEOwogCX0KIAotCWFjcGlfdXRfcmVsZWFzZV90b19jYWNoZSAoQUNQSV9NRU1fTElTVF9PUEVSQU5ELCBvYmplY3QpOwotCisJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9vcGVyYW5kX2NhY2hlLCBvYmplY3QpOwogCXJldHVybl9WT0lEOwogfQogCi0KLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVsZXRlX29iamVjdF9jYWNoZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUHVyZ2UgdGhlIGdsb2JhbCBzdGF0ZSBvYmplY3QgY2FjaGUuICBVc2VkIGR1cmluZyBzdWJzeXN0ZW0KLSAqICAgICAgICAgICAgICB0ZXJtaW5hdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9vYmplY3RfY2FjaGUgKAotCXZvaWQpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2RlbGV0ZV9vYmplY3RfY2FjaGUiKTsKLQotCi0JYWNwaV91dF9kZWxldGVfZ2VuZXJpY19jYWNoZSAoQUNQSV9NRU1fTElTVF9PUEVSQU5EKTsKLQlyZXR1cm5fVk9JRDsKLX0KLSNlbmRpZgotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZQpAQCAtNDM2LDE2ICszNzMsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCkKK2FjcGlfdXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3QsCisJCQkgICAgICAgYWNwaV9zaXplICogb2JqX2xlbmd0aCkKIHsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc2l6ZSBsZW5ndGg7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgidXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZSIsIGludGVybmFsX29iamVjdCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigidXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZSIsIGludGVybmFsX29iamVjdCk7CiAKIAkvKgogCSAqIEhhbmRsZSBhIG51bGwgb2JqZWN0IChDb3VsZCBiZSBhIHVuaW5pdGlhbGl6ZWQgcGFja2FnZQpAQCAtNDUzLDE4ICszODcsMTggQEAKIAkgKi8KIAlpZiAoIWludGVybmFsX29iamVjdCkgewogCQkqb2JqX2xlbmd0aCA9IDA7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIFN0YXJ0IHdpdGggdGhlIGxlbmd0aCBvZiB0aGUgQWNwaSBvYmplY3QgKi8KIAotCWxlbmd0aCA9IHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpOworCWxlbmd0aCA9IHNpemVvZih1bmlvbiBhY3BpX29iamVjdCk7CiAKLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChpbnRlcm5hbF9vYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShpbnRlcm5hbF9vYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CiAJCS8qIE9iamVjdCBpcyBhIG5hbWVkIG9iamVjdCAocmVmZXJlbmNlKSwganVzdCByZXR1cm4gdGhlIGxlbmd0aCAqLwogCi0JCSpvYmpfbGVuZ3RoID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAobGVuZ3RoKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkqb2JqX2xlbmd0aCA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQobGVuZ3RoKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTQ3MywxOSArNDA3LDE3IEBACiAJICogbXVzdCBiZSBhY2Nlc3NlZCBieXRld2lzZSBvciB0aGVyZSBtYXkgYmUgYWxpZ25tZW50IHByb2JsZW1zIG9uCiAJICogY2VydGFpbiBwcm9jZXNzb3JzCiAJICovCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoaW50ZXJuYWxfb2JqZWN0KSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KSkgewogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAogCQlsZW5ndGggKz0gKGFjcGlfc2l6ZSkgaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoICsgMTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAogCQlsZW5ndGggKz0gKGFjcGlfc2l6ZSkgaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6CiAJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6CkBAIC00OTUsNyArNDI3LDYgQEAKIAkJICovCiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CiAKIAkJc3dpdGNoIChpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5vcGNvZGUpIHsKQEAgLTUwNSw4ICs0MzYsMTAgQEAKIAkJCSAqIEdldCB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgZnVsbCBwYXRobmFtZSB0byB0aGlzIG9iamVjdC4KIAkJCSAqIFRoZSByZWZlcmVuY2Ugd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHBhdGhuYW1lIHRvIHRoZSBvYmplY3QKIAkJCSAqLwotCQkJbGVuZ3RoICs9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKAotCQkJCQkgYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoIChpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5ub2RlKSk7CisJCQlsZW5ndGggKz0KKwkJCSAgICBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JECisJCQkgICAgKGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aAorCQkJICAgICAoaW50ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2Uubm9kZSkpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKQEAgLTUxNiwxOSArNDQ5LDIxIEBACiAJCQkgKiBOb3RhYmx5LCBMb2NhbHMgYW5kIEFyZ3MgYXJlIG5vdCBzdXBwb3J0ZWQsIGJ1dCB0aGlzIG1heSBiZQogCQkJICogcmVxdWlyZWQgZXZlbnR1YWxseS4KIAkJCSAqLwotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIlVuc3VwcG9ydGVkIFJlZmVyZW5jZSBvcGNvZGU9JVggaW4gb2JqZWN0ICVwXG4iLAotCQkJCWludGVybmFsX29iamVjdC0+cmVmZXJlbmNlLm9wY29kZSwgaW50ZXJuYWxfb2JqZWN0KSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJVbnN1cHBvcnRlZCBSZWZlcmVuY2Ugb3Bjb2RlPSVYIGluIG9iamVjdCAlcFxuIiwKKwkJCQkJICBpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5vcGNvZGUsCisJCQkJCSAgaW50ZXJuYWxfb2JqZWN0KSk7CiAJCQlzdGF0dXMgPSBBRV9UWVBFOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbnN1cHBvcnRlZCB0eXBlPSVYIGluIG9iamVjdCAlcFxuIiwKLQkJCUFDUElfR0VUX09CSkVDVF9UWVBFIChpbnRlcm5hbF9vYmplY3QpLCBpbnRlcm5hbF9vYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbnN1cHBvcnRlZCB0eXBlPSVYIGluIG9iamVjdCAlcFxuIiwKKwkJCQkgIEFDUElfR0VUX09CSkVDVF9UWVBFKGludGVybmFsX29iamVjdCksCisJCQkJICBpbnRlcm5hbF9vYmplY3QpKTsKIAkJc3RhdHVzID0gQUVfVFlQRTsKIAkJYnJlYWs7CiAJfQpAQCAtNTM5LDExICs0NzQsMTAgQEAKIAkgKiBvbiBhIG1hY2hpbmUgd29yZCBib3VuZGFyeS4gKHByZXZlbnRpbmcgYWxpZ25tZW50IGZhdWx0cyBvbiBzb21lCiAJICogbWFjaGluZXMuKQogCSAqLwotCSpvYmpfbGVuZ3RoID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAobGVuZ3RoKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJKm9ial9sZW5ndGggPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKGxlbmd0aCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfZWxlbWVudF9sZW5ndGgKQEAgLTU1NywxNiArNDkxLDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfZ2V0X2VsZW1lbnRfbGVuZ3RoICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCkKK2FjcGlfdXRfZ2V0X2VsZW1lbnRfbGVuZ3RoKHU4IG9iamVjdF90eXBlLAorCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iamVjdCwKKwkJCSAgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9wa2dfaW5mbyAgICAgICAgICAgICppbmZvID0gKHN0cnVjdCBhY3BpX3BrZ19pbmZvICopIGNvbnRleHQ7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc3BhY2U7Ci0KKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9wa2dfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYWNwaV9wa2dfaW5mbyAqKWNvbnRleHQ7CisJYWNwaV9zaXplIG9iamVjdF9zcGFjZTsKIAogCXN3aXRjaCAob2JqZWN0X3R5cGUpIHsKIAljYXNlIEFDUElfQ09QWV9UWVBFX1NJTVBMRToKQEAgLTU3NSwxNSArNTA2LDE2IEBACiAJCSAqIFNpbXBsZSBvYmplY3QgLSBqdXN0IGdldCB0aGUgc2l6ZSAoTnVsbCBvYmplY3QvZW50cnkgaXMgaGFuZGxlZAogCQkgKiBoZXJlIGFsc28pIGFuZCBzdW0gaXQgaW50byB0aGUgcnVubmluZyBwYWNrYWdlIGxlbmd0aAogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplIChzb3VyY2Vfb2JqZWN0LCAmb2JqZWN0X3NwYWNlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplKHNvdXJjZV9vYmplY3QsCisJCQkJCQkgICAmb2JqZWN0X3NwYWNlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCX0KIAogCQlpbmZvLT5sZW5ndGggKz0gb2JqZWN0X3NwYWNlOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX0NPUFlfVFlQRV9QQUNLQUdFOgogCiAJCS8qIFBhY2thZ2Ugb2JqZWN0IC0gbm90aGluZyBtdWNoIHRvIGRvIGhlcmUsIGxldCB0aGUgd2FsayBoYW5kbGUgaXQgKi8KQEAgLTU5Miw3ICs1MjQsNiBAQAogCQlzdGF0ZS0+cGtnLnRoaXNfdGFyZ2V0X29iaiA9IE5VTEw7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCiAJCS8qIE5vIG90aGVyIHR5cGVzIGFsbG93ZWQgKi8KQEAgLTYwMyw3ICs1MzQsNiBAQAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplCkBAIC02MjIsMjUgKzU1MiwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCkKK2FjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAorCQkJCWFjcGlfc2l6ZSAqIG9ial9sZW5ndGgpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfcGtnX2luZm8gICAgICAgICAgICBpbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9wa2dfaW5mbyBpbmZvOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2dldF9wYWNrYWdlX29iamVjdF9zaXplIiwgaW50ZXJuYWxfb2JqZWN0KTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgidXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUiLCBpbnRlcm5hbF9vYmplY3QpOwotCi0KLQlpbmZvLmxlbmd0aCAgICAgID0gMDsKKwlpbmZvLmxlbmd0aCA9IDA7CiAJaW5mby5vYmplY3Rfc3BhY2UgPSAwOwogCWluZm8ubnVtX3BhY2thZ2VzID0gMTsKIAotCXN0YXR1cyA9IGFjcGlfdXRfd2Fsa19wYWNrYWdlX3RyZWUgKGludGVybmFsX29iamVjdCwgTlVMTCwKLQkJCSBhY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCwgJmluZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfd2Fsa19wYWNrYWdlX3RyZWUoaW50ZXJuYWxfb2JqZWN0LCBOVUxMLAorCQkJCQkgICBhY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCwgJmluZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtNjQ4LDE2ICs1NzUsMTUgQEAKIAkgKiBqdXN0IGFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrYWdlIG9iamVjdHMgdGhlbXNlbHZlcy4KIAkgKiBSb3VuZCB1cCB0byB0aGUgbmV4dCBtYWNoaW5lIHdvcmQuCiAJICovCi0JaW5mby5sZW5ndGggKz0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoc2l6ZW9mICh1bmlvbiBhY3BpX29iamVjdCkpICoKLQkJCSAgKGFjcGlfc2l6ZSkgaW5mby5udW1fcGFja2FnZXM7CisJaW5mby5sZW5ndGggKz0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChzaXplb2YodW5pb24gYWNwaV9vYmplY3QpKSAqCisJICAgIChhY3BpX3NpemUpIGluZm8ubnVtX3BhY2thZ2VzOwogCiAJLyogUmV0dXJuIHRoZSB0b3RhbCBwYWNrYWdlIGxlbmd0aCAqLwogCiAJKm9ial9sZW5ndGggPSBpbmZvLmxlbmd0aDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfb2JqZWN0X3NpemUKQEAgLTY3MywyNSArNTk5LDIzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9nZXRfb2JqZWN0X3NpemUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmludGVybmFsX29iamVjdCwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpvYmpfbGVuZ3RoKQorYWNwaV91dF9nZXRfb2JqZWN0X3NpemUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAorCQkJYWNwaV9zaXplICogb2JqX2xlbmd0aCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCi0KLQlpZiAoKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoaW50ZXJuYWxfb2JqZWN0KSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSAmJgotCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGludGVybmFsX29iamVjdCkgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUgKGludGVybmFsX29iamVjdCwgb2JqX2xlbmd0aCk7Ci0JfQotCWVsc2UgewotCQlzdGF0dXMgPSBhY3BpX3V0X2dldF9zaW1wbGVfb2JqZWN0X3NpemUgKGludGVybmFsX29iamVjdCwgb2JqX2xlbmd0aCk7CisJaWYgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoaW50ZXJuYWxfb2JqZWN0KSA9PQorCSAgICAgQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkKKwkgICAgJiYgKEFDUElfR0VUX09CSkVDVF9UWVBFKGludGVybmFsX29iamVjdCkgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplKGludGVybmFsX29iamVjdCwKKwkJCQkJCSAgICBvYmpfbGVuZ3RoKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplKGludGVybmFsX29iamVjdCwgb2JqX2xlbmd0aCk7CiAJfQogCiAJcmV0dXJuIChzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRzdGF0ZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHN0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjYjI3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRzdGF0ZS5jCkBAIC0wLDAgKzEsMzMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB1dHN0YXRlIC0gc3RhdGUgb2JqZWN0IHN1cHBvcnQgcHJvY2VkdXJlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCitBQ1BJX01PRFVMRV9OQU1FKCJ1dHN0YXRlIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoCisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIE9iamVjdCB0byBiZSBhZGRlZCB0byB0aGUgbmV3IHN0YXRlCisgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gSW5jcmVtZW50L0RlY3JlbWVudAorICogICAgICAgICAgICAgIHN0YXRlX2xpc3QgICAgICAtIExpc3QgdGhlIHN0YXRlIHdpbGwgYmUgYWRkZWQgdG8KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBzdGF0ZSBhbmQgcHVzaCBpdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoKHZvaWQgKmludGVybmFsX29iamVjdCwKKwkJCQkgIHZvaWQgKmV4dGVybmFsX29iamVjdCwKKwkJCQkgIHUxNiBpbmRleCwKKwkJCQkgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKiBzdGF0ZV9saXN0KQoreworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlzdGF0ZSA9CisJICAgIGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZShpbnRlcm5hbF9vYmplY3QsIGV4dGVybmFsX29iamVjdCwgaW5kZXgpOworCWlmICghc3RhdGUpIHsKKwkJcmV0dXJuIChBRV9OT19NRU1PUlkpOworCX0KKworCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlKHN0YXRlX2xpc3QsIHN0YXRlKTsKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgbGlzdF9oZWFkICAgICAgICAgICAtIEhlYWQgb2YgdGhlIHN0YXRlIHN0YWNrCisgKiAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICAtIFN0YXRlIG9iamVjdCB0byBwdXNoCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUHVzaCBhIHN0YXRlIG9iamVjdCBvbnRvIGEgc3RhdGUgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCithY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKipsaXN0X2hlYWQsCisJCQkgICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3B1c2hfZ2VuZXJpY19zdGF0ZSIpOworCisJLyogUHVzaCB0aGUgc3RhdGUgb2JqZWN0IG9udG8gdGhlIGZyb250IG9mIHRoZSBsaXN0IChzdGFjaykgKi8KKworCXN0YXRlLT5jb21tb24ubmV4dCA9ICpsaXN0X2hlYWQ7CisJKmxpc3RfaGVhZCA9IHN0YXRlOworCisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgbGlzdF9oZWFkICAgICAgICAgICAtIEhlYWQgb2YgdGhlIHN0YXRlIHN0YWNrCisgKgorICogUkVUVVJOOiAgICAgIFRoZSBwb3BwZWQgc3RhdGUgb2JqZWN0CisgKgorICogREVTQ1JJUFRJT046IFBvcCBhIHN0YXRlIG9iamVjdCBmcm9tIGEgc3RhdGUgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlCisJCQkJCQkgICAgKipsaXN0X2hlYWQpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3BvcF9nZW5lcmljX3N0YXRlIik7CisKKwkvKiBSZW1vdmUgdGhlIHN0YXRlIG9iamVjdCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAoc3RhY2spICovCisKKwlzdGF0ZSA9ICpsaXN0X2hlYWQ7CisJaWYgKHN0YXRlKSB7CisJCS8qIFVwZGF0ZSB0aGUgbGlzdCBoZWFkICovCisKKwkJKmxpc3RfaGVhZCA9IHN0YXRlLT5jb21tb24ubmV4dDsKKwl9CisKKwlyZXR1cm5fUFRSKHN0YXRlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFRoZSBuZXcgc3RhdGUgb2JqZWN0LiBOVUxMIG9uIGZhaWx1cmUuCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIGdlbmVyaWMgc3RhdGUgb2JqZWN0LiAgQXR0ZW1wdCB0byBvYnRhaW4gb25lIGZyb20KKyAqICAgICAgICAgICAgICB0aGUgZ2xvYmFsIHN0YXRlIGNhY2hlOyAgSWYgbm9uZSBhdmFpbGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKHZvaWQpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCXN0YXRlID0gYWNwaV9vc19hY3F1aXJlX29iamVjdChhY3BpX2dibF9zdGF0ZV9jYWNoZSk7CisJaWYgKHN0YXRlKSB7CisJCS8qIEluaXRpYWxpemUgKi8KKwkJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlKSk7CisJCXN0YXRlLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEU7CisJfQorCisJcmV0dXJuIChzdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3RocmVhZF9zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIE5ldyBUaHJlYWQgU3RhdGUuIE5VTEwgb24gZmFpbHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSAiVGhyZWFkIFN0YXRlIiAtIGEgZmxhdm9yIG9mIHRoZSBnZW5lcmljIHN0YXRlIHVzZWQKKyAqICAgICAgICAgICAgICB0byB0cmFjayBwZXItdGhyZWFkIGluZm8gZHVyaW5nIG1ldGhvZCBleGVjdXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKmFjcGlfdXRfY3JlYXRlX3RocmVhZF9zdGF0ZSh2b2lkKQoreworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jcmVhdGVfdGhyZWFkX3N0YXRlIik7CisKKwkvKiBDcmVhdGUgdGhlIGdlbmVyaWMgc3RhdGUgb2JqZWN0ICovCisKKwlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKKwlpZiAoIXN0YXRlKSB7CisJCXJldHVybl9QVFIoTlVMTCk7CisJfQorCisJLyogSW5pdCBmaWVsZHMgc3BlY2lmaWMgdG8gdGhlIHVwZGF0ZSBzdHJ1Y3QgKi8KKworCXN0YXRlLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfVEhSRUFEOworCXN0YXRlLT50aHJlYWQudGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkKCk7CisKKwlyZXR1cm5fUFRSKChzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKilzdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBJbml0aWFsIE9iamVjdCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHN0YXRlCisgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gVXBkYXRlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQKKyAqCisgKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhbiAiVXBkYXRlIFN0YXRlIiAtIGEgZmxhdm9yIG9mIHRoZSBnZW5lcmljIHN0YXRlIHVzZWQKKyAqICAgICAgICAgICAgICB0byB1cGRhdGUgcmVmZXJlbmNlIGNvdW50cyBhbmQgZGVsZXRlIGNvbXBsZXggb2JqZWN0cyBzdWNoCisgKiAgICAgICAgICAgICAgYXMgcGFja2FnZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorCQkJCQkJICAgICAgKm9iamVjdCwgdTE2IGFjdGlvbikKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2NyZWF0ZV91cGRhdGVfc3RhdGUiLCBvYmplY3QpOworCisJLyogQ3JlYXRlIHRoZSBnZW5lcmljIHN0YXRlIG9iamVjdCAqLworCisJc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CisJaWYgKCFzdGF0ZSkgeworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCS8qIEluaXQgZmllbGRzIHNwZWNpZmljIHRvIHRoZSB1cGRhdGUgc3RydWN0ICovCisKKwlzdGF0ZS0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1VQREFURTsKKwlzdGF0ZS0+dXBkYXRlLm9iamVjdCA9IG9iamVjdDsKKwlzdGF0ZS0+dXBkYXRlLnZhbHVlID0gYWN0aW9uOworCisJcmV0dXJuX1BUUihzdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBJbml0aWFsIE9iamVjdCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHN0YXRlCisgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gVXBkYXRlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQKKyAqCisgKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhICJQYWNrYWdlIFN0YXRlIgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlKHZvaWQgKmludGVybmFsX29iamVjdCwKKwkJCQkJCSAgIHZvaWQgKmV4dGVybmFsX29iamVjdCwKKwkJCQkJCSAgIHUxNiBpbmRleCkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2NyZWF0ZV9wa2dfc3RhdGUiLCBpbnRlcm5hbF9vYmplY3QpOworCisJLyogQ3JlYXRlIHRoZSBnZW5lcmljIHN0YXRlIG9iamVjdCAqLworCisJc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CisJaWYgKCFzdGF0ZSkgeworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCS8qIEluaXQgZmllbGRzIHNwZWNpZmljIHRvIHRoZSB1cGRhdGUgc3RydWN0ICovCisKKwlzdGF0ZS0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1BBQ0tBR0U7CisJc3RhdGUtPnBrZy5zb3VyY2Vfb2JqZWN0ID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKilpbnRlcm5hbF9vYmplY3Q7CisJc3RhdGUtPnBrZy5kZXN0X29iamVjdCA9IGV4dGVybmFsX29iamVjdDsKKwlzdGF0ZS0+cGtnLmluZGV4ID0gaW5kZXg7CisJc3RhdGUtPnBrZy5udW1fcGFja2FnZXMgPSAxOworCisJcmV0dXJuX1BUUihzdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBOZXcgc3RhdGUgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgIkNvbnRyb2wgU3RhdGUiIC0gYSBmbGF2b3Igb2YgdGhlIGdlbmVyaWMgc3RhdGUgdXNlZAorICogICAgICAgICAgICAgIHRvIHN1cHBvcnQgbmVzdGVkIElGL1dISUxFIGNvbnN0cnVjdHMgaW4gdGhlIEFNTC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmFjcGlfdXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUodm9pZCkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUiKTsKKworCS8qIENyZWF0ZSB0aGUgZ2VuZXJpYyBzdGF0ZSBvYmplY3QgKi8KKworCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSgpOworCWlmICghc3RhdGUpIHsKKwkJcmV0dXJuX1BUUihOVUxMKTsKKwl9CisKKwkvKiBJbml0IGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgY29udHJvbCBzdHJ1Y3QgKi8KKworCXN0YXRlLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfQ09OVFJPTDsKKwlzdGF0ZS0+Y29tbW9uLnN0YXRlID0gQUNQSV9DT05UUk9MX0NPTkRJVElPTkFMX0VYRUNVVElORzsKKworCXJldHVybl9QVFIoc3RhdGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlCisgKgorICogUEFSQU1FVEVSUzogIFN0YXRlICAgICAgICAgICAgICAgLSBUaGUgc3RhdGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBQdXQgYSBzdGF0ZSBvYmplY3QgYmFjayBpbnRvIHRoZSBnbG9iYWwgc3RhdGUgY2FjaGUuICBUaGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgaXMgbm90IGFjdHVhbGx5IGZyZWVkIGF0IHRoaXMgdGltZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSIpOworCisJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9zdGF0ZV9jYWNoZSwgc3RhdGUpOworCXJldHVybl9WT0lEOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYwppbmRleCBlODgwM2Q4Li5mMDZiZDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYwpAQCAtNDYsMTMgKzQ2LDEwIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogI2luY2x1ZGUgPGFjcGkvYWNkZWJ1Zy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInV0eGZhY2UiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJ1dHhmYWNlIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02Niw2MSArNjMsNTQgQEAKICAqICAgICAgICAgICAgICBjYWxsZWQsIHNvIGFueSBlYXJseSBpbml0aWFsaXphdGlvbiBiZWxvbmdzIGhlcmUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0gKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX2luaXRpYWxpemVfc3Vic3lzdGVtKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0iKTsKLQotCi0JQUNQSV9ERUJVR19FWEVDIChhY3BpX3V0X2luaXRfc3RhY2tfcHRyX3RyYWNlICgpKTsKLQotCi0JLyogSW5pdGlhbGl6ZSBhbGwgZ2xvYmFscyB1c2VkIGJ5IHRoZSBzdWJzeXN0ZW0gKi8KLQotCWFjcGlfdXRfaW5pdF9nbG9iYWxzICgpOworCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2luaXRfc3RhY2tfcHRyX3RyYWNlKCkpOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgT1MtRGVwZW5kZW50IGxheWVyICovCiAKLQlzdGF0dXMgPSBhY3BpX29zX2luaXRpYWxpemUgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJPU0QgZmFpbGVkIHRvIGluaXRpYWxpemUsICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX29zX2luaXRpYWxpemUoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJPU0QgZmFpbGVkIHRvIGluaXRpYWxpemUsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAorCS8qIEluaXRpYWxpemUgYWxsIGdsb2JhbHMgdXNlZCBieSB0aGUgc3Vic3lzdGVtICovCisKKwlhY3BpX3V0X2luaXRfZ2xvYmFscygpOworCiAJLyogQ3JlYXRlIHRoZSBkZWZhdWx0IG11dGV4IG9iamVjdHMgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZSAoKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkdsb2JhbCBtdXRleCBjcmVhdGlvbiBmYWlsdXJlLCAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9tdXRleF9pbml0aWFsaXplKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiR2xvYmFsIG11dGV4IGNyZWF0aW9uIGZhaWx1cmUsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgbmFtZXNwYWNlIG1hbmFnZXIgYW5kCiAJICogdGhlIHJvb3Qgb2YgdGhlIG5hbWVzcGFjZSB0cmVlCiAJICovCi0Jc3RhdHVzID0gYWNwaV9uc19yb290X2luaXRpYWxpemUgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJOYW1lc3BhY2UgaW5pdGlhbGl6YXRpb24gZmFpbHVyZSwgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfbnNfcm9vdF9pbml0aWFsaXplKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTmFtZXNwYWNlIGluaXRpYWxpemF0aW9uIGZhaWx1cmUsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIElmIGNvbmZpZ3VyZWQsIGluaXRpYWxpemUgdGhlIEFNTCBkZWJ1Z2dlciAqLwogCi0JQUNQSV9ERUJVR0dFUl9FWEVDIChzdGF0dXMgPSBhY3BpX2RiX2luaXRpYWxpemUgKCkpOworCUFDUElfREVCVUdHRVJfRVhFQyhzdGF0dXMgPSBhY3BpX2RiX2luaXRpYWxpemUoKSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9lbmFibGVfc3Vic3lzdGVtCkBAIC0xMzQsNDEgKzEyNCwzOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2VuYWJsZV9zdWJzeXN0ZW0gKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0odTMyIGZsYWdzKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2VuYWJsZV9zdWJzeXN0ZW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW5hYmxlX3N1YnN5c3RlbSIpOwogCiAJLyoKIAkgKiBXZSBtdXN0IGluaXRpYWxpemUgdGhlIGhhcmR3YXJlIGJlZm9yZSB3ZSBjYW4gZW5hYmxlIEFDUEkuCiAJICogVGhlIHZhbHVlcyBmcm9tIHRoZSBGQURUIGFyZSB2YWxpZGF0ZWQgaGVyZS4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fSEFSRFdBUkVfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSJbSW5pdF0gSW5pdGlhbGl6aW5nIEFDUEkgaGFyZHdhcmVcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBoYXJkd2FyZVxuIikpOwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfaW5pdGlhbGl6ZSAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2h3X2luaXRpYWxpemUoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIEVuYWJsZSBBQ1BJIG1vZGUgKi8KIAogCWlmICghKGZsYWdzICYgQUNQSV9OT19BQ1BJX0VOQUJMRSkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIltJbml0XSBHb2luZyBpbnRvIEFDUEkgbW9kZVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiW0luaXRdIEdvaW5nIGludG8gQUNQSSBtb2RlXG4iKSk7CiAKIAkJYWNwaV9nYmxfb3JpZ2luYWxfbW9kZSA9IGFjcGlfaHdfZ2V0X21vZGUoKTsKIAotCQlzdGF0dXMgPSBhY3BpX2VuYWJsZSAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfV0FSTiwgImFjcGlfZW5hYmxlIGZhaWxlZC5cbiIpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9lbmFibGUoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJCSAgImFjcGlfZW5hYmxlIGZhaWxlZC5cbiIpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCkBAIC0xNzgsMTIgKzE2NiwxMiBAQAogCSAqIGluc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyIGludGVyZmFjZS4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fQUREUkVTU19TUEFDRV9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIltJbml0XSBJbnN0YWxsaW5nIGRlZmF1bHQgYWRkcmVzcyBzcGFjZSBoYW5kbGVyc1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiW0luaXRdIEluc3RhbGxpbmcgZGVmYXVsdCBhZGRyZXNzIHNwYWNlIGhhbmRsZXJzXG4iKSk7CiAKLQkJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX3JlZ2lvbl9oYW5kbGVycyAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfcmVnaW9uX2hhbmRsZXJzKCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKQEAgLTE5NiwyOCArMTg0LDI4IEBACiAJICogZXhlY3V0aW9uIQogCSAqLwogCWlmICghKGZsYWdzICYgQUNQSV9OT19FVkVOVF9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBldmVudHNcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBldmVudHNcbiIpKTsKIAotCQlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfZXZlbnRzICgpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9ldmVudHMoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIEluc3RhbGwgdGhlIFNDSSBoYW5kbGVyIGFuZCBHbG9iYWwgTG9jayBoYW5kbGVyICovCiAKIAlpZiAoIShmbGFncyAmIEFDUElfTk9fSEFORExFUl9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIltJbml0XSBJbnN0YWxsaW5nIFNDSS9HTCBoYW5kbGVyc1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiW0luaXRdIEluc3RhbGxpbmcgU0NJL0dMIGhhbmRsZXJzXG4iKSk7CiAKLQkJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzICgpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZXZfaW5zdGFsbF94cnVwdF9oYW5kbGVycygpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjMzLDE1ICsyMjEsMTEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9pbml0aWFsaXplX29iamVjdHMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2luaXRpYWxpemVfb2JqZWN0cyh1MzIgZmxhZ3MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2luaXRpYWxpemVfb2JqZWN0cyIpOwogCiAJLyoKIAkgKiBSdW4gYWxsIF9SRUcgbWV0aG9kcwpAQCAtMjUxLDEyICsyMzUsMTIgQEAKIAkgKiBjb250YWluIGV4ZWN1dGFibGUgQU1MIChzZWUgY2FsbCB0byBhY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cyBiZWxvdykuCiAJICovCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0FERFJFU1NfU1BBQ0VfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSJbSW5pdF0gRXhlY3V0aW5nIF9SRUcgb3BfcmVnaW9uIG1ldGhvZHNcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIltJbml0XSBFeGVjdXRpbmcgX1JFRyBvcF9yZWdpb24gbWV0aG9kc1xuIikpOwogCi0JCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zICgpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zKCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKQEAgLTI2NiwxMiArMjUwLDEyIEBACiAJICogb2JqZWN0czogb3BlcmF0aW9uX3JlZ2lvbnMsIGJ1ZmZlcl9maWVsZHMsIEJ1ZmZlcnMsIGFuZCBQYWNrYWdlcy4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fT0JKRUNUX0lOSVQpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkiW0luaXRdIENvbXBsZXRpbmcgSW5pdGlhbGl6YXRpb24gb2YgQUNQSSBPYmplY3RzXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICJbSW5pdF0gQ29tcGxldGluZyBJbml0aWFsaXphdGlvbiBvZiBBQ1BJIE9iamVjdHNcbiIpKTsKIAotCQlzdGF0dXMgPSBhY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cyAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cygpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCkBAIC0yODAsMTIgKzI2NCwxMiBAQAogCSAqIFRoaXMgcnVucyB0aGUgX1NUQSBhbmQgX0lOSSBtZXRob2RzLgogCSAqLwogCWlmICghKGZsYWdzICYgQUNQSV9OT19ERVZJQ0VfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSJbSW5pdF0gSW5pdGlhbGl6aW5nIEFDUEkgRGV2aWNlc1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiW0luaXRdIEluaXRpYWxpemluZyBBQ1BJIERldmljZXNcbiIpKTsKIAotCQlzdGF0dXMgPSBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcyAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcygpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCkBAIC0yOTQsMTMgKzI3OCwxMiBAQAogCSAqIHRoZSB0YWJsZSBsb2FkIGZpbGxlZCB0aGVtIHVwIG1vcmUgdGhhbiB0aGV5IHdpbGwgYmUgYXQgcnVudGltZSAtLQogCSAqIHRodXMgd2FzdGluZyBub24tcGFnZWQgbWVtb3J5LgogCSAqLwotCXN0YXR1cyA9IGFjcGlfcHVyZ2VfY2FjaGVkX29iamVjdHMgKCk7CisJc3RhdHVzID0gYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cygpOwogCiAJYWNwaV9nYmxfc3RhcnR1cF9mbGFncyB8PSBBQ1BJX0lOSVRJQUxJWkVEX09LOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3Rlcm1pbmF0ZQpAQCAtMzEzLDE1ICsyOTYsMTEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV90ZXJtaW5hdGUgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX3Rlcm1pbmF0ZSh2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV90ZXJtaW5hdGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGVybWluYXRlIik7CiAKIAkvKiBUZXJtaW5hdGUgdGhlIEFNTCBEZWJ1Z2dlciBpZiBwcmVzZW50ICovCiAKQEAgLTMyOSwyOCArMzA4LDI1IEBACiAKIAkvKiBTaHV0ZG93biBhbmQgZnJlZSBhbGwgcmVzb3VyY2VzICovCiAKLQlhY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93biAoKTsKLQorCWFjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duKCk7CiAKIAkvKiBGcmVlIHRoZSBtdXRleCBvYmplY3RzICovCiAKLQlhY3BpX3V0X211dGV4X3Rlcm1pbmF0ZSAoKTsKLQorCWFjcGlfdXRfbXV0ZXhfdGVybWluYXRlKCk7CiAKICNpZmRlZiBBQ1BJX0RFQlVHR0VSCiAKIAkvKiBTaHV0IGRvd24gdGhlIGRlYnVnZ2VyICovCiAKLQlhY3BpX2RiX3Rlcm1pbmF0ZSAoKTsKKwlhY3BpX2RiX3Rlcm1pbmF0ZSgpOwogI2VuZGlmCiAKIAkvKiBOb3cgd2UgY2FuIHNodXRkb3duIHRoZSBPUy1kZXBlbmRlbnQgbGF5ZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfb3NfdGVybWluYXRlICgpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX29zX3Rlcm1pbmF0ZSgpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0zNjYsMjAgKzM0MiwxNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3N1YnN5c3RlbV9zdGF0dXMgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX3N1YnN5c3RlbV9zdGF0dXModm9pZCkKIHsKIAogCWlmIChhY3BpX2dibF9zdGFydHVwX2ZsYWdzICYgQUNQSV9JTklUSUFMSVpFRF9PSykgewogCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJcmV0dXJuIChBRV9FUlJPUik7CiAJfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3N5c3RlbV9pbmZvCkBAIC0zOTgsNjQgKzM3MCw2MCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9zeXN0ZW1faW5mbyAoCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqb3V0X2J1ZmZlcikKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3N5c3RlbV9pbmZvKHN0cnVjdCBhY3BpX2J1ZmZlciAqIG91dF9idWZmZXIpCiB7Ci0Jc3RydWN0IGFjcGlfc3lzdGVtX2luZm8gICAgICAgICAqaW5mb19wdHI7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXN0cnVjdCBhY3BpX3N5c3RlbV9pbmZvICppbmZvX3B0cjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF9zeXN0ZW1faW5mbyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfc3lzdGVtX2luZm8iKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlciAob3V0X2J1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIob3V0X2J1ZmZlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIgKG91dF9idWZmZXIsIHNpemVvZiAoc3RydWN0IGFjcGlfc3lzdGVtX2luZm8pKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyKG91dF9idWZmZXIsCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3N5c3RlbV9pbmZvKSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCiAJICogUG9wdWxhdGUgdGhlIHJldHVybiBidWZmZXIKIAkgKi8KLQlpbmZvX3B0ciA9IChzdHJ1Y3QgYWNwaV9zeXN0ZW1faW5mbyAqKSBvdXRfYnVmZmVyLT5wb2ludGVyOworCWluZm9fcHRyID0gKHN0cnVjdCBhY3BpX3N5c3RlbV9pbmZvICopb3V0X2J1ZmZlci0+cG9pbnRlcjsKIAotCWluZm9fcHRyLT5hY3BpX2NhX3ZlcnNpb24gICA9IEFDUElfQ0FfVkVSU0lPTjsKKwlpbmZvX3B0ci0+YWNwaV9jYV92ZXJzaW9uID0gQUNQSV9DQV9WRVJTSU9OOwogCiAJLyogU3lzdGVtIGZsYWdzIChBQ1BJIGNhcGFiaWxpdGllcykgKi8KIAotCWluZm9fcHRyLT5mbGFncyAgICAgICAgICAgICA9IEFDUElfU1lTX01PREVfQUNQSTsKKwlpbmZvX3B0ci0+ZmxhZ3MgPSBBQ1BJX1NZU19NT0RFX0FDUEk7CiAKIAkvKiBUaW1lciByZXNvbHV0aW9uIC0gMjQgb3IgMzIgYml0cyAgKi8KIAogCWlmICghYWNwaV9nYmxfRkFEVCkgewogCQlpbmZvX3B0ci0+dGltZXJfcmVzb2x1dGlvbiA9IDA7Ci0JfQotCWVsc2UgaWYgKGFjcGlfZ2JsX0ZBRFQtPnRtcl92YWxfZXh0ID09IDApIHsKKwl9IGVsc2UgaWYgKGFjcGlfZ2JsX0ZBRFQtPnRtcl92YWxfZXh0ID09IDApIHsKIAkJaW5mb19wdHItPnRpbWVyX3Jlc29sdXRpb24gPSAyNDsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJaW5mb19wdHItPnRpbWVyX3Jlc29sdXRpb24gPSAzMjsKIAl9CiAKIAkvKiBDbGVhciB0aGUgcmVzZXJ2ZWQgZmllbGRzICovCiAKLQlpbmZvX3B0ci0+cmVzZXJ2ZWQxICAgICAgICAgPSAwOwotCWluZm9fcHRyLT5yZXNlcnZlZDIgICAgICAgICA9IDA7CisJaW5mb19wdHItPnJlc2VydmVkMSA9IDA7CisJaW5mb19wdHItPnJlc2VydmVkMiA9IDA7CiAKIAkvKiBDdXJyZW50IGRlYnVnIGxldmVscyAqLwogCi0JaW5mb19wdHItPmRlYnVnX2xheWVyICAgICAgID0gYWNwaV9kYmdfbGF5ZXI7Ci0JaW5mb19wdHItPmRlYnVnX2xldmVsICAgICAgID0gYWNwaV9kYmdfbGV2ZWw7CisJaW5mb19wdHItPmRlYnVnX2xheWVyID0gYWNwaV9kYmdfbGF5ZXI7CisJaW5mb19wdHItPmRlYnVnX2xldmVsID0gYWNwaV9kYmdfbGV2ZWw7CiAKIAkvKiBDdXJyZW50IHN0YXR1cyBvZiB0aGUgQUNQSSB0YWJsZXMsIHBlciB0YWJsZSB0eXBlICovCiAKQEAgLTQ2NCwxMCArNDMyLDEwIEBACiAJCWluZm9fcHRyLT50YWJsZV9pbmZvW2ldLmNvdW50ID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbaV0uY291bnQ7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfc3lzdGVtX2luZm8pOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3N5c3RlbV9pbmZvKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDg1LDkgKzQ1Myw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9pbml0aWFsaXphdGlvbl9oYW5kbGVyICgKLQlhY3BpX2luaXRfaGFuZGxlciAgICAgICAgICAgICAgIGhhbmRsZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbikKK2FjcGlfaW5zdGFsbF9pbml0aWFsaXphdGlvbl9oYW5kbGVyKGFjcGlfaW5pdF9oYW5kbGVyIGhhbmRsZXIsIHUzMiBmdW5jdGlvbikKIHsKIAogCWlmICghaGFuZGxlcikgewpAQCAtNTAyLDcgKzQ2OCw3IEBACiAJcmV0dXJuIEFFX09LOwogfQogCi0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTUxNiwxOSArNDgyLDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3B1cmdlX2NhY2hlZF9vYmplY3RzICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyh2b2lkKQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX3B1cmdlX2NhY2hlZF9vYmplY3RzIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyIpOwogCi0KLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlX2NhY2hlICgpOwotCWFjcGlfdXRfZGVsZXRlX29iamVjdF9jYWNoZSAoKTsKLQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlX2NhY2hlICgpOwotCWFjcGlfcHNfZGVsZXRlX3BhcnNlX2NhY2hlICgpOwotI2VuZGlmCi0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkodm9pZClhY3BpX29zX3B1cmdlX2NhY2hlKGFjcGlfZ2JsX3N0YXRlX2NhY2hlKTsKKwkodm9pZClhY3BpX29zX3B1cmdlX2NhY2hlKGFjcGlfZ2JsX29wZXJhbmRfY2FjaGUpOworCSh2b2lkKWFjcGlfb3NfcHVyZ2VfY2FjaGUoYWNwaV9nYmxfcHNfbm9kZV9jYWNoZSk7CisJKHZvaWQpYWNwaV9vc19wdXJnZV9jYWNoZShhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlscy5jIGIvZHJpdmVycy9hY3BpL3V0aWxzLmMKaW5kZXggMWNlMjA0Ny4uNjQ1OGM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxzLmMKQEAgLTMwLDE1ICszMCwxMiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9CVVNfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImFjcGlfdXRpbHMiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3V0aWxzIikKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgRXZhbHVhdGlvbiBIZWxwZXJzCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKICNkZWZpbmUgYWNwaV91dGlsX2V2YWxfZXJyb3IoaCxwLHMpIHtcCiAJY2hhciBwcmVmaXhbODBdID0geydcMCd9O1wKQEAgLTQ5LDI2ICs0NiwyNCBAQAogI2Vsc2UKICNkZWZpbmUgYWNwaV91dGlsX2V2YWxfZXJyb3IoaCxwLHMpCiAjZW5kaWYKLQotCiBhY3BpX3N0YXR1cwotYWNwaV9leHRyYWN0X3BhY2thZ2UgKAotCXVuaW9uIGFjcGlfb2JqZWN0CSpwYWNrYWdlLAotCXN0cnVjdCBhY3BpX2J1ZmZlcgkqZm9ybWF0LAotCXN0cnVjdCBhY3BpX2J1ZmZlcgkqYnVmZmVyKQorYWNwaV9leHRyYWN0X3BhY2thZ2UodW5pb24gYWNwaV9vYmplY3QgKnBhY2thZ2UsCisJCSAgICAgc3RydWN0IGFjcGlfYnVmZmVyICpmb3JtYXQsIHN0cnVjdCBhY3BpX2J1ZmZlciAqYnVmZmVyKQogewotCXUzMgkJCXNpemVfcmVxdWlyZWQgPSAwOwotCXUzMgkJCXRhaWxfb2Zmc2V0ID0gMDsKLQljaGFyCQkJKmZvcm1hdF9zdHJpbmcgPSBOVUxMOwotCXUzMgkJCWZvcm1hdF9jb3VudCA9IDA7Ci0JdTMyCQkJaSA9IDA7Ci0JdTgJCQkqaGVhZCA9IE5VTEw7Ci0JdTgJCQkqdGFpbCA9IE5VTEw7CisJdTMyIHNpemVfcmVxdWlyZWQgPSAwOworCXUzMiB0YWlsX29mZnNldCA9IDA7CisJY2hhciAqZm9ybWF0X3N0cmluZyA9IE5VTEw7CisJdTMyIGZvcm1hdF9jb3VudCA9IDA7CisJdTMyIGkgPSAwOworCXU4ICpoZWFkID0gTlVMTDsKKwl1OCAqdGFpbCA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2V4dHJhY3RfcGFja2FnZSIpOwogCi0JaWYgKCFwYWNrYWdlIHx8IChwYWNrYWdlLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFKSB8fCAocGFja2FnZS0+cGFja2FnZS5jb3VudCA8IDEpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkludmFsaWQgJ3BhY2thZ2UnIGFyZ3VtZW50XG4iKSk7CisJaWYgKCFwYWNrYWdlIHx8IChwYWNrYWdlLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFKQorCSAgICB8fCAocGFja2FnZS0+cGFja2FnZS5jb3VudCA8IDEpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkgICJJbnZhbGlkICdwYWNrYWdlJyBhcmd1bWVudFxuIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCkBAIC04MiwxOCArNzcsMjAgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCWZvcm1hdF9jb3VudCA9IChmb3JtYXQtPmxlbmd0aC9zaXplb2YoY2hhcikpIC0gMTsKKwlmb3JtYXRfY291bnQgPSAoZm9ybWF0LT5sZW5ndGggLyBzaXplb2YoY2hhcikpIC0gMTsKIAlpZiAoZm9ybWF0X2NvdW50ID4gcGFja2FnZS0+cGFja2FnZS5jb3VudCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJGb3JtYXQgc3BlY2lmaWVzIG1vcmUgb2JqZWN0cyBbJWRdIHRoYW4gZXhpc3QgaW4gcGFja2FnZSBbJWRdLiIsIGZvcm1hdF9jb3VudCwgcGFja2FnZS0+cGFja2FnZS5jb3VudCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJICAiRm9ybWF0IHNwZWNpZmllcyBtb3JlIG9iamVjdHMgWyVkXSB0aGFuIGV4aXN0IGluIHBhY2thZ2UgWyVkXS4iLAorCQkJCSAgZm9ybWF0X2NvdW50LCBwYWNrYWdlLT5wYWNrYWdlLmNvdW50KSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREFUQSk7CiAJfQogCi0JZm9ybWF0X3N0cmluZyA9IChjaGFyKilmb3JtYXQtPnBvaW50ZXI7CisJZm9ybWF0X3N0cmluZyA9IChjaGFyICopZm9ybWF0LT5wb2ludGVyOwogCiAJLyoKIAkgKiBDYWxjdWxhdGUgc2l6ZV9yZXF1aXJlZC4KIAkgKi8KLQlmb3IgKGk9MDsgaTxmb3JtYXRfY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBmb3JtYXRfY291bnQ7IGkrKykgewogCiAJCXVuaW9uIGFjcGlfb2JqZWN0ICplbGVtZW50ID0gJihwYWNrYWdlLT5wYWNrYWdlLmVsZW1lbnRzW2ldKTsKIApAQCAtMTEwLDExICsxMDcsMTUgQEAKIAkJCQl0YWlsX29mZnNldCArPSBzaXplb2YoYWNwaV9pbnRlZ2VyKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgJ1MnOgotCQkJCXNpemVfcmVxdWlyZWQgKz0gc2l6ZW9mKGNoYXIqKSArIHNpemVvZihhY3BpX2ludGVnZXIpICsgc2l6ZW9mKGNoYXIpOwotCQkJCXRhaWxfb2Zmc2V0ICs9IHNpemVvZihjaGFyKik7CisJCQkJc2l6ZV9yZXF1aXJlZCArPQorCQkJCSAgICBzaXplb2YoY2hhciAqKSArIHNpemVvZihhY3BpX2ludGVnZXIpICsKKwkJCQkgICAgc2l6ZW9mKGNoYXIpOworCQkJCXRhaWxfb2Zmc2V0ICs9IHNpemVvZihjaGFyICopOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJJbnZhbGlkIHBhY2thZ2UgZWxlbWVudCBbJWRdOiBnb3QgbnVtYmVyLCBleHBlY2luZyBbJWNdLlxuIiwgaSwgZm9ybWF0X3N0cmluZ1tpXSkpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkJCSAgIkludmFsaWQgcGFja2FnZSBlbGVtZW50IFslZF06IGdvdCBudW1iZXIsIGV4cGVjaW5nIFslY10uXG4iLAorCQkJCQkJICBpLCBmb3JtYXRfc3RyaW5nW2ldKSk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTEyNCwxNSArMTI1LDIyIEBACiAJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAkJCXN3aXRjaCAoZm9ybWF0X3N0cmluZ1tpXSkgewogCQkJY2FzZSAnUyc6Ci0JCQkJc2l6ZV9yZXF1aXJlZCArPSBzaXplb2YoY2hhciopICsgKGVsZW1lbnQtPnN0cmluZy5sZW5ndGggKiBzaXplb2YoY2hhcikpICsgc2l6ZW9mKGNoYXIpOwotCQkJCXRhaWxfb2Zmc2V0ICs9IHNpemVvZihjaGFyKik7CisJCQkJc2l6ZV9yZXF1aXJlZCArPQorCQkJCSAgICBzaXplb2YoY2hhciAqKSArCisJCQkJICAgIChlbGVtZW50LT5zdHJpbmcubGVuZ3RoICogc2l6ZW9mKGNoYXIpKSArCisJCQkJICAgIHNpemVvZihjaGFyKTsKKwkJCQl0YWlsX29mZnNldCArPSBzaXplb2YoY2hhciAqKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgJ0InOgotCQkJCXNpemVfcmVxdWlyZWQgKz0gc2l6ZW9mKHU4KikgKyAoZWxlbWVudC0+YnVmZmVyLmxlbmd0aCAqIHNpemVvZih1OCkpOwotCQkJCXRhaWxfb2Zmc2V0ICs9IHNpemVvZih1OCopOworCQkJCXNpemVfcmVxdWlyZWQgKz0KKwkJCQkgICAgc2l6ZW9mKHU4ICopICsKKwkJCQkgICAgKGVsZW1lbnQtPmJ1ZmZlci5sZW5ndGggKiBzaXplb2YodTgpKTsKKwkJCQl0YWlsX29mZnNldCArPSBzaXplb2YodTggKik7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkludmFsaWQgcGFja2FnZSBlbGVtZW50IFslZF0gZ290IHN0cmluZy9idWZmZXIsIGV4cGVjaW5nIFslY10uXG4iLCBpLCBmb3JtYXRfc3RyaW5nW2ldKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCQkJICAiSW52YWxpZCBwYWNrYWdlIGVsZW1lbnQgWyVkXSBnb3Qgc3RyaW5nL2J1ZmZlciwgZXhwZWNpbmcgWyVjXS5cbiIsCisJCQkJCQkgIGksIGZvcm1hdF9zdHJpbmdbaV0pKTsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTQwLDcgKzE0OCw5IEBACiAKIAkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAkJZGVmYXVsdDoKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kIHVuc3VwcG9ydGVkIGVsZW1lbnQgYXQgaW5kZXg9JWRcbiIsIGkpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiRm91bmQgdW5zdXBwb3J0ZWQgZWxlbWVudCBhdCBpbmRleD0lZFxuIiwKKwkJCQkJICBpKSk7CiAJCQkvKiBUQkQ6IGhhbmRsZSBuZXN0ZWQgcGFja2FnZXMuLi4gKi8KIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKIAkJCWJyZWFrOwpAQCAtMTUzLDggKzE2Myw3IEBACiAJaWYgKGJ1ZmZlci0+bGVuZ3RoIDwgc2l6ZV9yZXF1aXJlZCkgewogCQlidWZmZXItPmxlbmd0aCA9IHNpemVfcmVxdWlyZWQ7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CVUZGRVJfT1ZFUkZMT1cpOwotCX0KLQllbHNlIGlmIChidWZmZXItPmxlbmd0aCAhPSBzaXplX3JlcXVpcmVkIHx8ICFidWZmZXItPnBvaW50ZXIpIHsKKwl9IGVsc2UgaWYgKGJ1ZmZlci0+bGVuZ3RoICE9IHNpemVfcmVxdWlyZWQgfHwgIWJ1ZmZlci0+cG9pbnRlcikgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCkBAIC0xNjQsNyArMTczLDcgQEAKIAkvKgogCSAqIEV4dHJhY3QgcGFja2FnZSBkYXRhLgogCSAqLwotCWZvciAoaT0wOyBpPGZvcm1hdF9jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGZvcm1hdF9jb3VudDsgaSsrKSB7CiAKIAkJdTggKipwb2ludGVyID0gTlVMTDsKIAkJdW5pb24gYWNwaV9vYmplY3QgKmVsZW1lbnQgPSAmKHBhY2thZ2UtPnBhY2thZ2UuZWxlbWVudHNbaV0pOwpAQCAtMTc4LDE0ICsxODcsMTYgQEAKIAkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAkJCXN3aXRjaCAoZm9ybWF0X3N0cmluZ1tpXSkgewogCQkJY2FzZSAnTic6Ci0JCQkJKigoYWNwaV9pbnRlZ2VyKiloZWFkKSA9IGVsZW1lbnQtPmludGVnZXIudmFsdWU7CisJCQkJKigoYWNwaV9pbnRlZ2VyICopIGhlYWQpID0KKwkJCQkgICAgZWxlbWVudC0+aW50ZWdlci52YWx1ZTsKIAkJCQloZWFkICs9IHNpemVvZihhY3BpX2ludGVnZXIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAnUyc6Ci0JCQkJcG9pbnRlciA9ICh1OCoqKWhlYWQ7CisJCQkJcG9pbnRlciA9ICh1OCAqKikgaGVhZDsKIAkJCQkqcG9pbnRlciA9IHRhaWw7Ci0JCQkJKigoYWNwaV9pbnRlZ2VyKil0YWlsKSA9IGVsZW1lbnQtPmludGVnZXIudmFsdWU7Ci0JCQkJaGVhZCArPSBzaXplb2YoYWNwaV9pbnRlZ2VyKik7CisJCQkJKigoYWNwaV9pbnRlZ2VyICopIHRhaWwpID0KKwkJCQkgICAgZWxlbWVudC0+aW50ZWdlci52YWx1ZTsKKwkJCQloZWFkICs9IHNpemVvZihhY3BpX2ludGVnZXIgKik7CiAJCQkJdGFpbCArPSBzaXplb2YoYWNwaV9pbnRlZ2VyKTsKIAkJCQkvKiBOVUxMIHRlcm1pbmF0ZSBzdHJpbmcgKi8KIAkJCQkqdGFpbCA9IChjaGFyKTA7CkBAIC0yMDEsMjAgKzIxMiwyMiBAQAogCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAJCQlzd2l0Y2ggKGZvcm1hdF9zdHJpbmdbaV0pIHsKIAkJCWNhc2UgJ1MnOgotCQkJCXBvaW50ZXIgPSAodTgqKiloZWFkOworCQkJCXBvaW50ZXIgPSAodTggKiopIGhlYWQ7CiAJCQkJKnBvaW50ZXIgPSB0YWlsOwotCQkJCW1lbWNweSh0YWlsLCBlbGVtZW50LT5zdHJpbmcucG9pbnRlciwgZWxlbWVudC0+c3RyaW5nLmxlbmd0aCk7Ci0JCQkJaGVhZCArPSBzaXplb2YoY2hhciopOworCQkJCW1lbWNweSh0YWlsLCBlbGVtZW50LT5zdHJpbmcucG9pbnRlciwKKwkJCQkgICAgICAgZWxlbWVudC0+c3RyaW5nLmxlbmd0aCk7CisJCQkJaGVhZCArPSBzaXplb2YoY2hhciAqKTsKIAkJCQl0YWlsICs9IGVsZW1lbnQtPnN0cmluZy5sZW5ndGggKiBzaXplb2YoY2hhcik7CiAJCQkJLyogTlVMTCB0ZXJtaW5hdGUgc3RyaW5nICovCiAJCQkJKnRhaWwgPSAoY2hhcikwOwogCQkJCXRhaWwgKz0gc2l6ZW9mKGNoYXIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAnQic6Ci0JCQkJcG9pbnRlciA9ICh1OCoqKWhlYWQ7CisJCQkJcG9pbnRlciA9ICh1OCAqKikgaGVhZDsKIAkJCQkqcG9pbnRlciA9IHRhaWw7Ci0JCQkJbWVtY3B5KHRhaWwsIGVsZW1lbnQtPmJ1ZmZlci5wb2ludGVyLCBlbGVtZW50LT5idWZmZXIubGVuZ3RoKTsKLQkJCQloZWFkICs9IHNpemVvZih1OCopOworCQkJCW1lbWNweSh0YWlsLCBlbGVtZW50LT5idWZmZXIucG9pbnRlciwKKwkJCQkgICAgICAgZWxlbWVudC0+YnVmZmVyLmxlbmd0aCk7CisJCQkJaGVhZCArPSBzaXplb2YodTggKik7CiAJCQkJdGFpbCArPSBlbGVtZW50LT5idWZmZXIubGVuZ3RoICogc2l6ZW9mKHU4KTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CkBAIC0yMzMsMTkgKzI0NiwxNyBAQAogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX2V4dHJhY3RfcGFja2FnZSk7CiAKLQogYWNwaV9zdGF0dXMKLWFjcGlfZXZhbHVhdGVfaW50ZWdlciAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQlhY3BpX3N0cmluZwkJcGF0aG5hbWUsCi0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJKmFyZ3VtZW50cywKLQl1bnNpZ25lZCBsb25nCQkqZGF0YSkKK2FjcGlfZXZhbHVhdGVfaW50ZWdlcihhY3BpX2hhbmRsZSBoYW5kbGUsCisJCSAgICAgIGFjcGlfc3RyaW5nIHBhdGhuYW1lLAorCQkgICAgICBzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqYXJndW1lbnRzLCB1bnNpZ25lZCBsb25nICpkYXRhKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb2JqZWN0CSplbGVtZW50OwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7MCxOVUxMfTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29iamVjdCAqZWxlbWVudDsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyAwLCBOVUxMIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2V2YWx1YXRlX2ludGVnZXIiKTsKIApAQCAtMjUzLDcgKzI2NCw3IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAogCWVsZW1lbnQgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCksIEdGUF9LRVJORUwpOwotCWlmKCFlbGVtZW50KQorCWlmICghZWxlbWVudCkKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAKIAltZW1zZXQoZWxlbWVudCwgMCwgc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSk7CkBAIC0yNzcsMjAgKzI4OCwxOCBAQAogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2V2YWx1YXRlX2ludGVnZXIpOwogCiAjaWYgMAogYWNwaV9zdGF0dXMKLWFjcGlfZXZhbHVhdGVfc3RyaW5nICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCWFjcGlfc3RyaW5nCQlwYXRobmFtZSwKLQlhY3BpX29iamVjdF9saXN0CSphcmd1bWVudHMsCi0JYWNwaV9zdHJpbmcJCSpkYXRhKQorYWNwaV9ldmFsdWF0ZV9zdHJpbmcoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkgICAgIGFjcGlfc3RyaW5nIHBhdGhuYW1lLAorCQkgICAgIGFjcGlfb2JqZWN0X2xpc3QgKiBhcmd1bWVudHMsIGFjcGlfc3RyaW5nICogZGF0YSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlhY3BpX29iamVjdCAgICAgICAgICAgICAqZWxlbWVudCA9IE5VTEw7Ci0JYWNwaV9idWZmZXIJCWJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9vYmplY3QgKmVsZW1lbnQgPSBOVUxMOworCWFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZXZhbHVhdGVfc3RyaW5nIik7CiAKQEAgLTMwNSw5ICszMTQsOSBAQAogCiAJZWxlbWVudCA9IChhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKIAotCWlmICgoZWxlbWVudC0+dHlwZSAhPSBBQ1BJX1RZUEVfU1RSSU5HKSAKLQkJfHwgKGVsZW1lbnQtPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikKLQkJfHwgIWVsZW1lbnQtPnN0cmluZy5sZW5ndGgpIHsKKwlpZiAoKGVsZW1lbnQtPnR5cGUgIT0gQUNQSV9UWVBFX1NUUklORykKKwkgICAgfHwgKGVsZW1lbnQtPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikKKwkgICAgfHwgIWVsZW1lbnQtPnN0cmluZy5sZW5ndGgpIHsKIAkJYWNwaV91dGlsX2V2YWxfZXJyb3IoaGFuZGxlLCBwYXRobmFtZSwgQUVfQkFEX0RBVEEpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwogCX0KQEAgLTMyOSwxOSArMzM4LDE3IEBACiB9CiAjZW5kaWYKIAotCiBhY3BpX3N0YXR1cwotYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0JYWNwaV9zdHJpbmcJCXBhdGhuYW1lLAotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0CSphcmd1bWVudHMsCi0Jc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QJKmxpc3QpCithY3BpX2V2YWx1YXRlX3JlZmVyZW5jZShhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQlhY3BpX3N0cmluZyBwYXRobmFtZSwKKwkJCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICphcmd1bWVudHMsCisJCQlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCAqbGlzdCkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vYmplY3QJKnBhY2thZ2UgPSBOVUxMOwotCXVuaW9uIGFjcGlfb2JqZWN0CSplbGVtZW50ID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKLQl1MzIJCQlpID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29iamVjdCAqcGFja2FnZSA9IE5VTEw7CisJdW5pb24gYWNwaV9vYmplY3QgKmVsZW1lbnQgPSBOVUxMOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdTMyIGkgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UiKTsKIApAQCAtMzU1LDI4ICszNjIsMjggQEAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCWdvdG8gZW5kOwogCi0JcGFja2FnZSA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKKwlwYWNrYWdlID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopYnVmZmVyLnBvaW50ZXI7CiAKIAlpZiAoKGJ1ZmZlci5sZW5ndGggPT0gMCkgfHwgIXBhY2thZ2UpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCi0JCQkiTm8gcmV0dXJuIG9iamVjdCAobGVuICVYIHB0ciAlcClcbiIsIAotCQkJKHVuc2lnbmVkKWJ1ZmZlci5sZW5ndGgsIHBhY2thZ2UpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJObyByZXR1cm4gb2JqZWN0IChsZW4gJVggcHRyICVwKVxuIiwKKwkJCQkgICh1bnNpZ25lZClidWZmZXIubGVuZ3RoLCBwYWNrYWdlKSk7CiAJCXN0YXR1cyA9IEFFX0JBRF9EQVRBOwogCQlhY3BpX3V0aWxfZXZhbF9lcnJvcihoYW5kbGUsIHBhdGhuYW1lLCBzdGF0dXMpOwogCQlnb3RvIGVuZDsKIAl9CiAJaWYgKHBhY2thZ2UtPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCi0JCQkiRXhwZWN0aW5nIGEgW1BhY2thZ2VdLCBmb3VuZCB0eXBlICVYXG4iLCAKLQkJCXBhY2thZ2UtPnR5cGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJFeHBlY3RpbmcgYSBbUGFja2FnZV0sIGZvdW5kIHR5cGUgJVhcbiIsCisJCQkJICBwYWNrYWdlLT50eXBlKSk7CiAJCXN0YXR1cyA9IEFFX0JBRF9EQVRBOwogCQlhY3BpX3V0aWxfZXZhbF9lcnJvcihoYW5kbGUsIHBhdGhuYW1lLCBzdGF0dXMpOwogCQlnb3RvIGVuZDsKIAl9CiAJaWYgKCFwYWNrYWdlLT5wYWNrYWdlLmNvdW50KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIAotCQkJIltQYWNrYWdlXSBoYXMgemVybyBlbGVtZW50cyAoJXApXG4iLCAKLQkJCXBhY2thZ2UpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJbUGFja2FnZV0gaGFzIHplcm8gZWxlbWVudHMgKCVwKVxuIiwKKwkJCQkgIHBhY2thZ2UpKTsKIAkJc3RhdHVzID0gQUVfQkFEX0RBVEE7CiAJCWFjcGlfdXRpbF9ldmFsX2Vycm9yKGhhbmRsZSwgcGF0aG5hbWUsIHN0YXR1cyk7CiAJCWdvdG8gZW5kOwpAQCAtMzk1LDkgKzQwMiw5IEBACiAKIAkJaWYgKGVsZW1lbnQtPnR5cGUgIT0gQUNQSV9UWVBFX0FOWSkgewogCQkJc3RhdHVzID0gQUVfQkFEX0RBVEE7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAKLQkJCQkiRXhwZWN0aW5nIGEgW1JlZmVyZW5jZV0gcGFja2FnZSBlbGVtZW50LCBmb3VuZCB0eXBlICVYXG4iLAotCQkJCWVsZW1lbnQtPnR5cGUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkV4cGVjdGluZyBhIFtSZWZlcmVuY2VdIHBhY2thZ2UgZWxlbWVudCwgZm91bmQgdHlwZSAlWFxuIiwKKwkJCQkJICBlbGVtZW50LT50eXBlKSk7CiAJCQlhY3BpX3V0aWxfZXZhbF9lcnJvcihoYW5kbGUsIHBhdGhuYW1lLCBzdGF0dXMpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTQwNiwxMCArNDEzLDEwIEBACiAKIAkJbGlzdC0+aGFuZGxlc1tpXSA9IGVsZW1lbnQtPnJlZmVyZW5jZS5oYW5kbGU7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kIHJlZmVyZW5jZSBbJXBdXG4iLAotCQkJbGlzdC0+aGFuZGxlc1tpXSkpOworCQkJCSAgbGlzdC0+aGFuZGxlc1tpXSkpOwogCX0KIAotZW5kOgorICAgICAgZW5kOgogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlsaXN0LT5jb3VudCA9IDA7CiAJCS8va2ZyZWUobGlzdC0+aGFuZGxlcyk7CkBAIC00MTksNSArNDI2LDUgQEAKIAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2V2YWx1YXRlX3JlZmVyZW5jZSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwppbmRleCAyY2YyNjRmLi5lMzgzZDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdmlkZW8uYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwpAQCAtNTMsMjEgKzUzLDIwIEBACiAjZGVmaW5lIEFDUElfVklERU9fTk9USUZZX1pFUk9fQlJJR0hUTkVTUwkweDg1CiAjZGVmaW5lIEFDUElfVklERU9fTk9USUZZX0RJU1BMQVlfT0ZGCQkweDg2CiAKLQogI2RlZmluZSBBQ1BJX1ZJREVPX0hFQURfSU5WQUxJRAkJKH4wdSAtIDEpCiAjZGVmaW5lIEFDUElfVklERU9fSEVBRF9FTkQJCSh+MHUpCiAKLQogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1ZJREVPX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJhY3BpX3ZpZGVvIikKK0FDUElfTU9EVUxFX05BTUUoImFjcGlfdmlkZW8iKQogCi1NT0RVTEVfQVVUSE9SKCJCcnVubyBEdWNyb3QiKTsKKyAgICBNT0RVTEVfQVVUSE9SKCJCcnVubyBEdWNyb3QiKTsKIE1PRFVMRV9ERVNDUklQVElPTihBQ1BJX1ZJREVPX0RSSVZFUl9OQU1FKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19hZGQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwotc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19tYXRjaCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKTsKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX21hdGNoKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAorCQkJCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3ZpZGVvX2J1cyA9IHsKIAkubmFtZSA9IEFDUElfVklERU9fRFJJVkVSX05BTUUsCkBAIC03NiwxODcgKzc1LDE5MiBAQAogCQkuYWRkID0gYWNwaV92aWRlb19idXNfYWRkLAogCQkucmVtb3ZlID0gYWNwaV92aWRlb19idXNfcmVtb3ZlLAogCQkubWF0Y2ggPSBhY3BpX3ZpZGVvX2J1c19tYXRjaCwKLQl9LAorCQl9LAogfTsKIAogc3RydWN0IGFjcGlfdmlkZW9fYnVzX2ZsYWdzIHsKLQl1OAltdWx0aWhlYWQ6MTsJLyogY2FuIHN3aXRjaCB2aWRlbyBoZWFkcyAqLwotCXU4CXJvbToxOwkJLyogY2FuIHJldHJpZXZlIGEgdmlkZW8gcm9tICovCi0JdTgJcG9zdDoxOwkJLyogY2FuIGNvbmZpZ3VyZSB0aGUgaGVhZCB0byAqLwotCXU4CXJlc2VydmVkOjU7CisJdTggbXVsdGloZWFkOjE7CQkvKiBjYW4gc3dpdGNoIHZpZGVvIGhlYWRzICovCisJdTggcm9tOjE7CQkvKiBjYW4gcmV0cmlldmUgYSB2aWRlbyByb20gKi8KKwl1OCBwb3N0OjE7CQkvKiBjYW4gY29uZmlndXJlIHRoZSBoZWFkIHRvICovCisJdTggcmVzZXJ2ZWQ6NTsKIH07CiAKIHN0cnVjdCBhY3BpX3ZpZGVvX2J1c19jYXAgewotCXU4CV9ET1M6MTsgLypFbmFibGUvRGlzYWJsZSBvdXRwdXQgc3dpdGNoaW5nKi8KLQl1OAlfRE9EOjE7IC8qRW51bWVyYXRlIGFsbCBkZXZpY2VzIGF0dGFjaGVkIHRvIGRpc3BsYXkgYWRhcHRlciovCi0JdTgJX1JPTToxOyAvKkdldCBST00gRGF0YSovCi0JdTgJX0dQRDoxOyAvKkdldCBQT1NUIERldmljZSovCi0JdTgJX1NQRDoxOyAvKlNldCBQT1NUIERldmljZSovCi0JdTgJX1ZQTzoxOyAvKlZpZGVvIFBPU1QgT3B0aW9ucyovCi0JdTgJcmVzZXJ2ZWQ6MjsKKwl1OCBfRE9TOjE7CQkvKkVuYWJsZS9EaXNhYmxlIG91dHB1dCBzd2l0Y2hpbmcgKi8KKwl1OCBfRE9EOjE7CQkvKkVudW1lcmF0ZSBhbGwgZGV2aWNlcyBhdHRhY2hlZCB0byBkaXNwbGF5IGFkYXB0ZXIgKi8KKwl1OCBfUk9NOjE7CQkvKkdldCBST00gRGF0YSAqLworCXU4IF9HUEQ6MTsJCS8qR2V0IFBPU1QgRGV2aWNlICovCisJdTggX1NQRDoxOwkJLypTZXQgUE9TVCBEZXZpY2UgKi8KKwl1OCBfVlBPOjE7CQkvKlZpZGVvIFBPU1QgT3B0aW9ucyAqLworCXU4IHJlc2VydmVkOjI7CiB9OwogCi1zdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfYXR0cmliewotCXUzMglkaXNwbGF5X2luZGV4OjQ7IC8qIEEgemVyby1iYXNlZCBpbnN0YW5jZSBvZiB0aGUgRGlzcGxheSovCi0JdTMyCWRpc3BsYXlfcG9ydF9hdHRhY2htZW50OjQ7IC8qVGhpcyBmaWVsZCBkaWZmZXJlbmF0ZXMgZGlzcGxheXMgdHlwZSovCi0JdTMyCWRpc3BsYXlfdHlwZTo0OwkvKkRlc2NyaWJlIHRoZSBzcGVjaWZpYyB0eXBlIGluIHVzZSovCi0JdTMyCXZlbmRvcl9zcGVjaWZpYzo0OyAvKkNoaXBzZXQgVmVuZG9yIFNwZWNpZmkqLyAKLQl1MzIJYmlvc19jYW5fZGV0ZWN0OjE7IC8qQklPUyBjYW4gZGV0ZWN0IHRoZSBkZXZpY2UqLwotCXUzMglkZXBlbmRfb25fdmdhOjE7IC8qTm9uLVZHQSBvdXRwdXQgZGV2aWNlIHdob3NlIHBvd2VyIGlzIHJlbGF0ZWQgdG8gCi0JCQkJICAgdGhlIFZHQSBkZXZpY2UuKi8KLQl1MzIJcGlwZV9pZDozOyAvKkZvciBWR0EgbXVsdGlwbGUtaGVhZCBkZXZpY2VzLiovCi0JdTMyCXJlc2VydmVkOjEwOyAvKk11c3QgYmUgMCovCi0JdTMyCWRldmljZV9pZF9zY2hlbWU6MTsgLypEZXZpY2UgSUQgU2NoZW1lKi8KK3N0cnVjdCBhY3BpX3ZpZGVvX2RldmljZV9hdHRyaWIgeworCXUzMiBkaXNwbGF5X2luZGV4OjQ7CS8qIEEgemVyby1iYXNlZCBpbnN0YW5jZSBvZiB0aGUgRGlzcGxheSAqLworCXUzMiBkaXNwbGF5X3BvcnRfYXR0YWNobWVudDo0OwkvKlRoaXMgZmllbGQgZGlmZmVyZW5hdGVzIGRpc3BsYXlzIHR5cGUgKi8KKwl1MzIgZGlzcGxheV90eXBlOjQ7CS8qRGVzY3JpYmUgdGhlIHNwZWNpZmljIHR5cGUgaW4gdXNlICovCisJdTMyIHZlbmRvcl9zcGVjaWZpYzo0OwkvKkNoaXBzZXQgVmVuZG9yIFNwZWNpZmkgKi8KKwl1MzIgYmlvc19jYW5fZGV0ZWN0OjE7CS8qQklPUyBjYW4gZGV0ZWN0IHRoZSBkZXZpY2UgKi8KKwl1MzIgZGVwZW5kX29uX3ZnYToxOwkvKk5vbi1WR0Egb3V0cHV0IGRldmljZSB3aG9zZSBwb3dlciBpcyByZWxhdGVkIHRvIAorCQkJCSAgIHRoZSBWR0EgZGV2aWNlLiAqLworCXUzMiBwaXBlX2lkOjM7CQkvKkZvciBWR0EgbXVsdGlwbGUtaGVhZCBkZXZpY2VzLiAqLworCXUzMiByZXNlcnZlZDoxMDsJLypNdXN0IGJlIDAgKi8KKwl1MzIgZGV2aWNlX2lkX3NjaGVtZToxOwkvKkRldmljZSBJRCBTY2hlbWUgKi8KIH07CiAKIHN0cnVjdCBhY3BpX3ZpZGVvX2VudW1lcmF0ZWRfZGV2aWNlIHsKIAl1bmlvbiB7CiAJCXUzMiBpbnRfdmFsOwotCQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfYXR0cmliCWF0dHJpYjsKKwkJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlX2F0dHJpYiBhdHRyaWI7CiAJfSB2YWx1ZTsKIAlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmJpbmRfaW5mbzsKIH07CiAKIHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyB7Ci0JYWNwaV9oYW5kbGUJaGFuZGxlOwotCXU4CWRvc19zZXR0aW5nOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwl1OCBkb3Nfc2V0dGluZzsKIAlzdHJ1Y3QgYWNwaV92aWRlb19lbnVtZXJhdGVkX2RldmljZSAqYXR0YWNoZWRfYXJyYXk7Ci0JdTgJCQlhdHRhY2hlZF9jb3VudDsKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXNfY2FwCWNhcDsKKwl1OCBhdHRhY2hlZF9jb3VudDsKKwlzdHJ1Y3QgYWNwaV92aWRlb19idXNfY2FwIGNhcDsKIAlzdHJ1Y3QgYWNwaV92aWRlb19idXNfZmxhZ3MgZmxhZ3M7Ci0Jc3RydWN0IHNlbWFwaG9yZQlzZW07Ci0Jc3RydWN0IGxpc3RfaGVhZAl2aWRlb19kZXZpY2VfbGlzdDsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgCSpkaXI7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07CisJc3RydWN0IGxpc3RfaGVhZCB2aWRlb19kZXZpY2VfbGlzdDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcjsKIH07CiAKIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZV9mbGFncyB7Ci0JdTgJY3J0OjE7Ci0JdTgJbGNkOjE7Ci0JdTgJdHZvdXQ6MTsKLQl1OAliaW9zOjE7Ci0JdTgJdW5rbm93bjoxOwotCXU4CXJlc2VydmVkOjM7CisJdTggY3J0OjE7CisJdTggbGNkOjE7CisJdTggdHZvdXQ6MTsKKwl1OCBiaW9zOjE7CisJdTggdW5rbm93bjoxOworCXU4IHJlc2VydmVkOjM7CiB9OwogCiBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfY2FwIHsKLQl1OAlfQURSOjE7CS8qUmV0dXJuIHRoZSB1bmlxdWUgSUQgKi8KLQl1OAlfQkNMOjE7IC8qUXVlcnkgbGlzdCBvZiBicmlnaHRuZXNzIGNvbnRyb2wgbGV2ZWxzIHN1cHBvcnRlZCovCi0JdTgJX0JDTToxOyAvKlNldCB0aGUgYnJpZ2h0bmVzcyBsZXZlbCovCi0JdTgJX0REQzoxOyAvKlJldHVybiB0aGUgRURJRCBmb3IgdGhpcyBkZXZpY2UqLwotCXU4CV9EQ1M6MTsgLypSZXR1cm4gc3RhdHVzIG9mIG91dHB1dCBkZXZpY2UqLwotCXU4CV9ER1M6MTsgLypRdWVyeSBncmFwaGljcyBzdGF0ZSovCi0JdTgJX0RTUzoxOyAvKkRldmljZSBzdGF0ZSBzZXQqLwotCXU4CV9yZXNlcnZlZDoxOworCXU4IF9BRFI6MTsJCS8qUmV0dXJuIHRoZSB1bmlxdWUgSUQgKi8KKwl1OCBfQkNMOjE7CQkvKlF1ZXJ5IGxpc3Qgb2YgYnJpZ2h0bmVzcyBjb250cm9sIGxldmVscyBzdXBwb3J0ZWQgKi8KKwl1OCBfQkNNOjE7CQkvKlNldCB0aGUgYnJpZ2h0bmVzcyBsZXZlbCAqLworCXU4IF9EREM6MTsJCS8qUmV0dXJuIHRoZSBFRElEIGZvciB0aGlzIGRldmljZSAqLworCXU4IF9EQ1M6MTsJCS8qUmV0dXJuIHN0YXR1cyBvZiBvdXRwdXQgZGV2aWNlICovCisJdTggX0RHUzoxOwkJLypRdWVyeSBncmFwaGljcyBzdGF0ZSAqLworCXU4IF9EU1M6MTsJCS8qRGV2aWNlIHN0YXRlIHNldCAqLworCXU4IF9yZXNlcnZlZDoxOwogfTsKIAogc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3MgewotCWludAljdXJyOwotCWludAljb3VudDsKLQlpbnQJKmxldmVsczsKKwlpbnQgY3VycjsKKwlpbnQgY291bnQ7CisJaW50ICpsZXZlbHM7CiB9OwogCiBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgewotCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0JdW5zaWduZWQgbG9uZwkJZGV2aWNlX2lkOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZV9mbGFncwlmbGFnczsKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfY2FwCWNhcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWVudHJ5OwotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW87Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXY7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgZGV2aWNlX2lkOworCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZV9mbGFncyBmbGFnczsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfY2FwIGNhcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW87CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXY7CiAJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3MgKmJyaWdodG5lc3M7CiB9OwogCi0KIC8qIGJ1cyAqLwogc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV92aWRlb19idXNfaW5mb19mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdmlkZW9fYnVzX2luZm9fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV92aWRlb19idXNfaW5mb19vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAogc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19ST01fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3ZpZGVvX2J1c19ST01fZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX3ZpZGVvX2J1c19ST01fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV92aWRlb19idXNfUk9NX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX1BPU1RfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfUE9TVF9pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfdmlkZW9fYnVzX1BPU1RfaW5mb19mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdmlkZW9fYnVzX1BPU1RfaW5mb19vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX3ZpZGVvX2J1c19QT1NUX2luZm9fb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfUE9TVF9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfdmlkZW9fYnVzX1BPU1RfZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX3ZpZGVvX2J1c19QT1NUX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfdmlkZW9fYnVzX1BPU1Rfb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKLQogc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19ET1Nfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3ZpZGVvX2J1c19ET1NfZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX3ZpZGVvX2J1c19ET1Nfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV92aWRlb19idXNfRE9TX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiAvKiBkZXZpY2UgKi8KLXN0YXRpYyBpbnQgYWNwaV92aWRlb19kZXZpY2VfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19kZXZpY2VfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV92aWRlb19kZXZpY2VfaW5mb19mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdmlkZW9fZGV2aWNlX2luZm9fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV92aWRlb19kZXZpY2VfaW5mb19vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9zdGF0ZV9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19kZXZpY2Vfc3RhdGVfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3ZpZGVvX2RldmljZV9zdGF0ZV9mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdmlkZW9fZGV2aWNlX3N0YXRlX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfdmlkZW9fZGV2aWNlX3N0YXRlX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV92aWRlb19kZXZpY2VfYnJpZ2h0bmVzc19mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV92aWRlb19kZXZpY2VfYnJpZ2h0bmVzc19vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9FRElEX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9FRElEX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3ZpZGVvX2RldmljZV9FRElEX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV92aWRlb19kZXZpY2VfRURJRF9vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX3ZpZGVvX2RldmljZV9FRElEX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgY2hhcglkZXZpY2VfZGVjb2RlW11bMzBdID0geworc3RhdGljIGNoYXIgZGV2aWNlX2RlY29kZVtdWzMwXSA9IHsKIAkibW90aGVyYm9hcmQgVkdBIGRldmljZSIsCiAJIlBDSSBWR0EgZGV2aWNlIiwKIAkiQUdQIFZHQSBkZXZpY2UiLAogCSJVTktOT1dOIiwKIH07CiAKLXN0YXRpYyB2b2lkIGFjcGlfdmlkZW9fZGV2aWNlX25vdGlmeSAoIGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkIGFjcGlfdmlkZW9fZGV2aWNlX3JlYmluZCggc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbyk7Ci1zdGF0aWMgdm9pZCBhY3BpX3ZpZGVvX2RldmljZV9iaW5kKCBzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgdm9pZCBhY3BpX3ZpZGVvX2RldmljZV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgYWNwaV92aWRlb19kZXZpY2VfcmViaW5kKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8pOworc3RhdGljIHZvaWQgYWNwaV92aWRlb19kZXZpY2VfYmluZChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLAorCQkJCSAgIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19kZXZpY2VfZW51bWVyYXRlKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8pOwotc3RhdGljIGludCBhY3BpX3ZpZGVvX3N3aXRjaF9vdXRwdXQoIHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8sIGludAlldmVudCk7Ci1zdGF0aWMgaW50IGFjcGlfdmlkZW9fZ2V0X25leHRfbGV2ZWwoIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLCB1MzIgbGV2ZWxfY3VycmVudCx1MzIgZXZlbnQpOwotc3RhdGljIHZvaWQgYWNwaV92aWRlb19zd2l0Y2hfYnJpZ2h0bmVzcyAoIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLCBpbnQgZXZlbnQpOwotCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fc3dpdGNoX291dHB1dChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLCBpbnQgZXZlbnQpOworc3RhdGljIGludCBhY3BpX3ZpZGVvX2dldF9uZXh0X2xldmVsKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgdTMyIGxldmVsX2N1cnJlbnQsIHUzMiBldmVudCk7CitzdGF0aWMgdm9pZCBhY3BpX3ZpZGVvX3N3aXRjaF9icmlnaHRuZXNzKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLAorCQkJCQkgaW50IGV2ZW50KTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbyBNYW5hZ2VtZW50CkBAIC0yNjUsMTEgKzI2OSw5IEBACiAvKiBkZXZpY2UgKi8KIAogc3RhdGljIGludAotYWNwaV92aWRlb19kZXZpY2VfcXVlcnkgKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqZGV2aWNlLAotCXVuc2lnbmVkIGxvbmcJCQkqc3RhdGUpCithY3BpX3ZpZGVvX2RldmljZV9xdWVyeShzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyAqc3RhdGUpCiB7Ci0JaW50CQkJc3RhdHVzOworCWludCBzdGF0dXM7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2VfcXVlcnkiKTsKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGV2aWNlLT5oYW5kbGUsICJfREdTIiwgTlVMTCwgc3RhdGUpOwogCkBAIC0yNzcsMTEgKzI3OSwxMCBAQAogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2RldmljZV9nZXRfc3RhdGUgKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqZGV2aWNlLAotCXVuc2lnbmVkIGxvbmcgCQkqc3RhdGUpCithY3BpX3ZpZGVvX2RldmljZV9nZXRfc3RhdGUoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UsCisJCQkgICAgdW5zaWduZWQgbG9uZyAqc3RhdGUpCiB7Ci0JaW50CQkJc3RhdHVzOworCWludCBzdGF0dXM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2RldmljZV9nZXRfc3RhdGUiKTsKIApAQCAtMjkxLDMxICsyOTIsMjggQEAKIH0KIAogc3RhdGljIGludAotYWNwaV92aWRlb19kZXZpY2Vfc2V0X3N0YXRlICgKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UJKmRldmljZSwKLQlpbnQJCQlzdGF0ZSkKK2FjcGlfdmlkZW9fZGV2aWNlX3NldF9zdGF0ZShzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKQogewotCWludAkJCXN0YXR1czsKLQl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9JTlRFR0VSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdzID0gezEsICZhcmcwfTsKKwlpbnQgc3RhdHVzOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzAgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJncyA9IHsgMSwgJmFyZzAgfTsKKwl1bnNpZ25lZCBsb25nIHJldDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fZGV2aWNlX3NldF9zdGF0ZSIpOwogCiAJYXJnMC5pbnRlZ2VyLnZhbHVlID0gc3RhdGU7Ci0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGRldmljZS0+aGFuZGxlLCAiX0RTUyIsICZhcmdzLCBOVUxMKTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGV2aWNlLT5oYW5kbGUsICJfRFNTIiwgJmFyZ3MsICZyZXQpOwogCiAJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fZGV2aWNlX2xjZF9xdWVyeV9sZXZlbHMgKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqZGV2aWNlLAotCXVuaW9uIGFjcGlfb2JqZWN0CQkqKmxldmVscykKK2FjcGlfdmlkZW9fZGV2aWNlX2xjZF9xdWVyeV9sZXZlbHMoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UsCisJCQkJICAgdW5pb24gYWNwaV9vYmplY3QgKipsZXZlbHMpCiB7Ci0JaW50CQkJc3RhdHVzOwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwotCXVuaW9uIGFjcGlfb2JqZWN0CSpvYmo7Ci0KKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fZGV2aWNlX2xjZF9xdWVyeV9sZXZlbHMiKTsKIApAQCAtMzI0LDcgKzMyMiw3IEBACiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlLT5oYW5kbGUsICJfQkNMIiwgTlVMTCwgJmJ1ZmZlcik7CiAJaWYgKCFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKIAkJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7Ci0Jb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIGJ1ZmZlci5wb2ludGVyOworCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKWJ1ZmZlci5wb2ludGVyOwogCWlmICghb2JqICYmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIF9CQ0wgZGF0YVxuIikpOwogCQlzdGF0dXMgPSAtRUZBVUxUOwpAQCAtMzM1LDcgKzMzMyw3IEBACiAKIAlyZXR1cm5fVkFMVUUoMCk7CiAKLWVycjoKKyAgICAgIGVycjoKIAlpZiAoYnVmZmVyLnBvaW50ZXIpCiAJCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKIApAQCAtMzQzLDEzICszNDEsMTEgQEAKIH0KIAogc3RhdGljIGludAotYWNwaV92aWRlb19kZXZpY2VfbGNkX3NldF9sZXZlbCAoCi0Jc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlCSpkZXZpY2UsCi0JaW50CQkJCWxldmVsKQorYWNwaV92aWRlb19kZXZpY2VfbGNkX3NldF9sZXZlbChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwgaW50IGxldmVsKQogewotCWludAkJCXN0YXR1czsKLQl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9JTlRFR0VSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdzID0gezEsICZhcmcwfTsKKwlpbnQgc3RhdHVzOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzAgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJncyA9IHsgMSwgJmFyZzAgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fZGV2aWNlX2xjZF9zZXRfbGV2ZWwiKTsKIApAQCAtMzYxLDExICszNTcsMTAgQEAKIH0KIAogc3RhdGljIGludAotYWNwaV92aWRlb19kZXZpY2VfbGNkX2dldF9sZXZlbF9jdXJyZW50ICgKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UJKmRldmljZSwKLQl1bnNpZ25lZCBsb25nIAkqbGV2ZWwpCithY3BpX3ZpZGVvX2RldmljZV9sY2RfZ2V0X2xldmVsX2N1cnJlbnQoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UsCisJCQkJCXVuc2lnbmVkIGxvbmcgKmxldmVsKQogewotCWludAkJCXN0YXR1czsKKwlpbnQgc3RhdHVzOwogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fZGV2aWNlX2xjZF9nZXRfbGV2ZWxfY3VycmVudCIpOwogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGRldmljZS0+aGFuZGxlLCAiX0JRQyIsIE5VTEwsIGxldmVsKTsKQEAgLTM3NCwxNiArMzY5LDE0IEBACiB9CiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fZGV2aWNlX0VESUQgKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqZGV2aWNlLAotCXVuaW9uIGFjcGlfb2JqZWN0CQkqKmVkaWQsCi0Jc3NpemVfdAkJCQlsZW5ndGgpCithY3BpX3ZpZGVvX2RldmljZV9FRElEKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLAorCQkgICAgICAgdW5pb24gYWNwaV9vYmplY3QgKiplZGlkLCBzc2l6ZV90IGxlbmd0aCkKIHsKLQlpbnQJCQlzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0JdW5pb24gYWNwaV9vYmplY3QJKm9iajsKLQl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9JTlRFR0VSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdzID0gezEsICZhcmcwfTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmcwID0geyBBQ1BJX1RZUEVfSU5URUdFUiB9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ3MgPSB7IDEsICZhcmcwIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2RldmljZV9nZXRfRURJRCIpOwogCkBAIC00MDIsNyArMzk1LDcgQEAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAotCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKKwlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKilidWZmZXIucG9pbnRlcjsKIAogCWlmIChvYmogJiYgb2JqLT50eXBlID09IEFDUElfVFlQRV9CVUZGRVIpCiAJCSplZGlkID0gb2JqOwpAQCAtNDE1LDE4ICs0MDgsMTUgQEAKIAlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKIH0KIAotCiAvKiBidXMgKi8KIAogc3RhdGljIGludAotYWNwaV92aWRlb19idXNfc2V0X1BPU1QgKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8sCi0JdW5zaWduZWQgbG9uZwkJb3B0aW9uKQorYWNwaV92aWRlb19idXNfc2V0X1BPU1Qoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbywgdW5zaWduZWQgbG9uZyBvcHRpb24pCiB7Ci0JaW50CQkJc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcJCXRtcDsKLQl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9JTlRFR0VSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdzID0gezEsICZhcmcwfTsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzAgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJncyA9IHsgMSwgJmFyZzAgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX3NldF9QT1NUIik7CiAKQEAgLTQzNCwxNSArNDI0LDEzIEBACiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIodmlkZW8tPmhhbmRsZSwgIl9TUEQiLCAmYXJncywgJnRtcCk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQotCQlzdGF0dXMgPSB0bXAgPyAoLUVJTlZBTCk6KEFFX09LKTsKKwkJc3RhdHVzID0gdG1wID8gKC1FSU5WQUwpIDogKEFFX09LKTsKIAogCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19nZXRfUE9TVCAoCi0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbywKLQl1bnNpZ25lZCBsb25nCQkqaWQpCithY3BpX3ZpZGVvX2J1c19nZXRfUE9TVChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLCB1bnNpZ25lZCBsb25nICppZCkKIHsKIAlpbnQgc3RhdHVzOwogCkBAIC00NTQsMTEgKzQ0MiwxMCBAQAogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19QT1NUX29wdGlvbnMgKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8sCi0JdW5zaWduZWQgbG9uZwkJKm9wdGlvbnMpCithY3BpX3ZpZGVvX2J1c19QT1NUX29wdGlvbnMoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbywKKwkJCSAgICB1bnNpZ25lZCBsb25nICpvcHRpb25zKQogewotCWludAkJCXN0YXR1czsKKwlpbnQgc3RhdHVzOwogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX1BPU1Rfb3B0aW9ucyIpOwogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHZpZGVvLT5oYW5kbGUsICJfVlBPIiwgTlVMTCwgb3B0aW9ucyk7CkBAIC00ODksMTggKzQ3NiwxNSBAQAogICovCiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX0RPUygKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvLAotCWludAkJCWJpb3NfZmxhZywKLQlpbnQJCQlsY2RfZmxhZykKK2FjcGlfdmlkZW9fYnVzX0RPUyhzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLCBpbnQgYmlvc19mbGFnLCBpbnQgbGNkX2ZsYWcpCiB7Ci0JYWNwaV9pbnRlZ2VyCQlzdGF0dXMgPSAwOwotCXVuaW9uIGFjcGlfb2JqZWN0CWFyZzAgPSB7QUNQSV9UWVBFX0lOVEVHRVJ9OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0CWFyZ3MgPSB7MSwgJmFyZzB9OworCWFjcGlfaW50ZWdlciBzdGF0dXMgPSAwOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzAgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJncyA9IHsgMSwgJmFyZzAgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX0RPUyIpOwogCi0JaWYgKGJpb3NfZmxhZyA8IDAgfHwgYmlvc19mbGFnID4zIHx8IGxjZF9mbGFnIDwgMCB8fCBsY2RfZmxhZyA+IDEpeworCWlmIChiaW9zX2ZsYWcgPCAwIHx8IGJpb3NfZmxhZyA+IDMgfHwgbGNkX2ZsYWcgPCAwIHx8IGxjZF9mbGFnID4gMSkgewogCQlzdGF0dXMgPSAtMTsKIAkJZ290byBGYWlsZWQ7CiAJfQpAQCAtNTA4LDcgKzQ5Miw3IEBACiAJdmlkZW8tPmRvc19zZXR0aW5nID0gYXJnMC5pbnRlZ2VyLnZhbHVlOwogCWFjcGlfZXZhbHVhdGVfb2JqZWN0KHZpZGVvLT5oYW5kbGUsICJfRE9TIiwgJmFyZ3MsIE5VTEwpOwogCi1GYWlsZWQ6CisgICAgICBGYWlsZWQ6CiAJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKQEAgLTUyMywxMCArNTA3LDkgQEAKICAqICBkZXZpY2UuCiAgKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfdmlkZW9fZGV2aWNlX2ZpbmRfY2FwIChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSkKK3N0YXRpYyB2b2lkIGFjcGlfdmlkZW9fZGV2aWNlX2ZpbmRfY2FwKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlKQogewotCWFjcGlfaW50ZWdlcgkJc3RhdHVzOworCWFjcGlfaW50ZWdlciBzdGF0dXM7CiAJYWNwaV9oYW5kbGUgaF9kdW1teTE7CiAJaW50IGk7CiAJdW5pb24gYWNwaV9vYmplY3QgKm9iaiA9IE5VTEw7CkBAIC01MzQsMjcgKzUxNywyNyBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2VfZmluZF9jYXAiKTsKIAotCW1lbXNldCggJmRldmljZS0+Y2FwLCAwLCA0KTsKKwltZW1zZXQoJmRldmljZS0+Y2FwLCAwLCA0KTsKIAotICAgIAlpZiggQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9BRFIiLCAmaF9kdW1teTEpKSkgeworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0FEUiIsICZoX2R1bW15MSkpKSB7CiAJCWRldmljZS0+Y2FwLl9BRFIgPSAxOwogCX0KLSAgICAJaWYoIEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfQkNMIiwgJmhfZHVtbXkxKSkpIHsKLQkJZGV2aWNlLT5jYXAuX0JDTD0gMTsKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9CQ0wiLCAmaF9kdW1teTEpKSkgeworCQlkZXZpY2UtPmNhcC5fQkNMID0gMTsKIAl9Ci0gICAgCWlmKCBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0JDTSIsICZoX2R1bW15MSkpKSB7Ci0JCWRldmljZS0+Y2FwLl9CQ009IDE7CisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfQkNNIiwgJmhfZHVtbXkxKSkpIHsKKwkJZGV2aWNlLT5jYXAuX0JDTSA9IDE7CiAJfQotICAgIAlpZiggQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9EREMiLCAmaF9kdW1teTEpKSkgewotCQlkZXZpY2UtPmNhcC5fRERDPSAxOworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0REQyIsICZoX2R1bW15MSkpKSB7CisJCWRldmljZS0+Y2FwLl9EREMgPSAxOwogCX0KLSAgICAJaWYoIEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfRENTIiwgJmhfZHVtbXkxKSkpIHsKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9EQ1MiLCAmaF9kdW1teTEpKSkgewogCQlkZXZpY2UtPmNhcC5fRENTID0gMTsKIAl9Ci0gICAgCWlmKCBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0RHUyIsICZoX2R1bW15MSkpKSB7CisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfREdTIiwgJmhfZHVtbXkxKSkpIHsKIAkJZGV2aWNlLT5jYXAuX0RHUyA9IDE7CiAJfQotICAgIAlpZiggQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9EU1MiLCAmaF9kdW1teTEpKSkgeworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0RTUyIsICZoX2R1bW15MSkpKSB7CiAJCWRldmljZS0+Y2FwLl9EU1MgPSAxOwogCX0KIApAQCAtNTYzLDM0ICs1NDYsMzggQEAKIAlpZiAob2JqICYmIG9iai0+dHlwZSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSAmJiBvYmotPnBhY2thZ2UuY291bnQgPj0gMikgewogCQlpbnQgY291bnQgPSAwOwogCQl1bmlvbiBhY3BpX29iamVjdCAqbzsKLQkJCisKIAkJYnIgPSBrbWFsbG9jKHNpemVvZigqYnIpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFicikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQl9IGVsc2UgewogCQkJbWVtc2V0KGJyLCAwLCBzaXplb2YoKmJyKSk7CiAJCQlici0+bGV2ZWxzID0ga21hbGxvYyhvYmotPnBhY2thZ2UuY291bnQgKgotCQkJCQlzaXplb2YgKihici0+bGV2ZWxzKSwgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICAgc2l6ZW9mICooYnItPmxldmVscyksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFici0+bGV2ZWxzKQogCQkJCWdvdG8gb3V0OwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgb2JqLT5wYWNrYWdlLmNvdW50OyBpKyspIHsKLQkJCQlvID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopICZvYmotPnBhY2thZ2UuZWxlbWVudHNbaV07CisJCQkJbyA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSZvYmotPnBhY2thZ2UuCisJCQkJICAgIGVsZW1lbnRzW2ldOwogCQkJCWlmIChvLT50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGRhdGFcbiIpKTsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCQkgICJJbnZhbGlkIGRhdGFcbiIpKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCWJyLT5sZXZlbHNbY291bnRdID0gKHUzMikgby0+aW50ZWdlci52YWx1ZTsKIAkJCQljb3VudCsrOwogCQkJfQotb3V0OgorCQkgICAgICBvdXQ6CiAJCQlpZiAoY291bnQgPCAyKSB7CiAJCQkJa2ZyZWUoYnItPmxldmVscyk7CiAJCQkJa2ZyZWUoYnIpOwogCQkJfSBlbHNlIHsKIAkJCQlici0+Y291bnQgPSBjb3VudDsKIAkJCQlkZXZpY2UtPmJyaWdodG5lc3MgPSBicjsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJmb3VuZCAlZCBicmlnaHRuZXNzIGxldmVsc1xuIiwgY291bnQpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCQkgICJmb3VuZCAlZCBicmlnaHRuZXNzIGxldmVsc1xuIiwKKwkJCQkJCSAgY291bnQpKTsKIAkJCX0KIAkJfQogCX0KQEAgLTYxMCwyOCArNTk3LDI3IEBACiAgKiAgRmluZCBvdXQgYWxsIHJlcXVpcmVkIEFNTCBtZXRob2QgZGVmaW5lZCB1bmRlciB0aGUgdmlkZW8gYnVzIGRldmljZS4KICAqLwogCi1zdGF0aWMgdm9pZCAKLWFjcGlfdmlkZW9fYnVzX2ZpbmRfY2FwIChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvKQorc3RhdGljIHZvaWQgYWNwaV92aWRlb19idXNfZmluZF9jYXAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbykKIHsKLQlhY3BpX2hhbmRsZQloX2R1bW15MTsKKwlhY3BpX2hhbmRsZSBoX2R1bW15MTsKIAotCW1lbXNldCgmdmlkZW8tPmNhcCAsMCwgNCk7Ci0gICAgCWlmKCBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHZpZGVvLT5oYW5kbGUsICJfRE9TIiwgJmhfZHVtbXkxKSkpIHsKKwltZW1zZXQoJnZpZGVvLT5jYXAsIDAsIDQpOworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHZpZGVvLT5oYW5kbGUsICJfRE9TIiwgJmhfZHVtbXkxKSkpIHsKIAkJdmlkZW8tPmNhcC5fRE9TID0gMTsKIAl9Ci0gICAgCWlmKCBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHZpZGVvLT5oYW5kbGUsICJfRE9EIiwgJmhfZHVtbXkxKSkpIHsKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZSh2aWRlby0+aGFuZGxlLCAiX0RPRCIsICZoX2R1bW15MSkpKSB7CiAJCXZpZGVvLT5jYXAuX0RPRCA9IDE7CiAJfQotICAgIAlpZiggQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZSh2aWRlby0+aGFuZGxlLCAiX1JPTSIsICZoX2R1bW15MSkpKSB7CisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUodmlkZW8tPmhhbmRsZSwgIl9ST00iLCAmaF9kdW1teTEpKSkgewogCQl2aWRlby0+Y2FwLl9ST00gPSAxOwogCX0KLSAgICAJaWYoIEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUodmlkZW8tPmhhbmRsZSwgIl9HUEQiLCAmaF9kdW1teTEpKSkgeworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHZpZGVvLT5oYW5kbGUsICJfR1BEIiwgJmhfZHVtbXkxKSkpIHsKIAkJdmlkZW8tPmNhcC5fR1BEID0gMTsKIAl9Ci0gICAgCWlmKCBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHZpZGVvLT5oYW5kbGUsICJfU1BEIiwgJmhfZHVtbXkxKSkpIHsKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZSh2aWRlby0+aGFuZGxlLCAiX1NQRCIsICZoX2R1bW15MSkpKSB7CiAJCXZpZGVvLT5jYXAuX1NQRCA9IDE7CiAJfQotICAgIAlpZiggQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZSh2aWRlby0+aGFuZGxlLCAiX1ZQTyIsICZoX2R1bW15MSkpKSB7CisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUodmlkZW8tPmhhbmRsZSwgIl9WUE8iLCAmaF9kdW1teTEpKSkgewogCQl2aWRlby0+Y2FwLl9WUE8gPSAxOwogCX0KIH0KQEAgLTY0MSwxMiArNjI3LDkgQEAKICAqIHN1cHBvcnQgdGhlIGRlc2lyZWQgZmVhdHVyZXMKICAqLwogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19jaGVjayAoCi0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbykKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfY2hlY2soc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbykKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gLUVOT0VOVDsKLQorCWFjcGlfc3RhdHVzIHN0YXR1cyA9IC1FTk9FTlQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2J1c19jaGVjayIpOwogCkBAIC02NTgsMTkgKzY0MSwxOSBAQAogCSAqLwogCiAJLyogRG9lcyB0aGlzIGRldmljZSBhYmxlIHRvIHN1cHBvcnQgdmlkZW8gc3dpdGNoaW5nID8gKi8KLQlpZih2aWRlby0+Y2FwLl9ET1MpeworCWlmICh2aWRlby0+Y2FwLl9ET1MpIHsKIAkJdmlkZW8tPmZsYWdzLm11bHRpaGVhZCA9IDE7CiAJCXN0YXR1cyA9IDA7CiAJfQogCiAJLyogRG9lcyB0aGlzIGRldmljZSBhYmxlIHRvIHJldHJpZXZlIGEgcmV0cmlldmUgYSB2aWRlbyBST00gPyAqLwotCWlmKHZpZGVvLT5jYXAuX1JPTSl7CisJaWYgKHZpZGVvLT5jYXAuX1JPTSkgewogCQl2aWRlby0+ZmxhZ3Mucm9tID0gMTsKIAkJc3RhdHVzID0gMDsKIAl9CiAKIAkvKiBEb2VzIHRoaXMgZGV2aWNlIGFibGUgdG8gY29uZmlndXJlIHdoaWNoIHZpZGVvIGRldmljZSB0byBQT1NUID8gKi8KLQlpZih2aWRlby0+Y2FwLl9HUEQgJiYgdmlkZW8tPmNhcC5fU1BEICYmIHZpZGVvLT5jYXAuX1ZQTyl7CisJaWYgKHZpZGVvLT5jYXAuX0dQRCAmJiB2aWRlby0+Y2FwLl9TUEQgJiYgdmlkZW8tPmNhcC5fVlBPKSB7CiAJCXZpZGVvLT5mbGFncy5wb3N0ID0gMTsKIAkJc3RhdHVzID0gMDsKIAl9CkBAIC02ODIsMTYgKzY2NSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmFjcGlfdmlkZW9fZGlyOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV92aWRlb19kaXI7CiAKIC8qIHZpZGVvIGRldmljZXMgKi8KIAotc3RhdGljIGludAotYWNwaV92aWRlb19kZXZpY2VfaW5mb19zZXFfc2hvdyAoCi0Jc3RydWN0IHNlcV9maWxlCQkqc2VxLAotCXZvaWQJCQkqb2Zmc2V0KQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlCSpkZXYgPSAoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICopIHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldiA9CisJICAgIChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2RldmljZV9pbmZvX3NlcV9zaG93Iik7CiAKQEAgLTcwOSwzMCArNjkwLDI1IEBACiAJZWxzZQogCQlzZXFfcHJpbnRmKHNlcSwgIlVOS05PV05cbiIpOwogCi0Jc2VxX3ByaW50ZihzZXEsImtub3duIGJ5IGJpb3M6ICVzXG4iLAotCQkgICBkZXYtPmZsYWdzLmJpb3MgPyAieWVzIjoibm8iKTsKKwlzZXFfcHJpbnRmKHNlcSwgImtub3duIGJ5IGJpb3M6ICVzXG4iLCBkZXYtPmZsYWdzLmJpb3MgPyAieWVzIiA6ICJubyIpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2RldmljZV9pbmZvX29wZW5fZnMgKAotCXN0cnVjdCBpbm9kZQkJKmlub2RlLAotCXN0cnVjdCBmaWxlCQkqZmlsZSkKK2FjcGlfdmlkZW9fZGV2aWNlX2luZm9fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19kZXZpY2VfaW5mb19zZXFfc2hvdywKIAkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zdGF0aWMgaW50ICAKLWFjcGlfdmlkZW9fZGV2aWNlX3N0YXRlX3NlcV9zaG93ICgKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSpzZXEsCi0Jdm9pZAkJCSpvZmZzZXQpCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX3N0YXRlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0JaW50CQkJc3RhdHVzOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqZGV2ID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKSBzZXEtPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZwlzdGF0ZTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2ID0KKwkgICAgKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXRlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2Vfc3RhdGVfc2VxX3Nob3ciKTsKIApAQCAtNzUzLDMxICs3MjksMjcgQEAKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAiPG5vdCBzdXBwb3J0ZWQ+XG4iKTsKIAotZW5kOgorICAgICAgZW5kOgogCXJldHVybl9WQUxVRSgwKTsKIH0KIAogc3RhdGljIGludAotYWNwaV92aWRlb19kZXZpY2Vfc3RhdGVfb3Blbl9mcyAoCi0Jc3RydWN0IGlub2RlCQkqaW5vZGUsCi0Jc3RydWN0IGZpbGUJCSpmaWxlKQorYWNwaV92aWRlb19kZXZpY2Vfc3RhdGVfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19kZXZpY2Vfc3RhdGVfc2VxX3Nob3csCiAJCQkgICBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAogc3RhdGljIHNzaXplX3QKLWFjcGlfdmlkZW9fZGV2aWNlX3dyaXRlX3N0YXRlICgKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUsCi0JY29uc3QgY2hhcgkJX191c2VyICpidWZmZXIsCi0Jc2l6ZV90CQkJY291bnQsCi0JbG9mZl90CQkJKmRhdGEpCithY3BpX3ZpZGVvX2RldmljZV93cml0ZV9zdGF0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKQogewotCWludAkJCXN0YXR1czsKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSptID0gKHN0cnVjdCBzZXFfZmlsZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlCSpkZXYgPSAoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICopIG0tPnByaXZhdGU7Ci0JY2hhcgkJCXN0clsxMl0gPSB7MH07Ci0JdTMyCQkJc3RhdGUgPSAwOworCWludCBzdGF0dXM7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldiA9IChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKiltLT5wcml2YXRlOworCWNoYXIgc3RyWzEyXSA9IHsgMCB9OworCXUzMiBzdGF0ZSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2RldmljZV93cml0ZV9zdGF0ZSIpOwogCkBAIC03ODksNyArNzYxLDcgQEAKIAogCXN0cltjb3VudF0gPSAwOwogCXN0YXRlID0gc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAwKTsKLQlzdGF0ZSAmPSAoKDF1bDw8MzEpIHwgKDF1bDw8MzApIHwgKDF1bDw8MCkpOworCXN0YXRlICY9ICgoMXVsIDw8IDMxKSB8ICgxdWwgPDwgMzApIHwgKDF1bCA8PCAwKSk7CiAKIAlzdGF0dXMgPSBhY3BpX3ZpZGVvX2RldmljZV9zZXRfc3RhdGUoZGV2LCBzdGF0ZSk7CiAKQEAgLTgwMCwxMiArNzcyLDExIEBACiB9CiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfc2VxX3Nob3cgKAotCXN0cnVjdCBzZXFfZmlsZQkJKnNlcSwKLQl2b2lkCQkJKm9mZnNldCkKK2FjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UJKmRldiA9IChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKikgc2VxLT5wcml2YXRlOwotCWludAkJCWk7CisJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXYgPQorCSAgICAoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCWludCBpOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2VfYnJpZ2h0bmVzc19zZXFfc2hvdyIpOwogCkBAIC04MjMsMjYgKzc5NCwyMiBAQAogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2RldmljZV9icmlnaHRuZXNzX29wZW5fZnMgKAotCXN0cnVjdCBpbm9kZQkJKmlub2RlLAotCXN0cnVjdCBmaWxlCQkqZmlsZSkKK2FjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19kZXZpY2VfYnJpZ2h0bmVzc19zZXFfc2hvdywKIAkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCiBzdGF0aWMgc3NpemVfdAotYWNwaV92aWRlb19kZXZpY2Vfd3JpdGVfYnJpZ2h0bmVzcyAoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCWNvbnN0IGNoYXIJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpkYXRhKQorYWNwaV92aWRlb19kZXZpY2Vfd3JpdGVfYnJpZ2h0bmVzcyhzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpCiB7Ci0Jc3RydWN0IHNlcV9maWxlCQkqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqZGV2ID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKSBtLT5wcml2YXRlOwotCWNoYXIJCQlzdHJbNF0gPSB7MH07Ci0JdW5zaWduZWQgaW50CQlsZXZlbCA9IDA7Ci0JaW50CQkJaTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2ID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKW0tPnByaXZhdGU7CisJY2hhciBzdHJbNF0gPSB7IDAgfTsKKwl1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOworCWludCBpOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2Vfd3JpdGVfYnJpZ2h0bmVzcyIpOwogCkBAIC04NTQsMTQgKzgyMSwxNSBAQAogCiAJc3RyW2NvdW50XSA9IDA7CiAJbGV2ZWwgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOwotCQorCiAJaWYgKGxldmVsID4gMTAwKQogCQlyZXR1cm5fVkFMVUUoLUVGQVVMVCk7CiAKIAkvKiB2YWxpZGF0ZSB0aG91Z2ggdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGxldmVscyAqLwogCWZvciAoaSA9IDA7IGkgPCBkZXYtPmJyaWdodG5lc3MtPmNvdW50OyBpKyspCiAJCWlmIChsZXZlbCA9PSBkZXYtPmJyaWdodG5lc3MtPmxldmVsc1tpXSkgewotCQkJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX3ZpZGVvX2RldmljZV9sY2Rfc2V0X2xldmVsKGRldiwgbGV2ZWwpKSkKKwkJCWlmIChBQ1BJX1NVQ0NFU1MKKwkJCSAgICAoYWNwaV92aWRlb19kZXZpY2VfbGNkX3NldF9sZXZlbChkZXYsIGxldmVsKSkpCiAJCQkJZGV2LT5icmlnaHRuZXNzLT5jdXJyID0gbGV2ZWw7CiAJCQlicmVhazsKIAkJfQpAQCAtODY5LDI0ICs4MzcsMjIgQEAKIAlyZXR1cm5fVkFMVUUoY291bnQpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2RldmljZV9FRElEX3NlcV9zaG93ICgKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSpzZXEsCi0Jdm9pZAkJCSpvZmZzZXQpCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX0VESURfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UJKmRldiA9IChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKikgc2VxLT5wcml2YXRlOwotCWludAkJCXN0YXR1czsKLQlpbnQJCQlpOwotCXVuaW9uIGFjcGlfb2JqZWN0CSplZGlkID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldiA9CisJICAgIChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKwl1bmlvbiBhY3BpX29iamVjdCAqZWRpZCA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2RldmljZV9FRElEX3NlcV9zaG93Iik7CiAKIAlpZiAoIWRldikKIAkJZ290byBvdXQ7CiAKLQlzdGF0dXMgPSBhY3BpX3ZpZGVvX2RldmljZV9FRElEIChkZXYsICZlZGlkLCAxMjgpOworCXN0YXR1cyA9IGFjcGlfdmlkZW9fZGV2aWNlX0VESUQoZGV2LCAmZWRpZCwgMTI4KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJc3RhdHVzID0gYWNwaV92aWRlb19kZXZpY2VfRURJRCAoZGV2LCAmZWRpZCwgMjU2KTsKKwkJc3RhdHVzID0gYWNwaV92aWRlb19kZXZpY2VfRURJRChkZXYsICZlZGlkLCAyNTYpOwogCX0KIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtODk4LDcgKzg2NCw3IEBACiAJCQlzZXFfcHV0YyhzZXEsIGVkaWQtPmJ1ZmZlci5wb2ludGVyW2ldKTsKIAl9CiAKLW91dDoKKyAgICAgIG91dDoKIAlpZiAoIWVkaWQpCiAJCXNlcV9wcmludGYoc2VxLCAiPG5vdCBzdXBwb3J0ZWQ+XG4iKTsKIAllbHNlCkBAIC05MDgsMjAgKzg3NCwxNSBAQAogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2RldmljZV9FRElEX29wZW5fZnMgKAotCXN0cnVjdCBpbm9kZQkJKmlub2RlLAotCXN0cnVjdCBmaWxlCQkqZmlsZSkKK2FjcGlfdmlkZW9fZGV2aWNlX0VESURfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19kZXZpY2VfRURJRF9zZXFfc2hvdywKIAkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fZGV2aWNlX2FkZF9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKnZpZF9kZXY7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2RldmljZV9hZGRfZnMiKTsKQEAgLTkyOSwxMyArODkwLDEzIEBACiAJaWYgKCFkZXZpY2UpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAotCXZpZF9kZXYgPSAoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICopIGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKwl2aWRfZGV2ID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAlpZiAoIXZpZF9kZXYpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAogCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJCXZpZF9kZXYtPnZpZGVvLT5kaXIpOworCQkJCQkJICAgICB2aWRfZGV2LT52aWRlby0+ZGlyKTsKIAkJaWYgKCFhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSktPm93bmVyID0gVEhJU19NT0RVTEU7CkBAIC05NDUsNyArOTA2LDcgQEAKIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJpbmZvIiwgU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnaW5mbycgZnMgZW50cnlcbiIpKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdpbmZvJyBmcyBlbnRyeVxuIikpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdmlkZW9fZGV2aWNlX2luZm9fZm9wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC05NTMsMTAgKzkxNCwxMiBAQAogCX0KIAogCS8qICdzdGF0ZScgW1IvV10gKi8KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzdGF0ZSIsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJZW50cnkgPQorCSAgICBjcmVhdGVfcHJvY19lbnRyeSgic3RhdGUiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgICAgICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJaWYgKCFlbnRyeSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gY3JlYXRlICdzdGF0ZScgZnMgZW50cnlcbiIpKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdzdGF0ZScgZnMgZW50cnlcbiIpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3ZpZGVvX2RldmljZV9zdGF0ZV9mb3BzOwogCQllbnRyeS0+cHJvY19mb3BzLT53cml0ZSA9IGFjcGlfdmlkZW9fZGV2aWNlX3dyaXRlX3N0YXRlOwpAQCAtOTY1LDEwICs5MjgsMTIgQEAKIAl9CiAKIAkvKiAnYnJpZ2h0bmVzcycgW1IvV10gKi8KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJicmlnaHRuZXNzIiwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwllbnRyeSA9CisJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KCJicmlnaHRuZXNzIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICAgICAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnYnJpZ2h0bmVzcycgZnMgZW50cnlcbiIpKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdicmlnaHRuZXNzJyBmcyBlbnRyeVxuIikpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3NfZm9wczsKIAkJZW50cnktPnByb2NfZm9wcy0+d3JpdGUgPSBhY3BpX3ZpZGVvX2RldmljZV93cml0ZV9icmlnaHRuZXNzOwpAQCAtOTgwLDcgKzk0NSw3IEBACiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiRURJRCIsIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJ2JyaWdodG5lc3MnIGZzIGVudHJ5XG4iKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnYnJpZ2h0bmVzcycgZnMgZW50cnlcbiIpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3ZpZGVvX2RldmljZV9FRElEX2ZvcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtOTkwLDE0ICs5NTUsMTIgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fZGV2aWNlX3JlbW92ZV9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX3JlbW92ZV9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKnZpZF9kZXY7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2VfcmVtb3ZlX2ZzIik7CiAKLQl2aWRfZGV2ID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJdmlkX2RldiA9IChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAJaWYgKCF2aWRfZGV2IHx8ICF2aWRfZGV2LT52aWRlbyB8fCAhdmlkX2Rldi0+dmlkZW8tPmRpcikKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCkBAIC0xMDA2LDIyICs5NjksMTcgQEAKIAkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRlIiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCQlyZW1vdmVfcHJvY19lbnRyeSgiYnJpZ2h0bmVzcyIsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAkJcmVtb3ZlX3Byb2NfZW50cnkoIkVESUQiLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJCSB2aWRfZGV2LT52aWRlby0+ZGlyKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksIHZpZF9kZXYtPnZpZGVvLT5kaXIpOwogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IE5VTEw7CiAJfQogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIC8qIHZpZGVvIGJ1cyAqLwotc3RhdGljIGludAotYWNwaV92aWRlb19idXNfaW5mb19zZXFfc2hvdyAoCi0Jc3RydWN0IHNlcV9maWxlCQkqc2VxLAotCXZvaWQJCQkqb2Zmc2V0KQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKikgc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8gPSAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICopc2VxLT5wcml2YXRlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfaW5mb19zZXFfc2hvdyIpOwogCkBAIC0xMDI5LDMwICs5ODcsMjUgQEAKIAkJZ290byBlbmQ7CiAKIAlzZXFfcHJpbnRmKHNlcSwgIlN3aXRjaGluZyBoZWFkczogICAgICAgICAgICAgICVzXG4iLAotCQkJdmlkZW8tPmZsYWdzLm11bHRpaGVhZCA/ICJ5ZXMiOiJubyIpOworCQkgICB2aWRlby0+ZmxhZ3MubXVsdGloZWFkID8gInllcyIgOiAibm8iKTsKIAlzZXFfcHJpbnRmKHNlcSwgIlZpZGVvIFJPTTogICAgICAgICAgICAgICAgICAgICVzXG4iLAotCQkJdmlkZW8tPmZsYWdzLnJvbSA/ICJ5ZXMiOiJubyIpOworCQkgICB2aWRlby0+ZmxhZ3Mucm9tID8gInllcyIgOiAibm8iKTsKIAlzZXFfcHJpbnRmKHNlcSwgIkRldmljZSB0byBiZSBQT1NUZWQgb24gYm9vdDogICVzXG4iLAotCQkJdmlkZW8tPmZsYWdzLnBvc3QgPyAieWVzIjoibm8iKTsKKwkJICAgdmlkZW8tPmZsYWdzLnBvc3QgPyAieWVzIiA6ICJubyIpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19pbmZvX29wZW5fZnMgKAotCXN0cnVjdCBpbm9kZQkJKmlub2RlLAotCXN0cnVjdCBmaWxlCQkqZmlsZSkKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3ZpZGVvX2J1c19pbmZvX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19idXNfaW5mb19zZXFfc2hvdywKKwkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19ST01fc2VxX3Nob3cgKAotCXN0cnVjdCBzZXFfZmlsZQkJKnNlcSwKLQl2b2lkCQkJKm9mZnNldCkKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfUk9NX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKikgc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8gPSAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICopc2VxLT5wcml2YXRlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfUk9NX3NlcV9zaG93Iik7CiAKQEAgLTEwNjIsMjYgKzEwMTUsMjAgQEAKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiUGxlYXNlIGltcGxlbWVudCAlc1xuIiwgX19GVU5DVElPTl9fKTsKIAlzZXFfcHJpbnRmKHNlcSwgIjxUT0RPPlxuIik7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX1JPTV9vcGVuX2ZzICgKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUpCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX1JPTV9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3ZpZGVvX2J1c19ST01fc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19QT1NUX2luZm9fc2VxX3Nob3cgKAotCXN0cnVjdCBzZXFfZmlsZQkJKnNlcSwKLQl2b2lkCQkJKm9mZnNldCkKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfUE9TVF9pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKikgc2VxLT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcJCW9wdGlvbnM7Ci0JaW50CQkJc3RhdHVzOworCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8gPSAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICopc2VxLT5wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgb3B0aW9uczsKKwlpbnQgc3RhdHVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfUE9TVF9pbmZvX3NlcV9zaG93Iik7CiAKQEAgLTEwOTEsOCArMTAzOCwxMCBAQAogCXN0YXR1cyA9IGFjcGlfdmlkZW9fYnVzX1BPU1Rfb3B0aW9ucyh2aWRlbywgJm9wdGlvbnMpOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlpZiAoIShvcHRpb25zICYgMSkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJUaGUgbW90aGVyYm9hcmQgVkdBIGRldmljZSBpcyBub3QgbGlzdGVkIGFzIGEgcG9zc2libGUgUE9TVCBkZXZpY2UuXG4iKTsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJUaGlzIGluZGljYXRlIGEgQklPUyBidWcuICBQbGVhc2UgY29udGFjdCB0aGUgbWFudWZhY3R1cmVyLlxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkJICAgICAgICJUaGUgbW90aGVyYm9hcmQgVkdBIGRldmljZSBpcyBub3QgbGlzdGVkIGFzIGEgcG9zc2libGUgUE9TVCBkZXZpY2UuXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCQkgICAgICAgIlRoaXMgaW5kaWNhdGUgYSBCSU9TIGJ1Zy4gIFBsZWFzZSBjb250YWN0IHRoZSBtYW51ZmFjdHVyZXIuXG4iKTsKIAkJfQogCQlwcmludGsoIiVseFxuIiwgb3B0aW9ucyk7CiAJCXNlcV9wcmludGYoc2VxLCAiY2FuIFBPU1Q6IDxpbnRncmF0ZWQgdmlkZW8+Iik7CkBAIC0xMTAzLDg5ICsxMDUyLDc0IEBACiAJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CiAJfSBlbHNlCiAJCXNlcV9wcmludGYoc2VxLCAiPG5vdCBzdXBwb3J0ZWQ+XG4iKTsKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX1BPU1RfaW5mb19vcGVuX2ZzICgKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUpCithY3BpX3ZpZGVvX2J1c19QT1NUX2luZm9fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19idXNfUE9TVF9pbmZvX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19idXNfUE9TVF9pbmZvX3NlcV9zaG93LAorCQkJICAgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX1BPU1Rfc2VxX3Nob3cgKAotCXN0cnVjdCBzZXFfZmlsZQkJKnNlcSwKLQl2b2lkCQkJKm9mZnNldCkKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfUE9TVF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8gPSAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICopIHNlcS0+cHJpdmF0ZTsKLQlpbnQJCQlzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwkJaWQ7CisJc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKilzZXEtPnByaXZhdGU7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGlkOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfUE9TVF9zZXFfc2hvdyIpOwogCiAJaWYgKCF2aWRlbykKIAkJZ290byBlbmQ7CiAKLQlzdGF0dXMgPSBhY3BpX3ZpZGVvX2J1c19nZXRfUE9TVCAodmlkZW8sICZpZCk7CisJc3RhdHVzID0gYWNwaV92aWRlb19idXNfZ2V0X1BPU1QodmlkZW8sICZpZCk7CiAJaWYgKCFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlzZXFfcHJpbnRmKHNlcSwgIjxub3Qgc3VwcG9ydGVkPlxuIik7CiAJCWdvdG8gZW5kOwogCX0KLQlzZXFfcHJpbnRmKHNlcSwgImRldmljZSBwb3N0ZWQgaXMgPCVzPlxuIiwgIGRldmljZV9kZWNvZGVbaWQgJiAzXSk7CisJc2VxX3ByaW50ZihzZXEsICJkZXZpY2UgcG9zdGVkIGlzIDwlcz5cbiIsIGRldmljZV9kZWNvZGVbaWQgJiAzXSk7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX0RPU19zZXFfc2hvdyAoCi0Jc3RydWN0IHNlcV9maWxlCQkqc2VxLAotCXZvaWQJCQkqb2Zmc2V0KQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19ET1Nfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKSBzZXEtPnByaXZhdGU7CisJc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKilzZXEtPnByaXZhdGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2J1c19ET1Nfc2VxX3Nob3ciKTsKIAotCXNlcV9wcmludGYoc2VxLCAiRE9TIHNldHRpbmc6IDwlZD5cbiIsIHZpZGVvLT5kb3Nfc2V0dGluZyApOworCXNlcV9wcmludGYoc2VxLCAiRE9TIHNldHRpbmc6IDwlZD5cbiIsIHZpZGVvLT5kb3Nfc2V0dGluZyk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX1BPU1Rfb3Blbl9mcyAoCi0Jc3RydWN0IGlub2RlCQkqaW5vZGUsCi0Jc3RydWN0IGZpbGUJCSpmaWxlKQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19QT1NUX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfdmlkZW9fYnVzX1BPU1Rfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3ZpZGVvX2J1c19QT1NUX3NlcV9zaG93LAorCQkJICAgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX0RPU19vcGVuX2ZzICgKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUpCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX0RPU19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3ZpZGVvX2J1c19ET1Nfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwogfQogCiBzdGF0aWMgc3NpemVfdAotYWNwaV92aWRlb19idXNfd3JpdGVfUE9TVCAoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCWNvbnN0IGNoYXIJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpkYXRhKQorYWNwaV92aWRlb19idXNfd3JpdGVfUE9TVChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSkKIHsKLQlpbnQJCQlzdGF0dXM7Ci0Jc3RydWN0IHNlcV9maWxlCQkqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8gPSAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICopIG0tPnByaXZhdGU7Ci0JY2hhcgkJCXN0clsxMl0gPSB7MH07Ci0JdW5zaWduZWQgbG9uZwkJb3B0LCBvcHRpb25zOworCWludCBzdGF0dXM7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKW0tPnByaXZhdGU7CisJY2hhciBzdHJbMTJdID0geyAwIH07CisJdW5zaWduZWQgbG9uZyBvcHQsIG9wdGlvbnM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2J1c193cml0ZV9QT1NUIik7CiAKLQogCWlmICghdmlkZW8gfHwgY291bnQgKyAxID4gc2l6ZW9mIHN0cikKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCkBAIC0xMjA1LDMyICsxMTM5LDI4IEBACiAJb3B0aW9ucyB8PSAxOwogCiAJaWYgKG9wdGlvbnMgJiAoMXVsIDw8IG9wdCkpIHsKLQkJc3RhdHVzID0gYWNwaV92aWRlb19idXNfc2V0X1BPU1QgKHZpZGVvLCBvcHQpOworCQlzdGF0dXMgPSBhY3BpX3ZpZGVvX2J1c19zZXRfUE9TVCh2aWRlbywgb3B0KTsKIAkJaWYgKCFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKIAkJCXJldHVybl9WQUxVRSgtRUZBVUxUKTsKIAogCX0KIAotCiAJcmV0dXJuX1ZBTFVFKGNvdW50KTsKIH0KIAogc3RhdGljIHNzaXplX3QKLWFjcGlfdmlkZW9fYnVzX3dyaXRlX0RPUyAoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCWNvbnN0IGNoYXIJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpkYXRhKQorYWNwaV92aWRlb19idXNfd3JpdGVfRE9TKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSkKIHsKLQlpbnQJCQlzdGF0dXM7Ci0Jc3RydWN0IHNlcV9maWxlCQkqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8gPSAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICopIG0tPnByaXZhdGU7Ci0JY2hhcgkJCXN0clsxMl0gPSB7MH07Ci0JdW5zaWduZWQgbG9uZwkJb3B0OworCWludCBzdGF0dXM7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKW0tPnByaXZhdGU7CisJY2hhciBzdHJbMTJdID0geyAwIH07CisJdW5zaWduZWQgbG9uZyBvcHQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2J1c193cml0ZV9ET1MiKTsKIAotCiAJaWYgKCF2aWRlbyB8fCBjb3VudCArIDEgPiBzaXplb2Ygc3RyKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKQEAgLTEyNDIsNyArMTE3Miw3IEBACiAJaWYgKG9wdCA+IDcpCiAJCXJldHVybl9WQUxVRSgtRUZBVUxUKTsKIAotCXN0YXR1cyA9IGFjcGlfdmlkZW9fYnVzX0RPUyAodmlkZW8sIG9wdCAmIDB4MywgKG9wdCAmIDB4NCk+PjIpOworCXN0YXR1cyA9IGFjcGlfdmlkZW9fYnVzX0RPUyh2aWRlbywgb3B0ICYgMHgzLCAob3B0ICYgMHg0KSA+PiAyKTsKIAogCWlmICghQUNQSV9TVUNDRVNTKHN0YXR1cykpCiAJCXJldHVybl9WQUxVRSgtRUZBVUxUKTsKQEAgLTEyNTAsMjAgKzExODAsMTggQEAKIAlyZXR1cm5fVkFMVUUoY291bnQpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19hZGRfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19hZGRfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbzsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfYWRkX2ZzIik7CiAKLQl2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJCWFjcGlfdmlkZW9fZGlyKTsKKwkJCQkJCSAgICAgYWNwaV92aWRlb19kaXIpOwogCQlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKQogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCQl2aWRlby0+ZGlyID0gYWNwaV9kZXZpY2VfZGlyKGRldmljZSk7CkBAIC0xMjczLDcgKzEyMDEsOCBAQAogCS8qICdpbmZvJyBbUl0gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJpbmZvIiwgU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJVbmFibGUgdG8gY3JlYXRlICdpbmZvJyBmcyBlbnRyeVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJ2luZm8nIGZzIGVudHJ5XG4iKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV92aWRlb19idXNfaW5mb19mb3BzOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKQEAgLTEyODMsNyArMTIxMiw4IEBACiAJLyogJ1JPTScgW1JdICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiUk9NIiwgU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJVbmFibGUgdG8gY3JlYXRlICdST00nIGZzIGVudHJ5XG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnUk9NJyBmcyBlbnRyeVxuIikpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdmlkZW9fYnVzX1JPTV9mb3BzOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKQEAgLTEyOTEsOSArMTIyMSwxMSBAQAogCX0KIAogCS8qICdQT1NUX2luZm8nIFtSXSAqLwotCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIlBPU1RfaW5mbyIsIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwllbnRyeSA9CisJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KCJQT1NUX2luZm8iLCBTX0lSVUdPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJaWYgKCFlbnRyeSkKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIlVuYWJsZSB0byBjcmVhdGUgJ1BPU1RfaW5mbycgZnMgZW50cnlcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdQT1NUX2luZm8nIGZzIGVudHJ5XG4iKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV92aWRlb19idXNfUE9TVF9pbmZvX2ZvcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtMTMwMSw5ICsxMjMzLDEyIEBACiAJfQogCiAJLyogJ1BPU1QnIFtSL1ddICovCi0JZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiUE9TVCIsIFNfSUZSRUd8U19JUlVHT3xTX0lSVVNSLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJZW50cnkgPQorCSAgICBjcmVhdGVfcHJvY19lbnRyeSgiUE9TVCIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JUlVTUiwKKwkJCSAgICAgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSAnUE9TVCcgZnMgZW50cnlcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdQT1NUJyBmcyBlbnRyeVxuIikpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdmlkZW9fYnVzX1BPU1RfZm9wczsKIAkJZW50cnktPnByb2NfZm9wcy0+d3JpdGUgPSBhY3BpX3ZpZGVvX2J1c193cml0ZV9QT1NUOwpAQCAtMTMxMiw5ICsxMjQ3LDEyIEBACiAJfQogCiAJLyogJ0RPUycgW1IvV10gKi8KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJET1MiLCBTX0lGUkVHfFNfSVJVR098U19JUlVTUiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCWVudHJ5ID0KKwkgICAgY3JlYXRlX3Byb2NfZW50cnkoIkRPUyIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JUlVTUiwKKwkJCSAgICAgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSAnRE9TJyBmcyBlbnRyeVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJ0RPUycgZnMgZW50cnlcbiIpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3ZpZGVvX2J1c19ET1NfZm9wczsKIAkJZW50cnktPnByb2NfZm9wcy0+d3JpdGUgPSBhY3BpX3ZpZGVvX2J1c193cml0ZV9ET1M7CkBAIC0xMzI1LDE1ICsxMjYzLDEzIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19yZW1vdmVfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbzsKKwlzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfcmVtb3ZlX2ZzIik7CiAKLQl2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCWlmIChhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgewogCQlyZW1vdmVfcHJvY19lbnRyeSgiaW5mbyIsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKQEAgLTEzNDEsOCArMTI3Nyw3IEBACiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJQT1NUX2luZm8iLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJQT1NUIiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCQlyZW1vdmVfcHJvY19lbnRyeSgiRE9TIiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwotCQlyZW1vdmVfcHJvY19lbnRyeShhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJCQlhY3BpX3ZpZGVvX2Rpcik7IAorCQlyZW1vdmVfcHJvY19lbnRyeShhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwgYWNwaV92aWRlb19kaXIpOwogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IE5VTEw7CiAJfQogCkBAIC0xMzU2LDIwICsxMjkxLDIwIEBACiAvKiBkZXZpY2UgaW50ZXJmYWNlICovCiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX2dldF9vbmVfZGV2aWNlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvKQorYWNwaV92aWRlb19idXNfZ2V0X29uZV9kZXZpY2Uoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvKQogewotCXVuc2lnbmVkIGxvbmcJCWRldmljZV9pZDsKLQlpbnQJCQlzdGF0dXMsIHJlc3VsdDsKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UJKmRhdGE7CisJdW5zaWduZWQgbG9uZyBkZXZpY2VfaWQ7CisJaW50IHN0YXR1cywgcmVzdWx0OworCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGF0YTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX2dldF9vbmVfZGV2aWNlIik7CiAKIAlpZiAoIWRldmljZSB8fCAhdmlkZW8pCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPmhhbmRsZSwgIl9BRFIiLCBOVUxMLCAmZGV2aWNlX2lkKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGV2aWNlLT5oYW5kbGUsICJfQURSIiwgTlVMTCwgJmRldmljZV9pZCk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAKIAkJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSksIEdGUF9LRVJORUwpOwpAQCAtMTQwMSwxNSArMTMzNiwxNyBAQAogCQkJZGF0YS0+ZmxhZ3MudW5rbm93biA9IDE7CiAJCQlicmVhazsKIAkJfQotCQkKKwogCQlhY3BpX3ZpZGVvX2RldmljZV9iaW5kKHZpZGVvLCBkYXRhKTsKIAkJYWNwaV92aWRlb19kZXZpY2VfZmluZF9jYXAoZGF0YSk7CiAKIAkJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGRhdGEtPmhhbmRsZSwKLQkJCUFDUElfREVWSUNFX05PVElGWSwgYWNwaV92aWRlb19kZXZpY2Vfbm90aWZ5LCBkYXRhKTsKKwkJCQkJCSAgICAgQUNQSV9ERVZJQ0VfTk9USUZZLAorCQkJCQkJICAgICBhY3BpX3ZpZGVvX2RldmljZV9ub3RpZnksCisJCQkJCQkgICAgIGRhdGEpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKKwkJCQkJICAiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIikpOwogCQkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJCWdvdG8gZW5kOwogCQl9CkBAIC0xNDIzLDcgKzEzNjAsNyBAQAogCQlyZXR1cm5fVkFMVUUoMCk7CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKC1FTk9FTlQpOwogfQogCkBAIC0xNDM3LDE1ICsxMzc0LDE1IEBACiAgKiAgRW51bWVyYXRlIHRoZSB2aWRlbyBkZXZpY2UgbGlzdCBvZiB0aGUgdmlkZW8gYnVzLCAKICAqICBiaW5kIHRoZSBpZHMgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB2aWRlbyBkZXZpY2VzCiAgKiAgdW5kZXIgdGhlIHZpZGVvIGJ1cy4KLSAqLyAgCisgKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfdmlkZW9fZGV2aWNlX3JlYmluZCggc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbykKK3N0YXRpYyB2b2lkIGFjcGlfdmlkZW9fZGV2aWNlX3JlYmluZChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZ2aWRlby0+dmlkZW9fZGV2aWNlX2xpc3QpIHsKLQkJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICogZGV2ID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOwotCQlhY3BpX3ZpZGVvX2RldmljZV9iaW5kKCB2aWRlbywgZGV2KTsKKwkJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXYgPQorCQkgICAgY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOworCQlhY3BpX3ZpZGVvX2RldmljZV9iaW5kKHZpZGVvLCBkZXYpOwogCX0KIH0KIApAQCAtMTQ2MCwyMSArMTM5NywyMSBAQAogICogIAogICogIEJpbmQgdGhlIGlkcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHZpZGVvIGRldmljZXMKICAqICB1bmRlciB0aGUgdmlkZW8gYnVzLgotICovICAKKyAqLwogCiBzdGF0aWMgdm9pZAotYWNwaV92aWRlb19kZXZpY2VfYmluZCggc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbywKLQkJCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlKQorYWNwaV92aWRlb19kZXZpY2VfYmluZChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLAorCQkgICAgICAgc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CWk7CisJaW50IGk7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2VfYmluZCIpOwogCiAjZGVmaW5lIElEU19WQUwoaSkgdmlkZW8tPmF0dGFjaGVkX2FycmF5W2ldLnZhbHVlLmludF92YWwKICNkZWZpbmUgSURTX0JJTkQoaSkgdmlkZW8tPmF0dGFjaGVkX2FycmF5W2ldLmJpbmRfaW5mbwotCQotCWZvciAoaSA9IDA7IElEU19WQUwoaSkgIT0gQUNQSV9WSURFT19IRUFEX0lOVkFMSUQgJiYgCi0JCWkgPCB2aWRlby0+YXR0YWNoZWRfY291bnQ7IGkrKykgewotCQlpZiAoZGV2aWNlLT5kZXZpY2VfaWQgPT0gKElEU19WQUwoaSkmIDB4ZmZmZikpIHsKKworCWZvciAoaSA9IDA7IElEU19WQUwoaSkgIT0gQUNQSV9WSURFT19IRUFEX0lOVkFMSUQgJiYKKwkgICAgIGkgPCB2aWRlby0+YXR0YWNoZWRfY291bnQ7IGkrKykgeworCQlpZiAoZGV2aWNlLT5kZXZpY2VfaWQgPT0gKElEU19WQUwoaSkgJiAweGZmZmYpKSB7CiAJCQlJRFNfQklORChpKSA9IGRldmljZTsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgImRldmljZV9iaW5kICVkXG4iLCBpKSk7CiAJCX0KQEAgLTE0OTIsMTcgKzE0MjksMTcgQEAKICAqICAKICAqICBDYWxsIF9ET0QgdG8gZW51bWVyYXRlIGFsbCBkZXZpY2VzIGF0dGFjaGVkIHRvIGRpc3BsYXkgYWRhcHRlcgogICoKLSAqLyAgCisgKi8KIAogc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9lbnVtZXJhdGUoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbykKIHsKLQlpbnQJCQlzdGF0dXM7Ci0JaW50CQkJY291bnQ7Ci0JaW50CQkJaTsKKwlpbnQgc3RhdHVzOworCWludCBjb3VudDsKKwlpbnQgaTsKIAlzdHJ1Y3QgYWNwaV92aWRlb19lbnVtZXJhdGVkX2RldmljZSAqYWN0aXZlX2RldmljZV9saXN0OwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwotCXVuaW9uIGFjcGlfb2JqZWN0CSpkb2QgPSBOVUxMOwotCXVuaW9uIGFjcGlfb2JqZWN0CSpvYmo7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqZG9kID0gTlVMTDsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2VfZW51bWVyYXRlIik7CiAKQEAgLTE1MTIsNyArMTQ0OSw3IEBACiAJCXJldHVybl9WQUxVRShzdGF0dXMpOwogCX0KIAotCWRvZCA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKKwlkb2QgPSAodW5pb24gYWNwaV9vYmplY3QgKilidWZmZXIucG9pbnRlcjsKIAlpZiAoIWRvZCB8fCAoZG9kLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBfRE9EIGRhdGFcbiIpKTsKIAkJc3RhdHVzID0gLUVGQVVMVDsKQEAgLTE1MjAsMTEgKzE0NTcsMTMgQEAKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCAlZCB2aWRlbyBoZWFkcyBpbiBfRE9EXG4iLAotCQlkb2QtPnBhY2thZ2UuY291bnQpKTsKKwkJCSAgZG9kLT5wYWNrYWdlLmNvdW50KSk7CiAKLQlhY3RpdmVfZGV2aWNlX2xpc3Q9IGttYWxsb2MoCi0gCQkoMStkb2QtPnBhY2thZ2UuY291bnQpKnNpemVvZihzdHJ1Y3QgYWNwaV92aWRlb19lbnVtZXJhdGVkX2RldmljZSksCi0JICAgICAgIAlHRlBfS0VSTkVMKTsKKwlhY3RpdmVfZGV2aWNlX2xpc3QgPSBrbWFsbG9jKCgxICsKKwkJCQkgICAgICBkb2QtPnBhY2thZ2UuY291bnQpICoKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QKKwkJCQkJICAgIGFjcGlfdmlkZW9fZW51bWVyYXRlZF9kZXZpY2UpLAorCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWFjdGl2ZV9kZXZpY2VfbGlzdCkgewogCQlzdGF0dXMgPSAtRU5PTUVNOwpAQCAtMTUzMywyNSArMTQ3MiwyOCBAQAogCiAJY291bnQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBkb2QtPnBhY2thZ2UuY291bnQ7IGkrKykgewotCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKikgJmRvZC0+cGFja2FnZS5lbGVtZW50c1tpXTsKKwkJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopJmRvZC0+cGFja2FnZS5lbGVtZW50c1tpXTsKIAogCQlpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBfRE9EIGRhdGFcbiIpKTsKLQkJCWFjdGl2ZV9kZXZpY2VfbGlzdFtpXS52YWx1ZS5pbnRfdmFsID0gQUNQSV9WSURFT19IRUFEX0lOVkFMSUQ7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJJbnZhbGlkIF9ET0QgZGF0YVxuIikpOworCQkJYWN0aXZlX2RldmljZV9saXN0W2ldLnZhbHVlLmludF92YWwgPQorCQkJICAgIEFDUElfVklERU9fSEVBRF9JTlZBTElEOwogCQl9CiAJCWFjdGl2ZV9kZXZpY2VfbGlzdFtpXS52YWx1ZS5pbnRfdmFsID0gb2JqLT5pbnRlZ2VyLnZhbHVlOwogCQlhY3RpdmVfZGV2aWNlX2xpc3RbaV0uYmluZF9pbmZvID0gTlVMTDsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiZG9kIGVsZW1lbnRbJWRdID0gJWRcbiIsIGksIChpbnQpIG9iai0+aW50ZWdlci52YWx1ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJkb2QgZWxlbWVudFslZF0gPSAlZFxuIiwgaSwKKwkJCQkgIChpbnQpb2JqLT5pbnRlZ2VyLnZhbHVlKSk7CiAJCWNvdW50Kys7CiAJfQogCWFjdGl2ZV9kZXZpY2VfbGlzdFtjb3VudF0udmFsdWUuaW50X3ZhbCA9IEFDUElfVklERU9fSEVBRF9FTkQ7CiAKLQlpZih2aWRlby0+YXR0YWNoZWRfYXJyYXkpCisJaWYgKHZpZGVvLT5hdHRhY2hlZF9hcnJheSkKIAkJa2ZyZWUodmlkZW8tPmF0dGFjaGVkX2FycmF5KTsKLQkKKwogCXZpZGVvLT5hdHRhY2hlZF9hcnJheSA9IGFjdGl2ZV9kZXZpY2VfbGlzdDsKIAl2aWRlby0+YXR0YWNoZWRfY291bnQgPSBjb3VudDsKLW91dDoKKyAgICAgIG91dDoKIAlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQpAQCAtMTU2NywxNyArMTUwOSwxNCBAQAogICoJMS4gRmluZCBvdXQgdGhlIGN1cnJlbnQgYWN0aXZlIG91dHB1dCBkZXZpY2UuCiAgKgkyLiBJZGVudGlmeSB0aGUgbmV4dCBvdXRwdXQgZGV2aWNlIHRvIHN3aXRjaAogICoJMy4gY2FsbCBfRFNTIHRvIGRvIGFjdHVhbCBzd2l0Y2guCi0gKi8gIAorICovCiAKLXN0YXRpYyBpbnQgCi1hY3BpX3ZpZGVvX3N3aXRjaF9vdXRwdXQoCi0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbywgCi0JaW50CWV2ZW50KQorc3RhdGljIGludCBhY3BpX3ZpZGVvX3N3aXRjaF9vdXRwdXQoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbywgaW50IGV2ZW50KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXY9TlVMTDsKLSAgICAgICAJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZfbmV4dD1OVUxMOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2X3ByZXY9TlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZfbmV4dCA9IE5VTEw7CisJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZfcHJldiA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBzdGF0ZTsKIAlpbnQgc3RhdHVzID0gMDsKIApAQCAtMTU4NiwxNSArMTUyNSwxOSBAQAogCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmdmlkZW8tPnZpZGVvX2RldmljZV9saXN0KSB7CiAJCWRldiA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsIGVudHJ5KTsKIAkJc3RhdHVzID0gYWNwaV92aWRlb19kZXZpY2VfZ2V0X3N0YXRlKGRldiwgJnN0YXRlKTsKLQkJaWYgKHN0YXRlICYgMHgyKXsKLQkJCWRldl9uZXh0ID0gY29udGFpbmVyX29mKG5vZGUtPm5leHQsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOwotCQkJZGV2X3ByZXYgPSBjb250YWluZXJfb2Yobm9kZS0+cHJldiwgc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlLCBlbnRyeSk7CisJCWlmIChzdGF0ZSAmIDB4MikgeworCQkJZGV2X25leHQgPQorCQkJICAgIGNvbnRhaW5lcl9vZihub2RlLT5uZXh0LCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsCisJCQkJCSBlbnRyeSk7CisJCQlkZXZfcHJldiA9CisJCQkgICAgY29udGFpbmVyX29mKG5vZGUtPnByZXYsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwKKwkJCQkJIGVudHJ5KTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQogCWRldl9uZXh0ID0gY29udGFpbmVyX29mKG5vZGUtPm5leHQsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOwogCWRldl9wcmV2ID0gY29udGFpbmVyX29mKG5vZGUtPnByZXYsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOwotb3V0OgkKKyAgICAgIG91dDoKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9DWUNMRToKIAljYXNlIEFDUElfVklERU9fTk9USUZZX05FWFRfT1VUUFVUOgpAQCAtMTYxMSwyMSArMTU1NCwxNiBAQAogCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQogCi1zdGF0aWMgaW50IAotYWNwaV92aWRlb19nZXRfbmV4dF9sZXZlbCgKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwKLQl1MzIJbGV2ZWxfY3VycmVudCwKLQl1MzIJZXZlbnQpCitzdGF0aWMgaW50CithY3BpX3ZpZGVvX2dldF9uZXh0X2xldmVsKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLAorCQkJICB1MzIgbGV2ZWxfY3VycmVudCwgdTMyIGV2ZW50KQogewotCS8qRml4IG1lKi8KKwkvKkZpeCBtZSAqLwogCXJldHVybiBsZXZlbF9jdXJyZW50OwogfQogCi0KIHN0YXRpYyB2b2lkCi1hY3BpX3ZpZGVvX3N3aXRjaF9icmlnaHRuZXNzICgKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwgCi0JaW50CWV2ZW50KQorYWNwaV92aWRlb19zd2l0Y2hfYnJpZ2h0bmVzcyhzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwgaW50IGV2ZW50KQogewogCXVuc2lnbmVkIGxvbmcgbGV2ZWxfY3VycmVudCwgbGV2ZWxfbmV4dDsKIAlhY3BpX3ZpZGVvX2RldmljZV9sY2RfZ2V0X2xldmVsX2N1cnJlbnQoZGV2aWNlLCAmbGV2ZWxfY3VycmVudCk7CkBAIC0xNjM0LDI2ICsxNTcyLDI3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX2dldF9kZXZpY2VzICgKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvLAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorYWNwaV92aWRlb19idXNfZ2V0X2RldmljZXMoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbywKKwkJCSAgIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludAkJCXN0YXR1cyA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZAkqbm9kZSwgKm5leHQ7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2dldF9kZXZpY2VzIik7CiAKIAlhY3BpX3ZpZGVvX2RldmljZV9lbnVtZXJhdGUodmlkZW8pOwogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZkZXZpY2UtPmNoaWxkcmVuKSB7Ci0JCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIG5vZGUpOworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9CisJCSAgICBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBhY3BpX2RldmljZSwgbm9kZSk7CiAKIAkJaWYgKCFkZXYpCiAJCQljb250aW51ZTsKIAogCQlzdGF0dXMgPSBhY3BpX3ZpZGVvX2J1c19nZXRfb25lX2RldmljZShkZXYsIHZpZGVvKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiQ2FudCBhdHRhY2ggZGV2aWNlXG4iKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJDYW50IGF0dGFjaCBkZXZpY2VcbiIpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTE2NjEsMTAgKzE2MDAsOSBAQAogCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19wdXRfb25lX2RldmljZSgKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfcHV0X29uZV9kZXZpY2Uoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UpCiB7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW87CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2J1c19wdXRfb25lX2RldmljZSIpOwpAQCAtMTY3OSwyNiArMTYxNywzMyBAQAogCXVwKCZ2aWRlby0+c2VtKTsKIAlhY3BpX3ZpZGVvX2RldmljZV9yZW1vdmVfZnMoZGV2aWNlLT5kZXYpOwogCisJc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoZGV2aWNlLT5oYW5kbGUsCisJCQkJCSAgICBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJCSAgICBhY3BpX3ZpZGVvX2RldmljZV9ub3RpZnkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOworCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19wdXRfZGV2aWNlcyAoCi0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbykKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfcHV0X2RldmljZXMoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbykKIHsKLQlpbnQJCQlzdGF0dXM7Ci0Jc3RydWN0IGxpc3RfaGVhZAkqbm9kZSwgKm5leHQ7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX3B1dF9kZXZpY2VzIik7CiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJnZpZGVvLT52aWRlb19kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRhdGEgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOworCQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRhdGEgPQorCQkgICAgbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsIGVudHJ5KTsKIAkJaWYgKCFkYXRhKQogCQkJY29udGludWU7CiAKIAkJc3RhdHVzID0gYWNwaV92aWRlb19idXNfcHV0X29uZV9kZXZpY2UoZGF0YSk7Ci0JCWlmKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggImhodXVoaHV1IGJ1ZyBpbiBhY3BpIHZpZGVvIGRyaXZlci5cbiIpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkJICAgICAgICJoaHV1aGh1dSBidWcgaW4gYWNwaSB2aWRlbyBkcml2ZXIuXG4iKTsKIAogCQlpZiAoZGF0YS0+YnJpZ2h0bmVzcykKIAkJCWtmcmVlKGRhdGEtPmJyaWdodG5lc3MpOwpAQCAtMTcxMSwyOCArMTY1NiwyMCBAQAogCiAvKiBhY3BpX3ZpZGVvIGludGVyZmFjZSAqLwogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19zdGFydF9kZXZpY2VzKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8pCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX3N0YXJ0X2RldmljZXMoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbykKIHsKIAlyZXR1cm4gYWNwaV92aWRlb19idXNfRE9TKHZpZGVvLCAxLCAwKTsKIH0KIAotc3RhdGljIGludAotYWNwaV92aWRlb19idXNfc3RvcF9kZXZpY2VzKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8pCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX3N0b3BfZGV2aWNlcyhzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvKQogewogCXJldHVybiBhY3BpX3ZpZGVvX2J1c19ET1ModmlkZW8sIDAsIDEpOwogfQogCi1zdGF0aWMgdm9pZAotYWNwaV92aWRlb19idXNfbm90aWZ5ICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCXUzMgkJCWV2ZW50LAotCXZvaWQJCQkqZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfdmlkZW9fYnVzX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKSBkYXRhOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKWRhdGE7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfbm90aWZ5Iik7CiAJcHJpbnRrKCJ2aWRlbyBidXMgbm90aWZ5XG4iKTsKQEAgLTE3NTcsMzAgKzE2OTQsMjcgQEAKIAkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoZGV2aWNlLCBldmVudCwgMCk7CiAJCWJyZWFrOwogCi0JY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9DWUNMRTogLyogQ3ljbGUgRGlzcGxheSBvdXRwdXQgaG90a2V5IHByZXNzZWQuKi8KLQljYXNlIEFDUElfVklERU9fTk9USUZZX05FWFRfT1VUUFVUOiAvKiBOZXh0IERpc3BsYXkgb3V0cHV0IGhvdGtleSBwcmVzc2VkLiAqLwotCWNhc2UgQUNQSV9WSURFT19OT1RJRllfUFJFVl9PVVRQVVQ6IC8qIHByZXZpb3VzIERpc3BsYXkgb3V0cHV0IGhvdGtleSBwcmVzc2VkLiAqLworCWNhc2UgQUNQSV9WSURFT19OT1RJRllfQ1lDTEU6CS8qIEN5Y2xlIERpc3BsYXkgb3V0cHV0IGhvdGtleSBwcmVzc2VkLiAqLworCWNhc2UgQUNQSV9WSURFT19OT1RJRllfTkVYVF9PVVRQVVQ6CS8qIE5leHQgRGlzcGxheSBvdXRwdXQgaG90a2V5IHByZXNzZWQuICovCisJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9QUkVWX09VVFBVVDoJLyogcHJldmlvdXMgRGlzcGxheSBvdXRwdXQgaG90a2V5IHByZXNzZWQuICovCiAJCWFjcGlfdmlkZW9fc3dpdGNoX291dHB1dCh2aWRlbywgZXZlbnQpOwogCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChkZXZpY2UsIGV2ZW50LCAwKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOworCQkJCSAgIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLXN0YXRpYyB2b2lkCi1hY3BpX3ZpZGVvX2RldmljZV9ub3RpZnkgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0JdTMyCQkJZXZlbnQsCi0Jdm9pZAkJCSpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV92aWRlb19kZXZpY2Vfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqdmlkZW9fZGV2aWNlID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKSBkYXRhOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKnZpZGVvX2RldmljZSA9CisJICAgIChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKilkYXRhOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fZGV2aWNlX25vdGlmeSIpOwogCkBAIC0xNzkyLDM2ICsxNzI2LDM0IEBACiAJCXJldHVybl9WT0lEOwogCiAJc3dpdGNoIChldmVudCkgewotCWNhc2UgQUNQSV9WSURFT19OT1RJRllfU1dJVENIOiAvKiBjaGFuZ2UgaW4gc3RhdHVzIChjeWNsZSBvdXRwdXQgZGV2aWNlKSAqLwotCWNhc2UgQUNQSV9WSURFT19OT1RJRllfUFJPQkU6IC8qIGNoYW5nZSBpbiBzdGF0dXMgKG91dHB1dCBkZXZpY2Ugc3RhdHVzKSAqLworCWNhc2UgQUNQSV9WSURFT19OT1RJRllfU1dJVENIOgkvKiBjaGFuZ2UgaW4gc3RhdHVzIChjeWNsZSBvdXRwdXQgZGV2aWNlKSAqLworCWNhc2UgQUNQSV9WSURFT19OT1RJRllfUFJPQkU6CS8qIGNoYW5nZSBpbiBzdGF0dXMgKG91dHB1dCBkZXZpY2Ugc3RhdHVzKSAqLwogCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChkZXZpY2UsIGV2ZW50LCAwKTsKIAkJYnJlYWs7Ci0JY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9DWUNMRV9CUklHSFRORVNTOiAvKiBDeWNsZSBicmlnaHRuZXNzICovCi0JY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9JTkNfQlJJR0hUTkVTUzogLyogSW5jcmVhc2UgYnJpZ2h0bmVzcyAqLwotCWNhc2UgQUNQSV9WSURFT19OT1RJRllfREVDX0JSSUdIVE5FU1M6IC8qIERlY3JlYXNlIGJyaWdodG5lc3MgKi8KLQljYXNlIEFDUElfVklERU9fTk9USUZZX1pFUk9fQlJJR0hUTkVTUzogLyogemVybyBicmlnaHRuZXNzcyAqLwotCWNhc2UgQUNQSV9WSURFT19OT1RJRllfRElTUExBWV9PRkY6IC8qIGRpc3BsYXkgZGV2aWNlIG9mZiAqLwotCQlhY3BpX3ZpZGVvX3N3aXRjaF9icmlnaHRuZXNzICh2aWRlb19kZXZpY2UsIGV2ZW50KTsKKwljYXNlIEFDUElfVklERU9fTk9USUZZX0NZQ0xFX0JSSUdIVE5FU1M6CS8qIEN5Y2xlIGJyaWdodG5lc3MgKi8KKwljYXNlIEFDUElfVklERU9fTk9USUZZX0lOQ19CUklHSFRORVNTOgkvKiBJbmNyZWFzZSBicmlnaHRuZXNzICovCisJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9ERUNfQlJJR0hUTkVTUzoJLyogRGVjcmVhc2UgYnJpZ2h0bmVzcyAqLworCWNhc2UgQUNQSV9WSURFT19OT1RJRllfWkVST19CUklHSFRORVNTOgkvKiB6ZXJvIGJyaWdodG5lc3NzICovCisJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9ESVNQTEFZX09GRjoJLyogZGlzcGxheSBkZXZpY2Ugb2ZmICovCisJCWFjcGlfdmlkZW9fc3dpdGNoX2JyaWdodG5lc3ModmlkZW9fZGV2aWNlLCBldmVudCk7CiAJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGRldmljZSwgZXZlbnQsIDApOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOworCQkJCSAgIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybl9WT0lEOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19hZGQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gMDsKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8gPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfYWRkIik7Ci0JCisKIAlpZiAoIWRldmljZSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCkBAIC0xODUxLDIxICsxNzgzLDIyIEBACiAJYWNwaV92aWRlb19idXNfc3RhcnRfZGV2aWNlcyh2aWRlbyk7CiAKIAlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIodmlkZW8tPmhhbmRsZSwKLQkJQUNQSV9ERVZJQ0VfTk9USUZZLCBhY3BpX3ZpZGVvX2J1c19ub3RpZnksIHZpZGVvKTsKKwkJCQkJICAgICBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJCSAgICAgYWNwaV92aWRlb19idXNfbm90aWZ5LCB2aWRlbyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlbmQ7CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc10gKG11bHRpLWhlYWQ6ICVzICByb206ICVzICBwb3N0OiAlcylcbiIsCi0JCUFDUElfVklERU9fREVWSUNFX05BTUUsIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQl2aWRlby0+ZmxhZ3MubXVsdGloZWFkID8gInllcyI6Im5vIiwKLQkJdmlkZW8tPmZsYWdzLnJvbSA/ICJ5ZXMiOiJubyIsCi0JCXZpZGVvLT5mbGFncy5wb3N0ID8gInllcyI6Im5vIik7CisJICAgICAgIEFDUElfVklERU9fREVWSUNFX05BTUUsIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAorCSAgICAgICB2aWRlby0+ZmxhZ3MubXVsdGloZWFkID8gInllcyIgOiAibm8iLAorCSAgICAgICB2aWRlby0+ZmxhZ3Mucm9tID8gInllcyIgOiAibm8iLAorCSAgICAgICB2aWRlby0+ZmxhZ3MucG9zdCA/ICJ5ZXMiIDogIm5vIik7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAocmVzdWx0KSB7CiAJCWFjcGlfdmlkZW9fYnVzX3JlbW92ZV9mcyhkZXZpY2UpOwogCQlrZnJlZSh2aWRlbyk7CkBAIC0xODc0LDI4ICsxODA3LDI2IEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX3JlbW92ZSAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsCi0JaW50CQkJdHlwZSkKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gMDsKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8gPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfcmVtb3ZlIik7CiAKIAlpZiAoIWRldmljZSB8fCAhYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQl2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCWFjcGlfdmlkZW9fYnVzX3N0b3BfZGV2aWNlcyh2aWRlbyk7CiAKIAlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcih2aWRlby0+aGFuZGxlLAotCQlBQ1BJX0RFVklDRV9OT1RJRlksIGFjcGlfdmlkZW9fYnVzX25vdGlmeSk7CisJCQkJCSAgICBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJCSAgICBhY3BpX3ZpZGVvX2J1c19ub3RpZnkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAKIAlhY3BpX3ZpZGVvX2J1c19wdXRfZGV2aWNlcyh2aWRlbyk7CiAJYWNwaV92aWRlb19idXNfcmVtb3ZlX2ZzKGRldmljZSk7CkBAIC0xOTA3LDE1ICsxODM4LDEyIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX21hdGNoICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlzdHJ1Y3QgYWNwaV9kcml2ZXIJKmRyaXZlcikKK2FjcGlfdmlkZW9fYnVzX21hdGNoKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcikKIHsKLQlhY3BpX2hhbmRsZQkJaF9kdW1teTE7Ci0JYWNwaV9oYW5kbGUJCWhfZHVtbXkyOwotCWFjcGlfaGFuZGxlCQloX2R1bW15MzsKKwlhY3BpX2hhbmRsZSBoX2R1bW15MTsKKwlhY3BpX2hhbmRsZSBoX2R1bW15MjsKKwlhY3BpX2hhbmRsZSBoX2R1bW15MzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX21hdGNoIik7CiAKQEAgLTE5NDEsMjIgKzE4NjksMTkgQEAKIAkgICAgQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9TUEQiLCAmaF9kdW1teTMpKSkKIAkJcmV0dXJuX1ZBTFVFKDApOwogCi0KIAlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQKLWFjcGlfdmlkZW9faW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfdmlkZW9faW5pdCh2b2lkKQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2luaXQiKTsKIAogCS8qCi0JYWNwaV9kYmdfbGV2ZWwgPSAweEZGRkZGRkZGOwotCWFjcGlfZGJnX2xheWVyID0gMHgwODAwMDAwMDsKLQkqLworCSAgIGFjcGlfZGJnX2xldmVsID0gMHhGRkZGRkZGRjsKKwkgICBhY3BpX2RiZ19sYXllciA9IDB4MDgwMDAwMDA7CisJICovCiAKIAlhY3BpX3ZpZGVvX2RpciA9IHByb2NfbWtkaXIoQUNQSV9WSURFT19DTEFTUywgYWNwaV9yb290X2Rpcik7CiAJaWYgKCFhY3BpX3ZpZGVvX2RpcikKQEAgLTE5NzIsOCArMTg5Nyw3IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWFjcGlfdmlkZW9fZXhpdCAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX3ZpZGVvX2V4aXQodm9pZCkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2V4aXQiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaWR0NzcxMDUuYyBiL2RyaXZlcnMvYXRtL2lkdDc3MTA1LmMKaW5kZXggYjhjMjYwZS4uMGFhYmZjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaWR0NzcxMDUuYworKysgYi9kcml2ZXJzL2F0bS9pZHQ3NzEwNS5jCkBAIC01MCwxMCArNTAsOCBAQAogc3RhdGljIHZvaWQgaWR0NzcxMDVfcmVzdGFydF90aW1lcl9mdW5jKHVuc2lnbmVkIGxvbmcpOwogCiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzdGF0c190aW1lciA9Ci0gICAgVElNRVJfSU5JVElBTElaRVIoaWR0NzcxMDVfc3RhdHNfdGltZXJfZnVuYywgMCwgMCk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcmVzdGFydF90aW1lciA9Ci0gICAgVElNRVJfSU5JVElBTElaRVIoaWR0NzcxMDVfcmVzdGFydF90aW1lcl9mdW5jLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoc3RhdHNfdGltZXIsIGlkdDc3MTA1X3N0YXRzX3RpbWVyX2Z1bmMsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihyZXN0YXJ0X3RpbWVyLCBpZHQ3NzEwNV9yZXN0YXJ0X3RpbWVyX2Z1bmMsIDAsIDApOwogc3RhdGljIGludCBzdGFydF90aW1lciA9IDE7CiBzdGF0aWMgc3RydWN0IGlkdDc3MTA1X3ByaXYgKmlkdDc3MTA1X2FsbCA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2lwaGFzZS5jIGIvZHJpdmVycy9hdG0vaXBoYXNlLmMKaW5kZXggYTQzNTc1YS4uMmUyZTUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaXBoYXNlLmMKKysrIGIvZHJpdmVycy9hdG0vaXBoYXNlLmMKQEAgLTc5LDcgKzc5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgYXRtX2RldiAqX2lhX2Rldls4XTsKIHN0YXRpYyBpbnQgaWFkZXZfY291bnQ7CiBzdGF0aWMgdm9pZCBpYV9sZWRfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpOwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGlhX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoaWFfbGVkX3RpbWVyLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoaWFfdGltZXIsIGlhX2xlZF90aW1lciwgMCwgMCk7CiBzdGF0aWMgaW50IElBX1RYX0JVRiA9IERGTF9UWF9CVUZGRVJTLCBJQV9UWF9CVUZfU1ogPSBERkxfVFhfQlVGX1NaOwogc3RhdGljIGludCBJQV9SWF9CVUYgPSBERkxfUlhfQlVGRkVSUywgSUFfUlhfQlVGX1NaID0gREZMX1JYX0JVRl9TWjsKIHN0YXRpYyB1aW50IElBRGVidWdGbGFnID0gLyogSUZfSUFEQkdfRVJSIHwgSUZfSUFEQkdfQ0JSfCBJRl9JQURCR19JTklUX0FEQVBURVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL3phdG0uYyBiL2RyaXZlcnMvYXRtL3phdG0uYwppbmRleCBjNGI3NWVjLi41NTk1OWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS96YXRtLmMKKysrIGIvZHJpdmVycy9hdG0vemF0bS5jCkBAIC00MTcsOSArNDE3LDkgQEAKIAkJY2hhbiA9IChoZXJlWzNdICYgdVBEOTg0MDFfQUFMNV9DSEFOKSA+PgogCQkgICAgdVBEOTg0MDFfQUFMNV9DSEFOX1NISUZUOwogCQlpZiAoY2hhbiA8IHphdG1fZGV2LT5jaGFucyAmJiB6YXRtX2Rldi0+cnhfbWFwW2NoYW5dKSB7Ci0JCQlpbnQgcG9zID0gWkFUTV9WQ0ModmNjKS0+cG9vbDsKLQorCQkJaW50IHBvczsKIAkJCXZjYyA9IHphdG1fZGV2LT5yeF9tYXBbY2hhbl07CisJCQlwb3MgPSBaQVRNX1ZDQyh2Y2MpLT5wb29sOwogCQkJaWYgKHNrYiA9PSB6YXRtX2Rldi0+bGFzdF9mcmVlW3Bvc10pCiAJCQkJemF0bV9kZXYtPmxhc3RfZnJlZVtwb3NdID0gTlVMTDsKIAkJCXNrYl91bmxpbmsoc2tiLCB6YXRtX2Rldi0+cG9vbCArIHBvcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jIGIvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYwppbmRleCBlYzYxNWQ4Li4zNzNlN2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCisrKyBiL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKQEAgLTIyLDExICsyMiwyNiBAQAogLyogVGhpcyBpcyBhIHByaXZhdGUgc3RydWN0dXJlIHVzZWQgdG8gdGllIHRoZSBjbGFzc2RldiBhbmQgdGhlCiAgKiBjb250YWluZXIgLi4gaXQgc2hvdWxkIG5ldmVyIGJlIHZpc2libGUgb3V0c2lkZSB0aGlzIGZpbGUgKi8KIHN0cnVjdCBpbnRlcm5hbF9jb250YWluZXIgewotCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSBub2RlOwogCXN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250OwogCXN0cnVjdCBjbGFzc19kZXZpY2UgY2xhc3NkZXY7CiB9OwogCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9jb250YWluZXJfa2xpc3RfZ2V0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQoreworCXN0cnVjdCBpbnRlcm5hbF9jb250YWluZXIgKmljID0KKwkJY29udGFpbmVyX29mKG4sIHN0cnVjdCBpbnRlcm5hbF9jb250YWluZXIsIG5vZGUpOworCWNsYXNzX2RldmljZV9nZXQoJmljLT5jbGFzc2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIGludGVybmFsX2NvbnRhaW5lcl9rbGlzdF9wdXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCit7CisJc3RydWN0IGludGVybmFsX2NvbnRhaW5lciAqaWMgPQorCQljb250YWluZXJfb2Yobiwgc3RydWN0IGludGVybmFsX2NvbnRhaW5lciwgbm9kZSk7CisJY2xhc3NfZGV2aWNlX3B1dCgmaWMtPmNsYXNzZGV2KTsKK30KKworCiAvKioKICAqIGF0dHJpYnV0ZV9jb250YWluZXJfY2xhc3NkZXZfdG9fY29udGFpbmVyIC0gZ2l2ZW4gYSBjbGFzc2RldiwgcmV0dXJuIHRoZSBjb250YWluZXIKICAqCkBAIC01Nyw3ICs3Miw4IEBACiBhdHRyaWJ1dGVfY29udGFpbmVyX3JlZ2lzdGVyKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250KQogewogCUlOSVRfTElTVF9IRUFEKCZjb250LT5ub2RlKTsKLQlJTklUX0xJU1RfSEVBRCgmY29udC0+Y29udGFpbmVycyk7CisJa2xpc3RfaW5pdCgmY29udC0+Y29udGFpbmVycyxpbnRlcm5hbF9jb250YWluZXJfa2xpc3RfZ2V0LAorCQkgICBpbnRlcm5hbF9jb250YWluZXJfa2xpc3RfcHV0KTsKIAkJCiAJZG93bigmYXR0cmlidXRlX2NvbnRhaW5lcl9tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmY29udC0+bm9kZSwgJmF0dHJpYnV0ZV9jb250YWluZXJfbGlzdCk7CkBAIC03NywxMSArOTMsMTMgQEAKIHsKIAlpbnQgcmV0dmFsID0gLUVCVVNZOwogCWRvd24oJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOwotCWlmICghbGlzdF9lbXB0eSgmY29udC0+Y29udGFpbmVycykpCisJc3Bpbl9sb2NrKCZjb250LT5jb250YWluZXJzLmtfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZjb250LT5jb250YWluZXJzLmtfbGlzdCkpCiAJCWdvdG8gb3V0OwogCXJldHZhbCA9IDA7CiAJbGlzdF9kZWwoJmNvbnQtPm5vZGUpOwogIG91dDoKKwlzcGluX3VubG9jaygmY29udC0+Y29udGFpbmVycy5rX2xvY2spOwogCXVwKCZhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKIAlyZXR1cm4gcmV0dmFsOwogCQkKQEAgLTE0MCw3ICsxNTgsNiBAQAogCQkJY29udGludWU7CiAJCX0KIAkJbWVtc2V0KGljLCAwLCBzaXplb2Yoc3RydWN0IGludGVybmFsX2NvbnRhaW5lcikpOwotCQlJTklUX0xJU1RfSEVBRCgmaWMtPm5vZGUpOwogCQlpYy0+Y29udCA9IGNvbnQ7CiAJCWNsYXNzX2RldmljZV9pbml0aWFsaXplKCZpYy0+Y2xhc3NkZXYpOwogCQlpYy0+Y2xhc3NkZXYuZGV2ID0gZ2V0X2RldmljZShkZXYpOwpAQCAtMTUxLDExICsxNjgsMjIgQEAKIAkJCWZuKGNvbnQsIGRldiwgJmljLT5jbGFzc2Rldik7CiAJCWVsc2UKIAkJCWF0dHJpYnV0ZV9jb250YWluZXJfYWRkX2NsYXNzX2RldmljZSgmaWMtPmNsYXNzZGV2KTsKLQkJbGlzdF9hZGRfdGFpbCgmaWMtPm5vZGUsICZjb250LT5jb250YWluZXJzKTsKKwkJa2xpc3RfYWRkX3RhaWwoJmljLT5ub2RlLCAmY29udC0+Y29udGFpbmVycyk7CiAJfQogCXVwKCZhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKIH0KIAorLyogRklYTUU6IGNhbid0IGJyZWFrIG91dCBvZiB0aGlzIHVubGVzcyBrbGlzdF9pdGVyX2V4aXQgaXMgYWxzbworICogY2FsbGVkIGJlZm9yZSBkb2luZyB0aGUgYnJlYWsKKyAqLworI2RlZmluZSBrbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsIGhlYWQsIG1lbWJlciwgaXRlcikgXAorCWZvciAoa2xpc3RfaXRlcl9pbml0KGhlYWQsIGl0ZXIpOyAocG9zID0gKHsgXAorCQlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGtsaXN0X25leHQoaXRlcik7IFwKKwkJbiA/IGNvbnRhaW5lcl9vZihuLCB0eXBlb2YoKnBvcyksIG1lbWJlcikgOiBcCisJCQkoeyBrbGlzdF9pdGVyX2V4aXQoaXRlcikgOyBOVUxMOyB9KTsgXAorCX0pICkgIT0gTlVMTDsgKQorCQkJCisKIC8qKgogICogYXR0cmlidXRlX2NvbnRhaW5lcl9yZW1vdmVfZGV2aWNlIC0gbWFrZSBkZXZpY2UgZWxpZ2libGUgZm9yIHJlbW92YWwuCiAgKgpAQCAtMTgyLDE3ICsyMTAsMTkgQEAKIAogCWRvd24oJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udCwgJmF0dHJpYnV0ZV9jb250YWluZXJfbGlzdCwgbm9kZSkgewotCQlzdHJ1Y3QgaW50ZXJuYWxfY29udGFpbmVyICppYywgKnRtcDsKKwkJc3RydWN0IGludGVybmFsX2NvbnRhaW5lciAqaWM7CisJCXN0cnVjdCBrbGlzdF9pdGVyIGl0ZXI7CiAKIAkJaWYgKGF0dHJpYnV0ZV9jb250YWluZXJfbm9fY2xhc3NkZXZzKGNvbnQpKQogCQkJY29udGludWU7CiAKIAkJaWYgKCFjb250LT5tYXRjaChjb250LCBkZXYpKQogCQkJY29udGludWU7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpYywgdG1wLCAmY29udC0+Y29udGFpbmVycywgbm9kZSkgeworCisJCWtsaXN0X2Zvcl9lYWNoX2VudHJ5KGljLCAmY29udC0+Y29udGFpbmVycywgbm9kZSwgJml0ZXIpIHsKIAkJCWlmIChkZXYgIT0gaWMtPmNsYXNzZGV2LmRldikKIAkJCQljb250aW51ZTsKLQkJCWxpc3RfZGVsKCZpYy0+bm9kZSk7CisJCQlrbGlzdF9kZWwoJmljLT5ub2RlKTsKIAkJCWlmIChmbikKIAkJCQlmbihjb250LCBkZXYsICZpYy0+Y2xhc3NkZXYpOwogCQkJZWxzZSB7CkBAIC0yMjUsMTIgKzI1NSwxOCBAQAogCiAJZG93bigmYXR0cmlidXRlX2NvbnRhaW5lcl9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb250LCAmYXR0cmlidXRlX2NvbnRhaW5lcl9saXN0LCBub2RlKSB7Ci0JCXN0cnVjdCBpbnRlcm5hbF9jb250YWluZXIgKmljLCAqdG1wOworCQlzdHJ1Y3QgaW50ZXJuYWxfY29udGFpbmVyICppYzsKKwkJc3RydWN0IGtsaXN0X2l0ZXIgaXRlcjsKIAogCQlpZiAoIWNvbnQtPm1hdGNoKGNvbnQsIGRldikpCiAJCQljb250aW51ZTsKIAotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaWMsIHRtcCwgJmNvbnQtPmNvbnRhaW5lcnMsIG5vZGUpIHsKKwkJaWYgKGF0dHJpYnV0ZV9jb250YWluZXJfbm9fY2xhc3NkZXZzKGNvbnQpKSB7CisJCQlmbihjb250LCBkZXYsIE5VTEwpOworCQkJY29udGludWU7CisJCX0KKworCQlrbGlzdF9mb3JfZWFjaF9lbnRyeShpYywgJmNvbnQtPmNvbnRhaW5lcnMsIG5vZGUsICZpdGVyKSB7CiAJCQlpZiAoZGV2ID09IGljLT5jbGFzc2Rldi5kZXYpCiAJCQkJZm4oY29udCwgZGV2LCAmaWMtPmNsYXNzZGV2KTsKIAkJfQpAQCAtMzY4LDYgKzQwNCwzNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYXR0cmlidXRlX2NvbnRhaW5lcl9jbGFzc19kZXZpY2VfZGVsKTsKIAorLyoqCisgKiBhdHRyaWJ1dGVfY29udGFpbmVyX2ZpbmRfY2xhc3NfZGV2aWNlIC0gZmluZCB0aGUgY29ycmVzcG9uZGluZyBjbGFzc19kZXZpY2UKKyAqCisgKiBAY29udDoJdGhlIGNvbnRhaW5lcgorICogQGRldjoJdGhlIGdlbmVyaWMgZGV2aWNlCisgKgorICogTG9va3MgdXAgdGhlIGRldmljZSBpbiB0aGUgY29udGFpbmVyJ3MgbGlzdCBvZiBjbGFzcyBkZXZpY2VzIGFuZCByZXR1cm5zCisgKiB0aGUgY29ycmVzcG9uZGluZyBjbGFzc19kZXZpY2UuCisgKi8KK3N0cnVjdCBjbGFzc19kZXZpY2UgKgorYXR0cmlidXRlX2NvbnRhaW5lcl9maW5kX2NsYXNzX2RldmljZShzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqY29udCwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiA9IE5VTEw7CisJc3RydWN0IGludGVybmFsX2NvbnRhaW5lciAqaWM7CisJc3RydWN0IGtsaXN0X2l0ZXIgaXRlcjsKKworCWtsaXN0X2Zvcl9lYWNoX2VudHJ5KGljLCAmY29udC0+Y29udGFpbmVycywgbm9kZSwgJml0ZXIpIHsKKwkJaWYgKGljLT5jbGFzc2Rldi5kZXYgPT0gZGV2KSB7CisJCQljZGV2ID0gJmljLT5jbGFzc2RldjsKKwkJCS8qIEZJWE1FOiBtdXN0IGV4aXQgaXRlcmF0b3IgdGhlbiBicmVhayAqLworCQkJa2xpc3RfaXRlcl9leGl0KCZpdGVyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGNkZXY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhdHRyaWJ1dGVfY29udGFpbmVyX2ZpbmRfY2xhc3NfZGV2aWNlKTsKKwogaW50IF9faW5pdAogYXR0cmlidXRlX2NvbnRhaW5lcl9pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYnVzLmMgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKaW5kZXggYWI1MzgzMi4uMDMyMDRiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2J1cy5jCisrKyBiL2RyaXZlcnMvYmFzZS9idXMuYwpAQCAtMTU2LDcgKzE1Niw5IEBACiAJCWRldmljZV9yZWxlYXNlX2RyaXZlcihkZXYpOwogCQllcnIgPSBjb3VudDsKIAl9Ci0JcmV0dXJuIGVycjsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXJldHVybiBjb3VudDsKIH0KIHN0YXRpYyBEUklWRVJfQVRUUih1bmJpbmQsIFNfSVdVU1IsIE5VTEwsIGRyaXZlcl91bmJpbmQpOwogCkBAIC0zNTgsNyArMzYwLDcgQEAKIAlpZiAoYnVzKSB7CiAJCXByX2RlYnVnKCJidXMgJXM6IGFkZCBkZXZpY2UgJXNcbiIsIGJ1cy0+bmFtZSwgZGV2LT5idXNfaWQpOwogCQlkZXZpY2VfYXR0YWNoKGRldik7Ci0JCWtsaXN0X2FkZF90YWlsKCZidXMtPmtsaXN0X2RldmljZXMsICZkZXYtPmtub2RlX2J1cyk7CisJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX2J1cywgJmJ1cy0+a2xpc3RfZGV2aWNlcyk7CiAJCWVycm9yID0gZGV2aWNlX2FkZF9hdHRycyhidXMsIGRldik7CiAJCWlmICghZXJyb3IpIHsKIAkJCXN5c2ZzX2NyZWF0ZV9saW5rKCZidXMtPmRldmljZXMua29iaiwgJmRldi0+a29iaiwgZGV2LT5idXNfaWQpOwpAQCAtNDQ2LDcgKzQ0OCw3IEBACiAJCX0KIAogCQlkcml2ZXJfYXR0YWNoKGRydik7Ci0JCWtsaXN0X2FkZF90YWlsKCZidXMtPmtsaXN0X2RyaXZlcnMsICZkcnYtPmtub2RlX2J1cyk7CisJCWtsaXN0X2FkZF90YWlsKCZkcnYtPmtub2RlX2J1cywgJmJ1cy0+a2xpc3RfZHJpdmVycyk7CiAJCW1vZHVsZV9hZGRfZHJpdmVyKGRydi0+b3duZXIsIGRydik7CiAKIAkJZHJpdmVyX2FkZF9hdHRycyhidXMsIGRydik7CkBAIC01NjYsNiArNTY4LDM2IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBrbGlzdF9kZXZpY2VzX2dldChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKKworCWdldF9kZXZpY2UoZGV2KTsKK30KKworc3RhdGljIHZvaWQga2xpc3RfZGV2aWNlc19wdXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX2J1cyk7CisKKwlwdXRfZGV2aWNlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGtsaXN0X2RyaXZlcnNfZ2V0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZV9kcml2ZXIsCisJCQkJCQkga25vZGVfYnVzKTsKKworCWdldF9kcml2ZXIoZHJ2KTsKK30KKworc3RhdGljIHZvaWQga2xpc3RfZHJpdmVyc19wdXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciwKKwkJCQkJCSBrbm9kZV9idXMpOworCisJcHV0X2RyaXZlcihkcnYpOworfQorCiAvKioKICAqCWJ1c19yZWdpc3RlciAtIHJlZ2lzdGVyIGEgYnVzIHdpdGggdGhlIHN5c3RlbS4KICAqCUBidXM6CWJ1cy4KQEAgLTYwMCw4ICs2MzIsOCBAQAogCWlmIChyZXR2YWwpCiAJCWdvdG8gYnVzX2RyaXZlcnNfZmFpbDsKIAotCWtsaXN0X2luaXQoJmJ1cy0+a2xpc3RfZGV2aWNlcyk7Ci0Ja2xpc3RfaW5pdCgmYnVzLT5rbGlzdF9kcml2ZXJzKTsKKwlrbGlzdF9pbml0KCZidXMtPmtsaXN0X2RldmljZXMsIGtsaXN0X2RldmljZXNfZ2V0LCBrbGlzdF9kZXZpY2VzX3B1dCk7CisJa2xpc3RfaW5pdCgmYnVzLT5rbGlzdF9kcml2ZXJzLCBrbGlzdF9kcml2ZXJzX2dldCwga2xpc3RfZHJpdmVyc19wdXQpOwogCWJ1c19hZGRfYXR0cnMoYnVzKTsKIAogCXByX2RlYnVnKCJidXMgdHlwZSAnJXMnIHJlZ2lzdGVyZWRcbiIsIGJ1cy0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9jbGFzcy5jCmluZGV4IDAxNTRhMTYuLmQxNjRjMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9jbGFzcy5jCkBAIC0yOTksMTAgKzI5OSw4IEBACiAKIAlwcl9kZWJ1ZygiZGV2aWNlIGNsYXNzICclcyc6IHJlbGVhc2UuXG4iLCBjZC0+Y2xhc3NfaWQpOwogCi0JaWYgKGNkLT5kZXZ0X2F0dHIpIHsKLQkJa2ZyZWUoY2QtPmRldnRfYXR0cik7Ci0JCWNkLT5kZXZ0X2F0dHIgPSBOVUxMOwotCX0KKwlrZnJlZShjZC0+ZGV2dF9hdHRyKTsKKwljZC0+ZGV2dF9hdHRyID0gTlVMTDsKIAogCWlmIChjbHMtPnJlbGVhc2UpCiAJCWNscy0+cmVsZWFzZShjZCk7CkBAIC00NTIsMTAgKzQ1MCwyOSBAQAogCUlOSVRfTElTVF9IRUFEKCZjbGFzc19kZXYtPm5vZGUpOwogfQogCitzdGF0aWMgY2hhciAqbWFrZV9jbGFzc19uYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKK3sKKwljaGFyICpuYW1lOworCWludCBzaXplOworCisJc2l6ZSA9IHN0cmxlbihjbGFzc19kZXYtPmNsYXNzLT5uYW1lKSArCisJCXN0cmxlbihrb2JqZWN0X25hbWUoJmNsYXNzX2Rldi0+a29iaikpICsgMjsKKworCW5hbWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghbmFtZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzdHJjcHkobmFtZSwgY2xhc3NfZGV2LT5jbGFzcy0+bmFtZSk7CisJc3RyY2F0KG5hbWUsICI6Iik7CisJc3RyY2F0KG5hbWUsIGtvYmplY3RfbmFtZSgmY2xhc3NfZGV2LT5rb2JqKSk7CisJcmV0dXJuIG5hbWU7Cit9CisKIGludCBjbGFzc19kZXZpY2VfYWRkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKIHsKIAlzdHJ1Y3QgY2xhc3MgKiBwYXJlbnQgPSBOVUxMOwogCXN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKiBjbGFzc19pbnRmOworCWNoYXIgKmNsYXNzX25hbWUgPSBOVUxMOwogCWludCBlcnJvcjsKIAogCWNsYXNzX2RldiA9IGNsYXNzX2RldmljZV9nZXQoY2xhc3NfZGV2KTsKQEAgLTUwMCw5ICs1MTcsMTMgQEAKIAl9CiAKIAljbGFzc19kZXZpY2VfYWRkX2F0dHJzKGNsYXNzX2Rldik7Ci0JaWYgKGNsYXNzX2Rldi0+ZGV2KQorCWlmIChjbGFzc19kZXYtPmRldikgeworCQljbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGNsYXNzX2Rldik7CiAJCXN5c2ZzX2NyZWF0ZV9saW5rKCZjbGFzc19kZXYtPmtvYmosCiAJCQkJICAmY2xhc3NfZGV2LT5kZXYtPmtvYmosICJkZXZpY2UiKTsKKwkJc3lzZnNfY3JlYXRlX2xpbmsoJmNsYXNzX2Rldi0+ZGV2LT5rb2JqLCAmY2xhc3NfZGV2LT5rb2JqLAorCQkJCSAgY2xhc3NfbmFtZSk7CisJfQogCiAJLyogbm90aWZ5IGFueSBpbnRlcmZhY2VzIHRoaXMgZGV2aWNlIGlzIG5vdyBoZXJlICovCiAJaWYgKHBhcmVudCkgewpAQCAtNTE5LDYgKzU0MCw3IEBACiAJaWYgKGVycm9yICYmIHBhcmVudCkKIAkJY2xhc3NfcHV0KHBhcmVudCk7CiAJY2xhc3NfZGV2aWNlX3B1dChjbGFzc19kZXYpOworCWtmcmVlKGNsYXNzX25hbWUpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNTg0LDYgKzYwNiw3IEBACiB7CiAJc3RydWN0IGNsYXNzICogcGFyZW50ID0gY2xhc3NfZGV2LT5jbGFzczsKIAlzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICogY2xhc3NfaW50ZjsKKwljaGFyICpjbGFzc19uYW1lID0gTlVMTDsKIAogCWlmIChwYXJlbnQpIHsKIAkJZG93bigmcGFyZW50LT5zZW0pOwpAQCAtNTk0LDggKzYxNywxMSBAQAogCQl1cCgmcGFyZW50LT5zZW0pOwogCX0KIAotCWlmIChjbGFzc19kZXYtPmRldikKKwlpZiAoY2xhc3NfZGV2LT5kZXYpIHsKKwkJY2xhc3NfbmFtZSA9IG1ha2VfY2xhc3NfbmFtZShjbGFzc19kZXYpOwogCQlzeXNmc19yZW1vdmVfbGluaygmY2xhc3NfZGV2LT5rb2JqLCAiZGV2aWNlIik7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZjbGFzc19kZXYtPmRldi0+a29iaiwgY2xhc3NfbmFtZSk7CisJfQogCWlmIChjbGFzc19kZXYtPmRldnRfYXR0cikKIAkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGNsYXNzX2RldiwgY2xhc3NfZGV2LT5kZXZ0X2F0dHIpOwogCWNsYXNzX2RldmljZV9yZW1vdmVfYXR0cnMoY2xhc3NfZGV2KTsKQEAgLTYwNSw2ICs2MzEsNyBAQAogCiAJaWYgKHBhcmVudCkKIAkJY2xhc3NfcHV0KHBhcmVudCk7CisJa2ZyZWUoY2xhc3NfbmFtZSk7CiB9CiAKIHZvaWQgY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggZWZlMDNhMC4uNmFiNzNmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC0xOTEsNiArMTkxLDIwIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBrbGlzdF9jaGlsZHJlbl9nZXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX3BhcmVudCk7CisKKwlnZXRfZGV2aWNlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGtsaXN0X2NoaWxkcmVuX3B1dChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfcGFyZW50KTsKKworCXB1dF9kZXZpY2UoZGV2KTsKK30KKwogCiAvKioKICAqCWRldmljZV9pbml0aWFsaXplIC0gaW5pdCBkZXZpY2Ugc3RydWN0dXJlLgpAQCAtMjA3LDcgKzIyMSw4IEBACiB7CiAJa29ial9zZXRfa3NldF9zKGRldiwgZGV2aWNlc19zdWJzeXMpOwogCWtvYmplY3RfaW5pdCgmZGV2LT5rb2JqKTsKLQlrbGlzdF9pbml0KCZkZXYtPmtsaXN0X2NoaWxkcmVuKTsKKwlrbGlzdF9pbml0KCZkZXYtPmtsaXN0X2NoaWxkcmVuLCBrbGlzdF9jaGlsZHJlbl9nZXQsCisJCSAgIGtsaXN0X2NoaWxkcmVuX3B1dCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZG1hX3Bvb2xzKTsKIAlpbml0X01VVEVYKCZkZXYtPnNlbSk7CiB9CkBAIC0yNDksNyArMjY0LDcgQEAKIAlpZiAoKGVycm9yID0gYnVzX2FkZF9kZXZpY2UoZGV2KSkpCiAJCWdvdG8gQnVzRXJyb3I7CiAJaWYgKHBhcmVudCkKLQkJa2xpc3RfYWRkX3RhaWwoJnBhcmVudC0+a2xpc3RfY2hpbGRyZW4sICZkZXYtPmtub2RlX3BhcmVudCk7CisJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX3BhcmVudCwgJnBhcmVudC0+a2xpc3RfY2hpbGRyZW4pOwogCiAJLyogbm90aWZ5IHBsYXRmb3JtIG9mIGRldmljZSBlbnRyeSAqLwogCWlmIChwbGF0Zm9ybV9ub3RpZnkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGQuYyBiL2RyaXZlcnMvYmFzZS9kZC5jCmluZGV4IDE2MzIzZjkuLmQ1YmJjZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZC5jCkBAIC00Miw3ICs0Miw3IEBACiB7CiAJcHJfZGVidWcoImJvdW5kIGRldmljZSAnJXMnIHRvIGRyaXZlciAnJXMnXG4iLAogCQkgZGV2LT5idXNfaWQsIGRldi0+ZHJpdmVyLT5uYW1lKTsKLQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5kcml2ZXItPmtsaXN0X2RldmljZXMsICZkZXYtPmtub2RlX2RyaXZlcik7CisJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfZHJpdmVyLCAmZGV2LT5kcml2ZXItPmtsaXN0X2RldmljZXMpOwogCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmRyaXZlci0+a29iaiwgJmRldi0+a29iaiwKIAkJCSAga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKIAlzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLCAmZGV2LT5kcml2ZXItPmtvYmosICJkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kbWFwb29sLmMgYi9kcml2ZXJzL2Jhc2UvZG1hcG9vbC5jCmluZGV4IGM0YWViZjIuLjYwYTdlZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kbWFwb29sLmMKKysrIGIvZHJpdmVycy9iYXNlL2RtYXBvb2wuYwpAQCAtMjYyLDcgKzI2Miw4IEBACiAgKiBJZiBzdWNoIGEgbWVtb3J5IGJsb2NrIGNhbid0IGJlIGFsbG9jYXRlZCwgbnVsbCBpcyByZXR1cm5lZC4KICAqLwogdm9pZCAqCi1kbWFfcG9vbF9hbGxvYyAoc3RydWN0IGRtYV9wb29sICpwb29sLCBpbnQgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpoYW5kbGUpCitkbWFfcG9vbF9hbGxvYyAoc3RydWN0IGRtYV9wb29sICpwb29sLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgbWVtX2ZsYWdzLAorCQlkbWFfYWRkcl90ICpoYW5kbGUpCiB7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJc3RydWN0IGRtYV9wYWdlCQkqcGFnZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kcml2ZXIuYyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwppbmRleCAyOTFjNTk1Li5lZjNmZTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2RyaXZlci5jCkBAIC0xNDIsNiArMTQyLDE5IEBACiAJa29iamVjdF9wdXQoJmRydi0+a29iaik7CiB9CiAKK3N0YXRpYyB2b2lkIGtsaXN0X2RldmljZXNfZ2V0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9kcml2ZXIpOworCisJZ2V0X2RldmljZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBrbGlzdF9kZXZpY2VzX3B1dChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfZHJpdmVyKTsKKworCXB1dF9kZXZpY2UoZGV2KTsKK30KIAogLyoqCiAgKglkcml2ZXJfcmVnaXN0ZXIgLSByZWdpc3RlciBkcml2ZXIgd2l0aCBidXMKQEAgLTE1Nyw3ICsxNzAsNyBAQAogICovCiBpbnQgZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2KQogewotCWtsaXN0X2luaXQoJmRydi0+a2xpc3RfZGV2aWNlcyk7CisJa2xpc3RfaW5pdCgmZHJ2LT5rbGlzdF9kZXZpY2VzLCBrbGlzdF9kZXZpY2VzX2dldCwga2xpc3RfZGV2aWNlc19wdXQpOwogCWluaXRfY29tcGxldGlvbigmZHJ2LT51bmxvYWRlZCk7CiAJcmV0dXJuIGJ1c19hZGRfZHJpdmVyKGRydik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCmluZGV4IDY1MjI4MTQuLjViZmEyZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCkBAIC0yOCw2ICsyOCw3IEBACiAJRldfU1RBVFVTX0RPTkUsCiAJRldfU1RBVFVTX0FCT1JULAogCUZXX1NUQVRVU19SRUFEWSwKKwlGV19TVEFUVVNfUkVBRFlfTk9IT1RQTFVHLAogfTsKIAogc3RhdGljIGludCBsb2FkaW5nX3RpbWVvdXQgPSAxMDsJLyogSW4gc2Vjb25kcyAqLwpAQCAtMzQ0LDcgKzM0NSw3IEBACiAKIHN0YXRpYyBpbnQKIGZ3X3NldHVwX2NsYXNzX2RldmljZShzdHJ1Y3QgZmlybXdhcmUgKmZ3LCBzdHJ1Y3QgY2xhc3NfZGV2aWNlICoqY2xhc3NfZGV2X3AsCi0JCSAgICAgIGNvbnN0IGNoYXIgKmZ3X25hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKKwkJICAgICAgY29uc3QgY2hhciAqZndfbmFtZSwgc3RydWN0IGRldmljZSAqZGV2aWNlLCBpbnQgaG90cGx1ZykKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXY7CkBAIC0zNzYsNyArMzc3LDEwIEBACiAJCWdvdG8gZXJyb3JfdW5yZWc7CiAJfQogCi0Jc2V0X2JpdChGV19TVEFUVVNfUkVBRFksICZmd19wcml2LT5zdGF0dXMpOworCWlmIChob3RwbHVnKQorICAgICAgICAgICAgICAgIHNldF9iaXQoRldfU1RBVFVTX1JFQURZLCAmZndfcHJpdi0+c3RhdHVzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNldF9iaXQoRldfU1RBVFVTX1JFQURZX05PSE9UUExVRywgJmZ3X3ByaXYtPnN0YXR1cyk7CiAJKmNsYXNzX2Rldl9wID0gY2xhc3NfZGV2OwogCWdvdG8gb3V0OwogCkBAIC0zODYsMjEgKzM5MCw5IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotLyoqCi0gKiByZXF1ZXN0X2Zpcm13YXJlOiAtIHJlcXVlc3QgZmlybXdhcmUgdG8gaG90cGx1ZyBhbmQgd2FpdCBmb3IgaXQKLSAqIERlc2NyaXB0aW9uOgotICoJQGZpcm13YXJlIHdpbGwgYmUgdXNlZCB0byByZXR1cm4gYSBmaXJtd2FyZSBpbWFnZSBieSB0aGUgbmFtZQotICoJb2YgQG5hbWUgZm9yIGRldmljZSBAZGV2aWNlLgotICoKLSAqCVNob3VsZCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvbnRleHQgd2hlcmUgc2xlZXBpbmcgaXMgYWxsb3dlZC4KLSAqCi0gKglAbmFtZSB3aWxsIGJlIHVzZSBhcyAkRklSTVdBUkUgaW4gdGhlIGhvdHBsdWcgZW52aXJvbm1lbnQgYW5kCi0gKglzaG91bGQgYmUgZGlzdGluY3RpdmUgZW5vdWdoIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGFueSBvdGhlcgotICoJZmlybXdhcmUgaW1hZ2UgZm9yIHRoaXMgb3IgYW55IG90aGVyIGRldmljZS4KLSAqKi8KLWludAotcmVxdWVzdF9maXJtd2FyZShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmaXJtd2FyZV9wLCBjb25zdCBjaGFyICpuYW1lLAotCQkgc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludAorX3JlcXVlc3RfZmlybXdhcmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZmlybXdhcmVfcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgaW50IGhvdHBsdWcpCiB7CiAJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2OwpAQCAtNDE5LDIyICs0MTEsMjUgQEAKIAl9CiAJbWVtc2V0KGZpcm13YXJlLCAwLCBzaXplb2YgKCpmaXJtd2FyZSkpOwogCi0JcmV0dmFsID0gZndfc2V0dXBfY2xhc3NfZGV2aWNlKGZpcm13YXJlLCAmY2xhc3NfZGV2LCBuYW1lLCBkZXZpY2UpOworCXJldHZhbCA9IGZ3X3NldHVwX2NsYXNzX2RldmljZShmaXJtd2FyZSwgJmNsYXNzX2RldiwgbmFtZSwgZGV2aWNlLAorCQlob3RwbHVnKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycm9yX2tmcmVlX2Z3OwogCiAJZndfcHJpdiA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CiAKLQlpZiAobG9hZGluZ190aW1lb3V0ID4gMCkgewotCQlmd19wcml2LT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgbG9hZGluZ190aW1lb3V0ICogSFo7Ci0JCWFkZF90aW1lcigmZndfcHJpdi0+dGltZW91dCk7Ci0JfQorCWlmIChob3RwbHVnKSB7CisJCWlmIChsb2FkaW5nX3RpbWVvdXQgPiAwKSB7CisJCQlmd19wcml2LT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgbG9hZGluZ190aW1lb3V0ICogSFo7CisJCQlhZGRfdGltZXIoJmZ3X3ByaXYtPnRpbWVvdXQpOworCQl9CiAKLQlrb2JqZWN0X2hvdHBsdWcoJmNsYXNzX2Rldi0+a29iaiwgS09CSl9BREQpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZ3X3ByaXYtPmNvbXBsZXRpb24pOwotCXNldF9iaXQoRldfU1RBVFVTX0RPTkUsICZmd19wcml2LT5zdGF0dXMpOwotCi0JZGVsX3RpbWVyX3N5bmMoJmZ3X3ByaXYtPnRpbWVvdXQpOworCQlrb2JqZWN0X2hvdHBsdWcoJmNsYXNzX2Rldi0+a29iaiwgS09CSl9BREQpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmd19wcml2LT5jb21wbGV0aW9uKTsKKwkJc2V0X2JpdChGV19TVEFUVVNfRE9ORSwgJmZ3X3ByaXYtPnN0YXR1cyk7CisJCWRlbF90aW1lcl9zeW5jKCZmd19wcml2LT50aW1lb3V0KTsKKwl9IGVsc2UKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmZndfcHJpdi0+Y29tcGxldGlvbik7CiAKIAlkb3duKCZmd19sb2NrKTsKIAlpZiAoIWZ3X3ByaXYtPmZ3LT5zaXplIHx8IHRlc3RfYml0KEZXX1NUQVRVU19BQk9SVCwgJmZ3X3ByaXYtPnN0YXR1cykpIHsKQEAgLTQ1NSw2ICs0NTAsMjYgQEAKIH0KIAogLyoqCisgKiByZXF1ZXN0X2Zpcm13YXJlOiAtIHJlcXVlc3QgZmlybXdhcmUgdG8gaG90cGx1ZyBhbmQgd2FpdCBmb3IgaXQKKyAqIERlc2NyaXB0aW9uOgorICogICAgICBAZmlybXdhcmUgd2lsbCBiZSB1c2VkIHRvIHJldHVybiBhIGZpcm13YXJlIGltYWdlIGJ5IHRoZSBuYW1lCisgKiAgICAgIG9mIEBuYW1lIGZvciBkZXZpY2UgQGRldmljZS4KKyAqCisgKiAgICAgIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvbnRleHQgd2hlcmUgc2xlZXBpbmcgaXMgYWxsb3dlZC4KKyAqCisgKiAgICAgIEBuYW1lIHdpbGwgYmUgdXNlIGFzICRGSVJNV0FSRSBpbiB0aGUgaG90cGx1ZyBlbnZpcm9ubWVudCBhbmQKKyAqICAgICAgc2hvdWxkIGJlIGRpc3RpbmN0aXZlIGVub3VnaCBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBhbnkgb3RoZXIKKyAqICAgICAgZmlybXdhcmUgaW1hZ2UgZm9yIHRoaXMgb3IgYW55IG90aGVyIGRldmljZS4KKyAqKi8KK2ludAorcmVxdWVzdF9maXJtd2FyZShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmaXJtd2FyZV9wLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisgICAgICAgIGludCBob3RwbHVnID0gMTsKKyAgICAgICAgcmV0dXJuIF9yZXF1ZXN0X2Zpcm13YXJlKGZpcm13YXJlX3AsIG5hbWUsIGRldmljZSwgaG90cGx1Zyk7Cit9CisKKy8qKgogICogcmVsZWFzZV9maXJtd2FyZTogLSByZWxlYXNlIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYSBmaXJtd2FyZSBpbWFnZQogICoqLwogdm9pZApAQCAtNDkxLDYgKzUwNiw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2aWNlOwogCXZvaWQgKmNvbnRleHQ7CiAJdm9pZCAoKmNvbnQpKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKmNvbnRleHQpOworCWludCBob3RwbHVnOwogfTsKIAogc3RhdGljIGludApAQCAtNTAzLDcgKzUxOSw4IEBACiAJCXJldHVybiAwOwogCX0KIAlkYWVtb25pemUoIiVzLyVzIiwgImZpcm13YXJlIiwgZndfd29yay0+bmFtZSk7Ci0JcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X3dvcmstPm5hbWUsIGZ3X3dvcmstPmRldmljZSk7CisJX3JlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd193b3JrLT5uYW1lLCBmd193b3JrLT5kZXZpY2UsCisJCWZ3X3dvcmstPmhvdHBsdWcpOwogCWZ3X3dvcmstPmNvbnQoZncsIGZ3X3dvcmstPmNvbnRleHQpOwogCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCW1vZHVsZV9wdXQoZndfd29yay0+bW9kdWxlKTsKQEAgLTUxOCw2ICs1MzUsOSBAQAogICoJQXN5bmNocm9ub3VzIHZhcmlhbnQgb2YgcmVxdWVzdF9maXJtd2FyZSgpIGZvciBjb250ZXh0cyB3aGVyZQogICoJaXQgaXMgbm90IHBvc3NpYmxlIHRvIHNsZWVwLgogICoKKyAqICAgICAgQGhvdHBsdWcgaW52b2tlcyBob3RwbHVnIGV2ZW50IHRvIGNvcHkgdGhlIGZpcm13YXJlIGltYWdlIGlmIHRoaXMgZmxhZworICogICAgICBpcyBub24temVybyBlbHNlIHRoZSBmaXJtd2FyZSBjb3B5IG11c3QgYmUgZG9uZSBtYW51YWxseS4KKyAqCiAgKglAY29udCB3aWxsIGJlIGNhbGxlZCBhc3luY2hyb25vdXNseSB3aGVuIHRoZSBmaXJtd2FyZSByZXF1ZXN0IGlzIG92ZXIuCiAgKgogICoJQGNvbnRleHQgd2lsbCBiZSBwYXNzZWQgb3ZlciB0byBAY29udC4KQEAgLTUyNyw3ICs1NDcsNyBAQAogICoqLwogaW50CiByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdCgKLQlzdHJ1Y3QgbW9kdWxlICptb2R1bGUsCisJc3RydWN0IG1vZHVsZSAqbW9kdWxlLCBpbnQgaG90cGx1ZywKIAljb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHZvaWQgKmNvbnRleHQsCiAJdm9pZCAoKmNvbnQpKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKmNvbnRleHQpKQogewpAQCAtNTQ4LDYgKzU2OCw3IEBACiAJCS5kZXZpY2UgPSBkZXZpY2UsCiAJCS5jb250ZXh0ID0gY29udGV4dCwKIAkJLmNvbnQgPSBjb250LAorCQkuaG90cGx1ZyA9IGhvdHBsdWcsCiAJfTsKIAogCXJldCA9IGtlcm5lbF90aHJlYWQocmVxdWVzdF9maXJtd2FyZV93b3JrX2Z1bmMsIGZ3X3dvcmssCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvbm9kZS5jIGIvZHJpdmVycy9iYXNlL25vZGUuYwppbmRleCA5MDRiMjdjLi4xNmM1MTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2Uvbm9kZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9ub2RlLmMKQEAgLTM5LDEzICszOSwyNSBAQAogCWludCBuOwogCWludCBuaWQgPSBkZXYtPmlkOwogCXN0cnVjdCBzeXNpbmZvIGk7CisJc3RydWN0IHBhZ2Vfc3RhdGUgcHM7CiAJdW5zaWduZWQgbG9uZyBpbmFjdGl2ZTsKIAl1bnNpZ25lZCBsb25nIGFjdGl2ZTsKIAl1bnNpZ25lZCBsb25nIGZyZWU7CiAKIAlzaV9tZW1pbmZvX25vZGUoJmksIG5pZCk7CisJZ2V0X3BhZ2Vfc3RhdGVfbm9kZSgmcHMsIG5pZCk7CiAJX19nZXRfem9uZV9jb3VudHMoJmFjdGl2ZSwgJmluYWN0aXZlLCAmZnJlZSwgTk9ERV9EQVRBKG5pZCkpOwogCisJLyogQ2hlY2sgZm9yIG5lZ2F0aXZlIHZhbHVlcyBpbiB0aGVzZSBhcHByb3hpbWF0ZSBjb3VudGVycyAqLworCWlmICgobG9uZylwcy5ucl9kaXJ0eSA8IDApCisJCXBzLm5yX2RpcnR5ID0gMDsKKwlpZiAoKGxvbmcpcHMubnJfd3JpdGViYWNrIDwgMCkKKwkJcHMubnJfd3JpdGViYWNrID0gMDsKKwlpZiAoKGxvbmcpcHMubnJfbWFwcGVkIDwgMCkKKwkJcHMubnJfbWFwcGVkID0gMDsKKwlpZiAoKGxvbmcpcHMubnJfc2xhYiA8IDApCisJCXBzLm5yX3NsYWIgPSAwOworCiAJbiA9IHNwcmludGYoYnVmLCAiXG4iCiAJCSAgICAgICAiTm9kZSAlZCBNZW1Ub3RhbDogICAgICU4bHUga0JcbiIKIAkJICAgICAgICJOb2RlICVkIE1lbUZyZWU6ICAgICAgJThsdSBrQlxuIgpAQCAtNTUsNyArNjcsMTEgQEAKIAkJICAgICAgICJOb2RlICVkIEhpZ2hUb3RhbDogICAgJThsdSBrQlxuIgogCQkgICAgICAgIk5vZGUgJWQgSGlnaEZyZWU6ICAgICAlOGx1IGtCXG4iCiAJCSAgICAgICAiTm9kZSAlZCBMb3dUb3RhbDogICAgICU4bHUga0JcbiIKLQkJICAgICAgICJOb2RlICVkIExvd0ZyZWU6ICAgICAgJThsdSBrQlxuIiwKKwkJICAgICAgICJOb2RlICVkIExvd0ZyZWU6ICAgICAgJThsdSBrQlxuIgorCQkgICAgICAgIk5vZGUgJWQgRGlydHk6ICAgICAgICAlOGx1IGtCXG4iCisJCSAgICAgICAiTm9kZSAlZCBXcml0ZWJhY2s6ICAgICU4bHUga0JcbiIKKwkJICAgICAgICJOb2RlICVkIE1hcHBlZDogICAgICAgJThsdSBrQlxuIgorCQkgICAgICAgIk5vZGUgJWQgU2xhYjogICAgICAgICAlOGx1IGtCXG4iLAogCQkgICAgICAgbmlkLCBLKGkudG90YWxyYW0pLAogCQkgICAgICAgbmlkLCBLKGkuZnJlZXJhbSksCiAJCSAgICAgICBuaWQsIEsoaS50b3RhbHJhbSAtIGkuZnJlZXJhbSksCkBAIC02NCw3ICs4MCwxMSBAQAogCQkgICAgICAgbmlkLCBLKGkudG90YWxoaWdoKSwKIAkJICAgICAgIG5pZCwgSyhpLmZyZWVoaWdoKSwKIAkJICAgICAgIG5pZCwgSyhpLnRvdGFscmFtIC0gaS50b3RhbGhpZ2gpLAotCQkgICAgICAgbmlkLCBLKGkuZnJlZXJhbSAtIGkuZnJlZWhpZ2gpKTsKKwkJICAgICAgIG5pZCwgSyhpLmZyZWVyYW0gLSBpLmZyZWVoaWdoKSwKKwkJICAgICAgIG5pZCwgSyhwcy5ucl9kaXJ0eSksCisJCSAgICAgICBuaWQsIEsocHMubnJfd3JpdGViYWNrKSwKKwkJICAgICAgIG5pZCwgSyhwcy5ucl9tYXBwZWQpLAorCQkgICAgICAgbmlkLCBLKHBzLm5yX3NsYWIpKTsKIAluICs9IGh1Z2V0bGJfcmVwb3J0X25vZGVfbWVtaW5mbyhuaWQsIGJ1ZiArIG4pOwogCXJldHVybiBuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3Jlc3VtZS5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3Jlc3VtZS5jCmluZGV4IGJkZDk2YjAuLjBhN2FhMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9yZXN1bWUuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcmVzdW1lLmMKQEAgLTI2LDExICsyNiwxMSBAQAogCiAJZG93bigmZGV2LT5zZW0pOwogCWlmIChkZXYtPnBvd2VyLnBtX3BhcmVudAotCQkJJiYgZGV2LT5wb3dlci5wbV9wYXJlbnQtPnBvd2VyLnBvd2VyX3N0YXRlKSB7CisJCQkmJiBkZXYtPnBvd2VyLnBtX3BhcmVudC0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpIHsKIAkJZGV2X2VycihkZXYsICJQTTogcmVzdW1lIGZyb20gJWQsIHBhcmVudCAlcyBzdGlsbCAlZFxuIiwKLQkJCWRldi0+cG93ZXIucG93ZXJfc3RhdGUsCisJCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50LAogCQkJZGV2LT5wb3dlci5wbV9wYXJlbnQtPmJ1c19pZCwKLQkJCWRldi0+cG93ZXIucG1fcGFyZW50LT5wb3dlci5wb3dlcl9zdGF0ZSk7CisJCQlkZXYtPnBvd2VyLnBtX3BhcmVudC0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpOwogCX0KIAlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnJlc3VtZSkgewogCQlkZXZfZGJnKGRldiwicmVzdW1pbmdcbiIpOwpAQCAtNTQsNyArNTQsNyBAQAogCQlsaXN0X2FkZF90YWlsKGVudHJ5LCAmZHBtX2FjdGl2ZSk7CiAKIAkJdXAoJmRwbV9saXN0X3NlbSk7Ci0JCWlmICghZGV2LT5wb3dlci5wcmV2X3N0YXRlKQorCQlpZiAoIWRldi0+cG93ZXIucHJldl9zdGF0ZS5ldmVudCkKIAkJCXJlc3VtZV9kZXZpY2UoZGV2KTsKIAkJZG93bigmZHBtX2xpc3Rfc2VtKTsKIAkJcHV0X2RldmljZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKaW5kZXggMzI1OTYyZC4uZThmMDUxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCkBAIC0xMywxMCArMTMsMTAgQEAKIHN0YXRpYyB2b2lkIHJ1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKiBkZXYpCiB7CiAJZGV2X2RiZyhkZXYsICJyZXN1bWluZ1xuIik7Ci0JaWYgKCFkZXYtPnBvd2VyLnBvd2VyX3N0YXRlKQorCWlmICghZGV2LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkKIAkJcmV0dXJuOwogCWlmICghcmVzdW1lX2RldmljZShkZXYpKQotCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gMDsKKwkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiB9CiAKIApAQCAtNDksMTAgKzQ5LDEwIEBACiAJaW50IGVycm9yID0gMDsKIAogCWRvd24oJmRwbV9zZW0pOwotCWlmIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID09IHN0YXRlKQorCWlmIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IHN0YXRlLmV2ZW50KQogCQlnb3RvIERvbmU7CiAKLQlpZiAoZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSkKKwlpZiAoZGV2LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkKIAkJcnVudGltZV9yZXN1bWUoZGV2KTsKIAogCWlmICghKGVycm9yID0gc3VzcGVuZF9kZXZpY2UoZGV2LCBzdGF0ZSkpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3N1c3BlbmQuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zdXNwZW5kLmMKaW5kZXggMmNjZWUzNy4uNTA1MDE3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3N1c3BlbmQuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc3VzcGVuZC5jCkBAIC00MCwyMiArNDAsMjIgQEAKIAlpbnQgZXJyb3IgPSAwOwogCiAJZG93bigmZGV2LT5zZW0pOwotCWlmIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlKSB7CisJaWYgKGRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpIHsKIAkJZGV2X2RiZyhkZXYsICJQTTogc3VzcGVuZCAlZC0tPiVkXG4iLAotCQkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSwgc3RhdGUpOworCQkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCwgc3RhdGUuZXZlbnQpOwogCX0KIAlpZiAoZGV2LT5wb3dlci5wbV9wYXJlbnQKLQkJCSYmIGRldi0+cG93ZXIucG1fcGFyZW50LT5wb3dlci5wb3dlcl9zdGF0ZSkgeworCQkJJiYgZGV2LT5wb3dlci5wbV9wYXJlbnQtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50KSB7CiAJCWRldl9lcnIoZGV2LAogCQkJIlBNOiBzdXNwZW5kICVkLT4lZCwgcGFyZW50ICVzIGFscmVhZHkgJWRcbiIsCi0JCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLCBzdGF0ZSwKKwkJCWRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQsIHN0YXRlLmV2ZW50LAogCQkJZGV2LT5wb3dlci5wbV9wYXJlbnQtPmJ1c19pZCwKLQkJCWRldi0+cG93ZXIucG1fcGFyZW50LT5wb3dlci5wb3dlcl9zdGF0ZSk7CisJCQlkZXYtPnBvd2VyLnBtX3BhcmVudC0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpOwogCX0KIAogCWRldi0+cG93ZXIucHJldl9zdGF0ZSA9IGRldi0+cG93ZXIucG93ZXJfc3RhdGU7CiAKLQlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnN1c3BlbmQgJiYgIWRldi0+cG93ZXIucG93ZXJfc3RhdGUpIHsKKwlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnN1c3BlbmQgJiYgIWRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpIHsKIAkJZGV2X2RiZyhkZXYsICJzdXNwZW5kaW5nXG4iKTsKIAkJZXJyb3IgPSBkZXYtPmJ1cy0+c3VzcGVuZChkZXYsIHN0YXRlKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCmluZGV4IGY4MmIzZGYuLjhkMDRmYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCkBAIC0yNiwxOSArMjYsMTkgQEAKIAogc3RhdGljIHNzaXplX3Qgc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqIGJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzdGF0ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqIGJ1Ziwgc2l6ZV90IG4pCiB7Ci0JdTMyIHN0YXRlOworCXBtX21lc3NhZ2VfdCBzdGF0ZTsKIAljaGFyICogcmVzdDsKIAlpbnQgZXJyb3IgPSAwOwogCi0Jc3RhdGUgPSBzaW1wbGVfc3RydG91bChidWYsICZyZXN0LCAxMCk7CisJc3RhdGUuZXZlbnQgPSBzaW1wbGVfc3RydG91bChidWYsICZyZXN0LCAxMCk7CiAJaWYgKCpyZXN0KQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoc3RhdGUpCisJaWYgKHN0YXRlLmV2ZW50KQogCQllcnJvciA9IGRwbV9ydW50aW1lX3N1c3BlbmQoZGV2LCBzdGF0ZSk7CiAJZWxzZQogCQlkcG1fcnVudGltZV9yZXN1bWUoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9zeXMuYyBiL2RyaXZlcnMvYmFzZS9zeXMuYwppbmRleCAyMTRiOTY0Li4zNDMxZWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2Uvc3lzLmMKKysrIGIvZHJpdmVycy9iYXNlL3N5cy5jCkBAIC0yODgsNiArMjg4LDI3IEBACiAJdXAoJnN5c2Rldl9kcml2ZXJzX2xvY2spOwogfQogCitzdGF0aWMgdm9pZCBfX3N5c2Rldl9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3lzZGV2X2NsYXNzICpjbHMgPSBkZXYtPmNsczsKKwlzdHJ1Y3Qgc3lzZGV2X2RyaXZlciAqZHJ2OworCisJLyogRmlyc3QsIGNhbGwgdGhlIGNsYXNzLXNwZWNpZmljIG9uZSAqLworCWlmIChjbHMtPnJlc3VtZSkKKwkJY2xzLT5yZXN1bWUoZGV2KTsKKworCS8qIENhbGwgYXV4aWxsYXJ5IGRyaXZlcnMgbmV4dC4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRydiwgJmNscy0+ZHJpdmVycywgZW50cnkpIHsKKwkJaWYgKGRydi0+cmVzdW1lKQorCQkJZHJ2LT5yZXN1bWUoZGV2KTsKKwl9CisKKwkvKiBDYWxsIGdsb2JhbCBkcml2ZXJzLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJ2LCAmc3lzZGV2X2RyaXZlcnMsIGVudHJ5KSB7CisJCWlmIChkcnYtPnJlc3VtZSkKKwkJCWRydi0+cmVzdW1lKGRldik7CisJfQorfQogCiAvKioKICAqCXN5c2Rldl9zdXNwZW5kIC0gU3VzcGVuZCBhbGwgc3lzdGVtIGRldmljZXMuCkBAIC0zMDUsMzggKzMyNiw5MyBAQAogaW50IHN5c2Rldl9zdXNwZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3Qgc3lzZGV2X2NsYXNzICogY2xzOworCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsICplcnJfZGV2OworCXN0cnVjdCBzeXNkZXZfZHJpdmVyICpkcnYsICplcnJfZHJ2OworCWludCByZXQ7CiAKIAlwcl9kZWJ1ZygiU3VzcGVuZGluZyBTeXN0ZW0gRGV2aWNlc1xuIik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoY2xzLCAmc3lzdGVtX3N1YnN5cy5rc2V0Lmxpc3QsCiAJCQkJICAgIGtzZXQua29iai5lbnRyeSkgewotCQlzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c2RldjsKIAogCQlwcl9kZWJ1ZygiU3VzcGVuZGluZyB0eXBlICclcyc6XG4iLAogCQkJIGtvYmplY3RfbmFtZSgmY2xzLT5rc2V0LmtvYmopKTsKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN5c2RldiwgJmNscy0+a3NldC5saXN0LCBrb2JqLmVudHJ5KSB7Ci0JCQlzdHJ1Y3Qgc3lzZGV2X2RyaXZlciAqIGRydjsKIAkJCXByX2RlYnVnKCIgJXNcbiIsIGtvYmplY3RfbmFtZSgmc3lzZGV2LT5rb2JqKSk7CiAKIAkJCS8qIENhbGwgZ2xvYmFsIGRyaXZlcnMgZmlyc3QuICovCiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRydiwgJnN5c2Rldl9kcml2ZXJzLCBlbnRyeSkgewotCQkJCWlmIChkcnYtPnN1c3BlbmQpCi0JCQkJCWRydi0+c3VzcGVuZChzeXNkZXYsIHN0YXRlKTsKKwkJCQlpZiAoZHJ2LT5zdXNwZW5kKSB7CisJCQkJCXJldCA9IGRydi0+c3VzcGVuZChzeXNkZXYsIHN0YXRlKTsKKwkJCQkJaWYgKHJldCkKKwkJCQkJCWdvdG8gZ2JsX2RyaXZlcjsKKwkJCQl9CiAJCQl9CiAKIAkJCS8qIENhbGwgYXV4aWxsYXJ5IGRyaXZlcnMgbmV4dC4gKi8KIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJ2LCAmY2xzLT5kcml2ZXJzLCBlbnRyeSkgewotCQkJCWlmIChkcnYtPnN1c3BlbmQpCi0JCQkJCWRydi0+c3VzcGVuZChzeXNkZXYsIHN0YXRlKTsKKwkJCQlpZiAoZHJ2LT5zdXNwZW5kKSB7CisJCQkJCXJldCA9IGRydi0+c3VzcGVuZChzeXNkZXYsIHN0YXRlKTsKKwkJCQkJaWYgKHJldCkKKwkJCQkJCWdvdG8gYXV4X2RyaXZlcjsKKwkJCQl9CiAJCQl9CiAKIAkJCS8qIE5vdyBjYWxsIHRoZSBnZW5lcmljIG9uZSAqLwotCQkJaWYgKGNscy0+c3VzcGVuZCkKLQkJCQljbHMtPnN1c3BlbmQoc3lzZGV2LCBzdGF0ZSk7CisJCQlpZiAoY2xzLT5zdXNwZW5kKSB7CisJCQkJcmV0ID0gY2xzLT5zdXNwZW5kKHN5c2Rldiwgc3RhdGUpOworCQkJCWlmIChyZXQpCisJCQkJCWdvdG8gY2xzX2RyaXZlcjsKKwkJCX0KIAkJfQogCX0KIAlyZXR1cm4gMDsKKwkvKiByZXN1bWUgY3VycmVudCBzeXNkZXYgKi8KK2Nsc19kcml2ZXI6CisJZHJ2ID0gTlVMTDsKKwlwcmludGsoS0VSTl9FUlIgIkNsYXNzIHN1c3BlbmQgZmFpbGVkIGZvciAlc1xuIiwKKwkJa29iamVjdF9uYW1lKCZzeXNkZXYtPmtvYmopKTsKKworYXV4X2RyaXZlcjoKKwlpZiAoZHJ2KQorCQlwcmludGsoS0VSTl9FUlIgIkNsYXNzIGRyaXZlciBzdXNwZW5kIGZhaWxlZCBmb3IgJXNcbiIsCisJCQkJa29iamVjdF9uYW1lKCZzeXNkZXYtPmtvYmopKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVycl9kcnYsICZjbHMtPmRyaXZlcnMsIGVudHJ5KSB7CisJCWlmIChlcnJfZHJ2ID09IGRydikKKwkJCWJyZWFrOworCQlpZiAoZXJyX2Rydi0+cmVzdW1lKQorCQkJZXJyX2Rydi0+cmVzdW1lKHN5c2Rldik7CisJfQorCWRydiA9IE5VTEw7CisKK2dibF9kcml2ZXI6CisJaWYgKGRydikKKwkJcHJpbnRrKEtFUk5fRVJSICJzeXNkZXYgZHJpdmVyIHN1c3BlbmQgZmFpbGVkIGZvciAlc1xuIiwKKwkJCQlrb2JqZWN0X25hbWUoJnN5c2Rldi0+a29iaikpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZXJyX2RydiwgJnN5c2Rldl9kcml2ZXJzLCBlbnRyeSkgeworCQlpZiAoZXJyX2RydiA9PSBkcnYpCisJCQlicmVhazsKKwkJaWYgKGVycl9kcnYtPnJlc3VtZSkKKwkJCWVycl9kcnYtPnJlc3VtZShzeXNkZXYpOworCX0KKwkvKiByZXN1bWUgb3RoZXIgc3lzZGV2cyBpbiBjdXJyZW50IGNsYXNzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlcnJfZGV2LCAmY2xzLT5rc2V0Lmxpc3QsIGtvYmouZW50cnkpIHsKKwkJaWYgKGVycl9kZXYgPT0gc3lzZGV2KQorCQkJYnJlYWs7CisJCXByX2RlYnVnKCIgJXNcbiIsIGtvYmplY3RfbmFtZSgmZXJyX2Rldi0+a29iaikpOworCQlfX3N5c2Rldl9yZXN1bWUoZXJyX2Rldik7CisJfQorCisJLyogcmVzdW1lIG90aGVyIGNsYXNzZXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKGNscywgJnN5c3RlbV9zdWJzeXMua3NldC5saXN0LAorCQkJCQlrc2V0LmtvYmouZW50cnkpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlcnJfZGV2LCAmY2xzLT5rc2V0Lmxpc3QsIGtvYmouZW50cnkpIHsKKwkJCXByX2RlYnVnKCIgJXNcbiIsIGtvYmplY3RfbmFtZSgmZXJyX2Rldi0+a29iaikpOworCQkJX19zeXNkZXZfcmVzdW1lKGVycl9kZXYpOworCQl9CisJfQorCXJldHVybiByZXQ7CiB9CiAKIApAQCAtMzYyLDI1ICs0MzgsOSBAQAogCQkJIGtvYmplY3RfbmFtZSgmY2xzLT5rc2V0LmtvYmopKTsKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN5c2RldiwgJmNscy0+a3NldC5saXN0LCBrb2JqLmVudHJ5KSB7Ci0JCQlzdHJ1Y3Qgc3lzZGV2X2RyaXZlciAqIGRydjsKIAkJCXByX2RlYnVnKCIgJXNcbiIsIGtvYmplY3RfbmFtZSgmc3lzZGV2LT5rb2JqKSk7CiAKLQkJCS8qIEZpcnN0LCBjYWxsIHRoZSBjbGFzcy1zcGVjaWZpYyBvbmUgKi8KLQkJCWlmIChjbHMtPnJlc3VtZSkKLQkJCQljbHMtPnJlc3VtZShzeXNkZXYpOwotCi0JCQkvKiBDYWxsIGF1eGlsbGFyeSBkcml2ZXJzIG5leHQuICovCi0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRydiwgJmNscy0+ZHJpdmVycywgZW50cnkpIHsKLQkJCQlpZiAoZHJ2LT5yZXN1bWUpCi0JCQkJCWRydi0+cmVzdW1lKHN5c2Rldik7Ci0JCQl9Ci0KLQkJCS8qIENhbGwgZ2xvYmFsIGRyaXZlcnMuICovCi0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRydiwgJnN5c2Rldl9kcml2ZXJzLCBlbnRyeSkgewotCQkJCWlmIChkcnYtPnJlc3VtZSkKLQkJCQkJZHJ2LT5yZXN1bWUoc3lzZGV2KTsKLQkJCX0KLQorCQkJX19zeXNkZXZfcmVzdW1lKHN5c2Rldik7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvdHJhbnNwb3J0X2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvdHJhbnNwb3J0X2NsYXNzLmMKaW5kZXggNmMyYjQ0Ny4uZjI1ZTdjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3RyYW5zcG9ydF9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS90cmFuc3BvcnRfY2xhc3MuYwpAQCAtNyw3ICs3LDcgQEAKICAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciBHUEx2MgogICoKICAqIFRoZSBiYXNpYyBpZGVhIGhlcmUgaXMgdG8gYWxsb3cgYW55ICJkZXZpY2UgY29udHJvbGxlciIgKHdoaWNoCi0gKiB3b3VsZCBtb3N0IG9mdGVuIGJlIGEgSG9zdCBCdXMgQWRhcHRlciIgdG8gdXNlIHRoZSBzZXJ2aWNlcyBvZiBvbmUKKyAqIHdvdWxkIG1vc3Qgb2Z0ZW4gYmUgYSBIb3N0IEJ1cyBBZGFwdGVyIHRvIHVzZSB0aGUgc2VydmljZXMgb2Ygb25lCiAgKiBvciBtb3JlIHRyYW5wb3J0IGNsYXNzZXMgZm9yIHBlcmZvcm1pbmcgdHJhbnNwb3J0IHNwZWNpZmljCiAgKiBzZXJ2aWNlcy4gIFRyYW5zcG9ydCBzcGVjaWZpYyBzZXJ2aWNlcyBhcmUgdGhpbmdzIHRoYXQgdGhlIGdlbmVyaWMKICAqIGNvbW1hbmQgbGF5ZXIgZG9lc24ndCB3YW50IHRvIGtub3cgYWJvdXQgKHNwZWVkIHNldHRpbmdzLCBsaW5lCkBAIC02NCw3ICs2NCw5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3Rlcik7CiAKLXN0YXRpYyBpbnQgYW5vbl90cmFuc3BvcnRfZHVtbXlfZnVuY3Rpb24oc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBhbm9uX3RyYW5zcG9ydF9kdW1teV9mdW5jdGlvbihzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqdGMsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2KQogewogCS8qIGRvIG5vdGhpbmcgKi8KIAlyZXR1cm4gMDsKQEAgLTExNSw5ICsxMTcsMTAgQEAKIAkJCQkgICAgc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NkZXYpCiB7CiAJc3RydWN0IHRyYW5zcG9ydF9jbGFzcyAqdGNsYXNzID0gY2xhc3NfdG9fdHJhbnNwb3J0X2NsYXNzKGNvbnQtPmNsYXNzKTsKKwlzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqdGNvbnQgPSBhdHRyaWJ1dGVfY29udGFpbmVyX3RvX3RyYW5zcG9ydF9jb250YWluZXIoY29udCk7CiAKIAlpZiAodGNsYXNzLT5zZXR1cCkKLQkJdGNsYXNzLT5zZXR1cChkZXYpOworCQl0Y2xhc3MtPnNldHVwKHRjb250LCBkZXYsIGNsYXNzZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTc4LDEyICsxODEsMTQgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHRyYW5zcG9ydF9hZGRfZGV2aWNlKTsKIAogc3RhdGljIGludCB0cmFuc3BvcnRfY29uZmlndXJlKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250LAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNsYXNzX2RldmljZSAqY2RldikKIHsKIAlzdHJ1Y3QgdHJhbnNwb3J0X2NsYXNzICp0Y2xhc3MgPSBjbGFzc190b190cmFuc3BvcnRfY2xhc3MoY29udC0+Y2xhc3MpOworCXN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyICp0Y29udCA9IGF0dHJpYnV0ZV9jb250YWluZXJfdG9fdHJhbnNwb3J0X2NvbnRhaW5lcihjb250KTsKIAogCWlmICh0Y2xhc3MtPmNvbmZpZ3VyZSkKLQkJdGNsYXNzLT5jb25maWd1cmUoZGV2KTsKKwkJdGNsYXNzLT5jb25maWd1cmUodGNvbnQsIGRldiwgY2Rldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMiw3ICsyMDcsNyBAQAogICovCiB2b2lkIHRyYW5zcG9ydF9jb25maWd1cmVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlhdHRyaWJ1dGVfY29udGFpbmVyX3RyaWdnZXIoZGV2LCB0cmFuc3BvcnRfY29uZmlndXJlKTsKKwlhdHRyaWJ1dGVfY29udGFpbmVyX2RldmljZV90cmlnZ2VyKGRldiwgdHJhbnNwb3J0X2NvbmZpZ3VyZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0cmFuc3BvcnRfY29uZmlndXJlX2RldmljZSk7CiAKQEAgLTIxNSw3ICsyMjAsNyBAQAogCXN0cnVjdCB0cmFuc3BvcnRfY2xhc3MgKnRjbGFzcyA9IGNsYXNzX3RvX3RyYW5zcG9ydF9jbGFzcyhjb250LT5jbGFzcyk7CiAKIAlpZiAodGNsYXNzLT5yZW1vdmUpCi0JCXRjbGFzcy0+cmVtb3ZlKGRldik7CisJCXRjbGFzcy0+cmVtb3ZlKHRjb250LCBkZXYsIGNsYXNzZGV2KTsKIAogCWlmICh0Y2xhc3MtPnJlbW92ZSAhPSBhbm9uX3RyYW5zcG9ydF9kdW1teV9mdW5jdGlvbikgewogCQlpZiAodGNvbnQtPnN0YXRpc3RpY3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL0tjb25maWcgYi9kcml2ZXJzL2Jsb2NrL0tjb25maWcKaW5kZXggYjU5NDc2OC4uNTFiMGFmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmxvY2svS2NvbmZpZwpAQCAtNiw3ICs2LDcgQEAKIAogY29uZmlnIEJMS19ERVZfRkQKIAl0cmlzdGF0ZSAiTm9ybWFsIGZsb3BweSBkaXNrIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoIUFSQ0hfUzM5MCAmJiAhTTY4SyAmJiAhSUE2NCAmJiAhVU1MICYmICFBUk0pIHx8IFE0MCB8fCAoU1VOM1ggJiYgQlJPS0VOKSB8fCBBUkNIX1JQQyB8fCBBUkNIX0VCU0EyODUKKwlkZXBlbmRzIG9uIEFSQ0hfTUFZX0hBVkVfUENfRkRDCiAJLS0taGVscC0tLQogCSAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBmbG9wcHkgZGlzayBkcml2ZShzKSBvZiB5b3VyIFBDIHVuZGVyIExpbnV4LAogCSAgc2F5IFkuIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgZHJpdmVyLCBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgSUJNCkBAIC00MDgsNTQgKzQwOCwxMiBAQAogCSAgInJlYWwiIHJvb3QgZmlsZSBzeXN0ZW0sIGV0Yy4gU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vaW5pdHJkLnR4dD4KIAkgIGZvciBkZXRhaWxzLgogCi1jb25maWcgSU5JVFJBTUZTX1NPVVJDRQotCXN0cmluZyAiSW5pdHJhbWZzIHNvdXJjZSBmaWxlKHMpIgotCWRlZmF1bHQgIiIKLQloZWxwCi0JICBUaGlzIGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgY3BpbyBhcmNoaXZlIHdpdGggYSAuY3BpbyBzdWZmaXggb3IgYQotCSAgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGZvciBidWlsZGluZyB0aGUKLQkgIGluaXRyYW1mcyBpbWFnZS4gIEEgY3BpbyBhcmNoaXZlIHNob3VsZCBjb250YWluIGEgZmlsZXN5c3RlbSBhcmNoaXZlCi0JICB0byBiZSB1c2VkIGFzIGFuIGluaXRyYW1mcyBpbWFnZS4gIERpcmVjdG9yaWVzIHNob3VsZCBjb250YWluIGEKLQkgIGZpbGVzeXN0ZW0gbGF5b3V0IHRvIGJlIGluY2x1ZGVkIGluIHRoZSBpbml0cmFtZnMgaW1hZ2UuICBGaWxlcwotCSAgc2hvdWxkIGNvbnRhaW4gZW50cmllcyBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBkZXNjcmliZWQgYnkgdGhlCi0JICAidXNyL2dlbl9pbml0X2NwaW8iIHByb2dyYW0gaW4gdGhlIGtlcm5lbCB0cmVlLgotCi0JICBXaGVuIG11bHRpcGxlIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyBhcmUgc3BlY2lmaWVkIHRoZW4gdGhlCi0JICBpbml0cmFtZnMgaW1hZ2Ugd2lsbCBiZSB0aGUgYWdncmVnYXRlIG9mIGFsbCBvZiB0aGVtLgotCi0JICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9lYXJseS11c2Vyc3BhY2UvUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuCi0KLQkgIElmIHlvdSBhcmUgbm90IHN1cmUsIGxlYXZlIGl0IGJsYW5rLgotCi1jb25maWcgSU5JVFJBTUZTX1JPT1RfVUlECi0JaW50ICJVc2VyIElEIHRvIG1hcCB0byAwICh1c2VyIHJvb3QpIgotCWRlcGVuZHMgb24gSU5JVFJBTUZTX1NPVVJDRSE9IiIKLQlkZWZhdWx0ICIwIgotCWhlbHAKLQkgIFRoaXMgc2V0dGluZyBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIElOSVRSQU1GU19TT1VSQ0UgaXMKLQkgIGNvbnRhaW5zIGEgZGlyZWN0b3J5LiAgU2V0dGluZyB0aGlzIHVzZXIgSUQgKFVJRCkgdG8gc29tZXRoaW5nCi0JICBvdGhlciB0aGFuICIwIiB3aWxsIGNhdXNlIGFsbCBmaWxlcyBvd25lZCBieSB0aGF0IFVJRCB0byBiZQotCSAgb3duZWQgYnkgdXNlciByb290IGluIHRoZSBpbml0aWFsIHJhbWRpc2sgaW1hZ2UuCi0KLQkgIElmIHlvdSBhcmUgbm90IHN1cmUsIGxlYXZlIGl0IHNldCB0byAiMCIuCi0KLWNvbmZpZyBJTklUUkFNRlNfUk9PVF9HSUQKLQlpbnQgIkdyb3VwIElEIHRvIG1hcCB0byAwIChncm91cCByb290KSIKLQlkZXBlbmRzIG9uIElOSVRSQU1GU19TT1VSQ0UhPSIiCi0JZGVmYXVsdCAiMCIKLQloZWxwCi0JICBUaGlzIHNldHRpbmcgaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBJTklUUkFNRlNfU09VUkNFIGlzCi0JICBjb250YWlucyBhIGRpcmVjdG9yeS4gIFNldHRpbmcgdGhpcyBncm91cCBJRCAoR0lEKSB0byBzb21ldGhpbmcKLQkgIG90aGVyIHRoYW4gIjAiIHdpbGwgY2F1c2UgYWxsIGZpbGVzIG93bmVkIGJ5IHRoYXQgR0lEIHRvIGJlCi0JICBvd25lZCBieSBncm91cCByb290IGluIHRoZSBpbml0aWFsIHJhbWRpc2sgaW1hZ2UuCi0KLQkgIElmIHlvdSBhcmUgbm90IHN1cmUsIGxlYXZlIGl0IHNldCB0byAiMCIuCiAKICNYWFggLSBpdCBtYWtlcyBzZW5zZSB0byBlbmFibGUgdGhpcyBvbmx5IGZvciAzMi1iaXQgc3ViYXJjaCdzLCBub3QgZm9yIHg4Nl82NAogI2ZvciBpbnN0YW5jZS4KIGNvbmZpZyBMQkQKIAlib29sICJTdXBwb3J0IGZvciBMYXJnZSBCbG9jayBEZXZpY2VzIgotCWRlcGVuZHMgb24gWDg2IHx8IE1JUFMzMiB8fCBQUEMzMiB8fCBBUkNIX1MzOTBfMzEgfHwgU1VQRVJIIHx8IFVNTAorCWRlcGVuZHMgb24gWDg2IHx8IChNSVBTICYmIDMyQklUKSB8fCBQUEMzMiB8fCBBUkNIX1MzOTBfMzEgfHwgU1VQRVJIIHx8IFVNTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYXR0YWNoIGxhcmdlIChiaWdnZXIgdGhhbiAyVEIpIGRpc2NzIHRvCiAJICB5b3VyIG1hY2hpbmUsIG9yIGlmIHlvdSB3YW50IHRvIGhhdmUgYSByYWlkIG9yIGxvb3BiYWNrIGRldmljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hY3NpLmMgYi9kcml2ZXJzL2Jsb2NrL2Fjc2kuYwppbmRleCBjZTkzM2RlLi4wZTFmMzRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2Fjc2kuYworKysgYi9kcml2ZXJzL2Jsb2NrL2Fjc2kuYwpAQCAtMzcxLDcgKzM3MSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi1zdHJ1Y3QgdGltZXJfbGlzdCBhY3NpX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoYWNzaV90aW1lc19vdXQsIDAsIDApOworREVGSU5FX1RJTUVSKGFjc2lfdGltZXIsIGFjc2lfdGltZXNfb3V0LCAwLCAwKTsKIAogCiAjaWZkZWYgQ09ORklHX0FUQVJJX1NMTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hY3NpX3NsbS5jIGIvZHJpdmVycy9ibG9jay9hY3NpX3NsbS5jCmluZGV4IGUzYmU4YzMuLmE1YzFjOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYWNzaV9zbG0uYworKysgYi9kcml2ZXJzL2Jsb2NrL2Fjc2lfc2xtLmMKQEAgLTI2OCw3ICsyNjgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKiogRW5kIG9mIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHNsbV90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKHNsbV90ZXN0X3JlYWR5LCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoc2xtX3RpbWVyLCBzbG1fdGVzdF9yZWFkeSwgMCwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNsbV9mb3BzID0gewogCS5vd25lciA9CVRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hb2UvYW9lZGV2LmMgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VkZXYuYwppbmRleCA2ZTIzMWM1Li5kZWQzM2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VkZXYuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VkZXYuYwpAQCAtMzUsNyArMzUsNyBAQAogCXN0cnVjdCBhb2VkZXYgKmQ7CiAJc3RydWN0IGZyYW1lICpmLCAqZTsKIAotCWQgPSBrY2FsbG9jKDEsIHNpemVvZiAqZCwgR0ZQX0FUT01JQyk7CisJZCA9IGt6YWxsb2Moc2l6ZW9mICpkLCBHRlBfQVRPTUlDKTsKIAlpZiAoZCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlmID0ga2NhbGxvYyhuZnJhbWVzLCBzaXplb2YgKmYsIEdGUF9BVE9NSUMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hdGFmbG9wLmMgYi9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYwppbmRleCBkYjA1YTVhLi4yMmJkYTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYwpAQCAtMzcxLDE2ICszNzEsMTAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiogRW5kIG9mIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBtb3Rvcl9vZmZfdGltZXIgPQotCVRJTUVSX0lOSVRJQUxJWkVSKGZkX21vdG9yX29mZl90aW1lciwgMCwgMCk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcmVhZHRyYWNrX3RpbWVyID0KLQlUSU1FUl9JTklUSUFMSVpFUihmZF9yZWFkdHJhY2tfY2hlY2ssIDAsIDApOwotCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdGltZW91dF90aW1lciA9Ci0JVElNRVJfSU5JVElBTElaRVIoZmRfdGltZXNfb3V0LCAwLCAwKTsKLQotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGZkX3RpbWVyID0KLQlUSU1FUl9JTklUSUFMSVpFUihjaGVja19jaGFuZ2UsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihtb3Rvcl9vZmZfdGltZXIsIGZkX21vdG9yX29mZl90aW1lciwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHJlYWR0cmFja190aW1lciwgZmRfcmVhZHRyYWNrX2NoZWNrLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIodGltZW91dF90aW1lciwgZmRfdGltZXNfb3V0LCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoZmRfdGltZXIsIGNoZWNrX2NoYW5nZSwgMCwgMCk7CiAJCiBzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfbW90b3Jfb2ZmX3RpbWVyKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggNDE4YjE0Ni4uMjhmMmMxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtMTcxMywxMCArMTcxMyw5IEBACiAKIAlmb3IgKGkgPSAyMCAqIEhaOyBpID4gMDsgaS0tKSB7CiAJCWRvbmUgPSBoYmFbY3Rscl0tPmFjY2Vzcy5jb21tYW5kX2NvbXBsZXRlZChoYmFbY3Rscl0pOwotCQlpZiAoZG9uZSA9PSBGSUZPX0VNUFRZKSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCQl9IGVsc2UKKwkJaWYgKGRvbmUgPT0gRklGT19FTVBUWSkKKwkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOworCQllbHNlCiAJCQlyZXR1cm4gKGRvbmUpOwogCX0KIAkvKiBJbnZhbGlkIGFkZHJlc3MgdG8gdGVsbCBjYWxsZXIgd2UgcmFuIG91dCBvZiB0aW1lICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NyeXB0b2xvb3AuYyBiL2RyaXZlcnMvYmxvY2svY3J5cHRvbG9vcC5jCmluZGV4IDViZTZmOTkuLjNkNDI2MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY3J5cHRvbG9vcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svY3J5cHRvbG9vcC5jCkBAIC01Nyw5ICs1NywxMSBAQAogCW1vZGUgPSBzdHJzZXAoJmNtc3AsICItIik7CiAKIAlpZiAobW9kZSA9PSBOVUxMIHx8IHN0cmNtcChtb2RlLCAiY2JjIikgPT0gMCkKLQkJdGZtID0gY3J5cHRvX2FsbG9jX3RmbShjaXBoZXIsIENSWVBUT19URk1fTU9ERV9DQkMpOworCQl0Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKGNpcGhlciwgQ1JZUFRPX1RGTV9NT0RFX0NCQyB8CisJCQkJCSAgICAgICBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVApOwogCWVsc2UgaWYgKHN0cmNtcChtb2RlLCAiZWNiIikgPT0gMCkKLQkJdGZtID0gY3J5cHRvX2FsbG9jX3RmbShjaXBoZXIsIENSWVBUT19URk1fTU9ERV9FQ0IpOworCQl0Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKGNpcGhlciwgQ1JZUFRPX1RGTV9NT0RFX0VDQiB8CisJCQkJCSAgICAgICBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVApOwogCWlmICh0Zm0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jIGIvZHJpdmVycy9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKaW5kZXggZmY1MjAxZS4uNTJhM2FlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKKysrIGIvZHJpdmVycy9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKQEAgLTUwNywxOCArNTA3LDE1IEBACiAJY29uc3QgaW50IHJlYWRzID0gIWxpc3RfZW1wdHkoJmRkLT5maWZvX2xpc3RbUkVBRF0pOwogCWNvbnN0IGludCB3cml0ZXMgPSAhbGlzdF9lbXB0eSgmZGQtPmZpZm9fbGlzdFtXUklURV0pOwogCXN0cnVjdCBkZWFkbGluZV9ycSAqZHJxOwotCWludCBkYXRhX2Rpciwgb3RoZXJfZGlyOworCWludCBkYXRhX2RpcjsKIAogCS8qCiAJICogYmF0Y2hlcyBhcmUgY3VycmVudGx5IHJlYWRzIFhPUiB3cml0ZXMKIAkgKi8KLQlkcnEgPSBOVUxMOwotCi0JaWYgKGRkLT5uZXh0X2RycVtSRUFEXSkKLQkJZHJxID0gZGQtPm5leHRfZHJxW1JFQURdOwotCiAJaWYgKGRkLT5uZXh0X2RycVtXUklURV0pCiAJCWRycSA9IGRkLT5uZXh0X2RycVtXUklURV07CisJZWxzZQorCQlkcnEgPSBkZC0+bmV4dF9kcnFbUkVBRF07CiAKIAlpZiAoZHJxKSB7CiAJCS8qIHdlIGhhdmUgYSAibmV4dCByZXF1ZXN0IiAqLwpAQCAtNTQ0LDcgKzU0MSw2IEBACiAJCQlnb3RvIGRpc3BhdGNoX3dyaXRlczsKIAogCQlkYXRhX2RpciA9IFJFQUQ7Ci0JCW90aGVyX2RpciA9IFdSSVRFOwogCiAJCWdvdG8gZGlzcGF0Y2hfZmluZF9yZXF1ZXN0OwogCX0KQEAgLTU2MCw3ICs1NTYsNiBAQAogCQlkZC0+c3RhcnZlZCA9IDA7CiAKIAkJZGF0YV9kaXIgPSBXUklURTsKLQkJb3RoZXJfZGlyID0gUkVBRDsKIAogCQlnb3RvIGRpc3BhdGNoX2ZpbmRfcmVxdWVzdDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jIGIvZHJpdmVycy9ibG9jay9mbG9wcHkuYwppbmRleCBmMGMxMDg0Li4wMDg5NTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCisrKyBiL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKQEAgLTQ5Myw2ICs0OTMsOCBAQAogCiBzdGF0aWMgc2VjdG9yX3QgZmxvcHB5X3NpemVzWzI1Nl07CiAKK3N0YXRpYyBjaGFyIGZsb3BweV9kZXZpY2VfbmFtZVtdID0gImZsb3BweSI7CisKIC8qCiAgKiBUaGUgZHJpdmVyIGlzIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgbWVkaWEgZm9ybWF0CiAgKiB3aGlsZSBwcm9iaW5nIGlzIHNldC4gcndfaW50ZXJydXB0KCkgY2xlYXJzIGl0IGFmdGVyIGEKQEAgLTYyNiw3ICs2MjgsNyBAQAogI2VuZGlmIC8qIERFQlVHVCAqLwogCiB0eXBlZGVmIHZvaWQgKCp0aW1lb3V0X2ZuKSAodW5zaWduZWQgbG9uZyk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZmRfdGltZW91dCA9IFRJTUVSX0lOSVRJQUxJWkVSKGZsb3BweV9zaHV0ZG93biwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGZkX3RpbWVvdXQsIGZsb3BweV9zaHV0ZG93biwgMCwgMCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICp0aW1lb3V0X21lc3NhZ2U7CiAKQEAgLTEwMTAsNyArMTAxMiw3IEBACiAJc2NoZWR1bGVfd29yaygmZmxvcHB5X3dvcmspOwogfQogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZmRfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoZmRfdGltZXIsIE5VTEwsIDAsIDApOwogCiBzdGF0aWMgdm9pZCBjYW5jZWxfYWN0aXZpdHkodm9pZCkKIHsKQEAgLTQxOTEsMTggKzQxOTMsMjQgQEAKIAogc3RhdGljIGludCBoYXZlX25vX2ZkYyA9IC1FTk9ERVY7CiAKK3N0YXRpYyBzc2l6ZV90IGZsb3BweV9jbW9zX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcDsKKwlpbnQgZHJpdmU7CisKKwlwID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBsYXRmb3JtX2RldmljZSxkZXYpOworCWRyaXZlID0gcC0+aWQ7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJVhcbiIsIFVEUC0+Y21vcyk7Cit9CitERVZJQ0VfQVRUUihjbW9zLFNfSVJVR08sZmxvcHB5X2Ntb3Nfc2hvdyxOVUxMKTsKKwogc3RhdGljIHZvaWQgZmxvcHB5X2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAljb21wbGV0ZSgmZGV2aWNlX3JlbGVhc2UpOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBmbG9wcHlfZGV2aWNlID0gewotCS5uYW1lCQk9ICJmbG9wcHkiLAotCS5pZAkJPSAwLAotCS5kZXYJCT0gewotCQkJLnJlbGVhc2UgPSBmbG9wcHlfZGV2aWNlX3JlbGVhc2UsCi0JCQl9Ci19Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZmxvcHB5X2RldmljZVtOX0RSSVZFXTsKIAogc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpmbG9wcHlfZmluZChkZXZfdCBkZXYsIGludCAqcGFydCwgdm9pZCAqZGF0YSkKIHsKQEAgLTQzNzAsMjAgKzQzNzgsMjYgQEAKIAkJZ290byBvdXRfZmx1c2hfd29yazsKIAl9CiAKLQllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmZsb3BweV9kZXZpY2UpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2ZsdXNoX3dvcms7Ci0KIAlmb3IgKGRyaXZlID0gMDsgZHJpdmUgPCBOX0RSSVZFOyBkcml2ZSsrKSB7CiAJCWlmICghKGFsbG93ZWRfZHJpdmVfbWFzayAmICgxIDw8IGRyaXZlKSkpCiAJCQljb250aW51ZTsKIAkJaWYgKGZkY19zdGF0ZVtGREMoZHJpdmUpXS52ZXJzaW9uID09IEZEQ19OT05FKQogCQkJY29udGludWU7CisKKwkJZmxvcHB5X2RldmljZVtkcml2ZV0ubmFtZSA9IGZsb3BweV9kZXZpY2VfbmFtZTsKKwkJZmxvcHB5X2RldmljZVtkcml2ZV0uaWQgPSBkcml2ZTsKKwkJZmxvcHB5X2RldmljZVtkcml2ZV0uZGV2LnJlbGVhc2UgPSBmbG9wcHlfZGV2aWNlX3JlbGVhc2U7CisKKwkJZXJyID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZmbG9wcHlfZGV2aWNlW2RyaXZlXSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9mbHVzaF93b3JrOworCisJCWRldmljZV9jcmVhdGVfZmlsZSgmZmxvcHB5X2RldmljZVtkcml2ZV0uZGV2LCZkZXZfYXR0cl9jbW9zKTsKIAkJLyogdG8gYmUgY2xlYW5lZCB1cC4uLiAqLwogCQlkaXNrc1tkcml2ZV0tPnByaXZhdGVfZGF0YSA9ICh2b2lkICopKGxvbmcpZHJpdmU7CiAJCWRpc2tzW2RyaXZlXS0+cXVldWUgPSBmbG9wcHlfcXVldWU7CiAJCWRpc2tzW2RyaXZlXS0+ZmxhZ3MgfD0gR0VOSERfRkxfUkVNT1ZBQkxFOwotCQlkaXNrc1tkcml2ZV0tPmRyaXZlcmZzX2RldiA9ICZmbG9wcHlfZGV2aWNlLmRldjsKKwkJZGlza3NbZHJpdmVdLT5kcml2ZXJmc19kZXYgPSAmZmxvcHB5X2RldmljZVtkcml2ZV0uZGV2OwogCQlhZGRfZGlzayhkaXNrc1tkcml2ZV0pOwogCX0KIApAQCAtNDYwMywxMCArNDYxNywxMSBAQAogCQkgICAgZmRjX3N0YXRlW0ZEQyhkcml2ZSldLnZlcnNpb24gIT0gRkRDX05PTkUpIHsKIAkJCWRlbF9nZW5kaXNrKGRpc2tzW2RyaXZlXSk7CiAJCQl1bnJlZ2lzdGVyX2RldmZzX2VudHJpZXMoZHJpdmUpOworCQkJZGV2aWNlX3JlbW92ZV9maWxlKCZmbG9wcHlfZGV2aWNlW2RyaXZlXS5kZXYsICZkZXZfYXR0cl9jbW9zKTsKKwkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZmbG9wcHlfZGV2aWNlW2RyaXZlXSk7CiAJCX0KIAkJcHV0X2Rpc2soZGlza3NbZHJpdmVdKTsKIAl9Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmZsb3BweV9kZXZpY2UpOwogCWRldmZzX3JlbW92ZSgiZmxvcHB5Iik7CiAKIAlkZWxfdGltZXJfc3luYygmZmRfdGltZW91dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2dlbmhkLmMgYi9kcml2ZXJzL2Jsb2NrL2dlbmhkLmMKaW5kZXggNDdmZDM2NS4uZDQyODQwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9nZW5oZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svZ2VuaGQuYwpAQCAtNDUsNyArNDUsNyBAQAogCXN0cnVjdCBibGtfbWFqb3JfbmFtZSAqbjsKIAlpbnQgaSwgbGVuOwogCi0JbGVuID0gc3ByaW50ZihwLCAiXG5CbG9jayBkZXZpY2VzOlxuIik7CisJbGVuID0gc25wcmludGYocCwgKFBBR0VfU0laRS11c2VkKSwgIlxuQmxvY2sgZGV2aWNlczpcbiIpOwogCiAJZG93bigmYmxvY2tfc3Vic3lzX3NlbSk7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWFqb3JfbmFtZXMpOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbGxfcndfYmxrLmMgYi9kcml2ZXJzL2Jsb2NrL2xsX3J3X2Jsay5jCmluZGV4IDNjODE4NTQuLjQ4M2Q3MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbGxfcndfYmxrLmMKKysrIGIvZHJpdmVycy9ibG9jay9sbF9yd19ibGsuYwpAQCAtMjM1LDggKzIzNSw4IEBACiAJICogc2V0IGRlZmF1bHRzCiAJICovCiAJcS0+bnJfcmVxdWVzdHMgPSBCTEtERVZfTUFYX1JROwotCXEtPm1heF9waHlzX3NlZ21lbnRzID0gTUFYX1BIWVNfU0VHTUVOVFM7Ci0JcS0+bWF4X2h3X3NlZ21lbnRzID0gTUFYX0hXX1NFR01FTlRTOworCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxLCBNQVhfUEhZU19TRUdNRU5UUyk7CisJYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyhxLCBNQVhfSFdfU0VHTUVOVFMpOwogCXEtPm1ha2VfcmVxdWVzdF9mbiA9IG1mbjsKIAlxLT5iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzID0gKFZNX01BWF9SRUFEQUhFQUQgKiAxMDI0KSAvIFBBR0VfQ0FDSEVfU0laRTsKIAlxLT5iYWNraW5nX2Rldl9pbmZvLnN0YXRlID0gMDsKQEAgLTI4NCw2ICsyODQsNyBAQAogCXJxLT5zcGVjaWFsID0gTlVMTDsKIAlycS0+ZGF0YV9sZW4gPSAwOwogCXJxLT5kYXRhID0gTlVMTDsKKwlycS0+bnJfcGh5c19zZWdtZW50cyA9IDA7CiAJcnEtPnNlbnNlID0gTlVMTDsKIAlycS0+ZW5kX2lvID0gTlVMTDsKIAlycS0+ZW5kX2lvX2RhdGEgPSBOVUxMOwpAQCAtMjExNSw3ICsyMTE2LDcgQEAKIC8qKgogICogYmxrX3JxX21hcF91c2VyIC0gbWFwIHVzZXIgZGF0YSB0byBhIHJlcXVlc3QsIGZvciBSRVFfQkxPQ0tfUEMgdXNhZ2UKICAqIEBxOgkJcmVxdWVzdCBxdWV1ZSB3aGVyZSByZXF1ZXN0IHNob3VsZCBiZSBpbnNlcnRlZAotICogQHJ3OgkJUkVBRCBvciBXUklURSBkYXRhCisgKiBAcnE6CQlyZXF1ZXN0IHN0cnVjdHVyZSB0byBmaWxsCiAgKiBAdWJ1ZjoJdGhlIHVzZXIgYnVmZmVyCiAgKiBAbGVuOglsZW5ndGggb2YgdXNlciBkYXRhCiAgKgpAQCAtMjEzMiwyMSArMjEzMywxOSBAQAogICogICAgb3JpZ2luYWwgYmlvIG11c3QgYmUgcGFzc2VkIGJhY2sgaW4gdG8gYmxrX3JxX3VubWFwX3VzZXIoKSBmb3IgcHJvcGVyCiAgKiAgICB1bm1hcHBpbmcuCiAgKi8KLXN0cnVjdCByZXF1ZXN0ICpibGtfcnFfbWFwX3VzZXIocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcncsIHZvaWQgX191c2VyICp1YnVmLAotCQkJCXVuc2lnbmVkIGludCBsZW4pCitpbnQgYmxrX3JxX21hcF91c2VyKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCB2b2lkIF9fdXNlciAqdWJ1ZiwKKwkJICAgIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyB1YWRkcjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJc3RydWN0IGJpbyAqYmlvOworCWludCByZWFkaW5nOwogCiAJaWYgKGxlbiA+IChxLT5tYXhfc2VjdG9ycyA8PCA5KSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JaWYgKCghbGVuICYmIHVidWYpIHx8IChsZW4gJiYgIXVidWYpKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFsZW4gfHwgIXVidWYpCisJCXJldHVybiAtRUlOVkFMOwogCi0JcnEgPSBibGtfZ2V0X3JlcXVlc3QocSwgcncsIF9fR0ZQX1dBSVQpOwotCWlmICghcnEpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXJlYWRpbmcgPSBycV9kYXRhX2RpcihycSkgPT0gUkVBRDsKIAogCS8qCiAJICogaWYgYWxpZ25tZW50IHJlcXVpcmVtZW50IGlzIHNhdGlzZmllZCwgbWFwIGluIHVzZXIgcGFnZXMgZm9yCkBAIC0yMTU0LDkgKzIxNTMsOSBAQAogCSAqLwogCXVhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHVidWY7CiAJaWYgKCEodWFkZHIgJiBxdWV1ZV9kbWFfYWxpZ25tZW50KHEpKSAmJiAhKGxlbiAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkpKQotCQliaW8gPSBiaW9fbWFwX3VzZXIocSwgTlVMTCwgdWFkZHIsIGxlbiwgcncgPT0gUkVBRCk7CisJCWJpbyA9IGJpb19tYXBfdXNlcihxLCBOVUxMLCB1YWRkciwgbGVuLCByZWFkaW5nKTsKIAllbHNlCi0JCWJpbyA9IGJpb19jb3B5X3VzZXIocSwgdWFkZHIsIGxlbiwgcncgPT0gUkVBRCk7CisJCWJpbyA9IGJpb19jb3B5X3VzZXIocSwgdWFkZHIsIGxlbiwgcmVhZGluZyk7CiAKIAlpZiAoIUlTX0VSUihiaW8pKSB7CiAJCXJxLT5iaW8gPSBycS0+YmlvdGFpbCA9IGJpbzsKQEAgLTIxNjQsMjggKzIxNjMsNzAgQEAKIAogCQlycS0+YnVmZmVyID0gcnEtPmRhdGEgPSBOVUxMOwogCQlycS0+ZGF0YV9sZW4gPSBsZW47Ci0JCXJldHVybiBycTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJLyoKIAkgKiBiaW8gaXMgdGhlIGVyci1wdHIKIAkgKi8KLQlibGtfcHV0X3JlcXVlc3QocnEpOwotCXJldHVybiAoc3RydWN0IHJlcXVlc3QgKikgYmlvOworCXJldHVybiBQVFJfRVJSKGJpbyk7CiB9CiAKIEVYUE9SVF9TWU1CT0woYmxrX3JxX21hcF91c2VyKTsKIAogLyoqCisgKiBibGtfcnFfbWFwX3VzZXJfaW92IC0gbWFwIHVzZXIgZGF0YSB0byBhIHJlcXVlc3QsIGZvciBSRVFfQkxPQ0tfUEMgdXNhZ2UKKyAqIEBxOgkJcmVxdWVzdCBxdWV1ZSB3aGVyZSByZXF1ZXN0IHNob3VsZCBiZSBpbnNlcnRlZAorICogQHJxOgkJcmVxdWVzdCB0byBtYXAgZGF0YSB0bworICogQGlvdjoJcG9pbnRlciB0byB0aGUgaW92ZWMKKyAqIEBpb3ZfY291bnQ6CW51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW92ZWMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIERhdGEgd2lsbCBiZSBtYXBwZWQgZGlyZWN0bHkgZm9yIHplcm8gY29weSBpbywgaWYgcG9zc2libGUuIE90aGVyd2lzZQorICogICAgYSBrZXJuZWwgYm91bmNlIGJ1ZmZlciBpcyB1c2VkLgorICoKKyAqICAgIEEgbWF0Y2hpbmcgYmxrX3JxX3VubWFwX3VzZXIoKSBtdXN0IGJlIGlzc3VlZCBhdCB0aGUgZW5kIG9mIGlvLCB3aGlsZQorICogICAgc3RpbGwgaW4gcHJvY2VzcyBjb250ZXh0LgorICoKKyAqICAgIE5vdGU6IFRoZSBtYXBwZWQgYmlvIG1heSBuZWVkIHRvIGJlIGJvdW5jZWQgdGhyb3VnaCBibGtfcXVldWVfYm91bmNlKCkKKyAqICAgIGJlZm9yZSBiZWluZyBzdWJtaXR0ZWQgdG8gdGhlIGRldmljZSwgYXMgcGFnZXMgbWFwcGVkIG1heSBiZSBvdXQgb2YKKyAqICAgIHJlYWNoLiBJdCdzIHRoZSBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGlzIGhhcHBlbnMuIFRoZQorICogICAgb3JpZ2luYWwgYmlvIG11c3QgYmUgcGFzc2VkIGJhY2sgaW4gdG8gYmxrX3JxX3VubWFwX3VzZXIoKSBmb3IgcHJvcGVyCisgKiAgICB1bm1hcHBpbmcuCisgKi8KK2ludCBibGtfcnFfbWFwX3VzZXJfaW92KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAorCQkJc3RydWN0IHNnX2lvdmVjICppb3YsIGludCBpb3ZfY291bnQpCit7CisJc3RydWN0IGJpbyAqYmlvOworCisJaWYgKCFpb3YgfHwgaW92X2NvdW50IDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogd2UgZG9uJ3QgYWxsb3cgbWlzYWxpZ25lZCBkYXRhIGxpa2UgYmlvX21hcF91c2VyKCkgZG9lcy4gIElmIHRoZQorCSAqIHVzZXIgaXMgdXNpbmcgc2csIHRoZXkncmUgZXhwZWN0ZWQgdG8ga25vdyB0aGUgYWxpZ25tZW50IGNvbnN0cmFpbnRzCisJICogYW5kIHJlc3BlY3QgdGhlbSBhY2NvcmRpbmdseSAqLworCWJpbyA9IGJpb19tYXBfdXNlcl9pb3YocSwgTlVMTCwgaW92LCBpb3ZfY291bnQsIHJxX2RhdGFfZGlyKHJxKT09IFJFQUQpOworCWlmIChJU19FUlIoYmlvKSkKKwkJcmV0dXJuIFBUUl9FUlIoYmlvKTsKKworCXJxLT5iaW8gPSBycS0+YmlvdGFpbCA9IGJpbzsKKwlibGtfcnFfYmlvX3ByZXAocSwgcnEsIGJpbyk7CisJcnEtPmJ1ZmZlciA9IHJxLT5kYXRhID0gTlVMTDsKKwlycS0+ZGF0YV9sZW4gPSBiaW8tPmJpX3NpemU7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woYmxrX3JxX21hcF91c2VyX2lvdik7CisKKy8qKgogICogYmxrX3JxX3VubWFwX3VzZXIgLSB1bm1hcCBhIHJlcXVlc3Qgd2l0aCB1c2VyIGRhdGEKLSAqIEBycToJCXJlcXVlc3QgdG8gYmUgdW5tYXBwZWQKLSAqIEBiaW86CWJpbyBmb3IgdGhlIHJlcXVlc3QKKyAqIEBiaW86CWJpbyB0byBiZSB1bm1hcHBlZAogICogQHVsZW46CWxlbmd0aCBvZiB1c2VyIGJ1ZmZlcgogICoKICAqIERlc2NyaXB0aW9uOgotICogICAgVW5tYXAgYSByZXF1ZXN0IHByZXZpb3VzbHkgbWFwcGVkIGJ5IGJsa19ycV9tYXBfdXNlcigpLgorICogICAgVW5tYXAgYSBiaW8gcHJldmlvdXNseSBtYXBwZWQgYnkgYmxrX3JxX21hcF91c2VyKCkuCiAgKi8KLWludCBibGtfcnFfdW5tYXBfdXNlcihzdHJ1Y3QgcmVxdWVzdCAqcnEsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgaW50IHVsZW4pCitpbnQgYmxrX3JxX3VubWFwX3VzZXIoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgdWxlbikKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMjE5NiwzMSArMjIzNyw4OSBAQAogCQkJcmV0ID0gYmlvX3VuY29weV91c2VyKGJpbyk7CiAJfQogCi0JYmxrX3B1dF9yZXF1ZXN0KHJxKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBFWFBPUlRfU1lNQk9MKGJsa19ycV91bm1hcF91c2VyKTsKIAogLyoqCisgKiBibGtfcnFfbWFwX2tlcm4gLSBtYXAga2VybmVsIGRhdGEgdG8gYSByZXF1ZXN0LCBmb3IgUkVRX0JMT0NLX1BDIHVzYWdlCisgKiBAcToJCXJlcXVlc3QgcXVldWUgd2hlcmUgcmVxdWVzdCBzaG91bGQgYmUgaW5zZXJ0ZWQKKyAqIEBycToJCXJlcXVlc3QgdG8gZmlsbAorICogQGtidWY6CXRoZSBrZXJuZWwgYnVmZmVyCisgKiBAbGVuOglsZW5ndGggb2YgdXNlciBkYXRhCisgKiBAZ2ZwX21hc2s6CW1lbW9yeSBhbGxvY2F0aW9uIGZsYWdzCisgKi8KK2ludCBibGtfcnFfbWFwX2tlcm4ocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHZvaWQgKmtidWYsCisJCSAgICB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spCit7CisJc3RydWN0IGJpbyAqYmlvOworCisJaWYgKGxlbiA+IChxLT5tYXhfc2VjdG9ycyA8PCA5KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFsZW4gfHwgIWtidWYpCisJCXJldHVybiAtRUlOVkFMOworCisJYmlvID0gYmlvX21hcF9rZXJuKHEsIGtidWYsIGxlbiwgZ2ZwX21hc2spOworCWlmIChJU19FUlIoYmlvKSkKKwkJcmV0dXJuIFBUUl9FUlIoYmlvKTsKKworCWlmIChycV9kYXRhX2RpcihycSkgPT0gV1JJVEUpCisJCWJpby0+YmlfcncgfD0gKDEgPDwgQklPX1JXKTsKKworCXJxLT5iaW8gPSBycS0+YmlvdGFpbCA9IGJpbzsKKwlibGtfcnFfYmlvX3ByZXAocSwgcnEsIGJpbyk7CisKKwlycS0+YnVmZmVyID0gcnEtPmRhdGEgPSBOVUxMOworCXJxLT5kYXRhX2xlbiA9IGxlbjsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChibGtfcnFfbWFwX2tlcm4pOworCisvKioKKyAqIGJsa19leGVjdXRlX3JxX25vd2FpdCAtIGluc2VydCBhIHJlcXVlc3QgaW50byBxdWV1ZSBmb3IgZXhlY3V0aW9uCisgKiBAcToJCXF1ZXVlIHRvIGluc2VydCB0aGUgcmVxdWVzdCBpbgorICogQGJkX2Rpc2s6CW1hdGNoaW5nIGdlbmRpc2sKKyAqIEBycToJCXJlcXVlc3QgdG8gaW5zZXJ0CisgKiBAYXRfaGVhZDogICAgaW5zZXJ0IHJlcXVlc3QgYXQgaGVhZCBvciB0YWlsIG9mIHF1ZXVlCisgKiBAZG9uZToJSS9PIGNvbXBsZXRpb24gaGFuZGxlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgSW5zZXJ0IGEgZnVsbHkgcHJlcGFyZWQgcmVxdWVzdCBhdCB0aGUgYmFjayBvZiB0aGUgaW8gc2NoZWR1bGVyIHF1ZXVlCisgKiAgICBmb3IgZXhlY3V0aW9uLiAgRG9uJ3Qgd2FpdCBmb3IgY29tcGxldGlvbi4KKyAqLwordm9pZCBibGtfZXhlY3V0ZV9ycV9ub3dhaXQocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgZ2VuZGlzayAqYmRfZGlzaywKKwkJCSAgIHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGF0X2hlYWQsCisJCQkgICB2b2lkICgqZG9uZSkoc3RydWN0IHJlcXVlc3QgKikpCit7CisJaW50IHdoZXJlID0gYXRfaGVhZCA/IEVMRVZBVE9SX0lOU0VSVF9GUk9OVCA6IEVMRVZBVE9SX0lOU0VSVF9CQUNLOworCisJcnEtPnJxX2Rpc2sgPSBiZF9kaXNrOworCXJxLT5mbGFncyB8PSBSRVFfTk9NRVJHRTsKKwlycS0+ZW5kX2lvID0gZG9uZTsKKwllbHZfYWRkX3JlcXVlc3QocSwgcnEsIHdoZXJlLCAxKTsKKwlnZW5lcmljX3VucGx1Z19kZXZpY2UocSk7Cit9CisKKy8qKgogICogYmxrX2V4ZWN1dGVfcnEgLSBpbnNlcnQgYSByZXF1ZXN0IGludG8gcXVldWUgZm9yIGV4ZWN1dGlvbgogICogQHE6CQlxdWV1ZSB0byBpbnNlcnQgdGhlIHJlcXVlc3QgaW4KICAqIEBiZF9kaXNrOgltYXRjaGluZyBnZW5kaXNrCiAgKiBAcnE6CQlyZXF1ZXN0IHRvIGluc2VydAorICogQGF0X2hlYWQ6ICAgIGluc2VydCByZXF1ZXN0IGF0IGhlYWQgb3IgdGFpbCBvZiBxdWV1ZQogICoKICAqIERlc2NyaXB0aW9uOgogICogICAgSW5zZXJ0IGEgZnVsbHkgcHJlcGFyZWQgcmVxdWVzdCBhdCB0aGUgYmFjayBvZiB0aGUgaW8gc2NoZWR1bGVyIHF1ZXVlCi0gKiAgICBmb3IgZXhlY3V0aW9uLgorICogICAgZm9yIGV4ZWN1dGlvbiBhbmQgd2FpdCBmb3IgY29tcGxldGlvbi4KICAqLwogaW50IGJsa19leGVjdXRlX3JxKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGdlbmRpc2sgKmJkX2Rpc2ssCi0JCSAgIHN0cnVjdCByZXF1ZXN0ICpycSkKKwkJICAgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgYXRfaGVhZCkKIHsKIAlERUNMQVJFX0NPTVBMRVRJT04od2FpdCk7CiAJY2hhciBzZW5zZVtTQ1NJX1NFTlNFX0JVRkZFUlNJWkVdOwogCWludCBlcnIgPSAwOwogCi0JcnEtPnJxX2Rpc2sgPSBiZF9kaXNrOwotCiAJLyoKIAkgKiB3ZSBuZWVkIGFuIGV4dHJhIHJlZmVyZW5jZSB0byB0aGUgcmVxdWVzdCwgc28gd2UgY2FuIGxvb2sgYXQKIAkgKiBpdCBhZnRlciBpbyBjb21wbGV0aW9uCkBAIC0yMjMzLDExICsyMzMyLDggQEAKIAkJcnEtPnNlbnNlX2xlbiA9IDA7CiAJfQogCi0JcnEtPmZsYWdzIHw9IFJFUV9OT01FUkdFOwogCXJxLT53YWl0aW5nID0gJndhaXQ7Ci0JcnEtPmVuZF9pbyA9IGJsa19lbmRfc3luY19ycTsKLQllbHZfYWRkX3JlcXVlc3QocSwgcnEsIEVMRVZBVE9SX0lOU0VSVF9CQUNLLCAxKTsKLQlnZW5lcmljX3VucGx1Z19kZXZpY2UocSk7CisJYmxrX2V4ZWN1dGVfcnFfbm93YWl0KHEsIGJkX2Rpc2ssIHJxLCBhdF9oZWFkLCBibGtfZW5kX3N5bmNfcnEpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwogCXJxLT53YWl0aW5nID0gTlVMTDsKIApAQCAtMjI3Nyw2ICsyMzczLDQ0IEBACiAKIEVYUE9SVF9TWU1CT0woYmxrZGV2X2lzc3VlX2ZsdXNoKTsKIAorLyoqCisgKiBibGtkZXZfc2NzaV9pc3N1ZV9mbHVzaF9mbiAtIGlzc3VlIGZsdXNoIGZvciBTQ1NJIGRldmljZXMKKyAqIEBxOgkJZGV2aWNlIHF1ZXVlCisgKiBAZGlzazoJZ2VuZGlzaworICogQGVycm9yX3NlY3RvcjoJZXJyb3Igb2Zmc2V0CisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBEZXZpY2VzIHVuZGVyc3RhbmRpbmcgdGhlIFNDU0kgY29tbWFuZCBzZXQsIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiBhcworICogICAgYSBoZWxwZXIgZm9yIGlzc3VpbmcgYSBjYWNoZSBmbHVzaC4gTm90ZTogZHJpdmVyIGlzIHJlcXVpcmVkIHRvIHN0b3JlCisgKiAgICB0aGUgZXJyb3Igb2Zmc2V0IChpbiBjYXNlIG9mIGVycm9yIGZsdXNoaW5nKSBpbiAtPnNlY3RvciBvZiBzdHJ1Y3QKKyAqICAgIHJlcXVlc3QuCisgKi8KK2ludCBibGtkZXZfc2NzaV9pc3N1ZV9mbHVzaF9mbihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAorCQkJICAgICAgIHNlY3Rvcl90ICplcnJvcl9zZWN0b3IpCit7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gYmxrX2dldF9yZXF1ZXN0KHEsIFdSSVRFLCBfX0dGUF9XQUlUKTsKKwlpbnQgcmV0OworCisJcnEtPmZsYWdzIHw9IFJFUV9CTE9DS19QQyB8IFJFUV9TT0ZUQkFSUklFUjsKKwlycS0+c2VjdG9yID0gMDsKKwltZW1zZXQocnEtPmNtZCwgMCwgc2l6ZW9mKHJxLT5jbWQpKTsKKwlycS0+Y21kWzBdID0gMHgzNTsKKwlycS0+Y21kX2xlbiA9IDEyOworCXJxLT5kYXRhID0gTlVMTDsKKwlycS0+ZGF0YV9sZW4gPSAwOworCXJxLT50aW1lb3V0ID0gNjAgKiBIWjsKKworCXJldCA9IGJsa19leGVjdXRlX3JxKHEsIGRpc2ssIHJxLCAwKTsKKworCWlmIChyZXQgJiYgZXJyb3Jfc2VjdG9yKQorCQkqZXJyb3Jfc2VjdG9yID0gcnEtPnNlY3RvcjsKKworCWJsa19wdXRfcmVxdWVzdChycSk7CisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChibGtkZXZfc2NzaV9pc3N1ZV9mbHVzaF9mbik7CisKIHN0YXRpYyB2b2lkIGRyaXZlX3N0YXRfYWNjdChzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBucl9zZWN0b3JzLCBpbnQgbmV3X2lvKQogewogCWludCBydyA9IHJxX2RhdGFfZGlyKHJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BjZC5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGNkLmMKaW5kZXggNzI4OWY2Ny4uYWM1YmE0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGNkLmMKKysrIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGNkLmMKQEAgLTUxNiw4ICs1MTYsNyBAQAogCiBzdGF0aWMgdm9pZCBwY2Rfc2xlZXAoaW50IGNzKQogewotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCXNjaGVkdWxlX3RpbWVvdXQoY3MpOworCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShjcyk7CiB9CiAKIHN0YXRpYyBpbnQgcGNkX3Jlc2V0KHN0cnVjdCBwY2RfdW5pdCAqY2QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZi5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGYuYwppbmRleCAwNjBiMWYyLi43MTFkMmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZi5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BmLmMKQEAgLTUwNyw4ICs1MDcsNyBAQAogCiBzdGF0aWMgdm9pZCBwZl9zbGVlcChpbnQgY3MpCiB7Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0Jc2NoZWR1bGVfdGltZW91dChjcyk7CisJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGNzKTsKIH0KIAogLyogdGhlIEFUQVBJIHN0YW5kYXJkIGFjdHVhbGx5IHNwZWNpZmllcyB0aGUgY29udGVudHMgb2YgYWxsIDcgcmVnaXN0ZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZy5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGcuYwppbmRleCA4NGQ4ZTI5Li5iMzk4MjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZy5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BnLmMKQEAgLTI3Niw4ICsyNzYsNyBAQAogCiBzdGF0aWMgdm9pZCBwZ19zbGVlcChpbnQgY3MpCiB7Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0Jc2NoZWR1bGVfdGltZW91dChjcyk7CisJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGNzKTsKIH0KIAogc3RhdGljIGludCBwZ193YWl0KHN0cnVjdCBwZyAqZGV2LCBpbnQgZ28sIGludCBzdG9wLCB1bnNpZ25lZCBsb25nIHRtbywgY2hhciAqbXNnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcHQuYyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3B0LmMKaW5kZXggNWZlOGVlOC4uZDhkMzUyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcHQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wdC5jCkBAIC0zODMsOCArMzgzLDcgQEAKIAogc3RhdGljIHZvaWQgcHRfc2xlZXAoaW50IGNzKQogewotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCXNjaGVkdWxlX3RpbWVvdXQoY3MpOworCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShjcyk7CiB9CiAKIHN0YXRpYyBpbnQgcHRfcG9sbF9kc2Moc3RydWN0IHB0X3VuaXQgKnRhcGUsIGludCBwYXVzZSwgaW50IHRtbywgY2hhciAqbXNnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wczJlc2RpLmMgYi9kcml2ZXJzL2Jsb2NrL3BzMmVzZGkuYwppbmRleCAyOTU0ODc4Li4yOWQxNTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BzMmVzZGkuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BzMmVzZGkuYwpAQCAtOTksOCArOTksNyBAQAogc3RhdGljIGludCBub19pbnRfeWV0Owogc3RhdGljIGludCBwczJlc2RpX2RyaXZlczsKIHN0YXRpYyB1X3Nob3J0IGlvX2Jhc2U7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZXNkaV90aW1lciA9Ci0JCVRJTUVSX0lOSVRJQUxJWkVSKHBzMmVzZGlfcmVzZXRfdGltZXIsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihlc2RpX3RpbWVyLCBwczJlc2RpX3Jlc2V0X3RpbWVyLCAwLCAwKTsKIHN0YXRpYyBpbnQgcmVzZXRfc3RhdHVzOwogc3RhdGljIGludCBwczJlc2RpX3Nsb3QgPSAtMTsKIHN0YXRpYyBpbnQgdHA3MjBlc2RpID0gMDsJLyogSXMgaXQgSW50ZWdyYXRlZCBFU0RJIG9mIFRoaW5rUGFkLTcyMD8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svc2NzaV9pb2N0bC5jIGIvZHJpdmVycy9ibG9jay9zY3NpX2lvY3RsLmMKaW5kZXggNjgxODcxYy4uYWJiMmRmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9zY3NpX2lvY3RsLmMKKysrIGIvZHJpdmVycy9ibG9jay9zY3NpX2lvY3RsLmMKQEAgLTIxNiw3ICsyMTYsNyBAQAogCQlzdHJ1Y3QgZ2VuZGlzayAqYmRfZGlzaywgc3RydWN0IHNnX2lvX2hkciAqaGRyKQogewogCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKLQlpbnQgcmVhZGluZywgd3JpdGluZzsKKwlpbnQgd3JpdGluZyA9IDAsIHJldCA9IDA7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCXN0cnVjdCBiaW8gKmJpbzsKIAljaGFyIHNlbnNlW1NDU0lfU0VOU0VfQlVGRkVSU0laRV07CkBAIC0yMzEsMzggKzIzMSw0OCBAQAogCWlmICh2ZXJpZnlfY29tbWFuZChmaWxlLCBjbWQpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JLyoKLQkgKiB3ZSdsbCBkbyB0aGF0IGxhdGVyCi0JICovCi0JaWYgKGhkci0+aW92ZWNfY291bnQpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQogCWlmIChoZHItPmR4ZmVyX2xlbiA+IChxLT5tYXhfc2VjdG9ycyA8PCA5KSkKIAkJcmV0dXJuIC1FSU87CiAKLQlyZWFkaW5nID0gd3JpdGluZyA9IDA7Ci0JaWYgKGhkci0+ZHhmZXJfbGVuKSB7CisJaWYgKGhkci0+ZHhmZXJfbGVuKQogCQlzd2l0Y2ggKGhkci0+ZHhmZXJfZGlyZWN0aW9uKSB7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJY2FzZSBTR19EWEZFUl9UT19GUk9NX0RFVjoKLQkJCXJlYWRpbmcgPSAxOwotCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCWNhc2UgU0dfRFhGRVJfVE9fREVWOgogCQkJd3JpdGluZyA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSBTR19EWEZFUl9GUk9NX0RFVjoKLQkJCXJlYWRpbmcgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAotCQlycSA9IGJsa19ycV9tYXBfdXNlcihxLCB3cml0aW5nID8gV1JJVEUgOiBSRUFELCBoZHItPmR4ZmVycCwKLQkJCQkgICAgIGhkci0+ZHhmZXJfbGVuKTsKKwlycSA9IGJsa19nZXRfcmVxdWVzdChxLCB3cml0aW5nID8gV1JJVEUgOiBSRUFELCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJxKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCQlpZiAoSVNfRVJSKHJxKSkKLQkJCXJldHVybiBQVFJfRVJSKHJxKTsKLQl9IGVsc2UKLQkJcnEgPSBibGtfZ2V0X3JlcXVlc3QocSwgUkVBRCwgX19HRlBfV0FJVCk7CisJaWYgKGhkci0+aW92ZWNfY291bnQpIHsKKwkJY29uc3QgaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IHNnX2lvdmVjKSAqIGhkci0+aW92ZWNfY291bnQ7CisJCXN0cnVjdCBzZ19pb3ZlYyAqaW92OworCisJCWlvdiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW92KSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoaW92LCBoZHItPmR4ZmVycCwgc2l6ZSkpIHsKKwkJCWtmcmVlKGlvdik7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBibGtfcnFfbWFwX3VzZXJfaW92KHEsIHJxLCBpb3YsIGhkci0+aW92ZWNfY291bnQpOworCQlrZnJlZShpb3YpOworCX0gZWxzZSBpZiAoaGRyLT5keGZlcl9sZW4pCisJCXJldCA9IGJsa19ycV9tYXBfdXNlcihxLCBycSwgaGRyLT5keGZlcnAsIGhkci0+ZHhmZXJfbGVuKTsKKworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCiAJLyoKIAkgKiBmaWxsIGluIHJlcXVlc3Qgc3RydWN0dXJlCkBAIC0yOTgsNyArMzA4LDcgQEAKIAkgKiAoaWYgaGUgZG9lc24ndCBjaGVjayB0aGF0IGlzIGhpcyBwcm9ibGVtKS4KIAkgKiBOLkIuIGEgbm9uLXplcm8gU0NTSSBzdGF0dXMgaXMgX25vdF8gbmVjZXNzYXJpbHkgYW4gZXJyb3IuCiAJICovCi0JYmxrX2V4ZWN1dGVfcnEocSwgYmRfZGlzaywgcnEpOworCWJsa19leGVjdXRlX3JxKHEsIGJkX2Rpc2ssIHJxLCAwKTsKIAogCS8qIHdyaXRlIHRvIGFsbCBvdXRwdXQgbWVtYmVycyAqLwogCWhkci0+c3RhdHVzID0gMHhmZiAmIHJxLT5lcnJvcnM7CkBAIC0zMjAsMTIgKzMzMCwxNCBAQAogCQkJaGRyLT5zYl9sZW5fd3IgPSBsZW47CiAJfQogCi0JaWYgKGJsa19ycV91bm1hcF91c2VyKHJxLCBiaW8sIGhkci0+ZHhmZXJfbGVuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGJsa19ycV91bm1hcF91c2VyKGJpbywgaGRyLT5keGZlcl9sZW4pKQorCQlyZXQgPSAtRUZBVUxUOwogCiAJLyogbWF5IG5vdCBoYXZlIHN1Y2NlZWRlZCwgYnV0IG91dHB1dCB2YWx1ZXMgd3JpdHRlbiB0byBjb250cm9sCiAJICogc3RydWN0dXJlIChzdHJ1Y3Qgc2dfaW9faGRyKS4gICovCi0JcmV0dXJuIDA7CitvdXQ6CisJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKKwlyZXR1cm4gcmV0OwogfQogCiAjZGVmaW5lIE9NQVhfU0JfTEVOIDE2ICAgICAgICAgIC8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCkBAIC00MDgsNyArNDIwLDcgQEAKIAlycS0+ZGF0YV9sZW4gPSBieXRlczsKIAlycS0+ZmxhZ3MgfD0gUkVRX0JMT0NLX1BDOwogCi0JYmxrX2V4ZWN1dGVfcnEocSwgYmRfZGlzaywgcnEpOworCWJsa19leGVjdXRlX3JxKHEsIGJkX2Rpc2ssIHJxLCAwKTsKIAllcnIgPSBycS0+ZXJyb3JzICYgMHhmZjsJLyogb25seSA4IGJpdCBTQ1NJIHN0YXR1cyAqLwogCWlmIChlcnIpIHsKIAkJaWYgKHJxLT5zZW5zZV9sZW4gJiYgcnEtPnNlbnNlKSB7CkBAIC01NjEsNyArNTczLDcgQEAKIAkJCXJxLT5jbWRbMF0gPSBHUENNRF9TVEFSVF9TVE9QX1VOSVQ7CiAJCQlycS0+Y21kWzRdID0gMHgwMiArIChjbG9zZSAhPSAwKTsKIAkJCXJxLT5jbWRfbGVuID0gNjsKLQkJCWVyciA9IGJsa19leGVjdXRlX3JxKHEsIGJkX2Rpc2ssIHJxKTsKKwkJCWVyciA9IGJsa19leGVjdXRlX3JxKHEsIGJkX2Rpc2ssIHJxLCAwKTsKIAkJCWJsa19wdXRfcmVxdWVzdChycSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svc3dpbTMuYyBiL2RyaXZlcnMvYmxvY2svc3dpbTMuYwppbmRleCBlNWY3NDk0Li5lNDI1YWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMKKysrIGIvZHJpdmVycy9ibG9jay9zd2ltMy5jCkBAIC04MzQsOCArODM0LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJCXN3aW0zX3NlbGVjdChmcywgUkVMQVgpOwotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwogCQlpZiAoc3dpbTNfcmVhZGJpdChmcywgRElTS19JTikgPT0gMCkKIAkJCWJyZWFrOwogCX0KQEAgLTkwNiw4ICs5MDUsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJc3dpbTNfc2VsZWN0KGZzLCBSRUxBWCk7Ci0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CiAJCX0KIAkJaWYgKGVyciA9PSAwICYmIChzd2ltM19yZWFkYml0KGZzLCBTRUVLX0NPTVBMRVRFKSA9PSAwCiAJCQkJIHx8IHN3aW0zX3JlYWRiaXQoZnMsIERJU0tfSU4pID09IDApKQpAQCAtOTkyLDggKzk5MCw3IEBACiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwogCQlzd2ltM19zZWxlY3QoZnMsIFJFTEFYKTsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAl9CiAJcmV0ID0gc3dpbTNfcmVhZGJpdChmcywgU0VFS19DT01QTEVURSkgPT0gMAogCQl8fCBzd2ltM19yZWFkYml0KGZzLCBESVNLX0lOKSA9PSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zd2ltX2lvcC5jIGIvZHJpdmVycy9ibG9jay9zd2ltX2lvcC5jCmluZGV4IGExMjgzZjYuLjg5ZTNjMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svc3dpbV9pb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL3N3aW1faW9wLmMKQEAgLTMzOCw4ICszMzgsNyBAQAogCQkJZXJyID0gLUVJTlRSOwogCQkJYnJlYWs7CiAJCX0KLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAl9CiAJcmVsZWFzZV9kcml2ZShmcyk7CiAJcmV0dXJuIGNtZC0+ZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3ViLmMgYi9kcml2ZXJzL2Jsb2NrL3ViLmMKaW5kZXggYTAyNjU2Ny4uYWEwYmY3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay91Yi5jCisrKyBiL2RyaXZlcnMvYmxvY2svdWIuYwpAQCAtMTYsOSArMTYsMTAgQEAKICAqICAtLSB2ZXJpZnkgdGhlIDEzIGNvbmRpdGlvbnMgYW5kIGRvIGJ1bGsgcmVzZXRzCiAgKiAgLS0ga2lsbCBsYXN0X3BpcGUgYW5kIHNpbXBseSBkbyB0d28tc3RhdGUgY2xlYXJpbmcgb24gYm90aCBwaXBlcwogICogIC0tIHZlcmlmeSBwcm90b2NvbCAoYnVsaykgZnJvbSBVU0IgZGVzY3JpcHRvcnMgKG1heWJlLi4uKQotICogIC0tIGhpZ2htZW0gYW5kIHNnCisgKiAgLS0gaGlnaG1lbQogICogIC0tIG1vdmUgdG9wX3NlbnNlIGFuZCB3b3JrX2JjcyBpbnRvIHNlcGFyYXRlIGFsbG9jYXRpb25zIChpZiB0aGV5IHN1cnZpdmUpCiAgKiAgICAgZm9yIGNhY2hlIHB1cmlzdHMgYW5kIGVzb3RlcmljIGFyY2hpdGVjdHVyZXMuCisgKiAgLS0gQWxsb2NhdGUgc3RydWN0dXJlIGZvciBMVU4gMCBiZWZvcmUgdGhlIGZpcnN0IHViX3N5bmNfdHVyLCBhdm9pZCBOVUxMLiA/CiAgKiAgLS0gcHJ1bmUgY29tbWVudHMsIHRoZXkgYXJlIHRvbyB2b2x1bW5vdXMKICAqICAtLSBFeHRlcm1pbmF0ZSBQMyBwcmludGtzCiAgKiAgLS0gUmVzb3ZlIFhYWCdzCkBAIC0xNzEsNyArMTcyLDcgQEAKICAqLwogc3RydWN0IHViX2RldjsKIAotI2RlZmluZSBVQl9NQVhfUkVRX1NHCTEKKyNkZWZpbmUgVUJfTUFYX1JFUV9TRwk0CiAjZGVmaW5lIFVCX01BWF9TRUNUT1JTIDY0CiAKIC8qCkBAIC0yMzQsMTMgKzIzNSwxMCBAQAogCiAJaW50IHN0YXRfY291bnQ7CQkJLyogUmV0cmllcyBnZXR0aW5nIHN0YXR1cy4gKi8KIAotCS8qCi0JICogV2UgZG8gbm90IHN1cHBvcnQgdHJhbnNmZXJzIGZyb20gaGlnaG1lbSBwYWdlcwotCSAqIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgVVNCIGZyYW1ld29yayBkb2VzIG5vdCBkbyB3aGF0IHdlIG5lZWQuCi0JICovCi0JY2hhciAqZGF0YTsJCQkvKiBSZXF1ZXN0ZWQgYnVmZmVyICovCiAJdW5zaWduZWQgaW50IGxlbjsJCS8qIFJlcXVlc3RlZCBsZW5ndGggKi8KLQkvLyBzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2d2W1VCX01BWF9SRVFfU0ddOworCXVuc2lnbmVkIGludCBjdXJyZW50X3NnOworCXVuc2lnbmVkIGludCBuc2c7CQkvKiBzZ3ZbbnNnXSAqLworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ3ZbVUJfTUFYX1JFUV9TR107CiAKIAlzdHJ1Y3QgdWJfbHVuICpsdW47CiAJdm9pZCAoKmRvbmUpKHN0cnVjdCB1Yl9kZXYgKiwgc3RydWN0IHViX3Njc2lfY21kICopOwpAQCAtMzg5LDE3ICszODcsMTggQEAKIAlzdHJ1Y3QgYnVsa19jc193cmFwIHdvcmtfYmNzOwogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3Qgd29ya19jcjsKIAorCWludCBzZ19zdGF0W1VCX01BWF9SRVFfU0crMV07CiAJc3RydWN0IHViX3Njc2lfdHJhY2UgdHI7CiB9OwogCiAvKgogICovCiBzdGF0aWMgdm9pZCB1Yl9jbGVhbnVwKHN0cnVjdCB1Yl9kZXYgKnNjKTsKLXN0YXRpYyBpbnQgdWJfYmRfcnFfZm5fMShzdHJ1Y3QgdWJfbHVuICpsdW4sIHN0cnVjdCByZXF1ZXN0ICpycSk7CitzdGF0aWMgaW50IHViX3JlcXVlc3RfZm5fMShzdHJ1Y3QgdWJfbHVuICpsdW4sIHN0cnVjdCByZXF1ZXN0ICpycSk7CiBzdGF0aWMgaW50IHViX2NtZF9idWlsZF9ibG9jayhzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX2x1biAqbHVuLAogICAgIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpOwotc3RhdGljIGludCB1Yl9jbWRfYnVpbGRfcGFja2V0KHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCwKLSAgICBzdHJ1Y3QgcmVxdWVzdCAqcnEpOworc3RhdGljIGludCB1Yl9jbWRfYnVpbGRfcGFja2V0KHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfbHVuICpsdW4sCisgICAgc3RydWN0IHViX3Njc2lfY21kICpjbWQsIHN0cnVjdCByZXF1ZXN0ICpycSk7CiBzdGF0aWMgdm9pZCB1Yl9yd19jbWRfZG9uZShzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpOwogc3RhdGljIHZvaWQgdWJfZW5kX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IHVwdG9kYXRlKTsKIHN0YXRpYyBpbnQgdWJfc3VibWl0X3Njc2koc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKTsKQEAgLTQwNyw2ICs0MDYsNyBAQAogc3RhdGljIHZvaWQgdWJfc2NzaV9hY3Rpb24odW5zaWduZWQgbG9uZyBfZGV2KTsKIHN0YXRpYyB2b2lkIHViX3Njc2lfZGlzcGF0Y2goc3RydWN0IHViX2RldiAqc2MpOwogc3RhdGljIHZvaWQgdWJfc2NzaV91cmJfY29tcGwoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKTsKK3N0YXRpYyB2b2lkIHViX2RhdGFfc3RhcnQoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKTsKIHN0YXRpYyB2b2lkIHViX3N0YXRlX2RvbmUoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kLCBpbnQgcmMpOwogc3RhdGljIGludCBfX3ViX3N0YXRlX3N0YXQoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKTsKIHN0YXRpYyB2b2lkIHViX3N0YXRlX3N0YXQoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKTsKQEAgLTUwMCw3ICs1MDAsOCBAQAogCX0KIH0KIAotc3RhdGljIHNzaXplX3QgdWJfZGlhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnBhZ2UpCitzdGF0aWMgc3NpemVfdCB1Yl9kaWFnX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICBjaGFyICpwYWdlKQogewogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwogCXN0cnVjdCB1Yl9kZXYgKnNjOwpAQCAtNTIzLDYgKzUyNCwxMyBAQAogCWNudCArPSBzcHJpbnRmKHBhZ2UgKyBjbnQsCiAJICAgICJxbGVuICVkIHFtYXggJWRcbiIsCiAJICAgIHNjLT5jbWRfcXVldWUucWxlbiwgc2MtPmNtZF9xdWV1ZS5xbWF4KTsKKwljbnQgKz0gc3ByaW50ZihwYWdlICsgY250LAorCSAgICAic2cgJWQgJWQgJWQgJWQgJWRcbiIsCisJICAgIHNjLT5zZ19zdGF0WzBdLAorCSAgICBzYy0+c2dfc3RhdFsxXSwKKwkgICAgc2MtPnNnX3N0YXRbMl0sCisJICAgIHNjLT5zZ19zdGF0WzNdLAorCSAgICBzYy0+c2dfc3RhdFs0XSk7CiAKIAlsaXN0X2Zvcl9lYWNoIChwLCAmc2MtPmx1bnMpIHsKIAkJbHVuID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgdWJfbHVuLCBsaW5rKTsKQEAgLTc0NCwyMCArNzUyLDIwIEBACiAgKiBUaGUgcmVxdWVzdCBmdW5jdGlvbiBpcyBvdXIgbWFpbiBlbnRyeSBwb2ludAogICovCiAKLXN0YXRpYyB2b2lkIHViX2JkX3JxX2ZuKHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyB2b2lkIHViX3JlcXVlc3RfZm4ocmVxdWVzdF9xdWV1ZV90ICpxKQogewogCXN0cnVjdCB1Yl9sdW4gKmx1biA9IHEtPnF1ZXVlZGF0YTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAKIAl3aGlsZSAoKHJxID0gZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkgewotCQlpZiAodWJfYmRfcnFfZm5fMShsdW4sIHJxKSAhPSAwKSB7CisJCWlmICh1Yl9yZXF1ZXN0X2ZuXzEobHVuLCBycSkgIT0gMCkgewogCQkJYmxrX3N0b3BfcXVldWUocSk7CiAJCQlicmVhazsKIAkJfQogCX0KIH0KIAotc3RhdGljIGludCB1Yl9iZF9ycV9mbl8xKHN0cnVjdCB1Yl9sdW4gKmx1biwgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RhdGljIGludCB1Yl9yZXF1ZXN0X2ZuXzEoc3RydWN0IHViX2x1biAqbHVuLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc3RydWN0IHViX2RldiAqc2MgPSBsdW4tPnVkZXY7CiAJc3RydWN0IHViX3Njc2lfY21kICpjbWQ7CkBAIC03NzQsOSArNzgyLDggQEAKIAltZW1zZXQoY21kLCAwLCBzaXplb2Yoc3RydWN0IHViX3Njc2lfY21kKSk7CiAKIAlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJxKTsKLQogCWlmIChibGtfcGNfcmVxdWVzdChycSkpIHsKLQkJcmMgPSB1Yl9jbWRfYnVpbGRfcGFja2V0KHNjLCBjbWQsIHJxKTsKKwkJcmMgPSB1Yl9jbWRfYnVpbGRfcGFja2V0KHNjLCBsdW4sIGNtZCwgcnEpOwogCX0gZWxzZSB7CiAJCXJjID0gdWJfY21kX2J1aWxkX2Jsb2NrKHNjLCBsdW4sIGNtZCwgcnEpOwogCX0KQEAgLTc5MSw3ICs3OTgsNyBAQAogCWNtZC0+YmFjayA9IHJxOwogCiAJY21kLT50YWcgPSBzYy0+dGFnY250Kys7Ci0JaWYgKChyYyA9IHViX3N1Ym1pdF9zY3NpKHNjLCBjbWQpKSAhPSAwKSB7CisJaWYgKHViX3N1Ym1pdF9zY3NpKHNjLCBjbWQpICE9IDApIHsKIAkJdWJfcHV0X2NtZChsdW4sIGNtZCk7CiAJCXViX2VuZF9ycShycSwgMCk7CiAJCXJldHVybiAwOwpAQCAtODA0LDU4ICs4MTEsMzEgQEAKICAgICBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCWludCB1Yl9kaXI7Ci0jaWYgMCAvKiBXZSB1c2UgcnEtPmJ1ZmZlciBmb3Igbm93ICovCi0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAlpbnQgbl9lbGVtOwotI2VuZGlmCiAJdW5zaWduZWQgaW50IGJsb2NrLCBuYmxrczsKIAogCWlmIChycV9kYXRhX2RpcihycSkgPT0gV1JJVEUpCiAJCXViX2RpciA9IFVCX0RJUl9XUklURTsKIAllbHNlCiAJCXViX2RpciA9IFVCX0RJUl9SRUFEOworCWNtZC0+ZGlyID0gdWJfZGlyOwogCiAJLyoKIAkgKiBnZXQgc2NhdHRlcmxpc3QgZnJvbSBibG9jayBsYXllcgogCSAqLwotI2lmIDAgLyogV2UgdXNlIHJxLT5idWZmZXIgZm9yIG5vdyAqLwotCXNnID0gJmNtZC0+c2d2WzBdOwotCW5fZWxlbSA9IGJsa19ycV9tYXBfc2cocSwgcnEsIHNnKTsKKwluX2VsZW0gPSBibGtfcnFfbWFwX3NnKGx1bi0+ZGlzay0+cXVldWUsIHJxLCAmY21kLT5zZ3ZbMF0pOwogCWlmIChuX2VsZW0gPD0gMCkgewotCQl1Yl9wdXRfY21kKGx1biwgY21kKTsKLQkJdWJfZW5kX3JxKHJxLCAwKTsKLQkJYmxrX3N0YXJ0X3F1ZXVlKHEpOwotCQlyZXR1cm4gMDsJCS8qIHJlcXVlc3Qgd2l0aCBubyBzL2cgZW50cmllcz8gKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZhaWxlZCByZXF1ZXN0IG1hcCAoJWQpXG4iLAorCQkgICAgc2MtPm5hbWUsIG5fZWxlbSk7IC8qIFAzICovCisJCXJldHVybiAtMTsJCS8qIHJlcXVlc3Qgd2l0aCBubyBzL2cgZW50cmllcz8gKi8KIAl9Ci0KLQlpZiAobl9lbGVtICE9IDEpIHsJCS8qIFBhcmFub2lhICovCisJaWYgKG5fZWxlbSA+IFVCX01BWF9SRVFfU0cpIHsJLyogUGFyYW5vaWEgKi8KIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlcXVlc3Qgd2l0aCAlZCBzZWdtZW50c1xuIiwKIAkJICAgIHNjLT5uYW1lLCBuX2VsZW0pOwotCQl1Yl9wdXRfY21kKGx1biwgY21kKTsKLQkJdWJfZW5kX3JxKHJxLCAwKTsKLQkJYmxrX3N0YXJ0X3F1ZXVlKHEpOwotCQlyZXR1cm4gMDsKLQl9Ci0jZW5kaWYKLQotCS8qCi0JICogWFhYIFVuZm9ydHVuYXRlbHksIHRoaXMgY2hlY2sgZG9lcyBub3Qgd29yay4gSXQgaXMgcXVpdGUgcG9zc2libGUKLQkgKiB0byBnZXQgYm9ndXMgbm9uLW51bGwgcnEtPmJ1ZmZlciBpZiB5b3UgYWxsb3cgc2cgYnkgbWlzdGFrZS4KLQkgKi8KLQlpZiAocnEtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIFRoaXMgbXVzdCBub3QgaGFwcGVuIGlmIHdlIHNldCB0aGUgcXVldWUgcmlnaHQuCi0JCSAqIFRoZSBibG9jayBsZXZlbCBtdXN0IGNyZWF0ZSBib3VuY2UgYnVmZmVycyBmb3IgdXMuCi0JCSAqLwotCQlzdGF0aWMgaW50IGRvX3ByaW50ID0gMTsKLQkJaWYgKGRvX3ByaW50KSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5tYXBwZWQgYmxvY2sgcmVxdWVzdCIKLQkJCSAgICAiIGZsYWdzIDB4JWx4IHNlY3RvcnMgJWx1XG4iLAotCQkJICAgIHNjLT5uYW1lLCBycS0+ZmxhZ3MsIHJxLT5ucl9zZWN0b3JzKTsKLQkJCWRvX3ByaW50ID0gMDsKLQkJfQogCQlyZXR1cm4gLTE7CiAJfQorCWNtZC0+bnNnID0gbl9lbGVtOworCXNjLT5zZ19zdGF0W25fZWxlbV0rKzsKIAogCS8qCiAJICogYnVpbGQgdGhlIGNvbW1hbmQKQEAgLTg3NiwzMCArODU2LDE1IEBACiAJY21kLT5jZGJbOF0gPSBuYmxrczsKIAljbWQtPmNkYl9sZW4gPSAxMDsKIAotCWNtZC0+ZGlyID0gdWJfZGlyOwotCWNtZC0+ZGF0YSA9IHJxLT5idWZmZXI7CiAJY21kLT5sZW4gPSBycS0+bnJfc2VjdG9ycyAqIDUxMjsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHViX2NtZF9idWlsZF9wYWNrZXQoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kLAotICAgIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyBpbnQgdWJfY21kX2J1aWxkX3BhY2tldChzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX2x1biAqbHVuLAorICAgIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0KLQlpZiAocnEtPmRhdGFfbGVuICE9IDAgJiYgcnEtPmRhdGEgPT0gTlVMTCkgewotCQlzdGF0aWMgaW50IGRvX3ByaW50ID0gMTsKLQkJaWYgKGRvX3ByaW50KSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5tYXBwZWQgcGFja2V0IHJlcXVlc3QiCi0JCQkgICAgIiBmbGFncyAweCVseCBsZW5ndGggJWRcbiIsCi0JCQkgICAgc2MtPm5hbWUsIHJxLT5mbGFncywgcnEtPmRhdGFfbGVuKTsKLQkJCWRvX3ByaW50ID0gMDsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbWVtY3B5KCZjbWQtPmNkYiwgcnEtPmNtZCwgcnEtPmNtZF9sZW4pOwotCWNtZC0+Y2RiX2xlbiA9IHJxLT5jbWRfbGVuOworCWludCBuX2VsZW07CiAKIAlpZiAocnEtPmRhdGFfbGVuID09IDApIHsKIAkJY21kLT5kaXIgPSBVQl9ESVJfTk9ORTsKQEAgLTkwOCw4ICs4NzMsMjkgQEAKIAkJCWNtZC0+ZGlyID0gVUJfRElSX1dSSVRFOwogCQllbHNlCiAJCQljbWQtPmRpciA9IFVCX0RJUl9SRUFEOworCiAJfQotCWNtZC0+ZGF0YSA9IHJxLT5kYXRhOworCisJLyoKKwkgKiBnZXQgc2NhdHRlcmxpc3QgZnJvbSBibG9jayBsYXllcgorCSAqLworCW5fZWxlbSA9IGJsa19ycV9tYXBfc2cobHVuLT5kaXNrLT5xdWV1ZSwgcnEsICZjbWQtPnNndlswXSk7CisJaWYgKG5fZWxlbSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZhaWxlZCByZXF1ZXN0IG1hcCAoJWQpXG4iLAorCQkgICAgc2MtPm5hbWUsIG5fZWxlbSk7IC8qIFAzICovCisJCXJldHVybiAtMTsKKwl9CisJaWYgKG5fZWxlbSA+IFVCX01BWF9SRVFfU0cpIHsJLyogUGFyYW5vaWEgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlcXVlc3Qgd2l0aCAlZCBzZWdtZW50c1xuIiwKKwkJICAgIHNjLT5uYW1lLCBuX2VsZW0pOworCQlyZXR1cm4gLTE7CisJfQorCWNtZC0+bnNnID0gbl9lbGVtOworCXNjLT5zZ19zdGF0W25fZWxlbV0rKzsKKworCW1lbWNweSgmY21kLT5jZGIsIHJxLT5jbWQsIHJxLT5jbWRfbGVuKTsKKwljbWQtPmNkYl9sZW4gPSBycS0+Y21kX2xlbjsKKwogCWNtZC0+bGVuID0gcnEtPmRhdGFfbGVuOwogCiAJcmV0dXJuIDA7CkBAIC05MTksMjQgKzkwNSwzNCBAQAogewogCXN0cnVjdCByZXF1ZXN0ICpycSA9IGNtZC0+YmFjazsKIAlzdHJ1Y3QgdWJfbHVuICpsdW4gPSBjbWQtPmx1bjsKLQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGx1bi0+ZGlzazsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBkaXNrLT5xdWV1ZTsKIAlpbnQgdXB0b2RhdGU7CiAKLQlpZiAoYmxrX3BjX3JlcXVlc3QocnEpKSB7Ci0JCS8qIFVCX1NFTlNFX1NJWkUgaXMgc21hbGxlciB0aGFuIFNDU0lfU0VOU0VfQlVGRkVSU0laRSAqLwotCQltZW1jcHkocnEtPnNlbnNlLCBzYy0+dG9wX3NlbnNlLCBVQl9TRU5TRV9TSVpFKTsKLQkJcnEtPnNlbnNlX2xlbiA9IFVCX1NFTlNFX1NJWkU7Ci0JfQotCi0JaWYgKGNtZC0+ZXJyb3IgPT0gMCkKKwlpZiAoY21kLT5lcnJvciA9PSAwKSB7CiAJCXVwdG9kYXRlID0gMTsKLQllbHNlCisKKwkJaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkgeworCQkJaWYgKGNtZC0+YWN0X2xlbiA+PSBycS0+ZGF0YV9sZW4pCisJCQkJcnEtPmRhdGFfbGVuID0gMDsKKwkJCWVsc2UKKwkJCQlycS0+ZGF0YV9sZW4gLT0gY21kLT5hY3RfbGVuOworCQl9CisJfSBlbHNlIHsKIAkJdXB0b2RhdGUgPSAwOwogCisJCWlmIChibGtfcGNfcmVxdWVzdChycSkpIHsKKwkJCS8qIFVCX1NFTlNFX1NJWkUgaXMgc21hbGxlciB0aGFuIFNDU0lfU0VOU0VfQlVGRkVSU0laRSAqLworCQkJbWVtY3B5KHJxLT5zZW5zZSwgc2MtPnRvcF9zZW5zZSwgVUJfU0VOU0VfU0laRSk7CisJCQlycS0+c2Vuc2VfbGVuID0gVUJfU0VOU0VfU0laRTsKKwkJCWlmIChzYy0+dG9wX3NlbnNlWzBdICE9IDApCisJCQkJcnEtPmVycm9ycyA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJCWVsc2UKKwkJCQlycS0+ZXJyb3JzID0gRElEX0VSUk9SIDw8IDE2OworCQl9CisJfQorCiAJdWJfcHV0X2NtZChsdW4sIGNtZCk7CiAJdWJfZW5kX3JxKHJxLCB1cHRvZGF0ZSk7Ci0JYmxrX3N0YXJ0X3F1ZXVlKHEpOworCWJsa19zdGFydF9xdWV1ZShsdW4tPmRpc2stPnF1ZXVlKTsKIH0KIAogc3RhdGljIHZvaWQgdWJfZW5kX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IHVwdG9kYXRlKQpAQCAtMTAxNCw3ICsxMDEwLDcgQEAKIAlzYy0+bGFzdF9waXBlID0gc2MtPnNlbmRfYnVsa19waXBlOwogCXVzYl9maWxsX2J1bGtfdXJiKCZzYy0+d29ya191cmIsIHNjLT5kZXYsIHNjLT5zZW5kX2J1bGtfcGlwZSwKIAkgICAgYmNiLCBVU19CVUxLX0NCX1dSQVBfTEVOLCB1Yl91cmJfY29tcGxldGUsIHNjKTsKLQlzYy0+d29ya191cmIudHJhbnNmZXJfZmxhZ3MgPSBVUkJfQVNZTkNfVU5MSU5LOworCXNjLT53b3JrX3VyYi50cmFuc2Zlcl9mbGFncyA9IDA7CiAKIAkvKiBGaWxsIHdoYXQgd2Ugc2hvdWxkbid0IGJlIGZpbGxpbmcsIGJlY2F1c2UgdXNiLXN0b3JhZ2UgZGlkIHNvLiAqLwogCXNjLT53b3JrX3VyYi5hY3R1YWxfbGVuZ3RoID0gMDsKQEAgLTExMDMsNyArMTA5OSw2IEBACiB7CiAJc3RydWN0IHVyYiAqdXJiID0gJnNjLT53b3JrX3VyYjsKIAlzdHJ1Y3QgYnVsa19jc193cmFwICpiY3M7Ci0JaW50IHBpcGU7CiAJaW50IHJjOwogCiAJaWYgKGF0b21pY19yZWFkKCZzYy0+cG9pc29uKSkgewpAQCAtMTIwNCwzOCArMTE5OSwxMyBAQAogCQkJZ290byBCYWRfRW5kOwogCQl9CiAKLQkJaWYgKGNtZC0+ZGlyID09IFVCX0RJUl9OT05FKSB7CisJCWlmIChjbWQtPmRpciA9PSBVQl9ESVJfTk9ORSB8fCBjbWQtPm5zZyA8IDEpIHsKIAkJCXViX3N0YXRlX3N0YXQoc2MsIGNtZCk7CiAJCQlyZXR1cm47CiAJCX0KIAotCQlVQl9JTklUX0NPTVBMRVRJT04oc2MtPndvcmtfZG9uZSk7Ci0KLQkJaWYgKGNtZC0+ZGlyID09IFVCX0RJUl9SRUFEKQotCQkJcGlwZSA9IHNjLT5yZWN2X2J1bGtfcGlwZTsKLQkJZWxzZQotCQkJcGlwZSA9IHNjLT5zZW5kX2J1bGtfcGlwZTsKLQkJc2MtPmxhc3RfcGlwZSA9IHBpcGU7Ci0JCXVzYl9maWxsX2J1bGtfdXJiKCZzYy0+d29ya191cmIsIHNjLT5kZXYsIHBpcGUsCi0JCSAgICBjbWQtPmRhdGEsIGNtZC0+bGVuLCB1Yl91cmJfY29tcGxldGUsIHNjKTsKLQkJc2MtPndvcmtfdXJiLnRyYW5zZmVyX2ZsYWdzID0gVVJCX0FTWU5DX1VOTElOSzsKLQkJc2MtPndvcmtfdXJiLmFjdHVhbF9sZW5ndGggPSAwOwotCQlzYy0+d29ya191cmIuZXJyb3JfY291bnQgPSAwOwotCQlzYy0+d29ya191cmIuc3RhdHVzID0gMDsKLQotCQlpZiAoKHJjID0gdXNiX3N1Ym1pdF91cmIoJnNjLT53b3JrX3VyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJCS8qIFhYWCBDbGVhciBzdGFsbHMgKi8KLQkJCXByaW50aygidWI6IGRhdGEgIyVkIHN1Ym1pdCBmYWlsZWQgKCVkKVxuIiwgY21kLT50YWcsIHJjKTsgLyogUDMgKi8KLQkJCXViX2NvbXBsZXRlKCZzYy0+d29ya19kb25lKTsKLQkJCXViX3N0YXRlX2RvbmUoc2MsIGNtZCwgcmMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2MtPndvcmtfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBVQl9EQVRBX1RJTUVPVVQ7Ci0JCWFkZF90aW1lcigmc2MtPndvcmtfdGltZXIpOwotCi0JCWNtZC0+c3RhdGUgPSBVQl9DTURTVF9EQVRBOwotCQl1Yl9jbWR0cl9zdGF0ZShzYywgY21kKTsKKwkJLy8gdWRlbGF5KDEyNSk7CQkvLyB1c2Itc3RvcmFnZSBoYXMgdGhpcworCQl1Yl9kYXRhX3N0YXJ0KHNjLCBjbWQpOwogCiAJfSBlbHNlIGlmIChjbWQtPnN0YXRlID09IFVCX0NNRFNUX0RBVEEpIHsKIAkJaWYgKHVyYi0+c3RhdHVzID09IC1FUElQRSkgewpAQCAtMTI1NywxNiArMTIyNywyMiBAQAogCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVPVkVSRkxPVykgewogCQkJLyoKIAkJCSAqIEEgYmFiYmxlPyBGYWlsdXJlLCBidXQgd2UgbXVzdCB0cmFuc2ZlciBDU1cgbm93LgorCQkJICogWFhYIFRoaXMgaXMgZ29pbmcgdG8gZW5kIGluIHBlcnBldHVhbCBiYWJibGUuIFJlc2V0LgogCQkJICovCiAJCQljbWQtPmVycm9yID0gLUVPVkVSRkxPVzsJLyogQSBjaGVhcCB0cmljay4uLiAqLwotCQl9IGVsc2UgewotCQkJaWYgKHVyYi0+c3RhdHVzICE9IDApCi0JCQkJZ290byBCYWRfRW5kOworCQkJdWJfc3RhdGVfc3RhdChzYywgY21kKTsKKwkJCXJldHVybjsKIAkJfQorCQlpZiAodXJiLT5zdGF0dXMgIT0gMCkKKwkJCWdvdG8gQmFkX0VuZDsKIAotCQljbWQtPmFjdF9sZW4gPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJCWNtZC0+YWN0X2xlbiArPSB1cmItPmFjdHVhbF9sZW5ndGg7CiAJCXViX2NtZHRyX2FjdF9sZW4oc2MsIGNtZCk7CiAKKwkJaWYgKCsrY21kLT5jdXJyZW50X3NnIDwgY21kLT5uc2cpIHsKKwkJCXViX2RhdGFfc3RhcnQoc2MsIGNtZCk7CisJCQlyZXR1cm47CisJCX0KIAkJdWJfc3RhdGVfc3RhdChzYywgY21kKTsKIAogCX0gZWxzZSBpZiAoY21kLT5zdGF0ZSA9PSBVQl9DTURTVF9TVEFUKSB7CkBAIC0xNDAxLDYgKzEzNzcsNDYgQEAKIAogLyoKICAqIEZhY3Rvcml6YXRpb24gaGVscGVyIGZvciB0aGUgY29tbWFuZCBzdGF0ZSBtYWNoaW5lOgorICogSW5pdGlhdGUgYSBkYXRhIHNlZ21lbnQgdHJhbnNmZXIuCisgKi8KK3N0YXRpYyB2b2lkIHViX2RhdGFfc3RhcnQoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmY21kLT5zZ3ZbY21kLT5jdXJyZW50X3NnXTsKKwlpbnQgcGlwZTsKKwlpbnQgcmM7CisKKwlVQl9JTklUX0NPTVBMRVRJT04oc2MtPndvcmtfZG9uZSk7CisKKwlpZiAoY21kLT5kaXIgPT0gVUJfRElSX1JFQUQpCisJCXBpcGUgPSBzYy0+cmVjdl9idWxrX3BpcGU7CisJZWxzZQorCQlwaXBlID0gc2MtPnNlbmRfYnVsa19waXBlOworCXNjLT5sYXN0X3BpcGUgPSBwaXBlOworCXVzYl9maWxsX2J1bGtfdXJiKCZzYy0+d29ya191cmIsIHNjLT5kZXYsIHBpcGUsCisJICAgIHBhZ2VfYWRkcmVzcyhzZy0+cGFnZSkgKyBzZy0+b2Zmc2V0LCBzZy0+bGVuZ3RoLAorCSAgICB1Yl91cmJfY29tcGxldGUsIHNjKTsKKwlzYy0+d29ya191cmIudHJhbnNmZXJfZmxhZ3MgPSAwOworCXNjLT53b3JrX3VyYi5hY3R1YWxfbGVuZ3RoID0gMDsKKwlzYy0+d29ya191cmIuZXJyb3JfY291bnQgPSAwOworCXNjLT53b3JrX3VyYi5zdGF0dXMgPSAwOworCisJaWYgKChyYyA9IHVzYl9zdWJtaXRfdXJiKCZzYy0+d29ya191cmIsIEdGUF9BVE9NSUMpKSAhPSAwKSB7CisJCS8qIFhYWCBDbGVhciBzdGFsbHMgKi8KKwkJcHJpbnRrKCJ1YjogZGF0YSAjJWQgc3VibWl0IGZhaWxlZCAoJWQpXG4iLCBjbWQtPnRhZywgcmMpOyAvKiBQMyAqLworCQl1Yl9jb21wbGV0ZSgmc2MtPndvcmtfZG9uZSk7CisJCXViX3N0YXRlX2RvbmUoc2MsIGNtZCwgcmMpOworCQlyZXR1cm47CisJfQorCisJc2MtPndvcmtfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBVQl9EQVRBX1RJTUVPVVQ7CisJYWRkX3RpbWVyKCZzYy0+d29ya190aW1lcik7CisKKwljbWQtPnN0YXRlID0gVUJfQ01EU1RfREFUQTsKKwl1Yl9jbWR0cl9zdGF0ZShzYywgY21kKTsKK30KKworLyoKKyAqIEZhY3Rvcml6YXRpb24gaGVscGVyIGZvciB0aGUgY29tbWFuZCBzdGF0ZSBtYWNoaW5lOgogICogRmluaXNoIHRoZSBjb21tYW5kLgogICovCiBzdGF0aWMgdm9pZCB1Yl9zdGF0ZV9kb25lKHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCwgaW50IHJjKQpAQCAtMTQyNiw3ICsxNDQyLDcgQEAKIAlzYy0+bGFzdF9waXBlID0gc2MtPnJlY3ZfYnVsa19waXBlOwogCXVzYl9maWxsX2J1bGtfdXJiKCZzYy0+d29ya191cmIsIHNjLT5kZXYsIHNjLT5yZWN2X2J1bGtfcGlwZSwKIAkgICAgJnNjLT53b3JrX2JjcywgVVNfQlVMS19DU19XUkFQX0xFTiwgdWJfdXJiX2NvbXBsZXRlLCBzYyk7Ci0Jc2MtPndvcmtfdXJiLnRyYW5zZmVyX2ZsYWdzID0gVVJCX0FTWU5DX1VOTElOSzsKKwlzYy0+d29ya191cmIudHJhbnNmZXJfZmxhZ3MgPSAwOwogCXNjLT53b3JrX3VyYi5hY3R1YWxfbGVuZ3RoID0gMDsKIAlzYy0+d29ya191cmIuZXJyb3JfY291bnQgPSAwOwogCXNjLT53b3JrX3VyYi5zdGF0dXMgPSAwOwpAQCAtMTQ4NCw2ICsxNTAwLDcgQEAKIHN0YXRpYyB2b2lkIHViX3N0YXRlX3NlbnNlKHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCkKIHsKIAlzdHJ1Y3QgdWJfc2NzaV9jbWQgKnNjbWQ7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAlpbnQgcmM7CiAKIAlpZiAoY21kLT5jZGJbMF0gPT0gUkVRVUVTVF9TRU5TRSkgewpAQCAtMTQ5MiwxMiArMTUwOSwxNyBAQAogCX0KIAogCXNjbWQgPSAmc2MtPnRvcF9ycXNfY21kOworCW1lbXNldChzY21kLCAwLCBzaXplb2Yoc3RydWN0IHViX3Njc2lfY21kKSk7CiAJc2NtZC0+Y2RiWzBdID0gUkVRVUVTVF9TRU5TRTsKIAlzY21kLT5jZGJbNF0gPSBVQl9TRU5TRV9TSVpFOwogCXNjbWQtPmNkYl9sZW4gPSA2OwogCXNjbWQtPmRpciA9IFVCX0RJUl9SRUFEOwogCXNjbWQtPnN0YXRlID0gVUJfQ01EU1RfSU5JVDsKLQlzY21kLT5kYXRhID0gc2MtPnRvcF9zZW5zZTsKKwlzY21kLT5uc2cgPSAxOworCXNnID0gJnNjbWQtPnNndlswXTsKKwlzZy0+cGFnZSA9IHZpcnRfdG9fcGFnZShzYy0+dG9wX3NlbnNlKTsKKwlzZy0+b2Zmc2V0ID0gKHVuc2lnbmVkIGludClzYy0+dG9wX3NlbnNlICYgKFBBR0VfU0laRS0xKTsKKwlzZy0+bGVuZ3RoID0gVUJfU0VOU0VfU0laRTsKIAlzY21kLT5sZW4gPSBVQl9TRU5TRV9TSVpFOwogCXNjbWQtPmx1biA9IGNtZC0+bHVuOwogCXNjbWQtPmRvbmUgPSB1Yl90b3Bfc2Vuc2VfZG9uZTsKQEAgLTE1NDEsNyArMTU2Myw3IEBACiAKIAl1c2JfZmlsbF9jb250cm9sX3VyYigmc2MtPndvcmtfdXJiLCBzYy0+ZGV2LCBzYy0+c2VuZF9jdHJsX3BpcGUsCiAJICAgICh1bnNpZ25lZCBjaGFyKikgY3IsIE5VTEwsIDAsIHViX3VyYl9jb21wbGV0ZSwgc2MpOwotCXNjLT53b3JrX3VyYi50cmFuc2Zlcl9mbGFncyA9IFVSQl9BU1lOQ19VTkxJTks7CisJc2MtPndvcmtfdXJiLnRyYW5zZmVyX2ZsYWdzID0gMDsKIAlzYy0+d29ya191cmIuYWN0dWFsX2xlbmd0aCA9IDA7CiAJc2MtPndvcmtfdXJiLmVycm9yX2NvdW50ID0gMDsKIAlzYy0+d29ya191cmIuc3RhdHVzID0gMDsKQEAgLTE1NjAsNyArMTU4Miw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHViX3RvcF9zZW5zZV9kb25lKHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKnNjbWQpCiB7Ci0JdW5zaWduZWQgY2hhciAqc2Vuc2UgPSBzY21kLT5kYXRhOworCXVuc2lnbmVkIGNoYXIgKnNlbnNlID0gc2MtPnRvcF9zZW5zZTsKIAlzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZDsKIAogCS8qCkBAIC0xODUyLDYgKzE4NzQsNyBAQAogICAgIHN0cnVjdCB1Yl9jYXBhY2l0eSAqcmV0KQogewogCXN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJY2hhciAqcDsKIAllbnVtIHsgQUxMT0NfU0laRSA9IHNpemVvZihzdHJ1Y3QgdWJfc2NzaV9jbWQpICsgOCB9OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xODcyLDcgKzE4OTUsMTEgQEAKIAljbWQtPmNkYl9sZW4gPSAxMDsKIAljbWQtPmRpciA9IFVCX0RJUl9SRUFEOwogCWNtZC0+c3RhdGUgPSBVQl9DTURTVF9JTklUOwotCWNtZC0+ZGF0YSA9IHA7CisJY21kLT5uc2cgPSAxOworCXNnID0gJmNtZC0+c2d2WzBdOworCXNnLT5wYWdlID0gdmlydF90b19wYWdlKHApOworCXNnLT5vZmZzZXQgPSAodW5zaWduZWQgaW50KXAgJiAoUEFHRV9TSVpFLTEpOworCXNnLT5sZW5ndGggPSA4OwogCWNtZC0+bGVuID0gODsKIAljbWQtPmx1biA9IGx1bjsKIAljbWQtPmRvbmUgPSB1Yl9wcm9iZV9kb25lOwpAQCAtMjI4OSw3ICsyMzE2LDcgQEAKIAlkaXNrLT5kcml2ZXJmc19kZXYgPSAmc2MtPmludGYtPmRldjsJLyogWFhYIE1hbnkgdG8gb25lIG9rPyAqLwogCiAJcmMgPSAtRU5PTUVNOwotCWlmICgocSA9IGJsa19pbml0X3F1ZXVlKHViX2JkX3JxX2ZuLCAmc2MtPmxvY2spKSA9PSBOVUxMKQorCWlmICgocSA9IGJsa19pbml0X3F1ZXVlKHViX3JlcXVlc3RfZm4sICZzYy0+bG9jaykpID09IE5VTEwpCiAJCWdvdG8gZXJyX2Jsa3Fpbml0OwogCiAJZGlzay0+cXVldWUgPSBxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay91bWVtLmMgYi9kcml2ZXJzL2Jsb2NrL3VtZW0uYwppbmRleCAwYzRjMTIxLi4wZjQ4MzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3VtZW0uYworKysgYi9kcml2ZXJzL2Jsb2NrL3VtZW0uYwpAQCAtMzQsNiArMzQsNyBAQAogICoJCQkgLSBzZXQgaW5pdGlhbGlzZWQgYml0IHRoZW4uCiAgKi8KIAorLy8jZGVmaW5lIERFQlVHIC8qIHVuY29tbWVudCBpZiB5b3Ugd2FudCBkZWJ1Z2dpbmcgaW5mbyAocHJfZGVidWcpICovCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpAQCAtNTgsMTAgKzU5LDYgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jZGVmaW5lIFBSSU5USyh4Li4uKSBkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgZHByaW50ayh4Li4uKSBkbyB7fSB3aGlsZSAoMCkKLS8qI2RlZmluZSBkcHJpbnRrKHguLi4pIHByaW50ayh4KSAqLwotCiAjZGVmaW5lIE1NX01BWENBUkRTIDQKICNkZWZpbmUgTU1fUkFIRUFEIDIgICAgICAvKiB0d28gc2VjdG9ycyAqLwogI2RlZmluZSBNTV9CTEtTSVpFIDEwMjQgIC8qIDFrIGJsb2NrcyAqLwpAQCAtMjk5LDcgKzI5Niw3IEBACiAKIAkvKiBtYWtlIHRoZSBsYXN0IGRlc2NyaXB0b3IgZW5kIHRoZSBjaGFpbiAqLwogCXBhZ2UgPSAmY2FyZC0+bW1fcGFnZXNbY2FyZC0+QWN0aXZlXTsKLQlQUklOVEsoInN0YXJ0X2lvOiAlZCAlZC0+JWRcbiIsIGNhcmQtPkFjdGl2ZSwgcGFnZS0+aGVhZGNudCwgcGFnZS0+Y250LTEpOworCXByX2RlYnVnKCJzdGFydF9pbzogJWQgJWQtPiVkXG4iLCBjYXJkLT5BY3RpdmUsIHBhZ2UtPmhlYWRjbnQsIHBhZ2UtPmNudC0xKTsKIAlkZXNjID0gJnBhZ2UtPmRlc2NbcGFnZS0+Y250LTFdOwogCiAJZGVzYy0+Y29udHJvbF9iaXRzIHw9IGNwdV90b19sZTMyKERNQVNDUl9DSEFJTl9DT01QX0VOKTsKQEAgLTUzMiw3ICs1MjksNyBAQAogCQlhY3RpdmF0ZShjYXJkKTsKIAl9IGVsc2UgewogCQkvKiBoYXZlbid0IGZpbmlzaGVkIHdpdGggdGhpcyBvbmUgeWV0ICovCi0JCVBSSU5USygiZG8gc29tZSBtb3JlXG4iKTsKKwkJcHJfZGVidWcoImRvIHNvbWUgbW9yZVxuIik7CiAJCW1tX3N0YXJ0X2lvKGNhcmQpOwogCX0KICBvdXRfdW5sb2NrOgpAQCAtNTU1LDcgKzU1Miw3IEBACiBzdGF0aWMgaW50IG1tX21ha2VfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgY2FyZGluZm8gKmNhcmQgPSBxLT5xdWV1ZWRhdGE7Ci0JUFJJTlRLKCJtbV9tYWtlX3JlcXVlc3QgJWxkICVkXG4iLCBiaC0+Yl9yc2VjdG9yLCBiaC0+Yl9zaXplKTsKKwlwcl9kZWJ1ZygibW1fbWFrZV9yZXF1ZXN0ICVsZCAlZFxuIiwgYmgtPmJfcnNlY3RvciwgYmgtPmJfc2l6ZSk7CiAKIAliaW8tPmJpX3BoeXNfc2VnbWVudHMgPSBiaW8tPmJpX2lkeDsgLyogY291bnQgb2YgY29tcGxldGVkIHNlZ21lbnRzKi8KIAlzcGluX2xvY2tfaXJxKCZjYXJkLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGQuYyBiL2RyaXZlcnMvYmxvY2sveGQuYwppbmRleCAxNjc2MDMzLi42OGI2ZDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3hkLmMKKysrIGIvZHJpdmVycy9ibG9jay94ZC5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTYyLDcgKzYzLDcgQEAKIAogI2RlZmluZSBYRF9ET05UX1VTRV9ETUEJCTAgIC8qIEluaXRpYWwgdmFsdWUuIG1heSBiZSBvdmVycmlkZW4gdXNpbmcKIAkJCQkgICAgICAibm9kbWEiIG1vZHVsZSBvcHRpb24gKi8KLSNkZWZpbmUgWERfSU5JVF9ESVNLX0RFTEFZCSgzMCpIWi8xMDAwKSAgLyogMzAgbXMgZGVsYXkgZHVyaW5nIGRpc2sgaW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgWERfSU5JVF9ESVNLX0RFTEFZCSgzMCkgIC8qIDMwIG1zIGRlbGF5IGR1cmluZyBkaXNrIGluaXRpYWxpemF0aW9uICovCiAKIC8qIEFib3ZlIG1heSBuZWVkIHRvIGJlIGluY3JlYXNlZCBpZiBhIHByb2JsZW0gd2l0aCB0aGUgMm5kIGRyaXZlIGRldGVjdGlvbgogICAgKFNUMTFNIGNvbnRyb2xsZXIpIG9yIHJlc2V0dGluZyBhIGNvbnRyb2xsZXIgKFdEKSBhcHBlYXJzICovCkBAIC01MjksMTAgKzUzMCw4IEBACiAJaW50IHN1Y2Nlc3M7CiAKIAl4ZGNfYnVzeSA9IDE7Ci0Jd2hpbGUgKChzdWNjZXNzID0gKChpbmIocG9ydCkgJiBtYXNrKSAhPSBmbGFncykpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIGV4cGlyeSkpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCX0KKwl3aGlsZSAoKHN1Y2Nlc3MgPSAoKGluYihwb3J0KSAmIG1hc2spICE9IGZsYWdzKSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgZXhwaXJ5KSkKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJeGRjX2J1c3kgPSAwOwogCXJldHVybiAoc3VjY2Vzcyk7CiB9CkBAIC02MzMsMTQgKzYzMiwxMiBAQAogCWZvciAoaSA9IDA7IGkgPCBYRF9NQVhEUklWRVM7IGkrKykgewogCQl4ZF9idWlsZChjbWRibGssQ01EX1RFU1RSRUFEWSxpLDAsMCwwLDAsMCk7CiAJCWlmICgheGRfY29tbWFuZChjbWRibGssUElPX01PREUsTlVMTCxOVUxMLE5VTEwsWERfVElNRU9VVCo4KSkgewotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoWERfSU5JVF9ESVNLX0RFTEFZKTsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKFhEX0lOSVRfRElTS19ERUxBWSk7CiAKIAkJCWluaXRfZHJpdmUoY291bnQpOwogCQkJY291bnQrKzsKIAotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoWERfSU5JVF9ESVNLX0RFTEFZKTsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKFhEX0lOSVRfRElTS19ERUxBWSk7CiAJCX0KIAl9CiAJcmV0dXJuIChjb3VudCk7CkBAIC03NjEsOCArNzU4LDcgQEAKIAogCW91dGIoMCxYRF9SRVNFVCk7CQkvKiByZXNldCB0aGUgY29udHJvbGxlciAqLwogCi0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXNjaGVkdWxlX3RpbWVvdXQoWERfSU5JVF9ESVNLX0RFTEFZKTsKKwltc2xlZXAoWERfSU5JVF9ESVNLX0RFTEFZKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHhkX3dkX2luaXRfZHJpdmUgKHVfY2hhciBkcml2ZSkKQEAgLTkzNiw4ICs5MzIsNyBAQAogCXhkX21heHNlY3RvcnMgPSAweDAxOwogCW91dGIoMCxYRF9SRVNFVCk7CQkvKiByZXNldCB0aGUgY29udHJvbGxlciAqLwogCi0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXNjaGVkdWxlX3RpbWVvdXQoWERfSU5JVF9ESVNLX0RFTEFZKTsKKwltc2xlZXAoWERfSU5JVF9ESVNLX0RFTEFZKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHhkX3hlYmVjX2luaXRfZHJpdmUgKHVfY2hhciBkcml2ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svejJyYW0uYyBiL2RyaXZlcnMvYmxvY2svejJyYW0uYwppbmRleCAwMDdmNmE2Li5iYjVlOGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3oycmFtLmMKKysrIGIvZHJpdmVycy9ibG9jay96MnJhbS5jCkBAIC0yOTYsNyArMjk2LDcgQEAKICAgICByZXR1cm4gMDsKIAogZXJyX291dF9rZnJlZToKLSAgICBrZnJlZSggejJyYW1fbWFwICk7CisgICAga2ZyZWUoejJyYW1fbWFwKTsKIGVycl9vdXQ6CiAgICAgcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9henRjZC5jIGIvZHJpdmVycy9jZHJvbS9henRjZC5jCmluZGV4IDQzYmYxZTUuLmNlNGExY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vYXp0Y2QuYworKysgYi9kcml2ZXJzL2Nkcm9tL2F6dGNkLmMKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCiBzdGF0aWMgaW50IEF6dFRpbWVvdXQsIEF6dFRyaWVzOwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGF6dF93YWl0cSk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZGVsYXlfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoZGVsYXlfdGltZXIsIE5VTEwsIDAsIDApOwogCiBzdGF0aWMgc3RydWN0IGF6dF9EaXNrSW5mbyBEaXNrSW5mbzsKIHN0YXRpYyBzdHJ1Y3QgYXp0X1RvYyBUb2NbTUFYX1RSQUNLU107CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMgYi9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKaW5kZXggYmVhYTU2MS4uMTUzOTYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jCisrKyBiL2RyaXZlcnMvY2Ryb20vY2Ryb20uYwpAQCAtMjA5Nyw2ICsyMDk3LDEwIEBACiAJaWYgKCFxKQogCQlyZXR1cm4gLUVOWElPOwogCisJcnEgPSBibGtfZ2V0X3JlcXVlc3QocSwgUkVBRCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFycSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAljZGktPmxhc3Rfc2Vuc2UgPSAwOwogCiAJd2hpbGUgKG5mcmFtZXMpIHsKQEAgLTIxMDgsOSArMjExMiw5IEBACiAKIAkJbGVuID0gbnIgKiBDRF9GUkFNRVNJWkVfUkFXOwogCi0JCXJxID0gYmxrX3JxX21hcF91c2VyKHEsIFJFQUQsIHVidWYsIGxlbik7Ci0JCWlmIChJU19FUlIocnEpKQotCQkJcmV0dXJuIFBUUl9FUlIocnEpOworCQlyZXQgPSBibGtfcnFfbWFwX3VzZXIocSwgcnEsIHVidWYsIGxlbik7CisJCWlmIChyZXQpCisJCQlicmVhazsKIAogCQltZW1zZXQocnEtPmNtZCwgMCwgc2l6ZW9mKHJxLT5jbWQpKTsKIAkJcnEtPmNtZFswXSA9IEdQQ01EX1JFQURfQ0Q7CkBAIC0yMTMyLDEzICsyMTM2LDEzIEBACiAJCWlmIChycS0+YmlvKQogCQkJYmxrX3F1ZXVlX2JvdW5jZShxLCAmcnEtPmJpbyk7CiAKLQkJaWYgKGJsa19leGVjdXRlX3JxKHEsIGNkaS0+ZGlzaywgcnEpKSB7CisJCWlmIChibGtfZXhlY3V0ZV9ycShxLCBjZGktPmRpc2ssIHJxLCAwKSkgewogCQkJc3RydWN0IHJlcXVlc3Rfc2Vuc2UgKnMgPSBycS0+c2Vuc2U7CiAJCQlyZXQgPSAtRUlPOwogCQkJY2RpLT5sYXN0X3NlbnNlID0gcy0+c2Vuc2Vfa2V5OwogCQl9CiAKLQkJaWYgKGJsa19ycV91bm1hcF91c2VyKHJxLCBiaW8sIGxlbikpCisJCWlmIChibGtfcnFfdW5tYXBfdXNlcihiaW8sIGxlbikpCiAJCQlyZXQgPSAtRUZBVUxUOwogCiAJCWlmIChyZXQpCkBAIC0yMTQ5LDYgKzIxNTMsNyBAQAogCQl1YnVmICs9IGxlbjsKIAl9CiAKKwlibGtfcHV0X3JlcXVlc3QocnEpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vZ3NjZC5jIGIvZHJpdmVycy9jZHJvbS9nc2NkLmMKaW5kZXggN2VhYzEwZS4uYWQ1NDY0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9nc2NkLmMKKysrIGIvZHJpdmVycy9jZHJvbS9nc2NkLmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogc3RhdGljIGludCBBdWRpb0VuZF9tOwogc3RhdGljIGludCBBdWRpb0VuZF9mOwogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZ3NjZF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihnc2NkX3RpbWVyLCBOVUxMLCAwLCAwKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ3NjZF9sb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqZ3NjZF9xdWV1ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9vcHRjZC5jIGIvZHJpdmVycy9jZHJvbS9vcHRjZC5jCmluZGV4IDM1MWEwMWQuLjBiMGVhYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vb3B0Y2QuYworKysgYi9kcml2ZXJzL2Nkcm9tL29wdGNkLmMKQEAgLTI2NCw3ICsyNjQsNyBAQAogc3RhdGljIGludCBzbGVlcF90aW1lb3V0OwkvKiBtYXggIyBvZiB0aWNrcyB0byBzbGVlcCAqLwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHdhaXRxKTsKIHN0YXRpYyB2b2lkIHNsZWVwX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZGVsYXlfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihzbGVlcF90aW1lciwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGRlbGF5X3RpbWVyLCBzbGVlcF90aW1lciwgMCwgMCk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG9wdGNkX2xvY2spOwogc3RhdGljIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpvcHRfcXVldWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vc2JwY2QuYyBiL2RyaXZlcnMvY2Ryb20vc2JwY2QuYwppbmRleCA0NTJkMzQ2Li40NjZlOWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL3NicGNkLmMKKysrIGIvZHJpdmVycy9jZHJvbS9zYnBjZC5jCkBAIC03NDIsMTMgKzc0MiwxMCBAQAogdW5zaWduZWQgbG9uZyBjbGlfc3RpOyAvKiBmb3Igc2F2aW5nIHRoZSBwcm9jZXNzb3IgZmxhZ3MgKi8KICNlbmRpZgogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZGVsYXlfdGltZXIgPQotCQlUSU1FUl9JTklUSUFMSVpFUihtYXJrX3RpbWVvdXRfZGVsYXksIDAsIDApOwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRhdGFfdGltZXIgPQotCQlUSU1FUl9JTklUSUFMSVpFUihtYXJrX3RpbWVvdXRfZGF0YSwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGRlbGF5X3RpbWVyLCBtYXJrX3RpbWVvdXRfZGVsYXksIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihkYXRhX3RpbWVyLCBtYXJrX3RpbWVvdXRfZGF0YSwgMCwgMCk7CiAjaWYgMAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGF1ZGlvX3RpbWVyID0KLQkJVElNRVJfSU5JVElBTElaRVIobWFya190aW1lb3V0X2F1ZGlvLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoYXVkaW9fdGltZXIsIG1hcmtfdGltZW91dF9hdWRpbywgMCwgMCk7CiAjZW5kaWYKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyoKQEAgLTgzMCw4ICs4MjcsNyBAQAogc3RhdGljIHZvaWQgc2JwX3NsZWVwKHVfaW50IHRpbWUpCiB7CiAJc3RpKCk7Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0Jc2NoZWR1bGVfdGltZW91dCh0aW1lKTsKKwlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZSk7CiAJc3RpKCk7CiB9CiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTQyMTksNyArNDIxNSw4IEBACiAJCQogCWNhc2UgQ0RST01BVURJT0JVRlNJWjogLyogY29uZmlndXJlIHRoZSBhdWRpbyBidWZmZXIgc2l6ZSAqLwogCQltc2coREJHX0lPQywiaW9jdGw6IENEUk9NQVVESU9CVUZTSVogZW50ZXJlZC5cbiIpOwotCQlpZiAoY3VycmVudF9kcml2ZS0+c2JwX2F1ZHNpej4wKSB2ZnJlZShjdXJyZW50X2RyaXZlLT5hdWRfYnVmKTsKKwkJaWYgKGN1cnJlbnRfZHJpdmUtPnNicF9hdWRzaXo+MCkKKwkJCXZmcmVlKGN1cnJlbnRfZHJpdmUtPmF1ZF9idWYpOwogCQljdXJyZW50X2RyaXZlLT5hdWRfYnVmPU5VTEw7CiAJCWN1cnJlbnRfZHJpdmUtPnNicF9hdWRzaXo9YXJnOwogCQkKQEAgLTU5MTMsNyArNTkxMCw4IEBACiAJCXB1dF9kaXNrKERfU1tqXS5kaXNrKTsKIAkJZGV2ZnNfcmVtb3ZlKCJzYnAvYzB0JWQiLCBqKTsKIAkJdmZyZWUoRF9TW2pdLnNicF9idWYpOwotCQlpZiAoRF9TW2pdLnNicF9hdWRzaXo+MCkgdmZyZWUoRF9TW2pdLmF1ZF9idWYpOworCQlpZiAoRF9TW2pdLnNicF9hdWRzaXo+MCkKKwkJCXZmcmVlKERfU1tqXS5hdWRfYnVmKTsKIAkJaWYgKCh1bnJlZ2lzdGVyX2Nkcm9tKERfU1tqXS5zYnBjZF9pbmZvcCkgPT0gLUVJTlZBTCkpCiAJCXsKIAkJCW1zZyhEQkdfSU5GLCAiV2hhdCdzIHRoYXQ6IGNhbid0IHVucmVnaXN0ZXIgaW5mbyAlcy5cbiIsIG1ham9yX25hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9zamNkLmMgYi9kcml2ZXJzL2Nkcm9tL3NqY2QuYwppbmRleCA0ZTdhMzQyLi43NGIxY2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL3NqY2QuYworKysgYi9kcml2ZXJzL2Nkcm9tL3NqY2QuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAvKgogICogVGltZXIuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzamNkX2RlbGF5X3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoTlVMTCwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHNqY2RfZGVsYXlfdGltZXIsIE5VTEwsIDAsIDApOwogCiAjZGVmaW5lIFNKQ0RfU0VUX1RJTUVSKCBmdW5jLCB0bW91dCApICAgICAgICAgICBcCiAgICAgKCBzamNkX2RlbGF5X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzK3Rtb3V0LCAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vc29ueWNkNTM1LmMgYi9kcml2ZXJzL2Nkcm9tL3NvbnljZDUzNS5jCmluZGV4IDlmMjJlOGYuLmU2NTY1OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vc29ueWNkNTM1LmMKKysrIGIvZHJpdmVycy9jZHJvbS9zb255Y2Q1MzUuYwpAQCAtMTQ3OCw4ICsxNDc4LDcgQEAKIAkvKiBsb29rIGZvciB0aGUgQ0QtUk9NLCBmb2xsb3dzIHRoZSBwcm9jZWR1cmUgaW4gdGhlIERPUyBkcml2ZXIgKi8KIAlpbmIoc2VsZWN0X3VuaXRfcmVnKTsKIAkvKiB3YWl0IGZvciA0MCAxOCBIeiB0aWNrcyAocmV2ZXJzZS1lbmdpbmVlcmVkIGZyb20gRE9TIGRyaXZlcikgKi8KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCXNjaGVkdWxlX3RpbWVvdXQoKEhaKzE3KSo0MC8xOCk7CisJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKChIWisxNykqNDAvMTgpOwogCWluYihyZXN1bHRfcmVnKTsKIAogCW91dGIoMCwgcmVhZF9zdGF0dXNfcmVnKTsJLyogZG9lcyBhIHJlc2V0PyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwppbmRleCA3MzMzYjQxLi5jMjkzNjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwpAQCAtODAsNyArODAsNyBAQAogCiBjb25maWcgQ09NUFVUT05FCiAJdHJpc3RhdGUgIkNvbXB1dG9uZSBJbnRlbGxpUG9ydCBQbHVzIHNlcmlhbCBzdXBwb3J0IgotCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIEJST0tFTl9PTl9TTVAgJiYgKEJST0tFTiB8fCAhU1BBUkMzMikKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBCUk9LRU5fT05fU01QCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIGVudGlyZSBmYW1pbHkgb2YgSW50ZWxsaXBvcnQgSUkvUGx1cwogCSAgY29udHJvbGxlcnMgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBNaWNyb0NoYW5uZWwgY29udHJvbGxlcnMgYW5kCkBAIC0xMzgsNyArMTM4LDcgQEAKIAogY29uZmlnIERJR0lFUENBCiAJdHJpc3RhdGUgIkRpZ2lib2FyZCBJbnRlbGxpZ2VudCBBc3luYyBTdXBwb3J0IgotCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIEJST0tFTl9PTl9TTVAgJiYgKCE2NEJJVCB8fCBCUk9LRU4pCisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBEaWdpIEludGVybmF0aW9uYWwncyBYeCwgWGV2ZSwgYW5kIFhlbSBzZXJpZXMKIAkgIG9mIGNhcmRzIHdoaWNoIHByb3ZpZGUgbXVsdGlwbGUgc2VyaWFsIHBvcnRzLiBZb3Ugd291bGQgbmVlZApAQCAtMjA4LDcgKzIwOCw3IEBACiAKIGNvbmZpZyBTWU5DTElOS01QCiAJdHJpc3RhdGUgIlN5bmNMaW5rIE11bHRpcG9ydCBzdXBwb3J0IgotCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIChCUk9LRU4gfHwgIVNQQVJDMzIpCisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIFN5bmNMaW5rIE11bHRpcG9ydCAoMiBvciA0IHBvcnRzKQogCSAgc2VyaWFsIGFkYXB0ZXIsIHJ1bm5pbmcgYXN5bmNocm9ub3VzIGFuZCBIRExDIGNvbW11bmljYXRpb25zIHVwCkBAIC03MzUsNyArNzM1LDcgQEAKIAogY29uZmlnIEdFTl9SVEMKIAl0cmlzdGF0ZSAiR2VuZXJpYyAvZGV2L3J0YyBlbXVsYXRpb24iCi0JZGVwZW5kcyBvbiBSVEMhPXkgJiYgIUlBNjQgJiYgIUFSTSAmJiAhUFBDNjQgJiYgIU0zMlIgJiYgIVNQQVJDMzIKKwlkZXBlbmRzIG9uIFJUQyE9eSAmJiAhSUE2NCAmJiAhQVJNICYmICFQUEM2NCAmJiAhTTMyUiAmJiAhU1BBUkMzMiAmJiAhU1BBUkM2NAogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBzYXkgWSBoZXJlIGFuZCBjcmVhdGUgYSBjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIC9kZXYvcnRjIHdpdGgKIAkgIG1ham9yIG51bWJlciAxMCBhbmQgbWlub3IgbnVtYmVyIDEzNSB1c2luZyBta25vZCAoIm1hbiBta25vZCIpLCB5b3UKQEAgLTg0Miw4ICs4NDIsNyBAQAogCiBjb25maWcgVEFOQkFDX1RCMDIxOQogCXRyaXN0YXRlICJUQU5CQUMgVEIwMjE5IGJhc2UgYm9hcmQgc3VwcG9ydCIKLQlkZXBlbmRzIFRBTkJBQ19UQjAyMjkKLQorCWRlcGVuZHMgVEFOQkFDX1RCMDIyWAogCiBtZW51ICJGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCmluZGV4IDU5ZjU4OWQuLjBhNzYyNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYwpAQCAtNDI5LDcgKzQyOSw3IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldjE7CiAJaW50IGk7CiAJdW5zaWduZWQgc2l6ZSA9IGFtZDY0X2ZldGNoX3NpemUoKTsKLQlwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIHVwIFVMaSBBR1AuIFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyB1cCBVTGkgQUdQLlxuIik7CiAJZGV2MSA9IHBjaV9maW5kX3Nsb3QgKCh1bnNpZ25lZCBpbnQpcGRldi0+YnVzLT5udW1iZXIsUENJX0RFVkZOKDAsMCkpOwogCWlmIChkZXYxID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIGEgVUxpIGNoaXBzZXQsICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYmFja2VuZC5jIGIvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKaW5kZXggNGQ0ZTYwMi4uODJiNDNjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKQEAgLTIwNiwxMCArMjA2LDkgQEAKIAkJYnJpZGdlLT5kcml2ZXItPmNsZWFudXAoKTsKIAlpZiAoYnJpZGdlLT5kcml2ZXItPmZyZWVfZ2F0dF90YWJsZSkKIAkJYnJpZGdlLT5kcml2ZXItPmZyZWVfZ2F0dF90YWJsZShicmlkZ2UpOwotCWlmIChicmlkZ2UtPmtleV9saXN0KSB7Ci0JCXZmcmVlKGJyaWRnZS0+a2V5X2xpc3QpOwotCQlicmlkZ2UtPmtleV9saXN0ID0gTlVMTDsKLQl9CisKKwl2ZnJlZShicmlkZ2UtPmtleV9saXN0KTsKKwlicmlkZ2UtPmtleV9saXN0ID0gTlVMTDsKIAogCWlmIChicmlkZ2UtPmRyaXZlci0+YWdwX2Rlc3Ryb3lfcGFnZSAmJgogCSAgICBicmlkZ2UtPmRyaXZlci0+bmVlZHNfc2NyYXRjaF9wYWdlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYwppbmRleCBmMDA3OWU5Li5hYzlkYTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYwpAQCAtMzE5LDcgKzMxOSw2IEBACiAJCWluZm8tPm1vZGUgPSBicmlkZ2UtPm1vZGUgJiB+QUdQM19SRVNFUlZFRF9NQVNLOwogCWVsc2UKIAkJaW5mby0+bW9kZSA9IGJyaWRnZS0+bW9kZSAmIH5BR1AyX1JFU0VSVkVEX01BU0s7Ci0JaW5mby0+bW9kZSA9IGJyaWRnZS0+bW9kZTsKIAlpbmZvLT5hcGVyX2Jhc2UgPSBicmlkZ2UtPmdhcnRfYnVzX2FkZHI7CiAJaW5mby0+YXBlcl9zaXplID0gYWdwX3JldHVybl9zaXplKCk7CiAJaW5mby0+bWF4X21lbW9yeSA9IGJyaWRnZS0+bWF4X21lbW9yeV9hZ3A7CkBAIC0zNTYsNyArMzU1LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY3Vyci0+aXNfYm91bmQgPT0gVFJVRSkgewotCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIm1lbW9yeSAlcCBpcyBhbHJlYWR5IGJvdW5kIVxuIiwgY3Vycik7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJtZW1vcnkgJXAgaXMgYWxyZWFkeSBib3VuZCFcbiIsIGN1cnIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKGN1cnItPmlzX2ZsdXNoZWQgPT0gRkFMU0UpIHsKQEAgLTM5MSw3ICszOTAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjdXJyLT5pc19ib3VuZCAhPSBUUlVFKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAibWVtb3J5ICVwIHdhcyBub3QgYm91bmQhXG4iLCBjdXJyKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIm1lbW9yeSAlcCB3YXMgbm90IGJvdW5kIVxuIiwgY3Vycik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDE1LDcgKzQxNCw3IEBACiAJdTMyIHRtcDsKIAogCWlmICgqcmVxdWVzdGVkX21vZGUgJiBBR1AyX1JFU0VSVkVEX01BU0spIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJyZXNlcnZlZCBiaXRzIHNldCBpbiBtb2RlIDB4JXguIEZpeGVkLlxuIiwgKnJlcXVlc3RlZF9tb2RlKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInJlc2VydmVkIGJpdHMgc2V0IGluIG1vZGUgMHgleC4gRml4ZWQuXG4iLCAqcmVxdWVzdGVkX21vZGUpOwogCQkqcmVxdWVzdGVkX21vZGUgJj0gfkFHUDJfUkVTRVJWRURfTUFTSzsKIAl9CiAKQEAgLTQyMyw3ICs0MjIsNyBAQAogCXRtcCA9ICpyZXF1ZXN0ZWRfbW9kZSAmIDc7CiAJc3dpdGNoICh0bXApIHsKIAkJY2FzZSAwOgotCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICIlcyB0cmllZCB0byBzZXQgcmF0ZT14MC4gU2V0dGluZyB0byB4MSBtb2RlLlxuIiwgY3VycmVudC0+Y29tbSk7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXMgdHJpZWQgdG8gc2V0IHJhdGU9eDAuIFNldHRpbmcgdG8geDEgbW9kZS5cbiIsIGN1cnJlbnQtPmNvbW0pOwogCQkJKnJlcXVlc3RlZF9tb2RlIHw9IEFHUFNUQVQyXzFYOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKQEAgLTQ5MywxOCArNDkyLDE4IEBACiAJdTMyIHRtcDsKIAogCWlmICgqcmVxdWVzdGVkX21vZGUgJiBBR1AzX1JFU0VSVkVEX01BU0spIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJyZXNlcnZlZCBiaXRzIHNldCBpbiBtb2RlIDB4JXguIEZpeGVkLlxuIiwgKnJlcXVlc3RlZF9tb2RlKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInJlc2VydmVkIGJpdHMgc2V0IGluIG1vZGUgMHgleC4gRml4ZWQuXG4iLCAqcmVxdWVzdGVkX21vZGUpOwogCQkqcmVxdWVzdGVkX21vZGUgJj0gfkFHUDNfUkVTRVJWRURfTUFTSzsKIAl9CiAKIAkvKiBDaGVjayB0aGUgc3BlZWQgYml0cyBtYWtlIHNlbnNlLiAqLwogCXRtcCA9ICpyZXF1ZXN0ZWRfbW9kZSAmIDc7CiAJaWYgKHRtcCA9PSAwKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiJXMgdHJpZWQgdG8gc2V0IHJhdGU9eDAuIFNldHRpbmcgdG8gQUdQMyB4NCBtb2RlLlxuIiwgY3VycmVudC0+Y29tbSk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlcyB0cmllZCB0byBzZXQgcmF0ZT14MC4gU2V0dGluZyB0byBBR1AzIHg0IG1vZGUuXG4iLCBjdXJyZW50LT5jb21tKTsKIAkJKnJlcXVlc3RlZF9tb2RlIHw9IEFHUFNUQVQzXzRYOwogCX0KIAlpZiAodG1wID49IDMpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICIlcyB0cmllZCB0byBzZXQgcmF0ZT14JWQuIFNldHRpbmcgdG8gQUdQMyB4OCBtb2RlLlxuIiwgY3VycmVudC0+Y29tbSwgdG1wICogNCk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlcyB0cmllZCB0byBzZXQgcmF0ZT14JWQuIFNldHRpbmcgdG8gQUdQMyB4OCBtb2RlLlxuIiwgY3VycmVudC0+Y29tbSwgdG1wICogNCk7CiAJCSpyZXF1ZXN0ZWRfbW9kZSA9ICgqcmVxdWVzdGVkX21vZGUgJiB+NykgfCBBR1BTVEFUM184WDsKIAl9CiAKQEAgLTUzMyw3ICs1MzIsNyBAQAogCQkgKiBBR1AyLnggNHggLT4gQUdQMy4wIDR4LgogCQkgKi8KIAkJaWYgKCpyZXF1ZXN0ZWRfbW9kZSAmIEFHUFNUQVQyXzRYKSB7Ci0JCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIiVzIHBhc3NlcyBicm9rZW4gQUdQMyBmbGFncyAoJXgpLiBGaXhlZC5cbiIsCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXMgcGFzc2VzIGJyb2tlbiBBR1AzIGZsYWdzICgleCkuIEZpeGVkLlxuIiwKIAkJCQkJCWN1cnJlbnQtPmNvbW0sICpyZXF1ZXN0ZWRfbW9kZSk7CiAJCQkqcmVxdWVzdGVkX21vZGUgJj0gfkFHUFNUQVQyXzRYOwogCQkJKnJlcXVlc3RlZF9tb2RlIHw9IEFHUFNUQVQzXzRYOwpAQCAtNTQ0LDcgKzU0Myw3IEBACiAJCSAqIGJ1dCBoYXZlIGJlZW4gcGFzc2VkIGFuIEFHUCAyLnggbW9kZS4KIAkJICogQ29udmVydCBBR1AgMXgsMngsNHggLT4gQUdQIDMuMCA0eC4KIAkJICovCi0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiJXMgcGFzc2VzIGJyb2tlbiBBR1AyIGZsYWdzICgleCkgaW4gQUdQMyBtb2RlLiBGaXhlZC5cbiIsCisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlcyBwYXNzZXMgYnJva2VuIEFHUDIgZmxhZ3MgKCV4KSBpbiBBR1AzIG1vZGUuIEZpeGVkLlxuIiwKIAkJCQkJY3VycmVudC0+Y29tbSwgKnJlcXVlc3RlZF9tb2RlKTsKIAkJKnJlcXVlc3RlZF9tb2RlICY9IH4oQUdQU1RBVDJfNFggfCBBR1BTVEFUMl8yWCB8IEFHUFNUQVQyXzFYKTsKIAkJKnJlcXVlc3RlZF9tb2RlIHw9IEFHUFNUQVQzXzRYOwpAQCAtNTU0LDEzICs1NTMsMTMgQEAKIAkJaWYgKCEoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDNfOFgpKSB7CiAJCQkqYnJpZGdlX2FncHN0YXQgJj0gfihBR1BTVEFUM184WCB8IEFHUFNUQVQzX1JTVkQpOwogCQkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQzXzRYOwotCQkJcHJpbnRrICgiJXMgcmVxdWVzdGVkIEFHUHg4IGJ1dCBicmlkZ2Ugbm90IGNhcGFibGUuXG4iLCBjdXJyZW50LT5jb21tKTsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICIlcyByZXF1ZXN0ZWQgQUdQeDggYnV0IGJyaWRnZSBub3QgY2FwYWJsZS5cbiIsIGN1cnJlbnQtPmNvbW0pOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmICghKCp2Z2FfYWdwc3RhdCAmIEFHUFNUQVQzXzhYKSkgewogCQkJKmJyaWRnZV9hZ3BzdGF0ICY9IH4oQUdQU1RBVDNfOFggfCBBR1BTVEFUM19SU1ZEKTsKIAkJCSpicmlkZ2VfYWdwc3RhdCB8PSBBR1BTVEFUM180WDsKLQkJCXByaW50ayAoIiVzIHJlcXVlc3RlZCBBR1B4OCBidXQgZ3JhcGhpYyBjYXJkIG5vdCBjYXBhYmxlLlxuIiwgY3VycmVudC0+Y29tbSk7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXMgcmVxdWVzdGVkIEFHUHg4IGJ1dCBncmFwaGljIGNhcmQgbm90IGNhcGFibGUuXG4iLCBjdXJyZW50LT5jb21tKTsKIAkJCXJldHVybjsKIAkJfQogCQkvKiBBbGwgc2V0LCBicmlkZ2UgJiBkZXZpY2UgY2FuIGRvIEFHUCB4OCovCkBAIC01NzgsMTMgKzU3NywxMyBAQAogCQlpZiAoKCpicmlkZ2VfYWdwc3RhdCAmIEFHUFNUQVQzXzRYKSAmJiAoKnZnYV9hZ3BzdGF0ICYgQUdQU1RBVDNfNFgpKQogCQkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQzXzRYOwogCQllbHNlIHsKLQkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQmFkbmVzcy4gRG9uJ3Qga25vdyB3aGljaCBBR1AgbW9kZSB0byBzZXQuICIKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJCYWRuZXNzLiBEb24ndCBrbm93IHdoaWNoIEFHUCBtb2RlIHRvIHNldC4gIgogCQkJCQkJCSJbYnJpZGdlX2FncHN0YXQ6JXggdmdhX2FncHN0YXQ6JXggZmVsbCBiYWNrIHRvOi0gYnJpZGdlX2FncHN0YXQ6JXggdmdhX2FncHN0YXQ6JXhdXG4iLAogCQkJCQkJCW9yaWdicmlkZ2UsIG9yaWd2Z2EsICpicmlkZ2VfYWdwc3RhdCwgKnZnYV9hZ3BzdGF0KTsKIAkJCWlmICghKCpicmlkZ2VfYWdwc3RhdCAmIEFHUFNUQVQzXzRYKSkKLQkJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkJyaWRnZSBjb3VsZG4ndCBkbyBBR1AgeDQuXG4iKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQnJpZGdlIGNvdWxkbid0IGRvIEFHUCB4NC5cbiIpOwogCQkJaWYgKCEoKnZnYV9hZ3BzdGF0ICYgQUdQU1RBVDNfNFgpKQotCQkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiR3JhcGhpYyBjYXJkIGNvdWxkbid0IGRvIEFHUCB4NC5cbiIpOworCQkJCXByaW50ayhLRVJOX0lORk8gUEZYICJHcmFwaGljIGNhcmQgY291bGRuJ3QgZG8gQUdQIHg0LlxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC02MjIsNyArNjIxLDcgQEAKIAlmb3IgKDs7KSB7CiAJCWRldmljZSA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIGRldmljZSk7CiAJCWlmICghZGV2aWNlKSB7Ci0JCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkNvdWxkbid0IGZpbmQgYW4gQUdQIFZHQSBjb250cm9sbGVyLlxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ291bGRuJ3QgZmluZCBhbiBBR1AgVkdBIGNvbnRyb2xsZXIuXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWNhcF9wdHIgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldmljZSwgUENJX0NBUF9JRF9BR1ApOwpAQCAtNzM0LDcgKzczMyw3IEBACiAJCSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZS0+ZGV2LAogCQkJCQlicmlkZ2UtPmNhcG5keCtBR1BDVFJMLCB0ZW1wKTsKIAotCQkgICAgcHJpbnRrIChLRVJOX0lORk8gUEZYICJEZXZpY2UgaXMgaW4gbGVnYWN5IG1vZGUsIgorCQkgICAgcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldmljZSBpcyBpbiBsZWdhY3kgbW9kZSwiCiAJCQkJIiBmYWxsaW5nIGJhY2sgdG8gMi54XG4iKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jIGIvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMKaW5kZXggMTFmOWVlNS4uOTI3YTViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMKKysrIGIvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCiB2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAKIAltaXNjX2RlcmVnaXN0ZXIoJmFjX21pc2NkZXYpOwogCkBAIC0xOTUsNyArMTk1LDcgQEAKIAlpbnQgaSwgbnVtaXNhID0gMDsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKIAl2b2lkIF9faW9tZW0gKlJhbUlPOwotCWludCBib2FyZG5vOworCWludCBib2FyZG5vLCByZXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJBcHBsaWNvbSBkcml2ZXI6ICRJZDogYWMuYyx2IDEuMzAgMjAwMC8wMy8yMiAxNjowMzo1NyBkd213MiBFeHAgJFxuIik7CiAKQEAgLTI5NCw3ICsyOTQsOCBAQAogCX0KIAogCWlmICghbnVtaXNhKQotCQlwcmludGsoS0VSTl9XQVJOSU5HImFjLm86IE5vIHZhbGlkIElTQSBBcHBsaWNvbSBib2FyZHMgZm91bmQgYXQgbWVtIDB4JWx4XG4iLG1lbSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFjLm86IE5vIHZhbGlkIElTQSBBcHBsaWNvbSBib2FyZHMgZm91bmQgIgorCQkJCSJhdCBtZW0gMHglbHhcbiIsIG1lbSk7CiAKICBmaW46CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmRmxhZ1NsZWVwUmVjKTsKQEAgLTMwNCw3ICszMDUsMTEgQEAKIAlEZXZpY2VFcnJvckNvdW50ID0gMDsKIAogCWlmIChudW1ib2FyZHMpIHsKLQkJbWlzY19yZWdpc3RlcigmYWNfbWlzY2Rldik7CisJCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmFjX21pc2NkZXYpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhYy5vOiBVbmFibGUgdG8gcmVnaXN0ZXIgbWlzYyBkZXZpY2VcbiIpOworCQkJZ290byBvdXQ7CisJCX0KIAkJZm9yIChpID0gMDsgaSA8IE1BWF9CT0FSRDsgaSsrKSB7CiAJCQlpbnQgc2VyaWFsOwogCQkJY2hhciBib2FyZG5hbWVbKFNFUklBTF9OVU1CRVIgLSBUWVBFX0NBUkQpICsgMV07CkBAIC0zMzcsNiArMzQyLDE3IEBACiAKIAllbHNlCiAJCXJldHVybiAtRU5YSU87CisKK291dDoKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JPQVJEOyBpKyspIHsKKwkJaWYgKCFhcGJzW2ldLlJhbUlPKQorCQkJY29udGludWU7CisJCWlmIChhcGJzW2ldLmlycSkKKwkJCWZyZWVfaXJxKGFwYnNbaV0uaXJxLCAmZHVtbXkpOworCQlpb3VubWFwKGFwYnNbaV0uUmFtSU8pOworCX0KKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gcmV0OwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jIGIvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKaW5kZXggNmE1MzM3Yi4uY2Y0YzM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKKysrIGIvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKQEAgLTg2NSw3ICs4NjUsNyBAQAogc3RhdGljIGxvbmcgY3l6X3BvbGxpbmdfY3ljbGUgPSBDWl9ERUZfUE9MTDsKIAogc3RhdGljIGludCBjeXpfdGltZXJvbiA9IDA7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgY3l6X3RpbWVybGlzdCA9IFRJTUVSX0lOSVRJQUxJWkVSKGN5el9wb2xsLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoY3l6X3RpbWVybGlzdCwgY3l6X3BvbGwsIDAsIDApOwogCiAjZWxzZSAvKiBDT05GSUdfQ1laX0lOVFIgKi8KIHN0YXRpYyB2b2lkIGN5el9yeF9yZXN0YXJ0KHVuc2lnbmVkIGxvbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RpZ2kxLmggYi9kcml2ZXJzL2NoYXIvZGlnaTEuaAppbmRleCAxODQzNzhkLi45NGQ0ZWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZGlnaTEuaAorKysgYi9kcml2ZXJzL2NoYXIvZGlnaTEuaApAQCAtMSw0NiArMSw0NiBAQAogLyogICAgICAgICAgRGVmaW5pdGlvbnMgZm9yIERpZ2lCb2FyZCBkaXR0eSgxKSBjb21tYW5kLiAgICAgICAgICAgICAgICAgKi8KIAogI2lmICFkZWZpbmVkKFRJT0NNT0RHKQotI2RlZmluZQlUSU9DTU9ERwkoJ2QnPDw4KSB8IDI1MAkJLyogZ2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KLSNkZWZpbmUJVElPQ01PRFMJKCdkJzw8OCkgfCAyNTEJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCisjZGVmaW5lCVRJT0NNT0RHCSgoJ2QnPDw4KSB8IDI1MCkJLyogZ2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KKyNkZWZpbmUJVElPQ01PRFMJKCgnZCc8PDgpIHwgMjUxKQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLwogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChUSU9DTVNFVCkKLSNkZWZpbmUJVElPQ01TRVQJKCdkJzw8OCkgfCAyNTIJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCi0jZGVmaW5lCVRJT0NNR0VUCSgnZCc8PDgpIHwgMjUzCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2RlZmluZQlUSU9DTVNFVAkoKCdkJzw8OCkgfCAyNTIpCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCisjZGVmaW5lCVRJT0NNR0VUCSgoJ2QnPDw4KSB8IDI1MykJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoVElPQ01CSUMpCi0jZGVmaW5lCVRJT0NNQklDCSgnZCc8PDgpIHwgMjU0CQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZSAqLwotI2RlZmluZQlUSU9DTUJJUwkoJ2QnPDw4KSB8IDI1NQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KKyNkZWZpbmUJVElPQ01CSUMJKCgnZCc8PDgpIHwgMjU0KQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZSAqLworI2RlZmluZQlUSU9DTUJJUwkoKCdkJzw8OCkgfCAyNTUpCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlICovCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKFRJT0NTRFRSKQotI2RlZmluZQlUSU9DU0RUUgkoJ2UnPDw4KSB8IDAJCS8qIHNldCBEVFIJCSovCi0jZGVmaW5lCVRJT0NDRFRSCSgnZSc8PDgpIHwgMQkJLyogY2xlYXIgRFRSCQkqLworI2RlZmluZQlUSU9DU0RUUgkoKCdlJzw8OCkgfCAwKQkJLyogc2V0IERUUgkJKi8KKyNkZWZpbmUJVElPQ0NEVFIJKCgnZSc8PDgpIHwgMSkJCS8qIGNsZWFyIERUUgkJKi8KICNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJb2N0bCBjb21tYW5kIGFyZ3VtZW50cyBmb3IgRElHSSBwYXJhbWV0ZXJzLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgRElHSV9HRVRBCSgnZSc8PDgpIHwgOTQJCS8qIFJlYWQgcGFyYW1zCQkqLworI2RlZmluZSBESUdJX0dFVEEJKCgnZSc8PDgpIHwgOTQpCQkvKiBSZWFkIHBhcmFtcwkJKi8KIAotI2RlZmluZSBESUdJX1NFVEEJKCdlJzw8OCkgfCA5NQkJLyogU2V0IHBhcmFtcwkJKi8KLSNkZWZpbmUgRElHSV9TRVRBVwkoJ2UnPDw4KSB8IDk2CQkvKiBEcmFpbiAmIHNldCBwYXJhbXMJKi8KLSNkZWZpbmUgRElHSV9TRVRBRgkoJ2UnPDw4KSB8IDk3CQkvKiBEcmFpbiwgZmx1c2ggJiBzZXQgcGFyYW1zICovCisjZGVmaW5lIERJR0lfU0VUQQkoKCdlJzw8OCkgfCA5NSkJCS8qIFNldCBwYXJhbXMJCSovCisjZGVmaW5lIERJR0lfU0VUQVcJKCgnZSc8PDgpIHwgOTYpCQkvKiBEcmFpbiAmIHNldCBwYXJhbXMJKi8KKyNkZWZpbmUgRElHSV9TRVRBRgkoKCdlJzw8OCkgfCA5NykJCS8qIERyYWluLCBmbHVzaCAmIHNldCBwYXJhbXMgKi8KIAotI2RlZmluZQlESUdJX0dFVEZMT1cJKCdlJzw8OCkgfCA5OQkJLyogR2V0IHN0YXJ0Yy9zdG9wYyBmbG93ICovCisjZGVmaW5lCURJR0lfR0VURkxPVwkoKCdlJzw8OCkgfCA5OSkJCS8qIEdldCBzdGFydGMvc3RvcGMgZmxvdyAqLwogCQkJCQkJLyogY29udHJvbCBjaGFyYWN0ZXJzIAkgKi8KLSNkZWZpbmUJRElHSV9TRVRGTE9XCSgnZSc8PDgpIHwgMTAwCQkvKiBTZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KKyNkZWZpbmUJRElHSV9TRVRGTE9XCSgoJ2UnPDw4KSB8IDEwMCkJLyogU2V0IHN0YXJ0Yy9zdG9wYyBmbG93ICovCiAJCQkJCQkvKiBjb250cm9sIGNoYXJhY3RlcnMJICovCi0jZGVmaW5lCURJR0lfR0VUQUZMT1cJKCdlJzw8OCkgfCAxMDEJCS8qIEdldCBBdXguIHN0YXJ0Yy9zdG9wYyAqLworI2RlZmluZQlESUdJX0dFVEFGTE9XCSgoJ2UnPDw4KSB8IDEwMSkJLyogR2V0IEF1eC4gc3RhcnRjL3N0b3BjICovCiAJCQkJCQkvKiBmbG93IGNvbnRyb2wgY2hhcnMgCSAqLwotI2RlZmluZQlESUdJX1NFVEFGTE9XCSgnZSc8PDgpIHwgMTAyCQkvKiBTZXQgQXV4LiBzdGFydGMvc3RvcGMgKi8KKyNkZWZpbmUJRElHSV9TRVRBRkxPVwkoKCdlJzw8OCkgfCAxMDIpCS8qIFNldCBBdXguIHN0YXJ0Yy9zdG9wYyAqLwogCQkJCQkJLyogZmxvdyBjb250cm9sIGNoYXJzCSAqLwogCi0jZGVmaW5lCURJR0lfR0VUSU5GTwkoJ2UnPDw4KSB8IDEwMwkJLyogRmlsbCBpbiBkaWdpX2luZm8gKi8KLSNkZWZpbmUJRElHSV9QT0xMRVIJKCdlJzw8OCkgfCAxMDQJCS8qIFR1cm4gb24vb2ZmIHBvbGxlciAqLwotI2RlZmluZQlESUdJX0lOSVQJKCdlJzw8OCkgfCAxMDUJCS8qIEFsbG93IHRoaW5ncyB0byBydW4uICovCisjZGVmaW5lCURJR0lfR0VUSU5GTwkoKCdlJzw8OCkgfCAxMDMpCS8qIEZpbGwgaW4gZGlnaV9pbmZvICovCisjZGVmaW5lCURJR0lfUE9MTEVSCSgoJ2UnPDw4KSB8IDEwNCkJLyogVHVybiBvbi9vZmYgcG9sbGVyICovCisjZGVmaW5lCURJR0lfSU5JVAkoKCdlJzw8OCkgfCAxMDUpCS8qIEFsbG93IHRoaW5ncyB0byBydW4uICovCiAKIHN0cnVjdAlkaWdpZmxvd19zdHJ1Y3QgCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZGlnaUZlcDEuaCBiL2RyaXZlcnMvY2hhci9kaWdpRmVwMS5oCmluZGV4IGM0N2Q3ZmMuLjNjMWYxOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kaWdpRmVwMS5oCisrKyBiL2RyaXZlcnMvY2hhci9kaWdpRmVwMS5oCkBAIC0xMyw4OCArMTMsODggQEAKIAogc3RydWN0IGdsb2JhbF9kYXRhIAogewotCXZvbGF0aWxlIHVzaG9ydCBjaW47Ci0Jdm9sYXRpbGUgdXNob3J0IGNvdXQ7Ci0Jdm9sYXRpbGUgdXNob3J0IGNzdGFydDsKLQl2b2xhdGlsZSB1c2hvcnQgY21heDsKLQl2b2xhdGlsZSB1c2hvcnQgZWluOwotCXZvbGF0aWxlIHVzaG9ydCBlb3V0OwotCXZvbGF0aWxlIHVzaG9ydCBpc3RhcnQ7Ci0Jdm9sYXRpbGUgdXNob3J0IGltYXg7CisJdTE2IGNpbjsKKwl1MTYgY291dDsKKwl1MTYgY3N0YXJ0OworCXUxNiBjbWF4OworCXUxNiBlaW47CisJdTE2IGVvdXQ7CisJdTE2IGlzdGFydDsKKwl1MTYgaW1heDsKIH07CiAKIAogc3RydWN0IGJvYXJkX2NoYW4gCiB7Ci0JaW50IGZpbGxlcjE7IAotCWludCBmaWxsZXIyOwotCXZvbGF0aWxlIHVzaG9ydCB0c2VnOwotCXZvbGF0aWxlIHVzaG9ydCB0aW47Ci0Jdm9sYXRpbGUgdXNob3J0IHRvdXQ7Ci0Jdm9sYXRpbGUgdXNob3J0IHRtYXg7Ci0JCi0Jdm9sYXRpbGUgdXNob3J0IHJzZWc7Ci0Jdm9sYXRpbGUgdXNob3J0IHJpbjsKLQl2b2xhdGlsZSB1c2hvcnQgcm91dDsKLQl2b2xhdGlsZSB1c2hvcnQgcm1heDsKLQkKLQl2b2xhdGlsZSB1c2hvcnQgdGxvdzsKLQl2b2xhdGlsZSB1c2hvcnQgcmxvdzsKLQl2b2xhdGlsZSB1c2hvcnQgcmhpZ2g7Ci0Jdm9sYXRpbGUgdXNob3J0IGluY3I7Ci0JCi0Jdm9sYXRpbGUgdXNob3J0IGV0aW1lOwotCXZvbGF0aWxlIHVzaG9ydCBlZGVsYXk7Ci0Jdm9sYXRpbGUgdW5jaGFyICpkZXY7Ci0JCi0Jdm9sYXRpbGUgdXNob3J0IGlmbGFnOwotCXZvbGF0aWxlIHVzaG9ydCBvZmxhZzsKLQl2b2xhdGlsZSB1c2hvcnQgY2ZsYWc7Ci0Jdm9sYXRpbGUgdXNob3J0IGdtYXNrOwotCQotCXZvbGF0aWxlIHVzaG9ydCBjb2w7Ci0Jdm9sYXRpbGUgdXNob3J0IGRlbGF5OwotCXZvbGF0aWxlIHVzaG9ydCBpbWFzazsKLQl2b2xhdGlsZSB1c2hvcnQgdGZsdXNoOworCXUzMiBmaWxsZXIxOworCXUzMiBmaWxsZXIyOworCXUxNiB0c2VnOworCXUxNiB0aW47CisJdTE2IHRvdXQ7CisJdTE2IHRtYXg7CiAKLQlpbnQgZmlsbGVyMzsKLQlpbnQgZmlsbGVyNDsKLQlpbnQgZmlsbGVyNTsKLQlpbnQgZmlsbGVyNjsKLQkKLQl2b2xhdGlsZSB1bmNoYXIgbnVtOwotCXZvbGF0aWxlIHVuY2hhciByYWN0OwotCXZvbGF0aWxlIHVuY2hhciBic3RhdDsKLQl2b2xhdGlsZSB1bmNoYXIgdGJ1c3k7Ci0Jdm9sYXRpbGUgdW5jaGFyIGllbXB0eTsKLQl2b2xhdGlsZSB1bmNoYXIgaWxvdzsKLQl2b2xhdGlsZSB1bmNoYXIgaWRhdGE7Ci0Jdm9sYXRpbGUgdW5jaGFyIGVmbGFnOwotCQotCXZvbGF0aWxlIHVuY2hhciB0ZmxhZzsKLQl2b2xhdGlsZSB1bmNoYXIgcmZsYWc7Ci0Jdm9sYXRpbGUgdW5jaGFyIHhtYXNrOwotCXZvbGF0aWxlIHVuY2hhciB4dmFsOwotCXZvbGF0aWxlIHVuY2hhciBtc3RhdDsKLQl2b2xhdGlsZSB1bmNoYXIgbWNoYW5nZTsKLQl2b2xhdGlsZSB1bmNoYXIgbWludDsKLQl2b2xhdGlsZSB1bmNoYXIgbHN0YXQ7CisJdTE2IHJzZWc7CisJdTE2IHJpbjsKKwl1MTYgcm91dDsKKwl1MTYgcm1heDsKIAotCXZvbGF0aWxlIHVuY2hhciBtdHJhbjsKLQl2b2xhdGlsZSB1bmNoYXIgb3J1bjsKLQl2b2xhdGlsZSB1bmNoYXIgc3RhcnRjYTsKLQl2b2xhdGlsZSB1bmNoYXIgc3RvcGNhOwotCXZvbGF0aWxlIHVuY2hhciBzdGFydGM7Ci0Jdm9sYXRpbGUgdW5jaGFyIHN0b3BjOwotCXZvbGF0aWxlIHVuY2hhciB2bmV4dDsKLQl2b2xhdGlsZSB1bmNoYXIgaGZsb3c7CisJdTE2IHRsb3c7CisJdTE2IHJsb3c7CisJdTE2IHJoaWdoOworCXUxNiBpbmNyOwogCi0Jdm9sYXRpbGUgdW5jaGFyIGZpbGxjOwotCXZvbGF0aWxlIHVuY2hhciBvY2hhcjsKLQl2b2xhdGlsZSB1bmNoYXIgb21hc2s7CisJdTE2IGV0aW1lOworCXUxNiBlZGVsYXk7CisJdW5jaGFyICpkZXY7CiAKLQl1bmNoYXIgZmlsbGVyNzsKLQl1bmNoYXIgZmlsbGVyOFsyOF07CisJdTE2IGlmbGFnOworCXUxNiBvZmxhZzsKKwl1MTYgY2ZsYWc7CisJdTE2IGdtYXNrOworCisJdTE2IGNvbDsKKwl1MTYgZGVsYXk7CisJdTE2IGltYXNrOworCXUxNiB0Zmx1c2g7CisKKwl1MzIgZmlsbGVyMzsKKwl1MzIgZmlsbGVyNDsKKwl1MzIgZmlsbGVyNTsKKwl1MzIgZmlsbGVyNjsKKworCXU4IG51bTsKKwl1OCByYWN0OworCXU4IGJzdGF0OworCXU4IHRidXN5OworCXU4IGllbXB0eTsKKwl1OCBpbG93OworCXU4IGlkYXRhOworCXU4IGVmbGFnOworCisJdTggdGZsYWc7CisJdTggcmZsYWc7CisJdTggeG1hc2s7CisJdTggeHZhbDsKKwl1OCBtc3RhdDsKKwl1OCBtY2hhbmdlOworCXU4IG1pbnQ7CisJdTggbHN0YXQ7CisKKwl1OCBtdHJhbjsKKwl1OCBvcnVuOworCXU4IHN0YXJ0Y2E7CisJdTggc3RvcGNhOworCXU4IHN0YXJ0YzsKKwl1OCBzdG9wYzsKKwl1OCB2bmV4dDsKKwl1OCBoZmxvdzsKKworCXU4IGZpbGxjOworCXU4IG9jaGFyOworCXU4IG9tYXNrOworCisJdTggZmlsbGVyNzsKKwl1OCBmaWxsZXI4WzI4XTsKIH07IAogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9kcm0vS2NvbmZpZwppbmRleCAxMjM0MTdlLi41NmFjZTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL2RybS9LY29uZmlnCkBAIC0yMywxMyArMjMsNiBAQAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgM2RmeCBCYW5zaGVlIG9yIFZvb2RvbzMgKG9yIGxhdGVyKSwKIAkgIGdyYXBoaWNzIGNhcmQuICBJZiBNIGlzIHNlbGVjdGVkLCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRkZnguCiAKLWNvbmZpZyBEUk1fR0FNTUEKLQl0cmlzdGF0ZSAiM2RsYWJzIEdNWCAyMDAwIgotCWRlcGVuZHMgb24gRFJNICYmIEJST0tFTgotCWhlbHAKLQkgIFRoaXMgaXMgdGhlIG9sZCBnYW1tYSBkcml2ZXIsIHBsZWFzZSB0ZWxsIG1lIGlmIGl0IG1pZ2h0IGFjdHVhbGx5Ci0JICB3b3JrLgotCiBjb25maWcgRFJNX1IxMjgKIAl0cmlzdGF0ZSAiQVRJIFJhZ2UgMTI4IgogCWRlcGVuZHMgb24gRFJNICYmIFBDSQpAQCAtODIsNyArNzUsNyBAQAogCiBjb25maWcgRFJNX01HQQogCXRyaXN0YXRlICJNYXRyb3ggZzIwMC9nNDAwIgotCWRlcGVuZHMgb24gRFJNICYmIEFHUAorCWRlcGVuZHMgb24gRFJNCiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgTWF0cm94IEcyMDAsIEc0MDAgb3IgRzQ1MCBncmFwaGljcwogCSAgY2FyZC4gIElmIE0gaXMgc2VsZWN0ZWQsIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWdhLiAgQUdQCkBAIC0xMDMsMyArOTYsMTAgQEAKIAkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIFZpYSB1bmljaHJvbWUgb3IgY29tcGF0aWJsZSB2aWRlbwogCSAgY2hpcHNldC4gSWYgTSBpcyBzZWxlY3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZpYS4KIAorY29uZmlnIERSTV9TQVZBR0UKKwl0cmlzdGF0ZSAiU2F2YWdlIHZpZGVvIGNhcmRzIgorCWRlcGVuZHMgb24gRFJNCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgU2F2YWdlM0QvNC9TdXBlclNhdmFnZS9Qcm8vVHdpc3RlcgorCSAgY2hpcHNldC4gSWYgTSBpcyBzZWxlY3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNhdmFnZS4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUKaW5kZXggZGRkOTQxMC4uZTQxMDYwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvZHJtL01ha2VmaWxlCkBAIC04LDE2ICs4LDE2IEBACiAJCWRybV9hZ3BzdXBwb3J0Lm8gZHJtX3NjYXR0ZXIubyBhdGlfcGNpZ2FydC5vIGRybV9wY2kubyBcCiAJCWRybV9zeXNmcy5vCiAKLWdhbW1hLW9ianMgIDo9IGdhbW1hX2Rydi5vIGdhbW1hX2RtYS5vCiB0ZGZ4LW9ianMgICA6PSB0ZGZ4X2Rydi5vCiByMTI4LW9ianMgICA6PSByMTI4X2Rydi5vIHIxMjhfY2NlLm8gcjEyOF9zdGF0ZS5vIHIxMjhfaXJxLm8KIG1nYS1vYmpzICAgIDo9IG1nYV9kcnYubyBtZ2FfZG1hLm8gbWdhX3N0YXRlLm8gbWdhX3dhcnAubyBtZ2FfaXJxLm8KIGk4MTAtb2JqcyAgIDo9IGk4MTBfZHJ2Lm8gaTgxMF9kbWEubwogaTgzMC1vYmpzICAgOj0gaTgzMF9kcnYubyBpODMwX2RtYS5vIGk4MzBfaXJxLm8KIGk5MTUtb2JqcyAgIDo9IGk5MTVfZHJ2Lm8gaTkxNV9kbWEubyBpOTE1X2lycS5vIGk5MTVfbWVtLm8KLXJhZGVvbi1vYmpzIDo9IHJhZGVvbl9kcnYubyByYWRlb25fY3AubyByYWRlb25fc3RhdGUubyByYWRlb25fbWVtLm8gcmFkZW9uX2lycS5vCityYWRlb24tb2JqcyA6PSByYWRlb25fZHJ2Lm8gcmFkZW9uX2NwLm8gcmFkZW9uX3N0YXRlLm8gcmFkZW9uX21lbS5vIHJhZGVvbl9pcnEubyByMzAwX2NtZGJ1Zi5vCiBmZmItb2JqcyAgICA6PSBmZmJfZHJ2Lm8gZmZiX2NvbnRleHQubwogc2lzLW9ianMgICAgOj0gc2lzX2Rydi5vIHNpc19kcy5vIHNpc19tbS5vCitzYXZhZ2Utb2JqcyA6PSBzYXZhZ2VfZHJ2Lm8gc2F2YWdlX2JjaS5vIHNhdmFnZV9zdGF0ZS5vCiB2aWEtb2JqcyAgICA6PSB2aWFfaXJxLm8gdmlhX2Rydi5vIHZpYV9kcy5vIHZpYV9tYXAubyB2aWFfbW0ubyB2aWFfZG1hLm8gdmlhX3ZlcmlmaWVyLm8gdmlhX3ZpZGVvLm8KIAogaWZlcSAoJChDT05GSUdfQ09NUEFUKSx5KQpAQCAtMjksNyArMjksNiBAQAogZW5kaWYKIAogb2JqLSQoQ09ORklHX0RSTSkJKz0gZHJtLm8KLW9iai0kKENPTkZJR19EUk1fR0FNTUEpICs9IGdhbW1hLm8KIG9iai0kKENPTkZJR19EUk1fVERGWCkJKz0gdGRmeC5vCiBvYmotJChDT05GSUdfRFJNX1IxMjgpCSs9IHIxMjgubwogb2JqLSQoQ09ORklHX0RSTV9SQURFT04pKz0gcmFkZW9uLm8KQEAgLTM5LDUgKzM4LDcgQEAKIG9iai0kKENPTkZJR19EUk1fSTkxNSkgICs9IGk5MTUubwogb2JqLSQoQ09ORklHX0RSTV9GRkIpICAgKz0gZmZiLm8KIG9iai0kKENPTkZJR19EUk1fU0lTKSAgICs9IHNpcy5vCitvYmotJChDT05GSUdfRFJNX1NBVkFHRSkrPSBzYXZhZ2Uubwogb2JqLSQoQ09ORklHX0RSTV9WSUEpCSs9dmlhLm8KIAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm0uaAppbmRleCBlODM3MWRkLi5mYzY1OThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtLmgKQEAgLTk4LDcgKzk4LDcgQEAKICNkZWZpbmUgX0RSTV9MT0NLSU5HX0NPTlRFWFQobG9jaykgKChsb2NrKSAmIH4oX0RSTV9MT0NLX0hFTER8X0RSTV9MT0NLX0NPTlQpKQogCiAKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBkcm1faGFuZGxlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgZHJtX2hhbmRsZV90OwogdHlwZWRlZiB1bnNpZ25lZCBpbnQgIGRybV9jb250ZXh0X3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGludCAgZHJtX2RyYXdhYmxlX3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGludCAgZHJtX21hZ2ljX3Q7CkBAIC0yMDksNyArMjA5LDggQEAKIAlfRFJNX1JFR0lTVEVSUwkgICAgPSAxLCAgLyoqPCBubyBjYWNoaW5nLCBubyBjb3JlIGR1bXAgKi8KIAlfRFJNX1NITQkgICAgPSAyLCAgLyoqPCBzaGFyZWQsIGNhY2hlZCAqLwogCV9EUk1fQUdQICAgICAgICAgICAgPSAzLCAgLyoqPCBBR1AvR0FSVCAqLwotCV9EUk1fU0NBVFRFUl9HQVRIRVIgPSA0CSAgLyoqPCBTY2F0dGVyL2dhdGhlciBtZW1vcnkgZm9yIFBDSSBETUEgKi8KKwlfRFJNX1NDQVRURVJfR0FUSEVSID0gNCwgIC8qKjwgU2NhdHRlci9nYXRoZXIgbWVtb3J5IGZvciBQQ0kgRE1BICovCisJX0RSTV9DT05TSVNURU5UICAgICA9IDUsICAvKio8IENvbnNpc3RlbnQgbWVtb3J5IGZvciBQQ0kgRE1BICovCiB9IGRybV9tYXBfdHlwZV90OwogCiAKQEAgLTM2OCw3ICszNjksOCBAQAogCWVudW0gewogCQlfRFJNX1BBR0VfQUxJR04gPSAweDAxLCAvKio8IEFsaWduIG9uIHBhZ2UgYm91bmRhcmllcyBmb3IgRE1BICovCiAJCV9EUk1fQUdQX0JVRkZFUiA9IDB4MDIsIC8qKjwgQnVmZmVyIGlzIGluIEFHUCBzcGFjZSAqLwotCQlfRFJNX1NHX0JVRkZFUiAgPSAweDA0ICAvKio8IFNjYXR0ZXIvZ2F0aGVyIG1lbW9yeSBidWZmZXIgKi8KKwkJX0RSTV9TR19CVUZGRVIgID0gMHgwNCwgLyoqPCBTY2F0dGVyL2dhdGhlciBtZW1vcnkgYnVmZmVyICovCisJCV9EUk1fRkJfQlVGRkVSICA9IDB4MDggIC8qKjwgQnVmZmVyIGlzIGluIGZyYW1lIGJ1ZmZlciAqLwogCX0JICAgICAgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBhZ3Bfc3RhcnQ7IC8qKjwgCiAJCQkJICAqIFN0YXJ0IGFkZHJlc3Mgb2Ygd2hlcmUgdGhlIEFHUCBidWZmZXJzIGFyZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1QLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaAppbmRleCA1ZGYwOWNjLi4xMjFjYzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaApAQCAtNTMsNyArNTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgkvKiBGb3IgKHVuKWxvY2tfa2VybmVsICovCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTk2LDYgKzk1LDcgQEAKICNkZWZpbmUgRFJJVkVSX0lSUV9TSEFSRUQgIDB4ODAKICNkZWZpbmUgRFJJVkVSX0lSUV9WQkwgICAgIDB4MTAwCiAjZGVmaW5lIERSSVZFUl9ETUFfUVVFVUUgICAweDIwMAorI2RlZmluZSBEUklWRVJfRkJfRE1BICAgICAgMHg0MDAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqIFxuYW1lIEJlZ2luIHRoZSBEUk0uLi4gKi8KQEAgLTE2MCwzNiArMTYwLDcgQEAKICNkZWZpbmUgcHRlX3VubWFwKHB0ZSkKICNlbmRpZgogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDE5KQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqIHZtYWxsb2NfdG9fcGFnZSh2b2lkICogdm1hbGxvY19hZGRyKQotewotCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKSB2bWFsbG9jX2FkZHI7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwotCXBnZF90ICpwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcik7Ci0JcG1kX3QgKnBtZDsKLQlwdGVfdCAqcHRlcCwgcHRlOwotICAKLQlpZiAoIXBnZF9ub25lKCpwZ2QpKSB7Ci0JCXBtZCA9IHBtZF9vZmZzZXQocGdkLCBhZGRyKTsKLQkJaWYgKCFwbWRfbm9uZSgqcG1kKSkgewotCQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCQlwdGVwID0gcHRlX29mZnNldF9tYXAocG1kLCBhZGRyKTsKLQkJCXB0ZSA9ICpwdGVwOwotCQkJaWYgKHB0ZV9wcmVzZW50KHB0ZSkpCi0JCQkJcGFnZSA9IHB0ZV9wYWdlKHB0ZSk7Ci0JCQlwdGVfdW5tYXAocHRlcCk7Ci0JCQlwcmVlbXB0X2VuYWJsZSgpOwotCQl9Ci0JfQotCXJldHVybiBwYWdlOwotfQotI2VuZGlmCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSNkZWZpbmUgRFJNX1JQUl9BUkcodm1hKQotI2Vsc2UKICNkZWZpbmUgRFJNX1JQUl9BUkcodm1hKSB2bWEsCi0jZW5kaWYKIAogI2RlZmluZSBWTV9PRkZTRVQodm1hKSAoKHZtYSktPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpCiAKQEAgLTQ3NCw3ICs0NDUsOCBAQAogCXVuc2lnbmVkIGxvbmcJICBieXRlX2NvdW50OwogCWVudW0gewogCQlfRFJNX0RNQV9VU0VfQUdQID0gMHgwMSwKLQkJX0RSTV9ETUFfVVNFX1NHICA9IDB4MDIKKwkJX0RSTV9ETUFfVVNFX1NHICA9IDB4MDIsCisJCV9EUk1fRE1BX1VTRV9GQiAgPSAweDA0CiAJfSBmbGFnczsKIAogfSBkcm1fZGV2aWNlX2RtYV90OwpAQCAtNTI1LDEyICs0OTcsMTkgQEAKIAlkcm1faHdfbG9ja190ICpsb2NrOwogfSBkcm1fc2lnZGF0YV90OwogCit0eXBlZGVmIHN0cnVjdCBkcm1fZG1hX2hhbmRsZSB7CisJZG1hX2FkZHJfdCBidXNhZGRyOworCXZvaWQgKnZhZGRyOworCXNpemVfdCBzaXplOworfSBkcm1fZG1hX2hhbmRsZV90OworCiAvKioKICAqIE1hcHBpbmdzIGxpc3QKICAqLwogdHlwZWRlZiBzdHJ1Y3QgZHJtX21hcF9saXN0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWhlYWQ7CS8qKjwgbGlzdCBoZWFkICovCiAJZHJtX21hcF90CQkqbWFwOwkvKio8IG1hcHBpbmcgKi8KKwl1bnNpZ25lZCBpbnQgdXNlcl90b2tlbjsKIH0gZHJtX21hcF9saXN0X3Q7CiAKIHR5cGVkZWYgZHJtX21hcF90IGRybV9sb2NhbF9tYXBfdDsKQEAgLTU3OCw3ICs1NTcsMjIgQEAKICAJaW50ICgqa2VybmVsX2NvbnRleHRfc3dpdGNoKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb2xkLCBpbnQgbmV3KTsKIAl2b2lkICgqa2VybmVsX2NvbnRleHRfc3dpdGNoX3VubG9jaykoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2xvY2tfdCAqbG9jayk7CiAJaW50ICgqdmJsYW5rX3dhaXQpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworCQorCS8qKgorCSAqIENhbGxlZCBieSBcYyBkcm1fZGV2aWNlX2lzX2FncC4gIFR5cGljYWxseSB1c2VkIHRvIGRldGVybWluZSBpZiBhCisJICogY2FyZCBpcyByZWFsbHkgYXR0YWNoZWQgdG8gQUdQIG9yIG5vdC4KKwkgKgorCSAqIFxwYXJhbSBkZXYgIERSTSBkZXZpY2UgaGFuZGxlCisJICoKKwkgKiBccmV0dXJucworCSAqIE9uZSBvZiB0aHJlZSB2YWx1ZXMgaXMgcmV0dXJuZWQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHRoZQorCSAqIGNhcmQgaXMgYWJzb2x1dGVseSBcYiBub3QgQUdQIChyZXR1cm4gb2YgMCksIGFic29sdXRlbHkgXGIgaXMgQUdQCisJICogKHJldHVybiBvZiAxKSwgb3IgbWF5IG9yIG1heSBub3QgYmUgQUdQIChyZXR1cm4gb2YgMikuCisJICovCisJaW50ICgqZGV2aWNlX2lzX2FncCkgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKKwogCS8qIHRoZXNlIGhhdmUgdG8gYmUgZmlsbGVkIGluICovCisgIAogIAlpbnQgKCpwb3N0aW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiAJaXJxcmV0dXJuX3QgKCppcnFfaGFuZGxlcikoIERSTV9JUlFfQVJHUyApOwogIAl2b2lkICgqaXJxX3ByZWluc3RhbGwpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtNzIyLDEyICs3MTYsOCBAQAogCWludCAgICAgICAgICAgICAgIHBjaV9zbG90OwkvKio8IFBDSSBzbG90IG51bWJlciAqLwogCWludCAgICAgICAgICAgICAgIHBjaV9mdW5jOwkvKio8IFBDSSBmdW5jdGlvbiBudW1iZXIgKi8KICNpZmRlZiBfX2FscGhhX18KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMykKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xlciAqaG9zZTsKLSNlbHNlCiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogI2VuZGlmCi0jZW5kaWYKIAlkcm1fc2dfbWVtX3QgICAgICAqc2c7ICAvKio8IFNjYXR0ZXIgZ2F0aGVyIG1lbW9yeSAqLwogCXVuc2lnbmVkIGxvbmcgICAgICpjdHhfYml0bWFwOwkvKio8IGNvbnRleHQgYml0bWFwICovCiAJdm9pZAkJICAqZGV2X3ByaXZhdGU7IC8qKjwgZGV2aWNlIHByaXZhdGUgZGF0YSAqLwpAQCAtNzM2LDYgKzcyNiw3IEBACiAKIAlzdHJ1Y3QgICAgICAgICAgICBkcm1fZHJpdmVyICpkcml2ZXI7CiAJZHJtX2xvY2FsX21hcF90ICAgKmFncF9idWZmZXJfbWFwOworCXVuc2lnbmVkIGludCBhZ3BfYnVmZmVyX3Rva2VuOwogCWRybV9oZWFkX3QgcHJpbWFyeTsJCS8qKjwgcHJpbWFyeSBzY3JlZW4gaGVhZCAqLwogfSBkcm1fZGV2aWNlX3Q7CiAKQEAgLTgwNiw3ICs3OTcsNyBAQAogCQkJCQkgICBkcm1fZGV2aWNlX3QgKmRldik7CiBleHRlcm4gdm9pZAkgICAgIGRybV9pb3JlbWFwZnJlZSh2b2lkICpwdCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKmRldik7CiAKLWV4dGVybiBEUk1fQUdQX01FTSAgICpkcm1fYWxsb2NfYWdwKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwgaW50IHBhZ2VzLCB1MzIgdHlwZSk7CitleHRlcm4gRFJNX0FHUF9NRU0gICAqZHJtX2FsbG9jX2FncChkcm1fZGV2aWNlX3QgKmRldiwgaW50IHBhZ2VzLCB1MzIgdHlwZSk7CiBleHRlcm4gaW50ICAgICAgICAgICBkcm1fZnJlZV9hZ3AoRFJNX0FHUF9NRU0gKmhhbmRsZSwgaW50IHBhZ2VzKTsKIGV4dGVybiBpbnQgICAgICAgICAgIGRybV9iaW5kX2FncChEUk1fQUdQX01FTSAqaGFuZGxlLCB1bnNpZ25lZCBpbnQgc3RhcnQpOwogZXh0ZXJuIGludCAgICAgICAgICAgZHJtX3VuYmluZF9hZ3AoRFJNX0FHUF9NRU0gKmhhbmRsZSk7CkBAIC04ODEsMTEgKzg3MiwxOSBAQAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY29udGV4dCk7CiAKIAkJCQkvKiBCdWZmZXIgbWFuYWdlbWVudCBzdXBwb3J0IChkcm1fYnVmcy5oKSAqLworZXh0ZXJuIGludCBkcm1fYWRkYnVmc19hZ3AoZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfZGVzY190ICpyZXF1ZXN0KTsKK2V4dGVybiBpbnQgZHJtX2FkZGJ1ZnNfcGNpKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX2Rlc2NfdCAqcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZGRtYXAoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCSAgICAgIHVuc2lnbmVkIGludCBzaXplLCBkcm1fbWFwX3R5cGVfdCB0eXBlLAorCQkgICAgICBkcm1fbWFwX2ZsYWdzX3QgZmxhZ3MsIGRybV9sb2NhbF9tYXBfdCAqKm1hcF9wdHIpOworZXh0ZXJuIGludCBkcm1fYWRkbWFwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgZHJtX3JtbWFwKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbG9jYWxfbWFwX3QgKm1hcCk7CitleHRlcm4gaW50IGRybV9ybW1hcF9sb2NrZWQoZHJtX2RldmljZV90ICpkZXYsIGRybV9sb2NhbF9tYXBfdCAqbWFwKTsKK2V4dGVybiBpbnQgZHJtX3JtbWFwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCiBleHRlcm4gaW50CSAgICAgZHJtX29yZGVyKCB1bnNpZ25lZCBsb25nIHNpemUgKTsKLWV4dGVybiBpbnQJICAgICBkcm1fYWRkbWFwKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7Ci1leHRlcm4gaW50CSAgICAgZHJtX3JtbWFwKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKIGV4dGVybiBpbnQJICAgICBkcm1fYWRkYnVmcyggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKIGV4dGVybiBpbnQJICAgICBkcm1faW5mb2J1ZnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLApAQCAtODk2LDYgKzg5NSwxMCBAQAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOwogZXh0ZXJuIGludAkgICAgIGRybV9tYXBidWZzKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9zdGFydChkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJICAgIHVuc2lnbmVkIGludCByZXNvdXJjZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX2xlbihkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpOwogCiAJCQkJLyogRE1BIHN1cHBvcnQgKGRybV9kbWEuaCkgKi8KIGV4dGVybiBpbnQJICAgICBkcm1fZG1hX3NldHVwKGRybV9kZXZpY2VfdCAqZGV2KTsKQEAgLTkxOSwxNSArOTIyLDE4IEBACiAKIAkJCQkvKiBBR1AvR0FSVCBzdXBwb3J0IChkcm1fYWdwc3VwcG9ydC5oKSAqLwogZXh0ZXJuIGRybV9hZ3BfaGVhZF90ICpkcm1fYWdwX2luaXQoZHJtX2RldmljZV90ICpkZXYpOwotZXh0ZXJuIGludCAgICAgICAgICAgIGRybV9hZ3BfYWNxdWlyZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIHZvaWQgICAgICAgICAgIGRybV9hZ3BfZG9fcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldik7Ci1leHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF9lbmFibGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCAgICAgICAgICAgIGRybV9hZ3BfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCBkcm1fYWdwX2FjcXVpcmUoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgZHJtX2FncF9hY3F1aXJlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCBkcm1fYWdwX3JlbGVhc2UoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludCBkcm1fYWdwX3JlbGVhc2VfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50IGRybV9hZ3BfZW5hYmxlKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX21vZGVfdCBtb2RlKTsKK2V4dGVybiBpbnQgZHJtX2FncF9lbmFibGVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgZHJtX2FncF9pbmZvKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2FncF9pbmZvX3QgKmluZm8pOworZXh0ZXJuIGludCBkcm1fYWdwX2luZm9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50ICAgICAgICAgICAgZHJtX2FncF9hbGxvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBpbnQgICAgICAgICAgICBkcm1fYWdwX2ZyZWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCkBAIC05NzYsMTIgKzk4MiwxMCBAQAogCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCQkgICAgICAgZG1hX2FkZHJfdCBidXNfYWRkcik7CiAKLWV4dGVybiB2b2lkICpkcm1fcGNpX2FsbG9jKGRybV9kZXZpY2VfdCAqIGRldiwgc2l6ZV90IHNpemUsCi0JCQkgICBzaXplX3QgYWxpZ24sIGRtYV9hZGRyX3QgbWF4YWRkciwKLQkJCSAgIGRtYV9hZGRyX3QgKiBidXNhZGRyKTsKLQotZXh0ZXJuIHZvaWQgZHJtX3BjaV9mcmVlKGRybV9kZXZpY2VfdCAqIGRldiwgc2l6ZV90IHNpemUsCi0JCQkgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgYnVzYWRkcik7CitleHRlcm4gZHJtX2RtYV9oYW5kbGVfdCAqZHJtX3BjaV9hbGxvYyhkcm1fZGV2aWNlX3QgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIHNpemVfdCBhbGlnbiwgZG1hX2FkZHJfdCBtYXhhZGRyKTsKK2V4dGVybiB2b2lkIF9fZHJtX3BjaV9mcmVlKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZG1hX2hhbmRsZV90ICpkbWFoKTsKK2V4dGVybiB2b2lkIGRybV9wY2lfZnJlZShkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2RtYV9oYW5kbGVfdCAqZG1haCk7CiAKIAkJCSAgICAgICAvKiBzeXNmcyBzdXBwb3J0IChkcm1fc3lzZnMuYykgKi8KIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3M7CkBAIC0xMDEyLDE3ICsxMDE2LDI2IEBACiAJCWRybV9pb3JlbWFwZnJlZSggbWFwLT5oYW5kbGUsIG1hcC0+c2l6ZSwgZGV2ICk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBkcm1fbWFwICpkcm1fY29yZV9maW5kbWFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQorc3RhdGljIF9faW5saW5lX18gc3RydWN0IGRybV9tYXAgKmRybV9jb3JlX2ZpbmRtYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHRva2VuKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9saXN0OwotCWxpc3RfZm9yX2VhY2goIF9saXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkICkgewotCQlkcm1fbWFwX2xpc3RfdCAqX2VudHJ5ID0gbGlzdF9lbnRyeSggX2xpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkICk7Ci0JCWlmICggX2VudHJ5LT5tYXAgJiYKLQkJICAgICBfZW50cnktPm1hcC0+b2Zmc2V0ID09IG9mZnNldCApIHsKKwlkcm1fbWFwX2xpc3RfdCAqX2VudHJ5OworCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LT5oZWFkLCBoZWFkKQorCQlpZiAoX2VudHJ5LT51c2VyX3Rva2VuID09IHRva2VuKQogCQkJcmV0dXJuIF9lbnRyeS0+bWFwOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZHJtX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICpkZXYpCit7CisJaWYgKCBkZXYtPmRyaXZlci0+ZGV2aWNlX2lzX2FncCAhPSBOVUxMICkgeworCQlpbnQgZXJyID0gKCpkZXYtPmRyaXZlci0+ZGV2aWNlX2lzX2FncCkoIGRldiApOworCQorCQlpZiAoZXJyICE9IDIpIHsKKwkJCXJldHVybiBlcnI7CiAJCX0KIAl9Ci0JcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYtPnBkZXYsIFBDSV9DQVBfSURfQUdQKTsKIH0KIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBkcm1fY29yZV9kcm9wbWFwKHN0cnVjdCBkcm1fbWFwICptYXApCkBAIC0xMDU4LDUgKzEwNzEsOSBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X21hcF9vZnMoZHJtX21hcF90ICptYXApOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X3JlZ19vZnMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKKyNpZm5kZWYgcGNpX3ByZXR0eV9uYW1lCisjZGVmaW5lIHBjaV9wcmV0dHlfbmFtZShkZXYpICIiCisjZW5kaWYKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jCmluZGV4IDhkOTRjMGIuLjhjMjE1YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9hZ3BzdXBwb3J0LmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpZiBfX09TX0hBU19BR1AKIAogLyoqCi0gKiBBR1AgaW5mb3JtYXRpb24gaW9jdGwuCisgKiBHZXQgQUdQIGluZm9ybWF0aW9uLgogICoKICAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCiAgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCkBAIC00OCw1MSArNDgsNTYgQEAKICAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZCBhY3F1aXJlZCBhbmQgZmlsbHMgaW4gdGhlCiAgKiBkcm1fYWdwX2luZm8gc3RydWN0dXJlIHdpdGggdGhlIGluZm9ybWF0aW9uIGluIGRybV9hZ3BfaGVhZDo6YWdwX2luZm8uCiAgKi8KLWludCBkcm1fYWdwX2luZm8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitpbnQgZHJtX2FncF9pbmZvKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2luZm9fdCAqaW5mbykKIHsKLQlkcm1fZmlsZV90CSAqcHJpdgkgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90CSAqZGV2CSA9IHByaXYtPmhlYWQtPmRldjsKIAlEUk1fQUdQX0tFUk4gICAgICprZXJuOwotCWRybV9hZ3BfaW5mb190ICAgaW5mbzsKIAogCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlrZXJuICAgICAgICAgICAgICAgICAgID0gJmRldi0+YWdwLT5hZ3BfaW5mbzsKLQlpbmZvLmFncF92ZXJzaW9uX21ham9yID0ga2Vybi0+dmVyc2lvbi5tYWpvcjsKLQlpbmZvLmFncF92ZXJzaW9uX21pbm9yID0ga2Vybi0+dmVyc2lvbi5taW5vcjsKLQlpbmZvLm1vZGUgICAgICAgICAgICAgID0ga2Vybi0+bW9kZTsKLQlpbmZvLmFwZXJ0dXJlX2Jhc2UgICAgID0ga2Vybi0+YXBlcl9iYXNlOwotCWluZm8uYXBlcnR1cmVfc2l6ZSAgICAgPSBrZXJuLT5hcGVyX3NpemUgKiAxMDI0ICogMTAyNDsKLQlpbmZvLm1lbW9yeV9hbGxvd2VkICAgID0ga2Vybi0+bWF4X21lbW9yeSA8PCBQQUdFX1NISUZUOwotCWluZm8ubWVtb3J5X3VzZWQgICAgICAgPSBrZXJuLT5jdXJyZW50X21lbW9yeSA8PCBQQUdFX1NISUZUOwotCWluZm8uaWRfdmVuZG9yICAgICAgICAgPSBrZXJuLT5kZXZpY2UtPnZlbmRvcjsKLQlpbmZvLmlkX2RldmljZSAgICAgICAgID0ga2Vybi0+ZGV2aWNlLT5kZXZpY2U7CisJaW5mby0+YWdwX3ZlcnNpb25fbWFqb3IgPSBrZXJuLT52ZXJzaW9uLm1ham9yOworCWluZm8tPmFncF92ZXJzaW9uX21pbm9yID0ga2Vybi0+dmVyc2lvbi5taW5vcjsKKwlpbmZvLT5tb2RlICAgICAgICAgICAgICA9IGtlcm4tPm1vZGU7CisJaW5mby0+YXBlcnR1cmVfYmFzZSAgICAgPSBrZXJuLT5hcGVyX2Jhc2U7CisJaW5mby0+YXBlcnR1cmVfc2l6ZSAgICAgPSBrZXJuLT5hcGVyX3NpemUgKiAxMDI0ICogMTAyNDsKKwlpbmZvLT5tZW1vcnlfYWxsb3dlZCAgICA9IGtlcm4tPm1heF9tZW1vcnkgPDwgUEFHRV9TSElGVDsKKwlpbmZvLT5tZW1vcnlfdXNlZCAgICAgICA9IGtlcm4tPmN1cnJlbnRfbWVtb3J5IDw8IFBBR0VfU0hJRlQ7CisJaW5mby0+aWRfdmVuZG9yICAgICAgICAgPSBrZXJuLT5kZXZpY2UtPnZlbmRvcjsKKwlpbmZvLT5pZF9kZXZpY2UgICAgICAgICA9IGtlcm4tPmRldmljZS0+ZGV2aWNlOwogCi0JaWYgKGNvcHlfdG9fdXNlcigoZHJtX2FncF9pbmZvX3QgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2FncF9pbmZvKTsKKworaW50IGRybV9hZ3BfaW5mb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2FncF9pbmZvX3QgaW5mbzsKKwlpbnQgZXJyOworCisJZXJyID0gZHJtX2FncF9pbmZvKGRldiwgJmluZm8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJCisJaWYgKGNvcHlfdG9fdXNlcigoZHJtX2FncF9pbmZvX3QgX191c2VyICopIGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCiAvKioKLSAqIEFjcXVpcmUgdGhlIEFHUCBkZXZpY2UgKGlvY3RsKS4KKyAqIEFjcXVpcmUgdGhlIEFHUCBkZXZpY2UuCiAgKgotICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KLSAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KLSAqIFxwYXJhbSBjbWQgY29tbWFuZC4KLSAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudC4KKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZSB0aGF0IGlzIHRvIGFjcXVpcmUgQUdQCiAgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLiAKICAqCiAgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBoYXNuJ3QgYmVlbiBhY3F1aXJlZCBiZWZvcmUgYW5kIGNhbGxzCi0gKiBhZ3BfYWNxdWlyZSgpLgorICogXGMgYWdwX2JhY2tlbmRfYWNxdWlyZS4KICAqLwotaW50IGRybV9hZ3BfYWNxdWlyZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK2ludCBkcm1fYWdwX2FjcXVpcmUoZHJtX2RldmljZV90ICpkZXYpCiB7Ci0JZHJtX2ZpbGVfdAkgKnByaXYJID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdAkgKmRldgkgPSBwcml2LT5oZWFkLT5kZXY7Ci0KIAlpZiAoIWRldi0+YWdwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAoZGV2LT5hZ3AtPmFjcXVpcmVkKQpAQCAtMTAyLDkgKzEwNywxMCBAQAogCWRldi0+YWdwLT5hY3F1aXJlZCA9IDE7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGRybV9hZ3BfYWNxdWlyZSk7CiAKIC8qKgotICogUmVsZWFzZSB0aGUgQUdQIGRldmljZSAoaW9jdGwpLgorICogQWNxdWlyZSB0aGUgQUdQIGRldmljZSAoaW9jdGwpLgogICoKICAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCiAgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCkBAIC0xMTIsNjMgKzExOCw4MCBAQAogICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LgogICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KICAqCi0gKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBoYXMgYmVlbiBhY3F1aXJlZCBhbmQgY2FsbHMgYWdwX2JhY2tlbmRfcmVsZWFzZSgpLgorICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaGFzbid0IGJlZW4gYWNxdWlyZWQgYmVmb3JlIGFuZCBjYWxscworICogXGMgYWdwX2JhY2tlbmRfYWNxdWlyZS4KICAqLwotaW50IGRybV9hZ3BfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK2ludCBkcm1fYWdwX2FjcXVpcmVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QJICpwcml2CSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QJICpkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OwotCi0JaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlhZ3BfYmFja2VuZF9yZWxlYXNlKGRldi0+YWdwLT5icmlkZ2UpOwotCWRldi0+YWdwLT5hY3F1aXJlZCA9IDA7Ci0JcmV0dXJuIDA7Ci0KKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCQorCXJldHVybiBkcm1fYWdwX2FjcXVpcmUoIChkcm1fZGV2aWNlX3QgKikgcHJpdi0+aGVhZC0+ZGV2ICk7CiB9CiAKIC8qKgogICogUmVsZWFzZSB0aGUgQUdQIGRldmljZS4KICAqCi0gKiBDYWxscyBhZ3BfYmFja2VuZF9yZWxlYXNlKCkuCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UgdGhhdCBpcyB0byByZWxlYXNlIEFHUAorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBoYXMgYmVlbiBhY3F1aXJlZCBhbmQgY2FsbHMgXGMgYWdwX2JhY2tlbmRfcmVsZWFzZS4KICAqLwotdm9pZCBkcm1fYWdwX2RvX3JlbGVhc2UoZHJtX2RldmljZV90ICpkZXYpCitpbnQgZHJtX2FncF9yZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2KQogewotICBhZ3BfYmFja2VuZF9yZWxlYXNlKGRldi0+YWdwLT5icmlkZ2UpOworCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYWdwX2JhY2tlbmRfcmVsZWFzZShkZXYtPmFncC0+YnJpZGdlKTsKKwlkZXYtPmFncC0+YWNxdWlyZWQgPSAwOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fYWdwX3JlbGVhc2UpOworCitpbnQgZHJtX2FncF9yZWxlYXNlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCQorCXJldHVybiBkcm1fYWdwX3JlbGVhc2UoZGV2KTsKIH0KIAogLyoqCiAgKiBFbmFibGUgdGhlIEFHUCBidXMuCiAgKiAKLSAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCi0gKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCi0gKiBccGFyYW0gY21kIGNvbW1hbmQuCi0gKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSBkcm1fYWdwX21vZGUgc3RydWN0dXJlLgorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlIHRoYXQgaGFzIHByZXZpb3VzbHkgYWNxdWlyZWQgQUdQLgorICogXHBhcmFtIG1vZGUgUmVxdWVzdGVkIEFHUCBtb2RlLgogICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KICAqCiAgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBoYXMgYmVlbiBhY3F1aXJlZCBidXQgbm90IGVuYWJsZWQsIGFuZCBjYWxscwotICogYWdwX2VuYWJsZSgpLgorICogXGMgYWdwX2VuYWJsZS4KICAqLwotaW50IGRybV9hZ3BfZW5hYmxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitpbnQgZHJtX2FncF9lbmFibGUoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfbW9kZV90IG1vZGUpCiB7Ci0JZHJtX2ZpbGVfdAkgKnByaXYJID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdAkgKmRldgkgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2FncF9tb2RlX3QgICBtb2RlOwotCiAJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmbW9kZSwgKGRybV9hZ3BfbW9kZV90IF9fdXNlciAqKWFyZywgc2l6ZW9mKG1vZGUpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KIAlkZXYtPmFncC0+bW9kZSAgICA9IG1vZGUubW9kZTsKIAlhZ3BfZW5hYmxlKGRldi0+YWdwLT5icmlkZ2UsIG1vZGUubW9kZSk7CiAJZGV2LT5hZ3AtPmJhc2UgICAgPSBkZXYtPmFncC0+YWdwX2luZm8uYXBlcl9iYXNlOwogCWRldi0+YWdwLT5lbmFibGVkID0gMTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZHJtX2FncF9lbmFibGUpOworCitpbnQgZHJtX2FncF9lbmFibGVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2FncF9tb2RlX3QgbW9kZTsKKworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZtb2RlLCAoZHJtX2FncF9tb2RlX3QgX191c2VyICopIGFyZywgc2l6ZW9mKG1vZGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2FncF9lbmFibGUoZGV2LCBtb2RlKTsKK30KIAogLyoqCiAgKiBBbGxvY2F0ZSBBR1AgbWVtb3J5LgpAQCAtMjA2LDcgKzIyOSw3IEBACiAJcGFnZXMgPSAocmVxdWVzdC5zaXplICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CiAJdHlwZSA9ICh1MzIpIHJlcXVlc3QudHlwZTsKIAotCWlmICghKG1lbW9yeSA9IGRybV9hbGxvY19hZ3AoZGV2LT5hZ3AtPmJyaWRnZSwgcGFnZXMsIHR5cGUpKSkgeworCWlmICghKG1lbW9yeSA9IGRybV9hbGxvY19hZ3AoZGV2LCBwYWdlcywgdHlwZSkpKSB7CiAJCWRybV9mcmVlKGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9BR1BMSVNUUyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTQwMywxMyArNDI2LDggQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWhlYWQtPm1lbW9yeSA9IE5VTEw7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MDIwNDA4Ci0JaGVhZC0+Y2FudF91c2VfYXBlcnR1cmUgPSAwOwotCWhlYWQtPnBhZ2VfbWFzayA9IH4oMHhmZmYpOwotI2Vsc2UKIAloZWFkLT5jYW50X3VzZV9hcGVydHVyZSA9IGhlYWQtPmFncF9pbmZvLmNhbnRfdXNlX2FwZXJ0dXJlOwogCWhlYWQtPnBhZ2VfbWFzayA9IGhlYWQtPmFncF9pbmZvLnBhZ2VfbWFzazsKLSNlbmRpZgogCiAJcmV0dXJuIGhlYWQ7CiB9CkBAIC00MzYsNiArNDU0LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIGFncF9iaW5kX21lbW9yeShoYW5kbGUsIHN0YXJ0KTsKIH0KK0VYUE9SVF9TWU1CT0woZHJtX2FncF9iaW5kX21lbW9yeSk7CiAKIC8qKiBDYWxscyBhZ3BfdW5iaW5kX21lbW9yeSgpICovCiBpbnQgZHJtX2FncF91bmJpbmRfbWVtb3J5KERSTV9BR1BfTUVNICpoYW5kbGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKaW5kZXggNGM2MTkxZC4uZjI4ZTcwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwpAQCAtMzYsMzcgKzM2LDY5IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgImRybVAuaCIKIAotLyoqCi0gKiBDb21wdXRlIHNpemUgb3JkZXIuICBSZXR1cm5zIHRoZSBleHBvbmVudCBvZiB0aGUgc21hbGxlciBwb3dlciBvZiB0d28gd2hpY2gKLSAqIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gZ2l2ZW4gbnVtYmVyLgotICogCi0gKiBccGFyYW0gc2l6ZSBzaXplLgotICogXHJldHVybiBvcmRlci4KLSAqCi0gKiBcdG9kbyBDYW4gYmUgbWFkZSBmYXN0ZXIuCi0gKi8KLWludCBkcm1fb3JkZXIoIHVuc2lnbmVkIGxvbmcgc2l6ZSApCit1bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCByZXNvdXJjZSkKIHsKLQlpbnQgb3JkZXI7Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlmb3IgKG9yZGVyID0gMCwgdG1wID0gc2l6ZSA+PiAxOyB0bXA7IHRtcCA+Pj0gMSwgb3JkZXIrKykKLQkJOwotCi0JaWYgKHNpemUgJiAoc2l6ZSAtIDEpKQotCQkrK29yZGVyOwotCi0JcmV0dXJuIG9yZGVyOworCXJldHVybiBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCByZXNvdXJjZSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGRybV9vcmRlcik7CitFWFBPUlRfU1lNQk9MKGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQpOwogCi0jaWZkZWYgQ09ORklHX0NPTVBBVAordW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX2xlbihkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50IHJlc291cmNlKQoreworCXJldHVybiBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgcmVzb3VyY2UpOworfQorRVhQT1JUX1NZTUJPTChkcm1fZ2V0X3Jlc291cmNlX2xlbik7CisKK3N0YXRpYyBkcm1fbWFwX2xpc3RfdCAqZHJtX2ZpbmRfbWF0Y2hpbmdfbWFwKGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCQkgICAgIGRybV9sb2NhbF9tYXBfdCAqbWFwKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKKwkJZHJtX21hcF9saXN0X3QgKmVudHJ5ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCWlmIChlbnRyeS0+bWFwICYmIG1hcC0+dHlwZSA9PSBlbnRyeS0+bWFwLT50eXBlICYmCisJCSAgICBlbnRyeS0+bWFwLT5vZmZzZXQgPT0gbWFwLT5vZmZzZXQpIHsKKwkJCXJldHVybiBlbnRyeTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCiAvKgotICogVXNlZCB0byBhbGxvY2F0ZSAzMi1iaXQgaGFuZGxlcyBmb3IgX0RSTV9TSE0gcmVnaW9ucwotICogVGhlIDB4MTAwMDAwMDAgdmFsdWUgaXMgY2hvc2VuIHRvIGJlIG91dCBvZiB0aGUgd2F5IG9mCi0gKiBGQi9yZWdpc3RlciBhbmQgR0FSVCBwaHlzaWNhbCBhZGRyZXNzZXMuCisgKiBVc2VkIHRvIGFsbG9jYXRlIDMyLWJpdCBoYW5kbGVzIGZvciBtYXBwaW5ncy4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBtYXAzMl9oYW5kbGUgPSAweDEwMDAwMDAwOworI2RlZmluZSBTVEFSVF9SQU5HRSAweDEwMDAwMDAwCisjZGVmaW5lIEVORF9SQU5HRSAweDQwMDAwMDAwCisKKyNpZmRlZiBfTFA2NAorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IEhhbmRsZUlEKHVuc2lnbmVkIGxvbmcgbGhhbmRsZSwgZHJtX2RldmljZV90ICpkZXYpIAoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgbWFwMzJfaGFuZGxlID0gU1RBUlRfUkFOR0U7CisJdW5zaWduZWQgaW50IGhhc2g7CisKKwlpZiAobGhhbmRsZSAmIDB4ZmZmZmZmZmYwMDAwMDAwMCkgeworCQloYXNoID0gbWFwMzJfaGFuZGxlOworCQltYXAzMl9oYW5kbGUgKz0gUEFHRV9TSVpFOworCQlpZiAobWFwMzJfaGFuZGxlID4gRU5EX1JBTkdFKQorCQkJbWFwMzJfaGFuZGxlID0gU1RBUlRfUkFOR0U7CisJfSBlbHNlIAorCQloYXNoID0gbGhhbmRsZTsKKworCXdoaWxlICgxKSB7CisJCWRybV9tYXBfbGlzdF90ICpfZW50cnk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LT5oZWFkLGhlYWQpIHsKKwkJCWlmIChfZW50cnktPnVzZXJfdG9rZW4gPT0gaGFzaCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoJl9lbnRyeS0+aGVhZCA9PSAmZGV2LT5tYXBsaXN0LT5oZWFkKQorCQkJcmV0dXJuIGhhc2g7CisKKwkJaGFzaCArPSBQQUdFX1NJWkU7CisJCW1hcDMyX2hhbmRsZSArPSBQQUdFX1NJWkU7CisJfQorfQorI2Vsc2UKKyMgZGVmaW5lIEhhbmRsZUlEKHgsZGV2KSAodW5zaWduZWQgaW50KSh4KQogI2VuZGlmCiAKIC8qKgpAQCAtODIsMjUgKzExNCwyMiBAQAogICogdHlwZS4gIEFkZHMgdGhlIG1hcCB0byB0aGUgbWFwIGxpc3QgZHJtX2RldmljZTo6bWFwbGlzdC4gQWRkcyBNVFJSJ3Mgd2hlcmUKICAqIGFwcGxpY2FibGUgYW5kIGlmIHN1cHBvcnRlZCBieSB0aGUga2VybmVsLgogICovCi1pbnQgZHJtX2FkZG1hcCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCitpbnQgZHJtX2FkZG1hcF9jb3JlKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJICAgIHVuc2lnbmVkIGludCBzaXplLCBkcm1fbWFwX3R5cGVfdCB0eXBlLAorCQkgICAgZHJtX21hcF9mbGFnc190IGZsYWdzLCBkcm1fbWFwX2xpc3RfdCAqKm1hcGxpc3QpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1fbWFwX3QgKm1hcDsKLQlkcm1fbWFwX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9tYXBfbGlzdF90ICpsaXN0OwotCi0JaWYgKCAhKGZpbHAtPmZfbW9kZSAmIDMpICkgcmV0dXJuIC1FQUNDRVM7IC8qIFJlcXVpcmUgcmVhZC93cml0ZSAqLworCWRybV9kbWFfaGFuZGxlX3QgKmRtYWg7CiAKIAltYXAgPSBkcm1fYWxsb2MoIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTICk7CiAJaWYgKCAhbWFwICkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoIGNvcHlfZnJvbV91c2VyKCBtYXAsIGFyZ3AsIHNpemVvZigqbWFwKSApICkgewotCQlkcm1fZnJlZSggbWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyApOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisJbWFwLT5vZmZzZXQgPSBvZmZzZXQ7CisJbWFwLT5zaXplID0gc2l6ZTsKKwltYXAtPmZsYWdzID0gZmxhZ3M7CisJbWFwLT50eXBlID0gdHlwZTsKIAogCS8qIE9ubHkgYWxsb3cgc2hhcmVkIG1lbW9yeSB0byBiZSByZW1vdmFibGUgc2luY2Ugd2Ugb25seSBrZWVwIGVub3VnaAogCSAqIGJvb2sga2VlcGluZyBpbmZvcm1hdGlvbiBhYm91dCBzaGFyZWQgbWVtb3J5IHRvIGFsbG93IGZvciByZW1vdmFsCkBAIC0xMjIsNyArMTUxLDcgQEAKIAlzd2l0Y2ggKCBtYXAtPnR5cGUgKSB7CiAJY2FzZSBfRFJNX1JFR0lTVEVSUzoKIAljYXNlIF9EUk1fRlJBTUVfQlVGRkVSOgotI2lmICFkZWZpbmVkKF9fc3BhcmNfXykgJiYgIWRlZmluZWQoX19hbHBoYV9fKSAmJiAhZGVmaW5lZChfX2lhNjRfXykKKyNpZiAhZGVmaW5lZChfX3NwYXJjX18pICYmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19pYTY0X18pICYmICFkZWZpbmVkKF9fcG93ZXJwYzY0X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCiAJCWlmICggbWFwLT5vZmZzZXQgKyBtYXAtPnNpemUgPCBtYXAtPm9mZnNldCB8fAogCQkgICAgIG1hcC0+b2Zmc2V0IDwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSApIHsKIAkJCWRybV9mcmVlKCBtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTICk7CkBAIC0xMzIsNiArMTYxLDI0IEBACiAjaWZkZWYgX19hbHBoYV9fCiAJCW1hcC0+b2Zmc2V0ICs9IGRldi0+aG9zZS0+bWVtX3NwYWNlLT5zdGFydDsKICNlbmRpZgorCQkvKiBTb21lIGRyaXZlcnMgcHJlaW5pdGlhbGl6ZSBzb21lIG1hcHMsIHdpdGhvdXQgdGhlIFggU2VydmVyCisJCSAqIG5lZWRpbmcgdG8gYmUgYXdhcmUgb2YgaXQuICBUaGVyZWZvcmUsIHdlIGp1c3QgcmV0dXJuIHN1Y2Nlc3MKKwkJICogd2hlbiB0aGUgc2VydmVyIHRyaWVzIHRvIGNyZWF0ZSBhIGR1cGxpY2F0ZSBtYXAuCisJCSAqLworCQlsaXN0ID0gZHJtX2ZpbmRfbWF0Y2hpbmdfbWFwKGRldiwgbWFwKTsKKwkJaWYgKGxpc3QgIT0gTlVMTCkgeworCQkJaWYgKGxpc3QtPm1hcC0+c2l6ZSAhPSBtYXAtPnNpemUpIHsKKwkJCQlEUk1fREVCVUcoIk1hdGNoaW5nIG1hcHMgb2YgdHlwZSAlZCB3aXRoICIKKwkJCQkgICAibWlzbWF0Y2hlZCBzaXplcywgKCVsZCB2cyAlbGQpXG4iLAorCQkJCSAgICBtYXAtPnR5cGUsIG1hcC0+c2l6ZSwgbGlzdC0+bWFwLT5zaXplKTsKKwkJCQlsaXN0LT5tYXAtPnNpemUgPSBtYXAtPnNpemU7CisJCQl9CisKKwkJCWRybV9mcmVlKG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMpOworCQkJKm1hcGxpc3QgPSBsaXN0OworCQkJcmV0dXJuIDA7CisJCX0KKwogCQlpZiAoZHJtX2NvcmVfaGFzX01UUlIoZGV2KSkgewogCQkJaWYgKCBtYXAtPnR5cGUgPT0gX0RSTV9GUkFNRV9CVUZGRVIgfHwKIAkJCSAgICAgKG1hcC0+ZmxhZ3MgJiBfRFJNX1dSSVRFX0NPTUJJTklORykgKSB7CkBAIC0xNzgsOSArMjI1LDIyIEBACiAJCQlkcm1fZnJlZShtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCW1hcC0+b2Zmc2V0ICs9IGRldi0+c2ctPmhhbmRsZTsKKwkJbWFwLT5vZmZzZXQgKz0gKHVuc2lnbmVkIGxvbmcpZGV2LT5zZy0+dmlydHVhbDsKIAkJYnJlYWs7Ci0KKwljYXNlIF9EUk1fQ09OU0lTVEVOVDogCisJCS8qIGRtYV9hZGRyX3QgaXMgNjRiaXQgb24gaTM4NiB3aXRoIENPTkZJR19ISUdITUVNNjRHLAorCQkgKiBBcyB3ZSdyZSBsaW1pdGluZyB0aGUgYWRkcmVzcyB0byAyXjMyLTEgKG9yIGxlc3MpLAorCQkgKiBjYXN0aW5nIGl0IGRvd24gdG8gMzIgYml0cyBpcyBubyBwcm9ibGVtLCBidXQgd2UKKwkJICogbmVlZCB0byBwb2ludCB0byBhIDY0Yml0IHZhcmlhYmxlIGZpcnN0LiAqLworCQlkbWFoID0gZHJtX3BjaV9hbGxvYyhkZXYsIG1hcC0+c2l6ZSwgbWFwLT5zaXplLCAweGZmZmZmZmZmVUwpOworCQlpZiAoIWRtYWgpIHsKKwkJCWRybV9mcmVlKG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWFwLT5oYW5kbGUgPSBkbWFoLT52YWRkcjsKKwkJbWFwLT5vZmZzZXQgPSAodW5zaWduZWQgbG9uZylkbWFoLT5idXNhZGRyOworCQlrZnJlZShkbWFoKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZHJtX2ZyZWUoIG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMgKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTYsMTcgKzI1Niw1NyBAQAogCiAJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKIAlsaXN0X2FkZCgmbGlzdC0+aGVhZCwgJmRldi0+bWFwbGlzdC0+aGVhZCk7Ci0jaWZkZWYgQ09ORklHX0NPTVBBVAotCS8qIEFzc2lnbiBhIDMyLWJpdCBoYW5kbGUgZm9yIF9EUk1fU0hNIG1hcHBpbmdzICovCisJLyogQXNzaWduIGEgMzItYml0IGhhbmRsZSAqLwogCS8qIFdlIGRvIGl0IGhlcmUgc28gdGhhdCBkZXYtPnN0cnVjdF9zZW0gcHJvdGVjdHMgdGhlIGluY3JlbWVudCAqLwotCWlmIChtYXAtPnR5cGUgPT0gX0RSTV9TSE0pCi0JCW1hcC0+b2Zmc2V0ID0gbWFwMzJfaGFuZGxlICs9IFBBR0VfU0laRTsKLSNlbmRpZgorCWxpc3QtPnVzZXJfdG9rZW4gPSBIYW5kbGVJRChtYXAtPnR5cGU9PV9EUk1fU0hNCisJCQkJICAgID8gKHVuc2lnbmVkIGxvbmcpbWFwLT5oYW5kbGUKKwkJCQkgICAgOiBtYXAtPm9mZnNldCwgZGV2KTsKICAJdXAoJmRldi0+c3RydWN0X3NlbSk7CiAKLQlpZiAoIGNvcHlfdG9fdXNlciggYXJncCwgbWFwLCBzaXplb2YoKm1hcCkgKSApCisJKm1hcGxpc3QgPSBsaXN0OworCXJldHVybiAwOworfQorCitpbnQgZHJtX2FkZG1hcChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkgICAgICAgdW5zaWduZWQgaW50IHNpemUsIGRybV9tYXBfdHlwZV90IHR5cGUsCisJICAgICAgIGRybV9tYXBfZmxhZ3NfdCBmbGFncywgZHJtX2xvY2FsX21hcF90ICoqbWFwX3B0cikKK3sKKwlkcm1fbWFwX2xpc3RfdCAqbGlzdDsKKwlpbnQgcmM7CisKKwlyYyA9IGRybV9hZGRtYXBfY29yZShkZXYsIG9mZnNldCwgc2l6ZSwgdHlwZSwgZmxhZ3MsICZsaXN0KTsKKwlpZiAoIXJjKQorCQkqbWFwX3B0ciA9IGxpc3QtPm1hcDsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9hZGRtYXApOworCitpbnQgZHJtX2FkZG1hcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9tYXBfdCBtYXA7CisJZHJtX21hcF9saXN0X3QgKm1hcGxpc3Q7CisJZHJtX21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgZXJyOworCisJaWYgKCEoZmlscC0+Zl9tb2RlICYgMykpCisJCXJldHVybiAtRUFDQ0VTOwkvKiBSZXF1aXJlIHJlYWQvd3JpdGUgKi8KKworCWlmIChjb3B5X2Zyb21fdXNlcigmIG1hcCwgYXJncCwgc2l6ZW9mKG1hcCkpKSB7CiAJCXJldHVybiAtRUZBVUxUOwotCWlmIChjb3B5X3RvX3VzZXIoJmFyZ3AtPmhhbmRsZSwgJm1hcC0+b2Zmc2V0LCBzaXplb2YobWFwLT5vZmZzZXQpKSkKKwl9CisKKwllcnIgPSBkcm1fYWRkbWFwX2NvcmUoZGV2LCBtYXAub2Zmc2V0LCBtYXAuc2l6ZSwgbWFwLnR5cGUsIG1hcC5mbGFncywKKwkJCSAgICAgICZtYXBsaXN0KTsKKworCWlmIChlcnIpIAorCQlyZXR1cm4gZXJyOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBtYXBsaXN0LT5tYXAsIHNpemVvZihkcm1fbWFwX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHB1dF91c2VyKG1hcGxpc3QtPnVzZXJfdG9rZW4sICZhcmdwLT5oYW5kbGUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KQEAgLTIyNiw4MSArMzI2LDEzOCBAQAogICogaXRzIGJlaW5nIHVzZWQsIGFuZCBmcmVlIGFueSBhc3NvY2lhdGUgcmVzb3VyY2UgKHN1Y2ggYXMgTVRSUidzKSBpZiBpdCdzIG5vdAogICogYmVpbmcgb24gdXNlLgogICoKLSAqIFxzYSBhZGRtYXAoKS4KKyAqIFxzYSBkcm1fYWRkbWFwCiAgKi8KLWludCBkcm1fcm1tYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoraW50IGRybV9ybW1hcF9sb2NrZWQoZHJtX2RldmljZV90ICpkZXYsIGRybV9sb2NhbF9tYXBfdCAqbWFwKQogewotCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5oZWFkLT5kZXY7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gTlVMTDsKLQlkcm1fdm1hX2VudHJ5X3QgKnB0LCAqcHJldjsKLQlkcm1fbWFwX3QgKm1hcDsKLQlkcm1fbWFwX3QgcmVxdWVzdDsKLQlpbnQgZm91bmRfbWFwcyA9IDA7CisJZHJtX2RtYV9oYW5kbGVfdCBkbWFoOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoZHJtX21hcF90IF9fdXNlciAqKWFyZywKLQkJCSAgIHNpemVvZihyZXF1ZXN0KSkpIHsKKwkvKiBGaW5kIHRoZSBsaXN0IGVudHJ5IGZvciB0aGUgbWFwIGFuZCByZW1vdmUgaXQgKi8KKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKKwkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisKKwkJaWYgKHJfbGlzdC0+bWFwID09IG1hcCkgeworCQkJbGlzdF9kZWwobGlzdCk7CisJCQlkcm1fZnJlZShsaXN0LCBzaXplb2YoKmxpc3QpLCBEUk1fTUVNX01BUFMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBMaXN0IGhhcyB3cmFwcGVkIGFyb3VuZCB0byB0aGUgaGVhZCBwb2ludGVyLCBvciBpdCdzIGVtcHR5IGFuZCB3ZQorCSAqIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorCSAqLworCWlmIChsaXN0ID09ICgmZGV2LT5tYXBsaXN0LT5oZWFkKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKG1hcC0+dHlwZSkgeworCWNhc2UgX0RSTV9SRUdJU1RFUlM6CisJCWRybV9pb3JlbWFwZnJlZShtYXAtPmhhbmRsZSwgbWFwLT5zaXplLCBkZXYpOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgX0RSTV9GUkFNRV9CVUZGRVI6CisJCWlmIChkcm1fY29yZV9oYXNfTVRSUihkZXYpICYmIG1hcC0+bXRyciA+PSAwKSB7CisJCQlpbnQgcmV0Y29kZTsKKwkJCXJldGNvZGUgPSBtdHJyX2RlbChtYXAtPm10cnIsIG1hcC0+b2Zmc2V0LAorCQkJCQkgICBtYXAtPnNpemUpOworCQkJRFJNX0RFQlVHICgibXRycl9kZWw9JWRcbiIsIHJldGNvZGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgX0RSTV9TSE06CisJCXZmcmVlKG1hcC0+aGFuZGxlKTsKKwkJYnJlYWs7CisJY2FzZSBfRFJNX0FHUDoKKwljYXNlIF9EUk1fU0NBVFRFUl9HQVRIRVI6CisJCWJyZWFrOworCWNhc2UgX0RSTV9DT05TSVNURU5UOgorCQlkbWFoLnZhZGRyID0gbWFwLT5oYW5kbGU7CisJCWRtYWguYnVzYWRkciA9IG1hcC0+b2Zmc2V0OworCQlkbWFoLnNpemUgPSBtYXAtPnNpemU7CisJCV9fZHJtX3BjaV9mcmVlKGRldiwgJmRtYWgpOworCQlicmVhazsKKwl9CisJZHJtX2ZyZWUobWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX3JtbWFwX2xvY2tlZCk7CisKK2ludCBkcm1fcm1tYXAoZHJtX2RldmljZV90ICpkZXYsIGRybV9sb2NhbF9tYXBfdCAqbWFwKQoreworCWludCByZXQ7CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCXJldCA9IGRybV9ybW1hcF9sb2NrZWQoZGV2LCBtYXApOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX3JtbWFwKTsKKworLyogVGhlIHJtbWFwIGlvY3RsIGFwcGVhcnMgdG8gYmUgdW5uZWNlc3NhcnkuICBBbGwgbWFwcGluZ3MgYXJlIHRvcm4gZG93biBvbgorICogdGhlIGxhc3QgY2xvc2Ugb2YgdGhlIGRldmljZSwgYW5kIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBjbGVhbnVwIHdoZW4gdGhpbmdzCisgKiBleGl0IHVuY2xlYW5seS4gIFRoZXJlZm9yZSwgaGF2aW5nIHVzZXJsYW5kIG1hbnVhbGx5IHJlbW92ZSBtYXBwaW5ncyBzZWVtcworICogbGlrZSBhIHBvaW50bGVzcyBleGVyY2lzZSBzaW5jZSB0aGV5J3JlIGdvaW5nIGF3YXkgYW55d2F5LgorICoKKyAqIE9uZSB1c2UgY2FzZSBtaWdodCBiZSBhZnRlciBhZGRtYXAgaXMgYWxsb3dlZCBmb3Igbm9ybWFsIHVzZXJzIGZvciBTSE0gYW5kCisgKiBnZXRzIHVzZWQgYnkgZHJpdmVycyB0aGF0IHRoZSBzZXJ2ZXIgZG9lc24ndCBuZWVkIHRvIGNhcmUgYWJvdXQuICBUaGlzIHNlZW1zCisgKiB1bmxpa2VseS4KKyAqLworaW50IGRybV9ybW1hcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX21hcF90IHJlcXVlc3Q7CisJZHJtX2xvY2FsX21hcF90ICptYXAgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJaW50IHJldDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgKGRybV9tYXBfdCBfX3VzZXIgKilhcmcsIHNpemVvZihyZXF1ZXN0KSkpIHsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKLQlsaXN0ID0gJmRldi0+bWFwbGlzdC0+aGVhZDsKIAlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKIAotCQlpZihyX2xpc3QtPm1hcCAmJgotCQkgICByX2xpc3QtPm1hcC0+b2Zmc2V0ID09ICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0LmhhbmRsZSAmJgotCQkgICByX2xpc3QtPm1hcC0+ZmxhZ3MgJiBfRFJNX1JFTU9WQUJMRSkgYnJlYWs7CisJCWlmIChyX2xpc3QtPm1hcCAmJgorCQkgICAgcl9saXN0LT51c2VyX3Rva2VuID09ICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0LmhhbmRsZSAmJgorCQkgICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9SRU1PVkFCTEUpIHsKKwkJCW1hcCA9IHJfbGlzdC0+bWFwOworCQkJYnJlYWs7CisJCX0KIAl9CiAKIAkvKiBMaXN0IGhhcyB3cmFwcGVkIGFyb3VuZCB0byB0aGUgaGVhZCBwb2ludGVyLCBvciBpdHMgZW1wdHkgd2UgZGlkbid0CiAJICogZmluZCBhbnl0aGluZy4KIAkgKi8KLQlpZihsaXN0ID09ICgmZGV2LT5tYXBsaXN0LT5oZWFkKSkgeworCWlmIChsaXN0ID09ICgmZGV2LT5tYXBsaXN0LT5oZWFkKSkgewogCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCW1hcCA9IHJfbGlzdC0+bWFwOwotCWxpc3RfZGVsKGxpc3QpOwotCWRybV9mcmVlKGxpc3QsIHNpemVvZigqbGlzdCksIERSTV9NRU1fTUFQUyk7CiAKLQlmb3IgKHB0ID0gZGV2LT52bWFsaXN0LCBwcmV2ID0gTlVMTDsgcHQ7IHByZXYgPSBwdCwgcHQgPSBwdC0+bmV4dCkgewotCQlpZiAocHQtPnZtYS0+dm1fcHJpdmF0ZV9kYXRhID09IG1hcCkgZm91bmRfbWFwcysrOworCWlmICghbWFwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFJlZ2lzdGVyIGFuZCBmcmFtZWJ1ZmZlciBtYXBzIGFyZSBwZXJtYW5lbnQgKi8KKwlpZiAoKG1hcC0+dHlwZSA9PSBfRFJNX1JFR0lTVEVSUykgfHwgKG1hcC0+dHlwZSA9PSBfRFJNX0ZSQU1FX0JVRkZFUikpIHsKKwkJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJCXJldHVybiAwOwogCX0KIAotCWlmKCFmb3VuZF9tYXBzKSB7Ci0JCXN3aXRjaCAobWFwLT50eXBlKSB7Ci0JCWNhc2UgX0RSTV9SRUdJU1RFUlM6Ci0JCWNhc2UgX0RSTV9GUkFNRV9CVUZGRVI6Ci0JCSAgaWYgKGRybV9jb3JlX2hhc19NVFJSKGRldikpIHsKLQkJCQlpZiAobWFwLT5tdHJyID49IDApIHsKLQkJCQkJaW50IHJldGNvZGU7Ci0JCQkJCXJldGNvZGUgPSBtdHJyX2RlbChtYXAtPm10cnIsCi0JCQkJCQkJICAgbWFwLT5vZmZzZXQsCi0JCQkJCQkJICAgbWFwLT5zaXplKTsKLQkJCQkJRFJNX0RFQlVHKCJtdHJyX2RlbCA9ICVkXG4iLCByZXRjb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkcm1faW9yZW1hcGZyZWUobWFwLT5oYW5kbGUsIG1hcC0+c2l6ZSwgZGV2KTsKLQkJCWJyZWFrOwotCQljYXNlIF9EUk1fU0hNOgotCQkJdmZyZWUobWFwLT5oYW5kbGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgX0RSTV9BR1A6Ci0JCWNhc2UgX0RSTV9TQ0FUVEVSX0dBVEhFUjoKLQkJCWJyZWFrOwotCQl9Ci0JCWRybV9mcmVlKG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMpOwotCX0KKwlyZXQgPSBkcm1fcm1tYXBfbG9ja2VkKGRldiwgbWFwKTsKKwogCXVwKCZkZXYtPnN0cnVjdF9zZW0pOwotCXJldHVybiAwOworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCiAgKiBDbGVhbnVwIGFmdGVyIGFuIGVycm9yIG9uIG9uZSBvZiB0aGUgYWRkYnVmcygpIGZ1bmN0aW9ucy4KICAqCisgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCiAgKiBccGFyYW0gZW50cnkgYnVmZmVyIGVudHJ5IHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KICAqCiAgKiBGcmVlcyBhbnkgcGFnZXMgYW5kIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBlbnRyeS4KQEAgLTM0NCwyNSArNTAxLDE5IEBACiAKICNpZiBfX09TX0hBU19BR1AKIC8qKgotICogQWRkIEFHUCBidWZmZXJzIGZvciBETUEgdHJhbnNmZXJzIChpb2N0bCkuCisgKiBBZGQgQUdQIGJ1ZmZlcnMgZm9yIERNQSB0cmFuc2ZlcnMuCiAgKgotICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KLSAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KLSAqIFxwYXJhbSBjbWQgY29tbWFuZC4KLSAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9idWZfZGVzY190IHJlcXVlc3QuCisgKiBccGFyYW0gZGV2IGRybV9kZXZpY2VfdCB0byB3aGljaCB0aGUgYnVmZmVycyBhcmUgdG8gYmUgYWRkZWQuCisgKiBccGFyYW0gcmVxdWVzdCBwb2ludGVyIHRvIGEgZHJtX2J1Zl9kZXNjX3QgZGVzY3JpYmluZyB0aGUgcmVxdWVzdC4KICAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCiAgKiAKICAqIEFmdGVyIHNvbWUgc2FuaXR5IGNoZWNrcyBjcmVhdGVzIGEgZHJtX2J1ZiBzdHJ1Y3R1cmUgZm9yIGVhY2ggYnVmZmVyIGFuZAogICogcmVhbGxvY2F0ZXMgdGhlIGJ1ZmZlciBsaXN0IG9mIHRoZSBzYW1lIHNpemUgb3JkZXIgdG8gYWNjb21tb2RhdGUgdGhlIG5ldwogICogYnVmZmVycy4KICAqLwotc3RhdGljIGludCBkcm1fYWRkYnVmc19hZ3AoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK2ludCBkcm1fYWRkYnVmc19hZ3AoZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfZGVzY190ICpyZXF1ZXN0KQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl9kZXNjX3QgcmVxdWVzdDsKIAlkcm1fYnVmX2VudHJ5X3QgKmVudHJ5OwogCWRybV9idWZfdCAqYnVmOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwpAQCAtMzc2LDI1ICs1MjcsMjAgQEAKIAlpbnQgYnl0ZV9jb3VudDsKIAlpbnQgaTsKIAlkcm1fYnVmX3QgKip0ZW1wX2J1Zmxpc3Q7Ci0JZHJtX2J1Zl9kZXNjX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCiAJaWYgKCAhZG1hICkgcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIGNvcHlfZnJvbV91c2VyKCAmcmVxdWVzdCwgYXJncCwKLQkJCSAgICAgc2l6ZW9mKHJlcXVlc3QpICkgKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWNvdW50ID0gcmVxdWVzdC5jb3VudDsKLQlvcmRlciA9IGRybV9vcmRlciggcmVxdWVzdC5zaXplICk7CisJY291bnQgPSByZXF1ZXN0LT5jb3VudDsKKwlvcmRlciA9IGRybV9vcmRlcihyZXF1ZXN0LT5zaXplKTsKIAlzaXplID0gMSA8PCBvcmRlcjsKIAotCWFsaWdubWVudCAgPSAocmVxdWVzdC5mbGFncyAmIF9EUk1fUEFHRV9BTElHTikKKwlhbGlnbm1lbnQgID0gKHJlcXVlc3QtPmZsYWdzICYgX0RSTV9QQUdFX0FMSUdOKQogCQk/IFBBR0VfQUxJR04oc2l6ZSkgOiBzaXplOwogCXBhZ2Vfb3JkZXIgPSBvcmRlciAtIFBBR0VfU0hJRlQgPiAwID8gb3JkZXIgLSBQQUdFX1NISUZUIDogMDsKIAl0b3RhbCA9IFBBR0VfU0laRSA8PCBwYWdlX29yZGVyOwogCiAJYnl0ZV9jb3VudCA9IDA7Ci0JYWdwX29mZnNldCA9IGRldi0+YWdwLT5iYXNlICsgcmVxdWVzdC5hZ3Bfc3RhcnQ7CisJYWdwX29mZnNldCA9IGRldi0+YWdwLT5iYXNlICsgcmVxdWVzdC0+YWdwX3N0YXJ0OwogCiAJRFJNX0RFQlVHKCAiY291bnQ6ICAgICAgJWRcbiIsICBjb3VudCApOwogCURSTV9ERUJVRyggIm9yZGVyOiAgICAgICVkXG4iLCAgb3JkZXIgKTsKQEAgLTUwOCwyNiArNjU0LDIwIEBACiAKIAl1cCggJmRldi0+c3RydWN0X3NlbSApOwogCi0JcmVxdWVzdC5jb3VudCA9IGVudHJ5LT5idWZfY291bnQ7Ci0JcmVxdWVzdC5zaXplID0gc2l6ZTsKLQotCWlmICggY29weV90b191c2VyKCBhcmdwLCAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpICkgKQotCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXF1ZXN0LT5jb3VudCA9IGVudHJ5LT5idWZfY291bnQ7CisJcmVxdWVzdC0+c2l6ZSA9IHNpemU7CiAKIAlkbWEtPmZsYWdzID0gX0RSTV9ETUFfVVNFX0FHUDsKIAogCWF0b21pY19kZWMoICZkZXYtPmJ1Zl9hbGxvYyApOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChkcm1fYWRkYnVmc19hZ3ApOwogI2VuZGlmIC8qIF9fT1NfSEFTX0FHUCAqLwogCi1zdGF0aWMgaW50IGRybV9hZGRidWZzX3BjaSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoraW50IGRybV9hZGRidWZzX3BjaShkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2J1Zl9kZXNjX3QgKnJlcXVlc3QpCiB7Ci0gICAJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OwogCWludCBjb3VudDsKIAlpbnQgb3JkZXI7CiAJaW50IHNpemU7CkBAIC01NDMsMjYgKzY4MywyMiBAQAogCWludCBwYWdlX2NvdW50OwogCXVuc2lnbmVkIGxvbmcgKnRlbXBfcGFnZWxpc3Q7CiAJZHJtX2J1Zl90ICoqdGVtcF9idWZsaXN0OwotCWRybV9idWZfZGVzY190IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9QQ0lfRE1BKSkgcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCAhZG1hICkgcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIGNvcHlfZnJvbV91c2VyKCAmcmVxdWVzdCwgYXJncCwgc2l6ZW9mKHJlcXVlc3QpICkgKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWNvdW50ID0gcmVxdWVzdC5jb3VudDsKLQlvcmRlciA9IGRybV9vcmRlciggcmVxdWVzdC5zaXplICk7CisJY291bnQgPSByZXF1ZXN0LT5jb3VudDsKKwlvcmRlciA9IGRybV9vcmRlcihyZXF1ZXN0LT5zaXplKTsKIAlzaXplID0gMSA8PCBvcmRlcjsKIAogCURSTV9ERUJVRyggImNvdW50PSVkLCBzaXplPSVkICglZCksIG9yZGVyPSVkLCBxdWV1ZV9jb3VudD0lZFxuIiwKLQkJICAgcmVxdWVzdC5jb3VudCwgcmVxdWVzdC5zaXplLCBzaXplLAorCQkgICByZXF1ZXN0LT5jb3VudCwgcmVxdWVzdC0+c2l6ZSwgc2l6ZSwKIAkJICAgb3JkZXIsIGRldi0+cXVldWVfY291bnQgKTsKIAogCWlmICggb3JkZXIgPCBEUk1fTUlOX09SREVSIHx8IG9yZGVyID4gRFJNX01BWF9PUkRFUiApIHJldHVybiAtRUlOVkFMOwogCWlmICggZGV2LT5xdWV1ZV9jb3VudCApIHJldHVybiAtRUJVU1k7IC8qIE5vdCB3aGlsZSBpbiB1c2UgKi8KIAotCWFsaWdubWVudCA9IChyZXF1ZXN0LmZsYWdzICYgX0RSTV9QQUdFX0FMSUdOKQorCWFsaWdubWVudCA9IChyZXF1ZXN0LT5mbGFncyAmIF9EUk1fUEFHRV9BTElHTikKIAkJPyBQQUdFX0FMSUdOKHNpemUpIDogc2l6ZTsKIAlwYWdlX29yZGVyID0gb3JkZXIgLSBQQUdFX1NISUZUID4gMCA/IG9yZGVyIC0gUEFHRV9TSElGVCA6IDA7CiAJdG90YWwgPSBQQUdFX1NJWkUgPDwgcGFnZV9vcmRlcjsKQEAgLTc0MCwyNSArODc2LDE4IEBACiAKIAl1cCggJmRldi0+c3RydWN0X3NlbSApOwogCi0JcmVxdWVzdC5jb3VudCA9IGVudHJ5LT5idWZfY291bnQ7Ci0JcmVxdWVzdC5zaXplID0gc2l6ZTsKLQotCWlmICggY29weV90b191c2VyKCBhcmdwLCAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpICkgKQotCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXF1ZXN0LT5jb3VudCA9IGVudHJ5LT5idWZfY291bnQ7CisJcmVxdWVzdC0+c2l6ZSA9IHNpemU7CiAKIAlhdG9taWNfZGVjKCAmZGV2LT5idWZfYWxsb2MgKTsKIAlyZXR1cm4gMDsKIAogfQorRVhQT1JUX1NZTUJPTChkcm1fYWRkYnVmc19wY2kpOwogCi1zdGF0aWMgaW50IGRybV9hZGRidWZzX3NnKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3N0YXRpYyBpbnQgZHJtX2FkZGJ1ZnNfc2coZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfZGVzY190ICpyZXF1ZXN0KQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl9kZXNjX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9idWZfZGVzY190IHJlcXVlc3Q7CiAJZHJtX2J1Zl9lbnRyeV90ICplbnRyeTsKIAlkcm1fYnVmX3QgKmJ1ZjsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKQEAgLTc3NywyMCArOTA2LDE3IEBACiAJCiAJaWYgKCAhZG1hICkgcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIGNvcHlfZnJvbV91c2VyKCAmcmVxdWVzdCwgYXJncCwgc2l6ZW9mKHJlcXVlc3QpICkgKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWNvdW50ID0gcmVxdWVzdC5jb3VudDsKLQlvcmRlciA9IGRybV9vcmRlciggcmVxdWVzdC5zaXplICk7CisJY291bnQgPSByZXF1ZXN0LT5jb3VudDsKKwlvcmRlciA9IGRybV9vcmRlcihyZXF1ZXN0LT5zaXplKTsKIAlzaXplID0gMSA8PCBvcmRlcjsKIAotCWFsaWdubWVudCAgPSAocmVxdWVzdC5mbGFncyAmIF9EUk1fUEFHRV9BTElHTikKKwlhbGlnbm1lbnQgID0gKHJlcXVlc3QtPmZsYWdzICYgX0RSTV9QQUdFX0FMSUdOKQogCQkJPyBQQUdFX0FMSUdOKHNpemUpIDogc2l6ZTsKIAlwYWdlX29yZGVyID0gb3JkZXIgLSBQQUdFX1NISUZUID4gMCA/IG9yZGVyIC0gUEFHRV9TSElGVCA6IDA7CiAJdG90YWwgPSBQQUdFX1NJWkUgPDwgcGFnZV9vcmRlcjsKIAogCWJ5dGVfY291bnQgPSAwOwotCWFncF9vZmZzZXQgPSByZXF1ZXN0LmFncF9zdGFydDsKKwlhZ3Bfb2Zmc2V0ID0gcmVxdWVzdC0+YWdwX3N0YXJ0OwogCiAJRFJNX0RFQlVHKCAiY291bnQ6ICAgICAgJWRcbiIsICBjb3VudCApOwogCURSTV9ERUJVRyggIm9yZGVyOiAgICAgICVkXG4iLCAgb3JkZXIgKTsKQEAgLTg0OCw3ICs5NzQsOCBAQAogCiAJCWJ1Zi0+b2Zmc2V0ICA9IChkbWEtPmJ5dGVfY291bnQgKyBvZmZzZXQpOwogCQlidWYtPmJ1c19hZGRyZXNzID0gYWdwX29mZnNldCArIG9mZnNldDsKLQkJYnVmLT5hZGRyZXNzID0gKHZvaWQgKikoYWdwX29mZnNldCArIG9mZnNldCArIGRldi0+c2ctPmhhbmRsZSk7CisJCWJ1Zi0+YWRkcmVzcyA9ICh2b2lkICopKGFncF9vZmZzZXQgKyBvZmZzZXQgCisJCQkJCSsgKHVuc2lnbmVkIGxvbmcpZGV2LT5zZy0+dmlydHVhbCk7CiAJCWJ1Zi0+bmV4dCAgICA9IE5VTEw7CiAJCWJ1Zi0+d2FpdGluZyA9IDA7CiAJCWJ1Zi0+cGVuZGluZyA9IDA7CkBAIC05MDUsMTEgKzEwMzIsOCBAQAogCiAJdXAoICZkZXYtPnN0cnVjdF9zZW0gKTsKIAotCXJlcXVlc3QuY291bnQgPSBlbnRyeS0+YnVmX2NvdW50OwotCXJlcXVlc3Quc2l6ZSA9IHNpemU7Ci0KLQlpZiAoIGNvcHlfdG9fdXNlciggYXJncCwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSApICkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJcmVxdWVzdC0+Y291bnQgPSBlbnRyeS0+YnVmX2NvdW50OworCXJlcXVlc3QtPnNpemUgPSBzaXplOwogCiAJZG1hLT5mbGFncyA9IF9EUk1fRE1BX1VTRV9TRzsKIApAQCAtOTE3LDYgKzEwNDEsMTYxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZHJtX2FkZGJ1ZnNfZmIoZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfZGVzY190ICpyZXF1ZXN0KQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfZW50cnlfdCAqZW50cnk7CisJZHJtX2J1Zl90ICpidWY7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBhZ3Bfb2Zmc2V0OworCWludCBjb3VudDsKKwlpbnQgb3JkZXI7CisJaW50IHNpemU7CisJaW50IGFsaWdubWVudDsKKwlpbnQgcGFnZV9vcmRlcjsKKwlpbnQgdG90YWw7CisJaW50IGJ5dGVfY291bnQ7CisJaW50IGk7CisJZHJtX2J1Zl90ICoqdGVtcF9idWZsaXN0OworCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0ZCX0RNQSkpCisJCXJldHVybiAtRUlOVkFMOworICAgIAorCWlmICghZG1hKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvdW50ID0gcmVxdWVzdC0+Y291bnQ7CisJb3JkZXIgPSBkcm1fb3JkZXIocmVxdWVzdC0+c2l6ZSk7CisJc2l6ZSA9IDEgPDwgb3JkZXI7CisKKwlhbGlnbm1lbnQgPSAocmVxdWVzdC0+ZmxhZ3MgJiBfRFJNX1BBR0VfQUxJR04pCisJICAgID8gUEFHRV9BTElHTihzaXplKSA6IHNpemU7CisJcGFnZV9vcmRlciA9IG9yZGVyIC0gUEFHRV9TSElGVCA+IDAgPyBvcmRlciAtIFBBR0VfU0hJRlQgOiAwOworCXRvdGFsID0gUEFHRV9TSVpFIDw8IHBhZ2Vfb3JkZXI7CisKKwlieXRlX2NvdW50ID0gMDsKKwlhZ3Bfb2Zmc2V0ID0gcmVxdWVzdC0+YWdwX3N0YXJ0OworCisJRFJNX0RFQlVHKCJjb3VudDogICAgICAlZFxuIiwgY291bnQpOworCURSTV9ERUJVRygib3JkZXI6ICAgICAgJWRcbiIsIG9yZGVyKTsKKwlEUk1fREVCVUcoInNpemU6ICAgICAgICVkXG4iLCBzaXplKTsKKwlEUk1fREVCVUcoImFncF9vZmZzZXQ6ICVsdVxuIiwgYWdwX29mZnNldCk7CisJRFJNX0RFQlVHKCJhbGlnbm1lbnQ6ICAlZFxuIiwgYWxpZ25tZW50KTsKKwlEUk1fREVCVUcoInBhZ2Vfb3JkZXI6ICVkXG4iLCBwYWdlX29yZGVyKTsKKwlEUk1fREVCVUcoInRvdGFsOiAgICAgICVkXG4iLCB0b3RhbCk7CisKKwlpZiAob3JkZXIgPCBEUk1fTUlOX09SREVSIHx8IG9yZGVyID4gRFJNX01BWF9PUkRFUikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGRldi0+cXVldWVfY291bnQpCisJCXJldHVybiAtRUJVU1k7CS8qIE5vdCB3aGlsZSBpbiB1c2UgKi8KKworCXNwaW5fbG9jaygmZGV2LT5jb3VudF9sb2NrKTsKKwlpZiAoZGV2LT5idWZfdXNlKSB7CisJCXNwaW5fdW5sb2NrKCZkZXYtPmNvdW50X2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlhdG9taWNfaW5jKCZkZXYtPmJ1Zl9hbGxvYyk7CisJc3Bpbl91bmxvY2soJmRldi0+Y291bnRfbG9jayk7CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWVudHJ5ID0gJmRtYS0+YnVmc1tvcmRlcl07CisJaWYgKGVudHJ5LT5idWZfY291bnQpIHsKKwkJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJCWF0b21pY19kZWMoJmRldi0+YnVmX2FsbG9jKTsKKwkJcmV0dXJuIC1FTk9NRU07CS8qIE1heSBvbmx5IGNhbGwgb25jZSBmb3IgZWFjaCBvcmRlciAqLworCX0KKworCWlmIChjb3VudCA8IDAgfHwgY291bnQgPiA0MDk2KSB7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlhdG9taWNfZGVjKCZkZXYtPmJ1Zl9hbGxvYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVudHJ5LT5idWZsaXN0ID0gZHJtX2FsbG9jKGNvdW50ICogc2l6ZW9mKCplbnRyeS0+YnVmbGlzdCksCisJCQkJICAgRFJNX01FTV9CVUZTKTsKKwlpZiAoIWVudHJ5LT5idWZsaXN0KSB7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlhdG9taWNfZGVjKCZkZXYtPmJ1Zl9hbGxvYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoZW50cnktPmJ1Zmxpc3QsIDAsIGNvdW50ICogc2l6ZW9mKCplbnRyeS0+YnVmbGlzdCkpOworCisJZW50cnktPmJ1Zl9zaXplID0gc2l6ZTsKKwllbnRyeS0+cGFnZV9vcmRlciA9IHBhZ2Vfb3JkZXI7CisKKwlvZmZzZXQgPSAwOworCisJd2hpbGUgKGVudHJ5LT5idWZfY291bnQgPCBjb3VudCkgeworCQlidWYgPSAmZW50cnktPmJ1Zmxpc3RbZW50cnktPmJ1Zl9jb3VudF07CisJCWJ1Zi0+aWR4ID0gZG1hLT5idWZfY291bnQgKyBlbnRyeS0+YnVmX2NvdW50OworCQlidWYtPnRvdGFsID0gYWxpZ25tZW50OworCQlidWYtPm9yZGVyID0gb3JkZXI7CisJCWJ1Zi0+dXNlZCA9IDA7CisKKwkJYnVmLT5vZmZzZXQgPSAoZG1hLT5ieXRlX2NvdW50ICsgb2Zmc2V0KTsKKwkJYnVmLT5idXNfYWRkcmVzcyA9IGFncF9vZmZzZXQgKyBvZmZzZXQ7CisJCWJ1Zi0+YWRkcmVzcyA9ICh2b2lkICopKGFncF9vZmZzZXQgKyBvZmZzZXQpOworCQlidWYtPm5leHQgPSBOVUxMOworCQlidWYtPndhaXRpbmcgPSAwOworCQlidWYtPnBlbmRpbmcgPSAwOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZidWYtPmRtYV93YWl0KTsKKwkJYnVmLT5maWxwID0gTlVMTDsKKworCQlidWYtPmRldl9wcml2X3NpemUgPSBkZXYtPmRyaXZlci0+ZGV2X3ByaXZfc2l6ZTsKKwkJYnVmLT5kZXZfcHJpdmF0ZSA9IGRybV9hbGxvYyhidWYtPmRldl9wcml2X3NpemUsIERSTV9NRU1fQlVGUyk7CisJCWlmICghYnVmLT5kZXZfcHJpdmF0ZSkgeworCQkJLyogU2V0IGNvdW50IGNvcnJlY3RseSBzbyB3ZSBmcmVlIHRoZSBwcm9wZXIgYW1vdW50LiAqLworCQkJZW50cnktPmJ1Zl9jb3VudCA9IGNvdW50OworCQkJZHJtX2NsZWFudXBfYnVmX2Vycm9yKGRldiwgZW50cnkpOworCQkJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJCQlhdG9taWNfZGVjKCZkZXYtPmJ1Zl9hbGxvYyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQoYnVmLT5kZXZfcHJpdmF0ZSwgMCwgYnVmLT5kZXZfcHJpdl9zaXplKTsKKworCQlEUk1fREVCVUcoImJ1ZmZlciAlZCBAICVwXG4iLCBlbnRyeS0+YnVmX2NvdW50LCBidWYtPmFkZHJlc3MpOworCisJCW9mZnNldCArPSBhbGlnbm1lbnQ7CisJCWVudHJ5LT5idWZfY291bnQrKzsKKwkJYnl0ZV9jb3VudCArPSBQQUdFX1NJWkUgPDwgcGFnZV9vcmRlcjsKKwl9CisKKwlEUk1fREVCVUcoImJ5dGVfY291bnQ6ICVkXG4iLCBieXRlX2NvdW50KTsKKworCXRlbXBfYnVmbGlzdCA9IGRybV9yZWFsbG9jKGRtYS0+YnVmbGlzdCwKKwkJCQkgICBkbWEtPmJ1Zl9jb3VudCAqIHNpemVvZigqZG1hLT5idWZsaXN0KSwKKwkJCQkgICAoZG1hLT5idWZfY291bnQgKyBlbnRyeS0+YnVmX2NvdW50KQorCQkJCSAgICogc2l6ZW9mKCpkbWEtPmJ1Zmxpc3QpLCBEUk1fTUVNX0JVRlMpOworCWlmICghdGVtcF9idWZsaXN0KSB7CisJCS8qIEZyZWUgdGhlIGVudHJ5IGJlY2F1c2UgaXQgaXNuJ3QgdmFsaWQgKi8KKwkJZHJtX2NsZWFudXBfYnVmX2Vycm9yKGRldiwgZW50cnkpOworCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJYXRvbWljX2RlYygmZGV2LT5idWZfYWxsb2MpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZG1hLT5idWZsaXN0ID0gdGVtcF9idWZsaXN0OworCisJZm9yIChpID0gMDsgaSA8IGVudHJ5LT5idWZfY291bnQ7IGkrKykgeworCQlkbWEtPmJ1Zmxpc3RbaSArIGRtYS0+YnVmX2NvdW50XSA9ICZlbnRyeS0+YnVmbGlzdFtpXTsKKwl9CisKKwlkbWEtPmJ1Zl9jb3VudCArPSBlbnRyeS0+YnVmX2NvdW50OworCWRtYS0+Ynl0ZV9jb3VudCArPSBieXRlX2NvdW50OworCisJRFJNX0RFQlVHKCJkbWEtPmJ1Zl9jb3VudCA6ICVkXG4iLCBkbWEtPmJ1Zl9jb3VudCk7CisJRFJNX0RFQlVHKCJlbnRyeS0+YnVmX2NvdW50IDogJWRcbiIsIGVudHJ5LT5idWZfY291bnQpOworCisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisKKwlyZXF1ZXN0LT5jb3VudCA9IGVudHJ5LT5idWZfY291bnQ7CisJcmVxdWVzdC0+c2l6ZSA9IHNpemU7CisKKwlkbWEtPmZsYWdzID0gX0RSTV9ETUFfVVNFX0ZCOworCisJYXRvbWljX2RlYygmZGV2LT5idWZfYWxsb2MpOworCXJldHVybiAwOworfQorCiAvKioKICAqIEFkZCBidWZmZXJzIGZvciBETUEgdHJhbnNmZXJzIChpb2N0bCkuCiAgKgpAQCAtOTM3LDYgKzEyMTYsNyBAQAogCWRybV9idWZfZGVzY190IHJlcXVlc3Q7CiAJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlpbnQgcmV0OwogCQogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTQ3LDEzICsxMjI3LDIzIEBACiAKICNpZiBfX09TX0hBU19BR1AKIAlpZiAoIHJlcXVlc3QuZmxhZ3MgJiBfRFJNX0FHUF9CVUZGRVIgKQotCQlyZXR1cm4gZHJtX2FkZGJ1ZnNfYWdwKCBpbm9kZSwgZmlscCwgY21kLCBhcmcgKTsKKwkJcmV0PWRybV9hZGRidWZzX2FncChkZXYsICZyZXF1ZXN0KTsKIAllbHNlCiAjZW5kaWYKIAlpZiAoIHJlcXVlc3QuZmxhZ3MgJiBfRFJNX1NHX0JVRkZFUiApCi0JCXJldHVybiBkcm1fYWRkYnVmc19zZyggaW5vZGUsIGZpbHAsIGNtZCwgYXJnICk7CisJCXJldD1kcm1fYWRkYnVmc19zZyhkZXYsICZyZXF1ZXN0KTsKKwllbHNlIGlmICggcmVxdWVzdC5mbGFncyAmIF9EUk1fRkJfQlVGRkVSKQorCQlyZXQ9ZHJtX2FkZGJ1ZnNfZmIoZGV2LCAmcmVxdWVzdCk7CiAJZWxzZQotCQlyZXR1cm4gZHJtX2FkZGJ1ZnNfcGNpKCBpbm9kZSwgZmlscCwgY21kLCBhcmcgKTsKKwkJcmV0PWRybV9hZGRidWZzX3BjaShkZXYsICZyZXF1ZXN0KTsKKworCWlmIChyZXQ9PTApIHsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZyZXF1ZXN0LAorCQkJCSBzaXplb2YocmVxdWVzdCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQl9CisJfQorCXJldHVybiByZXQ7CiB9CiAKIApAQCAtMTE5Niw0MyArMTQ4NiwzMSBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmICggcmVxdWVzdC5jb3VudCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKLQkJaWYgKChkcm1fY29yZV9oYXNfQUdQKGRldikgJiYgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9VU0VfQUdQKSkgfHwKLQkJICAgIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1NHKSAmJiAoZG1hLT5mbGFncyAmIF9EUk1fRE1BX1VTRV9TRykpICkgeworCQlpZiAoKGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJiAoZG1hLT5mbGFncyAmIF9EUk1fRE1BX1VTRV9BR1ApKQorCQkgICAgfHwgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfU0cpIAorCQkJJiYgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9VU0VfU0cpKQorCQkgICAgfHwgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfRkJfRE1BKQorCQkJJiYgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9VU0VfRkIpKSkgewogCQkJZHJtX21hcF90ICptYXAgPSBkZXYtPmFncF9idWZmZXJfbWFwOworCQkJdW5zaWduZWQgbG9uZyB0b2tlbiA9IGRldi0+YWdwX2J1ZmZlcl90b2tlbjsKIAogCQkJaWYgKCAhbWFwICkgewogCQkJCXJldGNvZGUgPSAtRUlOVkFMOwogCQkJCWdvdG8gZG9uZTsKIAkJCX0KIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDAyMDQwMgotCQkJZG93biggJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSApOwotI2Vsc2UKIAkJCWRvd25fd3JpdGUoICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKLSNlbmRpZgogCQkJdmlydHVhbCA9IGRvX21tYXAoIGZpbHAsIDAsIG1hcC0+c2l6ZSwKIAkJCQkJICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKIAkJCQkJICAgTUFQX1NIQVJFRCwKLQkJCQkJICAgKHVuc2lnbmVkIGxvbmcpbWFwLT5vZmZzZXQgKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgwMjA0MDIKLQkJCXVwKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7Ci0jZWxzZQorCQkJCQkgICB0b2tlbiApOwogCQkJdXBfd3JpdGUoICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKLSNlbmRpZgogCQl9IGVsc2UgewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDAyMDQwMgotCQkJZG93biggJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSApOwotI2Vsc2UKIAkJCWRvd25fd3JpdGUoICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKLSNlbmRpZgogCQkJdmlydHVhbCA9IGRvX21tYXAoIGZpbHAsIDAsIGRtYS0+Ynl0ZV9jb3VudCwKIAkJCQkJICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKIAkJCQkJICAgTUFQX1NIQVJFRCwgMCApOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDAyMDQwMgotCQkJdXAoICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKLSNlbHNlCiAJCQl1cF93cml0ZSggJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSApOwotI2VuZGlmCiAJCX0KIAkJaWYgKCB2aXJ0dWFsID4gLTEwMjRVTCApIHsKIAkJCS8qIFJlYWwgZXJyb3IgKi8KQEAgLTEyNzksMyArMTU1NywyNiBAQAogCXJldHVybiByZXRjb2RlOwogfQogCisvKioKKyAqIENvbXB1dGUgc2l6ZSBvcmRlci4gIFJldHVybnMgdGhlIGV4cG9uZW50IG9mIHRoZSBzbWFsbGVyIHBvd2VyIG9mIHR3byB3aGljaAorICogaXMgZ3JlYXRlciBvciBlcXVhbCB0byBnaXZlbiBudW1iZXIuCisgKiAKKyAqIFxwYXJhbSBzaXplIHNpemUuCisgKiBccmV0dXJuIG9yZGVyLgorICoKKyAqIFx0b2RvIENhbiBiZSBtYWRlIGZhc3Rlci4KKyAqLworaW50IGRybV9vcmRlciggdW5zaWduZWQgbG9uZyBzaXplICkKK3sKKwlpbnQgb3JkZXI7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlmb3IgKG9yZGVyID0gMCwgdG1wID0gc2l6ZSA+PiAxOyB0bXA7IHRtcCA+Pj0gMSwgb3JkZXIrKykKKwkJOworCisJaWYgKHNpemUgJiAoc2l6ZSAtIDEpKQorCQkrK29yZGVyOworCisJcmV0dXJuIG9yZGVyOworfQorRVhQT1JUX1NZTUJPTChkcm1fb3JkZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jCmluZGV4IGE3Y2ZhYmQuLjUwMjg5MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKQEAgLTIxMiw2ICsyMTIsNyBAQAogCWRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX2N0eF9wcml2X21hcF90IHJlcXVlc3Q7CiAJZHJtX21hcF90ICptYXA7CisJZHJtX21hcF9saXN0X3QgKl9lbnRyeTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgYXJncCwgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yMjUsNyArMjI2LDE3IEBACiAJbWFwID0gZGV2LT5jb250ZXh0X3NhcmVhc1tyZXF1ZXN0LmN0eF9pZF07CiAJdXAoJmRldi0+c3RydWN0X3NlbSk7CiAKLQlyZXF1ZXN0LmhhbmRsZSA9ICh2b2lkICopIG1hcC0+b2Zmc2V0OworCXJlcXVlc3QuaGFuZGxlID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9lbnRyeSwgJmRldi0+bWFwbGlzdC0+aGVhZCxoZWFkKSB7CisJCWlmIChfZW50cnktPm1hcCA9PSBtYXApIHsKKwkJCXJlcXVlc3QuaGFuZGxlID0gKHZvaWQgKikodW5zaWduZWQgbG9uZylfZW50cnktPnVzZXJfdG9rZW47CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAocmVxdWVzdC5oYW5kbGUgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwogCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwpAQCAtMjYyLDcgKzI3Myw3IEBACiAJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CiAJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOwogCQlpZiAocl9saXN0LT5tYXAKLQkJICAgICYmIHJfbGlzdC0+bWFwLT5vZmZzZXQgPT0gKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QuaGFuZGxlKQorCQkgICAgJiYgcl9saXN0LT51c2VyX3Rva2VuID09ICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0LmhhbmRsZSkKIAkJCWdvdG8gZm91bmQ7CiAJfQogYmFkOgpAQCAtMjk3LDcgKzMwOCw3IEBACiAgKgogICogQXR0ZW1wdCB0byBzZXQgZHJtX2RldmljZTo6Y29udGV4dF9mbGFnLgogICovCi1pbnQgZHJtX2NvbnRleHRfc3dpdGNoKCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IG9sZCwgaW50IG5ldyApCitzdGF0aWMgaW50IGRybV9jb250ZXh0X3N3aXRjaCggZHJtX2RldmljZV90ICpkZXYsIGludCBvbGQsIGludCBuZXcgKQogewogICAgICAgICBpZiAoIHRlc3RfYW5kX3NldF9iaXQoIDAsICZkZXYtPmNvbnRleHRfZmxhZyApICkgewogICAgICAgICAgICAgICAgIERSTV9FUlJPUiggIlJlZW50ZXJpbmcgLS0gRklYTUVcbiIgKTsKQEAgLTM2OSw3ICszODAsNyBAQAogCQlmb3IgKCBpID0gMCA7IGkgPCBEUk1fUkVTRVJWRURfQ09OVEVYVFMgOyBpKysgKSB7CiAJCQljdHguaGFuZGxlID0gaTsKIAkJCWlmICggY29weV90b191c2VyKCAmcmVzLmNvbnRleHRzW2ldLAotCQkJCQkgICAmaSwgc2l6ZW9mKGkpICkgKQorCQkJCQkgICAmY3R4LCBzaXplb2YoY3R4KSApICkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKaW5kZXggMzMzM2MyNS4uNmJhNDhmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKQEAgLTcwLDggKzcwLDggQEAKIAlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9VTkJMT0NLKV0gICAgICAgPSB7IGRybV9ub29wLCAgICAgICAgMSwgMSB9LAogCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FVVEhfTUFHSUMpXSAgICA9IHsgZHJtX2F1dGhtYWdpYywgICAxLCAxIH0sCiAKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BRERfTUFQKV0gICAgICAgPSB7IGRybV9hZGRtYXAsICAgICAgMSwgMSB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JNX01BUCldICAgICAgICA9IHsgZHJtX3JtbWFwLCAgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUREX01BUCldICAgICAgID0geyBkcm1fYWRkbWFwX2lvY3RsLDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9STV9NQVApXSAgICAgICAgPSB7IGRybV9ybW1hcF9pb2N0bCwgMSwgMCB9LAogCiAJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU0VUX1NBUkVBX0NUWCldID0geyBkcm1fc2V0c2FyZWFjdHgsIDEsIDEgfSwKIAlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfU0FSRUFfQ1RYKV0gPSB7IGRybV9nZXRzYXJlYWN0eCwgMSwgMCB9LApAQCAtMTAyLDEwICsxMDIsMTAgQEAKIAlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9DT05UUk9MKV0gICAgICAgPSB7IGRybV9jb250cm9sLCAgICAgMSwgMSB9LAogCiAjaWYgX19PU19IQVNfQUdQCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0FDUVVJUkUpXSAgID0geyBkcm1fYWdwX2FjcXVpcmUsIDEsIDEgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfUkVMRUFTRSldICAgPSB7IGRybV9hZ3BfcmVsZWFzZSwgMSwgMSB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9FTkFCTEUpXSAgICA9IHsgZHJtX2FncF9lbmFibGUsICAxLCAxIH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0lORk8pXSAgICAgID0geyBkcm1fYWdwX2luZm8sICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfQUNRVUlSRSldICAgPSB7IGRybV9hZ3BfYWNxdWlyZV9pb2N0bCwgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9SRUxFQVNFKV0gICA9IHsgZHJtX2FncF9yZWxlYXNlX2lvY3RsLCAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0VOQUJMRSldICAgID0geyBkcm1fYWdwX2VuYWJsZV9pb2N0bCwgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9JTkZPKV0gICAgICA9IHsgZHJtX2FncF9pbmZvX2lvY3RsLCAxLCAwIH0sCiAJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0FMTE9DKV0gICAgID0geyBkcm1fYWdwX2FsbG9jLCAgIDEsIDEgfSwKIAlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfRlJFRSldICAgICAgPSB7IGRybV9hZ3BfZnJlZSwgICAgMSwgMSB9LAogCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9CSU5EKV0gICAgICA9IHsgZHJtX2FncF9iaW5kLCAgICAxLCAxIH0sCkBAIC0xMjcsMTQgKzEyNywxMiBAQAogICoKICAqIEZyZWVzIGV2ZXJ5IHJlc291cmNlIGluIFxwIGRldi4KICAqCi0gKiBcc2EgZHJtX2RldmljZSBhbmQgc2V0dXAoKS4KKyAqIFxzYSBkcm1fZGV2aWNlCiAgKi8KIGludCBkcm1fdGFrZWRvd24oIGRybV9kZXZpY2VfdCAqZGV2ICkKIHsKIAlkcm1fbWFnaWNfZW50cnlfdCAqcHQsICpuZXh0OwotCWRybV9tYXBfdCAqbWFwOwogCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKmxpc3RfbmV4dDsKIAlkcm1fdm1hX2VudHJ5X3QgKnZtYSwgKnZtYV9uZXh0OwogCWludCBpOwogCkBAIC0xNDIsNiArMTQwLDcgQEAKIAogCWlmIChkZXYtPmRyaXZlci0+cHJldGFrZWRvd24pCiAJICBkZXYtPmRyaXZlci0+cHJldGFrZWRvd24oZGV2KTsKKwlEUk1fREVCVUcoImRyaXZlciBwcmV0YWtlZG93biBjb21wbGV0ZWRcbiIpOwogCiAJaWYgKGRldi0+dW5pcXVlKSB7CiAJCWRybV9mcmVlKGRldi0+dW5pcXVlLCBzdHJsZW4oZGV2LT51bmlxdWUpICsgMSwgRFJNX01FTV9EUklWRVIpOwpAQCAtMTc4LDExICsxNzcsMTYgQEAKIAkJfQogCQlkZXYtPmFncC0+bWVtb3J5ID0gTlVMTDsKIAotCQlpZiAoIGRldi0+YWdwLT5hY3F1aXJlZCApIGRybV9hZ3BfZG9fcmVsZWFzZShkZXYpOworCQlpZiAoZGV2LT5hZ3AtPmFjcXVpcmVkKQorCQkgIGRybV9hZ3BfcmVsZWFzZShkZXYpOwogCiAJCWRldi0+YWdwLT5hY3F1aXJlZCA9IDA7CiAJCWRldi0+YWdwLT5lbmFibGVkICA9IDA7CiAJfQorCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1NHKSAmJiBkZXYtPnNnKSB7CisJCWRybV9zZ19jbGVhbnVwKGRldi0+c2cpOworCQlkZXYtPnNnID0gTlVMTDsKKwl9CiAKIAkJCQkvKiBDbGVhciB2bWEgbGlzdCAob25seSBidWlsdCBmb3IgZGVidWdnaW5nKSAqLwogCWlmICggZGV2LT52bWFsaXN0ICkgewpAQCAtMTk0LDQ4ICsxOTgsMTEgQEAKIAl9CiAKIAlpZiggZGV2LT5tYXBsaXN0ICkgewotCQlsaXN0X2Zvcl9lYWNoX3NhZmUoIGxpc3QsIGxpc3RfbmV4dCwgJmRldi0+bWFwbGlzdC0+aGVhZCApIHsKLQkJCXJfbGlzdCA9IChkcm1fbWFwX2xpc3RfdCAqKWxpc3Q7Ci0KLQkJCWlmICggKCBtYXAgPSByX2xpc3QtPm1hcCApICkgewotCQkJCXN3aXRjaCAoIG1hcC0+dHlwZSApIHsKLQkJCQljYXNlIF9EUk1fUkVHSVNURVJTOgotCQkJCWNhc2UgX0RSTV9GUkFNRV9CVUZGRVI6Ci0JCQkJCWlmIChkcm1fY29yZV9oYXNfTVRSUihkZXYpKSB7Ci0JCQkJCQlpZiAoIG1hcC0+bXRyciA+PSAwICkgewotCQkJCQkJCWludCByZXRjb2RlOwotCQkJCQkJCXJldGNvZGUgPSBtdHJyX2RlbCggbWFwLT5tdHJyLAotCQkJCQkJCQkJICAgIG1hcC0+b2Zmc2V0LAotCQkJCQkJCQkJICAgIG1hcC0+c2l6ZSApOwotCQkJCQkJCURSTV9ERUJVRyggIm10cnJfZGVsPSVkXG4iLCByZXRjb2RlICk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZHJtX2lvcmVtYXBmcmVlKCBtYXAtPmhhbmRsZSwgbWFwLT5zaXplLCBkZXYgKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBfRFJNX1NITToKLQkJCQkJdmZyZWUobWFwLT5oYW5kbGUpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgX0RSTV9BR1A6Ci0JCQkJCS8qIERvIG5vdGhpbmcgaGVyZSwgYmVjYXVzZSB0aGlzIGlzIGFsbAotCQkJCQkgKiBoYW5kbGVkIGluIHRoZSBBR1AvR0FSVCBkcml2ZXIuCi0JCQkJCSAqLwotCQkJCQlicmVhazsKLQkJCQljYXNlIF9EUk1fU0NBVFRFUl9HQVRIRVI6Ci0JCQkJCS8qIEhhbmRsZSBpdCAqLwotCQkJCQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9TRykgJiYgZGV2LT5zZykgewotCQkJCQkJZHJtX3NnX2NsZWFudXAoZGV2LT5zZyk7Ci0JCQkJCQlkZXYtPnNnID0gTlVMTDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZHJtX2ZyZWUobWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyk7Ci0JCQl9Ci0JCQlsaXN0X2RlbCggbGlzdCApOwotCQkJZHJtX2ZyZWUocl9saXN0LCBzaXplb2YoKnJfbGlzdCksIERSTV9NRU1fTUFQUyk7Ci0gCQl9Ci0JCWRybV9mcmVlKGRldi0+bWFwbGlzdCwgc2l6ZW9mKCpkZXYtPm1hcGxpc3QpLCBEUk1fTUVNX01BUFMpOwotCQlkZXYtPm1hcGxpc3QgPSBOVUxMOworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldi0+bWFwbGlzdC0+aGVhZCkpIHsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSBkZXYtPm1hcGxpc3QtPmhlYWQubmV4dDsKKwkJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCQkJZHJtX3JtbWFwX2xvY2tlZChkZXYsIHJfbGlzdC0+bWFwKTsKKwkJfQogIAl9CiAKIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9ETUFfUVVFVUUpICYmIGRldi0+cXVldWVsaXN0ICkgewpAQCAtMjY0LDYgKzIzMSw3IEBACiAJfQogCXVwKCAmZGV2LT5zdHJ1Y3Rfc2VtICk7CiAKKwlEUk1fREVCVUcoInRha2Vkb3duIGNvbXBsZXRlZFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMxMiw3ICsyODAsNyBAQAogICoKICAqIENsZWFucyB1cCBhbGwgRFJNIGRldmljZSwgY2FsbGluZyB0YWtlZG93bigpLgogICogCi0gKiBcc2EgZHJtX2luaXQoKS4KKyAqIFxzYSBkcm1faW5pdAogICovCiBzdGF0aWMgdm9pZCBkcm1fY2xlYW51cCggZHJtX2RldmljZV90ICpkZXYgKQogewpAQCAtMzI1LDYgKzI5MywxMSBAQAogCiAJZHJtX3Rha2Vkb3duKCBkZXYgKTsJCiAKKwlpZiAoZGV2LT5tYXBsaXN0KSB7CisJCWRybV9mcmVlKGRldi0+bWFwbGlzdCwgc2l6ZW9mKCpkZXYtPm1hcGxpc3QpLCBEUk1fTUVNX01BUFMpOworCQlkZXYtPm1hcGxpc3QgPSBOVUxMOworCX0KKwogCWRybV9jdHhiaXRtYXBfY2xlYW51cCggZGV2ICk7CiAJCiAJaWYgKGRybV9jb3JlX2hhc19NVFJSKGRldikgJiYgZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9mb3BzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9mb3BzLmMKaW5kZXggMTBlNjRmZC4uYTFmNGU5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYwpAQCAtNzEsMTIgKzcxLDYgQEAKIAkJZGV2LT5tYWdpY2xpc3RbaV0udGFpbCA9IE5VTEw7CiAJfQogCi0JZGV2LT5tYXBsaXN0ID0gZHJtX2FsbG9jKHNpemVvZigqZGV2LT5tYXBsaXN0KSwKLQkJCQkgIERSTV9NRU1fTUFQUyk7Ci0JaWYoZGV2LT5tYXBsaXN0ID09IE5VTEwpIHJldHVybiAtRU5PTUVNOwotCW1lbXNldChkZXYtPm1hcGxpc3QsIDAsIHNpemVvZigqZGV2LT5tYXBsaXN0KSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmRldi0+bWFwbGlzdC0+aGVhZCk7Ci0KIAlkZXYtPmN0eGxpc3QgPSBkcm1fYWxsb2Moc2l6ZW9mKCpkZXYtPmN0eGxpc3QpLAogCQkJCSAgRFJNX01FTV9DVFhMSVNUKTsKIAlpZihkZXYtPmN0eGxpc3QgPT0gTlVMTCkgcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYwppbmRleCAzOWFmZGEwLi5kMmVkM2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvY3RsLmMKQEAgLTIwOCw3ICsyMDgsNyBAQAogCW1hcC5zaXplICAgPSByX2xpc3QtPm1hcC0+c2l6ZTsKIAltYXAudHlwZSAgID0gcl9saXN0LT5tYXAtPnR5cGU7CiAJbWFwLmZsYWdzICA9IHJfbGlzdC0+bWFwLT5mbGFnczsKLQltYXAuaGFuZGxlID0gcl9saXN0LT5tYXAtPmhhbmRsZTsKKwltYXAuaGFuZGxlID0gKHZvaWQgKikodW5zaWduZWQgbG9uZykgcl9saXN0LT51c2VyX3Rva2VuOwogCW1hcC5tdHJyICAgPSByX2xpc3QtPm1hcC0+bXRycjsKIAl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwppbmRleCBhY2UzZDQyLi5mZjQ4M2ZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwpAQCAtMTQyLDI3ICsxNDIsMzEgQEAKIAogI2lmIF9fT1NfSEFTX0FHUAogLyoqIFdyYXBwZXIgYXJvdW5kIGFncF9hbGxvY2F0ZV9tZW1vcnkoKSAqLwotRFJNX0FHUF9NRU0gKmRybV9hbGxvY19hZ3Aoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCBpbnQgcGFnZXMsIHUzMiB0eXBlKQorRFJNX0FHUF9NRU0gKmRybV9hbGxvY19hZ3AoZHJtX2RldmljZV90ICpkZXYsIGludCBwYWdlcywgdTMyIHR5cGUpCiB7Ci0JcmV0dXJuIGRybV9hZ3BfYWxsb2NhdGVfbWVtb3J5KGJyaWRnZSwgcGFnZXMsIHR5cGUpOworCXJldHVybiBkcm1fYWdwX2FsbG9jYXRlX21lbW9yeShkZXYtPmFncC0+YnJpZGdlLCBwYWdlcywgdHlwZSk7CiB9CitFWFBPUlRfU1lNQk9MKGRybV9hbGxvY19hZ3ApOwogCiAvKiogV3JhcHBlciBhcm91bmQgYWdwX2ZyZWVfbWVtb3J5KCkgKi8KIGludCBkcm1fZnJlZV9hZ3AoRFJNX0FHUF9NRU0gKmhhbmRsZSwgaW50IHBhZ2VzKQogewogCXJldHVybiBkcm1fYWdwX2ZyZWVfbWVtb3J5KGhhbmRsZSkgPyAwIDogLUVJTlZBTDsKIH0KK0VYUE9SVF9TWU1CT0woZHJtX2ZyZWVfYWdwKTsKIAogLyoqIFdyYXBwZXIgYXJvdW5kIGFncF9iaW5kX21lbW9yeSgpICovCiBpbnQgZHJtX2JpbmRfYWdwKERSTV9BR1BfTUVNICpoYW5kbGUsIHVuc2lnbmVkIGludCBzdGFydCkKIHsKIAlyZXR1cm4gZHJtX2FncF9iaW5kX21lbW9yeShoYW5kbGUsIHN0YXJ0KTsKIH0KK0VYUE9SVF9TWU1CT0woZHJtX2JpbmRfYWdwKTsKIAogLyoqIFdyYXBwZXIgYXJvdW5kIGFncF91bmJpbmRfbWVtb3J5KCkgKi8KIGludCBkcm1fdW5iaW5kX2FncChEUk1fQUdQX01FTSAqaGFuZGxlKQogewogCXJldHVybiBkcm1fYWdwX3VuYmluZF9tZW1vcnkoaGFuZGxlKTsKIH0KK0VYUE9SVF9TWU1CT0woZHJtX3VuYmluZF9hZ3ApOwogI2VuZGlmIC8qIGFncCAqLwogI2VuZGlmIC8qIGRlYnVnX21lbW9yeSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2kuYwppbmRleCAxOTJlODc2Li4wOWVkNzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2kuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2kuYwpAQCAtNDYsMTEgKzQ2LDExIEBACiAvKioKICAqIFxicmllZiBBbGxvY2F0ZSBhIFBDSSBjb25zaXN0ZW50IG1lbW9yeSBibG9jaywgZm9yIERNQS4KICAqLwotdm9pZCAqZHJtX3BjaV9hbGxvYyhkcm1fZGV2aWNlX3QgKiBkZXYsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sCi0JCSAgICBkbWFfYWRkcl90IG1heGFkZHIsIGRtYV9hZGRyX3QgKiBidXNhZGRyKQorZHJtX2RtYV9oYW5kbGVfdCAqZHJtX3BjaV9hbGxvYyhkcm1fZGV2aWNlX3QgKiBkZXYsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sCisJCQkJZG1hX2FkZHJfdCBtYXhhZGRyKQogewotCXZvaWQgKmFkZHJlc3M7Ci0jaWYgRFJNX0RFQlVHX01FTU9SWQorCWRybV9kbWFfaGFuZGxlX3QgKmRtYWg7CisjaWZkZWYgRFJNX0RFQlVHX01FTU9SWQogCWludCBhcmVhID0gRFJNX01FTV9ETUE7CiAKIAlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CkBAIC03NCwxMyArNzQsMTkgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JYWRkcmVzcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldi0+cGRldiwgc2l6ZSwgYnVzYWRkcik7CisJZG1haCA9IGttYWxsb2Moc2l6ZW9mKGRybV9kbWFfaGFuZGxlX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRtYWgpCisJCXJldHVybiBOVUxMOworCQorCWRtYWgtPnNpemUgPSBzaXplOworCWRtYWgtPnZhZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBzaXplLCAmZG1haC0+YnVzYWRkcik7CiAKLSNpZiBEUk1fREVCVUdfTUVNT1JZCi0JaWYgKGFkZHJlc3MgPT0gTlVMTCkgeworI2lmZGVmIERSTV9ERUJVR19NRU1PUlkKKwlpZiAoZG1haC0+dmFkZHIgPT0gTlVMTCkgewogCQlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CiAJCSsrZHJtX21lbV9zdGF0c1thcmVhXS5mYWlsX2NvdW50OwogCQlzcGluX3VubG9jaygmZHJtX21lbV9sb2NrKTsKKwkJa2ZyZWUoZG1haCk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtOTAsMzcgKzk2LDQyIEBACiAJZHJtX3JhbV91c2VkICs9IHNpemU7CiAJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAjZWxzZQotCWlmIChhZGRyZXNzID09IE5VTEwpCisJaWYgKGRtYWgtPnZhZGRyID09IE5VTEwpIHsKKwkJa2ZyZWUoZG1haCk7CiAJCXJldHVybiBOVUxMOworCX0KICNlbmRpZgogCi0JbWVtc2V0KGFkZHJlc3MsIDAsIHNpemUpOworCW1lbXNldChkbWFoLT52YWRkciwgMCwgc2l6ZSk7CiAKLQlyZXR1cm4gYWRkcmVzczsKKwlyZXR1cm4gZG1haDsKIH0KIEVYUE9SVF9TWU1CT0woZHJtX3BjaV9hbGxvYyk7CiAKIC8qKgotICogXGJyaWVmIEZyZWUgYSBQQ0kgY29uc2lzdGVudCBtZW1vcnkgYmxvY2suCisgKiBcYnJpZWYgRnJlZSBhIFBDSSBjb25zaXN0ZW50IG1lbW9yeSBibG9jayB3aXRoIGZyZWVpbmcgaXRzIGRlc2NyaXB0b3IuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNlIGluIHRoZSBMaW51eC1zcGVjaWZpYyBEUk0gY29yZSBjb2RlLgogICovCiB2b2lkCi1kcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgYnVzYWRkcikKK19fZHJtX3BjaV9mcmVlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2RtYV9oYW5kbGVfdCAqZG1haCkKIHsKLSNpZiBEUk1fREVCVUdfTUVNT1JZCisjaWZkZWYgRFJNX0RFQlVHX01FTU9SWQogCWludCBhcmVhID0gRFJNX01FTV9ETUE7CiAJaW50IGFsbG9jX2NvdW50OwogCWludCBmcmVlX2NvdW50OwogI2VuZGlmCiAKLQlpZiAoIXZhZGRyKSB7Ci0jaWYgRFJNX0RFQlVHX01FTU9SWQorCWlmICghZG1haC0+dmFkZHIpIHsKKyNpZmRlZiBEUk1fREVCVUdfTUVNT1JZCiAJCURSTV9NRU1fRVJST1IoYXJlYSwgIkF0dGVtcHQgdG8gZnJlZSBhZGRyZXNzIDBcbiIpOwogI2VuZGlmCiAJfSBlbHNlIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemUsIHZhZGRyLCBidXNhZGRyKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIGRtYWgtPnNpemUsIGRtYWgtPnZhZGRyLAorCQkJCSAgICBkbWFoLT5idXNhZGRyKTsKIAl9CiAKLSNpZiBEUk1fREVCVUdfTUVNT1JZCisjaWZkZWYgRFJNX0RFQlVHX01FTU9SWQogCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKIAlmcmVlX2NvdW50ID0gKytkcm1fbWVtX3N0YXRzW2FyZWFdLmZyZWVfY291bnQ7CiAJYWxsb2NfY291bnQgPSBkcm1fbWVtX3N0YXRzW2FyZWFdLnN1Y2NlZWRfY291bnQ7CkBAIC0xMzUsNiArMTQ2LDE2IEBACiAjZW5kaWYKIAogfQorCisvKioKKyAqIFxicmllZiBGcmVlIGEgUENJIGNvbnNpc3RlbnQgbWVtb3J5IGJsb2NrCisgKi8KK3ZvaWQKK2RybV9wY2lfZnJlZShkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2RtYV9oYW5kbGVfdCAqZG1haCkKK3sKKwlfX2RybV9wY2lfZnJlZShkZXYsIGRtYWgpOworCWtmcmVlKGRtYWgpOworfQogRVhQT1JUX1NZTUJPTChkcm1fcGNpX2ZyZWUpOwogCiAvKkB9Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaWlkcy5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmgKaW5kZXggNzBjYTRmYS4uNThiMTc0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmgKQEAgLTI1LDYgKzI1LDggQEAKIAl7MHgxMDAyLCAweDQ5NjUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MH0sIFwKIAl7MHgxMDAyLCAweDQ5NjYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MH0sIFwKIAl7MHgxMDAyLCAweDQ5NjcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MH0sIFwKKwl7MHgxMDAyLCAweDRBNDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjQyMH0sIFwKKwl7MHgxMDAyLCAweDRBNEIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjQyMH0sIFwKIAl7MHgxMDAyLCAweDRDNTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyMDB8Q0hJUF9JU19NT0JJTElUWX0sIFwKIAl7MHgxMDAyLCAweDRDNTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyMDB8Q0hJUF9JU19NT0JJTElUWX0sIFwKIAl7MHgxMDAyLCAweDRDNTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYxMDB8Q0hJUF9JU19NT0JJTElUWX0sIFwKQEAgLTMzLDcgKzM1LDE3IEBACiAJezB4MTAwMiwgMHg0QzY1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IyNTB8Q0hJUF9JU19NT0JJTElUWX0sIFwKIAl7MHgxMDAyLCAweDRDNjYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjI1MHxDSElQX0lTX01PQklMSVRZfSwgXAogCXsweDEwMDIsIDB4NEM2NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMjUwfENISVBfSVNfTU9CSUxJVFl9LCBcCisJezB4MTAwMiwgMHg0RTQ0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IzMDB9LCBcCisJezB4MTAwMiwgMHg0RTQ1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IzMDB9LCBcCisJezB4MTAwMiwgMHg0RTQ2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMzUwfSwgXAorCXsweDEwMDIsIDB4NEU0NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzAwfSwgXAorCXsweDEwMDIsIDB4NEU0OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzUwfSwgXAorCXsweDEwMDIsIDB4NEU0OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzUwfSwgXAorCXsweDEwMDIsIDB4NEU0QSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjM1MH0sIFwKKwl7MHgxMDAyLCAweDRFNEIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjM1MH0sIFwKIAl7MHgxMDAyLCAweDRFNTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRFNTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRFNTQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB8Q0hJUF9JU19NT0JJTElUWX0sIFwKIAl7MHgxMDAyLCAweDUxNDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjEwMHxDSElQX1NJTkdMRV9DUlRDfSwgXAogCXsweDEwMDIsIDB4NTE0NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMTAwfENISVBfU0lOR0xFX0NSVEN9LCBcCiAJezB4MTAwMiwgMHg1MTQ2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IxMDB8Q0hJUF9TSU5HTEVfQ1JUQ30sIFwKQEAgLTU2LDYgKzY4LDcgQEAKIAl7MHgxMDAyLCAweDUxNkEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKIAl7MHgxMDAyLCAweDUxNkIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKIAl7MHgxMDAyLCAweDUxNkMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKKwl7MHgxMDAyLCAweDU0NjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB9LCBcCiAJezB4MTAwMiwgMHg1ODM0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTMzAwfENISVBfSVNfSUdQfSwgXAogCXsweDEwMDIsIDB4NTgzNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzMwMHxDSElQX0lTX0lHUHxDSElQX0lTX01PQklMSVRZfSwgXAogCXsweDEwMDIsIDB4NTgzNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzMwMHxDSElQX0lTX0lHUH0sIFwKQEAgLTExNiw5ICsxMjksMTAgQEAKIAl7MCwgMCwgMH0KIAogI2RlZmluZSBtZ2FfUENJX0lEUyBcCi0JezB4MTAyYiwgMHgwNTIxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAotCXsweDEwMmIsIDB4MDUyNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKLQl7MHgxMDJiLCAweDI1MjcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTAyYiwgMHgwNTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNR0FfQ0FSRF9UWVBFX0cyMDB9LCBcCisJezB4MTAyYiwgMHgwNTIxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNR0FfQ0FSRF9UWVBFX0cyMDB9LCBcCisJezB4MTAyYiwgMHgwNTI1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNR0FfQ0FSRF9UWVBFX0c0MDB9LCBcCisJezB4MTAyYiwgMHgyNTI3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNR0FfQ0FSRF9UWVBFX0c1NTB9LCBcCiAJezAsIDAsIDB9CiAKICNkZWZpbmUgbWFjaDY0X1BDSV9JRFMgXApAQCAtMTYyLDkgKzE3NiwxMCBAQAogCiAjZGVmaW5lIHZpYWRydl9QQ0lfSURTIFwKIAl7MHgxMTA2LCAweDMwMjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTEwNiwgMHgzMTE4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAogCXsweDExMDYsIDB4MzEyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKIAl7MHgxMTA2LCAweDcyMDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCi0JezB4MTEwNiwgMHg3MjA0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDExMDYsIDB4MzEwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKIAl7MCwgMCwgMH0KIAogI2RlZmluZSBpODEwX1BDSV9JRFMgXApAQCAtMTgxLDMzICsxOTYsMzAgQEAKIAl7MHg4MDg2LCAweDI1NzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCiAJezAsIDAsIDB9CiAKLSNkZWZpbmUgZ2FtbWFfUENJX0lEUyBcCi0JezB4M2QzZCwgMHgwMDA4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAotCXswLCAwLCAwfQotCiAjZGVmaW5lIHNhdmFnZV9QQ0lfSURTIFwKLQl7MHg1MzMzLCAweDhhMjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCi0JezB4NTMzMywgMHg4YTIzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAotCXsweDUzMzMsIDB4OGMxMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKLQl7MHg1MzMzLCAweDhjMTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCi0JezB4NTMzMywgMHg4YzEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAotCXsweDUzMzMsIDB4OGMxMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKLQl7MHg1MzMzLCAweDhjMjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCi0JezB4NTMzMywgMHg4YzIxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAotCXsweDUzMzMsIDB4OGMyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKLQl7MHg1MzMzLCAweDhjMjQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCi0JezB4NTMzMywgMHg4YzI2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAotCXsweDUzMzMsIDB4OGMyYSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKLQl7MHg1MzMzLCAweDhjMmIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCi0JezB4NTMzMywgMHg4YzJjLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAotCXsweDUzMzMsIDB4OGMyZCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKLQl7MHg1MzMzLCAweDhjMmUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCi0JezB4NTMzMywgMHg4YzJmLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAotCXsweDUzMzMsIDB4OGEyNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKLQl7MHg1MzMzLCAweDhhMjYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCi0JezB4NTMzMywgMHg4ZDAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAotCXsweDUzMzMsIDB4OGQwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKLQl7MHg1MzMzLCAweDhkMDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4NTMzMywgMHg4YTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTM19TQVZBR0UzRH0sIFwKKwl7MHg1MzMzLCAweDhhMjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFMzX1NBVkFHRTNEfSwgXAorCXsweDUzMzMsIDB4OGEyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUzNfU0FWQUdFNH0sIFwKKwl7MHg1MzMzLCAweDhhMjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFMzX1NBVkFHRTR9LCBcCisJezB4NTMzMywgMHg4YzEwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTM19TQVZBR0VfTVh9LCBcCisJezB4NTMzMywgMHg4YzExLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTM19TQVZBR0VfTVh9LCBcCisJezB4NTMzMywgMHg4YzEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTM19TQVZBR0VfTVh9LCBcCisJezB4NTMzMywgMHg4YzEzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTM19TQVZBR0VfTVh9LCBcCisJezB4NTMzMywgMHg4YzIyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTM19TVVBFUlNBVkFHRX0sIFwKKwl7MHg1MzMzLCAweDhjMjQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFMzX1NVUEVSU0FWQUdFfSwgXAorCXsweDUzMzMsIDB4OGMyNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUzNfU1VQRVJTQVZBR0V9LCBcCisJezB4NTMzMywgMHg4YzJhLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTM19TVVBFUlNBVkFHRX0sIFwKKwl7MHg1MzMzLCAweDhjMmIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFMzX1NVUEVSU0FWQUdFfSwgXAorCXsweDUzMzMsIDB4OGMyYywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUzNfU1VQRVJTQVZBR0V9LCBcCisJezB4NTMzMywgMHg4YzJkLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTM19TVVBFUlNBVkFHRX0sIFwKKwl7MHg1MzMzLCAweDhjMmUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFMzX1NVUEVSU0FWQUdFfSwgXAorCXsweDUzMzMsIDB4OGMyZiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUzNfU1VQRVJTQVZBR0V9LCBcCisJezB4NTMzMywgMHg4YTI1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTM19QUk9TQVZBR0V9LCBcCisJezB4NTMzMywgMHg4YTI2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTM19QUk9TQVZBR0V9LCBcCisJezB4NTMzMywgMHg4ZDAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTM19UV0lTVEVSfSwgXAorCXsweDUzMzMsIDB4OGQwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUzNfVFdJU1RFUn0sIFwKKwl7MHg1MzMzLCAweDhkMDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFMzX1BST1NBVkFHRUREUn0sIFwKKwl7MHg1MzMzLCAweDhkMDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFMzX1BST1NBVkFHRUREUn0sIFwKIAl7MCwgMCwgMH0KIAogI2RlZmluZSBmZmJfUENJX0lEUyBcCkBAIC0yMjMsMTAgKzIzNSwzIEBACiAJezB4ODA4NiwgMHgyNzcyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAogCXswLCAwLCAwfQogCi0jZGVmaW5lIHZpYWRydl9QQ0lfSURTIFwKLQl7MHgxMTA2LCAweDMwMjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCi0JezB4MTEwNiwgMHgzMTIyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAotCXsweDExMDYsIDB4NzIwNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKLQl7MHgxMTA2LCAweDcyMDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCi0JezAsIDAsIDB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYwppbmRleCA0Nzc0MDg3Li4zMmQyYmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCkBAIC0yMTAsOCArMjEwLDggQEAKIAogCQkJCS8qIEhhcmRjb2RlZCBmcm9tIF9EUk1fRlJBTUVfQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRFJNX1JFR0lTVEVSUywgX0RSTV9TSE0sIF9EUk1fQUdQLCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RSTV9TQ0FUVEVSX0dBVEhFUi4gKi8KLQljb25zdCBjaGFyICAgKnR5cGVzW10gPSB7ICJGQiIsICJSRUciLCAiU0hNIiwgIkFHUCIsICJTRyIgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RSTV9TQ0FUVEVSX0dBVEhFUiBhbmQgX0RSTV9DT05TSVNURU5UICovCisJY29uc3QgY2hhciAgICp0eXBlc1tdID0geyAiRkIiLCAiUkVHIiwgIlNITSIsICJBR1AiLCAiU0ciLCAiUENJIiB9OwogCWNvbnN0IGNoYXIgICAqdHlwZTsKIAlpbnQJICAgICBpOwogCkBAIC0yMjksMTYgKzIyOSwxOSBAQAogCWlmIChkZXYtPm1hcGxpc3QgIT0gTlVMTCkgbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CiAJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOwogCQltYXAgPSByX2xpc3QtPm1hcDsKLQkJaWYoIW1hcCkgY29udGludWU7Ci0JCWlmIChtYXAtPnR5cGUgPCAwIHx8IG1hcC0+dHlwZSA+IDQpIHR5cGUgPSAiPz8iOwotCQllbHNlCQkJCSAgICB0eXBlID0gdHlwZXNbbWFwLT50eXBlXTsKLQkJRFJNX1BST0NfUFJJTlQoIiU0ZCAweCUwOGx4IDB4JTA4bHggJTQuNHMgIDB4JTAyeCAweCUwOGx4ICIsCisJCWlmKCFtYXApCisJCQljb250aW51ZTsKKwkJaWYgKG1hcC0+dHlwZSA8IDAgfHwgbWFwLT50eXBlID4gNSkKKwkJCXR5cGUgPSAiPz8iOworCQllbHNlCQorCQkJdHlwZSA9IHR5cGVzW21hcC0+dHlwZV07CisJCURSTV9QUk9DX1BSSU5UKCIlNGQgMHglMDhseCAweCUwOGx4ICU0LjRzICAweCUwMnggMHglMDh4ICIsCiAJCQkgICAgICAgaSwKIAkJCSAgICAgICBtYXAtPm9mZnNldCwKIAkJCSAgICAgICBtYXAtPnNpemUsCiAJCQkgICAgICAgdHlwZSwKIAkJCSAgICAgICBtYXAtPmZsYWdzLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKW1hcC0+aGFuZGxlKTsKKwkJCSAgICAgICByX2xpc3QtPnVzZXJfdG9rZW4pOwogCQlpZiAobWFwLT5tdHJyIDwgMCkgewogCQkJRFJNX1BST0NfUFJJTlQoIm5vbmVcbiIpOwogCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc2NhdHRlci5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc2NhdHRlci5jCmluZGV4IDU0ZmRkYjYuLmVkMjY3ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NjYXR0ZXIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zY2F0dGVyLmMKQEAgLTYxLDYgKzYxLDEyIEBACiAJCSAgIERSTV9NRU1fU0dMSVNUUyApOwogfQogCisjaWZkZWYgX0xQNjQKKyMgZGVmaW5lIFNjYXR0ZXJIYW5kbGUoeCkgKHVuc2lnbmVkIGludCkoKHggPj4gMzIpICsgKHggJiAoKDFMIDw8IDMyKSAtIDEpKSkKKyNlbHNlCisjIGRlZmluZSBTY2F0dGVySGFuZGxlKHgpICh1bnNpZ25lZCBpbnQpKHgpCisjZW5kaWYKKwogaW50IGRybV9zZ19hbGxvYyggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKIHsKQEAgLTEzMywxMiArMTM5LDEzIEBACiAJICovCiAJbWVtc2V0KCBlbnRyeS0+dmlydHVhbCwgMCwgcGFnZXMgPDwgUEFHRV9TSElGVCApOwogCi0JZW50cnktPmhhbmRsZSA9ICh1bnNpZ25lZCBsb25nKWVudHJ5LT52aXJ0dWFsOworCWVudHJ5LT5oYW5kbGUgPSBTY2F0dGVySGFuZGxlKCh1bnNpZ25lZCBsb25nKWVudHJ5LT52aXJ0dWFsKTsKIAogCURSTV9ERUJVRyggInNnIGFsbG9jIGhhbmRsZSAgPSAlMDhseFxuIiwgZW50cnktPmhhbmRsZSApOwogCURSTV9ERUJVRyggInNnIGFsbG9jIHZpcnR1YWwgPSAlcFxuIiwgZW50cnktPnZpcnR1YWwgKTsKIAotCWZvciAoIGkgPSBlbnRyeS0+aGFuZGxlLCBqID0gMCA7IGogPCBwYWdlcyA7IGkgKz0gUEFHRV9TSVpFLCBqKysgKSB7CisJZm9yIChpID0gKHVuc2lnbmVkIGxvbmcpZW50cnktPnZpcnR1YWwsIGogPSAwOyBqIDwgcGFnZXM7IAorCQlpICs9IFBBR0VfU0laRSwgaisrKSB7CiAJCWVudHJ5LT5wYWdlbGlzdFtqXSA9IHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWkpOwogCQlpZiAoIWVudHJ5LT5wYWdlbGlzdFtqXSkKIAkJCWdvdG8gZmFpbGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCmluZGV4IDQ4ODI5YTEuLjk1YTk3NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMKQEAgLTc1LDYgKzc1LDExIEBACiAJZGV2LT5wY2lfZnVuYyA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKIAlkZXYtPmlycSA9IHBkZXYtPmlycTsKIAorCWRldi0+bWFwbGlzdCA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKCpkZXYtPm1hcGxpc3QpLCBEUk1fTUVNX01BUFMpOworCWlmIChkZXYtPm1hcGxpc3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+bWFwbGlzdC0+aGVhZCk7CisKIAkvKiB0aGUgRFJNIGhhcyA2IGJhc2ljIGNvdW50ZXJzICovCiAJZGV2LT5jb3VudGVycyA9IDY7CiAJZGV2LT50eXBlc1swXSAgPSBfRFJNX1NUQVRfTE9DSzsKQEAgLTkxLDcgKzk2LDggQEAKIAkJCWdvdG8gZXJyb3Jfb3V0X3VucmVnOwogCiAJaWYgKGRybV9jb3JlX2hhc19BR1AoZGV2KSkgewotCQlkZXYtPmFncCA9IGRybV9hZ3BfaW5pdChkZXYpOworCQlpZiAoZHJtX2RldmljZV9pc19hZ3AoZGV2KSkKKwkJCWRldi0+YWdwID0gZHJtX2FncF9pbml0KGRldik7CiAJCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1JFUVVJUkVfQUdQKSAmJiAoZGV2LT5hZ3AgPT0gTlVMTCkpIHsKIAkJCURSTV9FUlJPUiggIkNhbm5vdCBpbml0aWFsaXplIHRoZSBhZ3BnYXJ0IG1vZHVsZS5cbiIgKTsKIAkJCXJldGNvZGUgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKaW5kZXggMmZjMTBjNC4uNDc1Y2M1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKICNpbmNsdWRlICJkcm1fY29yZS5oIgorI2luY2x1ZGUgImRybVAuaCIKIAogc3RydWN0IGRybV9zeXNmc19jbGFzcyB7CiAJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgYXR0cjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jCmluZGV4IDYyMTIyMGYuLmNlZDQyMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYwpAQCAtNzMsMTIgKzczLDEzIEBACiAJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOwogCQltYXAgPSByX2xpc3QtPm1hcDsKIAkJaWYgKCFtYXApIGNvbnRpbnVlOwotCQlpZiAobWFwLT5vZmZzZXQgPT0gVk1fT0ZGU0VUKHZtYSkpIGJyZWFrOworCQlpZiAocl9saXN0LT51c2VyX3Rva2VuID09IFZNX09GRlNFVCh2bWEpKQorCQkJYnJlYWs7CiAJfQogCiAJaWYgKG1hcCAmJiBtYXAtPnR5cGUgPT0gX0RSTV9BR1ApIHsKIAkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBhZGRyZXNzIC0gdm1hLT52bV9zdGFydDsKLQkJdW5zaWduZWQgbG9uZyBiYWRkciA9IFZNX09GRlNFVCh2bWEpICsgb2Zmc2V0OworCQl1bnNpZ25lZCBsb25nIGJhZGRyID0gbWFwLT5vZmZzZXQgKyBvZmZzZXQ7CiAJCXN0cnVjdCBkcm1fYWdwX21lbSAqYWdwbWVtOwogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIApAQCAtMjEwLDYgKzIxMSw4IEBACiAJCX0KIAogCQlpZighZm91bmRfbWFwcykgeworCQkJZHJtX2RtYV9oYW5kbGVfdCBkbWFoOworCiAJCQlzd2l0Y2ggKG1hcC0+dHlwZSkgewogCQkJY2FzZSBfRFJNX1JFR0lTVEVSUzoKIAkJCWNhc2UgX0RSTV9GUkFNRV9CVUZGRVI6CkBAIC0yMjgsNiArMjMxLDEyIEBACiAJCQljYXNlIF9EUk1fQUdQOgogCQkJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgogCQkJCWJyZWFrOworCQkJY2FzZSBfRFJNX0NPTlNJU1RFTlQ6CisJCQkJZG1haC52YWRkciA9IG1hcC0+aGFuZGxlOworCQkJCWRtYWguYnVzYWRkciA9IG1hcC0+b2Zmc2V0OworCQkJCWRtYWguc2l6ZSA9IG1hcC0+c2l6ZTsKKwkJCQlfX2RybV9wY2lfZnJlZShkZXYsICZkbWFoKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWRybV9mcmVlKG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMpOwogCQl9CkBAIC0yOTYsNyArMzA1LDcgQEAKIAogCiAJb2Zmc2V0ID0gYWRkcmVzcyAtIHZtYS0+dm1fc3RhcnQ7Ci0JbWFwX29mZnNldCA9IG1hcC0+b2Zmc2V0IC0gZGV2LT5zZy0+aGFuZGxlOworCW1hcF9vZmZzZXQgPSBtYXAtPm9mZnNldCAtICh1bnNpZ25lZCBsb25nKWRldi0+c2ctPnZpcnR1YWw7CiAJcGFnZV9vZmZzZXQgPSAob2Zmc2V0ID4+IFBBR0VfU0hJRlQpICsgKG1hcF9vZmZzZXQgPj4gUEFHRV9TSElGVCk7CiAJcGFnZSA9IGVudHJ5LT5wYWdlbGlzdFtwYWdlX29mZnNldF07CiAJZ2V0X3BhZ2UocGFnZSk7CkBAIC0zMDUsOCArMzE0LDYgQEAKIH0KIAogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDApCi0KIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZHJtX3ZtX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCQkJICAgaW50ICp0eXBlKSB7CkBAIC0zMzUsMzUgKzM0Miw2IEBACiAJcmV0dXJuIGRybV9kb192bV9zZ19ub3BhZ2Uodm1hLCBhZGRyZXNzKTsKIH0KIAotI2Vsc2UJLyogTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSAqLwotCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmRybV92bV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAotCQkJCSAgIGludCB1bnVzZWQpIHsKLQlyZXR1cm4gZHJtX2RvX3ZtX25vcGFnZSh2bWEsIGFkZHJlc3MpOwotfQotCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmRybV92bV9zaG1fbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCi0JCQkJICAgICAgIGludCB1bnVzZWQpIHsKLQlyZXR1cm4gZHJtX2RvX3ZtX3NobV9ub3BhZ2Uodm1hLCBhZGRyZXNzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwYWdlICpkcm1fdm1fZG1hX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAotCQkJCSAgICAgICBpbnQgdW51c2VkKSB7Ci0JcmV0dXJuIGRybV9kb192bV9kbWFfbm9wYWdlKHZtYSwgYWRkcmVzcyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZHJtX3ZtX3NnX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCi0JCQkJICAgICAgaW50IHVudXNlZCkgewotCXJldHVybiBkcm1fZG9fdm1fc2dfbm9wYWdlKHZtYSwgYWRkcmVzcyk7Ci19Ci0KLSNlbmRpZgotCi0KIC8qKiBBR1AgdmlydHVhbCBtZW1vcnkgb3BlcmF0aW9ucyAqLwogc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCAgIGRybV92bV9vcHMgPSB7CiAJLm5vcGFnZSA9IGRybV92bV9ub3BhZ2UsCkBAIC00ODcsMTEgKzQ2NSw3IEBACiAKIAl2bWEtPnZtX29wcyAgID0gJmRybV92bV9kbWFfb3BzOwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MDIwNDBlIC8qIEtFUk5FTF9WRVJTSU9OKDIsNCwxNCkgKi8KLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0xPQ0tFRCB8IFZNX1NITTsgLyogRG9uJ3Qgc3dhcCAqLwotI2Vsc2UKIAl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOyAvKiBEb24ndCBzd2FwICovCi0jZW5kaWYKIAogCXZtYS0+dm1fZmlsZSAgPQkgZmlscDsJLyogTmVlZGVkIGZvciBkcm1fdm1fb3BlbigpICovCiAJZHJtX3ZtX29wZW4odm1hKTsKQEAgLTU2MCwxMyArNTM0LDEyIEBACiAJCQkJICAgZm9yIHBlcmZvcm1hbmNlLCBldmVuIGlmIHRoZSBsaXN0IHdhcyBhCiAJCQkJICAgYml0IGxvbmdlci4gKi8KIAlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJdW5zaWduZWQgbG9uZyBvZmY7CiAKIAkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CiAJCW1hcCA9IHJfbGlzdC0+bWFwOwogCQlpZiAoIW1hcCkgY29udGludWU7Ci0JCW9mZiA9IGRldi0+ZHJpdmVyLT5nZXRfbWFwX29mcyhtYXApOwotCQlpZiAob2ZmID09IFZNX09GRlNFVCh2bWEpKSBicmVhazsKKwkJaWYgKHJfbGlzdC0+dXNlcl90b2tlbiA9PSBWTV9PRkZTRVQodm1hKSkKKwkJCWJyZWFrOwogCX0KIAogCWlmICghbWFwIHx8ICgobWFwLT5mbGFncyZfRFJNX1JFU1RSSUNURUQpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSkKQEAgLTYwNSwxNyArNTc4LDE3IEBACiAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIHRvIF9EUk1fRlJBTUVfQlVGRkVSLi4uICovICAgICAgICAKIAljYXNlIF9EUk1fRlJBTUVfQlVGRkVSOgogCWNhc2UgX0RSTV9SRUdJU1RFUlM6Ci0JCWlmIChWTV9PRkZTRVQodm1hKSA+PSBfX3BhKGhpZ2hfbWVtb3J5KSkgewogI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKLQkJCWlmIChib290X2NwdV9kYXRhLng4NiA+IDMgJiYgbWFwLT50eXBlICE9IF9EUk1fQUdQKSB7Ci0JCQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfUENEOwotCQkJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpICY9IH5fUEFHRV9QV1Q7Ci0JCQl9Ci0jZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQotCQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEOwotI2VuZGlmCi0JCQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOwkvKiBub3QgaW4gY29yZSBkdW1wICovCisJCWlmIChib290X2NwdV9kYXRhLng4NiA+IDMgJiYgbWFwLT50eXBlICE9IF9EUk1fQUdQKSB7CisJCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9QQ0Q7CisJCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSAmPSB+X1BBR0VfUFdUOwogCQl9CisjZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9OT19DQUNIRTsKKwkJaWYgKG1hcC0+dHlwZSA9PSBfRFJNX1JFR0lTVEVSUykKKwkJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX0dVQVJERUQ7CisjZW5kaWYKKwkJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsJLyogbm90IGluIGNvcmUgZHVtcCAqLwogI2lmIGRlZmluZWQoX19pYTY0X18pCiAJCWlmIChlZmlfcmFuZ2VfaXNfd2Modm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLQogCQkJCSAgICB2bWEtPnZtX3N0YXJ0KSkKQEAgLTYyOCwxMiArNjAxLDEyIEBACiAJCW9mZnNldCA9IGRldi0+ZHJpdmVyLT5nZXRfcmVnX29mcyhkZXYpOwogI2lmZGVmIF9fc3BhcmNfXwogCQlpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKERSTV9SUFJfQVJHKHZtYSkgdm1hLT52bV9zdGFydCwKLQkJCQkJKFZNX09GRlNFVCh2bWEpICsgb2Zmc2V0KSA+PiBQQUdFX1NISUZULAorCQkJCQkobWFwLT5vZmZzZXQgKyBvZmZzZXQpID4+IFBBR0VfU0hJRlQsCiAJCQkJCXZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKIAkJCQkJdm1hLT52bV9wYWdlX3Byb3QpKQogI2Vsc2UKIAkJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCi0JCQkJICAgICAoVk1fT0ZGU0VUKHZtYSkgKyBvZmZzZXQpID4+IFBBR0VfU0hJRlQsCisJCQkJICAgICAobWFwLT5vZmZzZXQgKyBvZmZzZXQpID4+IFBBR0VfU0hJRlQsCiAJCQkJICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCiAJCQkJICAgICB2bWEtPnZtX3BhZ2VfcHJvdCkpCiAjZW5kaWYKQEAgLTY0MSwzNyArNjE0LDI4IEBACiAJCURSTV9ERUJVRygiICAgVHlwZSA9ICVkOyBzdGFydCA9IDB4JWx4LCBlbmQgPSAweCVseCwiCiAJCQkgICIgb2Zmc2V0ID0gMHglbHhcbiIsCiAJCQkgIG1hcC0+dHlwZSwKLQkJCSAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIFZNX09GRlNFVCh2bWEpICsgb2Zmc2V0KTsKKwkJCSAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIG1hcC0+b2Zmc2V0ICsgb2Zmc2V0KTsKIAkJdm1hLT52bV9vcHMgPSAmZHJtX3ZtX29wczsKIAkJYnJlYWs7CiAJY2FzZSBfRFJNX1NITToKKwljYXNlIF9EUk1fQ09OU0lTVEVOVDoKKwkJLyogQ29uc2lzdGVudCBtZW1vcnkgaXMgcmVhbGx5IGxpa2Ugc2hhcmVkIG1lbW9yeS4gSXQncyBvbmx5CisJCSAqIGFsbG9jYXRlIGluIGEgZGlmZmVyZW50IHdheSAqLwogCQl2bWEtPnZtX29wcyA9ICZkcm1fdm1fc2htX29wczsKIAkJdm1hLT52bV9wcml2YXRlX2RhdGEgPSAodm9pZCAqKW1hcDsKIAkJCQkvKiBEb24ndCBsZXQgdGhpcyBhcmVhIHN3YXAuICBDaGFuZ2Ugd2hlbgogCQkJCSAgIERSTV9LRVJORUwgYWR2aXNvcnkgaXMgc3VwcG9ydGVkLiAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDAyMDQwZSAvKiBLRVJORUxfVkVSU0lPTigyLDQsMTQpICovCi0JCXZtYS0+dm1fZmxhZ3MgfD0gVk1fTE9DS0VEOwotI2Vsc2UKIAkJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKLSNlbmRpZgogCQlicmVhazsKIAljYXNlIF9EUk1fU0NBVFRFUl9HQVRIRVI6CiAJCXZtYS0+dm1fb3BzID0gJmRybV92bV9zZ19vcHM7CiAJCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gKHZvaWQgKiltYXA7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MDIwNDBlIC8qIEtFUk5FTF9WRVJTSU9OKDIsNCwxNCkgKi8KLQkJdm1hLT52bV9mbGFncyB8PSBWTV9MT0NLRUQ7Ci0jZWxzZQogCQl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOwotI2VuZGlmCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KIAl9Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MDIwNDBlIC8qIEtFUk5FTF9WRVJTSU9OKDIsNCwxNCkgKi8KLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0xPQ0tFRCB8IFZNX1NITTsgLyogRG9uJ3Qgc3dhcCAqLwotI2Vsc2UKIAl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOyAvKiBEb24ndCBzd2FwICovCi0jZW5kaWYKIAogCXZtYS0+dm1fZmlsZSAgPQkgZmlscDsJLyogTmVlZGVkIGZvciBkcm1fdm1fb3BlbigpICovCiAJZHJtX3ZtX29wZW4odm1hKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZmZiX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9mZmJfZHJ2LmMKaW5kZXggZWM2MTRmZi4uMWJkMGQ1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9mZmJfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9mZmJfZHJ2LmMKQEAgLTE1MiwxNCArMTUyLDExIEBACiAJCXJldHVybiBOVUxMOwogCiAJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdW9mZjsKLQogCQlyX2xpc3QgPSAoZHJtX21hcF9saXN0X3QgKilsaXN0OwogCQltYXAgPSByX2xpc3QtPm1hcDsKIAkJaWYgKCFtYXApCiAJCQljb250aW51ZTsKLQkJdW9mZiA9IChtYXAtPm9mZnNldCAmIDB4ZmZmZmZmZmYpOwotCQlpZiAodW9mZiA9PSBvZmYpCisJCWlmIChyX2xpc3QtPnVzZXJfdG9rZW4gPT0gb2ZmKQogCQkJcmV0dXJuIG1hcDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfY29udGV4dC5oIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9jb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMWI1MDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9jb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyogZHJtX2NvbnRleHQuaCAtLSBJT0NUTHMgZm9yIGdlbmVyaWMgY29udGV4dHMgLSotIGxpbnV4LWMgLSotCi0gKiBDcmVhdGVkOiBGcmkgTm92IDI0IDE4OjMxOjM3IDIwMDAgYnkgZ2FyZXRoQHZhbGludXguY29tCi0gKgotICogQ29weXJpZ2h0IDE5OTksIDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLSAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLSAqIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAotICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgotICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi0gKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKLSAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKiBBdXRob3JzOgotICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+Ci0gKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+Ci0gKiBDaGFuZ2VMb2c6Ci0gKiAgMjAwMS0xMS0xNglUb3JzdGVuIER1d2UgPGR1d2VAY2FsZGVyYS5kZT4KLSAqCQlhZGRlZCBjb250ZXh0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgaG9va3MsCi0gKgkJbmVlZGVkIGJ5IFNpUyBkcml2ZXIncyBtZW1vcnkgbWFuYWdlbWVudC4KLSAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBPbGQtc3R5bGUgY29udGV4dCBzdXBwb3J0IC0tIG9ubHkgdXNlZCBieSBnYW1tYS4gIAotICovCi0KLQotLyogVGhlIGRybV9yZWFkIGFuZCBkcm1fd3JpdGVfc3RyaW5nIGNvZGUgKGVzcGVjaWFsbHkgdGhhdCB3aGljaCBtYW5hZ2VzCi0gICB0aGUgY2lyY3VsYXIgYnVmZmVyKSwgaXMgYmFzZWQgb24gQWxlc3NhbmRybyBSdWJpbmkncyBMSU5VWCBERVZJQ0UKLSAgIERSSVZFUlMgKENhbWJyaWRnZTogTydSZWlsbHksIDE5OTgpLCBwYWdlcyAxMTEtMTEzLiAqLwotCi1zc2l6ZV90IGdhbW1hX2ZvcHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKLXsKLQlkcm1fZmlsZV90ICAgICpwcml2ICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICAqZGV2ICAgID0gcHJpdi0+ZGV2OwotCWludAkgICAgICBsZWZ0OwotCWludAkgICAgICBhdmFpbDsKLQlpbnQJICAgICAgc2VuZDsKLQlpbnQJICAgICAgY3VyOwotCi0JRFJNX0RFQlVHKCIlcCwgJXBcbiIsIGRldi0+YnVmX3JwLCBkZXYtPmJ1Zl93cCk7Ci0KLQl3aGlsZSAoZGV2LT5idWZfcnAgPT0gZGV2LT5idWZfd3ApIHsKLQkJRFJNX0RFQlVHKCIgIHNsZWVwaW5nXG4iKTsKLQkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZkZXYtPmJ1Zl9yZWFkZXJzKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlEUk1fREVCVUcoIiAgaW50ZXJydXB0ZWRcbiIpOwotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQkJfQotCQlEUk1fREVCVUcoIiAgYXdha2VcbiIpOwotCX0KLQotCWxlZnQgID0gKGRldi0+YnVmX3JwICsgRFJNX0JTWiAtIGRldi0+YnVmX3dwKSAlIERSTV9CU1o7Ci0JYXZhaWwgPSBEUk1fQlNaIC0gbGVmdDsKLQlzZW5kICA9IERSTV9NSU4oYXZhaWwsIGNvdW50KTsKLQotCXdoaWxlIChzZW5kKSB7Ci0JCWlmIChkZXYtPmJ1Zl93cCA+IGRldi0+YnVmX3JwKSB7Ci0JCQljdXIgPSBEUk1fTUlOKHNlbmQsIGRldi0+YnVmX3dwIC0gZGV2LT5idWZfcnApOwotCQl9IGVsc2UgewotCQkJY3VyID0gRFJNX01JTihzZW5kLCBkZXYtPmJ1Zl9lbmQgLSBkZXYtPmJ1Zl9ycCk7Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGRldi0+YnVmX3JwLCBjdXIpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWRldi0+YnVmX3JwICs9IGN1cjsKLQkJaWYgKGRldi0+YnVmX3JwID09IGRldi0+YnVmX2VuZCkgZGV2LT5idWZfcnAgPSBkZXYtPmJ1ZjsKLQkJc2VuZCAtPSBjdXI7Ci0JfQotCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPmJ1Zl93cml0ZXJzKTsKLQlyZXR1cm4gRFJNX01JTihhdmFpbCwgY291bnQpOwotfQotCi0KLS8qIEluIGFuIGluY3JlZGlibHkgY29udm9sdXRlZCBzZXR1cCwgdGhlIGtlcm5lbCBtb2R1bGUgYWN0dWFsbHkgY2FsbHMKLSAqIGJhY2sgaW50byB0aGUgWCBzZXJ2ZXIgdG8gcGVyZm9ybSBjb250ZXh0IHN3aXRjaGVzIG9uIGJlaGFsZiBvZiB0aGUKLSAqIDNkIGNsaWVudHMuCi0gKi8KLWludCBEUk0od3JpdGVfc3RyaW5nKShkcm1fZGV2aWNlX3QgKmRldiwgY29uc3QgY2hhciAqcykKLXsKLQlpbnQgbGVmdCAgID0gKGRldi0+YnVmX3JwICsgRFJNX0JTWiAtIGRldi0+YnVmX3dwKSAlIERSTV9CU1o7Ci0JaW50IHNlbmQgICA9IHN0cmxlbihzKTsKLQlpbnQgY291bnQ7Ci0KLQlEUk1fREVCVUcoIiVkIGxlZnQsICVkIHRvIHNlbmQgKCVwLCAlcClcbiIsCi0JCSAgbGVmdCwgc2VuZCwgZGV2LT5idWZfcnAsIGRldi0+YnVmX3dwKTsKLQotCWlmIChsZWZ0ID09IDEgfHwgZGV2LT5idWZfd3AgIT0gZGV2LT5idWZfcnApIHsKLQkJRFJNX0VSUk9SKCJCdWZmZXIgbm90IGVtcHR5ICglZCBsZWZ0LCB3cCA9ICVwLCBycCA9ICVwKVxuIiwKLQkJCSAgbGVmdCwKLQkJCSAgZGV2LT5idWZfd3AsCi0JCQkgIGRldi0+YnVmX3JwKTsKLQl9Ci0KLQl3aGlsZSAoc2VuZCkgewotCQlpZiAoZGV2LT5idWZfd3AgPj0gZGV2LT5idWZfcnApIHsKLQkJCWNvdW50ID0gRFJNX01JTihzZW5kLCBkZXYtPmJ1Zl9lbmQgLSBkZXYtPmJ1Zl93cCk7Ci0JCQlpZiAoY291bnQgPT0gbGVmdCkgLS1jb3VudDsgLyogTGVhdmUgYSBob2xlICovCi0JCX0gZWxzZSB7Ci0JCQljb3VudCA9IERSTV9NSU4oc2VuZCwgZGV2LT5idWZfcnAgLSBkZXYtPmJ1Zl93cCAtIDEpOwotCQl9Ci0JCXN0cm5jcHkoZGV2LT5idWZfd3AsIHMsIGNvdW50KTsKLQkJZGV2LT5idWZfd3AgKz0gY291bnQ7Ci0JCWlmIChkZXYtPmJ1Zl93cCA9PSBkZXYtPmJ1Zl9lbmQpIGRldi0+YnVmX3dwID0gZGV2LT5idWY7Ci0JCXNlbmQgLT0gY291bnQ7Ci0JfQotCi0JaWYgKGRldi0+YnVmX2FzeW5jKSBraWxsX2Zhc3luYygmZGV2LT5idWZfYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKLQotCURSTV9ERUJVRygid2FraW5nXG4iKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+YnVmX3JlYWRlcnMpOwotCXJldHVybiAwOwotfQotCi11bnNpZ25lZCBpbnQgZ2FtbWFfZm9wc19wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0JZHJtX2ZpbGVfdCAgICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ICA9IHByaXYtPmRldjsKLQotCXBvbGxfd2FpdChmaWxwLCAmZGV2LT5idWZfcmVhZGVycywgd2FpdCk7Ci0JaWYgKGRldi0+YnVmX3dwICE9IGRldi0+YnVmX3JwKSByZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IERSTShjb250ZXh0X3N3aXRjaCkoZHJtX2RldmljZV90ICpkZXYsIGludCBvbGQsIGludCBuZXcpCi17Ci0JY2hhcgkgICAgYnVmWzY0XTsKLQlkcm1fcXVldWVfdCAqcTsKLQotCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkZXYtPmNvbnRleHRfZmxhZykpIHsKLQkJRFJNX0VSUk9SKCJSZWVudGVyaW5nIC0tIEZJWE1FXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlEUk1fREVCVUcoIkNvbnRleHQgc3dpdGNoIGZyb20gJWQgdG8gJWRcbiIsIG9sZCwgbmV3KTsKLQotCWlmIChuZXcgPj0gZGV2LT5xdWV1ZV9jb3VudCkgewotCQljbGVhcl9iaXQoMCwgJmRldi0+Y29udGV4dF9mbGFnKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG5ldyA9PSBkZXYtPmxhc3RfY29udGV4dCkgewotCQljbGVhcl9iaXQoMCwgJmRldi0+Y29udGV4dF9mbGFnKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcSA9IGRldi0+cXVldWVsaXN0W25ld107Ci0JYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKLQlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPT0gMSkgewotCQlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOwotCQljbGVhcl9iaXQoMCwgJmRldi0+Y29udGV4dF9mbGFnKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogVGhpcyBjYXVzZXMgdGhlIFggc2VydmVyIHRvIHdha2UgdXAgJiBkbyBhIGJ1bmNoIG9mIGhhcmR3YXJlCi0JICogaW50ZXJhY3Rpb24gdG8gYWN0dWFsbHkgZWZmZWN0IHRoZSBjb250ZXh0IHN3aXRjaC4KLQkgKi8KLQlzcHJpbnRmKGJ1ZiwgIkMgJWQgJWRcbiIsIG9sZCwgbmV3KTsKLQlEUk0od3JpdGVfc3RyaW5nKShkZXYsIGJ1Zik7Ci0KLQlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBEUk0oY29udGV4dF9zd2l0Y2hfY29tcGxldGUpKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbmV3KQotewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCi0JZGV2LT5sYXN0X2NvbnRleHQgPSBuZXc7ICAvKiBQUkUvUE9TVDogVGhpcyBpcyB0aGUgX29ubHlfIHdyaXRlci4gKi8KLQlkZXYtPmxhc3Rfc3dpdGNoICA9IGppZmZpZXM7Ci0KLQlpZiAoIV9EUk1fTE9DS19JU19IRUxEKGRldi0+bG9jay5od19sb2NrLT5sb2NrKSkgewotCQlEUk1fRVJST1IoIkxvY2sgaXNuJ3QgaGVsZCBhZnRlciBjb250ZXh0IHN3aXRjaFxuIik7Ci0JfQotCi0JaWYgKCFkbWEgfHwgIShkbWEtPm5leHRfYnVmZmVyICYmIGRtYS0+bmV4dF9idWZmZXItPndoaWxlX2xvY2tlZCkpIHsKLQkJaWYgKERSTShsb2NrX2ZyZWUpKGRldiwgJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAotCQkJCSAgRFJNX0tFUk5FTF9DT05URVhUKSkgewotCQkJRFJNX0VSUk9SKCJDYW5ub3QgZnJlZSBsb2NrXG4iKTsKLQkJfQotCX0KLQotCWNsZWFyX2JpdCgwLCAmZGV2LT5jb250ZXh0X2ZsYWcpOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5jb250ZXh0X3dhaXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgRFJNKGluaXRfcXVldWUpKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fcXVldWVfdCAqcSwgZHJtX2N0eF90ICpjdHgpCi17Ci0JRFJNX0RFQlVHKCJcbiIpOwotCi0JaWYgKGF0b21pY19yZWFkKCZxLT51c2VfY291bnQpICE9IDEKLQkgICAgfHwgYXRvbWljX3JlYWQoJnEtPmZpbmFsaXphdGlvbikKLQkgICAgfHwgYXRvbWljX3JlYWQoJnEtPmJsb2NrX2NvdW50KSkgewotCQlEUk1fRVJST1IoIk5ldyBxdWV1ZSBpcyBhbHJlYWR5IGluIHVzZTogdSVkIGYlZCBiJWRcbiIsCi0JCQkgIGF0b21pY19yZWFkKCZxLT51c2VfY291bnQpLAotCQkJICBhdG9taWNfcmVhZCgmcS0+ZmluYWxpemF0aW9uKSwKLQkJCSAgYXRvbWljX3JlYWQoJnEtPmJsb2NrX2NvdW50KSk7Ci0JfQotCi0JYXRvbWljX3NldCgmcS0+ZmluYWxpemF0aW9uLCAgMCk7Ci0JYXRvbWljX3NldCgmcS0+YmxvY2tfY291bnQsICAgMCk7Ci0JYXRvbWljX3NldCgmcS0+YmxvY2tfcmVhZCwgICAgMCk7Ci0JYXRvbWljX3NldCgmcS0+YmxvY2tfd3JpdGUsICAgMCk7Ci0JYXRvbWljX3NldCgmcS0+dG90YWxfcXVldWVkLCAgMCk7Ci0JYXRvbWljX3NldCgmcS0+dG90YWxfZmx1c2hlZCwgMCk7Ci0JYXRvbWljX3NldCgmcS0+dG90YWxfbG9ja3MsICAgMCk7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxLT53cml0ZV9xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcS0+cmVhZF9xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcS0+Zmx1c2hfcXVldWUpOwotCi0JcS0+ZmxhZ3MgPSBjdHgtPmZsYWdzOwotCi0JRFJNKHdhaXRsaXN0X2NyZWF0ZSkoJnEtPndhaXRsaXN0LCBkZXYtPmRtYS0+YnVmX2NvdW50KTsKLQotCXJldHVybiAwOwotfQotCi0KLS8qIGRybV9hbGxvY19xdWV1ZToKLVBSRTogMSkgZGV2LT5xdWV1ZWxpc3RbMC4uZGV2LT5xdWV1ZV9jb3VudF0gaXMgYWxsb2NhdGVkIGFuZCB3aWxsIG5vdAotCWRpc2FwcGVhciAoc28gYWxsIGRlYWxsb2NhdGlvbiBtdXN0IGJlIGRvbmUgYWZ0ZXIgSU9DVExzIGFyZSBvZmYpCi0gICAgIDIpIGRldi0+cXVldWVfY291bnQgPCBkZXYtPnF1ZXVlX3Nsb3RzCi0gICAgIDMpIGRldi0+cXVldWVsaXN0W2ldLnVzZV9jb3VudCA9PSAwIGFuZAotCWRldi0+cXVldWVsaXN0W2ldLmZpbmFsaXphdGlvbiA9PSAwIGlmIGkgbm90IGluIHVzZQotUE9TVDogMSkgZGV2LT5xdWV1ZWxpc3RbaV0udXNlX2NvdW50ID09IDEKLSAgICAgIDIpIGRldi0+cXVldWVfY291bnQgPCBkZXYtPnF1ZXVlX3Nsb3RzICovCi0KLXN0YXRpYyBpbnQgRFJNKGFsbG9jX3F1ZXVlKShkcm1fZGV2aWNlX3QgKmRldikKLXsKLQlpbnQJICAgIGk7Ci0JZHJtX3F1ZXVlX3QgKnF1ZXVlOwotCWludAkgICAgb2xkc2xvdHM7Ci0JaW50CSAgICBuZXdzbG90czsKLQkJCQkvKiBDaGVjayBmb3IgYSBmcmVlIHF1ZXVlICovCi0JZm9yIChpID0gMDsgaSA8IGRldi0+cXVldWVfY291bnQ7IGkrKykgewotCQlhdG9taWNfaW5jKCZkZXYtPnF1ZXVlbGlzdFtpXS0+dXNlX2NvdW50KTsKLQkJaWYgKGF0b21pY19yZWFkKCZkZXYtPnF1ZXVlbGlzdFtpXS0+dXNlX2NvdW50KSA9PSAxCi0JCSAgICAmJiAhYXRvbWljX3JlYWQoJmRldi0+cXVldWVsaXN0W2ldLT5maW5hbGl6YXRpb24pKSB7Ci0JCQlEUk1fREVCVUcoIiVkIChmcmVlKVxuIiwgaSk7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCQlhdG9taWNfZGVjKCZkZXYtPnF1ZXVlbGlzdFtpXS0+dXNlX2NvdW50KTsKLQl9Ci0JCQkJLyogQWxsb2NhdGUgYSBuZXcgcXVldWUgKi8KLQlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOwotCi0JcXVldWUgPSBEUk0oYWxsb2MpKHNpemVvZigqcXVldWUpLCBEUk1fTUVNX1FVRVVFUyk7Ci0JbWVtc2V0KHF1ZXVlLCAwLCBzaXplb2YoKnF1ZXVlKSk7Ci0JYXRvbWljX3NldCgmcXVldWUtPnVzZV9jb3VudCwgMSk7Ci0KLQkrK2Rldi0+cXVldWVfY291bnQ7Ci0JaWYgKGRldi0+cXVldWVfY291bnQgPj0gZGV2LT5xdWV1ZV9zbG90cykgewotCQlvbGRzbG90cyA9IGRldi0+cXVldWVfc2xvdHMgKiBzaXplb2YoKmRldi0+cXVldWVsaXN0KTsKLQkJaWYgKCFkZXYtPnF1ZXVlX3Nsb3RzKSBkZXYtPnF1ZXVlX3Nsb3RzID0gMTsKLQkJZGV2LT5xdWV1ZV9zbG90cyAqPSAyOwotCQluZXdzbG90cyA9IGRldi0+cXVldWVfc2xvdHMgKiBzaXplb2YoKmRldi0+cXVldWVsaXN0KTsKLQotCQlkZXYtPnF1ZXVlbGlzdCA9IERSTShyZWFsbG9jKShkZXYtPnF1ZXVlbGlzdCwKLQkJCQkJICAgICAgb2xkc2xvdHMsCi0JCQkJCSAgICAgIG5ld3Nsb3RzLAotCQkJCQkgICAgICBEUk1fTUVNX1FVRVVFUyk7Ci0JCWlmICghZGV2LT5xdWV1ZWxpc3QpIHsKLQkJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOwotCQkJRFJNX0RFQlVHKCJvdXQgb2YgbWVtb3J5XG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCWRldi0+cXVldWVsaXN0W2Rldi0+cXVldWVfY291bnQtMV0gPSBxdWV1ZTsKLQotCXVwKCZkZXYtPnN0cnVjdF9zZW0pOwotCURSTV9ERUJVRygiJWQgKG5ldylcbiIsIGRldi0+cXVldWVfY291bnQgLSAxKTsKLQlyZXR1cm4gZGV2LT5xdWV1ZV9jb3VudCAtIDE7Ci19Ci0KLWludCBEUk0ocmVzY3R4KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JZHJtX2N0eF9yZXNfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2N0eF9yZXNfdAlyZXM7Ci0JZHJtX2N0eF90CWN0eDsKLQlpbnQJCWk7Ci0KLQlEUk1fREVCVUcoIiVkXG4iLCBEUk1fUkVTRVJWRURfQ09OVEVYVFMpOwotCWlmIChjb3B5X2Zyb21fdXNlcigmcmVzLCBhcmdwLCBzaXplb2YocmVzKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChyZXMuY291bnQgPj0gRFJNX1JFU0VSVkVEX0NPTlRFWFRTKSB7Ci0JCW1lbXNldCgmY3R4LCAwLCBzaXplb2YoY3R4KSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBEUk1fUkVTRVJWRURfQ09OVEVYVFM7IGkrKykgewotCQkJY3R4LmhhbmRsZSA9IGk7Ci0JCQlpZiAoY29weV90b191c2VyKCZyZXMuY29udGV4dHNbaV0sCi0JCQkJCSAmaSwKLQkJCQkJIHNpemVvZihpKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JcmVzLmNvdW50ID0gRFJNX1JFU0VSVkVEX0NPTlRFWFRTOwotCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnJlcywgc2l6ZW9mKHJlcykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KLQotaW50IERSTShhZGRjdHgpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+ZGV2OwotCWRybV9jdHhfdAljdHg7Ci0JZHJtX2N0eF90CV9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCBhcmdwLCBzaXplb2YoY3R4KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmICgoY3R4LmhhbmRsZSA9IERSTShhbGxvY19xdWV1ZSkoZGV2KSkgPT0gRFJNX0tFUk5FTF9DT05URVhUKSB7Ci0JCQkJLyogSW5pdCBrZXJuZWwncyBjb250ZXh0IGFuZCBnZXQgYSBuZXcgb25lLiAqLwotCQlEUk0oaW5pdF9xdWV1ZSkoZGV2LCBkZXYtPnF1ZXVlbGlzdFtjdHguaGFuZGxlXSwgJmN0eCk7Ci0JCWN0eC5oYW5kbGUgPSBEUk0oYWxsb2NfcXVldWUpKGRldik7Ci0JfQotCURSTShpbml0X3F1ZXVlKShkZXYsIGRldi0+cXVldWVsaXN0W2N0eC5oYW5kbGVdLCAmY3R4KTsKLQlEUk1fREVCVUcoIiVkXG4iLCBjdHguaGFuZGxlKTsKLQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjdHgsIHNpemVvZihjdHgpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBEUk0obW9kY3R4KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKLQlkcm1fY3R4X3QJY3R4OwotCWRybV9xdWV1ZV90CSpxOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChkcm1fY3R4X3QgX191c2VyICopYXJnLCBzaXplb2YoY3R4KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7Ci0KLQlpZiAoY3R4LmhhbmRsZSA8IDAgfHwgY3R4LmhhbmRsZSA+PSBkZXYtPnF1ZXVlX2NvdW50KSByZXR1cm4gLUVJTlZBTDsKLQlxID0gZGV2LT5xdWV1ZWxpc3RbY3R4LmhhbmRsZV07Ci0KLQlhdG9taWNfaW5jKCZxLT51c2VfY291bnQpOwotCWlmIChhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSA9PSAxKSB7Ci0JCQkJLyogTm8gbG9uZ2VyIGluIHVzZSAqLwotCQlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoRFJNX0JVRkNPVU5UKCZxLT53YWl0bGlzdCkpIHsKLQkJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlxLT5mbGFncyA9IGN0eC5mbGFnczsKLQotCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBEUk0oZ2V0Y3R4KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKLQlkcm1fY3R4X3QJX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9jdHhfdAljdHg7Ci0JZHJtX3F1ZXVlX3QJKnE7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgYXJncCwgc2l6ZW9mKGN0eCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOwotCi0JaWYgKGN0eC5oYW5kbGUgPj0gZGV2LT5xdWV1ZV9jb3VudCkgcmV0dXJuIC1FSU5WQUw7Ci0JcSA9IGRldi0+cXVldWVsaXN0W2N0eC5oYW5kbGVdOwotCi0JYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKLQlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPT0gMSkgewotCQkJCS8qIE5vIGxvbmdlciBpbiB1c2UgKi8KLQkJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY3R4LmZsYWdzID0gcS0+ZmxhZ3M7Ci0JYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKLQotCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmN0eCwgc2l6ZW9mKGN0eCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi1pbnQgRFJNKHN3aXRjaGN0eCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5kZXY7Ci0JZHJtX2N0eF90CWN0eDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGN0eCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlEUk1fREVCVUcoIiVkXG4iLCBjdHguaGFuZGxlKTsKLQlyZXR1cm4gRFJNKGNvbnRleHRfc3dpdGNoKShkZXYsIGRldi0+bGFzdF9jb250ZXh0LCBjdHguaGFuZGxlKTsKLX0KLQotaW50IERSTShuZXdjdHgpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+ZGV2OwotCWRybV9jdHhfdAljdHg7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7Ci0JRFJNKGNvbnRleHRfc3dpdGNoX2NvbXBsZXRlKShkZXYsIGN0eC5oYW5kbGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBEUk0ocm1jdHgpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+ZGV2OwotCWRybV9jdHhfdAljdHg7Ci0JZHJtX3F1ZXVlX3QJKnE7Ci0JZHJtX2J1Zl90CSpidWY7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7Ci0KLQlpZiAoY3R4LmhhbmRsZSA+PSBkZXYtPnF1ZXVlX2NvdW50KSByZXR1cm4gLUVJTlZBTDsKLQlxID0gZGV2LT5xdWV1ZWxpc3RbY3R4LmhhbmRsZV07Ci0KLQlhdG9taWNfaW5jKCZxLT51c2VfY291bnQpOwotCWlmIChhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSA9PSAxKSB7Ci0JCQkJLyogTm8gbG9uZ2VyIGluIHVzZSAqLwotCQlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlhdG9taWNfaW5jKCZxLT5maW5hbGl6YXRpb24pOyAvKiBNYXJrIHF1ZXVlIGluIGZpbmFsaXphdGlvbiBzdGF0ZSAqLwotCWF0b21pY19zdWIoMiwgJnEtPnVzZV9jb3VudCk7IC8qIE1hcmsgcXVldWUgYXMgdW51c2VkIChwZW5kaW5nCi0JCQkJCSBmaW5hbGl6YXRpb24pICovCi0KLQl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZykpIHsKLQkJc2NoZWR1bGUoKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQljbGVhcl9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpOwotCQkJcmV0dXJuIC1FSU5UUjsKLQkJfQotCX0KLQkJCQkvKiBSZW1vdmUgcXVldWVkIGJ1ZmZlcnMgKi8KLQl3aGlsZSAoKGJ1ZiA9IERSTSh3YWl0bGlzdF9nZXQpKCZxLT53YWl0bGlzdCkpKSB7Ci0JCURSTShmcmVlX2J1ZmZlcikoZGV2LCBidWYpOwotCX0KLQljbGVhcl9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpOwotCi0JCQkJLyogV2FrZXVwIGJsb2NrZWQgcHJvY2Vzc2VzICovCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxLT5yZWFkX3F1ZXVlKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnEtPndyaXRlX3F1ZXVlKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnEtPmZsdXNoX3F1ZXVlKTsKLQotCQkJCS8qIEZpbmFsaXphdGlvbiBvdmVyLiAgUXVldWUgaXMgbWFkZQotCQkJCSAgIGF2YWlsYWJsZSB3aGVuIGJvdGggdXNlX2NvdW50IGFuZAotCQkJCSAgIGZpbmFsaXphdGlvbiBiZWNvbWUgMCwgd2hpY2ggd29uJ3QKLQkJCQkgICBoYXBwZW4gdW50aWwgYWxsIHRoZSB3YWl0aW5nIHByb2Nlc3NlcwotCQkJCSAgIHN0b3Agd2FpdGluZy4gKi8KLQlhdG9taWNfZGVjKCZxLT5maW5hbGl6YXRpb24pOwotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ4NmZiOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2RtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQ2ICswLDAgQEAKLS8qIGdhbW1hX2RtYS5jIC0tIERNQSBzdXBwb3J0IGZvciBHTVggMjAwMCAtKi0gbGludXgtYyAtKi0KLSAqIENyZWF0ZWQ6IEZyaSBNYXIgMTkgMTQ6MzA6MTYgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQotICoKLSAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci0gKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCi0gKiBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCi0gKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLSAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgotICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICoKLSAqIEF1dGhvcnM6Ci0gKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImdhbW1hLmgiCi0jaW5jbHVkZSAiZHJtUC5oIgotI2luY2x1ZGUgImRybS5oIgotI2luY2x1ZGUgImdhbW1hX2RybS5oIgotI2luY2x1ZGUgImdhbW1hX2Rydi5oIgotCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrIHF1ZXVlIHN1cHBvcnQgKi8KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi1zdGF0aWMgaW5saW5lIHZvaWQgZ2FtbWFfZG1hX2Rpc3BhdGNoKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGgpCi17Ci0JZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQotCQkJCShkcm1fZ2FtbWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKLQltYigpOwotCXdoaWxlICggR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAyKQotCQljcHVfcmVsYXgoKTsKLQotCUdBTU1BX1dSSVRFKEdBTU1BX0RNQUFERFJFU1MsIGFkZHJlc3MpOwotCi0Jd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfR0NPTU1BTkRTVEFUVVMpICE9IDQpCi0JCWNwdV9yZWxheCgpOwotCi0JR0FNTUFfV1JJVEUoR0FNTUFfRE1BQ09VTlQsIGxlbmd0aCAvIDQpOwotfQotCi12b2lkIGdhbW1hX2RtYV9xdWllc2NlbnRfc2luZ2xlKGRybV9kZXZpY2VfdCAqZGV2KQotewotCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KLQkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7Ci0Jd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfRE1BQ09VTlQpKQotCQljcHVfcmVsYXgoKTsKLQotCXdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDIpCi0JCWNwdV9yZWxheCgpOwotCi0JR0FNTUFfV1JJVEUoR0FNTUFfRklMVEVSTU9ERSwgMSA8PCAxMCk7Ci0JR0FNTUFfV1JJVEUoR0FNTUFfU1lOQywgMCk7Ci0KLQlkbyB7Ci0JCXdoaWxlICghR0FNTUFfUkVBRChHQU1NQV9PVVRGSUZPV09SRFMpKQotCQkJY3B1X3JlbGF4KCk7Ci0JfSB3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9PVVRQVVRGSUZPKSAhPSBHQU1NQV9TWU5DX1RBRyk7Ci19Ci0KLXZvaWQgZ2FtbWFfZG1hX3F1aWVzY2VudF9kdWFsKGRybV9kZXZpY2VfdCAqZGV2KQotewotCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KLQkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7Ci0Jd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfRE1BQ09VTlQpKQotCQljcHVfcmVsYXgoKTsKLQotCXdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDMpCi0JCWNwdV9yZWxheCgpOwotCi0JR0FNTUFfV1JJVEUoR0FNTUFfQlJPQURDQVNUTUFTSywgMyk7Ci0JR0FNTUFfV1JJVEUoR0FNTUFfRklMVEVSTU9ERSwgMSA8PCAxMCk7Ci0JR0FNTUFfV1JJVEUoR0FNTUFfU1lOQywgMCk7Ci0KLQkvKiBSZWFkIGZyb20gZmlyc3QgTVggKi8KLQlkbyB7Ci0JCXdoaWxlICghR0FNTUFfUkVBRChHQU1NQV9PVVRGSUZPV09SRFMpKQotCQkJY3B1X3JlbGF4KCk7Ci0JfSB3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9PVVRQVVRGSUZPKSAhPSBHQU1NQV9TWU5DX1RBRyk7Ci0KLQkvKiBSZWFkIGZyb20gc2Vjb25kIE1YICovCi0JZG8gewotCQl3aGlsZSAoIUdBTU1BX1JFQUQoR0FNTUFfT1VURklGT1dPUkRTICsgMHgxMDAwMCkpCi0JCQljcHVfcmVsYXgoKTsKLQl9IHdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX09VVFBVVEZJRk8gKyAweDEwMDAwKSAhPSBHQU1NQV9TWU5DX1RBRyk7Ci19Ci0KLXZvaWQgZ2FtbWFfZG1hX3JlYWR5KGRybV9kZXZpY2VfdCAqZGV2KQotewotCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KLQkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7Ci0Jd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfRE1BQ09VTlQpKQotCQljcHVfcmVsYXgoKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ2FtbWFfZG1hX2lzX3JlYWR5KGRybV9kZXZpY2VfdCAqZGV2KQotewotCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KLQkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7Ci0JcmV0dXJuICghR0FNTUFfUkVBRChHQU1NQV9ETUFDT1VOVCkpOwotfQotCi1pcnFyZXR1cm5fdCBnYW1tYV9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApCi17Ci0JZHJtX2RldmljZV90CSAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKWFyZzsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fZ2FtbWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9Ci0JCQkJKGRybV9nYW1tYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwotCi0JLyogRklYTUU6IHNob3VsZCBjaGVjayB3aGV0aGVyIHdlJ3JlIGFjdHVhbGx5IGludGVyZXN0ZWQgaW4gdGhlIGludGVycnVwdD8gKi8KLQlhdG9taWNfaW5jKCZkZXYtPmNvdW50c1s2XSk7IC8qIF9EUk1fU1RBVF9JUlEgKi8KLQotCXdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDMpCi0JCWNwdV9yZWxheCgpOwotCi0JR0FNTUFfV1JJVEUoR0FNTUFfR0RFTEFZVElNRVIsIDB4YzM1MC8yKTsgLyogMHgwNVMgKi8KLQlHQU1NQV9XUklURShHQU1NQV9HQ09NTUFORElOVEZMQUdTLCA4KTsKLQlHQU1NQV9XUklURShHQU1NQV9HSU5URkxBR1MsIDB4MjAwMSk7Ci0JaWYgKGdhbW1hX2RtYV9pc19yZWFkeShkZXYpKSB7Ci0JCQkJLyogRnJlZSBwcmV2aW91cyBidWZmZXIgKi8KLQkJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRldi0+ZG1hX2ZsYWcpKQotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQlpZiAoZG1hLT50aGlzX2J1ZmZlcikgewotCQkJZ2FtbWFfZnJlZV9idWZmZXIoZGV2LCBkbWEtPnRoaXNfYnVmZmVyKTsKLQkJCWRtYS0+dGhpc19idWZmZXIgPSBOVUxMOwotCQl9Ci0JCWNsZWFyX2JpdCgwLCAmZGV2LT5kbWFfZmxhZyk7Ci0KLQkJLyogRGlzcGF0Y2ggbmV3IGJ1ZmZlciAqLwotCQlzY2hlZHVsZV93b3JrKCZkZXYtPndvcmspOwotCX0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qIE9ubHkgY2FsbGVkIGJ5IGdhbW1hX2RtYV9zY2hlZHVsZS4gKi8KLXN0YXRpYyBpbnQgZ2FtbWFfZG9fZG1hKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbG9ja2VkKQotewotCXVuc2lnbmVkIGxvbmcJIGFkZHJlc3M7Ci0JdW5zaWduZWQgbG9uZwkgbGVuZ3RoOwotCWRybV9idWZfdAkgKmJ1ZjsKLQlpbnQJCSByZXRjb2RlID0gMDsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQotCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkZXYtPmRtYV9mbGFnKSkgcmV0dXJuIC1FQlVTWTsKLQotCi0JaWYgKCFkbWEtPm5leHRfYnVmZmVyKSB7Ci0JCURSTV9FUlJPUigiTm8gbmV4dF9idWZmZXJcbiIpOwotCQljbGVhcl9iaXQoMCwgJmRldi0+ZG1hX2ZsYWcpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlidWYJPSBkbWEtPm5leHRfYnVmZmVyOwotCS8qIFdFIE5PVyBBUkUgT04gTE9HSUNBTCBQQUdFUyEhIC0gdXNpbmcgcGFnZSB0YWJsZSBzZXR1cCBpbiBkbWFfaW5pdCAqLwotCS8qIFNvIHdlIHBhc3MgdGhlIGJ1ZmZlciBpbmRleCB2YWx1ZSBpbnRvIHRoZSBwaHlzaWNhbCBwYWdlIG9mZnNldCAqLwotCWFkZHJlc3MgPSBidWYtPmlkeCA8PCAxMjsKLQlsZW5ndGgJPSBidWYtPnVzZWQ7Ci0KLQlEUk1fREVCVUcoImNvbnRleHQgJWQsIGJ1ZmZlciAlZCAoJWxkIGJ5dGVzKVxuIiwKLQkJICBidWYtPmNvbnRleHQsIGJ1Zi0+aWR4LCBsZW5ndGgpOwotCi0JaWYgKGJ1Zi0+bGlzdCA9PSBEUk1fTElTVF9SRUNMQUlNKSB7Ci0JCWdhbW1hX2NsZWFyX25leHRfYnVmZmVyKGRldik7Ci0JCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgYnVmKTsKLQkJY2xlYXJfYml0KDAsICZkZXYtPmRtYV9mbGFnKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFsZW5ndGgpIHsKLQkJRFJNX0VSUk9SKCIwIGxlbmd0aCBidWZmZXJcbiIpOwotCQlnYW1tYV9jbGVhcl9uZXh0X2J1ZmZlcihkZXYpOwotCQlnYW1tYV9mcmVlX2J1ZmZlcihkZXYsIGJ1Zik7Ci0JCWNsZWFyX2JpdCgwLCAmZGV2LT5kbWFfZmxhZyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghZ2FtbWFfZG1hX2lzX3JlYWR5KGRldikpIHsKLQkJY2xlYXJfYml0KDAsICZkZXYtPmRtYV9mbGFnKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpZiAoYnVmLT53aGlsZV9sb2NrZWQpIHsKLQkJaWYgKCFfRFJNX0xPQ0tfSVNfSEVMRChkZXYtPmxvY2suaHdfbG9jay0+bG9jaykpIHsKLQkJCURSTV9FUlJPUigiRGlzcGF0Y2hpbmcgYnVmZmVyICVkIGZyb20gcGlkICVkIgotCQkJCSAgIiBcIndoaWxlIGxvY2tlZFwiLCBidXQgbm8gbG9jayBoZWxkXG4iLAotCQkJCSAgYnVmLT5pZHgsIGN1cnJlbnQtPnBpZCk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIWxvY2tlZCAmJiAhZ2FtbWFfbG9ja190YWtlKCZkZXYtPmxvY2suaHdfbG9jay0+bG9jaywKLQkJCQkJICAgICAgRFJNX0tFUk5FTF9DT05URVhUKSkgewotCQkJY2xlYXJfYml0KDAsICZkZXYtPmRtYV9mbGFnKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQl9Ci0KLQlpZiAoZGV2LT5sYXN0X2NvbnRleHQgIT0gYnVmLT5jb250ZXh0Ci0JICAgICYmICEoZGV2LT5xdWV1ZWxpc3RbYnVmLT5jb250ZXh0XS0+ZmxhZ3MKLQkJICYgX0RSTV9DT05URVhUX1BSRVNFUlZFRCkpIHsKLQkJCQkvKiBQUkU6IGRldi0+bGFzdF9jb250ZXh0ICE9IGJ1Zi0+Y29udGV4dCAqLwotCQlpZiAoRFJNKGNvbnRleHRfc3dpdGNoKShkZXYsIGRldi0+bGFzdF9jb250ZXh0LAotCQkJCQlidWYtPmNvbnRleHQpKSB7Ci0JCQlEUk0oY2xlYXJfbmV4dF9idWZmZXIpKGRldik7Ci0JCQlEUk0oZnJlZV9idWZmZXIpKGRldiwgYnVmKTsKLQkJfQotCQlyZXRjb2RlID0gLUVCVVNZOwotCQlnb3RvIGNsZWFudXA7Ci0KLQkJCQkvKiBQT1NUOiB3ZSB3aWxsIHdhaXQgZm9yIHRoZSBjb250ZXh0Ci0JCQkJICAgc3dpdGNoIGFuZCB3aWxsIGRpc3BhdGNoIG9uIGEgbGF0ZXIgY2FsbAotCQkJCSAgIHdoZW4gZGV2LT5sYXN0X2NvbnRleHQgPT0gYnVmLT5jb250ZXh0LgotCQkJCSAgIE5PVEUgV0UgSE9MRCBUSEUgTE9DSyBUSFJPVUdIT1VUIFRISVMKLQkJCQkgICBUSU1FISAqLwotCX0KLQotCWdhbW1hX2NsZWFyX25leHRfYnVmZmVyKGRldik7Ci0JYnVmLT5wZW5kaW5nCSA9IDE7Ci0JYnVmLT53YWl0aW5nCSA9IDA7Ci0JYnVmLT5saXN0CSA9IERSTV9MSVNUX1BFTkQ7Ci0KLQkvKiBXRSBOT1cgQVJFIE9OIExPR0lDQUwgUEFHRVMhISEgLSBvdmVycmlkaW5nIGFkZHJlc3MgKi8KLQlhZGRyZXNzID0gYnVmLT5pZHggPDwgMTI7Ci0KLQlnYW1tYV9kbWFfZGlzcGF0Y2goZGV2LCBhZGRyZXNzLCBsZW5ndGgpOwotCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgZG1hLT50aGlzX2J1ZmZlcik7Ci0JZG1hLT50aGlzX2J1ZmZlciA9IGJ1ZjsKLQotCWF0b21pY19pbmMoJmRldi0+Y291bnRzWzddKTsgLyogX0RSTV9TVEFUX0RNQSAqLwotCWF0b21pY19hZGQobGVuZ3RoLCAmZGV2LT5jb3VudHNbOF0pOyAvKiBfRFJNX1NUQVRfUFJJTUFSWSAqLwotCi0JaWYgKCFidWYtPndoaWxlX2xvY2tlZCAmJiAhZGV2LT5jb250ZXh0X2ZsYWcgJiYgIWxvY2tlZCkgewotCQlpZiAoZ2FtbWFfbG9ja19mcmVlKGRldiwgJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAotCQkJCSAgRFJNX0tFUk5FTF9DT05URVhUKSkgewotCQkJRFJNX0VSUk9SKCJcbiIpOwotCQl9Ci0JfQotY2xlYW51cDoKLQotCWNsZWFyX2JpdCgwLCAmZGV2LT5kbWFfZmxhZyk7Ci0KLQotCXJldHVybiByZXRjb2RlOwotfQotCi1zdGF0aWMgdm9pZCBnYW1tYV9kbWFfdGltZXJfYmgodW5zaWduZWQgbG9uZyBkZXYpCi17Ci0JZ2FtbWFfZG1hX3NjaGVkdWxlKChkcm1fZGV2aWNlX3QgKilkZXYsIDApOwotfQotCi12b2lkIGdhbW1hX2lycV9pbW1lZGlhdGVfYmgodm9pZCAqZGV2KQotewotCWdhbW1hX2RtYV9zY2hlZHVsZShkZXYsIDApOwotfQotCi1pbnQgZ2FtbWFfZG1hX3NjaGVkdWxlKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbG9ja2VkKQotewotCWludAkJIG5leHQ7Ci0JZHJtX3F1ZXVlX3QJICpxOwotCWRybV9idWZfdAkgKmJ1ZjsKLQlpbnQJCSByZXRjb2RlICAgPSAwOwotCWludAkJIHByb2Nlc3NlZCA9IDA7Ci0JaW50CQkgbWlzc2VkOwotCWludAkJIGV4cGlyZQkgICA9IDIwOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYQkgICA9IGRldi0+ZG1hOwotCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpKSB7Ci0JCQkJLyogTm90IHJlZW50cmFudCAqLwotCQlhdG9taWNfaW5jKCZkZXYtPmNvdW50c1sxMF0pOyAvKiBfRFJNX1NUQVRfTUlTU0VEICovCi0JCXJldHVybiAtRUJVU1k7Ci0JfQotCW1pc3NlZCA9IGF0b21pY19yZWFkKCZkZXYtPmNvdW50c1sxMF0pOwotCi0KLWFnYWluOgotCWlmIChkZXYtPmNvbnRleHRfZmxhZykgewotCQljbGVhcl9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQlpZiAoZG1hLT5uZXh0X2J1ZmZlcikgewotCQkJCS8qIFVuc2VudCBidWZmZXIgdGhhdCB3YXMgcHJldmlvdXNseQotCQkJCSAgIHNlbGVjdGVkLCBidXQgdGhhdCBjb3VsZG4ndCBiZSBzZW50Ci0JCQkJICAgYmVjYXVzZSB0aGUgbG9jayBjb3VsZCBub3QgYmUgb2J0YWluZWQKLQkJCQkgICBvciB0aGUgRE1BIGVuZ2luZSB3YXNuJ3QgcmVhZHkuICBUcnkKLQkJCQkgICBhZ2Fpbi4gKi8KLQkJaWYgKCEocmV0Y29kZSA9IGdhbW1hX2RvX2RtYShkZXYsIGxvY2tlZCkpKSArK3Byb2Nlc3NlZDsKLQl9IGVsc2UgewotCQlkbyB7Ci0JCQluZXh0ID0gZ2FtbWFfc2VsZWN0X3F1ZXVlKGRldiwgZ2FtbWFfZG1hX3RpbWVyX2JoKTsKLQkJCWlmIChuZXh0ID49IDApIHsKLQkJCQlxICAgPSBkZXYtPnF1ZXVlbGlzdFtuZXh0XTsKLQkJCQlidWYgPSBnYW1tYV93YWl0bGlzdF9nZXQoJnEtPndhaXRsaXN0KTsKLQkJCQlkbWEtPm5leHRfYnVmZmVyID0gYnVmOwotCQkJCWRtYS0+bmV4dF9xdWV1ZQkgPSBxOwotCQkJCWlmIChidWYgJiYgYnVmLT5saXN0ID09IERSTV9MSVNUX1JFQ0xBSU0pIHsKLQkJCQkJZ2FtbWFfY2xlYXJfbmV4dF9idWZmZXIoZGV2KTsKLQkJCQkJZ2FtbWFfZnJlZV9idWZmZXIoZGV2LCBidWYpOwotCQkJCX0KLQkJCX0KLQkJfSB3aGlsZSAobmV4dCA+PSAwICYmICFkbWEtPm5leHRfYnVmZmVyKTsKLQkJaWYgKGRtYS0+bmV4dF9idWZmZXIpIHsKLQkJCWlmICghKHJldGNvZGUgPSBnYW1tYV9kb19kbWEoZGV2LCBsb2NrZWQpKSkgewotCQkJCSsrcHJvY2Vzc2VkOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKC0tZXhwaXJlKSB7Ci0JCWlmIChtaXNzZWQgIT0gYXRvbWljX3JlYWQoJmRldi0+Y291bnRzWzEwXSkpIHsKLQkJCWlmIChnYW1tYV9kbWFfaXNfcmVhZHkoZGV2KSkgZ290byBhZ2FpbjsKLQkJfQotCQlpZiAocHJvY2Vzc2VkICYmIGdhbW1hX2RtYV9pc19yZWFkeShkZXYpKSB7Ci0JCQlwcm9jZXNzZWQgPSAwOwotCQkJZ290byBhZ2FpbjsKLQkJfQotCX0KLQotCWNsZWFyX2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZyk7Ci0KLQlyZXR1cm4gcmV0Y29kZTsKLX0KLQotc3RhdGljIGludCBnYW1tYV9kbWFfcHJpb3JpdHkoc3RydWN0IGZpbGUgKmZpbHAsIAotCQkJICAgICAgZHJtX2RldmljZV90ICpkZXYsIGRybV9kbWFfdCAqZCkKLXsKLQl1bnNpZ25lZCBsb25nCSAgYWRkcmVzczsKLQl1bnNpZ25lZCBsb25nCSAgbGVuZ3RoOwotCWludAkJICBtdXN0X2ZyZWUgPSAwOwotCWludAkJICByZXRjb2RlICAgPSAwOwotCWludAkJICBpOwotCWludAkJICBpZHg7Ci0JZHJtX2J1Zl90CSAgKmJ1ZjsKLQlkcm1fYnVmX3QJICAqbGFzdF9idWYgPSBOVUxMOwotCWRybV9kZXZpY2VfZG1hX3QgICpkbWEJICAgID0gZGV2LT5kbWE7Ci0JaW50CQkgICpzZW5kX2luZGljZXMgPSBOVUxMOwotCWludAkJICAqc2VuZF9zaXplcyA9IE5VTEw7Ci0KLQlERUNMQVJFX1dBSVRRVUVVRShlbnRyeSwgY3VycmVudCk7Ci0KLQkJCQkvKiBUdXJuIG9mZiBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KLQl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZykpIHsKLQkJc2NoZWR1bGUoKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSByZXR1cm4gLUVJTlRSOwotCX0KLQlpZiAoIShkLT5mbGFncyAmIF9EUk1fRE1BX1dISUxFX0xPQ0tFRCkpIHsKLQkJd2hpbGUgKCFnYW1tYV9sb2NrX3Rha2UoJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAotCQkJCSAgICAgIERSTV9LRVJORUxfQ09OVEVYVCkpIHsKLQkJCXNjaGVkdWxlKCk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQljbGVhcl9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpOwotCQkJCXJldHVybiAtRUlOVFI7Ci0JCQl9Ci0JCX0KLQkJKyttdXN0X2ZyZWU7Ci0JfQotCi0Jc2VuZF9pbmRpY2VzID0gRFJNKGFsbG9jKShkLT5zZW5kX2NvdW50ICogc2l6ZW9mKCpzZW5kX2luZGljZXMpLAotCQkJCSAgRFJNX01FTV9EUklWRVIpOwotCWlmIChzZW5kX2luZGljZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKGNvcHlfZnJvbV91c2VyKHNlbmRfaW5kaWNlcywgZC0+c2VuZF9pbmRpY2VzLCAKLQkJCSAgIGQtPnNlbmRfY291bnQgKiBzaXplb2YoKnNlbmRfaW5kaWNlcykpKSB7Ci0JCXJldGNvZGUgPSAtRUZBVUxUOwotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLQl9Ci0JCi0Jc2VuZF9zaXplcyA9IERSTShhbGxvYykoZC0+c2VuZF9jb3VudCAqIHNpemVvZigqc2VuZF9zaXplcyksCi0JCQkJRFJNX01FTV9EUklWRVIpOwotCWlmIChzZW5kX3NpemVzID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmIChjb3B5X2Zyb21fdXNlcihzZW5kX3NpemVzLCBkLT5zZW5kX3NpemVzLCAKLQkJCSAgIGQtPnNlbmRfY291bnQgKiBzaXplb2YoKnNlbmRfc2l6ZXMpKSkgewotCQlyZXRjb2RlID0gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGQtPnNlbmRfY291bnQ7IGkrKykgewotCQlpZHggPSBzZW5kX2luZGljZXNbaV07Ci0JCWlmIChpZHggPCAwIHx8IGlkeCA+PSBkbWEtPmJ1Zl9jb3VudCkgewotCQkJRFJNX0VSUk9SKCJJbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKLQkJCQkgIHNlbmRfaW5kaWNlc1tpXSwgZG1hLT5idWZfY291bnQgLSAxKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWJ1ZiA9IGRtYS0+YnVmbGlzdFsgaWR4IF07Ci0JCWlmIChidWYtPmZpbHAgIT0gZmlscCkgewotCQkJRFJNX0VSUk9SKCJQcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBub3Qgb3duZWRcbiIsCi0JCQkJICBjdXJyZW50LT5waWQpOwotCQkJcmV0Y29kZSA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJaWYgKGJ1Zi0+bGlzdCAhPSBEUk1fTElTVF9OT05FKSB7Ci0JCQlEUk1fRVJST1IoIlByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG9uIGxpc3QgJWRcbiIsCi0JCQkJICBjdXJyZW50LT5waWQsIGJ1Zi0+bGlzdCk7Ci0JCQlyZXRjb2RlID0gLUVJTlZBTDsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCQkJCS8qIFRoaXMgaXNuJ3QgYSByYWNlIGNvbmRpdGlvbiBvbgotCQkJCSAgIGJ1Zi0+bGlzdCwgc2luY2Ugb3VyIGNvbmNlcm4gaXMgdGhlCi0JCQkJICAgYnVmZmVyIHJlY2xhaW0gZHVyaW5nIHRoZSB0aW1lIHRoZQotCQkJCSAgIHByb2Nlc3MgY2xvc2VzIHRoZSAvZGV2L2RybT8gaGFuZGxlLCBzbwotCQkJCSAgIGl0IGNhbid0IGFsc28gYmUgZG9pbmcgRE1BLiAqLwotCQlidWYtPmxpc3QJICA9IERSTV9MSVNUX1BSSU87Ci0JCWJ1Zi0+dXNlZAkgID0gc2VuZF9zaXplc1tpXTsKLQkJYnVmLT5jb250ZXh0CSAgPSBkLT5jb250ZXh0OwotCQlidWYtPndoaWxlX2xvY2tlZCA9IGQtPmZsYWdzICYgX0RSTV9ETUFfV0hJTEVfTE9DS0VEOwotCQlhZGRyZXNzCQkgID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5hZGRyZXNzOwotCQlsZW5ndGgJCSAgPSBidWYtPnVzZWQ7Ci0JCWlmICghbGVuZ3RoKSB7Ci0JCQlEUk1fRVJST1IoIjAgbGVuZ3RoIGJ1ZmZlclxuIik7Ci0JCX0KLQkJaWYgKGJ1Zi0+cGVuZGluZykgewotCQkJRFJNX0VSUk9SKCJTZW5kaW5nIHBlbmRpbmcgYnVmZmVyOiIKLQkJCQkgICIgYnVmZmVyICVkLCBvZmZzZXQgJWRcbiIsCi0JCQkJICBzZW5kX2luZGljZXNbaV0sIGkpOwotCQkJcmV0Y29kZSA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJaWYgKGJ1Zi0+d2FpdGluZykgewotCQkJRFJNX0VSUk9SKCJTZW5kaW5nIHdhaXRpbmcgYnVmZmVyOiIKLQkJCQkgICIgYnVmZmVyICVkLCBvZmZzZXQgJWRcbiIsCi0JCQkJICBzZW5kX2luZGljZXNbaV0sIGkpOwotCQkJcmV0Y29kZSA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJYnVmLT5wZW5kaW5nID0gMTsKLQotCQlpZiAoZGV2LT5sYXN0X2NvbnRleHQgIT0gYnVmLT5jb250ZXh0Ci0JCSAgICAmJiAhKGRldi0+cXVldWVsaXN0W2J1Zi0+Y29udGV4dF0tPmZsYWdzCi0JCQkgJiBfRFJNX0NPTlRFWFRfUFJFU0VSVkVEKSkgewotCQkJYWRkX3dhaXRfcXVldWUoJmRldi0+Y29udGV4dF93YWl0LCAmZW50cnkpOwotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCQkJLyogUFJFOiBkZXYtPmxhc3RfY29udGV4dCAhPSBidWYtPmNvbnRleHQgKi8KLQkJCURSTShjb250ZXh0X3N3aXRjaCkoZGV2LCBkZXYtPmxhc3RfY29udGV4dCwKLQkJCQkJICAgIGJ1Zi0+Y29udGV4dCk7Ci0JCQkJLyogUE9TVDogd2Ugd2lsbCB3YWl0IGZvciB0aGUgY29udGV4dAotCQkJCSAgIHN3aXRjaCBhbmQgd2lsbCBkaXNwYXRjaCBvbiBhIGxhdGVyIGNhbGwKLQkJCQkgICB3aGVuIGRldi0+bGFzdF9jb250ZXh0ID09IGJ1Zi0+Y29udGV4dC4KLQkJCQkgICBOT1RFIFdFIEhPTEQgVEhFIExPQ0sgVEhST1VHSE9VVCBUSElTCi0JCQkJICAgVElNRSEgKi8KLQkJCXNjaGVkdWxlKCk7Ci0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZkZXYtPmNvbnRleHRfd2FpdCwgJmVudHJ5KTsKLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCXJldGNvZGUgPSAtRUlOVFI7Ci0JCQkJZ290byBjbGVhbnVwOwotCQkJfQotCQkJaWYgKGRldi0+bGFzdF9jb250ZXh0ICE9IGJ1Zi0+Y29udGV4dCkgewotCQkJCURSTV9FUlJPUigiQ29udGV4dCBtaXNtYXRjaDogJWQgJWRcbiIsCi0JCQkJCSAgZGV2LT5sYXN0X2NvbnRleHQsCi0JCQkJCSAgYnVmLT5jb250ZXh0KTsKLQkJCX0KLQkJfQotCi0JCWdhbW1hX2RtYV9kaXNwYXRjaChkZXYsIGFkZHJlc3MsIGxlbmd0aCk7Ci0JCWF0b21pY19pbmMoJmRldi0+Y291bnRzWzldKTsgLyogX0RSTV9TVEFUX1NQRUNJQUwgKi8KLQkJYXRvbWljX2FkZChsZW5ndGgsICZkZXYtPmNvdW50c1s4XSk7IC8qIF9EUk1fU1RBVF9QUklNQVJZICovCi0KLQkJaWYgKGxhc3RfYnVmKSB7Ci0JCQlnYW1tYV9mcmVlX2J1ZmZlcihkZXYsIGxhc3RfYnVmKTsKLQkJfQotCQlsYXN0X2J1ZiA9IGJ1ZjsKLQl9Ci0KLQotY2xlYW51cDoKLQlpZiAobGFzdF9idWYpIHsKLQkJZ2FtbWFfZG1hX3JlYWR5KGRldik7Ci0JCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgbGFzdF9idWYpOwotCX0KLQlpZiAoc2VuZF9pbmRpY2VzKQotCQlEUk0oZnJlZSkoc2VuZF9pbmRpY2VzLCBkLT5zZW5kX2NvdW50ICogc2l6ZW9mKCpzZW5kX2luZGljZXMpLCAKLQkJCSAgRFJNX01FTV9EUklWRVIpOwotCWlmIChzZW5kX3NpemVzKQotCQlEUk0oZnJlZSkoc2VuZF9zaXplcywgZC0+c2VuZF9jb3VudCAqIHNpemVvZigqc2VuZF9zaXplcyksIAotCQkJICBEUk1fTUVNX0RSSVZFUik7Ci0KLQlpZiAobXVzdF9mcmVlICYmICFkZXYtPmNvbnRleHRfZmxhZykgewotCQlpZiAoZ2FtbWFfbG9ja19mcmVlKGRldiwgJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAotCQkJCSAgRFJNX0tFUk5FTF9DT05URVhUKSkgewotCQkJRFJNX0VSUk9SKCJcbiIpOwotCQl9Ci0JfQotCWNsZWFyX2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZyk7Ci0JcmV0dXJuIHJldGNvZGU7Ci19Ci0KLXN0YXRpYyBpbnQgZ2FtbWFfZG1hX3NlbmRfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQkgIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZG1hX3QgKmQpCi17Ci0JREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOwotCWRybV9idWZfdAkgICpsYXN0X2J1ZiA9IE5VTEw7Ci0JaW50CQkgIHJldGNvZGUgICA9IDA7Ci0JZHJtX2RldmljZV9kbWFfdCAgKmRtYQkgICAgPSBkZXYtPmRtYTsKLQlpbnQgICAgICAgICAgICAgICBzZW5kX2luZGV4OwotCi0JaWYgKGdldF91c2VyKHNlbmRfaW5kZXgsICZkLT5zZW5kX2luZGljZXNbZC0+c2VuZF9jb3VudC0xXSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGQtPmZsYWdzICYgX0RSTV9ETUFfQkxPQ0spIHsKLQkJbGFzdF9idWYgPSBkbWEtPmJ1Zmxpc3Rbc2VuZF9pbmRleF07Ci0JCWFkZF93YWl0X3F1ZXVlKCZsYXN0X2J1Zi0+ZG1hX3dhaXQsICZlbnRyeSk7Ci0JfQotCi0JaWYgKChyZXRjb2RlID0gZ2FtbWFfZG1hX2VucXVldWUoZmlscCwgZCkpKSB7Ci0JCWlmIChkLT5mbGFncyAmIF9EUk1fRE1BX0JMT0NLKQotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmxhc3RfYnVmLT5kbWFfd2FpdCwgJmVudHJ5KTsKLQkJcmV0dXJuIHJldGNvZGU7Ci0JfQotCi0JZ2FtbWFfZG1hX3NjaGVkdWxlKGRldiwgMCk7Ci0KLQlpZiAoZC0+ZmxhZ3MgJiBfRFJNX0RNQV9CTE9DSykgewotCQlEUk1fREVCVUcoIiVkIHdhaXRpbmdcbiIsIGN1cnJlbnQtPnBpZCk7Ci0JCWZvciAoOzspIHsKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQkJaWYgKCFsYXN0X2J1Zi0+d2FpdGluZyAmJiAhbGFzdF9idWYtPnBlbmRpbmcpCi0JCQkJYnJlYWs7IC8qIGZpbmlzaGVkICovCi0JCQlzY2hlZHVsZSgpOwotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJcmV0Y29kZSA9IC1FSU5UUjsgLyogQ2FuJ3QgcmVzdGFydCAqLwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQlEUk1fREVCVUcoIiVkIHJ1bm5pbmdcbiIsIGN1cnJlbnQtPnBpZCk7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZsYXN0X2J1Zi0+ZG1hX3dhaXQsICZlbnRyeSk7Ci0JCWlmICghcmV0Y29kZQotCQkgICAgfHwgKGxhc3RfYnVmLT5saXN0PT1EUk1fTElTVF9QRU5EICYmICFsYXN0X2J1Zi0+cGVuZGluZykpIHsKLQkJCWlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmbGFzdF9idWYtPmRtYV93YWl0KSkgewotCQkJCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgbGFzdF9idWYpOwotCQkJfQotCQl9Ci0JCWlmIChyZXRjb2RlKSB7Ci0JCQlEUk1fRVJST1IoImN0eCVkIHclZCBwJWQgYyVsZCBpJWQgbCVkIHBpZDolZFxuIiwKLQkJCQkgIGQtPmNvbnRleHQsCi0JCQkJICBsYXN0X2J1Zi0+d2FpdGluZywKLQkJCQkgIGxhc3RfYnVmLT5wZW5kaW5nLAotCQkJCSAgKGxvbmcpRFJNX1dBSVRDT1VOVChkZXYsIGQtPmNvbnRleHQpLAotCQkJCSAgbGFzdF9idWYtPmlkeCwKLQkJCQkgIGxhc3RfYnVmLT5saXN0LAotCQkJCSAgY3VycmVudC0+cGlkKTsKLQkJfQotCX0KLQlyZXR1cm4gcmV0Y29kZTsKLX0KLQotaW50IGdhbW1hX2RtYShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKLQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+ZGV2OwotCWRybV9kZXZpY2VfZG1hX3QgICpkbWEJICAgID0gZGV2LT5kbWE7Ci0JaW50CQkgIHJldGNvZGUgICA9IDA7Ci0JZHJtX2RtYV90CSAgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9kbWFfdAkgIGQ7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmQsIGFyZ3AsIHNpemVvZihkKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGQuc2VuZF9jb3VudCA8IDAgfHwgZC5zZW5kX2NvdW50ID4gZG1hLT5idWZfY291bnQpIHsKLQkJRFJNX0VSUk9SKCJQcm9jZXNzICVkIHRyeWluZyB0byBzZW5kICVkIGJ1ZmZlcnMgKG9mICVkIG1heClcbiIsCi0JCQkgIGN1cnJlbnQtPnBpZCwgZC5zZW5kX2NvdW50LCBkbWEtPmJ1Zl9jb3VudCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChkLnJlcXVlc3RfY291bnQgPCAwIHx8IGQucmVxdWVzdF9jb3VudCA+IGRtYS0+YnVmX2NvdW50KSB7Ci0JCURSTV9FUlJPUigiUHJvY2VzcyAlZCB0cnlpbmcgdG8gZ2V0ICVkIGJ1ZmZlcnMgKG9mICVkIG1heClcbiIsCi0JCQkgIGN1cnJlbnQtPnBpZCwgZC5yZXF1ZXN0X2NvdW50LCBkbWEtPmJ1Zl9jb3VudCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChkLnNlbmRfY291bnQpIHsKLQkJaWYgKGQuZmxhZ3MgJiBfRFJNX0RNQV9QUklPUklUWSkKLQkJCXJldGNvZGUgPSBnYW1tYV9kbWFfcHJpb3JpdHkoZmlscCwgZGV2LCAmZCk7Ci0JCWVsc2UKLQkJCXJldGNvZGUgPSBnYW1tYV9kbWFfc2VuZF9idWZmZXJzKGZpbHAsIGRldiwgJmQpOwotCX0KLQotCWQuZ3JhbnRlZF9jb3VudCA9IDA7Ci0KLQlpZiAoIXJldGNvZGUgJiYgZC5yZXF1ZXN0X2NvdW50KSB7Ci0JCXJldGNvZGUgPSBnYW1tYV9kbWFfZ2V0X2J1ZmZlcnMoZmlscCwgJmQpOwotCX0KLQotCURSTV9ERUJVRygiJWQgcmV0dXJuaW5nLCBncmFudGVkID0gJWRcbiIsCi0JCSAgY3VycmVudC0+cGlkLCBkLmdyYW50ZWRfY291bnQpOwotCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmQsIHNpemVvZihkKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIHJldGNvZGU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIERNQSBpbml0aWFsaXphdGlvbiwgY2xlYW51cAotICovCi0KLXN0YXRpYyBpbnQgZ2FtbWFfZG9faW5pdF9kbWEoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZ2FtbWFfaW5pdF90ICppbml0ICkKLXsKLQlkcm1fZ2FtbWFfcHJpdmF0ZV90ICpkZXZfcHJpdjsKLQlkcm1fZGV2aWNlX2RtYV90ICAgICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QJICAgICpidWY7Ci0JaW50IGk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICAqbGlzdDsKLQl1bnNpZ25lZCBsb25nCSAgICAqcGd0OwotCi0JRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOwotCi0JZGV2X3ByaXYgPSBEUk0oYWxsb2MpKCBzaXplb2YoZHJtX2dhbW1hX3ByaXZhdGVfdCksCi0JCQkJCQkJRFJNX01FTV9EUklWRVIgKTsKLQlpZiAoICFkZXZfcHJpdiApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7Ci0KLQltZW1zZXQoIGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2dhbW1hX3ByaXZhdGVfdCkgKTsKLQotCWRldl9wcml2LT5udW1fcmFzdCA9IGluaXQtPm51bV9yYXN0OwotCi0JbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7Ci0JCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKLQkJaWYoIHJfbGlzdC0+bWFwICYmCi0JCSAgICByX2xpc3QtPm1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJgotCQkgICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLICkgewotCQkJZGV2X3ByaXYtPnNhcmVhID0gcl9saXN0LT5tYXA7Ci0gCQkJYnJlYWs7Ci0gCQl9Ci0gCX0KLQkKLQlkZXZfcHJpdi0+bW1pbzAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pbzApOwotCWRldl9wcml2LT5tbWlvMSA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvMSk7Ci0JZGV2X3ByaXYtPm1taW8yID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPm1taW8yKTsKLQlkZXZfcHJpdi0+bW1pbzMgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pbzMpOwotCQotCWRldl9wcml2LT5zYXJlYV9wcml2ID0gKGRybV9nYW1tYV9zYXJlYV90ICopCi0JCSgodTggKilkZXZfcHJpdi0+c2FyZWEtPmhhbmRsZSArCi0JCSBpbml0LT5zYXJlYV9wcml2X29mZnNldCk7Ci0KLQlpZiAoaW5pdC0+cGNpbW9kZSkgewotCQlidWYgPSBkbWEtPmJ1Zmxpc3RbR0xJTlRfRFJJX0JVRl9DT1VOVF07Ci0JCXBndCA9IGJ1Zi0+YWRkcmVzczsKLQotIAkJZm9yIChpID0gMDsgaSA8IEdMSU5UX0RSSV9CVUZfQ09VTlQ7IGkrKykgewotCQkJYnVmID0gZG1hLT5idWZsaXN0W2ldOwotCQkJKnBndCA9IHZpcnRfdG9fcGh5cygodm9pZCopYnVmLT5hZGRyZXNzKSB8IDB4MDc7Ci0JCQlwZ3QrKzsKLQkJfQotCi0JCWJ1ZiA9IGRtYS0+YnVmbGlzdFtHTElOVF9EUklfQlVGX0NPVU5UXTsKLQl9IGVsc2UgewotCQlkZXYtPmFncF9idWZmZXJfbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KTsKLQkJZHJtX2NvcmVfaW9yZW1hcCggZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2KTsKLQotCQlidWYgPSBkbWEtPmJ1Zmxpc3RbR0xJTlRfRFJJX0JVRl9DT1VOVF07Ci0JCXBndCA9IGJ1Zi0+YWRkcmVzczsKLQotIAkJZm9yIChpID0gMDsgaSA8IEdMSU5UX0RSSV9CVUZfQ09VTlQ7IGkrKykgewotCQkJYnVmID0gZG1hLT5idWZsaXN0W2ldOwotCQkJKnBndCA9ICh1bnNpZ25lZCBsb25nKWJ1Zi0+YWRkcmVzcyArIDB4MDc7Ci0JCQlwZ3QrKzsKLQkJfQotCi0JCWJ1ZiA9IGRtYS0+YnVmbGlzdFtHTElOVF9EUklfQlVGX0NPVU5UXTsKLQotCQl3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAxKTsKLQkJR0FNTUFfV1JJVEUoIEdBTU1BX0dETUFDT05UUk9MLCAweGUpOwotCX0KLQl3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAyKTsKLQlHQU1NQV9XUklURSggR0FNTUFfUEFHRVRBQkxFQUREUiwgdmlydF90b19waHlzKCh2b2lkKilidWYtPmFkZHJlc3MpICk7Ci0JR0FNTUFfV1JJVEUoIEdBTU1BX1BBR0VUQUJMRUxFTkdUSCwgMiApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBnYW1tYV9kb19jbGVhbnVwX2RtYSggZHJtX2RldmljZV90ICpkZXYgKQotewotCURSTV9ERUJVRyggIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKLQotCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAotCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKLQkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KLQkgKi8KLQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0lSUSkpCi0JCWlmICggZGV2LT5pcnFfZW5hYmxlZCApIAotCQkJRFJNKGlycV91bmluc3RhbGwpKGRldik7Ci0KLQlpZiAoIGRldi0+ZGV2X3ByaXZhdGUgKSB7Ci0KLQkJaWYgKCBkZXYtPmFncF9idWZmZXJfbWFwICE9IE5VTEwgKQotCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoIGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldiApOwotCi0JCURSTShmcmVlKSggZGV2LT5kZXZfcHJpdmF0ZSwgc2l6ZW9mKGRybV9nYW1tYV9wcml2YXRlX3QpLAotCQkJICAgRFJNX01FTV9EUklWRVIgKTsKLQkJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBnYW1tYV9kbWFfaW5pdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQotewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5kZXY7Ci0JZHJtX2dhbW1hX2luaXRfdCBpbml0OwotCi0JTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKLQotCWlmICggY29weV9mcm9tX3VzZXIoICZpbml0LCAoZHJtX2dhbW1hX2luaXRfdCBfX3VzZXIgKilhcmcsIHNpemVvZihpbml0KSApICkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlzd2l0Y2ggKCBpbml0LmZ1bmMgKSB7Ci0JY2FzZSBHQU1NQV9JTklUX0RNQToKLQkJcmV0dXJuIGdhbW1hX2RvX2luaXRfZG1hKCBkZXYsICZpbml0ICk7Ci0JY2FzZSBHQU1NQV9DTEVBTlVQX0RNQToKLQkJcmV0dXJuIGdhbW1hX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBnYW1tYV9kb19jb3B5X2RtYSggZHJtX2RldmljZV90ICpkZXYsIGRybV9nYW1tYV9jb3B5X3QgKmNvcHkgKQotewotCWRybV9kZXZpY2VfZG1hX3QgICAgKmRtYSA9IGRldi0+ZG1hOwotCXVuc2lnbmVkIGludCAgICAgICAgKnNjcmVlbmJ1ZjsKLQotCURSTV9ERUJVRyggIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKLQotCS8qIFdlJ3ZlIERSTV9SRVNUUklDVEVEIHRoaXMgRE1BIGJ1ZmZlciAqLwotCi0Jc2NyZWVuYnVmID0gZG1hLT5idWZsaXN0WyBHTElOVF9EUklfQlVGX0NPVU5UICsgMSBdLT5hZGRyZXNzOwotCi0jaWYgMAotCSpidWZmZXIrKyA9IDB4MTgwOwkvKiBUYWcgKEZpbHRlck1vZGUpICovCi0JKmJ1ZmZlcisrID0gMHgyMDA7CS8qIEFsbG93IEZCQ29sb3IgdGhyb3VnaCAqLwotCSpidWZmZXIrKyA9IDB4NTNCOwkvKiBUYWcgKi8KLQkqYnVmZmVyKysgPSBjb3B5LT5QaXRjaDsKLQkqYnVmZmVyKysgPSAweDUzQTsJLyogVGFnICovCi0JKmJ1ZmZlcisrID0gY29weS0+U3JjQWRkcmVzczsKLQkqYnVmZmVyKysgPSAweDUzOTsJLyogVGFnICovCi0JKmJ1ZmZlcisrID0gY29weS0+V2lkdGhIZWlnaHQ7IC8qIEluaXRpYXRlcyB0cmFuc2ZlciAqLwotCSpidWZmZXIrKyA9IDB4NTNDOwkvKiBUYWcgLSBETUFPdXRwdXRBZGRyZXNzICovCi0JKmJ1ZmZlcisrID0gdmlydF90b19waHlzKCh2b2lkKilzY3JlZW5idWYpOwotCSpidWZmZXIrKyA9IDB4NTNEOwkvKiBUYWcgLSBETUFPdXRwdXRDb3VudCAqLwotCSpidWZmZXIrKyA9IGNvcHktPkNvdW50OyAvKiBSZWFkcyBIb3N0T3V0RmlmbyBCTE9DS1MgdW50aWwgLi4qLwotCi0JLyogRGF0YSBub3cgc2l0dGluZyBpbiBkbWEtPmJ1Zmxpc3RbIEdMSU5UX0RSSV9CVUZfQ09VTlQgKyAxIF0gKi8KLQkvKiBOb3cgcHV0IGl0IGJhY2sgdG8gdGhlIHNjcmVlbiAqLwotCi0JKmJ1ZmZlcisrID0gMHgxODA7CS8qIFRhZyAoRmlsdGVyTW9kZSkgKi8KLQkqYnVmZmVyKysgPSAweDQwMDsJLyogQWxsb3cgU3luYyB0aHJvdWdoICovCi0JKmJ1ZmZlcisrID0gMHg1Mzg7CS8qIFRhZyAtIERNQVJlY3RhbmdsZVJlYWRUYXJnZXQgKi8KLQkqYnVmZmVyKysgPSAweDE1NTsJLyogRkJTb3VyY2VEYXRhIHwgY291bnQgKi8KLQkqYnVmZmVyKysgPSAweDUzNzsJLyogVGFnICovCi0JKmJ1ZmZlcisrID0gY29weS0+UGl0Y2g7Ci0JKmJ1ZmZlcisrID0gMHg1MzY7CS8qIFRhZyAqLwotCSpidWZmZXIrKyA9IGNvcHktPkRzdEFkZHJlc3M7Ci0JKmJ1ZmZlcisrID0gMHg1MzU7CS8qIFRhZyAqLwotCSpidWZmZXIrKyA9IGNvcHktPldpZHRoSGVpZ2h0OyAvKiBJbml0aWF0ZXMgdHJhbnNmZXIgKi8KLQkqYnVmZmVyKysgPSAweDUzMDsJLyogVGFnIC0gRE1BQWRkciAqLwotCSpidWZmZXIrKyA9IHZpcnRfdG9fcGh5cygodm9pZCopc2NyZWVuYnVmKTsKLQkqYnVmZmVyKysgPSAweDUzMTsKLQkqYnVmZmVyKysgPSBjb3B5LT5Db3VudDsgLyogaW5pdGlhdGVzIERNQSB0cmFuc2ZlciBvZiBjb2xvciBkYXRhICovCi0jZW5kaWYKLQotCS8qIG5lZWQgdG8gZGlzcGF0Y2ggaXQgbm93ICovCi0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGdhbW1hX2RtYV9jb3B5KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCi17Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmRldjsKLQlkcm1fZ2FtbWFfY29weV90IGNvcHk7Ci0KLQlpZiAoIGNvcHlfZnJvbV91c2VyKCAmY29weSwgKGRybV9nYW1tYV9jb3B5X3QgX191c2VyICopYXJnLCBzaXplb2YoY29weSkgKSApCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIGdhbW1hX2RvX2NvcHlfZG1hKCBkZXYsICZjb3B5ICk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFBlciBDb250ZXh0IFNBUkVBIFN1cHBvcnQKLSAqLwotCi1pbnQgZ2FtbWFfZ2V0c2FyZWFjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKLQlkcm1fY3R4X3ByaXZfbWFwX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9jdHhfcHJpdl9tYXBfdCByZXF1ZXN0OwotCWRybV9tYXBfdCAqbWFwOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCBhcmdwLCBzaXplb2YocmVxdWVzdCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWRvd24oJmRldi0+c3RydWN0X3NlbSk7Ci0JaWYgKChpbnQpcmVxdWVzdC5jdHhfaWQgPj0gZGV2LT5tYXhfY29udGV4dCkgewotCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWFwID0gZGV2LT5jb250ZXh0X3NhcmVhc1tyZXF1ZXN0LmN0eF9pZF07Ci0JdXAoJmRldi0+c3RydWN0X3NlbSk7Ci0KLQlyZXF1ZXN0LmhhbmRsZSA9IG1hcC0+aGFuZGxlOwotCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1pbnQgZ2FtbWFfc2V0c2FyZWFjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKLQlkcm1fY3R4X3ByaXZfbWFwX3QgcmVxdWVzdDsKLQlkcm1fbWFwX3QgKm1hcCA9IE5VTEw7Ci0JZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LAotCQkJICAgKGRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKilhcmcsCi0JCQkgICBzaXplb2YocmVxdWVzdCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWRvd24oJmRldi0+c3RydWN0X3NlbSk7Ci0Jcl9saXN0ID0gTlVMTDsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7Ci0JCWlmKHJfbGlzdC0+bWFwICYmCi0JCSAgIHJfbGlzdC0+bWFwLT5oYW5kbGUgPT0gcmVxdWVzdC5oYW5kbGUpIGJyZWFrOwotCX0KLQlpZiAobGlzdCA9PSAmKGRldi0+bWFwbGlzdC0+aGVhZCkpIHsKLQkJdXAoJmRldi0+c3RydWN0X3NlbSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltYXAgPSByX2xpc3QtPm1hcDsKLQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKLQotCWlmICghbWFwKSByZXR1cm4gLUVJTlZBTDsKLQotCWRvd24oJmRldi0+c3RydWN0X3NlbSk7Ci0JaWYgKChpbnQpcmVxdWVzdC5jdHhfaWQgPj0gZGV2LT5tYXhfY29udGV4dCkgewotCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWRldi0+Y29udGV4dF9zYXJlYXNbcmVxdWVzdC5jdHhfaWRdID0gbWFwOwotCXVwKCZkZXYtPnN0cnVjdF9zZW0pOwotCXJldHVybiAwOwotfQotCi12b2lkIGdhbW1hX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7Ci0JZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQotCQkJCShkcm1fZ2FtbWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKLQotCXdoaWxlKEdBTU1BX1JFQUQoR0FNTUFfSU5GSUZPU1BBQ0UpIDwgMikKLQkJY3B1X3JlbGF4KCk7Ci0KLQlHQU1NQV9XUklURSggR0FNTUFfR0NPTU1BTkRNT0RFLAkweDAwMDAwMDA0ICk7Ci0JR0FNTUFfV1JJVEUoIEdBTU1BX0dETUFDT05UUk9MLAkJMHgwMDAwMDAwMCApOwotfQotCi12b2lkIGdhbW1hX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgewotCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KLQkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7Ci0KLQl3aGlsZShHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDMpCi0JCWNwdV9yZWxheCgpOwotCi0JR0FNTUFfV1JJVEUoIEdBTU1BX0dJTlRFTkFCTEUsCQkweDAwMDAyMDAxICk7Ci0JR0FNTUFfV1JJVEUoIEdBTU1BX0NPTU1BTkRJTlRFTkFCTEUsCTB4MDAwMDAwMDggKTsKLQlHQU1NQV9XUklURSggR0FNTUFfR0RFTEFZVElNRVIsCQkweDAwMDM5MDkwICk7Ci19Ci0KLXZvaWQgZ2FtbWFfZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgewotCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KLQkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7Ci0JaWYgKCFkZXZfcHJpdikKLQkJcmV0dXJuOwotCi0Jd2hpbGUoR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAzKQotCQljcHVfcmVsYXgoKTsKLQotCUdBTU1BX1dSSVRFKCBHQU1NQV9HREVMQVlUSU1FUiwJCTB4MDAwMDAwMDAgKTsKLQlHQU1NQV9XUklURSggR0FNTUFfQ09NTUFORElOVEVOQUJMRSwJMHgwMDAwMDAwMCApOwotCUdBTU1BX1dSSVRFKCBHQU1NQV9HSU5URU5BQkxFLAkJMHgwMDAwMDAwMCApOwotfQotCi1leHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBEUk0oaW9jdGxzKVtdOwotCi1zdGF0aWMgaW50IGdhbW1hX2RyaXZlcl9wcmVpbml0KGRybV9kZXZpY2VfdCAqZGV2KQotewotCS8qIHJlc2V0IHRoZSBmaW5pc2ggaW9jdGwgKi8KLQlEUk0oaW9jdGxzKVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0ZJTklTSCldLmZ1bmMgPSBEUk0oZmluaXNoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZ2FtbWFfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KQotewotCWdhbW1hX2RvX2NsZWFudXBfZG1hKGRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIGdhbW1hX2RyaXZlcl9kbWFfcmVhZHkoZHJtX2RldmljZV90ICpkZXYpCi17Ci0JZ2FtbWFfZG1hX3JlYWR5KGRldik7Ci19Ci0KLXN0YXRpYyBpbnQgZ2FtbWFfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICpkZXYpCi17Ci0JZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQkoCi0JCWRybV9nYW1tYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwotCWlmIChkZXZfcHJpdi0+bnVtX3Jhc3QgPT0gMikKLQkJZ2FtbWFfZG1hX3F1aWVzY2VudF9kdWFsKGRldik7Ci0JZWxzZSBnYW1tYV9kbWFfcXVpZXNjZW50X3NpbmdsZShkZXYpOwotCXJldHVybiAwOwotfQotCi12b2lkIGdhbW1hX2RyaXZlcl9yZWdpc3Rlcl9mbnMoZHJtX2RldmljZV90ICpkZXYpCi17Ci0JZGV2LT5kcml2ZXJfZmVhdHVyZXMgPSBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8IERSSVZFUl9QQ0lfRE1BIHwgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX0hBVkVfSVJROwotCURSTShmb3BzKS5yZWFkID0gZ2FtbWFfZm9wc19yZWFkOwotCURSTShmb3BzKS5wb2xsID0gZ2FtbWFfZm9wc19wb2xsOwotCWRldi0+ZHJpdmVyLnByZWluaXQgPSBnYW1tYV9kcml2ZXJfcHJlaW5pdDsKLQlkZXYtPmRyaXZlci5wcmV0YWtlZG93biA9IGdhbW1hX2RyaXZlcl9wcmV0YWtlZG93bjsKLQlkZXYtPmRyaXZlci5kbWFfcmVhZHkgPSBnYW1tYV9kcml2ZXJfZG1hX3JlYWR5OwotCWRldi0+ZHJpdmVyLmRtYV9xdWllc2NlbnQgPSBnYW1tYV9kcml2ZXJfZG1hX3F1aWVzY2VudDsKLQlkZXYtPmRyaXZlci5kbWFfZmx1c2hfYmxvY2tfYW5kX2ZsdXNoID0gZ2FtbWFfZmx1c2hfYmxvY2tfYW5kX2ZsdXNoOwotCWRldi0+ZHJpdmVyLmRtYV9mbHVzaF91bmJsb2NrID0gZ2FtbWFfZmx1c2hfdW5ibG9jazsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2RybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDgxOWRlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0jaWZuZGVmIF9HQU1NQV9EUk1fSF8KLSNkZWZpbmUgX0dBTU1BX0RSTV9IXwotCi10eXBlZGVmIHN0cnVjdCBfZHJtX2dhbW1hX3RleF9yZWdpb24gewotCXVuc2lnbmVkIGNoYXIgbmV4dCwgcHJldjsgLyogaW5kaWNlcyB0byBmb3JtIGEgY2lyY3VsYXIgTFJVICAqLwotCXVuc2lnbmVkIGNoYXIgaW5fdXNlOwkvKiBvd25lZCBieSBhIGNsaWVudCwgb3IgZnJlZT8gKi8KLQlpbnQgYWdlOwkJLyogdHJhY2tlZCBieSBjbGllbnRzIHRvIHVwZGF0ZSBsb2NhbCBMUlUncyAqLwotfSBkcm1fZ2FtbWFfdGV4X3JlZ2lvbl90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CUdEZWx0YU1vZGU7Ci0JdW5zaWduZWQgaW50CUdEZXB0aE1vZGU7Ci0JdW5zaWduZWQgaW50CUdHZW9tZXRyeU1vZGU7Ci0JdW5zaWduZWQgaW50CUdUcmFuc2Zvcm1Nb2RlOwotfSBkcm1fZ2FtbWFfY29udGV4dF9yZWdzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9kcm1fZ2FtbWFfc2FyZWEgewotICAgCWRybV9nYW1tYV9jb250ZXh0X3JlZ3NfdCBjb250ZXh0X3N0YXRlOwotCi0JdW5zaWduZWQgaW50IGRpcnR5OwotCi0KLQkvKiBNYWludGFpbiBhbiBMUlUgb2YgY29udGlndW91cyByZWdpb25zIG9mIHRleHR1cmUgc3BhY2UuICBJZgotCSAqIHlvdSB0aGluayB5b3Ugb3duIGEgcmVnaW9uIG9mIHRleHR1cmUgbWVtb3J5LCBhbmQgaXQgaGFzIGFuCi0JICogYWdlIGRpZmZlcmVudCB0byB0aGUgb25lIHlvdSBzZXQsIHRoZW4geW91IGFyZSBtaXN0YWtlbiBhbmQKLQkgKiBpdCBoYXMgYmVlbiBzdG9sZW4gYnkgYW5vdGhlciBjbGllbnQuICBJZiBnbG9iYWwgdGV4QWdlCi0JICogaGFzbid0IGNoYW5nZWQsIHRoZXJlIGlzIG5vIG5lZWQgdG8gd2FsayB0aGUgbGlzdC4KLQkgKgotCSAqIFRoZXNlIHJlZ2lvbnMgY2FuIGJlIHVzZWQgYXMgYSBwcm94eSBmb3IgdGhlIGZpbmUtZ3JhaW5lZAotCSAqIHRleHR1cmUgaW5mb3JtYXRpb24gb2Ygb3RoZXIgY2xpZW50cyAtIGJ5IG1haW50YWluaW5nIHRoZW0KLQkgKiBpbiB0aGUgc2FtZSBscnUgd2hpY2ggaXMgdXNlZCB0byBhZ2UgdGhlaXIgb3duIHRleHR1cmVzLAotCSAqIGNsaWVudHMgaGF2ZSBhbiBhcHByb3hpbWF0ZSBscnUgZm9yIHRoZSB3aG9sZSBvZiBnbG9iYWwKLQkgKiB0ZXh0dXJlIHNwYWNlLCBhbmQgY2FuIG1ha2UgaW5mb3JtZWQgZGVjaXNpb25zIGFzIHRvIHdoaWNoCi0JICogYXJlYXMgdG8ga2ljayBvdXQuICBUaGVyZSBpcyBubyBuZWVkIHRvIGNob29zZSB3aGV0aGVyIHRvCi0JICoga2ljayBvdXQgeW91ciBvd24gdGV4dHVyZSBvciBzb21lb25lIGVsc2UncyAtIHNpbXBseSBlamVjdAotCSAqIHRoZW0gYWxsIGluIExSVSBvcmRlci4gIAotCSAqLwotICAgCi0jZGVmaW5lIEdBTU1BX05SX1RFWF9SRUdJT05TIDY0Ci0JZHJtX2dhbW1hX3RleF9yZWdpb25fdCB0ZXhMaXN0W0dBTU1BX05SX1RFWF9SRUdJT05TKzFdOyAKLQkJCQkvKiBMYXN0IGVsdCBpcyBzZW50aW5hbCAqLwotICAgICAgICBpbnQgdGV4QWdlOwkJLyogbGFzdCB0aW1lIHRleHR1cmUgd2FzIHVwbG9hZGVkICovCi0gICAgICAgIGludCBsYXN0X2VucXVldWU7CS8qIGxhc3QgdGltZSBhIGJ1ZmZlciB3YXMgZW5xdWV1ZWQgKi8KLQlpbnQgbGFzdF9kaXNwYXRjaDsJLyogYWdlIG9mIHRoZSBtb3N0IHJlY2VudGx5IGRpc3BhdGNoZWQgYnVmZmVyICovCi0JaW50IGxhc3RfcXVpZXNjZW50OyAgICAgLyogICovCi0JaW50IGN0eE93bmVyOwkJLyogbGFzdCBjb250ZXh0IHRvIHVwbG9hZCBzdGF0ZSAqLwotCi0JaW50IHZlcnRleF9wcmltOwotfSBkcm1fZ2FtbWFfc2FyZWFfdDsKLQotLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKLSAqIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIgZmlsZSAoeGY4NmRybUdhbW1hLmgpCi0gKi8KLQotLyogR2FtbWEgc3BlY2lmaWMgaW9jdGxzCi0gKiBUaGUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIHJhbmdlIGlzIDB4NDAgdG8gMHg3OS4KLSAqLwotI2RlZmluZSBEUk1fSU9DVExfR0FNTUFfSU5JVAkJRFJNX0lPVyggMHg0MCwgZHJtX2dhbW1hX2luaXRfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0dBTU1BX0NPUFkJCURSTV9JT1coIDB4NDEsIGRybV9nYW1tYV9jb3B5X3QpCi0KLXR5cGVkZWYgc3RydWN0IGRybV9nYW1tYV9jb3B5IHsKLQl1bnNpZ25lZCBpbnQJRE1BT3V0cHV0QWRkcmVzczsKLQl1bnNpZ25lZCBpbnQJRE1BT3V0cHV0Q291bnQ7Ci0JdW5zaWduZWQgaW50CURNQVJlYWRHTElOVFNvdXJjZTsKLQl1bnNpZ25lZCBpbnQJRE1BUmVjdGFuZ2xlV3JpdGVBZGRyZXNzOwotCXVuc2lnbmVkIGludAlETUFSZWN0YW5nbGVXcml0ZUxpbmVQaXRjaDsKLQl1bnNpZ25lZCBpbnQJRE1BUmVjdGFuZ2xlV3JpdGU7Ci0JdW5zaWduZWQgaW50CURNQVJlY3RhbmdsZVJlYWRBZGRyZXNzOwotCXVuc2lnbmVkIGludAlETUFSZWN0YW5nbGVSZWFkTGluZVBpdGNoOwotCXVuc2lnbmVkIGludAlETUFSZWN0YW5nbGVSZWFkOwotCXVuc2lnbmVkIGludAlETUFSZWN0YW5nbGVSZWFkVGFyZ2V0OwotfSBkcm1fZ2FtbWFfY29weV90OwotCi10eXBlZGVmIHN0cnVjdCBkcm1fZ2FtbWFfaW5pdCB7Ci0gICAJZW51bSB7Ci0JICAgCUdBTU1BX0lOSVRfRE1BICAgID0gMHgwMSwKLQkgICAgICAgCUdBTU1BX0NMRUFOVVBfRE1BID0gMHgwMgotCX0gZnVuYzsKLQotICAgCWludCBzYXJlYV9wcml2X29mZnNldDsKLQlpbnQgcGNpbW9kZTsKLQl1bnNpZ25lZCBpbnQgbW1pbzA7Ci0JdW5zaWduZWQgaW50IG1taW8xOwotCXVuc2lnbmVkIGludCBtbWlvMjsKLQl1bnNpZ25lZCBpbnQgbW1pbzM7Ci0JdW5zaWduZWQgaW50IGJ1ZmZlcnNfb2Zmc2V0OwotCWludCBudW1fcmFzdDsKLX0gZHJtX2dhbW1hX2luaXRfdDsKLQotI2VuZGlmIC8qIF9HQU1NQV9EUk1fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2Rydi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2U2NGI2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJ2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiBnYW1tYS5jIC0tIDNkbGFicyBHTVggMjAwMCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCi0gKiBDcmVhdGVkOiBNb24gSmFuICA0IDA4OjU4OjMxIDE5OTkgYnkgZmFpdGhAcHJlY2lzaW9uaW5zaWdodC5jb20KLSAqCi0gKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCi0gKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0gKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKLSAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAotICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQotICogU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgotICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi0gKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKLSAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKiBBdXRob3JzOgotICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+Ci0gKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgImdhbW1hLmgiCi0jaW5jbHVkZSAiZHJtUC5oIgotI2luY2x1ZGUgImRybS5oIgotI2luY2x1ZGUgImdhbW1hX2RybS5oIgotI2luY2x1ZGUgImdhbW1hX2Rydi5oIgotCi0jaW5jbHVkZSAiZHJtX2F1dGguaCIKLSNpbmNsdWRlICJkcm1fYWdwc3VwcG9ydC5oIgotI2luY2x1ZGUgImRybV9idWZzLmgiCi0jaW5jbHVkZSAiZ2FtbWFfY29udGV4dC5oIgkvKiBOT1RFISAqLwotI2luY2x1ZGUgImRybV9kbWEuaCIKLSNpbmNsdWRlICJnYW1tYV9vbGRfZG1hLmgiCS8qIE5PVEUgKi8KLSNpbmNsdWRlICJkcm1fZHJhd2FibGUuaCIKLSNpbmNsdWRlICJkcm1fZHJ2LmgiCi0KLSNpbmNsdWRlICJkcm1fZm9wcy5oIgotI2luY2x1ZGUgImRybV9pbml0LmgiCi0jaW5jbHVkZSAiZHJtX2lvY3RsLmgiCi0jaW5jbHVkZSAiZHJtX2lycS5oIgotI2luY2x1ZGUgImdhbW1hX2xpc3RzLmgiICAgICAgICAvKiBOT1RFICovCi0jaW5jbHVkZSAiZHJtX2xvY2suaCIKLSNpbmNsdWRlICJnYW1tYV9sb2NrLmgiCQkvKiBOT1RFICovCi0jaW5jbHVkZSAiZHJtX21lbW9yeS5oIgotI2luY2x1ZGUgImRybV9wcm9jLmgiCi0jaW5jbHVkZSAiZHJtX3ZtLmgiCi0jaW5jbHVkZSAiZHJtX3N0dWIuaCIKLSNpbmNsdWRlICJkcm1fc2NhdHRlci5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJ2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmZjYzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kcnYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKiBnYW1tYV9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgM2RsYWJzIEdNWCAyMDAwIGRyaXZlciAtKi0gbGludXgtYyAtKi0KLSAqIENyZWF0ZWQ6IE1vbiBKYW4gIDQgMTA6MDU6MDUgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQotICoKLSAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci0gKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCi0gKiBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCi0gKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLSAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgotICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICoKLSAqIEF1dGhvcnM6Ci0gKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KLSAqCi0gKi8KLQotI2lmbmRlZiBfR0FNTUFfRFJWX0hfCi0jZGVmaW5lIF9HQU1NQV9EUlZfSF8KLQotdHlwZWRlZiBzdHJ1Y3QgZHJtX2dhbW1hX3ByaXZhdGUgewotCWRybV9nYW1tYV9zYXJlYV90ICpzYXJlYV9wcml2OwotCWRybV9tYXBfdCAqc2FyZWE7Ci0JZHJtX21hcF90ICptbWlvMDsKLQlkcm1fbWFwX3QgKm1taW8xOwotCWRybV9tYXBfdCAqbW1pbzI7Ci0JZHJtX21hcF90ICptbWlvMzsKLQlpbnQgbnVtX3Jhc3Q7Ci19IGRybV9nYW1tYV9wcml2YXRlX3Q7Ci0KLQkJCQkvKiBnYW1tYV9kbWEuYyAqLwotZXh0ZXJuIGludCBnYW1tYV9kbWFfaW5pdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKLWV4dGVybiBpbnQgZ2FtbWFfZG1hX2NvcHkoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7Ci0KLWV4dGVybiBpbnQgZ2FtbWFfZG9fY2xlYW51cF9kbWEoIGRybV9kZXZpY2VfdCAqZGV2ICk7Ci1leHRlcm4gdm9pZCBnYW1tYV9kbWFfcmVhZHkoZHJtX2RldmljZV90ICpkZXYpOwotZXh0ZXJuIHZvaWQgZ2FtbWFfZG1hX3F1aWVzY2VudF9zaW5nbGUoZHJtX2RldmljZV90ICpkZXYpOwotZXh0ZXJuIHZvaWQgZ2FtbWFfZG1hX3F1aWVzY2VudF9kdWFsKGRybV9kZXZpY2VfdCAqZGV2KTsKLQotCQkJCS8qIGdhbW1hX2RtYS5jICovCi1leHRlcm4gaW50ICBnYW1tYV9kbWFfc2NoZWR1bGUoZHJtX2RldmljZV90ICpkZXYsIGludCBsb2NrZWQpOwotZXh0ZXJuIGludCAgZ2FtbWFfZG1hKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50ICBnYW1tYV9maW5kX2RldmljZXModm9pZCk7Ci1leHRlcm4gaW50ICBnYW1tYV9mb3VuZCh2b2lkKTsKLQotLyogR2FtbWEtc3BlY2lmaWMgY29kZSBwdWxsZWQgZnJvbSBkcm1fZm9wcy5oOgotICovCi1leHRlcm4gaW50CSAgICAgRFJNKGZpbmlzaCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQJICAgICBEUk0oZmx1c2hfdW5ibG9jaykoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0LAotCQkJCQlkcm1fbG9ja19mbGFnc190IGZsYWdzKTsKLWV4dGVybiBpbnQJICAgICBEUk0oZmx1c2hfYmxvY2tfYW5kX2ZsdXNoKShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGNvbnRleHQsCi0JCQkJCQlkcm1fbG9ja19mbGFnc190IGZsYWdzKTsKLQotLyogR2FtbWEtc3BlY2lmaWMgY29kZSBwdWxsZWQgZnJvbSBkcm1fZG1hLmg6Ci0gKi8KLWV4dGVybiB2b2lkCSAgICAgRFJNKGNsZWFyX25leHRfYnVmZmVyKShkcm1fZGV2aWNlX3QgKmRldik7Ci1leHRlcm4gaW50CSAgICAgRFJNKHNlbGVjdF9xdWV1ZSkoZHJtX2RldmljZV90ICpkZXYsCi0JCQkJICAgICAgIHZvaWQgKCp3cmFwcGVyKSh1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gaW50CSAgICAgRFJNKGRtYV9lbnF1ZXVlKShzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RtYV90ICpkbWEpOwotZXh0ZXJuIGludAkgICAgIERSTShkbWFfZ2V0X2J1ZmZlcnMpKHN0cnVjdCBmaWxlICpmaWxwLCBkcm1fZG1hX3QgKmRtYSk7Ci0KLQotLyogR2FtbWEtc3BlY2lmaWMgY29kZSBwdWxsZWQgZnJvbSBkcm1fbGlzdHMuaCAobm93IHJlbmFtZWQgZ2FtbWFfbGlzdHMuaCk6Ci0gKi8KLWV4dGVybiBpbnQJICAgICBEUk0od2FpdGxpc3RfY3JlYXRlKShkcm1fd2FpdGxpc3RfdCAqYmwsIGludCBjb3VudCk7Ci1leHRlcm4gaW50CSAgICAgRFJNKHdhaXRsaXN0X2Rlc3Ryb3kpKGRybV93YWl0bGlzdF90ICpibCk7Ci1leHRlcm4gaW50CSAgICAgRFJNKHdhaXRsaXN0X3B1dCkoZHJtX3dhaXRsaXN0X3QgKmJsLCBkcm1fYnVmX3QgKmJ1Zik7Ci1leHRlcm4gZHJtX2J1Zl90ICAgICAqRFJNKHdhaXRsaXN0X2dldCkoZHJtX3dhaXRsaXN0X3QgKmJsKTsKLWV4dGVybiBpbnQJICAgICBEUk0oZnJlZWxpc3RfY3JlYXRlKShkcm1fZnJlZWxpc3RfdCAqYmwsIGludCBjb3VudCk7Ci1leHRlcm4gaW50CSAgICAgRFJNKGZyZWVsaXN0X2Rlc3Ryb3kpKGRybV9mcmVlbGlzdF90ICpibCk7Ci1leHRlcm4gaW50CSAgICAgRFJNKGZyZWVsaXN0X3B1dCkoZHJtX2RldmljZV90ICpkZXYsIGRybV9mcmVlbGlzdF90ICpibCwKLQkJCQkgICAgICAgZHJtX2J1Zl90ICpidWYpOwotZXh0ZXJuIGRybV9idWZfdCAgICAgKkRSTShmcmVlbGlzdF9nZXQpKGRybV9mcmVlbGlzdF90ICpibCwgaW50IGJsb2NrKTsKLQotLyogZXh0ZXJucyBmb3IgZ2FtbWEgY2hhbmdlcyB0byB0aGUgb3BzICovCi1leHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBEUk0oZm9wcyk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGdhbW1hX2ZvcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KTsKLWV4dGVybiBzc2l6ZV90IGdhbW1hX2ZvcHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZik7Ci0KLQotI2RlZmluZSBHTElOVF9EUklfQlVGX0NPVU5UIDI1NgotCi0jZGVmaW5lIEdBTU1BX09GRihyZWcpCQkJCQkJICAgXAotCSgocmVnIDwgMHgxMDAwKQkJCQkJCSAgIFwKLQkgPyByZWcJCQkJCQkJICAgXAotCSA6ICgocmVnIDwgMHgxMDAwMCkJCQkJCSAgIFwKLQkgICAgPyAocmVnIC0gMHgxMDAwKQkJCQkJICAgXAotCSAgICA6ICgocmVnIDwgMHgxMTAwMCkJCQkJCSAgIFwKLQkgICAgICAgPyAocmVnIC0gMHgxMDAwMCkJCQkJICAgXAotCSAgICAgICA6IChyZWcgLSAweDExMDAwKSkpKQotCi0jZGVmaW5lIEdBTU1BX0JBU0UocmVnKQkgKCh1bnNpZ25lZCBsb25nKQkJCQkgICAgIFwKLQkJCSAgKChyZWcgPCAweDEwMDApICAgID8gZGV2X3ByaXYtPm1taW8wLT5oYW5kbGUgOiAgICAgXAotCQkJICAgKChyZWcgPCAweDEwMDAwKSAgPyBkZXZfcHJpdi0+bW1pbzEtPmhhbmRsZSA6ICAgICBcCi0JCQkgICAgKChyZWcgPCAweDExMDAwKSA/IGRldl9wcml2LT5tbWlvMi0+aGFuZGxlIDogICAgIFwKLQkJCQkJICAgICAgIGRldl9wcml2LT5tbWlvMy0+aGFuZGxlKSkpKQotI2RlZmluZSBHQU1NQV9BRERSKHJlZykJIChHQU1NQV9CQVNFKHJlZykgKyBHQU1NQV9PRkYocmVnKSkKLSNkZWZpbmUgR0FNTUFfREVSRUYocmVnKSAqKF9fdm9sYXRpbGVfXyBpbnQgKilHQU1NQV9BRERSKHJlZykKLSNkZWZpbmUgR0FNTUFfUkVBRChyZWcpCSBHQU1NQV9ERVJFRihyZWcpCi0jZGVmaW5lIEdBTU1BX1dSSVRFKHJlZyx2YWwpIGRvIHsgR0FNTUFfREVSRUYocmVnKSA9IHZhbDsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBHQU1NQV9CUk9BRENBU1RNQVNLICAgIDB4OTM3OAotI2RlZmluZSBHQU1NQV9DT01NQU5ESU5URU5BQkxFIDB4MGM0OAotI2RlZmluZSBHQU1NQV9ETUFBRERSRVNTICAgICAgIDB4MDAyOAotI2RlZmluZSBHQU1NQV9ETUFDT1VOVAkgICAgICAgMHgwMDMwCi0jZGVmaW5lIEdBTU1BX0ZJTFRFUk1PREUgICAgICAgMHg4YzAwCi0jZGVmaW5lIEdBTU1BX0dDT01NQU5ESU5URkxBR1MgMHgwYzUwCi0jZGVmaW5lIEdBTU1BX0dDT01NQU5ETU9ERSAgICAgMHgwYzQwCi0jZGVmaW5lCQlHQU1NQV9RVUVVRURfRE1BX01PREUJCTE8PDEKLSNkZWZpbmUgR0FNTUFfR0NPTU1BTkRTVEFUVVMgICAweDBjNjAKLSNkZWZpbmUgR0FNTUFfR0RFTEFZVElNRVIgICAgICAweDBjMzgKLSNkZWZpbmUgR0FNTUFfR0RNQUNPTlRST0wgICAgICAweDAwNjAKLSNkZWZpbmUgCUdBTU1BX1VTRV9BR1AJCQkxPDwxCi0jZGVmaW5lIEdBTU1BX0dJTlRFTkFCTEUgICAgICAgMHgwODA4Ci0jZGVmaW5lIEdBTU1BX0dJTlRGTEFHUwkgICAgICAgMHgwODEwCi0jZGVmaW5lIEdBTU1BX0lORklGT1NQQUNFICAgICAgMHgwMDE4Ci0jZGVmaW5lIEdBTU1BX09VVEZJRk9XT1JEUyAgICAgMHgwMDIwCi0jZGVmaW5lIEdBTU1BX09VVFBVVEZJRk8gICAgICAgMHgyMDAwCi0jZGVmaW5lIEdBTU1BX1NZTkMJICAgICAgIDB4OGM0MAotI2RlZmluZSBHQU1NQV9TWU5DX1RBRwkgICAgICAgMHgwMTg4Ci0jZGVmaW5lIEdBTU1BX1BBR0VUQUJMRUFERFIgICAgMHgwQzAwCi0jZGVmaW5lIEdBTU1BX1BBR0VUQUJMRUxFTkdUSCAgMHgwQzA4Ci0KLSNkZWZpbmUgR0FNTUFfUEFTU1RIUk9VR0gJMHgxRkUKLSNkZWZpbmUgR0FNTUFfRE1BQUREUlRBRwkweDUzMAotI2RlZmluZSBHQU1NQV9ETUFDT1VOVFRBRwkweDUzMQotI2RlZmluZSBHQU1NQV9DT01NQU5ESU5UVEFHCTB4NTMyCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9saXN0cy5oIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9saXN0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDkzZjQxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfbGlzdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKiBkcm1fbGlzdHMuaCAtLSBCdWZmZXIgbGlzdCBoYW5kbGluZyByb3V0aW5lcyAtKi0gbGludXgtYyAtKi0KLSAqIENyZWF0ZWQ6IE1vbiBBcHIgMTkgMjA6NTQ6MjIgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQotICoKLSAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci0gKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCi0gKiBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKLSAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi0gKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICogQXV0aG9yczoKLSAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgotICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgotICovCi0KLSNpbmNsdWRlICJkcm1QLmgiCi0KLQotaW50IERSTSh3YWl0bGlzdF9jcmVhdGUpKGRybV93YWl0bGlzdF90ICpibCwgaW50IGNvdW50KQotewotCWlmIChibC0+Y291bnQpIHJldHVybiAtRUlOVkFMOwotCi0JYmwtPmJ1ZnMgICAgICAgPSBEUk0oYWxsb2MpKChibC0+Y291bnQgKyAyKSAqIHNpemVvZigqYmwtPmJ1ZnMpLAotCQkJCSAgICBEUk1fTUVNX0JVRkxJU1RTKTsKLQotCWlmKCFibC0+YnVmcykgcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGJsLT5idWZzLCAwLCBzaXplb2YoKmJsLT5idWZzKSk7Ci0JYmwtPmNvdW50ICAgICAgPSBjb3VudDsKLQlibC0+cnAJICAgICAgID0gYmwtPmJ1ZnM7Ci0JYmwtPndwCSAgICAgICA9IGJsLT5idWZzOwotCWJsLT5lbmQJICAgICAgID0gJmJsLT5idWZzW2JsLT5jb3VudCsxXTsKLQlzcGluX2xvY2tfaW5pdCgmYmwtPndyaXRlX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZibC0+cmVhZF9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IERSTSh3YWl0bGlzdF9kZXN0cm95KShkcm1fd2FpdGxpc3RfdCAqYmwpCi17Ci0JaWYgKGJsLT5ycCAhPSBibC0+d3ApIHJldHVybiAtRUlOVkFMOwotCWlmIChibC0+YnVmcykgRFJNKGZyZWUpKGJsLT5idWZzLAotCQkJCShibC0+Y291bnQgKyAyKSAqIHNpemVvZigqYmwtPmJ1ZnMpLAotCQkJCURSTV9NRU1fQlVGTElTVFMpOwotCWJsLT5jb3VudCA9IDA7Ci0JYmwtPmJ1ZnMgID0gTlVMTDsKLQlibC0+cnAJICA9IE5VTEw7Ci0JYmwtPndwCSAgPSBOVUxMOwotCWJsLT5lbmQJICA9IE5VTEw7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBEUk0od2FpdGxpc3RfcHV0KShkcm1fd2FpdGxpc3RfdCAqYmwsIGRybV9idWZfdCAqYnVmKQotewotCWludAkgICAgICBsZWZ0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsZWZ0ID0gRFJNX0xFRlRDT1VOVChibCk7Ci0JaWYgKCFsZWZ0KSB7Ci0JCURSTV9FUlJPUigiT3ZlcmZsb3cgd2hpbGUgYWRkaW5nIGJ1ZmZlciAlZCBmcm9tIGZpbHAgJXBcbiIsCi0JCQkgIGJ1Zi0+aWR4LCBidWYtPmZpbHApOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JYnVmLT5saXN0CSA9IERSTV9MSVNUX1dBSVQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmwtPndyaXRlX2xvY2ssIGZsYWdzKTsKLQkqYmwtPndwID0gYnVmOwotCWlmICgrK2JsLT53cCA+PSBibC0+ZW5kKSBibC0+d3AgPSBibC0+YnVmczsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibC0+d3JpdGVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWRybV9idWZfdCAqRFJNKHdhaXRsaXN0X2dldCkoZHJtX3dhaXRsaXN0X3QgKmJsKQotewotCWRybV9idWZfdCAgICAgKmJ1ZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJsLT5yZWFkX2xvY2ssIGZsYWdzKTsKLQlidWYgPSAqYmwtPnJwOwotCWlmIChibC0+cnAgPT0gYmwtPndwKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsLT5yZWFkX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICgrK2JsLT5ycCA+PSBibC0+ZW5kKSBibC0+cnAgPSBibC0+YnVmczsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibC0+cmVhZF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gYnVmOwotfQotCi1pbnQgRFJNKGZyZWVsaXN0X2NyZWF0ZSkoZHJtX2ZyZWVsaXN0X3QgKmJsLCBpbnQgY291bnQpCi17Ci0JYXRvbWljX3NldCgmYmwtPmNvdW50LCAwKTsKLQlibC0+bmV4dCAgICAgID0gTlVMTDsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZibC0+d2FpdGluZyk7Ci0JYmwtPmxvd19tYXJrICA9IDA7Ci0JYmwtPmhpZ2hfbWFyayA9IDA7Ci0JYXRvbWljX3NldCgmYmwtPndmaCwgICAwKTsKLQlzcGluX2xvY2tfaW5pdCgmYmwtPmxvY2spOwotCSsrYmwtPmluaXRpYWxpemVkOwotCXJldHVybiAwOwotfQotCi1pbnQgRFJNKGZyZWVsaXN0X2Rlc3Ryb3kpKGRybV9mcmVlbGlzdF90ICpibCkKLXsKLQlhdG9taWNfc2V0KCZibC0+Y291bnQsIDApOwotCWJsLT5uZXh0ID0gTlVMTDsKLQlyZXR1cm4gMDsKLX0KLQotaW50IERSTShmcmVlbGlzdF9wdXQpKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZnJlZWxpc3RfdCAqYmwsIGRybV9idWZfdCAqYnVmKQotewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSAgPSBkZXYtPmRtYTsKLQotCWlmICghZG1hKSB7Ci0JCURSTV9FUlJPUigiTm8gRE1BIHN1cHBvcnRcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoYnVmLT53YWl0aW5nIHx8IGJ1Zi0+cGVuZGluZyB8fCBidWYtPmxpc3QgPT0gRFJNX0xJU1RfRlJFRSkgewotCQlEUk1fRVJST1IoIkZyZWVkIGJ1ZmZlciAlZDogdyVkLCBwJWQsIGwlZFxuIiwKLQkJCSAgYnVmLT5pZHgsIGJ1Zi0+d2FpdGluZywgYnVmLT5wZW5kaW5nLCBidWYtPmxpc3QpOwotCX0KLQlpZiAoIWJsKSByZXR1cm4gMTsKLQlidWYtPmxpc3QJPSBEUk1fTElTVF9GUkVFOwotCi0Jc3Bpbl9sb2NrKCZibC0+bG9jayk7Ci0JYnVmLT5uZXh0CT0gYmwtPm5leHQ7Ci0JYmwtPm5leHQJPSBidWY7Ci0Jc3Bpbl91bmxvY2soJmJsLT5sb2NrKTsKLQotCWF0b21pY19pbmMoJmJsLT5jb3VudCk7Ci0JaWYgKGF0b21pY19yZWFkKCZibC0+Y291bnQpID4gZG1hLT5idWZfY291bnQpIHsKLQkJRFJNX0VSUk9SKCIlZCBvZiAlZCBidWZmZXJzIGZyZWUgYWZ0ZXIgYWRkaXRpb24gb2YgJWRcbiIsCi0JCQkgIGF0b21pY19yZWFkKCZibC0+Y291bnQpLCBkbWEtPmJ1Zl9jb3VudCwgYnVmLT5pZHgpOwotCQlyZXR1cm4gMTsKLQl9Ci0JCQkJLyogQ2hlY2sgZm9yIGhpZ2ggd2F0ZXIgbWFyayAqLwotCWlmIChhdG9taWNfcmVhZCgmYmwtPndmaCkgJiYgYXRvbWljX3JlYWQoJmJsLT5jb3VudCk+PWJsLT5oaWdoX21hcmspIHsKLQkJYXRvbWljX3NldCgmYmwtPndmaCwgMCk7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYmwtPndhaXRpbmcpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGRybV9idWZfdCAqRFJNKGZyZWVsaXN0X3RyeSkoZHJtX2ZyZWVsaXN0X3QgKmJsKQotewotCWRybV9idWZfdAkgICpidWY7Ci0KLQlpZiAoIWJsKSByZXR1cm4gTlVMTDsKLQotCQkJCS8qIEdldCBidWZmZXIgKi8KLQlzcGluX2xvY2soJmJsLT5sb2NrKTsKLQlpZiAoIWJsLT5uZXh0KSB7Ci0JCXNwaW5fdW5sb2NrKCZibC0+bG9jayk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlidWYJICA9IGJsLT5uZXh0OwotCWJsLT5uZXh0ICA9IGJsLT5uZXh0LT5uZXh0OwotCXNwaW5fdW5sb2NrKCZibC0+bG9jayk7Ci0KLQlhdG9taWNfZGVjKCZibC0+Y291bnQpOwotCWJ1Zi0+bmV4dCA9IE5VTEw7Ci0JYnVmLT5saXN0ID0gRFJNX0xJU1RfTk9ORTsKLQlpZiAoYnVmLT53YWl0aW5nIHx8IGJ1Zi0+cGVuZGluZykgewotCQlEUk1fRVJST1IoIkZyZWUgYnVmZmVyICVkOiB3JWQsIHAlZCwgbCVkXG4iLAotCQkJICBidWYtPmlkeCwgYnVmLT53YWl0aW5nLCBidWYtPnBlbmRpbmcsIGJ1Zi0+bGlzdCk7Ci0JfQotCi0JcmV0dXJuIGJ1ZjsKLX0KLQotZHJtX2J1Zl90ICpEUk0oZnJlZWxpc3RfZ2V0KShkcm1fZnJlZWxpc3RfdCAqYmwsIGludCBibG9jaykKLXsKLQlkcm1fYnVmX3QJICAqYnVmCT0gTlVMTDsKLQlERUNMQVJFX1dBSVRRVUVVRShlbnRyeSwgY3VycmVudCk7Ci0KLQlpZiAoIWJsIHx8ICFibC0+aW5pdGlhbGl6ZWQpIHJldHVybiBOVUxMOwotCi0JCQkJLyogQ2hlY2sgZm9yIGxvdyB3YXRlciBtYXJrICovCi0JaWYgKGF0b21pY19yZWFkKCZibC0+Y291bnQpIDw9IGJsLT5sb3dfbWFyaykgLyogQmVjYW1lIGxvdyAqLwotCQlhdG9taWNfc2V0KCZibC0+d2ZoLCAxKTsKLQlpZiAoYXRvbWljX3JlYWQoJmJsLT53ZmgpKSB7Ci0JCWlmIChibG9jaykgewotCQkJYWRkX3dhaXRfcXVldWUoJmJsLT53YWl0aW5nLCAmZW50cnkpOwotCQkJZm9yICg7OykgewotCQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQkJCWlmICghYXRvbWljX3JlYWQoJmJsLT53ZmgpCi0JCQkJICAgICYmIChidWYgPSBEUk0oZnJlZWxpc3RfdHJ5KShibCkpKSBicmVhazsKLQkJCQlzY2hlZHVsZSgpOwotCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgYnJlYWs7Ci0JCQl9Ci0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZibC0+d2FpdGluZywgJmVudHJ5KTsKLQkJfQotCQlyZXR1cm4gYnVmOwotCX0KLQotCXJldHVybiBEUk0oZnJlZWxpc3RfdHJ5KShibCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfbG9jay5oIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9sb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZWM2N2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9sb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyogbG9jay5jIC0tIElPQ1RMcyBmb3IgbG9ja2luZyAtKi0gbGludXgtYyAtKi0KLSAqIENyZWF0ZWQ6IFR1ZSBGZWIgIDIgMDg6Mzc6NTQgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQotICoKLSAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci0gKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCi0gKiBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKLSAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi0gKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICogQXV0aG9yczoKLSAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgotICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgotICovCi0KLQotLyogR2FtbWEtc3BlY2lmaWMgY29kZSBleHRyYWN0ZWQgZnJvbSBkcm1fbG9jay5oOgotICovCi1zdGF0aWMgaW50IERSTShmbHVzaF9xdWV1ZSkoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0KQotewotCURFQ0xBUkVfV0FJVFFVRVVFKGVudHJ5LCBjdXJyZW50KTsKLQlpbnQJCSAgcmV0CT0gMDsKLQlkcm1fcXVldWVfdAkgICpxCT0gZGV2LT5xdWV1ZWxpc3RbY29udGV4dF07Ci0KLQlEUk1fREVCVUcoIlxuIik7Ci0KLQlhdG9taWNfaW5jKCZxLT51c2VfY291bnQpOwotCWlmIChhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSA+IDEpIHsKLQkJYXRvbWljX2luYygmcS0+YmxvY2tfd3JpdGUpOwotCQlhZGRfd2FpdF9xdWV1ZSgmcS0+Zmx1c2hfcXVldWUsICZlbnRyeSk7Ci0JCWF0b21pY19pbmMoJnEtPmJsb2NrX2NvdW50KTsKLQkJZm9yICg7OykgewotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCQlpZiAoIURSTV9CVUZDT1VOVCgmcS0+d2FpdGxpc3QpKSBicmVhazsKLQkJCXNjaGVkdWxlKCk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlyZXQgPSAtRUlOVFI7IC8qIENhbid0IHJlc3RhcnQgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhdG9taWNfZGVjKCZxLT5ibG9ja19jb3VudCk7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcS0+Zmx1c2hfcXVldWUsICZlbnRyeSk7Ci0JfQotCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7Ci0KLQkJCQkvKiBOT1RFOiBibG9ja193cml0ZSBpcyBzdGlsbCBpbmNyZW1lbnRlZCEKLQkJCQkgICBVc2UgZHJtX2ZsdXNoX3VubG9ja19xdWV1ZSB0byBkZWNyZW1lbnQuICovCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBEUk0oZmx1c2hfdW5ibG9ja19xdWV1ZSkoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0KQotewotCWRybV9xdWV1ZV90CSAgKnEJPSBkZXYtPnF1ZXVlbGlzdFtjb250ZXh0XTsKLQotCURSTV9ERUJVRygiXG4iKTsKLQotCWF0b21pY19pbmMoJnEtPnVzZV9jb3VudCk7Ci0JaWYgKGF0b21pY19yZWFkKCZxLT51c2VfY291bnQpID4gMSkgewotCQlpZiAoYXRvbWljX3JlYWQoJnEtPmJsb2NrX3dyaXRlKSkgewotCQkJYXRvbWljX2RlYygmcS0+YmxvY2tfd3JpdGUpOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxLT53cml0ZV9xdWV1ZSk7Ci0JCX0KLQl9Ci0JYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IERSTShmbHVzaF9ibG9ja19hbmRfZmx1c2gpKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgY29udGV4dCwKLQkJCSAgICAgICBkcm1fbG9ja19mbGFnc190IGZsYWdzKQotewotCWludCByZXQgPSAwOwotCWludCBpOwotCi0JRFJNX0RFQlVHKCJcbiIpOwotCi0JaWYgKGZsYWdzICYgX0RSTV9MT0NLX0ZMVVNIKSB7Ci0JCXJldCA9IERSTShmbHVzaF9xdWV1ZSkoZGV2LCBEUk1fS0VSTkVMX0NPTlRFWFQpOwotCQlpZiAoIXJldCkgcmV0ID0gRFJNKGZsdXNoX3F1ZXVlKShkZXYsIGNvbnRleHQpOwotCX0KLQlpZiAoZmxhZ3MgJiBfRFJNX0xPQ0tfRkxVU0hfQUxMKSB7Ci0JCWZvciAoaSA9IDA7ICFyZXQgJiYgaSA8IGRldi0+cXVldWVfY291bnQ7IGkrKykgewotCQkJcmV0ID0gRFJNKGZsdXNoX3F1ZXVlKShkZXYsIGkpOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBEUk0oZmx1c2hfdW5ibG9jaykoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0LCBkcm1fbG9ja19mbGFnc190IGZsYWdzKQotewotCWludCByZXQgPSAwOwotCWludCBpOwotCi0JRFJNX0RFQlVHKCJcbiIpOwotCi0JaWYgKGZsYWdzICYgX0RSTV9MT0NLX0ZMVVNIKSB7Ci0JCXJldCA9IERSTShmbHVzaF91bmJsb2NrX3F1ZXVlKShkZXYsIERSTV9LRVJORUxfQ09OVEVYVCk7Ci0JCWlmICghcmV0KSByZXQgPSBEUk0oZmx1c2hfdW5ibG9ja19xdWV1ZSkoZGV2LCBjb250ZXh0KTsKLQl9Ci0JaWYgKGZsYWdzICYgX0RSTV9MT0NLX0ZMVVNIX0FMTCkgewotCQlmb3IgKGkgPSAwOyAhcmV0ICYmIGkgPCBkZXYtPnF1ZXVlX2NvdW50OyBpKyspIHsKLQkJCXJldCA9IERSTShmbHVzaF91bmJsb2NrX3F1ZXVlKShkZXYsIGkpOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IERSTShmaW5pc2gpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAotCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlkcm1fZmlsZV90CSAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QJICAqZGV2CSAgPSBwcml2LT5kZXY7Ci0JaW50CQkgIHJldAkgID0gMDsKLQlkcm1fbG9ja190CSAgbG9jazsKLQotCURSTV9ERUJVRygiXG4iKTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmbG9jaywgKGRybV9sb2NrX3QgX191c2VyICopYXJnLCBzaXplb2YobG9jaykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXQgPSBEUk0oZmx1c2hfYmxvY2tfYW5kX2ZsdXNoKShkZXYsIGxvY2suY29udGV4dCwgbG9jay5mbGFncyk7Ci0JRFJNKGZsdXNoX3VuYmxvY2spKGRldiwgbG9jay5jb250ZXh0LCBsb2NrLmZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9vbGRfZG1hLmggYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX29sZF9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkZDQ1NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX29sZF9kbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKiBkcm1fZG1hLmMgLS0gRE1BIElPQ1RMIGFuZCBmdW5jdGlvbiBzdXBwb3J0IC0qLSBsaW51eC1jIC0qLQotICogQ3JlYXRlZDogRnJpIE1hciAxOSAxNDozMDoxNiAxOTk5IGJ5IGZhaXRoQHZhbGludXguY29tCi0gKgotICogQ29weXJpZ2h0IDE5OTksIDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgotICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLSAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLSAqIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAotICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgotICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi0gKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKLSAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKiBBdXRob3JzOgotICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+Ci0gKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+Ci0gKi8KLQotCi0vKiBHYW1tYS1zcGVjaWZpYyBjb2RlIHB1bGxlZCBmcm9tIGRybV9kbWEuaDoKLSAqLwotCi12b2lkIERSTShjbGVhcl9uZXh0X2J1ZmZlcikoZHJtX2RldmljZV90ICpkZXYpCi17Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0KLQlkbWEtPm5leHRfYnVmZmVyID0gTlVMTDsKLQlpZiAoZG1hLT5uZXh0X3F1ZXVlICYmICFEUk1fQlVGQ09VTlQoJmRtYS0+bmV4dF9xdWV1ZS0+d2FpdGxpc3QpKSB7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZG1hLT5uZXh0X3F1ZXVlLT5mbHVzaF9xdWV1ZSk7Ci0JfQotCWRtYS0+bmV4dF9xdWV1ZQkgPSBOVUxMOwotfQotCi1pbnQgRFJNKHNlbGVjdF9xdWV1ZSkoZHJtX2RldmljZV90ICpkZXYsIHZvaWQgKCp3cmFwcGVyKSh1bnNpZ25lZCBsb25nKSkKLXsKLQlpbnQJICAgaTsKLQlpbnQJICAgY2FuZGlkYXRlID0gLTE7Ci0JaW50CSAgIGoJICAgICA9IGppZmZpZXM7Ci0KLQlpZiAoIWRldikgewotCQlEUk1fRVJST1IoIk5vIGRldmljZVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFkZXYtPnF1ZXVlbGlzdCB8fCAhZGV2LT5xdWV1ZWxpc3RbRFJNX0tFUk5FTF9DT05URVhUXSkgewotCQkJCS8qIFRoaXMgb25seSBoYXBwZW5zIGJldHdlZW4gdGhlIHRpbWUgdGhlCi0JCQkJICAgaW50ZXJydXB0IGlzIGluaXRpYWxpemVkIGFuZCB0aGUgdGltZQotCQkJCSAgIHRoZSBxdWV1ZXMgYXJlIGluaXRpYWxpemVkLiAqLwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JCQkJLyogRG9pbmcgIndoaWxlIGxvY2tlZCIgRE1BPyAqLwotCWlmIChEUk1fV0FJVENPVU5UKGRldiwgRFJNX0tFUk5FTF9DT05URVhUKSkgewotCQlyZXR1cm4gRFJNX0tFUk5FTF9DT05URVhUOwotCX0KLQotCQkJCS8qIElmIHRoZXJlIGFyZSBidWZmZXJzIG9uIHRoZSBsYXN0X2NvbnRleHQKLQkJCQkgICBxdWV1ZSwgYW5kIHdlIGhhdmUgbm90IGJlZW4gZXhlY3V0aW5nCi0JCQkJICAgdGhpcyBjb250ZXh0IHZlcnkgbG9uZywgY29udGludWUgdG8KLQkJCQkgICBleGVjdXRlIHRoaXMgY29udGV4dC4gKi8KLQlpZiAoZGV2LT5sYXN0X3N3aXRjaCA8PSBqCi0JICAgICYmIGRldi0+bGFzdF9zd2l0Y2ggKyBEUk1fVElNRV9TTElDRSA+IGoKLQkgICAgJiYgRFJNX1dBSVRDT1VOVChkZXYsIGRldi0+bGFzdF9jb250ZXh0KSkgewotCQlyZXR1cm4gZGV2LT5sYXN0X2NvbnRleHQ7Ci0JfQotCi0JCQkJLyogT3RoZXJ3aXNlLCBmaW5kIGEgY2FuZGlkYXRlICovCi0JZm9yIChpID0gZGV2LT5sYXN0X2NoZWNrZWQgKyAxOyBpIDwgZGV2LT5xdWV1ZV9jb3VudDsgaSsrKSB7Ci0JCWlmIChEUk1fV0FJVENPVU5UKGRldiwgaSkpIHsKLQkJCWNhbmRpZGF0ZSA9IGRldi0+bGFzdF9jaGVja2VkID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGNhbmRpZGF0ZSA8IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IGRldi0+cXVldWVfY291bnQ7IGkrKykgewotCQkJaWYgKERSTV9XQUlUQ09VTlQoZGV2LCBpKSkgewotCQkJCWNhbmRpZGF0ZSA9IGRldi0+bGFzdF9jaGVja2VkID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWlmICh3cmFwcGVyCi0JICAgICYmIGNhbmRpZGF0ZSA+PSAwCi0JICAgICYmIGNhbmRpZGF0ZSAhPSBkZXYtPmxhc3RfY29udGV4dAotCSAgICAmJiBkZXYtPmxhc3Rfc3dpdGNoIDw9IGoKLQkgICAgJiYgZGV2LT5sYXN0X3N3aXRjaCArIERSTV9USU1FX1NMSUNFID4gaikgewotCQlpZiAoZGV2LT50aW1lci5leHBpcmVzICE9IGRldi0+bGFzdF9zd2l0Y2ggKyBEUk1fVElNRV9TTElDRSkgewotCQkJZGVsX3RpbWVyKCZkZXYtPnRpbWVyKTsKLQkJCWRldi0+dGltZXIuZnVuY3Rpb24gPSB3cmFwcGVyOwotCQkJZGV2LT50aW1lci5kYXRhCSAgICA9ICh1bnNpZ25lZCBsb25nKWRldjsKLQkJCWRldi0+dGltZXIuZXhwaXJlcyAgPSBkZXYtPmxhc3Rfc3dpdGNoK0RSTV9USU1FX1NMSUNFOwotCQkJYWRkX3RpbWVyKCZkZXYtPnRpbWVyKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIGNhbmRpZGF0ZTsKLX0KLQotCi1pbnQgRFJNKGRtYV9lbnF1ZXVlKShzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RtYV90ICpkKQotewotCWRybV9maWxlX3QgICAgKnByaXYgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgICpkZXYgICAgPSBwcml2LT5kZXY7Ci0JaW50CQkgIGk7Ci0JZHJtX3F1ZXVlX3QJICAqcTsKLQlkcm1fYnVmX3QJICAqYnVmOwotCWludAkJICBpZHg7Ci0JaW50CQkgIHdoaWxlX2xvY2tlZCA9IDA7Ci0JZHJtX2RldmljZV9kbWFfdCAgKmRtYSA9IGRldi0+ZG1hOwotCWludAkJICAqaW5kOwotCWludAkJICBlcnI7Ci0JREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOwotCi0JRFJNX0RFQlVHKCIlZFxuIiwgZC0+c2VuZF9jb3VudCk7Ci0KLQlpZiAoZC0+ZmxhZ3MgJiBfRFJNX0RNQV9XSElMRV9MT0NLRUQpIHsKLQkJaW50IGNvbnRleHQgPSBkZXYtPmxvY2suaHdfbG9jay0+bG9jazsKLQotCQlpZiAoIV9EUk1fTE9DS19JU19IRUxEKGNvbnRleHQpKSB7Ci0JCQlEUk1fRVJST1IoIk5vIGxvY2sgaGVsZCBkdXJpbmcgXCJ3aGlsZSBsb2NrZWRcIiIKLQkJCQkgICIgcmVxdWVzdFxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAoZC0+Y29udGV4dCAhPSBfRFJNX0xPQ0tJTkdfQ09OVEVYVChjb250ZXh0KQotCQkgICAgJiYgX0RSTV9MT0NLSU5HX0NPTlRFWFQoY29udGV4dCkgIT0gRFJNX0tFUk5FTF9DT05URVhUKSB7Ci0JCQlEUk1fRVJST1IoIkxvY2sgaGVsZCBieSAlZCB3aGlsZSAlZCBtYWtlcyIKLQkJCQkgICIgXCJ3aGlsZSBsb2NrZWRcIiByZXF1ZXN0XG4iLAotCQkJCSAgX0RSTV9MT0NLSU5HX0NPTlRFWFQoY29udGV4dCksCi0JCQkJICBkLT5jb250ZXh0KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXEgPSBkZXYtPnF1ZXVlbGlzdFtEUk1fS0VSTkVMX0NPTlRFWFRdOwotCQl3aGlsZV9sb2NrZWQgPSAxOwotCX0gZWxzZSB7Ci0JCXEgPSBkZXYtPnF1ZXVlbGlzdFtkLT5jb250ZXh0XTsKLQl9Ci0KLQotCWF0b21pY19pbmMoJnEtPnVzZV9jb3VudCk7Ci0JaWYgKGF0b21pY19yZWFkKCZxLT5ibG9ja193cml0ZSkpIHsKLQkJYWRkX3dhaXRfcXVldWUoJnEtPndyaXRlX3F1ZXVlLCAmZW50cnkpOwotCQlhdG9taWNfaW5jKCZxLT5ibG9ja19jb3VudCk7Ci0JCWZvciAoOzspIHsKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQkJaWYgKCFhdG9taWNfcmVhZCgmcS0+YmxvY2tfd3JpdGUpKSBicmVhazsKLQkJCXNjaGVkdWxlKCk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOwotCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZxLT53cml0ZV9xdWV1ZSwgJmVudHJ5KTsKLQkJCQlyZXR1cm4gLUVJTlRSOwotCQkJfQotCQl9Ci0JCWF0b21pY19kZWMoJnEtPmJsb2NrX2NvdW50KTsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZxLT53cml0ZV9xdWV1ZSwgJmVudHJ5KTsKLQl9Ci0KLQlpbmQgPSBEUk0oYWxsb2MpKGQtPnNlbmRfY291bnQgKiBzaXplb2YoaW50KSwgRFJNX01FTV9EUklWRVIpOwotCWlmICghaW5kKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihpbmQsIGQtPnNlbmRfaW5kaWNlcywgZC0+c2VuZF9jb3VudCAqIHNpemVvZihpbnQpKSkgewotCQllcnIgPSAtRUZBVUxUOwotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotCX0KLQotCWVyciA9IC1FSU5WQUw7Ci0JZm9yIChpID0gMDsgaSA8IGQtPnNlbmRfY291bnQ7IGkrKykgewotCQlpZHggPSBpbmRbaV07Ci0JCWlmIChpZHggPCAwIHx8IGlkeCA+PSBkbWEtPmJ1Zl9jb3VudCkgewotCQkJRFJNX0VSUk9SKCJJbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKLQkJCQkgIGluZFtpXSwgZG1hLT5idWZfY291bnQgLSAxKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWJ1ZiA9IGRtYS0+YnVmbGlzdFsgaWR4IF07Ci0JCWlmIChidWYtPmZpbHAgIT0gZmlscCkgewotCQkJRFJNX0VSUk9SKCJQcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBub3Qgb3duZWRcbiIsCi0JCQkJICBjdXJyZW50LT5waWQpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJaWYgKGJ1Zi0+bGlzdCAhPSBEUk1fTElTVF9OT05FKSB7Ci0JCQlEUk1fRVJST1IoIlByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyICVkIG9uIGxpc3QgJWRcbiIsCi0JCQkJICBjdXJyZW50LT5waWQsIGJ1Zi0+aWR4LCBidWYtPmxpc3QpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJYnVmLT51c2VkCSAgPSBpbmRbaV07Ci0JCWJ1Zi0+d2hpbGVfbG9ja2VkID0gd2hpbGVfbG9ja2VkOwotCQlidWYtPmNvbnRleHQJICA9IGQtPmNvbnRleHQ7Ci0JCWlmICghYnVmLT51c2VkKSB7Ci0JCQlEUk1fRVJST1IoIlF1ZXVlaW5nIDAgbGVuZ3RoIGJ1ZmZlclxuIik7Ci0JCX0KLQkJaWYgKGJ1Zi0+cGVuZGluZykgewotCQkJRFJNX0VSUk9SKCJRdWV1ZWluZyBwZW5kaW5nIGJ1ZmZlcjoiCi0JCQkJICAiIGJ1ZmZlciAlZCwgb2Zmc2V0ICVkXG4iLAotCQkJCSAgaW5kW2ldLCBpKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWlmIChidWYtPndhaXRpbmcpIHsKLQkJCURSTV9FUlJPUigiUXVldWVpbmcgd2FpdGluZyBidWZmZXI6IgotCQkJCSAgIiBidWZmZXIgJWQsIG9mZnNldCAlZFxuIiwKLQkJCQkgIGluZFtpXSwgaSk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlidWYtPndhaXRpbmcgPSAxOwotCQlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPT0gMQotCQkgICAgfHwgYXRvbWljX3JlYWQoJnEtPmZpbmFsaXphdGlvbikpIHsKLQkJCURSTShmcmVlX2J1ZmZlcikoZGV2LCBidWYpOwotCQl9IGVsc2UgewotCQkJRFJNKHdhaXRsaXN0X3B1dCkoJnEtPndhaXRsaXN0LCBidWYpOwotCQkJYXRvbWljX2luYygmcS0+dG90YWxfcXVldWVkKTsKLQkJfQotCX0KLQlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOwotCi0JcmV0dXJuIDA7Ci0KLW91dDoKLQlEUk0oZnJlZSkoaW5kLCBkLT5zZW5kX2NvdW50ICogc2l6ZW9mKGludCksIERSTV9NRU1fRFJJVkVSKTsKLQlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgRFJNKGRtYV9nZXRfYnVmZmVyc19vZl9vcmRlcikoc3RydWN0IGZpbGUgKmZpbHAsIGRybV9kbWFfdCAqZCwKLQkJCQkJIGludCBvcmRlcikKLXsKLQlkcm1fZmlsZV90ICAgICpwcml2ICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICAqZGV2ICAgID0gcHJpdi0+ZGV2OwotCWludAkJICBpOwotCWRybV9idWZfdAkgICpidWY7Ci0JZHJtX2RldmljZV9kbWFfdCAgKmRtYSA9IGRldi0+ZG1hOwotCi0JZm9yIChpID0gZC0+Z3JhbnRlZF9jb3VudDsgaSA8IGQtPnJlcXVlc3RfY291bnQ7IGkrKykgewotCQlidWYgPSBEUk0oZnJlZWxpc3RfZ2V0KSgmZG1hLT5idWZzW29yZGVyXS5mcmVlbGlzdCwKLQkJCQkJZC0+ZmxhZ3MgJiBfRFJNX0RNQV9XQUlUKTsKLQkJaWYgKCFidWYpIGJyZWFrOwotCQlpZiAoYnVmLT5wZW5kaW5nIHx8IGJ1Zi0+d2FpdGluZykgewotCQkJRFJNX0VSUk9SKCJGcmVlIGJ1ZmZlciAlZCBpbiB1c2U6IGZpbHAgJXAgKHclZCwgcCVkKVxuIiwKLQkJCQkgIGJ1Zi0+aWR4LAotCQkJCSAgYnVmLT5maWxwLAotCQkJCSAgYnVmLT53YWl0aW5nLAotCQkJCSAgYnVmLT5wZW5kaW5nKTsKLQkJfQotCQlidWYtPmZpbHAgICAgID0gZmlscDsKLQkJaWYgKGNvcHlfdG9fdXNlcigmZC0+cmVxdWVzdF9pbmRpY2VzW2ldLAotCQkJCSAmYnVmLT5pZHgsCi0JCQkJIHNpemVvZihidWYtPmlkeCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigmZC0+cmVxdWVzdF9zaXplc1tpXSwKLQkJCQkgJmJ1Zi0+dG90YWwsCi0JCQkJIHNpemVvZihidWYtPnRvdGFsKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkrK2QtPmdyYW50ZWRfY291bnQ7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLWludCBEUk0oZG1hX2dldF9idWZmZXJzKShzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RtYV90ICpkbWEpCi17Ci0JaW50CQkgIG9yZGVyOwotCWludAkJICByZXRjb2RlID0gMDsKLQlpbnQJCSAgdG1wX29yZGVyOwotCi0Jb3JkZXIgPSBEUk0ob3JkZXIpKGRtYS0+cmVxdWVzdF9zaXplKTsKLQotCWRtYS0+Z3JhbnRlZF9jb3VudCA9IDA7Ci0JcmV0Y29kZQkJICAgPSBEUk0oZG1hX2dldF9idWZmZXJzX29mX29yZGVyKShmaWxwLCBkbWEsIG9yZGVyKTsKLQotCWlmIChkbWEtPmdyYW50ZWRfY291bnQgPCBkbWEtPnJlcXVlc3RfY291bnQKLQkgICAgJiYgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9TTUFMTEVSX09LKSkgewotCQlmb3IgKHRtcF9vcmRlciA9IG9yZGVyIC0gMTsKLQkJICAgICAhcmV0Y29kZQotCQkJICAgICAmJiBkbWEtPmdyYW50ZWRfY291bnQgPCBkbWEtPnJlcXVlc3RfY291bnQKLQkJCSAgICAgJiYgdG1wX29yZGVyID49IERSTV9NSU5fT1JERVI7Ci0JCSAgICAgLS10bXBfb3JkZXIpIHsKLQotCQkJcmV0Y29kZSA9IERSTShkbWFfZ2V0X2J1ZmZlcnNfb2Zfb3JkZXIpKGZpbHAsIGRtYSwKLQkJCQkJCQkJdG1wX29yZGVyKTsKLQkJfQotCX0KLQotCWlmIChkbWEtPmdyYW50ZWRfY291bnQgPCBkbWEtPnJlcXVlc3RfY291bnQKLQkgICAgJiYgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9MQVJHRVJfT0spKSB7Ci0JCWZvciAodG1wX29yZGVyID0gb3JkZXIgKyAxOwotCQkgICAgICFyZXRjb2RlCi0JCQkgICAgICYmIGRtYS0+Z3JhbnRlZF9jb3VudCA8IGRtYS0+cmVxdWVzdF9jb3VudAotCQkJICAgICAmJiB0bXBfb3JkZXIgPD0gRFJNX01BWF9PUkRFUjsKLQkJICAgICArK3RtcF9vcmRlcikgewotCi0JCQlyZXRjb2RlID0gRFJNKGRtYV9nZXRfYnVmZmVyc19vZl9vcmRlcikoZmlscCwgZG1hLAotCQkJCQkJCQl0bXBfb3JkZXIpOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKaW5kZXggMThlMGI3Ni4uMmYxNjU5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYwpAQCAtNDUsMTEgKzQ1LDYgQEAKICNkZWZpbmUgSTgxMF9CVUZfVU5NQVBQRUQgMAogI2RlZmluZSBJODEwX0JVRl9NQVBQRUQgICAxCiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw0LDIpCi0jZGVmaW5lIGRvd25fd3JpdGUgZG93bgotI2RlZmluZSB1cF93cml0ZSB1cAotI2VuZGlmCi0KIHN0YXRpYyBkcm1fYnVmX3QgKmk4MTBfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqZGV2KQogewogICAgCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwpAQCAtMzUxLDYgKzM0Niw3IEBACiAJICAgCURSTV9FUlJPUigiY2FuIG5vdCBmaW5kIG1taW8gbWFwIVxuIik7CiAJICAgCXJldHVybiAtRUlOVkFMOwogCX0KKwlkZXYtPmFncF9idWZmZXJfdG9rZW4gPSBpbml0LT5idWZmZXJzX29mZnNldDsKIAlkZXYtPmFncF9idWZmZXJfbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KTsKIAlpZiAoIWRldi0+YWdwX2J1ZmZlcl9tYXApIHsKIAkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CkBAIC0xMzgzLDMgKzEzNzksMTkgQEAKIH07CiAKIGludCBpODEwX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk4MTBfaW9jdGxzKTsKKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIGRldmljZSByZWFsbHkgaXMgQUdQIG9yIG5vdC4KKyAqCisgKiBBbGwgSW50ZWwgZ3JhcGhpY3MgY2hpcHNldHMgYXJlIHRyZWF0ZWQgYXMgQUdQLCBldmVuIGlmIHRoZXkgYXJlIHJlYWxseQorICogUENJLWUuCisgKgorICogXHBhcmFtIGRldiAgIFRoZSBkZXZpY2UgdG8gYmUgdGVzdGVkLgorICoKKyAqIFxyZXR1cm5zCisgKiBBIHZhbHVlIG9mIDEgaXMgYWx3YXlzIHJldHVyZWQgdG8gaW5kaWN0YXRlIGV2ZXJ5IGk4MTAgaXMgQUdQLgorICovCitpbnQgaTgxMF9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmMKaW5kZXggZmY1MWIzMi4uMDA2MDkzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuYwpAQCAtODQsNiArODQsNyBAQAogCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9pODEwX2J1Zl9wcml2X3QpLAogCS5wcmV0YWtlZG93biA9IGk4MTBfZHJpdmVyX3ByZXRha2Vkb3duLAogCS5wcmVyZWxlYXNlID0gaTgxMF9kcml2ZXJfcHJlcmVsZWFzZSwKKwkuZGV2aWNlX2lzX2FncCA9IGk4MTBfZHJpdmVyX2RldmljZV9pc19hZ3AsCiAJLnJlbGVhc2UgPSBpODEwX2RyaXZlcl9yZWxlYXNlLAogCS5kbWFfcXVpZXNjZW50ID0gaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudCwKIAkucmVjbGFpbV9idWZmZXJzID0gaTgxMF9yZWNsYWltX2J1ZmZlcnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKaW5kZXggMWI0MDUzOC4uNjJlZTRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaApAQCAtMTIwLDYgKzEyMCw3IEBACiBleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9yZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldik7CiBleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIGludCBpODEwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldik7CiAKICNkZWZpbmUgSTgxMF9CQVNFKHJlZykJCSgodW5zaWduZWQgbG9uZykgXAogCQkJCWRldl9wcml2LT5tbWlvX21hcC0+aGFuZGxlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCmluZGV4IGRjNzczMzAuLjZmODlkNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKQEAgLTQ3LDExICs0Nyw2IEBACiAjZGVmaW5lIEk4MzBfQlVGX1VOTUFQUEVEIDAKICNkZWZpbmUgSTgzMF9CVUZfTUFQUEVEICAgMQogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNCwyKQotI2RlZmluZSBkb3duX3dyaXRlIGRvd24KLSNkZWZpbmUgdXBfd3JpdGUgdXAKLSNlbmRpZgotCiBzdGF0aWMgZHJtX2J1Zl90ICppODMwX2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKmRldikKIHsKICAgIAlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKQEAgLTM1OCw2ICszNTMsNyBAQAogCQlEUk1fRVJST1IoImNhbiBub3QgZmluZCBtbWlvIG1hcCFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJZGV2LT5hZ3BfYnVmZmVyX3Rva2VuID0gaW5pdC0+YnVmZmVyc19vZmZzZXQ7CiAJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5idWZmZXJzX29mZnNldCk7CiAJaWYoIWRldi0+YWdwX2J1ZmZlcl9tYXApIHsKIAkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CkBAIC0xNTg2LDMgKzE1ODIsMTkgQEAKIH07CiAKIGludCBpODMwX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk4MzBfaW9jdGxzKTsKKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIGRldmljZSByZWFsbHkgaXMgQUdQIG9yIG5vdC4KKyAqCisgKiBBbGwgSW50ZWwgZ3JhcGhpY3MgY2hpcHNldHMgYXJlIHRyZWF0ZWQgYXMgQUdQLCBldmVuIGlmIHRoZXkgYXJlIHJlYWxseQorICogUENJLWUuCisgKgorICogXHBhcmFtIGRldiAgIFRoZSBkZXZpY2UgdG8gYmUgdGVzdGVkLgorICoKKyAqIFxyZXR1cm5zCisgKiBBIHZhbHVlIG9mIDEgaXMgYWx3YXlzIHJldHVyZWQgdG8gaW5kaWN0YXRlIGV2ZXJ5IGk4eHggaXMgQUdQLgorICovCitpbnQgaTgzMF9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmMKaW5kZXggYmMzNmJlNy4uMGRhOWNkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuYwpAQCAtODgsNiArODgsNyBAQAogCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9pODMwX2J1Zl9wcml2X3QpLAogCS5wcmV0YWtlZG93biA9IGk4MzBfZHJpdmVyX3ByZXRha2Vkb3duLAogCS5wcmVyZWxlYXNlID0gaTgzMF9kcml2ZXJfcHJlcmVsZWFzZSwKKwkuZGV2aWNlX2lzX2FncCA9IGk4MzBfZHJpdmVyX2RldmljZV9pc19hZ3AsCiAJLnJlbGVhc2UgPSBpODMwX2RyaXZlcl9yZWxlYXNlLAogCS5kbWFfcXVpZXNjZW50ID0gaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudCwKIAkucmVjbGFpbV9idWZmZXJzID0gaTgzMF9yZWNsYWltX2J1ZmZlcnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKaW5kZXggZGY3NzQ2MS4uNjNmOTZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaApAQCAtMTM3LDYgKzEzNyw3IEBACiBleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9yZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gaW50IGk4MzBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICpkZXYpOwogZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiBpbnQgaTgzMF9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpOwogCiAjZGVmaW5lIEk4MzBfQkFTRShyZWcpCQkoKHVuc2lnbmVkIGxvbmcpIFwKIAkJCQlkZXZfcHJpdi0+bW1pb19tYXAtPmhhbmRsZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYwppbmRleCBhY2Y5ZTUyLi4zNGY1NTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCkBAIC05NSw5ICs5NSw4IEBACiAJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSggJmRldl9wcml2LT5yaW5nLm1hcCwgZGV2KTsKIAkJfQogCi0JCWlmIChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpIHsKLQkJCWRybV9wY2lfZnJlZShkZXYsIFBBR0VfU0laRSwgZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlLAotCQkJCSAgICAgZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSk7CisJCWlmIChkZXZfcHJpdi0+c3RhdHVzX3BhZ2VfZG1haCkgeworCQkJZHJtX3BjaV9mcmVlKGRldiwgZGV2X3ByaXYtPnN0YXR1c19wYWdlX2RtYWgpOwogCQkJLyogTmVlZCB0byByZXdyaXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlICovCiAJCQlJOTE1X1dSSVRFKDB4MDIwODAsIDB4MWZmZmYwMDApOwogCQl9CkBAIC0xNzQsMTYgKzE3MywxOCBAQAogCWRldl9wcml2LT5hbGxvd19iYXRjaGJ1ZmZlciA9IDE7CiAKIAkvKiBQcm9ncmFtIEhhcmR3YXJlIFN0YXR1cyBQYWdlICovCi0JZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlID0gZHJtX3BjaV9hbGxvYyhkZXYsIFBBR0VfU0laRSwgUEFHRV9TSVpFLAotCQkJCQkJIDB4ZmZmZmZmZmYsIAotCQkJCQkJICZkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKwlkZXZfcHJpdi0+c3RhdHVzX3BhZ2VfZG1haCA9IGRybV9wY2lfYWxsb2MoZGV2LCBQQUdFX1NJWkUsIFBBR0VfU0laRSwKKwkJCQkJCSAgIDB4ZmZmZmZmZmYpOwogCi0JaWYgKCFkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpIHsKKwlpZiAoIWRldl9wcml2LT5zdGF0dXNfcGFnZV9kbWFoKSB7CiAJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCQlpOTE1X2RtYV9jbGVhbnVwKGRldik7CiAJCURSTV9FUlJPUigiQ2FuIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBzdGF0dXMgcGFnZVxuIik7CiAJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CiAJfQorCWRldl9wcml2LT5od19zdGF0dXNfcGFnZSA9IGRldl9wcml2LT5zdGF0dXNfcGFnZV9kbWFoLT52YWRkcjsKKwlkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlID0gZGV2X3ByaXYtPnN0YXR1c19wYWdlX2RtYWgtPmJ1c2FkZHI7CisKIAltZW1zZXQoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlLCAwLCBQQUdFX1NJWkUpOwogCURSTV9ERUJVRygiaHcgc3RhdHVzIHBhZ2UgQCAlcFxuIiwgZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKTsKIApAQCAtNzMxLDMgKzczMiwxOSBAQAogfTsKIAogaW50IGk5MTVfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoaTkxNV9pb2N0bHMpOworCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgZGV2aWNlIHJlYWxseSBpcyBBR1Agb3Igbm90LgorICoKKyAqIEFsbCBJbnRlbCBncmFwaGljcyBjaGlwc2V0cyBhcmUgdHJlYXRlZCBhcyBBR1AsIGV2ZW4gaWYgdGhleSBhcmUgcmVhbGx5CisgKiBQQ0ktZS4KKyAqCisgKiBccGFyYW0gZGV2ICAgVGhlIGRldmljZSB0byBiZSB0ZXN0ZWQuCisgKgorICogXHJldHVybnMKKyAqIEEgdmFsdWUgb2YgMSBpcyBhbHdheXMgcmV0dXJlZCB0byBpbmRpY3RhdGUgZXZlcnkgaTl4NSBpcyBBR1AuCisgKi8KK2ludCBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuYwppbmRleCAxZjU5ZDNmLi4xMDZiOWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jCkBAIC03OSw2ICs3OSw3IEBACiAJCQkJRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0lSUV9TSEFSRUQsCiAJLnByZXRha2Vkb3duID0gaTkxNV9kcml2ZXJfcHJldGFrZWRvd24sCiAJLnByZXJlbGVhc2UgPSBpOTE1X2RyaXZlcl9wcmVyZWxlYXNlLAorCS5kZXZpY2VfaXNfYWdwID0gaTkxNV9kcml2ZXJfZGV2aWNlX2lzX2FncCwKIAkuaXJxX3ByZWluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbCwKIAkuaXJxX3Bvc3RpbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLAogCS5pcnFfdW5pbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaAppbmRleCA5YzM3ZDIzLi43MGVkNGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCkBAIC03OSw5ICs3OSwxMCBAQAogCWRybV9pOTE1X3NhcmVhX3QgKnNhcmVhX3ByaXY7CiAJZHJtX2k5MTVfcmluZ19idWZmZXJfdCByaW5nOwogCisJZHJtX2RtYV9oYW5kbGVfdCAqc3RhdHVzX3BhZ2VfZG1haDsKIAl2b2lkICpod19zdGF0dXNfcGFnZTsKLQl1bnNpZ25lZCBsb25nIGNvdW50ZXI7CiAJZG1hX2FkZHJfdCBkbWFfc3RhdHVzX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBjb3VudGVyOwogCiAJaW50IGJhY2tfb2Zmc2V0OwogCWludCBmcm9udF9vZmZzZXQ7CkBAIC0xMDIsNiArMTAzLDcgQEAKIGV4dGVybiB2b2lkIGk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpOwogZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiBpbnQgaTkxNV9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKmRldik7CiAKIC8qIGk5MTVfaXJxLmMgKi8KIGV4dGVybiBpbnQgaTkxNV9pcnFfZW1pdChEUk1fSU9DVExfQVJHUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCmluZGV4IDgzMmVhZjguLmZjN2Q0YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCkBAIC0yMywxOCArMjMsMjEgQEAKICAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAogICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCiAgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICogQXV0aG9yczoKLSAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgotICogICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgotICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgotICoKLSAqIFJld3JpdHRlbiBieToKLSAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisvKioKKyAqIFxmaWxlIG1nYV9kbWEuYworICogRE1BIHN1cHBvcnQgZm9yIE1HQSBHMjAwIC8gRzQwMC4KKyAqIAorICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqIFxhdXRob3IgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICogXGF1dGhvciBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKiBcYXV0aG9yIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KICAqLwogCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImRybV9zYXJlYS5oIgogI2luY2x1ZGUgIm1nYV9kcm0uaCIKICNpbmNsdWRlICJtZ2FfZHJ2LmgiCiAKQEAgLTE0OCw3ICsxNTEsNyBAQAogCURSTV9ERUJVRyggIiAgc3BhY2UgPSAweCUwNnhcbiIsIHByaW1hcnktPnNwYWNlICk7CiAKIAltZ2FfZmx1c2hfd3JpdGVfY29tYmluZSgpOwotCU1HQV9XUklURSggTUdBX1BSSU1FTkQsIHRhaWwgfCBNR0FfUEFHUFhGRVIgKTsKKwlNR0FfV1JJVEUoTUdBX1BSSU1FTkQsIHRhaWwgfCBkZXZfcHJpdi0+ZG1hX2FjY2Vzcyk7CiAKIAlEUk1fREVCVUcoICJkb25lLlxuIiApOwogfQpAQCAtMTkwLDcgKzE5Myw3IEBACiAJRFJNX0RFQlVHKCAiICBzcGFjZSA9IDB4JTA2eFxuIiwgcHJpbWFyeS0+c3BhY2UgKTsKIAogCW1nYV9mbHVzaF93cml0ZV9jb21iaW5lKCk7Ci0JTUdBX1dSSVRFKCBNR0FfUFJJTUVORCwgdGFpbCB8IE1HQV9QQUdQWEZFUiApOworCU1HQV9XUklURShNR0FfUFJJTUVORCwgdGFpbCB8IGRldl9wcml2LT5kbWFfYWNjZXNzKTsKIAogCXNldF9iaXQoIDAsICZwcmltYXJ5LT53cmFwcGVkICk7CiAJRFJNX0RFQlVHKCAiZG9uZS5cbiIgKTsKQEAgLTM5NiwyMyArMzk5LDM5MCBAQAogICogRE1BIGluaXRpYWxpemF0aW9uLCBjbGVhbnVwCiAgKi8KIAorCitpbnQgbWdhX2RyaXZlcl9wcmVpbml0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXY7CisKKwlkZXZfcHJpdiA9IGRybV9hbGxvYyhzaXplb2YoZHJtX21nYV9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUik7CisJaWYgKCFkZXZfcHJpdikKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKworCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9tZ2FfcHJpdmF0ZV90KSk7CisKKwlkZXZfcHJpdi0+dXNlY190aW1lb3V0ID0gTUdBX0RFRkFVTFRfVVNFQ19USU1FT1VUOworCWRldl9wcml2LT5jaGlwc2V0ID0gZmxhZ3M7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIF9fT1NfSEFTX0FHUAorLyoqCisgKiBCb290c3RyYXAgdGhlIGRyaXZlciBmb3IgQUdQIERNQS4KKyAqIAorICogXHRvZG8KKyAqIEludmVzdGlnYXRlIHdoZXRoZXIgdGhlcmUgaXMgYW55IGJlbmlmaXQgdG8gc3RvcmluZyB0aGUgV0FSUCBtaWNyb2NvZGUgaW4KKyAqIEFHUCBtZW1vcnkuICBJZiBub3QsIHRoZSBtaWNyb2NvZGUgbWF5IGFzIHdlbGwgYWx3YXlzIGJlIHB1dCBpbiBQQ0kKKyAqIG1lbW9yeS4KKyAqCisgKiBcdG9kbworICogVGhpcyByb3V0aW5lIG5lZWRzIHRvIHNldCBkbWFfYnMtPmFncF9tb2RlIHRvIHRoZSBtb2RlIGFjdHVhbGx5IGNvbmZpZ3VyZWQKKyAqIGluIHRoZSBoYXJkd2FyZS4gIExvb2tpbmcganVzdCBhdCB0aGUgTGludXggQUdQIGRyaXZlciBjb2RlLCBJIGRvbid0IHNlZQorICogYW4gZWFzeSB3YXkgdG8gZGV0ZXJtaW5lIHRoaXMuCisgKgorICogXHNhIG1nYV9kb19kbWFfYm9vdHN0cmFwLCBtZ2FfZG9fcGNpX2RtYV9ib290c3RyYXAKKyAqLworc3RhdGljIGludCBtZ2FfZG9fYWdwX2RtYV9ib290c3RyYXAoZHJtX2RldmljZV90ICogZGV2LAorCQkJCSAgICBkcm1fbWdhX2RtYV9ib290c3RyYXBfdCAqIGRtYV9icykKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqIGNvbnN0IGRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJY29uc3QgdW5zaWduZWQgaW50IHdhcnBfc2l6ZSA9IG1nYV93YXJwX21pY3JvY29kZV9zaXplKGRldl9wcml2KTsKKwlpbnQgZXJyOworCXVuc2lnbmVkICBvZmZzZXQ7CisJY29uc3QgdW5zaWduZWQgc2Vjb25kYXJ5X3NpemUgPSBkbWFfYnMtPnNlY29uZGFyeV9iaW5fY291bnQKKwkJKiBkbWFfYnMtPnNlY29uZGFyeV9iaW5fc2l6ZTsKKwljb25zdCB1bnNpZ25lZCBhZ3Bfc2l6ZSA9IChkbWFfYnMtPmFncF9zaXplIDw8IDIwKTsKKwlkcm1fYnVmX2Rlc2NfdCByZXE7CisJZHJtX2FncF9tb2RlX3QgbW9kZTsKKwlkcm1fYWdwX2luZm9fdCBpbmZvOworCisJCisJLyogQWNxdWlyZSBBR1AuICovCisJZXJyID0gZHJtX2FncF9hY3F1aXJlKGRldik7CisJaWYgKGVycikgeworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBhY3F1aXJlIEFHUFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gZHJtX2FncF9pbmZvKGRldiwgJmluZm8pOworCWlmIChlcnIpIHsKKwkJRFJNX0VSUk9SKCJVbmFibGUgdG8gZ2V0IEFHUCBpbmZvXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwltb2RlLm1vZGUgPSAoaW5mby5tb2RlICYgfjB4MDcpIHwgZG1hX2JzLT5hZ3BfbW9kZTsKKwllcnIgPSBkcm1fYWdwX2VuYWJsZShkZXYsIG1vZGUpOworCWlmIChlcnIpIHsKKwkJRFJNX0VSUk9SKCJVbmFibGUgdG8gZW5hYmxlIEFHUCAobW9kZSA9IDB4JWx4KVxuIiwgbW9kZS5tb2RlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKworCS8qIEluIGFkZGl0aW9uIHRvIHRoZSB1c3VhbCBBR1AgbW9kZSBjb25maWd1cmF0aW9uLCB0aGUgRzIwMCBBR1AgY2FyZHMKKwkgKiBuZWVkIHRvIGhhdmUgdGhlIEFHUCBtb2RlICJtYW51YWxseSIgc2V0LgorCSAqLworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IE1HQV9DQVJEX1RZUEVfRzIwMCkgeworCQlpZiAobW9kZS5tb2RlICYgMHgwMikgeworCQkJTUdBX1dSSVRFKE1HQV9BR1BfUExMLCBNR0FfQUdQMlhQTExfRU5BQkxFKTsKKwkJfQorCQllbHNlIHsKKwkJCU1HQV9XUklURShNR0FfQUdQX1BMTCwgTUdBX0FHUDJYUExMX0RJU0FCTEUpOworCQl9CisJfQorCisKKwkvKiBBbGxvY2F0ZSBhbmQgYmluZCBBR1AgbWVtb3J5LiAqLworCWRldl9wcml2LT5hZ3BfcGFnZXMgPSBhZ3Bfc2l6ZSAvIFBBR0VfU0laRTsKKwlkZXZfcHJpdi0+YWdwX21lbSA9IGRybV9hbGxvY19hZ3AoIGRldiwgZGV2X3ByaXYtPmFncF9wYWdlcywgMCApOworCWlmIChkZXZfcHJpdi0+YWdwX21lbSA9PSBOVUxMKSB7CisJCWRldl9wcml2LT5hZ3BfcGFnZXMgPSAwOworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBhbGxvY2F0ZSAldU1CIEFHUCBtZW1vcnlcbiIsCisJCQkgIGRtYV9icy0+YWdwX3NpemUpOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKwkJCisJZXJyID0gZHJtX2JpbmRfYWdwKCBkZXZfcHJpdi0+YWdwX21lbSwgMCApOworCWlmIChlcnIpIHsKKwkJRFJNX0VSUk9SKCJVbmFibGUgdG8gYmluZCBBR1AgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlvZmZzZXQgPSAwOworCWVyciA9IGRybV9hZGRtYXAoIGRldiwgb2Zmc2V0LCB3YXJwX3NpemUsCisJCQkgIF9EUk1fQUdQLCBfRFJNX1JFQURfT05MWSwgJiBkZXZfcHJpdi0+d2FycCApOworCWlmIChlcnIpIHsKKwkJRFJNX0VSUk9SKCJVbmFibGUgdG8gbWFwIFdBUlAgbWljcm9jb2RlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlvZmZzZXQgKz0gd2FycF9zaXplOworCWVyciA9IGRybV9hZGRtYXAoIGRldiwgb2Zmc2V0LCBkbWFfYnMtPnByaW1hcnlfc2l6ZSwKKwkJCSAgX0RSTV9BR1AsIF9EUk1fUkVBRF9PTkxZLCAmIGRldl9wcml2LT5wcmltYXJ5ICk7CisJaWYgKGVycikgeworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBtYXAgcHJpbWFyeSBETUEgcmVnaW9uXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlvZmZzZXQgKz0gZG1hX2JzLT5wcmltYXJ5X3NpemU7CisJZXJyID0gZHJtX2FkZG1hcCggZGV2LCBvZmZzZXQsIHNlY29uZGFyeV9zaXplLAorCQkJICBfRFJNX0FHUCwgMCwgJiBkZXYtPmFncF9idWZmZXJfbWFwICk7CisJaWYgKGVycikgeworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBtYXAgc2Vjb25kYXJ5IERNQSByZWdpb25cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCSh2b2lkKSBtZW1zZXQoICZyZXEsIDAsIHNpemVvZihyZXEpICk7CisJcmVxLmNvdW50ID0gZG1hX2JzLT5zZWNvbmRhcnlfYmluX2NvdW50OworCXJlcS5zaXplID0gZG1hX2JzLT5zZWNvbmRhcnlfYmluX3NpemU7CisJcmVxLmZsYWdzID0gX0RSTV9BR1BfQlVGRkVSOworCXJlcS5hZ3Bfc3RhcnQgPSBvZmZzZXQ7CisKKwllcnIgPSBkcm1fYWRkYnVmc19hZ3AoIGRldiwgJiByZXEgKTsKKwlpZiAoZXJyKSB7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIGFkZCBzZWNvbmRhcnkgRE1BIGJ1ZmZlcnNcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCW9mZnNldCArPSBzZWNvbmRhcnlfc2l6ZTsKKwllcnIgPSBkcm1fYWRkbWFwKCBkZXYsIG9mZnNldCwgYWdwX3NpemUgLSBvZmZzZXQsCisJCQkgIF9EUk1fQUdQLCAwLCAmIGRldl9wcml2LT5hZ3BfdGV4dHVyZXMgKTsKKwlpZiAoZXJyKSB7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIG1hcCBBR1AgdGV4dHVyZSByZWdpb25cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWRybV9jb3JlX2lvcmVtYXAoZGV2X3ByaXYtPndhcnAsIGRldik7CisJZHJtX2NvcmVfaW9yZW1hcChkZXZfcHJpdi0+cHJpbWFyeSwgZGV2KTsKKwlkcm1fY29yZV9pb3JlbWFwKGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldik7CisKKwlpZiAoIWRldl9wcml2LT53YXJwLT5oYW5kbGUgfHwKKwkgICAgIWRldl9wcml2LT5wcmltYXJ5LT5oYW5kbGUgfHwgIWRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBpb3JlbWFwIGFncCByZWdpb25zISAoJXAsICVwLCAlcClcbiIsCisJCQkgIGRldl9wcml2LT53YXJwLT5oYW5kbGUsIGRldl9wcml2LT5wcmltYXJ5LT5oYW5kbGUsCisJCQkgIGRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSk7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCisJZGV2X3ByaXYtPmRtYV9hY2Nlc3MgPSBNR0FfUEFHUFhGRVI7CisJZGV2X3ByaXYtPndhZ3BfZW5hYmxlID0gTUdBX1dBR1BfRU5BQkxFOworCisJRFJNX0lORk8oIkluaXRpYWxpemVkIGNhcmQgZm9yIEFHUCBETUEuXG4iKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IG1nYV9kb19hZ3BfZG1hX2Jvb3RzdHJhcChkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkJICAgIGRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90ICogZG1hX2JzKQoreworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmCisKKy8qKgorICogQm9vdHN0cmFwIHRoZSBkcml2ZXIgZm9yIFBDSSBETUEuCisgKiAKKyAqIFx0b2RvCisgKiBUaGUgYWxnb3JpdGhtIGZvciBkZWNyZWFzaW5nIHRoZSBzaXplIG9mIHRoZSBwcmltYXJ5IERNQSBidWZmZXIgY291bGQgYmUKKyAqIGJldHRlci4gIFRoZSBzaXplIHNob3VsZCBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IHBhZ2Ugc2l6ZSwgdGhlbgorICogZGVjcmVhc2UgdGhlIHJlcXVlc3Qgc2l6ZSBieSBhIHNpbmdsZSBwYWdlIGVhY2ggcGFzcyB0aHJvdWdoIHRoZSBsb29wLgorICoKKyAqIFx0b2RvCisgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgbWF4aW11bSBhZGRyZXNzIHBhc3NlZCB0byBkcm1fcGNpX2FsbG9jIGlzIGNvcnJlY3QuCisgKiBUaGUgc2FtZSBnb2VzIGZvciBkcm1fYWRkYnVmc19wY2kuCisgKiAKKyAqIFxzYSBtZ2FfZG9fZG1hX2Jvb3RzdHJhcCwgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwCisgKi8KK3N0YXRpYyBpbnQgbWdhX2RvX3BjaV9kbWFfYm9vdHN0cmFwKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkgICAgZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QgKiBkbWFfYnMpCit7CisJZHJtX21nYV9wcml2YXRlX3QgKiBjb25zdCBkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCWNvbnN0IHVuc2lnbmVkIGludCB3YXJwX3NpemUgPSBtZ2Ffd2FycF9taWNyb2NvZGVfc2l6ZShkZXZfcHJpdik7CisJdW5zaWduZWQgaW50IHByaW1hcnlfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgYmluX2NvdW50OworCWludCBlcnI7CisJZHJtX2J1Zl9kZXNjX3QgcmVxOworCisJCisJaWYgKGRldi0+ZG1hID09IE5VTEwpIHsKKwkJRFJNX0VSUk9SKCJkZXYtPmRtYSBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwkvKiBUaGUgcHJvcGVyIGFsaWdubWVudCBpcyAweDEwMCBmb3IgdGhpcyBtYXBwaW5nICovCisJZXJyID0gZHJtX2FkZG1hcChkZXYsIDAsIHdhcnBfc2l6ZSwgX0RSTV9DT05TSVNURU5ULAorCQkJIF9EUk1fUkVBRF9PTkxZLCAmZGV2X3ByaXYtPndhcnApOworCWlmIChlcnIgIT0gMCkgeworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgbWFwcGluZyBmb3IgV0FSUCBtaWNyb2NvZGVcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIE90aGVyIHRoYW4gdGhlIGJvdHRvbSB0d28gYml0cyBiZWluZyB1c2VkIHRvIGVuY29kZSBvdGhlcgorCSAqIGluZm9ybWF0aW9uLCB0aGVyZSBkb24ndCBhcHBlYXIgdG8gYmUgYW55IHJlc3RyaWN0aW9ucyBvbiB0aGUKKwkgKiBhbGlnbm1lbnQgb2YgdGhlIHByaW1hcnkgb3Igc2Vjb25kYXJ5IERNQSBidWZmZXJzLgorCSAqLworCisJZm9yICggcHJpbWFyeV9zaXplID0gZG1hX2JzLT5wcmltYXJ5X3NpemUKKwkgICAgICA7IHByaW1hcnlfc2l6ZSAhPSAwCisJICAgICAgOyBwcmltYXJ5X3NpemUgPj49IDEgKSB7CisJCS8qIFRoZSBwcm9wZXIgYWxpZ25tZW50IGZvciB0aGlzIG1hcHBpbmcgaXMgMHgwNCAqLworCQllcnIgPSBkcm1fYWRkbWFwKGRldiwgMCwgcHJpbWFyeV9zaXplLCBfRFJNX0NPTlNJU1RFTlQsCisJCQkJIF9EUk1fUkVBRF9PTkxZLCAmZGV2X3ByaXYtPnByaW1hcnkpOworCQlpZiAoIWVycikKKwkJCWJyZWFrOworCX0KKworCWlmIChlcnIgIT0gMCkgeworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBhbGxvY2F0ZSBwcmltYXJ5IERNQSByZWdpb25cbiIpOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKworCWlmIChkZXZfcHJpdi0+cHJpbWFyeS0+c2l6ZSAhPSBkbWFfYnMtPnByaW1hcnlfc2l6ZSkgeworCQlEUk1fSU5GTygiUHJpbWFyeSBETUEgYnVmZmVyIHNpemUgcmVkdWNlZCBmcm9tICV1IHRvICV1LlxuIiwKKwkJCSBkbWFfYnMtPnByaW1hcnlfc2l6ZSwgCisJCQkgKHVuc2lnbmVkKSBkZXZfcHJpdi0+cHJpbWFyeS0+c2l6ZSk7CisJCWRtYV9icy0+cHJpbWFyeV9zaXplID0gZGV2X3ByaXYtPnByaW1hcnktPnNpemU7CisJfQorCisJZm9yICggYmluX2NvdW50ID0gZG1hX2JzLT5zZWNvbmRhcnlfYmluX2NvdW50CisJICAgICAgOyBiaW5fY291bnQgPiAwIAorCSAgICAgIDsgYmluX2NvdW50LS0gKSB7CisJCSh2b2lkKSBtZW1zZXQoICZyZXEsIDAsIHNpemVvZihyZXEpICk7CisJCXJlcS5jb3VudCA9IGJpbl9jb3VudDsKKwkJcmVxLnNpemUgPSBkbWFfYnMtPnNlY29uZGFyeV9iaW5fc2l6ZTsKKworCQllcnIgPSBkcm1fYWRkYnVmc19wY2koIGRldiwgJiByZXEgKTsKKwkJaWYgKCFlcnIpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCQorCWlmIChiaW5fY291bnQgPT0gMCkgeworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBhZGQgc2Vjb25kYXJ5IERNQSBidWZmZXJzXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoYmluX2NvdW50ICE9IGRtYV9icy0+c2Vjb25kYXJ5X2Jpbl9jb3VudCkgeworCQlEUk1fSU5GTygiU2Vjb25kYXJ5IFBDSSBETUEgYnVmZmVyIGJpbiBjb3VudCByZWR1Y2VkIGZyb20gJXUgIgorCQkJICJ0byAldS5cbiIsIGRtYV9icy0+c2Vjb25kYXJ5X2Jpbl9jb3VudCwgYmluX2NvdW50KTsKKworCQlkbWFfYnMtPnNlY29uZGFyeV9iaW5fY291bnQgPSBiaW5fY291bnQ7CisJfQorCisJZGV2X3ByaXYtPmRtYV9hY2Nlc3MgPSAwOworCWRldl9wcml2LT53YWdwX2VuYWJsZSA9IDA7CisKKwlkbWFfYnMtPmFncF9tb2RlID0gMDsKKworCURSTV9JTkZPKCJJbml0aWFsaXplZCBjYXJkIGZvciBQQ0kgRE1BLlxuIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBtZ2FfZG9fZG1hX2Jvb3RzdHJhcChkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkJZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QgKiBkbWFfYnMpCit7CisJY29uc3QgaW50IGlzX2FncCA9IChkbWFfYnMtPmFncF9tb2RlICE9IDApICYmIGRybV9kZXZpY2VfaXNfYWdwKGRldik7CisJaW50IGVycjsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqIGNvbnN0IGRldl9wcml2ID0KKwkJKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKworCWRldl9wcml2LT51c2VkX25ld19kbWFfaW5pdCA9IDE7CisKKwkvKiBUaGUgZmlyc3Qgc3RlcHMgYXJlIHRoZSBzYW1lIGZvciBib3RoIFBDSSBhbmQgQUdQIGJhc2VkIERNQS4gIE1hcAorCSAqIHRoZSBjYXJkcyBNTUlPIHJlZ2lzdGVycyBhbmQgbWFwIGEgc3RhdHVzIHBhZ2UuCisJICovCisJZXJyID0gZHJtX2FkZG1hcCggZGV2LCBkZXZfcHJpdi0+bW1pb19iYXNlLCBkZXZfcHJpdi0+bW1pb19zaXplLAorCQkJICBfRFJNX1JFR0lTVEVSUywgX0RSTV9SRUFEX09OTFksICYgZGV2X3ByaXYtPm1taW8gKTsKKwlpZiAoZXJyKSB7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIG1hcCBNTUlPIHJlZ2lvblxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisKKwllcnIgPSBkcm1fYWRkbWFwKCBkZXYsIDAsIFNBUkVBX01BWCwgX0RSTV9TSE0sCisJCQkgIF9EUk1fUkVBRF9PTkxZIHwgX0RSTV9MT0NLRUQgfCBfRFJNX0tFUk5FTCwKKwkJCSAgJiBkZXZfcHJpdi0+c3RhdHVzICk7CisJaWYgKGVycikgeworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBtYXAgc3RhdHVzIHJlZ2lvblxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisKKwkvKiBUaGUgRE1BIGluaXRpYWxpemF0aW9uIHByb2NlZHVyZSBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZm9yIFBDSSBhbmQKKwkgKiBBR1AgY2FyZHMuICBBR1AgY2FyZHMganVzdCBhbGxvY2F0ZSBhIGxhcmdlIGJsb2NrIG9mIEFHUCBtZW1vcnkgYW5kCisJICogY2FydmUgb2ZmIHBvcnRpb25zIG9mIGl0IGZvciBpbnRlcm5hbCB1c2VzLiAgVGhlIHJlbWFpbmluZyBtZW1vcnkKKwkgKiBpcyByZXR1cm5lZCB0byB1c2VyLW1vZGUgdG8gYmUgdXNlZCBmb3IgQUdQIHRleHR1cmVzLgorCSAqLworCWlmIChpc19hZ3ApIHsKKwkJZXJyID0gbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKGRldiwgZG1hX2JzKTsKKwl9CisJCisJLyogSWYgd2UgYXR0ZW1wdGVkIHRvIGluaXRpYWxpemUgdGhlIGNhcmQgZm9yIEFHUCBETUEgYnV0IGZhaWxlZCwKKwkgKiBjbGVhbi11cCBhbnkgbWVzcyB0aGF0IG1heSBoYXZlIGJlZW4gY3JlYXRlZC4KKwkgKi8KKworCWlmIChlcnIpIHsKKwkJbWdhX2RvX2NsZWFudXBfZG1hKGRldik7CisJfQorCisKKwkvKiBOb3Qgb25seSBkbyB3ZSB3YW50IHRvIHRyeSBhbmQgaW5pdGlhbGl6ZWQgUENJIGNhcmRzIGZvciBQQ0kgRE1BLAorCSAqIGJ1dCB3ZSBhbHNvIHRyeSB0byBpbml0aWFsaXplZCBBR1AgY2FyZHMgdGhhdCBjb3VsZCBub3QgYmUKKwkgKiBpbml0aWFsaXplZCBmb3IgQUdQIERNQS4gIFRoaXMgY292ZXJzIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgYW4gQUdQCisJICogY2FyZCBpbiBhIHN5c3RlbSB3aXRoIGFuIHVuc3VwcG9ydGVkIEFHUCBjaGlwc2V0LiAgSW4gdGhhdCBjYXNlIHRoZQorCSAqIGNhcmQgd2lsbCBiZSBkZXRlY3RlZCBhcyBBR1AsIGJ1dCB3ZSB3b24ndCBiZSBhYmxlIHRvIGFsbG9jYXRlIGFueQorCSAqIEFHUCBtZW1vcnksIGV0Yy4KKwkgKi8KKworCWlmICghaXNfYWdwIHx8IGVycikgeworCQllcnIgPSBtZ2FfZG9fcGNpX2RtYV9ib290c3RyYXAoZGV2LCBkbWFfYnMpOworCX0KKworCisJcmV0dXJuIGVycjsKK30KKworaW50IG1nYV9kbWFfYm9vdHN0cmFwKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QgYm9vdHN0cmFwOworCWludCBlcnI7CisKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChib290c3RyYXAsCisJCQkJIChkcm1fbWdhX2RtYV9ib290c3RyYXBfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGJvb3RzdHJhcCkpOworCisJZXJyID0gbWdhX2RvX2RtYV9ib290c3RyYXAoZGV2LCAmIGJvb3RzdHJhcCk7CisJaWYgKCEgZXJyKSB7CisJCXN0YXRpYyBjb25zdCBpbnQgbW9kZXNbXSA9IHsgMCwgMSwgMiwgMiwgNCwgNCwgNCwgNCB9OworCQljb25zdCBkcm1fbWdhX3ByaXZhdGVfdCAqIGNvbnN0IGRldl9wcml2ID0gCisJCQkoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKworCQlpZiAoZGV2X3ByaXYtPmFncF90ZXh0dXJlcyAhPSBOVUxMKSB7CisJCQlib290c3RyYXAudGV4dHVyZV9oYW5kbGUgPSBkZXZfcHJpdi0+YWdwX3RleHR1cmVzLT5vZmZzZXQ7CisJCQlib290c3RyYXAudGV4dHVyZV9zaXplID0gZGV2X3ByaXYtPmFncF90ZXh0dXJlcy0+c2l6ZTsKKwkJfQorCQllbHNlIHsKKwkJCWJvb3RzdHJhcC50ZXh0dXJlX2hhbmRsZSA9IDA7CisJCQlib290c3RyYXAudGV4dHVyZV9zaXplID0gMDsKKwkJfQorCisJCWJvb3RzdHJhcC5hZ3BfbW9kZSA9IG1vZGVzWyBib290c3RyYXAuYWdwX21vZGUgJiAweDA3IF07CisJCWlmIChEUk1fQ09QWV9UT19VU0VSKCAodm9pZCBfX3VzZXIgKikgZGF0YSwgJiBib290c3RyYXAsCisJCQkJICAgICBzaXplb2YoYm9vdHN0cmFwKSkpIHsKKwkJCWVyciA9IERSTV9FUlIoRUZBVUxUKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJbWdhX2RvX2NsZWFudXBfZG1hKGRldik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBtZ2FfZG9faW5pdF9kbWEoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbWdhX2luaXRfdCAqaW5pdCApCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2OwogCWludCByZXQ7CiAJRFJNX0RFQlVHKCAiXG4iICk7CiAKLQlkZXZfcHJpdiA9IGRybV9hbGxvYyggc2l6ZW9mKGRybV9tZ2FfcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIgKTsKLQlpZiAoICFkZXZfcHJpdiApCi0JCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CiAKLQltZW1zZXQoIGRldl9wcml2LCAwLCBzaXplb2YoZHJtX21nYV9wcml2YXRlX3QpICk7CisJZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JZGV2X3ByaXYtPmNoaXBzZXQgPSBpbml0LT5jaGlwc2V0OwotCi0JZGV2X3ByaXYtPnVzZWNfdGltZW91dCA9IE1HQV9ERUZBVUxUX1VTRUNfVElNRU9VVDsKLQotCWlmICggaW5pdC0+c2dyYW0gKSB7CisJaWYgKGluaXQtPnNncmFtKSB7CiAJCWRldl9wcml2LT5jbGVhcl9jbWQgPSBNR0FfRFdHQ1RMX0NMRUFSIHwgTUdBX0FUWVBFX0JMSzsKIAl9IGVsc2UgewogCQlkZXZfcHJpdi0+Y2xlYXJfY21kID0gTUdBX0RXR0NUTF9DTEVBUiB8IE1HQV9BVFlQRV9SU1RSOwpAQCAtNDM2LDg4ICs4MDYsNjYgQEAKIAogCURSTV9HRVRTQVJFQSgpOwogCi0JaWYoIWRldl9wcml2LT5zYXJlYSkgewotCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gZmluZCBzYXJlYSFcbiIgKTsKLQkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLwotCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKLQkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwlpZiAoIWRldl9wcml2LT5zYXJlYSkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBmaW5kIHNhcmVhIVxuIik7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCi0JZGV2X3ByaXYtPm1taW8gPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pb19vZmZzZXQpOwotCWlmKCFkZXZfcHJpdi0+bW1pbykgewotCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gZmluZCBtbWlvIHJlZ2lvbiFcbiIgKTsKLQkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLwotCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKLQkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKLQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKLQl9Ci0JZGV2X3ByaXYtPnN0YXR1cyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5zdGF0dXNfb2Zmc2V0KTsKLQlpZighZGV2X3ByaXYtPnN0YXR1cykgewotCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gZmluZCBzdGF0dXMgcGFnZSFcbiIgKTsKLQkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLwotCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKLQkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKLQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKLQl9Ci0JZGV2X3ByaXYtPndhcnAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+d2FycF9vZmZzZXQpOwotCWlmKCFkZXZfcHJpdi0+d2FycCkgewotCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gZmluZCB3YXJwIG1pY3JvY29kZSByZWdpb24hXG4iICk7Ci0JCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KLQkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7Ci0JCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7Ci0JCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Ci0JfQotCWRldl9wcml2LT5wcmltYXJ5ID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPnByaW1hcnlfb2Zmc2V0KTsKLQlpZighZGV2X3ByaXYtPnByaW1hcnkpIHsKLQkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGZpbmQgcHJpbWFyeSBkbWEgcmVnaW9uIVxuIiApOwotCQkvKiBBc3NpZ24gZGV2X3ByaXZhdGUgc28gd2UgY2FuIGRvIGNsZWFudXAuICovCi0JCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwotCQltZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOwotCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwotCX0KLQlkZXYtPmFncF9idWZmZXJfbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KTsKLQlpZighZGV2LT5hZ3BfYnVmZmVyX21hcCkgewotCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gZmluZCBkbWEgYnVmZmVyIHJlZ2lvbiFcbiIgKTsKLQkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLwotCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKLQkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKLQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwlpZiAoISBkZXZfcHJpdi0+dXNlZF9uZXdfZG1hX2luaXQpIHsKKwkJZGV2X3ByaXYtPnN0YXR1cyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5zdGF0dXNfb2Zmc2V0KTsKKwkJaWYgKCFkZXZfcHJpdi0+c3RhdHVzKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBmaW5kIHN0YXR1cyBwYWdlIVxuIik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJCWRldl9wcml2LT5tbWlvID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPm1taW9fb2Zmc2V0KTsKKwkJaWYgKCFkZXZfcHJpdi0+bW1pbykgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZmluZCBtbWlvIHJlZ2lvbiFcbiIpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQlkZXZfcHJpdi0+d2FycCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT53YXJwX29mZnNldCk7CisJCWlmICghZGV2X3ByaXYtPndhcnApIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGZpbmQgd2FycCBtaWNyb2NvZGUgcmVnaW9uIVxuIik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJCWRldl9wcml2LT5wcmltYXJ5ID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPnByaW1hcnlfb2Zmc2V0KTsKKwkJaWYgKCFkZXZfcHJpdi0+cHJpbWFyeSkgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZmluZCBwcmltYXJ5IGRtYSByZWdpb24hXG4iKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwkJZGV2LT5hZ3BfYnVmZmVyX3Rva2VuID0gaW5pdC0+YnVmZmVyc19vZmZzZXQ7CisJCWRldi0+YWdwX2J1ZmZlcl9tYXAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+YnVmZmVyc19vZmZzZXQpOworCQlpZiAoIWRldi0+YWdwX2J1ZmZlcl9tYXApIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGZpbmQgZG1hIGJ1ZmZlciByZWdpb24hXG4iKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKworCQlkcm1fY29yZV9pb3JlbWFwKGRldl9wcml2LT53YXJwLCBkZXYpOworCQlkcm1fY29yZV9pb3JlbWFwKGRldl9wcml2LT5wcmltYXJ5LCBkZXYpOworCQlkcm1fY29yZV9pb3JlbWFwKGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldik7CiAJfQogCiAJZGV2X3ByaXYtPnNhcmVhX3ByaXYgPQogCQkoZHJtX21nYV9zYXJlYV90ICopKCh1OCAqKWRldl9wcml2LT5zYXJlYS0+aGFuZGxlICsKIAkJCQkgICAgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOwogCi0JZHJtX2NvcmVfaW9yZW1hcCggZGV2X3ByaXYtPndhcnAsIGRldiApOwotCWRybV9jb3JlX2lvcmVtYXAoIGRldl9wcml2LT5wcmltYXJ5LCBkZXYgKTsKLQlkcm1fY29yZV9pb3JlbWFwKCBkZXYtPmFncF9idWZmZXJfbWFwLCBkZXYgKTsKLQotCWlmKCFkZXZfcHJpdi0+d2FycC0+aGFuZGxlIHx8Ci0JICAgIWRldl9wcml2LT5wcmltYXJ5LT5oYW5kbGUgfHwKLQkgICAhZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICkgewotCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gaW9yZW1hcCBhZ3AgcmVnaW9ucyFcbiIgKTsKLQkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLwotCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKLQkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwlpZiAoIWRldl9wcml2LT53YXJwLT5oYW5kbGUgfHwKKwkgICAgIWRldl9wcml2LT5wcmltYXJ5LT5oYW5kbGUgfHwKKwkgICAgKChkZXZfcHJpdi0+ZG1hX2FjY2VzcyAhPSAwKSAmJgorCSAgICAgKChkZXYtPmFncF9idWZmZXJfbWFwID09IE5VTEwpIHx8CisJICAgICAgKGRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSA9PSBOVUxMKSkpKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGlvcmVtYXAgYWdwIHJlZ2lvbnMhXG4iKTsKIAkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKIAl9CiAKLQlyZXQgPSBtZ2Ffd2FycF9pbnN0YWxsX21pY3JvY29kZSggZGV2X3ByaXYgKTsKLQlpZiAoIHJldCA8IDAgKSB7Ci0JCURSTV9FUlJPUiggImZhaWxlZCB0byBpbnN0YWxsIFdBUlAgdWNvZGUhXG4iICk7Ci0JCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KLQkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7Ci0JCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJcmV0ID0gbWdhX3dhcnBfaW5zdGFsbF9taWNyb2NvZGUoZGV2X3ByaXYpOworCWlmIChyZXQgPCAwKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGluc3RhbGwgV0FSUCB1Y29kZSFcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IG1nYV93YXJwX2luaXQoIGRldl9wcml2ICk7Ci0JaWYgKCByZXQgPCAwICkgewotCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gaW5pdCBXQVJQIGVuZ2luZSFcbiIgKTsKLQkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLwotCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKLQkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwlyZXQgPSBtZ2Ffd2FycF9pbml0KGRldl9wcml2KTsKKwlpZiAocmV0IDwgMCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0IFdBUlAgZW5naW5lIVxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC01NTcsMjIgKzkwNSwxOCBAQAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lLmhlYWQgPSAwOwogCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lLndyYXAgPSAwOwogCi0JaWYgKCBtZ2FfZnJlZWxpc3RfaW5pdCggZGV2LCBkZXZfcHJpdiApIDwgMCApIHsKLQkJRFJNX0VSUk9SKCAiY291bGQgbm90IGluaXRpYWxpemUgZnJlZWxpc3RcbiIgKTsKLQkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLwotCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKLQkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwlpZiAobWdhX2ZyZWVsaXN0X2luaXQoZGV2LCBkZXZfcHJpdikgPCAwKSB7CisJCURSTV9FUlJPUigiY291bGQgbm90IGluaXRpYWxpemUgZnJlZWxpc3RcbiIpOwogCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOwogCX0KIAotCS8qIE1ha2UgZGV2X3ByaXZhdGUgdmlzYWJsZSB0byBvdGhlcnMuICovCi0JZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbWdhX2RvX2NsZWFudXBfZG1hKCBkcm1fZGV2aWNlX3QgKmRldiApCiB7Ci0JRFJNX0RFQlVHKCAiXG4iICk7CisJaW50IGVyciA9IDA7CisJRFJNX0RFQlVHKCJcbiIpOwogCiAJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCiAJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQpAQCAtNTgzLDM3ICs5MjcsNzMgQEAKIAlpZiAoIGRldi0+ZGV2X3ByaXZhdGUgKSB7CiAJCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQkJaWYgKCBkZXZfcHJpdi0+d2FycCAhPSBOVUxMICkKLQkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCBkZXZfcHJpdi0+d2FycCwgZGV2ICk7Ci0JCWlmICggZGV2X3ByaXYtPnByaW1hcnkgIT0gTlVMTCApCi0JCQlkcm1fY29yZV9pb3JlbWFwZnJlZSggZGV2X3ByaXYtPnByaW1hcnksIGRldiApOwotCQlpZiAoIGRldi0+YWdwX2J1ZmZlcl9tYXAgIT0gTlVMTCApCi0JCQlkcm1fY29yZV9pb3JlbWFwZnJlZSggZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2ICk7CisJCWlmICgoZGV2X3ByaXYtPndhcnAgIT0gTlVMTCkgCisJCSAgICAmJiAoZGV2X3ByaXYtPm1taW8tPnR5cGUgIT0gX0RSTV9DT05TSVNURU5UKSkKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKGRldl9wcml2LT53YXJwLCBkZXYpOwogCi0JCWlmICggZGV2X3ByaXYtPmhlYWQgIT0gTlVMTCApIHsKLQkJCW1nYV9mcmVlbGlzdF9jbGVhbnVwKCBkZXYgKTsKKwkJaWYgKChkZXZfcHJpdi0+cHJpbWFyeSAhPSBOVUxMKSAKKwkJICAgICYmIChkZXZfcHJpdi0+cHJpbWFyeS0+dHlwZSAhPSBfRFJNX0NPTlNJU1RFTlQpKQorCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoZGV2X3ByaXYtPnByaW1hcnksIGRldik7CisKKwkJaWYgKGRldi0+YWdwX2J1ZmZlcl9tYXAgIT0gTlVMTCkKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldik7CisKKwkJaWYgKGRldl9wcml2LT51c2VkX25ld19kbWFfaW5pdCkgeworI2lmIF9fT1NfSEFTX0FHUAorCQkJaWYgKGRldl9wcml2LT5hZ3BfbWVtICE9IE5VTEwpIHsKKwkJCQlkZXZfcHJpdi0+YWdwX3RleHR1cmVzID0gTlVMTDsKKwkJCQlkcm1fdW5iaW5kX2FncChkZXZfcHJpdi0+YWdwX21lbSk7CisKKwkJCQlkcm1fZnJlZV9hZ3AoZGV2X3ByaXYtPmFncF9tZW0sIGRldl9wcml2LT5hZ3BfcGFnZXMpOworCQkJCWRldl9wcml2LT5hZ3BfcGFnZXMgPSAwOworCQkJCWRldl9wcml2LT5hZ3BfbWVtID0gTlVMTDsKKwkJCX0KKworCQkJaWYgKChkZXYtPmFncCAhPSBOVUxMKSAmJiBkZXYtPmFncC0+YWNxdWlyZWQpIHsKKwkJCQllcnIgPSBkcm1fYWdwX3JlbGVhc2UoZGV2KTsKKwkJCX0KKyNlbmRpZgorCQkJZGV2X3ByaXYtPnVzZWRfbmV3X2RtYV9pbml0ID0gMDsKIAkJfQogCi0JCWRybV9mcmVlKCBkZXYtPmRldl9wcml2YXRlLCBzaXplb2YoZHJtX21nYV9wcml2YXRlX3QpLAotCQkJICAgRFJNX01FTV9EUklWRVIgKTsKLQkJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisJCWRldl9wcml2LT53YXJwID0gTlVMTDsKKwkJZGV2X3ByaXYtPnByaW1hcnkgPSBOVUxMOworCQlkZXZfcHJpdi0+bW1pbyA9IE5VTEw7CisJCWRldl9wcml2LT5zdGF0dXMgPSBOVUxMOworCQlkZXZfcHJpdi0+c2FyZWEgPSBOVUxMOworCQlkZXZfcHJpdi0+c2FyZWFfcHJpdiA9IE5VTEw7CisJCWRldi0+YWdwX2J1ZmZlcl9tYXAgPSBOVUxMOworCisJCW1lbXNldCgmZGV2X3ByaXYtPnByaW0sIDAsIHNpemVvZihkZXZfcHJpdi0+cHJpbSkpOworCQlkZXZfcHJpdi0+d2FycF9waXBlID0gMDsKKwkJbWVtc2V0KGRldl9wcml2LT53YXJwX3BpcGVfcGh5cywgMCwgc2l6ZW9mKGRldl9wcml2LT53YXJwX3BpcGVfcGh5cykpOworCisJCWlmIChkZXZfcHJpdi0+aGVhZCAhPSBOVUxMKSB7CisJCQltZ2FfZnJlZWxpc3RfY2xlYW51cChkZXYpOworCQl9CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IG1nYV9kbWFfaW5pdCggRFJNX0lPQ1RMX0FSR1MgKQogewogCURSTV9ERVZJQ0U7CiAJZHJtX21nYV9pbml0X3QgaW5pdDsKKwlpbnQgZXJyOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKIAotCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggaW5pdCwgKGRybV9tZ2FfaW5pdF90IF9fdXNlciAqKWRhdGEsIHNpemVvZihpbml0KSApOworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChpbml0LCAoZHJtX21nYV9pbml0X3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihpbml0KSk7CiAKIAlzd2l0Y2ggKCBpbml0LmZ1bmMgKSB7CiAJY2FzZSBNR0FfSU5JVF9ETUE6Ci0JCXJldHVybiBtZ2FfZG9faW5pdF9kbWEoIGRldiwgJmluaXQgKTsKKwkJZXJyID0gbWdhX2RvX2luaXRfZG1hKGRldiwgJmluaXQpOworCQlpZiAoZXJyKSB7CisJCQkodm9pZCkgbWdhX2RvX2NsZWFudXBfZG1hKGRldik7CisJCX0KKwkJcmV0dXJuIGVycjsKIAljYXNlIE1HQV9DTEVBTlVQX0RNQToKIAkJcmV0dXJuIG1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CiAJfQpAQCAtNzQyLDcgKzExMjIsMjEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIG1nYV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpCisvKioKKyAqIENhbGxlZCBqdXN0IGJlZm9yZSB0aGUgbW9kdWxlIGlzIHVubG9hZGVkLgorICovCitpbnQgbWdhX2RyaXZlcl9wb3N0Y2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2ZyZWUoZGV2LT5kZXZfcHJpdmF0ZSwgc2l6ZW9mKGRybV9tZ2FfcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIpOworCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ2FsbGVkIHdoZW4gdGhlIGxhc3Qgb3BlbmVyIG9mIHRoZSBkZXZpY2UgaXMgY2xvc2VkLgorICovCit2b2lkIG1nYV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KQogewogCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oCmluZGV4IDUyMWQ0NDUuLmQyMGFhYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oCkBAIC03Myw3ICs3Myw4IEBACiAKICNkZWZpbmUgTUdBX0NBUkRfVFlQRV9HMjAwCTEKICNkZWZpbmUgTUdBX0NBUkRfVFlQRV9HNDAwCTIKLQorI2RlZmluZSBNR0FfQ0FSRF9UWVBFX0c0NTAJMyAgICAgICAvKiBub3QgY3VycmVudGx5IHVzZWQgKi8KKyNkZWZpbmUgTUdBX0NBUkRfVFlQRV9HNTUwCTQKIAogI2RlZmluZSBNR0FfRlJPTlQJCTB4MQogI2RlZmluZSBNR0FfQkFDSwkJMHgyCkBAIC0yMjUsMTAgKzIyNiw2IEBACiB9IGRybV9tZ2Ffc2FyZWFfdDsKIAogCi0vKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQotICogZGVmaW5lcyBpbiB0aGUgWHNlcnZlciBmaWxlICh4Zjg2ZHJtTWdhLmgpCi0gKi8KLQogLyogTUdBIHNwZWNpZmljIGlvY3RscwogICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCiAgKi8KQEAgLTI0Myw2ICsyNDAsMTQgQEAKICNkZWZpbmUgRFJNX01HQV9CTElUICAgICAweDA4CiAjZGVmaW5lIERSTV9NR0FfR0VUUEFSQU0gMHgwOQogCisvKiAzLjI6CisgKiBpb2N0bHMgZm9yIG9wZXJhdGluZyBvbiBmZW5jZXMuCisgKi8KKyNkZWZpbmUgRFJNX01HQV9TRVRfRkVOQ0UgICAgICAweDBhCisjZGVmaW5lIERSTV9NR0FfV0FJVF9GRU5DRSAgICAgMHgwYgorI2RlZmluZSBEUk1fTUdBX0RNQV9CT09UU1RSQVAgIDB4MGMKKworCiAjZGVmaW5lIERSTV9JT0NUTF9NR0FfSU5JVCAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfSU5JVCwgZHJtX21nYV9pbml0X3QpCiAjZGVmaW5lIERSTV9JT0NUTF9NR0FfRkxVU0ggICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfRkxVU0gsIGRybV9sb2NrX3QpCiAjZGVmaW5lIERSTV9JT0NUTF9NR0FfUkVTRVQgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfUkVTRVQpCkBAIC0yNTMsNiArMjU4LDkgQEAKICNkZWZpbmUgRFJNX0lPQ1RMX01HQV9JTE9BRCAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9JTE9BRCwgZHJtX21nYV9pbG9hZF90KQogI2RlZmluZSBEUk1fSU9DVExfTUdBX0JMSVQgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0JMSVQsIGRybV9tZ2FfYmxpdF90KQogI2RlZmluZSBEUk1fSU9DVExfTUdBX0dFVFBBUkFNIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0dFVFBBUkFNLCBkcm1fbWdhX2dldHBhcmFtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfU0VUX0ZFTkNFICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9TRVRfRkVOQ0UsIHVpbnQzMl90KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX1dBSVRfRkVOQ0UgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfV0FJVF9GRU5DRSwgdWludDMyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfRE1BX0JPT1RTVFJBUCBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9ETUFfQk9PVFNUUkFQLCBkcm1fbWdhX2RtYV9ib290c3RyYXBfdCkKIAogdHlwZWRlZiBzdHJ1Y3QgX2RybV9tZ2Ffd2FycF9pbmRleCB7CiAgICAJaW50IGluc3RhbGxlZDsKQEAgLTI5MSwxMiArMjk5LDcyIEBACiAJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKIH0gZHJtX21nYV9pbml0X3Q7CiAKLXR5cGVkZWYgc3RydWN0IGRybV9tZ2FfZnVsbHNjcmVlbiB7Ci0JZW51bSB7Ci0JCU1HQV9JTklUX0ZVTExTQ1JFRU4gICAgPSAweDAxLAotCQlNR0FfQ0xFQU5VUF9GVUxMU0NSRUVOID0gMHgwMgotCX0gZnVuYzsKLX0gZHJtX21nYV9mdWxsc2NyZWVuX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2RtYV9ib290c3RyYXAgeworCS8qKgorCSAqIFxuYW1lIEFHUCB0ZXh0dXJlIHJlZ2lvbgorCSAqIAorCSAqIE9uIHJldHVybiBmcm9tIHRoZSBEUk1fTUdBX0RNQV9CT09UU1RSQVAgaW9jdGwsIHRoZXNlIGZpZWxkcyB3aWxsCisJICogYmUgZmlsbGVkIGluIHdpdGggdGhlIGFjdHVhbCBBR1AgdGV4dHVyZSBzZXR0aW5ncy4KKwkgKiAKKwkgKiBcd2FybmluZworCSAqIElmIHRoZXNlIGZpZWxkcyBhcmUgbm9uLXplcm8sIGJ1dCBkbWFfbWdhX2RtYV9ib290c3RyYXA6OmFncF9tb2RlCisJICogaXMgemVybywgaXQgbWVhbnMgdGhhdCBQQ0kgbWVtb3J5IChtb3N0IGxpa2VseSB0aHJvdWdoIHRoZSB1c2Ugb2YKKwkgKiBhbiBJT01NVSkgaXMgYmVpbmcgdXNlZCBmb3IgIkFHUCIgdGV4dHVyZXMuCisJICovCisJLypAeyovCisJdW5zaWduZWQgbG9uZyB0ZXh0dXJlX2hhbmRsZTsgLyoqPCBIYW5kbGUgdXNlZCB0byBtYXAgQUdQIHRleHR1cmVzLiAqLworCXVpbnQzMl90ICAgICB0ZXh0dXJlX3NpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgQUdQIHRleHR1cmUgcmVnaW9uLiAqLworCS8qQH0qLworCisKKwkvKioKKwkgKiBSZXF1ZXN0ZWQgc2l6ZSBvZiB0aGUgcHJpbWFyeSBETUEgcmVnaW9uLgorCSAqIAorCSAqIE9uIHJldHVybiBmcm9tIHRoZSBEUk1fTUdBX0RNQV9CT09UU1RSQVAgaW9jdGwsIHRoaXMgZmllbGQgd2lsbCBiZQorCSAqIGZpbGxlZCBpbiB3aXRoIHRoZSBhY3R1YWwgQUdQIG1vZGUuICBJZiBBR1Agd2FzIG5vdCBhdmFpbGFibGUKKwkgKi8KKwl1aW50MzJfdCBwcmltYXJ5X3NpemU7CisKKworCS8qKgorCSAqIFJlcXVlc3RlZCBudW1iZXIgb2Ygc2Vjb25kYXJ5IERNQSBidWZmZXJzLgorCSAqIAorCSAqIE9uIHJldHVybiBmcm9tIHRoZSBEUk1fTUdBX0RNQV9CT09UU1RSQVAgaW9jdGwsIHRoaXMgZmllbGQgd2lsbCBiZQorCSAqIGZpbGxlZCBpbiB3aXRoIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHNlY29uZGFyeSBETUEgYnVmZmVycworCSAqIGFsbG9jYXRlZC4gIFBhcnRpY3VsYXJseSB3aGVuIFBDSSBETUEgaXMgdXNlZCwgdGhpcyBtYXkgYmUKKwkgKiAoc3VidGFudGlhbGx5KSBsZXNzIHRoYW4gdGhlIG51bWJlciByZXF1ZXN0ZWQuCisJICovCisJdWludDMyX3Qgc2Vjb25kYXJ5X2Jpbl9jb3VudDsKKwkKKwkKKwkvKioKKwkgKiBSZXF1ZXN0ZWQgc2l6ZSBvZiBlYWNoIHNlY29uZGFyeSBETUEgYnVmZmVyLgorCSAqIAorCSAqIFdoaWxlIHRoZSBrZXJuZWwgXGIgaXMgZnJlZSB0byByZWR1Y2UKKwkgKiBkbWFfbWdhX2RtYV9ib290c3RyYXA6OnNlY29uZGFyeV9iaW5fY291bnQsIGl0IGlzIFxiIG5vdCBhbGxvd2VkCisJICogdG8gcmVkdWNlIGRtYV9tZ2FfZG1hX2Jvb3RzdHJhcDo6c2Vjb25kYXJ5X2Jpbl9zaXplLgorCSAqLworCXVpbnQzMl90IHNlY29uZGFyeV9iaW5fc2l6ZTsKKworCisJLyoqCisJICogQml0LXdpc2UgbWFzayBvZiBBR1BTVEFUMl8qIHZhbHVlcy4gIEN1cnJlbnRseSBvbmx5IFxjIEFHUFNUQVQyXzFYLAorCSAqIFxjIEFHUFNUQVQyXzJYLCBhbmQgXGMgQUdQU1RBVDJfNFggYXJlIHN1cHBvcnRlZC4gIElmIHRoaXMgdmFsdWUgaXMKKwkgKiB6ZXJvLCBpdCBtZWFucyB0aGF0IFBDSSBETUEgc2hvdWxkIGJlIHVzZWQsIGV2ZW4gaWYgQUdQIGlzCisJICogcG9zc2libGUuCisJICogCisJICogT24gcmV0dXJuIGZyb20gdGhlIERSTV9NR0FfRE1BX0JPT1RTVFJBUCBpb2N0bCwgdGhpcyBmaWVsZCB3aWxsIGJlCisJICogZmlsbGVkIGluIHdpdGggdGhlIGFjdHVhbCBBR1AgbW9kZS4gIElmIEFHUCB3YXMgbm90IGF2YWlsYWJsZQorCSAqIChpLmUuLCBQQ0kgRE1BIHdhcyB1c2VkKSwgdGhpcyB2YWx1ZSB3aWxsIGJlIHplcm8uCisJICovCisJdWludDMyX3QgYWdwX21vZGU7CisKKworCS8qKgorCSAqIERlc2lyZWQgQUdQIEdBUlQgc2l6ZSwgbWVhc3VyZWQgaW4gbWVnYWJ5dGVzLgorCSAqLworCXVpbnQ4X3QgYWdwX3NpemU7Cit9IGRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90OwogCiB0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2NsZWFyIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CkBAIC0zNDEsNiArNDA5LDE0IEBACiAgKi8KICNkZWZpbmUgTUdBX1BBUkFNX0lSUV9OUiAgICAgICAgICAgIDEKIAorLyogMy4yOiBRdWVyeSB0aGUgYWN0dWFsIGNhcmQgdHlwZS4gIFRoZSBERFggb25seSBkaXN0aW5ndWlzaGVzIGJldHdlZW4KKyAqIEcyMDAgY2hpcHMgYW5kIG5vbi1HMjAwIGNoaXBzLCB3aGljaCBpdCBjYWxscyBHNDAwLiAgSXQgdHVybnMgb3V0IHRoYXQKKyAqIHRoZXJlIGFyZSBzb21lIHZlcnkgc3VibHRlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIEc0eDAgY2hpcHMgYW5kIHRoZSBHNTUwCisgKiBjaGlwcy4gIFVzaW5nIHRoaXMgcGFyYW1ldGVyIHF1ZXJ5LCBhIGNsaWVudC1zaWRlIGRyaXZlciBjYW4gZGV0ZWN0IHRoZQorICogZGlmZmVyZW5jZSBiZXR3ZWVuIGEgRzR4MCBhbmQgYSBHNTUwLgorICovCisjZGVmaW5lIE1HQV9QQVJBTV9DQVJEX1RZUEUgICAgICAgICAyCisKIHR5cGVkZWYgc3RydWN0IGRybV9tZ2FfZ2V0cGFyYW0gewogCWludCBwYXJhbTsKIAl2b2lkIF9fdXNlciAqdmFsdWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCmluZGV4IDg0NGNjYTkuLmRhYWJiYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCkBAIC0zOCw4ICszOCwxNSBAQAogICAKICNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCiAKK3N0YXRpYyBpbnQgbWdhX2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldik7CiBzdGF0aWMgaW50IHBvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICkKIHsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqIGNvbnN0IGRldl9wcml2ID0KKwkJKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwlkZXZfcHJpdi0+bW1pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSk7CisJZGV2X3ByaXYtPm1taW9fc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKTsKKwogCWRldi0+Y291bnRlcnMgKz0gMzsKIAlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKIAlkZXYtPnR5cGVzWzddID0gX0RSTV9TVEFUX1BSSU1BUlk7CkBAIC03OSw4ICs4NiwxMSBAQAogCiBzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0gewogCS5kcml2ZXJfZmVhdHVyZXMgPSBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9SRVFVSVJFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8IERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9JUlFfU0hBUkVEIHwgRFJJVkVSX0lSUV9WQkwsCisJLnByZWluaXQgPSBtZ2FfZHJpdmVyX3ByZWluaXQsCisJLnBvc3RjbGVhbnVwID0gbWdhX2RyaXZlcl9wb3N0Y2xlYW51cCwKIAkucHJldGFrZWRvd24gPSBtZ2FfZHJpdmVyX3ByZXRha2Vkb3duLAogCS5kbWFfcXVpZXNjZW50ID0gbWdhX2RyaXZlcl9kbWFfcXVpZXNjZW50LAorCS5kZXZpY2VfaXNfYWdwID0gbWdhX2RyaXZlcl9kZXZpY2VfaXNfYWdwLAogCS52Ymxhbmtfd2FpdCA9IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQsCiAJLmlycV9wcmVpbnN0YWxsID0gbWdhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCwKIAkuaXJxX3Bvc3RpbnN0YWxsID0gbWdhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwsCkBAIC0xMjgsMyArMTM4LDM4IEBACiBNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CiBNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOworCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgZGV2aWNlIHJlYWxseSBpcyBBR1Agb3Igbm90LgorICoKKyAqIEluIGFkZGl0aW9uIHRvIHRoZSB1c3VhbCB0ZXN0cyBwZXJmb3JtZWQgYnkgXGMgZHJtX2RldmljZV9pc19hZ3AsIHRoaXMKKyAqIGZ1bmN0aW9uIGRldGVjdHMgUENJIEc0NTAgY2FyZHMgdGhhdCBhcHBlYXIgdG8gdGhlIHN5c3RlbSBleGFjdGx5IGxpa2UKKyAqIEFHUCBHNDUwIGNhcmRzLgorICoKKyAqIFxwYXJhbSBkZXYgICBUaGUgZGV2aWNlIHRvIGJlIHRlc3RlZC4KKyAqCisgKiBccmV0dXJucworICogSWYgdGhlIGRldmljZSBpcyBhIFBDSSBHNDUwLCB6ZXJvIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlIDIgaXMgcmV0dXJuZWQuCisgKi8KK2ludCBtZ2FfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KQoreworCWNvbnN0IHN0cnVjdCBwY2lfZGV2ICogY29uc3QgcGRldiA9IGRldi0+cGRldjsKKworCisJLyogVGhlcmUgYXJlIFBDSSB2ZXJzaW9ucyBvZiB0aGUgRzQ1MC4gIFRoZXNlIGNhcmRzIGhhdmUgdGhlCisJICogc2FtZSBQQ0kgSUQgYXMgdGhlIEFHUCBHNDUwLCBidXQgaGF2ZSBhbiBhZGRpdGlvbmFsIFBDSS10by1QQ0kKKwkgKiBicmlkZ2UgY2hpcC4gIFdlIGRldGVjdCB0aGVzZSBjYXJkcywgd2hpY2ggYXJlIG5vdCBjdXJyZW50bHkKKwkgKiBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIsIGJ5IGxvb2tpbmcgYXQgdGhlIGRldmljZSBJRCBvZiB0aGUKKwkgKiBidXMgdGhlICJjYXJkIiBpcyBvbi4gIElmIHZlbmRvciBpcyAweDMzODggKEhpbnQgQ29ycCkgYW5kIHRoZQorCSAqIGRldmljZSBpcyAweDAwMjEgKEhCNiBVbml2ZXJzYWwgUENJLVBDSSBicmlkZ2UpLCB3ZSByZWplY3QgdGhlCisJICogZGV2aWNlLgorCSAqLworCQorCWlmICggKHBkZXYtPmRldmljZSA9PSAweDA1MjUpCisJICAgICAmJiAocGRldi0+YnVzLT5zZWxmLT52ZW5kb3IgPT0gMHgzMzg4KQorCSAgICAgJiYgKHBkZXYtPmJ1cy0+c2VsZi0+ZGV2aWNlID09IDB4MDAyMSkgKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaAppbmRleCA5NDEyZTI4MS4uYjIyZmRiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKQEAgLTM4LDEwICszOCwxMCBAQAogCiAjZGVmaW5lIERSSVZFUl9OQU1FCQkibWdhIgogI2RlZmluZSBEUklWRVJfREVTQwkJIk1hdHJveCBHMjAwL0c0MDAiCi0jZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwMjEwMjkiCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwNTA2MDciCiAKICNkZWZpbmUgRFJJVkVSX01BSk9SCQkzCi0jZGVmaW5lIERSSVZFUl9NSU5PUgkJMQorI2RlZmluZSBEUklWRVJfTUlOT1IJCTIKICNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAogCiB0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX3ByaW1hcnlfYnVmZmVyIHsKQEAgLTg3LDkgKzg3LDQzIEBACiAJaW50IGNoaXBzZXQ7CiAJaW50IHVzZWNfdGltZW91dDsKIAorCS8qKgorCSAqIElmIHNldCwgdGhlIG5ldyBETUEgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2Ugd2FzIHVzZWQuICBUaGlzIGlzCisJICogcHJpbWFyaWxseSB1c2VkIHRvIHNlbGVjdCBob3cgdGhlIGRyaXZlciBzaG91bGQgdW5pbml0aWFsaXplZCBpdHMKKwkgKiBpbnRlcm5hbCBETUEgc3RydWN0dXJlcy4KKwkgKi8KKwlpbnQgdXNlZF9uZXdfZG1hX2luaXQ7CisKKwkvKioKKwkgKiBJZiBBR1AgbWVtb3J5IGlzIHVzZWQgZm9yIERNQSBidWZmZXJzLCB0aGlzIHdpbGwgYmUgdGhlIHZhbHVlCisJICogXGMgTUdBX1BBR1BYRkVSLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIHplcm8gKGZvciBhIFBDSSB0cmFuc2ZlcikuCisJICovCisJdTMyIGRtYV9hY2Nlc3M7CisKKwkvKioKKwkgKiBJZiBBR1AgbWVtb3J5IGlzIHVzZWQgZm9yIERNQSBidWZmZXJzLCB0aGlzIHdpbGwgYmUgdGhlIHZhbHVlCisJICogXGMgTUdBX1dBR1BfRU5BQkxFLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIHplcm8gKGZvciBhIFBDSQorCSAqIHRyYW5zZmVyKS4KKwkgKi8KKwl1MzIgd2FncF9lbmFibGU7CisKKwkvKioKKwkgKiBcbmFtZSBNTUlPIHJlZ2lvbiBwYXJhbWV0ZXJzLgorCSAqIAorCSAqIFxzYSBkcm1fbWdhX3ByaXZhdGVfdDo6bW1pbworCSAqLworCS8qQHsqLworCXUzMiBtbWlvX2Jhc2U7ICAgICAgICAgICAgIC8qKjwgQnVzIGFkZHJlc3Mgb2YgYmFzZSBvZiBNTUlPLiAqLworCXUzMiBtbWlvX3NpemU7ICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgTU1JTyByZWdpb24uICovCisJLypAfSovCisKIAl1MzIgY2xlYXJfY21kOwogCXUzMiBtYWNjZXNzOwogCisJd2FpdF9xdWV1ZV9oZWFkX3QgZmVuY2VfcXVldWU7CisJYXRvbWljX3QgbGFzdF9mZW5jZV9yZXRpcmVkOworCXUzMiBuZXh0X2ZlbmNlX3RvX3Bvc3Q7CisKIAl1bnNpZ25lZCBpbnQgZmJfY3BwOwogCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQ7CiAJdW5zaWduZWQgaW50IGZyb250X3BpdGNoOwpAQCAtMTA4LDM1ICsxNDIsNDMgQEAKIAlkcm1fbG9jYWxfbWFwX3QgKnN0YXR1czsKIAlkcm1fbG9jYWxfbWFwX3QgKndhcnA7CiAJZHJtX2xvY2FsX21hcF90ICpwcmltYXJ5OwotCWRybV9sb2NhbF9tYXBfdCAqYnVmZmVyczsKIAlkcm1fbG9jYWxfbWFwX3QgKmFncF90ZXh0dXJlczsKKwkKKwlEUk1fQUdQX01FTSAqYWdwX21lbTsKKwl1bnNpZ25lZCBpbnQgYWdwX3BhZ2VzOwogfSBkcm1fbWdhX3ByaXZhdGVfdDsKIAogCQkJCS8qIG1nYV9kbWEuYyAqLwotZXh0ZXJuIGludCBtZ2FfZG1hX2luaXQoIERSTV9JT0NUTF9BUkdTICk7Ci1leHRlcm4gaW50IG1nYV9kbWFfZmx1c2goIERSTV9JT0NUTF9BUkdTICk7Ci1leHRlcm4gaW50IG1nYV9kbWFfcmVzZXQoIERSTV9JT0NUTF9BUkdTICk7Ci1leHRlcm4gaW50IG1nYV9kbWFfYnVmZmVycyggRFJNX0lPQ1RMX0FSR1MgKTsKLWV4dGVybiB2b2lkIG1nYV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpOwotZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludCBtZ2FfZHJpdmVyX3ByZWluaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiBpbnQgbWdhX2RtYV9ib290c3RyYXAoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCBtZ2FfZG1hX2luaXQoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCBtZ2FfZG1hX2ZsdXNoKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgbWdhX2RtYV9yZXNldChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IG1nYV9kbWFfYnVmZmVycyhEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfcG9zdGNsZWFudXAoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgbWdhX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldik7CiAKLWV4dGVybiBpbnQgbWdhX2RvX3dhaXRfZm9yX2lkbGUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApOworZXh0ZXJuIGludCBtZ2FfZG9fd2FpdF9mb3JfaWRsZShkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIAotZXh0ZXJuIHZvaWQgbWdhX2RvX2RtYV9mbHVzaCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICk7Ci1leHRlcm4gdm9pZCBtZ2FfZG9fZG1hX3dyYXBfc3RhcnQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApOwotZXh0ZXJuIHZvaWQgbWdhX2RvX2RtYV93cmFwX2VuZCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICk7CitleHRlcm4gdm9pZCBtZ2FfZG9fZG1hX2ZsdXNoKGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOworZXh0ZXJuIHZvaWQgbWdhX2RvX2RtYV93cmFwX3N0YXJ0KGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOworZXh0ZXJuIHZvaWQgbWdhX2RvX2RtYV93cmFwX2VuZChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIAogZXh0ZXJuIGludCBtZ2FfZnJlZWxpc3RfcHV0KCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2J1Zl90ICpidWYgKTsKIAogCQkJCS8qIG1nYV93YXJwLmMgKi8KLWV4dGVybiBpbnQgbWdhX3dhcnBfaW5zdGFsbF9taWNyb2NvZGUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApOwotZXh0ZXJuIGludCBtZ2Ffd2FycF9pbml0KCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbWdhX3dhcnBfbWljcm9jb2RlX3NpemUoY29uc3QgZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CitleHRlcm4gaW50IG1nYV93YXJwX2luc3RhbGxfbWljcm9jb2RlKGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOworZXh0ZXJuIGludCBtZ2Ffd2FycF9pbml0KGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwogCi1leHRlcm4gaW50IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwotZXh0ZXJuIGlycXJldHVybl90IG1nYV9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApOwotZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKLWV4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOwotZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworCQkJCS8qIG1nYV9pcnEuYyAqLworZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2ZlbmNlX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKK2V4dGVybiBpbnQgbWdhX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworZXh0ZXJuIGlycXJldHVybl90IG1nYV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiBsb25nIG1nYV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIApAQCAtNTI3LDYgKzU2OSwxMiBAQAogICovCiAjZGVmaW5lIE1HQV9FWEVDIAkJCTB4MDEwMAogCisvKiBBR1AgUExMIGVuY29kaW5nIChmb3IgRzIwMCBvbmx5KS4KKyAqLworI2RlZmluZSBNR0FfQUdQX1BMTCAJCQkweDFlNGMKKyMJZGVmaW5lIE1HQV9BR1AyWFBMTF9ESVNBQkxFCQkoMCA8PCAwKQorIwlkZWZpbmUgTUdBX0FHUDJYUExMX0VOQUJMRQkJKDEgPDwgMCkKKwogLyogV2FycCByZWdpc3RlcnMKICAqLwogI2RlZmluZSBNR0FfV1IwCQkJCTB4MmQwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfaW9jMzIuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lvYzMyLmMKaW5kZXggYmM3NDVjZi4uNzdkNzM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfaW9jMzIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9pb2MzMi5jCkBAIC0xMjksOSArMTI5LDc2IEBACiAJCQkgRFJNX0lPQ1RMX01HQV9HRVRQQVJBTSwgKHVuc2lnbmVkIGxvbmcpZ2V0cGFyYW0pOwogfQogCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2RybV9ib290c3RyYXAzMiB7CisJdTMyIHRleHR1cmVfaGFuZGxlOworCXUzMiB0ZXh0dXJlX3NpemU7CisJdTMyIHByaW1hcnlfc2l6ZTsKKwl1MzIgc2Vjb25kYXJ5X2Jpbl9jb3VudDsKKwl1MzIgc2Vjb25kYXJ5X2Jpbl9zaXplOworCXUzMiBhZ3BfbW9kZTsKKwl1OCBhZ3Bfc2l6ZTsKK30gZHJtX21nYV9kbWFfYm9vdHN0cmFwMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfbWdhX2RtYV9ib290c3RyYXAoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9tZ2FfZG1hX2Jvb3RzdHJhcDMyX3QgZG1hX2Jvb3RzdHJhcDMyOworCWRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90IF9fdXNlciAqZG1hX2Jvb3RzdHJhcDsKKwlpbnQgZXJyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkbWFfYm9vdHN0cmFwMzIsICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCSAgIHNpemVvZihkbWFfYm9vdHN0cmFwMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkbWFfYm9vdHN0cmFwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpkbWFfYm9vdHN0cmFwKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkbWFfYm9vdHN0cmFwLCBzaXplb2YoKmRtYV9ib290c3RyYXApKQorCSAgICB8fCBfX3B1dF91c2VyKGRtYV9ib290c3RyYXAzMi50ZXh0dXJlX2hhbmRsZSwKKwkJCSAgJmRtYV9ib290c3RyYXAtPnRleHR1cmVfaGFuZGxlKQorCSAgICB8fCBfX3B1dF91c2VyKGRtYV9ib290c3RyYXAzMi50ZXh0dXJlX3NpemUsCisJCQkgICZkbWFfYm9vdHN0cmFwLT50ZXh0dXJlX3NpemUpCisJICAgIHx8IF9fcHV0X3VzZXIoZG1hX2Jvb3RzdHJhcDMyLnByaW1hcnlfc2l6ZSwKKwkJCSAgJmRtYV9ib290c3RyYXAtPnByaW1hcnlfc2l6ZSkKKwkgICAgfHwgX19wdXRfdXNlcihkbWFfYm9vdHN0cmFwMzIuc2Vjb25kYXJ5X2Jpbl9jb3VudCwKKwkJCSAgJmRtYV9ib290c3RyYXAtPnNlY29uZGFyeV9iaW5fY291bnQpCisJICAgIHx8IF9fcHV0X3VzZXIoZG1hX2Jvb3RzdHJhcDMyLnNlY29uZGFyeV9iaW5fc2l6ZSwKKwkJCSAgJmRtYV9ib290c3RyYXAtPnNlY29uZGFyeV9iaW5fc2l6ZSkKKwkgICAgfHwgX19wdXRfdXNlcihkbWFfYm9vdHN0cmFwMzIuYWdwX21vZGUsICZkbWFfYm9vdHN0cmFwLT5hZ3BfbW9kZSkKKwkgICAgfHwgX19wdXRfdXNlcihkbWFfYm9vdHN0cmFwMzIuYWdwX3NpemUsICZkbWFfYm9vdHN0cmFwLT5hZ3Bfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJRFJNX0lPQ1RMX01HQV9ETUFfQk9PVFNUUkFQLAorCQkJKHVuc2lnbmVkIGxvbmcpZG1hX2Jvb3RzdHJhcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChfX2dldF91c2VyKGRtYV9ib290c3RyYXAzMi50ZXh0dXJlX2hhbmRsZSwKKwkJICAgICAgICZkbWFfYm9vdHN0cmFwLT50ZXh0dXJlX2hhbmRsZSkKKwkgICAgfHwgX19nZXRfdXNlcihkbWFfYm9vdHN0cmFwMzIudGV4dHVyZV9zaXplLAorCQkJICAmZG1hX2Jvb3RzdHJhcC0+dGV4dHVyZV9zaXplKQorCSAgICB8fCBfX2dldF91c2VyKGRtYV9ib290c3RyYXAzMi5wcmltYXJ5X3NpemUsCisJCQkgICZkbWFfYm9vdHN0cmFwLT5wcmltYXJ5X3NpemUpCisJICAgIHx8IF9fZ2V0X3VzZXIoZG1hX2Jvb3RzdHJhcDMyLnNlY29uZGFyeV9iaW5fY291bnQsCisJCQkgICZkbWFfYm9vdHN0cmFwLT5zZWNvbmRhcnlfYmluX2NvdW50KQorCSAgICB8fCBfX2dldF91c2VyKGRtYV9ib290c3RyYXAzMi5zZWNvbmRhcnlfYmluX3NpemUsCisJCQkgICZkbWFfYm9vdHN0cmFwLT5zZWNvbmRhcnlfYmluX3NpemUpCisJICAgIHx8IF9fZ2V0X3VzZXIoZG1hX2Jvb3RzdHJhcDMyLmFncF9tb2RlLAorCQkJICAmZG1hX2Jvb3RzdHJhcC0+YWdwX21vZGUpCisJICAgIHx8IF9fZ2V0X3VzZXIoZG1hX2Jvb3RzdHJhcDMyLmFncF9zaXplLAorCQkJICAmZG1hX2Jvb3RzdHJhcC0+YWdwX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmZG1hX2Jvb3RzdHJhcDMyLAorCSAgICAJCSBzaXplb2YoZG1hX2Jvb3RzdHJhcDMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKIGRybV9pb2N0bF9jb21wYXRfdCAqbWdhX2NvbXBhdF9pb2N0bHNbXSA9IHsKIAlbRFJNX01HQV9JTklUXSA9IGNvbXBhdF9tZ2FfaW5pdCwKIAlbRFJNX01HQV9HRVRQQVJBTV0gPSBjb21wYXRfbWdhX2dldHBhcmFtLAorCVtEUk1fTUdBX0RNQV9CT09UU1RSQVBdID0gY29tcGF0X21nYV9kbWFfYm9vdHN0cmFwLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lycS5jCmluZGV4IGJjMGI2YjUuLjUyZWFhNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lycS5jCkBAIC00MSwxNSArNDEsNDAgQEAKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKIAkgICAoZHJtX21nYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwogCWludCBzdGF0dXM7CisJaW50IGhhbmRsZWQgPSAwOwogCi0Jc3RhdHVzID0gTUdBX1JFQUQoIE1HQV9TVEFUVVMgKTsKLQkKKwlzdGF0dXMgPSBNR0FfUkVBRChNR0FfU1RBVFVTKTsKKwogCS8qIFZCTEFOSyBpbnRlcnJ1cHQgKi8KIAlpZiAoIHN0YXR1cyAmIE1HQV9WTElORVBFTiApIHsKIAkJTUdBX1dSSVRFKCBNR0FfSUNMRUFSLCBNR0FfVkxJTkVJQ0xSICk7CiAJCWF0b21pY19pbmMoJmRldi0+dmJsX3JlY2VpdmVkKTsKIAkJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWUpOwotCQlkcm1fdmJsX3NlbmRfc2lnbmFscyggZGV2ICk7CisJCWRybV92Ymxfc2VuZF9zaWduYWxzKGRldik7CisJCWhhbmRsZWQgPSAxOworCX0KKworCS8qIFNPRlRSQVAgaW50ZXJydXB0ICovCisJaWYgKHN0YXR1cyAmIE1HQV9TT0ZUUkFQRU4pIHsKKwkJY29uc3QgdTMyIHByaW1fc3RhcnQgPSBNR0FfUkVBRChNR0FfUFJJTUFERFJFU1MpOworCQljb25zdCB1MzIgcHJpbV9lbmQgICA9IE1HQV9SRUFEKE1HQV9QUklNRU5EKTsKKworCisJCU1HQV9XUklURShNR0FfSUNMRUFSLCBNR0FfU09GVFJBUElDTFIpOworCisJCS8qIEluIGFkZGl0aW9uIHRvIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQtcGVuZGluZyBiaXQsIHdlCisJCSAqIGhhdmUgdG8gd3JpdGUgdG8gTUdBX1BSSU1FTkQgdG8gcmUtc3RhcnQgdGhlIERNQSBvcGVyYXRpb24uCisJCSAqLworCQlpZiAoIChwcmltX3N0YXJ0ICYgfjB4MDMpICE9IChwcmltX2VuZCAmIH4weDAzKSApIHsKKwkJCU1HQV9XUklURShNR0FfUFJJTUVORCwgcHJpbV9lbmQpOworCQl9CisKKwkJYXRvbWljX2luYygmZGV2X3ByaXYtPmxhc3RfZmVuY2VfcmV0aXJlZCk7CisJCURSTV9XQUtFVVAoJmRldl9wcml2LT5mZW5jZV9xdWV1ZSk7CisJCWhhbmRsZWQgPSAxOworCX0KKworCWlmICggaGFuZGxlZCApIHsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIAlyZXR1cm4gSVJRX05PTkU7CkBAIC03Myw5ICs5OCwyOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgbWdhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7Ci0gIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKLQkgICAoZHJtX21nYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworaW50IG1nYV9kcml2ZXJfZmVuY2Vfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IGN1cl9mZW5jZTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIEFzc3VtZSB0aGF0IHRoZSB1c2VyIGhhcyBtaXNzZWQgdGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyCisJICogYnkgYWJvdXQgYSBkYXkgcmF0aGVyIHRoYW4gc2hlIHdhbnRzIHRvIHdhaXQgZm9yIHllYXJzCisJICogdXNpbmcgZmVuY2VzLgorCSAqLworCURSTV9XQUlUX09OKHJldCwgZGV2X3ByaXYtPmZlbmNlX3F1ZXVlLCAzICogRFJNX0haLAorCQkgICAgKCgoY3VyX2ZlbmNlID0gYXRvbWljX3JlYWQoJmRldl9wcml2LT5sYXN0X2ZlbmNlX3JldGlyZWQpKQorCQkgICAgICAtICpzZXF1ZW5jZSkgPD0gKDEgPDwgMjMpKSk7CisKKwkqc2VxdWVuY2UgPSBjdXJfZmVuY2U7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCiAJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCiAgICAgICAJTUdBX1dSSVRFKCBNR0FfSUVOLCAwICk7CkBAIC04MywxMiArMTI3LDE0IEBACiAgICAJTUdBX1dSSVRFKCBNR0FfSUNMRUFSLCB+MCApOwogfQogCi12b2lkIG1nYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKLSAgCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IAotCSAgIChkcm1fbWdhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7Cit2b2lkIG1nYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAotCS8qIFR1cm4gb24gVkJMIGludGVycnVwdCAqLwotICAgCU1HQV9XUklURSggTUdBX0lFTiwgTUdBX1ZMSU5FSUVOICk7CisJRFJNX0lOSVRfV0FJVFFVRVVFKCAmZGV2X3ByaXYtPmZlbmNlX3F1ZXVlICk7CisKKwkvKiBUdXJuIG9uIHZlcnRpY2FsIGJsYW5rIGludGVycnVwdCBhbmQgc29mdCB0cmFwIGludGVycnVwdC4gKi8KKwlNR0FfV1JJVEUoTUdBX0lFTiwgTUdBX1ZMSU5FSUVOIHwgTUdBX1NPRlRSQVBFTik7CiB9CiAKIHZvaWQgbWdhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKQEAgLTk4LDUgKzE0NCw3IEBACiAJCXJldHVybjsKIAogCS8qIERpc2FibGUgKmFsbCogaW50ZXJydXB0cyAqLwotCU1HQV9XUklURSggTUdBX0lFTiwgMCApOworCU1HQV9XUklURShNR0FfSUVOLCAwKTsKKwkKKwlkZXYtPmlycV9lbmFibGVkID0gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jCmluZGV4IDNjN2E4ZjUuLjA1YmJiNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYwpAQCAtNTMsMTYgKzUzLDE2IEBACiAKIAkvKiBGb3JjZSByZXNldCBvZiBEV0dDVEwgb24gRzQwMCAoZWxpbWluYXRlcyBjbGlwIGRpc2FibGUgYml0KS4KIAkgKi8KLQlpZiAoIGRldl9wcml2LT5jaGlwc2V0ID09IE1HQV9DQVJEX1RZUEVfRzQwMCApIHsKLQkJRE1BX0JMT0NLKCBNR0FfRFdHQ1RMLAkJY3R4LT5kd2djdGwsCi0JCQkgICBNR0FfTEVOICsgTUdBX0VYRUMsCTB4ODAwMDAwMDAsCi0JCQkgICBNR0FfRFdHQ1RMLAkJY3R4LT5kd2djdGwsCi0JCQkgICBNR0FfTEVOICsgTUdBX0VYRUMsCTB4ODAwMDAwMDAgKTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gTUdBX0NBUkRfVFlQRV9HNDAwKSB7CisJCURNQV9CTE9DSyhNR0FfRFdHQ1RMLCBjdHgtPmR3Z2N0bCwKKwkJCSAgTUdBX0xFTiArIE1HQV9FWEVDLCAweDgwMDAwMDAwLAorCQkJICBNR0FfRFdHQ1RMLCBjdHgtPmR3Z2N0bCwKKwkJCSAgTUdBX0xFTiArIE1HQV9FWEVDLCAweDgwMDAwMDAwKTsKIAl9Ci0JRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAotCQkgICBNR0FfQ1hCTkRSWSwJKGJveC0+eDIgPDwgMTYpIHwgYm94LT54MSwKLQkJICAgTUdBX1lUT1AsCWJveC0+eTEgKiBwaXRjaCwKLQkJICAgTUdBX1lCT1QsCWJveC0+eTIgKiBwaXRjaCApOworCURNQV9CTE9DSyhNR0FfRE1BUEFELCAweDAwMDAwMDAwLAorCQkgIE1HQV9DWEJORFJZLCAoKGJveC0+eDIgLSAxKSA8PCAxNikgfCBib3gtPngxLAorCQkgIE1HQV9ZVE9QLCBib3gtPnkxICogcGl0Y2gsCisJCSAgTUdBX1lCT1QsIChib3gtPnkyIC0gMSkgKiBwaXRjaCk7CiAKIAlBRFZBTkNFX0RNQSgpOwogfQpAQCAtMjYwLDEyICsyNjAsMTEgQEAKIAogCS8qIFBhZGRpbmcgcmVxdWlyZWQgdG8gdG8gaGFyZHdhcmUgYnVnLgogCSAqLwotCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKLQkJICAgTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKLQkJICAgTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKLQkJICAgTUdBX1dJQUREUiwJKGRldl9wcml2LT53YXJwX3BpcGVfcGh5c1twaXBlXSB8Ci0JCQkJIE1HQV9XTU9ERV9TVEFSVCB8Ci0JCQkJIE1HQV9XQUdQX0VOQUJMRSkgKTsKKwlETUFfQkxPQ0soTUdBX0RNQVBBRCwgMHhmZmZmZmZmZiwKKwkJICBNR0FfRE1BUEFELCAweGZmZmZmZmZmLAorCQkgIE1HQV9ETUFQQUQsIDB4ZmZmZmZmZmYsCisJCSAgTUdBX1dJQUREUiwgKGRldl9wcml2LT53YXJwX3BpcGVfcGh5c1twaXBlXSB8CisJCQkgICAgICAgTUdBX1dNT0RFX1NUQVJUIHwgZGV2X3ByaXYtPndhZ3BfZW5hYmxlKSk7CiAKIAlBRFZBTkNFX0RNQSgpOwogfQpAQCAtMzQyLDEyICszNDEsMTEgQEAKIAkJICAgTUdBX1dSNjAsCU1HQV9HNDAwX1dSX01BR0lDICk7CS8qIHRleDEgaGVpZ2h0ICAgICAgICovCiAKIAkvKiBQYWRkaW5nIHJlcXVpcmVkIHRvIHRvIGhhcmR3YXJlIGJ1ZyAqLwotCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKLQkJICAgTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKLQkJICAgTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKLQkJICAgTUdBX1dJQUREUjIsCShkZXZfcHJpdi0+d2FycF9waXBlX3BoeXNbcGlwZV0gfAotCQkJCSBNR0FfV01PREVfU1RBUlQgfAotCQkJCSBNR0FfV0FHUF9FTkFCTEUpICk7CisJRE1BX0JMT0NLKE1HQV9ETUFQQUQsIDB4ZmZmZmZmZmYsCisJCSAgTUdBX0RNQVBBRCwgMHhmZmZmZmZmZiwKKwkJICBNR0FfRE1BUEFELCAweGZmZmZmZmZmLAorCQkgIE1HQV9XSUFERFIyLCAoZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzW3BpcGVdIHwKKwkJCQlNR0FfV01PREVfU1RBUlQgfCBkZXZfcHJpdi0+d2FncF9lbmFibGUpKTsKIAogCUFEVkFOQ0VfRE1BKCk7CiB9CkBAIC00NTksOSArNDU3LDkgQEAKIAlpZiAoIGRpcnR5ICYgTUdBX1VQTE9BRF9URVgwICkKIAkJcmV0IHw9IG1nYV92ZXJpZnlfdGV4KCBkZXZfcHJpdiwgMCApOwogCi0JaWYgKCBkZXZfcHJpdi0+Y2hpcHNldCA9PSBNR0FfQ0FSRF9UWVBFX0c0MDAgKSB7Ci0JCWlmICggZGlydHkgJiBNR0FfVVBMT0FEX1RFWDEgKQotCQkJcmV0IHw9IG1nYV92ZXJpZnlfdGV4KCBkZXZfcHJpdiwgMSApOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSBNR0FfQ0FSRF9UWVBFX0c0MDApIHsKKwkJaWYgKGRpcnR5ICYgTUdBX1VQTE9BRF9URVgxKQorCQkJcmV0IHw9IG1nYV92ZXJpZnlfdGV4KGRldl9wcml2LCAxKTsKIAogCQlpZiAoIGRpcnR5ICYgTUdBX1VQTE9BRF9QSVBFICkKIAkJCXJldCB8PSAoIHNhcmVhX3ByaXYtPndhcnBfcGlwZSA+IE1HQV9NQVhfRzQwMF9QSVBFUyApOwpAQCAtNjg2LDEyICs2ODQsMTIgQEAKIAogCQkJQkVHSU5fRE1BKCAxICk7CiAKLQkJCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCi0JCQkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCi0JCQkJICAgTUdBX1NFQ0FERFJFU1MsCShhZGRyZXNzIHwKLQkJCQkJCQkgTUdBX0RNQV9WRVJURVgpLAotCQkJCSAgIE1HQV9TRUNFTkQsCQkoKGFkZHJlc3MgKyBsZW5ndGgpIHwKLQkJCQkJCQkgTUdBX1BBR1BYRkVSKSApOworCQkJRE1BX0JMT0NLKE1HQV9ETUFQQUQsIDB4MDAwMDAwMDAsCisJCQkJICBNR0FfRE1BUEFELCAweDAwMDAwMDAwLAorCQkJCSAgTUdBX1NFQ0FERFJFU1MsIChhZGRyZXNzIHwKKwkJCQkJCSAgIE1HQV9ETUFfVkVSVEVYKSwKKwkJCQkgIE1HQV9TRUNFTkQsICgoYWRkcmVzcyArIGxlbmd0aCkgfAorCQkJCQkgICAgICAgZGV2X3ByaXYtPmRtYV9hY2Nlc3MpKTsKIAogCQkJQURWQU5DRV9ETUEoKTsKIAkJfSB3aGlsZSAoICsraSA8IHNhcmVhX3ByaXYtPm5ib3ggKTsKQEAgLTczMywxMSArNzMxLDExIEBACiAKIAkJCUJFR0lOX0RNQSggMSApOwogCi0JCQlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAotCQkJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAotCQkJCSAgIE1HQV9TRVRVUEFERFJFU1MsCWFkZHJlc3MgKyBzdGFydCwKLQkJCQkgICBNR0FfU0VUVVBFTkQsCSgoYWRkcmVzcyArIGVuZCkgfAotCQkJCQkJCSBNR0FfUEFHUFhGRVIpICk7CisJCQlETUFfQkxPQ0soTUdBX0RNQVBBRCwgMHgwMDAwMDAwMCwKKwkJCQkgIE1HQV9ETUFQQUQsIDB4MDAwMDAwMDAsCisJCQkJICBNR0FfU0VUVVBBRERSRVNTLCBhZGRyZXNzICsgc3RhcnQsCisJCQkJICBNR0FfU0VUVVBFTkQsICgoYWRkcmVzcyArIGVuZCkgfAorCQkJCQkJIGRldl9wcml2LT5kbWFfYWNjZXNzKSk7CiAKIAkJCUFEVkFOQ0VfRE1BKCk7CiAJCX0gd2hpbGUgKCArK2kgPCBzYXJlYV9wcml2LT5uYm94ICk7CkBAIC03NjQsNyArNzYyLDcgQEAKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKLQl1MzIgc3Jjb3JnID0gYnVmLT5idXNfYWRkcmVzcyB8IE1HQV9TUkNBQ0NfQUdQIHwgTUdBX1NSQ01BUF9TWVNNRU07CisJdTMyIHNyY29yZyA9IGJ1Zi0+YnVzX2FkZHJlc3MgfCBkZXZfcHJpdi0+ZG1hX2FjY2VzcyB8IE1HQV9TUkNNQVBfU1lTTUVNOwogCXUzMiB5MjsKIAlETUFfTE9DQUxTOwogCURSTV9ERUJVRyggImJ1Zj0lZCB1c2VkPSVkXG4iLCBidWYtPmlkeCwgYnVmLT51c2VkICk7CkBAIC0xMDk1LDYgKzEwOTMsOSBAQAogCWNhc2UgTUdBX1BBUkFNX0lSUV9OUjoKIAkJdmFsdWUgPSBkZXYtPmlycTsKIAkJYnJlYWs7CisJY2FzZSBNR0FfUEFSQU1fQ0FSRF9UWVBFOgorCQl2YWx1ZSA9IGRldl9wcml2LT5jaGlwc2V0OworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KQEAgLTExMDcsMTcgKzExMDgsODIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtZ2Ffc2V0X2ZlbmNlKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgdGVtcDsKKwlETUFfTE9DQUxTOworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9ERUJVRygicGlkPSVkXG4iLCBEUk1fQ1VSUkVOVFBJRCk7CisKKwkvKiBJIHdvdWxkIG5vcm1hbCBkbyB0aGlzIGFzc2lnbm1lbnQgaW4gdGhlIGRlY2xhcmF0aW9uIG9mIHRlbXAsCisJICogYnV0IGRldl9wcml2IG1heSBiZSBOVUxMLgorCSAqLworCisJdGVtcCA9IGRldl9wcml2LT5uZXh0X2ZlbmNlX3RvX3Bvc3Q7CisJZGV2X3ByaXYtPm5leHRfZmVuY2VfdG9fcG9zdCsrOworCisJQkVHSU5fRE1BKDEpOworCURNQV9CTE9DSyhNR0FfRE1BUEFELCAweDAwMDAwMDAwLAorCQkgIE1HQV9ETUFQQUQsIDB4MDAwMDAwMDAsCisJCSAgTUdBX0RNQVBBRCwgMHgwMDAwMDAwMCwKKwkJICBNR0FfU09GVFJBUCwgMHgwMDAwMDAwMCk7CisJQURWQU5DRV9ETUEoKTsKKworCWlmIChEUk1fQ09QWV9UT19VU0VSKCAodTMyIF9fdXNlciAqKSBkYXRhLCAmIHRlbXAsIHNpemVvZih1MzIpKSkgeworCQlEUk1fRVJST1IoImNvcHlfdG9fdXNlclxuIik7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdhX3dhaXRfZmVuY2UoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBmZW5jZTsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZmVuY2UsICh1MzIgX191c2VyICopIGRhdGEsIHNpemVvZih1MzIpKTsKKworCURSTV9ERUJVRygicGlkPSVkXG4iLCBEUk1fQ1VSUkVOVFBJRCk7CisKKwltZ2FfZHJpdmVyX2ZlbmNlX3dhaXQoZGV2LCAmIGZlbmNlKTsKKworCWlmIChEUk1fQ09QWV9UT19VU0VSKCAodTMyIF9fdXNlciAqKSBkYXRhLCAmIGZlbmNlLCBzaXplb2YodTMyKSkpIHsKKwkJRFJNX0VSUk9SKCJjb3B5X3RvX3VzZXJcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCXJldHVybiAwOworfQorCiBkcm1faW9jdGxfZGVzY190IG1nYV9pb2N0bHNbXSA9IHsKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfSU5JVCldICAgID0geyBtZ2FfZG1hX2luaXQsICAgIDEsIDEgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfRkxVU0gpXSAgID0geyBtZ2FfZG1hX2ZsdXNoLCAgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfUkVTRVQpXSAgID0geyBtZ2FfZG1hX3Jlc2V0LCAgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfU1dBUCldICAgID0geyBtZ2FfZG1hX3N3YXAsICAgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfQ0xFQVIpXSAgID0geyBtZ2FfZG1hX2NsZWFyLCAgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfVkVSVEVYKV0gID0geyBtZ2FfZG1hX3ZlcnRleCwgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfSU5ESUNFUyldID0geyBtZ2FfZG1hX2luZGljZXMsIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfSUxPQUQpXSAgID0geyBtZ2FfZG1hX2lsb2FkLCAgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfQkxJVCldICAgID0geyBtZ2FfZG1hX2JsaXQsICAgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfR0VUUEFSQU0pXT0geyBtZ2FfZ2V0cGFyYW0sICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfSU5JVCldID0ge21nYV9kbWFfaW5pdCwgMSwgMX0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0ZMVVNIKV0gPSB7bWdhX2RtYV9mbHVzaCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX1JFU0VUKV0gPSB7bWdhX2RtYV9yZXNldCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX1NXQVApXSA9IHttZ2FfZG1hX3N3YXAsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9DTEVBUildID0ge21nYV9kbWFfY2xlYXIsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9WRVJURVgpXSA9IHttZ2FfZG1hX3ZlcnRleCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0lORElDRVMpXSA9IHttZ2FfZG1hX2luZGljZXMsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9JTE9BRCldID0ge21nYV9kbWFfaWxvYWQsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9CTElUKV0gPSB7bWdhX2RtYV9ibGl0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfR0VUUEFSQU0pXSA9IHttZ2FfZ2V0cGFyYW0sIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9TRVRfRkVOQ0UpXSA9IHttZ2Ffc2V0X2ZlbmNlLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfV0FJVF9GRU5DRSldID0ge21nYV93YWl0X2ZlbmNlLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfRE1BX0JPT1RTVFJBUCldID0ge21nYV9kbWFfYm9vdHN0cmFwLCAxLCAxfSwKKwogfTsKIAogaW50IG1nYV9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShtZ2FfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX3dhcnAuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX3dhcnAuYwppbmRleCAwYTNhMGNjLi41NWNjYzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV93YXJwLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffd2FycC5jCkBAIC00OCw2NSArNDgsNTIgQEAKIAl2Y2Jhc2UgKz0gV0FSUF9VQ09ERV9TSVpFKCB3aGljaCApOwkJCQlcCiB9IHdoaWxlICgwKQogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1nYV93YXJwX2c0MDBfbWljcm9jb2RlX3NpemUgPQorCSAgICAgICAoV0FSUF9VQ09ERV9TSVpFKHdhcnBfZzQwMF90Z3opICsKKwkJV0FSUF9VQ09ERV9TSVpFKHdhcnBfZzQwMF90Z3phKSArCisJCVdBUlBfVUNPREVfU0laRSh3YXJwX2c0MDBfdGd6YWYpICsKKwkJV0FSUF9VQ09ERV9TSVpFKHdhcnBfZzQwMF90Z3pmKSArCisJCVdBUlBfVUNPREVfU0laRSh3YXJwX2c0MDBfdGd6cykgKworCQlXQVJQX1VDT0RFX1NJWkUod2FycF9nNDAwX3RnenNhKSArCisJCVdBUlBfVUNPREVfU0laRSh3YXJwX2c0MDBfdGd6c2FmKSArCisJCVdBUlBfVUNPREVfU0laRSh3YXJwX2c0MDBfdGd6c2YpICsKKwkJV0FSUF9VQ09ERV9TSVpFKHdhcnBfZzQwMF90Mmd6KSArCisJCVdBUlBfVUNPREVfU0laRSh3YXJwX2c0MDBfdDJnemEpICsKKwkJV0FSUF9VQ09ERV9TSVpFKHdhcnBfZzQwMF90Mmd6YWYpICsKKwkJV0FSUF9VQ09ERV9TSVpFKHdhcnBfZzQwMF90Mmd6ZikgKworCQlXQVJQX1VDT0RFX1NJWkUod2FycF9nNDAwX3QyZ3pzKSArCisJCVdBUlBfVUNPREVfU0laRSh3YXJwX2c0MDBfdDJnenNhKSArCisJCVdBUlBfVUNPREVfU0laRSh3YXJwX2c0MDBfdDJnenNhZikgKworCQlXQVJQX1VDT0RFX1NJWkUod2FycF9nNDAwX3QyZ3pzZikpOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IG1nYV93YXJwX2c0MDBfbWljcm9jb2RlX3NpemUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1nYV93YXJwX2cyMDBfbWljcm9jb2RlX3NpemUgPQorCSAgICAgICAoV0FSUF9VQ09ERV9TSVpFKHdhcnBfZzIwMF90Z3opICsKKwkJV0FSUF9VQ09ERV9TSVpFKHdhcnBfZzIwMF90Z3phKSArCisJCVdBUlBfVUNPREVfU0laRSh3YXJwX2cyMDBfdGd6YWYpICsKKwkJV0FSUF9VQ09ERV9TSVpFKHdhcnBfZzIwMF90Z3pmKSArCisJCVdBUlBfVUNPREVfU0laRSh3YXJwX2cyMDBfdGd6cykgKworCQlXQVJQX1VDT0RFX1NJWkUod2FycF9nMjAwX3RnenNhKSArCisJCVdBUlBfVUNPREVfU0laRSh3YXJwX2cyMDBfdGd6c2FmKSArCisJCVdBUlBfVUNPREVfU0laRSh3YXJwX2cyMDBfdGd6c2YpKTsKKworCit1bnNpZ25lZCBpbnQgbWdhX3dhcnBfbWljcm9jb2RlX3NpemUoY29uc3QgZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKIHsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQotCXNpemUgPSAoIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RneiApICsKLQkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RnemEgKSArCi0JCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3phZiApICsKLQkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RnemYgKSArCi0JCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3pzICkgKwotCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdGd6c2EgKSArCi0JCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3pzYWYgKSArCi0JCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3pzZiApICsKLQkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3QyZ3ogKSArCi0JCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Mmd6YSApICsKLQkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3QyZ3phZiApICsKLQkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3QyZ3pmICkgKwotCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdDJnenMgKSArCi0JCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Mmd6c2EgKSArCi0JCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Mmd6c2FmICkgKwotCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdDJnenNmICkgKTsKLQotCXNpemUgPSBQQUdFX0FMSUdOKCBzaXplICk7Ci0KLQlEUk1fREVCVUcoICJHNDAwIHVjb2RlIHNpemUgPSAlZCBieXRlc1xuIiwgc2l6ZSApOwotCXJldHVybiBzaXplOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG1nYV93YXJwX2cyMDBfbWljcm9jb2RlX3NpemUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCi17Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0KLQlzaXplID0gKCBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3ogKSArCi0JCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3phICkgKwotCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6YWYgKSArCi0JCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3pmICkgKwotCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6cyApICsKLQkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nMjAwX3RnenNhICkgKwotCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6c2FmICkgKwotCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6c2YgKSApOwotCi0Jc2l6ZSA9IFBBR0VfQUxJR04oIHNpemUgKTsKLQotCURSTV9ERUJVRyggIkcyMDAgdWNvZGUgc2l6ZSA9ICVkIGJ5dGVzXG4iLCBzaXplICk7Ci0JcmV0dXJuIHNpemU7CisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCWNhc2UgTUdBX0NBUkRfVFlQRV9HNDAwOgorCWNhc2UgTUdBX0NBUkRfVFlQRV9HNTUwOgorCQlyZXR1cm4gUEFHRV9BTElHTihtZ2Ffd2FycF9nNDAwX21pY3JvY29kZV9zaXplKTsKKwljYXNlIE1HQV9DQVJEX1RZUEVfRzIwMDoKKwkJcmV0dXJuIFBBR0VfQUxJR04obWdhX3dhcnBfZzIwMF9taWNyb2NvZGVfc2l6ZSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQogfQogCiBzdGF0aWMgaW50IG1nYV93YXJwX2luc3RhbGxfZzQwMF9taWNyb2NvZGUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCiB7CiAJdW5zaWduZWQgY2hhciAqdmNiYXNlID0gZGV2X3ByaXYtPndhcnAtPmhhbmRsZTsKIAl1bnNpZ25lZCBsb25nIHBjYmFzZSA9IGRldl9wcml2LT53YXJwLT5vZmZzZXQ7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0KLQlzaXplID0gbWdhX3dhcnBfZzQwMF9taWNyb2NvZGVfc2l6ZSggZGV2X3ByaXYgKTsKLQlpZiAoIHNpemUgPiBkZXZfcHJpdi0+d2FycC0+c2l6ZSApIHsKLQkJRFJNX0VSUk9SKCAibWljcm9jb2RlIHRvbyBsYXJnZSEgKCV1ID4gJWx1KVxuIiwKLQkJCSAgIHNpemUsIGRldl9wcml2LT53YXJwLT5zaXplICk7Ci0JCXJldHVybiBEUk1fRVJSKEVOT01FTSk7Ci0JfQogCiAJbWVtc2V0KCBkZXZfcHJpdi0+d2FycF9waXBlX3BoeXMsIDAsCiAJCXNpemVvZihkZXZfcHJpdi0+d2FycF9waXBlX3BoeXMpICk7CkBAIC0xMzYsMzUgKzEyMywzNiBAQAogewogCXVuc2lnbmVkIGNoYXIgKnZjYmFzZSA9IGRldl9wcml2LT53YXJwLT5oYW5kbGU7CiAJdW5zaWduZWQgbG9uZyBwY2Jhc2UgPSBkZXZfcHJpdi0+d2FycC0+b2Zmc2V0OwotCXVuc2lnbmVkIGludCBzaXplOwogCi0Jc2l6ZSA9IG1nYV93YXJwX2cyMDBfbWljcm9jb2RlX3NpemUoIGRldl9wcml2ICk7Ci0JaWYgKCBzaXplID4gZGV2X3ByaXYtPndhcnAtPnNpemUgKSB7Ci0JCURSTV9FUlJPUiggIm1pY3JvY29kZSB0b28gbGFyZ2UhICgldSA+ICVsdSlcbiIsCi0JCQkgICBzaXplLCBkZXZfcHJpdi0+d2FycC0+c2l6ZSApOwotCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOwotCX0KKwltZW1zZXQoZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzLCAwLCBzaXplb2YoZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzKSk7CiAKLQltZW1zZXQoIGRldl9wcml2LT53YXJwX3BpcGVfcGh5cywgMCwKLQkJc2l6ZW9mKGRldl9wcml2LT53YXJwX3BpcGVfcGh5cykgKTsKLQotCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nMjAwX3RneiwJTUdBX1dBUlBfVEdaICk7Ci0JV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2cyMDBfdGd6ZiwJTUdBX1dBUlBfVEdaRiApOwotCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nMjAwX3RnemEsCU1HQV9XQVJQX1RHWkEgKTsKLQlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzIwMF90Z3phZiwJTUdBX1dBUlBfVEdaQUYgKTsKLQlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzIwMF90Z3pzLAlNR0FfV0FSUF9UR1pTICk7Ci0JV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2cyMDBfdGd6c2YsCU1HQV9XQVJQX1RHWlNGICk7Ci0JV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2cyMDBfdGd6c2EsCU1HQV9XQVJQX1RHWlNBICk7Ci0JV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2cyMDBfdGd6c2FmLAlNR0FfV0FSUF9UR1pTQUYgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwod2FycF9nMjAwX3RneiwgTUdBX1dBUlBfVEdaKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwod2FycF9nMjAwX3RnemYsIE1HQV9XQVJQX1RHWkYpOworCVdBUlBfVUNPREVfSU5TVEFMTCh3YXJwX2cyMDBfdGd6YSwgTUdBX1dBUlBfVEdaQSk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKHdhcnBfZzIwMF90Z3phZiwgTUdBX1dBUlBfVEdaQUYpOworCVdBUlBfVUNPREVfSU5TVEFMTCh3YXJwX2cyMDBfdGd6cywgTUdBX1dBUlBfVEdaUyk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKHdhcnBfZzIwMF90Z3pzZiwgTUdBX1dBUlBfVEdaU0YpOworCVdBUlBfVUNPREVfSU5TVEFMTCh3YXJwX2cyMDBfdGd6c2EsIE1HQV9XQVJQX1RHWlNBKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwod2FycF9nMjAwX3RnenNhZiwgTUdBX1dBUlBfVEdaU0FGKTsKIAogCXJldHVybiAwOwogfQogCiBpbnQgbWdhX3dhcnBfaW5zdGFsbF9taWNyb2NvZGUoCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCiB7Ci0Jc3dpdGNoICggZGV2X3ByaXYtPmNoaXBzZXQgKSB7CisJY29uc3QgdW5zaWduZWQgaW50IHNpemUgPSBtZ2Ffd2FycF9taWNyb2NvZGVfc2l6ZShkZXZfcHJpdik7CisKKwlEUk1fREVCVUcoIk1HQSB1Y29kZSBzaXplID0gJWQgYnl0ZXNcbiIsIHNpemUpOworCWlmIChzaXplID4gZGV2X3ByaXYtPndhcnAtPnNpemUpIHsKKwkJRFJNX0VSUk9SKCJtaWNyb2NvZGUgdG9vIGxhcmdlISAoJXUgPiAlbHUpXG4iLAorCQkJICBzaXplLCBkZXZfcHJpdi0+d2FycC0+c2l6ZSk7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgewogCWNhc2UgTUdBX0NBUkRfVFlQRV9HNDAwOgotCQlyZXR1cm4gbWdhX3dhcnBfaW5zdGFsbF9nNDAwX21pY3JvY29kZSggZGV2X3ByaXYgKTsKKwljYXNlIE1HQV9DQVJEX1RZUEVfRzU1MDoKKwkJcmV0dXJuIG1nYV93YXJwX2luc3RhbGxfZzQwMF9taWNyb2NvZGUoZGV2X3ByaXYpOwogCWNhc2UgTUdBX0NBUkRfVFlQRV9HMjAwOgogCQlyZXR1cm4gbWdhX3dhcnBfaW5zdGFsbF9nMjAwX21pY3JvY29kZSggZGV2X3ByaXYgKTsKIAlkZWZhdWx0OgpAQCAtMTgyLDEwICsxNzAsMTEgQEAKIAkgKi8KIAlzd2l0Y2ggKCBkZXZfcHJpdi0+Y2hpcHNldCApIHsKIAljYXNlIE1HQV9DQVJEX1RZUEVfRzQwMDoKLQkJTUdBX1dSSVRFKCBNR0FfV0lBRERSMiwgTUdBX1dNT0RFX1NVU1BFTkQgKTsKLQkJTUdBX1dSSVRFKCBNR0FfV0dFVE1TQiwgMHgwMDAwMEUwMCApOwotCQlNR0FfV1JJVEUoIE1HQV9XVlJUWFNaLCAweDAwMDAxODA3ICk7Ci0JCU1HQV9XUklURSggTUdBX1dBQ0NFUFRTRVEsIDB4MTgwMDAwMDAgKTsKKwljYXNlIE1HQV9DQVJEX1RZUEVfRzU1MDoKKwkJTUdBX1dSSVRFKE1HQV9XSUFERFIyLCBNR0FfV01PREVfU1VTUEVORCk7CisJCU1HQV9XUklURShNR0FfV0dFVE1TQiwgMHgwMDAwMEUwMCk7CisJCU1HQV9XUklURShNR0FfV1ZSVFhTWiwgMHgwMDAwMTgwNyk7CisJCU1HQV9XUklURShNR0FfV0FDQ0VQVFNFUSwgMHgxODAwMDAwMCk7CiAJCWJyZWFrOwogCWNhc2UgTUdBX0NBUkRfVFlQRV9HMjAwOgogCQlNR0FfV1JJVEUoIE1HQV9XSUFERFIsIE1HQV9XTU9ERV9TVVNQRU5EICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMKaW5kZXggMDhlZDhkMC4uODk1MTUyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYwpAQCAtMzI2LDcgKzMyNiw4IEBACiAJCXJpbmdfc3RhcnQgPSBkZXZfcHJpdi0+Y2NlX3JpbmctPm9mZnNldCAtIGRldi0+YWdwLT5iYXNlOwogCWVsc2UKICNlbmRpZgotCQlyaW5nX3N0YXJ0ID0gZGV2X3ByaXYtPmNjZV9yaW5nLT5vZmZzZXQgLSBkZXYtPnNnLT5oYW5kbGU7CisJCXJpbmdfc3RhcnQgPSBkZXZfcHJpdi0+Y2NlX3JpbmctPm9mZnNldCAtIAorCQkJCSh1bnNpZ25lZCBsb25nKWRldi0+c2ctPnZpcnR1YWw7CiAKIAlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfT0ZGU0VULCByaW5nX3N0YXJ0IHwgUjEyOF9BR1BfT0ZGU0VUICk7CiAKQEAgLTQ4Nyw2ICs0ODgsNyBAQAogCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CisJZGV2LT5hZ3BfYnVmZmVyX3Rva2VuID0gaW5pdC0+YnVmZmVyc19vZmZzZXQ7CiAJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5idWZmZXJzX29mZnNldCk7CiAJaWYoIWRldi0+YWdwX2J1ZmZlcl9tYXApIHsKIAkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBkbWEgYnVmZmVyIHJlZ2lvbiFcbiIpOwpAQCAtNTM3LDcgKzUzOSw3IEBACiAJCWRldl9wcml2LT5jY2VfYnVmZmVyc19vZmZzZXQgPSBkZXYtPmFncC0+YmFzZTsKIAllbHNlCiAjZW5kaWYKLQkJZGV2X3ByaXYtPmNjZV9idWZmZXJzX29mZnNldCA9IGRldi0+c2ctPmhhbmRsZTsKKwkJZGV2X3ByaXYtPmNjZV9idWZmZXJzX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWRldi0+c2ctPnZpcnR1YWw7CiAKIAlkZXZfcHJpdi0+cmluZy5zdGFydCA9ICh1MzIgKilkZXZfcHJpdi0+Y2NlX3JpbmctPmhhbmRsZTsKIAlkZXZfcHJpdi0+cmluZy5lbmQgPSAoKHUzMiAqKWRldl9wcml2LT5jY2VfcmluZy0+aGFuZGxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJtLmgKaW5kZXggMGNiYTE3ZC4uYjYxNmNkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcm0uaApAQCAtMjE1LDcgKzIxNSw3IEBACiAjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0lORElSRUNUICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0lORElSRUNULCBkcm1fcjEyOF9pbmRpcmVjdF90KQogI2RlZmluZSBEUk1fSU9DVExfUjEyOF9GVUxMU0NSRUVOIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9GVUxMU0NSRUVOLCBkcm1fcjEyOF9mdWxsc2NyZWVuX3QpCiAjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0NMRUFSMiAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0NMRUFSMiwgZHJtX3IxMjhfY2xlYXIyX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9SMTI4X0dFVFBBUkFNICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0dFVFBBUkFNLCBkcm1fcjEyOF9nZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9HRVRQQVJBTSAgIERSTV9JT1dSKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfR0VUUEFSQU0sIGRybV9yMTI4X2dldHBhcmFtX3QpCiAjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0ZMSVAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0ZMSVApCiAKIHR5cGVkZWYgc3RydWN0IGRybV9yMTI4X2luaXQgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyM2YxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMKQEAgLTAsMCArMSw4MDEgQEAKKy8qIHIzMDBfY21kYnVmLmMgLS0gQ29tbWFuZCBidWZmZXIgZW1pc3Npb24gZm9yIFIzMDAgLSotIGxpbnV4LWMgLSotCisgKgorICogQ29weXJpZ2h0IChDKSBUaGUgV2VhdGhlciBDaGFubmVsLCBJbmMuICAyMDAyLgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5pY29sYWkgSGFlaG5sZS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhlIFdlYXRoZXIgQ2hhbm5lbCAoVE0pIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyB0byBkZXZlbG9wIHRoZQorICogaW5pdGlhbCByZWxlYXNlIG9mIHRoZSBSYWRlb24gODUwMCBkcml2ZXIgdW5kZXIgdGhlIFhGcmVlODYgbGljZW5zZS4KKyAqIFRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgTmljb2xhaSBIYWVobmxlIDxwcmVmZWN0X0BnbXgubmV0PgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKyNpbmNsdWRlICJyMzAwX3JlZy5oIgorCisKKyNkZWZpbmUgUjMwMF9TSU1VTFRBTkVPVVNfQ0xJUFJFQ1RTCQk0CisKKy8qIFZhbHVlcyBmb3IgUjMwMF9SRV9DTElQUkVDVF9DTlRMIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIGNsaXByZWN0cworICovCitzdGF0aWMgY29uc3QgaW50IHIzMDBfY2xpcHJlY3RfY250bFs0XSA9IHsKKwkweEFBQUEsCisJMHhFRUVFLAorCTB4RkVGRSwKKwkweEZGRkUKK307CisKKworLyoqCisgKiBFbWl0IHVwIHRvIFIzMDBfU0lNVUxUQU5FT1VTX0NMSVBSRUNUUyBjbGlwcmVjdHMgZnJvbSB0aGUgZ2l2ZW4gY29tbWFuZAorICogYnVmZmVyLCBzdGFydGluZyB3aXRoIGluZGV4IG4uCisgKi8KK3N0YXRpYyBpbnQgcjMwMF9lbWl0X2NsaXByZWN0cyhkcm1fcmFkZW9uX3ByaXZhdGVfdCogZGV2X3ByaXYsCisJCQkgICAgICAgZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QqIGNtZGJ1ZiwKKwkJCSAgICAgICBpbnQgbikKK3sKKwlkcm1fY2xpcF9yZWN0X3QgYm94OworCWludCBucjsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKworCW5yID0gY21kYnVmLT5uYm94IC0gbjsKKwlpZiAobnIgPiBSMzAwX1NJTVVMVEFORU9VU19DTElQUkVDVFMpCisJCW5yID0gUjMwMF9TSU1VTFRBTkVPVVNfQ0xJUFJFQ1RTOworCisJRFJNX0RFQlVHKCIlaSBjbGlwcmVjdHNcbiIsIG5yKTsKKworCWlmIChucikgeworCQlCRUdJTl9SSU5HKDYgKyBucioyKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFIzMDBfUkVfQ0xJUFJFQ1RfVExfMCwgbnIqMiAtIDEgKSApOworCisJCWZvcihpID0gMDsgaSA8IG5yOyArK2kpIHsKKwkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKCZib3gsICZjbWRidWYtPmJveGVzW24raV0sIHNpemVvZihib3gpKSkgeworCQkJCURSTV9FUlJPUigiY29weSBjbGlwcmVjdCBmYXVsdGVkXG4iKTsKKwkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJfQorCisJCQlib3gueDEgPSAoYm94LngxICsgUjMwMF9DTElQUkVDVF9PRkZTRVQpICYgUjMwMF9DTElQUkVDVF9NQVNLOworCQkJYm94LnkxID0gKGJveC55MSArIFIzMDBfQ0xJUFJFQ1RfT0ZGU0VUKSAmIFIzMDBfQ0xJUFJFQ1RfTUFTSzsKKwkJCWJveC54MiA9IChib3gueDIgKyBSMzAwX0NMSVBSRUNUX09GRlNFVCkgJiBSMzAwX0NMSVBSRUNUX01BU0s7CisJCQlib3gueTIgPSAoYm94LnkyICsgUjMwMF9DTElQUkVDVF9PRkZTRVQpICYgUjMwMF9DTElQUkVDVF9NQVNLOworCisJCQlPVVRfUklORygoYm94LngxIDw8IFIzMDBfQ0xJUFJFQ1RfWF9TSElGVCkgfAorCQkJCQkoYm94LnkxIDw8IFIzMDBfQ0xJUFJFQ1RfWV9TSElGVCkpOworCQkJT1VUX1JJTkcoKGJveC54MiA8PCBSMzAwX0NMSVBSRUNUX1hfU0hJRlQpIHwKKwkJCQkJKGJveC55MiA8PCBSMzAwX0NMSVBSRUNUX1lfU0hJRlQpKTsKKwkJfQorCisJCU9VVF9SSU5HX1JFRyggUjMwMF9SRV9DTElQUkVDVF9DTlRMLCByMzAwX2NsaXByZWN0X2NudGxbbnItMV0gKTsKKworCQkvKiBUT0RPL1NFQ1VSSVRZOiBGb3JjZSBzY2lzc29ycyB0byBhIHNhZmUgdmFsdWUsIG90aGVyd2lzZSB0aGUKKwkJKiBjbGllbnQgbWlnaHQgYmUgYWJsZSB0byB0cmFtcGxlIG92ZXIgbWVtb3J5LgorCQkqIFRoZSBpbXBhY3Qgc2hvdWxkIGJlIHZlcnkgbGltaXRlZCwgYnV0IEknZCByYXRoZXIgYmUgc2FmZSB0aGFuCisJCSogc29ycnkuCisJCSovCisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSMzAwX1JFX1NDSVNTT1JTX1RMLCAxICkgKTsKKwkJT1VUX1JJTkcoIDAgKTsKKwkJT1VUX1JJTkcoIFIzMDBfU0NJU1NPUlNfWF9NQVNLIHwgUjMwMF9TQ0lTU09SU19ZX01BU0sgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJCX0gZWxzZSB7CisJCS8qIFdoeSB3ZSBhbGxvdyB6ZXJvIGNsaXByZWN0IHJlbmRlcmluZzoKKwkJICogVGhlcmUgYXJlIHNvbWUgY29tbWFuZHMgaW4gYSBjb21tYW5kIGJ1ZmZlciB0aGF0IG11c3QgYmUgc3VibWl0dGVkCisJCSAqIGV2ZW4gd2hlbiB0aGVyZSBhcmUgbm8gY2xpcHJlY3RzLCBlLmcuIERNQSBidWZmZXIgZGlzY2FyZAorCQkgKiBvciBzdGF0ZSBzZXR0aW5nICh0aG91Z2ggc3RhdGUgc2V0dGluZyBjb3VsZCBiZSBhdm9pZGVkIGJ5CisJCSAqIHNpbXVsYXRpbmcgYSBsb3NzIG9mIGNvbnRleHQpLgorCQkgKgorCQkgKiBOb3cgc2luY2UgdGhlIGNtZGJ1ZiBpbnRlcmZhY2UgaXMgc28gY2hhb3RpYyByaWdodCBub3cgKGFuZCBpcworCQkgKiBib3VuZCB0byByZW1haW4gdGhhdCB3YXkgZm9yIGEgYml0IHVudGlsIHRoaW5ncyBzZXR0bGUgZG93biksCisJCSAqIGl0IGlzIGJhc2ljYWxseSBpbXBvc3NpYmxlIHRvIGZpbHRlciBvdXQgdGhlIGNvbW1hbmRzIHRoYXQgYXJlCisJCSAqIG5lY2Vzc2FyeSBhbmQgdGhvc2UgdGhhdCBhcmVuJ3QuCisJCSAqCisJCSAqIFNvIEkgY2hvb3NlIHRoZSBzYWZlIHdheSBhbmQgZG9uJ3QgZG8gYW55IGZpbHRlcmluZyBhdCBhbGw7CisJCSAqIGluc3RlYWQsIEkgc2ltcGx5IHNldCB1cCB0aGUgZW5naW5lIHNvIHRoYXQgYWxsIHJlbmRlcmluZworCQkgKiBjYW4ndCBwcm9kdWNlIGFueSBmcmFnbWVudHMuCisJCSAqLworCQlCRUdJTl9SSU5HKDIpOworCQlPVVRfUklOR19SRUcoIFIzMDBfUkVfQ0xJUFJFQ1RfQ05UTCwgMCApOworCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCisJcmV0dXJuIDA7Cit9CisKK3U4ICByMzAwX3JlZ19mbGFnc1sweDEwMDAwPj4yXTsKKworCit2b2lkIHIzMDBfaW5pdF9yZWdfZmxhZ3Modm9pZCkKK3sKKwlpbnQgaTsKKwltZW1zZXQocjMwMF9yZWdfZmxhZ3MsIDAsIDB4MTAwMDA+PjIpOworCSNkZWZpbmUgQUREX1JBTkdFX01BUksocmVnLCBjb3VudCxtYXJrKSBcCisJCWZvcihpPSgocmVnKT4+Mik7aTwoKHJlZyk+PjIpKyhjb3VudCk7aSsrKVwKKwkJCXIzMDBfcmVnX2ZsYWdzW2ldfD0obWFyayk7CisJCisJI2RlZmluZSBNQVJLX1NBRkUJCTEKKwkjZGVmaW5lIE1BUktfQ0hFQ0tfT0ZGU0VUCTIKKwkKKwkjZGVmaW5lIEFERF9SQU5HRShyZWcsIGNvdW50KQlBRERfUkFOR0VfTUFSSyhyZWcsIGNvdW50LCBNQVJLX1NBRkUpCisKKwkvKiB0aGVzZSBtYXRjaCBjbWR1Y3MoKSBjb21tYW5kIGluIHIzMDBfZHJpdmVyL3IzMDAvcjMwMF9jbWRidWYuYyAqLworCUFERF9SQU5HRShSMzAwX1NFX1ZQT1JUX1hTQ0FMRSwgNik7CisJQUREX1JBTkdFKDB4MjA4MCwgMSk7CisJQUREX1JBTkdFKFIzMDBfU0VfVlRFX0NOVEwsIDIpOworCUFERF9SQU5HRSgweDIxMzQsIDIpOworCUFERF9SQU5HRSgweDIxNDAsIDEpOworCUFERF9SQU5HRShSMzAwX1ZBUF9JTlBVVF9DTlRMXzAsIDIpOworCUFERF9SQU5HRSgweDIxREMsIDEpOworCUFERF9SQU5HRSgweDIyMUMsIDEpOworCUFERF9SQU5HRSgweDIyMjAsIDQpOworCUFERF9SQU5HRSgweDIyODgsIDEpOworCUFERF9SQU5HRShSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wLCAyKTsKKwlBRERfUkFOR0UoUjMwMF9WQVBfUFZTX0NOVExfMSwgMyk7CisJQUREX1JBTkdFKFIzMDBfR0JfRU5BQkxFLCAxKTsKKwlBRERfUkFOR0UoUjMwMF9HQl9NU1BPUzAsIDUpOworCUFERF9SQU5HRShSMzAwX1RYX0VOQUJMRSwgMSk7CisJQUREX1JBTkdFKDB4NDIwMCwgNCk7CisJQUREX1JBTkdFKDB4NDIxNCwgMSk7CisJQUREX1JBTkdFKFIzMDBfUkVfUE9JTlRTSVpFLCAxKTsKKwlBRERfUkFOR0UoMHg0MjMwLCAzKTsKKwlBRERfUkFOR0UoUjMwMF9SRV9MSU5FX0NOVCwgMSk7CisJQUREX1JBTkdFKDB4NDIzOCwgMSk7CisJQUREX1JBTkdFKDB4NDI2MCwgMyk7CisJQUREX1JBTkdFKDB4NDI3NCwgNCk7CisJQUREX1JBTkdFKDB4NDI4OCwgNSk7CisJQUREX1JBTkdFKDB4NDJBMCwgMSk7CisJQUREX1JBTkdFKFIzMDBfUkVfWkJJQVNfVF9GQUNUT1IsIDQpOworCUFERF9SQU5HRSgweDQyQjQsIDEpOworCUFERF9SQU5HRShSMzAwX1JFX0NVTExfQ05UTCwgMSk7CisJQUREX1JBTkdFKDB4NDJDMCwgMik7CisJQUREX1JBTkdFKFIzMDBfUlNfQ05UTF8wLCAyKTsKKwlBRERfUkFOR0UoUjMwMF9SU19JTlRFUlBfMCwgOCk7CisJQUREX1JBTkdFKFIzMDBfUlNfUk9VVEVfMCwgOCk7CisJQUREX1JBTkdFKDB4NDNBNCwgMik7CisJQUREX1JBTkdFKDB4NDNFOCwgMSk7CisJQUREX1JBTkdFKFIzMDBfUEZTX0NOVExfMCwgMyk7CisJQUREX1JBTkdFKFIzMDBfUEZTX05PREVfMCwgNCk7CisJQUREX1JBTkdFKFIzMDBfUEZTX1RFWElfMCwgNjQpOworCUFERF9SQU5HRSgweDQ2QTQsIDUpOworCUFERF9SQU5HRShSMzAwX1BGU19JTlNUUjBfMCwgNjQpOworCUFERF9SQU5HRShSMzAwX1BGU19JTlNUUjFfMCwgNjQpOworCUFERF9SQU5HRShSMzAwX1BGU19JTlNUUjJfMCwgNjQpOworCUFERF9SQU5HRShSMzAwX1BGU19JTlNUUjNfMCwgNjQpOworCUFERF9SQU5HRSgweDRCQzAsIDEpOworCUFERF9SQU5HRSgweDRCQzgsIDMpOworCUFERF9SQU5HRShSMzAwX1BQX0FMUEhBX1RFU1QsIDIpOworCUFERF9SQU5HRSgweDRCRDgsIDEpOworCUFERF9SQU5HRShSMzAwX1BGU19QQVJBTV8wX1gsIDY0KTsKKwlBRERfUkFOR0UoMHg0RTAwLCAxKTsKKwlBRERfUkFOR0UoUjMwMF9SQjNEX0NCTEVORCwgMik7CisJQUREX1JBTkdFKFIzMDBfUkIzRF9DT0xPUk1BU0ssIDEpOworCUFERF9SQU5HRSgweDRFMTAsIDMpOworCUFERF9SQU5HRV9NQVJLKFIzMDBfUkIzRF9DT0xPUk9GRlNFVDAsIDEsIE1BUktfQ0hFQ0tfT0ZGU0VUKTsgLyogY2hlY2sgb2Zmc2V0ICovCisJQUREX1JBTkdFKFIzMDBfUkIzRF9DT0xPUlBJVENIMCwgMSk7CisJQUREX1JBTkdFKDB4NEU1MCwgOSk7CisJQUREX1JBTkdFKDB4NEU4OCwgMSk7CisJQUREX1JBTkdFKDB4NEVBMCwgMik7CisJQUREX1JBTkdFKFIzMDBfUkIzRF9aU1RFTkNJTF9DTlRMXzAsIDMpOworCUFERF9SQU5HRSgweDRGMTAsIDQpOworCUFERF9SQU5HRV9NQVJLKFIzMDBfUkIzRF9ERVBUSE9GRlNFVCwgMSwgTUFSS19DSEVDS19PRkZTRVQpOyAvKiBjaGVjayBvZmZzZXQgKi8KKwlBRERfUkFOR0UoUjMwMF9SQjNEX0RFUFRIUElUQ0gsIDEpOyAKKwlBRERfUkFOR0UoMHg0RjI4LCAxKTsKKwlBRERfUkFOR0UoMHg0RjMwLCAyKTsKKwlBRERfUkFOR0UoMHg0RjQ0LCAxKTsKKwlBRERfUkFOR0UoMHg0RjU0LCAxKTsKKworCUFERF9SQU5HRShSMzAwX1RYX0ZJTFRFUl8wLCAxNik7CisJQUREX1JBTkdFKFIzMDBfVFhfVU5LMV8wLCAxNik7CisJQUREX1JBTkdFKFIzMDBfVFhfU0laRV8wLCAxNik7CisJQUREX1JBTkdFKFIzMDBfVFhfRk9STUFUXzAsIDE2KTsKKwkJLyogVGV4dHVyZSBvZmZzZXQgaXMgZGFuZ2Vyb3VzIGFuZCBuZWVkcyBtb3JlIGNoZWNraW5nICovCisJQUREX1JBTkdFX01BUksoUjMwMF9UWF9PRkZTRVRfMCwgMTYsIE1BUktfQ0hFQ0tfT0ZGU0VUKTsKKwlBRERfUkFOR0UoUjMwMF9UWF9VTks0XzAsIDE2KTsKKwlBRERfUkFOR0UoUjMwMF9UWF9CT1JERVJfQ09MT1JfMCwgMTYpOworCisJLyogU3BvcmFkaWMgcmVnaXN0ZXJzIHVzZWQgYXMgcHJpbWl0aXZlcyBhcmUgZW1pdHRlZCAqLworCUFERF9SQU5HRSgweDRmMTgsIDEpOworCUFERF9SQU5HRShSMzAwX1JCM0RfRFNUQ0FDSEVfQ1RMU1RBVCwgMSk7CisJQUREX1JBTkdFKFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMCwgOCk7CisJQUREX1JBTkdFKFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfMCwgOCk7CisKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfY2hlY2tfcmFuZ2UodW5zaWduZWQgIHJlZywgaW50IGNvdW50KQoreworCWludCBpOworCWlmKHJlZyAmIH4weGZmZmYpcmV0dXJuIC0xOworCWZvcihpPShyZWc+PjIpO2k8KHJlZz4+MikrY291bnQ7aSsrKQorCQlpZihyMzAwX3JlZ19mbGFnc1tpXSE9TUFSS19TQUZFKXJldHVybiAxOworCXJldHVybiAwOworfQorCisgIC8qIHdlIGV4cGVjdCBvZmZzZXRzIHBhc3NlZCB0byB0aGUgZnJhbWVidWZmZXIgdG8gYmUgZWl0aGVyIHdpdGhpbiB2aWRlbyBtZW1vcnkgb3IKKyAgICAgIHdpdGhpbiBBR1Agc3BhY2UgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2NoZWNrX29mZnNldChkcm1fcmFkZW9uX3ByaXZhdGVfdCogZGV2X3ByaXYsIHUzMiBvZmZzZXQpCit7CisJLyogd2UgcmVhbHkgd2FudCB0byBjaGVjayBhZ2FpbnN0IGVuZCBvZiB2aWRlbyBhcGVydHVyZQorCQlidXQgdGhpcyB2YWx1ZSBpcyBub3QgYmVpbmcga2VwdC4gCisJCVRoaXMgY29kZSBpcyBjb3JyZWN0IGZvciBub3cgKGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGhlCisJCWNvZGUgdGhhdCBzZXRzIE1DX0ZCX0xPQ0FUSU9OKSBpbiByYWRlb25fY3AuYyAqLworCWlmKChvZmZzZXQ+PWRldl9wcml2LT5mYl9sb2NhdGlvbikgJiYgCisJCShvZmZzZXQ8ZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQpKXJldHVybiAwOworCWlmKChvZmZzZXQ+PWRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0KSAmJgorCQkgKG9mZnNldDxkZXZfcHJpdi0+Z2FydF92bV9zdGFydCtkZXZfcHJpdi0+Z2FydF9zaXplKSlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfZW1pdF9jYXJlZnVsbHlfY2hlY2tlZF9wYWNrZXQwKGRybV9yYWRlb25fcHJpdmF0ZV90KiBkZXZfcHJpdiwKKwkJCQkJCWRybV9yYWRlb25fY21kX2J1ZmZlcl90KiBjbWRidWYsCisJCQkJCQlkcm1fcjMwMF9jbWRfaGVhZGVyX3QgaGVhZGVyKQoreworCWludCByZWc7CisJaW50IHN6OworCWludCBpOworCWludCB2YWx1ZXNbNjRdOworCVJJTkdfTE9DQUxTOworCisJc3ogPSBoZWFkZXIucGFja2V0MC5jb3VudDsKKwlyZWcgPSAoaGVhZGVyLnBhY2tldDAucmVnaGkgPDwgOCkgfCBoZWFkZXIucGFja2V0MC5yZWdsbzsKKwkKKwlpZigoc3o+NjQpfHwoc3o8MCkpeworCQlEUk1fRVJST1IoIkNhbm5vdCBlbWl0IG1vcmUgdGhhbiA2NCB2YWx1ZXMgYXQgYSB0aW1lIChyZWc9JTA0eCBzej0lZClcbiIsIHJlZywgc3opOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJZm9yKGk9MDtpPHN6O2krKyl7CisJCXZhbHVlc1tpXT0oKGludCBfX3VzZXIqKWNtZGJ1Zi0+YnVmKVtpXTsKKwkJc3dpdGNoKHIzMDBfcmVnX2ZsYWdzWyhyZWc+PjIpK2ldKXsKKwkJY2FzZSBNQVJLX1NBRkU6CisJCQlicmVhazsKKwkJY2FzZSBNQVJLX0NIRUNLX09GRlNFVDoKKwkJCWlmKHIzMDBfY2hlY2tfb2Zmc2V0KGRldl9wcml2LCAodTMyKXZhbHVlc1tpXSkpeworCQkJCURSTV9FUlJPUigiT2Zmc2V0IGZhaWxlZCByYW5nZSBjaGVjayAocmVnPSUwNHggc3o9JWQpXG4iLCByZWcsIHN6KTsKKwkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFJNX0VSUk9SKCJSZWdpc3RlciAlMDR4IGZhaWxlZCBjaGVjayBhcyBmbGFnPSUwMnhcbiIsIHJlZytpKjQsIHIzMDBfcmVnX2ZsYWdzWyhyZWc+PjIpK2ldKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCQl9CisJCX0KKwkJCisJQkVHSU5fUklORygxK3N6KTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggcmVnLCBzei0xICkgKTsKKwlPVVRfUklOR19UQUJMRSggdmFsdWVzLCBzeiApOworCUFEVkFOQ0VfUklORygpOworCisJY21kYnVmLT5idWYgKz0gc3oqNDsKKwljbWRidWYtPmJ1ZnN6IC09IHN6KjQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBFbWl0cyBhIHBhY2tldDAgc2V0dGluZyBhcmJpdHJhcnkgcmVnaXN0ZXJzLgorICogQ2FsbGVkIGJ5IHIzMDBfZG9fY3BfY21kYnVmLgorICoKKyAqIE5vdGUgdGhhdCBjaGVja3MgYXJlIHBlcmZvcm1lZCBvbiBjb250ZW50cyBhbmQgYWRkcmVzc2VzIG9mIHRoZSByZWdpc3RlcnMKKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfZW1pdF9wYWNrZXQwKGRybV9yYWRlb25fcHJpdmF0ZV90KiBkZXZfcHJpdiwKKwkJCQkJCWRybV9yYWRlb25fY21kX2J1ZmZlcl90KiBjbWRidWYsCisJCQkJCQlkcm1fcjMwMF9jbWRfaGVhZGVyX3QgaGVhZGVyKQoreworCWludCByZWc7CisJaW50IHN6OworCVJJTkdfTE9DQUxTOworCisJc3ogPSBoZWFkZXIucGFja2V0MC5jb3VudDsKKwlyZWcgPSAoaGVhZGVyLnBhY2tldDAucmVnaGkgPDwgOCkgfCBoZWFkZXIucGFja2V0MC5yZWdsbzsKKworCWlmICghc3opCisJCXJldHVybiAwOworCisJaWYgKHN6KjQgPiBjbWRidWYtPmJ1ZnN6KQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQkKKwlpZiAocmVnK3N6KjQgPj0gMHgxMDAwMCl7CisJCURSTV9FUlJPUigiTm8gc3VjaCByZWdpc3RlcnMgaW4gaGFyZHdhcmUgcmVnPSUwNHggc3o9JWRcbiIsIHJlZywgc3opOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisKKwlpZihyMzAwX2NoZWNrX3JhbmdlKHJlZywgc3opKXsKKwkJLyogZ28gYW5kIGNoZWNrIGV2ZXJ5dGhpbmcgKi8KKwkJcmV0dXJuIHIzMDBfZW1pdF9jYXJlZnVsbHlfY2hlY2tlZF9wYWNrZXQwKGRldl9wcml2LCBjbWRidWYsIGhlYWRlcik7CisJCX0KKwkvKiB0aGUgcmVzdCBvZiB0aGUgZGF0YSBpcyBzYWZlIHRvIGVtaXQsIHdoYXRldmVyIHRoZSB2YWx1ZXMgdGhlIHVzZXIgcGFzc2VkICovCisKKwlCRUdJTl9SSU5HKDErc3opOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCByZWcsIHN6LTEgKSApOworCU9VVF9SSU5HX1RBQkxFKCAoaW50IF9fdXNlciopY21kYnVmLT5idWYsIHN6ICk7CisJQURWQU5DRV9SSU5HKCk7CisKKwljbWRidWYtPmJ1ZiArPSBzeio0OworCWNtZGJ1Zi0+YnVmc3ogLT0gc3oqNDsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogVXBsb2FkcyB1c2VyLXN1cHBsaWVkIHZlcnRleCBwcm9ncmFtIGluc3RydWN0aW9ucyBvciBwYXJhbWV0ZXJzIG9udG8KKyAqIHRoZSBncmFwaGljcyBjYXJkLgorICogQ2FsbGVkIGJ5IHIzMDBfZG9fY3BfY21kYnVmLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcjMwMF9lbWl0X3ZwdShkcm1fcmFkZW9uX3ByaXZhdGVfdCogZGV2X3ByaXYsCisJCQkJICAgIGRybV9yYWRlb25fY21kX2J1ZmZlcl90KiBjbWRidWYsCisJCQkJICAgIGRybV9yMzAwX2NtZF9oZWFkZXJfdCBoZWFkZXIpCit7CisJaW50IHN6OworCWludCBhZGRyOworCVJJTkdfTE9DQUxTOworCisJc3ogPSBoZWFkZXIudnB1LmNvdW50OworCWFkZHIgPSAoaGVhZGVyLnZwdS5hZHJoaSA8PCA4KSB8IGhlYWRlci52cHUuYWRybG87CisKKwlpZiAoIXN6KQorCQlyZXR1cm4gMDsKKwlpZiAoc3oqMTYgPiBjbWRidWYtPmJ1ZnN6KQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJQkVHSU5fUklORyg1K3N6KjQpOworCS8qIFdhaXQgZm9yIFZBUCB0byBjb21lIHRvIHNlbnNlcy4uICovCisJLyogdGhlcmUgaXMgbm8gbmVlZCB0byBlbWl0IGl0IG11bHRpcGxlIHRpbWVzLCAob25seSBvbmNlIGJlZm9yZSBWQVAgaXMgcHJvZ3JhbW1lZCwKKwkgICBidXQgdGhpcyBvcHRpbWl6YXRpb24gaXMgZm9yIGxhdGVyICovCisJT1VUX1JJTkdfUkVHKCBSMzAwX1ZBUF9QVlNfV0FJVElETEUsIDAgKTsKKwlPVVRfUklOR19SRUcoIFIzMDBfVkFQX1BWU19VUExPQURfQUREUkVTUywgYWRkciApOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwX1RBQkxFKCBSMzAwX1ZBUF9QVlNfVVBMT0FEX0RBVEEsIHN6KjQgLSAxICkgKTsKKwlPVVRfUklOR19UQUJMRSggKGludCBfX3VzZXIqKWNtZGJ1Zi0+YnVmLCBzeio0ICk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKworCWNtZGJ1Zi0+YnVmICs9IHN6KjE2OworCWNtZGJ1Zi0+YnVmc3ogLT0gc3oqMTY7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIEVtaXQgYSBjbGVhciBwYWNrZXQgZnJvbSB1c2Vyc3BhY2UuCisgKiBDYWxsZWQgYnkgcjMwMF9lbWl0X3BhY2tldDMuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfY2xlYXIoZHJtX3JhZGVvbl9wcml2YXRlX3QqIGRldl9wcml2LAorCQkJCSAgICAgIGRybV9yYWRlb25fY21kX2J1ZmZlcl90KiBjbWRidWYpCit7CisJUklOR19MT0NBTFM7CisKKwlpZiAoOCo0ID4gY21kYnVmLT5idWZzeikKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCUJFR0lOX1JJTkcoMTApOworCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSMjAwXzNEX0RSQVdfSU1NRF8yLCA4ICkgKTsKKwlPVVRfUklORyggUjMwMF9QUklNX1RZUEVfUE9JTlR8UjMwMF9QUklNX1dBTEtfUklOR3wKKwkgICAgICAgICAgKDE8PFIzMDBfUFJJTV9OVU1fVkVSVElDRVNfU0hJRlQpICk7CisJT1VUX1JJTkdfVEFCTEUoIChpbnQgX191c2VyKiljbWRidWYtPmJ1ZiwgOCApOworCUFEVkFOQ0VfUklORygpOworCisJY21kYnVmLT5idWYgKz0gOCo0OworCWNtZGJ1Zi0+YnVmc3ogLT0gOCo0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfM2RfbG9hZF92YnBudHIoZHJtX3JhZGVvbl9wcml2YXRlX3QqIGRldl9wcml2LAorCQkJCSAgICAgIGRybV9yYWRlb25fY21kX2J1ZmZlcl90KiBjbWRidWYsCisJCQkJICAgICAgdTMyIGhlYWRlcikKK3sKKwlpbnQgY291bnQsIGksazsKKwkjZGVmaW5lIE1BWF9BUlJBWV9QQUNLRVQgIDY0CisJdTMyIHBheWxvYWRbTUFYX0FSUkFZX1BBQ0tFVF07CisJdTMyIG5hcnJheXM7CisJUklOR19MT0NBTFM7CisKKwljb3VudD0oaGVhZGVyPj4xNikgJiAweDNmZmY7CisJCisJaWYoKGNvdW50KzEpPk1BWF9BUlJBWV9QQUNLRVQpeworCQlEUk1fRVJST1IoIlRvbyBsYXJnZSBwYXlsb2FkIGluIDNEX0xPQURfVkJQTlRSIChjb3VudD0lZClcbiIsIGNvdW50KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCW1lbXNldChwYXlsb2FkLCAwLCBNQVhfQVJSQVlfUEFDS0VUKjQpOworCW1lbWNweShwYXlsb2FkLCBjbWRidWYtPmJ1Zis0LCAoY291bnQrMSkqNCk7CQorCQorCS8qIGNhcmVmdWxseSBjaGVjayBwYWNrZXQgY29udGVudHMgKi8KKwkKKwluYXJyYXlzPXBheWxvYWRbMF07CisJaz0wOworCWk9MTsKKwl3aGlsZSgoazxuYXJyYXlzKSAmJiAoaTwoY291bnQrMSkpKXsKKwkJaSsrOyAvKiBza2lwIGF0dHJpYnV0ZSBmaWVsZCAqLworCQlpZihyMzAwX2NoZWNrX29mZnNldChkZXZfcHJpdiwgcGF5bG9hZFtpXSkpeworCQkJRFJNX0VSUk9SKCJPZmZzZXQgZmFpbGVkIHJhbmdlIGNoZWNrIChrPSVkIGk9JWQpIHdoaWxlIHByb2Nlc3NpbmcgM0RfTE9BRF9WQlBOVFIgcGFja2V0LlxuIiwgaywgaSk7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQkJfQorCQlrKys7CisJCWkrKzsKKwkJaWYoaz09bmFycmF5cylicmVhazsKKwkJLyogaGF2ZSBvbmUgbW9yZSB0byBwcm9jZXNzLCB0aGV5IGNvbWUgaW4gcGFpcnMgKi8KKwkJaWYocjMwMF9jaGVja19vZmZzZXQoZGV2X3ByaXYsIHBheWxvYWRbaV0pKXsKKwkJCURSTV9FUlJPUigiT2Zmc2V0IGZhaWxlZCByYW5nZSBjaGVjayAoaz0lZCBpPSVkKSB3aGlsZSBwcm9jZXNzaW5nIDNEX0xPQURfVkJQTlRSIHBhY2tldC5cbiIsIGssIGkpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJCX0KKwkJaysrOworCQlpKys7CQkJCisJCX0KKwkvKiBkbyB0aGUgY291bnRzIG1hdGNoIHdoYXQgd2UgZXhwZWN0ID8gKi8KKwlpZigoayE9bmFycmF5cykgfHwgKGkhPShjb3VudCsxKSkpeworCQlEUk1fRVJST1IoIk1hbGZvcm1lZCAzRF9MT0FEX1ZCUE5UUiBwYWNrZXQgKGs9JWQgaT0lZCBuYXJyYXlzPSVkIGNvdW50KzE9JWQpLlxuIiwgaywgaSwgbmFycmF5cywgY291bnQrMSk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKworCS8qIGFsbCBjbGVhciwgb3V0cHV0IHBhY2tldCAqLworCisJQkVHSU5fUklORyhjb3VudCsyKTsKKwlPVVRfUklORyhoZWFkZXIpOworCU9VVF9SSU5HX1RBQkxFKHBheWxvYWQsIGNvdW50KzEpOworCUFEVkFOQ0VfUklORygpOworCisJY21kYnVmLT5idWYgKz0gKGNvdW50KzIpKjQ7CisJY21kYnVmLT5idWZzeiAtPSAoY291bnQrMikqNDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcjMwMF9lbWl0X3Jhd19wYWNrZXQzKGRybV9yYWRlb25fcHJpdmF0ZV90KiBkZXZfcHJpdiwKKwkJCQkgICAgICBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCogY21kYnVmKQoreworCXUzMiBoZWFkZXI7CisJaW50IGNvdW50OworCVJJTkdfTE9DQUxTOworCisJaWYgKDQgPiBjbWRidWYtPmJ1ZnN6KQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisgICAgICAgIC8qIEZpeG1lICEhIFRoaXMgc2ltcGx5IGVtaXRzIGEgcGFja2V0IHdpdGhvdXQgbXVjaCBjaGVja2luZy4KKwkgICBXZSBuZWVkIHRvIGJlIHNtYXJ0ZXIuICovCisKKwkvKiBvYnRhaW4gZmlyc3Qgd29yZCAtIGFjdHVhbCBwYWNrZXQzIGhlYWRlciAqLworCWhlYWRlciA9ICoodTMyIF9fdXNlciopY21kYnVmLT5idWY7CisKKwkvKiBJcyBpdCBwYWNrZXQgMyA/ICovCisJaWYoIChoZWFkZXI+PjMwKSE9MHgzICkgeworCQlEUk1fRVJST1IoIk5vdCBhIHBhY2tldDMgaGVhZGVyICgweCUwOHgpXG4iLCBoZWFkZXIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisKKwljb3VudD0oaGVhZGVyPj4xNikgJiAweDNmZmY7CisKKwkvKiBDaGVjayBhZ2FpbiBub3cgdGhhdCB3ZSBrbm93IGhvdyBtdWNoIGRhdGEgdG8gZXhwZWN0ICovCisJaWYgKChjb3VudCsyKSo0ID4gY21kYnVmLT5idWZzeil7CisJCURSTV9FUlJPUigiRXhwZWN0ZWQgcGFja2V0MyBvZiBsZW5ndGggJWQgYnV0IGhhdmUgb25seSAlZCBieXRlcyBsZWZ0XG4iLAorCQkJKGNvdW50KzIpKjQsIGNtZGJ1Zi0+YnVmc3opOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisKKwkvKiBJcyBpdCBhIHBhY2tldCB0eXBlIHdlIGtub3cgYWJvdXQgPyAqLworCXN3aXRjaChoZWFkZXIgJiAweGZmMDApeworCWNhc2UgUkFERU9OXzNEX0xPQURfVkJQTlRSOiAvKiBsb2FkIHZlcnRleCBhcnJheSBwb2ludGVycyAqLworCQlyZXR1cm4gcjMwMF9lbWl0XzNkX2xvYWRfdmJwbnRyKGRldl9wcml2LCBjbWRidWYsIGhlYWRlcik7CisKKwljYXNlIFJBREVPTl9DUF8zRF9EUkFXX0lNTURfMjogLyogdHJpZ2dlcnMgZHJhd2luZyB1c2luZyBpbi1wYWNrZXQgdmVydGV4IGRhdGEgKi8KKwljYXNlIFJBREVPTl9DUF8zRF9EUkFXX1ZCVUZfMjogLyogdHJpZ2dlcnMgZHJhd2luZyBvZiB2ZXJ0ZXggYnVmZmVycyBzZXR1cCBlbHNld2hlcmUgKi8KKwljYXNlIFJBREVPTl9DUF8zRF9EUkFXX0lORFhfMjogLyogdHJpZ2dlcnMgZHJhd2luZyB1c2luZyBpbmRpY2VzIHRvIHZlcnRleCBidWZmZXIgKi8KKwljYXNlIFJBREVPTl9DUF9JTkRYX0JVRkZFUjogLyogRFJBV19JTkRYXzIgd2l0aG91dCBJTkRYX0JVRkZFUiBzZWVtcyB0byBsb2NrIHVwIHRoZSBncHUgKi8KKwljYXNlIFJBREVPTl9XQUlUX0ZPUl9JRExFOgorCWNhc2UgUkFERU9OX0NQX05PUDoKKwkJLyogdGhlc2UgcGFja2V0cyBhcmUgc2FmZSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIlVua25vd24gcGFja2V0MyBoZWFkZXIgKDB4JTA4eClcbiIsIGhlYWRlcik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKworCisJQkVHSU5fUklORyhjb3VudCsyKTsKKwlPVVRfUklORyhoZWFkZXIpOworCU9VVF9SSU5HX1RBQkxFKCAoaW50IF9fdXNlciopKGNtZGJ1Zi0+YnVmKzQpLCBjb3VudCsxKTsKKwlBRFZBTkNFX1JJTkcoKTsKKworCWNtZGJ1Zi0+YnVmICs9IChjb3VudCsyKSo0OworCWNtZGJ1Zi0+YnVmc3ogLT0gKGNvdW50KzIpKjQ7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIEVtaXQgYSByZW5kZXJpbmcgcGFja2V0MyBmcm9tIHVzZXJzcGFjZS4KKyAqIENhbGxlZCBieSByMzAwX2RvX2NwX2NtZGJ1Zi4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfZW1pdF9wYWNrZXQzKGRybV9yYWRlb25fcHJpdmF0ZV90KiBkZXZfcHJpdiwKKwkJCQkJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QqIGNtZGJ1ZiwKKwkJCQkJZHJtX3IzMDBfY21kX2hlYWRlcl90IGhlYWRlcikKK3sKKwlpbnQgbjsKKwlpbnQgcmV0OworCWNoYXIgX191c2VyKiBvcmlnX2J1ZiA9IGNtZGJ1Zi0+YnVmOworCWludCBvcmlnX2J1ZnN6ID0gY21kYnVmLT5idWZzejsKKworCS8qIFRoaXMgaXMgYSBkby13aGlsZS1sb29wIHNvIHRoYXQgd2UgcnVuIHRoZSBpbnRlcmlvciBhdCBsZWFzdCBvbmNlLAorCSAqIGV2ZW4gaWYgY21kYnVmLT5uYm94IGlzIDAuIENvbXBhcmUgcjMwMF9lbWl0X2NsaXByZWN0cyBmb3IgcmF0aW9uYWxlLgorCSAqLworCW4gPSAwOworCWRvIHsKKwkJaWYgKGNtZGJ1Zi0+bmJveCA+IFIzMDBfU0lNVUxUQU5FT1VTX0NMSVBSRUNUUykgeworCQkJcmV0ID0gcjMwMF9lbWl0X2NsaXByZWN0cyhkZXZfcHJpdiwgY21kYnVmLCBuKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJY21kYnVmLT5idWYgPSBvcmlnX2J1ZjsKKwkJCWNtZGJ1Zi0+YnVmc3ogPSBvcmlnX2J1ZnN6OworCQkJfQorCisJCXN3aXRjaChoZWFkZXIucGFja2V0My5wYWNrZXQpIHsKKwkJY2FzZSBSMzAwX0NNRF9QQUNLRVQzX0NMRUFSOgorCQkJRFJNX0RFQlVHKCJSMzAwX0NNRF9QQUNLRVQzX0NMRUFSXG4iKTsKKwkJCXJldCA9IHIzMDBfZW1pdF9jbGVhcihkZXZfcHJpdiwgY21kYnVmKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlEUk1fRVJST1IoInIzMDBfZW1pdF9jbGVhciBmYWlsZWRcbiIpOworCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSMzAwX0NNRF9QQUNLRVQzX1JBVzoKKwkJCURSTV9ERUJVRygiUjMwMF9DTURfUEFDS0VUM19SQVdcbiIpOworCQkJcmV0ID0gcjMwMF9lbWl0X3Jhd19wYWNrZXQzKGRldl9wcml2LCBjbWRidWYpOworCQkJaWYgKHJldCkgeworCQkJCURSTV9FUlJPUigicjMwMF9lbWl0X3Jhd19wYWNrZXQzIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJRFJNX0VSUk9SKCJiYWQgcGFja2V0MyB0eXBlICVpIGF0ICVwXG4iLAorCQkJCWhlYWRlci5wYWNrZXQzLnBhY2tldCwKKwkJCQljbWRidWYtPmJ1ZiAtIHNpemVvZihoZWFkZXIpKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCQl9CisKKwkJbiArPSBSMzAwX1NJTVVMVEFORU9VU19DTElQUkVDVFM7CisJfSB3aGlsZShuIDwgY21kYnVmLT5uYm94KTsKKworCXJldHVybiAwOworfQorCisvKiBTb21lIG9mIHRoZSBSMzAwIGNoaXBzIHNlZW0gdG8gYmUgZXh0cmVtZWx5IHRvdWNoeSBhYm91dCB0aGUgdHdvIHJlZ2lzdGVycworICogdGhhdCBhcmUgY29uZmlndXJlZCBpbiByMzAwX3BhY2lmeS4KKyAqIEFtb25nIHRoZSB3b3JzdCBvZmZlbmRlcnMgc2VlbXMgdG8gYmUgdGhlIFIzMDAgTkQgKDB4NEU0NCk6IFdoZW4gdXNlcnNwYWNlCisgKiBzZW5kcyBhIGNvbW1hbmQgYnVmZmVyIHRoYXQgY29udGFpbnMgb25seSBzdGF0ZSBzZXR0aW5nIGNvbW1hbmRzIGFuZCBhCisgKiB2ZXJ0ZXggcHJvZ3JhbS9wYXJhbWV0ZXIgdXBsb2FkIHNlcXVlbmNlLCB0aGlzIHdpbGwgZXZlbnR1YWxseSBsZWFkIHRvIGEKKyAqIGxvY2t1cCwgdW5sZXNzIHRoZSBzZXF1ZW5jZSBpcyBicmFja2V0ZWQgYnkgY2FsbHMgdG8gcjMwMF9wYWNpZnkuCisgKiBTbyB3ZSBzaG91bGQgdGFrZSBncmVhdCBjYXJlIHRvICphbHdheXMqIGNhbGwgcjMwMF9wYWNpZnkgYmVmb3JlCisgKiAqYW55dGhpbmcqIDNEIHJlbGF0ZWQsIGFuZCBhZ2FpbiBhZnRlcndhcmRzLiBUaGlzIGlzIHdoYXQgdGhlCisgKiBjYWxsIGJyYWNrZXQgaW4gcjMwMF9kb19jcF9jbWRidWYgaXMgZm9yLgorICovCisKKy8qKgorICogRW1pdCB0aGUgc2VxdWVuY2UgdG8gcGFjaWZ5IFIzMDAuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjMwMF9wYWNpZnkoZHJtX3JhZGVvbl9wcml2YXRlX3QqIGRldl9wcml2KQoreworCVJJTkdfTE9DQUxTOworCisJQkVHSU5fUklORyg2KTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUjMwMF9SQjNEX0RTVENBQ0hFX0NUTFNUQVQsIDAgKSApOworCU9VVF9SSU5HKCAweGEgKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggMHg0ZjE4LCAwICkgKTsKKwlPVVRfUklORyggMHgzICk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl9DUF9OT1AsIDAgKSApOworCU9VVF9SSU5HKCAweDAgKTsKKwlBRFZBTkNFX1JJTkcoKTsKK30KKworCisvKioKKyAqIENhbGxlZCBieSByMzAwX2RvX2NwX2NtZGJ1ZiB0byB1cGRhdGUgdGhlIGludGVybmFsIGJ1ZmZlciBhZ2UgYW5kIHN0YXRlLgorICogVGhlIGFjdHVhbCBhZ2UgZW1pdCBpcyBkb25lIGJ5IHIzMDBfZG9fY3BfY21kYnVmLCB3aGljaCBpcyB3aHkgeW91IG11c3QKKyAqIGJlIGNhcmVmdWwgYWJvdXQgaG93IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICovCitzdGF0aWMgdm9pZCByMzAwX2Rpc2NhcmRfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwlidWZfcHJpdi0+YWdlID0gKytkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaDsKKwlidWYtPnBlbmRpbmcgPSAxOworCWJ1Zi0+dXNlZCA9IDA7Cit9CisKKworLyoqCisgKiBQYXJzZXMgYW5kIHZhbGlkYXRlcyBhIHVzZXItc3VwcGxpZWQgY29tbWFuZCBidWZmZXIgYW5kIGVtaXRzIGFwcHJvcHJpYXRlCisgKiBjb21tYW5kcyBvbiB0aGUgRE1BIHJpbmcgYnVmZmVyLgorICogQ2FsbGVkIGJ5IHRoZSBpb2N0bCBoYW5kbGVyIGZ1bmN0aW9uIHJhZGVvbl9jcF9jbWRidWYuCisgKi8KK2ludCByMzAwX2RvX2NwX2NtZGJ1Zihkcm1fZGV2aWNlX3QqIGRldiwKKwkJCSAgRFJNRklMRSBmaWxwLAorCQkgICAgICBkcm1fZmlsZV90KiBmaWxwX3ByaXYsCisJCSAgICAgIGRybV9yYWRlb25fY21kX2J1ZmZlcl90KiBjbWRidWYpCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgICAgICAgZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisgICAgICAgIGRybV9idWZfdCAqYnVmID0gTlVMTDsKKwlpbnQgZW1pdF9kaXNwYXRjaF9hZ2UgPSAwOworCWludCByZXQgPSAwOworCisJRFJNX0RFQlVHKCJcbiIpOworCisJLyogU2VlIHRoZSBjb21tZW50IGFib3ZlIHIzMDBfZW1pdF9iZWdpbjNkIGZvciB3aHkgdGhpcyBjYWxsIG11c3QgYmUgaGVyZSwKKwkgKiBhbmQgd2hhdCB0aGUgY2xlYW51cCBnb3RvcyBhcmUgZm9yLiAqLworCXIzMDBfcGFjaWZ5KGRldl9wcml2KTsKKworCWlmIChjbWRidWYtPm5ib3ggPD0gUjMwMF9TSU1VTFRBTkVPVVNfQ0xJUFJFQ1RTKSB7CisJCXJldCA9IHIzMDBfZW1pdF9jbGlwcmVjdHMoZGV2X3ByaXYsIGNtZGJ1ZiwgMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCXdoaWxlKGNtZGJ1Zi0+YnVmc3ogPj0gc2l6ZW9mKGRybV9yMzAwX2NtZF9oZWFkZXJfdCkpIHsKKwkJaW50IGlkeDsKKwkJZHJtX3IzMDBfY21kX2hlYWRlcl90IGhlYWRlcjsKKworCQloZWFkZXIudSA9ICoodW5zaWduZWQgaW50ICopY21kYnVmLT5idWY7CisKKwkJY21kYnVmLT5idWYgKz0gc2l6ZW9mKGhlYWRlcik7CisJCWNtZGJ1Zi0+YnVmc3ogLT0gc2l6ZW9mKGhlYWRlcik7CisKKwkJc3dpdGNoKGhlYWRlci5oZWFkZXIuY21kX3R5cGUpIHsKKwkJY2FzZSBSMzAwX0NNRF9QQUNLRVQwOiAKKwkJCURSTV9ERUJVRygiUjMwMF9DTURfUEFDS0VUMFxuIik7CisJCQlyZXQgPSByMzAwX2VtaXRfcGFja2V0MChkZXZfcHJpdiwgY21kYnVmLCBoZWFkZXIpOworCQkJaWYgKHJldCkgeworCQkJCURSTV9FUlJPUigicjMwMF9lbWl0X3BhY2tldDAgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSMzAwX0NNRF9WUFU6CisJCQlEUk1fREVCVUcoIlIzMDBfQ01EX1ZQVVxuIik7CisJCQlyZXQgPSByMzAwX2VtaXRfdnB1KGRldl9wcml2LCBjbWRidWYsIGhlYWRlcik7CisJCQlpZiAocmV0KSB7CisJCQkJRFJNX0VSUk9SKCJyMzAwX2VtaXRfdnB1IGZhaWxlZFxuIik7CisJCQkJZ290byBjbGVhbnVwOworCQkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUjMwMF9DTURfUEFDS0VUMzoKKwkJCURSTV9ERUJVRygiUjMwMF9DTURfUEFDS0VUM1xuIik7CisJCQlyZXQgPSByMzAwX2VtaXRfcGFja2V0MyhkZXZfcHJpdiwgY21kYnVmLCBoZWFkZXIpOworCQkJaWYgKHJldCkgeworCQkJCURSTV9FUlJPUigicjMwMF9lbWl0X3BhY2tldDMgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSMzAwX0NNRF9FTkQzRDoKKwkJCURSTV9ERUJVRygiUjMwMF9DTURfRU5EM0RcbiIpOworCQkJLyogVE9ETzogCisJCQkJSWRlYWxseSB1c2Vyc3BhY2UgZHJpdmVyIHNob3VsZCBub3QgbmVlZCB0byBpc3N1ZSB0aGlzIGNhbGwsIAorCQkJCWkuZS4gdGhlIGRybSBkcml2ZXIgc2hvdWxkIGlzc3VlIGl0IGF1dG9tYXRpY2FsbHkgYW5kIHByZXZlbnQKKwkJCQlsb2NrdXBzLgorCQkJCQorCQkJCUluIHByYWN0aWNlLCB3ZSBkbyBub3QgdW5kZXJzdGFuZCB3aHkgdGhpcyBjYWxsIGlzIG5lZWRlZCBhbmQgd2hhdAorCQkJCWl0IGRvZXMgKGV4Y2VwdCBmb3Igc29tZSB2YWd1ZSBndWVzc2VzIHRoYXQgaXQgaGFzIHRvIGRvIHdpdGggY2FjaGUKKwkJCQljb2hlcmVuY2UpIGFuZCBzbyB0aGUgdXNlciBzcGFjZSBkcml2ZXIgZG9lcyBpdC4gCisJCQkJCisJCQkJT25jZSB3ZSBhcmUgc3VyZSB3aGljaCB1c2VzIHByZXZlbnQgbG9ja3VwcyB0aGUgY29kZSBjb3VsZCBiZSBtb3ZlZAorCQkJCWludG8gdGhlIGtlcm5lbCBhbmQgdGhlIHVzZXJzcGFjZSBkcml2ZXIgd2lsbCBub3QKKwkJCQluZWVkIHRvIHVzZSB0aGlzIGNvbW1hbmQuCisKKwkJCQlOb3RlIHRoYXQgaXNzdWluZyB0aGlzIGNvbW1hbmQgZG9lcyBub3QgaHVydCBhbnl0aGluZworCQkJCWV4Y2VwdCwgcG9zc2libHksIHBlcmZvcm1hbmNlICovCisJCQlyMzAwX3BhY2lmeShkZXZfcHJpdik7CisJCQlicmVhazsKKworCQljYXNlIFIzMDBfQ01EX0NQX0RFTEFZOgorCQkJLyogc2ltcGxlIGVub3VnaCwgd2UgY2FuIGRvIGl0IGhlcmUgKi8KKwkJCURSTV9ERUJVRygiUjMwMF9DTURfQ1BfREVMQVlcbiIpOworCQkJeworCQkJCWludCBpOworCQkJCVJJTkdfTE9DQUxTOworCisJCQkJQkVHSU5fUklORyhoZWFkZXIuZGVsYXkuY291bnQpOworCQkJCWZvcihpPTA7aTxoZWFkZXIuZGVsYXkuY291bnQ7aSsrKQorCQkJCQlPVVRfUklORyhSQURFT05fQ1BfUEFDS0VUMik7CisJCQkJQURWQU5DRV9SSU5HKCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFIzMDBfQ01EX0RNQV9ESVNDQVJEOgorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX0RNQV9ESVNDQVJEXG4iKTsKKyAgICAgICAgICAgIAkJaWR4ID0gaGVhZGVyLmRtYS5idWZfaWR4OworICAgICAgICAgICAgCQlpZiAoaWR4IDwgMCB8fCBpZHggPj0gZG1hLT5idWZfY291bnQpIHsKKyAgICAgICAgICAgICAgICAJCURSTV9FUlJPUigiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIAkJCWlkeCwgZG1hLT5idWZfY291bnQgLSAxKTsKKwkJCQlyZXQgPSBEUk1fRVJSKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgCQlnb3RvIGNsZWFudXA7CisgICAgICAgICAgICAJCQl9CisKKwkgICAgICAgICAgICAgICAgYnVmID0gZG1hLT5idWZsaXN0W2lkeF07CisgICAgICAgICAgICAJCWlmIChidWYtPmZpbHAgIT0gZmlscCB8fCBidWYtPnBlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAJCURSTV9FUlJPUigiYmFkIGJ1ZmZlciAlcCAlcCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWJ1Zi0+ZmlscCwgZmlscCwgYnVmLT5wZW5kaW5nKTsKKyAgICAgICAgICAgICAgICAJCXJldCA9IERSTV9FUlIoRUlOVkFMKTsKKwkJCQlnb3RvIGNsZWFudXA7CisgICAgICAgICAgICAJCQl9CisKKwkJCWVtaXRfZGlzcGF0Y2hfYWdlID0gMTsKKwkJCXIzMDBfZGlzY2FyZF9idWZmZXIoZGV2LCBidWYpOworICAgICAgICAgICAgCQlicmVhazsKKworCQljYXNlIFIzMDBfQ01EX1dBSVQ6CisJCQkvKiBzaW1wbGUgZW5vdWdoLCB3ZSBjYW4gZG8gaXQgaGVyZSAqLworCQkJRFJNX0RFQlVHKCJSMzAwX0NNRF9XQUlUXG4iKTsKKwkJCWlmKGhlYWRlci53YWl0LmZsYWdzPT0wKWJyZWFrOyAvKiBub3RoaW5nIHRvIGRvICovCisKKwkJCXsKKwkJCQlSSU5HX0xPQ0FMUzsKKworCQkJCUJFR0lOX1JJTkcoMik7CisJCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9XQUlUX1VOVElMLCAwICkgKTsKKwkJCQlPVVRfUklORyggKGhlYWRlci53YWl0LmZsYWdzICYgMHhmKTw8MTQgKTsKKwkJCQlBRFZBTkNFX1JJTkcoKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEUk1fRVJST1IoImJhZCBjbWRfdHlwZSAlaSBhdCAlcFxuIiwKKwkJCSAgICAgICAgICBoZWFkZXIuaGVhZGVyLmNtZF90eXBlLAorCQkJCSAgY21kYnVmLT5idWYgLSBzaXplb2YoaGVhZGVyKSk7CisJCQlyZXQgPSBEUk1fRVJSKEVJTlZBTCk7CisJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJfQorCisJRFJNX0RFQlVHKCJFTkRcbiIpOworCitjbGVhbnVwOgorCXIzMDBfcGFjaWZ5KGRldl9wcml2KTsKKworCS8qIFdlIGVtaXQgdGhlIHZlcnRleCBidWZmZXIgYWdlIGhlcmUsIG91dHNpZGUgdGhlIHBhY2lmaWVyICJicmFja2V0cyIKKwkgKiBmb3IgdHdvIHJlYXNvbnM6CisJICogICgxKSBUaGlzIG1heSBjb2FsZXNjZSBtdWx0aXBsZSBhZ2UgZW1pc3Npb25zIGludG8gYSBzaW5nbGUgb25lIGFuZAorCSAqICAoMikgbW9yZSBpbXBvcnRhbnRseSwgc29tZSBjaGlwcyBsb2NrIHVwIGhhcmQgd2hlbiBzY3JhdGNoIHJlZ2lzdGVycworCSAqICAgICAgYXJlIHdyaXR0ZW4gaW5zaWRlIHRoZSBwYWNpZmllciBicmFja2V0LgorCSAqLworCWlmIChlbWl0X2Rpc3BhdGNoX2FnZSkgeworCQlSSU5HX0xPQ0FMUzsKKworCQkvKiBFbWl0IHRoZSB2ZXJ0ZXggYnVmZmVyIGFnZSAqLworCQlCRUdJTl9SSU5HKDIpOworCQlSQURFT05fRElTUEFUQ0hfQUdFKGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJCX0KKworCUNPTU1JVF9SSU5HKCk7CisKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfcmVnLmggYi9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlN2NhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9yZWcuaApAQCAtMCwwICsxLDE0MTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBOaWNvbGFpIEhhZWhubGUgZXQgYWwuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCitjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAordG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YgorbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KK3RoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CitwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCitTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCitUSEUgQVVUSE9SKFMpIEFORC9PUiBUSEVJUiBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCitEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKK09USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKK1VTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9SMzAwX1JFR19ICisjZGVmaW5lIF9SMzAwX1JFR19ICisKKyNkZWZpbmUgUjMwMF9NQ19JTklUX01JU0NfTEFUX1RJTUVSCTB4MTgwCisjCWRlZmluZSBSMzAwX01DX01JU0NfX01DX0NQUl9JTklUX0xBVF9TSElGVAkwCisjCWRlZmluZSBSMzAwX01DX01JU0NfX01DX1ZGX0lOSVRfTEFUX1NISUZUCTQKKyMJZGVmaW5lIFIzMDBfTUNfTUlTQ19fTUNfRElTUDBSX0lOSVRfTEFUX1NISUZUCTgKKyMJZGVmaW5lIFIzMDBfTUNfTUlTQ19fTUNfRElTUDFSX0lOSVRfTEFUX1NISUZUCTEyCisjCWRlZmluZSBSMzAwX01DX01JU0NfX01DX0ZJWEVEX0lOSVRfTEFUX1NISUZUCTE2CisjCWRlZmluZSBSMzAwX01DX01JU0NfX01DX0UyUl9JTklUX0xBVF9TSElGVAkyMAorIwlkZWZpbmUgUjMwMF9NQ19NSVNDX19NQ19TQU1FX1BBR0VfUFJJT19TSElGVAkyNAorIwlkZWZpbmUgUjMwMF9NQ19NSVNDX19NQ19HTE9CV19JTklUX0xBVF9TSElGVAkyOAorCisKKyNkZWZpbmUgUjMwMF9NQ19JTklUX0dGWF9MQVRfVElNRVIJMHgxNTQKKyMJZGVmaW5lIFIzMDBfTUNfTUlTQ19fTUNfRzNEMFJfSU5JVF9MQVRfU0hJRlQJMAorIwlkZWZpbmUgUjMwMF9NQ19NSVNDX19NQ19HM0QxUl9JTklUX0xBVF9TSElGVAk0CisjCWRlZmluZSBSMzAwX01DX01JU0NfX01DX0czRDJSX0lOSVRfTEFUX1NISUZUCTgKKyMJZGVmaW5lIFIzMDBfTUNfTUlTQ19fTUNfRzNEM1JfSU5JVF9MQVRfU0hJRlQJMTIKKyMJZGVmaW5lIFIzMDBfTUNfTUlTQ19fTUNfVFgwUl9JTklUX0xBVF9TSElGVAkxNgorIwlkZWZpbmUgUjMwMF9NQ19NSVNDX19NQ19UWDFSX0lOSVRfTEFUX1NISUZUCTIwCisjCWRlZmluZSBSMzAwX01DX01JU0NfX01DX0dMT0JSX0lOSVRfTEFUX1NISUZUCTI0CisjCWRlZmluZSBSMzAwX01DX01JU0NfX01DX0dMT0JXX0ZVTExfTEFUX1NISUZUCTI4CisKKy8qCitUaGlzIGZpbGUgY29udGFpbnMgcmVnaXN0ZXJzIGFuZCBjb25zdGFudHMgZm9yIHRoZSBSMzAwLiBUaGV5IGhhdmUgYmVlbgorZm91bmQgbW9zdGx5IGJ5IGV4YW1pbmluZyBjb21tYW5kIGJ1ZmZlcnMgY2FwdHVyZWQgdXNpbmcgZ2x4dGVzdCwgYXMgd2VsbAorYXMgYnkgZXh0cmFwb2xhdGluZyBzb21lIGtub3duIHJlZ2lzdGVycyBhbmQgY29uc3RhbnRzIGZyb20gdGhlIFIyMDAuCisKK0kgYW0gZmFpcmx5IGNlcnRhaW4gdGhhdCB0aGV5IGFyZSBjb3JyZWN0IHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlIGluIGNvbW1lbnRzLgorKi8KKworI2RlZmluZSBSMzAwX1NFX1ZQT1JUX1hTQ0FMRSAgICAgICAgICAgICAgICAweDFEOTgKKyNkZWZpbmUgUjMwMF9TRV9WUE9SVF9YT0ZGU0VUICAgICAgICAgICAgICAgMHgxRDlDCisjZGVmaW5lIFIzMDBfU0VfVlBPUlRfWVNDQUxFICAgICAgICAgICAgICAgIDB4MURBMAorI2RlZmluZSBSMzAwX1NFX1ZQT1JUX1lPRkZTRVQgICAgICAgICAgICAgICAweDFEQTQKKyNkZWZpbmUgUjMwMF9TRV9WUE9SVF9aU0NBTEUgICAgICAgICAgICAgICAgMHgxREE4CisjZGVmaW5lIFIzMDBfU0VfVlBPUlRfWk9GRlNFVCAgICAgICAgICAgICAgIDB4MURBQworCisKKy8qIFRoaXMgcmVnaXN0ZXIgaXMgd3JpdHRlbiBkaXJlY3RseSBhbmQgYWxzbyBzdGFydHMgZGF0YSBzZWN0aW9uIGluIG1hbnkgM2QgQ1BfUEFDS0VUMydzICovCisjZGVmaW5lIFIzMDBfVkFQX1ZGX0NOVEwJMHgyMDg0CisKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fVFlQRV9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX05PTkUJCQkJICgwPDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUE9JTlRTCQkJCSAoMTw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVTCQkJCSAoMjw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVfU1RSSVAJCQkgKDM8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UUklBTkdMRVMJCQkgKDQ8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UUklBTkdMRV9GQU4JCQkgKDU8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UUklBTkdMRV9TVFJJUAkJCSAoNjw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVfTE9PUAkJCSAoMTI8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9RVUFEUwkJCSAJICgxMzw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1FVQURfU1RSSVAJCQkgKDE0PDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUE9MWUdPTgkJCSAJICgxNTw8MCkKKworIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNAorCS8qIFN0YXRlIGJhc2VkIC0gZGlyZWN0IHdyaXRlcyB0byByZWdpc3RlcnMgdHJpZ2dlciB2ZXJ0ZXggZ2VuZXJhdGlvbiAqLworIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX1NUQVRFX0JBU0VEICAgICAgICAgICAgICAgICAgICAgICgwPDw0KQorIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX0lORElDRVMgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDw0KQorIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX1ZFUlRFWF9MSVNUICAgICAgICAgICAgICAgICAgICAgICgyPDw0KQorIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX1ZFUlRFWF9FTUJFRERFRCAgICAgICAgICAgICAgICAgICgzPDw0KQorCisJCS8qIEkgZG9uJ3QgdGhpbmsgSSBzYXcgdGhlc2UgdGhyZWUgdXNlZC4uICovCisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19DT0xPUl9PUkRFUl9fU0hJRlQgICAgICAgICAgICAgICAgICAgICA2CisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19UQ0xfT1VUUFVUX0NUTF9FTkFfX1NISUZUICAgICAgICAgICAgICA5CisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUk9HX1NUUkVBTV9FTkFfX1NISUZUICAgICAgICAgICAgICAgICAxMAorCisJCS8qIGluZGV4IHNpemUgLSB3aGVuIG5vdCBzZXQgdGhlIGluZGljZXMgYXJlIGFzc3VtZWQgdG8gYmUgMTYgYml0ICovCisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19JTkRFWF9TSVpFXzMyYml0ICAgICAgICAgICAgICAgICAgICAgICgxPDwxMSkKKyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdmVydGljZXMgKi8KKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX05VTV9WRVJUSUNFU19fU0hJRlQgICAgICAgICAgICAgICAgICAgIDE2CisKKy8qIEJFR0lOOiBXaWxkIGd1ZXNzZXMgKi8KKyNkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMCAgICAgICAgICAgMHgyMDkwCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19QT1NfUFJFU0VOVCAgICAgKDE8PDApCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl9QUkVTRU5UICAgKDE8PDEpCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8xX1BSRVNFTlQgKDE8PDIpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8yX1BSRVNFTlQgKDE8PDMpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8zX1BSRVNFTlQgKDE8PDQpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19QVF9TSVpFX1BSRVNFTlQgKDE8PDE2KSAvKiBHVUVTUyAqLworCisjZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzEgICAgICAgICAgIDB4MjA5NAorIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzBfQ09NUF9DTlRfU0hJRlQgMAorIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzFfQ09NUF9DTlRfU0hJRlQgMworIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzJfQ09NUF9DTlRfU0hJRlQgNgorIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzNfQ09NUF9DTlRfU0hJRlQgOQorIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzRfQ09NUF9DTlRfU0hJRlQgMTIKKyMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzFfX1RFWF81X0NPTVBfQ05UX1NISUZUIDE1CisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX19URVhfNl9DT01QX0NOVF9TSElGVCAxOAorIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzdfQ09NUF9DTlRfU0hJRlQgMjEKKy8qIEVORCAqLworCisjZGVmaW5lIFIzMDBfU0VfVlRFX0NOVEwgICAgICAgICAgICAgICAgICAweDIwYjAKKyMJZGVmaW5lICAgICBSMzAwX1ZQT1JUX1hfU0NBTEVfRU5BICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyMJZGVmaW5lICAgICBSMzAwX1ZQT1JUX1hfT0ZGU0VUX0VOQSAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyMJZGVmaW5lICAgICBSMzAwX1ZQT1JUX1lfU0NBTEVfRU5BICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyMJZGVmaW5lICAgICBSMzAwX1ZQT1JUX1lfT0ZGU0VUX0VOQSAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyMJZGVmaW5lICAgICBSMzAwX1ZQT1JUX1pfU0NBTEVfRU5BICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyMJZGVmaW5lICAgICBSMzAwX1ZQT1JUX1pfT0ZGU0VUX0VOQSAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyMJZGVmaW5lICAgICBSMzAwX1ZUWF9YWV9GTVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyMJZGVmaW5lICAgICBSMzAwX1ZUWF9aX0ZNVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyMJZGVmaW5lICAgICBSMzAwX1ZUWF9XMF9GTVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyMJZGVmaW5lICAgICBSMzAwX1ZUWF9XMF9OT1JNQUxJWkUgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyMJZGVmaW5lICAgICBSMzAwX1ZUWF9TVF9ERU5PUk1BTElaRUQgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKworLyogQkVHSU46IFZlcnRleCBkYXRhIGFzc2VtYmx5IC0gbG90cyBvZiB1bmNlcnRhaW50aWVzICovCisvKiBnYXAgKi8KKy8qIFdoZXJlIGRvIHdlIGdldCBvdXIgdmVydGV4IGRhdGE/CisvLworLy8gVmVydGV4IGRhdGEgZWl0aGVyIGNvbWVzIGVpdGhlciBmcm9tIGltbWVkaWF0ZSBtb2RlIHJlZ2lzdGVycyBvciBmcm9tCisvLyB2ZXJ0ZXggYXJyYXlzLgorLy8gVGhlcmUgYXBwZWFycyB0byBiZSBubyBtaXhlZCBtb2RlICh0aG91Z2ggd2UgY2FuIGZvcmNlIHRoZSBwaXRjaCBvZgorLy8gdmVydGV4IGFycmF5cyB0byAwLCBlZmZlY3RpdmVseSByZXVzaW5nIHRoZSBzYW1lIGVsZW1lbnQgb3ZlciBhbmQgb3ZlcgorLy8gYWdhaW4pLgorLy8KKy8vIEltbWVkaWF0ZSBtb2RlIGlzIGNvbnRyb2xsZWQgYnkgdGhlIElOUFVUX0NOVEwgcmVnaXN0ZXJzLiBJIGFtIG5vdCBzdXJlCisvLyBpZiB0aGVzZSByZWdpc3RlcnMgaW5mbHVlbmNlIHZlcnRleCBhcnJheSBwcm9jZXNzaW5nLgorLy8KKy8vIFZlcnRleCBhcnJheXMgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZSAzRF9MT0FEX1ZCUE5UUiBwYWNrZXQzLgorLy8KKy8vIEluIGJvdGggY2FzZXMsIHZlcnRleCBhdHRyaWJ1dGVzIGFyZSB0aGVuIHBhc3NlZCB0aHJvdWdoIElOUFVUX1JPVVRFLgorCisvLyBCZWdpbm5pbmcgd2l0aCBJTlBVVF9ST1VURV8wXzAgaXMgYSBsaXN0IG9mIFdPUkRzIHRoYXQgcm91dGUgdmVydGV4IGRhdGEKKy8vIGludG8gdGhlIHZlcnRleCBwcm9jZXNzb3IncyBpbnB1dCByZWdpc3RlcnMuCisvLyBUaGUgZmlyc3Qgd29yZCByb3V0ZXMgdGhlIGZpcnN0IGlucHV0LCB0aGUgc2Vjb25kIHdvcmQgdGhlIHNlY29uZCwgZXRjLgorLy8gVGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgaXMgcm91dGVkIGludG8gdGhlIHJlZ2lzdGVyIHdpdGggdGhlIGdpdmVuIGluZGV4LgorLy8gVGhlIGxpc3QgaXMgZW5kZWQgYnkgYSB3b3JkIHdpdGggSU5QVVRfUk9VVEVfRU5EIHNldC4KKy8vCisvLyBBbHdheXMgc2V0IENPTVBPTkVOVFNfNCBpbiBpbW1lZGlhdGUgbW9kZS4gKi8KKworI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzAgICAgICAgICAgICAweDIxNTAKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfQ09NUE9ORU5UU18xICAgICAoMCA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9DT01QT05FTlRTXzIgICAgICgxIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0NPTVBPTkVOVFNfMyAgICAgKDIgPDwgMCkKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfQ09NUE9ORU5UU180ICAgICAoMyA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9DT01QT05FTlRTX1JHQkEgICg0IDw8IDApIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV9JRFhfU0hJRlQgICAgOAorIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfSURYX01BU0sgICAgICgzMSA8PCA4KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfRU5EICAgICAgICAgICgxIDw8IDEzKQorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9JTU1FRElBVEVfTU9ERSAgICgwIDw8IDE0KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9GTE9BVCAgICAgICAgICAgICgxIDw8IDE0KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9VTlNJR05FRF9CWVRFICAgICgyIDw8IDE0KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9GTE9BVF9DT0xPUiAgICAgICgzIDw8IDE0KSAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzEgICAgICAgICAgICAweDIxNTQKKyNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF8yICAgICAgICAgICAgMHgyMTU4CisjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMyAgICAgICAgICAgIDB4MjE1QworI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzQgICAgICAgICAgICAweDIxNjAKKyNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF81ICAgICAgICAgICAgMHgyMTY0CisjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfNiAgICAgICAgICAgIDB4MjE2OAorI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzcgICAgICAgICAgICAweDIxNkMKKworLyogZ2FwICovCisvKiBOb3RlczoKKy8vICAtIGFsd2F5cyBzZXQgdXAgdG8gcHJvZHVjZSBhdCBsZWFzdCB0d28gYXR0cmlidXRlczoKKy8vICAgIGlmIHZlcnRleCBwcm9ncmFtIHVzZXMgb25seSBwb3NpdGlvbiwgZmdscnggd2lsbCBzZXQgbm9ybWFsLCB0b28KKy8vICAtIElOUFVUX0NOVExfMF9DT0xPUiBhbmQgSU5QVVRfQ05UTF9DT0xPUiBiaXRzIGFyZSBhbHdheXMgZXF1YWwgKi8KKyNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfQ05UTF8wICAgICAgICAgICAgICAgMHgyMTgwCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfMF9DT0xPUiAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9DTlRMXzEgICAgICAgICAgICAgICAweDIxODQKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9QT1MgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfTk9STUFMICAgICAgICAgICAgMHgwMDAwMDAwMgorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX0NPTE9SICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEMxICAgICAgICAgICAgICAgMHgwMDAwMDgwMAorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDMiAgICAgICAgICAgICAgIDB4MDAwMDEwMDAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzMgICAgICAgICAgICAgICAweDAwMDAyMDAwIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM0ICAgICAgICAgICAgICAgMHgwMDAwNDAwMCAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDNSAgICAgICAgICAgICAgIDB4MDAwMDgwMDAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzYgICAgICAgICAgICAgICAweDAwMDEwMDAwIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM3ICAgICAgICAgICAgICAgMHgwMDAyMDAwMCAvKiBHVUVTUyAqLworCisvKiBnYXAgKi8KKy8qIFdvcmRzIHBhcmFsbGVsIHRvIElOUFVUX1JPVVRFXzA7IEFsbCB3b3JkcyB0aGF0IGFyZSBhY3RpdmUgaW4gSU5QVVRfUk9VVEVfMAorLy8gYXJlIHNldCB0byBhIHN3aXp6bGluZyBiaXQgcGF0dGVybiwgb3RoZXIgd29yZHMgYXJlIDAuCisvLworLy8gSW4gaW1tZWRpYXRlIG1vZGUsIHRoZSBwYXR0ZXJuIGlzIGFsd2F5cyBzZXQgdG8geHl6dy4gSW4gdmVydGV4IGFycmF5CisvLyBtb2RlLCB0aGUgc3dpenpsaW5nIHBhdHRlcm4gaXMgZS5nLiB1c2VkIHRvIHNldCB6dyBjb21wb25lbnRzIGluIHRleHR1cmUKKy8vIGNvb3JkaW5hdGVzIHdpdGggb25seSB0d2VvIGNvbXBvbmVudHMuICovCisjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfMCAgICAgICAgICAgIDB4MjFFMAorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9TRUxFQ1RfWCAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1NFTEVDVF9ZICAgIDEKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfU0VMRUNUX1ogICAgMgorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9TRUxFQ1RfVyAgICAzCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1NFTEVDVF9aRVJPIDQKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfU0VMRUNUX09ORSAgNQorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9TRUxFQ1RfTUFTSyA3CisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1hfU0hJRlQgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9ZX1NISUZUICAgICAgICAgIDMKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfWl9TSElGVCAgICAgICAgICA2CisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1dfU0hJRlQgICAgICAgICAgOQorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9FTkFCTEUgICAgICAgICAgICgxNSA8PCAxMikKKyNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV8xICAgICAgICAgICAgMHgyMUU0CisjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfMiAgICAgICAgICAgIDB4MjFFOAorI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzMgICAgICAgICAgICAweDIxRUMKKyNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV80ICAgICAgICAgICAgMHgyMUYwCisjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfNSAgICAgICAgICAgIDB4MjFGNAorI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzYgICAgICAgICAgICAweDIxRjgKKyNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV83ICAgICAgICAgICAgMHgyMUZDCisKKy8qIEVORCAqLworCisvKiBnYXAgKi8KKy8qIEJFR0lOOiBVcGxvYWQgdmVydGV4IHByb2dyYW0gYW5kIGRhdGEKKy8vIFRoZSBwcm9ncmFtbWFibGUgdmVydGV4IHNoYWRlciB1bml0IGhhcyBhIG1lbW9yeSBiYW5rIG9mIHVua25vd24gc2l6ZQorLy8gdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBpbiAxNiBieXRlIHVuaXRzIGJ5IHdyaXRpbmcgdGhlIGFkZHJlc3MgaW50bworLy8gVVBMT0FEX0FERFJFU1MsIGZvbGxvd2VkIGJ5IGRhdGEgaW4gVVBMT0FEX0RBVEEgKG11bHRpcGxlcyBvZiA0IERXT1JEcykuCisvLworLy8gUG9pbnRlcnMgaW50byB0aGUgbWVtb3J5IGJhbmsgYXJlIGFsd2F5cyBpbiBtdWx0aXBsZXMgb2YgMTYgYnl0ZXMuCisvLworLy8gVGhlIG1lbW9yeSBiYW5rIGlzIGRpdmlkZWQgaW50byBhcmVhcyB3aXRoIGZpeGVkIG1lYW5pbmcuCisvLworLy8gU3RhcnRpbmcgYXQgYWRkcmVzcyBVUExPQURfUFJPR1JBTTogVmVydGV4IHByb2dyYW0gaW5zdHJ1Y3Rpb25zLgorLy8gTmF0aXZlIGxpbWl0cyByZXBvcnRlZCBieSBkcml2ZXJzIGZyb20gQVRJIHN1Z2dlc3Qgc2l6ZSAyNTYgKGkuZS4gNEtCKSwKKy8vIHdoZXJlYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBrbm93biBhZGRyZXNzZXMgc3VnZ2VzdHMgc2l6ZSA1MTIuCisvLworLy8gU3RhcnRpbmcgYXQgYWRkcmVzcyBVUExPQURfUEFSQU1FVEVSUzogVmVydGV4IHByb2dyYW0gcGFyYW1ldGVycy4KKy8vIE5hdGl2ZSByZXBvcnRlZCBsaW1pdHMgYW5kIHRoZSBWUEkgbGF5b3V0IHN1Z2dlc3Qgc2l6ZSAyNTYsIHdoZXJlYXMKKy8vIGRpZmZlcmVuY2UgYmV0d2VlbiBrbm93biBhZGRyZXNzZXMgc3VnZ2VzdHMgc2l6ZSA1MTIuCisvLworLy8gQXQgYWRkcmVzcyBVUExPQURfUE9JTlRTSVpFIGlzIGEgdmVjdG9yICgwLCAwLCBwcywgMCksIHdoZXJlIHBzIGlzIHRoZQorLy8gZmxvYXRpbmcgcG9pbnQgcG9pbnRzaXplLiBUaGUgZXhhY3QgcHVycG9zZSBvZiB0aGlzIHN0YXRlIGlzIHVuY2VydGFpbiwKKy8vIGFzIHRoZXJlIGlzIGFsc28gdGhlIFIzMDBfUkVfUE9JTlRTSVpFIHJlZ2lzdGVyLgorLy8KKy8vIE11bHRpcGxlIHZlcnRleCBwcm9ncmFtcyBhbmQgcGFyYW1ldGVyIHNldHMgY2FuIGJlIGxvYWRlZCBhdCBvbmNlLAorLy8gd2hpY2ggY291bGQgZXhwbGFpbiB0aGUgc2l6ZSBkaXNjcmVwYW5jeS4gKi8KKyNkZWZpbmUgUjMwMF9WQVBfUFZTX1VQTE9BRF9BRERSRVNTICAgICAgICAgMHgyMjAwCisjICAgICAgIGRlZmluZSBSMzAwX1BWU19VUExPQURfUFJPR1JBTSAgICAgICAgICAgMHgwMDAwMDAwMAorIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfVVBMT0FEX1BBUkFNRVRFUlMgICAgICAgIDB4MDAwMDAyMDAKKyMgICAgICAgZGVmaW5lIFIzMDBfUFZTX1VQTE9BRF9QT0lOVFNJWkUgICAgICAgICAweDAwMDAwNDA2CisvKiBnYXAgKi8KKyNkZWZpbmUgUjMwMF9WQVBfUFZTX1VQTE9BRF9EQVRBICAgICAgICAgICAgMHgyMjA4CisvKiBFTkQgKi8KKworLyogZ2FwICovCisvKiBJIGRvIG5vdCBrbm93IHRoZSBwdXJwb3NlIG9mIHRoaXMgcmVnaXN0ZXIuIEhvd2V2ZXIsIEkgZG8ga25vdyB0aGF0CisvLyBpdCBpcyBzZXQgdG8gMjIxQ19DTEVBUiBmb3IgY2xlYXIgb3BlcmF0aW9ucyBhbmQgdG8gMjIxQ19OT1JNQUwKKy8vIGZvciBub3JtYWwgcmVuZGVyaW5nLiAqLworI2RlZmluZSBSMzAwX1ZBUF9VTktOT1dOXzIyMUMgICAgICAgICAgICAgICAweDIyMUMKKyMgICAgICAgZGVmaW5lIFIzMDBfMjIxQ19OT1JNQUwgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjICAgICAgIGRlZmluZSBSMzAwXzIyMUNfQ0xFQVIgICAgICAgICAgICAgICAgICAgMHgwMDAxQzAwMAorCisvKiBnYXAgKi8KKy8qIFNvbWV0aW1lcywgRU5EX09GX1BLVCBhbmQgMHgyMjg0PTAgYXJlIHRoZSBvbmx5IGNvbW1hbmRzIHNlbnQgYmV0d2VlbgorLy8gcmVuZGVyaW5nIGNvbW1hbmRzIGFuZCBvdmVyd3JpdGluZyB2ZXJ0ZXggcHJvZ3JhbSBwYXJhbWV0ZXJzLgorLy8gVGhlcmVmb3JlLCBJIHN1c3BlY3Qgd3JpdGluZyB6ZXJvIHRvIDB4MjI4NCBzeW5jaHJvbml6ZXMgdGhlIGVuZ2luZSBhbmQKKy8vIGF2b2lkcyBidWdzIGNhdXNlZCBieSBzdGlsbCBydW5uaW5nIHNoYWRlcnMgcmVhZGluZyBiYWQgZGF0YSBmcm9tIG1lbW9yeS4gKi8KKyNkZWZpbmUgUjMwMF9WQVBfUFZTX1dBSVRJRExFICAgICAgICAgICAgICAgMHgyMjg0IC8qIEdVRVNTICovCisKKy8qIEFic29sdXRlbHkgbm8gY2x1ZSB3aGF0IHRoaXMgcmVnaXN0ZXIgaXMgYWJvdXQuICovCisjZGVmaW5lIFIzMDBfVkFQX1VOS05PV05fMjI4OCAgICAgICAgICAgICAgIDB4MjI4OAorIyAgICAgICBkZWZpbmUgUjMwMF8yMjg4X1IzMDAgICAgICAgICAgICAgICAgICAgIDB4MDA3NTAwMDAgLyogLS0gbmggKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfMjI4OF9SVjM1MCAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGIC8qIC0tIFZsYWRpbWlyICovCisKKy8qIGdhcCAqLworLyogQWRkcmVzc2VzIGFyZSByZWxhdGl2ZSB0byB0aGUgdmVydGV4IHByb2dyYW0gaW5zdHJ1Y3Rpb24gYXJlYSBvZiB0aGUKKy8vIG1lbW9yeSBiYW5rLiBQUk9HUkFNX0VORCBwb2ludHMgdG8gdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgdGhlIGFjdGl2ZQorLy8gcHJvZ3JhbQorLy8KKy8vIFRoZSBtZWFuaW5nIG9mIHRoZSB0d28gVU5LTk9XTiBmaWVsZHMgaXMgb2J2aW91c2x5IG5vdCBrbm93bi4gSG93ZXZlciwKKy8vIGV4cGVyaW1lbnRzIHNvIGZhciBoYXZlIHNob3duIHRoYXQgYm90aCAqbXVzdCogcG9pbnQgdG8gYW4gaW5zdHJ1Y3Rpb24KKy8vIGluc2lkZSB0aGUgdmVydGV4IHByb2dyYW0sIG90aGVyd2lzZSB0aGUgR1BVIGxvY2tzIHVwLgorLy8gZmdscnggdXN1YWxseSBzZXRzIENOVExfM19VTktOT1dOIHRvIHRoZSBlbmQgb2YgdGhlIHByb2dyYW0gYW5kCisvLyBDTlRMXzFfVU5LTk9XTiBwb2ludHMgdG8gaW5zdHJ1Y3Rpb24gd2hlcmUgbGFzdCB3cml0ZSB0byBwb3NpdGlvbiB0YWtlcyBwbGFjZS4gCisvLyBNb3N0IGxpa2VseSB0aGlzIGlzIHVzZWQgdG8gaWdub3JlIHJlc3Qgb2YgdGhlIHByb2dyYW0gaW4gY2FzZXMgd2hlcmUgZ3JvdXAgb2YgdmVydHMgYXJlbnQgdmlzaWJsZS4KKy8vIEZvciBzb21lIHJlYXNvbiB0aGlzICJzZWN0aW9uIiBpcyBzb21ldGltZXMgYWNjZXB0ZWQgb3RoZXIgaW5zdHJ1Y3Rpb24gdGhhdCBoYXZlCisvLyBubyByZWxhdGlvbnNoaXAgd2l0aCBwb3NpdGlvbiBjYWxjdWxhdGlvbnMuIAorKi8KKyNkZWZpbmUgUjMwMF9WQVBfUFZTX0NOVExfMSAgICAgICAgICAgICAgICAgMHgyMkQwCisjICAgICAgIGRlZmluZSBSMzAwX1BWU19DTlRMXzFfUFJPR1JBTV9TVEFSVF9TSElGVCAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfMV9QT1NfRU5EX1NISUZUICAgICAgICAgMTAKKyMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfMV9QUk9HUkFNX0VORF9TSElGVCAgICAgMjAKKy8qIEFkZHJlc3NlcyBhcmUgcmVsYXRpdmUgdGhlIHRoZSB2ZXJ0ZXggcHJvZ3JhbSBwYXJhbWV0ZXJzIGFyZWEuICovCisjZGVmaW5lIFIzMDBfVkFQX1BWU19DTlRMXzIgICAgICAgICAgICAgICAgIDB4MjJENAorIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfQ05UTF8yX1BBUkFNX09GRlNFVF9TSElGVCAwCisjICAgICAgIGRlZmluZSBSMzAwX1BWU19DTlRMXzJfUEFSQU1fQ09VTlRfU0hJRlQgIDE2CisjZGVmaW5lIFIzMDBfVkFQX1BWU19DTlRMXzMJICAgICAgICAgICAweDIyRDgKKyMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfM19QUk9HUkFNX1VOS05PV05fU0hJRlQgMTAKKyMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfM19QUk9HUkFNX1VOS05PV04yX1NISUZUIDAKKworLyogVGhlIGVudGlyZSByYW5nZSBmcm9tIDB4MjMwMCB0byAweDJBQyBpbmNsdXNpdmUgc2VlbXMgdG8gYmUgdXNlZCBmb3IKKy8vIGltbWVkaWF0ZSB2ZXJ0aWNlcyAqLworI2RlZmluZSBSMzAwX1ZBUF9WVFhfQ09MT1JfUiAgICAgICAgICAgICAgICAweDI0NjQKKyNkZWZpbmUgUjMwMF9WQVBfVlRYX0NPTE9SX0cgICAgICAgICAgICAgICAgMHgyNDY4CisjZGVmaW5lIFIzMDBfVkFQX1ZUWF9DT0xPUl9CICAgICAgICAgICAgICAgIDB4MjQ2QworI2RlZmluZSBSMzAwX1ZBUF9WVFhfUE9TXzBfWF8xICAgICAgICAgICAgICAweDI0OTAgLyogdXNlZCBmb3IgZ2xWZXJ0ZXgyKigpICovCisjZGVmaW5lIFIzMDBfVkFQX1ZUWF9QT1NfMF9ZXzEgICAgICAgICAgICAgIDB4MjQ5NAorI2RlZmluZSBSMzAwX1ZBUF9WVFhfQ09MT1JfUEtEICAgICAgICAgICAgICAweDI0OUMgLyogUkdCQSAqLworI2RlZmluZSBSMzAwX1ZBUF9WVFhfUE9TXzBfWF8yICAgICAgICAgICAgICAweDI0QTAgLyogdXNlZCBmb3IgZ2xWZXJ0ZXgzKigpICovCisjZGVmaW5lIFIzMDBfVkFQX1ZUWF9QT1NfMF9ZXzIgICAgICAgICAgICAgIDB4MjRBNAorI2RlZmluZSBSMzAwX1ZBUF9WVFhfUE9TXzBfWl8yICAgICAgICAgICAgICAweDI0QTgKKyNkZWZpbmUgUjMwMF9WQVBfVlRYX0VORF9PRl9QS1QgICAgICAgICAgICAgMHgyNEFDIC8qIHdyaXRlIDAgdG8gaW5kaWNhdGUgZW5kIG9mIHBhY2tldD8gKi8KKworLyogZ2FwICovCisKKy8qIFRoZXNlIGFyZSB2YWx1ZXMgZnJvbSByMzAwX3JlZy9yMzAwX3JlZy5oIC0gdGhleSBhcmUga25vd24gdG8gYmUgY29ycmVjdAorICAgYW5kIGFyZSBoZXJlIHNvIHdlIGNhbiB1c2Ugb25lIHJlZ2lzdGVyIGZpbGUgaW5zdGVhZCBvZiBzZXZlcmFsCisgICAtIFZsYWRpbWlyICovCisjZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzAJMHg0MDAwCisjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8wX19QT1NfUFJFU0VOVAkoMTw8MCkKKyMJZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzBfX0NPTE9SXzBfUFJFU0VOVAkoMTw8MSkKKyMJZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzBfX0NPTE9SXzFfUFJFU0VOVAkoMTw8MikKKyMJZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzBfX0NPTE9SXzJfUFJFU0VOVAkoMTw8MykKKyMJZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzBfX0NPTE9SXzNfUFJFU0VOVAkoMTw8NCkKKyMJZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzBfX0NPTE9SX1NQQUNFCSgweGY8PDUpCisjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8wX19QVF9TSVpFX1BSRVNFTlQJKDB4MTw8MTYpCisKKyNkZWZpbmUgUjMwMF9HQl9WQVBfUkFTVEVSX1ZUWF9GTVRfMQkweDQwMDQKKwkvKiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgaXMgMyBiaXRzIHdpZGUsIHNwZWNpZmllcyBudW1iZXIKKwkgICBvZiBjb21wb25lbnRzICovCisjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8xX19URVhfMF9DT01QX0NOVF9TSElGVAkwCisjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8xX19URVhfMV9DT01QX0NOVF9TSElGVAkzCisjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8xX19URVhfMl9DT01QX0NOVF9TSElGVAk2CisjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8xX19URVhfM19DT01QX0NOVF9TSElGVAk5CisjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8xX19URVhfNF9DT01QX0NOVF9TSElGVAkxMgorIwlkZWZpbmUgUjMwMF9HQl9WQVBfUkFTVEVSX1ZUWF9GTVRfMV9fVEVYXzVfQ09NUF9DTlRfU0hJRlQJMTUKKyMJZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzFfX1RFWF82X0NPTVBfQ05UX1NISUZUCTE4CisjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8xX19URVhfN19DT01QX0NOVF9TSElGVAkyMQorCisvKiBVTkszMCBzZWVtcyB0byBlbmFibGVzIHBvaW50IHRvIHF1YWQgdHJhbnNmb3JtYXRpb24gb24gdGV4dHVyZXMKKyAgIChvciBzb21ldGhpbmcgY2xvc2VseSByZWxhdGVkIHRvIHRoYXQpLgorICAgVGhpcyBiaXQgaXMgcmF0aGVyIGZhdGFsIGF0IHRoZSB0aW1lIGJlaW5nIGR1ZSB0byBsYWNraW5ncyBhdCBwaXhlbCBzaGFkZXIgc2lkZSAqLworI2RlZmluZSBSMzAwX0dCX0VOQUJMRQkweDQwMDgKKyMJZGVmaW5lIFIzMDBfR0JfUE9JTlRfU1RVRkZfRU5BQkxFCSgxPDwwKQorIwlkZWZpbmUgUjMwMF9HQl9MSU5FX1NUVUZGX0VOQUJMRQkoMTw8MSkKKyMJZGVmaW5lIFIzMDBfR0JfVFJJQU5HTEVfU1RVRkZfRU5BQkxFCSgxPDwyKQorIwlkZWZpbmUgUjMwMF9HQl9TVEVOQ0lMX0FVVE9fRU5BQkxFCSgxPDw0KQorIwlkZWZpbmUgUjMwMF9HQl9VTkszMAkJCSgxPDwzMCkKKwkvKiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgaXMgMiBiaXRzIHdpZGUgKi8KKyNkZWZpbmUgUjMwMF9HQl9URVhfUkVQTElDQVRFCTAKKyNkZWZpbmUgUjMwMF9HQl9URVhfU1QJCTEKKyNkZWZpbmUgUjMwMF9HQl9URVhfU1RSCQkyCisjCWRlZmluZSBSMzAwX0dCX1RFWDBfU09VUkNFX1NISUZUCTE2CisjCWRlZmluZSBSMzAwX0dCX1RFWDFfU09VUkNFX1NISUZUCTE4CisjCWRlZmluZSBSMzAwX0dCX1RFWDJfU09VUkNFX1NISUZUCTIwCisjCWRlZmluZSBSMzAwX0dCX1RFWDNfU09VUkNFX1NISUZUCTIyCisjCWRlZmluZSBSMzAwX0dCX1RFWDRfU09VUkNFX1NISUZUCTI0CisjCWRlZmluZSBSMzAwX0dCX1RFWDVfU09VUkNFX1NISUZUCTI2CisjCWRlZmluZSBSMzAwX0dCX1RFWDZfU09VUkNFX1NISUZUCTI4CisjCWRlZmluZSBSMzAwX0dCX1RFWDdfU09VUkNFX1NISUZUCTMwCisKKy8qIE1TUE9TIC0gcG9zaXRpb25zIGZvciBtdWx0aXNhbXBsZSBhbnRpYWxpYXNpbmcgKD8pICovCisjZGVmaW5lIFIzMDBfR0JfTVNQT1MwCTB4NDAxMAorCS8qIHNoaWZ0cyAtIGVhY2ggb2YgdGhlIGZpZWxkcyBpcyA0IGJpdHMgKi8KKyMJZGVmaW5lIFIzMDBfR0JfTVNQT1MwX19NU19YMF9TSElGVAkwCisjCWRlZmluZSBSMzAwX0dCX01TUE9TMF9fTVNfWTBfU0hJRlQJNAorIwlkZWZpbmUgUjMwMF9HQl9NU1BPUzBfX01TX1gxX1NISUZUCTgKKyMJZGVmaW5lIFIzMDBfR0JfTVNQT1MwX19NU19ZMV9TSElGVAkxMgorIwlkZWZpbmUgUjMwMF9HQl9NU1BPUzBfX01TX1gyX1NISUZUCTE2CisjCWRlZmluZSBSMzAwX0dCX01TUE9TMF9fTVNfWTJfU0hJRlQJMjAKKyMJZGVmaW5lIFIzMDBfR0JfTVNQT1MwX19NU0JEMF9ZCQkyNAorIwlkZWZpbmUgUjMwMF9HQl9NU1BPUzBfX01TQkQwX1gJCTI4CisKKyNkZWZpbmUgUjMwMF9HQl9NU1BPUzEJMHg0MDE0CisjCWRlZmluZSBSMzAwX0dCX01TUE9TMV9fTVNfWDNfU0hJRlQJMAorIwlkZWZpbmUgUjMwMF9HQl9NU1BPUzFfX01TX1kzX1NISUZUCTQKKyMJZGVmaW5lIFIzMDBfR0JfTVNQT1MxX19NU19YNF9TSElGVAk4CisjCWRlZmluZSBSMzAwX0dCX01TUE9TMV9fTVNfWTRfU0hJRlQJMTIKKyMJZGVmaW5lIFIzMDBfR0JfTVNQT1MxX19NU19YNV9TSElGVAkxNgorIwlkZWZpbmUgUjMwMF9HQl9NU1BPUzFfX01TX1k1X1NISUZUCTIwCisjCWRlZmluZSBSMzAwX0dCX01TUE9TMV9fTVNCRDEJCTI0CisKKworI2RlZmluZSBSMzAwX0dCX1RJTEVfQ09ORklHCTB4NDAxOAorIwlkZWZpbmUgUjMwMF9HQl9USUxFX0VOQUJMRQkoMTw8MCkKKyMJZGVmaW5lIFIzMDBfR0JfVElMRV9QSVBFX0NPVU5UX1JWMzAwCTAKKyMJZGVmaW5lIFIzMDBfR0JfVElMRV9QSVBFX0NPVU5UX1IzMDAJKDM8PDEpCisjCWRlZmluZSBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SNDIwCSg3PDwxKQorIwlkZWZpbmUgUjMwMF9HQl9USUxFX1NJWkVfOAkJMAorIwlkZWZpbmUgUjMwMF9HQl9USUxFX1NJWkVfMTYJCSgxPDw0KQorIwlkZWZpbmUgUjMwMF9HQl9USUxFX1NJWkVfMzIJCSgyPDw0KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9TSVpFXzEJCSgwPDw2KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9TSVpFXzIJCSgxPDw2KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9TSVpFXzQJCSgyPDw2KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9TSVpFXzgJCSgzPDw2KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9TSVpFXzE2CQkoNDw8NikKKyMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfU0laRV8zMgkJKDU8PDYpCisjCWRlZmluZSBSMzAwX0dCX1NVUEVSX1NJWkVfNjQJCSg2PDw2KQorIwlkZWZpbmUgUjMwMF9HQl9TVVBFUl9TSVpFXzEyOAkJKDc8PDYpCisjCWRlZmluZSBSMzAwX0dCX1NVUEVSX1hfU0hJRlQJCTkJLyogMyBiaXRzIHdpZGUgKi8KKyMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfWV9TSElGVAkJMTIJLyogMyBiaXRzIHdpZGUgKi8KKyMJZGVmaW5lIFIzMDBfR0JfU1VQRVJfVElMRV9BCQkwCisjCWRlZmluZSBSMzAwX0dCX1NVUEVSX1RJTEVfQgkJKDE8PDE1KQorIwlkZWZpbmUgUjMwMF9HQl9TVUJQSVhFTF8xXzEyCQkwCisjCWRlZmluZSBSMzAwX0dCX1NVQlBJWEVMXzFfMTYJCSgxPDwxNikKKworI2RlZmluZSBSMzAwX0dCX0ZJRk9fU0laRQkweDQwMjQKKwkvKiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgaXMgMiBiaXRzIHdpZGUgKi8KKyNkZWZpbmUgUjMwMF9HQl9GSUZPX1NJWkVfMzIJMAorI2RlZmluZSBSMzAwX0dCX0ZJRk9fU0laRV82NAkxCisjZGVmaW5lIFIzMDBfR0JfRklGT19TSVpFXzEyOAkyCisjZGVmaW5lIFIzMDBfR0JfRklGT19TSVpFXzI1NgkzCisjCWRlZmluZSBSMzAwX1NDX0lGSUZPX1NJWkVfU0hJRlQJMAorIwlkZWZpbmUgUjMwMF9TQ19UWkZJRk9fU0laRV9TSElGVAkyCisjCWRlZmluZSBSMzAwX1NDX0JGSUZPX1NJWkVfU0hJRlQJNAorCisjCWRlZmluZSBSMzAwX1VTX09GSUZPX1NJWkVfU0hJRlQJMTIKKyMJZGVmaW5lIFIzMDBfVVNfV0ZJRk9fU0laRV9TSElGVAkxNAorCS8qIHRoZSBmb2xsb3dpbmcgdXNlIHRoZSBzYW1lIGNvbnN0YW50cyBhcyBhYm92ZSwgYnV0IG1lYW5pbmcgaXMKKwkgICBpcyB0aW1lcyAyIChpLmUuIGluc3RlYWQgb2YgMzIgd29yZHMgaXQgbWVhbnMgNjQgKi8KKyMJZGVmaW5lIFIzMDBfUlNfVEZJRk9fU0laRV9TSElGVAk2CisjCWRlZmluZSBSMzAwX1JTX0NGSUZPX1NJWkVfU0hJRlQJOAorIwlkZWZpbmUgUjMwMF9VU19SQU1fU0laRV9TSElGVAkJMTAKKwkvKiB3YXRlcm1hcmtzLCAzIGJpdHMgd2lkZSAqLworIwlkZWZpbmUgUjMwMF9SU19ISUdIV0FURVJfQ09MX1NISUZUCTE2CisjCWRlZmluZSBSMzAwX1JTX0hJR0hXQVRFUl9URVhfU0hJRlQJMTkKKyMJZGVmaW5lIFIzMDBfT0ZJRk9fSElHSFdBVEVSX1NISUZUCTIyCS8qIHR3byBiaXRzIG9ubHkgKi8KKyMJZGVmaW5lIFIzMDBfQ1VCRV9GSUZPX0hJR0hXQVRFUl9DT0xfU0hJRlQJMjQKKworI2RlZmluZSBSMzAwX0dCX1NFTEVDVAkweDQwMUMKKyMJZGVmaW5lIFIzMDBfR0JfRk9HX1NFTEVDVF9DMEEJCTAKKyMJZGVmaW5lIFIzMDBfR0JfRk9HX1NFTEVDVF9DMUEJCTEKKyMJZGVmaW5lIFIzMDBfR0JfRk9HX1NFTEVDVF9DMkEJCTIKKyMJZGVmaW5lIFIzMDBfR0JfRk9HX1NFTEVDVF9DM0EJCTMKKyMJZGVmaW5lIFIzMDBfR0JfRk9HX1NFTEVDVF8xXzFfVwk0CisjCWRlZmluZSBSMzAwX0dCX0ZPR19TRUxFQ1RfWgkJNQorIwlkZWZpbmUgUjMwMF9HQl9ERVBUSF9TRUxFQ1RfWgkJMAorIwlkZWZpbmUgUjMwMF9HQl9ERVBUSF9TRUxFQ1RfMV8xX1cJKDE8PDMpCisjCWRlZmluZSBSMzAwX0dCX1dfU0VMRUNUXzFfVwkJMAorIwlkZWZpbmUgUjMwMF9HQl9XX1NFTEVDVF8xCQkoMTw8NCkKKworI2RlZmluZSBSMzAwX0dCX0FBX0NPTkZJRwkJMHg0MDIwCisjCWRlZmluZSBSMzAwX0FBX0VOQUJMRQkJCTB4MDEKKyMJZGVmaW5lIFIzMDBfQUFfU1VCU0FNUExFU18yCQkwCisjCWRlZmluZSBSMzAwX0FBX1NVQlNBTVBMRVNfMwkJKDE8PDEpCisjCWRlZmluZSBSMzAwX0FBX1NVQlNBTVBMRVNfNAkJKDI8PDEpCisjCWRlZmluZSBSMzAwX0FBX1NVQlNBTVBMRVNfNgkJKDM8PDEpCisKKy8qIEVORCAqLworCisvKiBnYXAgKi8KKy8qIFRoZSB1cHBlciBlbmFibGUgYml0cyBhcmUgZ3Vlc3NlZCwgYmFzZWQgb24gZmdscnggcmVwb3J0ZWQgbGltaXRzLiAqLworI2RlZmluZSBSMzAwX1RYX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAweDQxMDQKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfRU5BQkxFXzAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9FTkFCTEVfMSAgICAgICAgICAgICAgICAgICgxIDw8IDEpCisjICAgICAgIGRlZmluZSBSMzAwX1RYX0VOQUJMRV8yICAgICAgICAgICAgICAgICAgKDEgPDwgMikKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfRU5BQkxFXzMgICAgICAgICAgICAgICAgICAoMSA8PCAzKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9FTkFCTEVfNCAgICAgICAgICAgICAgICAgICgxIDw8IDQpCisjICAgICAgIGRlZmluZSBSMzAwX1RYX0VOQUJMRV81ICAgICAgICAgICAgICAgICAgKDEgPDwgNSkKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfRU5BQkxFXzYgICAgICAgICAgICAgICAgICAoMSA8PCA2KQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9FTkFCTEVfNyAgICAgICAgICAgICAgICAgICgxIDw8IDcpCisjICAgICAgIGRlZmluZSBSMzAwX1RYX0VOQUJMRV84ICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfRU5BQkxFXzkgICAgICAgICAgICAgICAgICAoMSA8PCA5KQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9FTkFCTEVfMTAgICAgICAgICAgICAgICAgICgxIDw8IDEwKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9FTkFCTEVfMTEgICAgICAgICAgICAgICAgICgxIDw8IDExKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9FTkFCTEVfMTIgICAgICAgICAgICAgICAgICgxIDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9FTkFCTEVfMTMgICAgICAgICAgICAgICAgICgxIDw8IDEzKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9FTkFCTEVfMTQgICAgICAgICAgICAgICAgICgxIDw8IDE0KQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9FTkFCTEVfMTUgICAgICAgICAgICAgICAgICgxIDw8IDE1KQorCisvKiBUaGUgcG9pbnRzaXplIGlzIGdpdmVuIGluIG11bHRpcGxlcyBvZiA2LiBUaGUgcG9pbnRzaXplIGNhbiBiZQorLy8gZW5vcm1vdXM6IENsZWFyKCkgcmVuZGVycyBhIHNpbmdsZSBwb2ludCB0aGF0IGZpbGxzIHRoZSBlbnRpcmUKKy8vIGZyYW1lYnVmZmVyLiAqLworI2RlZmluZSBSMzAwX1JFX1BPSU5UU0laRSAgICAgICAgICAgICAgICAgICAweDQyMUMKKyMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX1lfU0hJRlQgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9ZX01BU0sgICAgICAgICAgICAgKDB4RkZGRiA8PCAwKSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWF9TSElGVCAgICAgICAgICAgIDE2CisjICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9YX01BU0sgICAgICAgICAgICAgKDB4RkZGRiA8PCAxNikgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX01BWCAgICAgICAgICAgICAoUjMwMF9QT0lOVFNJWkVfWV9NQVNLIC8gNikKKworLyogVGhlIGxpbmUgd2lkdGggaXMgZ2l2ZW4gaW4gbXVsdGlwbGVzIG9mIDYuCisgICBJbiBkZWZhdWx0IG1vZGUgbGluZXMgYXJlIGNsYXNzaWZpZWQgYXMgdmVydGljYWwgbGluZXMuCisgICBITzogaG9yaXpvbnRhbAorICAgVkU6IHZlcnRpY2FsIG9yIGhvcml6b250YWwKKyAgIEhPICYgVkU6IG5vIGNsYXNzaWZpY2F0aW9uCisqLworI2RlZmluZSBSMzAwX1JFX0xJTkVfQ05UICAgICAgICAgICAgICAgICAgICAgIDB4NDIzNAorIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FU0laRV9TSElGVCAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfTElORVNJWkVfTUFTSyAgICAgICAgICAgICAoMHhGRkZGIDw8IDApIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0xJTkVTSVpFX01BWCAgICAgICAgICAgICAoUjMwMF9MSU5FU0laRV9NQVNLIC8gNikKKyMgICAgICAgZGVmaW5lIFIzMDBfTElORV9DTlRfSE8gICAgICAgICAgICAgICAoMSA8PCAxNikKKyMgICAgICAgZGVmaW5lIFIzMDBfTElORV9DTlRfVkUgICAgICAgICAgICAgICAoMSA8PCAxNykKKworLyogU29tZSBzb3J0IG9mIHNjYWxlIG9yIGNsYW1wIHZhbHVlIGZvciB0ZXhjb29yZGxlc3MgdGV4dHVyZXMuICovCisjZGVmaW5lIFIzMDBfUkVfVU5LNDIzOCAgICAgICAgICAgICAgICAgICAgICAgMHg0MjM4CisKKyNkZWZpbmUgUjMwMF9SRV9TSEFERV9NT0RFTCAgICAgICAgICAgICAgICAgICAweDQyNzgKKyMJZGVmaW5lIFIzMDBfUkVfU0hBREVfTU9ERUxfU01PT1RIICAgICAweDNhYWFhCisjCWRlZmluZSBSMzAwX1JFX1NIQURFX01PREVMX0ZMQVQgICAgICAgMHgzOTU5NQorCisvKiBEYW5nZXJvdXMgKi8KKyNkZWZpbmUgUjMwMF9SRV9QT0xZR09OX01PREUgICAgICAgICAgICAgICAgICAweDQyODgKKyMJZGVmaW5lIFIzMDBfUE1fRU5BQkxFRCAgICAgICAgICAgICAgICAoMSA8PCAwKQorIwlkZWZpbmUgUjMwMF9QTV9GUk9OVF9QT0lOVCAgICAgICAgICAgICgwIDw8IDApCisjCWRlZmluZSBSMzAwX1BNX0JBQ0tfUE9JTlQgICAgICAgICAgICAgKDAgPDwgMCkKKyMJZGVmaW5lIFIzMDBfUE1fRlJPTlRfTElORSAgICAgICAgICAgICAoMSA8PCA0KQorIwlkZWZpbmUgUjMwMF9QTV9GUk9OVF9GSUxMICAgICAgICAgICAgICgxIDw8IDUpCisjCWRlZmluZSBSMzAwX1BNX0JBQ0tfTElORSAgICAgICAgICAgICAgKDEgPDwgNykKKyMJZGVmaW5lIFIzMDBfUE1fQkFDS19GSUxMICAgICAgICAgICAgICAoMSA8PCA4KQorCisvKiBOb3Qgc3VyZSB3aHkgdGhlcmUgYXJlIGR1cGxpY2F0ZSBvZiBmYWN0b3IgYW5kIGNvbnN0YW50IHZhbHVlcy4gCisgICBNeSBiZXN0IGd1ZXNzIHNvIGZhciBpcyB0aGF0IHRoZXJlIGFyZSBzZXBlcmF0ZSB6Ymlhc2VzIGZvciB0ZXN0IGFuZCB3cml0ZS4gCisgICBPcmRlcmluZyBtaWdodCBiZSB3cm9uZy4KKyAgIFNvbWUgb2YgdGhlIHRlc3RzIGluZGljYXRlIHRoYXQgZmdsIGhhcyBhIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIHpiaWFzCisgICB2aWEgcGl4ZWwgc2hhZGVycy4gKi8KKyNkZWZpbmUgUjMwMF9SRV9aQklBU19UX0ZBQ1RPUiAgICAgICAgICAgICAgICAweDQyQTQKKyNkZWZpbmUgUjMwMF9SRV9aQklBU19UX0NPTlNUQU5UICAgICAgICAgICAgICAweDQyQTgKKyNkZWZpbmUgUjMwMF9SRV9aQklBU19XX0ZBQ1RPUiAgICAgICAgICAgICAgICAweDQyQUMKKyNkZWZpbmUgUjMwMF9SRV9aQklBU19XX0NPTlNUQU5UICAgICAgICAgICAgICAweDQyQjAKKworLyogVGhpcyByZWdpc3RlciBuZWVkcyB0byBiZSBzZXQgdG8gKDE8PDEpIGZvciBSVjM1MCB0byBjb3JyZWN0bHkKKyAgIHBlcmZvcm0gZGVwdGggdGVzdCAoc2VlIC0tdmItdHJpYW5nbGVzIGluIHIzMDBfZGVtbykKKyAgIERvbid0IGtub3cgYWJvdXQgb3RoZXIgY2hpcHMuIC0gVmxhZGltaXIKKyAgIFRoaXMgaXMgc2V0IHRvIDMgd2hlbiBHTF9QT0xZR09OX09GRlNFVF9GSUxMIGlzIG9uLgorICAgTXkgZ3Vlc3MgaXMgdGhhdCB0aGVyZSBhcmUgdHdvIGJpdHMgZm9yIGVhY2ggemJpYXMgcHJpbWl0aXZlIChGSUxMLCBMSU5FLCBQT0lOVCkuCisgICBPbmUgdG8gZW5hYmxlIGRlcHRoIHRlc3QgYW5kIG9uZSBmb3IgZGVwdGggd3JpdGUuCisgICBZZXQgdGhpcyBkb2VzbnQgZXhwbGFpbiB3aHkgZGVwdGggd3JpdGVzIHdvcmsgLi4uCisgICAgKi8KKyNkZWZpbmUgUjMwMF9SRV9PQ0NMVVNJT05fQ05UTAkJICAgIDB4NDJCNAorIwlkZWZpbmUgUjMwMF9PQ0NMVVNJT05fT04JCSgxPDwxKQorCisjZGVmaW5lIFIzMDBfUkVfQ1VMTF9DTlRMICAgICAgICAgICAgICAgICAgIDB4NDJCOAorIyAgICAgICBkZWZpbmUgUjMwMF9DVUxMX0ZST05UICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX0NVTExfQkFDSyAgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfRlJPTlRfRkFDRV9DQ1cgICAgICAgICAgICAgICAoMCA8PCAyKQorIyAgICAgICBkZWZpbmUgUjMwMF9GUk9OVF9GQUNFX0NXICAgICAgICAgICAgICAgICgxIDw8IDIpCisKKworLyogQkVHSU46IFJhc3Rlcml6YXRpb24gLyBJbnRlcnBvbGF0b3JzIC0gbWFueSBndWVzc2VzCisvLyAwX1VOS05PV05fMTggaGFzIGFsd2F5cyBiZWVuIHNldCBleGNlcHQgZm9yIGNsZWFyIG9wZXJhdGlvbnMuCisvLyBUQ19DTlQgaXMgdGhlIG51bWJlciBvZiBpbmNvbWluZyB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cyAoaS5lLiBpdCBkZXBlbmRzCisvLyBvbiB0aGUgdmVydGV4IHByb2dyYW0sICpub3QqIHRoZSBmcmFnbWVudCBwcm9ncmFtKSAqLworI2RlZmluZSBSMzAwX1JTX0NOVExfMCAgICAgICAgICAgICAgICAgICAgICAweDQzMDAKKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfQ05UTF9UQ19DTlRfU0hJRlQgICAgICAgICAyCisjICAgICAgIGRlZmluZSBSMzAwX1JTX0NOVExfVENfQ05UX01BU0sgICAgICAgICAgKDcgPDwgMikKKyMJCWRlZmluZSBSMzAwX1JTX0NOVExfQ0lfQ05UX1NISUZUICAgICAgICAgNyAvKiBudW1iZXIgb2YgY29sb3IgaW50ZXJwb2xhdG9ycyB1c2VkICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX0NOVExfMF9VTktOT1dOXzE4ICAgICAgICAgKDEgPDwgMTgpCisvKiBHdWVzczogUlNfQ05UTF8xIGhvbGRzIHRoZSBpbmRleCBvZiB0aGUgaGlnaGVzdCB1c2VkIFJTX1JPVVRFX24gcmVnaXN0ZXIuICovCisjZGVmaW5lIFIzMDBfUlNfQ05UTF8xICAgICAgICAgICAgICAgICAgICAgIDB4NDMwNAorCisvKiBnYXAgKi8KKy8qIE9ubHkgdXNlZCBmb3IgdGV4dHVyZSBjb29yZGluYXRlcy4KKy8vIFVzZSB0aGUgc291cmNlIGZpZWxkIHRvIHJvdXRlIHRleHR1cmUgY29vcmRpbmF0ZSBpbnB1dCBmcm9tIHRoZSB2ZXJ0ZXggcHJvZ3JhbQorLy8gdG8gdGhlIGRlc2lyZWQgaW50ZXJwb2xhdG9yLiBOb3RlIHRoYXQgdGhlIHNvdXJjZSBmaWVsZCBpcyByZWxhdGl2ZSB0byB0aGUKKy8vIG91dHB1dHMgdGhlIHZlcnRleCBwcm9ncmFtICphY3R1YWxseSogd3JpdGVzLiBJZiBhIHZlcnRleCBwcm9ncmFtIG9ubHkgd3JpdGVzCisvLyB0ZXhjb29yZFsxXSwgdGhpcyB3aWxsIGJlIHNvdXJjZSBpbmRleCAwLgorLy8gU2V0IElOVEVSUF9VU0VEIG9uIGFsbCBpbnRlcnBvbGF0b3JzIHRoYXQgcHJvZHVjZSBkYXRhIHVzZWQgYnkgdGhlCisvLyBmcmFnbWVudCBwcm9ncmFtLiBJTlRFUlBfVVNFRCBsb29rcyBsaWtlIGEgc3dpenpsaW5nIG1hc2ssIGJ1dAorLy8gSSBoYXZlbid0IHNlZW4gaXQgdXNlZCB0aGF0IHdheS4KKy8vCisvLyBOb3RlOiBUaGUgX1VOS05PV04gY29uc3RhbnRzIGFyZSBhbHdheXMgc2V0IGluIHRoZWlyIHJlc3BlY3RpdmUgcmVnaXN0ZXIuCisvLyBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBuZWNlc3NhcnkuICovCisjZGVmaW5lIFIzMDBfUlNfSU5URVJQXzAgICAgICAgICAgICAgICAgICAgIDB4NDMxMAorI2RlZmluZSBSMzAwX1JTX0lOVEVSUF8xICAgICAgICAgICAgICAgICAgICAweDQzMTQKKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfSU5URVJQXzFfVU5LTk9XTiAgICAgICAgICAweDQwCisjZGVmaW5lIFIzMDBfUlNfSU5URVJQXzIgICAgICAgICAgICAgICAgICAgIDB4NDMxOAorIyAgICAgICBkZWZpbmUgUjMwMF9SU19JTlRFUlBfMl9VTktOT1dOICAgICAgICAgIDB4ODAKKyNkZWZpbmUgUjMwMF9SU19JTlRFUlBfMyAgICAgICAgICAgICAgICAgICAgMHg0MzFDCisjICAgICAgIGRlZmluZSBSMzAwX1JTX0lOVEVSUF8zX1VOS05PV04gICAgICAgICAgMHhDMAorI2RlZmluZSBSMzAwX1JTX0lOVEVSUF80ICAgICAgICAgICAgICAgICAgICAweDQzMjAKKyNkZWZpbmUgUjMwMF9SU19JTlRFUlBfNSAgICAgICAgICAgICAgICAgICAgMHg0MzI0CisjZGVmaW5lIFIzMDBfUlNfSU5URVJQXzYgICAgICAgICAgICAgICAgICAgIDB4NDMyOAorI2RlZmluZSBSMzAwX1JTX0lOVEVSUF83ICAgICAgICAgICAgICAgICAgICAweDQzMkMKKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfSU5URVJQX1NSQ19TSElGVCAgICAgICAgICAyCisjICAgICAgIGRlZmluZSBSMzAwX1JTX0lOVEVSUF9TUkNfTUFTSyAgICAgICAgICAgKDcgPDwgMikKKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfSU5URVJQX1VTRUQgICAgICAgICAgICAgICAweDAwRDEwMDAwCisKKy8qIFRoZXNlIERXT1JEcyBjb250cm9sIGhvdyB2ZXJ0ZXggZGF0YSBpcyByb3V0ZWQgaW50byBmcmFnbWVudCBwcm9ncmFtCisvLyByZWdpc3RlcnMsIGFmdGVyIGludGVycG9sYXRvcnMuICovCisjZGVmaW5lIFIzMDBfUlNfUk9VVEVfMCAgICAgICAgICAgICAgICAgICAgIDB4NDMzMAorI2RlZmluZSBSMzAwX1JTX1JPVVRFXzEgICAgICAgICAgICAgICAgICAgICAweDQzMzQKKyNkZWZpbmUgUjMwMF9SU19ST1VURV8yICAgICAgICAgICAgICAgICAgICAgMHg0MzM4CisjZGVmaW5lIFIzMDBfUlNfUk9VVEVfMyAgICAgICAgICAgICAgICAgICAgIDB4NDMzQyAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX1JPVVRFXzQgICAgICAgICAgICAgICAgICAgICAweDQzNDAgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SU19ST1VURV81ICAgICAgICAgICAgICAgICAgICAgMHg0MzQ0IC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUlNfUk9VVEVfNiAgICAgICAgICAgICAgICAgICAgIDB4NDM0OCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX1JPVVRFXzcgICAgICAgICAgICAgICAgICAgICAweDQzNEMgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF8wICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfMSAgICAgMQorIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzIgICAgIDIKKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF8zICAgICAzCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNCAgICAgNAorIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzUgICAgIDUgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF82ICAgICA2IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNyAgICAgNyAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9FTkFCTEUgICAgICAgICAgICAgICgxIDw8IDMpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX0RFU1RfU0hJRlQgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9ERVNUX01BU0sgICAgICAgICAgICgzMSA8PCA2KSAvKiBHVUVTUyAqLworCisvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb2xvcjogV2hlbiB0aGUgZnJhZ21lbnQgcHJvZ3JhbSB1c2VzIGNvbG9yLAorLy8gdGhlIFJPVVRFXzBfQ09MT1IgYml0IGlzIHNldCBhbmQgUk9VVEVfMF9DT0xPUl9ERVNUIGNvbnRhaW5zIHRoZQorLy8gY29sb3IgcmVnaXN0ZXIgaW5kZXguICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFXzBfQ09MT1IgICAgICAgICAgICAgKDEgPDwgMTQpCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFXzBfQ09MT1JfREVTVF9TSElGVCAgMTcKKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfMF9DT0xPUl9ERVNUX01BU0sgICAoMzEgPDwgMTcpIC8qIEdVRVNTICovCisvKiBBcyBhYm92ZSwgYnV0IGZvciBzZWNvbmRhcnkgY29sb3IgKi8KKyMJCWRlZmluZSBSMzAwX1JTX1JPVVRFXzFfQ09MT1IxICAgICAgICAgICAgKDEgPDwgMTQpCisjCQlkZWZpbmUgUjMwMF9SU19ST1VURV8xX0NPTE9SMV9ERVNUX1NISUZUIDE3CisjCQlkZWZpbmUgUjMwMF9SU19ST1VURV8xX0NPTE9SMV9ERVNUX01BU0sgICgzMSA8PCAxNykKKyMJCWRlZmluZSBSMzAwX1JTX1JPVVRFXzFfVU5LTk9XTjExICAgICAgICAgKDEgPDwgMTEpCisvKiBFTkQgKi8KKworLyogQkVHSU46IFNjaXNzb3JzIGFuZCBjbGlwcmVjdHMKKy8vIFRoZXJlIGFyZSBmb3VyIGNsaXBwaW5nIHJlY3RhbmdsZXMuIFRoZWlyIGNvcm5lciBjb29yZGluYXRlcyBhcmUgaW5jbHVzaXZlLgorLy8gRXZlcnkgcGl4ZWwgaXMgYXNzaWduZWQgYSBudW1iZXIgZnJvbSAwIGFuZCAxNSBieSBzZXR0aW5nIGJpdHMgMC0zIGRlcGVuZGluZworLy8gb24gd2hldGhlciB0aGUgcGl4ZWwgaXMgaW5zaWRlIGNsaXByZWN0cyAwLTMsIHJlc3BlY3RpdmVseS4gRm9yIGV4YW1wbGUsCisvLyBpZiBhIHBpeGVsIGlzIGluc2lkZSBjbGlwcmVjdHMgMCBhbmQgMSwgYnV0IG91dHNpZGUgMiBhbmQgMywgaXQgaXMgYXNzaWduZWQKKy8vIHRoZSBudW1iZXIgMyAoYmluYXJ5IDAwMTEpLgorLy8gSWZmIHRoZSBiaXQgY29ycmVzcG9uZGluZyB0byB0aGUgcGl4ZWwncyBudW1iZXIgaW4gUkVfQ0xJUFJFQ1RfQ05UTCBpcyBzZXQsCisvLyB0aGUgcGl4ZWwgaXMgcmFzdGVyaXplZC4KKy8vCisvLyBJbiBhZGRpdGlvbiB0byB0aGlzLCB0aGVyZSBpcyBhIHNjaXNzb3JzIHJlY3RhbmdsZS4gT25seSBwaXhlbHMgaW5zaWRlIHRoZQorLy8gc2Npc3NvcnMgcmVjdGFuZ2xlIGFyZSBkcmF3bi4gKGNvb3JkaW5hdGVzIGFyZSBpbmNsdXNpdmUpCisvLworLy8gRm9yIHNvbWUgcmVhc29uLCB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZWJ1ZmZlciBpcyBhdCAoMTQ0MCwgMTQ0MCkKKy8vIGZvciB0aGUgcHVycG9zZSBvZiBjbGlwcGluZyBhbmQgc2Npc3NvcnMuICovCisjZGVmaW5lIFIzMDBfUkVfQ0xJUFJFQ1RfVExfMCAgICAgICAgICAgICAgIDB4NDNCMAorI2RlZmluZSBSMzAwX1JFX0NMSVBSRUNUX0JSXzAgICAgICAgICAgICAgICAweDQzQjQKKyNkZWZpbmUgUjMwMF9SRV9DTElQUkVDVF9UTF8xICAgICAgICAgICAgICAgMHg0M0I4CisjZGVmaW5lIFIzMDBfUkVfQ0xJUFJFQ1RfQlJfMSAgICAgICAgICAgICAgIDB4NDNCQworI2RlZmluZSBSMzAwX1JFX0NMSVBSRUNUX1RMXzIgICAgICAgICAgICAgICAweDQzQzAKKyNkZWZpbmUgUjMwMF9SRV9DTElQUkVDVF9CUl8yICAgICAgICAgICAgICAgMHg0M0M0CisjZGVmaW5lIFIzMDBfUkVfQ0xJUFJFQ1RfVExfMyAgICAgICAgICAgICAgIDB4NDNDOAorI2RlZmluZSBSMzAwX1JFX0NMSVBSRUNUX0JSXzMgICAgICAgICAgICAgICAweDQzQ0MKKyMgICAgICAgZGVmaW5lIFIzMDBfQ0xJUFJFQ1RfT0ZGU0VUICAgICAgICAgICAgICAxNDQwCisjICAgICAgIGRlZmluZSBSMzAwX0NMSVBSRUNUX01BU0sgICAgICAgICAgICAgICAgMHgxRkZGCisjICAgICAgIGRlZmluZSBSMzAwX0NMSVBSRUNUX1hfU0hJRlQgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9DTElQUkVDVF9YX01BU0sgICAgICAgICAgICAgICgweDFGRkYgPDwgMCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQ0xJUFJFQ1RfWV9TSElGVCAgICAgICAgICAgICAxMworIyAgICAgICBkZWZpbmUgUjMwMF9DTElQUkVDVF9ZX01BU0sgICAgICAgICAgICAgICgweDFGRkYgPDwgMTMpCisjZGVmaW5lIFIzMDBfUkVfQ0xJUFJFQ1RfQ05UTCAgICAgICAgICAgICAgIDB4NDNEMAorIyAgICAgICBkZWZpbmUgUjMwMF9DTElQX09VVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX0NMSVBfMCAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQ0xJUF8xICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyKQorIyAgICAgICBkZWZpbmUgUjMwMF9DTElQXzEwICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMpCisjICAgICAgIGRlZmluZSBSMzAwX0NMSVBfMiAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQ0xJUF8yMCAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA1KQorIyAgICAgICBkZWZpbmUgUjMwMF9DTElQXzIxICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDYpCisjICAgICAgIGRlZmluZSBSMzAwX0NMSVBfMjEwICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQ0xJUF8zICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA4KQorIyAgICAgICBkZWZpbmUgUjMwMF9DTElQXzMwICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDkpCisjICAgICAgIGRlZmluZSBSMzAwX0NMSVBfMzEgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTApCisjICAgICAgIGRlZmluZSBSMzAwX0NMSVBfMzEwICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTEpCisjICAgICAgIGRlZmluZSBSMzAwX0NMSVBfMzIgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX0NMSVBfMzIwICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTMpCisjICAgICAgIGRlZmluZSBSMzAwX0NMSVBfMzIxICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTQpCisjICAgICAgIGRlZmluZSBSMzAwX0NMSVBfMzIxMCAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTUpCisKKy8qIGdhcCAqLworI2RlZmluZSBSMzAwX1JFX1NDSVNTT1JTX1RMICAgICAgICAgICAgICAgICAweDQzRTAKKyNkZWZpbmUgUjMwMF9SRV9TQ0lTU09SU19CUiAgICAgICAgICAgICAgICAgMHg0M0U0CisjICAgICAgIGRlZmluZSBSMzAwX1NDSVNTT1JTX09GRlNFVCAgICAgICAgICAgICAgMTQ0MAorIyAgICAgICBkZWZpbmUgUjMwMF9TQ0lTU09SU19YX1NISUZUICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfU0NJU1NPUlNfWF9NQVNLICAgICAgICAgICAgICAoMHgxRkZGIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX1NDSVNTT1JTX1lfU0hJRlQgICAgICAgICAgICAgMTMKKyMgICAgICAgZGVmaW5lIFIzMDBfU0NJU1NPUlNfWV9NQVNLICAgICAgICAgICAgICAoMHgxRkZGIDw8IDEzKQorLyogRU5EICovCisKKy8qIEJFR0lOOiBUZXh0dXJlIHNwZWNpZmljYXRpb24KKy8vIFRoZSB0ZXh0dXJlIHNwZWNpZmljYXRpb24gZHdvcmRzIGFyZSBncm91cGVkIGJ5IG1lYW5pbmcgYW5kIG5vdCBieSB0ZXh0dXJlIHVuaXQuCisvLyBUaGlzIG1lYW5zIHRoYXQgZS5nLiB0aGUgb2Zmc2V0IGZvciB0ZXh0dXJlIGltYWdlIHVuaXQgTiBpcyBmb3VuZCBpbiByZWdpc3RlcgorLy8gVFhfT0ZGU0VUXzAgKyAoNCpOKSAqLworI2RlZmluZSBSMzAwX1RYX0ZJTFRFUl8wICAgICAgICAgICAgICAgICAgICAweDQ0MDAKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfUkVQRUFUICAgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX1RYX01JUlJPUkVEICAgICAgICAgICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9DTEFNUCAgICAgICAgICAgICAgICAgICAgIDQKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAyCisjICAgICAgIGRlZmluZSBSMzAwX1RYX0NMQU1QX1RPX0JPUkRFUiAgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9XUkFQX1NfU0hJRlQgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfV1JBUF9TX01BU0sgICAgICAgICAgICAgICAoNyA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9XUkFQX1RfU0hJRlQgICAgICAgICAgICAgIDMKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfV1JBUF9UX01BU0sgICAgICAgICAgICAgICAoNyA8PCAzKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9XUkFQX1FfU0hJRlQgICAgICAgICAgICAgIDYKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfV1JBUF9RX01BU0sgICAgICAgICAgICAgICAoNyA8PCA2KQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NQUdfRklMVEVSX05FQVJFU1QgICAgICAgICgxIDw8IDkpCisjICAgICAgIGRlZmluZSBSMzAwX1RYX01BR19GSUxURVJfTElORUFSICAgICAgICAgKDIgPDwgOSkKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfTUFHX0ZJTFRFUl9NQVNLICAgICAgICAgICAoMyA8PCA5KQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX05FQVJFU1QgICAgICAgICgxIDw8IDExKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0xJTkVBUiAgICAgICAgICgyIDw8IDExKQorIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX05FQVJFU1RfTUlQX05FQVJFU1QgICAgICAgKDUgIDw8ICAxMSkKKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9ORUFSRVNUX01JUF9MSU5FQVIgICAgICAgICg5ICA8PCAgMTEpCisjCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfTElORUFSX01JUF9ORUFSRVNUICAgICAgICAoNiAgPDwgIDExKQorIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0xJTkVBUl9NSVBfTElORUFSICAgICAgICAgKDEwIDw8ICAxMSkKKworLyogTk9URTogTkVBUkVTVCBkb2VzbnQgc2VlbSB0byBleGlzdC4KKyAgIEltIG5vdCBzZXRpbmcgTUFHX0ZJTFRFUl9NQVNLIGFuZCAoMyA8PCAxMSkgb24gZm9yIGFsbAorICAgYW5pc290cm9weSBtb2RlcyBiZWNhdXNlIHRoYXQgd291bGQgdm9pZCBzZWxlY3RlZCBtYWcgZmlsdGVyICovCisjCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTkVBUkVTVCAgICAgICAgICAgICAoKDAgPDwgMTMpIC8qfFIzMDBfVFhfTUFHX0ZJTFRFUl9NQVNLfCgzPDwxMSkqLykKKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19MSU5FQVIgICAgICAgICAgICAgICgoMCA8PCAxMykgLyp8UjMwMF9UWF9NQUdfRklMVEVSX01BU0t8KDM8PDExKSovKQorIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX05FQVJFU1RfTUlQX05FQVJFU1QgKCgxIDw8IDEzKSAvKnxSMzAwX1RYX01BR19GSUxURVJfTUFTS3woMzw8MTEpKi8pCisjCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTkVBUkVTVF9NSVBfTElORUFSICAoKDIgPDwgMTMpIC8qfFIzMDBfVFhfTUFHX0ZJTFRFUl9NQVNLfCgzPDwxMSkqLykKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9NQVNLICAgICAgICAgICAoICgxNSA8PCAxMSkgfCAoMyA8PCAxMykgKQorIwlkZWZpbmUgUjMwMF9UWF9NQVhfQU5JU09fMV9UT18xICAoMCA8PCAyMSkKKyMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzJfVE9fMSAgKDIgPDwgMjEpCisjCWRlZmluZSBSMzAwX1RYX01BWF9BTklTT180X1RPXzEgICg0IDw8IDIxKQorIwlkZWZpbmUgUjMwMF9UWF9NQVhfQU5JU09fOF9UT18xICAoNiA8PCAyMSkKKyMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzE2X1RPXzEgKDggPDwgMjEpCisjCWRlZmluZSBSMzAwX1RYX01BWF9BTklTT19NQVNLICAgICgxNCA8PCAyMSkKKworI2RlZmluZSBSMzAwX1RYX1VOSzFfMCAgICAgICAgICAgICAgICAgICAgICAweDQ0NDAKKyMJZGVmaW5lIFIzMDBfTE9EX0JJQVNfTUFTSwkgICAgMHgxZmZmCisKKyNkZWZpbmUgUjMwMF9UWF9TSVpFXzAgICAgICAgICAgICAgICAgICAgICAgMHg0NDgwCisjICAgICAgIGRlZmluZSBSMzAwX1RYX1dJRFRITUFTS19TSElGVCAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9XSURUSE1BU0tfTUFTSyAgICAgICAgICAgICgyMDQ3IDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX1RYX0hFSUdIVE1BU0tfU0hJRlQgICAgICAgICAgMTEKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfSEVJR0hUTUFTS19NQVNLICAgICAgICAgICAoMjA0NyA8PCAxMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfVU5LMjMgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfU0laRV9TSElGVCAgICAgICAgICAgICAgICAyNiAvKiBsYXJnZXN0IG9mIHdpZHRoLCBoZWlnaHQgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfU0laRV9NQVNLICAgICAgICAgICAgICAgICAoMTUgPDwgMjYpCisjZGVmaW5lIFIzMDBfVFhfRk9STUFUXzAgICAgICAgICAgICAgICAgICAgIDB4NDRDMAorCS8qIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZm9ybWF0IHdvcmQgYnkgV2xhZGltaXIgdmFuIGRlciBMYWFuICovCisJLyogVGhlIFgsIFksIFogYW5kIFcgcmVmZXIgdG8gdGhlIGxheW91dCBvZiB0aGUgY29tcG9uZW50cy4KKwkgICBUaGV5IGFyZSBnaXZlbiBtZWFuaW5ncyBhcyBSLCBHLCBCIGFuZCBBbHBoYSBieSB0aGUgc3dpenpsZQorCSAgIHNwZWNpZmljYXRpb24gKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1g4CQkgICAgMHgwCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9YMTYJCSAgICAweDEKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1k0WDQJCSAgICAweDIKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1k4WDgJCSAgICAweDMKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1kxNlgxNgkJICAgIDB4NAorIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfWjNZM1gyCQkgICAgMHg1CisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9aNVk2WDUJCSAgICAweDYKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1o2WTVYNQkJICAgIDB4NworIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfWjExWTExWDEwCQkgICAgMHg4CisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9aMTBZMTFYMTEJCSAgICAweDkKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1c0WjRZNFg0CQkgICAgMHhBCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9XMVo1WTVYNQkJICAgIDB4QgorIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfVzhaOFk4WDgJCSAgICAweEMKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1cyWjEwWTEwWDEwCSAgICAweEQKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1cxNloxNlkxNlgxNgkgICAgMHhFCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9EWFQxCSAgICAJICAgIDB4RgorIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRFhUMwkgICAgCSAgICAweDEwCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9EWFQ1CSAgICAJICAgIDB4MTEKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0QzRE1GVF9DeFY4VTgJICAgIDB4MTIgICAgIC8qIG5vIHN3aXp6bGUgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0E4UjhHOEI4CSAgICAJICAgIDB4MTMgICAgIC8qIG5vIHN3aXp6bGUgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0I4RzhfQjhHOAkgICAgCSAgICAweDE0ICAgICAvKiBubyBzd2l6emxlICovCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9HOFI4X0c4QjgJICAgIAkgICAgMHgxNSAgICAgLyogbm8gc3dpenpsZSAqLworCQkJCQkJICAvKiAweDE2IC0gc29tZSAxNiBiaXQgZ3JlZW4gZm9ybWF0Li4gPz8gKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1VOSzI1CQkgICAoMSA8PCAyNSkgLyogbm8gc3dpenpsZSAqLworCisJLyogZ2FwICovCisJLyogRmxvYXRpbmcgcG9pbnQgZm9ybWF0cyAqLworCS8qIE5vdGUgLSBoYXJkd2FyZSBzdXBwb3J0cyBib3RoIDE2IGFuZCAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0ZMX0kxNgkgICAgCSAgICAweDE4CisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9GTF9JMTZBMTYJICAgIAkgICAgMHgxOQorIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRkxfUjE2RzE2QjE2QTE2CSAgICAweDFBCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9GTF9JMzIJICAgIAkgICAgMHgxQgorIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRkxfSTMyQTMyCSAgICAJICAgIDB4MUMKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0ZMX1IzMkczMkIzMkEzMgkgICAgMHgxRAorCS8qIGFscGhhIG1vZGVzLCBjb252ZW5pZW5jZSBtb3N0bHkgKi8KKwkvKiBpZiB5b3UgaGF2ZSBhbHBoYSwgcGljayBjb25zdGFudCBhcHByb3ByaWF0ZSB0byB0aGUKKwkgICBudW1iZXIgb2YgY2hhbm5lbHMgKDEgZm9yIEk4LCAyIGZvciBJOEE4LCA0IGZvciBSOEc4QjhBOCwgZXRjICovCisjIAlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQUxQSEFfMUNICQkgICAgMHgwMDAKKyMgCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9BTFBIQV8yQ0gJCSAgICAweDIwMAorIyAJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0FMUEhBXzRDSAkJICAgIDB4NjAwCisjIAlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQUxQSEFfTk9ORQkgICAgMHhBMDAKKwkvKiBTd2l6emxpbmcgKi8KKwkvKiBjb25zdGFudHMgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1gJCTAKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1kJCTEKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1oJCTIKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1cJCTMKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1pFUk8JNAorIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfT05FCTUKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NVVF9aCTYJCS8qIDIuMCpaLCBldmVyeXRoaW5nIGFib3ZlIDEuMCBpcyBzZXQgdG8gMC4wICovCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DVVRfVwk3CQkvKiAyLjAqVywgZXZlcnl0aGluZyBhYm92ZSAxLjAgaXMgc2V0IHRvIDAuMCAqLworCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9CX1NISUZUCTE4CisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9HX1NISUZUCTE1CisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9SX1NISUZUCTEyCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9BX1NISUZUCTkKKwkvKiBDb252ZW5pZW5jZSBtYWNybyB0byB0YWtlIGNhcmUgb2YgbGF5b3V0IGFuZCBzd2l6emxpbmcgKi8KKyMJZGVmaW5lIFIzMDBfRUFTWV9UWF9GT1JNQVQoQiwgRywgUiwgQSwgRk1UKQkoXAorCSAgKChSMzAwX1RYX0ZPUk1BVF8jI0IpPDxSMzAwX1RYX0ZPUk1BVF9CX1NISUZUKSBcCisJfCAoKFIzMDBfVFhfRk9STUFUXyMjRyk8PFIzMDBfVFhfRk9STUFUX0dfU0hJRlQpIFwKKwl8ICgoUjMwMF9UWF9GT1JNQVRfIyNSKTw8UjMwMF9UWF9GT1JNQVRfUl9TSElGVCkgXAorCXwgKChSMzAwX1RYX0ZPUk1BVF8jI0EpPDxSMzAwX1RYX0ZPUk1BVF9BX1NISUZUKSBcCisJfCAoUjMwMF9UWF9GT1JNQVRfIyNGTVQpIFwKKwkgICkKKwkvKiBUaGVzZSBjYW4gYmUgT1JlZCB3aXRoIHJlc3VsdCBvZiBSMzAwX0VBU1lfVFhfRk9STUFUKCkgKi8KKwkvKiBXZSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRoZXkgZG8uIFRha2UgdmFsdWVzIGZyb20gYSBjb25zdGFudCBjb2xvciA/ICovCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DT05TVF9YCQkoMTw8NSkKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NPTlNUX1kJCSgyPDw1KQorIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ09OU1RfWgkJKDQ8PDUpCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DT05TVF9XCQkoODw8NSkKKworIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfWVVWX01PREUJCTB4MDA4MDAwMDAKKworI2RlZmluZSBSMzAwX1RYX09GRlNFVF8wICAgICAgICAgICAgICAgICAgICAweDQ1NDAKKy8qIEJFR0lOOiBHdWVzcyBmcm9tIFIyMDAgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfVFhPX0VORElBTl9OT19TV0FQICAgICAgICAgICAoMCA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fRU5ESUFOX0JZVEVfU1dBUCAgICAgICAgICgxIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX1RYT19FTkRJQU5fV09SRF9TV0FQICAgICAgICAgKDIgPDwgMCkKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhPX0VORElBTl9IQUxGRFdfU1dBUCAgICAgICAoMyA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fT0ZGU0VUX01BU0sgICAgICAgICAgICAgIDB4ZmZmZmZmZTAKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhPX09GRlNFVF9TSElGVCAgICAgICAgICAgICA1CisvKiBFTkQgKi8KKyNkZWZpbmUgUjMwMF9UWF9VTks0XzAgICAgICAgICAgICAgICAgICAgICAgMHg0NTgwCisjZGVmaW5lIFIzMDBfVFhfQk9SREVSX0NPTE9SXzAgICAgICAgICAgICAgIDB4NDVDMCAvL2ZmMDBmZjAwID09IHsgMCwgMS4wLCAwLCAxLjAgfQorCisvKiBFTkQgKi8KKworLyogQkVHSU46IEZyYWdtZW50IHByb2dyYW0gaW5zdHJ1Y3Rpb24gc2V0CisvLyBGcmFnbWVudCBwcm9ncmFtcyBhcmUgd3JpdHRlbiBkaXJlY3RseSBpbnRvIHJlZ2lzdGVyIHNwYWNlLgorLy8gVGhlcmUgYXJlIHNlcGFyYXRlIGluc3RydWN0aW9uIHN0cmVhbXMgZm9yIHRleHR1cmUgaW5zdHJ1Y3Rpb25zIGFuZCBBTFUKKy8vIGluc3RydWN0aW9ucy4KKy8vIEluIG9yZGVyIHRvIHN5bmNocm9uaXplIHRoZXNlIHN0cmVhbXMsIHRoZSBwcm9ncmFtIGlzIGRpdmlkZWQgaW50byB1cAorLy8gdG8gNCBub2Rlcy4gRWFjaCBub2RlIGJlZ2lucyB3aXRoIGEgbnVtYmVyIG9mIFRFWCBvcGVyYXRpb25zLCBmb2xsb3dlZAorLy8gYnkgYSBudW1iZXIgb2YgQUxVIG9wZXJhdGlvbnMuCisvLyBUaGUgZmlyc3Qgbm9kZSBjYW4gaGF2ZSB6ZXJvIFRFWCBvcHMsIGFsbCBzdWJzZXF1ZW50IG5vZGVzIG11c3QgaGF2ZSBhdCBsZWFzdAorLy8gb25lIFRFWCBvcHMuCisvLyBBbGwgbm9kZXMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBBTFUgb3AuCisvLworLy8gVGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vZGUgaXMgc3RvcmVkIGluIFBGU19DTlRMXzA6IEEgdmFsdWUgb2YgMCBtZWFucworLy8gMSBub2RlLCBhIHZhbHVlIG9mIDMgbWVhbnMgNCBub2Rlcy4KKy8vIFRoZSB0b3RhbCBhbW91bnQgb2YgaW5zdHJ1Y3Rpb25zIGlzIGRlZmluZWQgaW4gUEZTX0NOVExfMi4gVGhlIG9mZnNldHMgYXJlCisvLyBvZmZzZXRzIGludG8gdGhlIHJlc3BlY3RpdmUgaW5zdHJ1Y3Rpb24gc3RyZWFtcywgd2hpbGUgKl9FTkQgcG9pbnRzIHRvIHRoZQorLy8gbGFzdCBpbnN0cnVjdGlvbiByZWxhdGl2ZSB0byB0aGlzIG9mZnNldC4gKi8KKyNkZWZpbmUgUjMwMF9QRlNfQ05UTF8wICAgICAgICAgICAgICAgICAgICAgMHg0NjAwCisjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0xBU1RfTk9ERVNfU0hJRlQgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9MQVNUX05PREVTX01BU0sgICAgICgzIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0ZJUlNUX05PREVfSEFTX1RFWCAgKDEgPDwgMykKKyNkZWZpbmUgUjMwMF9QRlNfQ05UTF8xICAgICAgICAgICAgICAgICAgICAgMHg0NjA0CisvKiBUaGVyZSBpcyBhbiB1bnNoaWZ0ZWQgdmFsdWUgaGVyZSB3aGljaCBoYXMgc28gZmFyIGFsd2F5cyBiZWVuIGVxdWFsIHRvIHRoZQorLy8gaW5kZXggb2YgdGhlIGhpZ2hlc3QgdXNlZCB0ZW1wb3JhcnkgcmVnaXN0ZXIuICovCisjZGVmaW5lIFIzMDBfUEZTX0NOVExfMiAgICAgICAgICAgICAgICAgICAgIDB4NDYwOAorIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9BTFVfT0ZGU0VUX1NISUZUICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfQUxVX09GRlNFVF9NQVNLICAgICAoNjMgPDwgMCkKKyMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfQUxVX0VORF9TSElGVCAgICAgICA2CisjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0FMVV9FTkRfTUFTSyAgICAgICAgKDYzIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9PRkZTRVRfU0hJRlQgICAgMTIKKyMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfVEVYX09GRlNFVF9NQVNLICAgICAoMzEgPDwgMTIpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9FTkRfU0hJRlQgICAgICAgMTgKKyMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfVEVYX0VORF9NQVNLICAgICAgICAoMzEgPDwgMTgpIC8qIEdVRVNTICovCisKKy8qIGdhcCAqLworLyogTm9kZXMgYXJlIHN0b3JlZCBiYWNrd2FyZHMuIFRoZSBsYXN0IGFjdGl2ZSBub2RlIGlzIGFsd2F5cyBzdG9yZWQgaW4KKy8vIFBGU19OT0RFXzMuCisvLyBFeGFtcGxlOiBJbiBhIDItbm9kZSBwcm9ncmFtLCBOT0RFXzAgYW5kIE5PREVfMSBhcmUgc2V0IHRvIDAuIFRoZQorLy8gZmlyc3Qgbm9kZSBpcyBzdG9yZWQgaW4gTk9ERV8yLCB0aGUgc2Vjb25kIG5vZGUgaXMgc3RvcmVkIGluIE5PREVfMy4KKy8vCisvLyBPZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgbWFzdGVyIG9mZnNldCBmcm9tIFBGU19DTlRMXzIuCisvLyBMQVNUX05PREUgaXMgc2V0IGZvciB0aGUgbGFzdCBub2RlLCBhbmQgb25seSBmb3IgdGhlIGxhc3Qgbm9kZS4gKi8KKyNkZWZpbmUgUjMwMF9QRlNfTk9ERV8wICAgICAgICAgICAgICAgICAgICAgMHg0NjEwCisjZGVmaW5lIFIzMDBfUEZTX05PREVfMSAgICAgICAgICAgICAgICAgICAgIDB4NDYxNAorI2RlZmluZSBSMzAwX1BGU19OT0RFXzIgICAgICAgICAgICAgICAgICAgICAweDQ2MTgKKyNkZWZpbmUgUjMwMF9QRlNfTk9ERV8zICAgICAgICAgICAgICAgICAgICAgMHg0NjFDCisjICAgICAgIGRlZmluZSBSMzAwX1BGU19OT0RFX0FMVV9PRkZTRVRfU0hJRlQgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9BTFVfT0ZGU0VUX01BU0sgICAgICg2MyA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9BTFVfRU5EX1NISUZUICAgICAgIDYKKyMgICAgICAgZGVmaW5lIFIzMDBfUEZTX05PREVfQUxVX0VORF9NQVNLICAgICAgICAoNjMgPDwgNikKKyMgICAgICAgZGVmaW5lIFIzMDBfUEZTX05PREVfVEVYX09GRlNFVF9TSElGVCAgICAxMgorIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9URVhfT0ZGU0VUX01BU0sgICAgICgzMSA8PCAxMikKKyMgICAgICAgZGVmaW5lIFIzMDBfUEZTX05PREVfVEVYX0VORF9TSElGVCAgICAgICAxNworIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9URVhfRU5EX01BU0sgICAgICAgICgzMSA8PCAxNykKKyMgICAgICAgZGVmaW5lIFIzMDBfUEZTX05PREVfTEFTVF9OT0RFICAgICAgICAgICAoMSA8PCAyMikKKworLyogVEVYCisvLyBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGV4dHVyZSBpbnN0cnVjdGlvbnMgY2Fubm90IHdyaXRlIGludG8gb3V0cHV0CisvLyByZWdpc3RlcnMgZGlyZWN0bHkuIEEgc3Vic2VxdWVudCBBTFUgaW5zdHJ1Y3Rpb24gaXMgYWx3YXlzIG5lY2Vzc2FyeSwKKy8vIGV2ZW4gaWYgaXQncyBqdXN0IE1BRCBvMCwgcjAsIDEsIDAgKi8KKyNkZWZpbmUgUjMwMF9QRlNfVEVYSV8wICAgICAgICAgICAgICAgICAgICAgMHg0NjIwCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX1NSQ19TSElGVCAgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9GUElUWF9TUkNfTUFTSyAgICAgICAgICAgICAgICgzMSA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9GUElUWF9TUkNfQ09OU1QgICAgICAgICAgICAgICgxIDw8IDUpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX0RTVF9TSElGVCAgICAgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9GUElUWF9EU1RfTUFTSyAgICAgICAgICAgICAgICgzMSA8PCA2KQorIyAgICAgICBkZWZpbmUgUjMwMF9GUElUWF9JTUFHRV9TSElGVCAgICAgICAgICAgIDExCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX0lNQUdFX01BU0sgICAgICAgICAgICAgKDE1IDw8IDExKSAvKiBHVUVTUyBiYXNlZCBvbiBsYXlvdXQgYW5kIG5hdGl2ZSBsaW1pdHMgKi8KKy8qIFVuc3VyZSBpZiB0aGVzZSBhcmUgb3Bjb2Rlcywgb3Igc29tZSBraW5kIG9mIGJpdGZpZWxkLCBidXQgdGhpcyBpcyBob3cKKyAqIHRoZXkgd2VyZSBzZXQgd2hlbiBJIGNoZWNrZWQKKyAqLworIwkJZGVmaW5lIFIzMDBfRlBJVFhfT1BDT0RFX1NISUZUCQkJMTUKKyMJCQlkZWZpbmUgUjMwMF9GUElUWF9PUF9URVgJCQkxCisjCQkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfVFhQCQkJMworIwkJCWRlZmluZSBSMzAwX0ZQSVRYX09QX1RYQgkJCTQKKworLyogQUxVCisvLyBUaGUgQUxVIGluc3RydWN0aW9ucyByZWdpc3RlciBibG9ja3MgYXJlIGVudW1lcmF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcmRlcgorLy8gaW4gd2hpY2ggZmdscnguIEkgYXNzdW1lIHRoZXJlIGlzIHNwYWNlIGZvciA2NCBpbnN0cnVjdGlvbnMsIHNpbmNlCisvLyBlYWNoIGJsb2NrIGhhcyBzcGFjZSBmb3IgYSBtYXhpbXVtIG9mIDY0IERXT1JEcywgYW5kIHRoaXMgbWF0Y2hlcyByZXBvcnRlZAorLy8gbmF0aXZlIGxpbWl0cy4KKy8vCisvLyBUaGUgYmFzaWMgZnVuY3Rpb25hbCBibG9jayBzZWVtcyB0byBiZSBvbmUgTUFEIGZvciBlYWNoIGNvbG9yIGFuZCBhbHBoYSwKKy8vIGFuZCBhbiBhZGRlciB0aGF0IGFkZHMgYWxsIGNvbXBvbmVudHMgYWZ0ZXIgdGhlIE1VTC4KKy8vICAtIEFERCwgTVVMLCBNQUQgZXRjLjogdXNlIE1BRCB3aXRoIGFwcHJvcHJpYXRlIG5ldXRyYWwgb3BlcmFuZHMKKy8vICAtIERQNDogVXNlIE9VVENfRFA0LCBPVVRBX0RQNAorLy8gIC0gRFAzOiBVc2UgT1VUQ19EUDMsIE9VVEFfRFA0LCBhcHByb3ByaWF0ZSBhbHBoYSBvcGVyYW5kcworLy8gIC0gRFBIOiBVc2UgT1VUQ19EUDQsIE9VVEFfRFA0LCBhcHByb3ByaWF0ZSBhbHBoYSBvcGVyYW5kcworLy8gIC0gQ01QOiBJZiBBUkcyIDwgMCwgcmV0dXJuIEFSRzEsIGVsc2UgcmV0dXJuIEFSRzAKKy8vICAtIEZMUjogdXNlIEZSQytNQUQKKy8vICAtIFhQRDogdXNlIE1BRCtNQUQKKy8vICAtIFNHRSwgU0xUOiB1c2UgTUFEK0NNUAorLy8gIC0gUlNROiB1c2UgQUJTIG1vZGlmaWVyIGZvciBhcmd1bWVudAorLy8gIC0gVXNlIE9VVENfUkVQTF9BTFBIQSB0byB3cml0ZSByZXN1bHRzIG9mIGFuIGFscGhhLW9ubHkgb3BlcmF0aW9uIChlLmcuIFJDUCkKKy8vICAgIGludG8gY29sb3IgcmVnaXN0ZXIKKy8vICAtIGFwcGFyZW50bHksIHRoZXJlJ3Mgbm8gcXVpY2sgRFNUIG9wZXJhdGlvbgorLy8gIC0gZmdscnggc2V0IEZQSTJfVU5LTk9XTl8zMSBvbiBhICJNQUQgZnJhZ21lbnQuY29sb3IsIHRtcDAsIHRtcDEsIHRtcDIiCisvLyAgLSBmZ2xyeCBzZXQgRlBJMl9VTktOT1dOXzMxIG9uIGEgIk1BWCByMiwgcjEsIGMwIgorLy8gIC0gZmdscnggb25jZSBzZXQgRlBJMF9VTktOT1dOXzMxIG9uIGEgIkZSQyByMSwgcjEiCisvLworLy8gT3BlcmFuZCBzZWxlY3Rpb24KKy8vIEZpcnN0IHN0YWdlIHNlbGVjdHMgdGhyZWUgc291cmNlcyBmcm9tIHRoZSBhdmFpbGFibGUgcmVnaXN0ZXJzIGFuZAorLy8gY29uc3RhbnQgcGFyYW1ldGVycy4gVGhpcyBpcyBkZWZpbmVkIGluIElOU1RSMSAoY29sb3IpIGFuZCBJTlNUUjMgKGFscGhhKS4KKy8vIGZnbHJ4IHNvcnRzIHRoZSB0aHJlZSBzb3VyY2UgZmllbGRzOiBSZWdpc3RlcnMgYmVmb3JlIGNvbnN0YW50cywKKy8vIGxvd2VyIGluZGljZXMgYmVmb3JlIGhpZ2hlciBpbmRpY2VzOyBJIGRvIG5vdCBrbm93IHdoZXRoZXIgdGhpcyBpcyBuZWNlc3NhcnkuCisvLyBmZ2xyeCBmaWxscyB1bnVzZWQgc291cmNlcyB3aXRoICJyZWFkIGNvbnN0YW50IDAiCisvLyBBY2NvcmRpbmcgdG8gc3BlY3MsIHlvdSBjYW5ub3Qgc2VsZWN0IG1vcmUgdGhhbiB0d28gZGlmZmVyZW50IGNvbnN0YW50cy4KKy8vCisvLyBTZWNvbmQgc3RhZ2Ugc2VsZWN0cyB0aGUgb3BlcmFuZHMgZnJvbSB0aGUgc291cmNlcy4gVGhpcyBpcyBkZWZpbmVkIGluCisvLyBJTlNUUjAgKGNvbG9yKSBhbmQgSU5TVFIyIChhbHBoYSkuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIHNwZWNpYWwgY29uc3RhbnRzCisvLyB6ZXJvIGFuZCBvbmUuCisvLyBTd2l6emxpbmcgYW5kIG5lZ2F0aW9uIGhhcHBlbnMgaW4gdGhpcyBzdGFnZSwgYXMgd2VsbC4KKy8vCisvLyBJbXBvcnRhbnQ6IENvbG9yIGFuZCBhbHBoYSBzZWVtIHRvIGJlIG1vc3RseSBzZXBhcmF0ZSwgaS5lLiB0aGVpciBzb3VyY2VzCisvLyBzZWxlY3Rpb24gYXBwZWFycyB0byBiZSBmdWxseSBpbmRlcGVuZGVudCAodGhlIHJlZ2lzdGVyIHN0b3JhZ2UgaXMgcHJvYmFibHkKKy8vIHBoeXNpY2FsbHkgc3BsaXQgaW50byBhIGNvbG9yIGFuZCBhbiBhbHBoYSBzZWN0aW9uKS4KKy8vIEhvd2V2ZXIgKGJlY2F1c2Ugb2YgdGhlIGFwcGFyZW50IHBoeXNpY2FsIHNwbGl0KSwgdGhlcmUgaXMgc29tZSBpbnRlcmFjdGlvbgorLy8gV1JUIHN3aXp6bGluZy4gSWYsIGZvciBleGFtcGxlLCB5b3Ugd2FudCB0byBsb2FkIGFuIFIgY29tcG9uZW50IGludG8gYW4KKy8vIEFscGhhIG9wZXJhbmQsIHRoaXMgUiBjb21wb25lbnQgaXMgdGFrZW4gZnJvbSBhICpjb2xvciogc291cmNlLCBub3QgZnJvbQorLy8gYW4gYWxwaGEgc291cmNlLiBUaGUgY29ycmVzcG9uZGluZyByZWdpc3RlciBkb2Vzbid0IGV2ZW4gaGF2ZSB0byBhcHBlYXIgaW4KKy8vIHRoZSBhbHBoYSBzb3VyY2VzIGxpc3QuIChJIGhvcGUgdGhpcyBhbGxsIG1ha2VzIHNlbnNlIHRvIHlvdSkKKy8vCisvLyBEZXN0aW5hdGlvbiBzZWxlY3Rpb24KKy8vIFRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpbmRleCBpcyBpbiBGUEkxIChjb2xvcikgYW5kIEZQSTMgKGFscGhhKSB0b2dldGhlcgorLy8gd2l0aCBlbmFibGUgYml0cy4KKy8vIFRoZXJlIGFyZSBzZXBhcmF0ZSBlbmFibGUgYml0cyBmb3Igd3JpdGluZyBpbnRvIHRlbXBvcmFyeSByZWdpc3RlcnMKKy8vIChEU1RDX1JFR18qIC9EU1RBX1JFRykgYW5kIGFuZCBwcm9ncmFtIG91dHB1dCByZWdpc3RlcnMgKERTVENfT1VUUFVUXyogL0RTVEFfT1VUUFVUKS4KKy8vIFlvdSBjYW4gd3JpdGUgdG8gYm90aCBhdCBvbmNlLCBvciBub3Qgd3JpdGUgYXQgYWxsICh0aGUgc2FtZSBpbmRleAorLy8gbXVzdCBiZSB1c2VkIGZvciBib3RoKS4KKy8vCisvLyBOb3RlOiBUaGVyZSBpcyBhIHNwZWNpYWwgZm9ybSBmb3IgTFJQCisvLyAgLSBBcmd1bWVudCBvcmRlciBpcyB0aGUgc2FtZSBhcyBpbiBBUkJfZnJhZ21lbnRfcHJvZ3JhbS4KKy8vICAtIE9wZXJhdGlvbiBpcyBNQUQKKy8vICAtIEFSRzEgaXMgc2V0IHRvIEFSR0NfU1JDMUNfTFJQL0FSR0NfU1JDMUFfTFJQCisvLyAgLSBTZXQgRlBJMC9GUEkyX1NQRUNJQUxfTFJQCisvLyBBcmJpdHJhcnkgTFJQIChpbmNsdWRpbmcgc3VwcG9ydCBmb3Igc3dpenpsaW5nKSByZXF1aXJlcyB2YW5pbGxhIE1BRCtNQUQgKi8KKyNkZWZpbmUgUjMwMF9QRlNfSU5TVFIxXzAgICAgICAgICAgICAgICAgICAgMHg0NkMwCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMENfU0hJRlQgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX1NSQzBDX01BU0sgICAgICAgICAgICAgICgzMSA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX1NSQzBDX0NPTlNUICAgICAgICAgICAgICgxIDw8IDUpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMUNfU0hJRlQgICAgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX1NSQzFDX01BU0sgICAgICAgICAgICAgICgzMSA8PCA2KQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX1NSQzFDX0NPTlNUICAgICAgICAgICAgICgxIDw8IDExKQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX1NSQzJDX1NISUZUICAgICAgICAgICAgIDEyCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMkNfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX1NSQzJDX0NPTlNUICAgICAgICAgICAgICgxIDw8IDE3KQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfU0hJRlQgICAgICAgICAgICAgIDE4CisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfRFNUQ19NQVNLICAgICAgICAgICAgICAgKDMxIDw8IDE4KQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfUkVHX1ggICAgICAgICAgICAgICgxIDw8IDIzKQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfUkVHX1kgICAgICAgICAgICAgICgxIDw8IDI0KQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfUkVHX1ogICAgICAgICAgICAgICgxIDw8IDI1KQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfT1VUUFVUX1ggICAgICAgICAgICgxIDw8IDI2KQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfT1VUUFVUX1kgICAgICAgICAgICgxIDw8IDI3KQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfT1VUUFVUX1ogICAgICAgICAgICgxIDw8IDI4KQorCisjZGVmaW5lIFIzMDBfUEZTX0lOU1RSM18wICAgICAgICAgICAgICAgICAgIDB4NDdDMAorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX1NSQzBBX1NISUZUICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMwQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgMCkKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMwQV9DT05TVCAgICAgICAgICAgICAoMSA8PCA1KQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX1NSQzFBX1NISUZUICAgICAgICAgICAgIDYKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMxQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgNikKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMxQV9DT05TVCAgICAgICAgICAgICAoMSA8PCAxMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMyQV9TSElGVCAgICAgICAgICAgICAxMgorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX1NSQzJBX01BU0sgICAgICAgICAgICAgICgzMSA8PCAxMikKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMyQV9DT05TVCAgICAgICAgICAgICAoMSA8PCAxNykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19EU1RBX1NISUZUICAgICAgICAgICAgICAxOAorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX0RTVEFfTUFTSyAgICAgICAgICAgICAgICgzMSA8PCAxOCkKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19EU1RBX1JFRyAgICAgICAgICAgICAgICAoMSA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19EU1RBX09VVFBVVCAgICAgICAgICAgICAoMSA8PCAyNCkKKworI2RlZmluZSBSMzAwX1BGU19JTlNUUjBfMCAgICAgICAgICAgICAgICAgICAweDQ4QzAKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzBDX1hZWiAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMwQ19YWFggICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMENfWVlZICAgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzBDX1paWiAgICAgICAgICAzCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMxQ19YWVogICAgICAgICAgNAorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMUNfWFhYICAgICAgICAgIDUKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzFDX1lZWSAgICAgICAgICA2CisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMxQ19aWlogICAgICAgICAgNworIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMkNfWFlaICAgICAgICAgIDgKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzJDX1hYWCAgICAgICAgICA5CisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMyQ19ZWVkgICAgICAgICAgMTAKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzJDX1paWiAgICAgICAgICAxMQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMEEgICAgICAgICAgICAgIDEyCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMxQSAgICAgICAgICAgICAgMTMKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzJBICAgICAgICAgICAgICAxNAorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMUNfTFJQICAgICAgICAgIDE1CisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19aRVJPICAgICAgICAgICAgICAgMjAKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX09ORSAgICAgICAgICAgICAgICAyMQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfSEFMRiAgICAgICAgICAgICAgIDIyIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMwQ19ZWlggICAgICAgICAgMjMKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzFDX1laWCAgICAgICAgICAyNAorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMkNfWVpYICAgICAgICAgIDI1CisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMwQ19aWFkgICAgICAgICAgMjYKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzFDX1pYWSAgICAgICAgICAyNworIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMkNfWlhZICAgICAgICAgIDI4CisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMwQ0FfV1pZICAgICAgICAgMjkKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzFDQV9XWlkgICAgICAgICAzMAorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMkNBX1daWSAgICAgICAgIDMxCisKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkcwQ19TSElGVCAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHMENfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHMENfTkVHICAgICAgICAgICAgICAgKDEgPDwgNSkKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkcwQ19BQlMgICAgICAgICAgICAgICAoMSA8PCA2KQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSRzFDX1NISUZUICAgICAgICAgICAgIDcKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkcxQ19NQVNLICAgICAgICAgICAgICAoMzEgPDwgNykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkcxQ19ORUcgICAgICAgICAgICAgICAoMSA8PCAxMikKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkcxQ19BQlMgICAgICAgICAgICAgICAoMSA8PCAxMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkcyQ19TSElGVCAgICAgICAgICAgICAxNAorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSRzJDX01BU0sgICAgICAgICAgICAgICgzMSA8PCAxNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkcyQ19ORUcgICAgICAgICAgICAgICAoMSA8PCAxOSkKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkcyQ19BQlMgICAgICAgICAgICAgICAoMSA8PCAyMCkKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9TUEVDSUFMX0xSUCAgICAgICAgICAgICAoMSA8PCAyMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX01BRCAgICAgICAgICAgICAgICAoMCA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX0RQMyAgICAgICAgICAgICAgICAoMSA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX0RQNCAgICAgICAgICAgICAgICAoMiA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX01JTiAgICAgICAgICAgICAgICAoNCA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX01BWCAgICAgICAgICAgICAgICAoNSA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX0NNUCAgICAgICAgICAgICAgICAoOCA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX0ZSQyAgICAgICAgICAgICAgICAoOSA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX1JFUExfQUxQSEEgICAgICAgICAoMTAgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfT1VUQ19TQVQgICAgICAgICAgICAgICAgKDEgPDwgMzApCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfVU5LTk9XTl8zMSAgICAgICAgICAgICAgKDEgPDwgMzEpCisKKyNkZWZpbmUgUjMwMF9QRlNfSU5TVFIyXzAgICAgICAgICAgICAgICAgICAgMHg0OUMwCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9TUkMwQ19YICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfU1JDMENfWSAgICAgICAgICAgIDEKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX1NSQzBDX1ogICAgICAgICAgICAyCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9TUkMxQ19YICAgICAgICAgICAgMworIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfU1JDMUNfWSAgICAgICAgICAgIDQKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX1NSQzFDX1ogICAgICAgICAgICA1CisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9TUkMyQ19YICAgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfU1JDMkNfWSAgICAgICAgICAgIDcKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX1NSQzJDX1ogICAgICAgICAgICA4CisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9TUkMwQSAgICAgICAgICAgICAgOQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfU1JDMUEgICAgICAgICAgICAgIDEwCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9TUkMyQSAgICAgICAgICAgICAgMTEKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX1NSQzFBX0xSUCAgICAgICAgICAxNQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfWkVSTyAgICAgICAgICAgICAgIDE2CisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9PTkUgICAgICAgICAgICAgICAgMTcKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX0hBTEYgICAgICAgICAgICAgICAxOCAvKiBHVUVTUyAqLworCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMEFfU0hJRlQgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzBBX01BU0sgICAgICAgICAgICAgICgzMSA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzBBX05FRyAgICAgICAgICAgICAgICgxIDw8IDUpCisjCQlkZWZpbmUgUjMwMF9GUEkyX0FSRzBBX0FCUwkJCQkgKDEgPDwgNikgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcxQV9TSElGVCAgICAgICAgICAgICA3CisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMUFfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDcpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMUFfTkVHICAgICAgICAgICAgICAgKDEgPDwgMTIpCisjCQlkZWZpbmUgUjMwMF9GUEkyX0FSRzFBX0FCUwkJCQkgKDEgPDwgMTMpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMkFfU0hJRlQgICAgICAgICAgICAgMTQKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcyQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgMTQpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMkFfTkVHICAgICAgICAgICAgICAgKDEgPDwgMTkpCisjCQlkZWZpbmUgUjMwMF9GUEkyX0FSRzJBX0FCUwkJCQkgKDEgPDwgMjApIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfU1BFQ0lBTF9MUlAgICAgICAgICAgICAgKDEgPDwgMjEpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9NQUQgICAgICAgICAgICAgICAgKDAgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9EUDQgICAgICAgICAgICAgICAgKDEgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9NSU4gICAgICAgICAgICAgICAgKDIgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9NQVggICAgICAgICAgICAgICAgKDMgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9DTVAgICAgICAgICAgICAgICAgKDYgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9GUkMgICAgICAgICAgICAgICAgKDcgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9FWDIgICAgICAgICAgICAgICAgKDggPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9MRzIgICAgICAgICAgICAgICAgKDkgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9SQ1AgICAgICAgICAgICAgICAgKDEwIDw8IDIzKQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX09VVEFfUlNRICAgICAgICAgICAgICAgICgxMSA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX1NBVCAgICAgICAgICAgICAgICAoMSA8PCAzMCkKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9VTktOT1dOXzMxICAgICAgICAgICAgICAoMSA8PCAzMSkKKy8qIEVORCAqLworCisvKiBnYXAgKi8KKyNkZWZpbmUgUjMwMF9QUF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgMHg0QkQ0CisjICAgICAgIGRlZmluZSBSMzAwX1JFRl9BTFBIQV9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDBmZgorIyAgICAgICBkZWZpbmUgUjMwMF9BTFBIQV9URVNUX0ZBSUwgICAgICAgICAgICAgICgwIDw8IDgpCisjICAgICAgIGRlZmluZSBSMzAwX0FMUEhBX1RFU1RfTEVTUyAgICAgICAgICAgICAgKDEgPDwgOCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxQSEFfVEVTVF9MRVFVQUwgICAgICAgICAgICAoMyA8PCA4KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFBIQV9URVNUX0VRVUFMICAgICAgICAgICAgICgyIDw8IDgpCisjICAgICAgIGRlZmluZSBSMzAwX0FMUEhBX1RFU1RfR0VRVUFMICAgICAgICAgICAgKDYgPDwgOCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxQSEFfVEVTVF9HUkVBVEVSICAgICAgICAgICAoNCA8PCA4KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFBIQV9URVNUX05FUVVBTCAgICAgICAgICAgICg1IDw8IDgpCisjICAgICAgIGRlZmluZSBSMzAwX0FMUEhBX1RFU1RfUEFTUyAgICAgICAgICAgICAgKDcgPDwgOCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQUxQSEFfVEVTVF9PUF9NQVNLICAgICAgICAgICAoNyA8PCA4KQorIyAgICAgICBkZWZpbmUgUjMwMF9BTFBIQV9URVNUX0VOQUJMRSAgICAgICAgICAgICgxIDw8IDExKQorCisvKiBnYXAgKi8KKy8qIEZyYWdtZW50IHByb2dyYW0gcGFyYW1ldGVycyBpbiA3LjE2IGZsb2F0aW5nIHBvaW50ICovCisjZGVmaW5lIFIzMDBfUEZTX1BBUkFNXzBfWCAgICAgICAgICAgICAgICAgIDB4NEMwMAorI2RlZmluZSBSMzAwX1BGU19QQVJBTV8wX1kgICAgICAgICAgICAgICAgICAweDRDMDQKKyNkZWZpbmUgUjMwMF9QRlNfUEFSQU1fMF9aICAgICAgICAgICAgICAgICAgMHg0QzA4CisjZGVmaW5lIFIzMDBfUEZTX1BBUkFNXzBfVyAgICAgICAgICAgICAgICAgIDB4NEMwQworLyogR1VFU1M6IFBBUkFNXzMxIGlzIGxhc3QsIGJhc2VkIG9uIG5hdGl2ZSBsaW1pdHMgcmVwb3J0ZWQgYnkgZmdscnggKi8KKyNkZWZpbmUgUjMwMF9QRlNfUEFSQU1fMzFfWCAgICAgICAgICAgICAgICAgMHg0REYwCisjZGVmaW5lIFIzMDBfUEZTX1BBUkFNXzMxX1kgICAgICAgICAgICAgICAgIDB4NERGNAorI2RlZmluZSBSMzAwX1BGU19QQVJBTV8zMV9aICAgICAgICAgICAgICAgICAweDRERjgKKyNkZWZpbmUgUjMwMF9QRlNfUEFSQU1fMzFfVyAgICAgICAgICAgICAgICAgMHg0REZDCisKKy8qIE5vdGVzOgorLy8gLSBBRkFJSyBmZ2xyeCBhbHdheXMgc2V0cyBCTEVORF9VTktOT1dOIHdoZW4gYmxlbmRpbmcgaXMgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24KKy8vIC0gQUZBSUsgZmdscnggYWx3YXlzIHNldHMgQkxFTkRfTk9fU0VQQVJBVEUgd2hlbiBDQkxFTkQgYW5kIEFCTEVORCBhcmUgc2V0IHRvIHRoZSBzYW1lCisvLyAgIGZ1bmN0aW9uIChib3RoIHJlZ2lzdGVycyBhcmUgYWx3YXlzIHNldCB1cCBjb21wbGV0ZWx5IGluIGFueSBjYXNlKQorLy8gLSBNb3N0IGJsZW5kIGZsYWdzIGFyZSBzaW1wbHkgY29waWVkIGZyb20gUjIwMCBhbmQgbm90IHRlc3RlZCB5ZXQgKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NCTEVORCAgICAgICAgICAgICAgICAgICAgMHg0RTA0CisjZGVmaW5lIFIzMDBfUkIzRF9BQkxFTkQgICAgICAgICAgICAgICAgICAgIDB4NEUwOAorIC8qIHRoZSBmb2xsb3dpbmcgb25seSBhcHBlYXIgaW4gQ0JMRU5EICovCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX1VOS05PV04gICAgICAgICAgICAgICAgICAgICgzIDw8IDEpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX05PX1NFUEFSQVRFICAgICAgICAgICAgICAgICgxIDw8IDMpCisgLyogdGhlIGZvbGxvd2luZyBhcmUgc2hhcmVkIGJldHdlZW4gQ0JMRU5EIGFuZCBBQkxFTkQgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfRkNOX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgKDMgIDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9DT01CX0ZDTl9BRERfQ0xBTVAgICAgICAgICAgICAgICAoMCAgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX0FERF9OT0NMQU1QICAgICAgICAgICAgICgxICA8PCAxMikKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09NQl9GQ05fU1VCX0NMQU1QICAgICAgICAgICAgICAgKDIgIDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9DT01CX0ZDTl9TVUJfTk9DTEFNUCAgICAgICAgICAgICAoMyAgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9aRVJPICAgICAgICAgICAgICAgICgzMiA8PCAxNikKKyMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX09ORSAgICAgICAgICAgICAgICAgKDMzIDw8IDE2KQorIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfU1JDX0NPTE9SICAgICAgICAgICAoMzQgPDwgMTYpCisjICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9PTkVfTUlOVVNfU1JDX0NPTE9SICgzNSA8PCAxNikKKyMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX0RTVF9DT0xPUiAgICAgICAgICAgKDM2IDw8IDE2KQorIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfT05FX01JTlVTX0RTVF9DT0xPUiAoMzcgPDwgMTYpCisjICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9TUkNfQUxQSEEgICAgICAgICAgICgzOCA8PCAxNikKKyMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX09ORV9NSU5VU19TUkNfQUxQSEEgKDM5IDw8IDE2KQorIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfRFNUX0FMUEhBICAgICAgICAgICAoNDAgPDwgMTYpCisjICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9PTkVfTUlOVVNfRFNUX0FMUEhBICg0MSA8PCAxNikKKyMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX1NSQ19BTFBIQV9TQVRVUkFURSAgKDQyIDw8IDE2KQorIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfTUFTSyAgICAgICAgICAgICAgICAgICAoNjMgPDwgMTYpCisjICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9aRVJPICAgICAgICAgICAgICAgICgzMiA8PCAyNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX09ORSAgICAgICAgICAgICAgICAgKDMzIDw8IDI0KQorIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfU1JDX0NPTE9SICAgICAgICAgICAoMzQgPDwgMjQpCisjICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9PTkVfTUlOVVNfU1JDX0NPTE9SICgzNSA8PCAyNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX0RTVF9DT0xPUiAgICAgICAgICAgKDM2IDw8IDI0KQorIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfT05FX01JTlVTX0RTVF9DT0xPUiAoMzcgPDwgMjQpCisjICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9TUkNfQUxQSEEgICAgICAgICAgICgzOCA8PCAyNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX09ORV9NSU5VU19TUkNfQUxQSEEgKDM5IDw8IDI0KQorIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfRFNUX0FMUEhBICAgICAgICAgICAoNDAgPDwgMjQpCisjICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9PTkVfTUlOVVNfRFNUX0FMUEhBICg0MSA8PCAyNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX01BU0sgICAgICAgICAgICAgICAgICAgKDYzIDw8IDI0KQorI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JNQVNLICAgICAgICAgICAgICAgICAweDRFMEMKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JNQVNLMF9CICAgICAgICAgICAgICAgICAoMTw8MCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JNQVNLMF9HICAgICAgICAgICAgICAgICAoMTw8MSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JNQVNLMF9SICAgICAgICAgICAgICAgICAoMTw8MikKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JNQVNLMF9BICAgICAgICAgICAgICAgICAoMTw8MykKKworLyogZ2FwICovCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDAgICAgICAgICAgICAgIDB4NEUyOAorIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk9GRlNFVF9NQVNLICAgICAgICAgICAgIDB4RkZGRkZGRjAgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMSAgICAgICAgICAgICAgMHg0RTJDIC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDIgICAgICAgICAgICAgIDB4NEUzMCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQzICAgICAgICAgICAgICAweDRFMzQgLyogR1VFU1MgKi8KKy8qIGdhcCAqLworLyogQml0IDE2OiBMYXJnZXIgdGlsZXMKKy8vIEJpdCAxNzogNHgyIHRpbGVzCisvLyBCaXQgMTg6IEV4dHJlbWVseSB3ZWlyZCB0aWxlIGxpa2UsIGJ1dCBzb21lIHBpeGVscyBkdXBsaWNhdGVkPyAqLworI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDAgICAgICAgICAgICAgICAweDRFMzgKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JQSVRDSF9NQVNLICAgICAgICAgICAgICAweDAwMDAxRkY4IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX1RJTEVfRU5BQkxFICAgICAgICAgICAgKDEgPDwgMTYpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX01JQ1JPVElMRV9FTkFCTEUgICAgICAgKDEgPDwgMTcpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9OT19TV0FQICAgICAgICAgKDAgPDwgMTgpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9XT1JEX1NXQVAgICAgICAgKDEgPDwgMTgpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9EV09SRF9TV0FQICAgICAgKDIgPDwgMTgpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0ZPUk1BVF9SR0I1NjUgICAgICAgICAgKDIgPDwgMjIpCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0ZPUk1BVF9BUkdCODg4OCAgICAgICAgKDMgPDwgMjIpCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUlBJVENIMSAgICAgICAgICAgICAgIDB4NEUzQyAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDIgICAgICAgICAgICAgICAweDRFNDAgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gzICAgICAgICAgICAgICAgMHg0RTQ0IC8qIEdVRVNTICovCisKKy8qIGdhcCAqLworLyogR3Vlc3MgYnkgVmxhZGltaXIuCisvLyBTZXQgdG8gMEEgYmVmb3JlIDNEIG9wZXJhdGlvbnMsIHNldCB0byAwMiBhZnRlcndhcmRzLiAqLworI2RlZmluZSBSMzAwX1JCM0RfRFNUQ0FDSEVfQ1RMU1RBVCAgICAgICAgICAweDRFNEMKKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV8wMiAgICAgICAgICAgICAweDAwMDAwMDAyCisjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfRFNUQ0FDSEVfMEEgICAgICAgICAgICAgMHgwMDAwMDAwQQorCisvKiBnYXAgKi8KKy8qIFRoZXJlIHNlZW1zIHRvIGJlIG5vICJ3cml0ZSBvbmx5IiBzZXR0aW5nLCBzbyB1c2UgWi10ZXN0ID0gQUxXQVlTIGZvciB0aGlzLiAqLworLyogQml0ICgxPDw4KSBpcyB0aGUgInRlc3QiIGJpdC4gc28gcGxhaW4gd3JpdGUgaXMgNiAgLSB2ZCAqLworI2RlZmluZSBSMzAwX1JCM0RfWlNURU5DSUxfQ05UTF8wICAgICAgICAgICAgICAgICAgIDB4NEYwMAorIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfRElTQUJMRURfMSAgICAgICAgICAgIDB4MDAwMDAwMTAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX0RJU0FCTEVEXzIgICAgICAgICAgICAweDAwMDAwMDE0IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9URVNUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMgorIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfVEVTVF9BTkRfV1JJVEUgICAgICAgIDB4MDAwMDAwMTYKKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX1dSSVRFX09OTFkgICAgICAgIAkgMHgwMDAwMDAwNgorCisjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9URVNUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMgorIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfVEVTVF9BTkRfV1JJVEUgICAgICAgIDB4MDAwMDAwMTYKKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX1dSSVRFX09OTFkgICAgICAgIAkgMHgwMDAwMDAwNgorIwlkZWZpbmUgUjMwMF9SQjNEX1NURU5DSUxfRU5BQkxFCQkgMHgwMDAwMDAwMQorCisjZGVmaW5lIFIzMDBfUkIzRF9aU1RFTkNJTF9DTlRMXzEgICAgICAgICAgICAgICAgICAgMHg0RjA0CisJCS8qIGZ1bmN0aW9ucyAqLworIwlkZWZpbmUgUjMwMF9aU19ORVZFUgkJCTAKKyMJZGVmaW5lIFIzMDBfWlNfTEVTUwkJCTEKKyMJZGVmaW5lIFIzMDBfWlNfTEVRVUFMCQkJMgorIwlkZWZpbmUgUjMwMF9aU19FUVVBTAkJCTMKKyMJZGVmaW5lIFIzMDBfWlNfR0VRVUFMCQkJNAorIwlkZWZpbmUgUjMwMF9aU19HUkVBVEVSCQkJNQorIwlkZWZpbmUgUjMwMF9aU19OT1RFUVVBTAkJCTYKKyMJZGVmaW5lIFIzMDBfWlNfQUxXQVlTCQkJNworIyAgICAgICBkZWZpbmUgUjMwMF9aU19NQVNLICAgICAgICAgICAgICAgICAgICAgNworCQkvKiBvcGVyYXRpb25zICovCisjCWRlZmluZSBSMzAwX1pTX0tFRVAJCQkwCisjCWRlZmluZSBSMzAwX1pTX1pFUk8JCQkxCisjCWRlZmluZSBSMzAwX1pTX1JFUExBQ0UJCQkyCisjCWRlZmluZSBSMzAwX1pTX0lOQ1IJCQkzCisjCWRlZmluZSBSMzAwX1pTX0RFQ1IJCQk0CisjCWRlZmluZSBSMzAwX1pTX0lOVkVSVAkJCTUKKyMJZGVmaW5lIFIzMDBfWlNfSU5DUl9XUkFQCQk2CisjCWRlZmluZSBSMzAwX1pTX0RFQ1JfV1JBUAkJNworCisgICAgICAgLyogZnJvbnQgYW5kIGJhY2sgcmVmZXIgdG8gb3BlcmF0aW9ucyBkb25lIGZvciBmcm9udAorICAgICAgICAgIGFuZCBiYWNrIGZhY2VzLCBpLmUuIHNlcGFyYXRlIHN0ZW5jaWwgZnVuY3Rpb24gc3VwcG9ydCAqLworIwlkZWZpbmUgUjMwMF9SQjNEX1pTMV9ERVBUSF9GVU5DX1NISUZUCQkwCisjCWRlZmluZSBSMzAwX1JCM0RfWlMxX0ZST05UX0ZVTkNfU0hJRlQJCTMKKyMJZGVmaW5lIFIzMDBfUkIzRF9aUzFfRlJPTlRfRkFJTF9PUF9TSElGVAk2CisjCWRlZmluZSBSMzAwX1JCM0RfWlMxX0ZST05UX1pQQVNTX09QX1NISUZUCTkKKyMJZGVmaW5lIFIzMDBfUkIzRF9aUzFfRlJPTlRfWkZBSUxfT1BfU0hJRlQgICAgICAxMgorIwlkZWZpbmUgUjMwMF9SQjNEX1pTMV9CQUNLX0ZVTkNfU0hJRlQgICAgICAgICAgIDE1CisjCWRlZmluZSBSMzAwX1JCM0RfWlMxX0JBQ0tfRkFJTF9PUF9TSElGVCAgICAgICAgMTgKKyMJZGVmaW5lIFIzMDBfUkIzRF9aUzFfQkFDS19aUEFTU19PUF9TSElGVCAgICAgICAyMQorIwlkZWZpbmUgUjMwMF9SQjNEX1pTMV9CQUNLX1pGQUlMX09QX1NISUZUICAgICAgIDI0CisKKworCisjZGVmaW5lIFIzMDBfUkIzRF9aU1RFTkNJTF9DTlRMXzIgICAgICAgICAgICAgICAgICAgMHg0RjA4CisjCWRlZmluZSBSMzAwX1JCM0RfWlMyX1NURU5DSUxfUkVGX1NISUZUCQkwCisjCWRlZmluZSBSMzAwX1JCM0RfWlMyX1NURU5DSUxfTUFTSwkJMHhGRgorIwlkZWZpbmUgUjMwMF9SQjNEX1pTMl9TVEVOQ0lMX01BU0tfU0hJRlQJICAgICAgICA4CisjCWRlZmluZSBSMzAwX1JCM0RfWlMyX1NURU5DSUxfV1JJVEVfTUFTS19TSElGVAkxNgorCisvKiBnYXAgKi8KKworI2RlZmluZSBSMzAwX1JCM0RfWlNURU5DSUxfRk9STUFUICAgICAgICAgICAgICAgICAgIDB4NEYxMAorIwlkZWZpbmUgUjMwMF9ERVBUSF9GT1JNQVRfMTZCSVRfSU5UX1ogICAgICgwIDw8IDApCisjCWRlZmluZSBSMzAwX0RFUFRIX0ZPUk1BVF8yNEJJVF9JTlRfWiAgICAgKDIgPDwgMCkKKworLyogZ2FwICovCisjZGVmaW5lIFIzMDBfUkIzRF9ERVBUSE9GRlNFVCAgICAgICAgICAgICAgIDB4NEYyMAorI2RlZmluZSBSMzAwX1JCM0RfREVQVEhQSVRDSCAgICAgICAgICAgICAgICAweDRGMjQKKyMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhQSVRDSF9NQVNLICAgICAgICAgICAgICAweDAwMDAxRkY4IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX1RJTEVfRU5BQkxFICAgICAgICAgICAgKDEgPDwgMTYpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX01JQ1JPVElMRV9FTkFCTEUgICAgICAgKDEgPDwgMTcpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX0VORElBTl9OT19TV0FQICAgICAgICAgKDAgPDwgMTgpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX0VORElBTl9XT1JEX1NXQVAgICAgICAgKDEgPDwgMTgpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX0VORElBTl9EV09SRF9TV0FQICAgICAgKDIgPDwgMTgpIC8qIEdVRVNTICovCisKKy8qIEJFR0lOOiBWZXJ0ZXggcHJvZ3JhbSBpbnN0cnVjdGlvbiBzZXQKKy8vIEV2ZXJ5IGluc3RydWN0aW9uIGlzIGZvdXIgZHdvcmRzIGxvbmc6CisvLyAgRFdPUkQgMDogb3V0cHV0IGFuZCBvcGNvZGUKKy8vICBEV09SRCAxOiBmaXJzdCBhcmd1bWVudAorLy8gIERXT1JEIDI6IHNlY29uZCBhcmd1bWVudAorLy8gIERXT1JEIDM6IHRoaXJkIGFyZ3VtZW50CisvLworLy8gTm90ZXM6CisvLyAgLSBBQlMgciwgYSBpcyBpbXBsZW1lbnRlZCBhcyBNQVggciwgYSwgLWEKKy8vICAtIE1PViBpcyBpbXBsZW1lbnRlZCBhcyBBREQgdG8gemVybworLy8gIC0gWFBEIGlzIGltcGxlbWVudGVkIGFzIE1VTCArIE1BRAorLy8gIC0gRkxSIGlzIGltcGxlbWVudGVkIGFzIEZSQyArIEFERAorLy8gIC0gYXBwYXJlbnRseSwgZmdscnggdHJpZXMgdG8gc2NoZWR1bGUgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3QKKy8vICAgIG9uZSBpbnN0cnVjdGlvbiBiZXR3ZWVuIHRoZSB3cml0ZSB0byBhIHRlbXBvcmFyeSBhbmQgdGhlIGZpcnN0IHJlYWQKKy8vICAgIGZyb20gc2FpZCB0ZW1wb3Jhcnk7IGhvd2V2ZXIsIHZpb2xhdGlvbnMgb2YgdGhpcyBzY2hlZHVsaW5nIGFyZSBhbGxvd2VkCisvLyAgLSByZWdpc3RlciBpbmRpY2VzIHNlZW0gdG8gYmUgdW5yZWxhdGVkIHdpdGggT3BlbkdMIGFsaWFzaW5nIHRvIGNvbnZlbnRpb25hbCBzdGF0ZQorLy8gIC0gb25seSBvbmUgYXR0cmlidXRlIGFuZCBvbmUgcGFyYW1ldGVyIGNhbiBiZSBsb2FkZWQgYXQgYSB0aW1lOyBob3dldmVyLCB0aGUKKy8vICAgIHNhbWUgYXR0cmlidXRlL3BhcmFtZXRlciBjYW4gYmUgdXNlZCBmb3IgbW9yZSB0aGFuIG9uZSBhcmd1bWVudAorLy8gIC0gdGhlIHNlY29uZCBzb2Z0d2FyZSBhcmd1bWVudCBmb3IgUE9XIGlzIHRoZSB0aGlyZCBoYXJkd2FyZSBhcmd1bWVudCAobm8gaWRlYSB3aHkpCisvLyAgLSBNQUQgd2l0aCBvbmx5IHRlbXBvcmFyaWVzIGFzIGlucHV0IHNlZW1zIHRvIHVzZSBWUElfT1VUX1NFTEVDVF9NQURfMgorLy8KKy8vIFRoZXJlIGlzIHNvbWUgbWFnaWMgc3Vycm91bmRpbmcgTElUOgorLy8gIFRoZSBzaW5nbGUgYXJndW1lbnQgaXMgcmVwbGljYXRlZCBhY3Jvc3MgYWxsIHRocmVlIGlucHV0cywgYnV0IHN3aXp6bGVkOgorLy8gICBGaXJzdCBhcmd1bWVudDogeHl6eQorLy8gICBTZWNvbmQgYXJndW1lbnQ6IHh5engKKy8vICAgVGhpcmQgYXJndW1lbnQ6IHh5encKKy8vICBXaGVuZXZlciB0aGUgcmVzdWx0IGlzIHVzZWQgbGF0ZXIgaW4gdGhlIGZyYWdtZW50IHByb2dyYW0sIGZnbHJ4IGZvcmNlcyB4IGFuZCB3CisvLyAgdG8gYmUgMS4wIGluIHRoZSBpbnB1dCBzZWxlY3Rpb247IEkgZG9uJ3Qga25vdyB3aGV0aGVyIHRoaXMgaXMgc3RyaWN0bHkgbmVjZXNzYXJ5ICovCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9ET1QgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTVVMICAgICAgICAgICAgICAgICAgICAgKDIgPDwgMCkKKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0FERCAgICAgICAgICAgICAgICAgICAgICgzIDw8IDApCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9NQUQgICAgICAgICAgICAgICAgICAgICAoNCA8PCAwKQorI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfRFNUICAgICAgICAgICAgICAgICAgICAgKDUgPDwgMCkKKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0ZSQyAgICAgICAgICAgICAgICAgICAgICg2IDw8IDApCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9NQVggICAgICAgICAgICAgICAgICAgICAoNyA8PCAwKQorI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTUlOICAgICAgICAgICAgICAgICAgICAgKDggPDwgMCkKKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1NHRSAgICAgICAgICAgICAgICAgICAgICg5IDw8IDApCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9TTFQgICAgICAgICAgICAgICAgICAgICAoMTAgPDwgMCkKKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzEyICAgICAgICAgICAgICAgICAgICgxMiA8PCAwKSAvKiBVc2VkIGluIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0FSQiwgdmVjdG9yKHNjYWxhciwgdmVjdG9yKSAqLworI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfRVhQICAgICAgICAgICAgICAgICAgICAgKDY1IDw8IDApCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9MT0cgICAgICAgICAgICAgICAgICAgICAoNjYgPDwgMCkKKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzY3ICAgICAgICAgICAgICAgICAgICg2NyA8PCAwKSAvKiBVc2VkIGluIGZvZyBjb21wdXRhdGlvbnMsIHNjYWxhcihzY2FsYXIpICovCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9MSVQgICAgICAgICAgICAgICAgICAgICAoNjggPDwgMCkKKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1BPVyAgICAgICAgICAgICAgICAgICAgICg2OSA8PCAwKQorI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfUkNQICAgICAgICAgICAgICAgICAgICAgKDcwIDw8IDApCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9SU1EgICAgICAgICAgICAgICAgICAgICAoNzIgPDwgMCkKKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzczICAgICAgICAgICAgICAgICAgICg3MyA8PCAwKSAvKiBVc2VkIGluIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0FSQiwgc2NhbGFyKHNjYWxhcikgKi8KKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0VYMiAgICAgICAgICAgICAgICAgICAgICg3NSA8PCAwKQorI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTEcyICAgICAgICAgICAgICAgICAgICAgKDc2IDw8IDApCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9NQURfMiAgICAgICAgICAgICAgICAgICAoMTI4IDw8IDApCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTksxMjkgICAgICAgICAgICAgICAgICAoMTI5IDw8IDApIC8qIGFsbCB0ZW1wcywgdmVjdG9yKHNjYWxhciwgdmVjdG9yLCB2ZWN0b3IpICovCisKKyNkZWZpbmUgUjMwMF9WUElfT1VUX1JFR19DTEFTU19URU1QT1JBUlkgICAgICAgICgwIDw8IDgpCisjZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfQ0xBU1NfUkVTVUxUICAgICAgICAgICAoMiA8PCA4KQorI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0NMQVNTX01BU0sgICAgICAgICAgICAgKDMxIDw8IDgpCisKKyNkZWZpbmUgUjMwMF9WUElfT1VUX1JFR19JTkRFWF9TSElGVCAgICAgICAgICAgIDEzCisjZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfSU5ERVhfTUFTSyAgICAgICAgICAgICAoMzEgPDwgMTMpIC8qIEdVRVNTIGJhc2VkIG9uIGZnbHJ4IG5hdGl2ZSBsaW1pdHMgKi8KKworI2RlZmluZSBSMzAwX1ZQSV9PVVRfV1JJVEVfWCAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjApCisjZGVmaW5lIFIzMDBfVlBJX09VVF9XUklURV9ZICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMSkKKyNkZWZpbmUgUjMwMF9WUElfT1VUX1dSSVRFX1ogICAgICAgICAgICAgICAgICAgICgxIDw8IDIyKQorI2RlZmluZSBSMzAwX1ZQSV9PVVRfV1JJVEVfVyAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjMpCisKKyNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0NMQVNTX1RFTVBPUkFSWSAgICAgICAgICgwIDw8IDApCisjZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19DTEFTU19BVFRSSUJVVEUgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfQ0xBU1NfUEFSQU1FVEVSICAgICAgICAgKDIgPDwgMCkKKyNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0NMQVNTX05PTkUgICAgICAgICAgICAgICg5IDw8IDApCisjZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19DTEFTU19NQVNLICAgICAgICAgICAgICAoMzEgPDwgMCkgLyogR1VFU1MgKi8KKworI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfSU5ERVhfU0hJRlQgICAgICAgICAgICAgNQorI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfSU5ERVhfTUFTSyAgICAgICAgICAgICAgKDI1NSA8PCA1KSAvKiBHVUVTUyBiYXNlZCBvbiBmZ2xyeCBuYXRpdmUgbGltaXRzICovCisKKy8qIFRoZSBSMzAwIGNhbiBzZWxlY3QgY29tcG9uZW50cyBmcm9tIHRoZSBpbnB1dCByZWdpc3RlciBhcmJpdHJhcmlseS4KKy8vIFVzZSB0aGUgZm9sbG93aW5nIGNvbnN0YW50cywgc2hpZnRlZCBieSB0aGUgY29tcG9uZW50IHNoaWZ0IHlvdQorLy8gd2FudCB0byBzZWxlY3QgKi8KKyNkZWZpbmUgUjMwMF9WUElfSU5fU0VMRUNUX1ggICAgMAorI2RlZmluZSBSMzAwX1ZQSV9JTl9TRUxFQ1RfWSAgICAxCisjZGVmaW5lIFIzMDBfVlBJX0lOX1NFTEVDVF9aICAgIDIKKyNkZWZpbmUgUjMwMF9WUElfSU5fU0VMRUNUX1cgICAgMworI2RlZmluZSBSMzAwX1ZQSV9JTl9TRUxFQ1RfWkVSTyA0CisjZGVmaW5lIFIzMDBfVlBJX0lOX1NFTEVDVF9PTkUgIDUKKyNkZWZpbmUgUjMwMF9WUElfSU5fU0VMRUNUX01BU0sgNworCisjZGVmaW5lIFIzMDBfVlBJX0lOX1hfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBSMzAwX1ZQSV9JTl9ZX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUjMwMF9WUElfSU5fWl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE5CisjZGVmaW5lIFIzMDBfVlBJX0lOX1dfU0hJRlQgICAgICAgICAgICAgICAgICAgICAyMgorCisjZGVmaW5lIFIzMDBfVlBJX0lOX05FR19YICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyNSkKKyNkZWZpbmUgUjMwMF9WUElfSU5fTkVHX1kgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI2KQorI2RlZmluZSBSMzAwX1ZQSV9JTl9ORUdfWiAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjcpCisjZGVmaW5lIFIzMDBfVlBJX0lOX05FR19XICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyOCkKKy8qIEVORCAqLworCisvL0JFR0lOOiBQYWNrZXQgMyBjb21tYW5kcworCisvLyBBIHByaW1pdGl2ZSBlbWlzc2lvbiBkd29yZC4KKyNkZWZpbmUgUjMwMF9QUklNX1RZUEVfTk9ORSAgICAgICAgICAgICAgICAgICAgICgwIDw8IDApCisjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX1BPSU5UICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9MSU5FICAgICAgICAgICAgICAgICAgICAgKDIgPDwgMCkKKyNkZWZpbmUgUjMwMF9QUklNX1RZUEVfTElORV9TVFJJUCAgICAgICAgICAgICAgICgzIDw8IDApCisjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX1RSSV9MSVNUICAgICAgICAgICAgICAgICAoNCA8PCAwKQorI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9UUklfRkFOICAgICAgICAgICAgICAgICAgKDUgPDwgMCkKKyNkZWZpbmUgUjMwMF9QUklNX1RZUEVfVFJJX1NUUklQICAgICAgICAgICAgICAgICg2IDw8IDApCisjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX1RSSV9UWVBFMiAgICAgICAgICAgICAgICAoNyA8PCAwKQorI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9SRUNUX0xJU1QgICAgICAgICAgICAgICAgKDggPDwgMCkKKyNkZWZpbmUgUjMwMF9QUklNX1RZUEVfM1ZSVF9QT0lOVF9MSVNUICAgICAgICAgICg5IDw8IDApCisjZGVmaW5lIFIzMDBfUFJJTV9UWVBFXzNWUlRfTElORV9MSVNUICAgICAgICAgICAoMTAgPDwgMCkKKyNkZWZpbmUgUjMwMF9QUklNX1RZUEVfUE9JTlRfU1BSSVRFUyAgICAgICAgICAgICgxMSA8PCAwKSAvLyBHVUVTUyAoYmFzZWQgb24gcjIwMCkKKyNkZWZpbmUgUjMwMF9QUklNX1RZUEVfTElORV9MT09QICAgICAgICAgICAgICAgICgxMiA8PCAwKQorI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9RVUFEUyAgICAgICAgICAgICAgICAgICAgKDEzIDw8IDApCisjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX1FVQURfU1RSSVAgICAgICAgICAgICAgICAoMTQgPDwgMCkKKyNkZWZpbmUgUjMwMF9QUklNX1RZUEVfUE9MWUdPTiAgICAgICAgICAgICAgICAgICgxNSA8PCAwKQorI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHhGCisjZGVmaW5lIFIzMDBfUFJJTV9XQUxLX0lORCAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBSMzAwX1BSSU1fV0FMS19MSVNUICAgICAgICAgICAgICAgICAgICAgKDIgPDwgNCkKKyNkZWZpbmUgUjMwMF9QUklNX1dBTEtfUklORyAgICAgICAgICAgICAgICAgICAgICgzIDw8IDQpCisjZGVmaW5lIFIzMDBfUFJJTV9XQUxLX01BU0sgICAgICAgICAgICAgICAgICAgICAoMyA8PCA0KQorI2RlZmluZSBSMzAwX1BSSU1fQ09MT1JfT1JERVJfQkdSQSAgICAgICAgICAgICAgKDAgPDwgNikgLy8gR1VFU1MgKGJhc2VkIG9uIHIyMDApCisjZGVmaW5lIFIzMDBfUFJJTV9DT0xPUl9PUkRFUl9SR0JBICAgICAgICAgICAgICAoMSA8PCA2KSAvLyBHVUVTUworI2RlZmluZSBSMzAwX1BSSU1fTlVNX1ZFUlRJQ0VTX1NISUZUICAgICAgICAgICAgMTYKKworLy8gRHJhdyBhIHByaW1pdGl2ZSBmcm9tIHZlcnRleCBkYXRhIGluIGFycmF5cyBsb2FkZWQgdmlhIDNEX0xPQURfVkJQTlRSLgorLy8gVHdvIHBhcmFtZXRlciBkd29yZHM6CisvLyAwLiBUaGUgZmlyc3QgcGFyYW1ldGVyIGFwcGVhcnMgdG8gYmUgYWx3YXlzIDAKKy8vIDEuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGEgc3RhbmRhcmQgcHJpbWl0aXZlIGVtaXNzaW9uIGR3b3JkLgorI2RlZmluZSBSMzAwX1BBQ0tFVDNfM0RfRFJBV19WQlVGICAgICAgICAgICAweDAwMDAyODAwCisKKy8vIFNwZWNpZnkgdGhlIGZ1bGwgc2V0IG9mIHZlcnRleCBhcnJheXMgYXMgKGFkZHJlc3MsIHN0cmlkZSkuCisvLyBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBudW1iZXIgb2YgdmVydGV4IGFycmF5cyBzcGVjaWZpZWQuCisvLyBUaGUgcmVzdCBvZiB0aGUgY29tbWFuZCBpcyBhIHZhcmlhYmxlIGxlbmd0aCBsaXN0IG9mIGJsb2Nrcywgd2hlcmUKKy8vIGVhY2ggYmxvY2sgaXMgdGhyZWUgZHdvcmRzIGxvbmcgYW5kIHNwZWNpZmllcyB0d28gYXJyYXlzLgorLy8gVGhlIGZpcnN0IGR3b3JkIG9mIGEgYmxvY2sgaXMgc3BsaXQgaW50byB0d28gd29yZHMsIHRoZSBsb3dlciBzaWduaWZpY2FudAorLy8gd29yZCByZWZlcnMgdG8gdGhlIGZpcnN0IGFycmF5LCB0aGUgbW9yZSBzaWduaWZpY2FudCB3b3JkIHRvIHRoZSBzZWNvbmQKKy8vIGFycmF5IGluIHRoZSBibG9jay4KKy8vIFRoZSBsb3cgYnl0ZSBvZiBlYWNoIHdvcmQgY29udGFpbnMgdGhlIHNpemUgb2YgYW4gYXJyYXkgZW50cnkgaW4gZHdvcmRzLAorLy8gdGhlIGhpZ2ggYnl0ZSBjb250YWlucyB0aGUgc3RyaWRlIG9mIHRoZSBhcnJheS4KKy8vIFRoZSBzZWNvbmQgZHdvcmQgb2YgYSBibG9jayBjb250YWlucyB0aGUgcG9pbnRlciB0byB0aGUgZmlyc3QgYXJyYXksCisvLyB0aGUgdGhpcmQgZHdvcmQgb2YgYSBibG9jayBjb250YWlucyB0aGUgcG9pbnRlciB0byB0aGUgc2Vjb25kIGFycmF5LgorLy8gTm90ZSB0aGF0IGlmIHRoZSB0b3RhbCBudW1iZXIgb2YgYXJyYXlzIGlzIG9kZCwgdGhlIHRoaXJkIGR3b3JkIG9mCisvLyB0aGUgbGFzdCBibG9jayBpcyBvbWl0dGVkLgorI2RlZmluZSBSMzAwX1BBQ0tFVDNfM0RfTE9BRF9WQlBOVFIgICAgICAgICAweDAwMDAyRjAwCisKKyNkZWZpbmUgUjMwMF9QQUNLRVQzX0lORFhfQlVGRkVSICAgICAgICAgICAgMHgwMDAwMzMwMAorIyAgICBkZWZpbmUgUjMwMF9FQl9VTksxX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDI0CisjICAgIGRlZmluZSBSMzAwX0VCX1VOSzEgICAgICAgICAgICAgICAgICAgICgweDgwPDwyNCkKKyMgICAgZGVmaW5lIFIzMDBfRUJfVU5LMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgxMAorI2RlZmluZSBSMzAwX1BBQ0tFVDNfM0RfRFJBV19JTkRYXzIgICAgICAgICAweDAwMDAzNjAwCisKKy8vRU5ECisKKyNlbmRpZiAvKiBfUjMwMF9SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMKaW5kZXggMjBiY2Y4Ny4uNmQ5MDgwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAicmFkZW9uX2RybS5oIgogI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKyNpbmNsdWRlICJyMzAwX3JlZy5oIgogCiAjZGVmaW5lIFJBREVPTl9GSUZPX0RFQlVHCTAKIApAQCAtMTE1MSw2ICsxMTUyLDggQEAKIAogI2lmIF9fT1NfSEFTX0FHUAogCWlmICggIWRldl9wcml2LT5pc19wY2kgKSB7CisJCS8qIHNldCBSQURFT05fQUdQX0JBU0UgaGVyZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gWCBmcm9tIHVzZXIgc3BhY2UgKi8KKwkJUkFERU9OX1dSSVRFKFJBREVPTl9BR1BfQkFTRSwgKHVuc2lnbmVkIGludClkZXYtPmFncC0+YmFzZSk7CiAJCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX1JQVFJfQUREUiwKIAkJCSAgICAgIGRldl9wcml2LT5yaW5nX3JwdHItPm9mZnNldAogCQkJICAgICAgLSBkZXYtPmFncC0+YmFzZQpAQCAtMTQwNyw2ICsxNDEwLDcgQEAKIAkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CisJZGV2LT5hZ3BfYnVmZmVyX3Rva2VuID0gaW5pdC0+YnVmZmVyc19vZmZzZXQ7CiAJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5idWZmZXJzX29mZnNldCk7CiAJaWYoIWRldi0+YWdwX2J1ZmZlcl9tYXApIHsKIAkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBkbWEgYnVmZmVyIHJlZ2lvbiFcbiIpOwpAQCAtMTYyNSw2ICsxNjI5LDkgQEAKIAogCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggaW5pdCwgKGRybV9yYWRlb25faW5pdF90IF9fdXNlciAqKWRhdGEsIHNpemVvZihpbml0KSApOwogCisJaWYoaW5pdC5mdW5jID09IFJBREVPTl9JTklUX1IzMDBfQ1ApCisJCXIzMDBfaW5pdF9yZWdfZmxhZ3MoKTsKKwogCXN3aXRjaCAoIGluaXQuZnVuYyApIHsKIAljYXNlIFJBREVPTl9JTklUX0NQOgogCWNhc2UgUkFERU9OX0lOSVRfUjIwMF9DUDoKQEAgLTIwMzksMTUgKzIwNDYsNDMgQEAKIAljYXNlIENISVBfUlYyMDA6CiAJY2FzZSBDSElQX1IyMDA6CiAJY2FzZSBDSElQX1IzMDA6CisJY2FzZSBDSElQX1I0MjA6CiAJCWRldl9wcml2LT5mbGFncyB8PSBDSElQX0hBU19ISUVSWjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkvKiBhbGwgb3RoZXIgY2hpcHMgaGF2ZSBubyBoaWVyYXJjaGljYWwgeiBidWZmZXIgKi8KIAkJYnJlYWs7CiAJfQorCisJaWYgKGRybV9kZXZpY2VfaXNfYWdwKGRldikpCisJCWRldl9wcml2LT5mbGFncyB8PSBDSElQX0lTX0FHUDsKKwkKKwlEUk1fREVCVUcoIiVzIGNhcmQgZGV0ZWN0ZWRcbiIsCisJCSAgKChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0lTX0FHUCkgPyAiQUdQIiA6ICJQQ0kiKSk7CiAJcmV0dXJuIHJldDsKIH0KIAoraW50IHJhZGVvbl9wcmVzZXR1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisJZHJtX2xvY2FsX21hcF90ICptYXA7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXJldCA9IGRybV9hZGRtYXAoZGV2LCBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMiksCisJCQkgZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAyKSwgX0RSTV9SRUdJU1RFUlMsCisJCQkgX0RSTV9SRUFEX09OTFksICZkZXZfcHJpdi0+bW1pbyk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZHJtX2FkZG1hcChkZXYsIGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwKKwkJCSBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDApLCBfRFJNX0ZSQU1FX0JVRkZFUiwKKwkJCSBfRFJNX1dSSVRFX0NPTUJJTklORywgJm1hcCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKIGludCByYWRlb25fZHJpdmVyX3Bvc3RjbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKaW5kZXggYzFlNjJkMC4uMzc5Mjc5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKQEAgLTE5NSw2ICsxOTUsNTIgQEAKICNkZWZpbmUgUkFERU9OX1dBSVRfMkQgIDB4MQogI2RlZmluZSBSQURFT05fV0FJVF8zRCAgMHgyCiAKKy8qIEFsbG93ZWQgcGFyYW1ldGVycyBmb3IgUjMwMF9DTURfUEFDS0VUMworICovCisjZGVmaW5lIFIzMDBfQ01EX1BBQ0tFVDNfQ0xFQVIJCTAKKyNkZWZpbmUgUjMwMF9DTURfUEFDS0VUM19SQVcJCTEKKworLyogQ29tbWFuZHMgdW5kZXJzdG9vZCBieSBjbWRfYnVmZmVyIGlvY3RsIGZvciBSMzAwLgorICogVGhlIGludGVyZmFjZSBoYXMgbm90IGJlZW4gc3RhYmlsaXplZCwgc28gc29tZSBvZiB0aGVzZSBtYXkgYmUgcmVtb3ZlZAorICogYW5kIGV2ZW50dWFsbHkgcmVvcmRlcmVkIGJlZm9yZSBzdGFiaWxpemF0aW9uLgorICovCisjZGVmaW5lIFIzMDBfQ01EX1BBQ0tFVDAJCTEgCisjZGVmaW5lIFIzMDBfQ01EX1ZQVQkJCTIgLyogZW1pdCB2ZXJ0ZXggcHJvZ3JhbSB1cGxvYWQgKi8KKyNkZWZpbmUgUjMwMF9DTURfUEFDS0VUMwkJMyAvKiBlbWl0IGEgcGFja2V0MyAqLworI2RlZmluZSBSMzAwX0NNRF9FTkQzRAkJCTQgLyogZW1pdCBzZXF1ZW5jZSBlbmRpbmcgM2QgcmVuZGVyaW5nICovCisjZGVmaW5lIFIzMDBfQ01EX0NQX0RFTEFZCQk1CisjZGVmaW5lIFIzMDBfQ01EX0RNQV9ESVNDQVJECQk2CisjZGVmaW5lIFIzMDBfQ01EX1dBSVQJCQk3CisjCWRlZmluZSBSMzAwX1dBSVRfMkQgIAkJMHgxCisjCWRlZmluZSBSMzAwX1dBSVRfM0QgIAkJMHgyCisjCWRlZmluZSBSMzAwX1dBSVRfMkRfQ0xFQU4gIAkweDMKKyMJZGVmaW5lIFIzMDBfV0FJVF8zRF9DTEVBTiAgCTB4NAorCit0eXBlZGVmIHVuaW9uIHsKKwl1bnNpZ25lZCBpbnQgdTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBwYWQwLCBwYWQxLCBwYWQyOworCX0gaGVhZGVyOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIGNvdW50LCByZWdsbywgcmVnaGk7CisJfSBwYWNrZXQwOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIGNvdW50LCBhZHJsbywgYWRyaGk7CisJfSB2cHU7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgcGFja2V0LCBwYWQwLCBwYWQxOworCX0gcGFja2V0MzsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBwYWNrZXQ7CisJCXVuc2lnbmVkIHNob3J0IGNvdW50OyAvKiBhbW91bnQgb2YgcGFja2V0MiB0byBlbWl0ICovCisJfSBkZWxheTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBidWZfaWR4LCBwYWQwLCBwYWQxOworCX0gZG1hOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIGZsYWdzLCBwYWQwLCBwYWQxOwkKKwl9IHdhaXQ7Cit9IGRybV9yMzAwX2NtZF9oZWFkZXJfdDsKIAogI2RlZmluZSBSQURFT05fRlJPTlQJCQkweDEKICNkZWZpbmUgUkFERU9OX0JBQ0sJCQkweDIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKaW5kZXggMThlNGU1Yi4uZTA2ODJmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKQEAgLTc2LDYgKzc2LDcgQEAKIAkuZHJpdmVyX2ZlYXR1cmVzID0gRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfUENJX0RNQSB8IERSSVZFUl9TRyB8IERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9JUlFfU0hBUkVEIHwgRFJJVkVSX0lSUV9WQkwsCiAJLmRldl9wcml2X3NpemUgPSBzaXplb2YoZHJtX3JhZGVvbl9idWZfcHJpdl90KSwKIAkucHJlaW5pdCA9IHJhZGVvbl9kcml2ZXJfcHJlaW5pdCwKKwkucHJlc2V0dXAgPSByYWRlb25fcHJlc2V0dXAsCiAJLnBvc3RjbGVhbnVwID0gcmFkZW9uX2RyaXZlcl9wb3N0Y2xlYW51cCwKIAkucHJlcmVsZWFzZSA9IHJhZGVvbl9kcml2ZXJfcHJlcmVsZWFzZSwKIAkucHJldGFrZWRvd24gPSByYWRlb25fZHJpdmVyX3ByZXRha2Vkb3duLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaAppbmRleCA3NzFhYTgwLi5mMTJhOTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaApAQCAtODIsOSArODIsMTAgQEAKICAqICAgICAtIEFkZCBzdXBwb3J0IGZvciByMTAwIGN1YmUgbWFwcwogICogMS4xNi0gQWRkIFIyMDBfRU1JVF9QUF9UUklfUEVSRl9DTlRMIHBhY2tldCB0byBzdXBwb3J0IGJyaWxpbmVhcgogICogICAgICAgdGV4dHVyZSBmaWx0ZXJpbmcgb24gcjIwMAorICogMS4xNy0gQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgUjMwMCAoM0QpLgogICovCiAjZGVmaW5lIERSSVZFUl9NQUpPUgkJMQotI2RlZmluZSBEUklWRVJfTUlOT1IJCTE2CisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMTcKICNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAogCiAjZGVmaW5lIEdFVF9SSU5HX0hFQUQoZGV2X3ByaXYpCQlEUk1fUkVBRDMyKCAgKGRldl9wcml2KS0+cmluZ19ycHRyLCAwICkKQEAgLTEwNiw3ICsxMDcsOSBAQAogCUNISVBfUlYyODAsCiAJQ0hJUF9SMzAwLAogCUNISVBfUlMzMDAsCisJQ0hJUF9SMzUwLAogCUNISVBfUlYzNTAsCisJQ0hJUF9SNDIwLAogCUNISVBfTEFTVCwKIH07CiAKQEAgLTI5MCw2ICsyOTMsNyBAQAogZXh0ZXJuIGludCByYWRlb25fZG9fY3BfaWRsZSggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ICk7CiAKIGV4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl9wcmVpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworZXh0ZXJuIGludCByYWRlb25fcHJlc2V0dXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfcG9zdGNsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIGV4dGVybiBpbnQgcmFkZW9uX21lbV9hbGxvYyggRFJNX0lPQ1RMX0FSR1MgKTsKQEAgLTMyMCw2ICszMjQsMTQgQEAKIGV4dGVybiBsb25nIHJhZGVvbl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkJdW5zaWduZWQgbG9uZyBhcmcpOwogCisKKy8qIHIzMDBfY21kYnVmLmMgKi8KK2V4dGVybiB2b2lkIHIzMDBfaW5pdF9yZWdfZmxhZ3Modm9pZCk7CisKK2V4dGVybiBpbnQgcjMwMF9kb19jcF9jbWRidWYoZHJtX2RldmljZV90KiBkZXYsIERSTUZJTEUgZmlscCwKKwkJCSAgICAgZHJtX2ZpbGVfdCogZmlscF9wcml2LAorCQkJICAgICBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCogY21kYnVmKTsKKwogLyogRmxhZ3MgZm9yIHN0YXRzLmJveGVzCiAgKi8KICNkZWZpbmUgUkFERU9OX0JPWF9ETUFfSURMRSAgICAgIDB4MQpAQCAtMzU3LDYgKzM2OSwxMSBAQAogI2RlZmluZSBSQURFT05fQ1JUQzJfT0ZGU0VUCQkweDAzMjQKICNkZWZpbmUgUkFERU9OX0NSVEMyX09GRlNFVF9DTlRMCTB4MDMyOAogCisjZGVmaW5lIFJBREVPTl9NUFBfVEJfQ09ORklHCQkweDAxYzAKKyNkZWZpbmUgUkFERU9OX01FTV9DTlRMCQkJMHgwMTQwCisjZGVmaW5lIFJBREVPTl9NRU1fU0RSQU1fTU9ERV9SRUcJMHgwMTU4CisjZGVmaW5lIFJBREVPTl9BR1BfQkFTRQkJCTB4MDE3MAorCiAjZGVmaW5lIFJBREVPTl9SQjNEX0NPTE9ST0ZGU0VUCQkweDFjNDAKICNkZWZpbmUgUkFERU9OX1JCM0RfQ09MT1JQSVRDSAkJMHgxYzQ4CiAKQEAgLTY1MSwxNiArNjY4LDI3IEBACiAjZGVmaW5lIFJBREVPTl9DUF9QQUNLRVQxCQkweDQwMDAwMDAwCiAjZGVmaW5lIFJBREVPTl9DUF9QQUNLRVQyCQkweDgwMDAwMDAwCiAjZGVmaW5lIFJBREVPTl9DUF9QQUNLRVQzCQkweEMwMDAwMDAwCisjICAgICAgIGRlZmluZSBSQURFT05fQ1BfTk9QICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjICAgICAgIGRlZmluZSBSQURFT05fQ1BfTkVYVF9DSEFSICAgICAgICAgICAgICAweDAwMDAxOTAwCisjICAgICAgIGRlZmluZSBSQURFT05fQ1BfUExZX05FWFRTQ0FOICAgICAgICAgICAweDAwMDAxRDAwCisjICAgICAgIGRlZmluZSBSQURFT05fQ1BfU0VUX1NDSVNTT1JTICAgICAgICAgICAweDAwMDAxRTAwCisgICAgICAgICAgICAgLyogR0VOX0lORFhfUFJJTSBpcyB1bnN1cHBvcnRlZCBzdGFydGluZyB3aXRoIFIzMDAgKi8KICMJZGVmaW5lIFJBREVPTl8zRF9STkRSX0dFTl9JTkRYX1BSSU0JMHgwMDAwMjMwMAogIwlkZWZpbmUgUkFERU9OX1dBSVRfRk9SX0lETEUJCTB4MDAwMDI2MDAKICMJZGVmaW5lIFJBREVPTl8zRF9EUkFXX1ZCVUYJCTB4MDAwMDI4MDAKICMJZGVmaW5lIFJBREVPTl8zRF9EUkFXX0lNTUQJCTB4MDAwMDI5MDAKICMJZGVmaW5lIFJBREVPTl8zRF9EUkFXX0lORFgJCTB4MDAwMDJBMDAKKyMgICAgICAgZGVmaW5lIFJBREVPTl9DUF9MT0FEX1BBTEVUVEUgICAgICAgICAgIDB4MDAwMDJDMDAKICMJZGVmaW5lIFJBREVPTl8zRF9MT0FEX1ZCUE5UUgkJMHgwMDAwMkYwMAogIwlkZWZpbmUgUkFERU9OX01QRUdfSURDVF9NQUNST0JMT0NLCTB4MDAwMDMwMDAKICMJZGVmaW5lIFJBREVPTl9NUEVHX0lEQ1RfTUFDUk9CTE9DS19SRVYJMHgwMDAwMzEwMAogIwlkZWZpbmUgUkFERU9OXzNEX0NMRUFSX1pNQVNLCQkweDAwMDAzMjAwCisjCWRlZmluZSBSQURFT05fQ1BfSU5EWF9CVUZGRVIJCTB4MDAwMDMzMDAKKyMgICAgICAgZGVmaW5lIFJBREVPTl9DUF8zRF9EUkFXX1ZCVUZfMiAgICAgICAgIDB4MDAwMDM0MDAKKyMgICAgICAgZGVmaW5lIFJBREVPTl9DUF8zRF9EUkFXX0lNTURfMiAgICAgICAgIDB4MDAwMDM1MDAKKyMgICAgICAgZGVmaW5lIFJBREVPTl9DUF8zRF9EUkFXX0lORFhfMiAgICAgICAgIDB4MDAwMDM2MDAKICMJZGVmaW5lIFJBREVPTl8zRF9DTEVBUl9ISVoJCTB4MDAwMDM3MDAKKyMgICAgICAgZGVmaW5lIFJBREVPTl9DUF8zRF9DTEVBUl9DTUFTSyAgICAgICAgIDB4MDAwMDM4MDIKICMJZGVmaW5lIFJBREVPTl9DTlRMX0hPU1REQVRBX0JMVAkJMHgwMDAwOTQwMAogIwlkZWZpbmUgUkFERU9OX0NOVExfUEFJTlRfTVVMVEkJCTB4MDAwMDlBMDAKICMJZGVmaW5lIFJBREVPTl9DTlRMX0JJVEJMVF9NVUxUSQkJMHgwMDAwOUIwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKaW5kZXggMWY3OWUyNC4uNjRhM2UzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCkBAIC0xNDkzLDcgKzE0OTMsNyBAQAogCiB9CiAKLSNkZWZpbmUgUkFERU9OX01BWF9URVhUVVJFX1NJWkUgKFJBREVPTl9CVUZGRVJfU0laRSAtIDggKiBzaXplb2YodTMyKSkKKyNkZWZpbmUgUkFERU9OX01BWF9URVhUVVJFX1NJWkUgUkFERU9OX0JVRkZFUl9TSVpFCiAKIHN0YXRpYyBpbnQgcmFkZW9uX2NwX2Rpc3BhdGNoX3RleHR1cmUoIERSTUZJTEUgZmlscCwKIAkJCQkgICAgICAgZHJtX2RldmljZV90ICpkZXYsCkBAIC0xNTA2LDEwICsxNTA2LDExIEBACiAJdTMyIGZvcm1hdDsKIAl1MzIgKmJ1ZmZlcjsKIAljb25zdCB1OCBfX3VzZXIgKmRhdGE7Ci0JaW50IHNpemUsIGR3b3JkcywgdGV4X3dpZHRoLCBibGl0X3dpZHRoOworCWludCBzaXplLCBkd29yZHMsIHRleF93aWR0aCwgYmxpdF93aWR0aCwgc3BpdGNoOwogCXUzMiBoZWlnaHQ7CiAJaW50IGk7CiAJdTMyIHRleHBpdGNoLCBtaWNyb3RpbGU7CisJdTMyIG9mZnNldDsKIAlSSU5HX0xPQ0FMUzsKIAogCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTiggZmlscF9wcml2LCBmaWxwICk7CkBAIC0xNTMwLDE3ICsxNTMxLDYgQEAKIAlSQURFT05fV0FJVF9VTlRJTF9JRExFKCk7CiAJQURWQU5DRV9SSU5HKCk7CiAKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQkvKiBUaGUgTWVzYSB0ZXh0dXJlIGZ1bmN0aW9ucyBwcm92aWRlIHRoZSBkYXRhIGluIGxpdHRsZSBlbmRpYW4gYXMgdGhlCi0JICogY2hpcCB3YW50cyBpdCwgYnV0IHdlIG5lZWQgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGZhY3QgdGhhdCB0aGUgQ1AKLQkgKiByaW5nIGdldHMgYnl0ZS1zd2FwcGVkCi0JICovCi0JQkVHSU5fUklORyggMiApOwotCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCQk1fR1VJQ05UTCwgUkFERU9OX0hPU1RfREFUQV9TV0FQXzMyQklUICk7Ci0JQURWQU5DRV9SSU5HKCk7Ci0jZW5kaWYKLQotCiAJLyogVGhlIGNvbXBpbGVyIHdvbid0IG9wdGltaXplIGF3YXkgYSBkaXZpc2lvbiBieSBhIHZhcmlhYmxlLAogCSAqIGV2ZW4gaWYgdGhlIG9ubHkgbGVnYWwgdmFsdWVzIGFyZSBwb3dlcnMgb2YgdHdvLiAgVGh1cywgd2UnbGwKIAkgKiB1c2UgYSBzaGlmdCBpbnN0ZWFkLgpAQCAtMTU3Miw2ICsxNTYyLDEwIEBACiAJCURSTV9FUlJPUiggImludmFsaWQgdGV4dHVyZSBmb3JtYXQgJWRcbiIsIHRleC0+Zm9ybWF0ICk7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQorCXNwaXRjaCA9IGJsaXRfd2lkdGggPj4gNjsKKwlpZiAoc3BpdGNoID09IDAgJiYgaW1hZ2UtPmhlaWdodCA+IDEpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKIAl0ZXhwaXRjaCA9IHRleC0+cGl0Y2g7CiAJaWYgKCh0ZXhwaXRjaCA8PCAyMikgJiBSQURFT05fRFNUX1RJTEVfTUlDUk8pIHsKIAkJbWljcm90aWxlID0gMTsKQEAgLTE2MjQsMjUgKzE2MTgsNiBAQAogCQkgKi8KIAkJYnVmZmVyID0gKHUzMiopKChjaGFyKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKyBidWYtPm9mZnNldCk7CiAJCWR3b3JkcyA9IHNpemUgLyA0OwotCQlidWZmZXJbMF0gPSBDUF9QQUNLRVQzKCBSQURFT05fQ05UTF9IT1NUREFUQV9CTFQsIGR3b3JkcyArIDYgKTsKLQkJYnVmZmVyWzFdID0gKFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKLQkJCSAgICAgUkFERU9OX0dNQ19CUlVTSF9OT05FIHwKLQkJCSAgICAgKGZvcm1hdCA8PCA4KSB8Ci0JCQkgICAgIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKLQkJCSAgICAgUkFERU9OX1JPUDNfUyB8Ci0JCQkgICAgIFJBREVPTl9EUF9TUkNfU09VUkNFX0hPU1RfREFUQSB8Ci0JCQkgICAgIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8Ci0JCQkgICAgIFJBREVPTl9HTUNfV1JfTVNLX0RJUyk7Ci0JCQotCQlidWZmZXJbMl0gPSAodGV4cGl0Y2ggPDwgMjIpIHwgKHRleC0+b2Zmc2V0ID4+IDEwKTsKLQkJYnVmZmVyWzNdID0gMHhmZmZmZmZmZjsKLQkJYnVmZmVyWzRdID0gMHhmZmZmZmZmZjsKLQkJYnVmZmVyWzVdID0gKGltYWdlLT55IDw8IDE2KSB8IGltYWdlLT54OwotCQlidWZmZXJbNl0gPSAoaGVpZ2h0IDw8IDE2KSB8IGltYWdlLT53aWR0aDsKLQkJYnVmZmVyWzddID0gZHdvcmRzOwotCQlidWZmZXIgKz0gODsKLQotCQkKIAogCQlpZiAobWljcm90aWxlKSB7CiAJCQkvKiB0ZXh0dXJlIG1pY3JvIHRpbGluZyBpbiB1c2UsIG1pbmltdW0gdGV4dHVyZSB3aWR0aCBpcyB0aHVzIDE2IGJ5dGVzLgpAQCAtMTc1MCw5ICsxNzI1LDI4IEBACiAJCX0KIAogCQlidWYtPmZpbHAgPSBmaWxwOwotCQlidWYtPnVzZWQgPSAoZHdvcmRzICsgOCkgKiBzaXplb2YodTMyKTsKLQkJcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGlyZWN0KCBkZXYsIGJ1ZiwgMCwgYnVmLT51c2VkICk7Ci0JCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZGV2LCBidWYgKTsKKwkJYnVmLT51c2VkID0gc2l6ZTsKKwkJb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgKyBidWYtPm9mZnNldDsKKwkJQkVHSU5fUklORyg5KTsKKwkJT1VUX1JJTkcoQ1BfUEFDS0VUMyhSQURFT05fQ05UTF9CSVRCTFRfTVVMVEksIDUpKTsKKwkJT1VUX1JJTkcoUkFERU9OX0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJIFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCSBSQURFT05fR01DX0JSVVNIX05PTkUgfAorCQkJIChmb3JtYXQgPDwgOCkgfAorCQkJIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCSBSQURFT05fUk9QM19TIHwKKwkJCSBSQURFT05fRFBfU1JDX1NPVVJDRV9NRU1PUlkgfAorCQkJIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkgUkFERU9OX0dNQ19XUl9NU0tfRElTICk7CisJCU9VVF9SSU5HKChzcGl0Y2ggPDwgMjIpIHwgKG9mZnNldCA+PiAxMCkpOworCQlPVVRfUklORygodGV4cGl0Y2ggPDwgMjIpIHwgKHRleC0+b2Zmc2V0ID4+IDEwKSk7CisJCU9VVF9SSU5HKDApOworCQlPVVRfUklORygoaW1hZ2UtPnggPDwgMTYpIHwgaW1hZ2UtPnkpOworCQlPVVRfUklORygoaW1hZ2UtPndpZHRoIDw8IDE2KSB8IGhlaWdodCk7CisJCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKKwkJQURWQU5DRV9SSU5HKCk7CisKKwkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKGRldiwgYnVmKTsKIAogCQkvKiBVcGRhdGUgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9yIG5leHQgdGltZSAqLwogCQlpbWFnZS0+eSArPSBoZWlnaHQ7CkBAIC0yNzk3LDYgKzI3OTEsMTcgQEAKIAogCW9yaWdfbmJveCA9IGNtZGJ1Zi5uYm94OwogCisJaWYoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uID09IFVDT0RFX1IzMDApIHsKKwkJaW50IHRlbXA7CisJCXRlbXA9cjMwMF9kb19jcF9jbWRidWYoZGV2LCBmaWxwLCBmaWxwX3ByaXYsICZjbWRidWYpOworCQorCQlpZiAob3JpZ19idWZzeiAhPSAwKQorCQkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOworCQorCQlyZXR1cm4gdGVtcDsKKwl9CisKKwkvKiBtaWNyb2NvZGVfdmVyc2lvbiAhPSByMzAwICovCiAJd2hpbGUgKCBjbWRidWYuYnVmc3ogPj0gc2l6ZW9mKGhlYWRlcikgKSB7CiAKIAkJaGVhZGVyLmkgPSAqKGludCAqKWNtZGJ1Zi5idWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9iY2kuYyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2JjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDQwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9iY2kuYwpAQCAtMCwwICsxLDEwOTYgQEAKKy8qIHNhdmFnZV9iY2kuYyAtLSBCQ0kgc3VwcG9ydCBmb3IgU2F2YWdlCisgKgorICogQ29weXJpZ2h0IDIwMDQgIEZlbGl4IEt1ZWhsaW5nCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgRkVMSVggS1VFSExJTkcgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YKKyAqIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAic2F2YWdlX2RybS5oIgorI2luY2x1ZGUgInNhdmFnZV9kcnYuaCIKKworLyogTmVlZCBhIGxvbmcgdGltZW91dCBmb3Igc2hhZG93IHN0YXR1cyB1cGRhdGVzIGNhbiB0YWtlIGEgd2hpbGUKKyAqIGFuZCBzbyBjYW4gd2FpdGluZyBmb3IgZXZlbnRzIHdoZW4gdGhlIHF1ZXVlIGlzIGZ1bGwuICovCisjZGVmaW5lIFNBVkFHRV9ERUZBVUxUX1VTRUNfVElNRU9VVAkxMDAwMDAwIC8qIDFzICovCisjZGVmaW5lIFNBVkFHRV9FVkVOVF9VU0VDX1RJTUVPVVQJNTAwMDAwMCAvKiA1cyAqLworI2RlZmluZSBTQVZBR0VfRlJFRUxJU1RfREVCVUcJCTAKKworc3RhdGljIGludAorc2F2YWdlX2JjaV93YWl0X2ZpZm9fc2hhZG93KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdW5zaWduZWQgaW50IG4pCit7CisJdWludDMyX3QgbWFzayA9IGRldl9wcml2LT5zdGF0dXNfdXNlZF9tYXNrOworCXVpbnQzMl90IHRocmVzaG9sZCA9IGRldl9wcml2LT5iY2lfdGhyZXNob2xkX2hpOworCXVpbnQzMl90IHN0YXR1czsKKwlpbnQgaTsKKworI2lmIFNBVkFHRV9CQ0lfREVCVUcKKwlpZiAobiA+IGRldl9wcml2LT5jb2Jfc2l6ZSArIFNBVkFHRV9CQ0lfRklGT19TSVpFIC0gdGhyZXNob2xkKQorCQlEUk1fRVJST1IoIlRyeWluZyB0byBlbWl0ICVkIHdvcmRzICIKKwkJCSAgIihtb3JlIHRoYW4gZ3VhcmFudGVlZCBzcGFjZSBpbiBDT0IpXG4iLCBuKTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IFNBVkFHRV9ERUZBVUxUX1VTRUNfVElNRU9VVDsgaSsrKSB7CisJCURSTV9NRU1PUllCQVJSSUVSKCk7CisJCXN0YXR1cyA9IGRldl9wcml2LT5zdGF0dXNfcHRyWzBdOworCQlpZiAoKHN0YXR1cyAmIG1hc2spIDwgdGhyZXNob2xkKQorCQkJcmV0dXJuIDA7CisJCURSTV9VREVMQVkoMSk7CisJfQorCisjaWYgU0FWQUdFX0JDSV9ERUJVRworCURSTV9FUlJPUigiZmFpbGVkIVxuIik7CisJRFJNX0lORk8oIiAgIHN0YXR1cz0weCUwOHgsIHRocmVzaG9sZD0weCUwOHhcbiIsIHN0YXR1cywgdGhyZXNob2xkKTsKKyNlbmRpZgorCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKK30KKworc3RhdGljIGludAorc2F2YWdlX2JjaV93YWl0X2ZpZm9fczNkKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdW5zaWduZWQgaW50IG4pCit7CisJdWludDMyX3QgbWF4VXNlZCA9IGRldl9wcml2LT5jb2Jfc2l6ZSArIFNBVkFHRV9CQ0lfRklGT19TSVpFIC0gbjsKKwl1aW50MzJfdCBzdGF0dXM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0FWQUdFX0RFRkFVTFRfVVNFQ19USU1FT1VUOyBpKyspIHsKKwkJc3RhdHVzID0gU0FWQUdFX1JFQUQoU0FWQUdFX1NUQVRVU19XT1JEMCk7CisJCWlmICgoc3RhdHVzICYgU0FWQUdFX0ZJRk9fVVNFRF9NQVNLX1MzRCkgPD0gbWF4VXNlZCkKKwkJCXJldHVybiAwOworCQlEUk1fVURFTEFZKDEpOworCX0KKworI2lmIFNBVkFHRV9CQ0lfREVCVUcKKwlEUk1fRVJST1IoImZhaWxlZCFcbiIpOworCURSTV9JTkZPKCIgICBzdGF0dXM9MHglMDh4XG4iLCBzdGF0dXMpOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCitzdGF0aWMgaW50CitzYXZhZ2VfYmNpX3dhaXRfZmlmb19zNChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsIHVuc2lnbmVkIGludCBuKQoreworCXVpbnQzMl90IG1heFVzZWQgPSBkZXZfcHJpdi0+Y29iX3NpemUgKyBTQVZBR0VfQkNJX0ZJRk9fU0laRSAtIG47CisJdWludDMyX3Qgc3RhdHVzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNBVkFHRV9ERUZBVUxUX1VTRUNfVElNRU9VVDsgaSsrKSB7CisJCXN0YXR1cyA9IFNBVkFHRV9SRUFEKFNBVkFHRV9BTFRfU1RBVFVTX1dPUkQwKTsKKwkJaWYgKChzdGF0dXMgJiBTQVZBR0VfRklGT19VU0VEX01BU0tfUzQpIDw9IG1heFVzZWQpCisJCQlyZXR1cm4gMDsKKwkJRFJNX1VERUxBWSgxKTsKKwl9CisKKyNpZiBTQVZBR0VfQkNJX0RFQlVHCisJRFJNX0VSUk9SKCJmYWlsZWQhXG4iKTsKKwlEUk1fSU5GTygiICAgc3RhdHVzPTB4JTA4eFxuIiwgc3RhdHVzKTsKKyNlbmRpZgorCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKK30KKworLyoKKyAqIFdhaXRpbmcgZm9yIGV2ZW50cy4KKyAqCisgKiBUaGUgQklPU3Jlc2V0cyB0aGUgZXZlbnQgdGFnIHRvIDAgb24gbW9kZSBjaGFuZ2VzLiBUaGVyZWZvcmUgd2UKKyAqIG5ldmVyIGVtaXQgMCB0byB0aGUgZXZlbnQgdGFnLiBJZiB3ZSBmaW5kIGEgMCBldmVudCB0YWcgd2Uga25vdyB0aGUKKyAqIEJJT1Mgc3RvbXBlZCBvbiBpdCBhbmQgcmV0dXJuIHN1Y2Nlc3MgYXNzdW1pbmcgdGhhdCB0aGUgQklPUyB3YWl0ZWQKKyAqIGZvciBlbmdpbmUgaWRsZS4KKyAqCisgKiBOb3RlOiBpZiB0aGUgWHNlcnZlciB1c2VzIHRoZSBldmVudCB0YWcgaXQgaGFzIHRvIGZvbGxvdyB0aGUgc2FtZQorICogcnVsZS4gT3RoZXJ3aXNlIHRoZXJlIG1heSBiZSBnbGl0Y2hlcyBldmVyeSAyXjE2IGV2ZW50cy4KKyAqLworc3RhdGljIGludAorc2F2YWdlX2JjaV93YWl0X2V2ZW50X3NoYWRvdyhkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsIHVpbnQxNl90IGUpCit7CisJdWludDMyX3Qgc3RhdHVzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNBVkFHRV9FVkVOVF9VU0VDX1RJTUVPVVQ7IGkrKykgeworCQlEUk1fTUVNT1JZQkFSUklFUigpOworCQlzdGF0dXMgPSBkZXZfcHJpdi0+c3RhdHVzX3B0clsxXTsKKwkJaWYgKCgoKHN0YXR1cyAmIDB4ZmZmZikgLSBlKSAmIDB4ZmZmZikgPD0gMHg3ZmZmIHx8CisJCSAgICAoc3RhdHVzICYgMHhmZmZmKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJCURSTV9VREVMQVkoMSk7CisJfQorCisjaWYgU0FWQUdFX0JDSV9ERUJVRworCURSTV9FUlJPUigiZmFpbGVkIVxuIik7CisJRFJNX0lORk8oIiAgIHN0YXR1cz0weCUwOHgsIGU9MHglMDR4XG4iLCBzdGF0dXMsIGUpOworI2VuZGlmCisKKwlyZXR1cm4gRFJNX0VSUihFQlVTWSk7Cit9CisKK3N0YXRpYyBpbnQKK3NhdmFnZV9iY2lfd2FpdF9ldmVudF9yZWcoZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2LCB1aW50MTZfdCBlKQoreworCXVpbnQzMl90IHN0YXR1czsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTQVZBR0VfRVZFTlRfVVNFQ19USU1FT1VUOyBpKyspIHsKKwkJc3RhdHVzID0gU0FWQUdFX1JFQUQoU0FWQUdFX1NUQVRVU19XT1JEMSk7CisJCWlmICgoKChzdGF0dXMgJiAweGZmZmYpIC0gZSkgJiAweGZmZmYpIDw9IDB4N2ZmZiB8fAorCQkgICAgKHN0YXR1cyAmIDB4ZmZmZikgPT0gMCkKKwkJCXJldHVybiAwOworCQlEUk1fVURFTEFZKDEpOworCX0KKworI2lmIFNBVkFHRV9CQ0lfREVCVUcKKwlEUk1fRVJST1IoImZhaWxlZCFcbiIpOworCURSTV9JTkZPKCIgICBzdGF0dXM9MHglMDh4LCBlPTB4JTA0eFxuIiwgc3RhdHVzLCBlKTsKKyNlbmRpZgorCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCit1aW50MTZfdCBzYXZhZ2VfYmNpX2VtaXRfZXZlbnQoZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwl1aW50MTZfdCBjb3VudDsKKwlCQ0lfTE9DQUxTOworCisJaWYgKGRldl9wcml2LT5zdGF0dXNfcHRyKSB7CisJCS8qIGNvb3JkaW5hdGUgd2l0aCBYc2VydmVyICovCisJCWNvdW50ID0gZGV2X3ByaXYtPnN0YXR1c19wdHJbMTAyM107CisJCWlmIChjb3VudCA8IGRldl9wcml2LT5ldmVudF9jb3VudGVyKQorCQkJZGV2X3ByaXYtPmV2ZW50X3dyYXArKzsKKwl9IGVsc2UgeworCQljb3VudCA9IGRldl9wcml2LT5ldmVudF9jb3VudGVyOworCX0KKwljb3VudCA9IChjb3VudCArIDEpICYgMHhmZmZmOworCWlmIChjb3VudCA9PSAwKSB7CisJCWNvdW50Kys7IC8qIFNlZSB0aGUgY29tbWVudCBhYm92ZSBzYXZhZ2Vfd2FpdF9ldmVudF8qLiAqLworCQlkZXZfcHJpdi0+ZXZlbnRfd3JhcCsrOworCX0KKwlkZXZfcHJpdi0+ZXZlbnRfY291bnRlciA9IGNvdW50OworCWlmIChkZXZfcHJpdi0+c3RhdHVzX3B0cikKKwkJZGV2X3ByaXYtPnN0YXR1c19wdHJbMTAyM10gPSAodWludDMyX3QpY291bnQ7CisKKwlpZiAoKGZsYWdzICYgKFNBVkFHRV9XQUlUXzJEIHwgU0FWQUdFX1dBSVRfM0QpKSkgeworCQl1bnNpZ25lZCBpbnQgd2FpdF9jbWQgPSBCQ0lfQ01EX1dBSVQ7CisJCWlmICgoZmxhZ3MgJiBTQVZBR0VfV0FJVF8yRCkpCisJCQl3YWl0X2NtZCB8PSBCQ0lfQ01EX1dBSVRfMkQ7CisJCWlmICgoZmxhZ3MgJiBTQVZBR0VfV0FJVF8zRCkpCisJCQl3YWl0X2NtZCB8PSBCQ0lfQ01EX1dBSVRfM0Q7CisJCUJFR0lOX0JDSSgyKTsKKwkJQkNJX1dSSVRFKHdhaXRfY21kKTsKKwl9IGVsc2UgeworCQlCRUdJTl9CQ0koMSk7CisJfQorCUJDSV9XUklURShCQ0lfQ01EX1VQREFURV9FVkVOVF9UQUcgfCAodWludDMyX3QpY291bnQpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogRnJlZWxpc3QgbWFuYWdlbWVudAorICovCitzdGF0aWMgaW50IHNhdmFnZV9mcmVlbGlzdF9pbml0KGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3NhdmFnZV9idWZfcHJpdl90ICplbnRyeTsKKwlpbnQgaTsKKwlEUk1fREVCVUcoImNvdW50PSVkXG4iLCBkbWEtPmJ1Zl9jb3VudCk7CisKKwlkZXZfcHJpdi0+aGVhZC5uZXh0ID0gJmRldl9wcml2LT50YWlsOworCWRldl9wcml2LT5oZWFkLnByZXYgPSBOVUxMOworCWRldl9wcml2LT5oZWFkLmJ1ZiA9IE5VTEw7CisKKwlkZXZfcHJpdi0+dGFpbC5uZXh0ID0gTlVMTDsKKwlkZXZfcHJpdi0+dGFpbC5wcmV2ID0gJmRldl9wcml2LT5oZWFkOworCWRldl9wcml2LT50YWlsLmJ1ZiA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCQlidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCWVudHJ5ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCQlTRVRfQUdFKCZlbnRyeS0+YWdlLCAwLCAwKTsKKwkJZW50cnktPmJ1ZiA9IGJ1ZjsKKworCQllbnRyeS0+bmV4dCA9IGRldl9wcml2LT5oZWFkLm5leHQ7CisJCWVudHJ5LT5wcmV2ID0gJmRldl9wcml2LT5oZWFkOworCQlkZXZfcHJpdi0+aGVhZC5uZXh0LT5wcmV2ID0gZW50cnk7CisJCWRldl9wcml2LT5oZWFkLm5leHQgPSBlbnRyeTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGRybV9idWZfdCAqc2F2YWdlX2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9zYXZhZ2VfYnVmX3ByaXZfdCAqdGFpbCA9IGRldl9wcml2LT50YWlsLnByZXY7CisJdWludDE2X3QgZXZlbnQ7CisJdW5zaWduZWQgaW50IHdyYXA7CisJRFJNX0RFQlVHKCJcbiIpOworCisJVVBEQVRFX0VWRU5UX0NPVU5URVIoKTsKKwlpZiAoZGV2X3ByaXYtPnN0YXR1c19wdHIpCisJCWV2ZW50ID0gZGV2X3ByaXYtPnN0YXR1c19wdHJbMV0gJiAweGZmZmY7CisJZWxzZQorCQlldmVudCA9IFNBVkFHRV9SRUFEKFNBVkFHRV9TVEFUVVNfV09SRDEpICYgMHhmZmZmOworCXdyYXAgPSBkZXZfcHJpdi0+ZXZlbnRfd3JhcDsKKwlpZiAoZXZlbnQgPiBkZXZfcHJpdi0+ZXZlbnRfY291bnRlcikKKwkJd3JhcC0tOyAvKiBoYXJkd2FyZSBoYXNuJ3QgcGFzc2VkIHRoZSBsYXN0IHdyYXAgeWV0ICovCisKKwlEUk1fREVCVUcoIiAgIHRhaWw9MHglMDR4ICVkXG4iLCB0YWlsLT5hZ2UuZXZlbnQsIHRhaWwtPmFnZS53cmFwKTsKKwlEUk1fREVCVUcoIiAgIGhlYWQ9MHglMDR4ICVkXG4iLCBldmVudCwgd3JhcCk7CisKKwlpZiAodGFpbC0+YnVmICYmIChURVNUX0FHRSgmdGFpbC0+YWdlLCBldmVudCwgd3JhcCkgfHwgZXZlbnQgPT0gMCkpIHsKKwkJZHJtX3NhdmFnZV9idWZfcHJpdl90ICpuZXh0ID0gdGFpbC0+bmV4dDsKKwkJZHJtX3NhdmFnZV9idWZfcHJpdl90ICpwcmV2ID0gdGFpbC0+cHJldjsKKwkJcHJldi0+bmV4dCA9IG5leHQ7CisJCW5leHQtPnByZXYgPSBwcmV2OworCQl0YWlsLT5uZXh0ID0gdGFpbC0+cHJldiA9IE5VTEw7CisJCXJldHVybiB0YWlsLT5idWY7CisJfQorCisJRFJNX0RFQlVHKCJyZXR1cm5pbmcgTlVMTCwgdGFpbC0+YnVmPSVwIVxuIiwgdGFpbC0+YnVmKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBzYXZhZ2VfZnJlZWxpc3RfcHV0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZikKK3sKKwlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9zYXZhZ2VfYnVmX3ByaXZfdCAqZW50cnkgPSBidWYtPmRldl9wcml2YXRlLCAqcHJldiwgKm5leHQ7CisKKwlEUk1fREVCVUcoImFnZT0weCUwNHggd3JhcD0lZFxuIiwgZW50cnktPmFnZS5ldmVudCwgZW50cnktPmFnZS53cmFwKTsKKworCWlmIChlbnRyeS0+bmV4dCAhPSBOVUxMIHx8IGVudHJ5LT5wcmV2ICE9IE5VTEwpIHsKKwkJRFJNX0VSUk9SKCJlbnRyeSBhbHJlYWR5IG9uIGZyZWVsaXN0LlxuIik7CisJCXJldHVybjsKKwl9CisKKwlwcmV2ID0gJmRldl9wcml2LT5oZWFkOworCW5leHQgPSBwcmV2LT5uZXh0OworCXByZXYtPm5leHQgPSBlbnRyeTsKKwluZXh0LT5wcmV2ID0gZW50cnk7CisJZW50cnktPnByZXYgPSBwcmV2OworCWVudHJ5LT5uZXh0ID0gbmV4dDsKK30KKworLyoKKyAqIENvbW1hbmQgRE1BCisgKi8KK3N0YXRpYyBpbnQgc2F2YWdlX2RtYV9pbml0KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWRldl9wcml2LT5ucl9kbWFfcGFnZXMgPSBkZXZfcHJpdi0+Y21kX2RtYS0+c2l6ZSAvCisJCShTQVZBR0VfRE1BX1BBR0VfU0laRSo0KTsKKwlkZXZfcHJpdi0+ZG1hX3BhZ2VzID0gZHJtX2FsbG9jKHNpemVvZihkcm1fc2F2YWdlX2RtYV9wYWdlX3QpICoKKwkJCQkJZGV2X3ByaXYtPm5yX2RtYV9wYWdlcywKKwkJCQkJRFJNX01FTV9EUklWRVIpOworCWlmIChkZXZfcHJpdi0+ZG1hX3BhZ2VzID09IE5VTEwpCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPm5yX2RtYV9wYWdlczsgKytpKSB7CisJCVNFVF9BR0UoJmRldl9wcml2LT5kbWFfcGFnZXNbaV0uYWdlLCAwLCAwKTsKKwkJZGV2X3ByaXYtPmRtYV9wYWdlc1tpXS51c2VkID0gMDsKKwkJZGV2X3ByaXYtPmRtYV9wYWdlc1tpXS5mbHVzaGVkID0gMDsKKwl9CisJU0VUX0FHRSgmZGV2X3ByaXYtPmxhc3RfZG1hX2FnZSwgMCwgMCk7CisKKwlkZXZfcHJpdi0+Zmlyc3RfZG1hX3BhZ2UgPSAwOworCWRldl9wcml2LT5jdXJyZW50X2RtYV9wYWdlID0gMDsKKworCXJldHVybiAwOworfQorCit2b2lkIHNhdmFnZV9kbWFfcmVzZXQoZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2KQoreworCXVpbnQxNl90IGV2ZW50OworCXVuc2lnbmVkIGludCB3cmFwLCBpOworCWV2ZW50ID0gc2F2YWdlX2JjaV9lbWl0X2V2ZW50KGRldl9wcml2LCAwKTsKKwl3cmFwID0gZGV2X3ByaXYtPmV2ZW50X3dyYXA7CisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5ucl9kbWFfcGFnZXM7ICsraSkgeworCQlTRVRfQUdFKCZkZXZfcHJpdi0+ZG1hX3BhZ2VzW2ldLmFnZSwgZXZlbnQsIHdyYXApOworCQlkZXZfcHJpdi0+ZG1hX3BhZ2VzW2ldLnVzZWQgPSAwOworCQlkZXZfcHJpdi0+ZG1hX3BhZ2VzW2ldLmZsdXNoZWQgPSAwOworCX0KKwlTRVRfQUdFKCZkZXZfcHJpdi0+bGFzdF9kbWFfYWdlLCBldmVudCwgd3JhcCk7CisJZGV2X3ByaXYtPmZpcnN0X2RtYV9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfZG1hX3BhZ2UgPSAwOworfQorCit2b2lkIHNhdmFnZV9kbWFfd2FpdChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsIHVuc2lnbmVkIGludCBwYWdlKQoreworCXVpbnQxNl90IGV2ZW50OworCXVuc2lnbmVkIGludCB3cmFwOworCisJLyogRmFrZWQgRE1BIGJ1ZmZlciBwYWdlcyBkb24ndCBhZ2UuICovCisJaWYgKGRldl9wcml2LT5jbWRfZG1hID09ICZkZXZfcHJpdi0+ZmFrZV9kbWEpCisJCXJldHVybjsKKworCVVQREFURV9FVkVOVF9DT1VOVEVSKCk7CisJaWYgKGRldl9wcml2LT5zdGF0dXNfcHRyKQorCQlldmVudCA9IGRldl9wcml2LT5zdGF0dXNfcHRyWzFdICYgMHhmZmZmOworCWVsc2UKKwkJZXZlbnQgPSBTQVZBR0VfUkVBRChTQVZBR0VfU1RBVFVTX1dPUkQxKSAmIDB4ZmZmZjsKKwl3cmFwID0gZGV2X3ByaXYtPmV2ZW50X3dyYXA7CisJaWYgKGV2ZW50ID4gZGV2X3ByaXYtPmV2ZW50X2NvdW50ZXIpCisJCXdyYXAtLTsgLyogaGFyZHdhcmUgaGFzbid0IHBhc3NlZCB0aGUgbGFzdCB3cmFwIHlldCAqLworCisJaWYgKGRldl9wcml2LT5kbWFfcGFnZXNbcGFnZV0uYWdlLndyYXAgPiB3cmFwIHx8CisJICAgIChkZXZfcHJpdi0+ZG1hX3BhZ2VzW3BhZ2VdLmFnZS53cmFwID09IHdyYXAgJiYKKwkgICAgIGRldl9wcml2LT5kbWFfcGFnZXNbcGFnZV0uYWdlLmV2ZW50ID4gZXZlbnQpKSB7CisJCWlmIChkZXZfcHJpdi0+d2FpdF9ldm50KGRldl9wcml2LAorCQkJCQlkZXZfcHJpdi0+ZG1hX3BhZ2VzW3BhZ2VdLmFnZS5ldmVudCkKKwkJICAgIDwgMCkKKwkJCURSTV9FUlJPUigid2FpdF9ldm50IGZhaWxlZCFcbiIpOworCX0KK30KKwordWludDMyX3QgKnNhdmFnZV9kbWFfYWxsb2MoZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2LCB1bnNpZ25lZCBpbnQgbikKK3sKKwl1bnNpZ25lZCBpbnQgY3VyID0gZGV2X3ByaXYtPmN1cnJlbnRfZG1hX3BhZ2U7CisJdW5zaWduZWQgaW50IHJlc3QgPSBTQVZBR0VfRE1BX1BBR0VfU0laRSAtCisJCWRldl9wcml2LT5kbWFfcGFnZXNbY3VyXS51c2VkOworCXVuc2lnbmVkIGludCBucl9wYWdlcyA9IChuIC0gcmVzdCArIFNBVkFHRV9ETUFfUEFHRV9TSVpFLTEpIC8KKwkJU0FWQUdFX0RNQV9QQUdFX1NJWkU7CisJdWludDMyX3QgKmRtYV9wdHI7CisJdW5zaWduZWQgaW50IGk7CisKKwlEUk1fREVCVUcoImN1cj0ldSwgY3VyLT51c2VkPSV1LCBuPSV1LCByZXN0PSV1LCBucl9wYWdlcz0ldVxuIiwKKwkJICBjdXIsIGRldl9wcml2LT5kbWFfcGFnZXNbY3VyXS51c2VkLCBuLCByZXN0LCBucl9wYWdlcyk7CisKKwlpZiAoY3VyICsgbnJfcGFnZXMgPCBkZXZfcHJpdi0+bnJfZG1hX3BhZ2VzKSB7CisJCWRtYV9wdHIgPSAodWludDMyX3QgKilkZXZfcHJpdi0+Y21kX2RtYS0+aGFuZGxlICsKKwkJCWN1cipTQVZBR0VfRE1BX1BBR0VfU0laRSArCisJCQlkZXZfcHJpdi0+ZG1hX3BhZ2VzW2N1cl0udXNlZDsKKwkJaWYgKG4gPCByZXN0KQorCQkJcmVzdCA9IG47CisJCWRldl9wcml2LT5kbWFfcGFnZXNbY3VyXS51c2VkICs9IHJlc3Q7CisJCW4gLT0gcmVzdDsKKwkJY3VyKys7CisJfSBlbHNlIHsKKwkJZGV2X3ByaXYtPmRtYV9mbHVzaChkZXZfcHJpdik7CisJCW5yX3BhZ2VzID0gKG4gKyBTQVZBR0VfRE1BX1BBR0VfU0laRS0xKSAvIFNBVkFHRV9ETUFfUEFHRV9TSVpFOworCQlmb3IgKGkgPSBjdXI7IGkgPCBkZXZfcHJpdi0+bnJfZG1hX3BhZ2VzOyArK2kpIHsKKwkJCWRldl9wcml2LT5kbWFfcGFnZXNbaV0uYWdlID0gZGV2X3ByaXYtPmxhc3RfZG1hX2FnZTsKKwkJCWRldl9wcml2LT5kbWFfcGFnZXNbaV0udXNlZCA9IDA7CisJCQlkZXZfcHJpdi0+ZG1hX3BhZ2VzW2ldLmZsdXNoZWQgPSAwOworCQl9CisJCWRtYV9wdHIgPSAodWludDMyX3QgKilkZXZfcHJpdi0+Y21kX2RtYS0+aGFuZGxlOworCQlkZXZfcHJpdi0+Zmlyc3RfZG1hX3BhZ2UgPSBjdXIgPSAwOworCX0KKwlmb3IgKGkgPSBjdXI7IG5yX3BhZ2VzID4gMDsgKytpLCAtLW5yX3BhZ2VzKSB7CisjaWYgU0FWQUdFX0RNQV9ERUJVRworCQlpZiAoZGV2X3ByaXYtPmRtYV9wYWdlc1tpXS51c2VkKSB7CisJCQlEUk1fRVJST1IoInVuZmx1c2hlZCBwYWdlICV1OiB1c2VkPSV1XG4iLAorCQkJCSAgaSwgZGV2X3ByaXYtPmRtYV9wYWdlc1tpXS51c2VkKTsKKwkJfQorI2VuZGlmCisJCWlmIChuID4gU0FWQUdFX0RNQV9QQUdFX1NJWkUpCisJCQlkZXZfcHJpdi0+ZG1hX3BhZ2VzW2ldLnVzZWQgPSBTQVZBR0VfRE1BX1BBR0VfU0laRTsKKwkJZWxzZQorCQkJZGV2X3ByaXYtPmRtYV9wYWdlc1tpXS51c2VkID0gbjsKKwkJbiAtPSBTQVZBR0VfRE1BX1BBR0VfU0laRTsKKwl9CisJZGV2X3ByaXYtPmN1cnJlbnRfZG1hX3BhZ2UgPSAtLWk7CisKKwlEUk1fREVCVUcoImN1cj0ldSwgY3VyLT51c2VkPSV1LCBuPSV1XG4iLAorCQkgIGksIGRldl9wcml2LT5kbWFfcGFnZXNbaV0udXNlZCwgbik7CisKKwlzYXZhZ2VfZG1hX3dhaXQoZGV2X3ByaXYsIGRldl9wcml2LT5jdXJyZW50X2RtYV9wYWdlKTsKKworCXJldHVybiBkbWFfcHRyOworfQorCitzdGF0aWMgdm9pZCBzYXZhZ2VfZG1hX2ZsdXNoKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgZmlyc3QgPSBkZXZfcHJpdi0+Zmlyc3RfZG1hX3BhZ2U7CisJdW5zaWduZWQgaW50IGN1ciA9IGRldl9wcml2LT5jdXJyZW50X2RtYV9wYWdlOworCXVpbnQxNl90IGV2ZW50OworCXVuc2lnbmVkIGludCB3cmFwLCBwYWQsIGFsaWduLCBsZW4sIGk7CisJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHI7CisJQkNJX0xPQ0FMUzsKKworCWlmIChmaXJzdCA9PSBjdXIgJiYKKwkgICAgZGV2X3ByaXYtPmRtYV9wYWdlc1tjdXJdLnVzZWQgPT0gZGV2X3ByaXYtPmRtYV9wYWdlc1tjdXJdLmZsdXNoZWQpCisJCXJldHVybjsKKworCS8qIHBhZCBsZW5ndGggdG8gbXVsdGlwbGVzIG9mIDIgZW50cmllcworCSAqIGFsaWduIHN0YXJ0IG9mIG5leHQgRE1BIGJsb2NrIHRvIG11bHRpbGVzIG9mIDggZW50cmllcyAqLworCXBhZCA9IC1kZXZfcHJpdi0+ZG1hX3BhZ2VzW2N1cl0udXNlZCAmIDE7CisJYWxpZ24gPSAtKGRldl9wcml2LT5kbWFfcGFnZXNbY3VyXS51c2VkICsgcGFkKSAmIDc7CisKKwlEUk1fREVCVUcoImZpcnN0PSV1LCBjdXI9JXUsIGZpcnN0LT5mbHVzaGVkPSV1LCBjdXItPnVzZWQ9JXUsICIKKwkJICAicGFkPSV1LCBhbGlnbj0ldVxuIiwKKwkJICBmaXJzdCwgY3VyLCBkZXZfcHJpdi0+ZG1hX3BhZ2VzW2ZpcnN0XS5mbHVzaGVkLAorCQkgIGRldl9wcml2LT5kbWFfcGFnZXNbY3VyXS51c2VkLCBwYWQsIGFsaWduKTsKKworCS8qIHBhZCB3aXRoIG5vb3BzICovCisJaWYgKHBhZCkgeworCQl1aW50MzJfdCAqZG1hX3B0ciA9ICh1aW50MzJfdCAqKWRldl9wcml2LT5jbWRfZG1hLT5oYW5kbGUgKworCQkJY3VyICogU0FWQUdFX0RNQV9QQUdFX1NJWkUgKworCQkJZGV2X3ByaXYtPmRtYV9wYWdlc1tjdXJdLnVzZWQ7CisJCWRldl9wcml2LT5kbWFfcGFnZXNbY3VyXS51c2VkICs9IHBhZDsKKwkJd2hpbGUocGFkICE9IDApIHsKKwkJCSpkbWFfcHRyKysgPSBCQ0lfQ01EX1dBSVQ7CisJCQlwYWQtLTsKKwkJfQorCX0KKworCURSTV9NRU1PUllCQVJSSUVSKCk7CisKKwkvKiBkbyBmbHVzaCAuLi4gKi8KKwlwaHlzX2FkZHIgPSBkZXZfcHJpdi0+Y21kX2RtYS0+b2Zmc2V0ICsKKwkJKGZpcnN0ICogU0FWQUdFX0RNQV9QQUdFX1NJWkUgKworCQkgZGV2X3ByaXYtPmRtYV9wYWdlc1tmaXJzdF0uZmx1c2hlZCkgKiA0OworCWxlbiA9IChjdXIgLSBmaXJzdCkgKiBTQVZBR0VfRE1BX1BBR0VfU0laRSArCisJCWRldl9wcml2LT5kbWFfcGFnZXNbY3VyXS51c2VkIC0KKwkJZGV2X3ByaXYtPmRtYV9wYWdlc1tmaXJzdF0uZmx1c2hlZDsKKworCURSTV9ERUJVRygicGh5c19hZGRyPSVseCwgbGVuPSV1XG4iLAorCQkgIHBoeXNfYWRkciB8IGRldl9wcml2LT5kbWFfdHlwZSwgbGVuKTsKKworCUJFR0lOX0JDSSgzKTsKKwlCQ0lfU0VUX1JFR0lTVEVSUyhTQVZBR0VfRE1BQlVGQUREUiwgMSk7CisJQkNJX1dSSVRFKHBoeXNfYWRkciB8IGRldl9wcml2LT5kbWFfdHlwZSk7CisJQkNJX0RNQShsZW4pOworCisJLyogZml4IGFsaWdubWVudCBvZiB0aGUgc3RhcnQgb2YgdGhlIG5leHQgYmxvY2sgKi8KKwlkZXZfcHJpdi0+ZG1hX3BhZ2VzW2N1cl0udXNlZCArPSBhbGlnbjsKKworCS8qIGFnZSBETUEgcGFnZXMgKi8KKwlldmVudCA9IHNhdmFnZV9iY2lfZW1pdF9ldmVudChkZXZfcHJpdiwgMCk7CisJd3JhcCA9IGRldl9wcml2LT5ldmVudF93cmFwOworCWZvciAoaSA9IGZpcnN0OyBpIDwgY3VyOyArK2kpIHsKKwkJU0VUX0FHRSgmZGV2X3ByaXYtPmRtYV9wYWdlc1tpXS5hZ2UsIGV2ZW50LCB3cmFwKTsKKwkJZGV2X3ByaXYtPmRtYV9wYWdlc1tpXS51c2VkID0gMDsKKwkJZGV2X3ByaXYtPmRtYV9wYWdlc1tpXS5mbHVzaGVkID0gMDsKKwl9CisJLyogYWdlIHRoZSBjdXJyZW50IHBhZ2Ugb25seSB3aGVuIGl0J3MgZnVsbCAqLworCWlmIChkZXZfcHJpdi0+ZG1hX3BhZ2VzW2N1cl0udXNlZCA9PSBTQVZBR0VfRE1BX1BBR0VfU0laRSkgeworCQlTRVRfQUdFKCZkZXZfcHJpdi0+ZG1hX3BhZ2VzW2N1cl0uYWdlLCBldmVudCwgd3JhcCk7CisJCWRldl9wcml2LT5kbWFfcGFnZXNbY3VyXS51c2VkID0gMDsKKwkJZGV2X3ByaXYtPmRtYV9wYWdlc1tjdXJdLmZsdXNoZWQgPSAwOworCQkvKiBhZHZhbmNlIHRvIG5leHQgcGFnZSAqLworCQljdXIrKzsKKwkJaWYgKGN1ciA9PSBkZXZfcHJpdi0+bnJfZG1hX3BhZ2VzKQorCQkJY3VyID0gMDsKKwkJZGV2X3ByaXYtPmZpcnN0X2RtYV9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfZG1hX3BhZ2UgPSBjdXI7CisJfSBlbHNlIHsKKwkJZGV2X3ByaXYtPmZpcnN0X2RtYV9wYWdlID0gY3VyOworCQlkZXZfcHJpdi0+ZG1hX3BhZ2VzW2N1cl0uZmx1c2hlZCA9IGRldl9wcml2LT5kbWFfcGFnZXNbaV0udXNlZDsKKwl9CisJU0VUX0FHRSgmZGV2X3ByaXYtPmxhc3RfZG1hX2FnZSwgZXZlbnQsIHdyYXApOworCisJRFJNX0RFQlVHKCJmaXJzdD1jdXI9JXUsIGN1ci0+dXNlZD0ldSwgY3VyLT5mbHVzaGVkPSV1XG4iLCBjdXIsCisJCSAgZGV2X3ByaXYtPmRtYV9wYWdlc1tjdXJdLnVzZWQsCisJCSAgZGV2X3ByaXYtPmRtYV9wYWdlc1tjdXJdLmZsdXNoZWQpOworfQorCitzdGF0aWMgdm9pZCBzYXZhZ2VfZmFrZV9kbWFfZmx1c2goZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2KQoreworCXVuc2lnbmVkIGludCBpLCBqOworCUJDSV9MT0NBTFM7CisKKwlpZiAoZGV2X3ByaXYtPmZpcnN0X2RtYV9wYWdlID09IGRldl9wcml2LT5jdXJyZW50X2RtYV9wYWdlICYmCisJICAgIGRldl9wcml2LT5kbWFfcGFnZXNbZGV2X3ByaXYtPmN1cnJlbnRfZG1hX3BhZ2VdLnVzZWQgPT0gMCkKKwkJcmV0dXJuOworCisJRFJNX0RFQlVHKCJmaXJzdD0ldSwgY3VyPSV1LCBjdXItPnVzZWQ9JXVcbiIsCisJCSAgZGV2X3ByaXYtPmZpcnN0X2RtYV9wYWdlLCBkZXZfcHJpdi0+Y3VycmVudF9kbWFfcGFnZSwKKwkJICBkZXZfcHJpdi0+ZG1hX3BhZ2VzW2Rldl9wcml2LT5jdXJyZW50X2RtYV9wYWdlXS51c2VkKTsKKworCWZvciAoaSA9IGRldl9wcml2LT5maXJzdF9kbWFfcGFnZTsKKwkgICAgIGkgPD0gZGV2X3ByaXYtPmN1cnJlbnRfZG1hX3BhZ2UgJiYgZGV2X3ByaXYtPmRtYV9wYWdlc1tpXS51c2VkOworCSAgICAgKytpKSB7CisJCXVpbnQzMl90ICpkbWFfcHRyID0gKHVpbnQzMl90ICopZGV2X3ByaXYtPmNtZF9kbWEtPmhhbmRsZSArCisJCQlpICogU0FWQUdFX0RNQV9QQUdFX1NJWkU7CisjaWYgU0FWQUdFX0RNQV9ERUJVRworCQkvKiBTYW5pdHkgY2hlY2s6IGFsbCBwYWdlcyBleGNlcHQgdGhlIGxhc3Qgb25lIG11c3QgYmUgZnVsbC4gKi8KKwkJaWYgKGkgPCBkZXZfcHJpdi0+Y3VycmVudF9kbWFfcGFnZSAmJgorCQkgICAgZGV2X3ByaXYtPmRtYV9wYWdlc1tpXS51c2VkICE9IFNBVkFHRV9ETUFfUEFHRV9TSVpFKSB7CisJCQlEUk1fRVJST1IoInBhcnRpYWwgRE1BIHBhZ2UgJXU6IHVzZWQ9JXUiLAorCQkJCSAgaSwgZGV2X3ByaXYtPmRtYV9wYWdlc1tpXS51c2VkKTsKKwkJfQorI2VuZGlmCisJCUJFR0lOX0JDSShkZXZfcHJpdi0+ZG1hX3BhZ2VzW2ldLnVzZWQpOworCQlmb3IgKGogPSAwOyBqIDwgZGV2X3ByaXYtPmRtYV9wYWdlc1tpXS51c2VkOyArK2opIHsKKwkJCUJDSV9XUklURShkbWFfcHRyW2pdKTsKKwkJfQorCQlkZXZfcHJpdi0+ZG1hX3BhZ2VzW2ldLnVzZWQgPSAwOworCX0KKworCS8qIHJlc2V0IHRvIGZpcnN0IHBhZ2UgKi8KKwlkZXZfcHJpdi0+Zmlyc3RfZG1hX3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9kbWFfcGFnZSA9IDA7Cit9CisKKy8qCisgKiBJbml0YWxpemUgbWFwcGluZ3MuIE9uIFNhdmFnZTQgYW5kIFNhdmFnZUlYIHRoZSBhbGlnbm1lbnQKKyAqIGFuZCBzaXplIG9mIHRoZSBhcGVydHVyZSBpcyBub3Qgc3VpdGFibGUgZm9yIGF1dG9tYXRpYyBNVFJSIHNldHVwCisgKiBpbiBkcm1fYWRkbWFwLiBUaGVyZWZvcmUgd2UgZG8gaXQgbWFudWFsbHkgYmVmb3JlIHRoZSBtYXBzIGFyZQorICogaW5pdGlhbGl6ZWQuIFdlIGFsc28gbmVlZCB0byB0YWtlIGNhcmUgb2YgZGVsZXRpbmcgdGhlIE1UUlJzIGluCisgKiBwb3N0Y2xlYW51cC4KKyAqLworaW50IHNhdmFnZV9wcmVpbml0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpCit7CisJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2OworCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlLCBmYl9iYXNlLCBmYl9zaXplLCBhcGVydHVyZV9iYXNlOworCS8qIGZiX3JzcmMgYW5kIGFwZXJfcnNyYyBhcmVuJ3QgcmVhbGx5IHVzZWQgY3VycmVudGx5LCBidXQgc3RpbGwgZXhpc3QKKwkgKiBpbiBjYXNlIHdlIGRlY2lkZSB3ZSBuZWVkIGluZm9ybWF0aW9uIG9uIHRoZSBCQVIgZm9yIEJTRCBpbiB0aGUKKwkgKiBmdXR1cmUuCisJICovCisJdW5zaWduZWQgaW50IGZiX3JzcmMsIGFwZXJfcnNyYzsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9wcml2ID0gZHJtX2FsbG9jKHNpemVvZihkcm1fc2F2YWdlX3ByaXZhdGVfdCksIERSTV9NRU1fRFJJVkVSKTsKKwlpZiAoZGV2X3ByaXYgPT0gTlVMTCkKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKworCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9zYXZhZ2VfcHJpdmF0ZV90KSk7CisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJZGV2X3ByaXYtPmNoaXBzZXQgPSAoZW51bSBzYXZhZ2VfZmFtaWx5KWNoaXBzZXQ7CisKKwlkZXZfcHJpdi0+bXRyclswXS5oYW5kbGUgPSAtMTsKKwlkZXZfcHJpdi0+bXRyclsxXS5oYW5kbGUgPSAtMTsKKwlkZXZfcHJpdi0+bXRyclsyXS5oYW5kbGUgPSAtMTsKKwlpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSkgeworCQlmYl9yc3JjID0gMDsKKwkJZmJfYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwkJZmJfc2l6ZSA9IFNBVkFHRV9GQl9TSVpFX1MzOworCQltbWlvX2Jhc2UgPSBmYl9iYXNlICsgU0FWQUdFX0ZCX1NJWkVfUzM7CisJCWFwZXJfcnNyYyA9IDA7CisJCWFwZXJ0dXJlX2Jhc2UgPSBmYl9iYXNlICsgU0FWQUdFX0FQRVJUVVJFX09GRlNFVDsKKwkJLyogdGhpcyBzaG91bGQgYWx3YXlzIGJlIHRydWUgKi8KKwkJaWYgKGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMCkgPT0gMHgwODAwMDAwMCkgeworCQkJLyogRG9uJ3QgbWFrZSBNTUlPIHdyaXRlLWNvYmluaW5nISBXZSBuZWVkIDMKKwkJCSAqIE1UUlJzLiAqLworCQkJZGV2X3ByaXYtPm10cnJbMF0uYmFzZSA9IGZiX2Jhc2U7CisJCQlkZXZfcHJpdi0+bXRyclswXS5zaXplID0gMHgwMTAwMDAwMDsKKwkJCWRldl9wcml2LT5tdHJyWzBdLmhhbmRsZSA9IG10cnJfYWRkKAorCQkJCWRldl9wcml2LT5tdHJyWzBdLmJhc2UsIGRldl9wcml2LT5tdHJyWzBdLnNpemUsCisJCQkJTVRSUl9UWVBFX1dSQ09NQiwgMSk7CisJCQlkZXZfcHJpdi0+bXRyclsxXS5iYXNlID0gZmJfYmFzZSsweDAyMDAwMDAwOworCQkJZGV2X3ByaXYtPm10cnJbMV0uc2l6ZSA9IDB4MDIwMDAwMDA7CisJCQlkZXZfcHJpdi0+bXRyclsxXS5oYW5kbGUgPSBtdHJyX2FkZCgKKwkJCQlkZXZfcHJpdi0+bXRyclsxXS5iYXNlLCBkZXZfcHJpdi0+bXRyclsxXS5zaXplLAorCQkJCU1UUlJfVFlQRV9XUkNPTUIsIDEpOworCQkJZGV2X3ByaXYtPm10cnJbMl0uYmFzZSA9IGZiX2Jhc2UrMHgwNDAwMDAwMDsKKwkJCWRldl9wcml2LT5tdHJyWzJdLnNpemUgPSAweDA0MDAwMDAwOworCQkJZGV2X3ByaXYtPm10cnJbMl0uaGFuZGxlID0gbXRycl9hZGQoCisJCQkJZGV2X3ByaXYtPm10cnJbMl0uYmFzZSwgZGV2X3ByaXYtPm10cnJbMl0uc2l6ZSwKKwkJCQlNVFJSX1RZUEVfV1JDT01CLCAxKTsKKwkJfSBlbHNlIHsKKwkJCURSTV9FUlJPUigic3RyYW5nZSBwY2lfcmVzb3VyY2VfbGVuICUwOGx4XG4iLAorCQkJCSAgZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAwKSk7CisJCX0KKwl9IGVsc2UgaWYgKGNoaXBzZXQgIT0gUzNfU1VQRVJTQVZBR0UgJiYgY2hpcHNldCAhPSBTM19TQVZBR0UyMDAwKSB7CisJCW1taW9fYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwkJZmJfcnNyYyA9IDE7CisJCWZiX2Jhc2UgPSBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7CisJCWZiX3NpemUgPSBTQVZBR0VfRkJfU0laRV9TNDsKKwkJYXBlcl9yc3JjID0gMTsKKwkJYXBlcnR1cmVfYmFzZSA9IGZiX2Jhc2UgKyBTQVZBR0VfQVBFUlRVUkVfT0ZGU0VUOworCQkvKiB0aGlzIHNob3VsZCBhbHdheXMgYmUgdHJ1ZSAqLworCQlpZiAoZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAxKSA9PSAweDA4MDAwMDAwKSB7CisJCQkvKiBDYW4gdXNlIG9uZSBNVFJSIHRvIGNvdmVyIGJvdGggZmIgYW5kCisJCQkgKiBhcGVydHVyZS4gKi8KKwkJCWRldl9wcml2LT5tdHJyWzBdLmJhc2UgPSBmYl9iYXNlOworCQkJZGV2X3ByaXYtPm10cnJbMF0uc2l6ZSA9IDB4MDgwMDAwMDA7CisJCQlkZXZfcHJpdi0+bXRyclswXS5oYW5kbGUgPSBtdHJyX2FkZCgKKwkJCQlkZXZfcHJpdi0+bXRyclswXS5iYXNlLCBkZXZfcHJpdi0+bXRyclswXS5zaXplLAorCQkJCU1UUlJfVFlQRV9XUkNPTUIsIDEpOworCQl9IGVsc2UgeworCQkJRFJNX0VSUk9SKCJzdHJhbmdlIHBjaV9yZXNvdXJjZV9sZW4gJTA4bHhcbiIsCisJCQkJICBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDEpKTsKKwkJfQorCX0gZWxzZSB7CisJCW1taW9fYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwkJZmJfcnNyYyA9IDE7CisJCWZiX2Jhc2UgPSBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7CisJCWZiX3NpemUgPSBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDEpOworCQlhcGVyX3JzcmMgPSAyOworCQlhcGVydHVyZV9iYXNlID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChkZXYsIDIpOworCQkvKiBBdXRvbWF0aWMgTVRSUiBzZXR1cCB3aWxsIGRvIHRoZSByaWdodCB0aGluZy4gKi8KKwl9CisKKwlyZXQgPSBkcm1fYWRkbWFwKGRldiwgbW1pb19iYXNlLCBTQVZBR0VfTU1JT19TSVpFLCBfRFJNX1JFR0lTVEVSUywKKwkJCSBfRFJNX1JFQURfT05MWSwgJmRldl9wcml2LT5tbWlvKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZHJtX2FkZG1hcChkZXYsIGZiX2Jhc2UsIGZiX3NpemUsIF9EUk1fRlJBTUVfQlVGRkVSLAorCQkJIF9EUk1fV1JJVEVfQ09NQklOSU5HLCAmZGV2X3ByaXYtPmZiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZHJtX2FkZG1hcChkZXYsIGFwZXJ0dXJlX2Jhc2UsIFNBVkFHRV9BUEVSVFVSRV9TSVpFLAorCQkJIF9EUk1fRlJBTUVfQlVGRkVSLCBfRFJNX1dSSVRFX0NPTUJJTklORywKKwkJCSAmZGV2X3ByaXYtPmFwZXJ0dXJlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIERlbGV0ZSBNVFJScyBhbmQgZnJlZSBkZXZpY2UtcHJpdmF0ZSBkYXRhLgorICovCitpbnQgc2F2YWdlX3Bvc3RjbGVhbnVwKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKQorCQlpZiAoZGV2X3ByaXYtPm10cnJbaV0uaGFuZGxlID49IDApCisJCQltdHJyX2RlbChkZXZfcHJpdi0+bXRycltpXS5oYW5kbGUsCisJCQkJIGRldl9wcml2LT5tdHJyW2ldLmJhc2UsCisJCQkJIGRldl9wcml2LT5tdHJyW2ldLnNpemUpOworCisJZHJtX2ZyZWUoZGV2X3ByaXYsIHNpemVvZihkcm1fc2F2YWdlX3ByaXZhdGVfdCksIERSTV9NRU1fRFJJVkVSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhdmFnZV9kb19pbml0X2JjaShkcm1fZGV2aWNlX3QgKmRldiwgZHJtX3NhdmFnZV9pbml0X3QgKmluaXQpCit7CisJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChpbml0LT5mYl9icHAgIT0gMTYgJiYgaW5pdC0+ZmJfYnBwICE9IDMyKSB7CisJCURSTV9FUlJPUigiaW52YWxpZCBmcmFtZSBidWZmZXIgYnBwICVkIVxuIiwgaW5pdC0+ZmJfYnBwKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKGluaXQtPmRlcHRoX2JwcCAhPSAxNiAmJiBpbml0LT5kZXB0aF9icHAgIT0gMzIpIHsKKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGRlcHRoIGJ1ZmZlciBicHAgJWQhXG4iLCBpbml0LT5mYl9icHApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoaW5pdC0+ZG1hX3R5cGUgIT0gU0FWQUdFX0RNQV9BR1AgJiYKKwkgICAgaW5pdC0+ZG1hX3R5cGUgIT0gU0FWQUdFX0RNQV9QQ0kpIHsKKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGRtYSBtZW1vcnkgdHlwZSAlZCFcbiIsIGluaXQtPmRtYV90eXBlKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlkZXZfcHJpdi0+Y29iX3NpemUgPSBpbml0LT5jb2Jfc2l6ZTsKKwlkZXZfcHJpdi0+YmNpX3RocmVzaG9sZF9sbyA9IGluaXQtPmJjaV90aHJlc2hvbGRfbG87CisJZGV2X3ByaXYtPmJjaV90aHJlc2hvbGRfaGkgPSBpbml0LT5iY2lfdGhyZXNob2xkX2hpOworCWRldl9wcml2LT5kbWFfdHlwZSA9IGluaXQtPmRtYV90eXBlOworCisJZGV2X3ByaXYtPmZiX2JwcCA9IGluaXQtPmZiX2JwcDsKKwlkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ID0gaW5pdC0+ZnJvbnRfb2Zmc2V0OworCWRldl9wcml2LT5mcm9udF9waXRjaCA9IGluaXQtPmZyb250X3BpdGNoOworCWRldl9wcml2LT5iYWNrX29mZnNldCA9IGluaXQtPmJhY2tfb2Zmc2V0OworCWRldl9wcml2LT5iYWNrX3BpdGNoID0gaW5pdC0+YmFja19waXRjaDsKKwlkZXZfcHJpdi0+ZGVwdGhfYnBwID0gaW5pdC0+ZGVwdGhfYnBwOworCWRldl9wcml2LT5kZXB0aF9vZmZzZXQgPSBpbml0LT5kZXB0aF9vZmZzZXQ7CisJZGV2X3ByaXYtPmRlcHRoX3BpdGNoID0gaW5pdC0+ZGVwdGhfcGl0Y2g7CisKKwlkZXZfcHJpdi0+dGV4dHVyZV9vZmZzZXQgPSBpbml0LT50ZXh0dXJlX29mZnNldDsKKwlkZXZfcHJpdi0+dGV4dHVyZV9zaXplID0gaW5pdC0+dGV4dHVyZV9zaXplOworCisJRFJNX0dFVFNBUkVBKCk7CisJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBzYXJlYSFcbiIpOworCQlzYXZhZ2VfZG9fY2xlYW51cF9iY2koZGV2KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKGluaXQtPnN0YXR1c19vZmZzZXQgIT0gMCkgeworCQlkZXZfcHJpdi0+c3RhdHVzID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPnN0YXR1c19vZmZzZXQpOworCQlpZiAoIWRldl9wcml2LT5zdGF0dXMpIHsKKwkJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgc2hhZG93IHN0YXR1cyByZWdpb24hXG4iKTsKKwkJCXNhdmFnZV9kb19jbGVhbnVwX2JjaShkZXYpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9wcml2LT5zdGF0dXMgPSBOVUxMOworCX0KKwlpZiAoZGV2X3ByaXYtPmRtYV90eXBlID09IFNBVkFHRV9ETUFfQUdQICYmIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KSB7CisJCWRldi0+YWdwX2J1ZmZlcl9tYXAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwKKwkJCQkJCSAgICAgICBpbml0LT5idWZmZXJzX29mZnNldCk7CisJCWlmICghZGV2LT5hZ3BfYnVmZmVyX21hcCkgeworCQkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBETUEgYnVmZmVyIHJlZ2lvbiFcbiIpOworCQkJc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRldik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJCWRybV9jb3JlX2lvcmVtYXAoZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2KTsKKwkJaWYgKCFkZXYtPmFncF9idWZmZXJfbWFwKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBpb3JlbWFwIERNQSBidWZmZXIgcmVnaW9uIVxuIik7CisJCQlzYXZhZ2VfZG9fY2xlYW51cF9iY2koZGV2KTsKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCX0KKwl9CisJaWYgKGluaXQtPmFncF90ZXh0dXJlc19vZmZzZXQpIHsKKwkJZGV2X3ByaXYtPmFncF90ZXh0dXJlcyA9CisJCQlkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+YWdwX3RleHR1cmVzX29mZnNldCk7CisJCWlmICghZGV2X3ByaXYtPmFncF90ZXh0dXJlcykgeworCQkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBhZ3AgdGV4dHVyZSByZWdpb24hXG4iKTsKKwkJCXNhdmFnZV9kb19jbGVhbnVwX2JjaShkZXYpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9wcml2LT5hZ3BfdGV4dHVyZXMgPSBOVUxMOworCX0KKworCWlmIChpbml0LT5jbWRfZG1hX29mZnNldCkgeworCQlpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSkgeworCQkJRFJNX0VSUk9SKCJjb21tYW5kIERNQSBub3Qgc3VwcG9ydGVkIG9uICIKKwkJCQkgICJTYXZhZ2UzRC9NWC9JWC5cbiIpOworCQkJc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRldik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJCWlmIChkZXYtPmRtYSAmJiBkZXYtPmRtYS0+YnVmbGlzdCkgeworCQkJRFJNX0VSUk9SKCJjb21tYW5kIGFuZCB2ZXJ0ZXggRE1BIG5vdCBzdXBwb3J0ZWQgIgorCQkJCSAgImF0IHRoZSBzYW1lIHRpbWUuXG4iKTsKKwkJCXNhdmFnZV9kb19jbGVhbnVwX2JjaShkZXYpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQlkZXZfcHJpdi0+Y21kX2RtYSA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5jbWRfZG1hX29mZnNldCk7CisJCWlmICghZGV2X3ByaXYtPmNtZF9kbWEpIHsKKwkJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgY29tbWFuZCBETUEgcmVnaW9uIVxuIik7CisJCQlzYXZhZ2VfZG9fY2xlYW51cF9iY2koZGV2KTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwkJaWYgKGRldl9wcml2LT5kbWFfdHlwZSA9PSBTQVZBR0VfRE1BX0FHUCkgeworCQkJaWYgKGRldl9wcml2LT5jbWRfZG1hLT50eXBlICE9IF9EUk1fQUdQKSB7CisJCQkJRFJNX0VSUk9SKCJBR1AgY29tbWFuZCBETUEgcmVnaW9uIGlzIG5vdCBhICIKKwkJCQkJICAiX0RSTV9BR1AgbWFwIVxuIik7CisJCQkJc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRldik7CisJCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJCX0KKwkJCWRybV9jb3JlX2lvcmVtYXAoZGV2X3ByaXYtPmNtZF9kbWEsIGRldik7CisJCQlpZiAoIWRldl9wcml2LT5jbWRfZG1hLT5oYW5kbGUpIHsKKwkJCQlEUk1fRVJST1IoImZhaWxlZCB0byBpb3JlbWFwIGNvbW1hbmQgIgorCQkJCQkgICJETUEgcmVnaW9uIVxuIik7CisJCQkJc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRldik7CisJCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChkZXZfcHJpdi0+Y21kX2RtYS0+dHlwZSAhPSBfRFJNX0NPTlNJU1RFTlQpIHsKKwkJCURSTV9FUlJPUigiUENJIGNvbW1hbmQgRE1BIHJlZ2lvbiBpcyBub3QgYSAiCisJCQkJICAiX0RSTV9DT05TSVNURU5UIG1hcCFcbiIpOworCQkJc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRldik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X3ByaXYtPmNtZF9kbWEgPSBOVUxMOworCX0KKworCWRldl9wcml2LT5kbWFfZmx1c2ggPSBzYXZhZ2VfZG1hX2ZsdXNoOworCWlmICghZGV2X3ByaXYtPmNtZF9kbWEpIHsKKwkJRFJNX0RFQlVHKCJmYWxsaW5nIGJhY2sgdG8gZmFrZWQgY29tbWFuZCBETUEuXG4iKTsKKwkJZGV2X3ByaXYtPmZha2VfZG1hLm9mZnNldCA9IDA7CisJCWRldl9wcml2LT5mYWtlX2RtYS5zaXplID0gU0FWQUdFX0ZBS0VfRE1BX1NJWkU7CisJCWRldl9wcml2LT5mYWtlX2RtYS50eXBlID0gX0RSTV9TSE07CisJCWRldl9wcml2LT5mYWtlX2RtYS5oYW5kbGUgPSBkcm1fYWxsb2MoU0FWQUdFX0ZBS0VfRE1BX1NJWkUsCisJCQkJCQkgICAgICBEUk1fTUVNX0RSSVZFUik7CisJCWlmICghZGV2X3ByaXYtPmZha2VfZG1hLmhhbmRsZSkgeworCQkJRFJNX0VSUk9SKCJjb3VsZCBub3QgYWxsb2NhdGUgZmFrZWQgRE1BIGJ1ZmZlciFcbiIpOworCQkJc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRldik7CisJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCQl9CisJCWRldl9wcml2LT5jbWRfZG1hID0gJmRldl9wcml2LT5mYWtlX2RtYTsKKwkJZGV2X3ByaXYtPmRtYV9mbHVzaCA9IHNhdmFnZV9mYWtlX2RtYV9mbHVzaDsKKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdiA9CisJCShkcm1fc2F2YWdlX3NhcmVhX3QgKikoKHVpbnQ4X3QgKilkZXZfcHJpdi0+c2FyZWEtPmhhbmRsZSArCisJCQkJICAgICAgIGluaXQtPnNhcmVhX3ByaXZfb2Zmc2V0KTsKKworCS8qIHNldHVwIGJpdG1hcCBkZXNjcmlwdG9ycyAqLworCXsKKwkJdW5zaWduZWQgaW50IGNvbG9yX3RpbGVfZm9ybWF0OworCQl1bnNpZ25lZCBpbnQgZGVwdGhfdGlsZV9mb3JtYXQ7CisJCXVuc2lnbmVkIGludCBmcm9udF9zdHJpZGUsIGJhY2tfc3RyaWRlLCBkZXB0aF9zdHJpZGU7CisJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8PSBTM19TQVZBR0U0KSB7CisJCQljb2xvcl90aWxlX2Zvcm1hdCA9IGRldl9wcml2LT5mYl9icHAgPT0gMTYgPworCQkJCVNBVkFHRV9CRF9USUxFXzE2QlBQIDogU0FWQUdFX0JEX1RJTEVfMzJCUFA7CisJCQlkZXB0aF90aWxlX2Zvcm1hdCA9IGRldl9wcml2LT5kZXB0aF9icHAgPT0gMTYgPworCQkJCVNBVkFHRV9CRF9USUxFXzE2QlBQIDogU0FWQUdFX0JEX1RJTEVfMzJCUFA7CisJCX0gZWxzZSB7CisJCQljb2xvcl90aWxlX2Zvcm1hdCA9IFNBVkFHRV9CRF9USUxFX0RFU1Q7CisJCQlkZXB0aF90aWxlX2Zvcm1hdCA9IFNBVkFHRV9CRF9USUxFX0RFU1Q7CisJCX0KKwkJZnJvbnRfc3RyaWRlID0gZGV2X3ByaXYtPmZyb250X3BpdGNoIC8gKGRldl9wcml2LT5mYl9icHAvOCk7CisJCWJhY2tfc3RyaWRlICA9IGRldl9wcml2LT4gYmFja19waXRjaCAvIChkZXZfcHJpdi0+ZmJfYnBwLzgpOworCQlkZXB0aF9zdHJpZGUgPSBkZXZfcHJpdi0+ZGVwdGhfcGl0Y2ggLyAoZGV2X3ByaXYtPmRlcHRoX2JwcC84KTsKKworCQlkZXZfcHJpdi0+ZnJvbnRfYmQgPSBmcm9udF9zdHJpZGUgfCBTQVZBR0VfQkRfQldfRElTQUJMRSB8CisJCQkoZGV2X3ByaXYtPmZiX2JwcCA8PCBTQVZBR0VfQkRfQlBQX1NISUZUKSB8CisJCQkoY29sb3JfdGlsZV9mb3JtYXQgPDwgU0FWQUdFX0JEX1RJTEVfU0hJRlQpOworCisJCWRldl9wcml2LT4gYmFja19iZCA9ICBiYWNrX3N0cmlkZSB8IFNBVkFHRV9CRF9CV19ESVNBQkxFIHwKKwkJCShkZXZfcHJpdi0+ZmJfYnBwIDw8IFNBVkFHRV9CRF9CUFBfU0hJRlQpIHwKKwkJCShjb2xvcl90aWxlX2Zvcm1hdCA8PCBTQVZBR0VfQkRfVElMRV9TSElGVCk7CisKKwkJZGV2X3ByaXYtPmRlcHRoX2JkID0gZGVwdGhfc3RyaWRlIHwgU0FWQUdFX0JEX0JXX0RJU0FCTEUgfAorCQkJKGRldl9wcml2LT5kZXB0aF9icHAgPDwgU0FWQUdFX0JEX0JQUF9TSElGVCkgfAorCQkJKGRlcHRoX3RpbGVfZm9ybWF0IDw8IFNBVkFHRV9CRF9USUxFX1NISUZUKTsKKwl9CisKKwkvKiBzZXR1cCBzdGF0dXMgYW5kIGJjaSBwdHIgKi8KKwlkZXZfcHJpdi0+ZXZlbnRfY291bnRlciA9IDA7CisJZGV2X3ByaXYtPmV2ZW50X3dyYXAgPSAwOworCWRldl9wcml2LT5iY2lfcHRyID0gKHZvbGF0aWxlIHVpbnQzMl90ICopCisJICAgICgodWludDhfdCAqKWRldl9wcml2LT5tbWlvLT5oYW5kbGUgKyBTQVZBR0VfQkNJX09GRlNFVCk7CisJaWYgKFMzX1NBVkFHRTNEX1NFUklFUyhkZXZfcHJpdi0+Y2hpcHNldCkpIHsKKwkJZGV2X3ByaXYtPnN0YXR1c191c2VkX21hc2sgPSBTQVZBR0VfRklGT19VU0VEX01BU0tfUzNEOworCX0gZWxzZSB7CisJCWRldl9wcml2LT5zdGF0dXNfdXNlZF9tYXNrID0gU0FWQUdFX0ZJRk9fVVNFRF9NQVNLX1M0OworCX0KKwlpZiAoZGV2X3ByaXYtPnN0YXR1cyAhPSBOVUxMKSB7CisJCWRldl9wcml2LT5zdGF0dXNfcHRyID0KKwkJCSh2b2xhdGlsZSB1aW50MzJfdCAqKWRldl9wcml2LT5zdGF0dXMtPmhhbmRsZTsKKwkJZGV2X3ByaXYtPndhaXRfZmlmbyA9IHNhdmFnZV9iY2lfd2FpdF9maWZvX3NoYWRvdzsKKwkJZGV2X3ByaXYtPndhaXRfZXZudCA9IHNhdmFnZV9iY2lfd2FpdF9ldmVudF9zaGFkb3c7CisJCWRldl9wcml2LT5zdGF0dXNfcHRyWzEwMjNdID0gZGV2X3ByaXYtPmV2ZW50X2NvdW50ZXI7CisJfSBlbHNlIHsKKwkJZGV2X3ByaXYtPnN0YXR1c19wdHIgPSBOVUxMOworCQlpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSkgeworCQkJZGV2X3ByaXYtPndhaXRfZmlmbyA9IHNhdmFnZV9iY2lfd2FpdF9maWZvX3MzZDsKKwkJfSBlbHNlIHsKKwkJCWRldl9wcml2LT53YWl0X2ZpZm8gPSBzYXZhZ2VfYmNpX3dhaXRfZmlmb19zNDsKKwkJfQorCQlkZXZfcHJpdi0+d2FpdF9ldm50ID0gc2F2YWdlX2JjaV93YWl0X2V2ZW50X3JlZzsKKwl9CisKKwkvKiBjbGlwcmVjdCBmdW5jdGlvbnMgKi8KKwlpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSkKKwkJZGV2X3ByaXYtPmVtaXRfY2xpcF9yZWN0ID0gc2F2YWdlX2VtaXRfY2xpcF9yZWN0X3MzZDsKKwllbHNlCisJCWRldl9wcml2LT5lbWl0X2NsaXBfcmVjdCA9IHNhdmFnZV9lbWl0X2NsaXBfcmVjdF9zNDsKKworCWlmIChzYXZhZ2VfZnJlZWxpc3RfaW5pdChkZXYpIDwgMCkgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBpbml0aWFsaXplIGZyZWVsaXN0XG4iKTsKKwkJc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCisJaWYgKHNhdmFnZV9kbWFfaW5pdChkZXZfcHJpdikgPCAgMCkgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBpbml0aWFsaXplIGNvbW1hbmQgRE1BXG4iKTsKKwkJc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBzYXZhZ2VfZG9fY2xlYW51cF9iY2koZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+Y21kX2RtYSA9PSAmZGV2X3ByaXYtPmZha2VfZG1hKSB7CisJCWlmIChkZXZfcHJpdi0+ZmFrZV9kbWEuaGFuZGxlKQorCQkJZHJtX2ZyZWUoZGV2X3ByaXYtPmZha2VfZG1hLmhhbmRsZSwKKwkJCQkgU0FWQUdFX0ZBS0VfRE1BX1NJWkUsIERSTV9NRU1fRFJJVkVSKTsKKwl9IGVsc2UgaWYgKGRldl9wcml2LT5jbWRfZG1hICYmIGRldl9wcml2LT5jbWRfZG1hLT5oYW5kbGUgJiYKKwkJICAgZGV2X3ByaXYtPmNtZF9kbWEtPnR5cGUgPT0gX0RSTV9BR1AgJiYKKwkJICAgZGV2X3ByaXYtPmRtYV90eXBlID09IFNBVkFHRV9ETUFfQUdQKQorCQlkcm1fY29yZV9pb3JlbWFwZnJlZShkZXZfcHJpdi0+Y21kX2RtYSwgZGV2KTsKKworCWlmIChkZXZfcHJpdi0+ZG1hX3R5cGUgPT0gU0FWQUdFX0RNQV9BR1AgJiYKKwkgICAgZGV2LT5hZ3BfYnVmZmVyX21hcCAmJiBkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUpIHsKKwkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2KTsKKwkJLyogbWFrZSBzdXJlIHRoZSBuZXh0IGluc3RhbmNlICh3aGljaCBtYXkgYmUgcnVubmluZworCQkgKiBpbiBQQ0kgbW9kZSkgZG9lc24ndCB0cnkgdG8gdXNlIGFuIG9sZAorCQkgKiBhZ3BfYnVmZmVyX21hcC4gKi8KKwkJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IE5VTEw7CisJfQorCisJaWYgKGRldl9wcml2LT5kbWFfcGFnZXMpCisJCWRybV9mcmVlKGRldl9wcml2LT5kbWFfcGFnZXMsCisJCQkgc2l6ZW9mKGRybV9zYXZhZ2VfZG1hX3BhZ2VfdCkqZGV2X3ByaXYtPm5yX2RtYV9wYWdlcywKKwkJCSBEUk1fTUVNX0RSSVZFUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYXZhZ2VfYmNpX2luaXQoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1fc2F2YWdlX2luaXRfdCBpbml0OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoaW5pdCwgKGRybV9zYXZhZ2VfaW5pdF90IF9fdXNlciAqKWRhdGEsCisJCQkJIHNpemVvZihpbml0KSk7CisKKwlzd2l0Y2ggKGluaXQuZnVuYykgeworCWNhc2UgU0FWQUdFX0lOSVRfQkNJOgorCQlyZXR1cm4gc2F2YWdlX2RvX2luaXRfYmNpKGRldiwgJmluaXQpOworCWNhc2UgU0FWQUdFX0NMRUFOVVBfQkNJOgorCQlyZXR1cm4gc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRldik7CisJfQorCisJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKK30KKworc3RhdGljIGludCBzYXZhZ2VfYmNpX2V2ZW50X2VtaXQoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9zYXZhZ2VfZXZlbnRfZW1pdF90IGV2ZW50OworCisJRFJNX0RFQlVHKCJcbiIpOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZXZlbnQsIChkcm1fc2F2YWdlX2V2ZW50X2VtaXRfdCBfX3VzZXIgKilkYXRhLAorCQkJCSBzaXplb2YoZXZlbnQpKTsKKworCWV2ZW50LmNvdW50ID0gc2F2YWdlX2JjaV9lbWl0X2V2ZW50KGRldl9wcml2LCBldmVudC5mbGFncyk7CisJZXZlbnQuY291bnQgfD0gZGV2X3ByaXYtPmV2ZW50X3dyYXAgPDwgMTY7CisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCgmKChkcm1fc2F2YWdlX2V2ZW50X2VtaXRfdCBfX3VzZXIgKilkYXRhKS0+Y291bnQsCisJCQkgICAgICAgZXZlbnQuY291bnQsIHNpemVvZihldmVudC5jb3VudCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhdmFnZV9iY2lfZXZlbnRfd2FpdChEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3NhdmFnZV9ldmVudF93YWl0X3QgZXZlbnQ7CisJdW5zaWduZWQgaW50IGV2ZW50X2UsIGh3X2U7CisJdW5zaWduZWQgaW50IGV2ZW50X3csIGh3X3c7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZXZlbnQsIChkcm1fc2F2YWdlX2V2ZW50X3dhaXRfdCBfX3VzZXIgKilkYXRhLAorCQkJCSBzaXplb2YoZXZlbnQpKTsKKworCVVQREFURV9FVkVOVF9DT1VOVEVSKCk7CisJaWYgKGRldl9wcml2LT5zdGF0dXNfcHRyKQorCQlod19lID0gZGV2X3ByaXYtPnN0YXR1c19wdHJbMV0gJiAweGZmZmY7CisJZWxzZQorCQlod19lID0gU0FWQUdFX1JFQUQoU0FWQUdFX1NUQVRVU19XT1JEMSkgJiAweGZmZmY7CisJaHdfdyA9IGRldl9wcml2LT5ldmVudF93cmFwOworCWlmIChod19lID4gZGV2X3ByaXYtPmV2ZW50X2NvdW50ZXIpCisJCWh3X3ctLTsgLyogaGFyZHdhcmUgaGFzbid0IHBhc3NlZCB0aGUgbGFzdCB3cmFwIHlldCAqLworCisJZXZlbnRfZSA9IGV2ZW50LmNvdW50ICYgMHhmZmZmOworCWV2ZW50X3cgPSBldmVudC5jb3VudCA+PiAxNjsKKworCS8qIERvbid0IG5lZWQgdG8gd2FpdCBpZgorCSAqIC0gZXZlbnQgY291bnRlciB3cmFwcGVkIHNpbmNlIHRoZSBldmVudCB3YXMgZW1pdHRlZCBvcgorCSAqIC0gdGhlIGhhcmR3YXJlIGhhcyBhZHZhbmNlZCB1cCB0byBvciBvdmVyIHRoZSBldmVudCB0byB3YWl0IGZvci4KKwkgKi8KKwlpZiAoZXZlbnRfdyA8IGh3X3cgfHwgKGV2ZW50X3cgPT0gaHdfdyAmJiBldmVudF9lIDw9IGh3X2UpICkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gZGV2X3ByaXYtPndhaXRfZXZudChkZXZfcHJpdiwgZXZlbnRfZSk7Cit9CisKKy8qCisgKiBETUEgYnVmZmVyIG1hbmFnZW1lbnQKKyAqLworCitzdGF0aWMgaW50IHNhdmFnZV9iY2lfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2RtYV90ICpkKQoreworCWRybV9idWZfdCAqYnVmOworCWludCBpOworCisJZm9yIChpID0gZC0+Z3JhbnRlZF9jb3VudDsgaSA8IGQtPnJlcXVlc3RfY291bnQ7IGkrKykgeworCQlidWYgPSBzYXZhZ2VfZnJlZWxpc3RfZ2V0KGRldik7CisJCWlmICghYnVmKQorCQkJcmV0dXJuIERSTV9FUlIoRUFHQUlOKTsKKworCQlidWYtPmZpbHAgPSBmaWxwOworCisJCWlmIChEUk1fQ09QWV9UT19VU0VSKCZkLT5yZXF1ZXN0X2luZGljZXNbaV0sCisJCQkJICAgICAmYnVmLT5pZHgsIHNpemVvZihidWYtPmlkeCkpKQorCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJaWYgKERSTV9DT1BZX1RPX1VTRVIoJmQtPnJlcXVlc3Rfc2l6ZXNbaV0sCisJCQkJICAgICAmYnVmLT50b3RhbCwgc2l6ZW9mKGJ1Zi0+dG90YWwpKSkKKwkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwkJZC0+Z3JhbnRlZF9jb3VudCsrOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHNhdmFnZV9iY2lfYnVmZmVycyhEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9kbWFfdCBkOworCWludCByZXQgPSAwOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZCwgKGRybV9kbWFfdCBfX3VzZXIgKilkYXRhLCBzaXplb2YoZCkpOworCisJLyogUGxlYXNlIGRvbid0IHNlbmQgdXMgYnVmZmVycy4KKwkgKi8KKwlpZiAoZC5zZW5kX2NvdW50ICE9IDApIHsKKwkJRFJNX0VSUk9SKCJQcm9jZXNzICVkIHRyeWluZyB0byBzZW5kICVkIGJ1ZmZlcnMgdmlhIGRybURNQVxuIiwKKwkJCSAgRFJNX0NVUlJFTlRQSUQsIGQuc2VuZF9jb3VudCk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJLyogV2UnbGwgc2VuZCB5b3UgYnVmZmVycy4KKwkgKi8KKwlpZiAoZC5yZXF1ZXN0X2NvdW50IDwgMCB8fCBkLnJlcXVlc3RfY291bnQgPiBkbWEtPmJ1Zl9jb3VudCkgeworCQlEUk1fRVJST1IoIlByb2Nlc3MgJWQgdHJ5aW5nIHRvIGdldCAlZCBidWZmZXJzIChvZiAlZCBtYXgpXG4iLAorCQkJICBEUk1fQ1VSUkVOVFBJRCwgZC5yZXF1ZXN0X2NvdW50LCBkbWEtPmJ1Zl9jb3VudCk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZC5ncmFudGVkX2NvdW50ID0gMDsKKworCWlmIChkLnJlcXVlc3RfY291bnQpIHsKKwkJcmV0ID0gc2F2YWdlX2JjaV9nZXRfYnVmZmVycyhmaWxwLCBkZXYsICZkKTsKKwl9CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChkcm1fZG1hX3QgX191c2VyICopZGF0YSwgZCwgc2l6ZW9mKGQpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgc2F2YWdlX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKSB7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKworCWlmICghZG1hKQorCQlyZXR1cm47CisJaWYgKCFkZXZfcHJpdikKKwkJcmV0dXJuOworCWlmICghZG1hLT5idWZsaXN0KQorCQlyZXR1cm47CisKKwkvKmk4MzBfZmx1c2hfcXVldWUoZGV2KTsqLworCisJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCWRybV9zYXZhZ2VfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJCWlmIChidWYtPmZpbHAgPT0gZmlscCAmJiBidWZfcHJpdiAmJgorCQkgICAgYnVmX3ByaXYtPm5leHQgPT0gTlVMTCAmJiBidWZfcHJpdi0+cHJldiA9PSBOVUxMKSB7CisJCQl1aW50MTZfdCBldmVudDsKKwkJCURSTV9ERUJVRygicmVjbGFpbWVkIGZyb20gY2xpZW50XG4iKTsKKwkJCWV2ZW50ID0gc2F2YWdlX2JjaV9lbWl0X2V2ZW50KGRldl9wcml2LCBTQVZBR0VfV0FJVF8zRCk7CisJCQlTRVRfQUdFKCZidWZfcHJpdi0+YWdlLCBldmVudCwgZGV2X3ByaXYtPmV2ZW50X3dyYXApOworCQkJc2F2YWdlX2ZyZWVsaXN0X3B1dChkZXYsIGJ1Zik7CisJCX0KKwl9CisKKwlkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMoZGV2LCBmaWxwKTsKK30KKworCitkcm1faW9jdGxfZGVzY190IHNhdmFnZV9pb2N0bHNbXSA9IHsKKwlbRFJNX0lPQ1RMX05SKERSTV9TQVZBR0VfQkNJX0lOSVQpXSA9IHtzYXZhZ2VfYmNpX2luaXQsIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NBVkFHRV9CQ0lfQ01EQlVGKV0gPSB7c2F2YWdlX2JjaV9jbWRidWYsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NBVkFHRV9CQ0lfRVZFTlRfRU1JVCldID0ge3NhdmFnZV9iY2lfZXZlbnRfZW1pdCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0FWQUdFX0JDSV9FVkVOVF9XQUlUKV0gPSB7c2F2YWdlX2JjaV9ldmVudF93YWl0LCAxLCAwfSwKK307CisKK2ludCBzYXZhZ2VfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoc2F2YWdlX2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjZjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcm0uaApAQCAtMCwwICsxLDIwOSBAQAorLyogc2F2YWdlX2RybS5oIC0tIFB1YmxpYyBoZWFkZXIgZm9yIHRoZSBzYXZhZ2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDQgIEZlbGl4IEt1ZWhsaW5nCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgRkVMSVggS1VFSExJTkcgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YKKyAqIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX1NBVkFHRV9EUk1fSF9fCisjZGVmaW5lIF9fU0FWQUdFX0RSTV9IX18KKworI2lmbmRlZiBfX1NBVkFHRV9TQVJFQV9ERUZJTkVTX18KKyNkZWZpbmUgX19TQVZBR0VfU0FSRUFfREVGSU5FU19fCisKKy8qIDIgaGVhcHMgKDEgZm9yIGNhcmQsIDEgZm9yIGFncCksIGVhY2ggZGl2aWRlZCBpbnRvIHVwdG8gMTI4CisgKiByZWdpb25zLCBzdWJqZWN0IHRvIGEgbWluaW11bSByZWdpb24gc2l6ZSBvZiAoMTw8MTYpID09IDY0ay4KKyAqCisgKiBDbGllbnRzIG1heSBzdWJkaXZpZGUgcmVnaW9ucyBpbnRlcm5hbGx5LCBidXQgd2hlbiBzaGFyaW5nIGJldHdlZW4KKyAqIGNsaWVudHMsIHRoZSByZWdpb24gc2l6ZSBpcyB0aGUgbWluaW11bSBncmFudWxhcml0eS4KKyAqLworCisjZGVmaW5lIFNBVkFHRV9DQVJEX0hFQVAJCTAKKyNkZWZpbmUgU0FWQUdFX0FHUF9IRUFQCQkJMQorI2RlZmluZSBTQVZBR0VfTlJfVEVYX0hFQVBTCQkyCisjZGVmaW5lIFNBVkFHRV9OUl9URVhfUkVHSU9OUwkJMTYKKyNkZWZpbmUgU0FWQUdFX0xPR19NSU5fVEVYX1JFR0lPTl9TSVpFCTE2CisKKyNlbmRpZiAvKiBfX1NBVkFHRV9TQVJFQV9ERUZJTkVTX18gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9zYXZhZ2Vfc2FyZWEgeworCS8qIExSVSBsaXN0cyBmb3IgdGV4dHVyZSBtZW1vcnkgaW4gYWdwIHNwYWNlIGFuZCBvbiB0aGUgY2FyZC4KKwkgKi8KKwlkcm1fdGV4X3JlZ2lvbl90IHRleExpc3RbU0FWQUdFX05SX1RFWF9IRUFQU11bU0FWQUdFX05SX1RFWF9SRUdJT05TKzFdOworCXVuc2lnbmVkIGludCB0ZXhBZ2VbU0FWQUdFX05SX1RFWF9IRUFQU107CisKKwkvKiBNZWNoYW5pc20gdG8gdmFsaWRhdGUgY2FyZCBzdGF0ZS4KKwkgKi8KKwlpbnQgY3R4T3duZXI7Cit9IGRybV9zYXZhZ2Vfc2FyZWFfdCwgKmRybV9zYXZhZ2Vfc2FyZWFfcHRyOworCisvKiBTYXZhZ2Utc3BlY2lmaWMgaW9jdGxzCisgKi8KKyNkZWZpbmUgRFJNX1NBVkFHRV9CQ0lfSU5JVAkJMHgwMAorI2RlZmluZSBEUk1fU0FWQUdFX0JDSV9DTURCVUYgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRFJNX1NBVkFHRV9CQ0lfRVZFTlRfRU1JVAkweDAyCisjZGVmaW5lIERSTV9TQVZBR0VfQkNJX0VWRU5UX1dBSVQJMHgwMworCisjZGVmaW5lIERSTV9JT0NUTF9TQVZBR0VfSU5JVAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TQVZBR0VfQkNJX0lOSVQsIGRybV9zYXZhZ2VfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfU0FWQUdFX0NNREJVRgkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TQVZBR0VfQkNJX0NNREJVRiwgZHJtX3NhdmFnZV9jbWRidWZfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NBVkFHRV9FVkVOVF9FTUlUCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0FWQUdFX0JDSV9FVkVOVF9FTUlULCBkcm1fc2F2YWdlX2V2ZW50X2VtaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NBVkFHRV9FVkVOVF9XQUlUCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0FWQUdFX0JDSV9FVkVOVF9XQUlULCBkcm1fc2F2YWdlX2V2ZW50X3dhaXRfdCkKKworI2RlZmluZSBTQVZBR0VfRE1BX1BDSQkxCisjZGVmaW5lIFNBVkFHRV9ETUFfQUdQCTMKK3R5cGVkZWYgc3RydWN0IGRybV9zYXZhZ2VfaW5pdCB7CisJZW51bSB7CisJCVNBVkFHRV9JTklUX0JDSSA9IDEsCisJCVNBVkFHRV9DTEVBTlVQX0JDSSA9IDIKKwl9IGZ1bmM7CisJdW5zaWduZWQgaW50IHNhcmVhX3ByaXZfb2Zmc2V0OworCisJLyogc29tZSBwYXJhbWV0ZXJzICovCisJdW5zaWduZWQgaW50IGNvYl9zaXplOworCXVuc2lnbmVkIGludCBiY2lfdGhyZXNob2xkX2xvLCBiY2lfdGhyZXNob2xkX2hpOworCXVuc2lnbmVkIGludCBkbWFfdHlwZTsKKworCS8qIGZyYW1lIGJ1ZmZlciBsYXlvdXQgKi8KKwl1bnNpZ25lZCBpbnQgZmJfYnBwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQsIGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldCwgYmFja19waXRjaDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfYnBwOworCXVuc2lnbmVkIGludCBkZXB0aF9vZmZzZXQsIGRlcHRoX3BpdGNoOworCisJLyogbG9jYWwgdGV4dHVyZXMgKi8KKwl1bnNpZ25lZCBpbnQgdGV4dHVyZV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHRleHR1cmVfc2l6ZTsKKworCS8qIHBoeXNpY2FsIGxvY2F0aW9ucyBvZiBub24tcGVybWFuZW50IG1hcHMgKi8KKwl1bnNpZ25lZCBsb25nIHN0YXR1c19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGFncF90ZXh0dXJlc19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBjbWRfZG1hX29mZnNldDsKK30gZHJtX3NhdmFnZV9pbml0X3Q7CisKK3R5cGVkZWYgdW5pb24gZHJtX3NhdmFnZV9jbWRfaGVhZGVyIGRybV9zYXZhZ2VfY21kX2hlYWRlcl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhdmFnZV9jbWRidWYgeworCQkJCS8qIGNvbW1hbmQgYnVmZmVyIGluIGNsaWVudCdzIGFkZHJlc3Mgc3BhY2UgKi8KKwlkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCBfX3VzZXIgKmNtZF9hZGRyOworCXVuc2lnbmVkIGludCBzaXplOwkvKiBzaXplIG9mIHRoZSBjb21tYW5kIGJ1ZmZlciBpbiA2NGJpdCB1bml0cyAqLworCisJdW5zaWduZWQgaW50IGRtYV9pZHg7CS8qIERNQSBidWZmZXIgaW5kZXggdG8gdXNlICovCisJaW50IGRpc2NhcmQ7CQkvKiBkaXNjYXJkIERNQSBidWZmZXIgd2hlbiBkb25lICovCisJCQkJLyogdmVydGV4IGJ1ZmZlciBpbiBjbGllbnQncyBhZGRyZXNzIHNwYWNlICovCisJdW5zaWduZWQgaW50IF9fdXNlciAqdmJfYWRkcjsKKwl1bnNpZ25lZCBpbnQgdmJfc2l6ZTsJLyogc2l6ZSBvZiBjbGllbnQgdmVydGV4IGJ1ZmZlciBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCB2Yl9zdHJpZGU7CS8qIHN0cmlkZSBvZiB2ZXJ0aWNlcyBpbiAzMmJpdCB3b3JkcyAqLworCQkJCS8qIGJveGVzIGluIGNsaWVudCdzIGFkZHJlc3Mgc3BhY2UgKi8KKwlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpib3hfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbmJveDsJLyogbnVtYmVyIG9mIGNsaXBwaW5nIGJveGVzICovCit9IGRybV9zYXZhZ2VfY21kYnVmX3Q7CisKKyNkZWZpbmUgU0FWQUdFX1dBSVRfMkQgIDB4MSAvKiB3YWl0IGZvciAyRCBpZGxlIGJlZm9yZSB1cGRhdGluZyBldmVudCB0YWcgKi8KKyNkZWZpbmUgU0FWQUdFX1dBSVRfM0QgIDB4MiAvKiB3YWl0IGZvciAzRCBpZGxlIGJlZm9yZSB1cGRhdGluZyBldmVudCB0YWcgKi8KKyNkZWZpbmUgU0FWQUdFX1dBSVRfSVJRIDB4NCAvKiBlbWl0IG9yIHdhaXQgZm9yIElSUSwgbm90IGltcGxlbWVudGVkIHlldCAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhdmFnZV9ldmVudCB7CisJdW5zaWduZWQgaW50IGNvdW50OworCXVuc2lnbmVkIGludCBmbGFnczsKK30gZHJtX3NhdmFnZV9ldmVudF9lbWl0X3QsIGRybV9zYXZhZ2VfZXZlbnRfd2FpdF90OworCisvKiBDb21tYW5kcyBmb3IgdGhlIGNtZGJ1ZiBpb2N0bAorICovCisjZGVmaW5lIFNBVkFHRV9DTURfU1RBVEUJMCAgLyogYSByYW5nZSBvZiBzdGF0ZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9ETUFfUFJJTQkxICAvKiB2ZXJ0aWNlcyBmcm9tIERNQSBidWZmZXIgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9WQl9QUklNCTIgIC8qIHZlcnRpY2VzIGZyb20gY2xpZW50IHZlcnRleCBidWZmZXIgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9ETUFfSURYCTMgIC8qIGluZGV4ZWQgdmVydGljZXMgZnJvbSBETUEgYnVmZmVyICovCisjZGVmaW5lIFNBVkFHRV9DTURfVkJfSURYCTQgIC8qIGluZGV4ZWQgdmVydGljZXMgY2xpZW50IHZlcnRleCBidWZmZXIgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9DTEVBUgk1ICAvKiBjbGVhciBidWZmZXJzICovCisjZGVmaW5lIFNBVkFHRV9DTURfU1dBUAkJNiAgLyogc3dhcCBidWZmZXJzICovCisKKy8qIFByaW1pdGl2ZSB0eXBlcworKi8KKyNkZWZpbmUgU0FWQUdFX1BSSU1fVFJJTElTVAkwICAvKiB0cmlhbmdsZSBsaXN0ICovCisjZGVmaW5lIFNBVkFHRV9QUklNX1RSSVNUUklQCTEgIC8qIHRyaWFuZ2xlIHN0cmlwICovCisjZGVmaW5lIFNBVkFHRV9QUklNX1RSSUZBTgkyICAvKiB0cmlhbmdsZSBmYW4gKi8KKyNkZWZpbmUgU0FWQUdFX1BSSU1fVFJJTElTVF8yMDEJMyAgLyogcmVvcmRlciB2ZXJ0cyBmb3IgY29ycmVjdCBmbGF0CisJCQkJICAgICogc2hhZGluZyBvbiBzM2QgKi8KKworLyogU2tpcCBmbGFncyAodmVydGV4IGZvcm1hdCkKKyAqLworI2RlZmluZSBTQVZBR0VfU0tJUF9aCQkweDAxCisjZGVmaW5lIFNBVkFHRV9TS0lQX1cJCTB4MDIKKyNkZWZpbmUgU0FWQUdFX1NLSVBfQzAJCTB4MDQKKyNkZWZpbmUgU0FWQUdFX1NLSVBfQzEJCTB4MDgKKyNkZWZpbmUgU0FWQUdFX1NLSVBfUzAJCTB4MTAKKyNkZWZpbmUgU0FWQUdFX1NLSVBfVDAJCTB4MjAKKyNkZWZpbmUgU0FWQUdFX1NLSVBfU1QwCQkweDMwCisjZGVmaW5lIFNBVkFHRV9TS0lQX1MxCQkweDQwCisjZGVmaW5lIFNBVkFHRV9TS0lQX1QxCQkweDgwCisjZGVmaW5lIFNBVkFHRV9TS0lQX1NUMQkJMHhjMAorI2RlZmluZSBTQVZBR0VfU0tJUF9BTExfUzNECTB4M2YKKyNkZWZpbmUgU0FWQUdFX1NLSVBfQUxMX1M0CTB4ZmYKKworLyogQnVmZmVyIG5hbWVzIGZvciBjbGVhciBjb21tYW5kCisgKi8KKyNkZWZpbmUgU0FWQUdFX0ZST05UCQkweDEKKyNkZWZpbmUgU0FWQUdFX0JBQ0sJCTB4MgorI2RlZmluZSBTQVZBR0VfREVQVEgJCTB4NAorCisvKiA2NC1iaXQgY29tbWFuZCBoZWFkZXIKKyAqLwordW5pb24gZHJtX3NhdmFnZV9jbWRfaGVhZGVyIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZDsJLyogY29tbWFuZCAqLworCQl1bnNpZ25lZCBjaGFyIHBhZDA7CisJCXVuc2lnbmVkIHNob3J0IHBhZDE7CisJCXVuc2lnbmVkIHNob3J0IHBhZDI7CisJCXVuc2lnbmVkIHNob3J0IHBhZDM7CisJfSBjbWQ7IC8qIGdlbmVyaWMgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZDsKKwkJdW5zaWduZWQgY2hhciBnbG9iYWw7CS8qIG5lZWQgaWRsZSBlbmdpbmU/ICovCisJCXVuc2lnbmVkIHNob3J0IGNvdW50OwkvKiBudW1iZXIgb2YgY29uc2VjdXRpdmUgcmVnaXN0ZXJzICovCisJCXVuc2lnbmVkIHNob3J0IHN0YXJ0OwkvKiBmaXJzdCByZWdpc3RlciAqLworCQl1bnNpZ25lZCBzaG9ydCBwYWQzOworCX0gc3RhdGU7IC8qIFNBVkFHRV9DTURfU1RBVEUgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZDsKKwkJdW5zaWduZWQgY2hhciBwcmltOwkvKiBwcmltaXRpdmUgdHlwZSAqLworCQl1bnNpZ25lZCBzaG9ydCBza2lwOwkvKiB2ZXJ0ZXggZm9ybWF0IChza2lwIGZsYWdzKSAqLworCQl1bnNpZ25lZCBzaG9ydCBjb3VudDsJLyogbnVtYmVyIG9mIHZlcnRpY2VzICovCisJCXVuc2lnbmVkIHNob3J0IHN0YXJ0OwkvKiBmaXJzdCB2ZXJ0ZXggaW4gRE1BL3ZlcnRleCBidWZmZXIgKi8KKwl9IHByaW07IC8qIFNBVkFHRV9DTURfRE1BX1BSSU0sIFNBVkFHRV9DTURfVkJfUFJJTSAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kOworCQl1bnNpZ25lZCBjaGFyIHByaW07CisJCXVuc2lnbmVkIHNob3J0IHNraXA7CisJCXVuc2lnbmVkIHNob3J0IGNvdW50OwkvKiBudW1iZXIgb2YgaW5kaWNlcyB0aGF0IGZvbGxvdyAqLworCQl1bnNpZ25lZCBzaG9ydCBwYWQzOworCX0gaWR4OyAvKiBTQVZBR0VfQ01EX0RNQV9JRFgsIFNBVkFHRV9DTURfVkJfSURYICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWQ7CisJCXVuc2lnbmVkIGNoYXIgcGFkMDsKKwkJdW5zaWduZWQgc2hvcnQgcGFkMTsKKwkJdW5zaWduZWQgaW50IGZsYWdzOworCX0gY2xlYXIwOyAvKiBTQVZBR0VfQ01EX0NMRUFSICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IG1hc2s7CisJCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl9IGNsZWFyMTsgLyogU0FWQUdFX0NNRF9DTEVBUiBkYXRhICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4ZDI3MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiBzYXZhZ2VfZHJ2LmMgLS0gU2F2YWdlIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgMjAwNCAgRmVsaXggS3VlaGxpbmcKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBGRUxJWCBLVUVITElORyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRgorICogQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgInNhdmFnZV9kcm0uaCIKKyNpbmNsdWRlICJzYXZhZ2VfZHJ2LmgiCisKKyNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCisKK3N0YXRpYyBpbnQgcG9zdGluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKQoreworCURSTV9JTkZPKCAiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWQ6ICVzXG4iLAorCQlEUklWRVJfTkFNRSwKKwkJRFJJVkVSX01BSk9SLAorCQlEUklWRVJfTUlOT1IsCisJCURSSVZFUl9QQVRDSExFVkVMLAorCQlEUklWRVJfREFURSwKKwkJZGV2LT5wcmltYXJ5Lm1pbm9yLAorCQlwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQorCQkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcnNpb24oIGRybV92ZXJzaW9uX3QgKnZlcnNpb24gKQoreworCWludCBsZW47CisKKwl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOworCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7CisJRFJNX0NPUFkoIHZlcnNpb24tPm5hbWUsIERSSVZFUl9OQU1FICk7CisJRFJNX0NPUFkoIHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFICk7CisJRFJNX0NPUFkoIHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKKwlzYXZhZ2VfUENJX0lEUworfTsKKworZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3Qgc2F2YWdlX2lvY3Rsc1tdOworZXh0ZXJuIGludCBzYXZhZ2VfbWF4X2lvY3RsOworCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0geworCS5kcml2ZXJfZmVhdHVyZXMgPQorCSAgICBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8CisJICAgIERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9QQ0lfRE1BLAorCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9zYXZhZ2VfYnVmX3ByaXZfdCksCisJLnByZWluaXQgPSBzYXZhZ2VfcHJlaW5pdCwKKwkucG9zdGluaXQgPSBwb3N0aW5pdCwKKwkucG9zdGNsZWFudXAgPSBzYXZhZ2VfcG9zdGNsZWFudXAsCisJLnJlY2xhaW1fYnVmZmVycyA9IHNhdmFnZV9yZWNsYWltX2J1ZmZlcnMsCisJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCisJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCisJLnZlcnNpb24gPSB2ZXJzaW9uLAorCS5pb2N0bHMgPSBzYXZhZ2VfaW9jdGxzLAorCS5kbWFfaW9jdGwgPSBzYXZhZ2VfYmNpX2J1ZmZlcnMsCisJLmZvcHMgPSB7CisJCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJCS5vcGVuCSA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwJID0gZHJtX2lvY3RsLAorCQkubW1hcAkgPSBkcm1fbW1hcCwKKwkJLnBvbGwgPSBkcm1fcG9sbCwKKwkJLmZhc3luYyAgPSBkcm1fZmFzeW5jLAorCX0sCisJLnBjaV9kcml2ZXIgPSB7CisJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCisJCS5pZF90YWJsZSAgICAgID0gcGNpaWRsaXN0LAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNhdmFnZV9pbml0KHZvaWQpCit7CisJZHJpdmVyLm51bV9pb2N0bHMgPSBzYXZhZ2VfbWF4X2lvY3RsOworCXJldHVybiBkcm1faW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNhdmFnZV9leGl0KHZvaWQpCit7CisJZHJtX2V4aXQoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNhdmFnZV9pbml0KTsKK21vZHVsZV9leGl0KHNhdmFnZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOworTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1NDM0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5oCkBAIC0wLDAgKzEsNTc5IEBACisvKiBzYXZhZ2VfZHJ2LmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIHRoZSBzYXZhZ2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDQgIEZlbGl4IEt1ZWhsaW5nCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgRkVMSVggS1VFSExJTkcgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YKKyAqIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX1NBVkFHRV9EUlZfSF9fCisjZGVmaW5lIF9fU0FWQUdFX0RSVl9IX18KKworI2RlZmluZSBEUklWRVJfQVVUSE9SCSJGZWxpeCBLdWVobGluZyIKKworI2RlZmluZSBEUklWRVJfTkFNRQkic2F2YWdlIgorI2RlZmluZSBEUklWRVJfREVTQwkiU2F2YWdlM0QvTVgvSVgsIFNhdmFnZTQsIFN1cGVyU2F2YWdlLCBUd2lzdGVyLCBQcm9TYXZhZ2VbRERSXSIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJIjIwMDUwMzEzIgorCisjZGVmaW5lIERSSVZFUl9NQUpPUgkJMgorI2RlZmluZSBEUklWRVJfTUlOT1IJCTQKKyNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMQorLyogSW50ZXJmYWNlIGhpc3Rvcnk6CisgKgorICogMS54ICAgVGhlIERSTSBkcml2ZXIgZnJvbSB0aGUgVklBL1MzIGNvZGUgZHJvcCwgYmFzaWNhbGx5IGEgZHVtbXkKKyAqIDIuMCAgIFRoZSBmaXJzdCByZWFsIERSTQorICogMi4xICAgU2Npc3NvcnMgcmVnaXN0ZXJzIG1hbmFnZWQgYnkgdGhlIERSTSwgM0Qgb3BlcmF0aW9ucyBjbGlwcGVkIGJ5CisgKiAgICAgICBjbGlwcmVjdHMgb2YgdGhlIGNtZGJ1ZiBpb2N0bAorICogMi4yICAgSW1wbGVtZW50ZWQgU0FWQUdFX0NNRF9ETUFfSURYIGFuZCBTQVZBR0VfQ01EX1ZCX0lEWAorICogMi4zICAgRXZlbnQgY291bnRlcnMgdXNlZCBieSBCQ0lfRVZFTlRfRU1JVC9XQUlUIGlvY3RscyBhcmUgbm93IDMyIGJpdHMKKyAqICAgICAgIHdpZGUgYW5kIHRodXMgdmVyeSBsb25nIGxpdmVkICh1bmxpa2VseSB0byBldmVyIHdyYXApLiBUaGUgc2l6ZQorICogICAgICAgaW4gdGhlIHN0cnVjdCB3YXMgMzIgYml0cyBiZWZvcmUsIGJ1dCBvbmx5IDE2IGJpdHMgd2VyZSB1c2VkCisgKiAyLjQgICBJbXBsZW1lbnRlZCBjb21tYW5kIERNQS4gTm93IGRybV9zYXZhZ2VfaW5pdF90LmNtZF9kbWFfb2Zmc2V0IGlzCisgKiAgICAgICBhY3R1YWxseSB1c2VkCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhdmFnZV9hZ2UgeworCXVpbnQxNl90IGV2ZW50OworCXVuc2lnbmVkIGludCB3cmFwOworfSBkcm1fc2F2YWdlX2FnZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fc2F2YWdlX2J1Zl9wcml2IHsKKwlzdHJ1Y3QgZHJtX3NhdmFnZV9idWZfcHJpdiAqbmV4dDsKKwlzdHJ1Y3QgZHJtX3NhdmFnZV9idWZfcHJpdiAqcHJldjsKKwlkcm1fc2F2YWdlX2FnZV90IGFnZTsKKwlkcm1fYnVmX3QgKmJ1ZjsKK30gZHJtX3NhdmFnZV9idWZfcHJpdl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fc2F2YWdlX2RtYV9wYWdlIHsKKwlkcm1fc2F2YWdlX2FnZV90IGFnZTsKKwl1bnNpZ25lZCBpbnQgdXNlZCwgZmx1c2hlZDsKK30gZHJtX3NhdmFnZV9kbWFfcGFnZV90OworI2RlZmluZSBTQVZBR0VfRE1BX1BBR0VfU0laRSAxMDI0IC8qIGluIGR3b3JkcyAqLworLyogRmFrZSBETUEgYnVmZmVyIHNpemUgaW4gYnl0ZXMuIDQgcGFnZXMuIEFsbG93cyBhIG1heGltdW0gY29tbWFuZAorICogc2l6ZSBvZiAxNmtieXRlcyBvciA0ayBlbnRyaWVzLiBNaW5pbXVtIHJlcXVpcmVtZW50IHdvdWxkIGJlCisgKiAxMGtieXRlcyBmb3IgMjU1IDQwLWJ5dGUgdmVydGljZXMgaW4gb25lIGRyYXdpbmcgY29tbWFuZC4gKi8KKyNkZWZpbmUgU0FWQUdFX0ZBS0VfRE1BX1NJWkUgKFNBVkFHRV9ETUFfUEFHRV9TSVpFKjQqNCkKKworLyogaW50ZXJlc3RpbmcgYml0cyBvZiBoYXJkd2FyZSBzdGF0ZSB0aGF0IGFyZSBzYXZlZCBpbiBkZXZfcHJpdiAqLwordHlwZWRlZiB1bmlvbiB7CisJc3RydWN0IGRybV9zYXZhZ2VfY29tbW9uX3N0YXRlIHsKKwkJdWludDMyX3QgdmJhZGRyOworCX0gY29tbW9uOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgcGFkW3NpemVvZihzdHJ1Y3QgZHJtX3NhdmFnZV9jb21tb25fc3RhdGUpXTsKKwkJdWludDMyX3QgdGV4Y3RybCwgdGV4YWRkcjsKKwkJdWludDMyX3Qgc2NzdGFydCwgbmV3X3Njc3RhcnQ7CisJCXVpbnQzMl90IHNjZW5kLCBuZXdfc2NlbmQ7CisJfSBzM2Q7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBwYWRbc2l6ZW9mKHN0cnVjdCBkcm1fc2F2YWdlX2NvbW1vbl9zdGF0ZSldOworCQl1aW50MzJfdCB0ZXhkZXNjciwgdGV4YWRkcjAsIHRleGFkZHIxOworCQl1aW50MzJfdCBkcmF3Y3RybDAsIG5ld19kcmF3Y3RybDA7CisJCXVpbnQzMl90IGRyYXdjdHJsMSwgbmV3X2RyYXdjdHJsMTsKKwl9IHM0OworfSBkcm1fc2F2YWdlX3N0YXRlX3Q7CisKKy8qIHRoZXNlIGNoaXAgdGFncyBzaG91bGQgbWF0Y2ggdGhlIG9uZXMgaW4gdGhlIDJEIGRyaXZlciBpbiBzYXZhZ2VfcmVncy5oLiAqLworZW51bSBzYXZhZ2VfZmFtaWx5IHsKKwlTM19VTktOT1dOID0gMCwKKwlTM19TQVZBR0UzRCwKKwlTM19TQVZBR0VfTVgsCisJUzNfU0FWQUdFNCwKKwlTM19QUk9TQVZBR0UsCisJUzNfVFdJU1RFUiwKKwlTM19QUk9TQVZBR0VERFIsCisJUzNfU1VQRVJTQVZBR0UsCisJUzNfU0FWQUdFMjAwMCwKKwlTM19MQVNUCit9OworCisjZGVmaW5lIFMzX1NBVkFHRTNEX1NFUklFUyhjaGlwKSAgKChjaGlwPj1TM19TQVZBR0UzRCkgJiYgKGNoaXA8PVMzX1NBVkFHRV9NWCkpCisKKyNkZWZpbmUgUzNfU0FWQUdFNF9TRVJJRVMoY2hpcCkgICgoY2hpcD09UzNfU0FWQUdFNCkgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoaXA9PVMzX1BST1NBVkFHRSkgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaGlwPT1TM19UV0lTVEVSKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2hpcD09UzNfUFJPU0FWQUdFRERSKSkKKworI2RlZmluZQlTM19TQVZBR0VfTU9CSUxFX1NFUklFUyhjaGlwKQkoKGNoaXA9PVMzX1NBVkFHRV9NWCkgfHwgKGNoaXA9PVMzX1NVUEVSU0FWQUdFKSkKKworI2RlZmluZSBTM19TQVZBR0VfU0VSSUVTKGNoaXApICAgICgoY2hpcD49UzNfU0FWQUdFM0QpICYmIChjaGlwPD1TM19TQVZBR0UyMDAwKSkKKworI2RlZmluZSBTM19NT0JJTEVfVFdJU1RFUl9TRVJJRVMoY2hpcCkgICAoKGNoaXA9PVMzX1RXSVNURVIpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8KGNoaXA9PVMzX1BST1NBVkFHRUREUikpCisKKy8qIGZsYWdzICovCisjZGVmaW5lIFNBVkFHRV9JU19BR1AgMQorCit0eXBlZGVmIHN0cnVjdCBkcm1fc2F2YWdlX3ByaXZhdGUgeworCWRybV9zYXZhZ2Vfc2FyZWFfdCAqc2FyZWFfcHJpdjsKKworCWRybV9zYXZhZ2VfYnVmX3ByaXZfdCBoZWFkLCB0YWlsOworCisJLyogd2hvIGFtIEk/ICovCisJZW51bSBzYXZhZ2VfZmFtaWx5IGNoaXBzZXQ7CisKKwl1bnNpZ25lZCBpbnQgY29iX3NpemU7CisJdW5zaWduZWQgaW50IGJjaV90aHJlc2hvbGRfbG8sIGJjaV90aHJlc2hvbGRfaGk7CisJdW5zaWduZWQgaW50IGRtYV90eXBlOworCisJLyogZnJhbWUgYnVmZmVyIGxheW91dCAqLworCXVuc2lnbmVkIGludCBmYl9icHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldCwgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0LCBiYWNrX3BpdGNoOworCXVuc2lnbmVkIGludCBkZXB0aF9icHA7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisKKwkvKiBiaXRtYXAgZGVzY3JpcHRvcnMgZm9yIHN3YXAgYW5kIGNsZWFyICovCisJdW5zaWduZWQgaW50IGZyb250X2JkLCBiYWNrX2JkLCBkZXB0aF9iZDsKKworCS8qIGxvY2FsIHRleHR1cmVzICovCisJdW5zaWduZWQgaW50IHRleHR1cmVfb2Zmc2V0OworCXVuc2lnbmVkIGludCB0ZXh0dXJlX3NpemU7CisKKwkvKiBtZW1vcnkgcmVnaW9ucyBpbiBwaHlzaWNhbCBtZW1vcnkgKi8KKwlkcm1fbG9jYWxfbWFwX3QgKnNhcmVhOworCWRybV9sb2NhbF9tYXBfdCAqbW1pbzsKKwlkcm1fbG9jYWxfbWFwX3QgKmZiOworCWRybV9sb2NhbF9tYXBfdCAqYXBlcnR1cmU7CisJZHJtX2xvY2FsX21hcF90ICpzdGF0dXM7CisJZHJtX2xvY2FsX21hcF90ICphZ3BfdGV4dHVyZXM7CisJZHJtX2xvY2FsX21hcF90ICpjbWRfZG1hOworCWRybV9sb2NhbF9tYXBfdCBmYWtlX2RtYTsKKworCXN0cnVjdCB7CisJCWludCBoYW5kbGU7CisJCXVuc2lnbmVkIGxvbmcgYmFzZSwgc2l6ZTsKKwl9IG10cnJbM107CisKKwkvKiBCQ0kgYW5kIHN0YXR1cy1yZWxhdGVkIHN0dWZmICovCisJdm9sYXRpbGUgdWludDMyX3QgKnN0YXR1c19wdHIsICpiY2lfcHRyOworCXVpbnQzMl90IHN0YXR1c191c2VkX21hc2s7CisJdWludDE2X3QgZXZlbnRfY291bnRlcjsKKwl1bnNpZ25lZCBpbnQgZXZlbnRfd3JhcDsKKworCS8qIFNhdmFnZTQgY29tbWFuZCBETUEgKi8KKwlkcm1fc2F2YWdlX2RtYV9wYWdlX3QgKmRtYV9wYWdlczsKKwl1bnNpZ25lZCBpbnQgbnJfZG1hX3BhZ2VzLCBmaXJzdF9kbWFfcGFnZSwgY3VycmVudF9kbWFfcGFnZTsKKwlkcm1fc2F2YWdlX2FnZV90IGxhc3RfZG1hX2FnZTsKKworCS8qIHNhdmVkIGh3IHN0YXRlIGZvciBnbG9iYWwvbG9jYWwgY2hlY2sgb24gUzNEICovCisJdWludDMyX3QgaHdfZHJhd19jdHJsLCBod196YnVmX2N0cmw7CisJLyogYW5kIGZvciBzY2lzc29ycyAoZ2xvYmFsLCBzbyBkb24ndCBlbWl0IGlmIG5vdCBjaGFuZ2VkKSAqLworCXVpbnQzMl90IGh3X3NjaXNzb3JzX3N0YXJ0LCBod19zY2lzc29yc19lbmQ7CisKKwlkcm1fc2F2YWdlX3N0YXRlX3Qgc3RhdGU7CisKKwkvKiBhZnRlciBlbWl0dGluZyBhIHdhaXQgY21kIFNhdmFnZTNEIG5lZWRzIDYzIG5vcHMgYmVmb3JlIG5leHQgRE1BICovCisJdW5zaWduZWQgaW50IHdhaXRpbmc7CisKKwkvKiBjb25maWcvaGFyZHdhcmUtZGVwZW5kZW50IGZ1bmN0aW9uIHBvaW50ZXJzICovCisJaW50ICgqd2FpdF9maWZvKShzdHJ1Y3QgZHJtX3NhdmFnZV9wcml2YXRlICpkZXZfcHJpdiwgdW5zaWduZWQgaW50IG4pOworCWludCAoKndhaXRfZXZudCkoc3RydWN0IGRybV9zYXZhZ2VfcHJpdmF0ZSAqZGV2X3ByaXYsIHVpbnQxNl90IGUpOworCS8qIEVyciwgdGhlcmUgaXMgYSBtYWNybyB3YWl0X2V2ZW50IGluIGluY2x1ZGUvbGludXgvd2FpdC5oLgorCSAqIEF2b2lkIHVud2FudGVkIG1hY3JvIGV4cGFuc2lvbi4gKi8KKwl2b2lkICgqZW1pdF9jbGlwX3JlY3QpKHN0cnVjdCBkcm1fc2F2YWdlX3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgICAgIGRybV9jbGlwX3JlY3RfdCAqcGJveCk7CisJdm9pZCAoKmRtYV9mbHVzaCkoc3RydWN0IGRybV9zYXZhZ2VfcHJpdmF0ZSAqZGV2X3ByaXYpOworfSBkcm1fc2F2YWdlX3ByaXZhdGVfdDsKKworLyogaW9jdGxzICovCitleHRlcm4gaW50IHNhdmFnZV9iY2lfY21kYnVmKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgc2F2YWdlX2JjaV9idWZmZXJzKERSTV9JT0NUTF9BUkdTKTsKKworLyogQkNJIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHVpbnQxNl90IHNhdmFnZV9iY2lfZW1pdF9ldmVudChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKK2V4dGVybiB2b2lkIHNhdmFnZV9mcmVlbGlzdF9wdXQoZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfdCAqYnVmKTsKK2V4dGVybiB2b2lkIHNhdmFnZV9kbWFfcmVzZXQoZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2KTsKK2V4dGVybiB2b2lkIHNhdmFnZV9kbWFfd2FpdChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsIHVuc2lnbmVkIGludCBwYWdlKTsKK2V4dGVybiB1aW50MzJfdCAqc2F2YWdlX2RtYV9hbGxvYyhkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJICB1bnNpZ25lZCBpbnQgbik7CitleHRlcm4gaW50IHNhdmFnZV9wcmVpbml0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpOworZXh0ZXJuIGludCBzYXZhZ2VfcG9zdGNsZWFudXAoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludCBzYXZhZ2VfZG9fY2xlYW51cF9iY2koZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgc2F2YWdlX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKTsKKworLyogc3RhdGUgZnVuY3Rpb25zICovCitleHRlcm4gdm9pZCBzYXZhZ2VfZW1pdF9jbGlwX3JlY3RfczNkKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkgICAgICBkcm1fY2xpcF9yZWN0X3QgKnBib3gpOworZXh0ZXJuIHZvaWQgc2F2YWdlX2VtaXRfY2xpcF9yZWN0X3M0KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkgICAgIGRybV9jbGlwX3JlY3RfdCAqcGJveCk7CisKKyNkZWZpbmUgU0FWQUdFX0ZCX1NJWkVfUzMJMHgwMTAwMDAwMAkvKiAgMTZNQiAqLworI2RlZmluZSBTQVZBR0VfRkJfU0laRV9TNAkweDAyMDAwMDAwCS8qICAzMk1CICovCisjZGVmaW5lIFNBVkFHRV9NTUlPX1NJWkUgICAgICAgIDB4MDAwODAwMDAJLyogNTEya0IgKi8KKyNkZWZpbmUgU0FWQUdFX0FQRVJUVVJFX09GRlNFVCAgMHgwMjAwMDAwMAkvKiAgMzJNQiAqLworI2RlZmluZSBTQVZBR0VfQVBFUlRVUkVfU0laRSAgICAweDA1MDAwMDAwCS8qIDUgdGlsZWQgc3VyZmFjZXMsIDE2TUIgZWFjaCAqLworCisjZGVmaW5lIFNBVkFHRV9CQ0lfT0ZGU0VUICAgICAgIDB4MDAwMTAwMDAgICAgICAvKiBvZmZzZXQgb2YgdGhlIEJDSSByZWdpb24KKwkJCQkJCSAqIGluc2lkZSB0aGUgTU1JTyByZWdpb24gKi8KKyNkZWZpbmUgU0FWQUdFX0JDSV9GSUZPX1NJWkUJMzIJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIG9uLWNoaXAKKwkJCQkJCSAqIEJDSSBGSUZPICovCisKKy8qCisgKiBNTUlPIHJlZ2lzdGVycworICovCisjZGVmaW5lIFNBVkFHRV9TVEFUVVNfV09SRDAJCTB4NDhDMDAKKyNkZWZpbmUgU0FWQUdFX1NUQVRVU19XT1JEMQkJMHg0OEMwNAorI2RlZmluZSBTQVZBR0VfQUxUX1NUQVRVU19XT1JEMCAJMHg0OEM2MAorCisjZGVmaW5lIFNBVkFHRV9GSUZPX1VTRURfTUFTS19TM0QJMHgwMDAxZmZmZgorI2RlZmluZSBTQVZBR0VfRklGT19VU0VEX01BU0tfUzQJMHgwMDFmZmZmZgorCisvKiBDb3BpZWQgZnJvbSBzYXZhZ2VfYmNpLmggaW4gdGhlIDJEIGRyaXZlciB3aXRoIHNvbWUgcmVuYW1pbmcuICovCisKKy8qIEJpdG1hcCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBTQVZBR0VfQkRfU1RSSURFX1NISUZUIDAKKyNkZWZpbmUgU0FWQUdFX0JEX0JQUF9TSElGVCAgIDE2CisjZGVmaW5lIFNBVkFHRV9CRF9USUxFX1NISUZUICAyNAorI2RlZmluZSBTQVZBR0VfQkRfQldfRElTQUJMRSAgKDE8PDI4KQorLyogY29tbW9uOiAqLworI2RlZmluZQlTQVZBR0VfQkRfVElMRV9MSU5FQVIJCTAKKy8qIHNhdmFnZTQsIE1YLCBJWCwgM0QgKi8KKyNkZWZpbmUJU0FWQUdFX0JEX1RJTEVfMTZCUFAJCTIKKyNkZWZpbmUJU0FWQUdFX0JEX1RJTEVfMzJCUFAJCTMKKy8qIHR3aXN0ZXIsIHByb3NhdmFnZSwgRERSLCBzdXBlcnNhdmFnZSwgMjAwMCAqLworI2RlZmluZQlTQVZBR0VfQkRfVElMRV9ERVNUCQkxCisjZGVmaW5lCVNBVkFHRV9CRF9USUxFX1RFWFRVUkUJCTIKKy8qIEdCRCAtIEJDSSBlbmFibGUgKi8KKy8qIHNhdmFnZTQsIE1YLCBJWCwgM0QgKi8KKyNkZWZpbmUgU0FWQUdFX0dCRF9CQ0lfRU5BQkxFICAgICAgICAgICAgICAgICAgICA4CisvKiB0d2lzdGVyLCBwcm9zYXZhZ2UsIEREUiwgc3VwZXJzYXZhZ2UsIDIwMDAgKi8KKyNkZWZpbmUgU0FWQUdFX0dCRF9CQ0lfRU5BQkxFX1RXSVNURVIgICAgICAgICAgICAwCisKKyNkZWZpbmUgU0FWQUdFX0dCRF9CSUdfRU5ESUFOICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFNBVkFHRV9HQkRfTElUVExFX0VORElBTiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTQVZBR0VfR0JEXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogIEdsb2JhbCBCaXRtYXAgRGVzY3JpcHRvciAqLworI2RlZmluZSBTQVZBR0VfQkNJX0dMQl9CRF9MT1cgICAgICAgICAgICAgMHg4MTY4CisjZGVmaW5lIFNBVkFHRV9CQ0lfR0xCX0JEX0hJR0ggICAgICAgICAgICAweDgxNkMKKworLyoKKyAqIEJDSSByZWdpc3RlcnMKKyAqLworLyogU2F2YWdlNC9Ud2lzdGVyL1Byb1NhdmFnZSAzRCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0FWQUdFX0RSQVdMT0NBTENUUkxfUzQJCTB4MWUKKyNkZWZpbmUgU0FWQUdFX1RFWFBBTEFERFJfUzQJCTB4MWYKKyNkZWZpbmUgU0FWQUdFX1RFWENUUkwwX1M0CQkweDIwCisjZGVmaW5lIFNBVkFHRV9URVhDVFJMMV9TNAkJMHgyMQorI2RlZmluZSBTQVZBR0VfVEVYQUREUjBfUzQJCTB4MjIKKyNkZWZpbmUgU0FWQUdFX1RFWEFERFIxX1M0CQkweDIzCisjZGVmaW5lIFNBVkFHRV9URVhCTEVORDBfUzQJCTB4MjQKKyNkZWZpbmUgU0FWQUdFX1RFWEJMRU5EMV9TNAkJMHgyNQorI2RlZmluZSBTQVZBR0VfVEVYWFBSQ0xSX1M0CQkweDI2IC8qIG5ldmVyIHVzZWQgKi8KKyNkZWZpbmUgU0FWQUdFX1RFWERFU0NSX1M0CQkweDI3CisjZGVmaW5lIFNBVkFHRV9GT0dUQUJMRV9TNAkJMHgyOAorI2RlZmluZSBTQVZBR0VfRk9HQ1RSTF9TNAkJMHgzMAorI2RlZmluZSBTQVZBR0VfU1RFTkNJTENUUkxfUzQJCTB4MzEKKyNkZWZpbmUgU0FWQUdFX1pCVUZDVFJMX1M0CQkweDMyCisjZGVmaW5lIFNBVkFHRV9aQlVGT0ZGX1M0CQkweDMzCisjZGVmaW5lIFNBVkFHRV9ERVNUQ1RSTF9TNAkJMHgzNAorI2RlZmluZSBTQVZBR0VfRFJBV0NUUkwwX1M0CQkweDM1CisjZGVmaW5lIFNBVkFHRV9EUkFXQ1RSTDFfUzQJCTB4MzYKKyNkZWZpbmUgU0FWQUdFX1pXQVRFUk1BUktfUzQJCTB4MzcKKyNkZWZpbmUgU0FWQUdFX0RFU1RURVhSV1dBVEVSTUFSS19TNAkweDM4CisjZGVmaW5lIFNBVkFHRV9URVhCTEVORENPTE9SX1M0CQkweDM5CisvKiBTYXZhZ2UzRC9NWC9JWCAzRCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0FWQUdFX1RFWFBBTEFERFJfUzNECQkweDE4CisjZGVmaW5lIFNBVkFHRV9URVhYUFJDTFJfUzNECQkweDE5IC8qIG5ldmVyIHVzZWQgKi8KKyNkZWZpbmUgU0FWQUdFX1RFWEFERFJfUzNECQkweDFBCisjZGVmaW5lIFNBVkFHRV9URVhERVNDUl9TM0QJCTB4MUIKKyNkZWZpbmUgU0FWQUdFX1RFWENUUkxfUzNECQkweDFDCisjZGVmaW5lIFNBVkFHRV9GT0dUQUJMRV9TM0QJCTB4MjAKKyNkZWZpbmUgU0FWQUdFX0ZPR0NUUkxfUzNECQkweDMwCisjZGVmaW5lIFNBVkFHRV9EUkFXQ1RSTF9TM0QJCTB4MzEKKyNkZWZpbmUgU0FWQUdFX1pCVUZDVFJMX1MzRAkJMHgzMgorI2RlZmluZSBTQVZBR0VfWkJVRk9GRl9TM0QJCTB4MzMKKyNkZWZpbmUgU0FWQUdFX0RFU1RDVFJMX1MzRAkJMHgzNAorI2RlZmluZSBTQVZBR0VfU0NTVEFSVF9TM0QJCTB4MzUKKyNkZWZpbmUgU0FWQUdFX1NDRU5EX1MzRAkJMHgzNgorI2RlZmluZSBTQVZBR0VfWldBVEVSTUFSS19TM0QJCTB4MzcgCisjZGVmaW5lIFNBVkFHRV9ERVNUVEVYUldXQVRFUk1BUktfUzNECTB4MzgKKy8qIGNvbW1vbiBzdHVmZiAqLworI2RlZmluZSBTQVZBR0VfVkVSVEJVRkFERFIJCTB4M2UKKyNkZWZpbmUgU0FWQUdFX0JJVFBMQU5FV1RNQVNLCQkweGQ3CisjZGVmaW5lIFNBVkFHRV9ETUFCVUZBRERSCQkweDUxCisKKy8qIHRleHR1cmUgZW5hYmxlIGJpdHMgKG5lZWRlZCBmb3IgdGV4IGFkZHIgY2hlY2tpbmcpICovCisjZGVmaW5lIFNBVkFHRV9URVhDVFJMX1RFWEVOX01BU0sJMHgwMDAxMDAwMCAvKiBTM0QgKi8KKyNkZWZpbmUgU0FWQUdFX1RFWERFU0NSX1RFWDBFTl9NQVNLCTB4MDIwMDAwMDAgLyogUzQgKi8KKyNkZWZpbmUgU0FWQUdFX1RFWERFU0NSX1RFWDFFTl9NQVNLCTB4MDQwMDAwMDAgLyogUzQgKi8KKworLyogR2xvYmFsIGZpZWxkcyBpbiBTYXZhZ2U0L1R3aXN0ZXIvUHJvU2F2YWdlIDNEIHJlZ2lzdGVyczoKKyAqCisgKiBBbGwgdGV4dHVyZSByZWdpc3RlcnMgYW5kIERyYXdMb2NhbEN0cmwgYXJlIGxvY2FsLiBBbGwgb3RoZXIKKyAqIHJlZ2lzdGVycyBhcmUgZ2xvYmFsLiAqLworCisvKiBHbG9iYWwgZmllbGRzIGluIFNhdmFnZTNEL01YL0lYIDNEIHJlZ2lzdGVyczoKKyAqCisgKiBBbGwgdGV4dHVyZSByZWdpc3RlcnMgYXJlIGxvY2FsLiBEcmF3Q3RybCBhbmQgWkJ1ZkN0cmwgYXJlCisgKiBwYXJ0aWFsbHkgbG9jYWwuIEFsbCBvdGhlciByZWdpc3RlcnMgYXJlIGdsb2JhbC4KKyAqCisgKiBEcmF3Q3RybCBnbG9iYWwgZmllbGRzOiBjdWxsTW9kZSwgYWxwaGFUZXN0Q21wRnVuYywgYWxwaGFUZXN0RW4sIGFscGhhUmVmVmFsCisgKiBaQnVmQ3RybCBnbG9iYWwgZmllbGRzOiB6Q21wRnVuYywgekJ1ZkVuCisgKi8KKyNkZWZpbmUgU0FWQUdFX0RSQVdDVFJMX1MzRF9HTE9CQUwJMHgwM2YzYzAwYworI2RlZmluZSBTQVZBR0VfWkJVRkNUUkxfUzNEX0dMT0JBTAkweDAwMDAwMDI3CisKKy8qIE1hc2tzIGZvciBzY2lzc29yIGJpdHMgKGRyYXdDdHJsWzAxXSBvbiBzNCwgc2Npc3NvclN0YXJ0L0VuZCBvbiBzM2QpCisgKi8KKyNkZWZpbmUgU0FWQUdFX1NDSVNTT1JfTUFTS19TNAkJMHgwMGZmZjdmZgorI2RlZmluZSBTQVZBR0VfU0NJU1NPUl9NQVNLX1MzRAkJMHgwN2ZmMDdmZgorCisvKgorICogQkNJIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUgQkNJX0NNRF9OT1AgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEJDSV9DTURfUkVDVCAgICAgICAgICAgICAgICAgMHg0ODAwMDAwMAorI2RlZmluZSBCQ0lfQ01EX1JFQ1RfWFAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgQkNJX0NNRF9SRUNUX1lQICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEJDSV9DTURfU0NBTkxJTkUgICAgICAgICAgICAgMHg1MDAwMDAwMAorI2RlZmluZSBCQ0lfQ01EX0xJTkUgICAgICAgICAgICAgICAgIDB4NUMwMDAwMDAKKyNkZWZpbmUgQkNJX0NNRF9MSU5FX0xBU1RfUElYRUwgICAgICAweDU4MDAwMDAwCisjZGVmaW5lIEJDSV9DTURfQllURV9URVhUICAgICAgICAgICAgMHg2MzAwMDAwMAorI2RlZmluZSBCQ0lfQ01EX05UX0JZVEVfVEVYVCAgICAgICAgIDB4NjcwMDAwMDAKKyNkZWZpbmUgQkNJX0NNRF9CSVRfVEVYVCAgICAgICAgICAgICAweDZDMDAwMDAwCisjZGVmaW5lIEJDSV9DTURfR0VUX1JPUChjbWQpICAgICAgICAgKCgoY21kKSA+PiAxNikgJiAweEZGKQorI2RlZmluZSBCQ0lfQ01EX1NFVF9ST1AoY21kLCByb3ApICAgICgoY21kKSB8PSAoKHJvcCAmIDB4RkYpIDw8IDE2KSkKKyNkZWZpbmUgQkNJX0NNRF9TRU5EX0NPTE9SICAgICAgICAgICAweDAwMDA4MDAwCisKKyNkZWZpbmUgQkNJX0NNRF9DTElQX05PTkUgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEJDSV9DTURfQ0xJUF9DVVJSRU5UICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBCQ0lfQ01EX0NMSVBfTFIgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQkNJX0NNRF9DTElQX05FVyAgICAgICAgICAgICAweDAwMDA2MDAwCisKKyNkZWZpbmUgQkNJX0NNRF9ERVNUX0dCRCAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEJDSV9DTURfREVTVF9QQkQgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBCQ0lfQ01EX0RFU1RfUEJEX05FVyAgICAgICAgIDB4MDAwMDBDMDAKKyNkZWZpbmUgQkNJX0NNRF9ERVNUX1NCRCAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEJDSV9DTURfREVTVF9TQkRfTkVXICAgICAgICAgMHgwMDAwMTQwMAorCisjZGVmaW5lIEJDSV9DTURfU1JDX1RSQU5TUEFSRU5UICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBCQ0lfQ01EX1NSQ19TT0xJRCAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQkNJX0NNRF9TUkNfR0JEICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEJDSV9DTURfU1JDX0NPTE9SICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBCQ0lfQ01EX1NSQ19NT05PICAgICAgICAgICAgIDB4MDAwMDAwNjAKKyNkZWZpbmUgQkNJX0NNRF9TUkNfUEJEX0NPTE9SICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEJDSV9DTURfU1JDX1BCRF9NT05PICAgICAgICAgMHgwMDAwMDBBMAorI2RlZmluZSBCQ0lfQ01EX1NSQ19QQkRfQ09MT1JfTkVXICAgIDB4MDAwMDAwQzAKKyNkZWZpbmUgQkNJX0NNRF9TUkNfUEJEX01PTk9fTkVXICAgICAweDAwMDAwMEUwCisjZGVmaW5lIEJDSV9DTURfU1JDX1NCRF9DT0xPUiAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBCQ0lfQ01EX1NSQ19TQkRfTU9OTyAgICAgICAgIDB4MDAwMDAxMjAKKyNkZWZpbmUgQkNJX0NNRF9TUkNfU0JEX0NPTE9SX05FVyAgICAweDAwMDAwMTQwCisjZGVmaW5lIEJDSV9DTURfU1JDX1NCRF9NT05PX05FVyAgICAgMHgwMDAwMDE2MAorCisjZGVmaW5lIEJDSV9DTURfUEFUX1RSQU5TUEFSRU5UICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBCQ0lfQ01EX1BBVF9OT05FICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQkNJX0NNRF9QQVRfQ09MT1IgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEJDSV9DTURfUEFUX01PTk8gICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBCQ0lfQ01EX1BBVF9QQkRfQ09MT1IgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQkNJX0NNRF9QQVRfUEJEX01PTk8gICAgICAgICAweDAwMDAwMDA1CisjZGVmaW5lIEJDSV9DTURfUEFUX1BCRF9DT0xPUl9ORVcgICAgMHgwMDAwMDAwNgorI2RlZmluZSBCQ0lfQ01EX1BBVF9QQkRfTU9OT19ORVcgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgQkNJX0NNRF9QQVRfU0JEX0NPTE9SICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEJDSV9DTURfUEFUX1NCRF9NT05PICAgICAgICAgMHgwMDAwMDAwOQorI2RlZmluZSBCQ0lfQ01EX1BBVF9TQkRfQ09MT1JfTkVXICAgIDB4MDAwMDAwMEEKKyNkZWZpbmUgQkNJX0NNRF9QQVRfU0JEX01PTk9fTkVXICAgICAweDAwMDAwMDBCCisKKyNkZWZpbmUgQkNJX0JEX0JXX0RJU0FCTEUgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEJDSV9CRF9USUxFX01BU0sgICAgICAgICAgICAgMHgwMzAwMDAwMAorI2RlZmluZSBCQ0lfQkRfVElMRV9OT05FICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQkNJX0JEX1RJTEVfMTYgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEJDSV9CRF9USUxFXzMyICAgICAgICAgICAgICAgMHgwMzAwMDAwMAorI2RlZmluZSBCQ0lfQkRfR0VUX0JQUChiZCkgICAgICAgICAgICgoKGJkKSA+PiAxNikgJiAweEZGKQorI2RlZmluZSBCQ0lfQkRfU0VUX0JQUChiZCwgYnBwKSAgICAgICgoYmQpIHw9ICgoKGJwcCkgJiAweEZGKSA8PCAxNikpCisjZGVmaW5lIEJDSV9CRF9HRVRfU1RSSURFKGJkKSAgICAgICAgKChiZCkgJiAweEZGRkYpCisjZGVmaW5lIEJDSV9CRF9TRVRfU1RSSURFKGJkLCBzdCkgICAgKChiZCkgfD0gKChzdCkgJiAweEZGRkYpKQorCisjZGVmaW5lIEJDSV9DTURfU0VUX1JFR0lTVEVSICAgICAgICAgICAgMHg5NjAwMDAwMAorCisjZGVmaW5lIEJDSV9DTURfV0FJVCAgICAgICAgICAgICAgICAgICAgMHhDMDAwMDAwMAorI2RlZmluZSBCQ0lfQ01EX1dBSVRfM0QgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQkNJX0NNRF9XQUlUXzJEICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisKKyNkZWZpbmUgQkNJX0NNRF9VUERBVEVfRVZFTlRfVEFHICAgICAgICAweDk4MDAwMDAwCisKKyNkZWZpbmUgQkNJX0NNRF9EUkFXX1BSSU0gICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEJDSV9DTURfRFJBV19JTkRFWEVEX1BSSU0gICAgICAgMHg4ODAwMDAwMAorI2RlZmluZSBCQ0lfQ01EX0RSQVdfQ09OVCAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgQkNJX0NNRF9EUkFXX1RSSUxJU1QgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEJDSV9DTURfRFJBV19UUklTVFJJUCAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBCQ0lfQ01EX0RSQVdfVFJJRkFOICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQkNJX0NNRF9EUkFXX1NLSVBGTEFHUyAgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEJDSV9DTURfRFJBV19OT19aCQkweDAwMDAwMDAxCisjZGVmaW5lIEJDSV9DTURfRFJBV19OT19XCQkweDAwMDAwMDAyCisjZGVmaW5lIEJDSV9DTURfRFJBV19OT19DRAkJMHgwMDAwMDAwNAorI2RlZmluZSBCQ0lfQ01EX0RSQVdfTk9fQ1MJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQkNJX0NNRF9EUkFXX05PX1UwCQkweDAwMDAwMDEwCisjZGVmaW5lIEJDSV9DTURfRFJBV19OT19WMAkJMHgwMDAwMDAyMAorI2RlZmluZSBCQ0lfQ01EX0RSQVdfTk9fVVYwCQkweDAwMDAwMDMwCisjZGVmaW5lIEJDSV9DTURfRFJBV19OT19VMQkJMHgwMDAwMDA0MAorI2RlZmluZSBCQ0lfQ01EX0RSQVdfTk9fVjEJCTB4MDAwMDAwODAKKyNkZWZpbmUgQkNJX0NNRF9EUkFXX05PX1VWMQkJMHgwMDAwMDBjMAorCisjZGVmaW5lIEJDSV9DTURfRE1BCQkJMHhhODAwMDAwMAorCisjZGVmaW5lIEJDSV9XX0godywgaCkgICAgICAgICAgICAgICAgKCgoKGgpIDw8IDE2KSB8ICh3KSkgJiAweDBGRkYwRkZGKQorI2RlZmluZSBCQ0lfWF9ZKHgsIHkpICAgICAgICAgICAgICAgICgoKCh5KSA8PCAxNikgfCAoeCkpICYgMHgwRkZGMEZGRikKKyNkZWZpbmUgQkNJX1hfVyh4LCB5KSAgICAgICAgICAgICAgICAoKCgodykgPDwgMTYpIHwgKHgpKSAmIDB4MEZGRjBGRkYpCisjZGVmaW5lIEJDSV9DTElQX0xSKGwsIHIpICAgICAgICAgICAgKCgoKHIpIDw8IDE2KSB8IChsKSkgJiAweDBGRkYwRkZGKQorI2RlZmluZSBCQ0lfQ0xJUF9UTCh0LCBsKSAgICAgICAgICAgICgoKCh0KSA8PCAxNikgfCAobCkpICYgMHgwRkZGMEZGRikKKyNkZWZpbmUgQkNJX0NMSVBfQlIoYiwgcikgICAgICAgICAgICAoKCgoYikgPDwgMTYpIHwgKHIpKSAmIDB4MEZGRjBGRkYpCisKKyNkZWZpbmUgQkNJX0xJTkVfWF9ZKHgsIHkpICAgICAgICAgICAoKCh5KSA8PCAxNikgfCAoKHgpICYgMHhGRkZGKSkKKyNkZWZpbmUgQkNJX0xJTkVfU1RFUFMoZGlhZywgYXhpKSAgICAoKChheGkpIDw8IDE2KSB8ICgoZGlhZykgJiAweEZGRkYpKQorI2RlZmluZSBCQ0lfTElORV9NSVNDKG1haiwgeW0sIHhwLCB5cCwgZXJyKSBcCisJKCgobWFqKSAmIDB4MUZGRikgfCBcCisJKCh5bSkgPyAxPDwxMyA6IDApIHwgXAorCSgoeHApID8gMTw8MTQgOiAwKSB8IFwKKwkoKHlwKSA/IDE8PDE1IDogMCkgfCBcCisJKChlcnIpIDw8IDE2KSkKKworLyoKKyAqIGNvbW1vbiBjb21tYW5kcworICovCisjZGVmaW5lIEJDSV9TRVRfUkVHSVNURVJTKCBmaXJzdCwgbiApCQkJXAorCUJDSV9XUklURShCQ0lfQ01EX1NFVF9SRUdJU1RFUiB8CQlcCisJCSAgKCh1aW50MzJfdCkobikgJiAweGZmKSA8PCAxNiB8CVwKKwkJICAoKHVpbnQzMl90KShmaXJzdCkgJiAweGZmZmYpKQorI2RlZmluZSBETUFfU0VUX1JFR0lTVEVSUyggZmlyc3QsIG4gKQkJCVwKKwlETUFfV1JJVEUoQkNJX0NNRF9TRVRfUkVHSVNURVIgfAkJXAorCQkgICgodWludDMyX3QpKG4pICYgMHhmZikgPDwgMTYgfAlcCisJCSAgKCh1aW50MzJfdCkoZmlyc3QpICYgMHhmZmZmKSkKKworI2RlZmluZSBCQ0lfRFJBV19QUklNSVRJVkUobiwgdHlwZSwgc2tpcCkgICAgICAgICBcCisgICAgICAgIEJDSV9XUklURShCQ0lfQ01EX0RSQVdfUFJJTSB8ICh0eXBlKSB8IChza2lwKSB8IFwKKwkJICAoKG4pIDw8IDE2KSkKKyNkZWZpbmUgRE1BX0RSQVdfUFJJTUlUSVZFKG4sIHR5cGUsIHNraXApICAgICAgICAgXAorICAgICAgICBETUFfV1JJVEUoQkNJX0NNRF9EUkFXX1BSSU0gfCAodHlwZSkgfCAoc2tpcCkgfCBcCisJCSAgKChuKSA8PCAxNikpCisKKyNkZWZpbmUgQkNJX0RSQVdfSU5ESUNFU19TM0QobiwgdHlwZSwgaTApICAgICAgICAgXAorICAgICAgICBCQ0lfV1JJVEUoQkNJX0NNRF9EUkFXX0lOREVYRURfUFJJTSB8ICh0eXBlKSB8ICBcCisJCSAgKChuKSA8PCAxNikgfCAoaTApKQorCisjZGVmaW5lIEJDSV9EUkFXX0lORElDRVNfUzQobiwgdHlwZSwgc2tpcCkgICAgICAgIFwKKyAgICAgICAgQkNJX1dSSVRFKEJDSV9DTURfRFJBV19JTkRFWEVEX1BSSU0gfCAodHlwZSkgfCAgXAorICAgICAgICAgICAgICAgICAgKHNraXApIHwgKChuKSA8PCAxNikpCisKKyNkZWZpbmUgQkNJX0RNQShuKQlcCisJQkNJX1dSSVRFKEJDSV9DTURfRE1BIHwgKCgobikgPj4gMSkgLSAxKSkKKworLyoKKyAqIGFjY2VzcyB0byBNTUlPCisgKi8KKyNkZWZpbmUgU0FWQUdFX1JFQUQocmVnKQlEUk1fUkVBRDMyKCAgZGV2X3ByaXYtPm1taW8sIChyZWcpICkKKyNkZWZpbmUgU0FWQUdFX1dSSVRFKHJlZykJRFJNX1dSSVRFMzIoIGRldl9wcml2LT5tbWlvLCAocmVnKSApCisKKy8qCisgKiBhY2Nlc3MgdG8gdGhlIGJ1cnN0IGNvbW1hbmQgaW50ZXJmYWNlIChCQ0kpCisgKi8KKyNkZWZpbmUgU0FWQUdFX0JDSV9ERUJVRyAxCisKKyNkZWZpbmUgQkNJX0xPQ0FMUyAgICB2b2xhdGlsZSB1aW50MzJfdCAqYmNpX3B0cjsKKworI2RlZmluZSBCRUdJTl9CQ0koIG4gKSBkbyB7CQkJXAorCWRldl9wcml2LT53YWl0X2ZpZm8oZGV2X3ByaXYsIChuKSk7CVwKKwliY2lfcHRyID0gZGV2X3ByaXYtPmJjaV9wdHI7CQlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgQkNJX1dSSVRFKCB2YWwgKSAqYmNpX3B0cisrID0gKHVpbnQzMl90KSh2YWwpCisKKyNkZWZpbmUgQkNJX0NPUFlfRlJPTV9VU0VSKHNyYyxuKSBkbyB7CQkJCVwKKyAgICB1bnNpZ25lZCBpbnQgaTsJCQkJCQlcCisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewkJCQkJXAorCXVpbnQzMl90IHZhbDsJCQkJCQlcCisJRFJNX0dFVF9VU0VSX1VOQ0hFQ0tFRCh2YWwsICYoKHVpbnQzMl90Kikoc3JjKSlbaV0pOwlcCisJQkNJX1dSSVRFKHZhbCk7CQkJCQkJXAorICAgIH0JCQkJCQkJCVwKK30gd2hpbGUoMCkKKworLyoKKyAqIGNvbW1hbmQgRE1BIHN1cHBvcnQKKyAqLworI2RlZmluZSBTQVZBR0VfRE1BX0RFQlVHIDEKKworI2RlZmluZSBETUFfTE9DQUxTICAgdWludDMyX3QgKmRtYV9wdHI7CisKKyNkZWZpbmUgQkVHSU5fRE1BKCBuICkgZG8gewkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgY3VyID0gZGV2X3ByaXYtPmN1cnJlbnRfZG1hX3BhZ2U7CQkJXAorCXVuc2lnbmVkIGludCByZXN0ID0gU0FWQUdFX0RNQV9QQUdFX1NJWkUgLQkJCVwKKwkJZGV2X3ByaXYtPmRtYV9wYWdlc1tjdXJdLnVzZWQ7CQkJCVwKKwlpZiAoKG4pID4gcmVzdCkgewkJCQkJCVwKKwkJZG1hX3B0ciA9IHNhdmFnZV9kbWFfYWxsb2MoZGV2X3ByaXYsIChuKSk7CQlcCisJfSBlbHNlIHsgLyogZmFzdCBwYXRoIGZvciBzbWFsbCBhbGxvY2F0aW9ucyAqLwkJCVwKKwkJZG1hX3B0ciA9ICh1aW50MzJfdCAqKWRldl9wcml2LT5jbWRfZG1hLT5oYW5kbGUgKwlcCisJCQljdXIgKiBTQVZBR0VfRE1BX1BBR0VfU0laRSArCQkJXAorCQkJZGV2X3ByaXYtPmRtYV9wYWdlc1tjdXJdLnVzZWQ7CQkJXAorCQlpZiAoZGV2X3ByaXYtPmRtYV9wYWdlc1tjdXJdLnVzZWQgPT0gMCkJCQlcCisJCQlzYXZhZ2VfZG1hX3dhaXQoZGV2X3ByaXYsIGN1cik7CQkJXAorCQlkZXZfcHJpdi0+ZG1hX3BhZ2VzW2N1cl0udXNlZCArPSAobik7CQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBETUFfV1JJVEUoIHZhbCApICpkbWFfcHRyKysgPSAodWludDMyX3QpKHZhbCkKKworI2RlZmluZSBETUFfQ09QWV9GUk9NX1VTRVIoc3JjLG4pIGRvIHsJCQkJXAorCURSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoZG1hX3B0ciwgKHNyYyksIChuKSo0KTsJXAorCWRtYV9wdHIgKz0gbjsJCQkJCQlcCit9IHdoaWxlKDApCisKKyNpZiBTQVZBR0VfRE1BX0RFQlVHCisjZGVmaW5lIERNQV9DT01NSVQoKSBkbyB7CQkJCQkJXAorCXVuc2lnbmVkIGludCBjdXIgPSBkZXZfcHJpdi0+Y3VycmVudF9kbWFfcGFnZTsJCQlcCisJdWludDMyX3QgKmV4cGVjdGVkID0gKHVpbnQzMl90ICopZGV2X3ByaXYtPmNtZF9kbWEtPmhhbmRsZSArCVwKKwkJCWN1ciAqIFNBVkFHRV9ETUFfUEFHRV9TSVpFICsJCQlcCisJCQlkZXZfcHJpdi0+ZG1hX3BhZ2VzW2N1cl0udXNlZDsJCQlcCisJaWYgKGRtYV9wdHIgIT0gZXhwZWN0ZWQpIHsJCQkJCVwKKwkJRFJNX0VSUk9SKCJETUEgYWxsb2NhdGlvbiBhbmQgdXNlIGRvbid0IG1hdGNoOiAiCVwKKwkJCSAgIiVwICE9ICVwXG4iLCBleHBlY3RlZCwgZG1hX3B0cik7CQlcCisJCXNhdmFnZV9kbWFfcmVzZXQoZGV2X3ByaXYpOwkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgRE1BX0NPTU1JVCgpIGRvIHsvKiBub3RoaW5nICovfSB3aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgRE1BX0ZMVVNIKCkgZGV2X3ByaXYtPmRtYV9mbHVzaChkZXZfcHJpdikKKworLyogQnVmZmVyIGFnaW5nIHZpYSBldmVudCB0YWcKKyAqLworCisjZGVmaW5lIFVQREFURV9FVkVOVF9DT1VOVEVSKCApIGRvIHsJCQlcCisJaWYgKGRldl9wcml2LT5zdGF0dXNfcHRyKSB7CQkJXAorCQl1aW50MTZfdCBjb3VudDsJCQkJXAorCQkvKiBjb29yZGluYXRlIHdpdGggWHNlcnZlciAqLwkJXAorCQljb3VudCA9IGRldl9wcml2LT5zdGF0dXNfcHRyWzEwMjNdOwlcCisJCWlmIChjb3VudCA8IGRldl9wcml2LT5ldmVudF9jb3VudGVyKQlcCisJCQlkZXZfcHJpdi0+ZXZlbnRfd3JhcCsrOwkJXAorCQlkZXZfcHJpdi0+ZXZlbnRfY291bnRlciA9IGNvdW50OwlcCisJfQkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBTRVRfQUdFKCBhZ2UsIGUsIHcgKSBkbyB7CVwKKwkoYWdlKS0+ZXZlbnQgPSBlOwkJXAorCShhZ2UpLT53cmFwID0gdzsJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBURVNUX0FHRSggYWdlLCBlLCB3ICkJCQkJXAorCSggKGFnZSktPndyYXAgPCAodykgfHwgKCAoYWdlKS0+d3JhcCA9PSAodykgJiYgKGFnZSktPmV2ZW50IDw9IChlKSApICkKKworI2VuZGlmIC8qIF9fU0FWQUdFX0RSVl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NTY5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jCkBAIC0wLDAgKzEsMTE0NiBAQAorLyogc2F2YWdlX3N0YXRlLmMgLS0gU3RhdGUgYW5kIGRyYXdpbmcgc3VwcG9ydCBmb3IgU2F2YWdlCisgKgorICogQ29weXJpZ2h0IDIwMDQgIEZlbGl4IEt1ZWhsaW5nCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgRkVMSVggS1VFSExJTkcgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YKKyAqIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAic2F2YWdlX2RybS5oIgorI2luY2x1ZGUgInNhdmFnZV9kcnYuaCIKKwordm9pZCBzYXZhZ2VfZW1pdF9jbGlwX3JlY3RfczNkKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICAgICBkcm1fY2xpcF9yZWN0X3QgKnBib3gpCit7CisJdWludDMyX3Qgc2NzdGFydCA9IGRldl9wcml2LT5zdGF0ZS5zM2QubmV3X3Njc3RhcnQ7CisJdWludDMyX3Qgc2NlbmQgICA9IGRldl9wcml2LT5zdGF0ZS5zM2QubmV3X3NjZW5kOworCXNjc3RhcnQgPSAoc2NzdGFydCAmIH5TQVZBR0VfU0NJU1NPUl9NQVNLX1MzRCkgfAorCQkoKHVpbnQzMl90KXBib3gtPngxICYgMHgwMDAwMDdmZikgfCAKKwkJKCgodWludDMyX3QpcGJveC0+eTEgPDwgMTYpICYgMHgwN2ZmMDAwMCk7CisJc2NlbmQgICA9IChzY2VuZCAgICYgflNBVkFHRV9TQ0lTU09SX01BU0tfUzNEKSB8CisJCSgoKHVpbnQzMl90KXBib3gtPngyLTEpICYgMHgwMDAwMDdmZikgfAorCQkoKCgodWludDMyX3QpcGJveC0+eTItMSkgPDwgMTYpICYgMHgwN2ZmMDAwMCk7CisJaWYgKHNjc3RhcnQgIT0gZGV2X3ByaXYtPnN0YXRlLnMzZC5zY3N0YXJ0IHx8CisJICAgIHNjZW5kICAgIT0gZGV2X3ByaXYtPnN0YXRlLnMzZC5zY2VuZCkgeworCQlETUFfTE9DQUxTOworCQlCRUdJTl9ETUEoNCk7CisJCURNQV9XUklURShCQ0lfQ01EX1dBSVR8QkNJX0NNRF9XQUlUXzNEKTsKKwkJRE1BX1NFVF9SRUdJU1RFUlMoU0FWQUdFX1NDU1RBUlRfUzNELCAyKTsKKwkJRE1BX1dSSVRFKHNjc3RhcnQpOworCQlETUFfV1JJVEUoc2NlbmQpOworCQlkZXZfcHJpdi0+c3RhdGUuczNkLnNjc3RhcnQgPSBzY3N0YXJ0OworCQlkZXZfcHJpdi0+c3RhdGUuczNkLnNjZW5kICAgPSBzY2VuZDsKKwkJZGV2X3ByaXYtPndhaXRpbmcgPSAxOworCQlETUFfQ09NTUlUKCk7CisJfQorfQorCit2b2lkIHNhdmFnZV9lbWl0X2NsaXBfcmVjdF9zNChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgICBkcm1fY2xpcF9yZWN0X3QgKnBib3gpCit7CisJdWludDMyX3QgZHJhd2N0cmwwID0gZGV2X3ByaXYtPnN0YXRlLnM0Lm5ld19kcmF3Y3RybDA7CisJdWludDMyX3QgZHJhd2N0cmwxID0gZGV2X3ByaXYtPnN0YXRlLnM0Lm5ld19kcmF3Y3RybDE7CisJZHJhd2N0cmwwID0gKGRyYXdjdHJsMCAmIH5TQVZBR0VfU0NJU1NPUl9NQVNLX1M0KSB8CisJCSgodWludDMyX3QpcGJveC0+eDEgJiAweDAwMDAwN2ZmKSB8CisJCSgoKHVpbnQzMl90KXBib3gtPnkxIDw8IDEyKSAmIDB4MDBmZmYwMDApOworCWRyYXdjdHJsMSA9IChkcmF3Y3RybDEgJiB+U0FWQUdFX1NDSVNTT1JfTUFTS19TNCkgfAorCQkoKCh1aW50MzJfdClwYm94LT54Mi0xKSAmIDB4MDAwMDA3ZmYpIHwKKwkJKCgoKHVpbnQzMl90KXBib3gtPnkyLTEpIDw8IDEyKSAmIDB4MDBmZmYwMDApOworCWlmIChkcmF3Y3RybDAgIT0gZGV2X3ByaXYtPnN0YXRlLnM0LmRyYXdjdHJsMCB8fAorCSAgICBkcmF3Y3RybDEgIT0gZGV2X3ByaXYtPnN0YXRlLnM0LmRyYXdjdHJsMSkgeworCQlETUFfTE9DQUxTOworCQlCRUdJTl9ETUEoNCk7CisJCURNQV9XUklURShCQ0lfQ01EX1dBSVR8QkNJX0NNRF9XQUlUXzNEKTsKKwkJRE1BX1NFVF9SRUdJU1RFUlMoU0FWQUdFX0RSQVdDVFJMMF9TNCwgMik7CisJCURNQV9XUklURShkcmF3Y3RybDApOworCQlETUFfV1JJVEUoZHJhd2N0cmwxKTsKKwkJZGV2X3ByaXYtPnN0YXRlLnM0LmRyYXdjdHJsMCA9IGRyYXdjdHJsMDsKKwkJZGV2X3ByaXYtPnN0YXRlLnM0LmRyYXdjdHJsMSA9IGRyYXdjdHJsMTsKKwkJZGV2X3ByaXYtPndhaXRpbmcgPSAxOworCQlETUFfQ09NTUlUKCk7CisJfQorfQorCitzdGF0aWMgaW50IHNhdmFnZV92ZXJpZnlfdGV4YWRkcihkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCB1bml0LAorCQkJCSB1aW50MzJfdCBhZGRyKQoreworCWlmICgoYWRkciAmIDYpICE9IDIpIHsgLyogcmVzZXJ2ZWQgYml0cyAqLworCQlEUk1fRVJST1IoImJhZCB0ZXhBZGRyJWQgJTA4eCAocmVzZXJ2ZWQgYml0cylcbiIsIHVuaXQsIGFkZHIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIShhZGRyICYgMSkpIHsgLyogbG9jYWwgKi8KKwkJYWRkciAmPSB+NzsKKwkJaWYgKGFkZHIgPCAgZGV2X3ByaXYtPnRleHR1cmVfb2Zmc2V0IHx8CisJCSAgICBhZGRyID49IGRldl9wcml2LT50ZXh0dXJlX29mZnNldCtkZXZfcHJpdi0+dGV4dHVyZV9zaXplKSB7CisJCQlEUk1fRVJST1IoImJhZCB0ZXhBZGRyJWQgJTA4eCAobG9jYWwgYWRkciBvdXQgb2YgcmFuZ2UpXG4iLAorCQkJCSAgdW5pdCwgYWRkcik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJfSBlbHNlIHsgLyogQUdQICovCisJCWlmICghZGV2X3ByaXYtPmFncF90ZXh0dXJlcykgeworCQkJRFJNX0VSUk9SKCJiYWQgdGV4QWRkciVkICUwOHggKEFHUCBub3QgYXZhaWxhYmxlKVxuIiwKKwkJCQkgIHVuaXQsIGFkZHIpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQlhZGRyICY9IH43OworCQlpZiAoYWRkciA8IGRldl9wcml2LT5hZ3BfdGV4dHVyZXMtPm9mZnNldCB8fAorCQkgICAgYWRkciA+PSAoZGV2X3ByaXYtPmFncF90ZXh0dXJlcy0+b2Zmc2V0ICsKKwkJCSAgICAgZGV2X3ByaXYtPmFncF90ZXh0dXJlcy0+c2l6ZSkpIHsKKwkJCURSTV9FUlJPUigiYmFkIHRleEFkZHIlZCAlMDh4IChBR1AgYWRkciBvdXQgb2YgcmFuZ2UpXG4iLAorCQkJCSAgdW5pdCwgYWRkcik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIFNBVkVfU1RBVEUocmVnLHdoZXJlKQkJCVwKKwlpZihzdGFydCA8PSByZWcgJiYgc3RhcnQrY291bnQgPiByZWcpCVwKKwkJRFJNX0dFVF9VU0VSX1VOQ0hFQ0tFRChkZXZfcHJpdi0+c3RhdGUud2hlcmUsICZyZWdzW3JlZy1zdGFydF0pCisjZGVmaW5lIFNBVkVfU1RBVEVfTUFTSyhyZWcsd2hlcmUsbWFzaykgZG8gewkJCVwKKwlpZihzdGFydCA8PSByZWcgJiYgc3RhcnQrY291bnQgPiByZWcpIHsJCQlcCisJCXVpbnQzMl90IHRtcDsJCQkJCVwKKwkJRFJNX0dFVF9VU0VSX1VOQ0hFQ0tFRCh0bXAsICZyZWdzW3JlZy1zdGFydF0pOwlcCisJCWRldl9wcml2LT5zdGF0ZS53aGVyZSA9ICh0bXAgJiAobWFzaykpIHwJXAorCQkJKGRldl9wcml2LT5zdGF0ZS53aGVyZSAmIH4obWFzaykpOwlcCisJfQkJCQkJCQlcCit9IHdoaWxlICgwKQorc3RhdGljIGludCBzYXZhZ2VfdmVyaWZ5X3N0YXRlX3MzZChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJICAgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQkJICAgY29uc3QgdWludDMyX3QgX191c2VyICpyZWdzKQoreworCWlmIChzdGFydCA8IFNBVkFHRV9URVhQQUxBRERSX1MzRCB8fAorCSAgICBzdGFydCtjb3VudC0xID4gU0FWQUdFX0RFU1RURVhSV1dBVEVSTUFSS19TM0QpIHsKKwkJRFJNX0VSUk9SKCJpbnZhbGlkIHJlZ2lzdGVyIHJhbmdlICgweCUwNHgtMHglMDR4KVxuIiwKKwkJCSAgc3RhcnQsIHN0YXJ0K2NvdW50LTEpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCVNBVkVfU1RBVEVfTUFTSyhTQVZBR0VfU0NTVEFSVF9TM0QsIHMzZC5uZXdfc2NzdGFydCwKKwkJCX5TQVZBR0VfU0NJU1NPUl9NQVNLX1MzRCk7CisJU0FWRV9TVEFURV9NQVNLKFNBVkFHRV9TQ0VORF9TM0QsIHMzZC5uZXdfc2NlbmQsCisJCQl+U0FWQUdFX1NDSVNTT1JfTUFTS19TM0QpOworCisJLyogaWYgYW55IHRleHR1cmUgcmVncyB3ZXJlIGNoYW5nZWQgLi4uICovCisJaWYgKHN0YXJ0IDw9IFNBVkFHRV9URVhDVFJMX1MzRCAmJgorCSAgICBzdGFydCtjb3VudCA+IFNBVkFHRV9URVhQQUxBRERSX1MzRCkgeworCQkvKiAuLi4gY2hlY2sgdGV4dHVyZSBzdGF0ZSAqLworCQlTQVZFX1NUQVRFKFNBVkFHRV9URVhDVFJMX1MzRCwgczNkLnRleGN0cmwpOworCQlTQVZFX1NUQVRFKFNBVkFHRV9URVhBRERSX1MzRCwgczNkLnRleGFkZHIpOworCQlpZiAoZGV2X3ByaXYtPnN0YXRlLnMzZC50ZXhjdHJsICYgU0FWQUdFX1RFWENUUkxfVEVYRU5fTUFTSykKKwkJCXJldHVybiBzYXZhZ2VfdmVyaWZ5X3RleGFkZHIoCisJCQkJZGV2X3ByaXYsIDAsIGRldl9wcml2LT5zdGF0ZS5zM2QudGV4YWRkcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2F2YWdlX3ZlcmlmeV9zdGF0ZV9zNChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJICB1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBjb3VudCwKKwkJCQkgIGNvbnN0IHVpbnQzMl90IF9fdXNlciAqcmVncykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzdGFydCA8IFNBVkFHRV9EUkFXTE9DQUxDVFJMX1M0IHx8CisJICAgIHN0YXJ0K2NvdW50LTEgPiBTQVZBR0VfVEVYQkxFTkRDT0xPUl9TNCkgeworCQlEUk1fRVJST1IoImludmFsaWQgcmVnaXN0ZXIgcmFuZ2UgKDB4JTA0eC0weCUwNHgpXG4iLAorCQkJICBzdGFydCwgc3RhcnQrY291bnQtMSk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJU0FWRV9TVEFURV9NQVNLKFNBVkFHRV9EUkFXQ1RSTDBfUzQsIHM0Lm5ld19kcmF3Y3RybDAsCisJCQl+U0FWQUdFX1NDSVNTT1JfTUFTS19TNCk7CisJU0FWRV9TVEFURV9NQVNLKFNBVkFHRV9EUkFXQ1RSTDFfUzQsIHM0Lm5ld19kcmF3Y3RybDEsCisJCQl+U0FWQUdFX1NDSVNTT1JfTUFTS19TNCk7CisKKwkvKiBpZiBhbnkgdGV4dHVyZSByZWdzIHdlcmUgY2hhbmdlZCAuLi4gKi8KKwlpZiAoc3RhcnQgPD0gU0FWQUdFX1RFWERFU0NSX1M0ICYmCisJICAgIHN0YXJ0K2NvdW50ID4gU0FWQUdFX1RFWFBBTEFERFJfUzQpIHsKKwkJLyogLi4uIGNoZWNrIHRleHR1cmUgc3RhdGUgKi8KKwkJU0FWRV9TVEFURShTQVZBR0VfVEVYREVTQ1JfUzQsIHM0LnRleGRlc2NyKTsKKwkJU0FWRV9TVEFURShTQVZBR0VfVEVYQUREUjBfUzQsIHM0LnRleGFkZHIwKTsKKwkJU0FWRV9TVEFURShTQVZBR0VfVEVYQUREUjFfUzQsIHM0LnRleGFkZHIxKTsKKwkJaWYgKGRldl9wcml2LT5zdGF0ZS5zNC50ZXhkZXNjciAmIFNBVkFHRV9URVhERVNDUl9URVgwRU5fTUFTSykKKwkJCXJldCB8PSBzYXZhZ2VfdmVyaWZ5X3RleGFkZHIoCisJCQkJZGV2X3ByaXYsIDAsIGRldl9wcml2LT5zdGF0ZS5zNC50ZXhhZGRyMCk7CisJCWlmIChkZXZfcHJpdi0+c3RhdGUuczQudGV4ZGVzY3IgJiBTQVZBR0VfVEVYREVTQ1JfVEVYMUVOX01BU0spCisJCQlyZXQgfD0gc2F2YWdlX3ZlcmlmeV90ZXhhZGRyKAorCQkJCWRldl9wcml2LCAxLCBkZXZfcHJpdi0+c3RhdGUuczQudGV4YWRkcjEpOworCX0KKworCXJldHVybiByZXQ7Cit9CisjdW5kZWYgU0FWRV9TVEFURQorI3VuZGVmIFNBVkVfU1RBVEVfTUFTSworCitzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF9zdGF0ZShkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpjbWRfaGVhZGVyLAorCQkJCSBjb25zdCB1aW50MzJfdCBfX3VzZXIgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gY21kX2hlYWRlci0+c3RhdGUuY291bnQ7CisJdW5zaWduZWQgaW50IHN0YXJ0ID0gY21kX2hlYWRlci0+c3RhdGUuc3RhcnQ7CisJdW5zaWduZWQgaW50IGNvdW50MiA9IDA7CisJdW5zaWduZWQgaW50IGJjaV9zaXplOworCWludCByZXQ7CisJRE1BX0xPQ0FMUzsKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJaWYgKERSTV9WRVJJRllBUkVBX1JFQUQocmVncywgY291bnQqNCkpCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwlpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSkgeworCQlyZXQgPSBzYXZhZ2VfdmVyaWZ5X3N0YXRlX3MzZChkZXZfcHJpdiwgc3RhcnQsIGNvdW50LCByZWdzKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKKwkJLyogc2Npc3NvciByZWdzIGFyZSBlbWl0dGVkIGluIHNhdmFnZV9kaXNwYXRjaF9kcmF3ICovCisJCWlmIChzdGFydCA8IFNBVkFHRV9TQ1NUQVJUX1MzRCkgeworCQkJaWYgKHN0YXJ0K2NvdW50ID4gU0FWQUdFX1NDRU5EX1MzRCsxKQorCQkJCWNvdW50MiA9IGNvdW50IC0gKFNBVkFHRV9TQ0VORF9TM0QrMSAtIHN0YXJ0KTsKKwkJCWlmIChzdGFydCtjb3VudCA+IFNBVkFHRV9TQ1NUQVJUX1MzRCkKKwkJCQljb3VudCA9IFNBVkFHRV9TQ1NUQVJUX1MzRCAtIHN0YXJ0OworCQl9IGVsc2UgaWYgKHN0YXJ0IDw9IFNBVkFHRV9TQ0VORF9TM0QpIHsKKwkJCWlmIChzdGFydCtjb3VudCA+IFNBVkFHRV9TQ0VORF9TM0QrMSkgeworCQkJCWNvdW50IC09IFNBVkFHRV9TQ0VORF9TM0QrMSAtIHN0YXJ0OworCQkJCXN0YXJ0ID0gU0FWQUdFX1NDRU5EX1MzRCsxOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBzYXZhZ2VfdmVyaWZ5X3N0YXRlX3M0KGRldl9wcml2LCBzdGFydCwgY291bnQsIHJlZ3MpOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCQkvKiBzY2lzc29yIHJlZ3MgYXJlIGVtaXR0ZWQgaW4gc2F2YWdlX2Rpc3BhdGNoX2RyYXcgKi8KKwkJaWYgKHN0YXJ0IDwgU0FWQUdFX0RSQVdDVFJMMF9TNCkgeworCQkJaWYgKHN0YXJ0K2NvdW50ID4gU0FWQUdFX0RSQVdDVFJMMV9TNCsxKQorCQkJCWNvdW50MiA9IGNvdW50IC0gKFNBVkFHRV9EUkFXQ1RSTDFfUzQrMSAtIHN0YXJ0KTsKKwkJCWlmIChzdGFydCtjb3VudCA+IFNBVkFHRV9EUkFXQ1RSTDBfUzQpCisJCQkJY291bnQgPSBTQVZBR0VfRFJBV0NUUkwwX1M0IC0gc3RhcnQ7CisJCX0gZWxzZSBpZiAoc3RhcnQgPD0gU0FWQUdFX0RSQVdDVFJMMV9TNCkgeworCQkJaWYgKHN0YXJ0K2NvdW50ID4gU0FWQUdFX0RSQVdDVFJMMV9TNCsxKSB7CisJCQkJY291bnQgLT0gU0FWQUdFX0RSQVdDVFJMMV9TNCsxIC0gc3RhcnQ7CisJCQkJc3RhcnQgPSBTQVZBR0VfRFJBV0NUUkwxX1M0KzE7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWJjaV9zaXplID0gY291bnQgKyAoY291bnQrMjU0KS8yNTUgKyBjb3VudDIgKyAoY291bnQyKzI1NCkvMjU1OworCisJaWYgKGNtZF9oZWFkZXItPnN0YXRlLmdsb2JhbCkgeworCQlCRUdJTl9ETUEoYmNpX3NpemUrMSk7CisJCURNQV9XUklURShCQ0lfQ01EX1dBSVQgfCBCQ0lfQ01EX1dBSVRfM0QpOworCQlkZXZfcHJpdi0+d2FpdGluZyA9IDE7CisJfSBlbHNlIHsKKwkJQkVHSU5fRE1BKGJjaV9zaXplKTsKKwl9CisKKwlkbyB7CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCXVuc2lnbmVkIGludCBuID0gY291bnQgPCAyNTUgPyBjb3VudCA6IDI1NTsKKwkJCURNQV9TRVRfUkVHSVNURVJTKHN0YXJ0LCBuKTsKKwkJCURNQV9DT1BZX0ZST01fVVNFUihyZWdzLCBuKTsKKwkJCWNvdW50IC09IG47CisJCQlzdGFydCArPSBuOworCQkJcmVncyArPSBuOworCQl9CisJCXN0YXJ0ICs9IDI7CisJCXJlZ3MgKz0gMjsKKwkJY291bnQgPSBjb3VudDI7CisJCWNvdW50MiA9IDA7CisJfSB3aGlsZSAoY291bnQpOworCisJRE1BX0NPTU1JVCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX2RtYV9wcmltKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkgICAgY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmNtZF9oZWFkZXIsCisJCQkJICAgIGNvbnN0IGRybV9idWZfdCAqZG1hYnVmKQoreworCXVuc2lnbmVkIGNoYXIgcmVvcmRlciA9IDA7CisJdW5zaWduZWQgaW50IHByaW0gPSBjbWRfaGVhZGVyLT5wcmltLnByaW07CisJdW5zaWduZWQgaW50IHNraXAgPSBjbWRfaGVhZGVyLT5wcmltLnNraXA7CisJdW5zaWduZWQgaW50IG4gPSBjbWRfaGVhZGVyLT5wcmltLmNvdW50OworCXVuc2lnbmVkIGludCBzdGFydCA9IGNtZF9oZWFkZXItPnByaW0uc3RhcnQ7CisJdW5zaWduZWQgaW50IGk7CisJQkNJX0xPQ0FMUzsKKworCWlmICghZG1hYnVmKSB7CisJICAgIERSTV9FUlJPUigiY2FsbGVkIHdpdGhvdXQgZG1hIGJ1ZmZlcnMhXG4iKTsKKwkgICAgcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIW4pCisJCXJldHVybiAwOworCisJc3dpdGNoIChwcmltKSB7CisJY2FzZSBTQVZBR0VfUFJJTV9UUklMSVNUXzIwMToKKwkJcmVvcmRlciA9IDE7CisJCXByaW0gPSBTQVZBR0VfUFJJTV9UUklMSVNUOworCWNhc2UgU0FWQUdFX1BSSU1fVFJJTElTVDoKKwkJaWYgKG4gJSAzICE9IDApIHsKKwkJCURSTV9FUlJPUigid3JvbmcgbnVtYmVyIG9mIHZlcnRpY2VzICV1IGluIFRSSUxJU1RcbiIsCisJCQkJICBuKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTQVZBR0VfUFJJTV9UUklTVFJJUDoKKwljYXNlIFNBVkFHRV9QUklNX1RSSUZBTjoKKwkJaWYgKG4gPCAzKSB7CisJCQlEUk1fRVJST1IoIndyb25nIG51bWJlciBvZiB2ZXJ0aWNlcyAldSBpbiBUUklGQU4vU1RSSVBcbiIsCisJCQkJICBuKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJpbnZhbGlkIHByaW1pdGl2ZSB0eXBlICV1XG4iLCBwcmltKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSkgeworCQlpZiAoc2tpcCAhPSAwKSB7CisJCQlEUk1fRVJST1IoImludmFsaWQgc2tpcCBmbGFncyAweCUwNHggZm9yIERNQVxuIiwKKwkJCQkgIHNraXApOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBzaXplID0gMTAgLSAoc2tpcCAmIDEpIC0gKHNraXAgPj4gMSAmIDEpIC0KKwkJCShza2lwID4+IDIgJiAxKSAtIChza2lwID4+IDMgJiAxKSAtIChza2lwID4+IDQgJiAxKSAtCisJCQkoc2tpcCA+PiA1ICYgMSkgLSAoc2tpcCA+PiA2ICYgMSkgLSAoc2tpcCA+PiA3ICYgMSk7CisJCWlmIChza2lwID4gU0FWQUdFX1NLSVBfQUxMX1M0IHx8IHNpemUgIT0gOCkgeworCQkJRFJNX0VSUk9SKCJpbnZhbGlkIHNraXAgZmxhZ3MgMHglMDR4IGZvciBETUFcbiIsCisJCQkJICBza2lwKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwkJaWYgKHJlb3JkZXIpIHsKKwkJCURSTV9FUlJPUigiVFJJTElTVF8yMDEgdXNlZCBvbiBTYXZhZ2U0IGhhcmR3YXJlXG4iKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwl9CisKKwlpZiAoc3RhcnQgKyBuID4gZG1hYnVmLT50b3RhbC8zMikgeworCQlEUk1fRVJST1IoInZlcnRleCBpbmRpY2VzICgldS0ldSkgb3V0IG9mIHJhbmdlICgwLSV1KVxuIiwKKwkJCSAgc3RhcnQsIHN0YXJ0ICsgbiAtIDEsIGRtYWJ1Zi0+dG90YWwvMzIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qIFZlcnRleCBETUEgZG9lc24ndCB3b3JrIHdpdGggY29tbWFuZCBETUEgYXQgdGhlIHNhbWUgdGltZSwKKwkgKiBzbyB3ZSB1c2UgQkNJXy4uLiB0byBzdWJtaXQgY29tbWFuZHMgaGVyZS4gRmx1c2ggYnVmZmVyZWQKKwkgKiBmYWtlZCBETUEgZmlyc3QuICovCisJRE1BX0ZMVVNIKCk7CisKKwlpZiAoZG1hYnVmLT5idXNfYWRkcmVzcyAhPSBkZXZfcHJpdi0+c3RhdGUuY29tbW9uLnZiYWRkcikgeworCQlCRUdJTl9CQ0koMik7CisJCUJDSV9TRVRfUkVHSVNURVJTKFNBVkFHRV9WRVJUQlVGQUREUiwgMSk7CisJCUJDSV9XUklURShkbWFidWYtPmJ1c19hZGRyZXNzIHwgZGV2X3ByaXYtPmRtYV90eXBlKTsKKwkJZGV2X3ByaXYtPnN0YXRlLmNvbW1vbi52YmFkZHIgPSBkbWFidWYtPmJ1c19hZGRyZXNzOworCX0KKwlpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSAmJiBkZXZfcHJpdi0+d2FpdGluZykgeworCQkvKiBXb3JrYXJvdW5kIGZvciB3aGF0IGxvb2tzIGxpa2UgYSBoYXJkd2FyZSBidWcuIElmIGEKKwkJICogV0FJVF8zRF9JRExFIHdhcyBlbWl0dGVkIHNvbWUgdGltZSBiZWZvcmUgdGhlCisJCSAqIGluZGV4ZWQgZHJhd2luZyBjb21tYW5kIHRoZW4gdGhlIGVuZ2luZSB3aWxsIGxvY2sKKwkJICogdXAuIFRoZXJlIGFyZSB0d28ga25vd24gd29ya2Fyb3VuZHM6CisJCSAqIFdBSVRfSURMRV9FTVBUWSBvciBlbWl0IGF0IGxlYXN0IDYzIE5PUHMuICovCisJCUJFR0lOX0JDSSg2Myk7CisJCWZvciAoaSA9IDA7IGkgPCA2MzsgKytpKQorCQkJQkNJX1dSSVRFKEJDSV9DTURfV0FJVCk7CisJCWRldl9wcml2LT53YWl0aW5nID0gMDsKKwl9CisKKwlwcmltIDw8PSAyNTsKKwl3aGlsZSAobiAhPSAwKSB7CisJCS8qIENhbiBlbWl0IHVwIHRvIDI1NSBpbmRpY2VzICg4NSB0cmlhbmdsZXMpIGF0IG9uY2UuICovCisJCXVuc2lnbmVkIGludCBjb3VudCA9IG4gPiAyNTUgPyAyNTUgOiBuOworCQlpZiAocmVvcmRlcikgeworCQkJLyogTmVlZCB0byByZW9yZGVyIGluZGljZXMgZm9yIGNvcnJlY3QgZmxhdAorCQkJICogc2hhZGluZyB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBjbG9jayBzZW5zZQorCQkJICogZm9yIGNvcnJlY3QgY3VsbGluZy4gT25seSBvbiBTYXZhZ2UzRC4gKi8KKwkJCWludCByZW9yZGVyWzNdID0gey0xLCAtMSwgLTF9OworCQkJcmVvcmRlcltzdGFydCUzXSA9IDI7CisKKwkJCUJFR0lOX0JDSSgoY291bnQrMSsxKS8yKTsKKwkJCUJDSV9EUkFXX0lORElDRVNfUzNEKGNvdW50LCBwcmltLCBzdGFydCsyKTsKKworCQkJZm9yIChpID0gc3RhcnQrMTsgaSsxIDwgc3RhcnQrY291bnQ7IGkgKz0gMikKKwkJCQlCQ0lfV1JJVEUoKGkgKyByZW9yZGVyW2kgJSAzXSkgfAorCQkJCQkgICgoaSsxICsgcmVvcmRlclsoaSsxKSAlIDNdKSA8PCAxNikpOworCQkJaWYgKGkgPCBzdGFydCtjb3VudCkKKwkJCQlCQ0lfV1JJVEUoaSArIHJlb3JkZXJbaSUzXSk7CisJCX0gZWxzZSBpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSkgeworCQkJQkVHSU5fQkNJKChjb3VudCsxKzEpLzIpOworCQkJQkNJX0RSQVdfSU5ESUNFU19TM0QoY291bnQsIHByaW0sIHN0YXJ0KTsKKworCQkJZm9yIChpID0gc3RhcnQrMTsgaSsxIDwgc3RhcnQrY291bnQ7IGkgKz0gMikKKwkJCQlCQ0lfV1JJVEUoaSB8ICgoaSsxKSA8PCAxNikpOworCQkJaWYgKGkgPCBzdGFydCtjb3VudCkKKwkJCQlCQ0lfV1JJVEUoaSk7CisJCX0gZWxzZSB7CisJCQlCRUdJTl9CQ0koKGNvdW50KzIrMSkvMik7CisJCQlCQ0lfRFJBV19JTkRJQ0VTX1M0KGNvdW50LCBwcmltLCBza2lwKTsKKworCQkJZm9yIChpID0gc3RhcnQ7IGkrMSA8IHN0YXJ0K2NvdW50OyBpICs9IDIpCisJCQkJQkNJX1dSSVRFKGkgfCAoKGkrMSkgPDwgMTYpKTsKKwkJCWlmIChpIDwgc3RhcnQrY291bnQpCisJCQkJQkNJX1dSSVRFKGkpOworCQl9CisKKwkJc3RhcnQgKz0gY291bnQ7CisJCW4gLT0gY291bnQ7CisKKwkJcHJpbSB8PSBCQ0lfQ01EX0RSQVdfQ09OVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYXZhZ2VfZGlzcGF0Y2hfdmJfcHJpbShkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJICAgY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmNtZF9oZWFkZXIsCisJCQkJICAgY29uc3QgdWludDMyX3QgX191c2VyICp2dHhidWYsCisJCQkJICAgdW5zaWduZWQgaW50IHZiX3NpemUsCisJCQkJICAgdW5zaWduZWQgaW50IHZiX3N0cmlkZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHJlb3JkZXIgPSAwOworCXVuc2lnbmVkIGludCBwcmltID0gY21kX2hlYWRlci0+cHJpbS5wcmltOworCXVuc2lnbmVkIGludCBza2lwID0gY21kX2hlYWRlci0+cHJpbS5za2lwOworCXVuc2lnbmVkIGludCBuID0gY21kX2hlYWRlci0+cHJpbS5jb3VudDsKKwl1bnNpZ25lZCBpbnQgc3RhcnQgPSBjbWRfaGVhZGVyLT5wcmltLnN0YXJ0OworCXVuc2lnbmVkIGludCB2dHhfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlETUFfTE9DQUxTOworCisJaWYgKCFuKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAocHJpbSkgeworCWNhc2UgU0FWQUdFX1BSSU1fVFJJTElTVF8yMDE6CisJCXJlb3JkZXIgPSAxOworCQlwcmltID0gU0FWQUdFX1BSSU1fVFJJTElTVDsKKwljYXNlIFNBVkFHRV9QUklNX1RSSUxJU1Q6CisJCWlmIChuICUgMyAhPSAwKSB7CisJCQlEUk1fRVJST1IoIndyb25nIG51bWJlciBvZiB2ZXJ0aWNlcyAldSBpbiBUUklMSVNUXG4iLAorCQkJCSAgbik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJCWJyZWFrOworCWNhc2UgU0FWQUdFX1BSSU1fVFJJU1RSSVA6CisJY2FzZSBTQVZBR0VfUFJJTV9UUklGQU46CisJCWlmIChuIDwgMykgeworCQkJRFJNX0VSUk9SKCJ3cm9uZyBudW1iZXIgb2YgdmVydGljZXMgJXUgaW4gVFJJRkFOL1NUUklQXG4iLAorCQkJCSAgbik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiaW52YWxpZCBwcmltaXRpdmUgdHlwZSAldVxuIiwgcHJpbSk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKFMzX1NBVkFHRTNEX1NFUklFUyhkZXZfcHJpdi0+Y2hpcHNldCkpIHsKKwkJaWYgKHNraXAgPiBTQVZBR0VfU0tJUF9BTExfUzNEKSB7CisJCQlEUk1fRVJST1IoImludmFsaWQgc2tpcCBmbGFncyAweCUwNHhcbiIsIHNraXApOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQl2dHhfc2l6ZSA9IDg7IC8qIGZ1bGwgdmVydGV4ICovCisJfSBlbHNlIHsKKwkJaWYgKHNraXAgPiBTQVZBR0VfU0tJUF9BTExfUzQpIHsKKwkJCURSTV9FUlJPUigiaW52YWxpZCBza2lwIGZsYWdzIDB4JTA0eFxuIiwgc2tpcCk7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJCXZ0eF9zaXplID0gMTA7IC8qIGZ1bGwgdmVydGV4ICovCisJfQorCisJdnR4X3NpemUgLT0gKHNraXAgJiAxKSArIChza2lwID4+IDEgJiAxKSArCisJCShza2lwID4+IDIgJiAxKSArIChza2lwID4+IDMgJiAxKSArIChza2lwID4+IDQgJiAxKSArCisJCShza2lwID4+IDUgJiAxKSArIChza2lwID4+IDYgJiAxKSArIChza2lwID4+IDcgJiAxKTsKKworCWlmICh2dHhfc2l6ZSA+IHZiX3N0cmlkZSkgeworCQlEUk1fRVJST1IoInZlcnRleCBzaXplIGdyZWF0ZXIgdGhhbiB2YiBzdHJpZGUgKCV1ID4gJXUpXG4iLAorCQkJICB2dHhfc2l6ZSwgdmJfc3RyaWRlKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoc3RhcnQgKyBuID4gdmJfc2l6ZSAvICh2Yl9zdHJpZGUqNCkpIHsKKwkJRFJNX0VSUk9SKCJ2ZXJ0ZXggaW5kaWNlcyAoJXUtJXUpIG91dCBvZiByYW5nZSAoMC0ldSlcbiIsCisJCQkgIHN0YXJ0LCBzdGFydCArIG4gLSAxLCB2Yl9zaXplIC8gKHZiX3N0cmlkZSo0KSk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJcHJpbSA8PD0gMjU7CisJd2hpbGUgKG4gIT0gMCkgeworCQkvKiBDYW4gZW1pdCB1cCB0byAyNTUgdmVydGljZXMgKDg1IHRyaWFuZ2xlcykgYXQgb25jZS4gKi8KKwkJdW5zaWduZWQgaW50IGNvdW50ID0gbiA+IDI1NSA/IDI1NSA6IG47CisJCWlmIChyZW9yZGVyKSB7CisJCQkvKiBOZWVkIHRvIHJlb3JkZXIgdmVydGljZXMgZm9yIGNvcnJlY3QgZmxhdAorCQkJICogc2hhZGluZyB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBjbG9jayBzZW5zZQorCQkJICogZm9yIGNvcnJlY3QgY3VsbGluZy4gT25seSBvbiBTYXZhZ2UzRC4gKi8KKwkJCWludCByZW9yZGVyWzNdID0gey0xLCAtMSwgLTF9OworCQkJcmVvcmRlcltzdGFydCUzXSA9IDI7CisKKwkJCUJFR0lOX0RNQShjb3VudCp2dHhfc2l6ZSsxKTsKKwkJCURNQV9EUkFXX1BSSU1JVElWRShjb3VudCwgcHJpbSwgc2tpcCk7CisKKwkJCWZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQrY291bnQ7ICsraSkgeworCQkJCXVuc2lnbmVkIGludCBqID0gaSArIHJlb3JkZXJbaSAlIDNdOworCQkJCURNQV9DT1BZX0ZST01fVVNFUigmdnR4YnVmW3ZiX3N0cmlkZSpqXSwKKwkJCQkJCSAgIHZ0eF9zaXplKTsKKwkJCX0KKworCQkJRE1BX0NPTU1JVCgpOworCQl9IGVsc2UgeworCQkJQkVHSU5fRE1BKGNvdW50KnZ0eF9zaXplKzEpOworCQkJRE1BX0RSQVdfUFJJTUlUSVZFKGNvdW50LCBwcmltLCBza2lwKTsKKworCQkJaWYgKHZiX3N0cmlkZSA9PSB2dHhfc2l6ZSkgeworCQkJCURNQV9DT1BZX0ZST01fVVNFUigmdnR4YnVmW3ZiX3N0cmlkZSpzdGFydF0sCisJCQkJCQkgICB2dHhfc2l6ZSpjb3VudCk7CisJCQl9IGVsc2UgeworCQkJCWZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQrY291bnQ7ICsraSkgeworCQkJCQlETUFfQ09QWV9GUk9NX1VTRVIoCisJCQkJCQkmdnR4YnVmW3ZiX3N0cmlkZSppXSwKKwkJCQkJCXZ0eF9zaXplKTsKKwkJCQl9CisJCQl9CisKKwkJCURNQV9DT01NSVQoKTsKKwkJfQorCisJCXN0YXJ0ICs9IGNvdW50OworCQluIC09IGNvdW50OworCisJCXByaW0gfD0gQkNJX0NNRF9EUkFXX0NPTlQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX2RtYV9pZHgoZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCSAgIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpjbWRfaGVhZGVyLAorCQkJCSAgIGNvbnN0IHVpbnQxNl90IF9fdXNlciAqdXNyX2lkeCwKKwkJCQkgICBjb25zdCBkcm1fYnVmX3QgKmRtYWJ1ZikKK3sKKwl1bnNpZ25lZCBjaGFyIHJlb3JkZXIgPSAwOworCXVuc2lnbmVkIGludCBwcmltID0gY21kX2hlYWRlci0+aWR4LnByaW07CisJdW5zaWduZWQgaW50IHNraXAgPSBjbWRfaGVhZGVyLT5pZHguc2tpcDsKKwl1bnNpZ25lZCBpbnQgbiA9IGNtZF9oZWFkZXItPmlkeC5jb3VudDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlCQ0lfTE9DQUxTOworCisJaWYgKCFkbWFidWYpIHsKKwkgICAgRFJNX0VSUk9SKCJjYWxsZWQgd2l0aG91dCBkbWEgYnVmZmVycyFcbiIpOworCSAgICByZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICghbikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHByaW0pIHsKKwljYXNlIFNBVkFHRV9QUklNX1RSSUxJU1RfMjAxOgorCQlyZW9yZGVyID0gMTsKKwkJcHJpbSA9IFNBVkFHRV9QUklNX1RSSUxJU1Q7CisJY2FzZSBTQVZBR0VfUFJJTV9UUklMSVNUOgorCQlpZiAobiAlIDMgIT0gMCkgeworCQkJRFJNX0VSUk9SKCJ3cm9uZyBudW1iZXIgb2YgaW5kaWNlcyAldSBpbiBUUklMSVNUXG4iLAorCQkJCSAgbik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJCWJyZWFrOworCWNhc2UgU0FWQUdFX1BSSU1fVFJJU1RSSVA6CisJY2FzZSBTQVZBR0VfUFJJTV9UUklGQU46CisJCWlmIChuIDwgMykgeworCQkJRFJNX0VSUk9SKCJ3cm9uZyBudW1iZXIgb2YgaW5kaWNlcyAldSBpbiBUUklGQU4vU1RSSVBcbiIsCisJCQkJICBuKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJpbnZhbGlkIHByaW1pdGl2ZSB0eXBlICV1XG4iLCBwcmltKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSkgeworCQlpZiAoc2tpcCAhPSAwKSB7CisJCQlEUk1fRVJST1IoImludmFsaWQgc2tpcCBmbGFncyAweCUwNHggZm9yIERNQVxuIiwKKwkJCQkgIHNraXApOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBzaXplID0gMTAgLSAoc2tpcCAmIDEpIC0gKHNraXAgPj4gMSAmIDEpIC0KKwkJCShza2lwID4+IDIgJiAxKSAtIChza2lwID4+IDMgJiAxKSAtIChza2lwID4+IDQgJiAxKSAtCisJCQkoc2tpcCA+PiA1ICYgMSkgLSAoc2tpcCA+PiA2ICYgMSkgLSAoc2tpcCA+PiA3ICYgMSk7CisJCWlmIChza2lwID4gU0FWQUdFX1NLSVBfQUxMX1M0IHx8IHNpemUgIT0gOCkgeworCQkJRFJNX0VSUk9SKCJpbnZhbGlkIHNraXAgZmxhZ3MgMHglMDR4IGZvciBETUFcbiIsCisJCQkJICBza2lwKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwkJaWYgKHJlb3JkZXIpIHsKKwkJCURSTV9FUlJPUigiVFJJTElTVF8yMDEgdXNlZCBvbiBTYXZhZ2U0IGhhcmR3YXJlXG4iKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwl9CisKKwkvKiBWZXJ0ZXggRE1BIGRvZXNuJ3Qgd29yayB3aXRoIGNvbW1hbmQgRE1BIGF0IHRoZSBzYW1lIHRpbWUsCisJICogc28gd2UgdXNlIEJDSV8uLi4gdG8gc3VibWl0IGNvbW1hbmRzIGhlcmUuIEZsdXNoIGJ1ZmZlcmVkCisJICogZmFrZWQgRE1BIGZpcnN0LiAqLworCURNQV9GTFVTSCgpOworCisJaWYgKGRtYWJ1Zi0+YnVzX2FkZHJlc3MgIT0gZGV2X3ByaXYtPnN0YXRlLmNvbW1vbi52YmFkZHIpIHsKKwkJQkVHSU5fQkNJKDIpOworCQlCQ0lfU0VUX1JFR0lTVEVSUyhTQVZBR0VfVkVSVEJVRkFERFIsIDEpOworCQlCQ0lfV1JJVEUoZG1hYnVmLT5idXNfYWRkcmVzcyB8IGRldl9wcml2LT5kbWFfdHlwZSk7CisJCWRldl9wcml2LT5zdGF0ZS5jb21tb24udmJhZGRyID0gZG1hYnVmLT5idXNfYWRkcmVzczsKKwl9CisJaWYgKFMzX1NBVkFHRTNEX1NFUklFUyhkZXZfcHJpdi0+Y2hpcHNldCkgJiYgZGV2X3ByaXYtPndhaXRpbmcpIHsKKwkJLyogV29ya2Fyb3VuZCBmb3Igd2hhdCBsb29rcyBsaWtlIGEgaGFyZHdhcmUgYnVnLiBJZiBhCisJCSAqIFdBSVRfM0RfSURMRSB3YXMgZW1pdHRlZCBzb21lIHRpbWUgYmVmb3JlIHRoZQorCQkgKiBpbmRleGVkIGRyYXdpbmcgY29tbWFuZCB0aGVuIHRoZSBlbmdpbmUgd2lsbCBsb2NrCisJCSAqIHVwLiBUaGVyZSBhcmUgdHdvIGtub3duIHdvcmthcm91bmRzOgorCQkgKiBXQUlUX0lETEVfRU1QVFkgb3IgZW1pdCBhdCBsZWFzdCA2MyBOT1BzLiAqLworCQlCRUdJTl9CQ0koNjMpOworCQlmb3IgKGkgPSAwOyBpIDwgNjM7ICsraSkKKwkJCUJDSV9XUklURShCQ0lfQ01EX1dBSVQpOworCQlkZXZfcHJpdi0+d2FpdGluZyA9IDA7CisJfQorCisJcHJpbSA8PD0gMjU7CisJd2hpbGUgKG4gIT0gMCkgeworCQkvKiBDYW4gZW1pdCB1cCB0byAyNTUgaW5kaWNlcyAoODUgdHJpYW5nbGVzKSBhdCBvbmNlLiAqLworCQl1bnNpZ25lZCBpbnQgY291bnQgPSBuID4gMjU1ID8gMjU1IDogbjsKKwkJLyogSXMgaXQgb2sgdG8gYWxsb2NhdGUgNTEwIGJ5dGVzIG9uIHRoZSBzdGFjayBpbiBhbiBpb2N0bD8gKi8KKwkJdWludDE2X3QgaWR4WzI1NV07CisKKwkJLyogQ29weSBhbmQgY2hlY2sgaW5kaWNlcyAqLworCQlEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKGlkeCwgdXNyX2lkeCwgY291bnQqMik7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCQlpZiAoaWR4W2ldID4gZG1hYnVmLT50b3RhbC8zMikgeworCQkJCURSTV9FUlJPUigiaWR4WyV1XT0ldSBvdXQgb2YgcmFuZ2UgKDAtJXUpXG4iLAorCQkJCQkgIGksIGlkeFtpXSwgZG1hYnVmLT50b3RhbC8zMik7CisJCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJCX0KKwkJfQorCisJCWlmIChyZW9yZGVyKSB7CisJCQkvKiBOZWVkIHRvIHJlb3JkZXIgaW5kaWNlcyBmb3IgY29ycmVjdCBmbGF0CisJCQkgKiBzaGFkaW5nIHdoaWxlIHByZXNlcnZpbmcgdGhlIGNsb2NrIHNlbnNlCisJCQkgKiBmb3IgY29ycmVjdCBjdWxsaW5nLiBPbmx5IG9uIFNhdmFnZTNELiAqLworCQkJaW50IHJlb3JkZXJbM10gPSB7MiwgLTEsIC0xfTsKKworCQkJQkVHSU5fQkNJKChjb3VudCsxKzEpLzIpOworCQkJQkNJX0RSQVdfSU5ESUNFU19TM0QoY291bnQsIHByaW0sIGlkeFsyXSk7CisKKwkJCWZvciAoaSA9IDE7IGkrMSA8IGNvdW50OyBpICs9IDIpCisJCQkJQkNJX1dSSVRFKGlkeFtpICsgcmVvcmRlcltpICUgM11dIHwKKwkJCQkJICAoaWR4W2krMSArIHJlb3JkZXJbKGkrMSkgJSAzXV0gPDwgMTYpKTsKKwkJCWlmIChpIDwgY291bnQpCisJCQkJQkNJX1dSSVRFKGlkeFtpICsgcmVvcmRlcltpJTNdXSk7CisJCX0gZWxzZSBpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSkgeworCQkJQkVHSU5fQkNJKChjb3VudCsxKzEpLzIpOworCQkJQkNJX0RSQVdfSU5ESUNFU19TM0QoY291bnQsIHByaW0sIGlkeFswXSk7CisKKwkJCWZvciAoaSA9IDE7IGkrMSA8IGNvdW50OyBpICs9IDIpCisJCQkJQkNJX1dSSVRFKGlkeFtpXSB8IChpZHhbaSsxXSA8PCAxNikpOworCQkJaWYgKGkgPCBjb3VudCkKKwkJCQlCQ0lfV1JJVEUoaWR4W2ldKTsKKwkJfSBlbHNlIHsKKwkJCUJFR0lOX0JDSSgoY291bnQrMisxKS8yKTsKKwkJCUJDSV9EUkFXX0lORElDRVNfUzQoY291bnQsIHByaW0sIHNraXApOworCisJCQlmb3IgKGkgPSAwOyBpKzEgPCBjb3VudDsgaSArPSAyKQorCQkJCUJDSV9XUklURShpZHhbaV0gfCAoaWR4W2krMV0gPDwgMTYpKTsKKwkJCWlmIChpIDwgY291bnQpCisJCQkJQkNJX1dSSVRFKGlkeFtpXSk7CisJCX0KKworCQl1c3JfaWR4ICs9IGNvdW50OworCQluIC09IGNvdW50OworCisJCXByaW0gfD0gQkNJX0NNRF9EUkFXX0NPTlQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX3ZiX2lkeChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJICBjb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqY21kX2hlYWRlciwKKwkJCQkgIGNvbnN0IHVpbnQxNl90IF9fdXNlciAqdXNyX2lkeCwKKwkJCQkgIGNvbnN0IHVpbnQzMl90IF9fdXNlciAqdnR4YnVmLAorCQkJCSAgdW5zaWduZWQgaW50IHZiX3NpemUsCisJCQkJICB1bnNpZ25lZCBpbnQgdmJfc3RyaWRlKQoreworCXVuc2lnbmVkIGNoYXIgcmVvcmRlciA9IDA7CisJdW5zaWduZWQgaW50IHByaW0gPSBjbWRfaGVhZGVyLT5pZHgucHJpbTsKKwl1bnNpZ25lZCBpbnQgc2tpcCA9IGNtZF9oZWFkZXItPmlkeC5za2lwOworCXVuc2lnbmVkIGludCBuID0gY21kX2hlYWRlci0+aWR4LmNvdW50OworCXVuc2lnbmVkIGludCB2dHhfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlETUFfTE9DQUxTOworCisJaWYgKCFuKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAocHJpbSkgeworCWNhc2UgU0FWQUdFX1BSSU1fVFJJTElTVF8yMDE6CisJCXJlb3JkZXIgPSAxOworCQlwcmltID0gU0FWQUdFX1BSSU1fVFJJTElTVDsKKwljYXNlIFNBVkFHRV9QUklNX1RSSUxJU1Q6CisJCWlmIChuICUgMyAhPSAwKSB7CisJCQlEUk1fRVJST1IoIndyb25nIG51bWJlciBvZiBpbmRpY2VzICV1IGluIFRSSUxJU1RcbiIsCisJCQkJICBuKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTQVZBR0VfUFJJTV9UUklTVFJJUDoKKwljYXNlIFNBVkFHRV9QUklNX1RSSUZBTjoKKwkJaWYgKG4gPCAzKSB7CisJCQlEUk1fRVJST1IoIndyb25nIG51bWJlciBvZiBpbmRpY2VzICV1IGluIFRSSUZBTi9TVFJJUFxuIiwKKwkJCQkgIG4pOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoImludmFsaWQgcHJpbWl0aXZlIHR5cGUgJXVcbiIsIHByaW0pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmIChTM19TQVZBR0UzRF9TRVJJRVMoZGV2X3ByaXYtPmNoaXBzZXQpKSB7CisJCWlmIChza2lwID4gU0FWQUdFX1NLSVBfQUxMX1MzRCkgeworCQkJRFJNX0VSUk9SKCJpbnZhbGlkIHNraXAgZmxhZ3MgMHglMDR4XG4iLCBza2lwKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwkJdnR4X3NpemUgPSA4OyAvKiBmdWxsIHZlcnRleCAqLworCX0gZWxzZSB7CisJCWlmIChza2lwID4gU0FWQUdFX1NLSVBfQUxMX1M0KSB7CisJCQlEUk1fRVJST1IoImludmFsaWQgc2tpcCBmbGFncyAweCUwNHhcbiIsIHNraXApOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQl2dHhfc2l6ZSA9IDEwOyAvKiBmdWxsIHZlcnRleCAqLworCX0KKworCXZ0eF9zaXplIC09IChza2lwICYgMSkgKyAoc2tpcCA+PiAxICYgMSkgKworCQkoc2tpcCA+PiAyICYgMSkgKyAoc2tpcCA+PiAzICYgMSkgKyAoc2tpcCA+PiA0ICYgMSkgKworCQkoc2tpcCA+PiA1ICYgMSkgKyAoc2tpcCA+PiA2ICYgMSkgKyAoc2tpcCA+PiA3ICYgMSk7CisKKwlpZiAodnR4X3NpemUgPiB2Yl9zdHJpZGUpIHsKKwkJRFJNX0VSUk9SKCJ2ZXJ0ZXggc2l6ZSBncmVhdGVyIHRoYW4gdmIgc3RyaWRlICgldSA+ICV1KVxuIiwKKwkJCSAgdnR4X3NpemUsIHZiX3N0cmlkZSk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJcHJpbSA8PD0gMjU7CisJd2hpbGUgKG4gIT0gMCkgeworCQkvKiBDYW4gZW1pdCB1cCB0byAyNTUgdmVydGljZXMgKDg1IHRyaWFuZ2xlcykgYXQgb25jZS4gKi8KKwkJdW5zaWduZWQgaW50IGNvdW50ID0gbiA+IDI1NSA/IDI1NSA6IG47CisJCS8qIElzIGl0IG9rIHRvIGFsbG9jYXRlIDUxMCBieXRlcyBvbiB0aGUgc3RhY2sgaW4gYW4gaW9jdGw/ICovCisJCXVpbnQxNl90IGlkeFsyNTVdOworCisJCS8qIENvcHkgYW5kIGNoZWNrIGluZGljZXMgKi8KKwkJRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRChpZHgsIHVzcl9pZHgsIGNvdW50KjIpOworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQkJaWYgKGlkeFtpXSA+IHZiX3NpemUgLyAodmJfc3RyaWRlKjQpKSB7CisJCQkJRFJNX0VSUk9SKCJpZHhbJXVdPSV1IG91dCBvZiByYW5nZSAoMC0ldSlcbiIsCisJCQkJCSAgaSwgaWR4W2ldLCAgdmJfc2l6ZSAvICh2Yl9zdHJpZGUqNCkpOworCQkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCQl9CisJCX0KKworCQlpZiAocmVvcmRlcikgeworCQkJLyogTmVlZCB0byByZW9yZGVyIHZlcnRpY2VzIGZvciBjb3JyZWN0IGZsYXQKKwkJCSAqIHNoYWRpbmcgd2hpbGUgcHJlc2VydmluZyB0aGUgY2xvY2sgc2Vuc2UKKwkJCSAqIGZvciBjb3JyZWN0IGN1bGxpbmcuIE9ubHkgb24gU2F2YWdlM0QuICovCisJCQlpbnQgcmVvcmRlclszXSA9IHsyLCAtMSwgLTF9OworCisJCQlCRUdJTl9ETUEoY291bnQqdnR4X3NpemUrMSk7CisJCQlETUFfRFJBV19QUklNSVRJVkUoY291bnQsIHByaW0sIHNraXApOworCisJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQkJCXVuc2lnbmVkIGludCBqID0gaWR4W2kgKyByZW9yZGVyW2kgJSAzXV07CisJCQkJRE1BX0NPUFlfRlJPTV9VU0VSKCZ2dHhidWZbdmJfc3RyaWRlKmpdLAorCQkJCQkJICAgdnR4X3NpemUpOworCQkJfQorCisJCQlETUFfQ09NTUlUKCk7CisJCX0gZWxzZSB7CisJCQlCRUdJTl9ETUEoY291bnQqdnR4X3NpemUrMSk7CisJCQlETUFfRFJBV19QUklNSVRJVkUoY291bnQsIHByaW0sIHNraXApOworCisJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQkJCXVuc2lnbmVkIGludCBqID0gaWR4W2ldOworCQkJCURNQV9DT1BZX0ZST01fVVNFUigmdnR4YnVmW3ZiX3N0cmlkZSpqXSwKKwkJCQkJCSAgIHZ0eF9zaXplKTsKKwkJCX0KKworCQkJRE1BX0NPTU1JVCgpOworCQl9CisKKwkJdXNyX2lkeCArPSBjb3VudDsKKwkJbiAtPSBjb3VudDsKKworCQlwcmltIHw9IEJDSV9DTURfRFJBV19DT05UOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF9jbGVhcihkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpjbWRfaGVhZGVyLAorCQkJCSBjb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCBfX3VzZXIgKmRhdGEsCisJCQkJIHVuc2lnbmVkIGludCBuYm94LAorCQkJCSBjb25zdCBkcm1fY2xpcF9yZWN0X3QgX191c2VyICp1c3JfYm94ZXMpCit7CisJdW5zaWduZWQgaW50IGZsYWdzID0gY21kX2hlYWRlci0+Y2xlYXIwLmZsYWdzLCBtYXNrLCB2YWx1ZTsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfY21kOworCXVuc2lnbmVkIGludCBpLCBuYnVmczsKKwlETUFfTE9DQUxTOworCisJaWYgKG5ib3ggPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlEUk1fR0VUX1VTRVJfVU5DSEVDS0VEKG1hc2ssICYoKGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90KilkYXRhKQorCQkJICAgICAgIC0+Y2xlYXIxLm1hc2spOworCURSTV9HRVRfVVNFUl9VTkNIRUNLRUQodmFsdWUsICYoKGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90KilkYXRhKQorCQkJICAgICAgIC0+Y2xlYXIxLnZhbHVlKTsKKworCWNsZWFyX2NtZCA9IEJDSV9DTURfUkVDVCB8IEJDSV9DTURfUkVDVF9YUCB8IEJDSV9DTURfUkVDVF9ZUCB8CisJCUJDSV9DTURfU0VORF9DT0xPUiB8IEJDSV9DTURfREVTVF9QQkRfTkVXOworCUJDSV9DTURfU0VUX1JPUChjbGVhcl9jbWQsMHhDQyk7CisKKwluYnVmcyA9ICgoZmxhZ3MgJiBTQVZBR0VfRlJPTlQpID8gMSA6IDApICsKKwkJKChmbGFncyAmIFNBVkFHRV9CQUNLKSA/IDEgOiAwKSArCisJCSgoZmxhZ3MgJiBTQVZBR0VfREVQVEgpID8gMSA6IDApOworCWlmIChuYnVmcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChtYXNrICE9IDB4ZmZmZmZmZmYpIHsKKwkJLyogc2V0IG1hc2sgKi8KKwkJQkVHSU5fRE1BKDIpOworCQlETUFfU0VUX1JFR0lTVEVSUyhTQVZBR0VfQklUUExBTkVXVE1BU0ssIDEpOworCQlETUFfV1JJVEUobWFzayk7CisJCURNQV9DT01NSVQoKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG5ib3g7ICsraSkgeworCQlkcm1fY2xpcF9yZWN0X3QgYm94OworCQl1bnNpZ25lZCBpbnQgeCwgeSwgdywgaDsKKwkJdW5zaWduZWQgaW50IGJ1ZjsKKwkJRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRCgmYm94LCAmdXNyX2JveGVzW2ldLCBzaXplb2YoYm94KSk7CisJCXggPSBib3gueDEsIHkgPSBib3gueTE7CisJCXcgPSBib3gueDIgLSBib3gueDE7CisJCWggPSBib3gueTIgLSBib3gueTE7CisJCUJFR0lOX0RNQShuYnVmcyo2KTsKKwkJZm9yIChidWYgPSBTQVZBR0VfRlJPTlQ7IGJ1ZiA8PSBTQVZBR0VfREVQVEg7IGJ1ZiA8PD0gMSkgeworCQkJaWYgKCEoZmxhZ3MgJiBidWYpKQorCQkJCWNvbnRpbnVlOworCQkJRE1BX1dSSVRFKGNsZWFyX2NtZCk7CisJCQlzd2l0Y2goYnVmKSB7CisJCQljYXNlIFNBVkFHRV9GUk9OVDoKKwkJCQlETUFfV1JJVEUoZGV2X3ByaXYtPmZyb250X29mZnNldCk7CisJCQkJRE1BX1dSSVRFKGRldl9wcml2LT5mcm9udF9iZCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNBVkFHRV9CQUNLOgorCQkJCURNQV9XUklURShkZXZfcHJpdi0+YmFja19vZmZzZXQpOworCQkJCURNQV9XUklURShkZXZfcHJpdi0+YmFja19iZCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNBVkFHRV9ERVBUSDoKKwkJCQlETUFfV1JJVEUoZGV2X3ByaXYtPmRlcHRoX29mZnNldCk7CisJCQkJRE1BX1dSSVRFKGRldl9wcml2LT5kZXB0aF9iZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlETUFfV1JJVEUodmFsdWUpOworCQkJRE1BX1dSSVRFKEJDSV9YX1koeCwgeSkpOworCQkJRE1BX1dSSVRFKEJDSV9XX0godywgaCkpOworCQl9CisJCURNQV9DT01NSVQoKTsKKwl9CisJaWYgKG1hc2sgIT0gMHhmZmZmZmZmZikgeworCQkvKiByZXNldCBtYXNrICovCisJCUJFR0lOX0RNQSgyKTsKKwkJRE1BX1NFVF9SRUdJU1RFUlMoU0FWQUdFX0JJVFBMQU5FV1RNQVNLLCAxKTsKKwkJRE1BX1dSSVRFKDB4ZmZmZmZmZmYpOworCQlETUFfQ09NTUlUKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX3N3YXAoZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCXVuc2lnbmVkIGludCBuYm94LAorCQkJCWNvbnN0IGRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKnVzcl9ib3hlcykKK3sKKwl1bnNpZ25lZCBpbnQgc3dhcF9jbWQ7CisJdW5zaWduZWQgaW50IGk7CisJRE1BX0xPQ0FMUzsKKworCWlmIChuYm94ID09IDApCisJCXJldHVybiAwOworCisJc3dhcF9jbWQgPSBCQ0lfQ01EX1JFQ1QgfCBCQ0lfQ01EX1JFQ1RfWFAgfCBCQ0lfQ01EX1JFQ1RfWVAgfAorCQlCQ0lfQ01EX1NSQ19QQkRfQ09MT1JfTkVXIHwgQkNJX0NNRF9ERVNUX0dCRDsKKwlCQ0lfQ01EX1NFVF9ST1Aoc3dhcF9jbWQsMHhDQyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJveDsgKytpKSB7CisJCWRybV9jbGlwX3JlY3RfdCBib3g7CisJCURSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoJmJveCwgJnVzcl9ib3hlc1tpXSwgc2l6ZW9mKGJveCkpOworCisJCUJFR0lOX0RNQSg2KTsKKwkJRE1BX1dSSVRFKHN3YXBfY21kKTsKKwkJRE1BX1dSSVRFKGRldl9wcml2LT5iYWNrX29mZnNldCk7CisJCURNQV9XUklURShkZXZfcHJpdi0+YmFja19iZCk7CisJCURNQV9XUklURShCQ0lfWF9ZKGJveC54MSwgYm94LnkxKSk7CisJCURNQV9XUklURShCQ0lfWF9ZKGJveC54MSwgYm94LnkxKSk7CisJCURNQV9XUklURShCQ0lfV19IKGJveC54Mi1ib3gueDEsIGJveC55Mi1ib3gueTEpKTsKKwkJRE1BX0NPTU1JVCgpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF9kcmF3KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQljb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCBfX3VzZXIgKnN0YXJ0LAorCQkJCWNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90IF9fdXNlciAqZW5kLAorCQkJCWNvbnN0IGRybV9idWZfdCAqZG1hYnVmLAorCQkJCWNvbnN0IHVuc2lnbmVkIGludCBfX3VzZXIgKnVzcl92dHhidWYsCisJCQkJdW5zaWduZWQgaW50IHZiX3NpemUsIHVuc2lnbmVkIGludCB2Yl9zdHJpZGUsCisJCQkJdW5zaWduZWQgaW50IG5ib3gsCisJCQkJY29uc3QgZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqdXNyX2JveGVzKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCWludCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJveDsgKytpKSB7CisJCWRybV9jbGlwX3JlY3RfdCBib3g7CisJCWNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90IF9fdXNlciAqdXNyX2NtZGJ1ZjsKKwkJRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRCgmYm94LCAmdXNyX2JveGVzW2ldLCBzaXplb2YoYm94KSk7CisJCWRldl9wcml2LT5lbWl0X2NsaXBfcmVjdChkZXZfcHJpdiwgJmJveCk7CisKKwkJdXNyX2NtZGJ1ZiA9IHN0YXJ0OworCQl3aGlsZSAodXNyX2NtZGJ1ZiA8IGVuZCkgeworCQkJZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgY21kX2hlYWRlcjsKKwkJCURSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoJmNtZF9oZWFkZXIsIHVzcl9jbWRidWYsCisJCQkJCQkgICAgIHNpemVvZihjbWRfaGVhZGVyKSk7CisJCQl1c3JfY21kYnVmKys7CisJCQlzd2l0Y2ggKGNtZF9oZWFkZXIuY21kLmNtZCkgeworCQkJY2FzZSBTQVZBR0VfQ01EX0RNQV9QUklNOgorCQkJCXJldCA9IHNhdmFnZV9kaXNwYXRjaF9kbWFfcHJpbSgKKwkJCQkJZGV2X3ByaXYsICZjbWRfaGVhZGVyLCBkbWFidWYpOworCQkJCWJyZWFrOworCQkJY2FzZSBTQVZBR0VfQ01EX1ZCX1BSSU06CisJCQkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX3ZiX3ByaW0oCisJCQkJCWRldl9wcml2LCAmY21kX2hlYWRlciwKKwkJCQkJKGNvbnN0IHVpbnQzMl90IF9fdXNlciAqKXVzcl92dHhidWYsCisJCQkJCXZiX3NpemUsIHZiX3N0cmlkZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNBVkFHRV9DTURfRE1BX0lEWDoKKwkJCQlqID0gKGNtZF9oZWFkZXIuaWR4LmNvdW50ICsgMykgLyA0OworCQkJCS8qIGogd2FzIGNoZWNrIGluIHNhdmFnZV9iY2lfY21kYnVmICovCisJCQkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX2RtYV9pZHgoCisJCQkJCWRldl9wcml2LCAmY21kX2hlYWRlciwKKwkJCQkJKGNvbnN0IHVpbnQxNl90IF9fdXNlciAqKXVzcl9jbWRidWYsCisJCQkJCWRtYWJ1Zik7CisJCQkJdXNyX2NtZGJ1ZiArPSBqOworCQkJCWJyZWFrOworCQkJY2FzZSBTQVZBR0VfQ01EX1ZCX0lEWDoKKwkJCQlqID0gKGNtZF9oZWFkZXIuaWR4LmNvdW50ICsgMykgLyA0OworCQkJCS8qIGogd2FzIGNoZWNrIGluIHNhdmFnZV9iY2lfY21kYnVmICovCisJCQkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX3ZiX2lkeCgKKwkJCQkJZGV2X3ByaXYsICZjbWRfaGVhZGVyLAorCQkJCQkoY29uc3QgdWludDE2X3QgX191c2VyICopdXNyX2NtZGJ1ZiwKKwkJCQkJKGNvbnN0IHVpbnQzMl90IF9fdXNlciAqKXVzcl92dHhidWYsCisJCQkJCXZiX3NpemUsIHZiX3N0cmlkZSk7CisJCQkJdXNyX2NtZGJ1ZiArPSBqOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBXaGF0J3MgdGhlIGJlc3QgcmV0dXJuIGNvZGU/IEVGQVVMVD8gKi8KKwkJCQlEUk1fRVJST1IoIklNUExFTUVOVEFUSU9OIEVSUk9SOiAiCisJCQkJCSAgIm5vbi1kcmF3aW5nLWNvbW1hbmQgJWRcbiIsCisJCQkJCSAgY21kX2hlYWRlci5jbWQuY21kKTsKKwkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQkJfQorCisJCQlpZiAocmV0ICE9IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgc2F2YWdlX2JjaV9jbWRidWYoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqZG1hYnVmOworCWRybV9zYXZhZ2VfY21kYnVmX3QgY21kYnVmOworCWRybV9zYXZhZ2VfY21kX2hlYWRlcl90IF9fdXNlciAqdXNyX2NtZGJ1ZjsKKwlkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCBfX3VzZXIgKmZpcnN0X2RyYXdfY21kOworCXVuc2lnbmVkIGludCBfX3VzZXIgKnVzcl92dHhidWY7CisJZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqdXNyX2JveGVzOworCXVuc2lnbmVkIGludCBpLCBqOworCWludCByZXQgPSAwOworCisJRFJNX0RFQlVHKCJcbiIpOworCQorCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGNtZGJ1ZiwgKGRybV9zYXZhZ2VfY21kYnVmX3QgX191c2VyICopZGF0YSwKKwkJCQkgc2l6ZW9mKGNtZGJ1ZikpOworCisJaWYgKGRtYSAmJiBkbWEtPmJ1Zmxpc3QpIHsKKwkJaWYgKGNtZGJ1Zi5kbWFfaWR4ID4gZG1hLT5idWZfY291bnQpIHsKKwkJCURSTV9FUlJPUigidmVydGV4IGJ1ZmZlciBpbmRleCAldSBvdXQgb2YgcmFuZ2UgKDAtJXUpXG4iLAorCQkJCSAgY21kYnVmLmRtYV9pZHgsIGRtYS0+YnVmX2NvdW50LTEpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQlkbWFidWYgPSBkbWEtPmJ1Zmxpc3RbY21kYnVmLmRtYV9pZHhdOworCX0gZWxzZSB7CisJCWRtYWJ1ZiA9IE5VTEw7CisJfQorCisJdXNyX2NtZGJ1ZiA9IChkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCBfX3VzZXIgKiljbWRidWYuY21kX2FkZHI7CisJdXNyX3Z0eGJ1ZiA9ICh1bnNpZ25lZCBpbnQgX191c2VyICopY21kYnVmLnZiX2FkZHI7CisJdXNyX2JveGVzID0gKGRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKiljbWRidWYuYm94X2FkZHI7CisJaWYgKChjbWRidWYuc2l6ZSAmJiBEUk1fVkVSSUZZQVJFQV9SRUFEKHVzcl9jbWRidWYsIGNtZGJ1Zi5zaXplKjgpKSB8fAorCSAgICAoY21kYnVmLnZiX3NpemUgJiYgRFJNX1ZFUklGWUFSRUFfUkVBRCgKKwkJICAgIHVzcl92dHhidWYsIGNtZGJ1Zi52Yl9zaXplKSkgfHwKKwkgICAgKGNtZGJ1Zi5uYm94ICYmIERSTV9WRVJJRllBUkVBX1JFQUQoCisJCSAgICB1c3JfYm94ZXMsIGNtZGJ1Zi5uYm94KnNpemVvZihkcm1fY2xpcF9yZWN0X3QpKSkpCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwkvKiBNYWtlIHN1cmUgd3JpdGVzIHRvIERNQSBidWZmZXJzIGFyZSBmaW5pc2hlZCBiZWZvcmUgc2VuZGluZworCSAqIERNQSBjb21tYW5kcyB0byB0aGUgZ3JhcGhpY3MgaGFyZHdhcmUuICovCisJRFJNX01FTU9SWUJBUlJJRVIoKTsKKworCS8qIENvbWluZyBmcm9tIHVzZXIgc3BhY2UuIERvbid0IGtub3cgaWYgdGhlIFhzZXJ2ZXIgaGFzCisJICogZW1pdHRlZCB3YWl0IGNvbW1hbmRzLiBBc3N1bWluZyB0aGUgd29yc3QuICovCisJZGV2X3ByaXYtPndhaXRpbmcgPSAxOworCisJaSA9IDA7CisJZmlyc3RfZHJhd19jbWQgPSBOVUxMOworCXdoaWxlIChpIDwgY21kYnVmLnNpemUpIHsKKwkJZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgY21kX2hlYWRlcjsKKwkJRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRCgmY21kX2hlYWRlciwgdXNyX2NtZGJ1ZiwKKwkJCQkJICAgICBzaXplb2YoY21kX2hlYWRlcikpOworCQl1c3JfY21kYnVmKys7CisJCWkrKzsKKworCQkvKiBHcm91cCBkcmF3aW5nIGNvbW1hbmRzIHdpdGggc2FtZSBzdGF0ZSB0byBtaW5pbWl6ZQorCQkgKiBpdGVyYXRpb25zIG92ZXIgY2xpcCByZWN0cy4gKi8KKwkJaiA9IDA7CisJCXN3aXRjaCAoY21kX2hlYWRlci5jbWQuY21kKSB7CisJCWNhc2UgU0FWQUdFX0NNRF9ETUFfSURYOgorCQljYXNlIFNBVkFHRV9DTURfVkJfSURYOgorCQkJaiA9IChjbWRfaGVhZGVyLmlkeC5jb3VudCArIDMpIC8gNDsKKwkJCWlmIChpICsgaiA+IGNtZGJ1Zi5zaXplKSB7CisJCQkJRFJNX0VSUk9SKCJpbmRleGVkIGRyYXdpbmcgY29tbWFuZCBleHRlbmRzICIKKwkJCQkJICAiYmV5b25kIGVuZCBvZiBjb21tYW5kIGJ1ZmZlclxuIik7CisJCQkJRE1BX0ZMVVNIKCk7CisJCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFNBVkFHRV9DTURfRE1BX1BSSU06CisJCWNhc2UgU0FWQUdFX0NNRF9WQl9QUklNOgorCQkJaWYgKCFmaXJzdF9kcmF3X2NtZCkKKwkJCQlmaXJzdF9kcmF3X2NtZCA9IHVzcl9jbWRidWYtMTsKKwkJCXVzcl9jbWRidWYgKz0gajsKKwkJCWkgKz0gajsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKGZpcnN0X2RyYXdfY21kKSB7CisJCQkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX2RyYXcgKAorCQkJCQlkZXZfcHJpdiwgZmlyc3RfZHJhd19jbWQsIHVzcl9jbWRidWYtMSwKKwkJCQkJZG1hYnVmLCB1c3JfdnR4YnVmLCBjbWRidWYudmJfc2l6ZSwKKwkJCQkJY21kYnVmLnZiX3N0cmlkZSwKKwkJCQkJY21kYnVmLm5ib3gsIHVzcl9ib3hlcyk7CisJCQkJaWYgKHJldCAhPSAwKQorCQkJCQlyZXR1cm4gcmV0OworCQkJCWZpcnN0X2RyYXdfY21kID0gTlVMTDsKKwkJCX0KKwkJfQorCQlpZiAoZmlyc3RfZHJhd19jbWQpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGNtZF9oZWFkZXIuY21kLmNtZCkgeworCQljYXNlIFNBVkFHRV9DTURfU1RBVEU6CisJCQlqID0gKGNtZF9oZWFkZXIuc3RhdGUuY291bnQgKyAxKSAvIDI7CisJCQlpZiAoaSArIGogPiBjbWRidWYuc2l6ZSkgeworCQkJCURSTV9FUlJPUigiY29tbWFuZCBTQVZBR0VfQ01EX1NUQVRFIGV4dGVuZHMgIgorCQkJCQkgICJiZXlvbmQgZW5kIG9mIGNvbW1hbmQgYnVmZmVyXG4iKTsKKwkJCQlETUFfRkxVU0goKTsKKwkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQkJfQorCQkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX3N0YXRlKAorCQkJCWRldl9wcml2LCAmY21kX2hlYWRlciwKKwkJCQkodWludDMyX3QgX191c2VyICopdXNyX2NtZGJ1Zik7CisJCQl1c3JfY21kYnVmICs9IGo7CisJCQlpICs9IGo7CisJCQlicmVhazsKKwkJY2FzZSBTQVZBR0VfQ01EX0NMRUFSOgorCQkJaWYgKGkgKyAxID4gY21kYnVmLnNpemUpIHsKKwkJCQlEUk1fRVJST1IoImNvbW1hbmQgU0FWQUdFX0NNRF9DTEVBUiBleHRlbmRzICIKKwkJCQkJICAiYmV5b25kIGVuZCBvZiBjb21tYW5kIGJ1ZmZlclxuIik7CisJCQkJRE1BX0ZMVVNIKCk7CisJCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJCX0KKwkJCXJldCA9IHNhdmFnZV9kaXNwYXRjaF9jbGVhcihkZXZfcHJpdiwgJmNtZF9oZWFkZXIsCisJCQkJCQkgICAgdXNyX2NtZGJ1ZiwKKwkJCQkJCSAgICBjbWRidWYubmJveCwgdXNyX2JveGVzKTsKKwkJCXVzcl9jbWRidWYrKzsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQljYXNlIFNBVkFHRV9DTURfU1dBUDoKKwkJCXJldCA9IHNhdmFnZV9kaXNwYXRjaF9zd2FwKGRldl9wcml2LAorCQkJCQkJICAgY21kYnVmLm5ib3gsIHVzcl9ib3hlcyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURSTV9FUlJPUigiaW52YWxpZCBjb21tYW5kIDB4JXhcbiIsIGNtZF9oZWFkZXIuY21kLmNtZCk7CisJCQlETUFfRkxVU0goKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKworCQlpZiAocmV0ICE9IDApIHsKKwkJCURNQV9GTFVTSCgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmIChmaXJzdF9kcmF3X2NtZCkgeworCQlyZXQgPSBzYXZhZ2VfZGlzcGF0Y2hfZHJhdyAoCisJCQlkZXZfcHJpdiwgZmlyc3RfZHJhd19jbWQsIHVzcl9jbWRidWYsIGRtYWJ1ZiwKKwkJCXVzcl92dHhidWYsIGNtZGJ1Zi52Yl9zaXplLCBjbWRidWYudmJfc3RyaWRlLAorCQkJY21kYnVmLm5ib3gsIHVzcl9ib3hlcyk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRE1BX0ZMVVNIKCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJRE1BX0ZMVVNIKCk7CisKKwlpZiAoZG1hYnVmICYmIGNtZGJ1Zi5kaXNjYXJkKSB7CisJCWRybV9zYXZhZ2VfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBkbWFidWYtPmRldl9wcml2YXRlOworCQl1aW50MTZfdCBldmVudDsKKwkJZXZlbnQgPSBzYXZhZ2VfYmNpX2VtaXRfZXZlbnQoZGV2X3ByaXYsIFNBVkFHRV9XQUlUXzNEKTsKKwkJU0VUX0FHRSgmYnVmX3ByaXYtPmFnZSwgZXZlbnQsIGRldl9wcml2LT5ldmVudF93cmFwKTsKKwkJc2F2YWdlX2ZyZWVsaXN0X3B1dChkZXYsIGRtYWJ1Zik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZXBjYS5jIGIvZHJpdmVycy9jaGFyL2VwY2EuYwppbmRleCA2MDI1ZTE4Li41OGQzNzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZXBjYS5jCisrKyBiL2RyaXZlcnMvY2hhci9lcGNhLmMKQEAgLTYsNiArNiw4IEBACiAJRm9yIHRlY2huaWNhbCBzdXBwb3J0IHBsZWFzZSBlbWFpbCBkaWdpTGludXhAZGdpaS5jb20gb3IKIAljYWxsIERpZ2kgdGVjaCBzdXBwb3J0IGF0ICg2MTIpIDkxMi0zNDU2CiAKKwkqKiBUaGlzIGRyaXZlciBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IERpZ2kgKioKKwogCU11Y2ggb2YgdGhpcyBkZXNpZ24gYW5kIGNvZGUgY2FtZSBmcm9tIGVwY2EuYyB3aGljaCB3YXMgCiAJY29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IFRyb3kgRGUgSm9uZ2gsIGFuZCBzdWJzcXVlbnRseSAKIAltb2RpZmllZCBieSBEYXZpZCBOdWdlbnQsIENocmlzdG9waCBMYW1ldGVyLCBNaWtlIE1jTGFnYW4uIApAQCAtNDMsMzEgKzQ1LDE5IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2lmZGVmIENPTkZJR19QQ0kKLSNkZWZpbmUgRU5BQkxFX1BDSQotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KLQotI2RlZmluZSBwdXRVc2VyKGFyZzEsIGFyZzIpIHB1dF91c2VyKGFyZzEsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZzIpCi0jZGVmaW5lIGdldFVzZXIoYXJnMSwgYXJnMikgZ2V0X3VzZXIoYXJnMSwgKHVuc2lnbmVkIF9fdXNlciAqKWFyZzIpCi0KLSNpZmRlZiBFTkFCTEVfUENJCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlICJkaWdpUENJLmgiCi0jZW5kaWYgLyogRU5BQkxFX1BDSSAqLworCiAKICNpbmNsdWRlICJkaWdpMS5oIgogI2luY2x1ZGUgImRpZ2lGZXAxLmgiCiAjaW5jbHVkZSAiZXBjYS5oIgogI2luY2x1ZGUgImVwY2Fjb25maWcuaCIKIAotI2lmIEJJVFNfUEVSX0xPTkcgIT0gMzIKLSMgIGVycm9yIEZJWE1FOiB0aGlzIGRyaXZlciBvbmx5IHdvcmtzIG9uIDMyLWJpdCBwbGF0Zm9ybXMKLSNlbmRpZgotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNkZWZpbmUgVkVSU0lPTiAgICAgICAgICAgICIxLjMuMC4xLUxLIgorI2RlZmluZSBWRVJTSU9OICAgICAgICAgICAgIjEuMy4wLjEtTEsyLjYiCiAKIC8qIFRoaXMgbWFqb3IgbmVlZHMgdG8gYmUgc3VibWl0dGVkIHRvIExpbnV4IHRvIGpvaW4gdGhlIG1ham9ycyBsaXN0ICovCiAKQEAgLTgxLDEzICs3MSwxNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBnbG9iYWwgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgY2hhciBtZXNnWzEwMF07CiBzdGF0aWMgaW50IG5iZGV2cywgbnVtX2NhcmRzLCBsaWxvY29uZmlnOwogc3RhdGljIGludCBkaWdpX3BvbGxlcl9pbmhpYml0ZWQgPSAxIDsKIAogc3RhdGljIGludCBzZXR1cF9lcnJvcl9jb2RlOwogc3RhdGljIGludCBpbnZhbGlkX2xpbG9fY29uZmlnOwogCisvKiBUaGUgSVNBIGJvYXJkcyBkbyB3aW5kb3cgZmxpcHBpbmcgaW50byB0aGUgc2FtZSBzcGFjZXMgc28gaXRzIG9ubHkgc2FuZQorICAgd2l0aCBhIHNpbmdsZSBsb2NrLiBJdCdzIHN0aWxsIHByZXR0eSBlZmZpY2llbnQgKi8KKworc3RhdGljIHNwaW5sb2NrX3QgZXBjYV9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCU1BWEJPQVJEUyBpcyB0eXBpY2FsbHkgMTIsIGJ1dCBJU0EgYW5kIEVJU0EgY2FyZHMgYXJlIHJlc3RyaWN0ZWQgdG8gCiAJNyBiZWxvdy4KQEAgLTEyOSw1OCArMTIzLDU4IEBACiAJY29uZmlndXJlZC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJCi1zdGF0aWMgaW5saW5lIHZvaWQgbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOwotc3RhdGljIGlubGluZSB2b2lkIG1lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCByeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOwotc3RhdGljIGlubGluZSB2b2lkIG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOwotc3RhdGljIGlubGluZSB2b2lkIGFzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOwotc3RhdGljIGlubGluZSB2b2lkIGFzc2VydG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIHZvaWQgbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyB2b2lkIGdsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCByeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCB0eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCBtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIGFzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CiAKIC8qIC0tLS0gQmVnaW4gbW9yZSAnc3BlY2lmaWMnIG1lbW9yeSBmdW5jdGlvbnMgZm9yIGN4X2xpa2UgcHJvZHVjdHMgLS0tICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOwotc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCBwY3hlbV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgdm9pZCBwY3hlbV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIHZvaWQgcGN4ZW1fZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIHBjeGVtX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIHBjeGVtX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIHBjeGVtX21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOwogCiAvKiAtLS0tLS0gQmVnaW4gbW9yZSAnc3BlY2lmaWMnIG1lbW9yeSBmdW5jdGlvbnMgZm9yIHRoZSBwY3hlIC0tLS0tLS0gKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGVfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOwotc3RhdGljIGlubGluZSB2b2lkIHBjeGVfbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIHBjeGVfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIHZvaWQgcGN4ZV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIHZvaWQgcGN4ZV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgcGN4ZV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCBwY3hlX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIHBjeGVfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CiAKIC8qIC0tLS0gQmVnaW4gbW9yZSAnc3BlY2lmaWMnIG1lbW9yeSBmdW5jdGlvbnMgZm9yIHRoZSBwYzY0eGUgYW5kIHBjeGkgLS0tLSAqLwogLyogTm90ZSA6IHBjNjR4ZSBhbmQgcGN4aSBzaGFyZSB0aGUgc2FtZSB3aW5kb3dpbmcgcm91dGluZXMgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGlfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOwotc3RhdGljIGlubGluZSB2b2lkIHBjeGlfbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGN4aV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIHBjeGlfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIHZvaWQgcGN4aV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIHZvaWQgcGN4aV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgcGN4aV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCBwY3hpX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIHBjeGlfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CiAKIC8qIC0gQmVnaW4gJ3NwZWNpZmljJyBkbyBub3RoaW5nIG1lbW9yeSBmdW5jdGlvbnMgbmVlZGVkIGZvciBzb21lIGNhcmRzIC0gKi8KIAotc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOwotc3RhdGljIGlubGluZSB2b2lkIGR1bW15X2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOwotc3RhdGljIGlubGluZSB2b2lkIGR1bW15X3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9hc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9hc3NlcnRtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIGR1bW15X21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyB2b2lkIGR1bW15X21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgdm9pZCBkdW1teV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgZHVtbXlfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgZHVtbXlfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgZHVtbXlfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCBkdW1teV9hc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIGR1bW15X2Fzc2VydG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGRlY2xhcmUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNoYW5uZWwgKnZlcmlmeUNoYW5uZWwocmVnaXN0ZXIgc3RydWN0IHR0eV9zdHJ1Y3QgKik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGNfc2NoZWRfZXZlbnQoc3RydWN0IGNoYW5uZWwgKiwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgY2hhbm5lbCAqdmVyaWZ5Q2hhbm5lbChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIHBjX3NjaGVkX2V2ZW50KHN0cnVjdCBjaGFubmVsICosIGludCk7CiBzdGF0aWMgdm9pZCBlcGNhX2Vycm9yKGludCwgY2hhciAqKTsKIHN0YXRpYyB2b2lkIHBjX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOwogc3RhdGljIHZvaWQgc2h1dGRvd24oc3RydWN0IGNoYW5uZWwgKik7CkBAIC0yMTUsMTUgKzIwOSwxMSBAQAogc3RhdGljIHZvaWQgZGlnaV9zZW5kX2JyZWFrKHN0cnVjdCBjaGFubmVsICpjaCwgaW50IG1zZWMpOwogc3RhdGljIHZvaWQgc2V0dXBfZW1wdHlfZXZlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGNoYW5uZWwgKmNoKTsKIHZvaWQgZXBjYV9zZXR1cChjaGFyICosIGludCAqKTsKLXZvaWQgY29uc29sZV9wcmludChjb25zdCBjaGFyICopOwogCiBzdGF0aWMgaW50IGdldF90ZXJtaW8oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IHRlcm1pbyBfX3VzZXIgKik7CiBzdGF0aWMgaW50IHBjX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKLWludCBwY19pbml0KHZvaWQpOwotCi0jaWZkZWYgRU5BQkxFX1BDSQorc3RhdGljIGludCBwY19pbml0KHZvaWQpOwogc3RhdGljIGludCBpbml0X1BDSSh2b2lkKTsKLSNlbmRpZiAvKiBFTkFCTEVfUENJICovCiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMzcsNDEgKzIyNyw0MSBAQAogCW1ha2luZyBkaXJlY3QgY2FsbHMgZGVzZXJ2ZXMgd2hhdCB0aGV5IGdldC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3N0YXRpYyB2b2lkIG1lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQogewogCShiLT5tZW13aW5vbikoYiwgd2luKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3N0YXRpYyB2b2lkIG1lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKIHsKIAkoYi0+bWVtd2lub2ZmKShiLCB3aW4pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQogewogCShjaC0+Ym9hcmQtPmdsb2JhbHdpbm9uKShjaCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIHJ4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQogewogCShjaC0+Ym9hcmQtPnJ4d2lub24pKGNoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHR4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiAJKGNoLT5ib2FyZC0+dHh3aW5vbikoY2gpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiAJKGNoLT5ib2FyZC0+bWVtb2ZmKShjaCk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0Z3dpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIGFzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiAJKGNoLT5ib2FyZC0+YXNzZXJ0Z3dpbm9uKShjaCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIAkoY2gtPmJvYXJkLT5hc3NlcnRtZW1vZmYpKGNoKTsKIH0KQEAgLTI4MSw2NiArMjcxLDY2IEBACiAJYW5kIENYIHNlcmllcyBjYXJkcy4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCitzdGF0aWMgdm9pZCBwY3hlbV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKIHsKLSAgICAgICAgb3V0Yl9wKEZFUFdJTnx3aW4sIChpbnQpYi0+cG9ydCArIDEpOworICAgICAgICBvdXRiX3AoRkVQV0lOfHdpbiwgYi0+cG9ydCArIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQorc3RhdGljIHZvaWQgcGN4ZW1fbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQogewotCW91dGJfcCgwLCAoaW50KWItPnBvcnQgKyAxKTsKKwlvdXRiX3AoMCwgYi0+cG9ydCArIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgcGN4ZW1fZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQogewogCW91dGJfcCggRkVQV0lOLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBwY3hlbV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIAlvdXRiX3AoY2gtPnJ4d2luLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBwY3hlbV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIAlvdXRiX3AoY2gtPnR4d2luLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIHBjeGVtX21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiAJb3V0Yl9wKDAsIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjeGUgbWVtb3J5IHdpbmRvdyBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGVfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCitzdGF0aWMgdm9pZCBwY3hlX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQogewotICAgICAgICAgICAgICAgb3V0Yl9wKEZFUFdJTiB8IHdpbiwgKGludCliLT5wb3J0ICsgMSk7CisgICAgICAgICAgICAgICBvdXRiX3AoRkVQV0lOIHwgd2luLCBiLT5wb3J0ICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3N0YXRpYyB2b2lkIHBjeGVfbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQogewotCW91dGJfcChpbmIoKGludCliLT5wb3J0KSAmIH5GRVBNRU0sCi0JICAgICAgICAgICAoaW50KWItPnBvcnQgKyAxKTsKLQlvdXRiX3AoMCwgKGludCliLT5wb3J0ICsgMSk7CisJb3V0Yl9wKGluYihiLT5wb3J0KSAmIH5GRVBNRU0sCisJICAgICAgICAgICBiLT5wb3J0ICsgMSk7CisJb3V0Yl9wKDAsIGItPnBvcnQgKyAxKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGVfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgcGN4ZV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiAJb3V0Yl9wKCBGRVBXSU4sIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgcGN4ZV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIAkJb3V0Yl9wKGNoLT5yeHdpbiwgKGludCljaC0+Ym9hcmQtPnBvcnQgKyAxKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGVfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBwY3hlX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQogewogCQlvdXRiX3AoY2gtPnR4d2luLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgcGN4ZV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQogewogCW91dGJfcCgwLCAoaW50KWNoLT5ib2FyZC0+cG9ydCk7CiAJb3V0Yl9wKDAsIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7CkBAIC0zNDgsNDQgKzMzOCw0NCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tIEJlZ2luIHBjNjR4ZSBhbmQgcGN4aSBtZW1vcnkgd2luZG93IHN0dWZmIC0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQorc3RhdGljIHZvaWQgcGN4aV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKIHsKLSAgICAgICAgICAgICAgIG91dGJfcChpbmIoKGludCliLT5wb3J0KSB8IEZFUE1FTSwgKGludCliLT5wb3J0KTsKKyAgICAgICAgICAgICAgIG91dGJfcChpbmIoYi0+cG9ydCkgfCBGRVBNRU0sIGItPnBvcnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCitzdGF0aWMgdm9pZCBwY3hpX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKIHsKLQlvdXRiX3AoaW5iKChpbnQpYi0+cG9ydCkgJiB+RkVQTUVNLCAoaW50KWItPnBvcnQpOworCW91dGJfcChpbmIoYi0+cG9ydCkgJiB+RkVQTUVNLCBiLT5wb3J0KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGlfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgcGN4aV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7Ci0Jb3V0Yl9wKEZFUE1FTSwgKGludCljaC0+Ym9hcmQtPnBvcnQpOworCW91dGJfcChGRVBNRU0sIGNoLT5ib2FyZC0+cG9ydCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgcGN4aV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKLQkJb3V0Yl9wKEZFUE1FTSwgKGludCljaC0+Ym9hcmQtPnBvcnQpOworCQlvdXRiX3AoRkVQTUVNLCBjaC0+Ym9hcmQtPnBvcnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4aV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIHBjeGlfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7Ci0JCW91dGJfcChGRVBNRU0sIChpbnQpY2gtPmJvYXJkLT5wb3J0KTsKKwkJb3V0Yl9wKEZFUE1FTSwgY2gtPmJvYXJkLT5wb3J0KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGlfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIHBjeGlfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKLQlvdXRiX3AoMCwgKGludCljaC0+Ym9hcmQtPnBvcnQpOworCW91dGJfcCgwLCBjaC0+Ym9hcmQtPnBvcnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9hc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgcGN4aV9hc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQogewotCWVwY2Fhc3NlcnQoaW5iKChpbnQpY2gtPmJvYXJkLT5wb3J0KSAmIEZFUE1FTSwgIkdsb2JhbCBtZW1vcnkgb2ZmIik7CisJZXBjYWFzc2VydChpbmIoY2gtPmJvYXJkLT5wb3J0KSAmIEZFUE1FTSwgIkdsb2JhbCBtZW1vcnkgb2ZmIik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX2Fzc2VydG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBwY3hpX2Fzc2VydG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7Ci0JZXBjYWFzc2VydCghKGluYigoaW50KWNoLT5ib2FyZC0+cG9ydCkgJiBGRVBNRU0pLCAiTWVtb3J5IG9uIik7CisJZXBjYWFzc2VydCghKGluYihjaC0+Ym9hcmQtPnBvcnQpICYgRkVQTUVNKSwgIk1lbW9yeSBvbiIpOwogfQogCiAKQEAgLTM5OCwxODUgKzM4OCwxNDMgQEAKIAltYXkgb3IgbWF5IG5vdCBkbyBhbnl0aGluZy4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3N0YXRpYyB2b2lkIGR1bW15X21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQorc3RhdGljIHZvaWQgZHVtbXlfbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgZHVtbXlfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBkdW1teV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGR1bW15X3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgZHVtbXlfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgZHVtbXlfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGR1bW15X2Fzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBkdW1teV9hc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIGR1bW15X2Fzc2VydG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHZlcmlmeUNoYW5uZWwgZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNoYW5uZWwgKnZlcmlmeUNoYW5uZWwocmVnaXN0ZXIgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3N0YXRpYyBzdHJ1Y3QgY2hhbm5lbCAqdmVyaWZ5Q2hhbm5lbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogeyAvKiBCZWdpbiB2ZXJpZnlDaGFubmVsICovCi0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlUaGlzIHJvdXRpbmUgYmFzaWNhbGx5IHByb3ZpZGVzIGEgc2FuaXR5IGNoZWNrLiAgSXQgaW5zdXJlcyB0aGF0CiAJCXRoZSBjaGFubmVsIHJldHVybmVkIGlzIHdpdGhpbiB0aGUgcHJvcGVyIHJhbmdlIG9mIGFkZHJlc3NlcyBhcwogCQl3ZWxsIGFzIHByb3Blcmx5IGluaXRpYWxpemVkLiAgSWYgc29tZSBib2d1cyBpbmZvIGdldHMgcGFzc2VkIGluCiAJCXRocm91Z2ggdHR5LT5kcml2ZXJfZGF0YSB0aGlzIHNob3VsZCBjYXRjaCBpdC4KLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCWlmICh0dHkpIAotCXsgLyogQmVnaW4gaWYgdHR5ICovCi0KLQkJcmVnaXN0ZXIgc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopdHR5LT5kcml2ZXJfZGF0YTsKLQotCQlpZiAoKGNoID49ICZkaWdpX2NoYW5uZWxzWzBdKSAmJiAoY2ggPCAmZGlnaV9jaGFubmVsc1tuYmRldnNdKSkgCi0JCXsKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJaWYgKHR0eSkgeworCQlzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKil0dHktPmRyaXZlcl9kYXRhOworCQlpZiAoKGNoID49ICZkaWdpX2NoYW5uZWxzWzBdKSAmJiAoY2ggPCAmZGlnaV9jaGFubmVsc1tuYmRldnNdKSkgewogCQkJaWYgKGNoLT5tYWdpYyA9PSBFUENBX01BR0lDKQogCQkJCXJldHVybiBjaDsKIAkJfQotCi0JfSAvKiBFbmQgaWYgdHR5ICovCi0KLQkvKiBFbHNlIHJldHVybiBhIE5VTEwgZm9yIGludmFsaWQgKi8KKwl9CiAJcmV0dXJuIE5VTEw7CiAKIH0gLyogRW5kIHZlcmlmeUNoYW5uZWwgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX3NjaGVkX2V2ZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBjX3NjaGVkX2V2ZW50KHN0cnVjdCBjaGFubmVsICpjaCwgaW50IGV2ZW50KQoteyAvKiBCZWdpbiBwY19zY2hlZF9ldmVudCAqLwotCi0KK3N0YXRpYyB2b2lkIHBjX3NjaGVkX2V2ZW50KHN0cnVjdCBjaGFubmVsICpjaCwgaW50IGV2ZW50KQorewogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJV2UgY2FsbCB0aGlzIHRvIHNjaGVkdWxlIGludGVycnVwdCBwcm9jZXNzaW5nIG9uIHNvbWUgZXZlbnQuICBUaGUgCiAJCWtlcm5lbCBzZWVzIG91ciByZXF1ZXN0IGFuZCBjYWxscyB0aGUgcmVsYXRlZCByb3V0aW5lIGluIE9VUiBkcml2ZXIuCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KIAljaC0+ZXZlbnQgfD0gMSA8PCBldmVudDsKIAlzY2hlZHVsZV93b3JrKCZjaC0+dHF1ZXVlKTsKLQotCiB9IC8qIEVuZCBwY19zY2hlZF9ldmVudCAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gZXBjYV9lcnJvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyB2b2lkIGVwY2FfZXJyb3IoaW50IGxpbmUsIGNoYXIgKm1zZykKLXsgLyogQmVnaW4gZXBjYV9lcnJvciAqLwotCit7CiAJcHJpbnRrKEtFUk5fRVJSICJlcGNhX2Vycm9yIChEaWdpKTogbGluZSA9ICVkICVzXG4iLGxpbmUsbXNnKTsKLQlyZXR1cm47Ci0KLX0gLyogRW5kIGVwY2FfZXJyb3IgKi8KK30KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX2Nsb3NlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyB2b2lkIHBjX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCi17IC8qIEJlZ2luIHBjX2Nsb3NlICovCi0KK3sKIAlzdHJ1Y3QgY2hhbm5lbCAqY2g7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAogCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAotCXsgLyogQmVnaW4gaWYgY2ggIT0gTlVMTCAqLwotCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKLQotCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgCi0JCXsKLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpICB7IC8qIEJlZ2luIGlmIGNoICE9IE5VTEwgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm47CiAJCX0KLQogCQkvKiBDaGVjayB0byBzZWUgaWYgdGhlIGNoYW5uZWwgaXMgb3BlbiBtb3JlIHRoYW4gb25jZSAqLwotCQlpZiAoY2gtPmNvdW50LS0gPiAxKSAKLQkJeyAvKiBCZWdpbiBjaGFubmVsIGlzIG9wZW4gbW9yZSB0aGFuIG9uY2UgKi8KLQorCQlpZiAoY2gtPmNvdW50LS0gPiAxKSAgeworCQkJLyogQmVnaW4gY2hhbm5lbCBpcyBvcGVuIG1vcmUgdGhhbiBvbmNlICovCiAJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQkJUmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuICBTb21lb25lIG1pZ2h0IHN0aWxsIGJlIHVzaW5nCiAJCQkJdGhlIGNoYW5uZWwuCiAJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm47CiAJCX0gLyogRW5kIGNoYW5uZWwgaXMgb3BlbiBtb3JlIHRoYW4gb25jZSAqLwogCiAJCS8qIFBvcnQgb3BlbiBvbmx5IG9uY2UgZ28gYWhlYWQgd2l0aCBzaHV0ZG93biAmIHJlc2V0ICovCi0KLQkJaWYgKGNoLT5jb3VudCA8IDApIAotCQl7Ci0JCQljaC0+Y291bnQgPSAwOwotCQl9CisJCWlmIChjaC0+Y291bnQgPCAwKQorCQkJQlVHKCk7CiAKIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlMZXQgdGhlIHJlc3Qgb2YgdGhlIGRyaXZlciBrbm93IHRoZSBjaGFubmVsIGlzIGJlaW5nIGNsb3NlZC4KIAkJCVRoaXMgYmVjb21lcyBpbXBvcnRhbnQgaWYgYW4gb3BlbiBpcyBhdHRlbXB0ZWQgYmVmb3JlIGNsb3NlIAogCQkJaXMgZmluaXNoZWQuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7Ci0JCiAJCXR0eS0+Y2xvc2luZyA9IDE7CiAKLQkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIAotCQl7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOworCisJCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSAgewogCQkJLyogU2V0dXAgYW4gZXZlbnQgdG8gaW5kaWNhdGUgd2hlbiB0aGUgdHJhbnNtaXQgYnVmZmVyIGVtcHRpZXMgKi8KIAkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSwgY2gpOwkJCiAJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMzAwMCk7IC8qIDMwIHNlY29uZHMgdGltZW91dCAqLwogCQl9Ci0JCiAJCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQogCQkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOwogCiAJCXR0eV9sZGlzY19mbHVzaCh0dHkpOwogCQlzaHV0ZG93bihjaCk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCQl0dHktPmNsb3NpbmcgPSAwOwogCQljaC0+ZXZlbnQgPSAwOwogCQljaC0+dHR5ID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAKLQkJaWYgKGNoLT5ibG9ja2VkX29wZW4pIAotCQl7IC8qIEJlZ2luIGlmIGJsb2NrZWRfb3BlbiAqLwotCisJCWlmIChjaC0+YmxvY2tlZF9vcGVuKSAgeyAvKiBCZWdpbiBpZiBibG9ja2VkX29wZW4gKi8KIAkJCWlmIChjaC0+Y2xvc2VfZGVsYXkpIAotCQkJewogCQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2gtPmNsb3NlX2RlbGF5KSk7Ci0JCQl9Ci0KIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7Ci0KIAkJfSAvKiBFbmQgaWYgYmxvY2tlZF9vcGVuICovCi0KIAkJY2gtPmFzeW5jZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFIHwgQVNZTkNfSU5JVElBTElaRUQgfCAKIAkJICAgICAgICAgICAgICAgICAgICAgIEFTWU5DX0NMT1NJTkcpOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jbG9zZV93YWl0KTsKLQotCi0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCiAJfSAvKiBFbmQgaWYgY2ggIT0gTlVMTCAqLwotCiB9IC8qIEVuZCBwY19jbG9zZSAqLyAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHNodXRkb3duICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC01ODYsMTUgKzUzNCwxNCBAQAogCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CiAKIAlpZiAoIShjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgCiAJCXJldHVybjsKIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwotCWdsb2JhbHdpbm9uKGNoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAKKwlnbG9iYWx3aW5vbihjaCk7CiAJYmMgPSBjaC0+YnJkY2hhbjsKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjA0LDIwICs1NTEsMTcgQEAKIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCiAKIAlpZiAoYmMpCi0JCWJjLT5pZGF0YSA9IDA7Ci0KKwkJd3JpdGViKDAsICZiYy0+aWRhdGEpOwogCXR0eSA9IGNoLT50dHk7CiAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICAgSWYgd2UncmUgYSBtb2RlbSBjb250cm9sIGRldmljZSBhbmQgSFVQQ0wgaXMgb24sIGRyb3AgUlRTICYgRFRSLgogIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgCi0JeworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgIHsKIAkJY2gtPm9tb2RlbSAmPSB+KGNoLT5tX3J0cyB8IGNoLT5tX2R0cik7CiAJCWZlcGNtZChjaCwgU0VUTU9ERU0sIDAsIGNoLT5tX2R0ciB8IGNoLT5tX3J0cywgMTAsIDEpOwogCX0KLQogCW1lbW9mZihjaCk7CiAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTYyOCw3ICs1NzIsNyBAQAogCS8qIFByZXZlbnQgZnV0dXJlIERpZ2kgcHJvZ3JhbW1lZCBpbnRlcnJ1cHRzIGZyb20gY29taW5nIGFjdGl2ZSAqLwogCiAJY2gtPmFzeW5jZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCiB9IC8qIEVuZCBzaHV0ZG93biAqLwogCkBAIC02MzYsNyArNTgwLDYgQEAKIAogc3RhdGljIHZvaWQgcGNfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7IC8qIEJlZ2luIHBjX2hhbmd1cCAqLwotCiAJc3RydWN0IGNoYW5uZWwgKmNoOwogCQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjQ0LDI1ICs1ODcsMjEgQEAKIAkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLQlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKLQl7IC8qIEJlZ2luIGlmIGNoICE9IE5VTEwgKi8KLQorCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpICB7IC8qIEJlZ2luIGlmIGNoICE9IE5VTEwgKi8KIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJY2xpKCk7CiAJCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQogCQkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOwogCQl0dHlfbGRpc2NfZmx1c2godHR5KTsKIAkJc2h1dGRvd24oY2gpOwogCisJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJY2gtPnR0eSAgID0gTlVMTDsKIAkJY2gtPmV2ZW50ID0gMDsKIAkJY2gtPmNvdW50ID0gMDsKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CiAJCWNoLT5hc3luY2ZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRSB8IEFTWU5DX0lOSVRJQUxJWkVEKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7Ci0KIAl9IC8qIEVuZCBpZiBjaCAhPSBOVUxMICovCiAKIH0gLyogRW5kIHBjX2hhbmd1cCAqLwpAQCAtNjcyLDE4ICs2MTEsMTQgQEAKIHN0YXRpYyBpbnQgcGNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ5dGVzQXZhaWxhYmxlKQogeyAvKiBCZWdpbiBwY193cml0ZSAqLwotCi0JcmVnaXN0ZXIgdW5zaWduZWQgaW50IGhlYWQsIHRhaWw7Ci0JcmVnaXN0ZXIgaW50IGRhdGFMZW47Ci0JcmVnaXN0ZXIgaW50IHNpemU7Ci0JcmVnaXN0ZXIgaW50IGFtb3VudENvcGllZDsKLQotCisJdW5zaWduZWQgaW50IGhlYWQsIHRhaWw7CisJaW50IGRhdGFMZW47CisJaW50IHNpemU7CisJaW50IGFtb3VudENvcGllZDsKIAlzdHJ1Y3QgY2hhbm5lbCAqY2g7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmVtYWluOwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKLQorCXN0cnVjdCBib2FyZF9jaGFuICpiYzsKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJcGNfd3JpdGUgaXMgcHJpbWFyaWx5IGNhbGxlZCBkaXJlY3RseSBieSB0aGUga2VybmVsIHJvdXRpbmUKQEAgLTcwNiwyNCArNjQxLDIwIEBACiAKIAliYyAgID0gY2gtPmJyZGNoYW47CiAJc2l6ZSA9IGNoLT50eGJ1ZnNpemU7Ci0KIAlhbW91bnRDb3BpZWQgPSAwOwotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCWdsb2JhbHdpbm9uKGNoKTsKIAotCWhlYWQgPSBiYy0+dGluICYgKHNpemUgLSAxKTsKLQl0YWlsID0gYmMtPnRvdXQ7CisJaGVhZCA9IHJlYWR3KCZiYy0+dGluKSAmIChzaXplIC0gMSk7CisJdGFpbCA9IHJlYWR3KCZiYy0+dG91dCk7CiAKLQlpZiAodGFpbCAhPSBiYy0+dG91dCkKLQkJdGFpbCA9IGJjLT50b3V0OworCWlmICh0YWlsICE9IHJlYWR3KCZiYy0+dG91dCkpCisJCXRhaWwgPSByZWFkdygmYmMtPnRvdXQpOwogCXRhaWwgJj0gKHNpemUgLSAxKTsKIAogCS8qCUlmIGhlYWQgPj0gdGFpbCwgaGVhZCBoYXMgbm90IHdyYXBwZWQgYXJvdW5kLiAqLyAKLQlpZiAoaGVhZCA+PSB0YWlsKSAKLQl7IC8qIEJlZ2luIGhlYWQgaGFzIG5vdCB3cmFwcGVkICovCi0KKwlpZiAoaGVhZCA+PSB0YWlsKSAgeyAvKiBCZWdpbiBoZWFkIGhhcyBub3Qgd3JhcHBlZCAqLwogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCXJlbWFpbiAobXVjaCBsaWtlIGRhdGFMZW4gYWJvdmUpIHJlcHJlc2VudHMgdGhlIHRvdGFsIGFtb3VudCBvZgogCQkJc3BhY2UgYXZhaWxhYmxlIG9uIHRoZSBjYXJkIGZvciBkYXRhLiAgSGVyZSBkYXRhTGVuIHJlcHJlc2VudHMKQEAgLTczMSwyNiArNjYyLDE5IEBACiAJCQlidWZmZXIuICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGEgbWVtY3B5IGNhbm5vdCBiZSB0b2xkIHRvCiAJCQlhdXRvbWF0aWNhbGx5IHdyYXAgYXJvdW5kIHdoZW4gaXQgaGl0cyB0aGUgYnVmZmVyIGVuZC4KIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovIAotCiAJCWRhdGFMZW4gPSBzaXplIC0gaGVhZDsKIAkJcmVtYWluID0gc2l6ZSAtIChoZWFkIC0gdGFpbCkgLSAxOwotCi0JfSAvKiBFbmQgaGVhZCBoYXMgbm90IHdyYXBwZWQgKi8KLQllbHNlIAotCXsgLyogQmVnaW4gaGVhZCBoYXMgd3JhcHBlZCBhcm91bmQgKi8KKwl9IGVsc2UgeyAvKiBCZWdpbiBoZWFkIGhhcyB3cmFwcGVkIGFyb3VuZCAqLwogCiAJCXJlbWFpbiA9IHRhaWwgLSBoZWFkIC0gMTsKIAkJZGF0YUxlbiA9IHJlbWFpbjsKIAogCX0gLyogRW5kIGhlYWQgaGFzIHdyYXBwZWQgYXJvdW5kICovCi0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlDaGVjayB0aGUgc3BhY2Ugb24gdGhlIGNhcmQuICBJZiB3ZSBoYXZlIG1vcmUgZGF0YSB0aGFuIAogCQkJc3BhY2U7IHJlZHVjZSB0aGUgYW1vdW50IG9mIGRhdGEgdG8gZml0IHRoZSBzcGFjZS4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAlieXRlc0F2YWlsYWJsZSA9IG1pbihyZW1haW4sIGJ5dGVzQXZhaWxhYmxlKTsKLQogCXR4d2lub24oY2gpOwogCXdoaWxlIChieXRlc0F2YWlsYWJsZSA+IDApIAogCXsgLyogQmVnaW4gd2hpbGUgdGhlcmUgaXMgZGF0YSB0byBjb3B5IG9udG8gY2FyZCAqLwpAQCAtNzY3LDI2ICs2OTEsMjEgQEAKIAkJYW1vdW50Q29waWVkICs9IGRhdGFMZW47CiAJCWJ5dGVzQXZhaWxhYmxlIC09IGRhdGFMZW47CiAKLQkJaWYgKGhlYWQgPj0gc2l6ZSkgCi0JCXsKKwkJaWYgKGhlYWQgPj0gc2l6ZSkgewogCQkJaGVhZCA9IDA7CiAJCQlkYXRhTGVuID0gdGFpbDsKIAkJfQotCiAJfSAvKiBFbmQgd2hpbGUgdGhlcmUgaXMgZGF0YSB0byBjb3B5IG9udG8gY2FyZCAqLwotCiAJY2gtPnN0YXR1c2ZsYWdzIHw9IFRYQlVTWTsKIAlnbG9iYWx3aW5vbihjaCk7Ci0JYmMtPnRpbiA9IGhlYWQ7CisJd3JpdGV3KGhlYWQsICZiYy0+dGluKTsKIAotCWlmICgoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgPT0gMCkgCi0JeworCWlmICgoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgPT0gMCkgIHsKIAkJY2gtPnN0YXR1c2ZsYWdzIHw9IExPV1dBSVQ7Ci0JCWJjLT5pbG93ID0gMTsKKwkJd3JpdGViKDEsICZiYy0+aWxvdyk7CiAJfQogCW1lbW9mZihjaCk7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4oYW1vdW50Q29waWVkKTsKIAogfSAvKiBFbmQgcGNfd3JpdGUgKi8KQEAgLTc5NSwxMSArNzE0LDcgQEAKIAogc3RhdGljIHZvaWQgcGNfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjKQogeyAvKiBCZWdpbiBwY19wdXRfY2hhciAqLwotCi0gICAKIAlwY193cml0ZSh0dHksICZjLCAxKTsKLQlyZXR1cm47Ci0KIH0gLyogRW5kIHBjX3B1dF9jaGFyICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY193cml0ZV9yb29tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04MTEsNyArNzI2LDcgQEAKIAlzdHJ1Y3QgY2hhbm5lbCAqY2g7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgaGVhZCwgdGFpbDsKLQl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisJc3RydWN0IGJvYXJkX2NoYW4gKmJjOwogCiAJcmVtYWluID0gMDsKIApAQCAtODIwLDMzICs3MzUsMjkgQEAKIAkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLQlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKLQl7Ci0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCWdsb2JhbHdpbm9uKGNoKTsKIAogCQliYyAgID0gY2gtPmJyZGNoYW47Ci0JCWhlYWQgPSBiYy0+dGluICYgKGNoLT50eGJ1ZnNpemUgLSAxKTsKLQkJdGFpbCA9IGJjLT50b3V0OworCQloZWFkID0gcmVhZHcoJmJjLT50aW4pICYgKGNoLT50eGJ1ZnNpemUgLSAxKTsKKwkJdGFpbCA9IHJlYWR3KCZiYy0+dG91dCk7CiAKLQkJaWYgKHRhaWwgIT0gYmMtPnRvdXQpCi0JCQl0YWlsID0gYmMtPnRvdXQ7CisJCWlmICh0YWlsICE9IHJlYWR3KCZiYy0+dG91dCkpCisJCQl0YWlsID0gcmVhZHcoJmJjLT50b3V0KTsKIAkJLyogV3JhcCB0YWlsIGlmIG5lY2Vzc2FyeSAqLwogCQl0YWlsICY9IChjaC0+dHhidWZzaXplIC0gMSk7CiAKIAkJaWYgKChyZW1haW4gPSB0YWlsIC0gaGVhZCAtIDEpIDwgMCApCiAJCQlyZW1haW4gKz0gY2gtPnR4YnVmc2l6ZTsKIAotCQlpZiAocmVtYWluICYmIChjaC0+c3RhdHVzZmxhZ3MgJiBMT1dXQUlUKSA9PSAwKSAKLQkJeworCQlpZiAocmVtYWluICYmIChjaC0+c3RhdHVzZmxhZ3MgJiBMT1dXQUlUKSA9PSAwKSB7CiAJCQljaC0+c3RhdHVzZmxhZ3MgfD0gTE9XV0FJVDsKLQkJCWJjLT5pbG93ID0gMTsKKwkJCXdyaXRlYigxLCAmYmMtPmlsb3cpOwogCQl9CiAJCW1lbW9mZihjaCk7Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAl9Ci0KIAkvKiBSZXR1cm4gaG93IG11Y2ggcm9vbSBpcyBsZWZ0IG9uIGNhcmQgKi8KIAlyZXR1cm4gcmVtYWluOwogCkBAIC04NjIsOCArNzczLDcgQEAKIAlpbnQgcmVtYWluOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGNoYW5uZWwgKmNoOwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKLQorCXN0cnVjdCBib2FyZF9jaGFuICpiYzsKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdApAQCAtODczLDM0ICs3ODMsMjcgQEAKIAlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSA9PSBOVUxMKQogCQlyZXR1cm4oMCk7CiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJZ2xvYmFsd2lub24oY2gpOwogCiAJYmMgPSBjaC0+YnJkY2hhbjsKLQl0YWlsID0gYmMtPnRvdXQ7Ci0JaGVhZCA9IGJjLT50aW47Ci0JY3RhaWwgPSBjaC0+bWFpbGJveC0+Y291dDsKKwl0YWlsID0gcmVhZHcoJmJjLT50b3V0KTsKKwloZWFkID0gcmVhZHcoJmJjLT50aW4pOworCWN0YWlsID0gcmVhZHcoJmNoLT5tYWlsYm94LT5jb3V0KTsKIAotCWlmICh0YWlsID09IGhlYWQgJiYgY2gtPm1haWxib3gtPmNpbiA9PSBjdGFpbCAmJiBiYy0+dGJ1c3kgPT0gMCkKKwlpZiAodGFpbCA9PSBoZWFkICYmIHJlYWR3KCZjaC0+bWFpbGJveC0+Y2luKSA9PSBjdGFpbCAmJiByZWFkYigmYmMtPnRidXN5KSA9PSAwKQogCQljaGFycyA9IDA7Ci0JZWxzZSAKLQl7IC8qIEJlZ2luIGlmIHNvbWUgc3BhY2Ugb24gdGhlIGNhcmQgaGFzIGJlZW4gdXNlZCAqLwotCi0JCWhlYWQgPSBiYy0+dGluICYgKGNoLT50eGJ1ZnNpemUgLSAxKTsKKwllbHNlICB7IC8qIEJlZ2luIGlmIHNvbWUgc3BhY2Ugb24gdGhlIGNhcmQgaGFzIGJlZW4gdXNlZCAqLworCQloZWFkID0gcmVhZHcoJmJjLT50aW4pICYgKGNoLT50eGJ1ZnNpemUgLSAxKTsKIAkJdGFpbCAmPSAoY2gtPnR4YnVmc2l6ZSAtIDEpOwotCiAJCS8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJVGhlIGxvZ2ljIGhlcmUgaXMgYmFzaWNhbGx5IG9wcG9zaXRlIG9mIHRoZSBhYm92ZSBwY193cml0ZV9yb29tCiAJCQloZXJlIHdlIGFyZSBmaW5kaW5nIHRoZSBhbW91bnQgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBmaWxsZWQuCiAJCQlOb3QgdGhlIGFtb3VudCBvZiBieXRlcyBlbXB0eS4KIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJCWlmICgocmVtYWluID0gdGFpbCAtIGhlYWQgLSAxKSA8IDAgKQogCQkJcmVtYWluICs9IGNoLT50eGJ1ZnNpemU7Ci0KIAkJY2hhcnMgPSAoaW50KShjaC0+dHhidWZzaXplIC0gcmVtYWluKTsKLQogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKIAkJCU1ha2UgaXQgcG9zc2libGUgdG8gd2FrZXVwIGFueXRoaW5nIHdhaXRpbmcgZm9yIG91dHB1dAogCQkJaW4gdHR5X2lvY3RsLmMsIGV0Yy4KQEAgLTkwOCwxNSArODExLDEyIEBACiAJCQlJZiBub3QgYWxyZWFkeSBzZXQuICBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZQogCQkJdHJhbnNtaXQgYnVmZmVyIGVtcHRpZXMgCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAkJaWYgKCEoY2gtPnN0YXR1c2ZsYWdzICYgRU1QVFlXQUlUKSkKIAkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSxjaCk7CiAKIAl9IC8qIEVuZCBpZiBzb21lIHNwYWNlIG9uIHRoZSBjYXJkIGhhcyBiZWVuIHVzZWQgKi8KLQogCW1lbW9mZihjaCk7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkvKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVzaWRpbmcgb24gY2FyZC4gKi8KIAlyZXR1cm4oY2hhcnMpOwogCkBAIC05MzAsNjcgKzgzMCw0NiBAQAogCXVuc2lnbmVkIGludCB0YWlsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGNoYW5uZWwgKmNoOwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKLQotCisJc3RydWN0IGJvYXJkX2NoYW4gKmJjOwogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAogCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpID09IE5VTEwpCiAJCXJldHVybjsKIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwotCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCWdsb2JhbHdpbm9uKGNoKTsKLQogCWJjICAgPSBjaC0+YnJkY2hhbjsKLQl0YWlsID0gYmMtPnRvdXQ7Ci0KKwl0YWlsID0gcmVhZHcoJmJjLT50b3V0KTsKIAkvKiBIYXZlIEZFUCBtb3ZlIHRvdXQgcG9pbnRlcjsgZWZmZWN0aXZlbHkgZmx1c2hpbmcgdHJhbnNtaXQgYnVmZmVyICovCi0KIAlmZXBjbWQoY2gsIFNUT1VULCAodW5zaWduZWQpIHRhaWwsIDAsIDAsIDApOwotCiAJbWVtb2ZmKGNoKTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKIAl0dHlfd2FrZXVwKHR0eSk7Ci0KIH0gLyogRW5kIHBjX2ZsdXNoX2J1ZmZlciAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfZmx1c2hfY2hhcnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIHZvaWQgcGNfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsgLyogQmVnaW4gcGNfZmx1c2hfY2hhcnMgKi8KLQogCXN0cnVjdCBjaGFubmVsICogY2g7Ci0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKIAkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKLQl7CisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKLQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCUlmIG5vdCBhbHJlYWR5IHNldCBhbmQgdGhlIHRyYW5zbWl0dGVyIGlzIGJ1c3kgc2V0dXAgYW4gZXZlbnQKIAkJCXRvIGluZGljYXRlIHdoZW4gdGhlIHRyYW5zbWl0IGVtcHRpZXMuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogCQlpZiAoKGNoLT5zdGF0dXNmbGFncyAmIFRYQlVTWSkgJiYgIShjaC0+c3RhdHVzZmxhZ3MgJiBFTVBUWVdBSVQpKQogCQkJc2V0dXBfZW1wdHlfZXZlbnQodHR5LGNoKTsKLQotCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJfQotCiB9IC8qIEVuZCBwY19mbHVzaF9jaGFycyAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gYmxvY2tfdGlsX3JlYWR5ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC05OTgsMTQgKzg3NywxMSBAQAogc3RhdGljIGludCBibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGNoYW5uZWwgKmNoKQogeyAvKiBCZWdpbiBibG9ja190aWxfcmVhZHkgKi8KLQogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsY3VycmVudCk7CiAJaW50CXJldHZhbCwgZG9fY2xvY2FsID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0KLQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKLQl7CisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKIAkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKIAkJCXJldHZhbCA9IC1FQUdBSU47CiAJCWVsc2UKQEAgLTEwMTcsOCArODkzLDcgQEAKIAkJSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGJlaW5nIGNsb3NlZCwgdGhlbiBibG9jawogCQl1bnRpbCBpdCdzIGRvbmUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0NMT1NJTkcpIAotCXsKKwlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSB7CiAJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmNoLT5jbG9zZV93YWl0KTsKIAogCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQpAQCAtMTAyNyw0MyArOTAyLDI5IEBACiAJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAotCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgCi0JeworCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgIHsKIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAJICAJIElmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCwgdGhlbiBtYWtlIHRoZSBjaGVjayB1cCBmcm9udAogCSAgCSBhbmQgdGhlbiBleGl0LgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0KIAkJcmV0dXJuIDA7CiAJfQotCi0KIAlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQogCQlkb19jbG9jYWwgPSAxOwotCQotICAgLyogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUgZnJlZSAqLworCS8qIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lIGZyZWUgKi8KIAkKIAlyZXR2YWwgPSAwOwogCWFkZF93YWl0X3F1ZXVlKCZjaC0+b3Blbl93YWl0LCAmd2FpdCk7Ci0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7CiAKLQorCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkvKiBXZSBkZWMgY291bnQgc28gdGhhdCBwY19jbG9zZSB3aWxsIGtub3cgd2hlbiB0byBmcmVlIHRoaW5ncyAqLwogCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKIAkJY2gtPmNvdW50LS07Ci0KLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQogCWNoLT5ibG9ja2VkX29wZW4rKzsKLQogCXdoaWxlKDEpIAogCXsgLyogQmVnaW4gZm9yZXZlciB3aGlsZSAgKi8KLQogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCiAJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CiAJCSAgICAhKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSAKIAkJewpAQCAtMTA3MywxNyArOTM0LDE0IEBACiAJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwkKIAkJCWJyZWFrOwogCQl9Ci0KIAkJaWYgKCEoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJiAKIAkJCSAgKGRvX2Nsb2NhbCB8fCAoY2gtPmltb2RlbSAmIGNoLT5kY2QpKSkKIAkJCWJyZWFrOwotCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgCi0JCXsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CiAJCQlicmVhazsKIAkJfQotCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCUFsbG93IHNvbWVvbmUgZWxzZSB0byBiZSBzY2hlZHVsZWQuICBXZSB3aWxsIG9jY2FzaW9uYWxseSBnbwogCQkJdGhyb3VnaCB0aGlzIGxvb3AgdW50aWwgb25lIG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGNoYW5nZS4KQEAgLTEwOTEsMjUgKzk0OSwyMyBAQAogCQkJcHJldmVudCB0aGlzIGxvb3AgZnJvbSBob2dnaW5nIHRoZSBjcHUuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCQlzY2hlZHVsZSgpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAKIAl9IC8qIEVuZCBmb3JldmVyIHdoaWxlICAqLwogCiAJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CiAJcmVtb3ZlX3dhaXRfcXVldWUoJmNoLT5vcGVuX3dhaXQsICZ3YWl0KTsKLQljbGkoKTsKIAlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCiAJCWNoLT5jb3VudCsrOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCiAJY2gtPmJsb2NrZWRfb3Blbi0tOwogCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CisKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCiAJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKLQogCXJldHVybiAwOwotCiB9IC8qIEVuZCBibG9ja190aWxfcmVhZHkgKi8JCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19vcGVuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMTIwLDE3ICs5NzYsMTIgQEAKIAlzdHJ1Y3QgY2hhbm5lbCAqY2g7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbGluZSwgcmV0dmFsLCBib2FyZG51bTsKLQl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGhlYWQ7CisJc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCXVuc2lnbmVkIGludCBoZWFkOwogCiAJbGluZSA9IHR0eS0+aW5kZXg7Ci0JaWYgKGxpbmUgPCAwIHx8IGxpbmUgPj0gbmJkZXZzKSAKLQl7Ci0JCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIHBjX29wZW4gOiBsaW5lIG91dCBvZiByYW5nZSBpbiBwY19vcGVuXG4iKTsKLQkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JCXJldHVybigtRU5PREVWKTsKLQl9Ci0KKwlpZiAobGluZSA8IDAgfHwgbGluZSA+PSBuYmRldnMpCisJCXJldHVybiAtRU5PREVWOwogCiAJY2ggPSAmZGlnaV9jaGFubmVsc1tsaW5lXTsKIAlib2FyZG51bSA9IGNoLT5ib2FyZG51bTsKQEAgLTExNDMsNjYgKzk5NCw0OSBAQAogCQlnb2VzIGhlcmUuCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0JaWYgKGludmFsaWRfbGlsb19jb25maWcpCi0JeworCWlmIChpbnZhbGlkX2xpbG9fY29uZmlnKSB7CiAJCWlmIChzZXR1cF9lcnJvcl9jb2RlICYgSU5WQUxJRF9CT0FSRF9UWVBFKQotCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbjogSW52YWxpZCBib2FyZCB0eXBlIHNwZWNpZmllZCBpbiBMSUxPIGNvbW1hbmRcbiIpOwotCisJCQlwcmludGsoS0VSTl9FUlIgImVwY2E6IHBjX29wZW46IEludmFsaWQgYm9hcmQgdHlwZSBzcGVjaWZpZWQgaW4ga2VybmVsIG9wdGlvbnMuXG4iKTsKIAkJaWYgKHNldHVwX2Vycm9yX2NvZGUgJiBJTlZBTElEX05VTV9QT1JUUykKLQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIHBjX29wZW46IEludmFsaWQgbnVtYmVyIG9mIHBvcnRzIHNwZWNpZmllZCBpbiBMSUxPIGNvbW1hbmRcbiIpOwotCisJCQlwcmludGsoS0VSTl9FUlIgImVwY2E6IHBjX29wZW46IEludmFsaWQgbnVtYmVyIG9mIHBvcnRzIHNwZWNpZmllZCBpbiBrZXJuZWwgb3B0aW9ucy5cbiIpOwogCQlpZiAoc2V0dXBfZXJyb3JfY29kZSAmIElOVkFMSURfTUVNX0JBU0UpCi0JCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBwY19vcGVuOiBJbnZhbGlkIGJvYXJkIG1lbW9yeSBhZGRyZXNzIHNwZWNpZmllZCBpbiBMSUxPIGNvbW1hbmRcbiIpOwotCisJCQlwcmludGsoS0VSTl9FUlIgImVwY2E6IHBjX29wZW46IEludmFsaWQgYm9hcmQgbWVtb3J5IGFkZHJlc3Mgc3BlY2lmaWVkIGluIGtlcm5lbCBvcHRpb25zLlxuIik7CiAJCWlmIChzZXR1cF9lcnJvcl9jb2RlICYgSU5WQUxJRF9QT1JUX0JBU0UpCi0JCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBwY19vcGVuOiBJbnZhbGlkIGJvYXJkIHBvcnQgYWRkcmVzcyBzcGVjaWZpZWQgaW4gTElMTyBjb21tYW5kXG4iKTsKLQorCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhOyBwY19vcGVuOiBJbnZhbGlkIGJvYXJkIHBvcnQgYWRkcmVzcyBzcGVjaWZpZWQgaW4ga2VybmVsIG9wdGlvbnMuXG4iKTsKIAkJaWYgKHNldHVwX2Vycm9yX2NvZGUgJiBJTlZBTElEX0JPQVJEX1NUQVRVUykKLQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIHBjX29wZW46IEludmFsaWQgYm9hcmQgc3RhdHVzIHNwZWNpZmllZCBpbiBMSUxPIGNvbW1hbmRcbiIpOwotCisJCQlwcmludGsoS0VSTl9FUlIgImVwY2E6IHBjX29wZW46IEludmFsaWQgYm9hcmQgc3RhdHVzIHNwZWNpZmllZCBpbiBrZXJuZWwgb3B0aW9ucy5cbiIpOwogCQlpZiAoc2V0dXBfZXJyb3JfY29kZSAmIElOVkFMSURfQUxUUElOKQotCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbjogSW52YWxpZCBib2FyZCBhbHRwaW4gc3BlY2lmaWVkIGluIExJTE8gY29tbWFuZFxuIik7Ci0KKwkJCXByaW50ayhLRVJOX0VSUiAiZXBjYTogcGNfb3BlbjogSW52YWxpZCBib2FyZCBhbHRwaW4gc3BlY2lmaWVkIGluIGtlcm5lbCBvcHRpb25zO1xuIik7CiAJCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOyAgIC8qIE1hcmsgdGhpcyBkZXZpY2UgYXMgJ2Rvd24nICovCi0JCXJldHVybigtRU5PREVWKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCi0JaWYgKChib2FyZG51bSA+PSBudW1fY2FyZHMpIHx8IChib2FyZHNbYm9hcmRudW1dLnN0YXR1cyA9PSBESVNBQkxFRCkpIAotCXsKKwlpZiAoYm9hcmRudW0gPj0gbnVtX2NhcmRzIHx8IGJvYXJkc1tib2FyZG51bV0uc3RhdHVzID09IERJU0FCTEVEKSAgewogCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsgICAvKiBNYXJrIHRoaXMgZGV2aWNlIGFzICdkb3duJyAqLwogCQlyZXR1cm4oLUVOT0RFVik7CiAJfQogCQotCWlmICgoIGJjID0gY2gtPmJyZGNoYW4pID09IDApIAotCXsKKwlpZiAoKGJjID0gY2gtPmJyZGNoYW4pID09IDApIHsKIAkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JCXJldHVybigtRU5PREVWKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlFdmVyeSB0aW1lIGEgY2hhbm5lbCBpcyBvcGVuZWQsIGluY3JlbWVudCBhIGNvdW50ZXIuICBUaGlzIGlzIAogCQluZWNlc3NhcnkgYmVjYXVzZSB3ZSBkbyBub3Qgd2lzaCB0byBmbHVzaCBhbmQgc2h1dGRvd24gdGhlIGNoYW5uZWwKIAkJdW50aWwgdGhlIGxhc3QgYXBwIGhvbGRpbmcgdGhlIGNoYW5uZWwgb3BlbiwgY2xvc2VzIGl0LgkgCQogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJY2gtPmNvdW50Kys7Ci0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCVNldCBhIGtlcm5lbCBzdHJ1Y3R1cmVzIHBvaW50ZXIgdG8gb3VyIGxvY2FsIGNoYW5uZWwgCiAJCXN0cnVjdHVyZS4gIFRoaXMgd2F5IHdlIGNhbiBnZXQgdG8gaXQgd2hlbiBwYXNzZWQgb25seQogCQlhIHR0eSBzdHJ1Y3QuCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAl0dHktPmRyaXZlcl9kYXRhID0gY2g7Ci0JCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBjaGFubmVsIGhhcyBiZWVuIG9wZW5lZCwgaW5pdGlhbGl6ZQogCQl0aGUgdHR5LT50ZXJtaW9zIHN0cnVjdCBvdGhlcndpc2UgbGV0IHBjX2Nsb3NlIGhhbmRsZSBpdC4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7Ci0KIAlnbG9iYWx3aW5vbihjaCk7CiAJY2gtPnN0YXR1c2ZsYWdzID0gMDsKIApAQCAtMTIxMyw4ICsxMDQ3LDggQEAKIAkgICBTZXQgcmVjZWl2ZSBoZWFkIGFuZCB0YWlsIHB0cnMgdG8gZWFjaCBvdGhlci4gIFRoaXMgaW5kaWNhdGVzCiAJICAgbm8gZGF0YSBhdmFpbGFibGUgdG8gcmVhZC4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWhlYWQgPSBiYy0+cmluOwotCWJjLT5yb3V0ID0gaGVhZDsKKwloZWFkID0gcmVhZHcoJmJjLT5yaW4pOworCXdyaXRldyhoZWFkLCAmYmMtPnJvdXQpOwogCiAJLyogU2V0IHRoZSBjaGFubmVscyBhc3NvY2lhdGVkIHR0eSBzdHJ1Y3R1cmUgKi8KIAljaC0+dHR5ID0gdHR5OwpAQCAtMTIyNCwxMjIgKzEwNTgsNzQgQEAKIAkJaXNzdWVzLCBldGMuLi4uIEl0IGVmZmVjdCBib3RoIGNvbnRyb2wgZmxhZ3MgYW5kIGlucHV0IGZsYWdzLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJZXBjYXBhcmFtKHR0eSxjaCk7Ci0KIAljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKIAltZW1vZmYoY2gpOwotCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAKIAlyZXR2YWwgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBjaCk7CiAJaWYgKHJldHZhbCkKLQl7CiAJCXJldHVybiByZXR2YWw7Ci0JfQotCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlTZXQgdGhpcyBhZ2FpbiBpbiBjYXNlIGEgaGFuZ3VwIHNldCBpdCB0byB6ZXJvIHdoaWxlIHRoaXMgCiAJCW9wZW4oKSB3YXMgd2FpdGluZyBmb3IgdGhlIGxpbmUuLi4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJY2gtPnR0eSA9IHR0eTsKLQotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwogCWdsb2JhbHdpbm9uKGNoKTsKLQogCS8qIEVuYWJsZSBEaWdpIERhdGEgZXZlbnRzICovCi0JYmMtPmlkYXRhID0gMTsKLQorCXdyaXRlYigxLCAmYmMtPmlkYXRhKTsKIAltZW1vZmYoY2gpOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7Ci0KIH0gLyogRW5kIHBjX29wZW4gKi8KIAotI2lmZGVmIE1PRFVMRQogc3RhdGljIGludCBfX2luaXQgZXBjYV9tb2R1bGVfaW5pdCh2b2lkKQogeyAvKiBCZWdpbiBpbml0X21vZHVsZSAqLwotCi0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwotCi0JcGNfaW5pdCgpOwotCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KLQlyZXR1cm4oMCk7CisJcmV0dXJuIHBjX2luaXQoKTsKIH0KIAogbW9kdWxlX2luaXQoZXBjYV9tb2R1bGVfaW5pdCk7Ci0jZW5kaWYKIAotI2lmZGVmIEVOQUJMRV9QQ0kKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlcGNhX2RyaXZlcjsKLSNlbmRpZgotCi0jaWZkZWYgTU9EVUxFCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBjbGVhbnVwX21vZHVsZSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXBjYV9tb2R1bGVfZXhpdCh2b2lkKQogewotCiAJaW50ICAgICAgICAgICAgICAgY291bnQsIGNyZDsKIAlzdHJ1Y3QgYm9hcmRfaW5mbyAqYmQ7CiAJc3RydWN0IGNoYW5uZWwgICAgKmNoOwotCXVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOwogCiAJZGVsX3RpbWVyX3N5bmMoJmVwY2FfdGltZXIpOwogCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7Ci0KIAlpZiAoKHR0eV91bnJlZ2lzdGVyX2RyaXZlcihwY19kcml2ZXIpKSB8fCAgCiAJICAgICh0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocGNfaW5mbykpKQogCXsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiPEVycm9yPiAtIERJR0kgOiBjbGVhbnVwX21vZHVsZSBmYWlsZWQgdG8gdW4tcmVnaXN0ZXIgdHR5IGRyaXZlclxuIik7Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJlcGNhOiBjbGVhbnVwX21vZHVsZSBmYWlsZWQgdG8gdW4tcmVnaXN0ZXIgdHR5IGRyaXZlclxuIik7CiAJCXJldHVybjsKIAl9CiAJcHV0X3R0eV9kcml2ZXIocGNfZHJpdmVyKTsKIAlwdXRfdHR5X2RyaXZlcihwY19pbmZvKTsKIAotCWZvciAoY3JkID0gMDsgY3JkIDwgbnVtX2NhcmRzOyBjcmQrKykgCi0JeyAvKiBCZWdpbiBmb3IgZWFjaCBjYXJkICovCi0KKwlmb3IgKGNyZCA9IDA7IGNyZCA8IG51bV9jYXJkczsgY3JkKyspICB7IC8qIEJlZ2luIGZvciBlYWNoIGNhcmQgKi8KIAkJYmQgPSAmYm9hcmRzW2NyZF07Ci0KIAkJaWYgKCFiZCkKIAkJeyAvKiBCZWdpbiBzYW5pdHkgY2hlY2sgKi8KIAkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIERpZ2kgOiBjbGVhbnVwX21vZHVsZSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuOwogCQl9IC8qIEVuZCBzYW5pdHkgY2hlY2sgKi8KLQotCQljaCA9IGNhcmRfcHRyW2NyZF07IAotCisJCWNoID0gY2FyZF9wdHJbY3JkXTsKIAkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgYmQtPm51bXBvcnRzOyBjb3VudCsrLCBjaCsrKSAKIAkJeyAvKiBCZWdpbiBmb3IgZWFjaCBwb3J0ICovCi0KLQkJCWlmIChjaCkgCi0JCQl7CisJCQlpZiAoY2gpIHsKIAkJCQlpZiAoY2gtPnR0eSkKIAkJCQkJdHR5X2hhbmd1cChjaC0+dHR5KTsKIAkJCQlrZnJlZShjaC0+dG1wX2J1Zik7CiAJCQl9Ci0KIAkJfSAvKiBFbmQgZm9yIGVhY2ggcG9ydCAqLwogCX0gLyogRW5kIGZvciBlYWNoIGNhcmQgKi8KLQotI2lmZGVmIEVOQUJMRV9QQ0kKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZlcGNhX2RyaXZlcik7Ci0jZW5kaWYKLQotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCiB9CisKIG1vZHVsZV9leGl0KGVwY2FfbW9kdWxlX2V4aXQpOwotI2VuZGlmIC8qIE1PRFVMRSAqLwogCiBzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHBjX29wcyA9IHsKIAkub3BlbiA9IHBjX29wZW4sCkBAIC0xMzcxLDM0ICsxMTU3LDE1IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19pbml0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWludCBfX2luaXQgcGNfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcGNfaW5pdCh2b2lkKQogeyAvKiBCZWdpbiBwY19pbml0ICovCi0KLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCXBjX2luaXQgaXMgY2FsbGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGR1cmluZyBib290IHVwIHByaW9yIHRvCi0JCWFueSBvcGVuIGNhbGxzIGJlaW5nIG1hZGUuICBJbiB0aGUgb2xkZXIgdmVyc2lvbnMgb2YgTGludXggKFByaW9yCi0JCXRvIDIuMC4wKSBhbiBlbnRyeSBpcyBtYWRlIGludG8gdHR5X2lvLmMuICBBIHBvaW50ZXIgdG8gdGhlIGxhc3QKLQkJbWVtb3J5IGxvY2F0aW9uIChmcm9tIGtlcm5lbCBzcGFjZSkgdXNlZCAoa21lbV9zdGFydCkgaXMgcGFzc2VkCi0JCXRvIHBjX2luaXQuICBJdCBpcyBwY19pbml0cyByZXNwb25zaWJpbGl0eSB0byBtb2RpZnkgdGhpcyB2YWx1ZSAKLQkJZm9yIGFueSBtZW1vcnkgdGhhdCB0aGUgRGlnaSBkcml2ZXIgbWlnaHQgbmVlZCBhbmQgdGhlbiByZXR1cm4KLQkJdGhpcyB2YWx1ZSB0byB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIEZvciBleGFtcGxlIGlmIHRoZSBkcml2ZXIKLQkJd2lzaGVzIHRvIGFsbG9jYXRlIDFLIG9mIGtlcm5lbCBtZW1vcnksIHBjX2luaXQgd291bGQgcmV0dXJuIAotCQkoa21lbV9zdGFydCArIDEwMjQpLiAgVGhpcyBtZW1vcnkgKEJldHdlZW4ga21lbV9zdGFydCBhbmQga21lbV9zdGFydAotCQkrIDEwMjQpIHdvdWxkIHRoZW4gYmUgYXZhaWxhYmxlIGZvciB1c2UgZXhjbHVzaXZlbHkgYnkgdGhlIGRyaXZlci4gIAotCQlJbiB0aGlzIGNhc2Ugb3VyIGRyaXZlciBkb2VzIG5vdCBhbGxvY2F0ZSBhbnkgb2YgdGhpcyBrZXJuZWwgCi0JCW1lbW9yeS4KLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0JdWxvbmcgZmxhZ3M7CiAJaW50IGNyZDsKIAlzdHJ1Y3QgYm9hcmRfaW5mbyAqYmQ7CiAJdW5zaWduZWQgY2hhciBib2FyZF9pZCA9IDA7CiAKLSNpZmRlZiBFTkFCTEVfUENJCiAJaW50IHBjaV9ib2FyZHNfZm91bmQsIHBjaV9jb3VudDsKIAogCXBjaV9jb3VudCA9IDA7Ci0jZW5kaWYgLyogRU5BQkxFX1BDSSAqLwogCiAJcGNfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihNQVhfQUxMT0MpOwogCWlmICghcGNfZHJpdmVyKQpAQCAtMTQxNiw4ICsxMTgzLDcgQEAKIAkJTm90ZSA6IElmIExJTE8gaGFzIHJhbiBlcGNhX3NldHVwIHRoZW4gZXBjYV9zZXR1cCB3aWxsIGhhbmRsZSBkZWZpbmluZwogCQludW1fY2FyZHMgYXMgd2VsbCBhcyBjb3B5aW5nIHRoZSBkYXRhIGludG8gdGhlIGJvYXJkIHN0cnVjdHVyZS4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWlmICghbGlsb2NvbmZpZykKLQl7IC8qIEJlZ2luIGRyaXZlciBoYXMgYmVlbiBjb25maWd1cmVkIHZpYS4gZXBjYWNvbmZpZyAqLworCWlmICghbGlsb2NvbmZpZykgeyAvKiBCZWdpbiBkcml2ZXIgaGFzIGJlZW4gY29uZmlndXJlZCB2aWEuIGVwY2Fjb25maWcgKi8KIAogCQluYmRldnMgPSBOQkRFVlM7CiAJCW51bV9jYXJkcyA9IE5VTUNBUkRTOwpAQCAtMTQ0MCw4ICsxMjA2LDYgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIkRJR0kgZXBjYSBkcml2ZXIgdmVyc2lvbiAlcyBsb2FkZWQuXG4iLFZFUlNJT04pOwogCi0jaWZkZWYgRU5BQkxFX1BDSQotCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCU5PVEUgOiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBudW1iZXIgb2YgcG9ydHMgZm91bmQgaW4gCiAJCSAgICAgICB0aGUgYm9hcmRzIGFycmF5IGlzIGNvcnJlY3QuICBUaGlzIGNvdWxkIGJlIHdyb25nIGlmCkBAIC0xNDY3LDggKzEyMzEsNiBAQAogCQlwY2lfYm9hcmRzX2ZvdW5kICs9IGluaXRfUENJKCk7CiAJbnVtX2NhcmRzICs9IHBjaV9ib2FyZHNfZm91bmQ7CiAKLSNlbmRpZiAvKiBFTkFCTEVfUENJICovCi0KIAlwY19kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CiAJcGNfZHJpdmVyLT5uYW1lID0gInR0eUQiOyAKIAlwY19kcml2ZXItPmRldmZzX25hbWUgPSAidHRzL0QiOwpAQCAtMTQ5OSw5ICsxMjYxLDYgQEAKIAl0dHlfc2V0X29wZXJhdGlvbnMocGNfaW5mbywgJmluZm9fb3BzKTsKIAogCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7Ci0KIAlmb3IgKGNyZCA9IDA7IGNyZCA8IG51bV9jYXJkczsgY3JkKyspIAogCXsgLyogQmVnaW4gZm9yIGVhY2ggY2FyZCAqLwogCkBAIC0xNjEwLDExICsxMzY5LDcgQEAKIAkJCQkJaWYgKChib2FyZF9pZCAmIDB4MzApID09IDB4MzApIAogCQkJCQkJYmQtPm1lbW9yeV9zZWcgPSAweDgwMDA7CiAKLQkJCQl9IC8qIEVuZCBpdCBpcyBhbiBYSSBjYXJkICovCi0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gQm9hcmQgYXQgMHgleCBkb2Vzbid0IGFwcGVhciB0byBiZSBhbiBYSVxuIiwoaW50KWJkLT5wb3J0KTsKLQkJCQl9CisJCQkJfSBlbHNlIHByaW50ayhLRVJOX0VSUiAiZXBjYTogQm9hcmQgYXQgMHgleCBkb2Vzbid0IGFwcGVhciB0byBiZSBhbiBYSVxuIiwoaW50KWJkLT5wb3J0KTsKIAkJCWJyZWFrOwogCiAJCX0gLyogRW5kIHN3aXRjaCBvbiBiZC0+dHlwZSAqLwpAQCAtMTYzNCw5ICsxMzg5LDYgQEAKIAlpbml0X3RpbWVyKCZlcGNhX3RpbWVyKTsKIAllcGNhX3RpbWVyLmZ1bmN0aW9uID0gZXBjYXBvbGw7CiAJbW9kX3RpbWVyKCZlcGNhX3RpbWVyLCBqaWZmaWVzICsgSFovMjUpOwotCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KIAlyZXR1cm4gMDsKIAogfSAvKiBFbmQgcGNfaW5pdCAqLwpAQCAtMTY0NywxMCArMTM5OSwxMCBAQAogeyAvKiBCZWdpbiBwb3N0X2ZlcF9pbml0ICovCiAKIAlpbnQgaTsKLQl1bmNoYXIgKm1lbWFkZHI7Ci0Jdm9sYXRpbGUgc3RydWN0IGdsb2JhbF9kYXRhICpnZDsKKwl1bnNpZ25lZCBjaGFyICptZW1hZGRyOworCXN0cnVjdCBnbG9iYWxfZGF0YSAqZ2Q7CiAJc3RydWN0IGJvYXJkX2luZm8gKmJkOwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CiAJc3RydWN0IGNoYW5uZWwgKmNoOyAKIAlpbnQgc2hyaW5rbWVtID0gMCwgbG93d2F0ZXIgOyAKICAKQEAgLTE2NjksOSArMTQyMSw3IEBACiAJCWFmdGVyIERJR0lfSU5JVCBoYXMgYmVlbiBjYWxsZWQgd2lsbCByZXR1cm4gdGhlIHByb3BlciB2YWx1ZXMuIAogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotCWlmIChiZC0+dHlwZSA+PSBQQ0lYRU0pIC8qIElmIHRoZSBib2FyZCBpbiBxdWVzdGlvbiBpcyBQQ0kgKi8KLQl7IC8qIEJlZ2luIGdldCBQQ0kgbnVtYmVyIG9mIHBvcnRzICovCi0KKwlpZiAoYmQtPnR5cGUgPj0gUENJWEVNKSB7IC8qIEJlZ2luIGdldCBQQ0kgbnVtYmVyIG9mIHBvcnRzICovCiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlCZWxvdyB3ZSB1c2UgWEVNUE9SVFMgYXMgYSBtZW1vcnkgb2Zmc2V0IHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggUENJCiAJCQljYXJkIGl0IGlzLiAgVGhpcyBpcyBiZWNhdXNlIGFsbCBvZiB0aGUgc3VwcG9ydGVkIFBDSSBjYXJkcyBoYXZlCkBAIC0xNjg1LDE1ICsxNDM1LDE1IEBACiAJCQkoRllJIC0gVGhlIGlkIHNob3VsZCBiZSBsb2NhdGVkIGF0IDB4MWFjIChBbmQgbWF5IHVzZSB1cCB0byA0IGJ5dGVzCiAJCQlpZiB0aGUgYm94IGluIHF1ZXN0aW9uIGlzIGEgWEVNIG9yIENYKSkuICAKIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovIAotCi0JCWJkLT5udW1wb3J0cyA9ICh1bnNpZ25lZCBzaG9ydCkqKHVuc2lnbmVkIGNoYXIgKilidXNfdG9fdmlydCgodW5zaWduZWQgbG9uZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmQtPnJlX21hcF9tZW1iYXNlICsgWEVNUE9SVFMpKTsKLQotCQkKKwkJLyogUENJIGNhcmRzIGFyZSBhbHJlYWR5IHJlbWFwcGVkIGF0IHRoaXMgcG9pbnQgSVNBIGFyZSBub3QgKi8KKwkJYmQtPm51bXBvcnRzID0gcmVhZHcoYmQtPnJlX21hcF9tZW1iYXNlICsgWEVNUE9SVFMpOwogCQllcGNhYXNzZXJ0KGJkLT5udW1wb3J0cyA8PSA2NCwiUENJIHJldHVybmVkIGEgaW52YWxpZCBudW1iZXIgb2YgcG9ydHMiKTsKIAkJbmJkZXZzICs9IChiZC0+bnVtcG9ydHMpOwotCi0JfSAvKiBFbmQgZ2V0IFBDSSBudW1iZXIgb2YgcG9ydHMgKi8KKwl9IGVsc2UgeworCQkvKiBGaXggdXAgdGhlIG1hcHBpbmdzIGZvciBJU0EvRUlTQSBldGMgKi8KKwkJLyogRklYTUU6IDY0SyAtIGNhbiB3ZSBiZSBzbWFydGVyID8gKi8KKwkJYmQtPnJlX21hcF9tZW1iYXNlID0gaW9yZW1hcChiZC0+bWVtYmFzZSwgMHgxMDAwMCk7CisJfQogCiAJaWYgKGNyZCAhPSAwKQogCQljYXJkX3B0cltjcmRdID0gY2FyZF9wdHJbY3JkLTFdICsgYm9hcmRzW2NyZC0xXS5udW1wb3J0czsKQEAgLTE3MDEsMTkgKzE0NTEsOSBAQAogCQljYXJkX3B0cltjcmRdID0gJmRpZ2lfY2hhbm5lbHNbY3JkXTsgLyogPC0gRm9yIGNhcmQgMCBvbmx5ICovCiAKIAljaCA9IGNhcmRfcHRyW2NyZF07Ci0KLQogCWVwY2Fhc3NlcnQoY2ggPD0gJmRpZ2lfY2hhbm5lbHNbbmJkZXZzIC0gMV0sICJjaCBvdXQgb2YgcmFuZ2UiKTsKIAotCW1lbWFkZHIgPSAodW5jaGFyICopYmQtPnJlX21hcF9tZW1iYXNlOwotCi0JLyogCi0JICAgVGhlIGJlbG93IGNvbW1hbmQgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgbmV3ZXIga2VybmVscyAoMi4xLnggYW5kCi0JICAgdXApIGRvIG5vdCBoYXZlIGEgMToxIHZpcnR1YWwgdG8gcGh5c2ljYWwgbWFwcGluZy4gIFRoZSBiZWxvdwotCSAgIGNhbGwgYWRqdXN0IGZvciB0aGF0LgotCSovCi0KLQltZW1hZGRyID0gKHVuc2lnbmVkIGNoYXIgKilidXNfdG9fdmlydCgodW5zaWduZWQgbG9uZyltZW1hZGRyKTsKKwltZW1hZGRyID0gYmQtPnJlX21hcF9tZW1iYXNlOwogCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJVGhlIGJlbG93IGFzc2lnbm1lbnQgd2lsbCBzZXQgYmMgdG8gcG9pbnQgYXQgdGhlIEJFR0lOSU5HIG9mCkBAIC0xNzIxLDcgKzE0NjEsNyBAQAogCQk4IGFuZCA2NCBvZiB0aGVzZSBzdHJ1Y3R1cmVzLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLQliYyA9ICh2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqKSgodWxvbmcpbWVtYWRkciArIENIQU5TVFJVQ1QpOworCWJjID0gKHN0cnVjdCBib2FyZF9jaGFuICopKG1lbWFkZHIgKyBDSEFOU1RSVUNUKTsKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJVGhlIGJlbG93IGFzc2lnbm1lbnQgd2lsbCBzZXQgZ2QgdG8gcG9pbnQgYXQgdGhlIEJFR0lOSU5HIG9mCkBAIC0xNzMwLDIwICsxNDcwLDE4IEBACiAJCXBvaW50ZXIgYmVnaW5zIGF0IDB4ZDEwLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotCWdkID0gKHZvbGF0aWxlIHN0cnVjdCBnbG9iYWxfZGF0YSAqKSgodWxvbmcpbWVtYWRkciArIEdMT0JBTCk7CisJZ2QgPSAoc3RydWN0IGdsb2JhbF9kYXRhICopKG1lbWFkZHIgKyBHTE9CQUwpOwogCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJWEVQT1JUUyAoYWRkcmVzcyAweGMyMikgcG9pbnRzIGF0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdGhlCiAJCWNhcmQgc3VwcG9ydHMuIChGb3IgNjRYRSwgWEksIFhFTSwgYW5kIFhSIHVzZSAweGMwMikKIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0JaWYgKCgoYmQtPnR5cGUgPT0gUENYRVZFKSB8IChiZC0+dHlwZSA9PSBQQ1hFKSkgJiYKLQkgICAgKCoodXNob3J0ICopKCh1bG9uZyltZW1hZGRyICsgWEVQT1JUUykgPCAzKSkKKwlpZiAoKGJkLT50eXBlID09IFBDWEVWRSB8fCBiZC0+dHlwZSA9PSBQQ1hFKSAmJiAocmVhZHcobWVtYWRkciArIFhFUE9SVFMpIDwgMykpCiAJCXNocmlua21lbSA9IDE7CiAJaWYgKGJkLT50eXBlIDwgUENJWEVNKQogCQlpZiAoIXJlcXVlc3RfcmVnaW9uKChpbnQpYmQtPnBvcnQsIDQsIGJvYXJkX2Rlc2NbYmQtPnR5cGVdKSkKIAkJCXJldHVybjsJCQotCiAJbWVtd2lub24oYmQsIDApOwogCiAJLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNzUzLDE3ICsxNDkxLDE2IEBACiAKIAkvKiBGb3IgZXZlcnkgcG9ydCBvbiB0aGUgY2FyZCBkbyAuLi4uLiAqLwogCi0JZm9yIChpID0gMDsgaSA8IGJkLT5udW1wb3J0czsgaSsrLCBjaCsrLCBiYysrKSAKLQl7IC8qIEJlZ2luIGZvciBlYWNoIHBvcnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYmQtPm51bXBvcnRzOyBpKyssIGNoKyssIGJjKyspICB7IC8qIEJlZ2luIGZvciBlYWNoIHBvcnQgKi8KKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQljaC0+YnJkY2hhbiAgICAgICAgPSBiYzsKIAkJY2gtPm1haWxib3ggICAgICAgID0gZ2Q7IAogCQlJTklUX1dPUksoJmNoLT50cXVldWUsIGRvX3NvZnRpbnQsIGNoKTsKIAkJY2gtPmJvYXJkICAgICAgICAgID0gJmJvYXJkc1tjcmRdOwogCi0JCXN3aXRjaCAoYmQtPnR5cGUpCi0JCXsgLyogQmVnaW4gc3dpdGNoIGJkLT50eXBlICovCi0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOworCQlzd2l0Y2ggKGJkLT50eXBlKSB7CiAJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQkJU2luY2Ugc29tZSBvZiB0aGUgYm9hcmRzIHVzZSBkaWZmZXJlbnQgYml0bWFwcyBmb3IgdGhlaXIKIAkJCQljb250cm9sIHNpZ25hbHMgd2UgY2Fubm90IGhhcmQgY29kZSB0aGVzZSB2YWx1ZXMgYW5kIHJldGFpbgpAQCAtMTc5NiwxNCArMTUzMywxMiBAQAogCQogCQl9IC8qIEVuZCBzd2l0Y2ggYmQtPnR5cGUgKi8KIAotCQlpZiAoYm9hcmRzW2NyZF0uYWx0cGluKSAKLQkJeworCQlpZiAoYm9hcmRzW2NyZF0uYWx0cGluKSB7CiAJCQljaC0+ZHNyID0gY2gtPm1fZGNkOwogCQkJY2gtPmRjZCA9IGNoLT5tX2RzcjsKIAkJCWNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgfD0gRElHSV9BTFRQSU47CiAJCX0KLQkJZWxzZSAKLQkJeyAKKwkJZWxzZSB7CiAJCQljaC0+ZGNkID0gY2gtPm1fZGNkOwogCQkJY2gtPmRzciA9IGNoLT5tX2RzcjsKIAkJfQpAQCAtMTgxMywxNCArMTU0OCwxMiBAQAogCQljaC0+bWFnaWMgICAgICA9IEVQQ0FfTUFHSUM7CiAJCWNoLT50dHkgICAgICAgID0gTlVMTDsKIAotCQlpZiAoc2hyaW5rbWVtKSAKLQkJeworCQlpZiAoc2hyaW5rbWVtKSB7CiAJCQlmZXBjbWQoY2gsIFNFVEJVRkZFUiwgMzIsIDAsIDAsIDApOwogCQkJc2hyaW5rbWVtID0gMDsKIAkJfQogCi0JCXN3aXRjaCAoYmQtPnR5cGUpCi0JCXsgLyogQmVnaW4gc3dpdGNoIGJkLT50eXBlICovCisJCXN3aXRjaCAoYmQtPnR5cGUpIHsKIAogCQkJY2FzZSBQQ0lYRU06CiAJCQljYXNlIFBDSVhSSjoKQEAgLTE4NzgsMTMgKzE2MTEsMTMgQEAKIAogCQlmZXBjbWQoY2gsIFNSWEhXQVRFUiwgKDMgKiBjaC0+cnhidWZzaXplIC8gNCksIDAsIDEwLCAwKTsKIAotCQliYy0+ZWRlbGF5ID0gMTAwOwotCQliYy0+aWRhdGEgPSAxOworCQl3cml0ZXcoMTAwLCAmYmMtPmVkZWxheSk7CisJCXdyaXRlYigxLCAmYmMtPmlkYXRhKTsKIAkKLQkJY2gtPnN0YXJ0YyAgPSBiYy0+c3RhcnRjOwotCQljaC0+c3RvcGMgICA9IGJjLT5zdG9wYzsKLQkJY2gtPnN0YXJ0Y2EgPSBiYy0+c3RhcnRjYTsKLQkJY2gtPnN0b3BjYSAgPSBiYy0+c3RvcGNhOworCQljaC0+c3RhcnRjICA9IHJlYWRiKCZiYy0+c3RhcnRjKTsKKwkJY2gtPnN0b3BjICAgPSByZWFkYigmYmMtPnN0b3BjKTsKKwkJY2gtPnN0YXJ0Y2EgPSByZWFkYigmYmMtPnN0YXJ0Y2EpOworCQljaC0+c3RvcGNhICA9IHJlYWRiKCZiYy0+c3RvcGNhKTsKIAkKIAkJY2gtPmZlcGNmbGFnID0gMDsKIAkJY2gtPmZlcGlmbGFnID0gMDsKQEAgLTE4OTksMjcgKzE2MzIsMjMgQEAKIAkJY2gtPmJsb2NrZWRfb3BlbiA9IDA7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoLT5vcGVuX3dhaXQpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+Y2xvc2Vfd2FpdCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CisKIAkJY2gtPnRtcF9idWYgPSBrbWFsbG9jKGNoLT50eGJ1ZnNpemUsR0ZQX0tFUk5FTCk7Ci0JCWlmICghKGNoLT50bXBfYnVmKSkKLQkJeworCQlpZiAoIWNoLT50bXBfYnVmKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlBPU1QgRkVQIElOSVQgOiBrbWFsbG9jIGZhaWxlZCBmb3IgcG9ydCAweCV4XG4iLGkpOwogCQkJcmVsZWFzZV9yZWdpb24oKGludCliZC0+cG9ydCwgNCk7CiAJCQl3aGlsZShpLS0gPiAwKQogCQkJCWtmcmVlKChjaC0tKS0+dG1wX2J1Zik7CiAJCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSAKKwkJfSBlbHNlCiAJCQltZW1zZXQoKHZvaWQgKiljaC0+dG1wX2J1ZiwwLGNoLT50eGJ1ZnNpemUpOwogCX0gLyogRW5kIGZvciBlYWNoIHBvcnQgKi8KIAogCXByaW50ayhLRVJOX0lORk8gCiAJICAgICAgICAiRGlnaSBQQy9YeCBEcml2ZXIgViVzOiAgJXMgSS9PID0gMHglbHggTWVtID0gMHglbHggUG9ydHMgPSAlZFxuIiwgCiAJICAgICAgICBWRVJTSU9OLCBib2FyZF9kZXNjW2JkLT50eXBlXSwgKGxvbmcpYmQtPnBvcnQsIChsb25nKWJkLT5tZW1iYXNlLCBiZC0+bnVtcG9ydHMpOwotCXNwcmludGYobWVzZywgCi0JICAgICAgICAiRGlnaSBQQy9YeCBEcml2ZXIgViVzOiAgJXMgSS9PID0gMHglbHggTWVtID0gMHglbHggUG9ydHMgPSAlZFxuIiwgCi0JICAgICAgICBWRVJTSU9OLCBib2FyZF9kZXNjW2JkLT50eXBlXSwgKGxvbmcpYmQtPnBvcnQsIChsb25nKWJkLT5tZW1iYXNlLCBiZC0+bnVtcG9ydHMpOwotCWNvbnNvbGVfcHJpbnQobWVzZyk7Ci0KIAltZW13aW5vZmYoYmQsIDApOwogCiB9IC8qIEVuZCBwb3N0X2ZlcF9pbml0ICovCkBAIC0xOTQzLDkgKzE2NzIsNiBAQAogCQlidWZmZXIgZW1wdHkpIGFuZCBhY3RzIG9uIHRob3NlIGV2ZW50cy4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCQotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwotCiAJZm9yIChjcmQgPSAwOyBjcmQgPCBudW1fY2FyZHM7IGNyZCsrKSAKIAl7IC8qIEJlZ2luIGZvciBlYWNoIGNhcmQgKi8KIApAQCAtMTk2MSw2ICsxNjg3LDggQEAKIAkJCXNvbWUgbGVnYWN5IGJvYXJkcy4KIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKKwogCQlhc3NlcnRtZW1vZmYoY2gpOwogCiAJCWdsb2JhbHdpbm9uKGNoKTsKQEAgLTE5NzAsMjEgKzE2OTgsMTkgQEAKIAkJCXRoZSB0cmFuc21pdCBvciByZWNlaXZlIHF1ZXVlLgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLQkJaGVhZCA9IGNoLT5tYWlsYm94LT5laW47Ci0JCXRhaWwgPSBjaC0+bWFpbGJveC0+ZW91dDsKKwkJaGVhZCA9IHJlYWR3KCZjaC0+bWFpbGJveC0+ZWluKTsKKwkJdGFpbCA9IHJlYWR3KCZjaC0+bWFpbGJveC0+ZW91dCk7CiAJCQogCQkvKiBJZiBoZWFkIGlzbid0IGVxdWFsIHRvIHRhaWwgd2UgaGF2ZSBhbiBldmVudCAqLwogCiAJCWlmIChoZWFkICE9IHRhaWwpCiAJCQlkb2V2ZW50KGNyZCk7Ci0KIAkJbWVtb2ZmKGNoKTsKIAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKKwogCX0gLyogRW5kIGZvciBlYWNoIGNhcmQgKi8KLQogCW1vZF90aW1lcigmZXBjYV90aW1lciwgamlmZmllcyArIChIWiAvIDI1KSk7Ci0KLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKIH0gLyogRW5kIGVwY2Fwb2xsICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBkb2V2ZW50ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE5OTIsNTMgKzE3MTgsNDIgQEAKIHN0YXRpYyB2b2lkIGRvZXZlbnQoaW50IGNyZCkKIHsgLyogQmVnaW4gZG9ldmVudCAqLwogCi0Jdm9sYXRpbGUgdW5jaGFyICpldmVudGJ1ZjsKKwl2b2lkICpldmVudGJ1ZjsKIAlzdHJ1Y3QgY2hhbm5lbCAqY2gsICpjaGFuMDsKIAlzdGF0aWMgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfaW5mbyAqYmQ7Ci0Jdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOwotCXJlZ2lzdGVyIHZvbGF0aWxlIHVuc2lnbmVkIGludCB0YWlsLCBoZWFkOwotCXJlZ2lzdGVyIGludCBldmVudCwgY2hhbm5lbDsKLQlyZWdpc3RlciBpbnQgbXN0YXQsIGxzdGF0OworCXN0cnVjdCBib2FyZF9pbmZvICpiZDsKKwlzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisJdW5zaWduZWQgaW50IHRhaWwsIGhlYWQ7CisJaW50IGV2ZW50LCBjaGFubmVsOworCWludCBtc3RhdCwgbHN0YXQ7CiAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCVRoaXMgc3Vicm91dGluZSBpcyBjYWxsZWQgYnkgZXBjYXBvbGwgd2hlbiBhbiBldmVudCBpcyBkZXRlY3RlZCAKIAkJaW4gdGhlIGV2ZW50IHF1ZXVlLiAgVGhpcyByb3V0aW5lIHJlc3BvbmRzIHRvIHRob3NlIGV2ZW50cy4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogCWJkID0gJmJvYXJkc1tjcmRdOwogCiAJY2hhbjAgPSBjYXJkX3B0cltjcmRdOwogCWVwY2Fhc3NlcnQoY2hhbjAgPD0gJmRpZ2lfY2hhbm5lbHNbbmJkZXZzIC0gMV0sICJjaCBvdXQgb2YgcmFuZ2UiKTsKLQogCWFzc2VydGd3aW5vbihjaGFuMCk7Ci0KLQl3aGlsZSAoKHRhaWwgPSBjaGFuMC0+bWFpbGJveC0+ZW91dCkgIT0gKGhlYWQgPSBjaGFuMC0+bWFpbGJveC0+ZWluKSkgCisJd2hpbGUgKCh0YWlsID0gcmVhZHcoJmNoYW4wLT5tYWlsYm94LT5lb3V0KSkgIT0gKGhlYWQgPSByZWFkdygmY2hhbjAtPm1haWxib3gtPmVpbikpKQogCXsgLyogQmVnaW4gd2hpbGUgc29tZXRoaW5nIGluIGV2ZW50IHF1ZXVlICovCi0KIAkJYXNzZXJ0Z3dpbm9uKGNoYW4wKTsKLQotCQlldmVudGJ1ZiA9ICh2b2xhdGlsZSB1bmNoYXIgKilidXNfdG9fdmlydCgodWxvbmcpKGJkLT5yZV9tYXBfbWVtYmFzZSArIHRhaWwgKyBJU1RBUlQpKTsKLQorCQlldmVudGJ1ZiA9IGJkLT5yZV9tYXBfbWVtYmFzZSArIHRhaWwgKyBJU1RBUlQ7CiAJCS8qIEdldCB0aGUgY2hhbm5lbCB0aGUgZXZlbnQgb2NjdXJyZWQgb24gKi8KLQkJY2hhbm5lbCA9IGV2ZW50YnVmWzBdOwotCisJCWNoYW5uZWwgPSByZWFkYihldmVudGJ1Zik7CiAJCS8qIEdldCB0aGUgYWN0dWFsIGV2ZW50IGNvZGUgdGhhdCBvY2N1cnJlZCAqLwotCQlldmVudCA9IGV2ZW50YnVmWzFdOwotCisJCWV2ZW50ID0gcmVhZGIoZXZlbnRidWYgKyAxKTsKIAkJLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCVRoZSB0d28gYXNzaWdubWVudHMgYmVsb3cgZ2V0IHRoZSBjdXJyZW50IG1vZGVtIHN0YXR1cyAobXN0YXQpCiAJCQlhbmQgdGhlIHByZXZpb3VzIG1vZGVtIHN0YXR1cyAobHN0YXQpLiAgVGhlc2UgYXJlIHVzZWZ1bCBiZWN1YXNlCiAJCQlhbiBldmVudCBjb3VsZCBzaWduYWwgYSBjaGFuZ2UgaW4gbW9kZW0gc2lnbmFscyBpdHNlbGYuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCQltc3RhdCA9IGV2ZW50YnVmWzJdOwotCQlsc3RhdCA9IGV2ZW50YnVmWzNdOworCQltc3RhdCA9IHJlYWRiKGV2ZW50YnVmICsgMik7CisJCWxzdGF0ID0gcmVhZGIoZXZlbnRidWYgKyAzKTsKIAogCQljaCA9IGNoYW4wICsgY2hhbm5lbDsKLQotCQlpZiAoKHVuc2lnbmVkKWNoYW5uZWwgPj0gYmQtPm51bXBvcnRzIHx8ICFjaCkgCi0JCXsgCisJCWlmICgodW5zaWduZWQpY2hhbm5lbCA+PSBiZC0+bnVtcG9ydHMgfHwgIWNoKSAgewogCQkJaWYgKGNoYW5uZWwgPj0gYmQtPm51bXBvcnRzKQogCQkJCWNoID0gY2hhbjA7CiAJCQliYyA9IGNoLT5icmRjaGFuOwpAQCAtMjA0OCw5NyArMTc2Myw1MyBAQAogCQlpZiAoKGJjID0gY2gtPmJyZGNoYW4pID09IE5VTEwpCiAJCQlnb3RvIG5leHQ7CiAKLQkJaWYgKGV2ZW50ICYgREFUQV9JTkQpIAotCQl7IC8qIEJlZ2luIERBVEFfSU5EICovCi0KKwkJaWYgKGV2ZW50ICYgREFUQV9JTkQpICB7IC8qIEJlZ2luIERBVEFfSU5EICovCiAJCQlyZWNlaXZlX2RhdGEoY2gpOwogCQkJYXNzZXJ0Z3dpbm9uKGNoKTsKLQogCQl9IC8qIEVuZCBEQVRBX0lORCAqLwogCQkvKiBlbHNlICovLyogRml4IGZvciBEQ0QgdHJhbnNpdGlvbiBtaXNzZWQgYnVnICovCi0JCWlmIChldmVudCAmIE1PREVNQ0hHX0lORCkgCi0JCXsgLyogQmVnaW4gTU9ERU1DSEdfSU5EICovCi0KKwkJaWYgKGV2ZW50ICYgTU9ERU1DSEdfSU5EKSAgeyAvKiBCZWdpbiBNT0RFTUNIR19JTkQgKi8KIAkJCS8qIEEgbW9kZW0gc2lnbmFsIGNoYW5nZSBoYXMgYmVlbiBpbmRpY2F0ZWQgKi8KLQogCQkJY2gtPmltb2RlbSA9IG1zdGF0OwotCi0JCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgCi0JCQl7CisJCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgIHsKIAkJCQlpZiAobXN0YXQgJiBjaC0+ZGNkKSAgLyogV2UgYXJlIG5vdyByZWNlaXZpbmcgZGNkICovCiAJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7CiAJCQkJZWxzZQogCQkJCQlwY19zY2hlZF9ldmVudChjaCwgRVBDQV9FVkVOVF9IQU5HVVApOyAvKiBObyBkY2Q7IGhhbmd1cCAqLwogCQkJfQotCiAJCX0gLyogRW5kIE1PREVNQ0hHX0lORCAqLwotCiAJCXR0eSA9IGNoLT50dHk7Ci0JCWlmICh0dHkpIAotCQl7IC8qIEJlZ2luIGlmIHZhbGlkIHR0eSAqLwotCi0JCQlpZiAoZXZlbnQgJiBCUkVBS19JTkQpIAotCQkJeyAvKiBCZWdpbiBpZiBCUkVBS19JTkQgKi8KLQorCQlpZiAodHR5KSAgeyAvKiBCZWdpbiBpZiB2YWxpZCB0dHkgKi8KKwkJCWlmIChldmVudCAmIEJSRUFLX0lORCkgIHsgLyogQmVnaW4gaWYgQlJFQUtfSU5EICovCiAJCQkJLyogQSBicmVhayBoYXMgYmVlbiBpbmRpY2F0ZWQgKi8KLQogCQkJCXR0eS0+ZmxpcC5jb3VudCsrOwogCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfQlJFQUs7Ci0KIAkJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKLQogCQkJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7IAotCi0JCQl9IC8qIEVuZCBpZiBCUkVBS19JTkQgKi8KLQkJCWVsc2UKLQkJCWlmIChldmVudCAmIExPV1RYX0lORCkgCi0JCQl7IC8qIEJlZ2luIExPV1RYX0lORCAqLwotCisJCQl9IGVsc2UgaWYgKGV2ZW50ICYgTE9XVFhfSU5EKSAgeyAvKiBCZWdpbiBMT1dUWF9JTkQgKi8KIAkJCQlpZiAoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgCiAJCQkJeyAvKiBCZWdpbiBpZiBMT1dXQUlUICovCi0KIAkJCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5MT1dXQUlUOwogCQkJCQl0dHlfd2FrZXVwKHR0eSk7CiAJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKLQogCQkJCX0gLyogRW5kIGlmIExPV1dBSVQgKi8KLQotCQkJfSAvKiBFbmQgTE9XVFhfSU5EICovCi0JCQllbHNlCi0JCQlpZiAoZXZlbnQgJiBFTVBUWVRYX0lORCkgCi0JCQl7IC8qIEJlZ2luIEVNUFRZVFhfSU5EICovCi0KKwkJCX0gZWxzZSBpZiAoZXZlbnQgJiBFTVBUWVRYX0lORCkgIHsgLyogQmVnaW4gRU1QVFlUWF9JTkQgKi8KIAkJCQkvKiBUaGlzIGV2ZW50IGlzIGdlbmVyYXRlZCBieSBzZXR1cF9lbXB0eV9ldmVudCAqLwotCiAJCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5UWEJVU1k7Ci0JCQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIEVNUFRZV0FJVCkgCi0JCQkJeyAvKiBCZWdpbiBpZiBFTVBUWVdBSVQgKi8KLQorCQkJCWlmIChjaC0+c3RhdHVzZmxhZ3MgJiBFTVBUWVdBSVQpICB7IC8qIEJlZ2luIGlmIEVNUFRZV0FJVCAqLwogCQkJCQljaC0+c3RhdHVzZmxhZ3MgJj0gfkVNUFRZV0FJVDsKIAkJCQkJdHR5X3dha2V1cCh0dHkpOwotCiAJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKLQogCQkJCX0gLyogRW5kIGlmIEVNUFRZV0FJVCAqLwotCiAJCQl9IC8qIEVuZCBFTVBUWVRYX0lORCAqLwotCiAJCX0gLyogRW5kIGlmIHZhbGlkIHR0eSAqLwotCi0KIAluZXh0OgogCQlnbG9iYWx3aW5vbihjaCk7Ci0KLQkJaWYgKCFiYykKLQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGJjID09IE5VTEwgaW4gZG9ldmVudCFcbiIpOwotCQllbHNlIAotCQkJYmMtPmlkYXRhID0gMTsKLQotCQljaGFuMC0+bWFpbGJveC0+ZW91dCA9ICh0YWlsICsgNCkgJiAoSU1BWCAtIElTVEFSVCAtIDQpOworCQlCVUdfT04oIWJjKTsKKwkJd3JpdGV3KDEsICZiYy0+aWRhdGEpOworCQl3cml0ZXcoKHRhaWwgKyA0KSAmIChJTUFYIC0gSVNUQVJUIC0gNCksICZjaGFuMC0+bWFpbGJveC0+ZW91dCk7CiAJCWdsb2JhbHdpbm9uKGNoYW4wKTsKLQogCX0gLyogRW5kIHdoaWxlIHNvbWV0aGluZyBpbiBldmVudCBxdWV1ZSAqLwotCiB9IC8qIEVuZCBkb2V2ZW50ICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBmZXBjbWQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjE0Niw3ICsxODE3LDYgQEAKIHN0YXRpYyB2b2lkIGZlcGNtZChzdHJ1Y3QgY2hhbm5lbCAqY2gsIGludCBjbWQsIGludCB3b3JkX29yX2J5dGUsCiAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGUyLCBpbnQgbmNtZHMsIGludCBieXRlY21kKQogeyAvKiBCZWdpbiBmZXBjbWQgKi8KLQogCXVuY2hhciAqbWVtYWRkcjsKIAl1bnNpZ25lZCBpbnQgaGVhZCwgY21kVGFpbCwgY21kU3RhcnQsIGNtZE1heDsKIAlsb25nIGNvdW50OwpAQCAtMjE1NSw5MyArMTgyNSw1NyBAQAogCS8qIFRoaXMgaXMgdGhlIHJvdXRpbmUgaW4gd2hpY2ggY29tbWFuZHMgbWF5IGJlIHBhc3NlZCB0byB0aGUgY2FyZC4gKi8KIAogCWlmIChjaC0+Ym9hcmQtPnN0YXR1cyA9PSBESVNBQkxFRCkKLQl7CiAJCXJldHVybjsKLQl9Ci0KIAlhc3NlcnRnd2lub24oY2gpOwotCiAJLyogUmVtZW1iZXIgaGVhZCAoQXMgd2VsbCBhcyBtYXgpIGlzIGp1c3QgYW4gb2Zmc2V0IG5vdCBhIGJhc2UgYWRkciAqLwotCWhlYWQgPSBjaC0+bWFpbGJveC0+Y2luOwotCisJaGVhZCA9IHJlYWR3KCZjaC0+bWFpbGJveC0+Y2luKTsKIAkvKiBjbWRTdGFydCBpcyBhIGJhc2UgYWRkcmVzcyAqLwotCWNtZFN0YXJ0ID0gY2gtPm1haWxib3gtPmNzdGFydDsKLQorCWNtZFN0YXJ0ID0gcmVhZHcoJmNoLT5tYWlsYm94LT5jc3RhcnQpOwogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlXZSBkbyB0aGUgYWRkaXRpb24gYmVsb3cgYmVjYXVzZSB3ZSBkbyBub3Qgd2FudCBhIG1heCBwb2ludGVyIAogCQlyZWxhdGl2ZSB0byBjbWRTdGFydC4gIFdlIHdhbnQgYSBtYXggcG9pbnRlciB0aGF0IHBvaW50cyBhdCB0aGUgCiAJCXBoeXNpY2FsIGVuZCBvZiB0aGUgY29tbWFuZCBxdWV1ZS4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0JY21kTWF4ID0gKGNtZFN0YXJ0ICsgNCArIChjaC0+bWFpbGJveC0+Y21heCkpOwotCisJY21kTWF4ID0gKGNtZFN0YXJ0ICsgNCArIHJlYWR3KCZjaC0+bWFpbGJveC0+Y21heCkpOwogCW1lbWFkZHIgPSBjaC0+Ym9hcmQtPnJlX21hcF9tZW1iYXNlOwogCi0JLyogCi0JICAgVGhlIGJlbG93IGNvbW1hbmQgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgbmV3ZXIga2VybmVscyAoMi4xLnggYW5kCi0JICAgdXApIGRvIG5vdCBoYXZlIGEgMToxIHZpcnR1YWwgdG8gcGh5c2ljYWwgbWFwcGluZy4gIFRoZSBiZWxvdwotCSAgIGNhbGwgYWRqdXN0IGZvciB0aGF0LgotCSovCi0KLQltZW1hZGRyID0gKHVuc2lnbmVkIGNoYXIgKilidXNfdG9fdmlydCgodW5zaWduZWQgbG9uZyltZW1hZGRyKTsKLQotCWlmIChoZWFkID49IChjbWRNYXggLSBjbWRTdGFydCkgfHwgKGhlYWQgJiAwMykpIAotCXsKLQkJcHJpbnRrKEtFUk5fRVJSICJsaW5lICVkOiBPdXQgb2YgcmFuZ2UsIGNtZCA9ICV4LCBoZWFkID0gJXhcbiIsIF9fTElORV9fLCAKLSAgICAgICAgICAgICAgY21kLCBoZWFkKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJsaW5lICVkOiBPdXQgb2YgcmFuZ2UsIGNtZE1heCA9ICV4LCBjbWRTdGFydCA9ICV4XG4iLCBfX0xJTkVfXywgCi0gICAgICAgICAgICAgIGNtZE1heCwgY21kU3RhcnQpOworCWlmIChoZWFkID49IChjbWRNYXggLSBjbWRTdGFydCkgfHwgKGhlYWQgJiAwMykpICB7CisJCXByaW50ayhLRVJOX0VSUiAibGluZSAlZDogT3V0IG9mIHJhbmdlLCBjbWQgPSAleCwgaGVhZCA9ICV4XG4iLCBfX0xJTkVfXywgIGNtZCwgaGVhZCk7CisJCXByaW50ayhLRVJOX0VSUiAibGluZSAlZDogT3V0IG9mIHJhbmdlLCBjbWRNYXggPSAleCwgY21kU3RhcnQgPSAleFxuIiwgX19MSU5FX18sICBjbWRNYXgsIGNtZFN0YXJ0KTsKIAkJcmV0dXJuOwogCX0KLQotCWlmIChieXRlY21kKSAKLQl7Ci0JCSoodm9sYXRpbGUgdW5jaGFyICopKG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAwKSA9ICh1bmNoYXIpY21kOwotCi0JCSoodm9sYXRpbGUgdW5jaGFyICopKG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAxKSA9ICh1bmNoYXIpY2gtPmNoYW5uZWxudW07CisJaWYgKGJ5dGVjbWQpICB7CisJCXdyaXRlYihjbWQsIG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAwKTsKKwkJd3JpdGViKGNoLT5jaGFubmVsbnVtLCAgbWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDEpOwogCQkvKiBCZWxvdyB3b3JkX29yX2J5dGUgaXMgYml0cyB0byBzZXQgKi8KLQkJKih2b2xhdGlsZSB1bmNoYXIgKikobWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDIpID0gKHVuY2hhcil3b3JkX29yX2J5dGU7CisJCXdyaXRlYih3b3JkX29yX2J5dGUsICBtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMik7CiAJCS8qIEJlbG93IGJ5dGUyIGlzIGJpdHMgdG8gcmVzZXQgKi8KLQkJKih2b2xhdGlsZSB1bmNoYXIgKikobWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDMpID0gKHVuY2hhcilieXRlMjsKLQotCX0gCi0JZWxzZSAKLQl7Ci0JCSoodm9sYXRpbGUgdW5jaGFyICopKG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAwKSA9ICh1bmNoYXIpY21kOwotCQkqKHZvbGF0aWxlIHVuY2hhciAqKShtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMSkgPSAodW5jaGFyKWNoLT5jaGFubmVsbnVtOwotCQkqKHZvbGF0aWxlIHVzaG9ydCopKG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAyKSA9ICh1c2hvcnQpd29yZF9vcl9ieXRlOworCQl3cml0ZWIoYnl0ZTIsIG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAzKTsKKwl9ICBlbHNlIHsKKwkJd3JpdGViKGNtZCwgbWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDApOworCQl3cml0ZWIoY2gtPmNoYW5uZWxudW0sICBtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMSk7CisJCXdyaXRlYih3b3JkX29yX2J5dGUsICBtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMik7CiAJfQotCiAJaGVhZCA9IChoZWFkICsgNCkgJiAoY21kTWF4IC0gY21kU3RhcnQgLSA0KTsKLQljaC0+bWFpbGJveC0+Y2luID0gaGVhZDsKLQorCXdyaXRldyhoZWFkLCAmY2gtPm1haWxib3gtPmNpbik7CiAJY291bnQgPSBGRVBUSU1FT1VUOwogCi0JZm9yICg7OykgCi0JeyAvKiBCZWdpbiBmb3JldmVyIGxvb3AgKi8KLQorCWZvciAoOzspICB7IC8qIEJlZ2luIGZvcmV2ZXIgbG9vcCAqLwogCQljb3VudC0tOwotCQlpZiAoY291bnQgPT0gMCkgCi0JCXsKKwkJaWYgKGNvdW50ID09IDApICB7CiAJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBGZXAgbm90IHJlc3BvbmRpbmcgaW4gZmVwY21kKClcbiIpOwogCQkJcmV0dXJuOwogCQl9Ci0KLQkJaGVhZCA9IGNoLT5tYWlsYm94LT5jaW47Ci0JCWNtZFRhaWwgPSBjaC0+bWFpbGJveC0+Y291dDsKLQorCQloZWFkID0gcmVhZHcoJmNoLT5tYWlsYm94LT5jaW4pOworCQljbWRUYWlsID0gcmVhZHcoJmNoLT5tYWlsYm94LT5jb3V0KTsKIAkJbiA9IChoZWFkIC0gY21kVGFpbCkgJiAoY21kTWF4IC0gY21kU3RhcnQgLSA0KTsKLQogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlCYXNpY2FsbHkgdGhpcyB3aWxsIGJyZWFrIHdoZW4gdGhlIEZFUCBhY2tub3dsZWRnZXMgdGhlIAogCQkJY29tbWFuZCBieSBpbmNyZW1lbnRpbmcgY21kVGFpbCAoTWFraW5nIGl0IGVxdWFsIHRvIGhlYWQpLgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAkJaWYgKG4gPD0gbmNtZHMgKiAoc2l6ZW9mKHNob3J0KSAqIDQpKQogCQkJYnJlYWs7IC8qIFdlbGwgbmVhcmx5IGZvcmV2ZXIgOi0pICovCi0KIAl9IC8qIEVuZCBmb3JldmVyIGxvb3AgKi8KLQogfSAvKiBFbmQgZmVwY21kICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjI1NSwxMSArMTg4OSw5IEBACiAKIHN0YXRpYyB1bnNpZ25lZCB0ZXJtaW9zMmRpZ2lfaChzdHJ1Y3QgY2hhbm5lbCAqY2gsIHVuc2lnbmVkIGNmbGFnKQogeyAvKiBCZWdpbiB0ZXJtaW9zMmRpZ2lfaCAqLwotCiAJdW5zaWduZWQgcmVzID0gMDsKIAotCWlmIChjZmxhZyAmIENSVFNDVFMpIAotCXsKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CiAJCWNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgfD0gKFJUU1BBQ0UgfCBDVFNQQUNFKTsKIAkJcmVzIHw9ICgoY2gtPm1fY3RzKSB8IChjaC0+bV9ydHMpKTsKIAl9CkBAIC0yMjk1LDcgKzE5MjcsNiBAQAogCiAJdW5zaWduZWQgcmVzID0gaWZsYWcgJiAoSUdOQlJLIHwgQlJLSU5UIHwgSUdOUEFSIHwgUEFSTVJLIHwgCiAJICAgICAgICAgICAgICAgICAgICAgICAgSU5QQ0sgfCBJU1RSSVB8SVhPTnxJWEFOWXxJWE9GRik7Ci0JCiAJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBESUdJX0FJWE9OKQogCQlyZXMgfD0gSUFJWE9OOwogCXJldHVybiByZXM7CkBAIC0yMzA4LDI4ICsxOTM5LDE1IEBACiB7IC8qIEJlZ2luIHRlcm1pb3MyZGlnaV9jICovCiAKIAl1bnNpZ25lZCByZXMgPSAwOwotCi0jaWZkZWYgU1BFRURfSEFDSwotCS8qIENMOiBIQUNLIHRvIGZvcmNlIDExNTIwMCBhdCAzODQwMCBhbmQgNTc2MDAgYXQgMTkyMDAgQmF1ZCAqLwotCWlmICgoY2ZsYWcgJiBDQkFVRCk9PSBCMzg0MDApIGNmbGFnPWNmbGFnIC0gQjM4NDAwICsgQjExNTIwMDsKLQlpZiAoKGNmbGFnICYgQ0JBVUQpPT0gQjE5MjAwKSBjZmxhZz1jZmxhZyAtIEIxOTIwMCArIEI1NzYwMDsKLSNlbmRpZiAvKiBTUEVFRF9IQUNLICovCi0KLQlpZiAoY2ZsYWcgJiBDQkFVREVYKQotCXsgLyogQmVnaW4gZGV0ZWN0ZWQgQ0JBVURFWCAqLwotCisJaWYgKGNmbGFnICYgQ0JBVURFWCkgeyAvKiBCZWdpbiBkZXRlY3RlZCBDQkFVREVYICovCiAJCWNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgfD0gRElHSV9GQVNUOwotCiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJICAgSFVQQ0wgYml0IGlzIHVzZWQgYnkgRkVQIHRvIGluZGljYXRlIGZhc3QgYmF1ZAogCQkgICB0YWJsZSBpcyB0byBiZSB1c2VkLgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJCXJlcyB8PSBGRVBfSFVQQ0w7Ci0KIAl9IC8qIEVuZCBkZXRlY3RlZCBDQkFVREVYICovCiAJZWxzZSBjaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzICY9IH5ESUdJX0ZBU1Q7IAotCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlDQkFVRCBoYXMgYml0IHBvc2l0aW9uIDB4MTAwMCBzZXQgdGhlc2UgZGF5cyB0byBpbmRpY2F0ZSBMaW51eAogCQliYXVkIHJhdGUgcmVtYXAuICBEaWdpIGhhcmR3YXJlIGNhbid0IGhhbmRsZSB0aGUgYml0IGFzc2lnbm1lbnQuCkBAIC0yMzM3LDcgKzE5NTUsNiBAQAogCQliaXQgb3V0LgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAlyZXMgfD0gY2ZsYWcgJiAoKENCQVVEIF4gQ0JBVURFWCkgfCBQQVJPREQgfCBQQVJFTkIgfCBDU1RPUEIgfCBDU0laRSk7Ci0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCVRoaXMgZ2V0cyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgRGlnaSBjYXJkcyBoYXZlIHRoZWlyIG93bgogCQlyZXByZXNlbnRhdGlvbiBvZiBjX2NmbGFncyBjb250cm9saW5nIGJhdWQgcmF0ZS4gIEZvciB0aGUgbW9zdApAQCAtMjM1NywxMCArMTk3NCw4IEBACiAJCXNob3VsZCBiZSBjaGVja2VkIGZvciBhIHNjcmVlbmVkIG91dCBwcmlvciB0byB0ZXJtaW9zMmRpZ2lfYyAKIAkJcmV0dXJuaW5nLiAgU2luY2UgQ0xPQ0FMIGlzbid0IHVzZWQgYnkgdGhlIGJvYXJkIHRoaXMgY2FuIGJlCiAJCWlnbm9yZWQgYXMgbG9uZyBhcyB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdXNlZCBvbmx5IGJ5IERpZ2kgaGFyZHdhcmUuIAotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQlpZiAoY2ZsYWcgJiBDQkFVREVYKQotCXsKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlpZiAoY2ZsYWcgJiBDQkFVREVYKSB7CiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCVRoZSBiZWxvdyBjb2RlIGlzIHRyeWluZyB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGJhdWQgcmF0ZXMKIAkJCTExNTIwMCBhbmQgMjMwNDAwIGFyZSByZW1hcHBlZC4gIFdlIHVzZSBleGNsdXNpdmUgb3IgYmVjYXVzZQpAQCAtMjM3MSwxMzggKzE5ODYsOTYgQEAKIAkJCQkKIAkJaWYgKCghKChjZmxhZyAmIDB4NykgXiAoQjExNTIwMCAmIH5DQkFVREVYKSkpIHx8IAogCQkgICAgKCEoKGNmbGFnICYgMHg3KSBeIChCMjMwNDAwICYgfkNCQVVERVgpKSkpCi0JCXsKIAkJCXJlcyArPSAxOwotCQl9CiAJfQotCiAJcmV0dXJuIHJlczsKIAogfSAvKiBFbmQgdGVybWlvczJkaWdpX2MgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGVwY2FwYXJhbSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorLyogQ2FsbGVyIG11c3QgaG9sZCB0aGUgbG9ja3MgKi8KIHN0YXRpYyB2b2lkIGVwY2FwYXJhbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7IC8qIEJlZ2luIGVwY2FwYXJhbSAqLwogCiAJdW5zaWduZWQgaW50IGNtZEhlYWQ7CiAJc3RydWN0IHRlcm1pb3MgKnRzOwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CiAJdW5zaWduZWQgbXZhbCwgaGZsb3csIGNmbGFnLCBpZmxhZzsKIAogCWJjID0gY2gtPmJyZGNoYW47CiAJZXBjYWFzc2VydChiYyAhPTAsICJiYyBvdXQgb2YgcmFuZ2UiKTsKIAogCWFzc2VydGd3aW5vbihjaCk7Ci0KIAl0cyA9IHR0eS0+dGVybWlvczsKLQotCWlmICgodHMtPmNfY2ZsYWcgJiBDQkFVRCkgPT0gMCkgCi0JeyAvKiBCZWdpbiBDQkFVRCBkZXRlY3RlZCAqLwotCi0JCWNtZEhlYWQgPSBiYy0+cmluOworCWlmICgodHMtPmNfY2ZsYWcgJiBDQkFVRCkgPT0gMCkgIHsgLyogQmVnaW4gQ0JBVUQgZGV0ZWN0ZWQgKi8KKwkJY21kSGVhZCA9IHJlYWR3KCZiYy0+cmluKTsKIAkJYmMtPnJvdXQgPSBjbWRIZWFkOwotCQljbWRIZWFkID0gYmMtPnRpbjsKLQorCQljbWRIZWFkID0gcmVhZHcoJmJjLT50aW4pOwogCQkvKiBDaGFuZ2luZyBiYXVkIGluIG1pZC1zdHJlYW0gdHJhbnNtaXNzaW9uIGNhbiBiZSB3b25kZXJmdWwgKi8KIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlGbHVzaCBjdXJyZW50IHRyYW5zbWl0IGJ1ZmZlciBieSBzZXR0aW5nIGNtZFRhaWwgcG9pbnRlciAodG91dCkKIAkJCXRvIGNtZEhlYWQgcG9pbnRlciAodGluKS4gIEhvcGVmdWxseSB0aGUgdHJhbnNtaXQgYnVmZmVyIGlzIGVtcHR5LgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJCWZlcGNtZChjaCwgU1RPVVQsICh1bnNpZ25lZCkgY21kSGVhZCwgMCwgMCwgMCk7CiAJCW12YWwgPSAwOwotCi0JfSAvKiBFbmQgQ0JBVUQgZGV0ZWN0ZWQgKi8KLQllbHNlIAotCXsgLyogQmVnaW4gQ0JBVUQgbm90IGRldGVjdGVkICovCi0KKwl9IGVsc2UgIHsgLyogQmVnaW4gQ0JBVUQgbm90IGRldGVjdGVkICovCiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCWNfY2ZsYWdzIGhhdmUgY2hhbmdlZCBidXQgdGhhdCBjaGFuZ2UgaGFkIG5vdGhpbmcgdG8gZG8gd2l0aCBCQVVELgogCQkJUHJvcGFnYXRlIHRoZSBjaGFuZ2UgdG8gdGhlIGNhcmQuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCi0KIAkJY2ZsYWcgPSB0ZXJtaW9zMmRpZ2lfYyhjaCwgdHMtPmNfY2ZsYWcpOwotCi0JCWlmIChjZmxhZyAhPSBjaC0+ZmVwY2ZsYWcpIAotCQl7CisJCWlmIChjZmxhZyAhPSBjaC0+ZmVwY2ZsYWcpICB7CiAJCQljaC0+ZmVwY2ZsYWcgPSBjZmxhZzsKIAkJCS8qIFNldCBiYXVkIHJhdGUsIGNoYXIgc2l6ZSwgc3RvcCBiaXRzLCBwYXJpdHkgKi8KIAkJCWZlcGNtZChjaCwgU0VUQ1RSTEZMQUdTLCAodW5zaWduZWQpIGNmbGFnLCAwLCAwLCAwKTsKIAkJfQotCi0KIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJSWYgdGhlIHVzZXIgaGFzIG5vdCBmb3JjZWQgQ0xPQ0FMIGFuZCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBhIAogCQkJQ0FMTE9VVCBkZXZpY2UgKFdoaWNoIGlzIGFsd2F5cyBDTE9DQUwpIHdlIHNldCBmbGFncyBzdWNoIHRoYXQKIAkJCXRoZSBkcml2ZXIgd2lsbCB3YWl0IG9uIGNhcnJpZXIgZGV0ZWN0LgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAkJaWYgKHRzLT5jX2NmbGFnICYgQ0xPQ0FMKQotCQl7IC8qIEJlZ2luIGl0IGlzIGEgY3VkIGRldmljZSBvciBhIHR0eUQgZGV2aWNlIHdpdGggQ0xPQ0FMIG9uICovCiAJCQljaC0+YXN5bmNmbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7Ci0JCX0gLyogRW5kIGl0IGlzIGEgY3VkIGRldmljZSBvciBhIHR0eUQgZGV2aWNlIHdpdGggQ0xPQ0FMIG9uICovCiAJCWVsc2UKLQkJeyAvKiBCZWdpbiBpdCBpcyBhIHR0eUQgZGV2aWNlICovCiAJCQljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKLQkJfSAvKiBFbmQgaXQgaXMgYSB0dHlEIGRldmljZSAqLwotCiAJCW12YWwgPSBjaC0+bV9kdHIgfCBjaC0+bV9ydHM7Ci0KIAl9IC8qIEVuZCBDQkFVRCBub3QgZGV0ZWN0ZWQgKi8KLQogCWlmbGFnID0gdGVybWlvczJkaWdpX2koY2gsIHRzLT5jX2lmbGFnKTsKLQogCS8qIENoZWNrIGlucHV0IG1vZGUgZmxhZ3MgKi8KLQotCWlmIChpZmxhZyAhPSBjaC0+ZmVwaWZsYWcpIAotCXsKKwlpZiAoaWZsYWcgIT0gY2gtPmZlcGlmbGFnKSAgewogCQljaC0+ZmVwaWZsYWcgPSBpZmxhZzsKLQogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCUNvbW1hbmQgc2V0cyBjaGFubmVscyBpZmxhZyBzdHJ1Y3R1cmUgb24gdGhlIGJvYXJkLiBTdWNoIHRoaW5ncyAKIAkJCWFzIGlucHV0IHNvZnQgZmxvdyBjb250cm9sLCBoYW5kbGluZyBvZiBwYXJpdHkgZXJyb3JzLCBhbmQKIAkJCWJyZWFrIGhhbmRsaW5nIGFyZSBhbGwgc2V0IGhlcmUuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogCQkvKiBicmVhayBoYW5kbGluZywgcGFyaXR5IGhhbmRsaW5nLCBpbnB1dCBzdHJpcHBpbmcsIGZsb3cgY29udHJvbCBjaGFycyAqLwogCQlmZXBjbWQoY2gsIFNFVElGTEFHUywgKHVuc2lnbmVkIGludCkgY2gtPmZlcGlmbGFnLCAwLCAwLCAwKTsKIAl9Ci0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJU2V0IHRoZSBib2FyZCBtaW50IHZhbHVlIGZvciB0aGlzIGNoYW5uZWwuICBUaGlzIHdpbGwgY2F1c2UgaGFyZHdhcmUKIAkJZXZlbnRzIHRvIGJlIGdlbmVyYXRlZCBlYWNoIHRpbWUgdGhlIERDRCBzaWduYWwgKERlc2NyaWJlZCBpbiBtaW50KSAKIAkJY2hhbmdlcy4JCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWJjLT5taW50ID0gY2gtPmRjZDsKLQorCXdyaXRlYihjaC0+ZGNkLCAmYmMtPm1pbnQpOwogCWlmICgodHMtPmNfY2ZsYWcgJiBDTE9DQUwpIHx8IChjaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzICYgRElHSV9GT1JDRURDRCkpCiAJCWlmIChjaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzICYgRElHSV9GT1JDRURDRCkKLQkJCWJjLT5taW50ID0gMDsKLQotCWNoLT5pbW9kZW0gPSBiYy0+bXN0YXQ7Ci0KKwkJCXdyaXRlYigwLCAmYmMtPm1pbnQpOworCWNoLT5pbW9kZW0gPSByZWFkYigmYmMtPm1zdGF0KTsKIAloZmxvdyA9IHRlcm1pb3MyZGlnaV9oKGNoLCB0cy0+Y19jZmxhZyk7Ci0KLQlpZiAoaGZsb3cgIT0gY2gtPmhmbG93KSAKLQl7CisJaWYgKGhmbG93ICE9IGNoLT5oZmxvdykgIHsKIAkJY2gtPmhmbG93ID0gaGZsb3c7Ci0KIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCUhhcmQgZmxvdyBjb250cm9sIGhhcyBiZWVuIHNlbGVjdGVkIGJ1dCB0aGUgYm9hcmQgaXMgbm90CiAJCQl1c2luZyBpdC4gIEFjdGl2YXRlIGhhcmQgZmxvdyBjb250cm9sIG5vdy4KIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogCQlmZXBjbWQoY2gsIFNFVEhGTE9XLCBoZmxvdywgMHhmZiwgMCwgMSk7CiAJfQotCQotCiAJbXZhbCBePSBjaC0+bW9kZW1mYWtlICYgKG12YWwgXiBjaC0+bW9kZW0pOwogCi0JaWYgKGNoLT5vbW9kZW0gXiBtdmFsKSAKLQl7CisJaWYgKGNoLT5vbW9kZW0gXiBtdmFsKSAgewogCQljaC0+b21vZGVtID0gbXZhbDsKLQogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJVGhlIGJlbG93IGNvbW1hbmQgc2V0cyB0aGUgRFRSIGFuZCBSVFMgbXN0YXQgc3RydWN0dXJlLiAgSWYKIAkJCWhhcmQgZmxvdyBjb250cm9sIGlzIE5PVCBhY3RpdmUgdGhlc2UgY2hhbmdlcyB3aWxsIGRyaXZlIHRoZQpAQCAtMjUxNCw4NyArMjA4Nyw2NSBAQAogCQkvKiBGaXJzdCByZXNldCBEVFIgJiBSVFM7IHRoZW4gc2V0IHRoZW0gKi8KIAkJZmVwY21kKGNoLCBTRVRNT0RFTSwgMCwgKChjaC0+bV9kdHIpfChjaC0+bV9ydHMpKSwgMCwgMSk7CiAJCWZlcGNtZChjaCwgU0VUTU9ERU0sIG12YWwsIDAsIDAsIDEpOwotCiAJfQotCi0JaWYgKGNoLT5zdGFydGMgIT0gY2gtPmZlcHN0YXJ0YyB8fCBjaC0+c3RvcGMgIT0gY2gtPmZlcHN0b3BjKSAKLQl7CisJaWYgKGNoLT5zdGFydGMgIT0gY2gtPmZlcHN0YXJ0YyB8fCBjaC0+c3RvcGMgIT0gY2gtPmZlcHN0b3BjKSAgewogCQljaC0+ZmVwc3RhcnRjID0gY2gtPnN0YXJ0YzsKIAkJY2gtPmZlcHN0b3BjID0gY2gtPnN0b3BjOwotCiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJVGhlIFhPTiAvIFhPRkYgY2hhcmFjdGVycyBoYXZlIGNoYW5nZWQ7IHByb3BhZ2F0ZSB0aGVzZQogCQkJY2hhbmdlcyB0byB0aGUgY2FyZC4JCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJCWZlcGNtZChjaCwgU09OT0ZGQywgY2gtPmZlcHN0YXJ0YywgY2gtPmZlcHN0b3BjLCAwLCAxKTsKIAl9Ci0KLQlpZiAoY2gtPnN0YXJ0Y2EgIT0gY2gtPmZlcHN0YXJ0Y2EgfHwgY2gtPnN0b3BjYSAhPSBjaC0+ZmVwc3RvcGNhKSAKLQl7CisJaWYgKGNoLT5zdGFydGNhICE9IGNoLT5mZXBzdGFydGNhIHx8IGNoLT5zdG9wY2EgIT0gY2gtPmZlcHN0b3BjYSkgIHsKIAkJY2gtPmZlcHN0YXJ0Y2EgPSBjaC0+c3RhcnRjYTsKIAkJY2gtPmZlcHN0b3BjYSA9IGNoLT5zdG9wY2E7Ci0KIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlTaW1pbGFyIHRvIHRoZSBhYm92ZSwgdGhpcyB0aW1lIHRoZSBhdXhpbGFybHkgWE9OIC8gWE9GRiAKIAkJCWNoYXJhY3RlcnMgaGF2ZSBjaGFuZ2VkOyBwcm9wYWdhdGUgdGhlc2UgY2hhbmdlcyB0byB0aGUgY2FyZC4KIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAkJZmVwY21kKGNoLCBTQVVYT05PRkZDLCBjaC0+ZmVwc3RhcnRjYSwgY2gtPmZlcHN0b3BjYSwgMCwgMSk7CiAJfQotCiB9IC8qIEVuZCBlcGNhcGFyYW0gKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHJlY2VpdmVfZGF0YSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQorLyogQ2FsbGVyIGhvbGRzIGxvY2sgKi8KIHN0YXRpYyB2b2lkIHJlY2VpdmVfZGF0YShzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7IC8qIEJlZ2luIHJlY2VpdmVfZGF0YSAqLwogCiAJdW5jaGFyICpycHRyOwogCXN0cnVjdCB0ZXJtaW9zICp0cyA9IE5VTEw7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7Ci0JcmVnaXN0ZXIgaW50IGRhdGFUb1JlYWQsIHdyYXBnYXAsIGJ5dGVzQXZhaWxhYmxlOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGludCB0YWlsLCBoZWFkOworCXN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlpbnQgZGF0YVRvUmVhZCwgd3JhcGdhcCwgYnl0ZXNBdmFpbGFibGU7CisJdW5zaWduZWQgaW50IHRhaWwsIGhlYWQ7CiAJdW5zaWduZWQgaW50IHdyYXBtYXNrOwogCWludCByYzsKIAotCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgZG9pbnQgd2hlbiBhIHJlY2VpdmUgZGF0YSBldmVudCAKIAkJaGFzIHRha2VuIHBsYWNlLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogCWdsb2JhbHdpbm9uKGNoKTsKLQogCWlmIChjaC0+c3RhdHVzZmxhZ3MgJiBSWFNUT1BQRUQpCiAJCXJldHVybjsKLQogCXR0eSA9IGNoLT50dHk7CiAJaWYgKHR0eSkKIAkJdHMgPSB0dHktPnRlcm1pb3M7Ci0KIAliYyA9IGNoLT5icmRjaGFuOwotCi0JaWYgKCFiYykgCi0JewotCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBiYyBpcyBOVUxMIGluIHJlY2VpdmVfZGF0YSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCisJQlVHX09OKCFiYyk7CiAJd3JhcG1hc2sgPSBjaC0+cnhidWZzaXplIC0gMTsKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKIAkJR2V0IHRoZSBoZWFkIGFuZCB0YWlsIHBvaW50ZXJzIHRvIHRoZSByZWNlaXZlciBxdWV1ZS4gIFdyYXAgdGhlIAogCQloZWFkIHBvaW50ZXIgaWYgaXQgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0JaGVhZCA9IGJjLT5yaW47CisJaGVhZCA9IHJlYWR3KCZiYy0+cmluKTsKIAloZWFkICY9IHdyYXBtYXNrOwotCXRhaWwgPSBiYy0+cm91dCAmIHdyYXBtYXNrOworCXRhaWwgPSByZWFkdygmYmMtPnJvdXQpICYgd3JhcG1hc2s7CiAKIAlieXRlc0F2YWlsYWJsZSA9IChoZWFkIC0gdGFpbCkgJiB3cmFwbWFzazsKLQogCWlmIChieXRlc0F2YWlsYWJsZSA9PSAwKQogCQlyZXR1cm47CiAKQEAgLTI2MDIsOCArMjE1Myw3IEBACiAJICAgSWYgQ1JFQUQgYml0IGlzIG9mZiBvciBkZXZpY2Ugbm90IG9wZW4sIHNldCBUWCB0YWlsIHRvIGhlYWQKIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotCWlmICghdHR5IHx8ICF0cyB8fCAhKHRzLT5jX2NmbGFnICYgQ1JFQUQpKSAKLQl7CisJaWYgKCF0dHkgfHwgIXRzIHx8ICEodHMtPmNfY2ZsYWcgJiBDUkVBRCkpICB7CiAJCWJjLT5yb3V0ID0gaGVhZDsKIAkJcmV0dXJuOwogCX0KQEAgLTI2MTEsNjQgKzIxNjEsNDUgQEAKIAlpZiAodHR5LT5mbGlwLmNvdW50ID09IFRUWV9GTElQQlVGX1NJWkUpIAogCQlyZXR1cm47CiAKLQlpZiAoYmMtPm9ydW4pIAotCXsKLQkJYmMtPm9ydW4gPSAwOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJvdmVycnVuISBEaWdpQm9hcmQgZGV2aWNlICVzXG4iLHR0eS0+bmFtZSk7CisJaWYgKHJlYWRiKCZiYy0+b3J1bikpIHsKKwkJd3JpdGViKDAsICZiYy0+b3J1bik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVwY2E7IG92ZXJydW4hIERpZ2lCb2FyZCBkZXZpY2UgJXNcbiIsdHR5LT5uYW1lKTsKIAl9Ci0KIAlyeHdpbm9uKGNoKTsKIAlycHRyID0gdHR5LT5mbGlwLmNoYXJfYnVmX3B0cjsKIAlyYyA9IHR0eS0+ZmxpcC5jb3VudDsKLQotCXdoaWxlIChieXRlc0F2YWlsYWJsZSA+IDApIAotCXsgLyogQmVnaW4gd2hpbGUgdGhlcmUgaXMgZGF0YSBvbiB0aGUgY2FyZCAqLwotCisJd2hpbGUgKGJ5dGVzQXZhaWxhYmxlID4gMCkgIHsgLyogQmVnaW4gd2hpbGUgdGhlcmUgaXMgZGF0YSBvbiB0aGUgY2FyZCAqLwogCQl3cmFwZ2FwID0gKGhlYWQgPj0gdGFpbCkgPyBoZWFkIC0gdGFpbCA6IGNoLT5yeGJ1ZnNpemUgLSB0YWlsOwotCiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJRXZlbiBpZiBoZWFkIGhhcyB3cmFwcGVkIGFyb3VuZCBvbmx5IHJlcG9ydCB0aGUgYW1vdW50IG9mCiAJCQlkYXRhIHRvIGJlIGVxdWFsIHRvIHRoZSBzaXplIC0gdGFpbC4gIFJlbWVtYmVyIG1lbWNweSBjYW4ndAogCQkJYXV0b21hdGljbHkgd3JhcCBhcm91bmQgdGhlIHJlY2VpdmUgYnVmZmVyLgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJCWRhdGFUb1JlYWQgPSAod3JhcGdhcCA8IGJ5dGVzQXZhaWxhYmxlKSA/IHdyYXBnYXAgOiBieXRlc0F2YWlsYWJsZTsKLQogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkgICBNYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlIGJ1ZmZlcgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJCWlmICgocmMgKyBkYXRhVG9SZWFkKSA+IFRUWV9GTElQQlVGX1NJWkUpCiAJCQlkYXRhVG9SZWFkID0gVFRZX0ZMSVBCVUZfU0laRSAtIHJjOwotCiAJCWlmIChkYXRhVG9SZWFkID09IDApCiAJCQlicmVhazsKLQogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCU1vdmUgZGF0YSByZWFkIGZyb20gb3VyIGNhcmQgaW50byB0aGUgbGluZSBkaXNjaXBsaW5lcyBidWZmZXIKIAkJCWZvciB0cmFuc2xhdGlvbiBpZiBuZWNlc3NhcnkuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0JCWlmICgobWVtY3B5KHJwdHIsIGNoLT5yeHB0ciArIHRhaWwsIGRhdGFUb1JlYWQpKSAhPSBycHRyKQotCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcmVjZWl2ZV9kYXRhIDogbWVtY3B5IGZhaWxlZFxuIik7Ci0JCQkKKwkJbWVtY3B5X2Zyb21pbyhycHRyLCBjaC0+cnhwdHIgKyB0YWlsLCBkYXRhVG9SZWFkKTsKIAkJcmMgICArPSBkYXRhVG9SZWFkOwogCQlycHRyICs9IGRhdGFUb1JlYWQ7CiAJCXRhaWwgPSAodGFpbCArIGRhdGFUb1JlYWQpICYgd3JhcG1hc2s7CiAJCWJ5dGVzQXZhaWxhYmxlIC09IGRhdGFUb1JlYWQ7Ci0KIAl9IC8qIEVuZCB3aGlsZSB0aGVyZSBpcyBkYXRhIG9uIHRoZSBjYXJkICovCi0KLQogCXR0eS0+ZmxpcC5jb3VudCA9IHJjOwogCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBycHRyOwogCWdsb2JhbHdpbm9uKGNoKTsKLQliYy0+cm91dCA9IHRhaWw7Ci0KKwl3cml0ZXcodGFpbCwgJmJjLT5yb3V0KTsKIAkvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGdsb2JhbCBkYXRhICovCiAJdHR5X3NjaGVkdWxlX2ZsaXAoY2gtPnR0eSk7IAogCXJldHVybjsKLQogfSAvKiBFbmQgcmVjZWl2ZV9kYXRhICovCiAKIHN0YXRpYyBpbnQgaW5mb19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCkBAIC0yNjc2LDE3ICsyMjA3LDE1IEBACiB7CiAJc3dpdGNoIChjbWQpIAogCXsgLyogQmVnaW4gc3dpdGNoIGNtZCAqLwotCiAJCWNhc2UgRElHSV9HRVRJTkZPOgogCQl7IC8qIEJlZ2luIGNhc2UgRElHSV9HRVRJTkZPICovCi0KIAkJCXN0cnVjdCBkaWdpX2luZm8gZGkgOwogCQkJaW50IGJyZDsKIAotCQkJZ2V0VXNlcihicmQsICh1bnNpZ25lZCBpbnQgX191c2VyICopYXJnKTsKLQotCQkJaWYgKChicmQgPCAwKSB8fCAoYnJkID49IG51bV9jYXJkcykgfHwgKG51bV9jYXJkcyA9PSAwKSkKLQkJCQlyZXR1cm4gKC1FTk9ERVYpOworCQkJaWYoZ2V0X3VzZXIoYnJkLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoYnJkIDwgMCB8fCBicmQgPj0gbnVtX2NhcmRzIHx8IG51bV9jYXJkcyA9PSAwKQorCQkJCXJldHVybiAtRU5PREVWOwogCiAJCQltZW1zZXQoJmRpLCAwLCBzaXplb2YoZGkpKTsKIApAQCAtMjY5NCw4ICsyMjIzLDkgQEAKIAkJCWRpLnN0YXR1cyA9IGJvYXJkc1ticmRdLnN0YXR1czsKIAkJCWRpLnR5cGUgPSBib2FyZHNbYnJkXS50eXBlIDsKIAkJCWRpLm51bXBvcnRzID0gYm9hcmRzW2JyZF0ubnVtcG9ydHMgOwotCQkJZGkucG9ydCA9IGJvYXJkc1ticmRdLnBvcnQgOwotCQkJZGkubWVtYmFzZSA9IGJvYXJkc1ticmRdLm1lbWJhc2UgOworCQkJLyogTGVnYWN5IGZpeHVwcyAtIGp1c3QgbW92ZSBhbG9uZyBub3RoaW5nIHRvIHNlZSAqLworCQkJZGkucG9ydCA9ICh1bnNpZ25lZCBjaGFyICopYm9hcmRzW2JyZF0ucG9ydCA7CisJCQlkaS5tZW1iYXNlID0gKHVuc2lnbmVkIGNoYXIgKilib2FyZHNbYnJkXS5tZW1iYXNlIDsKIAogCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZkaSwgc2l6ZW9mIChkaSkpKQogCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtMjcwOSwzOSArMjIzOSwyOSBAQAogCQkJaW50IGJyZCA9IGFyZyAmIDB4ZmYwMDAwMDAgPj4gMTYgOyAKIAkJCXVuc2lnbmVkIGNoYXIgc3RhdGUgPSBhcmcgJiAweGZmIDsgCiAKLQkJCWlmICgoYnJkIDwgMCkgfHwgKGJyZCA+PSBudW1fY2FyZHMpKQotCQkJewotCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIERJR0kgUE9MTEVSIDogYnJkIG5vdCB2YWxpZCFcbiIpOworCQkJaWYgKGJyZCA8IDAgfHwgYnJkID49IG51bV9jYXJkcykgeworCQkJCXByaW50ayhLRVJOX0VSUiAiZXBjYTogRElHSSBQT0xMRVIgOiBicmQgbm90IHZhbGlkIVxuIik7CiAJCQkJcmV0dXJuICgtRU5PREVWKTsKIAkJCX0KLQogCQkJZGlnaV9wb2xsZXJfaW5oaWJpdGVkID0gc3RhdGUgOwogCQkJYnJlYWsgOyAKLQogCQl9IC8qIEVuZCBjYXNlIERJR0lfUE9MTEVSICovCiAKIAkJY2FzZSBESUdJX0lOSVQ6CiAJCXsgLyogQmVnaW4gY2FzZSBESUdJX0lOSVQgKi8KLQogCQkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQkJVGhpcyBjYWxsIGlzIG1hZGUgYnkgdGhlIGFwcHMgdG8gY29tcGxldGUgdGhlIGluaXRpbGl6YXRpb24KIAkJCQlvZiB0aGUgYm9hcmQocykuICBUaGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcKIAkJCQl0aGUgY2FyZCB0byBpdHMgaW5pdGlhbCBzdGF0ZSBhbmQgc2V0dGluZyB0aGUgZHJpdmVycyBjb250cm9sCiAJCQkJZmllbGRzIHRvIHRoZSBzdXRpYW5sZSBzZXR0aW5ncyBmb3IgdGhlIGNhcmQgaW4gcXVlc3Rpb24uCiAJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0JCQogCQkJaW50IGNyZCA7IAogCQkJZm9yIChjcmQgPSAwOyBjcmQgPCBudW1fY2FyZHM7IGNyZCsrKSAKIAkJCQlwb3N0X2ZlcF9pbml0IChjcmQpOwotCiAJCQlicmVhayA7IAotCiAJCX0gLyogRW5kIGNhc2UgRElHSV9JTklUICovCi0KLQogCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQorCQkJcmV0dXJuIC1FTk9UVFk7CiAJfSAvKiBFbmQgc3dpdGNoIGNtZCAqLwogCXJldHVybiAoMCkgOwogfQpAQCAtMjc1MCw0MyArMjI3MCwzMyBAQAogc3RhdGljIGludCBwY190aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKikgdHR5LT5kcml2ZXJfZGF0YTsKLQl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisJc3RydWN0IGJvYXJkX2NoYW4gKmJjOwogCXVuc2lnbmVkIGludCBtc3RhdCwgbWZsYWcgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoY2gpCiAJCWJjID0gY2gtPmJyZGNoYW47CiAJZWxzZQotCXsKLQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gY2ggaXMgTlVMTCBpbiBwY190aW9jbWdldCFcbiIpOwotCQlyZXR1cm4oLUVJTlZBTCk7Ci0JfQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAlnbG9iYWx3aW5vbihjaCk7Ci0JbXN0YXQgPSBiYy0+bXN0YXQ7CisJbXN0YXQgPSByZWFkYigmYmMtPm1zdGF0KTsKIAltZW1vZmYoY2gpOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCiAJaWYgKG1zdGF0ICYgY2gtPm1fZHRyKQogCQltZmxhZyB8PSBUSU9DTV9EVFI7Ci0KIAlpZiAobXN0YXQgJiBjaC0+bV9ydHMpCiAJCW1mbGFnIHw9IFRJT0NNX1JUUzsKLQogCWlmIChtc3RhdCAmIGNoLT5tX2N0cykKIAkJbWZsYWcgfD0gVElPQ01fQ1RTOwotCiAJaWYgKG1zdGF0ICYgY2gtPmRzcikKIAkJbWZsYWcgfD0gVElPQ01fRFNSOwotCiAJaWYgKG1zdGF0ICYgY2gtPm1fcmkpCiAJCW1mbGFnIHw9IFRJT0NNX1JJOwotCiAJaWYgKG1zdGF0ICYgY2gtPmRjZCkKIAkJbWZsYWcgfD0gVElPQ01fQ0Q7Ci0KIAlyZXR1cm4gbWZsYWc7CiB9CiAKQEAgLTI3OTYsMTMgKzIzMDYsMTAgQEAKIAlzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKikgdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFjaCkgewotCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBjaCBpcyBOVUxMIGluIHBjX3Rpb2Ntc2V0IVxuIik7Ci0JCXJldHVybigtRUlOVkFMKTsKLQl9CisJaWYgKCFjaCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJLyoKIAkgKiBJIHRoaW5rIHRoaXMgbW9kZW1mYWtlIHN0dWZmIGlzIGJyb2tlbi4gIEl0IGRvZXNuJ3QKIAkgKiBjb3JyZWN0bHkgcmVmbGVjdCB0aGUgYmVoYXZpb3VyIGRlc2lyZWQgYnkgdGhlIFRJT0NNKgpAQCAtMjgyNCwxNyArMjMzMSwxNCBAQAogCQljaC0+bW9kZW1mYWtlIHw9IGNoLT5tX2R0cjsKIAkJY2gtPm1vZGVtICY9IH5jaC0+bV9kdHI7CiAJfQotCiAJZ2xvYmFsd2lub24oY2gpOwotCiAJLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCVRoZSBiZWxvdyByb3V0aW5lIGdlbmVyYWxseSBzZXRzIHVwIHBhcml0eSwgYmF1ZCwgZmxvdyBjb250cm9sCiAJCWlzc3VlcywgZXRjLi4uLiBJdCBlZmZlY3QgYm90aCBjb250cm9sIGZsYWdzIGFuZCBpbnB1dCBmbGFncy4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogCWVwY2FwYXJhbSh0dHksY2gpOwogCW1lbW9mZihjaCk7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI4NDcsMTkgKzIzNTEsMTQgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBtZmxhZywgbXN0YXQ7CiAJdW5zaWduZWQgY2hhciBzdGFydGMsIHN0b3BjOwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CiAJc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopIHR0eS0+ZHJpdmVyX2RhdGE7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJCiAJaWYgKGNoKQogCQliYyA9IGNoLT5icmRjaGFuOwogCWVsc2UgCi0JewotCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBjaCBpcyBOVUxMIGluIHBjX2lvY3RsIVxuIik7Ci0JCXJldHVybigtRUlOVkFMKTsKLQl9Ci0KLQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCUZvciBQT1NJWCBjb21wbGlhbmNlIHdlIG5lZWQgdG8gYWRkIG1vcmUgaW9jdGxzLiAgU2VlIHR0eV9pb2N0bC5jCkBAIC0yODcxLDQ2ICsyMzcwLDM5IEBACiAJeyAvKiBCZWdpbiBzd2l0Y2ggY21kICovCiAKIAkJY2FzZSBUQ0dFVFM6Ci0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsIAotCQkJCQkgdHR5LT50ZXJtaW9zLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKSkKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgdHR5LT50ZXJtaW9zLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJldHVybigwKTsKLQorCQkJcmV0dXJuIDA7CiAJCWNhc2UgVENHRVRBOgogCQkJcmV0dXJuIGdldF90ZXJtaW8odHR5LCBhcmdwKTsKLQogCQljYXNlIFRDU0JSSzoJLyogU1ZJRCB2ZXJzaW9uOiBub24temVybyBhcmcgLS0+IG5vIGJyZWFrICovCi0KIAkJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKIAkJCWlmIChyZXR2YWwpCiAJCQkJcmV0dXJuIHJldHZhbDsKLQogCQkJLyogU2V0dXAgYW4gZXZlbnQgdG8gaW5kaWNhdGUgd2hlbiB0aGUgdHJhbnNtaXQgYnVmZmVyIGVtcHRpZXMgKi8KLQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCQkJc2V0dXBfZW1wdHlfZXZlbnQodHR5LGNoKTsJCQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CiAJCQlpZiAoIWFyZykKIAkJCQlkaWdpX3NlbmRfYnJlYWsoY2gsIEhaLzQpOyAgICAvKiAxLzQgc2Vjb25kICovCiAJCQlyZXR1cm4gMDsKLQogCQljYXNlIFRDU0JSS1A6CS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KLQogCQkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwogCQkJaWYgKHJldHZhbCkKIAkJCQlyZXR1cm4gcmV0dmFsOwogCiAJCQkvKiBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZSB0cmFuc21pdCBidWZmZXIgZW1wdGllcyAqLwotCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQlzZXR1cF9lbXB0eV9ldmVudCh0dHksY2gpOwkJCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKIAkJCWRpZ2lfc2VuZF9icmVhayhjaCwgYXJnID8gYXJnKihIWi8xMCkgOiBIWi80KTsKIAkJCXJldHVybiAwOwotCiAJCWNhc2UgVElPQ0dTT0ZUQ0FSOgogCQkJaWYgKHB1dF91c2VyKENfQ0xPQ0FMKHR0eSk/MTowLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJcmV0dXJuIDA7Ci0KIAkJY2FzZSBUSU9DU1NPRlRDQVI6CiAJCXsKIAkJCXVuc2lnbmVkIGludCB2YWx1ZTsKQEAgLTI5MjIsNzUgKzI0MTQsNjMgQEAKIAkJCQkgKHZhbHVlID8gQ0xPQ0FMIDogMCkpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQogCQljYXNlIFRJT0NNT0RHOgogCQkJbWZsYWcgPSBwY190aW9jbWdldCh0dHksIGZpbGUpOwogCQkJaWYgKHB1dF91c2VyKG1mbGFnLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCWJyZWFrOwotCiAJCWNhc2UgVElPQ01PRFM6CiAJCQlpZiAoZ2V0X3VzZXIobXN0YXQsICh1bnNpZ25lZCBfX3VzZXIgKilhcmdwKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXJldHVybiBwY190aW9jbXNldCh0dHksIGZpbGUsIG1zdGF0LCB+bXN0YXQpOwotCiAJCWNhc2UgVElPQ1NEVFI6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQljaC0+b21vZGVtIHw9IGNoLT5tX2R0cjsKLQkJCWNsaSgpOwogCQkJZ2xvYmFsd2lub24oY2gpOwogCQkJZmVwY21kKGNoLCBTRVRNT0RFTSwgY2gtPm1fZHRyLCAwLCAxMCwgMSk7CiAJCQltZW1vZmYoY2gpOwotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgVElPQ0NEVFI6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQljaC0+b21vZGVtICY9IH5jaC0+bV9kdHI7Ci0JCQljbGkoKTsKIAkJCWdsb2JhbHdpbm9uKGNoKTsKIAkJCWZlcGNtZChjaCwgU0VUTU9ERU0sIDAsIGNoLT5tX2R0ciwgMTAsIDEpOwogCQkJbWVtb2ZmKGNoKTsKLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKLQogCQljYXNlIERJR0lfR0VUQToKIAkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNoLT5kaWdpZXh0LCBzaXplb2YoZGlnaV90KSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlicmVhazsKLQogCQljYXNlIERJR0lfU0VUQVc6CiAJCWNhc2UgRElHSV9TRVRBRjoKLQkJCWlmICgoY21kKSA9PSAoRElHSV9TRVRBVykpIAotCQkJeworCQkJaWYgKGNtZCA9PSBESUdJX1NFVEFXKSB7CiAJCQkJLyogU2V0dXAgYW4gZXZlbnQgdG8gaW5kaWNhdGUgd2hlbiB0aGUgdHJhbnNtaXQgYnVmZmVyIGVtcHRpZXMgKi8KLQorCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCQlzZXR1cF9lbXB0eV9ldmVudCh0dHksY2gpOwkJCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOwotCQkJfQotCQkJZWxzZSAKLQkJCXsKKwkJCX0gZWxzZSAJewogCQkJCS8qIGxkaXNjIGxvY2sgYWxyZWFkeSBoZWxkIGluIGlvY3RsICovCiAJCQkJaWYgKHR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKQogCQkJCQl0dHktPmxkaXNjLmZsdXNoX2J1ZmZlcih0dHkpOwogCQkJfQotCiAJCQkvKiBGYWxsIFRocnUgKi8KLQogCQljYXNlIERJR0lfU0VUQToKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmY2gtPmRpZ2lleHQsIGFyZ3AsIHNpemVvZihkaWdpX3QpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQotCQkJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBESUdJX0FMVFBJTikgCi0JCQl7CisJCQlpZiAoY2gtPmRpZ2lleHQuZGlnaV9mbGFncyAmIERJR0lfQUxUUElOKSAgewogCQkJCWNoLT5kY2QgPSBjaC0+bV9kc3I7CiAJCQkJY2gtPmRzciA9IGNoLT5tX2RjZDsKLQkJCX0gCi0JCQllbHNlIAotCQkJeworCQkJfSBlbHNlIHsKIAkJCQljaC0+ZGNkID0gY2gtPm1fZGNkOwogCQkJCWNoLT5kc3IgPSBjaC0+bV9kc3I7CiAJCQl9CiAJCQotCQkJY2xpKCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQlnbG9iYWx3aW5vbihjaCk7CiAKIAkJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMDAwLDI1ICsyNDgwLDIyIEBACiAKIAkJCWVwY2FwYXJhbSh0dHksY2gpOwogCQkJbWVtb2ZmKGNoKTsKLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKIAogCQljYXNlIERJR0lfR0VURkxPVzoKIAkJY2FzZSBESUdJX0dFVEFGTE9XOgotCQkJY2xpKCk7CQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCQkJZ2xvYmFsd2lub24oY2gpOwotCQkJaWYgKChjbWQpID09IChESUdJX0dFVEZMT1cpKSAKLQkJCXsKLQkJCQlkZmxvdy5zdGFydGMgPSBiYy0+c3RhcnRjOwotCQkJCWRmbG93LnN0b3BjID0gYmMtPnN0b3BjOwotCQkJfQotCQkJZWxzZSAKLQkJCXsKLQkJCQlkZmxvdy5zdGFydGMgPSBiYy0+c3RhcnRjYTsKLQkJCQlkZmxvdy5zdG9wYyA9IGJjLT5zdG9wY2E7CisJCQlpZiAoY21kID09IERJR0lfR0VURkxPVykgeworCQkJCWRmbG93LnN0YXJ0YyA9IHJlYWRiKCZiYy0+c3RhcnRjKTsKKwkJCQlkZmxvdy5zdG9wYyA9IHJlYWRiKCZiYy0+c3RvcGMpOworCQkJfSBlbHNlIHsKKwkJCQlkZmxvdy5zdGFydGMgPSByZWFkYigmYmMtPnN0YXJ0Y2EpOworCQkJCWRmbG93LnN0b3BjID0gcmVhZGIoJmJjLT5zdG9wY2EpOwogCQkJfQogCQkJbWVtb2ZmKGNoKTsKLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAKIAkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmRmbG93LCBzaXplb2YoZGZsb3cpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTMwMjYsMTMgKzI1MDMsMTAgQEAKIAogCQljYXNlIERJR0lfU0VUQUZMT1c6CiAJCWNhc2UgRElHSV9TRVRGTE9XOgotCQkJaWYgKChjbWQpID09IChESUdJX1NFVEZMT1cpKSAKLQkJCXsKKwkJCWlmIChjbWQgPT0gRElHSV9TRVRGTE9XKSB7CiAJCQkJc3RhcnRjID0gY2gtPnN0YXJ0YzsKIAkJCQlzdG9wYyA9IGNoLT5zdG9wYzsKLQkJCX0gCi0JCQllbHNlIAotCQkJeworCQkJfSBlbHNlIHsKIAkJCQlzdGFydGMgPSBjaC0+c3RhcnRjYTsKIAkJCQlzdG9wYyA9IGNoLT5zdG9wY2E7CiAJCQl9CkBAIC0zMDQwLDQwICsyNTE0LDMxIEBACiAJCQlpZiAoY29weV9mcm9tX3VzZXIoJmRmbG93LCBhcmdwLCBzaXplb2YoZGZsb3cpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJaWYgKGRmbG93LnN0YXJ0YyAhPSBzdGFydGMgfHwgZGZsb3cuc3RvcGMgIT0gc3RvcGMpIAotCQkJeyAvKiBCZWdpbiAgaWYgc2V0ZmxvdyB0b2dnbGVkICovCi0JCQkJY2xpKCk7CisJCQlpZiAoZGZsb3cuc3RhcnRjICE9IHN0YXJ0YyB8fCBkZmxvdy5zdG9wYyAhPSBzdG9wYykgeyAvKiBCZWdpbiAgaWYgc2V0ZmxvdyB0b2dnbGVkICovCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCQkJCWdsb2JhbHdpbm9uKGNoKTsKIAotCQkJCWlmICgoY21kKSA9PSAoRElHSV9TRVRGTE9XKSkgCi0JCQkJeworCQkJCWlmIChjbWQgPT0gRElHSV9TRVRGTE9XKSB7CiAJCQkJCWNoLT5mZXBzdGFydGMgPSBjaC0+c3RhcnRjID0gZGZsb3cuc3RhcnRjOwogCQkJCQljaC0+ZmVwc3RvcGMgPSBjaC0+c3RvcGMgPSBkZmxvdy5zdG9wYzsKIAkJCQkJZmVwY21kKGNoLCBTT05PRkZDLCBjaC0+ZmVwc3RhcnRjLCBjaC0+ZmVwc3RvcGMsIDAsIDEpOwotCQkJCX0gCi0JCQkJZWxzZSAKLQkJCQl7CisJCQkJfSBlbHNlIHsKIAkJCQkJY2gtPmZlcHN0YXJ0Y2EgPSBjaC0+c3RhcnRjYSA9IGRmbG93LnN0YXJ0YzsKIAkJCQkJY2gtPmZlcHN0b3BjYSAgPSBjaC0+c3RvcGNhID0gZGZsb3cuc3RvcGM7CiAJCQkJCWZlcGNtZChjaCwgU0FVWE9OT0ZGQywgY2gtPmZlcHN0YXJ0Y2EsIGNoLT5mZXBzdG9wY2EsIDAsIDEpOwogCQkJCX0KIAotCQkJCWlmCShjaC0+c3RhdHVzZmxhZ3MgJiBUWFNUT1BQRUQpCisJCQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIFRYU1RPUFBFRCkKIAkJCQkJcGNfc3RhcnQodHR5KTsKIAogCQkJCW1lbW9mZihjaCk7Ci0JCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCX0gLyogRW5kIGlmIHNldGZsb3cgdG9nZ2xlZCAqLwogCQkJYnJlYWs7Ci0KIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0KIAl9IC8qIEVuZCBzd2l0Y2ggY21kICovCi0KIAlyZXR1cm4gMDsKLQogfSAvKiBFbmQgcGNfaW9jdGwgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX3NldF90ZXJtaW9zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzA4MywyMCArMjU0OCwxNiBAQAogCiAJc3RydWN0IGNoYW5uZWwgKmNoOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKIAkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKLQl7IC8qIEJlZ2luIGlmIGNoYW5uZWwgdmFsaWQgKi8KLQotCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJY2xpKCk7CisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgIHsgLyogQmVnaW4gaWYgY2hhbm5lbCB2YWxpZCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCWdsb2JhbHdpbm9uKGNoKTsKIAkJZXBjYXBhcmFtKHR0eSwgY2gpOwogCQltZW1vZmYoY2gpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAogCQlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKIAkJCSAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpID09IDApKQpAQCAtMzEwNiw4ICsyNTY3LDYgQEAKIAkJCSAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSkKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7CiAKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KIAl9IC8qIEVuZCBpZiBjaGFubmVsIHZhbGlkICovCiAKIH0gLyogRW5kIHBjX3NldF90ZXJtaW9zICovCkBAIC0zMTE2LDI5ICsyNTc1LDE4IEBACiAKIHN0YXRpYyB2b2lkIGRvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCiB7IC8qIEJlZ2luIGRvX3NvZnRpbnQgKi8KLQogCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSBwcml2YXRlXzsKLQkKLQogCS8qIENhbGxlZCBpbiByZXNwb25zZSB0byBhIG1vZGVtIGNoYW5nZSBldmVudCAqLwotCi0JaWYgKGNoICYmIGNoLT5tYWdpYyA9PSBFUENBX01BR0lDKSAKLQl7IC8qIEJlZ2luIEVQQ0FfTUFHSUMgKi8KLQorCWlmIChjaCAmJiBjaC0+bWFnaWMgPT0gRVBDQV9NQUdJQykgIHsgLyogQmVnaW4gRVBDQV9NQUdJQyAqLwogCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gY2gtPnR0eTsKIAotCQlpZiAodHR5ICYmIHR0eS0+ZHJpdmVyX2RhdGEpIAotCQl7IAotCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChFUENBX0VWRU5UX0hBTkdVUCwgJmNoLT5ldmVudCkpIAotCQkJeyAvKiBCZWdpbiBpZiBjbGVhcl9iaXQgKi8KLQorCQlpZiAodHR5ICYmIHR0eS0+ZHJpdmVyX2RhdGEpIHsKKwkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRVBDQV9FVkVOVF9IQU5HVVAsICZjaC0+ZXZlbnQpKSB7IC8qIEJlZ2luIGlmIGNsZWFyX2JpdCAqLwogCQkJCXR0eV9oYW5ndXAodHR5KTsJLyogRklYTUU6IG1vZHVsZSByZW1vdmFsIHJhY2UgaGVyZSAtIEFLUE0gKi8KIAkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5vcGVuX3dhaXQpOwogCQkJCWNoLT5hc3luY2ZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOwotCiAJCQl9IC8qIEVuZCBpZiBjbGVhcl9iaXQgKi8KIAkJfQotCiAJfSAvKiBFbmQgRVBDQV9NQUdJQyAqLwogfSAvKiBFbmQgZG9fc29mdGludCAqLwogCkBAIC0zMTU0LDgyICsyNjAyLDQ5IEBACiAKIAlzdHJ1Y3QgY2hhbm5lbCAqY2g7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAogCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAotCXsgLyogQmVnaW4gaWYgdmFsaWQgY2hhbm5lbCAqLwotCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOyAKLQkJY2xpKCk7Ci0KLQkJaWYgKChjaC0+c3RhdHVzZmxhZ3MgJiBUWFNUT1BQRUQpID09IDApIAotCQl7IC8qIEJlZ2luIGlmIHRyYW5zbWl0IHN0b3AgcmVxdWVzdGVkICovCi0KKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAgeyAvKiBCZWdpbiBpZiB2YWxpZCBjaGFubmVsICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKKwkJaWYgKChjaC0+c3RhdHVzZmxhZ3MgJiBUWFNUT1BQRUQpID09IDApICB7IC8qIEJlZ2luIGlmIHRyYW5zbWl0IHN0b3AgcmVxdWVzdGVkICovCiAJCQlnbG9iYWx3aW5vbihjaCk7Ci0KIAkJCS8qIFNUT1AgdHJhbnNtaXR0aW5nIG5vdyAhISAqLwotCiAJCQlmZXBjbWQoY2gsIFBBVVNFVFgsIDAsIDAsIDAsIDApOwotCiAJCQljaC0+c3RhdHVzZmxhZ3MgfD0gVFhTVE9QUEVEOwogCQkJbWVtb2ZmKGNoKTsKLQogCQl9IC8qIEVuZCBpZiB0cmFuc21pdCBzdG9wIHJlcXVlc3RlZCAqLwotCi0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCX0gLyogRW5kIGlmIHZhbGlkIGNoYW5uZWwgKi8KLQogfSAvKiBFbmQgcGNfc3RvcCAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfc3RhcnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyB2b2lkIHBjX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7IC8qIEJlZ2luIHBjX3N0YXJ0ICovCi0KIAlzdHJ1Y3QgY2hhbm5lbCAqY2g7Ci0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKIAkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKLQl7IC8qIEJlZ2luIGlmIGNoYW5uZWwgdmFsaWQgKi8KLQorCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIHsgLyogQmVnaW4gaWYgY2hhbm5lbCB2YWxpZCAqLwogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKLQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCS8qIEp1c3QgaW4gY2FzZSBvdXRwdXQgd2FzIHJlc3VtZWQgYmVjYXVzZSBvZiBhIGNoYW5nZSBpbiBEaWdpLWZsb3cgKi8KLQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIFRYU1RPUFBFRCkgCi0JCXsgLyogQmVnaW4gdHJhbnNtaXQgcmVzdW1lIHJlcXVlc3RlZCAqLwotCi0JCQl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7Ci0KKwkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIFRYU1RPUFBFRCkgIHsgLyogQmVnaW4gdHJhbnNtaXQgcmVzdW1lIHJlcXVlc3RlZCAqLworCQkJc3RydWN0IGJvYXJkX2NoYW4gKmJjOwogCQkJZ2xvYmFsd2lub24oY2gpOwogCQkJYmMgPSBjaC0+YnJkY2hhbjsKIAkJCWlmIChjaC0+c3RhdHVzZmxhZ3MgJiBMT1dXQUlUKQotCQkJCWJjLT5pbG93ID0gMTsKLQorCQkJCXdyaXRlYigxLCAmYmMtPmlsb3cpOwogCQkJLyogT2theSwgeW91IGNhbiBzdGFydCB0cmFuc21pdHRpbmcgYWdhaW4uLi4gKi8KLQogCQkJZmVwY21kKGNoLCBSRVNVTUVUWCwgMCwgMCwgMCwgMCk7Ci0KIAkJCWNoLT5zdGF0dXNmbGFncyAmPSB+VFhTVE9QUEVEOwogCQkJbWVtb2ZmKGNoKTsKLQogCQl9IC8qIEVuZCB0cmFuc21pdCByZXN1bWUgcmVxdWVzdGVkICovCi0KLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJfSAvKiBFbmQgaWYgY2hhbm5lbCB2YWxpZCAqLwotCiB9IC8qIEVuZCBwY19zdGFydCAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMyNDQsODYgKzI2NTksNTUgQEAKIAogc3RhdGljIHZvaWQgcGNfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCiB7IC8qIEJlZ2luIHBjX3Rocm90dGxlICovCi0KIAlzdHJ1Y3QgY2hhbm5lbCAqY2g7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAogCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAotCXsgLyogQmVnaW4gaWYgY2hhbm5lbCB2YWxpZCAqLwotCi0KLQkJc2F2ZV9mbGFncyhmbGFncyk7Ci0JCWNsaSgpOwotCi0JCWlmICgoY2gtPnN0YXR1c2ZsYWdzICYgUlhTVE9QUEVEKSA9PSAwKQotCQl7CisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgIHsgLyogQmVnaW4gaWYgY2hhbm5lbCB2YWxpZCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CisJCWlmICgoY2gtPnN0YXR1c2ZsYWdzICYgUlhTVE9QUEVEKSA9PSAwKSB7CiAJCQlnbG9iYWx3aW5vbihjaCk7CiAJCQlmZXBjbWQoY2gsIFBBVVNFUlgsIDAsIDAsIDAsIDApOwotCiAJCQljaC0+c3RhdHVzZmxhZ3MgfD0gUlhTVE9QUEVEOwogCQkJbWVtb2ZmKGNoKTsKIAkJfQotCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAl9IC8qIEVuZCBpZiBjaGFubmVsIHZhbGlkICovCi0KIH0gLyogRW5kIHBjX3Rocm90dGxlICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiB1bnRocm90dGxlICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgdm9pZCBwY191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7IC8qIEJlZ2luIHBjX3VudGhyb3R0bGUgKi8KLQogCXN0cnVjdCBjaGFubmVsICpjaDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKLQotCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CiAJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0JaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgCi0JeyAvKiBCZWdpbiBpZiBjaGFubmVsIHZhbGlkICovCi0KLQorCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpICB7IC8qIEJlZ2luIGlmIGNoYW5uZWwgdmFsaWQgKi8KIAkJLyogSnVzdCBpbiBjYXNlIG91dHB1dCB3YXMgcmVzdW1lZCBiZWNhdXNlIG9mIGEgY2hhbmdlIGluIERpZ2ktZmxvdyAqLwotCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJY2xpKCk7Ci0KLQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIFJYU1RPUFBFRCkgCi0JCXsKLQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CisJCWlmIChjaC0+c3RhdHVzZmxhZ3MgJiBSWFNUT1BQRUQpIHsKIAkJCWdsb2JhbHdpbm9uKGNoKTsKLQkJCWJjID0gY2gtPmJyZGNoYW47CiAJCQlmZXBjbWQoY2gsIFJFU1VNRVJYLCAwLCAwLCAwLCAwKTsKLQogCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5SWFNUT1BQRUQ7CiAJCQltZW1vZmYoY2gpOwogCQl9Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCX0gLyogRW5kIGlmIGNoYW5uZWwgdmFsaWQgKi8KLQogfSAvKiBFbmQgcGNfdW50aHJvdHRsZSAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gZGlnaV9zZW5kX2JyZWFrICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiB2b2lkIGRpZ2lfc2VuZF9icmVhayhzdHJ1Y3QgY2hhbm5lbCAqY2gsIGludCBtc2VjKQogeyAvKiBCZWdpbiBkaWdpX3NlbmRfYnJlYWsgKi8KLQogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJZ2xvYmFsd2lub24oY2gpOwotCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAJICAgTWF5YmUgSSBzaG91bGQgc2VuZCBhbiBpbmZpbml0ZSBicmVhayBoZXJlLCBzY2hlZHVsZSgpIGZvcgogCSAgIG1zZWMgYW1vdW50IG9mIHRpbWUsIGFuZCB0aGVuIHN0b3AgdGhlIGJyZWFrLiAgVGhpcyB3YXksCkBAIC0zMzMxLDM2ICsyNzE1LDI4IEBACiAJICAgdG8gYmUgY2FsbGVkIChpLmUuIHZpYSBhbiBpb2N0bCgpKSBtb3JlIHRoYW4gb25jZSBpbiBtc2VjIGFtb3VudCAKIAkgICBvZiB0aW1lLiAgVHJ5IHRoaXMgZm9yIG5vdy4uLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJZmVwY21kKGNoLCBTRU5EQlJFQUssIG1zZWMsIDAsIDEwLCAwKTsKIAltZW1vZmYoY2gpOwotCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIH0gLyogRW5kIGRpZ2lfc2VuZF9icmVhayAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gc2V0dXBfZW1wdHlfZXZlbnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKy8qIENhbGxlciBNVVNUIGhvbGQgdGhlIGxvY2sgKi8KKwogc3RhdGljIHZvaWQgc2V0dXBfZW1wdHlfZXZlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGNoYW5uZWwgKmNoKQogeyAvKiBCZWdpbiBzZXR1cF9lbXB0eV9ldmVudCAqLwogCi0Jdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjID0gY2gtPmJyZGNoYW47Ci0JdW5zaWduZWQgbG9uZyBpbnQgZmxhZ3M7CisJc3RydWN0IGJvYXJkX2NoYW4gKmJjID0gY2gtPmJyZGNoYW47CiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKIAlnbG9iYWx3aW5vbihjaCk7CiAJY2gtPnN0YXR1c2ZsYWdzIHw9IEVNUFRZV0FJVDsKLQkKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJV2hlbiBzZXQgdGhlIGllbXB0eSBmbGFnIHJlcXVlc3QgYSBldmVudCB0byBiZSBnZW5lcmF0ZWQgd2hlbiB0aGUgCiAJCXRyYW5zbWl0IGJ1ZmZlciBpcyBlbXB0eSAoSWYgdGhlcmUgaXMgbm8gQlJFQUsgaW4gcHJvZ3Jlc3MpLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0JYmMtPmllbXB0eSA9IDE7CisJd3JpdGViKDEsICZiYy0+aWVtcHR5KTsKIAltZW1vZmYoY2gpOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCiB9IC8qIEVuZCBzZXR1cF9lbXB0eV9ldmVudCAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gZ2V0X3Rlcm1pbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzM2OSwxMCArMjc0NSwxMCBAQAogeyAvKiBCZWdpbiBnZXRfdGVybWlvICovCiAJcmV0dXJuIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvKHRlcm1pbywgdHR5LT50ZXJtaW9zKTsKIH0gLyogRW5kIGdldF90ZXJtaW8gKi8KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBlcGNhX3NldHVwICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogdm9pZCBlcGNhX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQogeyAvKiBCZWdpbiBlcGNhX3NldHVwICovCi0KIAlzdHJ1Y3QgYm9hcmRfaW5mbyBib2FyZDsKIAlpbnQgICAgICAgICAgICAgICBpbmRleCwgbG9vcCwgbGFzdDsKIAljaGFyICAgICAgICAgICAgICAqdGVtcCwgKnQyOwpAQCAtMzM5NCw0OSArMjc3MCw0MSBAQAogCWZvciAobGFzdCA9IDAsIGluZGV4ID0gMTsgaW5kZXggPD0gaW50c1swXTsgaW5kZXgrKykKIAkJc3dpdGNoKGluZGV4KQogCQl7IC8qIEJlZ2luIHBhcnNlIHN3aXRjaCAqLwotCiAJCQljYXNlIDE6CiAJCQkJYm9hcmQuc3RhdHVzID0gaW50c1tpbmRleF07Ci0JCQkJCiAJCQkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQkJCVdlIGNoZWNrIGZvciAyIChBcyBvcHBvc2VkIHRvIDE7IGJlY2F1c2UgMiBpcyBhIGZsYWcKIAkJCQkJaW5zdHJ1Y3RpbmcgdGhlIGRyaXZlciB0byBpZ25vcmUgZXBjYWNvbmZpZy4pICBGb3IgdGhpcwogCQkJCQlyZWFzb24gd2UgY2hlY2sgZm9yIDIuCiAJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovIAotCQkJCWlmIChib2FyZC5zdGF0dXMgPT0gMikKLQkJCQl7IC8qIEJlZ2luIGlnbm9yZSBlcGNhY29uZmlnIGFzIHdlbGwgYXMgbGlsbyBjbWQgbGluZSAqLworCQkJCWlmIChib2FyZC5zdGF0dXMgPT0gMikgeyAvKiBCZWdpbiBpZ25vcmUgZXBjYWNvbmZpZyBhcyB3ZWxsIGFzIGxpbG8gY21kIGxpbmUgKi8KIAkJCQkJbmJkZXZzID0gMDsKIAkJCQkJbnVtX2NhcmRzID0gMDsKIAkJCQkJcmV0dXJuOwogCQkJCX0gLyogRW5kIGlnbm9yZSBlcGNhY29uZmlnIGFzIHdlbGwgYXMgbGlsbyBjbWQgbGluZSAqLwogCQotCQkJCWlmIChib2FyZC5zdGF0dXMgPiAyKQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBib2FyZCBzdGF0dXMgMHgleFxuIiwgYm9hcmQuc3RhdHVzKTsKKwkJCQlpZiAoYm9hcmQuc3RhdHVzID4gMikgeworCQkJCQlwcmludGsoS0VSTl9FUlIgImVwY2Ffc2V0dXA6IEludmFsaWQgYm9hcmQgc3RhdHVzIDB4JXhcbiIsIGJvYXJkLnN0YXR1cyk7CiAJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOwogCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfQk9BUkRfU1RBVFVTOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJCWxhc3QgPSBpbmRleDsKIAkJCQlicmVhazsKLQogCQkJY2FzZSAyOgogCQkJCWJvYXJkLnR5cGUgPSBpbnRzW2luZGV4XTsKLQkJCQlpZiAoYm9hcmQudHlwZSA+PSBQQ0lYRU0pIAotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBib2FyZCB0eXBlIDB4JXhcbiIsIGJvYXJkLnR5cGUpOworCQkJCWlmIChib2FyZC50eXBlID49IFBDSVhFTSkgIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhX3NldHVwOiBJbnZhbGlkIGJvYXJkIHR5cGUgMHgleFxuIiwgYm9hcmQudHlwZSk7CiAJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOwogCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfQk9BUkRfVFlQRTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCQlsYXN0ID0gaW5kZXg7CiAJCQkJYnJlYWs7Ci0KIAkJCWNhc2UgMzoKIAkJCQlib2FyZC5hbHRwaW4gPSBpbnRzW2luZGV4XTsKLQkJCQlpZiAoYm9hcmQuYWx0cGluID4gMSkKLQkJCQl7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgYm9hcmQgYWx0cGluIDB4JXhcbiIsIGJvYXJkLmFsdHBpbik7CisJCQkJaWYgKGJvYXJkLmFsdHBpbiA+IDEpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhX3NldHVwOiBJbnZhbGlkIGJvYXJkIGFsdHBpbiAweCV4XG4iLCBib2FyZC5hbHRwaW4pOwogCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKIAkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX0FMVFBJTjsKIAkJCQkJcmV0dXJuOwpAQCAtMzQ0Niw5ICsyODE0LDggQEAKIAogCQkJY2FzZSA0OgogCQkJCWJvYXJkLm51bXBvcnRzID0gaW50c1tpbmRleF07Ci0JCQkJaWYgKChib2FyZC5udW1wb3J0cyA8IDIpIHx8IChib2FyZC5udW1wb3J0cyA+IDI1NikpCi0JCQkJewotCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGJvYXJkIG51bXBvcnRzIDB4JXhcbiIsIGJvYXJkLm51bXBvcnRzKTsKKwkJCQlpZiAoYm9hcmQubnVtcG9ydHMgPCAyIHx8IGJvYXJkLm51bXBvcnRzID4gMjU2KSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiZXBjYV9zZXR1cDogSW52YWxpZCBib2FyZCBudW1wb3J0cyAweCV4XG4iLCBib2FyZC5udW1wb3J0cyk7CiAJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOwogCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfTlVNX1BPUlRTOwogCQkJCQlyZXR1cm47CkBAIC0zNDU4LDEwICsyODI1LDkgQEAKIAkJCQlicmVhazsKIAogCQkJY2FzZSA1OgotCQkJCWJvYXJkLnBvcnQgPSAodW5zaWduZWQgY2hhciAqKWludHNbaW5kZXhdOwotCQkJCWlmIChpbnRzW2luZGV4XSA8PSAwKQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBpbyBwb3J0IDB4JXhcbiIsICh1bnNpZ25lZCBpbnQpYm9hcmQucG9ydCk7CisJCQkJYm9hcmQucG9ydCA9IGludHNbaW5kZXhdOworCQkJCWlmIChpbnRzW2luZGV4XSA8PSAwKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiZXBjYV9zZXR1cDogSW52YWxpZCBpbyBwb3J0IDB4JXhcbiIsICh1bnNpZ25lZCBpbnQpYm9hcmQucG9ydCk7CiAJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOwogCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfUE9SVF9CQVNFOwogCQkJCQlyZXR1cm47CkBAIC0zNDcwLDEwICsyODM2LDkgQEAKIAkJCQlicmVhazsKIAogCQkJY2FzZSA2OgotCQkJCWJvYXJkLm1lbWJhc2UgPSAodW5zaWduZWQgY2hhciAqKWludHNbaW5kZXhdOwotCQkJCWlmIChpbnRzW2luZGV4XSA8PSAwKQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBtZW1vcnkgYmFzZSAweCV4XG4iLCh1bnNpZ25lZCBpbnQpYm9hcmQubWVtYmFzZSk7CisJCQkJYm9hcmQubWVtYmFzZSA9IGludHNbaW5kZXhdOworCQkJCWlmIChpbnRzW2luZGV4XSA8PSAwKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiZXBjYV9zZXR1cDogSW52YWxpZCBtZW1vcnkgYmFzZSAweCV4XG4iLCh1bnNpZ25lZCBpbnQpYm9hcmQubWVtYmFzZSk7CiAJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOwogCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfTUVNX0JBU0U7CiAJCQkJCXJldHVybjsKQEAgLTM0ODcsMjEgKzI4NTIsMTYgQEAKIAogCQl9IC8qIEVuZCBwYXJzZSBzd2l0Y2ggKi8KIAotCXdoaWxlIChzdHIgJiYgKnN0cikgCi0JeyAvKiBCZWdpbiB3aGlsZSB0aGVyZSBpcyBhIHN0cmluZyBhcmcgKi8KLQorCXdoaWxlIChzdHIgJiYgKnN0cikgIHsgLyogQmVnaW4gd2hpbGUgdGhlcmUgaXMgYSBzdHJpbmcgYXJnICovCiAJCS8qIGZpbmQgdGhlIG5leHQgY29tbWEgb3IgdGVybWluYXRvciAqLwogCQl0ZW1wID0gc3RyOwotCiAJCS8qIFdoaWxlIHN0cmluZyBpcyBub3QgbnVsbCwgYW5kIGEgY29tbWEgaGFzbid0IGJlZW4gZm91bmQgKi8KIAkJd2hpbGUgKCp0ZW1wICYmICgqdGVtcCAhPSAnLCcpKQogCQkJdGVtcCsrOwotCiAJCWlmICghKnRlbXApCiAJCQl0ZW1wID0gTlVMTDsKIAkJZWxzZQogCQkJKnRlbXArKyA9IDA7Ci0KIAkJLyogU2V0IGluZGV4IHRvIHRoZSBudW1iZXIgb2YgYXJncyArIDEgKi8KIAkJaW5kZXggPSBsYXN0ICsgMTsKIApAQCAtMzUxMSwxMiArMjg3MSwxMCBAQAogCQkJCWxlbiA9IHN0cmxlbihzdHIpOwogCQkJCWlmIChzdHJuY21wKCJEaXNhYmxlIiwgc3RyLCBsZW4pID09IDApIAogCQkJCQlib2FyZC5zdGF0dXMgPSAwOwotCQkJCWVsc2UKLQkJCQlpZiAoc3RybmNtcCgiRW5hYmxlIiwgc3RyLCBsZW4pID09IDApCisJCQkJZWxzZSBpZiAoc3RybmNtcCgiRW5hYmxlIiwgc3RyLCBsZW4pID09IDApCiAJCQkJCWJvYXJkLnN0YXR1cyA9IDE7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBzdGF0dXMgJXNcbiIsIHN0cik7CisJCQkJZWxzZSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiZXBjYV9zZXR1cDogSW52YWxpZCBzdGF0dXMgJXNcbiIsIHN0cik7CiAJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOwogCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfQk9BUkRfU1RBVFVTOwogCQkJCQlyZXR1cm47CkBAIC0zNTI1LDIyICsyODgzLDE3IEBACiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgMjoKLQogCQkJCWZvcihsb29wID0gMDsgbG9vcCA8IEVQQ0FfTlVNX1RZUEVTOyBsb29wKyspCiAJCQkJCWlmIChzdHJjbXAoYm9hcmRfZGVzY1tsb29wXSwgc3RyKSA9PSAwKQogCQkJCQkJYnJlYWs7Ci0KLQogCQkJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJCQlJZiB0aGUgaW5kZXggaW5jcmVtZW50ZWQgYWJvdmUgcmVmZXJzIHRvIGEgbGVnaXRhbWF0ZSBib2FyZCAKIAkJCQkJdHlwZSBzZXQgaXQgaGVyZS4gCiAJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogCQkJCWlmIChpbmRleCA8IEVQQ0FfTlVNX1RZUEVTKSAKIAkJCQkJYm9hcmQudHlwZSA9IGxvb3A7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBib2FyZCB0eXBlOiAlc1xuIiwgc3RyKTsKKwkJCQllbHNlIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhX3NldHVwOiBJbnZhbGlkIGJvYXJkIHR5cGU6ICVzXG4iLCBzdHIpOwogCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKIAkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX0JPQVJEX1RZUEU7CiAJCQkJCXJldHVybjsKQEAgLTM1NTIsMTIgKzI5MDUsMTAgQEAKIAkJCQlsZW4gPSBzdHJsZW4oc3RyKTsKIAkJCQlpZiAoc3RybmNtcCgiRGlzYWJsZSIsIHN0ciwgbGVuKSA9PSAwKSAKIAkJCQkJYm9hcmQuYWx0cGluID0gMDsKLQkJCQllbHNlCi0JCQkJaWYgKHN0cm5jbXAoIkVuYWJsZSIsIHN0ciwgbGVuKSA9PSAwKQorCQkJCWVsc2UgaWYgKHN0cm5jbXAoIkVuYWJsZSIsIHN0ciwgbGVuKSA9PSAwKQogCQkJCQlib2FyZC5hbHRwaW4gPSAxOwotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgYWx0cGluICVzXG4iLCBzdHIpOworCQkJCWVsc2UgeworCQkJCQlwcmludGsoS0VSTl9FUlIgImVwY2Ffc2V0dXA6IEludmFsaWQgYWx0cGluICVzXG4iLCBzdHIpOwogCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKIAkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX0FMVFBJTjsKIAkJCQkJcmV0dXJuOwpAQCAtMzU3MCw5ICsyOTIxLDggQEAKIAkJCQl3aGlsZSAoaXNkaWdpdCgqdDIpKQogCQkJCQl0MisrOwogCi0JCQkJaWYgKCp0MikKLQkJCQl7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgcG9ydCBjb3VudCAlc1xuIiwgc3RyKTsKKwkJCQlpZiAoKnQyKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiZXBjYV9zZXR1cDogSW52YWxpZCBwb3J0IGNvdW50ICVzXG4iLCBzdHIpOwogCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKIAkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX05VTV9QT1JUUzsKIAkJCQkJcmV0dXJuOwpAQCAtMzYwMSwxNSArMjk1MSwxNCBAQAogCQkJCXdoaWxlIChpc3hkaWdpdCgqdDIpKQogCQkJCQl0MisrOwogCi0JCQkJaWYgKCp0MikKLQkJCQl7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgaS9vIGFkZHJlc3MgJXNcbiIsIHN0cik7CisJCQkJaWYgKCp0MikgeworCQkJCQlwcmludGsoS0VSTl9FUlIgImVwY2Ffc2V0dXA6IEludmFsaWQgaS9vIGFkZHJlc3MgJXNcbiIsIHN0cik7CiAJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOwogCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfUE9SVF9CQVNFOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCi0JCQkJYm9hcmQucG9ydCA9ICh1bnNpZ25lZCBjaGFyICopc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAxNik7CisJCQkJYm9hcmQucG9ydCA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMTYpOwogCQkJCWxhc3QgPSBpbmRleDsKIAkJCQlicmVhazsKIApAQCAtMzYxOCw1MiArMjk2NywzOCBAQAogCQkJCXdoaWxlIChpc3hkaWdpdCgqdDIpKQogCQkJCQl0MisrOwogCi0JCQkJaWYgKCp0MikKLQkJCQl7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgbWVtb3J5IGJhc2UgJXNcbiIsc3RyKTsKKwkJCQlpZiAoKnQyKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiZXBjYV9zZXR1cDogSW52YWxpZCBtZW1vcnkgYmFzZSAlc1xuIixzdHIpOwogCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKIAkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX01FTV9CQVNFOwogCQkJCQlyZXR1cm47CiAJCQkJfQotCi0JCQkJYm9hcmQubWVtYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAxNik7CisJCQkJYm9hcmQubWVtYmFzZSA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMTYpOwogCQkJCWxhc3QgPSBpbmRleDsKIAkJCQlicmVhazsKLQogCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9FUlIgIlBDL1h4OiBUb28gbWFueSBzdHJpbmcgcGFybXNcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiZXBjYTogVG9vIG1hbnkgc3RyaW5nIHBhcm1zXG4iKTsKIAkJCQlyZXR1cm47CiAJCX0KIAkJc3RyID0gdGVtcDsKLQogCX0gLyogRW5kIHdoaWxlIHRoZXJlIGlzIGEgc3RyaW5nIGFyZyAqLwogCi0KLQlpZiAobGFzdCA8IDYpICAKLQl7Ci0JCXByaW50ayhLRVJOX0VSUiAiUEMvWHg6IEluc3VmZmljaWVudCBwYXJtcyBzcGVjaWZpZWRcbiIpOworCWlmIChsYXN0IDwgNikgeworCQlwcmludGsoS0VSTl9FUlIgImVwY2E6IEluc3VmZmljaWVudCBwYXJtcyBzcGVjaWZpZWRcbiIpOwogCQlyZXR1cm47CiAJfQogIAogCS8qIEkgc2hvdWxkIFJFQUxMWSB2YWxpZGF0ZSB0aGUgc3R1ZmYgaGVyZSAqLwotCiAJLyogQ29waWVzIG91ciBsb2NhbCBjb3B5IG9mIGJvYXJkIGludG8gYm9hcmRzICovCiAJbWVtY3B5KCh2b2lkICopJmJvYXJkc1tudW1fY2FyZHNdLCh2b2lkICopJmJvYXJkLCBzaXplb2YoYm9hcmQpKTsKLQotCiAJLyogRG9lcyB0aGlzIGdldCBjYWxsZWQgb25jZSBwZXIgbGlsbyBhcmcgYXJlIHdoYXQgPyAqLwotCiAJcHJpbnRrKEtFUk5fSU5GTyAiUEMvWHg6IEFkZGVkIGJvYXJkICVpLCAlcyAlaSBwb3J0cyBhdCAweCU0LjRYIGJhc2UgMHglNi42WFxuIiwgCiAJCW51bV9jYXJkcywgYm9hcmRfZGVzY1tib2FyZC50eXBlXSwgCiAJCWJvYXJkLm51bXBvcnRzLCAoaW50KWJvYXJkLnBvcnQsICh1bnNpZ25lZCBpbnQpIGJvYXJkLm1lbWJhc2UpOwotCiAJbnVtX2NhcmRzKys7Ci0KIH0gLyogRW5kIGVwY2Ffc2V0dXAgKi8KIAogCi0KLSNpZmRlZiBFTkFCTEVfUENJCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gaW5pdF9QQ0kgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBlbnVtIGVwaWNfYm9hcmRfdHlwZXMgewpAQCAtMzY4NSw3ICszMDIwLDYgQEAKIAl7IFBDSVhSSiwgMiwgfSwKIH07CiAKLQogc3RhdGljIGludCBfX2RldmluaXQgZXBjYV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC0zNzExLDEwICszMDQ1LDggQEAKIAlib2FyZHNbYm9hcmRfaWR4XS5zdGF0dXMgPSBFTkFCTEVEOwogCWJvYXJkc1tib2FyZF9pZHhdLnR5cGUgPSBlcGNhX2luZm9fdGJsW2luZm9faWR4XS5ib2FyZF90eXBlOwogCWJvYXJkc1tib2FyZF9pZHhdLm51bXBvcnRzID0gMHgwOwotCWJvYXJkc1tib2FyZF9pZHhdLnBvcnQgPQotCQkodW5zaWduZWQgY2hhciAqKSgoY2hhciAqKSBhZGRyICsgUENJX0lPX09GRlNFVCk7Ci0JYm9hcmRzW2JvYXJkX2lkeF0ubWVtYmFzZSA9Ci0JCSh1bnNpZ25lZCBjaGFyICopKChjaGFyICopIGFkZHIpOworCWJvYXJkc1tib2FyZF9pZHhdLnBvcnQgPSBhZGRyICsgUENJX0lPX09GRlNFVDsKKwlib2FyZHNbYm9hcmRfaWR4XS5tZW1iYXNlID0gYWRkcjsKIAogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uIChhZGRyICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDAsICJlcGNhIikpIHsKIAkJcHJpbnRrIChLRVJOX0VSUiBQRlggInJlc291cmNlIDB4JXggQCAweCVseCB1bmF2YWlsYWJsZVxuIiwKQEAgLTM3NzUsMTUgKzMxMDcsMTMgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlcGNhX3BjaV90YmwpOwogCiBpbnQgX19pbml0IGluaXRfUENJICh2b2lkKQoteyAvKiBCZWdpbiBpbml0X1BDSSAqLworewkvKiBCZWdpbiBpbml0X1BDSSAqLwogCW1lbXNldCAoJmVwY2FfZHJpdmVyLCAwLCBzaXplb2YgKGVwY2FfZHJpdmVyKSk7CiAJZXBjYV9kcml2ZXIubmFtZSA9ICJlcGNhIjsKIAllcGNhX2RyaXZlci5pZF90YWJsZSA9IGVwY2FfcGNpX3RibDsKIAllcGNhX2RyaXZlci5wcm9iZSA9IGVwY2FfaW5pdF9vbmU7CiAKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZXBjYV9kcml2ZXIpOwotfSAvKiBFbmQgaW5pdF9QQ0kgKi8KLQotI2VuZGlmIC8qIEVOQUJMRV9QQ0kgKi8KK30KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VwY2EuaCBiL2RyaXZlcnMvY2hhci9lcGNhLmgKaW5kZXggNTIyMDVlZi4uMjBlZWI1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2VwY2EuaAorKysgYi9kcml2ZXJzL2NoYXIvZXBjYS5oCkBAIC04NSw3MyArODUsNzMgQEAKIHN0cnVjdCBjaGFubmVsIAogewogCWxvbmcgICBtYWdpYzsKLQl1bmNoYXIgYm9hcmRudW07Ci0JdW5jaGFyIGNoYW5uZWxudW07Ci0JdW5jaGFyIG9tb2RlbTsgICAgICAgICAvKiBGRVAgb3V0cHV0IG1vZGVtIHN0YXR1cyAgICAgKi8KLQl1bmNoYXIgaW1vZGVtOyAgICAgICAgIC8qIEZFUCBpbnB1dCBtb2RlbSBzdGF0dXMgICAgICAqLwotCXVuY2hhciBtb2RlbWZha2U7ICAgICAgLyogTW9kZW0gdmFsdWVzIHRvIGJlIGZvcmNlZCAgICovCi0JdW5jaGFyIG1vZGVtOyAgICAgICAgICAvKiBGb3JjZSB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KLQl1bmNoYXIgaGZsb3c7Ci0JdW5jaGFyIGRzcjsKLQl1bmNoYXIgZGNkOwotCXVuY2hhciBtX3J0cyA7IAkJLyogVGhlIGJpdHMgdXNlZCBpbiB3aGF0ZXZlciBGRVAgKi8KLQl1bmNoYXIgbV9kY2QgOwkJLyogaXMgaW5kaWdpbm91cyB0byB0aGlzIGJvYXJkIHRvICovCi0JdW5jaGFyIG1fZHNyIDsJCS8qIHJlcHJlc2VudCBlYWNoIG9mIHRoZSBwaHlzaWNhbCAqLwotCXVuY2hhciBtX2N0cyA7CQkvKiBoYW5kc2hha2UgbGluZXMgKi8KLQl1bmNoYXIgbV9yaSA7Ci0JdW5jaGFyIG1fZHRyIDsKLQl1bmNoYXIgc3RvcGM7Ci0JdW5jaGFyIHN0YXJ0YzsKLQl1bmNoYXIgc3RvcGNhOwotCXVuY2hhciBzdGFydGNhOwotCXVuY2hhciBmZXBzdG9wYzsKLQl1bmNoYXIgZmVwc3RhcnRjOwotCXVuY2hhciBmZXBzdG9wY2E7Ci0JdW5jaGFyIGZlcHN0YXJ0Y2E7Ci0JdW5jaGFyIHR4d2luOwotCXVuY2hhciByeHdpbjsKLQl1c2hvcnQgZmVwaWZsYWc7Ci0JdXNob3J0IGZlcGNmbGFnOwotCXVzaG9ydCBmZXBvZmxhZzsKLQl1c2hvcnQgdHhidWZoZWFkOwotCXVzaG9ydCB0eGJ1ZnNpemU7Ci0JdXNob3J0IHJ4YnVmaGVhZDsKLQl1c2hvcnQgcnhidWZzaXplOworCXVuc2lnbmVkIGNoYXIgYm9hcmRudW07CisJdW5zaWduZWQgY2hhciBjaGFubmVsbnVtOworCXVuc2lnbmVkIGNoYXIgb21vZGVtOyAgICAgICAgIC8qIEZFUCBvdXRwdXQgbW9kZW0gc3RhdHVzICAgICAqLworCXVuc2lnbmVkIGNoYXIgaW1vZGVtOyAgICAgICAgIC8qIEZFUCBpbnB1dCBtb2RlbSBzdGF0dXMgICAgICAqLworCXVuc2lnbmVkIGNoYXIgbW9kZW1mYWtlOyAgICAgIC8qIE1vZGVtIHZhbHVlcyB0byBiZSBmb3JjZWQgICAqLworCXVuc2lnbmVkIGNoYXIgbW9kZW07ICAgICAgICAgIC8qIEZvcmNlIHZhbHVlcyAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgaGZsb3c7CisJdW5zaWduZWQgY2hhciBkc3I7CisJdW5zaWduZWQgY2hhciBkY2Q7CisJdW5zaWduZWQgY2hhciBtX3J0cyA7IAkJLyogVGhlIGJpdHMgdXNlZCBpbiB3aGF0ZXZlciBGRVAgKi8KKwl1bnNpZ25lZCBjaGFyIG1fZGNkIDsJCS8qIGlzIGluZGlnaW5vdXMgdG8gdGhpcyBib2FyZCB0byAqLworCXVuc2lnbmVkIGNoYXIgbV9kc3IgOwkJLyogcmVwcmVzZW50IGVhY2ggb2YgdGhlIHBoeXNpY2FsICovCisJdW5zaWduZWQgY2hhciBtX2N0cyA7CQkvKiBoYW5kc2hha2UgbGluZXMgKi8KKwl1bnNpZ25lZCBjaGFyIG1fcmkgOworCXVuc2lnbmVkIGNoYXIgbV9kdHIgOworCXVuc2lnbmVkIGNoYXIgc3RvcGM7CisJdW5zaWduZWQgY2hhciBzdGFydGM7CisJdW5zaWduZWQgY2hhciBzdG9wY2E7CisJdW5zaWduZWQgY2hhciBzdGFydGNhOworCXVuc2lnbmVkIGNoYXIgZmVwc3RvcGM7CisJdW5zaWduZWQgY2hhciBmZXBzdGFydGM7CisJdW5zaWduZWQgY2hhciBmZXBzdG9wY2E7CisJdW5zaWduZWQgY2hhciBmZXBzdGFydGNhOworCXVuc2lnbmVkIGNoYXIgdHh3aW47CisJdW5zaWduZWQgY2hhciByeHdpbjsKKwl1bnNpZ25lZCBzaG9ydCBmZXBpZmxhZzsKKwl1bnNpZ25lZCBzaG9ydCBmZXBjZmxhZzsKKwl1bnNpZ25lZCBzaG9ydCBmZXBvZmxhZzsKKwl1bnNpZ25lZCBzaG9ydCB0eGJ1ZmhlYWQ7CisJdW5zaWduZWQgc2hvcnQgdHhidWZzaXplOworCXVuc2lnbmVkIHNob3J0IHJ4YnVmaGVhZDsKKwl1bnNpZ25lZCBzaG9ydCByeGJ1ZnNpemU7CiAJaW50ICAgIGNsb3NlX2RlbGF5OwogCWludCAgICBjb3VudDsKIAlpbnQgICAgYmxvY2tlZF9vcGVuOwotCXVsb25nICBldmVudDsKKwl1bnNpZ25lZCBsb25nICBldmVudDsKIAlpbnQgICAgYXN5bmNmbGFnczsKIAl1aW50ICAgZGV2OwotCXVsb25nICBzdGF0dXNmbGFnczsKLQl1bG9uZyAgY19pZmxhZzsKLQl1bG9uZyAgY19jZmxhZzsKLQl1bG9uZyAgY19sZmxhZzsKLQl1bG9uZyAgY19vZmxhZzsKLQl1bmNoYXIgKnR4cHRyOwotCXVuY2hhciAqcnhwdHI7Ci0JdW5jaGFyICp0bXBfYnVmOworCXVuc2lnbmVkIGxvbmcgIHN0YXR1c2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgIGNfaWZsYWc7CisJdW5zaWduZWQgbG9uZyAgY19jZmxhZzsKKwl1bnNpZ25lZCBsb25nICBjX2xmbGFnOworCXVuc2lnbmVkIGxvbmcgIGNfb2ZsYWc7CisJdW5zaWduZWQgY2hhciAqdHhwdHI7CisJdW5zaWduZWQgY2hhciAqcnhwdHI7CisJdW5zaWduZWQgY2hhciAqdG1wX2J1ZjsKIAlzdHJ1Y3QgYm9hcmRfaW5mbyAgICAgICAgICAgKmJvYXJkOwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICAqYnJkY2hhbjsKKwlzdHJ1Y3QgYm9hcmRfY2hhbgkgICAgKmJyZGNoYW47CiAJc3RydWN0IGRpZ2lfc3RydWN0ICAgICAgICAgIGRpZ2lleHQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgICAgICAgICAgICp0dHk7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgICAgICAgICAgIG9wZW5fd2FpdDsKIAl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICAgICAgY2xvc2Vfd2FpdDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICAgICAgICB0cXVldWU7Ci0Jdm9sYXRpbGUgc3RydWN0IGdsb2JhbF9kYXRhICptYWlsYm94OworCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgICAgICB0cXVldWU7CisJc3RydWN0IGdsb2JhbF9kYXRhIAkgICAgKm1haWxib3g7CiB9OwogCiBzdHJ1Y3QgYm9hcmRfaW5mbwkKIHsKLQl1bmNoYXIgc3RhdHVzOwotCXVuY2hhciB0eXBlOwotCXVuY2hhciBhbHRwaW47Ci0JdXNob3J0IG51bXBvcnRzOwotCXVuY2hhciAqcG9ydDsKLQl1bmNoYXIgKm1lbWJhc2U7Ci0JdW5jaGFyIF9faW9tZW0gKnJlX21hcF9wb3J0OwotCXVuY2hhciAqcmVfbWFwX21lbWJhc2U7Ci0JdWxvbmcgIG1lbW9yeV9zZWc7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciB0eXBlOworCXVuc2lnbmVkIGNoYXIgYWx0cGluOworCXVuc2lnbmVkIHNob3J0IG51bXBvcnRzOworCXVuc2lnbmVkIGxvbmcgcG9ydDsKKwl1bnNpZ25lZCBsb25nIG1lbWJhc2U7CisJdW5zaWduZWQgY2hhciBfX2lvbWVtICpyZV9tYXBfcG9ydDsKKwl1bnNpZ25lZCBjaGFyICpyZV9tYXBfbWVtYmFzZTsKKwl1bnNpZ25lZCBsb25nICBtZW1vcnlfc2VnOwogCXZvaWQgKCAqIG1lbXdpbm9uICkJKHN0cnVjdCBib2FyZF9pbmZvICosIHVuc2lnbmVkIGludCkgOwogCXZvaWQgKCAqIG1lbXdpbm9mZiApIAkoc3RydWN0IGJvYXJkX2luZm8gKiwgdW5zaWduZWQgaW50KSA7CiAJdm9pZCAoICogZ2xvYmFsd2lub24gKQkoc3RydWN0IGNoYW5uZWwgKikgOwpAQCAtMTYwLDYgKzE2MCw2IEBACiAJdm9pZCAoICogbWVtb2ZmICkJKHN0cnVjdCBjaGFubmVsICopIDsKIAl2b2lkICggKiBhc3NlcnRnd2lub24gKQkoc3RydWN0IGNoYW5uZWwgKikgOwogCXZvaWQgKCAqIGFzc2VydG1lbW9mZiApCShzdHJ1Y3QgY2hhbm5lbCAqKSA7Ci0JdW5jaGFyIHBvbGxlcl9pbmhpYml0ZWQgOworCXVuc2lnbmVkIGNoYXIgcG9sbGVyX2luaGliaXRlZCA7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlvLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlvLmMKaW5kZXggMTcwNGEyYS4uYjJlMDkyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pby5jCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uYwpAQCAtMzg3LDEwICszODcsOCBAQAogCiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAlhZGRfd2FpdF9xdWV1ZSgmZnRhcGVfd2FpdF9pbnRyLCAmd2FpdCk7Ci0Jd2hpbGUgKCFmdF9pbnRlcnJ1cHRfc2VlbiAmJiB0aW1lb3V0KSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotICAgICAgICB9CisJd2hpbGUgKCFmdF9pbnRlcnJ1cHRfc2VlbiAmJiB0aW1lb3V0KQorCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHRpbWVvdXQpOwogCiAJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJY3VycmVudC0+YmxvY2tlZCA9IG9sZF9zaWdtYXNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jIGIvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jCmluZGV4IDgxZDgxMWUuLmE1NGJjOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9oYW5nY2hlY2stdGltZXIuYworKysgYi9kcml2ZXJzL2NoYXIvaGFuZ2NoZWNrLXRpbWVyLmMKQEAgLTE0OSw4ICsxNDksNyBAQAogCiBzdGF0aWMgdm9pZCBoYW5nY2hlY2tfZmlyZSh1bnNpZ25lZCBsb25nKTsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGhhbmdjaGVja190aWNrdG9jayA9Ci0JCVRJTUVSX0lOSVRJQUxJWkVSKGhhbmdjaGVja19maXJlLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoaGFuZ2NoZWNrX3RpY2t0b2NrLCBoYW5nY2hlY2tfZmlyZSwgMCwgMCk7CiAKIAogc3RhdGljIHZvaWQgaGFuZ2NoZWNrX2ZpcmUodW5zaWduZWQgbG9uZyBkYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2hwZXQuYyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKaW5kZXggNzYyZmE0My4uZGUwMzc5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2hwZXQuYworKysgYi9kcml2ZXJzL2NoYXIvaHBldC5jCkBAIC00NCw3ICs0NCw3IEBACiAvKgogICogVGhlIEhpZ2ggUHJlY2lzaW9uIEV2ZW50IFRpbWVyIGRyaXZlci4KICAqIFRoaXMgZHJpdmVyIGlzIGNsb3NlbHkgbW9kZWxsZWQgYWZ0ZXIgdGhlIHJ0Yy5jIGRyaXZlci4KLSAqIGh0dHA6Ly93d3cuaW50ZWwuY29tL2xhYnMvcGxhdGNvbXAvaHBldC9ocGV0c3BlYy5odG0KKyAqIGh0dHA6Ly93d3cuaW50ZWwuY29tL2hhcmR3YXJlZGVzaWduL2hwZXRzcGVjLmh0bQogICovCiAjZGVmaW5lCUhQRVRfVVNFUl9GUkVRCSg2NCkKICNkZWZpbmUJSFBFVF9EUklGVAkoNTAwKQpAQCAtMTAwLDE0ICsxMDAsMTQgQEAKICNlbmRpZgogCiAjaWZuZGVmIHJlYWRxCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIF9faW5saW5lIHJlYWRxKHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIHJlYWRxKHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAlyZXR1cm4gcmVhZGwoYWRkcikgfCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpcmVhZGwoYWRkciArIDQpKSA8PCAzMkxMKTsKIH0KICNlbmRpZgogCiAjaWZuZGVmIHdyaXRlcQotc3RhdGljIHZvaWQgX19pbmxpbmUgd3JpdGVxKHVuc2lnbmVkIGxvbmcgbG9uZyB2LCB2b2lkIF9faW9tZW0gKmFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVxKHVuc2lnbmVkIGxvbmcgbG9uZyB2LCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJd3JpdGVsKHYgJiAweGZmZmZmZmZmLCBhZGRyKTsKIAl3cml0ZWwodiA+PiAzMiwgYWRkciArIDQpOwpAQCAtNzEyLDcgKzcxMiw3IEBACiAJdGktPnNoaWZ0ID0gMTA7CiAJdGktPmFkZHIgPSAmaHBldHAtPmhwX2hwZXQtPmhwZXRfbWM7CiAJdGktPmZyZXF1ZW5jeSA9IGhwZXRfdGltZV9kaXYoaHBldHMtPmhwX3BlcmlvZCk7Ci0JdGktPmRyaWZ0ID0gdGktPmZyZXF1ZW5jeSAqIEhQRVRfRFJJRlQgLyAxMDAwMDAwOworCXRpLT5kcmlmdCA9IEhQRVRfRFJJRlQ7CiAJdGktPm1hc2sgPSAtMTsKIAogCWhwZXRwLT5ocF9pbnRlcnBvbGF0b3IgPSB0aTsKQEAgLTkwNiwxMSArOTA2LDE1IEBACiAJCWlmIChpcnFwLT5udW1iZXJfb2ZfaW50ZXJydXB0cyA+IDApIHsKIAkJCWhkcC0+aGRfbmlycXMgPSBpcnFwLT5udW1iZXJfb2ZfaW50ZXJydXB0czsKIAotCQkJZm9yIChpID0gMDsgaSA8IGhkcC0+aGRfbmlycXM7IGkrKykKLQkJCQloZHAtPmhkX2lycVtpXSA9CisJCQlmb3IgKGkgPSAwOyBpIDwgaGRwLT5oZF9uaXJxczsgaSsrKSB7CisJCQkJaW50IHJjID0KIAkJCQkgICAgYWNwaV9yZWdpc3Rlcl9nc2koaXJxcC0+aW50ZXJydXB0c1tpXSwKIAkJCQkJCSAgICAgIGlycXAtPmVkZ2VfbGV2ZWwsCiAJCQkJCQkgICAgICBpcnFwLT5hY3RpdmVfaGlnaF9sb3cpOworCQkJCWlmIChyYyA8IDApCisJCQkJCXJldHVybiBBRV9FUlJPUjsKKwkJCQloZHAtPmhkX2lycVtpXSA9IHJjOworCQkJfQogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMKaW5kZXggMzQ4MDUzNS4uNmY2NzNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20uYwpAQCAtNTEzLDEwICs1MTMsNyBAQAogCQkJcmV0dXJuIHJldCA/IDogLUVBR0FJTjsKIAogCQlpZihuZWVkX3Jlc2NoZWQoKSkKLQkJewotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCQl9CisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CiAJCWVsc2UKIAkJCXVkZWxheSgyMDApOwkvKiBGSVhNRTogV2UgY291bGQgcG9sbCBmb3IgMjUwdVMgPz8gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jIGIvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jCmluZGV4IDgyYzVmMzAzLi5iYTg1ZWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL2kybGliLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jCkBAIC02NTUsOCArNjU1LDcgQEAKIAkJCXRpbWVvdXQtLTsgICAvLyBTbyBuZWdhdGl2ZSB2YWx1ZXMgPT0gZm9yZXZlcgogCQkKIAkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkgewotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KDEpOwkvLyBzaG9ydCBuYXAgCisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CS8vIHNob3J0IG5hcAogCQl9IGVsc2UgewogCQkJLy8gd2UgY2Fubm90IHNjaGVkL3NsZWVwIGluIGludGVycnJ1cHQgc2lsbHkKIAkJCXJldHVybiAwOyAgIApAQCAtMTEzMiw4ICsxMTMxLDcgQEAKIAogCQkJCQlpcDJ0cmFjZSAoQ0hBTk4sIElUUkNfT1VUUFVULCA2MSwgMCApOwogCi0JCQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQkJCQlzY2hlZHVsZV90aW1lb3V0KDIpOworCQkJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMik7CiAJCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQkJCQkJYnJlYWs7CiAJCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDJtYWluLmMgYi9kcml2ZXJzL2NoYXIvaXAybWFpbi5jCmluZGV4IGNmMGNkNTguLjllNGUyNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcDJtYWluLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwMm1haW4uYwpAQCAtMTIwLDcgKzEyMCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9zZXJpYWwuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTI1NSw3ICsyNTQsNyBAQAogICogc2VsZWN0ZWQsIHRoZSBib2FyZCBpcyBzZXJ2aWNlZCBwZXJpb2RpY2FsbHkgdG8gc2VlIGlmIGFueXRoaW5nIG5lZWRzIGRvaW5nLgogICovCiAjZGVmaW5lICBQT0xMX1RJTUVPVVQgICAoamlmZmllcyArIDEpCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgUG9sbFRpbWVyID0gVElNRVJfSU5JVElBTElaRVIoaXAyX3BvbGwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihQb2xsVGltZXIsIGlwMl9wb2xsLCAwLCAwKTsKIHN0YXRpYyBjaGFyICBUaW1lck9uOwogCiAjaWZkZWYgSVAyREVCVUdfVFJBQ0UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfYnRfc20uYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfYnRfc20uYwppbmRleCA1Y2U5YzYyLi4zMzg2MjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2J0X3NtLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9idF9zbS5jCkBAIC0zMSw4ICszMSw2IEBACiAjaW5jbHVkZSA8bGludXgvaXBtaV9tc2dkZWZzLmg+CQkvKiBmb3IgY29tcGxldGlvbiBjb2RlcyAqLwogI2luY2x1ZGUgImlwbWlfc2lfc20uaCIKIAotI2RlZmluZSBJUE1JX0JUX1ZFUlNJT04gInYzMyIKLQogc3RhdGljIGludCBidF9kZWJ1ZyA9IDB4MDA7CS8qIFByb2R1Y3Rpb24gdmFsdWUgMCwgc2VlIGZvbGxvd2luZyBmbGFncyAqLwogCiAjZGVmaW5lCUJUX0RFQlVHX0VOQUJMRQkxCkBAIC0xNjMsNyArMTYxLDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWlmICgoc2l6ZSA8IDIpIHx8IChzaXplID4gSVBNSV9NQVhfTVNHX0xFTkdUSCkpIHJldHVybiAtMTsKKwlpZiAoKHNpemUgPCAyKSB8fCAoc2l6ZSA+IElQTUlfTUFYX01TR19MRU5HVEgpKQorCSAgICAgICByZXR1cm4gLTE7CiAKIAlpZiAoKGJ0LT5zdGF0ZSAhPSBCVF9TVEFURV9JRExFKSAmJiAoYnQtPnN0YXRlICE9IEJUX1NUQVRFX0hPU0VEKSkKIAkJcmV0dXJuIC0yOwpAQCAtMTcxLDcgKzE3MCw4IEBACiAJaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKSB7CiAgICAgCQlwcmludGsoS0VSTl9XQVJOSU5HICIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrXG4iKTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlQ6IHdyaXRlIHNlcT0weCUwMlg6IiwgYnQtPnNlcSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICsrKSBwcmludGsgKCIgJTAyeCIsIGRhdGFbaV0pOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArKykKKwkJICAgICAgIHByaW50ayAoIiAlMDJ4IiwgZGF0YVtpXSk7CiAJCXByaW50aygiXG4iKTsKIAl9CiAJYnQtPndyaXRlX2RhdGFbMF0gPSBzaXplICsgMTsJLyogYWxsIGRhdGEgcGx1cyBzZXEgYnl0ZSAqLwpAQCAtMjEwLDE1ICsyMTAsMTggQEAKIAl9IGVsc2UgewogCQlkYXRhWzBdID0gYnQtPnJlYWRfZGF0YVsxXTsKIAkJZGF0YVsxXSA9IGJ0LT5yZWFkX2RhdGFbM107Ci0JCWlmIChsZW5ndGggPCBtc2dfbGVuKSBidC0+dHJ1bmNhdGVkID0gMTsKKwkJaWYgKGxlbmd0aCA8IG1zZ19sZW4pCisJCSAgICAgICBidC0+dHJ1bmNhdGVkID0gMTsKIAkJaWYgKGJ0LT50cnVuY2F0ZWQpIHsJLyogY2FuIGJlIHNldCBpbiByZWFkX2FsbF9ieXRlcygpICovCiAJCQlkYXRhWzJdID0gSVBNSV9FUlJfTVNHX1RSVU5DQVRFRDsKIAkJCW1zZ19sZW4gPSAzOwotCQl9IGVsc2UgbWVtY3B5KGRhdGEgKyAyLCBidC0+cmVhZF9kYXRhICsgNCwgbXNnX2xlbiAtIDIpOworCQl9IGVsc2UKKwkJICAgICAgIG1lbWNweShkYXRhICsgMiwgYnQtPnJlYWRfZGF0YSArIDQsIG1zZ19sZW4gLSAyKTsKIAogCQlpZiAoYnRfZGVidWcgJiBCVF9ERUJVR19NU0cpIHsKIAkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJCVDogcmVzIChyYXcpIik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbXNnX2xlbjsgaSsrKSBwcmludGsoIiAlMDJ4IiwgZGF0YVtpXSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbXNnX2xlbjsgaSsrKQorCQkJICAgICAgIHByaW50aygiICUwMngiLCBkYXRhW2ldKTsKIAkJCXByaW50ayAoIlxuIik7CiAJCX0KIAl9CkBAIC0yMzEsOCArMjM0LDEwIEBACiAKIHN0YXRpYyB2b2lkIHJlc2V0X2ZsYWdzKHN0cnVjdCBzaV9zbV9kYXRhICpidCkKIHsKLQlpZiAoQlRfU1RBVFVTICYgQlRfSF9CVVNZKSBCVF9DT05UUk9MKEJUX0hfQlVTWSk7Ci0JaWYgKEJUX1NUQVRVUyAmIEJUX0JfQlVTWSkgQlRfQ09OVFJPTChCVF9CX0JVU1kpOworCWlmIChCVF9TVEFUVVMgJiBCVF9IX0JVU1kpCisJICAgICAgIEJUX0NPTlRST0woQlRfSF9CVVNZKTsKKwlpZiAoQlRfU1RBVFVTICYgQlRfQl9CVVNZKQorCSAgICAgICBCVF9DT05UUk9MKEJUX0JfQlVTWSk7CiAJQlRfQ09OVFJPTChCVF9DTFJfV1JfUFRSKTsKIAlCVF9DT05UUk9MKEJUX1NNU19BVE4pOwogI2lmZGVmIERFVkVMT1BNRU5UX09OTFlfTk9UX0ZPUl9QUk9EVUNUSU9OCkBAIC0yNDEsNyArMjQ2LDggQEAKIAkJQlRfQ09OVFJPTChCVF9IX0JVU1kpOwogCQlCVF9DT05UUk9MKEJUX0IySF9BVE4pOwogCQlCVF9DT05UUk9MKEJUX0NMUl9SRF9QVFIpOwotCQlmb3IgKGkgPSAwOyBpIDwgSVBNSV9NQVhfTVNHX0xFTkdUSCArIDI7IGkrKykgQk1DMkhPU1Q7CisJCWZvciAoaSA9IDA7IGkgPCBJUE1JX01BWF9NU0dfTEVOR1RIICsgMjsgaSsrKQorCQkgICAgICAgQk1DMkhPU1Q7CiAJCUJUX0NPTlRST0woQlRfSF9CVVNZKTsKIAl9CiAjZW5kaWYKQEAgLTI1OCw3ICsyNjQsOCBAQAogCQkJcHJpbnRrICgiICUwMngiLCBidC0+d3JpdGVfZGF0YVtpXSk7CiAJCXByaW50ayAoIlxuIik7CiAJfQotCWZvciAoaSA9IDA7IGkgPCBidC0+d3JpdGVfY291bnQ7IGkrKykgSE9TVDJCTUMoYnQtPndyaXRlX2RhdGFbaV0pOworCWZvciAoaSA9IDA7IGkgPCBidC0+d3JpdGVfY291bnQ7IGkrKykKKwkgICAgICAgSE9TVDJCTUMoYnQtPndyaXRlX2RhdGFbaV0pOwogfQogCiBzdGF0aWMgaW5saW5lIGludCByZWFkX2FsbF9ieXRlcyhzdHJ1Y3Qgc2lfc21fZGF0YSAqYnQpCkBAIC0yNzgsNyArMjg1LDggQEAKIAkJYnQtPnRydW5jYXRlZCA9IDE7CiAJCXJldHVybiAxOwkvKiBsZXQgbmV4dCBYQUNUSU9OIFNUQVJUIGNsZWFuIGl0IHVwICovCiAJfQotCWZvciAoaSA9IDE7IGkgPD0gYnQtPnJlYWRfY291bnQ7IGkrKykgYnQtPnJlYWRfZGF0YVtpXSA9IEJNQzJIT1NUOworCWZvciAoaSA9IDE7IGkgPD0gYnQtPnJlYWRfY291bnQ7IGkrKykKKwkgICAgICAgYnQtPnJlYWRfZGF0YVtpXSA9IEJNQzJIT1NUOwogCWJ0LT5yZWFkX2NvdW50Kys7CS8qIGFjY291bnQgZm9yIHRoZSBsZW5ndGggYnl0ZSAqLwogCiAJaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKSB7CkBAIC0yOTUsNyArMzAzLDggQEAKICAgICAgICAgCSgoYnQtPnJlYWRfZGF0YVsxXSAmIDB4RjgpID09IChidC0+d3JpdGVfZGF0YVsxXSAmIDB4RjgpKSkKIAkJCXJldHVybiAxOwogCi0JaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKSBwcmludGsoS0VSTl9XQVJOSU5HICJCVDogYmFkIHBhY2tldDogIgorCWlmIChidF9kZWJ1ZyAmIEJUX0RFQlVHX01TRykKKwkgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiQlQ6IGJhZCBwYWNrZXQ6ICIKIAkJIndhbnQgMHgoJTAyWCwgJTAyWCwgJTAyWCkgZ290ICglMDJYLCAlMDJYLCAlMDJYKVxuIiwKIAkJYnQtPndyaXRlX2RhdGFbMV0sIGJ0LT53cml0ZV9kYXRhWzJdLCBidC0+d3JpdGVfZGF0YVszXSwKIAkJYnQtPnJlYWRfZGF0YVsxXSwgIGJ0LT5yZWFkX2RhdGFbMl0sICBidC0+cmVhZF9kYXRhWzNdKTsKQEAgLTM1OSw3ICszNjgsOCBAQAogCQkJdGltZSk7CiAJYnQtPmxhc3Rfc3RhdGUgPSBidC0+c3RhdGU7CiAKLQlpZiAoYnQtPnN0YXRlID09IEJUX1NUQVRFX0hPU0VEKSByZXR1cm4gU0lfU01fSE9TRUQ7CisJaWYgKGJ0LT5zdGF0ZSA9PSBCVF9TVEFURV9IT1NFRCkKKwkgICAgICAgcmV0dXJuIFNJX1NNX0hPU0VEOwogCiAJaWYgKGJ0LT5zdGF0ZSAhPSBCVF9TVEFURV9JRExFKSB7CS8qIGRvIHRpbWVvdXQgdGVzdCAqLwogCkBAIC0zNzEsNyArMzgxLDggQEAKICAgICAJLyogRklYTUU6IGJ0X2V2ZW50IGlzIHNvbWV0aW1lcyBjYWxsZWQgd2l0aCB0aW1lID4gQlRfTk9STUFMX1RJTUVPVVQKICAgICAgICAgICAgICAgKG5vdGljZWQgaW4gaXBtaV9zbWljX3NtLmMgSmFudWFyeSAyMDA0KSAqLwogCi0JCWlmICgodGltZSA8PSAwKSB8fCAodGltZSA+PSBCVF9OT1JNQUxfVElNRU9VVCkpIHRpbWUgPSAxMDA7CisJCWlmICgodGltZSA8PSAwKSB8fCAodGltZSA+PSBCVF9OT1JNQUxfVElNRU9VVCkpCisJCSAgICAgICB0aW1lID0gMTAwOwogCQlidC0+dGltZW91dCAtPSB0aW1lOwogCQlpZiAoKGJ0LT50aW1lb3V0IDwgMCkgJiYgKGJ0LT5zdGF0ZSA8IEJUX1NUQVRFX1JFU0VUMSkpIHsKIAkJCWVycm9yX3JlY292ZXJ5KGJ0LCAidGltZWQgb3V0Iik7CkBAIC0zOTMsMTIgKzQwNCwxNCBAQAogCQkJQlRfQ09OVFJPTChCVF9IX0JVU1kpOwogCQkJYnJlYWs7CiAJCX0KLSAgICAJCWlmIChzdGF0dXMgJiBCVF9CMkhfQVROKSBicmVhazsKKyAgICAJCWlmIChzdGF0dXMgJiBCVF9CMkhfQVROKQorCQkgICAgICAgYnJlYWs7CiAJCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1dSSVRFX0JZVEVTOwogCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZOwkvKiBmb3IgbG9nZ2luZyAqLwogCiAJY2FzZSBCVF9TVEFURV9XUklURV9CWVRFUzoKLQkJaWYgKHN0YXR1cyAmIChCVF9CX0JVU1kgfCBCVF9IMkJfQVROKSkgYnJlYWs7CisJCWlmIChzdGF0dXMgJiAoQlRfQl9CVVNZIHwgQlRfSDJCX0FUTikpCisJCSAgICAgICBicmVhazsKIAkJQlRfQ09OVFJPTChCVF9DTFJfV1JfUFRSKTsKIAkJd3JpdGVfYWxsX2J5dGVzKGJ0KTsKIAkJQlRfQ09OVFJPTChCVF9IMkJfQVROKTsJLyogY2xlYXJzIHRvbyBmYXN0IHRvIGNhdGNoPyAqLwpAQCAtNDA2LDcgKzQxOSw4IEBACiAJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVk7IC8qIGl0IE1JR0hUIHNhaWwgdGhyb3VnaCAqLwogCiAJY2FzZSBCVF9TVEFURV9XUklURV9DT05TVU1FOiAvKiBCTUNzIHVzdWFsbHkgYmxvdyByaWdodCB0aHJ1IGhlcmUgKi8KLSAgICAgICAgCWlmIChzdGF0dXMgJiAoQlRfSDJCX0FUTiB8IEJUX0JfQlVTWSkpIGJyZWFrOworICAgICAgICAJaWYgKHN0YXR1cyAmIChCVF9IMkJfQVROIHwgQlRfQl9CVVNZKSkKKwkJICAgICAgIGJyZWFrOwogCQlidC0+c3RhdGUgPSBCVF9TVEFURV9CMkhfV0FJVDsKIAkJLyogZmFsbCB0aHJvdWdoIHdpdGggc3RhdHVzICovCiAKQEAgLTQxNSwxNSArNDI5LDE4IEBACiAJICAgZ2VuZXJhdGlvbiBvZiBCMkhfQVROIHNvIEFMV0FZUyByZXR1cm4gQ0FMTF9XSVRIX0RFTEFZLiAqLwogCiAJY2FzZSBCVF9TVEFURV9CMkhfV0FJVDoKLSAgICAJCWlmICghKHN0YXR1cyAmIEJUX0IySF9BVE4pKSBicmVhazsKKyAgICAJCWlmICghKHN0YXR1cyAmIEJUX0IySF9BVE4pKQorCQkgICAgICAgYnJlYWs7CiAKIAkJLyogQXNzdW1lIG9yZGVyZWQsIHVuY2FjaGVkIHdyaXRlczogbm8gbmVlZCB0byB3YWl0ICovCi0JCWlmICghKHN0YXR1cyAmIEJUX0hfQlVTWSkpIEJUX0NPTlRST0woQlRfSF9CVVNZKTsgLyogc2V0ICovCisJCWlmICghKHN0YXR1cyAmIEJUX0hfQlVTWSkpCisJCSAgICAgICBCVF9DT05UUk9MKEJUX0hfQlVTWSk7IC8qIHNldCAqLwogCQlCVF9DT05UUk9MKEJUX0IySF9BVE4pOwkJLyogY2xlYXIgaXQsIEFDSyB0byB0aGUgQk1DICovCiAJCUJUX0NPTlRST0woQlRfQ0xSX1JEX1BUUik7CS8qIHJlc2V0IHRoZSBxdWV1ZSAqLwogCQlpID0gcmVhZF9hbGxfYnl0ZXMoYnQpOwogCQlCVF9DT05UUk9MKEJUX0hfQlVTWSk7CQkvKiBjbGVhciAqLwotCQlpZiAoIWkpIGJyZWFrOwkJCS8qIFRyeSB0aGlzIHN0YXRlIGFnYWluICovCisJCWlmICghaSkJCQkJLyogVHJ5IHRoaXMgc3RhdGUgYWdhaW4gKi8KKwkJICAgICAgIGJyZWFrOwogCQlidC0+c3RhdGUgPSBCVF9TVEFURV9SRUFEX0VORDsKIAkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWTsJLyogZm9yIGxvZ2dpbmcgKi8KIApAQCAtNDM2LDcgKzQ1Myw4IEBACiAKICNpZmRlZiBNQUtFX1RISVNfVFJVRV9JRl9ORUNFU1NBUlkKIAotCQlpZiAoc3RhdHVzICYgQlRfSF9CVVNZKSBicmVhazsKKwkJaWYgKHN0YXR1cyAmIEJUX0hfQlVTWSkKKwkJICAgICAgIGJyZWFrOwogI2VuZGlmCiAJCWJ0LT5zZXErKzsKIAkJYnQtPnN0YXRlID0gQlRfU1RBVEVfSURMRTsKQEAgLTQ1OSw3ICs0NzcsOCBAQAogCQlicmVhazsKIAogCWNhc2UgQlRfU1RBVEVfUkVTRVQzOgotCQlpZiAoYnQtPnRpbWVvdXQgPiAwKSByZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQlpZiAoYnQtPnRpbWVvdXQgPiAwKQorCQkgICAgICAgcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKIAkJYnQtPnN0YXRlID0gQlRfU1RBVEVfUkVTVEFSVDsJLyogcHJpbnRrIGluIGRlYnVnIG1vZGVzICovCiAJCWJyZWFrOwogCkBAIC00ODUsNyArNTA0LDggQEAKIAkgICBidXQgdGhhdCdzIHdoYXQgeW91IGdldCBmcm9tIHJlYWRpbmcgYSBib2d1cyBhZGRyZXNzLCBzbyB3ZQogCSAgIHRlc3QgdGhhdCBmaXJzdC4gIFRoZSBjYWxsaW5nIHJvdXRpbmUgdXNlcyBuZWdhdGl2ZSBsb2dpYy4gKi8KIAotCWlmICgoQlRfU1RBVFVTID09IDB4RkYpICYmIChCVF9JTlRNQVNLX1IgPT0gMHhGRikpIHJldHVybiAxOworCWlmICgoQlRfU1RBVFVTID09IDB4RkYpICYmIChCVF9JTlRNQVNLX1IgPT0gMHhGRikpCisJICAgICAgIHJldHVybiAxOwogCXJlc2V0X2ZsYWdzKGJ0KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUwMSw3ICs1MjEsNiBAQAogCiBzdHJ1Y3Qgc2lfc21faGFuZGxlcnMgYnRfc21pX2hhbmRsZXJzID0KIHsKLQkudmVyc2lvbiAgICAgICAgICAgPSBJUE1JX0JUX1ZFUlNJT04sCiAJLmluaXRfZGF0YSAgICAgICAgID0gYnRfaW5pdF9kYXRhLAogCS5zdGFydF90cmFuc2FjdGlvbiA9IGJ0X3N0YXJ0X3RyYW5zYWN0aW9uLAogCS5nZXRfcmVzdWx0ICAgICAgICA9IGJ0X2dldF9yZXN1bHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2RldmludGYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfZGV2aW50Zi5jCmluZGV4IGUwYTUzNTcuLmEwOWZmMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfZGV2aW50Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfZGV2aW50Zi5jCkBAIC00Nyw4ICs0Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAKLSNkZWZpbmUgSVBNSV9ERVZJTlRGX1ZFUlNJT04gInYzMyIKLQogc3RydWN0IGlwbWlfZmlsZV9wcml2YXRlCiB7CiAJaXBtaV91c2VyX3QgICAgICAgICAgdXNlcjsKQEAgLTQxMSw2ICs0MDksNyBAQAogCQlicmVhazsKIAl9CiAKKwkvKiBUaGUgbmV4dCBmb3VyIGFyZSBsZWdhY3ksIG5vdCBwZXItY2hhbm5lbC4gKi8KIAljYXNlIElQTUlDVExfU0VUX01ZX0FERFJFU1NfQ01EOgogCXsKIAkJdW5zaWduZWQgaW50IHZhbDsKQEAgLTQyMCwyMiArNDE5LDI1IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlwbWlfc2V0X215X2FkZHJlc3MocHJpdi0+dXNlciwgdmFsKTsKLQkJcnYgPSAwOworCQlydiA9IGlwbWlfc2V0X215X2FkZHJlc3MocHJpdi0+dXNlciwgMCwgdmFsKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBJUE1JQ1RMX0dFVF9NWV9BRERSRVNTX0NNRDoKIAl7Ci0JCXVuc2lnbmVkIGludCB2YWw7CisJCXVuc2lnbmVkIGludCAgdmFsOworCQl1bnNpZ25lZCBjaGFyIHJ2YWw7CiAKLQkJdmFsID0gaXBtaV9nZXRfbXlfYWRkcmVzcyhwcml2LT51c2VyKTsKKwkJcnYgPSBpcG1pX2dldF9teV9hZGRyZXNzKHByaXYtPnVzZXIsIDAsICZydmFsKTsKKwkJaWYgKHJ2KQorCQkJYnJlYWs7CisKKwkJdmFsID0gcnZhbDsKIAogCQlpZiAoY29weV90b191c2VyKGFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKSB7CiAJCQlydiA9IC1FRkFVTFQ7CiAJCQlicmVhazsKIAkJfQotCQlydiA9IDA7CiAJCWJyZWFrOwogCX0KIApAQCAtNDQ4LDI0ICs0NTAsOTQgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaXBtaV9zZXRfbXlfTFVOKHByaXYtPnVzZXIsIHZhbCk7Ci0JCXJ2ID0gMDsKKwkJcnYgPSBpcG1pX3NldF9teV9MVU4ocHJpdi0+dXNlciwgMCwgdmFsKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBJUE1JQ1RMX0dFVF9NWV9MVU5fQ01EOgogCXsKLQkJdW5zaWduZWQgaW50IHZhbDsKKwkJdW5zaWduZWQgaW50ICB2YWw7CisJCXVuc2lnbmVkIGNoYXIgcnZhbDsKIAotCQl2YWwgPSBpcG1pX2dldF9teV9MVU4ocHJpdi0+dXNlcik7CisJCXJ2ID0gaXBtaV9nZXRfbXlfTFVOKHByaXYtPnVzZXIsIDAsICZydmFsKTsKKwkJaWYgKHJ2KQorCQkJYnJlYWs7CisKKwkJdmFsID0gcnZhbDsKIAogCQlpZiAoY29weV90b191c2VyKGFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKSB7CiAJCQlydiA9IC1FRkFVTFQ7CiAJCQlicmVhazsKIAkJfQotCQlydiA9IDA7CiAJCWJyZWFrOwogCX0KKworCWNhc2UgSVBNSUNUTF9TRVRfTVlfQ0hBTk5FTF9BRERSRVNTX0NNRDoKKwl7CisJCXN0cnVjdCBpcG1pX2NoYW5uZWxfbHVuX2FkZHJlc3Nfc2V0IHZhbDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJnLCBzaXplb2YodmFsKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0dXJuIGlwbWlfc2V0X215X2FkZHJlc3MocHJpdi0+dXNlciwgdmFsLmNoYW5uZWwsIHZhbC52YWx1ZSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgSVBNSUNUTF9HRVRfTVlfQ0hBTk5FTF9BRERSRVNTX0NNRDoKKwl7CisJCXN0cnVjdCBpcG1pX2NoYW5uZWxfbHVuX2FkZHJlc3Nfc2V0IHZhbDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJnLCBzaXplb2YodmFsKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcnYgPSBpcG1pX2dldF9teV9hZGRyZXNzKHByaXYtPnVzZXIsIHZhbC5jaGFubmVsLCAmdmFsLnZhbHVlKTsKKwkJaWYgKHJ2KQorCQkJYnJlYWs7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ2YWwsIHNpemVvZih2YWwpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBJUE1JQ1RMX1NFVF9NWV9DSEFOTkVMX0xVTl9DTUQ6CisJeworCQlzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCB2YWw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZywgc2l6ZW9mKHZhbCkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXJ2ID0gaXBtaV9zZXRfbXlfTFVOKHByaXYtPnVzZXIsIHZhbC5jaGFubmVsLCB2YWwudmFsdWUpOworCQlicmVhazsKKwl9CisKKwljYXNlIElQTUlDVExfR0VUX01ZX0NIQU5ORUxfTFVOX0NNRDoKKwl7CisJCXN0cnVjdCBpcG1pX2NoYW5uZWxfbHVuX2FkZHJlc3Nfc2V0IHZhbDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJnLCBzaXplb2YodmFsKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcnYgPSBpcG1pX2dldF9teV9MVU4ocHJpdi0+dXNlciwgdmFsLmNoYW5uZWwsICZ2YWwudmFsdWUpOworCQlpZiAocnYpCisJCQlicmVhazsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKIAljYXNlIElQTUlDVExfU0VUX1RJTUlOR19QQVJNU19DTUQ6CiAJewogCQlzdHJ1Y3QgaXBtaV90aW1pbmdfcGFybXMgcGFybXM7CkBAIC02NjMsNyArNzM1LDggQEAKIAljYXNlIENPTVBBVF9JUE1JQ1RMX1JFQ0VJVkVfTVNHOgogCWNhc2UgQ09NUEFUX0lQTUlDVExfUkVDRUlWRV9NU0dfVFJVTkM6CiAJewotCQlzdHJ1Y3QgaXBtaV9yZWN2ICAgKnByZWN2NjQsIHJlY3Y2NDsKKwkJc3RydWN0IGlwbWlfcmVjdiAgIF9fdXNlciAqcHJlY3Y2NDsKKwkJc3RydWN0IGlwbWlfcmVjdiAgIHJlY3Y2NDsKIAogCQlpZiAoZ2V0X2NvbXBhdF9pcG1pX3JlY3YoJnJlY3Y2NCwgY29tcGF0X3B0cihhcmcpKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtNjc2LDcgKzc0OSw3IEBACiAJCQkJKChjbWQgPT0gQ09NUEFUX0lQTUlDVExfUkVDRUlWRV9NU0cpCiAJCQkJID8gSVBNSUNUTF9SRUNFSVZFX01TRwogCQkJCSA6IElQTUlDVExfUkVDRUlWRV9NU0dfVFJVTkMpLAotCQkJCShsb25nKSBwcmVjdjY0KTsKKwkJCQkodW5zaWduZWQgbG9uZykgcHJlY3Y2NCk7CiAJCWlmIChyYyAhPSAwKQogCQkJcmV0dXJuIHJjOwogCkBAIC03NDgsOCArODIxLDcgQEAKIAlpZiAoaXBtaV9tYWpvciA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiaXBtaSBkZXZpY2UgaW50ZXJmYWNlIHZlcnNpb24gIgotCSAgICAgICBJUE1JX0RFVklOVEZfVkVSU0lPTiAiXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJpcG1pIGRldmljZSBpbnRlcmZhY2VcbiIpOwogCiAJaXBtaV9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImlwbWkiKTsKIAlpZiAoSVNfRVJSKGlwbWlfY2xhc3MpKSB7CkBAIC03OTIsMyArODY0LDUgQEAKIG1vZHVsZV9leGl0KGNsZWFudXBfaXBtaSk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkNvcmV5IE1pbnlhcmQgPG1pbnlhcmRAbXZpc3RhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTGludXggZGV2aWNlIGludGVyZmFjZSBmb3IgdGhlIElQTUkgbWVzc2FnZSBoYW5kbGVyLiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9rY3Nfc20uYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfa2NzX3NtLmMKaW5kZXggNDhjY2UyNC4uZDIxODUzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9rY3Nfc20uYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2tjc19zbS5jCkBAIC00Miw4ICs0Miw2IEBACiAjaW5jbHVkZSA8bGludXgvaXBtaV9tc2dkZWZzLmg+CQkvKiBmb3IgY29tcGxldGlvbiBjb2RlcyAqLwogI2luY2x1ZGUgImlwbWlfc2lfc20uaCIKIAotI2RlZmluZSBJUE1JX0tDU19WRVJTSU9OICJ2MzMiCi0KIC8qIFNldCB0aGlzIGlmIHlvdSB3YW50IGEgcHJpbnRvdXQgb2Ygd2h5IHRoZSBzdGF0ZSBtYWNoaW5lIHdhcyBob3NlZAogICAgd2hlbiBpdCBnZXRzIGhvc2VkLiAqLwogI2RlZmluZSBERUJVR19IT1NFRF9SRUFTT04KQEAgLTQ4OSw3ICs0ODcsNiBAQAogCiBzdHJ1Y3Qgc2lfc21faGFuZGxlcnMga2NzX3NtaV9oYW5kbGVycyA9CiB7Ci0JLnZlcnNpb24gICAgICAgICAgID0gSVBNSV9LQ1NfVkVSU0lPTiwKIAkuaW5pdF9kYXRhICAgICAgICAgPSBpbml0X2tjc19kYXRhLAogCS5zdGFydF90cmFuc2FjdGlvbiA9IHN0YXJ0X2tjc190cmFuc2FjdGlvbiwKIAkuZ2V0X3Jlc3VsdCAgICAgICAgPSBnZXRfa2NzX3Jlc3VsdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMKaW5kZXggZTE2YzEzZi4uNDYzMzUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMKQEAgLTQ3LDcgKzQ3LDggQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAKICNkZWZpbmUgUEZYICJJUE1JIG1lc3NhZ2UgaGFuZGxlcjogIgotI2RlZmluZSBJUE1JX01TR0hBTkRMRVJfVkVSU0lPTiAidjMzIgorCisjZGVmaW5lIElQTUlfRFJJVkVSX1ZFUlNJT04gIjM2LjAiCiAKIHN0YXRpYyBzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqaXBtaV9hbGxvY19yZWN2X21zZyh2b2lkKTsKIHN0YXRpYyBpbnQgaXBtaV9pbml0X21zZ2hhbmRsZXIodm9pZCk7CkBAIC0xMTYsNyArMTE3LDcgQEAKIAlkbyB7CQkJCQkJCQlcCiAJCXNlcSA9ICgobXNnaWQgPj4gMjYpICYgMHgzZik7CQkJCVwKIAkJc2VxaWQgPSAobXNnaWQgJiAweDNmZmZmZik7CQkJCVwKLSAgICAgICAgfSB3aGlsZSgwKQorICAgICAgICB9IHdoaWxlICgwKQogCiAjZGVmaW5lIE5FWFRfU0VRSUQoc2VxaWQpICgoKHNlcWlkKSArIDEpICYgMHgzZmZmZmYpCiAKQEAgLTEyNCw2ICsxMjUsMTQgQEAKIHsKIAl1bnNpZ25lZCBjaGFyIG1lZGl1bTsKIAl1bnNpZ25lZCBjaGFyIHByb3RvY29sOworCisJLyogTXkgc2xhdmUgYWRkcmVzcy4gIFRoaXMgaXMgaW5pdGlhbGl6ZWQgdG8gSVBNSV9CTUNfU0xBVkVfQUREUiwKKwkgICBidXQgbWF5IGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIuICovCisJdW5zaWduZWQgY2hhciBhZGRyZXNzOworCisJLyogTXkgTFVOLiAgVGhpcyBzaG91bGQgZ2VuZXJhbGx5IHN0YXkgdGhlIFNNUyBMVU4sIGJ1dCBqdXN0IGluCisJICAgY2FzZS4uLiAqLworCXVuc2lnbmVkIGNoYXIgbHVuOwogfTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCkBAIC0xMzUsNyArMTQ0LDcgQEAKICNlbmRpZgogCiAjZGVmaW5lIElQTUlfSVBNQl9OVU1fU0VRCTY0Ci0jZGVmaW5lIElQTUlfTUFYX0NIQU5ORUxTICAgICAgIDgKKyNkZWZpbmUgSVBNSV9NQVhfQ0hBTk5FTFMgICAgICAgMTYKIHN0cnVjdCBpcG1pX3NtaQogewogCS8qIFdoYXQgaW50ZXJmYWNlIG51bWJlciBhcmUgd2U/ICovCkBAIC0xOTMsMjAgKzIwMiw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCB3YWl0aW5nX2V2ZW50czsKIAl1bnNpZ25lZCBpbnQgICAgIHdhaXRpbmdfZXZlbnRzX2NvdW50OyAvKiBIb3cgbWFueSBldmVudHMgaW4gcXVldWU/ICovCiAKLQkvKiBUaGlzIHdpbGwgYmUgbm9uLW51bGwgaWYgc29tZW9uZSByZWdpc3RlcnMgdG8gcmVjZWl2ZSBhbGwKLQkgICBJUE1JIGNvbW1hbmRzICh0aGlzIGlzIGZvciBpbnRlcmZhY2UgZW11bGF0aW9uKS4gIFRoZXJlCi0JICAgbWF5IG5vdCBiZSBhbnkgdGhpbmdzIGluIHRoZSBjbWRfcmN2cnMgbGlzdCBhYm92ZSB3aGVuCi0JICAgdGhpcyBpcyByZWdpc3RlcmVkLiAqLwotCWlwbWlfdXNlcl90IGFsbF9jbWRfcmN2cjsKLQotCS8qIE15IHNsYXZlIGFkZHJlc3MuICBUaGlzIGlzIGluaXRpYWxpemVkIHRvIElQTUlfQk1DX1NMQVZFX0FERFIsCi0JICAgYnV0IG1heSBiZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyLiAqLwotCXVuc2lnbmVkIGNoYXIgbXlfYWRkcmVzczsKLQotCS8qIE15IExVTi4gIFRoaXMgc2hvdWxkIGdlbmVyYWxseSBzdGF5IHRoZSBTTVMgTFVOLCBidXQganVzdCBpbgotCSAgIGNhc2UuLi4gKi8KLQl1bnNpZ25lZCBjaGFyIG15X2x1bjsKLQogCS8qIFRoZSBldmVudCByZWNlaXZlciBmb3IgbXkgQk1DLCBvbmx5IHJlYWxseSB1c2VkIGF0IHBhbmljCiAJICAgc2h1dGRvd24gYXMgYSBwbGFjZSB0byBzdG9yZSB0aGlzLiAqLwogCXVuc2lnbmVkIGNoYXIgZXZlbnRfcmVjZWl2ZXI7CkBAIC0yMTgsNyArMjEzLDcgQEAKIAkgICBpbnRlcmZhY2UgY29tZXMgaW4gd2l0aCBhIE5VTEwgdXNlciwgY2FsbCB0aGlzIHJvdXRpbmUgd2l0aAogCSAgIGl0LiAgTm90ZSB0aGF0IHRoZSBtZXNzYWdlIHdpbGwgc3RpbGwgYmUgZnJlZWQgYnkgdGhlCiAJICAgY2FsbGVyLiAgVGhpcyBvbmx5IHdvcmtzIG9uIHRoZSBzeXN0ZW0gaW50ZXJmYWNlLiAqLwotCXZvaWQgKCpudWxsX3VzZXJfaGFuZGxlcikoaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpOworCXZvaWQgKCpudWxsX3VzZXJfaGFuZGxlcikoaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnKTsKIAogCS8qIFdoZW4gd2UgYXJlIHNjYW5uaW5nIHRoZSBjaGFubmVscyBmb3IgYW4gU01JLCB0aGlzIHdpbGwKIAkgICB0ZWxsIHdoaWNoIGNoYW5uZWwgd2UgYXJlIHNjYW5uaW5nLiAqLwpAQCAtMzI1LDcgKzMyMCw3IEBACiAJZG93bl9yZWFkKCZpbnRlcmZhY2VzX3NlbSk7CiAJZG93bl93cml0ZSgmc21pX3dhdGNoZXJzX3NlbSk7CiAJbGlzdF9hZGQoJih3YXRjaGVyLT5saW5rKSwgJnNtaV93YXRjaGVycyk7Ci0JZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgewogCQlpZiAoaXBtaV9pbnRlcmZhY2VzW2ldICE9IE5VTEwpIHsKIAkJCXdhdGNoZXItPm5ld19zbWkoaSk7CiAJCX0KQEAgLTQ1OCw3ICs0NTMsMjcgQEAKIAogc3RhdGljIHZvaWQgZGVsaXZlcl9yZXNwb25zZShzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnKQogewotCW1zZy0+dXNlci0+aGFuZGxlci0+aXBtaV9yZWN2X2huZGwobXNnLCBtc2ctPnVzZXItPmhhbmRsZXJfZGF0YSk7CisJaWYgKCEgbXNnLT51c2VyKSB7CisJCWlwbWlfc21pX3QgICAgaW50ZiA9IG1zZy0+dXNlcl9tc2dfZGF0YTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBOVUxMIHVzZXJzLiAqLworCQlpZiAoaW50Zi0+bnVsbF91c2VyX2hhbmRsZXIpIHsKKwkJCWludGYtPm51bGxfdXNlcl9oYW5kbGVyKGludGYsIG1zZyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT5oYW5kbGVkX2xvY2FsX3Jlc3BvbnNlcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQkvKiBObyBoYW5kbGVyLCBzbyBnaXZlIHVwLiAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQkJaW50Zi0+dW5oYW5kbGVkX2xvY2FsX3Jlc3BvbnNlcysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCX0KKwkJaXBtaV9mcmVlX3JlY3ZfbXNnKG1zZyk7CisJfSBlbHNlIHsKKwkJbXNnLT51c2VyLT5oYW5kbGVyLT5pcG1pX3JlY3ZfaG5kbChtc2csCisJCQkJCQkgICBtc2ctPnVzZXItPmhhbmRsZXJfZGF0YSk7CisJfQogfQogCiAvKiBGaW5kIHRoZSBuZXh0IHNlcXVlbmNlIG51bWJlciBub3QgYmVpbmcgdXNlZCBhbmQgYWRkIHRoZSBnaXZlbgpAQCAtNDc1LDkgKzQ5MCw5IEBACiAJaW50ICAgICAgICAgIHJ2ID0gMDsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWZvciAoaT1pbnRmLT5jdXJyX3NlcTsKKwlmb3IgKGkgPSBpbnRmLT5jdXJyX3NlcTsKIAkgICAgIChpKzEpJUlQTUlfSVBNQl9OVU1fU0VRICE9IGludGYtPmN1cnJfc2VxOwotCSAgICAgaT0oaSsxKSVJUE1JX0lQTUJfTlVNX1NFUSkKKwkgICAgIGkgPSAoaSsxKSVJUE1JX0lQTUJfTlVNX1NFUSkKIAl7CiAJCWlmICghIGludGYtPnNlcV90YWJsZVtpXS5pbnVzZSkKIAkJCWJyZWFrOwpAQCAtNzEyLDcgKzcyNyw3IEBACiAKIAkvKiBSZW1vdmUgdGhlIHVzZXIgZnJvbSB0aGUgaW50ZXJmYWNlcyBzZXF1ZW5jZSB0YWJsZS4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmKHVzZXItPmludGYtPnNlcV9sb2NrKSwgZmxhZ3MpOwotCWZvciAoaT0wOyBpPElQTUlfSVBNQl9OVU1fU0VROyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgSVBNSV9JUE1CX05VTV9TRVE7IGkrKykgewogCQlpZiAodXNlci0+aW50Zi0+c2VxX3RhYmxlW2ldLmludXNlCiAJCSAgICAmJiAodXNlci0+aW50Zi0+c2VxX3RhYmxlW2ldLnJlY3ZfbXNnLT51c2VyID09IHVzZXIpKQogCQl7CkBAIC03NjYsMjYgKzc4MSw0NCBAQAogCSptaW5vciA9IHVzZXItPmludGYtPnZlcnNpb25fbWlub3I7CiB9CiAKLXZvaWQgaXBtaV9zZXRfbXlfYWRkcmVzcyhpcG1pX3VzZXJfdCAgIHVzZXIsCi0JCQkgdW5zaWduZWQgY2hhciBhZGRyZXNzKQoraW50IGlwbWlfc2V0X215X2FkZHJlc3MoaXBtaV91c2VyX3QgICB1c2VyLAorCQkJdW5zaWduZWQgaW50ICBjaGFubmVsLAorCQkJdW5zaWduZWQgY2hhciBhZGRyZXNzKQogewotCXVzZXItPmludGYtPm15X2FkZHJlc3MgPSBhZGRyZXNzOworCWlmIChjaGFubmVsID49IElQTUlfTUFYX0NIQU5ORUxTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl1c2VyLT5pbnRmLT5jaGFubmVsc1tjaGFubmVsXS5hZGRyZXNzID0gYWRkcmVzczsKKwlyZXR1cm4gMDsKIH0KIAotdW5zaWduZWQgY2hhciBpcG1pX2dldF9teV9hZGRyZXNzKGlwbWlfdXNlcl90IHVzZXIpCitpbnQgaXBtaV9nZXRfbXlfYWRkcmVzcyhpcG1pX3VzZXJfdCAgIHVzZXIsCisJCQl1bnNpZ25lZCBpbnQgIGNoYW5uZWwsCisJCQl1bnNpZ25lZCBjaGFyICphZGRyZXNzKQogewotCXJldHVybiB1c2VyLT5pbnRmLT5teV9hZGRyZXNzOworCWlmIChjaGFubmVsID49IElQTUlfTUFYX0NIQU5ORUxTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqYWRkcmVzcyA9IHVzZXItPmludGYtPmNoYW5uZWxzW2NoYW5uZWxdLmFkZHJlc3M7CisJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaXBtaV9zZXRfbXlfTFVOKGlwbWlfdXNlcl90ICAgdXNlciwKLQkJICAgICB1bnNpZ25lZCBjaGFyIExVTikKK2ludCBpcG1pX3NldF9teV9MVU4oaXBtaV91c2VyX3QgICB1c2VyLAorCQkgICAgdW5zaWduZWQgaW50ICBjaGFubmVsLAorCQkgICAgdW5zaWduZWQgY2hhciBMVU4pCiB7Ci0JdXNlci0+aW50Zi0+bXlfbHVuID0gTFVOICYgMHgzOworCWlmIChjaGFubmVsID49IElQTUlfTUFYX0NIQU5ORUxTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl1c2VyLT5pbnRmLT5jaGFubmVsc1tjaGFubmVsXS5sdW4gPSBMVU4gJiAweDM7CisJcmV0dXJuIDA7CiB9CiAKLXVuc2lnbmVkIGNoYXIgaXBtaV9nZXRfbXlfTFVOKGlwbWlfdXNlcl90IHVzZXIpCitpbnQgaXBtaV9nZXRfbXlfTFVOKGlwbWlfdXNlcl90ICAgdXNlciwKKwkJICAgIHVuc2lnbmVkIGludCAgY2hhbm5lbCwKKwkJICAgIHVuc2lnbmVkIGNoYXIgKmFkZHJlc3MpCiB7Ci0JcmV0dXJuIHVzZXItPmludGYtPm15X2x1bjsKKwlpZiAoY2hhbm5lbCA+PSBJUE1JX01BWF9DSEFOTkVMUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJKmFkZHJlc3MgPSB1c2VyLT5pbnRmLT5jaGFubmVsc1tjaGFubmVsXS5sdW47CisJcmV0dXJuIDA7CiB9CiAKIGludCBpcG1pX3NldF9nZXRzX2V2ZW50cyhpcG1pX3VzZXJfdCB1c2VyLCBpbnQgdmFsKQpAQCAtODI4LDExICs4NjEsNiBAQAogCiAJcmVhZF9sb2NrKCYodXNlci0+aW50Zi0+dXNlcnNfbG9jaykpOwogCXdyaXRlX2xvY2tfaXJxc2F2ZSgmKHVzZXItPmludGYtPmNtZF9yY3ZyX2xvY2spLCBmbGFncyk7Ci0JaWYgKHVzZXItPmludGYtPmFsbF9jbWRfcmN2ciAhPSBOVUxMKSB7Ci0JCXJ2ID0gLUVCVVNZOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCiAJLyogTWFrZSBzdXJlIHRoZSBjb21tYW5kL25ldGZuIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQuICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjbXAsICYodXNlci0+aW50Zi0+Y21kX3JjdnJzKSwgbGluaykgewogCQlpZiAoKGNtcC0+bmV0Zm4gPT0gbmV0Zm4pICYmIChjbXAtPmNtZCA9PSBjbWQpKSB7CkBAIC04NDcsNyArODc1LDcgQEAKIAkJcmN2ci0+dXNlciA9IHVzZXI7CiAJCWxpc3RfYWRkX3RhaWwoJihyY3ZyLT5saW5rKSwgJih1c2VyLT5pbnRmLT5jbWRfcmN2cnMpKTsKIAl9Ci0gb3V0X3VubG9jazoKKwogCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCYodXNlci0+aW50Zi0+Y21kX3JjdnJfbG9jayksIGZsYWdzKTsKIAlyZWFkX3VubG9jaygmKHVzZXItPmludGYtPnVzZXJzX2xvY2spKTsKIApAQCAtMTIxMyw3ICsxMjQxLDcgQEAKIAkJdW5zaWduZWQgY2hhciAgICAgICAgIGlwbWJfc2VxOwogCQlsb25nICAgICAgICAgICAgICAgICAgc2VxaWQ7CiAKLQkJaWYgKGFkZHItPmNoYW5uZWwgPiBJUE1JX05VTV9DSEFOTkVMUykgeworCQlpZiAoYWRkci0+Y2hhbm5lbCA+PSBJUE1JX05VTV9DSEFOTkVMUykgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOwogCQkJaW50Zi0+c2VudF9pbnZhbGlkX2NvbW1hbmRzKys7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKQEAgLTEzMzEsNyArMTM1OSw3IEBACiAjaWZkZWYgREVCVUdfTVNHSU5HCiAJewogCQlpbnQgbTsKLQkJZm9yIChtPTA7IG08c21pX21zZy0+ZGF0YV9zaXplOyBtKyspCisJCWZvciAobSA9IDA7IG0gPCBzbWlfbXNnLT5kYXRhX3NpemU7IG0rKykKIAkJCXByaW50aygiICUyLjJ4Iiwgc21pX21zZy0+ZGF0YVttXSk7CiAJCXByaW50aygiXG4iKTsKIAl9CkBAIC0xMzQ2LDYgKzEzNzQsMTggQEAKIAlyZXR1cm4gcnY7CiB9CiAKK3N0YXRpYyBpbnQgY2hlY2tfYWRkcihpcG1pX3NtaV90ICAgICAgIGludGYsCisJCSAgICAgIHN0cnVjdCBpcG1pX2FkZHIgKmFkZHIsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgICAgKnNhZGRyLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICAgICpsdW4pCit7CisJaWYgKGFkZHItPmNoYW5uZWwgPj0gSVBNSV9NQVhfQ0hBTk5FTFMpCisJCXJldHVybiAtRUlOVkFMOworCSpsdW4gPSBpbnRmLT5jaGFubmVsc1thZGRyLT5jaGFubmVsXS5sdW47CisJKnNhZGRyID0gaW50Zi0+Y2hhbm5lbHNbYWRkci0+Y2hhbm5lbF0uYWRkcmVzczsKKwlyZXR1cm4gMDsKK30KKwogaW50IGlwbWlfcmVxdWVzdF9zZXR0aW1lKGlwbWlfdXNlcl90ICAgICAgdXNlciwKIAkJCSBzdHJ1Y3QgaXBtaV9hZGRyICphZGRyLAogCQkJIGxvbmcgICAgICAgICAgICAgbXNnaWQsCkBAIC0xMzU1LDYgKzEzOTUsMTQgQEAKIAkJCSBpbnQgICAgICAgICAgICAgIHJldHJpZXMsCiAJCQkgdW5zaWduZWQgaW50ICAgICByZXRyeV90aW1lX21zKQogeworCXVuc2lnbmVkIGNoYXIgc2FkZHIsIGx1bjsKKwlpbnQgICAgICAgICAgIHJ2OworCisJaWYgKCEgdXNlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcnYgPSBjaGVja19hZGRyKHVzZXItPmludGYsIGFkZHIsICZzYWRkciwgJmx1bik7CisJaWYgKHJ2KQorCQlyZXR1cm4gcnY7CiAJcmV0dXJuIGlfaXBtaV9yZXF1ZXN0KHVzZXIsCiAJCQkgICAgICB1c2VyLT5pbnRmLAogCQkJICAgICAgYWRkciwKQEAgLTEzNjMsOCArMTQxMSw4IEBACiAJCQkgICAgICB1c2VyX21zZ19kYXRhLAogCQkJICAgICAgTlVMTCwgTlVMTCwKIAkJCSAgICAgIHByaW9yaXR5LAotCQkJICAgICAgdXNlci0+aW50Zi0+bXlfYWRkcmVzcywKLQkJCSAgICAgIHVzZXItPmludGYtPm15X2x1biwKKwkJCSAgICAgIHNhZGRyLAorCQkJICAgICAgbHVuLAogCQkJICAgICAgcmV0cmllcywKIAkJCSAgICAgIHJldHJ5X3RpbWVfbXMpOwogfQpAQCAtMTM3OCw2ICsxNDI2LDE0IEBACiAJCQkgICAgIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICpzdXBwbGllZF9yZWN2LAogCQkJICAgICBpbnQgICAgICAgICAgICAgICAgICBwcmlvcml0eSkKIHsKKwl1bnNpZ25lZCBjaGFyIHNhZGRyLCBsdW47CisJaW50ICAgICAgICAgICBydjsKKworCWlmICghIHVzZXIpCisJCXJldHVybiAtRUlOVkFMOworCXJ2ID0gY2hlY2tfYWRkcih1c2VyLT5pbnRmLCBhZGRyLCAmc2FkZHIsICZsdW4pOworCWlmIChydikKKwkJcmV0dXJuIHJ2OwogCXJldHVybiBpX2lwbWlfcmVxdWVzdCh1c2VyLAogCQkJICAgICAgdXNlci0+aW50ZiwKIAkJCSAgICAgIGFkZHIsCkBAIC0xMzg3LDggKzE0NDMsOCBAQAogCQkJICAgICAgc3VwcGxpZWRfc21pLAogCQkJICAgICAgc3VwcGxpZWRfcmVjdiwKIAkJCSAgICAgIHByaW9yaXR5LAotCQkJICAgICAgdXNlci0+aW50Zi0+bXlfYWRkcmVzcywKLQkJCSAgICAgIHVzZXItPmludGYtPm15X2x1biwKKwkJCSAgICAgIHNhZGRyLAorCQkJICAgICAgbHVuLAogCQkJICAgICAgLTEsIDApOwogfQogCkBAIC0xMzk3LDggKzE0NTMsMTUgQEAKIHsKIAljaGFyICAgICAgICpvdXQgPSAoY2hhciAqKSBwYWdlOwogCWlwbWlfc21pX3QgaW50ZiA9IGRhdGE7CisJaW50ICAgICAgICBpOworCWludCAgICAgICAgcnY9IDA7CiAKLQlyZXR1cm4gc3ByaW50ZihvdXQsICIleFxuIiwgaW50Zi0+bXlfYWRkcmVzcyk7CisJZm9yIChpID0gMDsgaSA8IElQTUlfTUFYX0NIQU5ORUxTOyBpKyspCisJCXJ2ICs9IHNwcmludGYob3V0K3J2LCAiJXggIiwgaW50Zi0+Y2hhbm5lbHNbaV0uYWRkcmVzcyk7CisJb3V0W3J2LTFdID0gJ1xuJzsgLyogUmVwbGFjZSB0aGUgZmluYWwgc3BhY2Ugd2l0aCBhIG5ld2xpbmUgKi8KKwlvdXRbcnZdID0gJ1wwJzsKKwlydisrOworCXJldHVybiBydjsKIH0KIAogc3RhdGljIGludCB2ZXJzaW9uX2ZpbGVfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLApAQCAtMTU4OCwyOSArMTY1MSwzMCBAQAogCQkJICAgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJnNpLAogCQkJICAgICAgMCwKIAkJCSAgICAgICZtc2csCi0JCQkgICAgICBOVUxMLAorCQkJICAgICAgaW50ZiwKIAkJCSAgICAgIE5VTEwsCiAJCQkgICAgICBOVUxMLAogCQkJICAgICAgMCwKLQkJCSAgICAgIGludGYtPm15X2FkZHJlc3MsCi0JCQkgICAgICBpbnRmLT5teV9sdW4sCisJCQkgICAgICBpbnRmLT5jaGFubmVsc1swXS5hZGRyZXNzLAorCQkJICAgICAgaW50Zi0+Y2hhbm5lbHNbMF0ubHVuLAogCQkJICAgICAgLTEsIDApOwogfQogCiBzdGF0aWMgdm9pZAotY2hhbm5lbF9oYW5kbGVyKGlwbWlfc21pX3QgaW50Ziwgc3RydWN0IGlwbWlfc21pX21zZyAqbXNnKQorY2hhbm5lbF9oYW5kbGVyKGlwbWlfc21pX3QgaW50Ziwgc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZykKIHsKIAlpbnQgcnYgPSAwOwogCWludCBjaGFuOwogCi0JaWYgKChtc2ctPnJzcFswXSA9PSAoSVBNSV9ORVRGTl9BUFBfUkVTUE9OU0UgPDwgMikpCi0JICAgICYmIChtc2ctPnJzcFsxXSA9PSBJUE1JX0dFVF9DSEFOTkVMX0lORk9fQ01EKSkKKwlpZiAoKG1zZy0+YWRkci5hZGRyX3R5cGUgPT0gSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRSkKKwkgICAgJiYgKG1zZy0+bXNnLm5ldGZuID09IElQTUlfTkVURk5fQVBQX1JFU1BPTlNFKQorCSAgICAmJiAobXNnLT5tc2cuY21kID09IElQTUlfR0VUX0NIQU5ORUxfSU5GT19DTUQpKQogCXsKIAkJLyogSXQncyB0aGUgb25lIHdlIHdhbnQgKi8KLQkJaWYgKG1zZy0+cnNwWzJdICE9IDApIHsKKwkJaWYgKG1zZy0+bXNnLmRhdGFbMF0gIT0gMCkgewogCQkJLyogR290IGFuIGVycm9yIGZyb20gdGhlIGNoYW5uZWwsIGp1c3QgZ28gb24uICovCiAKLQkJCWlmIChtc2ctPnJzcFsyXSA9PSBJUE1JX0lOVkFMSURfQ09NTUFORF9FUlIpIHsKKwkJCWlmIChtc2ctPm1zZy5kYXRhWzBdID09IElQTUlfSU5WQUxJRF9DT01NQU5EX0VSUikgewogCQkJCS8qIElmIHRoZSBNQyBkb2VzIG5vdCBzdXBwb3J0IHRoaXMKIAkJCQkgICBjb21tYW5kLCB0aGF0IGlzIGxlZ2FsLiAgV2UganVzdAogCQkJCSAgIGFzc3VtZSBpdCBoYXMgb25lIElQTUIgYXQgY2hhbm5lbApAQCAtMTYyNywxMyArMTY5MSwxMyBAQAogCQkJfQogCQkJZ290byBuZXh0X2NoYW5uZWw7CiAJCX0KLQkJaWYgKG1zZy0+cnNwX3NpemUgPCA2KSB7CisJCWlmIChtc2ctPm1zZy5kYXRhX2xlbiA8IDQpIHsKIAkJCS8qIE1lc3NhZ2Ugbm90IGJpZyBlbm91Z2gsIGp1c3QgZ28gb24uICovCiAJCQlnb3RvIG5leHRfY2hhbm5lbDsKIAkJfQogCQljaGFuID0gaW50Zi0+Y3Vycl9jaGFubmVsOwotCQlpbnRmLT5jaGFubmVsc1tjaGFuXS5tZWRpdW0gPSBtc2ctPnJzcFs0XSAmIDB4N2Y7Ci0JCWludGYtPmNoYW5uZWxzW2NoYW5dLnByb3RvY29sID0gbXNnLT5yc3BbNV0gJiAweDFmOworCQlpbnRmLT5jaGFubmVsc1tjaGFuXS5tZWRpdW0gPSBtc2ctPm1zZy5kYXRhWzJdICYgMHg3ZjsKKwkJaW50Zi0+Y2hhbm5lbHNbY2hhbl0ucHJvdG9jb2wgPSBtc2ctPm1zZy5kYXRhWzNdICYgMHgxZjsKIAogCW5leHRfY2hhbm5lbDoKIAkJaW50Zi0+Y3Vycl9jaGFubmVsKys7CkBAIC0xNjkxLDIyICsxNzU1LDI0IEBACiAJcnYgPSAtRU5PTUVNOwogCiAJZG93bl93cml0ZSgmaW50ZXJmYWNlc19zZW0pOwotCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKIAkJaWYgKGlwbWlfaW50ZXJmYWNlc1tpXSA9PSBOVUxMKSB7CiAJCQluZXdfaW50Zi0+aW50Zl9udW0gPSBpOwogCQkJbmV3X2ludGYtPnZlcnNpb25fbWFqb3IgPSB2ZXJzaW9uX21ham9yOwogCQkJbmV3X2ludGYtPnZlcnNpb25fbWlub3IgPSB2ZXJzaW9uX21pbm9yOwotCQkJaWYgKHNsYXZlX2FkZHIgPT0gMCkKLQkJCQluZXdfaW50Zi0+bXlfYWRkcmVzcyA9IElQTUlfQk1DX1NMQVZFX0FERFI7Ci0JCQllbHNlCi0JCQkJbmV3X2ludGYtPm15X2FkZHJlc3MgPSBzbGF2ZV9hZGRyOwotCQkJbmV3X2ludGYtPm15X2x1biA9IDI7ICAvKiB0aGUgU01TIExVTi4gKi8KKwkJCWZvciAoaiA9IDA7IGogPCBJUE1JX01BWF9DSEFOTkVMUzsgaisrKSB7CisJCQkJbmV3X2ludGYtPmNoYW5uZWxzW2pdLmFkZHJlc3MKKwkJCQkJPSBJUE1JX0JNQ19TTEFWRV9BRERSOworCQkJCW5ld19pbnRmLT5jaGFubmVsc1tqXS5sdW4gPSAyOworCQkJfQorCQkJaWYgKHNsYXZlX2FkZHIgIT0gMCkKKwkJCQluZXdfaW50Zi0+Y2hhbm5lbHNbMF0uYWRkcmVzcyA9IHNsYXZlX2FkZHI7CiAJCQlyd2xvY2tfaW5pdCgmKG5ld19pbnRmLT51c2Vyc19sb2NrKSk7CiAJCQlJTklUX0xJU1RfSEVBRCgmKG5ld19pbnRmLT51c2VycykpOwogCQkJbmV3X2ludGYtPmhhbmRsZXJzID0gaGFuZGxlcnM7CiAJCQluZXdfaW50Zi0+c2VuZF9pbmZvID0gc2VuZF9pbmZvOwogCQkJc3Bpbl9sb2NrX2luaXQoJihuZXdfaW50Zi0+c2VxX2xvY2spKTsKLQkJCWZvciAoaj0wOyBqPElQTUlfSVBNQl9OVU1fU0VROyBqKyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCBJUE1JX0lQTUJfTlVNX1NFUTsgaisrKSB7CiAJCQkJbmV3X2ludGYtPnNlcV90YWJsZVtqXS5pbnVzZSA9IDA7CiAJCQkJbmV3X2ludGYtPnNlcV90YWJsZVtqXS5zZXFpZCA9IDA7CiAJCQl9CkBAIC0xNzIyLDcgKzE3ODgsNiBAQAogCQkJcndsb2NrX2luaXQoJihuZXdfaW50Zi0+Y21kX3JjdnJfbG9jaykpOwogCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmbmV3X2ludGYtPndhaXRxKTsKIAkJCUlOSVRfTElTVF9IRUFEKCYobmV3X2ludGYtPmNtZF9yY3ZycykpOwotCQkJbmV3X2ludGYtPmFsbF9jbWRfcmN2ciA9IE5VTEw7CiAKIAkJCXNwaW5fbG9ja19pbml0KCYobmV3X2ludGYtPmNvdW50ZXJfbG9jaykpOwogCkBAIC0xODE0LDcgKzE4NzksNyBAQAogCWZyZWVfcmVjdl9tc2dfbGlzdCgmKGludGYtPndhaXRpbmdfZXZlbnRzKSk7CiAJZnJlZV9jbWRfcmN2cl9saXN0KCYoaW50Zi0+Y21kX3JjdnJzKSk7CiAKLQlmb3IgKGk9MDsgaTxJUE1JX0lQTUJfTlVNX1NFUTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IElQTUlfSVBNQl9OVU1fU0VROyBpKyspIHsKIAkJaWYgKChpbnRmLT5zZXFfdGFibGVbaV0uaW51c2UpCiAJCSAgICAmJiAoaW50Zi0+c2VxX3RhYmxlW2ldLnJlY3ZfbXNnKSkKIAkJewpAQCAtMTgzMyw3ICsxODk4LDcgQEAKIAlkb3duX3dyaXRlKCZpbnRlcmZhY2VzX3NlbSk7CiAJaWYgKGxpc3RfZW1wdHkoJihpbnRmLT51c2VycykpKQogCXsKLQkJZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKIAkJCWlmIChpcG1pX2ludGVyZmFjZXNbaV0gPT0gaW50ZikgewogCQkJCXJlbW92ZV9wcm9jX2VudHJpZXMoaW50Zik7CiAJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVyZmFjZXNfbG9jaywgZmxhZ3MpOwpAQCAtMTk2MCwxNSArMjAyNSwxMSBAQAogCiAJcmVhZF9sb2NrKCYoaW50Zi0+Y21kX3JjdnJfbG9jaykpOwogCQotCWlmIChpbnRmLT5hbGxfY21kX3JjdnIpIHsKLQkJdXNlciA9IGludGYtPmFsbF9jbWRfcmN2cjsKLQl9IGVsc2UgewotCQkvKiBGaW5kIHRoZSBjb21tYW5kL25ldGZuLiAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJjdnIsICYoaW50Zi0+Y21kX3JjdnJzKSwgbGluaykgewotCQkJaWYgKChyY3ZyLT5uZXRmbiA9PSBuZXRmbikgJiYgKHJjdnItPmNtZCA9PSBjbWQpKSB7Ci0JCQkJdXNlciA9IHJjdnItPnVzZXI7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJLyogRmluZCB0aGUgY29tbWFuZC9uZXRmbi4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJjdnIsICYoaW50Zi0+Y21kX3JjdnJzKSwgbGluaykgeworCQlpZiAoKHJjdnItPm5ldGZuID09IG5ldGZuKSAmJiAocmN2ci0+Y21kID09IGNtZCkpIHsKKwkJCXVzZXIgPSByY3ZyLT51c2VyOworCQkJYnJlYWs7CiAJCX0KIAl9CiAJcmVhZF91bmxvY2soJihpbnRmLT5jbWRfcmN2cl9sb2NrKSk7CkBAIC0xOTg1LDcgKzIwNDYsNyBAQAogCQltc2ctPmRhdGFbM10gPSBtc2ctPnJzcFs2XTsKICAgICAgICAgICAgICAgICBtc2ctPmRhdGFbNF0gPSAoKG5ldGZuICsgMSkgPDwgMikgfCAobXNnLT5yc3BbN10gJiAweDMpOwogCQltc2ctPmRhdGFbNV0gPSBpcG1iX2NoZWNrc3VtKCYobXNnLT5kYXRhWzNdKSwgMik7Ci0JCW1zZy0+ZGF0YVs2XSA9IGludGYtPm15X2FkZHJlc3M7CisJCW1zZy0+ZGF0YVs2XSA9IGludGYtPmNoYW5uZWxzW21zZy0+cnNwWzNdICYgMHhmXS5hZGRyZXNzOwogICAgICAgICAgICAgICAgIC8qIHJxc2VxL2x1biAqLwogICAgICAgICAgICAgICAgIG1zZy0+ZGF0YVs3XSA9IChtc2ctPnJzcFs3XSAmIDB4ZmMpIHwgKG1zZy0+cnNwWzRdICYgMHgzKTsKIAkJbXNnLT5kYXRhWzhdID0gbXNnLT5yc3BbOF07IC8qIGNtZCAqLwpAQCAtMTk5Nyw3ICsyMDU4LDcgQEAKIAl7CiAJCWludCBtOwogCQlwcmludGsoIkludmFsaWQgY29tbWFuZDoiKTsKLQkJZm9yIChtPTA7IG08bXNnLT5kYXRhX3NpemU7IG0rKykKKwkJZm9yIChtID0gMDsgbSA8IG1zZy0+ZGF0YV9zaXplOyBtKyspCiAJCQlwcmludGsoIiAlMi4yeCIsIG1zZy0+ZGF0YVttXSk7CiAJCXByaW50aygiXG4iKTsKIAl9CkBAIC0yMTQ1LDE1ICsyMjA2LDExIEBACiAKIAlyZWFkX2xvY2soJihpbnRmLT5jbWRfcmN2cl9sb2NrKSk7CiAKLQlpZiAoaW50Zi0+YWxsX2NtZF9yY3ZyKSB7Ci0JCXVzZXIgPSBpbnRmLT5hbGxfY21kX3JjdnI7Ci0JfSBlbHNlIHsKLQkJLyogRmluZCB0aGUgY29tbWFuZC9uZXRmbi4gKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShyY3ZyLCAmKGludGYtPmNtZF9yY3ZycyksIGxpbmspIHsKLQkJCWlmICgocmN2ci0+bmV0Zm4gPT0gbmV0Zm4pICYmIChyY3ZyLT5jbWQgPT0gY21kKSkgewotCQkJCXVzZXIgPSByY3ZyLT51c2VyOwotCQkJCWJyZWFrOwotCQkJfQorCS8qIEZpbmQgdGhlIGNvbW1hbmQvbmV0Zm4uICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyY3ZyLCAmKGludGYtPmNtZF9yY3ZycyksIGxpbmspIHsKKwkJaWYgKChyY3ZyLT5uZXRmbiA9PSBuZXRmbikgJiYgKHJjdnItPmNtZCA9PSBjbWQpKSB7CisJCQl1c2VyID0gcmN2ci0+dXNlcjsKKwkJCWJyZWFrOwogCQl9CiAJfQogCXJlYWRfdW5sb2NrKCYoaW50Zi0+Y21kX3JjdnJfbG9jaykpOwpAQCAtMjMzMCw2ICsyMzg3LDE0IEBACiAJdW5zaWduZWQgbG9uZyAgICAgICAgZmxhZ3M7CiAKIAlyZWN2X21zZyA9IChzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqKSBtc2ctPnVzZXJfZGF0YTsKKwlpZiAocmVjdl9tc2cgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkciSVBNSSBtZXNzYWdlIHJlY2VpdmVkIHdpdGggbm8gb3duZXIuIFRoaXNcbiIKKwkJCSJjb3VsZCBiZSBiZWNhdXNlIG9mIGEgbWFsZm9ybWVkIG1lc3NhZ2UsIG9yXG4iCisJCQkiYmVjYXVzZSBvZiBhIGhhcmR3YXJlIGVycm9yLiAgQ29udGFjdCB5b3VyXG4iCisJCQkiaGFyZHdhcmUgdmVuZGVyIGZvciBhc3Npc3RhbmNlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJLyogTWFrZSBzdXJlIHRoZSB1c2VyIHN0aWxsIGV4aXN0cy4gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVzZXIsICYoaW50Zi0+dXNlcnMpLCBsaW5rKSB7CkBAIC0yMzQwLDE5ICsyNDA1LDExIEBACiAJCX0KIAl9CiAKLQlpZiAoIWZvdW5kKSB7Ci0JCS8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIE5VTEwgdXNlcnMuICovCi0JCWlmICghcmVjdl9tc2ctPnVzZXIgJiYgaW50Zi0+bnVsbF91c2VyX2hhbmRsZXIpewotCQkJaW50Zi0+bnVsbF91c2VyX2hhbmRsZXIoaW50ZiwgbXNnKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKLQkJCWludGYtPmhhbmRsZWRfbG9jYWxfcmVzcG9uc2VzKys7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKLQkJfWVsc2V7Ci0JCQkvKiBUaGUgdXNlciBmb3IgdGhlIG1lc3NhZ2Ugd2VudCBhd2F5LCBzbyBnaXZlIHVwLiAqLwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOwotCQkJaW50Zi0+dW5oYW5kbGVkX2xvY2FsX3Jlc3BvbnNlcysrOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7Ci0JCX0KKwlpZiAoKCEgZm91bmQpICYmIHJlY3ZfbXNnLT51c2VyKSB7CisJCS8qIFRoZSB1c2VyIGZvciB0aGUgbWVzc2FnZSB3ZW50IGF3YXksIHNvIGdpdmUgdXAuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJaW50Zi0+dW5oYW5kbGVkX2xvY2FsX3Jlc3BvbnNlcysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKIAkJaXBtaV9mcmVlX3JlY3ZfbXNnKHJlY3ZfbXNnKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgKnNtaV9hZGRyOwpAQCAtMjM5Miw3ICsyNDQ5LDcgQEAKICNpZmRlZiBERUJVR19NU0dJTkcKIAlpbnQgbTsKIAlwcmludGsoIlJlY3Y6Iik7Ci0JZm9yIChtPTA7IG08bXNnLT5yc3Bfc2l6ZTsgbSsrKQorCWZvciAobSA9IDA7IG0gPCBtc2ctPnJzcF9zaXplOyBtKyspCiAJCXByaW50aygiICUyLjJ4IiwgbXNnLT5yc3BbbV0pOwogCXByaW50aygiXG4iKTsKICNlbmRpZgpAQCAtMjYyNiw3ICsyNjgzLDcgQEAKIAl7CiAJCWludCBtOwogCQlwcmludGsoIlJlc2VuZDogIik7Ci0JCWZvciAobT0wOyBtPHNtaV9tc2ctPmRhdGFfc2l6ZTsgbSsrKQorCQlmb3IgKG0gPSAwOyBtIDwgc21pX21zZy0+ZGF0YV9zaXplOyBtKyspCiAJCQlwcmludGsoIiAlMi4yeCIsIHNtaV9tc2ctPmRhdGFbbV0pOwogCQlwcmludGsoIlxuIik7CiAJfQpAQCAtMjY0Nyw3ICsyNzA0LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmdGltZW91dHMpOwogCiAJc3Bpbl9sb2NrKCZpbnRlcmZhY2VzX2xvY2spOwotCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKIAkJaW50ZiA9IGlwbWlfaW50ZXJmYWNlc1tpXTsKIAkJaWYgKGludGYgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwpAQCAtMjY3Miw3ICsyNzI5LDcgQEAKIAkJICAgaGF2ZSB0aW1lZCBvdXQsIHB1dHRpbmcgdGhlbSBpbiB0aGUgdGltZW91dHMKIAkJICAgbGlzdC4gKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJihpbnRmLT5zZXFfbG9jayksIGZsYWdzKTsKLQkJZm9yIChqPTA7IGo8SVBNSV9JUE1CX05VTV9TRVE7IGorKykgeworCQlmb3IgKGogPSAwOyBqIDwgSVBNSV9JUE1CX05VTV9TRVE7IGorKykgewogCQkJc3RydWN0IHNlcV90YWJsZSAqZW50ID0gJihpbnRmLT5zZXFfdGFibGVbal0pOwogCQkJaWYgKCFlbnQtPmludXNlKQogCQkJCWNvbnRpbnVlOwpAQCAtMjcxMiw3ICsyNzY5LDcgQEAKIAkJCQlzcGluX3VubG9jaygmaW50Zi0+Y291bnRlcl9sb2NrKTsKIAkJCQlzbWlfbXNnID0gc21pX2Zyb21fcmVjdl9tc2coaW50ZiwKIAkJCQkJCWVudC0+cmVjdl9tc2csIGosIGVudC0+c2VxaWQpOwotCQkJCWlmKCFzbWlfbXNnKQorCQkJCWlmICghIHNtaV9tc2cpCiAJCQkJCWNvbnRpbnVlOwogCiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGludGYtPnNlcV9sb2NrKSxmbGFncyk7CkBAIC0yNzQzLDcgKzI4MDAsNyBAQAogCWludCAgICAgICAgaTsKIAogCXNwaW5fbG9jaygmaW50ZXJmYWNlc19sb2NrKTsKLQlmb3IgKGk9MDsgaTxNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CiAJCWludGYgPSBpcG1pX2ludGVyZmFjZXNbaV07CiAJCWlmIChpbnRmID09IE5VTEwpCiAJCQljb250aW51ZTsKQEAgLTI4MzgsMjggKzI4OTUsMzAgQEAKIH0KIAogI2lmZGVmIENPTkZJR19JUE1JX1BBTklDX1NUUklORwotc3RhdGljIHZvaWQgZXZlbnRfcmVjZWl2ZXJfZmV0Y2hlcihpcG1pX3NtaV90IGludGYsIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZykKK3N0YXRpYyB2b2lkIGV2ZW50X3JlY2VpdmVyX2ZldGNoZXIoaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnKQogewotCWlmICgobXNnLT5yc3BbMF0gPT0gKElQTUlfTkVURk5fU0VOU09SX0VWRU5UX1JFU1BPTlNFIDw8IDIpKQotCSAgICAmJiAobXNnLT5yc3BbMV0gPT0gSVBNSV9HRVRfRVZFTlRfUkVDRUlWRVJfQ01EKQotCSAgICAmJiAobXNnLT5yc3BbMl0gPT0gSVBNSV9DQ19OT19FUlJPUikpCisJaWYgKChtc2ctPmFkZHIuYWRkcl90eXBlID09IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEUpCisJICAgICYmIChtc2ctPm1zZy5uZXRmbiA9PSBJUE1JX05FVEZOX1NFTlNPUl9FVkVOVF9SRVNQT05TRSkKKwkgICAgJiYgKG1zZy0+bXNnLmNtZCA9PSBJUE1JX0dFVF9FVkVOVF9SRUNFSVZFUl9DTUQpCisJICAgICYmIChtc2ctPm1zZy5kYXRhWzBdID09IElQTUlfQ0NfTk9fRVJST1IpKQogCXsKIAkJLyogQSBnZXQgZXZlbnQgcmVjZWl2ZXIgY29tbWFuZCwgc2F2ZSBpdC4gKi8KLQkJaW50Zi0+ZXZlbnRfcmVjZWl2ZXIgPSBtc2ctPnJzcFszXTsKLQkJaW50Zi0+ZXZlbnRfcmVjZWl2ZXJfbHVuID0gbXNnLT5yc3BbNF0gJiAweDM7CisJCWludGYtPmV2ZW50X3JlY2VpdmVyID0gbXNnLT5tc2cuZGF0YVsxXTsKKwkJaW50Zi0+ZXZlbnRfcmVjZWl2ZXJfbHVuID0gbXNnLT5tc2cuZGF0YVsyXSAmIDB4MzsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGRldmljZV9pZF9mZXRjaGVyKGlwbWlfc21pX3QgaW50Ziwgc3RydWN0IGlwbWlfc21pX21zZyAqbXNnKQorc3RhdGljIHZvaWQgZGV2aWNlX2lkX2ZldGNoZXIoaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnKQogewotCWlmICgobXNnLT5yc3BbMF0gPT0gKElQTUlfTkVURk5fQVBQX1JFU1BPTlNFIDw8IDIpKQotCSAgICAmJiAobXNnLT5yc3BbMV0gPT0gSVBNSV9HRVRfREVWSUNFX0lEX0NNRCkKLQkgICAgJiYgKG1zZy0+cnNwWzJdID09IElQTUlfQ0NfTk9fRVJST1IpKQorCWlmICgobXNnLT5hZGRyLmFkZHJfdHlwZSA9PSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFKQorCSAgICAmJiAobXNnLT5tc2cubmV0Zm4gPT0gSVBNSV9ORVRGTl9BUFBfUkVTUE9OU0UpCisJICAgICYmIChtc2ctPm1zZy5jbWQgPT0gSVBNSV9HRVRfREVWSUNFX0lEX0NNRCkKKwkgICAgJiYgKG1zZy0+bXNnLmRhdGFbMF0gPT0gSVBNSV9DQ19OT19FUlJPUikpCiAJewogCQkvKiBBIGdldCBkZXZpY2UgaWQgY29tbWFuZCwgc2F2ZSBpZiB3ZSBhcmUgYW4gZXZlbnQKIAkJICAgcmVjZWl2ZXIgb3IgZ2VuZXJhdG9yLiAqLwotCQlpbnRmLT5sb2NhbF9zZWxfZGV2aWNlID0gKG1zZy0+cnNwWzhdID4+IDIpICYgMTsKLQkJaW50Zi0+bG9jYWxfZXZlbnRfZ2VuZXJhdG9yID0gKG1zZy0+cnNwWzhdID4+IDUpICYgMTsKKwkJaW50Zi0+bG9jYWxfc2VsX2RldmljZSA9IChtc2ctPm1zZy5kYXRhWzZdID4+IDIpICYgMTsKKwkJaW50Zi0+bG9jYWxfZXZlbnRfZ2VuZXJhdG9yID0gKG1zZy0+bXNnLmRhdGFbNl0gPj4gNSkgJiAxOwogCX0KIH0KICNlbmRpZgpAQCAtMjkwMyw3ICsyOTYyLDcgQEAKIAlyZWN2X21zZy5kb25lID0gZHVtbXlfcmVjdl9kb25lX2hhbmRsZXI7CiAKIAkvKiBGb3IgZXZlcnkgcmVnaXN0ZXJlZCBpbnRlcmZhY2UsIHNlbmQgdGhlIGV2ZW50LiAqLwotCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKIAkJaW50ZiA9IGlwbWlfaW50ZXJmYWNlc1tpXTsKIAkJaWYgKGludGYgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwpAQCAtMjkxNSwxMiArMjk3NCwxMiBAQAogCQkJICAgICAgICZhZGRyLAogCQkJICAgICAgIDAsCiAJCQkgICAgICAgJm1zZywKLQkJCSAgICAgICBOVUxMLAorCQkJICAgICAgIGludGYsCiAJCQkgICAgICAgJnNtaV9tc2csCiAJCQkgICAgICAgJnJlY3ZfbXNnLAogCQkJICAgICAgIDAsCi0JCQkgICAgICAgaW50Zi0+bXlfYWRkcmVzcywKLQkJCSAgICAgICBpbnRmLT5teV9sdW4sCisJCQkgICAgICAgaW50Zi0+Y2hhbm5lbHNbMF0uYWRkcmVzcywKKwkJCSAgICAgICBpbnRmLT5jaGFubmVsc1swXS5sdW4sCiAJCQkgICAgICAgMCwgMSk7IC8qIERvbid0IHJldHJ5LCBhbmQgZG9uJ3Qgd2FpdC4gKi8KIAl9CiAKQEAgLTI5MzAsNyArMjk4OSw3IEBACiAJaWYgKCFzdHIpIAogCQlyZXR1cm47CiAKLQlmb3IgKGk9MDsgaTxNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CiAJCWNoYXIgICAgICAgICAgICAgICAgICAqcCA9IHN0cjsKIAkJc3RydWN0IGlwbWlfaXBtYl9hZGRyICppcG1iOwogCQlpbnQgICAgICAgICAgICAgICAgICAgajsKQEAgLTI5NjEsMTIgKzMwMjAsMTIgQEAKIAkJCSAgICAgICAmYWRkciwKIAkJCSAgICAgICAwLAogCQkJICAgICAgICZtc2csCi0JCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICBpbnRmLAogCQkJICAgICAgICZzbWlfbXNnLAogCQkJICAgICAgICZyZWN2X21zZywKIAkJCSAgICAgICAwLAotCQkJICAgICAgIGludGYtPm15X2FkZHJlc3MsCi0JCQkgICAgICAgaW50Zi0+bXlfbHVuLAorCQkJICAgICAgIGludGYtPmNoYW5uZWxzWzBdLmFkZHJlc3MsCisJCQkgICAgICAgaW50Zi0+Y2hhbm5lbHNbMF0ubHVuLAogCQkJICAgICAgIDAsIDEpOyAvKiBEb24ndCByZXRyeSwgYW5kIGRvbid0IHdhaXQuICovCiAKIAkJaWYgKGludGYtPmxvY2FsX2V2ZW50X2dlbmVyYXRvcikgewpAQCAtMjk4MSwxMiArMzA0MCwxMiBAQAogCQkJCSAgICAgICAmYWRkciwKIAkJCQkgICAgICAgMCwKIAkJCQkgICAgICAgJm1zZywKLQkJCQkgICAgICAgTlVMTCwKKwkJCQkgICAgICAgaW50ZiwKIAkJCQkgICAgICAgJnNtaV9tc2csCiAJCQkJICAgICAgICZyZWN2X21zZywKIAkJCQkgICAgICAgMCwKLQkJCQkgICAgICAgaW50Zi0+bXlfYWRkcmVzcywKLQkJCQkgICAgICAgaW50Zi0+bXlfbHVuLAorCQkJCSAgICAgICBpbnRmLT5jaGFubmVsc1swXS5hZGRyZXNzLAorCQkJCSAgICAgICBpbnRmLT5jaGFubmVsc1swXS5sdW4sCiAJCQkJICAgICAgIDAsIDEpOyAvKiBubyByZXRyeSwgYW5kIG5vIHdhaXQuICovCiAJCX0KIAkJaW50Zi0+bnVsbF91c2VyX2hhbmRsZXIgPSBOVUxMOwpAQCAtMjk5Niw3ICszMDU1LDcgQEAKIAkJICAgYmUgemVybywgYW5kIGl0IG11c3Qgbm90IGJlIG15IGFkZHJlc3MuICovCiAgICAgICAgICAgICAgICAgaWYgKCgoaW50Zi0+ZXZlbnRfcmVjZWl2ZXIgJiAxKSA9PSAwKQogCQkgICAgJiYgKGludGYtPmV2ZW50X3JlY2VpdmVyICE9IDApCi0JCSAgICAmJiAoaW50Zi0+ZXZlbnRfcmVjZWl2ZXIgIT0gaW50Zi0+bXlfYWRkcmVzcykpCisJCSAgICAmJiAoaW50Zi0+ZXZlbnRfcmVjZWl2ZXIgIT0gaW50Zi0+Y2hhbm5lbHNbMF0uYWRkcmVzcykpCiAJCXsKIAkJCS8qIFRoZSBldmVudCByZWNlaXZlciBpcyB2YWxpZCwgc2VuZCBhbiBJUE1CCiAJCQkgICBtZXNzYWdlLiAqLwpAQCAtMzAzMSw3ICszMDkwLDcgQEAKIAkJCWRhdGFbMF0gPSAwOwogCQkJZGF0YVsxXSA9IDA7CiAJCQlkYXRhWzJdID0gMHhmMDsgLyogT0VNIGV2ZW50IHdpdGhvdXQgdGltZXN0YW1wLiAqLwotCQkJZGF0YVszXSA9IGludGYtPm15X2FkZHJlc3M7CisJCQlkYXRhWzNdID0gaW50Zi0+Y2hhbm5lbHNbMF0uYWRkcmVzczsKIAkJCWRhdGFbNF0gPSBqKys7IC8qIHNlcXVlbmNlICMgKi8KIAkJCS8qIEFsd2F5cyBnaXZlIDExIGJ5dGVzLCBzbyBzdHJuY3B5IHdpbGwgZmlsbAogCQkJICAgaXQgd2l0aCB6ZXJvZXMgZm9yIG1lLiAqLwpAQCAtMzA0MywxMiArMzEwMiwxMiBAQAogCQkJCSAgICAgICAmYWRkciwKIAkJCQkgICAgICAgMCwKIAkJCQkgICAgICAgJm1zZywKLQkJCQkgICAgICAgTlVMTCwKKwkJCQkgICAgICAgaW50ZiwKIAkJCQkgICAgICAgJnNtaV9tc2csCiAJCQkJICAgICAgICZyZWN2X21zZywKIAkJCQkgICAgICAgMCwKLQkJCQkgICAgICAgaW50Zi0+bXlfYWRkcmVzcywKLQkJCQkgICAgICAgaW50Zi0+bXlfbHVuLAorCQkJCSAgICAgICBpbnRmLT5jaGFubmVsc1swXS5hZGRyZXNzLAorCQkJCSAgICAgICBpbnRmLT5jaGFubmVsc1swXS5sdW4sCiAJCQkJICAgICAgIDAsIDEpOyAvKiBubyByZXRyeSwgYW5kIG5vIHdhaXQuICovCiAJCX0KIAl9CQpAQCAtMzA3MCw3ICszMTI5LDcgQEAKIAloYXNfcGFuaWNlZCA9IDE7CiAKIAkvKiBGb3IgZXZlcnkgcmVnaXN0ZXJlZCBpbnRlcmZhY2UsIHNldCBpdCB0byBydW4gdG8gY29tcGxldGlvbi4gKi8KLQlmb3IgKGk9MDsgaTxNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CiAJCWludGYgPSBpcG1pX2ludGVyZmFjZXNbaV07CiAJCWlmIChpbnRmID09IE5VTEwpCiAJCQljb250aW51ZTsKQEAgLTMwOTksOSArMzE1OCw5IEBACiAJCXJldHVybiAwOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiaXBtaSBtZXNzYWdlIGhhbmRsZXIgdmVyc2lvbiAiCi0JICAgICAgIElQTUlfTVNHSEFORExFUl9WRVJTSU9OICJcbiIpOworCSAgICAgICBJUE1JX0RSSVZFUl9WRVJTSU9OICJcbiIpOwogCi0JZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgewogCQlpcG1pX2ludGVyZmFjZXNbaV0gPSBOVUxMOwogCX0KIApAQCAtMzE3MSw2ICszMjMwLDkgQEAKIAogbW9kdWxlX2luaXQoaXBtaV9pbml0X21zZ2hhbmRsZXJfbW9kKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkNvcmV5IE1pbnlhcmQgPG1pbnlhcmRAbXZpc3RhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW5jb21pbmcgYW5kIG91dGdvaW5nIG1lc3NhZ2Ugcm91dGluZyBmb3IgYW4gSVBNSSBpbnRlcmZhY2UuIik7CitNT0RVTEVfVkVSU0lPTihJUE1JX0RSSVZFUl9WRVJTSU9OKTsKIAogRVhQT1JUX1NZTUJPTChpcG1pX2NyZWF0ZV91c2VyKTsKIEVYUE9SVF9TWU1CT0woaXBtaV9kZXN0cm95X3VzZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCmluZGV4IGY5NTFjMzAuLmU4MmE5NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJvZmYuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMKQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcG1pX3NtaS5oPgogCiAjZGVmaW5lIFBGWCAiSVBNSSBwb3dlcm9mZjogIgotI2RlZmluZSBJUE1JX1BPV0VST0ZGX1ZFUlNJT04JInYzMyIKIAogLyogV2hlcmUgdG8gd2UgaW5zZXJ0IG91ciBwb3dlcm9mZiBmdW5jdGlvbj8gKi8KIGV4dGVybiB2b2lkICgqcG1fcG93ZXJfb2ZmKSh2b2lkKTsKQEAgLTUzLDE2ICs1MiwxNyBAQAogI2RlZmluZSBJUE1JX0NIQVNTSVNfUE9XRVJfQ1lDTEUJMHgwMgkvKiBwb3dlciBjeWNsZSAqLwogCiAvKiB0aGUgSVBNSSBkYXRhIGNvbW1hbmQgKi8KLXN0YXRpYyBpbnQgcG93ZXJvZmZfY29udHJvbCA9IElQTUlfQ0hBU1NJU19QT1dFUl9ET1dOOworc3RhdGljIGludCBwb3dlcm9mZl9wb3dlcmN5Y2xlOwogCiAvKiBwYXJhbWV0ZXIgZGVmaW5pdGlvbiB0byBhbGxvdyB1c2VyIHRvIGZsYWcgcG93ZXIgY3ljbGUgKi8KLW1vZHVsZV9wYXJhbShwb3dlcm9mZl9jb250cm9sLCBpbnQsIElQTUlfQ0hBU1NJU19QT1dFUl9ET1dOKTsKLU1PRFVMRV9QQVJNX0RFU0MocG93ZXJvZmZfY29udHJvbCwgIiBTZXQgdG8gMiB0byBlbmFibGUgcG93ZXIgY3ljbGUgaW5zdGVhZCBvZiBwb3dlciBkb3duLiBQb3dlciBjeWNsZSBpcyBjb250aW5nZW50IG9uIGhhcmR3YXJlIHN1cHBvcnQsIG90aGVyd2lzZSBpdCBkZWZhdWx0cyBiYWNrIHRvIHBvd2VyIGRvd24uIik7Cittb2R1bGVfcGFyYW0ocG93ZXJvZmZfcG93ZXJjeWNsZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG93ZXJvZmZfcG93ZXJjeWNsZXMsICIgU2V0IHRvIG5vbi16ZXJvIHRvIGVuYWJsZSBwb3dlciBjeWNsZSBpbnN0ZWFkIG9mIHBvd2VyIGRvd24uIFBvd2VyIGN5Y2xlIGlzIGNvbnRpbmdlbnQgb24gaGFyZHdhcmUgc3VwcG9ydCwgb3RoZXJ3aXNlIGl0IGRlZmF1bHRzIGJhY2sgdG8gcG93ZXIgZG93bi4iKTsKIAogLyogU3R1ZmYgZnJvbSB0aGUgZ2V0IGRldmljZSBpZCBjb21tYW5kLiAqLwogc3RhdGljIHVuc2lnbmVkIGludCBtZmdfaWQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IHByb2RfaWQ7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBjYXBhYmlsaXRpZXM7CitzdGF0aWMgdW5zaWduZWQgY2hhciBpcG1pX3ZlcnNpb247CiAKIC8qIFdlIHVzZSBvdXIgb3duIG1lc3NhZ2VzIGZvciB0aGlzIG9wZXJhdGlvbiwgd2UgZG9uJ3QgbGV0IHRoZSBzeXN0ZW0KICAgIGFsbG9jYXRlIHRoZW0sIHNpbmNlIHdlIG1heSBiZSBpbiBhIHBhbmljIHNpdHVhdGlvbi4gIFRoZSB3aG9sZQpAQCAtMzM4LDYgKzMzOCwyNSBAQAogfQogCiAvKgorICogaXBtaV9kZWxsX2NoYXNzaXNfZGV0ZWN0KCkKKyAqIERlbGwgc3lzdGVtcyB3aXRoIElQTUkgPCAxLjUgZG9uJ3Qgc2V0IHRoZSBjaGFzc2lzIGNhcGFiaWxpdHkgYml0CisgKiBidXQgdGhleSBjYW4gaGFuZGxlIGEgY2hhc3NpcyBwb3dlcm9mZiBvciBwb3dlcmN5Y2xlIGNvbW1hbmQuCisgKi8KKworI2RlZmluZSBERUxMX0lBTkFfTUZSX0lEIHsweEEyLCAweDAyLCAweDAwfQorc3RhdGljIGludCBpcG1pX2RlbGxfY2hhc3Npc19kZXRlY3QgKGlwbWlfdXNlcl90IHVzZXIpCit7CisJY29uc3QgY2hhciBpcG1pX3ZlcnNpb25fbWFqb3IgPSBpcG1pX3ZlcnNpb24gJiAweEY7CisJY29uc3QgY2hhciBpcG1pX3ZlcnNpb25fbWlub3IgPSAoaXBtaV92ZXJzaW9uID4+IDQpICYgMHhGOworCWNvbnN0IGNoYXIgbWZyWzNdPURFTExfSUFOQV9NRlJfSUQ7CisJaWYgKCFtZW1jbXAobWZyLCAmbWZnX2lkLCBzaXplb2YobWZyKSkgJiYKKwkgICAgaXBtaV92ZXJzaW9uX21ham9yIDw9IDEgJiYKKwkgICAgaXBtaV92ZXJzaW9uX21pbm9yIDwgNSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBTdGFuZGFyZCBjaGFzc2lzIHN1cHBvcnQKICAqLwogCkBAIC0zNjYsMzcgKzM4NSwzNCBAQAogCiAgcG93ZXJjeWNsZWZhaWxlZDoKIAlwcmludGsoS0VSTl9JTkZPIFBGWCAiUG93ZXJpbmcgJXMgdmlhIElQTUkgY2hhc3NpcyBjb250cm9sIGNvbW1hbmRcbiIsCi0JCSgocG93ZXJvZmZfY29udHJvbCAhPSBJUE1JX0NIQVNTSVNfUE9XRVJfQ1lDTEUpID8gImRvd24iIDogImN5Y2xlIikpOworCQkocG93ZXJvZmZfcG93ZXJjeWNsZSA/ICJjeWNsZSIgOiAiZG93biIpKTsKIAogCS8qCiAJICogUG93ZXIgZG93bgogCSAqLwogCXNlbmRfbXNnLm5ldGZuID0gSVBNSV9ORVRGTl9DSEFTU0lTX1JFUVVFU1Q7CiAJc2VuZF9tc2cuY21kID0gSVBNSV9DSEFTU0lTX0NPTlRST0xfQ01EOwotCWRhdGFbMF0gPSBwb3dlcm9mZl9jb250cm9sOworCWlmIChwb3dlcm9mZl9wb3dlcmN5Y2xlKQorCQlkYXRhWzBdID0gSVBNSV9DSEFTU0lTX1BPV0VSX0NZQ0xFOworCWVsc2UKKwkJZGF0YVswXSA9IElQTUlfQ0hBU1NJU19QT1dFUl9ET1dOOwogCXNlbmRfbXNnLmRhdGEgPSBkYXRhOwogCXNlbmRfbXNnLmRhdGFfbGVuID0gc2l6ZW9mKGRhdGEpOwogCXJ2ID0gaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUodXNlciwKIAkJCQkgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKIAkJCQkgICAgICZzZW5kX21zZyk7CiAJaWYgKHJ2KSB7Ci0JCXN3aXRjaCAocG93ZXJvZmZfY29udHJvbCkgewotCQkJY2FzZSBJUE1JX0NIQVNTSVNfUE9XRVJfQ1lDTEU6Ci0JCQkJLyogcG93ZXIgY3ljbGUgZmFpbGVkLCBkZWZhdWx0IHRvIHBvd2VyIGRvd24gKi8KLQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gc2VuZCBjaGFzc2lzIHBvd2VyICIgXAotCQkJCQkiY3ljbGUgbWVzc2FnZSwgSVBNSSBlcnJvciAweCV4XG4iLCBydik7Ci0JCQkJcG93ZXJvZmZfY29udHJvbCA9IElQTUlfQ0hBU1NJU19QT1dFUl9ET1dOOwotCQkJCWdvdG8gcG93ZXJjeWNsZWZhaWxlZDsKLQotCQkJY2FzZSBJUE1JX0NIQVNTSVNfUE9XRVJfRE9XTjoKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHNlbmQgY2hhc3NpcyBwb3dlciAiIFwKLQkJCQkJImRvd24gbWVzc2FnZSwgSVBNSSBlcnJvciAweCV4XG4iLCBydik7Ci0JCQkJYnJlYWs7CisJCWlmIChwb3dlcm9mZl9wb3dlcmN5Y2xlKSB7CisJCQkvKiBwb3dlciBjeWNsZSBmYWlsZWQsIGRlZmF1bHQgdG8gcG93ZXIgZG93biAqLworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHNlbmQgY2hhc3NpcyBwb3dlciAiIFwKKwkJCSAgICAgICAiY3ljbGUgbWVzc2FnZSwgSVBNSSBlcnJvciAweCV4XG4iLCBydik7CisJCQlwb3dlcm9mZl9wb3dlcmN5Y2xlID0gMDsKKwkJCWdvdG8gcG93ZXJjeWNsZWZhaWxlZDsKIAkJfQotCX0KIAotCXJldHVybjsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHNlbmQgY2hhc3NpcyBwb3dlciAiIFwKKwkJICAgICAgICJkb3duIG1lc3NhZ2UsIElQTUkgZXJyb3IgMHgleFxuIiwgcnYpOworCX0KIH0KIAogCkBAIC00MTQsNiArNDMwLDkgQEAKIAl7IC5wbGF0Zm9ybV90eXBlCT0gIkNQSTEiLAogCSAgLmRldGVjdAkJPSBpcG1pX2NwaTFfZGV0ZWN0LAogCSAgLnBvd2Vyb2ZmX2Z1bmMJPSBpcG1pX3Bvd2Vyb2ZmX2NwaTEgfSwKKwl7IC5wbGF0Zm9ybV90eXBlCT0gImNoYXNzaXMiLAorCSAgLmRldGVjdAkJPSBpcG1pX2RlbGxfY2hhc3Npc19kZXRlY3QsCisJICAucG93ZXJvZmZfZnVuYwk9IGlwbWlfcG93ZXJvZmZfY2hhc3NpcyB9LAogCS8qIENoYXNzaXMgc2hvdWxkIGdlbmVyYWxseSBiZSBsYXN0LCBvdGhlciB0aGluZ3Mgc2hvdWxkIG92ZXJyaWRlCiAJICAgaXQuICovCiAJeyAucGxhdGZvcm1fdHlwZQk9ICJjaGFzc2lzIiwKQEAgLTQ5OSwxMCArNTE4LDExIEBACiAJcHJvZF9pZCA9IChoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzEwXQogCQkgICB8IChoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzExXSA8PCA4KSk7CiAJY2FwYWJpbGl0aWVzID0gaGFsdF9yZWN2X21zZy5tc2cuZGF0YVs2XTsKKwlpcG1pX3ZlcnNpb24gPSBoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzVdOwogCiAKIAkvKiBTY2FuIGZvciBhIHBvd2Vyb2ZmIG1ldGhvZCAqLwotCWZvciAoaT0wOyBpPE5VTV9QT19GVU5DUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE5VTV9QT19GVU5DUzsgaSsrKSB7CiAJCWlmIChwb3dlcm9mZl9mdW5jdGlvbnNbaV0uZGV0ZWN0KGlwbWlfdXNlcikpCiAJCQlnb3RvIGZvdW5kOwogCX0KQEAgLTUzOCwzOSArNTU4LDM1IEBACiAKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0vKiBkaXNwbGF5cyBwcm9wZXJ0aWVzIHRvIHByb2MgKi8KLXN0YXRpYyBpbnQgcHJvY19yZWFkX2NoYXNzY3RybChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LAotCQkJICAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFx0WyAwPXBvd2VyZG93biAyPXBvd2VyY3ljbGUgXVxuIiwKLQkJCXBvd2Vyb2ZmX2NvbnRyb2wpOwotfQorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogCi0vKiBwcm9jZXNzIHByb3BlcnR5IHdyaXRlcyBmcm9tIHByb2MgKi8KLXN0YXRpYyBpbnQgcHJvY193cml0ZV9jaGFzc2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKLQkJCSAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgICAgICAgICAgcnYgPSBjb3VudDsKLQl1bnNpZ25lZCBpbnQgbmV3dmFsID0gMDsKK3N0YXRpYyBjdGxfdGFibGUgaXBtaV90YWJsZVtdID0geworCXsgLmN0bF9uYW1lCT0gREVWX0lQTUlfUE9XRVJPRkZfUE9XRVJDWUNMRSwKKwkgIC5wcm9jbmFtZQk9ICJwb3dlcm9mZl9wb3dlcmN5Y2xlIiwKKwkgIC5kYXRhCQk9ICZwb3dlcm9mZl9wb3dlcmN5Y2xlLAorCSAgLm1heGxlbgk9IHNpemVvZihwb3dlcm9mZl9wb3dlcmN5Y2xlKSwKKwkgIC5tb2RlCQk9IDA2NDQsCisJICAucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMgfSwKKwl7IH0KK307CiAKLQlzc2NhbmYoYnVmZmVyLCAiJWQiLCAmbmV3dmFsKTsKLQlzd2l0Y2ggKG5ld3ZhbCkgewotCQljYXNlIElQTUlfQ0hBU1NJU19QT1dFUl9DWUNMRToKLQkJCXByaW50ayhLRVJOX0lORk8gUEZYICJwb3dlciBjeWNsZSBpcyBub3cgZW5hYmxlZFxuIik7Ci0JCQlwb3dlcm9mZl9jb250cm9sID0gbmV3dmFsOwotCQkJYnJlYWs7CitzdGF0aWMgY3RsX3RhYmxlIGlwbWlfZGlyX3RhYmxlW10gPSB7CisJeyAuY3RsX25hbWUJPSBERVZfSVBNSSwKKwkgIC5wcm9jbmFtZQk9ICJpcG1pIiwKKwkgIC5tb2RlCQk9IDA1NTUsCisJICAuY2hpbGQJPSBpcG1pX3RhYmxlIH0sCisJeyB9Cit9OwogCi0JCWNhc2UgSVBNSV9DSEFTU0lTX1BPV0VSX0RPV046Ci0JCQlwb3dlcm9mZl9jb250cm9sID0gSVBNSV9DSEFTU0lTX1BPV0VSX0RPV047Ci0JCQlicmVhazsKK3N0YXRpYyBjdGxfdGFibGUgaXBtaV9yb290X3RhYmxlW10gPSB7CisJeyAuY3RsX25hbWUJPSBDVExfREVWLAorCSAgLnByb2NuYW1lCT0gImRldiIsCisJICAubW9kZQkJPSAwNTU1LAorCSAgLmNoaWxkCT0gaXBtaV9kaXJfdGFibGUgfSwKKwl7IH0KK307CiAKLQkJZGVmYXVsdDoKLQkJCXJ2ID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBydjsKLX0KK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaXBtaV90YWJsZV9oZWFkZXI7CiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAogLyoKQEAgLTU3OCw0MiArNTk0LDMyIEBACiAgKi8KIHN0YXRpYyBpbnQgaXBtaV9wb3dlcm9mZl9pbml0ICh2b2lkKQogewotCWludCAgICAgICAgICAgICAgICAgICBydjsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmZpbGU7CisJaW50IHJ2OwogCiAJcHJpbnRrICgiQ29weXJpZ2h0IChDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUgLSIKLQkJIiBJUE1JIFBvd2VyZG93biB2aWEgc3lzX3JlYm9vdCB2ZXJzaW9uICIKLQkJSVBNSV9QT1dFUk9GRl9WRVJTSU9OICIuXG4iKTsKKwkJIiBJUE1JIFBvd2VyZG93biB2aWEgc3lzX3JlYm9vdC5cbiIpOwogCi0Jc3dpdGNoIChwb3dlcm9mZl9jb250cm9sKSB7Ci0JCWNhc2UgSVBNSV9DSEFTU0lTX1BPV0VSX0NZQ0xFOgotCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlBvd2VyIGN5Y2xlIGlzIGVuYWJsZWQuXG4iKTsKLQkJCWJyZWFrOworCWlmIChwb3dlcm9mZl9wb3dlcmN5Y2xlKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUG93ZXIgY3ljbGUgaXMgZW5hYmxlZC5cbiIpOwogCi0JCWNhc2UgSVBNSV9DSEFTU0lTX1BPV0VSX0RPV046Ci0JCWRlZmF1bHQ6Ci0JCQlwb3dlcm9mZl9jb250cm9sID0gSVBNSV9DSEFTU0lTX1BPV0VSX0RPV047Ci0JCQlicmVhazsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWlwbWlfdGFibGVfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGlwbWlfcm9vdF90YWJsZSwgMSk7CisJaWYgKCFpcG1pX3RhYmxlX2hlYWRlcikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVnaXN0ZXIgcG93ZXJjeWNsZSBzeXNjdGxcbiIpOworCQlydiA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2VycjsKIAl9CisjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJcnYgPSBpcG1pX3NtaV93YXRjaGVyX3JlZ2lzdGVyKCZzbWlfd2F0Y2hlcik7CisjZW5kaWYKIAlpZiAocnYpIHsKKwkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoaXBtaV90YWJsZV9oZWFkZXIpOwogCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVnaXN0ZXIgU01JIHdhdGNoZXI6ICVkXG4iLCBydik7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeSgicG93ZXJvZmZfY29udHJvbCIsIDAsIHByb2NfaXBtaV9yb290KTsKLQlpZiAoIWZpbGUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGNyZWF0ZSBwcm9jIHBvd2VyIGNvbnRyb2xcbiIpOwotCX0gZWxzZSB7Ci0JCWZpbGUtPm5saW5rID0gMTsKLQkJZmlsZS0+cmVhZF9wcm9jID0gcHJvY19yZWFkX2NoYXNzY3RybDsKLQkJZmlsZS0+d3JpdGVfcHJvYyA9IHByb2Nfd3JpdGVfY2hhc3NjdHJsOwotCQlmaWxlLT5vd25lciA9IFRISVNfTU9EVUxFOwotCX0KLSNlbmRpZgotCiAgb3V0X2VycjoKIAlyZXR1cm4gcnY7CiB9CkBAIC02MjQsNyArNjMwLDcgQEAKIAlpbnQgcnY7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXJlbW92ZV9wcm9jX2VudHJ5KCJwb3dlcm9mZl9jb250cm9sIiwgcHJvY19pcG1pX3Jvb3QpOworCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGlwbWlfdGFibGVfaGVhZGVyKTsKICNlbmRpZgogCiAJaXBtaV9zbWlfd2F0Y2hlcl91bnJlZ2lzdGVyKCZzbWlfd2F0Y2hlcik7CkBAIC02NDIsMyArNjQ4LDUgQEAKIAogbW9kdWxlX2luaXQoaXBtaV9wb3dlcm9mZl9pbml0KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkNvcmV5IE1pbnlhcmQgPG1pbnlhcmRAbXZpc3RhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVBNSSBQb3dlcm9mZiBleHRlbnNpb24gdG8gc3lzX3JlYm9vdCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwppbmRleCBhNDRiOTczLi5iNmU1Y2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwpAQCAtNjEsMTEgKzYxLDExIEBACiAjIGVuZGlmCiBzdGF0aWMgaW5saW5lIHZvaWQgYWRkX3VzZWNfdG9fdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnQsIGxvbmcgdikKIHsKLQl0LT5zdWJfZXhwaXJlcyArPSBuc2VjX3RvX2FyY2hfY3ljbGUodiAqIDEwMDApOwotCXdoaWxlICh0LT5zdWJfZXhwaXJlcyA+PSBhcmNoX2N5Y2xlc19wZXJfamlmZnkpCisJdC0+YXJjaF9jeWNsZV9leHBpcmVzICs9IG5zZWNfdG9fYXJjaF9jeWNsZSh2ICogMTAwMCk7CisJd2hpbGUgKHQtPmFyY2hfY3ljbGVfZXhwaXJlcyA+PSBhcmNoX2N5Y2xlc19wZXJfamlmZnkpCiAJewogCQl0LT5leHBpcmVzKys7Ci0JCXQtPnN1Yl9leHBpcmVzIC09IGFyY2hfY3ljbGVzX3Blcl9qaWZmeTsKKwkJdC0+YXJjaF9jeWNsZV9leHBpcmVzIC09IGFyY2hfY3ljbGVzX3Blcl9qaWZmeTsKIAl9CiB9CiAjZW5kaWYKQEAgLTc1LDggKzc1LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJpcG1pX3NpX3NtLmgiCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jZGVmaW5lIElQTUlfU0lfVkVSU0lPTiAidjMzIgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogCiAvKiBNZWFzdXJlIHRpbWVzIGJldHdlZW4gZXZlbnRzIGluIHRoZSBkcml2ZXIuICovCiAjdW5kZWYgREVCVUdfVElNSU5HCkBAIC0xMDksNiArMTA4LDIxIEBACiAgICAgU0lfS0NTLCBTSV9TTUlDLCBTSV9CVAogfTsKIAorc3RydWN0IGlwbWlfZGV2aWNlX2lkIHsKKwl1bnNpZ25lZCBjaGFyIGRldmljZV9pZDsKKwl1bnNpZ25lZCBjaGFyIGRldmljZV9yZXZpc2lvbjsKKwl1bnNpZ25lZCBjaGFyIGZpcm13YXJlX3JldmlzaW9uXzE7CisJdW5zaWduZWQgY2hhciBmaXJtd2FyZV9yZXZpc2lvbl8yOworCXVuc2lnbmVkIGNoYXIgaXBtaV92ZXJzaW9uOworCXVuc2lnbmVkIGNoYXIgYWRkaXRpb25hbF9kZXZpY2Vfc3VwcG9ydDsKKwl1bnNpZ25lZCBjaGFyIG1hbnVmYWN0dXJlcl9pZFszXTsKKwl1bnNpZ25lZCBjaGFyIHByb2R1Y3RfaWRbMl07CisJdW5zaWduZWQgY2hhciBhdXhfZmlybXdhcmVfcmV2aXNpb25bNF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIGlwbWlfdmVyc2lvbl9tYWpvcih2KSAoKHYpLT5pcG1pX3ZlcnNpb24gJiAweGYpCisjZGVmaW5lIGlwbWlfdmVyc2lvbl9taW5vcih2KSAoKHYpLT5pcG1pX3ZlcnNpb24gPj4gNCkKKwogc3RydWN0IHNtaV9pbmZvCiB7CiAJaXBtaV9zbWlfdCAgICAgICAgICAgICBpbnRmOwpAQCAtMTMxLDEyICsxNDUsMjQgQEAKIAl2b2lkICgqaXJxX2NsZWFudXApKHN0cnVjdCBzbWlfaW5mbyAqaW5mbyk7CiAJdW5zaWduZWQgaW50IGlvX3NpemU7CiAKKwkvKiBQZXItT0VNIGhhbmRsZXIsIGNhbGxlZCBmcm9tIGhhbmRsZV9mbGFncygpLgorCSAgIFJldHVybnMgMSB3aGVuIGhhbmRsZV9mbGFncygpIG5lZWRzIHRvIGJlIHJlLXJ1bgorCSAgIG9yIDAgaW5kaWNhdGluZyBpdCBzZXQgc2lfc3RhdGUgaXRzZWxmLgorCSovCisJaW50ICgqb2VtX2RhdGFfYXZhaWxfaGFuZGxlcikoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbyk7CisKIAkvKiBGbGFncyBmcm9tIHRoZSBsYXN0IEdFVF9NU0dfRkxBR1MgY29tbWFuZCwgdXNlZCB3aGVuIGFuIEFUVE4KIAkgICBpcyBzZXQgdG8gaG9sZCB0aGUgZmxhZ3MgdW50aWwgd2UgYXJlIGRvbmUgaGFuZGxpbmcgZXZlcnl0aGluZwogCSAgIGZyb20gdGhlIGZsYWdzLiAqLwogI2RlZmluZSBSRUNFSVZFX01TR19BVkFJTAkweDAxCiAjZGVmaW5lIEVWRU5UX01TR19CVUZGRVJfRlVMTAkweDAyCiAjZGVmaW5lIFdEVF9QUkVfVElNRU9VVF9JTlQJMHgwOAorI2RlZmluZSBPRU0wX0RBVEFfQVZBSUwgICAgIDB4MjAKKyNkZWZpbmUgT0VNMV9EQVRBX0FWQUlMICAgICAweDQwCisjZGVmaW5lIE9FTTJfREFUQV9BVkFJTCAgICAgMHg4MAorI2RlZmluZSBPRU1fREFUQV9BVkFJTCAgICAgIChPRU0wX0RBVEFfQVZBSUwgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9FTTFfREFUQV9BVkFJTCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0VNMl9EQVRBX0FWQUlMKQogCXVuc2lnbmVkIGNoYXIgICAgICAgbXNnX2ZsYWdzOwogCiAJLyogSWYgc2V0IHRvIHRydWUsIHRoaXMgd2lsbCByZXF1ZXN0IGV2ZW50cyB0aGUgbmV4dCB0aW1lIHRoZQpAQCAtMTc1LDExICsyMDEsNyBAQAogCSAgIGludGVycnVwdHMuICovCiAJaW50IGludGVycnVwdF9kaXNhYmxlZDsKIAotCXVuc2lnbmVkIGNoYXIgaXBtaV9zaV9kZXZfcmV2OwotCXVuc2lnbmVkIGNoYXIgaXBtaV9zaV9md19yZXZfbWFqb3I7Ci0JdW5zaWduZWQgY2hhciBpcG1pX3NpX2Z3X3Jldl9taW5vcjsKLQl1bnNpZ25lZCBjaGFyIGlwbWlfdmVyc2lvbl9tYWpvcjsKLQl1bnNpZ25lZCBjaGFyIGlwbWlfdmVyc2lvbl9taW5vcjsKKwlzdHJ1Y3QgaXBtaV9kZXZpY2VfaWQgZGV2aWNlX2lkOwogCiAJLyogU2xhdmUgYWRkcmVzcywgY291bGQgYmUgcmVwb3J0ZWQgZnJvbSBETUkuICovCiAJdW5zaWduZWQgY2hhciBzbGF2ZV9hZGRyOwpAQCAtMjQ1LDcgKzI2Nyw3IEBACiAJCWVudHJ5ID0gc21pX2luZm8tPnhtaXRfbXNncy5uZXh0OwogCX0KIAotCWlmICghZW50cnkpIHsKKwlpZiAoISBlbnRyeSkgewogCQlzbWlfaW5mby0+Y3Vycl9tc2cgPSBOVUxMOwogCQlydiA9IFNJX1NNX0lETEU7CiAJfSBlbHNlIHsKQEAgLTMwNiw3ICszMjgsNyBAQAogICAgbWVtb3J5LCB3ZSB3aWxsIHJlLWVuYWJsZSB0aGUgaW50ZXJydXB0LiAqLwogc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfc2lfaXJxKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCiB7Ci0JaWYgKChzbWlfaW5mby0+aXJxKSAmJiAoIXNtaV9pbmZvLT5pbnRlcnJ1cHRfZGlzYWJsZWQpKSB7CisJaWYgKChzbWlfaW5mby0+aXJxKSAmJiAoISBzbWlfaW5mby0+aW50ZXJydXB0X2Rpc2FibGVkKSkgewogCQlkaXNhYmxlX2lycV9ub3N5bmMoc21pX2luZm8tPmlycSk7CiAJCXNtaV9pbmZvLT5pbnRlcnJ1cHRfZGlzYWJsZWQgPSAxOwogCX0KQEAgLTMyMiw2ICszNDQsNyBAQAogCiBzdGF0aWMgdm9pZCBoYW5kbGVfZmxhZ3Moc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKIHsKKyByZXRyeToKIAlpZiAoc21pX2luZm8tPm1zZ19mbGFncyAmIFdEVF9QUkVfVElNRU9VVF9JTlQpIHsKIAkJLyogV2F0Y2hkb2cgcHJlLXRpbWVvdXQgKi8KIAkJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CkBAIC0zMzYsNyArMzU5LDcgQEAKIAl9IGVsc2UgaWYgKHNtaV9pbmZvLT5tc2dfZmxhZ3MgJiBSRUNFSVZFX01TR19BVkFJTCkgewogCQkvKiBNZXNzYWdlcyBhdmFpbGFibGUuICovCiAJCXNtaV9pbmZvLT5jdXJyX21zZyA9IGlwbWlfYWxsb2Nfc21pX21zZygpOwotCQlpZiAoIXNtaV9pbmZvLT5jdXJyX21zZykgeworCQlpZiAoISBzbWlfaW5mby0+Y3Vycl9tc2cpIHsKIAkJCWRpc2FibGVfc2lfaXJxKHNtaV9pbmZvKTsKIAkJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX05PUk1BTDsKIAkJCXJldHVybjsKQEAgLTM1NSw3ICszNzgsNyBAQAogCX0gZWxzZSBpZiAoc21pX2luZm8tPm1zZ19mbGFncyAmIEVWRU5UX01TR19CVUZGRVJfRlVMTCkgewogCQkvKiBFdmVudHMgYXZhaWxhYmxlLiAqLwogCQlzbWlfaW5mby0+Y3Vycl9tc2cgPSBpcG1pX2FsbG9jX3NtaV9tc2coKTsKLQkJaWYgKCFzbWlfaW5mby0+Y3Vycl9tc2cpIHsKKwkJaWYgKCEgc21pX2luZm8tPmN1cnJfbXNnKSB7CiAJCQlkaXNhYmxlX3NpX2lycShzbWlfaW5mbyk7CiAJCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9OT1JNQUw7CiAJCQlyZXR1cm47CkBAIC0zNzEsNiArMzk0LDEwIEBACiAJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGEsCiAJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGFfc2l6ZSk7CiAJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX0dFVFRJTkdfRVZFTlRTOworCX0gZWxzZSBpZiAoc21pX2luZm8tPm1zZ19mbGFncyAmIE9FTV9EQVRBX0FWQUlMKSB7CisJCWlmIChzbWlfaW5mby0+b2VtX2RhdGFfYXZhaWxfaGFuZGxlcikKKwkJCWlmIChzbWlfaW5mby0+b2VtX2RhdGFfYXZhaWxfaGFuZGxlcihzbWlfaW5mbykpCisJCQkJZ290byByZXRyeTsKIAl9IGVsc2UgewogCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9OT1JNQUw7CiAJfQpAQCAtMzg3LDcgKzQxNCw3IEBACiAjZW5kaWYKIAlzd2l0Y2ggKHNtaV9pbmZvLT5zaV9zdGF0ZSkgewogCWNhc2UgU0lfTk9STUFMOgotCQlpZiAoIXNtaV9pbmZvLT5jdXJyX21zZykKKwkJaWYgKCEgc21pX2luZm8tPmN1cnJfbXNnKQogCQkJYnJlYWs7CiAKIAkJc21pX2luZm8tPmN1cnJfbXNnLT5yc3Bfc2l6ZQpAQCAtNzYxLDE4ICs3ODgsMjAgQEAKICNpZiBkZWZpbmVkKENPTkZJR19ISUdIX1JFU19USU1FUlMpCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIGppZmZpZXNfbm93OworCXVuc2lnbmVkIGxvbmcgc2VxOwogCiAJaWYgKGRlbF90aW1lcigmKHNtaV9pbmZvLT5zaV90aW1lcikpKSB7CiAJCS8qIElmIHdlIGRvbid0IGRlbGV0ZSB0aGUgdGltZXIsIHRoZW4gaXQgd2lsbCBnbyBvZmYKIAkJICAgaW1tZWRpYXRlbHksIGFueXdheS4gIFNvIHdlIG9ubHkgcHJvY2VzcyBpZiB3ZQogCQkgICBhY3R1YWxseSBkZWxldGUgdGhlIHRpbWVyLiAqLwogCi0JCS8qIFdlIGFscmVhZHkgaGF2ZSBpcnFzYXZlIG9uLCBzbyBubyBuZWVkIGZvciBpdAotICAgICAgICAgICAgICAgICAgIGhlcmUuICovCi0JCXJlYWRfbG9jaygmeHRpbWVfbG9jayk7Ci0JCWppZmZpZXNfbm93ID0gamlmZmllczsKLQkJc21pX2luZm8tPnNpX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzX25vdzsKLQkJc21pX2luZm8tPnNpX3RpbWVyLnN1Yl9leHBpcmVzID0gZ2V0X2FyY2hfY3ljbGVzKGppZmZpZXNfbm93KTsKKwkJZG8geworCQkJc2VxID0gcmVhZF9zZXFiZWdpbl9pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJCQlqaWZmaWVzX25vdyA9IGppZmZpZXM7CisJCQlzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXNfbm93OworCQkJc21pX2luZm8tPnNpX3RpbWVyLmFyY2hfY3ljbGVfZXhwaXJlcworCQkJCT0gZ2V0X2FyY2hfY3ljbGVzKGppZmZpZXNfbm93KTsKKwkJfSB3aGlsZSAocmVhZF9zZXFyZXRyeV9pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBzZXEsIGZsYWdzKSk7CiAKIAkJYWRkX3VzZWNfdG9fdGltZXIoJnNtaV9pbmZvLT5zaV90aW1lciwgU0lfU0hPUlRfVElNRU9VVF9VU0VDKTsKIApAQCAtODI2LDE1ICs4NTUsMTkgQEAKIAkvKiBJZiB0aGUgc3RhdGUgbWFjaGluZSBhc2tzIGZvciBhIHNob3J0IGRlbGF5LCB0aGVuIHNob3J0ZW4KICAgICAgICAgICAgdGhlIHRpbWVyIHRpbWVvdXQuICovCiAJaWYgKHNtaV9yZXN1bHQgPT0gU0lfU01fQ0FMTF9XSVRIX0RFTEFZKSB7CisjaWYgZGVmaW5lZChDT05GSUdfSElHSF9SRVNfVElNRVJTKQorCQl1bnNpZ25lZCBsb25nIHNlcTsKKyNlbmRpZgogCQlzcGluX2xvY2tfaXJxc2F2ZSgmc21pX2luZm8tPmNvdW50X2xvY2ssIGZsYWdzKTsKIAkJc21pX2luZm8tPnNob3J0X3RpbWVvdXRzKys7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CiAjaWYgZGVmaW5lZChDT05GSUdfSElHSF9SRVNfVElNRVJTKQotCQlyZWFkX2xvY2soJnh0aW1lX2xvY2spOwotICAgICAgICAgICAgICAgIHNtaV9pbmZvLT5zaV90aW1lci5leHBpcmVzID0gamlmZmllczsKLSAgICAgICAgICAgICAgICBzbWlfaW5mby0+c2lfdGltZXIuc3ViX2V4cGlyZXMKLSAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0X2FyY2hfY3ljbGVzKHNtaV9pbmZvLT5zaV90aW1lci5leHBpcmVzKTsKLSAgICAgICAgICAgICAgICByZWFkX3VubG9jaygmeHRpbWVfbG9jayk7CisJCWRvIHsKKwkJCXNlcSA9IHJlYWRfc2VxYmVnaW5faXJxc2F2ZSgmeHRpbWVfbG9jaywgZmxhZ3MpOworCQkJc21pX2luZm8tPnNpX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzOworCQkJc21pX2luZm8tPnNpX3RpbWVyLmFyY2hfY3ljbGVfZXhwaXJlcworCQkJCT0gZ2V0X2FyY2hfY3ljbGVzKHNtaV9pbmZvLT5zaV90aW1lci5leHBpcmVzKTsKKwkJfSB3aGlsZSAocmVhZF9zZXFyZXRyeV9pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBzZXEsIGZsYWdzKSk7CiAJCWFkZF91c2VjX3RvX3RpbWVyKCZzbWlfaW5mby0+c2lfdGltZXIsIFNJX1NIT1JUX1RJTUVPVVRfVVNFQyk7CiAjZWxzZQogCQlzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxOwpAQCAtODQ1LDcgKzg3OCw3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CiAJCXNtaV9pbmZvLT5zaV90aW1lci5leHBpcmVzID0gamlmZmllcyArIFNJX1RJTUVPVVRfSklGRklFUzsKICNpZiBkZWZpbmVkKENPTkZJR19ISUdIX1JFU19USU1FUlMpCi0JCXNtaV9pbmZvLT5zaV90aW1lci5zdWJfZXhwaXJlcyA9IDA7CisJCXNtaV9pbmZvLT5zaV90aW1lci5hcmNoX2N5Y2xlX2V4cGlyZXMgPSAwOwogI2VuZGlmCiAJfQogCkBAIC05ODYsNyArMTAxOSw3IEBACiAjZGVmaW5lIElQTUlfTUVNX0FERFJfU1BBQ0UgMQogI2RlZmluZSBJUE1JX0lPX0FERFJfU1BBQ0UgIDIKIAotI2lmIGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpIHx8IGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfUENJKQorI2lmIGRlZmluZWQoQ09ORklHX0FDUEkpIHx8IGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfUENJKQogc3RhdGljIGludCBpc19uZXdfaW50ZXJmYWNlKGludCBpbnRmLCB1OCBhZGRyX3NwYWNlLCB1bnNpZ25lZCBsb25nIGJhc2VfYWRkcikKIHsKIAlpbnQgaTsKQEAgLTEwMTQsNyArMTA0Nyw3IEBACiB7CiAJaW50IHJ2OwogCi0JaWYgKCFpbmZvLT5pcnEpCisJaWYgKCEgaW5mby0+aXJxKQogCQlyZXR1cm4gMDsKIAogCWlmIChpbmZvLT5zaV90eXBlID09IFNJX0JUKSB7CkBAIC0xMDIzLDcgKzEwNTYsNyBAQAogCQkJCSBTQV9JTlRFUlJVUFQsCiAJCQkJIERFVklDRV9OQU1FLAogCQkJCSBpbmZvKTsKLQkJaWYgKCFydikKKwkJaWYgKCEgcnYpCiAJCQkvKiBFbmFibGUgdGhlIGludGVycnVwdCBpbiB0aGUgQlQgaW50ZXJmYWNlLiAqLwogCQkJaW5mby0+aW8ub3V0cHV0YigmaW5mby0+aW8sIElQTUlfQlRfSU5UTUFTS19SRUcsCiAJCQkJCSBJUE1JX0JUX0lOVE1BU0tfRU5BQkxFX0lSUV9CSVQpOwpAQCAtMTA0OCw3ICsxMDgxLDcgQEAKIAogc3RhdGljIHZvaWQgc3RkX2lycV9jbGVhbnVwKHN0cnVjdCBzbWlfaW5mbyAqaW5mbykKIHsKLQlpZiAoIWluZm8tPmlycSkKKwlpZiAoISBpbmZvLT5pcnEpCiAJCXJldHVybjsKIAogCWlmIChpbmZvLT5zaV90eXBlID09IFNJX0JUKQpAQCAtMTEyMSw3ICsxMTU0LDcgQEAKIAl1bnNpZ25lZCBpbnQgKmFkZHIgPSBpbmZvLT5pby5pbmZvOwogCWludCAgICAgICAgICAgbWFwc2l6ZTsKIAotCWlmICghYWRkciB8fCAoISphZGRyKSkKKwlpZiAoISBhZGRyIHx8ICghICphZGRyKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpbmZvLT5pb19jbGVhbnVwID0gcG9ydF9jbGVhbnVwOwpAQCAtMTE2NCwxNSArMTE5NywxNSBAQAogewogCXN0cnVjdCBzbWlfaW5mbyAqaW5mbzsKIAotCWlmICghcG9ydHNbaW50Zl9udW1dKQorCWlmICghIHBvcnRzW2ludGZfbnVtXSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoIWlzX25ld19pbnRlcmZhY2UoaW50Zl9udW0sIElQTUlfSU9fQUREUl9TUEFDRSwKKwlpZiAoISBpc19uZXdfaW50ZXJmYWNlKGludGZfbnVtLCBJUE1JX0lPX0FERFJfU1BBQ0UsCiAJCQkgICAgICBwb3J0c1tpbnRmX251bV0pKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghaW5mbykgeworCWlmICghIGluZm8pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpcG1pX3NpOiBDb3VsZCBub3QgYWxsb2NhdGUgU0kgZGF0YSAoMSlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xMTgyLDEwICsxMjE1LDEwIEBACiAJaW5mby0+aW8uaW5mbyA9ICYocG9ydHNbaW50Zl9udW1dKTsKIAlpbmZvLT5pby5hZGRyID0gTlVMTDsKIAlpbmZvLT5pby5yZWdzcGFjaW5nID0gcmVnc3BhY2luZ3NbaW50Zl9udW1dOwotCWlmICghaW5mby0+aW8ucmVnc3BhY2luZykKKwlpZiAoISBpbmZvLT5pby5yZWdzcGFjaW5nKQogCQlpbmZvLT5pby5yZWdzcGFjaW5nID0gREVGQVVMVF9SRUdTUEFDSU5HOwogCWluZm8tPmlvLnJlZ3NpemUgPSByZWdzaXplc1tpbnRmX251bV07Ci0JaWYgKCFpbmZvLT5pby5yZWdzaXplKQorCWlmICghIGluZm8tPmlvLnJlZ3NpemUpCiAJCWluZm8tPmlvLnJlZ3NpemUgPSBERUZBVUxUX1JFR1NQQUNJTkc7CiAJaW5mby0+aW8ucmVnc2hpZnQgPSByZWdzaGlmdHNbaW50Zl9udW1dOwogCWluZm8tPmlycSA9IDA7CkBAIC0xMjcwLDcgKzEzMDMsNyBAQAogCXVuc2lnbmVkIGxvbmcgKmFkZHIgPSBpbmZvLT5pby5pbmZvOwogCWludCAgICAgICAgICAgbWFwc2l6ZTsKIAotCWlmICghYWRkciB8fCAoISphZGRyKSkKKwlpZiAoISBhZGRyIHx8ICghICphZGRyKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpbmZvLT5pb19jbGVhbnVwID0gbWVtX2NsZWFudXA7CkBAIC0xMzI1LDE1ICsxMzU4LDE1IEBACiB7CiAJc3RydWN0IHNtaV9pbmZvICppbmZvOwogCi0JaWYgKCFhZGRyc1tpbnRmX251bV0pCisJaWYgKCEgYWRkcnNbaW50Zl9udW1dKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghaXNfbmV3X2ludGVyZmFjZShpbnRmX251bSwgSVBNSV9NRU1fQUREUl9TUEFDRSwKKwlpZiAoISBpc19uZXdfaW50ZXJmYWNlKGludGZfbnVtLCBJUE1JX01FTV9BRERSX1NQQUNFLAogCQkJICAgICAgYWRkcnNbaW50Zl9udW1dKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluZm8pIHsKKwlpZiAoISBpbmZvKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaXBtaV9zaTogQ291bGQgbm90IGFsbG9jYXRlIFNJIGRhdGEgKDIpXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTM0MywxMCArMTM3NiwxMCBAQAogCWluZm8tPmlvLmluZm8gPSAmYWRkcnNbaW50Zl9udW1dOwogCWluZm8tPmlvLmFkZHIgPSBOVUxMOwogCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSByZWdzcGFjaW5nc1tpbnRmX251bV07Ci0JaWYgKCFpbmZvLT5pby5yZWdzcGFjaW5nKQorCWlmICghIGluZm8tPmlvLnJlZ3NwYWNpbmcpCiAJCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSBERUZBVUxUX1JFR1NQQUNJTkc7CiAJaW5mby0+aW8ucmVnc2l6ZSA9IHJlZ3NpemVzW2ludGZfbnVtXTsKLQlpZiAoIWluZm8tPmlvLnJlZ3NpemUpCisJaWYgKCEgaW5mby0+aW8ucmVnc2l6ZSkKIAkJaW5mby0+aW8ucmVnc2l6ZSA9IERFRkFVTFRfUkVHU1BBQ0lORzsKIAlpbmZvLT5pby5yZWdzaGlmdCA9IHJlZ3NoaWZ0c1tpbnRmX251bV07CiAJaW5mby0+aXJxID0gMDsKQEAgLTEzNjIsNyArMTM5NSw3IEBACiB9CiAKIAotI2lmZGVmIENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSCisjaWZkZWYgQ09ORklHX0FDUEkKIAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KIApAQCAtMTQwNCw3ICsxNDM3LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlpZiAoIWluZm8tPmlycSkKKwlpZiAoISBpbmZvLT5pcnEpCiAJCXJldHVybiAwOwogCiAJLyogRklYTUUgLSBpcyBsZXZlbCB0cmlnZ2VyZWQgcmlnaHQ/ICovCkBAIC0xNDI4LDcgKzE0NjEsNyBAQAogCiBzdGF0aWMgdm9pZCBhY3BpX2dwZV9pcnFfY2xlYW51cChzdHJ1Y3Qgc21pX2luZm8gKmluZm8pCiB7Ci0JaWYgKCFpbmZvLT5pcnEpCisJaWYgKCEgaW5mby0+aXJxKQogCQlyZXR1cm47CiAKIAlhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihOVUxMLCBpbmZvLT5pcnEsICZpcG1pX2FjcGlfZ3BlKTsKQEAgLTE0ODQsNiArMTUxNyw5IEBACiAJY2hhciAgICAgICAgICAgICAqaW9fdHlwZTsKIAl1OCAJCSBhZGRyX3NwYWNlOwogCisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiAtRU5PREVWOworCiAJaWYgKGFjcGlfZmFpbHVyZSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTE1MDQsMTAgKzE1NDAsMTAgQEAKIAkJYWRkcl9zcGFjZSA9IElQTUlfTUVNX0FERFJfU1BBQ0U7CiAJZWxzZQogCQlhZGRyX3NwYWNlID0gSVBNSV9JT19BRERSX1NQQUNFOwotCWlmICghaXNfbmV3X2ludGVyZmFjZSgtMSwgYWRkcl9zcGFjZSwgc3BtaS0+YWRkci5hZGRyZXNzKSkKKwlpZiAoISBpc19uZXdfaW50ZXJmYWNlKC0xLCBhZGRyX3NwYWNlLCBzcG1pLT5hZGRyLmFkZHJlc3MpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghc3BtaS0+YWRkci5yZWdpc3Rlcl9iaXRfd2lkdGgpIHsKKwlpZiAoISBzcG1pLT5hZGRyLnJlZ2lzdGVyX2JpdF93aWR0aCkgewogCQlhY3BpX2ZhaWx1cmUgPSAxOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xNTM0LDcgKzE1NzAsNyBAQAogCX0KIAogCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghaW5mbykgeworCWlmICghIGluZm8pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpcG1pX3NpOiBDb3VsZCBub3QgYWxsb2NhdGUgU0kgZGF0YSAoMylcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xNjEwLDIyICsxNjQ2LDE1IEBACiBzdGF0aWMgZG1pX2lwbWlfZGF0YV90IGRtaV9kYXRhW1NJX01BWF9EUklWRVJTXTsKIHN0YXRpYyBpbnQgZG1pX2RhdGFfZW50cmllczsKIAotdHlwZWRlZiBzdHJ1Y3QgZG1pX2hlYWRlcgorc3RhdGljIGludCBfX2luaXQgZGVjb2RlX2RtaShzdHJ1Y3QgZG1pX2hlYWRlciAqZG0sIGludCBpbnRmX251bSkKIHsKLQl1OAl0eXBlOwotCXU4CWxlbmd0aDsKLQl1MTYJaGFuZGxlOwotfSBkbWlfaGVhZGVyX3Q7Ci0KLXN0YXRpYyBpbnQgZGVjb2RlX2RtaShkbWlfaGVhZGVyX3QgX19pb21lbSAqZG0sIGludCBpbnRmX251bSkKLXsKLQl1OAkJX19pb21lbSAqZGF0YSA9ICh1OCBfX2lvbWVtICopZG07CisJdTggICAgICAgICAgICAgICpkYXRhID0gKHU4ICopZG07CiAJdW5zaWduZWQgbG9uZyAgCWJhc2VfYWRkcjsKIAl1OAkJcmVnX3NwYWNpbmc7Ci0JdTggICAgICAgICAgICAgIGxlbiA9IHJlYWRiKCZkbS0+bGVuZ3RoKTsKKwl1OCAgICAgICAgICAgICAgbGVuID0gZG0tPmxlbmd0aDsKIAlkbWlfaXBtaV9kYXRhX3QgKmlwbWlfZGF0YSA9IGRtaV9kYXRhK2ludGZfbnVtOwogCi0JaXBtaV9kYXRhLT50eXBlID0gcmVhZGIoJmRhdGFbNF0pOworCWlwbWlfZGF0YS0+dHlwZSA9IGRhdGFbNF07CiAKIAltZW1jcHkoJmJhc2VfYWRkciwgZGF0YSs4LCBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCWlmIChsZW4gPj0gMHgxMSkgewpAQCAtMTY0MCwxMiArMTY2OSwxMiBAQAogCQl9CiAJCS8qIElmIGJpdCA0IG9mIGJ5dGUgMHgxMCBpcyBzZXQsIHRoZW4gdGhlIGxzYiBmb3IgdGhlIGFkZHJlc3MKIAkJICAgaXMgb2RkLiAqLwotCQlpcG1pX2RhdGEtPmJhc2VfYWRkciA9IGJhc2VfYWRkciB8ICgocmVhZGIoJmRhdGFbMHgxMF0pICYgMHgxMCkgPj4gNCk7CisJCWlwbWlfZGF0YS0+YmFzZV9hZGRyID0gYmFzZV9hZGRyIHwgKChkYXRhWzB4MTBdICYgMHgxMCkgPj4gNCk7CiAKLQkJaXBtaV9kYXRhLT5pcnEgPSByZWFkYigmZGF0YVsweDExXSk7CisJCWlwbWlfZGF0YS0+aXJxID0gZGF0YVsweDExXTsKIAogCQkvKiBUaGUgdG9wIHR3byBiaXRzIG9mIGJ5dGUgMHgxMCBob2xkIHRoZSByZWdpc3RlciBzcGFjaW5nLiAqLwotCQlyZWdfc3BhY2luZyA9IChyZWFkYigmZGF0YVsweDEwXSkgJiAweEMwKSA+PiA2OworCQlyZWdfc3BhY2luZyA9IChkYXRhWzB4MTBdICYgMHhDMCkgPj4gNjsKIAkJc3dpdGNoKHJlZ19zcGFjaW5nKXsKIAkJY2FzZSAweDAwOiAvKiBCeXRlIGJvdW5kYXJpZXMgKi8KIAkJICAgIGlwbWlfZGF0YS0+b2Zmc2V0ID0gMTsKQEAgLTE2NzMsNyArMTcwMiw3IEBACiAJCWlwbWlfZGF0YS0+b2Zmc2V0ID0gMTsKIAl9CiAKLQlpcG1pX2RhdGEtPnNsYXZlX2FkZHIgPSByZWFkYigmZGF0YVs2XSk7CisJaXBtaV9kYXRhLT5zbGF2ZV9hZGRyID0gZGF0YVs2XTsKIAogCWlmIChpc19uZXdfaW50ZXJmYWNlKC0xLCBpcG1pX2RhdGEtPmFkZHJfc3BhY2UsaXBtaV9kYXRhLT5iYXNlX2FkZHIpKSB7CiAJCWRtaV9kYXRhX2VudHJpZXMrKzsKQEAgLTE2ODUsOTQgKzE3MTQsMjkgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgZG1pX3RhYmxlKHUzMiBiYXNlLCBpbnQgbGVuLCBpbnQgbnVtKQorc3RhdGljIHZvaWQgX19pbml0IGRtaV9maW5kX2JtYyh2b2lkKQogewotCXU4IAkJICBfX2lvbWVtICpidWY7Ci0Jc3RydWN0IGRtaV9oZWFkZXIgX19pb21lbSAqZG07Ci0JdTggCQkgIF9faW9tZW0gKmRhdGE7Ci0JaW50IAkJICBpPTE7Ci0JaW50CQkgIHN0YXR1cz0tMTsKKwlzdHJ1Y3QgZG1pX2RldmljZSAqZGV2ID0gTlVMTDsKIAlpbnQgICAgICAgICAgICAgICBpbnRmX251bSA9IDA7CiAKLQlidWYgPSBpb3JlbWFwKGJhc2UsIGxlbik7Ci0JaWYoYnVmPT1OVUxMKQotCQlyZXR1cm4gLTE7CisJd2hpbGUgKChkZXYgPSBkbWlfZmluZF9kZXZpY2UoRE1JX0RFVl9UWVBFX0lQTUksIE5VTEwsIGRldikpKSB7CisJCWlmIChpbnRmX251bSA+PSBTSV9NQVhfRFJJVkVSUykKKwkJCWJyZWFrOwogCi0JZGF0YSA9IGJ1ZjsKLQotCXdoaWxlKGk8bnVtICYmIChkYXRhIC0gYnVmKSA8IGxlbikKLQl7Ci0JCWRtPShkbWlfaGVhZGVyX3QgX19pb21lbSAqKWRhdGE7Ci0KLQkJaWYoKGRhdGEtYnVmK3JlYWRiKCZkbS0+bGVuZ3RoKSkgPj0gbGVuKQotICAgICAgICAJCWJyZWFrOwotCi0JCWlmIChyZWFkYigmZG0tPnR5cGUpID09IDM4KSB7Ci0JCQlpZiAoZGVjb2RlX2RtaShkbSwgaW50Zl9udW0pID09IDApIHsKLQkJCQlpbnRmX251bSsrOwotCQkJCWlmIChpbnRmX251bSA+PSBTSV9NQVhfRFJJVkVSUykKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCSAgICAgICAgZGF0YSs9cmVhZGIoJmRtLT5sZW5ndGgpOwotCQl3aGlsZSgoZGF0YS1idWYpIDwgbGVuICYmIChyZWFkYihkYXRhKXx8cmVhZGIoZGF0YSsxKSkpCi0JCQlkYXRhKys7Ci0JCWRhdGErPTI7Ci0JCWkrKzsKKwkJZGVjb2RlX2RtaSgoc3RydWN0IGRtaV9oZWFkZXIgKikgZGV2LT5kZXZpY2VfZGF0YSwgaW50Zl9udW0rKyk7CiAJfQotCWlvdW5tYXAoYnVmKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRtaV9jaGVja3N1bSh1OCAqYnVmKQotewotCXU4ICAgc3VtPTA7Ci0JaW50ICBhOwotCi0JZm9yKGE9MDsgYTwxNTsgYSsrKQotCQlzdW0rPWJ1ZlthXTsKLQlyZXR1cm4gKHN1bT09MCk7Ci19Ci0KLXN0YXRpYyBpbnQgZG1pX2RlY29kZSh2b2lkKQotewotCXU4ICAgYnVmWzE1XTsKLQl1MzIgIGZwPTB4RjAwMDA7Ci0KLSNpZmRlZiBDT05GSUdfU0lNTk9XCi0JcmV0dXJuIC0xOwotI2VuZGlmCi0KLQl3aGlsZShmcCA8IDB4RkZGRkYpCi0JewotCQlpc2FfbWVtY3B5X2Zyb21pbyhidWYsIGZwLCAxNSk7Ci0JCWlmKG1lbWNtcChidWYsICJfRE1JXyIsIDUpPT0wICYmIGRtaV9jaGVja3N1bShidWYpKQotCQl7Ci0JCQl1MTYgbnVtPWJ1ZlsxM108PDh8YnVmWzEyXTsKLQkJCXUxNiBsZW49YnVmWzddPDw4fGJ1Zls2XTsKLQkJCXUzMiBiYXNlPWJ1ZlsxMV08PDI0fGJ1ZlsxMF08PDE2fGJ1Zls5XTw8OHxidWZbOF07Ci0KLQkJCWlmKGRtaV90YWJsZShiYXNlLCBsZW4sIG51bSkgPT0gMCkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlmcCs9MTY7Ci0JfQotCi0JcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW50IHRyeV9pbml0X3NtYmlvcyhpbnQgaW50Zl9udW0sIHN0cnVjdCBzbWlfaW5mbyAqKm5ld19pbmZvKQogewotCXN0cnVjdCBzbWlfaW5mbyAgICppbmZvOwotCWRtaV9pcG1pX2RhdGFfdCAgICppcG1pX2RhdGEgPSBkbWlfZGF0YStpbnRmX251bTsKLQljaGFyICAgICAgICAgICAgICAqaW9fdHlwZTsKKwlzdHJ1Y3Qgc21pX2luZm8gKmluZm87CisJZG1pX2lwbWlfZGF0YV90ICppcG1pX2RhdGEgPSBkbWlfZGF0YStpbnRmX251bTsKKwljaGFyICAgICAgICAgICAgKmlvX3R5cGU7CiAKIAlpZiAoaW50Zl9udW0gPj0gZG1pX2RhdGFfZW50cmllcykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlzd2l0Y2goaXBtaV9kYXRhLT50eXBlKSB7CisJc3dpdGNoIChpcG1pX2RhdGEtPnR5cGUpIHsKIAkJY2FzZSAweDAxOiAvKiBLQ1MgKi8KIAkJCXNpX3R5cGVbaW50Zl9udW1dID0gImtjcyI7CiAJCQlicmVhazsKQEAgLTE3ODcsNyArMTc1MSw3IEBACiAJfQogCiAJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbmZvKSB7CisJaWYgKCEgaW5mbykgewogCQlwcmludGsoS0VSTl9FUlIgImlwbWlfc2k6IENvdWxkIG5vdCBhbGxvY2F0ZSBTSSBkYXRhICg0KVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTE4MTEsNyArMTc3NSw3IEBACiAKIAlyZWdzcGFjaW5nc1tpbnRmX251bV0gPSBpcG1pX2RhdGEtPm9mZnNldDsKIAlpbmZvLT5pby5yZWdzcGFjaW5nID0gcmVnc3BhY2luZ3NbaW50Zl9udW1dOwotCWlmICghaW5mby0+aW8ucmVnc3BhY2luZykKKwlpZiAoISBpbmZvLT5pby5yZWdzcGFjaW5nKQogCQlpbmZvLT5pby5yZWdzcGFjaW5nID0gREVGQVVMVF9SRUdTUEFDSU5HOwogCWluZm8tPmlvLnJlZ3NpemUgPSBERUZBVUxUX1JFR1NQQUNJTkc7CiAJaW5mby0+aW8ucmVnc2hpZnQgPSByZWdzaGlmdHNbaW50Zl9udW1dOwpAQCAtMTg1MywxNCArMTgxNywxNCBAQAogCiAJcGNpX3NtaWNfY2hlY2tlZCA9IDE7CiAKLQlpZiAoKHBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfSFBfVkVORE9SX0lELCBQQ0lfTU1DX0RFVklDRV9JRCwKLQkJCQkgICAgICAgTlVMTCkpKQotCQk7Ci0JZWxzZSBpZiAoKHBjaV9kZXYgPSBwY2lfZ2V0X2NsYXNzKFBDSV9FUk1DX0NMQVNTQ09ERSwgTlVMTCkpICYmCi0JCSBwY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9IUF9WRU5ET1JfSUQpCi0JCWZlX3JtYyA9IDE7Ci0JZWxzZQotCQlyZXR1cm4gLUVOT0RFVjsKKwlwY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0hQX1ZFTkRPUl9JRCwgUENJX01NQ19ERVZJQ0VfSUQsIE5VTEwpOworCWlmICghIHBjaV9kZXYpIHsKKwkJcGNpX2RldiA9IHBjaV9nZXRfY2xhc3MoUENJX0VSTUNfQ0xBU1NDT0RFLCBOVUxMKTsKKwkJaWYgKHBjaV9kZXYgJiYgKHBjaV9kZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX0hQX1ZFTkRPUl9JRCkpCisJCQlmZV9ybWMgPSAxOworCQllbHNlCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAllcnJvciA9IHBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIFBDSV9NTUNfQUREUl9DVywgJmJhc2VfYWRkcik7CiAJaWYgKGVycm9yKQpAQCAtMTg3Myw3ICsxODM3LDcgQEAKIAl9CiAKIAkvKiBCaXQgMDogMSBzcGVjaWZpZXMgcHJvZ3JhbW1lZCBJL08sIDAgc3BlY2lmaWVzIG1lbW9yeSBtYXBwZWQgSS9PICovCi0JaWYgKCEoYmFzZV9hZGRyICYgMHgwMDAxKSkKKwlpZiAoISAoYmFzZV9hZGRyICYgMHgwMDAxKSkKIAl7CiAJCXBjaV9kZXZfcHV0KHBjaV9kZXYpOwogCQlwcmludGsoS0VSTl9FUlIKQEAgLTE4ODMsMTcgKzE4NDcsMTcgQEAKIAl9CiAKIAliYXNlX2FkZHIgJj0gMHhGRkZFOwotCWlmICghZmVfcm1jKQorCWlmICghIGZlX3JtYykKIAkJLyogRGF0YSByZWdpc3RlciBzdGFydHMgYXQgYmFzZSBhZGRyZXNzICsgMSBpbiBlUk1DICovCiAJCSsrYmFzZV9hZGRyOwogCi0JaWYgKCFpc19uZXdfaW50ZXJmYWNlKC0xLCBJUE1JX0lPX0FERFJfU1BBQ0UsIGJhc2VfYWRkcikpIHsKKwlpZiAoISBpc19uZXdfaW50ZXJmYWNlKC0xLCBJUE1JX0lPX0FERFJfU1BBQ0UsIGJhc2VfYWRkcikpIHsKIAkJcGNpX2Rldl9wdXQocGNpX2Rldik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghaW5mbykgeworCWlmICghIGluZm8pIHsKIAkJcGNpX2Rldl9wdXQocGNpX2Rldik7CiAJCXByaW50ayhLRVJOX0VSUiAiaXBtaV9zaTogQ291bGQgbm90IGFsbG9jYXRlIFNJIGRhdGEgKDUpXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xOTA0LDcgKzE4NjgsNyBAQAogCXBvcnRzW2ludGZfbnVtXSA9IGJhc2VfYWRkcjsKIAlpbmZvLT5pby5pbmZvID0gJihwb3J0c1tpbnRmX251bV0pOwogCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSByZWdzcGFjaW5nc1tpbnRmX251bV07Ci0JaWYgKCFpbmZvLT5pby5yZWdzcGFjaW5nKQorCWlmICghIGluZm8tPmlvLnJlZ3NwYWNpbmcpCiAJCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSBERUZBVUxUX1JFR1NQQUNJTkc7CiAJaW5mby0+aW8ucmVnc2l6ZSA9IERFRkFVTFRfUkVHU1BBQ0lORzsKIAlpbmZvLT5pby5yZWdzaGlmdCA9IHJlZ3NoaWZ0c1tpbnRmX251bV07CkBAIC0xOTI1LDcgKzE4ODksNyBAQAogc3RhdGljIGludCB0cnlfaW5pdF9wbHVnX2FuZF9wbGF5KGludCBpbnRmX251bSwgc3RydWN0IHNtaV9pbmZvICoqbmV3X2luZm8pCiB7CiAjaWZkZWYgQ09ORklHX1BDSQotCWlmIChmaW5kX3BjaV9zbWljKGludGZfbnVtLCBuZXdfaW5mbyk9PTApCisJaWYgKGZpbmRfcGNpX3NtaWMoaW50Zl9udW0sIG5ld19pbmZvKSA9PSAwKQogCQlyZXR1cm4gMDsKICNlbmRpZgogCS8qIEluY2x1ZGUgb3RoZXIgbWV0aG9kcyBoZXJlLiAqLwpAQCAtMTk0Myw3ICsxOTA3LDcgQEAKIAlpbnQgICAgICAgICAgICAgICBydiA9IDA7CiAKIAlyZXNwID0ga21hbGxvYyhJUE1JX01BWF9NU0dfTEVOR1RILCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJlc3ApCisJaWYgKCEgcmVzcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBEbyBhIEdldCBEZXZpY2UgSUQgY29tbWFuZCwgc2luY2UgaXQgY29tZXMgYmFjayB3aXRoIHNvbWUKQEAgLTE5NTYsOCArMTkyMCw3IEBACiAJZm9yICg7OykKIAl7CiAJCWlmIChzbWlfcmVzdWx0ID09IFNJX1NNX0NBTExfV0lUSF9ERUxBWSkgewotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCQkJc21pX3Jlc3VsdCA9IHNtaV9pbmZvLT5oYW5kbGVycy0+ZXZlbnQoCiAJCQkJc21pX2luZm8tPnNpX3NtLCAxMDApOwogCQl9CkBAIC0xOTkyLDExICsxOTU1LDggQEAKIAl9CiAKIAkvKiBSZWNvcmQgaW5mbyBmcm9tIHRoZSBnZXQgZGV2aWNlIGlkLCBpbiBjYXNlIHdlIG5lZWQgaXQuICovCi0Jc21pX2luZm8tPmlwbWlfc2lfZGV2X3JldiA9IHJlc3BbNF0gJiAweGY7Ci0Jc21pX2luZm8tPmlwbWlfc2lfZndfcmV2X21ham9yID0gcmVzcFs1XSAmIDB4N2Y7Ci0Jc21pX2luZm8tPmlwbWlfc2lfZndfcmV2X21pbm9yID0gcmVzcFs2XTsKLQlzbWlfaW5mby0+aXBtaV92ZXJzaW9uX21ham9yID0gcmVzcFs3XSAmIDB4ZjsKLQlzbWlfaW5mby0+aXBtaV92ZXJzaW9uX21pbm9yID0gcmVzcFs3XSA+PiA0OworCW1lbWNweSgmc21pX2luZm8tPmRldmljZV9pZCwgJnJlc3BbM10sCisJICAgICAgIG1pbl90KHVuc2lnbmVkIGxvbmcsIHJlc3BfbGVuLTMsIHNpemVvZihzbWlfaW5mby0+ZGV2aWNlX2lkKSkpOwogCiAgb3V0OgogCWtmcmVlKHJlc3ApOwpAQCAtMjAyOCw3ICsxOTg4LDcgQEAKIAlzdHJ1Y3Qgc21pX2luZm8gKnNtaSA9IGRhdGE7CiAKIAlvdXQgKz0gc3ByaW50ZihvdXQsICJpbnRlcnJ1cHRzX2VuYWJsZWQ6ICAgICVkXG4iLAotCQkgICAgICAgc21pLT5pcnEgJiYgIXNtaS0+aW50ZXJydXB0X2Rpc2FibGVkKTsKKwkJICAgICAgIHNtaS0+aXJxICYmICEgc21pLT5pbnRlcnJ1cHRfZGlzYWJsZWQpOwogCW91dCArPSBzcHJpbnRmKG91dCwgInNob3J0X3RpbWVvdXRzOiAgICAgICAgJWxkXG4iLAogCQkgICAgICAgc21pLT5zaG9ydF90aW1lb3V0cyk7CiAJb3V0ICs9IHNwcmludGYob3V0LCAibG9uZ190aW1lb3V0czogICAgICAgICAlbGRcbiIsCkBAIC0yMDU3LDYgKzIwMTcsNzMgQEAKIAlyZXR1cm4gKG91dCAtICgoY2hhciAqKSBwYWdlKSk7CiB9CiAKKy8qCisgKiBvZW1fZGF0YV9hdmFpbF90b19yZWNlaXZlX21zZ19hdmFpbAorICogQGluZm8gLSBzbWlfaW5mbyBzdHJ1Y3R1cmUgd2l0aCBtc2dfZmxhZ3Mgc2V0CisgKgorICogQ29udmVydHMgZmxhZ3MgZnJvbSBPRU1fREFUQV9BVkFJTCB0byBSRUNFSVZFX01TR19BVkFJTAorICogUmV0dXJucyAxIGluZGljYXRpbmcgbmVlZCB0byByZS1ydW4gaGFuZGxlX2ZsYWdzKCkuCisgKi8KK3N0YXRpYyBpbnQgb2VtX2RhdGFfYXZhaWxfdG9fcmVjZWl2ZV9tc2dfYXZhaWwoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwlzbWlfaW5mby0+bXNnX2ZsYWdzID0gKChzbWlfaW5mby0+bXNnX2ZsYWdzICYgfk9FTV9EQVRBX0FWQUlMKSB8CisJCQkgICAgICAJUkVDRUlWRV9NU0dfQVZBSUwpOworCXJldHVybiAxOworfQorCisvKgorICogc2V0dXBfZGVsbF9wb3dlcmVkZ2Vfb2VtX2RhdGFfaGFuZGxlcgorICogQGluZm8gLSBzbWlfaW5mby5kZXZpY2VfaWQgbXVzdCBiZSBwb3B1bGF0ZWQKKyAqCisgKiBTeXN0ZW1zIHRoYXQgbWF0Y2gsIGJ1dCBoYXZlIGZpcm13YXJlIHZlcnNpb24gPCAxLjQwIG1heSBhc3NlcnQKKyAqIE9FTTBfREFUQV9BVkFJTCBvbiB0aGVpciBvd24sIHdpdGhvdXQgYmVpbmcgdG9sZCB2aWEgU2V0IEZsYWdzIHRoYXQKKyAqIGl0J3Mgc2FmZSB0byBkbyBzby4gIFN1Y2ggc3lzdGVtcyB3aWxsIGRlLWFzc2VydCBPRU0xX0RBVEFfQVZBSUwKKyAqIHVwb24gcmVjZWlwdCBvZiBJUE1JX0dFVF9NU0dfQ01ELCBzbyB3ZSBzaG91bGQgdHJlYXQgdGhlc2UgZmxhZ3MKKyAqIGFzIFJFQ0VJVkVfTVNHX0FWQUlMIGluc3RlYWQuCisgKgorICogQXMgRGVsbCBoYXMgbm8gcGxhbnMgdG8gcmVsZWFzZSBJUE1JIDEuNSBmaXJtd2FyZSB0aGF0ICpldmVyKgorICogYXNzZXJ0IHRoZSBPRU1bMDEyXSBiaXRzLCBhbmQgaWYgaXQgZGlkLCB0aGUgZHJpdmVyIHdvdWxkIGhhdmUgdG8KKyAqIGNoYW5nZSB0byBoYW5kbGUgdGhhdCBwcm9wZXJseSwgd2UgZG9uJ3QgYWN0dWFsbHkgY2hlY2sgZm9yIHRoZQorICogZmlybXdhcmUgdmVyc2lvbi4KKyAqIERldmljZSBJRCA9IDB4MjAgICAgICAgICAgICAgICAgQk1DIG9uIFBvd2VyRWRnZSA4RyBzZXJ2ZXJzCisgKiBEZXZpY2UgUmV2aXNpb24gPSAweDgwCisgKiBGaXJtd2FyZSBSZXZpc2lvbjEgPSAweDAxICAgICAgIEJNQyB2ZXJzaW9uIDEuNDAKKyAqIEZpcm13YXJlIFJldmlzaW9uMiA9IDB4NDAgICAgICAgQkNEIGVuY29kZWQKKyAqIElQTUkgVmVyc2lvbiA9IDB4NTEgICAgICAgICAgICAgSVBNSSAxLjUKKyAqIE1hbnVmYWN0dXJlciBJRCA9IEEyIDAyIDAwICAgICAgRGVsbCBJQU5BCisgKgorICovCisjZGVmaW5lIERFTExfUE9XRVJFREdFXzhHX0JNQ19ERVZJQ0VfSUQgIDB4MjAKKyNkZWZpbmUgREVMTF9QT1dFUkVER0VfOEdfQk1DX0RFVklDRV9SRVYgMHg4MAorI2RlZmluZSBERUxMX1BPV0VSRURHRV84R19CTUNfSVBNSV9WRVJTSU9OIDB4NTEKKyNkZWZpbmUgREVMTF9JQU5BX01GUl9JRCB7MHhBMiwgMHgwMiwgMHgwMH0KK3N0YXRpYyB2b2lkIHNldHVwX2RlbGxfcG93ZXJlZGdlX29lbV9kYXRhX2hhbmRsZXIoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwlzdHJ1Y3QgaXBtaV9kZXZpY2VfaWQgKmlkID0gJnNtaV9pbmZvLT5kZXZpY2VfaWQ7CisJY29uc3QgY2hhciBtZnJbM109REVMTF9JQU5BX01GUl9JRDsKKwlpZiAoISBtZW1jbXAobWZyLCBpZC0+bWFudWZhY3R1cmVyX2lkLCBzaXplb2YobWZyKSkKKwkgICAgJiYgKGlkLT5kZXZpY2VfaWQgICAgICAgPT0gREVMTF9QT1dFUkVER0VfOEdfQk1DX0RFVklDRV9JRCkKKwkgICAgJiYgKGlkLT5kZXZpY2VfcmV2aXNpb24gPT0gREVMTF9QT1dFUkVER0VfOEdfQk1DX0RFVklDRV9SRVYpCisJICAgICYmIChpZC0+aXBtaV92ZXJzaW9uICAgID09IERFTExfUE9XRVJFREdFXzhHX0JNQ19JUE1JX1ZFUlNJT04pKQorCXsKKwkJc21pX2luZm8tPm9lbV9kYXRhX2F2YWlsX2hhbmRsZXIgPQorCQkJb2VtX2RhdGFfYXZhaWxfdG9fcmVjZWl2ZV9tc2dfYXZhaWw7CisJfQorfQorCisvKgorICogc2V0dXBfb2VtX2RhdGFfaGFuZGxlcgorICogQGluZm8gLSBzbWlfaW5mby5kZXZpY2VfaWQgbXVzdCBiZSBmaWxsZWQgaW4gYWxyZWFkeQorICoKKyAqIEZpbGxzIGluIHNtaV9pbmZvLmRldmljZV9pZC5vZW1fZGF0YV9hdmFpbGFibGVfaGFuZGxlcgorICogd2hlbiB3ZSBrbm93IHdoYXQgZnVuY3Rpb24gdG8gdXNlIHRoZXJlLgorICovCisKK3N0YXRpYyB2b2lkIHNldHVwX29lbV9kYXRhX2hhbmRsZXIoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwlzZXR1cF9kZWxsX3Bvd2VyZWRnZV9vZW1fZGF0YV9oYW5kbGVyKHNtaV9pbmZvKTsKK30KKwogLyogUmV0dXJucyAwIGlmIGluaXRpYWxpemVkLCBvciBuZWdhdGl2ZSBvbiBhbiBlcnJvci4gKi8KIHN0YXRpYyBpbnQgaW5pdF9vbmVfc21pKGludCBpbnRmX251bSwgc3RydWN0IHNtaV9pbmZvICoqc21pKQogewpAQCAtMjA2NywyMCArMjA5NCwxNiBAQAogCXJ2ID0gdHJ5X2luaXRfbWVtKGludGZfbnVtLCAmbmV3X3NtaSk7CiAJaWYgKHJ2KQogCQlydiA9IHRyeV9pbml0X3BvcnQoaW50Zl9udW0sICZuZXdfc21pKTsKLSNpZmRlZiBDT05GSUdfQUNQSV9JTlRFUlBSRVRFUgotCWlmICgocnYpICYmIChzaV90cnlkZWZhdWx0cykpIHsKKyNpZmRlZiBDT05GSUdfQUNQSQorCWlmIChydiAmJiBzaV90cnlkZWZhdWx0cykKIAkJcnYgPSB0cnlfaW5pdF9hY3BpKGludGZfbnVtLCAmbmV3X3NtaSk7Ci0JfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1g4NgotCWlmICgocnYpICYmIChzaV90cnlkZWZhdWx0cykpIHsKKwlpZiAocnYgJiYgc2lfdHJ5ZGVmYXVsdHMpCiAJCXJ2ID0gdHJ5X2luaXRfc21iaW9zKGludGZfbnVtLCAmbmV3X3NtaSk7Ci0gICAgICAgIH0KICNlbmRpZgotCWlmICgocnYpICYmIChzaV90cnlkZWZhdWx0cykpIHsKKwlpZiAocnYgJiYgc2lfdHJ5ZGVmYXVsdHMpCiAJCXJ2ID0gdHJ5X2luaXRfcGx1Z19hbmRfcGxheShpbnRmX251bSwgJm5ld19zbWkpOwotCX0KLQogCiAJaWYgKHJ2KQogCQlyZXR1cm4gcnY7CkBAIC0yMDkwLDcgKzIxMTMsNyBAQAogCW5ld19zbWktPnNpX3NtID0gTlVMTDsKIAluZXdfc21pLT5oYW5kbGVycyA9IE5VTEw7CiAKLQlpZiAoIW5ld19zbWktPmlycV9zZXR1cCkgeworCWlmICghIG5ld19zbWktPmlycV9zZXR1cCkgewogCQluZXdfc21pLT5pcnEgPSBpcnFzW2ludGZfbnVtXTsKIAkJbmV3X3NtaS0+aXJxX3NldHVwID0gc3RkX2lycV9zZXR1cDsKIAkJbmV3X3NtaS0+aXJxX2NsZWFudXAgPSBzdGRfaXJxX2NsZWFudXA7CkBAIC0yMTI0LDcgKzIxNDcsNyBAQAogCiAJLyogQWxsb2NhdGUgdGhlIHN0YXRlIG1hY2hpbmUncyBkYXRhIGFuZCBpbml0aWFsaXplIGl0LiAqLwogCW5ld19zbWktPnNpX3NtID0ga21hbGxvYyhuZXdfc21pLT5oYW5kbGVycy0+c2l6ZSgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld19zbWktPnNpX3NtKSB7CisJaWYgKCEgbmV3X3NtaS0+c2lfc20pIHsKIAkJcHJpbnRrKCIgQ291bGQgbm90IGFsbG9jYXRlIHN0YXRlIG1hY2hpbmUgbWVtb3J5XG4iKTsKIAkJcnYgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9lcnI7CkBAIC0yMTU1LDYgKzIxNzgsOCBAQAogCWlmIChydikKIAkJZ290byBvdXRfZXJyOwogCisJc2V0dXBfb2VtX2RhdGFfaGFuZGxlcihuZXdfc21pKTsKKwogCS8qIFRyeSB0byBjbGFpbSBhbnkgaW50ZXJydXB0cy4gKi8KIAluZXdfc21pLT5pcnFfc2V0dXAobmV3X3NtaSk7CiAKQEAgLTIxODgsOCArMjIxMyw4IEBACiAKIAlydiA9IGlwbWlfcmVnaXN0ZXJfc21pKCZoYW5kbGVycywKIAkJCSAgICAgICBuZXdfc21pLAotCQkJICAgICAgIG5ld19zbWktPmlwbWlfdmVyc2lvbl9tYWpvciwKLQkJCSAgICAgICBuZXdfc21pLT5pcG1pX3ZlcnNpb25fbWlub3IsCisJCQkgICAgICAgaXBtaV92ZXJzaW9uX21ham9yKCZuZXdfc21pLT5kZXZpY2VfaWQpLAorCQkJICAgICAgIGlwbWlfdmVyc2lvbl9taW5vcigmbmV3X3NtaS0+ZGV2aWNlX2lkKSwKIAkJCSAgICAgICBuZXdfc21pLT5zbGF2ZV9hZGRyLAogCQkJICAgICAgICYobmV3X3NtaS0+aW50ZikpOwogCWlmIChydikgewpAQCAtMjIzMCwxMCArMjI1NSw4IEBACiAKIAkvKiBXYWl0IGZvciB0aGUgdGltZXIgdG8gc3RvcC4gIFRoaXMgYXZvaWRzIHByb2JsZW1zIHdpdGggcmFjZQogCSAgIGNvbmRpdGlvbnMgcmVtb3ZpbmcgdGhlIHRpbWVyIGhlcmUuICovCi0Jd2hpbGUgKCFuZXdfc21pLT50aW1lcl9zdG9wcGVkKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQl9CisJd2hpbGUgKCFuZXdfc21pLT50aW1lcl9zdG9wcGVkKQorCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAogIG91dF9lcnI6CiAJaWYgKG5ld19zbWktPmludGYpCkBAIC0yMjcwLDcgKzIyOTMsNyBAQAogCS8qIFBhcnNlIG91dCB0aGUgc2lfdHlwZSBzdHJpbmcgaW50byBpdHMgY29tcG9uZW50cy4gKi8KIAlzdHIgPSBzaV90eXBlX3N0cjsKIAlpZiAoKnN0ciAhPSAnXDAnKSB7Ci0JCWZvciAoaT0wOyAoaTxTSV9NQVhfUEFSTVMpICYmICgqc3RyICE9ICdcMCcpOyBpKyspIHsKKwkJZm9yIChpID0gMDsgKGkgPCBTSV9NQVhfUEFSTVMpICYmICgqc3RyICE9ICdcMCcpOyBpKyspIHsKIAkJCXNpX3R5cGVbaV0gPSBzdHI7CiAJCQlzdHIgPSBzdHJjaHIoc3RyLCAnLCcpOwogCQkJaWYgKHN0cikgewpAQCAtMjI4MiwyMiArMjMwNSwxNCBAQAogCQl9CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiSVBNSSBTeXN0ZW0gSW50ZXJmYWNlIGRyaXZlciB2ZXJzaW9uICIKLQkgICAgICAgSVBNSV9TSV9WRVJTSU9OKTsKLQlpZiAoa2NzX3NtaV9oYW5kbGVycy52ZXJzaW9uKQotCQlwcmludGsoIiwgS0NTIHZlcnNpb24gJXMiLCBrY3Nfc21pX2hhbmRsZXJzLnZlcnNpb24pOwotCWlmIChzbWljX3NtaV9oYW5kbGVycy52ZXJzaW9uKQotCQlwcmludGsoIiwgU01JQyB2ZXJzaW9uICVzIiwgc21pY19zbWlfaGFuZGxlcnMudmVyc2lvbik7Ci0JaWYgKGJ0X3NtaV9oYW5kbGVycy52ZXJzaW9uKQotICAgCSAgICAgICAgcHJpbnRrKCIsIEJUIHZlcnNpb24gJXMiLCBidF9zbWlfaGFuZGxlcnMudmVyc2lvbik7Ci0JcHJpbnRrKCJcbiIpOworCXByaW50ayhLRVJOX0lORk8gIklQTUkgU3lzdGVtIEludGVyZmFjZSBkcml2ZXIuXG4iKTsKIAogI2lmZGVmIENPTkZJR19YODYKLQlkbWlfZGVjb2RlKCk7CisJZG1pX2ZpbmRfYm1jKCk7CiAjZW5kaWYKIAogCXJ2ID0gaW5pdF9vbmVfc21pKDAsICYoc21pX2luZm9zW3Bvc10pKTsKLQlpZiAocnYgJiYgIXBvcnRzWzBdICYmIHNpX3RyeWRlZmF1bHRzKSB7CisJaWYgKHJ2ICYmICEgcG9ydHNbMF0gJiYgc2lfdHJ5ZGVmYXVsdHMpIHsKIAkJLyogSWYgd2UgYXJlIHRyeWluZyBkZWZhdWx0cyBhbmQgdGhlIGluaXRpYWwgcG9ydCBpcwogICAgICAgICAgICAgICAgICAgIG5vdCBzZXQsIHRoZW4gc2V0IGl0LiAqLwogCQlzaV90eXBlWzBdID0gImtjcyI7CkBAIC0yMzE5LDcgKzIzMzQsNyBAQAogCWlmIChydiA9PSAwKQogCQlwb3MrKzsKIAotCWZvciAoaT0xOyBpIDwgU0lfTUFYX1BBUk1TOyBpKyspIHsKKwlmb3IgKGkgPSAxOyBpIDwgU0lfTUFYX1BBUk1TOyBpKyspIHsKIAkJcnYgPSBpbml0X29uZV9zbWkoaSwgJihzbWlfaW5mb3NbcG9zXSkpOwogCQlpZiAocnYgPT0gMCkKIAkJCXBvcysrOwpAQCAtMjM2MSwxNyArMjM3NiwxNCBAQAogCiAJLyogV2FpdCBmb3IgdGhlIHRpbWVyIHRvIHN0b3AuICBUaGlzIGF2b2lkcyBwcm9ibGVtcyB3aXRoIHJhY2UKIAkgICBjb25kaXRpb25zIHJlbW92aW5nIHRoZSB0aW1lciBoZXJlLiAqLwotCXdoaWxlICghdG9fY2xlYW4tPnRpbWVyX3N0b3BwZWQpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCX0KKwl3aGlsZSAoIXRvX2NsZWFuLT50aW1lcl9zdG9wcGVkKQorCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAogCS8qIEludGVycnVwdHMgYW5kIHRpbWVvdXRzIGFyZSBzdG9wcGVkLCBub3cgbWFrZSBzdXJlIHRoZQogCSAgIGludGVyZmFjZSBpcyBpbiBhIGNsZWFuIHN0YXRlLiAqLwotCXdoaWxlICgodG9fY2xlYW4tPmN1cnJfbXNnKSB8fCAodG9fY2xlYW4tPnNpX3N0YXRlICE9IFNJX05PUk1BTCkpIHsKKwl3aGlsZSAodG9fY2xlYW4tPmN1cnJfbXNnIHx8ICh0b19jbGVhbi0+c2lfc3RhdGUgIT0gU0lfTk9STUFMKSkgewogCQlwb2xsKHRvX2NsZWFuKTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAl9CiAKIAlydiA9IGlwbWlfdW5yZWdpc3Rlcl9zbWkodG9fY2xlYW4tPmludGYpOwpAQCAtMjM5MiwxMyArMjQwNCwxNSBAQAogewogCWludCBpOwogCi0JaWYgKCFpbml0aWFsaXplZCkKKwlpZiAoISBpbml0aWFsaXplZCkKIAkJcmV0dXJuOwogCi0JZm9yIChpPTA7IGk8U0lfTUFYX0RSSVZFUlM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBTSV9NQVhfRFJJVkVSUzsgaSsrKSB7CiAJCWNsZWFudXBfb25lX3NpKHNtaV9pbmZvc1tpXSk7CiAJfQogfQogbW9kdWxlX2V4aXQoY2xlYW51cF9pcG1pX3NpKTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQ29yZXkgTWlueWFyZCA8bWlueWFyZEBtdmlzdGEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlcmZhY2UgdG8gdGhlIElQTUkgZHJpdmVyIGZvciB0aGUgS0NTLCBTTUlDLCBhbmQgQlQgc3lzdGVtIGludGVyZmFjZXMuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NtaWNfc20uYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc21pY19zbS5jCmluZGV4IGFlMTg3NDcuLmFkZDJhYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc21pY19zbS5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc21pY19zbS5jCkBAIC00Niw4ICs0Niw2IEBACiAjaW5jbHVkZSA8bGludXgvaXBtaV9tc2dkZWZzLmg+CQkvKiBmb3IgY29tcGxldGlvbiBjb2RlcyAqLwogI2luY2x1ZGUgImlwbWlfc2lfc20uaCIKIAotI2RlZmluZSBJUE1JX1NNSUNfVkVSU0lPTiAidjMzIgotCiAvKiBzbWljX2RlYnVnIGlzIGEgYml0LWZpZWxkCiAgKglTTUlDX0RFQlVHX0VOQUJMRSAtCXR1cm5lZCBvbiBmb3Igbm93CiAgKglTTUlDX0RFQlVHX01TRyAtCWNvbW1hbmRzIGFuZCB0aGVpciByZXNwb25zZXMKQEAgLTU4OCw3ICs1ODYsNiBAQAogCiBzdHJ1Y3Qgc2lfc21faGFuZGxlcnMgc21pY19zbWlfaGFuZGxlcnMgPQogewotCS52ZXJzaW9uICAgICAgICAgICA9IElQTUlfU01JQ19WRVJTSU9OLAogCS5pbml0X2RhdGEgICAgICAgICA9IGluaXRfc21pY19kYXRhLAogCS5zdGFydF90cmFuc2FjdGlvbiA9IHN0YXJ0X3NtaWNfdHJhbnNhY3Rpb24sCiAJLmdldF9yZXN1bHQgICAgICAgID0gc21pY19nZXRfcmVzdWx0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jCmluZGV4IGQzNWE5NTMuLjJkYTY0YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfd2F0Y2hkb2cuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMKQEAgLTUzLDggKzUzLDYgQEAKIAogI2RlZmluZQlQRlggIklQTUkgV2F0Y2hkb2c6ICIKIAotI2RlZmluZSBJUE1JX1dBVENIRE9HX1ZFUlNJT04gInYzMyIKLQogLyoKICAqIFRoZSBJUE1JIGNvbW1hbmQvcmVzcG9uc2UgaW5mb3JtYXRpb24gZm9yIHRoZSB3YXRjaGRvZyB0aW1lci4KICAqLwpAQCAtMjU5LDcgKzI1Nyw3IEBACiAKIAlkYXRhWzFdID0gMDsKIAlXRE9HX1NFVF9USU1FT1VUX0FDVChkYXRhWzFdLCBpcG1pX3dhdGNoZG9nX3N0YXRlKTsKLQlpZiAocHJldGltZW91dCA+IDApIHsKKwlpZiAoKHByZXRpbWVvdXQgPiAwKSAmJiAoaXBtaV93YXRjaGRvZ19zdGF0ZSAhPSBXRE9HX1RJTUVPVVRfTk9ORSkpIHsKIAkgICAgV0RPR19TRVRfUFJFVElNRU9VVF9BQ1QoZGF0YVsxXSwgcHJlYWN0aW9uX3ZhbCk7CiAJICAgIGRhdGFbMl0gPSBwcmV0aW1lb3V0OwogCX0gZWxzZSB7CkBAIC02NTksMTkgKzY1NywxOCBAQAogCiBzdGF0aWMgaW50IGlwbWlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwKQogewotICAgICAgICBzd2l0Y2ggKGltaW5vcihpbm8pKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBXQVRDSERPR19NSU5PUjoKLQkJICAgIGlmKHRlc3RfYW5kX3NldF9iaXQoMCwgJmlwbWlfd2RvZ19vcGVuKSkKKyAgICAgICAgc3dpdGNoIChpbWlub3IoaW5vKSkgeworICAgICAgICBjYXNlIFdBVENIRE9HX01JTk9SOgorCQlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmaXBtaV93ZG9nX29wZW4pKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKIAotCQkgICAgLyogRG9uJ3Qgc3RhcnQgdGhlIHRpbWVyIG5vdywgbGV0IGl0IHN0YXJ0IG9uIHRoZQotCQkgICAgICAgZmlyc3QgaGVhcnRiZWF0LiAqLwotCQkgICAgaXBtaV9zdGFydF90aW1lcl9vbl9oZWFydGJlYXQgPSAxOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm8sIGZpbGVwKTsKKwkJLyogRG9uJ3Qgc3RhcnQgdGhlIHRpbWVyIG5vdywgbGV0IGl0IHN0YXJ0IG9uIHRoZQorCQkgICBmaXJzdCBoZWFydGJlYXQuICovCisJCWlwbWlfc3RhcnRfdGltZXJfb25faGVhcnRiZWF0ID0gMTsKKwkJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vLCBmaWxlcCk7CiAKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC1FTk9ERVYpOworCWRlZmF1bHQ6CisJCXJldHVybiAoLUVOT0RFVik7CiAgICAgICAgIH0KIH0KIApAQCAtODE3LDE1ICs4MTQsMTkgQEAKIHN0YXRpYyBpbnQKIGlwbWlfbm1pKHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBjcHUsIGludCBoYW5kbGVkKQogeworICAgICAgICAvKiBJZiB3ZSBhcmUgbm90IGV4cGVjdGluZyBhIHRpbWVvdXQsIGlnbm9yZSBpdC4gKi8KKwlpZiAoaXBtaV93YXRjaGRvZ19zdGF0ZSA9PSBXRE9HX1RJTUVPVVRfTk9ORSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCiAJLyogSWYgbm8gb25lIGVsc2UgaGFuZGxlZCB0aGUgTk1JLCB3ZSBhc3N1bWUgaXQgd2FzIHRoZSBJUE1JCiAgICAgICAgICAgIHdhdGNoZG9nLiAqLwotCWlmICgoIWhhbmRsZWQpICYmIChwcmVvcF92YWwgPT0gV0RPR19QUkVPUF9QQU5JQykpCisJaWYgKCghaGFuZGxlZCkgJiYgKHByZW9wX3ZhbCA9PSBXRE9HX1BSRU9QX1BBTklDKSkgeworCQkvKiBPbiBzb21lIG1hY2hpbmVzLCB0aGUgaGVhcnRiZWF0IHdpbGwgZ2l2ZQorCQkgICBhbiBlcnJvciBhbmQgbm90IHdvcmsgdW5sZXNzIHdlIHJlLWVuYWJsZQorCQkgICB0aGUgdGltZXIuICAgU28gZG8gc28uICovCisJCXByZXRpbWVvdXRfc2luY2VfbGFzdF9oZWFydGJlYXQgPSAxOwogCQlwYW5pYyhQRlggInByZS10aW1lb3V0Iik7Ci0KLQkvKiBPbiBzb21lIG1hY2hpbmVzLCB0aGUgaGVhcnRiZWF0IHdpbGwgZ2l2ZQotCSAgIGFuIGVycm9yIGFuZCBub3Qgd29yayB1bmxlc3Mgd2UgcmUtZW5hYmxlCi0JICAgdGhlIHRpbWVyLiAgIFNvIGRvIHNvLiAqLwotCXByZXRpbWVvdXRfc2luY2VfbGFzdF9oZWFydGJlYXQgPSAxOworCX0KIAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KQEAgLTkyNCw5ICs5MjUsNiBAQAogewogCWludCBydjsKIAotCXByaW50ayhLRVJOX0lORk8gUEZYICJkcml2ZXIgdmVyc2lvbiAiCi0JICAgICAgIElQTUlfV0FUQ0hET0dfVkVSU0lPTiAiXG4iKTsKLQogCWlmIChzdHJjbXAoYWN0aW9uLCAicmVzZXQiKSA9PSAwKSB7CiAJCWFjdGlvbl92YWwgPSBXRE9HX1RJTUVPVVRfUkVTRVQ7CiAJfSBlbHNlIGlmIChzdHJjbXAoYWN0aW9uLCAibm9uZSIpID09IDApIHsKQEAgLTEwMTEsNiArMTAwOSw4IEBACiAJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZG9nX3JlYm9vdF9ub3RpZmllcik7CiAJbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZ3ZG9nX3BhbmljX25vdGlmaWVyKTsKIAorCXByaW50ayhLRVJOX0lORk8gUEZYICJkcml2ZXIgaW5pdGlhbGl6ZWRcbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMzcsMTAgKzEwMzcsOCBAQAogCS8qIFdhaXQgdG8gbWFrZSBzdXJlIHRoZSBtZXNzYWdlIG1ha2VzIGl0IG91dC4gIFRoZSBsb3dlciBsYXllciBoYXMKIAkgICBwb2ludGVycyB0byBvdXIgYnVmZmVycywgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhleSBhcmUgZG9uZSBiZWZvcmUKIAkgICB3ZSByZWxlYXNlIG91ciBtZW1vcnkuICovCi0Jd2hpbGUgKGF0b21pY19yZWFkKCZzZXRfdGltZW91dF90b2ZyZWUpKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQl9CisJd2hpbGUgKGF0b21pY19yZWFkKCZzZXRfdGltZW91dF90b2ZyZWUpKQorCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAogCS8qIERpc2Nvbm5lY3QgZnJvbSBJUE1JLiAqLwogCXJ2ID0gaXBtaV9kZXN0cm95X3VzZXIod2F0Y2hkb2dfdXNlcik7CkBAIC0xMDYyLDMgKzEwNjAsNSBAQAogbW9kdWxlX2V4aXQoaXBtaV93ZG9nX2V4aXQpOwogbW9kdWxlX2luaXQoaXBtaV93ZG9nX2luaXQpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQ29yZXkgTWlueWFyZCA8bWlueWFyZEBtdmlzdGEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ3YXRjaGRvZyB0aW1lciBiYXNlZCB1cG9uIHRoZSBJUE1JIGludGVyZmFjZS4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYyBiL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYwppbmRleCA1MmEwNzNlLi45YzE5ZTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCkBAIC03ODAsNyArNzgwLDcgQEAKICAqCW11Y2ggY2hlYXBlciBvbiBob3N0IGNwdSB0aGFuIHVzaW5nIGludGVycnVwdHMuIEl0IHR1cm5zIG91dCB0bwogICoJbm90IGluY3JlYXNlIGNoYXJhY3RlciBsYXRlbmN5IGJ5IG11Y2ggZWl0aGVyLi4uCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzdGxpX3RpbWVybGlzdCA9IFRJTUVSX0lOSVRJQUxJWkVSKHN0bGlfcG9sbCwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHN0bGlfdGltZXJsaXN0LCBzdGxpX3BvbGwsIDAsIDApOwogCiBzdGF0aWMgaW50CXN0bGlfdGltZXJvbjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMgYi9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYwppbmRleCA1MjNmZDNjLi40NDlkMDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYworKysgYi9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYwpAQCAtMTQsNyArMTQsNyBAQAogICogYFN0aWNreScgbW9kaWZpZXIga2V5cywgOTUxMDA2LgogICoKICAqIDExLTExLTk2OiBTQUsgc2hvdWxkIG5vdyB3b3JrIGluIHRoZSByYXcgbW9kZSAoTWFydGluIE1hcmVzKQotICogCisgKgogICogTW9kaWZpZWQgdG8gcHJvdmlkZSAnZ2VuZXJpYycga2V5Ym9hcmQgc3VwcG9ydCBieSBIYW1pc2ggTWFjZG9uYWxkCiAgKiBNZXJnZSB3aXRoIHRoZSBtNjhrIGtleWJvYXJkIGRyaXZlciBhbmQgc3BsaXQtb2ZmIG9mIHRoZSBQQyBsb3ctbGV2ZWwKICAqIHBhcnRzIGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiwgTWF5IDE5OTcKQEAgLTUyLDcgKzUyLDcgQEAKIC8qCiAgKiBTb21lIGxhcHRvcHMgdGFrZSB0aGUgNzg5dWlvamtsbSwuIGtleXMgYXMgbnVtYmVyIHBhZCB3aGVuIE51bUxvY2sgaXMgb24uCiAgKiBUaGlzIHNlZW1zIGEgZ29vZCByZWFzb24gdG8gc3RhcnQgd2l0aCBOdW1Mb2NrIG9mZi4gT24gSElMIGtleWJvYXJkcwotICogb2YgUEFSSVNDIG1hY2hpbmVzIGhvd2V2ZXIgdGhlcmUgaXMgbm8gTnVtTG9jayBrZXkgYW5kIGV2ZXJ5b25lIGV4cGVjdHMgdGhlIGtleXBhZCAKKyAqIG9mIFBBUklTQyBtYWNoaW5lcyBob3dldmVyIHRoZXJlIGlzIG5vIE51bUxvY2sga2V5IGFuZCBldmVyeW9uZSBleHBlY3RzIHRoZSBrZXlwYWQKICAqIHRvIGJlIHVzZWQgZm9yIG51bWJlcnMuCiAgKi8KIApAQCAtNzYsMTcgKzc2LDE3IEBACiAJa19tZXRhLAkJa19hc2NpaSwJa19sb2NrLAkJa19sb3dlcmNhc2UsXAogCWtfc2xvY2ssCWtfZGVhZDIsCWtfaWdub3JlLAlrX2lnbm9yZQogCi10eXBlZGVmIHZvaWQgKGtfaGFuZGxlcl9mbikoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCAKK3R5cGVkZWYgdm9pZCAoa19oYW5kbGVyX2ZuKShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsCiAJCQkgICAgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBzdGF0aWMga19oYW5kbGVyX2ZuIEtfSEFORExFUlM7CiBzdGF0aWMga19oYW5kbGVyX2ZuICprX2hhbmRsZXJbMTZdID0geyBLX0hBTkRMRVJTIH07CiAKICNkZWZpbmUgRk5fSEFORExFUlNcCi0JZm5fbnVsbCwgCWZuX2VudGVyLAlmbl9zaG93X3B0cmVncywJZm5fc2hvd19tZW0sXAotCWZuX3Nob3dfc3RhdGUsCWZuX3NlbmRfaW50ciwgCWZuX2xhc3Rjb25zLCAJZm5fY2Fwc190b2dnbGUsXAotCWZuX251bSwJCWZuX2hvbGQsIAlmbl9zY3JvbGxfZm9ydywJZm5fc2Nyb2xsX2JhY2ssXAotCWZuX2Jvb3RfaXQsIAlmbl9jYXBzX29uLCAJZm5fY29tcG9zZSwJZm5fU0FLLFwKLQlmbl9kZWNfY29uc29sZSwgZm5faW5jX2NvbnNvbGUsIGZuX3NwYXduX2NvbiwgCWZuX2JhcmVfbnVtCisJZm5fbnVsbCwJZm5fZW50ZXIsCWZuX3Nob3dfcHRyZWdzLAlmbl9zaG93X21lbSxcCisJZm5fc2hvd19zdGF0ZSwJZm5fc2VuZF9pbnRyLAlmbl9sYXN0Y29ucywJZm5fY2Fwc190b2dnbGUsXAorCWZuX251bSwJCWZuX2hvbGQsCWZuX3Njcm9sbF9mb3J3LAlmbl9zY3JvbGxfYmFjayxcCisJZm5fYm9vdF9pdCwJZm5fY2Fwc19vbiwJZm5fY29tcG9zZSwJZm5fU0FLLFwKKwlmbl9kZWNfY29uc29sZSwgZm5faW5jX2NvbnNvbGUsIGZuX3NwYXduX2NvbiwJZm5fYmFyZV9udW0KIAogdHlwZWRlZiB2b2lkIChmbl9oYW5kbGVyX2ZuKShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyBmbl9oYW5kbGVyX2ZuIEZOX0hBTkRMRVJTOwpAQCAtMTU5LDEzICsxNTksMTMgQEAKICAqLwogaW50IGdldGtleWNvZGUodW5zaWduZWQgaW50IHNjYW5jb2RlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gTlVMTDsKIAotCWxpc3RfZm9yX2VhY2gobm9kZSwma2JkX2hhbmRsZXIuaF9saXN0KSB7Ci0JCXN0cnVjdCBpbnB1dF9oYW5kbGUgKiBoYW5kbGUgPSB0b19oYW5kbGVfaChub2RlKTsKLQkJaWYgKGhhbmRsZS0+ZGV2LT5rZXljb2Rlc2l6ZSkgeyAKLQkJCWRldiA9IGhhbmRsZS0+ZGV2OyAKKwlsaXN0X2Zvcl9lYWNoKG5vZGUsICZrYmRfaGFuZGxlci5oX2xpc3QpIHsKKwkJc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlID0gdG9faGFuZGxlX2gobm9kZSk7CisJCWlmIChoYW5kbGUtPmRldi0+a2V5Y29kZXNpemUpIHsKKwkJCWRldiA9IGhhbmRsZS0+ZGV2OwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xODEsMTUgKzE4MSwxNSBAQAogCiBpbnQgc2V0a2V5Y29kZSh1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIHVuc2lnbmVkIGludCBrZXljb2RlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgaSwgb2xka2V5OwogCi0JbGlzdF9mb3JfZWFjaChub2RlLCZrYmRfaGFuZGxlci5oX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoKG5vZGUsICZrYmRfaGFuZGxlci5oX2xpc3QpIHsKIAkJc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlID0gdG9faGFuZGxlX2gobm9kZSk7Ci0JCWlmIChoYW5kbGUtPmRldi0+a2V5Y29kZXNpemUpIHsgCi0JCQlkZXYgPSBoYW5kbGUtPmRldjsgCi0JCQlicmVhazsgCisJCWlmIChoYW5kbGUtPmRldi0+a2V5Y29kZXNpemUpIHsKKwkJCWRldiA9IGhhbmRsZS0+ZGV2OworCQkJYnJlYWs7CiAJCX0KIAl9CiAKQEAgLTIwMCw3ICsyMDAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoa2V5Y29kZSA8IDAgfHwga2V5Y29kZSA+IEtFWV9NQVgpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChrZXljb2RlID4+IChkZXYtPmtleWNvZGVzaXplICogOCkpCisJaWYgKGRldi0+a2V5Y29kZXNpemUgPCBzaXplb2Yoa2V5Y29kZSkgJiYgKGtleWNvZGUgPj4gKGRldi0+a2V5Y29kZXNpemUgKiA4KSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJb2xka2V5ID0gU0VUX0lOUFVUX0tFWUNPREUoZGV2LCBzY2FuY29kZSwga2V5Y29kZSk7CkBAIC0yMTYsMTEgKzIxNiwxMSBAQAogfQogCiAvKgotICogTWFraW5nIGJlZXBzIGFuZCBiZWxscy4gCisgKiBNYWtpbmcgYmVlcHMgYW5kIGJlbGxzLgogICovCiBzdGF0aWMgdm9pZCBrZF9ub3NvdW5kKHVuc2lnbmVkIGxvbmcgaWdub3JlZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlOwogCiAJbGlzdF9mb3JfZWFjaChub2RlLCZrYmRfaGFuZGxlci5oX2xpc3QpIHsKIAkJc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlID0gdG9faGFuZGxlX2gobm9kZSk7CkBAIC0yMzMsMTcgKzIzMywxNiBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGtkX21rc291bmRfdGltZXIgPQotCQlUSU1FUl9JTklUSUFMSVpFUihrZF9ub3NvdW5kLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoa2RfbWtzb3VuZF90aW1lciwga2Rfbm9zb3VuZCwgMCwgMCk7CiAKIHZvaWQga2RfbWtzb3VuZCh1bnNpZ25lZCBpbnQgaHosIHVuc2lnbmVkIGludCB0aWNrcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlOwogCiAJZGVsX3RpbWVyKCZrZF9ta3NvdW5kX3RpbWVyKTsKIAogCWlmIChoeikgewotCQlsaXN0X2Zvcl9lYWNoX3ByZXYobm9kZSwma2JkX2hhbmRsZXIuaF9saXN0KSB7CisJCWxpc3RfZm9yX2VhY2hfcHJldihub2RlLCAma2JkX2hhbmRsZXIuaF9saXN0KSB7CiAJCQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUgPSB0b19oYW5kbGVfaChub2RlKTsKIAkJCWlmICh0ZXN0X2JpdChFVl9TTkQsIGhhbmRsZS0+ZGV2LT5ldmJpdCkpIHsKIAkJCQlpZiAodGVzdF9iaXQoU05EX1RPTkUsIGhhbmRsZS0+ZGV2LT5zbmRiaXQpKSB7CkBAIC0zMzgsMTkgKzMzNywxOSBAQAogCWlmIChjIDwgMHg4MCkKIAkJLyogIDAqKioqKioqICovCiAJCXB1dF9xdWV1ZSh2YywgYyk7Ci0gICAgCWVsc2UgaWYgKGMgPCAweDgwMCkgeworCWVsc2UgaWYgKGMgPCAweDgwMCkgewogCQkvKiAxMTAqKioqKiAxMCoqKioqKiAqLwotCQlwdXRfcXVldWUodmMsIDB4YzAgfCAoYyA+PiA2KSk7IAorCQlwdXRfcXVldWUodmMsIDB4YzAgfCAoYyA+PiA2KSk7CiAJCXB1dF9xdWV1ZSh2YywgMHg4MCB8IChjICYgMHgzZikpOwotICAgIAl9IGVsc2UgeworCX0gZWxzZSB7CiAJCS8qIDExMTAqKioqIDEwKioqKioqIDEwKioqKioqICovCiAJCXB1dF9xdWV1ZSh2YywgMHhlMCB8IChjID4+IDEyKSk7CiAJCXB1dF9xdWV1ZSh2YywgMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpKTsKIAkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKGMgJiAweDNmKSk7Ci0gICAgCX0KKwl9CiB9CiAKLS8qIAorLyoKICAqIENhbGxlZCBhZnRlciByZXR1cm5pbmcgZnJvbSBSQVcgbW9kZSBvciB3aGVuIGNoYW5naW5nIGNvbnNvbGVzIC0gcmVjb21wdXRlCiAgKiBzaGlmdF9kb3duW10gYW5kIHNoaWZ0X3N0YXRlIGZyb20ga2V5X2Rvd25bXSBtYXliZSBjYWxsZWQgd2hlbiBrZXltYXAgaXMKICAqIHVuZGVmaW5lZCwgc28gdGhhdCBzaGlmdGtleSByZWxlYXNlIGlzIHNlZW4KQEAgLTM2MSw3ICszNjAsNyBAQAogCiAJc2hpZnRfc3RhdGUgPSAwOwogCW1lbXNldChzaGlmdF9kb3duLCAwLCBzaXplb2Yoc2hpZnRfZG93bikpOwotCQorCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoa2V5X2Rvd24pOyBpKyspIHsKIAogCQlpZiAoIWtleV9kb3duW2ldKQpAQCAtNTAwLDkgKzQ5OSw5IEBACiAJaWYgKHdhbnRfY29uc29sZSAhPSAtMSkKIAkJY3VyID0gd2FudF9jb25zb2xlOwogCi0JZm9yIChpID0gY3VyLTE7IGkgIT0gY3VyOyBpLS0pIHsKKwlmb3IgKGkgPSBjdXIgLSAxOyBpICE9IGN1cjsgaS0tKSB7CiAJCWlmIChpID09IC0xKQotCQkJaSA9IE1BWF9OUl9DT05TT0xFUy0xOworCQkJaSA9IE1BWF9OUl9DT05TT0xFUyAtIDE7CiAJCWlmICh2Y19jb25zX2FsbG9jYXRlZChpKSkKIAkJCWJyZWFrOwogCX0KQEAgLTU2OCw5ICs1NjcsOSBAQAogCiBzdGF0aWMgdm9pZCBmbl9zcGF3bl9jb24oc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSAgICAgICAgaWYgKHNwYXducGlkKQotCSAgIGlmKGtpbGxfcHJvYyhzcGF3bnBpZCwgc3Bhd25zaWcsIDEpKQotCSAgICAgc3Bhd25waWQgPSAwOworCWlmIChzcGF3bnBpZCkKKwkJaWYgKGtpbGxfcHJvYyhzcGF3bnBpZCwgc3Bhd25zaWcsIDEpKQorCQkJc3Bhd25waWQgPSAwOwogfQogCiBzdGF0aWMgdm9pZCBmbl9TQUsoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTYwNCw4ICs2MDMsOCBAQAogCQlyZXR1cm47CiAJaWYgKHZhbHVlID49IEFSUkFZX1NJWkUoZm5faGFuZGxlcikpCiAJCXJldHVybjsKLQlpZiAoKGtiZC0+a2JkbW9kZSA9PSBWQ19SQVcgfHwgCi0JICAgICBrYmQtPmtiZG1vZGUgPT0gVkNfTUVESVVNUkFXKSAmJiAKKwlpZiAoKGtiZC0+a2JkbW9kZSA9PSBWQ19SQVcgfHwKKwkgICAgIGtiZC0+a2JkbW9kZSA9PSBWQ19NRURJVU1SQVcpICYmCiAJICAgICB2YWx1ZSAhPSBLVkFMKEtfU0FLKSkKIAkJcmV0dXJuOwkJLyogU0FLIGlzIGFsbG93ZWQgZXZlbiBpbiByYXcgbW9kZSAqLwogCWZuX2hhbmRsZXJbdmFsdWVdKHZjLCByZWdzKTsKQEAgLTg5NSwxMSArODk0LDExIEBACiAKIHN0YXRpYyB2b2lkIGtiZF9iaCh1bnNpZ25lZCBsb25nIGR1bW15KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7CiAJdW5zaWduZWQgY2hhciBsZWRzID0gZ2V0bGVkcygpOwogCiAJaWYgKGxlZHMgIT0gbGVkc3RhdGUpIHsKLQkJbGlzdF9mb3JfZWFjaChub2RlLCZrYmRfaGFuZGxlci5oX2xpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaChub2RlLCAma2JkX2hhbmRsZXIuaF9saXN0KSB7CiAJCQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICogaGFuZGxlID0gdG9faGFuZGxlX2gobm9kZSk7CiAJCQlpbnB1dF9ldmVudChoYW5kbGUtPmRldiwgRVZfTEVELCBMRURfU0NST0xMTCwgISEobGVkcyAmIDB4MDEpKTsKIAkJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9MRUQsIExFRF9OVU1MLCAgICAhIShsZWRzICYgMHgwMikpOwpAQCAtOTY0LDExICs5NjMsMTEgQEAKIGV4dGVybiB2b2lkIHN1bl9kb19icmVhayh2b2lkKTsKICNlbmRpZgogCi1zdGF0aWMgaW50IGVtdWxhdGVfcmF3KHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IGtleWNvZGUsIAorc3RhdGljIGludCBlbXVsYXRlX3JhdyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGludCBrZXljb2RlLAogCQkgICAgICAgdW5zaWduZWQgY2hhciB1cF9mbGFnKQogewogCWlmIChrZXljb2RlID4gMjU1IHx8ICF4ODZfa2V5Y29kZXNba2V5Y29kZV0pCi0JCXJldHVybiAtMTsgCisJCXJldHVybiAtMTsKIAogCXN3aXRjaCAoa2V5Y29kZSkgewogCQljYXNlIEtFWV9QQVVTRToKQEAgLTk4Miw3ICs5ODEsNyBAQAogCQljYXNlIEtFWV9IQU5KQToKIAkJCWlmICghdXBfZmxhZykgcHV0X3F1ZXVlKHZjLCAweGYyKTsKIAkJCXJldHVybiAwOwotCX0gCisJfQogCiAJaWYgKGtleWNvZGUgPT0gS0VZX1NZU1JRICYmIHN5c3JxX2FsdCkgewogCQlwdXRfcXVldWUodmMsIDB4NTQgfCB1cF9mbGFnKTsKQEAgLTExMDUsMTEgKzExMDQsMTIgQEAKIAllbHNlCiAJCWNsZWFyX2JpdChrZXljb2RlLCBrZXlfZG93bik7CiAKLQlpZiAocmVwICYmICghdmNfa2JkX21vZGUoa2JkLCBWQ19SRVBFQVQpIHx8ICh0dHkgJiYgCi0JCSghTF9FQ0hPKHR0eSkgJiYgdHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcih0dHkpKSkpKSB7CisJaWYgKHJlcCAmJgorCSAgICAoIXZjX2tiZF9tb2RlKGtiZCwgVkNfUkVQRUFUKSB8fAorCSAgICAgKHR0eSAmJiAhTF9FQ0hPKHR0eSkgJiYgdHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcih0dHkpKSkpIHsKIAkJLyoKIAkJICogRG9uJ3QgcmVwZWF0IGEga2V5IGlmIHRoZSBpbnB1dCBidWZmZXJzIGFyZSBub3QgZW1wdHkgYW5kIHRoZQotCQkgKiBjaGFyYWN0ZXJzIGdldCBhcmVuJ3QgZWNob2VkIGxvY2FsbHkuIFRoaXMgbWFrZXMga2V5IHJlcGVhdCAKKwkJICogY2hhcmFjdGVycyBnZXQgYXJlbid0IGVjaG9lZCBsb2NhbGx5LiBUaGlzIG1ha2VzIGtleSByZXBlYXQKIAkJICogdXNhYmxlIHdpdGggc2xvdyBhcHBsaWNhdGlvbnMgYW5kIHVuZGVyIGhlYXZ5IGxvYWRzLgogCQkgKi8KIAkJcmV0dXJuOwpAQCAtMTEzMSw3ICsxMTMxLDggQEAKIAl0eXBlID0gS1RZUChrZXlzeW0pOwogCiAJaWYgKHR5cGUgPCAweGYwKSB7Ci0JCWlmIChkb3duICYmICFyYXdfbW9kZSkgdG9fdXRmOCh2Yywga2V5c3ltKTsKKwkJaWYgKGRvd24gJiYgIXJhd19tb2RlKQorCQkJdG9fdXRmOCh2Yywga2V5c3ltKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTE1NSw3ICsxMTU2LDcgQEAKIAkJa2JkLT5zbG9ja3N0YXRlID0gMDsKIH0KIAotc3RhdGljIHZvaWQga2JkX2V2ZW50KHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSwgdW5zaWduZWQgaW50IGV2ZW50X3R5cGUsIAorc3RhdGljIHZvaWQga2JkX2V2ZW50KHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSwgdW5zaWduZWQgaW50IGV2ZW50X3R5cGUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBldmVudF9jb2RlLCBpbnQgdmFsdWUpCiB7CiAJaWYgKGV2ZW50X3R5cGUgPT0gRVZfTVNDICYmIGV2ZW50X2NvZGUgPT0gTVNDX1JBVyAmJiBIV19SQVcoaGFuZGxlLT5kZXYpKQpAQCAtMTE2NywxNSArMTE2OCwxMyBAQAogCXNjaGVkdWxlX2NvbnNvbGVfY2FsbGJhY2soKTsKIH0KIAotc3RhdGljIGNoYXIga2JkX25hbWVbXSA9ICJrYmQiOwotCiAvKgogICogV2hlbiBhIGtleWJvYXJkIChvciBvdGhlciBpbnB1dCBkZXZpY2UpIGlzIGZvdW5kLCB0aGUga2JkX2Nvbm5lY3QKICAqIGZ1bmN0aW9uIGlzIGNhbGxlZC4gVGhlIGZ1bmN0aW9uIHRoZW4gbG9va3MgYXQgdGhlIGRldmljZSwgYW5kIGlmIGl0CiAgKiBsaWtlcyBpdCwgaXQgY2FuIG9wZW4gaXQgYW5kIGdldCBldmVudHMgZnJvbSBpdC4gSW4gdGhpcyAoa2JkX2Nvbm5lY3QpCiAgKiBmdW5jdGlvbiwgd2Ugc2hvdWxkIGRlY2lkZSB3aGljaCBWVCB0byBiaW5kIHRoYXQga2V5Ym9hcmQgdG8gaW5pdGlhbGx5LgogICovCi1zdGF0aWMgc3RydWN0IGlucHV0X2hhbmRsZSAqa2JkX2Nvbm5lY3Qoc3RydWN0IGlucHV0X2hhbmRsZXIgKmhhbmRsZXIsIAorc3RhdGljIHN0cnVjdCBpbnB1dF9oYW5kbGUgKmtiZF9jb25uZWN0KHN0cnVjdCBpbnB1dF9oYW5kbGVyICpoYW5kbGVyLAogCQkJCQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCiAJCQkJCXN0cnVjdCBpbnB1dF9kZXZpY2VfaWQgKmlkKQogewpAQCAtMTE4MywxOCArMTE4MiwxOSBAQAogCWludCBpOwogCiAJZm9yIChpID0gS0VZX1JFU0VSVkVEOyBpIDwgQlROX01JU0M7IGkrKykKLQkJaWYgKHRlc3RfYml0KGksIGRldi0+a2V5Yml0KSkgYnJlYWs7CisJCWlmICh0ZXN0X2JpdChpLCBkZXYtPmtleWJpdCkpCisJCQlicmVhazsKIAotCWlmICgoaSA9PSBCVE5fTUlTQykgJiYgIXRlc3RfYml0KEVWX1NORCwgZGV2LT5ldmJpdCkpIAorCWlmIChpID09IEJUTl9NSVNDICYmICF0ZXN0X2JpdChFVl9TTkQsIGRldi0+ZXZiaXQpKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmICghKGhhbmRsZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnB1dF9oYW5kbGUpLCBHRlBfS0VSTkVMKSkpIAorCWlmICghKGhhbmRsZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnB1dF9oYW5kbGUpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiBOVUxMOwogCW1lbXNldChoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3QgaW5wdXRfaGFuZGxlKSk7CiAKIAloYW5kbGUtPmRldiA9IGRldjsKIAloYW5kbGUtPmhhbmRsZXIgPSBoYW5kbGVyOwotCWhhbmRsZS0+bmFtZSA9IGtiZF9uYW1lOworCWhhbmRsZS0+bmFtZSA9ICJrYmQiOwogCiAJaW5wdXRfb3Blbl9kZXZpY2UoaGFuZGxlKTsKIAlrYmRfcmVmcmVzaF9sZWRzKGhhbmRsZSk7CkBAIC0xMjEzLDExICsxMjEzLDExIEBACiAgICAgICAgICAgICAgICAgLmZsYWdzID0gSU5QVVRfREVWSUNFX0lEX01BVENIX0VWQklULAogICAgICAgICAgICAgICAgIC5ldmJpdCA9IHsgQklUKEVWX0tFWSkgfSwKICAgICAgICAgfSwKLQkKKwogCXsKICAgICAgICAgICAgICAgICAuZmxhZ3MgPSBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfRVZCSVQsCiAgICAgICAgICAgICAgICAgLmV2Yml0ID0geyBCSVQoRVZfU05EKSB9LAotICAgICAgICB9LAkKKyAgICAgICAgfSwKIAogCXsgfSwgICAgLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbGNkLmMgYi9kcml2ZXJzL2NoYXIvbGNkLmMKaW5kZXggY2YwMWE3Mi4uYjc3MTYxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2xjZC5jCisrKyBiL2RyaXZlcnMvY2hhci9sY2QuYwpAQCAtNjEzLDEwICs2MTMsMTUgQEAKIAogc3RhdGljIGludCBsY2RfaW5pdCh2b2lkKQogeworCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBkYXRhOwogCiAJcHJfaW5mbygiJXNcbiIsIExDRF9EUklWRVIpOwotCW1pc2NfcmVnaXN0ZXIoJmxjZF9kZXYpOworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmxjZF9kZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBMQ0QgIlVuYWJsZSB0byByZWdpc3RlciBtaXNjIGRldmljZS5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KIAogCS8qIENoZWNrIHJlZ2lvbj8gTmFhYWghIEp1c3Qgc25hcmYgaXQgdXAuICovCiAvKglyZXF1ZXN0X3JlZ2lvbihSVENfUE9SVCgwKSwgUlRDX0lPX0VYVEVOVCwgImxjZCIpOyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbHAuYyBiL2RyaXZlcnMvY2hhci9scC5jCmluZGV4IDU5ZWViZTUuLjJhZmI5MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9scC5jCisrKyBiL2RyaXZlcnMvY2hhci9scC5jCkBAIC0xMjgsNiArMTI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KICN1bmRlZiBMUF9TVEFUUwpAQCAtMzA3LDcgKzMwOCw3IEBACiAJCQkoTFBfRihtaW5vcikgJiBMUF9BQk9SVCkpOwogCiAjaWZkZWYgTFBfU1RBVFMKLQlpZiAoamlmZmllcy1scF90YWJsZVttaW5vcl0ubGFzdGNhbGwgPiBMUF9USU1FKG1pbm9yKSkKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBscF90YWJsZVttaW5vcl0ubGFzdGNhbGwgKyBMUF9USU1FKG1pbm9yKSkpCiAJCWxwX3RhYmxlW21pbm9yXS5ydW5jaGFycyA9IDA7CiAKIAlscF90YWJsZVttaW5vcl0ubGFzdGNhbGwgPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21iY3MuYyBiL2RyaXZlcnMvY2hhci9tYmNzLmMKaW5kZXggMTE1ZGJiMy4uM2ZhNjRjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21iY3MuYworKysgYi9kcml2ZXJzL2NoYXIvbWJjcy5jCkBAIC03NTAsNyArNzUwLDcgQEAKIAogCWRldi0+c29mdCA9IE5VTEw7CiAKLQlzb2Z0ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG1iY3Nfc29mdCksIEdGUF9LRVJORUwpOworCXNvZnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWJjc19zb2Z0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNvZnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCA4NTBhNzhjLi5mMTgyNzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC0zNSwxMCArMzUsNiBAQAogIyBpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfUzM5MF9UQVBFKSAmJiBkZWZpbmVkKENPTkZJR19TMzkwX1RBUEVfQ0hBUikKLWV4dGVybiB2b2lkIHRhcGVjaGFyX2luaXQodm9pZCk7Ci0jZW5kaWYKLQogLyoKICAqIEFyY2hpdGVjdHVyZXMgdmFyeSBpbiBob3cgdGhleSBoYW5kbGUgY2FjaGluZyBmb3IgYWRkcmVzc2VzCiAgKiBvdXRzaWRlIG9mIG1haW4gbWVtb3J5LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21pc2MuYyBiL2RyaXZlcnMvY2hhci9taXNjLmMKaW5kZXggOTMxZWZkNS4uMGM4Mzc1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21pc2MuYworKysgYi9kcml2ZXJzL2NoYXIvbWlzYy5jCkBAIC02Myw4ICs2Myw2IEBACiAjZGVmaW5lIERZTkFNSUNfTUlOT1JTIDY0IC8qIGxpa2UgZHluYW1pYyBtYWpvcnMgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIG1pc2NfbWlub3JzW0RZTkFNSUNfTUlOT1JTIC8gOF07CiAKLWV4dGVybiBpbnQgcnRjX0RQODU3MEFfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgcnRjX01LNDhUMDhfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgcG11X2RldmljZV9pbml0KHZvaWQpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKQEAgLTMwMywxMiArMzAxLDcgQEAKIAltaXNjX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAibWlzYyIpOwogCWlmIChJU19FUlIobWlzY19jbGFzcykpCiAJCXJldHVybiBQVFJfRVJSKG1pc2NfY2xhc3MpOwotI2lmZGVmIENPTkZJR19NVk1FMTZ4Ci0JcnRjX01LNDhUMDhfaW5pdCgpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JWTUU2MDAwCi0JcnRjX0RQODU3MEFfaW5pdCgpOwotI2VuZGlmCisKIAlpZiAocmVnaXN0ZXJfY2hyZGV2KE1JU0NfTUFKT1IsIm1pc2MiLCZtaXNjX2ZvcHMpKSB7CiAJCXByaW50aygidW5hYmxlIHRvIGdldCBtYWpvciAlZCBmb3IgbWlzYyBkZXZpY2VzXG4iLAogCQkgICAgICAgTUlTQ19NQUpPUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbW94YS5jIGIvZHJpdmVycy9jaGFyL21veGEuYwppbmRleCA5NWY3MDQ2Li43OWU0OTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbW94YS5jCisrKyBiL2RyaXZlcnMvY2hhci9tb3hhLmMKQEAgLTMzOSw3ICszMzksNyBAQAogCiAJaW5pdF9NVVRFWCgmbW94YUJ1ZmZTZW0pOwogCW1veGFEcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JbW94YURyaXZlci0+bmFtZSA9ICJ0dHlhIjsKKwltb3hhRHJpdmVyLT5uYW1lID0gInR0eU1YIjsKIAltb3hhRHJpdmVyLT5kZXZmc19uYW1lID0gInR0cy9hIjsKIAltb3hhRHJpdmVyLT5tYWpvciA9IHR0eW1ham9yOwogCW1veGFEcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmMgYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jCmluZGV4IGQ1Njg5OTEuLjg2NjYxNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmMKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYwpAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSAic21hcGkuaCIKICNpbmNsdWRlICJtd2F2ZWRkLmgiCiAjaW5jbHVkZSAiMzc4MGkuaCIKQEAgLTQxMCw4ICs0MTEsOCBAQAogCiBzdGF0aWMgaW50IHJlZ2lzdGVyX3NlcmlhbF9wb3J0YW5kaXJxKHVuc2lnbmVkIGludCBwb3J0LCBpbnQgaXJxKQogewotCXN0cnVjdCBzZXJpYWxfc3RydWN0IHNlcmlhbDsKLQorCXN0cnVjdCB1YXJ0X3BvcnQgdWFydDsKKwkKIAlzd2l0Y2ggKCBwb3J0ICkgewogCQljYXNlIDB4M2Y4OgogCQljYXNlIDB4MmY4OgpAQCAtNDQyLDEyICs0NDMsMTQgQEAKIAl9IC8qIHN3aXRjaCAqLwogCS8qIGlycSBpcyBva2F5ICovCiAKLQltZW1zZXQoJnNlcmlhbCwgMCwgc2l6ZW9mKHNlcmlhbCkpOwotCXNlcmlhbC5wb3J0ID0gcG9ydDsKLQlzZXJpYWwuaXJxID0gaXJxOwotCXNlcmlhbC5mbGFncyA9IEFTWU5DX1NIQVJFX0lSUTsKLQotCXJldHVybiByZWdpc3Rlcl9zZXJpYWwoJnNlcmlhbCk7CisJbWVtc2V0KCZ1YXJ0LCAwLCBzaXplb2Yoc3RydWN0IHVhcnRfcG9ydCkpOworCQorCXVhcnQudWFydGNsayA9ICAxODQzMjAwOworCXVhcnQuaW9iYXNlID0gcG9ydDsKKwl1YXJ0LmlycSA9IGlycTsKKwl1YXJ0LmlvdHlwZSA9IFVQSU9fUE9SVDsKKwl1YXJ0LmZsYWdzID0gIFVQRl9TSEFSRV9JUlE7CisJcmV0dXJuIHNlcmlhbDgyNTBfcmVnaXN0ZXJfcG9ydCgmdWFydCk7CiB9CiAKIApAQCAtNTIzLDcgKzUyNiw3IEBACiAjZW5kaWYKIAogCWlmICggcERydkRhdGEtPnNMaW5lID49IDAgKSB7Ci0JCXVucmVnaXN0ZXJfc2VyaWFsKHBEcnZEYXRhLT5zTGluZSk7CisJCXNlcmlhbDgyNTBfdW5yZWdpc3Rlcl9wb3J0KHBEcnZEYXRhLT5zTGluZSk7CiAJfQogCWlmIChwRHJ2RGF0YS0+Yk13YXZlRGV2UmVnaXN0ZXJlZCkgewogCQltaXNjX2RlcmVnaXN0ZXIoJm13YXZlX21pc2NfZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9teHNlci5jIGIvZHJpdmVycy9jaGFyL214c2VyLmMKaW5kZXggZjAyMmYwOS4uNDVkMDEyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL214c2VyLmMKKysrIGIvZHJpdmVycy9jaGFyL214c2VyLmMKQEAgLTYzLDcgKzYzLDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTEwNTksOCArMTA1OCw3IEBACiAJCSAqLwogCQl0aW1lb3V0ID0gamlmZmllcyArIEhaOwogCQl3aGlsZSAoIShpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dCg1KTsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSg1KTsKIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xMDgxLDEwICsxMDc5LDggQEAKIAlpbmZvLT5ldmVudCA9IDA7CiAJaW5mby0+dHR5ID0gTlVMTDsKIAlpZiAoaW5mby0+YmxvY2tlZF9vcGVuKSB7Ci0JCWlmIChpbmZvLT5jbG9zZV9kZWxheSkgewotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoaW5mby0+Y2xvc2VfZGVsYXkpOwotCQl9CisJCWlmIChpbmZvLT5jbG9zZV9kZWxheSkKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShpbmZvLT5jbG9zZV9kZWxheSk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKIAl9CiAKQEAgLTE4MDIsOCArMTc5OCw3IEBACiAjaWZkZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAogCQlwcmludGsoImxzciA9ICVkIChqaWZmPSVsdSkuLi4iLCBsc3IsIGppZmZpZXMpOwogI2VuZGlmCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoY2hhcl90aW1lKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGNoYXJfdGltZSk7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwogCQlpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIHRpbWVvdXQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL25fdHR5LmMgYi9kcml2ZXJzL2NoYXIvbl90dHkuYwppbmRleCAwOTEwM2IzLi5jOWJkZjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbl90dHkuYworKysgYi9kcml2ZXJzL2NoYXIvbl90dHkuYwpAQCAtNjIsNyArNjIsNyBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKmFsbG9jX2J1Zih2b2lkKQogewotCWludCBwcmlvID0gaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTDsKKwl1bnNpZ25lZCBpbnQgcHJpbyA9IGluX2ludGVycnVwdCgpID8gR0ZQX0FUT01JQyA6IEdGUF9LRVJORUw7CiAKIAlpZiAoUEFHRV9TSVpFICE9IE5fVFRZX0JVRl9TSVpFKQogCQlyZXR1cm4ga21hbGxvYyhOX1RUWV9CVUZfU0laRSwgcHJpbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKaW5kZXggN2EwYzc0NjQuLjAyZDdmMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogbGludXgvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCiAgKgotICogJElkOiBzeW5jbGlua19jcy5jLHYgNC4yNiAyMDA0LzA4LzExIDE5OjMwOjAyIHBhdWxrZiBFeHAgJAorICogJElkOiBzeW5jbGlua19jcy5jLHYgNC4zNCAyMDA1LzA5LzA4IDEzOjIwOjU0IHBhdWxrZiBFeHAgJAogICoKICAqIERldmljZSBkcml2ZXIgZm9yIE1pY3JvZ2F0ZSBTeW5jTGluayBQQyBDYXJkCiAgKiBtdWx0aXByb3RvY29sIHNlcmlhbCBhZGFwdGVyLgpAQCAtNDcyLDcgKzQ3Miw3IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJTeW5jTGluayBQQyBDYXJkIGRyaXZlciI7Ci1zdGF0aWMgY2hhciAqZHJpdmVyX3ZlcnNpb24gPSAiJFJldmlzaW9uOiA0LjI2ICQiOworc3RhdGljIGNoYXIgKmRyaXZlcl92ZXJzaW9uID0gIiRSZXZpc2lvbjogNC4zNCAkIjsKIAogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpzZXJpYWxfZHJpdmVyOwogCkBAIC0xNDU3LDYgKzE0NTcsOCBAQAogCiAJaW5mby0+cGVuZGluZ19iaCA9IDA7CiAJCisJbWVtc2V0KCZpbmZvLT5pY291bnQsIDAsIHNpemVvZihpbmZvLT5pY291bnQpKTsKKwogCWluaXRfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsKIAlpbmZvLT50eF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKIAlpbmZvLT50eF90aW1lci5mdW5jdGlvbiA9IHR4X3RpbWVvdXQ7CkBAIC0xOTQ2LDkgKzE5NDgsMTMgQEAKIAlpbnQgZXJyOwogCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQogCQlwcmludGsoImdldF9wYXJhbXMoJXMpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSk7Ci0JQ09QWV9UT19VU0VSKGVycix1c2VyX2ljb3VudCwgJmluZm8tPmljb3VudCwgc2l6ZW9mKHN0cnVjdCBtZ3NsX2ljb3VudCkpOwotCWlmIChlcnIpCi0JCXJldHVybiAtRUZBVUxUOworCWlmICghdXNlcl9pY291bnQpIHsKKwkJbWVtc2V0KCZpbmZvLT5pY291bnQsIDAsIHNpemVvZihpbmZvLT5pY291bnQpKTsKKwl9IGVsc2UgeworCQlDT1BZX1RPX1VTRVIoZXJyLCB1c2VyX2ljb3VudCwgJmluZm8tPmljb3VudCwgc2l6ZW9mKHN0cnVjdCBtZ3NsX2ljb3VudCkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcHR5LmMgYi9kcml2ZXJzL2NoYXIvcHR5LmMKaW5kZXggZGEzMjg4OS4uNDlmMzk5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3B0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9wdHkuYwpAQCAtMTQ5LDE1ICsxNDksMTQgQEAKIHN0YXRpYyBpbnQgcHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0byA9IHR0eS0+bGluazsKLQlzc2l6ZV90ICgqY2hhcnNfaW5fYnVmZmVyKShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKIAlpbnQgY291bnQ7CiAKIAkvKiBXZSBzaG91bGQgZ2V0IHRoZSBsaW5lIGRpc2NpcGxpbmUgbG9jayBmb3IgInR0eS0+bGluayIgKi8KLQlpZiAoIXRvIHx8ICEoY2hhcnNfaW5fYnVmZmVyID0gdG8tPmxkaXNjLmNoYXJzX2luX2J1ZmZlcikpCisJaWYgKCF0byB8fCAhdG8tPmxkaXNjLmNoYXJzX2luX2J1ZmZlcikKIAkJcmV0dXJuIDA7CiAKIAkvKiBUaGUgbGRpc2MgbXVzdCByZXBvcnQgMCBpZiBubyBjaGFyYWN0ZXJzIGF2YWlsYWJsZSB0byBiZSByZWFkICovCi0JY291bnQgPSBjaGFyc19pbl9idWZmZXIodG8pOworCWNvdW50ID0gdG8tPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0byk7CiAKIAlpZiAodHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfU0xBVkUpIHJldHVybiBjb3VudDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3J0Yy5jIGIvZHJpdmVycy9jaGFyL3J0Yy5jCmluZGV4IGNkNGZlOGIuLjYzZmZmN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9ydGMuYworKysgYi9kcml2ZXJzL2NoYXIvcnRjLmMKQEAgLTkzOCwxMCArOTM4LDkgQEAKIAogCS8qCiAJICogWFhYIEludGVycnVwdCBwaW4gIzcgaW4gRXNwcmVzc28gaXMgc2hhcmVkIGJldHdlZW4gUlRDIGFuZAotCSAqIFBDSSBTbG90IDIgSU5UQSMgKGFuZCBzb21lIElOVHgjIGluIFNsb3QgMSkuIFNBX0lOVEVSUlVQVCBoZXJlCi0JICogaXMgYXNraW5nIGZvciB0cm91YmxlIHdpdGggYWRkLW9uIGJvYXJkcy4gQ2hhbmdlIHRvIFNBX1NISVJRLgorCSAqIFBDSSBTbG90IDIgSU5UQSMgKGFuZCBzb21lIElOVHgjIGluIFNsb3QgMSkuCiAJICovCi0JaWYgKHJlcXVlc3RfaXJxKHJ0Y19pcnEsIHJ0Y19pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgInJ0YyIsICh2b2lkICopJnJ0Y19wb3J0KSkgeworCWlmIChyZXF1ZXN0X2lycShydGNfaXJxLCBydGNfaW50ZXJydXB0LCBTQV9TSElSUSwgInJ0YyIsICh2b2lkICopJnJ0Y19wb3J0KSkgewogCQkvKgogCQkgKiBTdGFuZGFyZCB3YXkgZm9yIHNwYXJjIHRvIHByaW50IGlycSdzIGlzIHRvIHVzZQogCQkgKiBfX2lycV9pdG9hKCkuIEkgdGhpbmsgZm9yIEVCdXMgaXQncyBvayB0byB1c2UgJWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc25zY19ldmVudC5jIGIvZHJpdmVycy9jaGFyL3Nuc2NfZXZlbnQuYwppbmRleCBkNjkyYWY1Li5iYWFhMzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc25zY19ldmVudC5jCisrKyBiL2RyaXZlcnMvY2hhci9zbnNjX2V2ZW50LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9nZW5lcmljLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlICJzbnNjLmgiCiAKIHN0YXRpYyBzdHJ1Y3Qgc3ViY2hfZGF0YV9zICpldmVudF9zZDsKQEAgLTYyLDEzICs2MywxNiBAQAogc2NkcnZfcGFyc2VfZXZlbnQoY2hhciAqZXZlbnQsIGludCAqc3JjLCBpbnQgKmNvZGUsIGludCAqZXNwX2NvZGUsIGNoYXIgKmRlc2MpCiB7CiAJY2hhciAqZGVzY19lbmQ7CisJX19iZTMyIGZyb21fYnVmOwogCiAJLyogcmVjb3JkIGV2ZW50IHNvdXJjZSBhZGRyZXNzICovCi0JKnNyYyA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopZXZlbnQpOworCWZyb21fYnVmID0gZ2V0X3VuYWxpZ25lZCgoX19iZTMyICopZXZlbnQpOworCSpzcmMgPSBiZTMyX3RvX2NwdXAoJmZyb21fYnVmKTsKIAlldmVudCArPSA0OyAJCQkvKiBtb3ZlIG9uIHRvIGV2ZW50IGNvZGUgKi8KIAogCS8qIHJlY29yZCB0aGUgc3lzdGVtIGNvbnRyb2xsZXIncyBldmVudCBjb2RlICovCi0JKmNvZGUgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKWV2ZW50KTsKKwlmcm9tX2J1ZiA9IGdldF91bmFsaWduZWQoKF9fYmUzMiAqKWV2ZW50KTsKKwkqY29kZSA9IGJlMzJfdG9fY3B1cCgmZnJvbV9idWYpOwogCWV2ZW50ICs9IDQ7CQkJLyogbW92ZSBvbiB0byBldmVudCBhcmd1bWVudHMgKi8KIAogCS8qIGhvdyBtYW55IGFyZ3VtZW50cyBhcmUgaW4gdGhlIHBhY2tldD8gKi8KQEAgLTgyLDcgKzg2LDggQEAKIAkJLyogbm90IGFuIGludGVnZXIgYXJndW1lbnQsIHNvIGdpdmUgdXAgKi8KIAkJcmV0dXJuIC0xOwogCX0KLQkqZXNwX2NvZGUgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKWV2ZW50KTsKKwlmcm9tX2J1ZiA9IGdldF91bmFsaWduZWQoKF9fYmUzMiAqKWV2ZW50KTsKKwkqZXNwX2NvZGUgPSBiZTMyX3RvX2NwdXAoJmZyb21fYnVmKTsKIAlldmVudCArPSA0OwogCiAJLyogcGFyc2Ugb3V0IHRoZSBldmVudCBkZXNjcmlwdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NvbnlwaS5jIGIvZHJpdmVycy9jaGFyL3NvbnlwaS5jCmluZGV4IGNlZmJlOTguLjM2YWU5YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zb255cGkuYworKysgYi9kcml2ZXJzL2NoYXIvc29ueXBpLmMKQEAgLTk4LDEyICs5OCwxMyBAQAogCiAjZGVmaW5lIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEJMQogI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyCTIKKyNkZWZpbmUgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMwkzCiAKIC8qIHR5cGUxIG1vZGVscyB1c2UgdGhvc2UgKi8KICNkZWZpbmUgU09OWVBJX0lSUV9QT1JUCQkJMHg4MDM0CiAjZGVmaW5lIFNPTllQSV9JUlFfU0hJRlQJCTIyCi0jZGVmaW5lIFNPTllQSV9CQVNFCQkJMHg1MAotI2RlZmluZSBTT05ZUElfRzEwQQkJCShTT05ZUElfQkFTRSsweDE0KQorI2RlZmluZSBTT05ZUElfVFlQRTFfQkFTRQkJMHg1MAorI2RlZmluZSBTT05ZUElfRzEwQQkJCShTT05ZUElfVFlQRTFfQkFTRSsweDE0KQogI2RlZmluZSBTT05ZUElfVFlQRTFfUkVHSU9OX1NJWkUJMHgwOAogI2RlZmluZSBTT05ZUElfVFlQRTFfRVZUWVBFX09GRlNFVAkweDA0CiAKQEAgLTExNCw2ICsxMTUsMTMgQEAKICNkZWZpbmUgU09OWVBJX1RZUEUyX1JFR0lPTl9TSVpFCTB4MjAKICNkZWZpbmUgU09OWVBJX1RZUEUyX0VWVFlQRV9PRkZTRVQJMHgxMgogCisvKiB0eXBlMyBzZXJpZXMgc3BlY2lmaWNzICovCisjZGVmaW5lIFNPTllQSV9UWVBFM19CQVNFCQkweDQwCisjZGVmaW5lIFNPTllQSV9UWVBFM19HSUQyCQkoU09OWVBJX1RZUEUzX0JBU0UrMHg0OCkgLyogMTYgYml0cyAqLworI2RlZmluZSBTT05ZUElfVFlQRTNfTUlTQwkJKFNPTllQSV9UWVBFM19CQVNFKzB4NmQpIC8qIDggYml0cyAgKi8KKyNkZWZpbmUgU09OWVBJX1RZUEUzX1JFR0lPTl9TSVpFCTB4MjAKKyNkZWZpbmUgU09OWVBJX1RZUEUzX0VWVFlQRV9PRkZTRVQJMHgxMgorCiAvKiBiYXR0ZXJ5IC8gYnJpZ2h0bmVzcyBhZGRyZXNzZXMgKi8KICNkZWZpbmUgU09OWVBJX0JBVF9GTEFHUwkweDgxCiAjZGVmaW5lIFNPTllQSV9MQ0RfTElHSFQJMHg5NgpAQCAtMTU5LDYgKzE2NywxMCBAQAogCXsgMHgwLCAweDAgfQogfTsKIAorLyogc2FtZSBhcyBpbiB0eXBlIDIgbW9kZWxzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCAqc29ueXBpX3R5cGUzX2lvcG9ydF9saXN0ID0KKwlzb255cGlfdHlwZTJfaW9wb3J0X2xpc3Q7CisKIC8qIFRoZSBzZXQgb2YgcG9zc2libGUgaW50ZXJydXB0cyAqLwogc3RydWN0IHNvbnlwaV9pcnFfbGlzdCB7CiAJdTE2CWlycTsKQEAgLTE4MCw2ICsxOTIsOSBAQAogCXsgIDAsIDB4MDAgfQkvKiBubyBJUlEsIDB4MDAgaW4gU0lSUSBpbiBBTUwgKi8KIH07CiAKKy8qIHNhbWUgYXMgaW4gdHlwZTIgbW9kZWxzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9pcnFfbGlzdCAqc29ueXBpX3R5cGUzX2lycV9saXN0ID0gc29ueXBpX3R5cGUyX2lycV9saXN0OworCiAjZGVmaW5lIFNPTllQSV9DQU1FUkFfQlJJR0hUTkVTUwkJMAogI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRSQVNUCQkJMQogI2RlZmluZSBTT05ZUElfQ0FNRVJBX0hVRQkJCTIKQEAgLTIyMyw2ICsyMzgsNyBAQAogI2RlZmluZSBTT05ZUElfTUVZRV9NQVNLCQkJMHgwMDAwMDQwMAogI2RlZmluZSBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSwkJCTB4MDAwMDA4MDAKICNkZWZpbmUgU09OWVBJX0JBVFRFUllfTUFTSwkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgU09OWVBJX1dJUkVMRVNTX01BU0sJCQkweDAwMDAyMDAwCiAKIHN0cnVjdCBzb255cGlfZXZlbnQgewogCXU4CWRhdGE7CkBAIC0zMDUsNiArMzIxLDEzIEBACiAJeyAwLCAwIH0KIH07CiAKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgd2lyZWxlc3MgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfd2xlc3NldltdID0geworCXsgMHg1OSwgU09OWVBJX0VWRU5UX1dJUkVMRVNTX09OIH0sCisJeyAweDVhLCBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT0ZGIH0sCisJeyAwLCAwIH0KK307CisKIC8qIFRoZSBzZXQgb2YgcG9zc2libGUgYmFjayBidXR0b24gZXZlbnRzICovCiBzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfYmFja2V2W10gPSB7CiAJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFDS19QUkVTU0VEIH0sCkBAIC0zODMsNyArNDA2LDYgQEAKIAl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MzEsIFNPTllQSV9CTFVFVE9PVEhfTUFTSywgc29ueXBpX2JsdWVldiB9LAogCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgwOCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAogCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgxMSwgU09OWVBJX0JBQ0tfTUFTSywgc29ueXBpX2JhY2tldiB9LAotCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgwOCwgU09OWVBJX0hFTFBfTUFTSywgc29ueXBpX2hlbHBldiB9LAogCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMSwgU09OWVBJX0hFTFBfTUFTSywgc29ueXBpX2hlbHBldiB9LAogCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMSwgU09OWVBJX1pPT01fTUFTSywgc29ueXBpX3pvb21ldiB9LAogCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMCwgU09OWVBJX1RIVU1CUEhSQVNFX01BU0ssIHNvbnlwaV90aHVtYnBocmFzZWV2IH0sCkBAIC0zOTEsNiArNDEzLDEyIEBACiAJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDQxLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCiAJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDMxLCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCiAKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDAsIDB4ZmZmZmZmZmYsIHNvbnlwaV9yZWxlYXNlZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4MjEsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMywgMHgzMSwgU09OWVBJX1dJUkVMRVNTX01BU0ssIHNvbnlwaV93bGVzc2V2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzLCAweDMxLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4NDEsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4MzEsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKIAl7IDAgfQogfTsKIApAQCAtNTYzLDYgKzU5MSwyMyBAQAogCXVkZWxheSgxMCk7CiB9CiAKK3N0YXRpYyB2b2lkIHNvbnlwaV90eXBlM19zcnModm9pZCkKK3sKKwl1MTYgdjE2OworCXU4ICB2ODsKKworCS8qIFRoaXMgbW9kZWwgdHlwZSB1c2VzIHRoZSBzYW1lIGluaXRpYWxpYXphdGlvbiBvZgorCSAqIHRoZSBlbWJlZGRlZCBjb250cm9sbGVyIGFzIHRoZSB0eXBlMiBtb2RlbHMuICovCisJc29ueXBpX3R5cGUyX3NycygpOworCisJLyogSW5pdGlhbGl6YXRpb24gb2YgUENJIGNvbmZpZyBzcGFjZSBvZiB0aGUgTFBDIGludGVyZmFjZSBicmlkZ2UuICovCisJdjE2ID0gKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSAmIDB4RkZGMCkgfCAweDAxOworCXBjaV93cml0ZV9jb25maWdfd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX1RZUEUzX0dJRDIsIHYxNik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9UWVBFM19NSVNDLCAmdjgpOworCXY4ID0gKHY4ICYgMHhDRikgfCAweDEwOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX1RZUEUzX01JU0MsIHY4KTsKK30KKwogLyogRGlzYWJsZXMgdGhlIGRldmljZSAtIHRoaXMgY29tZXMgZnJvbSB0aGUgQU1MIGNvZGUgaW4gdGhlIEFDUEkgYmlvcyAqLwogc3RhdGljIHZvaWQgc29ueXBpX3R5cGUxX2Rpcyh2b2lkKQogewpAQCAtNTg3LDYgKzYzMiwxMyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJlY193cml0ZSBmYWlsZWRcbiIpOwogfQogCitzdGF0aWMgdm9pZCBzb255cGlfdHlwZTNfZGlzKHZvaWQpCit7CisJc29ueXBpX3R5cGUyX2RpcygpOworCXVkZWxheSgxMCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfVFlQRTNfR0lEMiwgMCk7Cit9CisKIHN0YXRpYyB1OCBzb255cGlfY2FsbDEodTggZGV2KQogewogCXU4IHYxLCB2MjsKQEAgLTEwNjcsMTAgKzExMTksMTcgQEAKIAogc3RhdGljIHZvaWQgc29ueXBpX2VuYWJsZSh1bnNpZ25lZCBpbnQgY2FtZXJhX29uKQogewotCWlmIChzb255cGlfZGV2aWNlLm1vZGVsID09IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIpCi0JCXNvbnlwaV90eXBlMl9zcnMoKTsKLQllbHNlCisJc3dpdGNoIChzb255cGlfZGV2aWNlLm1vZGVsKSB7CisJY2FzZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxOgogCQlzb255cGlfdHlwZTFfc3JzKCk7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMjoKKwkJc29ueXBpX3R5cGUyX3NycygpOworCQlicmVhazsKKwljYXNlIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTM6CisJCXNvbnlwaV90eXBlM19zcnMoKTsKKwkJYnJlYWs7CisJfQogCiAJc29ueXBpX2NhbGwxKDB4ODIpOwogCXNvbnlwaV9jYWxsMigweDgxLCAweGZmKTsKQEAgLTEwOTQsMTAgKzExNTMsMTggQEAKIAlpZiAoIVNPTllQSV9BQ1BJX0FDVElWRSAmJiBmbmtleWluaXQpCiAJCW91dGIoMHhmMSwgMHhiMik7CiAKLQlpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyKQotCQlzb255cGlfdHlwZTJfZGlzKCk7Ci0JZWxzZQorCXN3aXRjaCAoc29ueXBpX2RldmljZS5tb2RlbCkgeworCWNhc2UgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMToKIAkJc29ueXBpX3R5cGUxX2RpcygpOworCQlicmVhazsKKwljYXNlIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTI6CisJCXNvbnlwaV90eXBlMl9kaXMoKTsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzOgorCQlzb255cGlfdHlwZTNfZGlzKCk7CisJCWJyZWFrOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xMTQzLDEyICsxMjEwLDE2IEBACiAJc3RydWN0IHNvbnlwaV9pcnFfbGlzdCAqaXJxX2xpc3Q7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKIAotCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCi0JCQkJUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIE5VTEwpOworCWlmICgocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLCBOVUxMKSkpCisJCXNvbnlwaV9kZXZpY2UubW9kZWwgPSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxOworCWVsc2UgaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCQkgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xLCBOVUxMKSkpCisJCXNvbnlwaV9kZXZpY2UubW9kZWwgPSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzOworCWVsc2UKKwkJc29ueXBpX2RldmljZS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTI7CiAKIAlzb255cGlfZGV2aWNlLmRldiA9IHBjaWRldjsKLQlzb255cGlfZGV2aWNlLm1vZGVsID0gcGNpZGV2ID8KLQkJU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSA6IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTI7CiAKIAlzcGluX2xvY2tfaW5pdCgmc29ueXBpX2RldmljZS5maWZvX2xvY2spOwogCXNvbnlwaV9kZXZpY2UuZmlmbyA9IGtmaWZvX2FsbG9jKFNPTllQSV9CVUZfU0laRSwgR0ZQX0tFUk5FTCwKQEAgLTExNzYsMTYgKzEyNDcsMjIgQEAKIAkJZ290byBvdXRfbWlzY3JlZzsKIAl9CiAKLQlpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyKSB7CisKKwlpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxKSB7CisJCWlvcG9ydF9saXN0ID0gc29ueXBpX3R5cGUxX2lvcG9ydF9saXN0OworCQlzb255cGlfZGV2aWNlLnJlZ2lvbl9zaXplID0gU09OWVBJX1RZUEUxX1JFR0lPTl9TSVpFOworCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTFfRVZUWVBFX09GRlNFVDsKKwkJaXJxX2xpc3QgPSBzb255cGlfdHlwZTFfaXJxX2xpc3Q7CisJfSBlbHNlIGlmIChzb255cGlfZGV2aWNlLm1vZGVsID09IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIpIHsKIAkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTJfaW9wb3J0X2xpc3Q7CiAJCXNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUgPSBTT05ZUElfVFlQRTJfUkVHSU9OX1NJWkU7CiAJCXNvbnlwaV9kZXZpY2UuZXZ0eXBlX29mZnNldCA9IFNPTllQSV9UWVBFMl9FVlRZUEVfT0ZGU0VUOwogCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlMl9pcnFfbGlzdDsKIAl9IGVsc2UgewotCQlpb3BvcnRfbGlzdCA9IHNvbnlwaV90eXBlMV9pb3BvcnRfbGlzdDsKLQkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFMV9SRUdJT05fU0laRTsKLQkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUxX0VWVFlQRV9PRkZTRVQ7Ci0JCWlycV9saXN0ID0gc29ueXBpX3R5cGUxX2lycV9saXN0OworCQlpb3BvcnRfbGlzdCA9IHNvbnlwaV90eXBlM19pb3BvcnRfbGlzdDsKKwkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFM19SRUdJT05fU0laRTsKKwkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUzX0VWVFlQRV9PRkZTRVQ7CisJCWlycV9saXN0ID0gc29ueXBpX3R5cGUzX2lycV9saXN0OwogCX0KIAogCWZvciAoaSA9IDA7IGlvcG9ydF9saXN0W2ldLnBvcnQxOyBpKyspIHsKQEAgLTEyNzQsMTEgKzEzNTEsMTAgQEAKIAogCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2xsZXIgRHJpdmVyIgogCSAgICAgICAidiVzLlxuIiwgU09OWVBJX0RSSVZFUl9WRVJTSU9OKTsKLQlwcmludGsoS0VSTl9JTkZPICJzb255cGk6IGRldGVjdGVkICVzIG1vZGVsLCAiCisJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBkZXRlY3RlZCB0eXBlJWQgbW9kZWwsICIKIAkgICAgICAgInZlcmJvc2UgPSAlZCwgZm5rZXlpbml0ID0gJXMsIGNhbWVyYSA9ICVzLCAiCiAJICAgICAgICJjb21wYXQgPSAlcywgbWFzayA9IDB4JTA4bHgsIHVzZWlucHV0ID0gJXMsIGFjcGkgPSAlc1xuIiwKLQkgICAgICAgKHNvbnlwaV9kZXZpY2UubW9kZWwgPT0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSkgPwotCQkJInR5cGUxIiA6ICJ0eXBlMiIsCisJICAgICAgIHNvbnlwaV9kZXZpY2UubW9kZWwsCiAJICAgICAgIHZlcmJvc2UsCiAJICAgICAgIGZua2V5aW5pdCA/ICJvbiIgOiAib2ZmIiwKIAkgICAgICAgY2FtZXJhID8gIm9uIiA6ICJvZmYiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwppbmRleCAzN2M4YmVhLi5lYTJkNTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBsaW51eC9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwogICoKLSAqICRJZDogc3luY2xpbmsuYyx2IDQuMjggMjAwNC8wOC8xMSAxOTozMDowMSBwYXVsa2YgRXhwICQKKyAqICRJZDogc3luY2xpbmsuYyx2IDQuMzcgMjAwNS8wOS8wNyAxMzoxMzoxOSBwYXVsa2YgRXhwICQKICAqCiAgKiBEZXZpY2UgZHJpdmVyIGZvciBNaWNyb2dhdGUgU3luY0xpbmsgSVNBIGFuZCBQQ0kKICAqIGhpZ2ggc3BlZWQgbXVsdGlwcm90b2NvbCBzZXJpYWwgYWRhcHRlcnMuCkBAIC0xNDEsOSArMTQxLDkgQEAKIHR5cGVkZWYgc3RydWN0IF9ETUFCVUZGRVJFTlRSWQogewogCXUzMiBwaHlzX2FkZHI7CS8qIDMyLWJpdCBmbGF0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgZGF0YSBidWZmZXIgKi8KLQl1MTYgY291bnQ7CS8qIGJ1ZmZlciBzaXplL2RhdGEgY291bnQgKi8KLQl1MTYgc3RhdHVzOwkvKiBDb250cm9sL3N0YXR1cyBmaWVsZCAqLwotCXUxNiByY2M7CS8qIGNoYXJhY3RlciBjb3VudCBmaWVsZCAqLworCXZvbGF0aWxlIHUxNiBjb3VudDsJLyogYnVmZmVyIHNpemUvZGF0YSBjb3VudCAqLworCXZvbGF0aWxlIHUxNiBzdGF0dXM7CS8qIENvbnRyb2wvc3RhdHVzIGZpZWxkICovCisJdm9sYXRpbGUgdTE2IHJjYzsJLyogY2hhcmFjdGVyIGNvdW50IGZpZWxkICovCiAJdTE2IHJlc2VydmVkOwkvKiBwYWRkaW5nIHJlcXVpcmVkIGJ5IDE2QzMyICovCiAJdTMyIGxpbms7CS8qIDMyLWJpdCBmbGF0IGxpbmsgdG8gbmV4dCBidWZmZXIgZW50cnkgKi8KIAljaGFyICp2aXJ0X2FkZHI7CS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBkYXRhIGJ1ZmZlciAqLwpAQCAtODk2LDcgKzg5Niw3IEBACiBtb2R1bGVfcGFyYW1fYXJyYXkodHhob2xkYnVmcywgaW50LCBOVUxMLCAwKTsKIAogc3RhdGljIGNoYXIgKmRyaXZlcl9uYW1lID0gIlN5bmNMaW5rIHNlcmlhbCBkcml2ZXIiOwotc3RhdGljIGNoYXIgKmRyaXZlcl92ZXJzaW9uID0gIiRSZXZpc2lvbjogNC4yOCAkIjsKK3N0YXRpYyBjaGFyICpkcml2ZXJfdmVyc2lvbiA9ICIkUmV2aXNpb246IDQuMzcgJCI7CiAKIHN0YXRpYyBpbnQgc3luY2xpbmtfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKQEAgLTE4MTQsNiArMTgxNCw4IEBACiAKIAlpbmZvLT5wZW5kaW5nX2JoID0gMDsKIAkKKwltZW1zZXQoJmluZm8tPmljb3VudCwgMCwgc2l6ZW9mKGluZm8tPmljb3VudCkpOworCiAJaW5pdF90aW1lcigmaW5mby0+dHhfdGltZXIpOwogCWluZm8tPnR4X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbmZvOwogCWluZm8tPnR4X3RpbWVyLmZ1bmN0aW9uID0gbWdzbF90eF90aW1lb3V0OwpAQCAtMjQ3MCwxMiArMjQ3MiwxMiBAQAogCQlwcmludGsoIiVzKCVkKTptZ3NsX2dldF9wYXJhbXMoJXMpXG4iLAogCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSk7CiAJCQkKLQlDT1BZX1RPX1VTRVIoZXJyLHVzZXJfaWNvdW50LCAmaW5mby0+aWNvdW50LCBzaXplb2Yoc3RydWN0IG1nc2xfaWNvdW50KSk7Ci0JaWYgKGVycikgewotCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQotCQkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfZ2V0X3N0YXRzKCVzKSB1c2VyIGJ1ZmZlciBjb3B5IGZhaWxlZFxuIiwKLQkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7Ci0JCXJldHVybiAtRUZBVUxUOworCWlmICghdXNlcl9pY291bnQpIHsKKwkJbWVtc2V0KCZpbmZvLT5pY291bnQsIDAsIHNpemVvZihpbmZvLT5pY291bnQpKTsKKwl9IGVsc2UgeworCQlDT1BZX1RPX1VTRVIoZXJyLCB1c2VyX2ljb3VudCwgJmluZm8tPmljb3VudCwgc2l6ZW9mKHN0cnVjdCBtZ3NsX2ljb3VudCkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCQogCXJldHVybiAwOwpAQCAtNjE0OSw2ICs2MTUxLDExIEBACiAJCXVzY19PdXRSZWcoaW5mbywgUENSLCAodTE2KSgodXNjX0luUmVnKGluZm8sIFBDUikgfCBCSVQxMykgJiB+QklUMTIpKTsKIAl9CiAKKwlpZiAoaW5mby0+cGFyYW1zLmxvb3BiYWNrKSB7CisJCWluZm8tPmxvb3BiYWNrX2JpdHMgPSAweDMwMDsKKwkJb3V0dygweDAzMDAsIGluZm8tPmlvX2Jhc2UgKyBDQ0FSKTsKKwl9CisKIH0JLyogZW5kIG9mIHVzY19zZXRfYXN5bmNfbW9kZSgpICovCiAKIC8qIHVzY19sb29wYmFja19mcmFtZSgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYwppbmRleCBlYzk0OWU0Li42ZmIxNjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCisrKyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBzeW5jbGlua21wLmMsdiA0LjM0IDIwMDUvMDMvMDQgMTU6MDc6MTAgcGF1bGtmIEV4cCAkCisgKiAkSWQ6IHN5bmNsaW5rbXAuYyx2IDQuMzggMjAwNS8wNy8xNSAxMzoyOTo0NCBwYXVsa2YgRXhwICQKICAqCiAgKiBEZXZpY2UgZHJpdmVyIGZvciBNaWNyb2dhdGUgU3luY0xpbmsgTXVsdGlwb3J0CiAgKiBoaWdoIHNwZWVkIG11bHRpcHJvdG9jb2wgc2VyaWFsIGFkYXB0ZXIuCkBAIC01NSw3ICs1NSw2IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogCkBAIC00ODcsNyArNDg2LDcgQEAKIG1vZHVsZV9wYXJhbV9hcnJheShkb3N5bmNwcHAsIGludCwgTlVMTCwgMCk7CiAKIHN0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJTeW5jTGluayBNdWx0aVBvcnQgZHJpdmVyIjsKLXN0YXRpYyBjaGFyICpkcml2ZXJfdmVyc2lvbiA9ICIkUmV2aXNpb246IDQuMzQgJCI7CitzdGF0aWMgY2hhciAqZHJpdmVyX3ZlcnNpb24gPSAiJFJldmlzaW9uOiA0LjM4ICQiOwogCiBzdGF0aWMgaW50IHN5bmNsaW5rbXBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldixjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKIHN0YXRpYyB2b2lkIHN5bmNsaW5rbXBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKQEAgLTU1Niw3ICs1NTUsNiBAQAogc3RhdGljIGludCAgdHhfZW5hYmxlKFNMTVBfSU5GTyAqaW5mbywgaW50IGVuYWJsZSk7CiBzdGF0aWMgaW50ICB0eF9hYm9ydChTTE1QX0lORk8gKmluZm8pOwogc3RhdGljIGludCAgcnhfZW5hYmxlKFNMTVBfSU5GTyAqaW5mbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgaW50ICBtYXBfc3RhdHVzKGludCBzaWduYWxzKTsKIHN0YXRpYyBpbnQgIG1vZGVtX2lucHV0X3dhaXQoU0xNUF9JTkZPICppbmZvLGludCBhcmcpOwogc3RhdGljIGludCAgd2FpdF9tZ3NsX2V2ZW50KFNMTVBfSU5GTyAqaW5mbywgaW50IF9fdXNlciAqbWFza19wdHIpOwogc3RhdGljIGludCAgdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOwpAQCAtNjQ1LDcgKzY0Myw3IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciB0eF9uZWdhdGVfZmlmb19sZXZlbCA9IDMyOwkvLyB0eCByZXF1ZXN0IEZJRk8gbmVnYXRpb24gbGV2ZWwgaW4gYnl0ZXMKIAogc3RhdGljIHUzMiBtaXNjX2N0cmxfdmFsdWUgPSAweDAwN2U0MDQwOwotc3RhdGljIHUzMiBsY3IxX2JyZHJfdmFsdWUgPSAweDAwODAwMDI5Oworc3RhdGljIHUzMiBsY3IxX2JyZHJfdmFsdWUgPSAweDAwODAwMDI4OwogCiBzdGF0aWMgdTMyIHJlYWRfYWhlYWRfY291bnQgPSA4OwogCkBAIC0yNzUwLDYgKzI3NDgsOCBAQAogCiAJaW5mby0+cGVuZGluZ19iaCA9IDA7CiAKKwltZW1zZXQoJmluZm8tPmljb3VudCwgMCwgc2l6ZW9mKGluZm8tPmljb3VudCkpOworCiAJLyogcHJvZ3JhbSBoYXJkd2FyZSBmb3IgY3VycmVudCBwYXJhbWV0ZXJzICovCiAJcmVzZXRfcG9ydChpbmZvKTsKIApAQCAtMjk1MywxMiArMjk1MywxMiBAQAogCQlwcmludGsoIiVzKCVkKTolcyBnZXRfcGFyYW1zKClcbiIsCiAJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lKTsKIAotCUNPUFlfVE9fVVNFUihlcnIsdXNlcl9pY291bnQsICZpbmZvLT5pY291bnQsIHNpemVvZihzdHJ1Y3QgbWdzbF9pY291bnQpKTsKLQlpZiAoZXJyKSB7Ci0JCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCi0JCQlwcmludGsoICIlcyglZCk6JXMgZ2V0X3N0YXRzKCkgdXNlciBidWZmZXIgY29weSBmYWlsZWRcbiIsCi0JCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOwotCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIXVzZXJfaWNvdW50KSB7CisJCW1lbXNldCgmaW5mby0+aWNvdW50LCAwLCBzaXplb2YoaW5mby0+aWNvdW50KSk7CisJfSBlbHNlIHsKKwkJQ09QWV9UT19VU0VSKGVyciwgdXNlcl9pY291bnQsICZpbmZvLT5pY291bnQsIHNpemVvZihzdHJ1Y3QgbWdzbF9pY291bnQpKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzEwOSwxNiArMzEwOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWFwX3N0YXR1cyhpbnQgc2lnbmFscykKLXsKLQkvKiBNYXAgc3RhdHVzIGJpdHMgdG8gQVBJIGV2ZW50IGJpdHMgKi8KLQotCXJldHVybiAoKHNpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFNSKSA/IE1nc2xFdmVudF9Ec3JBY3RpdmUgOiBNZ3NsRXZlbnRfRHNySW5hY3RpdmUpICsKLQkgICAgICAgKChzaWduYWxzICYgU2VyaWFsU2lnbmFsX0NUUykgPyBNZ3NsRXZlbnRfQ3RzQWN0aXZlIDogTWdzbEV2ZW50X0N0c0luYWN0aXZlKSArCi0JICAgICAgICgoc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpID8gTWdzbEV2ZW50X0RjZEFjdGl2ZSA6IE1nc2xFdmVudF9EY2RJbmFjdGl2ZSkgKwotCSAgICAgICAoKHNpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpICA/IE1nc2xFdmVudF9SaUFjdGl2ZSA6IE1nc2xFdmVudF9SaUluYWN0aXZlKTsKLX0KLQogLyogd2FpdCBmb3Igc3BlY2lmaWVkIGV2ZW50IHRvIG9jY3VyCiAgKi8KIHN0YXRpYyBpbnQgd2FpdF9tZ3NsX2V2ZW50KFNMTVBfSU5GTyAqIGluZm8sIGludCBfX3VzZXIgKm1hc2tfcHRyKQpAQCAtMzE0NSw3ICszMTM1LDcgQEAKIAogCS8qIHJldHVybiBpbW1lZGlhdGVseSBpZiBzdGF0ZSBtYXRjaGVzIHJlcXVlc3RlZCBldmVudHMgKi8KIAlnZXRfc2lnbmFscyhpbmZvKTsKLQlzID0gbWFwX3N0YXR1cyhpbmZvLT5zZXJpYWxfc2lnbmFscyk7CisJcyA9IGluZm8tPnNlcmlhbF9zaWduYWxzOwogCiAJZXZlbnRzID0gbWFzayAmCiAJCSggKChzICYgU2VyaWFsU2lnbmFsX0RTUikgPyBNZ3NsRXZlbnRfRHNyQWN0aXZlOk1nc2xFdmVudF9Ec3JJbmFjdGl2ZSkgKwpAQCAtNDQ4OSwxMSArNDQ3OSwxMyBAQAogCS8qIE1EMiwgTW9kZSBSZWdpc3RlciAyCiAJICoKIAkgKiAwNy4uMDIgIFJlc2VydmVkLCBtdXN0IGJlIDAKLQkgKiAwMS4uMDAgIENOQ1Q8MS4uMD4gQ2hhbm5lbCBjb25uZWN0aW9uLCAwPW5vcm1hbAorCSAqIDAxLi4wMCAgQ05DVDwxLi4wPiBDaGFubmVsIGNvbm5lY3Rpb24sIDAwPW5vcm1hbCAxMT1sb2NhbCBsb29wYmFjawogCSAqCiAJICogMDAwMCAwMDAwCiAJICovCiAJUmVnVmFsdWUgPSAweDAwOworCWlmIChpbmZvLT5wYXJhbXMubG9vcGJhY2spCisJCVJlZ1ZhbHVlIHw9IChCSVQxICsgQklUMCk7CiAJd3JpdGVfcmVnKGluZm8sIE1EMiwgUmVnVmFsdWUpOwogCiAJLyogUlhTLCBSZWNlaXZlIGNsb2NrIHNvdXJjZQpAQCAtNDU3NCw5ICs0NTY2LDYgQEAKIAl3cml0ZV9yZWcoaW5mbywgSUUyLCBpbmZvLT5pZTJfdmFsdWUpOwogCiAJc2V0X3JhdGUoIGluZm8sIGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgKiAxNiApOwotCi0JaWYgKGluZm8tPnBhcmFtcy5sb29wYmFjaykKLQkJZW5hYmxlX2xvb3BiYWNrKGluZm8sMSk7CiB9CiAKIC8qIFByb2dyYW0gdGhlIFNDQSBmb3IgSERMQyBjb21tdW5pY2F0aW9ucy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZyBiL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZwppbmRleCA3OWU5ODMyLi5iNThhZGZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9LY29uZmlnCkBAIC0xNyw3ICsxNyw3IEBACiAJICBvYnRhaW5lZCBhdDogPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHJvdXNlcnM+LiAgVG8gCiAJICBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOyB0aGUgbW9kdWxlIAogCSAgd2lsbCBiZSBjYWxsZWQgdHBtLiBJZiB1bnN1cmUsIHNheSBOLgotCSAgTm90ZTogRm9yIG1vcmUgVFBNIGRyaXZlcnMgZW5hYmxlIENPTkZJR19QTlAsIENPTkZJR19BQ1BJX0JVUworCSAgTm90ZTogRm9yIG1vcmUgVFBNIGRyaXZlcnMgZW5hYmxlIENPTkZJR19QTlAsIENPTkZJR19BQ1BJCiAJICBhbmQgQ09ORklHX1BOUEFDUEkuCiAKIGNvbmZpZyBUQ0dfTlNDCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fYXRtZWwuYwppbmRleCBjYzJjYzc3Li5jMGQ2NDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2F0bWVsLmMKQEAgLTIwNiw2ICsyMDYsOSBAQAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8wKX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzEyKX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVCXzApfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xKX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzApfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfODExMV9MUEMpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTLCBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZMUEMpfSwKIAl7MCx9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9pbmZpbmVvbi5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1faW5maW5lb24uYwppbmRleCBkYzhjNTQwLi45MzllNTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9pbmZpbmVvbi5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2luZmluZW9uLmMKQEAgLTE0LDcgKzE0LDYgQEAKICAqIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlICJ0cG0uaCIKIApAQCAtMjksOSArMjgsMTAgQEAKICNkZWZpbmUJVFBNX01BWF9UUklFUwkJNTAwMAogI2RlZmluZQlUUE1fSU5GSU5FT05fREVWX1ZFTl9WQUxVRQkweDE1RDEKIAotLyogVGhlc2UgdmFsdWVzIHdpbGwgYmUgZmlsbGVkIGFmdGVyIEFDUEktY2FsbCAqLworLyogVGhlc2UgdmFsdWVzIHdpbGwgYmUgZmlsbGVkIGFmdGVyIFBuUC1jYWxsICovCiBzdGF0aWMgaW50IFRQTV9JTkZfREFUQSA9IDA7CiBzdGF0aWMgaW50IFRQTV9JTkZfQUREUiA9IDA7CitzdGF0aWMgaW50IHBucF9yZWdpc3RlcmVkID0gMDsKIAogLyogVFBNIGhlYWRlciBkZWZpbml0aW9ucyAqLwogZW51bSBpbmZpbmVvbl90cG1faGVhZGVyIHsKQEAgLTM1NiwyNCArMzU2LDI2IEBACiAJeyJJRlgwMTAyIiwgMH0sCiAJeyIiLCAwfQogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocG5wLCB0cG1fcG5wX3RibCk7CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHRwbV9pbmZfYWNwaV9wcm9iZShzdHJ1Y3QgcG5wX2RldiAqZGV2LAorc3RhdGljIGludCBfX2RldmluaXQgdHBtX2luZl9wbnBfcHJvYmUoc3RydWN0IHBucF9kZXYgKmRldiwKIAkJCQkJY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmRldl9pZCkKIHsKLQlUUE1fSU5GX0FERFIgPSAocG5wX3BvcnRfc3RhcnQoZGV2LCAwKSAmIDB4ZmYpOwotCVRQTV9JTkZfREFUQSA9ICgoVFBNX0lORl9BRERSICsgMSkgJiAweGZmKTsKLQl0cG1faW5mLmJhc2UgPSBwbnBfcG9ydF9zdGFydChkZXYsIDEpOwotCWRldl9pbmZvKCZkZXYtPmRldiwgIkZvdW5kICVzIHdpdGggSUQgJXNcbiIsCi0JCSBkZXYtPm5hbWUsIGRldl9pZC0+aWQpOwotCWlmICghKCh0cG1faW5mLmJhc2UgPj4gOCkgJiAweGZmKSkKLQkJdHBtX2luZi5iYXNlID0gMDsKLQlyZXR1cm4gMDsKKwlpZiAocG5wX3BvcnRfdmFsaWQoZGV2LCAwKSkgeworCQlUUE1fSU5GX0FERFIgPSAocG5wX3BvcnRfc3RhcnQoZGV2LCAwKSAmIDB4ZmYpOworCQlUUE1fSU5GX0RBVEEgPSAoKFRQTV9JTkZfQUREUiArIDEpICYgMHhmZik7CisJCXRwbV9pbmYuYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldiwgMSk7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkZvdW5kICVzIHdpdGggSUQgJXNcbiIsCisJCWRldi0+bmFtZSwgZGV2X2lkLT5pZCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAogc3RhdGljIHN0cnVjdCBwbnBfZHJpdmVyIHRwbV9pbmZfcG5wID0gewogCS5uYW1lID0gInRwbV9pbmZfcG5wIiwKIAkuaWRfdGFibGUgPSB0cG1fcG5wX3RibCwKLQkucHJvYmUgPSB0cG1faW5mX2FjcGlfcHJvYmUsCisJLnByb2JlID0gdHBtX2luZl9wbnBfcHJvYmUsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0cG1faW5mX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LApAQCAtMzg2LDE5ICszODgsMzAgQEAKIAlpbnQgcHJvZHVjdGlkWzJdOwogCWNoYXIgY2hpcG5hbWVbMjBdOwogCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKQotCQlyZXR1cm4gLUVJTzsKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJZGV2X2luZm8oJnBjaV9kZXYtPmRldiwgIkxQQy1idXMgZm91bmQgYXQgMHgleFxuIiwgcGNpX2lkLT5kZXZpY2UpOwogCi0JLyogcmVhZCBJTy1wb3J0cyBmcm9tIEFDUEkgKi8KLQlwbnBfcmVnaXN0ZXJfZHJpdmVyKCZ0cG1faW5mX3BucCk7Ci0JcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZ0cG1faW5mX3BucCk7CisJLyogcmVhZCBJTy1wb3J0cyBmcm9tIFBuUCAqLworCXJjID0gcG5wX3JlZ2lzdGVyX2RyaXZlcigmdHBtX2luZl9wbnApOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycigmcGNpX2Rldi0+ZGV2LAorCQkJIkVycm9yICV4IGZyb20gcG5wX3JlZ2lzdGVyX2RyaXZlciFcbiIscmMpOworCQlnb3RvIGVycm9yMjsKKwl9CisJaWYgKCFyYykgeworCQlkZXZfaW5mbygmcGNpX2Rldi0+ZGV2LCAiTm8gSW5maW5lb24gVFBNIGZvdW5kIVxuIik7CisJCWdvdG8gZXJyb3I7CisJfSBlbHNlIHsKKwkJcG5wX3JlZ2lzdGVyZWQgPSAxOworCX0KIAogCS8qIE1ha2Ugc3VyZSwgd2UgaGF2ZSByZWNlaXZlZCB2YWxpZCBjb25maWcgcG9ydHMgKi8KIAlpZiAoIVRQTV9JTkZfQUREUikgewotCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7Ci0JCXJldHVybiAtRUlPOworCQlkZXZfZXJyKCZwY2lfZGV2LT5kZXYsICJObyB2YWxpZCBJTy1wb3J0cyByZWNlaXZlZCFcbiIpOworCQlnb3RvIGVycm9yOwogCX0KIAogCS8qIHF1ZXJ5IGNoaXAgZm9yIGl0cyB2ZW5kb3IsIGl0cyB2ZXJzaW9uIG51bWJlciBhLnMuby4gKi8KQEAgLTQxOCwyMyArNDMxLDIxIEBACiAKIAlzd2l0Y2ggKChwcm9kdWN0aWRbMF0gPDwgOCkgfCBwcm9kdWN0aWRbMV0pIHsKIAljYXNlIDY6Ci0JCXNwcmludGYoY2hpcG5hbWUsICIgKFNMRCA5NjMwIFRUIDEuMSkiKTsKKwkJc25wcmludGYoY2hpcG5hbWUsIHNpemVvZihjaGlwbmFtZSksICIgKFNMRCA5NjMwIFRUIDEuMSkiKTsKIAkJYnJlYWs7CiAJY2FzZSAxMToKLQkJc3ByaW50ZihjaGlwbmFtZSwgIiAoU0xCIDk2MzUgVFQgMS4yKSIpOworCQlzbnByaW50ZihjaGlwbmFtZSwgc2l6ZW9mKGNoaXBuYW1lKSwgIiAoU0xCIDk2MzUgVFQgMS4yKSIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzcHJpbnRmKGNoaXBuYW1lLCAiICh1bmtub3duIGNoaXApIik7CisJCXNucHJpbnRmKGNoaXBuYW1lLCBzaXplb2YoY2hpcG5hbWUpLCAiICh1bmtub3duIGNoaXApIik7CiAJCWJyZWFrOwogCX0KLQljaGlwbmFtZVsxOV0gPSAwOwogCiAJaWYgKCh2ZW5kb3JpZFswXSA8PCA4IHwgdmVuZG9yaWRbMV0pID09IChUUE1fSU5GSU5FT05fREVWX1ZFTl9WQUxVRSkpIHsKIAogCQlpZiAodHBtX2luZi5iYXNlID09IDApIHsKIAkJCWRldl9lcnIoJnBjaV9kZXYtPmRldiwgIk5vIElPLXBvcnRzIGZvdW5kIVxuIik7Ci0JCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7Ci0JCQlyZXR1cm4gLUVJTzsKKwkJCWdvdG8gZXJyb3I7CiAJCX0KIAkJLyogY29uZmlndXJlIFRQTSB3aXRoIElPLXBvcnRzICovCiAJCW91dGIoSU9MSU1ILCBUUE1fSU5GX0FERFIpOwpAQCAtNDUyLDggKzQ2Myw3IEBACiAJCQlkZXZfZXJyKCZwY2lfZGV2LT5kZXYsCiAJCQkJIkNvdWxkIG5vdCBzZXQgSU8tcG9ydHMgdG8gJTA0eFxuIiwKIAkJCQl0cG1faW5mLmJhc2UpOwotCQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOwotCQkJcmV0dXJuIC1FSU87CisJCQlnb3RvIGVycm9yOwogCQl9CiAKIAkJLyogYWN0aXZhdGUgcmVnaXN0ZXIgKi8KQEAgLTQ3OSwxNCArNDg5LDE2IEBACiAJCQkgcHJvZHVjdGlkWzBdLCBwcm9kdWN0aWRbMV0sIGNoaXBuYW1lKTsKIAogCQlyYyA9IHRwbV9yZWdpc3Rlcl9oYXJkd2FyZShwY2lfZGV2LCAmdHBtX2luZik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGVycm9yOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UgewogCQlkZXZfaW5mbygmcGNpX2Rldi0+ZGV2LCAiTm8gSW5maW5lb24gVFBNIGZvdW5kIVxuIik7CitlcnJvcjoKKwkJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZ0cG1faW5mX3BucCk7CitlcnJvcjI6CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKwkJcG5wX3JlZ2lzdGVyZWQgPSAwOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiB9CkBAIC01MjEsNiArNTMzLDggQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfaW5mKHZvaWQpCiB7CisJaWYgKHBucF9yZWdpc3RlcmVkKQorCQlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJnRwbV9pbmZfcG5wKTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmluZl9wY2lfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pby5jIGIvZHJpdmVycy9jaGFyL3R0eV9pby5jCmluZGV4IDZlNGJlM2IuLmU1OTUzZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfaW8uYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKQEAgLTE1Myw3ICsxNTMsNiBAQAogaW50IHR0eV9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAogCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbnQgdHR5X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICogZmlscCwgaW50IG9uKTsKLWV4dGVybiB2b2lkIHJzXzM2MF9pbml0KHZvaWQpOwogc3RhdGljIHZvaWQgcmVsZWFzZV9tZW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGlkeCk7CiAKIApAQCAtNDcwLDIxICs0NjksMTkgQEAKICAKIHN0YXRpYyBpbnQgdHR5X3NldF9sZGlzYyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgbGRpc2MpCiB7Ci0JaW50CXJldHZhbCA9IDA7Ci0Jc3RydWN0CXR0eV9sZGlzYyBvX2xkaXNjOworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCB0dHlfbGRpc2Mgb19sZGlzYzsKIAljaGFyIGJ1Zls2NF07CiAJaW50IHdvcms7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqb190dHk7CiAKIAlpZiAoKGxkaXNjIDwgTl9UVFkpIHx8IChsZGlzYyA+PSBOUl9MRElTQ1MpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogcmVzdGFydDoKIAotCWlmICh0dHktPmxkaXNjLm51bSA9PSBsZGlzYykKLQkJcmV0dXJuIDA7CS8qIFdlIGFyZSBhbHJlYWR5IGluIHRoZSBkZXNpcmVkIGRpc2NpcGxpbmUgKi8KLQkKIAlsZCA9IHR0eV9sZGlzY19nZXQobGRpc2MpOwogCS8qIEVkdWFyZG8gQmxhbmNvIDxlamJzQGNzLmNzLmNvbS51eT4gKi8KIAkvKiBDeXJ1cyBEdXJnaW4gPGNpZGVyQHNwZWFrZWFzeS5vcmc+ICovCkBAIC00OTUsNDUgKzQ5Miw3NCBAQAogCWlmIChsZCA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW9fbGRpc2MgPSB0dHktPmxkaXNjOwotCiAJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOwogCisJaWYgKHR0eS0+bGRpc2MubnVtID09IGxkaXNjKSB7CisJCXR0eV9sZGlzY19wdXQobGRpc2MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlvX2xkaXNjID0gdHR5LT5sZGlzYzsKKwlvX3R0eSA9IHR0eS0+bGluazsKKwogCS8qCiAJICoJTWFrZSBzdXJlIHdlIGRvbid0IGNoYW5nZSB3aGlsZSBzb21lb25lIGhvbGRzIGEKIAkgKglyZWZlcmVuY2UgdG8gdGhlIGxpbmUgZGlzY2lwbGluZS4gVGhlIFRUWV9MRElTQyBiaXQKIAkgKglwcmV2ZW50cyBhbnlvbmUgdGFraW5nIGEgcmVmZXJlbmNlIG9uY2UgaXQgaXMgY2xlYXIuCiAJICoJV2UgbmVlZCB0aGUgbG9jayB0byBhdm9pZCByYWNpbmcgcmVmZXJlbmNlIHRha2Vycy4KIAkgKi8KLQkgCisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKLQlpZih0dHktPmxkaXNjLnJlZmNvdW50KQotCXsKLQkJLyogRnJlZSB0aGUgbmV3IGxkaXNjIHdlIGdyYWJiZWQuIE11c3QgZHJvcCB0aGUgbG9jawotCQkgICBmaXJzdC4gKi8KKwlpZiAodHR5LT5sZGlzYy5yZWZjb3VudCB8fCAob190dHkgJiYgb190dHktPmxkaXNjLnJlZmNvdW50KSkgeworCQlpZih0dHktPmxkaXNjLnJlZmNvdW50KSB7CisJCQkvKiBGcmVlIHRoZSBuZXcgbGRpc2Mgd2UgZ3JhYmJlZC4gTXVzdCBkcm9wIHRoZSBsb2NrCisJCQkgICBmaXJzdC4gKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJCQl0dHlfbGRpc2NfcHV0KGxkaXNjKTsKKwkJCS8qCisJCQkgKiBUaGVyZSBhcmUgc2V2ZXJhbCByZWFzb25zIHdlIG1heSBiZSBidXN5LCBpbmNsdWRpbmcKKwkJCSAqIHJhbmRvbSBtb21lbnRhcnkgSS9PIHRyYWZmaWMuIFdlIG11c3QgdGhlcmVmb3JlCisJCQkgKiByZXRyeS4gV2UgY291bGQgZGlzdGluZ3Vpc2ggYmV0d2VlbiBibG9ja2luZyBvcHMKKwkJCSAqIGFuZCByZXRyaWVzIGlmIHdlIG1hZGUgdHR5X2xkaXNjX3dhaXQoKSBzbWFydGVyLiBUaGF0CisJCQkgKiBpcyB1cCBmb3IgZGlzY3Vzc2lvbi4KKwkJCSAqLworCQkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0dHlfbGRpc2Nfd2FpdCwgdHR5LT5sZGlzYy5yZWZjb3VudCA9PSAwKSA8IDApCisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCQlpZihvX3R0eSAmJiBvX3R0eS0+bGRpc2MucmVmY291bnQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJCQl0dHlfbGRpc2NfcHV0KGxkaXNjKTsKKwkJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodHR5X2xkaXNjX3dhaXQsIG9fdHR5LT5sZGlzYy5yZWZjb3VudCA9PSAwKSA8IDApCisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCX0KKworCS8qIGlmIHRoZSBUVFlfTERJU0MgYml0IGlzIHNldCwgdGhlbiB3ZSBhcmUgcmFjaW5nIGFnYWluc3QgYW5vdGhlciBsZGlzYyBjaGFuZ2UgKi8KKworCWlmICghdGVzdF9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncykpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKIAkJdHR5X2xkaXNjX3B1dChsZGlzYyk7Ci0JCS8qCi0JCSAqIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgd2UgbWF5IGJlIGJ1c3ksIGluY2x1ZGluZwotCQkgKiByYW5kb20gbW9tZW50YXJ5IEkvTyB0cmFmZmljLiBXZSBtdXN0IHRoZXJlZm9yZQotCQkgKiByZXRyeS4gV2UgY291bGQgZGlzdGluZ3Vpc2ggYmV0d2VlbiBibG9ja2luZyBvcHMKLQkJICogYW5kIHJldHJpZXMgaWYgd2UgbWFkZSB0dHlfbGRpc2Nfd2FpdCgpIHNtYXJ0ZXIuIFRoYXQKLQkJICogaXMgdXAgZm9yIGRpc2N1c3Npb24uCi0JCSAqLwotCQlpZih3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodHR5X2xkaXNjX3dhaXQsIHR0eS0+bGRpc2MucmVmY291bnQgPT0gMCkgPCAwKQotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsJCQkKKwkJbGQgPSB0dHlfbGRpc2NfcmVmX3dhaXQodHR5KTsKKwkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKIAkJZ290byByZXN0YXJ0OwogCX0KLQljbGVhcl9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncyk7CQorCisJY2xlYXJfYml0KFRUWV9MRElTQywgJnR0eS0+ZmxhZ3MpOwogCWNsZWFyX2JpdChUVFlfRE9OVF9GTElQLCAmdHR5LT5mbGFncyk7CisJaWYgKG9fdHR5KSB7CisJCWNsZWFyX2JpdChUVFlfTERJU0MsICZvX3R0eS0+ZmxhZ3MpOworCQljbGVhcl9iaXQoVFRZX0RPTlRfRkxJUCwgJm9fdHR5LT5mbGFncyk7CisJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7Ci0JCisKIAkvKgogCSAqCUZyb20gdGhpcyBwb2ludCBvbiB3ZSBrbm93IG5vYm9keSBoYXMgYW4gbGRpc2MKIAkgKgl1c2FnZSByZWZlcmVuY2UsIG5vciBjYW4gdGhleSBvYnRhaW4gb25lIHVudGlsCiAJICoJd2Ugc2F5IHNvIGxhdGVyIG9uLgogCSAqLwotCSAKKwogCXdvcmsgPSBjYW5jZWxfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yayk7CiAJLyoKIAkgKiBXYWl0IGZvciAtPmhhbmd1cF93b3JrIGFuZCAtPmZsaXAud29yayBoYW5kbGVycyB0byB0ZXJtaW5hdGUKQEAgLTU4NCwxMCArNjEwLDEyIEBACiAJICovCiAJIAogCXR0eV9sZGlzY19lbmFibGUodHR5KTsKKwlpZiAob190dHkpCisJCXR0eV9sZGlzY19lbmFibGUob190dHkpOwogCQogCS8qIFJlc3RhcnQgaXQgaW4gY2FzZSBubyBjaGFyYWN0ZXJzIGtpY2sgaXQgb2ZmLiBTYWZlIGlmCiAJICAgYWxyZWFkeSBydW5uaW5nICovCi0JaWYod29yaykKKwlpZiAod29yaykKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTI0MjYsNiArMjQ1NCw3IEBACiAJaW50CQlpOwogCXN0cnVjdCBmaWxlCSpmaWxwOwogCXN0cnVjdCB0dHlfbGRpc2MgKmRpc2M7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAkKIAlpZiAoIXR0eSkKIAkJcmV0dXJuOwpAQCAtMjQ1MSw4ICsyNDgwLDkgQEAKIAkJfQogCQl0YXNrX2xvY2socCk7CiAJCWlmIChwLT5maWxlcykgewotCQkJc3Bpbl9sb2NrKCZwLT5maWxlcy0+ZmlsZV9sb2NrKTsKLQkJCWZvciAoaT0wOyBpIDwgcC0+ZmlsZXMtPm1heF9mZHM7IGkrKykgeworCQkJcmN1X3JlYWRfbG9jaygpOworCQkJZmR0ID0gZmlsZXNfZmR0YWJsZShwLT5maWxlcyk7CisJCQlmb3IgKGk9MDsgaSA8IGZkdC0+bWF4X2ZkczsgaSsrKSB7CiAJCQkJZmlscCA9IGZjaGVja19maWxlcyhwLT5maWxlcywgaSk7CiAJCQkJaWYgKCFmaWxwKQogCQkJCQljb250aW51ZTsKQEAgLTI0NjUsNyArMjQ5NSw3IEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KLQkJCXNwaW5fdW5sb2NrKCZwLT5maWxlcy0+ZmlsZV9sb2NrKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQl9CiAJCXRhc2tfdW5sb2NrKHApOwogCX0gd2hpbGVfZWFjaF90YXNrX3BpZChzZXNzaW9uLCBQSURUWVBFX1NJRCwgcCk7CkBAIC0yOTExLDExICsyOTQxLDYgQEAKICNpZmRlZiBDT05GSUdfRUFSTFlfUFJJTlRLCiAJZGlzYWJsZV9lYXJseV9wcmludGsoKTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19TRVJJQUxfNjgzNjAKLSAJLyogVGhpcyBpcyBub3QgYSBjb25zb2xlIGluaXRjYWxsLiBJIGtub3cgbm90IHdoYXQgaXQncyBkb2luZyBoZXJlLgotCSAgIFNvIEkgaGF2ZW4ndCBtb3ZlZCBpdC4gZHdtdzIgKi8KLSAgICAgICAgcnNfMzYwX2luaXQoKTsKLSNlbmRpZgogCWNhbGwgPSBfX2Nvbl9pbml0Y2FsbF9zdGFydDsKIAl3aGlsZSAoY2FsbCA8IF9fY29uX2luaXRjYWxsX2VuZCkgewogCQkoKmNhbGwpKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdnQuYyBiL2RyaXZlcnMvY2hhci92dC5jCmluZGV4IDY2NTEwM2MuLjFlMzNjYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92dC5jCisrKyBiL2RyaXZlcnMvY2hhci92dC5jCkBAIC00MzQsMjEgKzQzNCwyNSBAQAogLyogdXNlZCBieSBzZWxlY3Rpb246IGNvbXBsZW1lbnQgcG9pbnRlciBwb3NpdGlvbiAqLwogdm9pZCBjb21wbGVtZW50X3BvcyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBvZmZzZXQpCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIHNob3J0ICpwOworCXN0YXRpYyBpbnQgb2xkX29mZnNldCA9IC0xOwogCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBvbGQ7CiAJc3RhdGljIHVuc2lnbmVkIHNob3J0IG9sZHgsIG9sZHk7CiAKIAlXQVJOX0NPTlNPTEVfVU5MT0NLRUQoKTsKIAotCWlmIChwKSB7Ci0JCXNjcl93cml0ZXcob2xkLCBwKTsKKwlpZiAob2xkX29mZnNldCAhPSAtMSAmJiBvbGRfb2Zmc2V0ID49IDAgJiYKKwkgICAgb2xkX29mZnNldCA8IHZjLT52Y19zY3JlZW5idWZfc2l6ZSkgeworCQlzY3Jfd3JpdGV3KG9sZCwgc2NyZWVucG9zKHZjLCBvbGRfb2Zmc2V0LCAxKSk7CiAJCWlmIChET19VUERBVEUodmMpKQogCQkJdmMtPnZjX3N3LT5jb25fcHV0Yyh2Yywgb2xkLCBvbGR5LCBvbGR4KTsKIAl9Ci0JaWYgKG9mZnNldCA9PSAtMSkKLQkJcCA9IE5VTEw7Ci0JZWxzZSB7CisKKwlvbGRfb2Zmc2V0ID0gb2Zmc2V0OworCisJaWYgKG9mZnNldCAhPSAtMSAmJiBvZmZzZXQgPj0gMCAmJgorCSAgICBvZmZzZXQgPCB2Yy0+dmNfc2NyZWVuYnVmX3NpemUpIHsKIAkJdW5zaWduZWQgc2hvcnQgbmV3OworCQl1bnNpZ25lZCBzaG9ydCAqcDsKIAkJcCA9IHNjcmVlbnBvcyh2Yywgb2Zmc2V0LCAxKTsKIAkJb2xkID0gc2NyX3JlYWR3KHApOwogCQluZXcgPSBvbGQgXiB2Yy0+dmNfY29tcGxlbWVudF9tYXNrOwpAQCAtNDU5LDYgKzQ2Myw3IEBACiAJCQl2Yy0+dmNfc3ctPmNvbl9wdXRjKHZjLCBuZXcsIG9sZHksIG9sZHgpOwogCQl9CiAJfQorCiB9CiAKIHN0YXRpYyB2b2lkIGluc2VydF9jaGFyKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IG5yKQpAQCAtNzQ2LDYgKzc1MSw3IEBACiAJdW5zaWduZWQgbG9uZyBvbGRfb3JpZ2luLCBuZXdfb3JpZ2luLCBuZXdfc2NyX2VuZCwgcmx0aCwgcnJlbSwgZXJyID0gMDsKIAl1bnNpZ25lZCBpbnQgb2xkX2NvbHMsIG9sZF9yb3dzLCBvbGRfcm93X3NpemUsIG9sZF9zY3JlZW5fc2l6ZTsKIAl1bnNpZ25lZCBpbnQgbmV3X2NvbHMsIG5ld19yb3dzLCBuZXdfcm93X3NpemUsIG5ld19zY3JlZW5fc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZW5kOwogCXVuc2lnbmVkIHNob3J0ICpuZXdzY3JlZW47CiAKIAlXQVJOX0NPTlNPTEVfVU5MT0NLRUQoKTsKQEAgLTc4OSwyMCArNzk1LDQ0IEBACiAJb2xkX29yaWdpbiA9IHZjLT52Y19vcmlnaW47CiAJbmV3X29yaWdpbiA9IChsb25nKSBuZXdzY3JlZW47CiAJbmV3X3Njcl9lbmQgPSBuZXdfb3JpZ2luICsgbmV3X3NjcmVlbl9zaXplOwotCWlmIChuZXdfcm93cyA8IG9sZF9yb3dzKQotCQlvbGRfb3JpZ2luICs9IChvbGRfcm93cyAtIG5ld19yb3dzKSAqIG9sZF9yb3dfc2l6ZTsKKworCWlmICh2Yy0+dmNfeSA+IG5ld19yb3dzKSB7CisJCWlmIChvbGRfcm93cyAtIHZjLT52Y195IDwgbmV3X3Jvd3MpIHsKKwkJCS8qCisJCQkgKiBDdXJzb3IgbmVhciB0aGUgYm90dG9tLCBjb3B5IGNvbnRlbnRzIGZyb20gdGhlCisJCQkgKiBib3R0b20gb2YgYnVmZmVyCisJCQkgKi8KKwkJCW9sZF9vcmlnaW4gKz0gKG9sZF9yb3dzIC0gbmV3X3Jvd3MpICogb2xkX3Jvd19zaXplOworCQkJZW5kID0gdmMtPnZjX3Njcl9lbmQ7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogQ3Vyc29yIGlzIGluIG5vIG1hbidzIGxhbmQsIGNvcHkgMS8yIHNjcmVlbmZ1bAorCQkJICogZnJvbSB0aGUgdG9wIGFuZCBib3R0b20gb2YgY3Vyc29yIHBvc2l0aW9uCisJCQkgKi8KKwkJCW9sZF9vcmlnaW4gKz0gKHZjLT52Y195IC0gbmV3X3Jvd3MvMikgKiBvbGRfcm93X3NpemU7CisJCQllbmQgPSBvbGRfb3JpZ2luICsgbmV3X3NjcmVlbl9zaXplOworCQl9CisJfSBlbHNlCisJCS8qCisJCSAqIEN1cnNvciBuZWFyIHRoZSB0b3AsIGNvcHkgY29udGVudHMgZnJvbSB0aGUgdG9wIG9mIGJ1ZmZlcgorCQkgKi8KKwkJZW5kID0gKG9sZF9yb3dzID4gbmV3X3Jvd3MpID8gb2xkX29yaWdpbiArIG5ld19zY3JlZW5fc2l6ZSA6CisJCQl2Yy0+dmNfc2NyX2VuZDsKIAogCXVwZGF0ZV9hdHRyKHZjKTsKIAotCXdoaWxlIChvbGRfb3JpZ2luIDwgdmMtPnZjX3Njcl9lbmQpIHsKLQkJc2NyX21lbWNweXcoKHVuc2lnbmVkIHNob3J0ICopIG5ld19vcmlnaW4sICh1bnNpZ25lZCBzaG9ydCAqKSBvbGRfb3JpZ2luLCBybHRoKTsKKwl3aGlsZSAob2xkX29yaWdpbiA8IGVuZCkgeworCQlzY3JfbWVtY3B5dygodW5zaWduZWQgc2hvcnQgKikgbmV3X29yaWdpbiwKKwkJCSAgICAodW5zaWduZWQgc2hvcnQgKikgb2xkX29yaWdpbiwgcmx0aCk7CiAJCWlmIChycmVtKQotCQkJc2NyX21lbXNldHcoKHZvaWQgKikobmV3X29yaWdpbiArIHJsdGgpLCB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwgcnJlbSk7CisJCQlzY3JfbWVtc2V0dygodm9pZCAqKShuZXdfb3JpZ2luICsgcmx0aCksCisJCQkJICAgIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLCBycmVtKTsKIAkJb2xkX29yaWdpbiArPSBvbGRfcm93X3NpemU7CiAJCW5ld19vcmlnaW4gKz0gbmV3X3Jvd19zaXplOwogCX0KIAlpZiAobmV3X3Njcl9lbmQgPiBuZXdfb3JpZ2luKQotCQlzY3JfbWVtc2V0dygodm9pZCAqKW5ld19vcmlnaW4sIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLCBuZXdfc2NyX2VuZCAtIG5ld19vcmlnaW4pOworCQlzY3JfbWVtc2V0dygodm9pZCAqKW5ld19vcmlnaW4sIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLAorCQkJICAgIG5ld19zY3JfZW5kIC0gbmV3X29yaWdpbik7CiAJaWYgKHZjLT52Y19rbWFsbG9jZWQpCiAJCWtmcmVlKHZjLT52Y19zY3JlZW5idWYpOwogCXZjLT52Y19zY3JlZW5idWYgPSBuZXdzY3JlZW47CkBAIC0yMjcyLDcgKzIzMDIsOSBAQAogCQkJcmV0ID0gcGFzdGVfc2VsZWN0aW9uKHR0eSk7CiAJCQlicmVhazsKIAkJY2FzZSBUSU9DTF9VTkJMQU5LU0NSRUVOOgorCQkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwogCQkJdW5ibGFua19zY3JlZW4oKTsKKwkJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKIAkJCWJyZWFrOwogCQljYXNlIFRJT0NMX1NFTExPQURMVVQ6CiAJCQlyZXQgPSBzZWxfbG9hZGx1dChwKTsKQEAgLTIzMTcsOCArMjM0OSwxMCBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVElPQ0xfQkxBTktTQ1JFRU46CS8qIHVudGlsIGV4cGxpY2l0bHkgdW5ibGFua2VkLCBub3Qgb25seSBwb2tlZCAqLworCQkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwogCQkJaWdub3JlX3Bva2UgPSAxOwogCQkJZG9fYmxhbmtfc2NyZWVuKDApOworCQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwogCQkJYnJlYWs7CiAJCWNhc2UgVElPQ0xfQkxBTktFRFNDUkVFTjoKIAkJCXJldCA9IGNvbnNvbGVfYmxhbmtlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKaW5kZXggYjUzZTJlMi4uYzM4OThhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKQEAgLTM0Niw2ICszNDYsMTMgQEAKIAl0cmlzdGF0ZSAiTVBDOHh4IFdhdGNoZG9nIFRpbWVyIgogCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgOHh4CiAKK2NvbmZpZyBCT09LRV9XRFQKKwl0cmlzdGF0ZSAiUG93ZXJQQyBCb29rLUUgV2F0Y2hkb2cgVGltZXIiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiAoQk9PS0UgfHwgNHh4KQorCS0tLWhlbHAtLS0KKwkgIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1hcGkudHh0IGZvcgorCSAgbW9yZSBpbmZvcm1hdGlvbi4KKwogIyBNSVBTIEFyY2hpdGVjdHVyZQogCiBjb25maWcgSU5EWURPRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL01ha2VmaWxlCmluZGV4IGMxODM4ODMuLmNmZWFjNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUKQEAgLTIsNDIgKzIsNjggQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBXYXRjaERvZyBkZXZpY2UgZHJpdmVycy4KICMKIAorIyBPbmx5IG9uZSB3YXRjaGRvZyBjYW4gc3VjY2VlZC4gV2UgcHJvYmUgdGhlIElTQS9QQ0kvVVNCIGJhc2VkCisjIHdhdGNoZG9nLWNhcmRzIGZpcnN0LCB0aGVuIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgd2F0Y2hkb2cKKyMgZHJpdmVycyBhbmQgdGhlbiB0aGUgYXJjaGl0ZWN0dXJlIGluZGVwZW5kYW50ICJzb2Z0ZG9nIiBkcml2ZXIuCisjIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3VyIElTQS9QQ0kvVVNCIGNhcmQgaXNuJ3QgZGV0ZWN0ZWQgdGhhdAorIyB5b3UgY2FuIGZhbGwgYmFjayB0byBhbiBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgZHJpdmVyIGFuZCBpZgorIyB0aGF0IGFsc28gZmFpbHMgdGhlbiB5b3UgY2FuIGZhbGwgYmFjayB0byB0aGUgc29mdHdhcmUgd2F0Y2hkb2cKKyMgdG8gZ2l2ZSB5b3Ugc29tZSBjb3Zlci4KKworIyBJU0EtYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKIG9iai0kKENPTkZJR19QQ1dBVENIRE9HKSArPSBwY3dkLm8KLW9iai0kKENPTkZJR19BQ1FVSVJFX1dEVCkgKz0gYWNxdWlyZXdkdC5vCi1vYmotJChDT05GSUdfQURWQU5URUNIX1dEVCkgKz0gYWR2YW50ZWNod2R0Lm8KLW9iai0kKENPTkZJR19JQjcwMF9XRFQpICs9IGliNzAwd2R0Lm8KIG9iai0kKENPTkZJR19NSVhDT01XRCkgKz0gbWl4Y29td2Qubwotb2JqLSQoQ09ORklHX1NDeDIwMF9XRFQpICs9IHNjeDIwMF93ZHQubwotb2JqLSQoQ09ORklHXzYwWFhfV0RUKSArPSBzYmM2MHh4d2R0Lm8KIG9iai0kKENPTkZJR19XRFQpICs9IHdkdC5vCisKKyMgUENJLWJhc2VkIFdhdGNoZG9nIENhcmRzCitvYmotJChDT05GSUdfUENJUENXQVRDSERPRykgKz0gcGN3ZF9wY2kubwogb2JqLSQoQ09ORklHX1dEVFBDSSkgKz0gd2R0X3BjaS5vCisKKyMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCitvYmotJChDT05GSUdfVVNCUENXQVRDSERPRykgKz0gcGN3ZF91c2IubworCisjIEFSTSBBcmNoaXRlY3R1cmUKIG9iai0kKENPTkZJR18yMTI4NV9XQVRDSERPRykgKz0gd2R0Mjg1Lm8KIG9iai0kKENPTkZJR185NzdfV0FUQ0hET0cpICs9IHdkdDk3Ny5vCi1vYmotJChDT05GSUdfSThYWF9UQ08pICs9IGk4eHhfdGNvLm8KLW9iai0kKENPTkZJR19NQUNIWl9XRFQpICs9IG1hY2h6d2Qubwotb2JqLSQoQ09ORklHX1NIX1dEVCkgKz0gc2h3ZHQubworb2JqLSQoQ09ORklHX0lYUDIwMDBfV0FUQ0hET0cpICs9IGl4cDIwMDBfd2R0Lm8KK29iai0kKENPTkZJR19JWFA0WFhfV0FUQ0hET0cpICs9IGl4cDR4eF93ZHQubwogb2JqLSQoQ09ORklHX1MzQzI0MTBfV0FUQ0hET0cpICs9IHMzYzI0MTBfd2R0Lm8KIG9iai0kKENPTkZJR19TQTExMDBfV0FUQ0hET0cpICs9IHNhMTEwMF93ZHQubwotb2JqLSQoQ09ORklHX0VVUk9URUNIX1dEVCkgKz0gZXVyb3RlY2h3ZHQubwotb2JqLSQoQ09ORklHX1c4Mzg3N0ZfV0RUKSArPSB3ODM4NzdmX3dkdC5vCi1vYmotJChDT05GSUdfVzgzNjI3SEZfV0RUKSArPSB3ODM2MjdoZl93ZHQubwotb2JqLSQoQ09ORklHX1NDNTIwX1dEVCkgKz0gc2M1MjBfd2R0Lm8KLW9iai0kKENPTkZJR19BTElNNzEwMV9XRFQpICs9IGFsaW03MTAxX3dkdC5vCisKKyMgWDg2IChpMzg2ICsgaWE2NCArIHg4Nl82NCkgQXJjaGl0ZWN0dXJlCitvYmotJChDT05GSUdfQUNRVUlSRV9XRFQpICs9IGFjcXVpcmV3ZHQubworb2JqLSQoQ09ORklHX0FEVkFOVEVDSF9XRFQpICs9IGFkdmFudGVjaHdkdC5vCiBvYmotJChDT05GSUdfQUxJTTE1MzVfV0RUKSArPSBhbGltMTUzNV93ZHQubwotb2JqLSQoQ09ORklHX1NDMTIwMF9XRFQpICs9IHNjMTIwMHdkdC5vCitvYmotJChDT05GSUdfQUxJTTcxMDFfV0RUKSArPSBhbGltNzEwMV93ZHQubworb2JqLSQoQ09ORklHX1NDNTIwX1dEVCkgKz0gc2M1MjBfd2R0Lm8KK29iai0kKENPTkZJR19FVVJPVEVDSF9XRFQpICs9IGV1cm90ZWNod2R0Lm8KK29iai0kKENPTkZJR19JQjcwMF9XRFQpICs9IGliNzAwd2R0Lm8KIG9iai0kKENPTkZJR19XQUZFUl9XRFQpICs9IHdhZmVyNTgyM3dkdC5vCitvYmotJChDT05GSUdfSThYWF9UQ08pICs9IGk4eHhfdGNvLm8KK29iai0kKENPTkZJR19TQzEyMDBfV0RUKSArPSBzYzEyMDB3ZHQubworb2JqLSQoQ09ORklHX1NDeDIwMF9XRFQpICs9IHNjeDIwMF93ZHQubworb2JqLSQoQ09ORklHXzYwWFhfV0RUKSArPSBzYmM2MHh4d2R0Lm8KIG9iai0kKENPTkZJR19DUFU1X1dEVCkgKz0gY3B1NXdkdC5vCi1vYmotJChDT05GSUdfSU5EWURPRykgKz0gaW5keWRvZy5vCi1vYmotJChDT05GSUdfUENJUENXQVRDSERPRykgKz0gcGN3ZF9wY2kubwotb2JqLSQoQ09ORklHX1VTQlBDV0FUQ0hET0cpICs9IHBjd2RfdXNiLm8KLW9iai0kKENPTkZJR19JWFA0WFhfV0FUQ0hET0cpICs9IGl4cDR4eF93ZHQubwotb2JqLSQoQ09ORklHX0lYUDIwMDBfV0FUQ0hET0cpICs9IGl4cDIwMDBfd2R0Lm8KK29iai0kKENPTkZJR19XODM2MjdIRl9XRFQpICs9IHc4MzYyN2hmX3dkdC5vCitvYmotJChDT05GSUdfVzgzODc3Rl9XRFQpICs9IHc4Mzg3N2Zfd2R0Lm8KK29iai0kKENPTkZJR19NQUNIWl9XRFQpICs9IG1hY2h6d2QubworCisjIFBvd2VyUEMgQXJjaGl0ZWN0dXJlCiBvYmotJChDT05GSUdfOHh4X1dEVCkgKz0gbXBjOHh4X3dkdC5vCisKKyMgUFBDNjQgQXJjaGl0ZWN0dXJlCiBvYmotJChDT05GSUdfV0FUQ0hET0dfUlRBUykgKz0gd2RydGFzLm8KK29iai0kKENPTkZJR19CT09LRV9XRFQpICs9IGJvb2tlX3dkdC5vCiAKLSMgT25seSBvbmUgd2F0Y2hkb2cgY2FuIHN1Y2NlZWQuIFdlIHByb2JlIHRoZSBoYXJkd2FyZSB3YXRjaGRvZwotIyBkcml2ZXJzIGZpcnN0LCB0aGVuIHRoZSBzb2Z0ZG9nIGRyaXZlci4gIFRoaXMgbWVhbnMgaWYgeW91ciBoYXJkd2FyZQotIyB3YXRjaGRvZyBkaWVzIG9yIGlzICdib3Jyb3dlZCcgZm9yIHNvbWUgcmVhc29uIHRoZSBzb2Z0d2FyZSB3YXRjaGRvZwotIyBzdGlsbCBnaXZlcyB5b3Ugc29tZSBjb3Zlci4KKyMgTUlQUyBBcmNoaXRlY3R1cmUKK29iai0kKENPTkZJR19JTkRZRE9HKSArPSBpbmR5ZG9nLm8KIAorIyBTMzkwIEFyY2hpdGVjdHVyZQorCisjIFNVUEVSSCBBcmNoaXRlY3R1cmUKK29iai0kKENPTkZJR19TSF9XRFQpICs9IHNod2R0Lm8KKworIyBTUEFSQzY0IEFyY2hpdGVjdHVyZQorCisjIEFyY2hpdGVjdHVyZSBJbmRlcGVuZGFudAogb2JqLSQoQ09ORklHX1NPRlRfV0FUQ0hET0cpICs9IHNvZnRkb2cubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2Jvb2tlX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2Jvb2tlX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYzMwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYm9va2Vfd2R0LmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBkcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYm9va2Vfd2R0LmMKKyAqCisgKiBXYXRjaGRvZyB0aW1lciBmb3IgUG93ZXJQQyBCb29rLUUgc3lzdGVtcworICoKKyAqIEF1dGhvcjogTWF0dGhldyBNY0NsaW50b2NrCisgKiBNYWludGFpbmVyOiBLdW1hciBHYWxhIDxrdW1hci5nYWxhQGZyZWVzY2FsZS5jb20+CisgKgorICogQ29weXJpZ2h0IDIwMDUgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKworI2luY2x1ZGUgPGFzbS9yZWdfYm9va2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyogSWYgdGhlIGtlcm5lbCBwYXJhbWV0ZXIgd2R0X2VuYWJsZT0xLCB0aGUgd2F0Y2hkb2cgd2lsbCBiZSBlbmFibGVkIGF0IGJvb3QuCisgKiBBbHNvLCB0aGUgd2R0X3BlcmlvZCBzZXRzIHRoZSB3YXRjaGRvZyB0aW1lciBwZXJpb2QgdGltZW91dC4KKyAqIEZvciBFNTAwIGNwdXMgdGhlIHdkdF9wZXJpb2Qgc2V0cyB3aGljaCBiaXQgY2hhbmdpbmcgZnJvbSAwLT4xIHdpbGwKKyAqIHRyaWdnZXIgYSB3YXRjaG9nIHRpbWVvdXQuIFRoaXMgd2F0Y2hkb2cgdGltZW91dCB3aWxsIG9jY3VyIDMgdGltZXMsIHRoZQorICogZmlyc3QgdGltZSBub3RoaW5nIHdpbGwgaGFwcGVuLCB0aGUgc2Vjb25kIHRpbWUgYSB3YXRjaGRvZyBleGNlcHRpb24gd2lsbAorICogb2NjdXIsIGFuZCB0aGUgZmluYWwgdGltZSB0aGUgYm9hcmQgd2lsbCByZXNldC4KKyAqLworCisjaWZkZWYJQ09ORklHX0ZTTF9CT09LRQorI2RlZmluZSBXRFRfUEVSSU9EX0RFRkFVTFQgNjMJLyogRXguIHdkdF9wZXJpb2Q9MjggYnVzPTMzM01oeiAsIHJlc2V0PX40MHNlYyAqLworI2Vsc2UKKyNkZWZpbmUgV0RUX1BFUklPRF9ERUZBVUxUIDQJLyogUmVmZXIgdG8gdGhlIFBQQzQweCBhbmQgUFBDNHh4IG1hbnVhbHMgKi8KKyNlbmRpZgkJCQkvKiBmb3IgdGltaW5nIGluZm9ybWF0aW9uICovCisKK3UzMiBib29rZV93ZHRfZW5hYmxlZCA9IDA7Cit1MzIgYm9va2Vfd2R0X3BlcmlvZCA9IFdEVF9QRVJJT0RfREVGQVVMVDsKKworI2lmZGVmCUNPTkZJR19GU0xfQk9PS0UKKyNkZWZpbmUgV0RUUCh4KQkJKCgoKDYzLXgpJjB4Myk8PDMwKXwoKCg2My14KSYweDNjKTw8MTUpKQorI2Vsc2UKKyNkZWZpbmUgV0RUUCh4KQkJKFRDUl9XUCh4KSkKKyNlbmRpZgorCisvKgorICogYm9va2Vfd2R0X2VuYWJsZToKKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBib29rZV93ZHRfZW5hYmxlKHZvaWQpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IG1mc3ByKFNQUk5fVENSKTsKKwl2YWwgfD0gKFRDUl9XSUV8VENSX1dSQyhXUkNfQ0hJUCl8V0RUUChib29rZV93ZHRfcGVyaW9kKSk7CisKKwltdHNwcihTUFJOX1RDUiwgdmFsKTsKK30KKworLyoKKyAqIGJvb2tlX3dkdF9waW5nOgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJvb2tlX3dkdF9waW5nKHZvaWQpCit7CisJbXRzcHIoU1BSTl9UU1IsIFRTUl9FTld8VFNSX1dJUyk7Cit9CisKKy8qCisgKiBib29rZV93ZHRfd3JpdGU6CisgKi8KK3N0YXRpYyBzc2l6ZV90IGJvb2tlX3dkdF93cml0ZSAoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlib29rZV93ZHRfcGluZygpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworICAub3B0aW9ucyA9IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9LRUVQQUxJVkVQSU5HLAorICAuZmlybXdhcmVfdmVyc2lvbiA9IDAsCisgIC5pZGVudGl0eSA9ICJQb3dlclBDIEJvb2stRSBXYXRjaGRvZyIsCit9OworCisvKgorICogYm9va2Vfd2R0X2lvY3RsOgorICovCitzdGF0aWMgaW50IGJvb2tlX3dkdF9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdTMyIHRtcCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJaWYgKGNvcHlfdG9fdXNlciAoKHN0cnVjdCB3YXRjaGRvZ19pbmZvICopIGFyZywgJmlkZW50LAorCQkJCXNpemVvZihzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCXJldHVybiBwdXRfdXNlcihpZGVudC5vcHRpb25zLCAodTMyICopIGFyZyk7CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQkvKiBYWFg6IHNvbWV0aGluZyBpcyBjbGVhcmluZyBUU1IgKi8KKwkJdG1wID0gbWZzcHIoU1BSTl9UU1IpICYgVFNSX1dSUygzKTsKKwkJLyogcmV0dXJucyAxIGlmIGxhc3QgcmVzZXQgd2FzIGNhdXNlZCBieSB0aGUgV0RUICovCisJCXJldHVybiAodG1wID8gMSA6IDApOworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQlib29rZV93ZHRfcGluZygpOworCQlyZXR1cm4gMDsKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihib29rZV93ZHRfcGVyaW9kLCAodTMyICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbXRzcHIoU1BSTl9UQ1IsIChtZnNwcihTUFJOX1RDUikmfldEVFAoMCkpfFdEVFAoYm9va2Vfd2R0X3BlcmlvZCkpOworCQlyZXR1cm4gMDsKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldHVybiBwdXRfdXNlcihib29rZV93ZHRfcGVyaW9kLCAodTMyICopIGFyZyk7CisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlpZiAoZ2V0X3VzZXIodG1wLCAodTMyICopIGFyZykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHRtcCA9PSBXRElPU19FTkFCTEVDQVJEKSB7CisJCQlib29rZV93ZHRfcGluZygpOworCQkJYnJlYWs7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisvKgorICogYm9va2Vfd2R0X29wZW46CisgKi8KK3N0YXRpYyBpbnQgYm9va2Vfd2R0X29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChib29rZV93ZHRfZW5hYmxlZCA9PSAwKSB7CisJCWJvb2tlX3dkdF9lbmFibGVkID0gMTsKKwkJYm9va2Vfd2R0X2VuYWJsZSgpOworCQlwcmludGsgKEtFUk5fSU5GTyAiUG93ZXJQQyBCb29rLUUgV2F0Y2hkb2cgVGltZXIgRW5hYmxlZCAod2R0X3BlcmlvZD0lZClcbiIsCisJCQkJYm9va2Vfd2R0X3BlcmlvZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJvb2tlX3dkdF9mb3BzID0geworICAub3duZXIgPSBUSElTX01PRFVMRSwKKyAgLmxsc2VlayA9IG5vX2xsc2VlaywKKyAgLndyaXRlID0gYm9va2Vfd2R0X3dyaXRlLAorICAuaW9jdGwgPSBib29rZV93ZHRfaW9jdGwsCisgIC5vcGVuID0gYm9va2Vfd2R0X29wZW4sCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYm9va2Vfd2R0X21pc2NkZXYgPSB7CisgIC5taW5vciA9IFdBVENIRE9HX01JTk9SLAorICAubmFtZSA9ICJ3YXRjaGRvZyIsCisgIC5mb3BzID0gJmJvb2tlX3dkdF9mb3BzLAorfTsKKworc3RhdGljIHZvaWQgX19leGl0IGJvb2tlX3dkdF9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZib29rZV93ZHRfbWlzY2Rldik7Cit9CisKKy8qCisgKiBib29rZV93ZHRfaW5pdDoKKyAqLworc3RhdGljIGludCBfX2luaXQgYm9va2Vfd2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByaW50ayAoS0VSTl9JTkZPICJQb3dlclBDIEJvb2stRSBXYXRjaGRvZyBUaW1lciBMb2FkZWRcbiIpOworCWlkZW50LmZpcm13YXJlX3ZlcnNpb24gPSBjcHVfc3BlY3NbMF0ucHZyX3ZhbHVlOworCisJcmV0ID0gbWlzY19yZWdpc3RlcigmYm9va2Vfd2R0X21pc2NkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrIChLRVJOX0NSSVQgIkNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChib29rZV93ZHRfZW5hYmxlZCA9PSAxKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJQb3dlclBDIEJvb2stRSBXYXRjaGRvZyBUaW1lciBFbmFibGVkICh3ZHRfcGVyaW9kPSVkKVxuIiwKKwkJCQlib29rZV93ZHRfcGVyaW9kKTsKKwkJYm9va2Vfd2R0X2VuYWJsZSgpOworCX0KKworCXJldHVybiByZXQ7Cit9CitkZXZpY2VfaW5pdGNhbGwoYm9va2Vfd2R0X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDIwMDBfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaXhwMjAwMF93ZHQuYwppbmRleCBlNzY0MGJjLi4wY2ZiOWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaXhwMjAwMF93ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaXhwMjAwMF93ZHQuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiBzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgaXhwMjAwMF93ZHRfbWlzY2RldiA9CiB7CiAJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAotCS5uYW1lCQk9ICJJWFAyMDAwIFdhdGNoZG9nIiwKKwkubmFtZQkJPSAid2F0Y2hkb2ciLAogCS5mb3BzCQk9ICZpeHAyMDAwX3dkdF9mb3BzLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDR4eF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9peHA0eHhfd2R0LmMKaW5kZXggOGQ5MTZhZi4uYjViZThiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDR4eF93ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaXhwNHh4X3dkdC5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBpeHA0eHhfd2R0X21pc2NkZXYgPQogewogCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKLQkubmFtZQkJPSAiSVhQNHh4IFdhdGNoZG9nIiwKKwkubmFtZQkJPSAid2F0Y2hkb2ciLAogCS5mb3BzCQk9ICZpeHA0eHhfd2R0X2ZvcHMsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbWl4Y29td2QuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9taXhjb213ZC5jCmluZGV4IGM5YjMwMWQuLjdmYzIxODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9taXhjb213ZC5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9taXhjb213ZC5jCkBAIC01OSw3ICs1OSw3IEBACiAKIHN0YXRpYyBpbnQgd2F0Y2hkb2dfcG9ydDsKIHN0YXRpYyBpbnQgbWl4Y29td2RfdGltZXJfYWxpdmU7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgbWl4Y29td2RfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIobWl4Y29td2RfdGltZXIsIE5VTEwsIDAsIDApOwogc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOwogCiBzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCmluZGV4IGY4NWFjODkuLjhiMjkyYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCkBAIC0yNyw3ICsyNywxMCBAQAogICoJCQkJRml4ZWQgdG1yX2NvdW50IC8gd2R0X2NvdW50IGNvbmZ1c2lvbgogICoJCQkJQWRkZWQgY29uZmlndXJhYmxlIGRlYnVnCiAgKgotICoJMTEtSmFuLTIwMDQJQkpECUZpeGVkIGRpdmlkZS1ieS0yIGluIHRpbWVvdXQgY29kZQorICoJMTEtSmFuLTIwMDUJQkpECUZpeGVkIGRpdmlkZS1ieS0yIGluIHRpbWVvdXQgY29kZQorICoKKyAqCTI1LUphbi0yMDA1CURBCUFkZGVkIHN1c3BlbmQvcmVzdW1lIHN1cHBvcnQKKyAqCQkJCVJlcGxhY2VkIHJlYm9vdCBub3RpZmllciB3aXRoIC5zaHV0ZG93biBtZXRob2QKICAqCiAgKgkxMC1NYXItMjAwNQlMQ1ZSCUNoYW5nZWQgUzNDMjQxMF9WQSB0byBTM0MyNFhYX1ZBCiAqLwpAQCAtNDAsOCArNDMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0zMTcsMjAgKzMxOCw2IEBACiAJfQogfQogCi0vKgotICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCi0gKi8KLQotc3RhdGljIGludCBzM2MyNDEwd2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCi0JCQkgICAgICB2b2lkICp1bnVzZWQpCi17Ci0JaWYoY29kZT09U1lTX0RPV04gfHwgY29kZT09U1lTX0hBTFQpIHsKLQkJLyogVHVybiB0aGUgV0RUIG9mZiAqLwotCQlzM2MyNDEwd2R0X3N0b3AoKTsKLQl9Ci0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotCiAvKiBrZXJuZWwgaW50ZXJmYWNlICovCiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHMzYzI0MTB3ZHRfZm9wcyA9IHsKQEAgLTM0OCwxMCArMzM1LDYgQEAKIAkuZm9wcwkJPSAmczNjMjQxMHdkdF9mb3BzLAogfTsKIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzM2MyNDEwd2R0X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsCT0gczNjMjQxMHdkdF9ub3RpZnlfc3lzLAotfTsKLQogLyogaW50ZXJydXB0IGhhbmRsZXIgY29kZSAqLwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgczNjMjQxMHdkdF9pcnEoaW50IGlycW5vLCB2b2lkICpwYXJhbSwKQEAgLTQzMiwxOCArNDE1LDEwIEBACiAJCX0KIAl9CiAKLQlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnMzYzI0MTB3ZHRfbm90aWZpZXIpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKCVkKVxuIiwKLQkJCXJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gbWlzY19yZWdpc3RlcigmczNjMjQxMHdkdF9taXNjZGV2KTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoJWQpXG4iLAogCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7Ci0JCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzM2MyNDEwd2R0X25vdGlmaWVyKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTQ3OSwxNSArNDU0LDYzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHMzYzI0MTB3ZHRfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXMzYzI0MTB3ZHRfc3RvcCgpOwkKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3dGNvbl9zYXZlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgd3RkYXRfc2F2ZTsKKworc3RhdGljIGludCBzM2MyNDEwd2R0X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgc3RhdGUsIHUzMiBsZXZlbCkKK3sKKwlpZiAobGV2ZWwgPT0gU1VTUEVORF9QT1dFUl9ET1dOKSB7CisJCS8qIFNhdmUgd2F0Y2hkb2cgc3RhdGUsIGFuZCB0dXJuIGl0IG9mZi4gKi8KKwkJd3Rjb25fc2F2ZSA9IHJlYWRsKHdkdF9iYXNlICsgUzNDMjQxMF9XVENPTik7CisJCXd0ZGF0X3NhdmUgPSByZWFkbCh3ZHRfYmFzZSArIFMzQzI0MTBfV1REQVQpOworCisJCS8qIE5vdGUgdGhhdCBXVENOVCBkb2Vzbid0IG5lZWQgdG8gYmUgc2F2ZWQuICovCisJCXMzYzI0MTB3ZHRfc3RvcCgpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCWlmIChsZXZlbCA9PSBSRVNVTUVfUE9XRVJfT04pIHsKKwkJLyogUmVzdG9yZSB3YXRjaGRvZyBzdGF0ZS4gKi8KKworCQl3cml0ZWwod3RkYXRfc2F2ZSwgd2R0X2Jhc2UgKyBTM0MyNDEwX1dUREFUKTsKKwkJd3JpdGVsKHd0ZGF0X3NhdmUsIHdkdF9iYXNlICsgUzNDMjQxMF9XVENOVCk7IC8qIFJlc2V0IGNvdW50ICovCisJCXdyaXRlbCh3dGNvbl9zYXZlLCB3ZHRfYmFzZSArIFMzQzI0MTBfV1RDT04pOworCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJ3YXRjaGRvZyAlc2FibGVkXG4iLAorCQkgICAgICAgKHd0Y29uX3NhdmUgJiBTM0MyNDEwX1dUQ09OX0VOQUJMRSkgPyAiZW4iIDogImRpcyIpOworCX0KKworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBzM2MyNDEwd2R0X3N1c3BlbmQgTlVMTAorI2RlZmluZSBzM2MyNDEwd2R0X3Jlc3VtZSAgTlVMTAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzM2MyNDEwd2R0X2RyaXZlciA9IHsKIAkubmFtZQkJPSAiczNjMjQxMC13ZHQiLAogCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAogCS5wcm9iZQkJPSBzM2MyNDEwd2R0X3Byb2JlLAogCS5yZW1vdmUJCT0gczNjMjQxMHdkdF9yZW1vdmUsCisJLnNodXRkb3duCT0gczNjMjQxMHdkdF9zaHV0ZG93biwKKwkuc3VzcGVuZAk9IHMzYzI0MTB3ZHRfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHMzYzI0MTB3ZHRfcmVzdW1lLAogfTsKIAogCi0KIHN0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPSBLRVJOX0lORk8gIlMzQzI0MTAgV2F0Y2hkb2cgVGltZXIsIChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljc1xuIjsKIAogc3RhdGljIGludCBfX2luaXQgd2F0Y2hkb2dfaW5pdCh2b2lkKQpAQCAtNDk5LDEzICs1MjIsMTMgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCB3YXRjaGRvZ19leGl0KHZvaWQpCiB7CiAJZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0MTB3ZHRfZHJpdmVyKTsKLQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmczNjMjQxMHdkdF9ub3RpZmllcik7CiB9CiAKIG1vZHVsZV9pbml0KHdhdGNoZG9nX2luaXQpOwogbW9kdWxlX2V4aXQod2F0Y2hkb2dfZXhpdCk7CiAKLU1PRFVMRV9BVVRIT1IoIkJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4iKTsKK01PRFVMRV9BVVRIT1IoIkJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4sICIKKwkgICAgICAiRGltaXRyeSBBbmRyaWMgPGRpbWl0cnkuYW5kcmljQHRvbXRvbS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlMzQzI0MTAgV2F0Y2hkb2cgRGV2aWNlIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NjeDIwMF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zY3gyMDBfd2R0LmMKaW5kZXggYzQ1Njg1Ni4uYjRhMTAyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NjeDIwMF93ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2N4MjAwX3dkdC5jCkBAIC0yMDYsNyArMjA2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHNjeDIwMF93ZHRfbWlzY2RldiA9IHsKIAkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKLQkubmFtZSAgPSBOQU1FLAorCS5uYW1lICA9ICJ3YXRjaGRvZyIsCiAJLmZvcHMgID0gJnNjeDIwMF93ZHRfZm9wcywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zb2Z0ZG9nLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc29mdGRvZy5jCmluZGV4IDRkN2VkOTMuLjIwZTVlYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zb2Z0ZG9nLmMKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NvZnRkb2cuYwpAQCAtNzcsNyArNzcsNyBAQAogCiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGlja3RvY2sgPQogCQlUSU1FUl9JTklUSUFMSVpFUih3YXRjaGRvZ19maXJlLCAwLCAwKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX2FsaXZlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZHJpdmVyX29wZW4sIG9ycGhhbl90aW1lcjsKIHN0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKIAogCkBAIC04Nyw2ICs4Nyw5IEBACiAKIHN0YXRpYyB2b2lkIHdhdGNoZG9nX2ZpcmUodW5zaWduZWQgbG9uZyBkYXRhKQogeworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJm9ycGhhbl90aW1lcikpCisJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCiAJaWYgKHNvZnRfbm9ib290KQogCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVHJpZ2dlcmVkIC0gUmVib290IGlnbm9yZWQuXG4iKTsKIAllbHNlCkBAIC0xMjgsOSArMTMxLDkgQEAKIAogc3RhdGljIGludCBzb2Z0ZG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JaWYodGVzdF9hbmRfc2V0X2JpdCgwLCAmdGltZXJfYWxpdmUpKQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkcml2ZXJfb3BlbikpCiAJCXJldHVybiAtRUJVU1k7Ci0JaWYgKG5vd2F5b3V0KQorCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KDAsICZvcnBoYW5fdGltZXIpKQogCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwogCS8qCiAJICoJQWN0aXZhdGUgdGltZXIKQEAgLTE0NywxMSArMTUwLDEzIEBACiAJICovCiAJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgewogCQlzb2Z0ZG9nX3N0b3AoKTsKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOworCQlzZXRfYml0KDAsICZvcnBoYW5fdGltZXIpOwogCQlzb2Z0ZG9nX2tlZXBhbGl2ZSgpOwogCX0KLQljbGVhcl9iaXQoMCwgJnRpbWVyX2FsaXZlKTsKKwljbGVhcl9iaXQoMCwgJmRyaXZlcl9vcGVuKTsKIAlleHBlY3RfY2xvc2UgPSAwOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jCmluZGV4IDQ2NWUwZmQuLmI1ZDgyMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ODM2MjdoZl93ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMKQEAgLTkzLDYgKzkzLDEyIEBACiAKIAl3ODM2MjdoZl9zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKIAorCW91dGJfcCgweEY2LCBXRFRfRUZFUik7IC8qIFNlbGVjdCBDUkY2ICovCisJdD1pbmJfcChXRFRfRUZEUik7ICAgICAgLyogcmVhZCBDUkY2ICovCisJaWYgKHQgIT0gMCkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIGFscmVhZHkgcnVubmluZy4gUmVzZXR0aW5nIHRpbWVvdXQgdG8gJWQgc2VjXG4iLCB0aW1lb3V0KTsKKwkJb3V0Yl9wKHRpbWVvdXQsIFdEVF9FRkRSKTsgICAgLyogV3JpdGUgYmFjayB0byBDUkY2ICovCisJfQogCW91dGJfcCgweEY1LCBXRFRfRUZFUik7IC8qIFNlbGVjdCBDUkY1ICovCiAJdD1pbmJfcChXRFRfRUZEUik7ICAgICAgLyogcmVhZCBDUkY1ICovCiAJdCY9fjB4MEM7ICAgICAgICAgICAgICAgLyogc2V0IHNlY29uZCBtb2RlICYgZGlzYWJsZSBrZXlib2FyZCB0dXJuaW5nIG9mZiB3YXRjaGRvZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggMTBiMDE0OS4uMTA5ZDYyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC02MjcsNyArNjI3LDcgQEAKIAogCXJldCA9IGtvYmplY3RfcmVnaXN0ZXIoJnBvbGljeS0+a29iaik7CiAJaWYgKHJldCkKLQkJZ290byBlcnJfb3V0OworCQlnb3RvIGVycl9vdXRfZHJpdmVyX2V4aXQ7CiAKIAkvKiBzZXQgdXAgZmlsZXMgZm9yIHRoaXMgY3B1IGRldmljZSAqLwogCWRydl9hdHRyID0gY3B1ZnJlcV9kcml2ZXItPmF0dHI7CkBAIC02NzMsNiArNjczLDEwIEBACiAJa29iamVjdF91bnJlZ2lzdGVyKCZwb2xpY3ktPmtvYmopOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBvbGljeS0+a29ial91bnJlZ2lzdGVyKTsKIAorZXJyX291dF9kcml2ZXJfZXhpdDoKKwlpZiAoY3B1ZnJlcV9kcml2ZXItPmV4aXQpCisJCWNwdWZyZXFfZHJpdmVyLT5leGl0KHBvbGljeSk7CisKIGVycl9vdXQ6CiAJa2ZyZWUocG9saWN5KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCmluZGV4IDViMjljM2IuLjMyN2I1OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZworKysgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcKQEAgLTU4LDQgKzU4LDMxIEBACiAKIAkgIFNlZSA8aHR0cDovL3d3dy5kaWc2NC5vcmcvc3BlY2lmaWNhdGlvbnMvRElHNjRfSENEUHYyMF8wNDI4MDQucGRmPgogCitjb25maWcgREVMTF9SQlUKKwl0cmlzdGF0ZSAiQklPUyB1cGRhdGUgc3VwcG9ydCBmb3IgREVMTCBzeXN0ZW1zIHZpYSBzeXNmcyIKKwlzZWxlY3QgRldfTE9BREVSCisJaGVscAorCSBTYXkgbSBpZiB5b3Ugd2FudCB0byBoYXZlIHRoZSBvcHRpb24gb2YgdXBkYXRpbmcgdGhlIEJJT1MgZm9yIHlvdXIKKwkgREVMTCBzeXN0ZW0uIE5vdGUgeW91IG5lZWQgYSBEZWxsIE9wZW5NYW5hZ2Ugb3IgRGVsbCBVcGRhdGUgcGFja2FnZSAoRFVQKQorCSBzdXBwb3J0aW5nIGFwcGxpY2F0aW9uIHRvIGNvbXVuaWNhdGUgd2l0aCB0aGUgQklPUyByZWdhcmRpbmcgdGhlIG5ldworCSBpbWFnZSBmb3IgdGhlIGltYWdlIHVwZGF0ZSB0byB0YWtlIGVmZmVjdC4KKwkgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vZGVsbF9yYnUudHh0PiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBkcml2ZXIuCisKK2NvbmZpZyBEQ0RCQVMKKwl0cmlzdGF0ZSAiRGVsbCBTeXN0ZW1zIE1hbmFnZW1lbnQgQmFzZSBEcml2ZXIiCisJZGVwZW5kcyBvbiBYODYgfHwgWDg2XzY0CisJZGVmYXVsdCBtCisJaGVscAorCSAgVGhlIERlbGwgU3lzdGVtcyBNYW5hZ2VtZW50IEJhc2UgRHJpdmVyIHByb3ZpZGVzIGEgc3lzZnMgaW50ZXJmYWNlCisJICBmb3Igc3lzdGVtcyBtYW5hZ2VtZW50IHNvZnR3YXJlIHRvIHBlcmZvcm0gU3lzdGVtIE1hbmFnZW1lbnQKKwkgIEludGVycnVwdHMgKFNNSXMpIGFuZCBIb3N0IENvbnRyb2wgQWN0aW9ucyAoc3lzdGVtIHBvd2VyIGN5Y2xlIG9yCisJICBwb3dlciBvZmYgYWZ0ZXIgT1Mgc2h1dGRvd24pIG9uIGNlcnRhaW4gRGVsbCBzeXN0ZW1zLgorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9kY2RiYXMudHh0PiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBkcml2ZXIKKwkgIGFuZCB0aGUgRGVsbCBzeXN0ZW1zIG9uIHdoaWNoIERlbGwgc3lzdGVtcyBtYW5hZ2VtZW50IHNvZnR3YXJlIG1ha2VzCisJICB1c2Ugb2YgdGhpcyBkcml2ZXIuCisKKwkgIFNheSBZIG9yIE0gaGVyZSB0byBlbmFibGUgdGhlIGRyaXZlciBmb3IgdXNlIGJ5IERlbGwgc3lzdGVtcworCSAgbWFuYWdlbWVudCBzb2Z0d2FyZSBzdWNoIGFzIERlbGwgT3Blbk1hbmFnZS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggOTBmZDBiMi4uODU0Mjk5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlCkBAIC00LDMgKzQsNSBAQAogb2JqLSQoQ09ORklHX0VERCkgICAgICAgICAgICAgCSs9IGVkZC5vCiBvYmotJChDT05GSUdfRUZJX1ZBUlMpCQkrPSBlZml2YXJzLm8KIG9iai0kKENPTkZJR19FRklfUENEUCkJCSs9IHBjZHAubworb2JqLSQoQ09ORklHX0RFTExfUkJVKSAgICAgICAgICArPSBkZWxsX3JidS5vCitvYmotJChDT05GSUdfRENEQkFTKQkJKz0gZGNkYmFzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTUzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCkBAIC0wLDAgKzEsNTk2IEBACisvKgorICogIGRjZGJhcy5jOiBEZWxsIFN5c3RlbXMgTWFuYWdlbWVudCBCYXNlIERyaXZlcgorICoKKyAqICBUaGUgRGVsbCBTeXN0ZW1zIE1hbmFnZW1lbnQgQmFzZSBEcml2ZXIgcHJvdmlkZXMgYSBzeXNmcyBpbnRlcmZhY2UgZm9yCisgKiAgc3lzdGVtcyBtYW5hZ2VtZW50IHNvZnR3YXJlIHRvIHBlcmZvcm0gU3lzdGVtIE1hbmFnZW1lbnQgSW50ZXJydXB0cyAoU01JcykKKyAqICBhbmQgSG9zdCBDb250cm9sIEFjdGlvbnMgKHBvd2VyIGN5Y2xlIG9yIHBvd2VyIG9mZiBhZnRlciBPUyBzaHV0ZG93bikgb24KKyAqICBEZWxsIHN5c3RlbXMuCisgKgorICogIFNlZSBEb2N1bWVudGF0aW9uL2RjZGJhcy50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IERlbGwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAiZGNkYmFzLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJkY2RiYXMiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiNS42LjAtMSIKKyNkZWZpbmUgRFJJVkVSX0RFU0NSSVBUSU9OCSJEZWxsIFN5c3RlbXMgTWFuYWdlbWVudCBCYXNlIERyaXZlciIKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRjZGJhc19wZGV2OworCitzdGF0aWMgdTggKnNtaV9kYXRhX2J1ZjsKK3N0YXRpYyBkbWFfYWRkcl90IHNtaV9kYXRhX2J1Zl9oYW5kbGU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbWlfZGF0YV9idWZfc2l6ZTsKK3N0YXRpYyB1MzIgc21pX2RhdGFfYnVmX3BoeXNfYWRkcjsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHNtaV9kYXRhX2xvY2spOworCitzdGF0aWMgdW5zaWduZWQgaW50IGhvc3RfY29udHJvbF9hY3Rpb247CitzdGF0aWMgdW5zaWduZWQgaW50IGhvc3RfY29udHJvbF9zbWlfdHlwZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaG9zdF9jb250cm9sX29uX3NodXRkb3duOworCisvKioKKyAqIHNtaV9kYXRhX2J1Zl9mcmVlOiBmcmVlIFNNSSBkYXRhIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBzbWlfZGF0YV9idWZfZnJlZSh2b2lkKQoreworCWlmICghc21pX2RhdGFfYnVmKQorCQlyZXR1cm47CisKKwlkZXZfZGJnKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IHBoeXM6ICV4IHNpemU6ICVsdVxuIiwKKwkJX19GVU5DVElPTl9fLCBzbWlfZGF0YV9idWZfcGh5c19hZGRyLCBzbWlfZGF0YV9idWZfc2l6ZSk7CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmZGNkYmFzX3BkZXYtPmRldiwgc21pX2RhdGFfYnVmX3NpemUsIHNtaV9kYXRhX2J1ZiwKKwkJCSAgc21pX2RhdGFfYnVmX2hhbmRsZSk7CisJc21pX2RhdGFfYnVmID0gTlVMTDsKKwlzbWlfZGF0YV9idWZfaGFuZGxlID0gMDsKKwlzbWlfZGF0YV9idWZfcGh5c19hZGRyID0gMDsKKwlzbWlfZGF0YV9idWZfc2l6ZSA9IDA7Cit9CisKKy8qKgorICogc21pX2RhdGFfYnVmX3JlYWxsb2M6IGdyb3cgU01JIGRhdGEgYnVmZmVyIGlmIG5lZWRlZAorICovCitzdGF0aWMgaW50IHNtaV9kYXRhX2J1Zl9yZWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl2b2lkICpidWY7CisJZG1hX2FkZHJfdCBoYW5kbGU7CisKKwlpZiAoc21pX2RhdGFfYnVmX3NpemUgPj0gc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2l6ZSA+IE1BWF9TTUlfREFUQV9CVUZfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBuZXcgYnVmZmVyIGlzIG5lZWRlZCAqLworCWJ1ZiA9IGRtYV9hbGxvY19jb2hlcmVudCgmZGNkYmFzX3BkZXYtPmRldiwgc2l6ZSwgJmhhbmRsZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJZGV2X2RiZygmZGNkYmFzX3BkZXYtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBzaXplICVsdVxuIiwKKwkJCV9fRlVOQ1RJT05fXywgc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBtZW1vcnkgemVyb2VkIGJ5IGRtYV9hbGxvY19jb2hlcmVudCAqLworCisJaWYgKHNtaV9kYXRhX2J1ZikKKwkJbWVtY3B5KGJ1Ziwgc21pX2RhdGFfYnVmLCBzbWlfZGF0YV9idWZfc2l6ZSk7CisKKwkvKiBmcmVlIGFueSBleGlzdGluZyBidWZmZXIgKi8KKwlzbWlfZGF0YV9idWZfZnJlZSgpOworCisJLyogc2V0IHVwIG5ldyBidWZmZXIgZm9yIHVzZSAqLworCXNtaV9kYXRhX2J1ZiA9IGJ1ZjsKKwlzbWlfZGF0YV9idWZfaGFuZGxlID0gaGFuZGxlOworCXNtaV9kYXRhX2J1Zl9waHlzX2FkZHIgPSAodTMyKSB2aXJ0X3RvX3BoeXMoYnVmKTsKKwlzbWlfZGF0YV9idWZfc2l6ZSA9IHNpemU7CisKKwlkZXZfZGJnKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IHBoeXM6ICV4IHNpemU6ICVsdVxuIiwKKwkJX19GVU5DVElPTl9fLCBzbWlfZGF0YV9idWZfcGh5c19hZGRyLCBzbWlfZGF0YV9idWZfc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc21pX2RhdGFfYnVmX3BoeXNfYWRkcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgc21pX2RhdGFfYnVmX3BoeXNfYWRkcik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNtaV9kYXRhX2J1Zl9zaXplX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIHNtaV9kYXRhX2J1Zl9zaXplKTsKK30KKworc3RhdGljIHNzaXplX3Qgc21pX2RhdGFfYnVmX3NpemVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBidWZfc2l6ZTsKKwlzc2l6ZV90IHJldDsKKworCWJ1Zl9zaXplID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwkvKiBtYWtlIHN1cmUgU01JIGRhdGEgYnVmZmVyIGlzIGF0IGxlYXN0IGJ1Zl9zaXplICovCisJZG93bigmc21pX2RhdGFfbG9jayk7CisJcmV0ID0gc21pX2RhdGFfYnVmX3JlYWxsb2MoYnVmX3NpemUpOworCXVwKCZzbWlfZGF0YV9sb2NrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzbWlfZGF0YV9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBwb3MsCisJCQkgICAgIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgbWF4X3JlYWQ7CisJc3NpemVfdCByZXQ7CisKKwlkb3duKCZzbWlfZGF0YV9sb2NrKTsKKworCWlmIChwb3MgPj0gc21pX2RhdGFfYnVmX3NpemUpIHsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJbWF4X3JlYWQgPSBzbWlfZGF0YV9idWZfc2l6ZSAtIHBvczsKKwlyZXQgPSBtaW4obWF4X3JlYWQsIGNvdW50KTsKKwltZW1jcHkoYnVmLCBzbWlfZGF0YV9idWYgKyBwb3MsIHJldCk7CitvdXQ6CisJdXAoJnNtaV9kYXRhX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNtaV9kYXRhX3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBwb3MsCisJCQkgICAgICBzaXplX3QgY291bnQpCit7CisJc3NpemVfdCByZXQ7CisKKwlkb3duKCZzbWlfZGF0YV9sb2NrKTsKKworCXJldCA9IHNtaV9kYXRhX2J1Zl9yZWFsbG9jKHBvcyArIGNvdW50KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCW1lbWNweShzbWlfZGF0YV9idWYgKyBwb3MsIGJ1ZiwgY291bnQpOworCXJldCA9IGNvdW50Oworb3V0OgorCXVwKCZzbWlfZGF0YV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBob3N0X2NvbnRyb2xfYWN0aW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBob3N0X2NvbnRyb2xfYWN0aW9uKTsKK30KKworc3RhdGljIHNzaXplX3QgaG9zdF9jb250cm9sX2FjdGlvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgcmV0OworCisJLyogbWFrZSBzdXJlIGJ1ZmZlciBpcyBhdmFpbGFibGUgZm9yIGhvc3QgY29udHJvbCBjb21tYW5kICovCisJZG93bigmc21pX2RhdGFfbG9jayk7CisJcmV0ID0gc21pX2RhdGFfYnVmX3JlYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcG1fY21kKSk7CisJdXAoJnNtaV9kYXRhX2xvY2spOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlob3N0X2NvbnRyb2xfYWN0aW9uID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBob3N0X2NvbnRyb2xfc21pX3R5cGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBob3N0X2NvbnRyb2xfc21pX3R5cGUpOworfQorCitzdGF0aWMgc3NpemVfdCBob3N0X2NvbnRyb2xfc21pX3R5cGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaG9zdF9jb250cm9sX3NtaV90eXBlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBob3N0X2NvbnRyb2xfb25fc2h1dGRvd25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBob3N0X2NvbnRyb2xfb25fc2h1dGRvd24pOworfQorCitzdGF0aWMgc3NpemVfdCBob3N0X2NvbnRyb2xfb25fc2h1dGRvd25fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaG9zdF9jb250cm9sX29uX3NodXRkb3duID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIHNtaV9yZXF1ZXN0OiBnZW5lcmF0ZSBTTUkgcmVxdWVzdAorICoKKyAqIENhbGxlZCB3aXRoIHNtaV9kYXRhX2xvY2suCisgKi8KK3N0YXRpYyBpbnQgc21pX3JlcXVlc3Qoc3RydWN0IHNtaV9jbWQgKnNtaV9jbWQpCit7CisJY3B1bWFza190IG9sZF9tYXNrOworCWludCByZXQgPSAwOworCisJaWYgKHNtaV9jbWQtPm1hZ2ljICE9IFNNSV9DTURfTUFHSUMpIHsKKwkJZGV2X2luZm8oJmRjZGJhc19wZGV2LT5kZXYsICIlczogaW52YWxpZCBtYWdpYyB2YWx1ZVxuIiwKKwkJCSBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVCQURSOworCX0KKworCS8qIFNNSSByZXF1aXJlcyBDUFUgMCAqLworCW9sZF9tYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoMCkpOworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCkgeworCQlkZXZfZGJnKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IGZhaWxlZCB0byBnZXQgQ1BVIDBcbiIsCisJCQlfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGdlbmVyYXRlIFNNSSAqLworCWFzbSB2b2xhdGlsZSAoCisJCSJvdXRiICViMCwldzEiCisJCTogLyogbm8gb3V0cHV0IGFyZ3MgKi8KKwkJOiAiYSIgKHNtaV9jbWQtPmNvbW1hbmRfY29kZSksCisJCSAgImQiIChzbWlfY21kLT5jb21tYW5kX2FkZHJlc3MpLAorCQkgICJiIiAoc21pX2NtZC0+ZWJ4KSwKKwkJICAiYyIgKHNtaV9jbWQtPmVjeCkKKwkJOiAibWVtb3J5IgorCSk7CisKK291dDoKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZF9tYXNrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHNtaV9yZXF1ZXN0X3N0b3JlOgorICoKKyAqIFRoZSB2YWxpZCB2YWx1ZXMgYXJlOgorICogMDogemVybyBTTUkgZGF0YSBidWZmZXIKKyAqIDE6IGdlbmVyYXRlIGNhbGxpbmcgaW50ZXJmYWNlIFNNSQorICogMjogZ2VuZXJhdGUgcmF3IFNNSQorICoKKyAqIFVzZXIgYXBwbGljYXRpb24gd3JpdGVzIHNtaV9jbWQgdG8gc21pX2RhdGEgYmVmb3JlIHRlbGxpbmcgZHJpdmVyCisgKiB0byBnZW5lcmF0ZSBTTUkuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNtaV9yZXF1ZXN0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzbWlfY21kICpzbWlfY21kOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJc3NpemVfdCByZXQ7CisKKwlkb3duKCZzbWlfZGF0YV9sb2NrKTsKKworCWlmIChzbWlfZGF0YV9idWZfc2l6ZSA8IHNpemVvZihzdHJ1Y3Qgc21pX2NtZCkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCXNtaV9jbWQgPSAoc3RydWN0IHNtaV9jbWQgKilzbWlfZGF0YV9idWY7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgMjoKKwkJLyogUmF3IFNNSSAqLworCQlyZXQgPSBzbWlfcmVxdWVzdChzbWlfY21kKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBjb3VudDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBDYWxsaW5nIEludGVyZmFjZSBTTUkgKi8KKwkJc21pX2NtZC0+ZWJ4ID0gKHUzMikgdmlydF90b19waHlzKHNtaV9jbWQtPmNvbW1hbmRfYnVmZmVyKTsKKwkJcmV0ID0gc21pX3JlcXVlc3Qoc21pX2NtZCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gY291bnQ7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJbWVtc2V0KHNtaV9kYXRhX2J1ZiwgMCwgc21pX2RhdGFfYnVmX3NpemUpOworCQlyZXQgPSBjb3VudDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJdXAoJnNtaV9kYXRhX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaG9zdF9jb250cm9sX3NtaTogZ2VuZXJhdGUgaG9zdCBjb250cm9sIFNNSQorICoKKyAqIENhbGxlciBtdXN0IHNldCB1cCB0aGUgaG9zdCBjb250cm9sIGNvbW1hbmQgaW4gc21pX2RhdGFfYnVmLgorICovCitzdGF0aWMgaW50IGhvc3RfY29udHJvbF9zbWkodm9pZCkKK3sKKwlzdHJ1Y3QgYXBtX2NtZCAqYXBtX2NtZDsKKwl1OCAqZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBudW1fdGlja3M7CisJczggY21kX3N0YXR1czsKKwl1OCBpbmRleDsKKworCWFwbV9jbWQgPSAoc3RydWN0IGFwbV9jbWQgKilzbWlfZGF0YV9idWY7CisJYXBtX2NtZC0+c3RhdHVzID0gRVNNX1NUQVRVU19DTURfVU5TVUNDRVNTRlVMOworCisJc3dpdGNoIChob3N0X2NvbnRyb2xfc21pX3R5cGUpIHsKKwljYXNlIEhDX1NNSVRZUEVfVFlQRTE6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCQkvKiB3cml0ZSBTTUkgZGF0YSBidWZmZXIgcGh5c2ljYWwgYWRkcmVzcyAqLworCQlkYXRhID0gKHU4ICopJnNtaV9kYXRhX2J1Zl9waHlzX2FkZHI7CisJCWZvciAoaW5kZXggPSBQRTEzMDBfQ01PU19DTURfU1RSVUNUX1BUUjsKKwkJICAgICBpbmRleCA8IChQRTEzMDBfQ01PU19DTURfU1RSVUNUX1BUUiArIDQpOworCQkgICAgIGluZGV4KyssIGRhdGErKykgeworCQkJb3V0YihpbmRleCwKKwkJCSAgICAgKENNT1NfQkFTRV9QT1JUICsgQ01PU19QQUdFMl9JTkRFWF9QT1JUX1BJSVg0KSk7CisJCQlvdXRiKCpkYXRhLAorCQkJICAgICAoQ01PU19CQVNFX1BPUlQgKyBDTU9TX1BBR0UyX0RBVEFfUE9SVF9QSUlYNCkpOworCQl9CisKKwkJLyogZmlyc3Qgc2V0IHN0YXR1cyB0byAtMSBhcyBjYWxsZWQgYnkgc3BlYyAqLworCQljbWRfc3RhdHVzID0gRVNNX1NUQVRVU19DTURfVU5TVUNDRVNTRlVMOworCQlvdXRiKCh1OCkgY21kX3N0YXR1cywgUENBVF9BUE1fU1RBVFVTX1BPUlQpOworCisJCS8qIGdlbmVyYXRlIFNNTSBjYWxsICovCisJCW91dGIoRVNNX0FQTV9DTUQsIFBDQVRfQVBNX0NPTlRST0xfUE9SVCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisKKwkJLyogd2FpdCBhIGZldyB0byBzZWUgaWYgaXQgZXhlY3V0ZWQgKi8KKwkJbnVtX3RpY2tzID0gVElNRU9VVF9VU0VDX1NIT1JUX1NFTUFfQkxPQ0tJTkc7CisJCXdoaWxlICgoY21kX3N0YXR1cyA9IGluYihQQ0FUX0FQTV9TVEFUVVNfUE9SVCkpCisJCSAgICAgICA9PSBFU01fU1RBVFVTX0NNRF9VTlNVQ0NFU1NGVUwpIHsKKwkJCW51bV90aWNrcy0tOworCQkJaWYgKG51bV90aWNrcyA9PSBFWFBJUkVEX1RJTUVSKQorCQkJCXJldHVybiAtRVRJTUU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEhDX1NNSVRZUEVfVFlQRTI6CisJY2FzZSBIQ19TTUlUWVBFX1RZUEUzOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwkJLyogd3JpdGUgU01JIGRhdGEgYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwkJZGF0YSA9ICh1OCAqKSZzbWlfZGF0YV9idWZfcGh5c19hZGRyOworCQlmb3IgKGluZGV4ID0gUEUxNDAwX0NNT1NfQ01EX1NUUlVDVF9QVFI7CisJCSAgICAgaW5kZXggPCAoUEUxNDAwX0NNT1NfQ01EX1NUUlVDVF9QVFIgKyA0KTsKKwkJICAgICBpbmRleCsrLCBkYXRhKyspIHsKKwkJCW91dGIoaW5kZXgsIChDTU9TX0JBU0VfUE9SVCArIENNT1NfUEFHRTFfSU5ERVhfUE9SVCkpOworCQkJb3V0YigqZGF0YSwgKENNT1NfQkFTRV9QT1JUICsgQ01PU19QQUdFMV9EQVRBX1BPUlQpKTsKKwkJfQorCisJCS8qIGdlbmVyYXRlIFNNTSBjYWxsICovCisJCWlmIChob3N0X2NvbnRyb2xfc21pX3R5cGUgPT0gSENfU01JVFlQRV9UWVBFMykKKwkJCW91dGIoRVNNX0FQTV9DTUQsIFBDQVRfQVBNX0NPTlRST0xfUE9SVCk7CisJCWVsc2UKKwkJCW91dGIoRVNNX0FQTV9DTUQsIFBFMTQwMF9BUE1fQ09OVFJPTF9QT1JUKTsKKworCQkvKiByZXN0b3JlIFJUQyBpbmRleCBwb2ludGVyIHNpbmNlIGl0IHdhcyB3cml0dGVuIHRvIGFib3ZlICovCisJCUNNT1NfUkVBRChSVENfUkVHX0MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCisJCS8qIHJlYWQgY29udHJvbCBwb3J0IGJhY2sgdG8gc2VyaWFsaXplIHdyaXRlICovCisJCWNtZF9zdGF0dXMgPSBpbmIoUEUxNDAwX0FQTV9DT05UUk9MX1BPUlQpOworCisJCS8qIHdhaXQgYSBmZXcgdG8gc2VlIGlmIGl0IGV4ZWN1dGVkICovCisJCW51bV90aWNrcyA9IFRJTUVPVVRfVVNFQ19TSE9SVF9TRU1BX0JMT0NLSU5HOworCQl3aGlsZSAoYXBtX2NtZC0+c3RhdHVzID09IEVTTV9TVEFUVVNfQ01EX1VOU1VDQ0VTU0ZVTCkgeworCQkJbnVtX3RpY2tzLS07CisJCQlpZiAobnVtX3RpY2tzID09IEVYUElSRURfVElNRVIpCisJCQkJcmV0dXJuIC1FVElNRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9kYmcoJmRjZGJhc19wZGV2LT5kZXYsICIlczogaW52YWxpZCBTTUkgdHlwZSAldVxuIiwKKwkJCV9fRlVOQ1RJT05fXywgaG9zdF9jb250cm9sX3NtaV90eXBlKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZGNkYmFzX2hvc3RfY29udHJvbDogaW5pdGlhdGUgaG9zdCBjb250cm9sCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGRyaXZlciBhZnRlciB0aGUgc3lzdGVtIGhhcworICogZmluaXNoZWQgc2h1dHRpbmcgZG93biBpZiB0aGUgdXNlciBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgYQorICogaG9zdCBjb250cm9sIGFjdGlvbiB0byBwZXJmb3JtIG9uIHNodXRkb3duLiAgSXQgaXMgc2FmZSB0bworICogdXNlIHNtaV9kYXRhX2J1ZiBhdCB0aGlzIHBvaW50IGJlY2F1c2UgdGhlIHN5c3RlbSBoYXMgZmluaXNoZWQKKyAqIHNodXR0aW5nIGRvd24gYW5kIG5vIHVzZXJzcGFjZSBhcHBzIGFyZSBydW5uaW5nLgorICovCitzdGF0aWMgdm9pZCBkY2RiYXNfaG9zdF9jb250cm9sKHZvaWQpCit7CisJc3RydWN0IGFwbV9jbWQgKmFwbV9jbWQ7CisJdTggYWN0aW9uOworCisJaWYgKGhvc3RfY29udHJvbF9hY3Rpb24gPT0gSENfQUNUSU9OX05PTkUpCisJCXJldHVybjsKKworCWFjdGlvbiA9IGhvc3RfY29udHJvbF9hY3Rpb247CisJaG9zdF9jb250cm9sX2FjdGlvbiA9IEhDX0FDVElPTl9OT05FOworCisJaWYgKCFzbWlfZGF0YV9idWYpIHsKKwkJZGV2X2RiZygmZGNkYmFzX3BkZXYtPmRldiwgIiVzOiBubyBTTUkgYnVmZmVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHNtaV9kYXRhX2J1Zl9zaXplIDwgc2l6ZW9mKHN0cnVjdCBhcG1fY21kKSkgeworCQlkZXZfZGJnKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IFNNSSBidWZmZXIgdG9vIHNtYWxsXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWFwbV9jbWQgPSAoc3RydWN0IGFwbV9jbWQgKilzbWlfZGF0YV9idWY7CisKKwkvKiBwb3dlciBvZmYgdGFrZXMgcHJlY2VkZW5jZSAqLworCWlmIChhY3Rpb24gJiBIQ19BQ1RJT05fSE9TVF9DT05UUk9MX1BPV0VST0ZGKSB7CisJCWFwbV9jbWQtPmNvbW1hbmQgPSBFU01fQVBNX1BPV0VSX0NZQ0xFOworCQlhcG1fY21kLT5yZXNlcnZlZCA9IDA7CisJCSooKHMxNiAqKSZhcG1fY21kLT5wYXJhbWV0ZXJzLnNob3J0cmVxLnBhcm1bMF0pID0gKHMxNikgMDsKKwkJaG9zdF9jb250cm9sX3NtaSgpOworCX0gZWxzZSBpZiAoYWN0aW9uICYgSENfQUNUSU9OX0hPU1RfQ09OVFJPTF9QT1dFUkNZQ0xFKSB7CisJCWFwbV9jbWQtPmNvbW1hbmQgPSBFU01fQVBNX1BPV0VSX0NZQ0xFOworCQlhcG1fY21kLT5yZXNlcnZlZCA9IDA7CisJCSooKHMxNiAqKSZhcG1fY21kLT5wYXJhbWV0ZXJzLnNob3J0cmVxLnBhcm1bMF0pID0gKHMxNikgMjA7CisJCWhvc3RfY29udHJvbF9zbWkoKTsKKwl9Cit9CisKKy8qKgorICogZGNkYmFzX3JlYm9vdF9ub3RpZnk6IGhhbmRsZSByZWJvb3Qgbm90aWZpY2F0aW9uIGZvciBob3N0IGNvbnRyb2wKKyAqLworc3RhdGljIGludCBkY2RiYXNfcmVib290X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJCQkJdm9pZCAqdW51c2VkKQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgbm90aWZ5X2NudCA9IDA7CisKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIFNZU19ET1dOOgorCWNhc2UgU1lTX0hBTFQ6CisJY2FzZSBTWVNfUE9XRVJfT0ZGOgorCQlpZiAoaG9zdF9jb250cm9sX29uX3NodXRkb3duKSB7CisJCQkvKiBmaXJtd2FyZSBpcyBnb2luZyB0byBwZXJmb3JtIGhvc3QgY29udHJvbCBhY3Rpb24gKi8KKwkJCWlmICgrK25vdGlmeV9jbnQgPT0gMikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgIlBsZWFzZSB3YWl0IGZvciBzaHV0ZG93biAiCisJCQkJICAgICAgICJhY3Rpb24gdG8gY29tcGxldGUuLi5cbiIpOworCQkJCWRjZGJhc19ob3N0X2NvbnRyb2woKTsKKwkJCX0KKwkJCS8qCisJCQkgKiByZWdpc3RlciBhZ2FpbiBhbmQgaW5pdGlhdGUgdGhlIGhvc3QgY29udHJvbAorCQkJICogYWN0aW9uIG9uIHRoZSBzZWNvbmQgbm90aWZpY2F0aW9uIHRvIGFsbG93CisJCQkgKiBldmVyeW9uZSB0aGF0IHJlZ2lzdGVyZWQgdG8gYmUgbm90aWZpZWQKKwkJCSAqLworCQkJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKG5iKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZGNkYmFzX3JlYm9vdF9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGRjZGJhc19yZWJvb3Rfbm90aWZ5LAorCS5uZXh0ID0gTlVMTCwKKwkucHJpb3JpdHkgPSAwCit9OworCitzdGF0aWMgRENEQkFTX0JJTl9BVFRSX1JXKHNtaV9kYXRhKTsKKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlICpkY2RiYXNfYmluX2F0dHJzW10gPSB7CisJJmJpbl9hdHRyX3NtaV9kYXRhLAorCU5VTEwKK307CisKK3N0YXRpYyBEQ0RCQVNfREVWX0FUVFJfUlcoc21pX2RhdGFfYnVmX3NpemUpOworc3RhdGljIERDREJBU19ERVZfQVRUUl9STyhzbWlfZGF0YV9idWZfcGh5c19hZGRyKTsKK3N0YXRpYyBEQ0RCQVNfREVWX0FUVFJfV08oc21pX3JlcXVlc3QpOworc3RhdGljIERDREJBU19ERVZfQVRUUl9SVyhob3N0X2NvbnRyb2xfYWN0aW9uKTsKK3N0YXRpYyBEQ0RCQVNfREVWX0FUVFJfUlcoaG9zdF9jb250cm9sX3NtaV90eXBlKTsKK3N0YXRpYyBEQ0RCQVNfREVWX0FUVFJfUlcoaG9zdF9jb250cm9sX29uX3NodXRkb3duKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkY2RiYXNfZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3NtaV9kYXRhX2J1Zl9zaXplLAorCSZkZXZfYXR0cl9zbWlfZGF0YV9idWZfcGh5c19hZGRyLAorCSZkZXZfYXR0cl9zbWlfcmVxdWVzdCwKKwkmZGV2X2F0dHJfaG9zdF9jb250cm9sX2FjdGlvbiwKKwkmZGV2X2F0dHJfaG9zdF9jb250cm9sX3NtaV90eXBlLAorCSZkZXZfYXR0cl9ob3N0X2NvbnRyb2xfb25fc2h1dGRvd24sCisJTlVMTAorfTsKKworLyoqCisgKiBkY2RiYXNfaW5pdDogaW5pdGlhbGl6ZSBkcml2ZXIKKyAqLworc3RhdGljIGludCBfX2luaXQgZGNkYmFzX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWhvc3RfY29udHJvbF9hY3Rpb24gPSBIQ19BQ1RJT05fTk9ORTsKKwlob3N0X2NvbnRyb2xfc21pX3R5cGUgPSBIQ19TTUlUWVBFX05PTkU7CisKKwlkY2RiYXNfcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoRFJJVkVSX05BTUUsIC0xLCBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKGRjZGJhc19wZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGNkYmFzX3BkZXYpOworCisJLyoKKwkgKiBCSU9TIFNNSSBjYWxscyByZXF1aXJlIGJ1ZmZlciBhZGRyZXNzZXMgYmUgaW4gMzItYml0IGFkZHJlc3Mgc3BhY2UuCisJICogVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgdGhlIERNQSBtYXNrIGJlbG93LgorCSAqLworCWRjZGJhc19wZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfMzJCSVRfTUFTSzsKKwlkY2RiYXNfcGRldi0+ZGV2LmRtYV9tYXNrID0gJmRjZGJhc19wZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2s7CisKKwlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmRjZGJhc19yZWJvb3RfbmIpOworCisJZm9yIChpID0gMDsgZGNkYmFzX2Jpbl9hdHRyc1tpXTsgaSsrKQorCQlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmRjZGJhc19wZGV2LT5kZXYua29iaiwKKwkJCQkgICAgICBkY2RiYXNfYmluX2F0dHJzW2ldKTsKKworCWZvciAoaSA9IDA7IGRjZGJhc19kZXZfYXR0cnNbaV07IGkrKykKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZkY2RiYXNfcGRldi0+ZGV2LCBkY2RiYXNfZGV2X2F0dHJzW2ldKTsKKworCWRldl9pbmZvKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXMgKHZlcnNpb24gJXMpXG4iLAorCQkgRFJJVkVSX0RFU0NSSVBUSU9OLCBEUklWRVJfVkVSU0lPTik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkY2RiYXNfZXhpdDogcGVyZm9ybSBkcml2ZXIgY2xlYW51cAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgZGNkYmFzX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkY2RiYXNfcGRldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmRjZGJhc19yZWJvb3RfbmIpOworCXNtaV9kYXRhX2J1Zl9mcmVlKCk7Cit9CisKK21vZHVsZV9pbml0KGRjZGJhc19pbml0KTsKK21vZHVsZV9leGl0KGRjZGJhc19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDUklQVElPTiAiICh2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIikiKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKK01PRFVMRV9BVVRIT1IoIkRlbGwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5oIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGE4NTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqICBkY2RiYXMuaDogRGVmaW5pdGlvbnMgZm9yIERlbGwgU3lzdGVtcyBNYW5hZ2VtZW50IEJhc2UgZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IERlbGwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0RDREJBU19IXworI2RlZmluZSBfRENEQkFTX0hfCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBNQVhfU01JX0RBVEFfQlVGX1NJWkUJCQkoMjU2ICogMTAyNCkKKworI2RlZmluZSBIQ19BQ1RJT05fTk9ORQkJCQkoMCkKKyNkZWZpbmUgSENfQUNUSU9OX0hPU1RfQ09OVFJPTF9QT1dFUk9GRgkJQklUKDEpCisjZGVmaW5lIEhDX0FDVElPTl9IT1NUX0NPTlRST0xfUE9XRVJDWUNMRQlCSVQoMikKKworI2RlZmluZSBIQ19TTUlUWVBFX05PTkUJCQkJKDApCisjZGVmaW5lIEhDX1NNSVRZUEVfVFlQRTEJCQkoMSkKKyNkZWZpbmUgSENfU01JVFlQRV9UWVBFMgkJCSgyKQorI2RlZmluZSBIQ19TTUlUWVBFX1RZUEUzCQkJKDMpCisKKyNkZWZpbmUgRVNNX0FQTV9DTUQJCQkJKDB4MEEwKQorI2RlZmluZSBFU01fQVBNX1BPV0VSX0NZQ0xFCQkJKDB4MTApCisjZGVmaW5lIEVTTV9TVEFUVVNfQ01EX1VOU1VDQ0VTU0ZVTAkJKC0xKQorCisjZGVmaW5lIENNT1NfQkFTRV9QT1JUCQkJCSgweDA3MCkKKyNkZWZpbmUgQ01PU19QQUdFMV9JTkRFWF9QT1JUCQkJKDApCisjZGVmaW5lIENNT1NfUEFHRTFfREFUQV9QT1JUCQkJKDEpCisjZGVmaW5lIENNT1NfUEFHRTJfSU5ERVhfUE9SVF9QSUlYNAkJKDIpCisjZGVmaW5lIENNT1NfUEFHRTJfREFUQV9QT1JUX1BJSVg0CQkoMykKKyNkZWZpbmUgUEUxNDAwX0FQTV9DT05UUk9MX1BPUlQJCQkoMHgwQjApCisjZGVmaW5lIFBDQVRfQVBNX0NPTlRST0xfUE9SVAkJCSgweDBCMikKKyNkZWZpbmUgUENBVF9BUE1fU1RBVFVTX1BPUlQJCQkoMHgwQjMpCisjZGVmaW5lIFBFMTMwMF9DTU9TX0NNRF9TVFJVQ1RfUFRSCQkoMHgzOCkKKyNkZWZpbmUgUEUxNDAwX0NNT1NfQ01EX1NUUlVDVF9QVFIJCSgweDcwKQorCisjZGVmaW5lIE1BWF9TWVNNR01UX1NIT1JUQ01EX1BBUk1CVUZfTEVOCSgxNCkKKyNkZWZpbmUgTUFYX1NZU01HTVRfTE9OR0NNRF9TR0VOVFJZX05VTQkJKDE2KQorCisjZGVmaW5lIFRJTUVPVVRfVVNFQ19TSE9SVF9TRU1BX0JMT0NLSU5HCSgxMDAwMCkKKyNkZWZpbmUgRVhQSVJFRF9USU1FUgkJCQkoMCkKKworI2RlZmluZSBTTUlfQ01EX01BR0lDCQkJCSgweDUzNEQ0OTMxKQorCisjZGVmaW5lIERDREJBU19ERVZfQVRUUl9SVyhfbmFtZSkgXAorCURFVklDRV9BVFRSKF9uYW1lLDA2MDAsX25hbWUjI19zaG93LF9uYW1lIyNfc3RvcmUpOworCisjZGVmaW5lIERDREJBU19ERVZfQVRUUl9STyhfbmFtZSkgXAorCURFVklDRV9BVFRSKF9uYW1lLDA0MDAsX25hbWUjI19zaG93LE5VTEwpOworCisjZGVmaW5lIERDREJBU19ERVZfQVRUUl9XTyhfbmFtZSkgXAorCURFVklDRV9BVFRSKF9uYW1lLDAyMDAsTlVMTCxfbmFtZSMjX3N0b3JlKTsKKworI2RlZmluZSBEQ0RCQVNfQklOX0FUVFJfUlcoX25hbWUpIFwKK3N0cnVjdCBiaW5fYXR0cmlidXRlIGJpbl9hdHRyXyMjX25hbWUgPSB7IFwKKwkuYXR0ciA9ICB7IC5uYW1lID0gX19zdHJpbmdpZnkoX25hbWUpLCBcCisJCSAgIC5tb2RlID0gMDYwMCwgXAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSB9LCBcCisJLnJlYWQgPSAgX25hbWUjI19yZWFkLCBcCisJLndyaXRlID0gX25hbWUjI193cml0ZSwgXAorfQorCitzdHJ1Y3Qgc21pX2NtZCB7CisJX191MzIgbWFnaWM7CisJX191MzIgZWJ4OworCV9fdTMyIGVjeDsKKwlfX3UxNiBjb21tYW5kX2FkZHJlc3M7CisJX191OCBjb21tYW5kX2NvZGU7CisJX191OCByZXNlcnZlZDsKKwlfX3U4IGNvbW1hbmRfYnVmZmVyWzFdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBhcG1fY21kIHsKKwlfX3U4IGNvbW1hbmQ7CisJX19zOCBzdGF0dXM7CisJX191MTYgcmVzZXJ2ZWQ7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191OCBwYXJtW01BWF9TWVNNR01UX1NIT1JUQ01EX1BBUk1CVUZfTEVOXTsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgc2hvcnRyZXE7CisKKwkJc3RydWN0IHsKKwkJCV9fdTE2IG51bV9zZ19lbnRyaWVzOworCQkJc3RydWN0IHsKKwkJCQlfX3UzMiBzaXplOworCQkJCV9fdTY0IGFkZHI7CisJCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCQkJICAgIHNnbGlzdFtNQVhfU1lTTUdNVF9MT05HQ01EX1NHRU5UUllfTlVNXTsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbG9uZ3JlcTsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwYXJhbWV0ZXJzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNlbmRpZiAvKiBfRENEQkFTX0hfICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZGVsbF9yYnUuYyBiL2RyaXZlcnMvZmlybXdhcmUvZGVsbF9yYnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg2NWYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kZWxsX3JidS5jCkBAIC0wLDAgKzEsNjM0IEBACisvKgorICogZGVsbF9yYnUuYworICogQmlvcyBVcGRhdGUgZHJpdmVyIGZvciBEZWxsIHN5c3RlbXMKKyAqIEF1dGhvcjogRGVsbCBJbmMKKyAqICAgICAgICAgQWJoYXkgU2FsdW5rZSA8YWJoYXlfc2FsdW5rZUBkZWxsLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGVsbCBJbmMuCisgKgorICogUmVtb3RlIEJJT1MgVXBkYXRlIChyYnUpIGRyaXZlciBpcyB1c2VkIGZvciB1cGRhdGluZyBERUxMIEJJT1MgYnkKKyAqIGNyZWF0aW5nIGVudHJpZXMgaW4gdGhlIC9zeXMgZmlsZSBzeXN0ZW1zIG9uIExpbnV4IDIuNiBhbmQgaGlnaGVyCisgKiBrZXJuZWxzLiBUaGUgZHJpdmVyIHN1cHBvcnRzIHR3byBtZWNoYW5pc20gdG8gdXBkYXRlIHRoZSBCSU9TIG5hbWVseQorICogY29udGlndW91cyBhbmQgcGFja2V0aXplZC4gQm90aCB0aGVzZSBtZXRob2RzIHN0aWxsIHJlcXVpcmUgaGF2aW5nIHNvbWUKKyAqIGFwcGxpY2F0aW9uIHRvIHNldCB0aGUgQ01PUyBiaXQgaW5kaWNhdGluZyB0aGUgQklPUyB0byB1cGRhdGUgaXRzZWxmCisgKiBhZnRlciBhIHJlYm9vdC4KKyAqCisgKiBDb250aWd1b3VzIG1ldGhvZDoKKyAqIFRoaXMgZHJpdmVyIHdyaXRlcyB0aGUgaW5jb21pbmcgZGF0YSBpbiBhIG1vbm9saXRoaWMgaW1hZ2UgYnkgYWxsb2NhdGluZworICogY29udGlndW91cyBwaHlzaWNhbCBwYWdlcyBsYXJnZSBlbm91Z2ggdG8gYWNjb21tb2RhdGUgdGhlIGluY29taW5nIEJJT1MKKyAqIGltYWdlIHNpemUuCisgKgorICogUGFja2V0aXplZCBtZXRob2Q6CisgKiBUaGUgZHJpdmVyIHdyaXRlcyB0aGUgaW5jb21pbmcgcGFja2V0IGltYWdlIGJ5IGFsbG9jYXRpbmcgYSBuZXcgcGFja2V0CisgKiBvbiBldmVyeSB0aW1lIHRoZSBwYWNrZXQgZGF0YSBpcyB3cml0dGVuLiBUaGlzIGRyaXZlciByZXF1aXJlcyBhbgorICogYXBwbGljYXRpb24gdG8gYnJlYWsgdGhlIEJJT1MgaW1hZ2UgaW4gdG8gZml4ZWQgc2l6ZWQgcGFja2V0IGNodW5rcy4KKyAqCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9kZWxsX3JidS50eHQgZm9yIG1vcmUgaW5mby4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworTU9EVUxFX0FVVEhPUigiQWJoYXkgU2FsdW5rZSA8YWJoYXlfc2FsdW5rZUBkZWxsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB1cGRhdGluZyBCSU9TIGltYWdlIG9uIERFTEwgc3lzdGVtcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjEuMCIpOworCisjZGVmaW5lIEJJT1NfU0NBTl9MSU1JVCAweGZmZmZmZmZmCisjZGVmaW5lIE1BWF9JTUFHRV9MRU5HVEggMTYKK3N0YXRpYyBzdHJ1Y3QgX3JidV9kYXRhIHsKKwl2b2lkICppbWFnZV91cGRhdGVfYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgaW1hZ2VfdXBkYXRlX2J1ZmZlcl9zaXplOworCXVuc2lnbmVkIGxvbmcgYmlvc19pbWFnZV9zaXplOworCWludCBpbWFnZV91cGRhdGVfb3JkZXJudW07CisJaW50IGRtYV9hbGxvYzsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgbG9uZyBwYWNrZXRfcmVhZF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHBhY2tldF93cml0ZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIG51bV9wYWNrZXRzOworCXVuc2lnbmVkIGxvbmcgcGFja2V0c2l6ZTsKK30gcmJ1X2RhdGE7CisKK3N0YXRpYyBjaGFyIGltYWdlX3R5cGVbTUFYX0lNQUdFX0xFTkdUSF0gPSAibW9ubyI7Cittb2R1bGVfcGFyYW1fc3RyaW5nKGltYWdlX3R5cGUsIGltYWdlX3R5cGUsIHNpemVvZihpbWFnZV90eXBlKSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGltYWdlX3R5cGUsICJCSU9TIGltYWdlIHR5cGUuIGNob29zZS0gbW9ubyBvciBwYWNrZXQiKTsKKworc3RydWN0IHBhY2tldF9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc2l6ZV90IGxlbmd0aDsKKwl2b2lkICpkYXRhOworCWludCBvcmRlcm51bTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X2RhdGEgcGFja2V0X2RhdGFfaGVhZDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnJidV9kZXZpY2U7CitzdGF0aWMgaW50IGNvbnRleHQ7CitzdGF0aWMgZG1hX2FkZHJfdCBkZWxsX3JidV9kbWFhZGRyOworCitzdGF0aWMgdm9pZCBpbml0X3BhY2tldF9oZWFkKHZvaWQpCit7CisJSU5JVF9MSVNUX0hFQUQoJnBhY2tldF9kYXRhX2hlYWQubGlzdCk7CisJcmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50ID0gMDsKKwlyYnVfZGF0YS5wYWNrZXRfcmVhZF9jb3VudCA9IDA7CisJcmJ1X2RhdGEubnVtX3BhY2tldHMgPSAwOworCXJidV9kYXRhLnBhY2tldHNpemUgPSAwOworfQorCitzdGF0aWMgaW50IGZpbGxfbGFzdF9wYWNrZXQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdGVtcF9saXN0OworCXN0cnVjdCBwYWNrZXRfZGF0YSAqcGFja2V0ID0gTlVMTDsKKwlpbnQgcGFja2V0X2NvdW50ID0gMDsKKworCXByX2RlYnVnKCJmaWxsX2xhc3RfcGFja2V0OiBlbnRyeSBcbiIpOworCisJaWYgKCFyYnVfZGF0YS5udW1fcGFja2V0cykgeworCQlwcl9kZWJ1ZygiZmlsbF9sYXN0X3BhY2tldDogbnVtX3BhY2tldHM9MFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBhY2tldF9jb3VudCA9IHJidV9kYXRhLm51bV9wYWNrZXRzOworCisJcHRlbXBfbGlzdCA9ICgmcGFja2V0X2RhdGFfaGVhZC5saXN0KS0+cHJldjsKKworCXBhY2tldCA9IGxpc3RfZW50cnkocHRlbXBfbGlzdCwgc3RydWN0IHBhY2tldF9kYXRhLCBsaXN0KTsKKworCWlmICgocmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50ICsgbGVuZ3RoKSA+IHJidV9kYXRhLnBhY2tldHNpemUpIHsKKwkJcHJfZGVidWcoImRlbGxfcmJ1OiVzOiBwYWNrZXQgc2l6ZSBkYXRhICIKKwkJCSAib3ZlcnJ1blxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZGVidWcoImZpbGxfbGFzdF9wYWNrZXQgOiBidWZmZXIgPSAlcFxuIiwgcGFja2V0LT5kYXRhKTsKKworCW1lbWNweSgocGFja2V0LT5kYXRhICsgcmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50KSwgZGF0YSwgbGVuZ3RoKTsKKworCWlmICgocmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50ICsgbGVuZ3RoKSA9PSByYnVfZGF0YS5wYWNrZXRzaXplKSB7CisJCS8qCisJCSAqIHRoaXMgd2FzIHRoZSBsYXN0IGRhdGEgY2h1bmsgaW4gdGhlIHBhY2tldAorCQkgKiBzbyByZWluaXRpYWxpemUgdGhlIHBhY2tldCBkYXRhIGNvdW50ZXIgdG8gemVybworCQkgKi8KKwkJcmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50ID0gMDsKKwl9IGVsc2UKKwkJcmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50ICs9IGxlbmd0aDsKKworCXByX2RlYnVnKCJmaWxsX2xhc3RfcGFja2V0OiBleGl0IFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX3BhY2tldChzaXplX3QgbGVuZ3RoKQoreworCXN0cnVjdCBwYWNrZXRfZGF0YSAqbmV3cGFja2V0OworCWludCBvcmRlcm51bSA9IDA7CisKKwlwcl9kZWJ1ZygiY3JlYXRlX3BhY2tldDogZW50cnkgXG4iKTsKKworCWlmICghcmJ1X2RhdGEucGFja2V0c2l6ZSkgeworCQlwcl9kZWJ1ZygiY3JlYXRlX3BhY2tldDogcGFja2V0c2l6ZSBub3Qgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbmV3cGFja2V0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhY2tldF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdwYWNrZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImRlbGxfcmJ1OiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbmV3ICIKKwkJICAgICAgICJwYWNrZXRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW9yZGVybnVtID0gZ2V0X29yZGVyKGxlbmd0aCk7CisJLyoKKwkgKiB0aGVyZSBpcyBubyB1cHBlciBsaW1pdCBvbiBtZW1vcnkKKwkgKiBhZGRyZXNzIGZvciBwYWNrZXRpemVkIG1lY2hhbmlzbQorCSAqLworCW5ld3BhY2tldC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQkJCQkJCSAgICBvcmRlcm51bSk7CisKKwlwcl9kZWJ1ZygiY3JlYXRlX3BhY2tldDogbmV3cGFja2V0ICVwXG4iLCBuZXdwYWNrZXQtPmRhdGEpOworCisJaWYgKCFuZXdwYWNrZXQtPmRhdGEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImRlbGxfcmJ1OiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbmV3ICIKKwkJICAgICAgICJwYWNrZXRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWtmcmVlKG5ld3BhY2tldCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW5ld3BhY2tldC0+b3JkZXJudW0gPSBvcmRlcm51bTsKKwkrK3JidV9kYXRhLm51bV9wYWNrZXRzOworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgbmV3bHkgY3JlYXRlZCBwYWNrZXQgaGVhZGVycworCSAqLworCUlOSVRfTElTVF9IRUFEKCZuZXdwYWNrZXQtPmxpc3QpOworCWxpc3RfYWRkX3RhaWwoJm5ld3BhY2tldC0+bGlzdCwgJnBhY2tldF9kYXRhX2hlYWQubGlzdCk7CisJLyoKKwkgKiBwYWNrZXRzIGhhdmUgZml4ZWQgc2l6ZQorCSAqLworCW5ld3BhY2tldC0+bGVuZ3RoID0gcmJ1X2RhdGEucGFja2V0c2l6ZTsKKworCXByX2RlYnVnKCJjcmVhdGVfcGFja2V0OiBleGl0IFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWNrZXRpemVfZGF0YSh2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworCWludCByYyA9IDA7CisKKwlpZiAoIXJidV9kYXRhLnBhY2tldF93cml0ZV9jb3VudCkgeworCQlpZiAoKHJjID0gY3JlYXRlX3BhY2tldChsZW5ndGgpKSkKKwkJCXJldHVybiByYzsKKwl9CisJaWYgKChyYyA9IGZpbGxfbGFzdF9wYWNrZXQoZGF0YSwgbGVuZ3RoKSkpCisJCXJldHVybiByYzsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorZG9fcGFja2V0X3JlYWQoY2hhciAqZGF0YSwgc3RydWN0IGxpc3RfaGVhZCAqcHRlbXBfbGlzdCwKKwkgICAgICAgaW50IGxlbmd0aCwgaW50IGJ5dGVzX3JlYWQsIGludCAqbGlzdF9yZWFkX2NvdW50KQoreworCXZvaWQgKnB0ZW1wX2J1ZjsKKwlzdHJ1Y3QgcGFja2V0X2RhdGEgKm5ld3BhY2tldCA9IE5VTEw7CisJaW50IGJ5dGVzX2NvcGllZCA9IDA7CisJaW50IGogPSAwOworCisJbmV3cGFja2V0ID0gbGlzdF9lbnRyeShwdGVtcF9saXN0LCBzdHJ1Y3QgcGFja2V0X2RhdGEsIGxpc3QpOworCSpsaXN0X3JlYWRfY291bnQgKz0gbmV3cGFja2V0LT5sZW5ndGg7CisKKwlpZiAoKmxpc3RfcmVhZF9jb3VudCA+IGJ5dGVzX3JlYWQpIHsKKwkJLyogcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHVucmVhZCBkYXRhICovCisJCWogPSBuZXdwYWNrZXQtPmxlbmd0aCAtICgqbGlzdF9yZWFkX2NvdW50IC0gYnl0ZXNfcmVhZCk7CisJCS8qIHBvaW50IHRvIHRoZSBvZmZzZXQgaW4gdGhlIHBhY2tldCBidWZmZXIgKi8KKwkJcHRlbXBfYnVmID0gKHU4ICopIG5ld3BhY2tldC0+ZGF0YSArIGo7CisJCS8qCisJCSAqIGNoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCByb29tIGluCisJCSAqICogdGhlIGluY29taW5nIGJ1ZmZlcgorCQkgKi8KKwkJaWYgKGxlbmd0aCA+ICgqbGlzdF9yZWFkX2NvdW50IC0gYnl0ZXNfcmVhZCkpCisJCQkvKgorCQkJICogY29weSB3aGF0IGV2ZXIgaXMgdGhlcmUgaW4gdGhpcworCQkJICogcGFja2V0IGFuZCBtb3ZlIG9uCisJCQkgKi8KKwkJCWJ5dGVzX2NvcGllZCA9ICgqbGlzdF9yZWFkX2NvdW50IC0gYnl0ZXNfcmVhZCk7CisJCWVsc2UKKwkJCS8qIGNvcHkgdGhlIHJlbWFpbmluZyAqLworCQkJYnl0ZXNfY29waWVkID0gbGVuZ3RoOworCQltZW1jcHkoZGF0YSwgcHRlbXBfYnVmLCBieXRlc19jb3BpZWQpOworCX0KKwlyZXR1cm4gYnl0ZXNfY29waWVkOworfQorCitzdGF0aWMgaW50IHBhY2tldF9yZWFkX2xpc3QoY2hhciAqZGF0YSwgc2l6ZV90ICogcHJlYWRfbGVuZ3RoKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ZW1wX2xpc3Q7CisJaW50IHRlbXBfY291bnQgPSAwOworCWludCBieXRlc19jb3BpZWQgPSAwOworCWludCBieXRlc19yZWFkID0gMDsKKwlpbnQgcmVtYWluaW5nX2J5dGVzID0gMDsKKwljaGFyICpwZGVzdCA9IGRhdGE7CisKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIGFueSBwYWNrZXRzICovCisJaWYgKDAgPT0gcmJ1X2RhdGEubnVtX3BhY2tldHMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVtYWluaW5nX2J5dGVzID0gKnByZWFkX2xlbmd0aDsKKwlieXRlc19yZWFkID0gcmJ1X2RhdGEucGFja2V0X3JlYWRfY291bnQ7CisKKwlwdGVtcF9saXN0ID0gKCZwYWNrZXRfZGF0YV9oZWFkLmxpc3QpLT5uZXh0OworCXdoaWxlICghbGlzdF9lbXB0eShwdGVtcF9saXN0KSkgeworCQlieXRlc19jb3BpZWQgPSBkb19wYWNrZXRfcmVhZChwZGVzdCwgcHRlbXBfbGlzdCwKKwkJCQkJICAgICAgcmVtYWluaW5nX2J5dGVzLCBieXRlc19yZWFkLAorCQkJCQkgICAgICAmdGVtcF9jb3VudCk7CisJCXJlbWFpbmluZ19ieXRlcyAtPSBieXRlc19jb3BpZWQ7CisJCWJ5dGVzX3JlYWQgKz0gYnl0ZXNfY29waWVkOworCQlwZGVzdCArPSBieXRlc19jb3BpZWQ7CisJCS8qCisJCSAqIGNoZWNrIGlmIHdlIHJlYWNoZWQgZW5kIG9mIGJ1ZmZlciBiZWZvcmUgcmVhY2hpbmcgdGhlCisJCSAqIGxhc3QgcGFja2V0CisJCSAqLworCQlpZiAocmVtYWluaW5nX2J5dGVzID09IDApCisJCQlicmVhazsKKworCQlwdGVtcF9saXN0ID0gcHRlbXBfbGlzdC0+bmV4dDsKKwl9CisJLypmaW5hbGx5IHNldCB0aGUgYnl0ZXMgcmVhZCAqLworCSpwcmVhZF9sZW5ndGggPSBieXRlc19yZWFkIC0gcmJ1X2RhdGEucGFja2V0X3JlYWRfY291bnQ7CisJcmJ1X2RhdGEucGFja2V0X3JlYWRfY291bnQgPSBieXRlc19yZWFkOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYWNrZXRfZW1wdHlfbGlzdCh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ZW1wX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqcG5leHRfbGlzdDsKKwlzdHJ1Y3QgcGFja2V0X2RhdGEgKm5ld3BhY2tldDsKKworCXB0ZW1wX2xpc3QgPSAoJnBhY2tldF9kYXRhX2hlYWQubGlzdCktPm5leHQ7CisJd2hpbGUgKCFsaXN0X2VtcHR5KHB0ZW1wX2xpc3QpKSB7CisJCW5ld3BhY2tldCA9CisJCSAgICBsaXN0X2VudHJ5KHB0ZW1wX2xpc3QsIHN0cnVjdCBwYWNrZXRfZGF0YSwgbGlzdCk7CisJCXBuZXh0X2xpc3QgPSBwdGVtcF9saXN0LT5uZXh0OworCQlsaXN0X2RlbChwdGVtcF9saXN0KTsKKwkJcHRlbXBfbGlzdCA9IHBuZXh0X2xpc3Q7CisJCS8qCisJCSAqIHplcm8gb3V0IHRoZSBSQlUgcGFja2V0IG1lbW9yeSBiZWZvcmUgZnJlZWluZworCQkgKiB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHN0YWxlIFJCVSBwYWNrZXRzIGxlZnQgaW4gbWVtb3J5CisJCSAqLworCQltZW1zZXQobmV3cGFja2V0LT5kYXRhLCAwLCByYnVfZGF0YS5wYWNrZXRzaXplKTsKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyluZXdwYWNrZXQtPmRhdGEsCisJCQkgICBuZXdwYWNrZXQtPm9yZGVybnVtKTsKKwkJa2ZyZWUobmV3cGFja2V0KTsKKwl9CisJcmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50ID0gMDsKKwlyYnVfZGF0YS5wYWNrZXRfcmVhZF9jb3VudCA9IDA7CisJcmJ1X2RhdGEubnVtX3BhY2tldHMgPSAwOworCXJidV9kYXRhLnBhY2tldHNpemUgPSAwOworfQorCisvKgorICogaW1nX3VwZGF0ZV9mcmVlOiBGcmVlcyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBmb3Igc3RvcmluZyBCSU9TIGltYWdlCisgKiBBbHdheXMgY2FsbGVkIHdpdGggbG9jayBoZWxkIGFuZCByZXR1cm5lZCB3aXRoIGxvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCBpbWdfdXBkYXRlX2ZyZWUodm9pZCkKK3sKKwlpZiAoIXJidV9kYXRhLmltYWdlX3VwZGF0ZV9idWZmZXIpCisJCXJldHVybjsKKwkvKgorCSAqIHplcm8gb3V0IHRoaXMgYnVmZmVyIGJlZm9yZSBmcmVlaW5nIGl0IHRvIGdldCByaWQgb2YgYW55IHN0YWxlCisJICogQklPUyBpbWFnZSBjb3BpZWQgaW4gbWVtb3J5LgorCSAqLworCW1lbXNldChyYnVfZGF0YS5pbWFnZV91cGRhdGVfYnVmZmVyLCAwLAorCSAgICAgICByYnVfZGF0YS5pbWFnZV91cGRhdGVfYnVmZmVyX3NpemUpOworCWlmIChyYnVfZGF0YS5kbWFfYWxsb2MgPT0gMSkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgcmJ1X2RhdGEuYmlvc19pbWFnZV9zaXplLAorCQkJCSAgcmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX2J1ZmZlciwKKwkJCQkgIGRlbGxfcmJ1X2RtYWFkZHIpOworCWVsc2UKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylyYnVfZGF0YS5pbWFnZV91cGRhdGVfYnVmZmVyLAorCQkJICAgcmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX29yZGVybnVtKTsKKworCS8qCisJICogUmUtaW5pdGlhbGl6ZSB0aGUgcmJ1X2RhdGEgdmFyaWFibGVzIGFmdGVyIGEgZnJlZQorCSAqLworCXJidV9kYXRhLmltYWdlX3VwZGF0ZV9vcmRlcm51bSA9IC0xOworCXJidV9kYXRhLmltYWdlX3VwZGF0ZV9idWZmZXIgPSBOVUxMOworCXJidV9kYXRhLmltYWdlX3VwZGF0ZV9idWZmZXJfc2l6ZSA9IDA7CisJcmJ1X2RhdGEuYmlvc19pbWFnZV9zaXplID0gMDsKKwlyYnVfZGF0YS5kbWFfYWxsb2MgPSAwOworfQorCisvKgorICogaW1nX3VwZGF0ZV9yZWFsbG9jOiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyB0aGUgY29udGlndW91cyBwYWdlcyB0bworICogYWNjb21tb2RhdGUgdGhlIHJlcXVlc3RlZCBzaXplIG9mIGRhdGEuIFRoZSBtZW1vcnkgYWRkcmVzcyBhbmQgc2l6ZQorICogdmFsdWVzIGFyZSBzdG9yZWQgZ2xvYmFsbHkgYW5kIG9uIGV2ZXJ5IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiB0aGUgbmV3CisgKiBzaXplIGlzIGNoZWNrZWQgdG8gc2VlIGlmIG1vcmUgZGF0YSBpcyByZXF1aXJlZCB0aGFuIHRoZSBleGlzdGluZyBzaXplLgorICogSWYgdHJ1ZSB0aGUgcHJldmlvdXMgbWVtb3J5IGlzIGZyZWVkIGFuZCBuZXcgYWxsb2NhdGlvbiBpcyBkb25lIHRvCisgKiBhY2NvbW1vZGF0ZSB0aGUgbmV3IHNpemUuIElmIHRoZSBpbmNvbWluZyBzaXplIGlzIGxlc3MgdGhlbiB0aGFuIHRoZQorICogYWxyZWFkeSBhbGxvY2F0ZWQgc2l6ZSwgdGhlbiB0aGF0IG1lbW9yeSBpcyByZXVzZWQuIFRoaXMgZnVuY3Rpb24gaXMKKyAqIGNhbGxlZCB3aXRoIGxvY2sgaGVsZCBhbmQgcmV0dXJucyB3aXRoIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBpbWdfdXBkYXRlX3JlYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGNoYXIgKmltYWdlX3VwZGF0ZV9idWZmZXIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgcmM7CisJdW5zaWduZWQgbG9uZyBpbWdfYnVmX3BoeXNfYWRkcjsKKwlpbnQgb3JkZXJudW07CisJaW50IGRtYV9hbGxvYyA9IDA7CisKKwkvKgorCSAqIGNoZWNrIGlmIHRoZSBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplIGhhcyBiZWVuCisJICogYWxyZWFkeSBhbGxvY2F0ZWQKKwkgKi8KKwlpZiAocmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX2J1ZmZlcl9zaXplID49IHNpemUpIHsKKwkJLyoKKwkJICogY2hlY2sgZm9yIGNvcnJ1cHRpb24KKwkJICovCisJCWlmICgoc2l6ZSAhPSAwKSAmJiAocmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX2J1ZmZlciA9PSBOVUxMKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkZWxsX3JidTolczogY29ycnVwdGlvbiAiCisJCQkgICAgICAgImNoZWNrIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qCisJCSAqIHdlIGhhdmUgYSB2YWxpZCBwcmUtYWxsb2NhdGVkIGJ1ZmZlciB3aXRoCisJCSAqIHN1ZmZpY2llbnQgc2l6ZQorCQkgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBmcmVlIGFueSBwcmV2aW91c2x5IGFsbG9jYXRlZCBidWZmZXIKKwkgKi8KKwlpbWdfdXBkYXRlX2ZyZWUoKTsKKworCXNwaW5fdW5sb2NrKCZyYnVfZGF0YS5sb2NrKTsKKworCW9yZGVybnVtID0gZ2V0X29yZGVyKHNpemUpOworCWltYWdlX3VwZGF0ZV9idWZmZXIgPQorCSAgICAodW5zaWduZWQgY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXJudW0pOworCisJaW1nX2J1Zl9waHlzX2FkZHIgPQorCSAgICAodW5zaWduZWQgbG9uZyl2aXJ0X3RvX3BoeXMoaW1hZ2VfdXBkYXRlX2J1ZmZlcik7CisKKwlpZiAoaW1nX2J1Zl9waHlzX2FkZHIgPiBCSU9TX1NDQU5fTElNSVQpIHsKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpbWFnZV91cGRhdGVfYnVmZmVyLCBvcmRlcm51bSk7CisJCW9yZGVybnVtID0gLTE7CisJCWltYWdlX3VwZGF0ZV9idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2l6ZSwKKwkJCQkJCQkgJmRlbGxfcmJ1X2RtYWFkZHIsCisJCQkJCQkJIEdGUF9LRVJORUwpOworCQlkbWFfYWxsb2MgPSAxOworCX0KKworCXNwaW5fbG9jaygmcmJ1X2RhdGEubG9jayk7CisKKwlpZiAoaW1hZ2VfdXBkYXRlX2J1ZmZlciAhPSBOVUxMKSB7CisJCXJidV9kYXRhLmltYWdlX3VwZGF0ZV9idWZmZXIgPSBpbWFnZV91cGRhdGVfYnVmZmVyOworCQlyYnVfZGF0YS5pbWFnZV91cGRhdGVfYnVmZmVyX3NpemUgPSBzaXplOworCQlyYnVfZGF0YS5iaW9zX2ltYWdlX3NpemUgPQorCQkgICAgcmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX2J1ZmZlcl9zaXplOworCQlyYnVfZGF0YS5pbWFnZV91cGRhdGVfb3JkZXJudW0gPSBvcmRlcm51bTsKKwkJcmJ1X2RhdGEuZG1hX2FsbG9jID0gZG1hX2FsbG9jOworCQlyYyA9IDA7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBpbWFnZSB1cGRhdGU6IgorCQkJICJzaXplID0gJWxkXG4iLCBzaXplKTsKKwkJcmMgPSAtRU5PTUVNOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QgcmVhZF9wYWNrZXRfZGF0YShjaGFyICpidWZmZXIsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmV0dmFsOworCXNpemVfdCBieXRlc19sZWZ0OworCXNpemVfdCBkYXRhX2xlbmd0aDsKKwljaGFyICpwdGVtcEJ1ZiA9IGJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIGltYWdlc2l6ZTsKKworCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIHNvbWV0aGluZyB0byByZXR1cm4gKi8KKwlpZiAocmJ1X2RhdGEubnVtX3BhY2tldHMgPT0gMCkgeworCQlwcl9kZWJ1ZygicmVhZF9wYWNrZXRfZGF0YTogbm8gcGFja2V0cyB3cml0dGVuXG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byByZWFkX3JidV9kYXRhX2V4aXQ7CisJfQorCisJaW1hZ2VzaXplID0gcmJ1X2RhdGEubnVtX3BhY2tldHMgKiByYnVfZGF0YS5wYWNrZXRzaXplOworCisJaWYgKHBvcyA+IGltYWdlc2l6ZSkgeworCQlyZXR2YWwgPSAwOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJkZWxsX3JidTpyZWFkX3BhY2tldF9kYXRhOiAiCisJCSAgICAgICAiZGF0YSB1bmRlcnJ1blxuIik7CisJCWdvdG8gcmVhZF9yYnVfZGF0YV9leGl0OworCX0KKworCWJ5dGVzX2xlZnQgPSBpbWFnZXNpemUgLSBwb3M7CisJZGF0YV9sZW5ndGggPSBtaW4oYnl0ZXNfbGVmdCwgY291bnQpOworCisJaWYgKChyZXR2YWwgPSBwYWNrZXRfcmVhZF9saXN0KHB0ZW1wQnVmLCAmZGF0YV9sZW5ndGgpKSA8IDApCisJCWdvdG8gcmVhZF9yYnVfZGF0YV9leGl0OworCisJaWYgKChwb3MgKyBjb3VudCkgPiBpbWFnZXNpemUpIHsKKwkJcmJ1X2RhdGEucGFja2V0X3JlYWRfY291bnQgPSAwOworCQkvKiB0aGlzIHdhcyB0aGUgbGFzdCBjb3B5ICovCisJCXJldHZhbCA9IGJ5dGVzX2xlZnQ7CisJfSBlbHNlCisJCXJldHZhbCA9IGNvdW50OworCisgICAgICByZWFkX3JidV9kYXRhX2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHNzaXplX3QgcmVhZF9yYnVfbW9ub19kYXRhKGNoYXIgKmJ1ZmZlciwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGNoYXIgKnB0ZW1wID0gTlVMTDsKKwlzaXplX3QgYnl0ZXNfbGVmdCA9IDA7CisJc2l6ZV90IGRhdGFfbGVuZ3RoID0gMDsKKwlzc2l6ZV90IHJldF9jb3VudCA9IDA7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gcmV0dXJuICovCisJaWYgKChyYnVfZGF0YS5pbWFnZV91cGRhdGVfYnVmZmVyID09IE5VTEwpIHx8CisJICAgIChyYnVfZGF0YS5iaW9zX2ltYWdlX3NpemUgPT0gMCkpIHsKKwkJcHJfZGVidWcoInJlYWRfcmJ1X2RhdGFfbW9ubzogaW1hZ2VfdXBkYXRlX2J1ZmZlciAlcCAsIgorCQkJICJiaW9zX2ltYWdlX3NpemUgJWx1XG4iLAorCQkJIHJidV9kYXRhLmltYWdlX3VwZGF0ZV9idWZmZXIsCisJCQkgcmJ1X2RhdGEuYmlvc19pbWFnZV9zaXplKTsKKwkJcmV0X2NvdW50ID0gLUVOT01FTTsKKwkJZ290byByZWFkX3JidV9kYXRhX2V4aXQ7CisJfQorCisJaWYgKHBvcyA+IHJidV9kYXRhLmJpb3NfaW1hZ2Vfc2l6ZSkgeworCQlyZXRfY291bnQgPSAwOworCQlnb3RvIHJlYWRfcmJ1X2RhdGFfZXhpdDsKKwl9CisKKwlieXRlc19sZWZ0ID0gcmJ1X2RhdGEuYmlvc19pbWFnZV9zaXplIC0gcG9zOworCWRhdGFfbGVuZ3RoID0gbWluKGJ5dGVzX2xlZnQsIGNvdW50KTsKKworCXB0ZW1wID0gcmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX2J1ZmZlcjsKKwltZW1jcHkoYnVmZmVyLCAocHRlbXAgKyBwb3MpLCBkYXRhX2xlbmd0aCk7CisKKwlpZiAoKHBvcyArIGNvdW50KSA+IHJidV9kYXRhLmJpb3NfaW1hZ2Vfc2l6ZSkKKwkJLyogdGhpcyB3YXMgdGhlIGxhc3QgY29weSAqLworCQlyZXRfY291bnQgPSBieXRlc19sZWZ0OworCWVsc2UKKwkJcmV0X2NvdW50ID0gY291bnQ7CisgICAgICByZWFkX3JidV9kYXRhX2V4aXQ6CisJcmV0dXJuIHJldF9jb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3JlYWRfcmJ1X2RhdGEoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZmZlciwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgcmV0X2NvdW50ID0gMDsKKworCXNwaW5fbG9jaygmcmJ1X2RhdGEubG9jayk7CisKKwlpZiAoIXN0cmNtcChpbWFnZV90eXBlLCAibW9ubyIpKQorCQlyZXRfY291bnQgPSByZWFkX3JidV9tb25vX2RhdGEoYnVmZmVyLCBwb3MsIGNvdW50KTsKKwllbHNlIGlmICghc3RyY21wKGltYWdlX3R5cGUsICJwYWNrZXQiKSkKKwkJcmV0X2NvdW50ID0gcmVhZF9wYWNrZXRfZGF0YShidWZmZXIsIHBvcywgY291bnQpOworCWVsc2UKKwkJcHJfZGVidWcoInJlYWRfcmJ1X2RhdGE6IGludmFsaWQgaW1hZ2UgdHlwZSBzcGVjaWZpZWRcbiIpOworCisJc3Bpbl91bmxvY2soJnJidV9kYXRhLmxvY2spOworCXJldHVybiByZXRfY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CityZWFkX3JidV9pbWFnZV90eXBlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWZmZXIsIGxvZmZfdCBwb3MsCisJCSAgICBzaXplX3QgY291bnQpCit7CisJaW50IHNpemUgPSAwOworCWlmICghcG9zKQorCQlzaXplID0gc3ByaW50ZihidWZmZXIsICIlc1xuIiwgaW1hZ2VfdHlwZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit3cml0ZV9yYnVfaW1hZ2VfdHlwZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmZmVyLCBsb2ZmX3QgcG9zLAorCQkgICAgIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmMgPSBjb3VudDsKKwlzcGluX2xvY2soJnJidV9kYXRhLmxvY2spOworCisJaWYgKHN0cmxlbihidWZmZXIpIDwgTUFYX0lNQUdFX0xFTkdUSCkKKwkJc3NjYW5mKGJ1ZmZlciwgIiVzIiwgaW1hZ2VfdHlwZSk7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJkZWxsX3JidTogaW1hZ2VfdHlwZSBpcyBpbnZhbGlkIgorCQkgICAgICAgIm1heCBjaGFycyA9ICVkLCBcbiBpbmNvbWluZyBzdHItLSVzLS0gXG4iLAorCQkgICAgICAgTUFYX0lNQUdFX0xFTkdUSCwgYnVmZmVyKTsKKworCS8qIHdlIG11c3QgZnJlZSBhbGwgcHJldmlvdXMgYWxsb2NhdGlvbnMgKi8KKwlwYWNrZXRfZW1wdHlfbGlzdCgpOworCWltZ191cGRhdGVfZnJlZSgpOworCisJc3Bpbl91bmxvY2soJnJidV9kYXRhLmxvY2spOworCXJldHVybiByYzsKKworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcmJ1X2RhdGFfYXR0ciA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJkYXRhIiwub3duZXIgPSBUSElTX01PRFVMRSwubW9kZSA9IDA0NDR9LAorCS5yZWFkID0gcmVhZF9yYnVfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSByYnVfaW1hZ2VfdHlwZV9hdHRyID0geworCS5hdHRyID0gey5uYW1lID0gImltYWdlX3R5cGUiLC5vd25lciA9IFRISVNfTU9EVUxFLC5tb2RlID0gMDY0NH0sCisJLnJlYWQgPSByZWFkX3JidV9pbWFnZV90eXBlLAorCS53cml0ZSA9IHdyaXRlX3JidV9pbWFnZV90eXBlLAorfTsKKworc3RhdGljIHZvaWQgY2FsbGJhY2tmbl9yYnUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKCFmdyB8fCAhZnctPnNpemUpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmcmJ1X2RhdGEubG9jayk7CisJaWYgKCFzdHJjbXAoaW1hZ2VfdHlwZSwgIm1vbm8iKSkgeworCQlpZiAoIWltZ191cGRhdGVfcmVhbGxvYyhmdy0+c2l6ZSkpCisJCQltZW1jcHkocmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX2J1ZmZlciwKKwkJCSAgICAgICBmdy0+ZGF0YSwgZnctPnNpemUpOworCX0gZWxzZSBpZiAoIXN0cmNtcChpbWFnZV90eXBlLCAicGFja2V0IikpIHsKKwkJaWYgKCFyYnVfZGF0YS5wYWNrZXRzaXplKQorCQkJcmJ1X2RhdGEucGFja2V0c2l6ZSA9IGZ3LT5zaXplOworCQllbHNlIGlmIChyYnVfZGF0YS5wYWNrZXRzaXplICE9IGZ3LT5zaXplKSB7CisJCQlwYWNrZXRfZW1wdHlfbGlzdCgpOworCQkJcmJ1X2RhdGEucGFja2V0c2l6ZSA9IGZ3LT5zaXplOworCQl9CisJCXBhY2tldGl6ZV9kYXRhKGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJfSBlbHNlCisJCXByX2RlYnVnKCJpbnZhbGlkIGltYWdlIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJc3Bpbl91bmxvY2soJnJidV9kYXRhLmxvY2spOworCisJcmMgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgRldfQUNUSU9OX05PSE9UUExVRywKKwkJCQkgICAgICJkZWxsX3JidSIsICZyYnVfZGV2aWNlLT5kZXYsCisJCQkJICAgICAmY29udGV4dCwgY2FsbGJhY2tmbl9yYnUpOworCWlmIChyYykKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiZGVsbF9yYnU6JXMgcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQgZmFpbGVkIgorCQkgICAgICAgIiAlZFxuIiwgX19GVU5DVElPTl9fLCByYyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRjZHJidV9pbml0KHZvaWQpCit7CisJaW50IHJjID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmcmJ1X2RhdGEubG9jayk7CisKKwlpbml0X3BhY2tldF9oZWFkKCk7CisJcmJ1X2RldmljZSA9CisJICAgIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImRlbGxfcmJ1IiwgLTEsIE5VTEwsIDApOworCWlmICghcmJ1X2RldmljZSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJkZWxsX3JidTolczpwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlICIKKwkJICAgICAgICJmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcmJ1X2RldmljZS0+ZGV2LmtvYmosICZyYnVfZGF0YV9hdHRyKTsKKwlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnJidV9kZXZpY2UtPmRldi5rb2JqLCAmcmJ1X2ltYWdlX3R5cGVfYXR0cik7CisKKwlyYyA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCBGV19BQ1RJT05fTk9IT1RQTFVHLAorCQkJCSAgICAgImRlbGxfcmJ1IiwgJnJidV9kZXZpY2UtPmRldiwKKwkJCQkgICAgICZjb250ZXh0LCBjYWxsYmFja2ZuX3JidSk7CisJaWYgKHJjKQorCQlwcmludGsoS0VSTl9FUlIgImRlbGxfcmJ1OiVzOnJlcXVlc3RfZmlybXdhcmVfbm93YWl0IgorCQkgICAgICAgIiBmYWlsZWQgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworCisJcmV0dXJuIHJjOworCit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBkY2RyYnVfZXhpdCh2b2lkKQoreworCXNwaW5fbG9jaygmcmJ1X2RhdGEubG9jayk7CisJcGFja2V0X2VtcHR5X2xpc3QoKTsKKwlpbWdfdXBkYXRlX2ZyZWUoKTsKKwlzcGluX3VubG9jaygmcmJ1X2RhdGEubG9jayk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocmJ1X2RldmljZSk7Cit9CisKK21vZHVsZV9leGl0KGRjZHJidV9leGl0KTsKK21vZHVsZV9pbml0KGRjZHJidV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwppbmRleCAxNDBkNWY4Li4xMzhkYzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKKysrIGIvZHJpdmVycy9od21vbi9LY29uZmlnCkBAIC0xMiwxMiArMTIsMjAgQEAKIAkgIG9mIGEgc3lzdGVtLiBNb3N0IG1vZGVybiBtb3RoZXJib2FyZHMgaW5jbHVkZSBzdWNoIGEgZGV2aWNlLiBJdAogCSAgY2FuIGluY2x1ZGUgdGVtcGVyYXR1cmUgc2Vuc29ycywgdm9sdGFnZSBzZW5zb3JzLCBmYW4gc3BlZWQKIAkgIHNlbnNvcnMgYW5kIHZhcmlvdXMgYWRkaXRpb25hbCBmZWF0dXJlcyBzdWNoIGFzIHRoZSBhYmlsaXR5IHRvCi0JICBjb250cm9sIHRoZSBzcGVlZCBvZiB0aGUgZmFucy4KKwkgIGNvbnRyb2wgdGhlIHNwZWVkIG9mIHRoZSBmYW5zLiAgSWYgeW91IHdhbnQgdGhpcyBzdXBwb3J0IHlvdQorCSAgc2hvdWxkIHNheSBZIGhlcmUgYW5kIGFsc28gdG8gdGhlIHNwZWNpZmljIGRyaXZlcihzKSBmb3IgeW91cgorCSAgc2Vuc29ycyBjaGlwKHMpIGJlbG93LgorCisJICBUaGlzIHN1cHBvcnQgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaHdtb24uCisKK2NvbmZpZyBIV01PTl9WSUQKKwl0cmlzdGF0ZQorCWRlZmF1bHQgbgogCiBjb25maWcgU0VOU09SU19BRE0xMDIxCiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTEwMjEgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDCi0Jc2VsZWN0IEkyQ19TRU5TT1IKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNMTAyMQogCSAgYW5kIEFETTEwMjMgc2Vuc29yIGNoaXBzIGFuZCBjbG9uZXM6IE1heGltIE1BWDE2MTcgYW5kIE1BWDE2MTdBLApAQCAtMzAsNyArMzgsNyBAQAogY29uZmlnIFNFTlNPUlNfQURNMTAyNQogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDI1IGFuZCBjb21wYXRpYmxlcyIKIAlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgorCXNlbGVjdCBIV01PTl9WSUQKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNMTAyNQogCSAgYW5kIFBoaWxpcHMgTkUxNjE5IHNlbnNvciBjaGlwcy4KQEAgLTQxLDcgKzQ5LDcgQEAKIGNvbmZpZyBTRU5TT1JTX0FETTEwMjYKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTAyNiBhbmQgY29tcGF0aWJsZXMiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTEwMjYKIAkgIHNlbnNvciBjaGlwLgpAQCAtNTIsNyArNjAsNiBAQAogY29uZmlnIFNFTlNPUlNfQURNMTAzMQogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDMxIGFuZCBjb21wYXRpYmxlcyIKIAlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDMxCiAJICBhbmQgQURNMTAzMCBzZW5zb3IgY2hpcHMuCkBAIC02Myw3ICs3MCw3IEBACiBjb25maWcgU0VOU09SU19BRE05MjQwCiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTkyNDAgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE05MjQwLAogCSAgRGFsbGFzIERTMTc4MCwgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTgxIHNlbnNvciBjaGlwcy4KQEAgLTc0LDcgKzgxLDcgQEAKIGNvbmZpZyBTRU5TT1JTX0FTQjEwMAogCXRyaXN0YXRlICJBc3VzIEFTQjEwMCBCYWNoIgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQVNCMTAwIEJhY2ggc2Vuc29yCiAJICBjaGlwIGZvdW5kIG9uIHNvbWUgQXN1cyBtYWluYm9hcmRzLgpAQCAtODUsNyArOTIsNyBAQAogY29uZmlnIFNFTlNPUlNfQVRYUDEKIAl0cmlzdGF0ZSAiQXR0YW5zaWMgQVRYUDEgVklEIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBBdHRhbnNpYyBBVFhQMSBWSUQKIAkgIGNvbnRyb2xsZXIuCkBAIC05OSw3ICsxMDYsNiBAQAogY29uZmlnIFNFTlNPUlNfRFMxNjIxCiAJdHJpc3RhdGUgIkRhbGxhcyBTZW1pY29uZHVjdG9yIERTMTYyMSBhbmQgRFMxNjI1IgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIERhbGxhcyBTZW1pY29uZHVjdG9yCiAJICBEUzE2MjEgYW5kIERTMTYyNSBzZW5zb3IgY2hpcHMuCkBAIC0xMTAsNyArMTE2LDYgQEAKIGNvbmZpZyBTRU5TT1JTX0ZTQ0hFUgogCXRyaXN0YXRlICJGU0MgSGVybWVzIgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEZ1aml0c3UgU2llbWVucwogCSAgQ29tcHV0ZXJzIEhlcm1lcyBzZW5zb3IgY2hpcHMuCkBAIC0xMjEsNyArMTI2LDYgQEAKIGNvbmZpZyBTRU5TT1JTX0ZTQ1BPUwogCXRyaXN0YXRlICJGU0MgUG9zZWlkb24iCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRnVqaXRzdSBTaWVtZW5zCiAJICBDb21wdXRlcnMgUG9zZWlkb24gc2Vuc29yIGNoaXBzLgpAQCAtMTMyLDcgKzEzNiw2IEBACiBjb25maWcgU0VOU09SU19HTDUxOFNNCiAJdHJpc3RhdGUgIkdlbmVzeXMgTG9naWMgR0w1MThTTSIKIAlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEdlbmVzeXMgTG9naWMgR0w1MThTTQogCSAgc2Vuc29yIGNoaXBzLgpAQCAtMTQzLDcgKzE0Niw3IEBACiBjb25maWcgU0VOU09SU19HTDUyMFNNCiAJdHJpc3RhdGUgIkdlbmVzeXMgTG9naWMgR0w1MjBTTSIKIAlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgorCXNlbGVjdCBIV01PTl9WSUQKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgR2VuZXN5cyBMb2dpYyBHTDUyMFNNCiAJICBzZW5zb3IgY2hpcHMuCkBAIC0xNTQsNyArMTU3LDggQEAKIGNvbmZpZyBTRU5TT1JTX0lUODcKIAl0cmlzdGF0ZSAiSVRFIElUODd4eCBhbmQgY29tcGF0aWJsZXMiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMKLQlzZWxlY3QgSTJDX1NFTlNPUgorCXNlbGVjdCBJMkNfSVNBCisJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBJVEUgSVQ4N3h4IHNlbnNvciBjaGlwcwogCSAgYW5kIGNsb25lczogU2lTOTYwLgpAQCAtMTY1LDcgKzE2OSw2IEBACiBjb25maWcgU0VOU09SU19MTTYzCiAJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE02MyIKIAlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcgogCSAgTE02MyByZW1vdGUgZGlvZGUgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3Igd2l0aCBpbnRlZ3JhdGVkIGZhbgpAQCAtMTc4LDcgKzE4MSw2IEBACiBjb25maWcgU0VOU09SU19MTTc1CiAJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03NSBhbmQgY29tcGF0aWJsZXMiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMKLQlzZWxlY3QgSTJDX1NFTlNPUgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzUKIAkgIHNlbnNvciBjaGlwcyBhbmQgY2xvbmVzOiBEYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzc1IGFuZCBEUzE3NzUgKGluCkBAIC0xOTQsNyArMTk2LDYgQEAKIGNvbmZpZyBTRU5TT1JTX0xNNzcKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc3IgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03NwogCSAgc2Vuc29yIGNoaXBzLgpAQCAtMjA1LDcgKzIwNiw4IEBACiBjb25maWcgU0VOU09SU19MTTc4CiAJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03OCBhbmQgY29tcGF0aWJsZXMiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCXNlbGVjdCBIV01PTl9WSUQKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc4LAogCSAgTE03OC1KIGFuZCBMTTc5LgpAQCAtMjE2LDcgKzIxOCw2IEBACiBjb25maWcgU0VOU09SU19MTTgwCiAJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04MCIKIAlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yCiAJICBMTTgwIHNlbnNvciBjaGlwcy4KQEAgLTIyNyw3ICsyMjgsNiBAQAogY29uZmlnIFNFTlNPUlNfTE04MwogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODMiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMKLQlzZWxlY3QgSTJDX1NFTlNPUgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yCiAJICBMTTgzIHNlbnNvciBjaGlwcy4KQEAgLTIzOCw3ICsyMzgsNyBAQAogY29uZmlnIFNFTlNPUlNfTE04NQogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODUgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODUKIAkgIHNlbnNvciBjaGlwcyBhbmQgY2xvbmVzOiBBRFQ3NDYzLCBFTUM2RDEwMCwgRU1DNkQxMDIgYW5kIEFETTEwMjcuCkBAIC0yNDksNyArMjQ5LDcgQEAKIGNvbmZpZyBTRU5TT1JTX0xNODcKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg3IgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODcKIAkgIHNlbnNvciBjaGlwcy4KQEAgLTI2MCw3ICsyNjAsNiBAQAogY29uZmlnIFNFTlNPUlNfTE05MAogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTAgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDCi0Jc2VsZWN0IEkyQ19TRU5TT1IKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkwLAogCSAgTE04NiwgTE04OSBhbmQgTE05OSwgQW5hbG9nIERldmljZXMgQURNMTAzMiBhbmQgTWF4aW0gTUFYNjY1NyBhbmQKQEAgLTI3NSw3ICsyNzQsNiBAQAogY29uZmlnIFNFTlNPUlNfTE05MgogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTIgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05MgogCSAgYW5kIE1heGltIE1BWDY2MzUgc2Vuc29yIGNoaXBzLgpAQCAtMjg2LDcgKzI4NCw2IEBACiBjb25maWcgU0VOU09SU19NQVgxNjE5CiAJdHJpc3RhdGUgIk1heGltIE1BWDE2MTkgc2Vuc29yIGNoaXAiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYMTYxOSBzZW5zb3IgY2hpcC4KIApAQCAtMjk2LDggKzI5Myw4IEBACiBjb25maWcgU0VOU09SU19QQzg3MzYwCiAJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzM2MCBmYW1pbHkiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKIAlzZWxlY3QgSTJDX0lTQQorCXNlbGVjdCBIV01PTl9WSUQKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nCiAJICBmdW5jdGlvbnMgb2YgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzM2eCBTdXBlci1JL08gY2hpcHMuCkBAIC0zMTEsNyArMzA4LDYgQEAKIGNvbmZpZyBTRU5TT1JTX1NJUzU1OTUKIAl0cmlzdGF0ZSAiU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycC4gU2lTNTU5NSIKIAlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKIAlzZWxlY3QgSTJDX0lTQQogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBzZW5zb3JzIGluCkBAIC0zMjMsNyArMzE5LDYgQEAKIGNvbmZpZyBTRU5TT1JTX1NNU0M0N00xCiAJdHJpc3RhdGUgIlNNU0MgTFBDNDdNMTB4IGFuZCBjb21wYXRpYmxlcyIKIAlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgogCXNlbGVjdCBJMkNfSVNBCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIGZhbgpAQCAtMzM2LDcgKzMzMSw2IEBACiBjb25maWcgU0VOU09SU19TTVNDNDdCMzk3CiAJdHJpc3RhdGUgIlNNU0MgTFBDNDdCMzk3LU5DIgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCiAJc2VsZWN0IEkyQ19JU0EKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFNNU0MgTFBDNDdCMzk3LU5DCkBAIC0zNDgsNyArMzQyLDYgQEAKIGNvbmZpZyBTRU5TT1JTX1ZJQTY4NkEKIAl0cmlzdGF0ZSAiVklBNjg2QSIKIAlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBQQ0kKLQlzZWxlY3QgSTJDX1NFTlNPUgogCXNlbGVjdCBJMkNfSVNBCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIHNlbnNvcnMgaW4KQEAgLTM2MCw3ICszNTMsOCBAQAogY29uZmlnIFNFTlNPUlNfVzgzNzgxRAogCXRyaXN0YXRlICJXaW5ib25kIFc4Mzc4MUQsIFc4Mzc4MkQsIFc4Mzc4M1MsIFc4MzYyN0hGLCBBc3VzIEFTOTkxMjdGIgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDCi0Jc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCXNlbGVjdCBIV01PTl9WSUQKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFdpbmJvbmQgVzgzNzh4IHNlcmllcwogCSAgb2Ygc2Vuc29yIGNoaXBzOiB0aGUgVzgzNzgxRCwgVzgzNzgyRCwgVzgzNzgzUyBhbmQgVzgzNjI3SEYsCkBAIC0zNjksMTAgKzM2MywxOCBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgdzgzNzgxZC4KIAorY29uZmlnIFNFTlNPUlNfVzgzNzkyRAorCXRyaXN0YXRlICJXaW5ib25kIFc4Mzc5MkQiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4Mzc5MkQgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdzgzNzkyZC4KKwogY29uZmlnIFNFTlNPUlNfVzgzTDc4NVRTCiAJdHJpc3RhdGUgIldpbmJvbmQgVzgzTDc4NVRTLVMiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFdpbmJvbmQgVzgzTDc4NVRTLVMKIAkgIHNlbnNvciBjaGlwLCB3aGljaCBpcyB1c2VkIG9uIHRoZSBBc3VzIEE3TjhYLCBhbW9uZyBvdGhlcgpAQCAtMzg0LDggKzM4Niw4IEBACiBjb25maWcgU0VOU09SU19XODM2MjdIRgogCXRyaXN0YXRlICJXaW5ib25kIFc4MzYyN0hGLCBXODM2MjdUSEYsIFc4MzYzN0hGLCBXODM2OTdIRiIKIAlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgogCXNlbGVjdCBJMkNfSVNBCisJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODM2WDcgc2VyaWVzCiAJICBvZiBzZW5zb3IgY2hpcHM6IHRoZSBXODM2MjdIRiwgVzgzNjI3VEhGLCBXODM2MzdIRiwgYW5kIHRoZSBXODM2OTdIRgpAQCAtMzk2LDcgKzM5OCw2IEBACiBjb25maWcgU0VOU09SU19XODM2MjdFSEYKIAl0cmlzdGF0ZSAiV2luYm9uZCBXODM2MjdFSEYiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKIAlzZWxlY3QgSTJDX0lTQQogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUKQEAgLTQwNCw2ICs0MDUsOSBAQAogCSAgT25seSBmYW4gYW5kIHRlbXBlcmF0dXJlIGlucHV0cyBhcmUgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQsIHdoaWxlCiAJICB0aGUgY2hpcCBkb2VzIG11Y2ggbW9yZSB0aGFuIHRoYXQuCiAKKwkgIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIFc4MzYyN0VIRywgd2hpY2ggaXMgdGhlIGxlYWQtZnJlZQorCSAgdmVyc2lvbiBvZiB0aGUgVzgzNjI3RUhGLgorCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCB3ODM2MjdlaGYuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCmluZGV4IDI3ODE0MDMuLjM4MWYxYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQpAQCAtMiw5ICsyLDEzIEBACiAjIE1ha2VmaWxlIGZvciBzZW5zb3IgY2hpcCBkcml2ZXJzLgogIwogCitvYmotJChDT05GSUdfSFdNT04pCQkrPSBod21vbi5vCitvYmotJChDT05GSUdfSFdNT05fVklEKQkJKz0gaHdtb24tdmlkLm8KKwogIyBhc2IxMDAsIHRoZW4gdzgzNzgxZCBnbyBmaXJzdCwgYXMgdGhleSBjYW4gb3ZlcnJpZGUgb3RoZXIgZHJpdmVycycgYWRkcmVzc2VzLgogb2JqLSQoQ09ORklHX1NFTlNPUlNfQVNCMTAwKQkrPSBhc2IxMDAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYpCSs9IHc4MzYyN2hmLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1c4Mzc5MkQpCSs9IHc4Mzc5MmQubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNzgxRCkJKz0gdzgzNzgxZC5vCiAKIG9iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjEpCSs9IGFkbTEwMjEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMDIxLmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjEuYwppbmRleCBkMmM3NzRjLi5lOTI4Y2RiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEwMjEuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjEuYwpAQCAtMjQsNyArMjQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKIAogLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KQEAgLTMyLDEwICszMyw5IEBACiAJCQkJCTB4MjksIDB4MmEsIDB4MmIsCiAJCQkJCTB4NGMsIDB4NGQsIDB4NGUsIAogCQkJCQlJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OwogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotU0VOU09SU19JTlNNT0RfOChhZG0xMDIxLCBhZG0xMDIzLCBtYXgxNjE3LCBtYXgxNjE3YSwgdGhtYzEwLCBsbTg0LCBnbDUyM3NtLCBtYzEwNjYpOworSTJDX0NMSUVOVF9JTlNNT0RfOChhZG0xMDIxLCBhZG0xMDIzLCBtYXgxNjE3LCBtYXgxNjE3YSwgdGhtYzEwLCBsbTg0LCBnbDUyM3NtLCBtYzEwNjYpOwogCiAvKiBhZG0xMDIxIGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KIApAQCAtODksNiArODksNyBAQAogLyogRWFjaCBjbGllbnQgaGFzIHRoaXMgYWRkaXRpb25hbCBkYXRhICovCiBzdHJ1Y3QgYWRtMTAyMV9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCWVudW0gY2hpcHMgdHlwZTsKIAogCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CkBAIC0xODUsNyArMTg2LDcgQEAKIHsKIAlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCiAJCXJldHVybiAwOwotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGFkbTEwMjFfZGV0ZWN0KTsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIGFkbTEwMjFfZGV0ZWN0KTsKIH0KIAogc3RhdGljIGludCBhZG0xMDIxX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKQEAgLTE5NiwxNSArMTk3LDYgQEAKIAlpbnQgZXJyID0gMDsKIAljb25zdCBjaGFyICp0eXBlX25hbWUgPSAiIjsKIAotCS8qIE1ha2Ugc3VyZSB3ZSBhcmVuJ3QgcHJvYmluZyB0aGUgSVNBIGJ1cyEhIFRoaXMgaXMganVzdCBhIHNhZmV0eSBjaGVjawotCSAgIGF0IHRoaXMgbW9tZW50OyBpMmNfZGV0ZWN0IHJlYWxseSB3b24ndCBjYWxsIHVzLiAqLwotI2lmZGVmIERFQlVHCi0JaWYgKGkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkgewotCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJhZG0xMDIxX2RldGVjdCBjYWxsZWQgZm9yIGFuIElTQSBidXMgYWRhcHRlcj8hP1xuIik7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgotCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlnb3RvIGVycm9yMDsKIApAQCAtMjk1LDYgKzI4NywxMiBAQAogCQlhZG0xMDIxX2luaXRfY2xpZW50KG5ld19jbGllbnQpOwogCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKKwkJZ290byBlcnJvcjI7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWluKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKQEAgLTMwNSw2ICszMDMsOCBAQAogCiAJcmV0dXJuIDA7CiAKK2Vycm9yMjoKKwlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKIGVycm9yMToKIAlrZnJlZShkYXRhKTsKIGVycm9yMDoKQEAgLTMyMiwxNCArMzIyLDE1IEBACiAKIHN0YXRpYyBpbnQgYWRtMTAyMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IGFkbTEwMjFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOwogCi0Ja2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCisJCXJldHVybiBlcnI7CisKKwlrZnJlZShkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMDI1LmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjUuYwppbmRleCBlNDUyZDBkLi41MjZiN2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEwMjUuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjUuYwpAQCAtNTAsOCArNTAsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAvKgogICogQWRkcmVzc2VzIHRvIHNjYW4KQEAgLTYwLDEzICs2MSwxMiBAQAogICovCiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIDB4MmUsIEkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CiAKIC8qCiAgKiBJbnNtb2QgcGFyYW1ldGVycwogICovCiAKLVNFTlNPUlNfSU5TTU9EXzIoYWRtMTAyNSwgbmUxNjE5KTsKK0kyQ19DTElFTlRfSU5TTU9EXzIoYWRtMTAyNSwgbmUxNjE5KTsKIAogLyoKICAqIFRoZSBBRE0xMDI1IHJlZ2lzdGVycwpAQCAtMTMyLDYgKzEzMiw3IEBACiAKIHN0cnVjdCBhZG0xMDI1X2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKIAljaGFyIHZhbGlkOyAvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KQEAgLTMxMiw3ICszMTMsNyBAQAogewogCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgYWRtMTAyNV9kZXRlY3QpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgYWRtMTAyNV9kZXRlY3QpOwogfQogCiAvKgpAQCAtNDE2LDYgKzQxNywxMiBAQAogCWFkbTEwMjVfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOworCQlnb3RvIGV4aXRfZGV0YWNoOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOwpAQCAtNDUyLDYgKzQ1OSw4IEBACiAKIAlyZXR1cm4gMDsKIAorZXhpdF9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiBleGl0X2ZyZWU6CiAJa2ZyZWUoZGF0YSk7CiBleGl0OgpAQCAtNDY0LDcgKzQ3Myw3IEBACiAJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBpOwogCi0JZGF0YS0+dnJtID0gaTJjX3doaWNoX3ZybSgpOworCWRhdGEtPnZybSA9IHZpZF93aGljaF92cm0oKTsKIAogCS8qCiAJICogU2V0IGhpZ2ggbGltaXRzCkBAIC01MDIsMTUgKzUxMSwxNSBAQAogCiBzdGF0aWMgaW50IGFkbTEwMjVfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKLQkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CiAKLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKKwkJcmV0dXJuIGVycjsKKworCWtmcmVlKGRhdGEpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkbTEwMjYuYyBiL2RyaXZlcnMvaHdtb24vYWRtMTAyNi5jCmluZGV4IGM4YTdmNDcuLjYyNTE1ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWRtMTAyNi5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWRtMTAyNi5jCkBAIC0yOCwxNiArMjgsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyYywgMHgyZCwgMHgyZSwgSTJDX0NMSUVOVF9FTkQgfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKIAogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLVNFTlNPUlNfSU5TTU9EXzEoYWRtMTAyNik7CitJMkNfQ0xJRU5UX0lOU01PRF8xKGFkbTEwMjYpOwogCiBzdGF0aWMgaW50IGdwaW9faW5wdXRbMTddICA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKIAkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsgCkBAIC0yNTksNiArMjU5LDcgQEAKIAogc3RydWN0IGFkbTEwMjZfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CiAJZW51bSBjaGlwcyB0eXBlOwogCkBAIC0zMTksMTMgKzMyMCwxNSBAQAogCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkgewogCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgYWRtMTAyNl9kZXRlY3QpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgYWRtMTAyNl9kZXRlY3QpOwogfQogCiBpbnQgYWRtMTAyNl9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CiAJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1NDksMTIgKzE1NTIsMTggQEAKIAkJZ290byBleGl0ZnJlZTsKIAogCS8qIFNldCB0aGUgVlJNIHZlcnNpb24gKi8KLQlkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7CisJZGF0YS0+dnJtID0gdmlkX3doaWNoX3ZybSgpOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgQURNMTAyNiBjaGlwICovCiAJYWRtMTAyNl9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gZXhpdGRldGFjaDsKKwl9CisKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjBfaW5wdXQuZGV2X2F0dHIpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luMF9tYXguZGV2X2F0dHIpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luMF9taW4uZGV2X2F0dHIpOwpAQCAtMTY5MCw2ICsxNjk5LDggQEAKIAlyZXR1cm4gMDsKIAogCS8qIEVycm9yIG91dCBhbmQgY2xlYW51cCBjb2RlICovCitleGl0ZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOwogZXhpdGZyZWU6CiAJa2ZyZWUoZGF0YSk7CiBleGl0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMDMxLmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYwppbmRleCA5MzYyNTA5Li41ODMzOGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYwpAQCAtMjYsNyArMjYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKIC8qIEZvbGxvd2luZyBtYWNyb3MgdGFrZXMgY2hhbm5lbCBwYXJhbWV0ZXIgc3RhcnRpbmcgZnJvbSAwIHRvIDIgKi8KICNkZWZpbmUgQURNMTAzMV9SRUdfRkFOX1NQRUVEKG5yKQkoMHgwOCArIChucikpCkBAIC01OSwxNiArNjAsMTYgQEAKIAogLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIDB4MmUsIEkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCi1TRU5TT1JTX0lOU01PRF8yKGFkbTEwMzAsIGFkbTEwMzEpOworSTJDX0NMSUVOVF9JTlNNT0RfMihhZG0xMDMwLCBhZG0xMDMxKTsKIAogdHlwZWRlZiB1OCBhdXRvX2NoYW5fdGFibGVfdFs4XVsyXTsKIAogLyogRWFjaCBjbGllbnQgaGFzIHRoaXMgYWRkaXRpb25hbCBkYXRhICovCiBzdHJ1Y3QgYWRtMTAzMV9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CiAJaW50IGNoaXBfdHlwZTsKIAljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCkBAIC03MjUsMTAgKzcyNiwxMCBAQAogewogCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgYWRtMTAzMV9kZXRlY3QpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgYWRtMTAzMV9kZXRlY3QpOwogfQogCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfZGV0ZWN0ICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfcHJvYmUgKi8KIHN0YXRpYyBpbnQgYWRtMTAzMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CkBAIC03ODgsNiArNzg5LDEyIEBACiAJYWRtMTAzMV9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gZXhpdF9kZXRhY2g7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfZGl2KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfbWluKTsKQEAgLTgzMyw2ICs4NDAsOCBAQAogCiAJcmV0dXJuIDA7CiAKK2V4aXRfZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOwogZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKQEAgLTg0MSwxMSArODUwLDE0IEBACiAKIHN0YXRpYyBpbnQgYWRtMTAzMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCByZXQ7CisKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOwogCWlmICgocmV0ID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkgIT0gMCkgewogCQlyZXR1cm4gcmV0OwogCX0KLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWRtOTI0MC5jIGIvZHJpdmVycy9od21vbi9hZG05MjQwLmMKaW5kZXggY2UyYTZlYi4uYmM3ZmFlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZG05MjQwLmMKKysrIGIvZHJpdmVycy9od21vbi9hZG05MjQwLmMKQEAgLTQ1LDE3ICs0NSwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXZpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tdmlkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCAweDJlLCAweDJmLAogCQkJCQlJMkNfQ0xJRU5UX0VORCB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07Ci0KIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCi1TRU5TT1JTX0lOU01PRF8zKGFkbTkyNDAsIGRzMTc4MCwgbG04MSk7CitJMkNfQ0xJRU5UX0lOU01PRF8zKGFkbTkyNDAsIGRzMTc4MCwgbG04MSk7CiAKIC8qIEFETTkyNDAgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEFETTkyNDBfUkVHX01BTl9JRAkJMHgzZQpAQCAtMTUwLDYgKzE0OSw3IEBACiBzdHJ1Y3QgYWRtOTI0MF9kYXRhIHsKIAllbnVtIGNoaXBzIHR5cGU7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwogCWNoYXIgdmFsaWQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWRfbWVhc3VyZTsKQEAgLTU4Miw2ICs1ODIsMTIgQEAKIAlhZG05MjQwX2luaXRfY2xpZW50KG5ld19jbGllbnQpOwogCiAJLyogcG9wdWxhdGUgc3lzZnMgZmlsZXN5c3RlbSAqLworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOworCQlnb3RvIGV4aXRfZGV0YWNoOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9taW4pOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7CkBAIC02MTUsNiArNjIxLDkgQEAKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2NwdTBfdmlkKTsKIAogCXJldHVybiAwOworCitleGl0X2RldGFjaDoKKwlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKIGV4aXRfZnJlZToKIAlrZnJlZShkYXRhKTsKIGV4aXQ6CkBAIC02MjUsMjAgKzYzNCwyMCBAQAogewogCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgYWRtOTI0MF9kZXRlY3QpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgYWRtOTI0MF9kZXRlY3QpOwogfQogCiBzdGF0aWMgaW50IGFkbTkyNDBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBhZG05MjQwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKLQkJCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOwogCi0Ja2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCisJCXJldHVybiBlcnI7CisKKwlrZnJlZShkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjQ4LDcgKzY1Nyw3IEBACiAJdTggY29uZiA9IGFkbTkyNDBfcmVhZF92YWx1ZShjbGllbnQsIEFETTkyNDBfUkVHX0NPTkZJRyk7CiAJdTggbW9kZSA9IGFkbTkyNDBfcmVhZF92YWx1ZShjbGllbnQsIEFETTkyNDBfUkVHX1RFTVBfQ09ORikgJiAzOwogCi0JZGF0YS0+dnJtID0gaTJjX3doaWNoX3ZybSgpOyAvKiBuZWVkIHRoaXMgdG8gcmVwb3J0IHZpZCBhcyBtViAqLworCWRhdGEtPnZybSA9IHZpZF93aGljaF92cm0oKTsgLyogbmVlZCB0aGlzIHRvIHJlcG9ydCB2aWQgYXMgbVYgKi8KIAogCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlVzaW5nIFZSTTogJWQuJWRcbiIsIGRhdGEtPnZybSAvIDEwLAogCQkJZGF0YS0+dnJtICUgMTApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hc2IxMDAuYyBiL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKaW5kZXggNzBkOTk2ZC4uOGUzNDg1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hc2IxMDAuYworKysgYi9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCkBAIC0zOSw4ICszOSw5IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgImxtNzUuaCIKQEAgLTU0LDExICs1NSw4IEBACiAvKiBJMkMgYWRkcmVzc2VzIHRvIHNjYW4gKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmQsIEkyQ19DTElFTlRfRU5EIH07CiAKLS8qIElTQSBhZGRyZXNzZXMgdG8gc2NhbiAobm9uZSkgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKLQogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLVNFTlNPUlNfSU5TTU9EXzEoYXNiMTAwKTsKK0kyQ19DTElFTlRfSU5TTU9EXzEoYXNiMTAwKTsKIEkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgogCSJ7YnVzLCBjbGllbnRhZGRyLCBzdWJjbGllbnRhZGRyMSwgc3ViY2xpZW50YWRkcjJ9Iik7CiAKQEAgLTE4Myw2ICsxODEsNyBAQAogICAgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHRoZSBjbGllbnQgaXRzZWxmIGlzIGFsbG9jYXRlZC4gKi8KIHN0cnVjdCBhc2IxMDBfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CiAJZW51bSBjaGlwcyB0eXBlOwogCkBAIC02MjEsNyArNjIwLDcgQEAKIHsKIAlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCiAJCXJldHVybiAwOwotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGFzYjEwMF9kZXRlY3QpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgYXNiMTAwX2RldGVjdCk7CiB9CiAKIHN0YXRpYyBpbnQgYXNiMTAwX2RldGVjdF9zdWJjbGllbnRzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsCkBAIC03MTQsMTQgKzcxMyw2IEBACiAJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CiAJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhOwogCi0JLyogYXNiMTAwIGlzIFNNQnVzIG9ubHkgKi8KLQlpZiAoaTJjX2lzX2lzYV9hZGFwdGVyKGFkYXB0ZXIpKSB7Ci0JCXByX2RlYnVnKCJhc2IxMDAubzogZGV0ZWN0IGZhaWxlZCwgIgotCQkJCSJjYW5ub3QgYXR0YWNoIHRvIGxlZ2FjeSBhZGFwdGVyIVxuIik7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gRVJST1IwOwotCX0KLQogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgewogCQlwcl9kZWJ1ZygiYXNiMTAwLm86IGRldGVjdCBmYWlsZWQsICIKIAkJCQkic21idXMgYnl0ZSBkYXRhIG5vdCBzdXBwb3J0ZWQhXG4iKTsKQEAgLTgyMSw2ICs4MTIsMTIgQEAKIAlkYXRhLT5mYW5fbWluWzJdID0gYXNiMTAwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQVNCMTAwX1JFR19GQU5fTUlOKDIpKTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gRVJST1IzOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAwKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMSk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDIpOwpAQCAtODQ3LDYgKzg0NCwxMSBAQAogCiAJcmV0dXJuIDA7CiAKK0VSUk9SMzoKKwlpMmNfZGV0YWNoX2NsaWVudChkYXRhLT5sbTc1WzFdKTsKKwlpMmNfZGV0YWNoX2NsaWVudChkYXRhLT5sbTc1WzBdKTsKKwlrZnJlZShkYXRhLT5sbTc1WzFdKTsKKwlrZnJlZShkYXRhLT5sbTc1WzBdKTsKIEVSUk9SMjoKIAlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKIEVSUk9SMToKQEAgLTg1NywyMSArODU5LDIzIEBACiAKIHN0YXRpYyBpbnQgYXNiMTAwX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQ7ICIKLQkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCS8qIG1haW4gY2xpZW50ICovCisJaWYgKGRhdGEpCisJCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CiAKLQlpZiAoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk9PU5VTEwpIHsKLQkJLyogc3ViY2xpZW50cyAqLworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCisJCXJldHVybiBlcnI7CisKKwkvKiBtYWluIGNsaWVudCAqLworCWlmIChkYXRhKQorCQlrZnJlZShkYXRhKTsKKworCS8qIHN1YmNsaWVudCAqLworCWVsc2UKIAkJa2ZyZWUoY2xpZW50KTsKLQl9IGVsc2UgewotCQkvKiBtYWluIGNsaWVudCAqLwotCQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC05NjksNyArOTczLDcgQEAKIAogCXZpZCA9IGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19WSURfRkFORElWKSAmIDB4MGY7CiAJdmlkIHw9IChhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfQ0hJUElEKSAmIDB4MDEpIDw8IDQ7Ci0JZGF0YS0+dnJtID0gaTJjX3doaWNoX3ZybSgpOworCWRhdGEtPnZybSA9IHZpZF93aGljaF92cm0oKTsKIAl2aWQgPSB2aWRfZnJvbV9yZWcodmlkLCBkYXRhLT52cm0pOwogCiAJLyogU3RhcnQgbW9uaXRvcmluZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hdHhwMS5jIGIvZHJpdmVycy9od21vbi9hdHhwMS5jCmluZGV4IGZjYTNmYzEuLmRlYjRkMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXR4cDEuYworKysgYi9kcml2ZXJzL2h3bW9uL2F0eHAxLmMKQEAgLTIzLDggKzIzLDkgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlN5c3RlbSB2b2x0YWdlcyBjb250cm9sIHZpYSBBdHRhbnNpYyBBVFhQMSIpOwpAQCAtNDAsOSArNDEsOCBAQAogI2RlZmluZSBBVFhQMV9HUElPMU1BU0sJMHgwZgogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDM3LCAweDRlLCBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OwogCi1TRU5TT1JTX0lOU01PRF8xKGF0eHAxKTsKK0kyQ19DTElFTlRfSU5TTU9EXzEoYXR4cDEpOwogCiBzdGF0aWMgaW50IGF0eHAxX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqIGFkYXB0ZXIpOwogc3RhdGljIGludCBhdHhwMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50KTsKQEAgLTU5LDYgKzU5LDcgQEAKIAogc3RydWN0IGF0eHAxX2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsKIAl1OCB2YWxpZDsKQEAgLTI1Miw3ICsyNTMsNyBAQAogCiBzdGF0aWMgaW50IGF0eHAxX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCAmYXR4cDFfZGV0ZWN0KTsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsICZhdHhwMV9kZXRlY3QpOwogfTsKIAogc3RhdGljIGludCBhdHhwMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCkBAIC0yOTUsNyArMjk2LDcgQEAKIAl9CiAKIAkvKiBHZXQgVlJNICovCi0JZGF0YS0+dnJtID0gaTJjX3doaWNoX3ZybSgpOworCWRhdGEtPnZybSA9IHZpZF93aGljaF92cm0oKTsKIAogCWlmICgoZGF0YS0+dnJtICE9IDkwKSAmJiAoZGF0YS0+dnJtICE9IDkxKSkgewogCQlkZXZfZXJyKCZuZXdfY2xpZW50LT5kZXYsICJOb3Qgc3VwcG9ydGluZyBWUk0gJWQuJWRcbiIsCkBAIC0zMTcsNiArMzE4LDEyIEBACiAJCWdvdG8gZXhpdF9mcmVlOwogCX0KIAorCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOworCQlnb3RvIGV4aXRfZGV0YWNoOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZ3BpbzEpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZ3BpbzIpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY3B1MF92aWQpOwpAQCAtMzI2LDYgKzMzMyw4IEBACiAKIAlyZXR1cm4gMDsKIAorZXhpdF9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiBleGl0X2ZyZWU6CiAJa2ZyZWUoZGF0YSk7CiBleGl0OgpAQCAtMzM0LDE0ICszNDMsMTcgQEAKIAogc3RhdGljIGludCBhdHhwMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50KQogeworCXN0cnVjdCBhdHhwMV9kYXRhICogZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBlcnI7CiAKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOworCiAJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKIAogCWlmIChlcnIpCiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGRldGFjaCBjbGllbnQuXG4iKTsKIAllbHNlCi0JCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwkJa2ZyZWUoZGF0YSk7CiAKIAlyZXR1cm4gZXJyOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZHMxNjIxLmMgYi9kcml2ZXJzL2h3bW9uL2RzMTYyMS5jCmluZGV4IDUzNjBkNTguLmIwMTk5ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZHMxNjIxLmMKKysrIGIvZHJpdmVycy9od21vbi9kczE2MjEuYwpAQCAtMjYsMTYgKzI2LDE2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlICJsbTc1LmgiCiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLAogCQkJCQkweDRkLCAweDRlLCAweDRmLCBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OwogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotU0VOU09SU19JTlNNT0RfMShkczE2MjEpOworSTJDX0NMSUVOVF9JTlNNT0RfMShkczE2MjEpOwogc3RhdGljIGludCBwb2xhcml0eSA9IC0xOwogbW9kdWxlX3BhcmFtKHBvbGFyaXR5LCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhwb2xhcml0eSwgIk91dHB1dCdzIHBvbGFyaXR5OiAwID0gYWN0aXZlIGhpZ2gsIDEgPSBhY3RpdmUgbG93Iik7CkBAIC03MSw2ICs3MSw3IEBACiAvKiBFYWNoIGNsaWVudCBoYXMgdGhpcyBhZGRpdGlvbmFsIGRhdGEgKi8KIHN0cnVjdCBkczE2MjFfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwogCWNoYXIgdmFsaWQ7CQkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KQEAgLTE3OSwxMCArMTgwLDEwIEBACiAKIHN0YXRpYyBpbnQgZHMxNjIxX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBkczE2MjFfZGV0ZWN0KTsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIGRzMTYyMV9kZXRlY3QpOwogfQogCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfZGV0ZWN0ICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfcHJvYmUgKi8KIGludCBkczE2MjFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICBpbnQga2luZCkKIHsKQEAgLTI1MCw2ICsyNTEsMTIgQEAKIAlkczE2MjFfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOworCQlnb3RvIGV4aXRfZGV0YWNoOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21pbik7CkBAIC0yNTksNiArMjY2LDggQEAKIAogLyogT0ssIHRoaXMgaXMgbm90IGV4YWN0bHkgZ29vZCBwcm9ncmFtbWluZyBwcmFjdGljZSwgdXN1YWxseS4gQnV0IGl0IGlzCiAgICB2ZXJ5IGNvZGUtZWZmaWNpZW50IGluIHRoaXMgY2FzZS4gKi8KKyAgICAgIGV4aXRfZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOwogICAgICAgZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwogICAgICAgZXhpdDoKQEAgLTI2NywxNSArMjc2LDE1IEBACiAKIHN0YXRpYyBpbnQgZHMxNjIxX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKKwlzdHJ1Y3QgZHMxNjIxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKLQkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CiAKLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKKwkJcmV0dXJuIGVycjsKKworCWtmcmVlKGRhdGEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2ZzY2hlci5jIGIvZHJpdmVycy9od21vbi9mc2NoZXIuYwppbmRleCBkYTQxMTc0Li5lZWY2MDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2ZzY2hlci5jCisrKyBiL2RyaXZlcnMvaHdtb24vZnNjaGVyLmMKQEAgLTMxLDIwICszMSwyMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKIC8qCiAgKiBBZGRyZXNzZXMgdG8gc2NhbgogICovCiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NzMsIEkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CiAKIC8qCiAgKiBJbnNtb2QgcGFyYW1ldGVycwogICovCiAKLVNFTlNPUlNfSU5TTU9EXzEoZnNjaGVyKTsKK0kyQ19DTElFTlRfSU5TTU9EXzEoZnNjaGVyKTsKIAogLyoKICAqIFRoZSBGU0NIRVIgcmVnaXN0ZXJzCkBAIC0xMzIsNiArMTMyLDcgQEAKIAogc3RydWN0IGZzY2hlcl9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CiAJY2hhciB2YWxpZDsgLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwogCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOyAvKiBpbiBqaWZmaWVzICovCkBAIC0yODcsNyArMjg4LDcgQEAKIHsKIAlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCiAJCXJldHVybiAwOwotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGZzY2hlcl9kZXRlY3QpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgZnNjaGVyX2RldGVjdCk7CiB9CiAKIHN0YXRpYyBpbnQgZnNjaGVyX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKQEAgLTM0MSw2ICszNDIsMTIgQEAKIAlmc2NoZXJfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOworCQlnb3RvIGV4aXRfZGV0YWNoOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZV9yZXZpc2lvbihuZXdfY2xpZW50KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKG5ld19jbGllbnQpOwogCWRldmljZV9jcmVhdGVfZmlsZV9jb250cm9sKG5ld19jbGllbnQpOwpAQCAtMzYwLDYgKzM2Nyw4IEBACiAKIAlyZXR1cm4gMDsKIAorZXhpdF9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiBleGl0X2ZyZWU6CiAJa2ZyZWUoZGF0YSk7CiBleGl0OgpAQCAtMzY4LDE1ICszNzcsMTUgQEAKIAogc3RhdGljIGludCBmc2NoZXJfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgotCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+Y2xhc3NfZGV2KTsKIAotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQorCQlyZXR1cm4gZXJyOworCisJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZnNjcG9zLmMgYi9kcml2ZXJzL2h3bW9uL2ZzY3Bvcy5jCmluZGV4IDMwMWFlOTguLjVmYzc3YTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2ZzY3Bvcy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZnNjcG9zLmMKQEAgLTM0LDE5ICszNCwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAvKgogICogQWRkcmVzc2VzIHRvIHNjYW4KICAqLwogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg3MywgSTJDX0NMSUVOVF9FTkQgfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKIAogLyoKICAqIEluc21vZCBwYXJhbWV0ZXJzCiAgKi8KLVNFTlNPUlNfSU5TTU9EXzEoZnNjcG9zKTsKK0kyQ19DTElFTlRfSU5TTU9EXzEoZnNjcG9zKTsKIAogLyoKICAqIFRoZSBGU0NQT1MgcmVnaXN0ZXJzCkBAIC0xMTMsNiArMTEzLDcgQEAKICAqLwogc3RydWN0IGZzY3Bvc19kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CiAJY2hhciB2YWxpZDsgCQkvKiAwIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KQEAgLTQzNCw3ICs0MzUsNyBAQAogewogCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgZnNjcG9zX2RldGVjdCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBmc2Nwb3NfZGV0ZWN0KTsKIH0KIAogaW50IGZzY3Bvc19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCkBAIC00OTYsNiArNDk3LDEyIEBACiAJZGV2X2luZm8oJm5ld19jbGllbnQtPmRldiwgIkZvdW5kIGZzY3BvcyBjaGlwLCByZXYgJXVcbiIsIGRhdGEtPnJldmlzaW9uKTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gZXhpdF9kZXRhY2g7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9ldmVudCk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfaW5wdXQpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX2lucHV0KTsKQEAgLTUyNiw2ICs1MzMsOCBAQAogCiAJcmV0dXJuIDA7CiAKK2V4aXRfZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOwogZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKQEAgLTUzNCwxNCArNTQzLDE0IEBACiAKIHN0YXRpYyBpbnQgZnNjcG9zX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKKwlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCIKLQkJCQkJCQkiIG5vdCBkZXRhY2hlZC5cbiIpOworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlyZXR1cm4gZXJyOwotCX0KLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZ2w1MThzbS5jIGIvZHJpdmVycy9od21vbi9nbDUxOHNtLmMKaW5kZXggNmJlZGY3Mi4uMjU2YjkzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9nbDUxOHNtLmMKKysrIGIvZHJpdmVycy9od21vbi9nbDUxOHNtLmMKQEAgLTQxLDE0ICs0MSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OwogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotU0VOU09SU19JTlNNT0RfMihnbDUxOHNtX3IwMCwgZ2w1MThzbV9yODApOworSTJDX0NMSUVOVF9JTlNNT0RfMihnbDUxOHNtX3IwMCwgZ2w1MThzbV9yODApOwogCiAvKiBNYW55IEdMNTE4IGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KIApAQCAtMTE3LDYgKzExNyw3IEBACiAvKiBFYWNoIGNsaWVudCBoYXMgdGhpcyBhZGRpdGlvbmFsIGRhdGEgKi8KIHN0cnVjdCBnbDUxOF9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCWVudW0gY2hpcHMgdHlwZTsKIAogCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CkBAIC0zNDYsNyArMzQ3LDcgQEAKIHsKIAlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCiAJCXJldHVybiAwOwotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGdsNTE4X2RldGVjdCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBnbDUxOF9kZXRlY3QpOwogfQogCiBzdGF0aWMgaW50IGdsNTE4X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKQEAgLTQxOSw2ICs0MjAsMTIgQEAKIAlnbDUxOF9pbml0X2NsaWVudCgoc3RydWN0IGkyY19jbGllbnQgKikgbmV3X2NsaWVudCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOworCQlnb3RvIGV4aXRfZGV0YWNoOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOwpAQCAtNDUwLDYgKzQ1Nyw4IEBACiAvKiBPSywgdGhpcyBpcyBub3QgZXhhY3RseSBnb29kIHByb2dyYW1taW5nIHByYWN0aWNlLCB1c3VhbGx5LiBCdXQgaXQgaXMKICAgIHZlcnkgY29kZS1lZmZpY2llbnQgaW4gdGhpcyBjYXNlLiAqLwogCitleGl0X2RldGFjaDoKKwlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKIGV4aXRfZnJlZToKIAlrZnJlZShkYXRhKTsKIGV4aXQ6CkBAIC00NzcsMTYgKzQ4NiwxNSBAQAogCiBzdGF0aWMgaW50IGdsNTE4X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKKwlzdHJ1Y3QgZ2w1MThfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgotCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKIAkJcmV0dXJuIGVycjsKLQl9CiAKLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7Ci0KKwlrZnJlZShkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9nbDUyMHNtLmMgYi9kcml2ZXJzL2h3bW9uL2dsNTIwc20uYwppbmRleCA4MGFlOGQzLi4xMmZkNzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2dsNTIwc20uYworKysgYi9kcml2ZXJzL2h3bW9uL2dsNTIwc20uYwpAQCAtMjYsOCArMjYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAvKiBUeXBlIG9mIHRoZSBleHRyYSBzZW5zb3IgKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBleHRyYV9zZW5zb3JfdHlwZTsKQEAgLTM2LDEwICszNyw5IEBACiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OwogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotU0VOU09SU19JTlNNT0RfMShnbDUyMHNtKTsKK0kyQ19DTElFTlRfSU5TTU9EXzEoZ2w1MjBzbSk7CiAKIC8qIE1hbnkgR0w1MjAgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAKIE9uZSBvZiB0aGUgaW5wdXRzIGNhbiBiZSBjb25maWd1cmVkIGFzIGVpdGhlciB0ZW1wIG9yIHZvbHRhZ2UuCkBAIC0xMjAsNiArMTIwLDcgQEAKIC8qIENsaWVudCBkYXRhICovCiBzdHJ1Y3QgZ2w1MjBfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwogCWNoYXIgdmFsaWQ7CQkvKiB6ZXJvIHVudGlsIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwogCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBpbiBqaWZmaWVzICovCkBAIC01MTgsNyArNTE5LDcgQEAKIHsKIAlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCiAJCXJldHVybiAwOwotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGdsNTIwX2RldGVjdCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBnbDUyMF9kZXRlY3QpOwogfQogCiBzdGF0aWMgaW50IGdsNTIwX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKQEAgLTU3MSw2ICs1NzIsMTIgQEAKIAlnbDUyMF9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gZXhpdF9kZXRhY2g7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlX3ZpZChuZXdfY2xpZW50LCAwKTsKIAogCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAwKTsKQEAgLTU5Miw2ICs1OTksOCBAQAogCiAJcmV0dXJuIDA7CiAKK2V4aXRfZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOwogZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKQEAgLTYwOCw3ICs2MTcsNyBAQAogCWNvbmYgPSBvbGRjb25mID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19DT05GKTsKIAogCWRhdGEtPmFsYXJtX21hc2sgPSAweGZmOwotCWRhdGEtPnZybSA9IGkyY193aGljaF92cm0oKTsKKwlkYXRhLT52cm0gPSB2aWRfd2hpY2hfdnJtKCk7CiAKIAlpZiAoZXh0cmFfc2Vuc29yX3R5cGUgPT0gMSkKIAkJY29uZiAmPSB+MHgxMDsKQEAgLTYzOSwxNSArNjQ4LDE1IEBACiAKIHN0YXRpYyBpbnQgZ2w1MjBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCi0JCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOwogCi0Ja2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCisJCXJldHVybiBlcnI7CisKKwlrZnJlZShkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9od21vbi12aWQuYyBiL2RyaXZlcnMvaHdtb24vaHdtb24tdmlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyNzY5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vaHdtb24tdmlkLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgICAgaHdtb24tdmlkLmMgLSBWSUQvVlJNL1ZSRCB2b2x0YWdlIGNvbnZlcnNpb25zCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMDQgUnVkb2xmIE1hcmVrIDxyLm1hcmVrQHNoLmN2dXQuY3o+CisKKyAgICBQYXJ0bHkgaW1wb3J0ZWQgZnJvbSBpMmMtdmlkLmggb2YgdGhlIGxtX3NlbnNvcnMgcHJvamVjdAorICAgIENvcHlyaWdodCAoYykgMjAwMiBNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CisgICAgV2l0aCBhc3Npc3RhbmNlIGZyb20gVHJlbnQgUGllcGhvIDx4eXp6eUBzcGVha2Vhc3kub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tdmlkLmg+CisKKy8qCisgICAgQ29tbW9uIGNvZGUgZm9yIGRlY29kaW5nIFZJRCBwaW5zLgorCisgICAgUmVmZXJlbmNlczoKKworICAgIEZvciBWUk0gOC40IHRvIDkuMSwgIlZSTSB4LnkgREMtREMgQ29udmVydGVyIERlc2lnbiBHdWlkZWxpbmVzIiwKKyAgICBhdmFpbGFibGUgYXQgaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vLgorCisgICAgRm9yIFZSRCAxMC4wIGFuZCB1cCwgIlZSRCB4LnkgRGVzaWduIEd1aWRlIiwKKyAgICBhdmFpbGFibGUgYXQgaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vLgorCisgICAgQU1EIE9wdGVyb24gcHJvY2Vzc29ycyBkb24ndCBmb2xsb3cgdGhlIEludGVsIHNwZWNpZmljYXRpb25zLgorICAgIEknbSBnb2luZyB0byAibWFrZSB1cCIgMi40IGFzIHRoZSBzcGVjIG51bWJlciBmb3IgdGhlIE9wdGVyb25zLgorICAgIE5vIGdvb2QgcmVhc29uIGp1c3QgYSBtbmVtb25pYyBmb3IgdGhlIDI0eCBPcHRlcm9uIHByb2Nlc3NvcgorICAgIHNlcmllcy4KKworICAgIE9wdGVyb24gVklEIGVuY29kaW5nIGlzOgorICAgICAgIDAwMDAwICA9ICAxLjU1MCBWCisgICAgICAgMDAwMDEgID0gIDEuNTI1IFYKKyAgICAgICAgLiAuIC4gLgorICAgICAgIDExMTEwICA9ICAwLjgwMCBWCisgICAgICAgMTExMTEgID0gIDAuMDAwIFYgKG9mZikKKyovCisKKy8qIHZybSBpcyB0aGUgVlJNL1ZSRCBkb2N1bWVudCB2ZXJzaW9uIG11bHRpcGxpZWQgYnkgMTAuCisgICB2YWwgaXMgdGhlIDQtLCA1LSBvciA2LWJpdCBWSUQgY29kZS4KKyAgIFJldHVybmVkIHZhbHVlIGlzIGluIG1WIHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IGluIHRoZSBrZXJuZWwuICovCitpbnQgdmlkX2Zyb21fcmVnKGludCB2YWwsIGludCB2cm0pCit7CisJaW50IHZpZDsKKworCXN3aXRjaCh2cm0pIHsKKworCWNhc2UgIDA6CisJCXJldHVybiAwOworCisJY2FzZSAxMDA6ICAgICAgICAgICAgICAgLyogVlJEIDEwLjAgKi8KKwkJaWYoKHZhbCAmIDB4MWYpID09IDB4MWYpCisJCQlyZXR1cm4gMDsKKwkJaWYoKHZhbCAmIDB4MWYpIDw9IDB4MDkgfHwgdmFsID09IDB4MGEpCisJCQl2aWQgPSAxMDg3NSAtICh2YWwgJiAweDFmKSAqIDI1MDsKKwkJZWxzZQorCQkJdmlkID0gMTg2MjUgLSAodmFsICYgMHgxZikgKiAyNTA7CisJCWlmKHZhbCAmIDB4MjApCisJCQl2aWQgLT0gMTI1OworCQl2aWQgLz0gMTA7ICAgICAgLyogb25seSByZXR1cm4gMyBkZWMuIHBsYWNlcyBmb3Igbm93ICovCisJCXJldHVybiB2aWQ7CisKKwljYXNlIDI0OiAgICAgICAgICAgICAgICAvKiBPcHRlcm9uIHByb2Nlc3NvciAqLworCQlyZXR1cm4odmFsID09IDB4MWYgPyAwIDogMTU1MCAtIHZhbCAqIDI1KTsKKworCWNhc2UgOTE6CQkvKiBWUk0gOS4xICovCisJY2FzZSA5MDoJCS8qIFZSTSA5LjAgKi8KKwkJcmV0dXJuKHZhbCA9PSAweDFmID8gMCA6CisJCSAgICAgICAgICAgICAgICAgICAgICAgMTg1MCAtIHZhbCAqIDI1KTsKKworCWNhc2UgODU6CQkvKiBWUk0gOC41ICovCisJCXJldHVybigodmFsICYgMHgxMCAgPyAyNSA6IDApICsKKwkJICAgICAgICgodmFsICYgMHgwZikgPiAweDA0ID8gMjA1MCA6IDEyNTApIC0KKwkJICAgICAgICgodmFsICYgMHgwZikgKiA1MCkpOworCisJY2FzZSA4NDoJCS8qIFZSTSA4LjQgKi8KKwkJdmFsICY9IDB4MGY7CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoJCS8qIFZSTSA4LjIgKi8KKwkJcmV0dXJuKHZhbCA9PSAweDFmID8gMCA6CisJCSAgICAgICB2YWwgJiAweDEwICA/IDUxMDAgLSAodmFsKSAqIDEwMCA6CisJCSAgICAgICAgICAgICAgICAgICAgIDIwNTAgLSAodmFsKSAqIDUwKTsKKwl9Cit9CisKKworLyoKKyAgICBBZnRlciB0aGlzIHBvaW50IGlzIHRoZSBjb2RlIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHdoaWNoCisgICAgVlJNL1ZSRCBzcGVjaWZpY2F0aW9uIHNob3VsZCBiZSB1c2VkIGRlcGVuZGluZyBvbiB0aGUgQ1BVLgorKi8KKworc3RydWN0IHZybV9tb2RlbCB7CisJdTggdmVuZG9yOworCXU4IGVmZl9mYW1pbHk7CisJdTggZWZmX21vZGVsOworCWludCB2cm1fdHlwZTsKK307CisKKyNkZWZpbmUgQU5ZIDB4RkYKKworI2lmZGVmIENPTkZJR19YODYKKworc3RhdGljIHN0cnVjdCB2cm1fbW9kZWwgdnJtX21vZGVsc1tdID0geworCXtYODZfVkVORE9SX0FNRCwgMHg2LCBBTlksIDkwfSwJCS8qIEF0aGxvbiBEdXJvbiBldGMgKi8KKwl7WDg2X1ZFTkRPUl9BTUQsIDB4RiwgQU5ZLCAyNH0sCQkvKiBBdGhsb24gNjQsIE9wdGVyb24gKi8KKwl7WDg2X1ZFTkRPUl9JTlRFTCwgMHg2LCAweDksIDg1fSwJLyogMC4xM3VtIHRvbyAqLworCXtYODZfVkVORE9SX0lOVEVMLCAweDYsIDB4QiwgODV9LAkvKiBUdWFsYXRpbiAqLworCXtYODZfVkVORE9SX0lOVEVMLCAweDYsIEFOWSwgODJ9LAkvKiBhbnkgUDYgKi8KKwl7WDg2X1ZFTkRPUl9JTlRFTCwgMHg3LCBBTlksIDB9LAkvKiBJdGFuaXVtICovCisJe1g4Nl9WRU5ET1JfSU5URUwsIDB4RiwgMHgwLCA5MH0sCS8qIFA0ICovCisJe1g4Nl9WRU5ET1JfSU5URUwsIDB4RiwgMHgxLCA5MH0sCS8qIFA0IFdpbGxhbWV0dGUgKi8KKwl7WDg2X1ZFTkRPUl9JTlRFTCwgMHhGLCAweDIsIDkwfSwJLyogUDQgTm9ydGh3b29kICovCisJe1g4Nl9WRU5ET1JfSU5URUwsIDB4RiwgMHgzLCAxMDB9LAkvKiBQNCBQcmVzY290dCAqLworCXtYODZfVkVORE9SX0lOVEVMLCAweEYsIDB4NCwgMTAwfSwJLyogUDQgUHJlc2NvdHQgKi8KKwl7WDg2X1ZFTkRPUl9JTlRFTCwgMHgxMCxBTlksIDB9LAkvKiBJdGFuaXVtIDIgKi8KKwl7WDg2X1ZFTkRPUl9VTktOT1dOLCBBTlksIEFOWSwgMH0JLyogc3RvcCBoZXJlICovCit9OworCitzdGF0aWMgaW50IGZpbmRfdnJtKHU4IGVmZl9mYW1pbHksIHU4IGVmZl9tb2RlbCwgdTggdmVuZG9yKQoreworCWludCBpID0gMDsKKworCXdoaWxlICh2cm1fbW9kZWxzW2ldLnZlbmRvciE9WDg2X1ZFTkRPUl9VTktOT1dOKSB7CisJCWlmICh2cm1fbW9kZWxzW2ldLnZlbmRvcj09dmVuZG9yKQorCQkJaWYgKCh2cm1fbW9kZWxzW2ldLmVmZl9mYW1pbHk9PWVmZl9mYW1pbHkpCisJCQkgJiYgKCh2cm1fbW9kZWxzW2ldLmVmZl9tb2RlbD09ZWZmX21vZGVsKSB8fAorCQkJICAgICAodnJtX21vZGVsc1tpXS5lZmZfbW9kZWw9PUFOWSkpKQorCQkJCXJldHVybiB2cm1fbW9kZWxzW2ldLnZybV90eXBlOworCQlpKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB2aWRfd2hpY2hfdnJtKHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGE7CisJdTMyIGVheDsKKwl1OCBlZmZfZmFtaWx5LCBlZmZfbW9kZWw7CisJaW50IHZybV9yZXQ7CisKKwlpZiAoYy0+eDg2IDwgNikJCS8qIEFueSBDUFUgd2l0aCBmYW1pbHkgbG93ZXIgdGhhbiA2ICovCisJCXJldHVybiAwOwkvKiBkb2Vzbid0IGhhdmUgVklEIGFuZC9vciBDUFVJRCAqLworCisJZWF4ID0gY3B1aWRfZWF4KDEpOworCWVmZl9mYW1pbHkgPSAoKGVheCAmIDB4MDAwMDBGMDApPj44KTsKKwllZmZfbW9kZWwgID0gKChlYXggJiAweDAwMDAwMEYwKT4+NCk7CisJaWYgKGVmZl9mYW1pbHkgPT0gMHhGKSB7CS8qIHVzZSBleHRlbmRlZCBtb2RlbCAmIGZhbWlseSAqLworCQllZmZfZmFtaWx5ICs9ICgoZWF4ICYgMHgwMEYwMDAwMCk+PjIwKTsKKwkJZWZmX21vZGVsICs9ICgoZWF4ICYgMHgwMDBGMDAwMCk+PjE2KTw8NDsKKwl9CisJdnJtX3JldCA9IGZpbmRfdnJtKGVmZl9mYW1pbHksZWZmX21vZGVsLGMtPng4Nl92ZW5kb3IpOworCWlmICh2cm1fcmV0ID09IDApCisJCXByaW50ayhLRVJOX0lORk8gImh3bW9uLXZpZDogVW5rbm93biBWUk0gdmVyc2lvbiBvZiB5b3VyICIKKwkJICAgICAgICJ4ODYgQ1BVXG4iKTsKKwlyZXR1cm4gdnJtX3JldDsKK30KKworLyogYW5kIG5vdyBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQgZm9yIHRoZSBub24teDg2IHdvcmxkICovCisjZWxzZQoraW50IHZpZF93aGljaF92cm0odm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJod21vbi12aWQ6IFVua25vd24gVlJNIHZlcnNpb24gb2YgeW91ciBDUFVcbiIpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK0VYUE9SVF9TWU1CT0wodmlkX2Zyb21fcmVnKTsKK0VYUE9SVF9TWU1CT0wodmlkX3doaWNoX3ZybSk7CisKK01PRFVMRV9BVVRIT1IoIlJ1ZG9sZiBNYXJlayA8ci5tYXJla0BzaC5jdnV0LmN6PiIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oImh3bW9uLXZpZCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vaHdtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjQxYzliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9od21vbi5jCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgICAgaHdtb24uYyAtIHBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKKworICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzeXNmcyBjbGFzcyAiaHdtb24iLCBmb3IgdXNlIGJ5IHNlbnNvcnMgZHJpdmVycy4KKworICAgIENvcHlyaWdodCAoQykgMjAwNSBNYXJrIE0uIEhvZmZtYW4gPG1ob2ZmbWFuQGxpZ2h0bGluay5jb20+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisKKyNkZWZpbmUgSFdNT05fSURfUFJFRklYICJod21vbiIKKyNkZWZpbmUgSFdNT05fSURfRk9STUFUIEhXTU9OX0lEX1BSRUZJWCAiJWQiCisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmh3bW9uX2NsYXNzOworCitzdGF0aWMgREVGSU5FX0lEUihod21vbl9pZHIpOworCisvKioKKyAqIGh3bW9uX2RldmljZV9yZWdpc3RlciAtIHJlZ2lzdGVyIHcvIGh3bW9uIHN5c2ZzIGNsYXNzCisgKiBAZGV2OiB0aGUgZGV2aWNlIHRvIHJlZ2lzdGVyCisgKgorICogaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoKSBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBjbGFzcyBkZXZpY2UgaXMgbm8KKyAqIGxvbmdlciBuZWVkZWQuCisgKgorICogUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgbmV3IHN0cnVjdCBjbGFzcyBkZXZpY2UuCisgKi8KK3N0cnVjdCBjbGFzc19kZXZpY2UgKmh3bW9uX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldjsKKwlpbnQgaWQ7CisKKwlpZiAoaWRyX3ByZV9nZXQoJmh3bW9uX2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAoaWRyX2dldF9uZXcoJmh3bW9uX2lkciwgTlVMTCwgJmlkKSA8IDApCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWQgPSBpZCAmIE1BWF9JRF9NQVNLOworCWNkZXYgPSBjbGFzc19kZXZpY2VfY3JlYXRlKGh3bW9uX2NsYXNzLCBNS0RFVigwLDApLCBkZXYsCisJCQkJCUhXTU9OX0lEX0ZPUk1BVCwgaWQpOworCisJaWYgKElTX0VSUihjZGV2KSkKKwkJaWRyX3JlbW92ZSgmaHdtb25faWRyLCBpZCk7CisKKwlyZXR1cm4gY2RldjsKK30KKworLyoqCisgKiBod21vbl9kZXZpY2VfdW5yZWdpc3RlciAtIHJlbW92ZXMgdGhlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjbGFzcyBkZXZpY2UKKyAqCisgKiBAY2RldjogdGhlIGNsYXNzIGRldmljZSB0byBkZXN0cm95CisgKi8KK3ZvaWQgaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldikKK3sKKwlpbnQgaWQ7CisKKwlpZiAoc3NjYW5mKGNkZXYtPmNsYXNzX2lkLCBIV01PTl9JRF9GT1JNQVQsICZpZCkgPT0gMSkgeworCQljbGFzc19kZXZpY2VfdW5yZWdpc3RlcihjZGV2KTsKKwkJaWRyX3JlbW92ZSgmaHdtb25faWRyLCBpZCk7CisJfSBlbHNlCisJCWRldl9kYmcoY2Rldi0+ZGV2LAorCQkJImh3bW9uX2RldmljZV91bnJlZ2lzdGVyKCkgZmFpbGVkOiBiYWQgY2xhc3MgSUQhXG4iKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaHdtb25faW5pdCh2b2lkKQoreworCWh3bW9uX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiaHdtb24iKTsKKwlpZiAoSVNfRVJSKGh3bW9uX2NsYXNzKSkgeworCQlwcmludGsoS0VSTl9FUlIgImh3bW9uLmM6IGNvdWxkbid0IGNyZWF0ZSBzeXNmcyBjbGFzc1xuIik7CisJCXJldHVybiBQVFJfRVJSKGh3bW9uX2NsYXNzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBod21vbl9leGl0KHZvaWQpCit7CisJY2xhc3NfZGVzdHJveShod21vbl9jbGFzcyk7Cit9CisKK21vZHVsZV9pbml0KGh3bW9uX2luaXQpOworbW9kdWxlX2V4aXQoaHdtb25fZXhpdCk7CisKK0VYUE9SVF9TWU1CT0xfR1BMKGh3bW9uX2RldmljZV9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChod21vbl9kZXZpY2VfdW5yZWdpc3Rlcik7CisKK01PRFVMRV9BVVRIT1IoIk1hcmsgTS4gSG9mZm1hbiA8bWhvZmZtYW5AbGlnaHRsaW5rLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaGFyZHdhcmUgbW9uaXRvcmluZyBzeXNmcy9jbGFzcyBzdXBwb3J0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKaW5kZXggZGIyMGM5ZS4uNTNjYzJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pdDg3LmMKKysrIGIvZHJpdmVycy9od21vbi9pdDg3LmMKQEAgLTM2LDE5ICszNiwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtaXNhLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLAogCQkJCQkweDJlLCAweDJmLCBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IDB4MDI5MCwgSTJDX0NMSUVOVF9JU0FfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaXNhX2FkZHJlc3MgPSAweDI5MDsKIAogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLVNFTlNPUlNfSU5TTU9EXzIoaXQ4NywgaXQ4NzEyKTsKK0kyQ19DTElFTlRfSU5TTU9EXzIoaXQ4NywgaXQ4NzEyKTsKIAogI2RlZmluZQlSRUcJMHgyZQkvKiBUaGUgcmVnaXN0ZXIgdG8gcmVhZC93cml0ZSAqLwogI2RlZmluZQlERVYJMHgwNwkvKiBSZWdpc3RlcjogTG9naWNhbCBkZXZpY2Ugc2VsZWN0ICovCkBAIC0xOTIsNiArMTk0LDcgQEAKICAgIGFsbG9jYXRlZC4gKi8KIHN0cnVjdCBpdDg3X2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IHNlbWFwaG9yZSBsb2NrOwogCWVudW0gY2hpcHMgdHlwZTsKIApAQCAtMjE4LDcgKzIyMSw3IEBACiAKIAogc3RhdGljIGludCBpdDg3X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgaW50IGl0ODdfZmluZChpbnQgKmFkZHJlc3MpOworc3RhdGljIGludCBpdDg3X2lzYV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIGludCBpdDg3X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CiBzdGF0aWMgaW50IGl0ODdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKIApAQCAtMjM5LDYgKzI0MiwxNCBAQAogCS5kZXRhY2hfY2xpZW50CT0gaXQ4N19kZXRhY2hfY2xpZW50LAogfTsKIAorc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGl0ODdfaXNhX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIml0ODctaXNhIiwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBpdDg3X2lzYV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGl0ODdfZGV0YWNoX2NsaWVudCwKK307CisKKwogc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljaGFyICpidWYpCiB7CkBAIC02ODYsMTEgKzY5NywxNiBAQAogewogCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgaXQ4N19kZXRlY3QpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgaXQ4N19kZXRlY3QpOwogfQogCi0vKiBTdXBlcklPIGRldGVjdGlvbiAtIHdpbGwgY2hhbmdlIG5vcm1hbF9pc2FbMF0gaWYgYSBjaGlwIGlzIGZvdW5kICovCi1zdGF0aWMgaW50IGl0ODdfZmluZChpbnQgKmFkZHJlc3MpCitzdGF0aWMgaW50IGl0ODdfaXNhX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gaXQ4N19kZXRlY3QoYWRhcHRlciwgaXNhX2FkZHJlc3MsIC0xKTsKK30KKworLyogU3VwZXJJTyBkZXRlY3Rpb24gLSB3aWxsIGNoYW5nZSBpc2FfYWRkcmVzcyBpZiBhIGNoaXAgaXMgZm91bmQgKi8KK3N0YXRpYyBpbnQgX19pbml0IGl0ODdfZmluZChpbnQgKmFkZHJlc3MpCiB7CiAJaW50IGVyciA9IC1FTk9ERVY7CiAKQEAgLTcyMSw3ICs3MzcsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19kZXRlY3QgKi8KKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19wcm9iZSAqLwogaW50IGl0ODdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQogewogCWludCBpOwpAQCAtNzM4LDcgKzc1NCw3IEBACiAKIAkvKiBSZXNlcnZlIHRoZSBJU0EgcmVnaW9uICovCiAJaWYgKGlzX2lzYSkKLQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhZGRyZXNzLCBJVDg3X0VYVEVOVCwgaXQ4N19kcml2ZXIubmFtZSkpCisJCWlmICghcmVxdWVzdF9yZWdpb24oYWRkcmVzcywgSVQ4N19FWFRFTlQsIGl0ODdfaXNhX2RyaXZlci5uYW1lKSkKIAkJCWdvdG8gRVJST1IwOwogCiAJLyogUHJvYmUgd2hldGhlciB0aGVyZSBpcyBhbnl0aGluZyBhdmFpbGFibGUgb24gdGhpcyBhZGRyZXNzLiBBbHJlYWR5CkBAIC03ODQsNyArODAwLDcgQEAKIAlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CiAJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CiAJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0JbmV3X2NsaWVudC0+ZHJpdmVyID0gJml0ODdfZHJpdmVyOworCW5ld19jbGllbnQtPmRyaXZlciA9IGlzX2lzYSA/ICZpdDg3X2lzYV9kcml2ZXIgOiAmaXQ4N19kcml2ZXI7CiAJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwogCiAJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gKi8KQEAgLTg0MCw2ICs4NTYsMTIgQEAKIAlpdDg3X2luaXRfY2xpZW50KG5ld19jbGllbnQsIGRhdGEpOwogCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKKwkJZ290byBFUlJPUjM7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4wX2lucHV0LmRldl9hdHRyKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luMl9pbnB1dC5kZXZfYXR0cik7CkBAIC04OTcsMTMgKzkxOSwxNSBAQAogCX0KIAogCWlmIChkYXRhLT50eXBlID09IGl0ODcxMikgewotCQlkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7CisJCWRhdGEtPnZybSA9IHZpZF93aGljaF92cm0oKTsKIAkJZGV2aWNlX2NyZWF0ZV9maWxlX3ZybShuZXdfY2xpZW50KTsKIAkJZGV2aWNlX2NyZWF0ZV9maWxlX3ZpZChuZXdfY2xpZW50KTsKIAl9CiAKIAlyZXR1cm4gMDsKIAorRVJST1IzOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOwogRVJST1IyOgogCWtmcmVlKGRhdGEpOwogRVJST1IxOgpAQCAtOTE1LDE3ICs5MzksMTcgQEAKIAogc3RhdGljIGludCBpdDg3X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCQkiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlyZXR1cm4gZXJyOwotCX0KIAogCWlmKGkyY19pc19pc2FfY2xpZW50KGNsaWVudCkpCiAJCXJlbGVhc2VfcmVnaW9uKGNsaWVudC0+YWRkciwgSVQ4N19FWFRFTlQpOwotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlrZnJlZShkYXRhKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTE1OCwxNiArMTE4MiwyOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzbV9pdDg3X2luaXQodm9pZCkKIHsKLQlpbnQgYWRkcjsKKwlpbnQgYWRkciwgcmVzOwogCiAJaWYgKCFpdDg3X2ZpbmQoJmFkZHIpKSB7Ci0JCW5vcm1hbF9pc2FbMF0gPSBhZGRyOworCQlpc2FfYWRkcmVzcyA9IGFkZHI7CiAJfQotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmaXQ4N19kcml2ZXIpOworCisJcmVzID0gaTJjX2FkZF9kcml2ZXIoJml0ODdfZHJpdmVyKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJcmVzID0gaTJjX2lzYV9hZGRfZHJpdmVyKCZpdDg3X2lzYV9kcml2ZXIpOworCWlmIChyZXMpIHsKKwkJaTJjX2RlbF9kcml2ZXIoJml0ODdfZHJpdmVyKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNtX2l0ODdfZXhpdCh2b2lkKQogeworCWkyY19pc2FfZGVsX2RyaXZlcigmaXQ4N19pc2FfZHJpdmVyKTsKIAlpMmNfZGVsX2RyaXZlcigmaXQ4N19kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNjMuYyBiL2RyaXZlcnMvaHdtb24vbG02My5jCmluZGV4IDdjNmY5ZWEuLmJlNWM3MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG02My5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG02My5jCkBAIC00Miw4ICs0Miw5IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAvKgogICogQWRkcmVzc2VzIHRvIHNjYW4KQEAgLTUxLDEzICs1MiwxMiBAQAogICovCiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NGMsIEkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CiAKIC8qCiAgKiBJbnNtb2QgcGFyYW1ldGVycwogICovCiAKLVNFTlNPUlNfSU5TTU9EXzEobG02Myk7CitJMkNfQ0xJRU5UX0lOU01PRF8xKGxtNjMpOwogCiAvKgogICogVGhlIExNNjMgcmVnaXN0ZXJzCkBAIC0xNTIsNiArMTUyLDcgQEAKIAogc3RydWN0IGxtNjNfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwogCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLwpAQCAtMzU4LDcgKzM1OSw3IEBACiB7CiAJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTYzX2RldGVjdCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTYzX2RldGVjdCk7CiB9CiAKIC8qCkBAIC00MzcsNiArNDM4LDEyIEBACiAJbG02M19pbml0X2NsaWVudChuZXdfY2xpZW50KTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gZXhpdF9kZXRhY2g7CisJfQorCiAJaWYgKGRhdGEtPmNvbmZpZyAmIDB4MDQpIHsgLyogdGFjaG9tZXRlciBlbmFibGVkICovCiAJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAogCQkJCSAgICZzZW5zb3JfZGV2X2F0dHJfZmFuMV9pbnB1dC5kZXZfYXR0cik7CkBAIC00NjIsNiArNDY5LDggQEAKIAogCXJldHVybiAwOwogCitleGl0X2RldGFjaDoKKwlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKIGV4aXRfZnJlZToKIAlrZnJlZShkYXRhKTsKIGV4aXQ6CkBAIC01MDUsMTUgKzUxNCwxNSBAQAogCiBzdGF0aWMgaW50IGxtNjNfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBsbTYzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKLQkJCSJjbGllbnQgbm90IGRldGFjaGVkXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+Y2xhc3NfZGV2KTsKIAotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQorCQlyZXR1cm4gZXJyOworCisJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03NS5jIGIvZHJpdmVycy9od21vbi9sbTc1LmMKaW5kZXggNWJlMTY0ZS4uOWEzZWJkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTc1LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTc1LmMKQEAgLTIzLDE3ICsyMywxNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSAibG03NS5oIgogCiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLAogCQkJCQkweDRkLCAweDRlLCAweDRmLCBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OwogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotU0VOU09SU19JTlNNT0RfMShsbTc1KTsKK0kyQ19DTElFTlRfSU5TTU9EXzEobG03NSk7CiAKIC8qIE1hbnkgTE03NSBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93ICovCiAKQEAgLTQ2LDYgKzQ2LDcgQEAKIC8qIEVhY2ggY2xpZW50IGhhcyB0aGlzIGFkZGl0aW9uYWwgZGF0YSAqLwogc3RydWN0IGxtNzVfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQJY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlCXVwZGF0ZV9sb2NrOwogCWNoYXIJCQl2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwogCXVuc2lnbmVkIGxvbmcJCWxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwpAQCAtMTA3LDEwICsxMDgsMTAgQEAKIHsKIAlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCiAJCXJldHVybiAwOwotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtNzVfZGV0ZWN0KTsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtNzVfZGV0ZWN0KTsKIH0KIAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX2RldGVjdCAqLworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX3Byb2JlICovCiBzdGF0aWMgaW50IGxtNzVfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQogewogCWludCBpOwpAQCAtMTE5LDE2ICsxMjAsNiBAQAogCWludCBlcnIgPSAwOwogCWNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKIAotCS8qIE1ha2Ugc3VyZSB3ZSBhcmVuJ3QgcHJvYmluZyB0aGUgSVNBIGJ1cyEhIFRoaXMgaXMganVzdCBhIHNhZmV0eSBjaGVjawotCSAgIGF0IHRoaXMgbW9tZW50OyBpMmNfZGV0ZWN0IHJlYWxseSB3b24ndCBjYWxsIHVzLiAqLwotI2lmZGVmIERFQlVHCi0JaWYgKGkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkgewotCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCi0JCQkibG03NV9kZXRlY3QgY2FsbGVkIGZvciBhbiBJU0EgYnVzIGFkYXB0ZXI/IT9cbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotI2VuZGlmCi0KIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CiAJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQogCQlnb3RvIGV4aXQ7CkBAIC0yMDgsMTIgKzE5OSwyMCBAQAogCWxtNzVfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CiAJCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKKwkJZ290byBleGl0X2RldGFjaDsKKwl9CisKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXhfaHlzdCk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CiAKIAlyZXR1cm4gMDsKIAorZXhpdF9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiBleGl0X2ZyZWU6CiAJa2ZyZWUoZGF0YSk7CiBleGl0OgpAQCAtMjIyLDggKzIyMSwxMCBAQAogCiBzdGF0aWMgaW50IGxtNzVfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBsbTc1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOwogCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7Ci0Ja2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCWtmcmVlKGRhdGEpOwogCXJldHVybiAwOwogfQogCkBAIC0yNTEsOCArMjUyLDEyIEBACiAKIHN0YXRpYyB2b2lkIGxtNzVfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQkvKiBJbml0aWFsaXplIHRoZSBMTTc1IGNoaXAgKi8KLQlsbTc1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE03NV9SRUdfQ09ORiwgMCk7CisJaW50IHJlZzsKKworCS8qIEVuYWJsZSBpZiBpbiBzaHV0ZG93biBtb2RlICovCisJcmVnID0gbG03NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE03NV9SRUdfQ09ORik7CisJaWYgKHJlZyA+PSAwICYmIChyZWcgJiAweDAxKSkKKwkJbG03NV93cml0ZV92YWx1ZShjbGllbnQsIExNNzVfUkVHX0NPTkYsIHJlZyAmIDB4ZmUpOwogfQogCiBzdGF0aWMgc3RydWN0IGxtNzVfZGF0YSAqbG03NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03NS5oIGIvZHJpdmVycy9od21vbi9sbTc1LmgKaW5kZXggNjNlM2YyZi4uYWY3ZGM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTc1LmgKKysrIGIvZHJpdmVycy9od21vbi9sbTc1LmgKQEAgLTI1LDcgKzI1LDcgQEAKICAgICB3aGljaCBjb250YWlucyB0aGlzIGNvZGUsIHdlIGRvbid0IHdvcnJ5IGFib3V0IHRoZSB3YXN0ZWQgc3BhY2UuCiAqLwogCi0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CiAKIC8qIHN0cmFpZ2h0IGZyb20gdGhlIGRhdGFzaGVldCAqLwogI2RlZmluZSBMTTc1X1RFTVBfTUlOICgtNTUwMDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNzcuYyBiL2RyaXZlcnMvaHdtb24vbG03Ny5jCmluZGV4IGI5OGY0NDkuLjg2NmVhYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG03Ny5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG03Ny5jCkBAIC0zMCwxNSArMzAsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KLQorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OwogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotU0VOU09SU19JTlNNT0RfMShsbTc3KTsKK0kyQ19DTElFTlRfSU5TTU9EXzEobG03Nyk7CiAKIC8qIFRoZSBMTTc3IHJlZ2lzdGVycyAqLwogI2RlZmluZSBMTTc3X1JFR19URU1QCQkweDAwCkBAIC01MSw2ICs1MCw3IEBACiAvKiBFYWNoIGNsaWVudCBoYXMgdGhpcyBhZGRpdGlvbmFsIGRhdGEgKi8KIHN0cnVjdCBsbTc3X2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50CWNsaWVudDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IHNlbWFwaG9yZQl1cGRhdGVfbG9jazsKIAljaGFyCQkJdmFsaWQ7CiAJdW5zaWduZWQgbG9uZwkJbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCkBAIC0yMDgsMTAgKzIwOCwxMCBAQAogewogCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgbG03N19kZXRlY3QpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgbG03N19kZXRlY3QpOwogfQogCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfZGV0ZWN0ICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfcHJvYmUgKi8KIHN0YXRpYyBpbnQgbG03N19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CkBAIC0zMTcsNiArMzE3LDEyIEBACiAJbG03N19pbml0X2NsaWVudChuZXdfY2xpZW50KTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gZXhpdF9kZXRhY2g7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21pbik7CkBAIC0zMjcsNiArMzMzLDggQEAKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CiAJcmV0dXJuIDA7CiAKK2V4aXRfZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOwogZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKQEAgLTMzNSw4ICszNDMsMTAgQEAKIAogc3RhdGljIGludCBsbTc3X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKKwlzdHJ1Y3QgbG03N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+Y2xhc3NfZGV2KTsKIAlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlrZnJlZShkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTc4LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzguYwppbmRleCAyOTI0MTQ2Li5mNjczMGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNzguYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNzguYwpAQCAtMjMsNyArMjMsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtaXNhLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KQEAgLTMxLDEwICszNCwxMCBAQAogCQkJCQkweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LAogCQkJCQkweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLAogCQkJCQkweDJmLCBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IDB4MDI5MCwgSTJDX0NMSUVOVF9JU0FfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaXNhX2FkZHJlc3MgPSAweDI5MDsKIAogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLVNFTlNPUlNfSU5TTU9EXzMobG03OCwgbG03OGosIGxtNzkpOworSTJDX0NMSUVOVF9JTlNNT0RfMihsbTc4LCBsbTc5KTsKIAogLyogTWFueSBMTTc4IGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KIApAQCAtMTA0LDEzICsxMDcsNiBAQAogCXJldHVybiB2YWwgKiAxMDAwOwogfQogCi0vKiBWSUQ6IG1WCi0gICBSRUc6IChzZWUgZG9jL3ZpZCkgKi8KLXN0YXRpYyBpbmxpbmUgaW50IFZJRF9GUk9NX1JFRyh1OCB2YWwpCi17Ci0JcmV0dXJuIHZhbD09MHgxZiA/IDAgOiB2YWw+PTB4MTAgPyA1MTAwLXZhbCoxMDAgOiAyMDUwLXZhbCo1MDsKLX0KLQogI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKSAoMSA8PCAodmFsKSkKIAogLyogVGhlcmUgYXJlIHNvbWUgY29tcGxpY2F0aW9ucyBpbiBhIG1vZHVsZSBsaWtlIHRoaXMuIEZpcnN0IG9mZiwgTE03OCBjaGlwcwpAQCAtMTM0LDYgKzEzMCw3IEBACiAgICBhbGxvY2F0ZWQuICovCiBzdHJ1Y3QgbG03OF9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKIAllbnVtIGNoaXBzIHR5cGU7CiAKQEAgLTE1Niw2ICsxNTMsNyBAQAogCiAKIHN0YXRpYyBpbnQgbG03OF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBsbTc4X2lzYV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIGludCBsbTc4X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CiBzdGF0aWMgaW50IGxtNzhfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKIApAQCAtMTc0LDYgKzE3MiwxNCBAQAogCS5kZXRhY2hfY2xpZW50CT0gbG03OF9kZXRhY2hfY2xpZW50LAogfTsKIAorc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtNzhfaXNhX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImxtNzgtaXNhIiwKKwkuYXR0YWNoX2FkYXB0ZXIJPSBsbTc4X2lzYV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IGxtNzhfZGV0YWNoX2NsaWVudCwKK307CisKKwogLyogNyBWb2x0YWdlcyAqLwogc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQogewpAQCAtNDQ1LDcgKzQ1MSw3IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X3ZpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGxtNzhfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBWSURfRlJPTV9SRUcoZGF0YS0+dmlkKSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZpZF9mcm9tX3JlZyg4MiwgZGF0YS0+dmlkKSk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIoY3B1MF92aWQsIFNfSVJVR08sIHNob3dfdmlkLCBOVUxMKTsKIApAQCAtNDY1LDEwICs0NzEsMTUgQEAKIHsKIAlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCiAJCXJldHVybiAwOwotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtNzhfZGV0ZWN0KTsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtNzhfZGV0ZWN0KTsKIH0KIAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX2RldGVjdCAqLworc3RhdGljIGludCBsbTc4X2lzYV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIGxtNzhfZGV0ZWN0KGFkYXB0ZXIsIGlzYV9hZGRyZXNzLCAtMSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19wcm9iZSAqLwogaW50IGxtNzhfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQogewogCWludCBpLCBlcnI7CkBAIC00ODUsNyArNDk2LDggQEAKIAogCS8qIFJlc2VydmUgdGhlIElTQSByZWdpb24gKi8KIAlpZiAoaXNfaXNhKQotCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIExNNzhfRVhURU5ULCBsbTc4X2RyaXZlci5uYW1lKSkgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIExNNzhfRVhURU5ULAorCQkJCSAgICBsbTc4X2lzYV9kcml2ZXIubmFtZSkpIHsKIAkJCWVyciA9IC1FQlVTWTsKIAkJCWdvdG8gRVJST1IwOwogCQl9CkBAIC01NDAsNyArNTUyLDcgQEAKIAlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CiAJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CiAJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0JbmV3X2NsaWVudC0+ZHJpdmVyID0gJmxtNzhfZHJpdmVyOworCW5ld19jbGllbnQtPmRyaXZlciA9IGlzX2lzYSA/ICZsbTc4X2lzYV9kcml2ZXIgOiAmbG03OF9kcml2ZXI7CiAJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwogCiAJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gKi8KQEAgLTU1OSwxMCArNTcxLDkgQEAKIAkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZS4gKi8KIAlpZiAoa2luZCA8PSAwKSB7CiAJCWkgPSBsbTc4X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgTE03OF9SRUdfQ0hJUElEKTsKLQkJaWYgKGkgPT0gMHgwMCB8fCBpID09IDB4MjApCisJCWlmIChpID09IDB4MDAgfHwgaSA9PSAweDIwCS8qIExNNzggKi8KKwkJIHx8IGkgPT0gMHg0MCkJCQkvKiBMTTc4LUogKi8KIAkJCWtpbmQgPSBsbTc4OwotCQllbHNlIGlmIChpID09IDB4NDApCi0JCQlraW5kID0gbG03OGo7CiAJCWVsc2UgaWYgKChpICYgMHhmZSkgPT0gMHhjMCkKIAkJCWtpbmQgPSBsbTc5OwogCQllbHNlIHsKQEAgLTU3OCw4ICs1ODksNiBAQAogCiAJaWYgKGtpbmQgPT0gbG03OCkgewogCQljbGllbnRfbmFtZSA9ICJsbTc4IjsKLQl9IGVsc2UgaWYgKGtpbmQgPT0gbG03OGopIHsKLQkJY2xpZW50X25hbWUgPSAibG03OC1qIjsKIAl9IGVsc2UgaWYgKGtpbmQgPT0gbG03OSkgewogCQljbGllbnRfbmFtZSA9ICJsbTc5IjsKIAl9CkBAIC02MDUsNiArNjE0LDEyIEBACiAJfQogCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKKwkJZ290byBFUlJPUjM7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfaW5wdXQpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21pbik7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWF4KTsKQEAgLTY0Myw2ICs2NTgsOCBAQAogCiAJcmV0dXJuIDA7CiAKK0VSUk9SMzoKKwlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKIEVSUk9SMjoKIAlrZnJlZShkYXRhKTsKIEVSUk9SMToKQEAgLTY1NCwxOCArNjcxLDE4IEBACiAKIHN0YXRpYyBpbnQgbG03OF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkgICAgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKIAkJcmV0dXJuIGVycjsKLQl9CiAKIAlpZihpMmNfaXNfaXNhX2NsaWVudChjbGllbnQpKQogCQlyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIExNNzhfRVhURU5UKTsKIAotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlrZnJlZShkYXRhKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzc3LDE4ICs3OTQsMzEgQEAKIAogc3RhdGljIGludCBfX2luaXQgc21fbG03OF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZsbTc4X2RyaXZlcik7CisJaW50IHJlczsKKworCXJlcyA9IGkyY19hZGRfZHJpdmVyKCZsbTc4X2RyaXZlcik7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCXJlcyA9IGkyY19pc2FfYWRkX2RyaXZlcigmbG03OF9pc2FfZHJpdmVyKTsKKwlpZiAocmVzKSB7CisJCWkyY19kZWxfZHJpdmVyKCZsbTc4X2RyaXZlcik7CisJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzbV9sbTc4X2V4aXQodm9pZCkKIHsKKwlpMmNfaXNhX2RlbF9kcml2ZXIoJmxtNzhfaXNhX2RyaXZlcik7CiAJaTJjX2RlbF9kcml2ZXIoJmxtNzhfZHJpdmVyKTsKIH0KIAogCiAKIE1PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTE03OCwgTE03OC1KIGFuZCBMTTc5IGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTc4L0xNNzkgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIG1vZHVsZV9pbml0KHNtX2xtNzhfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtODAuYyBiL2RyaXZlcnMvaHdtb24vbG04MC5jCmluZGV4IDgxMDA1OTUuLjgzYWY4YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG04MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG04MC5jCkBAIC0yNiwxNSArMjYsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywKIAkJCQkJMHgyZCwgMHgyZSwgMHgyZiwgSTJDX0NMSUVOVF9FTkQgfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKIAogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLVNFTlNPUlNfSU5TTU9EXzEobG04MCk7CitJMkNfQ0xJRU5UX0lOU01PRF8xKGxtODApOwogCiAvKiBNYW55IExNODAgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLwogCkBAIC0xMDcsNiArMTA3LDcgQEAKIAogc3RydWN0IGxtODBfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwogCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwpAQCAtMzg5LDcgKzM5MCw3IEBACiB7CiAJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTgwX2RldGVjdCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTgwX2RldGVjdCk7CiB9CiAKIGludCBsbTgwX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKQEAgLTQ1MSw2ICs0NTIsMTIgQEAKIAlkYXRhLT5mYW5fbWluWzFdID0gbG04MF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODBfUkVHX0ZBTl9NSU4oMikpOwogCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKKwkJZ290byBlcnJvcl9kZXRhY2g7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21pbik7CkBAIC00ODcsNiArNDk0LDggQEAKIAogCXJldHVybiAwOwogCitlcnJvcl9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiBlcnJvcl9mcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKQEAgLTQ5NSwxNSArNTA0LDE1IEBACiAKIHN0YXRpYyBpbnQgbG04MF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IGxtODBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgotCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+Y2xhc3NfZGV2KTsKIAotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQorCQlyZXR1cm4gZXJyOworCisJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG04My5jIGIvZHJpdmVycy9od21vbi9sbTgzLmMKaW5kZXggYTQ5MDA4Yi4uZDc0YjJjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTgzLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTgzLmMKQEAgLTMyLDggKzMyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKIC8qCiAgKiBBZGRyZXNzZXMgdG8gc2NhbgpAQCAtNDUsMTMgKzQ2LDEyIEBACiAJCQkJCTB4MjksIDB4MmEsIDB4MmIsCiAJCQkJCTB4NGMsIDB4NGQsIDB4NGUsCiAJCQkJCUkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CiAKIC8qCiAgKiBJbnNtb2QgcGFyYW1ldGVycwogICovCiAKLVNFTlNPUlNfSU5TTU9EXzEobG04Myk7CitJMkNfQ0xJRU5UX0lOU01PRF8xKGxtODMpOwogCiAvKgogICogVGhlIExNODMgcmVnaXN0ZXJzCkBAIC0xMzgsNiArMTM4LDcgQEAKIAogc3RydWN0IGxtODNfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwogCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLwpAQCAtMjEyLDcgKzIxMyw3IEBACiB7CiAJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTgzX2RldGVjdCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTgzX2RldGVjdCk7CiB9CiAKIC8qCkBAIC0zMTIsNiArMzEzLDEyIEBACiAJICovCiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOworCQlnb3RvIGV4aXRfZGV0YWNoOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAogCQkJICAgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0cik7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCkBAIC0zNDAsNiArMzQ3LDggQEAKIAogCXJldHVybiAwOwogCitleGl0X2RldGFjaDoKKwlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKIGV4aXRfZnJlZToKIAlrZnJlZShkYXRhKTsKIGV4aXQ6CkBAIC0zNDgsMTUgKzM1NywxNSBAQAogCiBzdGF0aWMgaW50IGxtODNfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBsbTgzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKLQkJICAgICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CiAKLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKKwkJcmV0dXJuIGVycjsKKworCWtmcmVlKGRhdGEpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtODUuYyBiL2RyaXZlcnMvaHdtb24vbG04NS5jCmluZGV4IGI0ZDdmZDQuLmFiMjE0ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG04NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG04NS5jCkBAIC0yOCwxNSArMjgsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIDB4MmUsIEkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCi1TRU5TT1JTX0lOU01PRF82KGxtODViLCBsbTg1YywgYWRtMTAyNywgYWR0NzQ2MywgZW1jNmQxMDAsIGVtYzZkMTAyKTsKK0kyQ19DTElFTlRfSU5TTU9EXzYobG04NWIsIGxtODVjLCBhZG0xMDI3LCBhZHQ3NDYzLCBlbWM2ZDEwMCwgZW1jNmQxMDIpOwogCiAvKiBUaGUgTE04NSByZWdpc3RlcnMgKi8KIApAQCAtMjgxLDE1ICsyODEsNiBAQAogI2RlZmluZSBQUFJfVE9fUkVHKHZhbCxmYW4pIChTRU5TT1JTX0xJTUlUKCh2YWwpLTEsMCwzKTw8KGZhbiAqMikpCiAjZGVmaW5lIFBQUl9GUk9NX1JFRyh2YWwsZmFuKSAoKCgodmFsKT4+KGZhbiAqIDIpKSYweDAzKSsxKQogCi0vKiBpMmMtdmlkLmggZGVmaW5lcyB2aWRfZnJvbV9yZWcoKSAqLwotI2RlZmluZSBWSURfRlJPTV9SRUcodmFsLHZybSkgKHZpZF9mcm9tX3JlZygodmFsKSwodnJtKSkpCi0KLS8qIFVubGlrZSBzb21lIG90aGVyIGRyaXZlcnMgd2UgRE8gTk9UIHNldCBpbml0aWFsIGxpbWl0cy4gIFVzZQotICogdGhlIGNvbmZpZyBmaWxlIHRvIHNldCBsaW1pdHMuICBTb21lIHVzZXJzIGhhdmUgcmVwb3J0ZWQKLSAqIG1vdGhlcmJvYXJkcyBzaHV0dGluZyBkb3duIHdoZW4gd2Ugc2V0IGxpbWl0cyBpbiBhIHByZXZpb3VzCi0gKiB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIuCi0gKi8KLQogLyogQ2hpcCBzYW1wbGluZyByYXRlcwogICoKICAqIFNvbWUgc2Vuc29ycyBhcmUgbm90IHVwZGF0ZWQgbW9yZSBmcmVxdWVudGx5IHRoYW4gb25jZSBwZXIgc2Vjb25kCkBAIC0zMzksNiArMzMwLDcgQEAKIAogc3RydWN0IGxtODVfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CiAJZW51bSBjaGlwcyB0eXBlOwogCkBAIC0xMDE5LDcgKzEwMTEsNyBAQAogewogCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgbG04NV9kZXRlY3QpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgbG04NV9kZXRlY3QpOwogfQogCiBpbnQgbG04NV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKQEAgLTEwMzEsMTEgKzEwMjMsNiBAQAogCWludCBlcnIgPSAwOwogCWNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9ICIiOwogCi0JaWYgKGkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkgewotCQkvKiBUaGlzIGNoaXAgaGFzIG5vIElTQSBpbnRlcmZhY2UgKi8KLQkJZ290byBFUlJPUjAgOwotCX07Ci0KIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsCiAJCQkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpIHsKIAkJLyogV2UgbmVlZCB0byBiZSBhYmxlIHRvIGRvIGJ5dGUgSS9PICovCkBAIC0xMTYwLDEyICsxMTQ3LDE4IEBACiAJCWdvdG8gRVJST1IxOwogCiAJLyogU2V0IHRoZSBWUk0gdmVyc2lvbiAqLwotCWRhdGEtPnZybSA9IGkyY193aGljaF92cm0oKTsKKwlkYXRhLT52cm0gPSB2aWRfd2hpY2hfdnJtKCk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBMTTg1IGNoaXAgKi8KIAlsbTg1X2luaXRfY2xpZW50KG5ld19jbGllbnQpOwogCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKKwkJZ290byBFUlJPUjI7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfaW5wdXQpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuM19pbnB1dCk7CkBAIC0xMjM1LDYgKzEyMjgsOCBAQAogCXJldHVybiAwOwogCiAJLyogRXJyb3Igb3V0IGFuZCBjbGVhbnVwIGNvZGUgKi8KKyAgICBFUlJPUjI6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiAgICAgRVJST1IxOgogCWtmcmVlKGRhdGEpOwogICAgIEVSUk9SMDoKQEAgLTEyNDMsOCArMTIzOCwxMCBAQAogCiBpbnQgbG04NV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IGxtODVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CiAJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG04Ny5jIGIvZHJpdmVycy9od21vbi9sbTg3LmMKaW5kZXggMTkyMWVkMS4uZGNhOTk2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTg3LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTg3LmMKQEAgLTU3LDggKzU3LDkgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogLyoKICAqIEFkZHJlc3NlcyB0byBzY2FuCkBAIC02NiwxMyArNjcsMTIgQEAKICAqLwogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCAweDJlLCBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OwogCiAvKgogICogSW5zbW9kIHBhcmFtZXRlcnMKICAqLwogCi1TRU5TT1JTX0lOU01PRF8xKGxtODcpOworSTJDX0NMSUVOVF9JTlNNT0RfMShsbTg3KTsKIAogLyoKICAqIFRoZSBMTTg3IHJlZ2lzdGVycwpAQCAtMTc1LDYgKzE3NSw3IEBACiAKIHN0cnVjdCBsbTg3X2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKIAljaGFyIHZhbGlkOyAvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIEluIGppZmZpZXMgKi8KQEAgLTUzNyw3ICs1MzgsNyBAQAogewogCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgbG04N19kZXRlY3QpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgbG04N19kZXRlY3QpOwogfQogCiAvKgpAQCAtNjA4LDYgKzYwOSwxMiBAQAogCWRhdGEtPmluX3NjYWxlWzddID0gMTg3NTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gZXhpdF9kZXRhY2g7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21pbik7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKQEAgLTY3Myw2ICs2ODAsOCBAQAogCiAJcmV0dXJuIDA7CiAKK2V4aXRfZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOwogZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKQEAgLTY4NSw3ICs2OTQsNyBAQAogCXU4IGNvbmZpZzsKIAogCWRhdGEtPmNoYW5uZWwgPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19DSEFOTkVMX01PREUpOwotCWRhdGEtPnZybSA9IGkyY193aGljaF92cm0oKTsKKwlkYXRhLT52cm0gPSB2aWRfd2hpY2hfdnJtKCk7CiAKIAljb25maWcgPSBsbTg3X3JlYWRfdmFsdWUoY2xpZW50LCBMTTg3X1JFR19DT05GSUcpOwogCWlmICghKGNvbmZpZyAmIDB4MDEpKSB7CkBAIC03MTksMTUgKzcyOCwxNSBAQAogCiBzdGF0aWMgaW50IGxtODdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKLQkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CiAKLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKKwkJcmV0dXJuIGVycjsKKworCWtmcmVlKGRhdGEpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTAuYyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCmluZGV4IGE2N2RjYWQuLjE0ZGUwNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCkBAIC03NSw4ICs3NSw5IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAvKgogICogQWRkcmVzc2VzIHRvIHNjYW4KQEAgLTg5LDEzICs5MCwxMiBAQAogICovCiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NGMsIDB4NGQsIEkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CiAKIC8qCiAgKiBJbnNtb2QgcGFyYW1ldGVycwogICovCiAKLVNFTlNPUlNfSU5TTU9EXzYobG05MCwgYWRtMTAzMiwgbG05OSwgbG04NiwgbWF4NjY1NywgYWR0NzQ2MSk7CitJMkNfQ0xJRU5UX0lOU01PRF82KGxtOTAsIGFkbTEwMzIsIGxtOTksIGxtODYsIG1heDY2NTcsIGFkdDc0NjEpOwogCiAvKgogICogVGhlIExNOTAgcmVnaXN0ZXJzCkBAIC0yMDAsNiArMjAwLDcgQEAKIAogc3RydWN0IGxtOTBfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwogCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLwpAQCAtMzUyLDcgKzM1Myw3IEBACiB7CiAJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTkwX2RldGVjdCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBsbTkwX2RldGVjdCk7CiB9CiAKIC8qCkBAIC01MDAsNiArNTAxLDEyIEBACiAJbG05MF9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gZXhpdF9kZXRhY2g7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCiAJCQkgICAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKQEAgLTUyNCw2ICs1MzEsOCBAQAogCiAJcmV0dXJuIDA7CiAKK2V4aXRfZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOwogZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKQEAgLTU0NywxNSArNTU2LDE1IEBACiAKIHN0YXRpYyBpbnQgbG05MF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgotCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+Y2xhc3NfZGV2KTsKIAotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQorCQlyZXR1cm4gZXJyOworCisJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG05Mi5jIGIvZHJpdmVycy9od21vbi9sbTkyLmMKaW5kZXggMjE1YzhlNC4uNjQ3YjdjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTkyLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTkyLmMKQEAgLTQ0LDE3ICs0NCwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgotCisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogLyogVGhlIExNOTIgYW5kIE1BWDY2MzUgaGF2ZSAyIHR3by1zdGF0ZSBwaW5zIGZvciBhZGRyZXNzIHNlbGVjdGlvbiwKICAgIHJlc3VsdGluZyBpbiA0IHBvc3NpYmxlIGFkZHJlc3Nlcy4gKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsCiAJCQkJICAgICAgIEkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCi1TRU5TT1JTX0lOU01PRF8xKGxtOTIpOworSTJDX0NMSUVOVF9JTlNNT0RfMShsbTkyKTsKIAogLyogVGhlIExNOTIgcmVnaXN0ZXJzICovCiAjZGVmaW5lIExNOTJfUkVHX0NPTkZJRwkJCTB4MDEgLyogOC1iaXQsIFJXICovCkBAIC05Niw2ICs5NSw3IEBACiAvKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKSAqLwogc3RydWN0IGxtOTJfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwogCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLwpAQCAtMzU5LDYgKzM1OSwxMiBAQAogCWxtOTJfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOworCQlnb3RvIGV4aXRfZGV0YWNoOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfY3JpdCk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0X2h5c3QpOwpAQCAtMzcwLDYgKzM3Niw4IEBACiAKIAlyZXR1cm4gMDsKIAorZXhpdF9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiBleGl0X2ZyZWU6CiAJa2ZyZWUoZGF0YSk7CiBleGl0OgpAQCAtMzgwLDIwICszODgsMjAgQEAKIHsKIAlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCiAJCXJldHVybiAwOwotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtOTJfZGV0ZWN0KTsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIGxtOTJfZGV0ZWN0KTsKIH0KIAogc3RhdGljIGludCBsbTkyX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKKwlzdHJ1Y3QgbG05Ml9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCi0JCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOwogCi0Ja2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCisJCXJldHVybiBlcnI7CisKKwlrZnJlZShkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXgxNjE5LmMgYi9kcml2ZXJzL2h3bW9uL21heDE2MTkuYwppbmRleCAzYzE1OWYxLi4xNmJmNzFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDE2MTkuYworKysgYi9kcml2ZXJzL2h3bW9uL21heDE2MTkuYwpAQCAtMzEsMjAgKzMxLDE5IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDE4LCAweDE5LCAweDFhLAogCQkJCQkweDI5LCAweDJhLCAweDJiLAogCQkJCQkweDRjLCAweDRkLCAweDRlLAogCQkJCQlJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OwogCiAvKgogICogSW5zbW9kIHBhcmFtZXRlcnMKICAqLwogCi1TRU5TT1JTX0lOU01PRF8xKG1heDE2MTkpOworSTJDX0NMSUVOVF9JTlNNT0RfMShtYXgxNjE5KTsKIAogLyoKICAqIFRoZSBNQVgxNjE5IHJlZ2lzdGVycwpAQCAtMTA0LDYgKzEwMyw3IEBACiAKIHN0cnVjdCBtYXgxNjE5X2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKIAljaGFyIHZhbGlkOyAvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KQEAgLTE3OSw3ICsxNzksNyBAQAogewogCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgbWF4MTYxOV9kZXRlY3QpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgbWF4MTYxOV9kZXRlY3QpOwogfQogCiAvKgpAQCAtMjc1LDYgKzI3NSwxMiBAQAogCW1heDE2MTlfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOworCQlnb3RvIGV4aXRfZGV0YWNoOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfaW5wdXQpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWluKTsKQEAgLTI4NSw2ICsyOTEsOCBAQAogCiAJcmV0dXJuIDA7CiAKK2V4aXRfZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOwogZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKQEAgLTMwOCwxNSArMzE2LDE1IEBACiAKIHN0YXRpYyBpbnQgbWF4MTYxOV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IG1heDE2MTlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgotCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+Y2xhc3NfZGV2KTsKIAotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQorCQlyZXR1cm4gZXJyOworCisJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKaW5kZXggZmE0MDMyZC4uY2YyYTM1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKKysrIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKQEAgLTM4LDIzICszOCwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtaXNhLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IDAsIEkyQ19DTElFTlRfSVNBX0VORCB9Owotc3RhdGljIHN0cnVjdCBpMmNfZm9yY2VfZGF0YSBmb3JjZXNbXSA9IHt7IE5VTEwgfX07CiBzdGF0aWMgdTggZGV2aWQ7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGV4dHJhX2lzYVszXTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhZGRyZXNzOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGV4dHJhX2lzYVszXTsKIHN0YXRpYyB1OCBjb25mcmVnWzRdOwogCiBlbnVtIGNoaXBzIHsgYW55X2NoaXAsIHBjODczNjAsIHBjODczNjMsIHBjODczNjQsIHBjODczNjUsIHBjODczNjYgfTsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7Ci0JLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKLQkubm9ybWFsX2lzYQkJPSBub3JtYWxfaXNhLAotCS5mb3JjZXMJCQk9IGZvcmNlcywKLX07CiAKIHN0YXRpYyBpbnQgaW5pdCA9IDE7CiBtb2R1bGVfcGFyYW0oaW5pdCwgaW50LCAwKTsKQEAgLTE4Niw2ICsxODIsNyBAQAogCiBzdHJ1Y3QgcGM4NzM2MF9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwogCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KQEAgLTIyNCw4ICsyMjEsNyBAQAogICogRnVuY3Rpb25zIGRlY2xhcmF0aW9uCiAgKi8KIAotc3RhdGljIGludCBwYzg3MzYwX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgaW50IHBjODczNjBfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgcGM4NzM2MF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKIHN0YXRpYyBpbnQgcGM4NzM2MF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwogCiBzdGF0aWMgaW50IHBjODczNjBfcmVhZF92YWx1ZShzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhLCB1OCBsZGksIHU4IGJhbmssCkBAIC0yNDIsOCArMjM4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwYzg3MzYwX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gInBjODczNjAiLAotCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAotCS5hdHRhY2hfYWRhcHRlcgk9IHBjODczNjBfYXR0YWNoX2FkYXB0ZXIsCisJLmF0dGFjaF9hZGFwdGVyCT0gcGM4NzM2MF9kZXRlY3QsCiAJLmRldGFjaF9jbGllbnQJPSBwYzg3MzYwX2RldGFjaF9jbGllbnQsCiB9OwogCkBAIC0yNTEsMTY4ICsyNDYsMTc4IEBACiAgKiBTeXNmcyBzdHVmZgogICovCiAKLXN0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAotCXNpemVfdCBjb3VudCwgaW50IG5yKQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5faW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQogeworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5bYXR0ci0+aW5kZXhdLAorCQkgICAgICAgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fc3RhdHVzW2F0dHItPmluZGV4XSkpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bYXR0ci0+aW5kZXhdLAorCQkgICAgICAgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fc3RhdHVzW2F0dHItPmluZGV4XSkpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwKKwkJICAgICAgIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX3N0YXR1c1thdHRyLT5pbmRleF0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwKKwkJICAgICAgIEZBTl9TVEFUVVNfRlJPTV9SRUcoZGF0YS0+ZmFuX3N0YXR1c1thdHRyLT5pbmRleF0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWxvbmcgZmFuX21pbiA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CiAKIAlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZmFuX21pbiA9IEZBTl9UT19SRUcoZmFuX21pbiwgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fc3RhdHVzW25yXSkpOworCWZhbl9taW4gPSBGQU5fVE9fUkVHKGZhbl9taW4sIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX3N0YXR1c1thdHRyLT5pbmRleF0pKTsKIAogCS8qIElmIGl0IHdvdWxkbid0IGZpdCwgY2hhbmdlIGNsb2NrIGRpdmlzb3IgKi8KIAl3aGlsZSAoZmFuX21pbiA+IDI1NQotCSAgICAmJiAoZGF0YS0+ZmFuX3N0YXR1c1tucl0gJiAweDYwKSAhPSAweDYwKSB7CisJICAgICYmIChkYXRhLT5mYW5fc3RhdHVzW2F0dHItPmluZGV4XSAmIDB4NjApICE9IDB4NjApIHsKIAkJZmFuX21pbiA+Pj0gMTsKLQkJZGF0YS0+ZmFuW25yXSA+Pj0gMTsKLQkJZGF0YS0+ZmFuX3N0YXR1c1tucl0gKz0gMHgyMDsKKwkJZGF0YS0+ZmFuW2F0dHItPmluZGV4XSA+Pj0gMTsKKwkJZGF0YS0+ZmFuX3N0YXR1c1thdHRyLT5pbmRleF0gKz0gMHgyMDsKIAl9Ci0JZGF0YS0+ZmFuX21pbltucl0gPSBmYW5fbWluID4gMjU1ID8gMjU1IDogZmFuX21pbjsKLQlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX0ZBTiwgTk9fQkFOSywgUEM4NzM2MF9SRUdfRkFOX01JTihuciksCi0JCQkgICAgZGF0YS0+ZmFuX21pbltucl0pOworCWRhdGEtPmZhbl9taW5bYXR0ci0+aW5kZXhdID0gZmFuX21pbiA+IDI1NSA/IDI1NSA6IGZhbl9taW47CisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9GQU4sIE5PX0JBTkssIFBDODczNjBfUkVHX0ZBTl9NSU4oYXR0ci0+aW5kZXgpLAorCQkJICAgIGRhdGEtPmZhbl9taW5bYXR0ci0+aW5kZXhdKTsKIAogCS8qIFdyaXRlIG5ldyBkaXZpZGVyLCBwcmVzZXJ2ZSBhbGFybSBiaXRzICovCi0JcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9GQU4sIE5PX0JBTkssIFBDODczNjBfUkVHX0ZBTl9TVEFUVVMobnIpLAotCQkJICAgIGRhdGEtPmZhbl9zdGF0dXNbbnJdICYgMHhGOSk7CisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9GQU4sIE5PX0JBTkssIFBDODczNjBfUkVHX0ZBTl9TVEFUVVMoYXR0ci0+aW5kZXgpLAorCQkJICAgIGRhdGEtPmZhbl9zdGF0dXNbYXR0ci0+aW5kZXhdICYgMHhGOSk7CiAJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCXJldHVybiBjb3VudDsKIH0KIAogI2RlZmluZSBzaG93X2FuZF9zZXRfZmFuKG9mZnNldCkgXAotc3RhdGljIHNzaXplX3Qgc2hvd19mYW4jI29mZnNldCMjX2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0Jc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5bb2Zmc2V0LTFdLCBcCi0JCSAgICAgICBGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9zdGF0dXNbb2Zmc2V0LTFdKSkpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bb2Zmc2V0LTFdLCBcCi0JCSAgICAgICBGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9zdGF0dXNbb2Zmc2V0LTFdKSkpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNvZmZzZXQjI19kaXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgXAotCQkgICAgICAgRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fc3RhdHVzW29mZnNldC0xXSkpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNvZmZzZXQjI19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgXAotCQkgICAgICAgRkFOX1NUQVRVU19GUk9NX1JFRyhkYXRhLT5mYW5fc3RhdHVzW29mZnNldC0xXSkpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNldF9mYW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIFwKLQlzaXplX3QgY291bnQpIFwKLXsgXAotCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldC0xKTsgXAotfSBcCi1zdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgXAotCXNob3dfZmFuIyNvZmZzZXQjI19pbnB1dCwgTlVMTCk7IFwKLXN0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIFwKLQlzaG93X2ZhbiMjb2Zmc2V0IyNfbWluLCBzZXRfZmFuIyNvZmZzZXQjI19taW4pOyBcCi1zdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19kaXYsIFNfSVJVR08sIFwKLQlzaG93X2ZhbiMjb2Zmc2V0IyNfZGl2LCBOVUxMKTsgXAotc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfc3RhdHVzLCBTX0lSVUdPLCBcCi0Jc2hvd19mYW4jI29mZnNldCMjX3N0YXR1cywgTlVMTCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKKwlzaG93X2Zhbl9pbnB1dCwgTlVMTCwgb2Zmc2V0LTEpOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIG9mZnNldC0xKTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTywgXAorCXNob3dfZmFuX2RpdiwgTlVMTCwgb2Zmc2V0LTEpOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfc3RhdHVzLCBTX0lSVUdPLCBcCisJc2hvd19mYW5fc3RhdHVzLCBOVUxMLCBvZmZzZXQtMSk7CiBzaG93X2FuZF9zZXRfZmFuKDEpCiBzaG93X2FuZF9zZXRfZmFuKDIpCiBzaG93X2FuZF9zZXRfZmFuKDMpCiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLAorCQkgICAgICAgUFdNX0ZST01fUkVHKGRhdGEtPnB3bVthdHRyLT5pbmRleF0sCisJCQkJICAgIEZBTl9DT05GSUdfSU5WRVJUKGRhdGEtPmZhbl9jb25mLAorCQkJCQkJICAgICAgYXR0ci0+aW5kZXgpKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5wd21bYXR0ci0+aW5kZXhdID0gUFdNX1RPX1JFRyh2YWwsCisJCQkgICAgICBGQU5fQ09ORklHX0lOVkVSVChkYXRhLT5mYW5fY29uZiwgYXR0ci0+aW5kZXgpKTsKKwlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX0ZBTiwgTk9fQkFOSywgUEM4NzM2MF9SRUdfUFdNKGF0dHItPmluZGV4KSwKKwkJCSAgICBkYXRhLT5wd21bYXR0ci0+aW5kZXhdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKwogI2RlZmluZSBzaG93X2FuZF9zZXRfcHdtKG9mZnNldCkgXAotc3RhdGljIHNzaXplX3Qgc2hvd19wd20jI29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBcCi0JCSAgICAgICBQV01fRlJPTV9SRUcoZGF0YS0+cHdtW29mZnNldC0xXSwgXAotCQkJCSAgICBGQU5fQ09ORklHX0lOVkVSVChkYXRhLT5mYW5fY29uZiwgXAotCQkJCQkJICAgICAgb2Zmc2V0LTEpKSk7IFwKLX0gXAotc3RhdGljIHNzaXplX3Qgc2V0X3B3bSMjb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwgXAotCXNpemVfdCBjb3VudCkgXAoteyBcCi0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAotCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAotCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAotIFwKLQlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKLQlkYXRhLT5wd21bb2Zmc2V0LTFdID0gUFdNX1RPX1JFRyh2YWwsIFwKLQkJCSAgICAgIEZBTl9DT05GSUdfSU5WRVJUKGRhdGEtPmZhbl9jb25mLCBvZmZzZXQtMSkpOyBcCi0JcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9GQU4sIE5PX0JBTkssIFBDODczNjBfUkVHX1BXTShvZmZzZXQtMSksIFwKLQkJCSAgICBkYXRhLT5wd21bb2Zmc2V0LTFdKTsgXAotCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKLQlyZXR1cm4gY291bnQ7IFwKLX0gXAotc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0LCBTX0lXVVNSIHwgU19JUlVHTywgXAotCXNob3dfcHdtIyNvZmZzZXQsIHNldF9wd20jI29mZnNldCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bSMjb2Zmc2V0LCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfcHdtLCBzZXRfcHdtLCBvZmZzZXQtMSk7CiBzaG93X2FuZF9zZXRfcHdtKDEpCiBzaG93X2FuZF9zZXRfcHdtKDIpCiBzaG93X2FuZF9zZXRfcHdtKDMpCiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5faW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluW2F0dHItPmluZGV4XSwKKwkJICAgICAgIGRhdGEtPmluX3ZyZWYpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9taW5bYXR0ci0+aW5kZXhdLAorCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21heFthdHRyLT5pbmRleF0sCisJCSAgICAgICBkYXRhLT5pbl92cmVmKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X2luX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+aW5fc3RhdHVzW2F0dHItPmluZGV4XSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9taW5bYXR0ci0+aW5kZXhdID0gSU5fVE9fUkVHKHZhbCwgZGF0YS0+aW5fdnJlZik7CisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9JTiwgYXR0ci0+aW5kZXgsIFBDODczNjVfUkVHX0lOX01JTiwKKwkJCSAgICBkYXRhLT5pbl9taW5bYXR0ci0+aW5kZXhdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21heFthdHRyLT5pbmRleF0gPSBJTl9UT19SRUcodmFsLAorCQkJICAgICAgIGRhdGEtPmluX3ZyZWYpOworCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfSU4sIGF0dHItPmluZGV4LCBQQzg3MzY1X1JFR19JTl9NQVgsCisJCQkgICAgZGF0YS0+aW5fbWF4W2F0dHItPmluZGV4XSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKICNkZWZpbmUgc2hvd19hbmRfc2V0X2luKG9mZnNldCkgXAotc3RhdGljIHNzaXplX3Qgc2hvd19pbiMjb2Zmc2V0IyNfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bb2Zmc2V0XSwgXAotCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9taW5bb2Zmc2V0XSwgXAotCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9tYXhbb2Zmc2V0XSwgXAotCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5pbl9zdGF0dXNbb2Zmc2V0XSk7IFwKLX0gXAotc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBcCi0Jc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi0JbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCi0gXAotCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotCWRhdGEtPmluX21pbltvZmZzZXRdID0gSU5fVE9fUkVHKHZhbCwgZGF0YS0+aW5fdnJlZik7IFwKLQlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX0lOLCBvZmZzZXQsIFBDODczNjVfUkVHX0lOX01JTiwgXAotCQkJICAgIGRhdGEtPmluX21pbltvZmZzZXRdKTsgXAotCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKLQlyZXR1cm4gY291bnQ7IFwKLX0gXAotc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBcCi0Jc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi0JbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCi0gXAotCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotCWRhdGEtPmluX21heFtvZmZzZXRdID0gSU5fVE9fUkVHKHZhbCwgXAotCQkJICAgICAgIGRhdGEtPmluX3ZyZWYpOyBcCi0JcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9JTiwgb2Zmc2V0LCBQQzg3MzY1X1JFR19JTl9NQVgsIFwKLQkJCSAgICBkYXRhLT5pbl9tYXhbb2Zmc2V0XSk7IFwKLQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi0JcmV0dXJuIGNvdW50OyBcCi19IFwKLXN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKLQlzaG93X2luIyNvZmZzZXQjI19pbnB1dCwgTlVMTCk7IFwKLXN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgXAotCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOyBcCi1zdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JV1VTUiB8IFNfSVJVR08sIFwKLQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsgXAotc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19zdGF0dXMsIFNfSVJVR08sIFwKLQlzaG93X2luIyNvZmZzZXQjI19zdGF0dXMsIE5VTEwpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKKwlzaG93X2luX2lucHV0LCBOVUxMLCBvZmZzZXQpOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd19pbl9taW4sIHNldF9pbl9taW4sIG9mZnNldCk7IFwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwlzaG93X2luX21heCwgc2V0X2luX21heCwgb2Zmc2V0KTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfc3RhdHVzLCBTX0lSVUdPLCBcCisJc2hvd19pbl9zdGF0dXMsIE5VTEwsIG9mZnNldCk7CiBzaG93X2FuZF9zZXRfaW4oMCkKIHNob3dfYW5kX3NldF9pbigxKQogc2hvd19hbmRfc2V0X2luKDIpCkBAIC00MjUsODggKzQzMCw5NyBAQAogc2hvd19hbmRfc2V0X2luKDkpCiBzaG93X2FuZF9zZXRfaW4oMTApCiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGhlcm1faW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluW2F0dHItPmluZGV4XSwKKwkJICAgICAgIGRhdGEtPmluX3ZyZWYpKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGhlcm1fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9taW5bYXR0ci0+aW5kZXhdLAorCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd190aGVybV9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21heFthdHRyLT5pbmRleF0sCisJCSAgICAgICBkYXRhLT5pbl92cmVmKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RoZXJtX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX2NyaXRbYXR0ci0+aW5kZXgtMTFdLAorCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd190aGVybV9zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmluX3N0YXR1c1thdHRyLT5pbmRleF0pOworfQorc3RhdGljIHNzaXplX3Qgc2V0X3RoZXJtX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+aW5fbWluW2F0dHItPmluZGV4XSA9IElOX1RPX1JFRyh2YWwsIGRhdGEtPmluX3ZyZWYpOworCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfSU4sIGF0dHItPmluZGV4LCBQQzg3MzY1X1JFR19URU1QX01JTiwKKwkJCSAgICBkYXRhLT5pbl9taW5bYXR0ci0+aW5kZXhdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90aGVybV9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21heFthdHRyLT5pbmRleF0gPSBJTl9UT19SRUcodmFsLCBkYXRhLT5pbl92cmVmKTsKKwlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX0lOLCBhdHRyLT5pbmRleCwgUEM4NzM2NV9SRUdfVEVNUF9NQVgsCisJCQkgICAgZGF0YS0+aW5fbWF4W2F0dHItPmluZGV4XSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGhlcm1fY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+aW5fY3JpdFthdHRyLT5pbmRleC0xMV0gPSBJTl9UT19SRUcodmFsLCBkYXRhLT5pbl92cmVmKTsKKwlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX0lOLCBhdHRyLT5pbmRleCwgUEM4NzM2NV9SRUdfVEVNUF9DUklULAorCQkJICAgIGRhdGEtPmluX2NyaXRbYXR0ci0+aW5kZXgtMTFdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKwogI2RlZmluZSBzaG93X2FuZF9zZXRfdGhlcm0ob2Zmc2V0KSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0Jc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluW29mZnNldCs3XSwgXAotCQkgICAgICAgZGF0YS0+aW5fdnJlZikpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0Jc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltvZmZzZXQrN10sIFwKLQkJICAgICAgIGRhdGEtPmluX3ZyZWYpKTsgXAotfSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9tYXhbb2Zmc2V0KzddLCBcCi0JCSAgICAgICBkYXRhLT5pbl92cmVmKSk7IFwKLX0gXAotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0Jc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX2NyaXRbb2Zmc2V0LTRdLCBcCi0JCSAgICAgICBkYXRhLT5pbl92cmVmKSk7IFwKLX0gXAotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+aW5fc3RhdHVzW29mZnNldCs3XSk7IFwKLX0gXAotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAjI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIFwKLQlzaXplX3QgY291bnQpIFwKLXsgXAotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKLQlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKLQlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKLSBcCi0JZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi0JZGF0YS0+aW5fbWluW29mZnNldCs3XSA9IElOX1RPX1JFRyh2YWwsIGRhdGEtPmluX3ZyZWYpOyBcCi0JcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9JTiwgb2Zmc2V0KzcsIFBDODczNjVfUkVHX1RFTVBfTUlOLCBcCi0JCQkgICAgZGF0YS0+aW5fbWluW29mZnNldCs3XSk7IFwKLQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi0JcmV0dXJuIGNvdW50OyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBcCi0Jc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi0JbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCi0gXAotCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotCWRhdGEtPmluX21heFtvZmZzZXQrN10gPSBJTl9UT19SRUcodmFsLCBkYXRhLT5pbl92cmVmKTsgXAotCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfSU4sIG9mZnNldCs3LCBQQzg3MzY1X1JFR19URU1QX01BWCwgXAotCQkJICAgIGRhdGEtPmluX21heFtvZmZzZXQrN10pOyBcCi0JdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotCXJldHVybiBjb3VudDsgXAotfSBcCi1zdGF0aWMgc3NpemVfdCBzZXRfdGVtcCMjb2Zmc2V0IyNfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIFwKLQlzaXplX3QgY291bnQpIFwKLXsgXAotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKLQlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKLQlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKLSBcCi0JZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi0JZGF0YS0+aW5fY3JpdFtvZmZzZXQtNF0gPSBJTl9UT19SRUcodmFsLCBkYXRhLT5pbl92cmVmKTsgXAotCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfSU4sIG9mZnNldCs3LCBQQzg3MzY1X1JFR19URU1QX0NSSVQsIFwKLQkJCSAgICBkYXRhLT5pbl9jcml0W29mZnNldC00XSk7IFwKLQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi0JcmV0dXJuIGNvdW50OyBcCi19IFwKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgXAotCXNob3dfdGVtcCMjb2Zmc2V0IyNfaW5wdXQsIE5VTEwpOyBcCi1zdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgXAotCXNob3dfdGVtcCMjb2Zmc2V0IyNfbWluLCBzZXRfdGVtcCMjb2Zmc2V0IyNfbWluKTsgXAotc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heCwgU19JV1VTUiB8IFNfSVJVR08sIFwKLQlzaG93X3RlbXAjI29mZnNldCMjX21heCwgc2V0X3RlbXAjI29mZnNldCMjX21heCk7IFwKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgXAotCXNob3dfdGVtcCMjb2Zmc2V0IyNfY3JpdCwgc2V0X3RlbXAjI29mZnNldCMjX2NyaXQpOyBcCi1zdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfc3RhdHVzLCBTX0lSVUdPLCBcCi0Jc2hvd190ZW1wIyNvZmZzZXQjI19zdGF0dXMsIE5VTEwpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgXAorCXNob3dfdGhlcm1faW5wdXQsIE5VTEwsIDExK29mZnNldC00KTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd190aGVybV9taW4sIHNldF90aGVybV9taW4sIDExK29mZnNldC00KTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd190aGVybV9tYXgsIHNldF90aGVybV9tYXgsIDExK29mZnNldC00KTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfdGhlcm1fY3JpdCwgc2V0X3RoZXJtX2NyaXQsIDExK29mZnNldC00KTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19zdGF0dXMsIFNfSVJVR08sIFwKKwlzaG93X3RoZXJtX3N0YXR1cywgTlVMTCwgMTErb2Zmc2V0LTQpOwogc2hvd19hbmRfc2V0X3RoZXJtKDQpCiBzaG93X2FuZF9zZXRfdGhlcm0oNSkKIHNob3dfYW5kX3NldF90aGVybSg2KQpAQCAtNTM5LDg0ICs1NTMsOTMgQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihhbGFybXNfaW4sIFNfSVJVR08sIHNob3dfaW5fYWxhcm1zLCBOVUxMKTsKIAorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWluW2F0dHItPmluZGV4XSkpOworfQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21heFthdHRyLT5pbmRleF0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfY3JpdFthdHRyLT5pbmRleF0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBfc3RhdHVzW2F0dHItPmluZGV4XSk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWluW2F0dHItPmluZGV4XSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCBhdHRyLT5pbmRleCwgUEM4NzM2NV9SRUdfVEVNUF9NSU4sCisJCQkgICAgZGF0YS0+dGVtcF9taW5bYXR0ci0+aW5kZXhdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9tYXhbYXR0ci0+aW5kZXhdID0gVEVNUF9UT19SRUcodmFsKTsKKwlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX1RFTVAsIGF0dHItPmluZGV4LCBQQzg3MzY1X1JFR19URU1QX01BWCwKKwkJCSAgICBkYXRhLT50ZW1wX21heFthdHRyLT5pbmRleF0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9jcml0W2F0dHItPmluZGV4XSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJcGM4NzM2MF93cml0ZV92YWx1ZShkYXRhLCBMRF9URU1QLCBhdHRyLT5pbmRleCwgUEM4NzM2NV9SRUdfVEVNUF9DUklULAorCQkJICAgIGRhdGEtPnRlbXBfY3JpdFthdHRyLT5pbmRleF0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCiAjZGVmaW5lIHNob3dfYW5kX3NldF90ZW1wKG9mZnNldCkgXAotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19pbnB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBbb2Zmc2V0LTFdKSk7IFwKLX0gXAotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21pbltvZmZzZXQtMV0pKTsgXAotfSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBwYzg3MzYwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWF4W29mZnNldC0xXSkpOyBcCi19XAotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0Jc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IHBjODczNjBfdXBkYXRlX2RldmljZShkZXYpOyBcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9jcml0W29mZnNldC0xXSkpOyBcCi19XAotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wIyNvZmZzZXQjI19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgcGM4NzM2MF9kYXRhICpkYXRhID0gcGM4NzM2MF91cGRhdGVfZGV2aWNlKGRldik7IFwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+dGVtcF9zdGF0dXNbb2Zmc2V0LTFdKTsgXAotfVwKLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBcCi0Jc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi0JbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCi0gXAotCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotCWRhdGEtPnRlbXBfbWluW29mZnNldC0xXSA9IFRFTVBfVE9fUkVHKHZhbCk7IFwKLQlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX1RFTVAsIG9mZnNldC0xLCBQQzg3MzY1X1JFR19URU1QX01JTiwgXAotCQkJICAgIGRhdGEtPnRlbXBfbWluW29mZnNldC0xXSk7IFwKLQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi0JcmV0dXJuIGNvdW50OyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBcCi0Jc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IHBjODczNjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi0JbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCi0gXAotCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotCWRhdGEtPnRlbXBfbWF4W29mZnNldC0xXSA9IFRFTVBfVE9fUkVHKHZhbCk7IFwKLQlwYzg3MzYwX3dyaXRlX3ZhbHVlKGRhdGEsIExEX1RFTVAsIG9mZnNldC0xLCBQQzg3MzY1X1JFR19URU1QX01BWCwgXAotCQkJICAgIGRhdGEtPnRlbXBfbWF4W29mZnNldC0xXSk7IFwKLQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi0JcmV0dXJuIGNvdW50OyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwgXAotCXNpemVfdCBjb3VudCkgXAoteyBcCi0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAotCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAotCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAotIFwKLQlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKLQlkYXRhLT50ZW1wX2NyaXRbb2Zmc2V0LTFdID0gVEVNUF9UT19SRUcodmFsKTsgXAotCXBjODczNjBfd3JpdGVfdmFsdWUoZGF0YSwgTERfVEVNUCwgb2Zmc2V0LTEsIFBDODczNjVfUkVHX1RFTVBfQ1JJVCwgXAotCQkJICAgIGRhdGEtPnRlbXBfY3JpdFtvZmZzZXQtMV0pOyBcCi0JdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotCXJldHVybiBjb3VudDsgXAotfSBcCi1zdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKLQlzaG93X3RlbXAjI29mZnNldCMjX2lucHV0LCBOVUxMKTsgXAotc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIFwKLQlzaG93X3RlbXAjI29mZnNldCMjX21pbiwgc2V0X3RlbXAjI29mZnNldCMjX21pbik7IFwKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBcCi0Jc2hvd190ZW1wIyNvZmZzZXQjI19tYXgsIHNldF90ZW1wIyNvZmZzZXQjI19tYXgpOyBcCi1zdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIFwKLQlzaG93X3RlbXAjI29mZnNldCMjX2NyaXQsIHNldF90ZW1wIyNvZmZzZXQjI19jcml0KTsgXAotc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX3N0YXR1cywgU19JUlVHTywgXAotCXNob3dfdGVtcCMjb2Zmc2V0IyNfc3RhdHVzLCBOVUxMKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKKwlzaG93X3RlbXBfaW5wdXQsIE5VTEwsIG9mZnNldC0xKTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd190ZW1wX21pbiwgc2V0X3RlbXBfbWluLCBvZmZzZXQtMSk7IFwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfdGVtcF9tYXgsIHNldF90ZW1wX21heCwgb2Zmc2V0LTEpOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd190ZW1wX2NyaXQsIHNldF90ZW1wX2NyaXQsIG9mZnNldC0xKTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19zdGF0dXMsIFNfSVJVR08sIFwKKwlzaG93X3RlbXBfc3RhdHVzLCBOVUxMLCBvZmZzZXQtMSk7CiBzaG93X2FuZF9zZXRfdGVtcCgxKQogc2hvd19hbmRfc2V0X3RlbXAoMikKIHNob3dfYW5kX3NldF90ZW1wKDMpCkBAIC02MzIsMTIgKzY1NSw3IEBACiAgKiBEZXZpY2UgZGV0ZWN0aW9uLCByZWdpc3RyYXRpb24gYW5kIHVwZGF0ZQogICovCiAKLXN0YXRpYyBpbnQgcGM4NzM2MF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgcGM4NzM2MF9kZXRlY3QpOwotfQotCi1zdGF0aWMgaW50IHBjODczNjBfZmluZChpbnQgc2lvYWRkciwgdTggKmRldmlkLCBpbnQgKmFkZHJlc3MpCitzdGF0aWMgaW50IF9faW5pdCBwYzg3MzYwX2ZpbmQoaW50IHNpb2FkZHIsIHU4ICpkZXZpZCwgdW5zaWduZWQgc2hvcnQgKmFkZHJlc3NlcykKIHsKIAl1MTYgdmFsOwogCWludCBpOwpAQCAtNjgzLDcgKzcwMSw3IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWFkZHJlc3NbaV0gPSB2YWw7CisJCWFkZHJlc3Nlc1tpXSA9IHZhbDsKIAogCQlpZiAoaT09MCkgeyAvKiBGYW5zICovCiAJCQljb25mcmVnWzBdID0gc3VwZXJpb19pbmIoc2lvYWRkciwgMHhGMCk7CkBAIC03MjcsOSArNzQ1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogV2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIGFkZHJlc3MuCi0gICBSZWFkIGZyb20gZXh0cmFfaXNhIGluc3RlYWQuICovCi1pbnQgcGM4NzM2MF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCitzdGF0aWMgaW50IHBjODczNjBfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKQEAgLTczOCw5ICs3NTQsNiBAQAogCWNvbnN0IGNoYXIgKm5hbWUgPSAicGM4NzM2MCI7CiAJaW50IHVzZV90aGVybWlzdG9ycyA9IDA7CiAKLQlpZiAoIWkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjODczNjBfZGF0YSksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KGRhdGEsIDB4MDAsIHNpemVvZihzdHJ1Y3QgcGM4NzM2MF9kYXRhKSk7CkBAIC04MzgsNTEgKzg1MSw1NyBAQAogCX0KIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gRVJST1IzOworCX0KKwogCWlmIChkYXRhLT5pbm5yKSB7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9pbnB1dCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9pbnB1dCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X2lucHV0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjdfaW5wdXQpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOF9pbnB1dCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW45X2lucHV0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEwX2lucHV0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWluKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWluKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWluKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjVfbWluKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjZfbWluKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjdfbWluKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjhfbWluKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjlfbWluKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjEwX21pbik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW41X21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW42X21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW43X21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW44X21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW45X21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xMF9tYXgpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9zdGF0dXMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9zdGF0dXMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9zdGF0dXMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19zdGF0dXMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9zdGF0dXMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNV9zdGF0dXMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNl9zdGF0dXMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luN19zdGF0dXMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOF9zdGF0dXMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luOV9zdGF0dXMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMTBfc3RhdHVzKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4wX2lucHV0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4zX2lucHV0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW40X2lucHV0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW42X2lucHV0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW43X2lucHV0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW44X2lucHV0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW45X2lucHV0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4xMF9pbnB1dC5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luMF9taW4uZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWluLmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4yX21pbi5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luM19taW4uZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWluLmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW41X21pbi5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luNl9taW4uZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjdfbWluLmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW44X21pbi5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luOV9taW4uZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjEwX21pbi5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luMF9tYXguZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWF4LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4yX21heC5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luM19tYXguZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWF4LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW41X21heC5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luNl9tYXguZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjdfbWF4LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW44X21heC5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luOV9tYXguZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjEwX21heC5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luMF9zdGF0dXMuZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjFfc3RhdHVzLmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4yX3N0YXR1cy5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luM19zdGF0dXMuZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjRfc3RhdHVzLmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW41X3N0YXR1cy5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luNl9zdGF0dXMuZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjdfc3RhdHVzLmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW44X3N0YXR1cy5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luOV9zdGF0dXMuZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjEwX3N0YXR1cy5kZXZfYXR0cik7CiAKIAkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9jcHUwX3ZpZCk7CiAJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdnJtKTsKQEAgLTg5MCw5MCArOTA5LDkyIEBACiAJfQogCiAJaWYgKGRhdGEtPnRlbXBucikgewotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWluKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9taW4pOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9jcml0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9jcml0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9zdGF0dXMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX3N0YXR1cyk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW4uZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9taW4uZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXguZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdC5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX3N0YXR1cy5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX3N0YXR1cy5kZXZfYXR0cik7CiAKIAkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXNfdGVtcCk7CiAJfQogCWlmIChkYXRhLT50ZW1wbnIgPT0gMykgewotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19taW4pOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfY3JpdCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfc3RhdHVzKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19taW4uZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXguZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19jcml0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfc3RhdHVzLmRldl9hdHRyKTsKIAl9CiAJaWYgKGRhdGEtPmlubnIgPT0gMTQpIHsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNF9pbnB1dCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDVfaW5wdXQpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA2X2lucHV0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNF9taW4pOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA1X21pbik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDZfbWluKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNF9tYXgpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA1X21heCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDZfbWF4KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNF9jcml0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNV9jcml0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNl9jcml0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wNF9zdGF0dXMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXA1X3N0YXR1cyk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDZfc3RhdHVzKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfaW5wdXQuZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9pbnB1dC5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXA2X2lucHV0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfbWluLmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfbWluLmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDZfbWluLmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfbWF4LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfbWF4LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDZfbWF4LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfY3JpdC5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXA1X2NyaXQuZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wNl9jcml0LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfc3RhdHVzLmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfc3RhdHVzLmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDZfc3RhdHVzLmRldl9hdHRyKTsKIAl9CiAKIAlpZiAoZGF0YS0+ZmFubnIpIHsKIAkJaWYgKEZBTl9DT05GSUdfTU9OSVRPUihkYXRhLT5mYW5fY29uZiwgMCkpIHsKIAkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAotCQkJCQkgICAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CisJCQkJCSAgICZzZW5zb3JfZGV2X2F0dHJfZmFuMV9pbnB1dC5kZXZfYXR0cik7CiAJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCQkJICAgJmRldl9hdHRyX2ZhbjFfbWluKTsKKwkJCQkJICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4xX21pbi5kZXZfYXR0cik7CiAJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCQkJICAgJmRldl9hdHRyX2ZhbjFfZGl2KTsKKwkJCQkJICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2Rpdi5kZXZfYXR0cik7CiAJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCQkJICAgJmRldl9hdHRyX2ZhbjFfc3RhdHVzKTsKKwkJCQkJICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4xX3N0YXR1cy5kZXZfYXR0cik7CiAJCX0KIAogCQlpZiAoRkFOX0NPTkZJR19NT05JVE9SKGRhdGEtPmZhbl9jb25mLCAxKSkgewogCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCi0JCQkJCSAgICZkZXZfYXR0cl9mYW4yX2lucHV0KTsKKwkJCQkJICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2lucHV0LmRldl9hdHRyKTsKIAkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAotCQkJCQkgICAmZGV2X2F0dHJfZmFuMl9taW4pOworCQkJCQkgICAmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfbWluLmRldl9hdHRyKTsKIAkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAotCQkJCQkgICAmZGV2X2F0dHJfZmFuMl9kaXYpOworCQkJCQkgICAmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfZGl2LmRldl9hdHRyKTsKIAkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAotCQkJCQkgICAmZGV2X2F0dHJfZmFuMl9zdGF0dXMpOworCQkJCQkgICAmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfc3RhdHVzLmRldl9hdHRyKTsKIAkJfQogCiAJCWlmIChGQU5fQ09ORklHX0NPTlRST0woZGF0YS0+ZmFuX2NvbmYsIDApKQotCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9wd20xKTsKKwkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIpOwogCQlpZiAoRkFOX0NPTkZJR19DT05UUk9MKGRhdGEtPmZhbl9jb25mLCAxKSkKLQkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMik7CisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRyKTsKIAl9CiAJaWYgKGRhdGEtPmZhbm5yID09IDMpIHsKIAkJaWYgKEZBTl9DT05GSUdfTU9OSVRPUihkYXRhLT5mYW5fY29uZiwgMikpIHsKIAkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAotCQkJCQkgICAmZGV2X2F0dHJfZmFuM19pbnB1dCk7CisJCQkJCSAgICZzZW5zb3JfZGV2X2F0dHJfZmFuM19pbnB1dC5kZXZfYXR0cik7CiAJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCQkJICAgJmRldl9hdHRyX2ZhbjNfbWluKTsKKwkJCQkJICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4zX21pbi5kZXZfYXR0cik7CiAJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCQkJICAgJmRldl9hdHRyX2ZhbjNfZGl2KTsKKwkJCQkJICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2Rpdi5kZXZfYXR0cik7CiAJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCQkJICAgJmRldl9hdHRyX2ZhbjNfc3RhdHVzKTsKKwkJCQkJICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4zX3N0YXR1cy5kZXZfYXR0cik7CiAJCX0KIAogCQlpZiAoRkFOX0NPTkZJR19DT05UUk9MKGRhdGEtPmZhbl9jb25mLCAyKSkKLQkJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcHdtMyk7CisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9wd20zLmRldl9hdHRyKTsKIAl9CiAKIAlyZXR1cm4gMDsKIAorRVJST1IzOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOwogRVJST1IyOgogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJaWYgKGRhdGEtPmFkZHJlc3NbaV0pIHsKQEAgLTk5MCwxMSArMTAxMSwxMCBAQAogCXN0cnVjdCBwYzg3MzYwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgaTsKIAotCWlmICgoaSA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgIgotCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOworCisJaWYgKChpID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCiAJCXJldHVybiBpOwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJaWYgKGRhdGEtPmFkZHJlc3NbaV0pIHsKQEAgLTEzMjAsMjMgKzEzNDAsMjMgQEAKIAkvKiBBcmJpdHJhcmlseSBwaWNrIG9uZSBvZiB0aGUgYWRkcmVzc2VzICovCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQlpZiAoZXh0cmFfaXNhW2ldICE9IDB4MDAwMCkgewotCQkJbm9ybWFsX2lzYVswXSA9IGV4dHJhX2lzYVtpXTsKKwkJCWFkZHJlc3MgPSBleHRyYV9pc2FbaV07CiAJCQlicmVhazsKIAkJfQogCX0KIAotCWlmIChub3JtYWxfaXNhWzBdID09IDB4MDAwMCkgeworCWlmIChhZGRyZXNzID09IDB4MDAwMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJwYzg3MzYwOiBObyBhY3RpdmUgbG9naWNhbCBkZXZpY2UsICIKIAkJICAgICAgICJtb2R1bGUgbm90IGluc2VydGVkLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmcGM4NzM2MF9kcml2ZXIpOworCXJldHVybiBpMmNfaXNhX2FkZF9kcml2ZXIoJnBjODczNjBfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHBjODczNjBfZXhpdCh2b2lkKQogewotCWkyY19kZWxfZHJpdmVyKCZwYzg3MzYwX2RyaXZlcik7CisJaTJjX2lzYV9kZWxfZHJpdmVyKCZwYzg3MzYwX2RyaXZlcik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zaXM1NTk1LmMgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwppbmRleCA2YmJmYzhmLi44NjEwYmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYworKysgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpAQCAtNTUsNyArNTUsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtaXNhLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNjgsMTQgKzcwLDEwIEBACiBNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2FkZHIsCiAJCSAiSW5pdGlhbGl6ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBzZW5zb3JzIik7CiAKLS8qIEFkZHJlc3NlcyB0byBzY2FuLgorLyogRGV2aWNlIGFkZHJlc3MKICAgIE5vdGUgdGhhdCB3ZSBjYW4ndCBkZXRlcm1pbmUgdGhlIElTQSBhZGRyZXNzIHVudGlsIHdlIGhhdmUgaW5pdGlhbGl6ZWQKICAgIG91ciBtb2R1bGUgKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgMHgwMDAwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKLQotLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLVNFTlNPUlNfSU5TTU9EXzEoc2lzNTU5NSk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWRkcmVzczsKIAogLyogTWFueSBTSVM1NTk1IGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KIApAQCAtMTY4LDYgKzE2Niw3IEBACiAgICBhbGxvY2F0ZWQuICovCiBzdHJ1Y3Qgc2lzNTU5NV9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKIAogCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CkBAIC0xOTAsOCArMTg5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpzX2JyaWRnZTsJLyogcG9pbnRlciB0byB0aGUgKG9ubHkpIHNpczU1OTUgKi8KIAotc3RhdGljIGludCBzaXM1NTk1X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgaW50IHNpczU1OTVfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgc2lzNTU5NV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKIHN0YXRpYyBpbnQgc2lzNTU5NV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwogCiBzdGF0aWMgaW50IHNpczU1OTVfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWdpc3Rlcik7CkBAIC0yMDIsOSArMjAwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzaXM1NTk1X2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gInNpczU1OTUiLAotCS5pZAkJPSBJMkNfRFJJVkVSSURfU0lTNTU5NSwKLQkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKLQkuYXR0YWNoX2FkYXB0ZXIJPSBzaXM1NTk1X2F0dGFjaF9hZGFwdGVyLAorCS5hdHRhY2hfYWRhcHRlcgk9IHNpczU1OTVfZGV0ZWN0LAogCS5kZXRhY2hfY2xpZW50CT0gc2lzNTU5NV9kZXRhY2hfY2xpZW50LAogfTsKIApAQCAtNDc2LDE0ICs0NzIsNyBAQAogc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOwogIAogLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCAqLwotc3RhdGljIGludCBzaXM1NTk1X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCi0JCXJldHVybiAwOwotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHNpczU1OTVfZGV0ZWN0KTsKLX0KLQotaW50IHNpczU1OTVfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQorc3RhdGljIGludCBzaXM1NTk1X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaW50IGVyciA9IDA7CiAJaW50IGk7CkBAIC00OTIsMTAgKzQ4MSw2IEBACiAJY2hhciB2YWw7CiAJdTE2IGE7CiAKLQkvKiBNYWtlIHN1cmUgd2UgYXJlIHByb2JpbmcgdGhlIElTQSBidXMhISAgKi8KLQlpZiAoIWkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkKLQkJZ290byBleGl0OwotCiAJaWYgKGZvcmNlX2FkZHIpCiAJCWFkZHJlc3MgPSBmb3JjZV9hZGRyICYgfihTSVM1NTk1X0VYVEVOVCAtIDEpOwogCS8qIFJlc2VydmUgdGhlIElTQSByZWdpb24gKi8KQEAgLTU3OCw2ICs1NjMsMTIgQEAKIAl9CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOworCQlnb3RvIGV4aXRfZGV0YWNoOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9taW4pOwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7CkBAIC02MDgsNyArNTk5LDkgQEAKIAkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXhfaHlzdCk7CiAJfQogCXJldHVybiAwOwotCQorCitleGl0X2RldGFjaDoKKwlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKIGV4aXRfZnJlZToKIAlrZnJlZShkYXRhKTsKIGV4aXRfcmVsZWFzZToKQEAgLTYxOSwxOCArNjEyLDE3IEBACiAKIHN0YXRpYyBpbnQgc2lzNTU5NV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkgICAgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKIAkJcmV0dXJuIGVycjsKLQl9CiAKLQlpZiAoaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50KSkKLQkJcmVsZWFzZV9yZWdpb24oY2xpZW50LT5hZGRyLCBTSVM1NTk1X0VYVEVOVCk7CisJcmVsZWFzZV9yZWdpb24oY2xpZW50LT5hZGRyLCBTSVM1NTk1X0VYVEVOVCk7CiAKLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJa2ZyZWUoZGF0YSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc0NSw3ICs3MzcsNiBAQAogewogCXUxNiB2YWw7CiAJaW50ICppOwotCWludCBhZGRyID0gMDsKIAogCWZvciAoaSA9IGJsYWNrbGlzdDsgKmkgIT0gMDsgaSsrKSB7CiAJCXN0cnVjdCBwY2lfZGV2ICpkZXY7CkBAIC03NjEsMjIgKzc1MiwxOSBAQAogCSAgICBwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFNJUzU1OTVfQkFTRV9SRUcsICZ2YWwpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAkKLQlhZGRyID0gdmFsICYgfihTSVM1NTk1X0VYVEVOVCAtIDEpOwotCWlmIChhZGRyID09IDAgJiYgZm9yY2VfYWRkciA9PSAwKSB7CisJYWRkcmVzcyA9IHZhbCAmIH4oU0lTNTU5NV9FWFRFTlQgLSAxKTsKKwlpZiAoYWRkcmVzcyA9PSAwICYmIGZvcmNlX2FkZHIgPT0gMCkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgIkJhc2UgYWRkcmVzcyBub3Qgc2V0IC0gdXBncmFkZSBCSU9TIG9yIHVzZSBmb3JjZV9hZGRyPTB4YWRkclxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlpZiAoZm9yY2VfYWRkcikKLQkJYWRkciA9IGZvcmNlX2FkZHI7CS8qIHNvIGRldGVjdCB3aWxsIGdldCBjYWxsZWQgKi8KIAotCWlmICghYWRkcikgeworCWlmICghYWRkcmVzcykgewogCQlkZXZfZXJyKCZkZXYtPmRldiwiTm8gU2lTIDU1OTUgc2Vuc29ycyBmb3VuZC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0Jbm9ybWFsX2lzYVswXSA9IGFkZHI7CiAKIAlzX2JyaWRnZSA9IHBjaV9kZXZfZ2V0KGRldik7Ci0JaWYgKGkyY19hZGRfZHJpdmVyKCZzaXM1NTk1X2RyaXZlcikpIHsKKwlpZiAoaTJjX2lzYV9hZGRfZHJpdmVyKCZzaXM1NTk1X2RyaXZlcikpIHsKIAkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwogCQlzX2JyaWRnZSA9IE5VTEw7CiAJfQpAQCAtODAzLDcgKzc5MSw3IEBACiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzaXM1NTk1X3BjaV9kcml2ZXIpOwogCWlmIChzX2JyaWRnZSAhPSBOVUxMKSB7Ci0JCWkyY19kZWxfZHJpdmVyKCZzaXM1NTk1X2RyaXZlcik7CisJCWkyY19pc2FfZGVsX2RyaXZlcigmc2lzNTU5NV9kcml2ZXIpOwogCQlwY2lfZGV2X3B1dChzX2JyaWRnZSk7CiAJCXNfYnJpZGdlID0gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3YjM5Ny5jCmluZGV4IGZkZWViM2EuLjdmZTcxNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vc21zYzQ3YjM5Ny5jCisrKyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3YjM5Ny5jCkBAIC0zMSwyMyArMzEsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1pc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKIC8qIEFkZHJlc3MgaXMgYXV0b2RldGVjdGVkLCB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgMHgwMDAwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2ZvcmNlX2RhdGEgZm9yY2VzW10gPSB7e05VTEx9fTsKLQotZW51bSBjaGlwcyB7IGFueV9jaGlwLCBzbXNjNDdiMzk3IH07Ci1zdGF0aWMgc3RydWN0IGkyY19hZGRyZXNzX2RhdGEgYWRkcl9kYXRhID0gewotCS5ub3JtYWxfaTJjCQk9IG5vcm1hbF9pMmMsCi0JLm5vcm1hbF9pc2EJCT0gbm9ybWFsX2lzYSwKLQkucHJvYmUJCQk9IG5vcm1hbF9pMmMsCQkvKiBjaGVhdCAqLwotCS5pZ25vcmUJCQk9IG5vcm1hbF9pMmMsCQkvKiBjaGVhdCAqLwotCS5mb3JjZXMJCQk9IGZvcmNlcywKLX07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWRkcmVzczsKIAogLyogU3VwZXItSS8wIHJlZ2lzdGVycyBhbmQgY29tbWFuZHMgKi8KIApAQCAtMTAwLDYgKzkxLDcgQEAKIAogc3RydWN0IHNtc2M0N2IzOTdfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CiAKIAlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwpAQCAtMjE1LDUyICsyMDcsNDAgQEAKICNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihjbGllbnQsIG51bSkgXAogCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI251bSMjX2lucHV0KQogCi1zdGF0aWMgaW50IHNtc2M0N2IzOTdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIsIGludCBraW5kKTsKLQotc3RhdGljIGludCBzbXNjNDdiMzk3X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCi0JCXJldHVybiAwOwotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHNtc2M0N2IzOTdfZGV0ZWN0KTsKLX0KLQogc3RhdGljIGludCBzbXNjNDdiMzk3X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKKwlzdHJ1Y3Qgc21zYzQ3YjM5N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCi0JCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlyZXR1cm4gZXJyOwotCX0KIAogCXJlbGVhc2VfcmVnaW9uKGNsaWVudC0+YWRkciwgU01TQ19FWFRFTlQpOwotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlrZnJlZShkYXRhKTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNtc2M0N2IzOTdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzbXNjNDdiMzk3X2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gInNtc2M0N2IzOTciLAotCS5pZAkJPSBJMkNfRFJJVkVSSURfU01TQzQ3QjM5NywKLQkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKLQkuYXR0YWNoX2FkYXB0ZXIJPSBzbXNjNDdiMzk3X2F0dGFjaF9hZGFwdGVyLAorCS5hdHRhY2hfYWRhcHRlcgk9IHNtc2M0N2IzOTdfZGV0ZWN0LAogCS5kZXRhY2hfY2xpZW50CT0gc21zYzQ3YjM5N19kZXRhY2hfY2xpZW50LAogfTsKIAotc3RhdGljIGludCBzbXNjNDdiMzk3X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgc21zYzQ3YjM5N19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OwogCXN0cnVjdCBzbXNjNDdiMzk3X2RhdGEgKmRhdGE7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAoIWkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHIsIFNNU0NfRVhURU5ULCBzbXNjNDdiMzk3X2RyaXZlci5uYW1lKSkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICJSZWdpb24gMHgleCBhbHJlYWR5IGluIHVzZSFcbiIsIGFkZHIpOworCWlmICghcmVxdWVzdF9yZWdpb24oYWRkcmVzcywgU01TQ19FWFRFTlQsIHNtc2M0N2IzOTdfZHJpdmVyLm5hbWUpKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIlJlZ2lvbiAweCV4IGFscmVhZHkgaW4gdXNlIVxuIiwKKwkJCWFkZHJlc3MpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMjcyLDcgKzI1Miw3IEBACiAKIAluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKIAlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7Ci0JbmV3X2NsaWVudC0+YWRkciA9IGFkZHI7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CiAJaW5pdF9NVVRFWCgmZGF0YS0+bG9jayk7CiAJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CiAJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnNtc2M0N2IzOTdfZHJpdmVyOwpAQCAtMjg1LDYgKzI2NSwxMiBAQAogCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQogCQlnb3RvIGVycm9yX2ZyZWU7CiAKKwlkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKKwkJZ290byBlcnJvcl9kZXRhY2g7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMSk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMik7CiAJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAobmV3X2NsaWVudCwgMyk7CkBAIC0yOTcsMTQgKzI4MywxNiBAQAogCiAJcmV0dXJuIDA7CiAKK2Vycm9yX2RldGFjaDoKKwlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKIGVycm9yX2ZyZWU6CiAJa2ZyZWUoZGF0YSk7CiBlcnJvcl9yZWxlYXNlOgotCXJlbGVhc2VfcmVnaW9uKGFkZHIsIFNNU0NfRVhURU5UKTsKKwlyZWxlYXNlX3JlZ2lvbihhZGRyZXNzLCBTTVNDX0VYVEVOVCk7CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc21zYzQ3YjM5N19maW5kKHVuc2lnbmVkIGludCAqYWRkcikKK3N0YXRpYyBpbnQgX19pbml0IHNtc2M0N2IzOTdfZmluZCh1bnNpZ25lZCBzaG9ydCAqYWRkcikKIHsKIAl1OCBpZCwgcmV2OwogCkBAIC0zMzMsMTUgKzMyMSwxNSBAQAogewogCWludCByZXQ7CiAKLQlpZiAoKHJldCA9IHNtc2M0N2IzOTdfZmluZChub3JtYWxfaXNhKSkpCisJaWYgKChyZXQgPSBzbXNjNDdiMzk3X2ZpbmQoJmFkZHJlc3MpKSkKIAkJcmV0dXJuIHJldDsKIAotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmc21zYzQ3YjM5N19kcml2ZXIpOworCXJldHVybiBpMmNfaXNhX2FkZF9kcml2ZXIoJnNtc2M0N2IzOTdfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNtc2M0N2IzOTdfZXhpdCh2b2lkKQogewotCWkyY19kZWxfZHJpdmVyKCZzbXNjNDdiMzk3X2RyaXZlcik7CisJaTJjX2lzYV9kZWxfZHJpdmVyKCZzbXNjNDdiMzk3X2RyaXZlcik7CiB9CiAKIE1PRFVMRV9BVVRIT1IoIk1hcmsgTS4gSG9mZm1hbiA8bWhvZmZtYW5AbGlnaHRsaW5rLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwppbmRleCA3MTY2YWQwLi43ZTY5OWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKKysrIGIvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCkBAIC0zMCwyMSArMzAsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1pc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKIC8qIEFkZHJlc3MgaXMgYXV0b2RldGVjdGVkLCB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgMHgwMDAwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2ZvcmNlX2RhdGEgZm9yY2VzW10gPSB7e05VTEx9fTsKLQotZW51bSBjaGlwcyB7IGFueV9jaGlwLCBzbXNjNDdtMSB9Owotc3RhdGljIHN0cnVjdCBpMmNfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsKLQkubm9ybWFsX2kyYwkJPSBub3JtYWxfaTJjLAotCS5ub3JtYWxfaXNhCQk9IG5vcm1hbF9pc2EsCi0JLmZvcmNlcwkJCT0gZm9yY2VzLAotfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhZGRyZXNzOwogCiAvKiBTdXBlci1JLzAgcmVnaXN0ZXJzIGFuZCBjb21tYW5kcyAqLwogCkBAIC0xMDgsNiArMTAxLDcgQEAKIAogc3RydWN0IHNtc2M0N20xX2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IHNlbWFwaG9yZSBsb2NrOwogCiAJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKQEAgLTEyMSw5ICsxMTUsNyBAQAogfTsKIAogCi1zdGF0aWMgaW50IHNtc2M0N20xX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgaW50IHNtc2M0N20xX2ZpbmQoaW50ICphZGRyZXNzKTsKLXN0YXRpYyBpbnQgc21zYzQ3bTFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgc21zYzQ3bTFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CiBzdGF0aWMgaW50IHNtc2M0N20xX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CiAKIHN0YXRpYyBpbnQgc21zYzQ3bTFfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpOwpAQCAtMTM2LDkgKzEyOCw3IEBACiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc21zYzQ3bTFfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJPSAic21zYzQ3bTEiLAotCS5pZAkJPSBJMkNfRFJJVkVSSURfU01TQzQ3TTEsCi0JLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCi0JLmF0dGFjaF9hZGFwdGVyCT0gc21zYzQ3bTFfYXR0YWNoX2FkYXB0ZXIsCisJLmF0dGFjaF9hZGFwdGVyCT0gc21zYzQ3bTFfZGV0ZWN0LAogCS5kZXRhY2hfY2xpZW50CT0gc21zYzQ3bTFfZGV0YWNoX2NsaWVudCwKIH07CiAKQEAgLTM1NCwxNCArMzQ0LDcgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgZ2V0X2FsYXJtcywgTlVMTCk7CiAKLXN0YXRpYyBpbnQgc21zYzQ3bTFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQotewotCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgc21zYzQ3bTFfZGV0ZWN0KTsKLX0KLQotc3RhdGljIGludCBzbXNjNDdtMV9maW5kKGludCAqYWRkcmVzcykKK3N0YXRpYyBpbnQgX19pbml0IHNtc2M0N20xX2ZpbmQodW5zaWduZWQgc2hvcnQgKmFkZHIpCiB7CiAJdTggdmFsOwogCkBAIC0zODgsMTAgKzM3MSwxMCBAQAogCX0KIAogCXN1cGVyaW9fc2VsZWN0KCk7Ci0JKmFkZHJlc3MgPSAoc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfQkFTRSkgPDwgOCkKLQkJIHwgIHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0JBU0UgKyAxKTsKKwkqYWRkciA9IChzdXBlcmlvX2luYihTVVBFUklPX1JFR19CQVNFKSA8PCA4KQorCSAgICAgIHwgIHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0JBU0UgKyAxKTsKIAl2YWwgPSBzdXBlcmlvX2luYihTVVBFUklPX1JFR19BQ1QpOwotCWlmICgqYWRkcmVzcyA9PSAwIHx8ICh2YWwgJiAweDAxKSA9PSAwKSB7CisJaWYgKCphZGRyID09IDAgfHwgKHZhbCAmIDB4MDEpID09IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAic21zYzQ3bTE6IERldmljZSBpcyBkaXNhYmxlZCwgd2lsbCBub3QgdXNlXG4iKTsKIAkJc3VwZXJpb19leGl0KCk7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtNDAxLDE3ICszODQsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzbXNjNDdtMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCitzdGF0aWMgaW50IHNtc2M0N20xX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CiAJc3RydWN0IHNtc2M0N20xX2RhdGEgKmRhdGE7CiAJaW50IGVyciA9IDA7CiAJaW50IGZhbjEsIGZhbjIsIHB3bTEsIHB3bTI7CiAKLQlpZiAoIWkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIFNNU0NfRVhURU5ULCBzbXNjNDdtMV9kcml2ZXIubmFtZSkpIHsKIAkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiUmVnaW9uIDB4JXggYWxyZWFkeSBpbiB1c2UhXG4iLCBhZGRyZXNzKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTQ2MSw2ICs0NDAsMTMgQEAKIAkgICBmdW5jdGlvbi4gKi8KIAlzbXNjNDdtMV91cGRhdGVfZGV2aWNlKCZuZXdfY2xpZW50LT5kZXYsIDEpOwogCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKKwkJZ290byBlcnJvcl9kZXRhY2g7CisJfQorCiAJaWYgKGZhbjEpIHsKIAkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKIAkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CkBAIC00OTQsNiArNDgwLDggQEAKIAogCXJldHVybiAwOwogCitlcnJvcl9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiBlcnJvcl9mcmVlOgogCWtmcmVlKGRhdGEpOwogZXJyb3JfcmVsZWFzZToKQEAgLTUwMywxNiArNDkxLDE2IEBACiAKIHN0YXRpYyBpbnQgc21zYzQ3bTFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBzbXNjNDdtMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCi0JCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlyZXR1cm4gZXJyOwotCX0KIAogCXJlbGVhc2VfcmVnaW9uKGNsaWVudC0+YWRkciwgU01TQ19FWFRFTlQpOwotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlrZnJlZShkYXRhKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTczLDE2ICs1NjEsMTYgQEAKIAogc3RhdGljIGludCBfX2luaXQgc21fc21zYzQ3bTFfaW5pdCh2b2lkKQogewotCWlmIChzbXNjNDdtMV9maW5kKG5vcm1hbF9pc2EpKSB7CisJaWYgKHNtc2M0N20xX2ZpbmQoJmFkZHJlc3MpKSB7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmc21zYzQ3bTFfZHJpdmVyKTsKKwlyZXR1cm4gaTJjX2lzYV9hZGRfZHJpdmVyKCZzbXNjNDdtMV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc21fc21zYzQ3bTFfZXhpdCh2b2lkKQogewotCWkyY19kZWxfZHJpdmVyKCZzbXNjNDdtMV9kcml2ZXIpOworCWkyY19pc2FfZGVsX2RyaXZlcigmc21zYzQ3bTFfZHJpdmVyKTsKIH0KIAogTU9EVUxFX0FVVEhPUigiTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi92aWE2ODZhLmMgYi9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwppbmRleCAxNjRkNDc5Li5lYjg0OTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYworKysgYi9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwpAQCAtMzUsNyArMzUsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWlzYS5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCkBAIC00NywxNCArNDksMTAgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfYWRkciwKIAkJICJJbml0aWFsaXplIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHNlbnNvcnMiKTsKIAotLyogQWRkcmVzc2VzIHRvIHNjYW4uCisvKiBEZXZpY2UgYWRkcmVzcwogICAgTm90ZSB0aGF0IHdlIGNhbid0IGRldGVybWluZSB0aGUgSVNBIGFkZHJlc3MgdW50aWwgd2UgaGF2ZSBpbml0aWFsaXplZAogICAgb3VyIG1vZHVsZSAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyAweDAwMDAsIEkyQ19DTElFTlRfSVNBX0VORCB9OwotCi0vKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotU0VOU09SU19JTlNNT0RfMSh2aWE2ODZhKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhZGRyZXNzOwogCiAvKgogICAgVGhlIFZpYSA2ODZhIHNvdXRoYnJpZGdlIGhhcyBhIExNNzgtbGlrZSBjaGlwIGludGVncmF0ZWQgb24gdGhlIHNhbWUgSUMuCkBAIC0yOTcsNiArMjk1LDcgQEAKICAgIHZpYTY4NmEgY2xpZW50IGlzIGFsbG9jYXRlZC4gKi8KIHN0cnVjdCB2aWE2ODZhX2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKIAljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KQEAgLTMxNSw4ICszMTQsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXYgKnNfYnJpZGdlOwkvKiBwb2ludGVyIHRvIHRoZSAob25seSkgdmlhNjg2YSAqLwogCi1zdGF0aWMgaW50IHZpYTY4NmFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyBpbnQgdmlhNjg2YV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIGludCB2aWE2ODZhX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IHZpYTY4NmFfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCkBAIC01NzYsMjIgKzU3NCwxMyBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHZpYTY4NmFfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJPSAidmlhNjg2YSIsCi0JLmlkCQk9IEkyQ19EUklWRVJJRF9WSUE2ODZBLAotCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAotCS5hdHRhY2hfYWRhcHRlcgk9IHZpYTY4NmFfYXR0YWNoX2FkYXB0ZXIsCisJLmF0dGFjaF9hZGFwdGVyCT0gdmlhNjg2YV9kZXRlY3QsCiAJLmRldGFjaF9jbGllbnQJPSB2aWE2ODZhX2RldGFjaF9jbGllbnQsCiB9OwogCiAKIC8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgKi8KLXN0YXRpYyBpbnQgdmlhNjg2YV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCB2aWE2ODZhX2RldGVjdCk7Ci19Ci0KLXN0YXRpYyBpbnQgdmlhNjg2YV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCitzdGF0aWMgaW50IHZpYTY4NmFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKIAlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhOwpAQCAtNTk5LDEzICs1ODgsNiBAQAogCWNvbnN0IGNoYXIgY2xpZW50X25hbWVbXSA9ICJ2aWE2ODZhIjsKIAl1MTYgdmFsOwogCi0JLyogTWFrZSBzdXJlIHdlIGFyZSBwcm9iaW5nIHRoZSBJU0EgYnVzISEgICovCi0JaWYgKCFpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LAotCQkidmlhNjg2YV9kZXRlY3QgY2FsbGVkIGZvciBhbiBJMkMgYnVzIGFkYXB0ZXI/IT9cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAkvKiA4MjMxIHJlcXVpcmVzIG11bHRpcGxlIG9mIDI1Niwgd2UgZW5mb3JjZSB0aGF0IG9uIDY4NiBhcyB3ZWxsICovCiAJaWYgKGZvcmNlX2FkZHIpCiAJCWFkZHJlc3MgPSBmb3JjZV9hZGRyICYgMHhGRjAwOwpAQCAtNjM3LDcgKzYxOSw3IEBACiAKIAlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpYTY4NmFfZGF0YSksIEdGUF9LRVJORUwpKSkgewogCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIEVSUk9SMDsKKwkJZ290byBleGl0X3JlbGVhc2U7CiAJfQogCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHZpYTY4NmFfZGF0YSkpOwogCkBAIC02NTUsMTIgKzYzNywxOCBAQAogCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCiAJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCi0JCWdvdG8gRVJST1IzOworCQlnb3RvIGV4aXRfZnJlZTsKIAogCS8qIEluaXRpYWxpemUgdGhlIFZJQTY4NkEgY2hpcCAqLwogCXZpYTY4NmFfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOworCQlnb3RvIGV4aXRfZGV0YWNoOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOwpAQCAtNjk1LDI1ICs2ODMsMjcgQEAKIAogCXJldHVybiAwOwogCi1FUlJPUjM6CitleGl0X2RldGFjaDoKKwlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKK2V4aXRfZnJlZToKIAlrZnJlZShkYXRhKTsKLUVSUk9SMDoKK2V4aXRfcmVsZWFzZToKIAlyZWxlYXNlX3JlZ2lvbihhZGRyZXNzLCBWSUE2ODZBX0VYVEVOVCk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCSJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+Y2xhc3NfZGV2KTsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCiAJCXJldHVybiBlcnI7Ci0JfQogCiAJcmVsZWFzZV9yZWdpb24oY2xpZW50LT5hZGRyLCBWSUE2ODZBX0VYVEVOVCk7Ci0Ja2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCWtmcmVlKGRhdGEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04MTAsMjkgKzgwMCwyNSBAQAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJdTE2IHZhbDsKLQlpbnQgYWRkciA9IDA7CiAKIAlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CiAJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgVklBNjg2QV9CQVNFX1JFRywgJnZhbCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JYWRkciA9IHZhbCAmIH4oVklBNjg2QV9FWFRFTlQgLSAxKTsKLQlpZiAoYWRkciA9PSAwICYmIGZvcmNlX2FkZHIgPT0gMCkgeworCWFkZHJlc3MgPSB2YWwgJiB+KFZJQTY4NkFfRVhURU5UIC0gMSk7CisJaWYgKGFkZHJlc3MgPT0gMCAmJiBmb3JjZV9hZGRyID09IDApIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJiYXNlIGFkZHJlc3Mgbm90IHNldCAtIHVwZ3JhZGUgQklPUyAiCiAJCQkib3IgdXNlIGZvcmNlX2FkZHI9MHhhZGRyXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWlmIChmb3JjZV9hZGRyKQotCQlhZGRyID0gZm9yY2VfYWRkcjsJLyogc28gZGV0ZWN0IHdpbGwgZ2V0IGNhbGxlZCAqLwogCi0JaWYgKCFhZGRyKSB7CisJaWYgKCFhZGRyZXNzKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiTm8gVmlhIDY4NkEgc2Vuc29ycyBmb3VuZC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0Jbm9ybWFsX2lzYVswXSA9IGFkZHI7CiAKIAlzX2JyaWRnZSA9IHBjaV9kZXZfZ2V0KGRldik7Ci0JaWYgKGkyY19hZGRfZHJpdmVyKCZ2aWE2ODZhX2RyaXZlcikpIHsKKwlpZiAoaTJjX2lzYV9hZGRfZHJpdmVyKCZ2aWE2ODZhX2RyaXZlcikpIHsKIAkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwogCQlzX2JyaWRnZSA9IE5VTEw7CiAJfQpAQCAtODU5LDcgKzg0NSw3IEBACiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2aWE2ODZhX3BjaV9kcml2ZXIpOwogCWlmIChzX2JyaWRnZSAhPSBOVUxMKSB7Ci0JCWkyY19kZWxfZHJpdmVyKCZ2aWE2ODZhX2RyaXZlcik7CisJCWkyY19pc2FfZGVsX2RyaXZlcigmdmlhNjg2YV9kcml2ZXIpOwogCQlwY2lfZGV2X3B1dChzX2JyaWRnZSk7CiAJCXNfYnJpZGdlID0gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jIGIvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYwppbmRleCA4YTQwYjY5Li5iNjBlZmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKQEAgLTksNiArOSw5IEBACiAgICAgVGhhbmtzIHRvIExlb24gTW9vbmVuLCBTdGV2ZSBDbGlmZmUgYW5kIEdyYW50IENvYWR5IGZvciB0aGVpciBoZWxwCiAgICAgaW4gdGVzdGluZyBhbmQgZGVidWdnaW5nIHRoaXMgZHJpdmVyLgogCisgICAgVGhpcyBkcml2ZXIgYWxzbyBzdXBwb3J0cyB0aGUgVzgzNjI3RUhHLCB3aGljaCBpcyB0aGUgbGVhZC1mcmVlCisgICAgdmVyc2lvbiBvZiB0aGUgVzgzNjI3RUhGLgorCiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC0zNywxNyArNDAsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtaXNhLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJsbTc1LmgiCiAKLS8qIEFkZHJlc3NlcyB0byBzY2FuCi0gICBUaGUgYWN0dWFsIElTQSBhZGRyZXNzIGlzIHJlYWQgZnJvbSBTdXBlci1JL08gY29uZmlndXJhdGlvbiBzcGFjZSAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyAwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKLQotLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLVNFTlNPUlNfSU5TTU9EXzEodzgzNjI3ZWhmKTsKKy8qIFRoZSBhY3R1YWwgSVNBIGFkZHJlc3MgaXMgcmVhZCBmcm9tIFN1cGVyLUkvTyBjb25maWd1cmF0aW9uIHNwYWNlICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWRkcmVzczsKIAogLyoKICAqIFN1cGVyLUkvTyBjb25zdGFudHMgYW5kIGZ1bmN0aW9ucwpAQCAtMTc0LDYgKzE3NCw3IEBACiAKIHN0cnVjdCB3ODM2MjdlaGZfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CiAKIAlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwpAQCAtNjY2LDE1ICs2NjcsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgdzgzNjI3ZWhmX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgdzgzNjI3ZWhmX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgdzgzNjI3ZWhmX2RhdGEgKmRhdGE7CiAJaW50IGksIGVyciA9IDA7CiAKLQlpZiAoIWkyY19pc19pc2FfYWRhcHRlcihhZGFwdGVyKSkKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIFJFR0lPTl9MRU5HVEgsIHc4MzYyN2VoZl9kcml2ZXIubmFtZSkpIHsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIGV4aXQ7CkBAIC03MjAsNiArNzE4LDEyIEBACiAJCWRhdGEtPmhhc19mYW4gfD0gKDEgPDwgNCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gZXhpdF9kZXRhY2g7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOwogCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfZGl2KTsKQEAgLTc1Myw2ICs3NTcsOCBAQAogCiAJcmV0dXJuIDA7CiAKK2V4aXRfZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CiBleGl0X2ZyZWU6CiAJa2ZyZWUoZGF0YSk7CiBleGl0X3JlbGVhc2U6CkBAIC03NjEsMjQgKzc2NywxNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgdzgzNjI3ZWhmX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCi0JCXJldHVybiAwOwotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHc4MzYyN2VoZl9kZXRlY3QpOwotfQotCiBzdGF0aWMgaW50IHc4MzYyN2VoZl9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IHc4MzYyN2VoZl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCAiCi0JCQkiY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlyZXR1cm4gZXJyOwotCX0KIAlyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIFJFR0lPTl9MRU5HVEgpOwotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlrZnJlZShkYXRhKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzg2LDEyICs3ODUsMTEgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3ODM2MjdlaGZfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJPSAidzgzNjI3ZWhmIiwKLQkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKLQkuYXR0YWNoX2FkYXB0ZXIJPSB3ODM2MjdlaGZfYXR0YWNoX2FkYXB0ZXIsCisJLmF0dGFjaF9hZGFwdGVyCT0gdzgzNjI3ZWhmX2RldGVjdCwKIAkuZGV0YWNoX2NsaWVudAk9IHc4MzYyN2VoZl9kZXRhY2hfY2xpZW50LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgdzgzNjI3ZWhmX2ZpbmQoaW50IHNpb2FkZHIsIGludCAqYWRkcmVzcykKK3N0YXRpYyBpbnQgX19pbml0IHc4MzYyN2VoZl9maW5kKGludCBzaW9hZGRyLCB1bnNpZ25lZCBzaG9ydCAqYWRkcikKIHsKIAl1MTYgdmFsOwogCkBAIC04MDksOCArODA3LDggQEAKIAlzdXBlcmlvX3NlbGVjdChXODM2MjdFSEZfTERfSFdNKTsKIAl2YWwgPSAoc3VwZXJpb19pbmIoU0lPX1JFR19BRERSKSA8PCA4KQogCSAgICB8IHN1cGVyaW9faW5iKFNJT19SRUdfQUREUiArIDEpOwotCSphZGRyZXNzID0gdmFsICYgfihSRUdJT05fTEVOR1RIIC0gMSk7Ci0JaWYgKCphZGRyZXNzID09IDApIHsKKwkqYWRkciA9IHZhbCAmIH4oUkVHSU9OX0xFTkdUSCAtIDEpOworCWlmICgqYWRkciA9PSAwKSB7CiAJCXN1cGVyaW9fZXhpdCgpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC04MjYsMTYgKzgyNCwxNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX3c4MzYyN2VoZl9pbml0KHZvaWQpCiB7Ci0JaWYgKHc4MzYyN2VoZl9maW5kKDB4MmUsICZub3JtYWxfaXNhWzBdKQotCSAmJiB3ODM2MjdlaGZfZmluZCgweDRlLCAmbm9ybWFsX2lzYVswXSkpCisJaWYgKHc4MzYyN2VoZl9maW5kKDB4MmUsICZhZGRyZXNzKQorCSAmJiB3ODM2MjdlaGZfZmluZCgweDRlLCAmYWRkcmVzcykpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ3ODM2MjdlaGZfZHJpdmVyKTsKKwlyZXR1cm4gaTJjX2lzYV9hZGRfZHJpdmVyKCZ3ODM2MjdlaGZfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfdzgzNjI3ZWhmX2V4aXQodm9pZCkKIHsKLQlpMmNfZGVsX2RyaXZlcigmdzgzNjI3ZWhmX2RyaXZlcik7CisJaTJjX2lzYV9kZWxfZHJpdmVyKCZ3ODM2MjdlaGZfZHJpdmVyKTsKIH0KIAogTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKaW5kZXggYmQ4N2E0Mi4uMDJiZDVjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYwpAQCAtNDIsOCArNDIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWlzYS5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tdmlkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSAibG03NS5oIgogCkBAIC01NiwxMiArNTgsMTEgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfaTJjLAogCQkgIkluaXRpYWxpemUgdGhlIGkyYyBhZGRyZXNzIG9mIHRoZSBzZW5zb3JzIik7CiAKLS8qIEFkZHJlc3NlcyB0byBzY2FuICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IDAsIEkyQ19DTElFTlRfSVNBX0VORCB9OworLyogVGhlIGFjdHVhbCBJU0EgYWRkcmVzcyBpcyByZWFkIGZyb20gU3VwZXItSS9PIGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhZGRyZXNzOwogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotU0VOU09SU19JTlNNT0RfNCh3ODM2MjdoZiwgdzgzNjI3dGhmLCB3ODM2OTdoZiwgdzgzNjM3aGYpOworZW51bSBjaGlwcyB7IGFueV9jaGlwLCB3ODM2MjdoZiwgdzgzNjI3dGhmLCB3ODM2OTdoZiwgdzgzNjM3aGYgfTsKIAogc3RhdGljIGludCBpbml0ID0gMTsKIG1vZHVsZV9wYXJhbShpbml0LCBib29sLCAwKTsKQEAgLTI3Nyw2ICsyNzgsNyBAQAogICAgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gYSBuZXcgY2xpZW50IGlzIGFsbG9jYXRlZC4gKi8KIHN0cnVjdCB3ODM2MjdoZl9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKIAllbnVtIGNoaXBzIHR5cGU7CiAKQEAgLTMxNCw5ICszMTYsNyBAQAogfTsKIAogCi1zdGF0aWMgaW50IHc4MzYyN2hmX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgaW50IHc4MzYyN2hmX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLAotCQkJICBpbnQga2luZCk7CitzdGF0aWMgaW50IHc4MzYyN2hmX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIGludCB3ODM2MjdoZl9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwogCiBzdGF0aWMgaW50IHc4MzYyN2hmX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZ2lzdGVyKTsKQEAgLTMyOCw5ICszMjgsNyBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHc4MzYyN2hmX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gInc4MzYyN2hmIiwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX1c4MzYyN0hGLAotCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAotCS5hdHRhY2hfYWRhcHRlcgk9IHc4MzYyN2hmX2F0dGFjaF9hZGFwdGVyLAorCS5hdHRhY2hfYWRhcHRlcgk9IHc4MzYyN2hmX2RldGVjdCwKIAkuZGV0YWNoX2NsaWVudAk9IHc4MzYyN2hmX2RldGFjaF9jbGllbnQsCiB9OwogCkBAIC05NTksMTYgKzk1Nyw3IEBACiB9IHdoaWxlICgwKQogCiAKLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW46Ci0gICAgICogdzgzNjI3aGZfZHJpdmVyIGlzIGluc2VydGVkICh3aGVuIHRoaXMgbW9kdWxlIGlzIGxvYWRlZCksIGZvciBlYWNoCi0gICAgICAgYXZhaWxhYmxlIGFkYXB0ZXIKLSAgICAgKiB3aGVuIGEgbmV3IGFkYXB0ZXIgaXMgaW5zZXJ0ZWQgKGFuZCB3ODM2MjdoZl9kcml2ZXIgaXMgc3RpbGwgcHJlc2VudCkgKi8KLXN0YXRpYyBpbnQgdzgzNjI3aGZfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQotewotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHc4MzYyN2hmX2RldGVjdCk7Ci19Ci0KLXN0YXRpYyBpbnQgdzgzNjI3aGZfZmluZChpbnQgc2lvYWRkciwgaW50ICphZGRyZXNzKQorc3RhdGljIGludCBfX2luaXQgdzgzNjI3aGZfZmluZChpbnQgc2lvYWRkciwgdW5zaWduZWQgc2hvcnQgKmFkZHIpCiB7CiAJdTE2IHZhbDsKIApAQCAtOTg4LDMyICs5NzcsMjQgQEAKIAlzdXBlcmlvX3NlbGVjdChXODM2MjdIRl9MRF9IV00pOwogCXZhbCA9IChzdXBlcmlvX2luYihXSU5CX0JBU0VfUkVHKSA8PCA4KSB8CiAJICAgICAgIHN1cGVyaW9faW5iKFdJTkJfQkFTRV9SRUcgKyAxKTsKLQkqYWRkcmVzcyA9IHZhbCAmIH4oV0lOQl9FWFRFTlQgLSAxKTsKLQlpZiAoKmFkZHJlc3MgPT0gMCAmJiBmb3JjZV9hZGRyID09IDApIHsKKwkqYWRkciA9IHZhbCAmIH4oV0lOQl9FWFRFTlQgLSAxKTsKKwlpZiAoKmFkZHIgPT0gMCAmJiBmb3JjZV9hZGRyID09IDApIHsKIAkJc3VwZXJpb19leGl0KCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlpZiAoZm9yY2VfYWRkcikKLQkJKmFkZHJlc3MgPSBmb3JjZV9hZGRyOwkvKiBzbyBkZXRlY3Qgd2lsbCBnZXQgY2FsbGVkICovCiAKIAlzdXBlcmlvX2V4aXQoKTsKIAlyZXR1cm4gMDsKIH0KIAotaW50IHc4MzYyN2hmX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLAotCQkgICBpbnQga2luZCkKK3N0YXRpYyBpbnQgdzgzNjI3aGZfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlpbnQgdmFsOworCWludCB2YWwsIGtpbmQ7CiAJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CiAJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGE7CiAJaW50IGVyciA9IDA7CiAJY29uc3QgY2hhciAqY2xpZW50X25hbWUgPSAiIjsKIAotCWlmICghaTJjX2lzX2lzYV9hZGFwdGVyKGFkYXB0ZXIpKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gRVJST1IwOwotCX0KLQogCWlmKGZvcmNlX2FkZHIpCiAJCWFkZHJlc3MgPSBmb3JjZV9hZGRyICYgfihXSU5CX0VYVEVOVCAtIDEpOwogCkBAIC0xMTAyLDYgKzEwODMsMTIgQEAKIAlkYXRhLT5mYW5fbWluWzJdID0gdzgzNjI3aGZfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBXODM3ODFEX1JFR19GQU5fTUlOKDMpKTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gRVJST1IzOworCX0KKwogCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAwKTsKIAlpZiAoa2luZCAhPSB3ODM2OTdoZikKIAkJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDEpOwpAQCAtMTE1Miw2ICsxMTM5LDggQEAKIAogCXJldHVybiAwOwogCisgICAgICBFUlJPUjM6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiAgICAgICBFUlJPUjI6CiAJa2ZyZWUoZGF0YSk7CiAgICAgICBFUlJPUjE6CkBAIC0xMTYyLDE2ICsxMTUxLDE2IEBACiAKIHN0YXRpYyBpbnQgdzgzNjI3aGZfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCSAgICAgICAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlyZXR1cm4gZXJyOwotCX0KIAogCXJlbGVhc2VfcmVnaW9uKGNsaWVudC0+YWRkciwgV0lOQl9FWFRFTlQpOwotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlrZnJlZShkYXRhKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTMyNyw3ICsxMzE2LDcgQEAKIAkJZGF0YS0+dnJtID0gKGRhdGEtPnZybV9vdnQgJiAweDAxKSA/IDkwIDogODI7CiAJfSBlbHNlIHsKIAkJLyogQ29udmVydCBWSUQgdG8gdm9sdGFnZSBiYXNlZCBvbiBkZWZhdWx0IFZSTSAqLwotCQlkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7CisJCWRhdGEtPnZybSA9IHZpZF93aGljaF92cm0oKTsKIAl9CiAKIAl0bXAgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfU0NGRzEpOwpAQCAtMTQ4NSwyMCArMTQ3NCwxNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX3c4MzYyN2hmX2luaXQodm9pZCkKIHsKLQlpbnQgYWRkcjsKLQotCWlmICh3ODM2MjdoZl9maW5kKDB4MmUsICZhZGRyKQotCSAmJiB3ODM2MjdoZl9maW5kKDB4NGUsICZhZGRyKSkgeworCWlmICh3ODM2MjdoZl9maW5kKDB4MmUsICZhZGRyZXNzKQorCSAmJiB3ODM2MjdoZl9maW5kKDB4NGUsICZhZGRyZXNzKSkgewogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0Jbm9ybWFsX2lzYVswXSA9IGFkZHI7CiAKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnc4MzYyN2hmX2RyaXZlcik7CisJcmV0dXJuIGkyY19pc2FfYWRkX2RyaXZlcigmdzgzNjI3aGZfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfdzgzNjI3aGZfZXhpdCh2b2lkKQogewotCWkyY19kZWxfZHJpdmVyKCZ3ODM2MjdoZl9kcml2ZXIpOworCWkyY19pc2FfZGVsX2RyaXZlcigmdzgzNjI3aGZfZHJpdmVyKTsKIH0KIAogTU9EVUxFX0FVVEhPUigiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM3ODFkLmMgYi9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYwppbmRleCAwYmIxMzFjLi40YzQzMzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYwpAQCAtMzgsOCArMzgsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWlzYS5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tdmlkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSAibG03NS5oIgogCkBAIC00NywxMCArNDksMTAgQEAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsCiAJCQkJCTB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsCiAJCQkJCTB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIEkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgMHgwMjkwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpc2FfYWRkcmVzcyA9IDB4MjkwOwogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotU0VOU09SU19JTlNNT0RfNSh3ODM3ODFkLCB3ODM3ODJkLCB3ODM3ODNzLCB3ODM2MjdoZiwgYXM5OTEyN2YpOworSTJDX0NMSUVOVF9JTlNNT0RfNSh3ODM3ODFkLCB3ODM3ODJkLCB3ODM3ODNzLCB3ODM2MjdoZiwgYXM5OTEyN2YpOwogSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZV9zdWJjbGllbnRzLCAiTGlzdCBvZiBzdWJjbGllbnQgYWRkcmVzc2VzOiAiCiAJCSAgICAie2J1cywgY2xpZW50YWRkciwgc3ViY2xpZW50YWRkcjEsIHN1YmNsaWVudGFkZHIyfSIpOwogCkBAIC0yMTgsNiArMjIwLDcgQEAKICAgIGFsbG9jYXRlZC4gKi8KIHN0cnVjdCB3ODM3ODFkX2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IHNlbWFwaG9yZSBsb2NrOwogCWVudW0gY2hpcHMgdHlwZTsKIApAQCAtMjU1LDYgKzI1OCw3IEBACiB9OwogCiBzdGF0aWMgaW50IHc4Mzc4MWRfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgdzgzNzgxZF9pc2FfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKIHN0YXRpYyBpbnQgdzgzNzgxZF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOwogc3RhdGljIGludCB3ODM3ODFkX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CiAKQEAgLTI3Myw2ICsyNzcsMTQgQEAKIAkuZGV0YWNoX2NsaWVudCA9IHc4Mzc4MWRfZGV0YWNoX2NsaWVudCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3ODM3ODFkX2lzYV9kcml2ZXIgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAidzgzNzgxZC1pc2EiLAorCS5hdHRhY2hfYWRhcHRlciA9IHc4Mzc4MWRfaXNhX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50ID0gdzgzNzgxZF9kZXRhY2hfY2xpZW50LAorfTsKKworCiAvKiBmb2xsb3dpbmcgYXJlIHRoZSBzeXNmcyBjYWxsYmFjayBmdW5jdGlvbnMgKi8KICNkZWZpbmUgc2hvd19pbl9yZWcocmVnKSBcCiBzdGF0aWMgc3NpemVfdCBzaG93XyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSBcCkBAIC04NTYsNyArODY4LDEzIEBACiB7CiAJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCB3ODM3ODFkX2RldGVjdCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCB3ODM3ODFkX2RldGVjdCk7Cit9CisKK3N0YXRpYyBpbnQKK3c4Mzc4MWRfaXNhX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gdzgzNzgxZF9kZXRlY3QoYWRhcHRlciwgaXNhX2FkZHJlc3MsIC0xKTsKIH0KIAogLyogQXNzdW1lcyB0aGF0IGFkYXB0ZXIgaXMgb2YgSTJDLCBub3QgSVNBIHZhcmlldHkuCkBAIC05NjEsMTAgKzk3OSwxMCBAQAogRVJST1JfU0NfMzoKIAlpMmNfZGV0YWNoX2NsaWVudChkYXRhLT5sbTc1WzBdKTsKIEVSUk9SX1NDXzI6Ci0JaWYgKE5VTEwgIT0gZGF0YS0+bG03NVsxXSkKKwlpZiAoZGF0YS0+bG03NVsxXSkKIAkJa2ZyZWUoZGF0YS0+bG03NVsxXSk7CiBFUlJPUl9TQ18xOgotCWlmIChOVUxMICE9IGRhdGEtPmxtNzVbMF0pCisJaWYgKGRhdGEtPmxtNzVbMF0pCiAJCWtmcmVlKGRhdGEtPmxtNzVbMF0pOwogRVJST1JfU0NfMDoKIAlyZXR1cm4gZXJyOwpAQCAtOTk5LDcgKzEwMTcsNyBAQAogCQogCWlmIChpc19pc2EpCiAJCWlmICghcmVxdWVzdF9yZWdpb24oYWRkcmVzcywgVzgzNzgxRF9FWFRFTlQsCi0JCQkJICAgIHc4Mzc4MWRfZHJpdmVyLm5hbWUpKSB7CisJCQkJICAgIHc4Mzc4MWRfaXNhX2RyaXZlci5uYW1lKSkgewogCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiUmVxdWVzdCBvZiByZWdpb24gIgogCQkJCSIweCV4LTB4JXggZm9yIHc4Mzc4MWQgZmFpbGVkXG4iLCBhZGRyZXNzLAogCQkJCWFkZHJlc3MgKyBXODM3ODFEX0VYVEVOVCAtIDEpOwpAQCAtMTA1Nyw3ICsxMDc1LDcgQEAKIAluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKIAlpbml0X01VVEVYKCZkYXRhLT5sb2NrKTsKIAluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKLQluZXdfY2xpZW50LT5kcml2ZXIgPSAmdzgzNzgxZF9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gaXNfaXNhID8gJnc4Mzc4MWRfaXNhX2RyaXZlciA6ICZ3ODM3ODFkX2RyaXZlcjsKIAluZXdfY2xpZW50LT5mbGFncyA9IDA7CiAKIAkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiAqLwpAQCAtMTE4OSw2ICsxMjA3LDEyIEBACiAJCQlkYXRhLT5wd21lbmFibGVbaV0gPSAxOwogCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKKwkJZ290byBFUlJPUjQ7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDApOwogCWlmIChraW5kICE9IHc4Mzc4M3MpCiAJCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAxKTsKQEAgLTEyNDEsNiArMTI2NSwxNSBAQAogCiAJcmV0dXJuIDA7CiAKK0VSUk9SNDoKKwlpZiAoZGF0YS0+bG03NVsxXSkgeworCQlpMmNfZGV0YWNoX2NsaWVudChkYXRhLT5sbTc1WzFdKTsKKwkJa2ZyZWUoZGF0YS0+bG03NVsxXSk7CisJfQorCWlmIChkYXRhLT5sbTc1WzBdKSB7CisJCWkyY19kZXRhY2hfY2xpZW50KGRhdGEtPmxtNzVbMF0pOworCQlrZnJlZShkYXRhLT5sbTc1WzBdKTsKKwl9CiBFUlJPUjM6CiAJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiBFUlJPUjI6CkBAIC0xMjU1LDI0ICsxMjg4LDI2IEBACiBzdGF0aWMgaW50CiB3ODM3ODFkX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKKwlzdHJ1Y3QgdzgzNzgxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGVycjsKIAorCS8qIG1haW4gY2xpZW50ICovCisJaWYgKGRhdGEpCisJCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CisKIAlpZiAoaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50KSkKIAkJcmVsZWFzZV9yZWdpb24oY2xpZW50LT5hZGRyLCBXODM3ODFEX0VYVEVOVCk7CiAKLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkgICAgICAgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlyZXR1cm4gZXJyOwotCX0KIAotCWlmIChpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KT09TlVMTCkgewotCQkvKiBzdWJjbGllbnRzICovCisJLyogbWFpbiBjbGllbnQgKi8KKwlpZiAoZGF0YSkKKwkJa2ZyZWUoZGF0YSk7CisKKwkvKiBzdWJjbGllbnQgKi8KKwllbHNlCiAJCWtmcmVlKGNsaWVudCk7Ci0JfSBlbHNlIHsKLQkJLyogbWFpbiBjbGllbnQgKi8KLQkJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTQ0Myw3ICsxNDc4LDcgQEAKIAkJdzgzNzgxZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzIsIDApOwogCX0KIAotCWRhdGEtPnZybSA9IGkyY193aGljaF92cm0oKTsKKwlkYXRhLT52cm0gPSB2aWRfd2hpY2hfdnJtKCk7CiAKIAlpZiAoKHR5cGUgIT0gdzgzNzgxZCkgJiYgKHR5cGUgIT0gYXM5OTEyN2YpKSB7CiAJCXRtcCA9IHc4Mzc4MWRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc4MURfUkVHX1NDRkcxKTsKQEAgLTE2MTMsMTIgKzE2NDgsMjUgQEAKIHN0YXRpYyBpbnQgX19pbml0CiBzZW5zb3JzX3c4Mzc4MWRfaW5pdCh2b2lkKQogewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmdzgzNzgxZF9kcml2ZXIpOworCWludCByZXM7CisKKwlyZXMgPSBpMmNfYWRkX2RyaXZlcigmdzgzNzgxZF9kcml2ZXIpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlyZXMgPSBpMmNfaXNhX2FkZF9kcml2ZXIoJnc4Mzc4MWRfaXNhX2RyaXZlcik7CisJaWYgKHJlcykgeworCQlpMmNfZGVsX2RyaXZlcigmdzgzNzgxZF9kcml2ZXIpOworCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQKIHNlbnNvcnNfdzgzNzgxZF9leGl0KHZvaWQpCiB7CisJaTJjX2lzYV9kZWxfZHJpdmVyKCZ3ODM3ODFkX2lzYV9kcml2ZXIpOwogCWkyY19kZWxfZHJpdmVyKCZ3ODM3ODFkX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jIGIvZHJpdmVycy9od21vbi93ODM3OTJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwYzI4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jCkBAIC0wLDAgKzEsMTY0OSBAQAorLyoKKyAgICB3ODM3OTJkLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQorICAgICAgICAgICAgICAgIG1vbml0b3JpbmcKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgV2luYm9uZCBFbGVjdHJvbmljcyBDb3JwLgorICAgICAgICAgICAgICAgICAgICAgICAgQ2h1bmhhbyBIdWFuZyA8RFpTaGVuQFdpbmJvbmQuY29tLnR3PiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJ1ZG9sZiBNYXJlayA8ci5tYXJla0BzaC5jdnV0LmN6PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAgICBOb3RlOgorICAgIDEuIFRoaXMgZHJpdmVyIGlzIG9ubHkgZm9yIDIuNiBrZXJuZWwsIDIuNCBrZXJuZWwgbmVlZCBhIGRpZmZlcmVudCBkcml2ZXIuCisgICAgMi4gVGhpcyBkcml2ZXIgaXMgb25seSBmb3IgV2luYm9uZCBXODM3OTJEIEMgdmVyc2lvbiBkZXZpY2UsIHRoZXJlCisgICAgICAgYXJlIGFsc28gc29tZSBtb3RoZXJib2FyZHMgd2l0aCBCIHZlcnNpb24gVzgzNzkyRCBkZXZpY2UuIFRoZQorICAgICAgIGNhbGN1bGF0aW9uIG1ldGhvZCB0byBpbjYtaW43KG1lYXN1cmVkIHZhbHVlLCBsaW1pdHMpIGlzIGEgbGl0dGxlCisgICAgICAgZGlmZmVyZW50IGJldHdlZW4gQyBhbmQgQiB2ZXJzaW9uLiBDIG9yIEIgdmVyc2lvbiBjYW4gYmUgaWRlbnRpZmllZAorICAgICAgIGJ5IENSWzB4NDloXS4KKyovCisKKy8qCisgICAgU3VwcG9ydHMgZm9sbG93aW5nIGNoaXBzOgorCisgICAgQ2hpcAkjdmluCSNmYW5pbgkjcHdtCSN0ZW1wCXdjaGlwaWQJdmVuZGlkCWkyYwlJU0EKKyAgICB3ODM3OTJkCTkJNwk3CTMJMHg3YQkweDVjYTMJeWVzCW5vCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCAweDJlLCAweDJmLCBJMkNfQ0xJRU5UX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworSTJDX0NMSUVOVF9JTlNNT0RfMSh3ODM3OTJkKTsKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgorCQkJIntidXMsIGNsaWVudGFkZHIsIHN1YmNsaWVudGFkZHIxLCBzdWJjbGllbnRhZGRyMn0iKTsKKworc3RhdGljIGludCBpbml0OworbW9kdWxlX3BhcmFtKGluaXQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbml0LCAiU2V0IHRvIG9uZSB0byBmb3JjZSBjaGlwIGluaXRpYWxpemF0aW9uIik7CisKKy8qIFRoZSBXODM3OTJEIHJlZ2lzdGVycyAqLworc3RhdGljIGNvbnN0IHU4IFc4Mzc5MkRfUkVHX0lOWzldID0geworCTB4MjAsCS8qIFZjb3JlIEEgaW4gRGF0YVNoZWV0ICovCisJMHgyMSwJLyogVmNvcmUgQiBpbiBEYXRhU2hlZXQgKi8KKwkweDIyLAkvKiBWSU4wIGluIERhdGFTaGVldCAqLworCTB4MjMsCS8qIFZJTjEgaW4gRGF0YVNoZWV0ICovCisJMHgyNCwJLyogVklOMiBpbiBEYXRhU2hlZXQgKi8KKwkweDI1LAkvKiBWSU4zIGluIERhdGFTaGVldCAqLworCTB4MjYsCS8qIDVWQ0MgaW4gRGF0YVNoZWV0ICovCisJMHhCMCwJLyogNVZTQiBpbiBEYXRhU2hlZXQgKi8KKwkweEIxCS8qIFZCQVQgaW4gRGF0YVNoZWV0ICovCit9OworI2RlZmluZSBXODM3OTJEX1JFR19MT1dfQklUUzEgMHgzRSAgLyogTG93IEJpdHMgSSBpbiBEYXRhU2hlZXQgKi8KKyNkZWZpbmUgVzgzNzkyRF9SRUdfTE9XX0JJVFMyIDB4M0YgIC8qIExvdyBCaXRzIElJIGluIERhdGFTaGVldCAqLworc3RhdGljIGNvbnN0IHU4IFc4Mzc5MkRfUkVHX0lOX01BWFs5XSA9IHsKKwkweDJCLAkvKiBWY29yZSBBIEhpZ2ggTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgyRCwJLyogVmNvcmUgQiBIaWdoIExpbWl0IGluIERhdGFTaGVldCAqLworCTB4MkYsCS8qIFZJTjAgSGlnaCBMaW1pdCBpbiBEYXRhU2hlZXQgKi8KKwkweDMxLAkvKiBWSU4xIEhpZ2ggTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgzMywJLyogVklOMiBIaWdoIExpbWl0IGluIERhdGFTaGVldCAqLworCTB4MzUsCS8qIFZJTjMgSGlnaCBMaW1pdCBpbiBEYXRhU2hlZXQgKi8KKwkweDM3LAkvKiA1VkNDIEhpZ2ggTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHhCNCwJLyogNVZTQiBIaWdoIExpbWl0IGluIERhdGFTaGVldCAqLworCTB4QjYJLyogVkJBVCBIaWdoIExpbWl0IGluIERhdGFTaGVldCAqLworfTsKK3N0YXRpYyBjb25zdCB1OCBXODM3OTJEX1JFR19JTl9NSU5bOV0gPSB7CisJMHgyQywJLyogVmNvcmUgQSBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgyRSwJLyogVmNvcmUgQiBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgzMCwJLyogVklOMCBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgzMiwJLyogVklOMSBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgzNCwJLyogVklOMiBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgzNiwJLyogVklOMyBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgzOCwJLyogNVZDQyBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHhCNSwJLyogNVZTQiBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHhCNwkvKiBWQkFUIExvdyBMaW1pdCBpbiBEYXRhU2hlZXQgKi8KK307CitzdGF0aWMgY29uc3QgdTggVzgzNzkyRF9SRUdfRkFOWzddID0geworCTB4MjgsCS8qIEZBTiAxIENvdW50IGluIERhdGFTaGVldCAqLworCTB4MjksCS8qIEZBTiAyIENvdW50IGluIERhdGFTaGVldCAqLworCTB4MkEsCS8qIEZBTiAzIENvdW50IGluIERhdGFTaGVldCAqLworCTB4QjgsCS8qIEZBTiA0IENvdW50IGluIERhdGFTaGVldCAqLworCTB4QjksCS8qIEZBTiA1IENvdW50IGluIERhdGFTaGVldCAqLworCTB4QkEsCS8qIEZBTiA2IENvdW50IGluIERhdGFTaGVldCAqLworCTB4QkUJLyogRkFOIDcgQ291bnQgaW4gRGF0YVNoZWV0ICovCit9Oworc3RhdGljIGNvbnN0IHU4IFc4Mzc5MkRfUkVHX0ZBTl9NSU5bN10gPSB7CisJMHgzQiwJLyogRkFOIDEgQ291bnQgTG93IExpbWl0IGluIERhdGFTaGVldCAqLworCTB4M0MsCS8qIEZBTiAyIENvdW50IExvdyBMaW1pdCBpbiBEYXRhU2hlZXQgKi8KKwkweDNELAkvKiBGQU4gMyBDb3VudCBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHhCQiwJLyogRkFOIDQgQ291bnQgTG93IExpbWl0IGluIERhdGFTaGVldCAqLworCTB4QkMsCS8qIEZBTiA1IENvdW50IExvdyBMaW1pdCBpbiBEYXRhU2hlZXQgKi8KKwkweEJELAkvKiBGQU4gNiBDb3VudCBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHhCRgkvKiBGQU4gNyBDb3VudCBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCit9OworI2RlZmluZSBXODM3OTJEX1JFR19GQU5fQ0ZHIDB4ODQJLyogRkFOIENvbmZpZ3VyYXRpb24gaW4gRGF0YVNoZWV0ICovCitzdGF0aWMgY29uc3QgdTggVzgzNzkyRF9SRUdfRkFOX0RJVls0XSA9IHsKKwkweDQ3LAkvKiBjb250YWlucyBGQU4yIGFuZCBGQU4xIERpdmlzb3IgKi8KKwkweDVCLAkvKiBjb250YWlucyBGQU40IGFuZCBGQU4zIERpdmlzb3IgKi8KKwkweDVDLAkvKiBjb250YWlucyBGQU42IGFuZCBGQU41IERpdmlzb3IgKi8KKwkweDlFCS8qIGNvbnRhaW5zIEZBTjcgRGl2aXNvci4gKi8KK307CitzdGF0aWMgY29uc3QgdTggVzgzNzkyRF9SRUdfUFdNWzddID0geworCTB4ODEsCS8qIEZBTiAxIER1dHkgQ3ljbGUsIGJlIHVzZWQgdG8gY29udHJvbCAqLworCTB4ODMsCS8qIEZBTiAyIER1dHkgQ3ljbGUsIGJlIHVzZWQgdG8gY29udHJvbCAqLworCTB4OTQsCS8qIEZBTiAzIER1dHkgQ3ljbGUsIGJlIHVzZWQgdG8gY29udHJvbCAqLworCTB4QTMsCS8qIEZBTiA0IER1dHkgQ3ljbGUsIGJlIHVzZWQgdG8gY29udHJvbCAqLworCTB4QTQsCS8qIEZBTiA1IER1dHkgQ3ljbGUsIGJlIHVzZWQgdG8gY29udHJvbCAqLworCTB4QTUsCS8qIEZBTiA2IER1dHkgQ3ljbGUsIGJlIHVzZWQgdG8gY29udHJvbCAqLworCTB4QTYJLyogRkFOIDcgRHV0eSBDeWNsZSwgYmUgdXNlZCB0byBjb250cm9sICovCit9OworI2RlZmluZSBXODM3OTJEX1JFR19CQU5LCQkweDRFCisjZGVmaW5lIFc4Mzc5MkRfUkVHX1RFTVAyX0NPTkZJRwkweEMyCisjZGVmaW5lIFc4Mzc5MkRfUkVHX1RFTVAzX0NPTkZJRwkweENBCisKK3N0YXRpYyBjb25zdCB1OCBXODM3OTJEX1JFR19URU1QMVszXSA9IHsKKwkweDI3LAkvKiBURU1QIDEgaW4gRGF0YVNoZWV0ICovCisJMHgzOSwJLyogVEVNUCAxIE92ZXIgaW4gRGF0YVNoZWV0ICovCisJMHgzQSwJLyogVEVNUCAxIEh5c3QgaW4gRGF0YVNoZWV0ICovCit9OworCitzdGF0aWMgY29uc3QgdTggVzgzNzkyRF9SRUdfVEVNUF9BRERbMl1bNl0gPSB7CisJeyAweEMwLAkJLyogVEVNUCAyIGluIERhdGFTaGVldCAqLworCSAgMHhDMSwJCS8qIFRFTVAgMigwLjUgZGVnKSBpbiBEYXRhU2hlZXQgKi8KKwkgIDB4QzUsCQkvKiBURU1QIDIgT3ZlciBIaWdoIHBhcnQgaW4gRGF0YVNoZWV0ICovCisJICAweEM2LAkJLyogVEVNUCAyIE92ZXIgTG93IHBhcnQgaW4gRGF0YVNoZWV0ICovCisJICAweEMzLAkJLyogVEVNUCAyIFRoeXN0IEhpZ2ggcGFydCBpbiBEYXRhU2hlZXQgKi8KKwkgIDB4QzQgfSwJLyogVEVNUCAyIFRoeXN0IExvdyBwYXJ0IGluIERhdGFTaGVldCAqLworCXsgMHhDOCwJCS8qIFRFTVAgMyBpbiBEYXRhU2hlZXQgKi8KKwkgIDB4QzksCQkvKiBURU1QIDMoMC41IGRlZykgaW4gRGF0YVNoZWV0ICovCisJICAweENELAkJLyogVEVNUCAzIE92ZXIgSGlnaCBwYXJ0IGluIERhdGFTaGVldCAqLworCSAgMHhDRSwJCS8qIFRFTVAgMyBPdmVyIExvdyBwYXJ0IGluIERhdGFTaGVldCAqLworCSAgMHhDQiwJCS8qIFRFTVAgMyBUaHlzdCBIaWdoIHBhcnQgaW4gRGF0YVNoZWV0ICovCisJICAweENDIH0JLyogVEVNUCAzIFRoeXN0IExvdyBwYXJ0IGluIERhdGFTaGVldCAqLworfTsKKworc3RhdGljIGNvbnN0IHU4IFc4Mzc5MkRfUkVHX1RIRVJNQUxbM10gPSB7CisJMHg4NSwJLyogU21hcnRGYW5JOiBGYW4xIHRhcmdldCB2YWx1ZSAqLworCTB4ODYsCS8qIFNtYXJ0RmFuSTogRmFuMiB0YXJnZXQgdmFsdWUgKi8KKwkweDk2CS8qIFNtYXJ0RmFuSTogRmFuMyB0YXJnZXQgdmFsdWUgKi8KK307CisKK3N0YXRpYyBjb25zdCB1OCBXODM3OTJEX1JFR19UT0xFUkFOQ0VbM10gPSB7CisJMHg4NywJLyogKGJpdDMtMClTbWFydEZhbiBGYW4xIHRvbGVyYW5jZSAqLworCTB4ODcsCS8qIChiaXQ3LTQpU21hcnRGYW4gRmFuMiB0b2xlcmFuY2UgKi8KKwkweDk3CS8qIChiaXQzLTApU21hcnRGYW4gRmFuMyB0b2xlcmFuY2UgKi8KK307CisKK3N0YXRpYyBjb25zdCB1OCBXODM3OTJEX1JFR19QT0lOVFNbM11bNF0gPSB7CisJeyAweDg1LAkJLyogU21hcnRGYW5JSTogRmFuMSB0ZW1wIHBvaW50IDEgKi8KKwkgIDB4RTMsCQkvKiBTbWFydEZhbklJOiBGYW4xIHRlbXAgcG9pbnQgMiAqLworCSAgMHhFNCwJCS8qIFNtYXJ0RmFuSUk6IEZhbjEgdGVtcCBwb2ludCAzICovCisJICAweEU1IH0sCS8qIFNtYXJ0RmFuSUk6IEZhbjEgdGVtcCBwb2ludCA0ICovCisJeyAweDg2LAkJLyogU21hcnRGYW5JSTogRmFuMiB0ZW1wIHBvaW50IDEgKi8KKwkgIDB4RTYsCQkvKiBTbWFydEZhbklJOiBGYW4yIHRlbXAgcG9pbnQgMiAqLworCSAgMHhFNywJCS8qIFNtYXJ0RmFuSUk6IEZhbjIgdGVtcCBwb2ludCAzICovCisJICAweEU4IH0sCS8qIFNtYXJ0RmFuSUk6IEZhbjIgdGVtcCBwb2ludCA0ICovCisJeyAweDk2LAkJLyogU21hcnRGYW5JSTogRmFuMyB0ZW1wIHBvaW50IDEgKi8KKwkgIDB4RTksCQkvKiBTbWFydEZhbklJOiBGYW4zIHRlbXAgcG9pbnQgMiAqLworCSAgMHhFQSwJCS8qIFNtYXJ0RmFuSUk6IEZhbjMgdGVtcCBwb2ludCAzICovCisJICAweEVCIH0JLyogU21hcnRGYW5JSTogRmFuMyB0ZW1wIHBvaW50IDQgKi8KK307CisKK3N0YXRpYyBjb25zdCB1OCBXODM3OTJEX1JFR19MRVZFTFNbM11bNF0gPSB7CisJeyAweDg4LAkJLyogKGJpdDMtMCkgU21hcnRGYW5JSTogRmFuMSBOb24tU3RvcCAqLworCSAgMHg4OCwJCS8qIChiaXQ3LTQpIFNtYXJ0RmFuSUk6IEZhbjEgTGV2ZWwgMSAqLworCSAgMHhFMCwJCS8qIChiaXQ3LTQpIFNtYXJ0RmFuSUk6IEZhbjEgTGV2ZWwgMiAqLworCSAgMHhFMCB9LAkvKiAoYml0My0wKSBTbWFydEZhbklJOiBGYW4xIExldmVsIDMgKi8KKwl7IDB4ODksCQkvKiAoYml0My0wKSBTbWFydEZhbklJOiBGYW4yIE5vbi1TdG9wICovCisJICAweDg5LAkJLyogKGJpdDctNCkgU21hcnRGYW5JSTogRmFuMiBMZXZlbCAxICovCisJICAweEUxLAkJLyogKGJpdDctNCkgU21hcnRGYW5JSTogRmFuMiBMZXZlbCAyICovCisJICAweEUxIH0sCS8qIChiaXQzLTApIFNtYXJ0RmFuSUk6IEZhbjIgTGV2ZWwgMyAqLworCXsgMHg5OCwJCS8qIChiaXQzLTApIFNtYXJ0RmFuSUk6IEZhbjMgTm9uLVN0b3AgKi8KKwkgIDB4OTgsCQkvKiAoYml0Ny00KSBTbWFydEZhbklJOiBGYW4zIExldmVsIDEgKi8KKwkgIDB4RTIsCQkvKiAoYml0Ny00KSBTbWFydEZhbklJOiBGYW4zIExldmVsIDIgKi8KKwkgIDB4RTIgfQkvKiAoYml0My0wKSBTbWFydEZhbklJOiBGYW4zIExldmVsIDMgKi8KK307CisKKyNkZWZpbmUgVzgzNzkyRF9SRUdfQ09ORklHCQkweDQwCisjZGVmaW5lIFc4Mzc5MkRfUkVHX1ZJRF9GQU5ESVYJCTB4NDcKKyNkZWZpbmUgVzgzNzkyRF9SRUdfQ0hJUElECQkweDQ5CisjZGVmaW5lIFc4Mzc5MkRfUkVHX1dDSElQSUQJCTB4NTgKKyNkZWZpbmUgVzgzNzkyRF9SRUdfQ0hJUE1BTgkJMHg0RgorI2RlZmluZSBXODM3OTJEX1JFR19QSU4JCQkweDRCCisjZGVmaW5lIFc4Mzc5MkRfUkVHX0kyQ19TVUJBRERSCQkweDRBCisKKyNkZWZpbmUgVzgzNzkyRF9SRUdfQUxBUk0xIDB4QTkJCS8qIHJlYWx0aW1lIHN0YXR1cyByZWdpc3RlcjEgKi8KKyNkZWZpbmUgVzgzNzkyRF9SRUdfQUxBUk0yIDB4QUEJCS8qIHJlYWx0aW1lIHN0YXR1cyByZWdpc3RlcjIgKi8KKyNkZWZpbmUgVzgzNzkyRF9SRUdfQUxBUk0zIDB4QUIJCS8qIHJlYWx0aW1lIHN0YXR1cyByZWdpc3RlcjMgKi8KKyNkZWZpbmUgVzgzNzkyRF9SRUdfQ0hBU1NJUyAweDQyCS8qIEJpdCA1OiBDYXNlIE9wZW4gc3RhdHVzIGJpdCAqLworI2RlZmluZSBXODM3OTJEX1JFR19DSEFTU0lTX0NMUiAweDQ0CS8qIEJpdCA3OiBDYXNlIE9wZW4gQ0xSX0NIUy9SZXNldCBiaXQgKi8KKworLyogY29udHJvbCBpbjAvaW4xICdzIGxpbWl0IG1vZGlmaWFiaWxpdHkgKi8KKyNkZWZpbmUgVzgzNzkyRF9SRUdfVklEX0lOX0IJCTB4MTcKKworI2RlZmluZSBXODM3OTJEX1JFR19WQkFUCQkweDVECisjZGVmaW5lIFc4Mzc5MkRfUkVHX0kyQ19BRERSCQkweDQ4CisKKy8qIENvbnZlcnNpb25zLiBSb3VuZGluZyBhbmQgbGltaXQgY2hlY2tpbmcgaXMgb25seSBkb25lIG9uIHRoZSBUT19SRUcKKyAgIHZhcmlhbnRzLiBOb3RlIHRoYXQgeW91IHNob3VsZCBiZSBhIGJpdCBjYXJlZnVsIHdpdGggd2hpY2ggYXJndW1lbnRzCisgICB0aGVzZSBtYWNyb3MgYXJlIGNhbGxlZDogYXJndW1lbnRzIG1heSBiZSBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UuCisgICBGaXhpbmcgdGhpcyBpcyBqdXN0IG5vdCB3b3J0aCBpdC4gKi8KKyNkZWZpbmUgSU5fRlJPTV9SRUcobnIsdmFsKSAoKChucik8PTEpPyh2YWwqMik6IFwKKwkJCQkoKCgobnIpPT02KXx8KChucik9PTcpKT8odmFsKjYpOih2YWwqNCkpKQorI2RlZmluZSBJTl9UT19SRUcobnIsdmFsKSAoKChucik8PTEpPyh2YWwvMik6IFwKKwkJCQkoKCgobnIpPT02KXx8KChucik9PTcpKT8odmFsLzYpOih2YWwvNCkpKQorCitzdGF0aWMgaW5saW5lIHU4CitGQU5fVE9fUkVHKGxvbmcgcnBtLCBpbnQgZGl2KQoreworCWlmIChycG0gPT0gMCkKKwkJcmV0dXJuIDI1NTsKKwlycG0gPSBTRU5TT1JTX0xJTUlUKHJwbSwgMSwgMTAwMDAwMCk7CisJcmV0dXJuIFNFTlNPUlNfTElNSVQoKDEzNTAwMDAgKyBycG0gKiBkaXYgLyAyKSAvIChycG0gKiBkaXYpLCAxLCAyNTQpOworfQorCisjZGVmaW5lIEZBTl9GUk9NX1JFRyh2YWwsZGl2KQkoKHZhbCkgPT0gMCAgID8gLTEgOiBcCisJCQkJKCh2YWwpID09IDI1NSA/IDAgOiBcCisJCQkJCQkxMzUwMDAwIC8gKCh2YWwpICogKGRpdikpKSkKKworLyogZm9yIHRlbXAxICovCisjZGVmaW5lIFRFTVAxX1RPX1JFRyh2YWwpCShTRU5TT1JTX0xJTUlUKCgodmFsKSA8IDAgPyAodmFsKSsweDEwMCoxMDAwIFwKKwkJCQkJOiAodmFsKSkgLyAxMDAwLCAwLCAweGZmKSkKKyNkZWZpbmUgVEVNUDFfRlJPTV9SRUcodmFsKQkoKCh2YWwpICYgMHg4MCA/ICh2YWwpLTB4MTAwIDogKHZhbCkpICogMTAwMCkKKy8qIGZvciB0ZW1wMiBhbmQgdGVtcDMsIGJlY2F1c2UgdGhleSBuZWVkIGFkZHRpb25hbCByZXNvbHV0aW9uICovCisjZGVmaW5lIFRFTVBfQUREX0ZST01fUkVHKHZhbDEsIHZhbDIpIFwKKwkoKCgodmFsMSkgJiAweDgwID8gKHZhbDEpLTB4MTAwIFwKKwkJOiAodmFsMSkpICogMTAwMCkgKyAoKHZhbDIgJiAweDgwKSA/IDUwMCA6IDApKQorI2RlZmluZSBURU1QX0FERF9UT19SRUdfSElHSCh2YWwpIFwKKwkoU0VOU09SU19MSU1JVCgoKHZhbCkgPCAwID8gKHZhbCkrMHgxMDAqMTAwMCBcCisJCQk6ICh2YWwpKSAvIDEwMDAsIDAsIDB4ZmYpKQorI2RlZmluZSBURU1QX0FERF9UT19SRUdfTE9XKHZhbCkJKCh2YWwlMTAwMCkgPyAweDgwIDogMHgwMCkKKworI2RlZmluZSBQV01fRlJPTV9SRUcodmFsKQkJKHZhbCkKKyNkZWZpbmUgUFdNX1RPX1JFRyh2YWwpCQkJKFNFTlNPUlNfTElNSVQoKHZhbCksMCwyNTUpKQorI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKQkJKDEgPDwgKHZhbCkpCisKK3N0YXRpYyBpbmxpbmUgdTgKK0RJVl9UT19SRUcobG9uZyB2YWwpCit7CisJaW50IGk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDEsIDEyOCkgPj4gMTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWlmICh2YWwgPT0gMCkKKwkJCWJyZWFrOworCQl2YWwgPj49IDE7CisJfQorCXJldHVybiAoKHU4KSBpKTsKK30KKworc3RydWN0IHc4Mzc5MmRfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJZW51bSBjaGlwcyB0eXBlOworCisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCS8qIGFycmF5IG9mIDIgcG9pbnRlcnMgdG8gc3ViY2xpZW50cyAqLworCXN0cnVjdCBpMmNfY2xpZW50ICpsbTc1WzJdOworCisJdTggaW5bOV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGluX21heFs5XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWluWzldOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBsb3dfYml0c1syXTsJCS8qIEFkZGl0aW9uYWwgcmVzb2x1dGlvbiB0byB2b2x0YWdlIGluMC02ICovCisJdTggZmFuWzddOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fbWluWzddOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCB0ZW1wMVszXTsJCS8qIGN1cnJlbnQsIG92ZXIsIHRoeXN0ICovCisJdTggdGVtcF9hZGRbMl1bNl07CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX2Rpdls3XTsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBzaGlmdGVkIHJpZ2h0ICovCisJdTggcHdtWzddOwkJLyogV2Ugb25seSBjb25zaWRlciB0aGUgZmlyc3QgMyBzZXQgb2YgcHdtLAorCQkJCSAgIGFsdGhvdWdoIDc5MiBjaGlwIGhhcyA3IHNldCBvZiBwd20uICovCisJdTggcHdtZW5hYmxlWzNdOworCXU4IHB3bV9tb2RlWzddOwkJLyogaW5kaWNhdGVzIFBXTSBvciBEQyBtb2RlOiAxLT5QV007IDAtPkRDICovCisJdTMyIGFsYXJtczsJCS8qIHJlYWx0aW1lIHN0YXR1cyByZWdpc3RlciBlbmNvZGluZyxjb21iaW5lZCAqLworCXU4IGNoYXNzaXM7CQkvKiBDaGFzc2lzIHN0YXR1cyAqLworCXU4IGNoYXNzaXNfY2xlYXI7CS8qIENMUl9DSFMsIGNsZWFyIGNoYXNzaXMgaW50cnVzaW9uIGRldGVjdGlvbiAqLworCXU4IHRoZXJtYWxfY3J1aXNlWzNdOwkvKiBTbWFydCBGYW5JOiBGYW4xLDIsMyB0YXJnZXQgdmFsdWUgKi8KKwl1OCB0b2xlcmFuY2VbM107CS8qIEZhbjEsMiwzIHRvbGVyYW5jZShTbWFydCBGYW4gSS9JSSkgKi8KKwl1OCBzZjJfcG9pbnRzWzNdWzRdOwkvKiBTbWFydCBGYW5JSTogRmFuMSwyLDMgdGVtcGVyYXR1cmUgcG9pbnRzICovCisJdTggc2YyX2xldmVsc1szXVs0XTsJLyogU21hcnQgRmFuSUk6IEZhbjEsMiwzIGR1dHkgY3ljbGUgbGV2ZWxzICovCit9OworCitzdGF0aWMgaW50IHc4Mzc5MmRfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgdzgzNzkyZF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworc3RhdGljIGludCB3ODM3OTJkX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyBpbnQgdzgzNzkyZF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZ2lzdGVyKTsKK3N0YXRpYyBpbnQgdzgzNzkyZF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWdpc3RlciwKKwkJCQl1OCB2YWx1ZSk7CitzdGF0aWMgc3RydWN0IHc4Mzc5MmRfZGF0YSAqdzgzNzkyZF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgdzgzNzkyZF9wcmludF9kZWJ1ZyhzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhLCBzdHJ1Y3QgZGV2aWNlICpkZXYpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHc4Mzc5MmRfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3ODM3OTJkX2RyaXZlciA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJ3ODM3OTJkIiwKKwkuZmxhZ3MgPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlciA9IHc4Mzc5MmRfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQgPSB3ODM3OTJkX2RldGFjaF9jbGllbnQsCit9OworCitzdGF0aWMgbG9uZyBpbl9jb3VudF9mcm9tX3JlZyhpbnQgbnIsIHN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEpCit7CisJdTE2IHZvbF9jb3VudCA9IGRhdGEtPmluW25yXTsKKwl1MTYgbG93X2JpdHMgPSAwOworCXZvbF9jb3VudCA9ICh2b2xfY291bnQgPDwgMik7CisJc3dpdGNoIChucikKKwl7CisJY2FzZSAwOiAgLyogdmluMCAqLworCQlsb3dfYml0cyA9IChkYXRhLT5sb3dfYml0c1swXSkgJiAweDAzOworCQlicmVhazsKKwljYXNlIDE6ICAvKiB2aW4xICovCisJCWxvd19iaXRzID0gKChkYXRhLT5sb3dfYml0c1swXSkgJiAweDBjKSA+PiAyOworCQlicmVhazsKKwljYXNlIDI6ICAvKiB2aW4yICovCisJCWxvd19iaXRzID0gKChkYXRhLT5sb3dfYml0c1swXSkgJiAweDMwKSA+PiA0OworCQlicmVhazsKKwljYXNlIDM6ICAvKiB2aW4zICovCisJCWxvd19iaXRzID0gKChkYXRhLT5sb3dfYml0c1swXSkgJiAweGMwKSA+PiA2OworCQlicmVhazsKKwljYXNlIDQ6ICAvKiB2aW40ICovCisJCWxvd19iaXRzID0gKGRhdGEtPmxvd19iaXRzWzFdKSAmIDB4MDM7CisJCWJyZWFrOworCWNhc2UgNTogIC8qIHZpbjUgKi8KKwkJbG93X2JpdHMgPSAoKGRhdGEtPmxvd19iaXRzWzFdKSAmIDB4MGMpID4+IDI7CisJCWJyZWFrOworCWNhc2UgNjogIC8qIHZpbjYgKi8KKwkJbG93X2JpdHMgPSAoKGRhdGEtPmxvd19iaXRzWzFdKSAmIDB4MzApID4+IDQ7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXZvbF9jb3VudCA9IHZvbF9jb3VudCB8IGxvd19iaXRzOworCXJldHVybiB2b2xfY291bnQ7Cit9CisKKy8qIGZvbGxvd2luZyBhcmUgdGhlIHN5c2ZzIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSB3ODM3OTJkX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVsZFxuIiwgSU5fRlJPTV9SRUcobnIsKGluX2NvdW50X2Zyb21fcmVnKG5yLCBkYXRhKSkpKTsKK30KKworI2RlZmluZSBzaG93X2luX3JlZyhyZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNyZWcoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQkJY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOyBcCisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OyBcCisJc3RydWN0IHc4Mzc5MmRfZGF0YSAqZGF0YSA9IHc4Mzc5MmRfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCIlbGRcbiIsIChsb25nKShJTl9GUk9NX1JFRyhuciwgKGRhdGEtPnJlZ1tucl0pKjQpKSk7IFwKK30KKworc2hvd19pbl9yZWcoaW5fbWluKTsKK3Nob3dfaW5fcmVnKGluX21heCk7CisKKyNkZWZpbmUgc3RvcmVfaW5fcmVnKFJFRywgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBzdG9yZV9pbl8jI3JlZyAoc3RydWN0IGRldmljZSAqZGV2LCBcCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsgXAorCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwl1MzIgdmFsOyBcCisJIFwKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsgXAorCWRhdGEtPmluXyMjcmVnW25yXSA9IFNFTlNPUlNfTElNSVQoSU5fVE9fUkVHKG5yLCB2YWwpLzQsIDAsIDI1NSk7IFwKKwl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfSU5fIyNSRUdbbnJdLCBkYXRhLT5pbl8jI3JlZ1tucl0pOyBcCisJIFwKKwlyZXR1cm4gY291bnQ7IFwKK30KK3N0b3JlX2luX3JlZyhNSU4sIG1pbik7CitzdG9yZV9pbl9yZWcoTUFYLCBtYXgpOworCisjZGVmaW5lIHN5c2ZzX2luX3JlZyhvZmZzZXQpIFwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBcCisJCQkJTlVMTCwgb2Zmc2V0KTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQkJCXNob3dfaW5fbWluLCBzdG9yZV9pbl9taW4sIG9mZnNldCk7IFwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJCQlzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LCBvZmZzZXQpOworCitzeXNmc19pbl9yZWcoMCk7CitzeXNmc19pbl9yZWcoMSk7CitzeXNmc19pbl9yZWcoMik7CitzeXNmc19pbl9yZWcoMyk7CitzeXNmc19pbl9yZWcoNCk7CitzeXNmc19pbl9yZWcoNSk7CitzeXNmc19pbl9yZWcoNik7CitzeXNmc19pbl9yZWcoNyk7CitzeXNmc19pbl9yZWcoOCk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2luKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4jI29mZnNldCMjX2lucHV0LmRldl9hdHRyKTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbiMjb2Zmc2V0IyNfbWF4LmRldl9hdHRyKTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbiMjb2Zmc2V0IyNfbWluLmRldl9hdHRyKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBzaG93X2Zhbl9yZWcocmVnKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBcCisJCQljaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7IFwKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXggLSAxOyBcCisJc3RydWN0IHc4Mzc5MmRfZGF0YSAqZGF0YSA9IHc4Mzc5MmRfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgXAorCQlGQU5fRlJPTV9SRUcoZGF0YS0+cmVnW25yXSwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkpOyBcCit9CisKK3Nob3dfZmFuX3JlZyhmYW4pOworc2hvd19mYW5fcmVnKGZhbl9taW4pOworCitzdGF0aWMgc3NpemVfdAorc3RvcmVfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleCAtIDE7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19GQU5fTUlOW25yXSwKKwkJCQlkYXRhLT5mYW5fbWluW25yXSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSB3ODM3OTJkX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnIgLSAxXSkpOworfQorCisvKiBOb3RlOiB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmYW4gbWluaW11bSBoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBpcworICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gZGl2aXNvci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlIG9mCisgICBsZWFzdCBzdXByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKKyAgIGJlY2F1c2UgdGhlIGRpdmlzb3IgY2hhbmdlZC4gKi8KK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4IC0gMTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIG1pbjsKKwkvKnU4IHJlZzsqLworCXU4IGZhbl9kaXZfcmVnID0gMDsKKwl1OCB0bXBfZmFuX2RpdjsKKworCS8qIFNhdmUgZmFuX21pbiAqLworCW1pbiA9IEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwKKwkJCSAgIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCisJZGF0YS0+ZmFuX2Rpdltucl0gPSBESVZfVE9fUkVHKHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApKTsKKworCWZhbl9kaXZfcmVnID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfRkFOX0RJVltuciA+PiAxXSk7CisJZmFuX2Rpdl9yZWcgJj0gKG5yICYgMHgwMSkgPyAweDhmIDogMHhmODsKKwl0bXBfZmFuX2RpdiA9IChuciAmIDB4MDEpID8gKCgoZGF0YS0+ZmFuX2Rpdltucl0pIDw8IDQpICYgMHg3MCkKKwkJCQkJOiAoKGRhdGEtPmZhbl9kaXZbbnJdKSAmIDB4MDcpOworCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19GQU5fRElWW25yID4+IDFdLAorCQkJCQlmYW5fZGl2X3JlZyB8IHRtcF9mYW5fZGl2KTsKKworCS8qIFJlc3RvcmUgZmFuX21pbiAqLworCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyhtaW4sIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19GQU5fTUlOW25yXSwgZGF0YS0+ZmFuX21pbltucl0pOworCisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX2ZhbihvZmZzZXQpIFwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIFwKKwkJCQlvZmZzZXQpOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfZGl2LCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQkJCXNob3dfZmFuX2Rpdiwgc3RvcmVfZmFuX2Rpdiwgb2Zmc2V0KTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJCQlzaG93X2Zhbl9taW4sIHN0b3JlX2Zhbl9taW4sIG9mZnNldCk7CisKK3N5c2ZzX2ZhbigxKTsKK3N5c2ZzX2ZhbigyKTsKK3N5c2ZzX2ZhbigzKTsKK3N5c2ZzX2Zhbig0KTsKK3N5c2ZzX2Zhbig1KTsKK3N5c2ZzX2Zhbig2KTsKK3N5c2ZzX2Zhbig3KTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19pbnB1dC5kZXZfYXR0cik7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19kaXYuZGV2X2F0dHIpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfbWluLmRldl9hdHRyKTsgXAorfSB3aGlsZSAoMCkKKworCisvKiByZWFkL3dyaXRlIHRoZSB0ZW1wZXJhdHVyZTEsIGluY2x1ZGVzIG1lYXN1cmVkIHZhbHVlIGFuZCBsaW1pdHMgKi8KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gdzgzNzkyZF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVAxX0ZST01fUkVHKGRhdGEtPnRlbXAxW25yXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV90ZW1wMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc5MmRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXMzMiB2YWw7CisKKwl2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZGF0YS0+dGVtcDFbbnJdID0gVEVNUDFfVE9fUkVHKHZhbCk7CisJdzgzNzkyZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX1RFTVAxW25yXSwKKwkJZGF0YS0+dGVtcDFbbnJdKTsKKworCXJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAxLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd190ZW1wMSwKKwkJCQlzdG9yZV90ZW1wMSwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd190ZW1wMSwKKwkJCQlzdG9yZV90ZW1wMSwgMik7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAxKGNsaWVudCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyKTsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heF9oeXN0LmRldl9hdHRyKTsgXAorfSB3aGlsZSAoMCkKKworCisvKiByZWFkL3dyaXRlIHRoZSB0ZW1wZXJhdHVyZTItMywgaW5jbHVkZXMgbWVhc3VyZWQgdmFsdWUgYW5kIGxpbWl0cyAqLworCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAyMyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+bnI7CisJaW50IGluZGV4ID0gc2Vuc29yX2F0dHItPmluZGV4OworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSB3ODM3OTJkX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVsZFxuIiwKKwkJKGxvbmcpVEVNUF9BRERfRlJPTV9SRUcoZGF0YS0+dGVtcF9hZGRbbnJdW2luZGV4XSwKKwkJCWRhdGEtPnRlbXBfYWRkW25yXVtpbmRleCsxXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV90ZW1wMjMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+bnI7CisJaW50IGluZGV4ID0gc2Vuc29yX2F0dHItPmluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc5MmRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXMzMiB2YWw7CisKKwl2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZGF0YS0+dGVtcF9hZGRbbnJdW2luZGV4XSA9IFRFTVBfQUREX1RPX1JFR19ISUdIKHZhbCk7CisJZGF0YS0+dGVtcF9hZGRbbnJdW2luZGV4KzFdID0gVEVNUF9BRERfVE9fUkVHX0xPVyh2YWwpOworCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19URU1QX0FERFtucl1baW5kZXhdLAorCQlkYXRhLT50ZW1wX2FkZFtucl1baW5kZXhdKTsKKwl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfVEVNUF9BRERbbnJdW2luZGV4KzFdLAorCQlkYXRhLT50ZW1wX2FkZFtucl1baW5kZXgrMV0pOworCisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX3RlbXAyMyhuYW1lLGlkeCkgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKG5hbWUjI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wMjMsIE5VTEwsIFwKKwkJCQlpZHgsIDApOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIobmFtZSMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJCQlzaG93X3RlbXAyMywgc3RvcmVfdGVtcDIzLCBpZHgsIDIpOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIobmFtZSMjX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQkJCXNob3dfdGVtcDIzLCBzdG9yZV90ZW1wMjMsIGlkeCwgNCk7CisKK3N5c2ZzX3RlbXAyMyh0ZW1wMiwwKQorc3lzZnNfdGVtcDIzKHRlbXAzLDEpCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXBfYWRkKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcCMjb2Zmc2V0IyNfaW5wdXQuZGV2X2F0dHIpOyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXAjI29mZnNldCMjX21heC5kZXZfYXR0cik7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsIFwKKyZzZW5zb3JfZGV2X2F0dHJfdGVtcCMjb2Zmc2V0IyNfbWF4X2h5c3QuZGV2X2F0dHIpOyBcCit9IHdoaWxlICgwKQorCisKKy8qIGdldCByZWF0aW1lIHN0YXR1cyBvZiBhbGwgc2Vuc29ycyBpdGVtczogdm9sdGFnZSwgdGVtcCwgZmFuICovCitzdGF0aWMgc3NpemVfdAorc2hvd19hbGFybXNfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gdzgzNzkyZF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmFsYXJtcyk7Cit9CisKK3N0YXRpYworREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtc19yZWcsIE5VTEwpOworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKGNsaWVudCkgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisKKworCitzdGF0aWMgc3NpemVfdAorc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSB3ODM3OTJkX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSBQV01fRlJPTV9SRUcoZGF0YS0+cHdtW25yLTFdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3B3bWVuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4IC0gMTsKKwlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gdzgzNzkyZF91cGRhdGVfZGV2aWNlKGRldik7CisJbG9uZyBwd21fZW5hYmxlX3RtcCA9IDE7CisKKwlzd2l0Y2ggKGRhdGEtPnB3bWVuYWJsZVtucl0pIHsKKwljYXNlIDA6CisJCXB3bV9lbmFibGVfdG1wID0gMTsgLyogbWFudWFsIG1vZGUgKi8KKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwd21fZW5hYmxlX3RtcCA9IDM7IC8qdGhlcm1hbCBjcnVpc2UvU21hcnQgRmFuIEkgKi8KKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwd21fZW5hYmxlX3RtcCA9IDI7IC8qIFNtYXJ0IEZhbiBJSSAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIHB3bV9lbmFibGVfdG1wKTsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleCAtIDE7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWRhdGEtPnB3bVtucl0gPSBQV01fVE9fUkVHKHZhbCk7CisJdzgzNzkyZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX1BXTVtucl0sIGRhdGEtPnB3bVtucl0pOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfcHdtZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleCAtIDE7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKwl1OCBmYW5fY2ZnX3RtcCwgY2ZnMV90bXAsIGNmZzJfdG1wLCBjZmczX3RtcCwgY2ZnNF90bXA7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgMToKKwkJZGF0YS0+cHdtZW5hYmxlW25yXSA9IDA7IC8qIG1hbnVhbCBtb2RlICovCisJCWJyZWFrOworCWNhc2UgMjoKKwkJZGF0YS0+cHdtZW5hYmxlW25yXSA9IDI7IC8qIFNtYXJ0IEZhbiBJSSAqLworCQlicmVhazsKKwljYXNlIDM6CisJCWRhdGEtPnB3bWVuYWJsZVtucl0gPSAxOyAvKiB0aGVybWFsIGNydWlzZS9TbWFydCBGYW4gSSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY2ZnMV90bXAgPSBkYXRhLT5wd21lbmFibGVbMF07CisJY2ZnMl90bXAgPSAoZGF0YS0+cHdtZW5hYmxlWzFdKSA8PCAyOworCWNmZzNfdG1wID0gKGRhdGEtPnB3bWVuYWJsZVsyXSkgPDwgNDsKKwljZmc0X3RtcCA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsVzgzNzkyRF9SRUdfRkFOX0NGRykgJiAweGMwOworCWZhbl9jZmdfdG1wID0gKChjZmc0X3RtcCB8IGNmZzNfdG1wKSB8IGNmZzJfdG1wKSB8IGNmZzFfdG1wOworCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19GQU5fQ0ZHLCBmYW5fY2ZnX3RtcCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc3lzZnNfcHdtKG9mZnNldCkgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20jI29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJCQlzaG93X3B3bSwgc3RvcmVfcHdtLCBvZmZzZXQpOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bSMjb2Zmc2V0IyNfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQkJCXNob3dfcHdtZW5hYmxlLCBzdG9yZV9wd21lbmFibGUsIG9mZnNldCk7IFwKKworc3lzZnNfcHdtKDEpOworc3lzZnNfcHdtKDIpOworc3lzZnNfcHdtKDMpOworCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3B3bShjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3B3bSMjb2Zmc2V0LmRldl9hdHRyKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfcHdtZW5hYmxlKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfcHdtIyNvZmZzZXQjI19lbmFibGUuZGV2X2F0dHIpOyBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3B3bV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IHc4Mzc5MmRfZGF0YSAqZGF0YSA9IHc4Mzc5MmRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5wd21fbW9kZVtuci0xXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9wd21fbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXggLSAxOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc5MmRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWw7CisJdTggcHdtX21vZGVfbWFzayA9IDA7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlkYXRhLT5wd21fbW9kZVtucl0gPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMSk7CisJcHdtX21vZGVfbWFzayA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsCisJCVc4Mzc5MkRfUkVHX1BXTVtucl0pICYgMHg3ZjsKKwl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfUFdNW25yXSwKKwkJKChkYXRhLT5wd21fbW9kZVtucl0pIDw8IDcpIHwgcHdtX21vZGVfbWFzayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc3lzZnNfcHdtX21vZGUob2Zmc2V0KSBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bSMjb2Zmc2V0IyNfbW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJCQlzaG93X3B3bV9tb2RlLCBzdG9yZV9wd21fbW9kZSwgb2Zmc2V0KTsKKworc3lzZnNfcHdtX21vZGUoMSk7CitzeXNmc19wd21fbW9kZSgyKTsKK3N5c2ZzX3B3bV9tb2RlKDMpOworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9wd21fbW9kZShjbGllbnQsIG9mZnNldCkgXAorZG8geyBcCitkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3B3bSMjb2Zmc2V0IyNfbW9kZS5kZXZfYXR0cik7IFwKK30gd2hpbGUgKDApCisKKworc3RhdGljIHNzaXplX3QKK3Nob3dfcmVnc19jaGFzc2lzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IHc4Mzc5MmRfZGF0YSAqZGF0YSA9IHc4Mzc5MmRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5jaGFzc2lzKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGNoYXNzaXMsIFNfSVJVR08sIHNob3dfcmVnc19jaGFzc2lzLCBOVUxMKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfY2hhc3NpcyhjbGllbnQpIFwKK2RvIHsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2NoYXNzaXMpOyBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2NoYXNzaXNfY2xlYXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSB3ODM3OTJkX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+Y2hhc3Npc19jbGVhcik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9jaGFzc2lzX2NsZWFyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsOworCXU4IHRlbXAxID0gMCwgdGVtcDIgPSAwOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkYXRhLT5jaGFzc2lzX2NsZWFyID0gU0VOU09SU19MSU1JVCh2YWwsIDAgLDEpOworCXRlbXAxID0gKChkYXRhLT5jaGFzc2lzX2NsZWFyKSA8PCA3KSAmIDB4ODA7CisJdGVtcDIgPSB3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LAorCQlXODM3OTJEX1JFR19DSEFTU0lTX0NMUikgJiAweDdmOworCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19DSEFTU0lTX0NMUiwgdGVtcDEgfCB0ZW1wMik7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjaGFzc2lzX2NsZWFyLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJc2hvd19jaGFzc2lzX2NsZWFyLCBzdG9yZV9jaGFzc2lzX2NsZWFyKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfY2hhc3Npc19jbGVhcihjbGllbnQpIFwKK2RvIHsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2NoYXNzaXNfY2xlYXIpOyBcCit9IHdoaWxlICgwKQorCisKKworLyogRm9yIFNtYXJ0IEZhbiBJIC8gVGhlcm1hbCBDcnVpc2UgKi8KK3N0YXRpYyBzc2l6ZV90CitzaG93X3RoZXJtYWxfY3J1aXNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IHc4Mzc5MmRfZGF0YSAqZGF0YSA9IHc4Mzc5MmRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgKGxvbmcpZGF0YS0+dGhlcm1hbF9jcnVpc2VbbnItMV0pOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfdGhlcm1hbF9jcnVpc2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4IC0gMTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsOworCXU4IHRhcmdldF90bXA9MCwgdGFyZ2V0X21hc2s9MDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXRhcmdldF90bXAgPSB2YWw7CisJdGFyZ2V0X3RtcCA9IHRhcmdldF90bXAgJiAweDdmOworCXRhcmdldF9tYXNrID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfVEhFUk1BTFtucl0pICYgMHg4MDsKKwlkYXRhLT50aGVybWFsX2NydWlzZVtucl0gPSBTRU5TT1JTX0xJTUlUKHRhcmdldF90bXAsIDAsIDI1NSk7CisJdzgzNzkyZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX1RIRVJNQUxbbnJdLAorCQkoZGF0YS0+dGhlcm1hbF9jcnVpc2VbbnJdKSB8IHRhcmdldF9tYXNrKTsKKworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzeXNmc190aGVybWFsX2NydWlzZShvZmZzZXQpIFwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGhlcm1hbF9jcnVpc2UjI29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJCXNob3dfdGhlcm1hbF9jcnVpc2UsIHN0b3JlX3RoZXJtYWxfY3J1aXNlLCBvZmZzZXQpOworCitzeXNmc190aGVybWFsX2NydWlzZSgxKTsKK3N5c2ZzX3RoZXJtYWxfY3J1aXNlKDIpOworc3lzZnNfdGhlcm1hbF9jcnVpc2UoMyk7CisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3RoZXJtYWxfY3J1aXNlKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsIFwKKyZzZW5zb3JfZGV2X2F0dHJfdGhlcm1hbF9jcnVpc2UjI29mZnNldC5kZXZfYXR0cik7IFwKK30gd2hpbGUgKDApCisKKworLyogRm9yIFNtYXJ0IEZhbiBJL1RoZXJtYWwgQ3J1aXNlIGFuZCBTbWFydCBGYW4gSUkgKi8KK3N0YXRpYyBzc2l6ZV90CitzaG93X3RvbGVyYW5jZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IHc4Mzc5MmRfZGF0YSAqZGF0YSA9IHc4Mzc5MmRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgKGxvbmcpZGF0YS0+dG9sZXJhbmNlW25yLTFdKTsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3RvbGVyYW5jZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleCAtIDE7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKwl1OCB0b2xfdG1wLCB0b2xfbWFzazsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXRvbF9tYXNrID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJVzgzNzkyRF9SRUdfVE9MRVJBTkNFW25yXSkgJiAoKG5yID09IDEpID8gMHgwZiA6IDB4ZjApOworCXRvbF90bXAgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMTUpOworCXRvbF90bXAgJj0gMHgwZjsKKwlkYXRhLT50b2xlcmFuY2VbbnJdID0gdG9sX3RtcDsKKwlpZiAobnIgPT0gMSkgeworCQl0b2xfdG1wIDw8PSA0OworCX0KKwl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfVE9MRVJBTkNFW25yXSwKKwkJdG9sX21hc2sgfCB0b2xfdG1wKTsKKworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzeXNmc190b2xlcmFuY2Uob2Zmc2V0KSBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRvbGVyYW5jZSMjb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQkJCXNob3dfdG9sZXJhbmNlLCBzdG9yZV90b2xlcmFuY2UsIG9mZnNldCk7CisKK3N5c2ZzX3RvbGVyYW5jZSgxKTsKK3N5c2ZzX3RvbGVyYW5jZSgyKTsKK3N5c2ZzX3RvbGVyYW5jZSgzKTsKKworI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfdG9sZXJhbmNlKGNsaWVudCwgb2Zmc2V0KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdG9sZXJhbmNlIyNvZmZzZXQuZGV2X2F0dHIpOyBcCit9IHdoaWxlICgwKQorCisKKy8qIEZvciBTbWFydCBGYW4gSUkgKi8KK3N0YXRpYyBzc2l6ZV90CitzaG93X3NmMl9wb2ludChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPm5yOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gdzgzNzkyZF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZylkYXRhLT5zZjJfcG9pbnRzW2luZGV4LTFdW25yLTFdKTsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3NmMl9wb2ludChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+bnIgLSAxOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleCAtIDE7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbDsKKwl1OCBtYXNrX3RtcCA9IDA7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlkYXRhLT5zZjJfcG9pbnRzW2luZGV4XVtucl0gPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMTI3KTsKKwltYXNrX3RtcCA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCVc4Mzc5MkRfUkVHX1BPSU5UU1tpbmRleF1bbnJdKSAmIDB4ODA7CisJdzgzNzkyZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX1BPSU5UU1tpbmRleF1bbnJdLAorCQltYXNrX3RtcHxkYXRhLT5zZjJfcG9pbnRzW2luZGV4XVtucl0pOworCisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIHN5c2ZzX3NmMl9wb2ludChvZmZzZXQsIGluZGV4KSBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoc2YyX3BvaW50IyNvZmZzZXQjI19mYW4jI2luZGV4LCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQkJCXNob3dfc2YyX3BvaW50LCBzdG9yZV9zZjJfcG9pbnQsIG9mZnNldCwgaW5kZXgpOworCitzeXNmc19zZjJfcG9pbnQoMSwgMSk7CS8qIEZhbjEgKi8KK3N5c2ZzX3NmMl9wb2ludCgyLCAxKTsJLyogRmFuMSAqLworc3lzZnNfc2YyX3BvaW50KDMsIDEpOwkvKiBGYW4xICovCitzeXNmc19zZjJfcG9pbnQoNCwgMSk7CS8qIEZhbjEgKi8KK3N5c2ZzX3NmMl9wb2ludCgxLCAyKTsJLyogRmFuMiAqLworc3lzZnNfc2YyX3BvaW50KDIsIDIpOwkvKiBGYW4yICovCitzeXNmc19zZjJfcG9pbnQoMywgMik7CS8qIEZhbjIgKi8KK3N5c2ZzX3NmMl9wb2ludCg0LCAyKTsJLyogRmFuMiAqLworc3lzZnNfc2YyX3BvaW50KDEsIDMpOwkvKiBGYW4zICovCitzeXNmc19zZjJfcG9pbnQoMiwgMyk7CS8qIEZhbjMgKi8KK3N5c2ZzX3NmMl9wb2ludCgzLCAzKTsJLyogRmFuMyAqLworc3lzZnNfc2YyX3BvaW50KDQsIDMpOwkvKiBGYW4zICovCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3NmMl9wb2ludChjbGllbnQsIG9mZnNldCwgaW5kZXgpIFwKK2RvIHsgXAorZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgXAorJnNlbnNvcl9kZXZfYXR0cl9zZjJfcG9pbnQjI29mZnNldCMjX2ZhbiMjaW5kZXguZGV2X2F0dHIpOyBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3NmMl9sZXZlbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPm5yOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gdzgzNzkyZF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCQkoKChkYXRhLT5zZjJfbGV2ZWxzW2luZGV4LTFdW25yXSkgKiAxMDApIC8gMTUpKTsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3NmMl9sZXZlbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+bnI7CisJaW50IGluZGV4ID0gc2Vuc29yX2F0dHItPmluZGV4IC0gMTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsOworCXU4IG1hc2tfdG1wPTAsIGxldmVsX3RtcD0wOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJZGF0YS0+c2YyX2xldmVsc1tpbmRleF1bbnJdID0gU0VOU09SU19MSU1JVCgodmFsICogMTUpIC8gMTAwLCAwLCAxNSk7CisJbWFza190bXAgPSB3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19MRVZFTFNbaW5kZXhdW25yXSkKKwkJJiAoKG5yPT0zKSA/IDB4ZjAgOiAweDBmKTsKKwlpZiAobnI9PTMpIHsKKwkJbGV2ZWxfdG1wID0gZGF0YS0+c2YyX2xldmVsc1tpbmRleF1bbnJdOworCX0gZWxzZSB7CisJCWxldmVsX3RtcCA9IGRhdGEtPnNmMl9sZXZlbHNbaW5kZXhdW25yXSA8PCA0OworCX0KKwl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfTEVWRUxTW2luZGV4XVtucl0sIGxldmVsX3RtcCB8IG1hc2tfdG1wKTsKKworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzeXNmc19zZjJfbGV2ZWwob2Zmc2V0LCBpbmRleCkgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHNmMl9sZXZlbCMjb2Zmc2V0IyNfZmFuIyNpbmRleCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJCQlzaG93X3NmMl9sZXZlbCwgc3RvcmVfc2YyX2xldmVsLCBvZmZzZXQsIGluZGV4KTsKKworc3lzZnNfc2YyX2xldmVsKDEsIDEpOwkvKiBGYW4xICovCitzeXNmc19zZjJfbGV2ZWwoMiwgMSk7CS8qIEZhbjEgKi8KK3N5c2ZzX3NmMl9sZXZlbCgzLCAxKTsJLyogRmFuMSAqLworc3lzZnNfc2YyX2xldmVsKDEsIDIpOwkvKiBGYW4yICovCitzeXNmc19zZjJfbGV2ZWwoMiwgMik7CS8qIEZhbjIgKi8KK3N5c2ZzX3NmMl9sZXZlbCgzLCAyKTsJLyogRmFuMiAqLworc3lzZnNfc2YyX2xldmVsKDEsIDMpOwkvKiBGYW4zICovCitzeXNmc19zZjJfbGV2ZWwoMiwgMyk7CS8qIEZhbjMgKi8KK3N5c2ZzX3NmMl9sZXZlbCgzLCAzKTsJLyogRmFuMyAqLworCisjZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9zZjJfbGV2ZWwoY2xpZW50LCBvZmZzZXQsIGluZGV4KSBcCitkbyB7IFwKK2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsIFwKKyZzZW5zb3JfZGV2X2F0dHJfc2YyX2xldmVsIyNvZmZzZXQjI19mYW4jI2luZGV4LmRldl9hdHRyKTsgXAorfSB3aGlsZSAoMCkKKworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuOgorICAgICAqIHc4Mzc5MmRfZHJpdmVyIGlzIGluc2VydGVkICh3aGVuIHRoaXMgbW9kdWxlIGlzIGxvYWRlZCksIGZvciBlYWNoCisgICAgICAgYXZhaWxhYmxlIGFkYXB0ZXIKKyAgICAgKiB3aGVuIGEgbmV3IGFkYXB0ZXIgaXMgaW5zZXJ0ZWQgKGFuZCB3ODM3OTJkX2RyaXZlciBpcyBzdGlsbCBwcmVzZW50KSAqLworc3RhdGljIGludAordzgzNzkyZF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIHc4Mzc5MmRfZGV0ZWN0KTsKK30KKworCitzdGF0aWMgaW50Cit3ODM3OTJkX2NyZWF0ZV9zdWJjbGllbnQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCQkJCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LCBpbnQgYWRkciwKKwkJCQlzdHJ1Y3QgaTJjX2NsaWVudCAqKnN1Yl9jbGkpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqc3ViX2NsaWVudDsKKworCSgqc3ViX2NsaSkgPSBzdWJfY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIShzdWJfY2xpZW50KSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHN1Yl9jbGllbnQsIDB4MDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCXN1Yl9jbGllbnQtPmFkZHIgPSAweDQ4ICsgYWRkcjsKKwlpMmNfc2V0X2NsaWVudGRhdGEoc3ViX2NsaWVudCwgTlVMTCk7CisJc3ViX2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJc3ViX2NsaWVudC0+ZHJpdmVyID0gJnc4Mzc5MmRfZHJpdmVyOworCXN1Yl9jbGllbnQtPmZsYWdzID0gMDsKKwlzdHJsY3B5KHN1Yl9jbGllbnQtPm5hbWUsICJ3ODM3OTJkIHN1YmNsaWVudCIsIEkyQ19OQU1FX1NJWkUpOworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoc3ViX2NsaWVudCkpKSB7CisJCWRldl9lcnIoJm5ld19jbGllbnQtPmRldiwgInN1YmNsaWVudCByZWdpc3RyYXRpb24gIgorCQkJImF0IGFkZHJlc3MgMHgleCBmYWlsZWRcbiIsIHN1Yl9jbGllbnQtPmFkZHIpOworCQlrZnJlZShzdWJfY2xpZW50KTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAordzgzNzkyZF9kZXRlY3Rfc3ViY2xpZW50cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCwKKwkJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQpCit7CisJaW50IGksIGlkLCBlcnI7CisJdTggdmFsOworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCk7CisKKwlpZCA9IGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpOworCWlmIChmb3JjZV9zdWJjbGllbnRzWzBdID09IGlkICYmIGZvcmNlX3N1YmNsaWVudHNbMV0gPT0gYWRkcmVzcykgeworCQlmb3IgKGkgPSAyOyBpIDw9IDM7IGkrKykgeworCQkJaWYgKGZvcmNlX3N1YmNsaWVudHNbaV0gPCAweDQ4IHx8CisJCQkgICAgZm9yY2Vfc3ViY2xpZW50c1tpXSA+IDB4NGYpIHsKKwkJCQlkZXZfZXJyKCZuZXdfY2xpZW50LT5kZXYsICJpbnZhbGlkIHN1YmNsaWVudCAiCisJCQkJCSJhZGRyZXNzICVkOyBtdXN0IGJlIDB4NDgtMHg0ZlxuIiwKKwkJCQkJZm9yY2Vfc3ViY2xpZW50c1tpXSk7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIEVSUk9SX1NDXzA7CisJCQl9CisJCX0KKwkJdzgzNzkyZF93cml0ZV92YWx1ZShuZXdfY2xpZW50LCBXODM3OTJEX1JFR19JMkNfU1VCQUREUiwKKwkJCQkJKGZvcmNlX3N1YmNsaWVudHNbMl0gJiAweDA3KSB8CisJCQkJCSgoZm9yY2Vfc3ViY2xpZW50c1szXSAmIDB4MDcpIDw8IDQpKTsKKwl9CisKKwl2YWwgPSB3ODM3OTJkX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgVzgzNzkyRF9SRUdfSTJDX1NVQkFERFIpOworCWlmICghKHZhbCAmIDB4MDgpKSB7CisJCWVyciA9IHc4Mzc5MmRfY3JlYXRlX3N1YmNsaWVudChhZGFwdGVyLCBuZXdfY2xpZW50LCB2YWwgJiAweDcsCisJCQkJCQkmZGF0YS0+bG03NVswXSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBFUlJPUl9TQ18wOworCX0KKwlpZiAoISh2YWwgJiAweDgwKSkgeworCQlpZiAoKGRhdGEtPmxtNzVbMF0gIT0gTlVMTCkgJiYKKwkJCSgodmFsICYgMHg3KSA9PSAoKHZhbCA+PiA0KSAmIDB4NykpKSB7CisJCQlkZXZfZXJyKCZuZXdfY2xpZW50LT5kZXYsICJkdXBsaWNhdGUgYWRkcmVzc2VzIDB4JXgsICIKKwkJCQkidXNlIGZvcmNlX3N1YmNsaWVudFxuIiwgZGF0YS0+bG03NVswXS0+YWRkcik7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBFUlJPUl9TQ18xOworCQl9CisJCWVyciA9IHc4Mzc5MmRfY3JlYXRlX3N1YmNsaWVudChhZGFwdGVyLCBuZXdfY2xpZW50LAorCQkJCQkJKHZhbCA+PiA0KSAmIDB4NywgJmRhdGEtPmxtNzVbMV0pOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gRVJST1JfU0NfMTsKKwl9CisKKwlyZXR1cm4gMDsKKworLyogVW5kbyBpbml0cyBpbiBjYXNlIG9mIGVycm9ycyAqLworCitFUlJPUl9TQ18xOgorCWlmIChkYXRhLT5sbTc1WzBdICE9IE5VTEwpIHsKKwkJaTJjX2RldGFjaF9jbGllbnQoZGF0YS0+bG03NVswXSk7CisJCWtmcmVlKGRhdGEtPmxtNzVbMF0pOworCX0KK0VSUk9SX1NDXzA6CisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50Cit3ODM3OTJkX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlpbnQgaSA9IDAsIHZhbDEgPSAwLCB2YWwyOworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGE7CisJaW50IGVyciA9IDA7CisJY29uc3QgY2hhciAqY2xpZW50X25hbWUgPSAiIjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQlnb3RvIEVSUk9SMDsKKwl9CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIHc4Mzc5MmRfe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCisJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3ODM3OTJkX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBFUlJPUjA7CisJfQorCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHc4Mzc5MmRfZGF0YSkpOworCisJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCWluaXRfTVVURVgoJmRhdGEtPmxvY2spOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZ3ODM3OTJkX2RyaXZlcjsKKwluZXdfY2xpZW50LT5mbGFncyA9IDA7CisKKwkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiAqLworCisJLyogVGhlIHc4Mzc5MmQgbWF5IGJlIHN0dWNrIGluIHNvbWUgb3RoZXIgYmFuayB0aGFuIGJhbmsgMC4gVGhpcyBtYXkKKwkgICBtYWtlIHJlYWRpbmcgb3RoZXIgaW5mb3JtYXRpb24gaW1wb3NzaWJsZS4gU3BlY2lmeSBhIGZvcmNlPS4uLiBvcgorCSAgIGZvcmNlXyo9Li4uIHBhcmFtZXRlciwgYW5kIHRoZSBXaW5ib25kIHdpbGwgYmUgcmVzZXQgdG8gdGhlIHJpZ2h0CisJICAgYmFuay4gKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJaWYgKHc4Mzc5MmRfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBXODM3OTJEX1JFR19DT05GSUcpICYgMHg4MCkgeworCQkJZGV2X3dhcm4oJm5ld19jbGllbnQtPmRldiwgIkRldGVjdGlvbiBmYWlsZWQgYXQgc3RlcCAiCisJCQkJIjNcbiIpOworCQkJZ290byBFUlJPUjE7CisJCX0KKwkJdmFsMSA9IHc4Mzc5MmRfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBXODM3OTJEX1JFR19CQU5LKTsKKwkJdmFsMiA9IHc4Mzc5MmRfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBXODM3OTJEX1JFR19DSElQTUFOKTsKKwkJLyogQ2hlY2sgZm9yIFdpbmJvbmQgSUQgaWYgaW4gYmFuayAwICovCisJCWlmICghKHZhbDEgJiAweDA3KSkgeyAgLyogaXMgQmFuazAgKi8KKwkJCWlmICgoKCEodmFsMSAmIDB4ODApKSAmJiAodmFsMiAhPSAweGEzKSkgfHwKKwkJCSAgICAgKCh2YWwxICYgMHg4MCkgJiYgKHZhbDIgIT0gMHg1YykpKSB7CisJCQkJZ290byBFUlJPUjE7CisJCQl9CisJCX0KKwkJLyogSWYgV2luYm9uZCBjaGlwLCBhZGRyZXNzIG9mIGNoaXAgYW5kIFc4Mzc5MkRfUkVHX0kyQ19BRERSCisJCSAgIHNob3VsZCBtYXRjaCAqLworCQlpZiAodzgzNzkyZF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsCisJCQkJCVc4Mzc5MkRfUkVHX0kyQ19BRERSKSAhPSBhZGRyZXNzKSB7CisJCQlkZXZfd2FybigmbmV3X2NsaWVudC0+ZGV2LCAiRGV0ZWN0aW9uIGZhaWxlZCAiCisJCQkJImF0IHN0ZXAgNVxuIik7CisJCQlnb3RvIEVSUk9SMTsKKwkJfQorCX0KKworCS8qIFdlIGhhdmUgZWl0aGVyIGhhZCBhIGZvcmNlIHBhcmFtZXRlciwgb3Igd2UgaGF2ZSBhbHJlYWR5IGRldGVjdGVkIHRoZQorCSAgIFdpbmJvbmQuIFB1dCBpdCBub3cgaW50byBiYW5rIDAgYW5kIFZlbmRvciBJRCBIaWdoIEJ5dGUgKi8KKwl3ODM3OTJkX3dyaXRlX3ZhbHVlKG5ld19jbGllbnQsCisJCQkgICAgVzgzNzkyRF9SRUdfQkFOSywKKwkJCSAgICAodzgzNzkyZF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsCisJCQkJVzgzNzkyRF9SRUdfQkFOSykgJiAweDc4KSB8IDB4ODApOworCisJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUuICovCisJaWYgKGtpbmQgPD0gMCkgeworCQkvKiBnZXQgdmVuZG9yIElEICovCisJCXZhbDIgPSB3ODM3OTJkX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgVzgzNzkyRF9SRUdfQ0hJUE1BTik7CisJCWlmICh2YWwyICE9IDB4NWMpIHsgIC8qIHRoZSB2ZW5kb3IgaXMgTk9UIFdpbmJvbmQgKi8KKwkJCWdvdG8gRVJST1IxOworCQl9CisJCXZhbDEgPSB3ODM3OTJkX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgVzgzNzkyRF9SRUdfV0NISVBJRCk7CisJCWlmICh2YWwxID09IDB4N2EgJiYgYWRkcmVzcyA+PSAweDJjKSB7CisJCQlraW5kID0gdzgzNzkyZDsKKwkJfSBlbHNlIHsKKwkJCWlmIChraW5kID09IDApCisJCQkJCWRldl93YXJuKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJCSJ3ODM3OTJkOiBJZ25vcmluZyAnZm9yY2UnIHBhcmFtZXRlciBmb3IiCisJCQkJCSIgdW5rbm93biBjaGlwIGF0IGFkYXB0ZXIgJWQsIGFkZHJlc3MiCisJCQkJCSIgMHglMDJ4XG4iLCBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwKKwkJCQkJYWRkcmVzcyk7CisJCQlnb3RvIEVSUk9SMTsKKwkJfQorCX0KKworCWlmIChraW5kID09IHc4Mzc5MmQpIHsKKwkJY2xpZW50X25hbWUgPSAidzgzNzkyZCI7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmbmV3X2NsaWVudC0+ZGV2LCAidzgzNzkyZDogSW50ZXJuYWwgZXJyb3I6IHVua25vd24iCisJCQkJCSAgIiBraW5kICglZCk/IT8iLCBraW5kKTsKKwkJZ290byBFUlJPUjE7CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgY2xpZW50X25hbWUsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnR5cGUgPSBraW5kOworCisJZGF0YS0+dmFsaWQgPSAwOworCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwkJZ290byBFUlJPUjE7CisKKwlpZiAoKGVyciA9IHc4Mzc5MmRfZGV0ZWN0X3N1YmNsaWVudHMoYWRhcHRlciwgYWRkcmVzcywKKwkJCWtpbmQsIG5ld19jbGllbnQpKSkKKwkJZ290byBFUlJPUjI7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjaGlwICovCisJdzgzNzkyZF9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKworCS8qIEEgZmV3IHZhcnMgbmVlZCB0byBiZSBmaWxsZWQgdXBvbiBzdGFydHVwICovCisJZm9yIChpID0gMTsgaSA8PSA3OyBpKyspIHsKKwkJZGF0YS0+ZmFuX21pbltpIC0gMV0gPSB3ODM3OTJkX3JlYWRfdmFsdWUobmV3X2NsaWVudCwKKwkJCQkJVzgzNzkyRF9SRUdfRkFOX01JTltpXSk7CisJfQorCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKKwkJZ290byBFUlJPUjM7CisJfQorCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAwKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDIpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAzKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgNCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDUpOworCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA2KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfaW4obmV3X2NsaWVudCwgNyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2luKG5ld19jbGllbnQsIDgpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDIpOworCWRldmljZV9jcmVhdGVfZmlsZV9mYW4obmV3X2NsaWVudCwgMyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCA0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDUpOworCWRldmljZV9jcmVhdGVfZmlsZV9mYW4obmV3X2NsaWVudCwgNik7CisJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCA3KTsKKworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wMShuZXdfY2xpZW50KTsJCS8qIFRlbXAxICovCisJZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXBfYWRkKG5ld19jbGllbnQsIDIpOwkvKiBUZW1wMiAqLworCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wX2FkZChuZXdfY2xpZW50LCAzKTsJLyogVGVtcDMgKi8KKworCWRldmljZV9jcmVhdGVfZmlsZV9hbGFybXMobmV3X2NsaWVudCk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfcHdtKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV9wd20obmV3X2NsaWVudCwgMik7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3B3bShuZXdfY2xpZW50LCAzKTsKKworCWRldmljZV9jcmVhdGVfZmlsZV9wd21lbmFibGUobmV3X2NsaWVudCwgMSk7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3B3bWVuYWJsZShuZXdfY2xpZW50LCAyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfcHdtZW5hYmxlKG5ld19jbGllbnQsIDMpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX3B3bV9tb2RlKG5ld19jbGllbnQsIDEpOworCWRldmljZV9jcmVhdGVfZmlsZV9wd21fbW9kZShuZXdfY2xpZW50LCAyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfcHdtX21vZGUobmV3X2NsaWVudCwgMyk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfY2hhc3NpcyhuZXdfY2xpZW50KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfY2hhc3Npc19jbGVhcihuZXdfY2xpZW50KTsKKworCWRldmljZV9jcmVhdGVfZmlsZV90aGVybWFsX2NydWlzZShuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfdGhlcm1hbF9jcnVpc2UobmV3X2NsaWVudCwgMik7CisJZGV2aWNlX2NyZWF0ZV9maWxlX3RoZXJtYWxfY3J1aXNlKG5ld19jbGllbnQsIDMpOworCisJZGV2aWNlX2NyZWF0ZV9maWxlX3RvbGVyYW5jZShuZXdfY2xpZW50LCAxKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfdG9sZXJhbmNlKG5ld19jbGllbnQsIDIpOworCWRldmljZV9jcmVhdGVfZmlsZV90b2xlcmFuY2UobmV3X2NsaWVudCwgMyk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGVfc2YyX3BvaW50KG5ld19jbGllbnQsIDEsIDEpOwkvKiBGYW4xICovCisJZGV2aWNlX2NyZWF0ZV9maWxlX3NmMl9wb2ludChuZXdfY2xpZW50LCAyLCAxKTsJLyogRmFuMSAqLworCWRldmljZV9jcmVhdGVfZmlsZV9zZjJfcG9pbnQobmV3X2NsaWVudCwgMywgMSk7CS8qIEZhbjEgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGVfc2YyX3BvaW50KG5ld19jbGllbnQsIDQsIDEpOwkvKiBGYW4xICovCisJZGV2aWNlX2NyZWF0ZV9maWxlX3NmMl9wb2ludChuZXdfY2xpZW50LCAxLCAyKTsJLyogRmFuMiAqLworCWRldmljZV9jcmVhdGVfZmlsZV9zZjJfcG9pbnQobmV3X2NsaWVudCwgMiwgMik7CS8qIEZhbjIgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGVfc2YyX3BvaW50KG5ld19jbGllbnQsIDMsIDIpOwkvKiBGYW4yICovCisJZGV2aWNlX2NyZWF0ZV9maWxlX3NmMl9wb2ludChuZXdfY2xpZW50LCA0LCAyKTsJLyogRmFuMiAqLworCWRldmljZV9jcmVhdGVfZmlsZV9zZjJfcG9pbnQobmV3X2NsaWVudCwgMSwgMyk7CS8qIEZhbjMgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGVfc2YyX3BvaW50KG5ld19jbGllbnQsIDIsIDMpOwkvKiBGYW4zICovCisJZGV2aWNlX2NyZWF0ZV9maWxlX3NmMl9wb2ludChuZXdfY2xpZW50LCAzLCAzKTsJLyogRmFuMyAqLworCWRldmljZV9jcmVhdGVfZmlsZV9zZjJfcG9pbnQobmV3X2NsaWVudCwgNCwgMyk7CS8qIEZhbjMgKi8KKworCWRldmljZV9jcmVhdGVfZmlsZV9zZjJfbGV2ZWwobmV3X2NsaWVudCwgMSwgMSk7CS8qIEZhbjEgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGVfc2YyX2xldmVsKG5ld19jbGllbnQsIDIsIDEpOwkvKiBGYW4xICovCisJZGV2aWNlX2NyZWF0ZV9maWxlX3NmMl9sZXZlbChuZXdfY2xpZW50LCAzLCAxKTsJLyogRmFuMSAqLworCWRldmljZV9jcmVhdGVfZmlsZV9zZjJfbGV2ZWwobmV3X2NsaWVudCwgMSwgMik7CS8qIEZhbjIgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGVfc2YyX2xldmVsKG5ld19jbGllbnQsIDIsIDIpOwkvKiBGYW4yICovCisJZGV2aWNlX2NyZWF0ZV9maWxlX3NmMl9sZXZlbChuZXdfY2xpZW50LCAzLCAyKTsJLyogRmFuMiAqLworCWRldmljZV9jcmVhdGVfZmlsZV9zZjJfbGV2ZWwobmV3X2NsaWVudCwgMSwgMyk7CS8qIEZhbjMgKi8KKwlkZXZpY2VfY3JlYXRlX2ZpbGVfc2YyX2xldmVsKG5ld19jbGllbnQsIDIsIDMpOwkvKiBGYW4zICovCisJZGV2aWNlX2NyZWF0ZV9maWxlX3NmMl9sZXZlbChuZXdfY2xpZW50LCAzLCAzKTsJLyogRmFuMyAqLworCisJcmV0dXJuIDA7CisKK0VSUk9SMzoKKwlpZiAoZGF0YS0+bG03NVswXSAhPSBOVUxMKSB7CisJCWkyY19kZXRhY2hfY2xpZW50KGRhdGEtPmxtNzVbMF0pOworCQlrZnJlZShkYXRhLT5sbTc1WzBdKTsKKwl9CisJaWYgKGRhdGEtPmxtNzVbMV0gIT0gTlVMTCkgeworCQlpMmNfZGV0YWNoX2NsaWVudChkYXRhLT5sbTc1WzFdKTsKKwkJa2ZyZWUoZGF0YS0+bG03NVsxXSk7CisJfQorRVJST1IyOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOworRVJST1IxOgorCWtmcmVlKGRhdGEpOworRVJST1IwOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3c4Mzc5MmRfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgZXJyOworCisJLyogbWFpbiBjbGllbnQgKi8KKwlpZiAoZGF0YSkKKwkJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+Y2xhc3NfZGV2KTsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCisJCXJldHVybiBlcnI7CisKKwkvKiBtYWluIGNsaWVudCAqLworCWlmIChkYXRhKQorCQlrZnJlZShkYXRhKTsKKwkvKiBzdWJjbGllbnQgKi8KKwllbHNlCisJCWtmcmVlKGNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIFNNQnVzIGxvY2tzIGl0c2VsZiwgdXN1YWxseSwgYnV0IG5vdGhpbmcgbWF5IGFjY2VzcyB0aGUgV2luYm9uZCBiZXR3ZWVuCisgICBiYW5rIHN3aXRjaGVzLiBJU0EgYWNjZXNzIG11c3QgYWx3YXlzIGJlIGxvY2tlZCBleHBsaWNpdGx5IQorICAgV2UgaWdub3JlIHRoZSBXODM3OTJEIEJVU1kgZmxhZyBhdCB0aGlzIG1vbWVudCAtIGl0IGNvdWxkIGxlYWQgdG8gZGVhZGxvY2tzLAorICAgd291bGQgc2xvdyBkb3duIHRoZSBXODM3OTJEIGFjY2VzcyBhbmQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkuCisgICBUaGVyZSBhcmUgc29tZSB1Z2x5IHR5cGVjYXN0cyBoZXJlLCBidXQgdGhlIGdvb2QgbmV3cyBpcyAtIHRoZXkgc2hvdWxkCisgICBub3doZXJlIGVsc2UgYmUgbmVjZXNzYXJ5ISAqLworc3RhdGljIGludAordzgzNzkyZF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpbnQgcmVzPTA7CisJcmVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK3c4Mzc5MmRfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCAgdmFsdWUpOworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IFc4Mzc5MkQuIEl0IHNob3VsZCBzZXQgbGltaXRzLCBldGMuICovCitzdGF0aWMgdm9pZAordzgzNzkyZF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXU4IHRlbXAyX2NmZywgdGVtcDNfY2ZnLCB2aWRfaW5fYjsKKworCWlmIChpbml0KSB7CisJCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19DT05GSUcsIDB4ODApOworCX0KKwkvKiBDbGVhciB0aGUgYml0NiBvZiBXODM3OTJEX1JFR19WSURfSU5fQihzZXQgaXQgaW50byAwKToKKwkgICBXODM3OTJEX1JFR19WSURfSU5fQiBiaXQ2ID0gMDogdGhlIGhpZ2gvbG93IGxpbWl0IG9mCisJICAgICB2aW4wL3ZpbjEgY2FuIGJlIG1vZGlmaWVkIGJ5IHVzZXI7CisJICAgVzgzNzkyRF9SRUdfVklEX0lOX0IgYml0NiA9IDE6IHRoZSBoaWdoL2xvdyBsaW1pdCBvZgorCSAgICAgdmluMC92aW4xIGF1dG8tdXBkYXRlZCwgY2FuIE5PVCBiZSBtb2RpZmllZCBieSB1c2VyLiAqLworCXZpZF9pbl9iID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfVklEX0lOX0IpOworCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19WSURfSU5fQiwKKwkJCSAgICB2aWRfaW5fYiAmIDB4YmYpOworCisJdGVtcDJfY2ZnID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfVEVNUDJfQ09ORklHKTsKKwl0ZW1wM19jZmcgPSB3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19URU1QM19DT05GSUcpOworCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19URU1QMl9DT05GSUcsCisJCQkJdGVtcDJfY2ZnICYgMHhlNik7CisJdzgzNzkyZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX1RFTVAzX0NPTkZJRywKKwkJCQl0ZW1wM19jZmcgJiAweGU2KTsKKworCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KKwl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfQ09ORklHLAorCQkJICAgICh3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJVzgzNzkyRF9SRUdfQ09ORklHKSAmIDB4ZjcpCisJCQkgICAgfCAweDAxKTsKK30KKworc3RhdGljIHN0cnVjdCB3ODM3OTJkX2RhdGEgKnc4Mzc5MmRfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGksIGo7CisJdTggcmVnX2FycmF5X3RtcFs0XSwgcHdtX2FycmF5X3RtcFs3XSwgcmVnX3RtcDsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyCisJICAgIChqaWZmaWVzIC0gZGF0YS0+bGFzdF91cGRhdGVkLCAodW5zaWduZWQgbG9uZykgKEhaICogMykpCisJICAgIHx8IHRpbWVfYmVmb3JlKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCkgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWRldl9kYmcoZGV2LCAiU3RhcnRpbmcgZGV2aWNlIHVwZGF0ZVxuIik7CisKKwkJLyogVXBkYXRlIHRoZSB2b2x0YWdlcyBtZWFzdXJlZCB2YWx1ZSBhbmQgbGltaXRzICovCisJCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKwkJCWRhdGEtPmluW2ldID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCVc4Mzc5MkRfUkVHX0lOW2ldKTsKKwkJCWRhdGEtPmluX21heFtpXSA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQlXODM3OTJEX1JFR19JTl9NQVhbaV0pOworCQkJZGF0YS0+aW5fbWluW2ldID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCVc4Mzc5MkRfUkVHX0lOX01JTltpXSk7CisJCX0KKwkJZGF0YS0+bG93X2JpdHNbMF0gPSB3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJVzgzNzkyRF9SRUdfTE9XX0JJVFMxKTsKKwkJZGF0YS0+bG93X2JpdHNbMV0gPSB3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJVzgzNzkyRF9SRUdfTE9XX0JJVFMyKTsKKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQkJLyogVXBkYXRlIHRoZSBGYW4gbWVhc3VyZWQgdmFsdWUgYW5kIGxpbWl0cyAqLworCQkJZGF0YS0+ZmFuW2ldID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCVc4Mzc5MkRfUkVHX0ZBTltpXSk7CisJCQlkYXRhLT5mYW5fbWluW2ldID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCVc4Mzc5MkRfUkVHX0ZBTl9NSU5baV0pOworCQkJLyogVXBkYXRlIHRoZSBQV00vREMgVmFsdWUgYW5kIFBXTS9EQyBmbGFnICovCisJCQlwd21fYXJyYXlfdG1wW2ldID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCVc4Mzc5MkRfUkVHX1BXTVtpXSk7CisJCQlkYXRhLT5wd21baV0gPSBwd21fYXJyYXlfdG1wW2ldICYgMHgwZjsKKwkJCWRhdGEtPnB3bV9tb2RlW2ldID0gKHB3bV9hcnJheV90bXBbaV0gPj4gNykgJiAweDAxOworCQl9CisKKwkJcmVnX3RtcCA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX0ZBTl9DRkcpOworCQlkYXRhLT5wd21lbmFibGVbMF0gPSByZWdfdG1wICYgMHgwMzsKKwkJZGF0YS0+cHdtZW5hYmxlWzFdID0gKHJlZ190bXA+PjIpICYgMHgwMzsKKwkJZGF0YS0+cHdtZW5hYmxlWzJdID0gKHJlZ190bXA+PjQpICYgMHgwMzsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlkYXRhLT50ZW1wMVtpXSA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkJVzgzNzkyRF9SRUdfVEVNUDFbaV0pOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCA2OyBqKyspIHsKKwkJCQlkYXRhLT50ZW1wX2FkZFtpXVtqXSA9IHc4Mzc5MmRfcmVhZF92YWx1ZSgKKwkJCQkJY2xpZW50LFc4Mzc5MkRfUkVHX1RFTVBfQUREW2ldW2pdKTsKKwkJCX0KKwkJfQorCisJCS8qIFVwZGF0ZSB0aGUgRmFuIERpdmlzb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJcmVnX2FycmF5X3RtcFtpXSA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkJVzgzNzkyRF9SRUdfRkFOX0RJVltpXSk7CisJCX0KKwkJZGF0YS0+ZmFuX2RpdlswXSA9IHJlZ19hcnJheV90bXBbMF0gJiAweDA3OworCQlkYXRhLT5mYW5fZGl2WzFdID0gKHJlZ19hcnJheV90bXBbMF0gPj4gNCkgJiAweDA3OworCQlkYXRhLT5mYW5fZGl2WzJdID0gcmVnX2FycmF5X3RtcFsxXSAmIDB4MDc7CisJCWRhdGEtPmZhbl9kaXZbM10gPSAocmVnX2FycmF5X3RtcFsxXSA+PiA0KSAmIDB4MDc7CisJCWRhdGEtPmZhbl9kaXZbNF0gPSByZWdfYXJyYXlfdG1wWzJdICYgMHgwNzsKKwkJZGF0YS0+ZmFuX2Rpdls1XSA9IChyZWdfYXJyYXlfdG1wWzJdID4+IDQpICYgMHgwNzsKKwkJZGF0YS0+ZmFuX2Rpdls2XSA9IHJlZ19hcnJheV90bXBbM10gJiAweDA3OworCisJCS8qIFVwZGF0ZSB0aGUgcmVhbHRpbWUgc3RhdHVzICovCisJCWRhdGEtPmFsYXJtcyA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX0FMQVJNMSkgKworCQkJKHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX0FMQVJNMikgPDwgOCkgKworCQkJKHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX0FMQVJNMykgPDwgMTYpOworCisJCS8qIFVwZGF0ZSBDYXNlT3BlbiBzdGF0dXMgYW5kIGl0J3MgQ0xSX0NIUy4gKi8KKwkJZGF0YS0+Y2hhc3NpcyA9ICh3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJVzgzNzkyRF9SRUdfQ0hBU1NJUykgPj4gNSkgJiAweDAxOworCQlkYXRhLT5jaGFzc2lzX2NsZWFyID0gKHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsCisJCQlXODM3OTJEX1JFR19DSEFTU0lTX0NMUikgPj4gNykgJiAweDAxOworCisJCS8qIFVwZGF0ZSBUaGVybWFsIENydWlzZS9TbWFydCBGYW4gSSB0YXJnZXQgdmFsdWUgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJZGF0YS0+dGhlcm1hbF9jcnVpc2VbaV0gPQorCQkJCXc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJVzgzNzkyRF9SRUdfVEhFUk1BTFtpXSkgJiAweDdmOworCQl9CisKKwkJLyogVXBkYXRlIFNtYXJ0IEZhbiBJL0lJIHRvbGVyYW5jZSAqLworCQlyZWdfdG1wID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfVE9MRVJBTkNFWzBdKTsKKwkJZGF0YS0+dG9sZXJhbmNlWzBdID0gcmVnX3RtcCAmIDB4MGY7CisJCWRhdGEtPnRvbGVyYW5jZVsxXSA9IChyZWdfdG1wID4+IDQpICYgMHgwZjsKKwkJZGF0YS0+dG9sZXJhbmNlWzJdID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJVzgzNzkyRF9SRUdfVE9MRVJBTkNFWzJdKSAmIDB4MGY7CisKKwkJLyogVXBkYXRlIFNtYXJ0IEZhbiBJSSB0ZW1wZXJhdHVyZSBwb2ludHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQkJCWRhdGEtPnNmMl9wb2ludHNbaV1bal0gPSB3ODM3OTJkX3JlYWRfdmFsdWUoCisJCQkJCWNsaWVudCxXODM3OTJEX1JFR19QT0lOVFNbaV1bal0pICYgMHg3ZjsKKwkJCX0KKwkJfQorCisJCS8qIFVwZGF0ZSBTbWFydCBGYW4gSUkgZHV0eSBjeWNsZSBsZXZlbHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJcmVnX3RtcCA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQlXODM3OTJEX1JFR19MRVZFTFNbaV1bMF0pOworCQkJZGF0YS0+c2YyX2xldmVsc1tpXVswXSA9IHJlZ190bXAgJiAweDBmOworCQkJZGF0YS0+c2YyX2xldmVsc1tpXVsxXSA9IChyZWdfdG1wID4+IDQpICYgMHgwZjsKKwkJCXJlZ190bXAgPSB3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJVzgzNzkyRF9SRUdfTEVWRUxTW2ldWzJdKTsKKwkJCWRhdGEtPnNmMl9sZXZlbHNbaV1bMl0gPSAocmVnX3RtcCA+PiA0KSAmIDB4MGY7CisJCQlkYXRhLT5zZjJfbGV2ZWxzW2ldWzNdID0gcmVnX3RtcCAmIDB4MGY7CisJCX0KKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworI2lmZGVmIERFQlVHCisJdzgzNzkyZF9wcmludF9kZWJ1ZyhkYXRhLCBkZXYpOworI2VuZGlmCisKKwlyZXR1cm4gZGF0YTsKK30KKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCB3ODM3OTJkX3ByaW50X2RlYnVnKHN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgaT0wLCBqPTA7CisJZGV2X2RiZyhkZXYsICI9PT09PT09PT09VGhlIGZvbGxvd2luZyBpcyB0aGUgZGVidWcgbWVzc2FnZS4uLj09PT09PT09XG4iKTsKKwlkZXZfZGJnKGRldiwgIjkgc2V0IG9mIFZvbHRhZ2VzOiA9PT09PT5cbiIpOworCWZvciAoaT0wOyBpPDk7IGkrKykgeworCQlkZXZfZGJnKGRldiwgInZpblslZF0gaXM6IDB4JXhcbiIsIGksIGRhdGEtPmluW2ldKTsKKwkJZGV2X2RiZyhkZXYsICJ2aW5bJWRdIG1heCBpczogMHgleFxuIiwgaSwgZGF0YS0+aW5fbWF4W2ldKTsKKwkJZGV2X2RiZyhkZXYsICJ2aW5bJWRdIG1pbiBpczogMHgleFxuIiwgaSwgZGF0YS0+aW5fbWluW2ldKTsKKwl9CisJZGV2X2RiZyhkZXYsICJMb3cgQml0MSBpczogMHgleFxuIiwgZGF0YS0+bG93X2JpdHNbMF0pOworCWRldl9kYmcoZGV2LCAiTG93IEJpdDIgaXM6IDB4JXhcbiIsIGRhdGEtPmxvd19iaXRzWzFdKTsKKwlkZXZfZGJnKGRldiwgIjcgc2V0IG9mIEZhbiBDb3VudHMgYW5kIER1dHkgQ3ljbGVzOiA9PT09PT5cbiIpOworCWZvciAoaT0wOyBpPDc7IGkrKykgeworCQlkZXZfZGJnKGRldiwgImZhblslZF0gaXM6IDB4JXhcbiIsIGksIGRhdGEtPmZhbltpXSk7CisJCWRldl9kYmcoZGV2LCAiZmFuWyVkXSBtaW4gaXM6IDB4JXhcbiIsIGksIGRhdGEtPmZhbl9taW5baV0pOworCQlkZXZfZGJnKGRldiwgInB3bVslZF0gICAgIGlzOiAweCV4XG4iLCBpLCBkYXRhLT5wd21baV0pOworCQlkZXZfZGJnKGRldiwgInB3bV9tb2RlWyVkXSBpczogMHgleFxuIiwgaSwgZGF0YS0+cHdtX21vZGVbaV0pOworCX0KKwlkZXZfZGJnKGRldiwgIjMgc2V0IG9mIFRlbXBlcmF0dXJlczogPT09PT0+XG4iKTsKKwlmb3IgKGk9MDsgaTwzOyBpKyspIHsKKwkJZGV2X2RiZyhkZXYsICJ0ZW1wMVslZF0gaXM6IDB4JXhcbiIsIGksIGRhdGEtPnRlbXAxW2ldKTsKKwl9CisKKwlmb3IgKGk9MDsgaTwyOyBpKyspIHsKKwkJZm9yIChqPTA7IGo8NjsgaisrKSB7CisJCQlkZXZfZGJnKGRldiwgInRlbXBfYWRkWyVkXVslZF0gaXM6IDB4JXhcbiIsIGksIGosCisJCQkJCQkJZGF0YS0+dGVtcF9hZGRbaV1bal0pOworCQl9CisJfQorCisJZm9yIChpPTA7IGk8NzsgaSsrKSB7CisJCWRldl9kYmcoZGV2LCAiZmFuX2RpdlslZF0gaXM6IDB4JXhcbiIsIGksIGRhdGEtPmZhbl9kaXZbaV0pOworCX0KKwlkZXZfZGJnKGRldiwgIj09PT09PT09PT1FbmQgb2YgdGhlIGRlYnVnIG1lc3NhZ2UuLi49PT09PT09PT09PT09PT09PT1cbiIpOworCWRldl9kYmcoZGV2LCAiXG4iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdAorc2Vuc29yc193ODM3OTJkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnc4Mzc5MmRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitzZW5zb3JzX3c4Mzc5MmRfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZ3ODM3OTJkX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkNodW5oYW8gSHVhbmcgQCBXaW5ib25kIDxEWlNoZW5AV2luYm9uZC5jb20udHc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlc4Mzc5MkFEL0QgZHJpdmVyIGZvciBsaW51eC0yLjYiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc193ODM3OTJkX2luaXQpOworbW9kdWxlX2V4aXQoc2Vuc29yc193ODM3OTJkX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4M2w3ODV0cy5jIGIvZHJpdmVycy9od21vbi93ODNsNzg1dHMuYwppbmRleCA0NDY5ZDUyLi4xMzNlMzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4M2w3ODV0cy5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzbDc4NXRzLmMKQEAgLTM2LDcgKzM2LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAvKiBIb3cgbWFueSByZXRyaWVzIG9uIHJlZ2lzdGVyIHJlYWQgZXJyb3IgKi8KICNkZWZpbmUgTUFYX1JFVFJJRVMJNQpAQCAtNDcsMTMgKzQ4LDEyIEBACiAgKi8KIAogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyZSwgSTJDX0NMSUVOVF9FTkQgfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKIAogLyoKICAqIEluc21vZCBwYXJhbWV0ZXJzCiAgKi8KIAotU0VOU09SU19JTlNNT0RfMSh3ODNsNzg1dHMpOworSTJDX0NMSUVOVF9JTlNNT0RfMSh3ODNsNzg1dHMpOwogCiAvKgogICogVGhlIFc4M0w3ODVUUy1TIHJlZ2lzdGVycwpAQCAtMTA1LDYgKzEwNSw3IEBACiAKIHN0cnVjdCB3ODNsNzg1dHNfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwogCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLwpAQCAtMTQwLDcgKzE0MSw3IEBACiB7CiAJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCB3ODNsNzg1dHNfZGV0ZWN0KTsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIHc4M2w3ODV0c19kZXRlY3QpOwogfQogCiAvKgpAQCAtMjM5LDExICsyNDAsMTkgQEAKIAkgKi8KIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gZXhpdF9kZXRhY2g7CisJfQorCiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOwogCiAJcmV0dXJuIDA7CiAKK2V4aXRfZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOwogZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKQEAgLTI1MiwxNSArMjYxLDE1IEBACiAKIHN0YXRpYyBpbnQgdzgzbDc4NXRzX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKKwlzdHJ1Y3QgdzgzbDc4NXRzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKLQkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CiAKLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKKwkJcmV0dXJuIGVycjsKKworCWtmcmVlKGRhdGEpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL01ha2VmaWxlCmluZGV4IGNkMTcwMzkuLjcxYzVhODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL01ha2VmaWxlCkBAIC00LDEyICs0LDggQEAKIAogb2JqLSQoQ09ORklHX0kyQykJCSs9IGkyYy1jb3JlLm8KIG9iai0kKENPTkZJR19JMkNfQ0hBUkRFVikJKz0gaTJjLWRldi5vCi1vYmotJChDT05GSUdfSTJDX1NFTlNPUikJKz0gaTJjLXNlbnNvci5vCiBvYmoteQkJCQkrPSBidXNzZXMvIGNoaXBzLyBhbGdvcy8KIAotaTJjLXNlbnNvci1vYmpzIDo9IGkyYy1zZW5zb3ItZGV0ZWN0Lm8gaTJjLXNlbnNvci12aWQubwotCi0KIGlmZXEgKCQoQ09ORklHX0kyQ19ERUJVR19DT1JFKSx5KQogRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1iaXQuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCmluZGV4IGZiNWI3MzIuLmRmMDVkZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCkBAIC01MTksOCArNTE5LDYgQEAKIC8qIC0tLS0tZXhwb3J0ZWQgYWxnb3JpdGhtIGRhdGE6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGkyY19iaXRfYWxnbyA9IHsKLQkubmFtZQkJPSAiQml0LXNoaWZ0IGFsZ29yaXRobSIsCi0JLmlkCQk9IEkyQ19BTEdPX0JJVCwKIAkubWFzdGVyX3hmZXIJPSBiaXRfeGZlciwKIAkuZnVuY3Rpb25hbGl0eQk9IGJpdF9mdW5jLAogfTsKQEAgLTU0MSw4ICs1MzksNiBAQAogCURFQjIoZGV2X2RiZygmYWRhcC0+ZGV2LCAiaHcgcm91dGluZXMgcmVnaXN0ZXJlZC5cbiIpKTsKIAogCS8qIHJlZ2lzdGVyIG5ldyBhZGFwdGVyIHRvIGkyYyBtb2R1bGUuLi4gKi8KLQotCWFkYXAtPmlkIHw9IGkyY19iaXRfYWxnby5pZDsKIAlhZGFwLT5hbGdvID0gJmkyY19iaXRfYWxnbzsKIAogCWFkYXAtPnRpbWVvdXQgPSAxMDA7CS8qIGRlZmF1bHQgdmFsdWVzLCBzaG91bGQJKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWl0ZS5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28taXRlLmMKaW5kZXggZTZjYWUzOS4uMmRiN2JmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28taXRlLmMKKysrIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28taXRlLmMKQEAgLTcxMyw4ICs3MTMsNiBAQAogLyogLS0tLS1leHBvcnRlZCBhbGdvcml0aG0gZGF0YTogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gaWljX2FsZ28gPSB7Ci0JLm5hbWUJCT0gIklURSBJSUMgYWxnb3JpdGhtIiwKLQkuaWQJCT0gSTJDX0FMR09fSUlDLAogCS5tYXN0ZXJfeGZlcgk9IGlpY194ZmVyLAogCS5hbGdvX2NvbnRyb2wJPSBhbGdvX2NvbnRyb2wsIC8qIGlvY3RsICovCiAJLmZ1bmN0aW9uYWxpdHkJPSBpaWNfZnVuYywKQEAgLTczOCw4ICs3MzYsNiBAQAogCSAgICAgICAgICAgIGFkYXAtPm5hbWUpKTsKIAogCS8qIHJlZ2lzdGVyIG5ldyBhZGFwdGVyIHRvIGkyYyBtb2R1bGUuLi4gKi8KLQotCWFkYXAtPmlkIHw9IGlpY19hbGdvLmlkOwogCWFkYXAtPmFsZ28gPSAmaWljX2FsZ287CiAKIAlhZGFwLT50aW1lb3V0ID0gMTAwOwkvKiBkZWZhdWx0IHZhbHVlcywgc2hvdWxkCSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2EuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5jCmluZGV4IGNjM2E5NTIuLmJlYjEwZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5jCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5jCkBAIC0xODcsMTIgKzE4NywxNCBAQAogCWludCBudW1ieXRlcyA9IDA7CiAJaW50IHN0YXRlOwogCWludCByZXQ7CisJaW50IHRpbWVvdXQgPSAxMDA7CiAKLQlzdGF0ZSA9IHBjYV9zdGF0dXMoYWRhcCk7Ci0JaWYgKCBzdGF0ZSAhPSAweEY4ICkgewotCQlkZXZfZGJnKCZpMmNfYWRhcC0+ZGV2LCAiYnVzIGlzIG5vdCBpZGxlLiBzdGF0dXMgaXMgJSMwNHhcbiIsIHN0YXRlICk7Ci0JCS8qIEZJWE1FOiB3aGF0IHRvIGRvLiBGb3JjZSBzdG9wID8gKi8KLQkJcmV0dXJuIC1FUkVNT1RFSU87CisJd2hpbGUgKChzdGF0ZSA9IHBjYV9zdGF0dXMoYWRhcCkpICE9IDB4ZjggJiYgdGltZW91dC0tKSB7CisJCW1zbGVlcCgxMCk7CisJfQorCWlmIChzdGF0ZSAhPSAweGY4KSB7CisJCWRldl9kYmcoJmkyY19hZGFwLT5kZXYsICJidXMgaXMgbm90IGlkbGUuIHN0YXR1cyBpcyAlIzA0eFxuIiwgc3RhdGUpOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlERUIxKCJ7e3sgWEZFUiAlZCBtZXNzYWdlc1xuIiwgbnVtKTsKQEAgLTM1NCw4ICszNTYsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gcGNhX2FsZ28gPSB7Ci0JLm5hbWUJCT0gIlBDQTk1NjQgYWxnb3JpdGhtIiwKLQkuaWQJCT0gSTJDX0FMR09fUENBLAogCS5tYXN0ZXJfeGZlcgk9IHBjYV94ZmVyLAogCS5mdW5jdGlvbmFsaXR5CT0gcGNhX2Z1bmMsCiB9OwpAQCAtMzY5LDggKzM2OSw2IEBACiAJaW50IHJ2YWw7CiAKIAkvKiByZWdpc3RlciBuZXcgYWRhcHRlciB0byBpMmMgbW9kdWxlLi4uICovCi0KLQlhZGFwLT5pZCB8PSBwY2FfYWxnby5pZDsKIAlhZGFwLT5hbGdvID0gJnBjYV9hbGdvOwogCiAJYWRhcC0+dGltZW91dCA9IDEwMDsJCS8qIGRlZmF1bHQgdmFsdWVzLCBzaG91bGQJKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjZi5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNmLmMKaW5kZXggOGQwODdkYS4uNmU0OThkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNmLmMKKysrIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNmLmMKQEAgLTQ1OSw4ICs0NTksNiBAQAogLyogLS0tLS1leHBvcnRlZCBhbGdvcml0aG0gZGF0YTogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gcGNmX2FsZ28gPSB7Ci0JLm5hbWUJCT0gIlBDRjg1ODQgYWxnb3JpdGhtIiwKLQkuaWQJCT0gSTJDX0FMR09fUENGLAogCS5tYXN0ZXJfeGZlcgk9IHBjZl94ZmVyLAogCS5mdW5jdGlvbmFsaXR5CT0gcGNmX2Z1bmMsCiB9OwpAQCAtNDc2LDggKzQ3NCw2IEBACiAJREVCMihkZXZfZGJnKCZhZGFwLT5kZXYsICJodyByb3V0aW5lcyByZWdpc3RlcmVkLlxuIikpOwogCiAJLyogcmVnaXN0ZXIgbmV3IGFkYXB0ZXIgdG8gaTJjIG1vZHVsZS4uLiAqLwotCi0JYWRhcC0+aWQgfD0gcGNmX2FsZ28uaWQ7CiAJYWRhcC0+YWxnbyA9ICZwY2ZfYWxnbzsKIAogCWFkYXAtPnRpbWVvdXQgPSAxMDA7CQkvKiBkZWZhdWx0IHZhbHVlcywgc2hvdWxkCSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1zZ2kuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXNnaS5jCmluZGV4IDQyMjcyMWIuLjkzMmM0ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXNnaS5jCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXNnaS5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJCWVyciA9IGkyY193cml0ZShhZGFwLCBwLT5idWYsIHAtPmxlbik7CiAJfQogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogaTsKIH0KIAogc3RhdGljIHUzMiBzZ2lfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCkBAIC0xNTgsOCArMTU4LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNnaV9hbGdvID0gewotCS5uYW1lCQk9ICJTR0kgYWxnb3JpdGhtIiwKLQkuaWQJCT0gSTJDX0FMR09fU0dJLAogCS5tYXN0ZXJfeGZlcgk9IHNnaV94ZmVyLAogCS5mdW5jdGlvbmFsaXR5CT0gc2dpX2Z1bmMsCiB9OwpAQCAtMTY5LDcgKzE2Nyw2IEBACiAgKi8KIGludCBpMmNfc2dpX2FkZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQogewotCWFkYXAtPmlkIHw9IHNnaV9hbGdvLmlkOwogCWFkYXAtPmFsZ28gPSAmc2dpX2FsZ287CiAKIAlyZXR1cm4gaTJjX2FkZF9hZGFwdGVyKGFkYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tc2lieXRlLmMgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1zaWJ5dGUuYwppbmRleCBmMjc4NTQ5Li44ZWQ1YWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1zaWJ5dGUuYworKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1zaWJ5dGUuYwpAQCAtMTM1LDggKzEzNSw2IEBACiAvKiAtLS0tLWV4cG9ydGVkIGFsZ29yaXRobSBkYXRhOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpMmNfc2lieXRlX2FsZ28gPSB7Ci0JLm5hbWUJCT0gIlNpQnl0ZSBhbGdvcml0aG0iLAotCS5pZAkJPSBJMkNfQUxHT19TSUJZVEUsCiAJLnNtYnVzX3hmZXIJPSBzbWJ1c194ZmVyLAogCS5hbGdvX2NvbnRyb2wJPSBhbGdvX2NvbnRyb2wsIC8qIGlvY3RsICovCiAJLmZ1bmN0aW9uYWxpdHkJPSBiaXRfZnVuYywKQEAgLTE1MSw4ICsxNDksNiBAQAogCXN0cnVjdCBpMmNfYWxnb19zaWJ5dGVfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CiAKIAkvKiByZWdpc3RlciBuZXcgYWRhcHRlciB0byBpMmMgbW9kdWxlLi4uICovCi0KLQlpMmNfYWRhcC0+aWQgfD0gaTJjX3NpYnl0ZV9hbGdvLmlkOwogCWkyY19hZGFwLT5hbGdvID0gJmkyY19zaWJ5dGVfYWxnbzsKICAgICAgICAgCiAgICAgICAgIC8qIFNldCB0aGUgZnJlcXVlbmN5IHRvIDEwMCBrSHogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKaW5kZXggOTE2YmE1ZS4uODMzNDQ5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTE0NCw2ICsxNDQsMjIgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGkyYy1pODEwLgogCitjb25maWcgSTJDX1BYQQorCXRyaXN0YXRlICJJbnRlbCBQWEEyWFggSTJDIGFkYXB0ZXIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMICYmIEFSQ0hfUFhBCisJaGVscAorCSAgSWYgeW91IGhhdmUgZGV2aWNlcyBpbiB0aGUgUFhBIEkyQyBidXMsIHNheSB5ZXMgdG8gdGhpcyBvcHRpb24uCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtcHhhLgorCitjb25maWcgSTJDX1BYQV9TTEFWRQorCWJvb2wgIkludGVsIFBYQTJYWCBJMkMgU2xhdmUgY29tbXMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQ19QWEEKKwloZWxwCisJICBTdXBwb3J0IEkyQyBzbGF2ZSBtb2RlIGNvbW11bmljYXRpb25zIG9uIHRoZSBQWEEgSTJDIGJ1cy4gIFRoaXMKKwkgIGlzIG5lY2Vzc2FyeSBmb3Igc3lzdGVtcyB3aGVyZSB0aGUgUFhBIG1heSBiZSBhIHRhcmdldCBvbiB0aGUKKwkgIEkyQyBidXMuCisKIGNvbmZpZyBJMkNfUElJWDQKIAl0cmlzdGF0ZSAiSW50ZWwgUElJWDQiCiAJZGVwZW5kcyBvbiBJMkMgJiYgUENJCkBAIC0xODIsMTQgKzE5OCw4IEBACiAJICB3aWxsIGJlIGNhbGxlZCBpMmMtaW9wM3h4LgogCiBjb25maWcgSTJDX0lTQQotCXRyaXN0YXRlICJJU0EgQnVzIHN1cHBvcnQiCisJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIGkyYwotCSAgaW50ZXJmYWNlcyB0aGF0IGFyZSBvbiB0aGUgSVNBIGJ1cy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWlzYS4KIAogY29uZmlnIEkyQ19JVEUKIAl0cmlzdGF0ZSAiSVRFIEkyQyBBZGFwdGVyIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCmluZGV4IDQyZDZkODEuLjk4MGIzZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKQEAgLTI4LDYgKzI4LDcgQEAKIG9iai0kKENPTkZJR19JMkNfUENBX0lTQSkJKz0gaTJjLXBjYS1pc2Eubwogb2JqLSQoQ09ORklHX0kyQ19QSUlYNCkJCSs9IGkyYy1waWl4NC5vCiBvYmotJChDT05GSUdfSTJDX1BST1NBVkFHRSkJKz0gaTJjLXByb3NhdmFnZS5vCitvYmotJChDT05GSUdfSTJDX1BYQSkJCSs9IGkyYy1weGEubwogb2JqLSQoQ09ORklHX0kyQ19SUFhMSVRFKQkrPSBpMmMtcnB4Lm8KIG9iai0kKENPTkZJR19JMkNfUzNDMjQxMCkJKz0gaTJjLXMzYzI0MTAubwogb2JqLSQoQ09ORklHX0kyQ19TQVZBR0U0KQkrPSBpMmMtc2F2YWdlNC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1MzUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTUzNS5jCmluZGV4IGY2MzRhMDcuLmYwMjFhY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTUzNS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTUzNS5jCkBAIC00NzIsOCArNDcyLDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKLQkubmFtZQkJPSAiTm9uLWkyYyBTTUJ1cyBhZGFwdGVyIiwKLQkuaWQJCT0gSTJDX0FMR09fU01CVVMsCiAJLnNtYnVzX3hmZXIJPSBhbGkxNTM1X2FjY2VzcywKIAkuZnVuY3Rpb25hbGl0eQk9IGFsaTE1MzVfZnVuYywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1NjMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCmluZGV4IGZkZDg4MWEuLjg2OTQ3NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCkBAIC0zNjYsOCArMzY2LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGFsaTE1NjNfYWxnb3JpdGhtID0gewotCS5uYW1lCQk9ICJOb24taTJjIFNNQnVzIGFkYXB0ZXIiLAotCS5pZAkJPSBJMkNfQUxHT19TTUJVUywKIAkuc21idXNfeGZlcgk9IGFsaTE1NjNfYWNjZXNzLAogCS5mdW5jdGlvbmFsaXR5CT0gYWxpMTU2M19mdW5jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTV4My5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbGkxNXgzLmMKaW5kZXggMGY3ODFhMS4uYjNmNTBiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbGkxNXgzLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbGkxNXgzLmMKQEAgLTQ2Miw4ICs0NjIsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0gewotCS5uYW1lCQk9ICJOb24tSTJDIFNNQnVzIGFkYXB0ZXIiLAotCS5pZAkJPSBJMkNfQUxHT19TTUJVUywKIAkuc21idXNfeGZlcgk9IGFsaTE1eDNfYWNjZXNzLAogCS5mdW5jdGlvbmFsaXR5CT0gYWxpMTV4M19mdW5jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni5jCmluZGV4IDYzNDdlYmMuLjZhZDA2MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYuYwpAQCAtMjk1LDggKzI5NSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7Ci0JLm5hbWUJCT0gIk5vbi1JMkMgU01CdXMgYWRhcHRlciIsCi0JLmlkCQk9IEkyQ19BTEdPX1NNQlVTLAogCS5zbWJ1c194ZmVyCT0gYW1kNzU2X2FjY2VzcywKIAkuZnVuY3Rpb25hbGl0eQk9IGFtZDc1Nl9mdW5jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kODExMS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ4MTExLmMKaW5kZXggZDY2NDQ0OC4uNDVlYTI0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ4MTExLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ4MTExLmMKQEAgLTMyMyw4ICszMjMsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0gewotCS5uYW1lID0gIk5vbi1JMkMgU01CdXMgMi4wIGFkYXB0ZXIiLAotCS5pZCA9IEkyQ19BTEdPX1NNQlVTLAogCS5zbWJ1c194ZmVyID0gYW1kODExMV9hY2Nlc3MsCiAJLmZ1bmN0aW9uYWxpdHkgPSBhbWQ4MTExX2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdTE1NTAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXUxNTUwLmMKaW5kZXggYTdmZjExMi4uZDA2ZWRjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdTE1NTAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF1MTU1MC5jCkBAIC0yODMsOCArMjgzLDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGF1MTU1MF9hbGdvID0gewotCS5uYW1lCQk9ICJBdTE1NTAgYWxnb3JpdGhtIiwKLQkuaWQJCT0gSTJDX0FMR09fQVUxNTUwLAogCS5tYXN0ZXJfeGZlcgk9IGF1MTU1MF94ZmVyLAogCS5mdW5jdGlvbmFsaXR5CT0gYXUxNTUwX2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwppbmRleCAxYWI0MTMxLi43MDliZWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwpAQCAtNTM1LDggKzUzNSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7Ci0JLm5hbWUJCT0gIk5vbi1JMkMgU01CdXMgYWRhcHRlciIsCi0JLmlkCQk9IEkyQ19BTEdPX1NNQlVTLAogCS5zbWJ1c194ZmVyCT0gaTgwMV9hY2Nlc3MsCiAJLmZ1bmN0aW9uYWxpdHkJPSBpODAxX2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pYm1faWljLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYwppbmRleCA5M2NhMzZkLi5hM2VkOTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYwpAQCAtNjI3LDggKzYyNyw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpaWNfYWxnbyA9IHsKLQkubmFtZSAJCT0gIklCTSBJSUMgYWxnb3JpdGhtIiwKLQkuaWQgICAJCT0gSTJDX0FMR09fT0NQLAogCS5tYXN0ZXJfeGZlciAJPSBpaWNfeGZlciwKIAkuZnVuY3Rpb25hbGl0eQk9IGlpY19mdW5jCiB9OwpAQCAtNzI3LDcgKzcyNSw3IEBACiAJYWRhcCA9ICZkZXYtPmFkYXA7CiAJc3RyY3B5KGFkYXAtPm5hbWUsICJJQk0gSUlDIik7CiAJaTJjX3NldF9hZGFwZGF0YShhZGFwLCBkZXYpOwotCWFkYXAtPmlkID0gSTJDX0hXX09DUCB8IGlpY19hbGdvLmlkOworCWFkYXAtPmlkID0gSTJDX0hXX09DUDsKIAlhZGFwLT5hbGdvID0gJmlpY19hbGdvOwogCWFkYXAtPmNsaWVudF9yZWdpc3RlciA9IE5VTEw7CiAJYWRhcC0+Y2xpZW50X3VucmVnaXN0ZXIgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pb3AzeHguYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW9wM3h4LmMKaW5kZXggNmI2ODJlOS4uN2JkOTEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pb3AzeHguYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlvcDN4eC5jCkBAIC0zOTksOCArMzk5LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGlvcDN4eF9pMmNfYWxnbyA9IHsKLQkubmFtZQkJPSAiSU9QM3h4IEkyQyBhbGdvcml0aG0iLAotCS5pZAkJPSBJMkNfQUxHT19JT1AzWFgsCiAJLm1hc3Rlcl94ZmVyCT0gaW9wM3h4X2kyY19tYXN0ZXJfeGZlciwKIAkuYWxnb19jb250cm9sCT0gaW9wM3h4X2kyY19hbGdvX2NvbnRyb2wsCiAJLmZ1bmN0aW9uYWxpdHkJPSBpb3AzeHhfaTJjX2Z1bmMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzYS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc2EuYwppbmRleCAwMGU3ZjcxLi5iZGM2ODA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzYS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXNhLmMKQEAgLTEsNiArMSw4IEBACiAvKgotICAgIGkyYy1pc2EuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCi0gICAgICAgICAgICBtb25pdG9yaW5nCisgICAgaTJjLWlzYS5jIC0gYW4gaTJjLWNvcmUtbGlrZSB0aGluZyBmb3IgSVNBIGhhcmR3YXJlIG1vbml0b3JpbmcgY2hpcHMKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorCisgICAgQmFzZWQgb24gdGhlIGkyYy1pc2EgcHNldWRvLWFkYXB0ZXIgZnJvbSB0aGUgbG1fc2Vuc29ycyBwcm9qZWN0CiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5ICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+IAogCiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTE4LDMwICsyMCwzNiBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAotLyogVGhpcyBpbXBsZW1lbnRzIGFuIGkyYyBhbGdvcml0aG0vYWRhcHRlciBmb3IgSVNBIGJ1cy4gTm90IHRoYXQgdGhpcyBpcwotICAgb24gZmlyc3Qgc2lnaHQgdmVyeSB1c2VmdWw7IGFsbW9zdCBubyBmdW5jdGlvbmFsaXR5IGlzIHByZXNlcnZlZC4KLSAgIEV4Y2VwdCB0aGF0IGl0IG1ha2VzIHdyaXRpbmcgZHJpdmVycyBmb3IgY2hpcHMgd2hpY2ggY2FuIGJlIG9uIGJvdGgKLSAgIHRoZSBTTUJ1cyBhbmQgdGhlIElTQSBidXMgdmVyeSBtdWNoIGVhc2llci4gU2VlIGxtNzguYyBmb3IgYW4gZXhhbXBsZQotICAgb2YgdGhpcy4gKi8KKy8qIFRoaXMgaW1wbGVtZW50cyBhbiBpMmMtY29yZS1saWtlIHRoaW5nIGZvciBJU0EgaGFyZHdhcmUgbW9uaXRvcmluZworICAgY2hpcHMuIFN1Y2ggY2hpcHMgYXJlIGxpbmtlZCB0byB0aGUgaTJjIHN1YnN5c3RlbSBmb3IgaGlzdG9yaWNhbAorICAgcmVhc29ucyAoYmVjYXVzZSB0aGUgZWFybHkgSVNBIGhhcmR3YXJlIG1vbml0b3JpbmcgY2hpcHMgc3VjaCBhcyB0aGUKKyAgIExNNzggaGFkIGJvdGggYW4gSTJDIGFuZCBhbiBJU0EgaW50ZXJmYWNlKS4gVGhleSB1c2VkIHRvIGJlCisgICByZWdpc3RlcmVkIHdpdGggdGhlIG1haW4gaTJjLWNvcmUsIGJ1dCBhcyBhIGZpcnN0IHN0ZXAgaW4gdGhlCisgICBkaXJlY3Rpb24gb2YgYSBjbGVhbiBzZXBhcmF0aW9uIGJldHdlZW4gSTJDIGFuZCBJU0EgY2hpcCBkcml2ZXJzLAorICAgd2Ugbm93IGhhdmUgdGhpcyBzZXBhcmF0ZSBjb3JlIGZvciBJU0Egb25lcy4gSXQgaXMgc2lnbmlmaWNhbnRseQorICAgbW9yZSBzaW1wbGUgdGhhbiB0aGUgcmVhbCBvbmUsIG9mIGNvdXJzZSwgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRvCisgICBoYW5kbGUgbXVsdGlwbGUgYnVzc2VzOiB0aGVyZSBpcyBvbmx5IG9uZSAoZmFrZSkgSVNBIGFkYXB0ZXIuCisgICBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB3ZSBzdGlsbCByZWx5IG9uIGkyYy1jb3JlIGZvciBzb21lIHRoaW5ncworICAgYXQgdGhlIG1vbWVudCAtIGJ1dCBob3BlZnVsbHkgdGhpcyB3b24ndCBsYXN0LiAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWlzYS5oPgogCiBzdGF0aWMgdTMyIGlzYV9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CiAKIC8qIFRoaXMgaXMgdGhlIGFjdHVhbCBhbGdvcml0aG0gd2UgZGVmaW5lICovCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gaXNhX2FsZ29yaXRobSA9IHsKLQkubmFtZQkJPSAiSVNBIGJ1cyBhbGdvcml0aG0iLAotCS5pZAkJPSBJMkNfQUxHT19JU0EsCiAJLmZ1bmN0aW9uYWxpdHkJPSBpc2FfZnVuYywKIH07CiAKIC8qIFRoZXJlIGNhbiBvbmx5IGJlIG9uZS4uLiAqLwogc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBpc2FfYWRhcHRlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlkCQk9IEkyQ19IV19JU0EsCiAJLmNsYXNzICAgICAgICAgID0gSTJDX0NMQVNTX0hXTU9OLAogCS5hbGdvCQk9ICZpc2FfYWxnb3JpdGhtLAogCS5uYW1lCQk9ICJJU0EgbWFpbiBhZGFwdGVyIiwKQEAgLTUzLDE3ICs2MSwxNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAorCisvKiBDb3BpZWQgZnJvbSBpMmMtY29yZSAqLworc3RhdGljIHNzaXplX3Qgc2hvd19hZGFwdGVyX25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9IGRldl90b19pMmNfYWRhcHRlcihkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBhZGFwLT5uYW1lKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X2FkYXB0ZXJfbmFtZSwgTlVMTCk7CisKK3N0YXRpYyBpbnQgaTJjX2lzYV9kZXZpY2VfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGkyY19pc2FfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKKworLyogV2UgaW1wbGVtZW50IGFuIGludGVyZmFjZSB3aGljaCByZXNlbWJsZXMgaTJjX3thZGQsZGVsfV9kcml2ZXIsCisgICBidXQgZm9yIGkyYy1pc2EgZHJpdmVycy4gV2UgZG9uJ3QgaGF2ZSB0byByZW1lbWJlciBhbmQgaGFuZGxlIGxpc3RzCisgICBvZiBkcml2ZXJzIGFuZCBhZGFwdGVycyBzbyB0aGlzIGlzIG11Y2ggbW9yZSBzaW1wbGUsIG9mIGNvdXJzZS4gKi8KKworaW50IGkyY19pc2FfYWRkX2RyaXZlcihzdHJ1Y3QgaTJjX2RyaXZlciAqZHJpdmVyKQoreworCWludCByZXM7CisKKwkvKiBBZGQgdGhlIGRyaXZlciB0byB0aGUgbGlzdCBvZiBpMmMgZHJpdmVycyBpbiB0aGUgZHJpdmVyIGNvcmUgKi8KKwlkcml2ZXItPmRyaXZlci5uYW1lID0gZHJpdmVyLT5uYW1lOworCWRyaXZlci0+ZHJpdmVyLmJ1cyA9ICZpMmNfYnVzX3R5cGU7CisJZHJpdmVyLT5kcml2ZXIucHJvYmUgPSBpMmNfaXNhX2RldmljZV9wcm9iZTsKKwlkcml2ZXItPmRyaXZlci5yZW1vdmUgPSBpMmNfaXNhX2RldmljZV9yZW1vdmU7CisJcmVzID0gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKwlkZXZfZGJnKCZpc2FfYWRhcHRlci5kZXYsICJEcml2ZXIgJXMgcmVnaXN0ZXJlZFxuIiwgZHJpdmVyLT5uYW1lKTsKKworCS8qIE5vdyBsb29rIGZvciBjbGllbnRzICovCisJZHJpdmVyLT5hdHRhY2hfYWRhcHRlcigmaXNhX2FkYXB0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpMmNfaXNhX2RlbF9kcml2ZXIoc3RydWN0IGkyY19kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtLCAqX247CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlpbnQgcmVzOworCisJLyogRGV0YWNoIGFsbCBjbGllbnRzIGJlbG9uZ2luZyB0byB0aGlzIG9uZSBkcml2ZXIgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlbSwgX24sICZpc2FfYWRhcHRlci5jbGllbnRzKSB7CisJCWNsaWVudCA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGkyY19jbGllbnQsIGxpc3QpOworCQlpZiAoY2xpZW50LT5kcml2ZXIgIT0gZHJpdmVyKQorCQkJY29udGludWU7CisJCWRldl9kYmcoJmlzYV9hZGFwdGVyLmRldiwgIkRldGFjaGluZyBjbGllbnQgJXMgYXQgMHgleFxuIiwKKwkJCWNsaWVudC0+bmFtZSwgY2xpZW50LT5hZGRyKTsKKwkJaWYgKChyZXMgPSBkcml2ZXItPmRldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKKwkJCWRldl9lcnIoJmlzYV9hZGFwdGVyLmRldiwgIkZhaWxlZCwgZHJpdmVyICIKKwkJCQkiJXMgbm90IHVucmVnaXN0ZXJlZCFcbiIsCisJCQkJZHJpdmVyLT5uYW1lKTsKKwkJCXJldHVybiByZXM7CisJCX0KKwl9CisKKwkvKiBHZXQgdGhlIGRyaXZlciBvZmYgdGhlIGNvcmUgbGlzdCAqLworCWRyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7CisJZGV2X2RiZygmaXNhX2FkYXB0ZXIuZGV2LCAiRHJpdmVyICVzIHVucmVnaXN0ZXJlZFxuIiwgZHJpdmVyLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisKIHN0YXRpYyBpbnQgX19pbml0IGkyY19pc2FfaW5pdCh2b2lkKQogewotCXJldHVybiBpMmNfYWRkX2FkYXB0ZXIoJmlzYV9hZGFwdGVyKTsKKwlpbml0X01VVEVYKCZpc2FfYWRhcHRlci5jbGlzdF9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmaXNhX2FkYXB0ZXIuY2xpZW50cyk7CisKKwlpc2FfYWRhcHRlci5uciA9IEFOWV9JMkNfSVNBX0JVUzsKKwlpc2FfYWRhcHRlci5kZXYucGFyZW50ID0gJnBsYXRmb3JtX2J1czsKKwlzcHJpbnRmKGlzYV9hZGFwdGVyLmRldi5idXNfaWQsICJpMmMtJWQiLCBpc2FfYWRhcHRlci5ucik7CisJaXNhX2FkYXB0ZXIuZGV2LmRyaXZlciA9ICZpMmNfYWRhcHRlcl9kcml2ZXI7CisJaXNhX2FkYXB0ZXIuZGV2LnJlbGVhc2UgPSAmaTJjX2FkYXB0ZXJfZGV2X3JlbGVhc2U7CisJZGV2aWNlX3JlZ2lzdGVyKCZpc2FfYWRhcHRlci5kZXYpOworCWRldmljZV9jcmVhdGVfZmlsZSgmaXNhX2FkYXB0ZXIuZGV2LCAmZGV2X2F0dHJfbmFtZSk7CisKKwkvKiBBZGQgdGhpcyBhZGFwdGVyIHRvIHRoZSBpMmNfYWRhcHRlciBjbGFzcyAqLworCW1lbXNldCgmaXNhX2FkYXB0ZXIuY2xhc3NfZGV2LCAweDAwLCBzaXplb2Yoc3RydWN0IGNsYXNzX2RldmljZSkpOworCWlzYV9hZGFwdGVyLmNsYXNzX2Rldi5kZXYgPSAmaXNhX2FkYXB0ZXIuZGV2OworCWlzYV9hZGFwdGVyLmNsYXNzX2Rldi5jbGFzcyA9ICZpMmNfYWRhcHRlcl9jbGFzczsKKwlzdHJsY3B5KGlzYV9hZGFwdGVyLmNsYXNzX2Rldi5jbGFzc19pZCwgaXNhX2FkYXB0ZXIuZGV2LmJ1c19pZCwKKwkJQlVTX0lEX1NJWkUpOworCWNsYXNzX2RldmljZV9yZWdpc3RlcigmaXNhX2FkYXB0ZXIuY2xhc3NfZGV2KTsKKworCWRldl9kYmcoJmlzYV9hZGFwdGVyLmRldiwgIiVzIHJlZ2lzdGVyZWRcbiIsIGlzYV9hZGFwdGVyLm5hbWUpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpMmNfaXNhX2V4aXQodm9pZCkKIHsKLQlpMmNfZGVsX2FkYXB0ZXIoJmlzYV9hZGFwdGVyKTsKKyNpZmRlZiBERUJVRworCXN0cnVjdCBsaXN0X2hlYWQgICppdGVtLCAqX247CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IE5VTEw7CisjZW5kaWYKKworCS8qIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIGFjdGl2ZSBjbGllbnQgKi8KKyNpZmRlZiBERUJVRworCWRldl9kYmcoJmlzYV9hZGFwdGVyLmRldiwgIkxvb2tpbmcgZm9yIGNsaWVudHNcbiIpOworCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVtLCBfbiwgJmlzYV9hZGFwdGVyLmNsaWVudHMpIHsKKwkJY2xpZW50ID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgaTJjX2NsaWVudCwgbGlzdCk7CisJCWRldl9lcnIoJmlzYV9hZGFwdGVyLmRldiwgIkRyaXZlciAlcyBzdGlsbCBoYXMgYW4gYWN0aXZlICIKKwkJCSJJU0EgY2xpZW50IGF0IDB4JXhcbiIsIGNsaWVudC0+ZHJpdmVyLT5uYW1lLAorCQkJY2xpZW50LT5hZGRyKTsKKwl9CisJaWYgKGNsaWVudCAhPSBOVUxMKQorCQlyZXR1cm47CisjZW5kaWYKKworCS8qIENsZWFuIHVwIHRoZSBzeXNmcyByZXByZXNlbnRhdGlvbiAqLworCWRldl9kYmcoJmlzYV9hZGFwdGVyLmRldiwgIlVucmVnaXN0ZXJpbmcgZnJvbSBzeXNmc1xuIik7CisJaW5pdF9jb21wbGV0aW9uKCZpc2FfYWRhcHRlci5kZXZfcmVsZWFzZWQpOworCWluaXRfY29tcGxldGlvbigmaXNhX2FkYXB0ZXIuY2xhc3NfZGV2X3JlbGVhc2VkKTsKKwljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmaXNhX2FkYXB0ZXIuY2xhc3NfZGV2KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmlzYV9hZGFwdGVyLmRldiwgJmRldl9hdHRyX25hbWUpOworCWRldmljZV91bnJlZ2lzdGVyKCZpc2FfYWRhcHRlci5kZXYpOworCisJLyogV2FpdCBmb3Igc3lzZnMgdG8gZHJvcCBhbGwgcmVmZXJlbmNlcyAqLworCWRldl9kYmcoJmlzYV9hZGFwdGVyLmRldiwgIldhaXRpbmcgZm9yIHN5c2ZzIGNvbXBsZXRpb25cbiIpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmlzYV9hZGFwdGVyLmRldl9yZWxlYXNlZCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmaXNhX2FkYXB0ZXIuY2xhc3NfZGV2X3JlbGVhc2VkKTsKKworCWRldl9kYmcoJmlzYV9hZGFwdGVyLmRldiwgIiVzIHVucmVnaXN0ZXJlZFxuIiwgaXNhX2FkYXB0ZXIubmFtZSk7CiB9CiAKLU1PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4iKTsKK0VYUE9SVF9TWU1CT0woaTJjX2lzYV9hZGRfZHJpdmVyKTsKK0VYUE9SVF9TWU1CT0woaTJjX2lzYV9kZWxfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklTQSBidXMgYWNjZXNzIHRocm91Z2ggaTJjIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMta2V5d2VzdC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rZXl3ZXN0LmMKaW5kZXggOTRhZTgwOC4uMzdiNDljMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rZXl3ZXN0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rZXl3ZXN0LmMKQEAgLTg3LDEyICs4Nyw5IEBACiB9OwogI2VuZGlmIC8qIERFQlVHICovCiAKLXN0YXRpYyBpbnQgcHJvYmU7Ci0KIE1PRFVMRV9BVVRIT1IoIkJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSTJDIGRyaXZlciBmb3IgQXBwbGUncyBLZXl3ZXN0Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1tb2R1bGVfcGFyYW0ocHJvYmUsIGJvb2wsIDApOwogCiAjaWZkZWYgUE9MTEVEX01PREUKIC8qIERvbid0IHNjaGVkdWxlLCB0aGUgZzUgZmFuIGNvbnRyb2xsZXIgaXMgdG9vCkBAIC00OTgsOCArNDk1LDYgQEAKIAogLyogRm9yIG5vdywgd2Ugb25seSBoYW5kbGUgY29tYmluZWQgbW9kZSAoc21idXMpICovCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0ga2V5d2VzdF9hbGdvcml0aG0gPSB7Ci0JLm5hbWUJCT0gIktleXdlc3QgaTJjIiwKLQkuaWQJCT0gSTJDX0FMR09fU01CVVMsCiAJLnNtYnVzX3hmZXIJPSBrZXl3ZXN0X3NtYnVzX3hmZXIsCiAJLm1hc3Rlcl94ZmVyCT0ga2V5d2VzdF94ZmVyLAogCS5mdW5jdGlvbmFsaXR5CT0ga2V5d2VzdF9mdW5jLApAQCAtNjIxLDcgKzYxNiw2IEBACiAJCXNwcmludGYoY2hhbi0+YWRhcHRlci5uYW1lLCAiJXMgJWQiLCBucC0+cGFyZW50LT5uYW1lLCBpKTsKIAkJY2hhbi0+aWZhY2UgPSBpZmFjZTsKIAkJY2hhbi0+Y2hhbl9ubyA9IGk7Ci0JCWNoYW4tPmFkYXB0ZXIuaWQgPSBJMkNfQUxHT19TTUJVUzsKIAkJY2hhbi0+YWRhcHRlci5hbGdvID0gJmtleXdlc3RfYWxnb3JpdGhtOwogCQljaGFuLT5hZGFwdGVyLmFsZ29fZGF0YSA9IE5VTEw7CiAJCWNoYW4tPmFkYXB0ZXIuY2xpZW50X3JlZ2lzdGVyID0gTlVMTDsKQEAgLTYzNSwxNSArNjI5LDYgQEAKIAkJCQljaGFuLT5hZGFwdGVyLm5hbWUpOwogCQkJaTJjX3NldF9hZGFwZGF0YSgmY2hhbi0+YWRhcHRlciwgTlVMTCk7CiAJCX0KLQkJaWYgKHByb2JlKSB7Ci0JCQlwcmludGsoIlByb2JlOiAiKTsKLQkJCWZvciAoYWRkciA9IDB4MDA7IGFkZHIgPD0gMHg3ZjsgYWRkcisrKSB7Ci0JCQkJaWYgKGkyY19zbWJ1c194ZmVyKCZjaGFuLT5hZGFwdGVyLGFkZHIsCi0JCQkJICAgIDAsMCwwLEkyQ19TTUJVU19RVUlDSyxOVUxMKSA+PSAwKQotCQkJCQlwcmludGsoIiUwMnggIiwgYWRkcik7Ci0JCQl9Ci0JCQlwcmludGsoIlxuIik7Ci0JCX0KIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBLZXlXZXN0IGkyYyBvbiBcIiVzXCIsICVkIGNoYW5uZWwlcywgc3RlcHBpbmc6ICVkIGJpdHNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tcGMuYwppbmRleCA5YWQzZTkyLi5mMDY1NTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXBjLmMKQEAgLTI3Miw4ICsyNzIsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gbXBjX2FsZ28gPSB7Ci0JLm5hbWUgPSAiTVBDIGFsZ29yaXRobSIsCi0JLmlkID0gSTJDX0FMR09fTVBDMTA3LAogCS5tYXN0ZXJfeGZlciA9IG1wY194ZmVyLAogCS5mdW5jdGlvbmFsaXR5ID0gbXBjX2Z1bmN0aW9uYWxpdHksCiB9OwpAQCAtMjgxLDcgKzI3OSw3IEBACiBzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIG1wY19vcHMgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLm5hbWUgPSAiTVBDIGFkYXB0ZXIiLAotCS5pZCA9IEkyQ19BTEdPX01QQzEwNyB8IEkyQ19IV19NUEMxMDcsCisJLmlkID0gSTJDX0hXX01QQzEwNywKIAkuYWxnbyA9ICZtcGNfYWxnbywKIAkuY2xhc3MgPSBJMkNfQ0xBU1NfSFdNT04sCiAJLnRpbWVvdXQgPSAxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tdjY0eHh4LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW12NjR4eHguYwppbmRleCA1Yjg1Mjc4Li45OWFiY2E0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW12NjR4eHguYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW12NjR4eHguYwpAQCAtNDIzLDE4ICs0MjMsMTYgQEAKIG12NjR4eHhfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyBtc2dzW10sIGludCBudW0pCiB7CiAJc3RydWN0IG12NjR4eHhfaTJjX2RhdGEgKmRydl9kYXRhID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKLQlpbnQJaSwgcmMgPSAwOworCWludAlpLCByYzsKIAogCWZvciAoaT0wOyBpPG51bTsgaSsrKQotCQlpZiAoKHJjID0gbXY2NHh4eF9pMmNfZXhlY3V0ZV9tc2coZHJ2X2RhdGEsICZtc2dzW2ldKSkgIT0gMCkKLQkJCWJyZWFrOworCQlpZiAoKHJjID0gbXY2NHh4eF9pMmNfZXhlY3V0ZV9tc2coZHJ2X2RhdGEsICZtc2dzW2ldKSkgPCAwKQorCQkJcmV0dXJuIHJjOwogCi0JcmV0dXJuIHJjOworCXJldHVybiBudW07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBtdjY0eHh4X2kyY19hbGdvID0gewotCS5uYW1lID0gTVY2NFhYWF9JMkNfQ1RMUl9OQU1FICIgYWxnb3JpdGhtIiwKLQkuaWQgPSBJMkNfQUxHT19NVjY0WFhYLAogCS5tYXN0ZXJfeGZlciA9IG12NjR4eHhfaTJjX3hmZXIsCiAJLmZ1bmN0aW9uYWxpdHkgPSBtdjY0eHh4X2kyY19mdW5jdGlvbmFsaXR5LAogfTsKQEAgLTUyMyw3ICs1MjEsNyBAQAogCWRydl9kYXRhLT5mcmVxX20gPSBwZGF0YS0+ZnJlcV9tOwogCWRydl9kYXRhLT5mcmVxX24gPSBwZGF0YS0+ZnJlcV9uOwogCWRydl9kYXRhLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkLCAwKTsKLQlkcnZfZGF0YS0+YWRhcHRlci5pZCA9IEkyQ19BTEdPX01WNjRYWFggfCBJMkNfSFdfTVY2NFhYWDsKKwlkcnZfZGF0YS0+YWRhcHRlci5pZCA9IEkyQ19IV19NVjY0WFhYOwogCWRydl9kYXRhLT5hZGFwdGVyLmFsZ28gPSAmbXY2NHh4eF9pMmNfYWxnbzsKIAlkcnZfZGF0YS0+YWRhcHRlci5vd25lciA9IFRISVNfTU9EVUxFOwogCWRydl9kYXRhLT5hZGFwdGVyLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYwppbmRleCA3NGViODlhLi5lMGI3YTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYwpAQCAtMTEwLDggKzExMCw2IEBACiAKIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKLQkubmFtZSA9ICJOb24tSTJDIFNNQnVzIGFkYXB0ZXIiLAotCS5pZCA9IEkyQ19BTEdPX1NNQlVTLAogCS5zbWJ1c194ZmVyID0gbmZvcmNlMl9hY2Nlc3MsCiAJLmZ1bmN0aW9uYWxpdHkgPSBuZm9yY2UyX2Z1bmMsCiB9OwpAQCAtMTMxLDcgKzEyOSw2IEBACiAJc3RydWN0IG5mb3JjZTJfc21idXMgKnNtYnVzID0gYWRhcC0+YWxnb19kYXRhOwogCXVuc2lnbmVkIGNoYXIgcHJvdG9jb2wsIHBlYywgdGVtcDsKIAl1bnNpZ25lZCBjaGFyIGxlbiA9IDA7IC8qIHRvIGtlZXAgdGhlIGNvbXBpbGVyIHF1aWV0ICovCi0JaW50IHRpbWVvdXQgPSAwOwogCWludCBpOwogCiAJcHJvdG9jb2wgPSAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkgPyBOVklESUFfU01CX1BSVENMX1JFQUQgOgpAQCAtMTkxLDI5ICsxODgsMTAgQEAKIAkJY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgogCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAiSTJDX1NNQlVTX1BST0NfQ0FMTCBub3Qgc3VwcG9ydGVkIVxuIik7CiAJCQlyZXR1cm4gLTE7Ci0JCQkvKgotCQkJb3V0Yl9wKGNvbW1hbmQsIE5WSURJQV9TTUJfQ01EKTsKLQkJCW91dGJfcChkYXRhLT53b3JkLCBOVklESUFfU01CX0RBVEEpOwotCQkJb3V0Yl9wKGRhdGEtPndvcmQgPj4gOCwgTlZJRElBX1NNQl9EQVRBICsgMSk7Ci0JCQlwcm90b2NvbCA9IE5WSURJQV9TTUJfUFJUQ0xfUFJPQ19DQUxMIHwgcGVjOwotCQkJcmVhZF93cml0ZSA9IEkyQ19TTUJVU19SRUFEOwotCQkJYnJlYWs7Ci0JCQkgKi8KIAogCQljYXNlIEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTEw6CiAJCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMIG5vdCBzdXBwb3J0ZWQhXG4iKTsKIAkJCXJldHVybiAtMTsKLQkJCS8qCi0JCQlwcm90b2NvbCB8PSBwZWM7Ci0JCQlsZW4gPSBtaW5fdCh1OCwgZGF0YS0+YmxvY2tbMF0sIDMxKTsKLQkJCW91dGJfcChjb21tYW5kLCBOVklESUFfU01CX0NNRCk7Ci0JCQlvdXRiX3AobGVuLCBOVklESUFfU01CX0JDTlQpOwotCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJCW91dGJfcChkYXRhLT5ibG9ja1tpICsgMV0sIE5WSURJQV9TTUJfREFUQSArIGkpOwotCQkJcHJvdG9jb2wgPSBOVklESUFfU01CX1BSVENMX0JMT0NLX1BST0NfQ0FMTCB8IHBlYzsKLQkJCXJlYWRfd3JpdGUgPSBJMkNfU01CVVNfUkVBRDsKLQkJCWJyZWFrOwotCQkJKi8KIAogCQljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEFfUEVDOgogCQljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBX1BFQzoKQEAgLTIzMiwxMiArMjEwLDYgQEAKIAogCXRlbXAgPSBpbmJfcChOVklESUFfU01CX1NUUyk7CiAKLSNpZiAwCi0JZG8gewotCQlpMmNfZG9fcGF1c2UoMSk7Ci0JCXRlbXAgPSBpbmJfcChOVklESUFfU01CX1NUUyk7Ci0JfSB3aGlsZSAoKCh0ZW1wICYgTlZJRElBX1NNQl9TVFNfRE9ORSkgPT0gMCkgJiYgKHRpbWVvdXQrKyA8IE1BWF9USU1FT1VUKSk7Ci0jZW5kaWYKIAlpZiAofnRlbXAgJiBOVklESUFfU01CX1NUU19ET05FKSB7CiAJCXVkZWxheSg1MDApOwogCQl0ZW1wID0gaW5iX3AoTlZJRElBX1NNQl9TVFMpOwpAQCAtMjQ3LDkgKzIxOSwxMCBAQAogCQl0ZW1wID0gaW5iX3AoTlZJRElBX1NNQl9TVFMpOwogCX0KIAotCWlmICgodGltZW91dCA+PSBNQVhfVElNRU9VVCkgfHwgKH50ZW1wICYgTlZJRElBX1NNQl9TVFNfRE9ORSkKLQkJfHwgKHRlbXAgJiBOVklESUFfU01CX1NUU19TVEFUVVMpKQorCWlmICgofnRlbXAgJiBOVklESUFfU01CX1NUU19ET05FKSB8fCAodGVtcCAmIE5WSURJQV9TTUJfU1RTX1NUQVRVUykpIHsKKwkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiU01CdXMgVGltZW91dCEgKDB4JTAyeClcbiIsIHRlbXApOwogCQlyZXR1cm4gLTE7CisJfQogCiAJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYwppbmRleCA2ZDM0ZWUzLi42ZDQ4YTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBpaXg0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jCkBAIC0zOTksOCArMzk5LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKLQkubmFtZQkJPSAiTm9uLUkyQyBTTUJ1cyBhZGFwdGVyIiwKLQkuaWQJCT0gSTJDX0FMR09fU01CVVMsCiAJLnNtYnVzX3hmZXIJPSBwaWl4NF9hY2Nlc3MsCiAJLmZ1bmN0aW9uYWxpdHkJPSBwaWl4NF9mdW5jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjUzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCkBAIC0wLDAgKzEsMTAyMiBAQAorLyoKKyAqICBpMmNfYWRhcF9weGEuYworICoKKyAqICBJMkMgYWRhcHRlciBmb3IgdGhlIFBYQSBJMkMgYnVzIGFjY2Vzcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludHJpbnN5YyBTb2Z0d2FyZSBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgSGlzdG9yeToKKyAqICAgIEFwciAyMDAyOiBJbml0aWFsIHZlcnNpb24gW0NTXQorICogICAgSnVuIDIwMDI6IFByb3Blcmx5IHNlcGVyYXRlZCBhbGdvL2FkYXAgW0ZCXQorICogICAgSmFuIDIwMDM6IEZpeGVkIHNldmVyYWwgYnVncyBjb25jZXJuaW5nIGludGVycnVwdCBoYW5kbGluZyBbS2FpLVV3ZSBCbG9lbV0KKyAqICAgIEphbiAyMDAzOiBhZGRlZCBsaW1pdGVkIHNpZ25hbCBoYW5kbGluZyBbS2FpLVV3ZSBCbG9lbV0KKyAqICAgIFNlcCAyMDA0OiBNYWpvciByZXdvcmsgdG8gZW5zdXJlIGVmZmljaWVudCBidXMgaGFuZGxpbmcgW1JNS10KKyAqICAgIERlYyAyMDA0OiBBZGRlZCBzdXBwb3J0IGZvciBQWEEyN3ggYW5kIHNsYXZlIGRldmljZSBwcm9iaW5nIFtMaWFtIEdpcmR3b29kXQorICogICAgRmViIDIwMDU6IFJld29yayBzbGF2ZSBtb2RlIGhhbmRsaW5nIFtSTUtdCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1weGEuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pMmMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorCitzdHJ1Y3QgcHhhX2kyYyB7CisJc3BpbmxvY2tfdAkJbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OworCXN0cnVjdCBpMmNfbXNnCQkqbXNnOworCXVuc2lnbmVkIGludAkJbXNnX251bTsKKwl1bnNpZ25lZCBpbnQJCW1zZ19pZHg7CisJdW5zaWduZWQgaW50CQltc2dfcHRyOworCXVuc2lnbmVkIGludAkJc2xhdmVfYWRkcjsKKworCXN0cnVjdCBpMmNfYWRhcHRlcglhZGFwOworI2lmZGVmIENPTkZJR19JMkNfUFhBX1NMQVZFCisJc3RydWN0IGkyY19zbGF2ZV9jbGllbnQgKnNsYXZlOworI2VuZGlmCisKKwl1bnNpZ25lZCBpbnQJCWlycWxvZ2lkeDsKKwl1MzIJCQlpc3Jsb2dbMzJdOworCXUzMgkJCWljcmxvZ1szMl07Cit9OworCisvKgorICogSTJDIFNsYXZlIG1vZGUgYWRkcmVzcworICovCisjZGVmaW5lIEkyQ19QWEFfU0xBVkVfQUREUiAgICAgIDB4MQorCisjaWZkZWYgREVCVUcKKworc3RydWN0IGJpdHMgeworCXUzMgltYXNrOworCWNvbnN0IGNoYXIgKnNldDsKKwljb25zdCBjaGFyICp1bnNldDsKK307CisjZGVmaW5lIEJJVChtLCBzLCB1KQl7IC5tYXNrID0gbSwgLnNldCA9IHMsIC51bnNldCA9IHUgfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlY29kZV9iaXRzKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3Qgc3RydWN0IGJpdHMgKmJpdHMsIGludCBudW0sIHUzMiB2YWwpCit7CisJcHJpbnRrKCIlcyAlMDh4OiAiLCBwcmVmaXgsIHZhbCk7CisJd2hpbGUgKG51bS0tKSB7CisJCWNvbnN0IGNoYXIgKnN0ciA9IHZhbCAmIGJpdHMtPm1hc2sgPyBiaXRzLT5zZXQgOiBiaXRzLT51bnNldDsKKwkJaWYgKHN0cikKKwkJCXByaW50aygiJXMgIiwgc3RyKTsKKwkJYml0cysrOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiaXRzIGlzcl9iaXRzW10gPSB7CisJQklUKElTUl9SV00sCSJSWCIsCQkiVFgiKSwKKwlCSVQoSVNSX0FDS05BSywJIk5BSyIsCQkiQUNLIiksCisJQklUKElTUl9VQiwJIkJzeSIsCQkiUmR5IiksCisJQklUKElTUl9JQkIsCSJCdXNCc3kiLAkiQnVzUmR5IiksCisJQklUKElTUl9TU0QsCSJTbGF2ZVN0b3AiLAlOVUxMKSwKKwlCSVQoSVNSX0FMRCwJIkFMRCIsCQlOVUxMKSwKKwlCSVQoSVNSX0lURSwJIlR4RW1wdHkiLAlOVUxMKSwKKwlCSVQoSVNSX0lSRiwJIlJ4RnVsbCIsCU5VTEwpLAorCUJJVChJU1JfR0NBRCwJIkdlbkNhbGwiLAlOVUxMKSwKKwlCSVQoSVNSX1NBRCwJIlNsYXZlQWRkciIsCU5VTEwpLAorCUJJVChJU1JfQkVELAkiQnVzRXJyIiwJTlVMTCksCit9OworCitzdGF0aWMgdm9pZCBkZWNvZGVfSVNSKHVuc2lnbmVkIGludCB2YWwpCit7CisJZGVjb2RlX2JpdHMoS0VSTl9ERUJVRyAiSVNSIiwgaXNyX2JpdHMsIEFSUkFZX1NJWkUoaXNyX2JpdHMpLCB2YWwpOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiaXRzIGljcl9iaXRzW10gPSB7CisJQklUKElDUl9TVEFSVCwgICJTVEFSVCIsCU5VTEwpLAorCUJJVChJQ1JfU1RPUCwgICAiU1RPUCIsCQlOVUxMKSwKKwlCSVQoSUNSX0FDS05BSywgIkFDS05BSyIsCU5VTEwpLAorCUJJVChJQ1JfVEIsICAgICAiVEIiLAkJTlVMTCksCisJQklUKElDUl9NQSwgICAgICJNQSIsCQlOVUxMKSwKKwlCSVQoSUNSX1NDTEUsICAgIlNDTEUiLAkJInNjbGUiKSwKKwlCSVQoSUNSX0lVRSwgICAgIklVRSIsCQkiaXVlIiksCisJQklUKElDUl9HQ0QsICAgICJHQ0QiLAkJTlVMTCksCisJQklUKElDUl9JVEVJRSwgICJJVEVJRSIsCU5VTEwpLAorCUJJVChJQ1JfSVJGSUUsICAiSVJGSUUiLAlOVUxMKSwKKwlCSVQoSUNSX0JFSUUsICAgIkJFSUUiLAkJTlVMTCksCisJQklUKElDUl9TU0RJRSwgICJTU0RJRSIsCU5VTEwpLAorCUJJVChJQ1JfQUxESUUsICAiQUxESUUiLAlOVUxMKSwKKwlCSVQoSUNSX1NBRElFLCAgIlNBRElFIiwJTlVMTCksCisJQklUKElDUl9VUiwgICAgICJVUiIsCQkidXIiKSwKK307CisKK3N0YXRpYyB2b2lkIGRlY29kZV9JQ1IodW5zaWduZWQgaW50IHZhbCkKK3sKKwlkZWNvZGVfYml0cyhLRVJOX0RFQlVHICJJQ1IiLCBpY3JfYml0cywgQVJSQVlfU0laRShpY3JfYml0cyksIHZhbCk7CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGkyY19kZWJ1ZyA9IERFQlVHOworCitzdGF0aWMgdm9pZCBpMmNfcHhhX3Nob3dfc3RhdGUoc3RydWN0IHB4YV9pMmMgKmkyYywgaW50IGxubywgY29uc3QgY2hhciAqZm5hbWUpCit7CisJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgInN0YXRlOiVzOiVkOiBJU1I9JTA4eCwgSUNSPSUwOHgsIElCTVI9JTAyeFxuIiwgZm5hbWUsIGxubywgSVNSLCBJQ1IsIElCTVIpOworfQorCisjZGVmaW5lIHNob3dfc3RhdGUoaTJjKSBpMmNfcHhhX3Nob3dfc3RhdGUoaTJjLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKQorI2Vsc2UKKyNkZWZpbmUgaTJjX2RlYnVnCTAKKworI2RlZmluZSBzaG93X3N0YXRlKGkyYykgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkZWNvZGVfSVNSKHZhbCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkZWNvZGVfSUNSKHZhbCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgZWVkYmcobHZsLCB4Li4uKSBkbyB7IGlmICgobHZsKSA8IDEpIHsgcHJpbnRrKEtFUk5fREVCVUcgIiIgeCk7IH0gfSB3aGlsZSgwKQorCitzdGF0aWMgdm9pZCBpMmNfcHhhX21hc3Rlcl9jb21wbGV0ZShzdHJ1Y3QgcHhhX2kyYyAqaTJjLCBpbnQgcmV0KTsKKworc3RhdGljIHZvaWQgaTJjX3B4YV9zY3JlYW1fYmx1ZV9tdXJkZXIoc3RydWN0IHB4YV9pMmMgKmkyYywgY29uc3QgY2hhciAqd2h5KQoreworCXVuc2lnbmVkIGludCBpOworCXByaW50aygiaTJjOiBlcnJvcjogJXNcbiIsIHdoeSk7CisJcHJpbnRrKCJpMmM6IG1zZ19udW06ICVkIG1zZ19pZHg6ICVkIG1zZ19wdHI6ICVkXG4iLAorCQlpMmMtPm1zZ19udW0sIGkyYy0+bXNnX2lkeCwgaTJjLT5tc2dfcHRyKTsKKwlwcmludGsoImkyYzogSUNSOiAlMDh4IElTUjogJTA4eFxuIgorCSAgICAgICAiaTJjOiBsb2c6ICIsIElDUiwgSVNSKTsKKwlmb3IgKGkgPSAwOyBpIDwgaTJjLT5pcnFsb2dpZHg7IGkrKykKKwkJcHJpbnRrKCJbJTA4eDolMDh4XSAiLCBpMmMtPmlzcmxvZ1tpXSwgaTJjLT5pY3Jsb2dbaV0pOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaTJjX3B4YV9pc19zbGF2ZW1vZGUoc3RydWN0IHB4YV9pMmMgKmkyYykKK3sKKwlyZXR1cm4gIShJQ1IgJiBJQ1JfU0NMRSk7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19weGFfYWJvcnQoc3RydWN0IHB4YV9pMmMgKmkyYykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFovNDsKKworCWlmIChpMmNfcHhhX2lzX3NsYXZlbW9kZShpMmMpKSB7CisJCWRldl9kYmcoJmkyYy0+YWRhcC5kZXYsICIlczogY2FsbGVkIGluIHNsYXZlIG1vZGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAoSUJNUiAmIDB4MSkgPT0gMCkgeworCQl1bnNpZ25lZCBsb25nIGljciA9IElDUjsKKworCQlpY3IgJj0gfklDUl9TVEFSVDsKKwkJaWNyIHw9IElDUl9BQ0tOQUsgfCBJQ1JfU1RPUCB8IElDUl9UQjsKKworCQlJQ1IgPSBpY3I7CisKKwkJc2hvd19zdGF0ZShpMmMpOworCisJCW1zbGVlcCgxKTsKKwl9CisKKwlJQ1IgJj0gfihJQ1JfTUEgfCBJQ1JfU1RBUlQgfCBJQ1JfU1RPUCk7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3B4YV93YWl0X2J1c19ub3RfYnVzeShzdHJ1Y3QgcHhhX2kyYyAqaTJjKQoreworCWludCB0aW1lb3V0ID0gREVGX1RJTUVPVVQ7CisKKwl3aGlsZSAodGltZW91dC0tICYmIElTUiAmIChJU1JfSUJCIHwgSVNSX1VCKSkgeworCQlpZiAoKElTUiAmIElTUl9TQUQpICE9IDApCisJCQl0aW1lb3V0ICs9IDQ7CisKKwkJbXNsZWVwKDIpOworCQlzaG93X3N0YXRlKGkyYyk7CisJfQorCisJaWYgKHRpbWVvdXQgPD0gMCkKKwkJc2hvd19zdGF0ZShpMmMpOworCisJcmV0dXJuIHRpbWVvdXQgPD0gMCA/IEkyQ19SRVRSWSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3B4YV93YWl0X21hc3RlcihzdHJ1Y3QgcHhhX2kyYyAqaTJjKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWio0OworCisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlmIChpMmNfZGVidWcgPiAxKQorCQkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiAlbGQ6IElTUj0lMDh4LCBJQ1I9JTA4eCwgSUJNUj0lMDJ4XG4iLAorCQkJCV9fZnVuY19fLCAobG9uZylqaWZmaWVzLCBJU1IsIElDUiwgSUJNUik7CisKKwkJaWYgKElTUiAmIElTUl9TQUQpIHsKKwkJCWlmIChpMmNfZGVidWcgPiAwKQorCQkJCWRldl9kYmcoJmkyYy0+YWRhcC5kZXYsICIlczogU2xhdmUgZGV0ZWN0ZWRcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogd2FpdCBmb3IgdW5pdCBhbmQgYnVzIGJlaW5nIG5vdCBidXN5LCBhbmQgd2UgYWxzbyBkbyBhCisJCSAqIHF1aWNrIGNoZWNrIG9mIHRoZSBpMmMgbGluZXMgdGhlbXNlbHZlcyB0byBlbnN1cmUgdGhleSd2ZQorCQkgKiBnb25lIGhpZ2guLi4KKwkJICovCisJCWlmICgoSVNSICYgKElTUl9VQiB8IElTUl9JQkIpKSA9PSAwICYmIElCTVIgPT0gMykgeworCQkJaWYgKGkyY19kZWJ1ZyA+IDApCisJCQkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCW1zbGVlcCgxKTsKKwl9CisKKwlpZiAoaTJjX2RlYnVnID4gMCkKKwkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiBkaWQgbm90IGZyZWVcbiIsIF9fZnVuY19fKTsKKyBvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3B4YV9zZXRfbWFzdGVyKHN0cnVjdCBweGFfaTJjICppMmMpCit7CisJaWYgKGkyY19kZWJ1ZykKKwkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgInNldHRpbmcgdG8gYnVzIG1hc3RlclxuIik7CisKKwlpZiAoKElTUiAmIChJU1JfVUIgfCBJU1JfSUJCKSkgIT0gMCkgeworCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiJXM6IHVuaXQgaXMgYnVzeVxuIiwgX19mdW5jX18pOworCQlpZiAoIWkyY19weGFfd2FpdF9tYXN0ZXIoaTJjKSkgeworCQkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiBlcnJvcjogdW5pdCBidXN5XG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gSTJDX1JFVFJZOworCQl9CisJfQorCisJSUNSIHw9IElDUl9TQ0xFOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0kyQ19QWEFfU0xBVkUKK3N0YXRpYyBpbnQgaTJjX3B4YV93YWl0X3NsYXZlKHN0cnVjdCBweGFfaTJjICppMmMpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaKjE7CisKKwkvKiB3YWl0IGZvciBzdG9wICovCisKKwlzaG93X3N0YXRlKGkyYyk7CisKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJaWYgKGkyY19kZWJ1ZyA+IDEpCisJCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiJXM6ICVsZDogSVNSPSUwOHgsIElDUj0lMDh4LCBJQk1SPSUwMnhcbiIsCisJCQkJX19mdW5jX18sIChsb25nKWppZmZpZXMsIElTUiwgSUNSLCBJQk1SKTsKKworCQlpZiAoKElTUiAmIChJU1JfVUJ8SVNSX0lCQnxJU1JfU0FEKSkgPT0gSVNSX1NBRCB8fAorCQkgICAgKElDUiAmIElDUl9TQ0xFKSA9PSAwKSB7CisJCQlpZiAoaTJjX2RlYnVnID4gMSkKKwkJCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiJXM6IGRvbmVcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJbXNsZWVwKDEpOworCX0KKworCWlmIChpMmNfZGVidWcgPiAwKQorCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiJXM6IGRpZCBub3QgZnJlZVxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCisvKgorICogY2xlYXIgdGhlIGhvbGQgb24gdGhlIGJ1cywgYW5kIHRha2Ugb2YgYW55dGhpbmcgZWxzZQorICogdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkCisgKi8KK3N0YXRpYyB2b2lkIGkyY19weGFfc2V0X3NsYXZlKHN0cnVjdCBweGFfaTJjICppMmMsIGludCBlcnJjb2RlKQoreworCXNob3dfc3RhdGUoaTJjKTsKKworCWlmIChlcnJjb2RlIDwgMCkgeworCQl1ZGVsYXkoMTAwKTsgICAvKiBzaW1wbGUgZGVsYXkgKi8KKwl9IGVsc2UgeworCQkvKiB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBzdG9wIGNvbmRpdGlvbiB0byBlbmQgKi8KKworCQkvKiBpZiB3ZSB3aGVyZSBpbiBzdG9wLCB0aGVuIGNsZWFyLi4uICovCisJCWlmIChJQ1IgJiBJQ1JfU1RPUCkgeworCQkJdWRlbGF5KDEwMCk7CisJCQlJQ1IgJj0gfklDUl9TVE9QOworCQl9CisKKwkJaWYgKCFpMmNfcHhhX3dhaXRfc2xhdmUoaTJjKSkgeworCQkJZGV2X2VycigmaTJjLT5hZGFwLmRldiwgIiVzOiB3YWl0IHRpbWVkb3V0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCUlDUiAmPSB+KElDUl9TVE9QfElDUl9BQ0tOQUt8SUNSX01BKTsKKwlJQ1IgJj0gfklDUl9TQ0xFOworCisJaWYgKGkyY19kZWJ1ZykgeworCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiSUNSIG5vdyAlMDh4LCBJU1IgJTA4eFxuIiwgSUNSLCBJU1IpOworCQlkZWNvZGVfSUNSKElDUik7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgaTJjX3B4YV9zZXRfc2xhdmUoaTJjLCBlcnIpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpMmNfcHhhX3Jlc2V0KHN0cnVjdCBweGFfaTJjICppMmMpCit7CisJcHJfZGVidWcoIlJlc2V0dGluZyBJMkMgQ29udHJvbGxlciBVbml0XG4iKTsKKworCS8qIGFib3J0IGFueSB0cmFuc2ZlciBjdXJyZW50bHkgdW5kZXIgd2F5ICovCisJaTJjX3B4YV9hYm9ydChpMmMpOworCisJLyogcmVzZXQgYWNjb3JkaW5nIHRvIDkuOCAqLworCUlDUiA9IElDUl9VUjsKKwlJU1IgPSBJMkNfSVNSX0lOSVQ7CisJSUNSICY9IH5JQ1JfVVI7CisKKwlJU0FSID0gaTJjLT5zbGF2ZV9hZGRyOworCisJLyogc2V0IGNvbnRyb2wgcmVnaXN0ZXIgdmFsdWVzICovCisJSUNSID0gSTJDX0lDUl9JTklUOworCisjaWZkZWYgQ09ORklHX0kyQ19QWEFfU0xBVkUKKwlkZXZfaW5mbygmaTJjLT5hZGFwLmRldiwgIkVuYWJsaW5nIHNsYXZlIG1vZGVcbiIpOworCUlDUiB8PSBJQ1JfU0FESUUgfCBJQ1JfQUxESUUgfCBJQ1JfU1NESUU7CisjZW5kaWYKKworCWkyY19weGFfc2V0X3NsYXZlKGkyYywgMCk7CisKKwkvKiBlbmFibGUgdW5pdCAqLworCUlDUiB8PSBJQ1JfSVVFOworCXVkZWxheSgxMDApOworfQorCisKKyNpZmRlZiBDT05GSUdfSTJDX1BYQV9TTEFWRQorLyoKKyAqIEkyQyBFRVBST00gZW11bGF0aW9uLgorICovCitzdGF0aWMgc3RydWN0IGkyY19lZXByb21fZW11IGVlcHJvbSA9IHsKKwkuc2l6ZSA9IEkyQ19FRVBST01fRU1VX1NJWkUsCisJLndhdGNoID0gTElTVF9IRUFEX0lOSVQoZWVwcm9tLndhdGNoKSwKK307CisKK3N0cnVjdCBpMmNfZWVwcm9tX2VtdSAqaTJjX3B4YV9nZXRfZWVwcm9tKHZvaWQpCit7CisJcmV0dXJuICZlZXByb207Cit9CisKK2ludCBpMmNfZWVwcm9tX2VtdV9hZGR3YXRjaGVyKHN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqZW11LCB2b2lkICpkYXRhLAorCQkJICAgICAgdW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGludCBzaXplLAorCQkJICAgICAgc3RydWN0IGkyY19lZXByb21fZW11X3dhdGNoZXIgKndhdGNoZXIpCit7CisJc3RydWN0IGkyY19lZXByb21fZW11X3dhdGNoICp3YXRjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGFkZHIgKyBzaXplID4gZW11LT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdhdGNoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19lZXByb21fZW11X3dhdGNoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHdhdGNoKSB7CisJCXdhdGNoLT5zdGFydCA9IGFkZHI7CisJCXdhdGNoLT5lbmQgPSBhZGRyICsgc2l6ZSAtIDE7CisJCXdhdGNoLT5vcHMgPSB3YXRjaGVyOworCQl3YXRjaC0+ZGF0YSA9IGRhdGE7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlsaXN0X2FkZCgmd2F0Y2gtPm5vZGUsICZlbXUtPndhdGNoKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKworCXJldHVybiB3YXRjaCA/IDAgOiAtRU5PTUVNOworfQorCit2b2lkIGkyY19lZXByb21fZW11X2RlbHdhdGNoZXIoc3RydWN0IGkyY19lZXByb21fZW11ICplbXUsIHZvaWQgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IGkyY19lZXByb21fZW11X3dhdGNoZXIgKndhdGNoZXIpCit7CisJc3RydWN0IGkyY19lZXByb21fZW11X3dhdGNoICp3YXRjaCwgKm47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YXRjaCwgbiwgJmVtdS0+d2F0Y2gsIG5vZGUpIHsKKwkJaWYgKHdhdGNoLT5vcHMgPT0gd2F0Y2hlciAmJiB3YXRjaC0+ZGF0YSA9PSBkYXRhKSB7CisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlsaXN0X2RlbCgmd2F0Y2gtPm5vZGUpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJa2ZyZWUod2F0Y2gpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpMmNfZWVwcm9tX2VtdV9ldmVudCh2b2lkICpwdHIsIGkyY19zbGF2ZV9ldmVudF90IGV2ZW50KQoreworCXN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqZW11ID0gcHRyOworCisJZWVkYmcoMywgImkyY19lZXByb21fZW11X2V2ZW50OiAlZFxuIiwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSTJDX1NMQVZFX0VWRU5UX1NUQVJUX1dSSVRFOgorCQllbXUtPnNlZW5fc3RhcnQgPSAxOworCQllZWRiZygyLCAiaTJjX2VlcHJvbTogd3JpdGUgaW5pdGlhdGVkXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyQ19TTEFWRV9FVkVOVF9TVEFSVF9SRUFEOgorCQllbXUtPnNlZW5fc3RhcnQgPSAwOworCQllZWRiZygyLCAiaTJjX2VlcHJvbTogcmVhZCBpbml0aWF0ZWRcbiIpOworCQlicmVhazsKKworCWNhc2UgSTJDX1NMQVZFX0VWRU5UX1NUT1A6CisJCWVtdS0+c2Vlbl9zdGFydCA9IDA7CisJCWVlZGJnKDIsICJpMmNfZWVwcm9tOiByZWNlaXZlZCBzdG9wXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllZWRiZygwLCAiaTJjX2VlcHJvbTogdW5oYW5kbGVkIGV2ZW50XG4iKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGkyY19lZXByb21fZW11X3JlYWQodm9pZCAqcHRyKQoreworCXN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqZW11ID0gcHRyOworCWludCByZXQ7CisKKwlyZXQgPSBlbXUtPmJ5dGVzW2VtdS0+cHRyXTsKKwllbXUtPnB0ciA9IChlbXUtPnB0ciArIDEpICUgZW11LT5zaXplOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaTJjX2VlcHJvbV9lbXVfd3JpdGUodm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqZW11ID0gcHRyOworCXN0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaCAqd2F0Y2g7CisKKwlpZiAoZW11LT5zZWVuX3N0YXJ0ICE9IDApIHsKKwkJZWVkYmcoMiwgImkyY19lZXByb21fZW11X3dyaXRlOiBzZXR0aW5nIHB0ciAlMDJ4XG4iLCB2YWwpOworCQllbXUtPnB0ciA9IHZhbDsKKwkJZW11LT5zZWVuX3N0YXJ0ID0gMDsKKwkJcmV0dXJuOworCX0KKworCWVtdS0+Ynl0ZXNbZW11LT5wdHJdID0gdmFsOworCisJZWVkYmcoMSwgImkyY19lZXByb21fZW11X3dyaXRlOiBwdHI9MHglMDJ4LCB2YWw9MHglMDJ4XG4iLAorCSAgICAgIGVtdS0+cHRyLCB2YWwpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3YXRjaCwgJmVtdS0+d2F0Y2gsIG5vZGUpIHsKKwkJaWYgKCF3YXRjaC0+b3BzIHx8ICF3YXRjaC0+b3BzLT53cml0ZSkKKwkJCWNvbnRpbnVlOworCQlpZiAod2F0Y2gtPnN0YXJ0IDw9IGVtdS0+cHRyICYmIHdhdGNoLT5lbmQgPj0gZW11LT5wdHIpCisJCQl3YXRjaC0+b3BzLT53cml0ZSh3YXRjaC0+ZGF0YSwgZW11LT5wdHIsIHZhbCk7CisJfQorCisJZW11LT5wdHIgPSAoZW11LT5wdHIgKyAxKSAlIGVtdS0+c2l6ZTsKK30KKworc3RydWN0IGkyY19zbGF2ZV9jbGllbnQgZWVwcm9tX2NsaWVudCA9IHsKKwkuZGF0YQk9ICZlZXByb20sCisJLmV2ZW50CT0gaTJjX2VlcHJvbV9lbXVfZXZlbnQsCisJLnJlYWQJPSBpMmNfZWVwcm9tX2VtdV9yZWFkLAorCS53cml0ZQk9IGkyY19lZXByb21fZW11X3dyaXRlCit9OworCisvKgorICogUFhBIEkyQyBTbGF2ZSBtb2RlCisgKi8KKworc3RhdGljIHZvaWQgaTJjX3B4YV9zbGF2ZV90eGVtcHR5KHN0cnVjdCBweGFfaTJjICppMmMsIHUzMiBpc3IpCit7CisJaWYgKGlzciAmIElTUl9CRUQpIHsKKwkJLyogd2hhdCBzaG91bGQgd2UgZG8gaGVyZT8gKi8KKwl9IGVsc2UgeworCQlpbnQgcmV0ID0gaTJjLT5zbGF2ZS0+cmVhZChpMmMtPnNsYXZlLT5kYXRhKTsKKworCQlJREJSID0gcmV0OworCQlJQ1IgfD0gSUNSX1RCOyAgIC8qIGFsbG93IG5leHQgYnl0ZSAqLworCX0KK30KKworc3RhdGljIHZvaWQgaTJjX3B4YV9zbGF2ZV9yeGZ1bGwoc3RydWN0IHB4YV9pMmMgKmkyYywgdTMyIGlzcikKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZSA9IElEQlI7CisKKwlpZiAoaTJjLT5zbGF2ZSAhPSBOVUxMKQorCQlpMmMtPnNsYXZlLT53cml0ZShpMmMtPnNsYXZlLT5kYXRhLCBieXRlKTsKKworCUlDUiB8PSBJQ1JfVEI7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19weGFfc2xhdmVfc3RhcnQoc3RydWN0IHB4YV9pMmMgKmkyYywgdTMyIGlzcikKK3sKKwlpbnQgdGltZW91dDsKKworCWlmIChpMmNfZGVidWcgPiAwKQorCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiU0FELCBtb2RlIGlzIHNsYXZlLSVjeFxuIiwKKwkJICAgICAgIChpc3IgJiBJU1JfUldNKSA/ICdyJyA6ICd0Jyk7CisKKwlpZiAoaTJjLT5zbGF2ZSAhPSBOVUxMKQorCQlpMmMtPnNsYXZlLT5ldmVudChpMmMtPnNsYXZlLT5kYXRhLAorCQkJCSAoaXNyICYgSVNSX1JXTSkgPyBJMkNfU0xBVkVfRVZFTlRfU1RBUlRfUkVBRCA6IEkyQ19TTEFWRV9FVkVOVF9TVEFSVF9XUklURSk7CisKKwkvKgorCSAqIHNsYXZlIGNvdWxkIGludGVycnVwdCBpbiB0aGUgbWlkZGxlIG9mIHVzIGdlbmVyYXRpbmcgYQorCSAqIHN0YXJ0IGNvbmRpdGlvbi4uLiBpZiB0aGlzIGhhcHBlbnMsIHdlJ2QgYmV0dGVyIGJhY2sgb2ZmCisJICogYW5kIHN0b3AgaG9sZGluZyB0aGUgcG9vciB0aGluZyB1cAorCSAqLworCUlDUiAmPSB+KElDUl9TVEFSVHxJQ1JfU1RPUCk7CisJSUNSIHw9IElDUl9UQjsKKworCXRpbWVvdXQgPSAweDEwMDAwOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKChJQk1SICYgMikgPT0gMikKKwkJCWJyZWFrOworCisJCXRpbWVvdXQtLTsKKworCQlpZiAodGltZW91dCA8PSAwKSB7CisJCQlkZXZfZXJyKCZpMmMtPmFkYXAuZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBTQ0wgaGlnaFxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCUlDUiAmPSB+SUNSX1NDTEU7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19weGFfc2xhdmVfc3RvcChzdHJ1Y3QgcHhhX2kyYyAqaTJjKQoreworCWlmIChpMmNfZGVidWcgPiAyKQorCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiSVNSOiBTU0QgKFNsYXZlIFN0b3ApXG4iKTsKKworCWlmIChpMmMtPnNsYXZlICE9IE5VTEwpCisJCWkyYy0+c2xhdmUtPmV2ZW50KGkyYy0+c2xhdmUtPmRhdGEsIEkyQ19TTEFWRV9FVkVOVF9TVE9QKTsKKworCWlmIChpMmNfZGVidWcgPiAyKQorCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiSVNSOiBTU0QgKFNsYXZlIFN0b3ApIGFja2VkXG4iKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBhIG1hc3Rlci1tb2RlIG1lc3NhZ2Ugd2FpdGluZywKKwkgKiBraWNrIGl0IG9mZiBub3cgdGhhdCB0aGUgc2xhdmUgaGFzIGNvbXBsZXRlZC4KKwkgKi8KKwlpZiAoaTJjLT5tc2cpCisJCWkyY19weGFfbWFzdGVyX2NvbXBsZXRlKGkyYywgSTJDX1JFVFJZKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBpMmNfcHhhX3NsYXZlX3R4ZW1wdHkoc3RydWN0IHB4YV9pMmMgKmkyYywgdTMyIGlzcikKK3sKKwlpZiAoaXNyICYgSVNSX0JFRCkgeworCQkvKiB3aGF0IHNob3VsZCB3ZSBkbyBoZXJlPyAqLworCX0gZWxzZSB7CisJCUlEQlIgPSAwOworCQlJQ1IgfD0gSUNSX1RCOworCX0KK30KKworc3RhdGljIHZvaWQgaTJjX3B4YV9zbGF2ZV9yeGZ1bGwoc3RydWN0IHB4YV9pMmMgKmkyYywgdTMyIGlzcikKK3sKKwlJQ1IgfD0gSUNSX1RCIHwgSUNSX0FDS05BSzsKK30KKworc3RhdGljIHZvaWQgaTJjX3B4YV9zbGF2ZV9zdGFydChzdHJ1Y3QgcHhhX2kyYyAqaTJjLCB1MzIgaXNyKQoreworCWludCB0aW1lb3V0OworCisJLyoKKwkgKiBzbGF2ZSBjb3VsZCBpbnRlcnJ1cHQgaW4gdGhlIG1pZGRsZSBvZiB1cyBnZW5lcmF0aW5nIGEKKwkgKiBzdGFydCBjb25kaXRpb24uLi4gaWYgdGhpcyBoYXBwZW5zLCB3ZSdkIGJldHRlciBiYWNrIG9mZgorCSAqIGFuZCBzdG9wIGhvbGRpbmcgdGhlIHBvb3IgdGhpbmcgdXAKKwkgKi8KKwlJQ1IgJj0gfihJQ1JfU1RBUlR8SUNSX1NUT1ApOworCUlDUiB8PSBJQ1JfVEIgfCBJQ1JfQUNLTkFLOworCisJdGltZW91dCA9IDB4MTAwMDA7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoKElCTVIgJiAyKSA9PSAyKQorCQkJYnJlYWs7CisKKwkJdGltZW91dC0tOworCisJCWlmICh0aW1lb3V0IDw9IDApIHsKKwkJCWRldl9lcnIoJmkyYy0+YWRhcC5kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIFNDTCBoaWdoXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJSUNSICY9IH5JQ1JfU0NMRTsKK30KKworc3RhdGljIHZvaWQgaTJjX3B4YV9zbGF2ZV9zdG9wKHN0cnVjdCBweGFfaTJjICppMmMpCit7CisJaWYgKGkyYy0+bXNnKQorCQlpMmNfcHhhX21hc3Rlcl9jb21wbGV0ZShpMmMsIEkyQ19SRVRSWSk7Cit9CisjZW5kaWYKKworLyoKKyAqIFBYQSBJMkMgTWFzdGVyIG1vZGUKKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpMmNfcHhhX2FkZHJfYnl0ZShzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCXVuc2lnbmVkIGludCBhZGRyID0gKG1zZy0+YWRkciAmIDB4N2YpIDw8IDE7CisKKwlpZiAobXNnLT5mbGFncyAmIEkyQ19NX1JEKQorCQlhZGRyIHw9IDE7CisKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGkyY19weGFfc3RhcnRfbWVzc2FnZShzdHJ1Y3QgcHhhX2kyYyAqaTJjKQoreworCXUzMiBpY3I7CisKKwkvKgorCSAqIFN0ZXAgMTogdGFyZ2V0IHNsYXZlIGFkZHJlc3MgaW50byBJREJSCisJICovCisJSURCUiA9IGkyY19weGFfYWRkcl9ieXRlKGkyYy0+bXNnKTsKKworCS8qCisJICogU3RlcCAyOiBpbml0aWF0ZSB0aGUgd3JpdGUuCisJICovCisJaWNyID0gSUNSICYgfihJQ1JfU1RPUCB8IElDUl9BTERJRSk7CisJSUNSID0gaWNyIHwgSUNSX1NUQVJUIHwgSUNSX1RCOworfQorCisvKgorICogV2UgYXJlIHByb3RlY3RlZCBieSB0aGUgYWRhcHRlciBidXMgc2VtYXBob3JlLgorICovCitzdGF0aWMgaW50IGkyY19weGFfZG9feGZlcihzdHJ1Y3QgcHhhX2kyYyAqaTJjLCBzdHJ1Y3QgaTJjX21zZyAqbXNnLCBpbnQgbnVtKQoreworCWxvbmcgdGltZW91dDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgYnVzIHRvIGJlY29tZSBmcmVlLgorCSAqLworCXJldCA9IGkyY19weGFfd2FpdF9idXNfbm90X2J1c3koaTJjKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmkyYy0+YWRhcC5kZXYsICJpMmNfcHhhOiB0aW1lb3V0IHdhaXRpbmcgZm9yIGJ1cyBmcmVlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBTZXQgbWFzdGVyIG1vZGUuCisJICovCisJcmV0ID0gaTJjX3B4YV9zZXRfbWFzdGVyKGkyYyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpMmMtPmFkYXAuZGV2LCAiaTJjX3B4YV9zZXRfbWFzdGVyOiBlcnJvciAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaTJjLT5sb2NrKTsKKworCWkyYy0+bXNnID0gbXNnOworCWkyYy0+bXNnX251bSA9IG51bTsKKwlpMmMtPm1zZ19pZHggPSAwOworCWkyYy0+bXNnX3B0ciA9IDA7CisJaTJjLT5pcnFsb2dpZHggPSAwOworCisJaTJjX3B4YV9zdGFydF9tZXNzYWdlKGkyYyk7CisKKwlzcGluX3VubG9ja19pcnEoJmkyYy0+bG9jayk7CisKKwkvKgorCSAqIFRoZSByZXN0IG9mIHRoZSBwcm9jZXNzaW5nIG9jY3VycyBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCisJICovCisJdGltZW91dCA9IHdhaXRfZXZlbnRfdGltZW91dChpMmMtPndhaXQsIGkyYy0+bXNnX251bSA9PSAwLCBIWiAqIDUpOworCisJLyoKKwkgKiBXZSBwbGFjZSB0aGUgcmV0dXJuIGNvZGUgaW4gaTJjLT5tc2dfaWR4LgorCSAqLworCXJldCA9IGkyYy0+bXNnX2lkeDsKKworCWlmICh0aW1lb3V0ID09IDApCisJCWkyY19weGFfc2NyZWFtX2JsdWVfbXVyZGVyKGkyYywgInRpbWVvdXQiKTsKKworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaTJjX3B4YV9tYXN0ZXJfY29tcGxldGUgLSBjb21wbGV0ZSB0aGUgbWVzc2FnZSBhbmQgd2FrZSB1cC4KKyAqLworc3RhdGljIHZvaWQgaTJjX3B4YV9tYXN0ZXJfY29tcGxldGUoc3RydWN0IHB4YV9pMmMgKmkyYywgaW50IHJldCkKK3sKKwlpMmMtPm1zZ19wdHIgPSAwOworCWkyYy0+bXNnID0gTlVMTDsKKwlpMmMtPm1zZ19pZHggKys7CisJaTJjLT5tc2dfbnVtID0gMDsKKwlpZiAocmV0KQorCQlpMmMtPm1zZ19pZHggPSByZXQ7CisJd2FrZV91cCgmaTJjLT53YWl0KTsKK30KKworc3RhdGljIHZvaWQgaTJjX3B4YV9pcnFfdHhlbXB0eShzdHJ1Y3QgcHhhX2kyYyAqaTJjLCB1MzIgaXNyKQoreworCXUzMiBpY3IgPSBJQ1IgJiB+KElDUl9TVEFSVHxJQ1JfU1RPUHxJQ1JfQUNLTkFLfElDUl9UQik7CisKKyBhZ2FpbjoKKwkvKgorCSAqIElmIElTUl9BTEQgaXMgc2V0LCB3ZSBsb3N0IGFyYml0cmF0aW9uLgorCSAqLworCWlmIChpc3IgJiBJU1JfQUxEKSB7CisJCS8qCisJCSAqIERvIHdlIG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZT8gIFRoZSBQWEEgZG9jcworCQkgKiBhcmUgdmFndWUgYWJvdXQgd2hhdCBoYXBwZW5zLgorCQkgKi8KKwkJaTJjX3B4YV9zY3JlYW1fYmx1ZV9tdXJkZXIoaTJjLCAiQUxEIHNldCIpOworCisJCS8qCisJCSAqIFdlIGlnbm9yZSB0aGlzIGVycm9yLiAgV2Ugc2VlbSB0byBzZWUgc3B1cmlvdXMgQUxEcworCQkgKiBmb3Igc2VlbWluZ2x5IG5vIHJlYXNvbi4gIElmIHdlIGhhbmRsZSB0aGVtIGFzIEkgdGhpbmsKKwkJICogdGhleSBzaG91bGQsIHdlIGVuZCB1cCBjYXVzaW5nIGFuIEkyQyBlcnJvciwgd2hpY2gKKwkJICogaXMgcGFpbmZ1bCBmb3Igc29tZSBzeXN0ZW1zLgorCQkgKi8KKwkJcmV0dXJuOyAvKiBpZ25vcmUgKi8KKwl9CisKKwlpZiAoaXNyICYgSVNSX0JFRCkgeworCQlpbnQgcmV0ID0gQlVTX0VSUk9SOworCisJCS8qCisJCSAqIEkyQyBidXMgZXJyb3IgLSBlaXRoZXIgdGhlIGRldmljZSBOQUsnZCB1cywgb3IKKwkJICogc29tZXRoaW5nIG1vcmUgc2VyaW91cyBoYXBwZW5lZC4gIElmIHdlIHdlcmUgTkFLJ2QKKwkJICogb24gdGhlIGluaXRpYWwgYWRkcmVzcyBwaGFzZSwgd2UgY2FuIHJldHJ5LgorCQkgKi8KKwkJaWYgKGlzciAmIElTUl9BQ0tOQUspIHsKKwkJCWlmIChpMmMtPm1zZ19wdHIgPT0gMCAmJiBpMmMtPm1zZ19pZHggPT0gMCkKKwkJCQlyZXQgPSBJMkNfUkVUUlk7CisJCQllbHNlCisJCQkJcmV0ID0gWEZFUl9OQUtFRDsKKwkJfQorCQlpMmNfcHhhX21hc3Rlcl9jb21wbGV0ZShpMmMsIHJldCk7CisJfSBlbHNlIGlmIChpc3IgJiBJU1JfUldNKSB7CisJCS8qCisJCSAqIFJlYWQgbW9kZS4gIFdlIGhhdmUganVzdCBzZW50IHRoZSBhZGRyZXNzIGJ5dGUsIGFuZAorCQkgKiBub3cgd2UgbXVzdCBpbml0aWF0ZSB0aGUgdHJhbnNmZXIuCisJCSAqLworCQlpZiAoaTJjLT5tc2dfcHRyID09IGkyYy0+bXNnLT5sZW4gLSAxICYmCisJCSAgICBpMmMtPm1zZ19pZHggPT0gaTJjLT5tc2dfbnVtIC0gMSkKKwkJCWljciB8PSBJQ1JfU1RPUCB8IElDUl9BQ0tOQUs7CisKKwkJaWNyIHw9IElDUl9BTERJRSB8IElDUl9UQjsKKwl9IGVsc2UgaWYgKGkyYy0+bXNnX3B0ciA8IGkyYy0+bXNnLT5sZW4pIHsKKwkJLyoKKwkJICogV3JpdGUgbW9kZS4gIFdyaXRlIHRoZSBuZXh0IGRhdGEgYnl0ZS4KKwkJICovCisJCUlEQlIgPSBpMmMtPm1zZy0+YnVmW2kyYy0+bXNnX3B0cisrXTsKKworCQlpY3IgfD0gSUNSX0FMRElFIHwgSUNSX1RCOworCisJCS8qCisJCSAqIElmIHRoaXMgaXMgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgbGFzdCBtZXNzYWdlLCBzZW5kCisJCSAqIGEgU1RPUC4KKwkJICovCisJCWlmIChpMmMtPm1zZ19wdHIgPT0gaTJjLT5tc2ctPmxlbiAmJgorCQkgICAgaTJjLT5tc2dfaWR4ID09IGkyYy0+bXNnX251bSAtIDEpCisJCQlpY3IgfD0gSUNSX1NUT1A7CisJfSBlbHNlIGlmIChpMmMtPm1zZ19pZHggPCBpMmMtPm1zZ19udW0gLSAxKSB7CisJCS8qCisJCSAqIE5leHQgc2VnbWVudCBvZiB0aGUgbWVzc2FnZS4KKwkJICovCisJCWkyYy0+bXNnX3B0ciA9IDA7CisJCWkyYy0+bXNnX2lkeCArKzsKKwkJaTJjLT5tc2crKzsKKworCQkvKgorCQkgKiBJZiB3ZSBhcmVuJ3QgZG9pbmcgYSByZXBlYXRlZCBzdGFydCBhbmQgYWRkcmVzcywKKwkJICogZ28gYmFjayBhbmQgdHJ5IHRvIHNlbmQgdGhlIG5leHQgYnl0ZS4gIE5vdGUgdGhhdAorCQkgKiB3ZSBkbyBub3Qgc3VwcG9ydCBzd2l0Y2hpbmcgdGhlIFIvVyBkaXJlY3Rpb24gaGVyZS4KKwkJICovCisJCWlmIChpMmMtPm1zZy0+ZmxhZ3MgJiBJMkNfTV9OT1NUQVJUKQorCQkJZ290byBhZ2FpbjsKKworCQkvKgorCQkgKiBXcml0ZSB0aGUgbmV4dCBhZGRyZXNzLgorCQkgKi8KKwkJSURCUiA9IGkyY19weGFfYWRkcl9ieXRlKGkyYy0+bXNnKTsKKworCQkvKgorCQkgKiBBbmQgdHJpZ2dlciBhIHJlcGVhdGVkIHN0YXJ0LCBhbmQgc2VuZCB0aGUgYnl0ZS4KKwkJICovCisJCWljciAmPSB+SUNSX0FMRElFOworCQlpY3IgfD0gSUNSX1NUQVJUIHwgSUNSX1RCOworCX0gZWxzZSB7CisJCWlmIChpMmMtPm1zZy0+bGVuID09IDApIHsKKwkJCS8qCisJCQkgKiBEZXZpY2UgcHJvYmVzIGhhdmUgYSBtZXNzYWdlIGxlbmd0aCBvZiB6ZXJvCisJCQkgKiBhbmQgbmVlZCB0aGUgYnVzIHRvIGJlIHJlc2V0IGJlZm9yZSBpdCBjYW4KKwkJCSAqIGJlIHVzZWQgYWdhaW4uCisJCQkgKi8KKwkJCWkyY19weGFfcmVzZXQoaTJjKTsKKwkJfQorCQlpMmNfcHhhX21hc3Rlcl9jb21wbGV0ZShpMmMsIDApOworCX0KKworCWkyYy0+aWNybG9nW2kyYy0+aXJxbG9naWR4LTFdID0gaWNyOworCisJSUNSID0gaWNyOworCXNob3dfc3RhdGUoaTJjKTsKK30KKworc3RhdGljIHZvaWQgaTJjX3B4YV9pcnFfcnhmdWxsKHN0cnVjdCBweGFfaTJjICppMmMsIHUzMiBpc3IpCit7CisJdTMyIGljciA9IElDUiAmIH4oSUNSX1NUQVJUfElDUl9TVE9QfElDUl9BQ0tOQUt8SUNSX1RCKTsKKworCS8qCisJICogUmVhZCB0aGUgYnl0ZS4KKwkgKi8KKwlpMmMtPm1zZy0+YnVmW2kyYy0+bXNnX3B0cisrXSA9IElEQlI7CisKKwlpZiAoaTJjLT5tc2dfcHRyIDwgaTJjLT5tc2ctPmxlbikgeworCQkvKgorCQkgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGxhc3QKKwkJICogbWVzc2FnZSwgc2VuZCBhIFNUT1AuCisJCSAqLworCQlpZiAoaTJjLT5tc2dfcHRyID09IGkyYy0+bXNnLT5sZW4gLSAxKQorCQkJaWNyIHw9IElDUl9TVE9QIHwgSUNSX0FDS05BSzsKKworCQlpY3IgfD0gSUNSX0FMRElFIHwgSUNSX1RCOworCX0gZWxzZSB7CisJCWkyY19weGFfbWFzdGVyX2NvbXBsZXRlKGkyYywgMCk7CisJfQorCisJaTJjLT5pY3Jsb2dbaTJjLT5pcnFsb2dpZHgtMV0gPSBpY3I7CisKKwlJQ1IgPSBpY3I7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpMmNfcHhhX2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBweGFfaTJjICppMmMgPSBkZXZfaWQ7CisJdTMyIGlzciA9IElTUjsKKworCWlmIChpMmNfZGVidWcgPiAyICYmIDApIHsKKwkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiBJU1I9JTA4eCwgSUNSPSUwOHgsIElCTVI9JTAyeFxuIiwKKwkJCV9fZnVuY19fLCBpc3IsIElDUiwgSUJNUik7CisJCWRlY29kZV9JU1IoaXNyKTsKKwl9CisKKwlpZiAoaTJjLT5pcnFsb2dpZHggPCBzaXplb2YoaTJjLT5pc3Jsb2cpL3NpemVvZih1MzIpKQorCQlpMmMtPmlzcmxvZ1tpMmMtPmlycWxvZ2lkeCsrXSA9IGlzcjsKKworCXNob3dfc3RhdGUoaTJjKTsKKworCS8qCisJICogQWx3YXlzIGNsZWFyIGFsbCBwZW5kaW5nIElSUXMuCisJICovCisJSVNSID0gaXNyICYgKElTUl9TU0R8SVNSX0FMRHxJU1JfSVRFfElTUl9JUkZ8SVNSX1NBRHxJU1JfQkVEKTsKKworCWlmIChpc3IgJiBJU1JfU0FEKQorCQlpMmNfcHhhX3NsYXZlX3N0YXJ0KGkyYywgaXNyKTsKKwlpZiAoaXNyICYgSVNSX1NTRCkKKwkJaTJjX3B4YV9zbGF2ZV9zdG9wKGkyYyk7CisKKwlpZiAoaTJjX3B4YV9pc19zbGF2ZW1vZGUoaTJjKSkgeworCQlpZiAoaXNyICYgSVNSX0lURSkKKwkJCWkyY19weGFfc2xhdmVfdHhlbXB0eShpMmMsIGlzcik7CisJCWlmIChpc3IgJiBJU1JfSVJGKQorCQkJaTJjX3B4YV9zbGF2ZV9yeGZ1bGwoaTJjLCBpc3IpOworCX0gZWxzZSBpZiAoaTJjLT5tc2cpIHsKKwkJaWYgKGlzciAmIElTUl9JVEUpCisJCQlpMmNfcHhhX2lycV90eGVtcHR5KGkyYywgaXNyKTsKKwkJaWYgKGlzciAmIElTUl9JUkYpCisJCQlpMmNfcHhhX2lycV9yeGZ1bGwoaTJjLCBpc3IpOworCX0gZWxzZSB7CisJCWkyY19weGFfc2NyZWFtX2JsdWVfbXVyZGVyKGkyYywgInNwdXJpb3VzIGlycSIpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgaW50IGkyY19weGFfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ3NbXSwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgcHhhX2kyYyAqaTJjID0gYWRhcC0+YWxnb19kYXRhOworCWludCByZXQsIGk7CisKKwlmb3IgKGkgPSBhZGFwLT5yZXRyaWVzOyBpID49IDA7IGktLSkgeworCQlyZXQgPSBpMmNfcHhhX2RvX3hmZXIoaTJjLCBtc2dzLCBudW0pOworCQlpZiAocmV0ICE9IEkyQ19SRVRSWSkKKwkJCWdvdG8gb3V0OworCisJCWlmIChpMmNfZGVidWcpCisJCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJSZXRyeWluZyB0cmFuc21pc3Npb25cbiIpOworCQl1ZGVsYXkoMTAwKTsKKwl9CisJaTJjX3B4YV9zY3JlYW1fYmx1ZV9tdXJkZXIoaTJjLCAiZXhoYXVzdGVkIHJldHJpZXMiKTsKKwlyZXQgPSAtRVJFTU9URUlPOworIG91dDoKKwlpMmNfcHhhX3NldF9zbGF2ZShpMmMsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGkyY19weGFfYWxnb3JpdGhtID0geworCS5uYW1lCQk9ICJQWEEtSTJDLUFsZ29yaXRobSIsCisJLmlkCQk9IEkyQ19BTEdPX1BYQSwKKwkubWFzdGVyX3hmZXIJPSBpMmNfcHhhX3hmZXIsCit9OworCitzdGF0aWMgc3RydWN0IHB4YV9pMmMgaTJjX3B4YSA9IHsKKwkubG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkud2FpdAk9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKGkyY19weGEud2FpdCksCisJLmFkYXAJPSB7CisJCS5uYW1lCQk9ICJweGEyeHgtaTJjIiwKKwkJLmlkCQk9IEkyQ19BTEdPX1BYQSwKKwkJLmFsZ28JCT0gJmkyY19weGFfYWxnb3JpdGhtLAorCQkucmV0cmllcwk9IDUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgaTJjX3B4YV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHB4YV9pMmMgKmkyYyA9ICZpMmNfcHhhOworCXN0cnVjdCBpMmNfcHhhX3BsYXRmb3JtX2RhdGEgKnBsYXQgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJaW50IHJldDsKKworI2lmZGVmIENPTkZJR19QWEEyN3gKKwlweGFfZ3Bpb19tb2RlKEdQSU8xMTdfSTJDU0NMX01EKTsKKwlweGFfZ3Bpb19tb2RlKEdQSU8xMThfSTJDU0RBX01EKTsKKwl1ZGVsYXkoMTAwKTsKKyNlbmRpZgorCisJaTJjLT5zbGF2ZV9hZGRyID0gSTJDX1BYQV9TTEFWRV9BRERSOworCisjaWZkZWYgQ09ORklHX0kyQ19QWEFfU0xBVkUKKwlpMmMtPnNsYXZlID0gJmVlcHJvbV9jbGllbnQ7CisJaWYgKHBsYXQpIHsKKwkJaTJjLT5zbGF2ZV9hZGRyID0gcGxhdC0+c2xhdmVfYWRkcjsKKwkJaWYgKHBsYXQtPnNsYXZlKQorCQkJaTJjLT5zbGF2ZSA9IHBsYXQtPnNsYXZlOworCX0KKyNlbmRpZgorCisJcHhhX3NldF9ja2VuKENLRU4xNF9JMkMsIDEpOworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9JMkMsIGkyY19weGFfaGFuZGxlciwgU0FfSU5URVJSVVBULAorCQkJICAicHhhMnh4LWkyYyIsIGkyYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpMmNfcHhhX3Jlc2V0KGkyYyk7CisKKwlpMmMtPmFkYXAuYWxnb19kYXRhID0gaTJjOworCWkyYy0+YWRhcC5kZXYucGFyZW50ID0gZGV2OworCisJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZpMmMtPmFkYXApOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkkyQzogRmFpbGVkIHRvIGFkZCBidXNcbiIpOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKGRldiwgaTJjKTsKKworI2lmZGVmIENPTkZJR19JMkNfUFhBX1NMQVZFCisJcHJpbnRrKEtFUk5fSU5GTyAiSTJDOiAlczogUFhBIEkyQyBhZGFwdGVyLCBzbGF2ZSBhZGRyZXNzICVkXG4iLAorCSAgICAgICBpMmMtPmFkYXAuZGV2LmJ1c19pZCwgaTJjLT5zbGF2ZV9hZGRyKTsKKyNlbHNlCisJcHJpbnRrKEtFUk5fSU5GTyAiSTJDOiAlczogUFhBIEkyQyBhZGFwdGVyXG4iLAorCSAgICAgICBpMmMtPmFkYXAuZGV2LmJ1c19pZCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworIGVycl9pcnE6CisJZnJlZV9pcnEoSVJRX0kyQywgaTJjKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpMmNfcHhhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHB4YV9pMmMgKmkyYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisKKwlpMmNfZGVsX2FkYXB0ZXIoJmkyYy0+YWRhcCk7CisJZnJlZV9pcnEoSVJRX0kyQywgaTJjKTsKKwlweGFfc2V0X2NrZW4oQ0tFTjE0X0kyQywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGkyY19weGFfZHJpdmVyID0geworCS5uYW1lCQk9ICJweGEyeHgtaTJjIiwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gaTJjX3B4YV9wcm9iZSwKKwkucmVtb3ZlCQk9IGkyY19weGFfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTJjX2FkYXBfcHhhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZpMmNfcHhhX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19hZGFwX3B4YV9leGl0KHZvaWQpCit7CisJcmV0dXJuIGRyaXZlcl91bnJlZ2lzdGVyKCZpMmNfcHhhX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGkyY19hZGFwX3B4YV9pbml0KTsKK21vZHVsZV9leGl0KGkyY19hZGFwX3B4YV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKaW5kZXggYTNiMzgyNS4uNzNhMDkyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKQEAgLTU2OCw3ICs1NjgsNiBAQAogLyogaTJjIGJ1cyByZWdpc3RyYXRpb24gaW5mbyAqLwogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gczNjMjR4eF9pMmNfYWxnb3JpdGhtID0gewotCS5uYW1lCQkJPSAiUzNDMjQxMC1JMkMtQWxnb3JpdGhtIiwKIAkubWFzdGVyX3hmZXIJCT0gczNjMjR4eF9pMmNfeGZlciwKIAkuZnVuY3Rpb25hbGl0eQkJPSBzM2MyNHh4X2kyY19mdW5jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM1NTk1LmMKaW5kZXggYmJkNWU0ZS4uMDgwMzE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM1NTk1LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM1NTk1LmMKQEAgLTM1Nyw4ICszNTcsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0gewotCS5uYW1lCQk9ICJOb24tSTJDIFNNQnVzIGFkYXB0ZXIiLAotCS5pZAkJPSBJMkNfQUxHT19TTUJVUywKIAkuc21idXNfeGZlcgk9IHNpczU1OTVfYWNjZXNzLAogCS5mdW5jdGlvbmFsaXR5CT0gc2lzNTU5NV9mdW5jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNjMwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczYzMC5jCmluZGV4IGY1ODQ1NWUuLjg2ZjBmNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNjMwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM2MzAuYwpAQCAtNDQ4LDggKzQ0OCw2IEBACiAKIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKLQkubmFtZQkJPSAiTm9uLUkyQyBTTUJ1cyBhZGFwdGVyIiwKLQkuaWQJCT0gSTJDX0FMR09fU01CVVMsCiAJLnNtYnVzX3hmZXIJPSBzaXM2MzBfYWNjZXNzLAogCS5mdW5jdGlvbmFsaXR5CT0gc2lzNjMwX2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM5NnguYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzOTZ4LmMKaW5kZXggNjQ4NDc5Mi4uZWFkMmZmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM5NnguYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczk2eC5jCkBAIC0yNDksOCArMjQ5LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKLQkubmFtZQkJPSAiTm9uLUkyQyBTTUJ1cyBhZGFwdGVyIiwKLQkuaWQJCT0gSTJDX0FMR09fU01CVVMsCiAJLnNtYnVzX3hmZXIJPSBzaXM5NnhfYWNjZXNzLAogCS5mdW5jdGlvbmFsaXR5CT0gc2lzOTZ4X2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdHViLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0dWIuYwppbmRleCAwMGQ5NGU4Li43M2Y0ODFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0dWIuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0dWIuYwpAQCAtMTA5LDggKzEwOSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7Ci0JLm5hbWUJCT0gIk5vbi1JMkMgU01CdXMgYWRhcHRlciIsCi0JLmlkCQk9IEkyQ19BTEdPX1NNQlVTLAogCS5mdW5jdGlvbmFsaXR5CT0gc3R1Yl9mdW5jLAogCS5zbWJ1c194ZmVyCT0gc3R1Yl94ZmVyLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhcHJvLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZpYXByby5jCmluZGV4IDZiNTAwODAuLjk5ZDIwOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhcHJvLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWFwcm8uYwpAQCAtMjg2LDggKzI4Niw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7Ci0JLm5hbWUJCT0gIk5vbi1JMkMgU01CdXMgYWRhcHRlciIsCi0JLmlkCQk9IEkyQ19BTEdPX1NNQlVTLAogCS5zbWJ1c194ZmVyCT0gdnQ1OTZfYWNjZXNzLAogCS5mdW5jdGlvbmFsaXR5CT0gdnQ1OTZfZnVuYywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2FjYi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9hY2IuYwppbmRleCBhMThiZGQ5Li5hMWQ1ODBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2FjYi5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfYWNiLmMKQEAgLTM5NSw4ICszOTUsNiBAQAogCiAvKiBGb3Igbm93LCB3ZSBvbmx5IGhhbmRsZSBjb21iaW5lZCBtb2RlIChzbWJ1cykgKi8KIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzY3gyMDBfYWNiX2FsZ29yaXRobSA9IHsKLQkubmFtZQkJPSAiTmF0U2VtaSBTQ3gyMDAgQUNDRVNTLmJ1cyIsCi0JLmlkCQk9IEkyQ19BTEdPX1NNQlVTLAogCS5zbWJ1c194ZmVyCT0gc2N4MjAwX2FjYl9zbWJ1c194ZmVyLAogCS5mdW5jdGlvbmFsaXR5CT0gc2N4MjAwX2FjYl9mdW5jLAogfTsKQEAgLTQ1Niw3ICs0NTQsNyBAQAogCWkyY19zZXRfYWRhcGRhdGEoYWRhcHRlciwgaWZhY2UpOwogCXNucHJpbnRmKGFkYXB0ZXItPm5hbWUsIEkyQ19OQU1FX1NJWkUsICJTQ3gyMDAgQUNCJWQiLCBpbmRleCk7CiAJYWRhcHRlci0+b3duZXIgPSBUSElTX01PRFVMRTsKLQlhZGFwdGVyLT5pZCA9IEkyQ19BTEdPX1NNQlVTOworCWFkYXB0ZXItPmlkID0gSTJDX0hXX1NNQlVTX1NDWDIwMDsKIAlhZGFwdGVyLT5hbGdvID0gJnNjeDIwMF9hY2JfYWxnb3JpdGhtOwogCWFkYXB0ZXItPmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwppbmRleCA0M2Y3MGRiLi42YmQ0NGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKQEAgLTIsMTcgKzIsMTIgQEAKICMgTWlzY2VsbGFuZW91cyBJMkMgY2hpcCBkcml2ZXJzIGNvbmZpZ3VyYXRpb24KICMKIAotY29uZmlnIEkyQ19TRU5TT1IKLQl0cmlzdGF0ZQotCWRlZmF1bHQgbgotCiBtZW51ICJNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNFTlNPUlNfRFMxMzM3CiAJdHJpc3RhdGUgIkRhbGxhcyBTZW1pY29uZHVjdG9yIERTMTMzNyBhbmQgRFMxMzM5IFJlYWwgVGltZSBDbG9jayIKIAlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBEYWxsYXMgU2VtaWNvbmR1Y3RvcgogCSAgRFMxMzM3IGFuZCBEUzEzMzkgcmVhbC10aW1lIGNsb2NrIGNoaXBzLgpAQCAtMjMsNyArMTgsNiBAQAogY29uZmlnIFNFTlNPUlNfRFMxMzc0CiAJdHJpc3RhdGUgIk1heGltL0RhbGxhcyBTZW1pY29uZHVjdG9yIERTMTM3NCBSZWFsIFRpbWUgQ2xvY2siCiAJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRGFsbGFzIFNlbWljb25kdWN0b3IKIAkgIERTMTM3NCByZWFsLXRpbWUgY2xvY2sgY2hpcHMuCkBAIC0zNCw3ICsyOCw2IEBACiBjb25maWcgU0VOU09SU19FRVBST00KIAl0cmlzdGF0ZSAiRUVQUk9NIHJlYWRlciIKIAlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSBFRVBST00gZGF0YQogCSAgYXZhaWxhYmxlIG9uIG1vZGVybiBtZW1vcnkgRElNTXMgYW5kIFNvbnkgVmFpbyBsYXB0b3BzLiAgU3VjaApAQCAtNDYsNyArMzksNiBAQAogY29uZmlnIFNFTlNPUlNfUENGODU3NAogCXRyaXN0YXRlICJQaGlsaXBzIFBDRjg1NzQgYW5kIFBDRjg1NzRBIgogCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIFBoaWxpcHMgUENGODU3NCBhbmQgCiAJICBQQ0Y4NTc0QSBjaGlwcy4KQEAgLTY3LDcgKzU5LDYgQEAKIGNvbmZpZyBTRU5TT1JTX1BDRjg1OTEKIAl0cmlzdGF0ZSAiUGhpbGlwcyBQQ0Y4NTkxIgogCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIFBoaWxpcHMgUENGODU5MSBjaGlwcy4KIApAQCAtNzcsNyArNjgsNiBAQAogY29uZmlnIFNFTlNPUlNfUlRDODU2NAogCXRyaXN0YXRlICJFcHNvbiA4NTY0IFJUQyBjaGlwIgogCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBFcHNvbiA4NTY0IFJUQyBjaGlwLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9kczEzMzcuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTMzNy5jCmluZGV4IDgyY2Y5NTkuLjlkMzE3NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTMzNy5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTMzNy5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CQkvKiBnZXQgdGhlIHVzZXItbGV2ZWwgQVBJICovCiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CkBAIC0zOSw5ICszOCw4IEBACiAgKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KICAqLwogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg2OCwgSTJDX0NMSUVOVF9FTkQgfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKIAotU0VOU09SU19JTlNNT0RfMShkczEzMzcpOworSTJDX0NMSUVOVF9JTlNNT0RfMShkczEzMzcpOwogCiBzdGF0aWMgaW50IGRzMTMzN19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIGludCBkczEzMzdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKQEAgLTIyNyw3ICsyMjUsNyBAQAogCiBzdGF0aWMgaW50IGRzMTMzN19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgZHMxMzM3X2RldGVjdCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBkczEzMzdfZGV0ZWN0KTsKIH0KIAogLyoKQEAgLTM1NCwxMSArMzUyLDggQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBkczEzMzdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKLQkJCSJjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKIAkJcmV0dXJuIGVycjsKLQl9CiAKIAlsaXN0X2RlbCgmZGF0YS0+bGlzdCk7CiAJa2ZyZWUoZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9kczEzNzQuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTM3NC5jCmluZGV4IGE0NDU3MzYuLjA5MzYzMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTM3NC5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTM3NC5jCkBAIC01Myw3ICs1Myw2IEBACiAJLm5vcm1hbF9pMmMgPSBub3JtYWxfYWRkciwKIAkucHJvYmUgPSBpZ25vcmUsCiAJLmlnbm9yZSA9IGlnbm9yZSwKLQkuZm9yY2UgPSBpZ25vcmUsCiB9OwogCiBzdGF0aWMgdWxvbmcgZHMxMzc0X3JlYWRfcnRjKHZvaWQpCkBAIC0xNjYsNyArMTY1LDcgQEAKIAkJCSAiY2FuJ3QgY29uZmlybSB0aW1lIHNldCBmcm9tIHJ0YyBjaGlwXG4iKTsKIH0KIAotdWxvbmcgbmV3X3RpbWU7CitzdGF0aWMgdWxvbmcgbmV3X3RpbWU7CiAKIERFQ0xBUkVfVEFTS0xFVF9ESVNBQkxFRChkczEzNzRfdGFza2xldCwgZHMxMzc0X3NldF90bGV0LCAodWxvbmcpICYgbmV3X3RpbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2VlcHJvbS5jCmluZGV4IGEyZGEzMWIuLmQ1ODQwM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2VlcHJvbS5jCkBAIC0zMywxNSArMzMsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LAogCQkJCQkweDU1LCAweDU2LCAweDU3LCBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IEkyQ19DTElFTlRfSVNBX0VORCB9OwogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotU0VOU09SU19JTlNNT0RfMShlZXByb20pOworSTJDX0NMSUVOVF9JTlNNT0RfMShlZXByb20pOwogCiAKIC8qIFNpemUgb2YgRUVQUk9NIGluIGJ5dGVzICovCkBAIC0xNTMsMjEgKzE1MSwxNiBAQAogCiBzdGF0aWMgaW50IGVlcHJvbV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgZWVwcm9tX2RldGVjdCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBlZXByb21fZGV0ZWN0KTsKIH0KIAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX2RldGVjdCAqLworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX3Byb2JlICovCiBpbnQgZWVwcm9tX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKIAlzdHJ1Y3QgZWVwcm9tX2RhdGEgKmRhdGE7CiAJaW50IGVyciA9IDA7CiAKLQkvKiBwcmV2ZW50IDI0UkYwOCBjb3JydXB0aW9uICovCi0JaWYgKGtpbmQgPCAwKQotCQlpMmNfc21idXNfeGZlcihhZGFwdGVyLCBhZGRyZXNzLCAwLCAwLCAwLAotCQkJICAgICAgIEkyQ19TTUJVU19RVUlDSywgTlVMTCk7Ci0KIAkvKiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB3ZSBjYW4gcmVhZCB0aGUgRUVQUk9NIGRhdGE6CiAJICAgKDEpIEkyQyBibG9jayByZWFkcyAoZmFzdGVyLCBidXQgdW5zdXBwb3J0ZWQgYnkgbW9zdCBhZGFwdGVycykKIAkgICAoMikgQ29uc2VjdXRpdmUgYnl0ZSByZWFkcyAoMTAwJSBvdmVyaGVhZCkKQEAgLTIzMSwxMCArMjI0LDggQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JfQogCiAJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9pc3AxMzAxX29tYXAuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jCmluZGV4IDM1NGEyNjIuLjhlZTU2ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jCkBAIC0xNDg5LDcgKzE0ODksNyBAQAogCWlmICh0aGVfdHJhbnNjZWl2ZXIpCiAJCXJldHVybiAwOwogCi0JaXNwID0ga2NhbGxvYygxLCBzaXplb2YgKmlzcCwgR0ZQX0tFUk5FTCk7CisJaXNwID0ga3phbGxvYyhzaXplb2YgKmlzcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpc3ApCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9tNDF0MDAuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL200MXQwMC5jCmluZGV4IDc3OGQ3ZTEuLjNmMTQ1MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL200MXQwMC5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL200MXQwMC5jCkBAIC00Miw3ICs0Miw2IEBACiAJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2FkZHIsCiAJLnByb2JlCQkJPSBpZ25vcmUsCiAJLmlnbm9yZQkJCT0gaWdub3JlLAotCS5mb3JjZQkJCT0gaWdub3JlLAogfTsKIAogdWxvbmcKQEAgLTE0NSw3ICsxNDQsNyBAQAogCXJldHVybjsKIH0KIAotdWxvbmcJbmV3X3RpbWU7CitzdGF0aWMgdWxvbmcJbmV3X3RpbWU7CiAKIERFQ0xBUkVfVEFTS0xFVF9ESVNBQkxFRChtNDF0MDBfdGFza2xldCwgbTQxdDAwX3NldF90bGV0LCAodWxvbmcpJm5ld190aW1lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbWF4Njg3NS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvbWF4Njg3NS5jCmluZGV4IDAyMzAzNzUuLjllMWFlYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL21heDY4NzUuYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9tYXg2ODc1LmMKQEAgLTUsOTcgKzUsNjAgQEAKIAogICAgIEJhc2VkIG9uIGkyYy9jaGlwcy9lZXByb20uYwogCi0gICAgVGhlIE1BWDY4NzUgaGFzIHR3byBFRVBST00gc2VjdGlvbnM6IGNvbmZpZyBhbmQgdXNlci4KLSAgICBBdCByZXNldCwgdGhlIGNvbmZpZyBFRVBST00gaXMgcmVhZCBpbnRvIHRoZSByZWdpc3RlcnMuCisgICAgVGhlIE1BWDY4NzUgaGFzIGEgYmFuayBvZiByZWdpc3RlcnMgYW5kIHR3byBiYW5rcyBvZiBFRVBST00uCisgICAgQWRkcmVzcyByYW5nZXMgYXJlIGRlZmluZWQgYXMgZm9sbG93czoKKyAgICAgKiAweDAwMDAgLSAweDAwNDYgPSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICAgICAqIDB4ODAwMCAtIDB4ODA0NiA9IGNvbmZpZ3VyYXRpb24gRUVQUk9NCisgICAgICogMHg4MTAwIC0gMHg4MkZGID0gdXNlciBFRVBST00KIAotICAgIFRoaXMgZHJpdmVyIG1ha2UgMyBiaW5hcnkgZmlsZXMgYXZhaWxhYmxlIGluIHN5c2ZzOgotICAgICAgcmVnX2NvbmZpZyAgICAtIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIHJlZ2lzdGVycwotICAgICAgZWVwcm9tX2NvbmZpZyAtIGFjZXNzZXMgY29uZmlndXJhdGlvbiBlZXByb20gc3BhY2UKLSAgICAgIGVlcHJvbV91c2VyICAgLSBmcmVlIGZvciBhcHBsaWNhdGlvbiB1c2UKKyAgICBUaGlzIGRyaXZlciBtYWtlcyB0aGUgdXNlciBFRVBST00gYXZhaWxhYmxlIGZvciByZWFkLgogCi0gICAgSW4gb3VyIGFwcGxpY2F0aW9uLCB3ZSBwdXQgZGV2aWNlIHNlcmlhbCAmIG1vZGVsIG51bWJlcnMgaW4gdXNlciBlZXByb20uCisgICAgVGhlIHJlZ2lzdGVycyAmIGNvbmZpZyBFRVBST00gc2hvdWxkIGJlIGFjY2Vzc2VkIHZpYSBpMmMtZGV2LgogCi0gICAgTm90ZXM6Ci0gICAgICAxKSBUaGUgZGF0YXNoZWV0IHNheXMgdGhhdCByZWdpc3RlciAweDQ0IC8gRUVQUk9NIDB4ODA0NCBzaG91bGQgTk9UCi0gICAgICAgICBiZSBvdmVyd3JpdHRlbiwgc28gdGhlIGRyaXZlciBleHBsaWNpdGx5IHByZXZlbnRzIHRoYXQuCi0gICAgICAyKSBJdCdzIGEgZ29vZCBpZGVhIHRvIGtlZXAgdGhlIGNvbmZpZyAoMHg0NSkgbG9ja2VkIGluIGNvbmZpZyBFRVBST00uCi0gICAgICAgICBZb3UgY2FuIHRlbXBvcmFyaWx5IGVuYWJsZSBjb25maWcgd3JpdGVzIGJ5IGNoYW5naW5nIHJlZ2lzdGVyIDB4NDUuCisgICAgVGhlIE1BWDY4NzUgaWdub3JlcyB0aGUgbG93ZXN0IGFkZHJlc3MgYml0LCBzbyBlYWNoIGNoaXAgcmVzcG9uZHMgdG8KKyAgICB0d28gYWRkcmVzc2VzIC0gMHg1MC8weDUxIGFuZCAweDUyLzB4NTMuCisKKyAgICBOb3RlIHRoYXQgdGhlIE1BWDY4NzUgdXNlcyBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKCkgdG8gc2V0IHRoZSByZWFkCisgICAgYWRkcmVzcywgc28gdGhpcyBkcml2ZXIgaXMgZGVzdHJ1Y3RpdmUgaWYgbG9hZGVkIGZvciB0aGUgd3JvbmcgRUVQUk9NIGNoaXAuCiAKICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgogKi8KIAotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKLS8qIEFkZHJlc3NlcyB0byBzY2FuICovCi0vKiBObyBhZGRyZXNzIHNjYW5uZWQgYnkgZGVmYXVsdCwgYXMgdGhpcyBjb3VsZCBjb3JydXB0IHN0YW5kYXJkIEVFUFJPTVMuICovCisvKiBEbyBub3Qgc2NhbiAtIHRoZSBNQVg2ODc1IGFjY2VzcyBtZXRob2Qgd2lsbCB3cml0ZSB0byBzb21lIEVFUFJPTSBjaGlwcyAqLwogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHtJMkNfQ0xJRU5UX0VORH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHtJMkNfQ0xJRU5UX0lTQV9FTkR9OwogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotU0VOU09SU19JTlNNT0RfMShtYXg2ODc1KTsKLQotLyogdGhpcyBwYXJhbSB3aWxsIHByZXZlbnQgJ2FjY2lkZW50YWwnIHdyaXRlcyB0byB0aGUgZWVwcm9tICovCi1zdGF0aWMgaW50IGFsbG93X3dyaXRlID0gMDsKLW1vZHVsZV9wYXJhbShhbGxvd193cml0ZSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoYWxsb3dfd3JpdGUsCi0JCSAiRW5hYmxlIHdyaXRlIGFjY2VzczpcbiIKLQkJICIqMDogUmVhZCBvbmx5XG4iCi0JCSAiIDE6IFJlYWQvV3JpdGUgYWNjZXNzIik7CitJMkNfQ0xJRU5UX0lOU01PRF8xKG1heDY4NzUpOwogCiAvKiBUaGUgTUFYNjg3NSBjYW4gb25seSByZWFkL3dyaXRlIDE2IGJ5dGVzIGF0IGEgdGltZSAqLwogI2RlZmluZSBTTElDRV9TSVpFCQkJMTYKICNkZWZpbmUgU0xJQ0VfQklUUwkJCTQKIAotLyogQ09ORklHIEVFUFJPTSBpcyBhdCBhZGRyZXNzZXMgMHg4MDAwIC0gMHg4MDQ1LCByZWdpc3RlcnMgYXJlIGF0IDAgLSAweDQ1ICovCi0jZGVmaW5lIENPTkZJR19FRVBST01fQkFTRQkJMHg4MDAwCi0jZGVmaW5lIENPTkZJR19FRVBST01fU0laRQkJMHgwMDQ2Ci0jZGVmaW5lIENPTkZJR19FRVBST01fU0xJQ0VTCQk1Ci0KIC8qIFVTRVIgRUVQUk9NIGlzIGF0IGFkZHJlc3NlcyAweDgxMDAgLSAweDgyRkYgKi8KICNkZWZpbmUgVVNFUl9FRVBST01fQkFTRQkJMHg4MTAwCiAjZGVmaW5lIFVTRVJfRUVQUk9NX1NJWkUJCTB4MDIwMAogI2RlZmluZSBVU0VSX0VFUFJPTV9TTElDRVMJCTMyCiAKIC8qIE1BWDY4NzUgY29tbWFuZHMgKi8KLSNkZWZpbmUgTUFYNjg3NV9DTURfQkxPQ0tfV1JJVEUJCTB4ODMKLSNkZWZpbmUgTUFYNjg3NV9DTURfQkxPQ0tfUkVBRAkJMHg4NAotI2RlZmluZSBNQVg2ODc1X0NNRF9SRUJPT1QJCTB4ODgKLQotZW51bSBtYXg2ODc1X2FyZWFfdHlwZSB7Ci0JbWF4Njg3NV9yZWdpc3Rlcl9jb25maWc9MCwKLQltYXg2ODc1X2VlcHJvbV9jb25maWcsCi0JbWF4Njg3NV9lZXByb21fdXNlciwKLQltYXg2ODU3X21heAotfTsKLQotc3RydWN0IGVlcHJvbV9ibG9jayB7Ci0JZW51bSBtYXg2ODc1X2FyZWFfdHlwZQl0eXBlOwotCXU4CQkJc2xpY2VzOwotCXUzMgkJCXNpemU7Ci0JdTMyCQkJdmFsaWQ7Ci0JdTMyCQkJYmFzZTsKLQl1bnNpZ25lZCBsb25nCQkqdXBkYXRlZDsKLQl1OAkJCSpkYXRhOwotfTsKKyNkZWZpbmUgTUFYNjg3NV9DTURfQkxLX1JFQUQJCTB4ODQKIAogLyogRWFjaCBjbGllbnQgaGFzIHRoaXMgYWRkaXRpb25hbCBkYXRhICovCiBzdHJ1Y3QgbWF4Njg3NV9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudAljbGllbnQ7CiAJc3RydWN0IHNlbWFwaG9yZQl1cGRhdGVfbG9jazsKLQlzdHJ1Y3QgZWVwcm9tX2Jsb2NrCWJsb2Nrc1ttYXg2ODU3X21heF07Ci0JLyogdGhlIGFib3ZlIHN0cnVjdHMgcG9pbnQgaW50byB0aGUgYXJyYXlzIGJlbG93ICovCi0JdTggZGF0YVtVU0VSX0VFUFJPTV9TSVpFICsgKENPTkZJR19FRVBST01fU0laRSoyKV07Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWRbVVNFUl9FRVBST01fU0xJQ0VTICsgKENPTkZJR19FRVBST01fU0xJQ0VTKjIpXTsKKworCXUzMgkJCXZhbGlkOworCXU4CQkJZGF0YVtVU0VSX0VFUFJPTV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nCQlsYXN0X3VwZGF0ZWRbVVNFUl9FRVBST01fU0xJQ0VTXTsKIH07CiAKIHN0YXRpYyBpbnQgbWF4Njg3NV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwpAQCAtMTExLDMzNyArNzQsMTYwIEBACiAJLmRldGFjaF9jbGllbnQJPSBtYXg2ODc1X2RldGFjaF9jbGllbnQsCiB9OwogCi1zdGF0aWMgaW50IG1heDY4NzVfdXBkYXRlX3NsaWNlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkJc3RydWN0IGVlcHJvbV9ibG9jayAqYmxrLAotCQkJCWludCBzbGljZSkKK3N0YXRpYyB2b2lkIG1heDY4NzVfdXBkYXRlX3NsaWNlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBzbGljZSkKIHsKIAlzdHJ1Y3QgbWF4Njg3NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaW50IGksIGosIGFkZHIsIGNvdW50OwotCXU4IHJkYnVmW1NMSUNFX1NJWkVdOwotCWludCByZXR2YWwgPSAwOworCWludCBpLCBqLCBhZGRyOworCXU4ICpidWY7CiAKLQlpZiAoc2xpY2UgPj0gYmxrLT5zbGljZXMpCi0JCXJldHVybiAtMTsKKwlpZiAoc2xpY2UgPj0gVVNFUl9FRVBST01fU0xJQ0VTKQorCQlyZXR1cm47CiAKIAlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLQlpZiAoIShibGstPnZhbGlkICYgKDEgPDwgc2xpY2UpKSB8fAotCSAgICAoamlmZmllcyAtIGJsay0+dXBkYXRlZFtzbGljZV0gPiAzMDAgKiBIWikgfHwKLQkgICAgKGppZmZpZXMgPCBibGstPnVwZGF0ZWRbc2xpY2VdKSkgewotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGVlcHJvbSB1cGRhdGUsIHNsaWNlICV1LCBiYXNlICV1XG4iLAotCQkJc2xpY2UsIGJsay0+YmFzZSk7CisJYnVmID0gJmRhdGEtPmRhdGFbc2xpY2UgPDwgU0xJQ0VfQklUU107CiAKLQkJYWRkciA9IGJsay0+YmFzZSArIChzbGljZSA8PCBTTElDRV9CSVRTKTsKLQkJY291bnQgPSBibGstPnNpemUgLSAoc2xpY2UgPDwgU0xJQ0VfQklUUyk7Ci0JCWlmIChjb3VudCA+IFNMSUNFX1NJWkUpIHsKLQkJCWNvdW50ID0gU0xJQ0VfU0laRTsKKwlpZiAoIShkYXRhLT52YWxpZCAmICgxIDw8IHNsaWNlKSkgfHwKKwkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWRbc2xpY2VdKSkgeworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgdXBkYXRlIG9mIHNsaWNlICV1XG4iLCBzbGljZSk7CisKKwkJZGF0YS0+dmFsaWQgJj0gfigxIDw8IHNsaWNlKTsKKworCQlhZGRyID0gVVNFUl9FRVBST01fQkFTRSArIChzbGljZSA8PCBTTElDRV9CSVRTKTsKKworCQkvKiBzZWxlY3QgdGhlIGVlcHJvbSBhZGRyZXNzICovCisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgYWRkciA+PiA4LCBhZGRyICYgMHhGRikpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiYWRkcmVzcyBzZXQgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXhpdF91cDsKIAkJfQogCi0JCS8qIFByZXNldCB0aGUgcmVhZCBhZGRyZXNzICovCi0JCWlmIChhZGRyIDwgMHgxMDApIHsKLQkJCS8qIHNlbGVjdCB0aGUgcmVnaXN0ZXIgKi8KLQkJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZShjbGllbnQsIGFkZHIgJiAweEZGKSkgewotCQkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAibWF4Njg3NSByZWdpc3RlciBzZWxlY3QgaGFzIGZhaWxlZCFcbiIpOwotCQkJCXJldHZhbCA9IC0xOwotCQkJCWdvdG8gZXhpdDsKKwkJaWYgKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCQkJICAgIEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLKSkgeworCQkJaWYgKGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwKKwkJCQkJCQkgIE1BWDY4NzVfQ01EX0JMS19SRUFELAorCQkJCQkJCSAgYnVmKSAhPSBTTElDRV9TSVpFKSB7CisJCQkJZ290byBleGl0X3VwOwogCQkJfQogCQl9IGVsc2UgewotCQkJLyogc2VsZWN0IHRoZSBlZXByb20gKi8KLQkJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgYWRkciA+PiA4LCBhZGRyICYgMHhGRikpIHsKLQkJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIm1heDY4NzUgYWRkcmVzcyBzZXQgaGFzIGZhaWxlZCFcbiIpOwotCQkJCXJldHZhbCA9IC0xOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQkJfQotCi0JCWlmIChpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLKSkgewotCQkJaWYgKGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwgTUFYNjg3NV9DTURfQkxPQ0tfUkVBRCwKLQkJCQkJCQkgIHJkYnVmKSAhPSBTTElDRV9TSVpFKQotCQkJewotCQkJCXJldHZhbCA9IC0xOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQotCQkJbWVtY3B5KCZibGstPmRhdGFbc2xpY2UgPDwgU0xJQ0VfQklUU10sIHJkYnVmLCBjb3VudCk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJZm9yIChpID0gMDsgaSA8IFNMSUNFX1NJWkU7IGkrKykgewogCQkJCWogPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7Ci0JCQkJaWYgKGogPCAwKQotCQkJCXsKLQkJCQkJcmV0dmFsID0gLTE7Ci0JCQkJCWdvdG8gZXhpdDsKKwkJCQlpZiAoaiA8IDApIHsKKwkJCQkJZ290byBleGl0X3VwOwogCQkJCX0KLQkJCQlibGstPmRhdGFbKHNsaWNlIDw8IFNMSUNFX0JJVFMpICsgaV0gPSAodTgpIGo7CisJCQkJYnVmW2ldID0gajsKIAkJCX0KIAkJfQotCQlibGstPnVwZGF0ZWRbc2xpY2VdID0gamlmZmllczsKLQkJYmxrLT52YWxpZCB8PSAoMSA8PCBzbGljZSk7CisJCWRhdGEtPmxhc3RfdXBkYXRlZFtzbGljZV0gPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCB8PSAoMSA8PCBzbGljZSk7CiAJfQotCWV4aXQ6CitleGl0X3VwOgogCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHNzaXplX3QgbWF4Njg3NV9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCwKLQkJCSAgICBlbnVtIG1heDY4NzVfYXJlYV90eXBlIGFyZWFfdHlwZSkKK3N0YXRpYyBzc2l6ZV90IG1heDY4NzVfcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLAorCQkJICAgIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBrb2JqX3RvX2kyY19jbGllbnQoa29iaik7CiAJc3RydWN0IG1heDY4NzVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXN0cnVjdCBlZXByb21fYmxvY2sgKmJsazsKLQlpbnQgc2xpY2U7CisJaW50IHNsaWNlLCBtYXhfc2xpY2U7CiAKLQlibGsgPSAmZGF0YS0+YmxvY2tzW2FyZWFfdHlwZV07Ci0KLQlpZiAob2ZmID4gYmxrLT5zaXplKQorCWlmIChvZmYgPiBVU0VSX0VFUFJPTV9TSVpFKQogCQlyZXR1cm4gMDsKLQlpZiAob2ZmICsgY291bnQgPiBibGstPnNpemUpCi0JCWNvdW50ID0gYmxrLT5zaXplIC0gb2ZmOwogCi0JLyogT25seSByZWZyZXNoIHNsaWNlcyB3aGljaCBjb250YWluIHJlcXVlc3RlZCBieXRlcyAqLwotCWZvciAoc2xpY2UgPSAob2ZmID4+IFNMSUNFX0JJVFMpOyBzbGljZSA8PSAoKG9mZiArIGNvdW50IC0gMSkgPj4gU0xJQ0VfQklUUyk7IHNsaWNlKyspCi0JCW1heDY4NzVfdXBkYXRlX3NsaWNlKGNsaWVudCwgYmxrLCBzbGljZSk7CisJaWYgKG9mZiArIGNvdW50ID4gVVNFUl9FRVBST01fU0laRSkKKwkJY291bnQgPSBVU0VSX0VFUFJPTV9TSVpFIC0gb2ZmOwogCi0JbWVtY3B5KGJ1ZiwgJmJsay0+ZGF0YVtvZmZdLCBjb3VudCk7CisJLyogcmVmcmVzaCBzbGljZXMgd2hpY2ggY29udGFpbiByZXF1ZXN0ZWQgYnl0ZXMgKi8KKwltYXhfc2xpY2UgPSAob2ZmICsgY291bnQgLSAxKSA+PiBTTElDRV9CSVRTOworCWZvciAoc2xpY2UgPSAob2ZmID4+IFNMSUNFX0JJVFMpOyBzbGljZSA8PSBtYXhfc2xpY2U7IHNsaWNlKyspCisJCW1heDY4NzVfdXBkYXRlX3NsaWNlKGNsaWVudCwgc2xpY2UpOworCisJbWVtY3B5KGJ1ZiwgJmRhdGEtPmRhdGFbb2ZmXSwgY291bnQpOwogCiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBtYXg2ODc1X3VzZXJfcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0JcmV0dXJuIG1heDY4NzVfcmVhZChrb2JqLCBidWYsIG9mZiwgY291bnQsIG1heDY4NzVfZWVwcm9tX3VzZXIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBtYXg2ODc1X2NvbmZpZ19yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gbWF4Njg3NV9yZWFkKGtvYmosIGJ1Ziwgb2ZmLCBjb3VudCwgbWF4Njg3NV9lZXByb21fY29uZmlnKTsKLX0KLQotc3RhdGljIHNzaXplX3QgbWF4Njg3NV9jZmdyZWdfcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0JcmV0dXJuIG1heDY4NzVfcmVhZChrb2JqLCBidWYsIG9mZiwgY291bnQsIG1heDY4NzVfcmVnaXN0ZXJfY29uZmlnKTsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBtYXg2ODc1X3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCwKLQkJCSAgICAgZW51bSBtYXg2ODc1X2FyZWFfdHlwZSBhcmVhX3R5cGUpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKLQlzdHJ1Y3QgbWF4Njg3NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0Jc3RydWN0IGVlcHJvbV9ibG9jayAqYmxrOwotCWludCBzbGljZSwgYWRkciwgcmV0dmFsOwotCXNzaXplX3Qgc2VudCA9IDA7Ci0KLQlibGsgPSAmZGF0YS0+YmxvY2tzW2FyZWFfdHlwZV07Ci0KLQlpZiAob2ZmID4gYmxrLT5zaXplKQotCQlyZXR1cm4gMDsKLQlpZiAoKG9mZiArIGNvdW50KSA+IGJsay0+c2l6ZSkKLQkJY291bnQgPSBibGstPnNpemUgLSBvZmY7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkYXRhLT51cGRhdGVfbG9jaykpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JLyogd3JpdGluZyB0byBhIHJlZ2lzdGVyIGlzIGRvbmUgd2l0aCBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKCkgKi8KLQlpZiAoYmxrLT50eXBlID09IG1heDY4NzVfcmVnaXN0ZXJfY29uZmlnKSB7Ci0JCWZvciAoc2VudCA9IDA7IHNlbnQgPCBjb3VudDsgc2VudCsrKSB7Ci0JCQlhZGRyID0gb2ZmICsgc2VudDsKLQkJCWlmIChhZGRyID09IDB4NDQpCi0JCQkJY29udGludWU7Ci0KLQkJCXJldHZhbCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBhZGRyLCBidWZbc2VudF0pOwotCQl9Ci0JfSBlbHNlIHsKLQkJaW50IGNtZCwgdmFsOwotCi0JCS8qIFdlIGFyZSB3cml0aW5nIHRvIEVFUFJPTSAqLwotCQlmb3IgKHNlbnQgPSAwOyBzZW50IDwgY291bnQ7IHNlbnQrKykgewotCQkJYWRkciA9IGJsay0+YmFzZSArIG9mZiArIHNlbnQ7Ci0JCQljbWQgPSBhZGRyID4+IDg7Ci0JCQl2YWwgPSAoYWRkciAmIDB4ZmYpIHwgKGJ1ZltzZW50XSA8PCA4KTsJLy8gcmV2ZXJzZWQKLQotCQkJaWYgKGFkZHIgPT0gMHg4MDQ0KQotCQkJCWNvbnRpbnVlOwotCi0JCQlyZXR2YWwgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgY21kLCB2YWwpOwotCi0JCQlpZiAocmV0dmFsKSB7Ci0JCQkJZ290byBlcnJvcl9leGl0OwotCQkJfQotCi0JCQkvKiBBIHdyaXRlIHRha2VzIHVwIHRvIDExIG1zICovCi0JCQltc2xlZXAoMTEpOwotCQl9Ci0JfQotCi0JLyogSW52YWxpZGF0ZSB0aGUgc2NyYXRjaCBidWZmZXIgKi8KLQlmb3IgKHNsaWNlID0gKG9mZiA+PiBTTElDRV9CSVRTKTsgc2xpY2UgPD0gKChvZmYgKyBjb3VudCAtIDEpID4+IFNMSUNFX0JJVFMpOyBzbGljZSsrKQotCQlibGstPnZhbGlkICY9IH4oMSA8PCBzbGljZSk7Ci0KLQllcnJvcl9leGl0OgotCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gc2VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgbWF4Njg3NV91c2VyX3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gbWF4Njg3NV93cml0ZShrb2JqLCBidWYsIG9mZiwgY291bnQsIG1heDY4NzVfZWVwcm9tX3VzZXIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBtYXg2ODc1X2NvbmZpZ193cml0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0JcmV0dXJuIG1heDY4NzVfd3JpdGUoa29iaiwgYnVmLCBvZmYsIGNvdW50LCBtYXg2ODc1X2VlcHJvbV9jb25maWcpOwotfQotCi1zdGF0aWMgc3NpemVfdCBtYXg2ODc1X2NmZ3JlZ193cml0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0JcmV0dXJuIG1heDY4NzVfd3JpdGUoa29iaiwgYnVmLCBvZmYsIGNvdW50LCBtYXg2ODc1X3JlZ2lzdGVyX2NvbmZpZyk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSB1c2VyX2VlcHJvbV9hdHRyID0gewogCS5hdHRyID0gewotCQkubmFtZSA9ICJlZXByb21fdXNlciIsCi0JCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQLAorCQkubmFtZSA9ICJlZXByb20iLAorCQkubW9kZSA9IFNfSVJVR08sCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCi0JLnNpemUgID0gVVNFUl9FRVBST01fU0laRSwKLQkucmVhZCAgPSBtYXg2ODc1X3VzZXJfcmVhZCwKLQkud3JpdGUgPSBtYXg2ODc1X3VzZXJfd3JpdGUsCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgY29uZmlnX2VlcHJvbV9hdHRyID0gewotCS5hdHRyID0gewotCQkubmFtZSA9ICJlZXByb21fY29uZmlnIiwKLQkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLQkuc2l6ZSAgPSBDT05GSUdfRUVQUk9NX1NJWkUsCi0JLnJlYWQgID0gbWF4Njg3NV9jb25maWdfcmVhZCwKLQkud3JpdGUgPSBtYXg2ODc1X2NvbmZpZ193cml0ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBjb25maWdfcmVnaXN0ZXJfYXR0ciA9IHsKLQkuYXR0ciA9IHsKLQkJLm5hbWUgPSAicmVnX2NvbmZpZyIsCi0JCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi0JLnNpemUgID0gQ09ORklHX0VFUFJPTV9TSVpFLAotCS5yZWFkICA9IG1heDY4NzVfY2ZncmVnX3JlYWQsCi0JLndyaXRlID0gbWF4Njg3NV9jZmdyZWdfd3JpdGUsCisJLnNpemUgPSBVU0VSX0VFUFJPTV9TSVpFLAorCS5yZWFkID0gbWF4Njg3NV9yZWFkLAogfTsKIAogc3RhdGljIGludCBtYXg2ODc1X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCBtYXg2ODc1X2RldGVjdCk7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBtYXg2ODc1X2RldGVjdCk7CiB9CiAKLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19kZXRlY3QgKi8KKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19wcm9iZSAqLwogc3RhdGljIGludCBtYXg2ODc1X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqcmVhbF9jbGllbnQ7CisJc3RydWN0IGkyY19jbGllbnQgKmZha2VfY2xpZW50OwogCXN0cnVjdCBtYXg2ODc1X2RhdGEgKmRhdGE7CiAJaW50IGVyciA9IDA7CiAKLQkvKiBQcmV2ZW50IDI0UkYwOCBjb3JydXB0aW9uIChpbiBjYXNlIG9mIHVzZXIgZXJyb3IpICovCi0JaWYgKGtpbmQgPCAwKQotCQlpMmNfc21idXNfeGZlcihhZGFwdGVyLCBhZGRyZXNzLCAwLCAwLCAwLAotCQkJICAgICAgIEkyQ19TTUJVU19RVUlDSywgTlVMTCk7CisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEKKwkJCQkgICAgIHwgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFKSkKKwkJcmV0dXJuIDA7CiAKLQkvKiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB3ZSBjYW4gcmVhZCB0aGUgRUVQUk9NIGRhdGE6Ci0JICAgKDEpIEkyQyBibG9jayByZWFkcyAoZmFzdGVyLCBidXQgdW5zdXBwb3J0ZWQgYnkgbW9zdCBhZGFwdGVycykKLQkgICAoMikgQ29uc2VjdXRpdmUgYnl0ZSByZWFkcyAoMTAwJSBvdmVyaGVhZCkKLQkgICAoMykgUmVndWxhciBieXRlIGRhdGEgcmVhZHMgKDIwMCUgb3ZlcmhlYWQpCi0JICAgVGhlIHRoaXJkIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgYnkgdGhpcyBkcml2ZXIgYmVjYXVzZSBhbGwKLQkgICBrbm93biBhZGFwdGVycyBzdXBwb3J0IGF0IGxlYXN0IHRoZSBzZWNvbmQuICovCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQSB8Ci0JCQkJICAgICBJMkNfRlVOQ19TTUJVU19CWVRFIHwKLQkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQSkpCi0JCWdvdG8gZXhpdDsKKwkvKiBPbmx5IGNoZWNrIGV2ZW4gYWRkcmVzc2VzICovCisJaWYgKGFkZHJlc3MgJiAxKQorCQlyZXR1cm4gMDsKIAotCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCi0JICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCi0JICAgQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgZWVwcm9tX3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KLQlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1heDY4NzVfZGF0YSksIEdGUF9LRVJORUwpKSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXQ7Ci0JfQorCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWF4Njg3NV9kYXRhKSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBtYXg2ODc1X2RhdGEpKTsKIAotCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OwotCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKLQluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKLQluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKLQluZXdfY2xpZW50LT5kcml2ZXIgPSAmbWF4Njg3NV9kcml2ZXI7Ci0JbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCS8qIEEgZmFrZSBjbGllbnQgaXMgY3JlYXRlZCBvbiB0aGUgb2RkIGFkZHJlc3MgKi8KKwlpZiAoIShmYWtlX2NsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9rZnJlZTE7CisJfQorCW1lbXNldChmYWtlX2NsaWVudCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CiAKLQkvKiBTZXR1cCB0aGUgdXNlciBzZWN0aW9uICovCi0JZGF0YS0+YmxvY2tzW21heDY4NzVfZWVwcm9tX3VzZXJdLnR5cGUgICAgPSBtYXg2ODc1X2VlcHJvbV91c2VyOwotCWRhdGEtPmJsb2Nrc1ttYXg2ODc1X2VlcHJvbV91c2VyXS5zbGljZXMgID0gVVNFUl9FRVBST01fU0xJQ0VTOwotCWRhdGEtPmJsb2Nrc1ttYXg2ODc1X2VlcHJvbV91c2VyXS5zaXplICAgID0gVVNFUl9FRVBST01fU0laRTsKLQlkYXRhLT5ibG9ja3NbbWF4Njg3NV9lZXByb21fdXNlcl0uYmFzZSAgICA9IFVTRVJfRUVQUk9NX0JBU0U7Ci0JZGF0YS0+YmxvY2tzW21heDY4NzVfZWVwcm9tX3VzZXJdLmRhdGEgICAgPSBkYXRhLT5kYXRhOwotCWRhdGEtPmJsb2Nrc1ttYXg2ODc1X2VlcHJvbV91c2VyXS51cGRhdGVkID0gZGF0YS0+bGFzdF91cGRhdGVkOwotCi0JLyogU2V0dXAgdGhlIGNvbmZpZyBzZWN0aW9uICovCi0JZGF0YS0+YmxvY2tzW21heDY4NzVfZWVwcm9tX2NvbmZpZ10udHlwZSAgICA9IG1heDY4NzVfZWVwcm9tX2NvbmZpZzsKLQlkYXRhLT5ibG9ja3NbbWF4Njg3NV9lZXByb21fY29uZmlnXS5zbGljZXMgID0gQ09ORklHX0VFUFJPTV9TTElDRVM7Ci0JZGF0YS0+YmxvY2tzW21heDY4NzVfZWVwcm9tX2NvbmZpZ10uc2l6ZSAgICA9IENPTkZJR19FRVBST01fU0laRTsKLQlkYXRhLT5ibG9ja3NbbWF4Njg3NV9lZXByb21fY29uZmlnXS5iYXNlICAgID0gQ09ORklHX0VFUFJPTV9CQVNFOwotCWRhdGEtPmJsb2Nrc1ttYXg2ODc1X2VlcHJvbV9jb25maWddLmRhdGEgICAgPSAmZGF0YS0+ZGF0YVtVU0VSX0VFUFJPTV9TSVpFXTsKLQlkYXRhLT5ibG9ja3NbbWF4Njg3NV9lZXByb21fY29uZmlnXS51cGRhdGVkID0gJmRhdGEtPmxhc3RfdXBkYXRlZFtVU0VSX0VFUFJPTV9TTElDRVNdOwotCi0JLyogU2V0dXAgdGhlIHJlZ2lzdGVyIHNlY3Rpb24gKi8KLQlkYXRhLT5ibG9ja3NbbWF4Njg3NV9yZWdpc3Rlcl9jb25maWddLnR5cGUgICAgPSBtYXg2ODc1X3JlZ2lzdGVyX2NvbmZpZzsKLQlkYXRhLT5ibG9ja3NbbWF4Njg3NV9yZWdpc3Rlcl9jb25maWddLnNsaWNlcyAgPSBDT05GSUdfRUVQUk9NX1NMSUNFUzsKLQlkYXRhLT5ibG9ja3NbbWF4Njg3NV9yZWdpc3Rlcl9jb25maWddLnNpemUgICAgPSBDT05GSUdfRUVQUk9NX1NJWkU7Ci0JZGF0YS0+YmxvY2tzW21heDY4NzVfcmVnaXN0ZXJfY29uZmlnXS5iYXNlICAgID0gMDsKLQlkYXRhLT5ibG9ja3NbbWF4Njg3NV9yZWdpc3Rlcl9jb25maWddLmRhdGEgICAgPSAmZGF0YS0+ZGF0YVtVU0VSX0VFUFJPTV9TSVpFK0NPTkZJR19FRVBST01fU0laRV07Ci0JZGF0YS0+YmxvY2tzW21heDY4NzVfcmVnaXN0ZXJfY29uZmlnXS51cGRhdGVkID0gJmRhdGEtPmxhc3RfdXBkYXRlZFtVU0VSX0VFUFJPTV9TTElDRVMrQ09ORklHX0VFUFJPTV9TTElDRVNdOwotCi0JLyogSW5pdCB0aGUgZGF0YSAqLwotCW1lbXNldChkYXRhLT5kYXRhLCAweGZmLCBzaXplb2YoZGF0YS0+ZGF0YSkpOwotCi0JLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KLQlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJtYXg2ODc1IiwgSTJDX05BTUVfU0laRSk7CisJLyogSW5pdCByZWFsIGkyY19jbGllbnQgKi8KKwlyZWFsX2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKHJlYWxfY2xpZW50LCBkYXRhKTsKKwlyZWFsX2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJcmVhbF9jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCXJlYWxfY2xpZW50LT5kcml2ZXIgPSAmbWF4Njg3NV9kcml2ZXI7CisJcmVhbF9jbGllbnQtPmZsYWdzID0gMDsKKwlzdHJsY3B5KHJlYWxfY2xpZW50LT5uYW1lLCAibWF4Njg3NSIsIEkyQ19OQU1FX1NJWkUpOwogCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCS8qIFZlcmlmeSB0aGF0IHRoZSBjaGlwIGlzIHJlYWxseSB3aGF0IHdlIHRoaW5rIGl0IGlzICovCi0JaWYgKChtYXg2ODc1X3VwZGF0ZV9zbGljZShuZXdfY2xpZW50LCAmZGF0YS0+YmxvY2tzW21heDY4NzVfZWVwcm9tX2NvbmZpZ10sIDQpIDwgMCkgfHwKLQkgICAgKG1heDY4NzVfdXBkYXRlX3NsaWNlKG5ld19jbGllbnQsICZkYXRhLT5ibG9ja3NbbWF4Njg3NV9yZWdpc3Rlcl9jb25maWddLCA0KSA8IDApKQotCQlnb3RvIGV4aXRfa2ZyZWU7CisJLyogSW5pdCBmYWtlIGNsaWVudCBkYXRhICovCisJLyogc2V0IHRoZSBjbGllbnQgZGF0YSB0byB0aGUgaTJjX2NsaWVudCBzbyB0aGF0IGl0IHdpbGwgZ2V0IGZyZWVkICovCisJaTJjX3NldF9jbGllbnRkYXRhKGZha2VfY2xpZW50LCBmYWtlX2NsaWVudCk7CisJZmFrZV9jbGllbnQtPmFkZHIgPSBhZGRyZXNzIHwgMTsKKwlmYWtlX2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJZmFrZV9jbGllbnQtPmRyaXZlciA9ICZtYXg2ODc1X2RyaXZlcjsKKwlmYWtlX2NsaWVudC0+ZmxhZ3MgPSAwOworCXN0cmxjcHkoZmFrZV9jbGllbnQtPm5hbWUsICJtYXg2ODc1IHN1YmNsaWVudCIsIEkyQ19OQU1FX1NJWkUpOwogCi0JLyogMHg0MSwweDQyIG11c3QgYmUgemVybyBhbmQgMHg0MCBtdXN0IG1hdGNoIGluIGVlcHJvbSBhbmQgcmVnaXN0ZXJzICovCi0JaWYgKChkYXRhLT5ibG9ja3NbbWF4Njg3NV9lZXByb21fY29uZmlnXS5kYXRhWzB4NDFdICE9IDApIHx8Ci0JICAgIChkYXRhLT5ibG9ja3NbbWF4Njg3NV9lZXByb21fY29uZmlnXS5kYXRhWzB4NDJdICE9IDApIHx8Ci0JICAgIChkYXRhLT5ibG9ja3NbbWF4Njg3NV9yZWdpc3Rlcl9jb25maWddLmRhdGFbMHg0MV0gIT0gMCkgfHwKLQkgICAgKGRhdGEtPmJsb2Nrc1ttYXg2ODc1X3JlZ2lzdGVyX2NvbmZpZ10uZGF0YVsweDQyXSAhPSAwKSB8fAotCSAgICAoZGF0YS0+YmxvY2tzW21heDY4NzVfZWVwcm9tX2NvbmZpZ10uZGF0YVsweDQwXSAhPQotCSAgICAgZGF0YS0+YmxvY2tzW21heDY4NzVfcmVnaXN0ZXJfY29uZmlnXS5kYXRhWzB4NDBdKSkKLQkJZ290byBleGl0X2tmcmVlOworCS8qIFByZXZlbnQgMjRSRjA4IGNvcnJ1cHRpb24gKGluIGNhc2Ugb2YgdXNlciBlcnJvcikgKi8KKwlpMmNfc21idXNfd3JpdGVfcXVpY2socmVhbF9jbGllbnQsIDApOwogCi0JLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLwotCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQotCQlnb3RvIGV4aXRfa2ZyZWU7CisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChyZWFsX2NsaWVudCkpICE9IDApCisJCWdvdG8gZXhpdF9rZnJlZTI7CiAKLQkvKiBjcmVhdGUgdGhlIHN5c2ZzIGVlcHJvbSBmaWxlcyB3aXRoIHRoZSBjb3JyZWN0IHBlcm1pc3Npb25zICovCi0JaWYgKGFsbG93X3dyaXRlID09IDApIHsKLQkJdXNlcl9lZXByb21fYXR0ci5hdHRyLm1vZGUgJj0gflNfSVdVR087Ci0JCXVzZXJfZWVwcm9tX2F0dHIud3JpdGUgPSBOVUxMOwotCQljb25maWdfZWVwcm9tX2F0dHIuYXR0ci5tb2RlICY9IH5TX0lXVUdPOwotCQljb25maWdfZWVwcm9tX2F0dHIud3JpdGUgPSBOVUxMOwotCQljb25maWdfcmVnaXN0ZXJfYXR0ci5hdHRyLm1vZGUgJj0gflNfSVdVR087Ci0JCWNvbmZpZ19yZWdpc3Rlcl9hdHRyLndyaXRlID0gTlVMTDsKLQl9Ci0Jc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJnVzZXJfZWVwcm9tX2F0dHIpOwotCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZjb25maWdfZWVwcm9tX2F0dHIpOwotCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZjb25maWdfcmVnaXN0ZXJfYXR0cik7CisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChmYWtlX2NsaWVudCkpICE9IDApCisJCWdvdG8gZXhpdF9kZXRhY2g7CisKKwlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnJlYWxfY2xpZW50LT5kZXYua29iaiwgJnVzZXJfZWVwcm9tX2F0dHIpOwogCiAJcmV0dXJuIDA7CiAKLWV4aXRfa2ZyZWU6CitleGl0X2RldGFjaDoKKwlpMmNfZGV0YWNoX2NsaWVudChyZWFsX2NsaWVudCk7CitleGl0X2tmcmVlMjoKKwlrZnJlZShmYWtlX2NsaWVudCk7CitleGl0X2tmcmVlMToKIAlrZnJlZShkYXRhKTsKLWV4aXQ6CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNDUwLDEzICsyMzYsOSBAQAogCWludCBlcnI7CiAKIAllcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQl9Ci0KIAlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvcGNhOTUzOS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvcGNhOTUzOS5jCmluZGV4IDlmM2FkNDUuLjIyNTU3N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL3BjYTk1MzkuYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9wY2E5NTM5LmMKQEAgLTEzLDE0ICsxMywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KIAogLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7MHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgSTJDX0NMSUVOVF9FTkR9Owotc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7STJDX0NMSUVOVF9JU0FfRU5EfTsKIAogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLVNFTlNPUlNfSU5TTU9EXzEocGNhOTUzOSk7CitJMkNfQ0xJRU5UX0lOU01PRF8xKHBjYTk1MzkpOwogCiBlbnVtIHBjYTk1MzlfY21kCiB7CkBAIC0xMDksMTAgKzEwNywxMCBAQAogCiBzdGF0aWMgaW50IHBjYTk1MzlfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHBjYTk1MzlfZGV0ZWN0KTsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIHBjYTk1MzlfZGV0ZWN0KTsKIH0KIAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX2RldGVjdCAqLworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX3Byb2JlICovCiBzdGF0aWMgaW50IHBjYTk1MzlfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OwpAQCAtMTY0LDEwICsxNjIsOCBAQAogewogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZC5cbiIpOworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCiAJCXJldHVybiBlcnI7Ci0JfQogCiAJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU3NC5jIGIvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU3NC5jCmluZGV4IGNmY2Y2NDYuLjY1MjU3NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL3BjZjg1NzQuYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9wY2Y4NTc0LmMKQEAgLTM5LDE2ICszOSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgogCiAvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywKIAkJCQkJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwKIAkJCQkJSTJDX0NMSUVOVF9FTkQgfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKIAogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLVNFTlNPUlNfSU5TTU9EXzIocGNmODU3NCwgcGNmODU3NGEpOworSTJDX0NMSUVOVF9JTlNNT0RfMihwY2Y4NTc0LCBwY2Y4NTc0YSk7CiAKIC8qIEluaXRpYWwgdmFsdWVzICovCiAjZGVmaW5lIFBDRjg1NzRfSU5JVCAyNTUJLyogQWxsIG91dHB1dHMgb24gKGlucHV0IG1vZGUpICovCkBAIC0xMTMsMTAgKzExMSwxMCBAQAogCiBzdGF0aWMgaW50IHBjZjg1NzRfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewotCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHBjZjg1NzRfZGV0ZWN0KTsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIHBjZjg1NzRfZGV0ZWN0KTsKIH0KIAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX2RldGVjdCAqLworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX3Byb2JlICovCiBpbnQgcGNmODU3NF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CkBAIC0xODYsMTEgKzE4NCw4IEBACiB7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCQkiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCiAJCXJldHVybiBlcnI7Ci0JfQogCiAJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU5MS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU5MS5jCmluZGV4IGRiODEyYWQuLjgwZjFkZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL3BjZjg1OTEuYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9wY2Y4NTkxLmMKQEAgLTI0LDE1ICsyNCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgogCiAvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywKIAkJCQkJMHg0ZCwgMHg0ZSwgMHg0ZiwgSTJDX0NMSUVOVF9FTkQgfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKIAogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLVNFTlNPUlNfSU5TTU9EXzEocGNmODU5MSk7CitJMkNfQ0xJRU5UX0lOU01PRF8xKHBjZjg1OTEpOwogCiBzdGF0aWMgaW50IGlucHV0X21vZGU7CiBtb2R1bGVfcGFyYW0oaW5wdXRfbW9kZSwgaW50LCAwKTsKQEAgLTE2NCwxMCArMTYyLDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgcGNmODU5MV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgcGNmODU5MV9kZXRlY3QpOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgcGNmODU5MV9kZXRlY3QpOwogfQogCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfZGV0ZWN0ICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfcHJvYmUgKi8KIGludCBwY2Y4NTkxX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKQEAgLTI0MSwxMSArMjM5LDggQEAKIHsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKLQkJCSJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKIAkJcmV0dXJuIGVycjsKLQl9CiAKIAlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9ydGM4NTY0LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9ydGM4NTY0LmMKaW5kZXggNTg4ZmMyMi4uMGI1Mzg1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvcnRjODU2NC5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3J0Yzg1NjQuYwpAQCAtNjcsNyArNjcsNiBAQAogCS5ub3JtYWxfaTJjCQk9IG5vcm1hbF9hZGRyLAogCS5wcm9iZQkJCT0gaWdub3JlLAogCS5pZ25vcmUJCQk9IGlnbm9yZSwKLQkuZm9yY2UJCQk9IGlnbm9yZSwKIH07CiAKIHN0YXRpYyBpbnQgcnRjODU2NF9yZWFkX21lbShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgbWVtICptZW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKaW5kZXggNGE5ZWFkMi4uZGRhNDcyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCkBAIC02MSw3ICs2MSw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgc3RydWN0IGJ1c190eXBlIGkyY19idXNfdHlwZSA9IHsKK3N0cnVjdCBidXNfdHlwZSBpMmNfYnVzX3R5cGUgPSB7CiAJLm5hbWUgPQkJImkyYyIsCiAJLm1hdGNoID0JaTJjX2RldmljZV9tYXRjaCwKIAkuc3VzcGVuZCA9ICAgICAgaTJjX2J1c19zdXNwZW5kLApAQCAtNzgsMTMgKzc4LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGkyY19hZGFwdGVyX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3ZvaWQgaTJjX2FkYXB0ZXJfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9IGRldl90b19pMmNfYWRhcHRlcihkZXYpOwogCWNvbXBsZXRlKCZhZGFwLT5kZXZfcmVsZWFzZWQpOwogfQogCi1zdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgaTJjX2FkYXB0ZXJfZHJpdmVyID0geworc3RydWN0IGRldmljZV9kcml2ZXIgaTJjX2FkYXB0ZXJfZHJpdmVyID0gewogCS5uYW1lID0JImkyY19hZGFwdGVyIiwKIAkuYnVzID0gJmkyY19idXNfdHlwZSwKIAkucHJvYmUgPSBpMmNfZGV2aWNlX3Byb2JlLApAQCAtOTcsNyArOTcsNyBAQAogCWNvbXBsZXRlKCZhZGFwLT5jbGFzc19kZXZfcmVsZWFzZWQpOwogfQogCi1zdGF0aWMgc3RydWN0IGNsYXNzIGkyY19hZGFwdGVyX2NsYXNzID0geworc3RydWN0IGNsYXNzIGkyY19hZGFwdGVyX2NsYXNzID0gewogCS5uYW1lID0JCSJpMmMtYWRhcHRlciIsCiAJLnJlbGVhc2UgPQkmaTJjX2FkYXB0ZXJfY2xhc3NfZGV2X3JlbGVhc2UsCiB9OwpAQCAtMTg4LDYgKzE4OCw4IEBACiAJc3RybGNweShhZGFwLT5jbGFzc19kZXYuY2xhc3NfaWQsIGFkYXAtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFKTsKIAljbGFzc19kZXZpY2VfcmVnaXN0ZXIoJmFkYXAtPmNsYXNzX2Rldik7CiAKKwlkZXZfZGJnKCZhZGFwLT5kZXYsICJhZGFwdGVyIFslc10gcmVnaXN0ZXJlZFxuIiwgYWRhcC0+bmFtZSk7CisKIAkvKiBpbmZvcm0gZHJpdmVycyBvZiBuZXcgYWRhcHRlcnMgKi8KIAlsaXN0X2Zvcl9lYWNoKGl0ZW0sJmRyaXZlcnMpIHsKIAkJZHJpdmVyID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgaTJjX2RyaXZlciwgbGlzdCk7CkBAIC0xOTYsOCArMTk4LDYgQEAKIAkJCWRyaXZlci0+YXR0YWNoX2FkYXB0ZXIoYWRhcCk7CiAJfQogCi0JZGV2X2RiZygmYWRhcC0+ZGV2LCAicmVnaXN0ZXJlZCBhcyBhZGFwdGVyICMlZFxuIiwgYWRhcC0+bnIpOwotCiBvdXRfdW5sb2NrOgogCXVwKCZjb3JlX2xpc3RzKTsKIAlyZXR1cm4gcmVzOwpAQCAtMjIwLDggKzIyMCw4IEBACiAJCQlicmVhazsKIAl9CiAJaWYgKGFkYXBfZnJvbV9saXN0ICE9IGFkYXApIHsKLQkJcHJfZGVidWcoIkkyQzogQXR0ZW1wdGluZyB0byBkZWxldGUgYW4gdW5yZWdpc3RlcmVkICIKLQkJCSAiYWRhcHRlclxuIik7CisJCXByX2RlYnVnKCJpMmMtY29yZTogYXR0ZW1wdGluZyB0byBkZWxldGUgdW5yZWdpc3RlcmVkICIKKwkJCSAiYWRhcHRlciBbJXNdXG4iLCBhZGFwLT5uYW1lKTsKIAkJcmVzID0gLUVJTlZBTDsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KQEAgLTIzMCw5ICsyMzAsOCBAQAogCQlkcml2ZXIgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfZHJpdmVyLCBsaXN0KTsKIAkJaWYgKGRyaXZlci0+ZGV0YWNoX2FkYXB0ZXIpCiAJCQlpZiAoKHJlcyA9IGRyaXZlci0+ZGV0YWNoX2FkYXB0ZXIoYWRhcCkpKSB7Ci0JCQkJZGV2X3dhcm4oJmFkYXAtPmRldiwgImNhbid0IGRldGFjaCBhZGFwdGVyICIKLQkJCQkJICJ3aGlsZSBkZXRhY2hpbmcgZHJpdmVyICVzOiBkcml2ZXIgIgotCQkJCQkgIm5vdCBkZXRhY2hlZCFcbiIsIGRyaXZlci0+bmFtZSk7CisJCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAiZGV0YWNoX2FkYXB0ZXIgZmFpbGVkICIKKwkJCQkJImZvciBkcml2ZXIgWyVzXVxuIiwgZHJpdmVyLT5uYW1lKTsKIAkJCQlnb3RvIG91dF91bmxvY2s7CiAJCQl9CiAJfQpAQCAtMjQ3LDkgKzI0Niw4IEBACiAJCSAqIG11c3QgYmUgZGVsZXRlZCwgYXMgdGhpcyB3b3VsZCBjYXVzZSBpbnZhbGlkIHN0YXRlcy4KIAkJICovCiAJCWlmICgocmVzPWNsaWVudC0+ZHJpdmVyLT5kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJhZGFwdGVyIG5vdCAiCi0JCQkJInVucmVnaXN0ZXJlZCwgYmVjYXVzZSBjbGllbnQgYXQgIgotCQkJCSJhZGRyZXNzICUwMnggY2FuJ3QgYmUgZGV0YWNoZWQuICIsCisJCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJkZXRhY2hfY2xpZW50IGZhaWxlZCBmb3IgY2xpZW50ICIKKwkJCQkiWyVzXSBhdCBhZGRyZXNzIDB4JTAyeFxuIiwgY2xpZW50LT5uYW1lLAogCQkJCWNsaWVudC0+YWRkcik7CiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KQEAgLTI3MCw3ICsyNjgsNyBAQAogCS8qIGZyZWUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGJ1cyBpZCAqLwogCWlkcl9yZW1vdmUoJmkyY19hZGFwdGVyX2lkciwgYWRhcC0+bnIpOwogCi0JZGV2X2RiZygmYWRhcC0+ZGV2LCAiYWRhcHRlciB1bnJlZ2lzdGVyZWRcbiIpOworCWRldl9kYmcoJmFkYXAtPmRldiwgImFkYXB0ZXIgWyVzXSB1bnJlZ2lzdGVyZWRcbiIsIGFkYXAtPm5hbWUpOwogCiAgb3V0X3VubG9jazoKIAl1cCgmY29yZV9saXN0cyk7CkBAIC0zMDMsNyArMzAxLDcgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCQogCWxpc3RfYWRkX3RhaWwoJmRyaXZlci0+bGlzdCwmZHJpdmVycyk7Ci0JcHJfZGVidWcoImkyYy1jb3JlOiBkcml2ZXIgJXMgcmVnaXN0ZXJlZC5cbiIsIGRyaXZlci0+bmFtZSk7CisJcHJfZGVidWcoImkyYy1jb3JlOiBkcml2ZXIgWyVzXSByZWdpc3RlcmVkXG4iLCBkcml2ZXItPm5hbWUpOwogCiAJLyogbm93IGxvb2sgZm9yIGluc3RhbmNlcyBvZiBkcml2ZXIgb24gb3VyIGFkYXB0ZXJzICovCiAJaWYgKGRyaXZlci0+ZmxhZ3MgJiBJMkNfREZfTk9USUZZKSB7CkBAIC0zMzEsMjEgKzMyOSwxNyBAQAogCS8qIEhhdmUgYSBsb29rIGF0IGVhY2ggYWRhcHRlciwgaWYgY2xpZW50cyBvZiB0aGlzIGRyaXZlciBhcmUgc3RpbGwKIAkgKiBhdHRhY2hlZC4gSWYgc28sIGRldGFjaCB0aGVtIHRvIGJlIGFibGUgdG8ga2lsbCB0aGUgZHJpdmVyIAogCSAqIGFmdGVyd2FyZHMuCi0JICovCi0JcHJfZGVidWcoImkyYy1jb3JlOiB1bnJlZ2lzdGVyX2RyaXZlciAtIGxvb2tpbmcgZm9yIGNsaWVudHMuXG4iKTsKLQkvKiByZW1vdmluZyBjbGllbnRzIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgbm90aWZ5IGZsYWcsIGVsc2UgCisJICoKKwkgKiBSZW1vdmluZyBjbGllbnRzIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgbm90aWZ5IGZsYWcsIGVsc2UKIAkgKiBpbnZhbGlkIG9wZXJhdGlvbiBtaWdodCAod2lsbCEpIHJlc3VsdCwgd2hlbiB1c2luZyBzdGFsZSBjbGllbnQKIAkgKiBwb2ludGVycy4KIAkgKi8KIAlsaXN0X2Zvcl9lYWNoKGl0ZW0xLCZhZGFwdGVycykgewogCQlhZGFwID0gbGlzdF9lbnRyeShpdGVtMSwgc3RydWN0IGkyY19hZGFwdGVyLCBsaXN0KTsKLQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiZXhhbWluaW5nIGFkYXB0ZXJcbiIpOwogCQlpZiAoZHJpdmVyLT5kZXRhY2hfYWRhcHRlcikgewogCQkJaWYgKChyZXMgPSBkcml2ZXItPmRldGFjaF9hZGFwdGVyKGFkYXApKSkgewotCQkJCWRldl93YXJuKCZhZGFwLT5kZXYsICJ3aGlsZSB1bnJlZ2lzdGVyaW5nICIKLQkJCQkgICAgICAgImR1bW15IGRyaXZlciAlcywgYWRhcHRlciBjb3VsZCAiCi0JCQkJICAgICAgICJub3QgYmUgZGV0YWNoZWQgcHJvcGVybHk7IGRyaXZlciAiCi0JCQkJICAgICAgICJub3QgdW5sb2FkZWQhIixkcml2ZXItPm5hbWUpOworCQkJCWRldl9lcnIoJmFkYXAtPmRldiwgImRldGFjaF9hZGFwdGVyIGZhaWxlZCAiCisJCQkJCSJmb3IgZHJpdmVyIFslc11cbiIsIGRyaXZlci0+bmFtZSk7CiAJCQkJZ290byBvdXRfdW5sb2NrOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMzUzLDE2ICszNDcsMTMgQEAKIAkJCQljbGllbnQgPSBsaXN0X2VudHJ5KGl0ZW0yLCBzdHJ1Y3QgaTJjX2NsaWVudCwgbGlzdCk7CiAJCQkJaWYgKGNsaWVudC0+ZHJpdmVyICE9IGRyaXZlcikKIAkJCQkJY29udGludWU7Ci0JCQkJcHJfZGVidWcoImkyYy1jb3JlLm86IGRldGFjaGluZyBjbGllbnQgJXM6XG4iLCBjbGllbnQtPm5hbWUpOworCQkJCWRldl9kYmcoJmFkYXAtPmRldiwgImRldGFjaGluZyBjbGllbnQgWyVzXSAiCisJCQkJCSJhdCAweCUwMnhcbiIsIGNsaWVudC0+bmFtZSwKKwkJCQkJY2xpZW50LT5hZGRyKTsKIAkJCQlpZiAoKHJlcyA9IGRyaXZlci0+ZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQkJCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJ3aGlsZSAiCi0JCQkJCQkidW5yZWdpc3RlcmluZyBkcml2ZXIgIgotCQkJCQkJImAlcycsIHRoZSBjbGllbnQgYXQgIgotCQkJCQkJImFkZHJlc3MgJTAyeCBvZiAiCi0JCQkJCQkiYWRhcHRlciBjb3VsZCBub3QgIgotCQkJCQkJImJlIGRldGFjaGVkOyBkcml2ZXIgIgotCQkJCQkJIm5vdCB1bmxvYWRlZCEiLAotCQkJCQkJZHJpdmVyLT5uYW1lLAorCQkJCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJkZXRhY2hfY2xpZW50ICIKKwkJCQkJCSJmYWlsZWQgZm9yIGNsaWVudCBbJXNdIGF0ICIKKwkJCQkJCSIweCUwMnhcbiIsIGNsaWVudC0+bmFtZSwKIAkJCQkJCWNsaWVudC0+YWRkcik7CiAJCQkJCWdvdG8gb3V0X3VubG9jazsKIAkJCQl9CkBAIC0zNzIsNyArMzYzLDcgQEAKIAogCWRyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7CiAJbGlzdF9kZWwoJmRyaXZlci0+bGlzdCk7Ci0JcHJfZGVidWcoImkyYy1jb3JlOiBkcml2ZXIgdW5yZWdpc3RlcmVkOiAlc1xuIiwgZHJpdmVyLT5uYW1lKTsKKwlwcl9kZWJ1ZygiaTJjLWNvcmU6IGRyaXZlciBbJXNdIHVucmVnaXN0ZXJlZFxuIiwgZHJpdmVyLT5uYW1lKTsKIAogIG91dF91bmxvY2s6CiAJdXAoJmNvcmVfbGlzdHMpOwpAQCAtNDE3LDE1ICs0MDgsMTIgQEAKIAkKIAlpZiAoYWRhcHRlci0+Y2xpZW50X3JlZ2lzdGVyKSAgewogCQlpZiAoYWRhcHRlci0+Y2xpZW50X3JlZ2lzdGVyKGNsaWVudCkpICB7Ci0JCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCAid2FybmluZzogY2xpZW50X3JlZ2lzdGVyICIKLQkJCQkic2VlbXMgdG8gaGF2ZSBmYWlsZWQgZm9yIGNsaWVudCAlMDJ4XG4iLAotCQkJCWNsaWVudC0+YWRkcik7CisJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJjbGllbnRfcmVnaXN0ZXIgIgorCQkJCSJmYWlsZWQgZm9yIGNsaWVudCBbJXNdIGF0IDB4JTAyeFxuIiwKKwkJCQljbGllbnQtPm5hbWUsIGNsaWVudC0+YWRkcik7CiAJCX0KIAl9CiAKLQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJjbGllbnQgWyVzXSByZWdpc3RlcmVkIHRvIGFkYXB0ZXJcbiIsCi0JCWNsaWVudC0+bmFtZSk7Ci0KIAlpZiAoY2xpZW50LT5mbGFncyAmIEkyQ19DTElFTlRfQUxMT1dfVVNFKQogCQljbGllbnQtPnVzYWdlX2NvdW50ID0gMDsKIApAQCAtNDM2LDcgKzQyNCw4IEBACiAJCiAJc25wcmludGYoJmNsaWVudC0+ZGV2LmJ1c19pZFswXSwgc2l6ZW9mKGNsaWVudC0+ZGV2LmJ1c19pZCksCiAJCSIlZC0lMDR4IiwgaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGNsaWVudC0+YWRkcik7Ci0JcHJfZGVidWcoInJlZ2lzdGVyaW5nICVzXG4iLCBjbGllbnQtPmRldi5idXNfaWQpOworCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImNsaWVudCBbJXNdIHJlZ2lzdGVyZWQgd2l0aCBidXMgaWQgJXNcbiIsCisJCWNsaWVudC0+bmFtZSwgY2xpZW50LT5kZXYuYnVzX2lkKTsKIAlkZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY2xpZW50X25hbWUpOwogCQpAQCAtNDQ5LDggKzQzOCwxMiBAQAogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKIAlpbnQgcmVzID0gMDsKIAkKLQlpZiAoKGNsaWVudC0+ZmxhZ3MgJiBJMkNfQ0xJRU5UX0FMTE9XX1VTRSkgJiYgKGNsaWVudC0+dXNhZ2VfY291bnQgPiAwKSkKKwlpZiAoKGNsaWVudC0+ZmxhZ3MgJiBJMkNfQ0xJRU5UX0FMTE9XX1VTRSkKKwkgJiYgKGNsaWVudC0+dXNhZ2VfY291bnQgPiAwKSkgeworCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJDbGllbnQgWyVzXSBzdGlsbCBidXN5LCAiCisJCQkgImNhbid0IGRldGFjaFxuIiwgY2xpZW50LT5uYW1lKTsKIAkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAlpZiAoYWRhcHRlci0+Y2xpZW50X3VucmVnaXN0ZXIpICB7CiAJCXJlcyA9IGFkYXB0ZXItPmNsaWVudF91bnJlZ2lzdGVyKGNsaWVudCk7CkBAIC02NjksOTggKzY2MiwxMjggQEAKICAqIFdpbGwgbm90IHdvcmsgZm9yIDEwLWJpdCBhZGRyZXNzZXMhCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KK3N0YXRpYyBpbnQgaTJjX3Byb2JlX2FkZHJlc3Moc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50IGtpbmQsCisJCQkgICAgIGludCAoKmZvdW5kX3Byb2MpIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgaW50LCBpbnQpKQoreworCWludCBlcnI7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGFkZHJlc3MgaXMgdmFsaWQgKi8KKwlpZiAoYWRkciA8IDB4MDMgfHwgYWRkciA+IDB4NzcpIHsKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgIkludmFsaWQgcHJvYmUgYWRkcmVzcyAweCUwMnhcbiIsCisJCQkgYWRkcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFNraXAgaWYgYWxyZWFkeSBpbiB1c2UgKi8KKwlpZiAoaTJjX2NoZWNrX2FkZHIoYWRhcHRlciwgYWRkcikpCisJCXJldHVybiAwOworCisJLyogTWFrZSBzdXJlIHRoZXJlIGlzIHNvbWV0aGluZyBhdCB0aGlzIGFkZHJlc3MsIHVubGVzcyBmb3JjZWQgKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJaWYgKGkyY19zbWJ1c194ZmVyKGFkYXB0ZXIsIGFkZHIsIDAsIDAsIDAsCisJCQkJICAgSTJDX1NNQlVTX1FVSUNLLCBOVUxMKSA8IDApCisJCQlyZXR1cm4gMDsKKworCQkvKiBwcmV2ZW50IDI0UkYwOCBjb3JydXB0aW9uICovCisJCWlmICgoYWRkciAmIH4weDBmKSA9PSAweDUwKQorCQkJaTJjX3NtYnVzX3hmZXIoYWRhcHRlciwgYWRkciwgMCwgMCwgMCwKKwkJCQkgICAgICAgSTJDX1NNQlVTX1FVSUNLLCBOVUxMKTsKKwl9CisKKwkvKiBGaW5hbGx5IGNhbGwgdGhlIGN1c3RvbSBkZXRlY3Rpb24gZnVuY3Rpb24gKi8KKwllcnIgPSBmb3VuZF9wcm9jKGFkYXB0ZXIsIGFkZHIsIGtpbmQpOworCisJLyogLUVOT0RFViBjYW4gYmUgcmV0dXJuZWQgaWYgdGhlcmUgaXMgYSBjaGlwIGF0IHRoZSBnaXZlbiBhZGRyZXNzCisJICAgYnV0IGl0IGlzbid0IHN1cHBvcnRlZCBieSB0aGlzIGNoaXAgZHJpdmVyLiBXZSBjYXRjaCBpdCBoZXJlIGFzCisJICAgdGhpcyBpc24ndCBhbiBlcnJvci4gKi8KKwlyZXR1cm4gKGVyciA9PSAtRU5PREVWKSA/IDAgOiBlcnI7Cit9CisKIGludCBpMmNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAogCSAgICAgIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSAqYWRkcmVzc19kYXRhLAogCSAgICAgIGludCAoKmZvdW5kX3Byb2MpIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgaW50LCBpbnQpKQogewotCWludCBhZGRyLGksZm91bmQsZXJyOworCWludCBpLCBlcnI7CiAJaW50IGFkYXBfaWQgPSBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKTsKIAogCS8qIEZvcmdldCBpdCBpZiB3ZSBjYW4ndCBwcm9iZSB1c2luZyBTTUJVU19RVUlDSyAqLwogCWlmICghIGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsSTJDX0ZVTkNfU01CVVNfUVVJQ0spKQogCQlyZXR1cm4gLTE7CiAKLQlmb3IgKGFkZHIgPSAweDAwOyBhZGRyIDw9IDB4N2Y7IGFkZHIrKykgeworCS8qIEZvcmNlIGVudHJpZXMgYXJlIGRvbmUgZmlyc3QsIGFuZCBhcmUgbm90IGFmZmVjdGVkIGJ5IGlnbm9yZQorCSAgIGVudHJpZXMgKi8KKwlpZiAoYWRkcmVzc19kYXRhLT5mb3JjZXMpIHsKKwkJdW5zaWduZWQgc2hvcnQgKipmb3JjZXMgPSBhZGRyZXNzX2RhdGEtPmZvcmNlczsKKwkJaW50IGtpbmQ7CiAKLQkJLyogU2tpcCBpZiBhbHJlYWR5IGluIHVzZSAqLwotCQlpZiAoaTJjX2NoZWNrX2FkZHIoYWRhcHRlcixhZGRyKSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIElmIGl0IGlzIGluIG9uZSBvZiB0aGUgZm9yY2UgZW50cmllcywgd2UgZG9uJ3QgZG8gYW55IGRldGVjdGlvbgotCQkgICBhdCBhbGwgKi8KLQkJZm91bmQgPSAwOwotCi0JCWZvciAoaSA9IDA7ICFmb3VuZCAmJiAoYWRkcmVzc19kYXRhLT5mb3JjZVtpXSAhPSBJMkNfQ0xJRU5UX0VORCk7IGkgKz0gMikgewotCQkJaWYgKCgoYWRhcF9pZCA9PSBhZGRyZXNzX2RhdGEtPmZvcmNlW2ldKSB8fCAKLQkJCSAgICAgKGFkZHJlc3NfZGF0YS0+Zm9yY2VbaV0gPT0gQU5ZX0kyQ19CVVMpKSAmJgotCQkJICAgICAoYWRkciA9PSBhZGRyZXNzX2RhdGEtPmZvcmNlW2krMV0pKSB7Ci0JCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgZm9yY2UgcGFyYW1ldGVyIGZvciBhZGFwdGVyICVkLCBhZGRyICUwNHhcbiIsCi0JCQkJCWFkYXBfaWQsIGFkZHIpOwotCQkJCWlmICgoZXJyID0gZm91bmRfcHJvYyhhZGFwdGVyLGFkZHIsMCkpKQotCQkJCQlyZXR1cm4gZXJyOwotCQkJCWZvdW5kID0gMTsKKwkJZm9yIChraW5kID0gMDsgZm9yY2VzW2tpbmRdOyBraW5kKyspIHsKKwkJCWZvciAoaSA9IDA7IGZvcmNlc1traW5kXVtpXSAhPSBJMkNfQ0xJRU5UX0VORDsKKwkJCSAgICAgaSArPSAyKSB7CisJCQkJaWYgKGZvcmNlc1traW5kXVtpXSA9PSBhZGFwX2lkCisJCQkJIHx8IGZvcmNlc1traW5kXVtpXSA9PSBBTllfSTJDX0JVUykgeworCQkJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJmb3VuZCBmb3JjZSAiCisJCQkJCQkicGFyYW1ldGVyIGZvciBhZGFwdGVyICVkLCAiCisJCQkJCQkiYWRkciAweCUwMngsIGtpbmQgJWRcbiIsCisJCQkJCQlhZGFwX2lkLCBmb3JjZXNba2luZF1baSArIDFdLAorCQkJCQkJa2luZCk7CisJCQkJCWVyciA9IGkyY19wcm9iZV9hZGRyZXNzKGFkYXB0ZXIsCisJCQkJCQlmb3JjZXNba2luZF1baSArIDFdLAorCQkJCQkJa2luZCwgZm91bmRfcHJvYyk7CisJCQkJCWlmIChlcnIpCisJCQkJCQlyZXR1cm4gZXJyOworCQkJCX0KIAkJCX0KIAkJfQotCQlpZiAoZm91bmQpIAotCQkJY29udGludWU7Ci0KLQkJLyogSWYgdGhpcyBhZGRyZXNzIGlzIGluIG9uZSBvZiB0aGUgaWdub3Jlcywgd2UgY2FuIGZvcmdldCBhYm91dAotCQkgICBpdCByaWdodCBub3cgKi8KLQkJZm9yIChpID0gMDsKLQkJICAgICAhZm91bmQgJiYgKGFkZHJlc3NfZGF0YS0+aWdub3JlW2ldICE9IEkyQ19DTElFTlRfRU5EKTsKLQkJICAgICBpICs9IDIpIHsKLQkJCWlmICgoKGFkYXBfaWQgPT0gYWRkcmVzc19kYXRhLT5pZ25vcmVbaV0pIHx8IAotCQkJICAgICgoYWRkcmVzc19kYXRhLT5pZ25vcmVbaV0gPT0gQU5ZX0kyQ19CVVMpKSkgJiYKLQkJCSAgICAoYWRkciA9PSBhZGRyZXNzX2RhdGEtPmlnbm9yZVtpKzFdKSkgewotCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImZvdW5kIGlnbm9yZSBwYXJhbWV0ZXIgZm9yIGFkYXB0ZXIgJWQsICIKLQkJCQkJImFkZHIgJTA0eFxuIiwgYWRhcF9pZCAsYWRkcik7Ci0JCQkJZm91bmQgPSAxOwotCQkJfQotCQl9Ci0JCWlmIChmb3VuZCkgCi0JCQljb250aW51ZTsKLQotCQkvKiBOb3csIHdlIHdpbGwgZG8gYSBkZXRlY3Rpb24sIGJ1dCBvbmx5IGlmIGl0IGlzIGluIHRoZSBub3JtYWwgb3IgCi0JCSAgIHByb2JlIGVudHJpZXMgKi8gIAotCQlmb3IgKGkgPSAwOwotCQkgICAgICFmb3VuZCAmJiAoYWRkcmVzc19kYXRhLT5ub3JtYWxfaTJjW2ldICE9IEkyQ19DTElFTlRfRU5EKTsKLQkJICAgICBpICs9IDEpIHsKLQkJCWlmIChhZGRyID09IGFkZHJlc3NfZGF0YS0+bm9ybWFsX2kyY1tpXSkgewotCQkJCWZvdW5kID0gMTsKLQkJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJmb3VuZCBub3JtYWwgaTJjIGVudHJ5IGZvciBhZGFwdGVyICVkLCAiCi0JCQkJCSJhZGRyICUwMnhcbiIsIGFkYXBfaWQsIGFkZHIpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpID0gMDsKLQkJICAgICAhZm91bmQgJiYgKGFkZHJlc3NfZGF0YS0+cHJvYmVbaV0gIT0gSTJDX0NMSUVOVF9FTkQpOwotCQkgICAgIGkgKz0gMikgewotCQkJaWYgKCgoYWRhcF9pZCA9PSBhZGRyZXNzX2RhdGEtPnByb2JlW2ldKSB8fAotCQkJICAgICgoYWRkcmVzc19kYXRhLT5wcm9iZVtpXSA9PSBBTllfSTJDX0JVUykpKSAmJgotCQkJICAgIChhZGRyID09IGFkZHJlc3NfZGF0YS0+cHJvYmVbaSsxXSkpIHsKLQkJCQlmb3VuZCA9IDE7Ci0JCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgcHJvYmUgcGFyYW1ldGVyIGZvciBhZGFwdGVyICVkLCAiCi0JCQkJCSJhZGRyICUwNHhcbiIsIGFkYXBfaWQsYWRkcik7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmb3VuZCkgCi0JCQljb250aW51ZTsKLQotCQkvKiBPSywgc28gd2UgcmVhbGx5IHNob3VsZCBleGFtaW5lIHRoaXMgYWRkcmVzcy4gRmlyc3QgY2hlY2sKLQkJICAgd2hldGhlciB0aGVyZSBpcyBzb21lIGNsaWVudCBoZXJlIGF0IGFsbCEgKi8KLQkJaWYgKGkyY19zbWJ1c194ZmVyKGFkYXB0ZXIsYWRkciwwLDAsMCxJMkNfU01CVVNfUVVJQ0ssTlVMTCkgPj0gMCkKLQkJCWlmICgoZXJyID0gZm91bmRfcHJvYyhhZGFwdGVyLGFkZHIsLTEpKSkKLQkJCQlyZXR1cm4gZXJyOwogCX0KLQlyZXR1cm4gMDsKLX0KIAotLyoKLSAqIHJldHVybiBpZCBudW1iZXIgZm9yIGEgc3BlY2lmaWMgYWRhcHRlcgotICovCi1pbnQgaTJjX2FkYXB0ZXJfaWQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCXJldHVybiBhZGFwLT5ucjsKKwkvKiBQcm9iZSBlbnRyaWVzIGFyZSBkb25lIHNlY29uZCwgYW5kIGFyZSBub3QgYWZmZWN0ZWQgYnkgaWdub3JlCisJICAgZW50cmllcyBlaXRoZXIgKi8KKwlmb3IgKGkgPSAwOyBhZGRyZXNzX2RhdGEtPnByb2JlW2ldICE9IEkyQ19DTElFTlRfRU5EOyBpICs9IDIpIHsKKwkJaWYgKGFkZHJlc3NfZGF0YS0+cHJvYmVbaV0gPT0gYWRhcF9pZAorCQkgfHwgYWRkcmVzc19kYXRhLT5wcm9iZVtpXSA9PSBBTllfSTJDX0JVUykgeworCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgcHJvYmUgcGFyYW1ldGVyIGZvciAiCisJCQkJImFkYXB0ZXIgJWQsIGFkZHIgMHglMDJ4XG4iLCBhZGFwX2lkLAorCQkJCWFkZHJlc3NfZGF0YS0+cHJvYmVbaSArIDFdKTsKKwkJCWVyciA9IGkyY19wcm9iZV9hZGRyZXNzKGFkYXB0ZXIsCisJCQkJCQlhZGRyZXNzX2RhdGEtPnByb2JlW2kgKyAxXSwKKwkJCQkJCS0xLCBmb3VuZF9wcm9jKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIE5vcm1hbCBlbnRyaWVzIGFyZSBkb25lIGxhc3QsIHVubGVzcyBzaGFkb3dlZCBieSBhbiBpZ25vcmUgZW50cnkgKi8KKwlmb3IgKGkgPSAwOyBhZGRyZXNzX2RhdGEtPm5vcm1hbF9pMmNbaV0gIT0gSTJDX0NMSUVOVF9FTkQ7IGkgKz0gMSkgeworCQlpbnQgaiwgaWdub3JlOworCisJCWlnbm9yZSA9IDA7CisJCWZvciAoaiA9IDA7IGFkZHJlc3NfZGF0YS0+aWdub3JlW2pdICE9IEkyQ19DTElFTlRfRU5EOworCQkgICAgIGogKz0gMikgeworCQkJaWYgKChhZGRyZXNzX2RhdGEtPmlnbm9yZVtqXSA9PSBhZGFwX2lkIHx8CisJCQkgICAgIGFkZHJlc3NfZGF0YS0+aWdub3JlW2pdID09IEFOWV9JMkNfQlVTKQorCQkJICYmIGFkZHJlc3NfZGF0YS0+aWdub3JlW2ogKyAxXQorCQkJICAgID09IGFkZHJlc3NfZGF0YS0+bm9ybWFsX2kyY1tpXSkgeworCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImZvdW5kIGlnbm9yZSAiCisJCQkJCSJwYXJhbWV0ZXIgZm9yIGFkYXB0ZXIgJWQsICIKKwkJCQkJImFkZHIgMHglMDJ4XG4iLCBhZGFwX2lkLAorCQkJCQlhZGRyZXNzX2RhdGEtPmlnbm9yZVtqICsgMV0pOworCQkJfQorCQkJaWdub3JlID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChpZ25vcmUpCisJCQljb250aW51ZTsKKworCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJmb3VuZCBub3JtYWwgZW50cnkgZm9yIGFkYXB0ZXIgJWQsICIKKwkJCSJhZGRyIDB4JTAyeFxuIiwgYWRhcF9pZCwKKwkJCWFkZHJlc3NfZGF0YS0+bm9ybWFsX2kyY1tpXSk7CisJCWVyciA9IGkyY19wcm9iZV9hZGRyZXNzKGFkYXB0ZXIsIGFkZHJlc3NfZGF0YS0+bm9ybWFsX2kyY1tpXSwKKwkJCQkJLTEsIGZvdW5kX3Byb2MpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IGkyY19hZGFwdGVyKiBpMmNfZ2V0X2FkYXB0ZXIoaW50IGlkKQpAQCAtMTE3MSw2ICsxMTk0LDEyIEBACiB9CiAKIAorLyogTmV4dCBmb3VyIGFyZSBuZWVkZWQgYnkgaTJjLWlzYSAqLworRVhQT1JUX1NZTUJPTF9HUEwoaTJjX2FkYXB0ZXJfZGV2X3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTF9HUEwoaTJjX2FkYXB0ZXJfZHJpdmVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGkyY19hZGFwdGVyX2NsYXNzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGkyY19idXNfdHlwZSk7CisKIEVYUE9SVF9TWU1CT0woaTJjX2FkZF9hZGFwdGVyKTsKIEVYUE9SVF9TWU1CT0woaTJjX2RlbF9hZGFwdGVyKTsKIEVYUE9SVF9TWU1CT0woaTJjX2FkZF9kcml2ZXIpOwpAQCAtMTE4Niw3ICsxMjE1LDYgQEAKIEVYUE9SVF9TWU1CT0woaTJjX21hc3Rlcl9yZWN2KTsKIEVYUE9SVF9TWU1CT0woaTJjX2NvbnRyb2wpOwogRVhQT1JUX1NZTUJPTChpMmNfdHJhbnNmZXIpOwotRVhQT1JUX1NZTUJPTChpMmNfYWRhcHRlcl9pZCk7CiBFWFBPUlRfU1lNQk9MKGkyY19nZXRfYWRhcHRlcik7CiBFWFBPUlRfU1lNQk9MKGkyY19wdXRfYWRhcHRlcik7CiBFWFBPUlRfU1lNQk9MKGkyY19wcm9iZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9pMmMtZGV2LmMgYi9kcml2ZXJzL2kyYy9pMmMtZGV2LmMKaW5kZXggYmM1ZDU1Ny4uYWE3YTRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWRldi5jCisrKyBiL2RyaXZlcnMvaTJjL2kyYy1kZXYuYwpAQCAtNDM0LDcgKzQzNCw4IEBACiAKIAlkZXZmc19ta19jZGV2KE1LREVWKEkyQ19NQUpPUiwgaTJjX2Rldi0+bWlub3IpLAogCQkJU19JRkNIUnxTX0lSVVNSfFNfSVdVU1IsICJpMmMvJWQiLCBpMmNfZGV2LT5taW5vcik7Ci0JZGV2X2RiZygmYWRhcC0+ZGV2LCAiUmVnaXN0ZXJlZCBhcyBtaW5vciAlZFxuIiwgaTJjX2Rldi0+bWlub3IpOworCXByX2RlYnVnKCJpMmMtZGV2OiBhZGFwdGVyIFslc10gcmVnaXN0ZXJlZCBhcyBtaW5vciAlZFxuIiwKKwkJIGFkYXAtPm5hbWUsIGkyY19kZXYtPm1pbm9yKTsKIAogCS8qIHJlZ2lzdGVyIHRoaXMgaTJjIGRldmljZSB3aXRoIHRoZSBkcml2ZXIgY29yZSAqLwogCWkyY19kZXYtPmFkYXAgPSBhZGFwOwpAQCAtNDcxLDcgKzQ3Miw3IEBACiAJd2FpdF9mb3JfY29tcGxldGlvbigmaTJjX2Rldi0+cmVsZWFzZWQpOwogCWtmcmVlKGkyY19kZXYpOwogCi0JZGV2X2RiZygmYWRhcC0+ZGV2LCAiQWRhcHRlciB1bnJlZ2lzdGVyZWRcbiIpOworCXByX2RlYnVnKCJpMmMtZGV2OiBhZGFwdGVyIFslc10gdW5yZWdpc3RlcmVkXG4iLCBhZGFwLT5uYW1lKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLXNlbnNvci1kZXRlY3QuYyBiL2RyaXZlcnMvaTJjL2kyYy1zZW5zb3ItZGV0ZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OWE4MTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pMmMvaTJjLXNlbnNvci1kZXRlY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICAgIGkyYy1zZW5zb3ItZGV0ZWN0LmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQotICAgICAgICAgICAgCQkgIG1vbml0b3JpbmcKLSAgICBDb3B5cmlnaHQgKGMpIDE5OTggLSAyMDAxIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gYW5kCi0gICAgTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0qLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgZW1wdHlbXSA9IHtJMkNfQ0xJRU5UX0VORH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IGVtcHR5X2lzYVtdID0ge0kyQ19DTElFTlRfSVNBX0VORH07Ci0KLS8qIFZlcnkgaW5lZmZpY2llbnQgZm9yIElTQSBkZXRlY3RzLCBhbmQgd29uJ3Qgd29yayBmb3IgMTAtYml0IGFkZHJlc3NlcyEgKi8KLWludCBpMmNfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKLQkgICAgICAgc3RydWN0IGkyY19hZGRyZXNzX2RhdGEgKmFkZHJlc3NfZGF0YSwKLQkgICAgICAgaW50ICgqZm91bmRfcHJvYykgKHN0cnVjdCBpMmNfYWRhcHRlciAqLCBpbnQsIGludCkpCi17Ci0JaW50IGFkZHIsIGksIGZvdW5kLCBqLCBlcnI7Ci0Jc3RydWN0IGkyY19mb3JjZV9kYXRhICp0aGlzX2ZvcmNlOwotCWludCBpc19pc2EgPSBpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcik7Ci0JaW50IGFkYXB0ZXJfaWQgPQotCSAgICBpc19pc2EgPyBBTllfSTJDX0lTQV9CVVMgOiBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKTsKLQl1bnNpZ25lZCBzaG9ydCAqbm9ybWFsX2kyYzsKLQl1bnNpZ25lZCBpbnQgKm5vcm1hbF9pc2E7Ci0JdW5zaWduZWQgc2hvcnQgKnByb2JlOwotCXVuc2lnbmVkIHNob3J0ICppZ25vcmU7Ci0KLQkvKiBGb3JnZXQgaXQgaWYgd2UgY2FuJ3QgcHJvYmUgdXNpbmcgU01CVVNfUVVJQ0sgKi8KLQlpZiAoKCFpc19pc2EpICYmCi0JICAgICFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19RVUlDSykpCi0JCXJldHVybiAtMTsKLQkKLQkvKiBVc2UgZGVmYXVsdCAiZW1wdHkiIGxpc3QgaWYgdGhlIGFkYXB0ZXIgZG9lc24ndCBzcGVjaWZ5IGFueSAqLwotCW5vcm1hbF9pMmMgPSBwcm9iZSA9IGlnbm9yZSA9IGVtcHR5OwotCW5vcm1hbF9pc2EgPSBlbXB0eV9pc2E7Ci0JaWYgKGFkZHJlc3NfZGF0YS0+bm9ybWFsX2kyYykKLQkJbm9ybWFsX2kyYyA9IGFkZHJlc3NfZGF0YS0+bm9ybWFsX2kyYzsKLQlpZiAoYWRkcmVzc19kYXRhLT5ub3JtYWxfaXNhKQotCQlub3JtYWxfaXNhID0gYWRkcmVzc19kYXRhLT5ub3JtYWxfaXNhOwotCWlmIChhZGRyZXNzX2RhdGEtPnByb2JlKQotCQlwcm9iZSA9IGFkZHJlc3NfZGF0YS0+cHJvYmU7Ci0JaWYgKGFkZHJlc3NfZGF0YS0+aWdub3JlKQotCQlpZ25vcmUgPSBhZGRyZXNzX2RhdGEtPmlnbm9yZTsKLQotCWZvciAoYWRkciA9IDB4MDA7IGFkZHIgPD0gKGlzX2lzYSA/IDB4ZmZmZiA6IDB4N2YpOyBhZGRyKyspIHsKLQkJaWYgKCFpc19pc2EgJiYgaTJjX2NoZWNrX2FkZHIoYWRhcHRlciwgYWRkcikpCi0JCQljb250aW51ZTsKLQotCQkvKiBJZiBpdCBpcyBpbiBvbmUgb2YgdGhlIGZvcmNlIGVudHJpZXMsIHdlIGRvbid0IGRvIGFueQotCQkgICBkZXRlY3Rpb24gYXQgYWxsICovCi0JCWZvdW5kID0gMDsKLQkJZm9yIChpID0gMDsgIWZvdW5kICYmICh0aGlzX2ZvcmNlID0gYWRkcmVzc19kYXRhLT5mb3JjZXMgKyBpLCB0aGlzX2ZvcmNlLT5mb3JjZSk7IGkrKykgewotCQkJZm9yIChqID0gMDsgIWZvdW5kICYmICh0aGlzX2ZvcmNlLT5mb3JjZVtqXSAhPSBJMkNfQ0xJRU5UX0VORCk7IGogKz0gMikgewotCQkJCWlmICggKChhZGFwdGVyX2lkID09IHRoaXNfZm9yY2UtPmZvcmNlW2pdKSB8fAotCQkJCSAgICAgICgodGhpc19mb3JjZS0+Zm9yY2Vbal0gPT0gQU5ZX0kyQ19CVVMpICYmICFpc19pc2EpKSAmJgotCQkJCSAgICAgIChhZGRyID09IHRoaXNfZm9yY2UtPmZvcmNlW2ogKyAxXSkgKSB7Ci0JCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImZvdW5kIGZvcmNlIHBhcmFtZXRlciBmb3IgYWRhcHRlciAlZCwgYWRkciAlMDR4XG4iLCBhZGFwdGVyX2lkLCBhZGRyKTsKLQkJCQkJaWYgKChlcnIgPSBmb3VuZF9wcm9jKGFkYXB0ZXIsIGFkZHIsIHRoaXNfZm9yY2UtPmtpbmQpKSkKLQkJCQkJCXJldHVybiBlcnI7Ci0JCQkJCWZvdW5kID0gMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGZvdW5kKQotCQkJY29udGludWU7Ci0KLQkJLyogSWYgdGhpcyBhZGRyZXNzIGlzIGluIG9uZSBvZiB0aGUgaWdub3Jlcywgd2UgY2FuIGZvcmdldCBhYm91dCBpdAotCQkgICByaWdodCBub3cgKi8KLQkJZm9yIChpID0gMDsgIWZvdW5kICYmIChpZ25vcmVbaV0gIT0gSTJDX0NMSUVOVF9FTkQpOyBpICs9IDIpIHsKLQkJCWlmICggKChhZGFwdGVyX2lkID09IGlnbm9yZVtpXSkgfHwKLQkJCSAgICAgICgoaWdub3JlW2ldID09IEFOWV9JMkNfQlVTKSAmJgotCQkJICAgICAgICFpc19pc2EpKSAmJgotCQkJICAgICAgKGFkZHIgPT0gaWdub3JlW2kgKyAxXSkpIHsKLQkJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJmb3VuZCBpZ25vcmUgcGFyYW1ldGVyIGZvciBhZGFwdGVyICVkLCBhZGRyICUwNHhcbiIsIGFkYXB0ZXJfaWQsIGFkZHIpOwotCQkJCWZvdW5kID0gMTsKLQkJCX0KLQkJfQotCQlpZiAoZm91bmQpCi0JCQljb250aW51ZTsKLQotCQkvKiBOb3csIHdlIHdpbGwgZG8gYSBkZXRlY3Rpb24sIGJ1dCBvbmx5IGlmIGl0IGlzIGluIHRoZSBub3JtYWwgb3IgCi0JCSAgIHByb2JlIGVudHJpZXMgKi8KLQkJaWYgKGlzX2lzYSkgewotCQkJZm9yIChpID0gMDsgIWZvdW5kICYmIChub3JtYWxfaXNhW2ldICE9IEkyQ19DTElFTlRfSVNBX0VORCk7IGkgKz0gMSkgewotCQkJCWlmIChhZGRyID09IG5vcm1hbF9pc2FbaV0pIHsKLQkJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgbm9ybWFsIGlzYSBlbnRyeSBmb3IgYWRhcHRlciAlZCwgYWRkciAlMDR4XG4iLCBhZGFwdGVyX2lkLCBhZGRyKTsKLQkJCQkJZm91bmQgPSAxOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaSA9IDA7ICFmb3VuZCAmJiAobm9ybWFsX2kyY1tpXSAhPSBJMkNfQ0xJRU5UX0VORCk7IGkgKz0gMSkgewotCQkJCWlmIChhZGRyID09IG5vcm1hbF9pMmNbaV0pIHsKLQkJCQkJZm91bmQgPSAxOwotCQkJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJmb3VuZCBub3JtYWwgaTJjIGVudHJ5IGZvciBhZGFwdGVyICVkLCBhZGRyICUwMnhcbiIsIGFkYXB0ZXJfaWQsIGFkZHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZvciAoaSA9IDA7Ci0JCSAgICAgIWZvdW5kICYmIChwcm9iZVtpXSAhPSBJMkNfQ0xJRU5UX0VORCk7Ci0JCSAgICAgaSArPSAyKSB7Ci0JCQlpZiAoKChhZGFwdGVyX2lkID09IHByb2JlW2ldKSB8fAotCQkJICAgICAoKHByb2JlW2ldID09IEFOWV9JMkNfQlVTKSAmJiAhaXNfaXNhKSkKLQkJCSAgICAmJiAoYWRkciA9PSBwcm9iZVtpICsgMV0pKSB7Ci0JCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgcHJvYmUgcGFyYW1ldGVyIGZvciBhZGFwdGVyICVkLCBhZGRyICUwNHhcbiIsIGFkYXB0ZXJfaWQsIGFkZHIpOwotCQkJCWZvdW5kID0gMTsKLQkJCX0KLQkJfQotCQlpZiAoIWZvdW5kKQotCQkJY29udGludWU7Ci0KLQkJLyogT0ssIHNvIHdlIHJlYWxseSBzaG91bGQgZXhhbWluZSB0aGlzIGFkZHJlc3MuIEZpcnN0IGNoZWNrCi0JCSAgIHdoZXRoZXIgdGhlcmUgaXMgc29tZSBjbGllbnQgaGVyZSBhdCBhbGwhICovCi0JCWlmIChpc19pc2EgfHwKLQkJICAgIChpMmNfc21idXNfeGZlciAoYWRhcHRlciwgYWRkciwgMCwgMCwgMCwgSTJDX1NNQlVTX1FVSUNLLCBOVUxMKSA+PSAwKSkKLQkJCWlmICgoZXJyID0gZm91bmRfcHJvYyhhZGFwdGVyLCBhZGRyLCAtMSkpKQotCQkJCXJldHVybiBlcnI7Ci0JfQotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKGkyY19kZXRlY3QpOwotCi1NT0RVTEVfQVVUSE9SKCJGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LCAiCi0JICAgICAgIlJ1ZG9sZiBNYXJlayA8ci5tYXJla0BzaC5jdnV0LmN6PiIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oImkyYy1zZW5zb3IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9pMmMtc2Vuc29yLXZpZC5jIGIvZHJpdmVycy9pMmMvaTJjLXNlbnNvci12aWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyZTIyZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2kyYy9pMmMtc2Vuc29yLXZpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAgICBpMmMtc2Vuc29yLXZpZC5jIC0gIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCi0gICAgICAgIAkJbW9uaXRvcmluZwotCi0gICAgQ29weXJpZ2h0IChjKSAyMDA0IFJ1ZG9sZiBNYXJlayA8ci5tYXJla0BzaC5jdnV0LmN6PgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0qLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLXN0cnVjdCB2cm1fbW9kZWwgewotCXU4IHZlbmRvcjsKLQl1OCBlZmZfZmFtaWx5OwotCXU4IGVmZl9tb2RlbDsKLQlpbnQgdnJtX3R5cGU7Ci19OwotCi0jZGVmaW5lIEFOWSAweEZGCi0KLSNpZmRlZiBDT05GSUdfWDg2Ci0KLXN0YXRpYyBzdHJ1Y3QgdnJtX21vZGVsIHZybV9tb2RlbHNbXSA9IHsKLQl7WDg2X1ZFTkRPUl9BTUQsIDB4NiwgQU5ZLCA5MH0sCQkvKiBBdGhsb24gRHVyb24gZXRjICovCi0Je1g4Nl9WRU5ET1JfQU1ELCAweEYsIEFOWSwgMjR9LAkJLyogQXRobG9uIDY0LCBPcHRlcm9uICovCi0Je1g4Nl9WRU5ET1JfSU5URUwsIDB4NiwgMHg5LCA4NX0sCS8qIDAuMTN1bSB0b28gKi8KLQl7WDg2X1ZFTkRPUl9JTlRFTCwgMHg2LCAweEIsIDg1fSwJLyogMHhCIFR1YWxhdGluICovCi0Je1g4Nl9WRU5ET1JfSU5URUwsIDB4NiwgQU5ZLCA4Mn0sCS8qIGFueSBQNiAqLwotCXtYODZfVkVORE9SX0lOVEVMLCAweDcsIEFOWSwgMH0sCS8qIEl0YW5pdW0gKi8KLQl7WDg2X1ZFTkRPUl9JTlRFTCwgMHhGLCAweDMsIDEwMH0sCS8qIFA0IFByZXNjb3R0ICovCi0Je1g4Nl9WRU5ET1JfSU5URUwsIDB4RiwgQU5ZLCA5MH0sCS8qIFA0IGJlZm9yZSBQcmVzY290dCAqLwotCXtYODZfVkVORE9SX0lOVEVMLCAweDEwLEFOWSwgMH0sCS8qIEl0YW5pdW0gMiAqLwotCXtYODZfVkVORE9SX1VOS05PV04sIEFOWSwgQU5ZLCAwfQkvKiBzdG9wIGhlcmUgKi8KLQl9OwotCi1zdGF0aWMgaW50IGZpbmRfdnJtKHU4IGVmZl9mYW1pbHksIHU4IGVmZl9tb2RlbCwgdTggdmVuZG9yKQotewotCWludCBpID0gMDsKLQotCXdoaWxlICh2cm1fbW9kZWxzW2ldLnZlbmRvciE9WDg2X1ZFTkRPUl9VTktOT1dOKSB7Ci0JCWlmICh2cm1fbW9kZWxzW2ldLnZlbmRvcj09dmVuZG9yKQotCQkJaWYgKCh2cm1fbW9kZWxzW2ldLmVmZl9mYW1pbHk9PWVmZl9mYW1pbHkpJiYgXAotCQkJKCh2cm1fbW9kZWxzW2ldLmVmZl9tb2RlbD09ZWZmX21vZGVsKXx8IFwKLQkJCSh2cm1fbW9kZWxzW2ldLmVmZl9tb2RlbD09QU5ZKSkpCi0JCQkJcmV0dXJuIHZybV9tb2RlbHNbaV0udnJtX3R5cGU7Ci0JCWkrKzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGkyY193aGljaF92cm0odm9pZCkKLXsKLQlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKLQl1MzIgZWF4OwotCXU4IGVmZl9mYW1pbHksIGVmZl9tb2RlbDsKLQlpbnQgdnJtX3JldDsKLQotCWlmIChjLT54ODYgPCA2KSByZXR1cm4gMDsJLyogYW55IENQVSB3aXRoIGZhbWlsbHkgbG93ZXIgdGhhbiA2Ci0JCQkJIAlkb250IGhhdmUgVklEIGFuZC9vciBDUFVJRCAqLwotCWVheCA9IGNwdWlkX2VheCgxKTsKLQllZmZfZmFtaWx5ID0gKChlYXggJiAweDAwMDAwRjAwKT4+OCk7Ci0JZWZmX21vZGVsICA9ICgoZWF4ICYgMHgwMDAwMDBGMCk+PjQpOwotCWlmIChlZmZfZmFtaWx5ID09IDB4RikgewkvKiB1c2UgZXh0ZW5kZWQgbW9kZWwgJiBmYW1pbHkgKi8KLQkJZWZmX2ZhbWlseSArPSAoKGVheCAmIDB4MDBGMDAwMDApPj4yMCk7Ci0JCWVmZl9tb2RlbCArPSAoKGVheCAmIDB4MDAwRjAwMDApPj4xNik8PDQ7Ci0JfQotCXZybV9yZXQgPSBmaW5kX3ZybShlZmZfZmFtaWx5LGVmZl9tb2RlbCxjLT54ODZfdmVuZG9yKTsKLQlpZiAodnJtX3JldCA9PSAwKQotCQlwcmludGsoS0VSTl9JTkZPICJpMmMtc2Vuc29yLm86IFVua25vd24gVlJNIHZlcnNpb24gb2YgeW91ciIKLQkJIiB4ODYgQ1BVXG4iKTsKLQlyZXR1cm4gdnJtX3JldDsKLX0KLQotLyogYW5kIG5vdyBmb3Igc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZvciBOb24teDg2IHdvcmxkKi8KLSNlbHNlCi1pbnQgaTJjX3doaWNoX3ZybSh2b2lkKQotewotCXByaW50ayhLRVJOX0lORk8gImkyYy1zZW5zb3IubzogVW5rbm93biBWUk0gdmVyc2lvbiBvZiB5b3VyIENQVVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotRVhQT1JUX1NZTUJPTChpMmNfd2hpY2hfdnJtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMgYi9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCmluZGV4IGM5ZDNhMDAuLjIzNGY1ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRpc2suYwpAQCAtNzU0LDcgKzc1NCw3IEBACiAKIAlpZGVkaXNrX3ByZXBhcmVfZmx1c2gocSwgcnEpOwogCi0JcmV0ID0gYmxrX2V4ZWN1dGVfcnEocSwgZGlzaywgcnEpOworCXJldCA9IGJsa19leGVjdXRlX3JxKHEsIGRpc2ssIHJxLCAwKTsKIAogCS8qCiAJICogaWYgd2UgZmFpbGVkIGFuZCBjYWxsZXIgd2FudHMgZXJyb3Igb2Zmc2V0LCBnZXQgaXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1pby5jIGIvZHJpdmVycy9pZGUvaWRlLWlvLmMKaW5kZXggMjQ4ZTNjYy4uOWU5Y2YxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWlvLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogCiAJc3dpdGNoIChycS0+cG0tPnBtX3N0ZXApIHsKIAljYXNlIGlkZV9wbV9mbHVzaF9jYWNoZToJLyogU3VzcGVuZCBzdGVwIDEgKGZsdXNoIGNhY2hlKSBjb21wbGV0ZSAqLwotCQlpZiAocnEtPnBtLT5wbV9zdGF0ZSA9PSA0KQorCQlpZiAocnEtPnBtLT5wbV9zdGF0ZSA9PSBQTV9FVkVOVF9GUkVFWkUpCiAJCQlycS0+cG0tPnBtX3N0ZXAgPSBpZGVfcG1fc3RhdGVfY29tcGxldGVkOwogCQllbHNlCiAJCQlycS0+cG0tPnBtX3N0ZXAgPSBpZGVkaXNrX3BtX3N0YW5kYnk7CkBAIC01NjAsNyArNTYwLDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKF9faWRlX2Fib3J0KTsKIAogLyoqCi0gKglpZGVfYWJvcnQJLQlhYm9ydCBwZW5kaW5nIElERSBvcGVyYXRpbnMKKyAqCWlkZV9hYm9ydAktCWFib3J0IHBlbmRpbmcgSURFIG9wZXJhdGlvbnMKICAqCUBkcml2ZTogZHJpdmUgdGhlIGVycm9yIG9jY3VycmVkIG9uCiAgKglAbXNnOiBtZXNzYWdlIHRvIHJlcG9ydAogICoKQEAgLTYyMyw3ICs2MjMsNyBAQAogICoJQGRyaXZlOiBkcml2ZSB0aGUgY29tcGxldGlvbiBpbnRlcnJ1cHQgb2NjdXJyZWQgb24KICAqCiAgKglkcml2ZV9jbWRfaW50cigpIGlzIGludm9rZWQgb24gY29tcGxldGlvbiBvZiBhIHNwZWNpYWwgRFJJVkVfQ01ELgotICoJV2UgZG8gYW55IG5lY2Vzc2FyeSBkYXlhIHJlYWRpbmcgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIGRyaXZlIHRvCisgKglXZSBkbyBhbnkgbmVjZXNzYXJ5IGRhdGEgcmVhZGluZyBhbmQgdGhlbiB3YWl0IGZvciB0aGUgZHJpdmUgdG8KICAqCWdvIG5vbiBidXN5LiBBdCB0aGF0IHBvaW50IHdlIG1heSByZWFkIHRoZSBlcnJvciBkYXRhIGFuZCBjb21wbGV0ZQogICoJdGhlIHJlcXVlc3QKICAqLwpAQCAtNzczLDcgKzc3Myw3IEBACiAKIC8qKgogICoJZXhlY3V0ZV9kcml2ZV9jb21tYW5kCS0JaXNzdWUgc3BlY2lhbCBkcml2ZSBjb21tYW5kCi0gKglAZHJpdmU6IHRoZSBkcml2ZSB0byBpc3N1ZSB0aCBjb21tYW5kIG9uCisgKglAZHJpdmU6IHRoZSBkcml2ZSB0byBpc3N1ZSB0aGUgY29tbWFuZCBvbgogICoJQHJxOiB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUgaG9sZGluZyB0aGUgY29tbWFuZAogICoKICAqCWV4ZWN1dGVfZHJpdmVfY21kKCkgaXNzdWVzIGEgc3BlY2lhbCBkcml2ZSBjb21tYW5kLCAgdXN1YWxseSAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMgYi9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCmluZGV4IDVhM2RjNDYuLmVlMzhlNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwpAQCAtMjkwMyw4ICsyOTAzLDcgQEAKIAkJfSBlbHNlIGlmICghKHRhcGUtPnNlbnNlX2tleSA9PSAyICYmIHRhcGUtPmFzYyA9PSA0ICYmCiAJCQkgICAgICh0YXBlLT5hc2NxID09IDEgfHwgdGFwZS0+YXNjcSA9PSA4KSkpCiAJCQlyZXR1cm4gLUVJTzsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0gIAkJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKTsKKwkJbXNsZWVwKDEwMCk7CiAJfQogCXJldHVybiAtRUlPOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXRpbWluZy5oIGIvZHJpdmVycy9pZGUvaWRlLXRpbWluZy5oCmluZGV4IGMxMTk2Y2UuLjJmY2ZhYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10aW1pbmcuaAorKysgYi9kcml2ZXJzL2lkZS9pZGUtdGltaW5nLmgKQEAgLTI3LDYgKzI3LDcgQEAKICAqIFZvanRlY2ggUGF2bGlrLCBTaW11bmtvdmEgMTU5NCwgUHJhZ3VlIDgsIDE4MiAwMCBDemVjaCBSZXB1YmxpYwogICovCiAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogCiAjZGVmaW5lIFhGRVJfUElPXzUJCTB4MGQKQEAgLTk2LDExICs5Nyw5IEBACiAjZGVmaW5lIElERV9USU1JTkdfVURNQQkJMHg4MAogI2RlZmluZSBJREVfVElNSU5HX0FMTAkJMHhmZgogCi0jZGVmaW5lIE1JTihhLGIpCSgoYSk8KGIpPyhhKTooYikpCi0jZGVmaW5lIE1BWChhLGIpCSgoYSk+KGIpPyhhKTooYikpCi0jZGVmaW5lIEZJVCh2LG1pbixtYXgpCU1BWChNSU4odixtYXgpLG1pbikKLSNkZWZpbmUgRU5PVUdIKHYsdW5pdCkJKCgodiktMSkvKHVuaXQpKzEpCi0jZGVmaW5lIEVaKHYsdW5pdCkJKCh2KT9FTk9VR0godix1bml0KTowKQorI2RlZmluZSBGSVQodix2bWluLHZtYXgpCW1heF90KHNob3J0LG1pbl90KHNob3J0LHYsdm1heCksdm1pbikKKyNkZWZpbmUgRU5PVUdIKHYsdW5pdCkJCSgoKHYpLTEpLyh1bml0KSsxKQorI2RlZmluZSBFWih2LHVuaXQpCQkoKHYpP0VOT1VHSCh2LHVuaXQpOjApCiAKICNkZWZpbmUgWEZFUl9NT0RFCTB4ZjAKICNkZWZpbmUgWEZFUl9VRE1BXzEzMwkweDQ4CkBAIC0xODgsMTQgKzE4NywxNCBAQAogCiBzdGF0aWMgdm9pZCBpZGVfdGltaW5nX21lcmdlKHN0cnVjdCBpZGVfdGltaW5nICphLCBzdHJ1Y3QgaWRlX3RpbWluZyAqYiwgc3RydWN0IGlkZV90aW1pbmcgKm0sIHVuc2lnbmVkIGludCB3aGF0KQogewotCWlmICh3aGF0ICYgSURFX1RJTUlOR19TRVRVUCAgKSBtLT5zZXR1cCAgID0gTUFYKGEtPnNldHVwLCAgIGItPnNldHVwKTsKLQlpZiAod2hhdCAmIElERV9USU1JTkdfQUNUOEIgICkgbS0+YWN0OGIgICA9IE1BWChhLT5hY3Q4YiwgICBiLT5hY3Q4Yik7Ci0JaWYgKHdoYXQgJiBJREVfVElNSU5HX1JFQzhCICApIG0tPnJlYzhiICAgPSBNQVgoYS0+cmVjOGIsICAgYi0+cmVjOGIpOwotCWlmICh3aGF0ICYgSURFX1RJTUlOR19DWUM4QiAgKSBtLT5jeWM4YiAgID0gTUFYKGEtPmN5YzhiLCAgIGItPmN5YzhiKTsKLQlpZiAod2hhdCAmIElERV9USU1JTkdfQUNUSVZFICkgbS0+YWN0aXZlICA9IE1BWChhLT5hY3RpdmUsICBiLT5hY3RpdmUpOwotCWlmICh3aGF0ICYgSURFX1RJTUlOR19SRUNPVkVSKSBtLT5yZWNvdmVyID0gTUFYKGEtPnJlY292ZXIsIGItPnJlY292ZXIpOwotCWlmICh3aGF0ICYgSURFX1RJTUlOR19DWUNMRSAgKSBtLT5jeWNsZSAgID0gTUFYKGEtPmN5Y2xlLCAgIGItPmN5Y2xlKTsKLQlpZiAod2hhdCAmIElERV9USU1JTkdfVURNQSAgICkgbS0+dWRtYSAgICA9IE1BWChhLT51ZG1hLCAgICBiLT51ZG1hKTsKKwlpZiAod2hhdCAmIElERV9USU1JTkdfU0VUVVAgICkgbS0+c2V0dXAgICA9IG1heChhLT5zZXR1cCwgICBiLT5zZXR1cCk7CisJaWYgKHdoYXQgJiBJREVfVElNSU5HX0FDVDhCICApIG0tPmFjdDhiICAgPSBtYXgoYS0+YWN0OGIsICAgYi0+YWN0OGIpOworCWlmICh3aGF0ICYgSURFX1RJTUlOR19SRUM4QiAgKSBtLT5yZWM4YiAgID0gbWF4KGEtPnJlYzhiLCAgIGItPnJlYzhiKTsKKwlpZiAod2hhdCAmIElERV9USU1JTkdfQ1lDOEIgICkgbS0+Y3ljOGIgICA9IG1heChhLT5jeWM4YiwgICBiLT5jeWM4Yik7CisJaWYgKHdoYXQgJiBJREVfVElNSU5HX0FDVElWRSApIG0tPmFjdGl2ZSAgPSBtYXgoYS0+YWN0aXZlLCAgYi0+YWN0aXZlKTsKKwlpZiAod2hhdCAmIElERV9USU1JTkdfUkVDT1ZFUikgbS0+cmVjb3ZlciA9IG1heChhLT5yZWNvdmVyLCBiLT5yZWNvdmVyKTsKKwlpZiAod2hhdCAmIElERV9USU1JTkdfQ1lDTEUgICkgbS0+Y3ljbGUgICA9IG1heChhLT5jeWNsZSwgICBiLT5jeWNsZSk7CisJaWYgKHdoYXQgJiBJREVfVElNSU5HX1VETUEgICApIG0tPnVkbWEgICAgPSBtYXgoYS0+dWRtYSwgICAgYi0+dWRtYSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaWRlX3RpbWluZyogaWRlX3RpbWluZ19maW5kX21vZGUoc2hvcnQgc3BlZWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUuYyBiL2RyaXZlcnMvaWRlL2lkZS5jCmluZGV4IGRhZTFiZDUuLjczY2E4ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS5jCkBAIC0xMjI5LDcgKzEyMjksNyBAQAogCXJxLnNwZWNpYWwgPSAmYXJnczsKIAlycS5wbSA9ICZycXBtOwogCXJxcG0ucG1fc3RlcCA9IGlkZV9wbV9zdGF0ZV9zdGFydF9zdXNwZW5kOwotCXJxcG0ucG1fc3RhdGUgPSBzdGF0ZTsKKwlycXBtLnBtX3N0YXRlID0gc3RhdGUuZXZlbnQ7CiAKIAlyZXR1cm4gaWRlX2RvX2RyaXZlX2NtZChkcml2ZSwgJnJxLCBpZGVfd2FpdCk7CiB9CkBAIC0xMjQ4LDcgKzEyNDgsNyBAQAogCXJxLnNwZWNpYWwgPSAmYXJnczsKIAlycS5wbSA9ICZycXBtOwogCXJxcG0ucG1fc3RlcCA9IGlkZV9wbV9zdGF0ZV9zdGFydF9yZXN1bWU7Ci0JcnFwbS5wbV9zdGF0ZSA9IDA7CisJcnFwbS5wbV9zdGF0ZSA9IFBNX0VWRU5UX09OOwogCiAJcmV0dXJuIGlkZV9kb19kcml2ZV9jbWQoZHJpdmUsICZycSwgaWRlX2hlYWRfd2FpdCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLWNzLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLWNzLmMKaW5kZXggZjFkMWVjNC4uMGNjZjg1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvbGVnYWN5L2lkZS1jcy5jCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIApAQCAtMzQwLDggKzM0MSw3IEBACiAJCWJyZWFrOwogCSAgICB9CiAJfQotCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXNjaGVkdWxlX3RpbWVvdXQoSFovMTApOworCW1zbGVlcCgxMDApOwogICAgIH0KIAogICAgIGlmIChoZCA8IDApIHsKQEAgLTQ1NCw5ICs0NTQsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBpZGVfaWRzW10gPSB7CiAJUENNQ0lBX0RFVklDRV9GVU5DX0lEKDQpLAogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAzMiwgMHgwNzA0KSwKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwYTQsIDB4MDAyZCksCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgyMDgwLCAweDAwMDEpLAogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDA0NSwgMHgwNDAxKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwOTgsIDB4MDAwMCksCS8qIFRvc2hpYmEgKi8KKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwYTQsIDB4MDAyZCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMGNlLCAweDAwMDApLAkvKiBTYW1zdW5nICovCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgyMDgwLCAweDAwMDEpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4NGUwMSwgMHgwMjAwKSwJLyogTGV4YXIgKi8KIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkNhcmF2ZWxsZSIsICJQU0MtSURFICIsICJQU0MwMDAiLCAweDhjMzYxMzdjLCAweGQwNjkzYWI4LCAweDI3NjhhOWYwKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkNEUk9NIiwgIklERSIsICJNQ0QtNjAxcCIsIDB4MWI5MTc5Y2EsIDB4ZWRlODg5NTEsIDB4MGQ5MDJmNzQpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiUENNQ0lBIiwgIklERSBDQVJEIiwgIkYxIiwgMHgyODFmMWM1ZCwgMHgxOTA3OTYwYywgMHhmN2ZkZThiOSksCkBAIC00ODEsNiArNDg0LDcgQEAKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVE9TSElCQSIsICJNSzIwMDFNUEwiLCAweGI0NTg1YTFhLCAweDM0ODllMDAzKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiV0lUIiwgIklERTE2IiwgMHgyNDRlNTk5NCwgMHgzZTIzMjg1MiksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiU1RJIEZsYXNoIiwgMHhlNGExMzIwOSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlNUSSIsICJGbGFzaCA1LjAiLCAweGJmMmRmMThkLCAweDhjYjU3YTBlKSwKIAlQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIoMSwgIlNhbkRpc2siLCAiQ29ubmVjdFBsdXMiLCAweDdhOTU0YmQ5LCAweDc0YmUwMGM2KSwKIAlQQ01DSUFfREVWSUNFX05VTEwsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2hwdDM2Ni5jIGIvZHJpdmVycy9pZGUvcGNpL2hwdDM2Ni5jCmluZGV4IDdiNjRkYjEuLjEyNzYxOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9ocHQzNjYuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvaHB0MzY2LmMKQEAgLTEzMzQsOSArMTMzNCwxMyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X2hwdDM2NihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQogewogCWludCByZXQgPSAwOwotCS8qIEZJWE1FOiBOb3QgcG9ydGFibGUgKi8KKworCS8qCisJICogRklYTUU6IE5vdCBwb3J0YWJsZS4gQWxzbywgd2h5IGRvIHdlIGVuYWJsZSB0aGUgUk9NIGluIHRoZSBmaXJzdCBwbGFjZT8KKwkgKiBXZSBkb24ndCBzZWVtIHRvIGJlIHVzaW5nIGl0LgorCSAqLwogCWlmIChkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnN0YXJ0KQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfUk9NX0FERFJFU1MsCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsCiAJCQlkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnN0YXJ0IHwgUENJX1JPTV9BRERSRVNTX0VOQUJMRSk7CiAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAoTDFfQ0FDSEVfQllURVMgLyA0KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvc2MxMjAwLmMgYi9kcml2ZXJzL2lkZS9wY2kvc2MxMjAwLmMKaW5kZXggMTA1OTJjZS4uMjRlMjFiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3NjMTIwMC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9zYzEyMDAuYwpAQCAtMzUwLDkgKzM1MCw5IEBACiB7CiAJaWRlX2h3aWZfdAkJKmh3aWYgPSBOVUxMOwogCi0JcHJpbnRrKCJTQzEyMDA6IHN1c3BlbmQoJXUpXG4iLCBzdGF0ZSk7CisJcHJpbnRrKCJTQzEyMDA6IHN1c3BlbmQoJXUpXG4iLCBzdGF0ZS5ldmVudCk7CiAKLQlpZiAoc3RhdGUgPT0gMCkgeworCWlmIChzdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9PTikgewogCQkvLyB3ZSBvbmx5IHNhdmUgc3RhdGUgd2hlbiBnb2luZyBmcm9tIGZ1bGwgcG93ZXIgdG8gbGVzcwogCiAJCS8vCkBAIC0zODYsOCArMzg2LDggQEAKIAkvKiBZb3UgZG9uJ3QgbmVlZCB0byBpdGVyYXRlIG92ZXIgZGlza3MgLS0gc3lzZnMgc2hvdWxkIGhhdmUgZG9uZSB0aGF0IGZvciB5b3UgYWxyZWFkeSAqLyAKIAogCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwotCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LHN0YXRlKTsKLQlkZXYtPmN1cnJlbnRfc3RhdGUgPSBzdGF0ZTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgcGNpX2Nob29zZV9zdGF0ZShkZXYsIHN0YXRlKSk7CisJZGV2LT5jdXJyZW50X3N0YXRlID0gc3RhdGUuZXZlbnQ7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM5Niw4ICszOTYsOCBAQAogCWlkZV9od2lmX3QJKmh3aWYgPSBOVUxMOwogCiBwcmludGsoIlNDMTIwMDogcmVzdW1lXG4iKTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwwKTsJLy8gYnJpbmcgY2hpcCBiYWNrIGZyb20gc2xlZXAgc3RhdGUKLQlkZXYtPmN1cnJlbnRfc3RhdGUgPSAwOworCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBQQ0lfRDApOwkvLyBicmluZyBjaGlwIGJhY2sgZnJvbSBzbGVlcCBzdGF0ZQorCWRldi0+Y3VycmVudF9zdGF0ZSA9IFBNX0VWRU5UX09OOwogCXBjaV9lbmFibGVfZGV2aWNlKGRldik7CiAJLy8KIAkvLyBsb29wIG92ZXIgYWxsIGludGVyZmFjZXMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHBjaSBkZXZpY2U6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wcGMvcG1hYy5jIGIvZHJpdmVycy9pZGUvcHBjL3BtYWMuYwppbmRleCBlYTY1YjA3Li44N2QxZjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wcGMvcG1hYy5jCisrKyBiL2RyaXZlcnMvaWRlL3BwYy9wbWFjLmMKQEAgLTE1MDQsMTIgKzE1MDQsMTIgQEAKIH0KIAogc3RhdGljIGludAotcG1hY19pZGVfbWFjaW9fc3VzcGVuZChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCB1MzIgc3RhdGUpCitwbWFjX2lkZV9tYWNpb19zdXNwZW5kKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlpZGVfaHdpZl90CSpod2lmID0gKGlkZV9od2lmX3QgKilkZXZfZ2V0X2RydmRhdGEoJm1kZXYtPm9mZGV2LmRldik7CiAJaW50CQlyYyA9IDA7CiAKLQlpZiAoc3RhdGUgIT0gbWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlICYmIHN0YXRlID49IDIpIHsKKwlpZiAoc3RhdGUuZXZlbnQgIT0gbWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ICYmIHN0YXRlLmV2ZW50ID49IFBNX0VWRU5UX1NVU1BFTkQpIHsKIAkJcmMgPSBwbWFjX2lkZV9kb19zdXNwZW5kKGh3aWYpOwogCQlpZiAocmMgPT0gMCkKIAkJCW1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOwpAQCAtMTUyNCwxMCArMTUyNCwxMCBAQAogCWlkZV9od2lmX3QJKmh3aWYgPSAoaWRlX2h3aWZfdCAqKWRldl9nZXRfZHJ2ZGF0YSgmbWRldi0+b2ZkZXYuZGV2KTsKIAlpbnQJCXJjID0gMDsKIAkKLQlpZiAobWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlICE9IDApIHsKKwlpZiAobWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ICE9IFBNX0VWRU5UX09OKSB7CiAJCXJjID0gcG1hY19pZGVfZG9fcmVzdW1lKGh3aWYpOwogCQlpZiAocmMgPT0gMCkKLQkJCW1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IDA7CisJCQltZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCX0KIAogCXJldHVybiByYzsKQEAgLTE2MDgsMTIgKzE2MDgsMTIgQEAKIH0KIAogc3RhdGljIGludAotcG1hY19pZGVfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3BtYWNfaWRlX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJaWRlX2h3aWZfdAkqaHdpZiA9IChpZGVfaHdpZl90ICopcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWludAkJcmMgPSAwOwogCQotCWlmIChzdGF0ZSAhPSBwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgJiYgc3RhdGUgPj0gMikgeworCWlmIChzdGF0ZS5ldmVudCAhPSBwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgJiYgc3RhdGUuZXZlbnQgPj0gMikgewogCQlyYyA9IHBtYWNfaWRlX2RvX3N1c3BlbmQoaHdpZik7CiAJCWlmIChyYyA9PSAwKQogCQkJcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CkBAIC0xNjI4LDEwICsxNjI4LDEwIEBACiAJaWRlX2h3aWZfdAkqaHdpZiA9IChpZGVfaHdpZl90ICopcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWludAkJcmMgPSAwOwogCQotCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgIT0gMCkgeworCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgIT0gUE1fRVZFTlRfT04pIHsKIAkJcmMgPSBwbWFjX2lkZV9kb19yZXN1bWUoaHdpZik7CiAJCWlmIChyYyA9PSAwKQotCQkJcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gMDsKKwkJCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJfQogCiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwppbmRleCBiZWJjYzQ3Li5iMjMzMjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwpAQCAtMTA2OCw2ICsxMDY4LDggQEAKIAlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkOwogCWludCBpID0gMDsKIAlpbnQgbGVuZ3RoID0gMDsKKwkvKiBpZWVlMTM5NDp2ZW5ObW9Oc3BOdmVyTiAqLworCWNoYXIgYnVmWzggKyAxICsgMyArIDggKyAyICsgOCArIDIgKyA4ICsgMyArIDggKyAxXTsKIAogCWlmICghY2RldikKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xMDk0LDYgKzEwOTYsMTIgQEAKIAlQVVRfRU5WUCgiR1VJRD0lMDE2THgiLCAodW5zaWduZWQgbG9uZyBsb25nKXVkLT5uZS0+Z3VpZCk7CiAJUFVUX0VOVlAoIlNQRUNJRklFUl9JRD0lMDZ4IiwgdWQtPnNwZWNpZmllcl9pZCk7CiAJUFVUX0VOVlAoIlZFUlNJT049JTA2eCIsIHVkLT52ZXJzaW9uKTsKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiaWVlZTEzOTQ6dmVuJTA4WG1vJTA4WHNwJTA4WHZlciUwOFgiLAorCQkJdWQtPnZlbmRvcl9pZCwKKwkJCXVkLT5tb2RlbF9pZCwKKwkJCXVkLT5zcGVjaWZpZXJfaWQsCisJCQl1ZC0+dmVyc2lvbik7CisJUFVUX0VOVlAoIk1PREFMSUFTPSVzIiwgYnVmKTsKIAogI3VuZGVmIFBVVF9FTlZQCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jIGIvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMKaW5kZXggMzYwNzRlNi4uNmIxYWI4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMKQEAgLTE0NjQsMjYgKzE0NjQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4NTAsIEkyQ19NX1JELCAyMCwgKHVuc2lnbmVkIGNoYXIqKSBseW54LT5idXNfaW5mb19ibG9jayB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogCi0KLSNpZmRlZiBDT05GSUdfSUVFRTEzOTRfVkVSQk9TRURFQlVHCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaTJjX3NtYnVzX3hmZXIoaTJjX2FkLCA4MCwgMCwgSTJDX1NNQlVTX1dSSVRFLCAwLCBJMkNfU01CVVNfQllURSxOVUxMKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9FUlIsIGx5bngtPmlkLCJlZXByb20gcmVhZCBzdGFydCBoYXMgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBhZGRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGFkZHI9MHgwMDsgYWRkciA8IDB4MTAwOyBhZGRyKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaTJjX3NtYnVzX3hmZXIoaTJjX2FkLCA4MCwgMCwgSTJDX1NNQlVTX1JFQUQsIDAsIEkyQ19TTUJVU19CWVRFLCYgZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fRVJSLCBseW54LT5pZCwgInVuYWJsZSB0byByZWFkIGkyYyAleCIsIGFkZHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fREVCVUcsIGx5bngtPmlkLCJnb3Qgc2VyaWFsIGVlcHJvbSBkYXRhIGF0ICV4OiAleCIsYWRkciwgZGF0YS5ieXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHVzZSBpMmNfdHJhbnNmZXIsIGJlY2F1c2UgaTJjX3NtYnVzX3JlYWRfYmxvY2tfZGF0YSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IGFuZCB3ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gaXQgbW9yZSBlZmZpY2llbnRseSBpbiBvbmUgdHJhbnNhY3Rpb24gcmF0aGVyIHRoZW4gdXNpbmcgc2V2ZXJhbCByZWFkcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkyY190cmFuc2ZlcihpMmNfYWQsIG1zZywgMikgPCAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC92aWRlbzEzOTQuYwppbmRleCAwNjc1OWIzLi45ZDZmYWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvdmlkZW8xMzk0LmMKQEAgLTg4Myw3ICs4ODMsNyBAQAogCQkJICAgICAgdi5jaGFubmVsKTsKIAkJfQogCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZ2LCBzaXplb2YodikpKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnYsIHNpemVvZih2KSkpIHsKIAkJCS8qIEZJWE1FIDogZnJlZSBhbGxvY2F0ZWQgZG1hIHJlc291cmNlcyAqLwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnIGIvZHJpdmVycy9pbmZpbmliYW5kL0tjb25maWcKaW5kZXggMzJjZGZiMy4uMzI1ZDUwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL0tjb25maWcKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL0tjb25maWcKQEAgLTgsMTUgKzgsMjYgQEAKIAkgIGFueSBwcm90b2NvbHMgeW91IHdpc2ggdG8gdXNlIGFzIHdlbGwgYXMgZHJpdmVycyBmb3IgeW91cgogCSAgSW5maW5pQmFuZCBoYXJkd2FyZS4KIAotY29uZmlnIElORklOSUJBTkRfVVNFUl9WRVJCUwotCXRyaXN0YXRlICJJbmZpbmlCYW5kIHVzZXJzcGFjZSB2ZXJicyBzdXBwb3J0IgorY29uZmlnIElORklOSUJBTkRfVVNFUl9NQUQKKwl0cmlzdGF0ZSAiSW5maW5pQmFuZCB1c2Vyc3BhY2UgTUFEIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJTkZJTklCQU5ECiAJLS0taGVscC0tLQotCSAgVXNlcnNwYWNlIEluZmluaUJhbmQgdmVyYnMgc3VwcG9ydC4gIFRoaXMgaXMgdGhlIGtlcm5lbCBzaWRlCi0JICBvZiB1c2Vyc3BhY2UgdmVyYnMsIHdoaWNoIGFsbG93cyB1c2Vyc3BhY2UgcHJvY2Vzc2VzIHRvCi0JICBkaXJlY3RseSBhY2Nlc3MgSW5maW5pQmFuZCBoYXJkd2FyZSBmb3IgZmFzdC1wYXRoCi0JICBvcGVyYXRpb25zLiAgWW91IHdpbGwgYWxzbyBuZWVkIGxpYmlidmVyYnMgYW5kIGEgaGFyZHdhcmUKLQkgIGRyaXZlciBsaWJyYXJ5IGZyb20gPGh0dHA6Ly93d3cub3BlbmliLm9yZz4uCisJICBVc2Vyc3BhY2UgSW5maW5pQmFuZCBNYW5hZ2VtZW50IERhdGFncmFtIChNQUQpIHN1cHBvcnQuICBUaGlzCisJICBpcyB0aGUga2VybmVsIHNpZGUgb2YgdGhlIHVzZXJzcGFjZSBNQUQgc3VwcG9ydCwgd2hpY2ggYWxsb3dzCisJICB1c2Vyc3BhY2UgcHJvY2Vzc2VzIHRvIHNlbmQgYW5kIHJlY2VpdmUgTUFEcy4gWW91IHdpbGwgYWxzbyAKKwkgIG5lZWQgbGliaWJ1bWFkIGZyb20gPGh0dHA6Ly93d3cub3BlbmliLm9yZz4uCisKK2NvbmZpZyBJTkZJTklCQU5EX1VTRVJfQUNDRVNTCisJdHJpc3RhdGUgIkluZmluaUJhbmQgdXNlcnNwYWNlIGFjY2VzcyAodmVyYnMgYW5kIENNKSIKKwlkZXBlbmRzIG9uIElORklOSUJBTkQKKwktLS1oZWxwLS0tCisJICBVc2Vyc3BhY2UgSW5maW5pQmFuZCBhY2Nlc3Mgc3VwcG9ydC4gIFRoaXMgZW5hYmxlcyB0aGUKKwkgIGtlcm5lbCBzaWRlIG9mIHVzZXJzcGFjZSB2ZXJicyBhbmQgdGhlIHVzZXJzcGFjZQorCSAgY29tbXVuaWNhdGlvbiBtYW5hZ2VyIChDTSkuICBUaGlzIGFsbG93cyB1c2Vyc3BhY2UgcHJvY2Vzc2VzCisJICB0byBzZXQgdXAgY29ubmVjdGlvbnMgYW5kIGRpcmVjdGx5IGFjY2VzcyBJbmZpbmlCYW5kCisJICBoYXJkd2FyZSBmb3IgZmFzdC1wYXRoIG9wZXJhdGlvbnMuICBZb3Ugd2lsbCBhbHNvIG5lZWQKKwkgIGxpYmlidmVyYnMsIGxpYmliY20gYW5kIGEgaGFyZHdhcmUgZHJpdmVyIGxpYnJhcnkgZnJvbQorCSAgPGh0dHA6Ly93d3cub3BlbmliLm9yZz4uCiAKIHNvdXJjZSAiZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL01ha2VmaWxlIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvTWFrZWZpbGUKaW5kZXggNjc4YTdlMC4uZWMzMzUzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvTWFrZWZpbGUKQEAgLTEsNiArMSw3IEBACiBvYmotJChDT05GSUdfSU5GSU5JQkFORCkgKz0JCWliX2NvcmUubyBpYl9tYWQubyBpYl9zYS5vIFwKLQkJCQkJaWJfY20ubyBpYl91bWFkLm8gaWJfdWNtLm8KLW9iai0kKENPTkZJR19JTkZJTklCQU5EX1VTRVJfVkVSQlMpICs9CWliX3V2ZXJicy5vCisJCQkJCWliX2NtLm8KK29iai0kKENPTkZJR19JTkZJTklCQU5EX1VTRVJfTUFEKSArPQlpYl91bWFkLm8KK29iai0kKENPTkZJR19JTkZJTklCQU5EX1VTRVJfQUNDRVNTKSArPQlpYl91dmVyYnMubyBpYl91Y20ubwogCiBpYl9jb3JlLXkgOj0JCQlwYWNrZXIubyB1ZF9oZWFkZXIubyB2ZXJicy5vIHN5c2ZzLm8gXAogCQkJCWRldmljZS5vIGZtcl9wb29sLm8gY2FjaGUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtLmMKaW5kZXggNGRlOTNiYS4uNTRkYjZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbS5jCkBAIC0xNzMsNyArMTczLDggQEAKIAlpZiAoSVNfRVJSKGFoKSkKIAkJcmV0dXJuIFBUUl9FUlIoYWgpOwogCi0JbSA9IGliX2NyZWF0ZV9zZW5kX21hZChtYWRfYWdlbnQsIDEsIGNtX2lkX3ByaXYtPmF2LnBrZXlfaW5kZXgsCisJbSA9IGliX2NyZWF0ZV9zZW5kX21hZChtYWRfYWdlbnQsIGNtX2lkX3ByaXYtPmlkLnJlbW90ZV9jbV9xcG4sIAorCQkJICAgICAgIGNtX2lkX3ByaXYtPmF2LnBrZXlfaW5kZXgsCiAJCQkgICAgICAgYWgsIDAsIHNpemVvZihzdHJ1Y3QgaWJfbWFkX2hkciksCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpYl9tYWQpLXNpemVvZihzdHJ1Y3QgaWJfbWFkX2hkciksCiAJCQkgICAgICAgR0ZQX0FUT01JQyk7CkBAIC01MzYsNiArNTM3LDcgQEAKIAljbV9pZF9wcml2LT5pZC5zdGF0ZSA9IElCX0NNX0lETEU7CiAJY21faWRfcHJpdi0+aWQuY21faGFuZGxlciA9IGNtX2hhbmRsZXI7CiAJY21faWRfcHJpdi0+aWQuY29udGV4dCA9IGNvbnRleHQ7CisJY21faWRfcHJpdi0+aWQucmVtb3RlX2NtX3FwbiA9IDE7CiAJcmV0ID0gY21fYWxsb2NfaWQoY21faWRfcHJpdik7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcjsKQEAgLTEzMTMsNiArMTMxNSw3IEBACiAJY21fZGVyZWZfaWQobGlzdGVuX2NtX2lkX3ByaXYpOwogCWNtX2NsZWFudXBfdGltZXdhaXQoY21faWRfcHJpdi0+dGltZXdhaXRfaW5mbyk7CiBlcnJvcjI6CWtmcmVlKGNtX2lkX3ByaXYtPnRpbWV3YWl0X2luZm8pOworCWNtX2lkX3ByaXYtPnRpbWV3YWl0X2luZm8gPSBOVUxMOwogZXJyb3IxOglpYl9kZXN0cm95X2NtX2lkKCZjbV9pZF9wcml2LT5pZCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZF9ybXBwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWRfcm1wcC5jCmluZGV4IDQzZmQ4MDUuLjJiZDhiMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZF9ybXBwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkX3JtcHAuYwpAQCAtNTkzLDcgKzU5Myw4IEBACiAJCXJtcHBfbWFkLT5ybXBwX2hkci5wYXlsZW5fbmV3d2luID0KIAkJCWNwdV90b19iZTMyKG1hZF9zZW5kX3dyLT50b3RhbF9zZWcgKgogCQkJCSAgICAoc2l6ZW9mKHN0cnVjdCBpYl9ybXBwX21hZCkgLQotCQkJCSAgICAgICBvZmZzZXRvZihzdHJ1Y3QgaWJfcm1wcF9tYWQsIGRhdGEpKSk7CisJCQkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBpYl9ybXBwX21hZCwgZGF0YSkpIC0KKwkJCQkgICAgbWFkX3NlbmRfd3ItPnBhZCk7CiAJCW1hZF9zZW5kX3dyLT5zZ19saXN0WzBdLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaWJfcm1wcF9tYWQpOwogCX0gZWxzZSB7CiAJCW1hZF9zZW5kX3dyLT5zZW5kX3dyLm51bV9zZ2UgPSAyOwpAQCAtNjAyLDYgKzYwMyw3IEBACiAJCW1hZF9zZW5kX3dyLT5zZ19saXN0WzFdLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaWJfcm1wcF9tYWQpIC0KIAkJCQkJCSBtYWRfc2VuZF93ci0+ZGF0YV9vZmZzZXQ7CiAJCW1hZF9zZW5kX3dyLT5zZ19saXN0WzFdLmxrZXkgPSBtYWRfc2VuZF93ci0+c2dfbGlzdFswXS5sa2V5OworCQlybXBwX21hZC0+cm1wcF9oZHIucGF5bGVuX25ld3dpbiA9IDA7CiAJfQogCiAJaWYgKG1hZF9zZW5kX3dyLT5zZWdfbnVtID09IG1hZF9zZW5kX3dyLT50b3RhbF9zZWcpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3NhX3F1ZXJ5LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zYV9xdWVyeS5jCmluZGV4IDEyNmFjODAuLjc4ZGUyZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3NhX3F1ZXJ5LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc2FfcXVlcnkuYwpAQCAtMTEzLDMyICsxMTMsNiBAQAogc3RhdGljIHNwaW5sb2NrX3QgdGlkX2xvY2s7CiBzdGF0aWMgdTMyIHRpZDsKIAotZW51bSB7Ci0JSUJfU0FfQVRUUl9DTEFTU19QT1JUSU5GTyAgICA9IDB4MDEsCi0JSUJfU0FfQVRUUl9OT1RJQ0UJICAgICA9IDB4MDIsCi0JSUJfU0FfQVRUUl9JTkZPUk1fSU5GTwkgICAgID0gMHgwMywKLQlJQl9TQV9BVFRSX05PREVfUkVDCSAgICAgPSAweDExLAotCUlCX1NBX0FUVFJfUE9SVF9JTkZPX1JFQyAgICAgPSAweDEyLAotCUlCX1NBX0FUVFJfU0wyVkxfUkVDCSAgICAgPSAweDEzLAotCUlCX1NBX0FUVFJfU1dJVENIX1JFQwkgICAgID0gMHgxNCwKLQlJQl9TQV9BVFRSX0xJTkVBUl9GREJfUkVDICAgID0gMHgxNSwKLQlJQl9TQV9BVFRSX1JBTkRPTV9GREJfUkVDICAgID0gMHgxNiwKLQlJQl9TQV9BVFRSX01DQVNUX0ZEQl9SRUMgICAgID0gMHgxNywKLQlJQl9TQV9BVFRSX1NNX0lORk9fUkVDCSAgICAgPSAweDE4LAotCUlCX1NBX0FUVFJfTElOS19SRUMJICAgICA9IDB4MjAsCi0JSUJfU0FfQVRUUl9HVUlEX0lORk9fUkVDICAgICA9IDB4MzAsCi0JSUJfU0FfQVRUUl9TRVJWSUNFX1JFQwkgICAgID0gMHgzMSwKLQlJQl9TQV9BVFRSX1BBUlRJVElPTl9SRUMgICAgID0gMHgzMywKLQlJQl9TQV9BVFRSX1JBTkdFX1JFQwkgICAgID0gMHgzNCwKLQlJQl9TQV9BVFRSX1BBVEhfUkVDCSAgICAgPSAweDM1LAotCUlCX1NBX0FUVFJfVkxfQVJCX1JFQwkgICAgID0gMHgzNiwKLQlJQl9TQV9BVFRSX01DX0dST1VQX1JFQwkgICAgID0gMHgzNywKLQlJQl9TQV9BVFRSX01DX01FTUJFUl9SRUMgICAgID0gMHgzOCwKLQlJQl9TQV9BVFRSX1RSQUNFX1JFQwkgICAgID0gMHgzOSwKLQlJQl9TQV9BVFRSX01VTFRJX1BBVEhfUkVDICAgID0gMHgzYSwKLQlJQl9TQV9BVFRSX1NFUlZJQ0VfQVNTT0NfUkVDID0gMHgzYgotfTsKLQogI2RlZmluZSBQQVRIX1JFQ19GSUVMRChmaWVsZCkgXAogCS5zdHJ1Y3Rfb2Zmc2V0X2J5dGVzID0gb2Zmc2V0b2Yoc3RydWN0IGliX3NhX3BhdGhfcmVjLCBmaWVsZCksCQlcCiAJLnN0cnVjdF9zaXplX2J5dGVzICAgPSBzaXplb2YgKChzdHJ1Y3QgaWJfc2FfcGF0aF9yZWMgKikgMCktPmZpZWxkLAlcCkBAIC00MzEsOCArNDA1LDggQEAKIAkgICAgZXZlbnQtPmV2ZW50ID09IElCX0VWRU5UX0xJRF9DSEFOR0UgIHx8CiAJICAgIGV2ZW50LT5ldmVudCA9PSBJQl9FVkVOVF9QS0VZX0NIQU5HRSB8fAogCSAgICBldmVudC0+ZXZlbnQgPT0gSUJfRVZFTlRfU01fQ0hBTkdFKSB7Ci0JCXN0cnVjdCBpYl9zYV9kZXZpY2UgKnNhX2RldiA9Ci0JCQlpYl9nZXRfY2xpZW50X2RhdGEoZXZlbnQtPmRldmljZSwgJnNhX2NsaWVudCk7CisJCXN0cnVjdCBpYl9zYV9kZXZpY2UgKnNhX2RldjsKKwkJc2FfZGV2ID0gY29udGFpbmVyX29mKGhhbmRsZXIsIHR5cGVvZigqc2FfZGV2KSwgZXZlbnRfaGFuZGxlcik7CiAKIAkJc2NoZWR1bGVfd29yaygmc2FfZGV2LT5wb3J0W2V2ZW50LT5lbGVtZW50LnBvcnRfbnVtIC0KIAkJCQkJICAgIHNhX2Rldi0+c3RhcnRfcG9ydF0udXBkYXRlX3Rhc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMKaW5kZXggZmFlMWMyZC4uMjExYmEzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCkBAIC00NjMsNyArNDYzLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJZWxlbWVudCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwb3J0X3RhYmxlX2F0dHJpYnV0ZSksCisJCWVsZW1lbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG9ydF90YWJsZV9hdHRyaWJ1dGUpLAogCQkJCSAgR0ZQX0tFUk5FTCk7CiAJCWlmICghZWxlbWVudCkKIAkJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYwppbmRleCA3OTU5NTgyLi5kMGYwYjBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYwpAQCAtNzIsNyArNzIsNiBAQAogCiBzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBjdHhfaWRfbXV0ZXg7CiBzdGF0aWMgc3RydWN0IGlkciAgICAgICBjdHhfaWRfdGFibGU7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBjdHhfaWRfcm92ZXIgPSAwOwogCiBzdGF0aWMgc3RydWN0IGliX3VjbV9jb250ZXh0ICppYl91Y21fY3R4X2dldChzdHJ1Y3QgaWJfdWNtX2ZpbGUgKmZpbGUsIGludCBpZCkKIHsKQEAgLTk3LDMzICs5NiwxNiBAQAogCQl3YWtlX3VwKCZjdHgtPndhaXQpOwogfQogCi1zdGF0aWMgc3NpemVfdCBpYl91Y21fZGVzdHJveV9jdHgoc3RydWN0IGliX3VjbV9maWxlICpmaWxlLCBpbnQgaWQpCitzdGF0aWMgaW5saW5lIGludCBpYl91Y21fbmV3X2NtX2lkKGludCBldmVudCkKIHsKLQlzdHJ1Y3QgaWJfdWNtX2NvbnRleHQgKmN0eDsKKwlyZXR1cm4gZXZlbnQgPT0gSUJfQ01fUkVRX1JFQ0VJVkVEIHx8IGV2ZW50ID09IElCX0NNX1NJRFJfUkVRX1JFQ0VJVkVEOworfQorCitzdGF0aWMgdm9pZCBpYl91Y21fY2xlYW51cF9ldmVudHMoc3RydWN0IGliX3VjbV9jb250ZXh0ICpjdHgpCit7CiAJc3RydWN0IGliX3VjbV9ldmVudCAqdWV2ZW50OwogCi0JZG93bigmY3R4X2lkX211dGV4KTsKLQljdHggPSBpZHJfZmluZCgmY3R4X2lkX3RhYmxlLCBpZCk7Ci0JaWYgKCFjdHgpCi0JCWN0eCA9IEVSUl9QVFIoLUVOT0VOVCk7Ci0JZWxzZSBpZiAoY3R4LT5maWxlICE9IGZpbGUpCi0JCWN0eCA9IEVSUl9QVFIoLUVJTlZBTCk7Ci0JZWxzZQotCQlpZHJfcmVtb3ZlKCZjdHhfaWRfdGFibGUsIGN0eC0+aWQpOwotCXVwKCZjdHhfaWRfbXV0ZXgpOwotCi0JaWYgKElTX0VSUihjdHgpKQotCQlyZXR1cm4gUFRSX0VSUihjdHgpOwotCi0JYXRvbWljX2RlYygmY3R4LT5yZWYpOwotCXdhaXRfZXZlbnQoY3R4LT53YWl0LCAhYXRvbWljX3JlYWQoJmN0eC0+cmVmKSk7Ci0KLQkvKiBObyBuZXcgZXZlbnRzIHdpbGwgYmUgZ2VuZXJhdGVkIGFmdGVyIGRlc3Ryb3lpbmcgdGhlIGNtX2lkLiAqLwotCWlmICghSVNfRVJSKGN0eC0+Y21faWQpKQotCQlpYl9kZXN0cm95X2NtX2lkKGN0eC0+Y21faWQpOwotCi0JLyogQ2xlYW51cCBldmVudHMgbm90IHlldCByZXBvcnRlZCB0byB0aGUgdXNlci4gKi8KLQlkb3duKCZmaWxlLT5tdXRleCk7CisJZG93bigmY3R4LT5maWxlLT5tdXRleCk7CiAJbGlzdF9kZWwoJmN0eC0+ZmlsZV9saXN0KTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmN0eC0+ZXZlbnRzKSkgewogCkBAIC0xMzMsMTUgKzExNSwxMiBAQAogCQlsaXN0X2RlbCgmdWV2ZW50LT5jdHhfbGlzdCk7CiAKIAkJLyogY2xlYXIgaW5jb21pbmcgY29ubmVjdGlvbnMuICovCi0JCWlmICh1ZXZlbnQtPmNtX2lkKQorCQlpZiAoaWJfdWNtX25ld19jbV9pZCh1ZXZlbnQtPnJlc3AuZXZlbnQpKQogCQkJaWJfZGVzdHJveV9jbV9pZCh1ZXZlbnQtPmNtX2lkKTsKIAogCQlrZnJlZSh1ZXZlbnQpOwogCX0KLQl1cCgmZmlsZS0+bXV0ZXgpOwotCi0Ja2ZyZWUoY3R4KTsKLQlyZXR1cm4gMDsKKwl1cCgmY3R4LT5maWxlLT5tdXRleCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaWJfdWNtX2NvbnRleHQgKmliX3VjbV9jdHhfYWxsb2Moc3RydWN0IGliX3VjbV9maWxlICpmaWxlKQpAQCAtMTUzLDM2ICsxMzIsMzEgQEAKIAlpZiAoIWN0eCkKIAkJcmV0dXJuIE5VTEw7CiAKKwltZW1zZXQoY3R4LCAwLCBzaXplb2YgKmN0eCk7CiAJYXRvbWljX3NldCgmY3R4LT5yZWYsIDEpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+d2FpdCk7CiAJY3R4LT5maWxlID0gZmlsZTsKLQogCUlOSVRfTElTVF9IRUFEKCZjdHgtPmV2ZW50cyk7CiAKLQlsaXN0X2FkZF90YWlsKCZjdHgtPmZpbGVfbGlzdCwgJmZpbGUtPmN0eHMpOworCWRvIHsKKwkJcmVzdWx0ID0gaWRyX3ByZV9nZXQoJmN0eF9pZF90YWJsZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmVzdWx0KQorCQkJZ290byBlcnJvcjsKIAotCWN0eF9pZF9yb3ZlciA9IChjdHhfaWRfcm92ZXIgKyAxKSAmIElOVF9NQVg7Ci1yZXRyeToKLQlyZXN1bHQgPSBpZHJfcHJlX2dldCgmY3R4X2lkX3RhYmxlLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJlc3VsdCkKLQkJZ290byBlcnJvcjsKKwkJZG93bigmY3R4X2lkX211dGV4KTsKKwkJcmVzdWx0ID0gaWRyX2dldF9uZXcoJmN0eF9pZF90YWJsZSwgY3R4LCAmY3R4LT5pZCk7CisJCXVwKCZjdHhfaWRfbXV0ZXgpOworCX0gd2hpbGUgKHJlc3VsdCA9PSAtRUFHQUlOKTsKIAotCWRvd24oJmN0eF9pZF9tdXRleCk7Ci0JcmVzdWx0ID0gaWRyX2dldF9uZXdfYWJvdmUoJmN0eF9pZF90YWJsZSwgY3R4LCBjdHhfaWRfcm92ZXIsICZjdHgtPmlkKTsKLQl1cCgmY3R4X2lkX211dGV4KTsKLQotCWlmIChyZXN1bHQgPT0gLUVBR0FJTikKLQkJZ290byByZXRyeTsKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVycm9yOwogCisJbGlzdF9hZGRfdGFpbCgmY3R4LT5maWxlX2xpc3QsICZmaWxlLT5jdHhzKTsKIAl1Y21fZGJnKCJBbGxvY2F0ZWQgQ00gSUQgPCVkPlxuIiwgY3R4LT5pZCk7Ci0KIAlyZXR1cm4gY3R4OwotZXJyb3I6Ci0JbGlzdF9kZWwoJmN0eC0+ZmlsZV9saXN0KTsKLQlrZnJlZShjdHgpOwogCitlcnJvcjoKKwlrZnJlZShjdHgpOwogCXJldHVybiBOVUxMOwogfQogLyoKQEAgLTIxOSwxMiArMTkzLDkgQEAKIAkJa3BhdGgtPnBhY2tldF9saWZlX3RpbWVfc2VsZWN0b3I7CiB9CiAKLXN0YXRpYyB2b2lkIGliX3VjbV9ldmVudF9yZXFfZ2V0KHN0cnVjdCBpYl91Y21fY29udGV4dCAqY3R4LAotCQkJCSBzdHJ1Y3QgaWJfdWNtX3JlcV9ldmVudF9yZXNwICp1cmVxLAorc3RhdGljIHZvaWQgaWJfdWNtX2V2ZW50X3JlcV9nZXQoc3RydWN0IGliX3VjbV9yZXFfZXZlbnRfcmVzcCAqdXJlcSwKIAkJCQkgc3RydWN0IGliX2NtX3JlcV9ldmVudF9wYXJhbSAqa3JlcSkKIHsKLQl1cmVxLT5saXN0ZW5faWQgPSBjdHgtPmlkOwotCiAJdXJlcS0+cmVtb3RlX2NhX2d1aWQgICAgICAgICAgICAgPSBrcmVxLT5yZW1vdGVfY2FfZ3VpZDsKIAl1cmVxLT5yZW1vdGVfcWtleSAgICAgICAgICAgICAgICA9IGtyZXEtPnJlbW90ZV9xa2V5OwogCXVyZXEtPnJlbW90ZV9xcG4gICAgICAgICAgICAgICAgID0ga3JlcS0+cmVtb3RlX3FwbjsKQEAgLTI1OSwxNCArMjMwLDYgQEAKIAl1cmVwLT5zcnEgICAgICAgICAgICAgICAgID0ga3JlcC0+c3JxOwogfQogCi1zdGF0aWMgdm9pZCBpYl91Y21fZXZlbnRfc2lkcl9yZXFfZ2V0KHN0cnVjdCBpYl91Y21fY29udGV4dCAqY3R4LAotCQkJCSAgICAgIHN0cnVjdCBpYl91Y21fc2lkcl9yZXFfZXZlbnRfcmVzcCAqdXJlcSwKLQkJCQkgICAgICBzdHJ1Y3QgaWJfY21fc2lkcl9yZXFfZXZlbnRfcGFyYW0gKmtyZXEpCi17Ci0JdXJlcS0+bGlzdGVuX2lkID0gY3R4LT5pZDsKLQl1cmVxLT5wa2V5ICAgICAgPSBrcmVxLT5wa2V5OwotfQotCiBzdGF0aWMgdm9pZCBpYl91Y21fZXZlbnRfc2lkcl9yZXBfZ2V0KHN0cnVjdCBpYl91Y21fc2lkcl9yZXBfZXZlbnRfcmVzcCAqdXJlcCwKIAkJCQkgICAgICBzdHJ1Y3QgaWJfY21fc2lkcl9yZXBfZXZlbnRfcGFyYW0gKmtyZXApCiB7CkBAIC0yNzUsMTUgKzIzOCwxNCBAQAogCXVyZXAtPnFwbiAgICA9IGtyZXAtPnFwbjsKIH07CiAKLXN0YXRpYyBpbnQgaWJfdWNtX2V2ZW50X3Byb2Nlc3Moc3RydWN0IGliX3VjbV9jb250ZXh0ICpjdHgsCi0JCQkJc3RydWN0IGliX2NtX2V2ZW50ICpldnQsCitzdGF0aWMgaW50IGliX3VjbV9ldmVudF9wcm9jZXNzKHN0cnVjdCBpYl9jbV9ldmVudCAqZXZ0LAogCQkJCXN0cnVjdCBpYl91Y21fZXZlbnQgKnV2dCkKIHsKIAl2b2lkICppbmZvID0gTlVMTDsKIAogCXN3aXRjaCAoZXZ0LT5ldmVudCkgewogCWNhc2UgSUJfQ01fUkVRX1JFQ0VJVkVEOgotCQlpYl91Y21fZXZlbnRfcmVxX2dldChjdHgsICZ1dnQtPnJlc3AudS5yZXFfcmVzcCwKKwkJaWJfdWNtX2V2ZW50X3JlcV9nZXQoJnV2dC0+cmVzcC51LnJlcV9yZXNwLAogCQkJCSAgICAgJmV2dC0+cGFyYW0ucmVxX3JjdmQpOwogCQl1dnQtPmRhdGFfbGVuICAgICAgPSBJQl9DTV9SRVFfUFJJVkFURV9EQVRBX1NJWkU7CiAJCXV2dC0+cmVzcC5wcmVzZW50ICA9IElCX1VDTV9QUkVTX1BSSU1BUlk7CkBAIC0zMzEsOCArMjkzLDggQEAKIAkJaW5mbwkgICAgICA9IGV2dC0+cGFyYW0uYXByX3JjdmQuYXByX2luZm87CiAJCWJyZWFrOwogCWNhc2UgSUJfQ01fU0lEUl9SRVFfUkVDRUlWRUQ6Ci0JCWliX3VjbV9ldmVudF9zaWRyX3JlcV9nZXQoY3R4LCAmdXZ0LT5yZXNwLnUuc2lkcl9yZXFfcmVzcCwKLQkJCQkJICAmZXZ0LT5wYXJhbS5zaWRyX3JlcV9yY3ZkKTsKKwkJdXZ0LT5yZXNwLnUuc2lkcl9yZXFfcmVzcC5wa2V5ID0gCisJCQkJCWV2dC0+cGFyYW0uc2lkcl9yZXFfcmN2ZC5wa2V5OwogCQl1dnQtPmRhdGFfbGVuID0gSUJfQ01fU0lEUl9SRVFfUFJJVkFURV9EQVRBX1NJWkU7CiAJCWJyZWFrOwogCWNhc2UgSUJfQ01fU0lEUl9SRVBfUkVDRUlWRUQ6CkBAIC0zNzgsMzEgKzM0MCwyNCBAQAogCXN0cnVjdCBpYl91Y21fZXZlbnQgKnVldmVudDsKIAlzdHJ1Y3QgaWJfdWNtX2NvbnRleHQgKmN0eDsKIAlpbnQgcmVzdWx0ID0gMDsKLQlpbnQgaWQ7CiAKIAljdHggPSBjbV9pZC0+Y29udGV4dDsKIAotCWlmIChldmVudC0+ZXZlbnQgPT0gSUJfQ01fUkVRX1JFQ0VJVkVEIHx8Ci0JICAgIGV2ZW50LT5ldmVudCA9PSBJQl9DTV9TSURSX1JFUV9SRUNFSVZFRCkKLQkJaWQgPSBJQl9VQ01fQ01fSURfSU5WQUxJRDsKLQllbHNlCi0JCWlkID0gY3R4LT5pZDsKLQogCXVldmVudCA9IGttYWxsb2Moc2l6ZW9mKCp1ZXZlbnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVldmVudCkKIAkJZ290byBlcnIxOwogCiAJbWVtc2V0KHVldmVudCwgMCwgc2l6ZW9mKCp1ZXZlbnQpKTsKLQl1ZXZlbnQtPnJlc3AuaWQgICAgPSBpZDsKKwl1ZXZlbnQtPmN0eCA9IGN0eDsKKwl1ZXZlbnQtPmNtX2lkID0gY21faWQ7CisJdWV2ZW50LT5yZXNwLnVpZCA9IGN0eC0+dWlkOworCXVldmVudC0+cmVzcC5pZCA9IGN0eC0+aWQ7CiAJdWV2ZW50LT5yZXNwLmV2ZW50ID0gZXZlbnQtPmV2ZW50OwogCi0JcmVzdWx0ID0gaWJfdWNtX2V2ZW50X3Byb2Nlc3MoY3R4LCBldmVudCwgdWV2ZW50KTsKKwlyZXN1bHQgPSBpYl91Y21fZXZlbnRfcHJvY2VzcyhldmVudCwgdWV2ZW50KTsKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVycjI7CiAKLQl1ZXZlbnQtPmN0eCAgID0gY3R4OwotCXVldmVudC0+Y21faWQgPSAoaWQgPT0gSUJfVUNNX0NNX0lEX0lOVkFMSUQpID8gY21faWQgOiBOVUxMOwotCiAJZG93bigmY3R4LT5maWxlLT5tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmdWV2ZW50LT5maWxlX2xpc3QsICZjdHgtPmZpbGUtPmV2ZW50cyk7CiAJbGlzdF9hZGRfdGFpbCgmdWV2ZW50LT5jdHhfbGlzdCwgJmN0eC0+ZXZlbnRzKTsKQEAgLTQxNCw3ICszNjksNyBAQAogCWtmcmVlKHVldmVudCk7CiBlcnIxOgogCS8qIERlc3Ryb3kgbmV3IGNtX2lkJ3MgKi8KLQlyZXR1cm4gKGlkID09IElCX1VDTV9DTV9JRF9JTlZBTElEKTsKKwlyZXR1cm4gaWJfdWNtX25ld19jbV9pZChldmVudC0+ZXZlbnQpOwogfQogCiBzdGF0aWMgc3NpemVfdCBpYl91Y21fZXZlbnQoc3RydWN0IGliX3VjbV9maWxlICpmaWxlLApAQCAtNDIzLDcgKzM3OCw3IEBACiB7CiAJc3RydWN0IGliX3VjbV9jb250ZXh0ICpjdHg7CiAJc3RydWN0IGliX3VjbV9ldmVudF9nZXQgY21kOwotCXN0cnVjdCBpYl91Y21fZXZlbnQgKnVldmVudCA9IE5VTEw7CisJc3RydWN0IGliX3VjbV9ldmVudCAqdWV2ZW50OwogCWludCByZXN1bHQgPSAwOwogCURFRklORV9XQUlUKHdhaXQpOwogCkBAIC00MzYsNyArMzkxLDYgQEAKIAkgKiB3YWl0CiAJICovCiAJZG93bigmZmlsZS0+bXV0ZXgpOwotCiAJd2hpbGUgKGxpc3RfZW1wdHkoJmZpbGUtPmV2ZW50cykpIHsKIAogCQlpZiAoZmlsZS0+ZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKQEAgLTQ2MywyMSArNDE3LDE4IEBACiAKIAl1ZXZlbnQgPSBsaXN0X2VudHJ5KGZpbGUtPmV2ZW50cy5uZXh0LCBzdHJ1Y3QgaWJfdWNtX2V2ZW50LCBmaWxlX2xpc3QpOwogCi0JaWYgKCF1ZXZlbnQtPmNtX2lkKQotCQlnb3RvIHVzZXI7CisJaWYgKGliX3VjbV9uZXdfY21faWQodWV2ZW50LT5yZXNwLmV2ZW50KSkgeworCQljdHggPSBpYl91Y21fY3R4X2FsbG9jKGZpbGUpOworCQlpZiAoIWN0eCkgeworCQkJcmVzdWx0ID0gLUVOT01FTTsKKwkJCWdvdG8gZG9uZTsKKwkJfQogCi0JY3R4ID0gaWJfdWNtX2N0eF9hbGxvYyhmaWxlKTsKLQlpZiAoIWN0eCkgewotCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7CisJCWN0eC0+Y21faWQgPSB1ZXZlbnQtPmNtX2lkOworCQljdHgtPmNtX2lkLT5jb250ZXh0ID0gY3R4OworCQl1ZXZlbnQtPnJlc3AuaWQgPSBjdHgtPmlkOwogCX0KIAotCWN0eC0+Y21faWQgICAgICAgICAgPSB1ZXZlbnQtPmNtX2lkOwotCWN0eC0+Y21faWQtPmNvbnRleHQgPSBjdHg7Ci0KLQl1ZXZlbnQtPnJlc3AuaWQgPSBjdHgtPmlkOwotCi11c2VyOgogCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpY21kLnJlc3BvbnNlLAogCQkJICZ1ZXZlbnQtPnJlc3AsIHNpemVvZih1ZXZlbnQtPnJlc3ApKSkgewogCQlyZXN1bHQgPSAtRUZBVUxUOwpAQCAtNDg1LDEyICs0MzYsMTAgQEAKIAl9CiAKIAlpZiAodWV2ZW50LT5kYXRhKSB7Ci0KIAkJaWYgKGNtZC5kYXRhX2xlbiA8IHVldmVudC0+ZGF0YV9sZW4pIHsKIAkJCXJlc3VsdCA9IC1FTk9NRU07CiAJCQlnb3RvIGRvbmU7CiAJCX0KLQogCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWNtZC5kYXRhLAogCQkJCSB1ZXZlbnQtPmRhdGEsIHVldmVudC0+ZGF0YV9sZW4pKSB7CiAJCQlyZXN1bHQgPSAtRUZBVUxUOwpAQCAtNDk5LDEyICs0NDgsMTAgQEAKIAl9CiAKIAlpZiAodWV2ZW50LT5pbmZvKSB7Ci0KIAkJaWYgKGNtZC5pbmZvX2xlbiA8IHVldmVudC0+aW5mb19sZW4pIHsKIAkJCXJlc3VsdCA9IC1FTk9NRU07CiAJCQlnb3RvIGRvbmU7CiAJCX0KLQogCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWNtZC5pbmZvLAogCQkJCSB1ZXZlbnQtPmluZm8sIHVldmVudC0+aW5mb19sZW4pKSB7CiAJCQlyZXN1bHQgPSAtRUZBVUxUOwpAQCAtNTE0LDYgKzQ2MSw3IEBACiAKIAlsaXN0X2RlbCgmdWV2ZW50LT5maWxlX2xpc3QpOwogCWxpc3RfZGVsKCZ1ZXZlbnQtPmN0eF9saXN0KTsKKwl1ZXZlbnQtPmN0eC0+ZXZlbnRzX3JlcG9ydGVkKys7CiAKIAlrZnJlZSh1ZXZlbnQtPmRhdGEpOwogCWtmcmVlKHVldmVudC0+aW5mbyk7CkBAIC01NDUsNiArNDkzLDcgQEAKIAlpZiAoIWN0eCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwljdHgtPnVpZCA9IGNtZC51aWQ7CiAJY3R4LT5jbV9pZCA9IGliX2NyZWF0ZV9jbV9pZChpYl91Y21fZXZlbnRfaGFuZGxlciwgY3R4KTsKIAlpZiAoSVNfRVJSKGN0eC0+Y21faWQpKSB7CiAJCXJlc3VsdCA9IFBUUl9FUlIoY3R4LT5jbV9pZCk7CkBAIC01NjEsNyArNTEwLDE0IEBACiAJcmV0dXJuIDA7CiAKIGVycjoKLQlpYl91Y21fZGVzdHJveV9jdHgoZmlsZSwgY3R4LT5pZCk7CisJZG93bigmY3R4X2lkX211dGV4KTsKKwlpZHJfcmVtb3ZlKCZjdHhfaWRfdGFibGUsIGN0eC0+aWQpOworCXVwKCZjdHhfaWRfbXV0ZXgpOworCisJaWYgKCFJU19FUlIoY3R4LT5jbV9pZCkpCisJCWliX2Rlc3Ryb3lfY21faWQoY3R4LT5jbV9pZCk7CisKKwlrZnJlZShjdHgpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTU3MCwxMSArNTI2LDQ0IEBACiAJCQkJIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQogewogCXN0cnVjdCBpYl91Y21fZGVzdHJveV9pZCBjbWQ7CisJc3RydWN0IGliX3VjbV9kZXN0cm95X2lkX3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgaWJfdWNtX2NvbnRleHQgKmN0eDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mKHJlc3ApKQorCQlyZXR1cm4gLUVOT1NQQzsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBpbmJ1Ziwgc2l6ZW9mKGNtZCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBpYl91Y21fZGVzdHJveV9jdHgoZmlsZSwgY21kLmlkKTsKKwlkb3duKCZjdHhfaWRfbXV0ZXgpOworCWN0eCA9IGlkcl9maW5kKCZjdHhfaWRfdGFibGUsIGNtZC5pZCk7CisJaWYgKCFjdHgpCisJCWN0eCA9IEVSUl9QVFIoLUVOT0VOVCk7CisJZWxzZSBpZiAoY3R4LT5maWxlICE9IGZpbGUpCisJCWN0eCA9IEVSUl9QVFIoLUVJTlZBTCk7CisJZWxzZQorCQlpZHJfcmVtb3ZlKCZjdHhfaWRfdGFibGUsIGN0eC0+aWQpOworCXVwKCZjdHhfaWRfbXV0ZXgpOworCisJaWYgKElTX0VSUihjdHgpKQorCQlyZXR1cm4gUFRSX0VSUihjdHgpOworCisJYXRvbWljX2RlYygmY3R4LT5yZWYpOworCXdhaXRfZXZlbnQoY3R4LT53YWl0LCAhYXRvbWljX3JlYWQoJmN0eC0+cmVmKSk7CisKKwkvKiBObyBuZXcgZXZlbnRzIHdpbGwgYmUgZ2VuZXJhdGVkIGFmdGVyIGRlc3Ryb3lpbmcgdGhlIGNtX2lkLiAqLworCWliX2Rlc3Ryb3lfY21faWQoY3R4LT5jbV9pZCk7CisJLyogQ2xlYW51cCBldmVudHMgbm90IHlldCByZXBvcnRlZCB0byB0aGUgdXNlci4gKi8KKwlpYl91Y21fY2xlYW51cF9ldmVudHMoY3R4KTsKKworCXJlc3AuZXZlbnRzX3JlcG9ydGVkID0gY3R4LT5ldmVudHNfcmVwb3J0ZWQ7CisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljbWQucmVzcG9uc2UsCisJCQkgJnJlc3AsIHNpemVvZihyZXNwKSkpCisJCXJlc3VsdCA9IC1FRkFVTFQ7CisKKwlrZnJlZShjdHgpOworCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGliX3VjbV9hdHRyX2lkKHN0cnVjdCBpYl91Y21fZmlsZSAqZmlsZSwKQEAgLTYwOSw2ICs1OTgsOTggQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgdm9pZCBpYl91Y21fY29weV9haF9hdHRyKHN0cnVjdCBpYl91Y21fYWhfYXR0ciAqZGVzdF9hdHRyLAorCQkJCXN0cnVjdCBpYl9haF9hdHRyICpzcmNfYXR0cikKK3sKKwltZW1jcHkoZGVzdF9hdHRyLT5ncmhfZGdpZCwgc3JjX2F0dHItPmdyaC5kZ2lkLnJhdywKKwkgICAgICAgc2l6ZW9mIHNyY19hdHRyLT5ncmguZGdpZCk7CisJZGVzdF9hdHRyLT5ncmhfZmxvd19sYWJlbCA9IHNyY19hdHRyLT5ncmguZmxvd19sYWJlbDsKKwlkZXN0X2F0dHItPmdyaF9zZ2lkX2luZGV4ID0gc3JjX2F0dHItPmdyaC5zZ2lkX2luZGV4OworCWRlc3RfYXR0ci0+Z3JoX2hvcF9saW1pdCA9IHNyY19hdHRyLT5ncmguaG9wX2xpbWl0OworCWRlc3RfYXR0ci0+Z3JoX3RyYWZmaWNfY2xhc3MgPSBzcmNfYXR0ci0+Z3JoLnRyYWZmaWNfY2xhc3M7CisKKwlkZXN0X2F0dHItPmRsaWQgPSBzcmNfYXR0ci0+ZGxpZDsKKwlkZXN0X2F0dHItPnNsID0gc3JjX2F0dHItPnNsOworCWRlc3RfYXR0ci0+c3JjX3BhdGhfYml0cyA9IHNyY19hdHRyLT5zcmNfcGF0aF9iaXRzOworCWRlc3RfYXR0ci0+c3RhdGljX3JhdGUgPSBzcmNfYXR0ci0+c3RhdGljX3JhdGU7CisJZGVzdF9hdHRyLT5pc19nbG9iYWwgPSAoc3JjX2F0dHItPmFoX2ZsYWdzICYgSUJfQUhfR1JIKTsKKwlkZXN0X2F0dHItPnBvcnRfbnVtID0gc3JjX2F0dHItPnBvcnRfbnVtOworfQorCitzdGF0aWMgdm9pZCBpYl91Y21fY29weV9xcF9hdHRyKHN0cnVjdCBpYl91Y21faW5pdF9xcF9hdHRyX3Jlc3AgKmRlc3RfYXR0ciwKKwkJCQlzdHJ1Y3QgaWJfcXBfYXR0ciAqc3JjX2F0dHIpCit7CisJZGVzdF9hdHRyLT5jdXJfcXBfc3RhdGUgPSBzcmNfYXR0ci0+Y3VyX3FwX3N0YXRlOworCWRlc3RfYXR0ci0+cGF0aF9tdHUgPSBzcmNfYXR0ci0+cGF0aF9tdHU7CisJZGVzdF9hdHRyLT5wYXRoX21pZ19zdGF0ZSA9IHNyY19hdHRyLT5wYXRoX21pZ19zdGF0ZTsKKwlkZXN0X2F0dHItPnFrZXkgPSBzcmNfYXR0ci0+cWtleTsKKwlkZXN0X2F0dHItPnJxX3BzbiA9IHNyY19hdHRyLT5ycV9wc247CisJZGVzdF9hdHRyLT5zcV9wc24gPSBzcmNfYXR0ci0+c3FfcHNuOworCWRlc3RfYXR0ci0+ZGVzdF9xcF9udW0gPSBzcmNfYXR0ci0+ZGVzdF9xcF9udW07CisJZGVzdF9hdHRyLT5xcF9hY2Nlc3NfZmxhZ3MgPSBzcmNfYXR0ci0+cXBfYWNjZXNzX2ZsYWdzOworCisJZGVzdF9hdHRyLT5tYXhfc2VuZF93ciA9IHNyY19hdHRyLT5jYXAubWF4X3NlbmRfd3I7CisJZGVzdF9hdHRyLT5tYXhfcmVjdl93ciA9IHNyY19hdHRyLT5jYXAubWF4X3JlY3Zfd3I7CisJZGVzdF9hdHRyLT5tYXhfc2VuZF9zZ2UgPSBzcmNfYXR0ci0+Y2FwLm1heF9zZW5kX3NnZTsKKwlkZXN0X2F0dHItPm1heF9yZWN2X3NnZSA9IHNyY19hdHRyLT5jYXAubWF4X3JlY3Zfc2dlOworCWRlc3RfYXR0ci0+bWF4X2lubGluZV9kYXRhID0gc3JjX2F0dHItPmNhcC5tYXhfaW5saW5lX2RhdGE7CisKKwlpYl91Y21fY29weV9haF9hdHRyKCZkZXN0X2F0dHItPmFoX2F0dHIsICZzcmNfYXR0ci0+YWhfYXR0cik7CisJaWJfdWNtX2NvcHlfYWhfYXR0cigmZGVzdF9hdHRyLT5hbHRfYWhfYXR0ciwgJnNyY19hdHRyLT5hbHRfYWhfYXR0cik7CisKKwlkZXN0X2F0dHItPnBrZXlfaW5kZXggPSBzcmNfYXR0ci0+cGtleV9pbmRleDsKKwlkZXN0X2F0dHItPmFsdF9wa2V5X2luZGV4ID0gc3JjX2F0dHItPmFsdF9wa2V5X2luZGV4OworCWRlc3RfYXR0ci0+ZW5fc3FkX2FzeW5jX25vdGlmeSA9IHNyY19hdHRyLT5lbl9zcWRfYXN5bmNfbm90aWZ5OworCWRlc3RfYXR0ci0+c3FfZHJhaW5pbmcgPSBzcmNfYXR0ci0+c3FfZHJhaW5pbmc7CisJZGVzdF9hdHRyLT5tYXhfcmRfYXRvbWljID0gc3JjX2F0dHItPm1heF9yZF9hdG9taWM7CisJZGVzdF9hdHRyLT5tYXhfZGVzdF9yZF9hdG9taWMgPSBzcmNfYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljOworCWRlc3RfYXR0ci0+bWluX3Jucl90aW1lciA9IHNyY19hdHRyLT5taW5fcm5yX3RpbWVyOworCWRlc3RfYXR0ci0+cG9ydF9udW0gPSBzcmNfYXR0ci0+cG9ydF9udW07CisJZGVzdF9hdHRyLT50aW1lb3V0ID0gc3JjX2F0dHItPnRpbWVvdXQ7CisJZGVzdF9hdHRyLT5yZXRyeV9jbnQgPSBzcmNfYXR0ci0+cmV0cnlfY250OworCWRlc3RfYXR0ci0+cm5yX3JldHJ5ID0gc3JjX2F0dHItPnJucl9yZXRyeTsKKwlkZXN0X2F0dHItPmFsdF9wb3J0X251bSA9IHNyY19hdHRyLT5hbHRfcG9ydF9udW07CisJZGVzdF9hdHRyLT5hbHRfdGltZW91dCA9IHNyY19hdHRyLT5hbHRfdGltZW91dDsKK30KKworc3RhdGljIHNzaXplX3QgaWJfdWNtX2luaXRfcXBfYXR0cihzdHJ1Y3QgaWJfdWNtX2ZpbGUgKmZpbGUsCisJCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKmluYnVmLAorCQkJCSAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91Y21faW5pdF9xcF9hdHRyX3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgaWJfdWNtX2luaXRfcXBfYXR0ciBjbWQ7CisJc3RydWN0IGliX3VjbV9jb250ZXh0ICpjdHg7CisJc3RydWN0IGliX3FwX2F0dHIgcXBfYXR0cjsKKwlpbnQgcmVzdWx0ID0gMDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mKHJlc3ApKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBpbmJ1Ziwgc2l6ZW9mKGNtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWN0eCA9IGliX3VjbV9jdHhfZ2V0KGZpbGUsIGNtZC5pZCk7CisJaWYgKElTX0VSUihjdHgpKQorCQlyZXR1cm4gUFRSX0VSUihjdHgpOworCisJcmVzcC5xcF9hdHRyX21hc2sgPSAwOworCW1lbXNldCgmcXBfYXR0ciwgMCwgc2l6ZW9mIHFwX2F0dHIpOworCXFwX2F0dHIucXBfc3RhdGUgPSBjbWQucXBfc3RhdGU7CisJcmVzdWx0ID0gaWJfY21faW5pdF9xcF9hdHRyKGN0eC0+Y21faWQsICZxcF9hdHRyLCAmcmVzcC5xcF9hdHRyX21hc2spOworCWlmIChyZXN1bHQpCisJCWdvdG8gb3V0OworCisJaWJfdWNtX2NvcHlfcXBfYXR0cigmcmVzcCwgJnFwX2F0dHIpOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljbWQucmVzcG9uc2UsCisJCQkgJnJlc3AsIHNpemVvZihyZXNwKSkpCisJCXJlc3VsdCA9IC1FRkFVTFQ7CisKK291dDoKKwlpYl91Y21fY3R4X3B1dChjdHgpOworCXJldHVybiByZXN1bHQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IGliX3VjbV9saXN0ZW4oc3RydWN0IGliX3VjbV9maWxlICpmaWxlLAogCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqaW5idWYsCiAJCQkgICAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQpAQCAtODA4LDYgKzg4OSw3IEBACiAKIAljdHggPSBpYl91Y21fY3R4X2dldChmaWxlLCBjbWQuaWQpOwogCWlmICghSVNfRVJSKGN0eCkpIHsKKwkJY3R4LT51aWQgPSBjbWQudWlkOwogCQlyZXN1bHQgPSBpYl9zZW5kX2NtX3JlcChjdHgtPmNtX2lkLCAmcGFyYW0pOwogCQlpYl91Y21fY3R4X3B1dChjdHgpOwogCX0gZWxzZQpAQCAtMTA4Niw2ICsxMTY4LDcgQEAKIAlbSUJfVVNFUl9DTV9DTURfU0VORF9TSURSX1JFUV0gPSBpYl91Y21fc2VuZF9zaWRyX3JlcSwKIAlbSUJfVVNFUl9DTV9DTURfU0VORF9TSURSX1JFUF0gPSBpYl91Y21fc2VuZF9zaWRyX3JlcCwKIAlbSUJfVVNFUl9DTV9DTURfRVZFTlRdCSAgICAgICA9IGliX3VjbV9ldmVudCwKKwlbSUJfVVNFUl9DTV9DTURfSU5JVF9RUF9BVFRSXSAgPSBpYl91Y21faW5pdF9xcF9hdHRyLAogfTsKIAogc3RhdGljIHNzaXplX3QgaWJfdWNtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLApAQCAtMTE2MSwxMiArMTI0NCwxOCBAQAogCiAJZG93bigmZmlsZS0+bXV0ZXgpOwogCXdoaWxlICghbGlzdF9lbXB0eSgmZmlsZS0+Y3R4cykpIHsKLQogCQljdHggPSBsaXN0X2VudHJ5KGZpbGUtPmN0eHMubmV4dCwKIAkJCQkgc3RydWN0IGliX3VjbV9jb250ZXh0LCBmaWxlX2xpc3QpOwotCiAJCXVwKCZmaWxlLT5tdXRleCk7Ci0JCWliX3VjbV9kZXN0cm95X2N0eChmaWxlLCBjdHgtPmlkKTsKKworCQlkb3duKCZjdHhfaWRfbXV0ZXgpOworCQlpZHJfcmVtb3ZlKCZjdHhfaWRfdGFibGUsIGN0eC0+aWQpOworCQl1cCgmY3R4X2lkX211dGV4KTsKKworCQlpYl9kZXN0cm95X2NtX2lkKGN0eC0+Y21faWQpOworCQlpYl91Y21fY2xlYW51cF9ldmVudHMoY3R4KTsKKwkJa2ZyZWUoY3R4KTsKKwogCQlkb3duKCZmaWxlLT5tdXRleCk7CiAJfQogCXVwKCZmaWxlLT5tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5oCmluZGV4IGM4ODE5YjkuLmY0NmYzN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5oCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTQzLDggKzQ0LDYgQEAKICNpbmNsdWRlIDxyZG1hL2liX2NtLmg+CiAjaW5jbHVkZSA8cmRtYS9pYl91c2VyX2NtLmg+CiAKLSNkZWZpbmUgSUJfVUNNX0NNX0lEX0lOVkFMSUQgMHhmZmZmZmZmZgotCiBzdHJ1Y3QgaWJfdWNtX2ZpbGUgewogCXN0cnVjdCBzZW1hcGhvcmUgbXV0ZXg7CiAJc3RydWN0IGZpbGUgKmZpbHA7CkBAIC01OCw5ICs1NywxMSBAQAogCWludCAgICAgICAgICAgICAgICAgaWQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgICB3YWl0OwogCWF0b21pY190ICAgICAgICAgICAgcmVmOworCWludAkJICAgIGV2ZW50c19yZXBvcnRlZDsKIAogCXN0cnVjdCBpYl91Y21fZmlsZSAqZmlsZTsKIAlzdHJ1Y3QgaWJfY21faWQgICAgKmNtX2lkOworCV9fdTY0CQkgICB1aWQ7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgIGV2ZW50czsgICAgLyogbGlzdCBvZiBwZW5kaW5nIGV2ZW50cy4gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkICAgIGZpbGVfbGlzdDsgLyogbWVtYmVyIGluIGZpbGUgY3R4IGxpc3QgKi8KQEAgLTcxLDE2ICs3MiwxMiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZmlsZV9saXN0OyAvKiBtZW1iZXIgaW4gZmlsZSBldmVudCBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBjdHhfbGlzdDsgIC8qIG1lbWJlciBpbiBjdHggZXZlbnQgbGlzdCAqLwogCisJc3RydWN0IGliX2NtX2lkICpjbV9pZDsKIAlzdHJ1Y3QgaWJfdWNtX2V2ZW50X3Jlc3AgcmVzcDsKIAl2b2lkICpkYXRhOwogCXZvaWQgKmluZm87CiAJaW50IGRhdGFfbGVuOwogCWludCBpbmZvX2xlbjsKLQkvKgotCSAqIG5ldyBjb25uZWN0aW9uIGlkZW50aWZpZXJzIG5lZWRzIHRvIGJlIHNhdmVkIHVudGlsCi0JICogdXNlcnNwYWNlIGNhbiBnZXQgYSBoYW5kbGUgb24gdGhlbS4KLQkgKi8KLQlzdHJ1Y3QgaWJfY21faWQgKmNtX2lkOwogfTsKIAogI2VuZGlmIC8qIFVDTV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oCmluZGV4IDE4MGIzZDQuLmIxODk3YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oCkBAIC03NiwyMCArNzYsMjggQEAKIAlzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50X2ZpbGUJICAgICAgICBjb21wX2ZpbGVbMV07CiB9OwogCi1zdHJ1Y3QgaWJfdXZlcmJzX2FzeW5jX2V2ZW50IHsKLQlzdHJ1Y3QgaWJfdXZlcmJzX2FzeW5jX2V2ZW50X2Rlc2MJZGVzYzsKK3N0cnVjdCBpYl91dmVyYnNfZXZlbnQgeworCXVuaW9uIHsKKwkJc3RydWN0IGliX3V2ZXJic19hc3luY19ldmVudF9kZXNjCWFzeW5jOworCQlzdHJ1Y3QgaWJfdXZlcmJzX2NvbXBfZXZlbnRfZGVzYwljb21wOworCX0JCQkJCWRlc2M7CiAJc3RydWN0IGxpc3RfaGVhZAkJCWxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAkJCW9ial9saXN0OworCXUzMgkJCQkgICAgICAgKmNvdW50ZXI7CiB9OwogCi1zdHJ1Y3QgaWJfdXZlcmJzX2NvbXBfZXZlbnQgewotCXN0cnVjdCBpYl91dmVyYnNfY29tcF9ldmVudF9kZXNjCWRlc2M7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJCWxpc3Q7CitzdHJ1Y3QgaWJfdWV2ZW50X29iamVjdCB7CisJc3RydWN0IGliX3VvYmplY3QJdW9iamVjdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWV2ZW50X2xpc3Q7CisJdTMyCQkJZXZlbnRzX3JlcG9ydGVkOwogfTsKIAotc3RydWN0IGliX3VvYmplY3RfbXIgewotCXN0cnVjdCBpYl91b2JqZWN0CQkJdW9iajsKLQlzdHJ1Y3QgcGFnZQkJCSAgICAgICAqcGFnZV9saXN0OwotCXN0cnVjdCBzY2F0dGVybGlzdAkJICAgICAgICpzZ19saXN0Oworc3RydWN0IGliX3VjcV9vYmplY3QgeworCXN0cnVjdCBpYl91b2JqZWN0CXVvYmplY3Q7CisJc3RydWN0IGxpc3RfaGVhZAljb21wX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlhc3luY19saXN0OworCXUzMgkJCWNvbXBfZXZlbnRzX3JlcG9ydGVkOworCXUzMgkJCWFzeW5jX2V2ZW50c19yZXBvcnRlZDsKIH07CiAKIGV4dGVybiBzdHJ1Y3Qgc2VtYXBob3JlIGliX3V2ZXJic19pZHJfbXV0ZXg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMKaW5kZXggZWJjY2Y5Zi4uZTkxZWJkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYwpAQCAtNTkwLDcgKzU5MCw3IEBACiAJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfY3EgICAgICBjbWQ7CiAJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfY3FfcmVzcCByZXNwOwogCXN0cnVjdCBpYl91ZGF0YSAgICAgICAgICAgICAgICAgdWRhdGE7Ci0Jc3RydWN0IGliX3VvYmplY3QgICAgICAgICAgICAgICp1b2JqOworCXN0cnVjdCBpYl91Y3Ffb2JqZWN0ICAgICAgICAgICAqdW9iajsKIAlzdHJ1Y3QgaWJfY3EgICAgICAgICAgICAgICAgICAgKmNxOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0OwogCkBAIC02MTEsOCArNjExLDEyIEBACiAJaWYgKCF1b2JqKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXVvYmotPnVzZXJfaGFuZGxlID0gY21kLnVzZXJfaGFuZGxlOwotCXVvYmotPmNvbnRleHQgICAgID0gZmlsZS0+dWNvbnRleHQ7CisJdW9iai0+dW9iamVjdC51c2VyX2hhbmRsZSAgID0gY21kLnVzZXJfaGFuZGxlOworCXVvYmotPnVvYmplY3QuY29udGV4dCAgICAgICA9IGZpbGUtPnVjb250ZXh0OworCXVvYmotPmNvbXBfZXZlbnRzX3JlcG9ydGVkICA9IDA7CisJdW9iai0+YXN5bmNfZXZlbnRzX3JlcG9ydGVkID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmdW9iai0+Y29tcF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmdW9iai0+YXN5bmNfbGlzdCk7CiAKIAljcSA9IGZpbGUtPmRldmljZS0+aWJfZGV2LT5jcmVhdGVfY3EoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsIGNtZC5jcWUsCiAJCQkJCSAgICAgZmlsZS0+dWNvbnRleHQsICZ1ZGF0YSk7CkBAIC02MjIsNyArNjI2LDcgQEAKIAl9CiAKIAljcS0+ZGV2aWNlICAgICAgICA9IGZpbGUtPmRldmljZS0+aWJfZGV2OwotCWNxLT51b2JqZWN0ICAgICAgID0gdW9iajsKKwljcS0+dW9iamVjdCAgICAgICA9ICZ1b2JqLT51b2JqZWN0OwogCWNxLT5jb21wX2hhbmRsZXIgID0gaWJfdXZlcmJzX2NvbXBfaGFuZGxlcjsKIAljcS0+ZXZlbnRfaGFuZGxlciA9IGliX3V2ZXJic19jcV9ldmVudF9oYW5kbGVyOwogCWNxLT5jcV9jb250ZXh0ICAgID0gZmlsZTsKQEAgLTYzNSw3ICs2MzksNyBAQAogCX0KIAogCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOwotCXJldCA9IGlkcl9nZXRfbmV3KCZpYl91dmVyYnNfY3FfaWRyLCBjcSwgJnVvYmotPmlkKTsKKwlyZXQgPSBpZHJfZ2V0X25ldygmaWJfdXZlcmJzX2NxX2lkciwgY3EsICZ1b2JqLT51b2JqZWN0LmlkKTsKIAl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlpZiAocmV0ID09IC1FQUdBSU4pCkBAIC02NDQsMTEgKzY0OCwxMSBAQAogCQlnb3RvIGVycl9jcTsKIAogCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZ1b2JqLT5saXN0LCAmZmlsZS0+dWNvbnRleHQtPmNxX2xpc3QpOworCWxpc3RfYWRkX3RhaWwoJnVvYmotPnVvYmplY3QubGlzdCwgJmZpbGUtPnVjb250ZXh0LT5jcV9saXN0KTsKIAlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKIAogCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOwotCXJlc3AuY3FfaGFuZGxlID0gdW9iai0+aWQ7CisJcmVzcC5jcV9oYW5kbGUgPSB1b2JqLT51b2JqZWN0LmlkOwogCXJlc3AuY3FlICAgICAgID0gY3EtPmNxZTsKIAogCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UsCkBAIC02NjEsMTEgKzY2NSwxMSBAQAogCiBlcnJfbGlzdDoKICAJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOwotCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlsaXN0X2RlbCgmdW9iai0+dW9iamVjdC5saXN0KTsKIAlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKIAogCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOwotCWlkcl9yZW1vdmUoJmliX3V2ZXJic19jcV9pZHIsIHVvYmotPmlkKTsKKwlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfY3FfaWRyLCB1b2JqLT51b2JqZWN0LmlkKTsKIAl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIGVycl9jcToKQEAgLTY4MCwyMSArNjg0LDI3IEBACiAJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCiAJCQkgICAgIGludCBvdXRfbGVuKQogewotCXN0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9jcSBjbWQ7Ci0Jc3RydWN0IGliX2NxICAgICAgICAgICAgICAgKmNxOwotCXN0cnVjdCBpYl91b2JqZWN0ICAgICAgICAgICp1b2JqOwotCWludCAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9jcSAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfY3FfcmVzcCByZXNwOworCXN0cnVjdCBpYl9jcSAgICAgICAgICAgICAgIAkqY3E7CisJc3RydWN0IGliX3VjcV9vYmplY3QgICAgICAgIAkqdW9iajsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50CQkqZXZ0LCAqdG1wOworCXU2NAkJCQkgdXNlcl9oYW5kbGU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgCSByZXQgPSAtRUlOVkFMOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisKIAlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCWNxID0gaWRyX2ZpbmQoJmliX3V2ZXJic19jcV9pZHIsIGNtZC5jcV9oYW5kbGUpOwogCWlmICghY3EgfHwgY3EtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCiAJCWdvdG8gb3V0OwogCi0JdW9iaiA9IGNxLT51b2JqZWN0OworCXVzZXJfaGFuZGxlID0gY3EtPnVvYmplY3QtPnVzZXJfaGFuZGxlOworCXVvYmogPSBjb250YWluZXJfb2YoY3EtPnVvYmplY3QsIHN0cnVjdCBpYl91Y3Ffb2JqZWN0LCB1b2JqZWN0KTsKIAogCXJldCA9IGliX2Rlc3Ryb3lfY3EoY3EpOwogCWlmIChyZXQpCkBAIC03MDMsMTEgKzcxMywzMiBAQAogCWlkcl9yZW1vdmUoJmliX3V2ZXJic19jcV9pZHIsIGNtZC5jcV9oYW5kbGUpOwogCiAJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOwotCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlsaXN0X2RlbCgmdW9iai0+dW9iamVjdC5saXN0KTsKIAlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKIAorCXNwaW5fbG9ja19pcnEoJmZpbGUtPmNvbXBfZmlsZVswXS5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXZ0LCB0bXAsICZ1b2JqLT5jb21wX2xpc3QsIG9ial9saXN0KSB7CisJCWxpc3RfZGVsKCZldnQtPmxpc3QpOworCQlrZnJlZShldnQpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPmNvbXBfZmlsZVswXS5sb2NrKTsKKworCXNwaW5fbG9ja19pcnEoJmZpbGUtPmFzeW5jX2ZpbGUubG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV2dCwgdG1wLCAmdW9iai0+YXN5bmNfbGlzdCwgb2JqX2xpc3QpIHsKKwkJbGlzdF9kZWwoJmV2dC0+bGlzdCk7CisJCWtmcmVlKGV2dCk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+YXN5bmNfZmlsZS5sb2NrKTsKKworCXJlc3AuY29tcF9ldmVudHNfcmVwb3J0ZWQgID0gdW9iai0+Y29tcF9ldmVudHNfcmVwb3J0ZWQ7CisJcmVzcC5hc3luY19ldmVudHNfcmVwb3J0ZWQgPSB1b2JqLT5hc3luY19ldmVudHNfcmVwb3J0ZWQ7CisKIAlrZnJlZSh1b2JqKTsKIAorCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UsCisJCQkgJnJlc3AsIHNpemVvZiByZXNwKSkKKwkJcmV0ID0gLUVGQVVMVDsKKwogb3V0OgogCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIApAQCAtNzIxLDcgKzc1Miw3IEBACiAJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfcXAgICAgICBjbWQ7CiAJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfcXBfcmVzcCByZXNwOwogCXN0cnVjdCBpYl91ZGF0YSAgICAgICAgICAgICAgICAgdWRhdGE7Ci0Jc3RydWN0IGliX3VvYmplY3QgICAgICAgICAgICAgICp1b2JqOworCXN0cnVjdCBpYl91ZXZlbnRfb2JqZWN0ICAgICAgICAqdW9iajsKIAlzdHJ1Y3QgaWJfcGQgICAgICAgICAgICAgICAgICAgKnBkOwogCXN0cnVjdCBpYl9jcSAgICAgICAgICAgICAgICAgICAqc2NxLCAqcmNxOwogCXN0cnVjdCBpYl9zcnEgICAgICAgICAgICAgICAgICAqc3JxOwpAQCAtNzcyLDggKzgwMywxMCBAQAogCWF0dHIuY2FwLm1heF9yZWN2X3NnZSAgICA9IGNtZC5tYXhfcmVjdl9zZ2U7CiAJYXR0ci5jYXAubWF4X2lubGluZV9kYXRhID0gY21kLm1heF9pbmxpbmVfZGF0YTsKIAotCXVvYmotPnVzZXJfaGFuZGxlID0gY21kLnVzZXJfaGFuZGxlOwotCXVvYmotPmNvbnRleHQgICAgID0gZmlsZS0+dWNvbnRleHQ7CisJdW9iai0+dW9iamVjdC51c2VyX2hhbmRsZSA9IGNtZC51c2VyX2hhbmRsZTsKKwl1b2JqLT51b2JqZWN0LmNvbnRleHQgICAgID0gZmlsZS0+dWNvbnRleHQ7CisJdW9iai0+ZXZlbnRzX3JlcG9ydGVkICAgICA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJnVvYmotPmV2ZW50X2xpc3QpOwogCiAJcXAgPSBwZC0+ZGV2aWNlLT5jcmVhdGVfcXAocGQsICZhdHRyLCAmdWRhdGEpOwogCWlmIChJU19FUlIocXApKSB7CkBAIC03ODYsNyArODE5LDcgQEAKIAlxcC0+c2VuZF9jcSAgICAJICA9IGF0dHIuc2VuZF9jcTsKIAlxcC0+cmVjdl9jcSAgICAJICA9IGF0dHIucmVjdl9jcTsKIAlxcC0+c3JxCSAgICAgICAJICA9IGF0dHIuc3JxOwotCXFwLT51b2JqZWN0ICAgICAgID0gdW9iajsKKwlxcC0+dW9iamVjdCAgICAgICA9ICZ1b2JqLT51b2JqZWN0OwogCXFwLT5ldmVudF9oYW5kbGVyID0gYXR0ci5ldmVudF9oYW5kbGVyOwogCXFwLT5xcF9jb250ZXh0ICAgID0gYXR0ci5xcF9jb250ZXh0OwogCXFwLT5xcF90eXBlCSAgPSBhdHRyLnFwX3R5cGU7CkBAIC04MDUsMTcgKzgzOCwxNyBAQAogCQlnb3RvIGVycl9kZXN0cm95OwogCX0KIAotCXJldCA9IGlkcl9nZXRfbmV3KCZpYl91dmVyYnNfcXBfaWRyLCBxcCwgJnVvYmotPmlkKTsKKwlyZXQgPSBpZHJfZ2V0X25ldygmaWJfdXZlcmJzX3FwX2lkciwgcXAsICZ1b2JqLT51b2JqZWN0LmlkKTsKIAogCWlmIChyZXQgPT0gLUVBR0FJTikKIAkJZ290byByZXRyeTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9kZXN0cm95OwogCi0JcmVzcC5xcF9oYW5kbGUgPSB1b2JqLT5pZDsKKwlyZXNwLnFwX2hhbmRsZSA9IHVvYmotPnVvYmplY3QuaWQ7CiAKIAlzcGluX2xvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmdW9iai0+bGlzdCwgJmZpbGUtPnVjb250ZXh0LT5xcF9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZ1b2JqLT51b2JqZWN0Lmxpc3QsICZmaWxlLT51Y29udGV4dC0+cXBfbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CiAKIAlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLApAQCAtODMwLDcgKzg2Myw3IEBACiAKIGVycl9saXN0OgogCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKLQlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJbGlzdF9kZWwoJnVvYmotPnVvYmplY3QubGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CiAKIGVycl9kZXN0cm95OgpAQCAtOTMwLDIxICs5NjMsMjUgQEAKIAkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKIAkJCSAgICAgaW50IG91dF9sZW4pCiB7Ci0Jc3RydWN0IGliX3V2ZXJic19kZXN0cm95X3FwIGNtZDsKLQlzdHJ1Y3QgaWJfcXAgICAgICAgICAgICAgICAqcXA7Ci0Jc3RydWN0IGliX3VvYmplY3QgICAgICAgICAgKnVvYmo7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisJc3RydWN0IGliX3V2ZXJic19kZXN0cm95X3FwICAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9xcF9yZXNwIHJlc3A7CisJc3RydWN0IGliX3FwICAgICAgICAgICAgICAgCSpxcDsKKwlzdHJ1Y3QgaWJfdWV2ZW50X29iamVjdCAgICAgICAgCSp1b2JqOworCXN0cnVjdCBpYl91dmVyYnNfZXZlbnQJCSpldnQsICp0bXA7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgCSByZXQgPSAtRUlOVkFMOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisKIAlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXFwID0gaWRyX2ZpbmQoJmliX3V2ZXJic19xcF9pZHIsIGNtZC5xcF9oYW5kbGUpOwogCWlmICghcXAgfHwgcXAtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCiAJCWdvdG8gb3V0OwogCi0JdW9iaiA9IHFwLT51b2JqZWN0OworCXVvYmogPSBjb250YWluZXJfb2YocXAtPnVvYmplY3QsIHN0cnVjdCBpYl91ZXZlbnRfb2JqZWN0LCB1b2JqZWN0KTsKIAogCXJldCA9IGliX2Rlc3Ryb3lfcXAocXApOwogCWlmIChyZXQpCkBAIC05NTMsMTEgKzk5MCwyNCBAQAogCWlkcl9yZW1vdmUoJmliX3V2ZXJic19xcF9pZHIsIGNtZC5xcF9oYW5kbGUpOwogCiAJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOwotCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlsaXN0X2RlbCgmdW9iai0+dW9iamVjdC5saXN0KTsKIAlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKIAorCXNwaW5fbG9ja19pcnEoJmZpbGUtPmFzeW5jX2ZpbGUubG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV2dCwgdG1wLCAmdW9iai0+ZXZlbnRfbGlzdCwgb2JqX2xpc3QpIHsKKwkJbGlzdF9kZWwoJmV2dC0+bGlzdCk7CisJCWtmcmVlKGV2dCk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+YXN5bmNfZmlsZS5sb2NrKTsKKworCXJlc3AuZXZlbnRzX3JlcG9ydGVkID0gdW9iai0+ZXZlbnRzX3JlcG9ydGVkOworCiAJa2ZyZWUodW9iaik7CiAKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpCisJCXJldCA9IC1FRkFVTFQ7CisKIG91dDoKIAl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKQEAgLTEwMTUsNyArMTA2NSw3IEBACiAJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfc3JxICAgICAgY21kOwogCXN0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3NycV9yZXNwIHJlc3A7CiAJc3RydWN0IGliX3VkYXRhICAgICAgICAgICAgICAgICAgdWRhdGE7Ci0Jc3RydWN0IGliX3VvYmplY3QgICAgICAgICAgICAgICAqdW9iajsKKwlzdHJ1Y3QgaWJfdWV2ZW50X29iamVjdCAgICAgICAgICp1b2JqOwogCXN0cnVjdCBpYl9wZCAgICAgICAgICAgICAgICAgICAgKnBkOwogCXN0cnVjdCBpYl9zcnEgICAgICAgICAgICAgICAgICAgKnNycTsKIAlzdHJ1Y3QgaWJfc3JxX2luaXRfYXR0ciAgICAgICAgICBhdHRyOwpAQCAtMTA1MCw4ICsxMTAwLDEwIEBACiAJYXR0ci5hdHRyLm1heF9zZ2UgICA9IGNtZC5tYXhfc2dlOwogCWF0dHIuYXR0ci5zcnFfbGltaXQgPSBjbWQuc3JxX2xpbWl0OwogCi0JdW9iai0+dXNlcl9oYW5kbGUgPSBjbWQudXNlcl9oYW5kbGU7Ci0JdW9iai0+Y29udGV4dCAgICAgPSBmaWxlLT51Y29udGV4dDsKKwl1b2JqLT51b2JqZWN0LnVzZXJfaGFuZGxlID0gY21kLnVzZXJfaGFuZGxlOworCXVvYmotPnVvYmplY3QuY29udGV4dCAgICAgPSBmaWxlLT51Y29udGV4dDsKKwl1b2JqLT5ldmVudHNfcmVwb3J0ZWQgICAgID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmdW9iai0+ZXZlbnRfbGlzdCk7CiAKIAlzcnEgPSBwZC0+ZGV2aWNlLT5jcmVhdGVfc3JxKHBkLCAmYXR0ciwgJnVkYXRhKTsKIAlpZiAoSVNfRVJSKHNycSkpIHsKQEAgLTEwNjEsNyArMTExMyw3IEBACiAKIAlzcnEtPmRldmljZSAgICAJICAgPSBwZC0+ZGV2aWNlOwogCXNycS0+cGQgICAgICAgIAkgICA9IHBkOwotCXNycS0+dW9iamVjdCAgICAgICA9IHVvYmo7CisJc3JxLT51b2JqZWN0ICAgICAgID0gJnVvYmotPnVvYmplY3Q7CiAJc3JxLT5ldmVudF9oYW5kbGVyID0gYXR0ci5ldmVudF9oYW5kbGVyOwogCXNycS0+c3JxX2NvbnRleHQgICA9IGF0dHIuc3JxX2NvbnRleHQ7CiAJYXRvbWljX2luYygmcGQtPnVzZWNudCk7CkBAIC0xMDc1LDE3ICsxMTI3LDE3IEBACiAJCWdvdG8gZXJyX2Rlc3Ryb3k7CiAJfQogCi0JcmV0ID0gaWRyX2dldF9uZXcoJmliX3V2ZXJic19zcnFfaWRyLCBzcnEsICZ1b2JqLT5pZCk7CisJcmV0ID0gaWRyX2dldF9uZXcoJmliX3V2ZXJic19zcnFfaWRyLCBzcnEsICZ1b2JqLT51b2JqZWN0LmlkKTsKIAogCWlmIChyZXQgPT0gLUVBR0FJTikKIAkJZ290byByZXRyeTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9kZXN0cm95OwogCi0JcmVzcC5zcnFfaGFuZGxlID0gdW9iai0+aWQ7CisJcmVzcC5zcnFfaGFuZGxlID0gdW9iai0+dW9iamVjdC5pZDsKIAogCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZ1b2JqLT5saXN0LCAmZmlsZS0+dWNvbnRleHQtPnNycV9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZ1b2JqLT51b2JqZWN0Lmxpc3QsICZmaWxlLT51Y29udGV4dC0+c3JxX2xpc3QpOwogCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOwogCiAJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKQEAgLTExMDAsNyArMTE1Miw3IEBACiAKIGVycl9saXN0OgogCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKLQlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJbGlzdF9kZWwoJnVvYmotPnVvYmplY3QubGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CiAKIGVycl9kZXN0cm95OgpAQCAtMTE0OSwyMSArMTIwMSwyNSBAQAogCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKIAkJCSAgICAgIGludCBvdXRfbGVuKQogewotCXN0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9zcnEgY21kOwotCXN0cnVjdCBpYl9zcnEgICAgICAgICAgICAgICAqc3JxOwotCXN0cnVjdCBpYl91b2JqZWN0ICAgICAgICAgICAqdW9iajsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisJc3RydWN0IGliX3V2ZXJic19kZXN0cm95X3NycSAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfc3JxX3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgaWJfc3JxICAgICAgICAgICAgICAgCSAqc3JxOworCXN0cnVjdCBpYl91ZXZlbnRfb2JqZWN0ICAgICAgICAJICp1b2JqOworCXN0cnVjdCBpYl91dmVyYnNfZXZlbnQJCSAqZXZ0LCAqdG1wOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAJICByZXQgPSAtRUlOVkFMOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKKwltZW1zZXQoJnJlc3AsIDAsIHNpemVvZiByZXNwKTsKKwogCXNycSA9IGlkcl9maW5kKCZpYl91dmVyYnNfc3JxX2lkciwgY21kLnNycV9oYW5kbGUpOwogCWlmICghc3JxIHx8IHNycS0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKIAkJZ290byBvdXQ7CiAKLQl1b2JqID0gc3JxLT51b2JqZWN0OworCXVvYmogPSBjb250YWluZXJfb2Yoc3JxLT51b2JqZWN0LCBzdHJ1Y3QgaWJfdWV2ZW50X29iamVjdCwgdW9iamVjdCk7CiAKIAlyZXQgPSBpYl9kZXN0cm95X3NycShzcnEpOwogCWlmIChyZXQpCkBAIC0xMTcyLDExICsxMjI4LDI0IEBACiAJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX3NycV9pZHIsIGNtZC5zcnFfaGFuZGxlKTsKIAogCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKLQlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJbGlzdF9kZWwoJnVvYmotPnVvYmplY3QubGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CiAKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT5hc3luY19maWxlLmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShldnQsIHRtcCwgJnVvYmotPmV2ZW50X2xpc3QsIG9ial9saXN0KSB7CisJCWxpc3RfZGVsKCZldnQtPmxpc3QpOworCQlrZnJlZShldnQpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPmFzeW5jX2ZpbGUubG9jayk7CisKKwlyZXNwLmV2ZW50c19yZXBvcnRlZCA9IHVvYmotPmV2ZW50c19yZXBvcnRlZDsKKwogCWtmcmVlKHVvYmopOwogCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKKwkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKQorCQlyZXQgPSAtRUZBVUxUOworCiBvdXQ6CiAJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYwppbmRleCAwOWNhZjViLi5jZTViZGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCQlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfcXBfaWRyLCB1b2JqLT5pZCk7CiAJCWliX2Rlc3Ryb3lfcXAocXApOwogCQlsaXN0X2RlbCgmdW9iai0+bGlzdCk7Ci0JCWtmcmVlKHVvYmopOworCQlrZnJlZShjb250YWluZXJfb2YodW9iaiwgc3RydWN0IGliX3VldmVudF9vYmplY3QsIHVvYmplY3QpKTsKIAl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW9iaiwgdG1wLCAmY29udGV4dC0+Y3FfbGlzdCwgbGlzdCkgewpAQCAtMTI4LDcgKzEyOCw3IEBACiAJCWlkcl9yZW1vdmUoJmliX3V2ZXJic19jcV9pZHIsIHVvYmotPmlkKTsKIAkJaWJfZGVzdHJveV9jcShjcSk7CiAJCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKLQkJa2ZyZWUodW9iaik7CisJCWtmcmVlKGNvbnRhaW5lcl9vZih1b2JqLCBzdHJ1Y3QgaWJfdWNxX29iamVjdCwgdW9iamVjdCkpOwogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1b2JqLCB0bXAsICZjb250ZXh0LT5zcnFfbGlzdCwgbGlzdCkgewpAQCAtMTM2LDcgKzEzNiw3IEBACiAJCWlkcl9yZW1vdmUoJmliX3V2ZXJic19zcnFfaWRyLCB1b2JqLT5pZCk7CiAJCWliX2Rlc3Ryb3lfc3JxKHNycSk7CiAJCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKLQkJa2ZyZWUodW9iaik7CisJCWtmcmVlKGNvbnRhaW5lcl9vZih1b2JqLCBzdHJ1Y3QgaWJfdWV2ZW50X29iamVjdCwgdW9iamVjdCkpOwogCX0KIAogCS8qIFhYWCBGcmVlIE1XcyAqLwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCiB7CiAJc3RydWN0IGliX3V2ZXJic19ldmVudF9maWxlICpmaWxlID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgKmV2ZW50OworCXN0cnVjdCBpYl91dmVyYnNfZXZlbnQgKmV2ZW50OwogCWludCBldmVudHN6OwogCWludCByZXQgPSAwOwogCkBAIC0yMDcsMjEgKzIwNywyMyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoZmlsZS0+aXNfYXN5bmMpIHsKLQkJZXZlbnQgICA9IGxpc3RfZW50cnkoZmlsZS0+ZXZlbnRfbGlzdC5uZXh0LAotCQkJCSAgICAgc3RydWN0IGliX3V2ZXJic19hc3luY19ldmVudCwgbGlzdCk7CisJZXZlbnQgPSBsaXN0X2VudHJ5KGZpbGUtPmV2ZW50X2xpc3QubmV4dCwgc3RydWN0IGliX3V2ZXJic19ldmVudCwgbGlzdCk7CisKKwlpZiAoZmlsZS0+aXNfYXN5bmMpCiAJCWV2ZW50c3ogPSBzaXplb2YgKHN0cnVjdCBpYl91dmVyYnNfYXN5bmNfZXZlbnRfZGVzYyk7Ci0JfSBlbHNlIHsKLQkJZXZlbnQgICA9IGxpc3RfZW50cnkoZmlsZS0+ZXZlbnRfbGlzdC5uZXh0LAotCQkJCSAgICAgc3RydWN0IGliX3V2ZXJic19jb21wX2V2ZW50LCBsaXN0KTsKKwllbHNlCiAJCWV2ZW50c3ogPSBzaXplb2YgKHN0cnVjdCBpYl91dmVyYnNfY29tcF9ldmVudF9kZXNjKTsKLQl9CiAKIAlpZiAoZXZlbnRzeiA+IGNvdW50KSB7CiAJCXJldCAgID0gLUVJTlZBTDsKIAkJZXZlbnQgPSBOVUxMOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCWxpc3RfZGVsKGZpbGUtPmV2ZW50X2xpc3QubmV4dCk7CisJCWlmIChldmVudC0+Y291bnRlcikgeworCQkJKysoKmV2ZW50LT5jb3VudGVyKTsKKwkJCWxpc3RfZGVsKCZldmVudC0+b2JqX2xpc3QpOworCQl9CisJfQogCiAJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT5sb2NrKTsKIApAQCAtMjU3LDE2ICsyNTksMTMgQEAKIAogc3RhdGljIHZvaWQgaWJfdXZlcmJzX2V2ZW50X3JlbGVhc2Uoc3RydWN0IGliX3V2ZXJic19ldmVudF9maWxlICpmaWxlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCXN0cnVjdCBpYl91dmVyYnNfZXZlbnQgKmVudHJ5LCAqdG1wOwogCiAJc3Bpbl9sb2NrX2lycSgmZmlsZS0+bG9jayk7CiAJaWYgKGZpbGUtPmZkICE9IC0xKSB7CiAJCWZpbGUtPmZkID0gLTE7Ci0JCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmZmlsZS0+ZXZlbnRfbGlzdCkKLQkJCWlmIChmaWxlLT5pc19hc3luYykKLQkJCQlrZnJlZShsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgaWJfdXZlcmJzX2FzeW5jX2V2ZW50LCBsaXN0KSk7Ci0JCQllbHNlCi0JCQkJa2ZyZWUobGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGliX3V2ZXJic19jb21wX2V2ZW50LCBsaXN0KSk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgdG1wLCAmZmlsZS0+ZXZlbnRfbGlzdCwgbGlzdCkKKwkJCWtmcmVlKGVudHJ5KTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT5sb2NrKTsKIH0KQEAgLTMwNCwxOCArMzAzLDIzIEBACiAKIHZvaWQgaWJfdXZlcmJzX2NvbXBfaGFuZGxlcihzdHJ1Y3QgaWJfY3EgKmNxLCB2b2lkICpjcV9jb250ZXh0KQogewotCXN0cnVjdCBpYl91dmVyYnNfZmlsZSAgICAgICAqZmlsZSA9IGNxX2NvbnRleHQ7Ci0Jc3RydWN0IGliX3V2ZXJic19jb21wX2V2ZW50ICplbnRyeTsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGZsYWdzOworCXN0cnVjdCBpYl91dmVyYnNfZmlsZSAgKmZpbGUgPSBjcV9jb250ZXh0OworCXN0cnVjdCBpYl91Y3Ffb2JqZWN0ICAgKnVvYmo7CisJc3RydWN0IGliX3V2ZXJic19ldmVudCAqZW50cnk7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7CiAKIAllbnRyeSA9IGttYWxsb2Moc2l6ZW9mICplbnRyeSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuOwogCi0JZW50cnktPmRlc2MuY3FfaGFuZGxlID0gY3EtPnVvYmplY3QtPnVzZXJfaGFuZGxlOworCXVvYmogPSBjb250YWluZXJfb2YoY3EtPnVvYmplY3QsIHN0cnVjdCBpYl91Y3Ffb2JqZWN0LCB1b2JqZWN0KTsKKworCWVudHJ5LT5kZXNjLmNvbXAuY3FfaGFuZGxlID0gY3EtPnVvYmplY3QtPnVzZXJfaGFuZGxlOworCWVudHJ5LT5jb3VudGVyCQkgICA9ICZ1b2JqLT5jb21wX2V2ZW50c19yZXBvcnRlZDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZmaWxlLT5jb21wX2ZpbGVbMF0ubG9jaywgZmxhZ3MpOwogCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmZmlsZS0+Y29tcF9maWxlWzBdLmV2ZW50X2xpc3QpOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5vYmpfbGlzdCwgJnVvYmotPmNvbXBfbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmlsZS0+Y29tcF9maWxlWzBdLmxvY2ssIGZsYWdzKTsKIAogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZmlsZS0+Y29tcF9maWxlWzBdLnBvbGxfd2FpdCk7CkBAIC0zMjMsMjAgKzMyNywyNSBAQAogfQogCiBzdGF0aWMgdm9pZCBpYl91dmVyYnNfYXN5bmNfaGFuZGxlcihzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCi0JCQkJICAgIF9fdTY0IGVsZW1lbnQsIF9fdTY0IGV2ZW50KQorCQkJCSAgICBfX3U2NCBlbGVtZW50LCBfX3U2NCBldmVudCwKKwkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqb2JqX2xpc3QsCisJCQkJICAgIHUzMiAqY291bnRlcikKIHsKLQlzdHJ1Y3QgaWJfdXZlcmJzX2FzeW5jX2V2ZW50ICplbnRyeTsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50ICplbnRyeTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZW50cnkgPSBrbWFsbG9jKHNpemVvZiAqZW50cnksIEdGUF9BVE9NSUMpOwogCWlmICghZW50cnkpCiAJCXJldHVybjsKIAotCWVudHJ5LT5kZXNjLmVsZW1lbnQgICAgPSBlbGVtZW50OwotCWVudHJ5LT5kZXNjLmV2ZW50X3R5cGUgPSBldmVudDsKKwllbnRyeS0+ZGVzYy5hc3luYy5lbGVtZW50ICAgID0gZWxlbWVudDsKKwllbnRyeS0+ZGVzYy5hc3luYy5ldmVudF90eXBlID0gZXZlbnQ7CisJZW50cnktPmNvdW50ZXIgICAgICAgICAgICAgICA9IGNvdW50ZXI7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZmlsZS0+YXN5bmNfZmlsZS5sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZmaWxlLT5hc3luY19maWxlLmV2ZW50X2xpc3QpOworCWlmIChvYmpfbGlzdCkKKwkJbGlzdF9hZGRfdGFpbCgmZW50cnktPm9ial9saXN0LCBvYmpfbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmlsZS0+YXN5bmNfZmlsZS5sb2NrLCBmbGFncyk7CiAKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmZpbGUtPmFzeW5jX2ZpbGUucG9sbF93YWl0KTsKQEAgLTM0NSwyMyArMzU0LDM5IEBACiAKIHZvaWQgaWJfdXZlcmJzX2NxX2V2ZW50X2hhbmRsZXIoc3RydWN0IGliX2V2ZW50ICpldmVudCwgdm9pZCAqY29udGV4dF9wdHIpCiB7Ci0JaWJfdXZlcmJzX2FzeW5jX2hhbmRsZXIoY29udGV4dF9wdHIsCi0JCQkJZXZlbnQtPmVsZW1lbnQuY3EtPnVvYmplY3QtPnVzZXJfaGFuZGxlLAotCQkJCWV2ZW50LT5ldmVudCk7CisJc3RydWN0IGliX3VjcV9vYmplY3QgKnVvYmo7CisKKwl1b2JqID0gY29udGFpbmVyX29mKGV2ZW50LT5lbGVtZW50LmNxLT51b2JqZWN0LAorCQkJICAgIHN0cnVjdCBpYl91Y3Ffb2JqZWN0LCB1b2JqZWN0KTsKKworCWliX3V2ZXJic19hc3luY19oYW5kbGVyKGNvbnRleHRfcHRyLCB1b2JqLT51b2JqZWN0LnVzZXJfaGFuZGxlLAorCQkJCWV2ZW50LT5ldmVudCwgJnVvYmotPmFzeW5jX2xpc3QsCisJCQkJJnVvYmotPmFzeW5jX2V2ZW50c19yZXBvcnRlZCk7CisJCQkJCiB9CiAKIHZvaWQgaWJfdXZlcmJzX3FwX2V2ZW50X2hhbmRsZXIoc3RydWN0IGliX2V2ZW50ICpldmVudCwgdm9pZCAqY29udGV4dF9wdHIpCiB7Ci0JaWJfdXZlcmJzX2FzeW5jX2hhbmRsZXIoY29udGV4dF9wdHIsCi0JCQkJZXZlbnQtPmVsZW1lbnQucXAtPnVvYmplY3QtPnVzZXJfaGFuZGxlLAotCQkJCWV2ZW50LT5ldmVudCk7CisJc3RydWN0IGliX3VldmVudF9vYmplY3QgKnVvYmo7CisKKwl1b2JqID0gY29udGFpbmVyX29mKGV2ZW50LT5lbGVtZW50LnFwLT51b2JqZWN0LAorCQkJICAgIHN0cnVjdCBpYl91ZXZlbnRfb2JqZWN0LCB1b2JqZWN0KTsKKworCWliX3V2ZXJic19hc3luY19oYW5kbGVyKGNvbnRleHRfcHRyLCB1b2JqLT51b2JqZWN0LnVzZXJfaGFuZGxlLAorCQkJCWV2ZW50LT5ldmVudCwgJnVvYmotPmV2ZW50X2xpc3QsCisJCQkJJnVvYmotPmV2ZW50c19yZXBvcnRlZCk7CiB9CiAKIHZvaWQgaWJfdXZlcmJzX3NycV9ldmVudF9oYW5kbGVyKHN0cnVjdCBpYl9ldmVudCAqZXZlbnQsIHZvaWQgKmNvbnRleHRfcHRyKQogewotCWliX3V2ZXJic19hc3luY19oYW5kbGVyKGNvbnRleHRfcHRyLAotCQkJCWV2ZW50LT5lbGVtZW50LnNycS0+dW9iamVjdC0+dXNlcl9oYW5kbGUsCi0JCQkJZXZlbnQtPmV2ZW50KTsKKwlzdHJ1Y3QgaWJfdWV2ZW50X29iamVjdCAqdW9iajsKKworCXVvYmogPSBjb250YWluZXJfb2YoZXZlbnQtPmVsZW1lbnQuc3JxLT51b2JqZWN0LAorCQkJICAgIHN0cnVjdCBpYl91ZXZlbnRfb2JqZWN0LCB1b2JqZWN0KTsKKworCWliX3V2ZXJic19hc3luY19oYW5kbGVyKGNvbnRleHRfcHRyLCB1b2JqLT51b2JqZWN0LnVzZXJfaGFuZGxlLAorCQkJCWV2ZW50LT5ldmVudCwgJnVvYmotPmV2ZW50X2xpc3QsCisJCQkJJnVvYmotPmV2ZW50c19yZXBvcnRlZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGliX3V2ZXJic19ldmVudF9oYW5kbGVyKHN0cnVjdCBpYl9ldmVudF9oYW5kbGVyICpoYW5kbGVyLApAQCAtMzcwLDcgKzM5NSw4IEBACiAJc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlID0KIAkJY29udGFpbmVyX29mKGhhbmRsZXIsIHN0cnVjdCBpYl91dmVyYnNfZmlsZSwgZXZlbnRfaGFuZGxlcik7CiAKLQlpYl91dmVyYnNfYXN5bmNfaGFuZGxlcihmaWxlLCBldmVudC0+ZWxlbWVudC5wb3J0X251bSwgZXZlbnQtPmV2ZW50KTsKKwlpYl91dmVyYnNfYXN5bmNfaGFuZGxlcihmaWxlLCBldmVudC0+ZWxlbWVudC5wb3J0X251bSwgZXZlbnQtPmV2ZW50LAorCQkJCU5VTEwsIE5VTEwpOwogfQogCiBzdGF0aWMgaW50IGliX3V2ZXJic19ldmVudF9pbml0KHN0cnVjdCBpYl91dmVyYnNfZXZlbnRfZmlsZSAqZmlsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jCmluZGV4IDMyNDFkNmMuLmZmYmNkNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYwpAQCAtOTM3LDEyICs5MzcsMTIgQEAKIAkJKyttdGhjYV92ZXJzaW9uX3ByaW50ZWQ7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyBQRlggIkluaXRpYWxpemluZyAlcyAoJXMpXG4iLAotCSAgICAgICBwY2lfcHJldHR5X25hbWUocGRldiksIHBjaV9uYW1lKHBkZXYpKTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiSW5pdGlhbGl6aW5nICVzXG4iLAorCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CiAKIAlpZiAoaWQtPmRyaXZlcl9kYXRhID49IEFSUkFZX1NJWkUobXRoY2FfaGNhX3RhYmxlKSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlcyAoJXMpIGhhcyBpbnZhbGlkIGRyaXZlciBkYXRhICVseFxuIiwKLQkJICAgICAgIHBjaV9wcmV0dHlfbmFtZShwZGV2KSwgcGNpX25hbWUocGRldiksIGlkLT5kcml2ZXJfZGF0YSk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzIGhhcyBpbnZhbGlkIGRyaXZlciBkYXRhICVseFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBpZC0+ZHJpdmVyX2RhdGEpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKaW5kZXggMDE2NGI4NC4uYmNlZjA2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKQEAgLTIyMCw2ICsyMjAsMTYgQEAKIAkJCSAoUEFHRV9TSVpFIC0gMSkpOwogfQogCitzdGF0aWMgdm9pZCBtdGhjYV93cV9pbml0KHN0cnVjdCBtdGhjYV93cSAqd3EpCit7CisJc3Bpbl9sb2NrX2luaXQoJndxLT5sb2NrKTsKKwl3cS0+bmV4dF9pbmQgID0gMDsKKwl3cS0+bGFzdF9jb21wID0gd3EtPm1heCAtIDE7CisJd3EtPmhlYWQgICAgICA9IDA7CisJd3EtPnRhaWwgICAgICA9IDA7CisJd3EtPmxhc3QgICAgICA9IE5VTEw7Cit9CisKIHZvaWQgbXRoY2FfcXBfZXZlbnQoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MzIgcXBuLAogCQkgICAgZW51bSBpYl9ldmVudF90eXBlIGV2ZW50X3R5cGUpCiB7CkBAIC04MzMsOCArODQzLDggQEAKIAkJc3RvcmVfYXR0cnModG9fbXNxcChxcCksIGF0dHIsIGF0dHJfbWFzayk7CiAKIAkvKgotCSAqIElmIHdlIGFyZSBtb3ZpbmcgUVAwIHRvIFJUUiwgYnJpbmcgdGhlIElCIGxpbmsgdXA7IGlmIHdlCi0JICogYXJlIG1vdmluZyBRUDAgdG8gUkVTRVQgb3IgRVJST1IsIGJyaW5nIHRoZSBsaW5rIGJhY2sgZG93bi4KKwkgKiBJZiB3ZSBtb3ZlZCBRUDAgdG8gUlRSLCBicmluZyB0aGUgSUIgbGluayB1cDsgaWYgd2UgbW92ZWQKKwkgKiBRUDAgdG8gUkVTRVQgb3IgRVJST1IsIGJyaW5nIHRoZSBsaW5rIGJhY2sgZG93bi4KIAkgKi8KIAlpZiAoaXNfcXAwKGRldiwgcXApKSB7CiAJCWlmIChjdXJfc3RhdGUgIT0gSUJfUVBTX1JUUiAmJgpAQCAtODQ4LDYgKzg1OCwyNiBAQAogCQkJbXRoY2FfQ0xPU0VfSUIoZGV2LCB0b19tc3FwKHFwKS0+cG9ydCwgJnN0YXR1cyk7CiAJfQogCisJLyoKKwkgKiBJZiB3ZSBtb3ZlZCBhIGtlcm5lbCBRUCB0byBSRVNFVCwgY2xlYW4gdXAgYWxsIG9sZCBDUQorCSAqIGVudHJpZXMgYW5kIHJlaW5pdGlhbGl6ZSB0aGUgUVAuCisJICovCisJaWYgKCFlcnIgJiYgbmV3X3N0YXRlID09IElCX1FQU19SRVNFVCAmJiAhcXAtPmlicXAudW9iamVjdCkgeworCQltdGhjYV9jcV9jbGVhbihkZXYsIHRvX21jcShxcC0+aWJxcC5zZW5kX2NxKS0+Y3FuLCBxcC0+cXBuLAorCQkJICAgICAgIHFwLT5pYnFwLnNycSA/IHRvX21zcnEocXAtPmlicXAuc3JxKSA6IE5VTEwpOworCQlpZiAocXAtPmlicXAuc2VuZF9jcSAhPSBxcC0+aWJxcC5yZWN2X2NxKQorCQkJbXRoY2FfY3FfY2xlYW4oZGV2LCB0b19tY3EocXAtPmlicXAucmVjdl9jcSktPmNxbiwgcXAtPnFwbiwKKwkJCQkgICAgICAgcXAtPmlicXAuc3JxID8gdG9fbXNycShxcC0+aWJxcC5zcnEpIDogTlVMTCk7CisKKwkJbXRoY2Ffd3FfaW5pdCgmcXAtPnNxKTsKKwkJbXRoY2Ffd3FfaW5pdCgmcXAtPnJxKTsKKworCQlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKSB7CisJCQkqcXAtPnNxLmRiID0gMDsKKwkJCSpxcC0+cnEuZGIgPSAwOworCQl9CisJfQorCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTAwMywxNiArMTAzMyw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBtdGhjYV93cV9pbml0KHN0cnVjdCBtdGhjYV93cSogd3EpCi17Ci0Jc3Bpbl9sb2NrX2luaXQoJndxLT5sb2NrKTsKLQl3cS0+bmV4dF9pbmQgID0gMDsKLQl3cS0+bGFzdF9jb21wID0gd3EtPm1heCAtIDE7Ci0Jd3EtPmhlYWQgICAgICA9IDA7Ci0Jd3EtPnRhaWwgICAgICA9IDA7Ci0Jd3EtPmxhc3QgICAgICA9IE5VTEw7Ci19Ci0KIHN0YXRpYyBpbnQgbXRoY2FfYWxsb2NfcXBfY29tbW9uKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKIAkJCQkgc3RydWN0IG10aGNhX3BkICpwZCwKIAkJCQkgc3RydWN0IG10aGNhX2NxICpzZW5kX2NxLApAQCAtMTAyNCw2ICsxMDQ0LDcgQEAKIAlpbnQgaTsKIAogCWF0b21pY19zZXQoJnFwLT5yZWZjb3VudCwgMSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcXAtPndhaXQpOwogCXFwLT5zdGF0ZSAgICAJID0gSUJfUVBTX1JFU0VUOwogCXFwLT5hdG9taWNfcmRfZW4gPSAwOwogCXFwLT5yZXNwX2RlcHRoICAgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Jlc2V0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcmVzZXQuYwppbmRleCA4ZWE4MDEyLi40Zjk5NTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcmVzZXQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcmVzZXQuYwpAQCAtNzEsOCArNzEsOCBAQAogCQkJCQkJYnJpZGdlKSkgIT0gTlVMTCkgewogCQkJaWYgKGJyaWRnZS0+aGRyX3R5cGUgICAgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSAmJgogCQkJICAgIGJyaWRnZS0+c3Vib3JkaW5hdGUgPT0gbWRldi0+cGRldi0+YnVzKSB7Ci0JCQkJbXRoY2FfZGJnKG1kZXYsICJGb3VuZCBicmlkZ2U6ICVzICglcylcbiIsCi0JCQkJCSAgcGNpX3ByZXR0eV9uYW1lKGJyaWRnZSksIHBjaV9uYW1lKGJyaWRnZSkpOworCQkJCW10aGNhX2RiZyhtZGV2LCAiRm91bmQgYnJpZGdlOiAlc1xuIiwKKwkJCQkJICBwY2lfbmFtZShicmlkZ2UpKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtODMsOCArODMsOCBAQAogCQkJICogYXNzdW1lIHdlJ3JlIGluIG5vLWJyaWRnZSBtb2RlIGFuZCBob3BlIGZvcgogCQkJICogdGhlIGJlc3QuCiAJCQkgKi8KLQkJCW10aGNhX3dhcm4obWRldiwgIk5vIGJyaWRnZSBmb3VuZCBmb3IgJXMgKCVzKVxuIiwKLQkJCQkgIHBjaV9wcmV0dHlfbmFtZShtZGV2LT5wZGV2KSwgcGNpX25hbWUobWRldi0+cGRldikpOworCQkJbXRoY2Ffd2FybihtZGV2LCAiTm8gYnJpZGdlIGZvdW5kIGZvciAlc1xuIiwKKwkJCQkgIHBjaV9uYW1lKG1kZXYtPnBkZXYpKTsKIAkJfQogCiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwppbmRleCAwZThhYzEzLi40OWQxMjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwpAQCAtMTA2Miw2ICsxMDYyLDggQEAKIAkJaXBvaWJfZGV2X2NsZWFudXAocHJpdi0+ZGV2KTsKIAkJZnJlZV9uZXRkZXYocHJpdi0+ZGV2KTsKIAl9CisKKwlrZnJlZShkZXZfbGlzdCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGlwb2liX2luaXRfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2V2ZGV2LmMgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKaW5kZXggMjBlM2ExNi4uMzczOGQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9ldmRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZXZkZXYuYwpAQCAtMTYwLDYgKzE2MCw4IEBACiAjICBkZWZpbmUgQ09NUEFUX1RFU1QgSVNfSUEzMl9QUk9DRVNTKGlhNjRfdGFza19yZWdzKGN1cnJlbnQpKQogI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9TMzkwKQogIyAgZGVmaW5lIENPTVBBVF9URVNUIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMxQklUKQorI2VsaWYgZGVmaW5lZChDT05GSUdfTUlQUykKKyMgIGRlZmluZSBDT01QQVRfVEVTVCAoY3VycmVudC0+dGhyZWFkLm1mbGFncyAmIE1GXzMyQklUX0FERFIpCiAjZWxzZQogIyAgZGVmaW5lIENPTVBBVF9URVNUIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKQogI2VuZGlmCkBAIC0zMjAsNyArMzIyLDcgQEAKIAkJCWlmICh0IDwgMCB8fCB0ID49IGRldi0+a2V5Y29kZW1heCB8fCAhZGV2LT5rZXljb2Rlc2l6ZSkgcmV0dXJuIC1FSU5WQUw7CiAJCQlpZiAoZ2V0X3VzZXIodiwgaXAgKyAxKSkgcmV0dXJuIC1FRkFVTFQ7CiAJCQlpZiAodiA8IDAgfHwgdiA+IEtFWV9NQVgpIHJldHVybiAtRUlOVkFMOwotCQkJaWYgKHYgPj4gKGRldi0+a2V5Y29kZXNpemUgKiA4KSkgcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZGV2LT5rZXljb2Rlc2l6ZSA8IHNpemVvZih2KSAmJiAodiA+PiAoZGV2LT5rZXljb2Rlc2l6ZSAqIDgpKSkgcmV0dXJuIC1FSU5WQUw7CiAJCQl1ID0gU0VUX0lOUFVUX0tFWUNPREUoZGV2LCB0LCB2KTsKIAkJCWNsZWFyX2JpdCh1LCBkZXYtPmtleWJpdCk7CiAJCQlzZXRfYml0KHYsIGRldi0+a2V5Yml0KTsKQEAgLTM5MSw2ICszOTMsNyBAQAogCQkJCQkJY2FzZSBFVl9MRUQ6IGJpdHMgPSBkZXYtPmxlZGJpdDsgbGVuID0gTEVEX01BWDsgYnJlYWs7CiAJCQkJCQljYXNlIEVWX1NORDogYml0cyA9IGRldi0+c25kYml0OyBsZW4gPSBTTkRfTUFYOyBicmVhazsKIAkJCQkJCWNhc2UgRVZfRkY6ICBiaXRzID0gZGV2LT5mZmJpdDsgIGxlbiA9IEZGX01BWDsgIGJyZWFrOworCQkJCQkJY2FzZSBFVl9TVzogIGJpdHMgPSBkZXYtPnN3Yml0OyAgbGVuID0gU1dfTUFYOyAgYnJlYWs7CiAJCQkJCQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKIAkJCQkJfQogCQkJCQlsZW4gPSBOQklUUyhsZW4pICogc2l6ZW9mKGxvbmcpOwpAQCAtNDE5LDYgKzQyMiwxMyBAQAogCQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+c25kLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKIAkJCQl9CiAKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHU1coMCkpKSB7CisJCQkJCWludCBsZW47CisJCQkJCWxlbiA9IE5CSVRTKFNXX01BWCkgKiBzaXplb2YobG9uZyk7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5zdywgbGVuKSA/IC1FRkFVTFQgOiBsZW47CisJCQkJfQorCiAJCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR05BTUUoMCkpKSB7CiAJCQkJCWludCBsZW47CiAJCQkJCWlmICghZGV2LT5uYW1lKSByZXR1cm4gLUVOT0VOVDsKQEAgLTQ5OSw3ICs1MDksNyBAQAogCWludCBsZW4gPSBOQklUU19DT01QQVQoKG1heCkpICogc2l6ZW9mKGNvbXBhdF9sb25nX3QpOyBcCiAJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsgXAogCWZvciAoaSA9IDA7IGkgPCBsZW4gLyBzaXplb2YoY29tcGF0X2xvbmdfdCk7IGkrKykgXAotCQlpZiAoY29weV90b191c2VyKChjb21wYXRfbG9uZ190KikgcCArIGksIFwKKwkJaWYgKGNvcHlfdG9fdXNlcigoY29tcGF0X2xvbmdfdCBfX3VzZXIgKikgcCArIGksIFwKIAkJCQkgKGNvbXBhdF9sb25nX3QqKSAoYml0KSArIGkgKyAxIC0gKChpICUgMikgPDwgMSksIFwKIAkJCQkgc2l6ZW9mKGNvbXBhdF9sb25nX3QpKSkgXAogCQkJcmV0dXJuIC1FRkFVTFQ7IFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZW11MTBrMS1ncC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9lbXUxMGsxLWdwLmMKaW5kZXggYTAxMTgwMy4uNDYyZjhkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9lbXUxMGsxLWdwLmMKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9lbXUxMGsxLWdwLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvcG9ydCwgaW9sZW4sICJlbXUxMGsxLWdwIikpCiAJCXJldHVybiAtRUJVU1k7CiAKLQllbXUgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZW11KSwgR0ZQX0tFUk5FTCk7CisJZW11ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVtdSksIEdGUF9LRVJORUwpOwogCXBvcnQgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFlbXUgfHwgIXBvcnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxLWdwOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9mbTgwMS1ncC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9mbTgwMS1ncC5jCmluZGV4IDU3NjE1YmMuLjQ3ZTkzZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZm04MDEtZ3AuYworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2ZtODAxLWdwLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAlzdHJ1Y3QgZm04MDFfZ3AgKmdwOwogCXN0cnVjdCBnYW1lcG9ydCAqcG9ydDsKIAotCWdwID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGZtODAxX2dwKSwgR0ZQX0tFUk5FTCk7CisJZ3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZm04MDFfZ3ApLCBHRlBfS0VSTkVMKTsKIAlwb3J0ID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwogCWlmICghZ3AgfHwgIXBvcnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmbTgwMS1ncDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvbnM1NTguYyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvbnM1NTguYwppbmRleCA3MGYwNTE4Li5kMmU1NWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L25zNTU4LmMKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9uczU1OC5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIAkJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JbnM1NTggPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbnM1NTgpLCBHRlBfS0VSTkVMKTsKKwluczU1OCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuczU1OCksIEdGUF9LRVJORUwpOwogCXBvcnQgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFuczU1OCB8fCAhcG9ydCkgewogCQlwcmludGsoS0VSTl9FUlIgIm5zNTU4OiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKQEAgLTIxNSw3ICsyMTUsNyBAQAogCWlmICghcmVxdWVzdF9yZWdpb24oaW9wb3J0LCBpb2xlbiwgIm5zNTU4LXBucCIpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JbnM1NTggPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbnM1NTgpLCBHRlBfS0VSTkVMKTsKKwluczU1OCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuczU1OCksIEdGUF9LRVJORUwpOwogCXBvcnQgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFuczU1OCB8fCAhcG9ydCkgewogCQlwcmludGsoS0VSTl9FUlIgIm5zNTU4OiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCmluZGV4IGEyNzUyMTEuLjg4NjM2YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKQEAgLTg5LDYgKzg5LDE1IEBACiAKIAkJCWJyZWFrOwogCisJCWNhc2UgRVZfU1c6CisKKwkJCWlmIChjb2RlID4gU1dfTUFYIHx8ICF0ZXN0X2JpdChjb2RlLCBkZXYtPnN3Yml0KSB8fCAhIXRlc3RfYml0KGNvZGUsIGRldi0+c3cpID09IHZhbHVlKQorCQkJCXJldHVybjsKKworCQkJY2hhbmdlX2JpdChjb2RlLCBkZXYtPnN3KTsKKworCQkJYnJlYWs7CisKIAkJY2FzZSBFVl9BQlM6CiAKIAkJCWlmIChjb2RlID4gQUJTX01BWCB8fCAhdGVzdF9iaXQoY29kZSwgZGV2LT5hYnNiaXQpKQpAQCAtNDAyLDYgKzQxMSw3IEBACiAJU1BSSU5URl9CSVRfQTIobGVkYml0LCAiTEVEPSIsIExFRF9NQVgsIEVWX0xFRCk7CiAJU1BSSU5URl9CSVRfQTIoc25kYml0LCAiU05EPSIsIFNORF9NQVgsIEVWX1NORCk7CiAJU1BSSU5URl9CSVRfQTIoZmZiaXQsICAiRkY9IiwgIEZGX01BWCwgRVZfRkYpOworCVNQUklOVEZfQklUX0EyKHN3Yml0LCAgIlNXPSIsICBTV19NQVgsIEVWX1NXKTsKIAogCWVudnBbaSsrXSA9IE5VTEw7CiAKQEAgLTQ5MCw2ICs1MDAsNyBAQAogCQlTUFJJTlRGX0JJVF9CMihsZWRiaXQsICJMRUQ9IiwgTEVEX01BWCwgRVZfTEVEKTsKIAkJU1BSSU5URl9CSVRfQjIoc25kYml0LCAiU05EPSIsIFNORF9NQVgsIEVWX1NORCk7CiAJCVNQUklOVEZfQklUX0IyKGZmYml0LCAgIkZGPSIsICBGRl9NQVgsIEVWX0ZGKTsKKwkJU1BSSU5URl9CSVRfQjIoc3diaXQsICAiU1c9IiwgIFNXX01BWCwgRVZfU1cpOwogCiAJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlxuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYTNkLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2EzZC5jCmluZGV4IGJmMzRmNzUuLmJmNjU0MzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2EzZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYTNkLmMKQEAgLTI2OSw3ICsyNjksNyBAQAogCWludCBpOwogCWludCBlcnI7CiAKLQlpZiAoIShhM2QgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgYTNkKSwgR0ZQX0tFUk5FTCkpKQorCWlmICghKGEzZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhM2QpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJYTNkLT5nYW1lcG9ydCA9IGdhbWVwb3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hZGkuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYWRpLmMKaW5kZXggMjY1OTYyOS4uY2YzNWFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hZGkuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FkaS5jCkBAIC00NjksNyArNDY5LDcgQEAKIAlpbnQgaTsKIAlpbnQgZXJyOwogCi0JaWYgKCEocG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBhZGlfcG9ydCksIEdGUF9LRVJORUwpKSkKKwlpZiAoIShwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkaV9wb3J0KSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXBvcnQtPmdhbWVwb3J0ID0gZ2FtZXBvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbmFsb2cuYwppbmRleCBjM2E1NzM5Li42NGIxMzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW5hbG9nLmMKQEAgLTY1NSw3ICs2NTUsNyBAQAogCWludCBpOwogCWludCBlcnI7CiAKLQlpZiAoIShwb3J0ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGFuYWxvZ19wb3J0KSwgR0ZQX0tFUk5FTCkpKQorCWlmICghKHBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYW5hbG9nX3BvcnQpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtIEVOT01FTTsKIAogCWVyciA9IGFuYWxvZ19pbml0X3BvcnQoZ2FtZXBvcnQsIGRydiwgcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2NvYnJhLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2NvYnJhLmMKaW5kZXggYTYwMDIyMC4uMGIyZTlmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9jb2JyYS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svY29icmEuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJaW50IGksIGo7CiAJaW50IGVycjsKIAotCWlmICghKGNvYnJhID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGNvYnJhKSwgR0ZQX0tFUk5FTCkpKQorCWlmICghKGNvYnJhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvYnJhKSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWNvYnJhLT5nYW1lcG9ydCA9IGdhbWVwb3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9kYjkuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZGI5LmMKaW5kZXggZmJkM2VlZC4uMmEzZTRiYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZGI5LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9kYjkuYwpAQCAtNTcyLDcgKzU3Miw3IEBACiAJCX0KIAl9CiAKLQlpZiAoIShkYjkgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZGI5KSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEoZGI5ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRiOSksIEdGUF9LRVJORUwpKSkgewogCQlwYXJwb3J0X3B1dF9wb3J0KHBwKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nYW1lY29uLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dhbWVjb24uYwppbmRleCA5NWJiZGQzLi41NDI3YmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dhbWVjb24uYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dhbWVjb24uYwpAQCAtNTU0LDcgKzU1NCw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmICghKGdjID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGdjKSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEoZ2MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ2MpLCBHRlBfS0VSTkVMKSkpIHsKIAkJcGFycG9ydF9wdXRfcG9ydChwcCk7CiAJCXJldHVybiBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2Yyay5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nZjJrLmMKaW5kZXggN2Q5Njk0Mi4uOGU0ZjkyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nZjJrLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nZjJrLmMKQEAgLTI0Miw3ICsyNDIsNyBAQAogCXVuc2lnbmVkIGNoYXIgZGF0YVtHRjJLX0xFTkdUSF07CiAJaW50IGksIGVycjsKIAotCWlmICghKGdmMmsgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZ2YyayksIEdGUF9LRVJORUwpKSkKKwlpZiAoIShnZjJrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdmMmspLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJZ2Yyay0+Z2FtZXBvcnQgPSBnYW1lcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ncmlwLmMKaW5kZXggZDE1MDBkMi4uOWQzZjkxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ncmlwLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ncmlwLmMKQEAgLTMwMSw3ICszMDEsNyBAQAogCWludCBpLCBqLCB0OwogCWludCBlcnI7CiAKLQlpZiAoIShncmlwID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGdyaXApLCBHRlBfS0VSTkVMKSkpCisJaWYgKCEoZ3JpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBncmlwKSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWdyaXAtPmdhbWVwb3J0ID0gZ2FtZXBvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dyaXBfbXAuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCmluZGV4IDBkYTdiZDEuLmRhMTdlZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCkBAIC02MDcsNyArNjA3LDcgQEAKIAlzdHJ1Y3QgZ3JpcF9tcCAqZ3JpcDsKIAlpbnQgZXJyOwogCi0JaWYgKCEoZ3JpcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBncmlwX21wKSwgR0ZQX0tFUk5FTCkpKQorCWlmICghKGdyaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ3JpcF9tcCksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlncmlwLT5nYW1lcG9ydCA9IGdhbWVwb3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ndWlsbGVtb3QuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3VpbGxlbW90LmMKaW5kZXggZjkzZGE3Yi4uNmE3MGVjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ndWlsbGVtb3QuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2d1aWxsZW1vdC5jCkBAIC0xODMsNyArMTgzLDcgQEAKIAlpbnQgaSwgdDsKIAlpbnQgZXJyOwogCi0JaWYgKCEoZ3VpbGxlbW90ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGd1aWxsZW1vdCksIEdGUF9LRVJORUwpKSkKKwlpZiAoIShndWlsbGVtb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ3VpbGxlbW90KSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWd1aWxsZW1vdC0+Z2FtZXBvcnQgPSBnYW1lcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1wYWNrZXRzLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtcGFja2V0cy5jCmluZGV4IDU4NzI4ZWIuLmU1YTMxZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1wYWNrZXRzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLXBhY2tldHMuYwpAQCAtMjQ5LDkgKzI0OSw2IEBACiAKIGludCBpZm9yY2VfZ2V0X2lkX3BhY2tldChzdHJ1Y3QgaWZvcmNlICppZm9yY2UsIGNoYXIgKnBhY2tldCkKIHsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQlpbnQgdGltZW91dCA9IEhaOyAvKiAxIHNlY29uZCAqLwotCiAJc3dpdGNoIChpZm9yY2UtPmJ1cykgewogCiAJY2FzZSBJRk9SQ0VfVVNCOgpAQCAtMjYwLDIyICsyNTcsMTMgQEAKIAkJaWZvcmNlLT5jci5iUmVxdWVzdCA9IHBhY2tldFswXTsKIAkJaWZvcmNlLT5jdHJsLT5kZXYgPSBpZm9yY2UtPnVzYmRldjsKIAotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlhZGRfd2FpdF9xdWV1ZSgmaWZvcmNlLT53YWl0LCAmd2FpdCk7Ci0KLQkJaWYgKHVzYl9zdWJtaXRfdXJiKGlmb3JjZS0+Y3RybCwgR0ZQX0FUT01JQykpIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZSgmaWZvcmNlLT53YWl0LCAmd2FpdCk7CisJCWlmICh1c2Jfc3VibWl0X3VyYihpZm9yY2UtPmN0cmwsIEdGUF9BVE9NSUMpKQogCQkJcmV0dXJuIC0xOwotCQl9CiAKLQkJd2hpbGUgKHRpbWVvdXQgJiYgaWZvcmNlLT5jdHJsLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQotCQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGlmb3JjZS0+d2FpdCwKKwkJCWlmb3JjZS0+Y3RybC0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUywgSFopOwogCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZpZm9yY2UtPndhaXQsICZ3YWl0KTsKLQotCQlpZiAoIXRpbWVvdXQpIHsKKwkJaWYgKGlmb3JjZS0+Y3RybC0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykgewogCQkJdXNiX3VubGlua191cmIoaWZvcmNlLT5jdHJsKTsKIAkJCXJldHVybiAtMTsKIAkJfQpAQCAtMjkwLDE2ICsyNzgsMTAgQEAKIAkJaWZvcmNlLT5leHBlY3RfcGFja2V0ID0gRkZfQ01EX1FVRVJZOwogCQlpZm9yY2Vfc2VuZF9wYWNrZXQoaWZvcmNlLCBGRl9DTURfUVVFUlksIHBhY2tldCk7CiAKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJYWRkX3dhaXRfcXVldWUoJmlmb3JjZS0+d2FpdCwgJndhaXQpOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpZm9yY2UtPndhaXQsCisJCQkhaWZvcmNlLT5leHBlY3RfcGFja2V0LCBIWik7CiAKLQkJd2hpbGUgKHRpbWVvdXQgJiYgaWZvcmNlLT5leHBlY3RfcGFja2V0KQotCQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0KLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJcmVtb3ZlX3dhaXRfcXVldWUoJmlmb3JjZS0+d2FpdCwgJndhaXQpOwotCi0JCWlmICghdGltZW91dCkgeworCQlpZiAoaWZvcmNlLT5leHBlY3RfcGFja2V0KSB7CiAJCQlpZm9yY2UtPmV4cGVjdF9wYWNrZXQgPSAwOwogCQkJcmV0dXJuIC0xOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtdXNiLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtdXNiLmMKaW5kZXggNjM2OWEyNC4uNTg2MDBmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLXVzYi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS11c2IuYwpAQCAtOTUsNiArOTUsNyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCisJd2FrZV91cCgmaWZvcmNlLT53YWl0KTsKIAlpZm9yY2VfcHJvY2Vzc19wYWNrZXQoaWZvcmNlLAogCQkoaWZvcmNlLT5kYXRhWzBdIDw8IDgpIHwgKHVyYi0+YWN0dWFsX2xlbmd0aCAtIDEpLCBpZm9yY2UtPmRhdGEgKyAxLCByZWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pbnRlcmFjdC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pbnRlcmFjdC5jCmluZGV4IDlkM2Y4YzMuLmQ3YjM0NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaW50ZXJhY3QuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2ludGVyYWN0LmMKQEAgLTIxMiw3ICsyMTIsNyBAQAogCWludCBpLCB0OwogCWludCBlcnI7CiAKLQlpZiAoIShpbnRlcmFjdCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBpbnRlcmFjdCksIEdGUF9LRVJORUwpKSkKKwlpZiAoIShpbnRlcmFjdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnRlcmFjdCksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpbnRlcmFjdC0+Z2FtZXBvcnQgPSBnYW1lcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc2lkZXdpbmRlci5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zaWRld2luZGVyLmMKaW5kZXggNDcxNDRhNy4uOWUwMzUzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zaWRld2luZGVyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zaWRld2luZGVyLmMKQEAgLTU5MCw3ICs1OTAsNyBAQAogCiAJY29tbWVudFswXSA9IDA7CiAKLQlzdyA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzdyksIEdGUF9LRVJORUwpOworCXN3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN3KSwgR0ZQX0tFUk5FTCk7CiAJYnVmID0ga21hbGxvYyhTV19MRU5HVEgsIEdGUF9LRVJORUwpOwogCWlkYnVmID0ga21hbGxvYyhTV19MRU5HVEgsIEdGUF9LRVJORUwpOwogCWlmICghc3cgfHwgIWJ1ZiB8fCAhaWRidWYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdG1kYy5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay90bWRjLmMKaW5kZXggOWViOTk1NC4uNzQzMWVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay90bWRjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay90bWRjLmMKQEAgLTI2Miw3ICsyNjIsNyBAQAogCWludCBpLCBqLCBrLCBsLCBtOwogCWludCBlcnI7CiAKLQlpZiAoISh0bWRjID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRtZGMpLCBHRlBfS0VSTkVMKSkpCisJaWYgKCEodG1kYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bWRjKSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXRtZGMtPmdhbWVwb3J0ID0gZ2FtZXBvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3R1cmJvZ3JhZnguYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHVyYm9ncmFmeC5jCmluZGV4IDI4MTAwZDQuLjBjNWI5YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHVyYm9ncmFmeC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHVyYm9ncmFmeC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKCEodGdmeCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0Z2Z4KSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEodGdmeCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0Z2Z4KSwgR0ZQX0tFUk5FTCkpKSB7CiAJCXBhcnBvcnRfcHV0X3BvcnQocHApOwogCQlyZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKaW5kZXggNGQ0OTg1Yi4uMWFkOGMyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYwpAQCAtMjA4LDYgKzIwOCw3IEBACiAJdW5zaWduZWQgY2hhciByZXNlbmQ7CiAJdW5zaWduZWQgY2hhciByZWxlYXNlOwogCXVuc2lnbmVkIGNoYXIgYmF0X3hsOworCXVuc2lnbmVkIGNoYXIgZXJyX3hsOwogCXVuc2lnbmVkIGludCBsYXN0OwogCXVuc2lnbmVkIGxvbmcgdGltZTsKIH07CkBAIC0yOTYsMTUgKzI5NywxOCBAQAogCQlpZiAoYXRrYmQtPmVtdWwgfHwKIAkJICAgICEoY29kZSA9PSBBVEtCRF9SRVRfRU1VTDAgfHwgY29kZSA9PSBBVEtCRF9SRVRfRU1VTDEgfHwKIAkJICAgICAgY29kZSA9PSBBVEtCRF9SRVRfSEFOR1VFTCB8fCBjb2RlID09IEFUS0JEX1JFVF9IQU5KQSB8fAotCQkgICAgICBjb2RlID09IEFUS0JEX1JFVF9FUlIgfHwKKwkJICAgICAoY29kZSA9PSBBVEtCRF9SRVRfRVJSICYmICFhdGtiZC0+ZXJyX3hsKSB8fAogCSAgICAgICAgICAgICAoY29kZSA9PSBBVEtCRF9SRVRfQkFUICYmICFhdGtiZC0+YmF0X3hsKSkpIHsKIAkJCWF0a2JkLT5yZWxlYXNlID0gY29kZSA+PiA3OwogCQkJY29kZSAmPSAweDdmOwogCQl9CiAKLQkJaWYgKCFhdGtiZC0+ZW11bCAmJgotCQkgICAgIChjb2RlICYgMHg3ZikgPT0gKEFUS0JEX1JFVF9CQVQgJiAweDdmKSkKKwkJaWYgKCFhdGtiZC0+ZW11bCkgeworCQkgICAgIGlmICgoY29kZSAmIDB4N2YpID09IChBVEtCRF9SRVRfQkFUICYgMHg3ZikpCiAJCQlhdGtiZC0+YmF0X3hsID0gIWF0a2JkLT5yZWxlYXNlOworCQkgICAgIGlmICgoY29kZSAmIDB4N2YpID09IChBVEtCRF9SRVRfRVJSICYgMHg3ZikpCisJCQlhdGtiZC0+ZXJyX3hsID0gIWF0a2JkLT5yZWxlYXNlOworCQl9CiAJfQogCiAJc3dpdGNoIChjb2RlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nvcmdpa2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nvcmdpa2JkLmMKaW5kZXggYTg1NTE3MS4uY2Q0YjZlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jb3JnaWtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY29yZ2lrYmQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMzIsNyArMzMsNiBAQAogLyogemVybyBjb2RlLCAxMjQgc2NhbmNvZGVzICsgMyBoaW5nZSBjb21iaW5hdGlvbnMgKi8KICNkZWZpbmUJTlJfU0NBTkNPREVTCQkoIFNDQU5DT0RFKEtCX1JPV1MtMSxLQl9DT0xTLTEpICsxICsxICszICkKICNkZWZpbmUgU0NBTl9JTlRFUlZBTAkJKEhaLzEwKQotI2RlZmluZSBDT1JHSUtCRF9QUkVTU0VECTEKIAogI2RlZmluZSBISU5HRV9TQ0FOX0lOVEVSVkFMCQkoSFovNCkKIApAQCAtNzMsMjUgKzczLDEzIEBACiAJc3RydWN0IGlucHV0X2RldiBpbnB1dDsKIAljaGFyIHBoeXNbMzJdOwogCi0JdW5zaWduZWQgY2hhciBzdGF0ZVtBUlJBWV9TSVpFKGNvcmdpa2JkX2tleWNvZGUpXTsKIAlzcGlubG9ja190IGxvY2s7Ci0KIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBodGltZXI7Ci19OwogCi1zdGF0aWMgdm9pZCBoYW5kbGVfc2NhbmNvZGUodW5zaWduZWQgaW50IHByZXNzZWQsdW5zaWduZWQgaW50IHNjYW5jb2RlLCBzdHJ1Y3QgY29yZ2lrYmQgKmNvcmdpa2JkX2RhdGEpCi17Ci0JaWYgKHByZXNzZWQgJiYgIShjb3JnaWtiZF9kYXRhLT5zdGF0ZVtzY2FuY29kZV0gJiBDT1JHSUtCRF9QUkVTU0VEKSkgewotCQljb3JnaWtiZF9kYXRhLT5zdGF0ZVtzY2FuY29kZV0gfD0gQ09SR0lLQkRfUFJFU1NFRDsKLQkJaW5wdXRfcmVwb3J0X2tleSgmY29yZ2lrYmRfZGF0YS0+aW5wdXQsIGNvcmdpa2JkX2RhdGEtPmtleWNvZGVbc2NhbmNvZGVdLCAxKTsKLQkJaWYgKGNvcmdpa2JkX2RhdGEtPmtleWNvZGVbc2NhbmNvZGVdID09IENPUkdJX0tFWV9PRkYpCi0JCQlpbnB1dF9ldmVudCgmY29yZ2lrYmRfZGF0YS0+aW5wdXQsIEVWX1BXUiwgQ09SR0lfS0VZX09GRiwgMSk7Ci0JfSBlbHNlIGlmICghcHJlc3NlZCAmJiBjb3JnaWtiZF9kYXRhLT5zdGF0ZVtzY2FuY29kZV0gJiBDT1JHSUtCRF9QUkVTU0VEKSB7Ci0JCWNvcmdpa2JkX2RhdGEtPnN0YXRlW3NjYW5jb2RlXSAmPSB+Q09SR0lLQkRfUFJFU1NFRDsKLQkJaW5wdXRfcmVwb3J0X2tleSgmY29yZ2lrYmRfZGF0YS0+aW5wdXQsIGNvcmdpa2JkX2RhdGEtPmtleWNvZGVbc2NhbmNvZGVdLCAwKTsKLQl9Ci19CisJdW5zaWduZWQgaW50IHN1c3BlbmRlZDsKKwl1bnNpZ25lZCBsb25nIHN1c3BlbmRfamlmZmllczsKK307CiAKICNkZWZpbmUgS0JfRElTQ0hBUkdFX0RFTEFZCTEwCiAjZGVmaW5lIEtCX0FDVElWQVRFX0RFTEFZCTEwCkBAIC0xMDUsMzYgKzkzLDM2IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3JnaWtiZF9kaXNjaGFyZ2VfYWxsKHZvaWQpCiB7Ci0JLy8gU1RST0JFIEFsbCBIaVoKKwkvKiBTVFJPQkUgQWxsIEhpWiAqLwogCUdQQ1IyICA9IENPUkdJX0dQSU9fQUxMX1NUUk9CRV9CSVQ7CiAJR1BEUjIgJj0gfkNPUkdJX0dQSU9fQUxMX1NUUk9CRV9CSVQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3JnaWtiZF9hY3RpdmF0ZV9hbGwodm9pZCkKIHsKLQkvLyBTVFJPQkUgQUxMIC0+IEhpZ2gKKwkvKiBTVFJPQkUgQUxMIC0+IEhpZ2ggKi8KIAlHUFNSMiAgPSBDT1JHSV9HUElPX0FMTF9TVFJPQkVfQklUOwogCUdQRFIyIHw9IENPUkdJX0dQSU9fQUxMX1NUUk9CRV9CSVQ7CiAKIAl1ZGVsYXkoS0JfRElTQ0hBUkdFX0RFTEFZKTsKIAotCS8vIENsZWFyIGFueSBpbnRlcnJ1cHRzIHdlIG1heSBoYXZlIHRyaWdnZXJlZCB3aGVuIGFsdGVyaW5nIHRoZSBHUElPIGxpbmVzCisJLyogQ2xlYXIgYW55IGludGVycnVwdHMgd2UgbWF5IGhhdmUgdHJpZ2dlcmVkIHdoZW4gYWx0ZXJpbmcgdGhlIEdQSU8gbGluZXMgKi8KIAlHRURSMSA9IENPUkdJX0dQSU9fSElHSF9TRU5TRV9CSVQ7CiAJR0VEUjIgPSBDT1JHSV9HUElPX0xPV19TRU5TRV9CSVQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3JnaWtiZF9hY3RpdmF0ZV9jb2woaW50IGNvbCkKIHsKLQkvLyBTVFJPQkUgY29sIC0+IEhpZ2gsIG5vdCBjb2wgLT4gSGlaCisJLyogU1RST0JFIGNvbCAtPiBIaWdoLCBub3QgY29sIC0+IEhpWiAqLwogCUdQU1IyID0gQ09SR0lfR1BJT19TVFJPQkVfQklUKGNvbCk7CiAJR1BEUjIgPSAoR1BEUjIgJiB+Q09SR0lfR1BJT19BTExfU1RST0JFX0JJVCkgfCBDT1JHSV9HUElPX1NUUk9CRV9CSVQoY29sKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvcmdpa2JkX3Jlc2V0X2NvbChpbnQgY29sKQogewotCS8vIFNUUk9CRSBjb2wgLT4gTG93CisJLyogU1RST0JFIGNvbCAtPiBMb3cgKi8KIAlHUENSMiA9IENPUkdJX0dQSU9fU1RST0JFX0JJVChjb2wpOwotCS8vIFNUUk9CRSBjb2wgLT4gb3V0LCBub3QgY29sIC0+IEhpWgorCS8qIFNUUk9CRSBjb2wgLT4gb3V0LCBub3QgY29sIC0+IEhpWiAqLwogCUdQRFIyID0gKEdQRFIyICYgfkNPUkdJX0dQSU9fQUxMX1NUUk9CRV9CSVQpIHwgQ09SR0lfR1BJT19TVFJPQkVfQklUKGNvbCk7CiB9CiAKQEAgLTE0OSwxMCArMTM3LDEzIEBACiAvKiBTY2FuIHRoZSBoYXJkd2FyZSBrZXlib2FyZCBhbmQgcHVzaCBhbnkgY2hhbmdlcyB1cCB0aHJvdWdoIHRoZSBpbnB1dCBsYXllciAqLwogc3RhdGljIHZvaWQgY29yZ2lrYmRfc2NhbmtleWJvYXJkKHN0cnVjdCBjb3JnaWtiZCAqY29yZ2lrYmRfZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgaW50IHJvdywgY29sLCByb3dkLCBzY2FuY29kZTsKKwl1bnNpZ25lZCBpbnQgcm93LCBjb2wsIHJvd2Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgbnVtX3ByZXNzZWQ7CiAKKwlpZiAoY29yZ2lrYmRfZGF0YS0+c3VzcGVuZGVkKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY29yZ2lrYmRfZGF0YS0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHJlZ3MpCkBAIC0xNzMsMTAgKzE2NCwyMSBAQAogCiAJCXJvd2QgPSBHRVRfUk9XU19TVEFUVVMoY29sKTsKIAkJZm9yIChyb3cgPSAwOyByb3cgPCBLQl9ST1dTOyByb3crKykgeworCQkJdW5zaWduZWQgaW50IHNjYW5jb2RlLCBwcmVzc2VkOworCiAJCQlzY2FuY29kZSA9IFNDQU5DT0RFKHJvdywgY29sKTsKLQkJCWhhbmRsZV9zY2FuY29kZSgocm93ZCAmIEtCX1JPV01BU0socm93KSksIHNjYW5jb2RlLCBjb3JnaWtiZF9kYXRhKTsKLQkJCWlmIChyb3dkICYgS0JfUk9XTUFTSyhyb3cpKQorCQkJcHJlc3NlZCA9IHJvd2QgJiBLQl9ST1dNQVNLKHJvdyk7CisKKwkJCWlucHV0X3JlcG9ydF9rZXkoJmNvcmdpa2JkX2RhdGEtPmlucHV0LCBjb3JnaWtiZF9kYXRhLT5rZXljb2RlW3NjYW5jb2RlXSwgcHJlc3NlZCk7CisKKwkJCWlmIChwcmVzc2VkKQogCQkJCW51bV9wcmVzc2VkKys7CisKKwkJCWlmIChwcmVzc2VkICYmIChjb3JnaWtiZF9kYXRhLT5rZXljb2RlW3NjYW5jb2RlXSA9PSBDT1JHSV9LRVlfT0ZGKQorCQkJCQkmJiB0aW1lX2FmdGVyKGppZmZpZXMsIGNvcmdpa2JkX2RhdGEtPnN1c3BlbmRfamlmZmllcyArIEhaKSkgeworCQkJCWlucHV0X2V2ZW50KCZjb3JnaWtiZF9kYXRhLT5pbnB1dCwgRVZfUFdSLCBDT1JHSV9LRVlfT0ZGLCAxKTsKKwkJCQljb3JnaWtiZF9kYXRhLT5zdXNwZW5kX2ppZmZpZXM9amlmZmllczsKKwkJCX0KIAkJfQogCQljb3JnaWtiZF9yZXNldF9jb2woY29sKTsKIAl9CkBAIC0yMjEsOCArMjIzLDExIEBACiAgKiBUaGUgaGluZ2Ugc3dpdGNoZXMgZ2VuZXJhdGUgbm8gaW50ZXJydXB0IHNvIHRoZXkgbmVlZCB0byBiZQogICogbW9uaXRvcmVkIGJ5IGEgdGltZXIuCiAgKgotICogV2hlbiB3ZSBkZXRlY3QgY2hhbmdlcywgd2UgZGVib3VuY2UgaXQgYW5kIHRoZW4gcGFzcyB0aGUgdGhyZWUKLSAqIHBvc2l0aW9ucyB0aGUgc3lzdGVtIGNhbiB0YWtlIGFzIGtleXByZXNzZXMgdG8gdGhlIGlucHV0IHN5c3RlbS4KKyAqIFdlIGRlYm91bmNlIHRoZSBzd2l0Y2hlcyBhbmQgcGFzcyB0aGVtIHRvIHRoZSBpbnB1dCBzeXN0ZW0uCisgKgorICogIGdwcnIgPT0gMHgwMCAtIEtleWJvYXJkIHdpdGggTGFuZHNjYXBlIFNjcmVlbgorICogICAgICAgICAgMHgwOCAtIE5vIEtleWJvYXJkIHdpdGggUG9ydHJhaXQgU2NyZWVuCisgKiAgICAgICAgICAweDBjIC0gS2V5Ym9hcmQgYW5kIFNjcmVlbiBDbG9zZWQKICAqLwogCiAjZGVmaW5lIEhJTkdFX1NUQUJMRV9DT1VOVCAyCkBAIC0yMzUsNyArMjQwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGdwcnI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWdwcnIgPSByZWFkX3Njb29wX3JlZyhTQ09PUF9HUFJSKSAmIChDT1JHSV9TQ1BfU1dBIHwgQ09SR0lfU0NQX1NXQik7CisJZ3ByciA9IHJlYWRfc2Nvb3BfcmVnKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIFNDT09QX0dQUlIpICYgKENPUkdJX1NDUF9TV0EgfCBDT1JHSV9TQ1BfU1dCKTsKIAlpZiAoZ3ByciAhPSBzaGFycHNsX2hpbmdlX3N0YXRlKSB7CiAJCWhpbmdlX2NvdW50ID0gMDsKIAkJc2hhcnBzbF9oaW5nZV9zdGF0ZSA9IGdwcnI7CkBAIC0yNDQsOSArMjQ5LDggQEAKIAkJaWYgKGhpbmdlX2NvdW50ID49IEhJTkdFX1NUQUJMRV9DT1VOVCkgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNvcmdpa2JkX2RhdGEtPmxvY2ssIGZsYWdzKTsKIAotCQkJaGFuZGxlX3NjYW5jb2RlKChzaGFycHNsX2hpbmdlX3N0YXRlID09IDB4MDApLCAxMjUsIGNvcmdpa2JkX2RhdGEpOyAvKiBLZXlib2FyZCB3aXRoIExhbmRzY2FwZSBTY3JlZW4gKi8KLQkJCWhhbmRsZV9zY2FuY29kZSgoc2hhcnBzbF9oaW5nZV9zdGF0ZSA9PSAweDA4KSwgMTI2LCBjb3JnaWtiZF9kYXRhKTsgLyogTm8gS2V5Ym9hcmQgd2l0aCBQb3J0cmFpdCBTY3JlZW4gKi8KLQkJCWhhbmRsZV9zY2FuY29kZSgoc2hhcnBzbF9oaW5nZV9zdGF0ZSA9PSAweDBjKSwgMTI3LCBjb3JnaWtiZF9kYXRhKTsgLyogS2V5Ym9hcmQgYW5kIFNjcmVlbiBDbG9zZWQgICovCisJCQlpbnB1dF9yZXBvcnRfc3dpdGNoKCZjb3JnaWtiZF9kYXRhLT5pbnB1dCwgU1dfMCwgKChzaGFycHNsX2hpbmdlX3N0YXRlICYgQ09SR0lfU0NQX1NXQSkgIT0gMCkpOworCQkJaW5wdXRfcmVwb3J0X3N3aXRjaCgmY29yZ2lrYmRfZGF0YS0+aW5wdXQsIFNXXzEsICgoc2hhcnBzbF9oaW5nZV9zdGF0ZSAmIENPUkdJX1NDUF9TV0IpICE9IDApKTsKIAkJCWlucHV0X3N5bmMoJmNvcmdpa2JkX2RhdGEtPmlucHV0KTsKIAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29yZ2lrYmRfZGF0YS0+bG9jaywgZmxhZ3MpOwpAQCAtMjU1LDE5ICsyNTksNDUgQEAKIAltb2RfdGltZXIoJmNvcmdpa2JkX2RhdGEtPmh0aW1lciwgamlmZmllcyArIEhJTkdFX1NDQU5fSU5URVJWQUwpOwogfQogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGNvcmdpa2JkX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHVpbnQzMl90IGxldmVsKQoreworCWlmIChsZXZlbCA9PSBTVVNQRU5EX1BPV0VSX0RPV04pIHsKKwkJc3RydWN0IGNvcmdpa2JkICpjb3JnaWtiZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCQljb3JnaWtiZC0+c3VzcGVuZGVkID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29yZ2lrYmRfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3QgbGV2ZWwpCit7CisJaWYgKGxldmVsID09IFJFU1VNRV9QT1dFUl9PTikgeworCQlzdHJ1Y3QgY29yZ2lrYmQgKmNvcmdpa2JkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwkJLyogVXBvbiByZXN1bWUsIGlnbm9yZSB0aGUgc3VzcGVuZCBrZXkgZm9yIGEgc2hvcnQgd2hpbGUgKi8KKwkJY29yZ2lrYmQtPnN1c3BlbmRfamlmZmllcz1qaWZmaWVzOworCQljb3JnaWtiZC0+c3VzcGVuZGVkID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBjb3JnaWtiZF9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgY29yZ2lrYmRfcmVzdW1lCQlOVUxMCisjZW5kaWYKKwogc3RhdGljIGludCBfX2luaXQgY29yZ2lrYmRfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCWludCBpOwogCXN0cnVjdCBjb3JnaWtiZCAqY29yZ2lrYmQ7CiAKLQljb3JnaWtiZCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBjb3JnaWtiZCksIEdGUF9LRVJORUwpOworCWNvcmdpa2JkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvcmdpa2JkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb3JnaWtiZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LGNvcmdpa2JkKTsKIAlzdHJjcHkoY29yZ2lrYmQtPnBoeXMsICJjb3JnaWtiZC9pbnB1dDAiKTsKIAotCXNwaW5fbG9ja19pbml0KGNvcmdpa2JkLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY29yZ2lrYmQtPmxvY2spOwogCiAJLyogSW5pdCBLZXlib2FyZCByZXNjYW4gdGltZXIgKi8KIAlpbml0X3RpbWVyKCZjb3JnaWtiZC0+dGltZXIpOwpAQCAtMjc5LDYgKzMwOSw4IEBACiAJY29yZ2lrYmQtPmh0aW1lci5mdW5jdGlvbiA9IGNvcmdpa2JkX2hpbmdlX3RpbWVyOwogCWNvcmdpa2JkLT5odGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjb3JnaWtiZDsKIAorCWNvcmdpa2JkLT5zdXNwZW5kX2ppZmZpZXM9amlmZmllczsKKwogCWluaXRfaW5wdXRfZGV2KCZjb3JnaWtiZC0+aW5wdXQpOwogCWNvcmdpa2JkLT5pbnB1dC5wcml2YXRlID0gY29yZ2lrYmQ7CiAJY29yZ2lrYmQtPmlucHV0Lm5hbWUgPSAiQ29yZ2kgS2V5Ym9hcmQiOwpAQCAtMjg4LDcgKzMyMCw3IEBACiAJY29yZ2lrYmQtPmlucHV0LmlkLnZlbmRvciA9IDB4MDAwMTsKIAljb3JnaWtiZC0+aW5wdXQuaWQucHJvZHVjdCA9IDB4MDAwMTsKIAljb3JnaWtiZC0+aW5wdXQuaWQudmVyc2lvbiA9IDB4MDEwMDsKLQljb3JnaWtiZC0+aW5wdXQuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRVApIHwgQklUKEVWX1BXUik7CisJY29yZ2lrYmQtPmlucHV0LmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVQKSB8IEJJVChFVl9QV1IpIHwgQklUKEVWX1NXKTsKIAljb3JnaWtiZC0+aW5wdXQua2V5Y29kZSA9IGNvcmdpa2JkLT5rZXljb2RlOwogCWNvcmdpa2JkLT5pbnB1dC5rZXljb2Rlc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKIAljb3JnaWtiZC0+aW5wdXQua2V5Y29kZW1heCA9IEFSUkFZX1NJWkUoY29yZ2lrYmRfa2V5Y29kZSk7CkBAIC0yOTcsNiArMzI5LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb3JnaWtiZF9rZXljb2RlKTsgaSsrKQogCQlzZXRfYml0KGNvcmdpa2JkLT5rZXljb2RlW2ldLCBjb3JnaWtiZC0+aW5wdXQua2V5Yml0KTsKIAljbGVhcl9iaXQoMCwgY29yZ2lrYmQtPmlucHV0LmtleWJpdCk7CisJc2V0X2JpdChTV18wLCBjb3JnaWtiZC0+aW5wdXQuc3diaXQpOworCXNldF9iaXQoU1dfMSwgY29yZ2lrYmQtPmlucHV0LnN3Yml0KTsKIAogCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmY29yZ2lrYmQtPmlucHV0KTsKIAltb2RfdGltZXIoJmNvcmdpa2JkLT5odGltZXIsIGppZmZpZXMgKyBISU5HRV9TQ0FOX0lOVEVSVkFMKTsKQEAgLTM0Myw2ICszNzcsOCBAQAogCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAogCS5wcm9iZQkJPSBjb3JnaWtiZF9wcm9iZSwKIAkucmVtb3ZlCQk9IGNvcmdpa2JkX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGNvcmdpa2JkX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBjb3JnaWtiZF9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjb3JnaWtiZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3N1bmtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zdW5rYmQuYwppbmRleCA1OTY5NjRjLi40YmFlNWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3N1bmtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc3Vua2JkLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgc3Vua2JkX2tleWNvZGVbMTI4XSA9IHsKLQkgIDAsMTI4LDExNCwxMjksMTE1LCA1OSwgNjAsIDY4LCA2MSwgODcsIDYyLCA4OCwgNjMsMTAwLCA2NCwgIDAsCisJICAwLDEyOCwxMTQsMTI5LDExNSwgNTksIDYwLCA2OCwgNjEsIDg3LCA2MiwgODgsIDYzLDEwMCwgNjQsMTEyLAogCSA2NSwgNjYsIDY3LCA1NiwxMDMsMTE5LCA5OSwgNzAsMTA1LDEzMCwxMzEsMTA4LDEwNiwgIDEsICAyLCAgMywKIAkgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDQxLCAxNCwxMTAsMTEzLCA5OCwgNTUsCiAJMTE2LDEzMiwgODMsMTMzLDEwMiwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvbW91c2UvTWFrZWZpbGUKaW5kZXggYzQ5MDliNC4uODJiMzMwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlCkBAIC0xNSw0ICsxNSw0IEBACiBvYmotJChDT05GSUdfTU9VU0VfSElMKQkJKz0gaGlsX3B0ci5vCiBvYmotJChDT05GSUdfTU9VU0VfVlNYWFhBQSkJKz0gdnN4eHhhYS5vCiAKLXBzbW91c2Utb2JqcyAgOj0gcHNtb3VzZS1iYXNlLm8gYWxwcy5vIGxvZ2lwczJwcC5vIHN5bmFwdGljcy5vIGxpZmVib29rLm8KK3BzbW91c2Utb2JqcyAgOj0gcHNtb3VzZS1iYXNlLm8gYWxwcy5vIGxvZ2lwczJwcC5vIHN5bmFwdGljcy5vIGxpZmVib29rLm8gdHJhY2twb2ludC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCmluZGV4IDBkNjhlNWUuLmIyMDc4M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCB6ID4gMCk7CiAKIAlpZiAocHJpdi0+aS0+ZmxhZ3MgJiBBTFBTX1dIRUVMKQotCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1dIRUVMLCAoKHBhY2tldFswXSA+PiA0KSAmIDB4MDcpIHwgKChwYWNrZXRbMl0gPj4gMikgJiAweDA4KSk7CisJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfV0hFRUwsICgocGFja2V0WzJdIDw8IDEpICYgMHgwOCkgLSAoKHBhY2tldFswXSA+PiA0KSAmIDB4MDcpKTsKIAogCWlmIChwcml2LT5pLT5mbGFncyAmIChBTFBTX0ZXX0JLXzEgfCBBTFBTX0ZXX0JLXzIpKSB7CiAJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fRk9SV0FSRCwgZm9yd2FyZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYwppbmRleCA0OGQyYjIwLi43ZGY5NjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMKQEAgLTE1MCwxMiArMTUwLDEyIEBACiAJcHMyX2NvbW1hbmQocHMyZGV2LCBwYXJhbSwgUFNNT1VTRV9DTURfU0VUUkVTKTsKIH0KIAotc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3Nob3dfc21hcnRzY3JvbGwoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBzMnBwX2F0dHJfc2hvd19zbWFydHNjcm9sbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwgY2hhciAqYnVmKQogewogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwc21vdXNlLT5zbWFydHNjcm9sbCA/IDEgOiAwKTsKIH0KIAotc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3NldF9zbWFydHNjcm9sbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBwczJwcF9hdHRyX3NldF9zbWFydHNjcm9sbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAljaGFyICpyZXN0OwpAQCAtMTY5LDcgKzE2OSw4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1QU01PVVNFX0RFRklORV9BVFRSKHNtYXJ0c2Nyb2xsKTsKK1BTTU9VU0VfREVGSU5FX0FUVFIoc21hcnRzY3JvbGwsIFNfSVdVU1IgfCBTX0lSVUdPLCBOVUxMLAorCQkJcHMycHBfYXR0cl9zaG93X3NtYXJ0c2Nyb2xsLCBwczJwcF9hdHRyX3NldF9zbWFydHNjcm9sbCk7CiAKIC8qCiAgKiBTdXBwb3J0IDgwMCBkcGkgcmVzb2x1dGlvbiBfb25seV8gaWYgdGhlIHVzZXIgd2FudHMgaXQgKHRoZXJlIGFyZSBnb29kCkBAIC0xOTQsNyArMTk1LDcgQEAKIAogc3RhdGljIHZvaWQgcHMycHBfZGlzY29ubmVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKIHsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3NtYXJ0c2Nyb2xsKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3NtYXJ0c2Nyb2xsLmRhdHRyKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwczJwcF9pbmZvICpnZXRfbW9kZWxfaW5mbyh1bnNpZ25lZCBjaGFyIG1vZGVsKQpAQCAtMjIyLDYgKzIyMyw3IEBACiAJCXsgODAsCVBTMlBQX0tJTkRfV0hFRUwsCVBTMlBQX1NJREVfQlROIHwgUFMyUFBfV0hFRUwgfSwKIAkJeyA4MSwJUFMyUFBfS0lORF9XSEVFTCwJUFMyUFBfV0hFRUwgfSwKIAkJeyA4MywJUFMyUFBfS0lORF9XSEVFTCwJUFMyUFBfV0hFRUwgfSwKKwkJeyA4NiwJUFMyUFBfS0lORF9XSEVFTCwJUFMyUFBfV0hFRUwgfSwKIAkJeyA4OCwJUFMyUFBfS0lORF9XSEVFTCwJUFMyUFBfV0hFRUwgfSwKIAkJeyA5NiwJMCwJCQkwIH0sCiAJCXsgOTcsCVBTMlBQX0tJTkRfVFAzLAkJUFMyUFBfV0hFRUwgfCBQUzJQUF9IV0hFRUwgfSwKQEAgLTM3OSw3ICszODEsOCBAQAogCQkJCXBzbW91c2UtPnNldF9yZXNvbHV0aW9uID0gcHMycHBfc2V0X3Jlc29sdXRpb247CiAJCQkJcHNtb3VzZS0+ZGlzY29ubmVjdCA9IHBzMnBwX2Rpc2Nvbm5lY3Q7CiAKLQkJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3NtYXJ0c2Nyb2xsKTsKKwkJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LAorCQkJCQkJICAgJnBzbW91c2VfYXR0cl9zbWFydHNjcm9sbC5kYXR0cik7CiAJCQl9CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKaW5kZXggMmJiMmZlNy4uYWYyNDMxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAibG9naXBzMnBwLmgiCiAjaW5jbHVkZSAiYWxwcy5oIgogI2luY2x1ZGUgImxpZmVib29rLmgiCisjaW5jbHVkZSAidHJhY2twb2ludC5oIgogCiAjZGVmaW5lIERSSVZFUl9ERVNDCSJQUy8yIG1vdXNlIGRyaXZlciIKIApAQCAtNTcsMTAgKzU4LDMwIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQocmVzZXRhZnRlciwgcHNtb3VzZV9yZXNldGFmdGVyLCB1aW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocmVzZXRhZnRlciwgIlJlc2V0IGRldmljZSBhZnRlciBzbyBtYW55IGJhZCBwYWNrZXRzICgwID0gbmV2ZXIpLiIpOwogCi1QU01PVVNFX0RFRklORV9BVFRSKHByb3RvY29sKTsKLVBTTU9VU0VfREVGSU5FX0FUVFIocmF0ZSk7Ci1QU01PVVNFX0RFRklORV9BVFRSKHJlc29sdXRpb24pOwotUFNNT1VTRV9ERUZJTkVfQVRUUihyZXNldGFmdGVyKTsKK1BTTU9VU0VfREVGSU5FX0FUVFIocHJvdG9jb2wsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJTlVMTCwKKwkJCXBzbW91c2VfYXR0cl9zaG93X3Byb3RvY29sLCBwc21vdXNlX2F0dHJfc2V0X3Byb3RvY29sKTsKK1BTTU9VU0VfREVGSU5FX0FUVFIocmF0ZSwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkodm9pZCAqKSBvZmZzZXRvZihzdHJ1Y3QgcHNtb3VzZSwgcmF0ZSksCisJCQlwc21vdXNlX3Nob3dfaW50X2F0dHIsIHBzbW91c2VfYXR0cl9zZXRfcmF0ZSk7CitQU01PVVNFX0RFRklORV9BVFRSKHJlc29sdXRpb24sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJKHZvaWQgKikgb2Zmc2V0b2Yoc3RydWN0IHBzbW91c2UsIHJlc29sdXRpb24pLAorCQkJcHNtb3VzZV9zaG93X2ludF9hdHRyLCBwc21vdXNlX2F0dHJfc2V0X3Jlc29sdXRpb24pOworUFNNT1VTRV9ERUZJTkVfQVRUUihyZXNldGFmdGVyLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSh2b2lkICopIG9mZnNldG9mKHN0cnVjdCBwc21vdXNlLCByZXNldGFmdGVyKSwKKwkJCXBzbW91c2Vfc2hvd19pbnRfYXR0ciwgcHNtb3VzZV9zZXRfaW50X2F0dHIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcHNtb3VzZV9hdHRyaWJ1dGVzW10gPSB7CisJJnBzbW91c2VfYXR0cl9wcm90b2NvbC5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfcmF0ZS5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfcmVzb2x1dGlvbi5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfcmVzZXRhZnRlci5kYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBzbW91c2VfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycwk9IHBzbW91c2VfYXR0cmlidXRlcywKK307CiAKIF9fb2Jzb2xldGVfc2V0dXAoInBzbW91c2Vfbm9leHQiKTsKIF9fb2Jzb2xldGVfc2V0dXAoInBzbW91c2VfcmVzb2x1dGlvbj0iKTsKQEAgLTUyMCw2ICs1NDEsMTIgQEAKIAkJcmV0dXJuIFBTTU9VU0VfSU1QUzsKIAogLyoKKyAqIFRyeSB0byBpbml0aWFsaXplIHRoZSBJQk0gVHJhY2tQb2ludAorICovCisJaWYgKG1heF9wcm90byA+IFBTTU9VU0VfSU1FWCAmJiB0cmFja3BvaW50X2RldGVjdChwc21vdXNlLCBzZXRfcHJvcGVydGllcykgPT0gMCkKKwkJcmV0dXJuIFBTTU9VU0VfVFJBQ0tQT0lOVDsKKworLyoKICAqIE9rYXksIGFsbCBmYWlsZWQsIHdlIGhhdmUgYSBzdGFuZGFyZCBtb3VzZSBoZXJlLiBUaGUgbnVtYmVyIG9mIHRoZSBidXR0b25zCiAgKiBpcyBzdGlsbCBhIHF1ZXN0aW9uLCB0aG91Z2guIFdlIGFzc3VtZSAzLgogICovCkBAIC02MDAsNiArNjI3LDEyIEBACiAJCS5pbml0CQk9IGxpZmVib29rX2luaXQsCiAJfSwKIAl7CisJCS50eXBlCQk9IFBTTU9VU0VfVFJBQ0tQT0lOVCwKKwkJLm5hbWUJCT0gIlRQUFMvMiIsCisJCS5hbGlhcwkJPSAidHJhY2twb2ludCIsCisJCS5kZXRlY3QJCT0gdHJhY2twb2ludF9kZXRlY3QsCisJfSwKKwl7CiAJCS50eXBlCQk9IFBTTU9VU0VfQVVUTywKIAkJLm5hbWUJCT0gImF1dG8iLAogCQkuYWxpYXMJCT0gImFueSIsCkBAIC03ODcsMTAgKzgyMCw3IEBACiAKIAlwc21vdXNlID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOwogCi0JZGV2aWNlX3JlbW92ZV9maWxlKCZzZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3Byb3RvY29sKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNlcmlvLT5kZXYsICZwc21vdXNlX2F0dHJfcmF0ZSk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZzZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3Jlc29sdXRpb24pOwotCWRldmljZV9yZW1vdmVfZmlsZSgmc2VyaW8tPmRldiwgJnBzbW91c2VfYXR0cl9yZXNldGFmdGVyKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnNlcmlvLT5kZXYua29iaiwgJnBzbW91c2VfYXR0cmlidXRlX2dyb3VwKTsKIAogCWRvd24oJnBzbW91c2Vfc2VtKTsKIApAQCAtODgzLDcgKzkxMyw3IEBACiAJCXBzbW91c2VfZGVhY3RpdmF0ZShwYXJlbnQpOwogCX0KIAotCWlmICghKHBzbW91c2UgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcHNtb3VzZSksIEdGUF9LRVJORUwpKSkgeworCWlmICghKHBzbW91c2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHNtb3VzZSksIEdGUF9LRVJORUwpKSkgewogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CkBAIC05MjcsMTAgKzk1Nyw3IEBACiAJaWYgKHBhcmVudCAmJiBwYXJlbnQtPnB0X2FjdGl2YXRlKQogCQlwYXJlbnQtPnB0X2FjdGl2YXRlKHBhcmVudCk7CiAKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNlcmlvLT5kZXYsICZwc21vdXNlX2F0dHJfcHJvdG9jb2wpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmc2VyaW8tPmRldiwgJnBzbW91c2VfYXR0cl9yYXRlKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNlcmlvLT5kZXYsICZwc21vdXNlX2F0dHJfcmVzb2x1dGlvbik7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZzZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3Jlc2V0YWZ0ZXIpOworCXN5c2ZzX2NyZWF0ZV9ncm91cCgmc2VyaW8tPmRldi5rb2JqLCAmcHNtb3VzZV9hdHRyaWJ1dGVfZ3JvdXApOwogCiAJcHNtb3VzZV9hY3RpdmF0ZShwc21vdXNlKTsKIApAQCAtMTAyNywxMCArMTA1NCwxMiBAQAogCS5jbGVhbnVwCT0gcHNtb3VzZV9jbGVhbnVwLAogfTsKIAotc3NpemVfdCBwc21vdXNlX2F0dHJfc2hvd19oZWxwZXIoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsCi0JCQkJIHNzaXplX3QgKCpoYW5kbGVyKShzdHJ1Y3QgcHNtb3VzZSAqLCBjaGFyICopKQorc3NpemVfdCBwc21vdXNlX2F0dHJfc2hvd19oZWxwZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkgY2hhciAqYnVmKQogewogCXN0cnVjdCBzZXJpbyAqc2VyaW8gPSB0b19zZXJpb19wb3J0KGRldik7CisJc3RydWN0IHBzbW91c2VfYXR0cmlidXRlICphdHRyID0gdG9fcHNtb3VzZV9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBwc21vdXNlICpwc21vdXNlOwogCWludCByZXR2YWw7CiAKIAlyZXR2YWwgPSBzZXJpb19waW5fZHJpdmVyKHNlcmlvKTsKQEAgLTEwNDIsMTkgKzEwNzEsMjEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0dmFsID0gaGFuZGxlcihzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyksIGJ1Zik7CisJcHNtb3VzZSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKKworCXJldHZhbCA9IGF0dHItPnNob3cocHNtb3VzZSwgYXR0ci0+ZGF0YSwgYnVmKTsKIAogb3V0OgogCXNlcmlvX3VucGluX2RyaXZlcihzZXJpbyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3NpemVfdCBwc21vdXNlX2F0dHJfc2V0X2hlbHBlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJCXNzaXplX3QgKCpoYW5kbGVyKShzdHJ1Y3QgcHNtb3VzZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCkpCitzc2l6ZV90IHBzbW91c2VfYXR0cl9zZXRfaGVscGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHNlcmlvICpzZXJpbyA9IHRvX3NlcmlvX3BvcnQoZGV2KTsKLQlzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKLQlzdHJ1Y3QgcHNtb3VzZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcHNtb3VzZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19wc21vdXNlX2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHBzbW91c2UgKnBzbW91c2UsICpwYXJlbnQgPSBOVUxMOwogCWludCByZXR2YWw7CiAKIAlyZXR2YWwgPSBzZXJpb19waW5fZHJpdmVyKHNlcmlvKTsKQEAgLTEwNzAsNiArMTEwMSw4IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBvdXRfdW5waW47CiAKKwlwc21vdXNlID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOworCiAJaWYgKHBzbW91c2UtPnN0YXRlID09IFBTTU9VU0VfSUdOT1JFKSB7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0X3VwOwpAQCAtMTA4Miw3ICsxMTE1LDcgQEAKIAogCXBzbW91c2VfZGVhY3RpdmF0ZShwc21vdXNlKTsKIAotCXJldHZhbCA9IGhhbmRsZXIocHNtb3VzZSwgYnVmLCBjb3VudCk7CisJcmV0dmFsID0gYXR0ci0+c2V0KHBzbW91c2UsIGF0dHItPmRhdGEsIGJ1ZiwgY291bnQpOwogCiAJaWYgKHJldHZhbCAhPSAtRU5PREVWKQogCQlwc21vdXNlX2FjdGl2YXRlKHBzbW91c2UpOwpAQCAtMTA5NywxMiArMTEzMCwzNCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHBzbW91c2VfYXR0cl9zaG93X3Byb3RvY29sKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwc21vdXNlX3Nob3dfaW50X2F0dHIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHZvaWQgKm9mZnNldCwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgKmZpZWxkID0gKHVuc2lnbmVkIGxvbmcgKikoKGNoYXIgKilwc21vdXNlICsgKHNpemVfdClvZmZzZXQpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCAqZmllbGQpOworfQorCitzdGF0aWMgc3NpemVfdCBwc21vdXNlX3NldF9pbnRfYXR0cihzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqb2Zmc2V0LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nICpmaWVsZCA9ICh1bnNpZ25lZCBsb25nICopKChjaGFyICopcHNtb3VzZSArIChzaXplX3Qpb2Zmc2V0KTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWNoYXIgKnJlc3Q7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJnJlc3QsIDEwKTsKKwlpZiAoKnJlc3QpCisJCXJldHVybiAtRUlOVkFMOworCisJKmZpZWxkID0gdmFsdWU7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBzbW91c2VfYXR0cl9zaG93X3Byb3RvY29sKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB2b2lkICpkYXRhLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHBzbW91c2VfcHJvdG9jb2xfYnlfdHlwZShwc21vdXNlLT50eXBlKS0+bmFtZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHBzbW91c2VfYXR0cl9zZXRfcHJvdG9jb2woc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3NldF9wcm90b2NvbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHNlcmlvICpzZXJpbyA9IHBzbW91c2UtPnBzMmRldi5zZXJpbzsKIAlzdHJ1Y3QgcHNtb3VzZSAqcGFyZW50ID0gTlVMTDsKQEAgLTExNjYsMTIgKzEyMjEsNyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3Nob3dfcmF0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgY2hhciAqYnVmKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwc21vdXNlLT5yYXRlKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3NldF9yYXRlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHBzbW91c2VfYXR0cl9zZXRfcmF0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAljaGFyICpyZXN0OwpAQCAtMTE4NCwxMiArMTIzNCw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBwc21vdXNlX2F0dHJfc2hvd19yZXNvbHV0aW9uKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHBzbW91c2UtPnJlc29sdXRpb24pOwotfQotCi1zdGF0aWMgc3NpemVfdCBwc21vdXNlX2F0dHJfc2V0X3Jlc29sdXRpb24oc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3NldF9yZXNvbHV0aW9uKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB2b2lkICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCWNoYXIgKnJlc3Q7CkBAIC0xMjAyLDIzICsxMjQ3LDYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHBzbW91c2VfYXR0cl9zaG93X3Jlc2V0YWZ0ZXIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcHNtb3VzZS0+cmVzZXRhZnRlcik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHBzbW91c2VfYXR0cl9zZXRfcmVzZXRhZnRlcihzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQljaGFyICpyZXN0OwotCi0JdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsICZyZXN0LCAxMCk7Ci0JaWYgKCpyZXN0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBzbW91c2UtPnJlc2V0YWZ0ZXIgPSB2YWx1ZTsKLQlyZXR1cm4gY291bnQ7Ci19CiAKIHN0YXRpYyBpbnQgcHNtb3VzZV9zZXRfbWF4cHJvdG8oY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKIHsKQEAgLTEyMzQsNyArMTI2Miw3IEBACiAKIAkqKCh1bnNpZ25lZCBpbnQgKilrcC0+YXJnKSA9IHByb3RvLT50eXBlOwogCi0JcmV0dXJuIDA7CQkJCQlcCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcHNtb3VzZV9nZXRfbWF4cHJvdG8oY2hhciAqYnVmZmVyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS5oIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKaW5kZXggODY2OTFjZi4uNDVkMmJkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKQEAgLTc4LDYgKzc4LDcgQEAKIAlQU01PVVNFX1NZTkFQVElDUywKIAlQU01PVVNFX0FMUFMsCiAJUFNNT1VTRV9MSUZFQk9PSywKKwlQU01PVVNFX1RSQUNLUE9JTlQsCiAJUFNNT1VTRV9BVVRPCQkvKiBUaGlzIG9uZSBzaG91bGQgYWx3YXlzIGJlIGxhc3QgKi8KIH07CiAKQEAgLTg1LDI0ICs4NiwzNyBAQAogaW50IHBzbW91c2VfcmVzZXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpOwogdm9pZCBwc21vdXNlX3NldF9yZXNvbHV0aW9uKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB1bnNpZ25lZCBpbnQgcmVzb2x1dGlvbik7CiAKLXNzaXplX3QgcHNtb3VzZV9hdHRyX3Nob3dfaGVscGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLAotCQkJc3NpemVfdCAoKmhhbmRsZXIpKHN0cnVjdCBwc21vdXNlICosIGNoYXIgKikpOwotc3NpemVfdCBwc21vdXNlX2F0dHJfc2V0X2hlbHBlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJc3NpemVfdCAoKmhhbmRsZXIpKHN0cnVjdCBwc21vdXNlICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KSk7CiAKLSNkZWZpbmUgUFNNT1VTRV9ERUZJTkVfQVRUUihfbmFtZSkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBwc21vdXNlX2F0dHJfc2hvd18jI19uYW1lKHN0cnVjdCBwc21vdXNlICosIGNoYXIgKik7CQlcCi1zdGF0aWMgc3NpemVfdCBwc21vdXNlX2F0dHJfc2V0XyMjX25hbWUoc3RydWN0IHBzbW91c2UgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpO1wKLXN0YXRpYyBzc2l6ZV90IHBzbW91c2VfZG9fc2hvd18jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpiKQkJXAotewkJCQkJCQkJCQlcCi0JcmV0dXJuIHBzbW91c2VfYXR0cl9zaG93X2hlbHBlcihkLCBiLCBwc21vdXNlX2F0dHJfc2hvd18jI19uYW1lKTsJXAotfQkJCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBwc21vdXNlX2RvX3NldF8jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpiLCBzaXplX3QgcylcCi17CQkJCQkJCQkJCVwKLQlyZXR1cm4gcHNtb3VzZV9hdHRyX3NldF9oZWxwZXIoZCwgYiwgcywgcHNtb3VzZV9hdHRyX3NldF8jI19uYW1lKTsJXAotfQkJCQkJCQkJCQlcCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcHNtb3VzZV9hdHRyXyMjX25hbWUgPQkJCQlcCi0JX19BVFRSKF9uYW1lLCBTX0lXVVNSIHwgU19JUlVHTywJCQkJCVwKLQkJcHNtb3VzZV9kb19zaG93XyMjX25hbWUsIHBzbW91c2VfZG9fc2V0XyMjX25hbWUpOworc3RydWN0IHBzbW91c2VfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkYXR0cjsKKwl2b2lkICpkYXRhOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwgY2hhciAqYnVmKTsKKwlzc2l6ZV90ICgqc2V0KShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK307CisjZGVmaW5lIHRvX3BzbW91c2VfYXR0cihhKQljb250YWluZXJfb2YoKGEpLCBzdHJ1Y3QgcHNtb3VzZV9hdHRyaWJ1dGUsIGRhdHRyKQorCitzc2l6ZV90IHBzbW91c2VfYXR0cl9zaG93X2hlbHBlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpOworc3NpemVfdCBwc21vdXNlX2F0dHJfc2V0X2hlbHBlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKworI2RlZmluZSBQU01PVVNFX0RFRklORV9BVFRSKF9uYW1lLCBfbW9kZSwgX2RhdGEsIF9zaG93LCBfc2V0KQkJCVwKK3N0YXRpYyBzc2l6ZV90IF9zaG93KHN0cnVjdCBwc21vdXNlICosIHZvaWQgKmRhdGEsIGNoYXIgKik7CQkJXAorc3RhdGljIHNzaXplX3QgX3NldChzdHJ1Y3QgcHNtb3VzZSAqLCB2b2lkICpkYXRhLCBjb25zdCBjaGFyICosIHNpemVfdCk7CVwKK3N0YXRpYyBzdHJ1Y3QgcHNtb3VzZV9hdHRyaWJ1dGUgcHNtb3VzZV9hdHRyXyMjX25hbWUgPSB7CQkJXAorCS5kYXR0cgk9IHsJCQkJCQkJCVwKKwkJLmF0dHIJPSB7CQkJCQkJCVwKKwkJCS5uYW1lCT0gX19zdHJpbmdpZnkoX25hbWUpLAkJCQlcCisJCQkubW9kZQk9IF9tb2RlLAkJCQkJXAorCQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCQkJCQlcCisJCX0sCQkJCQkJCQlcCisJCS5zaG93CT0gcHNtb3VzZV9hdHRyX3Nob3dfaGVscGVyLAkJCQlcCisJCS5zdG9yZQk9IHBzbW91c2VfYXR0cl9zZXRfaGVscGVyLAkJCQlcCisJfSwJCQkJCQkJCQlcCisJLmRhdGEJPSBfZGF0YSwJCQkJCQkJXAorCS5zaG93CT0gX3Nob3csCQkJCQkJCVwKKwkuc2V0CT0gX3NldCwJCQkJCQkJCVwKK30KIAogI2VuZGlmIC8qIF9QU01PVVNFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4OThkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5jCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogU3RlcGhlbiBFdmFuY2hpayA8ZXZhbmNoc2FAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVHJhZGVtYXJrcyBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYnBzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgInBzbW91c2UuaCIKKyNpbmNsdWRlICJ0cmFja3BvaW50LmgiCisKKy8qCisgKiBEZXZpY2UgSU86IHJlYWQsIHdyaXRlIGFuZCB0b2dnbGUgYml0CisgKi8KK3N0YXRpYyBpbnQgdHJhY2twb2ludF9yZWFkKHN0cnVjdCBwczJkZXYgKnBzMmRldiwgdW5zaWduZWQgY2hhciBsb2MsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdHMpCit7CisJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgTUFLRV9QUzJfQ01EKDAsIDAsIFRQX0NPTU1BTkQpKSB8fAorCSAgICBwczJfY29tbWFuZChwczJkZXYsIHJlc3VsdHMsIE1BS0VfUFMyX0NNRCgwLCAxLCBsb2MpKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHJhY2twb2ludF93cml0ZShzdHJ1Y3QgcHMyZGV2ICpwczJkZXYsIHVuc2lnbmVkIGNoYXIgbG9jLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlpZiAocHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCBNQUtFX1BTMl9DTUQoMCwgMCwgVFBfQ09NTUFORCkpIHx8CisJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgTUFLRV9QUzJfQ01EKDAsIDAsIFRQX1dSSVRFX01FTSkpIHx8CisJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgTUFLRV9QUzJfQ01EKDAsIDAsIGxvYykpIHx8CisJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgTUFLRV9QUzJfQ01EKDAsIDAsIHZhbCkpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cmFja3BvaW50X3RvZ2dsZV9iaXQoc3RydWN0IHBzMmRldiAqcHMyZGV2LCB1bnNpZ25lZCBjaGFyIGxvYywgdW5zaWduZWQgY2hhciBtYXNrKQoreworCS8qIEJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4gaWYgdGhlIGxvYyBwYXJhbSBpc24ndCBpbiB0aGlzIHJhbmdlICovCisJaWYgKGxvYyA8IDB4MjAgfHwgbG9jID49IDB4MkYpCisJCXJldHVybiAtMTsKKworCWlmIChwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIE1BS0VfUFMyX0NNRCgwLCAwLCBUUF9DT01NQU5EKSkgfHwKKwkgICAgcHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCBNQUtFX1BTMl9DTUQoMCwgMCwgVFBfVE9HR0xFKSkgfHwKKwkgICAgcHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCBNQUtFX1BTMl9DTUQoMCwgMCwgbG9jKSkgfHwKKwkgICAgcHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCBNQUtFX1BTMl9DTUQoMCwgMCwgbWFzaykpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVHJhY2twb2ludC1zcGVjaWZpYyBhdHRyaWJ1dGVzCisgKi8KK3N0cnVjdCB0cmFja3BvaW50X2F0dHJfZGF0YSB7CisJc2l6ZV90IGZpZWxkX29mZnNldDsKKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmQ7CisJdW5zaWduZWQgY2hhciBtYXNrOworfTsKKworc3RhdGljIHNzaXplX3QgdHJhY2twb2ludF9zaG93X2ludF9hdHRyKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB2b2lkICpkYXRhLCBjaGFyICpidWYpCit7CisJc3RydWN0IHRyYWNrcG9pbnRfZGF0YSAqdHAgPSBwc21vdXNlLT5wcml2YXRlOworCXN0cnVjdCB0cmFja3BvaW50X2F0dHJfZGF0YSAqYXR0ciA9IGRhdGE7CisJdW5zaWduZWQgY2hhciAqZmllbGQgPSAodW5zaWduZWQgY2hhciAqKSgoY2hhciAqKXRwICsgYXR0ci0+ZmllbGRfb2Zmc2V0KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCAqZmllbGQpOworfQorCitzdGF0aWMgc3NpemVfdCB0cmFja3BvaW50X3NldF9pbnRfYXR0cihzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHRyYWNrcG9pbnRfZGF0YSAqdHAgPSBwc21vdXNlLT5wcml2YXRlOworCXN0cnVjdCB0cmFja3BvaW50X2F0dHJfZGF0YSAqYXR0ciA9IGRhdGE7CisJdW5zaWduZWQgY2hhciAqZmllbGQgPSAodW5zaWduZWQgY2hhciAqKSgoY2hhciAqKXRwICsgYXR0ci0+ZmllbGRfb2Zmc2V0KTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWNoYXIgKnJlc3Q7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJnJlc3QsIDEwKTsKKwlpZiAoKnJlc3QgfHwgdmFsdWUgPiAyNTUpCisJCXJldHVybiAtRUlOVkFMOworCisJKmZpZWxkID0gdmFsdWU7CisJdHJhY2twb2ludF93cml0ZSgmcHNtb3VzZS0+cHMyZGV2LCBhdHRyLT5jb21tYW5kLCB2YWx1ZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgVFJBQ0tQT0lOVF9JTlRfQVRUUihfbmFtZSwgX2NvbW1hbmQpCQkJCQlcCisJc3RhdGljIHN0cnVjdCB0cmFja3BvaW50X2F0dHJfZGF0YSB0cmFja3BvaW50X2F0dHJfIyNfbmFtZSA9IHsJCVwKKwkJLmZpZWxkX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0cmFja3BvaW50X2RhdGEsIF9uYW1lKSwJXAorCQkuY29tbWFuZCA9IF9jb21tYW5kLAkJCQkJCVwKKwl9OwkJCQkJCQkJCVwKKwlQU01PVVNFX0RFRklORV9BVFRSKF9uYW1lLCBTX0lXVVNSIHwgU19JUlVHTywJCQkJXAorCQkJICAgICZ0cmFja3BvaW50X2F0dHJfIyNfbmFtZSwJCQkJXAorCQkJICAgIHRyYWNrcG9pbnRfc2hvd19pbnRfYXR0ciwgdHJhY2twb2ludF9zZXRfaW50X2F0dHIpCisKK3N0YXRpYyBzc2l6ZV90IHRyYWNrcG9pbnRfc2V0X2JpdF9hdHRyKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB2b2lkICpkYXRhLAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdHJhY2twb2ludF9kYXRhICp0cCA9IHBzbW91c2UtPnByaXZhdGU7CisJc3RydWN0IHRyYWNrcG9pbnRfYXR0cl9kYXRhICphdHRyID0gZGF0YTsKKwl1bnNpZ25lZCBjaGFyICpmaWVsZCA9ICh1bnNpZ25lZCBjaGFyICopKChjaGFyICopdHAgKyBhdHRyLT5maWVsZF9vZmZzZXQpOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJY2hhciAqcmVzdDsKKworCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmcmVzdCwgMTApOworCWlmICgqcmVzdCB8fCB2YWx1ZSA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCpmaWVsZCAhPSB2YWx1ZSkgeworCQkqZmllbGQgPSB2YWx1ZTsKKwkJdHJhY2twb2ludF90b2dnbGVfYml0KCZwc21vdXNlLT5wczJkZXYsIGF0dHItPmNvbW1hbmQsIGF0dHItPm1hc2spOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworCisjZGVmaW5lIFRSQUNLUE9JTlRfQklUX0FUVFIoX25hbWUsIF9jb21tYW5kLCBfbWFzaykJCQkJXAorCXN0YXRpYyBzdHJ1Y3QgdHJhY2twb2ludF9hdHRyX2RhdGEgdHJhY2twb2ludF9hdHRyXyMjX25hbWUgPSB7CQlcCisJCS5maWVsZF9vZmZzZXQJPSBvZmZzZXRvZihzdHJ1Y3QgdHJhY2twb2ludF9kYXRhLCBfbmFtZSksCVwKKwkJLmNvbW1hbmQJPSBfY29tbWFuZCwJCQkJCVwKKwkJLm1hc2sJCT0gX21hc2ssCQkJCQlcCisJfTsJCQkJCQkJCQlcCisJUFNNT1VTRV9ERUZJTkVfQVRUUihfbmFtZSwgU19JV1VTUiB8IFNfSVJVR08sCQkJCVwKKwkJCSAgICAmdHJhY2twb2ludF9hdHRyXyMjX25hbWUsCQkJCVwKKwkJCSAgICB0cmFja3BvaW50X3Nob3dfaW50X2F0dHIsIHRyYWNrcG9pbnRfc2V0X2JpdF9hdHRyKQorCitUUkFDS1BPSU5UX0lOVF9BVFRSKHNlbnNpdGl2aXR5LCBUUF9TRU5TKTsKK1RSQUNLUE9JTlRfSU5UX0FUVFIoc3BlZWQsIFRQX1NQRUVEKTsKK1RSQUNLUE9JTlRfSU5UX0FUVFIoaW5lcnRpYSwgVFBfSU5FUlRJQSk7CitUUkFDS1BPSU5UX0lOVF9BVFRSKHJlYWNoLCBUUF9SRUFDSCk7CitUUkFDS1BPSU5UX0lOVF9BVFRSKGRyYWdoeXMsIFRQX0RSQUdIWVMpOworVFJBQ0tQT0lOVF9JTlRfQVRUUihtaW5kcmFnLCBUUF9NSU5EUkFHKTsKK1RSQUNLUE9JTlRfSU5UX0FUVFIodGhyZXNoLCBUUF9USFJFU0gpOworVFJBQ0tQT0lOVF9JTlRfQVRUUih1cHRocmVzaCwgVFBfVVBfVEhSRVNIKTsKK1RSQUNLUE9JTlRfSU5UX0FUVFIoenRpbWUsIFRQX1pfVElNRSk7CitUUkFDS1BPSU5UX0lOVF9BVFRSKGplbmtzLCBUUF9KRU5LU19DVVJWKTsKKworVFJBQ0tQT0lOVF9CSVRfQVRUUihwcmVzc190b19zZWxlY3QsIFRQX1RPR0dMRV9QVFNPTiwgVFBfTUFTS19QVFNPTik7CitUUkFDS1BPSU5UX0JJVF9BVFRSKHNraXBiYWNrLCBUUF9UT0dHTEVfU0tJUEJBQ0ssIFRQX01BU0tfU0tJUEJBQ0spOworVFJBQ0tQT0lOVF9CSVRfQVRUUihleHRfZGV2LCBUUF9UT0dHTEVfRVhUX0RFViwgVFBfTUFTS19FWFRfREVWKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnRyYWNrcG9pbnRfYXR0cnNbXSA9IHsKKwkmcHNtb3VzZV9hdHRyX3NlbnNpdGl2aXR5LmRhdHRyLmF0dHIsCisJJnBzbW91c2VfYXR0cl9zcGVlZC5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfaW5lcnRpYS5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfcmVhY2guZGF0dHIuYXR0ciwKKwkmcHNtb3VzZV9hdHRyX2RyYWdoeXMuZGF0dHIuYXR0ciwKKwkmcHNtb3VzZV9hdHRyX21pbmRyYWcuZGF0dHIuYXR0ciwKKwkmcHNtb3VzZV9hdHRyX3RocmVzaC5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfdXB0aHJlc2guZGF0dHIuYXR0ciwKKwkmcHNtb3VzZV9hdHRyX3p0aW1lLmRhdHRyLmF0dHIsCisJJnBzbW91c2VfYXR0cl9qZW5rcy5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfcHJlc3NfdG9fc2VsZWN0LmRhdHRyLmF0dHIsCisJJnBzbW91c2VfYXR0cl9za2lwYmFjay5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfZXh0X2Rldi5kYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRyYWNrcG9pbnRfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSB0cmFja3BvaW50X2F0dHJzLAorfTsKKworc3RhdGljIHZvaWQgdHJhY2twb2ludF9kaXNjb25uZWN0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5kZXYua29iaiwgJnRyYWNrcG9pbnRfYXR0cl9ncm91cCk7CisKKwlrZnJlZShwc21vdXNlLT5wcml2YXRlKTsKKwlwc21vdXNlLT5wcml2YXRlID0gTlVMTDsKK30KKworc3RhdGljIGludCB0cmFja3BvaW50X3N5bmMoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJdW5zaWduZWQgY2hhciB0b2dnbGU7CisJc3RydWN0IHRyYWNrcG9pbnRfZGF0YSAqdHAgPSBwc21vdXNlLT5wcml2YXRlOworCisJaWYgKCF0cCkKKwkJcmV0dXJuIC0xOworCisJLyogRGlzYWJsZSBmZWF0dXJlcyB0aGF0IG1heSBtYWtlIGRldmljZSB1bnVzYWJsZSB3aXRoIHRoaXMgZHJpdmVyICovCisJdHJhY2twb2ludF9yZWFkKCZwc21vdXNlLT5wczJkZXYsIFRQX1RPR0dMRV9UV09IQU5ELCAmdG9nZ2xlKTsKKwlpZiAodG9nZ2xlICYgVFBfTUFTS19UV09IQU5EKQorCQl0cmFja3BvaW50X3RvZ2dsZV9iaXQoJnBzbW91c2UtPnBzMmRldiwgVFBfVE9HR0xFX1RXT0hBTkQsIFRQX01BU0tfVFdPSEFORCk7CisKKwl0cmFja3BvaW50X3JlYWQoJnBzbW91c2UtPnBzMmRldiwgVFBfVE9HR0xFX1NPVVJDRV9UQUcsICZ0b2dnbGUpOworCWlmICh0b2dnbGUgJiBUUF9NQVNLX1NPVVJDRV9UQUcpCisJCXRyYWNrcG9pbnRfdG9nZ2xlX2JpdCgmcHNtb3VzZS0+cHMyZGV2LCBUUF9UT0dHTEVfU09VUkNFX1RBRywgVFBfTUFTS19TT1VSQ0VfVEFHKTsKKworCXRyYWNrcG9pbnRfcmVhZCgmcHNtb3VzZS0+cHMyZGV2LCBUUF9UT0dHTEVfTUIsICZ0b2dnbGUpOworCWlmICh0b2dnbGUgJiBUUF9NQVNLX01CKQorCQl0cmFja3BvaW50X3RvZ2dsZV9iaXQoJnBzbW91c2UtPnBzMmRldiwgVFBfVE9HR0xFX01CLCBUUF9NQVNLX01CKTsKKworCS8qIFB1c2ggdGhlIGNvbmZpZyB0byB0aGUgZGV2aWNlICovCisJdHJhY2twb2ludF93cml0ZSgmcHNtb3VzZS0+cHMyZGV2LCBUUF9TRU5TLCB0cC0+c2Vuc2l0aXZpdHkpOworCXRyYWNrcG9pbnRfd3JpdGUoJnBzbW91c2UtPnBzMmRldiwgVFBfSU5FUlRJQSwgdHAtPmluZXJ0aWEpOworCXRyYWNrcG9pbnRfd3JpdGUoJnBzbW91c2UtPnBzMmRldiwgVFBfU1BFRUQsIHRwLT5zcGVlZCk7CisKKwl0cmFja3BvaW50X3dyaXRlKCZwc21vdXNlLT5wczJkZXYsIFRQX1JFQUNILCB0cC0+cmVhY2gpOworCXRyYWNrcG9pbnRfd3JpdGUoJnBzbW91c2UtPnBzMmRldiwgVFBfRFJBR0hZUywgdHAtPmRyYWdoeXMpOworCXRyYWNrcG9pbnRfd3JpdGUoJnBzbW91c2UtPnBzMmRldiwgVFBfTUlORFJBRywgdHAtPm1pbmRyYWcpOworCisJdHJhY2twb2ludF93cml0ZSgmcHNtb3VzZS0+cHMyZGV2LCBUUF9USFJFU0gsIHRwLT50aHJlc2gpOworCXRyYWNrcG9pbnRfd3JpdGUoJnBzbW91c2UtPnBzMmRldiwgVFBfVVBfVEhSRVNILCB0cC0+dXB0aHJlc2gpOworCisJdHJhY2twb2ludF93cml0ZSgmcHNtb3VzZS0+cHMyZGV2LCBUUF9aX1RJTUUsIHRwLT56dGltZSk7CisJdHJhY2twb2ludF93cml0ZSgmcHNtb3VzZS0+cHMyZGV2LCBUUF9KRU5LU19DVVJWLCB0cC0+amVua3MpOworCisJdHJhY2twb2ludF9yZWFkKCZwc21vdXNlLT5wczJkZXYsIFRQX1RPR0dMRV9QVFNPTiwgJnRvZ2dsZSk7CisJaWYgKCgodG9nZ2xlICYgVFBfTUFTS19QVFNPTikgPT0gVFBfTUFTS19QVFNPTikgIT0gdHAtPnByZXNzX3RvX3NlbGVjdCkKKwkJIHRyYWNrcG9pbnRfdG9nZ2xlX2JpdCgmcHNtb3VzZS0+cHMyZGV2LCBUUF9UT0dHTEVfUFRTT04sIFRQX01BU0tfUFRTT04pOworCisJdHJhY2twb2ludF9yZWFkKCZwc21vdXNlLT5wczJkZXYsIFRQX1RPR0dMRV9TS0lQQkFDSywgJnRvZ2dsZSk7CisJaWYgKCgodG9nZ2xlICYgVFBfTUFTS19TS0lQQkFDSykgPT0gVFBfTUFTS19TS0lQQkFDSykgIT0gdHAtPnNraXBiYWNrKQorCQl0cmFja3BvaW50X3RvZ2dsZV9iaXQoJnBzbW91c2UtPnBzMmRldiwgVFBfVE9HR0xFX1NLSVBCQUNLLCBUUF9NQVNLX1NLSVBCQUNLKTsKKworCXRyYWNrcG9pbnRfcmVhZCgmcHNtb3VzZS0+cHMyZGV2LCBUUF9UT0dHTEVfRVhUX0RFViwgJnRvZ2dsZSk7CisJaWYgKCgodG9nZ2xlICYgVFBfTUFTS19FWFRfREVWKSA9PSBUUF9NQVNLX0VYVF9ERVYpICE9IHRwLT5leHRfZGV2KQorCQl0cmFja3BvaW50X3RvZ2dsZV9iaXQoJnBzbW91c2UtPnBzMmRldiwgVFBfVE9HR0xFX0VYVF9ERVYsIFRQX01BU0tfRVhUX0RFVik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHJhY2twb2ludF9kZWZhdWx0cyhzdHJ1Y3QgdHJhY2twb2ludF9kYXRhICp0cCkKK3sKKwl0cC0+cHJlc3NfdG9fc2VsZWN0ID0gVFBfREVGX1BUU09OOworCXRwLT5zZW5zaXRpdml0eSA9IFRQX0RFRl9TRU5TOworCXRwLT5zcGVlZCA9IFRQX0RFRl9TUEVFRDsKKwl0cC0+cmVhY2ggPSBUUF9ERUZfUkVBQ0g7CisKKwl0cC0+ZHJhZ2h5cyA9IFRQX0RFRl9EUkFHSFlTOworCXRwLT5taW5kcmFnID0gVFBfREVGX01JTkRSQUc7CisKKwl0cC0+dGhyZXNoID0gVFBfREVGX1RIUkVTSDsKKwl0cC0+dXB0aHJlc2ggPSBUUF9ERUZfVVBfVEhSRVNIOworCisJdHAtPnp0aW1lID0gVFBfREVGX1pfVElNRTsKKwl0cC0+amVua3MgPSBUUF9ERUZfSkVOS1NfQ1VSVjsKKworCXRwLT5pbmVydGlhID0gVFBfREVGX0lORVJUSUE7CisJdHAtPnNraXBiYWNrID0gVFBfREVGX1NLSVBCQUNLOworCXRwLT5leHRfZGV2ID0gVFBfREVGX0VYVF9ERVY7Cit9CisKK2ludCB0cmFja3BvaW50X2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgaW50IHNldF9wcm9wZXJ0aWVzKQoreworCXN0cnVjdCB0cmFja3BvaW50X2RhdGEgKnByaXY7CisJc3RydWN0IHBzMmRldiAqcHMyZGV2ID0gJnBzbW91c2UtPnBzMmRldjsKKwl1bnNpZ25lZCBjaGFyIGZpcm13YXJlX2lkOworCXVuc2lnbmVkIGNoYXIgYnV0dG9uX2luZm87CisJdW5zaWduZWQgY2hhciBwYXJhbVsyXTsKKworCXBhcmFtWzBdID0gcGFyYW1bMV0gPSAwOworCisJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgcGFyYW0sIE1BS0VfUFMyX0NNRCgwLCAyLCBUUF9SRUFEX0lEKSkpCisJCXJldHVybiAtMTsKKworCWlmIChwYXJhbVswXSAhPSBUUF9NQUdJQ19JREVOVCkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFzZXRfcHJvcGVydGllcykKKwkJcmV0dXJuIDA7CisKKwlmaXJtd2FyZV9pZCA9IHBhcmFtWzFdOworCisJaWYgKHRyYWNrcG9pbnRfcmVhZCgmcHNtb3VzZS0+cHMyZGV2LCBUUF9FWFRfQlROLCAmYnV0dG9uX2luZm8pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInRyYWNrcG9pbnQuYzogZmFpbGVkIHRvIGdldCBleHRlbmRlZCBidXR0b24gZGF0YVxuIik7CisJCWJ1dHRvbl9pbmZvID0gMDsKKwl9CisKKwlwc21vdXNlLT5wcml2YXRlID0gcHJpdiA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0cmFja3BvaW50X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtMTsKKworCXBzbW91c2UtPnZlbmRvciA9ICJJQk0iOworCXBzbW91c2UtPm5hbWUgPSAiVHJhY2tQb2ludCI7CisKKwlwc21vdXNlLT5yZWNvbm5lY3QgPSB0cmFja3BvaW50X3N5bmM7CisJcHNtb3VzZS0+ZGlzY29ubmVjdCA9IHRyYWNrcG9pbnRfZGlzY29ubmVjdDsKKworCXRyYWNrcG9pbnRfZGVmYXVsdHMocHJpdik7CisJdHJhY2twb2ludF9zeW5jKHBzbW91c2UpOworCisJc3lzZnNfY3JlYXRlX2dyb3VwKCZwczJkZXYtPnNlcmlvLT5kZXYua29iaiwgJnRyYWNrcG9pbnRfYXR0cl9ncm91cCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJJQk0gVHJhY2tQb2ludCBmaXJtd2FyZTogMHglMDJ4LCBidXR0b25zOiAlZC8lZFxuIiwKKwkJZmlybXdhcmVfaWQsIChidXR0b25faW5mbyAmIDB4ZjApID4+IDQsIGJ1dHRvbl9pbmZvICYgMHgwZik7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmggYi9kcml2ZXJzL2lucHV0L21vdXNlL3RyYWNrcG9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODU3ZDhiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBJQk0gVHJhY2tQb2ludCBQUy8yIG1vdXNlIGRyaXZlcgorICoKKyAqIFN0ZXBoZW4gRXZhbmNoaWsgPGV2YW5jaHNhQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1RSQUNLUE9JTlRfSAorI2RlZmluZSBfVFJBQ0tQT0lOVF9ICisKKy8qCisgKiBUaGVzZSBjb25zdGFudHMgYXJlIGZyb20gdGhlIFRyYWNrUG9pbnQgU3lzdGVtCisgKiBFbmdpbmVlcmluZyBkb2N1bWVudGF0aW9uIFZlcnNpb24gNCBmcm9tIElCTSBXYXRzb24KKyAqIHJlc2VhcmNoOgorICoJaHR0cDovL3d3d2Nzc3J2LmFsbWFkZW4uaWJtLmNvbS90cmFja3BvaW50L2Rvd25sb2FkLmh0bWwKKyAqLworCisjZGVmaW5lIFRQX0NPTU1BTkQJCTB4RTIJLyogQ29tbWFuZHMgc3RhcnQgd2l0aCB0aGlzICovCisKKyNkZWZpbmUgVFBfUkVBRF9JRAkJMHhFMQkvKiBTZW50IGZvciBkZXZpY2UgaWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgVFBfTUFHSUNfSURFTlQJCTB4MDEJLyogU2VudCBhZnRlciBhIFRQX1JFQURfSUQgZm9sbG93ZWQgKi8KKwkJCQkJLyogYnkgdGhlIGZpcm13YXJlIElEICovCisKKworLyoKKyAqIENvbW1hbmRzCisgKi8KKyNkZWZpbmUgVFBfUkVDQUxJQgkJMHg1MQkvKiBSZWNhbGlicmF0ZSAqLworI2RlZmluZSBUUF9QT1dFUl9ET1dOCQkweDQ0CS8qIENhbiBvbmx5IGJlIHVuZG9uZSB0aHJvdWdoIEhXIHJlc2V0ICovCisjZGVmaW5lIFRQX0VYVF9ERVYJCTB4MjEJLyogRGV0ZXJtaW5lcyBpZiBleHRlcm5hbCBkZXZpY2UgaXMgY29ubmVjdGVkIChSTykgKi8KKyNkZWZpbmUgVFBfRVhUX0JUTgkJMHg0QgkvKiBSZWFkIGV4dGVuZGVkIGJ1dHRvbiBzdGF0dXMgKi8KKyNkZWZpbmUgVFBfUE9SCQkJMHg3RgkvKiBFeGVjdXRlIFBvd2VyIG9uIFJlc2V0ICovCisjZGVmaW5lIFRQX1BPUl9SRVNVTFRTCQkweDI1CS8qIFJlYWQgUG93ZXIgb24gU2VsZiB0ZXN0IHJlc3VsdHMgKi8KKyNkZWZpbmUgVFBfRElTQUJMRV9FWFQJCTB4NDAJLyogRGlzYWJsZSBleHRlcm5hbCBwb2ludGluZyBkZXZpY2UgKi8KKyNkZWZpbmUgVFBfRU5BQkxFX0VYVAkJMHg0MQkvKiBFbmFibGUgZXh0ZXJuYWwgcG9pbnRpbmcgZGV2aWNlICovCisKKy8qCisgKiBNb2RlIG1hbmlwdWxhdGlvbgorICovCisjZGVmaW5lIFRQX1NFVF9TT0ZUX1RSQU5TCTB4NEUJLyogU2V0IG1vZGUgKi8KKyNkZWZpbmUgVFBfQ0FOQ0VMX1NPRlRfVFJBTlMJMHhCOQkvKiBDYW5jZWwgbW9kZSAqLworI2RlZmluZSBUUF9TRVRfSEFSRF9UUkFOUwkweDQ1CS8qIE1vZGUgY2FuIG9ubHkgYmUgc2V0ICovCisKKworLyoKKyAqIFJlZ2lzdGVyIG9yaWVudGVkIGNvbW1hbmRzL3Byb3BlcnRpZXMKKyAqLworI2RlZmluZSBUUF9XUklURV9NRU0JCTB4ODEKKyNkZWZpbmUgVFBfUkVBRF9NRU0JCTB4ODAJLyogTm90IHVzZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiAqLworCisvKgorKiBSQU0gTG9jYXRpb25zIGZvciBwcm9wZXJ0aWVzCisgKi8KKyNkZWZpbmUgVFBfU0VOUwkJCTB4NEEJLyogU2Vuc2l0aXZpdHkgKi8KKyNkZWZpbmUgVFBfTUIJCQkweDRDCS8qIFJlYWQgTWlkZGxlIEJ1dHRvbiBTdGF0dXMgKFJPKSAqLworI2RlZmluZSBUUF9JTkVSVElBCQkweDRECS8qIE5lZ2F0aXZlIEluZXJ0aWEgKi8KKyNkZWZpbmUgVFBfU1BFRUQJCTB4NjAJLyogU3BlZWQgb2YgVFAgQ3Vyc29yICovCisjZGVmaW5lIFRQX1JFQUNICQkweDU3CS8qIEJhY2t1cCBmb3IgWi1heGlzIHByZXNzICovCisjZGVmaW5lIFRQX0RSQUdIWVMJCTB4NTgJLyogRHJhZyBIeXN0ZXJlc2lzICovCisJCQkJCS8qIChob3cgaGFyZCBpdCBpcyB0byBkcmFnICovCisJCQkJCS8qIHdpdGggWi1heGlzIHByZXNzZWQpICovCisKKyNkZWZpbmUgVFBfTUlORFJBRwkJMHg1OQkvKiBNaW5pbXVtIGFtb3VudCBvZiBmb3JjZSBuZWVkZWQgKi8KKwkJCQkJLyogdG8gdHJpZ2dlciBkcmFnZ2luZyAqLworCisjZGVmaW5lIFRQX1RIUkVTSAkJMHg1QwkvKiBNaW5pbXVtIHZhbHVlIGZvciBhIFotYXhpcyBwcmVzcyAqLworI2RlZmluZSBUUF9VUF9USFJFU0gJCTB4NUEJLyogVXNlZCB0byBnZW5lcmF0ZSBhICdjbGljaycgb24gWi1heGlzICovCisjZGVmaW5lIFRQX1pfVElNRQkJMHg1RQkvKiBIb3cgc2hhcnAgb2YgYSBwcmVzcyAqLworI2RlZmluZSBUUF9KRU5LU19DVVJWCQkweDVECS8qIE1pbmltdW0gY3VydmF0dXJlIGZvciBkb3VibGUgY2xpY2sgKi8KKworLyoKKyAqIFRvZ2dsaW5nIEZsYWcgYml0cworICovCisjZGVmaW5lIFRQX1RPR0dMRQkJMHg0NwkvKiBUb2dnbGUgY29tbWFuZCAqLworCisjZGVmaW5lIFRQX1RPR0dMRV9NQgkJMHgyMwkvKiBEaXNhYmxlL0VuYWJsZSBNaWRkbGUgQnV0dG9uICovCisjZGVmaW5lIFRQX01BU0tfTUIJCQkweDAxCisjZGVmaW5lIFRQX1RPR0dMRV9FWFRfREVWCTB4MjMJLyogVG9nZ2xlIGV4dGVybmFsIGRldmljZSAqLworI2RlZmluZSBUUF9NQVNLX0VYVF9ERVYJCQkweDAyCisjZGVmaW5lIFRQX1RPR0dMRV9EUklGVAkJMHgyMwkvKiBEcmlmdCBDb3JyZWN0aW9uICovCisjZGVmaW5lIFRQX01BU0tfRFJJRlQJCQkweDgwCisjZGVmaW5lIFRQX1RPR0dMRV9CVVJTVAkJMHgyOAkvKiBCdXJzdCBNb2RlICovCisjZGVmaW5lIFRQX01BU0tfQlVSU1QJCQkweDgwCisjZGVmaW5lIFRQX1RPR0dMRV9QVFNPTgkJMHgyQwkvKiBQcmVzcyB0byBTZWxlY3QgKi8KKyNkZWZpbmUgVFBfTUFTS19QVFNPTgkJCTB4MDEKKyNkZWZpbmUgVFBfVE9HR0xFX0hBUkRfVFJBTlMJMHgyQwkvKiBBbHRlcm5hdGUgbWV0aG9kIHRvIHNldCBIYXJkIFRyYW5zcGFyZW5jeSAqLworI2RlZmluZSBUUF9NQVNLX0hBUkRfVFJBTlMJCTB4ODAKKyNkZWZpbmUgVFBfVE9HR0xFX1RXT0hBTkQJMHgyRAkvKiBUd28gaGFuZGVkICovCisjZGVmaW5lIFRQX01BU0tfVFdPSEFORAkJCTB4MDEKKyNkZWZpbmUgVFBfVE9HR0xFX1NUSUNLWV9UV08JMHgyRAkvKiBTdGlja3kgdHdvIGhhbmRlZCAqLworI2RlZmluZSBUUF9NQVNLX1NUSUNLWV9UV08JCTB4MDQKKyNkZWZpbmUgVFBfVE9HR0xFX1NLSVBCQUNLCTB4MkQJLyogU3VwcHJlc3MgbW92ZW1lbnQgYWZ0ZXIgZHJhZyByZWxlYXNlICovCisjZGVmaW5lIFRQX01BU0tfU0tJUEJBQ0sJCTB4MDgKKyNkZWZpbmUgVFBfVE9HR0xFX1NPVVJDRV9UQUcJMHgyMAkvKiBCaXQgMyBvZiB0aGUgZmlyc3QgcGFja2V0IHdpbGwgYmUgc2V0IHRvCisJCQkJCSAgIHRvIHRoZSBvcmlnaW4gb2YgdGhlIHBhY2tldCAoZXh0ZXJuYWwgb3IgVFApICovCisjZGVmaW5lIFRQX01BU0tfU09VUkNFX1RBRwkJMHg4MAorI2RlZmluZSBUUF9UT0dHTEVfRVhUX1RBRwkweDIyCS8qIEJpdCAzIG9mIHRoZSBmaXJzdCBwYWNrZXQgY29taW5nIGZyb20gdGhlCisJCQkJCSAgIGV4dGVybmFsIGRldmljZSB3aWxsIGJlIGZvcmNlZCB0byAxICovCisjZGVmaW5lIFRQX01BU0tfRVhUX1RBRwkJCTB4MDQKKworCisvKiBQb3dlciBvbiBTZWxmIFRlc3QgUmVzdWx0cyAqLworI2RlZmluZSBUUF9QT1JfU1VDQ0VTUwkJMHgzQgorCisvKgorICogRGVmYXVsdCBwb3dlciBvbiB2YWx1ZXMKKyAqLworI2RlZmluZSBUUF9ERUZfU0VOUwkJMHg4MAorI2RlZmluZSBUUF9ERUZfSU5FUlRJQQkJMHgwNgorI2RlZmluZSBUUF9ERUZfU1BFRUQJCTB4NjEKKyNkZWZpbmUgVFBfREVGX1JFQUNICQkweDBBCisKKyNkZWZpbmUgVFBfREVGX0RSQUdIWVMJCTB4RkYKKyNkZWZpbmUgVFBfREVGX01JTkRSQUcJCTB4MTQKKworI2RlZmluZSBUUF9ERUZfVEhSRVNICQkweDA4CisjZGVmaW5lIFRQX0RFRl9VUF9USFJFU0gJMHhGRgorI2RlZmluZSBUUF9ERUZfWl9USU1FCQkweDI2CisjZGVmaW5lIFRQX0RFRl9KRU5LU19DVVJWCTB4ODcKKworLyogVG9nZ2xlcyAqLworI2RlZmluZSBUUF9ERUZfTUIJCTB4MDAKKyNkZWZpbmUgVFBfREVGX1BUU09OCQkweDAwCisjZGVmaW5lIFRQX0RFRl9TS0lQQkFDSwkJMHgwMAorI2RlZmluZSBUUF9ERUZfRVhUX0RFVgkJMHgwMQorCisjZGVmaW5lIE1BS0VfUFMyX0NNRChwYXJhbXMsIHJlc3VsdHMsIGNtZCkgKChwYXJhbXM8PDEyKSB8IChyZXN1bHRzPDw4KSB8IChjbWQpKQorCitzdHJ1Y3QgdHJhY2twb2ludF9kYXRhCit7CisJdW5zaWduZWQgY2hhciBzZW5zaXRpdml0eSwgc3BlZWQsIGluZXJ0aWEsIHJlYWNoOworCXVuc2lnbmVkIGNoYXIgZHJhZ2h5cywgbWluZHJhZzsKKwl1bnNpZ25lZCBjaGFyIHRocmVzaCwgdXB0aHJlc2g7CisJdW5zaWduZWQgY2hhciB6dGltZSwgamVua3M7CisKKwl1bnNpZ25lZCBjaGFyIHByZXNzX3RvX3NlbGVjdDsKKwl1bnNpZ25lZCBjaGFyIHNraXBiYWNrOworCisJdW5zaWduZWQgY2hhciBleHRfZGV2OworfTsKKworZXh0ZXJuIGludCB0cmFja3BvaW50X2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgaW50IHNldF9wcm9wZXJ0aWVzKTsKKworI2VuZGlmIC8qIF9UUkFDS1BPSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItaW8uaCBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItaW8uaAppbmRleCBjOWU2MzNkLi45YTkyMjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLWlvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1pby5oCkBAIC02OSwxNiArNjksMTYgQEAKICAqLwogI2lmICFkZWZpbmVkKF9fc2hfXykgJiYgIWRlZmluZWQoX19hbHBoYV9fKSAmJiAhZGVmaW5lZChfX21pcHNfXykgJiYgIWRlZmluZWQoQ09ORklHX1BQQzY0KQogCWlmICghcmVxdWVzdF9yZWdpb24oSTgwNDJfREFUQV9SRUcsIDE2LCAiaTgwNDIiKSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVCVVNZOwogI2VuZGlmCiAKICAgICAgICAgaTgwNDJfcmVzZXQgPSAxOwogCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDNjQpCiAJaWYgKGNoZWNrX2xlZ2FjeV9pb3BvcnQoSTgwNDJfREFUQV9SRUcpKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUJVU1k7CiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihJODA0Ml9EQVRBX1JFRywgMTYsICJpODA0MiIpKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUJVU1k7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItaXAyMmlvLmggYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLWlwMjJpby5oCmluZGV4IDg2M2I5YzkuLmVlMWFkMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItaXAyMmlvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1pcDIyaW8uaApAQCAtNTgsNyArNTgsNyBAQAogI2lmIDAKIAkvKiBYWFggc2dpX2toIGlzIGEgdmlydHVhbCBhZGRyZXNzICovCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oc2dpX2toLCBzaXplb2Yoc3RydWN0IGhwY19rZXliKSwgImk4MDQyIikpCi0JCXJldHVybiAxOworCQlyZXR1cm4gLUVCVVNZOwogI2VuZGlmCiAKIAlpODA0Ml9yZXNldCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLWphenppby5oIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1qYXp6aW8uaAppbmRleCA1YzIwYWIxLi4xM2ZkNzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLWphenppby5oCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItamF6emlvLmgKQEAgLTUzLDcgKzUzLDcgQEAKICNpZiAwCiAJLyogWFhYIEpBWlpfS0VZQk9BUkRfQUREUkVTUyBpcyBhIHZpcnR1YWwgYWRkcmVzcyAqLwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKEpBWlpfS0VZQk9BUkRfQUREUkVTUywgMiwgImk4MDQyIikpCi0JCXJldHVybiAxOworCQlyZXR1cm4gLUVCVVNZOwogI2VuZGlmCiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItc3BhcmNpby5oIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1zcGFyY2lvLmgKaW5kZXggZGEyYTE5OC4uZWQ5NDQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1zcGFyY2lvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1zcGFyY2lvLmgKQEAgLTQ4LDEwICs0OCwxMCBAQAogI2RlZmluZSBPQlBfUFMyTVNfTkFNRTEJCSJrZG1vdXNlIgogI2RlZmluZSBPQlBfUFMyTVNfTkFNRTIJCSJtb3VzZSIKIAotc3RhdGljIGludCBpODA0Ml9wbGF0Zm9ybV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpODA0Ml9wbGF0Zm9ybV9pbml0KHZvaWQpCiB7CiAjaWZuZGVmIENPTkZJR19QQ0kKLQlyZXR1cm4gLTE7CisJcmV0dXJuIC1FTk9ERVY7CiAjZWxzZQogCWNoYXIgcHJvcFsxMjhdOwogCWludCBsZW47CkBAIC01OSwxNCArNTksMTQgQEAKIAlsZW4gPSBwcm9tX2dldHByb3BlcnR5KHByb21fcm9vdF9ub2RlLCAibmFtZSIsIHByb3AsIHNpemVvZihwcm9wKSk7CiAJaWYgKGxlbiA8IDApIHsKIAkJcHJpbnRrKCJpODA0MjogQ2Fubm90IGdldCBuYW1lIHByb3BlcnR5IG9mIHJvb3QgT0JQIG5vZGUuXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaWYgKHN0cm5jbXAocHJvcCwgIlNVTlcsSmF2YVN0YXRpb24tMSIsIGxlbikgPT0gMCkgewogCQkvKiBIYXJkY29kZWQgdmFsdWVzIGZvciBNckNvZmZlZS4gICovCiAJCWk4MDQyX2tiZF9pcnEgPSBpODA0Ml9hdXhfaXJxID0gMTMgfCAweDIwOwogCQlrYmRfaW9iYXNlID0gaW9yZW1hcCgweDcxMzAwMDYwLCA4KTsKIAkJaWYgKCFrYmRfaW9iYXNlKQotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FTk9ERVY7CiAJfSBlbHNlIHsKIAkJc3RydWN0IGxpbnV4X2VidXMgKmVidXM7CiAJCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldjsKQEAgLTc4LDcgKzc4LDcgQEAKIAkJCQkJZ290byBlZGV2X2ZvdW5kOwogCQkJfQogCQl9Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAllZGV2X2ZvdW5kOgogCQlmb3JfZWFjaF9lZGV2Y2hpbGQoZWRldiwgY2hpbGQpIHsKQEAgLTk2LDcgKzk2LDcgQEAKIAkJICAgIGk4MDQyX2F1eF9pcnEgPT0gLTEpIHsKIAkJCXByaW50aygiaTgwNDI6IEVycm9yLCA4MDQyIGRldmljZSBsYWNrcyBib3RoIGtiZCBhbmQgIgogCQkJICAgICAgICJtb3VzZSBub2Rlcy5cbiIpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmggYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCmluZGV4IDAzODc3YzguLjI3M2JiM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaApAQCAtMTM4LDYgKzEzOCwxMyBAQAogCQl9LAogCX0sCiAJeworCQkuaWRlbnQgPSAiRnVqaXRzdS1TaWVtZW5zIExpZmVib29rIEU0MDEwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJGVUpJVFNVIFNJRU1FTlMiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTElGRUJPT0sgRTQwMTAiKSwKKwkJfSwKKwl9LAorCXsKIAkJLmlkZW50ID0gIlRvc2hpYmEgUDEwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJUT1NISUJBIiksCkBAIC0yNTYsOSArMjYzLDEwIEBACiAJfQogfQogCi1zdGF0aWMgaW50IGk4MDQyX3BucF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpODA0Ml9wbnBfaW5pdCh2b2lkKQogewotCWludCByZXN1bHRfa2JkLCByZXN1bHRfYXV4OworCWludCByZXN1bHRfa2JkID0gMCwgcmVzdWx0X2F1eCA9IDA7CisJY2hhciBrYmRfaXJxX3N0cls0XSA9IHsgMCB9LCBhdXhfaXJxX3N0cls0XSA9IHsgMCB9OwogCiAJaWYgKGk4MDQyX25vcG5wKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImk4MDQyOiBQTlAgZGV0ZWN0aW9uIGRpc2FibGVkXG4iKTsKQEAgLTI2Nyw2ICsyNzUsNyBAQAogCiAJaWYgKChyZXN1bHRfa2JkID0gcG5wX3JlZ2lzdGVyX2RyaXZlcigmaTgwNDJfcG5wX2tiZF9kcml2ZXIpKSA+PSAwKQogCQlpODA0Ml9wbnBfa2JkX3JlZ2lzdGVyZWQgPSAxOworCiAJaWYgKChyZXN1bHRfYXV4ID0gcG5wX3JlZ2lzdGVyX2RyaXZlcigmaTgwNDJfcG5wX2F1eF9kcml2ZXIpKSA+PSAwKQogCQlpODA0Ml9wbnBfYXV4X3JlZ2lzdGVyZWQgPSAxOwogCkBAIC0yODAsNiArMjg5LDI3IEBACiAjZW5kaWYKIAl9CiAKKwlpZiAocmVzdWx0X2tiZCA+IDApCisJCXNucHJpbnRmKGtiZF9pcnFfc3RyLCBzaXplb2Yoa2JkX2lycV9zdHIpLAorCQkJIiVkIiwgaTgwNDJfcG5wX2tiZF9pcnEpOworCWlmIChyZXN1bHRfYXV4ID4gMCkKKwkJc25wcmludGYoYXV4X2lycV9zdHIsIHNpemVvZihhdXhfaXJxX3N0ciksCisJCQkiJWQiLCBpODA0Ml9wbnBfYXV4X2lycSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJQTlA6IFBTLzIgQ29udHJvbGxlciBbJXMlcyVzXSBhdCAlI3gsJSN4IGlycSAlcyVzJXNcbiIsCisJCWk4MDQyX3BucF9rYmRfbmFtZSwgKHJlc3VsdF9rYmQgPiAwICYmIHJlc3VsdF9hdXggPiAwKSA/ICIsIiA6ICIiLAorCQlpODA0Ml9wbnBfYXV4X25hbWUsCisJCWk4MDQyX3BucF9kYXRhX3JlZywgaTgwNDJfcG5wX2NvbW1hbmRfcmVnLAorCQlrYmRfaXJxX3N0ciwgKHJlc3VsdF9rYmQgPiAwICYmIHJlc3VsdF9hdXggPiAwKSA/ICIsIiA6ICIiLAorCQlhdXhfaXJxX3N0cik7CisKKyNpZiBkZWZpbmVkKF9faWE2NF9fKQorCWlmIChyZXN1bHRfa2JkIDw9IDApCisJCWk4MDQyX25va2JkID0gMTsKKwlpZiAocmVzdWx0X2F1eCA8PSAwKQorCQlpODA0Ml9ub2F1eCA9IDE7CisjZW5kaWYKKwogCWlmICgoKGk4MDQyX3BucF9kYXRhX3JlZyAmIH4weGYpID09IChpODA0Ml9kYXRhX3JlZyAmIH4weGYpICYmCiAJICAgICAgaTgwNDJfcG5wX2RhdGFfcmVnICE9IGk4MDQyX2RhdGFfcmVnKSB8fCAhaTgwNDJfcG5wX2RhdGFfcmVnKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBOUDogUFMvMiBjb250cm9sbGVyIGhhcyBpbnZhbGlkIGRhdGEgcG9ydCAlI3g7IHVzaW5nIGRlZmF1bHQgJSN4XG4iLApAQCAtMjk0LDUzICszMjQsNDcgQEAKIAkJaTgwNDJfcG5wX2NvbW1hbmRfcmVnID0gaTgwNDJfY29tbWFuZF9yZWc7CiAJfQogCi0JaWYgKCFpODA0Ml9wbnBfa2JkX2lycSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJQTlA6IFBTLzIgY29udHJvbGxlciBkb2Vzbid0IGhhdmUgS0JEIGlycTsgdXNpbmcgZGVmYXVsdCAlI3hcbiIsIGk4MDQyX2tiZF9pcnEpOworCWlmICghaTgwNDJfbm9rYmQgJiYgIWk4MDQyX3BucF9rYmRfaXJxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBOUDogUFMvMiBjb250cm9sbGVyIGRvZXNuJ3QgaGF2ZSBLQkQgaXJxOyB1c2luZyBkZWZhdWx0ICVkXG4iLCBpODA0Ml9rYmRfaXJxKTsKIAkJaTgwNDJfcG5wX2tiZF9pcnEgPSBpODA0Ml9rYmRfaXJxOwogCX0KIAotCWlmICghaTgwNDJfcG5wX2F1eF9pcnEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUE5QOiBQUy8yIGNvbnRyb2xsZXIgZG9lc24ndCBoYXZlIEFVWCBpcnE7IHVzaW5nIGRlZmF1bHQgJSN4XG4iLCBpODA0Ml9hdXhfaXJxKTsKKwlpZiAoIWk4MDQyX25vYXV4ICYmICFpODA0Ml9wbnBfYXV4X2lycSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQTlA6IFBTLzIgY29udHJvbGxlciBkb2Vzbid0IGhhdmUgQVVYIGlycTsgdXNpbmcgZGVmYXVsdCAlZFxuIiwgaTgwNDJfYXV4X2lycSk7CiAJCWk4MDQyX3BucF9hdXhfaXJxID0gaTgwNDJfYXV4X2lycTsKIAl9CiAKLSNpZiBkZWZpbmVkKF9faWE2NF9fKQotCWlmIChyZXN1bHRfYXV4IDw9IDApCi0JCWk4MDQyX25vYXV4ID0gMTsKLSNlbmRpZgotCiAJaTgwNDJfZGF0YV9yZWcgPSBpODA0Ml9wbnBfZGF0YV9yZWc7CiAJaTgwNDJfY29tbWFuZF9yZWcgPSBpODA0Ml9wbnBfY29tbWFuZF9yZWc7CiAJaTgwNDJfa2JkX2lycSA9IGk4MDQyX3BucF9rYmRfaXJxOwogCWk4MDQyX2F1eF9pcnEgPSBpODA0Ml9wbnBfYXV4X2lycTsKIAotCXByaW50ayhLRVJOX0lORk8gIlBOUDogUFMvMiBDb250cm9sbGVyIFslcyVzJXNdIGF0ICUjeCwlI3ggaXJxICVkJXMlZFxuIiwKLQkJaTgwNDJfcG5wX2tiZF9uYW1lLCAocmVzdWx0X2tiZCA+IDAgJiYgcmVzdWx0X2F1eCA+IDApID8gIiwiIDogIiIsIGk4MDQyX3BucF9hdXhfbmFtZSwKLQkJaTgwNDJfZGF0YV9yZWcsIGk4MDQyX2NvbW1hbmRfcmVnLCBpODA0Ml9rYmRfaXJxLAotCQkocmVzdWx0X2F1eCA+IDApID8gIiwiIDogIiIsIGk4MDQyX2F1eF9pcnEpOwotCiAJcmV0dXJuIDA7CiB9CiAKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpODA0Ml9wbnBfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaTgwNDJfcG5wX2V4aXQodm9pZCkgeyB9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBpbnQgaTgwNDJfcGxhdGZvcm1faW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaTgwNDJfcGxhdGZvcm1faW5pdCh2b2lkKQogeworCWludCByZXR2YWw7CisKIC8qCiAgKiBPbiBpeDg2IHBsYXRmb3JtcyB0b3VjaGluZyB0aGUgaTgwNDIgZGF0YSByZWdpc3RlciByZWdpb24gY2FuIGRvIHJlYWxseQogICogYmFkIHRoaW5ncy4gQmVjYXVzZSBvZiB0aGlzIHRoZSByZWdpb24gaXMgYWx3YXlzIHJlc2VydmVkIG9uIGl4ODYgYm94ZXMuCiAgKgogICoJaWYgKCFyZXF1ZXN0X3JlZ2lvbihJODA0Ml9EQVRBX1JFRywgMTYsICJpODA0MiIpKQotICoJCXJldHVybiAtMTsKKyAqCQlyZXR1cm4gLUVCVVNZOwogICovCiAKIAlpODA0Ml9rYmRfaXJxID0gSTgwNDJfTUFQX0lSUSgxKTsKIAlpODA0Ml9hdXhfaXJxID0gSTgwNDJfTUFQX0lSUSgxMik7CiAKLSNpZmRlZiBDT05GSUdfUE5QCi0JaWYgKGk4MDQyX3BucF9pbml0KCkpCi0JCXJldHVybiAtMTsKLSNlbmRpZgorCXJldHZhbCA9IGk4MDQyX3BucF9pbml0KCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKIAogI2lmIGRlZmluZWQoX19pYTY0X18pCiAgICAgICAgIGk4MDQyX3Jlc2V0ID0gMTsKQEAgLTM1NCwxNCArMzc4LDEyIEBACiAJCWk4MDQyX25vbXV4ID0gMTsKICNlbmRpZgogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGk4MDQyX3BsYXRmb3JtX2V4aXQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfUE5QCiAJaTgwNDJfcG5wX2V4aXQoKTsKLSNlbmRpZgogfQogCiAjZW5kaWYgLyogX0k4MDQyX1g4NklBNjRJT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKaW5kZXggNzA4YTFkMy4uNDBkNDUxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYwpAQCAtMjcsNiArMjcsMTAgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiaTgwNDIga2V5Ym9hcmQgYW5kIG1vdXNlIGNvbnRyb2xsZXIgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaTgwNDJfbm9rYmQ7Cittb2R1bGVfcGFyYW1fbmFtZWQobm9rYmQsIGk4MDQyX25va2JkLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm9rYmQsICJEbyBub3QgcHJvYmUgb3IgdXNlIEtCRCBwb3J0LiIpOworCiBzdGF0aWMgdW5zaWduZWQgaW50IGk4MDQyX25vYXV4OwogbW9kdWxlX3BhcmFtX25hbWVkKG5vYXV4LCBpODA0Ml9ub2F1eCwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vYXV4LCAiRG8gbm90IHByb2JlIG9yIHVzZSBBVVggKG1vdXNlKSBwb3J0LiIpOwpAQCAtMzM4LDEwICszNDIsMTAgQEAKIAogCXJldHVybiAwOwogCi1hY3RpdmF0ZV9mYWlsOgorIGFjdGl2YXRlX2ZhaWw6CiAJZnJlZV9pcnEocG9ydC0+aXJxLCBpODA0Ml9yZXF1ZXN0X2lycV9jb29raWUpOwogCi1pcnFfZmFpbDoKKyBpcnFfZmFpbDoKIAlzZXJpb191bnJlZ2lzdGVyX3BvcnRfZGVsYXllZChzZXJpbyk7CiAKIAlyZXR1cm4gLTE7CkBAIC00ODUsNyArNDg5LDcgQEAKIAkJc2VyaW9faW50ZXJydXB0KHBvcnQtPnNlcmlvLCBkYXRhLCBkZmwsIHJlZ3MpOwogCiAJcmV0ID0gMTsKLW91dDoKKyBvdXQ6CiAJcmV0dXJuIElSUV9SRVRWQUwocmV0KTsKIH0KIApAQCAtNTUyLDcgKzU1Niw3IEBACiAgKiBFbmFibGUgYWxsIG11eGVkIHBvcnRzLgogICovCiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEk4MDQyX05VTV9NVVhfUE9SVFM7IGkrKykgewogCQlpODA0Ml9jb21tYW5kKCZwYXJhbSwgSTgwNDJfQ01EX01VWF9QRlggKyBpKTsKIAkJaTgwNDJfY29tbWFuZCgmcGFyYW0sIEk4MDQyX0NNRF9BVVhfRU5BQkxFKTsKIAl9CkBAIC02ODIsNyArNjg2LDcgQEAKIAkJa2ZyZWUocG9ydC0+c2VyaW8pOwogCQlwb3J0LT5zZXJpbyA9IE5VTEw7CiAJCWk4MDQyX2N0ciB8PSBwb3J0LT5kaXNhYmxlOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlPOwogCX0KIAogCXByaW50ayhLRVJOX0lORk8gInNlcmlvOiBpODA0MiAlcyBwb3J0IGF0ICUjbHgsJSNseCBpcnEgJWRcbiIsCkBAIC05NzcsODUgKzk4MSw4OCBAQAogCS5zaHV0ZG93bgk9IGk4MDQyX3NodXRkb3duLAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGk4MDQyX2NyZWF0ZV9rYmRfcG9ydCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaTgwNDJfY3JlYXRlX2tiZF9wb3J0KHZvaWQpCiB7CiAJc3RydWN0IHNlcmlvICpzZXJpbzsKIAlzdHJ1Y3QgaTgwNDJfcG9ydCAqcG9ydCA9ICZpODA0Ml9wb3J0c1tJODA0Ml9LQkRfUE9SVF9OT107CiAKLQlzZXJpbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpbyksIEdGUF9LRVJORUwpOwotCWlmIChzZXJpbykgewotCQltZW1zZXQoc2VyaW8sIDAsIHNpemVvZihzdHJ1Y3Qgc2VyaW8pKTsKLQkJc2VyaW8tPmlkLnR5cGUJCT0gaTgwNDJfZGlyZWN0ID8gU0VSSU9fODA0MiA6IFNFUklPXzgwNDJfWEw7Ci0JCXNlcmlvLT53cml0ZQkJPSBpODA0Ml9kdW1ia2JkID8gTlVMTCA6IGk4MDQyX2tiZF93cml0ZTsKLQkJc2VyaW8tPm9wZW4JCT0gaTgwNDJfb3BlbjsKLQkJc2VyaW8tPmNsb3NlCQk9IGk4MDQyX2Nsb3NlOwotCQlzZXJpby0+c3RhcnQJCT0gaTgwNDJfc3RhcnQ7Ci0JCXNlcmlvLT5zdG9wCQk9IGk4MDQyX3N0b3A7Ci0JCXNlcmlvLT5wb3J0X2RhdGEJPSBwb3J0OwotCQlzZXJpby0+ZGV2LnBhcmVudAk9ICZpODA0Ml9wbGF0Zm9ybV9kZXZpY2UtPmRldjsKLQkJc3RybGNweShzZXJpby0+bmFtZSwgImk4MDQyIEtiZCBQb3J0Iiwgc2l6ZW9mKHNlcmlvLT5uYW1lKSk7Ci0JCXN0cmxjcHkoc2VyaW8tPnBoeXMsIEk4MDQyX0tCRF9QSFlTX0RFU0MsIHNpemVvZihzZXJpby0+cGh5cykpOworCXNlcmlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJpbykKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkJcG9ydC0+c2VyaW8gPSBzZXJpbzsKLQkJaTgwNDJfcG9ydF9yZWdpc3Rlcihwb3J0KTsKLQl9CisJc2VyaW8tPmlkLnR5cGUJCT0gaTgwNDJfZGlyZWN0ID8gU0VSSU9fODA0MiA6IFNFUklPXzgwNDJfWEw7CisJc2VyaW8tPndyaXRlCQk9IGk4MDQyX2R1bWJrYmQgPyBOVUxMIDogaTgwNDJfa2JkX3dyaXRlOworCXNlcmlvLT5vcGVuCQk9IGk4MDQyX29wZW47CisJc2VyaW8tPmNsb3NlCQk9IGk4MDQyX2Nsb3NlOworCXNlcmlvLT5zdGFydAkJPSBpODA0Ml9zdGFydDsKKwlzZXJpby0+c3RvcAkJPSBpODA0Ml9zdG9wOworCXNlcmlvLT5wb3J0X2RhdGEJPSBwb3J0OworCXNlcmlvLT5kZXYucGFyZW50CT0gJmk4MDQyX3BsYXRmb3JtX2RldmljZS0+ZGV2OworCXN0cmxjcHkoc2VyaW8tPm5hbWUsICJpODA0MiBLYmQgUG9ydCIsIHNpemVvZihzZXJpby0+bmFtZSkpOworCXN0cmxjcHkoc2VyaW8tPnBoeXMsIEk4MDQyX0tCRF9QSFlTX0RFU0MsIHNpemVvZihzZXJpby0+cGh5cykpOworCisJcG9ydC0+c2VyaW8gPSBzZXJpbzsKKworCXJldHVybiBpODA0Ml9wb3J0X3JlZ2lzdGVyKHBvcnQpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaTgwNDJfY3JlYXRlX2F1eF9wb3J0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpODA0Ml9jcmVhdGVfYXV4X3BvcnQodm9pZCkKIHsKIAlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOwogCXN0cnVjdCBpODA0Ml9wb3J0ICpwb3J0ID0gJmk4MDQyX3BvcnRzW0k4MDQyX0FVWF9QT1JUX05PXTsKIAotCXNlcmlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNlcmlvKSB7Ci0JCW1lbXNldChzZXJpbywgMCwgc2l6ZW9mKHN0cnVjdCBzZXJpbykpOwotCQlzZXJpby0+aWQudHlwZQkJPSBTRVJJT184MDQyOwotCQlzZXJpby0+d3JpdGUJCT0gaTgwNDJfYXV4X3dyaXRlOwotCQlzZXJpby0+b3BlbgkJPSBpODA0Ml9vcGVuOwotCQlzZXJpby0+Y2xvc2UJCT0gaTgwNDJfY2xvc2U7Ci0JCXNlcmlvLT5zdGFydAkJPSBpODA0Ml9zdGFydDsKLQkJc2VyaW8tPnN0b3AJCT0gaTgwNDJfc3RvcDsKLQkJc2VyaW8tPnBvcnRfZGF0YQk9IHBvcnQ7Ci0JCXNlcmlvLT5kZXYucGFyZW50CT0gJmk4MDQyX3BsYXRmb3JtX2RldmljZS0+ZGV2OwotCQlzdHJsY3B5KHNlcmlvLT5uYW1lLCAiaTgwNDIgQXV4IFBvcnQiLCBzaXplb2Yoc2VyaW8tPm5hbWUpKTsKLQkJc3RybGNweShzZXJpby0+cGh5cywgSTgwNDJfQVVYX1BIWVNfREVTQywgc2l6ZW9mKHNlcmlvLT5waHlzKSk7CisJc2VyaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlcmlvKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCQlwb3J0LT5zZXJpbyA9IHNlcmlvOwotCQlpODA0Ml9wb3J0X3JlZ2lzdGVyKHBvcnQpOwotCX0KKwlzZXJpby0+aWQudHlwZQkJPSBTRVJJT184MDQyOworCXNlcmlvLT53cml0ZQkJPSBpODA0Ml9hdXhfd3JpdGU7CisJc2VyaW8tPm9wZW4JCT0gaTgwNDJfb3BlbjsKKwlzZXJpby0+Y2xvc2UJCT0gaTgwNDJfY2xvc2U7CisJc2VyaW8tPnN0YXJ0CQk9IGk4MDQyX3N0YXJ0OworCXNlcmlvLT5zdG9wCQk9IGk4MDQyX3N0b3A7CisJc2VyaW8tPnBvcnRfZGF0YQk9IHBvcnQ7CisJc2VyaW8tPmRldi5wYXJlbnQJPSAmaTgwNDJfcGxhdGZvcm1fZGV2aWNlLT5kZXY7CisJc3RybGNweShzZXJpby0+bmFtZSwgImk4MDQyIEF1eCBQb3J0Iiwgc2l6ZW9mKHNlcmlvLT5uYW1lKSk7CisJc3RybGNweShzZXJpby0+cGh5cywgSTgwNDJfQVVYX1BIWVNfREVTQywgc2l6ZW9mKHNlcmlvLT5waHlzKSk7CisKKwlwb3J0LT5zZXJpbyA9IHNlcmlvOworCisJcmV0dXJuIGk4MDQyX3BvcnRfcmVnaXN0ZXIocG9ydCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpODA0Ml9jcmVhdGVfbXV4X3BvcnQoaW50IGluZGV4KQorc3RhdGljIGludCBfX2luaXQgaTgwNDJfY3JlYXRlX211eF9wb3J0KGludCBpbmRleCkKIHsKIAlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOwogCXN0cnVjdCBpODA0Ml9wb3J0ICpwb3J0ID0gJmk4MDQyX3BvcnRzW0k4MDQyX01VWF9QT1JUX05PICsgaW5kZXhdOwogCi0Jc2VyaW8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoc2VyaW8pIHsKLQkJbWVtc2V0KHNlcmlvLCAwLCBzaXplb2Yoc3RydWN0IHNlcmlvKSk7Ci0JCXNlcmlvLT5pZC50eXBlCQk9IFNFUklPXzgwNDI7Ci0JCXNlcmlvLT53cml0ZQkJPSBpODA0Ml9hdXhfd3JpdGU7Ci0JCXNlcmlvLT5vcGVuCQk9IGk4MDQyX29wZW47Ci0JCXNlcmlvLT5jbG9zZQkJPSBpODA0Ml9jbG9zZTsKLQkJc2VyaW8tPnN0YXJ0CQk9IGk4MDQyX3N0YXJ0OwotCQlzZXJpby0+c3RvcAkJPSBpODA0Ml9zdG9wOwotCQlzZXJpby0+cG9ydF9kYXRhCT0gcG9ydDsKLQkJc2VyaW8tPmRldi5wYXJlbnQJPSAmaTgwNDJfcGxhdGZvcm1fZGV2aWNlLT5kZXY7Ci0JCXNucHJpbnRmKHNlcmlvLT5uYW1lLCBzaXplb2Yoc2VyaW8tPm5hbWUpLCAiaTgwNDIgQXV4LSVkIFBvcnQiLCBpbmRleCk7Ci0JCXNucHJpbnRmKHNlcmlvLT5waHlzLCBzaXplb2Yoc2VyaW8tPnBoeXMpLCBJODA0Ml9NVVhfUEhZU19ERVNDLCBpbmRleCArIDEpOworCXNlcmlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJpbykKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkJKnBvcnQgPSBpODA0Ml9wb3J0c1tJODA0Ml9BVVhfUE9SVF9OT107Ci0JCXBvcnQtPmV4aXN0cyA9IDA7Ci0JCXNucHJpbnRmKHBvcnQtPm5hbWUsIHNpemVvZihwb3J0LT5uYW1lKSwgIkFVWCVkIiwgaW5kZXgpOwotCQlwb3J0LT5tdXggPSBpbmRleDsKLQkJcG9ydC0+c2VyaW8gPSBzZXJpbzsKLQkJaTgwNDJfcG9ydF9yZWdpc3Rlcihwb3J0KTsKLQl9CisJc2VyaW8tPmlkLnR5cGUJCT0gU0VSSU9fODA0MjsKKwlzZXJpby0+d3JpdGUJCT0gaTgwNDJfYXV4X3dyaXRlOworCXNlcmlvLT5vcGVuCQk9IGk4MDQyX29wZW47CisJc2VyaW8tPmNsb3NlCQk9IGk4MDQyX2Nsb3NlOworCXNlcmlvLT5zdGFydAkJPSBpODA0Ml9zdGFydDsKKwlzZXJpby0+c3RvcAkJPSBpODA0Ml9zdG9wOworCXNlcmlvLT5wb3J0X2RhdGEJPSBwb3J0OworCXNlcmlvLT5kZXYucGFyZW50CT0gJmk4MDQyX3BsYXRmb3JtX2RldmljZS0+ZGV2OworCXNucHJpbnRmKHNlcmlvLT5uYW1lLCBzaXplb2Yoc2VyaW8tPm5hbWUpLCAiaTgwNDIgQXV4LSVkIFBvcnQiLCBpbmRleCk7CisJc25wcmludGYoc2VyaW8tPnBoeXMsIHNpemVvZihzZXJpby0+cGh5cyksIEk4MDQyX01VWF9QSFlTX0RFU0MsIGluZGV4ICsgMSk7CisKKwkqcG9ydCA9IGk4MDQyX3BvcnRzW0k4MDQyX0FVWF9QT1JUX05PXTsKKwlwb3J0LT5leGlzdHMgPSAwOworCXNucHJpbnRmKHBvcnQtPm5hbWUsIHNpemVvZihwb3J0LT5uYW1lKSwgIkFVWCVkIiwgaW5kZXgpOworCXBvcnQtPm11eCA9IGluZGV4OworCXBvcnQtPnNlcmlvID0gc2VyaW87CisKKwlyZXR1cm4gaTgwNDJfcG9ydF9yZWdpc3Rlcihwb3J0KTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaTgwNDJfaW5pdCh2b2lkKQogewotCWludCBpOworCWludCBpLCBoYXZlX3BvcnRzID0gMDsKIAlpbnQgZXJyOwogCiAJZGJnX2luaXQoKTsKQEAgLTEwNjMsNDMgKzEwNzAsNzMgQEAKIAlpbml0X3RpbWVyKCZpODA0Ml90aW1lcik7CiAJaTgwNDJfdGltZXIuZnVuY3Rpb24gPSBpODA0Ml90aW1lcl9mdW5jOwogCi0JaWYgKGk4MDQyX3BsYXRmb3JtX2luaXQoKSkKLQkJcmV0dXJuIC1FQlVTWTsKKwllcnIgPSBpODA0Ml9wbGF0Zm9ybV9pbml0KCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCWk4MDQyX3BvcnRzW0k4MDQyX0FVWF9QT1JUX05PXS5pcnEgPSBJODA0Ml9BVVhfSVJROwogCWk4MDQyX3BvcnRzW0k4MDQyX0tCRF9QT1JUX05PXS5pcnEgPSBJODA0Ml9LQkRfSVJROwogCiAJaWYgKGk4MDQyX2NvbnRyb2xsZXJfaW5pdCgpKSB7Ci0JCWk4MDQyX3BsYXRmb3JtX2V4aXQoKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3BsYXRmb3JtX2V4aXQ7CiAJfQogCiAJZXJyID0gZHJpdmVyX3JlZ2lzdGVyKCZpODA0Ml9kcml2ZXIpOwotCWlmIChlcnIpIHsKLQkJaTgwNDJfcGxhdGZvcm1fZXhpdCgpOwotCQlyZXR1cm4gZXJyOwotCX0KKwlpZiAoZXJyKQorCQlnb3RvIGVycl9jb250cm9sbGVyX2NsZWFudXA7CiAKIAlpODA0Ml9wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJpODA0MiIsIC0xLCBOVUxMLCAwKTsKIAlpZiAoSVNfRVJSKGk4MDQyX3BsYXRmb3JtX2RldmljZSkpIHsKLQkJZHJpdmVyX3VucmVnaXN0ZXIoJmk4MDQyX2RyaXZlcik7Ci0JCWk4MDQyX3BsYXRmb3JtX2V4aXQoKTsKLQkJcmV0dXJuIFBUUl9FUlIoaTgwNDJfcGxhdGZvcm1fZGV2aWNlKTsKKwkJZXJyID0gUFRSX0VSUihpODA0Ml9wbGF0Zm9ybV9kZXZpY2UpOworCQlnb3RvIGVycl91bnJlZ2lzdGVyX2RyaXZlcjsKIAl9CiAKIAlpZiAoIWk4MDQyX25vYXV4ICYmICFpODA0Ml9jaGVja19hdXgoKSkgewotCQlpZiAoIWk4MDQyX25vbXV4ICYmICFpODA0Ml9jaGVja19tdXgoKSkKLQkJCWZvciAoaSA9IDA7IGkgPCBJODA0Ml9OVU1fTVVYX1BPUlRTOyBpKyspCi0JCQkJaTgwNDJfY3JlYXRlX211eF9wb3J0KGkpOwotCQllbHNlCi0JCQlpODA0Ml9jcmVhdGVfYXV4X3BvcnQoKTsKKwkJaWYgKCFpODA0Ml9ub211eCAmJiAhaTgwNDJfY2hlY2tfbXV4KCkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBJODA0Ml9OVU1fTVVYX1BPUlRTOyBpKyspIHsKKwkJCQllcnIgPSBpODA0Ml9jcmVhdGVfbXV4X3BvcnQoaSk7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBlcnJfdW5yZWdpc3Rlcl9wb3J0czsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVyciA9IGk4MDQyX2NyZWF0ZV9hdXhfcG9ydCgpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGVycl91bnJlZ2lzdGVyX3BvcnRzOworCQl9CisJCWhhdmVfcG9ydHMgPSAxOwogCX0KIAotCWk4MDQyX2NyZWF0ZV9rYmRfcG9ydCgpOworCWlmICghaTgwNDJfbm9rYmQpIHsKKwkJZXJyID0gaTgwNDJfY3JlYXRlX2tiZF9wb3J0KCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl91bnJlZ2lzdGVyX3BvcnRzOworCQloYXZlX3BvcnRzID0gMTsKKwl9CisKKwlpZiAoIWhhdmVfcG9ydHMpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfdW5yZWdpc3Rlcl9kZXZpY2U7CisJfQogCiAJbW9kX3RpbWVyKCZpODA0Ml90aW1lciwgamlmZmllcyArIEk4MDQyX1BPTExfUEVSSU9EKTsKIAogCXJldHVybiAwOworCisgZXJyX3VucmVnaXN0ZXJfcG9ydHM6CisJZm9yIChpID0gMDsgaSA8IEk4MDQyX05VTV9QT1JUUzsgaSsrKQorCQlpZiAoaTgwNDJfcG9ydHNbaV0uc2VyaW8pCisJCQlzZXJpb191bnJlZ2lzdGVyX3BvcnQoaTgwNDJfcG9ydHNbaV0uc2VyaW8pOworIGVycl91bnJlZ2lzdGVyX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihpODA0Ml9wbGF0Zm9ybV9kZXZpY2UpOworIGVycl91bnJlZ2lzdGVyX2RyaXZlcjoKKwlkcml2ZXJfdW5yZWdpc3RlcigmaTgwNDJfZHJpdmVyKTsKKyBlcnJfY29udHJvbGxlcl9jbGVhbnVwOgorCWk4MDQyX2NvbnRyb2xsZXJfY2xlYW51cCgpOworIGVycl9wbGF0Zm9ybV9leGl0OgorCWk4MDQyX3BsYXRmb3JtX2V4aXQoKTsKKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpODA0Ml9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcnBvcnQuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VycG9ydC5jCmluZGV4IDc5Y2EzODQuLjFiZDg4ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VycG9ydC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VycG9ydC5jCkBAIC04Nyw3ICs4Nyw3IEBACiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jc2VycG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzZXJwb3J0KSwgR0ZQX0tFUk5FTCk7CisJc2VycG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJwb3J0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZXJwb3J0KQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTY1LDcgKzE2NSw3IEBACiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoU0VSUE9SVF9CVVNZLCAmc2VycG9ydC0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0Jc2VycG9ydC0+c2VyaW8gPSBzZXJpbyA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzZXJpbyksIEdGUF9LRVJORUwpOworCXNlcnBvcnQtPnNlcmlvID0gc2VyaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNlcmlvKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9jb3JnaV90cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9jb3JnaV90cy5jCmluZGV4IDNmOGI2MWMuLjVkMTkyNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vY29yZ2lfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2NvcmdpX3RzLmMKQEAgLTUzLDExICs1Myw4IEBACiAKICNkZWZpbmUgU3luY0hTKCkJd2hpbGUoKFNUQVRVU19IU1lOQykgPT0gMCk7IHdoaWxlKChTVEFUVVNfSFNZTkMpICE9IDApOwogI2RlZmluZSBDQ05UKGEpCQlhc20gdm9sYXRpbGUgKCJtcmMgcDE0LCAwLCAlMCwgQzEsIEMwLCAwIiA6ICI9ciIoYSkpCi0jZGVmaW5lIENDTlRfT04oKQl7aW50IHBtbmMgPSAxOyBhc20gdm9sYXRpbGUgKCJtY3IgcDE0LCAwLCAlMCwgQzAsIEMwLCAwIiA6IDogInIiKHBtbmMpKTt9Ci0jZGVmaW5lIENDTlRfT0ZGKCkJe2ludCBwbW5jID0gMDsgYXNtIHZvbGF0aWxlICgibWNyIHAxNCwgMCwgJTAsIEMwLCBDMCwgMCIgOiA6ICJyIihwbW5jKSk7fQotCi0jZGVmaW5lIFdBSVRfSFNfNDAwX1ZHQQkJNzAxM1UJLy8gMTcuNjE1dXMKLSNkZWZpbmUgV0FJVF9IU180MDBfUVZHQQkxNjYyMlUJLy8gNDEuNzUwdXMKKyNkZWZpbmUgUE1OQ19HRVQoeCkJYXNtIHZvbGF0aWxlICgibXJjIHAxNCwgMCwgJTAsIEMwLCBDMCwgMCIgOiAiPXIiKHgpKQorI2RlZmluZSBQTU5DX1NFVCh4KQlhc20gdm9sYXRpbGUgKCJtY3IgcDE0LCAwLCAlMCwgQzAsIEMwLCAwIiA6IDogInIiKHgpKQogCiAKIC8qIEFEUzc4NDYgVG91Y2ggU2NyZWVuIENvbnRyb2xsZXIgYml0IGRlZmluaXRpb25zICovCkBAIC02OSw0MSArNjYsMjkgQEAKICNkZWZpbmUgQURTQ1RSTF9TVFMJCSgxdSA8PCA3KQkvKiBTdGFydCBCaXQgKi8KIAogLyogRXh0ZXJuYWwgRnVuY3Rpb25zICovCi1leHRlcm4gaW50IHcxMDBmYl9nZXRfeHJlcyh2b2lkKTsKLWV4dGVybiBpbnQgdzEwMGZiX2dldF9ibGFua2luZyh2b2lkKTsKLWV4dGVybiBpbnQgdzEwMGZiX2dldF9mYXN0c3lzY2xrKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdzEwMGZiX2dldF9oc3luY2xlbihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBnZXRfY2xrX2ZyZXF1ZW5jeV9raHooaW50IGluZm8pOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxjX3dhaXR0aW1lKHZvaWQpCiB7Ci0JaW50IHcxMDBmYl94cmVzID0gdzEwMGZiX2dldF94cmVzKCk7Ci0JdW5zaWduZWQgaW50IHdhaXR0aW1lID0gMDsKKwl1bnNpZ25lZCBsb25nIGhzeW5jX2xlbiA9IHcxMDBmYl9nZXRfaHN5bmNsZW4oJmNvcmdpZmJfZGV2aWNlLmRldik7CiAKLQlpZiAodzEwMGZiX3hyZXMgPT0gNDgwIHx8IHcxMDBmYl94cmVzID09IDY0MCkgewotCQl3YWl0dGltZSA9IFdBSVRfSFNfNDAwX1ZHQSAqIGdldF9jbGtfZnJlcXVlbmN5X2toeigwKSAvIDM5ODEzMVU7Ci0KLQkJaWYgKHcxMDBmYl9nZXRfZmFzdHN5c2NsaygpID09IDEwMCkKLQkJCXdhaXR0aW1lID0gd2FpdHRpbWUgKiA3NSAvIDEwMDsKLQotCQlpZiAodzEwMGZiX3hyZXMgPT0gNjQwKQotCQkJd2FpdHRpbWUgKj0gMzsKLQotCQlyZXR1cm4gd2FpdHRpbWU7Ci0JfQotCi0JcmV0dXJuIFdBSVRfSFNfNDAwX1FWR0EgKiBnZXRfY2xrX2ZyZXF1ZW5jeV9raHooMCkgLyAzOTgxMzFVOworCWlmIChoc3luY19sZW4pCisJCXJldHVybiBnZXRfY2xrX2ZyZXF1ZW5jeV9raHooMCkqMTAwMC9oc3luY19sZW47CisJZWxzZQorCQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzeW5jX3JlY2VpdmVfZGF0YV9zZW5kX2NtZChpbnQgZG9SZWNpdmUsIGludCBkb1NlbmQsIHVuc2lnbmVkIGludCBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHdhaXRfdGltZSkKIHsKKwl1bnNpZ25lZCBsb25nIHRpbWVyMSA9IDAsIHRpbWVyMiwgcG1uYyA9IDA7CiAJaW50IHBvcyA9IDA7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcjEgPSAwLCB0aW1lcjI7Ci0JaW50IGRvc2xlZXA7CiAKLQlkb3NsZWVwID0gIXcxMDBmYl9nZXRfYmxhbmtpbmcoKTsKKwlpZiAod2FpdF90aW1lICYmIGRvU2VuZCkgeworCQlQTU5DX0dFVChwbW5jKTsKKwkJaWYgKCEocG1uYyAmIDB4MDEpKQorCQkJUE1OQ19TRVQoMHgwMSk7CiAKLQlpZiAoZG9zbGVlcCAmJiBkb1NlbmQpIHsKLQkJQ0NOVF9PTigpOwogCQkvKiBwb2xsaW5nIEhTeW5jICovCiAJCVN5bmNIUygpOwogCQkvKiBnZXQgQ0NOVCAqLwpAQCAtMTE5LDExICsxMDQsMTEgQEAKIAkJY29yZ2lfc3NwX2Fkczc4NDZfcHV0KGNtZCk7CiAJCWNvcmdpX3NzcF9hZHM3ODQ2X2dldCgpOwogCi0JCWlmIChkb3NsZWVwKSB7CisJCWlmICh3YWl0X3RpbWUpIHsKIAkJCS8qIFdhaXQgYWZ0ZXIgSFN5bmMgKi8KIAkJCUNDTlQodGltZXIyKTsKIAkJCWlmICh0aW1lcjItdGltZXIxID4gd2FpdF90aW1lKSB7Ci0JCQkJLyogdGltZW91dCAqLworCQkJCS8qIHRvbyBzbG93IC0gdGltZW91dCwgdHJ5IGFnYWluICovCiAJCQkJU3luY0hTKCk7CiAJCQkJLyogZ2V0IE9TQ1IgKi8KIAkJCQlDQ05UKHRpbWVyMSk7CkBAIC0xMzQsOCArMTE5LDggQEAKIAkJCQlDQ05UKHRpbWVyMik7CiAJCX0KIAkJY29yZ2lfc3NwX2Fkczc4NDZfcHV0KGNtZCk7Ci0JCWlmIChkb3NsZWVwKQotCQkJQ0NOVF9PRkYoKTsKKwkJaWYgKHdhaXRfdGltZSAmJiAhKHBtbmMgJiAweDAxKSkKKwkJCVBNTkNfU0VUKHBtbmMpOwogCX0KIAlyZXR1cm4gcG9zOwogfQpAQCAtMjQ0LDcgKzIyOSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgY29yZ2l0c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3Qgc3RhdGUsIHVpbnQzMl90IGxldmVsKQorc3RhdGljIGludCBjb3JnaXRzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHVpbnQzMl90IGxldmVsKQogewogCWlmIChsZXZlbCA9PSBTVVNQRU5EX1BPV0VSX0RPV04pIHsKIAkJc3RydWN0IGNvcmdpX3RzICpjb3JnaV90cyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4LmggYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXguaAppbmRleCAxN2NmNzY2Li4yNmM1NDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXguaAorKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXguaApAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTEyNDIsNiArMTI0MSw4IEBACiAKICNpZmRlZiBDT05GSUdfSElTQVhfRU5URVJOT1dfUENJCiAjZGVmaW5lIENBUkRfRk5fRU5URVJOT1dfUENJIDEKKyNlbHNlCisjZGVmaW5lIENBUkRfRk5fRU5URVJOT1dfUENJIDAKICNlbmRpZgogCiAjZGVmaW5lIFRFSV9QRVJfQ0FSRCAxCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fYnNkY29tcC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2JzZGNvbXAuYwppbmRleCBiYWY0YmNhLi4wYWZlNDQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fYnNkY29tcC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9ic2Rjb21wLmMKQEAgLTI4MywyMyArMjgzLDE5IEBACiAJCS8qCiAJCSAqIFJlbGVhc2UgdGhlIGRpY3Rpb25hcnkKIAkJICovCi0JCWlmIChkYi0+ZGljdCkgewotCQkJdmZyZWUgKGRiLT5kaWN0KTsKLQkJCWRiLT5kaWN0ID0gTlVMTDsKLQkJfQorCQl2ZnJlZShkYi0+ZGljdCk7CisJCWRiLT5kaWN0ID0gTlVMTDsKIAogCQkvKgogCQkgKiBSZWxlYXNlIHRoZSBzdHJpbmcgYnVmZmVyCiAJCSAqLwotCQlpZiAoZGItPmxlbnMpIHsKLQkJCXZmcmVlIChkYi0+bGVucyk7Ci0JCQlkYi0+bGVucyA9IE5VTEw7Ci0JCX0KKwkJdmZyZWUoZGItPmxlbnMpOworCQlkYi0+bGVucyA9IE5VTEw7CiAKIAkJLyoKIAkJICogRmluYWxseSByZWxlYXNlIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmLgogCQkgKi8KLQkJa2ZyZWUgKGRiKTsKKwkJa2ZyZWUoZGIpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jCmluZGV4IGVlYmNiMGIuLjhhN2Q1NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMKQEAgLTE5NTMsNyArMTk1Myw4IEBACiAJCWtmcmVlKGQtPnJjdmNvdW50KTsKIAlpZiAoIShkLT5yY3Zjb3VudCA9IGttYWxsb2Moc2l6ZW9mKGludCkgKiBtLCBHRlBfQVRPTUlDKSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVnaXN0ZXJfaXNkbjogQ291bGQgbm90IGFsbG9jIHJjdmNvdW50XG4iKTsKLQkJaWYgKCFhZGRpbmcpIGtmcmVlKGQtPnJjdmVycik7CisJCWlmICghYWRkaW5nKQorCQkJa2ZyZWUoZC0+cmN2ZXJyKTsKIAkJcmV0dXJuIC0xOwogCX0KIAltZW1zZXQoKGNoYXIgKikgZC0+cmN2Y291bnQsIDAsIHNpemVvZihpbnQpICogbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdjExMC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3YxMTAuYwppbmRleCBmNDdmMmI5Li4zODYxOWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdjExMC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl92MTEwLmMKQEAgLTUxNiwxMSArNTE2LDExIEBACiB9CiAKIGludAotaXNkbl92MTEwX3N0YXRfY2FsbGJhY2soaW50IGlkeCwgaXNkbl9jdHJsICogYykKK2lzZG5fdjExMF9zdGF0X2NhbGxiYWNrKGludCBpZHgsIGlzZG5fY3RybCAqYykKIHsKIAlpc2RuX3YxMTBfc3RyZWFtICp2ID0gTlVMTDsKIAlpbnQgaTsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCiAJaWYgKGlkeCA8IDApCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWVkaWFiYXkuYyBiL2RyaXZlcnMvbWFjaW50b3NoL21lZGlhYmF5LmMKaW5kZXggN2MxNmMyNS4uYzA3MTJhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWVkaWFiYXkuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9tZWRpYWJheS5jCkBAIC03MDgsNyArNzA4LDcgQEAKIHsKIAlzdHJ1Y3QgbWVkaWFfYmF5X2luZm8JKmJheSA9IG1hY2lvX2dldF9kcnZkYXRhKG1kZXYpOwogCi0JaWYgKHN0YXRlICE9IG1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSAmJiBzdGF0ZSA9PSBQTV9TVVNQRU5EX01FTSkgeworCWlmIChzdGF0ZS5ldmVudCAhPSBtZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgJiYgc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkgewogCQlkb3duKCZiYXktPmxvY2spOwogCQliYXktPnNsZWVwaW5nID0gMTsKIAkJc2V0X21iX3Bvd2VyKGJheSwgMCk7CkBAIC03MjMsOCArNzIzLDggQEAKIHsKIAlzdHJ1Y3QgbWVkaWFfYmF5X2luZm8JKmJheSA9IG1hY2lvX2dldF9kcnZkYXRhKG1kZXYpOwogCi0JaWYgKG1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSAhPSAwKSB7Ci0JCW1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IDA7CisJaWYgKG1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9PTikgeworCQltZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCiAJICAgICAgIAkvKiBXZSByZS1lbmFibGUgdGhlIGJheSB1c2luZyBpdCdzIHByZXZpb3VzIGNvbnRlbnQKIAkgICAgICAgCSAgIG9ubHkgaWYgaXQgZGlkIG5vdCBjaGFuZ2UuIE5vdGUgdGhvc2UgYm96byB0aW1pbmdzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jCmluZGV4IDRhMGEwYWQuLjY0NWEyZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMKQEAgLTMwNjUsNyArMzA2NSw3IEBACiAKIHN0YXRpYyBpbnQgcG11X3N5c19zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlpZiAoc3RhdGUgIT0gUE1fU1VTUEVORF9ESVNLIHx8IHBtdV9zeXNfc3VzcGVuZGVkKQorCWlmIChzdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9TVVNQRU5EIHx8IHBtdV9zeXNfc3VzcGVuZGVkKQogCQlyZXR1cm4gMDsKIAogCS8qIFN1c3BlbmQgUE1VIGV2ZW50IGludGVycnVwdHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYml0bWFwLmMgYi9kcml2ZXJzL21kL2JpdG1hcC5jCmluZGV4IDQxZGY0Y2QuLjJmYmEyYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYml0bWFwLmMKKysrIGIvZHJpdmVycy9tZC9iaXRtYXAuYwpAQCAtMjcwLDE5ICsyNzAsMjAgQEAKIAogCWlmICghcGFnZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JZG8gewotCQlJVEVSQVRFX1JERVYobWRkZXYsIHJkZXYsIHRtcCkKLQkJCWlmIChyZGV2LT5pbl9zeW5jICYmICFyZGV2LT5mYXVsdHkpCi0JCQkJZ290byBmb3VuZDsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiAKLQlmb3VuZDoKKwlJVEVSQVRFX1JERVYobWRkZXYsIHJkZXYsIHRtcCkgeworCQlpZiAoISByZGV2LT5pbl9zeW5jIHx8IHJkZXYtPmZhdWx0eSkKKwkJCWNvbnRpbnVlOworCiAJCXRhcmdldCA9IChyZGV2LT5zYl9vZmZzZXQgPDwgMSkgKyBvZmZzZXQgKyBpbmRleCAqIChQQUdFX1NJWkUvNTEyKTsKIAotCX0gd2hpbGUgKCFzeW5jX3BhZ2VfaW8ocmRldi0+YmRldiwgdGFyZ2V0LCBQQUdFX1NJWkUsIHBhZ2UsIFJFQUQpKTsKKwkJaWYgKHN5bmNfcGFnZV9pbyhyZGV2LT5iZGV2LCB0YXJnZXQsIFBBR0VfU0laRSwgcGFnZSwgUkVBRCkpIHsKKwkJCXBhZ2UtPmluZGV4ID0gaW5kZXg7CisJCQlyZXR1cm4gcGFnZTsKKwkJfQorCX0KKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAotCXBhZ2UtPmluZGV4ID0gaW5kZXg7Ci0JcmV0dXJuIHBhZ2U7CiB9CiAKIHN0YXRpYyBpbnQgd3JpdGVfc2JfcGFnZShtZGRldl90ICptZGRldiwgbG9uZyBvZmZzZXQsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgd2FpdCkKQEAgLTQzNyw2ICs0MzgsNyBAQAogCXByaW50ayhLRVJOX0RFQlVHICIgIGRhZW1vbiBzbGVlcDogJWRzXG4iLCBsZTMyX3RvX2NwdShzYi0+ZGFlbW9uX3NsZWVwKSk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIiAgICAgc3luYyBzaXplOiAlbGx1IEtCXG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShzYi0+c3luY19zaXplKS8yKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWF4IHdyaXRlIGJlaGluZDogJWRcbiIsIGxlMzJfdG9fY3B1KHNiLT53cml0ZV9iZWhpbmQpKTsKIAlrdW5tYXAoYml0bWFwLT5zYl9wYWdlKTsKIH0KIApAQCAtNDQ1LDcgKzQ0Nyw3IEBACiB7CiAJY2hhciAqcmVhc29uID0gTlVMTDsKIAliaXRtYXBfc3VwZXJfdCAqc2I7Ci0JdW5zaWduZWQgbG9uZyBjaHVua3NpemUsIGRhZW1vbl9zbGVlcDsKKwl1bnNpZ25lZCBsb25nIGNodW5rc2l6ZSwgZGFlbW9uX3NsZWVwLCB3cml0ZV9iZWhpbmQ7CiAJdW5zaWduZWQgbG9uZyBieXRlc19yZWFkOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBldmVudHM7CiAJaW50IGVyciA9IC1FSU5WQUw7CkBAIC00NzQsNiArNDc2LDcgQEAKIAogCWNodW5rc2l6ZSA9IGxlMzJfdG9fY3B1KHNiLT5jaHVua3NpemUpOwogCWRhZW1vbl9zbGVlcCA9IGxlMzJfdG9fY3B1KHNiLT5kYWVtb25fc2xlZXApOworCXdyaXRlX2JlaGluZCA9IGxlMzJfdG9fY3B1KHNiLT53cml0ZV9iZWhpbmQpOwogCiAJLyogdmVyaWZ5IHRoYXQgdGhlIGJpdG1hcC1zcGVjaWZpYyBmaWVsZHMgYXJlIHZhbGlkICovCiAJaWYgKHNiLT5tYWdpYyAhPSBjcHVfdG9fbGUzMihCSVRNQVBfTUFHSUMpKQpAQCAtNDg1LDcgKzQ4OCw5IEBACiAJZWxzZSBpZiAoKDEgPDwgZmZ6KH5jaHVua3NpemUpKSAhPSBjaHVua3NpemUpCiAJCXJlYXNvbiA9ICJiaXRtYXAgY2h1bmtzaXplIG5vdCBhIHBvd2VyIG9mIDIiOwogCWVsc2UgaWYgKGRhZW1vbl9zbGVlcCA8IDEgfHwgZGFlbW9uX3NsZWVwID4gMTUpCi0JCXJlYXNvbiA9ICJkYWVtb24gc2xlZXAgcGVyaW9kIG91dCBvZiByYW5nZSI7CisJCXJlYXNvbiA9ICJkYWVtb24gc2xlZXAgcGVyaW9kIG91dCBvZiByYW5nZSAoMS0xNXMpIjsKKwllbHNlIGlmICh3cml0ZV9iZWhpbmQgPiBDT1VOVEVSX01BWCkKKwkJcmVhc29uID0gIndyaXRlLWJlaGluZCBsaW1pdCBvdXQgb2YgcmFuZ2UgKDAgLSAxNjM4MykiOwogCWlmIChyZWFzb24pIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgYml0bWFwIGZpbGUgc3VwZXJibG9jazogJXNcbiIsCiAJCQlibW5hbWUoYml0bWFwKSwgcmVhc29uKTsKQEAgLTUxOCw4ICs1MjMsMTIgQEAKIAkvKiBhc3NpZ24gZmllbGRzIHVzaW5nIHZhbHVlcyBmcm9tIHN1cGVyYmxvY2sgKi8KIAliaXRtYXAtPmNodW5rc2l6ZSA9IGNodW5rc2l6ZTsKIAliaXRtYXAtPmRhZW1vbl9zbGVlcCA9IGRhZW1vbl9zbGVlcDsKKwliaXRtYXAtPmRhZW1vbl9sYXN0cnVuID0gamlmZmllczsKKwliaXRtYXAtPm1heF93cml0ZV9iZWhpbmQgPSB3cml0ZV9iZWhpbmQ7CiAJYml0bWFwLT5mbGFncyB8PSBzYi0+c3RhdGU7CiAJYml0bWFwLT5ldmVudHNfY2xlYXJlZCA9IGxlNjRfdG9fY3B1KHNiLT5ldmVudHNfY2xlYXJlZCk7CisJaWYgKHNiLT5zdGF0ZSAmIEJJVE1BUF9TVEFMRSkKKwkJYml0bWFwLT5ldmVudHNfY2xlYXJlZCA9IGJpdG1hcC0+bWRkZXYtPmV2ZW50czsKIAllcnIgPSAwOwogb3V0OgogCWt1bm1hcChiaXRtYXAtPnNiX3BhZ2UpOwpAQCAtNjE3LDcgKzYyNiw3IEBACiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShzYl9wYWdlKTsKIH0KIAotc3RhdGljIHZvaWQgYml0bWFwX3N0b3BfZGFlbW9ucyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOworc3RhdGljIHZvaWQgYml0bWFwX3N0b3BfZGFlbW9uKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7CiAKIC8qIGRlcXVldWUgdGhlIG5leHQgaXRlbSBpbiBhIHBhZ2UgbGlzdCAtLSBkb24ndCBjYWxsIGZyb20gaXJxIGNvbnRleHQgKi8KIHN0YXRpYyBzdHJ1Y3QgcGFnZV9saXN0ICpkZXF1ZXVlX3BhZ2Uoc3RydWN0IGJpdG1hcCAqYml0bWFwKQpAQCAtNjU5LDcgKzY2OCw3IEBACiAJYml0bWFwLT5maWxlID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAotCWJpdG1hcF9zdG9wX2RhZW1vbnMoYml0bWFwKTsKKwliaXRtYXBfc3RvcF9kYWVtb24oYml0bWFwKTsKIAogCWRyYWluX3dyaXRlX3F1ZXVlcyhiaXRtYXApOwogCkBAIC04MTgsNyArODI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYml0bWFwX3NldF9tZW1vcnlfYml0cyhzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCk7CitzdGF0aWMgdm9pZCBiaXRtYXBfc2V0X21lbW9yeV9iaXRzKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCBpbnQgbmVlZGVkKTsKIC8qICogYml0bWFwX2luaXRfZnJvbV9kaXNrIC0tIGNhbGxlZCBhdCBiaXRtYXBfY3JlYXRlIHRpbWUgdG8gaW5pdGlhbGl6ZQogICogdGhlIGluLW1lbW9yeSBiaXRtYXAgZnJvbSB0aGUgb24tZGlzayBiaXRtYXAgLS0gYWxzbywgc2V0cyB1cCB0aGUKICAqIG1lbW9yeSBtYXBwaW5nIG9mIHRoZSBiaXRtYXAgZmlsZQpAQCAtODI2LDggKzgzNSwxMSBAQAogICogICBpZiB0aGVyZSdzIG5vIGJpdG1hcCBmaWxlLCBvciBpZiB0aGUgYml0bWFwIGZpbGUgaGFkIGJlZW4KICAqICAgcHJldmlvdXNseSBraWNrZWQgZnJvbSB0aGUgYXJyYXksIHdlIG1hcmsgYWxsIHRoZSBiaXRzIGFzCiAgKiAgIDEncyBpbiBvcmRlciB0byBjYXVzZSBhIGZ1bGwgcmVzeW5jLgorICoKKyAqIFdlIGlnbm9yZSBhbGwgYml0cyBmb3Igc2VjdG9ycyB0aGF0IGVuZCBlYXJsaWVyIHRoYW4gJ3N0YXJ0Jy4KKyAqIFRoaXMgaXMgdXNlZCB3aGVuIHJlYWRpbmcgYW4gb3V0LW9mLWRhdGUgYml0bWFwLi4uCiAgKi8KLXN0YXRpYyBpbnQgYml0bWFwX2luaXRfZnJvbV9kaXNrKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKK3N0YXRpYyBpbnQgYml0bWFwX2luaXRfZnJvbV9kaXNrKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgc3RhcnQpCiB7CiAJdW5zaWduZWQgbG9uZyBpLCBjaHVua3MsIGluZGV4LCBvbGRpbmRleCwgYml0OwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTCwgKm9sZHBhZ2UgPSBOVUxMOwpAQCAtOTE0LDcgKzkyNiw3IEBACiAJCQkgCSAqIHdob2xlIHBhZ2UgYW5kIHdyaXRlIGl0IG91dAogCQkJCSAqLwogCQkJCW1lbXNldChwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQsIDB4ZmYsCi0JCQkJCVBBR0VfU0laRSAtIG9mZnNldCk7CisJCQkJICAgICAgIFBBR0VfU0laRSAtIG9mZnNldCk7CiAJCQkJcmV0ID0gd3JpdGVfcGFnZShiaXRtYXAsIHBhZ2UsIDEpOwogCQkJCWlmIChyZXQpIHsKIAkJCQkJa3VubWFwKHBhZ2UpOwpAQCAtOTI4LDggKzk0MCwxMSBAQAogCQl9CiAJCWlmICh0ZXN0X2JpdChiaXQsIHBhZ2VfYWRkcmVzcyhwYWdlKSkpIHsKIAkJCS8qIGlmIHRoZSBkaXNrIGJpdCBpcyBzZXQsIHNldCB0aGUgbWVtb3J5IGJpdCAqLwotCQkJYml0bWFwX3NldF9tZW1vcnlfYml0cyhiaXRtYXAsIGkgPDwgQ0hVTktfQkxPQ0tfU0hJRlQoYml0bWFwKSk7CisJCQliaXRtYXBfc2V0X21lbW9yeV9iaXRzKGJpdG1hcCwgaSA8PCBDSFVOS19CTE9DS19TSElGVChiaXRtYXApLAorCQkJCQkgICAgICAgKChpKzEpIDw8IChDSFVOS19CTE9DS19TSElGVChiaXRtYXApKSA+PSBzdGFydCkKKwkJCQkpOwogCQkJYml0X2NudCsrOworCQkJc2V0X3BhZ2VfYXR0cihiaXRtYXAsIHBhZ2UsIEJJVE1BUF9QQUdFX0NMRUFOKTsKIAkJfQogCX0KIApAQCAtMTE0MSw2ICsxMTU2LDkgQEAKIAkJZXJyID0gLUVJTlRSOwogCQlnb3RvIG91dDsKIAl9CisJaWYgKGJpdG1hcCA9PSBOVUxMKQorCQkvKiBhYm91dCB0byBiZSBzdG9wcGVkLiAqLworCQlyZXR1cm47CiAKIAlQUklOVEsoIiVzOiBiaXRtYXAgd3JpdGViYWNrIGRhZW1vbiB3b2tlIHVwLi4uXG4iLCBibW5hbWUoYml0bWFwKSk7CiAJLyogd2FpdCBvbiBiaXRtYXAgcGFnZSB3cml0ZWJhY2tzICovCkBAIC0xMTcwLDIxICsxMTg4LDEyIEBACiAJfQogfQogCi1zdGF0aWMgaW50IGJpdG1hcF9zdGFydF9kYWVtb24oc3RydWN0IGJpdG1hcCAqYml0bWFwLCBtZGtfdGhyZWFkX3QgKipwdHIsCitzdGF0aWMgbWRrX3RocmVhZF90ICpiaXRtYXBfc3RhcnRfZGFlbW9uKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwKIAkJCQl2b2lkICgqZnVuYykobWRkZXZfdCAqKSwgY2hhciAqbmFtZSkKIHsKIAltZGtfdGhyZWFkX3QgKmRhZW1vbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWNoYXIgbmFtZWJ1ZlszMl07CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JKnB0ciA9IE5VTEw7Ci0KLQlpZiAoIWJpdG1hcC0+ZmlsZSkgLyogbm8gbmVlZCBmb3IgZGFlbW9uIGlmIHRoZXJlJ3Mgbm8gYmFja2luZyBmaWxlICovCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCiAjaWZkZWYgSU5KRUNUX0ZBVEFMX0ZBVUxUXzIKIAlkYWVtb24gPSBOVUxMOwogI2Vsc2UKQEAgLTExOTQsNDcgKzEyMDMsMzIgQEAKIAlpZiAoIWRhZW1vbikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gc3RhcnQgYml0bWFwIGRhZW1vblxuIiwKIAkJCWJtbmFtZShiaXRtYXApKTsKLQkJcmV0dXJuIC1FQ0hJTEQ7CisJCXJldHVybiBFUlJfUFRSKC1FQ0hJTEQpOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkqcHRyID0gZGFlbW9uOwotCiAJbWRfd2FrZXVwX3RocmVhZChkYWVtb24pOyAvKiBzdGFydCBpdCBydW5uaW5nICovCiAKIAlQUklOVEsoIiVzOiAlcyBkYWVtb24gKHBpZCAlZCkgc3RhcnRlZC4uLlxuIiwKIAkJYm1uYW1lKGJpdG1hcCksIG5hbWUsIGRhZW1vbi0+dHNrLT5waWQpOwotb3V0X3VubG9jazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKKworCXJldHVybiBkYWVtb247CiB9CiAKLXN0YXRpYyBpbnQgYml0bWFwX3N0YXJ0X2RhZW1vbnMoc3RydWN0IGJpdG1hcCAqYml0bWFwKQorc3RhdGljIHZvaWQgYml0bWFwX3N0b3BfZGFlbW9uKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKIHsKLQlpbnQgZXJyID0gYml0bWFwX3N0YXJ0X2RhZW1vbihiaXRtYXAsICZiaXRtYXAtPndyaXRlYmFja19kYWVtb24sCi0JCQkJCWJpdG1hcF93cml0ZWJhY2tfZGFlbW9uLCAiYml0bWFwX3diIik7Ci0JcmV0dXJuIGVycjsKLX0KKwkvKiB0aGUgZGFlbW9uIGNhbid0IHN0b3AgaXRzZWxmLi4uIGl0J2xsIGp1c3QgZXhpdCBpbnN0ZWFkLi4uICovCisJaWYgKGJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbiAmJiAhIElTX0VSUihiaXRtYXAtPndyaXRlYmFja19kYWVtb24pICYmCisJICAgIGN1cnJlbnQtPnBpZCAhPSBiaXRtYXAtPndyaXRlYmFja19kYWVtb24tPnRzay0+cGlkKSB7CisJCW1ka190aHJlYWRfdCAqZGFlbW9uOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi1zdGF0aWMgdm9pZCBiaXRtYXBfc3RvcF9kYWVtb24oc3RydWN0IGJpdG1hcCAqYml0bWFwLCBtZGtfdGhyZWFkX3QgKipwdHIpCi17Ci0JbWRrX3RocmVhZF90ICpkYWVtb247Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQlkYWVtb24gPSAqcHRyOwotCSpwdHIgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCWlmIChkYWVtb24pCi0JCW1kX3VucmVnaXN0ZXJfdGhyZWFkKGRhZW1vbik7IC8qIGRlc3Ryb3kgdGhlIHRocmVhZCAqLwotfQotCi1zdGF0aWMgdm9pZCBiaXRtYXBfc3RvcF9kYWVtb25zKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKLXsKLQkvKiB0aGUgZGFlbW9ucyBjYW4ndCBzdG9wIHRoZW1zZWx2ZXMuLi4gdGhleSdsbCBqdXN0IGV4aXQgaW5zdGVhZC4uLiAqLwotCWlmIChiaXRtYXAtPndyaXRlYmFja19kYWVtb24gJiYKLQkgICAgY3VycmVudC0+cGlkICE9IGJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbi0+dHNrLT5waWQpCi0JCWJpdG1hcF9zdG9wX2RhZW1vbihiaXRtYXAsICZiaXRtYXAtPndyaXRlYmFja19kYWVtb24pOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CisJCWRhZW1vbiA9IGJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbjsKKwkJYml0bWFwLT53cml0ZWJhY2tfZGFlbW9uID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CisJCWlmIChkYWVtb24gJiYgISBJU19FUlIoZGFlbW9uKSkKKwkJCW1kX3VucmVnaXN0ZXJfdGhyZWFkKGRhZW1vbik7IC8qIGRlc3Ryb3kgdGhlIHRocmVhZCAqLworCX0KIH0KIAogc3RhdGljIGJpdG1hcF9jb3VudGVyX3QgKmJpdG1hcF9nZXRfY291bnRlcihzdHJ1Y3QgYml0bWFwICpiaXRtYXAsCkBAIC0xMjc0LDkgKzEyNjgsMTYgQEAKIAl9CiB9CiAKLWludCBiaXRtYXBfc3RhcnR3cml0ZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBzZWN0b3JzKQoraW50IGJpdG1hcF9zdGFydHdyaXRlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNlY3RvcnMsIGludCBiZWhpbmQpCiB7CiAJaWYgKCFiaXRtYXApIHJldHVybiAwOworCisJaWYgKGJlaGluZCkgeworCQlhdG9taWNfaW5jKCZiaXRtYXAtPmJlaGluZF93cml0ZXMpOworCQlQUklOVEsoS0VSTl9ERUJVRyAiaW5jIHdyaXRlLWJlaGluZCBjb3VudCAlZC8lZFxuIiwKKwkJICBhdG9taWNfcmVhZCgmYml0bWFwLT5iZWhpbmRfd3JpdGVzKSwgYml0bWFwLT5tYXhfd3JpdGVfYmVoaW5kKTsKKwl9CisKIAl3aGlsZSAoc2VjdG9ycykgewogCQlpbnQgYmxvY2tzOwogCQliaXRtYXBfY291bnRlcl90ICpibWM7CkBAIC0xMzExLDkgKzEzMTIsMTUgQEAKIH0KIAogdm9pZCBiaXRtYXBfZW5kd3JpdGUoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzZWN0b3JfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2VjdG9ycywKLQkJICAgICBpbnQgc3VjY2VzcykKKwkJICAgICBpbnQgc3VjY2VzcywgaW50IGJlaGluZCkKIHsKIAlpZiAoIWJpdG1hcCkgcmV0dXJuOworCWlmIChiZWhpbmQpIHsKKwkJYXRvbWljX2RlYygmYml0bWFwLT5iZWhpbmRfd3JpdGVzKTsKKwkJUFJJTlRLKEtFUk5fREVCVUcgImRlYyB3cml0ZS1iZWhpbmQgY291bnQgJWQvJWRcbiIsCisJCSAgYXRvbWljX3JlYWQoJmJpdG1hcC0+YmVoaW5kX3dyaXRlcyksIGJpdG1hcC0+bWF4X3dyaXRlX2JlaGluZCk7CisJfQorCiAJd2hpbGUgKHNlY3RvcnMpIHsKIAkJaW50IGJsb2NrczsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE0MjQsNyArMTQzMSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBiaXRtYXBfc2V0X21lbW9yeV9iaXRzKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0KQorc3RhdGljIHZvaWQgYml0bWFwX3NldF9tZW1vcnlfYml0cyhzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwgaW50IG5lZWRlZCkKIHsKIAkvKiBGb3IgZWFjaCBjaHVuayBjb3ZlcmVkIGJ5IGFueSBvZiB0aGVzZSBzZWN0b3JzLCBzZXQgdGhlCiAJICogY291bnRlciB0byAxIGFuZCBzZXQgcmVzeW5jX25lZWRlZC4gIFRoZXkgc2hvdWxkIGFsbApAQCAtMTQ0MSw3ICsxNDQ4LDcgQEAKIAl9CiAJaWYgKCEgKmJtYykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQkJKmJtYyA9IDEgfCBORUVERURfTUFTSzsKKwkJKmJtYyA9IDEgfCAobmVlZGVkP05FRURFRF9NQVNLOjApOwogCQliaXRtYXBfY291bnRfcGFnZShiaXRtYXAsIG9mZnNldCwgMSk7CiAJCXBhZ2UgPSBmaWxlbWFwX2dldF9wYWdlKGJpdG1hcCwgb2Zmc2V0ID4+IENIVU5LX0JMT0NLX1NISUZUKGJpdG1hcCkpOwogCQlzZXRfcGFnZV9hdHRyKGJpdG1hcCwgcGFnZSwgQklUTUFQX1BBR0VfQ0xFQU4pOwpAQCAtMTQ3NiwxNyArMTQ4MywxNCBAQAogLyoKICAqIGZyZWUgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZAogICovCi12b2lkIGJpdG1hcF9kZXN0cm95KG1kZGV2X3QgKm1kZGV2KQorc3RhdGljIHZvaWQgYml0bWFwX2ZyZWUoc3RydWN0IGJpdG1hcCAqYml0bWFwKQogewogCXVuc2lnbmVkIGxvbmcgaywgcGFnZXM7CiAJc3RydWN0IGJpdG1hcF9wYWdlICpicDsKLQlzdHJ1Y3QgYml0bWFwICpiaXRtYXAgPSBtZGRldi0+Yml0bWFwOwogCiAJaWYgKCFiaXRtYXApIC8qIHRoZXJlIHdhcyBubyBiaXRtYXAgKi8KIAkJcmV0dXJuOwogCi0JbWRkZXYtPmJpdG1hcCA9IE5VTEw7IC8qIGRpc2Nvbm5lY3QgZnJvbSB0aGUgbWQgZGV2aWNlICovCi0KIAkvKiByZWxlYXNlIHRoZSBiaXRtYXAgZmlsZSBhbmQga2lsbCB0aGUgZGFlbW9uICovCiAJYml0bWFwX2ZpbGVfcHV0KGJpdG1hcCk7CiAKQEAgLTE1MDQsNiArMTUwOCwxNyBAQAogCWtmcmVlKGJwKTsKIAlrZnJlZShiaXRtYXApOwogfQordm9pZCBiaXRtYXBfZGVzdHJveShtZGRldl90ICptZGRldikKK3sKKwlzdHJ1Y3QgYml0bWFwICpiaXRtYXAgPSBtZGRldi0+Yml0bWFwOworCisJaWYgKCFiaXRtYXApIC8qIHRoZXJlIHdhcyBubyBiaXRtYXAgKi8KKwkJcmV0dXJuOworCisJbWRkZXYtPmJpdG1hcCA9IE5VTEw7IC8qIGRpc2Nvbm5lY3QgZnJvbSB0aGUgbWQgZGV2aWNlICovCisKKwliaXRtYXBfZnJlZShiaXRtYXApOworfQogCiAvKgogICogaW5pdGlhbGl6ZSB0aGUgYml0bWFwIHN0cnVjdHVyZQpAQCAtMTUxNyw2ICsxNTMyLDcgQEAKIAl1bnNpZ25lZCBsb25nIHBhZ2VzOwogCXN0cnVjdCBmaWxlICpmaWxlID0gbWRkZXYtPmJpdG1hcF9maWxlOwogCWludCBlcnI7CisJc2VjdG9yX3Qgc3RhcnQ7CiAKIAlCVUdfT04oc2l6ZW9mKGJpdG1hcF9zdXBlcl90KSAhPSAyNTYpOwogCkBAIC0xNTMzLDE1ICsxNTQ5LDE1IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmYml0bWFwLT5sb2NrKTsKIAliaXRtYXAtPm1kZGV2ID0gbWRkZXY7Ci0JbWRkZXYtPmJpdG1hcCA9IGJpdG1hcDsKIAogCXNwaW5fbG9ja19pbml0KCZiaXRtYXAtPndyaXRlX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZiaXRtYXAtPmNvbXBsZXRlX3BhZ2VzKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZiaXRtYXAtPndyaXRlX3dhaXQpOwogCWJpdG1hcC0+d3JpdGVfcG9vbCA9IG1lbXBvb2xfY3JlYXRlKFdSSVRFX1BPT0xfU0laRSwgd3JpdGVfcG9vbF9hbGxvYywKIAkJCQl3cml0ZV9wb29sX2ZyZWUsIE5VTEwpOworCWVyciA9IC1FTk9NRU07CiAJaWYgKCFiaXRtYXAtPndyaXRlX3Bvb2wpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIGVycm9yOwogCiAJYml0bWFwLT5maWxlID0gZmlsZTsKIAliaXRtYXAtPm9mZnNldCA9IG1kZGV2LT5iaXRtYXBfb2Zmc2V0OwpAQCAtMTU0OSw3ICsxNTY1LDcgQEAKIAkvKiByZWFkIHN1cGVyYmxvY2sgZnJvbSBiaXRtYXAgZmlsZSAodGhpcyBzZXRzIGJpdG1hcC0+Y2h1bmtzaXplKSAqLwogCWVyciA9IGJpdG1hcF9yZWFkX3NiKGJpdG1hcCk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnJvcjsKIAogCWJpdG1hcC0+Y2h1bmtzaGlmdCA9IGZpbmRfZmlyc3RfYml0KCZiaXRtYXAtPmNodW5rc2l6ZSwKIAkJCQkJc2l6ZW9mKGJpdG1hcC0+Y2h1bmtzaXplKSk7CkBAIC0xNTczLDI3ICsxNTg5LDQ0IEBACiAjZWxzZQogCWJpdG1hcC0+YnAgPSBrbWFsbG9jKHBhZ2VzICogc2l6ZW9mKCpiaXRtYXAtPmJwKSwgR0ZQX0tFUk5FTCk7CiAjZW5kaWYKKwllcnIgPSAtRU5PTUVNOwogCWlmICghYml0bWFwLT5icCkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CiAJbWVtc2V0KGJpdG1hcC0+YnAsIDAsIHBhZ2VzICogc2l6ZW9mKCpiaXRtYXAtPmJwKSk7CiAKIAliaXRtYXAtPmZsYWdzIHw9IEJJVE1BUF9BQ1RJVkU7CiAKIAkvKiBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgcGFnZXMgYXZhaWxhYmxlLCBpbml0aWFsaXplIHRoZSBpbi1tZW1vcnkKIAkgKiBiaXRtYXAgZnJvbSB0aGUgb24tZGlzayBiaXRtYXAgKi8KLQllcnIgPSBiaXRtYXBfaW5pdF9mcm9tX2Rpc2soYml0bWFwKTsKKwlzdGFydCA9IDA7CisJaWYgKG1kZGV2LT5kZWdyYWRlZCA9PSAwCisJICAgIHx8IGJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQgPT0gbWRkZXYtPmV2ZW50cykKKwkJLyogbm8gbmVlZCB0byBrZWVwIGRpcnR5IGJpdHMgdG8gb3B0aW1pc2UgYSByZS1hZGQgb2YgYSBtaXNzaW5nIGRldmljZSAqLworCQlzdGFydCA9IG1kZGV2LT5yZWNvdmVyeV9jcDsKKwllcnIgPSBiaXRtYXBfaW5pdF9mcm9tX2Rpc2soYml0bWFwLCBzdGFydCk7CiAKIAlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycm9yOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiY3JlYXRlZCBiaXRtYXAgKCVsdSBwYWdlcykgZm9yIGRldmljZSAlc1xuIiwKIAkJcGFnZXMsIGJtbmFtZShiaXRtYXApKTsKIAotCS8qIGtpY2sgb2ZmIHRoZSBiaXRtYXAgZGFlbW9ucyAqLwotCWVyciA9IGJpdG1hcF9zdGFydF9kYWVtb25zKGJpdG1hcCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwltZGRldi0+Yml0bWFwID0gYml0bWFwOworCisJaWYgKGZpbGUpCisJCS8qIGtpY2sgb2ZmIHRoZSBiaXRtYXAgd3JpdGViYWNrIGRhZW1vbiAqLworCQliaXRtYXAtPndyaXRlYmFja19kYWVtb24gPQorCQkJYml0bWFwX3N0YXJ0X2RhZW1vbihiaXRtYXAsCisJCQkJCSAgICBiaXRtYXBfd3JpdGViYWNrX2RhZW1vbiwKKwkJCQkJICAgICJiaXRtYXBfd2IiKTsKKworCWlmIChJU19FUlIoYml0bWFwLT53cml0ZWJhY2tfZGFlbW9uKSkKKwkJcmV0dXJuIFBUUl9FUlIoYml0bWFwLT53cml0ZWJhY2tfZGFlbW9uKTsKIAlyZXR1cm4gYml0bWFwX3VwZGF0ZV9zYihiaXRtYXApOworCisgZXJyb3I6CisJYml0bWFwX2ZyZWUoYml0bWFwKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKiB0aGUgYml0bWFwIEFQSSAtLSBmb3IgcmFpZCBwZXJzb25hbGl0aWVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKaW5kZXggZDBhNGJhYi4uYjgyYmMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJfQogCiAJLyogSGFzaCB0aGUgY2lwaGVyIGtleSB3aXRoIHRoZSBnaXZlbiBoYXNoIGFsZ29yaXRobSAqLwotCWhhc2hfdGZtID0gY3J5cHRvX2FsbG9jX3RmbShvcHRzLCAwKTsKKwloYXNoX3RmbSA9IGNyeXB0b19hbGxvY190Zm0ob3B0cywgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQKTsKIAlpZiAoaGFzaF90Zm0gPT0gTlVMTCkgewogCQl0aS0+ZXJyb3IgPSBQRlggIkVycm9yIGluaXRpYWxpemluZyBFU1NJViBoYXNoIjsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNzIsNyArMTcyLDggQEAKIAogCS8qIFNldHVwIHRoZSBlc3Npdl90Zm0gd2l0aCB0aGUgZ2l2ZW4gc2FsdCAqLwogCWVzc2l2X3RmbSA9IGNyeXB0b19hbGxvY190Zm0oY3J5cHRvX3RmbV9hbGdfbmFtZShjYy0+dGZtKSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUT19URk1fTU9ERV9FQ0IpOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX1RGTV9NT0RFX0VDQiB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVApOwogCWlmIChlc3Npdl90Zm0gPT0gTlVMTCkgewogCQl0aS0+ZXJyb3IgPSBQRlggIkVycm9yIGFsbG9jYXRpbmcgY3J5cHRvIHRmbSBmb3IgRVNTSVYiOwogCQlrZnJlZShzYWx0KTsKQEAgLTU4Nyw3ICs1ODgsNyBAQAogCQlnb3RvIGJhZDE7CiAJfQogCi0JdGZtID0gY3J5cHRvX2FsbG9jX3RmbShjaXBoZXIsIGNyeXB0b19mbGFncyk7CisJdGZtID0gY3J5cHRvX2FsbG9jX3RmbShjaXBoZXIsIGNyeXB0b19mbGFncyB8IENSWVBUT19URk1fUkVRX01BWV9TTEVFUCk7CiAJaWYgKCF0Zm0pIHsKIAkJdGktPmVycm9yID0gUEZYICJFcnJvciBhbGxvY2F0aW5nIGNyeXB0byB0Zm0iOwogCQlnb3RvIGJhZDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jIGIvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYwppbmRleCAxNzIxMmI0Li5jYzA3YmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKQEAgLTU2OCwxMiArNTY4LDkgQEAKIAogICAgICAgYmFkOgogCWRtX2lvX3B1dChzZWN0b3JzX3RvX3BhZ2VzKGNodW5rX3NpemUpKTsKLQlpZiAocHMpIHsKLQkJaWYgKHBzLT5hcmVhKQotCQkJZnJlZV9hcmVhKHBzKTsKLQotCQlrZnJlZShwcyk7Ci0JfQorCWlmIChwcyAmJiBwcy0+YXJlYSkKKwkJZnJlZV9hcmVhKHBzKTsKKwlrZnJlZShwcyk7CiAJcmV0dXJuIHI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0taW8uYyBiL2RyaXZlcnMvbWQvZG0taW8uYwppbmRleCA0NTc1NGJiLi45ZGUwMDAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWlvLmMKKysrIGIvZHJpdmVycy9tZC9kbS1pby5jCkBAIC0yMzksNiArMjM5LDExIEBACiAJZHAtPmNvbnRleHRfcHRyID0gZGF0YTsKIH0KIAorc3RhdGljIHZvaWQgZG1fYmlvX2Rlc3RydWN0b3Ioc3RydWN0IGJpbyAqYmlvKQoreworCWJpb19mcmVlKGJpbywgX2Jpb3MpOworfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJTyByb3V0aW5lcyB0aGF0IGFjY2VwdCBhIGxpc3Qgb2YgcGFnZXMuCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yNjMsNiArMjY4LDcgQEAKIAkJYmlvLT5iaV9iZGV2ID0gd2hlcmUtPmJkZXY7CiAJCWJpby0+YmlfZW5kX2lvID0gZW5kaW87CiAJCWJpby0+YmlfcHJpdmF0ZSA9IGlvOworCQliaW8tPmJpX2Rlc3RydWN0b3IgPSBkbV9iaW9fZGVzdHJ1Y3RvcjsKIAkJYmlvX3NldF9yZWdpb24oYmlvLCByZWdpb24pOwogCiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJhaWQxLmMgYi9kcml2ZXJzL21kL2RtLXJhaWQxLmMKaW5kZXggYjA4ZGY4Yi4uODYzMjgyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcmFpZDEuYwpAQCAtMzc1LDE2ICszNzUsMTggQEAKIAogCXJlYWRfbG9jaygmcmgtPmhhc2hfbG9jayk7CiAJcmVnID0gX19yaF9maW5kKHJoLCByZWdpb24pOworCisJYXRvbWljX2luYygmcmVnLT5wZW5kaW5nKTsKKworCXNwaW5fbG9ja19pcnEoJnJoLT5yZWdpb25fbG9jayk7CiAJaWYgKHJlZy0+c3RhdGUgPT0gUkhfQ0xFQU4pIHsKIAkJcmgtPmxvZy0+dHlwZS0+bWFya19yZWdpb24ocmgtPmxvZywgcmVnLT5rZXkpOwogCi0JCXNwaW5fbG9ja19pcnEoJnJoLT5yZWdpb25fbG9jayk7CiAJCXJlZy0+c3RhdGUgPSBSSF9ESVJUWTsKIAkJbGlzdF9kZWxfaW5pdCgmcmVnLT5saXN0KTsJLyogdGFrZSBvZmYgdGhlIGNsZWFuIGxpc3QgKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZyaC0+cmVnaW9uX2xvY2spOwogCX0KKwlzcGluX3VubG9ja19pcnEoJnJoLT5yZWdpb25fbG9jayk7CiAKLQlhdG9taWNfaW5jKCZyZWctPnBlbmRpbmcpOwogCXJlYWRfdW5sb2NrKCZyaC0+aGFzaF9sb2NrKTsKIH0KIApAQCAtNDA4LDYgKzQxMCwxMCBAQAogCiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJlZy0+cGVuZGluZykpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnJoLT5yZWdpb25fbG9jaywgZmxhZ3MpOworCQlpZiAoYXRvbWljX3JlYWQoJnJlZy0+cGVuZGluZykpIHsgLyogY2hlY2sgcmFjZSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmgtPnJlZ2lvbl9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0KIAkJaWYgKHJlZy0+c3RhdGUgPT0gUkhfUkVDT1ZFUklORykgewogCQkJbGlzdF9hZGRfdGFpbCgmcmVnLT5saXN0LCAmcmgtPnF1aWVzY2VkX3JlZ2lvbnMpOwogCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5jIGIvZHJpdmVycy9tZC9kbS5jCmluZGV4IGQ0ODdkOWQuLjkzMGI5ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uYworKysgYi9kcml2ZXJzL21kL2RtLmMKQEAgLTM5OSw2ICszOTksMTEgQEAKIAl1bnNpZ25lZCBzaG9ydCBpZHg7CiB9OwogCitzdGF0aWMgdm9pZCBkbV9iaW9fZGVzdHJ1Y3RvcihzdHJ1Y3QgYmlvICpiaW8pCit7CisJYmlvX2ZyZWUoYmlvLCBkbV9zZXQpOworfQorCiAvKgogICogQ3JlYXRlcyBhIGxpdHRsZSBiaW8gdGhhdCBpcyBqdXN0IGRvZXMgcGFydCBvZiBhIGJ2ZWMuCiAgKi8KQEAgLTQxMCw2ICs0MTUsNyBAQAogCXN0cnVjdCBiaW9fdmVjICpidiA9IGJpby0+YmlfaW9fdmVjICsgaWR4OwogCiAJY2xvbmUgPSBiaW9fYWxsb2NfYmlvc2V0KEdGUF9OT0lPLCAxLCBkbV9zZXQpOworCWNsb25lLT5iaV9kZXN0cnVjdG9yID0gZG1fYmlvX2Rlc3RydWN0b3I7CiAJKmNsb25lLT5iaV9pb192ZWMgPSAqYnY7CiAKIAljbG9uZS0+Ymlfc2VjdG9yID0gc2VjdG9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9saW5lYXIuYyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKaW5kZXggOGQ3NDAwMS4uYmIyNzlmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9saW5lYXIuYworKysgYi9kcml2ZXJzL21kL2xpbmVhci5jCkBAIC0zOCw3ICszOCw4IEBACiAJLyoKIAkgKiBzZWN0b3JfZGl2KGEsYikgcmV0dXJucyB0aGUgcmVtYWluZXIgYW5kIHNldHMgYSB0byBhL2IKIAkgKi8KLQkodm9pZClzZWN0b3JfZGl2KGJsb2NrLCBjb25mLT5zbWFsbGVzdC0+c2l6ZSk7CisJYmxvY2sgPj49IGNvbmYtPnByZXNoaWZ0OworCSh2b2lkKXNlY3Rvcl9kaXYoYmxvY2ssIGNvbmYtPmhhc2hfc3BhY2luZyk7CiAJaGFzaCA9IGNvbmYtPmhhc2hfdGFibGVbYmxvY2tdOwogCiAJd2hpbGUgKChzZWN0b3I+PjEpID49IChoYXNoLT5zaXplICsgaGFzaC0+b2Zmc2V0KSkKQEAgLTQ3LDcgKzQ4LDcgQEAKIH0KIAogLyoqCi0gKglsaW5lYXJfbWVyZ2VhYmxlX2J2ZWMgLS0gdGVsbCBiaW8gbGF5ZXIgaWYgYSB0d28gcmVxdWVzdHMgY2FuIGJlIG1lcmdlZAorICoJbGluZWFyX21lcmdlYWJsZV9idmVjIC0tIHRlbGwgYmlvIGxheWVyIGlmIHR3byByZXF1ZXN0cyBjYW4gYmUgbWVyZ2VkCiAgKglAcTogcmVxdWVzdCBxdWV1ZQogICoJQGJpbzogdGhlIGJ1ZmZlciBoZWFkIHRoYXQncyBiZWVuIGJ1aWx0IHVwIHNvIGZhcgogICoJQGJpb3ZlYzogdGhlIHJlcXVlc3QgdGhhdCBjb3VsZCBiZSBtZXJnZWQgdG8gaXQuCkBAIC0xMTYsNyArMTE3LDcgQEAKIAlkZXZfaW5mb190ICoqdGFibGU7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAlpbnQgaSwgbmJfem9uZSwgY250OwotCXNlY3Rvcl90IHN0YXJ0OworCXNlY3Rvcl90IG1pbl9zcGFjaW5nOwogCXNlY3Rvcl90IGN1cnJfb2Zmc2V0OwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIApAQCAtMTI3LDExICsxMjgsNiBAQAogCW1lbXNldChjb25mLCAwLCBzaXplb2YoKmNvbmYpICsgbWRkZXYtPnJhaWRfZGlza3Mqc2l6ZW9mKGRldl9pbmZvX3QpKTsKIAltZGRldi0+cHJpdmF0ZSA9IGNvbmY7CiAKLQkvKgotCSAqIEZpbmQgdGhlIHNtYWxsZXN0IGRldmljZS4KLQkgKi8KLQotCWNvbmYtPnNtYWxsZXN0ID0gTlVMTDsKIAljbnQgPSAwOwogCW1kZGV2LT5hcnJheV9zaXplID0gMDsKIApAQCAtMTU5LDggKzE1NSw2IEBACiAJCWRpc2stPnNpemUgPSByZGV2LT5zaXplOwogCQltZGRldi0+YXJyYXlfc2l6ZSArPSByZGV2LT5zaXplOwogCi0JCWlmICghY29uZi0+c21hbGxlc3QgfHwgKGRpc2stPnNpemUgPCBjb25mLT5zbWFsbGVzdC0+c2l6ZSkpCi0JCQljb25mLT5zbWFsbGVzdCA9IGRpc2s7CiAJCWNudCsrOwogCX0KIAlpZiAoY250ICE9IG1kZGV2LT5yYWlkX2Rpc2tzKSB7CkBAIC0xNjgsNiArMTYyLDM2IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCW1pbl9zcGFjaW5nID0gbWRkZXYtPmFycmF5X3NpemU7CisJc2VjdG9yX2RpdihtaW5fc3BhY2luZywgUEFHRV9TSVpFL3NpemVvZihzdHJ1Y3QgZGV2X2luZm8gKikpOworCisJLyogbWluX3NwYWNpbmcgaXMgdGhlIG1pbmltdW0gc3BhY2luZyB0aGF0IHdpbGwgZml0IHRoZSBoYXNoCisJICogdGFibGUgaW4gb25lIFBBR0UuICBUaGlzIG1heSBiZSBtdWNoIHNtYWxsZXIgdGhhbiBuZWVkZWQuCisJICogV2UgZmluZCB0aGUgc21hbGxlc3Qgbm9uLXRlcm1pbmFsIHNldCBvZiBjb25zZWN1dGl2ZSBkZXZpY2VzCisJICogdGhhdCBpcyBsYXJnZXIgdGhhbiBtaW5fc3BhY2luZyBhcyB1c2UgdGhlIHNpemUgb2YgdGhhdCBhcworCSAqIHRoZSBhY3R1YWwgc3BhY2luZworCSAqLworCWNvbmYtPmhhc2hfc3BhY2luZyA9IG1kZGV2LT5hcnJheV9zaXplOworCWZvciAoaT0wOyBpIDwgY250LTEgOyBpKyspIHsKKwkJc2VjdG9yX3Qgc3ogPSAwOworCQlpbnQgajsKKwkJZm9yIChqPWk7IGk8Y250LTEgJiYgc3ogPCBtaW5fc3BhY2luZyA7IGorKykKKwkJCXN6ICs9IGNvbmYtPmRpc2tzW2pdLnNpemU7CisJCWlmIChzeiA+PSBtaW5fc3BhY2luZyAmJiBzeiA8IGNvbmYtPmhhc2hfc3BhY2luZykKKwkJCWNvbmYtPmhhc2hfc3BhY2luZyA9IHN6OworCX0KKworCS8qIGhhc2hfc3BhY2luZyBtYXkgYmUgdG9vIGxhcmdlIGZvciBzZWN0b3JfZGl2IHRvIHdvcmsgd2l0aCwKKwkgKiBzbyB3ZSBtaWdodCBuZWVkIHRvIHByZS1zaGlmdAorCSAqLworCWNvbmYtPnByZXNoaWZ0ID0gMDsKKwlpZiAoc2l6ZW9mKHNlY3Rvcl90KSA+IHNpemVvZih1MzIpKSB7CisJCXNlY3Rvcl90IHNwYWNlID0gY29uZi0+aGFzaF9zcGFjaW5nOworCQl3aGlsZSAoc3BhY2UgPiAoc2VjdG9yX3QpKH4odTMyKTApKSB7CisJCQlzcGFjZSA+Pj0gMTsKKwkJCWNvbmYtPnByZXNoaWZ0Kys7CisJCX0KKwl9CiAJLyoKIAkgKiBUaGlzIGNvZGUgd2FzIHJlc3RydWN0dXJlZCB0byB3b3JrIGFyb3VuZCBhIGdjYy0yLjk1LjMgaW50ZXJuYWwKIAkgKiBjb21waWxlciBlcnJvci4gIEFsdGVyIGl0IHdpdGggY2FyZS4KQEAgLTE3NywzOSArMjAxLDUyIEBACiAJCXVuc2lnbmVkIHJvdW5kOwogCQl1bnNpZ25lZCBsb25nIGJhc2U7CiAKLQkJc3ogPSBtZGRldi0+YXJyYXlfc2l6ZTsKLQkJYmFzZSA9IGNvbmYtPnNtYWxsZXN0LT5zaXplOworCQlzeiA9IG1kZGV2LT5hcnJheV9zaXplID4+IGNvbmYtPnByZXNoaWZ0OworCQlzeiArPSAxOyAvKiBmb3JjZSByb3VuZC11cCAqLworCQliYXNlID0gY29uZi0+aGFzaF9zcGFjaW5nID4+IGNvbmYtPnByZXNoaWZ0OwogCQlyb3VuZCA9IHNlY3Rvcl9kaXYoc3osIGJhc2UpOwotCQluYl96b25lID0gY29uZi0+bnJfem9uZXMgPSBzeiArIChyb3VuZCA/IDEgOiAwKTsKKwkJbmJfem9uZSA9IHN6ICsgKHJvdW5kID8gMSA6IDApOwogCX0KLQkJCQotCWNvbmYtPmhhc2hfdGFibGUgPSBrbWFsbG9jIChzaXplb2YgKGRldl9pbmZvX3QqKSAqIG5iX3pvbmUsCisJQlVHX09OKG5iX3pvbmUgPiBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGRldl9pbmZvICopKTsKKworCWNvbmYtPmhhc2hfdGFibGUgPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBkZXZfaW5mbyAqKSAqIG5iX3pvbmUsCiAJCQkJCUdGUF9LRVJORUwpOwogCWlmICghY29uZi0+aGFzaF90YWJsZSkKIAkJZ290byBvdXQ7CiAKIAkvKgogCSAqIEhlcmUgd2UgZ2VuZXJhdGUgdGhlIGxpbmVhciBoYXNoIHRhYmxlCisJICogRmlyc3QgY2FsY3VsYXRlIHRoZSBkZXZpY2Ugb2Zmc2V0cy4KIAkgKi8KKwljb25mLT5kaXNrc1swXS5vZmZzZXQgPSAwOworCWZvciAoaT0xOyBpPG1kZGV2LT5yYWlkX2Rpc2tzOyBpKyspCisJCWNvbmYtPmRpc2tzW2ldLm9mZnNldCA9CisJCQljb25mLT5kaXNrc1tpLTFdLm9mZnNldCArCisJCQljb25mLT5kaXNrc1tpLTFdLnNpemU7CisKIAl0YWJsZSA9IGNvbmYtPmhhc2hfdGFibGU7Ci0Jc3RhcnQgPSAwOwogCWN1cnJfb2Zmc2V0ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKLQkJZGV2X2luZm9fdCAqZGlzayA9IGNvbmYtPmRpc2tzICsgaTsKKwlpID0gMDsKKwlmb3IgKGN1cnJfb2Zmc2V0ID0gMDsKKwkgICAgIGN1cnJfb2Zmc2V0IDwgbWRkZXYtPmFycmF5X3NpemU7CisJICAgICBjdXJyX29mZnNldCArPSBjb25mLT5oYXNoX3NwYWNpbmcpIHsKIAotCQlkaXNrLT5vZmZzZXQgPSBjdXJyX29mZnNldDsKLQkJY3Vycl9vZmZzZXQgKz0gZGlzay0+c2l6ZTsKKwkJd2hpbGUgKGkgPCBtZGRldi0+cmFpZF9kaXNrcy0xICYmCisJCSAgICAgICBjdXJyX29mZnNldCA+PSBjb25mLT5kaXNrc1tpKzFdLm9mZnNldCkKKwkJCWkrKzsKIAotCQkvKiAnY3Vycl9vZmZzZXQnIGlzIHRoZSBlbmQgb2YgdGhpcyBkaXNrCi0JCSAqICdzdGFydCcgaXMgdGhlIHN0YXJ0IG9mIHRhYmxlCi0JCSAqLwotCQl3aGlsZSAoc3RhcnQgPCBjdXJyX29mZnNldCkgewotCQkJKnRhYmxlKysgPSBkaXNrOwotCQkJc3RhcnQgKz0gY29uZi0+c21hbGxlc3QtPnNpemU7Ci0JCX0KKwkJKnRhYmxlICsrID0gY29uZi0+ZGlza3MgKyBpOwogCX0KLQlpZiAodGFibGUtY29uZi0+aGFzaF90YWJsZSAhPSBuYl96b25lKQotCQlCVUcoKTsKKworCWlmIChjb25mLT5wcmVzaGlmdCkgeworCQljb25mLT5oYXNoX3NwYWNpbmcgPj49IGNvbmYtPnByZXNoaWZ0OworCQkvKiByb3VuZCBoYXNoX3NwYWNpbmcgdXAgc28gdGhhdCB3aGVuIHdlIGRpdmlkZSBieSBpdCwKKwkJICogd2UgZXJyIG9uIHRoZSBzaWRlIG9mICJ0b28tbG93Iiwgd2hpY2ggaXMgc2FmZXN0LgorCQkgKi8KKwkJY29uZi0+aGFzaF9zcGFjaW5nKys7CisJfQorCisJQlVHX09OKHRhYmxlIC0gY29uZi0+aGFzaF90YWJsZSA+IG5iX3pvbmUpOwogCiAJYmxrX3F1ZXVlX21lcmdlX2J2ZWMobWRkZXYtPnF1ZXVlLCBsaW5lYXJfbWVyZ2VhYmxlX2J2ZWMpOwogCW1kZGV2LT5xdWV1ZS0+dW5wbHVnX2ZuID0gbGluZWFyX3VucGx1ZzsKQEAgLTIzOCw2ICsyNzUsMTEgQEAKIAlkZXZfaW5mb190ICp0bXBfZGV2OwogCXNlY3Rvcl90IGJsb2NrOwogCisJaWYgKHVubGlrZWx5KGJpb19iYXJyaWVyKGJpbykpKSB7CisJCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwgLUVPUE5PVFNVUFApOworCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAoYmlvX2RhdGFfZGlyKGJpbyk9PVdSSVRFKSB7CiAJCWRpc2tfc3RhdF9pbmMobWRkZXYtPmdlbmRpc2ssIHdyaXRlcyk7CiAJCWRpc2tfc3RhdF9hZGQobWRkZXYtPmdlbmRpc2ssIHdyaXRlX3NlY3RvcnMsIGJpb19zZWN0b3JzKGJpbykpOwpAQCAtMjk0LDcgKzMzNiw3IEBACiAJc2VjdG9yX3QgcyA9IDA7CiAgIAogCXNlcV9wcmludGYoc2VxLCAiICAgICAgIik7Ci0JZm9yIChqID0gMDsgaiA8IGNvbmYtPm5yX3pvbmVzOyBqKyspCisJZm9yIChqID0gMDsgaiA8IG1kZGV2LT5yYWlkX2Rpc2tzOyBqKyspCiAJewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAJCXMgKz0gY29uZi0+c21hbGxlc3Rfc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCAyMGNhODBiLi4yODk3ZGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC0zNCw2ICszNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhaWQvbWQuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL2JpdG1hcC5oPgpAQCAtNzMsNyArNzQsNyBAQAogICogQ3VycmVudCBSQUlELTEsNCw1IHBhcmFsbGVsIHJlY29uc3RydWN0aW9uICdndWFyYW50ZWVkIHNwZWVkIGxpbWl0JwogICogaXMgMTAwMCBLQi9zZWMsIHNvIHRoZSBleHRyYSBzeXN0ZW0gbG9hZCBkb2VzIG5vdCBzaG93IHVwIHRoYXQgbXVjaC4KICAqIEluY3JlYXNlIGl0IGlmIHlvdSB3YW50IHRvIGhhdmUgbW9yZSBfZ3VhcmFudGVlZF8gc3BlZWQuIE5vdGUgdGhhdAotICogdGhlIFJBSUQgZHJpdmVyIHdpbGwgdXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSBiYW5kd2l0aCBpZiB0aGUgSU8KKyAqIHRoZSBSQUlEIGRyaXZlciB3aWxsIHVzZSB0aGUgbWF4aW11bSBhdmFpbGFibGUgYmFuZHdpZHRoIGlmIHRoZSBJTwogICogc3Vic3lzdGVtIGlzIGlkbGUuIFRoZXJlIGlzIGFsc28gYW4gJ2Fic29sdXRlIG1heGltdW0nIHJlY29uc3RydWN0aW9uCiAgKiBzcGVlZCBsaW1pdCAtIGluIGNhc2UgcmVjb25zdHJ1Y3Rpb24gc2xvd3MgZG93biB5b3VyIHN5c3RlbSBkZXNwaXRlCiAgKiBpZGxlIElPIGRldGVjdGlvbi4KQEAgLTM5Myw3ICszOTQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcmVhZF9kaXNrX3NiKG1ka19yZGV2X3QgKiByZGV2KQorc3RhdGljIGludCByZWFkX2Rpc2tfc2IobWRrX3JkZXZfdCAqIHJkZXYsIGludCBzaXplKQogewogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAlpZiAoIXJkZXYtPnNiX3BhZ2UpIHsKQEAgLTQwNCw3ICs0MDUsNyBAQAogCQlyZXR1cm4gMDsKIAogCi0JaWYgKCFzeW5jX3BhZ2VfaW8ocmRldi0+YmRldiwgcmRldi0+c2Jfb2Zmc2V0PDwxLCBNRF9TQl9CWVRFUywgcmRldi0+c2JfcGFnZSwgUkVBRCkpCisJaWYgKCFzeW5jX3BhZ2VfaW8ocmRldi0+YmRldiwgcmRldi0+c2Jfb2Zmc2V0PDwxLCBzaXplLCByZGV2LT5zYl9wYWdlLCBSRUFEKSkKIAkJZ290byBmYWlsOwogCXJkZXYtPnNiX2xvYWRlZCA9IDE7CiAJcmV0dXJuIDA7CkBAIC01MzEsNyArNTMyLDcgQEAKIAlzYl9vZmZzZXQgPSBjYWxjX2Rldl9zYm9mZnNldChyZGV2LT5iZGV2KTsKIAlyZGV2LT5zYl9vZmZzZXQgPSBzYl9vZmZzZXQ7CiAKLQlyZXQgPSByZWFkX2Rpc2tfc2IocmRldik7CisJcmV0ID0gcmVhZF9kaXNrX3NiKHJkZXYsIE1EX1NCX0JZVEVTKTsKIAlpZiAocmV0KSByZXR1cm4gcmV0OwogCiAJcmV0ID0gLUVJTlZBTDsKQEAgLTU2NCw2ICs1NjUsNyBAQAogCiAJcmRldi0+cHJlZmVycmVkX21pbm9yID0gc2ItPm1kX21pbm9yOwogCXJkZXYtPmRhdGFfb2Zmc2V0ID0gMDsKKwlyZGV2LT5zYl9zaXplID0gTURfU0JfQllURVM7CiAKIAlpZiAoc2ItPmxldmVsID09IExFVkVMX01VTFRJUEFUSCkKIAkJcmRldi0+ZGVzY19uciA9IC0xOwpAQCAtNjIzLDYgKzYyNSw3IEBACiAJCW1kZGV2LT5zaXplID0gc2ItPnNpemU7CiAJCW1kZGV2LT5ldmVudHMgPSBtZF9ldmVudChzYik7CiAJCW1kZGV2LT5iaXRtYXBfb2Zmc2V0ID0gMDsKKwkJbWRkZXYtPmRlZmF1bHRfYml0bWFwX29mZnNldCA9IE1EX1NCX0JZVEVTID4+IDk7CiAKIAkJaWYgKHNiLT5zdGF0ZSAmICgxPDxNRF9TQl9DTEVBTikpCiAJCQltZGRldi0+cmVjb3ZlcnlfY3AgPSBNYXhTZWN0b3I7CkBAIC02NDMsMTIgKzY0NiwxMiBAQAogCiAJCWlmIChzYi0+c3RhdGUgJiAoMTw8TURfU0JfQklUTUFQX1BSRVNFTlQpICYmCiAJCSAgICBtZGRldi0+Yml0bWFwX2ZpbGUgPT0gTlVMTCkgewotCQkJaWYgKG1kZGV2LT5sZXZlbCAhPSAxKSB7CisJCQlpZiAobWRkZXYtPmxldmVsICE9IDEgJiYgbWRkZXYtPmxldmVsICE9IDUgJiYgbWRkZXYtPmxldmVsICE9IDYpIHsKIAkJCQkvKiBGSVhNRSB1c2UgYSBiZXR0ZXIgdGVzdCAqLwogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1kOiBiaXRtYXBzIG9ubHkgc3VwcG9ydCBmb3IgcmFpZDFcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQkJbWRkZXYtPmJpdG1hcF9vZmZzZXQgPSAoTURfU0JfQllURVMgPj4gOSk7CisJCQltZGRldi0+Yml0bWFwX29mZnNldCA9IG1kZGV2LT5kZWZhdWx0X2JpdG1hcF9vZmZzZXQ7CiAJCX0KIAogCX0gZWxzZSBpZiAobWRkZXYtPnBlcnMgPT0gTlVMTCkgewpAQCAtNjY5LDYgKzY3Miw3IEBACiAKIAlpZiAobWRkZXYtPmxldmVsICE9IExFVkVMX01VTFRJUEFUSCkgewogCQlyZGV2LT5mYXVsdHkgPSAwOworCQlyZGV2LT5mbGFncyA9IDA7CiAJCWRlc2MgPSBzYi0+ZGlza3MgKyByZGV2LT5kZXNjX25yOwogCiAJCWlmIChkZXNjLT5zdGF0ZSAmICgxPDxNRF9ESVNLX0ZBVUxUWSkpCkBAIC02NzgsNiArNjgyLDggQEAKIAkJCXJkZXYtPmluX3N5bmMgPSAxOwogCQkJcmRldi0+cmFpZF9kaXNrID0gZGVzYy0+cmFpZF9kaXNrOwogCQl9CisJCWlmIChkZXNjLT5zdGF0ZSAmICgxPDxNRF9ESVNLX1dSSVRFTU9TVExZKSkKKwkJCXNldF9iaXQoV3JpdGVNb3N0bHksICZyZGV2LT5mbGFncyk7CiAJfSBlbHNlIC8qIE1VTFRJUEFUSCBhcmUgYWx3YXlzIGluc3luYyAqLwogCQlyZGV2LT5pbl9zeW5jID0gMTsKIAlyZXR1cm4gMDsKQEAgLTcwNiw2ICs3MTIsOCBAQAogCWludCBpOwogCWludCBhY3RpdmU9MCwgd29ya2luZz0wLGZhaWxlZD0wLHNwYXJlPTAsbnJfZGlza3M9MDsKIAorCXJkZXYtPnNiX3NpemUgPSBNRF9TQl9CWVRFUzsKKwogCXNiID0gKG1kcF9zdXBlcl90KilwYWdlX2FkZHJlc3MocmRldi0+c2JfcGFnZSk7CiAKIAltZW1zZXQoc2IsIDAsIHNpemVvZigqc2IpKTsKQEAgLTc3Niw2ICs3ODQsOCBAQAogCQkJc3BhcmUrKzsKIAkJCXdvcmtpbmcrKzsKIAkJfQorCQlpZiAodGVzdF9iaXQoV3JpdGVNb3N0bHksICZyZGV2Mi0+ZmxhZ3MpKQorCQkJZC0+c3RhdGUgfD0gKDE8PE1EX0RJU0tfV1JJVEVNT1NUTFkpOwogCX0KIAkKIAkvKiBub3cgc2V0IHRoZSAicmVtb3ZlZCIgYW5kICJmYXVsdHkiIGJpdHMgb24gYW55IG1pc3NpbmcgZGV2aWNlcyAqLwpAQCAtODMxLDYgKzg0MSw3IEBACiAJaW50IHJldDsKIAlzZWN0b3JfdCBzYl9vZmZzZXQ7CiAJY2hhciBiW0JERVZOQU1FX1NJWkVdLCBiMltCREVWTkFNRV9TSVpFXTsKKwlpbnQgYm1hc2s7CiAKIAkvKgogCSAqIENhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHN1cGVyYmxvY2suCkBAIC04NTksNyArODcwLDEwIEBACiAJfQogCXJkZXYtPnNiX29mZnNldCA9IHNiX29mZnNldDsKIAotCXJldCA9IHJlYWRfZGlza19zYihyZGV2KTsKKwkvKiBzdXBlcmJsb2NrIGlzIHJhcmVseSBsYXJnZXIgdGhhbiAxSywgYnV0IGl0IGNhbiBiZSBsYXJnZXIsCisJICogYW5kIGl0IGlzIHNhZmUgdG8gcmVhZCA0aywgc28gd2UgZG8gdGhhdAorCSAqLworCXJldCA9IHJlYWRfZGlza19zYihyZGV2LCA0MDk2KTsKIAlpZiAocmV0KSByZXR1cm4gcmV0OwogCiAKQEAgLTg2OSw3ICs4ODMsNyBAQAogCSAgICBzYi0+bWFqb3JfdmVyc2lvbiAhPSBjcHVfdG9fbGUzMigxKSB8fAogCSAgICBsZTMyX3RvX2NwdShzYi0+bWF4X2RldikgPiAoNDA5Ni0yNTYpLzIgfHwKIAkgICAgbGU2NF90b19jcHUoc2ItPnN1cGVyX29mZnNldCkgIT0gKHJkZXYtPnNiX29mZnNldDw8MSkgfHwKLQkgICAgc2ItPmZlYXR1cmVfbWFwICE9IDApCisJICAgIChsZTMyX3RvX2NwdShzYi0+ZmVhdHVyZV9tYXApICYgfk1EX0ZFQVRVUkVfQUxMKSAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjYWxjX3NiXzFfY3N1bShzYikgIT0gc2ItPnNiX2NzdW0pIHsKQEAgLTg4NSw2ICs4OTksMTEgQEAKIAlyZGV2LT5wcmVmZXJyZWRfbWlub3IgPSAweGZmZmY7CiAJcmRldi0+ZGF0YV9vZmZzZXQgPSBsZTY0X3RvX2NwdShzYi0+ZGF0YV9vZmZzZXQpOwogCisJcmRldi0+c2Jfc2l6ZSA9IGxlMzJfdG9fY3B1KHNiLT5tYXhfZGV2KSAqIDIgKyAyNTY7CisJYm1hc2sgPSBxdWV1ZV9oYXJkc2VjdF9zaXplKHJkZXYtPmJkZXYtPmJkX2Rpc2stPnF1ZXVlKS0xOworCWlmIChyZGV2LT5zYl9zaXplICYgYm1hc2spCisJCXJkZXYtPiBzYl9zaXplID0gKHJkZXYtPnNiX3NpemUgfCBibWFzaykrMTsKKwogCWlmIChyZWZkZXYgPT0gMCkKIAkJcmV0dXJuIDE7CiAJZWxzZSB7CkBAIC05MzksMTMgKzk1OCwxNSBAQAogCQltZGRldi0+c2l6ZSA9IGxlNjRfdG9fY3B1KHNiLT5zaXplKS8yOwogCQltZGRldi0+ZXZlbnRzID0gbGU2NF90b19jcHUoc2ItPmV2ZW50cyk7CiAJCW1kZGV2LT5iaXRtYXBfb2Zmc2V0ID0gMDsKKwkJbWRkZXYtPmRlZmF1bHRfYml0bWFwX29mZnNldCA9IDA7CisJCW1kZGV2LT5kZWZhdWx0X2JpdG1hcF9vZmZzZXQgPSAxMDI0OwogCQkKIAkJbWRkZXYtPnJlY292ZXJ5X2NwID0gbGU2NF90b19jcHUoc2ItPnJlc3luY19vZmZzZXQpOwogCQltZW1jcHkobWRkZXYtPnV1aWQsIHNiLT5zZXRfdXVpZCwgMTYpOwogCiAJCW1kZGV2LT5tYXhfZGlza3MgPSAgKDQwOTYtMjU2KS8yOwogCi0JCWlmICgobGUzMl90b19jcHUoc2ItPmZlYXR1cmVfbWFwKSAmIDEpICYmCisJCWlmICgobGUzMl90b19jcHUoc2ItPmZlYXR1cmVfbWFwKSAmIE1EX0ZFQVRVUkVfQklUTUFQX09GRlNFVCkgJiYKIAkJICAgIG1kZGV2LT5iaXRtYXBfZmlsZSA9PSBOVUxMICkgewogCQkJaWYgKG1kZGV2LT5sZXZlbCAhPSAxKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWQ6IGJpdG1hcHMgb25seSBzdXBwb3J0ZWQgZm9yIHJhaWQxXG4iKTsKQEAgLTk4Niw2ICsxMDA3LDkgQEAKIAkJCXJkZXYtPnJhaWRfZGlzayA9IHJvbGU7CiAJCQlicmVhazsKIAkJfQorCQlyZGV2LT5mbGFncyA9IDA7CisJCWlmIChzYi0+ZGV2ZmxhZ3MgJiBXcml0ZU1vc3RseTEpCisJCQlzZXRfYml0KFdyaXRlTW9zdGx5LCAmcmRldi0+ZmxhZ3MpOwogCX0gZWxzZSAvKiBNVUxUSVBBVEggYXJlIGFsd2F5cyBpbnN5bmMgKi8KIAkJcmRldi0+aW5fc3luYyA9IDE7CiAKQEAgLTEwMTcsNyArMTA0MSw3IEBACiAKIAlpZiAobWRkZXYtPmJpdG1hcCAmJiBtZGRldi0+Yml0bWFwX2ZpbGUgPT0gTlVMTCkgewogCQlzYi0+Yml0bWFwX29mZnNldCA9IGNwdV90b19sZTMyKChfX3UzMiltZGRldi0+Yml0bWFwX29mZnNldCk7Ci0JCXNiLT5mZWF0dXJlX21hcCA9IGNwdV90b19sZTMyKDEpOworCQlzYi0+ZmVhdHVyZV9tYXAgPSBjcHVfdG9fbGUzMihNRF9GRUFUVVJFX0JJVE1BUF9PRkZTRVQpOwogCX0KIAogCW1heF9kZXYgPSAwOwpAQCAtMTM2Myw3ICsxMzg3LDcgQEAKIAkJZHByaW50aygiJXMgIiwgYmRldm5hbWUocmRldi0+YmRldixiKSk7CiAJCWlmICghcmRldi0+ZmF1bHR5KSB7CiAJCQltZF9zdXBlcl93cml0ZShtZGRldixyZGV2LAotCQkJCSAgICAgICByZGV2LT5zYl9vZmZzZXQ8PDEsIE1EX1NCX0JZVEVTLAorCQkJCSAgICAgICByZGV2LT5zYl9vZmZzZXQ8PDEsIHJkZXYtPnNiX3NpemUsCiAJCQkJICAgICAgIHJkZXYtPnNiX3BhZ2UpOwogCQkJZHByaW50ayhLRVJOX0lORk8gIih3cml0ZSkgJXMncyBzYiBvZmZzZXQ6ICVsbHVcbiIsCiAJCQkJYmRldm5hbWUocmRldi0+YmRldixiKSwKQEAgLTIwNzMsNiArMjA5Nyw4IEBACiAJaW5mby5zdGF0ZSAgICAgICAgID0gMDsKIAlpZiAobWRkZXYtPmluX3N5bmMpCiAJCWluZm8uc3RhdGUgPSAoMTw8TURfU0JfQ0xFQU4pOworCWlmIChtZGRldi0+Yml0bWFwICYmIG1kZGV2LT5iaXRtYXBfb2Zmc2V0KQorCQlpbmZvLnN0YXRlID0gKDE8PE1EX1NCX0JJVE1BUF9QUkVTRU5UKTsKIAlpbmZvLmFjdGl2ZV9kaXNrcyAgPSBhY3RpdmU7CiAJaW5mby53b3JraW5nX2Rpc2tzID0gd29ya2luZzsKIAlpbmZvLmZhaWxlZF9kaXNrcyAgPSBmYWlsZWQ7CkBAIC0yMDg3LDcgKzIxMTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdldF9iaXRtYXBfZmlsZShtZGRldl90ICogbWRkZXYsIHZvaWQgKiBhcmcpCitzdGF0aWMgaW50IGdldF9iaXRtYXBfZmlsZShtZGRldl90ICogbWRkZXYsIHZvaWQgX191c2VyICogYXJnKQogewogCW1kdV9iaXRtYXBfZmlsZV90ICpmaWxlID0gTlVMTDsgLyogdG9vIGJpZyBmb3Igc3RhY2sgYWxsb2NhdGlvbiAqLwogCWNoYXIgKnB0ciwgKmJ1ZiA9IE5VTEw7CkBAIC0yMTQ2LDYgKzIxNzIsOCBAQAogCQkJaW5mby5zdGF0ZSB8PSAoMTw8TURfRElTS19BQ1RJVkUpOwogCQkJaW5mby5zdGF0ZSB8PSAoMTw8TURfRElTS19TWU5DKTsKIAkJfQorCQlpZiAodGVzdF9iaXQoV3JpdGVNb3N0bHksICZyZGV2LT5mbGFncykpCisJCQlpbmZvLnN0YXRlIHw9ICgxPDxNRF9ESVNLX1dSSVRFTU9TVExZKTsKIAl9IGVsc2UgewogCQlpbmZvLm1ham9yID0gaW5mby5taW5vciA9IDA7CiAJCWluZm8ucmFpZF9kaXNrID0gLTE7CkBAIC0yMjEwLDggKzIyMzgsMTEgQEAKIAkJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCXJkZXYgPSBtZF9pbXBvcnRfZGV2aWNlKGRldiwgbWRkZXYtPm1ham9yX3ZlcnNpb24sCi0JCQkJCW1kZGV2LT5taW5vcl92ZXJzaW9uKTsKKwkJaWYgKG1kZGV2LT5wZXJzaXN0ZW50KQorCQkJcmRldiA9IG1kX2ltcG9ydF9kZXZpY2UoZGV2LCBtZGRldi0+bWFqb3JfdmVyc2lvbiwKKwkJCQkJCW1kZGV2LT5taW5vcl92ZXJzaW9uKTsKKwkJZWxzZQorCQkJcmRldiA9IG1kX2ltcG9ydF9kZXZpY2UoZGV2LCAtMSwgLTEpOwogCQlpZiAoSVNfRVJSKHJkZXYpKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIAogCQkJCSJtZDogbWRfaW1wb3J0X2RldmljZSByZXR1cm5lZCAlbGRcbiIsCkBAIC0yMjMxLDYgKzIyNjIsOSBAQAogCQlyZGV2LT5zYXZlZF9yYWlkX2Rpc2sgPSByZGV2LT5yYWlkX2Rpc2s7CiAKIAkJcmRldi0+aW5fc3luYyA9IDA7IC8qIGp1c3QgdG8gYmUgc3VyZSAqLworCQlpZiAoaW5mby0+c3RhdGUgJiAoMTw8TURfRElTS19XUklURU1PU1RMWSkpCisJCQlzZXRfYml0KFdyaXRlTW9zdGx5LCAmcmRldi0+ZmxhZ3MpOworCiAJCXJkZXYtPnJhaWRfZGlzayA9IC0xOwogCQllcnIgPSBiaW5kX3JkZXZfdG9fYXJyYXkocmRldiwgbWRkZXYpOwogCQlpZiAoZXJyKQpAQCAtMjI3MSw2ICsyMzA1LDkgQEAKIAkJZWxzZQogCQkJcmRldi0+aW5fc3luYyA9IDA7CiAKKwkJaWYgKGluZm8tPnN0YXRlICYgKDE8PE1EX0RJU0tfV1JJVEVNT1NUTFkpKQorCQkJc2V0X2JpdChXcml0ZU1vc3RseSwgJnJkZXYtPmZsYWdzKTsKKwogCQllcnIgPSBiaW5kX3JkZXZfdG9fYXJyYXkocmRldiwgbWRkZXYpOwogCQlpZiAoZXJyKSB7CiAJCQlleHBvcnRfcmRldihyZGV2KTsKQEAgLTI0MzAsMjUgKzI0NjcsNTEgQEAKIHsKIAlpbnQgZXJyOwogCi0JaWYgKG1kZGV2LT5wZXJzKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JbWRkZXYtPmJpdG1hcF9maWxlID0gZmdldChmZCk7Ci0KLQlpZiAobWRkZXYtPmJpdG1hcF9maWxlID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3I6IGZhaWxlZCB0byBnZXQgYml0bWFwIGZpbGVcbiIsCi0JCQltZG5hbWUobWRkZXYpKTsKLQkJcmV0dXJuIC1FQkFERjsKKwlpZiAobWRkZXYtPnBlcnMpIHsKKwkJaWYgKCFtZGRldi0+cGVycy0+cXVpZXNjZSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWlmIChtZGRldi0+cmVjb3ZlcnkgfHwgbWRkZXYtPnN5bmNfdGhyZWFkKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJLyogd2Ugc2hvdWxkIGJlIGFibGUgdG8gY2hhbmdlIHRoZSBiaXRtYXAuLiAqLwogCX0KIAotCWVyciA9IGRlbnlfYml0bWFwX3dyaXRlX2FjY2VzcyhtZGRldi0+Yml0bWFwX2ZpbGUpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3I6IGJpdG1hcCBmaWxlIGlzIGFscmVhZHkgaW4gdXNlXG4iLAotCQkJbWRuYW1lKG1kZGV2KSk7Ci0JCWZwdXQobWRkZXYtPmJpdG1hcF9maWxlKTsKLQkJbWRkZXYtPmJpdG1hcF9maWxlID0gTlVMTDsKLQl9IGVsc2UKKworCWlmIChmZCA+PSAwKSB7CisJCWlmIChtZGRldi0+Yml0bWFwKQorCQkJcmV0dXJuIC1FRVhJU1Q7IC8qIGNhbm5vdCBhZGQgd2hlbiBiaXRtYXAgaXMgcHJlc2VudCAqLworCQltZGRldi0+Yml0bWFwX2ZpbGUgPSBmZ2V0KGZkKTsKKworCQlpZiAobWRkZXYtPmJpdG1hcF9maWxlID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yOiBmYWlsZWQgdG8gZ2V0IGJpdG1hcCBmaWxlXG4iLAorCQkJICAgICAgIG1kbmFtZShtZGRldikpOworCQkJcmV0dXJuIC1FQkFERjsKKwkJfQorCisJCWVyciA9IGRlbnlfYml0bWFwX3dyaXRlX2FjY2VzcyhtZGRldi0+Yml0bWFwX2ZpbGUpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvcjogYml0bWFwIGZpbGUgaXMgYWxyZWFkeSBpbiB1c2VcbiIsCisJCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CisJCQlmcHV0KG1kZGV2LT5iaXRtYXBfZmlsZSk7CisJCQltZGRldi0+Yml0bWFwX2ZpbGUgPSBOVUxMOworCQkJcmV0dXJuIGVycjsKKwkJfQogCQltZGRldi0+Yml0bWFwX29mZnNldCA9IDA7IC8qIGZpbGUgb3ZlcnJpZGVzIG9mZnNldCAqLworCX0gZWxzZSBpZiAobWRkZXYtPmJpdG1hcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsgLyogY2Fubm90IHJlbW92ZSB3aGF0IGlzbid0IHRoZXJlICovCisJZXJyID0gMDsKKwlpZiAobWRkZXYtPnBlcnMpIHsKKwkJbWRkZXYtPnBlcnMtPnF1aWVzY2UobWRkZXYsIDEpOworCQlpZiAoZmQgPj0gMCkKKwkJCWVyciA9IGJpdG1hcF9jcmVhdGUobWRkZXYpOworCQlpZiAoZmQgPCAwIHx8IGVycikKKwkJCWJpdG1hcF9kZXN0cm95KG1kZGV2KTsKKwkJbWRkZXYtPnBlcnMtPnF1aWVzY2UobWRkZXYsIDApOworCX0gZWxzZSBpZiAoZmQgPCAwKSB7CisJCWlmIChtZGRldi0+Yml0bWFwX2ZpbGUpCisJCQlmcHV0KG1kZGV2LT5iaXRtYXBfZmlsZSk7CisJCW1kZGV2LT5iaXRtYXBfZmlsZSA9IE5VTEw7CisJfQorCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjUyOCw2ICsyNTkxLDExIEBACiB7CiAJaW50IHJ2ID0gMDsKIAlpbnQgY250ID0gMDsKKwlpbnQgc3RhdGUgPSAwOworCisJLyogY2FsY3VsYXRlIGV4cGVjdGVkIHN0YXRlLGlnbm9yaW5nIGxvdyBiaXRzICovCisJaWYgKG1kZGV2LT5iaXRtYXAgJiYgbWRkZXYtPmJpdG1hcF9vZmZzZXQpCisJCXN0YXRlIHw9ICgxIDw8IE1EX1NCX0JJVE1BUF9QUkVTRU5UKTsKIAogCWlmIChtZGRldi0+bWFqb3JfdmVyc2lvbiAhPSBpbmZvLT5tYWpvcl92ZXJzaW9uIHx8CiAJICAgIG1kZGV2LT5taW5vcl92ZXJzaW9uICE9IGluZm8tPm1pbm9yX3ZlcnNpb24gfHwKQEAgLTI1MzYsMTIgKzI2MDQsMTYgQEAKIAkgICAgbWRkZXYtPmxldmVsICAgICAgICAgIT0gaW5mby0+bGV2ZWwgICAgICAgICB8fAogLyoJICAgIG1kZGV2LT5sYXlvdXQgICAgICAgICE9IGluZm8tPmxheW91dCAgICAgICAgfHwgKi8KIAkgICAgIW1kZGV2LT5wZXJzaXN0ZW50CSAhPSBpbmZvLT5ub3RfcGVyc2lzdGVudHx8Ci0JICAgIG1kZGV2LT5jaHVua19zaXplICAgICE9IGluZm8tPmNodW5rX3NpemUgICAgKQorCSAgICBtZGRldi0+Y2h1bmtfc2l6ZSAgICAhPSBpbmZvLT5jaHVua19zaXplICAgIHx8CisJICAgIC8qIGlnbm9yZSBib3R0b20gOCBiaXRzIG9mIHN0YXRlLCBhbmQgYWxsb3cgU0JfQklUTUFQX1BSRVNFTlQgdG8gY2hhbmdlICovCisJICAgICgoc3RhdGVeaW5mby0+c3RhdGUpICYgMHhmZmZmZmUwMCkKKwkJKQogCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiBDaGVjayB0aGVyZSBpcyBvbmx5IG9uZSBjaGFuZ2UgKi8KIAlpZiAobWRkZXYtPnNpemUgIT0gaW5mby0+c2l6ZSkgY250Kys7CiAJaWYgKG1kZGV2LT5yYWlkX2Rpc2tzICE9IGluZm8tPnJhaWRfZGlza3MpIGNudCsrOwogCWlmIChtZGRldi0+bGF5b3V0ICE9IGluZm8tPmxheW91dCkgY250Kys7CisJaWYgKChzdGF0ZSBeIGluZm8tPnN0YXRlKSAmICgxPDxNRF9TQl9CSVRNQVBfUFJFU0VOVCkpIGNudCsrOwogCWlmIChjbnQgPT0gMCkgcmV0dXJuIDA7CiAJaWYgKGNudCA+IDEpIHJldHVybiAtRUlOVkFMOwogCkBAIC0yNjIwLDYgKzI2OTIsMzUgQEAKIAkJCX0KIAkJfQogCX0KKwlpZiAoKHN0YXRlIF4gaW5mby0+c3RhdGUpICYgKDE8PE1EX1NCX0JJVE1BUF9QUkVTRU5UKSkgeworCQlpZiAobWRkZXYtPnBlcnMtPnF1aWVzY2UgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobWRkZXYtPnJlY292ZXJ5IHx8IG1kZGV2LT5zeW5jX3RocmVhZCkKKwkJCXJldHVybiAtRUJVU1k7CisJCWlmIChpbmZvLT5zdGF0ZSAmICgxPDxNRF9TQl9CSVRNQVBfUFJFU0VOVCkpIHsKKwkJCS8qIGFkZCB0aGUgYml0bWFwICovCisJCQlpZiAobWRkZXYtPmJpdG1hcCkKKwkJCQlyZXR1cm4gLUVFWElTVDsKKwkJCWlmIChtZGRldi0+ZGVmYXVsdF9iaXRtYXBfb2Zmc2V0ID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQltZGRldi0+Yml0bWFwX29mZnNldCA9IG1kZGV2LT5kZWZhdWx0X2JpdG1hcF9vZmZzZXQ7CisJCQltZGRldi0+cGVycy0+cXVpZXNjZShtZGRldiwgMSk7CisJCQlydiA9IGJpdG1hcF9jcmVhdGUobWRkZXYpOworCQkJaWYgKHJ2KQorCQkJCWJpdG1hcF9kZXN0cm95KG1kZGV2KTsKKwkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJlbW92ZSB0aGUgYml0bWFwICovCisJCQlpZiAoIW1kZGV2LT5iaXRtYXApCisJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQlpZiAobWRkZXYtPmJpdG1hcC0+ZmlsZSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAxKTsKKwkJCWJpdG1hcF9kZXN0cm95KG1kZGV2KTsKKwkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAwKTsKKwkJCW1kZGV2LT5iaXRtYXBfb2Zmc2V0ID0gMDsKKwkJfQorCX0KIAltZF91cGRhdGVfc2IobWRkZXYpOwogCXJldHVybiBydjsKIH0KQEAgLTI3ODEsNyArMjg4Miw3IEBACiAJCQlnb3RvIGRvbmVfdW5sb2NrOwogCiAJCWNhc2UgR0VUX0JJVE1BUF9GSUxFOgotCQkJZXJyID0gZ2V0X2JpdG1hcF9maWxlKG1kZGV2LCAodm9pZCAqKWFyZyk7CisJCQllcnIgPSBnZXRfYml0bWFwX2ZpbGUobWRkZXYsIGFyZ3ApOwogCQkJZ290byBkb25lX3VubG9jazsKIAogCQljYXNlIEdFVF9ESVNLX0lORk86CkBAIC0yOTUwLDE4ICszMDUxLDYgQEAKIHsKIAltZGtfdGhyZWFkX3QgKnRocmVhZCA9IGFyZzsKIAotCWxvY2tfa2VybmVsKCk7Ci0KLQkvKgotCSAqIERldGFjaCB0aHJlYWQKLQkgKi8KLQotCWRhZW1vbml6ZSh0aHJlYWQtPm5hbWUsIG1kbmFtZSh0aHJlYWQtPm1kZGV2KSk7Ci0KLQljdXJyZW50LT5leGl0X3NpZ25hbCA9IFNJR0NITEQ7Ci0JYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwotCXRocmVhZC0+dHNrID0gY3VycmVudDsKLQogCS8qCiAJICogbWRfdGhyZWFkIGlzIGEgJ3N5c3RlbS10aHJlYWQnLCBpdCdzIHByaW9yaXR5IHNob3VsZCBiZSB2ZXJ5CiAJICogaGlnaC4gV2UgYXZvaWQgcmVzb3VyY2UgZGVhZGxvY2tzIGluZGl2aWR1YWxseSBpbiBlYWNoCkBAIC0yOTczLDE0ICszMDYyLDE0IEBACiAJICogYmRmbHVzaCwgb3RoZXJ3aXNlIGJkZmx1c2ggd2lsbCBkZWFkbG9jayBpZiB0aGVyZSBhcmUgdG9vCiAJICogbWFueSBkaXJ0eSBSQUlENSBibG9ja3MuCiAJICovCi0JdW5sb2NrX2tlcm5lbCgpOwogCiAJY29tcGxldGUodGhyZWFkLT5ldmVudCk7Ci0Jd2hpbGUgKHRocmVhZC0+cnVuKSB7CisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJdm9pZCAoKnJ1bikobWRkZXZfdCAqKTsKIAogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh0aHJlYWQtPndxdWV1ZSwKLQkJCQkJCSB0ZXN0X2JpdChUSFJFQURfV0FLRVVQLCAmdGhyZWFkLT5mbGFncyksCisJCQkJCQkgdGVzdF9iaXQoVEhSRUFEX1dBS0VVUCwgJnRocmVhZC0+ZmxhZ3MpCisJCQkJCQkgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpLAogCQkJCQkJIHRocmVhZC0+dGltZW91dCk7CiAJCXRyeV90b19mcmVlemUoKTsKIApAQCAtMjk4OSwxMSArMzA3OCw4IEBACiAJCXJ1biA9IHRocmVhZC0+cnVuOwogCQlpZiAocnVuKQogCQkJcnVuKHRocmVhZC0+bWRkZXYpOwotCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAJfQotCWNvbXBsZXRlKHRocmVhZC0+ZXZlbnQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwMTAsMTEgKzMwOTYsOSBAQAogCQkJCSBjb25zdCBjaGFyICpuYW1lKQogewogCW1ka190aHJlYWRfdCAqdGhyZWFkOwotCWludCByZXQ7CiAJc3RydWN0IGNvbXBsZXRpb24gZXZlbnQ7CiAKLQl0aHJlYWQgPSAobWRrX3RocmVhZF90ICopIGttYWxsb2MKLQkJCQkoc2l6ZW9mKG1ka190aHJlYWRfdCksIEdGUF9LRVJORUwpOworCXRocmVhZCA9IGttYWxsb2Moc2l6ZW9mKG1ka190aHJlYWRfdCksIEdGUF9LRVJORUwpOwogCWlmICghdGhyZWFkKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMzAyNyw4ICszMTExLDggQEAKIAl0aHJlYWQtPm1kZGV2ID0gbWRkZXY7CiAJdGhyZWFkLT5uYW1lID0gbmFtZTsKIAl0aHJlYWQtPnRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKLQlyZXQgPSBrZXJuZWxfdGhyZWFkKG1kX3RocmVhZCwgdGhyZWFkLCAwKTsKLQlpZiAocmV0IDwgMCkgeworCXRocmVhZC0+dHNrID0ga3RocmVhZF9ydW4obWRfdGhyZWFkLCB0aHJlYWQsIG1kbmFtZSh0aHJlYWQtPm1kZGV2KSk7CisJaWYgKElTX0VSUih0aHJlYWQtPnRzaykpIHsKIAkJa2ZyZWUodGhyZWFkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMzAzOCwyMSArMzEyMiw5IEBACiAKIHZvaWQgbWRfdW5yZWdpc3Rlcl90aHJlYWQobWRrX3RocmVhZF90ICp0aHJlYWQpCiB7Ci0Jc3RydWN0IGNvbXBsZXRpb24gZXZlbnQ7Ci0KLQlpbml0X2NvbXBsZXRpb24oJmV2ZW50KTsKLQotCXRocmVhZC0+ZXZlbnQgPSAmZXZlbnQ7Ci0KLQkvKiBBcyBzb29uIGFzIC0+cnVuIGlzIHNldCB0byBOVUxMLCB0aGUgdGFzayBjb3VsZCBkaXNhcHBlYXIsCi0JICogc28gd2UgbmVlZCB0byBob2xkIHRhc2tsaXN0X2xvY2sgdW50aWwgd2UgaGF2ZSBzZW50IHRoZSBzaWduYWwKLQkgKi8KIAlkcHJpbnRrKCJpbnRlcnJ1cHRpbmcgTUQtdGhyZWFkIHBpZCAlZFxuIiwgdGhyZWFkLT50c2stPnBpZCk7Ci0JcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQl0aHJlYWQtPnJ1biA9IE5VTEw7Ci0Jc2VuZF9zaWcoU0lHS0lMTCwgdGhyZWFkLT50c2ssIDEpOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZldmVudCk7CisKKwlrdGhyZWFkX3N0b3AodGhyZWFkLT50c2spOwogCWtmcmVlKHRocmVhZCk7CiB9CiAKQEAgLTMyNTksMTAgKzMzMzEsMTMgQEAKIAkJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAkJCXNlcV9wcmludGYoc2VxLCAiICVzWyVkXSIsCiAJCQkJYmRldm5hbWUocmRldi0+YmRldixiKSwgcmRldi0+ZGVzY19ucik7CisJCQlpZiAodGVzdF9iaXQoV3JpdGVNb3N0bHksICZyZGV2LT5mbGFncykpCisJCQkJc2VxX3ByaW50ZihzZXEsICIoVykiKTsKIAkJCWlmIChyZGV2LT5mYXVsdHkpIHsKIAkJCQlzZXFfcHJpbnRmKHNlcSwgIihGKSIpOwogCQkJCWNvbnRpbnVlOwotCQkJfQorCQkJfSBlbHNlIGlmIChyZGV2LT5yYWlkX2Rpc2sgPCAwKQorCQkJCXNlcV9wcmludGYoc2VxLCAiKFMpIik7IC8qIHNwYXJlICovCiAJCQlzaXplICs9IHJkZXYtPnNpemU7CiAJCX0KIApAQCAtMzI3NCw2ICszMzQ5LDE1IEBACiAJCQkJc2VxX3ByaW50ZihzZXEsICJcbiAgICAgICVsbHUgYmxvY2tzIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaXplKTsKIAkJfQorCQlpZiAobWRkZXYtPnBlcnNpc3RlbnQpIHsKKwkJCWlmIChtZGRldi0+bWFqb3JfdmVyc2lvbiAhPSAwIHx8CisJCQkgICAgbWRkZXYtPm1pbm9yX3ZlcnNpb24gIT0gOTApIHsKKwkJCQlzZXFfcHJpbnRmKHNlcSwiIHN1cGVyICVkLiVkIiwKKwkJCQkJICAgbWRkZXYtPm1ham9yX3ZlcnNpb24sCisJCQkJCSAgIG1kZGV2LT5taW5vcl92ZXJzaW9uKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlzZXFfcHJpbnRmKHNlcSwgIiBzdXBlciBub24tcGVyc2lzdGVudCIpOwogCiAJCWlmIChtZGRldi0+cGVycykgewogCQkJbWRkZXYtPnBlcnMtPnN0YXR1cyAoc2VxLCBtZGRldik7CkBAIC0zNDE2LDcgKzM1MDAsNiBAQAogICovCiB2b2lkIG1kX3dyaXRlX3N0YXJ0KG1kZGV2X3QgKm1kZGV2LCBzdHJ1Y3QgYmlvICpiaSkKIHsKLQlERUZJTkVfV0FJVCh3KTsKIAlpZiAoYmlvX2RhdGFfZGlyKGJpKSAhPSBXUklURSkKIAkJcmV0dXJuOwogCkBAIC0zNTMzLDcgKzM2MTYsNyBAQAogCXByaW50ayhLRVJOX0lORk8gIm1kOiBzeW5jaW5nIFJBSUQgYXJyYXkgJXNcbiIsIG1kbmFtZShtZGRldikpOwogCXByaW50ayhLRVJOX0lORk8gIm1kOiBtaW5pbXVtIF9ndWFyYW50ZWVkXyByZWNvbnN0cnVjdGlvbiBzcGVlZDoiCiAJCSIgJWQgS0Ivc2VjL2Rpc2MuXG4iLCBzeXNjdGxfc3BlZWRfbGltaXRfbWluKTsKLQlwcmludGsoS0VSTl9JTkZPICJtZDogdXNpbmcgbWF4aW11bSBhdmFpbGFibGUgaWRsZSBJTyBiYW5kd2l0aCAiCisJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IHVzaW5nIG1heGltdW0gYXZhaWxhYmxlIGlkbGUgSU8gYmFuZHdpZHRoICIKIAkgICAgICAgIihidXQgbm90IG1vcmUgdGhhbiAlZCBLQi9zZWMpIGZvciByZWNvbnN0cnVjdGlvbi5cbiIsCiAJICAgICAgIHN5c2N0bF9zcGVlZF9saW1pdF9tYXgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL211bHRpcGF0aC5jIGIvZHJpdmVycy9tZC9tdWx0aXBhdGguYwppbmRleCAyZDJjYTdmLi4yODYzNDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL211bHRpcGF0aC5jCisrKyBiL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKQEAgLTE2OSw2ICsxNjksMTEgQEAKIAlzdHJ1Y3QgbXVsdGlwYXRoX2JoICogbXBfYmg7CiAJc3RydWN0IG11bHRpcGF0aF9pbmZvICptdWx0aXBhdGg7CiAKKwlpZiAodW5saWtlbHkoYmlvX2JhcnJpZXIoYmlvKSkpIHsKKwkJYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9zaXplLCAtRU9QTk9UU1VQUCk7CisJCXJldHVybiAwOworCX0KKwogCW1wX2JoID0gbWVtcG9vbF9hbGxvYyhjb25mLT5wb29sLCBHRlBfTk9JTyk7CiAKIAltcF9iaC0+bWFzdGVyX2JpbyA9IGJpbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDAuYyBiL2RyaXZlcnMvbWQvcmFpZDAuYwppbmRleCAyMTIwNzEwLi5mNjc1NzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMC5jCkBAIC00MDQsNiArNDA0LDExIEBACiAJdW5zaWduZWQgbG9uZyBjaHVuazsKIAlzZWN0b3JfdCBibG9jaywgcnNlY3Q7CiAKKwlpZiAodW5saWtlbHkoYmlvX2JhcnJpZXIoYmlvKSkpIHsKKwkJYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9zaXplLCAtRU9QTk9UU1VQUCk7CisJCXJldHVybiAwOworCX0KKwogCWlmIChiaW9fZGF0YV9kaXIoYmlvKT09V1JJVEUpIHsKIAkJZGlza19zdGF0X2luYyhtZGRldi0+Z2VuZGlzaywgd3JpdGVzKTsKIAkJZGlza19zdGF0X2FkZChtZGRldi0+Z2VuZGlzaywgd3JpdGVfc2VjdG9ycywgYmlvX3NlY3RvcnMoYmlvKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggNTFkOTY0NS4uYTkzY2E0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtMjIyLDggKzIyMiwxNyBAQAogewogCXN0cnVjdCBiaW8gKmJpbyA9IHIxX2Jpby0+bWFzdGVyX2JpbzsKIAotCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwKLQkJdGVzdF9iaXQoUjFCSU9fVXB0b2RhdGUsICZyMV9iaW8tPnN0YXRlKSA/IDAgOiAtRUlPKTsKKwkvKiBpZiBub2JvZHkgaGFzIGRvbmUgdGhlIGZpbmFsIGVuZGlvIHlldCwgZG8gaXQgbm93ICovCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFIxQklPX1JldHVybmVkLCAmcjFfYmlvLT5zdGF0ZSkpIHsKKwkJUFJJTlRLKEtFUk5fREVCVUcgInJhaWQxOiBzeW5jIGVuZCAlcyBvbiBzZWN0b3JzICVsbHUtJWxsdVxuIiwKKwkJCShiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkgPyAid3JpdGUiIDogInJlYWQiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgYmlvLT5iaV9zZWN0b3IsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBiaW8tPmJpX3NlY3RvciArCisJCQkJKGJpby0+Ymlfc2l6ZSA+PiA5KSAtIDEpOworCisJCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwKKwkJCXRlc3RfYml0KFIxQklPX1VwdG9kYXRlLCAmcjFfYmlvLT5zdGF0ZSkgPyAwIDogLUVJTyk7CisJfQogCWZyZWVfcjFiaW8ocjFfYmlvKTsKIH0KIApAQCAtMjkyLDcgKzMwMSw3IEBACiB7CiAJaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CiAJcjFiaW9fdCAqIHIxX2JpbyA9IChyMWJpb190ICopKGJpby0+YmlfcHJpdmF0ZSk7Ci0JaW50IG1pcnJvcjsKKwlpbnQgbWlycm9yLCBiZWhpbmQ7CiAJY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihyMV9iaW8tPm1kZGV2KTsKIAogCWlmIChiaW8tPmJpX3NpemUpCkBAIC0zMjMsMTYgKzMzMiw0NiBAQAogCiAJdXBkYXRlX2hlYWRfcG9zKG1pcnJvciwgcjFfYmlvKTsKIAorCWJlaGluZCA9IHRlc3RfYml0KFIxQklPX0JlaGluZElPLCAmcjFfYmlvLT5zdGF0ZSk7CisJaWYgKGJlaGluZCkgeworCQlpZiAodGVzdF9iaXQoV3JpdGVNb3N0bHksICZjb25mLT5taXJyb3JzW21pcnJvcl0ucmRldi0+ZmxhZ3MpKQorCQkJYXRvbWljX2RlYygmcjFfYmlvLT5iZWhpbmRfcmVtYWluaW5nKTsKKworCQkvKiBJbiBiZWhpbmQgbW9kZSwgd2UgQUNLIHRoZSBtYXN0ZXIgYmlvIG9uY2UgdGhlIEkvTyBoYXMgc2FmZWx5CisJCSAqIHJlYWNoZWQgYWxsIG5vbi13cml0ZW1vc3RseSBkaXNrcy4gU2V0dGluZyB0aGUgUmV0dXJuZWQgYml0CisJCSAqIGVuc3VyZXMgdGhhdCB0aGlzIGdldHMgZG9uZSBvbmx5IG9uY2UgLS0gd2UgZG9uJ3QgZXZlciB3YW50IHRvCisJCSAqIHJldHVybiAtRUlPIGhlcmUsIGluc3RlYWQgd2UnbGwgd2FpdCAqLworCisJCWlmIChhdG9taWNfcmVhZCgmcjFfYmlvLT5iZWhpbmRfcmVtYWluaW5nKSA+PSAoYXRvbWljX3JlYWQoJnIxX2Jpby0+cmVtYWluaW5nKS0xKSAmJgorCQkgICAgdGVzdF9iaXQoUjFCSU9fVXB0b2RhdGUsICZyMV9iaW8tPnN0YXRlKSkgeworCQkJLyogTWF5YmUgd2UgY2FuIHJldHVybiBub3cgKi8KKwkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChSMUJJT19SZXR1cm5lZCwgJnIxX2Jpby0+c3RhdGUpKSB7CisJCQkJc3RydWN0IGJpbyAqbWJpbyA9IHIxX2Jpby0+bWFzdGVyX2JpbzsKKwkJCQlQUklOVEsoS0VSTl9ERUJVRyAicmFpZDE6IGJlaGluZCBlbmQgd3JpdGUgc2VjdG9ycyAlbGx1LSVsbHVcbiIsCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG1iaW8tPmJpX3NlY3RvciwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbWJpby0+Ymlfc2VjdG9yICsKKwkJCQkgICAgICAgKG1iaW8tPmJpX3NpemUgPj4gOSkgLSAxKTsKKwkJCQliaW9fZW5kaW8obWJpbywgbWJpby0+Ymlfc2l6ZSwgMCk7CisJCQl9CisJCX0KKwl9CiAJLyoKIAkgKgogCSAqIExldCdzIHNlZSBpZiBhbGwgbWlycm9yZWQgd3JpdGUgb3BlcmF0aW9ucyBoYXZlIGZpbmlzaGVkCiAJICogYWxyZWFkeS4KIAkgKi8KIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcjFfYmlvLT5yZW1haW5pbmcpKSB7CisJCWlmICh0ZXN0X2JpdChSMUJJT19CZWhpbmRJTywgJnIxX2Jpby0+c3RhdGUpKSB7CisJCQkvKiBmcmVlIGV4dHJhIGNvcHkgb2YgdGhlIGRhdGEgcGFnZXMgKi8KKwkJCWludCBpID0gYmlvLT5iaV92Y250OworCQkJd2hpbGUgKGktLSkKKwkJCQlfX2ZyZWVfcGFnZShiaW8tPmJpX2lvX3ZlY1tpXS5idl9wYWdlKTsKKwkJfQogCQkvKiBjbGVhciB0aGUgYml0bWFwIGlmIGFsbCB3cml0ZXMgY29tcGxldGUgc3VjY2Vzc2Z1bGx5ICovCiAJCWJpdG1hcF9lbmR3cml0ZShyMV9iaW8tPm1kZGV2LT5iaXRtYXAsIHIxX2Jpby0+c2VjdG9yLAogCQkJCXIxX2Jpby0+c2VjdG9ycywKLQkJCQkhdGVzdF9iaXQoUjFCSU9fRGVncmFkZWQsICZyMV9iaW8tPnN0YXRlKSk7CisJCQkJIXRlc3RfYml0KFIxQklPX0RlZ3JhZGVkLCAmcjFfYmlvLT5zdGF0ZSksCisJCQkJYmVoaW5kKTsKIAkJbWRfd3JpdGVfZW5kKHIxX2Jpby0+bWRkZXYpOwogCQlyYWlkX2VuZF9iaW9faW8ocjFfYmlvKTsKIAl9CkBAIC0zNjAsMTMgKzM5OSwxNCBAQAogewogCWNvbnN0IHVuc2lnbmVkIGxvbmcgdGhpc19zZWN0b3IgPSByMV9iaW8tPnNlY3RvcjsKIAlpbnQgbmV3X2Rpc2sgPSBjb25mLT5sYXN0X3VzZWQsIGRpc2sgPSBuZXdfZGlzazsKKwlpbnQgd29ubHlfZGlzayA9IC0xOwogCWNvbnN0IGludCBzZWN0b3JzID0gcjFfYmlvLT5zZWN0b3JzOwogCXNlY3Rvcl90IG5ld19kaXN0YW5jZSwgY3VycmVudF9kaXN0YW5jZTsKLQltZGtfcmRldl90ICpuZXdfcmRldiwgKnJkZXY7CisJbWRrX3JkZXZfdCAqcmRldjsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAkvKgotCSAqIENoZWNrIGlmIGl0IGlmIHdlIGNhbiBiYWxhbmNlLiBXZSBjYW4gYmFsYW5jZSBvbiB0aGUgd2hvbGUKKwkgKiBDaGVjayBpZiB3ZSBjYW4gYmFsYW5jZS4gV2UgY2FuIGJhbGFuY2Ugb24gdGhlIHdob2xlCiAJICogZGV2aWNlIGlmIG5vIHJlc3luYyBpcyBnb2luZyBvbiwgb3IgYmVsb3cgdGhlIHJlc3luYyB3aW5kb3cuCiAJICogV2UgdGFrZSB0aGUgZmlyc3QgcmVhZGFibGUgZGlzayB3aGVuIGFib3ZlIHRoZSByZXN5bmMgd2luZG93LgogCSAqLwpAQCAtMzc2LDExICs0MTYsMTYgQEAKIAkJLyogQ2hvb3NlIHRoZSBmaXJzdCBvcGVyYXRpb24gZGV2aWNlLCBmb3IgY29uc2lzdGFuY3kgKi8KIAkJbmV3X2Rpc2sgPSAwOwogCi0JCXdoaWxlICgobmV3X3JkZXY9Y29uZi0+bWlycm9yc1tuZXdfZGlza10ucmRldikgPT0gTlVMTCB8fAotCQkgICAgICAgIW5ld19yZGV2LT5pbl9zeW5jKSB7Ci0JCQluZXdfZGlzaysrOwotCQkJaWYgKG5ld19kaXNrID09IGNvbmYtPnJhaWRfZGlza3MpIHsKLQkJCQluZXdfZGlzayA9IC0xOworCQlmb3IgKHJkZXYgPSBjb25mLT5taXJyb3JzW25ld19kaXNrXS5yZGV2OworCQkgICAgICFyZGV2IHx8ICFyZGV2LT5pbl9zeW5jCisJCQkgICAgIHx8IHRlc3RfYml0KFdyaXRlTW9zdGx5LCAmcmRldi0+ZmxhZ3MpOworCQkgICAgIHJkZXYgPSBjb25mLT5taXJyb3JzWysrbmV3X2Rpc2tdLnJkZXYpIHsKKworCQkJaWYgKHJkZXYgJiYgcmRldi0+aW5fc3luYykKKwkJCQl3b25seV9kaXNrID0gbmV3X2Rpc2s7CisKKwkJCWlmIChuZXdfZGlzayA9PSBjb25mLT5yYWlkX2Rpc2tzIC0gMSkgeworCQkJCW5ld19kaXNrID0gd29ubHlfZGlzazsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMzg5LDE2ICs0MzQsMjYgQEAKIAogCiAJLyogbWFrZSBzdXJlIHRoZSBkaXNrIGlzIG9wZXJhdGlvbmFsICovCi0Jd2hpbGUgKChuZXdfcmRldj1jb25mLT5taXJyb3JzW25ld19kaXNrXS5yZGV2KSA9PSBOVUxMIHx8Ci0JICAgICAgICFuZXdfcmRldi0+aW5fc3luYykgeworCWZvciAocmRldiA9IGNvbmYtPm1pcnJvcnNbbmV3X2Rpc2tdLnJkZXY7CisJICAgICAhcmRldiB8fCAhcmRldi0+aW5fc3luYyB8fAorCQkgICAgIHRlc3RfYml0KFdyaXRlTW9zdGx5LCAmcmRldi0+ZmxhZ3MpOworCSAgICAgcmRldiA9IGNvbmYtPm1pcnJvcnNbbmV3X2Rpc2tdLnJkZXYpIHsKKworCQlpZiAocmRldiAmJiByZGV2LT5pbl9zeW5jKQorCQkJd29ubHlfZGlzayA9IG5ld19kaXNrOworCiAJCWlmIChuZXdfZGlzayA8PSAwKQogCQkJbmV3X2Rpc2sgPSBjb25mLT5yYWlkX2Rpc2tzOwogCQluZXdfZGlzay0tOwogCQlpZiAobmV3X2Rpc2sgPT0gZGlzaykgewotCQkJbmV3X2Rpc2sgPSAtMTsKLQkJCWdvdG8gcmJfb3V0OworCQkJbmV3X2Rpc2sgPSB3b25seV9kaXNrOworCQkJYnJlYWs7CiAJCX0KIAl9CisKKwlpZiAobmV3X2Rpc2sgPCAwKQorCQlnb3RvIHJiX291dDsKKwogCWRpc2sgPSBuZXdfZGlzazsKIAkvKiBub3cgZGlzayA9PSBuZXdfZGlzayA9PSBzdGFydGluZyBwb2ludCBmb3Igc2VhcmNoICovCiAKQEAgLTQxOSwzNyArNDc0LDQxIEBACiAJCQlkaXNrID0gY29uZi0+cmFpZF9kaXNrczsKIAkJZGlzay0tOwogCi0JCWlmICgocmRldj1jb25mLT5taXJyb3JzW2Rpc2tdLnJkZXYpID09IE5VTEwgfHwKLQkJICAgICFyZGV2LT5pbl9zeW5jKQorCQlyZGV2ID0gY29uZi0+bWlycm9yc1tkaXNrXS5yZGV2OworCisJCWlmICghcmRldiB8fAorCQkgICAgIXJkZXYtPmluX3N5bmMgfHwKKwkJICAgIHRlc3RfYml0KFdyaXRlTW9zdGx5LCAmcmRldi0+ZmxhZ3MpKQogCQkJY29udGludWU7CiAKIAkJaWYgKCFhdG9taWNfcmVhZCgmcmRldi0+bnJfcGVuZGluZykpIHsKIAkJCW5ld19kaXNrID0gZGlzazsKLQkJCW5ld19yZGV2ID0gcmRldjsKIAkJCWJyZWFrOwogCQl9CiAJCW5ld19kaXN0YW5jZSA9IGFicyh0aGlzX3NlY3RvciAtIGNvbmYtPm1pcnJvcnNbZGlza10uaGVhZF9wb3NpdGlvbik7CiAJCWlmIChuZXdfZGlzdGFuY2UgPCBjdXJyZW50X2Rpc3RhbmNlKSB7CiAJCQljdXJyZW50X2Rpc3RhbmNlID0gbmV3X2Rpc3RhbmNlOwogCQkJbmV3X2Rpc2sgPSBkaXNrOwotCQkJbmV3X3JkZXYgPSByZGV2OwogCQl9CiAJfSB3aGlsZSAoZGlzayAhPSBjb25mLT5sYXN0X3VzZWQpOwogCi1yYl9vdXQ6CisgcmJfb3V0OgogCiAKIAlpZiAobmV3X2Rpc2sgPj0gMCkgewotCQljb25mLT5uZXh0X3NlcV9zZWN0ID0gdGhpc19zZWN0b3IgKyBzZWN0b3JzOwotCQljb25mLT5sYXN0X3VzZWQgPSBuZXdfZGlzazsKLQkJYXRvbWljX2luYygmbmV3X3JkZXYtPm5yX3BlbmRpbmcpOwotCQlpZiAoIW5ld19yZGV2LT5pbl9zeW5jKSB7CisJCXJkZXYgPSBjb25mLT5taXJyb3JzW25ld19kaXNrXS5yZGV2OworCQlpZiAoIXJkZXYpCisJCQlnb3RvIHJldHJ5OworCQlhdG9taWNfaW5jKCZyZGV2LT5ucl9wZW5kaW5nKTsKKwkJaWYgKCFyZGV2LT5pbl9zeW5jKSB7CiAJCQkvKiBjYW5ub3QgcmlzayByZXR1cm5pbmcgYSBkZXZpY2UgdGhhdCBmYWlsZWQKIAkJCSAqIGJlZm9yZSB3ZSBpbmMnZWQgbnJfcGVuZGluZwogCQkJICovCi0JCQlhdG9taWNfZGVjKCZuZXdfcmRldi0+bnJfcGVuZGluZyk7CisJCQlhdG9taWNfZGVjKCZyZGV2LT5ucl9wZW5kaW5nKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KKwkJY29uZi0+bmV4dF9zZXFfc2VjdCA9IHRoaXNfc2VjdG9yICsgc2VjdG9yczsKKwkJY29uZi0+bGFzdF91c2VkID0gbmV3X2Rpc2s7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCkBAIC01NDIsNiArNjAxLDM5IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7CiB9CiAKKy8qIGR1cGxpY2F0ZSB0aGUgZGF0YSBwYWdlcyBmb3IgYmVoaW5kIEkvTyAqLworc3RhdGljIHN0cnVjdCBwYWdlICoqYWxsb2NfYmVoaW5kX3BhZ2VzKHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0ga21hbGxvYyhiaW8tPmJpX3ZjbnQgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKiksCisJCQkJCUdGUF9OT0lPKTsKKwlpZiAodW5saWtlbHkoIXBhZ2VzKSkKKwkJZ290byBkb19zeW5jX2lvOworCisJbWVtc2V0KHBhZ2VzLCAwLCBiaW8tPmJpX3ZjbnQgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKikpOworCisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7CisJCXBhZ2VzW2ldID0gYWxsb2NfcGFnZShHRlBfTk9JTyk7CisJCWlmICh1bmxpa2VseSghcGFnZXNbaV0pKQorCQkJZ290byBkb19zeW5jX2lvOworCQltZW1jcHkoa21hcChwYWdlc1tpXSkgKyBidmVjLT5idl9vZmZzZXQsCisJCQlrbWFwKGJ2ZWMtPmJ2X3BhZ2UpICsgYnZlYy0+YnZfb2Zmc2V0LCBidmVjLT5idl9sZW4pOworCQlrdW5tYXAocGFnZXNbaV0pOworCQlrdW5tYXAoYnZlYy0+YnZfcGFnZSk7CisJfQorCisJcmV0dXJuIHBhZ2VzOworCitkb19zeW5jX2lvOgorCWlmIChwYWdlcykKKwkJZm9yIChpID0gMDsgaSA8IGJpby0+YmlfdmNudCAmJiBwYWdlc1tpXTsgaSsrKQorCQkJX19mcmVlX3BhZ2UocGFnZXNbaV0pOworCWtmcmVlKHBhZ2VzKTsKKwlQUklOVEsoIiVkQiBiZWhpbmQgYWxsb2MgZmFpbGVkLCBkb2luZyBzeW5jIEkvT1xuIiwgYmlvLT5iaV9zaXplKTsKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIGludCBtYWtlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICogYmlvKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtNTU0LDcgKzY0NiwxMiBAQAogCXN0cnVjdCBiaXRtYXAgKmJpdG1hcCA9IG1kZGV2LT5iaXRtYXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgYmlvX2xpc3QgYmw7CisJc3RydWN0IHBhZ2UgKipiZWhpbmRfcGFnZXMgPSBOVUxMOwogCisJaWYgKHVubGlrZWx5KGJpb19iYXJyaWVyKGJpbykpKSB7CisJCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwgLUVPUE5PVFNVUFApOworCQlyZXR1cm4gMDsKKwl9CiAKIAkvKgogCSAqIFJlZ2lzdGVyIHRoZSBuZXcgcmVxdWVzdCBhbmQgd2FpdCBpZiB0aGUgcmVjb25zdHJ1Y3Rpb24KQEAgLTU4OSw4ICs2ODYsNiBAQAogCXIxX2Jpby0+bWRkZXYgPSBtZGRldjsKIAlyMV9iaW8tPnNlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwogCi0JcjFfYmlvLT5zdGF0ZSA9IDA7Ci0KIAlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCkgewogCQkvKgogCQkgKiByZWFkIGJhbGFuY2luZyBsb2dpYzoKQEAgLTY1MSwxMyArNzQ2LDIyIEBACiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCisJQlVHX09OKHRhcmdldHMgPT0gMCk7IC8qIHdlIG5ldmVyIGZhaWwgdGhlIGxhc3QgZGV2aWNlICovCisKIAlpZiAodGFyZ2V0cyA8IGNvbmYtPnJhaWRfZGlza3MpIHsKIAkJLyogYXJyYXkgaXMgZGVncmFkZWQsIHdlIHdpbGwgbm90IGNsZWFyIHRoZSBiaXRtYXAKIAkJICogb24gSS9PIGNvbXBsZXRpb24gKHNlZSByYWlkMV9lbmRfd3JpdGVfcmVxdWVzdCkgKi8KIAkJc2V0X2JpdChSMUJJT19EZWdyYWRlZCwgJnIxX2Jpby0+c3RhdGUpOwogCX0KIAorCS8qIGRvIGJlaGluZCBJL08gPyAqLworCWlmIChiaXRtYXAgJiYKKwkgICAgYXRvbWljX3JlYWQoJmJpdG1hcC0+YmVoaW5kX3dyaXRlcykgPCBiaXRtYXAtPm1heF93cml0ZV9iZWhpbmQgJiYKKwkgICAgKGJlaGluZF9wYWdlcyA9IGFsbG9jX2JlaGluZF9wYWdlcyhiaW8pKSAhPSBOVUxMKQorCQlzZXRfYml0KFIxQklPX0JlaGluZElPLCAmcjFfYmlvLT5zdGF0ZSk7CisKIAlhdG9taWNfc2V0KCZyMV9iaW8tPnJlbWFpbmluZywgMCk7CisJYXRvbWljX3NldCgmcjFfYmlvLT5iZWhpbmRfcmVtYWluaW5nLCAwKTsKIAogCWJpb19saXN0X2luaXQoJmJsKTsKIAlmb3IgKGkgPSAwOyBpIDwgZGlza3M7IGkrKykgewpAQCAtNjc0LDEyICs3NzgsMzEgQEAKIAkJbWJpby0+YmlfcncgPSBXUklURTsKIAkJbWJpby0+YmlfcHJpdmF0ZSA9IHIxX2JpbzsKIAorCQlpZiAoYmVoaW5kX3BhZ2VzKSB7CisJCQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwkJCWludCBqOworCisJCQkvKiBZZXMsIEkgcmVhbGx5IHdhbnQgdGhlICdfXycgdmVyc2lvbiBzbyB0aGF0CisJCQkgKiB3ZSBjbGVhciBhbnkgdW51c2VkIHBvaW50ZXIgaW4gdGhlIGlvX3ZlYywgcmF0aGVyCisJCQkgKiB0aGFuIGxlYXZlIHRoZW0gdW5jaGFuZ2VkLiAgVGhpcyBpcyBpbXBvcnRhbnQKKwkJCSAqIGJlY2F1c2Ugd2hlbiB3ZSBjb21lIHRvIGZyZWUgdGhlIHBhZ2VzLCB3ZSB3b24ndAorCQkJICoga25vdyB0aGUgb3JpZ2luaWFsIGJpX2lkeCwgc28gd2UganVzdCBmcmVlCisJCQkgKiB0aGVtIGFsbAorCQkJICovCisJCQlfX2Jpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIG1iaW8sIGosIDApCisJCQkJYnZlYy0+YnZfcGFnZSA9IGJlaGluZF9wYWdlc1tqXTsKKwkJCWlmICh0ZXN0X2JpdChXcml0ZU1vc3RseSwgJmNvbmYtPm1pcnJvcnNbaV0ucmRldi0+ZmxhZ3MpKQorCQkJCWF0b21pY19pbmMoJnIxX2Jpby0+YmVoaW5kX3JlbWFpbmluZyk7CisJCX0KKwogCQlhdG9taWNfaW5jKCZyMV9iaW8tPnJlbWFpbmluZyk7CiAKIAkJYmlvX2xpc3RfYWRkKCZibCwgbWJpbyk7CiAJfQorCWtmcmVlKGJlaGluZF9wYWdlcyk7IC8qIHRoZSBiZWhpbmQgcGFnZXMgYXJlIGF0dGFjaGVkIHRvIHRoZSBiaW9zIG5vdyAqLwogCi0JYml0bWFwX3N0YXJ0d3JpdGUoYml0bWFwLCBiaW8tPmJpX3NlY3RvciwgcjFfYmlvLT5zZWN0b3JzKTsKKwliaXRtYXBfc3RhcnR3cml0ZShiaXRtYXAsIGJpby0+Ymlfc2VjdG9yLCByMV9iaW8tPnNlY3RvcnMsCisJCQkJdGVzdF9iaXQoUjFCSU9fQmVoaW5kSU8sICZyMV9iaW8tPnN0YXRlKSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7CiAJYmlvX2xpc3RfbWVyZ2UoJmNvbmYtPnBlbmRpbmdfYmlvX2xpc3QsICZibCk7CiAJYmlvX2xpc3RfaW5pdCgmYmwpOwpAQCAtMTEwNSw2ICsxMjI4LDcgQEAKIAlzZWN0b3JfdCBtYXhfc2VjdG9yLCBucl9zZWN0b3JzOwogCWludCBkaXNrOwogCWludCBpOworCWludCB3b25seTsKIAlpbnQgd3JpdGVfdGFyZ2V0cyA9IDA7CiAJaW50IHN5bmNfYmxvY2tzOwogCWludCBzdGlsbF9kZWdyYWRlZCA9IDA7CkBAIC0xMTYwLDE0ICsxMjg0LDIxIEBACiAJICovCiAJZGlzayA9IGNvbmYtPmxhc3RfdXNlZDsKIAkvKiBtYWtlIHN1cmUgZGlzayBpcyBvcGVyYXRpb25hbCAqLwotCisJd29ubHkgPSBkaXNrOwogCXdoaWxlIChjb25mLT5taXJyb3JzW2Rpc2tdLnJkZXYgPT0gTlVMTCB8fAotCSAgICAgICAhY29uZi0+bWlycm9yc1tkaXNrXS5yZGV2LT5pbl9zeW5jKSB7CisJICAgICAgICFjb25mLT5taXJyb3JzW2Rpc2tdLnJkZXYtPmluX3N5bmMgfHwKKwkgICAgICAgdGVzdF9iaXQoV3JpdGVNb3N0bHksICZjb25mLT5taXJyb3JzW2Rpc2tdLnJkZXYtPmZsYWdzKQorCQkpIHsKKwkJaWYgKGNvbmYtPm1pcnJvcnNbZGlza10ucmRldiAgJiYKKwkJICAgIGNvbmYtPm1pcnJvcnNbZGlza10ucmRldi0+aW5fc3luYykKKwkJCXdvbmx5ID0gZGlzazsKIAkJaWYgKGRpc2sgPD0gMCkKIAkJCWRpc2sgPSBjb25mLT5yYWlkX2Rpc2tzOwogCQlkaXNrLS07Ci0JCWlmIChkaXNrID09IGNvbmYtPmxhc3RfdXNlZCkKKwkJaWYgKGRpc2sgPT0gY29uZi0+bGFzdF91c2VkKSB7CisJCQlkaXNrID0gd29ubHk7CiAJCQlicmVhazsKKwkJfQogCX0KIAljb25mLT5sYXN0X3VzZWQgPSBkaXNrOwogCWF0b21pY19pbmMoJmNvbmYtPm1pcnJvcnNbZGlza10ucmRldi0+bnJfcGVuZGluZyk7CkBAIC0xNDM5LDYgKzE1NzAsMTcgQEAKIHN0YXRpYyBpbnQgc3RvcChtZGRldl90ICptZGRldikKIHsKIAljb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKKwlzdHJ1Y3QgYml0bWFwICpiaXRtYXAgPSBtZGRldi0+Yml0bWFwOworCWludCBiZWhpbmRfd2FpdCA9IDA7CisKKwkvKiB3YWl0IGZvciBiZWhpbmQgd3JpdGVzIHRvIGNvbXBsZXRlICovCisJd2hpbGUgKGJpdG1hcCAmJiBhdG9taWNfcmVhZCgmYml0bWFwLT5iZWhpbmRfd3JpdGVzKSA+IDApIHsKKwkJYmVoaW5kX3dhaXQrKzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDE6IGJlaGluZCB3cml0ZXMgaW4gcHJvZ3Jlc3Mgb24gZGV2aWNlICVzLCB3YWl0aW5nIHRvIHN0b3AgKCVkKVxuIiwgbWRuYW1lKG1kZGV2KSwgYmVoaW5kX3dhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFopOyAvKiB3YWl0IGEgc2Vjb25kICovCisJCS8qIG5lZWQgdG8ga2ljayBzb21ldGhpbmcgaGVyZSB0byBtYWtlIHN1cmUgSS9PIGdvZXM/ICovCisJfQogCiAJbWRfdW5yZWdpc3Rlcl90aHJlYWQobWRkZXYtPnRocmVhZCk7CiAJbWRkZXYtPnRocmVhZCA9IE5VTEw7CkBAIC0xNTYxLDYgKzE3MDMsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcmFpZDFfcXVpZXNjZShtZGRldl90ICptZGRldiwgaW50IHN0YXRlKQoreworCWNvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOworCisJc3dpdGNoKHN0YXRlKSB7CisJY2FzZSAxOgorCQlzcGluX2xvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7CisJCWNvbmYtPmJhcnJpZXIrKzsKKwkJd2FpdF9ldmVudF9sb2NrX2lycShjb25mLT53YWl0X2lkbGUsICFjb25mLT5ucl9wZW5kaW5nLAorCQkJCSAgICBjb25mLT5yZXN5bmNfbG9jaywgcmFpZDFfdW5wbHVnKG1kZGV2LT5xdWV1ZSkpOworCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPnJlc3luY19sb2NrKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlzcGluX2xvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7CisJCWNvbmYtPmJhcnJpZXItLTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7CisJCXdha2VfdXAoJmNvbmYtPndhaXRfcmVzdW1lKTsKKwkJd2FrZV91cCgmY29uZi0+d2FpdF9pZGxlKTsKKwkJYnJlYWs7CisJfQorCWlmIChtZGRldi0+dGhyZWFkKSB7CisJCWlmIChtZGRldi0+Yml0bWFwKQorCQkJbWRkZXYtPnRocmVhZC0+dGltZW91dCA9IG1kZGV2LT5iaXRtYXAtPmRhZW1vbl9zbGVlcCAqIEhaOworCQllbHNlCisJCQltZGRldi0+dGhyZWFkLT50aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisJCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7CisJfQorfQorCiAKIHN0YXRpYyBtZGtfcGVyc29uYWxpdHlfdCByYWlkMV9wZXJzb25hbGl0eSA9CiB7CkBAIC0xNTc3LDYgKzE3NDgsNyBAQAogCS5zeW5jX3JlcXVlc3QJPSBzeW5jX3JlcXVlc3QsCiAJLnJlc2l6ZQkJPSByYWlkMV9yZXNpemUsCiAJLnJlc2hhcGUJPSByYWlkMV9yZXNoYXBlLAorCS5xdWllc2NlCT0gcmFpZDFfcXVpZXNjZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHJhaWRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMTAuYyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKaW5kZXggNjJlYmIxYi4uNWJkMWU5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMTAuYworKysgYi9kcml2ZXJzL21kL3JhaWQxMC5jCkBAIC01MzgsNyArNTM4LDggQEAKIAl9CiAKIAotCWN1cnJlbnRfZGlzdGFuY2UgPSBhYnModGhpc19zZWN0b3IgLSBjb25mLT5taXJyb3JzW2Rpc2tdLmhlYWRfcG9zaXRpb24pOworCWN1cnJlbnRfZGlzdGFuY2UgPSBhYnMocjEwX2Jpby0+ZGV2c1tzbG90XS5hZGRyIC0KKwkJCSAgICAgICBjb25mLT5taXJyb3JzW2Rpc2tdLmhlYWRfcG9zaXRpb24pOwogCiAJLyogRmluZCB0aGUgZGlzayB3aG9zZSBoZWFkIGlzIGNsb3Nlc3QgKi8KIApAQCAtNjY4LDYgKzY2OSwxMSBAQAogCWludCBpOwogCWludCBjaHVua19zZWN0cyA9IGNvbmYtPmNodW5rX21hc2sgKyAxOwogCisJaWYgKHVubGlrZWx5KGJpb19iYXJyaWVyKGJpbykpKSB7CisJCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwgLUVPUE5PVFNVUFApOworCQlyZXR1cm4gMDsKKwl9CisKIAkvKiBJZiB0aGlzIHJlcXVlc3QgY3Jvc3NlcyBhIGNodW5rIGJvdW5kYXJ5LCB3ZSBuZWVkIHRvCiAJICogc3BsaXQgaXQuICBUaGlzIHdpbGwgb25seSBoYXBwZW4gZm9yIDEgUEFHRSAob3IgbGVzcykgcmVxdWVzdHMuCiAJICovCkBAIC05MDAsNiArOTA2LDI3IEBACiAJY29uZi0+cjEwYnVmX3Bvb2wgPSBOVUxMOwogfQogCisvKiBjaGVjayBpZiB0aGVyZSBhcmUgZW5vdWdoIGRyaXZlcyBmb3IKKyAqIGV2ZXJ5IGJsb2NrIHRvIGFwcGVhciBvbiBhdGxlYXN0IG9uZQorICovCitzdGF0aWMgaW50IGVub3VnaChjb25mX3QgKmNvbmYpCit7CisJaW50IGZpcnN0ID0gMDsKKworCWRvIHsKKwkJaW50IG4gPSBjb25mLT5jb3BpZXM7CisJCWludCBjbnQgPSAwOworCQl3aGlsZSAobi0tKSB7CisJCQlpZiAoY29uZi0+bWlycm9yc1tmaXJzdF0ucmRldikKKwkJCQljbnQrKzsKKwkJCWZpcnN0ID0gKGZpcnN0KzEpICUgY29uZi0+cmFpZF9kaXNrczsKKwkJfQorCQlpZiAoY250ID09IDApCisJCQlyZXR1cm4gMDsKKwl9IHdoaWxlIChmaXJzdCAhPSAwKTsKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIGludCByYWlkMTBfc3BhcmVfYWN0aXZlKG1kZGV2X3QgKm1kZGV2KQogewogCWludCBpOwpAQCAtOTM4LDYgKzk2NSw4IEBACiAJCSAqIHZlcnkgZGlmZmVyZW50IGZyb20gcmVzeW5jCiAJCSAqLwogCQlyZXR1cm4gMDsKKwlpZiAoIWVub3VnaChjb25mKSkKKwkJcmV0dXJuIDA7CiAKIAlmb3IgKG1pcnJvcj0wOyBtaXJyb3IgPCBtZGRldi0+cmFpZF9kaXNrczsgbWlycm9yKyspCiAJCWlmICggIShwPWNvbmYtPm1pcnJvcnMrbWlycm9yKS0+cmRldikgewpAQCAtMTQ0NSw3ICsxNDc0LDEzIEBACiAJCQkJCX0KIAkJCQl9CiAJCQkJaWYgKGogPT0gY29uZi0+Y29waWVzKSB7Ci0JCQkJCUJVRygpOworCQkJCQkvKiBDYW5ub3QgcmVjb3Zlciwgc28gYWJvcnQgdGhlIHJlY292ZXJ5ICovCisJCQkJCXB1dF9idWYocjEwX2Jpbyk7CisJCQkJCXIxMF9iaW8gPSByYjI7CisJCQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChNRF9SRUNPVkVSWV9FUlIsICZtZGRldi0+cmVjb3ZlcnkpKQorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDEwOiAlczogaW5zdWZmaWNpZW50IHdvcmtpbmcgZGV2aWNlcyBmb3IgcmVjb3ZlcnkuXG4iLAorCQkJCQkJICAgICAgIG1kbmFtZShtZGRldikpOworCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CiAJCWlmIChiaW9saXN0ID09IE5VTEwpIHsKQEAgLTE2NzgsOSArMTcxMywxMCBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbmYtPndhaXRfaWRsZSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY29uZi0+d2FpdF9yZXN1bWUpOwogCi0JaWYgKCFjb25mLT53b3JraW5nX2Rpc2tzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicmFpZDEwOiBubyBvcGVyYXRpb25hbCBtaXJyb3JzIGZvciAlc1xuIiwKLQkJCW1kbmFtZShtZGRldikpOworCS8qIG5lZWQgdG8gY2hlY2sgdGhhdCBldmVyeSBibG9jayBoYXMgYXQgbGVhc3Qgb25lIHdvcmtpbmcgbWlycm9yICovCisJaWYgKCFlbm91Z2goY29uZikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYWlkMTA6IG5vdCBlbm91Z2ggb3BlcmF0aW9uYWwgbWlycm9ycyBmb3IgJXNcbiIsCisJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKIAkJZ290byBvdXRfZnJlZV9jb25mOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS5jIGIvZHJpdmVycy9tZC9yYWlkNS5jCmluZGV4IDQzZjIzMWEuLjQ2ODNjYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LmMKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9yYWlkL2JpdG1hcC5oPgorCiAvKgogICogU3RyaXBlIGNhY2hlCiAgKi8KQEAgLTc5LDggKzgxLDEzIEBACiAJCWlmICh0ZXN0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKSkgewogCQkJaWYgKHRlc3RfYml0KFNUUklQRV9ERUxBWUVELCAmc2gtPnN0YXRlKSkKIAkJCQlsaXN0X2FkZF90YWlsKCZzaC0+bHJ1LCAmY29uZi0+ZGVsYXllZF9saXN0KTsKLQkJCWVsc2UKKwkJCWVsc2UgaWYgKHRlc3RfYml0KFNUUklQRV9CSVRfREVMQVksICZzaC0+c3RhdGUpICYmCisJCQkJIGNvbmYtPnNlcV93cml0ZSA9PSBzaC0+Ym1fc2VxKQorCQkJCWxpc3RfYWRkX3RhaWwoJnNoLT5scnUsICZjb25mLT5iaXRtYXBfbGlzdCk7CisJCQllbHNlIHsKKwkJCQljbGVhcl9iaXQoU1RSSVBFX0JJVF9ERUxBWSwgJnNoLT5zdGF0ZSk7CiAJCQkJbGlzdF9hZGRfdGFpbCgmc2gtPmxydSwgJmNvbmYtPmhhbmRsZV9saXN0KTsKKwkJCX0KIAkJCW1kX3dha2V1cF90aHJlYWQoY29uZi0+bWRkZXYtPnRocmVhZCk7CiAJCX0gZWxzZSB7CiAJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNUUklQRV9QUkVSRUFEX0FDVElWRSwgJnNoLT5zdGF0ZSkpIHsKQEAgLTI0NCw2ICsyNTEsOSBAQAogCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAogCWRvIHsKKwkJd2FpdF9ldmVudF9sb2NrX2lycShjb25mLT53YWl0X2Zvcl9zdHJpcGUsCisJCQkJICAgIGNvbmYtPnF1aWVzY2UgPT0gMCwKKwkJCQkgICAgY29uZi0+ZGV2aWNlX2xvY2ssIC8qIG5vdGhpbmcgKi8pOwogCQlzaCA9IF9fZmluZF9zdHJpcGUoY29uZiwgc2VjdG9yKTsKIAkJaWYgKCFzaCkgewogCQkJaWYgKCFjb25mLT5pbmFjdGl2ZV9ibG9ja2VkKQpAQCAtODAzLDYgKzgxMyw3IEBACiB7CiAJc3RydWN0IGJpbyAqKmJpcDsKIAlyYWlkNV9jb25mX3QgKmNvbmYgPSBzaC0+cmFpZF9jb25mOworCWludCBmaXJzdHdyaXRlPTA7CiAKIAlQUklOVEsoImFkZGluZyBiaCBiIyVsbHUgdG8gc3RyaXBlIHMjJWxsdVxuIiwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaS0+Ymlfc2VjdG9yLApAQCAtODExLDkgKzgyMiwxMSBAQAogCiAJc3Bpbl9sb2NrKCZzaC0+bG9jayk7CiAJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCWlmIChmb3J3cml0ZSkKKwlpZiAoZm9yd3JpdGUpIHsKIAkJYmlwID0gJnNoLT5kZXZbZGRfaWR4XS50b3dyaXRlOwotCWVsc2UKKwkJaWYgKCpiaXAgPT0gTlVMTCAmJiBzaC0+ZGV2W2RkX2lkeF0ud3JpdHRlbiA9PSBOVUxMKQorCQkJZmlyc3R3cml0ZSA9IDE7CisJfSBlbHNlCiAJCWJpcCA9ICZzaC0+ZGV2W2RkX2lkeF0udG9yZWFkOwogCXdoaWxlICgqYmlwICYmICgqYmlwKS0+Ymlfc2VjdG9yIDwgYmktPmJpX3NlY3RvcikgewogCQlpZiAoKCpiaXApLT5iaV9zZWN0b3IgKyAoKCpiaXApLT5iaV9zaXplID4+IDkpID4gYmktPmJpX3NlY3RvcikKQEAgLTgzNiw2ICs4NDksMTMgQEAKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaS0+Ymlfc2VjdG9yLAogCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGRkX2lkeCk7CiAKKwlpZiAoY29uZi0+bWRkZXYtPmJpdG1hcCAmJiBmaXJzdHdyaXRlKSB7CisJCXNoLT5ibV9zZXEgPSBjb25mLT5zZXFfd3JpdGU7CisJCWJpdG1hcF9zdGFydHdyaXRlKGNvbmYtPm1kZGV2LT5iaXRtYXAsIHNoLT5zZWN0b3IsCisJCQkJICBTVFJJUEVfU0VDVE9SUywgMCk7CisJCXNldF9iaXQoU1RSSVBFX0JJVF9ERUxBWSwgJnNoLT5zdGF0ZSk7CisJfQorCiAJaWYgKGZvcndyaXRlKSB7CiAJCS8qIGNoZWNrIGlmIHBhZ2UgaXMgY292ZXJlZCAqLwogCQlzZWN0b3JfdCBzZWN0b3IgPSBzaC0+ZGV2W2RkX2lkeF0uc2VjdG9yOwpAQCAtOTU4LDEyICs5NzgsMTMgQEAKIAkgKiBuZWVkIHRvIGJlIGZhaWxlZAogCSAqLwogCWlmIChmYWlsZWQgPiAxICYmIHRvX3JlYWQrdG9fd3JpdGUrd3JpdHRlbikgewotCQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAJCWZvciAoaT1kaXNrczsgaS0tOyApIHsKKwkJCWludCBiaXRtYXBfZW5kID0gMDsKKwkJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAkJCS8qIGZhaWwgYWxsIHdyaXRlcyBmaXJzdCAqLwogCQkJYmkgPSBzaC0+ZGV2W2ldLnRvd3JpdGU7CiAJCQlzaC0+ZGV2W2ldLnRvd3JpdGUgPSBOVUxMOwotCQkJaWYgKGJpKSB0b193cml0ZS0tOworCQkJaWYgKGJpKSB7IHRvX3dyaXRlLS07IGJpdG1hcF9lbmQgPSAxOyB9CiAKIAkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUjVfT3ZlcmxhcCwgJnNoLT5kZXZbaV0uZmxhZ3MpKQogCQkJCXdha2VfdXAoJmNvbmYtPndhaXRfZm9yX292ZXJsYXApOwpAQCAtOTgxLDYgKzEwMDIsNyBAQAogCQkJLyogYW5kIGZhaWwgYWxsICd3cml0dGVuJyAqLwogCQkJYmkgPSBzaC0+ZGV2W2ldLndyaXR0ZW47CiAJCQlzaC0+ZGV2W2ldLndyaXR0ZW4gPSBOVUxMOworCQkJaWYgKGJpKSBiaXRtYXBfZW5kID0gMTsKIAkJCXdoaWxlIChiaSAmJiBiaS0+Ymlfc2VjdG9yIDwgc2gtPmRldltpXS5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykgewogCQkJCXN0cnVjdCBiaW8gKmJpMiA9IHI1X25leHRfYmlvKGJpLCBzaC0+ZGV2W2ldLnNlY3Rvcik7CiAJCQkJY2xlYXJfYml0KEJJT19VUFRPREFURSwgJmJpLT5iaV9mbGFncyk7CkBAIC0xMDA5LDggKzEwMzEsMTEgQEAKIAkJCQkJYmkgPSBuZXh0Ymk7CiAJCQkJfQogCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CisJCQlpZiAoYml0bWFwX2VuZCkKKwkJCQliaXRtYXBfZW5kd3JpdGUoY29uZi0+bWRkZXYtPmJpdG1hcCwgc2gtPnNlY3RvciwKKwkJCQkJCVNUUklQRV9TRUNUT1JTLCAwLCAwKTsKIAkJfQotCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAl9CiAJaWYgKGZhaWxlZCA+IDEgJiYgc3luY2luZykgewogCQltZF9kb25lX3N5bmMoY29uZi0+bWRkZXYsIFNUUklQRV9TRUNUT1JTLDApOwpAQCAtMTAzOCw2ICsxMDYzLDcgQEAKIAkJCSB0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpICkgewogCQkJLyogV2UgY2FuIHJldHVybiBhbnkgd3JpdGUgcmVxdWVzdHMgKi8KIAkJCSAgICBzdHJ1Y3QgYmlvICp3YmksICp3YmkyOworCQkJICAgIGludCBiaXRtYXBfZW5kID0gMDsKIAkJCSAgICBQUklOVEsoIlJldHVybiB3cml0ZSBmb3IgZGlzYyAlZFxuIiwgaSk7CiAJCQkgICAgc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwogCQkJICAgIHdiaSA9IGRldi0+d3JpdHRlbjsKQEAgLTEwNTEsNyArMTA3NywxMyBAQAogCQkJCSAgICB9CiAJCQkJICAgIHdiaSA9IHdiaTI7CiAJCQkgICAgfQorCQkJICAgIGlmIChkZXYtPnRvd3JpdGUgPT0gTlVMTCkKKwkJCQkgICAgYml0bWFwX2VuZCA9IDE7CiAJCQkgICAgc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CisJCQkgICAgaWYgKGJpdG1hcF9lbmQpCisJCQkJICAgIGJpdG1hcF9lbmR3cml0ZShjb25mLT5tZGRldi0+Yml0bWFwLCBzaC0+c2VjdG9yLAorCQkJCQkJICAgIFNUUklQRV9TRUNUT1JTLAorCQkJCQkJICAgICF0ZXN0X2JpdChTVFJJUEVfREVHUkFERUQsICZzaC0+c3RhdGUpLCAwKTsKIAkJICAgIH0KIAkJfQogCX0KQEAgLTExNzUsNyArMTIwNyw4IEBACiAJCQkJfQogCQkJfQogCQkvKiBub3cgaWYgbm90aGluZyBpcyBsb2NrZWQsIGFuZCBpZiB3ZSBoYXZlIGVub3VnaCBkYXRhLCB3ZSBjYW4gc3RhcnQgYSB3cml0ZSByZXF1ZXN0ICovCi0JCWlmIChsb2NrZWQgPT0gMCAmJiAocmN3ID09IDAgfHxybXcgPT0gMCkpIHsKKwkJaWYgKGxvY2tlZCA9PSAwICYmIChyY3cgPT0gMCB8fHJtdyA9PSAwKSAmJgorCQkgICAgIXRlc3RfYml0KFNUUklQRV9CSVRfREVMQVksICZzaC0+c3RhdGUpKSB7CiAJCQlQUklOVEsoIkNvbXB1dGluZyBwYXJpdHkuLi5cbiIpOwogCQkJY29tcHV0ZV9wYXJpdHkoc2gsIHJjdz09MCA/IFJFQ09OU1RSVUNUX1dSSVRFIDogUkVBRF9NT0RJRllfV1JJVEUpOwogCQkJLyogbm93IGV2ZXJ5IGxvY2tlZCBidWZmZXIgaXMgcmVhZHkgdG8gYmUgd3JpdHRlbiAqLwpAQCAtMTIzMSw2ICsxMjY0LDcgQEAKIAkJCWRldiA9ICZzaC0+ZGV2W2ZhaWxlZF9udW1dOwogCQkJc2V0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKTsKIAkJCXNldF9iaXQoUjVfV2FudHdyaXRlLCAmZGV2LT5mbGFncyk7CisJCQljbGVhcl9iaXQoU1RSSVBFX0RFR1JBREVELCAmc2gtPnN0YXRlKTsKIAkJCWxvY2tlZCsrOwogCQkJc2V0X2JpdChTVFJJUEVfSU5TWU5DLCAmc2gtPnN0YXRlKTsKIAkJCXNldF9iaXQoUjVfU3luY2lvLCAmZGV2LT5mbGFncyk7CkBAIC0xMjk4LDYgKzEzMzIsOCBAQAogCQkJYmktPmJpX25leHQgPSBOVUxMOwogCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmkpOwogCQl9IGVsc2UgeworCQkJaWYgKHJ3ID09IDEpCisJCQkJc2V0X2JpdChTVFJJUEVfREVHUkFERUQsICZzaC0+c3RhdGUpOwogCQkJUFJJTlRLKCJza2lwIG9wICVsZCBvbiBkaXNjICVkIGZvciBzZWN0b3IgJWxsdVxuIiwKIAkJCQliaS0+YmlfcncsIGksICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvcik7CiAJCQljbGVhcl9iaXQoUjVfTE9DS0VELCAmc2gtPmRldltpXS5mbGFncyk7CkBAIC0xMzIyLDYgKzEzNTgsMjAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0ZV9iaXRfZGVsYXkocmFpZDVfY29uZl90ICpjb25mKQoreworCS8qIGRldmljZV9sb2NrIGlzIGhlbGQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJbGlzdF9hZGQoJmhlYWQsICZjb25mLT5iaXRtYXBfbGlzdCk7CisJbGlzdF9kZWxfaW5pdCgmY29uZi0+Yml0bWFwX2xpc3QpOworCXdoaWxlICghbGlzdF9lbXB0eSgmaGVhZCkpIHsKKwkJc3RydWN0IHN0cmlwZV9oZWFkICpzaCA9IGxpc3RfZW50cnkoaGVhZC5uZXh0LCBzdHJ1Y3Qgc3RyaXBlX2hlYWQsIGxydSk7CisJCWxpc3RfZGVsX2luaXQoJnNoLT5scnUpOworCQlhdG9taWNfaW5jKCZzaC0+Y291bnQpOworCQlfX3JlbGVhc2Vfc3RyaXBlKGNvbmYsIHNoKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHVucGx1Z19zbGF2ZXMobWRkZXZfdCAqbWRkZXYpCiB7CiAJcmFpZDVfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7CkBAIC0xMzU0LDggKzE0MDQsMTAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjb25mLT5kZXZpY2VfbG9jaywgZmxhZ3MpOwogCi0JaWYgKGJsa19yZW1vdmVfcGx1ZyhxKSkKKwlpZiAoYmxrX3JlbW92ZV9wbHVnKHEpKSB7CisJCWNvbmYtPnNlcV9mbHVzaCsrOwogCQlyYWlkNV9hY3RpdmF0ZV9kZWxheWVkKGNvbmYpOworCX0KIAltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKQEAgLTE0MTEsNiArMTQ2MywxMSBAQAogCXNlY3Rvcl90IGxvZ2ljYWxfc2VjdG9yLCBsYXN0X3NlY3RvcjsKIAlzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoOwogCisJaWYgKHVubGlrZWx5KGJpb19iYXJyaWVyKGJpKSkpIHsKKwkJYmlvX2VuZGlvKGJpLCBiaS0+Ymlfc2l6ZSwgLUVPUE5PVFNVUFApOworCQlyZXR1cm4gMDsKKwl9CisKIAltZF93cml0ZV9zdGFydChtZGRldiwgYmkpOwogCiAJaWYgKGJpb19kYXRhX2RpcihiaSk9PVdSSVRFKSB7CkBAIC0xNDg4LDEwICsxNTQ1LDIwIEBACiAJc2VjdG9yX3QgZmlyc3Rfc2VjdG9yOwogCWludCByYWlkX2Rpc2tzID0gY29uZi0+cmFpZF9kaXNrczsKIAlpbnQgZGF0YV9kaXNrcyA9IHJhaWRfZGlza3MtMTsKKwlzZWN0b3JfdCBtYXhfc2VjdG9yID0gbWRkZXYtPnNpemUgPDwgMTsKKwlpbnQgc3luY19ibG9ja3M7CiAKLQlpZiAoc2VjdG9yX25yID49IG1kZGV2LT5zaXplIDw8MSkgeworCWlmIChzZWN0b3JfbnIgPj0gbWF4X3NlY3RvcikgewogCQkvKiBqdXN0IGJlaW5nIHRvbGQgdG8gZmluaXNoIHVwIC4uIG5vdGhpbmcgbXVjaCB0byBkbyAqLwogCQl1bnBsdWdfc2xhdmVzKG1kZGV2KTsKKworCQlpZiAobWRkZXYtPmN1cnJfcmVzeW5jIDwgbWF4X3NlY3RvcikgLyogYWJvcnRlZCAqLworCQkJYml0bWFwX2VuZF9zeW5jKG1kZGV2LT5iaXRtYXAsIG1kZGV2LT5jdXJyX3Jlc3luYywKKwkJCQkJJnN5bmNfYmxvY2tzLCAxKTsKKwkJZWxzZSAvKiBjb21wZWx0ZWQgc3luYyAqLworCQkJY29uZi0+ZnVsbHN5bmMgPSAwOworCQliaXRtYXBfY2xvc2Vfc3luYyhtZGRldi0+Yml0bWFwKTsKKwogCQlyZXR1cm4gMDsKIAl9CiAJLyogaWYgdGhlcmUgaXMgMSBvciBtb3JlIGZhaWxlZCBkcml2ZXMgYW5kIHdlIGFyZSB0cnlpbmcKQEAgLTE1MDMsNiArMTU3MCwxMyBAQAogCQkqc2tpcHBlZCA9IDE7CiAJCXJldHVybiBydjsKIAl9CisJaWYgKCFiaXRtYXBfc3RhcnRfc3luYyhtZGRldi0+Yml0bWFwLCBzZWN0b3JfbnIsICZzeW5jX2Jsb2NrcywgMSkgJiYKKwkgICAgIWNvbmYtPmZ1bGxzeW5jICYmIHN5bmNfYmxvY2tzID49IFNUUklQRV9TRUNUT1JTKSB7CisJCS8qIHdlIGNhbiBza2lwIHRoaXMgYmxvY2ssIGFuZCBwcm9iYWJseSBtb3JlICovCisJCXN5bmNfYmxvY2tzIC89IFNUUklQRV9TRUNUT1JTOworCQkqc2tpcHBlZCA9IDE7CisJCXJldHVybiBzeW5jX2Jsb2NrcyAqIFNUUklQRV9TRUNUT1JTOyAvKiBrZWVwIHRoaW5ncyByb3VuZGVkIHRvIHdob2xlIHN0cmlwZXMgKi8KKwl9CiAKIAl4ID0gc2VjdG9yX25yOwogCWNodW5rX29mZnNldCA9IHNlY3Rvcl9kaXYoeCwgc2VjdG9yc19wZXJfY2h1bmspOwpAQCAtMTUyMCw2ICsxNTk0LDcgQEAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQlzY2hlZHVsZV90aW1lb3V0KDEpOwogCX0KKwliaXRtYXBfc3RhcnRfc3luYyhtZGRldi0+Yml0bWFwLCBzZWN0b3JfbnIsICZzeW5jX2Jsb2NrcywgMCk7CiAJc3Bpbl9sb2NrKCZzaC0+bG9jayk7CQogCXNldF9iaXQoU1RSSVBFX1NZTkNJTkcsICZzaC0+c3RhdGUpOwogCWNsZWFyX2JpdChTVFJJUEVfSU5TWU5DLCAmc2gtPnN0YXRlKTsKQEAgLTE1NTMsNiArMTYyOCwxMyBAQAogCXdoaWxlICgxKSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKmZpcnN0OwogCisJCWlmIChjb25mLT5zZXFfZmx1c2ggLSBjb25mLT5zZXFfd3JpdGUgPiAwKSB7CisJCQlpbnQgc2VxID0gY29uZi0+c2VxX2ZsdXNoOworCQkJYml0bWFwX3VucGx1ZyhtZGRldi0+Yml0bWFwKTsKKwkJCWNvbmYtPnNlcV93cml0ZSA9IHNlcTsKKwkJCWFjdGl2YXRlX2JpdF9kZWxheShjb25mKTsKKwkJfQorCiAJCWlmIChsaXN0X2VtcHR5KCZjb25mLT5oYW5kbGVfbGlzdCkgJiYKIAkJICAgIGF0b21pY19yZWFkKCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzKSA8IElPX1RIUkVTSE9MRCAmJgogCQkgICAgIWJsa19xdWV1ZV9wbHVnZ2VkKG1kZGV2LT5xdWV1ZSkgJiYKQEAgLTE1ODYsNyArMTY2OCw3IEBACiAJUFJJTlRLKCItLS0gcmFpZDVkIGluYWN0aXZlXG4iKTsKIH0KIAotc3RhdGljIGludCBydW4gKG1kZGV2X3QgKm1kZGV2KQorc3RhdGljIGludCBydW4obWRkZXZfdCAqbWRkZXYpCiB7CiAJcmFpZDVfY29uZl90ICpjb25mOwogCWludCByYWlkX2Rpc2ssIG1lbW9yeTsKQEAgLTE2MTYsNiArMTY5OCw3IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNvbmYtPmhhbmRsZV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmY29uZi0+ZGVsYXllZF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmY29uZi0+Yml0bWFwX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZjb25mLT5pbmFjdGl2ZV9saXN0KTsKIAlhdG9taWNfc2V0KCZjb25mLT5hY3RpdmVfc3RyaXBlcywgMCk7CiAJYXRvbWljX3NldCgmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcywgMCk7CkBAIC0xNzI3LDYgKzE4MTAsOSBAQAogCiAJLyogT2ssIGV2ZXJ5dGhpbmcgaXMganVzdCBmaW5lIG5vdyAqLwogCisJaWYgKG1kZGV2LT5iaXRtYXApCisJCW1kZGV2LT50aHJlYWQtPnRpbWVvdXQgPSBtZGRldi0+Yml0bWFwLT5kYWVtb25fc2xlZXAgKiBIWjsKKwogCW1kZGV2LT5xdWV1ZS0+dW5wbHVnX2ZuID0gcmFpZDVfdW5wbHVnX2RldmljZTsKIAltZGRldi0+cXVldWUtPmlzc3VlX2ZsdXNoX2ZuID0gcmFpZDVfaXNzdWVfZmx1c2g7CiAKQEAgLTE5MDcsNiArMTk5Myw4IEBACiAJCQlyZGV2LT5pbl9zeW5jID0gMDsKIAkJCXJkZXYtPnJhaWRfZGlzayA9IGRpc2s7CiAJCQlmb3VuZCA9IDE7CisJCQlpZiAocmRldi0+c2F2ZWRfcmFpZF9kaXNrICE9IGRpc2spCisJCQkJY29uZi0+ZnVsbHN5bmMgPSAxOwogCQkJcC0+cmRldiA9IHJkZXY7CiAJCQlicmVhazsKIAkJfQpAQCAtMTkzNiw2ICsyMDI0LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHJhaWQ1X3F1aWVzY2UobWRkZXZfdCAqbWRkZXYsIGludCBzdGF0ZSkKK3sKKwlyYWlkNV9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKKworCXN3aXRjaChzdGF0ZSkgeworCWNhc2UgMTogLyogc3RvcCBhbGwgd3JpdGVzICovCisJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKwkJY29uZi0+cXVpZXNjZSA9IDE7CisJCXdhaXRfZXZlbnRfbG9ja19pcnEoY29uZi0+d2FpdF9mb3Jfc3RyaXBlLAorCQkJCSAgICBhdG9taWNfcmVhZCgmY29uZi0+YWN0aXZlX3N0cmlwZXMpID09IDAsCisJCQkJICAgIGNvbmYtPmRldmljZV9sb2NrLCAvKiBub3RoaW5nICovKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CisJCWJyZWFrOworCisJY2FzZSAwOiAvKiByZS1lbmFibGUgd3JpdGVzICovCisJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKwkJY29uZi0+cXVpZXNjZSA9IDA7CisJCXdha2VfdXAoJmNvbmYtPndhaXRfZm9yX3N0cmlwZSk7CisJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQlicmVhazsKKwl9CisJaWYgKG1kZGV2LT50aHJlYWQpIHsKKwkJaWYgKG1kZGV2LT5iaXRtYXApCisJCQltZGRldi0+dGhyZWFkLT50aW1lb3V0ID0gbWRkZXYtPmJpdG1hcC0+ZGFlbW9uX3NsZWVwICogSFo7CisJCWVsc2UKKwkJCW1kZGV2LT50aHJlYWQtPnRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsKKwl9Cit9CiBzdGF0aWMgbWRrX3BlcnNvbmFsaXR5X3QgcmFpZDVfcGVyc29uYWxpdHk9CiB7CiAJLm5hbWUJCT0gInJhaWQ1IiwKQEAgLTE5NTAsNiArMjA2Nyw3IEBACiAJLnNwYXJlX2FjdGl2ZQk9IHJhaWQ1X3NwYXJlX2FjdGl2ZSwKIAkuc3luY19yZXF1ZXN0CT0gc3luY19yZXF1ZXN0LAogCS5yZXNpemUJCT0gcmFpZDVfcmVzaXplLAorCS5xdWllc2NlCT0gcmFpZDVfcXVpZXNjZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHJhaWQ1X2luaXQgKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ2bWFpbi5jIGIvZHJpdmVycy9tZC9yYWlkNm1haW4uYwppbmRleCA0OTVkZWUxLi4yNjdlYjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ2bWFpbi5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDZtYWluLmMKQEAgLTI5LDYgKzI5LDggQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSAicmFpZDYuaCIKIAorI2luY2x1ZGUgPGxpbnV4L3JhaWQvYml0bWFwLmg+CisKIC8qCiAgKiBTdHJpcGUgY2FjaGUKICAqLwpAQCAtOTgsOCArMTAwLDEzIEBACiAJCWlmICh0ZXN0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKSkgewogCQkJaWYgKHRlc3RfYml0KFNUUklQRV9ERUxBWUVELCAmc2gtPnN0YXRlKSkKIAkJCQlsaXN0X2FkZF90YWlsKCZzaC0+bHJ1LCAmY29uZi0+ZGVsYXllZF9saXN0KTsKLQkJCWVsc2UKKwkJCWVsc2UgaWYgKHRlc3RfYml0KFNUUklQRV9CSVRfREVMQVksICZzaC0+c3RhdGUpICYmCisJCQkJIGNvbmYtPnNlcV93cml0ZSA9PSBzaC0+Ym1fc2VxKQorCQkJCWxpc3RfYWRkX3RhaWwoJnNoLT5scnUsICZjb25mLT5iaXRtYXBfbGlzdCk7CisJCQllbHNlIHsKKwkJCQljbGVhcl9iaXQoU1RSSVBFX0JJVF9ERUxBWSwgJnNoLT5zdGF0ZSk7CiAJCQkJbGlzdF9hZGRfdGFpbCgmc2gtPmxydSwgJmNvbmYtPmhhbmRsZV9saXN0KTsKKwkJCX0KIAkJCW1kX3dha2V1cF90aHJlYWQoY29uZi0+bWRkZXYtPnRocmVhZCk7CiAJCX0gZWxzZSB7CiAJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNUUklQRV9QUkVSRUFEX0FDVElWRSwgJnNoLT5zdGF0ZSkpIHsKQEAgLTI2Miw2ICsyNjksOSBAQAogCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAogCWRvIHsKKwkJd2FpdF9ldmVudF9sb2NrX2lycShjb25mLT53YWl0X2Zvcl9zdHJpcGUsCisJCQkJICAgIGNvbmYtPnF1aWVzY2UgPT0gMCwKKwkJCQkgICAgY29uZi0+ZGV2aWNlX2xvY2ssIC8qIG5vdGhpbmcgKi8pOwogCQlzaCA9IF9fZmluZF9zdHJpcGUoY29uZiwgc2VjdG9yKTsKIAkJaWYgKCFzaCkgewogCQkJaWYgKCFjb25mLT5pbmFjdGl2ZV9ibG9ja2VkKQpAQCAtOTA2LDYgKzkxNiw3IEBACiB7CiAJc3RydWN0IGJpbyAqKmJpcDsKIAlyYWlkNl9jb25mX3QgKmNvbmYgPSBzaC0+cmFpZF9jb25mOworCWludCBmaXJzdHdyaXRlPTA7CiAKIAlQUklOVEsoImFkZGluZyBiaCBiIyVsbHUgdG8gc3RyaXBlIHMjJWxsdVxuIiwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaS0+Ymlfc2VjdG9yLApAQCAtOTE0LDkgKzkyNSwxMSBAQAogCiAJc3Bpbl9sb2NrKCZzaC0+bG9jayk7CiAJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwotCWlmIChmb3J3cml0ZSkKKwlpZiAoZm9yd3JpdGUpIHsKIAkJYmlwID0gJnNoLT5kZXZbZGRfaWR4XS50b3dyaXRlOwotCWVsc2UKKwkJaWYgKCpiaXAgPT0gTlVMTCAmJiBzaC0+ZGV2W2RkX2lkeF0ud3JpdHRlbiA9PSBOVUxMKQorCQkJZmlyc3R3cml0ZSA9IDE7CisJfSBlbHNlCiAJCWJpcCA9ICZzaC0+ZGV2W2RkX2lkeF0udG9yZWFkOwogCXdoaWxlICgqYmlwICYmICgqYmlwKS0+Ymlfc2VjdG9yIDwgYmktPmJpX3NlY3RvcikgewogCQlpZiAoKCpiaXApLT5iaV9zZWN0b3IgKyAoKCpiaXApLT5iaV9zaXplID4+IDkpID4gYmktPmJpX3NlY3RvcikKQEAgLTkzOSw2ICs5NTIsMTMgQEAKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaS0+Ymlfc2VjdG9yLAogCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGRkX2lkeCk7CiAKKwlpZiAoY29uZi0+bWRkZXYtPmJpdG1hcCAmJiBmaXJzdHdyaXRlKSB7CisJCXNoLT5ibV9zZXEgPSBjb25mLT5zZXFfd3JpdGU7CisJCWJpdG1hcF9zdGFydHdyaXRlKGNvbmYtPm1kZGV2LT5iaXRtYXAsIHNoLT5zZWN0b3IsCisJCQkJICBTVFJJUEVfU0VDVE9SUywgMCk7CisJCXNldF9iaXQoU1RSSVBFX0JJVF9ERUxBWSwgJnNoLT5zdGF0ZSk7CisJfQorCiAJaWYgKGZvcndyaXRlKSB7CiAJCS8qIGNoZWNrIGlmIHBhZ2UgaXMgY292ZXJlZCAqLwogCQlzZWN0b3JfdCBzZWN0b3IgPSBzaC0+ZGV2W2RkX2lkeF0uc2VjdG9yOwpAQCAtMTA2NiwxMiArMTA4NiwxMyBAQAogCSAqIG5lZWQgdG8gYmUgZmFpbGVkCiAJICovCiAJaWYgKGZhaWxlZCA+IDIgJiYgdG9fcmVhZCt0b193cml0ZSt3cml0dGVuKSB7Ci0JCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAkJZm9yIChpPWRpc2tzOyBpLS07ICkgeworCQkJaW50IGJpdG1hcF9lbmQgPSAwOworCQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwogCQkJLyogZmFpbCBhbGwgd3JpdGVzIGZpcnN0ICovCiAJCQliaSA9IHNoLT5kZXZbaV0udG93cml0ZTsKIAkJCXNoLT5kZXZbaV0udG93cml0ZSA9IE5VTEw7Ci0JCQlpZiAoYmkpIHRvX3dyaXRlLS07CisJCQlpZiAoYmkpIHsgdG9fd3JpdGUtLTsgYml0bWFwX2VuZCA9IDE7IH0KIAogCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSNV9PdmVybGFwLCAmc2gtPmRldltpXS5mbGFncykpCiAJCQkJd2FrZV91cCgmY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCk7CkBAIC0xMDg5LDYgKzExMTAsNyBAQAogCQkJLyogYW5kIGZhaWwgYWxsICd3cml0dGVuJyAqLwogCQkJYmkgPSBzaC0+ZGV2W2ldLndyaXR0ZW47CiAJCQlzaC0+ZGV2W2ldLndyaXR0ZW4gPSBOVUxMOworCQkJaWYgKGJpKSBiaXRtYXBfZW5kID0gMTsKIAkJCXdoaWxlIChiaSAmJiBiaS0+Ymlfc2VjdG9yIDwgc2gtPmRldltpXS5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykgewogCQkJCXN0cnVjdCBiaW8gKmJpMiA9IHI1X25leHRfYmlvKGJpLCBzaC0+ZGV2W2ldLnNlY3Rvcik7CiAJCQkJY2xlYXJfYml0KEJJT19VUFRPREFURSwgJmJpLT5iaV9mbGFncyk7CkBAIC0xMTE3LDggKzExMzksMTEgQEAKIAkJCQkJYmkgPSBuZXh0Ymk7CiAJCQkJfQogCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CisJCQlpZiAoYml0bWFwX2VuZCkKKwkJCQliaXRtYXBfZW5kd3JpdGUoY29uZi0+bWRkZXYtPmJpdG1hcCwgc2gtPnNlY3RvciwKKwkJCQkJCVNUUklQRV9TRUNUT1JTLCAwLCAwKTsKIAkJfQotCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAl9CiAJaWYgKGZhaWxlZCA+IDIgJiYgc3luY2luZykgewogCQltZF9kb25lX3N5bmMoY29uZi0+bWRkZXYsIFNUUklQRV9TRUNUT1JTLDApOwpAQCAtMTE1NSw2ICsxMTgwLDcgQEAKIAkJCQlpZiAoIXRlc3RfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpICYmCiAJCQkJICAgIHRlc3RfYml0KFI1X1VQVE9EQVRFLCAmZGV2LT5mbGFncykgKSB7CiAJCQkJCS8qIFdlIGNhbiByZXR1cm4gYW55IHdyaXRlIHJlcXVlc3RzICovCisJCQkJCWludCBiaXRtYXBfZW5kID0gMDsKIAkJCQkJc3RydWN0IGJpbyAqd2JpLCAqd2JpMjsKIAkJCQkJUFJJTlRLKCJSZXR1cm4gd3JpdGUgZm9yIHN0cmlwZSAlbGx1IGRpc2MgJWRcbiIsCiAJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGkpOwpAQCAtMTE3MCw3ICsxMTk2LDEzIEBACiAJCQkJCQl9CiAJCQkJCQl3YmkgPSB3YmkyOwogCQkJCQl9CisJCQkJCWlmIChkZXYtPnRvd3JpdGUgPT0gTlVMTCkKKwkJCQkJCWJpdG1hcF9lbmQgPSAxOwogCQkJCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKwkJCQkJaWYgKGJpdG1hcF9lbmQpCisJCQkJCQliaXRtYXBfZW5kd3JpdGUoY29uZi0+bWRkZXYtPmJpdG1hcCwgc2gtPnNlY3RvciwKKwkJCQkJCQkJU1RSSVBFX1NFQ1RPUlMsCisJCQkJCQkJCSF0ZXN0X2JpdChTVFJJUEVfREVHUkFERUQsICZzaC0+c3RhdGUpLCAwKTsKIAkJCQl9CiAJCQl9CiAJfQpAQCAtMTI4NSw3ICsxMzE3LDggQEAKIAkJCQl9CiAJCQl9CiAJCS8qIG5vdyBpZiBub3RoaW5nIGlzIGxvY2tlZCwgYW5kIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEsIHdlIGNhbiBzdGFydCBhIHdyaXRlIHJlcXVlc3QgKi8KLQkJaWYgKGxvY2tlZCA9PSAwICYmIHJjdyA9PSAwKSB7CisJCWlmIChsb2NrZWQgPT0gMCAmJiByY3cgPT0gMCAmJgorCQkgICAgIXRlc3RfYml0KFNUUklQRV9CSVRfREVMQVksICZzaC0+c3RhdGUpKSB7CiAJCQlpZiAoIG11c3RfY29tcHV0ZSA+IDAgKSB7CiAJCQkJLyogV2UgaGF2ZSBmYWlsZWQgYmxvY2tzIGFuZCBuZWVkIHRvIGNvbXB1dGUgdGhlbSAqLwogCQkJCXN3aXRjaCAoIGZhaWxlZCApIHsKQEAgLTEzODgsNiArMTQyMSw3IEBACiAJCQliZGV2ID0gJnNoLT5kZXZbZmFpbGVkX251bVsxXV07CiAJCQlsb2NrZWQgKz0gIXRlc3RfYml0KFI1X0xPQ0tFRCwgJmJkZXYtPmZsYWdzKTsKIAkJCXNldF9iaXQoUjVfTE9DS0VELCAmYmRldi0+ZmxhZ3MpOworCQkJY2xlYXJfYml0KFNUUklQRV9ERUdSQURFRCwgJnNoLT5zdGF0ZSk7CiAJCQlzZXRfYml0KFI1X1dhbnR3cml0ZSwgJmJkZXYtPmZsYWdzKTsKIAogCQkJc2V0X2JpdChTVFJJUEVfSU5TWU5DLCAmc2gtPnN0YXRlKTsKQEAgLTE0NTcsNiArMTQ5MSw4IEBACiAJCQliaS0+YmlfbmV4dCA9IE5VTEw7CiAJCQlnZW5lcmljX21ha2VfcmVxdWVzdChiaSk7CiAJCX0gZWxzZSB7CisJCQlpZiAocncgPT0gMSkKKwkJCQlzZXRfYml0KFNUUklQRV9ERUdSQURFRCwgJnNoLT5zdGF0ZSk7CiAJCQlQUklOVEsoInNraXAgb3AgJWxkIG9uIGRpc2MgJWQgZm9yIHNlY3RvciAlbGx1XG4iLAogCQkJCWJpLT5iaV9ydywgaSwgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yKTsKIAkJCWNsZWFyX2JpdChSNV9MT0NLRUQsICZzaC0+ZGV2W2ldLmZsYWdzKTsKQEAgLTE0ODEsNiArMTUxNywyMCBAQAogCX0KIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX2JpdF9kZWxheShyYWlkNl9jb25mX3QgKmNvbmYpCit7CisJLyogZGV2aWNlX2xvY2sgaXMgaGVsZCAqLworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwlsaXN0X2FkZCgmaGVhZCwgJmNvbmYtPmJpdG1hcF9saXN0KTsKKwlsaXN0X2RlbF9pbml0KCZjb25mLT5iaXRtYXBfbGlzdCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZoZWFkKSkgeworCQlzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoID0gbGlzdF9lbnRyeShoZWFkLm5leHQsIHN0cnVjdCBzdHJpcGVfaGVhZCwgbHJ1KTsKKwkJbGlzdF9kZWxfaW5pdCgmc2gtPmxydSk7CisJCWF0b21pY19pbmMoJnNoLT5jb3VudCk7CisJCV9fcmVsZWFzZV9zdHJpcGUoY29uZiwgc2gpOworCX0KK30KKwogc3RhdGljIHZvaWQgdW5wbHVnX3NsYXZlcyhtZGRldl90ICptZGRldikKIHsKIAlyYWlkNl9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKQEAgLTE1MTMsOCArMTU2MywxMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7CiAKLQlpZiAoYmxrX3JlbW92ZV9wbHVnKHEpKQorCWlmIChibGtfcmVtb3ZlX3BsdWcocSkpIHsKKwkJY29uZi0+c2VxX2ZsdXNoKys7CiAJCXJhaWQ2X2FjdGl2YXRlX2RlbGF5ZWQoY29uZik7CisJfQogCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25mLT5kZXZpY2VfbG9jaywgZmxhZ3MpOwpAQCAtMTU3MCw2ICsxNjIyLDExIEBACiAJc2VjdG9yX3QgbG9naWNhbF9zZWN0b3IsIGxhc3Rfc2VjdG9yOwogCXN0cnVjdCBzdHJpcGVfaGVhZCAqc2g7CiAKKwlpZiAodW5saWtlbHkoYmlvX2JhcnJpZXIoYmkpKSkgeworCQliaW9fZW5kaW8oYmksIGJpLT5iaV9zaXplLCAtRU9QTk9UU1VQUCk7CisJCXJldHVybiAwOworCX0KKwogCW1kX3dyaXRlX3N0YXJ0KG1kZGV2LCBiaSk7CiAKIAlpZiAoYmlvX2RhdGFfZGlyKGJpKT09V1JJVEUpIHsKQEAgLTE2NDcsMTAgKzE3MDQsMjAgQEAKIAlzZWN0b3JfdCBmaXJzdF9zZWN0b3I7CiAJaW50IHJhaWRfZGlza3MgPSBjb25mLT5yYWlkX2Rpc2tzOwogCWludCBkYXRhX2Rpc2tzID0gcmFpZF9kaXNrcyAtIDI7CisJc2VjdG9yX3QgbWF4X3NlY3RvciA9IG1kZGV2LT5zaXplIDw8IDE7CisJaW50IHN5bmNfYmxvY2tzOwogCi0JaWYgKHNlY3Rvcl9uciA+PSBtZGRldi0+c2l6ZSA8PDEpIHsKKwlpZiAoc2VjdG9yX25yID49IG1heF9zZWN0b3IpIHsKIAkJLyoganVzdCBiZWluZyB0b2xkIHRvIGZpbmlzaCB1cCAuLiBub3RoaW5nIG11Y2ggdG8gZG8gKi8KIAkJdW5wbHVnX3NsYXZlcyhtZGRldik7CisKKwkJaWYgKG1kZGV2LT5jdXJyX3Jlc3luYyA8IG1heF9zZWN0b3IpIC8qIGFib3J0ZWQgKi8KKwkJCWJpdG1hcF9lbmRfc3luYyhtZGRldi0+Yml0bWFwLCBtZGRldi0+Y3Vycl9yZXN5bmMsCisJCQkJCSZzeW5jX2Jsb2NrcywgMSk7CisJCWVsc2UgLyogY29tcGVsdGVkIHN5bmMgKi8KKwkJCWNvbmYtPmZ1bGxzeW5jID0gMDsKKwkJYml0bWFwX2Nsb3NlX3N5bmMobWRkZXYtPmJpdG1hcCk7CisKIAkJcmV0dXJuIDA7CiAJfQogCS8qIGlmIHRoZXJlIGFyZSAyIG9yIG1vcmUgZmFpbGVkIGRyaXZlcyBhbmQgd2UgYXJlIHRyeWluZwpAQCAtMTY2Miw2ICsxNzI5LDEzIEBACiAJCSpza2lwcGVkID0gMTsKIAkJcmV0dXJuIHJ2OwogCX0KKwlpZiAoIWJpdG1hcF9zdGFydF9zeW5jKG1kZGV2LT5iaXRtYXAsIHNlY3Rvcl9uciwgJnN5bmNfYmxvY2tzLCAxKSAmJgorCSAgICAhY29uZi0+ZnVsbHN5bmMgJiYgc3luY19ibG9ja3MgPj0gU1RSSVBFX1NFQ1RPUlMpIHsKKwkJLyogd2UgY2FuIHNraXAgdGhpcyBibG9jaywgYW5kIHByb2JhYmx5IG1vcmUgKi8KKwkJc3luY19ibG9ja3MgLz0gU1RSSVBFX1NFQ1RPUlM7CisJCSpza2lwcGVkID0gMTsKKwkJcmV0dXJuIHN5bmNfYmxvY2tzICogU1RSSVBFX1NFQ1RPUlM7IC8qIGtlZXAgdGhpbmdzIHJvdW5kZWQgdG8gd2hvbGUgc3RyaXBlcyAqLworCX0KIAogCXggPSBzZWN0b3JfbnI7CiAJY2h1bmtfb2Zmc2V0ID0gc2VjdG9yX2Rpdih4LCBzZWN0b3JzX3Blcl9jaHVuayk7CkBAIC0xNjc5LDYgKzE3NTMsNyBAQAogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CiAJfQorCWJpdG1hcF9zdGFydF9zeW5jKG1kZGV2LT5iaXRtYXAsIHNlY3Rvcl9uciwgJnN5bmNfYmxvY2tzLCAwKTsKIAlzcGluX2xvY2soJnNoLT5sb2NrKTsKIAlzZXRfYml0KFNUUklQRV9TWU5DSU5HLCAmc2gtPnN0YXRlKTsKIAljbGVhcl9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7CkBAIC0xNzEyLDYgKzE3ODcsMTMgQEAKIAl3aGlsZSAoMSkgewogCQlzdHJ1Y3QgbGlzdF9oZWFkICpmaXJzdDsKIAorCQlpZiAoY29uZi0+c2VxX2ZsdXNoIC0gY29uZi0+c2VxX3dyaXRlID4gMCkgeworCQkJaW50IHNlcSA9IGNvbmYtPnNlcV9mbHVzaDsKKwkJCWJpdG1hcF91bnBsdWcobWRkZXYtPmJpdG1hcCk7CisJCQljb25mLT5zZXFfd3JpdGUgPSBzZXE7CisJCQlhY3RpdmF0ZV9iaXRfZGVsYXkoY29uZik7CisJCX0KKwogCQlpZiAobGlzdF9lbXB0eSgmY29uZi0+aGFuZGxlX2xpc3QpICYmCiAJCSAgICBhdG9taWNfcmVhZCgmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcykgPCBJT19USFJFU0hPTEQgJiYKIAkJICAgICFibGtfcXVldWVfcGx1Z2dlZChtZGRldi0+cXVldWUpICYmCkBAIC0xNzQ1LDcgKzE4MjcsNyBAQAogCVBSSU5USygiLS0tIHJhaWQ2ZCBpbmFjdGl2ZVxuIik7CiB9CiAKLXN0YXRpYyBpbnQgcnVuIChtZGRldl90ICptZGRldikKK3N0YXRpYyBpbnQgcnVuKG1kZGV2X3QgKm1kZGV2KQogewogCXJhaWQ2X2NvbmZfdCAqY29uZjsKIAlpbnQgcmFpZF9kaXNrLCBtZW1vcnk7CkBAIC0xNzc1LDYgKzE4NTcsNyBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbmYtPndhaXRfZm9yX292ZXJsYXApOwogCUlOSVRfTElTVF9IRUFEKCZjb25mLT5oYW5kbGVfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNvbmYtPmRlbGF5ZWRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmNvbmYtPmJpdG1hcF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmY29uZi0+aW5hY3RpdmVfbGlzdCk7CiAJYXRvbWljX3NldCgmY29uZi0+YWN0aXZlX3N0cmlwZXMsIDApOwogCWF0b21pY19zZXQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMsIDApOwpAQCAtMTg5NCw2ICsxOTc3LDkgQEAKIAkvKiBPaywgZXZlcnl0aGluZyBpcyBqdXN0IGZpbmUgbm93ICovCiAJbWRkZXYtPmFycmF5X3NpemUgPSAgbWRkZXYtPnNpemUgKiAobWRkZXYtPnJhaWRfZGlza3MgLSAyKTsKIAorCWlmIChtZGRldi0+Yml0bWFwKQorCQltZGRldi0+dGhyZWFkLT50aW1lb3V0ID0gbWRkZXYtPmJpdG1hcC0+ZGFlbW9uX3NsZWVwICogSFo7CisKIAltZGRldi0+cXVldWUtPnVucGx1Z19mbiA9IHJhaWQ2X3VucGx1Z19kZXZpY2U7CiAJbWRkZXYtPnF1ZXVlLT5pc3N1ZV9mbHVzaF9mbiA9IHJhaWQ2X2lzc3VlX2ZsdXNoOwogCXJldHVybiAwOwpAQCAtMjA3MSw2ICsyMTU3LDggQEAKIAkJCXJkZXYtPmluX3N5bmMgPSAwOwogCQkJcmRldi0+cmFpZF9kaXNrID0gZGlzazsKIAkJCWZvdW5kID0gMTsKKwkJCWlmIChyZGV2LT5zYXZlZF9yYWlkX2Rpc2sgIT0gZGlzaykKKwkJCQljb25mLT5mdWxsc3luYyA9IDE7CiAJCQlwLT5yZGV2ID0gcmRldjsKIAkJCWJyZWFrOwogCQl9CkBAIC0yMTAwLDYgKzIxODgsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcmFpZDZfcXVpZXNjZShtZGRldl90ICptZGRldiwgaW50IHN0YXRlKQoreworCXJhaWQ2X2NvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOworCisJc3dpdGNoKHN0YXRlKSB7CisJY2FzZSAxOiAvKiBzdG9wIGFsbCB3cml0ZXMgKi8KKwkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQljb25mLT5xdWllc2NlID0gMTsKKwkJd2FpdF9ldmVudF9sb2NrX2lycShjb25mLT53YWl0X2Zvcl9zdHJpcGUsCisJCQkJICAgIGF0b21pY19yZWFkKCZjb25mLT5hY3RpdmVfc3RyaXBlcykgPT0gMCwKKwkJCQkgICAgY29uZi0+ZGV2aWNlX2xvY2ssIC8qIG5vdGhpbmcgKi8pOworCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIDA6IC8qIHJlLWVuYWJsZSB3cml0ZXMgKi8KKwkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQljb25mLT5xdWllc2NlID0gMDsKKwkJd2FrZV91cCgmY29uZi0+d2FpdF9mb3Jfc3RyaXBlKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CisJCWJyZWFrOworCX0KKwlpZiAobWRkZXYtPnRocmVhZCkgeworCQlpZiAobWRkZXYtPmJpdG1hcCkKKwkJCW1kZGV2LT50aHJlYWQtPnRpbWVvdXQgPSBtZGRldi0+Yml0bWFwLT5kYWVtb25fc2xlZXAgKiBIWjsKKwkJZWxzZQorCQkJbWRkZXYtPnRocmVhZC0+dGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOworCX0KK30KIHN0YXRpYyBtZGtfcGVyc29uYWxpdHlfdCByYWlkNl9wZXJzb25hbGl0eT0KIHsKIAkubmFtZQkJPSAicmFpZDYiLApAQCAtMjExNCw2ICsyMjMxLDcgQEAKIAkuc3BhcmVfYWN0aXZlCT0gcmFpZDZfc3BhcmVfYWN0aXZlLAogCS5zeW5jX3JlcXVlc3QJPSBzeW5jX3JlcXVlc3QsCiAJLnJlc2l6ZQkJPSByYWlkNl9yZXNpemUsCisJLnF1aWVzY2UJPSByYWlkNl9xdWllc2NlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcmFpZDZfaW5pdCAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL01ha2VmaWxlCmluZGV4IDc3MmQ2MTEuLmM1NzhhNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9NYWtlZmlsZQpAQCAtMiw0ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBrZXJuZWwgbXVsdGltZWRpYSBkZXZpY2UgZHJpdmVycy4KICMKIAotb2JqLXkgICAgICAgIDo9IHZpZGVvLyByYWRpby8gZHZiLyBjb21tb24vCitvYmoteSA6PSBjb21tb24vCitvYmotJChDT05GSUdfVklERU9fREVWKSArPSB2aWRlby8KK29iai0kKENPTkZJR19WSURFT19ERVYpICs9IHJhZGlvLworb2JqLSQoQ09ORklHX0RWQikgICAgICAgKz0gZHZiLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXItY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1jb21tb24uYwppbmRleCBhYjdhMWZiLi5hMGU3MDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1jb21tb24uYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1jb21tb24uYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGlyLWNvbW1vbi5jLHYgMS4xMSAyMDA1LzA3LzA3IDE0OjQ0OjQzIG1jaGVoYWIgRXhwICQKICAqCiAgKiBzb21lIGNvbW1vbiBzdHJ1Y3RzIGFuZCBmdW5jdGlvbnMgdG8gaGFuZGxlIGluZnJhcmVkIHJlbW90ZXMgdmlhCiAgKiBpbnB1dCBsYXllciAuLi4KQEAgLTMzNSw2ICszMzQsNzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogZGVjb2RlIHJhdyBzYW1wbGVzLCBwdWxzZSBkaXN0YW5jZSBjb2RpbmcgdXNlZCBieSBORUMgcmVtb3RlcyAqLworaW50IGlyX2RlY29kZV9wdWxzZWRpc3RhbmNlKHUzMiAqc2FtcGxlcywgaW50IGNvdW50LCBpbnQgbG93LCBpbnQgaGlnaCkKK3sKKwlpbnQgaSxsYXN0LGJpdCxsZW47CisJdTMyIGN1ckJpdDsKKwl1MzIgdmFsdWU7CisKKwkvKiBmaW5kIHN0YXJ0IGJ1cnN0ICovCisJZm9yIChpID0gbGVuID0gMDsgaSA8IGNvdW50ICogMzI7IGkrKykgeworCQliaXQgPSBnZXRiaXQoc2FtcGxlcyxpKTsKKwkJaWYgKGJpdCkgeworCQkJbGVuKys7CisJCX0gZWxzZSB7CisJCQlpZiAobGVuID49IDI5KQorCQkJCWJyZWFrOworCQkJbGVuID0gMDsKKwkJfQorCX0KKworCS8qIHN0YXJ0IGJ1cnN0IHRvIHNob3J0ICovCisJaWYgKGxlbiA8IDI5KQorCQlyZXR1cm4gMHhmZmZmZmZmZjsKKworCS8qIGZpbmQgc3RhcnQgc2lsZW5jZSAqLworCWZvciAobGVuID0gMDsgaSA8IGNvdW50ICogMzI7IGkrKykgeworCQliaXQgPSBnZXRiaXQoc2FtcGxlcyxpKTsKKwkJaWYgKGJpdCkgeworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlsZW4rKzsKKwkJfQorCX0KKworCS8qIHNpbGVuY2UgdG8gc2hvcnQgKi8KKwlpZiAobGVuIDwgNykKKwkJcmV0dXJuIDB4ZmZmZmZmZmY7CisKKwkvKiBnbyBkZWNvZGluZyAqLworCWxlbiAgID0gMDsKKwlsYXN0ID0gMTsKKwl2YWx1ZSA9IDA7IGN1ckJpdCA9IDE7CisJZm9yICg7IGkgPCBjb3VudCAqIDMyOyBpKyspIHsKKwkJYml0ICA9IGdldGJpdChzYW1wbGVzLGkpOworCQlpZiAobGFzdCkgeworCQkJaWYoYml0KSB7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCWxlbiA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoYml0KSB7CisJCQkJaWYgKGxlbiA+IChsb3cgKyBoaWdoKSAvMikKKwkJCQkJdmFsdWUgfD0gY3VyQml0OworCQkJCWN1ckJpdCA8PD0gMTsKKwkJCQlpZiAoY3VyQml0ID09IDEpCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlsZW4rKzsKKwkJCX0KKwkJfQorCQlsYXN0ID0gYml0OworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKwogLyogZGVjb2RlIHJhdyBzYW1wbGVzLCBiaXBoYXNlIGNvZGluZywgdXNlZCBieSByYzUgZm9yIGV4YW1wbGUgKi8KIGludCBpcl9kZWNvZGVfYmlwaGFzZSh1MzIgKnNhbXBsZXMsIGludCBjb3VudCwgaW50IGxvdywgaW50IGhpZ2gpCiB7CkBAIC0zODMsNiArNDQ4LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2V4dHJhY3RfYml0cyk7CiBFWFBPUlRfU1lNQk9MX0dQTChpcl9kdW1wX3NhbXBsZXMpOwogRVhQT1JUX1NZTUJPTF9HUEwoaXJfZGVjb2RlX2JpcGhhc2UpOworRVhQT1JUX1NZTUJPTF9HUEwoaXJfZGVjb2RlX3B1bHNlZGlzdGFuY2UpOwogCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYwppbmRleCBjZDU4MjhiLi4yMDZjYzJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYwpAQCAtMTY4LDEwICsxNjgsOCBAQAogCQlyZXR1cm47CiAJcGNpX2ZyZWVfY29uc2lzdGVudChwY2ksIHB0LT5zaXplLCBwdC0+Y3B1LCBwdC0+ZG1hKTsKIAlwdC0+Y3B1ID0gTlVMTDsKLQlpZiAoTlVMTCAhPSBwdC0+c2xpc3QpIHsKLQkJa2ZyZWUocHQtPnNsaXN0KTsKLQkJcHQtPnNsaXN0ID0gTlVMTDsKLQl9CisJa2ZyZWUocHQtPnNsaXN0KTsKKwlwdC0+c2xpc3QgPSBOVUxMOwogfQogCiBpbnQgc2FhNzE0Nl9wZ3RhYmxlX2FsbG9jKHN0cnVjdCBwY2lfZGV2ICpwY2ksIHN0cnVjdCBzYWE3MTQ2X3BndGFibGUgKnB0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYwppbmRleCBjMDRmZDExLi4zNzg4ODk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYwpAQCAtMSw1ICsxLDQgQEAKICNpbmNsdWRlIDxtZWRpYS9zYWE3MTQ2X3Z2Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjZGVmaW5lIEJPQVJEX0NBTl9ET19WQkkoZGV2KSAgIChkZXYtPnJldmlzaW9uICE9IDAgJiYgZGV2LT52dl9kYXRhLT52YmlfbWlub3IgIT0gLTEpIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2kyYy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9pMmMuYwppbmRleCA3ODFmMjNmLi5mZWM2YmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2kyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaTJjLmMKQEAgLTEsNCArMSwzIEBACi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDZfdnYuaD4KIAogc3RhdGljIHUzMiBzYWE3MTQ2X2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKQEAgLTM4Nyw4ICszODYsNiBAQAogCiAvKiBleHBvcnRlZCBhbGdvcml0aG0gZGF0YSAqLwogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNhYTcxNDZfYWxnbyA9IHsKLQkubmFtZQkJPSAic2FhNzE0NiBpMmMgYWxnb3JpdGhtIiwKLQkuaWQJCT0gSTJDX0FMR09fU0FBNzE0NiwKIAkubWFzdGVyX3hmZXIJPSBzYWE3MTQ2X2kyY194ZmVyLAogCS5mdW5jdGlvbmFsaXR5CT0gc2FhNzE0Nl9pMmNfZnVuYywKIH07CkBAIC00MDQsMTUgKzQwMSwxMiBAQAogCXNhYTcxNDZfaTJjX3Jlc2V0KGRldik7CiAKIAlpZiggTlVMTCAhPSBpMmNfYWRhcHRlciApIHsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotCQlpMmNfYWRhcHRlci0+ZGF0YSA9IGRldjsKLSNlbHNlCiAJCUJVR19PTighaTJjX2FkYXB0ZXItPmNsYXNzKTsKIAkJaTJjX3NldF9hZGFwZGF0YShpMmNfYWRhcHRlcixkZXYpOwotI2VuZGlmCisJCWkyY19hZGFwdGVyLT5kZXYucGFyZW50ICAgID0gJmRldi0+cGNpLT5kZXY7CiAJCWkyY19hZGFwdGVyLT5hbGdvCSAgID0gJnNhYTcxNDZfYWxnbzsKIAkJaTJjX2FkYXB0ZXItPmFsZ29fZGF0YSAgICAgPSBOVUxMOwotCQlpMmNfYWRhcHRlci0+aWQJCSAgID0gSTJDX0FMR09fU0FBNzE0NjsKKwkJaTJjX2FkYXB0ZXItPmlkCQkgICA9IEkyQ19IV19TQUE3MTQ2OwogCQlpMmNfYWRhcHRlci0+dGltZW91dCA9IFNBQTcxNDZfSTJDX1RJTUVPVVQ7CiAJCWkyY19hZGFwdGVyLT5yZXRyaWVzID0gU0FBNzE0Nl9JMkNfUkVUUklFUzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZmUtdHVuZXIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1mZS10dW5lci5jCmluZGV4IDA0MTBjYzkuLjQ3ZTI4YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1mZS10dW5lci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1mZS10dW5lci5jCkBAIC0xNjQsMTIgKzE2NCwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhbXN1bmdfdGJtdTI0MTEyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBzYW1zdW5nX3RibXUyNDExMl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CiAJdTggYnVmWzRdOwogCXUzMiBkaXY7CiAJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4NjEsIC5mbGFncyA9IDAsIC5idWYgPSBidWYsIC5sZW4gPSBzaXplb2YoYnVmKSB9OwotCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMgPSBmZS0+ZHZiLT5wcml2OwogCiAJZGl2ID0gcGFyYW1zLT5mcmVxdWVuY3kgLyAxMjU7CiAKQEAgLTE4MCw3ICsxNzksNyBAQAogCiAJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTUwMDAwMCkgYnVmWzNdIHw9IDB4MTA7CiAKLQlpZiAoaTJjX3RyYW5zZmVyKCZmYy0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCisJaWYgKGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwogfQpAQCAtMzM1LDggKzMzNCwxMDMgQEAKIAkucGxsX3NldCA9IHNreXN0YXIyM19zYW1zdW5nX3RiZHUxODEzMl9wbGxfc2V0LAogfTsKIAorCitzdGF0aWMgdTggYWxwc190ZGVlNF9zdHYwMjk3X2luaXR0YWJbXSA9IHsKKwkweDgwLCAweDAxLAorCTB4ODAsIDB4MDAsCisJMHg4MSwgMHgwMSwKKwkweDgxLCAweDAwLAorCTB4MDAsIDB4MDksCisJMHgwMSwgMHg2OSwKKwkweDAzLCAweDAwLAorCTB4MDQsIDB4MDAsCisJMHgwNywgMHgwMCwKKwkweDA4LCAweDAwLAorCTB4MjAsIDB4MDAsCisJMHgyMSwgMHg0MCwKKwkweDIyLCAweDAwLAorCTB4MjMsIDB4MDAsCisJMHgyNCwgMHg0MCwKKwkweDI1LCAweDg4LAorCTB4MzAsIDB4ZmYsCisJMHgzMSwgMHgwMCwKKwkweDMyLCAweGZmLAorCTB4MzMsIDB4MDAsCisJMHgzNCwgMHg1MCwKKwkweDM1LCAweDdmLAorCTB4MzYsIDB4MDAsCisJMHgzNywgMHgyMCwKKwkweDM4LCAweDAwLAorCTB4NDAsIDB4MWMsCisJMHg0MSwgMHhmZiwKKwkweDQyLCAweDI5LAorCTB4NDMsIDB4MDAsCisJMHg0NCwgMHhmZiwKKwkweDQ1LCAweDAwLAorCTB4NDYsIDB4MDAsCisJMHg0OSwgMHgwNCwKKwkweDRhLCAweDAwLAorCTB4NGIsIDB4ZjgsCisJMHg1MiwgMHgzMCwKKwkweDU1LCAweGFlLAorCTB4NTYsIDB4NDcsCisJMHg1NywgMHhlMSwKKwkweDU4LCAweDNhLAorCTB4NWEsIDB4MWUsCisJMHg1YiwgMHgzNCwKKwkweDYwLCAweDAwLAorCTB4NjMsIDB4MDAsCisJMHg2NCwgMHgwMCwKKwkweDY1LCAweDAwLAorCTB4NjYsIDB4MDAsCisJMHg2NywgMHgwMCwKKwkweDY4LCAweDAwLAorCTB4NjksIDB4MDAsCisJMHg2YSwgMHgwMiwKKwkweDZiLCAweDAwLAorCTB4NzAsIDB4ZmYsCisJMHg3MSwgMHgwMCwKKwkweDcyLCAweDAwLAorCTB4NzMsIDB4MDAsCisJMHg3NCwgMHgwYywKKwkweDgwLCAweDAwLAorCTB4ODEsIDB4MDAsCisJMHg4MiwgMHgwMCwKKwkweDgzLCAweDAwLAorCTB4ODQsIDB4MDQsCisJMHg4NSwgMHg4MCwKKwkweDg2LCAweDI0LAorCTB4ODcsIDB4NzgsCisJMHg4OCwgMHgxMCwKKwkweDg5LCAweDAwLAorCTB4OTAsIDB4MDEsCisJMHg5MSwgMHgwMSwKKwkweGEwLCAweDA0LAorCTB4YTEsIDB4MDAsCisJMHhhMiwgMHgwMCwKKwkweGIwLCAweDkxLAorCTB4YjEsIDB4MGIsCisJMHhjMCwgMHg1MywKKwkweGMxLCAweDcwLAorCTB4YzIsIDB4MTIsCisJMHhkMCwgMHgwMCwKKwkweGQxLCAweDAwLAorCTB4ZDIsIDB4MDAsCisJMHhkMywgMHgwMCwKKwkweGQ0LCAweDAwLAorCTB4ZDUsIDB4MDAsCisJMHhkZSwgMHgwMCwKKwkweGRmLCAweDAwLAorCTB4NjEsIDB4NDksCisJMHg2MiwgMHgwYiwKKwkweDUzLCAweDA4LAorCTB4NTksIDB4MDgsCisJMHhmZiwgMHhmZiwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgc3R2MDI5N19jb25maWcgYWxwc190ZGVlNF9zdHYwMjk3X2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MWMsCisJLmluaXR0YWIgPSBhbHBzX3RkZWU0X3N0djAyOTdfaW5pdHRhYiwKIC8vCS5pbnZlcnQgPSAxLAogLy8JLnBsbF9zZXQgPSBhbHBzX3RkZWU0X3N0djAyOTdfcGxsX3NldCwKIH07CkBAIC0zNzAsNyArNDY0LDcgQEAKIAkJaW5mbygiZm91bmQgdGhlIGJjbTM1MTAgYXQgaTJjIGFkZHJlc3M6IDB4JTAyeCIsYWlyMnBjX2F0c2NfZmlyc3RfZ2VuX2NvbmZpZy5kZW1vZF9hZGRyZXNzKTsKIAl9IGVsc2UKIAkvKiB0cnkgdGhlIGNhYmxlIGR2YiAoc3R2MDI5NykgKi8KLQlpZiAoKGZjLT5mZSA9IHN0djAyOTdfYXR0YWNoKCZhbHBzX3RkZWU0X3N0djAyOTdfY29uZmlnLCAmZmMtPmkyY19hZGFwLCAweGY4KSkgIT0gTlVMTCkgeworCWlmICgoZmMtPmZlID0gc3R2MDI5N19hdHRhY2goJmFscHNfdGRlZTRfc3R2MDI5N19jb25maWcsICZmYy0+aTJjX2FkYXApKSAhPSBOVUxMKSB7CiAJCWZjLT5kZXZfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgID0gRkNfQ0FCTEU7CiAJCWluZm8oImZvdW5kIHRoZSBzdHYwMjk3IGF0IGkyYyBhZGRyZXNzOiAweCUwMngiLGFscHNfdGRlZTRfc3R2MDI5N19jb25maWcuZGVtb2RfYWRkcmVzcyk7CiAJfSBlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtaTJjLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtaTJjLmMKaW5kZXggYmU0MjY2ZC4uNTY0OTVjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1pMmMuYwpAQCAtMTcyLDggKzE3Miw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBmbGV4Y29wX2FsZ28gPSB7Ci0JLm5hbWUJCQk9ICJGbGV4Q29wIEkyQyBhbGdvcml0aG0iLAotCS5pZAkJCQk9IEkyQ19BTEdPX0JJVCwKIAkubWFzdGVyX3hmZXIJPSBmbGV4Y29wX21hc3Rlcl94ZmVyLAogCS5mdW5jdGlvbmFsaXR5CT0gZmxleGNvcF9pMmNfZnVuYywKIH07CkBAIC0xOTIsNyArMTkwLDYgQEAKIAlmYy0+aTJjX2FkYXAuY2xhc3MJICAgID0gSTJDX0NMQVNTX1RWX0RJR0lUQUw7CiAJZmMtPmkyY19hZGFwLmFsZ28gICAgICAgPSAmZmxleGNvcF9hbGdvOwogCWZjLT5pMmNfYWRhcC5hbGdvX2RhdGEgID0gTlVMTDsKLQlmYy0+aTJjX2FkYXAuaWQgICAgICAgICA9IEkyQ19BTEdPX0JJVDsKIAogCWlmICgocmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZmYy0+aTJjX2FkYXApKSA8IDApCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvS2NvbmZpZwppbmRleCBiMTI1NDVmLi4xZTg1ZDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L0tjb25maWcKQEAgLTEsNSArMSw1IEBACiBjb25maWcgRFZCX0JUOFhYCi0JdHJpc3RhdGUgIk5lYnVsYS9QaW5uYWNsZSBQQ1RWL1R3aW5oYW4gUENJIGNhcmRzIgorCXRyaXN0YXRlICJCVDh4eCBiYXNlZCBQQ0kgY2FyZHMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kgJiYgVklERU9fQlQ4NDgKIAlzZWxlY3QgRFZCX01UMzUyCiAJc2VsZWN0IERWQl9TUDg4N1gKQEAgLTgsOCArOCw4IEBACiAJc2VsZWN0IERWQl9PUjUxMjExCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgUENJIGNhcmRzIGJhc2VkIG9uIHRoZSBCdDh4eCBQQ0kgYnJpZGdlLiBFeGFtcGxlcyBhcmUKLQkgIHRoZSBOZWJ1bGEgY2FyZHMsIHRoZSBQaW5uYWNsZSBQQ1RWIGNhcmRzLCB0aGUgVHdpbmhhbiBEU1QgY2FyZHMgYW5kCi0JICBwY0hEVFYgSEQyMDAwIGNhcmRzLgorCSAgdGhlIE5lYnVsYSBjYXJkcywgdGhlIFBpbm5hY2xlIFBDVFYgY2FyZHMsIHRoZSBUd2luaGFuIERTVCBjYXJkcywKKwkgIHRoZSBwY0hEVFYgSEQyMDAwIGNhcmRzLCBhbmQgY2VydGFpbiBBVmVyTWVkaWEgY2FyZHMuCiAKIAkgIFNpbmNlIHRoZXNlIGNhcmRzIGhhdmUgbm8gTVBFRyBkZWNvZGVyIG9uYm9hcmQsIHRoZXkgdHJhbnNtaXQKIAkgIG9ubHkgY29tcHJlc3NlZCBNUEVHIGRhdGEgb3ZlciB0aGUgUENJIGJ1cywgc28geW91IG5lZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9idDg3OC5jCmluZGV4IDNjNWE4ZTIuLmYyOTU3MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvYnQ4NzguYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBidDg3OC5jOiBwYXJ0IG9mIHRoZSBkcml2ZXIgZm9yIHRoZSBQaW5uYWNsZSBQQ1RWIFNhdCBEVkIgUENJIGNhcmQKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGV0ZXIgSGV0dGthbXAgPHBldGVyLmhldHRrYW1wQHQtb25saW5lLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIEhldHRrYW1wIDxwZXRlci5oZXR0a2FtcEBodHAtdGVsLmRlPgogICoKICAqIGxhcmdlIHBhcnRzIGJhc2VkIG9uIHRoZSBidHR2IGRyaXZlcgogICogQ29weXJpZ2h0IChDKSAxOTk2LDk3LDk4IFJhbHBoICBNZXR6bGVyIChyamttQG1ldHpsZXJicm9zLmRlKQpAQCAtMjE5LDcgKzIxOSw3IEBACiAJY29udHJvbHJlZyAmPSB+MHgxZjsKIAljb250cm9scmVnIHw9IDB4MWI7CiAKLQlidHdyaXRlKGNwdV90b19sZTMyKGJ0LT5yaXNjX2RtYSksIEJUODc4X0FSSVNDX1NUQVJUKTsKKwlidHdyaXRlKGJ0LT5yaXNjX2RtYSwgQlQ4NzhfQVJJU0NfU1RBUlQpOwogCiAJLyogb3JpZ2luYWwgaW50IG1hc2sgaGFkIDoKIAkgKiAgICA2ICAgIDIgICAgOCAgICA0ICAgIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9idDg3OC5oCmluZGV4IDgzNzYyM2YuLmE3M2JhZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvYnQ4NzguaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgICAgYnQ4NzguaCAtIEJ0ODc4IGF1ZGlvIG1vZHVsZSAocmVnaXN0ZXIgb2Zmc2V0cykKIAotICAgIENvcHlyaWdodCAoQykgMjAwMiBQZXRlciBIZXR0a2FtcCA8cGV0ZXIuaGV0dGthbXBAdC1vbmxpbmUuZGU+CisgICAgQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIEhldHRrYW1wIDxwZXRlci5oZXR0a2FtcEBodHAtdGVsLmRlPgogCiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3QuYwppbmRleCAwN2EwYjBhLi4zNGE4MzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3QuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3QuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0KIAlGcm9udGVuZC9DYXJkIGRyaXZlciBmb3IgVHdpbkhhbiBEU1QgRnJvbnRlbmQKIAlDb3B5cmlnaHQgKEMpIDIwMDMgSmFtaWUgSG9uYW4KIAlDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgTWFudSBBYnJhaGFtIChtYW51QGtyb210ZWsuY29tKQpAQCAtMTksNyArMTgsNiBAQAogCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjgsMzEgKzI2LDQ1IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+Ci0KICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKICNpbmNsdWRlICJkc3RfcHJpdi5oIgogI2luY2x1ZGUgImRzdF9jb21tb24uaCIKIAotCiBzdGF0aWMgdW5zaWduZWQgaW50IHZlcmJvc2UgPSAxOwogbW9kdWxlX3BhcmFtKHZlcmJvc2UsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJ2ZXJib3NlIHN0YXJ0dXAgbWVzc2FnZXMsIGRlZmF1bHQgaXMgMSAoeWVzKSIpOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnID0gMTsKLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBtZXNzYWdlcywgZGVmYXVsdCBpcyAwICh5ZXMpIik7Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgZHN0X2FkZG9uczsKIG1vZHVsZV9wYXJhbShkc3RfYWRkb25zLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkc3RfYWRkb25zLCAiQ0EgZGF1Z2h0ZXJib2FyZCwgZGVmYXVsdCBpcyAwIChObyBhZGRvbnMpIik7CiAKLSNkZWZpbmUgZHByaW50awlpZiAoZGVidWcpIHByaW50aworI2RlZmluZSBIQVNfTE9DSwkJMQorI2RlZmluZSBBVFRFTVBUX1RVTkUJCTIKKyNkZWZpbmUgSEFTX1BPV0VSCQk0CiAKLSNkZWZpbmUgSEFTX0xPQ0sJMQotI2RlZmluZSBBVFRFTVBUX1RVTkUJMgotI2RlZmluZSBIQVNfUE9XRVIJNAorI2RlZmluZSBEU1RfRVJST1IJCTAKKyNkZWZpbmUgRFNUX05PVElDRQkJMQorI2RlZmluZSBEU1RfSU5GTwkJMgorI2RlZmluZSBEU1RfREVCVUcJCTMKIAotc3RhdGljIHZvaWQgZHN0X3BhY2tzaXplKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlLCBpbnQgcHNpemUpCisjZGVmaW5lIGRwcmludGsoeCwgeSwgeiwgZm9ybWF0LCBhcmcuLi4pIGRvIHsJCQkJCQlcCisJaWYgKHopIHsJCQkJCQkJCQlcCisJCWlmCSgoeCA+IERTVF9FUlJPUikgJiYgKHggPiB5KSkJCQkJCVwKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsJXAorCQllbHNlIGlmCSgoeCA+IERTVF9OT1RJQ0UpICYmICh4ID4geSkpCQkJCQlcCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiAiIGZvcm1hdCAiXG4iLCBfX0ZVTkNUSU9OX18gLCAjI2FyZyk7CVwKKwkJZWxzZSBpZiAoKHggPiBEU1RfSU5GTykgJiYgKHggPiB5KSkJCQkJCVwKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAiIGZvcm1hdCAiXG4iLCBfX0ZVTkNUSU9OX18gLCAjI2FyZyk7CVwKKwkJZWxzZSBpZiAoKHggPiBEU1RfREVCVUcpICYmICh4ID4geSkpCQkJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsJXAorCX0gZWxzZSB7CQkJCQkJCQkJXAorCQlpZiAoeCA+IHkpCQkJCQkJCQlcCisJCQlwcmludGsoZm9ybWF0LCAjI2FyZyk7CQkJCQkJXAorCX0JCQkJCQkJCQkJXAorfSB3aGlsZSgwKQorCisKK3N0YXRpYyB2b2lkIGRzdF9wYWNrc2l6ZShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgaW50IHBzaXplKQogewogCXVuaW9uIGRzdF9ncGlvX3BhY2tldCBiaXRzOwogCkBAIC02MCw3ICs3Miw3IEBACiAJYnQ4NzhfZGV2aWNlX2NvbnRyb2woc3RhdGUtPmJ0LCBEU1RfSUdfVFMsICZiaXRzKTsKIH0KIAotaW50IGRzdF9ncGlvX291dGIoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUsIHUzMiBtYXNrLCB1MzIgZW5iYiwgdTMyIG91dGhpZ2gsIGludCBkZWxheSkKK2ludCBkc3RfZ3Bpb19vdXRiKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCB1MzIgbWFzaywgdTMyIGVuYmIsIHUzMiBvdXRoaWdoLCBpbnQgZGVsYXkpCiB7CiAJdW5pb24gZHN0X2dwaW9fcGFja2V0IGVuYjsKIAl1bmlvbiBkc3RfZ3Bpb19wYWNrZXQgYml0czsKQEAgLTY4LDYzICs4MCw1NSBAQAogCiAJZW5iLmVuYi5tYXNrID0gbWFzazsKIAllbmIuZW5iLmVuYWJsZSA9IGVuYmI7Ci0JaWYgKHZlcmJvc2UgPiA0KQotCQlkcHJpbnRrKCIlczogbWFzaz1bJTA0eF0sIGVuYmI9WyUwNHhdLCBvdXRoaWdoPVslMDR4XVxuIiwgX19GVU5DVElPTl9fLCBtYXNrLCBlbmJiLCBvdXRoaWdoKTsKIAorCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJtYXNrPVslMDR4XSwgZW5iYj1bJTA0eF0sIG91dGhpZ2g9WyUwNHhdIiwgbWFzaywgZW5iYiwgb3V0aGlnaCk7CiAJaWYgKChlcnIgPSBidDg3OF9kZXZpY2VfY29udHJvbChzdGF0ZS0+YnQsIERTVF9JR19FTkFCTEUsICZlbmIpKSA8IDApIHsKLQkJZHByaW50aygiJXM6IGRzdF9ncGlvX2VuYiBlcnJvciAoZXJyID09ICVpLCBtYXNrID09ICUwMngsIGVuYiA9PSAlMDJ4KVxuIiwgX19GVU5DVElPTl9fLCBlcnIsIG1hc2ssIGVuYmIpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiZHN0X2dwaW9fZW5iIGVycm9yIChlcnIgPT0gJWksIG1hc2sgPT0gJTAyeCwgZW5iID09ICUwMngpIiwgZXJyLCBtYXNrLCBlbmJiKTsKIAkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQogCXVkZWxheSgxMDAwKTsKIAkvKiBiZWNhdXNlIGNvbXBsZXRlIGRpc2FibGluZyBtZWFucyBubyBvdXRwdXQsIG5vIG5lZWQgdG8gZG8gb3V0cHV0IHBhY2tldCAqLwogCWlmIChlbmJiID09IDApCiAJCXJldHVybiAwOwotCiAJaWYgKGRlbGF5KQogCQltc2xlZXAoMTApOwotCiAJYml0cy5vdXRwLm1hc2sgPSBlbmJiOwogCWJpdHMub3V0cC5oaWdodmFscyA9IG91dGhpZ2g7Ci0KIAlpZiAoKGVyciA9IGJ0ODc4X2RldmljZV9jb250cm9sKHN0YXRlLT5idCwgRFNUX0lHX1dSSVRFLCAmYml0cykpIDwgMCkgewotCQlkcHJpbnRrKCIlczogZHN0X2dwaW9fb3V0YiBlcnJvciAoZXJyID09ICVpLCBlbmJiID09ICUwMngsIG91dGhpZ2ggPT0gJTAyeClcbiIsIF9fRlVOQ1RJT05fXywgZXJyLCBlbmJiLCBvdXRoaWdoKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgImRzdF9ncGlvX291dGIgZXJyb3IgKGVyciA9PSAlaSwgZW5iYiA9PSAlMDJ4LCBvdXRoaWdoID09ICUwMngpIiwgZXJyLCBlbmJiLCBvdXRoaWdoKTsKIAkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQorCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGRzdF9ncGlvX291dGIpOwogCi1pbnQgZHN0X2dwaW9faW5iKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCB1OCAqIHJlc3VsdCkKK2ludCBkc3RfZ3Bpb19pbmIoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4ICpyZXN1bHQpCiB7CiAJdW5pb24gZHN0X2dwaW9fcGFja2V0IHJkX3BhY2tldDsKIAlpbnQgZXJyOwogCiAJKnJlc3VsdCA9IDA7Ci0KIAlpZiAoKGVyciA9IGJ0ODc4X2RldmljZV9jb250cm9sKHN0YXRlLT5idCwgRFNUX0lHX1JFQUQsICZyZF9wYWNrZXQpKSA8IDApIHsKLQkJZHByaW50aygiJXM6IGRzdF9ncGlvX2luYiBlcnJvciAoZXJyID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgImRzdF9ncGlvX2luYiBlcnJvciAoZXJyID09ICVpKVxuIiwgZXJyKTsKIAkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQotCiAJKnJlc3VsdCA9ICh1OCkgcmRfcGFja2V0LnJkLnZhbHVlOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGRzdF9ncGlvX2luYik7CiAKIGludCByZGNfcmVzZXRfc3RhdGUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7Ci0JaWYgKHZlcmJvc2UgPiAxKQotCQlkcHJpbnRrKCIlczogUmVzZXR0aW5nIHN0YXRlIG1hY2hpbmVcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiUmVzZXR0aW5nIHN0YXRlIG1hY2hpbmUiKTsKIAlpZiAoZHN0X2dwaW9fb3V0YihzdGF0ZSwgUkRDXzg4MjBfSU5ULCBSRENfODgyMF9JTlQsIDAsIE5PX0RFTEFZKSA8IDApIHsKLQkJZHByaW50aygiJXM6IGRzdF9ncGlvX291dGIgRVJST1IgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJkc3RfZ3Bpb19vdXRiIEVSUk9SICEiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQogCW1zbGVlcCgxMCk7Ci0KIAlpZiAoZHN0X2dwaW9fb3V0YihzdGF0ZSwgUkRDXzg4MjBfSU5ULCBSRENfODgyMF9JTlQsIFJEQ184ODIwX0lOVCwgTk9fREVMQVkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogZHN0X2dwaW9fb3V0YiBFUlJPUiAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgImRzdF9ncGlvX291dGIgRVJST1IgISIpOwogCQltc2xlZXAoMTApOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTM1LDE2ICsxMzksMTQgQEAKIAogaW50IHJkY184ODIwX3Jlc2V0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewotCWlmICh2ZXJib3NlID4gMSkKLQkJZHByaW50aygiJXM6IFJlc2V0dGluZyBEU1RcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMSwgIlJlc2V0dGluZyBEU1QiKTsKIAlpZiAoZHN0X2dwaW9fb3V0YihzdGF0ZSwgUkRDXzg4MjBfUkVTRVQsIFJEQ184ODIwX1JFU0VULCAwLCBOT19ERUxBWSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBkc3RfZ3Bpb19vdXRiIEVSUk9SICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiZHN0X2dwaW9fb3V0YiBFUlJPUiAhIik7CiAJCXJldHVybiAtMTsKIAl9CiAJdWRlbGF5KDEwMDApOwogCWlmIChkc3RfZ3Bpb19vdXRiKHN0YXRlLCBSRENfODgyMF9SRVNFVCwgUkRDXzg4MjBfUkVTRVQsIFJEQ184ODIwX1JFU0VULCBERUxBWSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBkc3RfZ3Bpb19vdXRiIEVSUk9SICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiZHN0X2dwaW9fb3V0YiBFUlJPUiAhIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE1NSwxMCArMTU3LDExIEBACiBpbnQgZHN0X3Bpb19lbmFibGUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CiAJaWYgKGRzdF9ncGlvX291dGIoc3RhdGUsIH4wLCBSRENfODgyMF9QSU9fMF9FTkFCTEUsIDAsIE5PX0RFTEFZKSA8IDApIHsKLQkJZHByaW50aygiJXM6IGRzdF9ncGlvX291dGIgRVJST1IgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJkc3RfZ3Bpb19vdXRiIEVSUk9SICEiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAl1ZGVsYXkoMTAwMCk7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZHN0X3Bpb19lbmFibGUpOwpAQCAtMTY2LDcgKzE2OSw3IEBACiBpbnQgZHN0X3Bpb19kaXNhYmxlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewogCWlmIChkc3RfZ3Bpb19vdXRiKHN0YXRlLCB+MCwgUkRDXzg4MjBfUElPXzBfRElTQUJMRSwgUkRDXzg4MjBfUElPXzBfRElTQUJMRSwgTk9fREVMQVkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogZHN0X2dwaW9fb3V0YiBFUlJPUiAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgImRzdF9ncGlvX291dGIgRVJST1IgISIpOwogCQlyZXR1cm4gLTE7CiAJfQogCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19GV18xKQpAQCAtMTgzLDE5ICsxODYsMTYgQEAKIAogCWZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgewogCQlpZiAoZHN0X2dwaW9faW5iKHN0YXRlLCAmcmVwbHkpIDwgMCkgewotCQkJZHByaW50aygiJXM6IGRzdF9ncGlvX2luYiBFUlJPUiAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJkc3RfZ3Bpb19pbmIgRVJST1IgISIpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0KIAkJaWYgKChyZXBseSAmIFJEQ184ODIwX1BJT18wX0VOQUJMRSkgPT0gMCkgewotCQkJaWYgKHZlcmJvc2UgPiA0KQotCQkJCWRwcmludGsoIiVzOiBkc3Qgd2FpdCByZWFkeSBhZnRlciAlZFxuIiwgX19GVU5DVElPTl9fLCBpKTsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJkc3Qgd2FpdCByZWFkeSBhZnRlciAlZCIsIGkpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAkJbXNsZWVwKDEwKTsKIAl9Ci0JaWYgKHZlcmJvc2UgPiAxKQotCQlkcHJpbnRrKCIlczogZHN0IHdhaXQgTk9UIHJlYWR5IGFmdGVyICVkXG4iLCBfX0ZVTkNUSU9OX18sIGkpOworCWRwcmludGsodmVyYm9zZSwgRFNUX05PVElDRSwgMSwgImRzdCB3YWl0IE5PVCByZWFkeSBhZnRlciAlZCIsIGkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMDMsNyArMjAzLDcgQEAKIAogaW50IGRzdF9lcnJvcl9yZWNvdmVyeShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKIHsKLQlkcHJpbnRrKCIlczogVHJ5aW5nIHRvIHJldHVybiBmcm9tIHByZXZpb3VzIGVycm9ycy4uLlxuIiwgX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9OT1RJQ0UsIDEsICJUcnlpbmcgdG8gcmV0dXJuIGZyb20gcHJldmlvdXMgZXJyb3JzLiIpOwogCWRzdF9waW9fZGlzYWJsZShzdGF0ZSk7CiAJbXNsZWVwKDEwKTsKIAlkc3RfcGlvX2VuYWJsZShzdGF0ZSk7CkBAIC0yMTUsNyArMjE1LDcgQEAKIAogaW50IGRzdF9lcnJvcl9iYWlsb3V0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewotCWRwcmludGsoIiVzOiBUcnlpbmcgdG8gYmFpbG91dCBmcm9tIHByZXZpb3VzIGVycm9yLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJUcnlpbmcgdG8gYmFpbG91dCBmcm9tIHByZXZpb3VzIGVycm9yLiIpOwogCXJkY184ODIwX3Jlc2V0KHN0YXRlKTsKIAlkc3RfcGlvX2Rpc2FibGUoc3RhdGUpOwogCW1zbGVlcCgxMCk7CkBAIC0yMjQsMTcgKzIyNCwxNSBAQAogfQogRVhQT1JUX1NZTUJPTChkc3RfZXJyb3JfYmFpbG91dCk7CiAKLQotaW50IGRzdF9jb21tX2luaXQoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUpCitpbnQgZHN0X2NvbW1faW5pdChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKIHsKLQlpZiAodmVyYm9zZSA+IDEpCi0JCWRwcmludGsgKCIlczogSW5pdGlhbGl6aW5nIERTVC4uXG4iLCBfX0ZVTkNUSU9OX18pOworCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJJbml0aWFsaXppbmcgRFNULiIpOwogCWlmICgoZHN0X3Bpb19lbmFibGUoc3RhdGUpKSA8IDApIHsKLQkJZHByaW50aygiJXM6IFBJTyBFbmFibGUgRmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJQSU8gRW5hYmxlIEZhaWxlZCIpOwogCQlyZXR1cm4gLTE7CiAJfQogCWlmICgocmRjX3Jlc2V0X3N0YXRlKHN0YXRlKSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBSREMgODgyMCBTdGF0ZSBSRVNFVCBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIlJEQyA4ODIwIFN0YXRlIFJFU0VUIEZhaWxlZC4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfRldfMSkKQEAgLTI0NiwzNiArMjQ0LDMzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGRzdF9jb21tX2luaXQpOwogCi0KIGludCB3cml0ZV9kc3Qoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4ICpkYXRhLCB1OCBsZW4pCiB7CiAJc3RydWN0IGkyY19tc2cgbXNnID0gewotCQkuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsLmZsYWdzID0gMCwuYnVmID0gZGF0YSwubGVuID0gbGVuCisJCS5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJLmZsYWdzID0gMCwKKwkJLmJ1ZiA9IGRhdGEsCisJCS5sZW4gPSBsZW4KIAl9OwogCiAJaW50IGVycjsKLQlpbnQgY250OwotCWlmIChkZWJ1ZyAmJiAodmVyYm9zZSA+IDQpKSB7Ci0JCXU4IGk7Ci0JCWlmICh2ZXJib3NlID4gNCkgewotCQkJZHByaW50aygiJXMgd3JpdGluZyBbICIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQkJZHByaW50aygiJTAyeCAiLCBkYXRhW2ldKTsKLQkJCWRwcmludGsoIl1cbiIpOwotCQl9Ci0JfQorCXU4IGNudCwgaTsKKworCWRwcmludGsodmVyYm9zZSwgRFNUX05PVElDRSwgMCwgIndyaXRpbmcgWyAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWRwcmludGsodmVyYm9zZSwgRFNUX05PVElDRSwgMCwgIiUwMnggIiwgZGF0YVtpXSk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfTk9USUNFLCAwLCAiXVxuIik7CisKIAlmb3IgKGNudCA9IDA7IGNudCA8IDI7IGNudCsrKSB7CiAJCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpKSA8IDApIHsKLQkJCWRwcmludGsoIiVzOiBfd3JpdGVfZHN0IGVycm9yIChlcnIgPT0gJWksIGxlbiA9PSAweCUwMngsIGIwID09IDB4JTAyeClcbiIsIF9fRlVOQ1RJT05fXywgZXJyLCBsZW4sIGRhdGFbMF0pOworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIl93cml0ZV9kc3QgZXJyb3IgKGVyciA9PSAlaSwgbGVuID09IDB4JTAyeCwgYjAgPT0gMHglMDJ4KSIsIGVyciwgbGVuLCBkYXRhWzBdKTsKIAkJCWRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSk7CiAJCQljb250aW51ZTsKIAkJfSBlbHNlCiAJCQlicmVhazsKIAl9Ci0KIAlpZiAoY250ID49IDIpIHsKLQkJaWYgKHZlcmJvc2UgPiAxKQotCQkJcHJpbnRrKCIlczogUkRDIDg4MjAgUkVTRVQuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJSREMgODgyMCBSRVNFVCIpOwogCQlkc3RfZXJyb3JfYmFpbG91dChzdGF0ZSk7CiAKIAkJcmV0dXJuIC0xOwpAQCAtMjg1LDM2ICsyODAsMzcgQEAKIH0KIEVYUE9SVF9TWU1CT0wod3JpdGVfZHN0KTsKIAotaW50IHJlYWRfZHN0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCB1OCAqIHJldCwgdTggbGVuKQoraW50IHJlYWRfZHN0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCB1OCAqcmV0LCB1OCBsZW4pCiB7Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywuZmxhZ3MgPSBJMkNfTV9SRCwuYnVmID0gcmV0LC5sZW4gPSBsZW4gfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJLmZsYWdzID0gSTJDX01fUkQsCisJCS5idWYgPSByZXQsCisJCS5sZW4gPSBsZW4KKwl9OworCiAJaW50IGVycjsKIAlpbnQgY250OwogCiAJZm9yIChjbnQgPSAwOyBjbnQgPCAyOyBjbnQrKykgewogCQlpZiAoKGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKSkgPCAwKSB7Ci0KLQkJCWRwcmludGsoIiVzOiByZWFkX2RzdCBlcnJvciAoZXJyID09ICVpLCBsZW4gPT0gMHglMDJ4LCBiMCA9PSAweCUwMngpXG4iLCBfX0ZVTkNUSU9OX18sIGVyciwgbGVuLCByZXRbMF0pOworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgInJlYWRfZHN0IGVycm9yIChlcnIgPT0gJWksIGxlbiA9PSAweCUwMngsIGIwID09IDB4JTAyeCkiLCBlcnIsIGxlbiwgcmV0WzBdKTsKIAkJCWRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSk7Ci0KIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UKIAkJCWJyZWFrOwogCX0KIAlpZiAoY250ID49IDIpIHsKLQkJaWYgKHZlcmJvc2UgPiAxKQotCQkJcHJpbnRrKCIlczogUkRDIDg4MjAgUkVTRVQuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJSREMgODgyMCBSRVNFVCIpOwogCQlkc3RfZXJyb3JfYmFpbG91dChzdGF0ZSk7CiAKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAoZGVidWcgJiYgKHZlcmJvc2UgPiA0KSkgewotCQlkcHJpbnRrKCIlcyByZXBseSBpcyAweCV4XG4iLCBfX0ZVTkNUSU9OX18sIHJldFswXSk7Ci0JCWZvciAoZXJyID0gMTsgZXJyIDwgbGVuOyBlcnIrKykKLQkJCWRwcmludGsoIiAweCV4IiwgcmV0W2Vycl0pOwotCQlpZiAoZXJyID4gMSkKLQkJCWRwcmludGsoIlxuIik7Ci0JfQorCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAicmVwbHkgaXMgMHgleCIsIHJldFswXSk7CisJZm9yIChlcnIgPSAxOyBlcnIgPCBsZW47IGVycisrKQorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMCwgIiAweCV4IiwgcmV0W2Vycl0pOworCWlmIChlcnIgPiAxKQorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMCwgIlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMyMywxOSArMzE5LDE2IEBACiBzdGF0aWMgaW50IGRzdF9zZXRfcG9sYXJpemF0aW9uKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewogCXN3aXRjaCAoc3RhdGUtPnZvbHRhZ2UpIHsKLQkJY2FzZSBTRUNfVk9MVEFHRV8xMzoJLy8gdmVydGljYWwKLQkJCXByaW50aygiJXM6IFBvbGFyaXphdGlvbj1bVmVydGljYWxdXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJc3RhdGUtPnR4X3R1bmFbOF0gJj0gfjB4NDA7ICAvLzEKLQkJCWJyZWFrOwotCi0JCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CS8vIGhvcml6b250YWwKLQkJCXByaW50aygiJXM6IFBvbGFyaXphdGlvbj1bSG9yaXpvbnRhbF1cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlzdGF0ZS0+dHhfdHVuYVs4XSB8PSAweDQwOyAgLy8gMAotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTRUNfVk9MVEFHRV9PRkY6Ci0KLQkJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CS8qCVZlcnRpY2FsCSovCisJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJQb2xhcml6YXRpb249W1ZlcnRpY2FsXSIpOworCQlzdGF0ZS0+dHhfdHVuYVs4XSAmPSB+MHg0MDsKKwkJYnJlYWs7CisJY2FzZSBTRUNfVk9MVEFHRV8xODoJLyoJSG9yaXpvbnRhbAkqLworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiUG9sYXJpemF0aW9uPVtIb3Jpem9udGFsXSIpOworCQlzdGF0ZS0+dHhfdHVuYVs4XSB8PSAweDQwOworCQlicmVhazsKKwljYXNlIFNFQ19WT0xUQUdFX09GRjoKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zNDQsMTQgKzMzNywxMiBAQAogc3RhdGljIGludCBkc3Rfc2V0X2ZyZXEoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHUzMiBmcmVxKQogewogCXN0YXRlLT5mcmVxdWVuY3kgPSBmcmVxOwotCWlmIChkZWJ1ZyA+IDQpCi0JCWRwcmludGsoIiVzOiBzZXQgRnJlcXVlbmN5ICV1XG4iLCBfX0ZVTkNUSU9OX18sIGZyZXEpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJzZXQgRnJlcXVlbmN5ICV1IiwgZnJlcSk7CiAKIAlpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1NBVCkgewogCQlmcmVxID0gZnJlcSAvIDEwMDA7CiAJCWlmIChmcmVxIDwgOTUwIHx8IGZyZXEgPiAyMTUwKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAkJc3RhdGUtPnR4X3R1bmFbMl0gPSAoZnJlcSA+PiA4KTsKIAkJc3RhdGUtPnR4X3R1bmFbM10gPSAodTgpIGZyZXE7CiAJCXN0YXRlLT50eF90dW5hWzRdID0gMHgwMTsKQEAgLTM2MCwyNyArMzUxLDI1IEBACiAJCQlpZiAoZnJlcSA8IDE1MzEpCiAJCQkJc3RhdGUtPnR4X3R1bmFbOF0gfD0gMHgwNDsKIAkJfQotCiAJfSBlbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfVEVSUikgewogCQlmcmVxID0gZnJlcSAvIDEwMDA7CiAJCWlmIChmcmVxIDwgMTM3MDAwIHx8IGZyZXEgPiA4NTgwMDApCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQogCQlzdGF0ZS0+dHhfdHVuYVsyXSA9IChmcmVxID4+IDE2KSAmIDB4ZmY7CiAJCXN0YXRlLT50eF90dW5hWzNdID0gKGZyZXEgPj4gOCkgJiAweGZmOwogCQlzdGF0ZS0+dHhfdHVuYVs0XSA9ICh1OCkgZnJlcTsKLQogCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0NBQkxFKSB7CisJCWZyZXEgPSBmcmVxIC8gMTAwMDsKIAkJc3RhdGUtPnR4X3R1bmFbMl0gPSAoZnJlcSA+PiAxNikgJiAweGZmOwogCQlzdGF0ZS0+dHhfdHVuYVszXSA9IChmcmVxID4+IDgpICYgMHhmZjsKIAkJc3RhdGUtPnR4X3R1bmFbNF0gPSAodTgpIGZyZXE7Ci0KIAl9IGVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkc3Rfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSwgZmVfYmFuZHdpZHRoX3QgYmFuZHdpZHRoKQorc3RhdGljIGludCBkc3Rfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgZmVfYmFuZHdpZHRoX3QgYmFuZHdpZHRoKQogewogCXN0YXRlLT5iYW5kd2lkdGggPSBiYW5kd2lkdGg7CiAKQEAgLTM4OCwxMDMgKzM3Nyw5NSBAQAogCQlyZXR1cm4gMDsKIAogCXN3aXRjaCAoYmFuZHdpZHRoKSB7Ci0JCWNhc2UgQkFORFdJRFRIXzZfTUhaOgotCQkJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX0NBKQotCQkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwNjsKLQkJCWVsc2UgewotCQkJCXN0YXRlLT50eF90dW5hWzZdID0gMHgwNjsKLQkJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDA7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEJBTkRXSURUSF83X01IWjoKLQkJCWlmIChzdGF0ZS0+ZHN0X2h3X2NhcCAmIERTVF9UWVBFX0hBU19DQSkKLQkJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDc7Ci0JCQllbHNlIHsKLQkJCQlzdGF0ZS0+dHhfdHVuYVs2XSA9IDB4MDc7Ci0JCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDAwOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBCQU5EV0lEVEhfOF9NSFo6Ci0JCQlpZiAoc3RhdGUtPmRzdF9od19jYXAgJiBEU1RfVFlQRV9IQVNfQ0EpCi0JCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDA4OwotCQkJZWxzZSB7Ci0JCQkJc3RhdGUtPnR4X3R1bmFbNl0gPSAweDA4OwotCQkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwMDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX0NBKQorCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDA2OworCQllbHNlIHsKKwkJCXN0YXRlLT50eF90dW5hWzZdID0gMHgwNjsKKwkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwMDsKKwkJfQorCQlicmVhazsKKwljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX0NBKQorCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDA3OworCQllbHNlIHsKKwkJCXN0YXRlLT50eF90dW5hWzZdID0gMHgwNzsKKwkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwMDsKKwkJfQorCQlicmVhazsKKwljYXNlIEJBTkRXSURUSF84X01IWjoKKwkJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX0NBKQorCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDA4OworCQllbHNlIHsKKwkJCXN0YXRlLT50eF90dW5hWzZdID0gMHgwODsKKwkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwMDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkc3Rfc2V0X2ludmVyc2lvbihzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSwgZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3QgaW52ZXJzaW9uKQorc3RhdGljIGludCBkc3Rfc2V0X2ludmVyc2lvbihzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3QgaW52ZXJzaW9uKQogewogCXN0YXRlLT5pbnZlcnNpb24gPSBpbnZlcnNpb247CiAJc3dpdGNoIChpbnZlcnNpb24pIHsKLQkJY2FzZSBJTlZFUlNJT05fT0ZGOgkvLyBJbnZlcnNpb24gPSBOb3JtYWwKLQkJCXN0YXRlLT50eF90dW5hWzhdICY9IH4weDgwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJTlZFUlNJT05fT046Ci0JCQlzdGF0ZS0+dHhfdHVuYVs4XSB8PSAweDgwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIElOVkVSU0lPTl9PRkY6CS8qCUludmVyc2lvbiA9IE5vcm1hbAkqLworCQlzdGF0ZS0+dHhfdHVuYVs4XSAmPSB+MHg4MDsKKwkJYnJlYWs7CisJY2FzZSBJTlZFUlNJT05fT046CisJCXN0YXRlLT50eF90dW5hWzhdIHw9IDB4ODA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzdF9zZXRfZmVjKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlLCBmZV9jb2RlX3JhdGVfdCBmZWMpCitzdGF0aWMgaW50IGRzdF9zZXRfZmVjKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBmZV9jb2RlX3JhdGVfdCBmZWMpCiB7CiAJc3RhdGUtPmZlYyA9IGZlYzsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGZlX2NvZGVfcmF0ZV90IGRzdF9nZXRfZmVjKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlKQorc3RhdGljIGZlX2NvZGVfcmF0ZV90IGRzdF9nZXRfZmVjKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewogCXJldHVybiBzdGF0ZS0+ZmVjOwogfQogCi1zdGF0aWMgaW50IGRzdF9zZXRfc3ltYm9scmF0ZShzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSwgdTMyIHNyYXRlKQorc3RhdGljIGludCBkc3Rfc2V0X3N5bWJvbHJhdGUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHUzMiBzcmF0ZSkKIHsKLQl1OCAqdmFsOwogCXUzMiBzeW1jYWxjOwogCXU2NCBzdmFsOwogCiAJc3RhdGUtPnN5bWJvbF9yYXRlID0gc3JhdGU7Ci0KIAlpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpIHsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChkZWJ1ZyA+IDQpCi0JCWRwcmludGsoIiVzOiBzZXQgc3ltcmF0ZSAldVxuIiwgX19GVU5DVElPTl9fLCBzcmF0ZSk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgInNldCBzeW1yYXRlICV1Iiwgc3JhdGUpOwogCXNyYXRlIC89IDEwMDA7Ci0JdmFsID0gJnN0YXRlLT50eF90dW5hWzBdOwotCiAJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1NZTURJVikgewogCQlzdmFsID0gc3JhdGU7CiAJCXN2YWwgPDw9IDIwOwogCQlkb19kaXYoc3ZhbCwgODgwMDApOwogCQlzeW1jYWxjID0gKHUzMikgc3ZhbDsKLQotCQlpZiAoZGVidWcgPiA0KQotCQkJZHByaW50aygiJXM6IHNldCBzeW1jYWxjICV1XG4iLCBfX0ZVTkNUSU9OX18sIHN5bWNhbGMpOwotCi0JCXZhbFs1XSA9ICh1OCkgKHN5bWNhbGMgPj4gMTIpOwotCQl2YWxbNl0gPSAodTgpIChzeW1jYWxjID4+IDQpOwotCQl2YWxbN10gPSAodTgpIChzeW1jYWxjIDw8IDQpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAic2V0IHN5bWNhbGMgJXUiLCBzeW1jYWxjKTsKKwkJc3RhdGUtPnR4X3R1bmFbNV0gPSAodTgpIChzeW1jYWxjID4+IDEyKTsKKwkJc3RhdGUtPnR4X3R1bmFbNl0gPSAodTgpIChzeW1jYWxjID4+IDQpOworCQlzdGF0ZS0+dHhfdHVuYVs3XSA9ICh1OCkgKHN5bWNhbGMgPDwgNCk7CiAJfSBlbHNlIHsKLQkJdmFsWzVdID0gKHU4KSAoc3JhdGUgPj4gMTYpICYgMHg3ZjsKLQkJdmFsWzZdID0gKHU4KSAoc3JhdGUgPj4gOCk7Ci0JCXZhbFs3XSA9ICh1OCkgc3JhdGU7CisJCXN0YXRlLT50eF90dW5hWzVdID0gKHU4KSAoc3JhdGUgPj4gMTYpICYgMHg3ZjsKKwkJc3RhdGUtPnR4X3R1bmFbNl0gPSAodTgpIChzcmF0ZSA+PiA4KTsKKwkJc3RhdGUtPnR4X3R1bmFbN10gPSAodTgpIHNyYXRlOwogCX0KLQl2YWxbOF0gJj0gfjB4MjA7Ci0JaWYgKHNyYXRlID4gODAwMCkKLQkJdmFsWzhdIHw9IDB4MjA7CisJc3RhdGUtPnR4X3R1bmFbOF0gJj0gfjB4MjA7CisJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX09CU19SRUdTKSB7CisJCWlmIChzcmF0ZSA+IDgwMDApCisJCQlzdGF0ZS0+dHhfdHVuYVs4XSB8PSAweDIwOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDk2LDMyICs0NzcsMjcgQEAKIAogCXN0YXRlLT5tb2R1bGF0aW9uID0gbW9kdWxhdGlvbjsKIAlzd2l0Y2ggKG1vZHVsYXRpb24pIHsKLQkJY2FzZSBRQU1fMTY6Ci0JCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4MTA7Ci0JCQlicmVhazsKLQotCQljYXNlIFFBTV8zMjoKLQkJCXN0YXRlLT50eF90dW5hWzhdID0gMHgyMDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUUFNXzY0OgotCQkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweDQwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBRQU1fMTI4OgotCQkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweDgwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBRQU1fMjU2OgotCQkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweDAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBRUFNLOgotCQljYXNlIFFBTV9BVVRPOgotCQljYXNlIFZTQl84OgotCQljYXNlIFZTQl8xNjoKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOworCWNhc2UgUUFNXzE2OgorCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4MTA7CisJCWJyZWFrOworCWNhc2UgUUFNXzMyOgorCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4MjA7CisJCWJyZWFrOworCWNhc2UgUUFNXzY0OgorCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4NDA7CisJCWJyZWFrOworCWNhc2UgUUFNXzEyODoKKwkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweDgwOworCQlicmVhazsKKwljYXNlIFFBTV8yNTY6CisJCXN0YXRlLT50eF90dW5hWzhdID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSBRUFNLOgorCWNhc2UgUUFNX0FVVE86CisJY2FzZSBWU0JfODoKKwljYXNlIFZTQl8xNjoKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKIAogCX0KIApAQCAtNTM0LDcgKzUxMCw3IEBACiB9CiAKIAotdTggZHN0X2NoZWNrX3N1bSh1OCAqIGJ1ZiwgdTMyIGxlbikKK3U4IGRzdF9jaGVja19zdW0odTggKmJ1ZiwgdTMyIGxlbikKIHsKIAl1MzIgaTsKIAl1OCB2YWwgPSAwOwpAQCAtNTQ5LDI2ICs1MjUsMjQgQEAKIAogc3RhdGljIHZvaWQgZHN0X3R5cGVfZmxhZ3NfcHJpbnQodTMyIHR5cGVfZmxhZ3MpCiB7Ci0JcHJpbnRrKCJEU1QgdHlwZSBmbGFncyA6Iik7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDAsICJEU1QgdHlwZSBmbGFncyA6Iik7CiAJaWYgKHR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTkVXVFVORSkKLQkJcHJpbnRrKCIgMHgleCBuZXd0dW5lciIsIERTVF9UWVBFX0hBU19ORVdUVU5FKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDAsICIgMHgleCBuZXd0dW5lciIsIERTVF9UWVBFX0hBU19ORVdUVU5FKTsKIAlpZiAodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19UUzIwNCkKLQkJcHJpbnRrKCIgMHgleCB0czIwNCIsIERTVF9UWVBFX0hBU19UUzIwNCk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAwLCAiIDB4JXggdHMyMDQiLCBEU1RfVFlQRV9IQVNfVFMyMDQpOwogCWlmICh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1NZTURJVikKLQkJcHJpbnRrKCIgMHgleCBzeW1kaXYiLCBEU1RfVFlQRV9IQVNfU1lNRElWKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDAsICIgMHgleCBzeW1kaXYiLCBEU1RfVFlQRV9IQVNfU1lNRElWKTsKIAlpZiAodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19GV18xKQotCQlwcmludGsoIiAweCV4IGZpcm13YXJlIHZlcnNpb24gPSAxIiwgRFNUX1RZUEVfSEFTX0ZXXzEpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIiAweCV4IGZpcm13YXJlIHZlcnNpb24gPSAxIiwgRFNUX1RZUEVfSEFTX0ZXXzEpOwogCWlmICh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXXzIpCi0JCXByaW50aygiIDB4JXggZmlybXdhcmUgdmVyc2lvbiA9IDIiLCBEU1RfVFlQRV9IQVNfRldfMik7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAwLCAiIDB4JXggZmlybXdhcmUgdmVyc2lvbiA9IDIiLCBEU1RfVFlQRV9IQVNfRldfMik7CiAJaWYgKHR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfRldfMykKLQkJcHJpbnRrKCIgMHgleCBmaXJtd2FyZSB2ZXJzaW9uID0gMyIsIERTVF9UWVBFX0hBU19GV18zKTsKLS8vCWlmICgodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19GV19CVUlMRCkgJiYgbmV3X2Z3KQotCi0JcHJpbnRrKCJcbiIpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIiAweCV4IGZpcm13YXJlIHZlcnNpb24gPSAzIiwgRFNUX1RZUEVfSEFTX0ZXXzMpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAwLCAiXG4iKTsKIH0KIAogCi1zdGF0aWMgaW50IGRzdF90eXBlX3ByaW50ICh1OCB0eXBlKQorc3RhdGljIGludCBkc3RfdHlwZV9wcmludCh1OCB0eXBlKQogewogCWNoYXIgKm90eXBlOwogCXN3aXRjaCAodHlwZSkgewpAQCAtNTg1LDEwICs1NTksMTAgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoIiVzOiBpbnZhbGlkIGRzdCB0eXBlICVkXG4iLCBfX0ZVTkNUSU9OX18sIHR5cGUpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiaW52YWxpZCBkc3QgdHlwZSAlZCIsIHR5cGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcHJpbnRrKCJEU1QgdHlwZSA6ICVzXG4iLCBvdHlwZSk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIkRTVCB0eXBlOiAlcyIsIG90eXBlKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzAwLDcgKzY3NCw3IEBACiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19DQUJMRSwKIAkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfTkVXVFVORSB8IERTVF9UWVBFX0hBU19GV18xCi0JCQkJCQkJfCBEU1RfVFlQRV9IQVNfRldfMiB8IERTVF9UWVBFX0hBU19GV19CVUlMRCwKKwkJCQkJCQl8IERTVF9UWVBFX0hBU19GV18yLAogCQkuZHN0X2ZlYXR1cmUgPSBEU1RfVFlQRV9IQVNfQ0EKIAl9LAogCkBAIC03MDgsNyArNjgyLDcgQEAKIAkJLmRldmljZV9pZCA9ICJEQ1RORVciLAogCQkub2Zmc2V0ID0gMSwKIAkJLmRzdF90eXBlID0gRFNUX1RZUEVfSVNfQ0FCTEUsCi0JCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX05FV1RVTkUgfCBEU1RfVFlQRV9IQVNfRldfMywKKwkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfTkVXVFVORSB8IERTVF9UWVBFX0hBU19GV18zIHwgRFNUX1RZUEVfSEFTX0ZXX0JVSUxELAogCQkuZHN0X2ZlYXR1cmUgPSAwCiAJfSwKIApAQCAtNzE2LDcgKzY5MCw3IEBACiAJCS5kZXZpY2VfaWQgPSAiRFRULUNJIiwKIAkJLm9mZnNldCA9IDEsCiAJCS5kc3RfdHlwZSA9IERTVF9UWVBFX0lTX1RFUlIsCi0JCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1RTMjA0IHwgRFNUX1RZUEVfSEFTX0ZXXzIgfCBEU1RfVFlQRV9IQVNfRldfQlVJTEQsCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1RTMjA0IHwgRFNUX1RZUEVfSEFTX0ZXXzIsCiAJCS5kc3RfZmVhdHVyZSA9IDAKIAl9LAogCkBAIC03NTYsNiArNzMwLDcxIEBACiAKIH07CiAKK3N0YXRpYyBpbnQgZHN0X2dldF9tYWMoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCit7CisJdTggZ2V0X21hY1tdID0geyAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisJZ2V0X21hY1s3XSA9IGRzdF9jaGVja19zdW0oZ2V0X21hYywgNyk7CisJaWYgKGRzdF9jb21tYW5kKHN0YXRlLCBnZXRfbWFjLCA4KSA8IDApIHsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIlVuc3VwcG9ydGVkIENvbW1hbmQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQoJnN0YXRlLT5tYWNfYWRkcmVzcywgJ1wwJywgOCk7CisJbWVtY3B5KCZzdGF0ZS0+bWFjX2FkZHJlc3MsICZzdGF0ZS0+cnhidWZmZXIsIDYpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiTUFDIEFkZHJlc3M9WyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XSIsCisJCXN0YXRlLT5tYWNfYWRkcmVzc1swXSwgc3RhdGUtPm1hY19hZGRyZXNzWzFdLCBzdGF0ZS0+bWFjX2FkZHJlc3NbMl0sCisJCXN0YXRlLT5tYWNfYWRkcmVzc1s0XSwgc3RhdGUtPm1hY19hZGRyZXNzWzVdLCBzdGF0ZS0+bWFjX2FkZHJlc3NbNl0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHN0X2Z3X3ZlcihzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKK3sKKwl1OCBnZXRfdmVyW10gPSB7IDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwlnZXRfdmVyWzddID0gZHN0X2NoZWNrX3N1bShnZXRfdmVyLCA3KTsKKwlpZiAoZHN0X2NvbW1hbmQoc3RhdGUsIGdldF92ZXIsIDgpIDwgMCkgeworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiVW5zdXBwb3J0ZWQgQ29tbWFuZCIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldCgmc3RhdGUtPmZ3X3ZlcnNpb24sICdcMCcsIDgpOworCW1lbWNweSgmc3RhdGUtPmZ3X3ZlcnNpb24sICZzdGF0ZS0+cnhidWZmZXIsIDgpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiRmlybXdhcmUgVmVyID0gJXguJXggQnVpbGQgPSAlMDJ4LCBvbiAleDoleCwgJXgtJXgtMjAlMDJ4IiwKKwkJc3RhdGUtPmZ3X3ZlcnNpb25bMF0gPj4gNCwgc3RhdGUtPmZ3X3ZlcnNpb25bMF0gJiAweDBmLAorCQlzdGF0ZS0+ZndfdmVyc2lvblsxXSwKKwkJc3RhdGUtPmZ3X3ZlcnNpb25bNV0sIHN0YXRlLT5md192ZXJzaW9uWzZdLAorCQlzdGF0ZS0+ZndfdmVyc2lvbls0XSwgc3RhdGUtPmZ3X3ZlcnNpb25bM10sIHN0YXRlLT5md192ZXJzaW9uWzJdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzdF9jYXJkX3R5cGUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCit7CisJdTggZ2V0X3R5cGVbXSA9IHsgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCWdldF90eXBlWzddID0gZHN0X2NoZWNrX3N1bShnZXRfdHlwZSwgNyk7CisJaWYgKGRzdF9jb21tYW5kKHN0YXRlLCBnZXRfdHlwZSwgOCkgPCAwKSB7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJVbnN1cHBvcnRlZCBDb21tYW5kIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KCZzdGF0ZS0+Y2FyZF9pbmZvLCAnXDAnLCA4KTsKKwltZW1jcHkoJnN0YXRlLT5jYXJkX2luZm8sICZzdGF0ZS0+cnhidWZmZXIsIDgpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiRGV2aWNlIE1vZGVsPVslc10iLCAmc3RhdGUtPmNhcmRfaW5mb1swXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc3RfZ2V0X3ZlbmRvcihzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKK3sKKwl1OCBnZXRfdmVuZG9yW10gPSB7IDB4MDAsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwlnZXRfdmVuZG9yWzddID0gZHN0X2NoZWNrX3N1bShnZXRfdmVuZG9yLCA3KTsKKwlpZiAoZHN0X2NvbW1hbmQoc3RhdGUsIGdldF92ZW5kb3IsIDgpIDwgMCkgeworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiVW5zdXBwb3J0ZWQgQ29tbWFuZCIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldCgmc3RhdGUtPnZlbmRvciwgJ1wwJywgOCk7CisJbWVtY3B5KCZzdGF0ZS0+dmVuZG9yLCAmc3RhdGUtPnJ4YnVmZmVyLCA4KTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIlZlbmRvcj1bJXNdIiwgJnN0YXRlLT52ZW5kb3JbMF0pOworCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbnQgZHN0X2dldF9kZXZpY2VfaWQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CkBAIC03NzIsNTMgKzgxMSw0NSBAQAogCiAJaWYgKHdyaXRlX2RzdChzdGF0ZSwgZGV2aWNlX3R5cGUsIEZJWEVEX0NPTU0pKQogCQlyZXR1cm4gLTE7CQkvKglXcml0ZSBmYWlsZWQJCSovCi0KIAlpZiAoKGRzdF9waW9fZGlzYWJsZShzdGF0ZSkpIDwgMCkKIAkJcmV0dXJuIC0xOwotCiAJaWYgKHJlYWRfZHN0KHN0YXRlLCAmcmVwbHksIEdFVF9BQ0spKQogCQlyZXR1cm4gLTE7CQkvKglSZWFkIGZhaWx1cmUJCSovCi0KIAlpZiAocmVwbHkgIT0gQUNLKSB7Ci0JCWRwcmludGsoIiVzOiBXcml0ZSBub3QgQWNrbm93bGVkZ2VkISBbUmVwbHk9MHglMDJ4XVxuIiwgX19GVU5DVElPTl9fLCByZXBseSk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJXcml0ZSBub3QgQWNrbm93bGVkZ2VkISBbUmVwbHk9MHglMDJ4XSIsIHJlcGx5KTsKIAkJcmV0dXJuIC0xOwkJLyoJVW5hY2snZCB3cml0ZQkJKi8KIAl9Ci0KIAlpZiAoIWRzdF93YWl0X2RzdF9yZWFkeShzdGF0ZSwgREVWSUNFX0lOSVQpKQogCQlyZXR1cm4gLTE7CQkvKglEU1Qgbm90IHJlYWR5IHlldAkqLwotCiAJaWYgKHJlYWRfZHN0KHN0YXRlLCBzdGF0ZS0+cnhidWZmZXIsIEZJWEVEX0NPTU0pKQogCQlyZXR1cm4gLTE7CiAKIAlkc3RfcGlvX2Rpc2FibGUoc3RhdGUpOwotCiAJaWYgKHN0YXRlLT5yeGJ1ZmZlcls3XSAhPSBkc3RfY2hlY2tfc3VtKHN0YXRlLT5yeGJ1ZmZlciwgNykpIHsKLQkJZHByaW50aygiJXM6IENoZWNrc3VtIGZhaWx1cmUhIFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIkNoZWNrc3VtIGZhaWx1cmUhIik7CiAJCXJldHVybiAtMTsJCS8qCUNoZWNrc3VtIGZhaWx1cmUJKi8KIAl9Ci0KIAlzdGF0ZS0+cnhidWZmZXJbN10gPSAnXDAnOwogCi0JZm9yIChpID0gMCwgcF9kc3RfdHlwZSA9IGRzdF90bGlzdDsgaSA8IEFSUkFZX1NJWkUgKGRzdF90bGlzdCk7IGkrKywgcF9kc3RfdHlwZSsrKSB7CisJZm9yIChpID0gMCwgcF9kc3RfdHlwZSA9IGRzdF90bGlzdDsgaSA8IEFSUkFZX1NJWkUoZHN0X3RsaXN0KTsgaSsrLCBwX2RzdF90eXBlKyspIHsKIAkJaWYgKCFzdHJuY21wICgmc3RhdGUtPnJ4YnVmZmVyW3BfZHN0X3R5cGUtPm9mZnNldF0sIHBfZHN0X3R5cGUtPmRldmljZV9pZCwgc3RybGVuIChwX2RzdF90eXBlLT5kZXZpY2VfaWQpKSkgewogCQkJdXNlX3R5cGVfZmxhZ3MgPSBwX2RzdF90eXBlLT50eXBlX2ZsYWdzOwogCQkJdXNlX2RzdF90eXBlID0gcF9kc3RfdHlwZS0+ZHN0X3R5cGU7CiAKIAkJCS8qCUNhcmQgY2FwYWJpbGl0aWVzCSovCiAJCQlzdGF0ZS0+ZHN0X2h3X2NhcCA9IHBfZHN0X3R5cGUtPmRzdF9mZWF0dXJlOwotCQkJcHJpbnRrICgiJXM6IFJlY29nbmlzZSBbJXNdXG4iLCBfX0ZVTkNUSU9OX18sIHBfZHN0X3R5cGUtPmRldmljZV9pZCk7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIlJlY29nbmlzZSBbJXNdXG4iLCBwX2RzdF90eXBlLT5kZXZpY2VfaWQpOwogCiAJCQlicmVhazsKIAkJfQogCX0KIAogCWlmIChpID49IHNpemVvZiAoZHN0X3RsaXN0KSAvIHNpemVvZiAoZHN0X3RsaXN0IFswXSkpIHsKLQkJcHJpbnRrKCIlczogVW5hYmxlIHRvIHJlY29nbml6ZSAlcyBvciAlc1xuIiwgX19GVU5DVElPTl9fLCAmc3RhdGUtPnJ4YnVmZmVyWzBdLCAmc3RhdGUtPnJ4YnVmZmVyWzFdKTsKLQkJcHJpbnRrKCIlczogcGxlYXNlIGVtYWlsIGxpbnV4LWR2YkBsaW51eHR2Lm9yZyB3aXRoIHRoaXMgdHlwZSBpblxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJVbmFibGUgdG8gcmVjb2duaXplICVzIG9yICVzIiwgJnN0YXRlLT5yeGJ1ZmZlclswXSwgJnN0YXRlLT5yeGJ1ZmZlclsxXSk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAicGxlYXNlIGVtYWlsIGxpbnV4LWR2YkBsaW51eHR2Lm9yZyB3aXRoIHRoaXMgdHlwZSBpbiIpOwogCQl1c2VfZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQ7CiAJCXVzZV90eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJVjsKIAl9Ci0KIAlkc3RfdHlwZV9wcmludCh1c2VfZHN0X3R5cGUpOwogCXN0YXRlLT50eXBlX2ZsYWdzID0gdXNlX3R5cGVfZmxhZ3M7CiAJc3RhdGUtPmRzdF90eXBlID0gdXNlX2RzdF90eXBlOwpAQCAtODM0LDcgKzg2NSw3IEBACiBzdGF0aWMgaW50IGRzdF9wcm9iZShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKIHsKIAlpZiAoKHJkY184ODIwX3Jlc2V0KHN0YXRlKSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBSREMgODgyMCBSRVNFVCBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIlJEQyA4ODIwIFJFU0VUIEZhaWxlZC4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAoZHN0X2FkZG9ucyAmIERTVF9UWVBFX0hBU19DQSkKQEAgLTg0Myw4MCArODc0LDg3IEBACiAJCW1zbGVlcCgxMDApOwogCiAJaWYgKChkc3RfY29tbV9pbml0KHN0YXRlKSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBEU1QgSW5pdGlhbGl6YXRpb24gRmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJEU1QgSW5pdGlhbGl6YXRpb24gRmFpbGVkLiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCW1zbGVlcCgxMDApOwogCWlmIChkc3RfZ2V0X2RldmljZV9pZChzdGF0ZSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiB1bmtub3duIGRldmljZS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAidW5rbm93biBkZXZpY2UuIik7CiAJCXJldHVybiAtMTsKIAl9CisJaWYgKGRzdF9nZXRfbWFjKHN0YXRlKSA8IDApIHsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIk1BQzogVW5zdXBwb3J0ZWQgY29tbWFuZCIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXX0JVSUxEKSB7CisJCWlmIChkc3RfZndfdmVyKHN0YXRlKSA8IDApIHsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJGVzogVW5zdXBwb3J0ZWQgY29tbWFuZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGRzdF9jYXJkX3R5cGUoc3RhdGUpIDwgMCkgeworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIkNhcmQ6IFVuc3VwcG9ydGVkIGNvbW1hbmQiKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChkc3RfZ2V0X3ZlbmRvcihzdGF0ZSkgPCAwKSB7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiVmVuZG9yOiBVbnN1cHBvcnRlZCBjb21tYW5kIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KIAogCXJldHVybiAwOwogfQogCi1pbnQgZHN0X2NvbW1hbmQoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUsIHU4ICogZGF0YSwgdTggbGVuKQoraW50IGRzdF9jb21tYW5kKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCB1OCAqZGF0YSwgdTggbGVuKQogewogCXU4IHJlcGx5OwogCWlmICgoZHN0X2NvbW1faW5pdChzdGF0ZSkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogRFNUIENvbW11bmljYXRpb24gSW5pdGlhbGl6YXRpb24gRmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfTk9USUNFLCAxLCAiRFNUIENvbW11bmljYXRpb24gSW5pdGlhbGl6YXRpb24gRmFpbGVkLiIpOwogCQlyZXR1cm4gLTE7CiAJfQotCiAJaWYgKHdyaXRlX2RzdChzdGF0ZSwgZGF0YSwgbGVuKSkgewotCQlpZiAodmVyYm9zZSA+IDEpCi0JCQlkcHJpbnRrKCIlczogVHJpbmcgdG8gcmVjb3Zlci4uIFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIlRyaW5nIHRvIHJlY292ZXIuLiAiKTsKIAkJaWYgKChkc3RfZXJyb3JfcmVjb3Zlcnkoc3RhdGUpKSA8IDApIHsKLQkJCWRwcmludGsoIiVzOiBSZWNvdmVyeSBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJSZWNvdmVyeSBGYWlsZWQuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAoKGRzdF9waW9fZGlzYWJsZShzdGF0ZSkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogUElPIERpc2FibGUgRmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJQSU8gRGlzYWJsZSBGYWlsZWQuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXXzEpCiAJCXVkZWxheSgzMDAwKTsKLQogCWlmIChyZWFkX2RzdChzdGF0ZSwgJnJlcGx5LCBHRVRfQUNLKSkgewotCQlpZiAodmVyYm9zZSA+IDEpCi0JCQlkcHJpbnRrKCIlczogVHJ5aW5nIHRvIHJlY292ZXIuLiBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAiVHJ5aW5nIHRvIHJlY292ZXIuLiAiKTsKIAkJaWYgKChkc3RfZXJyb3JfcmVjb3Zlcnkoc3RhdGUpKSA8IDApIHsKLQkJCWRwcmludGsoIiVzOiBSZWNvdmVyeSBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIlJlY292ZXJ5IEZhaWxlZC4iKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQlyZXR1cm4gLTE7CiAJfQotCiAJaWYgKHJlcGx5ICE9IEFDSykgewotCQlkcHJpbnRrKCIlczogd3JpdGUgbm90IGFja25vd2xlZGdlZCAweCUwMnggXG4iLCBfX0ZVTkNUSU9OX18sIHJlcGx5KTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIndyaXRlIG5vdCBhY2tub3dsZWRnZWQgMHglMDJ4ICIsIHJlcGx5KTsKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAobGVuID49IDIgJiYgZGF0YVswXSA9PSAwICYmIChkYXRhWzFdID09IDEgfHwgZGF0YVsxXSA9PSAzKSkKIAkJcmV0dXJuIDA7Ci0KLS8vCXVkZWxheSgzMDAwKTsKIAlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfRldfMSkKIAkJdWRlbGF5KDMwMDApOwogCWVsc2UKIAkJdWRlbGF5KDIwMDApOwotCiAJaWYgKCFkc3Rfd2FpdF9kc3RfcmVhZHkoc3RhdGUsIE5PX0RFTEFZKSkKIAkJcmV0dXJuIC0xOwotCiAJaWYgKHJlYWRfZHN0KHN0YXRlLCBzdGF0ZS0+cnhidWZmZXIsIEZJWEVEX0NPTU0pKSB7Ci0JCWlmICh2ZXJib3NlID4gMSkKLQkJCWRwcmludGsoIiVzOiBUcnlpbmcgdG8gcmVjb3Zlci4uIFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJUcnlpbmcgdG8gcmVjb3Zlci4uICIpOwogCQlpZiAoKGRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSkpIDwgMCkgewotCQkJZHByaW50aygiJXM6IFJlY292ZXJ5IGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiUmVjb3ZlcnkgZmFpbGVkLiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCXJldHVybiAtMTsKIAl9Ci0KIAlpZiAoc3RhdGUtPnJ4YnVmZmVyWzddICE9IGRzdF9jaGVja19zdW0oc3RhdGUtPnJ4YnVmZmVyLCA3KSkgewotCQlkcHJpbnRrKCIlczogY2hlY2tzdW0gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgImNoZWNrc3VtIGZhaWx1cmUiKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtOTI0LDExICs5NjIsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHN0X2NvbW1hbmQpOwogCi1zdGF0aWMgaW50IGRzdF9nZXRfc2lnbmFsKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlKQorc3RhdGljIGludCBkc3RfZ2V0X3NpZ25hbChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKIHsKIAlpbnQgcmV0dmFsOwogCXU4IGdldF9zaWduYWxbXSA9IHsgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYiB9OwotCWRwcmludGsoIiVzOiBHZXR0aW5nIFNpZ25hbCBzdHJlbmd0aCBhbmQgb3RoZXIgcGFyYW1ldGVyc1xuIiwgX19GVU5DVElPTl9fKTsKKwkvL2RwcmludGsoIiVzOiBHZXR0aW5nIFNpZ25hbCBzdHJlbmd0aCBhbmQgb3RoZXIgcGFyYW1ldGVyc1xuIiwgX19GVU5DVElPTl9fKTsKIAlpZiAoKHN0YXRlLT5kaXNlcV9mbGFncyAmIEFUVEVNUFRfVFVORSkgPT0gMCkgewogCQlzdGF0ZS0+ZGVjb2RlX2xvY2sgPSBzdGF0ZS0+ZGVjb2RlX3N0cmVuZ3RoID0gc3RhdGUtPmRlY29kZV9zbnIgPSAwOwogCQlyZXR1cm4gMDsKQEAgLTk1NSwxMyArOTkzLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X3RvbmVfcG93ZXJfY21kKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlKQorc3RhdGljIGludCBkc3RfdG9uZV9wb3dlcl9jbWQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CiAJdTggcGFrZXRbOF0gPSB7IDB4MDAsIDB4MDksIDB4ZmYsIDB4ZmYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAgfTsKIAogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfVEVSUikKIAkJcmV0dXJuIDA7Ci0KIAlwYWtldFs0XSA9IHN0YXRlLT50eF90dW5hWzRdOwogCXBha2V0WzJdID0gc3RhdGUtPnR4X3R1bmFbMl07CiAJcGFrZXRbM10gPSBzdGF0ZS0+dHhfdHVuYVszXTsKQEAgLTk3MSw2MSArMTAwOCw1MyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzdF9nZXRfdHVuYShzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSkKK3N0YXRpYyBpbnQgZHN0X2dldF90dW5hKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewogCWludCByZXR2YWw7CiAKIAlpZiAoKHN0YXRlLT5kaXNlcV9mbGFncyAmIEFUVEVNUFRfVFVORSkgPT0gMCkKIAkJcmV0dXJuIDA7Ci0KIAlzdGF0ZS0+ZGlzZXFfZmxhZ3MgJj0gfihIQVNfTE9DSyk7CiAJaWYgKCFkc3Rfd2FpdF9kc3RfcmVhZHkoc3RhdGUsIE5PX0RFTEFZKSkKIAkJcmV0dXJuIDA7Ci0KLQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTkVXVFVORSkgeworCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKQogCQkvKiBob3cgdG8gZ2V0IHZhcmlhYmxlIGxlbmd0aCByZXBseSA/Pz8/ICovCiAJCXJldHZhbCA9IHJlYWRfZHN0KHN0YXRlLCBzdGF0ZS0+cnhfdHVuYSwgMTApOwotCX0gZWxzZSB7CisJZWxzZQogCQlyZXR2YWwgPSByZWFkX2RzdChzdGF0ZSwgJnN0YXRlLT5yeF90dW5hWzJdLCBGSVhFRF9DT01NKTsKLQl9Ci0KIAlpZiAocmV0dmFsIDwgMCkgewotCQlkcHJpbnRrKCIlczogcmVhZCBub3Qgc3VjY2Vzc2Z1bFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJyZWFkIG5vdCBzdWNjZXNzZnVsIik7CiAJCXJldHVybiAwOwogCX0KLQogCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKSB7CiAJCWlmIChzdGF0ZS0+cnhfdHVuYVs5XSAhPSBkc3RfY2hlY2tfc3VtKCZzdGF0ZS0+cnhfdHVuYVswXSwgOSkpIHsKLQkJCWRwcmludGsoIiVzOiBjaGVja3N1bSBmYWlsdXJlP1xuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJjaGVja3N1bSBmYWlsdXJlID8gIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0gZWxzZSB7CiAJCWlmIChzdGF0ZS0+cnhfdHVuYVs5XSAhPSBkc3RfY2hlY2tfc3VtKCZzdGF0ZS0+cnhfdHVuYVsyXSwgNykpIHsKLQkJCWRwcmludGsoIiVzOiBjaGVja3N1bSBmYWlsdXJlP1xuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJjaGVja3N1bSBmYWlsdXJlPyAiKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCWlmIChzdGF0ZS0+cnhfdHVuYVsyXSA9PSAwICYmIHN0YXRlLT5yeF90dW5hWzNdID09IDApCiAJCXJldHVybiAwOwogCXN0YXRlLT5kZWNvZGVfZnJlcSA9ICgoc3RhdGUtPnJ4X3R1bmFbMl0gJiAweDdmKSA8PCA4KSArIHN0YXRlLT5yeF90dW5hWzNdOwotCiAJc3RhdGUtPmRlY29kZV9sb2NrID0gMTsKIAlzdGF0ZS0+ZGlzZXFfZmxhZ3MgfD0gSEFTX0xPQ0s7CiAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBkc3Rfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSk7CitzdGF0aWMgaW50IGRzdF9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKTsKIAotc3RhdGljIGludCBkc3Rfd3JpdGVfdHVuYShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3N0YXRpYyBpbnQgZHN0X3dyaXRlX3R1bmEoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7Ci0Jc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCByZXR2YWw7CiAJdTggcmVwbHk7CiAKLQlpZiAoZGVidWcgPiA0KQotCQlkcHJpbnRrKCIlczogdHlwZV9mbGFncyAweCV4IFxuIiwgX19GVU5DVElPTl9fLCBzdGF0ZS0+dHlwZV9mbGFncyk7Ci0KKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAidHlwZV9mbGFncyAweCV4ICIsIHN0YXRlLT50eXBlX2ZsYWdzKTsKIAlzdGF0ZS0+ZGVjb2RlX2ZyZXEgPSAwOwogCXN0YXRlLT5kZWNvZGVfbG9jayA9IHN0YXRlLT5kZWNvZGVfc3RyZW5ndGggPSBzdGF0ZS0+ZGVjb2RlX3NuciA9IDA7CiAJaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19TQVQpIHsKQEAgLTEwMzUsMzUgKzEwNjQsMzEgQEAKIAlzdGF0ZS0+ZGlzZXFfZmxhZ3MgJj0gfihIQVNfTE9DSyB8IEFUVEVNUFRfVFVORSk7CiAKIAlpZiAoKGRzdF9jb21tX2luaXQoc3RhdGUpKSA8IDApIHsKLQkJZHByaW50aygiJXM6IERTVCBDb21tdW5pY2F0aW9uIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAiRFNUIENvbW11bmljYXRpb24gaW5pdGlhbGl6YXRpb24gZmFpbGVkLiIpOwogCQlyZXR1cm4gLTE7CiAJfQotCiAJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpIHsKIAkJc3RhdGUtPnR4X3R1bmFbOV0gPSBkc3RfY2hlY2tfc3VtKCZzdGF0ZS0+dHhfdHVuYVswXSwgOSk7CiAJCXJldHZhbCA9IHdyaXRlX2RzdChzdGF0ZSwgJnN0YXRlLT50eF90dW5hWzBdLCAxMCk7Ci0KIAl9IGVsc2UgewogCQlzdGF0ZS0+dHhfdHVuYVs5XSA9IGRzdF9jaGVja19zdW0oJnN0YXRlLT50eF90dW5hWzJdLCA3KTsKIAkJcmV0dmFsID0gd3JpdGVfZHN0KHN0YXRlLCAmc3RhdGUtPnR4X3R1bmFbMl0sIEZJWEVEX0NPTU0pOwogCX0KIAlpZiAocmV0dmFsIDwgMCkgewogCQlkc3RfcGlvX2Rpc2FibGUoc3RhdGUpOwotCQlkcHJpbnRrKCIlczogd3JpdGUgbm90IHN1Y2Nlc3NmdWxcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAid3JpdGUgbm90IHN1Y2Nlc3NmdWwiKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9Ci0KIAlpZiAoKGRzdF9waW9fZGlzYWJsZShzdGF0ZSkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogRFNUIFBJTyBkaXNhYmxlIGZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMSwgIkRTVCBQSU8gZGlzYWJsZSBmYWlsZWQgISIpOwogCQlyZXR1cm4gLTE7CiAJfQotCiAJaWYgKChyZWFkX2RzdChzdGF0ZSwgJnJlcGx5LCBHRVRfQUNLKSA8IDApKSB7Ci0JCWRwcmludGsoIiVzOiByZWFkIHZlcmlmeSBub3Qgc3VjY2Vzc2Z1bC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAicmVhZCB2ZXJpZnkgbm90IHN1Y2Nlc3NmdWwuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJaWYgKHJlcGx5ICE9IEFDSykgewotCQlkcHJpbnRrKCIlczogd3JpdGUgbm90IGFja25vd2xlZGdlZCAweCUwMnggXG4iLCBfX0ZVTkNUSU9OX18sIHJlcGx5KTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJ3cml0ZSBub3QgYWNrbm93bGVkZ2VkIDB4JTAyeCAiLCByZXBseSk7CiAJCXJldHVybiAwOwogCX0KIAlzdGF0ZS0+ZGlzZXFfZmxhZ3MgfD0gQVRURU1QVF9UVU5FOwpAQCAtMTA4NSwxNCArMTExMCwxMyBAQAogICogRGlzZXFjIDQgICAgMHgwMCwgMHgwOCwgMHgwNCwgMHhlMCwgMHgxMCwgMHgzOCwgMHhmYywgMHhlMAogICovCiAKLXN0YXRpYyBpbnQgZHN0X3NldF9kaXNlcWMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQqIGNtZCkKK3N0YXRpYyBpbnQgZHN0X3NldF9kaXNlcWMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggcGFrZXRbOF0gPSB7IDB4MDAsIDB4MDgsIDB4MDQsIDB4ZTAsIDB4MTAsIDB4MzgsIDB4ZjAsIDB4ZWMgfTsKIAogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgIT0gRFNUX1RZUEVfSVNfU0FUKQogCQlyZXR1cm4gMDsKLQogCWlmIChjbWQtPm1zZ19sZW4gPT0gMCB8fCBjbWQtPm1zZ19sZW4gPiA0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAltZW1jcHkoJnBha2V0WzNdLCBjbWQtPm1zZywgY21kLT5tc2dfbGVuKTsKQEAgLTExMDEsNjUgKzExMjUsNjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkc3Rfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKK3N0YXRpYyBpbnQgZHN0X3NldF92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpCiB7CiAJaW50IG5lZWRfY21kOwotCXN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXN0YXRlLT52b2x0YWdlID0gdm9sdGFnZTsKLQogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgIT0gRFNUX1RZUEVfSVNfU0FUKQogCQlyZXR1cm4gMDsKIAogCW5lZWRfY21kID0gMDsKKwogCXN3aXRjaCAodm9sdGFnZSkgewotCQljYXNlIFNFQ19WT0xUQUdFXzEzOgotCQljYXNlIFNFQ19WT0xUQUdFXzE4OgotCQkJaWYgKChzdGF0ZS0+ZGlzZXFfZmxhZ3MgJiBIQVNfUE9XRVIpID09IDApCi0JCQkJbmVlZF9jbWQgPSAxOwotCQkJc3RhdGUtPmRpc2VxX2ZsYWdzIHw9IEhBU19QT1dFUjsKLQkJCXN0YXRlLT50eF90dW5hWzRdID0gMHgwMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgorCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CisJY2FzZSBTRUNfVk9MVEFHRV8xODoKKwkJaWYgKChzdGF0ZS0+ZGlzZXFfZmxhZ3MgJiBIQVNfUE9XRVIpID09IDApCiAJCQluZWVkX2NtZCA9IDE7Ci0JCQlzdGF0ZS0+ZGlzZXFfZmxhZ3MgJj0gfihIQVNfUE9XRVIgfCBIQVNfTE9DSyB8IEFUVEVNUFRfVFVORSk7Ci0JCQlzdGF0ZS0+dHhfdHVuYVs0XSA9IDB4MDA7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0YXRlLT5kaXNlcV9mbGFncyB8PSBIQVNfUE9XRVI7CisJCXN0YXRlLT50eF90dW5hWzRdID0gMHgwMTsKKwkJYnJlYWs7CisJY2FzZSBTRUNfVk9MVEFHRV9PRkY6CisJCW5lZWRfY21kID0gMTsKKwkJc3RhdGUtPmRpc2VxX2ZsYWdzICY9IH4oSEFTX1BPV0VSIHwgSEFTX0xPQ0sgfCBBVFRFTVBUX1RVTkUpOworCQlzdGF0ZS0+dHhfdHVuYVs0XSA9IDB4MDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KKwogCWlmIChuZWVkX2NtZCkKIAkJZHN0X3RvbmVfcG93ZXJfY21kKHN0YXRlKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzdF9zZXRfdG9uZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpCitzdGF0aWMgaW50IGRzdF9zZXRfdG9uZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpCiB7Ci0Jc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJc3RhdGUtPnRvbmUgPSB0b25lOwotCiAJaWYgKHN0YXRlLT5kc3RfdHlwZSAhPSBEU1RfVFlQRV9JU19TQVQpCiAJCXJldHVybiAwOwogCiAJc3dpdGNoICh0b25lKSB7Ci0JCWNhc2UgU0VDX1RPTkVfT0ZGOgotCQkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX09CU19SRUdTKQotCQkJICAgIHN0YXRlLT50eF90dW5hWzJdID0gMHgwMDsKLQkJCWVsc2UKLQkJCSAgICBzdGF0ZS0+dHhfdHVuYVsyXSA9IDB4ZmY7CisJY2FzZSBTRUNfVE9ORV9PRkY6CisJCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19PQlNfUkVHUykKKwkJICAgIHN0YXRlLT50eF90dW5hWzJdID0gMHgwMDsKKwkJZWxzZQorCQkgICAgc3RhdGUtPnR4X3R1bmFbMl0gPSAweGZmOworCQlicmVhazsKIAotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTRUNfVE9ORV9PTjoKLQkJCXN0YXRlLT50eF90dW5hWzJdID0gMHgwMjsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFNFQ19UT05FX09OOgorCQlzdGF0ZS0+dHhfdHVuYVsyXSA9IDB4MDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlkc3RfdG9uZV9wb3dlcl9jbWQoc3RhdGUpOwogCkBAIC0xMTcyLDE2ICsxMTkyLDE0IEBACiAKIAlpZiAoc3RhdGUtPmRzdF90eXBlICE9IERTVF9UWVBFX0lTX1NBVCkKIAkJcmV0dXJuIDA7Ci0KIAlzdGF0ZS0+bWluaWNtZCA9IG1pbmljbWQ7Ci0KIAlzd2l0Y2ggKG1pbmljbWQpIHsKLQkJY2FzZSBTRUNfTUlOSV9BOgotCQkJc3RhdGUtPnR4X3R1bmFbM10gPSAweDAyOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0VDX01JTklfQjoKLQkJCXN0YXRlLT50eF90dW5hWzNdID0gMHhmZjsKLQkJCWJyZWFrOworCWNhc2UgU0VDX01JTklfQToKKwkJc3RhdGUtPnR4X3R1bmFbM10gPSAweDAyOworCQlicmVhazsKKwljYXNlIFNFQ19NSU5JX0I6CisJCXN0YXRlLT50eF90dW5hWzNdID0gMHhmZjsKKwkJYnJlYWs7CiAJfQogCWRzdF90b25lX3Bvd2VyX2NtZChzdGF0ZSk7CiAKQEAgLTExODksNDIgKzEyMDcsMzcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGRzdF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQorc3RhdGljIGludCBkc3RfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKLQlzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXN0YXRpYyB1OCBpbmlfc2F0Y2lfdHVuYVtdID0geyA5LCAwLCAzLCAweGI2LCAxLCAwLCAweDczLCAweDIxLCAwLCAwIH07Ci0Jc3RhdGljIHU4IGluaV9zYXRmdGFfdHVuYVtdID0geyAwLCAwLCAzLCAweGI2LCAxLCAweDU1LCAweGJkLCAweDUwLCAwLCAwIH07Ci0Jc3RhdGljIHU4IGluaV90dmZ0YV90dW5hW10gPSB7IDAsIDAsIDMsIDB4YjYsIDEsIDcsIDB4MCwgMHgwLCAwLCAwIH07Ci0Jc3RhdGljIHU4IGluaV90dmNpX3R1bmFbXSA9IHsgOSwgMCwgMywgMHhiNiwgMSwgNywgMHgwLCAweDAsIDAsIDAgfTsKLQlzdGF0aWMgdTggaW5pX2NhYmZ0YV90dW5hW10gPSB7IDAsIDAsIDMsIDB4YjYsIDEsIDcsIDB4MCwgMHgwLCAwLCAwIH07Ci0Jc3RhdGljIHU4IGluaV9jYWJjaV90dW5hW10gPSB7IDksIDAsIDMsIDB4YjYsIDEsIDcsIDB4MCwgMHgwLCAwLCAwIH07Ci0vLwlzdGF0ZS0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX09OOworCXN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlzdGF0aWMgdTggc2F0X3R1bmFfMTg4W10gPSB7IDB4MDksIDB4MDAsIDB4MDMsIDB4YjYsIDB4MDEsIDB4MDAsIDB4NzMsIDB4MjEsIDB4MDAsIDB4MDAgfTsKKwlzdGF0aWMgdTggc2F0X3R1bmFfMjA0W10gPSB7IDB4MDAsIDB4MDAsIDB4MDMsIDB4YjYsIDB4MDEsIDB4NTUsIDB4YmQsIDB4NTAsIDB4MDAsIDB4MDAgfTsKKwlzdGF0aWMgdTggdGVyX3R1bmFfMTg4W10gPSB7IDB4MDksIDB4MDAsIDB4MDMsIDB4YjYsIDB4MDEsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwlzdGF0aWMgdTggdGVyX3R1bmFfMjA0W10gPSB7IDB4MDAsIDB4MDAsIDB4MDMsIDB4YjYsIDB4MDEsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwlzdGF0aWMgdTggY2FiX3R1bmFfMjA0W10gPSB7IDB4MDAsIDB4MDAsIDB4MDMsIDB4YjYsIDB4MDEsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwlzdGF0aWMgdTggY2FiX3R1bmFfMTg4W10gPSB7IDB4MDksIDB4MDAsIDB4MDMsIDB4YjYsIDB4MDEsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwogCXN0YXRlLT5pbnZlcnNpb24gPSBJTlZFUlNJT05fT0ZGOwogCXN0YXRlLT52b2x0YWdlID0gU0VDX1ZPTFRBR0VfMTM7CiAJc3RhdGUtPnRvbmUgPSBTRUNfVE9ORV9PRkY7Ci0Jc3RhdGUtPnN5bWJvbF9yYXRlID0gMjk0NzMwMDA7Ci0Jc3RhdGUtPmZlYyA9IEZFQ19BVVRPOwogCXN0YXRlLT5kaXNlcV9mbGFncyA9IDA7CiAJc3RhdGUtPmsyMiA9IDB4MDI7CiAJc3RhdGUtPmJhbmR3aWR0aCA9IEJBTkRXSURUSF83X01IWjsKIAlzdGF0ZS0+Y3VyX2ppZmYgPSBqaWZmaWVzOwotCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfU0FUKSB7Ci0JCXN0YXRlLT5mcmVxdWVuY3kgPSA5NTAwMDA7Ci0JCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKSA/IGluaV9zYXRjaV90dW5hIDogaW5pX3NhdGZ0YV90dW5hKSwgc2l6ZW9mKGluaV9zYXRmdGFfdHVuYSkpOwotCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpIHsKLQkJc3RhdGUtPmZyZXF1ZW5jeSA9IDEzNzAwMDAwMDsKLQkJbWVtY3B5KHN0YXRlLT50eF90dW5hLCAoKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpID8gaW5pX3R2Y2lfdHVuYSA6IGluaV90dmZ0YV90dW5hKSwgc2l6ZW9mKGluaV90dmZ0YV90dW5hKSk7Ci0JfSBlbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpIHsKLQkJc3RhdGUtPmZyZXF1ZW5jeSA9IDUxMDAwMDAwOwotCQltZW1jcHkoc3RhdGUtPnR4X3R1bmEsICgoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTkVXVFVORSkgPyBpbmlfY2FiY2lfdHVuYSA6IGluaV9jYWJmdGFfdHVuYSksIHNpemVvZihpbmlfY2FiZnRhX3R1bmEpKTsKLQl9CisJaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19TQVQpCisJCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKSA/IHNhdF90dW5hXzE4OCA6IHNhdF90dW5hXzIwNCksIHNpemVvZiAoc2F0X3R1bmFfMjA0KSk7CisJZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpCisJCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKSA/IHRlcl90dW5hXzE4OCA6IHRlcl90dW5hXzIwNCksIHNpemVvZiAodGVyX3R1bmFfMjA0KSk7CisJZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0NBQkxFKQorCQltZW1jcHkoc3RhdGUtPnR4X3R1bmEsICgoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTkVXVFVORSkgPyBjYWJfdHVuYV8xODggOiBjYWJfdHVuYV8yMDQpLCBzaXplb2YgKGNhYl90dW5hXzIwNCkpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCogc3RhdHVzKQorc3RhdGljIGludCBkc3RfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3N0YXR1c190ICpzdGF0dXMpCiB7Ci0Jc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJKnN0YXR1cyA9IDA7CiAJaWYgKHN0YXRlLT5kaXNlcV9mbGFncyAmIEhBU19MT0NLKSB7CkBAIC0xMjM2LDkgKzEyNDksOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzdF9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzdHJlbmd0aCkKK3N0YXRpYyBpbnQgZHN0X3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKnN0cmVuZ3RoKQogewotCXN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCWRzdF9nZXRfc2lnbmFsKHN0YXRlKTsKIAkqc3RyZW5ndGggPSBzdGF0ZS0+ZGVjb2RlX3N0cmVuZ3RoOwpAQCAtMTI0Niw5ICsxMjU5LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkc3RfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQorc3RhdGljIGludCBkc3RfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc25yKQogewotCXN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCWRzdF9nZXRfc2lnbmFsKHN0YXRlKTsKIAkqc25yID0gc3RhdGUtPmRlY29kZV9zbnI7CkBAIC0xMjU2LDI4ICsxMjY5LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQorc3RhdGljIGludCBkc3Rfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7Ci0Jc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJZHN0X3NldF9mcmVxKHN0YXRlLCBwLT5mcmVxdWVuY3kpOwotCWlmICh2ZXJib3NlID4gNCkKLQkJZHByaW50aygiU2V0IEZyZXF1ZW5jeT1bJWRdXG4iLCBwLT5mcmVxdWVuY3kpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAiU2V0IEZyZXF1ZW5jeT1bJWRdIiwgcC0+ZnJlcXVlbmN5KTsKIAotLy8JZHN0X3NldF9pbnZlcnNpb24oc3RhdGUsIHAtPmludmVyc2lvbik7CiAJaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19TQVQpIHsKIAkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX09CU19SRUdTKQogCQkJZHN0X3NldF9pbnZlcnNpb24oc3RhdGUsIHAtPmludmVyc2lvbik7Ci0KIAkJZHN0X3NldF9mZWMoc3RhdGUsIHAtPnUucXBzay5mZWNfaW5uZXIpOwogCQlkc3Rfc2V0X3N5bWJvbHJhdGUoc3RhdGUsIHAtPnUucXBzay5zeW1ib2xfcmF0ZSk7CiAJCWRzdF9zZXRfcG9sYXJpemF0aW9uKHN0YXRlKTsKLQkJaWYgKHZlcmJvc2UgPiA0KQotCQkJZHByaW50aygiU2V0IFN5bWJvbHJhdGU9WyVkXVxuIiwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJTZXQgU3ltYm9scmF0ZT1bJWRdIiwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKIAotCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpIHsKKwl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19URVJSKQogCQlkc3Rfc2V0X2JhbmR3aWR0aChzdGF0ZSwgcC0+dS5vZmRtLmJhbmR3aWR0aCk7Ci0JfSBlbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpIHsKKwllbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpIHsKIAkJZHN0X3NldF9mZWMoc3RhdGUsIHAtPnUucWFtLmZlY19pbm5lcik7CiAJCWRzdF9zZXRfc3ltYm9scmF0ZShzdGF0ZSwgcC0+dS5xYW0uc3ltYm9sX3JhdGUpOwogCQlkc3Rfc2V0X21vZHVsYXRpb24oc3RhdGUsIHAtPnUucWFtLm1vZHVsYXRpb24pOwpAQCAtMTI4NywxNiArMTI5NiwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzdF9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3N0YXRpYyBpbnQgZHN0X2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewotCXN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAogCXAtPmZyZXF1ZW5jeSA9IHN0YXRlLT5kZWNvZGVfZnJlcTsKLS8vCXAtPmludmVyc2lvbiA9IHN0YXRlLT5pbnZlcnNpb247CiAJaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19TQVQpIHsKIAkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX09CU19SRUdTKQogCQkJcC0+aW52ZXJzaW9uID0gc3RhdGUtPmludmVyc2lvbjsKLQogCQlwLT51LnFwc2suc3ltYm9sX3JhdGUgPSBzdGF0ZS0+c3ltYm9sX3JhdGU7CiAJCXAtPnUucXBzay5mZWNfaW5uZXIgPSBkc3RfZ2V0X2ZlYyhzdGF0ZSk7CiAJfSBlbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfVEVSUikgewpAQCAtMTMwNCwxNiArMTMxMSwxNSBAQAogCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0NBQkxFKSB7CiAJCXAtPnUucWFtLnN5bWJvbF9yYXRlID0gc3RhdGUtPnN5bWJvbF9yYXRlOwogCQlwLT51LnFhbS5mZWNfaW5uZXIgPSBkc3RfZ2V0X2ZlYyhzdGF0ZSk7Ci0vLwkJcC0+dS5xYW0ubW9kdWxhdGlvbiA9IFFBTV9BVVRPOwogCQlwLT51LnFhbS5tb2R1bGF0aW9uID0gZHN0X2dldF9tb2R1bGF0aW9uKHN0YXRlKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZHN0X3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCitzdGF0aWMgdm9pZCBkc3RfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKLQlzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJa2ZyZWUoc3RhdGUpOwogfQogCkBAIC0xMzIxLDkgKzEzMjcsOCBAQAogc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRzdF9kdmJzX29wczsKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBkc3RfZHZiY19vcHM7CiAKLXN0cnVjdCBkc3Rfc3RhdGUqIGRzdF9hdHRhY2goc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXIpCitzdHJ1Y3QgZHN0X3N0YXRlICpkc3RfYXR0YWNoKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmR2Yl9hZGFwdGVyKQogewotCiAJLyogY2hlY2sgaWYgdGhlIEFTSUMgaXMgdGhlcmUgKi8KIAlpZiAoZHN0X3Byb2JlKHN0YXRlKSA8IDApIHsKIAkJaWYgKHN0YXRlKQpAQCAtMTMzNiwxNyArMTM0MSwxNCBAQAogCWNhc2UgRFNUX1RZUEVfSVNfVEVSUjoKIAkJbWVtY3B5KCZzdGF0ZS0+b3BzLCAmZHN0X2R2YnRfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAkJYnJlYWs7Ci0KIAljYXNlIERTVF9UWVBFX0lTX0NBQkxFOgogCQltZW1jcHkoJnN0YXRlLT5vcHMsICZkc3RfZHZiY19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKLQogCWNhc2UgRFNUX1RZUEVfSVNfU0FUOgogCQltZW1jcHkoJnN0YXRlLT5vcHMsICZkc3RfZHZic19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKLQogCWRlZmF1bHQ6Ci0JCXByaW50aygiJXM6IHVua25vd24gRFNUIHR5cGUuIHBsZWFzZSByZXBvcnQgdG8gdGhlIExpbnV4VFYub3JnIERWQiBtYWlsaW5nbGlzdC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAidW5rbm93biBEU1QgdHlwZS4gcGxlYXNlIHJlcG9ydCB0byB0aGUgTGludXhUVi5vcmcgRFZCIG1haWxpbmdsaXN0LiIpOwogCQlpZiAoc3RhdGUpCiAJCQlrZnJlZShzdGF0ZSk7CiAKQEAgLTEzNzQsMTIgKzEzNzYsOSBAQAogCX0sCiAKIAkucmVsZWFzZSA9IGRzdF9yZWxlYXNlLAotCiAJLmluaXQgPSBkc3RfaW5pdCwKLQogCS5zZXRfZnJvbnRlbmQgPSBkc3Rfc2V0X2Zyb250ZW5kLAogCS5nZXRfZnJvbnRlbmQgPSBkc3RfZ2V0X2Zyb250ZW5kLAotCiAJLnJlYWRfc3RhdHVzID0gZHN0X3JlYWRfc3RhdHVzLAogCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGRzdF9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKIAkucmVhZF9zbnIgPSBkc3RfcmVhZF9zbnIsCkBAIC0xNDAxLDE2ICsxNDAwLDEyIEBACiAJfSwKIAogCS5yZWxlYXNlID0gZHN0X3JlbGVhc2UsCi0KIAkuaW5pdCA9IGRzdF9pbml0LAotCiAJLnNldF9mcm9udGVuZCA9IGRzdF9zZXRfZnJvbnRlbmQsCiAJLmdldF9mcm9udGVuZCA9IGRzdF9nZXRfZnJvbnRlbmQsCi0KIAkucmVhZF9zdGF0dXMgPSBkc3RfcmVhZF9zdGF0dXMsCiAJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gZHN0X3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAogCS5yZWFkX3NuciA9IGRzdF9yZWFkX3NuciwKLQogCS5kaXNlcWNfc2VuZF9idXJzdCA9IGRzdF9zZW5kX2J1cnN0LAogCS5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gZHN0X3NldF9kaXNlcWMsCiAJLnNldF92b2x0YWdlID0gZHN0X3NldF92b2x0YWdlLApAQCAtMTQzMiwxOCArMTQyNywxNCBAQAogCX0sCiAKIAkucmVsZWFzZSA9IGRzdF9yZWxlYXNlLAotCiAJLmluaXQgPSBkc3RfaW5pdCwKLQogCS5zZXRfZnJvbnRlbmQgPSBkc3Rfc2V0X2Zyb250ZW5kLAogCS5nZXRfZnJvbnRlbmQgPSBkc3RfZ2V0X2Zyb250ZW5kLAotCiAJLnJlYWRfc3RhdHVzID0gZHN0X3JlYWRfc3RhdHVzLAogCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGRzdF9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKIAkucmVhZF9zbnIgPSBkc3RfcmVhZF9zbnIsCiB9OwogCi0KIE1PRFVMRV9ERVNDUklQVElPTigiRFNUIERWQi1TL1QvQyBDb21ibyBGcm9udGVuZCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkphbWllIEhvbmFuLCBNYW51IEFicmFoYW0iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jYS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKaW5kZXggYmZhYWNkNS4uNjc3NmE1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKQEAgLTE4LDMwICsxOCw0MiBAQAogCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAotCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9kdmIvY2EuaD4KICNpbmNsdWRlICJkdmJkZXYuaCIKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKLQogI2luY2x1ZGUgImRzdF9jYS5oIgogI2luY2x1ZGUgImRzdF9jb21tb24uaCIKIAorI2RlZmluZSBEU1RfQ0FfRVJST1IJCTAKKyNkZWZpbmUgRFNUX0NBX05PVElDRQkJMQorI2RlZmluZSBEU1RfQ0FfSU5GTwkJMgorI2RlZmluZSBEU1RfQ0FfREVCVUcJCTMKKworI2RlZmluZSBkcHJpbnRrKHgsIHksIHosIGZvcm1hdCwgYXJnLi4uKSBkbyB7CQkJCQkJXAorCWlmICh6KSB7CQkJCQkJCQkJXAorCQlpZgkoKHggPiBEU1RfQ0FfRVJST1IpICYmICh4ID4geSkpCQkJCQlcCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAiIGZvcm1hdCAiXG4iLCBfX0ZVTkNUSU9OX18gLCAjI2FyZyk7CVwKKwkJZWxzZSBpZgkoKHggPiBEU1RfQ0FfTk9USUNFKSAmJiAoeCA+IHkpKQkJCQlcCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiAiIGZvcm1hdCAiXG4iLCBfX0ZVTkNUSU9OX18gLCAjI2FyZyk7CVwKKwkJZWxzZSBpZiAoKHggPiBEU1RfQ0FfSU5GTykgJiYgKHggPiB5KSkJCQkJCVwKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAiIGZvcm1hdCAiXG4iLCBfX0ZVTkNUSU9OX18gLCAjI2FyZyk7CVwKKwkJZWxzZSBpZiAoKHggPiBEU1RfQ0FfREVCVUcpICYmICh4ID4geSkpCQkJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsJXAorCX0gZWxzZSB7CQkJCQkJCQkJXAorCQlpZiAoeCA+IHkpCQkJCQkJCQlcCisJCQlwcmludGsoZm9ybWF0LCAjIyBhcmcpOwkJCQkJCVwKKwl9CQkJCQkJCQkJCVwKK30gd2hpbGUoMCkKKworCiBzdGF0aWMgdW5zaWduZWQgaW50IHZlcmJvc2UgPSA1OwogbW9kdWxlX3BhcmFtKHZlcmJvc2UsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJ2ZXJib3NlIHN0YXJ0dXAgbWVzc2FnZXMsIGRlZmF1bHQgaXMgMSAoeWVzKSIpOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnID0gMTsKLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBtZXNzYWdlcywgZGVmYXVsdCBpcyAxICh5ZXMpIik7Ci0KLSNkZWZpbmUgZHByaW50ayBpZiAoZGVidWcpIHByaW50awotCiAvKglOZWVkIHNvbWUgbW9yZSB3b3JrCSovCiBzdGF0aWMgaW50IGNhX3NldF9zbG90X2Rlc2NyKHZvaWQpCiB7CkBAIC02MSwyNyArNzMsMjAgQEAKIHsKIAl1OCBpID0gMCwgY2hlY2tzdW0gPSAwOwogCi0JaWYgKHZlcmJvc2UgPiAzKSB7Ci0JCWRwcmludGsoIiVzOiA9PT09PT09PT09PT09PT09PT09PT09PT09IENoZWNrc3VtIGNhbGN1bGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIiwgX19GVU5DVElPTl9fKTsKLQkJZHByaW50aygiJXM6IFN0cmluZyBMZW5ndGg9WzB4JTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMSwgIiA9PT09PT09PT09PT09PT09PT09PT09PT09IENoZWNrc3VtIGNhbGN1bGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIFN0cmluZyBMZW5ndGg9WzB4JTAyeF0iLCBsZW5ndGgpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIFN0cmluZz1bIik7CiAKLQkJZHByaW50aygiJXM6IFN0cmluZz1bIiwgX19GVU5DVElPTl9fKTsKLQl9CiAJd2hpbGUgKGkgPCBsZW5ndGgpIHsKLQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJZHByaW50aygiICUwMngiLCBjaGVja19zdHJpbmdbaV0pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMCwgIiAlMDJ4IiwgY2hlY2tfc3RyaW5nW2ldKTsKIAkJY2hlY2tzdW0gKz0gY2hlY2tfc3RyaW5nW2ldOwogCQlpKys7CiAJfQotCWlmICh2ZXJib3NlID4gMykgewotCQlkcHJpbnRrKCIgXVxuIik7Ci0JCWRwcmludGsoIiVzOiBTdW09WyUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIGNoZWNrc3VtKTsKLQl9CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfREVCVUcsIDAsICIgXVxuIik7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfREVCVUcsIDEsICJTdW09WyUwMnhdXG4iLCBjaGVja3N1bSk7CiAJY2hlY2tfc3RyaW5nW2xlbmd0aF0gPSB+Y2hlY2tzdW0gKyAxOwotCWlmICh2ZXJib3NlID4gMykgewotCQlkcHJpbnRrKCIlczogQ2hlY2tzdW09WyUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIGNoZWNrX3N0cmluZ1tsZW5ndGhdKTsKLQkJZHByaW50aygiJXM6ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iLCBfX0ZVTkNUSU9OX18pOwotCX0KKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMSwgIiBDaGVja3N1bT1bJTAyeF0iLCBjaGVja19zdHJpbmdbbGVuZ3RoXSk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfREVCVUcsIDEsICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTQsMzAgKzk5LDI2IEBACiAJbXNsZWVwKDY1KTsKIAogCWlmICh3cml0ZV9kc3Qoc3RhdGUsIGRhdGEsIGxlbikpIHsKLQkJZHByaW50aygiJXM6IFdyaXRlIG5vdCBzdWNjZXNzZnVsLCB0cnlpbmcgdG8gcmVjb3ZlclxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiBXcml0ZSBub3Qgc3VjY2Vzc2Z1bCwgdHJ5aW5nIHRvIHJlY292ZXIiKTsKIAkJZHN0X2Vycm9yX3JlY292ZXJ5KHN0YXRlKTsKIAkJcmV0dXJuIC0xOwogCX0KLQogCWlmICgoZHN0X3Bpb19kaXNhYmxlKHN0YXRlKSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBEU1QgUElPIGRpc2FibGUgZmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgRFNUIFBJTyBkaXNhYmxlIGZhaWxlZC4iKTsKIAkJcmV0dXJuIC0xOwogCX0KLQogCWlmIChyZWFkX2RzdChzdGF0ZSwgJnJlcGx5LCBHRVRfQUNLKSA8IDApIHsKLQkJZHByaW50aygiJXM6IFJlYWQgbm90IHN1Y2Nlc3NmdWwsIHRyeWluZyB0byByZWNvdmVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIFJlYWQgbm90IHN1Y2Nlc3NmdWwsIHRyeWluZyB0byByZWNvdmVyIik7CiAJCWRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSk7CiAJCXJldHVybiAtMTsKIAl9Ci0KIAlpZiAocmVhZCkgewogCQlpZiAoISBkc3Rfd2FpdF9kc3RfcmVhZHkoc3RhdGUsIExPTkdfREVMQVkpKSB7Ci0JCQlkcHJpbnRrKCIlczogODgyMCBub3QgcmVhZHlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9OT1RJQ0UsIDEsICIgODgyMCBub3QgcmVhZHkiKTsKIAkJCXJldHVybiAtMTsKIAkJfQotCiAJCWlmIChyZWFkX2RzdChzdGF0ZSwgY2Ffc3RyaW5nLCAxMjgpIDwgMCkgewkvKglUcnkgdG8gbWFrZSB0aGlzIGR5bmFtaWMJKi8KLQkJCWRwcmludGsoIiVzOiBSZWFkIG5vdCBzdWNjZXNzZnVsLCB0cnlpbmcgdG8gcmVjb3ZlclxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgUmVhZCBub3Qgc3VjY2Vzc2Z1bCwgdHJ5aW5nIHRvIHJlY292ZXIiKTsKIAkJCWRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTEzMyw4ICsxMzQsNyBAQAogCiAJd2hpbGUgKGRzdF9jYV9jb21tX2VyciA8IFJFVFJJRVMpIHsKIAkJZHN0X2NvbW1faW5pdChzdGF0ZSk7Ci0JCWlmICh2ZXJib3NlID4gMikKLQkJCWRwcmludGsoIiVzOiBQdXQgQ29tbWFuZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfTk9USUNFLCAxLCAiIFB1dCBDb21tYW5kIik7CiAJCWlmIChkc3RfY2lfY29tbWFuZChzdGF0ZSwgZGF0YSwgY2Ffc3RyaW5nLCBsZW4sIHJlYWQpKSB7CS8vIElmIGVycm9yCiAJCQlkc3RfZXJyb3JfcmVjb3Zlcnkoc3RhdGUpOwogCQkJZHN0X2NhX2NvbW1fZXJyKys7IC8vIHdvcmsgcmVxdWlyZWQgaGVyZS4KQEAgLTE1MywxOCArMTUzLDE1IEBACiAKIAlwdXRfY2hlY2tzdW0oJmNvbW1hbmRbMF0sIGNvbW1hbmRbMF0pOwogCWlmICgoZHN0X3B1dF9jaShzdGF0ZSwgY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBzdGF0ZS0+bWVzc2FnZXMsIEdFVF9SRVBMWSkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogLS0+ZHN0X3B1dF9jaSBGQUlMRUQgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+ZHN0X3B1dF9jaSBGQUlMRUQgISIpOwogCQlyZXR1cm4gLTE7CiAJfQotCWlmICh2ZXJib3NlID4gMSkgewotCQlkcHJpbnRrKCIlczogLS0+ZHN0X3B1dF9jaSBTVUNDRVNTICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJZHByaW50aygiJXM6ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENJIE1vZHVsZSBBcHBsaWNhdGlvbiBJbmZvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iLCBfX0ZVTkNUSU9OX18pOwotCQlkcHJpbnRrKCIlczogQXBwbGljYXRpb24gVHlwZT1bJWRdLCBBcHBsaWNhdGlvbiBWZW5kb3I9WyVkXSwgVmVuZG9yIENvZGU9WyVkXVxuJXM6IEFwcGxpY2F0aW9uIGluZm89WyVzXVxuIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdGUtPm1lc3NhZ2VzWzddLCAoc3RhdGUtPm1lc3NhZ2VzWzhdIDw8IDgpIHwgc3RhdGUtPm1lc3NhZ2VzWzldLAotCQkJKHN0YXRlLT5tZXNzYWdlc1sxMF0gPDwgOCkgfCBzdGF0ZS0+bWVzc2FnZXNbMTFdLCBfX0ZVTkNUSU9OX18sIChjaGFyICopKCZzdGF0ZS0+bWVzc2FnZXNbMTJdKSk7Ci0JCWRwcmludGsoIiVzOiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIiwgX19GVU5DVElPTl9fKTsKLQl9CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiAtLT5kc3RfcHV0X2NpIFNVQ0NFU1MgISIpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ0kgTW9kdWxlIEFwcGxpY2F0aW9uIEluZm8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIEFwcGxpY2F0aW9uIFR5cGU9WyVkXSwgQXBwbGljYXRpb24gVmVuZG9yPVslZF0sIFZlbmRvciBDb2RlPVslZF1cbiVzOiBBcHBsaWNhdGlvbiBpbmZvPVslc10iLAorCQlzdGF0ZS0+bWVzc2FnZXNbN10sIChzdGF0ZS0+bWVzc2FnZXNbOF0gPDwgOCkgfCBzdGF0ZS0+bWVzc2FnZXNbOV0sCisJCShzdGF0ZS0+bWVzc2FnZXNbMTBdIDw8IDgpIHwgc3RhdGUtPm1lc3NhZ2VzWzExXSwgX19GVU5DVElPTl9fLCAoY2hhciAqKSgmc3RhdGUtPm1lc3NhZ2VzWzEyXSkpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTc3LDMxICsxNzQsMjYgQEAKIAogCXB1dF9jaGVja3N1bSgmc2xvdF9jb21tYW5kWzBdLCBzbG90X2NvbW1hbmRbMF0pOwogCWlmICgoZHN0X3B1dF9jaShzdGF0ZSwgc2xvdF9jb21tYW5kLCBzaXplb2YgKHNsb3RfY29tbWFuZCksIHNsb3RfY2FwLCBHRVRfUkVQTFkpKSA8IDApIHsKLQkJZHByaW50aygiJXM6IC0tPmRzdF9wdXRfY2kgRkFJTEVEICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIC0tPmRzdF9wdXRfY2kgRkFJTEVEICEiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAodmVyYm9zZSA+IDEpCi0JCWRwcmludGsoIiVzOiAtLT5kc3RfcHV0X2NpIFNVQ0NFU1MgIVxuIiwgX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9OT1RJQ0UsIDEsICIgLS0+ZHN0X3B1dF9jaSBTVUNDRVNTICEiKTsKIAogCS8qCVdpbGwgaW1wbGVtZW50IHRoZSByZXN0IHNvb24JCSovCiAKLQlpZiAodmVyYm9zZSA+IDEpIHsKLQkJZHByaW50aygiJXM6IFNsb3QgY2FwID0gWyVkXVxuIiwgX19GVU5DVElPTl9fLCBzbG90X2NhcFs3XSk7Ci0JCWRwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCWRwcmludGsoIiAlZCIsIHNsb3RfY2FwW2ldKTsKLQkJZHByaW50aygiXG4iKTsKLQl9CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiBTbG90IGNhcCA9IFslZF0iLCBzbG90X2NhcFs3XSk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMCwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAwLCAiICVkIiwgc2xvdF9jYXBbaV0pOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDAsICJcbiIpOwogCiAJcF9jYV9jYXBzLT5zbG90X251bSA9IDE7CiAJcF9jYV9jYXBzLT5zbG90X3R5cGUgPSAxOwogCXBfY2FfY2Fwcy0+ZGVzY3JfbnVtID0gc2xvdF9jYXBbN107CiAJcF9jYV9jYXBzLT5kZXNjcl90eXBlID0gMTsKIAotCi0JaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGNhX2NhcHMgKilhcmcsIHBfY2FfY2Fwcywgc2l6ZW9mIChzdHJ1Y3QgY2FfY2FwcykpKSB7CisJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGNhX2NhcHMgKilhcmcsIHBfY2FfY2Fwcywgc2l6ZW9mIChzdHJ1Y3QgY2FfY2FwcykpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIyMiw0NiArMjE0LDM3IEBACiAKIAlwdXRfY2hlY2tzdW0oJnNsb3RfY29tbWFuZFswXSwgNyk7CiAJaWYgKChkc3RfcHV0X2NpKHN0YXRlLCBzbG90X2NvbW1hbmQsIHNpemVvZiAoc2xvdF9jb21tYW5kKSwgc2xvdF9pbmZvLCBHRVRfUkVQTFkpKSA8IDApIHsKLQkJZHByaW50aygiJXM6IC0tPmRzdF9wdXRfY2kgRkFJTEVEICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIC0tPmRzdF9wdXRfY2kgRkFJTEVEICEiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAodmVyYm9zZSA+IDEpCi0JCWRwcmludGsoIiVzOiAtLT5kc3RfcHV0X2NpIFNVQ0NFU1MgIVxuIiwgX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIC0tPmRzdF9wdXRfY2kgU1VDQ0VTUyAhIik7CiAKIAkvKglXaWxsIGltcGxlbWVudCB0aGUgcmVzdCBzb29uCQkqLwogCi0JaWYgKHZlcmJvc2UgPiAxKSB7Ci0JCWRwcmludGsoIiVzOiBTbG90IGluZm8gPSBbJWRdXG4iLCBfX0ZVTkNUSU9OX18sIHNsb3RfaW5mb1szXSk7Ci0JCWRwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCWRwcmludGsoIiAlZCIsIHNsb3RfaW5mb1tpXSk7Ci0JCWRwcmludGsoIlxuIik7Ci0JfQorCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgU2xvdCBpbmZvID0gWyVkXSIsIHNsb3RfaW5mb1szXSk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMCwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAwLCAiICVkIiwgc2xvdF9pbmZvW2ldKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAwLCAiXG4iKTsKIAogCWlmIChzbG90X2luZm9bNF0gJiAweDgwKSB7CiAJCXBfY2Ffc2xvdF9pbmZvLT5mbGFncyA9IENBX0NJX01PRFVMRV9QUkVTRU5UOwogCQlwX2NhX3Nsb3RfaW5mby0+bnVtID0gMTsKIAkJcF9jYV9zbG90X2luZm8tPnR5cGUgPSBDQV9DSTsKLQl9Ci0JZWxzZSBpZiAoc2xvdF9pbmZvWzRdICYgMHg0MCkgeworCX0gZWxzZSBpZiAoc2xvdF9pbmZvWzRdICYgMHg0MCkgewogCQlwX2NhX3Nsb3RfaW5mby0+ZmxhZ3MgPSBDQV9DSV9NT0RVTEVfUkVBRFk7CiAJCXBfY2Ffc2xvdF9pbmZvLT5udW0gPSAxOwogCQlwX2NhX3Nsb3RfaW5mby0+dHlwZSA9IENBX0NJOwotCX0KLQllbHNlIHsKKwl9IGVsc2UKIAkJcF9jYV9zbG90X2luZm8tPmZsYWdzID0gMDsKLQl9CiAKLQlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgY2Ffc2xvdF9pbmZvICopYXJnLCBwX2NhX3Nsb3RfaW5mbywgc2l6ZW9mIChzdHJ1Y3QgY2Ffc2xvdF9pbmZvKSkpIHsKKwlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgY2Ffc2xvdF9pbmZvICopYXJnLCBwX2NhX3Nsb3RfaW5mbywgc2l6ZW9mIChzdHJ1Y3QgY2Ffc2xvdF9pbmZvKSkpCiAJCXJldHVybiAtRUZBVUxUOwotCX0KIAogCXJldHVybiAwOwogfQogCiAKLQotCiBzdGF0aWMgaW50IGNhX2dldF9tZXNzYWdlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgY2FfbXNnICpwX2NhX21lc3NhZ2UsIHZvaWQgKmFyZykKIHsKIAl1OCBpID0gMDsKQEAgLTI3MCwyNCArMjUzLDIxIEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKHBfY2FfbWVzc2FnZSwgKHZvaWQgKilhcmcsIHNpemVvZiAoc3RydWN0IGNhX21zZykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCiAJaWYgKHBfY2FfbWVzc2FnZS0+bXNnKSB7Ci0JCWlmICh2ZXJib3NlID4gMykKLQkJCWRwcmludGsoIk1lc3NhZ2UgPSBbJTAyeCAlMDJ4ICUwMnhdXG4iLCBwX2NhX21lc3NhZ2UtPm1zZ1swXSwgcF9jYV9tZXNzYWdlLT5tc2dbMV0sIHBfY2FfbWVzc2FnZS0+bXNnWzJdKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfTk9USUNFLCAxLCAiIE1lc3NhZ2UgPSBbJTAyeCAlMDJ4ICUwMnhdIiwgcF9jYV9tZXNzYWdlLT5tc2dbMF0sIHBfY2FfbWVzc2FnZS0+bXNnWzFdLCBwX2NhX21lc3NhZ2UtPm1zZ1syXSk7CiAKIAkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQkJY29tbWFuZCA9IGNvbW1hbmQgfCBwX2NhX21lc3NhZ2UtPm1zZ1tpXTsKIAkJCWlmIChpIDwgMikKIAkJCQljb21tYW5kID0gY29tbWFuZCA8PCA4OwogCQl9Ci0JCWlmICh2ZXJib3NlID4gMykKLQkJCWRwcmludGsoIiVzOkNvbW1hbmQ9WzB4JXhdXG4iLCBfX0ZVTkNUSU9OX18sIGNvbW1hbmQpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9OT1RJQ0UsIDEsICIgQ29tbWFuZD1bMHgleF0iLCBjb21tYW5kKTsKIAogCQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQkJCWNhc2UgQ0FfQVBQX0lORk86Ci0JCQkJbWVtY3B5KHBfY2FfbWVzc2FnZS0+bXNnLCBzdGF0ZS0+bWVzc2FnZXMsIDEyOCk7Ci0JCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgcF9jYV9tZXNzYWdlLCBzaXplb2YgKHN0cnVjdCBjYV9tc2cpKSApCi0JCQkJCXJldHVybiAtRUZBVUxUOworCQljYXNlIENBX0FQUF9JTkZPOgorCQkJbWVtY3B5KHBfY2FfbWVzc2FnZS0+bXNnLCBzdGF0ZS0+bWVzc2FnZXMsIDEyOCk7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBwX2NhX21lc3NhZ2UsIHNpemVvZiAoc3RydWN0IGNhX21zZykpICkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMjk4LDEwICsyNzgsMTMgQEAKIHN0YXRpYyBpbnQgaGFuZGxlX2RzdF90YWcoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1MzIgbGVuZ3RoKQogewogCWlmIChzdGF0ZS0+ZHN0X2h3X2NhcCAmIERTVF9UWVBFX0hBU19TRVNTSU9OKSB7Ci0JCWh3X2J1ZmZlci0+bXNnWzJdID0gcF9jYV9tZXNzYWdlLT5tc2dbMV07CQkvKgkJTVNCCQkJKi8KLQkJaHdfYnVmZmVyLT5tc2dbM10gPSBwX2NhX21lc3NhZ2UtPm1zZ1syXTsJCS8qCQlMU0IJCQkqLwotCX0KLQllbHNlIHsKKwkJaHdfYnVmZmVyLT5tc2dbMl0gPSBwX2NhX21lc3NhZ2UtPm1zZ1sxXTsJLyoJTVNCCSovCisJCWh3X2J1ZmZlci0+bXNnWzNdID0gcF9jYV9tZXNzYWdlLT5tc2dbMl07CS8qCUxTQgkqLworCX0gZWxzZSB7CisJCWlmIChsZW5ndGggPiAyNDcpIHsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIE1lc3NhZ2UgdG9vIGxvbmcgISAqKiogQmFpbGluZyBPdXQgKioqICEiKTsKKwkJCXJldHVybiAtMTsKKwkJfQogCQlod19idWZmZXItPm1zZ1swXSA9IChsZW5ndGggJiAweGZmKSArIDc7CiAJCWh3X2J1ZmZlci0+bXNnWzFdID0gMHg0MDsKIAkJaHdfYnVmZmVyLT5tc2dbMl0gPSAweDAzOwpAQCAtMzA5LDYgKzI5MiwxMSBAQAogCQlod19idWZmZXItPm1zZ1s0XSA9IDB4MDM7CiAJCWh3X2J1ZmZlci0+bXNnWzVdID0gbGVuZ3RoICYgMHhmZjsKIAkJaHdfYnVmZmVyLT5tc2dbNl0gPSAweDAwOworCQkvKgorCQkgKglOZWVkIHRvIGNvbXB1dGUgbGVuZ3RoIGZvciBFTjUwMjIxIHNlY3Rpb24gOC4zLjIsIGZvciB0aGUgdGltZSBiZWluZworCQkgKglhc3N1bWluZyA4LjMuMiBpcyBub3QgYXBwbGljYWJsZQorCQkgKi8KKwkJbWVtY3B5KCZod19idWZmZXItPm1zZ1s3XSwgJnBfY2FfbWVzc2FnZS0+bXNnWzRdLCBsZW5ndGgpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTMxNywxMyArMzA1LDEyIEBACiBzdGF0aWMgaW50IHdyaXRlX3RvXzg4MjAoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKmh3X2J1ZmZlciwgdTggbGVuZ3RoLCB1OCByZXBseSkKIHsKIAlpZiAoKGRzdF9wdXRfY2koc3RhdGUsIGh3X2J1ZmZlci0+bXNnLCBsZW5ndGgsIGh3X2J1ZmZlci0+bXNnLCByZXBseSkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogRFNULUNJIENvbW1hbmQgZmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKLQkJZHByaW50aygiJXM6IFJlc2V0dGluZyBEU1QuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiBEU1QtQ0kgQ29tbWFuZCBmYWlsZWQuIik7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX05PVElDRSwgMSwgIiBSZXNldHRpbmcgRFNULiIpOwogCQlyZGNfcmVzZXRfc3RhdGUoc3RhdGUpOwogCQlyZXR1cm4gLTE7CiAJfQotCWlmICh2ZXJib3NlID4gMikKLQkJZHByaW50aygiJXM6IERTVC1DSSBDb21tYW5kIHN1Y2Nlcy5cbiIsIF9fRlVOQ1RJT05fXyk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfTk9USUNFLCAxLCAiIERTVC1DSSBDb21tYW5kIHN1Y2Nlcy4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzM0LDEzMCArMzIxLDQ3IEBACiAJdTMyIGxlbmd0aCA9IDA7CiAKIAlsZW5ndGhfZmllbGQgPSBhc25fMV9hcnJheVswXTsKLQlkcHJpbnRrKCIlczogTGVuZ3RoIGZpZWxkPVslMDJ4XVxuIiwgX19GVU5DVElPTl9fLCBsZW5ndGhfZmllbGQpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIExlbmd0aCBmaWVsZD1bJTAyeF0iLCBsZW5ndGhfZmllbGQpOwogCWlmIChsZW5ndGhfZmllbGQgPCAweDgwKSB7CiAJCWxlbmd0aCA9IGxlbmd0aF9maWVsZCAmIDB4N2Y7Ci0JCWRwcmludGsoIiVzOiBMZW5ndGg9WyUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIExlbmd0aD1bJTAyeF1cbiIsIGxlbmd0aCk7CiAJfSBlbHNlIHsKIAkJd29yZF9jb3VudCA9IGxlbmd0aF9maWVsZCAmIDB4N2Y7CiAJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHdvcmRfY291bnQ7IGNvdW50KyspIHsKIAkJCWxlbmd0aCA9IChsZW5ndGggfCBhc25fMV9hcnJheVtjb3VudCArIDFdKSA8PCA4OwotCQkJZHByaW50aygiJXM6IExlbmd0aD1bJTA0eF1cbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIExlbmd0aD1bJTA0eF0iLCBsZW5ndGgpOwogCQl9CiAJfQogCXJldHVybiBsZW5ndGg7CiB9CiAKLXN0YXRpYyBpbnQgaW5pdF9idWZmZXIodTggKmJ1ZmZlciwgdTMyIGxlbmd0aCkKLXsKLQl1MzIgaTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCWJ1ZmZlcltpXSA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBkZWJ1Z19zdHJpbmcodTggKm1zZywgdTMyIGxlbmd0aCwgdTMyIG9mZnNldCkKIHsKIAl1MzIgaTsKIAotCWRwcmludGsoIiBTdHJpbmc9WyAiKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMCwgIiBTdHJpbmc9WyAiKTsKIAlmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsZW5ndGg7IGkrKykKLQkJZHByaW50aygiJTAyeCAiLCBtc2dbaV0pOwotCWRwcmludGsoIl1cbiIpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMCwgIiUwMnggIiwgbXNnW2ldKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMCwgIl1cbiIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY29weV9zdHJpbmcodTggKmRlc3RpbmF0aW9uLCB1OCAqc291cmNlLCB1MzIgZGVzdF9vZmZzZXQsIHUzMiBzb3VyY2Vfb2Zmc2V0LCB1MzIgbGVuZ3RoKQotewotCXUzMiBpOwotCWRwcmludGsoIiVzOiBDb3B5aW5nIFsiLCBfX0ZVTkNUSU9OX18pOwotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlkZXN0aW5hdGlvbltpICsgZGVzdF9vZmZzZXRdID0gc291cmNlW2kgKyBzb3VyY2Vfb2Zmc2V0XTsKLQkJZHByaW50aygiICUwMngiLCBzb3VyY2VbaSArIHNvdXJjZV9vZmZzZXRdKTsKLQl9Ci0JZHByaW50aygiXVxuIik7Ci0KLQlyZXR1cm4gaTsKLX0KLQotc3RhdGljIGludCBtb2RpZnlfNF9iaXRzKHU4ICptZXNzYWdlLCB1MzIgcG9zKQotewotCW1lc3NhZ2VbcG9zXSAmPSAweDBmOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotCiBzdGF0aWMgaW50IGNhX3NldF9wbXQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1OCByZXBseSwgdTggcXVlcnkpCiB7Ci0JdTMyIGxlbmd0aCA9IDAsIGNvdW50ID0gMDsKLQl1OCBhc25fMV93b3JkcywgcHJvZ3JhbV9oZWFkZXJfbGVuZ3RoOwotCXUxNiBwcm9ncmFtX2luZm9fbGVuZ3RoID0gMCwgZXNfaW5mb19sZW5ndGggPSAwOwotCXUzMiBod19vZmZzZXQgPSAwLCBidWZfb2Zmc2V0ID0gMCwgaTsKLQl1OCBkc3RfdGFnX2xlbmd0aDsKKwl1MzIgbGVuZ3RoID0gMDsKKwl1OCB0YWdfbGVuZ3RoID0gODsKIAogCWxlbmd0aCA9IGFzbl8xX2RlY29kZSgmcF9jYV9tZXNzYWdlLT5tc2dbM10pOwotCWRwcmludGsoIiVzOiBDQSBNZXNzYWdlIGxlbmd0aD1bJWRdXG4iLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCk7Ci0JZHByaW50aygiJXM6IEFTTi4xICIsIF9fRlVOQ1RJT05fXyk7Ci0JZGVidWdfc3RyaW5nKCZwX2NhX21lc3NhZ2UtPm1zZ1s0XSwgbGVuZ3RoLCAwKTsgLy8gbGVuZ3RoIGRvZXMgbm90IGluY2x1ZGUgdGFnIGFuZCBsZW5ndGgKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMSwgIiBDQSBNZXNzYWdlIGxlbmd0aD1bJWRdIiwgbGVuZ3RoKTsKKwlkZWJ1Z19zdHJpbmcoJnBfY2FfbWVzc2FnZS0+bXNnWzRdLCBsZW5ndGgsIDApOyAvKglsZW5ndGggaXMgZXhjbHVkaW5nIHRhZyAmIGxlbmd0aAkqLwogCi0JaW5pdF9idWZmZXIoaHdfYnVmZmVyLT5tc2csIGxlbmd0aCk7CisJbWVtc2V0KGh3X2J1ZmZlci0+bXNnLCAnXDAnLCBsZW5ndGgpOwogCWhhbmRsZV9kc3RfdGFnKHN0YXRlLCBwX2NhX21lc3NhZ2UsIGh3X2J1ZmZlciwgbGVuZ3RoKTsKKwlwdXRfY2hlY2tzdW0oaHdfYnVmZmVyLT5tc2csIGh3X2J1ZmZlci0+bXNnWzBdKTsKIAotCWh3X29mZnNldCA9IDc7Ci0JYXNuXzFfd29yZHMgPSAxOyAvLyBqdXN0IGEgaGFjayB0byB0ZXN0LCBzaG91bGQgY29tcHV0ZSB0aGlzIG9uZQotCWJ1Zl9vZmZzZXQgPSAzOwotCXByb2dyYW1faGVhZGVyX2xlbmd0aCA9IDY7Ci0JZHN0X3RhZ19sZW5ndGggPSA3OwotCi0vLwlkZWJ1Z190d2luaGFuX2NhX3BhcmFtcyhzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIHJlcGx5LCBxdWVyeSwgbGVuZ3RoLCBod19vZmZzZXQsIGJ1Zl9vZmZzZXQpOwotLy8JZHByaW50aygiJXM6IFByb2dyYW0gSGVhZGVyKEJVRikiLCBfX0ZVTkNUSU9OX18pOwotLy8JZGVidWdfc3RyaW5nKCZwX2NhX21lc3NhZ2UtPm1zZ1s0XSwgcHJvZ3JhbV9oZWFkZXJfbGVuZ3RoLCAwKTsKLS8vCWRwcmludGsoIiVzOiBDb3B5aW5nIFByb2dyYW0gaGVhZGVyXG4iLCBfX0ZVTkNUSU9OX18pOwotCWNvcHlfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCBwX2NhX21lc3NhZ2UtPm1zZywgaHdfb2Zmc2V0LCAoYnVmX29mZnNldCArIGFzbl8xX3dvcmRzKSwgcHJvZ3JhbV9oZWFkZXJfbGVuZ3RoKTsKLQlidWZfb2Zmc2V0ICs9IHByb2dyYW1faGVhZGVyX2xlbmd0aCwgaHdfb2Zmc2V0ICs9IHByb2dyYW1faGVhZGVyX2xlbmd0aDsKLQltb2RpZnlfNF9iaXRzKGh3X2J1ZmZlci0+bXNnLCAoaHdfb2Zmc2V0IC0gMikpOwotCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19JTkNfQ09VTlQpIHsJLy8gd29ya2Fyb3VuZAotCQlkcHJpbnRrKCIlczogUHJvYmFibHkgYW4gQVNJQyBidWcgISEhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlkZWJ1Z19zdHJpbmcoaHdfYnVmZmVyLT5tc2csIChod19vZmZzZXQgKyBwcm9ncmFtX2hlYWRlcl9sZW5ndGgpLCAwKTsKLQkJaHdfYnVmZmVyLT5tc2dbaHdfb2Zmc2V0IC0gMV0gKz0gMTsKLQl9Ci0KLS8vCWRwcmludGsoIiVzOiBQcm9ncmFtIEhlYWRlcihIVyksIENvdW50PVslZF0iLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKLS8vCWRlYnVnX3N0cmluZyhod19idWZmZXItPm1zZywgaHdfb2Zmc2V0LCAwKTsKLQotCXByb2dyYW1faW5mb19sZW5ndGggPSAgKChwcm9ncmFtX2luZm9fbGVuZ3RoIHwgKHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgLSAxXSAmIDB4MGYpKSA8PCA4KSB8IHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXRdOwotCWRwcmludGsoIiVzOiBQcm9ncmFtIGluZm8gbGVuZ3RoPVslMDJ4XVxuIiwgX19GVU5DVElPTl9fLCBwcm9ncmFtX2luZm9fbGVuZ3RoKTsKLQlpZiAocHJvZ3JhbV9pbmZvX2xlbmd0aCkgewotCQljb3VudCA9IGNvcHlfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCBwX2NhX21lc3NhZ2UtPm1zZywgaHdfb2Zmc2V0LCAoYnVmX29mZnNldCArIDEpLCAocHJvZ3JhbV9pbmZvX2xlbmd0aCArIDEpICk7IC8vIGNvcHkgbmV4dCBlbGVtLCBub3QgY3VycmVudAotCQlidWZfb2Zmc2V0ICs9IGNvdW50LCBod19vZmZzZXQgKz0gY291bnQ7Ci0vLwkJZHByaW50aygiJXM6IFByb2dyYW0gbGV2ZWwgIiwgX19GVU5DVElPTl9fKTsKLS8vCQlkZWJ1Z19zdHJpbmcoaHdfYnVmZmVyLT5tc2csIGh3X29mZnNldCwgMCk7Ci0JfQotCi0JYnVmX29mZnNldCArPSAxOy8vIGh3X29mZnNldCArPSAxOwotCWZvciAoaSA9IGJ1Zl9vZmZzZXQ7IGkgPCBsZW5ndGg7IGkrKykgewotLy8JCWRwcmludGsoIiVzOiBTdHJlYW0gSGVhZGVyICIsIF9fRlVOQ1RJT05fXyk7Ci0JCWNvdW50ID0gY29weV9zdHJpbmcoaHdfYnVmZmVyLT5tc2csIHBfY2FfbWVzc2FnZS0+bXNnLCBod19vZmZzZXQsIGJ1Zl9vZmZzZXQsIDUpOwotCQltb2RpZnlfNF9iaXRzKGh3X2J1ZmZlci0+bXNnLCAoaHdfb2Zmc2V0ICsgMykpOwotCi0JCWh3X29mZnNldCArPSA1LCBidWZfb2Zmc2V0ICs9IDUsIGkgKz0gNDsKLS8vCQlkZWJ1Z19zdHJpbmcoaHdfYnVmZmVyLT5tc2csIGh3X29mZnNldCwgKGh3X29mZnNldCAtIDUpKTsKLQkJZXNfaW5mb19sZW5ndGggPSAoKGVzX2luZm9fbGVuZ3RoIHwgKHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgLSAxXSAmIDB4MGYpKSA8PCA4KSB8IHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXRdOwotCQlkcHJpbnRrKCIlczogRVMgaW5mbyBsZW5ndGg9WyUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIGVzX2luZm9fbGVuZ3RoKTsKLQkJaWYgKGVzX2luZm9fbGVuZ3RoKSB7Ci0JCQkvLyBjb3B5IGRlc2NyaXB0b3JzIEAgU1RSRUFNIGxldmVsCi0JCQlkcHJpbnRrKCIlczogRGVzY3JpcHRvcnMgQCBTVFJFQU0gbGV2ZWwuLi4hISEgXG4iLCBfX0ZVTkNUSU9OX18pOwotCQl9Ci0KLQl9Ci0JaHdfYnVmZmVyLT5tc2dbbGVuZ3RoICsgZHN0X3RhZ19sZW5ndGhdID0gZHN0X2NoZWNrX3N1bShod19idWZmZXItPm1zZywgKGxlbmd0aCArIGRzdF90YWdfbGVuZ3RoKSk7Ci0vLwlkcHJpbnRrKCIlczogVG90YWwgbGVuZ3RoPVslZF0sIENoZWNrc3VtPVslMDJ4XVxuIiwgX19GVU5DVElPTl9fLCAobGVuZ3RoICsgZHN0X3RhZ19sZW5ndGgpLCBod19idWZmZXItPm1zZ1tsZW5ndGggKyBkc3RfdGFnX2xlbmd0aF0pOwotCWRlYnVnX3N0cmluZyhod19idWZmZXItPm1zZywgKGxlbmd0aCArIGRzdF90YWdfbGVuZ3RoICsgMSksIDApOwkvLyBkc3QgdGFncyBhbHNvCi0Jd3JpdGVfdG9fODgyMChzdGF0ZSwgaHdfYnVmZmVyLCAobGVuZ3RoICsgZHN0X3RhZ19sZW5ndGggKyAxKSwgcmVwbHkpOwkvLyBjaGVja3N1bQorCWRlYnVnX3N0cmluZyhod19idWZmZXItPm1zZywgKGxlbmd0aCArIHRhZ19sZW5ndGgpLCAwKTsgLyoJdGFncyB0b28JKi8KKwl3cml0ZV90b184ODIwKHN0YXRlLCBod19idWZmZXIsIChsZW5ndGggKyB0YWdfbGVuZ3RoKSwgcmVwbHkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NzEsMjYgKzM3NSwyNCBAQAogCS8qCURvIHRlc3QgYm9hcmQJCQkqLwogCS8qCU5vdCB0aGVyZSB5ZXQgYnV0IHNvb24JCSovCiAKLQogCS8qCUNBIFBNVCBSZXBseSBjYXBhYmxlCQkqLwogCWlmIChjYV9wbXRfcmVwbHlfdGVzdCkgewogCQlpZiAoKGNhX3NldF9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCAxLCBHRVRfUkVQTFkpKSA8IDApIHsKLQkJCWRwcmludGsoIiVzOiBjYV9zZXRfcG10Li4gZmFpbGVkICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiBjYV9zZXRfcG10Li4gZmFpbGVkICEiKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCiAJLyoJUHJvY2VzcyBDQSBQTVQgUmVwbHkJCSovCiAJLyoJd2lsbCBpbXBsZW1lbnQgc29vbgkJKi8KLQkJZHByaW50aygiJXM6IE5vdCB0aGVyZSB5ZXRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIE5vdCB0aGVyZSB5ZXQiKTsKIAl9CiAJLyoJQ0EgUE1UIFJlcGx5IG5vdCBjYXBhYmxlCSovCiAJaWYgKCFjYV9wbXRfcmVwbHlfdGVzdCkgewogCQlpZiAoKGNhX3NldF9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCAwLCBOT19SRVBMWSkpIDwgMCkgewotCQkJZHByaW50aygiJXM6IGNhX3NldF9wbXQuLiBmYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIGNhX3NldF9wbXQuLiBmYWlsZWQgISIpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCWlmICh2ZXJib3NlID4gMykKLQkJCWRwcmludGsoIiVzOiBjYV9zZXRfcG10Li4gc3VjY2VzcyAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9OT1RJQ0UsIDEsICIgY2Ffc2V0X3BtdC4uIHN1Y2Nlc3MgISIpOwogCS8qCXB1dCBhIGR1bW15IG1lc3NhZ2UJCSovCiAKIAl9CkBAIC01MDYsMTEgKzQwOCwxMCBAQAogCXN0cnVjdCBjYV9tc2cgKmh3X2J1ZmZlcjsKIAogCWlmICgoaHdfYnVmZmVyID0gKHN0cnVjdCBjYV9tc2cgKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjYV9tc2cpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlkcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JaWYgKHZlcmJvc2UgPiAzKQotCQlkcHJpbnRrKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMSwgIiAiKTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcihwX2NhX21lc3NhZ2UsICh2b2lkICopYXJnLCBzaXplb2YgKHN0cnVjdCBjYV9tc2cpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC01MjUsNTEgKzQyNiwzNSBAQAogCQkJaWYgKGkgPCAyKQogCQkJCWNvbW1hbmQgPSBjb21tYW5kIDw8IDg7CiAJCX0KLQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJZHByaW50aygiJXM6Q29tbWFuZD1bMHgleF1cbiIsIF9fRlVOQ1RJT05fXywgY29tbWFuZCk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIENvbW1hbmQ9WzB4JXhdXG4iLCBjb21tYW5kKTsKIAogCQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQkJCWNhc2UgQ0FfUE1UOgotCQkJCWlmICh2ZXJib3NlID4gMykKLS8vCQkJCQlkcHJpbnRrKCJDb21tYW5kID0gU0VORF9DQV9QTVRcbiIpOwotCQkJCQlkcHJpbnRrKCJDb21tYW5kID0gU0VORF9DQV9QTVRcbiIpOwotLy8JCQkJaWYgKChjYV9zZXRfcG10KHN0YXRlLCBwX2NhX21lc3NhZ2UsIGh3X2J1ZmZlciwgMCwgMCkpIDwgMCkgewotCQkJCWlmICgoY2Ffc2V0X3BtdChzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIDAsIDApKSA8IDApIHsJLy8gY29kZSBzaW1wbGlmaWNhdGlvbiBzdGFydGVkCi0JCQkJCWRwcmludGsoIiVzOiAtLT5DQV9QTVQgRmFpbGVkICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJCQlkcHJpbnRrKCIlczogLS0+Q0FfUE1UIFN1Y2Nlc3MgIVxuIiwgX19GVU5DVElPTl9fKTsKLS8vCQkJCXJldHZhbCA9IGR1bW15X3NldF9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCAwLCAwKTsKKwkJY2FzZSBDQV9QTVQ6CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMSwgIkNvbW1hbmQgPSBTRU5EX0NBX1BNVCIpOworCQkJaWYgKChjYV9zZXRfcG10KHN0YXRlLCBwX2NhX21lc3NhZ2UsIGh3X2J1ZmZlciwgMCwgMCkpIDwgMCkgewkvLyBjb2RlIHNpbXBsaWZpY2F0aW9uIHN0YXJ0ZWQKKwkJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiAtLT5DQV9QTVQgRmFpbGVkICEiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIC0tPkNBX1BNVCBTdWNjZXNzICEiKTsKKwkJCWJyZWFrOworCQljYXNlIENBX1BNVF9SRVBMWToKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICJDb21tYW5kID0gQ0FfUE1UX1JFUExZIik7CisJCQkvKiAgICAgIEhhdmUgdG8gaGFuZGxlIHRoZSAyIGJhc2ljIHR5cGVzIG9mIGNhcmRzIGhlcmUgICovCisJCQlpZiAoKGRzdF9jaGVja19jYV9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyKSkgPCAwKSB7CisJCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+Q0FfUE1UX1JFUExZIEZhaWxlZCAhIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiAtLT5DQV9QTVRfUkVQTFkgU3VjY2VzcyAhIik7CisJCQlicmVhazsKKwkJY2FzZSBDQV9BUFBfSU5GT19FTlFVSVJZOgkJLy8gb25seSBmb3IgZGVidWdnaW5nCisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIEdldHRpbmcgQ2FtIEFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIik7CiAKLQkJCQlicmVhazsKLQotCQkJY2FzZSBDQV9QTVRfUkVQTFk6Ci0JCQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJCQlkcHJpbnRrKCJDb21tYW5kID0gQ0FfUE1UX1JFUExZXG4iKTsKLQkJCQkvKiAgICAgIEhhdmUgdG8gaGFuZGxlIHRoZSAyIGJhc2ljIHR5cGVzIG9mIGNhcmRzIGhlcmUgICovCi0JCQkJaWYgKChkc3RfY2hlY2tfY2FfcG10KHN0YXRlLCBwX2NhX21lc3NhZ2UsIGh3X2J1ZmZlcikpIDwgMCkgewotCQkJCQlkcHJpbnRrKCIlczogLS0+Q0FfUE1UX1JFUExZIEZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWlmICh2ZXJib3NlID4gMykKLQkJCQkJZHByaW50aygiJXM6IC0tPkNBX1BNVF9SRVBMWSBTdWNjZXNzICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJCQkvKiAgICAgIENlcnRhaW4gYm9hcmRzIGRvIGJlaGF2ZSBkaWZmZXJlbnQgPyAgICAgICAgICAgICovCi0vLwkJCQlyZXR2YWwgPSBjYV9zZXRfcG10KHN0YXRlLCBwX2NhX21lc3NhZ2UsIGh3X2J1ZmZlciwgMSwgMSk7Ci0KLQkJCWNhc2UgQ0FfQVBQX0lORk9fRU5RVUlSWToJCS8vIG9ubHkgZm9yIGRlYnVnZ2luZwotCQkJCWlmICh2ZXJib3NlID4gMykKLQkJCQkJZHByaW50aygiJXM6IEdldHRpbmcgQ2FtIEFwcGxpY2F0aW9uIGluZm9ybWF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCQkJaWYgKChjYV9nZXRfYXBwX2luZm8oc3RhdGUpKSA8IDApIHsKLQkJCQkJZHByaW50aygiJXM6IC0tPkNBX0FQUF9JTkZPX0VOUVVJUlkgRmFpbGVkICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJCQlkcHJpbnRrKCIlczogLS0+Q0FfQVBQX0lORk9fRU5RVUlSWSBTdWNjZXNzICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJCQlicmVhazsKKwkJCWlmICgoY2FfZ2V0X2FwcF9pbmZvKHN0YXRlKSkgPCAwKSB7CisJCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+Q0FfQVBQX0lORk9fRU5RVUlSWSBGYWlsZWQgISIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+Q0FfQVBQX0lORk9fRU5RVUlSWSBTdWNjZXNzICEiKTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtNTg0LDEyMSArNDY5LDg4IEBACiAJc3RydWN0IGNhX21zZyAqcF9jYV9tZXNzYWdlOwogCiAJaWYgKChwX2NhX21lc3NhZ2UgPSAoc3RydWN0IGNhX21zZyAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNhX21zZyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCWRwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQogCWlmICgocF9jYV9zbG90X2luZm8gPSAoc3RydWN0IGNhX3Nsb3RfaW5mbyAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNhX3Nsb3RfaW5mbyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCWRwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQogCWlmICgocF9jYV9jYXBzID0gKHN0cnVjdCBjYV9jYXBzICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfY2FwcyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCWRwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQogCS8qCVdlIGhhdmUgbm93IG9ubHkgdGhlIHN0YW5kYXJkIGlvY3RsJ3MsIHRoZSBkcml2ZXIgaXMgdXBwb3NlZCB0byBoYW5kbGUgaW50ZXJuYWxzLgkqLwogCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgQ0FfU0VORF9NU0c6Ci0JCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJZHByaW50aygiJXM6IFNlbmRpbmcgbWVzc2FnZVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCWlmICgoY2Ffc2VuZF9tZXNzYWdlKHN0YXRlLCBwX2NhX21lc3NhZ2UsIGFyZykpIDwgMCkgewotCQkJCWRwcmludGsoIiVzOiAtLT5DQV9TRU5EX01TRyBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FfR0VUX01TRzoKLQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQlkcHJpbnRrKCIlczogR2V0dGluZyBtZXNzYWdlXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJaWYgKChjYV9nZXRfbWVzc2FnZShzdGF0ZSwgcF9jYV9tZXNzYWdlLCBhcmcpKSA8IDApIHsKLQkJCQlkcHJpbnRrKCIlczogLS0+Q0FfR0VUX01TRyBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJZHByaW50aygiJXM6IC0tPkNBX0dFVF9NU0cgU3VjY2VzcyAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCQlicmVhazsKLQotCQljYXNlIENBX1JFU0VUOgotCQkJaWYgKHZlcmJvc2UgPiAxKQotCQkJCWRwcmludGsoIiVzOiBSZXNldHRpbmcgRFNUXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJZHN0X2Vycm9yX2JhaWxvdXQoc3RhdGUpOwotCQkJbXNsZWVwKDQwMDApOwotCi0JCQlicmVhazsKLQotCQljYXNlIENBX0dFVF9TTE9UX0lORk86Ci0JCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJZHByaW50aygiJXM6IEdldHRpbmcgU2xvdCBpbmZvXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJaWYgKChjYV9nZXRfc2xvdF9pbmZvKHN0YXRlLCBwX2NhX3Nsb3RfaW5mbywgYXJnKSkgPCAwKSB7Ci0JCQkJZHByaW50aygiJXM6IC0tPkNBX0dFVF9TTE9UX0lORk8gRmFpbGVkICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKHZlcmJvc2UgPiAxKQotCQkJCWRwcmludGsoIiVzOiAtLT5DQV9HRVRfU0xPVF9JTkZPIFN1Y2Nlc3MgIVxuIiwgX19GVU5DVElPTl9fKTsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDQV9HRVRfQ0FQOgotCQkJaWYgKHZlcmJvc2UgPiAxKQotCQkJCWRwcmludGsoIiVzOiBHZXR0aW5nIFNsb3QgY2FwYWJpbGl0aWVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJaWYgKChjYV9nZXRfc2xvdF9jYXBzKHN0YXRlLCBwX2NhX2NhcHMsIGFyZykpIDwgMCkgewotCQkJCWRwcmludGsoIiVzOiAtLT5DQV9HRVRfQ0FQIEZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQlkcHJpbnRrKCIlczogLS0+Q0FfR0VUX0NBUCBTdWNjZXNzICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FfR0VUX0RFU0NSX0lORk86Ci0JCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJZHByaW50aygiJXM6IEdldHRpbmcgZGVzY3JhbWJsZXIgZGVzY3JpcHRpb25cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlpZiAoKGNhX2dldF9zbG90X2Rlc2NyKHN0YXRlLCBwX2NhX21lc3NhZ2UsIGFyZykpIDwgMCkgewotCQkJCWRwcmludGsoIiVzOiAtLT5DQV9HRVRfREVTQ1JfSU5GTyBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJZHByaW50aygiJXM6IC0tPkNBX0dFVF9ERVNDUl9JTkZPIFN1Y2Nlc3MgIVxuIiwgX19GVU5DVElPTl9fKTsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDQV9TRVRfREVTQ1I6Ci0JCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJZHByaW50aygiJXM6IFNldHRpbmcgZGVzY3JhbWJsZXJcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlpZiAoKGNhX3NldF9zbG90X2Rlc2NyKCkpIDwgMCkgewotCQkJCWRwcmludGsoIiVzOiAtLT5DQV9TRVRfREVTQ1IgRmFpbGVkICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKHZlcmJvc2UgPiAxKQotCQkJCWRwcmludGsoIiVzOiAtLT5DQV9TRVRfREVTQ1IgU3VjY2VzcyAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCQlicmVhazsKLQotCQljYXNlIENBX1NFVF9QSUQ6Ci0JCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJZHByaW50aygiJXM6IFNldHRpbmcgUElEXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJaWYgKChjYV9zZXRfcGlkKCkpIDwgMCkgewotCQkJCWRwcmludGsoIiVzOiAtLT5DQV9TRVRfUElEIEZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQlkcHJpbnRrKCIlczogLS0+Q0FfU0VUX1BJRCBTdWNjZXNzICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQkJfTsKKwljYXNlIENBX1NFTkRfTVNHOgorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIFNlbmRpbmcgbWVzc2FnZSIpOworCQlpZiAoKGNhX3NlbmRfbWVzc2FnZShzdGF0ZSwgcF9jYV9tZXNzYWdlLCBhcmcpKSA8IDApIHsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIC0tPkNBX1NFTkRfTVNHIEZhaWxlZCAhIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDQV9HRVRfTVNHOgorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIEdldHRpbmcgbWVzc2FnZSIpOworCQlpZiAoKGNhX2dldF9tZXNzYWdlKHN0YXRlLCBwX2NhX21lc3NhZ2UsIGFyZykpIDwgMCkgeworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+Q0FfR0VUX01TRyBGYWlsZWQgISIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+Q0FfR0VUX01TRyBTdWNjZXNzICEiKTsKKwkJYnJlYWs7CisJY2FzZSBDQV9SRVNFVDoKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgUmVzZXR0aW5nIERTVCIpOworCQlkc3RfZXJyb3JfYmFpbG91dChzdGF0ZSk7CisJCW1zbGVlcCg0MDAwKTsKKwkJYnJlYWs7CisJY2FzZSBDQV9HRVRfU0xPVF9JTkZPOgorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIEdldHRpbmcgU2xvdCBpbmZvIik7CisJCWlmICgoY2FfZ2V0X3Nsb3RfaW5mbyhzdGF0ZSwgcF9jYV9zbG90X2luZm8sIGFyZykpIDwgMCkgeworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+Q0FfR0VUX1NMT1RfSU5GTyBGYWlsZWQgISIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+Q0FfR0VUX1NMT1RfSU5GTyBTdWNjZXNzICEiKTsKKwkJYnJlYWs7CisJY2FzZSBDQV9HRVRfQ0FQOgorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIEdldHRpbmcgU2xvdCBjYXBhYmlsaXRpZXMiKTsKKwkJaWYgKChjYV9nZXRfc2xvdF9jYXBzKHN0YXRlLCBwX2NhX2NhcHMsIGFyZykpIDwgMCkgeworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+Q0FfR0VUX0NBUCBGYWlsZWQgISIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+Q0FfR0VUX0NBUCBTdWNjZXNzICEiKTsKKwkJYnJlYWs7CisJY2FzZSBDQV9HRVRfREVTQ1JfSU5GTzoKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiBHZXR0aW5nIGRlc2NyYW1ibGVyIGRlc2NyaXB0aW9uIik7CisJCWlmICgoY2FfZ2V0X3Nsb3RfZGVzY3Ioc3RhdGUsIHBfY2FfbWVzc2FnZSwgYXJnKSkgPCAwKSB7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiAtLT5DQV9HRVRfREVTQ1JfSU5GTyBGYWlsZWQgISIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+Q0FfR0VUX0RFU0NSX0lORk8gU3VjY2VzcyAhIik7CisJCWJyZWFrOworCWNhc2UgQ0FfU0VUX0RFU0NSOgorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIFNldHRpbmcgZGVzY3JhbWJsZXIiKTsKKwkJaWYgKChjYV9zZXRfc2xvdF9kZXNjcigpKSA8IDApIHsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIC0tPkNBX1NFVF9ERVNDUiBGYWlsZWQgISIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+Q0FfU0VUX0RFU0NSIFN1Y2Nlc3MgISIpOworCQlicmVhazsKKwljYXNlIENBX1NFVF9QSUQ6CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgU2V0dGluZyBQSUQiKTsKKwkJaWYgKChjYV9zZXRfcGlkKCkpIDwgMCkgeworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+Q0FfU0VUX1BJRCBGYWlsZWQgISIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+Q0FfU0VUX1BJRCBTdWNjZXNzICEiKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRzdF9jYV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCWlmICh2ZXJib3NlID4gNCkKLQkJZHByaW50aygiJXM6RGV2aWNlIG9wZW5lZCBbJXBdXG4iLCBfX0ZVTkNUSU9OX18sIGZpbGUpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIERldmljZSBvcGVuZWQgWyVwXSAiLCBmaWxlKTsKIAl0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSk7CiAKIAlyZXR1cm4gMDsKQEAgLTcwNiwyNyArNTU4LDI0IEBACiAKIHN0YXRpYyBpbnQgZHN0X2NhX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JaWYgKHZlcmJvc2UgPiA0KQotCQlkcHJpbnRrKCIlczpEZXZpY2UgY2xvc2VkLlxuIiwgX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMSwgIiBEZXZpY2UgY2xvc2VkLiIpOwogCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X2NhX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICogYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBsb2ZmX3QgKiBvZmZzZXQpCitzdGF0aWMgaW50IGRzdF9jYV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBsb2ZmX3QgKm9mZnNldCkKIHsKIAlpbnQgYnl0ZXNfcmVhZCA9IDA7CiAKLQlpZiAodmVyYm9zZSA+IDQpCi0JCWRwcmludGsoIiVzOkRldmljZSByZWFkLlxuIiwgX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMSwgIiBEZXZpY2UgcmVhZC4iKTsKIAogCXJldHVybiBieXRlc19yZWFkOwogfQogCi1zdGF0aWMgaW50IGRzdF9jYV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsIHNpemVfdCBsZW5ndGgsIGxvZmZfdCAqIG9mZnNldCkKK3N0YXRpYyBpbnQgZHN0X2NhX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBsb2ZmX3QgKm9mZnNldCkKIHsKLQlpZiAodmVyYm9zZSA+IDQpCi0JCWRwcmludGsoIiVzOkRldmljZSB3cml0ZS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfREVCVUcsIDEsICIgRGV2aWNlIHdyaXRlLiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NTEsOCArNjAwLDcgQEAKIGludCBkc3RfY2FfYXR0YWNoKHN0cnVjdCBkc3Rfc3RhdGUgKmRzdCwgc3RydWN0IGR2Yl9hZGFwdGVyICpkdmJfYWRhcHRlcikKIHsKIAlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2OwotCWlmICh2ZXJib3NlID4gNCkKLQkJZHByaW50aygiJXM6cmVnaXN0ZXJpbmcgRFNULUNBIGRldmljZVxuIiwgX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgInJlZ2lzdGVyaW5nIERTVC1DQSBkZXZpY2UiKTsKIAlkdmJfcmVnaXN0ZXJfZGV2aWNlKGR2Yl9hZGFwdGVyLCAmZHZiZGV2LCAmZHZiZGV2X2NhLCBkc3QsIERWQl9ERVZJQ0VfQ0EpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NvbW1vbi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NvbW1vbi5oCmluZGV4IGVmNTMyYTYuLjMyODFhNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jb21tb24uaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY29tbW9uLmgKQEAgLTYxLDcgKzYxLDYgQEAKICNkZWZpbmUJRFNUX1RZUEVfSEFTX0FOQUxPRwk2NAkvKglBbmFsb2cgaW5wdXRzCSovCiAjZGVmaW5lIERTVF9UWVBFX0hBU19TRVNTSU9OCTEyOAogCi0KICNkZWZpbmUgUkRDXzg4MjBfUElPXzBfRElTQUJMRQkwCiAjZGVmaW5lIFJEQ184ODIwX1BJT18wX0VOQUJMRQkxCiAjZGVmaW5lIFJEQ184ODIwX0lOVAkJMgpAQCAtMTE0LDYgKzExMywxMCBAQAogCWZlX3NlY19taW5pX2NtZF90IG1pbmljbWQ7CiAJZmVfbW9kdWxhdGlvbl90IG1vZHVsYXRpb247CiAJdTggbWVzc2FnZXNbMjU2XTsKKwl1OCBtYWNfYWRkcmVzc1s4XTsKKwl1OCBmd192ZXJzaW9uWzhdOworCXU4IGNhcmRfaW5mb1s4XTsKKwl1OCB2ZW5kb3JbOF07CiB9OwogCiBzdHJ1Y3QgZHN0X3R5cGVzIHsKQEAgLTEyNCwxNSArMTI3LDEyIEBACiAJdTMyIGRzdF9mZWF0dXJlOwogfTsKIAotCi0KIHN0cnVjdCBkc3RfY29uZmlnCiB7CiAJLyogdGhlIEFTSUMgaTJjIGFkZHJlc3MgKi8KIAl1OCBkZW1vZF9hZGRyZXNzOwogfTsKIAotCiBpbnQgcmRjX3Jlc2V0X3N0YXRlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKTsKIGludCByZGNfODgyMF9yZXNldChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMKaW5kZXggNmY4NTdjNi4uYzVjNzY3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMKQEAgLTMyLDkgKzMyLDcgQEAKICNpbmNsdWRlICJkdmJkZXYuaCIKICNpbmNsdWRlICJkdmJfZGVtdXguaCIKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKLQogI2luY2x1ZGUgImR2Yi1idDh4eC5oIgotCiAjaW5jbHVkZSAiYnQ4NzguaCIKIAogc3RhdGljIGludCBkZWJ1ZzsKQEAgLTQzLDkgKzQxLDExIEBACiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CiAKICNkZWZpbmUgZHByaW50ayggYXJncy4uLiApIFwKLQlkbyB7IFwKKwlkbyBcCiAJCWlmIChkZWJ1ZykgcHJpbnRrKEtFUk5fREVCVUcgYXJncyk7IFwKLQl9IHdoaWxlICgwKQorCXdoaWxlICgwKQorCisjZGVmaW5lIElGX0ZSRVFVRU5DWXg2IDIxNyAgICAvKiA2ICogMzYuMTY2NjY2NjY2NjdNSHogKi8KIAogc3RhdGljIHZvaWQgZHZiX2J0OHh4X3Rhc2sodW5zaWduZWQgbG9uZyBkYXRhKQogewpAQCAtMTE5LDE0ICsxMTksMTIgQEAKIAl1bnNpZ25lZCBpbnQgY2FyZF9ucjsKIAogCS8qIEhtbSwgbiBzcXVhcmVkLiBIb3BlIG4gaXMgc21hbGwgKi8KLQlmb3IgKGNhcmRfbnIgPSAwOyBjYXJkX25yIDwgYnQ4NzhfbnVtOyBjYXJkX25yKyspIHsKKwlmb3IgKGNhcmRfbnIgPSAwOyBjYXJkX25yIDwgYnQ4NzhfbnVtOyBjYXJkX25yKyspCiAJCWlmIChpc19wY2lfc2xvdF9lcShidDg3OFtjYXJkX25yXS5kZXYsIGJ0dHZfcGNpX2RldikpCiAJCQlyZXR1cm4gJmJ0ODc4W2NhcmRfbnJdOwotCX0KIAlyZXR1cm4gTlVMTDsKIH0KIAotCiBzdGF0aWMgaW50IHRob21zb25fZHR0NzU3OV9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0YXRpYyB1OCBtdDM1Ml9jbG9ja19jb25maWcgW10gPSB7IDB4ODksIDB4MzgsIDB4MzggfTsKQEAgLTE1NCwxNiArMTUyLDIxIEBACiAJdW5zaWduZWQgY2hhciBicyA9IDA7CiAJdW5zaWduZWQgY2hhciBjcCA9IDA7CiAKLQkjZGVmaW5lIElGX0ZSRVFVRU5DWXg2IDIxNyAgICAvKiA2ICogMzYuMTY2NjY2NjY2NjdNSHogKi8KIAlkaXYgPSAoKChwYXJhbXMtPmZyZXF1ZW5jeSArIDgzMzMzKSAqIDMpIC8gNTAwMDAwKSArIElGX0ZSRVFVRU5DWXg2OwogCi0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNTQyMDAwMDAwKSBjcCA9IDB4YjQ7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA3NzEwMDAwMDApIGNwID0gMHhiYzsKLQllbHNlIGNwID0gMHhmNDsKKwlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA1NDIwMDAwMDApCisJCWNwID0gMHhiNDsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDc3MTAwMDAwMCkKKwkJY3AgPSAweGJjOworCWVsc2UKKwkJY3AgPSAweGY0OwogCi0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5ID09IDApIGJzID0gMHgwMzsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ0MzI1MDAwMCkgYnMgPSAweDAyOwotCWVsc2UgYnMgPSAweDA4OworCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA9PSAwKQorCQlicyA9IDB4MDM7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0NDMyNTAwMDApCisJCWJzID0gMHgwMjsKKwllbHNlCisJCWJzID0gMHgwODsKIAogCXBsbGJ1ZlswXSA9IDB4YzA7IC8vIE5vdGU6IG5vbi1saW51eCBzdGFuZGFyZCBQTEwgaTJjIGFkZHJlc3MKIAlwbGxidWZbMV0gPSBkaXYgPj4gODsKQEAgLTE3NSw3ICsxNzgsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IG10MzUyX2NvbmZpZyB0aG9tc29uX2R0dDc1NzlfY29uZmlnID0gewotCiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5kZW1vZF9pbml0ID0gdGhvbXNvbl9kdHQ3NTc5X2RlbW9kX2luaXQsCiAJLnBsbF9zZXQgPSB0aG9tc29uX2R0dDc1NzlfcGxsX3NldCwKQEAgLTE4MywyNSArMTg1LDI2IEBACiAKIHN0YXRpYyBpbnQgY3gyNDEwOF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKLSAgIHUzMiBmcmVxID0gcGFyYW1zLT5mcmVxdWVuY3k7CisJdTMyIGZyZXEgPSBwYXJhbXMtPmZyZXF1ZW5jeTsKIAotICAgaW50IGksIGEsIG4sIHB1bXA7Ci0gICB1MzIgYmFuZCwgcGxsOworCWludCBpLCBhLCBuLCBwdW1wOworCXUzMiBiYW5kLCBwbGw7CiAKKwl1MzIgb3NjaVtdPXs5NTAwMDAsMTAxOTAwMCwxMDc1MDAwLDExNzgwMDAsMTI5NjAwMCwxNDMyMDAwLAorCQkxNTc2MDAwLDE3MTgwMDAsMTg1NjAwMCwyMDM2MDAwLDIxNTAwMDB9OworCXUzMiBiYW5kc2VsW109ezAsMHgwMDAyMDAwMCwweDAwMDQwMDAwLDB4MDAxMDA4MDAsMHgwMDEwMTAwMCwKKwkJMHgwMDEwMjAwMCwweDAwMTA0MDAwLDB4MDAxMDgwMDAsMHgwMDExMDAwMCwKKwkJMHgwMDEyMDAwMCwweDAwMTQwMDAwfTsKIAotICAgdTMyIG9zY2lbXT17OTUwMDAwLDEwMTkwMDAsMTA3NTAwMCwxMTc4MDAwLDEyOTYwMDAsMTQzMjAwMCwKLQkgICAgICAgMTU3NjAwMCwxNzE4MDAwLDE4NTYwMDAsMjAzNjAwMCwyMTUwMDAwfTsKLSAgIHUzMiBiYW5kc2VsW109ezAsMHgwMDAyMDAwMCwweDAwMDQwMDAwLDB4MDAxMDA4MDAsMHgwMDEwMTAwMCwKLQkgICAgICAgMHgwMDEwMjAwMCwweDAwMTA0MDAwLDB4MDAxMDgwMDAsMHgwMDExMDAwMCwKLQkgICAgICAgMHgwMDEyMDAwMCwweDAwMTQwMDAwfTsKLQotI2RlZmluZSBYVEFMIDEwMTExMDAgLyogSHosIHJlYWxseSAxLjAxMTEgTUh6IGFuZCBhIC8xMCBwcmVzY2FsZXIgKi8KKwkjZGVmaW5lIFhUQUwgMTAxMTEwMCAvKiBIeiwgcmVhbGx5IDEuMDExMSBNSHogYW5kIGEgLzEwIHByZXNjYWxlciAqLwogCXByaW50aygiY3gyNDEwOCBkZWJ1ZzogZW50ZXJpbmcgU2V0VHVuZXJGcmVxLCBmcmVxPSVkXG4iLGZyZXEpOwogCiAJLyogVGhpcyBpcyByZWFsbHkgdGhlIGJpdCBkcml2aW5nIHRoZSB0dW5lciBjaGlwIGN4MjQxMDggKi8KIAotCWlmKGZyZXE8OTUwMDAwKSBmcmVxPTk1MDAwMDsgLyoga0h6ICovCi0JaWYoZnJlcT4yMTUwMDAwKSBmcmVxPTIxNTAwMDA7IC8qIHNhdGVsbGl0ZSBJRiBpcyA5NTAuLjIxNTBNSHogKi8KKwlpZiAoZnJlcTw5NTAwMDApCisJCWZyZXEgPSA5NTAwMDA7IC8qIGtIeiAqLworCWVsc2UgaWYgKGZyZXE+MjE1MDAwMCkKKwkJZnJlcSA9IDIxNTAwMDA7IC8qIHNhdGVsbGl0ZSBJRiBpcyA5NTAuLjIxNTBNSHogKi8KIAogCS8qIGRlY2lkZSB3aGljaCBWQ08gdG8gdXNlIGZvciB0aGUgaW5wdXQgZnJlcXVlbmN5ICovCiAJZm9yKGk9MTsoaTxzaXplb2Yob3NjaSkvc2l6ZW9mKG9zY2lbMF0pKSYmKG9zY2lbaV08ZnJlcSk7aSsrKTsKQEAgLTIyOCwyNSArMjMxLDIyIEBACiAJY3gyNDExMF9wbGxfd3JpdGUoZmUsMHg1MDBjMDAwMCk7CiAJY3gyNDExMF9wbGxfd3JpdGUoZmUsMHg4M2YxZjgwMCk7CiAJY3gyNDExMF9wbGxfd3JpdGUoZmUscGxsKTsKLS8qICAgICAgICB3cml0ZXJlZyhjbGllbnQsMHg1NiwweDdmKTsqLworCS8vd3JpdGVyZWcoY2xpZW50LDB4NTYsMHg3Zik7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwaW5uc2F0X3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewotICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIHN0cnVjdCBjeDI0MTEwX2NvbmZpZyBwY3R2c2F0X2NvbmZpZyA9IHsKLQogCS5kZW1vZF9hZGRyZXNzID0gMHg1NSwKIAkucGxsX2luaXQgPSBwaW5uc2F0X3BsbF9pbml0LAogCS5wbGxfc2V0ID0gY3gyNDEwOF9wbGxfc2V0LAogfTsKIAotCiBzdGF0aWMgaW50IG1pY3JvdHVuZV9tdDcyMDJkdGZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CiAJc3RydWN0IGR2Yl9idDh4eF9jYXJkICpjYXJkID0gKHN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqKSBmZS0+ZHZiLT5wcml2OwpAQCAtMjU4LDE1ICsyNTgsMjMgQEAKIAlkaXYgPSAoMzYwMDAwMDAgKyBwYXJhbXMtPmZyZXF1ZW5jeSArIDgzMzMzKSAvIDE2NjY2NjsKIAljZmcgPSAweDg4OwogCi0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTc1MDAwMDAwKSBjcHVtcCA9IDI7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAzOTAwMDAwMDApIGNwdW1wID0gMTsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ3MDAwMDAwMCkgY3B1bXAgPSAyOwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNzUwMDAwMDAwKSBjcHVtcCA9IDI7Ci0JZWxzZSBjcHVtcCA9IDM7CisJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTc1MDAwMDAwKQorCQljcHVtcCA9IDI7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAzOTAwMDAwMDApCisJCWNwdW1wID0gMTsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ3MDAwMDAwMCkKKwkJY3B1bXAgPSAyOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNzUwMDAwMDAwKQorCQljcHVtcCA9IDI7CisJZWxzZQorCQljcHVtcCA9IDM7CiAKLQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzUwMDAwMDApIGJhbmRfc2VsZWN0ID0gMHgwZTsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ3MDAwMDAwMCkgYmFuZF9zZWxlY3QgPSAweDA1OwotCWVsc2UgYmFuZF9zZWxlY3QgPSAweDAzOworCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE3NTAwMDAwMCkKKwkJYmFuZF9zZWxlY3QgPSAweDBlOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDcwMDAwMDAwKQorCQliYW5kX3NlbGVjdCA9IDB4MDU7CisJZWxzZQorCQliYW5kX3NlbGVjdCA9IDB4MDM7CiAKIAlkYXRhWzBdID0gKGRpdiA+PiA4KSAmIDB4N2Y7CiAJZGF0YVsxXSA9IGRpdiAmIDB4ZmY7CkBAIC0yODUsMTQgKzI5MywxMSBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNwODg3eF9jb25maWcgbWljcm90dW5lX210NzIwMmR0Zl9jb25maWcgPSB7Ci0KIAkuZGVtb2RfYWRkcmVzcyA9IDB4NzAsCiAJLnBsbF9zZXQgPSBtaWNyb3R1bmVfbXQ3MjAyZHRmX3BsbF9zZXQsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBtaWNyb3R1bmVfbXQ3MjAyZHRmX3JlcXVlc3RfZmlybXdhcmUsCiB9OwogCi0KLQogc3RhdGljIGludCBhZHZidDc3MV9zYW1zdW5nX3RkdGM5MjUxZGgwX2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RhdGljIHU4IG10MzUyX2Nsb2NrX2NvbmZpZyBbXSA9IHsgMHg4OSwgMHgzOCwgMHgyZCB9OwpAQCAtMzAzLDcgKzMwOCw2IEBACiAJc3RhdGljIHU4IG10MzUyX2F2NzcxX2V4dHJhW10gPSB7IDB4QjUsIDB4N0EgfTsKIAlzdGF0aWMgdTggbXQzNTJfY2FwdF9yYW5nZV9jZmdbXSA9IHsgMHg3NSwgMHgzMiB9OwogCi0KIAltdDM1Ml93cml0ZShmZSwgbXQzNTJfY2xvY2tfY29uZmlnLCBzaXplb2YobXQzNTJfY2xvY2tfY29uZmlnKSk7CiAJdWRlbGF5KDIwMDApOwogCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9yZXNldCwgc2l6ZW9mKG10MzUyX3Jlc2V0KSk7CkBAIC0zMjMsMjggKzMyNyw0NSBAQAogCXVuc2lnbmVkIGNoYXIgYnMgPSAwOwogCXVuc2lnbmVkIGNoYXIgY3AgPSAwOwogCi0JI2RlZmluZSBJRl9GUkVRVUVOQ1l4NiAyMTcgICAgLyogNiAqIDM2LjE2NjY2NjY2NjY3TUh6ICovCiAJZGl2ID0gKCgocGFyYW1zLT5mcmVxdWVuY3kgKyA4MzMzMykgKiAzKSAvIDUwMDAwMCkgKyBJRl9GUkVRVUVOQ1l4NjsKIAotCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE1MDAwMDAwMCkgY3AgPSAweEI0OwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTczMDAwMDAwKSBjcCA9IDB4QkM7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAyNTAwMDAwMDApIGNwID0gMHhCNDsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQwMDAwMDAwMCkgY3AgPSAweEJDOwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDIwMDAwMDAwKSBjcCA9IDB4RjQ7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0NzAwMDAwMDApIGNwID0gMHhGQzsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDYwMDAwMDAwMCkgY3AgPSAweEJDOwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNzMwMDAwMDAwKSBjcCA9IDB4RjQ7Ci0JZWxzZSBjcCA9IDB4RkM7CisJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTUwMDAwMDAwKQorCQljcCA9IDB4QjQ7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzMwMDAwMDApCisJCWNwID0gMHhCQzsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDI1MDAwMDAwMCkKKwkJY3AgPSAweEI0OworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDAwMDAwMDAwKQorCQljcCA9IDB4QkM7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0MjAwMDAwMDApCisJCWNwID0gMHhGNDsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ3MDAwMDAwMCkKKwkJY3AgPSAweEZDOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNjAwMDAwMDAwKQorCQljcCA9IDB4QkM7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA3MzAwMDAwMDApCisJCWNwID0gMHhGNDsKKwllbHNlCisJCWNwID0gMHhGQzsKIAotCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE1MDAwMDAwMCkgYnMgPSAweDAxOwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTczMDAwMDAwKSBicyA9IDB4MDE7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAyNTAwMDAwMDApIGJzID0gMHgwMjsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQwMDAwMDAwMCkgYnMgPSAweDAyOwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDIwMDAwMDAwKSBicyA9IDB4MDI7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0NzAwMDAwMDApIGJzID0gMHgwMjsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDYwMDAwMDAwMCkgYnMgPSAweDA4OwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNzMwMDAwMDAwKSBicyA9IDB4MDg7Ci0JZWxzZSBicyA9IDB4MDg7CisJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTUwMDAwMDAwKQorCQlicyA9IDB4MDE7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzMwMDAwMDApCisJCWJzID0gMHgwMTsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDI1MDAwMDAwMCkKKwkJYnMgPSAweDAyOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDAwMDAwMDAwKQorCQlicyA9IDB4MDI7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0MjAwMDAwMDApCisJCWJzID0gMHgwMjsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ3MDAwMDAwMCkKKwkJYnMgPSAweDAyOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNjAwMDAwMDAwKQorCQlicyA9IDB4MDg7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA3MzAwMDAwMDApCisJCWJzID0gMHgwODsKKwllbHNlCisJCWJzID0gMHgwODsKIAogCXBsbGJ1ZlswXSA9IDB4YzI7IC8vIE5vdGU6IG5vbi1saW51eCBzdGFuZGFyZCBQTEwgaTJjIGFkZHJlc3MKIAlwbGxidWZbMV0gPSBkaXYgPj4gODsKQEAgLTM1NiwxOSArMzc3LDE1IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIGFkdmJ0NzcxX3NhbXN1bmdfdGR0YzkyNTFkaDBfY29uZmlnID0gewotCiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5kZW1vZF9pbml0ID0gYWR2YnQ3NzFfc2Ftc3VuZ190ZHRjOTI1MWRoMF9kZW1vZF9pbml0LAogCS5wbGxfc2V0ID0gYWR2YnQ3NzFfc2Ftc3VuZ190ZHRjOTI1MWRoMF9wbGxfc2V0LAogfTsKIAotCiBzdGF0aWMgc3RydWN0IGRzdF9jb25maWcgZHN0X2NvbmZpZyA9IHsKLQogCS5kZW1vZF9hZGRyZXNzID0gMHg1NSwKIH07CiAKLQogc3RhdGljIGludCBvcjUxMjExX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKQogewogCXN0cnVjdCBkdmJfYnQ4eHhfY2FyZCogYnQgPSAoc3RydWN0IGR2Yl9idDh4eF9jYXJkKikgZmUtPmR2Yi0+cHJpdjsKQEAgLTM5OCwxMCArNDE1LDggQEAKIAkgKi8KIAkvKiByZXNldCAmIFBSTTEsMiY0IGFyZSBvdXRwdXRzICovCiAJaW50IHJldCA9IGJ0dHZfZ3Bpb19lbmFibGUoYnQtPmJ0dHZfbnIsIDB4MDAxRiwgMHgwMDFGKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTIxMTogSW5pdCBFcnJvciAtIENhbid0IFJlc2V0IERWUiAiCi0JCSAgICAgICAiKCVpKVxuIiwgcmV0KTsKLQl9CisJaWYgKHJldCAhPSAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMjExOiBJbml0IEVycm9yIC0gQ2FuJ3QgUmVzZXQgRFZSICglaSlcbiIsIHJldCk7CiAJYnR0dl93cml0ZV9ncGlvKGJ0LT5idHR2X25yLCAweDAwMUYsIDB4MDAwMCk7ICAgLyogUmVzZXQgKi8KIAltc2xlZXAoMjApOwogCS8qIE5vdyBzZXQgZm9yIG5vcm1hbCBvcGVyYXRpb24gKi8KQEAgLTQxNyw3ICs0MzIsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IG9yNTEyMTFfY29uZmlnIG9yNTEyMTFfY29uZmlnID0gewotCiAJLmRlbW9kX2FkZHJlc3MgPSAweDE1LAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gb3I1MTIxMV9yZXF1ZXN0X2Zpcm13YXJlLAogCS5zZXRtb2RlID0gb3I1MTIxMV9zZXRtb2RlLApAQCAtNDI1LDcgKzQzOSw2IEBACiAJLnNsZWVwID0gb3I1MTIxMV9zbGVlcCwKIH07CiAKLQogc3RhdGljIGludCB2cDMwMjFfYWxwc190ZGVkNF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgKmNhcmQgPSAoc3RydWN0IGR2Yl9idDh4eF9jYXJkICopIGZlLT5kdmItPnByaXY7CkBAIC00NTQsMTIgKzQ2Nyw4NCBAQAogfQogCiBzdGF0aWMgc3RydWN0IG54dDYwMDBfY29uZmlnIHZwMzAyMV9hbHBzX3RkZWQ0X2NvbmZpZyA9IHsKLQogCS5kZW1vZF9hZGRyZXNzID0gMHgwYSwKIAkuY2xvY2tfaW52ZXJzaW9uID0gMSwKIAkucGxsX3NldCA9IHZwMzAyMV9hbHBzX3RkZWQ0X3BsbF9zZXQsCiB9OwogCitzdGF0aWMgaW50IGRpZ2l0dl9hbHBzX3RkZWQ0X2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RhdGljIHU4IG10MzUyX2Nsb2NrX2NvbmZpZyBbXSA9IHsgMHg4OSwgMHgzOCwgMHgyZCB9OworCXN0YXRpYyB1OCBtdDM1Ml9yZXNldCBbXSA9IHsgMHg1MCwgMHg4MCB9OworCXN0YXRpYyB1OCBtdDM1Ml9hZGNfY3RsXzFfY2ZnIFtdID0geyAweDhFLCAweDQwIH07CisJc3RhdGljIHU4IG10MzUyX2FnY19jZmcgW10gPSB7IDB4NjcsIDB4MjAsIDB4YTAgfTsKKwlzdGF0aWMgdTggbXQzNTJfY2FwdF9yYW5nZV9jZmdbXSA9IHsgMHg3NSwgMHgzMiB9OworCisJbXQzNTJfd3JpdGUoZmUsIG10MzUyX2Nsb2NrX2NvbmZpZywgc2l6ZW9mKG10MzUyX2Nsb2NrX2NvbmZpZykpOworCXVkZWxheSgyMDAwKTsKKwltdDM1Ml93cml0ZShmZSwgbXQzNTJfcmVzZXQsIHNpemVvZihtdDM1Ml9yZXNldCkpOworCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hZGNfY3RsXzFfY2ZnLCBzaXplb2YobXQzNTJfYWRjX2N0bF8xX2NmZykpOworCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hZ2NfY2ZnLHNpemVvZihtdDM1Ml9hZ2NfY2ZnKSk7CisJbXQzNTJfd3JpdGUoZmUsIG10MzUyX2NhcHRfcmFuZ2VfY2ZnLCBzaXplb2YobXQzNTJfY2FwdF9yYW5nZV9jZmcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpZ2l0dl9hbHBzX3RkZWQ0X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zLCB1OCogcGxsYnVmKQoreworCXUzMiBkaXY7CisJc3RydWN0IGR2Yl9vZmRtX3BhcmFtZXRlcnMgKm9wID0gJnBhcmFtcy0+dS5vZmRtOworCisJZGl2ID0gKCgocGFyYW1zLT5mcmVxdWVuY3kgKyA4MzMzMykgKiAzKSAvIDUwMDAwMCkgKyBJRl9GUkVRVUVOQ1l4NjsKKworCXBsbGJ1ZlswXSA9IDB4YzI7CisJcGxsYnVmWzFdID0gKGRpdiA+PiA4KSAmIDB4N0Y7CisJcGxsYnVmWzJdID0gZGl2ICYgMHhGRjsKKwlwbGxidWZbM10gPSAweDg1OworCisJZHByaW50aygiZnJlcXVlbmN5ICV1LCBkaXYgJXVcbiIsIHBhcmFtcy0+ZnJlcXVlbmN5LCBkaXYpOworCisJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDcwMDAwMDAwKQorCQlwbGxidWZbNF0gPSAweDAyOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5ID4gODIzMDAwMDAwKQorCQlwbGxidWZbNF0gPSAweDg4OworCWVsc2UKKwkJcGxsYnVmWzRdID0gMHgwODsKKworCWlmIChvcC0+YmFuZHdpZHRoID09IDgpCisJCXBsbGJ1Zls0XSB8PSAweDA0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRpZ2l0dl9hbHBzX3RkZWQ0X3Jlc2V0KHN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqYnQpCit7CisJLyoKKwkgKiBSZXNldCB0aGUgZnJvbnRlbmQsIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0cnlpbmcKKwkgKiB0byBpbml0aWFsaXNlIHRoZSBNVDM1MiBvciBtdDM1Ml9hdHRhY2gKKwkgKiB3aWxsIGZhaWwuCisJICoKKwkgKiBQcmVzdW1hYmx5IG5vdCByZXF1aXJlZCBmb3IgdGhlIE5YVDYwMDAgZnJvbnRlbmQuCisJICoKKwkgKi8KKworCWludCByZXQgPSBidHR2X2dwaW9fZW5hYmxlKGJ0LT5idHR2X25yLCAweDA4LCAweDA4KTsKKwlpZiAocmV0ICE9IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImRpZ2l0dl9hbHBzX3RkZWQ0OiBJbml0IEVycm9yIC0gQ2FuJ3QgUmVzZXQgRFZSICglaSlcbiIsIHJldCk7CisKKwkvKiBQdWxzZSB0aGUgcmVzZXQgbGluZSAqLworCWJ0dHZfd3JpdGVfZ3BpbyhidC0+YnR0dl9uciwgMHgwOCwgMHgwOCk7IC8qIEhpZ2ggKi8KKwlidHR2X3dyaXRlX2dwaW8oYnQtPmJ0dHZfbnIsIDB4MDgsIDB4MDApOyAvKiBMb3cgICovCisJbXNsZWVwKDEwMCk7CisKKwlidHR2X3dyaXRlX2dwaW8oYnQtPmJ0dHZfbnIsIDB4MDgsIDB4MDgpOyAvKiBIaWdoICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIGRpZ2l0dl9hbHBzX3RkZWQ0X2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MGEsCisJLmRlbW9kX2luaXQgPSBkaWdpdHZfYWxwc190ZGVkNF9kZW1vZF9pbml0LAorCS5wbGxfc2V0ID0gZGlnaXR2X2FscHNfdGRlZDRfcGxsX3NldCwKK307CiAKIHN0YXRpYyB2b2lkIGZyb250ZW5kX2luaXQoc3RydWN0IGR2Yl9idDh4eF9jYXJkICpjYXJkLCB1MzIgdHlwZSkKIHsKQEAgLTQ3Myw3ICs1NTgsNiBAQAogCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkgewogCQkJY2FyZC0+ZmUtPm9wcy0+aW5mby5mcmVxdWVuY3lfbWluID0gMTc0MDAwMDAwOwogCQkJY2FyZC0+ZmUtPm9wcy0+aW5mby5mcmVxdWVuY3lfbWF4ID0gODYyMDAwMDAwOwotCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTQ4MywxNyArNTY3LDI4IEBACiAjZWxzZQogCWNhc2UgQlRUVl9ORUJVTEFfRElHSVRWOgogI2VuZGlmCisJCS8qCisJCSAqIEl0IGlzIHBvc3NpYmxlIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCBmcm9udGVuZCB1c2luZyB0aGUgSTJDIGJ1cyAoc2VlIHRoZSBOZWJ1bGEgU0RLKTsKKwkJICogdGhpcyB3b3VsZCBiZSBhIGNsZWFuZXIgc29sdXRpb24gdGhhbiB0cnlpbmcgZWFjaCBmcm9udGVuZCBpbiB0dXJuLgorCQkgKi8KKworCQkvKiBPbGQgTmVidWxhIChtYXJrZWQgKGMpMjAwMyBvbiBoaWdoIHByb2ZpbGUgcGNpIGNhcmQpIGhhcyBueHQ2MDAwIGRlbW9kICovCiAJCWNhcmQtPmZlID0gbnh0NjAwMF9hdHRhY2goJnZwMzAyMV9hbHBzX3RkZWQ0X2NvbmZpZywgY2FyZC0+aTJjX2FkYXB0ZXIpOwogCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkgeworCQkJZHByaW50ayAoImR2Yl9idDh4eDogYW4gbnh0NjAwMCB3YXMgZGV0ZWN0ZWQgb24geW91ciBkaWdpdHYgY2FyZFxuIik7CiAJCQlicmVhazsKIAkJfQorCisJCS8qIE5ldyBOZWJ1bGEgKG1hcmtlZCAoYykyMDA1IG9uIGxvdyBwcm9maWxlIHBjaSBjYXJkKSBoYXMgbXQzNTIgZGVtb2QgKi8KKwkJZGlnaXR2X2FscHNfdGRlZDRfcmVzZXQoY2FyZCk7CisJCWNhcmQtPmZlID0gbXQzNTJfYXR0YWNoKCZkaWdpdHZfYWxwc190ZGVkNF9jb25maWcsIGNhcmQtPmkyY19hZGFwdGVyKTsKKworCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkKKwkJCWRwcmludGsgKCJkdmJfYnQ4eHg6IGFuIG10MzUyIHdhcyBkZXRlY3RlZCBvbiB5b3VyIGRpZ2l0diBjYXJkXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJUVFZfQVZEVkJUXzc2MToKIAkJY2FyZC0+ZmUgPSBzcDg4N3hfYXR0YWNoKCZtaWNyb3R1bmVfbXQ3MjAyZHRmX2NvbmZpZywgY2FyZC0+aTJjX2FkYXB0ZXIpOwotCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkgewotCQkJYnJlYWs7Ci0JCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJUVFZfQVZEVkJUXzc3MToKQEAgLTUwMSw3ICs1OTYsNiBAQAogCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkgewogCQkJY2FyZC0+ZmUtPm9wcy0+aW5mby5mcmVxdWVuY3lfbWluID0gMTc0MDAwMDAwOwogCQkJY2FyZC0+ZmUtPm9wcy0+aW5mby5mcmVxdWVuY3lfbWF4ID0gODYyMDAwMDAwOwotCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTUyMiw1NCArNjE2LDQxIEBACiAKIAkJLyoJQXR0YWNoIG90aGVyIERTVCBwZXJpcGhlcmFscyBpZiBhbnkJCSovCiAJCS8qCUNvbmRpdGlvbmFsIEFjY2VzcyBkZXZpY2UJCQkqLwotCQlpZiAoc3RhdGUtPmRzdF9od19jYXAgJiBEU1RfVFlQRV9IQVNfQ0EpIHsKKwkJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX0NBKQogCQkJcmV0ID0gZHN0X2NhX2F0dGFjaChzdGF0ZSwgJmNhcmQtPmR2Yl9hZGFwdGVyKTsKLQkJfQotCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkgewotCQkJYnJlYWs7Ci0JCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJUVFZfUElOTkFDTEVTQVQ6CiAJCWNhcmQtPmZlID0gY3gyNDExMF9hdHRhY2goJnBjdHZzYXRfY29uZmlnLCBjYXJkLT5pMmNfYWRhcHRlcik7Ci0JCWlmIChjYXJkLT5mZSAhPSBOVUxMKSB7Ci0JCQlicmVhazsKLQkJfQogCQlicmVhazsKIAogCWNhc2UgQlRUVl9QQ19IRFRWOgogCQljYXJkLT5mZSA9IG9yNTEyMTFfYXR0YWNoKCZvcjUxMjExX2NvbmZpZywgY2FyZC0+aTJjX2FkYXB0ZXIpOwotCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkgewotCQkJYnJlYWs7Ci0JCX0KIAkJYnJlYWs7CiAJfQogCi0JaWYgKGNhcmQtPmZlID09IE5VTEwpIHsKKwlpZiAoY2FyZC0+ZmUgPT0gTlVMTCkKIAkJcHJpbnRrKCJkdmItYnQ4eHg6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgZm9yIGRldmljZSAlMDR4LyUwNHggc3Vic3lzdGVtICUwNHgvJTA0eFxuIiwKIAkJICAgICAgIGNhcmQtPmJ0LT5kZXYtPnZlbmRvciwKIAkJICAgICAgIGNhcmQtPmJ0LT5kZXYtPmRldmljZSwKIAkJICAgICAgIGNhcmQtPmJ0LT5kZXYtPnN1YnN5c3RlbV92ZW5kb3IsCiAJCSAgICAgICBjYXJkLT5idC0+ZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmY2FyZC0+ZHZiX2FkYXB0ZXIsIGNhcmQtPmZlKSkgewogCQkJcHJpbnRrKCJkdmItYnQ4eHg6IEZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKIAkJCWlmIChjYXJkLT5mZS0+b3BzLT5yZWxlYXNlKQogCQkJCWNhcmQtPmZlLT5vcHMtPnJlbGVhc2UoY2FyZC0+ZmUpOwogCQkJY2FyZC0+ZmUgPSBOVUxMOwogCQl9Ci0JfQogfQogCiBzdGF0aWMgaW50IF9faW5pdCBkdmJfYnQ4eHhfbG9hZF9jYXJkKHN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqY2FyZCwgdTMyIHR5cGUpCiB7CiAJaW50IHJlc3VsdDsKIAotCWlmICgocmVzdWx0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmNhcmQtPmR2Yl9hZGFwdGVyLCBjYXJkLT5jYXJkX25hbWUsCi0JCQkJCSAgIFRISVNfTU9EVUxFKSkgPCAwKSB7CisJaWYgKChyZXN1bHQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmY2FyZC0+ZHZiX2FkYXB0ZXIsIGNhcmQtPmNhcmRfbmFtZSwgVEhJU19NT0RVTEUpKSA8IDApIHsKIAkJcHJpbnRrKCJkdmJfYnQ4eHg6IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyIGZhaWxlZCAoZXJybm8gPSAlZClcbiIsIHJlc3VsdCk7CiAJCXJldHVybiByZXN1bHQ7Ci0KIAl9CiAJY2FyZC0+ZHZiX2FkYXB0ZXIucHJpdiA9IGNhcmQ7CiAKQEAgLTY2NCw4ICs3NDUsNyBAQAogCXN0cm5jcHkoY2FyZC0+Y2FyZF9uYW1lLCBzdWItPmNvcmUtPm5hbWUsIHNpemVvZihzdWItPmNvcmUtPm5hbWUpKTsKIAljYXJkLT5pMmNfYWRhcHRlciA9ICZzdWItPmNvcmUtPmkyY19hZGFwOwogCi0Jc3dpdGNoKHN1Yi0+Y29yZS0+dHlwZSkKLQl7CisJc3dpdGNoKHN1Yi0+Y29yZS0+dHlwZSkgewogCWNhc2UgQlRUVl9QSU5OQUNMRVNBVDoKIAkJY2FyZC0+Z3Bpb19tb2RlID0gMHgwNDAwYzA2MDsKIAkJLyogc2hvdWxkIGJlOiBCVDg3OF9BX0dBSU49MCxCVDg3OF9BX1BXUkROLEJUODc4X0RBX0RQTSxCVDg3OF9EQV9TQlIsCkBAIC03NTEsNyArODMxLDYgQEAKIAogCQlrZnJlZShjYXJkKTsKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0KIAl9CiAKIAlpbml0X01VVEVYKCZjYXJkLT5idC0+Z3Bpb19sb2NrKTsKQEAgLTc3OSw3ICs4NTgsOCBAQAogCWNhcmQtPmRlbXV4LmRteC5yZW1vdmVfZnJvbnRlbmQoJmNhcmQtPmRlbXV4LmRteCwgJmNhcmQtPmZlX2h3KTsKIAlkdmJfZG14ZGV2X3JlbGVhc2UoJmNhcmQtPmRteGRldik7CiAJZHZiX2RteF9yZWxlYXNlKCZjYXJkLT5kZW11eCk7Ci0JaWYgKGNhcmQtPmZlKSBkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChjYXJkLT5mZSk7CisJaWYgKGNhcmQtPmZlKQorCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChjYXJkLT5mZSk7CiAJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmY2FyZC0+ZHZiX2FkYXB0ZXIpOwogCiAJa2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5oCmluZGV4IDI5MjNiM2IuLjllYzhlNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5oCkBAIC0yLDcgKzIsNyBAQAogICogQnQ4eHggYmFzZWQgRFZCIGFkYXB0ZXIgZHJpdmVyCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDMgRmxvcmlhbiBTY2hpcm1lciA8am9sdEB0dXhib3gub3JnPgotICogQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIEhldHRrYW1wIDxwZXRlci5oZXR0a2FtcEB0LW9ubGluZS5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBQZXRlciBIZXR0a2FtcCA8cGV0ZXIuaGV0dGthbXBAaHRwLXRlbC5kZT4KICAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxIFJhbHBoICBNZXR6bGVyICYgTWFyY3VzIE1ldHpsZXIgZm9yIGNvbnZlcmdlbmNlIGludGVncmF0ZWQgbWVkaWEgR21iSAogICogQ29weXJpZ2h0IChDKSAxOTk4LDE5OTkgQ2hyaXN0aWFuIFRoZWlzcyA8bWlzdGVydEByei5maC1hdWdzYnVyZy5kZT4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9LY29uZmlnCmluZGV4IDIyNjcxNDAuLjdjZjRjNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9LY29uZmlnCkBAIC03Nyw3ICs3Nyw3IEBACiBjb25maWcgRFZCX0NJTkVSR1lUMl9SQ19RVUVSWV9JTlRFUlZBTAogCWludCAiSW5mcmFyZWQgUmVtb3RlIENvbnRyb2xsZXIgdXBkYXRlIGludGVydmFsIFttaWxsaXNlY29uZHNdIgogCWRlcGVuZHMgb24gRFZCX0NJTkVSR1lUMl9UVU5JTkcgJiYgRFZCX0NJTkVSR1lUMl9FTkFCTEVfUkNfSU5QVVRfREVWSUNFCi0gICAgICAgIGRlZmF1bHQgIjEwMCIKKyAgICAgICAgZGVmYXVsdCAiNTAiCiAJaGVscAogCSAgSWYgeW91IGhhdmUgYSB2ZXJ5IGZhc3QtcmVwZWF0aW5nIHJlbW90ZSBjb250cm9sIHlvdSBjYW4gdHJ5IGxvd2VyCiAJICB2YWx1ZXMsIGZvciBub3JtYWwgY29uc3VtZXIgcmVjZWl2ZXJzIHRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCmluZGV4IDdkOGIzY2EuLjZkYjA5MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KQEAgLTM2LDcgKzM1LDYgQEAKICNpbmNsdWRlICJkdmJfZGVtdXguaCIKICNpbmNsdWRlICJkdmJfbmV0LmgiCiAKLQogI2lmZGVmIENPTkZJR19EVkJfQ0lORVJHWVQyX1RVTklORwogCSNkZWZpbmUgU1RSRUFNX1VSQl9DT1VOVCAoQ09ORklHX0RWQl9DSU5FUkdZVDJfU1RSRUFNX1VSQl9DT1VOVCkKIAkjZGVmaW5lIFNUUkVBTV9CVUZfU0laRSAoQ09ORklHX0RWQl9DSU5FUkdZVDJfU1RSRUFNX0JVRl9TSVpFKQpAQCAtNDksNyArNDcsNyBAQAogCSNkZWZpbmUgU1RSRUFNX1VSQl9DT1VOVCAoMzIpCiAJI2RlZmluZSBTVFJFQU1fQlVGX1NJWkUgKDUxMikJLyogYnl0ZXMgKi8KIAkjZGVmaW5lIEVOQUJMRV9SQyAoMSkKLQkjZGVmaW5lIFJDX1FVRVJZX0lOVEVSVkFMICgxMDApCS8qIG1pbGxpc2Vjb25kcyAqLworCSNkZWZpbmUgUkNfUVVFUllfSU5URVJWQUwgKDUwKQkvKiBtaWxsaXNlY29uZHMgKi8KIAkjZGVmaW5lIFFVRVJZX0lOVEVSVkFMICgzMzMpCS8qIG1pbGxpc2Vjb25kcyAqLwogI2VuZGlmCiAKQEAgLTE0Miw2ICsxNDAsOCBAQAogCXN0cnVjdCBpbnB1dF9kZXYgcmNfaW5wdXRfZGV2OwogCXN0cnVjdCB3b3JrX3N0cnVjdCByY19xdWVyeV93b3JrOwogCWludCByY19pbnB1dF9ldmVudDsKKwl1MzIgcmNfbGFzdF9jb2RlOworCXVuc2lnbmVkIGxvbmcgbGFzdF9ldmVudF9qaWZmaWVzOwogI2VuZGlmCiB9OwogCkBAIC0xNTYsNyArMTU2LDcgQEAKIAl1aW50MzJfdCB2YWx1ZTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKLXN0YXRpYyBjb25zdCB1aW50MzJfdCByY19rZXlzIFtdID0geworc3RhdGljIGNvbnN0IHVpbnQzMl90IHJjX2tleXNbXSA9IHsKIAlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZmUwMWViMDQsCUtFWV9QT1dFUiwKIAlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZmQwMmViMDQsCUtFWV8xLAogCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmYzAzZWIwNCwJS0VZXzIsCkBAIC02ODUsNTIgKzY4NSw2OCBAQAogI2lmZGVmIEVOQUJMRV9SQwogc3RhdGljIHZvaWQgY2luZXJneXQyX3F1ZXJ5X3JjICh2b2lkICpkYXRhKQogewotCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IChzdHJ1Y3QgY2luZXJneXQyICopIGRhdGE7Ci0JY2hhciBidWYgWzFdID0geyBDSU5FUkdZVDJfRVAxX0dFVF9SQ19FVkVOVFMgfTsKKwlzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkYXRhOworCWNoYXIgYnVmWzFdID0geyBDSU5FUkdZVDJfRVAxX0dFVF9SQ19FVkVOVFMgfTsKIAlzdHJ1Y3QgY2luZXJneXQyX3JjX2V2ZW50IHJjX2V2ZW50c1sxMl07Ci0JaW50IG4sIGxlbjsKKwlpbnQgbiwgbGVuLCBpOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQogCQlyZXR1cm47CiAKIAlsZW4gPSBjaW5lcmd5dDJfY29tbWFuZChjaW5lcmd5dDIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkgICAgIChjaGFyICopIHJjX2V2ZW50cywgc2l6ZW9mKHJjX2V2ZW50cykpOworCQkJCShjaGFyICopIHJjX2V2ZW50cywgc2l6ZW9mKHJjX2V2ZW50cykpOworCWlmIChsZW4gPCAwKQorCQlnb3RvIG91dDsKKwlpZiAobGVuID09IDApIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgY2luZXJneXQyLT5sYXN0X2V2ZW50X2ppZmZpZXMgKworCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMTUwKSkpIHsKKwkJCS8qIHN0b3Aga2V5IHJlcGVhdCAqLworCQkJaWYgKGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgIT0gS0VZX01BWCkgeworCQkJCWRwcmludGsoMSwgInJjX2lucHV0X2V2ZW50PSVkIFVwXG4iLCBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50KTsKKwkJCQlpbnB1dF9yZXBvcnRfa2V5KCZjaW5lcmd5dDItPnJjX2lucHV0X2RldiwKKwkJCQkJCSBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50LCAwKTsKKwkJCQljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gS0VZX01BWDsKKwkJCX0KKwkJCWNpbmVyZ3l0Mi0+cmNfbGFzdF9jb2RlID0gfjA7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCWNpbmVyZ3l0Mi0+bGFzdF9ldmVudF9qaWZmaWVzID0gamlmZmllczsKIAotCWZvciAobj0wOyBsZW4+MCAmJiBuPChsZW4vc2l6ZW9mKHJjX2V2ZW50c1swXSkpOyBuKyspIHsKLQkJaW50IGk7Ci0KLS8qCQlkcHJpbnRrKDEsInJjX2V2ZW50c1slZF0udmFsdWUgPSAleCwgdHlwZT0leFxuIixuLGxlMzJfdG9fY3B1KHJjX2V2ZW50c1tuXS52YWx1ZSkscmNfZXZlbnRzW25dLnR5cGUpOyovCisJZm9yIChuID0gMDsgbiA8IChsZW4gLyBzaXplb2YocmNfZXZlbnRzWzBdKSk7IG4rKykgeworCQlkcHJpbnRrKDEsICJyY19ldmVudHNbJWRdLnZhbHVlID0gJXgsIHR5cGU9JXhcbiIsCisJCQluLCBsZTMyX3RvX2NwdShyY19ldmVudHNbbl0udmFsdWUpLCByY19ldmVudHNbbl0udHlwZSk7CiAKIAkJaWYgKHJjX2V2ZW50c1tuXS50eXBlID09IENJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQyAmJgotCQkgICAgcmNfZXZlbnRzW25dLnZhbHVlID09IH4wKQotCQl7Ci0JCQkvKioKLQkJCSAqIGtleXJlcGVhdCBiaXQuIElmIHdlIHdvdWxkIGhhbmRsZSB0aGlzIHByb3Blcmx5Ci0JCQkgKiB3ZSB3b3VsZCBuZWVkIHRvIGVtaXQgZG93biBldmVudHMgYXMgbG9uZyB0aGUKLQkJCSAqIGtleXJlcGVhdCBnb2VzLCBhIHVwIGV2ZW50IGlmIG5vIGZ1cnRoZXIKLQkJCSAqIHJlcGVhdCBiaXRzIG9jY3VyLiBXb3VsZCBuZWVkIGEgdGltZXIgdG8gaW1wbGVtZW50Ci0JCQkgKiBhbmQgbm8gb3RoZXIgZHJpdmVyIGRvZXMgdGhpcywgc28gd2Ugc2ltcGx5Ci0JCQkgKiBlbWl0IHRoZSBsYXN0IGtleSB1cC9kb3duIHNlcXVlbmNlIGFnYWluLgotCQkJICovCisJCSAgICByY19ldmVudHNbbl0udmFsdWUgPT0gfjApIHsKKwkJCS8qIGtleXJlcGVhdCBiaXQgLT4ganVzdCByZXBlYXQgbGFzdCByY19pbnB1dF9ldmVudCAqLwogCQl9IGVsc2UgewogCQkJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IEtFWV9NQVg7Ci0JCQlmb3IgKGk9MDsgaTxzaXplb2YocmNfa2V5cykvc2l6ZW9mKHJjX2tleXNbMF0pOyBpKz0zKSB7Ci0JCQkJaWYgKHJjX2tleXNbaSswXSA9PSByY19ldmVudHNbbl0udHlwZSAmJgotCQkJCSAgICByY19rZXlzW2krMV0gPT0gbGUzMl90b19jcHUocmNfZXZlbnRzW25dLnZhbHVlKSkKLQkJCQl7Ci0JCQkJCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgPSByY19rZXlzW2krMl07CisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHJjX2tleXMpIC8gc2l6ZW9mKHJjX2tleXNbMF0pOyBpICs9IDMpIHsKKwkJCQlpZiAocmNfa2V5c1tpICsgMF0gPT0gcmNfZXZlbnRzW25dLnR5cGUgJiYKKwkJCQkgICAgcmNfa2V5c1tpICsgMV0gPT0gbGUzMl90b19jcHUocmNfZXZlbnRzW25dLnZhbHVlKSkgeworCQkJCQljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gcmNfa2V5c1tpICsgMl07CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KIAkJfQogCiAJCWlmIChjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ICE9IEtFWV9NQVgpIHsKLQkJCWlucHV0X3JlcG9ydF9rZXkoJmNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LCBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50LCAxKTsKLQkJCWlucHV0X3JlcG9ydF9rZXkoJmNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LCBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50LCAwKTsKLQkJCWlucHV0X3N5bmMoJmNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2KTsKKwkJCWlmIChyY19ldmVudHNbbl0udmFsdWUgPT0gY2luZXJneXQyLT5yY19sYXN0X2NvZGUgJiYKKwkJCSAgICBjaW5lcmd5dDItPnJjX2xhc3RfY29kZSAhPSB+MCkgeworCQkJCS8qIGVtaXQgYSBrZXktdXAgc28gdGhlIGRvdWJsZSBldmVudCBpcyByZWNvZ25pemVkICovCisJCQkJZHByaW50aygxLCAicmNfaW5wdXRfZXZlbnQ9JWQgVVBcbiIsIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQpOworCQkJCWlucHV0X3JlcG9ydF9rZXkoJmNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LAorCQkJCQkJIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQsIDApOworCQkJfQorCQkJZHByaW50aygxLCAicmNfaW5wdXRfZXZlbnQ9JWRcbiIsIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQpOworCQkJaW5wdXRfcmVwb3J0X2tleSgmY2luZXJneXQyLT5yY19pbnB1dF9kZXYsCisJCQkJCSBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50LCAxKTsKKwkJCWNpbmVyZ3l0Mi0+cmNfbGFzdF9jb2RlID0gcmNfZXZlbnRzW25dLnZhbHVlOwogCQl9CiAJfQogCitvdXQ6CiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmssCiAJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFJDX1FVRVJZX0lOVEVSVkFMKSk7CiAKQEAgLTc3Miw3ICs3ODgsMTAgQEAKIAkJICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyOwotCWludCBpLCBlcnI7CisJaW50IGVycjsKKyNpZmRlZiBFTkFCTEVfUkMKKwlpbnQgaTsKKyNlbmRpZgogCiAJaWYgKCEoY2luZXJneXQyID0ga21hbGxvYyAoc2l6ZW9mKHN0cnVjdCBjaW5lcmd5dDIpLCBHRlBfS0VSTkVMKSkpIHsKIAkJZHByaW50aygxLCAib3V0IG9mIG1lbW9yeT8hP1xuIik7CkBAIC04MjgsMTkgKzg0NywxOCBAQAogCQkJICAgIERWQl9ERVZJQ0VfRlJPTlRFTkQpOwogCiAjaWZkZWYgRU5BQkxFX1JDCi0JaW5pdF9pbnB1dF9kZXYoJmNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2KTsKLQotCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LmV2Yml0WzBdID0gQklUKEVWX0tFWSk7Ci0JY2luZXJneXQyLT5yY19pbnB1dF9kZXYua2V5Y29kZXNpemUgPSBzaXplb2YodW5zaWduZWQgY2hhcik7Ci0JY2luZXJneXQyLT5yY19pbnB1dF9kZXYua2V5Y29kZW1heCA9IEtFWV9NQVg7CisJY2luZXJneXQyLT5yY19pbnB1dF9kZXYuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRVApOworCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LmtleWNvZGVzaXplID0gMDsKKwljaW5lcmd5dDItPnJjX2lucHV0X2Rldi5rZXljb2RlbWF4ID0gMDsKIAljaW5lcmd5dDItPnJjX2lucHV0X2Rldi5uYW1lID0gRFJJVkVSX05BTUUgIiByZW1vdGUgY29udHJvbCI7CiAKLQlmb3IgKGk9MDsgaTxzaXplb2YocmNfa2V5cykvc2l6ZW9mKHJjX2tleXNbMF0pOyBpKz0zKQotCQlzZXRfYml0KHJjX2tleXNbaSsyXSwgY2luZXJneXQyLT5yY19pbnB1dF9kZXYua2V5Yml0KTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHJjX2tleXMpIC8gc2l6ZW9mKHJjX2tleXNbMF0pOyBpICs9IDMpCisJCXNldF9iaXQocmNfa2V5c1tpICsgMl0sIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LmtleWJpdCk7CiAKIAlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJmNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2KTsKIAogCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgPSBLRVlfTUFYOworCWNpbmVyZ3l0Mi0+cmNfbGFzdF9jb2RlID0gfjA7CiAKIAlJTklUX1dPUksoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yaywgY2luZXJneXQyX3F1ZXJ5X3JjLCBjaW5lcmd5dDIpOwogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5yY19xdWVyeV93b3JrLCBIWi8yKTsKQEAgLTg4OCw3ICs5MDYsNyBAQAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCWlmIChzdGF0ZSA+IDApIHsJLyogc3RhdGUgMCBzZWVtcyB0byBtZWFuIERFVklDRV9QTV9PTiAqLworCWlmIChzdGF0ZS5ldmVudCA+IFBNX0VWRU5UX09OKSB7CiAJCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwogI2lmZGVmIEVOQUJMRV9SQwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZGVtdXguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RlbXV4LmgKaW5kZXggZmI1NWVhYS4uOTcxOWEzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZGVtdXguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kZW11eC5oCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2R2Yi9kbXguaD4KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBDb21tb24gZGVmaW5pdGlvbnMgKi8KQEAgLTEyNCw5ICsxMjUsNyBAQAogCQkgICAgdTE2IHBpZCwKIAkJICAgIGludCB0eXBlLAogCQkgICAgZW51bSBkbXhfdHNfcGVzIHBlc190eXBlLAotCQkgICAgc2l6ZV90IGNhbGxiYWNrX2xlbmd0aCwKIAkJICAgIHNpemVfdCBjaXJjdWxhcl9idWZmZXJfc2l6ZSwKLQkJICAgIGludCBkZXNjcmFtYmxlLAogCQkgICAgc3RydWN0IHRpbWVzcGVjIHRpbWVvdXQpOwogICAgICAgICBpbnQgKCpzdGFydF9maWx0ZXJpbmcpIChzdHJ1Y3QgZG14X3RzX2ZlZWQqIGZlZWQpOwogICAgICAgICBpbnQgKCpzdG9wX2ZpbHRlcmluZykgKHN0cnVjdCBkbXhfdHNfZmVlZCogZmVlZCk7CkBAIC0xNTksNyArMTU4LDYgQEAKICAgICAgICAgaW50ICgqc2V0KSAoc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQqIGZlZWQsCiAJCSAgICB1MTYgcGlkLAogCQkgICAgc2l6ZV90IGNpcmN1bGFyX2J1ZmZlcl9zaXplLAotCQkgICAgaW50IGRlc2NyYW1ibGUsCiAJCSAgICBpbnQgY2hlY2tfY3JjKTsKICAgICAgICAgaW50ICgqYWxsb2NhdGVfZmlsdGVyKSAoc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQqIGZlZWQsCiAJCQkJc3RydWN0IGRteF9zZWN0aW9uX2ZpbHRlcioqIGZpbHRlcik7CkBAIC0yMDcsNyArMjA1LDYgQEAKICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBjb25uZWN0aXZpdHlfbGlzdDsgLyogTGlzdCBvZiBmcm9udC1lbmRzIHRoYXQgY2FuCiAJCQkJCSAgICAgICBiZSBjb25uZWN0ZWQgdG8gYSBwYXJ0aWN1bGFyCiAJCQkJCSAgICAgICBkZW11eCAqLwotICAgICAgICB2b2lkKiBwcml2OyAgICAgLyogUG9pbnRlciB0byBwcml2YXRlIGRhdGEgb2YgdGhlIEFQSSBjbGllbnQgKi8KICAgICAgICAgZW51bSBkbXhfZnJvbnRlbmRfc291cmNlIHNvdXJjZTsKIH07CiAKQEAgLTIyNSw4ICsyMjIsNiBAQAogI2RlZmluZSBETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORyAgICAgICAgICAgICAgOCAgICAvKiB3cml0ZSgpIGF2YWlsYWJsZSAqLwogI2RlZmluZSBETVhfQ1JDX0NIRUNLSU5HICAgICAgICAgICAgICAgICAgICAgICAgMTYKICNkZWZpbmUgRE1YX1RTX0RFU0NSQU1CTElORyAgICAgICAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIERNWF9TRUNUSU9OX1BBWUxPQURfREVTQ1JBTUJMSU5HICAgICAgICA2NAotI2RlZmluZSBETVhfTUFDX0FERFJFU1NfREVTQ1JBTUJMSU5HICAgICAgICAgICAgMTI4CiAKIC8qCiAgKiBEZW11eCByZXNvdXJjZSB0eXBlIGlkZW50aWZpZXIuCkBAIC0yNDQsOSArMjM5LDcgQEAKIHN0cnVjdCBkbXhfZGVtdXggewogICAgICAgICB1MzIgY2FwYWJpbGl0aWVzOyAgICAgICAgICAgIC8qIEJpdGZpZWxkIG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KICAgICAgICAgc3RydWN0IGRteF9mcm9udGVuZCogZnJvbnRlbmQ7ICAgIC8qIEZyb250LWVuZCBjb25uZWN0ZWQgdG8gdGhlIGRlbXV4ICovCi0gICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgcmVnX2xpc3Q7ICAgLyogTGlzdCBvZiByZWdpc3RlcmVkIGRlbXV4ZXMgKi8KICAgICAgICAgdm9pZCogcHJpdjsgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHByaXZhdGUgZGF0YSBvZiB0aGUgQVBJIGNsaWVudCAqLwotICAgICAgICBpbnQgdXNlcnM7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB1c2VycyAqLwogICAgICAgICBpbnQgKCpvcGVuKSAoc3RydWN0IGRteF9kZW11eCogZGVtdXgpOwogICAgICAgICBpbnQgKCpjbG9zZSkgKHN0cnVjdCBkbXhfZGVtdXgqIGRlbXV4KTsKICAgICAgICAgaW50ICgqd3JpdGUpIChzdHJ1Y3QgZG14X2RlbXV4KiBkZW11eCwgY29uc3QgY2hhciogYnVmLCBzaXplX3QgY291bnQpOwpAQCAtMjYwLDE3ICsyNTMsNiBAQAogCQkJCSAgICAgIGRteF9zZWN0aW9uX2NiIGNhbGxiYWNrKTsKICAgICAgICAgaW50ICgqcmVsZWFzZV9zZWN0aW9uX2ZlZWQpIChzdHJ1Y3QgZG14X2RlbXV4KiBkZW11eCwKIAkJCQkgICAgIHN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkKiBmZWVkKTsKLSAgICAgICAgaW50ICgqZGVzY3JhbWJsZV9tYWNfYWRkcmVzcykgKHN0cnVjdCBkbXhfZGVtdXgqIGRlbXV4LAotCQkJCSAgICAgICB1OCogYnVmZmVyMSwKLQkJCQkgICAgICAgc2l6ZV90IGJ1ZmZlcjFfbGVuZ3RoLAotCQkJCSAgICAgICB1OCogYnVmZmVyMiwKLQkJCQkgICAgICAgc2l6ZV90IGJ1ZmZlcjJfbGVuZ3RoLAotCQkJCSAgICAgICB1MTYgcGlkKTsKLSAgICAgICAgaW50ICgqZGVzY3JhbWJsZV9zZWN0aW9uX3BheWxvYWQpIChzdHJ1Y3QgZG14X2RlbXV4KiBkZW11eCwKLQkJCQkJICAgdTgqIGJ1ZmZlcjEsCi0JCQkJCSAgIHNpemVfdCBidWZmZXIxX2xlbmd0aCwKLQkJCQkJICAgdTgqIGJ1ZmZlcjIsIHNpemVfdCBidWZmZXIyX2xlbmd0aCwKLQkJCQkJICAgdTE2IHBpZCk7CiAgICAgICAgIGludCAoKmFkZF9mcm9udGVuZCkgKHN0cnVjdCBkbXhfZGVtdXgqIGRlbXV4LAogCQkJICAgICBzdHJ1Y3QgZG14X2Zyb250ZW5kKiBmcm9udGVuZCk7CiAgICAgICAgIGludCAoKnJlbW92ZV9mcm9udGVuZCkgKHN0cnVjdCBkbXhfZGVtdXgqIGRlbXV4LApAQCAtMjgyLDIwICsyNjQsMTIgQEAKIAogICAgICAgICBpbnQgKCpnZXRfcGVzX3BpZHMpIChzdHJ1Y3QgZG14X2RlbXV4KiBkZW11eCwgdTE2ICpwaWRzKTsKIAorCWludCAoKmdldF9jYXBzKSAoc3RydWN0IGRteF9kZW11eCogZGVtdXgsIHN0cnVjdCBkbXhfY2FwcyAqY2Fwcyk7CisKKwlpbnQgKCpzZXRfc291cmNlKSAoc3RydWN0IGRteF9kZW11eCogZGVtdXgsIGNvbnN0IGRteF9zb3VyY2VfdCAqc3JjKTsKKwogICAgICAgICBpbnQgKCpnZXRfc3RjKSAoc3RydWN0IGRteF9kZW11eCogZGVtdXgsIHVuc2lnbmVkIGludCBudW0sCiAJCQl1NjQgKnN0YywgdW5zaWduZWQgaW50ICpiYXNlKTsKIH07CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRGVtdXggZGlyZWN0b3J5ICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIERNWF9ESVJfRU5UUlkoKTogQ2FzdHMgZWxlbWVudHMgaW4gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZAotICogZGVtdXhlcyBmcm9tIHRoZSBnZW5lcmljIHR5cGUgc3RydWN0IGxpc3RfaGVhZCogdG8gdGhlIHR5cGUgc3RydWN0IGRteF9kZW11eAotICouCi0gKi8KLQotI2RlZmluZSBETVhfRElSX0VOVFJZKGxpc3QpIGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGRteF9kZW11eCwgcmVnX2xpc3QpCi0KICNlbmRpZiAvKiAjaWZuZGVmIF9fREVNVVhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuYwppbmRleCA2ODA1MGNkLi44MDI4YzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuYwpAQCAtNTcxLDcgKzU3MSw3IEBACiAJCQkJcmV0dXJuIHJldDsKIAkJCX0KIAotCQkJcmV0PSgqc2VjZmVlZCktPnNldCgqc2VjZmVlZCwgcGFyYS0+cGlkLCAzMjc2OCwgMCwKKwkJCXJldD0oKnNlY2ZlZWQpLT5zZXQoKnNlY2ZlZWQsIHBhcmEtPnBpZCwgMzI3NjgsCiAJCQkJCSAgICAocGFyYS0+ZmxhZ3MgJiBETVhfQ0hFQ0tfQ1JDKSA/IDEgOiAwKTsKIAogCQkJaWYgKHJldDwwKSB7CkBAIC02NTQsNyArNjU0LDcgQEAKIAkJKCp0c2ZlZWQpLT5wcml2ID0gKHZvaWQgKikgZmlsdGVyOwogCiAJCXJldCA9ICgqdHNmZWVkKS0+c2V0KCp0c2ZlZWQsIHBhcmEtPnBpZCwgdHNfdHlwZSwgdHNfcGVzLAotCQkJCSAgICAgMTg4LCAzMjc2OCwgMCwgdGltZW91dCk7CisJCQkJICAgICAzMjc2OCwgdGltZW91dCk7CiAKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRteGRldi0+ZGVtdXgtPnJlbGVhc2VfdHNfZmVlZChkbXhkZXYtPmRlbXV4LCAqdHNmZWVkKTsKQEAgLTkyOSw2ICs5MjksMjIgQEAKIAkJZG14ZGV2LT5kZW11eC0+Z2V0X3Blc19waWRzKGRteGRldi0+ZGVtdXgsICh1MTYgKilwYXJnKTsKIAkJYnJlYWs7CiAKKwljYXNlIERNWF9HRVRfQ0FQUzoKKwkJaWYgKCFkbXhkZXYtPmRlbXV4LT5nZXRfY2FwcykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IGRteGRldi0+ZGVtdXgtPmdldF9jYXBzKGRteGRldi0+ZGVtdXgsIHBhcmcpOworCQlicmVhazsKKworCWNhc2UgRE1YX1NFVF9TT1VSQ0U6CisJCWlmICghZG14ZGV2LT5kZW11eC0+c2V0X3NvdXJjZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IGRteGRldi0+ZGVtdXgtPnNldF9zb3VyY2UoZG14ZGV2LT5kZW11eCwgcGFyZyk7CisJCWJyZWFrOworCiAJY2FzZSBETVhfR0VUX1NUQzoKIAkJaWYgKCFkbXhkZXYtPmRlbXV4LT5nZXRfc3RjKSB7CiAJCSAgICAgICAgcmV0PS1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfY2FfZW41MDIyMS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2NhX2VuNTAyMjEuYwppbmRleCAwZWI5YWE3Li44ODc1N2UyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfY2FfZW41MDIyMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9jYV9lbjUwMjIxLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAogI2RlZmluZSBkcHJpbnRrIGlmIChkdmJfY2FfZW41MDIyMV9kZWJ1ZykgcHJpbnRrCiAKLSNkZWZpbmUgSU5JVF9USU1FT1VUX1NFQ1MgNQorI2RlZmluZSBJTklUX1RJTUVPVVRfU0VDUyAxMAogCiAjZGVmaW5lIEhPU1RfTElOS19CVUZfU0laRSAweDIwMAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZGVtdXguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jCmluZGV4IGFjOTg4OWQuLmRjNDc2ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jCkBAIC0zOCw4MiArMzgsNTIgQEAKICovCiAvLyAjZGVmaW5lIERWQl9ERU1VWF9TRUNUSU9OX0xPU1NfTE9HCiAKLQotc3RhdGljIExJU1RfSEVBRChkbXhfbXV4cyk7Ci0KLQotc3RhdGljIGludCBkbXhfcmVnaXN0ZXJfZGVtdXgoc3RydWN0IGRteF9kZW11eCAqZGVtdXgpCi17Ci0JZGVtdXgtPnVzZXJzID0gMDsKLQlsaXN0X2FkZCgmZGVtdXgtPnJlZ19saXN0LCAmZG14X211eHMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRteF91bnJlZ2lzdGVyX2RlbXV4KHN0cnVjdCBkbXhfZGVtdXgqIGRlbXV4KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKm4sICpoZWFkPSZkbXhfbXV4czsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZSAocG9zLCBuLCBoZWFkKSB7Ci0JCWlmIChETVhfRElSX0VOVFJZKHBvcykgPT0gZGVtdXgpIHsKLQkJCWlmIChkZW11eC0+dXNlcnM+MCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWxpc3RfZGVsKHBvcyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXJldHVybiAtRU5PREVWOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHN0YXRpYyBpbmxpbmVkIGhlbHBlciBmdW5jdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogc3RhdGljIGlubGluZSB1MTYgc2VjdGlvbl9sZW5ndGgoY29uc3QgdTggKmJ1ZikKIHsKLQlyZXR1cm4gMysoKGJ1ZlsxXSYweDBmKTw8OCkrYnVmWzJdOworCXJldHVybiAzICsgKChidWZbMV0gJiAweDBmKSA8PCA4KSArIGJ1ZlsyXTsKIH0KIAotCiBzdGF0aWMgaW5saW5lIHUxNiB0c19waWQoY29uc3QgdTggKmJ1ZikKIHsKLQlyZXR1cm4gKChidWZbMV0mMHgxZik8PDgpK2J1ZlsyXTsKKwlyZXR1cm4gKChidWZbMV0gJiAweDFmKSA8PCA4KSArIGJ1ZlsyXTsKIH0KIAotCiBzdGF0aWMgaW5saW5lIHU4IHBheWxvYWQoY29uc3QgdTggKnRzcCkKIHsKLQlpZiAoISh0c3BbM10gJiAweDEwKSkgLy8gbm8gcGF5bG9hZD8KKwlpZiAoISh0c3BbM10gJiAweDEwKSkJLy8gbm8gcGF5bG9hZD8KIAkJcmV0dXJuIDA7Ci0JaWYgKHRzcFszXSAmIDB4MjApIHsgIC8vIGFkYXB0YXRpb24gZmllbGQ/Ci0JCWlmICh0c3BbNF0gPiAxODMpICAgIC8vIGNvcnJ1cHRlZCBkYXRhPworCisJaWYgKHRzcFszXSAmIDB4MjApIHsJLy8gYWRhcHRhdGlvbiBmaWVsZD8KKwkJaWYgKHRzcFs0XSA+IDE4MykJLy8gY29ycnVwdGVkIGRhdGE/CiAJCQlyZXR1cm4gMDsKIAkJZWxzZQotCQkJcmV0dXJuIDE4NC0xLXRzcFs0XTsKKwkJCXJldHVybiAxODQgLSAxIC0gdHNwWzRdOwogCX0KKwogCXJldHVybiAxODQ7CiB9CiAKLQotc3RhdGljIHUzMiBkdmJfZG14X2NyYzMyIChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmYsIGNvbnN0IHU4ICpzcmMsIHNpemVfdCBsZW4pCitzdGF0aWMgdTMyIGR2Yl9kbXhfY3JjMzIoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmLCBjb25zdCB1OCAqc3JjLCBzaXplX3QgbGVuKQogewotCXJldHVybiAoZi0+ZmVlZC5zZWMuY3JjX3ZhbCA9IGNyYzMyX2JlIChmLT5mZWVkLnNlYy5jcmNfdmFsLCBzcmMsIGxlbikpOworCXJldHVybiAoZi0+ZmVlZC5zZWMuY3JjX3ZhbCA9IGNyYzMyX2JlKGYtPmZlZWQuc2VjLmNyY192YWwsIHNyYywgbGVuKSk7CiB9CiAKLQotc3RhdGljIHZvaWQgZHZiX2RteF9tZW1jb3B5IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmYsIHU4ICpkLCBjb25zdCB1OCAqcywgc2l6ZV90IGxlbikKK3N0YXRpYyB2b2lkIGR2Yl9kbXhfbWVtY29weShzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmYsIHU4ICpkLCBjb25zdCB1OCAqcywKKwkJCSAgICBzaXplX3QgbGVuKQogewotCW1lbWNweSAoZCwgcywgbGVuKTsKKwltZW1jcHkoZCwgcywgbGVuKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBTb2Z0d2FyZSBmaWx0ZXIgZnVuY3Rpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW5saW5lIGludCBkdmJfZG14X3N3ZmlsdGVyX3BheWxvYWQgKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCwgY29uc3QgdTggKmJ1ZikKK3N0YXRpYyBpbmxpbmUgaW50IGR2Yl9kbXhfc3dmaWx0ZXJfcGF5bG9hZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQsCisJCQkJCSAgIGNvbnN0IHU4ICpidWYpCiB7CiAJaW50IGNvdW50ID0gcGF5bG9hZChidWYpOwogCWludCBwOwpAQCAtMTIzLDMyICs5MywzMSBAQAogCWlmIChjb3VudCA9PSAwKQogCQlyZXR1cm4gLTE7CiAKLQlwID0gMTg4LWNvdW50OworCXAgPSAxODggLSBjb3VudDsKIAogCS8qCi0JY2M9YnVmWzNdJjB4MGY7Ci0JY2Nvaz0oKGR2YmRteGZlZWQtPmNjKzEpJjB4MGYpPT1jYyA/IDEgOiAwOwotCWR2YmRteGZlZWQtPmNjPWNjOworCWNjID0gYnVmWzNdICYgMHgwZjsKKwljY29rID0gKChmZWVkLT5jYyArIDEpICYgMHgwZikgPT0gY2M7CisJZmVlZC0+Y2MgPSBjYzsKIAlpZiAoIWNjb2spCiAJCXByaW50aygibWlzc2VkIHBhY2tldCFcbiIpOwogCSovCiAKLQlpZiAoYnVmWzFdICYgMHg0MCkgIC8vIFBVU0kgPworCWlmIChidWZbMV0gJiAweDQwKQkvLyBQVVNJID8KIAkJZmVlZC0+cGVzbGVuID0gMHhmZmZhOwogCiAJZmVlZC0+cGVzbGVuICs9IGNvdW50OwogCi0JcmV0dXJuIGZlZWQtPmNiLnRzICgmYnVmW3BdLCBjb3VudCwgTlVMTCwgMCwgJmZlZWQtPmZlZWQudHMsIERNWF9PSyk7CisJcmV0dXJuIGZlZWQtPmNiLnRzKCZidWZbcF0sIGNvdW50LCBOVUxMLCAwLCAmZmVlZC0+ZmVlZC50cywgRE1YX09LKTsKIH0KIAotCi1zdGF0aWMgaW50IGR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbmZpbHRlciAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLAotCQkJCSAgICBzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciAqZikKK3N0YXRpYyBpbnQgZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uZmlsdGVyKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCwKKwkJCQkJICBzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciAqZikKIHsKIAl1OCBuZXEgPSAwOwogCWludCBpOwogCi0JZm9yIChpPTA7IGk8RFZCX0RFTVVYX01BU0tfTUFYOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgRFZCX0RFTVVYX01BU0tfTUFYOyBpKyspIHsKIAkJdTggeG9yID0gZi0+ZmlsdGVyLmZpbHRlcl92YWx1ZVtpXSBeIGZlZWQtPmZlZWQuc2VjLnNlY2J1ZltpXTsKIAogCQlpZiAoZi0+bWFza2FuZG1vZGVbaV0gJiB4b3IpCkBAIC0xNjAsMTIgKzEyOSwxMSBAQAogCWlmIChmLT5kb25lcSAmJiAhbmVxKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBmZWVkLT5jYi5zZWMgKGZlZWQtPmZlZWQuc2VjLnNlY2J1ZiwgZmVlZC0+ZmVlZC5zZWMuc2VjbGVuLAotCQkJICAgICBOVUxMLCAwLCAmZi0+ZmlsdGVyLCBETVhfT0spOworCXJldHVybiBmZWVkLT5jYi5zZWMoZmVlZC0+ZmVlZC5zZWMuc2VjYnVmLCBmZWVkLT5mZWVkLnNlYy5zZWNsZW4sCisJCQkgICAgTlVMTCwgMCwgJmYtPmZpbHRlciwgRE1YX09LKTsKIH0KIAotCi1zdGF0aWMgaW5saW5lIGludCBkdmJfZG14X3N3ZmlsdGVyX3NlY3Rpb25fZmVlZCAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQorc3RhdGljIGlubGluZSBpbnQgZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQogewogCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZmVlZC0+ZGVtdXg7CiAJc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKmYgPSBmZWVkLT5maWx0ZXI7CkBAIC0xOTUsMjYgKzE2MywyNCBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkIGR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9uZXcoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQogewogCXN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkICpzZWMgPSAmZmVlZC0+ZmVlZC5zZWM7CiAKICNpZmRlZiBEVkJfREVNVVhfU0VDVElPTl9MT1NTX0xPRwotCWlmKHNlYy0+c2VjYnVmcCA8IHNlYy0+dHNmZWVkcCkKLQl7CisJaWYgKHNlYy0+c2VjYnVmcCA8IHNlYy0+dHNmZWVkcCkgewogCQlpbnQgaSwgbiA9IHNlYy0+dHNmZWVkcCAtIHNlYy0+c2VjYnVmcDsKIAotCQkvKiBzZWN0aW9uIHBhZGRpbmcgaXMgZG9uZSB3aXRoIDB4ZmYgYnl0ZXMgZW50aXJlbHkuCi0JCSoqIGR1ZSB0byBzcGVlZCByZWFzb25zLCB3ZSB3b24ndCBjaGVjayBhbGwgb2YgdGhlbQotCQkqKiBidXQganVzdCBmaXJzdCBhbmQgbGFzdAotCQkqLwotCQlpZihzZWMtPnNlY2J1ZlswXSAhPSAweGZmIHx8IHNlYy0+c2VjYnVmW24tMV0gIT0gMHhmZikKLQkJeworCQkvKgorCQkgKiBTZWN0aW9uIHBhZGRpbmcgaXMgZG9uZSB3aXRoIDB4ZmYgYnl0ZXMgZW50aXJlbHkuCisJCSAqIER1ZSB0byBzcGVlZCByZWFzb25zLCB3ZSB3b24ndCBjaGVjayBhbGwgb2YgdGhlbQorCQkgKiBidXQganVzdCBmaXJzdCBhbmQgbGFzdC4KKwkJICovCisJCWlmIChzZWMtPnNlY2J1ZlswXSAhPSAweGZmIHx8IHNlYy0+c2VjYnVmW24gLSAxXSAhPSAweGZmKSB7CiAJCQlwcmludGsoImR2Yl9kZW11eC5jIHNlY3Rpb24gdHMgcGFkZGluZyBsb3NzOiAlZC8lZFxuIiwKIAkJCSAgICAgICBuLCBzZWMtPnRzZmVlZHApOwogCQkJcHJpbnRrKCJkdmJfZGVtdXguYyBwYWQgZGF0YToiKTsKLQkJCWZvcihpID0gMDsgaSA8IG47IGkrKykKKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAJCQkJcHJpbnRrKCIgJTAyeCIsIHNlYy0+c2VjYnVmW2ldKTsKIAkJCXByaW50aygiXG4iKTsKIAkJfQpAQCAtMjI2LDgyICsxOTIsODEgQEAKIH0KIAogLyoKLSoqIExvc2xlc3MgU2VjdGlvbiBEZW11eCAxLjQuMSBieSBFbWFyZAotKiogVmFsc2VjY2hpIFBhdHJpY2s6Ci0qKiAgLSBtaWRkbGUgb2Ygc2VjdGlvbiBBICAobm8gUFVTSSkKLSoqICAtIGVuZCBvZiBzZWN0aW9uIEEgYW5kIHN0YXJ0IG9mIHNlY3Rpb24gQgotKiogICAgKHdpdGggUFVTSSBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY29uZCBzZWN0aW9uKQotKioKLSoqICBJbiB0aGlzIGNhc2UsIHdpdGhvdXQgZmVlZC0+cHVzaV9zZWVuIHlvdSdsbCByZWNlaXZlIGEgZ2FyYmFnZSBzZWN0aW9uCi0qKiAgY29uc2lzdGluZyBvZiB0aGUgZW5kIG9mIHNlY3Rpb24gQS4gQmFzaWNhbGx5IGJlY2F1c2UgdHNmZWVkcAotKiogIGlzIGluY2VtZW50ZWQgYW5kIHRoZSB1c2U9MCBjb25kaXRpb24gaXMgbm90IHJhaXNlZAotKiogIHdoZW4gdGhlIHNlY29uZCBwYWNrZXQgYXJyaXZlcy4KLSoqCi0qKiBGaXg6Ci0qKiB3aGVuIGRlbXV4IGlzIHN0YXJ0ZWQsIGxldCBmZWVkLT5wdXNpX3NlZW4gPSAwIHRvCi0qKiBwcmV2ZW50IGluaXRpYWwgZmVlZGluZyBvZiBnYXJiYWdlIGZyb20gdGhlIGVuZCBvZgotKiogcHJldmlvdXMgc2VjdGlvbi4gV2hlbiB5b3UgZm9yIHRoZSBmaXJzdCB0aW1lIHNlZSBQVVNJPTEKLSoqIHRoZW4gc2V0IGZlZWQtPnB1c2lfc2VlbiA9IDEKLSovCi1zdGF0aWMgaW50IGR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9jb3B5X2R1bXAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLCBjb25zdCB1OCAqYnVmLCB1OCBsZW4pCisgKiBMb3NsZXNzIFNlY3Rpb24gRGVtdXggMS40LjEgYnkgRW1hcmQKKyAqIFZhbHNlY2NoaSBQYXRyaWNrOgorICogIC0gbWlkZGxlIG9mIHNlY3Rpb24gQSAgKG5vIFBVU0kpCisgKiAgLSBlbmQgb2Ygc2VjdGlvbiBBIGFuZCBzdGFydCBvZiBzZWN0aW9uIEIKKyAqICAgICh3aXRoIFBVU0kgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWNvbmQgc2VjdGlvbikKKyAqCisgKiAgSW4gdGhpcyBjYXNlLCB3aXRob3V0IGZlZWQtPnB1c2lfc2VlbiB5b3UnbGwgcmVjZWl2ZSBhIGdhcmJhZ2Ugc2VjdGlvbgorICogIGNvbnNpc3Rpbmcgb2YgdGhlIGVuZCBvZiBzZWN0aW9uIEEuIEJhc2ljYWxseSBiZWNhdXNlIHRzZmVlZHAKKyAqICBpcyBpbmNlbWVudGVkIGFuZCB0aGUgdXNlPTAgY29uZGl0aW9uIGlzIG5vdCByYWlzZWQKKyAqICB3aGVuIHRoZSBzZWNvbmQgcGFja2V0IGFycml2ZXMuCisgKgorICogRml4OgorICogd2hlbiBkZW11eCBpcyBzdGFydGVkLCBsZXQgZmVlZC0+cHVzaV9zZWVuID0gMCB0bworICogcHJldmVudCBpbml0aWFsIGZlZWRpbmcgb2YgZ2FyYmFnZSBmcm9tIHRoZSBlbmQgb2YKKyAqIHByZXZpb3VzIHNlY3Rpb24uIFdoZW4geW91IGZvciB0aGUgZmlyc3QgdGltZSBzZWUgUFVTST0xCisgKiB0aGVuIHNldCBmZWVkLT5wdXNpX3NlZW4gPSAxCisgKi8KK3N0YXRpYyBpbnQgZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX2NvcHlfZHVtcChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQsCisJCQkJCSAgICAgIGNvbnN0IHU4ICpidWYsIHU4IGxlbikKIHsKIAlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGZlZWQtPmRlbXV4OwogCXN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkICpzZWMgPSAmZmVlZC0+ZmVlZC5zZWM7CiAJdTE2IGxpbWl0LCBzZWNsZW4sIG47CiAKLQlpZihzZWMtPnRzZmVlZHAgPj0gRE1YX01BWF9TRUNGRUVEX1NJWkUpCisJaWYgKHNlYy0+dHNmZWVkcCA+PSBETVhfTUFYX1NFQ0ZFRURfU0laRSkKIAkJcmV0dXJuIDA7CiAKLQlpZihzZWMtPnRzZmVlZHAgKyBsZW4gPiBETVhfTUFYX1NFQ0ZFRURfU0laRSkKLQl7CisJaWYgKHNlYy0+dHNmZWVkcCArIGxlbiA+IERNWF9NQVhfU0VDRkVFRF9TSVpFKSB7CiAjaWZkZWYgRFZCX0RFTVVYX1NFQ1RJT05fTE9TU19MT0cKIAkJcHJpbnRrKCJkdmJfZGVtdXguYyBzZWN0aW9uIGJ1ZmZlciBmdWxsIGxvc3M6ICVkLyVkXG4iLAotCQkgICAgICAgc2VjLT50c2ZlZWRwICsgbGVuIC0gRE1YX01BWF9TRUNGRUVEX1NJWkUsIERNWF9NQVhfU0VDRkVFRF9TSVpFKTsKKwkJICAgICAgIHNlYy0+dHNmZWVkcCArIGxlbiAtIERNWF9NQVhfU0VDRkVFRF9TSVpFLAorCQkgICAgICAgRE1YX01BWF9TRUNGRUVEX1NJWkUpOwogI2VuZGlmCiAJCWxlbiA9IERNWF9NQVhfU0VDRkVFRF9TSVpFIC0gc2VjLT50c2ZlZWRwOwogCX0KIAotCWlmKGxlbiA8PSAwKQorCWlmIChsZW4gPD0gMCkKIAkJcmV0dXJuIDA7CiAKIAlkZW11eC0+bWVtY29weShmZWVkLCBzZWMtPnNlY2J1Zl9iYXNlICsgc2VjLT50c2ZlZWRwLCBidWYsIGxlbik7CiAJc2VjLT50c2ZlZWRwICs9IGxlbjsKIAotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JKiogRHVtcCBhbGwgdGhlIHNlY3Rpb25zIHdlIGNhbiBmaW5kIGluIHRoZSBkYXRhIChFbWFyZCkKLQkqLwotCisJLyoKKwkgKiBEdW1wIGFsbCB0aGUgc2VjdGlvbnMgd2UgY2FuIGZpbmQgaW4gdGhlIGRhdGEgKEVtYXJkKQorCSAqLwogCWxpbWl0ID0gc2VjLT50c2ZlZWRwOwotCWlmKGxpbWl0ID4gRE1YX01BWF9TRUNGRUVEX1NJWkUpCi0JCXJldHVybiAtMTsgLyogaW50ZXJuYWwgZXJyb3Igc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCWlmIChsaW1pdCA+IERNWF9NQVhfU0VDRkVFRF9TSVpFKQorCQlyZXR1cm4gLTE7CS8qIGludGVybmFsIGVycm9yIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KIAogCS8qIHRvIGJlIHN1cmUgYWx3YXlzIHNldCBzZWNidWYgKi8KIAlzZWMtPnNlY2J1ZiA9IHNlYy0+c2VjYnVmX2Jhc2UgKyBzZWMtPnNlY2J1ZnA7CiAKLQlmb3IobiA9IDA7IHNlYy0+c2VjYnVmcCArIDIgPCBsaW1pdDsgbisrKQotCXsKKwlmb3IgKG4gPSAwOyBzZWMtPnNlY2J1ZnAgKyAyIDwgbGltaXQ7IG4rKykgewogCQlzZWNsZW4gPSBzZWN0aW9uX2xlbmd0aChzZWMtPnNlY2J1Zik7Ci0JCWlmKHNlY2xlbiA8PSAwIHx8IHNlY2xlbiA+IERNWF9NQVhfU0VDRkVFRF9TSVpFCi0JCSAgIHx8IHNlY2xlbiArIHNlYy0+c2VjYnVmcCA+IGxpbWl0KQorCQlpZiAoc2VjbGVuIDw9IDAgfHwgc2VjbGVuID4gRE1YX01BWF9TRUNGRUVEX1NJWkUKKwkJICAgIHx8IHNlY2xlbiArIHNlYy0+c2VjYnVmcCA+IGxpbWl0KQogCQkJcmV0dXJuIDA7CiAJCXNlYy0+c2VjbGVuID0gc2VjbGVuOwogCQlzZWMtPmNyY192YWwgPSB+MDsKIAkJLyogZHVtcCBbc2VjYnVmIC4uIHNlY2J1ZitzZWNsZW4pICovCi0JCWlmKGZlZWQtPnB1c2lfc2VlbikKKwkJaWYgKGZlZWQtPnB1c2lfc2VlbikKIAkJCWR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9mZWVkKGZlZWQpOwogI2lmZGVmIERWQl9ERU1VWF9TRUNUSU9OX0xPU1NfTE9HCiAJCWVsc2UKIAkJCXByaW50aygiZHZiX2RlbXV4LmMgcHVzaSBub3Qgc2VlbiwgZGlzY2FyZGluZyBzZWN0aW9uIGRhdGFcbiIpOwogI2VuZGlmCi0JCXNlYy0+c2VjYnVmcCArPSBzZWNsZW47IC8qIHNlY2J1ZnAgYW5kIHNlY2J1ZiBtb3ZpbmcgdG9nZXRoZXIgaXMgKi8KLQkJc2VjLT5zZWNidWYgKz0gc2VjbGVuOyAvKiByZWR1bmRhbmQgYnV0IHNhdmVzIHBvaW50ZXIgYXJpdGhtZXRpYyAqLworCQlzZWMtPnNlY2J1ZnAgKz0gc2VjbGVuOwkvKiBzZWNidWZwIGFuZCBzZWNidWYgbW92aW5nIHRvZ2V0aGVyIGlzICovCisJCXNlYy0+c2VjYnVmICs9IHNlY2xlbjsJLyogcmVkdW5kYW50IGJ1dCBzYXZlcyBwb2ludGVyIGFyaXRobWV0aWMgKi8KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IGR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9wYWNrZXQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLCBjb25zdCB1OCAqYnVmKQorc3RhdGljIGludCBkdmJfZG14X3N3ZmlsdGVyX3NlY3Rpb25fcGFja2V0KHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCwKKwkJCQkJICAgY29uc3QgdTggKmJ1ZikKIHsKIAl1OCBwLCBjb3VudDsKIAlpbnQgY2NvaywgZGNfaSA9IDA7CkBAIC0zMDksMTAgKzI3NCwxMCBAQAogCiAJY291bnQgPSBwYXlsb2FkKGJ1Zik7CiAKLQlpZiAoY291bnQgPT0gMCkgIC8qIGNvdW50ID09IDAgaWYgbm8gcGF5bG9hZCBvciBvdXQgb2YgcmFuZ2UgKi8KKwlpZiAoY291bnQgPT0gMCkJCS8qIGNvdW50ID09IDAgaWYgbm8gcGF5bG9hZCBvciBvdXQgb2YgcmFuZ2UgKi8KIAkJcmV0dXJuIC0xOwogCi0JcCA9IDE4OCAtIGNvdW50OyAvKiBwYXlsb2FkIHN0YXJ0ICovCisJcCA9IDE4OCAtIGNvdW50OwkvKiBwYXlsb2FkIHN0YXJ0ICovCiAKIAljYyA9IGJ1ZlszXSAmIDB4MGY7CiAJY2NvayA9ICgoZmVlZC0+Y2MgKyAxKSAmIDB4MGYpID09IGNjOwpAQCAtMzI2LDUyICsyOTEsNTMgQEAKIAogCWlmICghY2NvayB8fCBkY19pKSB7CiAjaWZkZWYgRFZCX0RFTVVYX1NFQ1RJT05fTE9TU19MT0cKLQkJcHJpbnRrKCJkdmJfZGVtdXguYyBkaXNjb250aW51aXR5IGRldGVjdGVkICVkIGJ5dGVzIGxvc3RcbiIsIGNvdW50KTsKLQkJLyogdGhvc2UgYnl0ZXMgdW5kZXIgc3VtZSBjaXJjdW1zdGFuY2VzIHdpbGwgYWdhaW4gYmUgcmVwb3J0ZWQKLQkJKiogaW4gdGhlIGZvbGxvd2luZyBkdmJfZG14X3N3ZmlsdGVyX3NlY3Rpb25fbmV3Ci0JCSovCisJCXByaW50aygiZHZiX2RlbXV4LmMgZGlzY29udGludWl0eSBkZXRlY3RlZCAlZCBieXRlcyBsb3N0XG4iLAorCQkgICAgICAgY291bnQpOworCQkvKgorCQkgKiB0aG9zZSBieXRlcyB1bmRlciBzdW1lIGNpcmN1bXN0YW5jZXMgd2lsbCBhZ2FpbiBiZSByZXBvcnRlZAorCQkgKiBpbiB0aGUgZm9sbG93aW5nIGR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9uZXcKKwkJICovCiAjZW5kaWYKLQkJLyogRGlzY29udGludWl0eSBkZXRlY3RlZC4gUmVzZXQgcHVzaV9zZWVuID0gMCB0bwotCQkqKiBzdG9wIGZlZWRpbmcgb2Ygc3VzcGljaW91cyBkYXRhIHVudGlsIG5leHQgUFVTST0xIGFycml2ZXMKLQkJKi8KKwkJLyoKKwkJICogRGlzY29udGludWl0eSBkZXRlY3RlZC4gUmVzZXQgcHVzaV9zZWVuID0gMCB0bworCQkgKiBzdG9wIGZlZWRpbmcgb2Ygc3VzcGljaW91cyBkYXRhIHVudGlsIG5leHQgUFVTST0xIGFycml2ZXMKKwkJICovCiAJCWZlZWQtPnB1c2lfc2VlbiA9IDA7CiAJCWR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9uZXcoZmVlZCk7Ci0JCXJldHVybiAwOwogCX0KIAogCWlmIChidWZbMV0gJiAweDQwKSB7Ci0JCS8vIFBVU0k9MSAoaXMgc2V0KSwgc2VjdGlvbiBib3VuZGFyeSBpcyBoZXJlCisJCS8qIFBVU0k9MSAoaXMgc2V0KSwgc2VjdGlvbiBib3VuZGFyeSBpcyBoZXJlICovCiAJCWlmIChjb3VudCA+IDEgJiYgYnVmW3BdIDwgY291bnQpIHsKLQkJCWNvbnN0IHU4ICpiZWZvcmUgPSBidWYrcCsxOworCQkJY29uc3QgdTggKmJlZm9yZSA9ICZidWZbcCArIDFdOwogCQkJdTggYmVmb3JlX2xlbiA9IGJ1ZltwXTsKLQkJCWNvbnN0IHU4ICphZnRlciA9IGJlZm9yZStiZWZvcmVfbGVuOwotCQkJdTggYWZ0ZXJfbGVuID0gY291bnQtMS1iZWZvcmVfbGVuOworCQkJY29uc3QgdTggKmFmdGVyID0gJmJlZm9yZVtiZWZvcmVfbGVuXTsKKwkJCXU4IGFmdGVyX2xlbiA9IGNvdW50IC0gMSAtIGJlZm9yZV9sZW47CiAKLQkJCWR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9jb3B5X2R1bXAoZmVlZCwgYmVmb3JlLCBiZWZvcmVfbGVuKTsKKwkJCWR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9jb3B5X2R1bXAoZmVlZCwgYmVmb3JlLAorCQkJCQkJCSAgIGJlZm9yZV9sZW4pOwogCQkJLyogYmVmb3JlIHN0YXJ0IG9mIG5ldyBzZWN0aW9uLCBzZXQgcHVzaV9zZWVuID0gMSAqLwogCQkJZmVlZC0+cHVzaV9zZWVuID0gMTsKIAkJCWR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9uZXcoZmVlZCk7Ci0JCQlkdmJfZG14X3N3ZmlsdGVyX3NlY3Rpb25fY29weV9kdW1wKGZlZWQsIGFmdGVyLCBhZnRlcl9sZW4pOworCQkJZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX2NvcHlfZHVtcChmZWVkLCBhZnRlciwKKwkJCQkJCQkgICBhZnRlcl9sZW4pOwogCQl9CiAjaWZkZWYgRFZCX0RFTVVYX1NFQ1RJT05fTE9TU19MT0cKLQkJZWxzZQotCQkJaWYgKGNvdW50ID4gMCkKLQkJCQlwcmludGsoImR2Yl9kZW11eC5jIFBVU0k9MSBidXQgJWQgYnl0ZXMgbG9zdFxuIiwgY291bnQpOworCQllbHNlIGlmIChjb3VudCA+IDApCisJCQlwcmludGsoImR2Yl9kZW11eC5jIFBVU0k9MSBidXQgJWQgYnl0ZXMgbG9zdFxuIiwgY291bnQpOwogI2VuZGlmCiAJfSBlbHNlIHsKLQkJLy8gUFVTST0wIChpcyBub3Qgc2V0KSwgbm8gc2VjdGlvbiBib3VuZGFyeQotCQljb25zdCB1OCAqZW50aXJlID0gYnVmK3A7Ci0JCXU4IGVudGlyZV9sZW4gPSBjb3VudDsKLQotCQlkdmJfZG14X3N3ZmlsdGVyX3NlY3Rpb25fY29weV9kdW1wKGZlZWQsIGVudGlyZSwgZW50aXJlX2xlbik7CisJCS8qIFBVU0k9MCAoaXMgbm90IHNldCksIG5vIHNlY3Rpb24gYm91bmRhcnkgKi8KKwkJZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX2NvcHlfZHVtcChmZWVkLCAmYnVmW3BdLCBjb3VudCk7CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGlubGluZSB2b2lkIGR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0X3R5cGUoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLCBjb25zdCB1OCAqYnVmKQorc3RhdGljIGlubGluZSB2b2lkIGR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0X3R5cGUoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLAorCQkJCQkJY29uc3QgdTggKmJ1ZikKIHsKLQlzd2l0Y2goZmVlZC0+dHlwZSkgeworCXN3aXRjaCAoZmVlZC0+dHlwZSkgewogCWNhc2UgRE1YX1RZUEVfVFM6CiAJCWlmICghZmVlZC0+ZmVlZC50cy5pc19maWx0ZXJpbmcpCiAJCQlicmVhazsKQEAgLTM3OSw3ICszNDUsOCBAQAogCQkJaWYgKGZlZWQtPnRzX3R5cGUgJiBUU19QQVlMT0FEX09OTFkpCiAJCQkJZHZiX2RteF9zd2ZpbHRlcl9wYXlsb2FkKGZlZWQsIGJ1Zik7CiAJCQllbHNlCi0JCQkJZmVlZC0+Y2IudHMoYnVmLCAxODgsIE5VTEwsIDAsICZmZWVkLT5mZWVkLnRzLCBETVhfT0spOworCQkJCWZlZWQtPmNiLnRzKGJ1ZiwgMTg4LCBOVUxMLCAwLCAmZmVlZC0+ZmVlZC50cywKKwkJCQkJICAgIERNWF9PSyk7CiAJCX0KIAkJaWYgKGZlZWQtPnRzX3R5cGUgJiBUU19ERUNPREVSKQogCQkJaWYgKGZlZWQtPmRlbXV4LT53cml0ZV90b19kZWNvZGVyKQpAQCAtMzkwLDcgKzM1Nyw3IEBACiAJCWlmICghZmVlZC0+ZmVlZC5zZWMuaXNfZmlsdGVyaW5nKQogCQkJYnJlYWs7CiAJCWlmIChkdmJfZG14X3N3ZmlsdGVyX3NlY3Rpb25fcGFja2V0KGZlZWQsIGJ1ZikgPCAwKQotCQkJZmVlZC0+ZmVlZC5zZWMuc2VjbGVuID0gZmVlZC0+ZmVlZC5zZWMuc2VjYnVmcD0wOworCQkJZmVlZC0+ZmVlZC5zZWMuc2VjbGVuID0gZmVlZC0+ZmVlZC5zZWMuc2VjYnVmcCA9IDA7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTQwNiw3ICszNzMsNyBAQAogc3RhdGljIHZvaWQgZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXQoc3RydWN0IGR2Yl9kZW11eCAqZGVtdXgsIGNvbnN0IHU4ICpidWYpCiB7CiAJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKmhlYWQ9JmRlbXV4LT5mZWVkX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqaGVhZCA9ICZkZW11eC0+ZmVlZF9saXN0OwogCXUxNiBwaWQgPSB0c19waWQoYnVmKTsKIAlpbnQgZHZyX2RvbmUgPSAwOwogCkBAIC00MzIsMjEgKzM5OSwyMSBAQAogCX0KIH0KIAotdm9pZCBkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMoc3RydWN0IGR2Yl9kZW11eCAqZGVtdXgsIGNvbnN0IHU4ICpidWYsIHNpemVfdCBjb3VudCkKK3ZvaWQgZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXRzKHN0cnVjdCBkdmJfZGVtdXggKmRlbXV4LCBjb25zdCB1OCAqYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50KQogewogCXNwaW5fbG9jaygmZGVtdXgtPmxvY2spOwogCiAJd2hpbGUgKGNvdW50LS0pIHsKLQkJaWYoYnVmWzBdID09IDB4NDcpIHsKLQkJICAgICAgICBkdmJfZG14X3N3ZmlsdGVyX3BhY2tldChkZW11eCwgYnVmKTsKLQkJfQorCQlpZiAoYnVmWzBdID09IDB4NDcpCisJCQlkdmJfZG14X3N3ZmlsdGVyX3BhY2tldChkZW11eCwgYnVmKTsKIAkJYnVmICs9IDE4ODsKIAl9CiAKIAlzcGluX3VubG9jaygmZGVtdXgtPmxvY2spOwogfQotRVhQT1JUX1NZTUJPTChkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMpOwogCitFWFBPUlRfU1lNQk9MKGR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cyk7CiAKIHZvaWQgZHZiX2RteF9zd2ZpbHRlcihzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KQogewpAQCAtNDU0LDggKzQyMSwxMCBAQAogCiAJc3Bpbl9sb2NrKCZkZW11eC0+bG9jayk7CiAKLQlpZiAoKGkgPSBkZW11eC0+dHNidWZwKSkgewotCQlpZiAoY291bnQgPCAoaj0xODgtaSkpIHsKKwlpZiAoZGVtdXgtPnRzYnVmcCkgeworCQlpID0gZGVtdXgtPnRzYnVmcDsKKwkJaiA9IDE4OCAtIGk7CisJCWlmIChjb3VudCA8IGopIHsKIAkJCW1lbWNweSgmZGVtdXgtPnRzYnVmW2ldLCBidWYsIGNvdW50KTsKIAkJCWRlbXV4LT50c2J1ZnAgKz0gY291bnQ7CiAJCQlnb3RvIGJhaWxvdXQ7CkBAIC00NjksMTMgKzQzOCwxMyBAQAogCiAJd2hpbGUgKHAgPCBjb3VudCkgewogCQlpZiAoYnVmW3BdID09IDB4NDcpIHsKLQkJCWlmIChjb3VudC1wID49IDE4OCkgewotCQkJCWR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0KGRlbXV4LCBidWYrcCk7CisJCQlpZiAoY291bnQgLSBwID49IDE4OCkgeworCQkJCWR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0KGRlbXV4LCAmYnVmW3BdKTsKIAkJCQlwICs9IDE4ODsKIAkJCX0gZWxzZSB7Ci0JCQkJaSA9IGNvdW50LXA7Ci0JCQkJbWVtY3B5KGRlbXV4LT50c2J1ZiwgYnVmK3AsIGkpOwotCQkJCWRlbXV4LT50c2J1ZnA9aTsKKwkJCQlpID0gY291bnQgLSBwOworCQkJCW1lbWNweShkZW11eC0+dHNidWYsICZidWZbcF0sIGkpOworCQkJCWRlbXV4LT50c2J1ZnAgPSBpOwogCQkJCWdvdG8gYmFpbG91dDsKIAkJCX0KIAkJfSBlbHNlCkBAIC00ODUsMjQgKzQ1NCwyOSBAQAogYmFpbG91dDoKIAlzcGluX3VubG9jaygmZGVtdXgtPmxvY2spOwogfQorCiBFWFBPUlRfU1lNQk9MKGR2Yl9kbXhfc3dmaWx0ZXIpOwogCiB2b2lkIGR2Yl9kbXhfc3dmaWx0ZXJfMjA0KHN0cnVjdCBkdmJfZGVtdXggKmRlbXV4LCBjb25zdCB1OCAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JaW50IHAgPSAwLGksIGo7CisJaW50IHAgPSAwLCBpLCBqOwogCXU4IHRtcHBhY2tbMTg4XTsKKwogCXNwaW5fbG9jaygmZGVtdXgtPmxvY2spOwogCi0JaWYgKChpID0gZGVtdXgtPnRzYnVmcCkpIHsKLQkJaWYgKGNvdW50IDwgKGo9MjA0LWkpKSB7CisJaWYgKGRlbXV4LT50c2J1ZnApIHsKKwkJaSA9IGRlbXV4LT50c2J1ZnA7CisJCWogPSAyMDQgLSBpOworCQlpZiAoY291bnQgPCBqKSB7CiAJCQltZW1jcHkoJmRlbXV4LT50c2J1ZltpXSwgYnVmLCBjb3VudCk7CiAJCQlkZW11eC0+dHNidWZwICs9IGNvdW50OwogCQkJZ290byBiYWlsb3V0OwogCQl9CiAJCW1lbWNweSgmZGVtdXgtPnRzYnVmW2ldLCBidWYsIGopOwotCQlpZiAoKGRlbXV4LT50c2J1ZlswXSA9PSAweDQ3KXwoZGVtdXgtPnRzYnVmWzBdPT0weEI4KSkgIHsKKwkJaWYgKChkZW11eC0+dHNidWZbMF0gPT0gMHg0NykgfCAoZGVtdXgtPnRzYnVmWzBdID09IDB4QjgpKSB7CiAJCQltZW1jcHkodG1wcGFjaywgZGVtdXgtPnRzYnVmLCAxODgpOwotCQkJaWYgKHRtcHBhY2tbMF0gPT0gMHhCOCkgdG1wcGFja1swXSA9IDB4NDc7CisJCQlpZiAodG1wcGFja1swXSA9PSAweEI4KQorCQkJCXRtcHBhY2tbMF0gPSAweDQ3OwogCQkJZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXQoZGVtdXgsIHRtcHBhY2spOwogCQl9CiAJCWRlbXV4LT50c2J1ZnAgPSAwOwpAQCAtNTEwLDE2ICs0ODQsMTcgQEAKIAl9CiAKIAl3aGlsZSAocCA8IGNvdW50KSB7Ci0JCWlmICgoYnVmW3BdID09IDB4NDcpfChidWZbcF0gPT0gMHhCOCkpIHsKLQkJCWlmIChjb3VudC1wID49IDIwNCkgewotCQkJCW1lbWNweSh0bXBwYWNrLCBidWYrcCwgMTg4KTsKLQkJCQlpZiAodG1wcGFja1swXSA9PSAweEI4KSB0bXBwYWNrWzBdID0gMHg0NzsKKwkJaWYgKChidWZbcF0gPT0gMHg0NykgfCAoYnVmW3BdID09IDB4QjgpKSB7CisJCQlpZiAoY291bnQgLSBwID49IDIwNCkgeworCQkJCW1lbWNweSh0bXBwYWNrLCAmYnVmW3BdLCAxODgpOworCQkJCWlmICh0bXBwYWNrWzBdID09IDB4QjgpCisJCQkJCXRtcHBhY2tbMF0gPSAweDQ3OwogCQkJCWR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0KGRlbXV4LCB0bXBwYWNrKTsKIAkJCQlwICs9IDIwNDsKIAkJCX0gZWxzZSB7Ci0JCQkJaSA9IGNvdW50LXA7Ci0JCQkJbWVtY3B5KGRlbXV4LT50c2J1ZiwgYnVmK3AsIGkpOwotCQkJCWRlbXV4LT50c2J1ZnA9aTsKKwkJCQlpID0gY291bnQgLSBwOworCQkJCW1lbWNweShkZW11eC0+dHNidWYsICZidWZbcF0sIGkpOworCQkJCWRlbXV4LT50c2J1ZnAgPSBpOwogCQkJCWdvdG8gYmFpbG91dDsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTUzMCwxNCArNTA1LDE0IEBACiBiYWlsb3V0OgogCXNwaW5fdW5sb2NrKCZkZW11eC0+bG9jayk7CiB9CisKIEVYUE9SVF9TWU1CT0woZHZiX2RteF9zd2ZpbHRlcl8yMDQpOwogCi0KLXN0YXRpYyBzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciAqIGR2Yl9kbXhfZmlsdGVyX2FsbG9jKHN0cnVjdCBkdmJfZGVtdXggKmRlbXV4KQorc3RhdGljIHN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyICpkdmJfZG14X2ZpbHRlcl9hbGxvYyhzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCkKIHsKIAlpbnQgaTsKIAotCWZvciAoaT0wOyBpPGRlbXV4LT5maWx0ZXJudW07IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPmZpbHRlcm51bTsgaSsrKQogCQlpZiAoZGVtdXgtPmZpbHRlcltpXS5zdGF0ZSA9PSBETVhfU1RBVEVfRlJFRSkKIAkJCWJyZWFrOwogCkBAIC01NDksMTEgKzUyNCwxMSBAQAogCXJldHVybiAmZGVtdXgtPmZpbHRlcltpXTsKIH0KIAotc3RhdGljIHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqIGR2Yl9kbXhfZmVlZF9hbGxvYyhzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCkKK3N0YXRpYyBzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2Yl9kbXhfZmVlZF9hbGxvYyhzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCkKIHsKIAlpbnQgaTsKIAotCWZvciAoaT0wOyBpPGRlbXV4LT5mZWVkbnVtOyBpKyspCisJZm9yIChpID0gMDsgaSA8IGRlbXV4LT5mZWVkbnVtOyBpKyspCiAJCWlmIChkZW11eC0+ZmVlZFtpXS5zdGF0ZSA9PSBETVhfU1RBVEVfRlJFRSkKIAkJCWJyZWFrOwogCkBAIC01ODEsNyArNTU2LDcgQEAKIAlzcGluX2xvY2tfaXJxKCZmZWVkLT5kZW11eC0+bG9jayk7CiAJaWYgKGR2Yl9kZW11eF9mZWVkX2ZpbmQoZmVlZCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmVlZCBhbHJlYWR5IGluIGxpc3QgKHR5cGU9JXggc3RhdGU9JXggcGlkPSV4KVxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGZlZWQtPnR5cGUsIGZlZWQtPnN0YXRlLCBmZWVkLT5waWQpOworCQkgICAgICAgX19GVU5DVElPTl9fLCBmZWVkLT50eXBlLCBmZWVkLT5zdGF0ZSwgZmVlZC0+cGlkKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC01OTUsNyArNTcwLDcgQEAKIAlzcGluX2xvY2tfaXJxKCZmZWVkLT5kZW11eC0+bG9jayk7CiAJaWYgKCEoZHZiX2RlbXV4X2ZlZWRfZmluZChmZWVkKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmVlZCBub3QgaW4gbGlzdCAodHlwZT0leCBzdGF0ZT0leCBwaWQ9JXgpXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgZmVlZC0+dHlwZSwgZmVlZC0+c3RhdGUsIGZlZWQtPnBpZCk7CisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGZlZWQtPnR5cGUsIGZlZWQtPnN0YXRlLCBmZWVkLT5waWQpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTYwNCwxOCArNTc5LDE3IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZmZWVkLT5kZW11eC0+bG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgZG14X3RzX2ZlZWRfc2V0IChzdHJ1Y3QgZG14X3RzX2ZlZWQqIHRzX2ZlZWQsIHUxNiBwaWQsIGludCB0c190eXBlLAotCQkgICAgIGVudW0gZG14X3RzX3BlcyBwZXNfdHlwZSwgc2l6ZV90IGNhbGxiYWNrX2xlbmd0aCwKLQkJICAgICBzaXplX3QgY2lyY3VsYXJfYnVmZmVyX3NpemUsIGludCBkZXNjcmFtYmxlLAotCQkgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lb3V0KQorc3RhdGljIGludCBkbXhfdHNfZmVlZF9zZXQoc3RydWN0IGRteF90c19mZWVkICp0c19mZWVkLCB1MTYgcGlkLCBpbnQgdHNfdHlwZSwKKwkJCSAgIGVudW0gZG14X3RzX3BlcyBwZXNfdHlwZSwKKwkJCSAgIHNpemVfdCBjaXJjdWxhcl9idWZmZXJfc2l6ZSwgc3RydWN0IHRpbWVzcGVjIHRpbWVvdXQpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKSB0c19mZWVkOworCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKil0c19mZWVkOwogCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZmVlZC0+ZGVtdXg7CiAKIAlpZiAocGlkID4gRE1YX01BWF9QSUQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmRlbXV4LT5tdXRleCkpCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGVtdXgtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWlmICh0c190eXBlICYgVFNfREVDT0RFUikgewpAQCAtNjM4LDIwICs2MTIsMTMgQEAKIAogCWZlZWQtPnBpZCA9IHBpZDsKIAlmZWVkLT5idWZmZXJfc2l6ZSA9IGNpcmN1bGFyX2J1ZmZlcl9zaXplOwotCWZlZWQtPmRlc2NyYW1ibGUgPSBkZXNjcmFtYmxlOwogCWZlZWQtPnRpbWVvdXQgPSB0aW1lb3V0OwotCWZlZWQtPmNiX2xlbmd0aCA9IGNhbGxiYWNrX2xlbmd0aDsKIAlmZWVkLT50c190eXBlID0gdHNfdHlwZTsKIAlmZWVkLT5wZXNfdHlwZSA9IHBlc190eXBlOwogCi0JaWYgKGZlZWQtPmRlc2NyYW1ibGUpIHsKLQkJdXAoJmRlbXV4LT5tdXRleCk7Ci0JCXJldHVybiAtRU5PU1lTOwotCX0KLQogCWlmIChmZWVkLT5idWZmZXJfc2l6ZSkgewogI2lmZGVmIE5PQlVGUwotCQlmZWVkLT5idWZmZXI9TlVMTDsKKwkJZmVlZC0+YnVmZmVyID0gTlVMTDsKICNlbHNlCiAJCWZlZWQtPmJ1ZmZlciA9IHZtYWxsb2MoZmVlZC0+YnVmZmVyX3NpemUpOwogCQlpZiAoIWZlZWQtPmJ1ZmZlcikgewpAQCAtNjY3LDE0ICs2MzQsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IGRteF90c19mZWVkX3N0YXJ0X2ZpbHRlcmluZyhzdHJ1Y3QgZG14X3RzX2ZlZWQqIHRzX2ZlZWQpCitzdGF0aWMgaW50IGRteF90c19mZWVkX3N0YXJ0X2ZpbHRlcmluZyhzdHJ1Y3QgZG14X3RzX2ZlZWQgKnRzX2ZlZWQpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKSB0c19mZWVkOworCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKil0c19mZWVkOwogCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZmVlZC0+ZGVtdXg7CiAJaW50IHJldDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZkZW11eC0+bXV0ZXgpKQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRlbXV4LT5tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlpZiAoZmVlZC0+c3RhdGUgIT0gRE1YX1NUQVRFX1JFQURZIHx8IGZlZWQtPnR5cGUgIT0gRE1YX1RZUEVfVFMpIHsKQEAgLTcwMSwxMyArNjY3LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG14X3RzX2ZlZWRfc3RvcF9maWx0ZXJpbmcoc3RydWN0IGRteF90c19mZWVkKiB0c19mZWVkKQorc3RhdGljIGludCBkbXhfdHNfZmVlZF9zdG9wX2ZpbHRlcmluZyhzdHJ1Y3QgZG14X3RzX2ZlZWQgKnRzX2ZlZWQpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKSB0c19mZWVkOworCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKil0c19mZWVkOwogCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZmVlZC0+ZGVtdXg7CiAJaW50IHJldDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZkZW11eC0+bXV0ZXgpKQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRlbXV4LT5tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlpZiAoZmVlZC0+c3RhdGUgPCBETVhfU1RBVEVfR08pIHsKQEAgLTczMSwxMyArNjk3LDE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBkdmJkbXhfYWxsb2NhdGVfdHNfZmVlZCAoc3RydWN0IGRteF9kZW11eCAqZG14LCBzdHJ1Y3QgZG14X3RzX2ZlZWQgKip0c19mZWVkLAotCQkJICAgICBkbXhfdHNfY2IgY2FsbGJhY2spCitzdGF0aWMgaW50IGR2YmRteF9hbGxvY2F0ZV90c19mZWVkKHN0cnVjdCBkbXhfZGVtdXggKmRteCwKKwkJCQkgICBzdHJ1Y3QgZG14X3RzX2ZlZWQgKip0c19mZWVkLAorCQkJCSAgIGRteF90c19jYiBjYWxsYmFjaykKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopIGRteDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopZG14OwogCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZkZW11eC0+bXV0ZXgpKQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRlbXV4LT5tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlpZiAoIShmZWVkID0gZHZiX2RteF9mZWVkX2FsbG9jKGRlbXV4KSkpIHsKQEAgLTc2MCw3ICs3MjcsNiBAQAogCSgqdHNfZmVlZCktPnN0b3BfZmlsdGVyaW5nID0gZG14X3RzX2ZlZWRfc3RvcF9maWx0ZXJpbmc7CiAJKCp0c19mZWVkKS0+c2V0ID0gZG14X3RzX2ZlZWRfc2V0OwogCi0KIAlpZiAoIShmZWVkLT5maWx0ZXIgPSBkdmJfZG14X2ZpbHRlcl9hbGxvYyhkZW11eCkpKSB7CiAJCWZlZWQtPnN0YXRlID0gRE1YX1NUQVRFX0ZSRUU7CiAJCXVwKCZkZW11eC0+bXV0ZXgpOwpAQCAtNzc2LDIyICs3NDIsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkdmJkbXhfcmVsZWFzZV90c19mZWVkKHN0cnVjdCBkbXhfZGVtdXggKmRteCwgc3RydWN0IGRteF90c19mZWVkICp0c19mZWVkKQorc3RhdGljIGludCBkdmJkbXhfcmVsZWFzZV90c19mZWVkKHN0cnVjdCBkbXhfZGVtdXggKmRteCwKKwkJCQkgIHN0cnVjdCBkbXhfdHNfZmVlZCAqdHNfZmVlZCkKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopIGRteDsKLQlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopIHRzX2ZlZWQ7CisJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKWRteDsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopdHNfZmVlZDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZkZW11eC0+bXV0ZXgpKQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRlbXV4LT5tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlpZiAoZmVlZC0+c3RhdGUgPT0gRE1YX1NUQVRFX0ZSRUUpIHsKIAkJdXAoJmRlbXV4LT5tdXRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQogI2lmbmRlZiBOT0JVRlMKIAl2ZnJlZShmZWVkLT5idWZmZXIpOwotCWZlZWQtPmJ1ZmZlcj0wOworCWZlZWQtPmJ1ZmZlciA9IE5VTEw7CiAjZW5kaWYKIAogCWZlZWQtPnN0YXRlID0gRE1YX1NUQVRFX0ZSRUU7CkBAIC04MDgsMTkgKzc3NCwxOCBAQAogCXJldHVybiAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGRteF9zZWN0aW9uX2ZlZWQgQVBJIGNhbGxzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IGRteF9zZWN0aW9uX2ZlZWRfYWxsb2NhdGVfZmlsdGVyKHN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkKiBmZWVkLAotCQkJCSAgICAgc3RydWN0IGRteF9zZWN0aW9uX2ZpbHRlcioqIGZpbHRlcikKK3N0YXRpYyBpbnQgZG14X3NlY3Rpb25fZmVlZF9hbGxvY2F0ZV9maWx0ZXIoc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQgKmZlZWQsCisJCQkJCSAgICBzdHJ1Y3QgZG14X3NlY3Rpb25fZmlsdGVyICoqZmlsdGVyKQogewotCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKikgZmVlZDsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopZmVlZDsKIAlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IGR2YmRteGZlZWQtPmRlbXV4OwogCXN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyICpkdmJkbXhmaWx0ZXI7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmZHZiZGVtdXgtPm11dGV4KSkKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkdmJkZW11eC0+bXV0ZXgpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJZHZiZG14ZmlsdGVyID0gZHZiX2RteF9maWx0ZXJfYWxsb2MoZHZiZGVtdXgpOwpAQCAtODQ0LDM2ICs4MDksMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IGRteF9zZWN0aW9uX2ZlZWRfc2V0KHN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkKiBmZWVkLAotCQkJIHUxNiBwaWQsIHNpemVfdCBjaXJjdWxhcl9idWZmZXJfc2l6ZSwKLQkJCSBpbnQgZGVzY3JhbWJsZSwgaW50IGNoZWNrX2NyYykKK3N0YXRpYyBpbnQgZG14X3NlY3Rpb25fZmVlZF9zZXQoc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQgKmZlZWQsCisJCQkJdTE2IHBpZCwgc2l6ZV90IGNpcmN1bGFyX2J1ZmZlcl9zaXplLAorCQkJCWludCBjaGVja19jcmMpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKSBmZWVkOworCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKilmZWVkOwogCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRteCA9IGR2YmRteGZlZWQtPmRlbXV4OwogCiAJaWYgKHBpZCA+IDB4MWZmZikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmZHZiZG14LT5tdXRleCkpCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZHZiZG14LT5tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlkdmJfZGVtdXhfZmVlZF9hZGQoZHZiZG14ZmVlZCk7CiAKIAlkdmJkbXhmZWVkLT5waWQgPSBwaWQ7CiAJZHZiZG14ZmVlZC0+YnVmZmVyX3NpemUgPSBjaXJjdWxhcl9idWZmZXJfc2l6ZTsKLQlkdmJkbXhmZWVkLT5kZXNjcmFtYmxlID0gZGVzY3JhbWJsZTsKLQlpZiAoZHZiZG14ZmVlZC0+ZGVzY3JhbWJsZSkgewotCQl1cCgmZHZiZG14LT5tdXRleCk7Ci0JCXJldHVybiAtRU5PU1lTOwotCX0KLQogCWR2YmRteGZlZWQtPmZlZWQuc2VjLmNoZWNrX2NyYyA9IGNoZWNrX2NyYzsKIAogI2lmZGVmIE5PQlVGUwogCWR2YmRteGZlZWQtPmJ1ZmZlciA9IE5VTEw7CiAjZWxzZQotCWR2YmRteGZlZWQtPmJ1ZmZlcj12bWFsbG9jKGR2YmRteGZlZWQtPmJ1ZmZlcl9zaXplKTsKKwlkdmJkbXhmZWVkLT5idWZmZXIgPSB2bWFsbG9jKGR2YmRteGZlZWQtPmJ1ZmZlcl9zaXplKTsKIAlpZiAoIWR2YmRteGZlZWQtPmJ1ZmZlcikgewogCQl1cCgmZHZiZG14LT5tdXRleCk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtODg1LDcgKzg0Myw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIHZvaWQgcHJlcGFyZV9zZWNmaWx0ZXJzKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKIHsKIAlpbnQgaTsKQEAgLTg5MywxMiArODUwLDEyIEBACiAJc3RydWN0IGRteF9zZWN0aW9uX2ZpbHRlciAqc2Y7CiAJdTggbWFzaywgbW9kZSwgZG9uZXE7CiAKLQlpZiAoIShmPWR2YmRteGZlZWQtPmZpbHRlcikpCisJaWYgKCEoZiA9IGR2YmRteGZlZWQtPmZpbHRlcikpCiAJCXJldHVybjsKIAlkbyB7CiAJCXNmID0gJmYtPmZpbHRlcjsKIAkJZG9uZXEgPSAwOwotCQlmb3IgKGk9MDsgaTxEVkJfREVNVVhfTUFTS19NQVg7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgRFZCX0RFTVVYX01BU0tfTUFYOyBpKyspIHsKIAkJCW1vZGUgPSBzZi0+ZmlsdGVyX21vZGVbaV07CiAJCQltYXNrID0gc2YtPmZpbHRlcl9tYXNrW2ldOwogCQkJZi0+bWFza2FuZG1vZGVbaV0gPSBtYXNrICYgbW9kZTsKQEAgLTkwOCwxNCArODY1LDEzIEBACiAJfSB3aGlsZSAoKGYgPSBmLT5uZXh0KSk7CiB9CiAKLQogc3RhdGljIGludCBkbXhfc2VjdGlvbl9mZWVkX3N0YXJ0X2ZpbHRlcmluZyhzdHJ1Y3QgZG14X3NlY3Rpb25fZmVlZCAqZmVlZCkKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopIGZlZWQ7CisJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKWZlZWQ7CiAJc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CiAJaW50IHJldDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZkdmJkbXgtPm11dGV4KSkKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkdmJkbXgtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWlmIChmZWVkLT5pc19maWx0ZXJpbmcpIHsKQEAgLTk1NCwxNCArOTEwLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBkbXhfc2VjdGlvbl9mZWVkX3N0b3BfZmlsdGVyaW5nKHN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkKiBmZWVkKQorc3RhdGljIGludCBkbXhfc2VjdGlvbl9mZWVkX3N0b3BfZmlsdGVyaW5nKHN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkICpmZWVkKQogewotCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKikgZmVlZDsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopZmVlZDsKIAlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXggPSBkdmJkbXhmZWVkLT5kZW11eDsKIAlpbnQgcmV0OwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmR2YmRteC0+bXV0ZXgpKQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmR2YmRteC0+bXV0ZXgpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKCFkdmJkbXgtPnN0b3BfZmVlZCkgewpAQCAtOTgwLDE1ICs5MzUsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KIHN0YXRpYyBpbnQgZG14X3NlY3Rpb25fZmVlZF9yZWxlYXNlX2ZpbHRlcihzdHJ1Y3QgZG14X3NlY3Rpb25fZmVlZCAqZmVlZCwKLQkJCQlzdHJ1Y3QgZG14X3NlY3Rpb25fZmlsdGVyKiBmaWx0ZXIpCisJCQkJCSAgIHN0cnVjdCBkbXhfc2VjdGlvbl9maWx0ZXIgKmZpbHRlcikKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciAqZHZiZG14ZmlsdGVyID0gKHN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyICopIGZpbHRlciwgKmY7Ci0Jc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKSBmZWVkOworCXN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyICpkdmJkbXhmaWx0ZXIgPSAoc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKilmaWx0ZXIsICpmOworCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKilmZWVkOwogCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRteCA9IGR2YmRteGZlZWQtPmRlbXV4OwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmR2YmRteC0+bXV0ZXgpKQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmR2YmRteC0+bXV0ZXgpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKGR2YmRteGZpbHRlci0+ZmVlZCAhPSBkdmJkbXhmZWVkKSB7CkBAIC0xMDA1LDcgKzk1OSw3IEBACiAJaWYgKGYgPT0gZHZiZG14ZmlsdGVyKSB7CiAJCWR2YmRteGZlZWQtPmZpbHRlciA9IGR2YmRteGZpbHRlci0+bmV4dDsKIAl9IGVsc2UgewotCQl3aGlsZShmLT5uZXh0ICE9IGR2YmRteGZpbHRlcikKKwkJd2hpbGUgKGYtPm5leHQgIT0gZHZiZG14ZmlsdGVyKQogCQkJZiA9IGYtPm5leHQ7CiAJCWYtPm5leHQgPSBmLT5uZXh0LT5uZXh0OwogCX0KQEAgLTEwMjAsMTAgKzk3NCwxMCBAQAogCQkJCQlzdHJ1Y3QgZG14X3NlY3Rpb25fZmVlZCAqKmZlZWQsCiAJCQkJCWRteF9zZWN0aW9uX2NiIGNhbGxiYWNrKQogewotCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRteCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopIGRlbXV4OworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRteCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopZGVtdXg7CiAJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmR2YmRteC0+bXV0ZXgpKQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmR2YmRteC0+bXV0ZXgpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKCEoZHZiZG14ZmVlZCA9IGR2Yl9kbXhfZmVlZF9hbGxvYyhkdmJkbXgpKSkgewpAQCAtMTA0MSw3ICs5OTUsNyBAQAogCWR2YmRteGZlZWQtPmZpbHRlciA9IE5VTEw7CiAJZHZiZG14ZmVlZC0+YnVmZmVyID0gTlVMTDsKIAotCSgqZmVlZCk9JmR2YmRteGZlZWQtPmZlZWQuc2VjOworCSgqZmVlZCkgPSAmZHZiZG14ZmVlZC0+ZmVlZC5zZWM7CiAJKCpmZWVkKS0+aXNfZmlsdGVyaW5nID0gMDsKIAkoKmZlZWQpLT5wYXJlbnQgPSBkZW11eDsKIAkoKmZlZWQpLT5wcml2ID0gTlVMTDsKQEAgLTEwNTksMjEgKzEwMTMsMjEgQEAKIHN0YXRpYyBpbnQgZHZiZG14X3JlbGVhc2Vfc2VjdGlvbl9mZWVkKHN0cnVjdCBkbXhfZGVtdXggKmRlbXV4LAogCQkJCSAgICAgICBzdHJ1Y3QgZG14X3NlY3Rpb25fZmVlZCAqZmVlZCkKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopIGZlZWQ7Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gKHN0cnVjdCBkdmJfZGVtdXggKikgZGVtdXg7CisJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKWZlZWQ7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gKHN0cnVjdCBkdmJfZGVtdXggKilkZW11eDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZkdmJkbXgtPm11dGV4KSkKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkdmJkbXgtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCWlmIChkdmJkbXhmZWVkLT5zdGF0ZT09RE1YX1NUQVRFX0ZSRUUpIHsKKwlpZiAoZHZiZG14ZmVlZC0+c3RhdGUgPT0gRE1YX1NUQVRFX0ZSRUUpIHsKIAkJdXAoJmR2YmRteC0+bXV0ZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAjaWZuZGVmIE5PQlVGUwogCXZmcmVlKGR2YmRteGZlZWQtPmJ1ZmZlcik7Ci0JZHZiZG14ZmVlZC0+YnVmZmVyPTA7CisJZHZiZG14ZmVlZC0+YnVmZmVyID0gTlVMTDsKICNlbmRpZgotCWR2YmRteGZlZWQtPnN0YXRlPURNWF9TVEFURV9GUkVFOworCWR2YmRteGZlZWQtPnN0YXRlID0gRE1YX1NUQVRFX0ZSRUU7CiAKIAlkdmJfZGVtdXhfZmVlZF9kZWwoZHZiZG14ZmVlZCk7CiAKQEAgLTEwODMsMTQgKzEwMzcsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBkdmJfZGVtdXgga2VybmVsIGRhdGEgQVBJIGNhbGxzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgaW50IGR2YmRteF9vcGVuKHN0cnVjdCBkbXhfZGVtdXggKmRlbXV4KQogewotCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKikgZGVtdXg7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKWRlbXV4OwogCiAJaWYgKGR2YmRlbXV4LT51c2VycyA+PSBNQVhfRFZCX0RFTVVYX1VTRVJTKQogCQlyZXR1cm4gLUVVU0VSUzsKQEAgLTEwOTksMTAgKzEwNTIsOSBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgZHZiZG14X2Nsb3NlKHN0cnVjdCBkbXhfZGVtdXggKmRlbXV4KQogewotCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKikgZGVtdXg7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKWRlbXV4OwogCiAJaWYgKGR2YmRlbXV4LT51c2VycyA9PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTExMTIsMTUgKzEwNjQsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IGR2YmRteF93cml0ZShzdHJ1Y3QgZG14X2RlbXV4ICpkZW11eCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXg9KHN0cnVjdCBkdmJfZGVtdXggKikgZGVtdXg7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKWRlbXV4OwogCiAJaWYgKCghZGVtdXgtPmZyb250ZW5kKSB8fCAoZGVtdXgtPmZyb250ZW5kLT5zb3VyY2UgIT0gRE1YX01FTU9SWV9GRSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmR2YmRlbXV4LT5tdXRleCkpCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZHZiZGVtdXgtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAlkdmJfZG14X3N3ZmlsdGVyKGR2YmRlbXV4LCBidWYsIGNvdW50KTsKIAl1cCgmZHZiZGVtdXgtPm11dGV4KTsKQEAgLTExMzAsMTAgKzEwODEsMTAgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLQotc3RhdGljIGludCBkdmJkbXhfYWRkX2Zyb250ZW5kKHN0cnVjdCBkbXhfZGVtdXggKmRlbXV4LCBzdHJ1Y3QgZG14X2Zyb250ZW5kICpmcm9udGVuZCkKK3N0YXRpYyBpbnQgZHZiZG14X2FkZF9mcm9udGVuZChzdHJ1Y3QgZG14X2RlbXV4ICpkZW11eCwKKwkJCSAgICAgICBzdHJ1Y3QgZG14X2Zyb250ZW5kICpmcm9udGVuZCkKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopIGRlbXV4OworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKilkZW11eDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmR2YmRlbXV4LT5mcm9udGVuZF9saXN0OwogCiAJbGlzdF9hZGQoJihmcm9udGVuZC0+Y29ubmVjdGl2aXR5X2xpc3QpLCBoZWFkKTsKQEAgLTExNDEsMTMgKzEwOTIsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IGR2YmRteF9yZW1vdmVfZnJvbnRlbmQoc3RydWN0IGRteF9kZW11eCAqZGVtdXgsIHN0cnVjdCBkbXhfZnJvbnRlbmQgKmZyb250ZW5kKQorc3RhdGljIGludCBkdmJkbXhfcmVtb3ZlX2Zyb250ZW5kKHN0cnVjdCBkbXhfZGVtdXggKmRlbXV4LAorCQkJCSAgc3RydWN0IGRteF9mcm9udGVuZCAqZnJvbnRlbmQpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKSBkZW11eDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopZGVtdXg7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbiwgKmhlYWQgPSAmZHZiZGVtdXgtPmZyb250ZW5kX2xpc3Q7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHBvcywgbiwgaGVhZCkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sIGhlYWQpIHsKIAkJaWYgKERNWF9GRV9FTlRSWShwb3MpID09IGZyb250ZW5kKSB7CiAJCQlsaXN0X2RlbChwb3MpOwogCQkJcmV0dXJuIDA7CkBAIC0xMTU3LDI1ICsxMTA4LDI1IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLQotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKiBkdmJkbXhfZ2V0X2Zyb250ZW5kcyhzdHJ1Y3QgZG14X2RlbXV4ICpkZW11eCkKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpkdmJkbXhfZ2V0X2Zyb250ZW5kcyhzdHJ1Y3QgZG14X2RlbXV4ICpkZW11eCkKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopIGRlbXV4OworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKilkZW11eDsKIAogCWlmIChsaXN0X2VtcHR5KCZkdmJkZW11eC0+ZnJvbnRlbmRfbGlzdCkpCiAJCXJldHVybiBOVUxMOworCiAJcmV0dXJuICZkdmJkZW11eC0+ZnJvbnRlbmRfbGlzdDsKIH0KIAotCi1zdGF0aWMgaW50IGR2YmRteF9jb25uZWN0X2Zyb250ZW5kKHN0cnVjdCBkbXhfZGVtdXggKmRlbXV4LCBzdHJ1Y3QgZG14X2Zyb250ZW5kICpmcm9udGVuZCkKK3N0YXRpYyBpbnQgZHZiZG14X2Nvbm5lY3RfZnJvbnRlbmQoc3RydWN0IGRteF9kZW11eCAqZGVtdXgsCisJCQkJICAgc3RydWN0IGRteF9mcm9udGVuZCAqZnJvbnRlbmQpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKSBkZW11eDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopZGVtdXg7CiAKIAlpZiAoZGVtdXgtPmZyb250ZW5kKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZkdmJkZW11eC0+bXV0ZXgpKQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmR2YmRlbXV4LT5tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlkZW11eC0+ZnJvbnRlbmQgPSBmcm9udGVuZDsKQEAgLTExODMsMTIgKzExMzQsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IGR2YmRteF9kaXNjb25uZWN0X2Zyb250ZW5kKHN0cnVjdCBkbXhfZGVtdXggKmRlbXV4KQogewotCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKikgZGVtdXg7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKWRlbXV4OwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmR2YmRlbXV4LT5tdXRleCkpCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZHZiZGVtdXgtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWRlbXV4LT5mcm9udGVuZCA9IE5VTEw7CkBAIC0xMTk2LDQ0ICsxMTQ2LDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBkdmJkbXhfZ2V0X3Blc19waWRzKHN0cnVjdCBkbXhfZGVtdXggKmRlbXV4LCB1MTYgKnBpZHMpCitzdGF0aWMgaW50IGR2YmRteF9nZXRfcGVzX3BpZHMoc3RydWN0IGRteF9kZW11eCAqZGVtdXgsIHUxNiAqIHBpZHMpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKSBkZW11eDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopZGVtdXg7CiAKLQltZW1jcHkocGlkcywgZHZiZGVtdXgtPnBpZHMsIDUqc2l6ZW9mKHUxNikpOworCW1lbWNweShwaWRzLCBkdmJkZW11eC0+cGlkcywgNSAqIHNpemVvZih1MTYpKTsKIAlyZXR1cm4gMDsKIH0KIAotCiBpbnQgZHZiX2RteF9pbml0KHN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4KQogewotCWludCBpLCBlcnI7CisJaW50IGk7CiAJc3RydWN0IGRteF9kZW11eCAqZG14ID0gJmR2YmRlbXV4LT5kbXg7CiAKIAlkdmJkZW11eC0+dXNlcnMgPSAwOwotCWR2YmRlbXV4LT5maWx0ZXIgPSB2bWFsbG9jKGR2YmRlbXV4LT5maWx0ZXJudW0qc2l6ZW9mKHN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyKSk7CisJZHZiZGVtdXgtPmZpbHRlciA9IHZtYWxsb2MoZHZiZGVtdXgtPmZpbHRlcm51bSAqIHNpemVvZihzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlcikpOwogCiAJaWYgKCFkdmJkZW11eC0+ZmlsdGVyKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWR2YmRlbXV4LT5mZWVkID0gdm1hbGxvYyhkdmJkZW11eC0+ZmVlZG51bSpzaXplb2Yoc3RydWN0IGR2Yl9kZW11eF9mZWVkKSk7CisJZHZiZGVtdXgtPmZlZWQgPSB2bWFsbG9jKGR2YmRlbXV4LT5mZWVkbnVtICogc2l6ZW9mKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCkpOwogCWlmICghZHZiZGVtdXgtPmZlZWQpIHsKIAkJdmZyZWUoZHZiZGVtdXgtPmZpbHRlcik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlmb3IgKGk9MDsgaTxkdmJkZW11eC0+ZmlsdGVybnVtOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgZHZiZGVtdXgtPmZpbHRlcm51bTsgaSsrKSB7CiAJCWR2YmRlbXV4LT5maWx0ZXJbaV0uc3RhdGUgPSBETVhfU1RBVEVfRlJFRTsKIAkJZHZiZGVtdXgtPmZpbHRlcltpXS5pbmRleCA9IGk7CiAJfQotCWZvciAoaT0wOyBpPGR2YmRlbXV4LT5mZWVkbnVtOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgZHZiZGVtdXgtPmZlZWRudW07IGkrKykgewogCQlkdmJkZW11eC0+ZmVlZFtpXS5zdGF0ZSA9IERNWF9TVEFURV9GUkVFOwogCQlkdmJkZW11eC0+ZmVlZFtpXS5pbmRleCA9IGk7CiAJfQotCWR2YmRlbXV4LT5mcm9udGVuZF9saXN0Lm5leHQ9Ci0JICBkdmJkZW11eC0+ZnJvbnRlbmRfbGlzdC5wcmV2PQotCSAgICAmZHZiZGVtdXgtPmZyb250ZW5kX2xpc3Q7Ci0JZm9yIChpPTA7IGk8RE1YX1RTX1BFU19PVEhFUjsgaSsrKSB7CisKKwlJTklUX0xJU1RfSEVBRCgmZHZiZGVtdXgtPmZyb250ZW5kX2xpc3QpOworCisJZm9yIChpID0gMDsgaSA8IERNWF9UU19QRVNfT1RIRVI7IGkrKykgewogCQlkdmJkZW11eC0+cGVzZmlsdGVyW2ldID0gTlVMTDsKIAkJZHZiZGVtdXgtPnBpZHNbaV0gPSAweGZmZmY7CiAJfQpAQCAtMTI0NywxMiArMTE5NSwxMSBAQAogCWlmICghZHZiZGVtdXgtPmNoZWNrX2NyYzMyKQogCQlkdmJkZW11eC0+Y2hlY2tfY3JjMzIgPSBkdmJfZG14X2NyYzMyOwogCi0JIGlmICghZHZiZGVtdXgtPm1lbWNvcHkpCi0JCSBkdmJkZW11eC0+bWVtY29weSA9IGR2Yl9kbXhfbWVtY29weTsKKwlpZiAoIWR2YmRlbXV4LT5tZW1jb3B5KQorCQlkdmJkZW11eC0+bWVtY29weSA9IGR2Yl9kbXhfbWVtY29weTsKIAogCWRteC0+ZnJvbnRlbmQgPSBOVUxMOwotCWRteC0+cmVnX2xpc3QucHJldiA9IGRteC0+cmVnX2xpc3QubmV4dCA9ICZkbXgtPnJlZ19saXN0OwotCWRteC0+cHJpdiA9ICh2b2lkICopIGR2YmRlbXV4OworCWRteC0+cHJpdiA9IGR2YmRlbXV4OwogCWRteC0+b3BlbiA9IGR2YmRteF9vcGVuOwogCWRteC0+Y2xvc2UgPSBkdmJkbXhfY2xvc2U7CiAJZG14LT53cml0ZSA9IGR2YmRteF93cml0ZTsKQEAgLTEyNjEsOSArMTIwOCw2IEBACiAJZG14LT5hbGxvY2F0ZV9zZWN0aW9uX2ZlZWQgPSBkdmJkbXhfYWxsb2NhdGVfc2VjdGlvbl9mZWVkOwogCWRteC0+cmVsZWFzZV9zZWN0aW9uX2ZlZWQgPSBkdmJkbXhfcmVsZWFzZV9zZWN0aW9uX2ZlZWQ7CiAKLQlkbXgtPmRlc2NyYW1ibGVfbWFjX2FkZHJlc3MgPSBOVUxMOwotCWRteC0+ZGVzY3JhbWJsZV9zZWN0aW9uX3BheWxvYWQgPSBOVUxMOwotCiAJZG14LT5hZGRfZnJvbnRlbmQgPSBkdmJkbXhfYWRkX2Zyb250ZW5kOwogCWRteC0+cmVtb3ZlX2Zyb250ZW5kID0gZHZiZG14X3JlbW92ZV9mcm9udGVuZDsKIAlkbXgtPmdldF9mcm9udGVuZHMgPSBkdmJkbXhfZ2V0X2Zyb250ZW5kczsKQEAgLTEyNzQsMjEgKzEyMTgsMTUgQEAKIAlzZW1hX2luaXQoJmR2YmRlbXV4LT5tdXRleCwgMSk7CiAJc3Bpbl9sb2NrX2luaXQoJmR2YmRlbXV4LT5sb2NrKTsKIAotCWlmICgoZXJyID0gZG14X3JlZ2lzdGVyX2RlbXV4KGRteCkpIDwgMCkKLQkJcmV0dXJuIGVycjsKLQogCXJldHVybiAwOwogfQorCiBFWFBPUlRfU1lNQk9MKGR2Yl9kbXhfaW5pdCk7CiAKLQotaW50IGR2Yl9kbXhfcmVsZWFzZShzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCkKK3ZvaWQgZHZiX2RteF9yZWxlYXNlKHN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4KQogewotCXN0cnVjdCBkbXhfZGVtdXggKmRteCA9ICZkdmJkZW11eC0+ZG14OwotCi0JZG14X3VucmVnaXN0ZXJfZGVtdXgoZG14KTsKIAl2ZnJlZShkdmJkZW11eC0+ZmlsdGVyKTsKIAl2ZnJlZShkdmJkZW11eC0+ZmVlZCk7Ci0JcmV0dXJuIDA7CiB9CisKIEVYUE9SVF9TWU1CT0woZHZiX2RteF9yZWxlYXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmgKaW5kZXggYzA5YmViMy4uMGNjODg4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmgKQEAgLTIwLDcgKzIwLDYgQEAKICAqCiAgKi8KIAotCiAjaWZuZGVmIF9EVkJfREVNVVhfSF8KICNkZWZpbmUgX0RWQl9ERU1VWF9IXwogCkBAIC00NCwxMDMgKzQzLDk4IEBACiAjZGVmaW5lIERWQl9ERU1VWF9NQVNLX01BWCAxOAogCiBzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciB7Ci0gICAgICAgIHN0cnVjdCBkbXhfc2VjdGlvbl9maWx0ZXIgZmlsdGVyOwotICAgICAgICB1OCBtYXNrYW5kbW9kZSAgICBbRE1YX01BWF9GSUxURVJfU0laRV07Ci0gICAgICAgIHU4IG1hc2thbmRub3Rtb2RlIFtETVhfTUFYX0ZJTFRFUl9TSVpFXTsKKwlzdHJ1Y3QgZG14X3NlY3Rpb25fZmlsdGVyIGZpbHRlcjsKKwl1OCBtYXNrYW5kbW9kZVtETVhfTUFYX0ZJTFRFUl9TSVpFXTsKKwl1OCBtYXNrYW5kbm90bW9kZVtETVhfTUFYX0ZJTFRFUl9TSVpFXTsKIAlpbnQgZG9uZXE7CiAKLSAgICAgICAgc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKm5leHQ7Ci0gICAgICAgIHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZDsKLSAgICAgICAgaW50IGluZGV4OwotICAgICAgICBpbnQgc3RhdGU7Ci0gICAgICAgIGludCB0eXBlOwotCWludCBwZXN0bzsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciAqbmV4dDsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQ7CisJaW50IGluZGV4OworCWludCBzdGF0ZTsKKwlpbnQgdHlwZTsKIAotICAgICAgICB1MTYgaGFuZGxlOwotICAgICAgICB1MTYgaHdfaGFuZGxlOwotICAgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKLQlpbnQgdHNfc3RhdGU7CisJdTE2IGh3X2hhbmRsZTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIH07CiAKLQogI2RlZmluZSBETVhfRkVFRF9FTlRSWShwb3MpIGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQsIGxpc3RfaGVhZCkKIAogc3RydWN0IGR2Yl9kZW11eF9mZWVkIHsKLSAgICAgICAgdW5pb24gewotCSAgICAgICAgc3RydWN0IGRteF90c19mZWVkIHRzOwotCSAgICAgICAgc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQgc2VjOworCXVuaW9uIHsKKwkJc3RydWN0IGRteF90c19mZWVkIHRzOworCQlzdHJ1Y3QgZG14X3NlY3Rpb25fZmVlZCBzZWM7CiAJfSBmZWVkOwogCi0gICAgICAgIHVuaW9uIHsKLQkgICAgICAgIGRteF90c19jYiB0czsKLQkgICAgICAgIGRteF9zZWN0aW9uX2NiIHNlYzsKKwl1bmlvbiB7CisJCWRteF90c19jYiB0czsKKwkJZG14X3NlY3Rpb25fY2Igc2VjOwogCX0gY2I7CiAKLSAgICAgICAgc3RydWN0IGR2Yl9kZW11eCAqZGVtdXg7CisJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXg7CiAJdm9pZCAqcHJpdjsKLSAgICAgICAgaW50IHR5cGU7Ci0gICAgICAgIGludCBzdGF0ZTsKLSAgICAgICAgdTE2IHBpZDsKLSAgICAgICAgdTggKmJ1ZmZlcjsKLSAgICAgICAgaW50IGJ1ZmZlcl9zaXplOwotICAgICAgICBpbnQgZGVzY3JhbWJsZTsKKwlpbnQgdHlwZTsKKwlpbnQgc3RhdGU7CisJdTE2IHBpZDsKKwl1OCAqYnVmZmVyOworCWludCBidWZmZXJfc2l6ZTsKIAotICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZW91dDsKLSAgICAgICAgc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKmZpbHRlcjsKLSAgICAgICAgaW50IGNiX2xlbmd0aDsKKwlzdHJ1Y3QgdGltZXNwZWMgdGltZW91dDsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciAqZmlsdGVyOwogCi0gICAgICAgIGludCB0c190eXBlOwotICAgICAgICBlbnVtIGRteF90c19wZXMgcGVzX3R5cGU7CisJaW50IHRzX3R5cGU7CisJZW51bSBkbXhfdHNfcGVzIHBlc190eXBlOwogCi0gICAgICAgIGludCBjYzsKLSAgICAgICAgaW50IHB1c2lfc2VlbjsgLyogcHJldmVudHMgZmVlZGluZyBvZiBnYXJiYWdlIGZyb20gcHJldmlvdXMgc2VjdGlvbiAqLworCWludCBjYzsKKwlpbnQgcHVzaV9zZWVuOwkJLyogcHJldmVudHMgZmVlZGluZyBvZiBnYXJiYWdlIGZyb20gcHJldmlvdXMgc2VjdGlvbiAqLwogCi0gICAgICAgIHUxNiBwZXNsZW47CisJdTE2IHBlc2xlbjsKIAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9oZWFkOwotCQlpbnQgaW5kZXg7IC8qIGEgdW5pcXVlIGluZGV4IGZvciBlYWNoIGZlZWQgKGNhbiBiZSB1c2VkIGFzIGhhcmR3YXJlIHBpZCBmaWx0ZXIgaW5kZXgpICovCisJdW5zaWduZWQgaW50IGluZGV4OwkvKiBhIHVuaXF1ZSBpbmRleCBmb3IgZWFjaCBmZWVkIChjYW4gYmUgdXNlZCBhcyBoYXJkd2FyZSBwaWQgZmlsdGVyIGluZGV4KSAqLwogfTsKIAogc3RydWN0IGR2Yl9kZW11eCB7Ci0gICAgICAgIHN0cnVjdCBkbXhfZGVtdXggZG14OwotICAgICAgICB2b2lkICpwcml2OwotICAgICAgICBpbnQgZmlsdGVybnVtOwotICAgICAgICBpbnQgZmVlZG51bTsKLSAgICAgICAgaW50ICgqc3RhcnRfZmVlZCkgKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCk7Ci0gICAgICAgIGludCAoKnN0b3BfZmVlZCkgKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCk7Ci0gICAgICAgIGludCAoKndyaXRlX3RvX2RlY29kZXIpIChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQsCisJc3RydWN0IGRteF9kZW11eCBkbXg7CisJdm9pZCAqcHJpdjsKKwlpbnQgZmlsdGVybnVtOworCWludCBmZWVkbnVtOworCWludCAoKnN0YXJ0X2ZlZWQpKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCk7CisJaW50ICgqc3RvcF9mZWVkKShzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpOworCWludCAoKndyaXRlX3RvX2RlY29kZXIpKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCwKIAkJCQkgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbik7Ci0JdTMyICgqY2hlY2tfY3JjMzIpIChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQsCisJdTMyICgqY2hlY2tfY3JjMzIpKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCwKIAkJCSAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKTsKLQl2b2lkICgqbWVtY29weSkgKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCwgdTggKmRzdCwKKwl2b2lkICgqbWVtY29weSkoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLCB1OCAqZHN0LAogCQkJIGNvbnN0IHU4ICpzcmMsIHNpemVfdCBsZW4pOwogCi0gICAgICAgIGludCB1c2VyczsKKwlpbnQgdXNlcnM7CiAjZGVmaW5lIE1BWF9EVkJfREVNVVhfVVNFUlMgMTAKLSAgICAgICAgc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKmZpbHRlcjsKLSAgICAgICAgc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkOworCXN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyICpmaWx0ZXI7CisJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkOwogCi0gICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgZnJvbnRlbmRfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyb250ZW5kX2xpc3Q7CiAKLSAgICAgICAgc3RydWN0IGR2Yl9kZW11eF9mZWVkICpwZXNmaWx0ZXJbRE1YX1RTX1BFU19PVEhFUl07Ci0gICAgICAgIHUxNiBwaWRzW0RNWF9UU19QRVNfT1RIRVJdOwotICAgICAgICBpbnQgcGxheWluZzsKLSAgICAgICAgaW50IHJlY29yZGluZzsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKnBlc2ZpbHRlcltETVhfVFNfUEVTX09USEVSXTsKKwl1MTYgcGlkc1tETVhfVFNfUEVTX09USEVSXTsKKwlpbnQgcGxheWluZzsKKwlpbnQgcmVjb3JkaW5nOwogCiAjZGVmaW5lIERNWF9NQVhfUElEIDB4MjAwMAogCXN0cnVjdCBsaXN0X2hlYWQgZmVlZF9saXN0OwotICAgICAgICB1OCB0c2J1ZlsyMDRdOwotICAgICAgICBpbnQgdHNidWZwOworCXU4IHRzYnVmWzIwNF07CisJaW50IHRzYnVmcDsKIAogCXN0cnVjdCBzZW1hcGhvcmUgbXV0ZXg7CiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKIAotCiBpbnQgZHZiX2RteF9pbml0KHN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4KTsKLWludCBkdmJfZG14X3JlbGVhc2Uoc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXgpOwotdm9pZCBkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMoc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14LCBjb25zdCB1OCAqYnVmLCBzaXplX3QgY291bnQpOwordm9pZCBkdmJfZG14X3JlbGVhc2Uoc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXgpOwordm9pZCBkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMoc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14LCBjb25zdCB1OCAqYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50KTsKIHZvaWQgZHZiX2RteF9zd2ZpbHRlcihzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLXZvaWQgZHZiX2RteF9zd2ZpbHRlcl8yMDQoc3RydWN0IGR2Yl9kZW11eCAqZGVtdXgsIGNvbnN0IHU4ICpidWYsIHNpemVfdCBjb3VudCk7Cit2b2lkIGR2Yl9kbXhfc3dmaWx0ZXJfMjA0KHN0cnVjdCBkdmJfZGVtdXggKmRlbXV4LCBjb25zdCB1OCAqYnVmLAorCQkJICBzaXplX3QgY291bnQpOwogCiAjZW5kaWYgLyogX0RWQl9ERU1VWF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCmluZGV4IDZhOTY4YzMuLjg3OTM1NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKQEAgLTYyLDcgKzYyLDYgQEAKICNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSAiZHZiX2RlbXV4LmgiCiAjaW5jbHVkZSAiZHZiX25ldC5oIgpAQCAtMTcxLDExICsxNzAsNyBAQAogCiAJc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKIAlza2JfcHVsbChza2IsZGV2LT5oYXJkX2hlYWRlcl9sZW4pOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsOCkKLQlldGggPSBza2ItPm1hYy5ldGhlcm5ldDsKLSNlbHNlCiAJZXRoID0gZXRoX2hkcihza2IpOwotI2VuZGlmCiAKIAlpZiAoKmV0aC0+aF9kZXN0ICYgMSkgewogCQlpZihtZW1jbXAoZXRoLT5oX2Rlc3QsZGV2LT5icm9hZGNhc3QsIEVUSF9BTEVOKT09MCkKQEAgLTkwOCw3ICs5MDMsNyBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCi0JCXJldCA9IHByaXYtPnNlY2ZlZWQtPnNldChwcml2LT5zZWNmZWVkLCBwcml2LT5waWQsIDMyNzY4LCAwLCAxKTsKKwkJcmV0ID0gcHJpdi0+c2VjZmVlZC0+c2V0KHByaXYtPnNlY2ZlZWQsIHByaXYtPnBpZCwgMzI3NjgsIDEpOwogCiAJCWlmIChyZXQ8MCkgewogCQkJcHJpbnRrKCIlczogY291bGQgbm90IHNldCBzZWN0aW9uIGZlZWRcbiIsIGRldi0+bmFtZSk7CkBAIC05NjAsOSArOTU1LDcgQEAKIAkJcHJpdi0+dHNmZWVkLT5wcml2ID0gKHZvaWQgKilkZXY7CiAJCXJldCA9IHByaXYtPnRzZmVlZC0+c2V0KHByaXYtPnRzZmVlZCwgcHJpdi0+cGlkLAogCQkJCQlUU19QQUNLRVQsIERNWF9UU19QRVNfT1RIRVIsCi0JCQkJCTE4OCAqIDEwMCwgLyogbnIuIG9mIGJ5dGVzIGRlbGl2ZXJlZCBwZXIgY2FsbGJhY2sgKi8KIAkJCQkJMzI3NjgsICAgICAvKiBjaXJjdWxhciBidWZmZXIgc2l6ZSAqLwotCQkJCQkwLCAgICAgICAgIC8qIGRlc2NyYW1ibGUgKi8KIAkJCQkJdGltZW91dCk7CiAKIAkJaWYgKHJldCA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwppbmRleCA2MTJlNWIwLi41NGUyYjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCkBAIC05MywxMyArOTMsMzAgQEAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgTmVidWxhIEVsZWN0cm9uaWNzIHVEaWdpdFYgVVNCMi4wIERWQi1UIHJlY2VpdmVyLgogCiBjb25maWcgRFZCX1VTQl9WUDcwNDUKLQl0cmlzdGF0ZSAiVHdpbmhhbkRUViBBbHBoYS9NYWdpY0JveElJIGFuZCBETlRWIHRpbnlVU0IyIERWQi1UIFVTQjIuMCBzdXBwb3J0IgorCXRyaXN0YXRlICJUd2luaGFuRFRWIEFscGhhL01hZ2ljQm94SUksIEROVFYgdGlueVVTQjIsIEJlZXRsZSBVU0IyLjAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIERWQl9VU0IKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlCisKIAkgICAgVHdpbmhhbkRUViBBbHBoYSAoc3RpY2spIChWUC03MDQ1KSwKLQkJVHdpbmhhbkRUViBNYWdpY0JveCBJSSAoVlAtNzA0NikgYW5kCi0JCURpZ2l0YWxOb3cgVGlueVVTQiAyIERWQi10IERWQi1UIFVTQjIuMCByZWNlaXZlcnMuCisJCVR3aW5oYW5EVFYgTWFnaWNCb3ggSUkgKFZQLTcwNDYpLAorCQlEaWdpdGFsTm93IFRpbnlVU0IgMiBEVkItdCwKKwkJRGlnaXRhbFJpc2UgVVNCIDIuMCBUZXIgKEJlZXRsZSkgYW5kCisJCVRZUEhPT04gRFZCLVQgVVNCIERSSVZFCisKKwkgIERWQi1UIFVTQjIuMCByZWNlaXZlcnMuCisKK2NvbmZpZyBEVkJfVVNCX1ZQNzAyWAorCXRyaXN0YXRlICJUd2luaGFuRFRWIFN0YXJCb3ggYW5kIGNsb25lcyBEVkItUyBVU0IyLjAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlCisKKwkgICAgVHdpbmhhbkRUViBTdGFyQm94LAorCQlEaWdpdGFsUmlzZSBVU0IgU3RhcmJveCBhbmQKKwkJVFlQSE9PTiBEVkItUyBVU0IgMi4wIEJPWAorCisJICBEVkItUyBVU0IyLjAgcmVjZWl2ZXJzLgogCiBjb25maWcgRFZCX1VTQl9OT1ZBX1RfVVNCMgogCXRyaXN0YXRlICJIYXVwcGF1Z2UgV2luVFYtTk9WQS1UIHVzYjIgRFZCLVQgVVNCMi4wIHN1cHBvcnQiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZQppbmRleCA3NDZkODdlLi4yZGM5YWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKQEAgLTQsNiArNCw5IEBACiBkdmItdXNiLXZwNzA0NS1vYmpzID0gdnA3MDQ1Lm8gdnA3MDQ1LWZlLm8KIG9iai0kKENPTkZJR19EVkJfVVNCX1ZQNzA0NSkgKz0gZHZiLXVzYi12cDcwNDUubwogCitkdmItdXNiLXZwNzAyeC1vYmpzID0gdnA3MDJ4Lm8gdnA3MDJ4LWZlLm8KK29iai0kKENPTkZJR19EVkJfVVNCX1ZQNzAyWCkgKz0gZHZiLXVzYi12cDcwMngubworCiBkdmItdXNiLWR0dDIwMHUtb2JqcyA9IGR0dDIwMHUubyBkdHQyMDB1LWZlLm8KIG9iai0kKENPTkZJR19EVkJfVVNCX0RUVDIwMFUpICs9IGR2Yi11c2ItZHR0MjAwdS5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKaW5kZXggZjJmY2MyZi4uZTU1MzIyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKQEAgLTkwLDcgKzkwLDcgQEAKIHN0YXRpYyBpbnQgYTgwMF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewotCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmE4MDBfcHJvcGVydGllcyxUSElTX01PRFVMRSk7CisJcmV0dXJuIGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmYTgwMF9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpOwogfQogCiAvKiBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgSUQgdGFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwppbmRleCBjM2UxYjY2Li4zZmUzODNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCkBAIC00OCwzNSArNDgsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogSTJDICovCi1zdGF0aWMgdm9pZCBjeHVzYl9zZXRfaTJjX3BhdGgoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBlbnVtIGN4dXNiX2kyY19wYXRoZXMgcGF0aCkKKy8qIEdQSU8gKi8KK3N0YXRpYyB2b2lkIGN4dXNiX2dwaW9fdHVuZXIoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCiB7CiAJc3RydWN0IGN4dXNiX3N0YXRlICpzdCA9IGQtPnByaXY7CiAJdTggb1syXSxpOwogCi0JaWYgKHBhdGggPT0gc3QtPmN1cl9pMmNfcGF0aCkKKwlpZiAoc3QtPmdwaW9fd3JpdGVfc3RhdGVbR1BJT19UVU5FUl0gPT0gb25vZmYpCiAJCXJldHVybjsKIAotCW9bMF0gPSBJT0NUTF9TRVRfSTJDX1BBVEg7Ci0Jc3dpdGNoIChwYXRoKSB7Ci0JCWNhc2UgUEFUSF9DWDIyNzAyOgotCQkJb1sxXSA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBQQVRIX1RVTkVSX09USEVSOgotCQkJb1sxXSA9IDE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWVycigidW5rb3duIGkyYyBwYXRoIik7Ci0JCQlyZXR1cm47Ci0JfQotCWN4dXNiX2N0cmxfbXNnKGQsQ01EX0lPQ1RMLG8sMiwmaSwxKTsKKwlvWzBdID0gR1BJT19UVU5FUjsKKwlvWzFdID0gb25vZmY7CisJY3h1c2JfY3RybF9tc2coZCxDTURfR1BJT19XUklURSxvLDIsJmksMSk7CiAKIAlpZiAoaSAhPSAweDAxKQotCQlkZWJfaW5mbygiaTJjX3BhdGggc2V0dGluZyBmYWlsZWQuXG4iKTsKKwkJZGViX2luZm8oImdwaW9fd3JpdGUgZmFpbGVkLlxuIik7CiAKLQlzdC0+Y3VyX2kyY19wYXRoID0gcGF0aDsKKwlzdC0+Z3Bpb193cml0ZV9zdGF0ZVtHUElPX1RVTkVSXSA9IG9ub2ZmOwogfQogCisvKiBJMkMgKi8KIHN0YXRpYyBpbnQgY3h1c2JfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLHN0cnVjdCBpMmNfbXNnIG1zZ1tdLGludCBudW0pCiB7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKQEAgLTkyLDEwICs4MywxMCBAQAogCiAJCXN3aXRjaCAobXNnW2ldLmFkZHIpIHsKIAkJCWNhc2UgMHg2MzoKLQkJCQljeHVzYl9zZXRfaTJjX3BhdGgoZCxQQVRIX0NYMjI3MDIpOworCQkJCWN4dXNiX2dwaW9fdHVuZXIoZCwwKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJY3h1c2Jfc2V0X2kyY19wYXRoKGQsUEFUSF9UVU5FUl9PVEhFUik7CisJCQkJY3h1c2JfZ3Bpb190dW5lcihkLDEpOwogCQkJCWJyZWFrOwogCQl9CiAKQEAgLTE0MSwyNCArMTMyLDI2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBjeHVzYl9pMmNfYWxnbyA9IHsKLQkubmFtZSAgICAgICAgICA9ICJDb25leGFudCBVU0IgSTJDIGFsZ29yaXRobSIsCi0JLmlkICAgICAgICAgICAgPSBJMkNfQUxHT19CSVQsCiAJLm1hc3Rlcl94ZmVyICAgPSBjeHVzYl9pMmNfeGZlciwKIAkuZnVuY3Rpb25hbGl0eSA9IGN4dXNiX2kyY19mdW5jLAogfTsKIAogc3RhdGljIGludCBjeHVzYl9wb3dlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQogewotCXJldHVybiAwOworCXU4IGIgPSAwOworCWlmIChvbm9mZikKKwkJcmV0dXJuIGN4dXNiX2N0cmxfbXNnKGQsIENNRF9QT1dFUl9PTiwgJmIsIDEsIE5VTEwsIDApOworCWVsc2UKKwkJcmV0dXJuIGN4dXNiX2N0cmxfbXNnKGQsIENNRF9QT1dFUl9PRkYsICZiLCAxLCBOVUxMLCAwKTsKIH0KIAogc3RhdGljIGludCBjeHVzYl9zdHJlYW1pbmdfY3RybChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBvbm9mZikKIHsKIAl1OCBidWZbMl0gPSB7IDB4MDMsIDB4MDAgfTsKIAlpZiAob25vZmYpCi0JCWN4dXNiX2N0cmxfbXNnKGQsMHgzNiwgYnVmLCAyLCBOVUxMLCAwKTsKKwkJY3h1c2JfY3RybF9tc2coZCxDTURfU1RSRUFNSU5HX09OLCBidWYsIDIsIE5VTEwsIDApOwogCWVsc2UKLQkJY3h1c2JfY3RybF9tc2coZCwweDM3LCBOVUxMLCAwLCBOVUxMLCAwKTsKKwkJY3h1c2JfY3RybF9tc2coZCxDTURfU1RSRUFNSU5HX09GRiwgTlVMTCwgMCwgTlVMTCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4NCwyMiArMTc3LDExIEBACiAKIHN0YXRpYyBpbnQgY3h1c2JfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKLQl1OCBidWZbMl0gPSB7IDB4MDMsIDB4MDAgfTsKLQl1OCBiID0gMDsKLQotCWlmICh1c2Jfc2V0X2ludGVyZmFjZShkLT51ZGV2LDAsMCkgPCAwKQotCQllcnIoInNldCBpbnRlcmZhY2UgdG8gYWx0cz0wIGZhaWxlZCIpOwotCi0JY3h1c2JfY3RybF9tc2coZCwweGRlLCZiLDAsTlVMTCwwKTsKLQljeHVzYl9zZXRfaTJjX3BhdGgoZCxQQVRIX1RVTkVSX09USEVSKTsKLQljeHVzYl9jdHJsX21zZyhkLENNRF9QT1dFUl9PRkYsIE5VTEwsIDAsICZiLCAxKTsKLQorCXU4IGI7CiAJaWYgKHVzYl9zZXRfaW50ZXJmYWNlKGQtPnVkZXYsMCw2KSA8IDApCiAJCWVycigic2V0IGludGVyZmFjZSBmYWlsZWQiKTsKIAotCWN4dXNiX2N0cmxfbXNnKGQsMHgzNiwgYnVmLCAyLCBOVUxMLCAwKTsKLQljeHVzYl9zZXRfaTJjX3BhdGgoZCxQQVRIX0NYMjI3MDIpOwotCWN4dXNiX2N0cmxfbXNnKGQsQ01EX1BPV0VSX09OLCBOVUxMLCAwLCAmYiwgMSk7CisJY3h1c2JfY3RybF9tc2coZCxDTURfRElHSVRBTCwgTlVMTCwgMCwgJmIsIDEpOwogCiAJaWYgKChkLT5mZSA9IGN4MjI3MDJfYXR0YWNoKCZjeHVzYl9jeDIyNzAyX2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCkKIAkJcmV0dXJuIDA7CkBAIC0yMTMsNyArMTk1LDcgQEAKIHN0YXRpYyBpbnQgY3h1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZjeHVzYl9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZjeHVzYl9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpOwogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgY3h1c2JfdGFibGUgW10gPSB7CkBAIC0yMzksMTQgKzIyMSwxMiBAQAogCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCiAJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwogCS51cmIgPSB7Ci0JCS50eXBlID0gRFZCX1VTQl9JU09DLAorCQkudHlwZSA9IERWQl9VU0JfQlVMSywKIAkJLmNvdW50ID0gNSwKIAkJLmVuZHBvaW50ID0gMHgwMiwKIAkJLnUgPSB7Ci0JCQkuaXNvYyA9IHsKLQkJCQkuZnJhbWVzcGVydXJiID0gMzIsCi0JCQkJLmZyYW1lc2l6ZSA9IDk0MCwKLQkJCQkuaW50ZXJ2YWwgPSA1LAorCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA4MTkyLAogCQkJfQogCQl9CiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuaAppbmRleCAxZDc5MDE2Li4xMzVjMmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5oCkBAIC0xLDMwICsxLDMxIEBACiAjaWZuZGVmIF9EVkJfVVNCX0NYVVNCX0hfCiAjZGVmaW5lIF9EVkJfVVNCX0NYVVNCX0hfCiAKLSNkZWZpbmUgRFZCX1VTQl9MT0dfUFJFRklYICJkaWdpdHYiCisjZGVmaW5lIERWQl9VU0JfTE9HX1BSRUZJWCAiY3h1c2IiCiAjaW5jbHVkZSAiZHZiLXVzYi5oIgogCiBleHRlcm4gaW50IGR2Yl91c2JfY3h1c2JfZGVidWc7CiAjZGVmaW5lIGRlYl9pbmZvKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2N4dXNiX2RlYnVnLDB4MDEsYXJncykKIAogLyogdXNiIGNvbW1hbmRzIC0gc29tZSBvZiBpdCBhcmUgZ3Vlc3NlcywgZG9uJ3QgaGF2ZSBhIHJlZmVyZW5jZSB5ZXQgKi8KLSNkZWZpbmUgQ01EX0kyQ19XUklURSAgICAweDA4Ci0jZGVmaW5lIENNRF9JMkNfUkVBRCAgICAgMHgwOQorI2RlZmluZSBDTURfSTJDX1dSSVRFICAgICAweDA4CisjZGVmaW5lIENNRF9JMkNfUkVBRCAgICAgIDB4MDkKIAotI2RlZmluZSBDTURfSU9DVEwgICAgICAgIDB4MGUKLSNkZWZpbmUgICAgSU9DVExfU0VUX0kyQ19QQVRIIDB4MDIKKyNkZWZpbmUgQ01EX0dQSU9fUkVBRCAgICAgMHgwZAorI2RlZmluZSBDTURfR1BJT19XUklURSAgICAweDBlCisjZGVmaW5lICAgICBHUElPX1RVTkVSICAgICAgICAgMHgwMgogCi0jZGVmaW5lIENNRF9QT1dFUl9PRkYgICAgMHg1MAotI2RlZmluZSBDTURfUE9XRVJfT04gICAgIDB4NTEKKyNkZWZpbmUgQ01EX1BPV0VSX09GRiAgICAgMHhkYworI2RlZmluZSBDTURfUE9XRVJfT04gICAgICAweGRlCiAKLWVudW0gY3h1c2JfaTJjX3BhdGhlcyB7Ci0JUEFUSF9VTkRFRiAgICAgICA9IDB4MDAsCi0JUEFUSF9DWDIyNzAyICAgICA9IDB4MDEsCi0JUEFUSF9UVU5FUl9PVEhFUiA9IDB4MDIsCi19OworI2RlZmluZSBDTURfU1RSRUFNSU5HX09OICAweDM2CisjZGVmaW5lIENNRF9TVFJFQU1JTkdfT0ZGIDB4MzcKKworI2RlZmluZSBDTURfQU5BTE9HICAgICAgICAweDUwCisjZGVmaW5lIENNRF9ESUdJVEFMICAgICAgIDB4NTEKIAogc3RydWN0IGN4dXNiX3N0YXRlIHsKLQllbnVtIGN4dXNiX2kyY19wYXRoZXMgY3VyX2kyY19wYXRoOworCXU4IGdwaW9fd3JpdGVfc3RhdGVbM107CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLWNvbW1vbi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItY29tbW9uLmMKaW5kZXggOWI5ZDZmOC4uMDBiOTQ2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItY29tbW9uLmMKQEAgLTE1Niw4ICsxNTYsNiBAQAogfQogCiBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBkaWJ1c2JfaTJjX2FsZ28gPSB7Ci0JLm5hbWUgICAgICAgICAgPSAiRGlCY29tIFVTQiBJMkMgYWxnb3JpdGhtIiwKLQkuaWQgICAgICAgICAgICA9IEkyQ19BTEdPX0JJVCwKIAkubWFzdGVyX3hmZXIgICA9IGRpYnVzYl9pMmNfeGZlciwKIAkuZnVuY3Rpb25hbGl0eSA9IGRpYnVzYl9pMmNfZnVuYywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYwppbmRleCA4MjhiNTE4Li4wMDU4NTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKQEAgLTg2LDkgKzg2LDkgQEAKIHN0YXRpYyBpbnQgZGlidXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7Ci0JaWYgKGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmZGlidXNiMV8xX3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpID09IDAgfHwKLQkJZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkaWJ1c2IxXzFfYW4yMjM1X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpID09IDAgfHwKLQkJZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkaWJ1c2IyXzBiX3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpID09IDApCisJaWYgKGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmZGlidXNiMV8xX3Byb3BlcnRpZXMsVEhJU19NT0RVTEUsTlVMTCkgPT0gMCB8fAorCQlkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmRpYnVzYjFfMV9hbjIyMzVfcHJvcGVydGllcyxUSElTX01PRFVMRSxOVUxMKSA9PSAwIHx8CisJCWR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmZGlidXNiMl8wYl9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpID09IDApCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMjYsMTAgKzEyNiwxMiBAQAogLyogMjUgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfS1lFLAkJCVVTQl9QSURfS1lFX0RWQl9UX0NPTEQpIH0sCiAvKiAyNiAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9LWUUsCQkJVVNCX1BJRF9LWUVfRFZCX1RfV0FSTSkgfSwKIAorLyogMjcgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfS1dPUkxELAkJVVNCX1BJRF9LV09STERfVlNUUkVBTV9DT0xEKSB9LAorCiAvLyAjZGVmaW5lIERWQl9VU0JfRElCVVNCX01CX0ZBVUxUWV9VU0JfSURzCiAKICNpZmRlZiBEVkJfVVNCX0RJQlVTQl9NQl9GQVVMVFlfVVNCX0lEcwotLyogMjcgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQU5DSE9SLAkJVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU5DSE9SX0NPTEQpIH0sCisvKiAyOCAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9BTkNIT1IsCQlVU0JfUElEX1VMVElNQV9UVkJPWF9BTkNIT1JfQ09MRCkgfSwKICNlbmRpZgogCQkJeyB9CQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKQEAgLTI2Miw3ICsyNjQsNyBAQAogCQl9LAogI2lmZGVmIERWQl9VU0JfRElCVVNCX01CX0ZBVUxUWV9VU0JfSURzCiAJCXsJIkFydGVjIFQxIFVTQjEuMSBUVkJPWCB3aXRoIEFOMjIzNSAoZmF1bHR5IFVTQiBJRHMpIiwKLQkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMjddLCBOVUxMIH0sCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzI4XSwgTlVMTCB9LAogCQkJeyBOVUxMIH0sCiAJCX0sCiAjZW5kaWYKQEAgLTMwNiwxMiArMzA4LDE2IEBACiAJCX0KIAl9LAogCi0JLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCS5udW1fZGV2aWNlX2Rlc2NzID0gMiwKIAkuZGV2aWNlcyA9IHsKLQkJewkiS1dvcmxkL0FEU1RlY2ggSW5zdGFudCBEVkItVCBVU0IgMi4wIiwKKwkJewkiS1dvcmxkL0FEU1RlY2ggSW5zdGFudCBEVkItVCBVU0IyLjAiLAogCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyM10sIE5VTEwgfSwKIAkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMjRdLCBOVUxMIH0sCiAJCX0sCisJCXsJIktXb3JsZCBYcGVydCBEVkItVCBVU0IyLjAiLAorCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyN10sIE5VTEwgfSwKKwkJCXsgTlVMTCB9CisJCX0sCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1jLmMKaW5kZXggZTlkYWM0My4uNmEwOTEyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYy5jCkBAIC0yMCw3ICsyMCw3IEBACiBzdGF0aWMgaW50IGRpYnVzYl9tY19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewotCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmRpYnVzYl9tY19wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkaWJ1c2JfbWNfcHJvcGVydGllcyxUSElTX01PRFVMRSxOVUxMKTsKIH0KIAogLyogZG8gbm90IGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIElEIHRhYmxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYwppbmRleCA5YTY3NmFmLi43NDU0NWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMKQEAgLTc3LDggKzc3LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGRpZ2l0dl9pMmNfYWxnbyA9IHsKLQkubmFtZSAgICAgICAgICA9ICJOZWJ1bGEgRGlnaVRWIFVTQiBJMkMgYWxnb3JpdGhtIiwKLQkuaWQgICAgICAgICAgICA9IEkyQ19BTEdPX0JJVCwKIAkubWFzdGVyX3hmZXIgICA9IGRpZ2l0dl9pMmNfeGZlciwKIAkuZnVuY3Rpb25hbGl0eSA9IGRpZ2l0dl9pMmNfZnVuYywKIH07CkBAIC0xMTMsMzEgKzExMSwyOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IG10MzUyX2NvbmZpZyBkaWdpdHZfbXQzNTJfY29uZmlnID0gewotCS5kZW1vZF9hZGRyZXNzID0gMHgwLCAvKiBpZ25vcmVkIGJ5IHRoZSBkaWdpdHYgYW55d2F5ICovCiAJLmRlbW9kX2luaXQgPSBkaWdpdHZfbXQzNTJfZGVtb2RfaW5pdCwKIAkucGxsX3NldCA9IGR2Yl91c2JfcGxsX3NldCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgbnh0NjAwMF9jb25maWcgZGlnaXR2X254dDYwMDBfY29uZmlnID0gewotCS5kZW1vZF9hZGRyZXNzID0gMHgwLCAvKiBpZ25vcmVkIGJ5IHRoZSBkaWdpdHYgYW55d2F5ICovCi0JLmNsb2NrX2ludmVyc2lvbiA9IDB4MCwKK3N0YXRpYyBpbnQgZGlnaXR2X254dDYwMDBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXApCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gZmUtPmR2Yi0+cHJpdjsKKwl1OCBiWzVdOworCWR2Yl91c2JfcGxsX3NldChmZSxmZXAsYik7CisJcmV0dXJuIGRpZ2l0dl9jdHJsX21zZyhkLFVTQl9XUklURV9UVU5FUiwwLCZiWzFdLDQsTlVMTCwwKTsKK30KIAotCS5wbGxfaW5pdCA9IE5VTEwsCi0JLnBsbF9zZXQgPSBOVUxMLAorc3RhdGljIHN0cnVjdCBueHQ2MDAwX2NvbmZpZyBkaWdpdHZfbnh0NjAwMF9jb25maWcgPSB7CisJLmNsb2NrX2ludmVyc2lvbiA9IDEsCisJLnBsbF9zZXQgPSBkaWdpdHZfbnh0NjAwMF9wbGxfc2V0LAogfTsKIAogc3RhdGljIGludCBkaWdpdHZfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKLQlpZiAoKGQtPmZlID0gbXQzNTJfYXR0YWNoKCZkaWdpdHZfbXQzNTJfY29uZmlnLCAmZC0+aTJjX2FkYXApKSAhPSBOVUxMKQorCWlmICgoZC0+ZmUgPSBtdDM1Ml9hdHRhY2goJmRpZ2l0dl9tdDM1Ml9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwgfHwKKwkJKGQtPmZlID0gbnh0NjAwMF9hdHRhY2goJmRpZ2l0dl9ueHQ2MDAwX2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0JaWYgKChkLT5mZSA9IG54dDYwMDBfYXR0YWNoKCZkaWdpdHZfbnh0NjAwMF9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKLQotCQl3YXJuKCJueHQ2MDAwIHN1cHBvcnQgaXMgbm90IGRvbmUgeWV0LCBpbiBmYWN0IHlvdSBhcmUgb25lIG9mIHRoZSBmaXJzdCAiCi0JCQkJInBlcnNvbiB3aG8gd2FudHMgdG8gdXNlIHRoaXMgZGV2aWNlIGluIExpbnV4LiBQbGVhc2UgcmVwb3J0IHRvICIKLQkJCQkibGludXgtZHZiQGxpbnV4dHYub3JnIik7Ci0KLQkJcmV0dXJuIDA7Ci0JfQogCXJldHVybiAtRUlPOwogfQogCkBAIC0xNzUsNyArMTcwLDE4IEBACiBzdGF0aWMgaW50IGRpZ2l0dl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewotCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmRpZ2l0dl9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKTsKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQ7CisJaW50IHJldDsKKwlpZiAoKHJldCA9IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmZGlnaXR2X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUsJmQpKSA9PSAwKSB7CisJCXU4IGJbNF0gPSB7IDAgfTsKKworCQliWzBdID0gMTsKKwkJZGlnaXR2X2N0cmxfbXNnKGQsVVNCX1dSSVRFX1JFTU9URV9UWVBFLDAsYiw0LE5VTEwsMCk7CisKKwkJYlswXSA9IDA7CisJCWRpZ2l0dl9jdHJsX21zZyhkLFVTQl9XUklURV9SRU1PVEUsMCxiLDQsTlVMTCwwKTsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRpZ2l0dl90YWJsZSBbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LWZlLmMKaW5kZXggYjAzMjUyMy4uMGE5NGVjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LWZlLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyBmZXA7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiB9OwogCiBzdGF0aWMgaW50IGR0dDIwMHVfZmVfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190ICpzdGF0KQpAQCAtMTYzLDggKzE2NCw5IEBACiAJZGViX2luZm8oImF0dGFjaGluZyBmcm9udGVuZCBkdHQyMDB1XG4iKTsKIAogCXN0YXRlLT5kID0gZDsKKwltZW1jcHkoJnN0YXRlLT5vcHMsJmR0dDIwMHVfZmVfb3BzLHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZkdHQyMDB1X2ZlX29wczsKKwlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAogCWdvdG8gc3VjY2VzczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKaW5kZXggNDdkYmE2ZS4uNWFhMTJlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKQEAgLTk4LDIwICs5OCwxOSBAQAogc3RhdGljIGludCBkdHQyMDB1X3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewotCWlmIChkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmR0dDIwMHVfcHJvcGVydGllcyxUSElTX01PRFVMRSkgPT0gMCB8fAotCQlkdmJfdXNiX2RldmljZV9pbml0KGludGYsJnd0MjIwdV9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKSA9PSAwKQorCWlmIChkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmR0dDIwMHVfcHJvcGVydGllcyxUSElTX01PRFVMRSxOVUxMKSA9PSAwIHx8CisJCWR2Yl91c2JfZGV2aWNlX2luaXQoaW50Ziwmd3QyMjB1X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUsTlVMTCkgPT0gMCkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGR0dDIwMHVfdXNiX3RhYmxlIFtdID0gewotLy8JCXsgVVNCX0RFVklDRSgweDA0YjQsMHg4NjEzKSB9LAotCSAgICB7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywgVVNCX1BJRF9EVFQyMDBVX0NPTEQpIH0sCi0JICAgIHsgVVNCX0RFVklDRShVU0JfVklEX1dJREVWSUVXLCBVU0JfUElEX0RUVDIwMFVfV0FSTSkgfSwKLQkJeyBVU0JfREVWSUNFKFVTQl9WSURfV0lERVZJRVcsIFVTQl9QSURfV1QyMjBVX0NPTEQpICB9LAotCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywgVVNCX1BJRF9XVDIyMFVfV0FSTSkgIH0sCi0JICAgIHsgMCB9LAorCXsgVVNCX0RFVklDRShVU0JfVklEX1dJREVWSUVXLCBVU0JfUElEX0RUVDIwMFVfQ09MRCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywgVVNCX1BJRF9EVFQyMDBVX1dBUk0pIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WSURfV0lERVZJRVcsIFVTQl9QSURfV1QyMjBVX0NPTEQpICB9LAorCXsgVVNCX0RFVklDRShVU0JfVklEX1dJREVWSUVXLCBVU0JfUElEX1dUMjIwVV9XQVJNKSAgfSwKKwl7IDAgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZHR0MjAwdV91c2JfdGFibGUpOwogCkBAIC0xODksNyArMTg4LDcgQEAKIAogCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKIAkuZGV2aWNlcyA9IHsKLQkJeyAubmFtZSA9ICJXaWRlVmlldyBXVC0yMjBVIFBlblR5cGUgUmVjZWl2ZXIgKGFuZCBjbG9uZXMpIiwKKwkJeyAubmFtZSA9ICJXaWRlVmlldyBXVC0yMjBVIFBlblR5cGUgUmVjZWl2ZXIgKFR5cGhvb24vRnJlZWNvbSkiLAogCQkgIC5jb2xkX2lkcyA9IHsgJmR0dDIwMHVfdXNiX3RhYmxlWzJdLCBOVUxMIH0sCiAJCSAgLndhcm1faWRzID0geyAmZHR0MjAwdV91c2JfdGFibGVbM10sIE5VTEwgfSwKIAkJfSwKQEAgLTIwMSw5ICsyMDAsOSBAQAogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGR0dDIwMHVfdXNiX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gImR2Yl91c2JfZHR0MjAwdSIsCi0JLnByb2JlIAkJPSBkdHQyMDB1X3VzYl9wcm9iZSwKKwkucHJvYmUJCT0gZHR0MjAwdV91c2JfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAotCS5pZF90YWJsZSAJPSBkdHQyMDB1X3VzYl90YWJsZSwKKwkuaWRfdGFibGUJPSBkdHQyMDB1X3VzYl90YWJsZSwKIH07CiAKIC8qIG1vZHVsZSBzdHVmZiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWkyYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWkyYy5jCmluZGV4IDlmMGE4ZDkuLmRhOTcwOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaTJjLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNlbmRpZgogCWQtPmkyY19hZGFwLmFsZ28gICAgICA9IGQtPnByb3BzLmkyY19hbGdvOwogCWQtPmkyY19hZGFwLmFsZ29fZGF0YSA9IE5VTEw7Ci0JZC0+aTJjX2FkYXAuaWQgICAgICAgID0gSTJDX0FMR09fQklUOwogCiAJaTJjX3NldF9hZGFwZGF0YSgmZC0+aTJjX2FkYXAsIGQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKaW5kZXggNzk0ZDUxMy4uMDgxODk5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaApAQCAtMjQsOCArMjQsMTAgQEAKICNkZWZpbmUgVVNCX1ZJRF9IQU5GVEVLCQkJCQkJMHgxNWY0CiAjZGVmaW5lIFVTQl9WSURfSEFVUFBBVUdFCQkJCQkweDIwNDAKICNkZWZpbmUgVVNCX1ZJRF9IWVBFUl9QQUxURUsJCQkJMHgxMDI1CisjZGVmaW5lIFVTQl9WSURfS1dPUkxECQkJCQkJMHhlYjJhCiAjZGVmaW5lIFVTQl9WSURfS1lFCQkJCQkJCTB4MDQ1OAogI2RlZmluZSBVU0JfVklEX01FRElPTgkJCQkJCTB4MTY2MAorI2RlZmluZSBVU0JfVklEX1BJTk5BQ0xFCQkJCQkweDIzMDQKICNkZWZpbmUgVVNCX1ZJRF9WSVNJT05QTFVTCQkJCQkweDEzZDMKICNkZWZpbmUgVVNCX1ZJRF9UV0lOSEFOCQkJCQkJMHgxODIyCiAjZGVmaW5lIFVTQl9WSURfVUxUSU1BX0VMRUNUUk9OSUMJCQkweDA1ZDgKQEAgLTUyLDEyICs1NCwxNCBAQAogI2RlZmluZSBVU0JfUElEX0tXT1JMRF9WU1RSRUFNX1dBUk0JCQkweDE3ZGYKICNkZWZpbmUgVVNCX1BJRF9UV0lOSEFOX1ZQNzA0MV9DT0xECQkJMHgzMjAxCiAjZGVmaW5lIFVTQl9QSURfVFdJTkhBTl9WUDcwNDFfV0FSTQkJCTB4MzIwMgorI2RlZmluZSBVU0JfUElEX1RXSU5IQU5fVlA3MDIwX0NPTEQJCQkweDMyMDMKKyNkZWZpbmUgVVNCX1BJRF9UV0lOSEFOX1ZQNzAyMF9XQVJNCQkJMHgzMjA0CiAjZGVmaW5lIFVTQl9QSURfVFdJTkhBTl9WUDcwNDVfQ09MRAkJCTB4MzIwNQogI2RlZmluZSBVU0JfUElEX1RXSU5IQU5fVlA3MDQ1X1dBUk0JCQkweDMyMDYKLSNkZWZpbmUgVVNCX1BJRF9ETlRWX1RJTllVU0IyX0NPTEQJCQkweDMyMjMKLSNkZWZpbmUgVVNCX1BJRF9ETlRWX1RJTllVU0IyX1dBUk0JCQkweDMyMjQKICNkZWZpbmUgVVNCX1BJRF9UV0lOSEFOX1ZQNzAyMV9DT0xECQkJMHgzMjA3CiAjZGVmaW5lIFVTQl9QSURfVFdJTkhBTl9WUDcwMjFfV0FSTQkJCTB4MzIwOAorI2RlZmluZSBVU0JfUElEX0ROVFZfVElOWVVTQjJfQ09MRAkJCTB4MzIyMworI2RlZmluZSBVU0JfUElEX0ROVFZfVElOWVVTQjJfV0FSTQkJCTB4MzIyNAogI2RlZmluZSBVU0JfUElEX1VMVElNQV9UVkJPWF9DT0xECQkJMHg4MTA1CiAjZGVmaW5lIFVTQl9QSURfVUxUSU1BX1RWQk9YX1dBUk0JCQkweDgxMDYKICNkZWZpbmUgVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X0NPTEQJMHg4MTA3CkBAIC04NSw1ICs4OSw3IEBACiAjZGVmaW5lIFVTQl9QSURfTUVESU9OX01EOTU3MDAJCQkJMHgwOTMyCiAjZGVmaW5lIFVTQl9QSURfS1lFX0RWQl9UX0NPTEQJCQkJMHg3MDFlCiAjZGVmaW5lIFVTQl9QSURfS1lFX0RWQl9UX1dBUk0JCQkJMHg3MDFmCisjZGVmaW5lIFVTQl9QSURfUENUVl8yMDBFCQkJCQkweDAyMGUKKyNkZWZpbmUgVVNCX1BJRF9QQ1RWXzQwMEUJCQkJCTB4MDIwZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaW5pdC5jCmluZGV4IDY1ZjBjMDkuLmE5MDIwNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWluaXQuYwpAQCAtMTI4LDcgKzEyOCw5IEBACiAvKgogICogVVNCCiAgKi8KLWludCBkdmJfdXNiX2RldmljZV9pbml0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzICpwcm9wcywgc3RydWN0IG1vZHVsZSAqb3duZXIpCisKK2ludCBkdmJfdXNiX2RldmljZV9pbml0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzCisJCSpwcm9wcywgc3RydWN0IG1vZHVsZSAqb3duZXIsc3RydWN0IGR2Yl91c2JfZGV2aWNlICoqZHUpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IE5VTEw7CkBAIC0xNzAsNiArMTcyLDkgQEAKIAogCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGQpOwogCisJCWlmIChkdSAhPSBOVUxMKQorCQkJKmR1ID0gZDsKKwogCQlyZXQgPSBkdmJfdXNiX2luaXQoZCk7CiAJfQogCkBAIC0xOTYsMTkgKzIwMSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGR2Yl91c2JfZGV2aWNlX2V4aXQpOwogCi0vKiBtb2R1bGUgc3R1ZmYgKi8KLXN0YXRpYyBpbnQgX19pbml0IGR2Yl91c2JfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGR2Yl91c2JfbW9kdWxlX2V4aXQodm9pZCkKLXsKLX0KLQotbW9kdWxlX2luaXQgKGR2Yl91c2JfbW9kdWxlX2luaXQpOwotbW9kdWxlX2V4aXQgKGR2Yl91c2JfbW9kdWxlX2V4aXQpOwotCiBNT0RVTEVfVkVSU0lPTigiMC4zIik7CiBNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQSBsaWJyYXJ5IG1vZHVsZSBjb250YWluaW5nIGNvbW1vbmx5IHVzZWQgVVNCIGFuZCBEVkIgZnVuY3Rpb24gVVNCIERWQiBkZXZpY2VzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCmluZGV4IGE4MDU2N2MuLjBlNGYxMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCkBAIC0xMjcsNyArMTI3LDcgQEAKICAqICBoZWxwZXIgZnVuY3Rpb25zLgogICoKICAqIEB1cmI6IGRlc2NyaWJlcyB0aGUga2luZCBvZiBVU0IgdHJhbnNmZXIgdXNlZCBmb3IgTVBFRzItVFMtc3RyZWFtaW5nLgotICogIEN1cnJlbnRseSBvbmx5IEJVTEsgaXMgaW1wbGVtZW50ZWQKKyAqICAoQlVMSyBvciBJU09DKQogICoKICAqIEBudW1fZGV2aWNlX2Rlc2NzOiBudW1iZXIgb2Ygc3RydWN0IGR2Yl91c2JfZGV2aWNlX2Rlc2NyaXB0aW9uIGluIEBkZXZpY2VzCiAgKiBAZGV2aWNlczogYXJyYXkgb2Ygc3RydWN0IGR2Yl91c2JfZGV2aWNlX2Rlc2NyaXB0aW9uIGNvbXBhdGlibGVzIHdpdGggdGhlc2UKQEAgLTMxMCw3ICszMTAsNyBAQAogCXZvaWQgKnByaXY7CiB9OwogCi1leHRlcm4gaW50IGR2Yl91c2JfZGV2aWNlX2luaXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyAqLCBzdHJ1Y3QgbW9kdWxlICopOworZXh0ZXJuIGludCBkdmJfdXNiX2RldmljZV9pbml0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICosIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgKiwgc3RydWN0IG1vZHVsZSAqLCBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKiopOwogZXh0ZXJuIHZvaWQgZHZiX3VzYl9kZXZpY2VfZXhpdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKIAogLyogdGhlIGdlbmVyaWMgcmVhZC93cml0ZSBtZXRob2QgZm9yIGRldmljZSBjb250cm9sICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMKaW5kZXggMjU4YTkyYi4uMTg0MWE2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiBzdGF0aWMgaW50IG5vdmFfdF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewotCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJm5vdmFfdF9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZub3ZhX3RfcHJvcGVydGllcyxUSElTX01PRFVMRSxOVUxMKTsKIH0KIAogLyogZG8gbm90IGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIElEIHRhYmxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdW10LTAxMC5jCmluZGV4IDIxMTJhYzMuLjZmZDY3NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdW10LTAxMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdW10LTAxMC5jCkBAIC03Nyw3ICs3Nyw3IEBACiBzdGF0aWMgaW50IHVtdF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewotCWlmIChkdmJfdXNiX2RldmljZV9pbml0KGludGYsJnVtdF9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKSA9PSAwKQorCWlmIChkdmJfdXNiX2RldmljZV9pbml0KGludGYsJnVtdF9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpID09IDApCiAJCXJldHVybiAwOwogCXJldHVybiAtRUlOVkFMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMngtZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwZDhkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LWZlLmMKQEAgLTAsMCArMSwzMzkgQEAKKy8qIERWQiBmcm9udGVuZCBwYXJ0IG9mIHRoZSBMaW51eCBkcml2ZXIgZm9yIHRoZSBUd2luaGFuRFRWIFN0YXJCb3ggVVNCMi4wCisgKiBEVkItUyByZWNlaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmFscGggTWV0emxlciA8cmprbUBtZXR6bGVyYnJvcy5kZT4KKyAqICAgICAgICAgICAgICAgICAgICBNZXR6bGVyIEJyb3RoZXJzIFN5c3RlbWVudHdpY2tsdW5nIEdiUgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4KKyAqCisgKiBUaGFua3MgdG8gVHdpbmhhbiB3aG8ga2luZGx5IHByb3ZpZGVkIGhhcmR3YXJlIGFuZCBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgY2FuIGJlIHJlbW92ZWQgc29vbiwgYWZ0ZXIgdGhlIERTVC1kcml2ZXIgaXMgcmV3cml0dGVuIHRvIHByb3ZpY2UKKyAqIHRoZSBmcm9udGVuZC1jb250cm9sbGluZyBzZXBhcmF0ZWx5LgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoKKyAqLworI2luY2x1ZGUgInZwNzAyeC5oIgorCitzdHJ1Y3QgdnA3MDJ4X2ZlX3N0YXRlIHsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZlOworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZDsKKworCWZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZTsKKwlmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZV9tb2RlOworCisJdTggbG5iX2J1Zls4XTsKKworCXU4IGxvY2s7CisJdTggc2lnOworCXU4IHNucjsKKworCXVuc2lnbmVkIGxvbmcgbmV4dF9zdGF0dXNfY2hlY2s7CisJdW5zaWduZWQgbG9uZyBzdGF0dXNfY2hlY2tfaW50ZXJ2YWw7Cit9OworCitzdGF0aWMgaW50IHZwNzAyeF9mZV9yZWZyZXNoX3N0YXRlKHN0cnVjdCB2cDcwMnhfZmVfc3RhdGUgKnN0KQoreworCXU4IGJ1ZlsxMF07CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcyxzdC0+bmV4dF9zdGF0dXNfY2hlY2spKSB7CisJCXZwNzAyeF91c2JfaW5fb3Aoc3QtPmQsUkVBRF9TVEFUVVMsMCwwLGJ1ZiwxMCk7CisKKwkJc3QtPmxvY2sgPSBidWZbNF07CisJCXZwNzAyeF91c2JfaW5fb3Aoc3QtPmQsUkVBRF9UVU5FUl9SRUdfUkVRLDB4MTEsMCwmc3QtPnNuciwxKTsKKwkJdnA3MDJ4X3VzYl9pbl9vcChzdC0+ZCxSRUFEX1RVTkVSX1JFR19SRVEsMHgxNSwwLCZzdC0+c2lnLDEpOworCisJCXN0LT5uZXh0X3N0YXR1c19jaGVjayA9IGppZmZpZXMgKyAoc3QtPnN0YXR1c19jaGVja19pbnRlcnZhbCpIWikvMTAwMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCB2cDcwMnhfY2hrc3VtKHU4ICpidWYsaW50IGYsIGludCBjb3VudCkKK3sKKwl1OCBzID0gMDsKKwlpbnQgaTsKKwlmb3IgKGkgPSBmOyBpIDwgZitjb3VudDsgaSsrKQorCQlzICs9IGJ1ZltpXTsKKwlyZXR1cm4gfnMrMTsKK30KKworc3RhdGljIGludCB2cDcwMnhfZmVfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190ICpzdGF0dXMpCit7CisJc3RydWN0IHZwNzAyeF9mZV9zdGF0ZSAqc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl2cDcwMnhfZmVfcmVmcmVzaF9zdGF0ZShzdCk7CisJZGViX2ZlKCIlc1xuIixfX0ZVTkNUSU9OX18pOworCisJaWYgKHN0LT5sb2NrID09IDApCisJCSpzdGF0dXMgPSBGRV9IQVNfTE9DSyB8IEZFX0hBU19TWU5DIHwgRkVfSEFTX1ZJVEVSQkkgfCBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX0NBUlJJRVI7CisJZWxzZQorCQkqc3RhdHVzID0gMDsKKworCWRlYl9mZSgicmVhbCBzdGF0ZTogJXhcbiIsKnN0YXR1cyk7CisJKnN0YXR1cyA9IDB4MWY7CisKKwlpZiAoKnN0YXR1cyAmIEZFX0hBU19MT0NLKQorCQlzdC0+c3RhdHVzX2NoZWNrX2ludGVydmFsID0gMTAwMDsKKwllbHNlCisJCXN0LT5zdGF0dXNfY2hlY2tfaW50ZXJ2YWwgPSAyNTA7CisJcmV0dXJuIDA7Cit9CisKKy8qIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBGcm9udGVuZCAqLworc3RhdGljIGludCB2cDcwMnhfZmVfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiAqYmVyKQoreworCXN0cnVjdCB2cDcwMnhfZmVfc3RhdGUgKnN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdnA3MDJ4X2ZlX3JlZnJlc2hfc3RhdGUoc3QpOworCSpiZXIgPSAwOworCXJldHVybiAwOworfQorCisvKiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgRnJvbnRlbmQgKi8KK3N0YXRpYyBpbnQgdnA3MDJ4X2ZlX3JlYWRfdW5jX2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyICp1bmMpCit7CisJc3RydWN0IHZwNzAyeF9mZV9zdGF0ZSAqc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl2cDcwMnhfZmVfcmVmcmVzaF9zdGF0ZShzdCk7CisJKnVuYyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnA3MDJ4X2ZlX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYgKnN0cmVuZ3RoKQoreworCXN0cnVjdCB2cDcwMnhfZmVfc3RhdGUgKnN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdnA3MDJ4X2ZlX3JlZnJlc2hfc3RhdGUoc3QpOworCisJKnN0cmVuZ3RoID0gKHN0LT5zaWcgPDwgOCkgfCBzdC0+c2lnOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzAyeF9mZV9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2ICpzbnIpCit7CisJdTggX3NucjsKKwlzdHJ1Y3QgdnA3MDJ4X2ZlX3N0YXRlICpzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXZwNzAyeF9mZV9yZWZyZXNoX3N0YXRlKHN0KTsKKworCV9zbnIgPSAoc3QtPnNuciAmIDB4MWYpICogMHhmZiAvIDB4MWY7CisJKnNuciA9IChfc25yIDw8IDgpIHwgX3NucjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDcwMnhfZmVfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyAqdHVuZSkKK3sKKwlkZWJfZmUoIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisJdHVuZS0+bWluX2RlbGF5X21zID0gMjAwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDcwMnhfZmVfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCSAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXApCit7CisJc3RydWN0IHZwNzAyeF9mZV9zdGF0ZSAqc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1MzIgZnJlcSA9IGZlcC0+ZnJlcXVlbmN5LzEwMDA7CisJLypDYWxGcmVxdWVuY3kqLworLyoJdTE2IGZyZXF1ZW5jeVJlZlsxNl0gPSB7IDIsIDQsIDgsIDE2LCAzMiwgNjQsIDEyOCwgMjU2LCAyNCwgNSwgMTAsIDIwLCA0MCwgODAsIDE2MCwgMzIwIH07ICovCisJdTY0IHNyOworCXU4IGNtZFs4XSA9IHsgMCB9LGlidWZbMTBdOworCisJY21kWzBdID0gKGZyZXEgPj4gOCkgJiAweDdmOworCWNtZFsxXSA9ICBmcmVxICAgICAgICYgMHhmZjsKKwljbWRbMl0gPSAxOyAvKiBkaXZyYXRlID09IDQgLT4gZnJlcXVlbmN5UmVmWzFdIC0+IDEgaGVyZSAqLworCisJc3IgPSAodTY0KSAoZmVwLT51LnFwc2suc3ltYm9sX3JhdGUvMTAwMCkgPDwgMjA7CisJZG9fZGl2KHNyLDg4MDAwKTsKKwljbWRbM10gPSAoc3IgPj4gMTIpICYgMHhmZjsKKwljbWRbNF0gPSAoc3IgPj4gNCkgICYgMHhmZjsKKwljbWRbNV0gPSAoc3IgPDwgNCkgICYgMHhmMDsKKworCWRlYl9mZSgic2V0dGluZyBmcm9udGVuZCB0bzogJXUgLT4gJXUgKCV4KSBMTkItYmFzZWQgR0h6LCBzeW1ib2xyYXRlOiAlZCAtPiAlTHUgKCVMeClcbiIsCisJCQlmZXAtPmZyZXF1ZW5jeSxmcmVxLGZyZXEsIGZlcC0+dS5xcHNrLnN5bWJvbF9yYXRlLCBzciwgc3IpOworCisvKglpZiAoZmVwLT5pbnZlcnNpb24gPT0gSU5WRVJTSU9OX09OKQorCQljbWRbNl0gfD0gMHg4MDsgKi8KKworCWlmIChzdC0+dm9sdGFnZSA9PSBTRUNfVk9MVEFHRV8xOCkKKwkJY21kWzZdIHw9IDB4NDA7CisKKy8qCWlmIChmZXAtPnUucXBzay5zeW1ib2xfcmF0ZSA+IDgwMDAwMDApCisJCWNtZFs2XSB8PSAweDIwOworCisJaWYgKGZlcC0+ZnJlcXVlbmN5IDwgMTUzMTAwMCkKKwkJY21kWzZdIHw9IDB4MDQ7CisKKwlpZiAoc3QtPnRvbmVfbW9kZSA9PSBTRUNfVE9ORV9PTikKKwkJY21kWzZdIHw9IDB4MDE7Ki8KKworCWNtZFs3XSA9IHZwNzAyeF9jaGtzdW0oY21kLDAsNyk7CisKKwlzdC0+c3RhdHVzX2NoZWNrX2ludGVydmFsID0gMjUwOworCXN0LT5uZXh0X3N0YXR1c19jaGVjayA9IGppZmZpZXM7CisKKwl2cDcwMnhfdXNiX2luX29wKHN0LT5kLCBSRVNFVF9UVU5FUiwgMCwgMCwgTlVMTCwgMCk7CisJbXNsZWVwKDMwKTsKKwl2cDcwMnhfdXNiX2lub3V0X29wKHN0LT5kLGNtZCw4LGlidWYsMTAsMTAwKTsKKworCWlmIChpYnVmWzJdID09IDAgJiYgaWJ1ZlszXSA9PSAwKQorCQlkZWJfZmUoInR1bmluZyBmYWlsZWQuXG4iKTsKKwllbHNlCisJCWRlYl9mZSgidHVuaW5nIHN1Y2NlZWRlZC5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnA3MDJ4X2ZlX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQoreworCWRlYl9mZSgiJXNcbiIsX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDcwMnhfZmVfc2VuZF9kaXNlcWNfbXNnIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kICptKQoreworCXN0cnVjdCB2cDcwMnhfZmVfc3RhdGUgKnN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggY21kWzhdLGlidWZbMTBdOworCW1lbXNldChjbWQsMCw4KTsKKworCWRlYl9mZSgiJXNcbiIsX19GVU5DVElPTl9fKTsKKworCWlmIChtLT5tc2dfbGVuID4gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbWRbMV0gPSBTRVRfRElTRVFDX0NNRDsKKwljbWRbMl0gPSBtLT5tc2dfbGVuOworCW1lbWNweSgmY21kWzNdLCBtLT5tc2csIG0tPm1zZ19sZW4pOworCWNtZFs3XSA9IHZwNzAyeF9jaGtzdW0oY21kLDAsNyk7CisKKwl2cDcwMnhfdXNiX2lub3V0X29wKHN0LT5kLGNtZCw4LGlidWYsMTAsMTAwKTsKKworCWlmIChpYnVmWzJdID09IDAgJiYgaWJ1ZlszXSA9PSAwKQorCQlkZWJfZmUoImRpc2VxYyBjbWQgZmFpbGVkLlxuIik7CisJZWxzZQorCQlkZWJfZmUoImRpc2VxYyBjbWQgc3VjY2VlZGVkLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDcwMnhfZmVfc2VuZF9kaXNlcWNfYnVyc3QgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfbWluaV9jbWRfdCBidXJzdCkKK3sKKwlkZWJfZmUoIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnA3MDJ4X2ZlX3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKK3sKKwlzdHJ1Y3QgdnA3MDJ4X2ZlX3N0YXRlICpzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGlidWZbMTBdOworCWRlYl9mZSgiJXNcbiIsX19GVU5DVElPTl9fKTsKKworCXN0LT50b25lX21vZGUgPSB0b25lOworCisJaWYgKHRvbmUgPT0gU0VDX1RPTkVfT04pCisJCXN0LT5sbmJfYnVmWzJdID0gMHgwMjsKKwllbHNlCisJCXN0LT5sbmJfYnVmWzJdID0gMHgwMDsKKworCXN0LT5sbmJfYnVmWzddID0gdnA3MDJ4X2Noa3N1bShzdC0+bG5iX2J1ZiwwLDcpOworCisJdnA3MDJ4X3VzYl9pbm91dF9vcChzdC0+ZCxzdC0+bG5iX2J1Ziw4LGlidWYsMTAsMTAwKTsKKwlpZiAoaWJ1ZlsyXSA9PSAwICYmIGlidWZbM10gPT0gMCkKKwkJZGViX2ZlKCJzZXRfdG9uZSBjbWQgZmFpbGVkLlxuIik7CisJZWxzZQorCQlkZWJfZmUoInNldF90b25lIGNtZCBzdWNjZWVkZWQuXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzAyeF9mZV9zZXRfdm9sdGFnZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3QKKwkJdm9sdGFnZSkKK3sKKwlzdHJ1Y3QgdnA3MDJ4X2ZlX3N0YXRlICpzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGlidWZbMTBdOworCWRlYl9mZSgiJXNcbiIsX19GVU5DVElPTl9fKTsKKworCXN0LT52b2x0YWdlID0gdm9sdGFnZTsKKworCWlmICh2b2x0YWdlICE9IFNFQ19WT0xUQUdFX09GRikKKwkJc3QtPmxuYl9idWZbNF0gPSAweDAxOworCWVsc2UKKwkJc3QtPmxuYl9idWZbNF0gPSAweDAwOworCisJc3QtPmxuYl9idWZbN10gPSB2cDcwMnhfY2hrc3VtKHN0LT5sbmJfYnVmLDAsNyk7CisKKwl2cDcwMnhfdXNiX2lub3V0X29wKHN0LT5kLHN0LT5sbmJfYnVmLDgsaWJ1ZiwxMCwxMDApOworCWlmIChpYnVmWzJdID09IDAgJiYgaWJ1ZlszXSA9PSAwKQorCQlkZWJfZmUoInNldF92b2x0YWdlIGNtZCBmYWlsZWQuXG4iKTsKKwllbHNlCisJCWRlYl9mZSgic2V0X3ZvbHRhZ2UgY21kIHN1Y2NlZWRlZC5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZwNzAyeF9mZV9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQoreworCXN0cnVjdCB2cDcwMnhfZmVfc3RhdGUgKnN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJa2ZyZWUoc3QpOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdnA3MDJ4X2ZlX29wczsKKworc3RydWN0IGR2Yl9mcm9udGVuZCAqIHZwNzAyeF9mZV9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCXN0cnVjdCB2cDcwMnhfZmVfc3RhdGUgKnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdnA3MDJ4X2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHMgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKwltZW1zZXQocywwLHNpemVvZihzdHJ1Y3QgdnA3MDJ4X2ZlX3N0YXRlKSk7CisKKwlzLT5kID0gZDsKKwlzLT5mZS5vcHMgPSAmdnA3MDJ4X2ZlX29wczsKKwlzLT5mZS5kZW1vZHVsYXRvcl9wcml2ID0gczsKKworCXMtPmxuYl9idWZbMV0gPSBTRVRfTE5CX1BPV0VSOworCXMtPmxuYl9idWZbM10gPSAweGZmOyAvKiAwPXRvbmUgYnVyc3QsIDI9ZGF0YSBidXJzdCwgZmY9b2ZmICovCisKKwlnb3RvIHN1Y2Nlc3M7CitlcnJvcjoKKwlyZXR1cm4gTlVMTDsKK3N1Y2Nlc3M6CisJcmV0dXJuICZzLT5mZTsKK30KKworCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdnA3MDJ4X2ZlX29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlR3aW5oYW4gRFNULWxpa2UgZnJvbnRlbmQgKFZQNzAyMS9WUDcwMjApIERWQi1TIiwKKwkJLnR5cGUgICAgICAgICAgID0gRkVfUVBTSywKKwkJLmZyZXF1ZW5jeV9taW4gICAgICAgPSA5NTAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ICAgICAgID0gMjE1MDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwc2l6ZSAgPSAxMDAwLCAgIC8qIGtIeiBmb3IgUVBTSyBmcm9udGVuZHMgKi8KKwkJLmZyZXF1ZW5jeV90b2xlcmFuY2UgPSAwLAorCQkuc3ltYm9sX3JhdGVfbWluICAgICA9IDEwMDAwMDAsCisJCS5zeW1ib2xfcmF0ZV9tYXggICAgID0gNDUwMDAwMDAsCisJCS5zeW1ib2xfcmF0ZV90b2xlcmFuY2UgPSA1MDAsICAvKiBwcG0gKi8KKwkJLmNhcHMgPSBGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwgRkVfQ0FOX0ZFQ18zXzQgfAorCQlGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfN184IHwKKwkJRkVfQ0FOX1FQU0sgfAorCQlGRV9DQU5fRkVDX0FVVE8KKwl9LAorCS5yZWxlYXNlID0gdnA3MDJ4X2ZlX3JlbGVhc2UsCisKKwkuaW5pdCA9IE5VTEwsCisJLnNsZWVwID0gTlVMTCwKKworCS5zZXRfZnJvbnRlbmQgPSB2cDcwMnhfZmVfc2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmQgPSB2cDcwMnhfZmVfZ2V0X2Zyb250ZW5kLAorCS5nZXRfdHVuZV9zZXR0aW5ncyA9IHZwNzAyeF9mZV9nZXRfdHVuZV9zZXR0aW5ncywKKworCS5yZWFkX3N0YXR1cyA9IHZwNzAyeF9mZV9yZWFkX3N0YXR1cywKKwkucmVhZF9iZXIgPSB2cDcwMnhfZmVfcmVhZF9iZXIsCisJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gdnA3MDJ4X2ZlX3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3NuciA9IHZwNzAyeF9mZV9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyA9IHZwNzAyeF9mZV9yZWFkX3VuY19ibG9ja3MsCisKKwkuZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IHZwNzAyeF9mZV9zZW5kX2Rpc2VxY19tc2csCisJLmRpc2VxY19zZW5kX2J1cnN0ID0gdnA3MDJ4X2ZlX3NlbmRfZGlzZXFjX2J1cnN0LAorCS5zZXRfdG9uZSA9IHZwNzAyeF9mZV9zZXRfdG9uZSwKKwkuc2V0X3ZvbHRhZ2UgPSB2cDcwMnhfZmVfc2V0X3ZvbHRhZ2UsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMnguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxM2MwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qIERWQiBVU0IgY29tcGxpYW50IExpbnV4IGRyaXZlciBmb3IgdGhlIFR3aW5oYW5EVFYgU3RhckJveCBVU0IyLjAgRFZCLVMKKyAqIHJlY2VpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSYWxwaCBNZXR6bGVyIDxyamttQG1ldHpsZXJicm9zLmRlPgorICogICAgICAgICAgICAgICAgICAgIE1ldHpsZXIgQnJvdGhlcnMgU3lzdGVtZW50d2lja2x1bmcgR2JSCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPgorICoKKyAqIFRoYW5rcyB0byBUd2luaGFuIHdobyBraW5kbHkgcHJvdmlkZWQgaGFyZHdhcmUgYW5kIGluZm9ybWF0aW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaW5jbHVkZSAidnA3MDJ4LmgiCisKKy8qIGRlYnVnICovCitpbnQgZHZiX3VzYl92cDcwMnhfZGVidWc7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsZHZiX3VzYl92cDcwMnhfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvLHhmZXI9MixyYz00IChvci1hYmxlKSkuIiBEVkJfVVNCX0RFQlVHX1NUQVRVUyk7CisKK3N0cnVjdCB2cDcwMnhfc3RhdGUgeworCXU4IHBpZF90YWJsZVsxN107IC8qIFsxNl0gY29udHJvbHMgdGhlIHBpZF90YWJsZSBzdGF0ZSAqLworfTsKKworLyogY2hlY2sgZm9yIG11dGV4IEZJWE1FICovCitpbnQgdnA3MDJ4X3VzYl9pbl9vcChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHU4ICpiLCBpbnQgYmxlbikKK3sKKwlpbnQgcmV0ID0gMCx0cnkgPSAwOworCisJd2hpbGUgKHJldCA+PSAwICYmIHJldCAhPSBibGVuICYmIHRyeSA8IDMpIHsKKwkJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGQtPnVkZXYsCisJCQl1c2JfcmN2Y3RybHBpcGUoZC0+dWRldiwwKSwKKwkJCXJlcSwKKwkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4sCisJCQl2YWx1ZSxpbmRleCxiLGJsZW4sCisJCQkyMDAwKTsKKwkJZGViX2luZm8oInJlYWRpbmcgbnVtYmVyICVkIChyZXQ6ICVkKVxuIix0cnkscmV0KTsKKwkJdHJ5Kys7CisJfQorCisJaWYgKHJldCA8IDAgfHwgcmV0ICE9IGJsZW4pIHsKKwkJd2FybigidXNiIGluIG9wZXJhdGlvbiBmYWlsZWQuIik7CisJCXJldCA9IC1FSU87CisJfSBlbHNlCisJCXJldCA9IDA7CisKKwlkZWJfeGZlcigiaW46IHJlcS4gJXgsIHZhbDogJXgsIGluZDogJXgsIGJ1ZmZlcjogIixyZXEsdmFsdWUsaW5kZXgpOworCWRlYnVnX2R1bXAoYixibGVuLGRlYl94ZmVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2cDcwMnhfdXNiX291dF9vcChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHU4ICpiLCBpbnQgYmxlbikKK3sKKwlkZWJfeGZlcigib3V0OiByZXEuICV4LCB2YWw6ICV4LCBpbmQ6ICV4LCBidWZmZXI6ICIscmVxLHZhbHVlLGluZGV4KTsKKwlkZWJ1Z19kdW1wKGIsYmxlbixkZWJfeGZlcik7CisKKwlpZiAodXNiX2NvbnRyb2xfbXNnKGQtPnVkZXYsCisJCQl1c2Jfc25kY3RybHBpcGUoZC0+dWRldiwwKSwKKwkJCXJlcSwKKwkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VULAorCQkJdmFsdWUsaW5kZXgsYixibGVuLAorCQkJMjAwMCkgIT0gYmxlbikgeworCQl3YXJuKCJ1c2Igb3V0IG9wZXJhdGlvbiBmYWlsZWQuIik7CisJCXJldHVybiAtRUlPOworCX0gZWxzZQorCQlyZXR1cm4gMDsKK30KKworaW50IHZwNzAyeF91c2JfaW5vdXRfb3Aoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCAqbywgaW50IG9sZW4sIHU4ICppLCBpbnQgaWxlbiwgaW50IG1zZWMpCit7CisJaW50IHJldDsKKworCWlmICgocmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZkLT51c2Jfc2VtKSkpCisJCXJldHVybiByZXQ7CisKKwlpZiAoKHJldCA9IHZwNzAyeF91c2Jfb3V0X29wKGQsUkVRVUVTVF9PVVQsMCwwLG8sb2xlbikpIDwgMCkKKwkJZ290byB1bmxvY2s7CisJbXNsZWVwKG1zZWMpOworCXJldCA9IHZwNzAyeF91c2JfaW5fb3AoZCxSRVFVRVNUX0lOLDAsMCxpLGlsZW4pOworCit1bmxvY2s6CisJdXAoJmQtPnVzYl9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHZwNzAyeF91c2JfaW5vdXRfY21kKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggY21kLCB1OCAqbywgaW50IG9sZW4sIHU4ICppLCBpbnQgaWxlbiwgaW50IG1zZWMpCit7CisJdTggYm91dFtvbGVuKzJdOworCXU4IGJpbltpbGVuKzFdOworCWludCByZXQgPSAwOworCisJYm91dFswXSA9IDB4MDA7CisJYm91dFsxXSA9IGNtZDsKKwltZW1jcHkoJmJvdXRbMl0sbyxvbGVuKTsKKworCXJldCA9IHZwNzAyeF91c2JfaW5vdXRfb3AoZCwgYm91dCwgb2xlbisyLCBiaW4sIGlsZW4rMSxtc2VjKTsKKworCWlmIChyZXQgPT0gMCkKKwkJbWVtY3B5KGksJmJpblsxXSxpbGVuKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdnA3MDJ4X3BpZF9maWx0ZXIoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgaW5kZXgsIHUxNiBwaWQsIGludCBvbm9mZikKK3sKKwlzdHJ1Y3QgdnA3MDJ4X3N0YXRlICpzdCA9IGQtPnByaXY7CisJdTggYnVmWzldOworCisJaWYgKG9ub2ZmKSB7CisJCXN0LT5waWRfdGFibGVbMTZdICAgfD0gICAxIDw8IGluZGV4OworCQlzdC0+cGlkX3RhYmxlW2luZGV4KjJdICAgPSAocGlkID4+IDgpICYgMHhmZjsKKwkJc3QtPnBpZF90YWJsZVtpbmRleCoyKzFdID0gIHBpZCAgICAgICAmIDB4ZmY7CisJfSBlbHNlIHsKKwkJc3QtPnBpZF90YWJsZVsxNl0gICAmPSB+KDEgPDwgaW5kZXgpOworCQlzdC0+cGlkX3RhYmxlW2luZGV4KjJdID0gc3QtPnBpZF90YWJsZVtpbmRleCoyKzFdID0gMDsKKwl9CisKKwlyZXR1cm4gdnA3MDJ4X3VzYl9pbm91dF9jbWQoZCxTRVRfUElEX0ZJTFRFUixzdC0+cGlkX3RhYmxlLDE3LGJ1Ziw5LDEwKTsKK30KKworc3RhdGljIGludCB2cDcwMnhfcG93ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBvbm9mZikKK3sKKwl2cDcwMnhfdXNiX2luX29wKGQsUkVTRVRfVFVORVIsMCwwLE5VTEwsMCk7CisKKwl2cDcwMnhfdXNiX2luX29wKGQsU0VUX1RVTkVSX1BPV0VSX1JFUSwwLG9ub2ZmLE5VTEwsMCk7CisJcmV0dXJuIHZwNzAyeF91c2JfaW5fb3AoZCxTRVRfVFVORVJfUE9XRVJfUkVRLDAsb25vZmYsTlVMTCwwKTsKK30KKworLyoga2V5cyBmb3IgdGhlIGVuY2xvc2VkIHJlbW90ZSBjb250cm9sICovCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IHZwNzAyeF9yY19rZXlzW10gPSB7CisJeyAweDAwLCAweDAxLCBLRVlfMSB9LAorCXsgMHgwMCwgMHgwMiwgS0VZXzIgfSwKK307CisKKy8qIHJlbW90ZSBjb250cm9sIHN0dWZmIChkb2VzIG5vdCB3b3JrIHdpdGggbXkgYm94KSAqLworc3RhdGljIGludCB2cDcwMnhfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQoreworCXU4IGtleVsxMF07CisJaW50IGk7CisKKy8qIHJlbW92ZSB0aGUgZm9sbG93aW5nIHJldHVybiB0byBlbmFibGVkIHJlbW90ZSBxdWVyeWluZyAqLworCXJldHVybiAwOworCisJdnA3MDJ4X3VzYl9pbl9vcChkLFJFQURfUkVNT1RFX1JFUSwwLDAsa2V5LDEwKTsKKworCWRlYl9yYygicmVtb3RlIHF1ZXJ5IGtleTogJXggJWRcbiIsa2V5WzFdLGtleVsxXSk7CisKKwlpZiAoa2V5WzFdID09IDB4NDQpIHsKKwkJKnN0YXRlID0gUkVNT1RFX05PX0tFWV9QUkVTU0VEOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2cDcwMnhfcmNfa2V5cyk7IGkrKykKKwkJaWYgKHZwNzAyeF9yY19rZXlzW2ldLmN1c3RvbSA9PSBrZXlbMV0pIHsKKwkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKKwkJCSpldmVudCA9IHZwNzAyeF9yY19rZXlzW2ldLmV2ZW50OworCQkJYnJlYWs7CisJCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDcwMnhfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsdTggbWFjWzZdKQoreworCXU4IG1hY2JbOV07CisJaWYgKHZwNzAyeF91c2JfaW5vdXRfY21kKGQsIEdFVF9NQUNfQUREUkVTUywgTlVMTCwgMCwgbWFjYiwgOSwgMTApKQorCQlyZXR1cm4gLUVJTzsKKwltZW1jcHkobWFjLCZtYWNiWzNdLDYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzAyeF9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCXU4IGJ1Zls5XSA9IHsgMCB9OworCisJaWYgKHZwNzAyeF91c2JfaW5vdXRfY21kKGQsIEdFVF9TWVNURU1fU1RSSU5HLCBOVUxMLCAwLCBidWYsIDksIDEwKSkKKwkJcmV0dXJuIC1FSU87CisKKwlidWZbOF0gPSAnXDAnOworCWluZm8oInN5c3RlbSBzdHJpbmc6ICVzIiwmYnVmWzFdKTsKKworCWQtPmZlID0gdnA3MDJ4X2ZlX2F0dGFjaChkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgdnA3MDJ4X3Byb3BlcnRpZXM7CisKK3N0YXRpYyBpbnQgdnA3MDJ4X3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKworCXVzYl9jbGVhcl9oYWx0KHVkZXYsdXNiX3NuZGN0cmxwaXBlKHVkZXYsMCkpOworCXVzYl9jbGVhcl9oYWx0KHVkZXYsdXNiX3JjdmN0cmxwaXBlKHVkZXYsMCkpOworCisJcmV0dXJuIGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmdnA3MDJ4X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUsTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB2cDcwMnhfdXNiX3RhYmxlIFtdID0geworCSAgICB7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9WSVNJT05QTFVTLCBVU0JfUElEX1RXSU5IQU5fVlA3MDIxX0NPTEQpIH0sCisJICAgIHsgVVNCX0RFVklDRShVU0JfVklEX1ZJU0lPTlBMVVMsIFVTQl9QSURfVFdJTkhBTl9WUDcwMjFfV0FSTSkgfSwKKwkgICAgeyBVU0JfREVWSUNFKFVTQl9WSURfVklTSU9OUExVUywgVVNCX1BJRF9UV0lOSEFOX1ZQNzAyMF9DT0xEKSB9LAorCSAgICB7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9WSVNJT05QTFVTLCBVU0JfUElEX1RXSU5IQU5fVlA3MDIwX1dBUk0pIH0sCisJICAgIHsgMCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB2cDcwMnhfdXNiX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgdnA3MDJ4X3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSBEVkJfVVNCX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9ORUVEX1BJRF9GSUxURVJJTkcsCisJLnBpZF9maWx0ZXJfY291bnQgPSA4LCAvKiAhISEgKi8KKworCS51c2JfY3RybCA9IENZUFJFU1NfRlgyLAorCS5maXJtd2FyZSA9ICJkdmItdXNiLXZwNzAyeC0wMS5mdyIsCisKKwkucGlkX2ZpbHRlciAgICAgICA9IHZwNzAyeF9waWRfZmlsdGVyLAorCS5wb3dlcl9jdHJsICAgICAgID0gdnA3MDJ4X3Bvd2VyX2N0cmwsCisJLmZyb250ZW5kX2F0dGFjaCAgPSB2cDcwMnhfZnJvbnRlbmRfYXR0YWNoLAorCS5yZWFkX21hY19hZGRyZXNzID0gdnA3MDJ4X3JlYWRfbWFjX2FkZHIsCisKKwkucmNfa2V5X21hcCAgICAgICA9IHZwNzAyeF9yY19rZXlzLAorCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRSh2cDcwMnhfcmNfa2V5cyksCisJLnJjX2ludGVydmFsICAgICAgPSA0MDAsCisJLnJjX3F1ZXJ5ICAgICAgICAgPSB2cDcwMnhfcmNfcXVlcnksCisKKwkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgdnA3MDJ4X3N0YXRlKSwKKworCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkudXJiID0geworCQkudHlwZSA9IERWQl9VU0JfQlVMSywKKwkJLmNvdW50ID0gNywKKwkJLmVuZHBvaW50ID0gMHgwMiwKKwkJLnUgPSB7CisJCQkuYnVsayA9IHsKKwkJCQkuYnVmZmVyc2l6ZSA9IDQwOTYsCisJCQl9CisJCX0KKwl9LAorCisJLm51bV9kZXZpY2VfZGVzY3MgPSAyLAorCS5kZXZpY2VzID0geworCQl7IC5uYW1lID0gIlR3aW5oYW5EVFYgU3RhckJveCBEVkItUyBVU0IyLjAgKFZQNzAyMSkiLAorCQkgIC5jb2xkX2lkcyA9IHsgJnZwNzAyeF91c2JfdGFibGVbMF0sIE5VTEwgfSwKKwkJICAud2FybV9pZHMgPSB7ICZ2cDcwMnhfdXNiX3RhYmxlWzFdLCBOVUxMIH0sCisJCX0sCisJCXsgLm5hbWUgPSAiVHdpbmhhbkRUViBTdGFyQm94IERWQi1TIFVTQjIuMCAoVlA3MDIwKSIsCisJCSAgLmNvbGRfaWRzID0geyAmdnA3MDJ4X3VzYl90YWJsZVsyXSwgTlVMTCB9LAorCQkgIC53YXJtX2lkcyA9IHsgJnZwNzAyeF91c2JfdGFibGVbM10sIE5VTEwgfSwKKwkJfSwKKwkJeyAwIH0sCisJfQorfTsKKworLyogdXNiIHNwZWNpZmljIG9iamVjdCBuZWVkZWQgdG8gcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgdXNiIHN1YnN5c3RlbSAqLworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHZwNzAyeF91c2JfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZHZiLXVzYi12cDcwMngiLAorCS5wcm9iZSAJCT0gdnA3MDJ4X3VzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCisJLmlkX3RhYmxlIAk9IHZwNzAyeF91c2JfdGFibGUsCit9OworCisvKiBtb2R1bGUgc3R1ZmYgKi8KK3N0YXRpYyBpbnQgX19pbml0IHZwNzAyeF91c2JfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCWlmICgocmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZ2cDcwMnhfdXNiX2RyaXZlcikpKSB7CisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gKCVkKSIscmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZwNzAyeF91c2JfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIGZyb20gdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmdnA3MDJ4X3VzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh2cDcwMnhfdXNiX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHZwNzAyeF91c2JfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBUd2luaGFuIFN0YXJCb3ggRFZCLVMgVVNCMi4wIGFuZCBjbG9uZXMiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAtYWxwaGEiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhM2U4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC5oCkBAIC0wLDAgKzEsMTA5IEBACisjaWZuZGVmIF9EVkJfVVNCX1ZQNzAyMV9IXworI2RlZmluZSBfRFZCX1VTQl9WUDcwMjFfSF8KKworI2RlZmluZSBEVkJfVVNCX0xPR19QUkVGSVggInZwNzAyeCIKKyNpbmNsdWRlICJkdmItdXNiLmgiCisKK2V4dGVybiBpbnQgZHZiX3VzYl92cDcwMnhfZGVidWc7CisjZGVmaW5lIGRlYl9pbmZvKGFyZ3MuLi4pIGRwcmludGsoZHZiX3VzYl92cDcwMnhfZGVidWcsMHgwMSxhcmdzKQorI2RlZmluZSBkZWJfeGZlcihhcmdzLi4uKSBkcHJpbnRrKGR2Yl91c2JfdnA3MDJ4X2RlYnVnLDB4MDIsYXJncykKKyNkZWZpbmUgZGViX3JjKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX3ZwNzAyeF9kZWJ1ZywweDA0LGFyZ3MpCisjZGVmaW5lIGRlYl9mZShhcmdzLi4uKSAgIGRwcmludGsoZHZiX3VzYl92cDcwMnhfZGVidWcsMHgwOCxhcmdzKQorCisvKiBjb21tYW5kcyBhcmUgcmVhZCBhbmQgd3JpdHRlbiB3aXRoIFVTQiBjb250cm9sIG1lc3NhZ2VzICovCisKKy8qIGNvbnNlY3V0aXZlIHJlYWQvd3JpdGUgb3BlcmF0aW9uICovCisjZGVmaW5lIFJFUVVFU1RfT1VUICAgICAgIDB4QjIKKyNkZWZpbmUgUkVRVUVTVF9JTgkJICAweEIzCisKKy8qIHRoZSBvdXQtYnVmZmVyIG9mIHRoZXNlIGNvbnNlY3V0aXZlIG9wZXJhdGlvbnMgY29udGFpbiBzdWItY29tbWFuZHMgd2hlbiBiWzBdID0gMAorICogcmVxdWVzdDogMHhCMjsgaTogMDsgdjogMDsgYlswXSA9IDAsIGJbMV0gPSBzdWJjbWQsIGFkZGl0aW9uYWwgYnVmZmVyCisgKiB0aGUgcmV0dXJuaW5nIGJ1ZmZlciBsb29rcyBhcyBmb2xsb3dzCisgKiByZXF1ZXN0OiAweEIzOyBpOiAwOyB2OiAwOyBiWzBdID0gMHhCMywgYWRkaXRpb25hbCBidWZmZXIgKi8KKworI2RlZmluZSBHRVRfVFVORVJfU1RBVFVTICAweDA1CisvKiBhZGRpdGlvbmFsIGluIGJ1ZmZlcjoKKyAqIDAgICAxICAgMiAgICAzICAgICAgICAgICAgICA0ICAgNSAgIDYgICAgICAgICAgICAgICA3ICAgICAgIDgKKyAqIE4vQSBOL0EgMHgwNSBzaWduYWwtcXVhbGl0eSBOL0EgTi9BIHNpZ25hbC1zdHJlbmd0aCBsb2NrPT0wIE4vQSAqLworCisjZGVmaW5lIEdFVF9TWVNURU1fU1RSSU5HIDB4MDYKKy8qIGFkZGl0aW9uYWwgaW4gYnVmZmVyOgorICogMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4CisgKiBOL0EgJ1UnICdTJyAnQicgJzcnICcwJyAnMicgJ1gnIE4vQSAqLworCisjZGVmaW5lIFNFVF9ESVNFUUNfQ01EICAgIDB4MDgKKy8qIGFkZGl0aW9uYWwgb3V0IGJ1ZmZlcjoKKyAqIDAgICAgMSAgMiAgMyAgNAorICogbGVuICBYMSBYMiBYMyBYNAorICogYWRkaXRpb25hbCBpbiBidWZmZXI6CisgKiAwICAgMSAyCisgKiBOL0EgMCAwICAgYlsxXSA9PSBiWzJdID09IDAgLT4gc3VjY2VzcyBvdGhlcndpc2Ugbm90ICovCisKKyNkZWZpbmUgU0VUX0xOQl9QT1dFUiAgICAgMHgwOQorLyogYWRkaXRpb25hbCBvdXQgYnVmZmVyOgorICogMCAgICAxICAgIDIKKyAqIDB4MDAgMHhmZiAxID0gb24sIDAgPSBvZmYKKyAqIGFkZGl0aW9uYWwgaW4gYnVmZmVyOgorICogMCAgIDEgMgorICogTi9BIDAgMCAgIGJbMV0gPT0gYlsyXSA9PSAwIC0+IHN1Y2Nlc3Mgb3RoZXJ3aXNlIG5vdCAqLworCisjZGVmaW5lIEdFVF9NQUNfQUREUkVTUyAgIDB4MEEKKy8qICNkZWZpbmUgR0VUX01BQ19BRERSRVNTICAgMHgwQiAqLworLyogYWRkaXRpb25hbCBpbiBidWZmZXI6CisgKiAwICAgMSAgIDIgICAgICAgICAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOAorICogTi9BIE4vQSAweDBBIG9yIDB4MEIgTUFDMCBNQUMxIE1BQzIgTUFDMyBNQUM0IE1BQzUgKi8KKworI2RlZmluZSBTRVRfUElEX0ZJTFRFUiAgICAweDExCisvKiBhZGRpdGlvbmFsIGluIGJ1ZmZlcjoKKyAqIDAgICAgICAgIDEgICAgICAgIC4uLiAxNCAgICAgICAxNSAgICAgICAxNgorICogUElEMF9NU0IgUElEMF9MU0IgLi4uIFBJRDdfTVNCIFBJRDdfTFNCIFBJRF9hY3RpdmUgKGJpdHMpICovCisKKy8qIHJlcXVlc3Q6IDB4QjI7IGk6IDA7IHY6IDA7CisgKiBiWzBdICE9IDAgLT4gdHVuZSBhbmQgbG9jayBhIGNoYW5uZWwKKyAqIDAgICAgIDEgICAgIDIgICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICA3CisgKiBmcmVxMCBmcmVxMSBkaXZzdGVwIHNyYXRlMCBzcmF0ZTEgc3JhdGUyIGZsYWcgY2hrc3VtCisgKi8KKworCisvKiBvbmUgZGlyZWN0aW9uIHJlcXVlc3RzICovCisjZGVmaW5lIFJFQURfUkVNT1RFX1JFUSAgICAgICAweEI0CisvKiBJTiAgaTogMDsgdjogMDsgYlswXSA9PSByZXF1ZXN0LCBiWzFdID09IGtleSAqLworCisjZGVmaW5lIFJFQURfUElEX05VTUJFUl9SRVEgICAweEI1CisvKiBJTiAgaTogMDsgdjogMDsgYlswXSA9PSByZXF1ZXN0LCBiWzFdID09IDAsIGJbMl0gPSBwaWQgbnVtYmVyICovCisKKyNkZWZpbmUgV1JJVEVfRUVQUk9NX1JFUSAgICAgIDB4QjYKKy8qIE9VVCBpOiBvZmZzZXQ7IHY6IHZhbHVlIHRvIHdyaXRlOyBubyBleHRyYSBidWZmZXIgKi8KKworI2RlZmluZSBSRUFEX0VFUFJPTV9SRVEgICAgICAgMHhCNworLyogSU4gIGk6IGJ1ZmZlcmxlbjsgdjogb2Zmc2V0OyBidWZmZXIgd2l0aCBidWZmZXJsZW4gYnl0ZXMgKi8KKworI2RlZmluZSBSRUFEX1NUQVRVUyAgICAgICAgICAgMHhCOAorLyogSU4gIGk6IDA7IHY6IDA7IGJ1ZmZlcmxlbiAxMCAqLworCisjZGVmaW5lIFJFQURfVFVORVJfUkVHX1JFUSAgICAweEI5CisvKiBJTiAgaTogMDsgdjogcmVnaXN0ZXI7IGJbMF0gPSB2YWx1ZSAqLworCisjZGVmaW5lIFJFQURfRlgyX1JFR19SRVEgICAgICAweEJBCisvKiBJTiAgaTogb2Zmc2V0OyB2OiAwOyBiWzBdID0gdmFsdWUgKi8KKworI2RlZmluZSBXUklURV9GWDJfUkVHX1JFUSAgICAgMHhCQgorLyogT1VUIGk6IG9mZnNldDsgdjogdmFsdWUgdG8gd3JpdGU7IDEgYnl0ZSBleHRyYSBidWZmZXIgKi8KKworI2RlZmluZSBTRVRfVFVORVJfUE9XRVJfUkVRICAgMHhCQworLyogSU4gIGk6IDAgPSBwb3dlciBvZmYsIDEgPSBwb3dlciBvbiAqLworCisjZGVmaW5lIFdSSVRFX1RVTkVSX1JFR19SRVEgICAweEJECisvKiBJTiAgaTogcmVnaXN0ZXIsIHY6IHZhbHVlIHRvIHdyaXRlLCBubyBleHRyYSBidWZmZXIgKi8KKworI2RlZmluZSBSRVNFVF9UVU5FUiAgICAgICAgICAgMHhCRQorLyogSU4gIGk6IDAsIHY6IDAsIG5vIGV4dHJhIGJ1ZmZlciAqLworCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqIHZwNzAyeF9mZV9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKTsKKworZXh0ZXJuIGludCB2cDcwMnhfdXNiX2lub3V0X29wKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggKm8sIGludCBvbGVuLCB1OCAqaSwgaW50IGlsZW4sIGludCBtc2VjKTsKK2V4dGVybiBpbnQgdnA3MDJ4X3VzYl9pbm91dF9jbWQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCBjbWQsIHU4ICpvLCBpbnQgb2xlbiwgdTggKmksIGludCBpbGVuLCBpbnQgbXNlYyk7CitleHRlcm4gaW50IHZwNzAyeF91c2JfaW5fb3Aoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LCB1OCAqYiwgaW50IGJsZW4pOworZXh0ZXJuIGludCB2cDcwMnhfdXNiX291dF9vcChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHU4ICpiLCBpbnQgYmxlbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMKaW5kZXggOWFjOTVmNS4uMGY1N2FiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jCkBAIC0xNjQsNyArMTY0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IHZwNzA0NV9yZWFkX21hY19hZGRyKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCx1OCBtYWNbNl0pCiB7CiAJcmV0dXJuIHZwNzA0NV9yZWFkX2VlcHJvbShkLG1hYywgNiwgTUFDXzBfQUREUik7CkBAIC0xOTksNyArMTk4LDcgQEAKIHN0YXRpYyBpbnQgdnA3MDQ1X3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewotCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJnZwNzA0NV9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZ2cDcwNDVfcHJvcGVydGllcyxUSElTX01PRFVMRSxOVUxMKTsKIH0KIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHZwNzA0NV91c2JfdGFibGUgW10gPSB7CkBAIC0yNTYsOSArMjU1LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB2cDcwNDVfdXNiX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gImR2Yl91c2JfdnA3MDQ1IiwKLQkucHJvYmUgCQk9IHZwNzA0NV91c2JfcHJvYmUsCisJLnByb2JlCQk9IHZwNzA0NV91c2JfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAotCS5pZF90YWJsZSAJPSB2cDcwNDVfdXNiX3RhYmxlLAorCS5pZF90YWJsZQk9IHZwNzA0NV91c2JfdGFibGUsCiB9OwogCiAvKiBtb2R1bGUgc3R1ZmYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5jCmluZGV4IDgyMjJiODguLmQ0Yjk3OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgICAgY3gyNDExMCAtIFNpbmdsZSBDaGlwIFNhdGVsbGl0ZSBDaGFubmVsIFJlY2VpdmVyIGRyaXZlciBtb2R1bGUKIAotICAgIENvcHlyaWdodCAoQykgMjAwMiBQZXRlciBIZXR0a2FtcCA8cGV0ZXIuaGV0dGthbXBAdC1vbmxpbmUuZGU+IGJhc2VkIG9uCisgICAgQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIEhldHRrYW1wIDxwZXRlci5oZXR0a2FtcEBodHAtdGVsLmRlPiBiYXNlZCBvbgogICAgIHdvcmsKICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgQ29udmVyZ2VuY2UgSW50ZWdyYXRlZCBNZWRpYSBHbWJIIDxyYWxwaEBjb252ZXJnZW5jZS5kZT4KIApAQCAtMzg3LDggKzM4Nyw5IEBACiAKIHN0YXRpYyBpbnQgY3gyNDExMF9kaXNlcWNfc2VuZF9idXJzdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX21pbmlfY21kX3QgYnVyc3QpCiB7Ci0JaW50IHJ2LCBiaXQsIGk7CisJaW50IHJ2LCBiaXQ7CiAJc3RydWN0IGN4MjQxMTBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCiAJaWYgKGJ1cnN0ID09IFNFQ19NSU5JX0EpCiAJCWJpdCA9IDB4MDA7CkBAIC0zOTgsMTIgKzM5OSwxNCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJ2ID0gY3gyNDExMF9yZWFkcmVnKHN0YXRlLCAweDc3KTsKLQljeDI0MTEwX3dyaXRlcmVnKHN0YXRlLCAweDc3LCBydnwweDA0KTsKKwlpZiAoIShydiAmIDB4MDQpKQorCQljeDI0MTEwX3dyaXRlcmVnKHN0YXRlLCAweDc3LCBydiB8IDB4MDQpOwogCiAJcnYgPSBjeDI0MTEwX3JlYWRyZWcoc3RhdGUsIDB4NzYpOwogCWN4MjQxMTBfd3JpdGVyZWcoc3RhdGUsIDB4NzYsICgocnYgJiAweDkwKSB8IDB4NDAgfCBiaXQpKTsKLQlmb3IgKGkgPSA1MDA7IGktLSA+IDAgJiYgIShjeDI0MTEwX3JlYWRyZWcoc3RhdGUsMHg3NikmMHg0MCkgOyApCi0gICAgICAgICAgICAgIDsgLyogd2FpdCBmb3IgTE5CIHJlYWR5ICovCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisJd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpICYmICEoY3gyNDExMF9yZWFkcmVnKHN0YXRlLCAweDc2KSAmIDB4NDApKQorCQk7IC8qIHdhaXQgZm9yIExOQiByZWFkeSAqLwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MTMsMTcgKzQxNiwyMiBAQAogewogCWludCBpLCBydjsKIAlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY21kLT5tc2dfbGVuOyBpKyspCiAJCWN4MjQxMTBfd3JpdGVyZWcoc3RhdGUsIDB4NzkgKyBpLCBjbWQtPm1zZ1tpXSk7CiAKIAlydiA9IGN4MjQxMTBfcmVhZHJlZyhzdGF0ZSwgMHg3Nyk7Ci0JY3gyNDExMF93cml0ZXJlZyhzdGF0ZSwgMHg3NywgcnZ8MHgwNCk7CisJaWYgKHJ2ICYgMHgwNCkgeworCQljeDI0MTEwX3dyaXRlcmVnKHN0YXRlLCAweDc3LCBydiAmIH4weDA0KTsKKwkJbXNsZWVwKDMwKTsgLyogcmVwb3J0ZWRseSBmaXhlcyBzd2l0Y2hpbmcgcHJvYmxlbXMgKi8KKwl9CiAKIAlydiA9IGN4MjQxMTBfcmVhZHJlZyhzdGF0ZSwgMHg3Nik7CiAKIAljeDI0MTEwX3dyaXRlcmVnKHN0YXRlLCAweDc2LCAoKHJ2ICYgMHg5MCkgfCAweDQwKSB8ICgoY21kLT5tc2dfbGVuLTMpICYgMykpOwotCWZvciAoaT01MDA7IGktLSA+IDAgJiYgIShjeDI0MTEwX3JlYWRyZWcoc3RhdGUsMHg3NikmMHg0MCk7KQorCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOworCXdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSAmJiAhKGN4MjQxMTBfcmVhZHJlZyhzdGF0ZSwgMHg3NikgJiAweDQwKSkKIAkJOyAvKiB3YWl0IGZvciBMTkIgcmVhZHkgKi8KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmgKaW5kZXggNmI2NjNmNC4uYjYzZWNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAgICBjeDI0MTEwIC0gU2luZ2xlIENoaXAgU2F0ZWxsaXRlIENoYW5uZWwgUmVjZWl2ZXIgZHJpdmVyIG1vZHVsZQogCi0gICAgQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIEhldHRrYW1wIDxwZXRlci5oZXR0a2FtcEB0LW9ubGluZS5kZT4gYmFzZWQgb24KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgUGV0ZXIgSGV0dGthbXAgPHBldGVyLmhldHRrYW1wQGh0cC10ZWwuZGU+IGJhc2VkIG9uCiAgICAgd29yawogICAgIENvcHlyaWdodCAoQykgMTk5OSBDb252ZXJnZW5jZSBJbnRlZ3JhdGVkIE1lZGlhIEdtYkggPHJhbHBoQGNvbnZlcmdlbmNlLmRlPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMKaW5kZXggY2Q0MzRiNy4uMjE0MzNlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYwpAQCAtMjMsNyArMjMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jCmluZGV4IGNkMzM3MDUuLjQ0MWRlNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMKQEAgLTIyLDcgKzIyLDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmMKaW5kZXggMWYxY2Q3YS4uNzE0MmI5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmMKQEAgLTY5LDggKzY5LDggQEAKIH07CiAKIHN0YXRpYyBpbnQgaTJjX3dyaXRlX2RlbW9kX2J5dGVzIChzdHJ1Y3QgbGdkdDMzMHhfc3RhdGUqIHN0YXRlLAotCQkJICAgdTggKmJ1ZiwgLyogZGF0YSBieXRlcyB0byBzZW5kICovCi0JCQkgICBpbnQgbGVuICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gc2VuZCAqLyApCisJCQkJICB1OCAqYnVmLCAvKiBkYXRhIGJ5dGVzIHRvIHNlbmQgKi8KKwkJCQkgIGludCBsZW4gIC8qIG51bWJlciBvZiBieXRlcyB0byBzZW5kICovICkKIHsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPQogCQl7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKQEAgLTEyOSwxMyArMTI5LDEzIEBACiAJfTsKIAogCXJldCA9IGkyY193cml0ZV9kZW1vZF9ieXRlcyhzdGF0ZSwKLQkJCSAgICAgcmVzZXQsIHNpemVvZihyZXNldCkpOworCQkJCSAgICByZXNldCwgc2l6ZW9mKHJlc2V0KSk7CiAJaWYgKHJldCA9PSAwKSB7CiAKIAkJLyogZm9yY2UgcmVzZXQgaGlnaCAoaW5hY3RpdmUpIGFuZCB1bm1hc2sgaW50ZXJydXB0cyAqLwogCQlyZXNldFsxXSA9IDB4N2Y7CiAJCXJldCA9IGkyY193cml0ZV9kZW1vZF9ieXRlcyhzdGF0ZSwKLQkJCQkgICAgIHJlc2V0LCBzaXplb2YocmVzZXQpKTsKKwkJCQkJICAgIHJlc2V0LCBzaXplb2YocmVzZXQpKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE0OSwxMyArMTQ5LDEzIEBACiAJfTsKIAogCXJldCA9IGkyY193cml0ZV9kZW1vZF9ieXRlcyhzdGF0ZSwKLQkJCSAgICAgcmVzZXQsIHNpemVvZihyZXNldCkpOworCQkJCSAgICByZXNldCwgc2l6ZW9mKHJlc2V0KSk7CiAJaWYgKHJldCA9PSAwKSB7CiAKIAkJLyogZm9yY2UgcmVzZXQgaGlnaCAoaW5hY3RpdmUpICovCiAJCXJlc2V0WzFdID0gMHgwMTsKIAkJcmV0ID0gaTJjX3dyaXRlX2RlbW9kX2J5dGVzKHN0YXRlLAotCQkJCSAgICAgcmVzZXQsIHNpemVvZihyZXNldCkpOworCQkJCQkgICAgcmVzZXQsIHNpemVvZihyZXNldCkpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMTcyLDcgKzE3Miw2IEBACiAJfQogfQogCi0KIHN0YXRpYyBpbnQgbGdkdDMzMHhfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAkvKiBIYXJkd2FyZSByZXNldCBpcyBkb25lIHVzaW5nIGdwaW9bMF0gb2YgY3gyMzg4MHggY2hpcC4KQEAgLTIyOSwxMyArMjI4LDEzIEBACiAJY2FzZSBMR0RUMzMwMjoKIAkJY2hpcF9uYW1lID0gIkxHRFQzMzAyIjsKIAkJZXJyID0gaTJjX3dyaXRlX2RlbW9kX2J5dGVzKHN0YXRlLCBsZ2R0MzMwMl9pbml0X2RhdGEsCi0JCQkJCQkJCQlzaXplb2YobGdkdDMzMDJfaW5pdF9kYXRhKSk7Ci0gIAkJYnJlYWs7CisJCQkJCSAgICBzaXplb2YobGdkdDMzMDJfaW5pdF9kYXRhKSk7CisJCWJyZWFrOwogCWNhc2UgTEdEVDMzMDM6CiAJCWNoaXBfbmFtZSA9ICJMR0RUMzMwMyI7CiAJCWVyciA9IGkyY193cml0ZV9kZW1vZF9ieXRlcyhzdGF0ZSwgbGdkdDMzMDNfaW5pdF9kYXRhLAotCQkJCQkJCQkJc2l6ZW9mKGxnZHQzMzAzX2luaXRfZGF0YSkpOwotICAJCWJyZWFrOworCQkJCQkgICAgc2l6ZW9mKGxnZHQzMzAzX2luaXRfZGF0YSkpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQljaGlwX25hbWUgPSAidW5kZWZpbmVkIjsKIAkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIk9ubHkgTEdEVDMzMDIgYW5kIExHRFQzMzAzIGFyZSBzdXBwb3J0ZWQgY2hpcHMuXG4iKTsKQEAgLTI2MiwxNSArMjYxLDE1IEBACiAJc3dpdGNoIChzdGF0ZS0+Y29uZmlnLT5kZW1vZF9jaGlwKSB7CiAJY2FzZSBMR0RUMzMwMjoKIAkJZXJyID0gaTJjX3JlYWRfZGVtb2RfYnl0ZXMoc3RhdGUsIExHRFQzMzAyX1BBQ0tFVF9FUlJfQ09VTlRFUjEsCi0JCQkJCQkJCSAgYnVmLCBzaXplb2YoYnVmKSk7Ci0gIAkJYnJlYWs7CisJCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQlicmVhazsKIAljYXNlIExHRFQzMzAzOgogCQllcnIgPSBpMmNfcmVhZF9kZW1vZF9ieXRlcyhzdGF0ZSwgTEdEVDMzMDNfUEFDS0VUX0VSUl9DT1VOVEVSMSwKLQkJCQkJCQkJICBidWYsIHNpemVvZihidWYpKTsKLSAgCQlicmVhazsKKwkJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICJPbmx5IExHRFQzMzAyIGFuZCBMR0RUMzMwMyBhcmUgc3VwcG9ydGVkIGNoaXBzLlxuIik7CisJCSAgICAgICAiT25seSBMR0RUMzMwMiBhbmQgTEdEVDMzMDMgYXJlIHN1cHBvcnRlZCBjaGlwcy5cbiIpOwogCQllcnIgPSAtRU5PREVWOwogCX0KIApAQCAtMzMwLDcgKzMyOSw3IEBACiAKIAkJCWlmIChzdGF0ZS0+Y29uZmlnLT5kZW1vZF9jaGlwID09IExHRFQzMzAzKSB7CiAJCQkJZXJyID0gaTJjX3dyaXRlX2RlbW9kX2J5dGVzKHN0YXRlLCBsZ2R0MzMwM184dnNiXzQ0X2RhdGEsCi0JCQkJCQkJCQkJCXNpemVvZihsZ2R0MzMwM184dnNiXzQ0X2RhdGEpKTsKKwkJCQkJCQkgICAgc2l6ZW9mKGxnZHQzMzAzXzh2c2JfNDRfZGF0YSkpOwogCQkJfQogCQkJYnJlYWs7CiAKQEAgLTM3OCwxOCArMzc3LDE5IEBACiAKIAkJLyogU2VsZWN0IHRoZSByZXF1ZXN0ZWQgbW9kZSAqLwogCQlpMmNfd3JpdGVfZGVtb2RfYnl0ZXMoc3RhdGUsIHRvcF9jdHJsX2NmZywKLQkJCQkJCQkgIHNpemVvZih0b3BfY3RybF9jZmcpKTsKLQkJc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcyhmZSwgMCk7CisJCQkJICAgICAgc2l6ZW9mKHRvcF9jdHJsX2NmZykpOworCQlpZiAoc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcykKKwkJCXN0YXRlLT5jb25maWctPnNldF90c19wYXJhbXMoZmUsIDApOwogCQlzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uID0gcGFyYW0tPnUudnNiLm1vZHVsYXRpb247CiAJfQogCi0JLyogQ2hhbmdlIG9ubHkgaWYgd2UgYXJlIGFjdHVhbGx5IGNoYW5naW5nIHRoZSBjaGFubmVsICovCi0JaWYgKHN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeSAhPSBwYXJhbS0+ZnJlcXVlbmN5KSB7Ci0JCS8qIFR1bmUgdG8gdGhlIG5ldyBmcmVxdWVuY3kgKi8KKwkvKiBUdW5lIHRvIHRoZSBzcGVjaWZpZWQgZnJlcXVlbmN5ICovCisJaWYgKHN0YXRlLT5jb25maWctPnBsbF9zZXQpCiAJCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHBhcmFtKTsKLQkJLyogS2VlcCB0cmFjayBvZiB0aGUgbmV3IGZyZXF1ZW5jeSAqLwotCQlzdGF0ZS0+Y3VycmVudF9mcmVxdWVuY3kgPSBwYXJhbS0+ZnJlcXVlbmN5OwotCX0KKworCS8qIEtlZXAgdHJhY2sgb2YgdGhlIG5ldyBmcmVxdWVuY3kgKi8KKwlzdGF0ZS0+Y3VycmVudF9mcmVxdWVuY3kgPSBwYXJhbS0+ZnJlcXVlbmN5OworCiAJbGdkdDMzMHhfU3dSZXNldChzdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzNTIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5jCmluZGV4IGQzMmRjNGQuLmNjMWJjMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5jCkBAIC00NjIsOSArNDYyLDExIEBACiB7CiAJc3RydWN0IG10MzUyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCi0JdTE2IHNpZ25hbCA9ICgobXQzNTJfcmVhZF9yZWdpc3RlcihzdGF0ZSwgQUdDX0dBSU5fMSkgPDwgOCkgJiAweDBmKSB8Ci0JCSAgICAgIChtdDM1Ml9yZWFkX3JlZ2lzdGVyKHN0YXRlLCBBR0NfR0FJTl8wKSk7CisJLyogYWxpZ24gdGhlIDEyIGJpdCBBR0MgZ2FpbiB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgKi8KKwl1MTYgc2lnbmFsID0gKChtdDM1Ml9yZWFkX3JlZ2lzdGVyKHN0YXRlLCBBR0NfR0FJTl8xKSAmIDB4MGYpIDw8IDEyKSB8CisJCShtdDM1Ml9yZWFkX3JlZ2lzdGVyKHN0YXRlLCBBR0NfR0FJTl8wKSA8PCA0KTsKIAorCS8qIGludmVyc2Ugb2YgZ2FpbiBpcyBzaWduYWwgc3RyZW5ndGggKi8KIAkqc3RyZW5ndGggPSB+c2lnbmFsOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmMKaW5kZXggOTY2ZGU5OC4uODhhNTdiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jCkBAIC00ODIsNiArNDgyLDcgQEAKIAlpZiAoKHJlc3VsdCA9IG54dDYwMDBfc2V0X2ludmVyc2lvbihzdGF0ZSwgcGFyYW0tPmludmVyc2lvbikpIDwgMCkKIAkJcmV0dXJuIHJlc3VsdDsKIAorCW1zbGVlcCg1MDApOwogCXJldHVybiAwOwogfQogCkBAIC01MjUsNiArNTI2LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbnh0NjAwMF9mZV9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICp0dW5lKQoreworCXR1bmUtPm1pbl9kZWxheV9tcyA9IDUwMDsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG54dDYwMDBfb3BzOwogCiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBueHQ2MDAwX2F0dGFjaChjb25zdCBzdHJ1Y3Qgbnh0NjAwMF9jb25maWcqIGNvbmZpZywKQEAgLTU3OCw2ICs1ODUsOCBAQAogCiAJLmluaXQgPSBueHQ2MDAwX2luaXQsCiAKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBueHQ2MDAwX2ZlX2dldF90dW5lX3NldHRpbmdzLAorCiAJLnNldF9mcm9udGVuZCA9IG54dDYwMDBfc2V0X2Zyb250ZW5kLAogCiAJLnJlYWRfc3RhdHVzID0gbnh0NjAwMF9yZWFkX3N0YXR1cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5jCmluZGV4IGNjMGE3N2MuLmI2ZDBlZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuYwpAQCAtMzcwLDIyICszNzAsMTkgQEAKIAkJb3I1MTEzMl9zZXRtb2RlKGZlKTsKIAl9CiAKLQkvKiBDaGFuZ2Ugb25seSBpZiB3ZSBhcmUgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIGNoYW5uZWwgKi8KLQlpZiAoc3RhdGUtPmN1cnJlbnRfZnJlcXVlbmN5ICE9IHBhcmFtLT5mcmVxdWVuY3kpIHsKLQkJZHZiX3BsbF9jb25maWd1cmUoc3RhdGUtPmNvbmZpZy0+cGxsX2Rlc2MsIGJ1ZiwKLQkJCQkgIHBhcmFtLT5mcmVxdWVuY3ksIDApOwotCQlkcHJpbnRrKCJzZXRfcGFyYW1ldGVycyB0dW5lciBieXRlczogMHglMDJ4IDB4JTAyeCAiCi0JCQkiMHglMDJ4IDB4JTAyeFxuIixidWZbMF0sYnVmWzFdLGJ1ZlsyXSxidWZbM10pOwotCQlpZiAoaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPnBsbF9hZGRyZXNzICxidWYsIDQpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogc2V0X3BhcmFtZXRlcnMgZXJyb3IgIgotCQkJICAgICAgICJ3cml0aW5nIHRvIHR1bmVyXG4iKTsKKwlkdmJfcGxsX2NvbmZpZ3VyZShzdGF0ZS0+Y29uZmlnLT5wbGxfZGVzYywgYnVmLAorCQkJICBwYXJhbS0+ZnJlcXVlbmN5LCAwKTsKKwlkcHJpbnRrKCJzZXRfcGFyYW1ldGVycyB0dW5lciBieXRlczogMHglMDJ4IDB4JTAyeCAiCisJCSIweCUwMnggMHglMDJ4XG4iLGJ1ZlswXSxidWZbMV0sYnVmWzJdLGJ1ZlszXSk7CisJaWYgKGkyY193cml0ZWJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5wbGxfYWRkcmVzcyAsYnVmLCA0KSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogc2V0X3BhcmFtZXRlcnMgZXJyb3IgIgorCQkgICAgICAgIndyaXRpbmcgdG8gdHVuZXJcbiIpOwogCi0JCS8qIFNldCB0byBjdXJyZW50IG1vZGUgKi8KLQkJb3I1MTEzMl9zZXRtb2RlKGZlKTsKKwkvKiBTZXQgdG8gY3VycmVudCBtb2RlICovCisJb3I1MTEzMl9zZXRtb2RlKGZlKTsKIAotCQkvKiBVcGRhdGUgY3VycmVudCBmcmVxdWVuY3kgKi8KLQkJc3RhdGUtPmN1cnJlbnRfZnJlcXVlbmN5ID0gcGFyYW0tPmZyZXF1ZW5jeTsKLQl9CisJLyogVXBkYXRlIGN1cnJlbnQgZnJlcXVlbmN5ICovCisJc3RhdGUtPmN1cnJlbnRfZnJlcXVlbmN5ID0gcGFyYW0tPmZyZXF1ZW5jeTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmMKaW5kZXggNGYzOTZhYy4uYzdmZTI3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jCkBAIC00OCw3ICs0OCw4IEBACiB9OwogCiBzdGF0aWMgdTMyIHM1aDE0MjBfZ2V0c3ltYm9scmF0ZShzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpOwotc3RhdGljIGludCBzNWgxNDIwX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpOworc3RhdGljIGludCBzNWgxNDIwX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCSAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzKiBmZXNldHRpbmdzKTsKIAogCiBzdGF0aWMgaW50IGRlYnVnID0gMDsKQEAgLTkxLDcgKzkyLDggQEAKIAogCXN3aXRjaCh2b2x0YWdlKSB7CiAJY2FzZSBTRUNfVk9MVEFHRV8xMzoKLQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYywgKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYykgJiAweGZlKSB8IDB4MDIpOworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDNjLAorCQkJCSAoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNjKSAmIDB4ZmUpIHwgMHgwMik7CiAJCWJyZWFrOwogCiAJY2FzZSBTRUNfVk9MVEFHRV8xODoKQEAgLTExMiwxOCArMTE0LDIxIEBACiAKIAlzd2l0Y2godG9uZSkgewogCWNhc2UgU0VDX1RPTkVfT046Ci0JCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHg3NCkgfCAweDA4KTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwKKwkJCQkgKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgJiAweDc0KSB8IDB4MDgpOwogCQlicmVhazsKIAogCWNhc2UgU0VDX1RPTkVfT0ZGOgotCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDNiLCAoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSAmIDB4NzQpIHwgMHgwMSk7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsCisJCQkJIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHg3NCkgfCAweDAxKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczVoMTQyMF9zZW5kX21hc3Rlcl9jbWQgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kKiBjbWQpCitzdGF0aWMgaW50IHM1aDE0MjBfc2VuZF9tYXN0ZXJfY21kIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgICAgc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCogY21kKQogewogCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IHZhbDsKQEAgLTEzMSw2ICsxMzYsOSBAQAogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAlpbnQgcmVzdWx0ID0gMDsKIAorCWlmIChjbWQtPm1zZ19sZW4gPiA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCS8qIHNldHVwIGZvciBESVNFUUMgKi8KIAl2YWwgPSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpOwogCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIDB4MDIpOwpAQCAtMTM4LDE2ICsxNDYsMTcgQEAKIAogCS8qIHdyaXRlIHRoZSBESVNFUUMgY29tbWFuZCBieXRlcyAqLwogCWZvcihpPTA7IGk8IGNtZC0+bXNnX2xlbjsgaSsrKSB7Ci0JCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2MgKyBpLCBjbWQtPm1zZ1tpXSk7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2QgKyBpLCBjbWQtPm1zZ1tpXSk7CiAJfQogCiAJLyoga2ljayBvZmYgdHJhbnNtaXNzaW9uICovCi0JczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSB8ICgoY21kLT5tc2dfbGVuLTEpIDw8IDQpIHwgMHgwOCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSB8CisJCQkJICAgICAgKChjbWQtPm1zZ19sZW4tMSkgPDwgNCkgfCAweDA4KTsKIAogCS8qIHdhaXQgZm9yIHRyYW5zbWlzc2lvbiB0byBjb21wbGV0ZSAqLwogCXRpbWVvdXQgPSBqaWZmaWVzICsgKCgxMDAqSFopIC8gMTAwMCk7CiAJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKLQkJaWYgKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgJiAweDA4KQorCQlpZiAoIShzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHgwOCkpCiAJCQlicmVhazsKIAogCQltc2xlZXAoNSk7CkBAIC0xNjEsNyArMTcwLDggQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW50IHM1aDE0MjBfcmVjdl9zbGF2ZV9yZXBseSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZGlzZXFjX3NsYXZlX3JlcGx5KiByZXBseSkKK3N0YXRpYyBpbnQgczVoMTQyMF9yZWN2X3NsYXZlX3JlcGx5IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgICAgIHN0cnVjdCBkdmJfZGlzZXFjX3NsYXZlX3JlcGx5KiByZXBseSkKIHsKIAlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1OCB2YWw7CkBAIC0yMDUsNyArMjE1LDcgQEAKIAogCS8qIGV4dHJhY3QgZGF0YSAqLwogCWZvcihpPTA7IGk8IGxlbmd0aDsgaSsrKSB7Ci0JCXJlcGx5LT5tc2dbaV0gPSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2MgKyBpKTsKKwkJcmVwbHktPm1zZ1tpXSA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzZCArIGkpOwogCX0KIAogZXhpdDoKQEAgLTIzNiw3ICsyNDYsNyBAQAogCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgfCAweDA4KTsKIAogCS8qIHdhaXQgZm9yIHRyYW5zbWlzc2lvbiB0byBjb21wbGV0ZSAqLwotCXRpbWVvdXQgPSBqaWZmaWVzICsgKCgyMCpIWikgLyAxMDAwKTsKKwl0aW1lb3V0ID0gamlmZmllcyArICgoMTAwKkhaKSAvIDEwMDApOwogCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCWlmICghKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgJiAweDA4KSkKIAkJCWJyZWFrOwpAQCAtMjU5LDkgKzI2OSw5IEBACiAKIAl2YWwgPSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MTQpOwogCWlmICh2YWwgJiAweDAyKQotCQlzdGF0dXMgfD0gIEZFX0hBU19TSUdOQUw7IC8vIEZJWE1FOiBub3Qgc3VyZSBpZiB0aGlzIGlzIHJpZ2h0CisJCXN0YXR1cyB8PSAgRkVfSEFTX1NJR05BTDsKIAlpZiAodmFsICYgMHgwMSkKLQkJc3RhdHVzIHw9ICBGRV9IQVNfQ0FSUklFUjsgLy8gRklYTUU6IG5vdCBzdXJlIGlmIHRoaXMgaXMgcmlnaHQKKwkJc3RhdHVzIHw9ICBGRV9IQVNfQ0FSUklFUjsKIAl2YWwgPSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MzYpOwogCWlmICh2YWwgJiAweDAxKQogCQlzdGF0dXMgfD0gIEZFX0hBU19WSVRFUkJJOwpAQCAtMjg0LDggKzI5NCw4IEBACiAJLyogZGV0ZXJtaW5lIGxvY2sgc3RhdGUgKi8KIAkqc3RhdHVzID0gczVoMTQyMF9nZXRfc3RhdHVzX2JpdHMoc3RhdGUpOwogCi0JLyogZml4IGZvciBGRUMgNS82IGludmVyc2lvbiBpc3N1ZSAtIGlmIGl0IGRvZXNuJ3QgcXVpdGUgbG9jaywgaW52ZXJ0IHRoZSBpbnZlcnNpb24sCi0Jd2FpdCBhIGJpdCBhbmQgY2hlY2sgYWdhaW4gKi8KKwkvKiBmaXggZm9yIEZFQyA1LzYgaW52ZXJzaW9uIGlzc3VlIC0gaWYgaXQgZG9lc24ndCBxdWl0ZSBsb2NrLCBpbnZlcnQKKwl0aGUgaW52ZXJzaW9uLCB3YWl0IGEgYml0IGFuZCBjaGVjayBhZ2FpbiAqLwogCWlmICgqc3RhdHVzID09IChGRV9IQVNfU0lHTkFMfEZFX0hBU19DQVJSSUVSfEZFX0hBU19WSVRFUkJJKSkgewogCQl2YWwgPSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MzIpOwogCQlpZiAoKHZhbCAmIDB4MDcpID09IDB4MDMpIHsKQEAgLTMzMCw2ICszNDAsMTAgQEAKIAkJCXRtcCA9ICh0bXAgKiAyICogNykgLyA4OwogCQkJYnJlYWs7CiAJCX0KKwkJaWYgKHRtcCA9PSAwKSB7CisJCQlwcmludGsoInM1aDE0MjA6IGF2b2lkZWQgZGl2aXNpb24gYnkgMFxuIik7CisJCQl0bXAgPSAxOworCQl9CiAJCXRtcCA9IHN0YXRlLT5mY2xrIC8gdG1wOwogCiAJCS8qIHNldCB0aGUgTVBFR19DTEtfSU5UTCBmb3IgdGhlIGNhbGN1bGF0ZWQgZGF0YSByYXRlICovCkBAIC0zNjgsMTYgKzM4MiwyMSBAQAogCiAJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHg0NiwgMHgxZCk7CiAJbWRlbGF5KDI1KTsKLQlyZXR1cm4gKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHg0OCkgPDwgOCkgfCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDcpOworCisJKmJlciA9IChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDgpIDw8IDgpIHwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDQ3KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHM1aDE0MjBfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc3RyZW5ndGgpCiB7CiAJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKLQl1OCB2YWwgPSAweGZmIC0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDE1KTsKKwl1OCB2YWwgPSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MTUpOwogCi0JcmV0dXJuIChpbnQpICgodmFsIDw8IDgpIHwgdmFsKTsKKwkqc3RyZW5ndGggPSAgKHUxNikgKCh2YWwgPDwgOCkgfCB2YWwpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgczVoMTQyMF9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIHVjYmxvY2tzKQpAQCAtMzg2LDcgKzQwNSwxMCBAQAogCiAJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHg0NiwgMHgxZik7CiAJbWRlbGF5KDI1KTsKLQlyZXR1cm4gKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHg0OCkgPDwgOCkgfCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDcpOworCisJKnVjYmxvY2tzID0gKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHg0OCkgPDwgOCkgfCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDcpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHM1aDE0MjBfcmVzZXQoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKQpAQCAtMzk2LDExICs0MTgsMTIgQEAKIAl1ZGVsYXkoMTApOwogfQogCi1zdGF0aWMgdm9pZCBzNWgxNDIwX3NldHN5bWJvbHJhdGUoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCitzdGF0aWMgdm9pZCBzNWgxNDIwX3NldHN5bWJvbHJhdGUoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLAorCQkJCSAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewogCXU2NCB2YWw7CiAKLQl2YWwgPSAocC0+dS5xcHNrLnN5bWJvbF9yYXRlIC8gMTAwMCkgKiAoMTw8MjQpOworCXZhbCA9ICgodTY0KSBwLT51LnFwc2suc3ltYm9sX3JhdGUgLyAxMDAwVUxMKSAqICgxVUxMPDwyNCk7CiAJaWYgKHAtPnUucXBzay5zeW1ib2xfcmF0ZSA8PSAyMTAwMDAwMCkgewogCQl2YWwgKj0gMjsKIAl9CkBAIC00MTUsNyArNDM4LDcgQEAKIAogc3RhdGljIHUzMiBzNWgxNDIwX2dldHN5bWJvbHJhdGUoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKQogewotCXU2NCB2YWw7CisJdTY0IHZhbCA9IDA7CiAJaW50IHNhbXBsaW5nID0gMjsKIAogCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDUpICYgMHgyKQpAQCAtNDI3LDEwICs0NTAsMTAgQEAKIAl2YWwgfD0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDEzKTsKIAlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA2LCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDYpICYgMHhmNyk7CiAKLQl2YWwgKj0gKHN0YXRlLT5mY2xrIC8gMTAwMCk7CisJdmFsICo9IChzdGF0ZS0+ZmNsayAvIDEwMDBVTEwpOwogCWRvX2Rpdih2YWwsICgoMTw8MjQpICogc2FtcGxpbmcpKTsKIAotCXJldHVybiAodTMyKSAodmFsICogMTAwMCk7CisJcmV0dXJuICh1MzIpICh2YWwgKiAxMDAwVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgczVoMTQyMF9zZXRmcmVxb2Zmc2V0KHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwgaW50IGZyZXFvZmZzZXQpCkBAIC00NjMsNDYgKzQ4Niw1NSBAQAogCiAJLyogcmVtZW1iZXIgZnJlcW9mZnNldCBpcyBpbiBrSHosIGJ1dCB0aGUgY2hpcCB3YW50cyB0aGUgb2Zmc2V0IGluIEh6LCBzbwogCSAqIGRpdmlkZSBmY2xrIGJ5IDEwMDAwMDAgdG8gZ2V0IHRoZSBjb3JyZWN0IHZhbHVlLiAqLwotCXZhbCA9IC0gKCh2YWwgKiAoc3RhdGUtPmZjbGsvMTAwMDAwMCkpIC8gKDE8PDI0KSk7CisJdmFsID0gKCgoLXZhbCkgKiAoc3RhdGUtPmZjbGsvMTAwMDAwMCkpIC8gKDE8PDI0KSk7CiAKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgdm9pZCBzNWgxNDIwX3NldGZlYyhzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3N0YXRpYyB2b2lkIHM1aDE0MjBfc2V0ZmVjX2ludmVyc2lvbihzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUsCisJCQkgICAJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7CisJdTggaW52ZXJzaW9uID0gMDsKKworCWlmIChwLT5pbnZlcnNpb24gPT0gSU5WRVJTSU9OX09GRikgeworCQlpbnZlcnNpb24gPSBzdGF0ZS0+Y29uZmlnLT5pbnZlcnQgPyAweDA4IDogMDsKKwl9IGVsc2UgaWYgKHAtPmludmVyc2lvbiA9PSBJTlZFUlNJT05fT04pIHsKKwkJaW52ZXJzaW9uID0gc3RhdGUtPmNvbmZpZy0+aW52ZXJ0ID8gMCA6IDB4MDg7CisJfQorCiAJaWYgKChwLT51LnFwc2suZmVjX2lubmVyID09IEZFQ19BVVRPKSB8fCAocC0+aW52ZXJzaW9uID09IElOVkVSU0lPTl9BVVRPKSkgewotCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDAwKTsKIAkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgzZik7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MDAgfCBpbnZlcnNpb24pOwogCX0gZWxzZSB7CiAJCXN3aXRjaChwLT51LnFwc2suZmVjX2lubmVyKSB7CiAJCWNhc2UgRkVDXzFfMjoKLQkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTApOwogCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgwMSk7CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDEwIHwgaW52ZXJzaW9uKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgRkVDXzJfMzoKLQkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTEpOwogCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgwMik7CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDExIHwgaW52ZXJzaW9uKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgRkVDXzNfNDoKLQkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTIpOwogCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgwNCk7Ci0JCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTIgfCBpbnZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKIAkJY2FzZSBGRUNfNV82OgotCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMyk7CiAJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDA4KTsKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTMgfCBpbnZlcnNpb24pOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBGRUNfNl83OgotCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxNCk7CiAJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDEwKTsKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTQgfCBpbnZlcnNpb24pOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBGRUNfN184OgotCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxNSk7CiAJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDIwKTsKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTUgfCBpbnZlcnNpb24pOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKQEAgLTUzNiwyMiArNTY4LDYgQEAKIAlyZXR1cm4gRkVDX05PTkU7CiB9CiAKLXN0YXRpYyB2b2lkIHM1aDE0MjBfc2V0aW52ZXJzaW9uKHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQotewotCWlmICgocC0+dS5xcHNrLmZlY19pbm5lciA9PSBGRUNfQVVUTykgfHwgKHAtPmludmVyc2lvbiA9PSBJTlZFUlNJT05fQVVUTykpIHsKLQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgwMCk7Ci0JCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4M2YpOwotCX0gZWxzZSB7Ci0JCXU4IHRtcCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzMSkgJiAweGY3OwotCQkJdG1wIHw9IDB4MTA7Ci0KLQkJaWYgKHAtPmludmVyc2lvbiA9PSBJTlZFUlNJT05fT04pCi0JCQl0bXAgfD0gMHg4MDsKLQotCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCB0bXApOwotCX0KLX0KLQogc3RhdGljIGZlX3NwZWN0cmFsX2ludmVyc2lvbl90IHM1aDE0MjBfZ2V0aW52ZXJzaW9uKHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSkKIHsKIAlpZiAoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDMyKSAmIDB4MDgpCkBAIC01NjAsMzUgKzU3NiwzNSBAQAogCXJldHVybiBJTlZFUlNJT05fT0ZGOwogfQogCi1zdGF0aWMgaW50IHM1aDE0MjBfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCitzdGF0aWMgaW50IHM1aDE0MjBfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKIAlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQl1MzIgZnJlcXVlbmN5X2RlbHRhOworCWludCBmcmVxdWVuY3lfZGVsdGE7CiAJc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzIGZlc2V0dGluZ3M7CisJdTMyIHRtcDsKIAogCS8qIGNoZWNrIGlmIHdlIHNob3VsZCBkbyBhIGZhc3QtdHVuZSAqLwogCW1lbWNweSgmZmVzZXR0aW5ncy5wYXJhbWV0ZXJzLCBwLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKSk7CiAJczVoMTQyMF9nZXRfdHVuZV9zZXR0aW5ncyhmZSwgJmZlc2V0dGluZ3MpOwogCWZyZXF1ZW5jeV9kZWx0YSA9IHAtPmZyZXF1ZW5jeSAtIHN0YXRlLT50dW5lZGZyZXE7Ci0JaWYgKChmcmVxdWVuY3lfZGVsdGEgPiAtZmVzZXR0aW5ncy5tYXhfZHJpZnQpICYmIChmcmVxdWVuY3lfZGVsdGEgPCBmZXNldHRpbmdzLm1heF9kcmlmdCkgJiYKKwlpZiAoKGZyZXF1ZW5jeV9kZWx0YSA+IC1mZXNldHRpbmdzLm1heF9kcmlmdCkgJiYKKwkgICAgKGZyZXF1ZW5jeV9kZWx0YSA8IGZlc2V0dGluZ3MubWF4X2RyaWZ0KSAmJgogCSAgICAoZnJlcXVlbmN5X2RlbHRhICE9IDApICYmCiAJICAgIChzdGF0ZS0+ZmVjX2lubmVyID09IHAtPnUucXBzay5mZWNfaW5uZXIpICYmCiAJICAgIChzdGF0ZS0+c3ltYm9sX3JhdGUgPT0gcC0+dS5xcHNrLnN5bWJvbF9yYXRlKSkgewogCi0JCXM1aDE0MjBfc2V0ZnJlcW9mZnNldChzdGF0ZSwgZnJlcXVlbmN5X2RlbHRhKTsKKwkJaWYgKHN0YXRlLT5jb25maWctPnBsbF9zZXQpIHsKKwkJCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAyLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsMHgwMikgfCAxKTsKKwkJCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHAsICZ0bXApOworCQkJczVoMTQyMF9zZXRmcmVxb2Zmc2V0KHN0YXRlLCBwLT5mcmVxdWVuY3kgLSB0bXApOworCQl9CiAJCXJldHVybiAwOwogCX0KIAogCS8qIGZpcnN0IG9mIGFsbCwgc29mdHdhcmUgcmVzZXQgKi8KIAlzNWgxNDIwX3Jlc2V0KHN0YXRlKTsKIAotCS8qIHNldCB0dW5lciBQTEwgKi8KLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX3NldCkgewotCQlzNWgxNDIwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLDB4MDIpIHwgMSk7Ci0JCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHAsICZzdGF0ZS0+dHVuZWRmcmVxKTsKLQkJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDIsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwweDAyKSAmIDB4ZmUpOwotCX0KLQogCS8qIHNldCBzNWgxNDIwIGZjbGsgUExMIGFjY29yZGluZyB0byBkZXNpcmVkIHN5bWJvbCByYXRlICovCiAJaWYgKHAtPnUucXBzay5zeW1ib2xfcmF0ZSA+IDI4MDAwMDAwKSB7CiAJCXN0YXRlLT5mY2xrID0gODgwMDAwMDA7CkBAIC02MDksOCArNjI1LDkgQEAKIAogCS8qIHNldCBtaXNjIHJlZ2lzdGVycyAqLwogCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDIsIDB4MDApOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDYsIDB4MDApOwogCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDcsIDB4YjApOwotCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MGEsIDB4NjcpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MGEsIDB4ZTcpOwogCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MGIsIDB4NzgpOwogCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MGMsIDB4NDgpOwogCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MGQsIDB4NmIpOwpAQCAtNjI2LDIxICs2NDMsMjYgQEAKIAkvKiBzdGFydCBRUFNLICovCiAJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA1KSB8IDEpOwogCi0JLyogc2V0IHRoZSBmcmVxdWVuY3kgb2Zmc2V0IHRvIGFkanVzdCBmb3IgUExMIGluYWNjdXJhY3kgKi8KLQlzNWgxNDIwX3NldGZyZXFvZmZzZXQoc3RhdGUsIHAtPmZyZXF1ZW5jeSAtIHN0YXRlLT50dW5lZGZyZXEpOworCS8qIHNldCB0dW5lciBQTEwgKi8KKwlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX3NldCkgeworCQlzNWgxNDIwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLDB4MDIpIHwgMSk7CisJCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHAsICZ0bXApOworCQlzNWgxNDIwX3NldGZyZXFvZmZzZXQoc3RhdGUsIDApOworCX0KIAogCS8qIHNldCB0aGUgcmVzZXQgb2YgdGhlIHBhcmFtZXRlcnMgKi8KIAlzNWgxNDIwX3NldHN5bWJvbHJhdGUoc3RhdGUsIHApOwotCXM1aDE0MjBfc2V0aW52ZXJzaW9uKHN0YXRlLCBwKTsKLQlzNWgxNDIwX3NldGZlYyhzdGF0ZSwgcCk7CisJczVoMTQyMF9zZXRmZWNfaW52ZXJzaW9uKHN0YXRlLCBwKTsKIAogCXN0YXRlLT5mZWNfaW5uZXIgPSBwLT51LnFwc2suZmVjX2lubmVyOwogCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IHAtPnUucXBzay5zeW1ib2xfcmF0ZTsKIAlzdGF0ZS0+cG9zdGxvY2tlZCA9IDA7CisJc3RhdGUtPnR1bmVkZnJlcSA9IHAtPmZyZXF1ZW5jeTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzNWgxNDIwX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQorc3RhdGljIGludCBzNWgxNDIwX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7CiAJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKQEAgLTY1Miw3ICs2NzQsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHM1aDE0MjBfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyogZmVzZXR0aW5ncykKK3N0YXRpYyBpbnQgczVoMTQyMF9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyogZmVzZXR0aW5ncykKIHsKIAlpZiAoZmVzZXR0aW5ncy0+cGFyYW1ldGVycy51LnFwc2suc3ltYm9sX3JhdGUgPiAyMDAwMDAwMCkgewogCQlmZXNldHRpbmdzLT5taW5fZGVsYXlfbXMgPSA1MDsKQEAgLTcxNyw3ICs3NDAsOCBAQAogCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgczVoMTQyMF9vcHM7CiAKLXN0cnVjdCBkdmJfZnJvbnRlbmQqIHM1aDE0MjBfYXR0YWNoKGNvbnN0IHN0cnVjdCBzNWgxNDIwX2NvbmZpZyogY29uZmlnLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYykKK3N0cnVjdCBkdmJfZnJvbnRlbmQqIHM1aDE0MjBfYXR0YWNoKGNvbnN0IHN0cnVjdCBzNWgxNDIwX2NvbmZpZyogY29uZmlnLAorCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYykKIHsKIAlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBOVUxMOwogCXU4IGlkZW50aXR5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmgKaW5kZXggYjY4N2ZjNy4uODcyMDI4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5oCkBAIC0zMCw2ICszMCw5IEBACiAJLyogdGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KIAl1OCBkZW1vZF9hZGRyZXNzOwogCisJLyogZG9lcyB0aGUgaW52ZXJzaW9uIHJlcXVpcmUgaW52ZXJzaW9uPyAqLworCXU4IGludmVydDoxOworCiAJLyogUExMIG1haW50ZW5hbmNlICovCiAJaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKIAlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHUzMiogZnJlcW91dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuYwppbmRleCA5MjhhY2EwLi44ZDA5YWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMKQEAgLTM1LDcgKzM1LDYgQEAKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwogCiAJdW5zaWduZWQgbG9uZyBiYXNlX2ZyZXE7Ci0JdTggcHdtOwogfTsKIAogI2lmIDEKQEAgLTQ2LDk0ICs0NSw2IEBACiAKICNkZWZpbmUgU1RWMDI5N19DTE9DS19LSFogICAyODkwMAogCi1zdGF0aWMgdTggaW5pdF90YWJbXSA9IHsKLQkweDAwLCAweDA5LAotCTB4MDEsIDB4NjksCi0JMHgwMywgMHgwMCwKLQkweDA0LCAweDAwLAotCTB4MDcsIDB4MDAsCi0JMHgwOCwgMHgwMCwKLQkweDIwLCAweDAwLAotCTB4MjEsIDB4NDAsCi0JMHgyMiwgMHgwMCwKLQkweDIzLCAweDAwLAotCTB4MjQsIDB4NDAsCi0JMHgyNSwgMHg4OCwKLQkweDMwLCAweGZmLAotCTB4MzEsIDB4MDAsCi0JMHgzMiwgMHhmZiwKLQkweDMzLCAweDAwLAotCTB4MzQsIDB4NTAsCi0JMHgzNSwgMHg3ZiwKLQkweDM2LCAweDAwLAotCTB4MzcsIDB4MjAsCi0JMHgzOCwgMHgwMCwKLQkweDQwLCAweDFjLAotCTB4NDEsIDB4ZmYsCi0JMHg0MiwgMHgyOSwKLQkweDQzLCAweDAwLAotCTB4NDQsIDB4ZmYsCi0JMHg0NSwgMHgwMCwKLQkweDQ2LCAweDAwLAotCTB4NDksIDB4MDQsCi0JMHg0YSwgMHhmZiwKLQkweDRiLCAweDdmLAotCTB4NTIsIDB4MzAsCi0JMHg1NSwgMHhhZSwKLQkweDU2LCAweDQ3LAotCTB4NTcsIDB4ZTEsCi0JMHg1OCwgMHgzYSwKLQkweDVhLCAweDFlLAotCTB4NWIsIDB4MzQsCi0JMHg2MCwgMHgwMCwKLQkweDYzLCAweDAwLAotCTB4NjQsIDB4MDAsCi0JMHg2NSwgMHgwMCwKLQkweDY2LCAweDAwLAotCTB4NjcsIDB4MDAsCi0JMHg2OCwgMHgwMCwKLQkweDY5LCAweDAwLAotCTB4NmEsIDB4MDIsCi0JMHg2YiwgMHgwMCwKLQkweDcwLCAweGZmLAotCTB4NzEsIDB4MDAsCi0JMHg3MiwgMHgwMCwKLQkweDczLCAweDAwLAotCTB4NzQsIDB4MGMsCi0JMHg4MCwgMHgwMCwKLQkweDgxLCAweDAwLAotCTB4ODIsIDB4MDAsCi0JMHg4MywgMHgwMCwKLQkweDg0LCAweDA0LAotCTB4ODUsIDB4ODAsCi0JMHg4NiwgMHgyNCwKLQkweDg3LCAweDc4LAotCTB4ODgsIDB4MDAsCi0JMHg4OSwgMHgwMCwKLQkweDkwLCAweDAxLAotCTB4OTEsIDB4MDEsCi0JMHhhMCwgMHgwMCwKLQkweGExLCAweDAwLAotCTB4YTIsIDB4MDAsCi0JMHhiMCwgMHg5MSwKLQkweGIxLCAweDBiLAotCTB4YzAsIDB4NTMsCi0JMHhjMSwgMHg3MCwKLQkweGMyLCAweDEyLAotCTB4ZDAsIDB4MDAsCi0JMHhkMSwgMHgwMCwKLQkweGQyLCAweDAwLAotCTB4ZDMsIDB4MDAsCi0JMHhkNCwgMHgwMCwKLQkweGQ1LCAweDAwLAotCTB4ZGUsIDB4MDAsCi0JMHhkZiwgMHgwMCwKLQkweDYxLCAweDQ5LAotCTB4NjIsIDB4MGIsCi0JMHg1MywgMHgwOCwKLQkweDU5LCAweDA4LAotfTsKLQogCiBzdGF0aWMgaW50IHN0djAyOTdfd3JpdGVyZWcoc3RydWN0IHN0djAyOTdfc3RhdGUgKnN0YXRlLCB1OCByZWcsIHU4IGRhdGEpCiB7CkBAIC0zNzgsMzQgKzI4OSw5IEBACiAJc3RydWN0IHN0djAyOTdfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IGk7CiAKLQkvKiBzb2Z0IHJlc2V0ICovCi0Jc3R2MDI5N193cml0ZXJlZ19tYXNrKHN0YXRlLCAweDgwLCAxLCAxKTsKLQlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4ODAsIDEsIDApOwotCi0JLyogcmVzZXQgZGVpbnRlcmxlYXZlciAqLwotCXN0djAyOTdfd3JpdGVyZWdfbWFzayhzdGF0ZSwgMHg4MSwgMSwgMSk7Ci0Jc3R2MDI5N193cml0ZXJlZ19tYXNrKHN0YXRlLCAweDgxLCAxLCAwKTsKLQogCS8qIGxvYWQgaW5pdCB0YWJsZSAqLwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaW5pdF90YWIpOyBpICs9IDIpIHsKLQkJc3R2MDI5N193cml0ZXJlZyhzdGF0ZSwgaW5pdF90YWJbaV0sIGluaXRfdGFiW2kgKyAxXSk7Ci0JfQotCi0JLyogc2V0IGEgZHVtbXkgc3ltYm9sIHJhdGUgKi8KLQlzdHYwMjk3X3NldF9zeW1ib2xyYXRlKHN0YXRlLCA2OTAwKTsKLQotCS8qIGludmVydCBBR0MxIHBvbGFyaXR5ICovCi0Jc3R2MDI5N193cml0ZXJlZ19tYXNrKHN0YXRlLCAweDg4LCAweDEwLCAweDEwKTsKLQotCS8qIHNldHVwIGJpdCBlcnJvciBjb3VudGluZyAqLwotCXN0djAyOTdfd3JpdGVyZWdfbWFzayhzdGF0ZSwgMHhBMCwgMHg4MCwgMHgwMCk7Ci0Jc3R2MDI5N193cml0ZXJlZ19tYXNrKHN0YXRlLCAweEEwLCAweDEwLCAweDAwKTsKLQlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4QTAsIDB4MDgsIDB4MDApOwotCXN0djAyOTdfd3JpdGVyZWdfbWFzayhzdGF0ZSwgMHhBMCwgMHgwNywgMHgwNCk7Ci0KLQkvKiBtaW4gKyBtYXggUFdNICovCi0Jc3R2MDI5N193cml0ZXJlZyhzdGF0ZSwgMHg0YSwgMHgwMCk7Ci0Jc3R2MDI5N193cml0ZXJlZyhzdGF0ZSwgMHg0Yiwgc3RhdGUtPnB3bSk7CisJZm9yIChpPTA7ICEoc3RhdGUtPmNvbmZpZy0+aW5pdHRhYltpXSA9PSAweGZmICYmIHN0YXRlLT5jb25maWctPmluaXR0YWJbaSsxXSA9PSAweGZmKTsgaSs9MikKKwkJc3R2MDI5N193cml0ZXJlZyhzdGF0ZSwgc3RhdGUtPmNvbmZpZy0+aW5pdHRhYltpXSwgc3RhdGUtPmNvbmZpZy0+aW5pdHRhYltpKzFdKTsKIAltc2xlZXAoMjAwKTsKIAogCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkKQEAgLTYwNiw3ICs0OTIsMTMgQEAKIAlzdHYwMjk3X3NldF9pbnZlcnNpb24oc3RhdGUsIGludmVyc2lvbik7CiAKIAkvKiBraWNrIG9mZiBsb2NrICovCi0Jc3R2MDI5N193cml0ZXJlZ19tYXNrKHN0YXRlLCAweDg4LCAweDA4LCAweDA4KTsKKwkvKiBEaXNhYmxlIGNvcm5lciBkZXRlY3Rpb24gZm9yIGhpZ2hlciBRQU1zICovCisJaWYgKHAtPnUucWFtLm1vZHVsYXRpb24gPT0gUUFNXzEyOCB8fAorCQlwLT51LnFhbS5tb2R1bGF0aW9uID09IFFBTV8yNTYpCisJCXN0djAyOTdfd3JpdGVyZWdfbWFzayhzdGF0ZSwgMHg4OCwgMHgwOCwgMHgwMCk7CisJZWxzZQorCQlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4ODgsIDB4MDgsIDB4MDgpOworCiAJc3R2MDI5N193cml0ZXJlZ19tYXNrKHN0YXRlLCAweDVhLCAweDIwLCAweDAwKTsKIAlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4NmEsIDB4MDEsIDB4MDEpOwogCXN0djAyOTdfd3JpdGVyZWdfbWFzayhzdGF0ZSwgMHg0MywgMHg0MCwgMHg0MCk7CkBAIC03MzIsNyArNjI0LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBzdHYwMjk3X29wczsKIAogc3RydWN0IGR2Yl9mcm9udGVuZCAqc3R2MDI5N19hdHRhY2goY29uc3Qgc3RydWN0IHN0djAyOTdfY29uZmlnICpjb25maWcsCi0JCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBpbnQgcHdtKQorCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKIHsKIAlzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqc3RhdGUgPSBOVUxMOwogCkBAIC03NDYsNyArNjM4LDYgQEAKIAlzdGF0ZS0+aTJjID0gaTJjOwogCW1lbWNweSgmc3RhdGUtPm9wcywgJnN0djAyOTdfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+YmFzZV9mcmVxID0gMDsKLQlzdGF0ZS0+cHdtID0gcHdtOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCiAJaWYgKChzdHYwMjk3X3JlYWRyZWcoc3RhdGUsIDB4ODApICYgMHg3MCkgIT0gMHgyMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5oCmluZGV4IDNiZTUzNTkuLjllNTNmMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuaApAQCAtMjksNiArMjksMTIgQEAKIAkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7CiAKKwkvKiBpbml0dGFiIC0gYXJyYXkgb2YgcGFpcnMgb2YgdmFsdWVzLgorCSogRmlyc3Qgb2YgZWFjaCBwYWlyIGlzIHRoZSByZWdpc3Rlciwgc2Vjb25kIGlzIHRoZSB2YWx1ZS4KKwkqIExpc3Qgc2hvdWxkIGJlIHRlcm1pbmF0ZWQgd2l0aCBhbiAweGZmLCAweGZmIHBhaXIuCisJKi8KKwl1OCogaW5pdHRhYjsKKwogCS8qIGRvZXMgdGhlICJpbnZlcnNpb24iIG5lZWQgaW52ZXJ0ZWQ/ICovCiAJdTggaW52ZXJ0OjE7CiAKQEAgLTM4LDcgKzQ0LDcgQEAKIH07CiAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzdHYwMjk3X2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3R2MDI5N19jb25maWcqIGNvbmZpZywKLQkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMsIGludCBwd20pOworCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CiBleHRlcm4gaW50IHN0djAyOTdfZW5hYmxlX3BsbGkyYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CiAKICNlbmRpZiAvLyBTVFYwMjk3X0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5jCmluZGV4IGNmYTM5MjguLjJkNjI5MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuYwpAQCAtNjMsMTIgKzYzLDggQEAKIAl1MzIgdHVuZXJfZnJlcXVlbmN5OwogCXUzMiBzeW1ib2xfcmF0ZTsKIAlmZV9jb2RlX3JhdGVfdCBmZWNfaW5uZXI7Ci0JaW50IGVycm1vZGU7CiB9OwogCi0jZGVmaW5lIFNUQVRVU19CRVIgMAotI2RlZmluZSBTVEFUVVNfVUNCTE9DS1MgMQotCiBzdGF0aWMgaW50IGRlYnVnOwogc3RhdGljIGludCBkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2g7CiAjZGVmaW5lIGRwcmludGsoYXJncy4uLikgXApAQCAtNDgxLDcgKzQ3Nyw3IEBACiAKIAlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKIAkJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4YjUpOwkvKiAgZW5hYmxlIGkyYyByZXBlYXRlciBvbiBzdHYwMjk5ICAqLwotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7CisJCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlLCBzdGF0ZS0+aTJjKTsKIAkJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4MzUpOwkvKiAgZGlzYWJsZSBpMmMgcmVwZWF0ZXIgb24gc3R2MDI5OSAgKi8KIAl9CiAKQEAgLTUyMCw3ICs1MTYsOCBAQAogewogICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAotCWlmIChzdGF0ZS0+ZXJybW9kZSAhPSBTVEFUVVNfQkVSKSByZXR1cm4gMDsKKwlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgzNCwgKHN0djAyOTlfcmVhZHJlZyhzdGF0ZSwgMHgzNCkgJiAweGNmKSB8IDB4MTApOworCW1zbGVlcCgxMDApOwogCSpiZXIgPSAoc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxZCkgPDwgOCkgfCBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDFlKTsKIAogCXJldHVybiAwOwpAQCAtNTU5LDggKzU1Niw5IEBACiB7CiAgICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCi0JaWYgKHN0YXRlLT5lcnJtb2RlICE9IFNUQVRVU19VQ0JMT0NLUykgKnVjYmxvY2tzID0gMDsKLQllbHNlICp1Y2Jsb2NrcyA9IChzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDFkKSA8PCA4KSB8IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MWUpOworCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDM0LCAoc3R2MDI5OV9yZWFkcmVnKHN0YXRlLCAweDM0KSAmIDB4Y2YpIHwgMHgzMCk7CisJbXNsZWVwKDEwMCk7CisJKnVjYmxvY2tzID0gKHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MWQpIDw8IDgpIHwgc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYwMyw3ICs2MDEsNyBAQAogCQl9IGVsc2UgewogCQkJLyogQSAibm9ybWFsIiB0dW5lIGlzIHJlcXVlc3RlZCAqLwogCQkJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4YjUpOwkvKiAgZW5hYmxlIGkyYyByZXBlYXRlciBvbiBzdHYwMjk5ICAqLwotCQkJc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCk7CisJCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBzdGF0ZS0+aTJjLCBwKTsKIAkJCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDA1LCAweDM1KTsJLyogIGRpc2FibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCiAKIAkJCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDMyLCAweDgwKTsKQEAgLTYxNSw3ICs2MTMsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4YjUpOwkvKiAgZW5hYmxlIGkyYyByZXBlYXRlciBvbiBzdHYwMjk5ICAqLwotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwKTsKKwkJc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgc3RhdGUtPmkyYywgcCk7CiAJCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDA1LCAweDM1KTsJLyogIGRpc2FibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCiAKIAkJc3R2MDI5OV9zZXRfRkVDIChzdGF0ZSwgcC0+dS5xcHNrLmZlY19pbm5lcik7CkBAIC03MDksNyArNzA3LDYgQEAKIAlzdGF0ZS0+dHVuZXJfZnJlcXVlbmN5ID0gMDsKIAlzdGF0ZS0+c3ltYm9sX3JhdGUgPSAwOwogCXN0YXRlLT5mZWNfaW5uZXIgPSAwOwotCXN0YXRlLT5lcnJtb2RlID0gU1RBVFVTX0JFUjsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwogCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDAyLCAweDM0KTsgLyogc3RhbmRieSBvZmYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5oCmluZGV4IDc5NDU3YTguLmQwYzQ0ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuaApAQCAtOTIsOCArOTIsOCBAQAogCWludCAoKnNldF9zeW1ib2xfcmF0ZSkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiBzcmF0ZSwgdTMyIHJhdGlvKTsKIAogCS8qIFBMTCBtYWludGVuYW5jZSAqLwotCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKKwlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKTsKKwlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKTsKIH07CiAKIGV4dGVybiBpbnQgc3R2MDI5OV93cml0ZXJlZyAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHU4IHJlZywgdTggZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jCmluZGV4IGFiMGMwMzIuLjc0Y2VhOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jCkBAIC0xMDQ2LDggKzEwNDYsNyBAQAogCXRtcCA9IHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfU05SKTsKIAlpZiAodG1wIDwgMCkKIAkJcmV0dXJuIC1FSU87Ci0JaWYgKHRtcCkKLQkJdG1wID0gMjU1IC0gdG1wOworCXRtcCA9IDI1NSAtIHRtcDsKIAogCSpzbnIgPSAoKHRtcCA8PCA4KSB8IHRtcCk7CiAJZHByaW50aygiJXM6IHNucj0weCV4XG4iLCBfX0ZVTkNUSU9OX18sICpzbnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczE4MjAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmMKaW5kZXggNzBmYjQ0Yi4uYzZkMjc2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczE4MjAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMTgyMC5jCkBAIC0xOTQsMTkgKzE5NCwxOCBAQAogewogCXN0cnVjdCB2ZXMxODIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCBpOwotCWludCB2YWw7CiAKIAl2ZXMxODIwX3dyaXRlcmVnKHN0YXRlLCAwLCAwKTsKIAotCWZvciAoaSA9IDA7IGkgPCA1MzsgaSsrKSB7Ci0JCXZhbCA9IHZlczE4MjBfaW5pdHRhYltpXTsKLQkJaWYgKChpID09IDIpICYmIChzdGF0ZS0+Y29uZmlnLT5zZWxhZ2MpKSB2YWwgfD0gMHgwODsKLQkJdmVzMTgyMF93cml0ZXJlZyhzdGF0ZSwgaSwgdmFsKTsKLQl9CisJZm9yIChpID0gMDsgaSA8IHNpemVvZih2ZXMxODIwX2luaXR0YWIpOyBpKyspCisJCXZlczE4MjBfd3JpdGVyZWcoc3RhdGUsIGksIHZlczE4MjBfaW5pdHRhYltpXSk7CisJaWYgKHN0YXRlLT5jb25maWctPnNlbGFnYykKKwkJdmVzMTgyMF93cml0ZXJlZyhzdGF0ZSwgMiwgdmVzMTgyMF9pbml0dGFiWzJdIHwgMHgwOCk7CiAKIAl2ZXMxODIwX3dyaXRlcmVnKHN0YXRlLCAweDM0LCBzdGF0ZS0+cHdtKTsKIAotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOworCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkKKwkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMzQsNyArMjMzLDcgQEAKIAl2ZXMxODIwX3dyaXRlcmVnKHN0YXRlLCAweDA5LCByZWcweDA5W3JlYWxfcWFtXSk7CiAKIAl2ZXMxODIwX3NldHVwX3JlZzAoc3RhdGUsIHJlZzB4MDBbcmVhbF9xYW1dLCBwLT5pbnZlcnNpb24pOwotCisJdmVzMTgyMF93cml0ZXJlZyhzdGF0ZSwgMiwgdmVzMTgyMF9pbml0dGFiWzJdIHwgKHN0YXRlLT5jb25maWctPnNlbGFnYyA/IDB4MDggOiAwKSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9wbHV0bzIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9wbHV0bzIuYwppbmRleCA3MDZlMGJjLi44NWI0MzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL3BsdXRvMi5jCkBAIC02MzMsNyArNjMzLDYgQEAKIAlpMmNfc2V0X2FkYXBkYXRhKCZwbHV0by0+aTJjX2FkYXAsIHBsdXRvKTsKIAlzdHJjcHkocGx1dG8tPmkyY19hZGFwLm5hbWUsIERSSVZFUl9OQU1FKTsKIAlwbHV0by0+aTJjX2FkYXAub3duZXIgPSBUSElTX01PRFVMRTsKLQlwbHV0by0+aTJjX2FkYXAuaWQgPSBJMkNfQUxHT19CSVQ7CiAJcGx1dG8tPmkyY19hZGFwLmNsYXNzID0gSTJDX0NMQVNTX1RWX0RJR0lUQUw7CiAJcGx1dG8tPmkyY19hZGFwLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCXBsdXRvLT5pMmNfYWRhcC5hbGdvX2RhdGEgPSAmcGx1dG8tPmkyY19iaXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZwppbmRleCBiZjNjMDExLi5kOGJmNjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL0tjb25maWcKQEAgLTEwMiw2ICsxMDIsOSBAQAogCXNlbGVjdCBWSURFT19ERVYKIAlzZWxlY3QgVklERU9fU0FBNzE0Nl9WVgogCXNlbGVjdCBEVkJfU1RWMDI5OQorCXNlbGVjdCBEVkJfVERBMTAwNFgKKwlzZWxlY3QgRFZCX1REQTEwMDIxCisJc2VsZWN0IEZXX0xPQURFUgogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHNpbXBsZSBTQUE3MTQ2IGJhc2VkIERWQiBjYXJkcwogCSAgKHNvIGNhbGxlZCBCdWRnZXQtIG9yIE5vdmEtUENJIGNhcmRzKSB3aXRob3V0IG9uYm9hcmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKaW5kZXggZTRjNmU4Ny4uMjJiMjAzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKQEAgLTE2OCw3ICsxNjgsOSBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzd2l0Y2ggb24gU0NBUlQoQUQpOiVkXG4iLHJldCk7CiAJCWlmIChyZ2Jfb24gJiYKLQkJICAgIChhdjcxMTAtPmRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTEwYSkgJiYgKGF2NzExMC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMDAwKSkgeworCQkgICAgKChhdjcxMTAtPmRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTEwYSkgfHwKKwkJICAgICAoYXY3MTEwLT5kZXYtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEzYzIpKSAmJgorCQkgICAgIChhdjcxMTAtPmRldi0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDAwMCkpIHsKIAkJCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIDEsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8vIFJHQiBvbiwgU0NBUlQgcGluIDE2CiAJCQkvL3NhYTcxNDZfc2V0Z3BpbyhkZXYsIDMsIFNBQTcxNDZfR1BJT19PVVRMTyk7IC8vIFNDQVJUcGluIDgKIAkJfQpAQCAtMTc3LDkgKzE3OSw2IEBACiAJcmV0ID0gYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhdjcxMTAtPm1peGVyLnZvbHVtZV9sZWZ0LCBhdjcxMTAtPm1peGVyLnZvbHVtZV9yaWdodCk7CiAJaWYgKHJldCA8IDApCiAJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzZXQgdm9sdW1lIDolZFxuIixyZXQpOwotCXJldCA9IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnKGF2NzExMCwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzZXR1cCBpcmMgY29uZmlnIDolZFxuIixyZXQpOwogfQogCiBzdGF0aWMgdm9pZCByZWNvdmVyX2FybShzdHJ1Y3QgYXY3MTEwICphdjcxMTApCkBAIC0yNjUsNjAgKzI2NCw2IEBACiB9CiAKIAotLyoqCi0gKiAgSGFjayEgd2Ugc2F2ZSB0aGUgbGFzdCBhdjcxMTAgcHRyLiBUaGlzIHNob3VsZCBiZSBvaywgc2luY2UKLSAqICB5b3UgcmFyZWx5IHdpbGwgdXNlIG1vcmUgdGhlbiBvbmUgSVIgY29udHJvbC4KLSAqCi0gKiAgSWYgd2Ugd2FudCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbnRyb2xzIHdlIHdvdWxkIGhhdmUgdG8gZG8gbXVjaCBtb3JlLi4uCi0gKi8KLWludCBhdjcxMTBfc2V0dXBfaXJjX2NvbmZpZyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiBpcl9jb25maWcpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RhdGljIHN0cnVjdCBhdjcxMTAgKmxhc3Q7Ci0KLQlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKLQotCWlmICghYXY3MTEwKQotCQlhdjcxMTAgPSBsYXN0OwotCWVsc2UKLQkJbGFzdCA9IGF2NzExMDsKLQotCWlmIChhdjcxMTApIHsKLQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTZXRJUiwgMSwgaXJfY29uZmlnKTsKLQkJYXY3MTEwLT5pcl9jb25maWcgPSBpcl9jb25maWc7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkICgqaXJjX2hhbmRsZXIpKHUzMik7Ci0KLXZvaWQgYXY3MTEwX3JlZ2lzdGVyX2lyY19oYW5kbGVyKHZvaWQgKCpmdW5jKSh1MzIpKQotewotCWRwcmludGsoNCwgInJlZ2lzdGVyaW5nICVwXG4iLCBmdW5jKTsKLQlpcmNfaGFuZGxlciA9IGZ1bmM7Ci19Ci0KLXZvaWQgYXY3MTEwX3VucmVnaXN0ZXJfaXJjX2hhbmRsZXIodm9pZCAoKmZ1bmMpKHUzMikpCi17Ci0JZHByaW50ayg0LCAidW5yZWdpc3RlcmluZyAlcFxuIiwgZnVuYyk7Ci0JaXJjX2hhbmRsZXIgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBydW5faGFuZGxlcnModW5zaWduZWQgbG9uZyBpcmNvbSkKLXsKLQlpZiAoaXJjX2hhbmRsZXIgIT0gTlVMTCkKLQkJKCppcmNfaGFuZGxlcikoKHUzMikgaXJjb20pOwotfQotCi1zdGF0aWMgREVDTEFSRV9UQVNLTEVUKGlydGFzaywgcnVuX2hhbmRsZXJzLCAwKTsKLQotc3RhdGljIHZvaWQgSVJfaGFuZGxlKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyY29tKQotewotCWRwcmludGsoNCwgImlyY29tbWFuZCA9ICUwOHhcbiIsIGlyY29tKTsKLQlpcnRhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBpcmNvbTsKLQl0YXNrbGV0X3NjaGVkdWxlKCZpcnRhc2spOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSVJRIGhhbmRsaW5nCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTcxMSw4ICs2NTYsOSBAQAogCQlyZXR1cm47CiAKIAljYXNlIERBVEFfSVJDT01NQU5EOgotCQlJUl9oYW5kbGUoYXY3MTEwLAotCQkJICBzd2FodzMyKGlyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIFJlc2VydmVkLCAwLCA0KSkpOworCQlpZiAoYXY3MTEwLT5pcl9oYW5kbGVyKQorCQkJYXY3MTEwLT5pcl9oYW5kbGVyKGF2NzExMCwKKwkJCQlzd2FodzMyKGlyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIFJlc2VydmVkLCAwLCA0KSkpOwogCQlpd2RlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBSWF9CVUZGLCAwLCAyKTsKIAkJYnJlYWs7CiAKQEAgLTE2NjgsOSArMTYxNCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWxwc19ic3J1Nl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgYWxwc19ic3J1Nl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7Ci0Jc3RydWN0IGF2NzExMCogYXY3MTEwID0gKHN0cnVjdCBhdjcxMTAqKSBmZS0+ZHZiLT5wcml2OwogCWludCByZXQ7CiAJdTggZGF0YVs0XTsKIAl1MzIgZGl2OwpAQCAtMTY4Nyw3ICsxNjMyLDcgQEAKIAogCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+IDE1MzAwMDApIGRhdGFbM10gPSAweGMwOwogCi0JcmV0ID0gaTJjX3RyYW5zZmVyKCZhdjcxMTAtPmkyY19hZGFwLCAmbXNnLCAxKTsKKwlyZXQgPSBpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKTsKIAlpZiAocmV0ICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtMTc1MSw5ICsxNjk2LDggQEAKIAkweGZmLCAweGZmCiB9OwogCi1zdGF0aWMgaW50IGFscHNfYnNiZTFfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGFscHNfYnNiZTFfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewotCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IChzdHJ1Y3QgYXY3MTEwKikgZmUtPmR2Yi0+cHJpdjsKIAlpbnQgcmV0OwogCXU4IGRhdGFbNF07CiAJdTMyIGRpdjsKQEAgLTE3NjgsNyArMTcxMiw3IEBACiAJZGF0YVsyXSA9IDB4ODAgfCAoKGRpdiAmIDB4MTgwMDApID4+IDEwKSB8IDQ7CiAJZGF0YVszXSA9IChwYXJhbXMtPmZyZXF1ZW5jeSA+IDE1MzAwMDApID8gMHhFMCA6IDB4RTQ7CiAKLQlyZXQgPSBpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2csIDEpOworCXJldCA9IGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpOwogCXJldHVybiAocmV0ICE9IDEpID8gLUVJTyA6IDA7CiB9CiAKQEAgLTE5MzYsNiArMTg4MCw5OCBAQAogfTsKIAogCitzdGF0aWMgdTggbmV4dXNjYV9zdHYwMjk3X2luaXR0YWJbXSA9IHsKKwkweDgwLCAweDAxLAorCTB4ODAsIDB4MDAsCisJMHg4MSwgMHgwMSwKKwkweDgxLCAweDAwLAorCTB4MDAsIDB4MDksCisJMHgwMSwgMHg2OSwKKwkweDAzLCAweDAwLAorCTB4MDQsIDB4MDAsCisJMHgwNywgMHgwMCwKKwkweDA4LCAweDAwLAorCTB4MjAsIDB4MDAsCisJMHgyMSwgMHg0MCwKKwkweDIyLCAweDAwLAorCTB4MjMsIDB4MDAsCisJMHgyNCwgMHg0MCwKKwkweDI1LCAweDg4LAorCTB4MzAsIDB4ZmYsCisJMHgzMSwgMHgwMCwKKwkweDMyLCAweGZmLAorCTB4MzMsIDB4MDAsCisJMHgzNCwgMHg1MCwKKwkweDM1LCAweDdmLAorCTB4MzYsIDB4MDAsCisJMHgzNywgMHgyMCwKKwkweDM4LCAweDAwLAorCTB4NDAsIDB4MWMsCisJMHg0MSwgMHhmZiwKKwkweDQyLCAweDI5LAorCTB4NDMsIDB4MDAsCisJMHg0NCwgMHhmZiwKKwkweDQ1LCAweDAwLAorCTB4NDYsIDB4MDAsCisJMHg0OSwgMHgwNCwKKwkweDRhLCAweDAwLAorCTB4NGIsIDB4N2IsCisJMHg1MiwgMHgzMCwKKwkweDU1LCAweGFlLAorCTB4NTYsIDB4NDcsCisJMHg1NywgMHhlMSwKKwkweDU4LCAweDNhLAorCTB4NWEsIDB4MWUsCisJMHg1YiwgMHgzNCwKKwkweDYwLCAweDAwLAorCTB4NjMsIDB4MDAsCisJMHg2NCwgMHgwMCwKKwkweDY1LCAweDAwLAorCTB4NjYsIDB4MDAsCisJMHg2NywgMHgwMCwKKwkweDY4LCAweDAwLAorCTB4NjksIDB4MDAsCisJMHg2YSwgMHgwMiwKKwkweDZiLCAweDAwLAorCTB4NzAsIDB4ZmYsCisJMHg3MSwgMHgwMCwKKwkweDcyLCAweDAwLAorCTB4NzMsIDB4MDAsCisJMHg3NCwgMHgwYywKKwkweDgwLCAweDAwLAorCTB4ODEsIDB4MDAsCisJMHg4MiwgMHgwMCwKKwkweDgzLCAweDAwLAorCTB4ODQsIDB4MDQsCisJMHg4NSwgMHg4MCwKKwkweDg2LCAweDI0LAorCTB4ODcsIDB4NzgsCisJMHg4OCwgMHgxMCwKKwkweDg5LCAweDAwLAorCTB4OTAsIDB4MDEsCisJMHg5MSwgMHgwMSwKKwkweGEwLCAweDA0LAorCTB4YTEsIDB4MDAsCisJMHhhMiwgMHgwMCwKKwkweGIwLCAweDkxLAorCTB4YjEsIDB4MGIsCisJMHhjMCwgMHg1MywKKwkweGMxLCAweDcwLAorCTB4YzIsIDB4MTIsCisJMHhkMCwgMHgwMCwKKwkweGQxLCAweDAwLAorCTB4ZDIsIDB4MDAsCisJMHhkMywgMHgwMCwKKwkweGQ0LCAweDAwLAorCTB4ZDUsIDB4MDAsCisJMHhkZSwgMHgwMCwKKwkweGRmLCAweDAwLAorCTB4NjEsIDB4NDksCisJMHg2MiwgMHgwYiwKKwkweDUzLCAweDA4LAorCTB4NTksIDB4MDgsCisJMHhmZiwgMHhmZiwKK307CiAKIHN0YXRpYyBpbnQgbmV4dXNjYV9zdHYwMjk3X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewpAQCAtMTk4NCw2ICsyMDIwLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3R2MDI5N19jb25maWcgbmV4dXNjYV9zdHYwMjk3X2NvbmZpZyA9IHsKIAogCS5kZW1vZF9hZGRyZXNzID0gMHgxQywKKwkuaW5pdHRhYiA9IG5leHVzY2Ffc3R2MDI5N19pbml0dGFiLAogCS5pbnZlcnQgPSAxLAogCS5wbGxfc2V0ID0gbmV4dXNjYV9zdHYwMjk3X3BsbF9zZXQsCiB9OwpAQCAtMjI2MSw3ICsyMjk4LDcgQEAKIAogCQljYXNlIDB4MDAwQTogLy8gSGF1cHBhdWdlL1RUIE5leHVzLUNBIHJldjEuWAogCi0JCQlhdjcxMTAtPmZlID0gc3R2MDI5N19hdHRhY2goJm5leHVzY2Ffc3R2MDI5N19jb25maWcsICZhdjcxMTAtPmkyY19hZGFwLCAweDdiKTsKKwkJCWF2NzExMC0+ZmUgPSBzdHYwMjk3X2F0dGFjaCgmbmV4dXNjYV9zdHYwMjk3X2NvbmZpZywgJmF2NzExMC0+aTJjX2FkYXApOwogCQkJaWYgKGF2NzExMC0+ZmUpIHsKIAkJCQkvKiBzZXQgVERBOTgxOSBpbnRvIERWQiBtb2RlICovCiAJCQkJc2FhNzE0Nl9zZXRncGlvKGF2NzExMC0+ZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOyAvLyBUREE5MTk4IHBpbjkoU1REKQpAQCAtMjY5Miw3ICsyNzI5LDcgQEAKIAkJZ290byBlcnJfYXY3MTEwX2V4aXRfdjRsXzEyOwogCiAjaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfRVZERVYpIHx8IGRlZmluZWQoQ09ORklHX0lOUFVUX0VWREVWX01PRFVMRSkKLQlhdjcxMTBfaXJfaW5pdCgpOworCWF2NzExMF9pcl9pbml0KGF2NzExMCk7CiAjZW5kaWYKIAlwcmludGsoS0VSTl9JTkZPICJkdmItdHRwY2k6IGZvdW5kIGF2NzExMC0lZC5cbiIsIGF2NzExMF9udW0pOwogCWF2NzExMF9udW0rKzsKQEAgLTI3MzQsNiArMjc3MSw5IEBACiAJc3RydWN0IGF2NzExMCAqYXY3MTEwID0gc2FhLT5leHRfcHJpdjsKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX0VWREVWKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9FVkRFVl9NT0RVTEUpCisJYXY3MTEwX2lyX2V4aXQoYXY3MTEwKTsKKyNlbmRpZgogCWlmIChidWRnZXRwYXRjaCkgewogCQkvKiBEaXNhYmxlIFJQUzEgKi8KIAkJc2FhNzE0Nl93cml0ZShzYWEsIE1DMSwgTUFTS18yOSk7CkBAIC0yODMwLDcgKzI4NzAsNyBAQAogCS5leHRfcHJpdiA9IHhfbmFtZSwgXAogCS5leHQgPSAmYXY3MTEwX2V4dGVuc2lvbiB9CiAKLU1BS0VfQVY3MTEwX0lORk8odHRzXzFfWCwgICAgIlRlY2hub3RyZW5kL0hhdXBwYXVnZSBXaW5UViBEVkItUyByZXYxLlgiKTsKK01BS0VfQVY3MTEwX0lORk8odHRzXzFfWF9mc2MsIlRlY2hub3RyZW5kL0hhdXBwYXVnZSBXaW5UViBEVkItUyByZXYxLlggb3IgRnVqaXRzdSBTaWVtZW5zIERWQi1DIik7CiBNQUtFX0FWNzExMF9JTkZPKHR0dF8xX1gsICAgICJUZWNobm90cmVuZC9IYXVwcGF1Z2UgV2luVFYgRFZCLVQgcmV2MS5YIik7CiBNQUtFX0FWNzExMF9JTkZPKHR0Y18xX1gsICAgICJUZWNobm90cmVuZC9IYXVwcGF1Z2UgV2luVFYgTmV4dXMtQ0EgcmV2MS5YIik7CiBNQUtFX0FWNzExMF9JTkZPKHR0Y18yX1gsICAgICJUZWNobm90cmVuZC9IYXVwcGF1Z2UgV2luVFYgRFZCLUMgcmV2Mi5YIik7CkBAIC0yODQyLDE2ICsyODgyLDE2IEBACiBNQUtFX0FWNzExMF9JTkZPKGZzcywgICAgICAgICJGdWppdHN1IFNpZW1lbnMgRFZCLVMgcmV2MS42Iik7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfdGJsW10gPSB7Ci0JTUFLRV9FWFRFTlNJT05fUENJKGZzYywgICAgICAgMHgxMTBhLCAweDAwMDApLAotCU1BS0VfRVhURU5TSU9OX1BDSSh0dHNfMV9YLCAgIDB4MTNjMiwgMHgwMDAwKSwKLQlNQUtFX0VYVEVOU0lPTl9QQ0kodHR0XzFfWCwgICAweDEzYzIsIDB4MDAwMSksCi0JTUFLRV9FWFRFTlNJT05fUENJKHR0Y18yX1gsICAgMHgxM2MyLCAweDAwMDIpLAotCU1BS0VfRVhURU5TSU9OX1BDSSh0dHNfMl9YLCAgIDB4MTNjMiwgMHgwMDAzKSwKLQlNQUtFX0VYVEVOU0lPTl9QQ0koZnNzLCAgICAgICAweDEzYzIsIDB4MDAwNiksCi0JTUFLRV9FWFRFTlNJT05fUENJKHR0dCwgICAgICAgMHgxM2MyLCAweDAwMDgpLAotCU1BS0VfRVhURU5TSU9OX1BDSSh0dGNfMV9YLCAgIDB4MTNjMiwgMHgwMDBhKSwKLQlNQUtFX0VYVEVOU0lPTl9QQ0kodHRzXzJfMywgICAweDEzYzIsIDB4MDAwZSksCi0JTUFLRV9FWFRFTlNJT05fUENJKHR0c18xXzNzZSwgMHgxM2MyLCAweDEwMDIpLAorCU1BS0VfRVhURU5TSU9OX1BDSShmc2MsICAgICAgICAgMHgxMTBhLCAweDAwMDApLAorCU1BS0VfRVhURU5TSU9OX1BDSSh0dHNfMV9YX2ZzYywgMHgxM2MyLCAweDAwMDApLAorCU1BS0VfRVhURU5TSU9OX1BDSSh0dHRfMV9YLCAgICAgMHgxM2MyLCAweDAwMDEpLAorCU1BS0VfRVhURU5TSU9OX1BDSSh0dGNfMl9YLCAgICAgMHgxM2MyLCAweDAwMDIpLAorCU1BS0VfRVhURU5TSU9OX1BDSSh0dHNfMl9YLCAgICAgMHgxM2MyLCAweDAwMDMpLAorCU1BS0VfRVhURU5TSU9OX1BDSShmc3MsICAgICAgICAgMHgxM2MyLCAweDAwMDYpLAorCU1BS0VfRVhURU5TSU9OX1BDSSh0dHQsICAgICAgICAgMHgxM2MyLCAweDAwMDgpLAorCU1BS0VfRVhURU5TSU9OX1BDSSh0dGNfMV9YLCAgICAgMHgxM2MyLCAweDAwMGEpLAorCU1BS0VfRVhURU5TSU9OX1BDSSh0dHNfMl8zLCAgICAgMHgxM2MyLCAweDAwMGUpLAorCU1BS0VfRVhURU5TSU9OX1BDSSh0dHNfMV8zc2UsICAgMHgxM2MyLCAweDEwMDIpLAogCiAvKglNQUtFX0VYVEVOU0lPTl9QQ0koPz8/LCAweDEzYzIsIDB4MDAwNCksIFVOREVGSU5FRCBDQVJEICovIC8vIEdhbGF4aXMgRFZCIFBDLVNhdC1DYXJ0ZQogLyoJTUFLRV9FWFRFTlNJT05fUENJKD8/PywgMHgxM2MyLCAweDAwMDUpLCBVTkRFRklORUQgQ0FSRCAqLyAvLyBUZWNobmlzYXQgU2t5U3RhcjEKQEAgLTI4ODksOSArMjkyOSw2IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhdjcxMTBfZXhpdCh2b2lkKQogewotI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX0VWREVWKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9FVkRFVl9NT0RVTEUpCi0JYXY3MTEwX2lyX2V4aXQoKTsKLSNlbmRpZgogCXNhYTcxNDZfdW5yZWdpc3Rlcl9leHRlbnNpb24oJmF2NzExMF9leHRlbnNpb24pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5oCmluZGV4IDUwOGI3NzMuLmNjZTAwZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5oCkBAIC0yMjgsNyArMjI4LDEwIEBACiAJc3RydWN0IGR2Yl92aWRlb19ldmVudHMgIHZpZGVvX2V2ZW50czsKIAl2aWRlb19zaXplX3QJCSB2aWRlb19zaXplOwogCi0JdTMyCQkgICAgaXJfY29uZmlnOworCXUzMgkJCWlyX2NvbmZpZzsKKwl1MzIJCQlpcl9jb21tYW5kOworCXZvaWQJCQkoKmlyX2hhbmRsZXIpKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyY29tKTsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJaXJfdGFza2xldDsKIAogCS8qIGZpcm13YXJlIHN0dWZmICovCiAJdW5zaWduZWQgY2hhciAqYmluX2Z3OwpAQCAtMjU3LDEyICsyNjAsMTAgQEAKIGV4dGVybiBpbnQgQ2hhbmdlUElEcyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiB2cGlkLCB1MTYgYXBpZCwgdTE2IHR0cGlkLAogCQkgICAgICAgdTE2IHN1YnBpZCwgdTE2IHBjcnBpZCk7CiAKLWV4dGVybiB2b2lkIGF2NzExMF9yZWdpc3Rlcl9pcmNfaGFuZGxlcih2b2lkICgqZnVuYykodTMyKSk7Ci1leHRlcm4gdm9pZCBhdjcxMTBfdW5yZWdpc3Rlcl9pcmNfaGFuZGxlcih2b2lkICgqZnVuYykodTMyKSk7CiBleHRlcm4gaW50IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnIChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiBpcl9jb25maWcpOwogCi1leHRlcm4gaW50IGF2NzExMF9pcl9pbml0ICh2b2lkKTsKLWV4dGVybiB2b2lkIGF2NzExMF9pcl9leGl0ICh2b2lkKTsKK2V4dGVybiBpbnQgYXY3MTEwX2lyX2luaXQoc3RydWN0IGF2NzExMCAqYXY3MTEwKTsKK2V4dGVybiB2b2lkIGF2NzExMF9pcl9leGl0KHN0cnVjdCBhdjcxMTAgKmF2NzExMCk7CiAKIC8qIG1zcDM0MDAgaTJjIHN1YmFkZHJlc3NlcyAqLwogI2RlZmluZSBNU1BfV1JfREVNIDB4MTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKaW5kZXggMTIyMDgyNi4uNzQ0MmY1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKQEAgLTQxLDYgKzQxLDggQEAKICNpbmNsdWRlICJhdjcxMTAuaCIKICNpbmNsdWRlICJhdjcxMTBfaHcuaCIKIAorI2RlZmluZSBfTk9IQU5EU0hBS0UKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERFQkkgZnVuY3Rpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM2NCw3ICszNjYsOCBAQAogCQltc2xlZXAoMSk7CiAJfQogCi0Jd2RlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBDT01fSUZfTE9DSywgMHhmZmZmLCAyKTsKKwlpZiAoRldfVkVSU0lPTihhdjcxMTAtPmFybV9hcHApIDw9IDB4MjYxZikKKwkJd2RlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBDT01fSUZfTE9DSywgMHhmZmZmLCAyKTsKIAogI2lmbmRlZiBfTk9IQU5EU0hBS0UKIAlzdGFydCA9IGppZmZpZXM7CkBAIC00MzcsNyArNDQwLDggQEAKIAogCXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgKHUzMikgYnVmWzBdLCAyKTsKIAotCXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NX0lGX0xPQ0ssIDB4MDAwMCwgMik7CisJaWYgKEZXX1ZFUlNJT04oYXY3MTEwLT5hcm1fYXBwKSA8PSAweDI2MWYpCisJCXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NX0lGX0xPQ0ssIDB4MDAwMCwgMik7CiAKICNpZmRlZiBDT01fREVCVUcKIAlzdGFydCA9IGppZmZpZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9pci5jCmluZGV4IDY2NWNkYjguLjM1N2EzNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9pci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9pci5jCkBAIC03LDE2ICs3LDE2IEBACiAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgogCiAjaW5jbHVkZSAiYXY3MTEwLmgiCisjaW5jbHVkZSAiYXY3MTEwX2h3LmgiCiAKLSNkZWZpbmUgVVBfVElNRU9VVCAoSFovNCkKKyNkZWZpbmUgVVBfVElNRU9VVCAoSFoqNy8yNSkKIAogLyogZW5hYmxlIGlyIGRlYnVnZ2luZyBieSBvcidpbmcgZGVidWcgd2l0aCAxNiAqLwogCi1zdGF0aWMgaW50IGlyX2luaXRpYWxpemVkOworc3RhdGljIGludCBhdl9jbnQ7CitzdGF0aWMgc3RydWN0IGF2NzExMCAqYXZfbGlzdFs0XTsKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2IGlucHV0X2RldjsKIAotc3RhdGljIHUzMiBpcl9jb25maWc7Ci0KIHN0YXRpYyB1MTYga2V5X21hcCBbMjU2XSA9IHsKIAlLRVlfMCwgS0VZXzEsIEtFWV8yLCBLRVlfMywgS0VZXzQsIEtFWV81LCBLRVlfNiwgS0VZXzcsCiAJS0VZXzgsIEtFWV85LCBLRVlfQkFDSywgMCwgS0VZX1BPV0VSLCBLRVlfTVVURSwgMCwgS0VZX0lORk8sCkBAIC01Myw4ICs1MywxMSBAQAogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGtleXVwX3RpbWVyID0geyAuZnVuY3Rpb24gPSBhdjcxMTBfZW1pdF9rZXl1cCB9OwogCiAKLXN0YXRpYyB2b2lkIGF2NzExMF9lbWl0X2tleSh1MzIgaXJjb20pCitzdGF0aWMgdm9pZCBhdjcxMTBfZW1pdF9rZXkodW5zaWduZWQgbG9uZyBwYXJtKQogeworCXN0cnVjdCBhdjcxMTAgKmF2NzExMCA9IChzdHJ1Y3QgYXY3MTEwICopIHBhcm07CisJdTMyIGlyX2NvbmZpZyA9IGF2NzExMC0+aXJfY29uZmlnOworCXUzMiBpcmNvbSA9IGF2NzExMC0+aXJfY29tbWFuZDsKIAl1OCBkYXRhOwogCXU4IGFkZHI7CiAJc3RhdGljIHUxNiBvbGRfdG9nZ2xlID0gMDsKQEAgLTYyLDE5ICs2NSwzMyBAQAogCXUxNiBrZXljb2RlOwogCiAJLyogZXh0cmFjdCBkZXZpY2UgYWRkcmVzcyBhbmQgZGF0YSAqLwotCWlmIChpcl9jb25maWcgJiAweDAwMDEpIHsKLQkJLyogVE9ETyBSQ01NOiA/IGJpdHMgZGV2aWNlIGFkZHJlc3MsIDggYml0cyBkYXRhICovCi0JCWRhdGEgPSBpcmNvbSAmIDB4ZmY7Ci0JCWFkZHIgPSAoaXJjb20gPj4gOCkgJiAweGZmOwotCX0gZWxzZSB7Ci0JCS8qIFJDNTogNSBiaXRzIGRldmljZSBhZGRyZXNzLCA2IGJpdHMgZGF0YSAqLworCXN3aXRjaCAoaXJfY29uZmlnICYgMHgwMDAzKSB7CisJY2FzZSAwOgkvKiBSQzU6IDUgYml0cyBkZXZpY2UgYWRkcmVzcywgNiBiaXRzIGRhdGEgKi8KIAkJZGF0YSA9IGlyY29tICYgMHgzZjsKIAkJYWRkciA9IChpcmNvbSA+PiA2KSAmIDB4MWY7CisJCWJyZWFrOworCisJY2FzZSAxOgkvKiBSQ01NOiA4KD8pIGJpdHMgZGV2aWNlIGFkZHJlc3MsIDgoPykgYml0cyBkYXRhICovCisJCWRhdGEgPSBpcmNvbSAmIDB4ZmY7CisJCWFkZHIgPSAoaXJjb20gPj4gOCkgJiAweGZmOworCQlicmVhazsKKworCWNhc2UgMjoJLyogZXh0ZW5kZWQgUkM1OiA1IGJpdHMgZGV2aWNlIGFkZHJlc3MsIDcgYml0cyBkYXRhICovCisJCWRhdGEgPSBpcmNvbSAmIDB4M2Y7CisJCWFkZHIgPSAoaXJjb20gPj4gNikgJiAweDFmOworCQkvKiBpbnZlcnQgN3RoIGRhdGEgYml0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggUkM1IGtleW1hcHMgKi8KKwkJaWYgKCEoaXJjb20gJiAweDEwMDApKQorCQkJZGF0YSB8PSAweDQwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiaW52YWxpZCBpcl9jb25maWcgJXhcbiIsIGlyX2NvbmZpZyk7CisJCXJldHVybjsKIAl9CiAKIAlrZXljb2RlID0ga2V5X21hcFtkYXRhXTsKIAotCWRwcmludGsoMTYsICIjIyMjIyMjIyMlMDh4IyMjIyMjIyMjIGFkZHIgJWkgZGF0YSAweCUwMnggKGtleWNvZGUgJWkpXG4iLAorCWRwcmludGsoMTYsICJjb2RlICUwOHggLT4gYWRkciAlaSBkYXRhIDB4JTAyeCAtPiBrZXljb2RlICVpXG4iLAogCQlpcmNvbSwgYWRkciwgZGF0YSwga2V5Y29kZSk7CiAKIAkvKiBjaGVjayBkZXZpY2UgYWRkcmVzcyAoaWYgc2VsZWN0ZWQpICovCkBAIC04NywxMCArMTA0LDEwIEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoaXJfY29uZmlnICYgMHgwMDAxKQorCWlmICgoaXJfY29uZmlnICYgMHgwMDAzKSA9PSAxKQogCQluZXdfdG9nZ2xlID0gMDsgLyogUkNNTSAqLwogCWVsc2UKLQkJbmV3X3RvZ2dsZSA9IChpcmNvbSAmIDB4ODAwKTsgLyogUkM1ICovCisJCW5ld190b2dnbGUgPSAoaXJjb20gJiAweDgwMCk7IC8qIFJDNSwgZXh0ZW5kZWQgUkM1ICovCiAKIAlpZiAodGltZXJfcGVuZGluZygma2V5dXBfdGltZXIpKSB7CiAJCWRlbF90aW1lcigma2V5dXBfdGltZXIpOwpAQCAtMTM3LDYgKzE1NCw4IEBACiB7CiAJY2hhciAqcGFnZTsKIAlpbnQgc2l6ZSA9IDQgKyAyNTYgKiBzaXplb2YodTE2KTsKKwl1MzIgaXJfY29uZmlnOworCWludCBpOwogCiAJaWYgKGNvdW50IDwgc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTMsNjAgKzE3Miw5NSBAQAogCW1lbWNweSgmaXJfY29uZmlnLCBwYWdlLCA0KTsKIAltZW1jcHkoJmtleV9tYXAsIHBhZ2UgKyA0LCAyNTYgKiBzaXplb2YodTE2KSk7CiAJdmZyZWUocGFnZSk7Ci0JYXY3MTEwX3NldHVwX2lyY19jb25maWcoTlVMTCwgaXJfY29uZmlnKTsKKwlpZiAoRldfVkVSU0lPTihhdl9saXN0WzBdLT5hcm1fYXBwKSA+PSAweDI2MjAgJiYgIShpcl9jb25maWcgJiAweDAwMDEpKQorCQlpcl9jb25maWcgfD0gMHgwMDAyOyAvKiBlbmFibGUgZXh0ZW5kZWQgUkM1ICovCisJZm9yIChpID0gMDsgaSA8IGF2X2NudDsgaSsrKQorCQlhdjcxMTBfc2V0dXBfaXJjX2NvbmZpZyhhdl9saXN0W2ldLCBpcl9jb25maWcpOwogCWlucHV0X3JlZ2lzdGVyX2tleXMoKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKIAotaW50IF9faW5pdCBhdjcxMTBfaXJfaW5pdCh2b2lkKQoraW50IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyX2NvbmZpZykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOworCWlmIChhdjcxMTApIHsKKwkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTZXRJUiwgMSwgaXJfY29uZmlnKTsKKwkJYXY3MTEwLT5pcl9jb25maWcgPSBpcl9jb25maWc7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQgaXJfaGFuZGxlcihzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiBpcmNvbSkKK3sKKwlkcHJpbnRrKDQsICJpcmNvbW1hbmQgPSAlMDh4XG4iLCBpcmNvbSk7CisJYXY3MTEwLT5pcl9jb21tYW5kID0gaXJjb207CisJdGFza2xldF9zY2hlZHVsZSgmYXY3MTEwLT5pcl90YXNrbGV0KTsKK30KKworCitpbnQgX19pbml0IGF2NzExMF9pcl9pbml0KHN0cnVjdCBhdjcxMTAgKmF2NzExMCkKIHsKIAlzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICplOwogCi0JaWYgKGlyX2luaXRpYWxpemVkKQotCQlyZXR1cm4gMDsKKwlpZiAoYXZfY250ID49IHNpemVvZiBhdl9saXN0L3NpemVvZiBhdl9saXN0WzBdKQorCQlyZXR1cm4gLUVOT1NQQzsKIAotCWluaXRfdGltZXIoJmtleXVwX3RpbWVyKTsKLQlrZXl1cF90aW1lci5kYXRhID0gMDsKKwlhdjcxMTBfc2V0dXBfaXJjX2NvbmZpZyhhdjcxMTAsIDB4MDAwMSk7CisJYXZfbGlzdFthdl9jbnQrK10gPSBhdjcxMTA7CiAKLQlpbnB1dF9kZXYubmFtZSA9ICJEVkIgb24tY2FyZCBJUiByZWNlaXZlciI7CisJaWYgKGF2X2NudCA9PSAxKSB7CisJCWluaXRfdGltZXIoJmtleXVwX3RpbWVyKTsKKwkJa2V5dXBfdGltZXIuZGF0YSA9IDA7CiAKLQkvKioKLQkgKiAgZW5hYmxlIGtleXMKLQkgKi8KLQlzZXRfYml0KEVWX0tFWSwgaW5wdXRfZGV2LmV2Yml0KTsKLQlzZXRfYml0KEVWX1JFUCwgaW5wdXRfZGV2LmV2Yml0KTsKKwkJaW5wdXRfZGV2Lm5hbWUgPSAiRFZCIG9uLWNhcmQgSVIgcmVjZWl2ZXIiOworCQlzZXRfYml0KEVWX0tFWSwgaW5wdXRfZGV2LmV2Yml0KTsKKwkJc2V0X2JpdChFVl9SRVAsIGlucHV0X2Rldi5ldmJpdCk7CisJCWlucHV0X3JlZ2lzdGVyX2tleXMoKTsKKwkJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZpbnB1dF9kZXYpOworCQlpbnB1dF9kZXYudGltZXIuZnVuY3Rpb24gPSBpbnB1dF9yZXBlYXRfa2V5OwogCi0JaW5wdXRfcmVnaXN0ZXJfa2V5cygpOwotCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZpbnB1dF9kZXYpOwotCWlucHV0X2Rldi50aW1lci5mdW5jdGlvbiA9IGlucHV0X3JlcGVhdF9rZXk7Ci0KLQlhdjcxMTBfc2V0dXBfaXJjX2NvbmZpZyhOVUxMLCAweDAwMDEpOwotCWF2NzExMF9yZWdpc3Rlcl9pcmNfaGFuZGxlcihhdjcxMTBfZW1pdF9rZXkpOwotCi0JZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJhdjcxMTBfaXIiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsIE5VTEwpOwotCWlmIChlKSB7Ci0JCWUtPndyaXRlX3Byb2MgPSBhdjcxMTBfaXJfd3JpdGVfcHJvYzsKLQkJZS0+c2l6ZSA9IDQgKyAyNTYgKiBzaXplb2YodTE2KTsKKwkJZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJhdjcxMTBfaXIiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsIE5VTEwpOworCQlpZiAoZSkgeworCQkJZS0+d3JpdGVfcHJvYyA9IGF2NzExMF9pcl93cml0ZV9wcm9jOworCQkJZS0+c2l6ZSA9IDQgKyAyNTYgKiBzaXplb2YodTE2KTsKKwkJfQogCX0KIAotCWlyX2luaXRpYWxpemVkID0gMTsKKwl0YXNrbGV0X2luaXQoJmF2NzExMC0+aXJfdGFza2xldCwgYXY3MTEwX2VtaXRfa2V5LCAodW5zaWduZWQgbG9uZykgYXY3MTEwKTsKKwlhdjcxMTAtPmlyX2hhbmRsZXIgPSBpcl9oYW5kbGVyOworCiAJcmV0dXJuIDA7CiB9CiAKIAotdm9pZCBfX2V4aXQgYXY3MTEwX2lyX2V4aXQodm9pZCkKK3ZvaWQgX19leGl0IGF2NzExMF9pcl9leGl0KHN0cnVjdCBhdjcxMTAgKmF2NzExMCkKIHsKLQlpZiAoaXJfaW5pdGlhbGl6ZWQgPT0gMCkKKwlpbnQgaTsKKworCWlmIChhdl9jbnQgPT0gMCkKIAkJcmV0dXJuOwotCWRlbF90aW1lcl9zeW5jKCZrZXl1cF90aW1lcik7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImF2NzExMF9pciIsIE5VTEwpOwotCWF2NzExMF91bnJlZ2lzdGVyX2lyY19oYW5kbGVyKGF2NzExMF9lbWl0X2tleSk7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJmlucHV0X2Rldik7Ci0JaXJfaW5pdGlhbGl6ZWQgPSAwOworCisJYXY3MTEwLT5pcl9oYW5kbGVyID0gTlVMTDsKKwl0YXNrbGV0X2tpbGwoJmF2NzExMC0+aXJfdGFza2xldCk7CisJZm9yIChpID0gMDsgaSA8IGF2X2NudDsgaSsrKQorCQlpZiAoYXZfbGlzdFtpXSA9PSBhdjcxMTApIHsKKwkJCWF2X2xpc3RbaV0gPSBhdl9saXN0W2F2X2NudC0xXTsKKwkJCWF2X2xpc3RbYXZfY250LTFdID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoYXZfY250ID09IDEpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmtleXVwX3RpbWVyKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImF2NzExMF9pciIsIE5VTEwpOworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmaW5wdXRfZGV2KTsKKwl9CisKKwlhdl9jbnQtLTsKIH0KIAogLy9NT0RVTEVfQVVUSE9SKCJIb2xnZXIgV2FlY2h0bGVyIDxob2xnZXJAY29udmVyZ2VuY2UuZGU+Iik7CiAvL01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX3Y0bC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX3Y0bC5jCmluZGV4IGU2NWZjMzYuLjZhZjc0ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF92NGwuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfdjRsLmMKQEAgLTcwLDcgKzcwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB2NGwyX2lucHV0IGlucHV0c1syXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9pbnB1dCBpbnB1dHNbNF0gPSB7CiAJewogCQkuaW5kZXgJCT0gMCwKIAkJLm5hbWUJCT0gIkRWQiIsCkBAIC04Nyw2ICs4NywyMiBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN0ZAkJPSBWNEwyX1NURF9QQUxfQkd8VjRMMl9TVERfTlRTQ19NLAogCQkuc3RhdHVzCQk9IDAsCisJfSwgeworCQkuaW5kZXgJCT0gMiwKKwkJLm5hbWUJCT0gIlZpZGVvIiwKKwkJLnR5cGUJCT0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQSwKKwkJLmF1ZGlvc2V0CT0gMCwKKwkJLnR1bmVyCQk9IDAsCisJCS5zdGQJCT0gVjRMMl9TVERfUEFMX0JHfFY0TDJfU1REX05UU0NfTSwKKwkJLnN0YXR1cwkJPSAwLAorCX0sIHsKKwkJLmluZGV4CQk9IDMsCisJCS5uYW1lCQk9ICJZL0MiLAorCQkudHlwZQkJPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBLAorCQkuYXVkaW9zZXQJPSAwLAorCQkudHVuZXIJCT0gMCwKKwkJLnN0ZAkJPSBWNEwyX1NURF9QQUxfQkd8VjRMMl9TVERfTlRTQ19NLAorCQkuc3RhdHVzCQk9IDAsCiAJfQogfTsKIApAQCAtMjEyLDI0ICsyMjgsNDQgQEAKIAl9CiAKIAlpZiAoMCAhPSBhdjcxMTAtPmN1cnJlbnRfaW5wdXQpIHsKKwkJZHByaW50aygxLCAic3dpdGNoaW5nIHRvIGFuYWxvZyBUVjpcbiIpOwogCQlhZHN3aXRjaCA9IDE7CiAJCXNvdXJjZSA9IFNBQTcxNDZfSFBTX1NPVVJDRV9QT1JUX0I7CiAJCXN5bmMgPSBTQUE3MTQ2X0hQU19TWU5DX1BPUlRfQjsKIAkJbWVtY3B5KHN0YW5kYXJkLCBhbmFsb2dfc3RhbmRhcmQsIHNpemVvZihzdHJ1Y3Qgc2FhNzE0Nl9zdGFuZGFyZCkgKiAyKTsKLQkJZHByaW50aygxLCAic3dpdGNoaW5nIHRvIGFuYWxvZyBUVlxuIik7Ci0JCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwOCwgMHgwMDAwKTsgLy8gbG91ZHNwZWFrZXIgc291cmNlCi0JCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwOSwgMHgwMDAwKTsgLy8gaGVhZHBob25lIHNvdXJjZQotCQltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMGEsIDB4MDAwMCk7IC8vIFNDQVJUIDEgc291cmNlCi0JCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwZSwgMHgzMDAwKTsgLy8gRk0gbWF0cml4LCBtb25vCi0JCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwMCwgMHg0ZjAwKTsgLy8gbG91ZHNwZWFrZXIgKyBoZWFkcGhvbmUKLQkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDA3LCAweDRmMDApOyAvLyBTQ0FSVCAxIHZvbHVtZQogCi0JCWlmIChhdjcxMTAtPmFuYWxvZ190dW5lcl9mbGFncyAmIEFOQUxPR19UVU5FUl9WRVMxODIwKSB7Ci0JCQlpZiAodmVzMTgyMF93cml0ZXJlZyhkZXYsIDB4MDksIDB4MGYsIDB4NjApKQotCQkJCWRwcmludGsoMSwgInNldHRpbmcgYmFuZCBpbiBkZW1vZHVsYXRvciBmYWlsZWQuXG4iKTsKLQkJfSBlbHNlIGlmIChhdjcxMTAtPmFuYWxvZ190dW5lcl9mbGFncyAmIEFOQUxPR19UVU5FUl9TVFYwMjk3KSB7Ci0JCQlzYWE3MTQ2X3NldGdwaW8oZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOyAvLyBUREE5MTk4IHBpbjkoU1REKQotCQkJc2FhNzE0Nl9zZXRncGlvKGRldiwgMywgU0FBNzE0Nl9HUElPX09VVEhJKTsgLy8gVERBOTE5OCBwaW4zMChWSUYpCisJCXN3aXRjaCAoYXY3MTEwLT5jdXJyZW50X2lucHV0KSB7CisJCWNhc2UgMToKKwkJCWRwcmludGsoMSwgInN3aXRjaGluZyBTQUE3MTEzIHRvIEFuYWxvZyBUdW5lciBJbnB1dC5cbiIpOworCQkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDA4LCAweDAwMDApOyAvLyBsb3Vkc3BlYWtlciBzb3VyY2UKKwkJCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwOSwgMHgwMDAwKTsgLy8gaGVhZHBob25lIHNvdXJjZQorCQkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDBhLCAweDAwMDApOyAvLyBTQ0FSVCAxIHNvdXJjZQorCQkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDBlLCAweDMwMDApOyAvLyBGTSBtYXRyaXgsIG1vbm8KKwkJCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwMCwgMHg0ZjAwKTsgLy8gbG91ZHNwZWFrZXIgKyBoZWFkcGhvbmUKKwkJCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwNywgMHg0ZjAwKTsgLy8gU0NBUlQgMSB2b2x1bWUKKworCQkJaWYgKGF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzICYgQU5BTE9HX1RVTkVSX1ZFUzE4MjApIHsKKwkJCQlpZiAodmVzMTgyMF93cml0ZXJlZyhkZXYsIDB4MDksIDB4MGYsIDB4NjApKQorCQkJCQlkcHJpbnRrKDEsICJzZXR0aW5nIGJhbmQgaW4gZGVtb2R1bGF0b3IgZmFpbGVkLlxuIik7CisJCQl9IGVsc2UgaWYgKGF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzICYgQU5BTE9HX1RVTkVSX1NUVjAyOTcpIHsKKwkJCQlzYWE3MTQ2X3NldGdwaW8oZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOyAvLyBUREE5MTk4IHBpbjkoU1REKQorCQkJCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIDMsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8vIFREQTkxOTggcGluMzAoVklGKQorCQkJfQorCQkJaWYgKGkyY193cml0ZXJlZyhhdjcxMTAsIDB4NDgsIDB4MDIsIDB4ZDApICE9IDEpCisJCQkJZHByaW50aygxLCAic2FhNzExMyB3cml0ZSBmYWlsZWQgQCBjYXJkICVkIiwgYXY3MTEwLT5kdmJfYWRhcHRlci5udW0pOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWRwcmludGsoMSwgInN3aXRjaGluZyBTQUE3MTEzIHRvIFZpZGVvIEFWIENWQlMgSW5wdXQuXG4iKTsKKwkJCWlmIChpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDQ4LCAweDAyLCAweGQyKSAhPSAxKQorCQkJCWRwcmludGsoMSwgInNhYTcxMTMgd3JpdGUgZmFpbGVkIEAgY2FyZCAlZCIsIGF2NzExMC0+ZHZiX2FkYXB0ZXIubnVtKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlkcHJpbnRrKDEsICJzd2l0Y2hpbmcgU0FBNzExMyB0byBWaWRlbyBBViBZL0MgSW5wdXQuXG4iKTsKKwkJCWlmIChpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDQ4LCAweDAyLCAweGQ5KSAhPSAxKQorCQkJCWRwcmludGsoMSwgInNhYTcxMTMgd3JpdGUgZmFpbGVkIEAgY2FyZCAlZCIsIGF2NzExMC0+ZHZiX2FkYXB0ZXIubnVtKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50aygxLCAic3dpdGNoaW5nIFNBQTcxMTMgdG8gSW5wdXQ6IEFWNzExMDogU0FBNzExMzogaW52YWxpZCBpbnB1dC5cbiIpOwogCQl9CiAJfSBlbHNlIHsKIAkJYWRzd2l0Y2ggPSAwOwpAQCAtMzAwLDcgKzMzNiw2IEBACiAJCS8vIEZJWE1FOiBzdGFuZGFyZCAvIHN0ZXJlbyBkZXRlY3Rpb24gaXMgc3RpbGwgYnJva2VuCiAJCW1zcF9yZWFkcmVnKGF2NzExMCwgTVNQX1JEX0RFTSwgMHgwMDdlLCAmc3RlcmVvX2RldCk7CiAJCWRwcmludGsoMSwgIlZJRElPQ19HX1RVTkVSOiBtc3AzNDAwIFRWIHN0YW5kYXJkIGRldGVjdGlvbjogMHglMDR4XG4iLCBzdGVyZW9fZGV0KTsKLQogCQltc3BfcmVhZHJlZyhhdjcxMTAsIE1TUF9SRF9EU1AsIDB4MDAxOCwgJnN0ZXJlb19kZXQpOwogCQlkcHJpbnRrKDEsICJWSURJT0NfR19UVU5FUjogbXNwMzQwMCBzdGVyZW8gZGV0ZWN0aW9uOiAweCUwNHhcbiIsIHN0ZXJlb19kZXQpOwogCQlzdGVyZW8gPSAoczgpKHN0ZXJlb19kZXQgPj4gOCk7CkBAIC0zMTAsNyArMzQ1LDcgQEAKIAkJCXQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOwogCQl9CiAJCWVsc2UgaWYgKHN0ZXJlbyA8IC0weDEwKSB7Ci0JCQkvKiBiaWxpbmd1YWwqLworCQkJLyogYmlsaW5ndWFsICovCiAJCQl0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTEFORzEgfCBWNEwyX1RVTkVSX1NVQl9MQU5HMjsKIAkJCXQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTEFORzE7CiAJCX0KQEAgLTM0NCw3ICszNzksNyBAQAogCQkJZm1fbWF0cml4ID0gMHgzMDAwOyAvLyBtb25vCiAJCQlzcmMgPSAweDAwMTA7CiAJCQlicmVhazsKLQkJZGVmYXVsdDogLyogY2FzZSBWNEwyX1RVTkVSX01PREVfTU9OTzogeyovCisJCWRlZmF1bHQ6IC8qIGNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86ICovCiAJCQlkcHJpbnRrKDIsICJWSURJT0NfU19UVU5FUjogVERBOTg0MF9TRVRfTU9OT1xuIik7CiAJCQlmbV9tYXRyaXggPSAweDMwMDA7IC8vIG1vbm8KIAkJCXNyYyA9IDB4MDAzMDsKQEAgLTQwNiw3ICs0NDEsNyBAQAogCQlkcHJpbnRrKDIsICJWSURJT0NfRU5VTUlOUFVUOiAlZFxuIiwgaS0+aW5kZXgpOwogCiAJCWlmIChhdjcxMTAtPmFuYWxvZ190dW5lcl9mbGFncykgewotCQkJaWYgKGktPmluZGV4IDwgMCB8fCBpLT5pbmRleCA+PSAyKQorCQkJaWYgKGktPmluZGV4IDwgMCB8fCBpLT5pbmRleCA+PSA0KQogCQkJCXJldHVybiAtRUlOVkFMOwogCQl9IGVsc2UgewogCQkJaWYgKGktPmluZGV4ICE9IDApCkBAIC00MzMsMTAgKzQ2OCw5IEBACiAJCWlmICghYXY3MTEwLT5hbmFsb2dfdHVuZXJfZmxhZ3MpCiAJCQlyZXR1cm4gMDsKIAotCQlpZiAoaW5wdXQgPCAwIHx8IGlucHV0ID49IDIpCisJCWlmIChpbnB1dCA8IDAgfHwgaW5wdXQgPj0gNCkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCS8qIEZJWE1FOiBzd2l0Y2ggaW5wdXRzIGhlcmUgKi8KIAkJYXY3MTEwLT5jdXJyZW50X2lucHV0ID0gaW5wdXQ7CiAJCXJldHVybiBhdjcxMTBfZHZiX2Nfc3dpdGNoKGZoKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCmluZGV4IDk3NDZkMmIuLjc2OTJjZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCkBAIC0xOTIsNyArMTkyLDcgQEAKIHsKIAlzdHJ1Y3QgYnVkZ2V0X2F2ICpidWRnZXRfYXYgPSAoc3RydWN0IGJ1ZGdldF9hdiAqKSBjYS0+ZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKnNhYSA9IGJ1ZGdldF9hdi0+YnVkZ2V0LmRldjsKLQlpbnQgdGltZW91dCA9IDUwOyAvLyA1IHNlY29uZHMgKDQuNC42IFJlYWR5KQorCWludCB0aW1lb3V0ID0gNTAwOyAvLyA1IHNlY29uZHMgKDQuNC42IFJlYWR5KQogCiAJaWYgKHNsb3QgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMTcsNyArMjE3LDYgQEAKIAl7CiAJCXByaW50ayhLRVJOX0VSUiAiYnVkZ2V0LWF2OiBjYW0gcmVzZXQgZmFpbGVkICh0aW1lb3V0KS5cbiIpOwogCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAyLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOyAvKiBkaXNhYmxlIGNhcmQgKi8KLQkJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMCwgU0FBNzE0Nl9HUElPX09VVEhJKTsgLyogVmNjIG9mZiAqLwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CiAKQEAgLTI3Niw3ICsyNzUsNiBAQAogCQl7CiAJCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBlamVjdGVkXG4iKTsKIAkJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDIsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8qIGRpc2FibGUgY2FyZCAqLwotCQkJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMCwgU0FBNzE0Nl9HUElPX09VVEhJKTsgLyogVmNjIG9mZiAqLwogCQkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IDA7CiAJCX0KIAl9CkBAIC00NTMsOSArNDUxLDkgQEAKIH0KIAogc3RhdGljIGludCBwaGlsaXBzX3N1MTI3OF90eV9jaV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKIAkJCQkJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7Ci0Jc3RydWN0IGJ1ZGdldF9hdiAqYnVkZ2V0X2F2ID0gKHN0cnVjdCBidWRnZXRfYXYgKikgZmUtPmR2Yi0+cHJpdjsKIAl1MzIgZGl2OwogCXU4IGJ1Zls0XTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHIgPSAweDYxLC5mbGFncyA9IDAsLmJ1ZiA9IGJ1ZiwubGVuID0gc2l6ZW9mKGJ1ZikgfTsKQEAgLTQ4MSw3ICs0NzksNyBAQAogCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMjE1MDAwMCkKIAkJYnVmWzNdIHw9IDB4QzA7CiAKLQlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKKwlpZiAoaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CkBAIC03NDUsNiArNzQzLDcgQEAKIAkJY2FzZSBTVUJJRF9EVkJDX0tOQzFfUExVUzoKIAkJY2FzZSBTVUJJRF9EVkJUX0tOQzFfUExVUzoKIAkJCS8vIEVuYWJsZSAvIFBvd2VyT04gRnJvbnRlbmQKKwkJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDAsIFNBQTcxNDZfR1BJT19PVVRMTyk7CiAJCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAzLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOwogCQkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwppbmRleCBhMTI2NzA1Li4yOTgwZGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwpAQCAtNDAsNiArNDAsNyBAQAogCiAjaW5jbHVkZSAiZHZiX2NhX2VuNTAyMjEuaCIKICNpbmNsdWRlICJzdHYwMjk5LmgiCisjaW5jbHVkZSAic3R2MDI5Ny5oIgogI2luY2x1ZGUgInRkYTEwMDR4LmgiCiAKICNkZWZpbmUgREVCSUFERFJfSVIJCTB4MTIzNApAQCAtNTQ4LDkgKzU0OSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWxwc19ic3J1Nl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3N0YXRpYyBpbnQgYWxwc19ic3J1Nl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7Ci0Jc3RydWN0IGJ1ZGdldF9jaSAqYnVkZ2V0X2NpID0gKHN0cnVjdCBidWRnZXRfY2kgKikgZmUtPmR2Yi0+cHJpdjsKIAl1OCBidWZbNF07CiAJdTMyIGRpdjsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHIgPSAweDYxLC5mbGFncyA9IDAsLmJ1ZiA9IGJ1ZiwubGVuID0gc2l6ZW9mKGJ1ZikgfTsKQEAgLTU2Nyw3ICs1NjcsNyBAQAogCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+IDE1MzAwMDApCiAJCWJ1ZlszXSA9IDB4YzA7CiAKLQlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKKwlpZiAoaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CkBAIC02NjksOSArNjY5LDkgQEAKIH0KIAogc3RhdGljIGludCBwaGlsaXBzX3N1MTI3OF90dF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSAgICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMsCiAJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKLQlzdHJ1Y3QgYnVkZ2V0X2NpICpidWRnZXRfY2kgPSAoc3RydWN0IGJ1ZGdldF9jaSAqKSBmZS0+ZHZiLT5wcml2OwogCXUzMiBkaXY7CiAJdTggYnVmWzRdOwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkciA9IDB4NjAsLmZsYWdzID0gMCwuYnVmID0gYnVmLC5sZW4gPSBzaXplb2YoYnVmKSB9OwpAQCAtNjk3LDcgKzY5Nyw3IEBACiAJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAyMTUwMDAwKQogCQlidWZbM10gfD0gMHhDMDsKIAotCWlmIChpMmNfdHJhbnNmZXIoJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQorCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KQEAgLTg0OCw2ICs4NDgsMTgwIEBACiAJLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3RkbTEzMTZsX3JlcXVlc3RfZmlybXdhcmUsCiB9OwogCitzdGF0aWMgaW50IGR2YmNfcGhpbGlwc190ZG0xMzE2bF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYnVkZ2V0X2NpICpidWRnZXRfY2kgPSAoc3RydWN0IGJ1ZGdldF9jaSAqKSBmZS0+ZHZiLT5wcml2OworCXU4IHR1bmVyX2J1Zls1XTsKKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSBidWRnZXRfY2ktPnR1bmVyX3BsbF9hZGRyZXNzLAorCQkJCSAgICAuZmxhZ3MgPSAwLAorCQkJCSAgICAuYnVmID0gdHVuZXJfYnVmLAorCQkJCSAgICAubGVuID0gc2l6ZW9mKHR1bmVyX2J1ZikgfTsKKwlpbnQgdHVuZXJfZnJlcXVlbmN5ID0gMDsKKwl1OCBiYW5kLCBjcCwgZmlsdGVyOworCisJLy8gZGV0ZXJtaW5lIGNoYXJnZSBwdW1wCisJdHVuZXJfZnJlcXVlbmN5ID0gcGFyYW1zLT5mcmVxdWVuY3kgKyAzNjEyNTAwMDsKKwlpZiAodHVuZXJfZnJlcXVlbmN5IDwgODcwMDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDEzMDAwMDAwMCkgeworCQljcCA9IDM7CisJCWJhbmQgPSAxOworCX0gZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgMTYwMDAwMDAwKSB7CisJCWNwID0gNTsKKwkJYmFuZCA9IDE7CisJfSBlbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAyMDAwMDAwMDApIHsKKwkJY3AgPSA2OworCQliYW5kID0gMTsKKwl9IGVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDI5MDAwMDAwMCkgeworCQljcCA9IDM7CisJCWJhbmQgPSAyOworCX0gZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgNDIwMDAwMDAwKSB7CisJCWNwID0gNTsKKwkJYmFuZCA9IDI7CisJfSBlbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA0ODAwMDAwMDApIHsKKwkJY3AgPSA2OworCQliYW5kID0gMjsKKwl9IGVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDYyMDAwMDAwMCkgeworCQljcCA9IDM7CisJCWJhbmQgPSA0OworCX0gZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgODMwMDAwMDAwKSB7CisJCWNwID0gNTsKKwkJYmFuZCA9IDQ7CisJfSBlbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA4OTUwMDAwMDApIHsKKwkJY3AgPSA3OworCQliYW5kID0gNDsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvLyBhc3N1bWUgUExMIGZpbHRlciBzaG91bGQgYWx3YXlzIGJlIDhNSHogZm9yIHRoZSBtb21lbnQuCisJZmlsdGVyID0gMTsKKworCS8vIGNhbGN1bGF0ZSBkaXZpc29yCisJdHVuZXJfZnJlcXVlbmN5ID0gKHBhcmFtcy0+ZnJlcXVlbmN5ICsgMzYxMjUwMDAgKyAoNjI1MDAvMikpIC8gNjI1MDA7CisKKwkvLyBzZXR1cCB0dW5lciBidWZmZXIKKwl0dW5lcl9idWZbMF0gPSB0dW5lcl9mcmVxdWVuY3kgPj4gODsKKwl0dW5lcl9idWZbMV0gPSB0dW5lcl9mcmVxdWVuY3kgJiAweGZmOworCXR1bmVyX2J1ZlsyXSA9IDB4Yzg7CisJdHVuZXJfYnVmWzNdID0gKGNwIDw8IDUpIHwgKGZpbHRlciA8PCAzKSB8IGJhbmQ7CisJdHVuZXJfYnVmWzRdID0gMHg4MDsKKworCXN0djAyOTdfZW5hYmxlX3BsbGkyYyhmZSk7CisJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCisJCXJldHVybiAtRUlPOworCisJbXNsZWVwKDUwKTsKKworCXN0djAyOTdfZW5hYmxlX3BsbGkyYyhmZSk7CisJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCisJCXJldHVybiAtRUlPOworCisJbXNsZWVwKDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfaW5pdHRhYltdID0geworCTB4ODAsIDB4MDEsCisJMHg4MCwgMHgwMCwKKwkweDgxLCAweDAxLAorCTB4ODEsIDB4MDAsCisJMHgwMCwgMHgwOSwKKwkweDAxLCAweDY5LAorCTB4MDMsIDB4MDAsCisJMHgwNCwgMHgwMCwKKwkweDA3LCAweDAwLAorCTB4MDgsIDB4MDAsCisJMHgyMCwgMHgwMCwKKwkweDIxLCAweDQwLAorCTB4MjIsIDB4MDAsCisJMHgyMywgMHgwMCwKKwkweDI0LCAweDQwLAorCTB4MjUsIDB4ODgsCisJMHgzMCwgMHhmZiwKKwkweDMxLCAweDAwLAorCTB4MzIsIDB4ZmYsCisJMHgzMywgMHgwMCwKKwkweDM0LCAweDUwLAorCTB4MzUsIDB4N2YsCisJMHgzNiwgMHgwMCwKKwkweDM3LCAweDIwLAorCTB4MzgsIDB4MDAsCisJMHg0MCwgMHgxYywKKwkweDQxLCAweGZmLAorCTB4NDIsIDB4MjksCisJMHg0MywgMHgyMCwKKwkweDQ0LCAweGZmLAorCTB4NDUsIDB4MDAsCisJMHg0NiwgMHgwMCwKKwkweDQ5LCAweDA0LAorCTB4NGEsIDB4MDAsCisJMHg0YiwgMHg3YiwKKwkweDUyLCAweDMwLAorCTB4NTUsIDB4YWUsCisJMHg1NiwgMHg0NywKKwkweDU3LCAweGUxLAorCTB4NTgsIDB4M2EsCisJMHg1YSwgMHgxZSwKKwkweDViLCAweDM0LAorCTB4NjAsIDB4MDAsCisJMHg2MywgMHgwMCwKKwkweDY0LCAweDAwLAorCTB4NjUsIDB4MDAsCisJMHg2NiwgMHgwMCwKKwkweDY3LCAweDAwLAorCTB4NjgsIDB4MDAsCisJMHg2OSwgMHgwMCwKKwkweDZhLCAweDAyLAorCTB4NmIsIDB4MDAsCisJMHg3MCwgMHhmZiwKKwkweDcxLCAweDAwLAorCTB4NzIsIDB4MDAsCisJMHg3MywgMHgwMCwKKwkweDc0LCAweDBjLAorCTB4ODAsIDB4MDAsCisJMHg4MSwgMHgwMCwKKwkweDgyLCAweDAwLAorCTB4ODMsIDB4MDAsCisJMHg4NCwgMHgwNCwKKwkweDg1LCAweDgwLAorCTB4ODYsIDB4MjQsCisJMHg4NywgMHg3OCwKKwkweDg4LCAweDEwLAorCTB4ODksIDB4MDAsCisJMHg5MCwgMHgwMSwKKwkweDkxLCAweDAxLAorCTB4YTAsIDB4MDQsCisJMHhhMSwgMHgwMCwKKwkweGEyLCAweDAwLAorCTB4YjAsIDB4OTEsCisJMHhiMSwgMHgwYiwKKwkweGMwLCAweDUzLAorCTB4YzEsIDB4NzAsCisJMHhjMiwgMHgxMiwKKwkweGQwLCAweDAwLAorCTB4ZDEsIDB4MDAsCisJMHhkMiwgMHgwMCwKKwkweGQzLCAweDAwLAorCTB4ZDQsIDB4MDAsCisJMHhkNSwgMHgwMCwKKwkweGRlLCAweDAwLAorCTB4ZGYsIDB4MDAsCisJMHg2MSwgMHgzOCwKKwkweDYyLCAweDBhLAorCTB4NTMsIDB4MTMsCisJMHg1OSwgMHgwOCwKKwkweGZmLCAweGZmLAorfTsKKworc3RhdGljIHN0cnVjdCBzdHYwMjk3X2NvbmZpZyBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgxYywKKwkuaW5pdHRhYiA9IGR2YmNfcGhpbGlwc190ZG0xMzE2bF9pbml0dGFiLAorCS5pbnZlcnQgPSAwLAorCS5wbGxfc2V0ID0gZHZiY19waGlsaXBzX3RkbTEzMTZsX3BsbF9zZXQsCit9OworCisKIAogCiBzdGF0aWMgdm9pZCBmcm9udGVuZF9pbml0KHN0cnVjdCBidWRnZXRfY2kgKmJ1ZGdldF9jaSkKQEAgLTg2OSw2ICsxMDQzLDE1IEBACiAJCX0KIAkJYnJlYWs7CiAKKwljYXNlIDB4MTAxMDoJCS8vIFRUIERWQi1DIENJIGJ1ZGdldCAoc3R2MDI5Ny9QaGlsaXBzIHRkbTEzMTZsKHRkYTY2NTF0dCkpCisJCWJ1ZGdldF9jaS0+dHVuZXJfcGxsX2FkZHJlc3MgPSAweDYxOworCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPQorCQkJc3R2MDI5N19hdHRhY2goJmR2YmNfcGhpbGlwc190ZG0xMzE2bF9jb25maWcsICZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCk7CisJCWlmIChidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQpIHsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCiAJY2FzZSAweDEwMTE6CQkvLyBIYXVwcGF1Z2UvVFQgTm92YS1UIGJ1ZGdldCAodGRhMTAwNDUvUGhpbGlwcyB0ZG0xMzE2bCh0ZGE2NjUxdHQpICsgVERBOTg4OSkKIAkJYnVkZ2V0X2NpLT50dW5lcl9wbGxfYWRkcmVzcyA9IDB4NjM7CiAJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9CkBAIC04NzgsNyArMTA2MSw3IEBACiAJCX0KIAkJYnJlYWs7CiAKLQljYXNlIDB4MTAxMjoJCS8vIEhhdXBwYXVnZS9UVCBOb3ZhLVQgQ0kgYnVkZ2V0ICh0ZGExMDA0NS9QaGlsaXBzIHRkbTEzMTZsKHRkYTY2NTF0dCkgKyBUREE5ODg5KQorCWNhc2UgMHgxMDEyOgkJLy8gVFQgRFZCLVQgQ0kgYnVkZ2V0ICh0ZGExMDA0Ni9QaGlsaXBzIHRkbTEzMTZsKHRkYTY2NTF0dCkpCiAJCWJ1ZGdldF9jaS0+dHVuZXJfcGxsX2FkZHJlc3MgPSAweDYwOwogCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPQogCQkJdGRhMTAwNDZfYXR0YWNoKCZwaGlsaXBzX3RkbTEzMTZsX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKQEAgLTk2NiwxMCArMTE0OSwxMiBAQAogTUFLRV9CVURHRVRfSU5GTyh0dGJjaSwgIlRULUJ1ZGdldC9XaW5UVi1OT1ZBLUNJIFBDSSIsIEJVREdFVF9UVF9IV19ESVNFUUMpOwogTUFLRV9CVURHRVRfSU5GTyh0dGJ0MiwgIlRULUJ1ZGdldC9XaW5UVi1OT1ZBLVQJIFBDSSIsIEJVREdFVF9UVCk7CiBNQUtFX0JVREdFVF9JTkZPKHR0YnRjaSwgIlRULUJ1ZGdldC1ULUNJIFBDSSIsIEJVREdFVF9UVCk7CitNQUtFX0JVREdFVF9JTkZPKHR0YmNjaSwgIlRULUJ1ZGdldC1DLUNJIFBDSSIsIEJVREdFVF9UVCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfdGJsW10gPSB7CiAJTUFLRV9FWFRFTlNJT05fUENJKHR0YmNpLCAweDEzYzIsIDB4MTAwYyksCiAJTUFLRV9FWFRFTlNJT05fUENJKHR0YmNpLCAweDEzYzIsIDB4MTAwZiksCisJTUFLRV9FWFRFTlNJT05fUENJKHR0YmNjaSwgMHgxM2MyLCAweDEwMTApLAogCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJ0MiwgMHgxM2MyLCAweDEwMTEpLAogCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJ0Y2ksIDB4MTNjMiwgMHgxMDEyKSwKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtcGF0Y2guYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1wYXRjaC5jCmluZGV4IDgxNDJlMjYuLmIxZjIxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1wYXRjaC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1wYXRjaC5jCkBAIC0zNTMsOSArMzUzLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhbHBzX2JzcnU2X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBhbHBzX2JzcnU2X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKLQlzdHJ1Y3QgYnVkZ2V0X3BhdGNoKiBidWRnZXQgPSAoc3RydWN0IGJ1ZGdldF9wYXRjaCopIGZlLT5kdmItPnByaXY7CiAJdTggZGF0YVs0XTsKIAl1MzIgZGl2OwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKSB9OwpAQCAtMzcwLDcgKzM2OSw3IEBACiAKIAlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPiAxNTMwMDAwKSBkYXRhWzNdID0gMHhjMDsKIAotCWlmIChpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSByZXR1cm4gLUVJTzsKKwlpZiAoaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKaW5kZXggOTk2MTkxNy4uNDNkNmM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKQEAgLTMzMiw5ICszMzIsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFscHNfYnNydTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGFscHNfYnNydTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewotCXN0cnVjdCBidWRnZXQqIGJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0KikgZmUtPmR2Yi0+cHJpdjsKIAl1OCBkYXRhWzRdOwogCXUzMiBkaXY7CiAJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4NjEsIC5mbGFncyA9IDAsIC5idWYgPSBkYXRhLCAubGVuID0gc2l6ZW9mKGRhdGEpIH07CkBAIC0zNDksNyArMzQ4LDcgQEAKIAogCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+IDE1MzAwMDApIGRhdGFbM10gPSAweGMwOwogCi0JaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOworCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKSByZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDgxLDYgKzQ4MCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgczVoMTQyMF9jb25maWcgczVoMTQyMF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDUzLAorCS5pbnZlcnQgPSAxLAogCS5wbGxfc2V0ID0gczVoMTQyMF9wbGxfc2V0LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMKaW5kZXggYWE0M2I1Zi4uZDIwMGFiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvZHZiLXR0dXNiLWJ1ZGdldC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogCiAjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCkBAIC01NzAsNyArNTcxLDggQEAKIAkJCQkgIGNvbnN0IHU4ICogZGF0YSwgaW50IGxlbik7CiAjZW5kaWYKIAotc3RhdGljIGludCBudW1wa3QgPSAwLCBsYXN0aiwgbnVtdHMsIG51bXN0dWZmLCBudW1zZWMsIG51bWludmFsaWQ7CitzdGF0aWMgaW50IG51bXBrdCA9IDAsIG51bXRzLCBudW1zdHVmZiwgbnVtc2VjLCBudW1pbnZhbGlkOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdGo7CiAKIHN0YXRpYyB2b2lkIHR0dXNiX3Byb2Nlc3NfbXV4cGFjayhzdHJ1Y3QgdHR1c2IgKnR0dXNiLCBjb25zdCB1OCAqIG11eHBhY2ssCiAJCQkgICBpbnQgbGVuKQpAQCAtNzc5LDcgKzc4MSw3IEBACiAJCQl1OCAqZGF0YTsKIAkJCWludCBsZW47CiAJCQludW1wa3QrKzsKLQkJCWlmICgoamlmZmllcyAtIGxhc3RqKSA+PSBIWikgeworCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbGFzdGogKyBIWikpIHsKICNpZiBERUJVRyA+IDIKIAkJCQlwcmludGsKIAkJCQkgICAgKCJmcmFtZXMvczogJWQgKHRzOiAlZCwgc3R1ZmYgJWQsIHNlYzogJWQsIGludmFsaWQ6ICVkLCBhbGw6ICVkKVxuIiwKQEAgLTEyOTksNyArMTMwMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc190c2E1MDU5X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQorc3RhdGljIGludCBwaGlsaXBzX3RzYTUwNTlfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCB0dHVzYiogdHR1c2IgPSAoc3RydWN0IHR0dXNiKikgZmUtPmR2Yi0+cHJpdjsKIAl1OCBidWZbNF07CkBAIC0xMzIyLDcgKzEzMjQsNyBAQAogCWlmICh0dHVzYi0+cmV2aXNpb24gPT0gVFRVU0JfUkVWXzJfMikKIAkJYnVmWzNdIHw9IDB4MjA7CiAKLQlpZiAoaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCisJaWYgKGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CkBAIC0xNDcyLDggKzE0NzQsNiBAQAogCiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSB0dHVzYl9kZWNfYWxnbyA9IHsKLQkubmFtZQkJPSAidHR1c2IgZGVjIGkyYyBhbGdvcml0aG0iLAotCS5pZAkJPSBJMkNfQUxHT19CSVQsCiAJLm1hc3Rlcl94ZmVyCT0gbWFzdGVyX3hmZXIsCiAJLmZ1bmN0aW9uYWxpdHkJPSBmdW5jdGlvbmFsaXR5LAogfTsKQEAgLTE1MjUsNyArMTUyNSw2IEBACiAjZW5kaWYKIAl0dHVzYi0+aTJjX2FkYXAuYWxnbyAgICAgICAgICAgICAgPSAmdHR1c2JfZGVjX2FsZ287CiAJdHR1c2ItPmkyY19hZGFwLmFsZ29fZGF0YSAgICAgICAgID0gTlVMTDsKLQl0dHVzYi0+aTJjX2FkYXAuaWQgICAgICAgICAgICAgICAgPSBJMkNfQUxHT19CSVQ7CiAKIAlyZXN1bHQgPSBpMmNfYWRkX2FkYXB0ZXIoJnR0dXNiLT5pMmNfYWRhcCk7CiAJaWYgKHJlc3VsdCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCmluZGV4IDQ1YzlhOWEuLjNkMDhmYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCmluZGV4IDNmNTc0MjMuLjkzNTcwMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKQEAgLTIyLDEyICsyMiwyMSBAQAogCSAgdGhlIE1pcm8sIEhhdXBwYXVnZSBhbmQgU1RCIGJvYXJkcy4gUGxlYXNlIHJlYWQgdGhlIG1hdGVyaWFsIGluCiAJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAotCSAgSWYgeW91IHNheSBZIG9yIE0gaGVyZSwgeW91IG5lZWQgdG8gc2F5IFkgb3IgTSB0byAiSTJDIHN1cHBvcnQiIGFuZAotCSAgIkkyQyBiaXQtYmFuZ2luZyBpbnRlcmZhY2VzIiBpbiB0aGUgZGV2aWNlIGRyaXZlcnMgc2VjdGlvbi4KLQogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYnR0di4KIAorY29uZmlnIFZJREVPX1NBQTY1ODgKKwl0cmlzdGF0ZSAiU0FBNjU4OCBSYWRpbyBDaGlwIFJEUyBkZWNvZGVyIHN1cHBvcnQgb24gQlQ4NDggY2FyZHMiCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgSTJDICYmIFZJREVPX0JUODQ4CisKKwloZWxwCisJICBTdXBwb3J0IGZvciAgUmFkaW8gRGF0YSBTeXN0ZW0gKFJEUykgZGVjb2Rlci4gVGhpcyBhbGxvd3Mgc2VlaW5nCisJICByYWRpbyBzdGF0aW9uIGlkZW50aWZpY2F0aW9uIHRyYW5zbWl0dGVkIHVzaW5nIHRoaXMgc3RhbmRhcmQuCisJICBDdXJyZW50bGx5LCBpdCB3b3JrcyBvbmx5IHdpdGggYnQ4eDggY2hpcHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNhYTY1ODguCisKIGNvbmZpZyBWSURFT19QTVMKIAl0cmlzdGF0ZSAiTWVkaWF2aXNpb24gUHJvIE1vdmllIFN0dWRpbyBWaWRlbyBGb3IgTGludXgiCiAJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgSVNBCkBAIC0yNTQsNiArMjYzLDcgQEAKIAlzZWxlY3QgVklERU9fQlVGX0RWQgogCXNlbGVjdCBEVkJfTVQzNTIKIAlzZWxlY3QgRFZCX0NYMjI3MDIKKwlzZWxlY3QgRFZCX1REQTEwMDRYCiAJLS0taGVscC0tLQogCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIERWQiBjYXJkcyBiYXNlZCBvbiB0aGUKIAkgIFBoaWxpcHMgc2FhNzEzNCBjaGlwLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKaW5kZXggODEwZTdhYS4uMDQ2YjgyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCkBAIC01LDYgKzUsNyBAQAogYnR0di1vYmpzCTo9CWJ0dHYtZHJpdmVyLm8gYnR0di1jYXJkcy5vIGJ0dHYtaWYubyBcCiAJCQlidHR2LXJpc2MubyBidHR2LXZiaS5vIGJ0dHYtaTJjLm8gYnR0di1ncGlvLm8KIHpvcmFuLW9ianMgICAgICA6PQl6cjM2MTIwLm8genIzNjEyMF9pMmMubyB6cjM2MTIwX21lbS5vCityZHMtb2JqcyAgICAgICAgOj0Jc2FhNjU4OC5vCiB6cjM2MDY3LW9ianMJOj0Jem9yYW5fcHJvY2ZzLm8gem9yYW5fZGV2aWNlLm8gXAogCQkJem9yYW5fZHJpdmVyLm8gem9yYW5fY2FyZC5vCiB0dW5lci1vYmpzCTo9CXR1bmVyLWNvcmUubyB0dW5lci1zaW1wbGUubyBtdDIweHgubyB0ZGE4MjkwLm8gdGVhNTc2Ny5vCkBAIC0xNSw2ICsxNiw3IEBACiBvYmotJChDT05GSUdfU09VTkRfVFZNSVhFUikgKz0gdHZtaXhlci5vCiAKIG9iai0kKENPTkZJR19WSURFT19aUjM2MTIwKSArPSB6b3Jhbi5vCitvYmotJChDT05GSUdfVklERU9fU0FBNjU4OCkgKz0gcmRzLm8KIG9iai0kKENPTkZJR19WSURFT19TQUE1MjQ2QSkgKz0gc2FhNTI0NmEubwogb2JqLSQoQ09ORklHX1ZJREVPX1NBQTUyNDkpICs9IHNhYTUyNDkubwogb2JqLSQoQ09ORklHX1ZJREVPX0NRQ0FNKSArPSBjLXFjYW0ubwpAQCAtMjksNyArMzEsNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX1pPUkFOKSArPSB6cjM2MDY3Lm8gdmlkZW9jb2RlYy5vCiBvYmotJChDT05GSUdfVklERU9fUE1TKSArPSBwbXMubwogb2JqLSQoQ09ORklHX1ZJREVPX1BMQU5CKSArPSBwbGFuYi5vCi1vYmotJChDT05GSUdfVklERU9fVklOTykgKz0gdmluby5vCitvYmotJChDT05GSUdfVklERU9fVklOTykgKz0gdmluby5vIHNhYTcxOTEubyBpbmR5Y2FtLm8KIG9iai0kKENPTkZJR19WSURFT19TVFJBRElTKSArPSBzdHJhZGlzLm8KIG9iai0kKENPTkZJR19WSURFT19DUElBKSArPSBjcGlhLm8KIG9iai0kKENPTkZJR19WSURFT19DUElBX1BQKSArPSBjcGlhX3BwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWR2NzE3MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTcwLmMKaW5kZXggNDg5ODllZC4uMWNhMmI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTcwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTcwLmMKQEAgLTQzLDcgKzQzLDYgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgpAQCAtMzkxLDcgKzM5MCw2IEBACiAJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKIAkucHJvYmUJCQk9ICZpZ25vcmUsCiAJLmlnbm9yZQkJCT0gJmlnbm9yZSwKLQkuZm9yY2UJCQk9ICZpZ25vcmUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9hZHY3MTcwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTc1LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzUuYwppbmRleCBmODk4YjY1Li4xNzNiY2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzUuYwpAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CkBAIC00NDEsNyArNDQwLDYgQEAKIAkubm9ybWFsX2kyYwkJPSBub3JtYWxfaTJjLAogCS5wcm9iZQkJCT0gJmlnbm9yZSwKIAkuaWdub3JlCQkJPSAmaWdub3JlLAotCS5mb3JjZQkJCT0gJmlnbm9yZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX2FkdjcxNzU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODE5LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODE5LmMKaW5kZXggODczMzU4OC4uM2VlMGFmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDgxOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MTkuYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CkBAIC01MDcsNyArNTA2LDYgQEAKIAkubm9ybWFsX2kyYwkJPSBub3JtYWxfaTJjLAogCS5wcm9iZQkJCT0gJmlnbm9yZSwKIAkuaWdub3JlCQkJPSAmaWdub3JlLAotCS5mb3JjZQkJCT0gJmlnbm9yZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX2J0ODE5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5jCmluZGV4IGEwNzA0MTcuLjc2YzFiNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MzIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODMyLmMKQEAgLTE4OCw3ICsxODgsNyBAQAogCWlmIChhZGFwLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCiAJCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgYnQ4MzJfYXR0YWNoKTsKICNlbHNlCi0JaWYgKGFkYXAtPmlkID09IChJMkNfQUxHT19CSVQgfCBJMkNfSFdfQl9CVDg0OCkpCisJaWYgKGFkYXAtPmlkID09IEkyQ19IV19CX0JUODQ4KQogCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIGJ0ODMyX2F0dGFjaCk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKQEAgLTI0MSw3ICsyNDEsNyBAQAogfTsKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQogewotCUkyQ19ERVZOQU1FKCJidDgzMiIpLAorCS5uYW1lICAgICAgID0gImJ0ODMyIiwKIAkuZmxhZ3MgICAgICA9IEkyQ19DTElFTlRfQUxMT1dfVVNFLAogICAgICAgICAuZHJpdmVyICAgICA9ICZkcml2ZXIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDg1Ni5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDg1Ni5jCmluZGV4IGE1ZDUyOWMuLjhlYjg3MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4NTYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODU2LmMKQEAgLTQzLDcgKzQzLDYgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgpAQCAtMjk1LDcgKzI5NCw2IEBACiAJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKIAkucHJvYmUJCQk9ICZpZ25vcmUsCiAJLmlnbm9yZQkJCT0gJmlnbm9yZSwKLQkuZm9yY2UJCQk9ICZpZ25vcmUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9idDg1NjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnRjeC1yaXNjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0Y3gtcmlzYy5jCmluZGV4IDdmMmQ1MTUuLmE0OGRlM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnRjeC1yaXNjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idGN4LXJpc2MuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gICAgJElkOiBidGN4LXJpc2MuYyx2IDEuNiAyMDA1LzAyLzIxIDEzOjU3OjU5IGtyYXhlbCBFeHAgJAogCiAgICAgYnRjeC1yaXNjLmMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idGN4LXJpc2MuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnRjeC1yaXNjLmgKaW5kZXggNDFmNjAzOS4uNTAzZTZjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idGN4LXJpc2MuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0Y3gtcmlzYy5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogYnRjeC1yaXNjLmgsdiAxLjIgMjAwNC8wOS8xNSAxNjoxNToyNCBrcmF4ZWwgRXhwICQKICAqLwogc3RydWN0IGJ0Y3hfcmlzY21lbSB7CiAJdW5zaWduZWQgaW50ICAgc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWNhcmRzLmMKaW5kZXggYTk3YjliOS4uMTkwOTc3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWNhcmRzLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICAgICRJZDogYnR0di1jYXJkcy5jLHYgMS41NCAyMDA1LzA3LzE5IDE4OjI2OjQ2IG1rcnVma3kgRXhwICQKIAogICAgIGJ0dHYtY2FyZHMuYwogCkBAIC0xNjksMTAgKzE2OCwxMCBAQAogIAl7IDB4ZDAxODEwZmMsIEJUVFZfR1ZCQ1RWNVBDSSwgICAgIkktTyBEYXRhIENvLiBHVi1CQ1RWNS9QQ0kiIH0sCiAKIAl7IDB4MDAxMjExYmQsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYiIH0sCi0JLy8gc29tZSBjYXJkcyBzaGlwIHdpdGggYnl0ZXN3YXBwZWQgSURzIC4uLgorCS8qIHNvbWUgY2FyZHMgc2hpcCB3aXRoIGJ5dGVzd2FwcGVkIElEcyAuLi4gKi8KIAl7IDB4MTIwMGJkMTEsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYgW2Jzd2FwXSIgfSwKIAl7IDB4ZmYwMGJkMTEsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYgW2Jzd2FwXSIgfSwKLQkvLyB0aGlzIHNlZW1zIHRvIGhhcHBlbiBhcyB3ZWxsIC4uLgorCS8qIHRoaXMgc2VlbXMgdG8gaGFwcGVuIGFzIHdlbGwgLi4uICovCiAJeyAweGZmMTIxMWJkLCBCVFRWX1BJTk5BQ0xFLCAgICAgICJQaW5uYWNsZSBQQ1RWIiB9LAogCiAJeyAweDMwMDAxMjFhLCBCVFRWX1ZPT0RPT1RWX0ZNLCAgICIzRGZ4IFZvb2Rvb1RWIEZNLyBWb29kb29UViAyMDAiIH0sCkBAIC0yMDAsMTIgKzE5OSwxMiBAQAogCiAJeyAweDExMjMxNTNiLCBCVFRWX1RFUlJBVFZSQURJTywgICJUZXJyYXRlYyBUViBSYWRpbysiIH0sCiAJeyAweDExMjcxNTNiLCBCVFRWX1RFUlJBVFYsICAgICAgICJUZXJyYXRlYyBUVisgKFYxLjA1KSIgICAgfSwKLQkvLyBjbGFzaGVzIHdpdGggRmx5VmlkZW8KLQkvL3sgMHgxODUyMTg1MiwgQlRUVl9URVJSQVRWLCAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMTApIiAgICB9LAorCS8qIGNsYXNoZXMgd2l0aCBGbHlWaWRlbworCSAqeyAweDE4NTIxODUyLCBCVFRWX1RFUlJBVFYsICAgICAiVGVycmF0ZWMgVFYrIChWMS4xMCkiICAgIH0sICovCiAJeyAweDExMzQxNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKExSMTAyKSIgfSwKLQl7IDB4MTEzNTE1M2IsIEJUVFZfVEVSUkFUVkFMVUVSLCAgIlRlcnJhdGVjIFRWYWx1ZSBSYWRpbyIgfSwgLy8gTFIxMDIKLQl7IDB4NTAxODE1M2IsIEJUVFZfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSIgfSwgICAgICAgLy8gPz8KLQl7IDB4ZmYzYjE1M2IsIEJUVFZfVEVSUkFUVkFMVUVSLCAgIlRlcnJhdGVjIFRWYWx1ZSBSYWRpbyIgfSwgLy8gPz8KKwl7IDB4MTEzNTE1M2IsIEJUVFZfVEVSUkFUVkFMVUVSLCAgIlRlcnJhdGVjIFRWYWx1ZSBSYWRpbyIgfSwgLyogTFIxMDIgKi8KKwl7IDB4NTAxODE1M2IsIEJUVFZfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSIgfSwgICAgICAgLyogPz8gKi8KKwl7IDB4ZmYzYjE1M2IsIEJUVFZfVEVSUkFUVkFMVUVSLCAgIlRlcnJhdGVjIFRWYWx1ZSBSYWRpbyIgfSwgLyogPz8gKi8KIAogCXsgMHg0MDAwMTViMCwgQlRUVl9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViIgfSwKIAl7IDB4NDAwYTE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCkBAIC0yODcsMTAgKzI4NiwxMiBAQAogCXsgMHgwMTA3MTgwNSwgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMzIiB9LAogCXsgMHgwMTA4MTgwNSwgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICM0IiB9LAogCi0JLy8gbGlrZWx5IGJyb2tlbiwgdmVuZG9yIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIG90aGVyIG1hZ2ljIHZpZXdzIC4uLgotCS8veyAweGEwZmNhMDRmLCBCVFRWX01BR0lDVFZJRVcwNjMsICJHdWlsbGVtb3QgTWF4aSBUViBWaWRlbyAzIiB9LAorCXsgMHgxNTQwOTUxMSwgQlRUVl9BQ09SUF9ZODc4RiwgIkFjb3JwIFk4NzhGIiB9LAogCi0JLy8gRFZCIGNhcmRzICh1c2luZyBwY2kgZnVuY3Rpb24gLjEgZm9yIG1wZWcgZGF0YSB4ZmVyKQorCS8qIGxpa2VseSBicm9rZW4sIHZlbmRvciBpZCBkb2Vzbid0IG1hdGNoIHRoZSBvdGhlciBtYWdpYyB2aWV3cyAuLi4KKwkgKiB7IDB4YTBmY2EwNGYsIEJUVFZfTUFHSUNUVklFVzA2MywgIkd1aWxsZW1vdCBNYXhpIFRWIFZpZGVvIDMiIH0sICovCisKKwkvKiBEVkIgY2FyZHMgKHVzaW5nIHBjaSBmdW5jdGlvbiAuMSBmb3IgbXBlZyBkYXRhIHhmZXIpICovCiAJeyAweDAxMDEwMDcxLCBCVFRWX05FQlVMQV9ESUdJVFYsICJOZWJ1bGEgRWxlY3Ryb25pY3MgRGlnaVRWIiB9LAogCXsgMHgwNzYxMTQ2MSwgQlRUVl9BVkRWQlRfNzYxLCAgICAiQXZlck1lZGlhIEF2ZXJUViBEVkItVCA3NjEiIH0sCiAJeyAweDAwMWMxMWJkLCBCVFRWX1BJTk5BQ0xFU0FULCAgICJQaW5uYWNsZSBQQ1RWIFNhdCIgfSwKQEAgLTI5OCw3ICsyOTksOCBAQAogCXsgMHgwMDAxMTgyMiwgQlRUVl9UV0lOSEFOX0RTVCwgICAiVHdpbmhhbiBWaXNpb25QbHVzIERWQiIgfSwKIAl7IDB4ZmMwMDI3MGYsIEJUVFZfVFdJTkhBTl9EU1QsICAgIkNoYWluVGVjaCBkaWdpdG9wIERTVC0xMDAwIERWQi1TIiB9LAogCXsgMHgwNzcxMTQ2MSwgQlRUVl9BVkRWQlRfNzcxLCAgICAiQVZlcm1lZGlhIEF2ZXJUViBEVkItVCA3NzEiIH0sCi0JeyAweGRiMTAxOGFjLCBCVFRWX0RWSUNPX0RWQlRfTElURSwgICAgIkRWSUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIgfSwKKwl7IDB4ZGIxMDE4YWMsIEJUVFZfRFZJQ09fRFZCVF9MSVRFLCAgICAiRFZpQ08gRnVzaW9uSERUViBEVkItVCBMaXRlIiB9LAorCXsgMHhkNTAwMThhYywgQlRUVl9EVklDT19GVVNJT05IRFRWXzVfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiB9LAogCiAJeyAwLCAtMSwgTlVMTCB9CiB9OwpAQCAtMzE2LDYgKzMxOCw3IEBACiAJLnN2aHMJCT0gMiwKIAkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiTUlSTyBQQ1RWIiwKIAkudmlkZW9faW5wdXRzCT0gNCwKQEAgLTMyNyw2ICszMzAsNyBAQAogCS5hdWRpb211eAk9IHsgMiwgMCwgMCwgMCwgMTB9LAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJIYXVwcGF1Z2UgKGJ0ODQ4KSIsCiAJLnZpZGVvX2lucHV0cwk9IDQsCkBAIC0zMzgsNiArMzQyLDcgQEAKIAkuYXVkaW9tdXgJPSB7IDAsIDEsIDIsIDMsIDR9LAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJTVEIsIEdhdGV3YXkgUC9OIDYwMDA2OTkgKGJ0ODQ4KSIsCiAJLnZpZGVvX2lucHV0cwk9IDMsCkBAIC0zNTAsNiArMzU1LDcgQEAKIAkubm9fbXNwMzR4eAk9IDEsCiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS5oYXNfcmFkaW8gICAgICA9IDEsCiB9LHsKQEAgLTM2NSw2ICszNzEsNyBAQAogCS5hdWRpb211eAk9IHsgMCB9LAogCS5uZWVkc190dmF1ZGlvCT0gMCwKIAkudHVuZXJfdHlwZQk9IDQsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIkRpYW1vbmQgRFRWMjAwMCIsCiAJLnZpZGVvX2lucHV0cwk9IDQsCkBAIC0zNzYsNiArMzgzLDcgQEAKIAkuYXVkaW9tdXgJPSB7IDAsIDEsIDAsIDEsIDN9LAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZQaG9uZSIsCiAJLnZpZGVvX2lucHV0cwk9IDMsCkBAIC0zODgsNiArMzk2LDcgQEAKIAkvKiAgICAgICAgICAgICAgICAweDA0IGZvciBzb21lIGNhcmRzID8/ICovCiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5hdWRpb19ob29rCT0gYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8sCiAJLmhhc19yZW1vdGUgICAgID0gMSwKIH0sewpAQCAtNDAxLDYgKzQxMCw3IEBACiAJLmF1ZGlvbXV4CT0gezAgfSwKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAogLyogLS0tLSBjYXJkIDB4MDggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNDE1LDYgKzQyNSw3IEBACiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIklNUy9JWG1pY3JvIFR1cmJvVFYiLAogCS52aWRlb19pbnB1dHMJPSAzLApAQCAtNDI3LDYgKzQzOCw3IEBACiAJLm5lZWRzX3R2YXVkaW8JPSAwLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfUEFMLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJIYXVwcGF1Z2UgKGJ0ODc4KSIsCiAJLnZpZGVvX2lucHV0cwk9IDQsCkBAIC00MzksNiArNDUxLDcgQEAKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiTUlSTyBQQ1RWIHBybyIsCiAJLnZpZGVvX2lucHV0cwk9IDMsCkBAIC00NTAsNiArNDYzLDcgQEAKIAkuYXVkaW9tdXgJPSB7IDB4MjAwMDEsMHgxMDAwMSwgMCwgMCwxMH0sCiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAKIC8qIC0tLS0gY2FyZCAweDBjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQ2Myw2ICs0NzcsNyBAQAogCS5hdWRpb211eAk9IHsgMTMsIDE0LCAxMSwgNywgMCwgMH0sCiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIkFWZXJNZWRpYSBUVkNhcHR1cmUgOTgiLAogCS52aWRlb19pbnB1dHMJPSAzLApAQCAtNDc2LDYgKzQ5MSw3IEBACiAJLm1zcDM0eHhfYWx0ICAgID0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuYXVkaW9faG9vayAgICAgPSBhdmVybWVkaWFfdHZfc3RlcmVvX2F1ZGlvLAogfSx7CiAJLm5hbWUJCT0gIkFpbXNsYWIgVmlkZW8gSGlnaHdheSBYdHJlbWUgKFZIWCkiLApAQCAtNDg5LDYgKzUwNSw3IEBACiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIlpvbHRyaXggVFYtTWF4IiwKIAkudmlkZW9faW5wdXRzCT0gMywKQEAgLTUwMCw2ICs1MTcsNyBAQAogCS5hdWRpb211eAk9IHswICwgMCwgMSAsIDAsIDEwfSwKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAogLyogLS0tLSBjYXJkIDB4MTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNTEwLDcgKzUyOCw3IEBACiAJLnN2aHMJCT0gMiwKIAkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKIAkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCi0JLy8gMjAwMy0xMC0yMCBieSAiQW50b24gQS4gQXJhcG92IiA8YXJhcG92QG1haWwucnU+CisJLyogMjAwMy0xMC0yMCBieSAiQW50b24gQS4gQXJhcG92IiA8YXJhcG92QG1haWwucnU+ICovCiAJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwMWUwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKQEAgLTUyNiw2ICs1NDQsNyBAQAogCS5hdWRpb211eAk9IHsgMHg0ZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDd9LAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuYXVkaW9faG9vawk9IHdpbnZpZXdfYXVkaW8sCiAJLmhhc19yYWRpbwk9IDEsCiB9LHsKQEAgLTUzOSw2ICs1NTgsNyBAQAogCS5hdWRpb211eAk9IHsxLCAwLCAwLCAwLCAwfSwKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gSUkgRVogL0ZseUtpdCBMUjM4IEJ0ODQ4IChjYXB0dXJlIG9ubHkpIiwKIAkudmlkZW9faW5wdXRzCT0gNCwKQEAgLTU1MCw2ICs1NzAsNyBAQAogCS5hdWRpb211eAk9IHsgMCB9LAogCS5ub19tc3AzNHh4CT0gMSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCiAvKiAtLS0tIGNhcmQgMHgxNCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC01NjAsMTAgKzU4MSwxMSBAQAogCS5zdmhzCQk9IDIsCiAJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIEx1Y2t5IFN0YXIgSW1hZ2UgV29ybGQgQ29uZmVyZW5jZVRWIExSNTAiLAogCS52aWRlb19pbnB1dHMJPSA0LAotCS5hdWRpb19pbnB1dHMJPSAyLCAgLy8gdHVuZXIsIGxpbmUgaW4KKwkuYXVkaW9faW5wdXRzCT0gMiwgIC8qIHR1bmVyLCBsaW5lIGluICovCiAJLnR1bmVyCQk9IDAsCiAJLnN2aHMJCT0gMiwKIAkuZ3Bpb21hc2sJPSAweDE4MDAsCkBAIC01NzEsNiArNTkzLDcgQEAKIAkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMX0ksCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIkFza2V5IENQSDA1MC8gUGhvZWJlIFR2IE1hc3RlciArIEZNIiwKIAkudmlkZW9faW5wdXRzCT0gMywKQEAgLTU4Myw2ICs2MDYsNyBAQAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJNb2R1bGFyIFRlY2hub2xvZ3kgTU0yMDEvTU0yMDIvTU0yMDUvTU0yMTAvTU0yMTUgUENUViwgYnQ4NzgiLAogCS52aWRlb19pbnB1dHMJPSAzLApAQCAtNTkxLDExICs2MTUsMTIgQEAKIAkuc3ZocwkJPSAtMSwKIAkuZ3Bpb21hc2sJPSA3LAogCS5tdXhzZWwJCT0geyAyLCAzLCAtMSB9LAotICAgICAgICAuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLAorCS5kaWdpdGFsX21vZGUgICA9IERJR0lUQUxfTU9ERV9DQU1FUkEsCiAJLmF1ZGlvbXV4CT0geyAwLCAwLCAwLCAwLCAwIH0sCiAJLm5vX21zcDM0eHgJPSAxLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BTFBTX1RTQkI1X1BBTF9JLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCiAvKiAtLS0tIGNhcmQgMHgxOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC02MTAsNiArNjM1LDcgQEAKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmhhc19yZW1vdGUgICAgID0gMSwKIH0sewogCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBUZXJyYVRWKyBWZXJzaW9uIDEuMCAoQnQ4NDgpLyBUZXJyYSBUVmFsdWUgVmVyc2lvbiAxLjAvIFZvYmlzIFRWLUJvb3N0YXIiLApAQCAtNjIyLDYgKzY0OCw3IEBACiAJLmF1ZGlvbXV4ICAgICAgID0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwLCAweDQwMDAwfSwKIAkubmVlZHNfdHZhdWRpbwk9IDAsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmF1ZGlvX2hvb2sgICAgID0gdGVycmF0dl9hdWRpbywKIH0sewogCS5uYW1lCQk9ICJIYXVwcGF1Z2UgV2luQ2FtIG5ld2VyIChidDg3OCkiLApAQCAtNjM0LDYgKzY2MSw3IEBACiAJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjUwIiwKIAkudmlkZW9faW5wdXRzCT0gNCwKQEAgLTY0NSw2ICs2NzMsNyBAQAogCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDB9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfU0VDQU0sCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAKIC8qIC0tLS0gY2FyZCAweDFjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTY1OCwzNyArNjg3LDM4IEBACiAJLmF1ZGlvbXV4CT0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAweDAwMDAwLCAweDQwMDAwfSwKIAkubmVlZHNfdHZhdWRpbwk9IDAsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmF1ZGlvX2hvb2sJPSB0ZXJyYXR2X2F1ZGlvLAogCS8qIEdQSU8gd2lyaW5nOgotICAgICAgICAgICAgICAgRXh0ZXJuYWwgMjAgcGluIGNvbm5lY3RvciAoZm9yIEFjdGl2ZSBSYWRpbyBVcGdyYWRlIGJvYXJkKQotICAgICAgICAgICAgICAgZ3BpbzAwOiBpMmMtc2RhCi0gICAgICAgICAgICAgICBncGlvMDE6IGkyYy1zY2wKLSAgICAgICAgICAgICAgIGdwaW8wMjogb201NjEwLWRhdGEKLSAgICAgICAgICAgICAgIGdwaW8wMzogb201NjEwLWNsawotICAgICAgICAgICAgICAgZ3BpbzA0OiBvbTU2MTAtd3JlCi0gICAgICAgICAgICAgICBncGlvMDU6IG9tNTYxMC1zdGVyZW8KLSAgICAgICAgICAgICAgIGdwaW8wNjogcmRzNjU4OC1kYXZuCi0gICAgICAgICAgICAgICBncGlvMDc6IFBpbiA3IG4uYy4KLSAgICAgICAgICAgICAgIGdwaW8wODogbklPVwotICAgICAgICAgICAgICAgZ3BpbzA5KzEwOiBuSU9SLCBuU0VMID8/IChidDg3OCkKLSAgICAgICAgICAgICAgICBncGlvMDk6IG5JT1IgKGJ0ODQ4KQotICAgICAgICAgICAgICAgIGdwaW8xMDogblNFTCAoYnQ4NDgpCi0gICAgICAgICAgICAgIFNvdW5kIFJvdXRpbmc6Ci0gICAgICAgICAgICAgICBncGlvMTY6IHUyLUEwICgxc3QgNDA1MmJ0KQotICAgICAgICAgICAgICAgZ3BpbzE3OiB1Mi1BMQotICAgICAgICAgICAgICAgZ3BpbzE4OiB1Mi1uRU4KLSAgICAgICAgICAgICAgIGdwaW8xOTogdTQtQTAgKDJuZCA0MDUyKQotICAgICAgICAgICAgICAgZ3BpbzIwOiB1NC1BMQotICAgICAgICAgICAgICAgICAgICAgICB1NC1uRU4gLSBHTkQKLQkgICAgQnRzcHk6Ci0JICAJMDAwMDAgOiBDZHJvbSAoaW50ZXJuYWwgYXVkaW8gaW5wdXQpCisJRXh0ZXJuYWwgMjAgcGluIGNvbm5lY3RvciAoZm9yIEFjdGl2ZSBSYWRpbyBVcGdyYWRlIGJvYXJkKQorCWdwaW8wMDogaTJjLXNkYQorCWdwaW8wMTogaTJjLXNjbAorCWdwaW8wMjogb201NjEwLWRhdGEKKwlncGlvMDM6IG9tNTYxMC1jbGsKKwlncGlvMDQ6IG9tNTYxMC13cmUKKwlncGlvMDU6IG9tNTYxMC1zdGVyZW8KKwlncGlvMDY6IHJkczY1ODgtZGF2bgorCWdwaW8wNzogUGluIDcgbi5jLgorCWdwaW8wODogbklPVworCWdwaW8wOSsxMDogbklPUiwgblNFTCA/PyAoYnQ4NzgpCisJCWdwaW8wOTogbklPUiAoYnQ4NDgpCisJCWdwaW8xMDogblNFTCAoYnQ4NDgpCisJU291bmQgUm91dGluZzoKKwlncGlvMTY6IHUyLUEwICgxc3QgNDA1MmJ0KQorCWdwaW8xNzogdTItQTEKKwlncGlvMTg6IHUyLW5FTgorCWdwaW8xOTogdTQtQTAgKDJuZCA0MDUyKQorCWdwaW8yMDogdTQtQTEKKwkJdTQtbkVOIC0gR05ECisJQnRzcHk6CisJCTAwMDAwIDogQ2Ryb20gKGludGVybmFsIGF1ZGlvIGlucHV0KQogCQkxMDAwMCA6IGV4dC4gVmlkZW8gYXVkaW8gaW5wdXQKIAkJMjAwMDAgOiBUViBNb25vCiAJCWEwMDAwIDogVFYgTW9uby8yCi0JICAgICAgIDFhMDAwMCA6IFRWIFN0ZXJlbworCTFhMDAwMCA6IFRWIFN0ZXJlbwogCQkzMDAwMCA6IFJhZGlvCiAJCTQwMDAwIDogTXV0ZQotICAgICAgICovCisqLwogCiB9LHsKIAkvKiBKYW5uaWsgRnJpdHNjaCA8amFubmlrQHRlY2hmYWsudW5pLWJpZWxlZmVsZC5kZT4gKi8KQEAgLTcwMiw2ICs3MzIsNyBAQAogCS5hdWRpb211eAk9IHsgMCB9LAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkubXV4c2VsX2hvb2sgICAgPSBQWEMyMDBfbXV4c2VsLAogCiB9LHsKQEAgLTcxMCwxMSArNzQxLDEyIEBACiAJLmF1ZGlvX2lucHV0cwk9IDEsCiAJLnR1bmVyCQk9IDAsCiAJLnN2aHMJCT0gMiwKLQkuZ3Bpb21hc2sJPSAweDE4MDAsICAvLzB4OGRmZTAwCisJLmdwaW9tYXNrCT0gMHgxODAwLCAgLyogMHg4ZGZlMDAgKi8KIAkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCiAJLmF1ZGlvbXV4CT0geyAwLCAweDA4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDAsIDAgfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiRm9ybWFjIGlQcm9UViwgRm9ybWFjIFByb1RWIEkgKGJ0ODQ4KSIsCiAJLnZpZGVvX2lucHV0cwk9IDQsCkBAIC03MjYsNiArNzU4LDcgQEAKIAkuYXVkaW9tdXgJPSB7IDEsIDAsIDAsIDAsIDAgfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAogLyogLS0tLSBjYXJkIDB4MjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzM5LDYgKzc3Miw3IEBACiAJLmF1ZGlvbXV4CT0geyAwIH0sCiAJLm5lZWRzX3R2YXVkaW8JPSAwLAogCS50dW5lcl90eXBlCT0gNCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVmFsdWUgVmVyc2lvbiBCdDg3OCIsCiAJLnZpZGVvX2lucHV0cwk9IDMsCkBAIC03NTEsMzEgKzc4NSwzMyBAQAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJMZWFkdGVrIFdpbkZhc3QgMjAwMC8gV2luRmFzdCAyMDAwIFhQIiwKIAkudmlkZW9faW5wdXRzCT0gNCwKIAkuYXVkaW9faW5wdXRzCT0gMSwKIAkudHVuZXIJCT0gMCwKIAkuc3ZocwkJPSAyLAotCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxLCAwfSwgLy8gVFYsIENWaWQsIFNWaWQsIENWaWQgb3ZlciBTVmlkIGNvbm5lY3RvcgorCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxLCAwfSwgLyogVFYsIENWaWQsIFNWaWQsIENWaWQgb3ZlciBTVmlkIGNvbm5lY3RvciAqLwogCS8qIEFsZXhhbmRlciBWYXJha2luIDxhdmFyYWtpbkBob3RtYWlsLmNvbT4gW3N0ZXJlbyB2ZXJzaW9uXSAqLwogCS5ncGlvbWFzawk9IDB4YjMzMDAwLAogCS5hdWRpb211eAk9IHsgMHgxMjIwMDAsMHgxMDAwLDB4MDAwMCwweDYyMDAwMCwweDgwMDAwMCB9LAogCS8qIEF1ZGlvIFJvdXRpbmcgZm9yICJXaW5GYXN0IDIwMDAgWFAiIChubyB0diBzdGVyZW8gISkKIAkJZ3BpbzIzIC0tIGhlZjQwNTI6bkVuYWJsZSAoMHg4MDAwMDApCiAJCWdwaW8xMiAtLSBoZWY0MDUyOkExCi0JICAgICAgICBncGlvMTMgLS0gaGVmNDA1MjpBMAotCSAgICAweDAwMDA6IGV4dGVybmFsIGF1ZGlvCi0JICAgIDB4MTAwMDogRk0KLQkgICAgMHgyMDAwOiBUVgotCSAgICAweDMwMDA6IG4uYy4KLSAgICAgICAgICBOb3RlOiBUaGVyZSBleGlzdHMgYW5vdGhlciB2YXJpYW50ICJXaW5mYXN0IDIwMDAiIHdpdGggdHYgc3RlcmVvICE/Ci0JICBOb3RlOiBlZXByb20gb25seSBjb250YWlucyBGRiBhbmQgcGNpIHN1YnN5c3RlbSBpZCAxMDdkOjY2MDYKLQkgKi8KKwkJZ3BpbzEzIC0tIGhlZjQwNTI6QTAKKwkweDAwMDA6IGV4dGVybmFsIGF1ZGlvCisJMHgxMDAwOiBGTQorCTB4MjAwMDogVFYKKwkweDMwMDA6IG4uYy4KKwlOb3RlOiBUaGVyZSBleGlzdHMgYW5vdGhlciB2YXJpYW50ICJXaW5mYXN0IDIwMDAiIHdpdGggdHYgc3RlcmVvICE/CisJTm90ZTogZWVwcm9tIG9ubHkgY29udGFpbnMgRkYgYW5kIHBjaSBzdWJzeXN0ZW0gaWQgMTA3ZDo2NjA2CisJKi8KIAkubmVlZHNfdHZhdWRpbwk9IDAsCiAJLnBsbAkJPSBQTExfMjgsCiAJLmhhc19yYWRpbwk9IDEsCi0JLnR1bmVyX3R5cGUJPSA1LCAvLyBkZWZhdWx0IGZvciBub3csIGdwaW8gcmVhZHMgQkZGRjA2IGZvciBQYWwgYmcrZGsKKwkudHVuZXJfdHlwZQk9IDUsIC8qIGRlZmF1bHQgZm9yIG5vdywgZ3BpbyByZWFkcyBCRkZGMDYgZm9yIFBhbCBiZytkayAqLworCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuYXVkaW9faG9vawk9IHdpbmZhc3QyMDAwX2F1ZGlvLAogCS5oYXNfcmVtb3RlICAgICA9IDEsCiB9LHsKQEAgLTc4OSw2ICs4MjUsNyBAQAogCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDB9LAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAKIC8qIC0tLS0gY2FyZCAweDI0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTgwMiw2ICs4MzksNyBAQAogCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDAsIDAgfSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuaGFzX3JhZGlvCT0gMSwKIH0sewogCS5uYW1lCQk9ICJQcm9saW5rIFBpeGVsVmlldyBQbGF5VFYgcHJvIiwKQEAgLTgxNSw2ICs4NTMsNyBAQAogCS5ub19tc3AzNHh4CT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJBc2tleSBDUEgwNlggVFZpZXc5OSIsCiAJLnZpZGVvX2lucHV0cwk9IDQsCkBAIC04MjcsNiArODY2LDcgQEAKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSAxLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuaGFzX3JlbW90ZSAgICAgPSAxLAogfSx7CiAJLm5hbWUJCT0gIlBpbm5hY2xlIFBDVFYgU3R1ZGlvL1JhdmUiLApAQCAtODQwLDYgKzg4MCw3IEBACiAJLm5lZWRzX3R2YXVkaW8JPSAwLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAKIC8qIC0tLS0gY2FyZCAweDI4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTg1NCw2ICs4OTUsNyBAQAogCS5ub19tc3AzNHh4CT0gMSwKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLmhhc19yYWRpbyAgICAgID0gMSwKIH0sewpAQCAtODY4LDYgKzkxMCw3IEBACiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5oYXNfcmFkaW8JPSAxLAogCS5hdWRpb19ob29rCT0gYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8sCiB9LHsKQEAgLTg4Myw2ICs5MjYsNyBAQAogCS5ub19tc3AzNHh4CT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IDEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIkxpdHRsZSBPbkFpciBUViIsCiAJLnZpZGVvX2lucHV0cwk9IDMsCkBAIC04OTQsNiArOTM4LDcgQEAKIAkuYXVkaW9tdXgJPSB7MHhmZjlmZjYsIDB4ZmY5ZmY2LCAweGZmMWZmNywgMCwgMHhmZjNmZmN9LAogCS5ub19tc3AzNHh4CT0gMSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCiAvKiAtLS0tIGNhcmQgMHgyYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC05MDgsNiArOTUzLDcgQEAKIAkubm9fbXNwMzR4eAk9IDEsCiAJLnBsbAkJPSBQTExfTk9ORSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJNQVRSSVgtVmlzaW9uIE1WLURlbHRhIDIiLAogCS52aWRlb19pbnB1dHMJPSA1LApAQCAtOTIwLDYgKzk2Niw3IEBACiAJLm5vX21zcDM0eHgJPSAxLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIlpvbHRyaXggR2VuaWUgVFYvRk0iLAogCS52aWRlb19pbnB1dHMJPSAzLApAQCAtOTMyLDYgKzk3OSw3IEBACiAJLm5vX21zcDM0eHgJPSAxLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gMjEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIlRlcnJhdGVjIFRWL1JhZGlvKyIsCiAJLnZpZGVvX2lucHV0cwk9IDMsCkBAIC05NDUsNiArOTkzLDcgQEAKIAkubm9fbXNwMzR4eAk9IDEsCiAJLnBsbAkJPSBQTExfMzUsCiAJLnR1bmVyX3R5cGUJPSAxLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuaGFzX3JhZGlvCT0gMSwKIH0sewogCkBAIC05NjAsNiArMTAwOSw3IEBACiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIklPREFUQSBHVi1CQ1RWMy9QQ0kiLAogCS52aWRlb19pbnB1dHMJPSAzLApAQCAtOTcyLDYgKzEwMjIsNyBAQAogCS5ub19tc3AzNHh4CT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IFRVTkVSX0FMUFNfVFNIQzZfTlRTQywKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmF1ZGlvX2hvb2sJPSBndmJjdHYzcGNpX2F1ZGlvLAogfSx7CiAJLm5hbWUJCT0gIlByb2xpbmsgUFYtQlQ4NzhQKzRFIC8gUGl4ZWxWaWV3IFBsYXlUViBQQUsgLyBMZW5jbyBNWFRWLTk1NzggQ1AiLApAQCAtOTg2LDYgKzEwMzcsNyBAQAogCS5ub19tc3AzNHh4CT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMX0ksCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5oYXNfcmVtb3RlCT0gMSwKIAkvKiBHUElPIHdpcmluZzogKGRpZmZlcmVudCBmcm9tIFJldi40QyAhKQogCQlHUElPMTc6IFU0LkEwIChmaXJzdCBoZWY0MDUyYnQpCkBAIC05OTQsOCArMTA0Niw4IEBACiAJCUdQSU8yMTogVTQubkVOCiAJCUdQSU8yMjogQlQ4MzIgUmVzZXQgTGluZQogCQlHUElPMjM6IEE1LEEwLCBVNSxuRU4KLQkgICBOb3RlOiBBdCBpMmM9MHg4YSBpcyBhIEJ0ODMyIGNoaXAsIHdoaWNoIGNoYW5nZXMgdG8gMHg4OCBhZnRlciBiZWluZyByZXNldCB2aWEgR1BJTzIyCi0JICovCisJTm90ZTogQXQgaTJjPTB4OGEgaXMgYSBCdDgzMiBjaGlwLCB3aGljaCBjaGFuZ2VzIHRvIDB4ODggYWZ0ZXIgYmVpbmcgcmVzZXQgdmlhIEdQSU8yMgorCSovCiB9LHsKIAkubmFtZSAgICAgICAgICAgPSAiRWFnbGUgV2lyZWxlc3MgQ2Fwcmljb3JuMiAoYnQ4NzhBKSIsCiAJLnZpZGVvX2lucHV0cyAgID0gNCwKQEAgLTEwMDcsNiArMTA1OSw3IEBACiAJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAzLCA0fSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEgLyogVFVORVJfQUxQU19UTURIMl9OVFNDICovLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCiAvKiAtLS0tIGNhcmQgMHgzNCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMDIwLDIwICsxMDczLDIxIEBACiAJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAogCS5hdWRpb211eAk9IHsgMSwgMHhkMDAwMSwgMCwgMCwgMTB9LAogCQkJLyogc291bmQgcGF0aCAoNSBzb3VyY2VzKToKLQkJCSAgIE1VWDEgKG1hc2sgMHgwMyksIEVuYWJsZSBQaW4gMHgwOCAoMD1lbmFibGUsIDE9ZGlzYWJsZSkKKwkJCU1VWDEgKG1hc2sgMHgwMyksIEVuYWJsZSBQaW4gMHgwOCAoMD1lbmFibGUsIDE9ZGlzYWJsZSkKIAkJCQkwPSBleHQuIEF1ZGlvIElOCiAJCQkJMT0gZnJvbSBNVVgyCiAJCQkJMj0gTW9ubyBUViBzb3VuZCBmcm9tIFR1bmVyCiAJCQkJMz0gbm90IGNvbm5lY3RlZAotCQkJICAgTVVYMiAobWFzayAweDMwMDAwKToKKwkJCU1VWDIgKG1hc2sgMHgzMDAwMCk6CiAJCQkJMCwyLDM9IGZyb20gTVNQMzR4eAogCQkJCTE9IEZNIHN0ZXJlbyBSYWRpbyBmcm9tIFR1bmVyICovCiAJLm5lZWRzX3R2YXVkaW8gID0gMCwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLyogQ2xhYXMgTGFuZ2JlaG4gPGNsYWFzQGJpZ2Zvb3QuY29tPiwKLQkgICBTdmVuIEdyb3Roa2xhZ3MgPHN2ZW5AdXBiLmRlPiAqLworCVN2ZW4gR3JvdGhrbGFncyA8c3ZlbkB1cGIuZGU+ICovCiAJLm5hbWUJCT0gIlR5cGhvb24gVFZpZXcgUkRTICsgRk0gU3RlcmVvIC8gS05DMSBUViBTdGF0aW9uIFJEUyIsCiAJLnZpZGVvX2lucHV0cwk9IDQsCiAJLmF1ZGlvX2lucHV0cwk9IDMsCkBAIC0xMDQ1LDEwICsxMDk5LDExIEBACiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5oYXNfcmFkaW8JPSAxLAogfSx7CiAJLyogVGltIFL2c3Rlcm11bmR0IDxyb3N0ZXJtQHVuaS1tdWVuc3Rlci5kZT4KLQkgICBpbiBkZS5jb21wLm9zLnVuaXgubGludXguaGFyZHdhcmU6CisJaW4gZGUuY29tcC5vcy51bml4LmxpbnV4LmhhcmR3YXJlOgogCQlvcHRpb25zIGJ0dHYgY2FyZD0wIHBsbD0xIHJhZGlvPTEgZ3Bpb21hc2s9MHgxOGUwCiAJCWF1ZGlvbXV4PTB4NDRjNzFmLDB4NDRkNzFmLDAsMHg0NGQ3MWYsMHg0NGRmZmYKIAkJb3B0aW9ucyB0dW5lciB0eXBlPTUgKi8KQEAgLTEwNjAsMTUgKzExMTUsMTYgQEAKIAkuZ3Bpb21hc2sJPSAweDE4ZTAsCiAJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAogCS5hdWRpb211eAk9IHsgMHgwMDAwLDB4MDgwMCwweDEwMDAsMHgxMDAwLDB4MThlMCB9LAotCQkgICAgICAgLyogRm9yIGNhcmRzIHdpdGggdGRhOTgyMC90ZGE5ODIxOgotCQkJICAweDAwMDA6IFR1bmVyIG5vcm1hbCBzdGVyZW8KLQkJCSAgMHgwMDgwOiBUdW5lciBBMiBTQVAgKHNlY29uZCBhdWRpbyBwcm9ncmFtID0gWndlaWthbmFsdG9uKQotCQkJICAweDA4ODA6IFR1bmVyIEEyIHN0ZXJlbyAqLworCQkvKiBGb3IgY2FyZHMgd2l0aCB0ZGE5ODIwL3RkYTk4MjE6CisJCQkweDAwMDA6IFR1bmVyIG5vcm1hbCBzdGVyZW8KKwkJCTB4MDA4MDogVHVuZXIgQTIgU0FQIChzZWNvbmQgYXVkaW8gcHJvZ3JhbSA9IFp3ZWlrYW5hbHRvbikKKwkJCTB4MDg4MDogVHVuZXIgQTIgc3RlcmVvICovCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBNaWd1ZWwgQW5nZWwgQWx2YXJleiA8bWFhY3J1ekBuYXZlZ2FsaWEuY29tPgotCSAgIG9sZCBFYXN5IFRWIEJUODQ4IHZlcnNpb24gKG1vZGVsIENQSDAzMSkgKi8KKwlvbGQgRWFzeSBUViBCVDg0OCB2ZXJzaW9uIChtb2RlbCBDUEgwMzEpICovCiAJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDAzMS8gQkVTVEJVWSBFYXN5IFRWIiwKIAkudmlkZW9faW5wdXRzCT0gNCwKIAkuYXVkaW9faW5wdXRzICAgPSAxLApAQCAtMTA4MCw2ICsxMTM2LDcgQEAKIAkubmVlZHNfdHZhdWRpbyAgPSAwLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfUEFMLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCiAvKiAtLS0tIGNhcmQgMHgzOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMDk0LDEwICsxMTUxLDExIEBACiAJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSA1LAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS8qIFRoaXMgaXMgdGhlIHVsdGltYXRlIGNoZWFwbyBjYXB0dXJlIGNhcmQKLQkgKiBqdXN0IGEgQlQ4NDhBIG9uIGEgc21hbGwgUENCIQotCSAqIFN0ZXZlIEhvc2dvb2QgPHN0ZXZlQGVxdWlpbmV0LmNvbT4gKi8KKwkqIGp1c3QgYSBCVDg0OEEgb24gYSBzbWFsbCBQQ0IhCisJKiBTdGV2ZSBIb3Nnb29kIDxzdGV2ZUBlcXVpaW5ldC5jb20+ICovCiAJLm5hbWUgICAgICAgICAgID0gIkdyYW5kVGVjICdHcmFuZCBWaWRlbyBDYXB0dXJlJyAoQnQ4NDgpIiwKIAkudmlkZW9faW5wdXRzICAgPSAyLAogCS5hdWRpb19pbnB1dHMgICA9IDAsCkBAIC0xMTEwLDE5ICsxMTY4LDIxIEBACiAJLm5vX21zcDM0eHggICAgID0gMSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMzUsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7Ci0gICAgICAgIC8qIERhbmllbCBIZXJyaW5ndG9uIDxkYW5pZWwuaGVycmluZ3RvbkBob21lLmNvbT4gKi8KLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MC8gUGhvZWJlIFRWIE1hc3RlciBPbmx5IChObyBGTSkiLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSAzLAotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAotICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGUwMCwKLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKLSAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAweDQwMCwgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHg4MDAsIDB4NDAwIH0sCi0gICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCi0gICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfNDAzNkZZNV9OVFNDLAorCS8qIERhbmllbCBIZXJyaW5ndG9uIDxkYW5pZWwuaGVycmluZ3RvbkBob21lLmNvbT4gKi8KKwkubmFtZSAgICAgICAgICAgPSAiQXNrZXkgQ1BIMDYwLyBQaG9lYmUgVFYgTWFzdGVyIE9ubHkgKE5vIEZNKSIsCisJLnZpZGVvX2lucHV0cyAgID0gMywKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnN2aHMgICAgICAgICAgID0gMiwKKwkuZ3Bpb21hc2sgICAgICAgPSAweGUwMCwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eCAgICAgICA9IHsgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHg0MDAsIDB4ODAwLCAweDQwMCB9LAorCS5uZWVkc190dmF1ZGlvICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDXzQwMzZGWTVfTlRTQywKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBNYXR0aSBNb3R0dXMgPG1vdHR1c0BwaHlzaWMudXQuZWU+ICovCiAJLm5hbWUJCT0gIkFza2V5IENQSDAzeCBUViBDYXB0dXJlciIsCkBAIC0xMTMwLDExICsxMTkwLDEyIEBACiAJLmF1ZGlvX2lucHV0cwk9IDEsCiAJLnR1bmVyCQk9IDAsCiAJLnN2aHMJCT0gMiwKLSAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCisJLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCiAJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDB9LAotICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDIsMCwwLDAsMSB9LAorCS5hdWRpb211eCAgICAgICA9IHsgMiwwLDAsMCwxIH0sCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gMCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAogLyogLS0tLSBjYXJkIDB4M2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTE0OSw3ICsxMjEwLDcgQEAKIAkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDEsIDh9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8zNSwKIAkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU1JQ19QQUwsCi0KKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBBZHJpYW4gQ294IDxhZHJpYW5AaHVtYm9sZHQuY28udWsgKi8KIAkubmFtZQkgICAgICAgID0gIkFHIEVsZWN0cm9uaWNzIEdNVjEiLApAQCAtMTE2NCwxMCArMTIyNSwxMSBAQAogCS5uZWVkc190dmF1ZGlvICA9IDAsCiAJLnBsbAkgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS8qIE1pZ3VlbCBBbmdlbCBBbHZhcmV6IDxtYWFjcnV6QG5hdmVnYWxpYS5jb20+Ci0JICAgbmV3IEVhc3kgVFYgQlQ4NzggdmVyc2lvbiAobW9kZWwgQ1BIMDYxKQotCSAgIHNwZWNpYWwgdGhhbmtzIHRvIEluZm9ybWF0aWNhIE1pZXJlcyBmb3IgcHJvdmlkaW5nIHRoZSBjYXJkICovCisJbmV3IEVhc3kgVFYgQlQ4NzggdmVyc2lvbiAobW9kZWwgQ1BIMDYxKQorCXNwZWNpYWwgdGhhbmtzIHRvIEluZm9ybWF0aWNhIE1pZXJlcyBmb3IgcHJvdmlkaW5nIHRoZSBjYXJkICovCiAJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MS8gQkVTVEJVWSBFYXN5IFRWIChidDg3OCkiLAogCS52aWRlb19pbnB1dHMJPSAzLAogCS5hdWRpb19pbnB1dHMgICA9IDIsCkBAIC0xMTc5LDYgKzEyNDEsNyBAQAogCS5uZWVkc190dmF1ZGlvICA9IDAsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBMdWthcyBHZWJhdWVyIDxnZWJ5QHZvbG55LmN6PiAqLwogCS5uYW1lCQk9ICJBVEkgVFYtV29uZGVyIiwKQEAgLTExOTEsNiArMTI1NCw3IEBACiAJLmF1ZGlvbXV4CT0geyAweGJmZmUsIDAsIDB4YmZmZiwgMCwgMHhiZmZlfSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCiAvKiAtLS0tIGNhcmQgMHg0MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMjA2LDYgKzEyNzAsNyBAQAogCS5ub19tc3AzNHh4CT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS8qIERlZUpheSA8ZGVlamF5QHdlc3RlbDkwMC5uZXQgKDIwMDBTKSAqLwogCS5uYW1lICAgICAgICAgICA9ICJMaWZldmlldyBGbHlWaWRlbyAyMDAwUyBMUjkwIiwKQEAgLTEyMTYsNyArMTI4MSw3IEBACiAJLmdwaW9tYXNrCT0gMHgxOGUwLAogCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxfSwKIAkJCS8qIFJhZGlvIGNoYW5nZWQgZnJvbSAxZTgwIHRvIDB4ODAwIHRvIG1ha2UKLQkJCSAgIEZseVZpZGVvMjAwMFMgaW4gLmh1IGhhcHB5IChnbSkqLworCQkJRmx5VmlkZW8yMDAwUyBpbiAuaHUgaGFwcHkgKGdtKSovCiAJCQkvKiAtZGstPz8/OiBzZXQgbXV0ZT0weDE4MDAgZm9yIHRkYTk4NzRoIGRhdWdodGVyYm9hcmQgKi8KIAkuYXVkaW9tdXgJPSB7IDB4MDAwMCwweDA4MDAsMHgxMDAwLDB4MTAwMCwweDE4MDAsIDB4MTA4MCB9LAogCS5hdWRpb19ob29rCT0gZnYyMDAwc19hdWRpbywKQEAgLTEyMjUsNiArMTI5MCw3IEBACiAJLm5lZWRzX3R2YXVkaW8gID0gMSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gNSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiVGVycmF0ZWMgVFZhbHVlUmFkaW8iLAogCS52aWRlb19pbnB1dHMJPSAzLApAQCAtMTIzNyw2ICsxMzAzLDcgQEAKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmhhc19yYWRpbwk9IDEsCiB9LHsKIAkvKiBUQU5BS0EgS2VpIDxwZWcwMDYyNUBuaWZ0eS5jb20+ICovCkBAIC0xMjUxLDI1ICsxMzE4LDI3IEBACiAJLm5vX21zcDM0eHggICAgID0gMSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfU0hBUlBfMlU1SkY1NTQwX05UU0MsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5hdWRpb19ob29rICAgICA9IGd2YmN0djNwY2lfYXVkaW8sCiB9LHsKIAogLyogLS0tLSBjYXJkIDB4NDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiM0RmeCBWb29kb29UViBGTSAoRXVybyksIFZvb2Rvb1RWIDIwMCAoVVNBKSIsCi0JLy8gdHJ5ICJpbnNtb2QgbXNwMzQwMCBzaW1wbGU9MCIgaWYgeW91IGhhdmUKLQkvLyBzb3VuZCBwcm9ibGVtcyB3aXRoIHRoaXMgY2FyZC4KLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4NGY4YTAwLAotCS8vIDB4MTAwMDAwOiAxPU1TUCBlbmFibGVkICgwPWRpc2FibGUgYWdhaW4pCi0JLy8gMHgwMTAwMDA6IENvbm5lY3RlZCB0byAiUzAiIG9uIHRkYTk4ODAgKDA9UGFsL0JHLCAxPU5UU0MpCi0gICAgICAgIC5hdWRpb211eCAgICAgICA9IHsweDk0N2ZmZiwgMHg5ODdmZmYsMHg5NDdmZmYsMHg5NDdmZmYsIDB4OTQ3ZmZmfSwKLQkvLyB0dnR1bmVyLCByYWRpbywgICBleHRlcm5hbCxpbnRlcm5hbCwgbXV0ZSwgIHN0ZXJlbwotCS8qIHR1bmVyLCBDb21wb3NpdCwgU1ZpZCwgQ29tcG9zaXQtb24tU3ZpZC1hZGFwdGVyKi8KLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzICwwICwxfSwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTVQyMDMyLAorCS5uYW1lICAgICAgICAgICA9ICIzRGZ4IFZvb2Rvb1RWIEZNIChFdXJvKSwgVm9vZG9vVFYgMjAwIChVU0EpIiwKKwkvKiB0cnkgImluc21vZCBtc3AzNDAwIHNpbXBsZT0wIiBpZiB5b3UgaGF2ZQorCSogc291bmQgcHJvYmxlbXMgd2l0aCB0aGlzIGNhcmQuICovCisJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnN2aHMgICAgICAgICAgID0gLTEsCisJLmdwaW9tYXNrICAgICAgID0gMHg0ZjhhMDAsCisJLyogMHgxMDAwMDA6IDE9TVNQIGVuYWJsZWQgKDA9ZGlzYWJsZSBhZ2FpbikKKwkqIDB4MDEwMDAwOiBDb25uZWN0ZWQgdG8gIlMwIiBvbiB0ZGE5ODgwICgwPVBhbC9CRywgMT1OVFNDKSAqLworCS5hdWRpb211eCAgICAgICA9IHsweDk0N2ZmZiwgMHg5ODdmZmYsMHg5NDdmZmYsMHg5NDdmZmYsIDB4OTQ3ZmZmfSwKKwkvKiB0dnR1bmVyLCByYWRpbywgICBleHRlcm5hbCxpbnRlcm5hbCwgbXV0ZSwgIHN0ZXJlbworCSogdHVuZXIsIENvbXBvc2l0LCBTVmlkLCBDb21wb3NpdC1vbi1TdmlkLWFkYXB0ZXIgKi8KKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgLDAgLDF9LAorCS50dW5lcl90eXBlICAgICA9IFRVTkVSX01UMjAzMiwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLnBsbAkJPSBQTExfMjgsCiAJLmhhc19yYWRpbwk9IDEsCiB9LHsKQEAgLTEyNzksMjIgKzEzNDgsMjQgQEAKIAkuYXVkaW9faW5wdXRzICAgPSAwLAogCS50dW5lciAgICAgICAgICA9IC0xLAogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLm11eHNlbCAgICAgICAgID0geyAyIH0sCiAJLmdwaW9tYXNrICAgICAgID0gMAogfSx7Ci0gICAgICAgIC8qIFRvbWFzeiBQeXJhIDxoZWxsZmlyZUBzZWRlei5pcS5wbD4gKi8KLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlByb2xpbmsgUGl4ZWx2aWV3IFBWLUJUODc4UCsgKFJldi40Qyw4RSkiLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSAzLAotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSA0LAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAotICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAxNSwKLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKLSAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAxMSwgNywgMTMsIDB9LCAvLyBUViBhbmQgUmFkaW8gd2l0aCBzYW1lIEdQSU8gIQotICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAotICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IDI1LAorCS8qIFRvbWFzeiBQeXJhIDxoZWxsZmlyZUBzZWRlei5pcS5wbD4gKi8KKwkubmFtZSAgICAgICAgICAgPSAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQ4NzhQKyAoUmV2LjRDLDhFKSIsCisJLnZpZGVvX2lucHV0cyAgID0gMywKKwkuYXVkaW9faW5wdXRzICAgPSA0LAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnN2aHMgICAgICAgICAgID0gMiwKKwkuZ3Bpb21hc2sgICAgICAgPSAxNSwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMTEsIDcsIDEzLCAwfSwgLyogVFYgYW5kIFJhZGlvIHdpdGggc2FtZSBHUElPICEgKi8KKwkubmVlZHNfdHZhdWRpbyAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSAyNSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmhhc19yZW1vdGUgICAgID0gMSwKIAkvKiBHUElPIHdpcmluZzoKIAkJR1BJTzA6IFU0LkEwIChoZWY0MDUyYnQpCkBAIC0xMzAyLDE2ICsxMzczLDE4IEBACiAJCUdQSU8yOiBVNC5BMSAoc2Vjb25kIGhlZjQwNTJidCkKIAkJR1BJTzM6IFU0Lm5FTiwgVTUuQTAsIEE1Lm5FTgogCQlHUElPOC0xNTogdnJkODY2YiA/Ci0JICovCisJKi8KIH0sewogCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OEVaIChjYXB0dXJlIG9ubHkpIExSNTEiLAogCS52aWRlb19pbnB1dHMJPSA0LAogCS5hdWRpb19pbnB1dHMgICA9IDAsCiAJLnR1bmVyCQk9IC0xLAogCS5zdmhzCQk9IDIsCi0JLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LCAvLyBBVjEsIEFWMiwgU1ZIUywgQ1ZpZCBhZGFwdGVyIG9uIFNWSFMKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sIC8qIEFWMSwgQVYyLCBTVkhTLCBDVmlkIGFkYXB0ZXIgb24gU1ZIUyAqLwogCS5wbGwJCT0gUExMXzI4LAogCS5ub19tc3AzNHh4CT0gMSwKKwkudHVuZXJfdHlwZQk9IFVOU0VULAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCiAvKiAtLS0tIGNhcmQgMHg0OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMzI5LDggKzE0MDIsOSBAQAogCS5ub190ZGE5ODc1CT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IDUsCi0JLmF1ZGlvX2hvb2sJPSBwdmJ0ODc4cDliX2F1ZGlvLCAvLyBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgc3RlcmVvCi0JLmhhc19yYWRpbwk9IDEsICAvLyBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgcmFkaW8KKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLmF1ZGlvX2hvb2sJPSBwdmJ0ODc4cDliX2F1ZGlvLCAvKiBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgc3RlcmVvICovCisJLmhhc19yYWRpbwk9IDEsICAvKiBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgcmFkaW8gKi8KIAkuaGFzX3JlbW90ZSAgICAgPSAxLAogCS8qIEdQSU8gd2lyaW5nOgogCQlHUElPMDogQTAgaGVmNDA1MgpAQCAtMTMzOCw3ICsxNDEyLDcgQEAKIAkJR1BJTzM6IG5FTiBoZWY0MDUyCiAJCUdQSU84LTE1OiB2cmQ4NjZiCiAJCUdQSU8yMCwyMiwyMzogUjMwLFIyOSxSMjgKLQkgKi8KKwkqLwogfSx7CiAJLyogQ2xheSBLdW56IDxja3VuekBtYWlsLmFyYy5uYXNhLmdvdj4gKi8KIAkvKiB5b3UgbXVzdCBqdW1wZXIgSlA1IGZvciB0aGUgY2FyZCB0byB3b3JrICovCkBAIC0xMzUyLDYgKzE0MjYsNyBAQAogCS5hdWRpb211eCAgICAgICA9IHsgMCB9LAogCS5uZWVkc190dmF1ZGlvICA9IDAsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLyogTWlndWVsIEZyZWl0YXMgPG1pZ3VlbEBjZXR1Yy5wdWMtcmlvLmJyPiAqLwogCS5uYW1lICAgICAgICAgICA9ICJSZW1vdGVWaXNpb24gTVggKFJWNjA1KSIsCkBAIC0xMzYyLDcxICsxNDM3LDc4IEBACiAJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKIAkuZ3Bpb21hc2syICAgICAgPSAweDA3ZmYsCiAJLm11eHNlbCAgICAgICAgID0geyAweDMzLCAweDEzLCAweDIzLCAweDQzLCAweGYzLCAweDczLCAweGUzLCAweDAzLAotCQkJICAweGQzLCAweGIzLCAweGMzLCAweDYzLCAweDkzLCAweDUzLCAweDgzLCAweGEzIH0sCisJCQkweGQzLCAweGIzLCAweGMzLCAweDYzLCAweDkzLCAweDUzLCAweDgzLCAweGEzIH0sCiAJLm5vX21zcDM0eHggICAgID0gMSwKIAkubm9fdGRhOTg3NSAgICAgPSAxLAogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkubXV4c2VsX2hvb2sgICAgPSBydjYwNV9tdXhzZWwsCiB9LHsKLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlBvd2VyY29sb3IgTVRWODc4LyBNVFY4NzhSLyBNVFY4NzhGIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMiwKKwkubmFtZSAgICAgICAgICAgPSAiUG93ZXJjb2xvciBNVFY4NzgvIE1UVjg3OFIvIE1UVjg3OEYiLAorCS52aWRlb19pbnB1dHMgICA9IDMsCisJLmF1ZGlvX2lucHV0cyAgID0gMiwKIAkudHVuZXIJCT0gMCwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKLSAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgxQzgwMEYsICAvLyBCaXQwLTI6IEF1ZGlvIHNlbGVjdCwgOC0xMjpyZW1vdGUgY29udHJvbCAxNDpyZW1vdGUgdmFsaWQgMTU6cmVtb3RlIHJlc2V0Ci0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMSwgMSwgfSwKLSAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAyLCA0IH0sCi0gICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLmdwaW9tYXNrICAgICAgID0gMHgxQzgwMEYsICAvKiBCaXQwLTI6IEF1ZGlvIHNlbGVjdCwgOC0xMjpyZW1vdGUgY29udHJvbCAxNDpyZW1vdGUgdmFsaWQgMTU6cmVtb3RlIHJlc2V0ICovCisJLm11eHNlbCAgICAgICAgID0geyAyLCAxLCAxLCB9LAorCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMiwgNCB9LAorCS5uZWVkc190dmF1ZGlvICA9IDAsCisJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5wbGwJCT0gUExMXzI4LAogCS5oYXNfcmFkaW8JPSAxLAogfSx7CiAKIC8qIC0tLS0gY2FyZCAweDRjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgLyogTWFzYWtpIFN1enVraSA8bWFzYWtpQGJ0cmVlLm9yZz4gKi8KLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkNhbm9wdXMgV2luRFZSIFBDSSAoQ09NUEFRIFByZXNhcmlvIDM1MjRKUCwgNTExMkpQKSIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDMsCi0gICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MTQwMDA3LAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKLSAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAzLCA0LCAwIH0sCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKLSAgICAgICAgLmF1ZGlvX2hvb2sgICAgID0gd2luZHZyX2F1ZGlvLAorCS8qIE1hc2FraSBTdXp1a2kgPG1hc2FraUBidHJlZS5vcmc+ICovCisJLm5hbWUgICAgICAgICAgID0gIkNhbm9wdXMgV2luRFZSIFBDSSAoQ09NUEFRIFByZXNhcmlvIDM1MjRKUCwgNTExMkpQKSIsCisJLnZpZGVvX2lucHV0cyAgID0gMywKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnN2aHMgICAgICAgICAgID0gMiwKKwkuZ3Bpb21hc2sgICAgICAgPSAweDE0MDAwNywKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDQsIDAgfSwKKwkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5hdWRpb19ob29rICAgICA9IHdpbmR2cl9hdWRpbywKIH0sewotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiR3JhbmRUZWMgTXVsdGkgQ2FwdHVyZSBDYXJkIChCdDg3OCkiLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDAsCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAotICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKLSAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMCwKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkubmFtZSAgICAgICAgICAgPSAiR3JhbmRUZWMgTXVsdGkgQ2FwdHVyZSBDYXJkIChCdDg3OCkiLAorCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkuc3ZocyAgICAgICAgICAgPSAtMSwKKwkuZ3Bpb21hc2sgICAgICAgPSAwLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAorCS5hdWRpb211eCAgICAgICA9IHsgMCB9LAorCS5uZWVkc190dmF1ZGlvICA9IDAsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7Ci0gICAgICAgIC5uYW1lICAgICAgICAgICA9ICJKZXR3YXkgVFYvQ2FwdHVyZSBKVy1UVjg3OC1GQkssIEt3b3JsZCBLVy1UVjg3OFJGIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMywKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKLSAgICAgICAgLmdwaW9tYXNrICAgICAgID0gNywKLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sICAgLy8gVHVuZXIsIFNWaWQsIFNWSFMsIFNWaWQgdG8gU1ZIUyBjb25uZWN0b3IKLSAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwICwwICw0LCA0LDQsNH0sLy8gWWVzLCB0aGlzIHR1bmVyIHVzZXMgdGhlIHNhbWUgYXVkaW8gb3V0cHV0IGZvciBUViBhbmQgRk0gcmFkaW8hCi0JCQkJCSAgLy8gVGhpcyBjYXJkIGxhY2tzIGV4dGVybmFsIEF1ZGlvIEluLCBzbyB3ZSBtdXRlIGl0IG9uIEV4dC4gJiBJbnQuCi0JCQkJCSAgLy8gVGhlIFBDQiBjYW4gdGFrZSBhIHNieDE2Mzcvc2J4MTY3Mywgd2lyaW5nIHVua25vd24uCi0JCQkJCSAgLy8gVGhpcyBjYXJkIGxhY2tzIFBDSSBzdWJzeXN0ZW0gSUQsIHNpZ2guCi0JCQkJCSAgLy8gYXVkaW9tdXg9MTogbG93ZXIgdm9sdW1lLCAyKzM6IG11dGUKLQkJCQkJICAvLyBidHdpbmNhcCB1c2VzIDB4ODAwMDAvMHg4MDAwMwotICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAwLAotICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAotICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IDUsIC8vIFNhbXN1bmcgVENQQTkwOTVQQzI3QSAoQkcrREspLCBwaGlsaXBzIGNvbXBhdGlibGUsIHcvRk0sIHN0ZXJlbyBhbmQKLQkJCSAgIC8vIHJhZGlvIHNpZ25hbCBzdHJlbmd0aCBpbmRpY2F0b3JzIHdvcmsgZmluZS4KLQkuaGFzX3JhZGlvCQk9IDEsCisJLm5hbWUgICAgICAgICAgID0gIkpldHdheSBUVi9DYXB0dXJlIEpXLVRWODc4LUZCSywgS3dvcmxkIEtXLVRWODc4UkYiLAorCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMywKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLmdwaW9tYXNrICAgICAgID0gNywKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwgICAvKiBUdW5lciwgU1ZpZCwgU1ZIUywgU1ZpZCB0byBTVkhTIGNvbm5lY3RvciAqLworCS5hdWRpb211eCAgICAgICA9IHsgMCAsMCAsNCwgNCw0LDR9LC8qIFllcywgdGhpcyB0dW5lciB1c2VzIHRoZSBzYW1lIGF1ZGlvIG91dHB1dCBmb3IgVFYgYW5kIEZNIHJhZGlvIQorCQkJCQkqIFRoaXMgY2FyZCBsYWNrcyBleHRlcm5hbCBBdWRpbyBJbiwgc28gd2UgbXV0ZSBpdCBvbiBFeHQuICYgSW50LgorCQkJCQkqIFRoZSBQQ0IgY2FuIHRha2UgYSBzYngxNjM3L3NieDE2NzMsIHdpcmluZyB1bmtub3duLgorCQkJCQkqIFRoaXMgY2FyZCBsYWNrcyBQQ0kgc3Vic3lzdGVtIElELCBzaWdoLgorCQkJCQkqIGF1ZGlvbXV4PTE6IGxvd2VyIHZvbHVtZSwgMiszOiBtdXRlCisJCQkJCSogYnR3aW5jYXAgdXNlcyAweDgwMDAwLzB4ODAwMDMKKwkJCQkJKi8KKwkubmVlZHNfdHZhdWRpbyAgPSAwLAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IDUsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS8qIFNhbXN1bmcgVENQQTkwOTVQQzI3QSAoQkcrREspLCBwaGlsaXBzIGNvbXBhdGlibGUsIHcvRk0sIHN0ZXJlbyBhbmQKKwlyYWRpbyBzaWduYWwgc3RyZW5ndGggaW5kaWNhdG9ycyB3b3JrIGZpbmUuICovCisJLmhhc19yYWRpbwk9IDEsCiAJLyogR1BJTyBJbmZvOgogCQlHUElPMCwxOiAgIEhFRjQwNTIgQTAsQTEKIAkJR1BJTzI6ICAgICBIRUY0MDUyIG5FTkFCTEUKQEAgLTE0MzcsMjUgKzE1MTksMjcgQEAKIAkJR1BJTzIyLDIzOiA/PwogCQk/PyAgICAgICA6IG10dThiNTZlcCBtaWNyb2NvbnRyb2xsZXIgZm9yIElSIChHUElPIHdpcmluZyB1bmtub3duKSovCiB9LHsKLSAgICAgICAgLyogQXJ0aHVyIFRldHpsYWZmLURlYXMsIERTUCBEZXNpZ24gTHRkIDxzb2Z0d2FyZUBkc3BkZXNpZ24uY29tPiAqLwotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiRFNQIERlc2lnbiBUQ1ZJREVPIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCi0gICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLyogQXJ0aHVyIFRldHpsYWZmLURlYXMsIERTUCBEZXNpZ24gTHRkIDxzb2Z0d2FyZUBkc3BkZXNpZ24uY29tPiAqLworCS5uYW1lICAgICAgICAgICA9ICJEU1AgRGVzaWduIFRDVklERU8iLAorCS52aWRlb19pbnB1dHMgICA9IDQsCisJLnN2aHMgICAgICAgICAgID0gLTEsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAKLSAgICAgICAgLyogLS0tLSBjYXJkIDB4NTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIC0tLS0gY2FyZCAweDUwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAkubmFtZSAgICAgICAgICAgPSAiSGF1cHBhdWdlIFdpblRWIFBWUiIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCi0gICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMSwgMX0sCi0gICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCi0gICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnN2aHMgICAgICAgICAgID0gMiwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDAsIDEsIDF9LAorCS5uZWVkc190dmF1ZGlvICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAogCS5ncGlvbWFzayAgICAgICA9IDcsCiAJLmF1ZGlvbXV4ICAgICAgID0gezd9LApAQCAtMTQ3MSw2ICsxNTU1LDcgQEAKIAkubm9fbXNwMzR4eCAgICAgPSAxLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmF1ZGlvX2hvb2sgICAgID0gZ3ZiY3R2NXBjaV9hdWRpbywKIAkuaGFzX3JhZGlvICAgICAgPSAxLAogfSx7CkBAIC0xNDgyLDkgKzE1NjcsMTAgQEAKIAkubXV4c2VsICAgICAgICAgPSB7IDMsIDIsIDAsIDEgfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAogfSx7CiAJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDAvMTUwICg4NDgpIiwgLyogMHgwNC01NEMwLUMxICYgb2xkZXIgYm9hcmRzICovCiAJLnZpZGVvX2lucHV0cyAgID0gMywKQEAgLTE0OTQsOSArMTU4MCwxMCBAQAogCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSB9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCiB9LHsKIAogCS8qIC0tLS0gY2FyZCAweDU0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE1MDgsOSArMTU5NSwxMCBAQAogCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSB9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCiB9LHsKIAkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMS8xNTEiLCAgICAgICAvKiAweDEoNHw1KS0wMDA0LUM0ICovCiAJLnZpZGVvX2lucHV0cyAgID0gMSwKQEAgLTE1MjAsOSArMTYwOCwxMCBAQAogCS5tdXhzZWwgICAgICAgICA9IHsgMCB9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCiB9LHsKIAkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMS8xNTEgdy8gc3ZpZCIsICAvKiAweCgxNnwxN3wyMCktMDBDNC1DMSAqLwogCS52aWRlb19pbnB1dHMgICA9IDIsCkBAIC0xNTMyLDkgKzE2MjEsMTAgQEAKIAkubXV4c2VsICAgICAgICAgPSB7IDAsIDEgfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAogfSx7CiAJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMDAvMjAxLzI1MC8yNTEiLCAgLyogMHgxKDh8OXxFfEYpLTAwMDQtQzQgKi8KIAkudmlkZW9faW5wdXRzICAgPSAxLApAQCAtMTU0MywxMCArMTYzMywxMSBAQAogCS5zdmhzICAgICAgICAgICA9IC0xLAogCS5tdXhzZWwgICAgICAgICA9IHsgMCB9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLQkudHVuZXJfdHlwZSAgICAgPSAtMSwKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKKwkudHVuZXJfdHlwZQk9IFVOU0VULAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwKIH0sewogCiAJLyogLS0tLSBjYXJkIDB4NTggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTU1NywxMCArMTY0OCwxMSBAQAogCS5zdmhzICAgICAgICAgICA9IDEsCiAJLm11eHNlbCAgICAgICAgID0geyAwLCAxIH0sCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAotCS50dW5lcl90eXBlICAgICA9IC0xLAotICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAotICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAotICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAorCS50dW5lcl90eXBlCT0gVU5TRVQsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAogfSx7CiAJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMTAvMjIwIiwgICAvKiAweDEoQXxCKS0wNEMwLUMxICovCiAJLnZpZGVvX2lucHV0cyAgID0gMiwKQEAgLTE1NjksMTAgKzE2NjEsMTEgQEAKIAkuc3ZocyAgICAgICAgICAgPSAxLAogCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLQkudHVuZXJfdHlwZSAgICAgPSAtMSwKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKKwkudHVuZXJfdHlwZQk9IFVOU0VULAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwKIH0sewogCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgNTAwIiwgICAvKiA1MDAgKi8KIAkudmlkZW9faW5wdXRzICAgPSAyLApAQCAtMTU4MiwxOSArMTY3NSwyMSBAQAogCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCiB9LHsKLSAgICAgICAubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDU0MCIsICAgLyogNTQwICovCi0gICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKLSAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAotICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAotICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLSAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKLSAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAotICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKKwkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDU0MCIsICAgLyogNTQwICovCisJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IC0xLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCiB9LHsKIAogCS8qIC0tLS0gY2FyZCAweDVDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE2MDUsMTAgKzE3MDAsMTEgQEAKIAkuc3ZocyAgICAgICAgICAgPSAxLAogCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLQkudHVuZXJfdHlwZSAgICAgPSAtMSwKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwgICAgICAvKiBtdXN0IGF2b2lkLCBjb25mbGljdHMgd2l0aCB0aGUgYnQ4NjAgKi8KKwkudHVuZXJfdHlwZQk9IFVOU0VULAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwgICAgICAvKiBtdXN0IGF2b2lkLCBjb25mbGljdHMgd2l0aCB0aGUgYnQ4NjAgKi8KIH0sewogCS8qIE0gRyBCZXJiZXJpY2ggPGJlcmJlcmljQGZvcndpc3MudW5pLXBhc3NhdS5kZT4gKi8KIAkubmFtZSAgICAgICAgICAgPSAiSURTIEVhZ2xlIiwKQEAgLTE2MTYsNiArMTcxMiw3IEBACiAJLmF1ZGlvX2lucHV0cyAgID0gMCwKIAkudHVuZXIgICAgICAgICAgPSAtMSwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLnN2aHMgICAgICAgICAgID0gLTEsCiAJLmdwaW9tYXNrICAgICAgID0gMCwKIAkubXV4c2VsICAgICAgICAgPSB7IDAsIDEsIDIsIDMgfSwKQEAgLTE2MzAsNiArMTcyNyw3IEBACiAJLnN2aHMgICAgICAgICAgID0gMSwKIAkudHVuZXIgICAgICAgICAgPSAtMSwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLm5vX21zcDM0eHggICAgID0gMSwKIAkubm9fdGRhOTg3NSAgICAgPSAxLAogCS5ub190ZGE3NDMyICAgICA9IDEsCkBAIC0xNjQxLDM4ICsxNzM5LDQwIEBACiAJLm5vX2dwaW9pcnEgICAgID0gMSwKIAkuaGFzX2R2YiAgICAgICAgPSAxLAogfSx7Ci0gICAgICAgIC5uYW1lICAgICAgICAgICA9ICJGb3JtYWMgUHJvVFYgSUkgKGJ0ODc4KSIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCi0gICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IDMsCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDIsCi0JLy8gVFYsIENvbXAxLCBDb21wb3NpdGUgb3ZlciBTVklEIGNvbiwgU1ZJRAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAotICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDIsIDIsIDAsIDAsIDAgfSwKLSAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS5uYW1lICAgICAgICAgICA9ICJGb3JtYWMgUHJvVFYgSUkgKGJ0ODc4KSIsCisJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnN2aHMgICAgICAgICAgID0gMywKKwkuZ3Bpb21hc2sgICAgICAgPSAyLAorCS8qIFRWLCBDb21wMSwgQ29tcG9zaXRlIG92ZXIgU1ZJRCBjb24sIFNWSUQgKi8KKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eCAgICAgICA9IHsgMiwgMiwgMCwgMCwgMCB9LAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkuaGFzX3JhZGlvICAgICAgPSAxLAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKLSAgICAgIC8qIHNvdW5kIHJvdXRpbmc6Ci0gICAgICAgICAgIEdQSU89MHgwMCwweDAxLDB4MDM6IG11dGUgKD8pCi0gICAgICAgICAgICAgIDB4MDI6IGJvdGggVFYgYW5kIHJhZGlvICh0dW5lcjogRk0xMjE2L0kpCi0gICAgICAgICBUaGUgY2FyZCBoYXMgb25ib2FyZCBhdWRpbyBjb25uZWN0b3JzIGxhYmVsZWQgImNkcm9tIiBhbmQgImJvYXJkIiwKLQkgbm90IHNvbGRlcmVkIGhlcmUsIHRob3VnaCB1bmtub3duIHdpcmluZy4KLSAgICAgICAgIENhcmQgbGFja3M6IGV4dGVybmFsIGF1ZGlvIGluLCBwY2kgc3Vic3lzdGVtIGlkLgotICAgICAgICovCisJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorLyogc291bmQgcm91dGluZzoKKwlHUElPPTB4MDAsMHgwMSwweDAzOiBtdXRlICg/KQorCTB4MDI6IGJvdGggVFYgYW5kIHJhZGlvICh0dW5lcjogRk0xMjE2L0kpCisJVGhlIGNhcmQgaGFzIG9uYm9hcmQgYXVkaW8gY29ubmVjdG9ycyBsYWJlbGVkICJjZHJvbSIgYW5kICJib2FyZCIsCisJbm90IHNvbGRlcmVkIGhlcmUsIHRob3VnaCB1bmtub3duIHdpcmluZy4KKwlDYXJkIGxhY2tzOiBleHRlcm5hbCBhdWRpbyBpbiwgcGNpIHN1YnN5c3RlbSBpZC4KKyovCiB9LHsKIAogCS8qIC0tLS0gY2FyZCAweDYwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAkubmFtZSAgICAgICAgICAgPSAiTWFjaFRWIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDcsCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCi0gICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNH0sCi0gICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IDUsCisJLnZpZGVvX2lucHV0cyAgID0gMywKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnN2aHMgICAgICAgICAgID0gLTEsCisJLmdwaW9tYXNrICAgICAgID0gNywKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNH0sCisJLm5lZWRzX3R2YXVkaW8gID0gMSwKKwkudHVuZXJfdHlwZSAgICAgPSA1LAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkucGxsICAgICAgICAgICAgPSAxLAogfSx7CiAJLm5hbWUgICAgICAgICAgID0gIkV1cmVzeXMgUGljb2xvIiwKQEAgLTE2ODYsNiArMTc4Niw4IEBACiAJLm5vX3RkYTc0MzIgICAgID0gMSwKIAkubXV4c2VsICAgICAgICAgPSB7IDIsIDAsIDF9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBMdWMgVmFuIEhvZXlsYW5kdCA8bHVjQGUtbWFnaWMuYmU+ICovCiAJLm5hbWUgICAgICAgICAgID0gIlByb1ZpZGVvIFBWMTUwIiwgLyogMHg0ZiAqLwpAQCAtMTY5OSw3ICsxODAxLDggQEAKIAkubmVlZHNfdHZhdWRpbyAgPSAwLAogCS5ub19tc3AzNHh4ICAgICA9IDEsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAotCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl90eXBlICAgICA9IFVOU0VULAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS8qIEhpcm9zaGkgVGFrZWthd2EgPHNpYW5AYmlnLm9yLmpwPiAqLwogCS8qIFRoaXMgY2FyZCBsYWNrcyBzdWJzeXN0ZW0gSUQgKi8KQEAgLTE3MTYsNzggKzE4MTksODUgQEAKIAkubm9fbXNwMzR4eCAgICAgPSAxLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSAyLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuYXVkaW9faG9vawk9IGFkdHZrNTAzX2F1ZGlvLAogfSx7CiAKIAkvKiAtLS0tIGNhcmQgMHg2NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgIC5uYW1lICAgICAgICAgICA9ICJIZXJjdWxlcyBTbWFydCBUViBTdGVyZW8iLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAotICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDAwLAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKLSAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSA1LAorCS5uYW1lICAgICAgICAgICA9ICJIZXJjdWxlcyBTbWFydCBUViBTdGVyZW8iLAorCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKKwkubmVlZHNfdHZhdWRpbyAgPSAxLAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IDUsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS8qIE5vdGVzOgotCSAgIC0gY2FyZCBsYWNrcyBzdWJzeXN0ZW0gSUQKLQkgICAtIHN0ZXJlbyB2YXJpYW50IHcvIGRhdWdodGVyIGJvYXJkIHdpdGggdGRhOTg3NGEgQDB4YjAKLQkgICAtIEF1ZGlvIFJvdXRpbmc6CisJLSBjYXJkIGxhY2tzIHN1YnN5c3RlbSBJRAorCS0gc3RlcmVvIHZhcmlhbnQgdy8gZGF1Z2h0ZXIgYm9hcmQgd2l0aCB0ZGE5ODc0YSBAMHhiMAorCS0gQXVkaW8gUm91dGluZzoKIAkJYWx3YXlzIGZyb20gdGRhOTg3NCBpbmRlcGVuZGVudCBvZiBHUElPICg/KQogCQlleHRlcm5hbCBsaW5lIGluOiB1bmtub3duCi0JICAgLSBPdGhlciBjaGlwczogZW03OHAxNTZlbHAgQCAweDk2IChwcm9iYWJseSBJUiByZW1vdGUgY29udHJvbCkKLQkgICAgICAgICAgICAgIGhlZjQwNTMgKGluc3RlYWQgNDA1MikgZm9yIHVua25vd24gZnVuY3Rpb24KKwktIE90aGVyIGNoaXBzOiBlbTc4cDE1NmVscCBAIDB4OTYgKHByb2JhYmx5IElSIHJlbW90ZSBjb250cm9sKQorCQloZWY0MDUzIChpbnN0ZWFkIDQwNTIpIGZvciB1bmtub3duIGZ1bmN0aW9uCiAJKi8KIH0sewotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiUGFjZSBUViAmIFJhZGlvIENhcmQiLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAotICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LCAvLyBUdW5lciwgQ1ZpZCwgU1ZpZCwgQ1ZpZCBvdmVyIFNWaWQgY29ubmVjdG9yCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDAsCi0gICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IDEsCi0gICAgICAgIC5oYXNfcmFkaW8gICAgICA9IDEsCi0gICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLSAgICAgICAgLyogQnQ4NzgsIEJ0ODMyLCBGSTEyNDYgdHVuZXI7IG5vIHBjaSBzdWJzeXN0ZW0gaWQKLSAgICAgICAgICAgb25seSBpbnRlcm5hbCBsaW5lIG91dDogKDRwaW4gaGVhZGVyKSBSR0dMCi0gICAgICAgICAgIFJhZGlvIG11c3QgYmUgZGVjb2RlZCBieSBtc3AzNDEwZCAobm90IHJvdXRlZCB0aHJvdWdoKSovCi0gICAgICAgIC8vICAgICAgICAgLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwgLy8gdG9kbyEKKwkubmFtZSAgICAgICAgICAgPSAiUGFjZSBUViAmIFJhZGlvIENhcmQiLAorCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwgLyogVHVuZXIsIENWaWQsIFNWaWQsIENWaWQgb3ZlciBTVmlkIGNvbm5lY3RvciAqLworCS5ncGlvbWFzayAgICAgICA9IDAsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAorCS50dW5lcl90eXBlICAgICA9IDEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5oYXNfcmFkaW8gICAgICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS8qIEJ0ODc4LCBCdDgzMiwgRkkxMjQ2IHR1bmVyOyBubyBwY2kgc3Vic3lzdGVtIGlkCisJb25seSBpbnRlcm5hbCBsaW5lIG91dDogKDRwaW4gaGVhZGVyKSBSR0dMCisJUmFkaW8gbXVzdCBiZSBkZWNvZGVkIGJ5IG1zcDM0MTBkIChub3Qgcm91dGVkIHRocm91Z2gpKi8KKwkvKgorCS5kaWdpdGFsX21vZGUgICA9IERJR0lUQUxfTU9ERV9DQU1FUkEsICB0b2RvIQorCSovCiB9LHsKLSAgICAgICAgLyogQ2hyaXMgV2lsbGluZyA8Y2hyaXNAdmlzbGFiLnVzeWQuZWR1LmF1PiAqLwotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiSVZDLTIwMCIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDEsCi0gICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDAsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4ZGYsCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiB9LAotICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLyogQ2hyaXMgV2lsbGluZyA8Y2hyaXNAdmlzbGFiLnVzeWQuZWR1LmF1PiAqLworCS5uYW1lICAgICAgICAgICA9ICJJVkMtMjAwIiwKKwkudmlkZW9faW5wdXRzICAgPSAxLAorCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5zdmhzICAgICAgICAgICA9IC0xLAorCS5ncGlvbWFzayAgICAgICA9IDB4ZGYsCisJLm11eHNlbCAgICAgICAgID0geyAyIH0sCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogfSx7CiAJLm5hbWUgICAgICAgICAgID0gIkdyYW5kIFgtR3VhcmQgLyBUcnVzdCA4MTRQQ0kiLAogCS52aWRlb19pbnB1dHMgICA9IDE2LAotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCisJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkuc3ZocyAgICAgICAgICAgPSAtMSwKIAkudHVuZXJfdHlwZSAgICAgPSA0LAotICAgICAgICAuZ3Bpb21hc2syICAgICAgPSAweGZmLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkuZ3Bpb21hc2syICAgICAgPSAweGZmLAogCS5tdXhzZWwgICAgICAgICA9IHsgMiwyLDIsMiwgMywzLDMsMywgMSwxLDEsMSwgMCwwLDAsMCB9LAogCS5tdXhzZWxfaG9vayAgICA9IHhndWFyZF9tdXhzZWwsCiAJLm5vX21zcDM0eHggICAgID0gMSwKIAkubm9fdGRhOTg3NSAgICAgPSAxLAotICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogfSx7CiAKIAkvKiAtLS0tIGNhcmQgMHg2OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJLm5hbWUgICAgICAgICAgID0gIk5lYnVsYSBFbGVjdHJvbmljcyBEaWdpVFYiLAogCS52aWRlb19pbnB1dHMgICA9IDEsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAorCS50dW5lciAgICAgICAgICA9IC0xLAogCS5zdmhzICAgICAgICAgICA9IC0xLAogCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCiAJLm5vX21zcDM0eHggICAgID0gMSwKQEAgLTE3OTUsMjIgKzE5MDUsMjQgQEAKIAkubm9fdGRhNzQzMiAgICAgPSAxLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmhhc19kdmIgICAgICAgID0gMSwKIAkubm9fZ3Bpb2lycSAgICAgPSAxLAogfSx7CiAJLyogSm9yZ2UgQm9uY29tcHRlIC0gRFRJMiA8am9yZ2VAZHRpMi5uZXQ+ICovCiAJLm5hbWUgICAgICAgICAgID0gIlByb1ZpZGVvIFBWMTQzIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAwLAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKLSAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCi0gICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAwLAorCS50dW5lciAgICAgICAgICA9IC0xLAorCS5zdmhzICAgICAgICAgICA9IC0xLAorCS5ncGlvbWFzayAgICAgICA9IDAsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCisJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCisJLm5lZWRzX3R2YXVkaW8gID0gMCwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBNLktsYWhyQHBoeXRlYy5kZSAqLwogCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5LVgxIE1pbmlESU4gKGJ0ODc4KSIsCkBAIC0xODI0LDYgKzE5MzYsNyBAQAogCS5uZWVkc190dmF1ZGlvICA9IDEsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5LVgxIENvbWJpIChidDg3OCkiLAogCS52aWRlb19pbnB1dHMgICA9IDQsCkBAIC0xODM2LDYgKzE5NDksNyBAQAogCS5uZWVkc190dmF1ZGlvICA9IDEsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCiAJLyogLS0tLSBjYXJkIDB4NmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTg0NiwxMyArMTk2MCwxNCBAQAogCS5zdmhzICAgICAgICAgICA9IDksCiAJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKIAkuZ3Bpb21hc2syICAgICAgPSAweDAzLCAvKiBncGlvbWFzazIgZGVmaW5lcyB0aGUgYml0cyB1c2VkIHRvIHN3aXRjaCBhdWRpbwotCQkJCSAgIHZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKLQkJCQkgICB4dGVybmFsIHZpZGVvLW11eCAqLworCQkJCXZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKKwkJCQl4dGVybmFsIHZpZGVvLW11eCAqLwogCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMiwgMHgwMywgMHgxMywgMHgyMywgMHgzMywgMHgwMSwgMHgwMCB9LAogCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwogCS5uZWVkc190dmF1ZGlvICA9IDEsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5IENvbWJpIChidDg3OCkiLAogCS52aWRlb19pbnB1dHMgICA9IDEwLApAQCAtMTg2MSwyMyArMTk3NiwyNSBAQAogCS5zdmhzICAgICAgICAgICA9IDksCiAJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKIAkuZ3Bpb21hc2syICAgICAgPSAweDAzLCAvKiBncGlvbWFzazIgZGVmaW5lcyB0aGUgYml0cyB1c2VkIHRvIHN3aXRjaCBhdWRpbwotCQkJCSAgIHZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKLQkJCQkgICB4dGVybmFsIHZpZGVvLW11eCAqLworCQkJCXZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKKwkJCQl4dGVybmFsIHZpZGVvLW11eCAqLwogCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMiwgMHgwMywgMHgxMywgMHgyMywgMHgzMywgMHgwMSwgMHgwMSB9LAogCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwogCS5uZWVkc190dmF1ZGlvICA9IDEsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiSVZDLTEwMCIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCi0gICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDAsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4ZGYsCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAotICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLm5hbWUgICAgICAgICAgID0gIklWQy0xMDAiLAorCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLnN2aHMgICAgICAgICAgID0gLTEsCisJLmdwaW9tYXNrICAgICAgID0gMHhkZiwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiB9LHsKIAkvKiBJVkMtMTIwRyAtIEFsYW4gR2FyZmllbGQgPGFsYW5AZnJvbW9yYml0LmNvbT4gKi8KIAkubmFtZSAgICAgICAgICAgPSAiSVZDLTEyMEciLApAQCAtMTg4NSw2ICsyMDAyLDcgQEAKIAkuYXVkaW9faW5wdXRzICAgPSAwLCAgICAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwogCS50dW5lciAgICAgICAgICA9IC0xLCAgIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5zdmhzICAgICAgICAgICA9IC0xLCAgIC8qIGNhcmQgaGFzIG5vIHN2aHMgKi8KIAkubmVlZHNfdHZhdWRpbyAgPSAwLAogCS5ub19tc3AzNHh4ICAgICA9IDEsCkBAIC0xODkyLDcgKzIwMTAsNyBAQAogCS5ub190ZGE3NDMyICAgICA9IDEsCiAJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKIAkubXV4c2VsICAgICAgICAgPSB7IDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsCi0JCQkgICAgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCB9LAorCQkJMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCB9LAogCS5tdXhzZWxfaG9vayAgICA9IGl2YzEyMF9tdXhzZWwsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogfSx7CkBAIC0xOTA1LDYgKzIwMjMsNyBAQAogCS5zdmhzICAgICAgICAgICA9IDIsCiAJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKIAkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0FUU0MsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5oYXNfZHZiICAgICAgICA9IDEsCiB9LHsKIAkubmFtZSAgICAgICAgICAgPSAiVHdpbmhhbiBEU1QgKyBjbG9uZXMiLApAQCAtMTkxMiwxOSArMjAzMSwyMSBAQAogCS5ub190ZGE5ODc1ICAgICA9IDEsCiAJLm5vX3RkYTc0MzIgICAgID0gMSwKIAkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5ub192aWRlbyAgICAgICA9IDEsCiAJLmhhc19kdmIgICAgICAgID0gMSwKIH0sewotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiV2luZmFzdCBWQzEwMCIsCisJLm5hbWUgICAgICAgICAgID0gIldpbmZhc3QgVkMxMDAiLAogCS52aWRlb19pbnB1dHMgICA9IDMsCiAJLmF1ZGlvX2lucHV0cyAgID0gMCwKIAkuc3ZocyAgICAgICAgICAgPSAxLAotCS50dW5lciAgICAgICAgICA9IC0xLCAvLyBubyB0dW5lcgotCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSwgMSwgM30sIC8vIFZpZCBJbiwgU1ZpZCBJbiwgVmlkIG92ZXIgU1ZpZCBpbiBjb25uZWN0b3IKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCS50dW5lciAgICAgICAgICA9IC0xLAorCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSwgMSwgM30sIC8qIFZpZCBJbiwgU1ZpZCBJbiwgVmlkIG92ZXIgU1ZpZCBpbiBjb25uZWN0b3IgKi8KKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwKKwkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIH0sewogCS5uYW1lICAgICAgICAgICA9ICJUZXBwcm8gVEVWLTU2MC9JbnRlclZpc2lvbiBJVi01NjAiLApAQCAtMTkzNyw0NCArMjA1OCw0OSBAQAogCS5hdWRpb211eCAgICAgICA9IHsgMSwgMSwgMSwgMSwgMH0sCiAJLm5lZWRzX3R2YXVkaW8gID0gMSwKIAkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAogfSx7CiAKIAkvKiAtLS0tIGNhcmQgMHg3NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgIC5uYW1lICAgICAgICAgICA9ICJTSU1VUyBHVkMxMTAwIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKLSAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDJ9LAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDNGLAorCS5uYW1lICAgICAgICAgICA9ICJTSU1VUyBHVkMxMTAwIiwKKwkudmlkZW9faW5wdXRzICAgPSA0LAorCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gLTEsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDJ9LAorCS5ncGlvbWFzayAgICAgICA9IDB4M0YsCiAJLm11eHNlbF9ob29rICAgID0gZ3ZjMTEwMF9tdXhzZWwsCiB9LHsKLSAgICAgICAgLyogQ2FybG9zIFNpbHZhIHIzcGVrQHIzcGVrLmhvbWVsaW51eC5vcmcgfHwgY2FyZCAweDc1ICovCi0gICAgICAgIC5uYW1lICAgICAgICAgICA9ICJOR1MgTkdTVFYrIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKLSAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgwMDgwMDcsCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwfSwKLSAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0gezAsIDAsIDAsIDAsIDB4MDAwMDAzLCAwfSwKLSAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKLSAgICAgICAgLmhhc19yZW1vdGUgICAgID0gMSwKKwkvKiBDYXJsb3MgU2lsdmEgcjNwZWtAcjNwZWsuaG9tZWxpbnV4Lm9yZyB8fCBjYXJkIDB4NzUgKi8KKwkubmFtZSAgICAgICAgICAgPSAiTkdTIE5HU1RWKyIsCisJLnZpZGVvX2lucHV0cyAgID0gMywKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLmdwaW9tYXNrICAgICAgID0gMHgwMDgwMDcsCisJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDAsIDB9LAorCS5hdWRpb211eCAgICAgICA9IHswLCAwLCAwLCAwLCAweDAwMDAwMywgMH0sCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkuaGFzX3JlbW90ZSAgICAgPSAxLAogfSx7Ci0gICAgICAgIC8qIGh0dHA6Ly9saW51eG1lZGlhbGFicy5jb20gKi8KLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkxNTEJUNCIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsIC8qIElOMSxJTjIsSU4zLElONCAqLwotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAotICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAotICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAotICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAotICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAwLAorCS8qIGh0dHA6Ly9saW51eG1lZGlhbGFicy5jb20gKi8KKwkubmFtZSAgICAgICAgICAgPSAiTE1MQlQ0IiwKKwkudmlkZW9faW5wdXRzICAgPSA0LCAvKiBJTjEsSU4yLElOMyxJTjQgKi8KKwkuYXVkaW9faW5wdXRzICAgPSAwLAorCS50dW5lciAgICAgICAgICA9IC0xLAorCS5zdmhzICAgICAgICAgICA9IC0xLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAorCS5uZWVkc190dmF1ZGlvICA9IDAsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLyogSGVsbXJvb3MgSGFycmkgPGhhcnJpLmhlbG1yb29zQHBwLmluZXQuZmk+ICovCiAJLm5hbWUgICAgICAgICAgID0gIlRla3JhbSBNMjA1IFBSTyIsCkBAIC0xOTgyLDYgKzIxMDgsNyBAQAogCS5hdWRpb19pbnB1dHMgICA9IDEsCiAJLnR1bmVyICAgICAgICAgID0gMCwKIAkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLnN2aHMgICAgICAgICAgID0gMiwKIAkubmVlZHNfdHZhdWRpbyAgPSAwLAogCS5ncGlvbWFzayAgICAgICA9IDB4NjgsCkBAIC0yMDA0LDYgKzIxMzEsNyBAQAogCS5uZWVkc190dmF1ZGlvICA9IDAsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuaGFzX3JlbW90ZSAgICAgPSAxLAogCS5oYXNfcmFkaW8gICAgICA9IDEsCiB9LHsKQEAgLTIwMjYsNiArMjE1NCw4IEBACiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS5uZWVkc190dmF1ZGlvICA9IDAsCiAJLm11eHNlbF9ob29rICAgID0gcGljb2xvX3RldHJhX211eHNlbCwvKlJlcXVpcmVkIGFzIGl0IGRvZXNuJ3QgZm9sbG93IHRoZSBjbGFzc2ljIGlucHV0IHNlbGVjdGlvbiBwb2xpY3kqLworCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS8qIFNwaXJpdCBUViBUdW5lciBmcm9tIGh0dHA6Ly9zcGlyaXRtb2RlbXMuY29tLmF1ICovCiAJLyogU3RhZmZvcmQgR29vZHNlbGwgPHN1cmdlQGdvbGlhdGguaG9tZXVuaXgub3JnPiAqLwpAQCAtMjAzOCwyMyArMjE2OCwyNSBAQAogCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMSwgMSB9LAogCS5hdWRpb211eCAgICAgICA9IHsgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCiAJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfUEFMLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkubm9fbXNwMzR4eCAgICAgPSAxLAogCS5ub190ZGE5ODc1ICAgICA9IDEsCiB9LHsKIAkvKiBXb2xmcmFtIEpvb3N0IDx3b2pvQGZyb2thc2Nod2VpLmRlPiAqLwotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQVZlck1lZGlhIEFWZXJUViBEVkItVCA3NzEiLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSAyLAotICAgICAgICAuc3ZocyAgICAgICAgICAgPSAxLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDMgLCAzIH0sCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCi0gICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLSAgICAgICAgLmhhc19kdmIgICAgICAgID0gMSwKLSAgICAgICAgLm5vX2dwaW9pcnEgICAgID0gMSwKLSAgICAgICAgLmhhc19yZW1vdGUgICAgID0gMSwKKwkubmFtZSAgICAgICAgICAgPSAiQVZlck1lZGlhIEFWZXJUViBEVkItVCA3NzEiLAorCS52aWRlb19pbnB1dHMgICA9IDIsCisJLnN2aHMgICAgICAgICAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5tdXhzZWwgICAgICAgICA9IHsgMyAsIDMgfSwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLmhhc19kdmIgICAgICAgID0gMSwKKwkubm9fZ3Bpb2lycSAgICAgPSAxLAorCS5oYXNfcmVtb3RlICAgICA9IDEsCiB9LHsKIAkvKiAtLS0tIGNhcmQgMHg3YyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJLyogTWF0dCBKZXNzb24gPGR2YkBqZXNzb24uZWNsaXBzZS5jby51az4gKi8KQEAgLTIwNjksNiArMjIwMSw3IEBACiAJLm5vX3RkYTc0MzIgICAgID0gMSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5oYXNfZHZiICAgICAgICA9IDEsCiAJLm5vX2dwaW9pcnEgICAgID0gMSwKIAkuaGFzX3JlbW90ZSAgICAgPSAxLApAQCAtMjA4MSwxMiArMjIxNCwxMyBAQAogCS5zdmhzICAgICAgICAgICAgID0gLTEsCiAJLmdwaW9tYXNrICAgICAgICAgPSAweDAsCiAJLm11eHNlbCAgICAgICAgICAgPSB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0JCQkgICAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCisJCQkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCiAJLm11eHNlbF9ob29rICAgICAgPSBzaWdtYVNRX211eHNlbCwKIAkuYXVkaW9tdXggICAgICAgICA9IHsgMCB9LAogCS5ub19tc3AzNHh4ICAgICAgID0gMSwKIAkucGxsICAgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgICA9IC0xLAorCS50dW5lcl9hZGRyCSAgPSBBRERSX1VOU0VULAogfSx7CiAJLyogYW5kcmUuc2Nod2FyekBtYXRyaXgtdmlzaW9uLmRlICovCiAJLm5hbWUgICAgICAgICAgICAgPSAiTUFUUklYIFZpc2lvbiBTaWdtYS1TTEMiLApAQCAtMjEwMSw2ICsyMjM1LDcgQEAKIAkubm9fbXNwMzR4eCAgICAgICA9IDEsCiAJLnBsbCAgICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgkgID0gQUREUl9VTlNFVCwKIH0sewogCS8qIEJUVFZfQVBBQ19WSUVXQ09NUCAqLwogCS8qIEF0dGlsYSBLb25kb3JvcyA8YXR0aWxhLmtvbmRvcm9zQGNoZWxsby5odT4gKi8KQEAgLTIxMTYsMTMgKzIyNTEsMTQgQEAKIAkubmVlZHNfdHZhdWRpbyAgPSAwLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmhhc19yZW1vdGUgICAgID0gMSwgICAvKiBtaW5pcmVtb3RlIHdvcmtzLCBzZWUgaXIta2JkLWdwaW8uYyAqLwogCS5oYXNfcmFkaW8gICAgICA9IDEsICAgLyogbm90IGV2ZXJ5IGNhcmQgaGFzIHJhZGlvICovCiB9LHsKIAogCS8qIC0tLS0gY2FyZCAweDgwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAkvKiBDaHJpcyBQYXNjb2UgPGMucGFzY29lQGl0ZWUudXEuZWR1LmF1PiAqLwotCS5uYW1lICAgICAgICAgICA9ICJEVklDTyBGdXNpb25IRFRWIERWQi1UIExpdGUiLAorCS5uYW1lICAgICAgICAgICA9ICJEVmlDTyBGdXNpb25IRFRWIERWQi1UIExpdGUiLAogCS50dW5lciAgICAgICAgICA9IC0xLAogCS5ub19tc3AzNHh4ICAgICA9IDEsCiAJLm5vX3RkYTk4NzUgICAgID0gMSwKQEAgLTIxMzEsNiArMjI2Nyw3IEBACiAJLm5vX3ZpZGVvICAgICAgID0gMSwKIAkuaGFzX2R2YiAgICAgICAgPSAxLAogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS8qIFN0ZXZlbiA8cGhvdG9uMzhAcGNob21lLmNvbS50dz4gKi8KIAkubmFtZSAgICAgICAgICAgPSAiVi1HZWFyIE15VkNEIiwKQEAgLTIxNDQsNjIgKzIyODEsNjUgQEAKIAkubm9fbXNwMzR4eCAgICAgPSAxLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmhhc19yYWRpbyAgICAgID0gMCwKLQkvLyAuaGFzX3JlbW90ZSAgICAgPSAxLAogfSx7CiAJLyogUmljayBDIDxjcnlwdGRyYWdvb25AZ21haWwuY29tPiAqLwotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiU3VwZXIgVFYgVHVuZXIiLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAotICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAotICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDB4MDAwMDAxLDAsMCwgMH0sCi0gICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCi0gICAgICAgIC5oYXNfcmFkaW8gICAgICA9IDEsCisJLm5hbWUgICAgICAgICAgID0gIlN1cGVyIFRWIFR1bmVyIiwKKwkudmlkZW9faW5wdXRzICAgPSA0LAorCS5hdWRpb19pbnB1dHMgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gMCwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCisJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKKwkuYXVkaW9tdXggICAgICAgPSB7IDAsIDB4MDAwMDAxLDAsMCwgMH0sCisJLm5lZWRzX3R2YXVkaW8gID0gMSwKKwkuaGFzX3JhZGlvICAgICAgPSAxLAogfSx7Ci0JCS8qIENocmlzIEZhbm5pbmcgPHZpZGVvNGxpbnV4QGhheWRvbi5uZXQ+ICovCi0JCS5uYW1lICAgICAgICAgICA9ICJUaWJldCBTeXN0ZW1zICdQcm9ncmVzcyBEVlInIENTMTYiLAotCQkudmlkZW9faW5wdXRzICAgPSAxNiwKLQkJLmF1ZGlvX2lucHV0cyAgID0gMCwKLQkJLnR1bmVyICAgICAgICAgID0gLTEsCi0JCS5zdmhzICAgICAgICAgICA9IC0xLAotCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIgfSwKLQkJLnBsbAkJPSBQTExfMjgsCi0JCS5ub19tc3AzNHh4ICAgICA9IDEsCi0JCS5ub190ZGE5ODc1ICAgICA9IDEsCi0JCS5ub190ZGE3NDMyCT0gMSwKLQkJLnR1bmVyX3R5cGUgICAgID0gLTEsCi0JCS5tdXhzZWxfaG9vayAgICA9IHRpYmV0Q1MxNl9tdXhzZWwsCisJLyogQ2hyaXMgRmFubmluZyA8dmlkZW80bGludXhAaGF5ZG9uLm5ldD4gKi8KKwkubmFtZSAgICAgICAgICAgPSAiVGliZXQgU3lzdGVtcyAnUHJvZ3Jlc3MgRFZSJyBDUzE2IiwKKwkudmlkZW9faW5wdXRzICAgPSAxNiwKKwkuYXVkaW9faW5wdXRzICAgPSAwLAorCS50dW5lciAgICAgICAgICA9IC0xLAorCS5zdmhzICAgICAgICAgICA9IC0xLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiB9LAorCS5wbGwJCT0gUExMXzI4LAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMgk9IDEsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5tdXhzZWxfaG9vayAgICA9IHRpYmV0Q1MxNl9tdXhzZWwsCiB9LAogewogCS8qIEJpbGwgQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPiAqLwogCS8qCi0JICogTm90ZSB0aGF0LCBiZWNhdXNlIG9mIHRoZSBjYXJkJ3Mgd2lyaW5nLCB0aGUgIm1hc3RlciIKLQkgKiBCVDg3OEEgY2hpcCAoaS5lLiB0aGUgb25lIHdoaWNoIGNvbnRyb2xzIHRoZSBhbmFsb2cgc3dpdGNoCi0JICogYW5kIG11c3QgdXNlIHRoaXMgY2FyZCB0eXBlKSBpcyB0aGUgMm5kIG9uZSBkZXRlY3RlZC4gIFRoZQotCSAqIG90aGVyIDMgY2hpcHMgc2hvdWxkIHVzZSBjYXJkIHR5cGUgMHg4NSwgd2hvc2UgZGVzY3JpcHRpb24KLQkgKiBmb2xsb3dzIHRoaXMgb25lLiAgVGhlcmUgaXMgYSBFRVBST00gb24gdGhlIGNhcmQgKHdoaWNoIGlzCi0JICogY29ubmVjdGVkIHRvIHRoZSBJMkMgb2Ygb25lIG9mIHRob3NlIG90aGVyIGNoaXBzKSwgYnV0IGlzCi0JICogbm90IGN1cnJlbnRseSBoYW5kbGVkLiAgVGhlcmUgaXMgYWxzbyBhIGZhY2lsaXR5IGZvciBhCi0JICogIm1vbml0b3IiLCB3aGljaCBpcyBhbHNvIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCi0JICovCi0JLm5hbWUJCT0gIktvZGljb20gNDQwMFIgKG1hc3RlcikiLAorCSogTm90ZSB0aGF0LCBiZWNhdXNlIG9mIHRoZSBjYXJkJ3Mgd2lyaW5nLCB0aGUgIm1hc3RlciIKKwkqIEJUODc4QSBjaGlwIChpLmUuIHRoZSBvbmUgd2hpY2ggY29udHJvbHMgdGhlIGFuYWxvZyBzd2l0Y2gKKwkqIGFuZCBtdXN0IHVzZSB0aGlzIGNhcmQgdHlwZSkgaXMgdGhlIDJuZCBvbmUgZGV0ZWN0ZWQuICBUaGUKKwkqIG90aGVyIDMgY2hpcHMgc2hvdWxkIHVzZSBjYXJkIHR5cGUgMHg4NSwgd2hvc2UgZGVzY3JpcHRpb24KKwkqIGZvbGxvd3MgdGhpcyBvbmUuICBUaGVyZSBpcyBhIEVFUFJPTSBvbiB0aGUgY2FyZCAod2hpY2ggaXMKKwkqIGNvbm5lY3RlZCB0byB0aGUgSTJDIG9mIG9uZSBvZiB0aG9zZSBvdGhlciBjaGlwcyksIGJ1dCBpcworCSogbm90IGN1cnJlbnRseSBoYW5kbGVkLiAgVGhlcmUgaXMgYWxzbyBhIGZhY2lsaXR5IGZvciBhCisJKiAibW9uaXRvciIsIHdoaWNoIGlzIGFsc28gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4KKwkqLworCS5uYW1lICAgICAgICAgICA9ICJLb2RpY29tIDQ0MDBSIChtYXN0ZXIpIiwKIAkudmlkZW9faW5wdXRzCT0gMTYsCiAJLmF1ZGlvX2lucHV0cwk9IDAsCiAJLnR1bmVyCQk9IC0xLAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5zdmhzCQk9IC0xLAogCS8qIEdQSU8gYml0cyAwLTkgdXNlZCBmb3IgYW5hbG9nIHN3aXRjaDoKLQkgKiAgIDAwIC0gMDM6CWNhbWVyYSBzZWxlY3RvcgotCSAqICAgMDQgLSAwNjoJY2hhbm5lbCAoY29udHJvbGxlcikgc2VsZWN0b3IKLQkgKiAgIDA3OglkYXRhICgxLT5vbiwgMC0+b2ZmKQotCSAqICAgMDg6CXN0cm9iZQotCSAqICAgMDk6CXJlc2V0Ci0JICogYml0IDE2IGlzIGlucHV0IGZyb20gc3luYyBzZXBhcmF0b3IgZm9yIHRoZSBjaGFubmVsCi0JICovCisJKiAgIDAwIC0gMDM6CWNhbWVyYSBzZWxlY3RvcgorCSogICAwNCAtIDA2OgljaGFubmVsIChjb250cm9sbGVyKSBzZWxlY3RvcgorCSogICAwNzoJZGF0YSAoMS0+b24sIDAtPm9mZikKKwkqICAgMDg6CXN0cm9iZQorCSogICAwOToJcmVzZXQKKwkqIGJpdCAxNiBpcyBpbnB1dCBmcm9tIHN5bmMgc2VwYXJhdG9yIGZvciB0aGUgY2hhbm5lbAorCSovCiAJLmdwaW9tYXNrCT0gMHgwMDAzZmYsCiAJLm5vX2dwaW9pcnEgICAgID0gMSwKIAkubXV4c2VsCQk9IHsgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMyB9LApAQCAtMjIxMiwxNSArMjM1MiwxNiBAQAogewogCS8qIEJpbGwgQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPiAqLwogCS8qIE5vdGUgdGhhdCwgZm9yIHJlYXNvbnMgdW5rbm93biwgdGhlICJtYXN0ZXIiIEJUODc4QSBjaGlwIChpLmUuIHRoZQotCSAqIG9uZSB3aGljaCBjb250cm9scyB0aGUgYW5hbG9nIHN3aXRjaCwgYW5kIG11c3QgdXNlIHRoZSBjYXJkIHR5cGUpCi0JICogaXMgdGhlIDJuZCBvbmUgZGV0ZWN0ZWQuICBUaGUgb3RoZXIgMyBjaGlwcyBzaG91bGQgdXNlIHRoaXMgY2FyZAotCSAqIHR5cGUKLQkgKi8KKwkqIG9uZSB3aGljaCBjb250cm9scyB0aGUgYW5hbG9nIHN3aXRjaCwgYW5kIG11c3QgdXNlIHRoZSBjYXJkIHR5cGUpCisJKiBpcyB0aGUgMm5kIG9uZSBkZXRlY3RlZC4gIFRoZSBvdGhlciAzIGNoaXBzIHNob3VsZCB1c2UgdGhpcyBjYXJkCisJKiB0eXBlCisJKi8KIAkubmFtZQkJPSAiS29kaWNvbSA0NDAwUiAoc2xhdmUpIiwKIAkudmlkZW9faW5wdXRzCT0gMTYsCiAJLmF1ZGlvX2lucHV0cwk9IDAsCiAJLnR1bmVyCQk9IC0xLAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5zdmhzCQk9IC0xLAogCS5ncGlvbWFzawk9IDB4MDEwMDAwLAogCS5ub19ncGlvaXJxICAgICA9IDEsCkBAIC0yMjMyLDE4ICsyMzczLDUxIEBACiAJLm11eHNlbF9ob29rCT0ga29kaWNvbTQ0MDByX211eHNlbCwKIH0sCiB7Ci0gICAgICAgIC8qIC0tLS0gY2FyZCAweDg1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAvKiBNaWNoYWVsIEhlbnNvbiA8bWhlbnNvbkBjbGFyaXR5dmkuY29tPiAqLwotICAgICAgICAvKiBBZGxpbmsgUlRWMjQgd2l0aCBzcGVjaWFsIHVubG9jayBjb2RlcyAqLwotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQWRsaW5rIFJUVjI0IiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLQorCS8qIC0tLS0gY2FyZCAweDg2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIE1pY2hhZWwgSGVuc29uIDxtaGVuc29uQGNsYXJpdHl2aS5jb20+ICovCisJLyogQWRsaW5rIFJUVjI0IHdpdGggc3BlY2lhbCB1bmxvY2sgY29kZXMgKi8KKwkubmFtZSAgICAgICAgICAgPSAiQWRsaW5rIFJUVjI0IiwKKwkudmlkZW9faW5wdXRzICAgPSA0LAorCS5hdWRpb19pbnB1dHMgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gMCwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKK30sCit7CisJLyogLS0tLSBjYXJkIDB4ODctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbTFrLm5ldD4gKi8KKwkubmFtZSAgICAgICAgICAgPSAiRFZpQ08gRnVzaW9uSERUViA1IExpdGUiLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfVERWU19IMDYyRiwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLnZpZGVvX2lucHV0cyAgID0gMiwKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLm11eHNlbAkJPSB7IDIsIDMgfSwKKwkuZ3Bpb21hc2sgICAgICAgPSAweDAwZTAwMDA3LAorCS5hdWRpb211eCAgICAgICA9IHsgMHgwMDQwMDAwNSwgMCwgMCwgMCwgMCwgMCB9LAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAorfSx7CisJLyogLS0tLSBjYXJkIDB4ODgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGJydHVyYm8uY29tLmJyPiAqLworCS5uYW1lCQk9ICJBY29ycCBZODc4RiIsCisJLnZpZGVvX2lucHV0cwk9IDMsCisJLmF1ZGlvX2lucHV0cwk9IDEsCisJLnR1bmVyCQk9IDAsCisJLnN2aHMJCT0gMiwKKwkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwMWUwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAorCS5uZWVkc190dmF1ZGlvCT0gMSwKKwkucGxsCQk9IFBMTF8yOCwKKwkudHVuZXJfdHlwZQk9IFRVTkVSX1lNRUNfVFZGNjZUNV9CX0RGRiwKKwkudHVuZXJfYWRkcgk9IDB4YzEgPj4xLAorCS5oYXNfcmFkaW8JPSAxLAogfX07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYnR0dl9udW1fdHZjYXJkcyA9IEFSUkFZX1NJWkUoYnR0dl90dmNhcmRzKTsKQEAgLTIzNTUsMzIgKzI1MjksMzIgQEAKIAlpbnQgdHVuZXI9LTEsdHR5cGU7CiAKIAlncGlvX2lub3V0KDB4ZmZmZmZmLCAwKTsKLQl1ZGVsYXkoOCk7ICAvLyB3aXRob3V0IHRoaXMgd2Ugd291bGQgc2VlIHRoZSAweDE4MDAgbWFzaworCXVkZWxheSg4KTsgIC8qIHdpdGhvdXQgdGhpcyB3ZSB3b3VsZCBzZWUgdGhlIDB4MTgwMCBtYXNrICovCiAJZ3BpbyA9IGdwaW9fcmVhZCgpOwogCS8qIEZJWE1FOiBtdXN0IHJlc3RvcmUgT1VSX0VOID8/PyAqLwogCi0JLy8gYWxsIGNhcmRzIHByb3ZpZGUgR1BJTyBpbmZvLCBzb21lIGhhdmUgYW4gYWRkaXRpb25hbCBlZXByb20KLQkvLyBMUjUwOiBHUElPIGNvZGluZyBjYW4gYmUgZm91bmQgbG93ZXIgcmlnaHQgQ1AxIC4uIENQOQotCS8vICAgICAgIENQOT1HUElPMjMgLi4gQ1AxPUdQSU8xNTsgd2hlbiBPUEVOLCB0aGUgY29ycmVzcG9uZGluZyBHUElPIHJlYWRzIDEuCi0JLy8gICAgICAgR1BJTzE0LTEyOiBuLmMuCi0JLy8gTFI5MDogR1A5PUdQSU8yMyAuLiBHUDE9R1BJTzE1IChyaWdodCBhYm92ZSB0aGUgYnQ4NzgpCisJLyogYWxsIGNhcmRzIHByb3ZpZGUgR1BJTyBpbmZvLCBzb21lIGhhdmUgYW4gYWRkaXRpb25hbCBlZXByb20KKwkgKiBMUjUwOiBHUElPIGNvZGluZyBjYW4gYmUgZm91bmQgbG93ZXIgcmlnaHQgQ1AxIC4uIENQOQorCSAqICAgICAgIENQOT1HUElPMjMgLi4gQ1AxPUdQSU8xNTsgd2hlbiBPUEVOLCB0aGUgY29ycmVzcG9uZGluZyBHUElPIHJlYWRzIDEuCisJICogICAgICAgR1BJTzE0LTEyOiBuLmMuCisJICogTFI5MDogR1A5PUdQSU8yMyAuLiBHUDE9R1BJTzE1IChyaWdodCBhYm92ZSB0aGUgYnQ4NzgpCiAKLQkvLyBsb3dlc3QgMyBieXRlcyBhcmUgcmVtb3RlIGNvbnRyb2wgY29kZXMgKG5vIGhhbmRzaGFrZSBuZWVkZWQpCi0gICAgICAgIC8vIHh4eEZGRjogTm8gcmVtb3RlIGNvbnRyb2wgY2hpcCBzb2xkZXJlZAotICAgICAgICAvLyB4eHhGMDAoTFIyNi9MUjUwKSwgeHh4RkUwKExSOTApOiBSZW1vdGUgY29udHJvbCBjaGlwIChMVkEwMDEgb3IgQ0Y0NSkgc29sZGVyZWQKLQkvLyBOb3RlOiBTb21lIGJpdHMgYXJlIEF1ZGlvX01hc2sgIQotCisJICogbG93ZXN0IDMgYnl0ZXMgYXJlIHJlbW90ZSBjb250cm9sIGNvZGVzIChubyBoYW5kc2hha2UgbmVlZGVkKQorCSAqIHh4eEZGRjogTm8gcmVtb3RlIGNvbnRyb2wgY2hpcCBzb2xkZXJlZAorCSAqIHh4eEYwMChMUjI2L0xSNTApLCB4eHhGRTAoTFI5MCk6IFJlbW90ZSBjb250cm9sIGNoaXAgKExWQTAwMSBvciBDRjQ1KSBzb2xkZXJlZAorCSAqIE5vdGU6IFNvbWUgYml0cyBhcmUgQXVkaW9fTWFzayAhCisJICovCiAJdHR5cGU9KGdwaW8mMHgwZjAwMDApPj4xNjsKIAlzd2l0Y2godHR5cGUpIHsKLQljYXNlIDB4MDogdHVuZXI9MjsgLy8gTlRTQywgZS5nLiBUUEk4TlNSMTFQCisJY2FzZSAweDA6IHR1bmVyPTI7IC8qIE5UU0MsIGUuZy4gVFBJOE5TUjExUCAqLwogCQlicmVhazsKLSAgICAgICAgY2FzZSAweDI6IHR1bmVyPTM5Oy8vIExHIE5UU0MgKG5ld2VyIFRBUEMgc2VyaWVzKSBUQVBDLUg3MDFQCisgICAgICAgIGNhc2UgMHgyOiB0dW5lcj0zOTsvKiBMRyBOVFNDIChuZXdlciBUQVBDIHNlcmllcykgVEFQQy1INzAxUCAqLwogCQlicmVhazsKLQljYXNlIDB4NDogdHVuZXI9NTsgLy8gUGhpbGlwcyBQQUwgVFBJOFBTQjAyUCwgVFBJOFBTQjEyUCwgVFBJOFBTQjEyRCBvciBGSTEyMTYsIEZNMTIxNgorCWNhc2UgMHg0OiB0dW5lcj01OyAvKiBQaGlsaXBzIFBBTCBUUEk4UFNCMDJQLCBUUEk4UFNCMTJQLCBUUEk4UFNCMTJEIG9yIEZJMTIxNiwgRk0xMjE2ICovCiAJCWJyZWFrOwotCWNhc2UgMHg2OiB0dW5lcj0zNzsgLy8gTEcgUEFMIChuZXdlciBUQVBDIHNlcmllcykgVEFQQy1HNzAyUAorCWNhc2UgMHg2OiB0dW5lcj0zNzsvKiBMRyBQQUwgKG5ld2VyIFRBUEMgc2VyaWVzKSBUQVBDLUc3MDJQICovCiAJCWJyZWFrOwotCWNhc2UgMHhDOiB0dW5lcj0zOyAvLyBQaGlsaXBzIFNFQ0FNKCtQQUwpIEZRMTIxNk1FIG9yIEZJMTIxNk1GCisJCWNhc2UgMHhDOiB0dW5lcj0zOyAvKiBQaGlsaXBzIFNFQ0FNKCtQQUwpIEZRMTIxNk1FIG9yIEZJMTIxNk1GICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW9fZ3BpbzogdW5rbm93biB0dW5lciB0eXBlLlxuIiwgYnR2LT5jLm5yKTsKQEAgLTIzODgsMTUgKzI1NjIsMTYgQEAKIAogCWhhc19yZW1vdGUgICAgICAgICAgPSAgIGdwaW8gJiAweDgwMDAwMDsKIAloYXNfcmFkaW8JICAgID0gICBncGlvICYgMHg0MDAwMDA7Ci0JLy8gICB1bmtub3duICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwOwotCS8vICAgdW5rbm93bjIgICAgICAgICAgICAgICAgICAweDEwMDAwMDsKLSAgICAgICAgaXNfY2FwdHVyZV9vbmx5ICAgICA9ICEoZ3BpbyAmIDB4MDA4MDAwKTsgLy9HUElPMTUKKwkvKiAgIHVua25vd24gICAgICAgICAgICAgICAgICAgMHgyMDAwMDA7CisJICogICB1bmtub3duMiAgICAgICAgICAgICAgICAgIDB4MTAwMDAwOyAqLworICAgICAgICBpc19jYXB0dXJlX29ubHkgICAgID0gIShncGlvICYgMHgwMDgwMDApOyAvKiBHUElPMTUgKi8KIAloYXNfdGRhOTgyMF90ZGE5ODIxID0gIShncGlvICYgMHgwMDQwMDApOwotCWlzX2xyOTAgICAgICAgICAgICAgPSAhKGdwaW8gJiAweDAwMjAwMCk7IC8vIGVsc2UgTFIyNi9MUjUwIChMUjM4L0xSNTEgZi4gY2FwdHVyZSBvbmx5KQotICAgICAgICAvLwkJICAgICAgICBncGlvICYgMHgwMDEwMDAgLy8gb3V0cHV0IGJpdCBmb3IgYXVkaW8gcm91dGluZworCWlzX2xyOTAgICAgICAgICAgICAgPSAhKGdwaW8gJiAweDAwMjAwMCk7IC8qIGVsc2UgTFIyNi9MUjUwIChMUjM4L0xSNTEgZi4gY2FwdHVyZSBvbmx5KSAqLworCS8qCisJICogZ3BpbyAmIDB4MDAxMDAwICAgIG91dHB1dCBiaXQgZm9yIGF1ZGlvIHJvdXRpbmcgKi8KIAogCWlmKGlzX2NhcHR1cmVfb25seSkKLQkJdHVuZXI9NDsgLy8gTm8gdHVuZXIgcHJlc2VudAorCQl0dW5lcj00OyAvKiBObyB0dW5lciBwcmVzZW50ICovCiAKIAlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvIFJhZGlvPSVzIFJlbW90ZUNvbnRyb2w9JXMgVHVuZXI9JWQgZ3Bpbz0weCUwNnhcbiIsCiAJICAgICAgIGJ0di0+Yy5uciwgaGFzX3JhZGlvPyAieWVzIjoibm8gIiwgaGFzX3JlbW90ZT8gInllcyI6Im5vICIsIHR1bmVyLCBncGlvKTsKQEAgLTI0MDQsMTUgKzI1NzksMTUgQEAKIAkJYnR2LT5jLm5yLCBpc19scjkwPyJ5ZXMiOiJubyAiLCBoYXNfdGRhOTgyMF90ZGE5ODIxPyJ5ZXMiOiJubyAiLAogCQlpc19jYXB0dXJlX29ubHk/InllcyI6Im5vICIpOwogCi0JaWYodHVuZXIhPSAtMSkgLy8gb25seSBzZXQgaWYga25vd24gdHVuZXIgYXV0b2RldGVjdGVkLCBlbHNlIGxldCBpbnNtb2Qgb3B0aW9uIHRocm91Z2gKKwlpZih0dW5lciE9IC0xKSAvKiBvbmx5IHNldCBpZiBrbm93biB0dW5lciBhdXRvZGV0ZWN0ZWQsIGVsc2UgbGV0IGluc21vZCBvcHRpb24gdGhyb3VnaCAqLwogCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcjsKIAlidHYtPmhhc19yYWRpbyA9IGhhc19yYWRpbzsKIAotCS8vIExSOTAgQXVkaW8gUm91dGluZyBpcyBkb25lIGJ5IDIgaGVmNDA1Miwgc28gQXVkaW9fTWFzayBoYXMgNCBiaXRzOiAweDAwMWM4MAotICAgICAgICAvLyBMUjI2L0xSNTAgb25seSBoYXMgMSBoZWY0MDUyLCBBdWRpb19NYXNrIDB4MDAwYzAwCi0JLy8gQXVkaW8gb3B0aW9uczogZnJvbSB0dW5lciwgZnJvbSB0ZGE5ODIxL3RkYTk4MjEobW9ubyxzdGVyZW8sc2FwKSwgZnJvbSB0ZGE5ODc0LCBleHQuLCBtdXRlCisJLyogTFI5MCBBdWRpbyBSb3V0aW5nIGlzIGRvbmUgYnkgMiBoZWY0MDUyLCBzbyBBdWRpb19NYXNrIGhhcyA0IGJpdHM6IDB4MDAxYzgwCisJICogTFIyNi9MUjUwIG9ubHkgaGFzIDEgaGVmNDA1MiwgQXVkaW9fTWFzayAweDAwMGMwMAorCSAqIEF1ZGlvIG9wdGlvbnM6IGZyb20gdHVuZXIsIGZyb20gdGRhOTgyMS90ZGE5ODIxKG1vbm8sc3RlcmVvLHNhcCksIGZyb20gdGRhOTg3NCwgZXh0LiwgbXV0ZSAqLwogCWlmKGhhc190ZGE5ODIwX3RkYTk4MjEpIGJ0di0+YXVkaW9faG9vayA9IGx0OTQxNV9hdWRpbzsKLQkvL3RvZG86IGlmKGhhc190ZGE5ODc0KSBidHYtPmF1ZGlvX2hvb2sgPSBmdjIwMDBzX2F1ZGlvOworCS8qIHRvZG86IGlmKGhhc190ZGE5ODc0KSBidHYtPmF1ZGlvX2hvb2sgPSBmdjIwMDBzX2F1ZGlvOyAqLwogfQogCiBzdGF0aWMgaW50IG1pcm9fdHVuZXJtYXBbXSA9IHsgMCw2LDIsMywgICA0LDUsNiwwLCAgMywwLDQsNSwgIDUsMiwxNiwxLApAQCAtMjYzMyw2ICsyODA4LDggQEAKIHZvaWQgX19kZXZpbml0IGJ0dHZfaW5pdF9jYXJkMihzdHJ1Y3QgYnR0diAqYnR2KQogewogCWludCB0ZGE5ODg3OworCWludCBhZGRyPUFERFJfVU5TRVQ7CisKICAgICAgICAgYnR2LT50dW5lcl90eXBlID0gLTE7CiAKIAlpZiAoQlRUVl9VTktOT1dOID09IGJ0di0+Yy50eXBlKSB7CkBAIC0yNzczLDkgKzI5NTAsMTIgQEAKIAlidHYtPnBsbC5wbGxfY3VycmVudCA9IC0xOwogCiAJLyogdHVuZXIgY29uZmlndXJhdGlvbiAoZnJvbSBjYXJkIGxpc3QgLyBhdXRvZGV0ZWN0IC8gaW5zbW9kIG9wdGlvbikgKi8KLSAJaWYgKFVOU0VUICE9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfdHlwZSkKKwlpZiAoQUREUl9VTlNFVCAhPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX2FkZHIpCisJCWFkZHIgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX2FkZHI7CisKKwlpZiAoVU5TRVQgIT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl90eXBlKQogCQlpZihVTlNFVCA9PSBidHYtPnR1bmVyX3R5cGUpCi0gICAgICAgICAgICAgICAgCWJ0di0+dHVuZXJfdHlwZSA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfdHlwZTsKKyAgICAgICAgCSAgICAgICAJYnR2LT50dW5lcl90eXBlID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl90eXBlOwogCWlmIChVTlNFVCAhPSB0dW5lcltidHYtPmMubnJdKQogCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcltidHYtPmMubnJdOwogCXByaW50aygiYnR0diVkOiB1c2luZyB0dW5lcj0lZFxuIixidHYtPmMubnIsYnR2LT50dW5lcl90eXBlKTsKQEAgLTI3ODcsNyArMjk2Nyw3IEBACiAKIAkgICAgICAgIHR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX1JBRElPIHwgVF9BTkFMT0dfVFYgfCBUX0RJR0lUQUxfVFY7CiAJCXR1bl9zZXR1cC50eXBlID0gYnR2LT50dW5lcl90eXBlOwotCQl0dW5fc2V0dXAuYWRkciA9IEFERFJfVU5TRVQ7CisJCXR1bl9zZXR1cC5hZGRyID0gYWRkcjsKIAogCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LCBUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX3NldHVwKTsKIAl9CkBAIC0yODgwLDcgKzMwNjAsNyBAQAogewogCXN0cnVjdCB0dmVlcHJvbSB0djsKIAotCXR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2coJnR2LCBlZXByb21fZGF0YSk7CisJdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZygmYnR2LT5pMmNfY2xpZW50LCAmdHYsIGVlcHJvbV9kYXRhKTsKIAlidHYtPnR1bmVyX3R5cGUgPSB0di50dW5lcl90eXBlOwogCWJ0di0+aGFzX3JhZGlvICA9IHR2Lmhhc19yYWRpbzsKIH0KQEAgLTI5MDIsNyArMzA4Miw3IEBACiAJYnR2LT5tYm94X2NzZWwgICAgPSAxIDw8IDEwOwogCiAJZnJlcT04ODAwMC82Mi41OwotCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLy8gd3JpdGUgMHgxZWQ4CisJdGVhNTc1N193cml0ZShidHYsIDUgKiBmcmVxICsgMHgzNTgpOyAvKiB3cml0ZSAweDFlZDggKi8KIAlpZiAoMHgxZWQ4ID09IHRlYTU3NTdfcmVhZChidHYpKSB7CiAJCXByaW50aygiYnR0diVkOiBUZXJyYXRlYyBBY3RpdmUgUmFkaW8gVXBncmFkZSBmb3VuZC5cbiIsCiAJCSAgICAgICBidHYtPmMubnIpOwpAQCAtMzA3Myw3ICszMjUzLDcgQEAKIAkgICAgICAgY2FzZSAweDAwNjA6CiAJICAgICAgIGNhc2UgMHgwMDcwOgogCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTJ4MDsKLQkJICAgICAgIC8vZW5hYmxlIG91dHB1dCBvbiBzZWxlY3QgY29udHJvbCBsaW5lcworCQkgICAgICAgLyogZW5hYmxlIG91dHB1dCBvbiBzZWxlY3QgY29udHJvbCBsaW5lcyAqLwogCQkgICAgICAgZ3Bpb19pbm91dCgweGZmZmZmZiwweDAwMDMwMyk7CiAJCSAgICAgICBicmVhazsKIAkgICAgICAgZGVmYXVsdDoKQEAgLTMxMDUsNyArMzI4NSw3IEBACiAgICAgICAgIFRVTkVSX1RFTUlDX05UU0MsICBUVU5FUl9URU1JQ19QQUwsCiAJVFVORVJfVEVNSUNfUEFMLCAgIFRVTkVSX1RFTUlDX1BBTCwKIAlUVU5FUl9URU1JQ19QQUwsICAgVFVORVJfVEVNSUNfUEFMLAotICAgICAgICBUVU5FUl9URU1JQ180MDEyRlk1LCBUVU5FUl9URU1JQ180MDEyRlk1LCAvL1RVTkVSX1RFTUlDX1NFQ0FNCisgICAgICAgIFRVTkVSX1RFTUlDXzQwMTJGWTUsIFRVTkVSX1RFTUlDXzQwMTJGWTUsIC8qIFRVTkVSX1RFTUlDX1NFQ0FNICovCiAgICAgICAgIFRVTkVSX1RFTUlDXzQwMTJGWTUsIFRVTkVSX1RFTUlDX1BBTH07CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhdmVybWVkaWFfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCkBAIC0zMTI2LDcgKzMzMDYsNyBAQAogCiAJaWYgKHR1bmVyX21ha2UgPT0gNCkKIAkJaWYodHVuZXJfZm9ybWF0ID09IDB4MDkpCi0JCQl0dW5lciA9IFRVTkVSX0xHX05UU0NfTkVXX1RBUEM7IC8vIFRBUEMtRzcwMlAKKwkJCXR1bmVyID0gVFVORVJfTEdfTlRTQ19ORVdfVEFQQzsgLyogVEFQQy1HNzAyUCAqLwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBBdmVybWVkaWEgZWVwcm9tWzB4JTAyeCUwMnhdOiB0dW5lcj0iLAogCQlidHYtPmMubnIsZWVwcm9tX2RhdGFbMHg0MV0sZWVwcm9tX2RhdGFbMHg0Ml0pOwpAQCAtMzE0Myw3ICszMzIzLDcgQEAKIC8qIHVzZWQgb24gVm9vZG9vIFRWL0ZNIChWb29kb28gMjAwKSwgUzAgd2lyZWQgdG8gMHgxMDAwMCAqLwogdm9pZCBidHR2X3RkYTk4ODBfc2V0bm9ybShzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgbm9ybSkKIHsKLQkvLyBmaXggdXAgb3VyIGNhcmQgZW50cnkKKwkvKiBmaXggdXAgb3VyIGNhcmQgZW50cnkgKi8KIAlpZihub3JtPT1WSURFT19NT0RFX05UU0MpIHsKIAkJYnR0dl90dmNhcmRzW0JUVFZfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzBdPTB4OTU3ZmZmOwogCQlidHR2X3R2Y2FyZHNbQlRUVl9WT09ET09UVl9GTV0uYXVkaW9tdXhbNF09MHg5NTdmZmY7CkBAIC0zMTU0LDcgKzMzMzQsNyBAQAogICAgICAgICAgICAgICAgIGJ0dHZfdHZjYXJkc1tCVFRWX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFs0XT0weDk0N2ZmZjsKIAkJZHByaW50aygiYnR0dl90ZGE5ODgwX3NldG5vcm0gdG8gUEFMXG4iKTsKIAl9Ci0JLy8gc2V0IEdQSU8gYWNjb3JkaW5nCisJLyogc2V0IEdQSU8gYWNjb3JkaW5nICovCiAJZ3Bpb19iaXRzKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2ssCiAJCSAgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb211eFtidHYtPmF1ZGlvXSk7CiB9CkBAIC0zNDQ3LDcgKzM2MjcsNyBAQAogCXVkZWxheSgxMCk7CiAJdGltZW91dD0gamlmZmllcyArIEhaOwogCi0JLy8gd2FpdCBmb3IgREFUQSBsaW5lIHRvIGdvIGxvdzsgZXJyb3IgaWYgaXQgZG9lc24ndAorCS8qIHdhaXQgZm9yIERBVEEgbGluZSB0byBnbyBsb3c7IGVycm9yIGlmIGl0IGRvZXNuJ3QgKi8KIAl3aGlsZSAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCiAJCXNjaGVkdWxlKCk7CiAJaWYgKGJ1c19pbihidHYsYnR2LT5tYm94X2RhdGEpKSB7CkBAIC0zNTc0LDggKzM3NTQsOCBAQAogCQkJY29uID0gMHgzMDA7CiAJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQogCQkJY29uID0gMHgyMDA7Ci0vLwkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQotLy8JCQljb24gPSAweDEwMDsKKy8qCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCisgKgkJCWNvbiA9IDB4MTAwOyAqLwogCQlncGlvX2JpdHMoMHgzMDAsIGNvbik7CiAJfSBlbHNlIHsKIAkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX1NURVJFTyB8CkBAIC0zNzE4LDcgKzM4OTgsNyBAQAogICAgICAgICB9CiB9CiAKLS8vIFREQTk4MjEgb24gVGVycmFUVisgQnQ4NDgsIEJ0ODc4CisvKiBUREE5ODIxIG9uIFRlcnJhVFYrIEJ0ODQ4LCBCdDg3OCAqLwogc3RhdGljIHZvaWQKIHRlcnJhdHZfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQogewpAQCAtMzgxOCw3ICszOTk4LDcgQEAKIAkJfQogCQlpZiAoKHYtPm1vZGUgJiAoVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMikpCiAJCSAgICB8fCAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykpIHsKLQkJCXZhbCA9IDB4MTA4MDsgLy8tZGstPz8/OiAweDA4ODAsIDB4MDA4MCwgMHgxODAwIC4uLgorCQkJdmFsID0gMHgxMDgwOyAvKi1kay0/Pz86IDB4MDg4MCwgMHgwMDgwLCAweDE4MDAgLi4uICovCiAJCX0KIAkJaWYgKHZhbCAhPSAweGZmZmYpIHsKIAkJCWdwaW9fYml0cygweDE4MDAsIHZhbCk7CkBAIC0zODY5LDEwICs0MDQ5LDEwIEBACiB7CiAJdW5zaWduZWQgaW50IGNvbiA9IDB4ZmZmZmZmOwogCi0JLy9idGFvcigweDFlMDAwMCwgfjB4MWUwMDAwLCBCVDg0OF9HUElPX09VVF9FTik7CisJLyogYnRhb3IoMHgxZTAwMDAsIH4weDFlMDAwMCwgQlQ4NDhfR1BJT19PVVRfRU4pOyAqLwogCiAJaWYgKHNldCkgewotCQkvL2J0b3IoKioqLCBCVDg0OF9HUElPX09VVF9FTik7CisJCS8qIGJ0b3IoKioqLCBCVDg0OF9HUElPX09VVF9FTik7ICovCiAJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCiAJCQljb24gPSAweDAwMDAwMDAwOwogCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQpAQCAtNDA3OSwxNCArNDI1OSwxNCBAQAogCW1hc3RlcltidHYtPmMubnIrMl0gPSBidHY7CiB9CiAKLS8vIFRoZSBHcmFuZHRlYyBYLUd1YXJkIGZyYW1lZ3JhYmJlciBjYXJkIHVzZXMgdHdvIER1YWwgNC1jaGFubmVsCi0vLyB2aWRlbyBtdWx0aXBsZXhlcnMgdG8gcHJvdmlkZSB1cCB0byAxNiB2aWRlbyBpbnB1dHMuIFRoZXNlCi0vLyBtdWx0aXBsZXhlcnMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIGxvd2VyIDggR1BJTyBwaW5zIG9mIHRoZQotLy8gYnQ4NzguIFRoZSBtdWx0aXBsZXhlcnMgcHJvYmFibHkgUGVyaWNvbSBQSTVWMzMxUSBvciBzaW1pbGFyLgorLyogVGhlIEdyYW5kdGVjIFgtR3VhcmQgZnJhbWVncmFiYmVyIGNhcmQgdXNlcyB0d28gRHVhbCA0LWNoYW5uZWwKKyAqIHZpZGVvIG11bHRpcGxleGVycyB0byBwcm92aWRlIHVwIHRvIDE2IHZpZGVvIGlucHV0cy4gVGhlc2UKKyAqIG11bHRpcGxleGVycyBhcmUgY29udHJvbGxlZCBieSB0aGUgbG93ZXIgOCBHUElPIHBpbnMgb2YgdGhlCisgKiBidDg3OC4gVGhlIG11bHRpcGxleGVycyBwcm9iYWJseSBQZXJpY29tIFBJNVYzMzFRIG9yIHNpbWlsYXIuCiAKLS8vIHh4eDAgaXMgcGluIHh4eCBvZiBtdWx0aXBsZXhlciBVNSwKLS8vIHl5eTEgaXMgcGluIHl5eSBvZiBtdWx0aXBsZXhlciBVMgotCisgKiB4eHgwIGlzIHBpbiB4eHggb2YgbXVsdGlwbGV4ZXIgVTUsCisgKiB5eXkxIGlzIHBpbiB5eXkgb2YgbXVsdGlwbGV4ZXIgVTIKKyAqLwogI2RlZmluZSBFTkEwICAgIDB4MDEKICNkZWZpbmUgRU5CMCAgICAweDAyCiAjZGVmaW5lIEVOQTEgICAgMHgwNApAQCAtNDE1NywxNCArNDMzNywxNCBAQAogCiBzdGF0aWMgdm9pZCBpdmMxMjBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKIHsKLQkvLyBTaW1wbGUgbWF0aHMKKwkvKiBTaW1wbGUgbWF0aHMgKi8KIAlpbnQga2V5ID0gaW5wdXQgJSA0OwogCWludCBtYXRyaXggPSBpbnB1dCAvIDQ7CiAKIAlkcHJpbnRrKCJidHR2JWQ6IGl2YzEyMF9tdXhzZWw6IElucHV0IC0gJTAyZCB8IFREQSAtICUwMmQgfCBJbiAtICUwMmRcbiIsCiAJCWJ0di0+Yy5uciwgaW5wdXQsIG1hdHJpeCwga2V5KTsKIAotCS8vIEhhbmRsZXMgdGhlIGlucHV0IHNlbGVjdGlvbiBvbiB0aGUgVERBODU0MCdzCisJLyogSGFuZGxlcyB0aGUgaW5wdXQgc2VsZWN0aW9uIG9uIHRoZSBUREE4NTQwJ3MgKi8KIAlidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUMywgMHgwMCwKIAkJICAgICAgKChtYXRyaXggPT0gMykgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwogCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ0LCAweDAwLApAQCAtNDE3NCwxNyArNDM1NCwxNyBAQAogCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ2LCAweDAwLAogCQkgICAgICAoKG1hdHJpeCA9PSAyKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CiAKLQkvLyBIYW5kbGVzIHRoZSBvdXRwdXQgZW5hYmxlcyBvbiB0aGUgVERBODU0MCdzCisJLyogSGFuZGxlcyB0aGUgb3V0cHV0IGVuYWJsZXMgb24gdGhlIFREQTg1NDAncyAqLwogCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQzLCAweDAyLAotCQkgICAgICAoKG1hdHJpeCA9PSAzKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvLyAxMyAtIDE2CisJCSAgICAgICgobWF0cml4ID09IDMpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8qIDEzIC0gMTYgKi8KIAlidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNCwgMHgwMiwKLQkJICAgICAgKChtYXRyaXggPT0gMCkgPyAweDAzIDogMHgwMCksIDEpOyAgLy8gMS00CisJCSAgICAgICgobWF0cml4ID09IDApID8gMHgwMyA6IDB4MDApLCAxKTsgIC8qIDEtNCAqLwogCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ1LCAweDAyLAotCQkgICAgICAoKG1hdHJpeCA9PSAxKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvLyA1LTgKKwkJICAgICAgKChtYXRyaXggPT0gMSkgPyAweDAzIDogMHgwMCksIDEpOyAgLyogNS04ICovCiAJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDYsIDB4MDIsCi0JCSAgICAgICgobWF0cml4ID09IDIpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8vIDktMTIKKwkJICAgICAgKChtYXRyaXggPT0gMikgPyAweDAzIDogMHgwMCksIDEpOyAgLyogOS0xMiAqLwogCi0JLy8gU2VsZWN0cyBNVVgwIGZvciBpbnB1dCBvbiB0aGUgODc4CisJLyogU2VsZWN0cyBNVVgwIGZvciBpbnB1dCBvbiB0aGUgODc4ICovCiAJYnRhb3IoKDApPDw1LCB+KDM8PDUpLCBCVDg0OF9JRk9STSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1kcml2ZXIuYwppbmRleCBlZWU5MzIyLi5hNTY0MzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWRyaXZlci5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAgICAkSWQ6IGJ0dHYtZHJpdmVyLmMsdiAxLjUyIDIwMDUvMDgvMDQgMDA6NTU6MTYgbWNoZWhhYiBFeHAgJAogCiAgICAgYnR0diAtIEJ0ODQ4IGZyYW1lIGdyYWJiZXIgZHJpdmVyCiAKQEAgLTQyLDYgKzQxLDkgQEAKIAogI2luY2x1ZGUgImJ0dHZwLmgiCiAKKyNpbmNsdWRlICJyZHMuaCIKKworCiB1bnNpZ25lZCBpbnQgYnR0dl9udW07CQkJLyogbnVtYmVyIG9mIEJ0ODQ4cyBpbiB1c2UgKi8KIHN0cnVjdCBidHR2IGJ0dHZzW0JUVFZfTUFYXTsKIApAQCAtMzEyOCwxNSArMzEzMCwxMiBAQAogCiAJZHByaW50aygiYnR0diVkOiBvcGVuIGNhbGxlZCAocmFkaW8pXG4iLGJ0di0+Yy5ucik7CiAJZG93bigmYnR2LT5sb2NrKTsKLQlpZiAoYnR2LT5yYWRpb191c2VyKSB7Ci0JCXVwKCZidHYtPmxvY2spOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KKwogCWJ0di0+cmFkaW9fdXNlcisrOworCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYnR2OwogCi0JaTJjX3ZpZGlvY3NjaGFuKGJ0dik7Ci0gICAgICAgIGJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsQVVEQ19TRVRfUkFESU8sJmJ0di0+dHVuZXJfdHlwZSk7CisJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixBVURDX1NFVF9SQURJTywmYnR2LT50dW5lcl90eXBlKTsKIAlhdWRpb19tdXgoYnR2LEFVRElPX1JBRElPKTsKIAogCXVwKCZidHYtPmxvY2spOwpAQCAtMzE0NSw5ICszMTQ0LDEzIEBACiAKIHN0YXRpYyBpbnQgcmFkaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgYnR0diAgICAqYnR2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBidHR2ICAgICAgICAqYnR2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCByZHNfY29tbWFuZCBjbWQ7CiAKIAlidHYtPnJhZGlvX3VzZXItLTsKKworCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIFJEU19DTURfQ0xPU0UsICZjbWQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMyMDMsMTMgKzMyMDYsNDIgQEAKIAlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCByYWRpb19kb19pb2N0bCk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHJhZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBidHR2ICAgICpidHYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHJkc19jb21tYW5kIGNtZDsKKwljbWQuYmxvY2tfY291bnQgPSBjb3VudC8zOworCWNtZC5idWZmZXIgPSBkYXRhOworCWNtZC5pbnN0YW5jZSA9IGZpbGU7CisJY21kLnJlc3VsdCA9IC1FTk9ERVY7CisKKwlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LCBSRFNfQ01EX1JFQUQsICZjbWQpOworCisJcmV0dXJuIGNtZC5yZXN1bHQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmFkaW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgYnR0diAgICAqYnR2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCByZHNfY29tbWFuZCBjbWQ7CisJY21kLmluc3RhbmNlID0gZmlsZTsKKwljbWQuZXZlbnRfbGlzdCA9IHdhaXQ7CisJY21kLnJlc3VsdCA9IC1FTk9ERVY7CisJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgUkRTX0NNRF9QT0xMLCAmY21kKTsKKworCXJldHVybiBjbWQucmVzdWx0OworfQorCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYWRpb19mb3BzID0KIHsKIAkub3duZXIJICA9IFRISVNfTU9EVUxFLAogCS5vcGVuCSAgPSByYWRpb19vcGVuLAorCS5yZWFkICAgICA9IHJhZGlvX3JlYWQsCiAJLnJlbGVhc2UgID0gcmFkaW9fcmVsZWFzZSwKIAkuaW9jdGwJICA9IHJhZGlvX2lvY3RsLAogCS5sbHNlZWsJICA9IG5vX2xsc2VlaywKKwkucG9sbCAgICAgPSByYWRpb19wb2xsLAogfTsKIAogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgcmFkaW9fdGVtcGxhdGUgPQpAQCAtNDA0Nyw3ICs0MDc5LDcgQEAKIAlzdHJ1Y3QgYnR0dl9idWZmZXJfc2V0IGlkbGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRwcmludGsoImJ0dHYlZDogc3VzcGVuZCAlZFxuIiwgYnR2LT5jLm5yLCBzdGF0ZSk7CisJZHByaW50aygiYnR0diVkOiBzdXNwZW5kICVkXG4iLCBidHYtPmMubnIsIHN0YXRlLmV2ZW50KTsKIAogCS8qIHN0b3AgZG1hICsgaXJxcyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZidHYtPnNfbG9jayxmbGFncyk7CkBAIC00MDgwLDE1ICs0MTEyLDI5IEBACiB7CiAgICAgICAgIHN0cnVjdCBidHR2ICpidHYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOwogCiAJZHByaW50aygiYnR0diVkOiByZXN1bWVcbiIsIGJ0di0+Yy5ucik7CiAKIAkvKiByZXN0b3JlIHBjaSBzdGF0ZSAqLwogCWlmIChidHYtPnN0YXRlLmRpc2FibGVkKSB7Ci0JCXBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOworCQllcnI9cGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogQ2FuJ3QgZW5hYmxlIGRldmljZS5cbiIsCisJCQkJCQkJCWJ0di0+Yy5ucik7CisJCQlyZXR1cm4gZXJyOworCQl9CiAJCWJ0di0+c3RhdGUuZGlzYWJsZWQgPSAwOwogCX0KLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisJZXJyPXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKwlpZiAoZXJyKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiBDYW4ndCBlbmFibGUgZGV2aWNlLlxuIiwKKwkJCQkJCQlidHYtPmMubnIpOworCQlidHYtPnN0YXRlLmRpc2FibGVkID0gMTsKKwkJcmV0dXJuIGVycjsKKwl9CisKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKIAogCS8qIHJlc3RvcmUgYnQ4Nzggc3RhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1ncGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZ3Bpby5jCmluZGV4IDc3MzIwY2QuLjZiMjgwYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1ncGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWdwaW8uYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gICAgJElkOiBidHR2LWdwaW8uYyx2IDEuNyAyMDA1LzAyLzE2IDEyOjE0OjEwIGtyYXhlbCBFeHAgJAogCiAgICAgYnR0di1ncGlvLmMgIC0tICBncGlvIHN1YiBkcml2ZXJzCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pMmMuYwppbmRleCAyMzRhODU1Li5lNjg0ZGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWkyYy5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAgICAkSWQ6IGJ0dHYtaTJjLmMsdiAxLjI1IDIwMDUvMDcvMDUgMTc6Mzc6MzUgbnNoIEV4cCAkCiAKICAgICBidHR2LWkyYy5jICAtLSAgYWxsIHRoZSBpMmMgY29kZSBpcyBoZXJlCiAKQEAgLTEwOSw3ICsxMDgsNyBAQAogI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKIAkuY2xhc3MgICAgICAgICAgICAgPSBJMkNfQ0xBU1NfVFZfQU5BTE9HLAogI2VuZGlmCi0JSTJDX0RFVk5BTUUoImJ0ODQ4IiksCisJLm5hbWUgICAgICAgICAgICAgID0gImJ0ODQ4IiwKIAkuaWQgICAgICAgICAgICAgICAgPSBJMkNfSFdfQl9CVDg0OCwKIAkuY2xpZW50X3JlZ2lzdGVyICAgPSBhdHRhY2hfaW5mb3JtLAogfTsKQEAgLTI3MCw4ICsyNjksNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gYnR0dl9hbGdvID0gewotCS5uYW1lICAgICAgICAgID0gImJ0ODc4IiwKLQkuaWQgICAgICAgICAgICA9IEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0JUODQ4IC8qIEZJWE1FICovLAogCS5tYXN0ZXJfeGZlciAgID0gYnR0dl9pMmNfeGZlciwKIAkuYWxnb19jb250cm9sICA9IGFsZ29fY29udHJvbCwKIAkuZnVuY3Rpb25hbGl0eSA9IGZ1bmN0aW9uYWxpdHksCkBAIC0yODIsOCArMjc5LDggQEAKICNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCiAJLmNsYXNzICAgICAgICAgPSBJMkNfQ0xBU1NfVFZfQU5BTE9HLAogI2VuZGlmCi0JSTJDX0RFVk5BTUUoImJ0ODc4IiksCi0JLmlkICAgICAgICAgICAgPSBJMkNfQUxHT19CSVQgfCBJMkNfSFdfQl9CVDg0OCAvKiBGSVhNRSAqLywKKwkubmFtZSAgICAgICAgICA9ICJidDg3OCIsCisJLmlkICAgICAgICAgICAgPSBJMkNfSFdfQl9CVDg0OCAvKiBGSVhNRSAqLywKIAkuYWxnbyAgICAgICAgICA9ICZidHR2X2FsZ28sCiAJLmNsaWVudF9yZWdpc3RlciA9IGF0dGFjaF9pbmZvcm0sCiB9OwpAQCAtMjk4LDcgKzI5NSw3IEBACiAJaWYgKGJ0dHZfZGVidWcpCiAJCXByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6ICVzIGkyYyBhdHRhY2ggW2FkZHI9MHgleCxjbGllbnQ9JXNdXG4iLAogCQkJYnR2LT5jLm5yLGNsaWVudC0+ZHJpdmVyLT5uYW1lLGNsaWVudC0+YWRkciwKLQkJCWkyY19jbGllbnRuYW1lKGNsaWVudCkpOworCQkJY2xpZW50LT5uYW1lKTsKIAlpZiAoIWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKQogCQlyZXR1cm4gMDsKIApAQCAtMzI2LDcgKzMyMyw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBidHR2X2kyY19jbGllbnRfdGVtcGxhdGUgPSB7Ci0JSTJDX0RFVk5BTUUoImJ0dHYgaW50ZXJuYWwiKSwKKwkubmFtZQk9ICJidHR2IGludGVybmFsIiwKIH07CiAKIApAQCAtMzgzLDYgKzM4MCw3IEBACiB9CiAKIHN0YXRpYyBjaGFyICppMmNfZGV2c1sxMjhdID0geworCVsgMHgxYyA+PiAxIF0gPSAibGdkdDMzMHgiLAogCVsgMHgzMCA+PiAxIF0gPSAiSVIgKGhhdXBwYXVnZSkiLAogCVsgMHg4MCA+PiAxIF0gPSAibXNwMzR4eCIsCiAJWyAweDg2ID4+IDEgXSA9ICJ0ZGE5ODg3IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pZi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWlmLmMKaW5kZXggZjdiNTU0My4uZThhYWRhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWlmLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWlmLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICAgICRJZDogYnR0di1pZi5jLHYgMS40IDIwMDQvMTEvMTcgMTg6NDc6NDcga3JheGVsIEV4cCAkCiAKICAgICBidHR2LWlmLmMgIC0tICBvbGQgZ3BpbyBpbnRlcmZhY2UgdG8gb3RoZXIga2VybmVsIG1vZHVsZXMKICAgICAgICAgICAgICAgICAgICBkb24ndCB1c2UgaW4gbmV3IGNvZGUsIHdpbGwgZ28gYXdheSBpbiAyLjcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1yaXNjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtcmlzYy5jCmluZGV4IDllZDIxZmQuLmE1ZWQ5OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1yaXNjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LXJpc2MuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gICAgJElkOiBidHR2LXJpc2MuYyx2IDEuMTAgMjAwNC8xMS8xOSAxODowNzoxMiBrcmF4ZWwgRXhwICQKIAogICAgIGJ0dHYtcmlzYy5jICAtLSAgaW50ZXJmYWNlcyB0byBvdGhlciBrZXJuZWwgbW9kdWxlcwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtdmJpLmMKaW5kZXggMDZmM2U2Mi4uZjRmNThjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di12YmkuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gICAgJElkOiBidHR2LXZiaS5jLHYgMS45IDIwMDUvMDEvMTMgMTc6MjI6MzMga3JheGVsIEV4cCAkCiAKICAgICBidHR2IC0gQnQ4NDggZnJhbWUgZ3JhYmJlciBkcml2ZXIKICAgICB2YmkgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di5oCmluZGV4IGYyYWY5ZTEuLmQyNTRlOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogYnR0di5oLHYgMS4yMiAyMDA1LzA3LzI4IDE4OjQxOjIxIG1jaGVoYWIgRXhwICQKICAqCiAgKiAgYnR0diAtIEJ0ODQ4IGZyYW1lIGdyYWJiZXIgZHJpdmVyCiAgKgpAQCAtMjE4LDYgKzIxNyw4IEBACiAjZGVmaW5lIFBMTF8zNSAgIDIKIAogCXVuc2lnbmVkIGludCB0dW5lcl90eXBlOworCXVuc2lnbmVkIGludCB0dW5lcl9hZGRyOworCiAJdW5zaWduZWQgaW50IGhhc19yYWRpbzsKIAl2b2lkICgqYXVkaW9faG9vaykoc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKIAl2b2lkICgqbXV4c2VsX2hvb2spKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHZwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHZwLmgKaW5kZXggYWFiMDk0Yi4uOWIwYjdjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2cC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0dnAuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gICAgJElkOiBidHR2cC5oLHYgMS4yMSAyMDA1LzA3LzE1IDIxOjQ0OjE0IG1jaGVoYWIgRXhwICQKIAogICAgIGJ0dHYgLSBCdDg0OCBmcmFtZSBncmFiYmVyIGRyaXZlcgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfdXNiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfdXNiLmMKaW5kZXggY2RkYTQyMy4uOTc3NGU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3VzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV91c2IuYwpAQCAtNDQ1LDEwICs0NDUsOCBAQAogCQl1Y3BpYS0+c2J1ZlsxXS51cmIgPSBOVUxMOwogCX0KIAotCWlmICh1Y3BpYS0+c2J1ZlsxXS5kYXRhKSB7Ci0JCWtmcmVlKHVjcGlhLT5zYnVmWzFdLmRhdGEpOwotCQl1Y3BpYS0+c2J1ZlsxXS5kYXRhID0gTlVMTDsKLQl9CisJa2ZyZWUodWNwaWEtPnNidWZbMV0uZGF0YSk7CisJdWNwaWEtPnNidWZbMV0uZGF0YSA9IE5VTEw7CiAgCiAJaWYgKHVjcGlhLT5zYnVmWzBdLnVyYikgewogCQl1c2Jfa2lsbF91cmIodWNwaWEtPnNidWZbMF0udXJiKTsKQEAgLTQ1NiwxMCArNDU0LDggQEAKIAkJdWNwaWEtPnNidWZbMF0udXJiID0gTlVMTDsKIAl9CiAKLQlpZiAodWNwaWEtPnNidWZbMF0uZGF0YSkgewotCQlrZnJlZSh1Y3BpYS0+c2J1ZlswXS5kYXRhKTsKLQkJdWNwaWEtPnNidWZbMF0uZGF0YSA9IE5VTEw7Ci0JfQorCWtmcmVlKHVjcGlhLT5zYnVmWzBdLmRhdGEpOworCXVjcGlhLT5zYnVmWzBdLmRhdGEgPSBOVUxMOwogfQogCiBzdGF0aWMgaW50IGNwaWFfdXNiX2Nsb3NlKHZvaWQgKnByaXZkYXRhKQpAQCAtNjIzLDIwICs2MTksMTQgQEAKIAogCXVjcGlhLT5jdXJidWZmID0gdWNwaWEtPndvcmtidWZmID0gTlVMTDsKIAotCWlmICh1Y3BpYS0+YnVmZmVyc1syXSkgewotCQl2ZnJlZSh1Y3BpYS0+YnVmZmVyc1syXSk7Ci0JCXVjcGlhLT5idWZmZXJzWzJdID0gTlVMTDsKLQl9CisJdmZyZWUodWNwaWEtPmJ1ZmZlcnNbMl0pOworCXVjcGlhLT5idWZmZXJzWzJdID0gTlVMTDsKIAotCWlmICh1Y3BpYS0+YnVmZmVyc1sxXSkgewotCQl2ZnJlZSh1Y3BpYS0+YnVmZmVyc1sxXSk7Ci0JCXVjcGlhLT5idWZmZXJzWzFdID0gTlVMTDsKLQl9CisJdmZyZWUodWNwaWEtPmJ1ZmZlcnNbMV0pOworCXVjcGlhLT5idWZmZXJzWzFdID0gTlVMTDsKIAotCWlmICh1Y3BpYS0+YnVmZmVyc1swXSkgewotCQl2ZnJlZSh1Y3BpYS0+YnVmZmVyc1swXSk7Ci0JCXVjcGlhLT5idWZmZXJzWzBdID0gTlVMTDsKLQl9CisJdmZyZWUodWNwaWEtPmJ1ZmZlcnNbMF0pOworCXVjcGlhLT5idWZmZXJzWzBdID0gTlVMTDsKIAogCWNhbS0+bG93bGV2ZWxfZGF0YSA9IE5VTEw7CiAJa2ZyZWUodWNwaWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwppbmRleCA0ZjM5Njg4Li4wYzBjNTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtYmxhY2tiaXJkLmMsdiAxLjI3IDIwMDUvMDYvMDMgMTM6MzE6NTAgbWNoZWhhYiBFeHAgJAogICoKICAqICBTdXBwb3J0IGZvciBhIGN4MjM0MTYgbXBlZyBlbmNvZGVyIHZpYSBjeDIzODh4IGhvc3QgcG9ydC4KICAqICAiYmxhY2tiaXJkIiByZWZlcmVuY2UgZGVzaWduLgpAQCAtNjIsNyArNjEsNiBAQAogI2RlZmluZSBJVlRWX0NNRF9IV19CTE9DS1NfUlNUIDB4RkZGRkZGRkYKIAogLyogRmlybXdhcmUgQVBJIGNvbW1hbmRzICovCi0vKiAjZGVmaW5lIElWVFZfQVBJX1NURF9USU1FT1VUIDB4MDAwMTAwMDAgLy8gNjU1MzYsIHVuaXRzPz8gKi8KICNkZWZpbmUgSVZUVl9BUElfU1REX1RJTUVPVVQgNTAwCiAKICNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9QSU5HICAgICAgICAgICAgICAgMHg4MApAQCAtNjk2LDcgKzY5NCw2IEBACiAKIAkvKiBhc3NpZ24gc3RyZWFtIHR5cGUgKi8KIAlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX1NUUkVBTV9UWVBFLCAxLCAwLCBCTEFDS0JJUkRfU1RSRUFNX1BST0dSQU0pOwotCS8qIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfU1RSRUFNX1RZUEUsIDEsIDAsIEJMQUNLQklSRF9TVFJFQU1fVFJBTlNQT1JUKTsgKi8KIAogCS8qIGFzc2lnbiBvdXRwdXQgcG9ydCAqLwogCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfT1VUUFVUX1BPUlQsIDEsIDAsIEJMQUNLQklSRF9PVVRQVVRfUE9SVF9TVFJFQU1JTkcpOyAvKiBIb3N0ICovCkBAIC04MjQsNyArODIxLDggQEAKIAkJCUJMQUNLQklSRF9DVVNUT01fRVhURU5TSU9OX1VTUl9EQVRBLAogCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CiAKLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfSU5JVF9WSURFT19JTlBVVCwgMCwgMCk7IC8qIGluaXRpYWxpemUgdGhlIHZpZGVvIGlucHV0ICovCisJLyogaW5pdGlhbGl6ZSB0aGUgdmlkZW8gaW5wdXQgKi8KKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfSU5JVF9WSURFT19JTlBVVCwgMCwgMCk7CiAKIAltc2xlZXAoMSk7CiAKQEAgLTgzMywxMSArODMxLDEyIEBACiAJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX01VVEVfQVVESU8sIDEsIDAsIEJMQUNLQklSRF9VTk1VVEUpOwogCW1zbGVlcCgxKTsKIAotCS8qIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9CRUdJTl9DQVBUVVJFLCAyLCAwLCAwLCAweDEzKTsgLy8gc3RhcnQgY2FwdHVyaW5nIHRvIHRoZSBob3N0IGludGVyZmFjZSAqLworCS8qIHN0YXJ0IGNhcHR1cmluZyB0byB0aGUgaG9zdCBpbnRlcmZhY2UgKi8KKwkvKiBibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfQkVHSU5fQ0FQVFVSRSwgMiwgMCwgMCwgMHgxMyk7ICovCiAJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX0JFR0lOX0NBUFRVUkUsIDIsIDAsCiAJCQlCTEFDS0JJUkRfTVBFR19DQVBUVVJFLAogCQkJQkxBQ0tCSVJEX1JBV19CSVRTX05PTkUKLQkJKTsgLyogc3RhcnQgY2FwdHVyaW5nIHRvIHRoZSBob3N0IGludGVyZmFjZSAqLworCQkpOwogCW1zbGVlcCgxMCk7CiAKIAlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfUkVGUkVTSF9JTlBVVCwgMCwwKTsKQEAgLTg1MSw4ICs4NTAsOCBAQAogewogCXN0cnVjdCBjeDg4MDJfZmggKmZoID0gcS0+cHJpdl9kYXRhOwogCi0JZmgtPmRldi0+dHNfcGFja2V0X3NpemUgID0gNTEyOwotCWZoLT5kZXYtPnRzX3BhY2tldF9jb3VudCA9IDEwMDsKKwlmaC0+ZGV2LT50c19wYWNrZXRfc2l6ZSAgPSAxODggKiA0OyAvKiB3YXM6IDUxMiAqLworCWZoLT5kZXYtPnRzX3BhY2tldF9jb3VudCA9IDMyOyAvKiB3YXM6IDEwMCAqLwogCiAJKnNpemUgPSBmaC0+ZGV2LT50c19wYWNrZXRfc2l6ZSAqIGZoLT5kZXYtPnRzX3BhY2tldF9jb3VudDsKIAlpZiAoMCA9PSAqY291bnQpCkBAIC05MDAsMTIgKzg5OSwzNiBAQAogewogCXN0cnVjdCBjeDg4MDJfZmggICpmaCAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IGN4ODhfY29yZSAgKmNvcmUgPSBkZXYtPmNvcmU7CiAKIAlpZiAoZGVidWcgPiAxKQotCQljeDg4X3ByaW50X2lvY3RsKGRldi0+Y29yZS0+bmFtZSxjbWQpOworCQljeDg4X3ByaW50X2lvY3RsKGNvcmUtPm5hbWUsY21kKTsKIAogCXN3aXRjaCAoY21kKSB7CiAKKwkvKiAtLS0gY2FwYWJpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX1FVRVJZQ0FQOgorCXsKKwkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwID0gYXJnOworCisJCW1lbXNldChjYXAsMCxzaXplb2YoKmNhcCkpOworCQlzdHJjcHkoY2FwLT5kcml2ZXIsICJjeDg4X2JsYWNrYmlyZCIpOworCQlzdHJsY3B5KGNhcC0+Y2FyZCwgY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLm5hbWUsc2l6ZW9mKGNhcC0+Y2FyZCkpOworCQlzcHJpbnRmKGNhcC0+YnVzX2luZm8sIlBDSTolcyIscGNpX25hbWUoZGV2LT5wY2kpKTsKKwkJY2FwLT52ZXJzaW9uID0gQ1g4OF9WRVJTSU9OX0NPREU7CisJCWNhcC0+Y2FwYWJpbGl0aWVzID0KKwkJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAorCQkJVjRMMl9DQVBfUkVBRFdSSVRFICAgICB8CisJCQlWNEwyX0NBUF9TVFJFQU1JTkcgICAgIHwKKwkJCVY0TDJfQ0FQX1ZCSV9DQVBUVVJFICAgfAorCQkJVjRMMl9DQVBfVklERU9fT1ZFUkxBWSB8CisJCQkwOworCQlpZiAoVU5TRVQgIT0gY29yZS0+dHVuZXJfdHlwZSkKKwkJCWNhcC0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfQ0FQX1RVTkVSOworCisJCXJldHVybiAwOworCX0KKwogCS8qIC0tLSBjYXB0dXJlIGlvY3RscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJY2FzZSBWSURJT0NfRU5VTV9GTVQ6CiAJewpAQCAtOTM1LDcgKzk1OCwxMSBAQAogCQlmLT5mbXQucGl4LndpZHRoICAgICAgICA9IGRldi0+d2lkdGg7CiAJCWYtPmZtdC5waXguaGVpZ2h0ICAgICAgID0gZGV2LT5oZWlnaHQ7CiAJCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgID0gVjRMMl9QSVhfRk1UX01QRUc7Ci0JCWYtPmZtdC5waXguc2l6ZWltYWdlICAgID0gMTAyNCAqIDUxMiAvKiBGSVhNRTogQlVGRkVSX1NJWkUgKi87CisJCWYtPmZtdC5waXguZmllbGQgICAgICAgID0gVjRMMl9GSUVMRF9OT05FOworCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IDA7CisJCWYtPmZtdC5waXguc2l6ZWltYWdlICAgID0gMTg4ICogNCAqIDEwMjQ7IC8qIDEwMjQgKiA1MTIgKi8gLyogRklYTUU6IEJVRkZFUl9TSVpFICovOworCQlmLT5mbXQucGl4LmNvbG9yc3BhY2UgICA9IDA7CisJCXJldHVybiAwOwogCX0KIAogCS8qIC0tLSBzdHJlYW1pbmcgY2FwdHVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC05NTksMTUgKzk4NiwyNSBAQAogCQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb2ZmKCZmaC0+bXBlZ3EpOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBjeDg4X2RvX2lvY3RsKCBpbm9kZSwgZmlsZSwgMCwgZGV2LT5jb3JlLCBjbWQsIGFyZywgY3g4OF9pb2N0bF9ob29rICk7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1wZWdfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK2ludCAoKmN4ODhfaW9jdGxfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwordW5zaWduZWQgaW50ICgqY3g4OF9pb2N0bF90cmFuc2xhdG9yKSh1bnNpZ25lZCBpbnQgY21kKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBtcGVnX3RyYW5zbGF0ZV9pb2N0bCh1bnNpZ25lZCBpbnQgY21kKQogewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIG1wZWdfZG9faW9jdGwpOworCXJldHVybiBjbWQ7Cit9CisKK3N0YXRpYyBpbnQgbXBlZ19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWNtZCA9IGN4ODhfaW9jdGxfdHJhbnNsYXRvciggY21kICk7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgY3g4OF9pb2N0bF9ob29rKTsKIH0KIAogc3RhdGljIGludCBtcGVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0xMTM1LDcgKzExNzIsNyBAQAogCWRldi0+cGNpID0gcGNpX2RldjsKIAlkZXYtPmNvcmUgPSBjb3JlOwogCWRldi0+d2lkdGggPSA3MjA7Ci0JZGV2LT5oZWlnaHQgPSA0ODA7CisJZGV2LT5oZWlnaHQgPSA1NzY7CiAKIAllcnIgPSBjeDg4MDJfaW5pdF9jb21tb24oZGV2KTsKIAlpZiAoMCAhPSBlcnIpCkBAIC0xMTQ4LDYgKzExODUsOSBAQAogCiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5kZXZsaXN0LCZjeDg4MDJfZGV2bGlzdCk7CiAJYmxhY2tiaXJkX3JlZ2lzdGVyX3ZpZGVvKGRldik7CisKKwkvKiBpbml0aWFsIGRldmljZSBjb25maWd1cmF0aW9uOiBuZWVkZWQgPyAqLworCiAJcmV0dXJuIDA7CiAKICBmYWlsX2ZyZWU6CkBAIC0xMjAyLDYgKzEyNDIsOCBAQAogCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHg6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCiAJICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7CiAjZW5kaWYKKwljeDg4X2lvY3RsX2hvb2sgPSBtcGVnX2RvX2lvY3RsOworCWN4ODhfaW9jdGxfdHJhbnNsYXRvciA9IG1wZWdfdHJhbnNsYXRlX2lvY3RsOwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZibGFja2JpcmRfcGNpX2RyaXZlcik7CiB9CiAKQEAgLTEyMTMsNiArMTI1NSw5IEBACiBtb2R1bGVfaW5pdChibGFja2JpcmRfaW5pdCk7CiBtb2R1bGVfZXhpdChibGFja2JpcmRfZmluaSk7CiAKK0VYUE9SVF9TWU1CT0woY3g4OF9pb2N0bF9ob29rKTsKK0VYUE9SVF9TWU1CT0woY3g4OF9pb2N0bF90cmFuc2xhdG9yKTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwppbmRleCBlYmYwMmE3Li40ZGE5MWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBjeDg4LWNhcmRzLmMsdiAxLjkwIDIwMDUvMDcvMjggMDI6NDc6NDIgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIENvbmV4YW50IDIzODh4IGJhc2VkIFRWIGNhcmRzCiAgKiBjYXJkLXNwZWNpZmljIHN0dWZmLgpAQCAtNDk5LDkgKzQ5OCw2IEBACiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX0RWQiwKICAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAwLAotCQl9LHsKLQkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAotCQkJLnZtdXggICA9IDIsCiAgICAgICAgICAgICAgICAgfX0sCiAJCS5kdmIgICAgICAgICAgICA9IDEsCiAJfSwKQEAgLTYxNCwxMiArNjEwLDEyIEBACiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgID0gMCwKLQkJCS5ncGlvMCAgPSAweGVkMTIsICAvLyBpbnRlcm5hbCBkZWNvZGVyCisJCQkuZ3BpbzAgID0gMHhlZDEyLCAgLyogaW50ZXJuYWwgZGVjb2RlciAqLwogCQkJLmdwaW8yICA9IDB4MDBmZiwKIAkJfSx7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0RFQlVHLAogCQkJLnZtdXggICA9IDAsCi0JCQkuZ3BpbzAgID0gMHhmZjAxLCAgLy8gbW9ubyBmcm9tIHR1bmVyIGNoaXAKKwkJCS5ncGlvMCAgPSAweGZmMDEsICAvKiBtb25vIGZyb20gdHVuZXIgY2hpcCAqLwogCQl9LHsKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgPSAxLApAQCAtNzE1LDE5ICs3MTEsMTggQEAKIAkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAotCQkvKiAgU2VlIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEgZm9yIEdQSU8gZG9jdW1lbnRhdGlvbi4gICovCiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvMCAgPSAweDBmMGQsCisgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHg5N2VkLAogICAgICAgICAgICAgICAgIH0sewogICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAogICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwZjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4OTdlOSwKICAgICAgICAgICAgICAgICB9LHsKICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAogICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwZjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4OTdlOSwKICAgICAgICAgICAgICAgICB9fSwKIAkJLmR2YiAgICAgICAgICAgID0gMSwKICAgICAgICAgfSwKQEAgLTc2NSwyMCArNzYwLDIxIEBACiAJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKLQkJLyogIFNlZSBEVmlDTyBGdXNpb25IRFRWIDMgR29sZC1RIGZvciBHUElPIGRvY3VtZW50YXRpb24uICAqLworCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvMCAgPSAweDBmMGQsCisgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHg4N2ZkLAogICAgICAgICAgICAgICAgIH0sewogICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAogICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwZjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4ODdmOSwKICAgICAgICAgICAgICAgICB9LHsKICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAogICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwZjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4ODdmOSwKICAgICAgICAgICAgICAgICB9fSwKKwkJLmR2YiAgICAgICAgICAgID0gMSwKIAl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDg4X2Jjb3VudCA9IEFSUkFZX1NJWkUoY3g4OF9ib2FyZHMpOwpAQCAtOTQ5LDcgKzk0NSw3IEBACiB7CiAJc3RydWN0IHR2ZWVwcm9tIHR2OwogCi0JdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZygmdHYsIGVlcHJvbV9kYXRhKTsKKwl0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKCZjb3JlLT5pMmNfY2xpZW50LCAmdHYsIGVlcHJvbV9kYXRhKTsKIAljb3JlLT50dW5lcl90eXBlID0gdHYudHVuZXJfdHlwZTsKIAljb3JlLT5oYXNfcmFkaW8gID0gdHYuaGFzX3JhZGlvOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCmluZGV4IDVlODY4ZjUuLmRjNWM1YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBjeDg4LWNvcmUuYyx2IDEuMzMgMjAwNS8wNy8wNyAxNDoxNzo0NyBtY2hlaGFiIEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgQ29uZXhhbnQgMjM4OHggYmFzZWQgVFYgY2FyZHMKICAqIGRyaXZlciBjb3JlCkBAIC04NzYsNyArODc1LDcgQEAKIAogCWN4X2FuZG9yKE1PX0FGRUNGR19JTywgMHgxZiwgMHgwKTsKIAljeDg4X3NldF90dmF1ZGlvKGNvcmUpOwotCS8vIGN4ODhfc2V0X3N0ZXJlbyhkZXYsVjRMMl9UVU5FUl9NT0RFX1NURVJFTyk7CisJLyogY3g4OF9zZXRfc3RlcmVvKGRldixWNEwyX1RVTkVSX01PREVfU1RFUkVPKTsgKi8KIAogCWN4X3dyaXRlKE1PX0FVRERfTE5HVEgsICAgIDEyOCk7IC8qIGZpZm8gc2l6ZSAqLwogCWN4X3dyaXRlKE1PX0FVRFJfTE5HVEgsICAgIDEyOCk7IC8qIGZpZm8gc2l6ZSAqLwpAQCAtMTA4NywxMCArMTA4NiwxNyBAQAogCWNvcmUtPnBjaV9idXMgID0gcGNpLT5idXMtPm51bWJlcjsKIAljb3JlLT5wY2lfc2xvdCA9IFBDSV9TTE9UKHBjaS0+ZGV2Zm4pOwogCWNvcmUtPnBjaV9pcnFtYXNrID0gMHgwMGZjMDA7CisJaW5pdF9NVVRFWCgmY29yZS0+bG9jayk7CiAKIAljb3JlLT5uciA9IGN4ODhfZGV2Y291bnQrKzsKIAlzcHJpbnRmKGNvcmUtPm5hbWUsImN4ODhbJWRdIixjb3JlLT5ucik7CiAJaWYgKDAgIT0gZ2V0X3Jlc3NvdXJjZXMoY29yZSxwY2kpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ09SRSAlcyBObyBtb3JlIFBDSSByZXNzb3VyY2VzIGZvciAiCisJCQkic3Vic3lzdGVtOiAlMDR4OiUwNHgsIGJvYXJkOiAlc1xuIiwKKwkJCWNvcmUtPm5hbWUscGNpLT5zdWJzeXN0ZW1fdmVuZG9yLAorCQkJcGNpLT5zdWJzeXN0ZW1fZGV2aWNlLAorCQkJY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLm5hbWUpOworCiAJCWN4ODhfZGV2Y291bnQtLTsKIAkJZ290byBmYWlsX2ZyZWU7CiAJfQpAQCAtMTExNCwxMSArMTEyMCwxMSBAQAogCQljb3JlLT5ib2FyZCA9IENYODhfQk9BUkRfVU5LTk9XTjsKIAkJY3g4OF9jYXJkX2xpc3QoY29yZSxwY2kpOwogCX0KLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN1YnN5c3RlbTogJTA0eDolMDR4LCBib2FyZDogJXMgW2NhcmQ9JWQsJXNdXG4iLAotCSAgICAgICBjb3JlLT5uYW1lLHBjaS0+c3Vic3lzdGVtX3ZlbmRvciwKLQkgICAgICAgcGNpLT5zdWJzeXN0ZW1fZGV2aWNlLGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5uYW1lLAotCSAgICAgICBjb3JlLT5ib2FyZCwgY2FyZFtjb3JlLT5ucl0gPT0gY29yZS0+Ym9hcmQgPwotCSAgICAgICAiaW5zbW9kIG9wdGlvbiIgOiAiYXV0b2RldGVjdGVkIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiQ09SRSAlczogc3Vic3lzdGVtOiAlMDR4OiUwNHgsIGJvYXJkOiAlcyBbY2FyZD0lZCwlc11cbiIsCisJCWNvcmUtPm5hbWUscGNpLT5zdWJzeXN0ZW1fdmVuZG9yLAorCQlwY2ktPnN1YnN5c3RlbV9kZXZpY2UsY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLm5hbWUsCisJCWNvcmUtPmJvYXJkLCBjYXJkW2NvcmUtPm5yXSA9PSBjb3JlLT5ib2FyZCA/CisJCSJpbnNtb2Qgb3B0aW9uIiA6ICJhdXRvZGV0ZWN0ZWQiKTsKIAogCWNvcmUtPnR1bmVyX3R5cGUgPSB0dW5lcltjb3JlLT5ucl07CiAJY29yZS0+cmFkaW9fdHlwZSA9IHJhZGlvW2NvcmUtPm5yXTsKQEAgLTEyMDIsNCArMTIwOCw1IEBACiAgKiBMb2NhbCB2YXJpYWJsZXM6CiAgKiBjLWJhc2ljLW9mZnNldDogOAogICogRW5kOgorICoga2F0ZTogZW9sICJ1bml4IjsgaW5kZW50LXdpZHRoIDM7IHJlbW92ZS10cmFpbGluZy1zcGFjZSBvbjsgcmVwbGFjZS10cmFpbGluZy1zcGFjZS1zYXZlIG9uOyB0YWItd2lkdGggODsgcmVwbGFjZS10YWJzIG9mZjsgc3BhY2UtaW5kZW50IG9mZjsgbWl4ZWQtaW5kZW50IG9mZgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCmluZGV4IDc4ZDIyMzIuLmM5MTA2YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogY3g4OC1kdmIuYyx2IDEuNTggMjAwNS8wOC8wNyAwOToyNDowOCBta3J1Zmt5IEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgQ29uZXhhbnQgMjM4OHggYmFzZWQgVFYgY2FyZHMKICAqIE1QRUcgVHJhbnNwb3J0IFN0cmVhbSAoRFZCKSByb3V0aW5lcwpAQCAtMjksNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCiAKICNpbmNsdWRlICJjeDg4LmgiCiAjaW5jbHVkZSAiZHZiLXBsbC5oIgpAQCAtMjEwLDE2ICsyMDksMjYgQEAKIHN0YXRpYyBpbnQgbGdkdDMzMHhfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKIAkJCSAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKKwkvKiBGSVhNRSBtYWtlIHRoaXMgcm91dGluZSB1c2UgdGhlIHR1bmVyLXNpbXBsZSBjb2RlLgorCSAqIEl0IGNvdWxkIHByb2JhYmx5IGJlIHNoYXJlZCB3aXRoIGEgbnVtYmVyIG9mIEFUU0MKKwkgKiBmcm9udGVuZHMuIE1hbnkgc2hhcmUgdGhlIHNhbWUgdHVuZXIgd2l0aCBhbmFsb2cgVFYuICovCisKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CiAJdTggYnVmWzRdOwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9CiAJCXsgLmFkZHIgPSBkZXYtPmNvcmUtPnBsbF9hZGRyLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gNCB9OwogCWludCBlcnI7CiAKLQlkdmJfcGxsX2NvbmZpZ3VyZShkZXYtPmNvcmUtPnBsbF9kZXNjLCBidWYsIHBhcmFtcy0+ZnJlcXVlbmN5LCAwKTsKKwkvKiBQdXQgdGhlIGFuYWxvZyBkZWNvZGVyIGluIHN0YW5kYnkgdG8ga2VlcCBpdCBxdWlldCAqLworCWlmIChjb3JlLT50ZGE5ODg3X2NvbmYpIHsKKwkJY3g4OF9jYWxsX2kyY19jbGllbnRzIChkZXYtPmNvcmUsIFRVTkVSX1NFVF9TVEFOREJZLCBOVUxMKTsKKwl9CisKKwlkdmJfcGxsX2NvbmZpZ3VyZShjb3JlLT5wbGxfZGVzYywgYnVmLCBwYXJhbXMtPmZyZXF1ZW5jeSwgMCk7CiAJZHByaW50aygxLCAiJXM6IHR1bmVyIGF0IDB4JTAyeCBieXRlczogMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAogCQkJX19GVU5DVElPTl9fLCBtc2cuYWRkciwgYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKLQlpZiAoKGVyciA9IGkyY190cmFuc2ZlcigmZGV2LT5jb3JlLT5pMmNfYWRhcCwgJm1zZywgMSkpICE9IDEpIHsKKwlpZiAoKGVyciA9IGkyY190cmFuc2ZlcigmY29yZS0+aTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImN4ODgtZHZiOiAlcyBlcnJvciAiCiAJCQkgICAiKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPSAlaSlcbiIsCiAJCQkgICBfX0ZVTkNUSU9OX18sIGJ1ZlswXSwgYnVmWzFdLCBlcnIpOwpAQCAtMjI4LDYgKzIzNywxMyBAQAogCQllbHNlCiAJCQlyZXR1cm4gLUVSRU1PVEVJTzsKIAl9CisJaWYgKGNvcmUtPnR1bmVyX3R5cGUgPT0gVFVORVJfTEdfVERWU19IMDYyRikgeworCQkvKiBTZXQgdGhlIEF1eGlsaWFyeSBCeXRlLiAqLworCQlidWZbMl0gJj0gfjB4MjA7CisJCWJ1ZlsyXSB8PSAweDE4OworCQlidWZbM10gPSAweDUwOworCQlpMmNfdHJhbnNmZXIoJmNvcmUtPmkyY19hZGFwLCAmbXNnLCAxKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2MSw2ICsyNzcsMTQgQEAKIAkucGxsX3NldCAgICAgICAgICA9IGxnZHQzMzB4X3BsbF9zZXQsCiAJLnNldF90c19wYXJhbXMgICAgPSBsZ2R0MzMweF9zZXRfdHNfcGFyYW0sCiB9OworCitzdGF0aWMgc3RydWN0IGxnZHQzMzB4X2NvbmZpZyBmdXNpb25oZHR2XzVfZ29sZCA9IHsKKwkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MGUsCisJLmRlbW9kX2NoaXAgICAgICAgPSBMR0RUMzMwMywKKwkuc2VyaWFsX21wZWcgICAgICA9IDB4NDAsIC8qIFRQU0VSSUFMIGZvciAzMzAzIGluIFRPUF9DT05UUk9MICovCisJLnBsbF9zZXQgICAgICAgICAgPSBsZ2R0MzMweF9wbGxfc2V0LAorCS5zZXRfdHNfcGFyYW1zICAgID0gbGdkdDMzMHhfc2V0X3RzX3BhcmFtLAorfTsKICNlbmRpZgogCiBzdGF0aWMgaW50IGR2Yl9yZWdpc3RlcihzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQpAQCAtMzQ2LDYgKzM3MCwyMiBAQAogCQkJCQkJICAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKIAkJfQogCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X0dPTEQ6CisJCWRldi0+dHNfZ2VuX2NudHJsID0gMHgwODsKKwkJeworCQkvKiBEbyBhIGhhcmR3YXJlIHJlc2V0IG9mIGNoaXAgYmVmb3JlIHVzaW5nIGl0LiAqLworCQlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCisJCWN4X2NsZWFyKE1PX0dQMF9JTywgMSk7CisJCW1kZWxheSgxMDApOworCQljeF9zZXQoTU9fR1AwX0lPLCAxKTsKKwkJbWRlbGF5KDIwMCk7CisJCWRldi0+Y29yZS0+cGxsX2FkZHIgPSAweDYxOworCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdGR2c190dWE2MDM0OworCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGxnZHQzMzB4X2F0dGFjaCgmZnVzaW9uaGR0dl81X2dvbGQsCisJCQkJCQkgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQl9CisJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKIAkJcHJpbnRrKCIlczogVGhlIGZyb250ZW5kIG9mIHlvdXIgRFZCL0FUU0MgY2FyZCBpc24ndCBzdXBwb3J0ZWQgeWV0XG4iLApAQCAtMzYyLDExICs0MDIsNiBAQAogCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9tYXggPSBkZXYtPmNvcmUtPnBsbF9kZXNjLT5tYXg7CiAJfQogCi0JLyogQ29weSB0aGUgYm9hcmQgbmFtZSBpbnRvIHRoZSBEVkIgc3RydWN0dXJlICovCi0Jc3RybGNweShkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pbmZvLm5hbWUsCi0JCWN4ODhfYm9hcmRzW2Rldi0+Y29yZS0+Ym9hcmRdLm5hbWUsCi0JCXNpemVvZihkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pbmZvLm5hbWUpKTsKLQogCS8qIHJlZ2lzdGVyIGV2ZXJ5dGhpbmcgKi8KIAlyZXR1cm4gdmlkZW9idWZfZHZiX3JlZ2lzdGVyKCZkZXYtPmR2YiwgVEhJU19NT0RVTEUsIGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jCmluZGV4IGE2MjhhNTUuLjc2MWNlYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAgICAkSWQ6IGN4ODgtaTJjLmMsdiAxLjMwIDIwMDUvMDcvMjUgMDU6MTA6MTMgbWtydWZreSBFeHAgJAogCiAgICAgY3g4OC1pMmMuYyAgLS0gIGFsbCB0aGUgaTJjIGNvZGUgaXMgaGVyZQogCkBAIC05NSw3ICs5NCw3IEBACiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKIAogCWRwcmludGsoMSwgIiVzIGkyYyBhdHRhY2ggW2FkZHI9MHgleCxjbGllbnQ9JXNdXG4iLAotCQljbGllbnQtPmRyaXZlci0+bmFtZSxjbGllbnQtPmFkZHIsaTJjX2NsaWVudG5hbWUoY2xpZW50KSk7CisJCWNsaWVudC0+ZHJpdmVyLT5uYW1lLCBjbGllbnQtPmFkZHIsIGNsaWVudC0+bmFtZSk7CiAJaWYgKCFjbGllbnQtPmRyaXZlci0+Y29tbWFuZCkKIAkJcmV0dXJuIDA7CiAKQEAgLTEyOCw3ICsxMjcsNyBAQAogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBpMmNfZ2V0X2FkYXBkYXRhKGNsaWVudC0+YWRhcHRlcik7CiAKLQlkcHJpbnRrKDEsICJpMmMgZGV0YWNoIFtjbGllbnQ9JXNdXG4iLCBpMmNfY2xpZW50bmFtZShjbGllbnQpKTsKKwlkcHJpbnRrKDEsICJpMmMgZGV0YWNoIFtjbGllbnQ9JXNdXG4iLCBjbGllbnQtPm5hbWUpOwogCXJldHVybiAwOwogfQogCkBAIC0xNTIsNyArMTUxLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgY3g4ODAwX2kyY19hZGFwX3RlbXBsYXRlID0gewotCUkyQ19ERVZOQU1FKCJjeDIzODh4IiksCisJLm5hbWUgICAgICAgICAgICAgID0gImN4MjM4OHgiLAogCS5vd25lciAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAogCS5pZCAgICAgICAgICAgICAgICA9IEkyQ19IV19CX0NYMjM4OHgsCiAJLmNsaWVudF9yZWdpc3RlciAgID0gYXR0YWNoX2luZm9ybSwKQEAgLTE2MCw3ICsxNTksNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGN4ODgwMF9pMmNfY2xpZW50X3RlbXBsYXRlID0gewotICAgICAgICBJMkNfREVWTkFNRSgiY3g4OHh4IGludGVybmFsIiksCisgICAgICAgIC5uYW1lCT0gImN4ODh4eCBpbnRlcm5hbCIsCiB9OwogCiBzdGF0aWMgY2hhciAqaTJjX2RldnNbMTI4XSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCmluZGV4IDIxNDg4NzcuLmQ4MWIyMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtaW5wdXQuYyx2IDEuMTUgMjAwNS8wNy8wNyAxMzo1ODozOCBtY2hlaGFiIEV4cCAkCiAgKgogICogRGV2aWNlIGRyaXZlciBmb3IgR1BJTyBhdHRhY2hlZCByZW1vdGUgY29udHJvbCBpbnRlcmZhY2VzCiAgKiBvbiBDb25leGFudCAyMzg4eCBiYXNlZCBUVi9EVkIgY2FyZHMuCkBAIC0yMTIsNiArMjExLDUzIEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorLyogQ2luZXJneSAxNDAwIERWQi1UICovCitzdGF0aWMgSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfY2luZXJneV8xNDAwW0lSX0tFWVRBQl9TSVpFXSA9IHsKKwlbMHgwMV0gPSBLRVlfUE9XRVIsCisJWzB4MDJdID0gS0VZXzEsCisJWzB4MDNdID0gS0VZXzIsCisJWzB4MDRdID0gS0VZXzMsCisJWzB4MDVdID0gS0VZXzQsCisJWzB4MDZdID0gS0VZXzUsCisJWzB4MDddID0gS0VZXzYsCisJWzB4MDhdID0gS0VZXzcsCisJWzB4MDldID0gS0VZXzgsCisJWzB4MGFdID0gS0VZXzksCisJWzB4MGNdID0gS0VZXzAsCisKKwlbMHgwYl0gPSBLRVlfVklERU8sCisJWzB4MGRdID0gS0VZX1JFRlJFU0gsCisJWzB4MGVdID0gS0VZX1NFTEVDVCwKKwlbMHgwZl0gPSBLRVlfRVBHLAorCVsweDEwXSA9IEtFWV9VUCwKKwlbMHgxMV0gPSBLRVlfTEVGVCwKKwlbMHgxMl0gPSBLRVlfT0ssCisJWzB4MTNdID0gS0VZX1JJR0hULAorCVsweDE0XSA9IEtFWV9ET1dOLAorCVsweDE1XSA9IEtFWV9URVhULAorCVsweDE2XSA9IEtFWV9JTkZPLAorCisJWzB4MTddID0gS0VZX1JFRCwKKwlbMHgxOF0gPSBLRVlfR1JFRU4sCisJWzB4MTldID0gS0VZX1lFTExPVywKKwlbMHgxYV0gPSBLRVlfQkxVRSwKKworCVsweDFiXSA9IEtFWV9DSEFOTkVMVVAsCisJWzB4MWNdID0gS0VZX1ZPTFVNRVVQLAorCVsweDFkXSA9IEtFWV9NVVRFLAorCVsweDFlXSA9IEtFWV9WT0xVTUVET1dOLAorCVsweDFmXSA9IEtFWV9DSEFOTkVMRE9XTiwKKworCVsweDQwXSA9IEtFWV9QQVVTRSwKKwlbMHg0Y10gPSBLRVlfUExBWSwKKwlbMHg1OF0gPSBLRVlfUkVDT1JELAorCVsweDU0XSA9IEtFWV9QUkVWSU9VUywKKwlbMHg0OF0gPSBLRVlfU1RPUCwKKwlbMHg1Y10gPSBLRVlfTkVYVCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwogc3RydWN0IGN4ODhfSVIgewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmU7CiAJc3RydWN0IGlucHV0X2RldiBpbnB1dDsKQEAgLTI0MSw3ICsyODcsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhpcl9kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbSVJdIik7CiAKICNkZWZpbmUgaXJfZHByaW50ayhmbXQsIGFyZy4uLikJaWYgKGlyX2RlYnVnKSBcCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzIElSOiAiIGZtdCAsIGlyLT5jb3JlLT5uYW1lLCAjIyBhcmcpCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIElSOiAiIGZtdCAsIGlyLT5jb3JlLT5uYW1lICwgIyNhcmcpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMzI5LDYgKzM3NSwxMSBAQAogCQlpci0+bWFza19rZXl1cCA9IDB4NjA7CiAJCWlyLT5wb2xsaW5nID0gNTA7IC8qIG1zICovCiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZXzE0MDBfRFZCX1QxOgorCQlpcl9jb2RlcyA9IGlyX2NvZGVzX2NpbmVyZ3lfMTQwMDsKKwkJaXJfdHlwZSA9IElSX1RZUEVfUEQ7CisJCWlyLT5zYW1wbGluZyA9IDE7CisJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0U6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6CiAJCWlyX2NvZGVzID0gaXJfY29kZXNfaGF1cHBhdWdlX25ldzsKQEAgLTM5NCw2ICs0NDUsNyBAQAogCQlpci0+aW5wdXQuaWQudmVuZG9yID0gcGNpLT52ZW5kb3I7CiAJCWlyLT5pbnB1dC5pZC5wcm9kdWN0ID0gcGNpLT5kZXZpY2U7CiAJfQorCWlyLT5pbnB1dC5kZXYgPSAmcGNpLT5kZXY7CiAKIAkvKiByZWNvcmQgaGFuZGxlcyB0byBvdXJzZWxmICovCiAJaXItPmNvcmUgPSBjb3JlOwpAQCAtNDQ1LDcgKzQ5Nyw3IEBACiB2b2lkIGN4ODhfaXJfaXJxKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpCiB7CiAJc3RydWN0IGN4ODhfSVIgKmlyID0gY29yZS0+aXI7Ci0JdTMyIHNhbXBsZXMsIHJjNTsKKwl1MzIgc2FtcGxlcywgaXJjb2RlOwogCWludCBpOwogCiAJaWYgKE5VTEwgPT0gaXIpCkBAIC00NzcsMTMgKzUyOSw0NCBAQAogCiAJLyogZGVjb2RlIGl0ICovCiAJc3dpdGNoIChjb3JlLT5ib2FyZCkgeworCWNhc2UgQ1g4OF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZXzE0MDBfRFZCX1QxOgorCQlpcmNvZGUgPSBpcl9kZWNvZGVfcHVsc2VkaXN0YW5jZShpci0+c2FtcGxlcywgaXItPnNjb3VudCwgMSwgNCk7CisKKwkJaWYgKGlyY29kZSA9PSAweGZmZmZmZmZmKSB7IC8qIGRlY29kaW5nIGVycm9yICovCisJCQlpcl9kcHJpbnRrKCJwdWxzZSBkaXN0YW5jZSBkZWNvZGluZyBlcnJvclxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWlyX2RwcmludGsoInB1bHNlIGRpc3RhbmNlIGRlY29kZWQ6ICV4XG4iLCBpcmNvZGUpOworCisJCWlmIChpcmNvZGUgPT0gMCkgeyAvKiBrZXkgc3RpbGwgcHJlc3NlZCAqLworCQkJaXJfZHByaW50aygicHVsc2UgZGlzdGFuY2UgZGVjb2RlZCByZXBlYXQgY29kZVxuIik7CisJCQlpci0+cmVsZWFzZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEyMCk7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgoaXJjb2RlICYgMHhmZmZmKSAhPSAweGViMDQpIHsgLyogd3JvbmcgYWRkcmVzcyAqLworCQkJaXJfZHByaW50aygicHVsc2UgZGlzdGFuY2UgZGVjb2RlZCB3cm9uZyBhZGRyZXNzXG4iKTsKKyAJCQlicmVhazsKKwkJfQorCisJCWlmICgoKH5pcmNvZGUgPj4gMjQpICYgMHhmZikgIT0gKChpcmNvZGUgPj4gMTYpICYgMHhmZikpIHsgLyogd3JvbmcgY2hlY2tzdW0gKi8KKwkJCWlyX2RwcmludGsoInB1bHNlIGRpc3RhbmNlIGRlY29kZWQgd3JvbmcgY2hlY2sgc3VtXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaXJfZHByaW50aygiS2V5IENvZGU6ICV4XG4iLCAoaXJjb2RlID4+IDE2KSAmIDB4N2YpOworCisJCWlyX2lucHV0X2tleWRvd24oJmlyLT5pbnB1dCwgJmlyLT5pciwgKGlyY29kZSA+PiAxNikgJiAweDdmLCAoaXJjb2RlID4+IDE2KSAmIDB4ZmYpOworCQlpci0+cmVsZWFzZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEyMCk7CisJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0U6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6Ci0JCXJjNSA9IGlyX2RlY29kZV9iaXBoYXNlKGlyLT5zYW1wbGVzLCBpci0+c2NvdW50LCA1LCA3KTsKLQkJaXJfZHByaW50aygiYmlwaGFzZSBkZWNvZGVkOiAleFxuIiwgcmM1KTsKLQkJaWYgKChyYzUgJiAweGZmZmZmMDAwKSAhPSAweDMwMDApCisJCWlyY29kZSA9IGlyX2RlY29kZV9iaXBoYXNlKGlyLT5zYW1wbGVzLCBpci0+c2NvdW50LCA1LCA3KTsKKwkJaXJfZHByaW50aygiYmlwaGFzZSBkZWNvZGVkOiAleFxuIiwgaXJjb2RlKTsKKwkJaWYgKChpcmNvZGUgJiAweGZmZmZmMDAwKSAhPSAweDMwMDApCiAJCQlicmVhazsKLQkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCAmaXItPmlyLCByYzUgJiAweDNmLCByYzUpOworCQlpcl9pbnB1dF9rZXlkb3duKCZpci0+aW5wdXQsICZpci0+aXIsIGlyY29kZSAmIDB4M2YsIGlyY29kZSk7CiAJCWlyLT5yZWxlYXNlID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTIwKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCmluZGV4IGZlMjc2N2MuLmVlMjMwMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBjeDg4LW1wZWcuYyx2IDEuMzEgMjAwNS8wNy8wNyAxNDoxNzo0NyBtY2hlaGFiIEV4cCAkCiAgKgogICogIFN1cHBvcnQgZm9yIHRoZSBtcGVnIHRyYW5zcG9ydCBzdHJlYW0gdHJhbnNmZXJzCiAgKiAgUENJIGZ1bmN0aW9uICMyIG9mIHRoZSBjeDIzODh4LgpAQCAtNzMsMTEgKzcyLDE1IEBACiAJCXVkZWxheSgxMDApOwogCQljeF93cml0ZShNT19QSU5NVVhfSU8sIDB4MDApOwogCQljeF93cml0ZShUU19IV19TT1BfQ05UUkwsMHg0Nzw8MTZ8MTg4PDw0fDB4MDEpOwotCQlpZiAoKGNvcmUtPmJvYXJkID09IENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfUSkgfHwKLQkJICAgIChjb3JlLT5ib2FyZCA9PSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1QpKSB7CisJCXN3aXRjaCAoY29yZS0+Ym9hcmQpIHsKKwkJY2FzZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1E6CisJCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9UOgorCQljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X0dPTEQ6CiAJCQljeF93cml0ZShUU19TT1BfU1RBVCwgMTw8MTMpOwotCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQljeF93cml0ZShUU19TT1BfU1RBVCwgMHgwMCk7CisJCQlicmVhazsKIAkJfQogCQljeF93cml0ZShUU19HRU5fQ05UUkwsIGRldi0+dHNfZ2VuX2NudHJsKTsKIAkJdWRlbGF5KDEwMCk7CkBAIC04NiwxMiArODksMTAgQEAKIAlpZiAoY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLmJsYWNrYmlyZCkgewogCQljeF93cml0ZShNT19QSU5NVVhfSU8sIDB4ODgpOyAvKiBlbmFibGUgTVBFRyBwYXJhbGxlbCBJTyAqLwogCi0JCS8vIGN4X3dyaXRlKFRTX0YyX0NNRF9TVEFUX01NLCAweDI5MDAxMDYpOyAvKiBGMl9DTURfU1RBVF9NTSBkZWZhdWx0cyArIG1hc3RlciArIG1lbW9yeSBzcGFjZSAqLwogCQljeF93cml0ZShUU19HRU5fQ05UUkwsIDB4NDYpOyAvKiBwdW5jdHVyZWQgY2xvY2sgVFMgJiBwb3NlZGdlIGRyaXZlbiAmIHNvZnR3YXJlIHJlc2V0ICovCiAJCXVkZWxheSgxMDApOwogCiAJCWN4X3dyaXRlKFRTX0hXX1NPUF9DTlRSTCwgMHg0MDgpOyAvKiBtcGVnIHN0YXJ0IGJ5dGUgKi8KLQkJLy9jeF93cml0ZShUU19IV19TT1BfQ05UUkwsIDB4MkYwQkMwKTsgLyogbXBlZyBzdGFydCBieXRlIHRzOiAweDJGMEJDMCA/ICovCiAJCWN4X3dyaXRlKFRTX1ZBTEVSUl9DTlRSTCwgMHgyMDAwKTsKIAogCQljeF93cml0ZShUU19HRU5fQ05UUkwsIDB4MDYpOyAvKiBwdW5jdHVyZWQgY2xvY2sgVFMgJiBwb3NlZGdlIGRyaXZlbiAqLwpAQCAtMTA2LDcgKzEwNyw2IEBACiAJZHByaW50ayggMCwgInNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrXG4iICk7CiAJY3hfc2V0KE1PX1BDSV9JTlRNU0ssIGNvcmUtPnBjaV9pcnFtYXNrIHwgMHgwNCk7CiAJY3hfc2V0KE1PX1RTX0lOVE1TSywgIDB4MWYwMDExKTsKLQkvL2N4X3dyaXRlKE1PX1RTX0lOVE1TSywgIDB4MGYwMDExKTsKIAogCS8qIHN0YXJ0IGRtYSAqLwogCWN4X3NldChNT19ERVZfQ05UUkwyLCAoMTw8NSkpOwpAQCAtMjA2LDcgKzIwNiw2IEBACiAJCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcytCVUZGRVJfVElNRU9VVCk7CiAJCWRwcmludGsoMCwiWyVwLyVkXSAlcyAtIGZpcnN0IGFjdGl2ZVxuIiwKIAkJCWJ1ZiwgYnVmLT52Yi5pLCBfX0ZVTkNUSU9OX18pOwotCQkvL3VkZWxheSgxMDApOwogCiAJfSBlbHNlIHsKIAkJZHByaW50ayggMSwgInF1ZXVlIGlzIG5vdCBlbXB0eSAtIGFwcGVuZCB0byBhY3RpdmVcbiIgKTsKQEAgLTIxNyw3ICsyMTYsNiBAQAogCQlwcmV2LT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKGJ1Zi0+cmlzYy5kbWEpOwogCQlkcHJpbnRrKCAxLCAiWyVwLyVkXSAlcyAtIGFwcGVuZCB0byBhY3RpdmVcbiIsCiAJCQlidWYsIGJ1Zi0+dmIuaSwgX19GVU5DVElPTl9fKTsKLQkJLy91ZGVsYXkoMTAwKTsKIAl9CiB9CiAKQEAgLTM4Nyw3ICszODUsNiBAQAogCSAgICAgICBkZXYtPnBjaV9sYXQscGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGNpLDApKTsKIAogCS8qIGluaXRpYWxpemUgZHJpdmVyIHN0cnVjdCAqLwotICAgICAgICBpbml0X01VVEVYKCZkZXYtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPnNsb2NrKTsKIAogCS8qIGluaXQgZG1hIHF1ZXVlICovCkBAIC00NTgsMTQgKzQ1NSwyOCBAQAogCiBpbnQgY3g4ODAyX3Jlc3VtZV9jb21tb24oc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCiB7Ci0gICAgICAgIHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKIAlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCWludCBlcnI7CiAKIAlpZiAoZGV2LT5zdGF0ZS5kaXNhYmxlZCkgewotCQlwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKKwkJZXJyPXBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBlbmFibGUgZGV2aWNlXG4iLAorCQkJCQkgICAgICAgZGV2LT5jb3JlLT5uYW1lKTsKKwkJCXJldHVybiBlcnI7CisJCX0KIAkJZGV2LT5zdGF0ZS5kaXNhYmxlZCA9IDA7CiAJfQotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKwllcnI9cGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBQQ0lfRDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZW5hYmxlIGRldmljZVxuIiwKKwkJCQkJICAgICAgIGRldi0+Y29yZS0+bmFtZSk7CisJCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKwkJZGV2LT5zdGF0ZS5kaXNhYmxlZCA9IDE7CisKKwkJcmV0dXJuIGVycjsKKwl9CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CiAKIAkvKiBGSVhNRTogcmUtaW5pdGlhbGl6ZSBoYXJkd2FyZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtcmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1yZWcuaAppbmRleCAzN2Y4MjY2Li4wYTNhNjJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1yZWcuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1yZWcuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gICAgJElkOiBjeDg4LXJlZy5oLHYgMS44IDIwMDUvMDcvMDcgMTM6NTg6MzggbWNoZWhhYiBFeHAgJAogCiAgICAgY3g4OHgtaHcuaCAtIENYMjM4OHggcmVnaXN0ZXIgb2Zmc2V0cwogCkBAIC00MCw2ICszOSwyOSBAQAogI2RlZmluZSBDWDg4WF9FTl9UQkZYIDB4MDIKICNkZWZpbmUgQ1g4OFhfRU5fVlNGWCAweDA0CiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFBDSSBjb250cm9sbGVyIHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogQ29tbWFuZCBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEYwX0NNRF9TVEFUX01NICAgICAgMHgyZjAwMDQKKyNkZWZpbmUgRjFfQ01EX1NUQVRfTU0gICAgICAweDJmMDEwNAorI2RlZmluZSBGMl9DTURfU1RBVF9NTSAgICAgIDB4MmYwMjA0CisjZGVmaW5lIEYzX0NNRF9TVEFUX01NICAgICAgMHgyZjAzMDQKKyNkZWZpbmUgRjRfQ01EX1NUQVRfTU0gICAgICAweDJmMDQwNAorCisvKiBEZXZpY2UgQ29udHJvbCAjMSAqLworI2RlZmluZSBGMF9ERVZfQ05UUkwxX01NICAgIDB4MmYwMDQwCisjZGVmaW5lIEYxX0RFVl9DTlRSTDFfTU0gICAgMHgyZjAxNDAKKyNkZWZpbmUgRjJfREVWX0NOVFJMMV9NTSAgICAweDJmMDI0MAorI2RlZmluZSBGM19ERVZfQ05UUkwxX01NICAgIDB4MmYwMzQwCisjZGVmaW5lIEY0X0RFVl9DTlRSTDFfTU0gICAgMHgyZjA0NDAKKworLyogRGV2aWNlIENvbnRyb2wgIzEgKi8KKyNkZWZpbmUgRjBfQkFSMF9NTSAgICAgICAgICAweDJmMDAxMAorI2RlZmluZSBGMV9CQVIwX01NICAgICAgICAgIDB4MmYwMTEwCisjZGVmaW5lIEYyX0JBUjBfTU0gICAgICAgICAgMHgyZjAyMTAKKyNkZWZpbmUgRjNfQkFSMF9NTSAgICAgICAgICAweDJmMDMxMAorI2RlZmluZSBGNF9CQVIwX01NICAgICAgICAgIDB4MmYwNDEwCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIERNQSBDb250cm9sbGVyIHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwppbmRleCA5MTIwN2YxLi4yNzY1YWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAgICAkSWQ6IGN4ODgtdHZhdWRpby5jLHYgMS4zNyAyMDA1LzA3LzA3IDEzOjU4OjM4IG1jaGVoYWIgRXhwICQKIAogICAgIGN4ODh4LWF1ZGlvLmMgLSBDb25leGFudCBDWDIzODgwLzIzODgxIGF1ZGlvIGRvd25zdHJlYW0gZHJpdmVyIGRyaXZlcgogCkBAIC0xMjEsMjUgKzEyMCwxOSBAQAogfQogCiBzdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhcnQoc3RydWN0IGN4ODhfY29yZSAqY29yZSwKLQkJCSAgICB1MzIgbW9kZSwgdTMyIGN0bCkKKwkJCXUzMiBtb2RlKQogewogCS8vIG11dGUKIAljeF93cml0ZShBVURfVk9MX0NUTCwgICAgICAgKDEgPDwgNikpOwogCi0JLy8gIGluY3JlYXNlIGxldmVsIG9mIGlucHV0IGJ5IDEyZEIKLS8vCWN4X3dyaXRlKEFVRF9BRkVfMTJEQl9FTiwgICAweDAwMDEpOwotCWN4X3dyaXRlKEFVRF9BRkVfMTJEQl9FTiwgICAweDAwMDApOwotCiAJLy8gc3RhcnQgcHJvZ3JhbW1pbmcKIAljeF93cml0ZShBVURfQ1RMLCAgICAgICAgICAgMHgwMDAwKTsKIAljeF93cml0ZShBVURfSU5JVCwgICAgICAgICAgbW9kZSk7CiAJY3hfd3JpdGUoQVVEX0lOSVRfTEQsICAgICAgIDB4MDAwMSk7CiAJY3hfd3JpdGUoQVVEX1NPRlRfUkVTRVQsICAgIDB4MDAwMSk7Ci0KLQljeF93cml0ZShBVURfQ1RMLCAgICAgICAgICAgY3RsKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0X2F1ZGlvX2ZpbmlzaChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlKQorc3RhdGljIHZvaWQgc2V0X2F1ZGlvX2ZpbmlzaChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1MzIgY3RsKQogewogCXUzMiB2b2x1bWU7CiAKQEAgLTE1NCwyNSArMTQ3LDI1IEBACiAJCWN4X3dyaXRlKEFVRF9JMlNPVVRQVVRDTlRMLCAxKTsKIAkJY3hfd3JpdGUoQVVEX0kyU0NOVEwsIDApOwogCQkvL2N4X3dyaXRlKEFVRF9BUEJfSU5fUkFURV9BREosIDApOworCX0gZWxzZSB7CisJY3RsIHw9IEVOX0RBQ19FTkFCTEU7CisJY3hfd3JpdGUoQVVEX0NUTCwgY3RsKTsKIAl9CiAKLQkvLyBmaW5pc2ggcHJvZ3JhbW1pbmcKKwkvKiBmaW5pc2ggcHJvZ3JhbW1pbmcgKi8KIAljeF93cml0ZShBVURfU09GVF9SRVNFVCwgMHgwMDAwKTsKIAotCS8vIHN0YXJ0IGF1ZGlvIHByb2Nlc3NpbmcKLQljeF9zZXQoQVVEX0NUTCwgRU5fREFDX0VOQUJMRSk7Ci0KLQkvLyB1bm11dGUKKwkvKiB1bm11dGUgKi8KIAl2b2x1bWUgPSBjeF9zcmVhZChTSEFET1dfQVVEX1ZPTF9DVEwpOwogCWN4X3N3cml0ZShTSEFET1dfQVVEX1ZPTF9DVEwsIEFVRF9WT0xfQ1RMLCB2b2x1bWUpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhbmRhcmRfQlRTQyhzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1bnNpZ25lZCBpbnQgc2FwKQorc3RhdGljIHZvaWQgc2V0X2F1ZGlvX3N0YW5kYXJkX0JUU0Moc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdW5zaWduZWQgaW50IHNhcCwgdTMyIG1vZGUpCiB7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBidHNjW10gPSB7Ci0JCS8qIGZyb20gZHNjYWxlciAqLworCXsgQVVEX0FGRV8xMkRCX0VOLCAgICAgICAgICAgICAweDAwMDAwMDAxIH0sCiAJCXsgQVVEX09VVDFfU0VMLCAgICAgICAgICAgICAgICAweDAwMDAwMDEzIH0sCiAJCXsgQVVEX09VVDFfU0hJRlQsICAgICAgICAgICAgICAweDAwMDAwMDAwIH0sCiAJCXsgQVVEX1BPTFkwX0REU19DT05TVEFOVCwgICAgICAweDAwMTIwMTBjIH0sCkBAIC0yMDYsOSArMTk5LDEwIEBACiAJCXsgQVVEX1JEU0lfU0hJRlQsICAgICAgICAgICAgICAweDAwMDAwMDAwIH0sCiAJCXsgQVVEX1JEU1FfU0hJRlQsICAgICAgICAgICAgICAweDAwMDAwMDAwIH0sCiAJCXsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsICAgICAgICAweDAwMDAwMDAzIH0sCi0gICAgICAgICAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorCQl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCiAJfTsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IGJ0c2Nfc2FwW10gPSB7CisJeyBBVURfQUZFXzEyREJfRU4sICAgICAgICAgICAgIDB4MDAwMDAwMDEgfSwKIAkJeyBBVURfREJYX0lOX0dBSU4sICAgICAgICAgICAgIDB4MDAwMDcyMDAgfSwKIAkJeyBBVURfREJYX1dCRV9HQUlOLCAgICAgICAgICAgIDB4MDAwMDYyMDAgfSwKIAkJeyBBVURfREJYX1NFX0dBSU4sICAgICAgICAgICAgIDB4MDAwMDYyMDAgfSwKQEAgLTI1OSwzNzEgKzI1Myw0MDAgQEAKIAkJeyBBVURfUkRTSV9TSElGVCwgICAgICAgICAgICAgIDB4MDAwMDAwMDAgfSwKIAkJeyBBVURfUkRTUV9TSElGVCwgICAgICAgICAgICAgIDB4MDAwMDAwMDAgfSwKIAkJeyBBVURfUE9MWVBIODBTQ0FMRUZBQywgICAgICAgIDB4MDAwMDAwMDMgfSwKLSAgICAgICAgICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0sCisJCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKIAl9OwogCi0JLy8gZHNjYWxlcjogZXhhY3RseSB0YWtlbiBmcm9tIGRyaXZlciwKLQkvLyBkc2NhbGVyOiBkb24ndCBrbm93IHdoeSB0byBzZXQgRU5fRk1SQURJT19FTl9SRFMKKwltb2RlIHw9IEVOX0ZNUkFESU9fRU5fUkRTOworCiAJaWYgKHNhcCkgewogCQlkcHJpbnRrKCIlcyBTQVAgKHN0YXR1czogdW5rbm93bilcbiIsX19GVU5DVElPTl9fKTsKLQkJc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIDB4MDAwMSwKLQkJCQlFTl9GTVJBRElPX0VOX1JEUyB8IEVOX0JUU0NfRk9SQ0VfU0FQKTsKKwlzZXRfYXVkaW9fc3RhcnQoY29yZSwgU0VMX1NBUCk7CiAJCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgYnRzY19zYXApOworCQlzZXRfYXVkaW9fZmluaXNoKGNvcmUsIG1vZGUpOwogCX0gZWxzZSB7CiAJCWRwcmludGsoIiVzIChzdGF0dXM6IGtub3duLWdvb2QpXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCXNldF9hdWRpb19zdGFydChjb3JlLCAweDAwMDEsCi0JCQkJRU5fRk1SQURJT19FTl9SRFMgfCBFTl9CVFNDX0FVVE9fU1RFUkVPKTsKKwlzZXRfYXVkaW9fc3RhcnQoY29yZSwgU0VMX0JUU0MpOwogCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGJ0c2MpOworCQlzZXRfYXVkaW9fZmluaXNoKGNvcmUsIG1vZGUpOwogCX0KLQlzZXRfYXVkaW9fZmluaXNoKGNvcmUpOwogfQogCiAKIHN0YXRpYyB2b2lkIHNldF9hdWRpb19zdGFuZGFyZF9OSUNBTV9MKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIGludCBzdGVyZW8pCiB7Ci0gICAgICAgIC8qIFRoaXMgaXMgcHJvYmFibHkgd2VpcmQuLgotICAgICAgICAgKiBMZXQncyBvcGVyYXRlIGFuZCBmaW5kIG91dC4gKi8KKwkvKiBUaGlzIGlzIHByb2JhYmx5IHdlaXJkLi4KKwkqIExldCdzIG9wZXJhdGUgYW5kIGZpbmQgb3V0LiAqLwogCi0gICAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgbmljYW1fbF9tb25vW10gPSB7Ci0gICAgICAgICAgICAgICAgeyBBVURfRVJSTE9HUEVSSU9EX1IsICAgICAweDAwMDAwMDY0IH0sCi0gICAgICAgICAgICAgICAgeyBBVURfRVJSSU5UUlBUVEhTSExEMV9SLCAweDAwMDAwRkZGIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfRVJSSU5UUlBUVEhTSExEMl9SLCAweDAwMDAwMDFGIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfRVJSSU5UUlBUVEhTSExEM19SLCAweDAwMDAwMDBGIH0sCisJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBuaWNhbV9sX21vbm9bXSA9IHsKKwkJeyBBVURfRVJSTE9HUEVSSU9EX1IsICAgICAweDAwMDAwMDY0IH0sCisJCXsgQVVEX0VSUklOVFJQVFRIU0hMRDFfUiwgMHgwMDAwMEZGRiB9LAorCQl7IEFVRF9FUlJJTlRSUFRUSFNITEQyX1IsIDB4MDAwMDAwMUYgfSwKKwkJeyBBVURfRVJSSU5UUlBUVEhTSExEM19SLCAweDAwMDAwMDBGIH0sCiAKLSAgICAgICAgICAgICAgICB7IEFVRF9QREZfRERTX0NOU1RfQllURTIsIDB4NDggfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9QREZfRERTX0NOU1RfQllURTEsIDB4M0QgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9RQU1fTU9ERSwgICAgICAgICAgIDB4MDAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9QREZfRERTX0NOU1RfQllURTAsIDB4ZjUgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9QSEFDQ19GUkVRXzhNU0IsICAgIDB4M2EgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9QSEFDQ19GUkVRXzhMU0IsICAgIDB4NGEgfSwKKwkJeyBBVURfUERGX0REU19DTlNUX0JZVEUyLCAweDQ4IH0sCisJCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMSwgMHgzRCB9LAorCQl7IEFVRF9RQU1fTU9ERSwgICAgICAgICAgIDB4MDAgfSwKKwkJeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAweGY1IH0sCisJCXsgQVVEX1BIQUNDX0ZSRVFfOE1TQiwgICAgMHgzYSB9LAorCQl7IEFVRF9QSEFDQ19GUkVRXzhMU0IsICAgIDB4NGEgfSwKIAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSEdBSU5fUiwgMHg2NjgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBITlVNRVIxX1IsIDB4MzUzREUgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9ERUVNUEhOVU1FUjJfUiwgMHgxQjEgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9ERUVNUEhERU5PTTFfUiwgMHgwRjNEMCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSERFTk9NMl9SLCAweDAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9GTV9NT0RFX0VOQUJMRSwgMHg3IH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUE9MWVBIODBTQ0FMRUZBQywgMHgzIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfQUZFXzEyREJfRU4sIDB4MSB9LAotICAgICAgICAgICAgICAgIHsgQUFHQ19HQUlOLCAweDAgfSwKLSAgICAgICAgICAgICAgICB7IEFBR0NfSFlTVCwgMHgxOCB9LAotICAgICAgICAgICAgICAgIHsgQUFHQ19ERUYsIDB4MjAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9ETjBfRlJFUSwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUE9MWTBfRERTX0NPTlNUQU5ULCAweDBFNERCMiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RDT0NfMF9TUkMsIDB4MjEgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9JSVIxXzBfU0VMLCAweDAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9JSVIxXzBfU0hJRlQsIDB4NyB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0lJUjFfMV9TRUwsIDB4MiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0lJUjFfMV9TSElGVCwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfRENPQ18xX1NSQywgMHgzIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfRENPQzFfU0hJRlQsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RDT0NfUEFTU19JTiwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfSUlSMV8yX1NFTCwgMHgyMyB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0lJUjFfMl9TSElGVCwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfSUlSMV8zX1NFTCwgMHg0IH0sCi0gICAgICAgICAgICAgICAgeyBBVURfSUlSMV8zX1NISUZULCAweDcgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9JSVIxXzRfU0VMLCAweDUgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9JSVIxXzRfU0hJRlQsIDB4NyB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0lJUjNfMF9TRUwsIDB4NyB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0lJUjNfMF9TSElGVCwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMF9TUkNfU0VMLCAweDExIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMF9TSElGVCwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMF9HMCwgMHg3MDAwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMF9BMCwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMF9CMCwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMF9BMSwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMF9CMSwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMV9TUkNfU0VMLCAweDExIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMV9TSElGVCwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMV9HMCwgMHg3MDAwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMV9BMCwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMV9CMCwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMV9BMSwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIMV9CMSwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfT1VUMF9TRUwsIDB4M0YgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9PVVQxX1NFTCwgMHgzRiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RNRF9SQV9ERFMsIDB4MEY1QzI4NSB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1BMTF9JTlQsIDB4MUUgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9QTExfRERTLCAweDAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9QTExfRlJBQywgMHgwRTU0MiB9LAorCQl7IEFVRF9ERUVNUEhHQUlOX1IsIDB4NjY4MCB9LAorCQl7IEFVRF9ERUVNUEhOVU1FUjFfUiwgMHgzNTNERSB9LAorCQl7IEFVRF9ERUVNUEhOVU1FUjJfUiwgMHgxQjEgfSwKKwkJeyBBVURfREVFTVBIREVOT00xX1IsIDB4MEYzRDAgfSwKKwkJeyBBVURfREVFTVBIREVOT00yX1IsIDB4MCB9LAorCQl7IEFVRF9GTV9NT0RFX0VOQUJMRSwgMHg3IH0sCisJCXsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsIDB4MyB9LAorCQl7IEFVRF9BRkVfMTJEQl9FTiwgMHgxIH0sCisJCXsgQUFHQ19HQUlOLCAweDAgfSwKKwkJeyBBQUdDX0hZU1QsIDB4MTggfSwKKwkJeyBBQUdDX0RFRiwgMHgyMCB9LAorCQl7IEFVRF9ETjBfRlJFUSwgMHgwIH0sCisJCXsgQVVEX1BPTFkwX0REU19DT05TVEFOVCwgMHgwRTREQjIgfSwKKwkJeyBBVURfRENPQ18wX1NSQywgMHgyMSB9LAorCQl7IEFVRF9JSVIxXzBfU0VMLCAweDAgfSwKKwkJeyBBVURfSUlSMV8wX1NISUZULCAweDcgfSwKKwkJeyBBVURfSUlSMV8xX1NFTCwgMHgyIH0sCisJCXsgQVVEX0lJUjFfMV9TSElGVCwgMHgwIH0sCisJCXsgQVVEX0RDT0NfMV9TUkMsIDB4MyB9LAorCQl7IEFVRF9EQ09DMV9TSElGVCwgMHgwIH0sCisJCXsgQVVEX0RDT0NfUEFTU19JTiwgMHgwIH0sCisJCXsgQVVEX0lJUjFfMl9TRUwsIDB4MjMgfSwKKwkJeyBBVURfSUlSMV8yX1NISUZULCAweDAgfSwKKwkJeyBBVURfSUlSMV8zX1NFTCwgMHg0IH0sCisJCXsgQVVEX0lJUjFfM19TSElGVCwgMHg3IH0sCisJCXsgQVVEX0lJUjFfNF9TRUwsIDB4NSB9LAorCQl7IEFVRF9JSVIxXzRfU0hJRlQsIDB4NyB9LAorCQl7IEFVRF9JSVIzXzBfU0VMLCAweDcgfSwKKwkJeyBBVURfSUlSM18wX1NISUZULCAweDAgfSwKKwkJeyBBVURfREVFTVBIMF9TUkNfU0VMLCAweDExIH0sCisJCXsgQVVEX0RFRU1QSDBfU0hJRlQsIDB4MCB9LAorCQl7IEFVRF9ERUVNUEgwX0cwLCAweDcwMDAgfSwKKwkJeyBBVURfREVFTVBIMF9BMCwgMHgwIH0sCisJCXsgQVVEX0RFRU1QSDBfQjAsIDB4MCB9LAorCQl7IEFVRF9ERUVNUEgwX0ExLCAweDAgfSwKKwkJeyBBVURfREVFTVBIMF9CMSwgMHgwIH0sCisJCXsgQVVEX0RFRU1QSDFfU1JDX1NFTCwgMHgxMSB9LAorCQl7IEFVRF9ERUVNUEgxX1NISUZULCAweDAgfSwKKwkJeyBBVURfREVFTVBIMV9HMCwgMHg3MDAwIH0sCisJCXsgQVVEX0RFRU1QSDFfQTAsIDB4MCB9LAorCQl7IEFVRF9ERUVNUEgxX0IwLCAweDAgfSwKKwkJeyBBVURfREVFTVBIMV9BMSwgMHgwIH0sCisJCXsgQVVEX0RFRU1QSDFfQjEsIDB4MCB9LAorCQl7IEFVRF9PVVQwX1NFTCwgMHgzRiB9LAorCQl7IEFVRF9PVVQxX1NFTCwgMHgzRiB9LAorCQl7IEFVRF9ETURfUkFfRERTLCAweDBGNUMyODUgfSwKKwkJeyBBVURfUExMX0lOVCwgMHgxRSB9LAorCQl7IEFVRF9QTExfRERTLCAweDAgfSwKKwkJeyBBVURfUExMX0ZSQUMsIDB4MEU1NDIgfSwKIAotICAgICAgICAgICAgICAgIC8vIHNldHVwIFFBTSByZWdpc3RlcnMKLSAgICAgICAgICAgICAgICB7IEFVRF9SQVRFX0FESjEsICAgICAgMHgwMDAwMDEwMCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKMiwgICAgICAweDAwMDAwMjAwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUkFURV9BREozLCAgICAgIDB4MDAwMDAzMDAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9SQVRFX0FESjQsICAgICAgMHgwMDAwMDQwMCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKNSwgICAgICAweDAwMDAwNTAwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUkFURV9USFJFU19ETUQsIDB4MDAwMDAwQzAgfSwKLSAgICAgICAgICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0sCi0gICAgICAgIH07CisJCS8vIHNldHVwIFFBTSByZWdpc3RlcnMKKwkJeyBBVURfUkFURV9BREoxLCAgICAgIDB4MDAwMDAxMDAgfSwKKwkJeyBBVURfUkFURV9BREoyLCAgICAgIDB4MDAwMDAyMDAgfSwKKwkJeyBBVURfUkFURV9BREozLCAgICAgIDB4MDAwMDAzMDAgfSwKKwkJeyBBVURfUkFURV9BREo0LCAgICAgIDB4MDAwMDA0MDAgfSwKKwkJeyBBVURfUkFURV9BREo1LCAgICAgIDB4MDAwMDA1MDAgfSwKKwkJeyBBVURfUkFURV9USFJFU19ETUQsIDB4MDAwMDAwQzAgfSwKKwkJeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorCX07CiAKLSAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBuaWNhbV9sW10gPSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dXAgUUFNIHJlZ2lzdGVycwotICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKMSwgMHgwMDAwMDA2MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKMiwgMHgwMDAwMDBGOSB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKMywgMHgwMDAwMDFDQyB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKNCwgMHgwMDAwMDJCMyB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKNSwgMHgwMDAwMDcyNiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSERFTk9NMV9SLCAweDAwMDBGM0QwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIREVOT00yX1IsIDB4MDAwMDAwMDAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9FUlJMT0dQRVJJT0RfUiwgMHgwMDAwMDA2NCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDFfUiwgMHgwMDAwMEZGRiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDJfUiwgMHgwMDAwMDAxRiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDNfUiwgMHgwMDAwMDAwRiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsIDB4MDAwMDAwMDMgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9ETURfUkFfRERTLCAweDAwQzAwMDAwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUExMX0lOVCwgMHgwMDAwMDAxRSB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1BMTF9ERFMsIDB4MDAwMDAwMDAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9QTExfRlJBQywgMHgwMDAwRTU0MiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1NUQVJUX1RJTUVSLCAweDAwMDAwMDAwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBITlVNRVIxX1IsIDB4MDAwMzUzREUgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9ERUVNUEhOVU1FUjJfUiwgMHgwMDAwMDFCMSB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMiwgMHgwNiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMSwgMHg4MiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1FBTV9NT0RFLCAweDA1IH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAweDEyIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUEhBQ0NfRlJFUV84TVNCLCAweDM0IH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUEhBQ0NfRlJFUV84TFNCLCAweDRDIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIR0FJTl9SLCAweDAwMDA2NjgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUkFURV9USFJFU19ETUQsIDB4MDAwMDAwQzAgIH0sCi0gICAgICAgICAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAotICAgICAgICB9IDsKLSAgICAgICAgZHByaW50aygiJXMgKHN0YXR1czogZGV2ZWwpLCBzdGVyZW8gOiAlZFxuIixfX0ZVTkNUSU9OX18sc3RlcmVvKTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IG5pY2FtX2xbXSA9IHsKKwkJLy8gc2V0dXAgUUFNIHJlZ2lzdGVycworCQl7IEFVRF9SQVRFX0FESjEsIDB4MDAwMDAwNjAgfSwKKwkJeyBBVURfUkFURV9BREoyLCAweDAwMDAwMEY5IH0sCisJCXsgQVVEX1JBVEVfQURKMywgMHgwMDAwMDFDQyB9LAorCQl7IEFVRF9SQVRFX0FESjQsIDB4MDAwMDAyQjMgfSwKKwkJeyBBVURfUkFURV9BREo1LCAweDAwMDAwNzI2IH0sCisJCXsgQVVEX0RFRU1QSERFTk9NMV9SLCAweDAwMDBGM0QwIH0sCisJCXsgQVVEX0RFRU1QSERFTk9NMl9SLCAweDAwMDAwMDAwIH0sCisJCXsgQVVEX0VSUkxPR1BFUklPRF9SLCAweDAwMDAwMDY0IH0sCisJCXsgQVVEX0VSUklOVFJQVFRIU0hMRDFfUiwgMHgwMDAwMEZGRiB9LAorCQl7IEFVRF9FUlJJTlRSUFRUSFNITEQyX1IsIDB4MDAwMDAwMUYgfSwKKwkJeyBBVURfRVJSSU5UUlBUVEhTSExEM19SLCAweDAwMDAwMDBGIH0sCisJCXsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsIDB4MDAwMDAwMDMgfSwKKwkJeyBBVURfRE1EX1JBX0REUywgMHgwMEMwMDAwMCB9LAorCQl7IEFVRF9QTExfSU5ULCAweDAwMDAwMDFFIH0sCisJCXsgQVVEX1BMTF9ERFMsIDB4MDAwMDAwMDAgfSwKKwkJeyBBVURfUExMX0ZSQUMsIDB4MDAwMEU1NDIgfSwKKwkJeyBBVURfU1RBUlRfVElNRVIsIDB4MDAwMDAwMDAgfSwKKwkJeyBBVURfREVFTVBITlVNRVIxX1IsIDB4MDAwMzUzREUgfSwKKwkJeyBBVURfREVFTVBITlVNRVIyX1IsIDB4MDAwMDAxQjEgfSwKKwkJeyBBVURfUERGX0REU19DTlNUX0JZVEUyLCAweDA2IH0sCisJCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMSwgMHg4MiB9LAorCQl7IEFVRF9RQU1fTU9ERSwgMHgwNSB9LAorCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTAsIDB4MTIgfSwKKwkJeyBBVURfUEhBQ0NfRlJFUV84TVNCLCAweDM0IH0sCisJCXsgQVVEX1BIQUNDX0ZSRVFfOExTQiwgMHg0QyB9LAorCQl7IEFVRF9ERUVNUEhHQUlOX1IsIDB4MDAwMDY2ODAgfSwKKwkJeyBBVURfUkFURV9USFJFU19ETUQsIDB4MDAwMDAwQzAgIH0sCisJCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKKwl9IDsKKwlkcHJpbnRrKCIlcyAoc3RhdHVzOiBkZXZlbCksIHN0ZXJlbyA6ICVkXG4iLF9fRlVOQ1RJT05fXyxzdGVyZW8pOwogCi0gICAgICAgIGlmICghc3RlcmVvKSB7Ci0JCS8qIEFNIG1vbm8gc291bmQgKi8KLSAgICAgICAgICAgICAgICBzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDA0LAotCQkJCTB4MTAwYyAvKiBGSVhNRSBhZ2FpbiAqLyk7Ci0gICAgICAgICAgICAgICAgc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBuaWNhbV9sX21vbm8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldF9hdWRpb19zdGFydChjb3JlLCAweDAwMTAsCi0JCQkJMHgxOTI0IC8qIEZJWE1FIGFnYWluICovKTsKLSAgICAgICAgICAgICAgICBzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIG5pY2FtX2wpOwotICAgICAgICB9Ci0gICAgICAgIHNldF9hdWRpb19maW5pc2goY29yZSk7Ci0KKwlpZiAoIXN0ZXJlbykgeworCS8qIEFNIE1vbm8gKi8KKwkJc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIFNFTF9BMik7CisJCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgbmljYW1fbF9tb25vKTsKKwlzZXRfYXVkaW9fZmluaXNoKGNvcmUsIEVOX0EyX0ZPUkNFX01PTk8xKTsKKwl9IGVsc2UgeworCS8qIE5pY2FtIFN0ZXJlbyAqLworCQlzZXRfYXVkaW9fc3RhcnQoY29yZSwgU0VMX05JQ0FNKTsKKwkJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBuaWNhbV9sKTsKKwlzZXRfYXVkaW9fZmluaXNoKGNvcmUsIDB4MTkyNCk7IC8qIEZJWE1FICovCisJfQogfQogCiBzdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhbmRhcmRfUEFMX0koc3RydWN0IGN4ODhfY29yZSAqY29yZSwgaW50IHN0ZXJlbykKIHsKICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IHBhbF9pX2ZtX21vbm9bXSA9IHsKLSAgICAgICAgICAgIHtBVURfRVJSTE9HUEVSSU9EX1IsICAgICAgIDB4MDAwMDAwNjR9LAotICAgICAgICAgICAge0FVRF9FUlJJTlRSUFRUSFNITEQxX1IsICAgMHgwMDAwMGZmZn0sCi0gICAgICAgICAgICB7QVVEX0VSUklOVFJQVFRIU0hMRDJfUiwgICAweDAwMDAwMDFmfSwKLSAgICAgICAgICAgIHtBVURfRVJSSU5UUlBUVEhTSExEM19SLCAgIDB4MDAwMDAwMGZ9LAotICAgICAgICAgICAge0FVRF9QREZfRERTX0NOU1RfQllURTIsICAgMHgwNn0sCi0gICAgICAgICAgICB7QVVEX1BERl9ERFNfQ05TVF9CWVRFMSwgICAweDgyfSwKLSAgICAgICAgICAgIHtBVURfUERGX0REU19DTlNUX0JZVEUwLCAgIDB4MTJ9LAotICAgICAgICAgICAge0FVRF9RQU1fTU9ERSwgICAgICAgICAgICAgMHgwNX0sCi0gICAgICAgICAgICB7QVVEX1BIQUNDX0ZSRVFfOE1TQiwgICAgICAweDNhfSwKLSAgICAgICAgICAgIHtBVURfUEhBQ0NfRlJFUV84TFNCLCAgICAgIDB4OTN9LAotICAgICAgICAgICAge0FVRF9ETURfUkFfRERTLCAgICAgICAgICAgMHgwMDJhNGYyZn0sCi0gICAgICAgICAgICB7QVVEX1BMTF9JTlQsICAgICAgICAgICAgICAweDAwMDAwMDFlfSwKLSAgICAgICAgICAgIHtBVURfUExMX0REUywgICAgICAgICAgICAgIDB4MDAwMDAwMDR9LAotICAgICAgICAgICAge0FVRF9QTExfRlJBQywgICAgICAgICAgICAgMHgwMDAwZTU0Mn0sCi0gICAgICAgICAgICB7QVVEX1JBVEVfQURKMSwgICAgICAgICAgICAweDAwMDAwMTAwfSwKLSAgICAgICAgICAgIHtBVURfUkFURV9BREoyLCAgICAgICAgICAgIDB4MDAwMDAyMDB9LAotICAgICAgICAgICAge0FVRF9SQVRFX0FESjMsICAgICAgICAgICAgMHgwMDAwMDMwMH0sCi0gICAgICAgICAgICB7QVVEX1JBVEVfQURKNCwgICAgICAgICAgICAweDAwMDAwNDAwfSwKLSAgICAgICAgICAgIHtBVURfUkFURV9BREo1LCAgICAgICAgICAgIDB4MDAwMDA1MDB9LAotICAgICAgICAgICAge0FVRF9USFJfRlIsICAgICAgICAgICAgICAgMHgwMDAwMDAwMH0sCi0gICAgICAgICAgICB7QVVEX1BJTE9UX0JRRF8xX0swLCAgICAgICAweDAwMDA3NTVifSwKLSAgICAgICAgICAgIHtBVURfUElMT1RfQlFEXzFfSzEsICAgICAgIDB4MDA1NTEzNDB9LAotICAgICAgICAgICAge0FVRF9QSUxPVF9CUURfMV9LMiwgICAgICAgMHgwMDZkMzBiZX0sCi0gICAgICAgICAgICB7QVVEX1BJTE9UX0JRRF8xX0szLCAgICAgICAweGZmZDM5NGFmfSwKLSAgICAgICAgICAgIHtBVURfUElMT1RfQlFEXzFfSzQsICAgICAgIDB4MDA0MDAwMDB9LAotICAgICAgICAgICAge0FVRF9QSUxPVF9CUURfMl9LMCwgICAgICAgMHgwMDA0MDAwMH0sCi0gICAgICAgICAgICB7QVVEX1BJTE9UX0JRRF8yX0sxLCAgICAgICAweDAwMmE0ODQxfSwKLSAgICAgICAgICAgIHtBVURfUElMT1RfQlFEXzJfSzIsICAgICAgIDB4MDA0MDAwMDB9LAotICAgICAgICAgICAge0FVRF9QSUxPVF9CUURfMl9LMywgICAgICAgMHgwMDAwMDAwMH0sCi0gICAgICAgICAgICB7QVVEX1BJTE9UX0JRRF8yX0s0LCAgICAgICAweDAwMDAwMDAwfSwKLSAgICAgICAgICAgIHtBVURfTU9ERV9DSEdfVElNRVIsICAgICAgIDB4MDAwMDAwNjB9LAotICAgICAgICAgICAge0FVRF9BRkVfMTJEQl9FTiwgICAgICAgICAgMHgwMDAwMDAwMX0sCi0gICAgICAgICAgICB7QUFHQ19IWVNULCAgICAgICAgICAgICAgICAweDAwMDAwMDBhfSwKLSAgICAgICAgICAgIHtBVURfQ09SRElDX1NISUZUXzAsICAgICAgIDB4MDAwMDAwMDd9LAotICAgICAgICAgICAge0FVRF9DT1JESUNfU0hJRlRfMSwgICAgICAgMHgwMDAwMDAwN30sCi0gICAgICAgICAgICB7QVVEX0MxX1VQX1RIUiwgICAgICAgICAgICAweDAwMDA3MDAwfSwKLSAgICAgICAgICAgIHtBVURfQzFfTE9fVEhSLCAgICAgICAgICAgIDB4MDAwMDU0MDB9LAotICAgICAgICAgICAge0FVRF9DMl9VUF9USFIsICAgICAgICAgICAgMHgwMDAwNTQwMH0sCi0gICAgICAgICAgICB7QVVEX0MyX0xPX1RIUiwgICAgICAgICAgICAweDAwMDAzMDAwfSwKLSAgICAgICAgICAgIHtBVURfRENPQ18wX1NSQywgICAgICAgICAgIDB4MDAwMDAwMWF9LAotICAgICAgICAgICAge0FVRF9EQ09DMF9TSElGVCwgICAgICAgICAgMHgwMDAwMDAwMH0sCi0gICAgICAgICAgICB7QVVEX0RDT0NfMF9TSElGVF9JTjAsICAgICAweDAwMDAwMDBhfSwKLSAgICAgICAgICAgIHtBVURfRENPQ18wX1NISUZUX0lOMSwgICAgIDB4MDAwMDAwMDh9LAotICAgICAgICAgICAge0FVRF9EQ09DX1BBU1NfSU4sICAgICAgICAgMHgwMDAwMDAwM30sCi0gICAgICAgICAgICB7QVVEX0lJUjNfMF9TRUwsICAgICAgICAgICAweDAwMDAwMDIxfSwKLSAgICAgICAgICAgIHtBVURfRE4yX0FGQywgICAgICAgICAgICAgIDB4MDAwMDAwMDJ9LAotICAgICAgICAgICAge0FVRF9EQ09DXzFfU1JDLCAgICAgICAgICAgMHgwMDAwMDAxYn0sCi0gICAgICAgICAgICB7QVVEX0RDT0MxX1NISUZULCAgICAgICAgICAweDAwMDAwMDAwfSwKLSAgICAgICAgICAgIHtBVURfRENPQ18xX1NISUZUX0lOMCwgICAgIDB4MDAwMDAwMGF9LAotICAgICAgICAgICAge0FVRF9EQ09DXzFfU0hJRlRfSU4xLCAgICAgMHgwMDAwMDAwOH0sCi0gICAgICAgICAgICB7QVVEX0lJUjNfMV9TRUwsICAgICAgICAgICAweDAwMDAwMDIzfSwKLSAgICAgICAgICAgIHtBVURfRE4wX0ZSRVEsICAgICAgICAgICAgIDB4MDAwMDM1YTN9LAotICAgICAgICAgICAge0FVRF9ETjJfRlJFUSwgICAgICAgICAgICAgMHgwMDAwMjljN30sCi0gICAgICAgICAgICB7QVVEX0NSREMwX1NSQ19TRUwsICAgICAgICAweDAwMDAwNTExfSwKLSAgICAgICAgICAgIHtBVURfSUlSMV8wX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMDF9LAotICAgICAgICAgICAge0FVRF9JSVIxXzFfU0VMLCAgICAgICAgICAgMHgwMDAwMDAwMH0sCi0gICAgICAgICAgICB7QVVEX0lJUjNfMl9TRUwsICAgICAgICAgICAweDAwMDAwMDAzfSwKLSAgICAgICAgICAgIHtBVURfSUlSM18yX1NISUZULCAgICAgICAgIDB4MDAwMDAwMDB9LAotICAgICAgICAgICAge0FVRF9JSVIzXzBfU0VMLCAgICAgICAgICAgMHgwMDAwMDAwMn0sCi0gICAgICAgICAgICB7QVVEX0lJUjJfMF9TRUwsICAgICAgICAgICAweDAwMDAwMDIxfSwKLSAgICAgICAgICAgIHtBVURfSUlSMl8wX1NISUZULCAgICAgICAgIDB4MDAwMDAwMDJ9LAotICAgICAgICAgICAge0FVRF9ERUVNUEgwX1NSQ19TRUwsICAgICAgMHgwMDAwMDAwYn0sCi0gICAgICAgICAgICB7QVVEX0RFRU1QSDFfU1JDX1NFTCwgICAgICAweDAwMDAwMDBifSwKLSAgICAgICAgICAgIHtBVURfUE9MWVBIODBTQ0FMRUZBQywgICAgIDB4MDAwMDAwMDF9LAotICAgICAgICAgICAge0FVRF9TVEFSVF9USU1FUiwgICAgICAgICAgMHgwMDAwMDAwMH0sCi0gICAgICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0sCisJe0FVRF9FUlJMT0dQRVJJT0RfUiwgICAgICAgMHgwMDAwMDA2NH0sCisJe0FVRF9FUlJJTlRSUFRUSFNITEQxX1IsICAgMHgwMDAwMGZmZn0sCisJe0FVRF9FUlJJTlRSUFRUSFNITEQyX1IsICAgMHgwMDAwMDAxZn0sCisJe0FVRF9FUlJJTlRSUFRUSFNITEQzX1IsICAgMHgwMDAwMDAwZn0sCisJe0FVRF9QREZfRERTX0NOU1RfQllURTIsICAgMHgwNn0sCisJe0FVRF9QREZfRERTX0NOU1RfQllURTEsICAgMHg4Mn0sCisJe0FVRF9QREZfRERTX0NOU1RfQllURTAsICAgMHgxMn0sCisJe0FVRF9RQU1fTU9ERSwgICAgICAgICAgICAgMHgwNX0sCisJe0FVRF9QSEFDQ19GUkVRXzhNU0IsICAgICAgMHgzYX0sCisJe0FVRF9QSEFDQ19GUkVRXzhMU0IsICAgICAgMHg5M30sCisJe0FVRF9ETURfUkFfRERTLCAgICAgICAgICAgMHgwMDJhNGYyZn0sCisJe0FVRF9QTExfSU5ULCAgICAgICAgICAgICAgMHgwMDAwMDAxZX0sCisJe0FVRF9QTExfRERTLCAgICAgICAgICAgICAgMHgwMDAwMDAwNH0sCisJe0FVRF9QTExfRlJBQywgICAgICAgICAgICAgMHgwMDAwZTU0Mn0sCisJe0FVRF9SQVRFX0FESjEsICAgICAgICAgICAgMHgwMDAwMDEwMH0sCisJe0FVRF9SQVRFX0FESjIsICAgICAgICAgICAgMHgwMDAwMDIwMH0sCisJe0FVRF9SQVRFX0FESjMsICAgICAgICAgICAgMHgwMDAwMDMwMH0sCisJe0FVRF9SQVRFX0FESjQsICAgICAgICAgICAgMHgwMDAwMDQwMH0sCisJe0FVRF9SQVRFX0FESjUsICAgICAgICAgICAgMHgwMDAwMDUwMH0sCisJe0FVRF9USFJfRlIsICAgICAgICAgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9QSUxPVF9CUURfMV9LMCwgICAgICAgMHgwMDAwNzU1Yn0sCisJe0FVRF9QSUxPVF9CUURfMV9LMSwgICAgICAgMHgwMDU1MTM0MH0sCisJe0FVRF9QSUxPVF9CUURfMV9LMiwgICAgICAgMHgwMDZkMzBiZX0sCisJe0FVRF9QSUxPVF9CUURfMV9LMywgICAgICAgMHhmZmQzOTRhZn0sCisJe0FVRF9QSUxPVF9CUURfMV9LNCwgICAgICAgMHgwMDQwMDAwMH0sCisJe0FVRF9QSUxPVF9CUURfMl9LMCwgICAgICAgMHgwMDA0MDAwMH0sCisJe0FVRF9QSUxPVF9CUURfMl9LMSwgICAgICAgMHgwMDJhNDg0MX0sCisJe0FVRF9QSUxPVF9CUURfMl9LMiwgICAgICAgMHgwMDQwMDAwMH0sCisJe0FVRF9QSUxPVF9CUURfMl9LMywgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9QSUxPVF9CUURfMl9LNCwgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9NT0RFX0NIR19USU1FUiwgICAgICAgMHgwMDAwMDA2MH0sCisJe0FVRF9BRkVfMTJEQl9FTiwgICAgICAgICAgMHgwMDAwMDAwMX0sCisJe0FBR0NfSFlTVCwgICAgICAgICAgICAgICAgMHgwMDAwMDAwYX0sCisJe0FVRF9DT1JESUNfU0hJRlRfMCwgICAgICAgMHgwMDAwMDAwN30sCisJe0FVRF9DT1JESUNfU0hJRlRfMSwgICAgICAgMHgwMDAwMDAwN30sCisJe0FVRF9DMV9VUF9USFIsICAgICAgICAgICAgMHgwMDAwNzAwMH0sCisJe0FVRF9DMV9MT19USFIsICAgICAgICAgICAgMHgwMDAwNTQwMH0sCisJe0FVRF9DMl9VUF9USFIsICAgICAgICAgICAgMHgwMDAwNTQwMH0sCisJe0FVRF9DMl9MT19USFIsICAgICAgICAgICAgMHgwMDAwMzAwMH0sCisJe0FVRF9EQ09DXzBfU1JDLCAgICAgICAgICAgMHgwMDAwMDAxYX0sCisJe0FVRF9EQ09DMF9TSElGVCwgICAgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9EQ09DXzBfU0hJRlRfSU4wLCAgICAgMHgwMDAwMDAwYX0sCisJe0FVRF9EQ09DXzBfU0hJRlRfSU4xLCAgICAgMHgwMDAwMDAwOH0sCisJe0FVRF9EQ09DX1BBU1NfSU4sICAgICAgICAgMHgwMDAwMDAwM30sCisJe0FVRF9JSVIzXzBfU0VMLCAgICAgICAgICAgMHgwMDAwMDAyMX0sCisJe0FVRF9ETjJfQUZDLCAgICAgICAgICAgICAgMHgwMDAwMDAwMn0sCisJe0FVRF9EQ09DXzFfU1JDLCAgICAgICAgICAgMHgwMDAwMDAxYn0sCisJe0FVRF9EQ09DMV9TSElGVCwgICAgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9EQ09DXzFfU0hJRlRfSU4wLCAgICAgMHgwMDAwMDAwYX0sCisJe0FVRF9EQ09DXzFfU0hJRlRfSU4xLCAgICAgMHgwMDAwMDAwOH0sCisJe0FVRF9JSVIzXzFfU0VMLCAgICAgICAgICAgMHgwMDAwMDAyM30sCisJe0FVRF9ETjBfRlJFUSwgICAgICAgICAgICAgMHgwMDAwMzVhM30sCisJe0FVRF9ETjJfRlJFUSwgICAgICAgICAgICAgMHgwMDAwMjljN30sCisJe0FVRF9DUkRDMF9TUkNfU0VMLCAgICAgICAgMHgwMDAwMDUxMX0sCisJe0FVRF9JSVIxXzBfU0VMLCAgICAgICAgICAgMHgwMDAwMDAwMX0sCisJe0FVRF9JSVIxXzFfU0VMLCAgICAgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9JSVIzXzJfU0VMLCAgICAgICAgICAgMHgwMDAwMDAwM30sCisJe0FVRF9JSVIzXzJfU0hJRlQsICAgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9JSVIzXzBfU0VMLCAgICAgICAgICAgMHgwMDAwMDAwMn0sCisJe0FVRF9JSVIyXzBfU0VMLCAgICAgICAgICAgMHgwMDAwMDAyMX0sCisJe0FVRF9JSVIyXzBfU0hJRlQsICAgICAgICAgMHgwMDAwMDAwMn0sCisJe0FVRF9ERUVNUEgwX1NSQ19TRUwsICAgICAgMHgwMDAwMDAwYn0sCisJe0FVRF9ERUVNUEgxX1NSQ19TRUwsICAgICAgMHgwMDAwMDAwYn0sCisJe0FVRF9QT0xZUEg4MFNDQUxFRkFDLCAgICAgMHgwMDAwMDAwMX0sCisJe0FVRF9TVEFSVF9USU1FUiwgICAgICAgICAgMHgwMDAwMDAwMH0sCisJeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAogICAgICAgIH07CiAKICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IHBhbF9pX25pY2FtW10gPSB7Ci0gICAgICAgICAgIHsgQVVEX1JBVEVfQURKMSwgICAgICAgICAgIDB4MDAwMDAwMTAgfSwKLSAgICAgICAgICAgeyBBVURfUkFURV9BREoyLCAgICAgICAgICAgMHgwMDAwMDA0MCB9LAotICAgICAgICAgICB7IEFVRF9SQVRFX0FESjMsICAgICAgICAgICAweDAwMDAwMTAwIH0sCi0gICAgICAgICAgIHsgQVVEX1JBVEVfQURKNCwgICAgICAgICAgIDB4MDAwMDA0MDAgfSwKLSAgICAgICAgICAgeyBBVURfUkFURV9BREo1LCAgICAgICAgICAgMHgwMDAwMTAwMCB9LAotCSAgIC8vICAgICB7IEFVRF9ETURfUkFfRERTLCAgICAgICAgICAweDAwYzBkNWNlIH0sCi0JICAgeyBBVURfREVFTVBIR0FJTl9SLCAgICAgICAgMHgwMDAwMjNjMiB9LAotCSAgIHsgQVVEX0RFRU1QSE5VTUVSMV9SLCAgICAgIDB4MDAwMmE3YmMgfSwKLQkgICB7IEFVRF9ERUVNUEhOVU1FUjJfUiwgICAgICAweDAwMDMwMjNlIH0sCi0JICAgeyBBVURfREVFTVBIREVOT00xX1IsICAgICAgMHgwMDAwZjNkMCB9LAotCSAgIHsgQVVEX0RFRU1QSERFTk9NMl9SLCAgICAgIDB4MDAwMDAwMDAgfSwKLQkgICB7IEFVRF9ERUVNUEhERU5PTTJfUiwgICAgICAweDAwMDAwMDAwIH0sCi0JICAgeyBBVURfRVJSTE9HUEVSSU9EX1IsICAgICAgMHgwMDAwMGZmZiB9LAotCSAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDFfUiwgIDB4MDAwMDAzZmYgfSwKLQkgICB7IEFVRF9FUlJJTlRSUFRUSFNITEQyX1IsICAweDAwMDAwMGZmIH0sCi0JICAgeyBBVURfRVJSSU5UUlBUVEhTSExEM19SLCAgMHgwMDAwMDAzZiB9LAotCSAgIHsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsICAgIDB4MDAwMDAwMDMgfSwKLQkgICB7IEFVRF9QREZfRERTX0NOU1RfQllURTIsICAweDA2IH0sCi0JICAgeyBBVURfUERGX0REU19DTlNUX0JZVEUxLCAgMHg4MiB9LAotCSAgIHsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgIDB4MTYgfSwKLQkgICB7IEFVRF9RQU1fTU9ERSwgICAgICAgICAgICAweDA1IH0sCi0JICAgeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAgMHgxMiB9LAotCSAgIHsgQVVEX1BIQUNDX0ZSRVFfOE1TQiwgICAgIDB4M2EgfSwKLQkgICB7IEFVRF9QSEFDQ19GUkVRXzhMU0IsICAgICAweDkzIH0sCi0gICAgICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0sCi0gICAgICAgIH07CisJeyBBVURfUkFURV9BREoxLCAgICAgICAgICAgMHgwMDAwMDAxMCB9LAorCXsgQVVEX1JBVEVfQURKMiwgICAgICAgICAgIDB4MDAwMDAwNDAgfSwKKwl7IEFVRF9SQVRFX0FESjMsICAgICAgICAgICAweDAwMDAwMTAwIH0sCisJeyBBVURfUkFURV9BREo0LCAgICAgICAgICAgMHgwMDAwMDQwMCB9LAorCXsgQVVEX1JBVEVfQURKNSwgICAgICAgICAgIDB4MDAwMDEwMDAgfSwKKwkvLyAgICAgeyBBVURfRE1EX1JBX0REUywgICAgICAgICAgMHgwMGMwZDVjZSB9LAorCXsgQVVEX0RFRU1QSEdBSU5fUiwgICAgICAgIDB4MDAwMDIzYzIgfSwKKwl7IEFVRF9ERUVNUEhOVU1FUjFfUiwgICAgICAweDAwMDJhN2JjIH0sCisJeyBBVURfREVFTVBITlVNRVIyX1IsICAgICAgMHgwMDAzMDIzZSB9LAorCXsgQVVEX0RFRU1QSERFTk9NMV9SLCAgICAgIDB4MDAwMGYzZDAgfSwKKwl7IEFVRF9ERUVNUEhERU5PTTJfUiwgICAgICAweDAwMDAwMDAwIH0sCisJeyBBVURfREVFTVBIREVOT00yX1IsICAgICAgMHgwMDAwMDAwMCB9LAorCXsgQVVEX0VSUkxPR1BFUklPRF9SLCAgICAgIDB4MDAwMDBmZmYgfSwKKwl7IEFVRF9FUlJJTlRSUFRUSFNITEQxX1IsICAweDAwMDAwM2ZmIH0sCisJeyBBVURfRVJSSU5UUlBUVEhTSExEMl9SLCAgMHgwMDAwMDBmZiB9LAorCXsgQVVEX0VSUklOVFJQVFRIU0hMRDNfUiwgIDB4MDAwMDAwM2YgfSwKKwl7IEFVRF9QT0xZUEg4MFNDQUxFRkFDLCAgICAweDAwMDAwMDAzIH0sCisJeyBBVURfUERGX0REU19DTlNUX0JZVEUyLCAgMHgwNiB9LAorCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMSwgIDB4ODIgfSwKKwl7IEFVRF9QREZfRERTX0NOU1RfQllURTAsICAweDE2IH0sCisJeyBBVURfUUFNX01PREUsICAgICAgICAgICAgMHgwNSB9LAorCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgIDB4MTIgfSwKKwl7IEFVRF9QSEFDQ19GUkVRXzhNU0IsICAgICAweDNhIH0sCisJeyBBVURfUEhBQ0NfRlJFUV84TFNCLCAgICAgMHg5MyB9LAorCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKKwl9OwogCi0gICAgICAgIGRwcmludGsoIiVzIChzdGF0dXM6IGRldmVsKSwgc3RlcmVvIDogJWRcbiIsX19GVU5DVElPTl9fLHN0ZXJlbyk7CisJZHByaW50aygiJXMgKHN0YXR1czogZGV2ZWwpLCBzdGVyZW8gOiAlZFxuIixfX0ZVTkNUSU9OX18sc3RlcmVvKTsKIAotICAgICAgICBpZiAoIXN0ZXJlbykgewotCQkvLyBGTSBtb25vCi0JCXNldF9hdWRpb19zdGFydChjb3JlLCAweDAwMDQsIEVOX0RNVFJYX1NVTURJRkYgfCBFTl9BMl9GT1JDRV9NT05PMSk7CisJaWYgKCFzdGVyZW8pIHsKKwkvKiBGTSBNb25vICovCisJc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIFNFTF9BMik7CiAJCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgcGFsX2lfZm1fbW9ubyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0JCS8vIE5pY2FtIFN0ZXJlbwotCQlzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDEwLCBFTl9ETVRSWF9MUiB8IEVOX0RNVFJYX0JZUEFTUyB8IEVOX05JQ0FNX0FVVE9fU1RFUkVPKTsKKwkJc2V0X2F1ZGlvX2ZpbmlzaChjb3JlLCBFTl9ETVRSWF9TVU1ESUZGIHwgRU5fQTJfRk9SQ0VfTU9OTzEpOworCX0gZWxzZSB7CisJLyogTmljYW0gU3RlcmVvICovCisJc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIFNFTF9OSUNBTSk7CiAJCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgcGFsX2lfbmljYW0pOwotICAgICAgICB9Ci0gICAgICAgIHNldF9hdWRpb19maW5pc2goY29yZSk7CisJCXNldF9hdWRpb19maW5pc2goY29yZSwgRU5fRE1UUlhfTFIgfCBFTl9ETVRSWF9CWVBBU1MgfCBFTl9OSUNBTV9BVVRPX1NURVJFTyk7CisJfQogfQogCi1zdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhbmRhcmRfQTIoc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3N0YXRpYyB2b2lkIHNldF9hdWRpb19zdGFuZGFyZF9BMihzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1MzIgbW9kZSkKIHsKLQkvKiBmcm9tIGRzY2FsZXIgY3ZzICovCiAJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBhMl9jb21tb25bXSA9IHsKLQkJeyBBVURfUERGX0REU19DTlNUX0JZVEUyLCAgICAgMHgwNiB9LAotCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTEsICAgICAweDgyIH0sCi0JCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgICAgIDB4MTIgfSwKLQkJeyBBVURfUUFNX01PREUsCQkgICAgICAweDA1IH0sCi0JCXsgQVVEX1BIQUNDX0ZSRVFfOE1TQiwJICAgICAgMHgzNCB9LAotCQl7IEFVRF9QSEFDQ19GUkVRXzhMU0IsCSAgICAgIDB4NGMgfSwKKwl7QVVEX0VSUkxPR1BFUklPRF9SLCAgICAgICAgICAgIDB4MDAwMDAwNjR9LAorCXtBVURfRVJSSU5UUlBUVEhTSExEMV9SLCAgICAgICAgMHgwMDAwMGZmZn0sCisJe0FVRF9FUlJJTlRSUFRUSFNITEQyX1IsICAgICAgICAweDAwMDAwMDFmfSwKKwl7QVVEX0VSUklOVFJQVFRIU0hMRDNfUiwgICAgICAgIDB4MDAwMDAwMGZ9LAorCXtBVURfUERGX0REU19DTlNUX0JZVEUyLCAgICAgICAgMHgwNn0sCisJe0FVRF9QREZfRERTX0NOU1RfQllURTEsICAgICAgICAweDgyfSwKKwl7QVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgICAgICAgIDB4MTJ9LAorCXtBVURfUUFNX01PREUsICAgICAgICAgICAgICAgICAgMHgwNX0sCisJe0FVRF9QSEFDQ19GUkVRXzhNU0IsICAgICAgICAgICAweDM0fSwKKwl7QVVEX1BIQUNDX0ZSRVFfOExTQiwgICAgICAgICAgIDB4NGN9LAorCXtBVURfUkFURV9BREoxLCAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMH0sCisJe0FVRF9SQVRFX0FESjIsICAgICAgICAgICAgICAgICAweDAwMDAwMjAwfSwKKwl7QVVEX1JBVEVfQURKMywgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDB9LAorCXtBVURfUkFURV9BREo0LCAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMH0sCisJe0FVRF9SQVRFX0FESjUsICAgICAgICAgICAgICAgICAweDAwMDAwNTAwfSwKKwl7QVVEX1RIUl9GUiwgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB9LAorCXtBQUdDX0hZU1QsICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxYX0sCisJe0FVRF9QSUxPVF9CUURfMV9LMCwgICAgICAgICAgICAweDAwMDA3NTVifSwKKwl7QVVEX1BJTE9UX0JRRF8xX0sxLCAgICAgICAgICAgIDB4MDA1NTEzNDB9LAorCXtBVURfUElMT1RfQlFEXzFfSzIsICAgICAgICAgICAgMHgwMDZkMzBiZX0sCisJe0FVRF9QSUxPVF9CUURfMV9LMywgICAgICAgICAgICAweGZmZDM5NGFmfSwKKwl7QVVEX1BJTE9UX0JRRF8xX0s0LCAgICAgICAgICAgIDB4MDA0MDAwMDB9LAorCXtBVURfUElMT1RfQlFEXzJfSzAsICAgICAgICAgICAgMHgwMDA0MDAwMH0sCisJe0FVRF9QSUxPVF9CUURfMl9LMSwgICAgICAgICAgICAweDAwMmE0ODQxfSwKKwl7QVVEX1BJTE9UX0JRRF8yX0syLCAgICAgICAgICAgIDB4MDA0MDAwMDB9LAorCXtBVURfUElMT1RfQlFEXzJfSzMsICAgICAgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9QSUxPVF9CUURfMl9LNCwgICAgICAgICAgICAweDAwMDAwMDAwfSwKKwl7QVVEX01PREVfQ0hHX1RJTUVSLCAgICAgICAgICAgIDB4MDAwMDAwNDB9LAorCXtBVURfQUZFXzEyREJfRU4sICAgICAgICAgICAgICAgMHgwMDAwMDAwMX0sCisJe0FVRF9DT1JESUNfU0hJRlRfMCwgICAgICAgICAgICAweDAwMDAwMDA3fSwKKwl7QVVEX0NPUkRJQ19TSElGVF8xLCAgICAgICAgICAgIDB4MDAwMDAwMDd9LAorCXtBVURfREVFTVBIMF9HMCwgICAgICAgICAgICAgICAgMHgwMDAwMDM4MH0sCisJe0FVRF9ERUVNUEgxX0cwLCAgICAgICAgICAgICAgICAweDAwMDAwMzgwfSwKKwl7QVVEX0RDT0NfMF9TUkMsICAgICAgICAgICAgICAgIDB4MDAwMDAwMWF9LAorCXtBVURfRENPQzBfU0hJRlQsICAgICAgICAgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9EQ09DXzBfU0hJRlRfSU4wLCAgICAgICAgICAweDAwMDAwMDBhfSwKKwl7QVVEX0RDT0NfMF9TSElGVF9JTjEsICAgICAgICAgIDB4MDAwMDAwMDh9LAorCXtBVURfRENPQ19QQVNTX0lOLCAgICAgICAgICAgICAgMHgwMDAwMDAwM30sCisJe0FVRF9JSVIzXzBfU0VMLCAgICAgICAgICAgICAgICAweDAwMDAwMDIxfSwKKwl7QVVEX0ROMl9BRkMsICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJ9LAorCXtBVURfRENPQ18xX1NSQywgICAgICAgICAgICAgICAgMHgwMDAwMDAxYn0sCisJe0FVRF9EQ09DMV9TSElGVCwgICAgICAgICAgICAgICAweDAwMDAwMDAwfSwKKwl7QVVEX0RDT0NfMV9TSElGVF9JTjAsICAgICAgICAgIDB4MDAwMDAwMGF9LAorCXtBVURfRENPQ18xX1NISUZUX0lOMSwgICAgICAgICAgMHgwMDAwMDAwOH0sCisJe0FVRF9JSVIzXzFfU0VMLCAgICAgICAgICAgICAgICAweDAwMDAwMDIzfSwKKwl7QVVEX1JEU0lfU0VMLCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTd9LAorCXtBVURfUkRTSV9TSElGVCwgICAgICAgICAgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9SRFNRX1NFTCwgICAgICAgICAgICAgICAgICAweDAwMDAwMDE3fSwKKwl7QVVEX1JEU1FfU0hJRlQsICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB9LAorCXtBVURfUExMX0lOVCwgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxZX0sCisJe0FVRF9QTExfRERTLCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwfSwKKwl7QVVEX1BMTF9GUkFDLCAgICAgICAgICAgICAgICAgIDB4MDAwMGU1NDJ9LAorCXtBVURfUE9MWVBIODBTQ0FMRUZBQywgICAgICAgICAgMHgwMDAwMDAwMX0sCisJe0FVRF9TVEFSVF9USU1FUiwgICAgICAgICAgICAgICAweDAwMDAwMDAwfSwKKwl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCisJfTsKIAotCQl7IEFVRF9SQVRFX0FESjEsCTB4MDAwMDEwMDAgfSwKLQkJeyBBVURfUkFURV9BREoyLAkweDAwMDAyMDAwIH0sCi0JCXsgQVVEX1JBVEVfQURKMywJMHgwMDAwMzAwMCB9LAotCQl7IEFVRF9SQVRFX0FESjQsCTB4MDAwMDQwMDAgfSwKLQkJeyBBVURfUkFURV9BREo1LAkweDAwMDA1MDAwIH0sCi0JCXsgQVVEX1RIUl9GUiwJCTB4MDAwMDAwMDAgfSwKLQkJeyBBQUdDX0hZU1QsCQkweDAwMDAwMDFhIH0sCi0JCXsgQVVEX1BJTE9UX0JRRF8xX0swLAkweDAwMDA3NTViIH0sCi0JCXsgQVVEX1BJTE9UX0JRRF8xX0sxLAkweDAwNTUxMzQwIH0sCi0JCXsgQVVEX1BJTE9UX0JRRF8xX0syLAkweDAwNmQzMGJlIH0sCi0JCXsgQVVEX1BJTE9UX0JRRF8xX0szLAkweGZmZDM5NGFmIH0sCi0JCXsgQVVEX1BJTE9UX0JRRF8xX0s0LAkweDAwNDAwMDAwIH0sCi0JCXsgQVVEX1BJTE9UX0JRRF8yX0swLAkweDAwMDQwMDAwIH0sCi0JCXsgQVVEX1BJTE9UX0JRRF8yX0sxLAkweDAwMmE0ODQxIH0sCi0JCXsgQVVEX1BJTE9UX0JRRF8yX0syLAkweDAwNDAwMDAwIH0sCi0JCXsgQVVEX1BJTE9UX0JRRF8yX0szLAkweDAwMDAwMDAwIH0sCi0JCXsgQVVEX1BJTE9UX0JRRF8yX0s0LAkweDAwMDAwMDAwIH0sCi0JCXsgQVVEX01PREVfQ0hHX1RJTUVSLAkweDAwMDAwMDQwIH0sCi0JCXsgQVVEX1NUQVJUX1RJTUVSLAkweDAwMDAwMjAwIH0sCi0JCXsgQVVEX0FGRV8xMkRCX0VOLAkweDAwMDAwMDAwIH0sCi0JCXsgQVVEX0NPUkRJQ19TSElGVF8wLAkweDAwMDAwMDA3IH0sCi0JCXsgQVVEX0NPUkRJQ19TSElGVF8xLAkweDAwMDAwMDA3IH0sCi0JCXsgQVVEX0RFRU1QSDBfRzAsCTB4MDAwMDAzODAgfSwKLQkJeyBBVURfREVFTVBIMV9HMCwJMHgwMDAwMDM4MCB9LAotCQl7IEFVRF9EQ09DXzBfU1JDLAkweDAwMDAwMDFhIH0sCi0JCXsgQVVEX0RDT0MwX1NISUZULAkweDAwMDAwMDAwIH0sCi0JCXsgQVVEX0RDT0NfMF9TSElGVF9JTjAsCTB4MDAwMDAwMGEgfSwKLQkJeyBBVURfRENPQ18wX1NISUZUX0lOMSwJMHgwMDAwMDAwOCB9LAotCQl7IEFVRF9EQ09DX1BBU1NfSU4sCTB4MDAwMDAwMDMgfSwKLQkJeyBBVURfSUlSM18wX1NFTCwJMHgwMDAwMDAyMSB9LAotCQl7IEFVRF9ETjJfQUZDLAkJMHgwMDAwMDAwMiB9LAotCQl7IEFVRF9EQ09DXzFfU1JDLAkweDAwMDAwMDFiIH0sCi0JCXsgQVVEX0RDT0MxX1NISUZULAkweDAwMDAwMDAwIH0sCi0JCXsgQVVEX0RDT0NfMV9TSElGVF9JTjAsCTB4MDAwMDAwMGEgfSwKLQkJeyBBVURfRENPQ18xX1NISUZUX0lOMSwJMHgwMDAwMDAwOCB9LAotCQl7IEFVRF9JSVIzXzFfU0VMLAkweDAwMDAwMDIzIH0sCi0JCXsgQVVEX1JEU0lfU0VMLAkJMHgwMDAwMDAxNyB9LAotCQl7IEFVRF9SRFNJX1NISUZULAkweDAwMDAwMDAwIH0sCi0JCXsgQVVEX1JEU1FfU0VMLAkJMHgwMDAwMDAxNyB9LAotCQl7IEFVRF9SRFNRX1NISUZULAkweDAwMDAwMDAwIH0sCi0JCXsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsCTB4MDAwMDAwMDEgfSwKLQorCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgYTJfYmdbXSA9IHsKKwl7QVVEX0RNRF9SQV9ERFMsICAgICAgICAgICAgICAgIDB4MDAyYTRmMmZ9LAorCXtBVURfQzFfVVBfVEhSLCAgICAgICAgICAgICAgICAgMHgwMDAwNzAwMH0sCisJe0FVRF9DMV9MT19USFIsICAgICAgICAgICAgICAgICAweDAwMDA1NDAwfSwKKwl7QVVEX0MyX1VQX1RIUiwgICAgICAgICAgICAgICAgIDB4MDAwMDU0MDB9LAorCXtBVURfQzJfTE9fVEhSLCAgICAgICAgICAgICAgICAgMHgwMDAwMzAwMH0sCiAJCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKIAl9OwogCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBhMl90YWJsZTFbXSA9IHsKLQkJLy8gUEFMLUJHCi0JCXsgQVVEX0RNRF9SQV9ERFMsCTB4MDAyYTczYmQgfSwKLQkJeyBBVURfQzFfVVBfVEhSLAkweDAwMDA3MDAwIH0sCi0JCXsgQVVEX0MxX0xPX1RIUiwJMHgwMDAwNTQwMCB9LAotCQl7IEFVRF9DMl9VUF9USFIsCTB4MDAwMDU0MDAgfSwKLQkJeyBBVURfQzJfTE9fVEhSLAkweDAwMDAzMDAwIH0sCisJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBhMl9ka1tdID0geworCXtBVURfRE1EX1JBX0REUywgICAgICAgICAgICAgICAgMHgwMDJhNGYyZn0sCisJe0FVRF9DMV9VUF9USFIsICAgICAgICAgICAgICAgICAweDAwMDA3MDAwfSwKKwl7QVVEX0MxX0xPX1RIUiwgICAgICAgICAgICAgICAgIDB4MDAwMDU0MDB9LAorCXtBVURfQzJfVVBfVEhSLCAgICAgICAgICAgICAgICAgMHgwMDAwNTQwMH0sCisJe0FVRF9DMl9MT19USFIsICAgICAgICAgICAgICAgICAweDAwMDAzMDAwfSwKKwl7QVVEX0ROMF9GUkVRLCAgICAgICAgICAgICAgICAgIDB4MDAwMDNhMWN9LAorCXtBVURfRE4yX0ZSRVEsICAgICAgICAgICAgICAgICAgMHgwMDAwZDJlMH0sCiAJCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKIAl9OwotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgYTJfdGFibGUyW10gPSB7Ci0JCS8vIFBBTC1ESwotCQl7IEFVRF9ETURfUkFfRERTLAkweDAwMmE3M2JkIH0sCi0JCXsgQVVEX0MxX1VQX1RIUiwJMHgwMDAwNzAwMCB9LAotCQl7IEFVRF9DMV9MT19USFIsCTB4MDAwMDU0MDAgfSwKLQkJeyBBVURfQzJfVVBfVEhSLAkweDAwMDA1NDAwIH0sCi0JCXsgQVVEX0MyX0xPX1RIUiwJMHgwMDAwMzAwMCB9LAotCQl7IEFVRF9ETjBfRlJFUSwJCTB4MDAwMDNhMWMgfSwKLQkJeyBBVURfRE4yX0ZSRVEsCQkweDAwMDBkMmUwIH0sCi0JCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKLQl9OwotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgYTJfdGFibGUzW10gPSB7Ci0JCS8vIHVua25vd24sIHByb2JhYmx5IE5UU0MtTQotCQl7IEFVRF9ETURfUkFfRERTLAkweDAwMmEyODczIH0sCi0JCXsgQVVEX0MxX1VQX1RIUiwJMHgwMDAwM2MwMCB9LAotCQl7IEFVRF9DMV9MT19USFIsCTB4MDAwMDMwMDAgfSwKLQkJeyBBVURfQzJfVVBfVEhSLAkweDAwMDA2MDAwIH0sCi0JCXsgQVVEX0MyX0xPX1RIUiwJMHgwMDAwM2MwMCB9LAotCQl7IEFVRF9ETjBfRlJFUSwJCTB4MDAwMDI4MzYgfSwKLQkJeyBBVURfRE4xX0ZSRVEsCQkweDAwMDAzNDE4IH0sCi0JCXsgQVVEX0ROMl9GUkVRLAkJMHgwMDAwMjljNyB9LAotCQl7IEFVRF9QT0xZMF9ERFNfQ09OU1RBTlQsIDB4MDAwYTc1NDAgfSwKKy8qIHVua25vd24sIHByb2JhYmx5IE5UU0MtTSAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgYTJfbVtdID0geworCXtBVURfRE1EX1JBX0REUywgICAgICAgICAgICAgICAgMHgwMDJhMDQyNX0sCisJe0FVRF9DMV9VUF9USFIsICAgICAgICAgICAgICAgICAweDAwMDAzYzAwfSwKKwl7QVVEX0MxX0xPX1RIUiwgICAgICAgICAgICAgICAgIDB4MDAwMDMwMDB9LAorCXtBVURfQzJfVVBfVEhSLCAgICAgICAgICAgICAgICAgMHgwMDAwNjAwMH0sCisJe0FVRF9DMl9MT19USFIsICAgICAgICAgICAgICAgICAweDAwMDAzYzAwfSwKKwl7QVVEX0RFRU1QSDBfQTAsICAgICAgICAgICAgICAgIDB4MDAwMDdhODB9LAorCXtBVURfREVFTVBIMV9BMCwgICAgICAgICAgICAgICAgMHgwMDAwN2E4MH0sCisJe0FVRF9ERUVNUEgwX0cwLCAgICAgICAgICAgICAgICAweDAwMDAxMjAwfSwKKwl7QVVEX0RFRU1QSDFfRzAsICAgICAgICAgICAgICAgIDB4MDAwMDEyMDB9LAorCXtBVURfRE4wX0ZSRVEsICAgICAgICAgICAgICAgICAgMHgwMDAwMjgzYn0sCisJe0FVRF9ETjFfRlJFUSwgICAgICAgICAgICAgICAgICAweDAwMDAzNDE4fSwKKwl7QVVEX0ROMl9GUkVRLCAgICAgICAgICAgICAgICAgIDB4MDAwMDI5Yzd9LAorCXtBVURfUE9MWTBfRERTX0NPTlNUQU5ULCAgICAgICAgMHgwMDBhNzU0MH0sCiAJCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKIAl9OwogCi0Jc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIDB4MDAwNCwgRU5fRE1UUlhfU1VNRElGRiB8IEVOX0EyX0FVVE9fU1RFUkVPKTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IGEyX2RlZW1waDUwW10gPSB7CisJe0FVRF9ERUVNUEgwX0cwLCAgICAgICAgICAgICAgICAweDAwMDAwMzgwfSwKKwl7QVVEX0RFRU1QSDFfRzAsICAgICAgICAgICAgICAgIDB4MDAwMDAzODB9LAorCXtBVURfREVFTVBIR0FJTl9SLCAgICAgICAgICAgICAgMHgwMDAwMTFlMX0sCisJe0FVRF9ERUVNUEhOVU1FUjFfUiwgICAgICAgICAgICAweDAwMDJhN2JjfSwKKwl7QVVEX0RFRU1QSE5VTUVSMl9SLCAgICAgICAgICAgIDB4MDAwMzAyM2N9LAorCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKKwl9OworCisJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBhMl9kZWVtcGg3NVtdID0geworCXtBVURfREVFTVBIMF9HMCwgICAgICAgICAgICAgICAgMHgwMDAwMDQ4MH0sCisJe0FVRF9ERUVNUEgxX0cwLCAgICAgICAgICAgICAgICAweDAwMDAwNDgwfSwKKwl7QVVEX0RFRU1QSEdBSU5fUiwgICAgICAgICAgICAgIDB4MDAwMDkwMDB9LAorCXtBVURfREVFTVBITlVNRVIxX1IsICAgICAgICAgICAgMHgwMDAzNTNkZX0sCisJe0FVRF9ERUVNUEhOVU1FUjJfUiwgICAgICAgICAgICAweDAwMDAwMWIxfSwKKwkJeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorCX07CisKKwlzZXRfYXVkaW9fc3RhcnQoY29yZSwgU0VMX0EyKTsKIAlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGEyX2NvbW1vbik7CiAJc3dpdGNoIChjb3JlLT50dmF1ZGlvKSB7CiAJY2FzZSBXV19BMl9CRzoKIAkJZHByaW50aygiJXMgUEFMLUJHIEEyIChzdGF0dXM6IGtub3duLWdvb2QpXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgYTJfdGFibGUxKTsKKwlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGEyX2JnKTsKKwlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGEyX2RlZW1waDUwKTsKIAkJYnJlYWs7CiAJY2FzZSBXV19BMl9ESzoKIAkJZHByaW50aygiJXMgUEFMLURLIEEyIChzdGF0dXM6IGtub3duLWdvb2QpXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgYTJfdGFibGUyKTsKKwlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGEyX2RrKTsKKwlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGEyX2RlZW1waDUwKTsKIAkJYnJlYWs7CiAJY2FzZSBXV19BMl9NOgogCQlkcHJpbnRrKCIlcyBOVFNDLU0gQTIgKHN0YXR1czogdW5rbm93bilcbiIsX19GVU5DVElPTl9fKTsKLQkJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBhMl90YWJsZTMpOworCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgYTJfbSk7CisJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBhMl9kZWVtcGg3NSk7CiAJCWJyZWFrOwogCX07Ci0Jc2V0X2F1ZGlvX2ZpbmlzaChjb3JlKTsKKworCW1vZGUgfD0gRU5fRk1SQURJT19FTl9SRFMgfCBFTl9ETVRSWF9TVU1ESUZGOworCXNldF9hdWRpb19maW5pc2goY29yZSwgbW9kZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9hdWRpb19zdGFuZGFyZF9FSUFKKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpCkBAIC02MzUsOSArNjU4LDkgQEAKIAl9OwogCWRwcmludGsoIiVzIChzdGF0dXM6IHVua25vd24pXG4iLF9fRlVOQ1RJT05fXyk7CiAKLQlzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDAyLCBFTl9FSUFKX0FVVE9fU1RFUkVPKTsKKwlzZXRfYXVkaW9fc3RhcnQoY29yZSwgU0VMX0VJQUopOwogCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgZWlhaik7Ci0Jc2V0X2F1ZGlvX2ZpbmlzaChjb3JlKTsKKwlzZXRfYXVkaW9fZmluaXNoKGNvcmUsIEVOX0VJQUpfQVVUT19TVEVSRU8pOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhbmRhcmRfRk0oc3RydWN0IGN4ODhfY29yZSAqY29yZSwgZW51bSBjeDg4X2RlZW1waF90eXBlIGRlZW1waCkKQEAgLTY4Myw3ICs3MDYsNyBAQAogCX07CiAKIAlkcHJpbnRrKCIlcyAoc3RhdHVzOiB1bmtub3duKVxuIixfX0ZVTkNUSU9OX18pOwotCXNldF9hdWRpb19zdGFydChjb3JlLCAweDAwMjAsIEVOX0ZNUkFESU9fQVVUT19TVEVSRU8pOworCXNldF9hdWRpb19zdGFydChjb3JlLCBTRUxfRk1SQURJTyk7CiAKIAlzd2l0Y2ggKGRlZW1waCkKIAl7CkBAIC03MDAsNyArNzIzLDcgQEAKIAkJCWJyZWFrOwogCX0KIAotCXNldF9hdWRpb19maW5pc2goY29yZSk7CisJc2V0X2F1ZGlvX2ZpbmlzaChjb3JlLCBFTl9GTVJBRElPX0FVVE9fU1RFUkVPKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTcwOSw3ICs3MzIsNyBAQAogewogCXN3aXRjaCAoY29yZS0+dHZhdWRpbykgewogCWNhc2UgV1dfQlRTQzoKLQkJc2V0X2F1ZGlvX3N0YW5kYXJkX0JUU0MoY29yZSwwKTsKKwkJc2V0X2F1ZGlvX3N0YW5kYXJkX0JUU0MoY29yZSwgMCwgRU5fQlRTQ19BVVRPX1NURVJFTyk7CiAJCWJyZWFrOwogCWNhc2UgV1dfTklDQU1fQkdES0w6CiAJCXNldF9hdWRpb19zdGFuZGFyZF9OSUNBTV9MKGNvcmUsMCk7CkBAIC03MjAsNyArNzQzLDcgQEAKIAljYXNlIFdXX0EyX0JHOgogCWNhc2UgV1dfQTJfREs6CiAJY2FzZSBXV19BMl9NOgotCQlzZXRfYXVkaW9fc3RhbmRhcmRfQTIoY29yZSk7CisJc2V0X2F1ZGlvX3N0YW5kYXJkX0EyKGNvcmUsIEVOX0EyX0ZPUkNFX01PTk8xKTsKIAkJYnJlYWs7CiAJY2FzZSBXV19FSUFKOgogCQlzZXRfYXVkaW9fc3RhbmRhcmRfRUlBSihjb3JlKTsKQEAgLTczNCw3ICs3NTcsNyBAQAogCWNhc2UgV1dfTk9ORToKIAlkZWZhdWx0OgogCQlwcmludGsoIiVzLzA6IHVua25vd24gdHYgYXVkaW8gbW9kZSBbJWRdXG4iLAotCQkgICAgICAgY29yZS0+bmFtZSwgY29yZS0+dHZhdWRpbyk7CisJCWNvcmUtPm5hbWUsIGNvcmUtPnR2YXVkaW8pOwogCQlicmVhazsKIAl9CiAJcmV0dXJuOwpAQCAtNzY5LDYgKzc5MiwxMyBAQAogCQkJYXVkX2N0bF9uYW1lc1tjeF9yZWFkKEFVRF9DVEwpICYgNjNdKTsKIAljb3JlLT5hc3RhdCA9IHJlZzsKIAorLyogVE9ETworICAgICAgIFJlYWRpbmcgZnJvbSBBVURfU1RBVFVTIGlzIG5vdCBlbm91Z2gKKyAgICAgICBmb3IgYXV0by1kZXRlY3Rpbmcgc2FwL2R1YWwtZm0vbmljYW0uCisgICAgICAgQWRkIHNvbWUgY29kZSBoZXJlIGxhdGVyLgorKi8KKworIyBpZiAwCiAJdC0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX1NURVJFTyB8IFY0TDJfVFVORVJfQ0FQX1NBUCB8CiAJCVY0TDJfVFVORVJfQ0FQX0xBTkcxIHwgVjRMMl9UVU5FUl9DQVBfTEFORzI7CiAJdC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87CkBAIC03NzksNyArODA5LDcgQEAKIAkJdC0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX1NURVJFTyB8CiAJCQlWNEwyX1RVTkVSX0NBUF9TQVA7CiAJCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87Ci0gCQlpZiAoMSA9PSBwaWxvdCkgeworCQlpZiAoMSA9PSBwaWxvdCkgewogCQkJLyogU0FQICovCiAJCQl0LT5yeHN1YmNoYW5zIHw9IFY0TDJfVFVORVJfU1VCX1NBUDsKIAkJfQpAQCAtNzg3LDEzICs4MTcsMTMgQEAKIAljYXNlIFdXX0EyX0JHOgogCWNhc2UgV1dfQTJfREs6CiAJY2FzZSBXV19BMl9NOgotIAkJaWYgKDEgPT0gcGlsb3QpIHsKKwkJaWYgKDEgPT0gcGlsb3QpIHsKIAkJCS8qIHN0ZXJlbyAqLwogCQkJdC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk8gfCBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CiAJCQlpZiAoMCA9PSBtb2RlKQogCQkJCXQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOwogCQl9Ci0gCQlpZiAoMiA9PSBwaWxvdCkgeworCQlpZiAoMiA9PSBwaWxvdCkgewogCQkJLyogZHVhbCBsYW5ndWFnZSAtLSBGSVhNRSAqLwogCQkJdC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX0xBTkcxIHwgVjRMMl9UVU5FUl9TVUJfTEFORzI7CiAJCQl0LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX0xBTkcxOwpAQCAtODA1LDE2ICs4MzUsMTcgQEAKIAkJCXQtPnJ4c3ViY2hhbnMgfD0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOwogCQl9CiAJCWJyZWFrOwotICAgICAgICBjYXNlIFdXX1NZU1RFTV9MX0FNOgotICAgICAgICAgICAgICAgIGlmICgweDAgPT0gbW9kZSAmJiAhKGN4X3JlYWQoQVVEX0lOSVQpICYgMHgwNCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCWNhc2UgV1dfU1lTVEVNX0xfQU06CisJCWlmICgweDAgPT0gbW9kZSAmJiAhKGN4X3JlYWQoQVVEX0lOSVQpICYgMHgwNCkpIHsKKwkJCXQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOwogCQkJdC0+cnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CiAJCX0KLSAgICAgICAgICAgICAgICBicmVhayA7CisJCWJyZWFrIDsKIAlkZWZhdWx0OgogCQkvKiBub3RoaW5nICovCiAJCWJyZWFrOwogCX0KKyMgZW5kaWYKIAlyZXR1cm47CiB9CiAKQEAgLTgzNSwxNiArODY2LDE2IEBACiAJY2FzZSBXV19CVFNDOgogCQlzd2l0Y2ggKG1vZGUpIHsKIAkJY2FzZSBWNEwyX1RVTkVSX01PREVfTU9OTzoKLQkJCWN0bCAgPSBFTl9CVFNDX0ZPUkNFX01PTk87Ci0JCQltYXNrID0gMHgzZjsKKwkJCXNldF9hdWRpb19zdGFuZGFyZF9CVFNDKGNvcmUsIDAsIEVOX0JUU0NfRk9SQ0VfTU9OTyk7CiAJCQlicmVhazsKLQkJY2FzZSBWNEwyX1RVTkVSX01PREVfU0FQOgotCQkJY3RsICA9IEVOX0JUU0NfRk9SQ0VfU0FQOwotCQkJbWFzayA9IDB4M2Y7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcxOgorCQkJc2V0X2F1ZGlvX3N0YW5kYXJkX0JUU0MoY29yZSwgMCwgRU5fQlRTQ19BVVRPX1NURVJFTyk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzI6CisJCQlzZXRfYXVkaW9fc3RhbmRhcmRfQlRTQyhjb3JlLCAxLCBFTl9CVFNDX0ZPUkNFX1NBUCk7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgotCQkJY3RsICA9IEVOX0JUU0NfQVVUT19TVEVSRU87Ci0JCQltYXNrID0gMHgzZjsKKwkJCXNldF9hdWRpb19zdGFuZGFyZF9CVFNDKGNvcmUsIDAsIEVOX0JUU0NfRk9SQ0VfU1RFUkVPKTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtODU0LDE2ICs4ODUsMTMgQEAKIAkJc3dpdGNoIChtb2RlKSB7CiAJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86CiAJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcxOgotCQkJY3RsICA9IEVOX0EyX0ZPUkNFX01PTk8xOwotCQkJbWFzayA9IDB4M2Y7CisJCXNldF9hdWRpb19zdGFuZGFyZF9BMihjb3JlLCBFTl9BMl9GT1JDRV9NT05PMSk7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzI6Ci0JCQljdGwgID0gRU5fQTJfQVVUT19NT05PMjsKLQkJCW1hc2sgPSAweDNmOworCQlzZXRfYXVkaW9fc3RhbmRhcmRfQTIoY29yZSwgRU5fQTJfRk9SQ0VfTU9OTzIpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKLQkJCWN0bCAgPSBFTl9BMl9BVVRPX1NURVJFTyB8IEVOX0RNVFJYX1NVTVI7Ci0JCQltYXNrID0gMHg4YmY7CisJCXNldF9hdWRpb19zdGFuZGFyZF9BMihjb3JlLCBFTl9BMl9GT1JDRV9TVEVSRU8pOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12YmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZiaS5jCmluZGV4IDMyMGQ1NzguLjliYzZjODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZiaS5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogY3g4OC12YmkuYyx2IDEuMTcgMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCmluZGV4IDVmNThjMTAuLjNkYmMwNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtdmlkZW8uYyx2IDEuODIgMjAwNS8wNy8yMiAwNToxMzozNCBta3J1Zmt5IEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgQ29uZXhhbnQgMjM4OHggYmFzZWQgVFYgY2FyZHMKICAqIHZpZGVvNGxpbnV4IHZpZGVvIGludGVyZmFjZQpAQCAtNjYsNyArNjUsNyBAQAogTU9EVUxFX1BBUk1fREVTQyh2aWRfbGltaXQsImNhcHR1cmUgbWVtb3J5IGxpbWl0IGluIG1lZ2FieXRlcyIpOwogCiAjZGVmaW5lIGRwcmludGsobGV2ZWwsZm10LCBhcmcuLi4pCWlmICh2aWRlb19kZWJ1ZyA+PSBsZXZlbCkgXAotCXByaW50ayhLRVJOX0RFQlVHICIlcy8wOiAiIGZtdCwgZGV2LT5jb3JlLT5uYW1lICwgIyMgYXJnKQorCXByaW50ayhLRVJOX0RFQlVHICIlcy8wOiAiIGZtdCwgY29yZS0+bmFtZSAsICMjIGFyZykKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTMyNiwyMiArMzI1LDIzIEBACiAKIHN0YXRpYyBpbnQgcmVzX2dldChzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgY3g4ODAwX2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdCkKIHsKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOwogCWlmIChmaC0+cmVzb3VyY2VzICYgYml0KQogCQkvKiBoYXZlIGl0IGFscmVhZHkgYWxsb2NhdGVkICovCiAJCXJldHVybiAxOwogCiAJLyogaXMgaXQgZnJlZT8gKi8KLQlkb3duKCZkZXYtPmxvY2spOworCWRvd24oJmNvcmUtPmxvY2spOwogCWlmIChkZXYtPnJlc291cmNlcyAmIGJpdCkgewogCQkvKiBubywgc29tZW9uZSBlbHNlIHVzZXMgaXQgKi8KLQkJdXAoJmRldi0+bG9jayk7CisJCXVwKCZjb3JlLT5sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCS8qIGl0J3MgZnJlZSwgZ3JhYiBpdCAqLwogCWZoLT5yZXNvdXJjZXMgIHw9IGJpdDsKIAlkZXYtPnJlc291cmNlcyB8PSBiaXQ7CiAJZHByaW50aygxLCJyZXM6IGdldCAlZFxuIixiaXQpOwotCXVwKCZkZXYtPmxvY2spOworCXVwKCZjb3JlLT5sb2NrKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMzYwLDI3ICszNjAsMjkgQEAKIHN0YXRpYwogdm9pZCByZXNfZnJlZShzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgY3g4ODAwX2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdHMpCiB7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKIAlpZiAoKGZoLT5yZXNvdXJjZXMgJiBiaXRzKSAhPSBiaXRzKQogCQlCVUcoKTsKIAotCWRvd24oJmRldi0+bG9jayk7CisJZG93bigmY29yZS0+bG9jayk7CiAJZmgtPnJlc291cmNlcyAgJj0gfmJpdHM7CiAJZGV2LT5yZXNvdXJjZXMgJj0gfmJpdHM7CiAJZHByaW50aygxLCJyZXM6IHB1dCAlZFxuIixiaXRzKTsKLQl1cCgmZGV2LT5sb2NrKTsKKwl1cCgmY29yZS0+bG9jayk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHZpZGVvX211eChzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCisvKiBzdGF0aWMgaW50IHZpZGVvX211eChzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgaW5wdXQpICovCitzdGF0aWMgaW50IHZpZGVvX211eChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1bnNpZ25lZCBpbnQgaW5wdXQpCiB7Ci0Jc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKwkvKiBzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOyAqLwogCiAJZHByaW50aygxLCJ2aWRlb19tdXg6ICVkIFt2bXV4PSVkLGdwaW89MHgleCwweCV4LDB4JXgsMHgleF1cbiIsCiAJCWlucHV0LCBJTlBVVChpbnB1dCktPnZtdXgsCiAJCUlOUFVUKGlucHV0KS0+Z3BpbzAsSU5QVVQoaW5wdXQpLT5ncGlvMSwKIAkJSU5QVVQoaW5wdXQpLT5ncGlvMixJTlBVVChpbnB1dCktPmdwaW8zKTsKLQlkZXYtPmNvcmUtPmlucHV0ID0gaW5wdXQ7CisJY29yZS0+aW5wdXQgPSBpbnB1dDsKIAljeF9hbmRvcihNT19JTlBVVF9GT1JNQVQsIDB4MDMgPDwgMTQsIElOUFVUKGlucHV0KS0+dm11eCA8PCAxNCk7CiAJY3hfd3JpdGUoTU9fR1AzX0lPLCBJTlBVVChpbnB1dCktPmdwaW8zKTsKIAljeF93cml0ZShNT19HUDBfSU8sIElOUFVUKGlucHV0KS0+Z3BpbzApOwpAQCAtNDEzLDkgKzQxNSw5IEBACiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKIAogCS8qIHNldHVwIGZpZm8gKyBmb3JtYXQgKi8KLQljeDg4X3NyYW1fY2hhbm5lbF9zZXR1cChkZXYtPmNvcmUsICZjeDg4X3NyYW1fY2hhbm5lbHNbU1JBTV9DSDIxXSwKKwljeDg4X3NyYW1fY2hhbm5lbF9zZXR1cChjb3JlLCAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyMV0sCiAJCQkJYnVmLT5icGwsIGJ1Zi0+cmlzYy5kbWEpOwotCWN4ODhfc2V0X3NjYWxlKGRldi0+Y29yZSwgYnVmLT52Yi53aWR0aCwgYnVmLT52Yi5oZWlnaHQsIGJ1Zi0+dmIuZmllbGQpOworCWN4ODhfc2V0X3NjYWxlKGNvcmUsIGJ1Zi0+dmIud2lkdGgsIGJ1Zi0+dmIuaGVpZ2h0LCBidWYtPnZiLmZpZWxkKTsKIAljeF93cml0ZShNT19DT0xPUl9DVFJMLCBidWYtPmZtdC0+Y3hmb3JtYXQgfCBDb2xvckZvcm1hdEdhbW1hKTsKIAogCS8qIHJlc2V0IGNvdW50ZXIgKi8KQEAgLTQyNCw2ICs0MjYsMTQgQEAKIAogCS8qIGVuYWJsZSBpcnFzICovCiAJY3hfc2V0KE1PX1BDSV9JTlRNU0ssIGNvcmUtPnBjaV9pcnFtYXNrIHwgMHgwMSk7CisKKwkvKiBFbmFibGVzIGNvcnJlc3BvbmRpbmcgYml0cyBhdCBQQ0lfSU5UX1NUQVQ6CisJCWJpdHMgMCB0byA0OiB2aWRlbywgYXVkaW8sIHRyYW5zcG9ydCBzdHJlYW0sIFZJUCwgSG9zdAorCQliaXQgNzogdGltZXIKKwkJYml0cyA4IGFuZCA5OiBETUEgY29tcGxldGUgZm9yOiBTUkMsIERTVAorCQliaXRzIDEwIGFuZCAxMTogQkVSUiBzaWduYWwgYXNzZXJ0ZWQgZm9yIFJJU0M6IFJELCBXUgorCQliaXRzIDEyIHRvIDE1OiBCRVJSIHNpZ25hbCBhc3NlcnRlZCBmb3I6IEJSREcsIFNSQywgRFNULCBJUEIKKwkgKi8KIAljeF9zZXQoTU9fVklEX0lOVE1TSywgMHgwZjAwMTEpOwogCiAJLyogZW5hYmxlIGNhcHR1cmUgKi8KQEAgLTQzMSw3ICs0NDEsNyBAQAogCiAJLyogc3RhcnQgZG1hICovCiAJY3hfc2V0KE1PX0RFVl9DTlRSTDIsICgxPDw1KSk7Ci0JY3hfc2V0KE1PX1ZJRF9ETUFDTlRSTCwgMHgxMSk7CisJY3hfc2V0KE1PX1ZJRF9ETUFDTlRSTCwgMHgxMSk7IC8qIFBsYW5hciBZIGFuZCBwYWNrZWQgRklGTyBhbmQgUklTQyBlbmFibGUgKi8KIAogCXJldHVybiAwOwogfQpAQCAtNDU1LDYgKzQ2NSw3IEBACiBzdGF0aWMgaW50IHJlc3RhcnRfdmlkZW9fcXVldWUoc3RydWN0IGN4ODgwMF9kZXYgICAgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgY3g4OF9kbWFxdWV1ZSAqcSkKIHsKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOwogCXN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmLCAqcHJldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOwogCkBAIC01MjQsMTIgKzUzNSwxMyBAQAogewogCXN0cnVjdCBjeDg4MDBfZmggICAqZmggID0gcS0+cHJpdl9kYXRhOwogCXN0cnVjdCBjeDg4MDBfZGV2ICAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOwogCXN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBjeDg4X2J1ZmZlcix2Yik7CiAJaW50IHJjLCBpbml0X2J1ZmZlciA9IDA7CiAKIAlCVUdfT04oTlVMTCA9PSBmaC0+Zm10KTsKLQlpZiAoZmgtPndpZHRoICA8IDQ4IHx8IGZoLT53aWR0aCAgPiBub3JtX21heHcoZGV2LT5jb3JlLT50dm5vcm0pIHx8Ci0JICAgIGZoLT5oZWlnaHQgPCAzMiB8fCBmaC0+aGVpZ2h0ID4gbm9ybV9tYXhoKGRldi0+Y29yZS0+dHZub3JtKSkKKwlpZiAoZmgtPndpZHRoICA8IDQ4IHx8IGZoLT53aWR0aCAgPiBub3JtX21heHcoY29yZS0+dHZub3JtKSB8fAorCSAgICBmaC0+aGVpZ2h0IDwgMzIgfHwgZmgtPmhlaWdodCA+IG5vcm1fbWF4aChjb3JlLT50dm5vcm0pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlidWYtPnZiLnNpemUgPSAoZmgtPndpZHRoICogZmgtPmhlaWdodCAqIGZoLT5mbXQtPmRlcHRoKSA+PiAzOwogCWlmICgwICE9IGJ1Zi0+dmIuYmFkZHIgICYmICBidWYtPnZiLmJzaXplIDwgYnVmLT52Yi5zaXplKQpAQCAtNjA5LDYgKzYyMSw3IEBACiAJc3RydWN0IGN4ODhfYnVmZmVyICAgICpwcmV2OwogCXN0cnVjdCBjeDg4MDBfZmggICAgICAqZmggICA9IHZxLT5wcml2X2RhdGE7CiAJc3RydWN0IGN4ODgwMF9kZXYgICAgICpkZXYgID0gZmgtPmRldjsKKwlzdHJ1Y3QgY3g4OF9jb3JlICAgICAgKmNvcmUgPSBkZXYtPmNvcmU7CiAJc3RydWN0IGN4ODhfZG1hcXVldWUgICpxICAgID0gJmRldi0+dmlkcTsKIAogCS8qIGFkZCBqdW1wIHRvIHN0b3BwZXIgKi8KQEAgLTcwMSw2ICs3MTQsNyBAQAogewogCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CiAJc3RydWN0IGN4ODgwMF9kZXYgKmgsKmRldiA9IE5VTEw7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZTsKIAlzdHJ1Y3QgY3g4ODAwX2ZoICpmaDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gMDsKQEAgLTcyNSw2ICs3MzksOCBAQAogCWlmIChOVUxMID09IGRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwljb3JlID0gZGV2LT5jb3JlOworCiAJZHByaW50aygxLCJvcGVuIG1pbm9yPSVkIHJhZGlvPSVkIHR5cGU9JXNcbiIsCiAJCW1pbm9yLHJhZGlvLHY0bDJfdHlwZV9uYW1lc1t0eXBlXSk7CiAKQEAgLTc1NSwxNyArNzcxLDE2IEBACiAJCQkgICAgZmgpOwogCiAJaWYgKGZoLT5yYWRpbykgewotCQlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOwogCQlpbnQgYm9hcmQgPSBjb3JlLT5ib2FyZDsKIAkJZHByaW50aygxLCJ2aWRlb19vcGVuOiBzZXR0aW5nIHJhZGlvIGRldmljZVxuIik7CiAJCWN4X3dyaXRlKE1PX0dQM19JTywgY3g4OF9ib2FyZHNbYm9hcmRdLnJhZGlvLmdwaW8zKTsKIAkJY3hfd3JpdGUoTU9fR1AwX0lPLCBjeDg4X2JvYXJkc1tib2FyZF0ucmFkaW8uZ3BpbzApOwogCQljeF93cml0ZShNT19HUDFfSU8sIGN4ODhfYm9hcmRzW2JvYXJkXS5yYWRpby5ncGlvMSk7CiAJCWN4X3dyaXRlKE1PX0dQMl9JTywgY3g4OF9ib2FyZHNbYm9hcmRdLnJhZGlvLmdwaW8yKTsKLQkJZGV2LT5jb3JlLT50dmF1ZGlvID0gV1dfRk07CisJCWNvcmUtPnR2YXVkaW8gPSBXV19GTTsKIAkJY3g4OF9zZXRfdHZhdWRpbyhjb3JlKTsKIAkJY3g4OF9zZXRfc3RlcmVvKGNvcmUsVjRMMl9UVU5FUl9NT0RFX1NURVJFTywxKTsKLQkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxBVURDX1NFVF9SQURJTyxOVUxMKTsKKwkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGNvcmUsQVVEQ19TRVRfUkFESU8sTlVMTCk7CiAJfQogCiAgICAgICAgIHJldHVybiAwOwpAQCAtODU3LDYgKzg3Miw5IEBACiAJdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmJpcSk7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKIAlrZnJlZShmaCk7CisKKwljeDg4X2NhbGxfaTJjX2NsaWVudHMgKGRldi0+Y29yZSwgVFVORVJfU0VUX1NUQU5EQlksIE5VTEwpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg3MCw5ICs4ODgsMTAgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgZ2V0X2NvbnRyb2woc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKQorLyogc3RhdGljIGludCBnZXRfY29udHJvbChzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwpICovCitzdGF0aWMgaW50IGdldF9jb250cm9sKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKIHsKLQlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCS8qIHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7ICovCiAJc3RydWN0IGN4ODhfY3RybCAqYyA9IE5VTEw7CiAJdTMyIHZhbHVlOwogCWludCBpOwpAQCAtODk4LDkgKzkxNywxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNldF9jb250cm9sKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKKy8qIHN0YXRpYyBpbnQgc2V0X2NvbnRyb2woc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKSAqLworc3RhdGljIGludCBzZXRfY29udHJvbChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwpCiB7Ci0Jc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKwkvKiBzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOyAqLwogCXN0cnVjdCBjeDg4X2N0cmwgKmMgPSBOVUxMOwogICAgICAgICB1MzIgdl9zYXRfdmFsdWU7CiAJdTMyIHZhbHVlOwpAQCAtOTEzLDkgKzkzMyw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGN0bC0+dmFsdWUgPCBjLT52Lm1pbmltdW0pCi0JCXJldHVybiAtRVJBTkdFOworCQljdGwtPnZhbHVlID0gYy0+di5taW5pbXVtOwogCWlmIChjdGwtPnZhbHVlID4gYy0+di5tYXhpbXVtKQotCQlyZXR1cm4gLUVSQU5HRTsKKwkJY3RsLT52YWx1ZSA9IGMtPnYubWF4aW11bTsKIAlzd2l0Y2ggKGN0bC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CiAJCXZhbHVlID0gKGN0bC0+dmFsdWUgPCAweDQwKSA/ICgweDQwIC0gY3RsLT52YWx1ZSkgOiBjdGwtPnZhbHVlOwpAQCAtOTQ2LDcgKzk2Niw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfY29udHJvbHMoc3RydWN0IGN4ODgwMF9kZXYgKmRldikKKy8qIHN0YXRpYyB2b2lkIGluaXRfY29udHJvbHMoc3RydWN0IGN4ODgwMF9kZXYgKmRldikgKi8KK3N0YXRpYyB2b2lkIGluaXRfY29udHJvbHMoc3RydWN0IGN4ODhfY29yZSAqY29yZSkKIHsKIAlzdGF0aWMgc3RydWN0IHY0bDJfY29udHJvbCBtdXRlID0gewogCQkuaWQgICAgPSBWNEwyX0NJRF9BVURJT19NVVRFLApAQCAtOTY5LDExICs5OTAsMTEgQEAKIAkJLnZhbHVlID0gMHg4MCwKIAl9OwogCi0Jc2V0X2NvbnRyb2woZGV2LCZtdXRlKTsKLQlzZXRfY29udHJvbChkZXYsJnZvbHVtZSk7Ci0Jc2V0X2NvbnRyb2woZGV2LCZodWUpOwotCXNldF9jb250cm9sKGRldiwmY29udHJhc3QpOwotCXNldF9jb250cm9sKGRldiwmYnJpZ2h0bmVzcyk7CisJc2V0X2NvbnRyb2woY29yZSwmbXV0ZSk7CisJc2V0X2NvbnRyb2woY29yZSwmdm9sdW1lKTsKKwlzZXRfY29udHJvbChjb3JlLCZodWUpOworCXNldF9jb250cm9sKGNvcmUsJmNvbnRyYXN0KTsKKwlzZXRfY29udHJvbChjb3JlLCZicmlnaHRuZXNzKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMDA0LDYgKzEwMjUsOCBAQAogc3RhdGljIGludCBjeDg4MDBfdHJ5X2ZtdChzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgY3g4ODAwX2ZoICpmaCwKIAkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogeworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisKIAlzd2l0Y2ggKGYtPnR5cGUpIHsKIAljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKIAl7CkBAIC0xMDE2LDggKzEwMzksOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOwotCQltYXh3ICA9IG5vcm1fbWF4dyhkZXYtPmNvcmUtPnR2bm9ybSk7Ci0JCW1heGggID0gbm9ybV9tYXhoKGRldi0+Y29yZS0+dHZub3JtKTsKKwkJbWF4dyAgPSBub3JtX21heHcoY29yZS0+dHZub3JtKTsKKwkJbWF4aCAgPSBub3JtX21heGgoY29yZS0+dHZub3JtKTsKIAogCQlpZiAoVjRMMl9GSUVMRF9BTlkgPT0gZmllbGQpIHsKIAkJCWZpZWxkID0gKGYtPmZtdC5waXguaGVpZ2h0ID4gbWF4aC8yKQpAQCAtMTEwMSwxMiArMTEyNCwxNCBAQAogCWlmICh2aWRlb19kZWJ1ZyA+IDEpCiAJCWN4ODhfcHJpbnRfaW9jdGwoY29yZS0+bmFtZSxjbWQpOwogCXN3aXRjaCAoY21kKSB7CisKKwkvKiAtLS0gY2FwYWJpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCWNhc2UgVklESU9DX1FVRVJZQ0FQOgogCXsKIAkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwID0gYXJnOwogCiAJCW1lbXNldChjYXAsMCxzaXplb2YoKmNhcCkpOwotICAgICAgICAgICAgICAgIHN0cmNweShjYXAtPmRyaXZlciwgImN4ODgwMCIpOworCQlzdHJjcHkoY2FwLT5kcml2ZXIsICJjeDg4MDAiKTsKIAkJc3RybGNweShjYXAtPmNhcmQsIGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5uYW1lLAogCQkJc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCQlzcHJpbnRmKGNhcC0+YnVzX2luZm8sIlBDSTolcyIscGNpX25hbWUoZGV2LT5wY2kpKTsKQEAgLTExMTYsMTA3ICsxMTQxLDEzIEBACiAJCQlWNEwyX0NBUF9SRUFEV1JJVEUgICAgIHwKIAkJCVY0TDJfQ0FQX1NUUkVBTUlORyAgICAgfAogCQkJVjRMMl9DQVBfVkJJX0NBUFRVUkUgICB8CisJCQlWNEwyX0NBUF9WSURFT19PVkVSTEFZIHwKIAkJCTA7CiAJCWlmIChVTlNFVCAhPSBjb3JlLT50dW5lcl90eXBlKQogCQkJY2FwLT5jYXBhYmlsaXRpZXMgfD0gVjRMMl9DQVBfVFVORVI7CiAJCXJldHVybiAwOwogCX0KIAotCS8qIC0tLS0tLS0tLS0gdHYgbm9ybXMgLS0tLS0tLS0tLSAqLwotCWNhc2UgVklESU9DX0VOVU1TVEQ6Ci0JewotCQlzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqZSA9IGFyZzsKLQkJdW5zaWduZWQgaW50IGk7Ci0KLQkJaSA9IGUtPmluZGV4OwotCQlpZiAoaSA+PSBBUlJBWV9TSVpFKHR2bm9ybXMpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWVyciA9IHY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdChlLCB0dm5vcm1zW2UtPmluZGV4XS5pZCwKLQkJCQkJICAgICAgIHR2bm9ybXNbZS0+aW5kZXhdLm5hbWUpOwotCQllLT5pbmRleCA9IGk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX0dfU1REOgotCXsKLQkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOwotCi0JCSppZCA9IGNvcmUtPnR2bm9ybS0+aWQ7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX1NURDoKLQl7Ci0JCXY0bDJfc3RkX2lkICppZCA9IGFyZzsKLQkJdW5zaWduZWQgaW50IGk7Ci0KLQkJZm9yKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0dm5vcm1zKTsgaSsrKQotCQkJaWYgKCppZCAmIHR2bm9ybXNbaV0uaWQpCi0JCQkJYnJlYWs7Ci0JCWlmIChpID09IEFSUkFZX1NJWkUodHZub3JtcykpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlkb3duKCZkZXYtPmxvY2spOwotCQljeDg4X3NldF90dm5vcm0oZGV2LT5jb3JlLCZ0dm5vcm1zW2ldKTsKLQkJdXAoJmRldi0+bG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIC0tLS0tLSBpbnB1dCBzd2l0Y2hpbmcgLS0tLS0tLS0tLSAqLwotCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKLQl7Ci0JCXN0YXRpYyBjb25zdCBjaGFyICppbmFtZVtdID0gewotCQkJWyBDWDg4X1ZNVVhfQ09NUE9TSVRFMSBdID0gIkNvbXBvc2l0ZTEiLAotCQkJWyBDWDg4X1ZNVVhfQ09NUE9TSVRFMiBdID0gIkNvbXBvc2l0ZTIiLAotCQkJWyBDWDg4X1ZNVVhfQ09NUE9TSVRFMyBdID0gIkNvbXBvc2l0ZTMiLAotCQkJWyBDWDg4X1ZNVVhfQ09NUE9TSVRFNCBdID0gIkNvbXBvc2l0ZTQiLAotCQkJWyBDWDg4X1ZNVVhfU1ZJREVPICAgICBdID0gIlMtVmlkZW8iLAotCQkJWyBDWDg4X1ZNVVhfVEVMRVZJU0lPTiBdID0gIlRlbGV2aXNpb24iLAotCQkJWyBDWDg4X1ZNVVhfQ0FCTEUgICAgICBdID0gIkNhYmxlIFRWIiwKLQkJCVsgQ1g4OF9WTVVYX0RWQiAgICAgICAgXSA9ICJEVkIiLAotCQkJWyBDWDg4X1ZNVVhfREVCVUcgICAgICBdID0gImZvciBkZWJ1ZyBvbmx5IiwKLQkJfTsKLQkJc3RydWN0IHY0bDJfaW5wdXQgKmkgPSBhcmc7Ci0JCXVuc2lnbmVkIGludCBuOwotCi0JCW4gPSBpLT5pbmRleDsKLQkJaWYgKG4gPj0gNCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoMCA9PSBJTlBVVChuKS0+dHlwZSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQltZW1zZXQoaSwwLHNpemVvZigqaSkpOwotCQlpLT5pbmRleCA9IG47Ci0JCWktPnR5cGUgID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKLQkJc3RyY3B5KGktPm5hbWUsaW5hbWVbSU5QVVQobiktPnR5cGVdKTsKLQkJaWYgKChDWDg4X1ZNVVhfVEVMRVZJU0lPTiA9PSBJTlBVVChuKS0+dHlwZSkgfHwKLQkJICAgIChDWDg4X1ZNVVhfQ0FCTEUgICAgICA9PSBJTlBVVChuKS0+dHlwZSkpCi0JCQlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX1RVTkVSOwotCQlmb3IgKG4gPSAwOyBuIDwgQVJSQVlfU0laRSh0dm5vcm1zKTsgbisrKQotCQkJaS0+c3RkIHw9IHR2bm9ybXNbbl0uaWQ7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19HX0lOUFVUOgotCXsKLQkJdW5zaWduZWQgaW50ICppID0gYXJnOwotCi0JCSppID0gZGV2LT5jb3JlLT5pbnB1dDsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1NfSU5QVVQ6Ci0JewotCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7Ci0KLQkJaWYgKCppID49IDQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZG93bigmZGV2LT5sb2NrKTsKLQkJY3g4OF9uZXdzdGF0aW9uKGNvcmUpOwotCQl2aWRlb19tdXgoZGV2LCppKTsKLQkJdXAoJmRldi0+bG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQotCi0KIAkvKiAtLS0gY2FwdHVyZSBpb2N0bHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCWNhc2UgVklESU9DX0VOVU1fRk1UOgogCXsKQEAgLTEyNTcsNiArMTE4OCwxNzYgQEAKIAkJcmV0dXJuIGN4ODgwMF90cnlfZm10KGRldixmaCxmKTsKIAl9CiAKKwkvKiAtLS0gc3RyZWFtaW5nIGNhcHR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DR01CVUY6CisJeworCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqbWJ1ZiA9IGFyZzsKKwkJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxOworCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyByZXE7CisJCXVuc2lnbmVkIGludCBpOworCisJCXEgPSBnZXRfcXVldWUoZmgpOworCQltZW1zZXQoJnJlcSwwLHNpemVvZihyZXEpKTsKKwkJcmVxLnR5cGUgICA9IHEtPnR5cGU7CisJCXJlcS5jb3VudCAgPSA4OworCQlyZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKwkJZXJyID0gdmlkZW9idWZfcmVxYnVmcyhxLCZyZXEpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCW1lbXNldChtYnVmLDAsc2l6ZW9mKCptYnVmKSk7CisJCW1idWYtPmZyYW1lcyA9IHJlcS5jb3VudDsKKwkJbWJ1Zi0+c2l6ZSAgID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG1idWYtPmZyYW1lczsgaSsrKSB7CisJCQltYnVmLT5vZmZzZXRzW2ldICA9IHEtPmJ1ZnNbaV0tPmJvZmY7CisJCQltYnVmLT5zaXplICAgICAgICs9IHEtPmJ1ZnNbaV0tPmJzaXplOworCQl9CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19SRVFCVUZTOgorCQlyZXR1cm4gdmlkZW9idWZfcmVxYnVmcyhnZXRfcXVldWUoZmgpLCBhcmcpOworCisJY2FzZSBWSURJT0NfUVVFUllCVUY6CisJCXJldHVybiB2aWRlb2J1Zl9xdWVyeWJ1ZihnZXRfcXVldWUoZmgpLCBhcmcpOworCisJY2FzZSBWSURJT0NfUUJVRjoKKwkJcmV0dXJuIHZpZGVvYnVmX3FidWYoZ2V0X3F1ZXVlKGZoKSwgYXJnKTsKKworCWNhc2UgVklESU9DX0RRQlVGOgorCQlyZXR1cm4gdmlkZW9idWZfZHFidWYoZ2V0X3F1ZXVlKGZoKSwgYXJnLAorCQkJCQlmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisKKwljYXNlIFZJRElPQ19TVFJFQU1PTjoKKwl7CisJCWludCByZXMgPSBnZXRfcmVzc291cmNlKGZoKTsKKworCQlpZiAoIXJlc19nZXQoZGV2LGZoLHJlcykpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb24oZ2V0X3F1ZXVlKGZoKSk7CisJfQorCWNhc2UgVklESU9DX1NUUkVBTU9GRjoKKwl7CisJCWludCByZXMgPSBnZXRfcmVzc291cmNlKGZoKTsKKworCQllcnIgPSB2aWRlb2J1Zl9zdHJlYW1vZmYoZ2V0X3F1ZXVlKGZoKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJcmVzX2ZyZWUoZGV2LGZoLHJlcyk7CisJCXJldHVybiAwOworCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiBjeDg4X2RvX2lvY3RsKCBpbm9kZSwgZmlsZSwgZmgtPnJhZGlvLCBjb3JlLCBjbWQsIGFyZywgdmlkZW9fZG9faW9jdGwgKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDg4X2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgcmFkaW8sCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcsIHY0bDJfa2lvY3RsIGRyaXZlcl9pb2N0bCkKK3sKKwlpbnQgZXJyOworCisJaWYgKHZpZGVvX2RlYnVnID4gMSkKKwkJY3g4OF9wcmludF9pb2N0bChjb3JlLT5uYW1lLGNtZCk7CisJcHJpbnRrKCBLRVJOX0lORk8gIkNPUkUgSU9DVEw6IDB4JXhcbiIsIGNtZCApOworCWN4ODhfcHJpbnRfaW9jdGwoY29yZS0+bmFtZSxjbWQpOworCWRwcmludGsoIDEsICJDT1JFIElPQ1RMOiAweCV4XG4iLCBjbWQgKTsKKworCXN3aXRjaCAoY21kKSB7CisJLyogLS0tLS0tLS0tLSB0diBub3JtcyAtLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfRU5VTVNURDoKKwl7CisJCXN0cnVjdCB2NGwyX3N0YW5kYXJkICplID0gYXJnOworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlpID0gZS0+aW5kZXg7CisJCWlmIChpID49IEFSUkFZX1NJWkUodHZub3JtcykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyID0gdjRsMl92aWRlb19zdGRfY29uc3RydWN0KGUsIHR2bm9ybXNbZS0+aW5kZXhdLmlkLAorCQkJCQkgICAgICAgdHZub3Jtc1tlLT5pbmRleF0ubmFtZSk7CisJCWUtPmluZGV4ID0gaTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfR19TVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CisKKwkJKmlkID0gY29yZS0+dHZub3JtLT5pZDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX1NfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHR2bm9ybXMpOyBpKyspCisJCQlpZiAoKmlkICYgdHZub3Jtc1tpXS5pZCkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gQVJSQVlfU0laRSh0dm5vcm1zKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRvd24oJmNvcmUtPmxvY2spOworCQljeDg4X3NldF90dm5vcm0oY29yZSwmdHZub3Jtc1tpXSk7CisJCXVwKCZjb3JlLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogLS0tLS0tIGlucHV0IHN3aXRjaGluZyAtLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfRU5VTUlOUFVUOgorCXsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmluYW1lW10gPSB7CisJCQlbIENYODhfVk1VWF9DT01QT1NJVEUxIF0gPSAiQ29tcG9zaXRlMSIsCisJCQlbIENYODhfVk1VWF9DT01QT1NJVEUyIF0gPSAiQ29tcG9zaXRlMiIsCisJCQlbIENYODhfVk1VWF9DT01QT1NJVEUzIF0gPSAiQ29tcG9zaXRlMyIsCisJCQlbIENYODhfVk1VWF9DT01QT1NJVEU0IF0gPSAiQ29tcG9zaXRlNCIsCisJCQlbIENYODhfVk1VWF9TVklERU8gICAgIF0gPSAiUy1WaWRlbyIsCisJCQlbIENYODhfVk1VWF9URUxFVklTSU9OIF0gPSAiVGVsZXZpc2lvbiIsCisJCQlbIENYODhfVk1VWF9DQUJMRSAgICAgIF0gPSAiQ2FibGUgVFYiLAorCQkJWyBDWDg4X1ZNVVhfRFZCICAgICAgICBdID0gIkRWQiIsCisJCQlbIENYODhfVk1VWF9ERUJVRyAgICAgIF0gPSAiZm9yIGRlYnVnIG9ubHkiLAorCQl9OworCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaSA9IGFyZzsKKwkJdW5zaWduZWQgaW50IG47CisKKwkJbiA9IGktPmluZGV4OworCQlpZiAobiA+PSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICgwID09IElOUFVUKG4pLT50eXBlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbXNldChpLDAsc2l6ZW9mKCppKSk7CisJCWktPmluZGV4ID0gbjsKKwkJaS0+dHlwZSAgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCQlzdHJjcHkoaS0+bmFtZSxpbmFtZVtJTlBVVChuKS0+dHlwZV0pOworCQlpZiAoKENYODhfVk1VWF9URUxFVklTSU9OID09IElOUFVUKG4pLT50eXBlKSB8fAorCQkgICAgKENYODhfVk1VWF9DQUJMRSAgICAgID09IElOUFVUKG4pLT50eXBlKSkKKwkJCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfVFVORVI7CisJCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKHR2bm9ybXMpOyBuKyspCisJCQlpLT5zdGQgfD0gdHZub3Jtc1tuXS5pZDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJeworCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisKKwkJKmkgPSBjb3JlLT5pbnB1dDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX1NfSU5QVVQ6CisJeworCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisKKwkJaWYgKCppID49IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG93bigmY29yZS0+bG9jayk7CisJCWN4ODhfbmV3c3RhdGlvbihjb3JlKTsKKwkJdmlkZW9fbXV4KGNvcmUsKmkpOworCQl1cCgmY29yZS0+bG9jayk7CisJCXJldHVybiAwOworCX0KKworCisKIAkvKiAtLS0gY29udHJvbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKIAl7CkBAIC0xMjc3LDkgKzEzNzgsOSBAQAogCQlyZXR1cm4gMDsKIAl9CiAJY2FzZSBWSURJT0NfR19DVFJMOgotCQlyZXR1cm4gZ2V0X2NvbnRyb2woZGV2LGFyZyk7CisJCXJldHVybiBnZXRfY29udHJvbChjb3JlLGFyZyk7CiAJY2FzZSBWSURJT0NfU19DVFJMOgotCQlyZXR1cm4gc2V0X2NvbnRyb2woZGV2LGFyZyk7CisJCXJldHVybiBzZXRfY29udHJvbChjb3JlLGFyZyk7CiAKIAkvKiAtLS0gdHVuZXIgaW9jdGxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCWNhc2UgVklESU9DX0dfVFVORVI6CkBAIC0xMzIzLDEwICsxNDI0LDExIEBACiAJCWlmIChVTlNFVCA9PSBjb3JlLT50dW5lcl90eXBlKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJZi0+dHlwZSA9IGZoLT5yYWRpbyA/IFY0TDJfVFVORVJfUkFESU8gOiBWNEwyX1RVTkVSX0FOQUxPR19UVjsKLQkJZi0+ZnJlcXVlbmN5ID0gZGV2LT5mcmVxOworCQkvKiBmLT50eXBlID0gZmgtPnJhZGlvID8gVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOyAqLworCQlmLT50eXBlID0gcmFkaW8gPyBWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7CisJCWYtPmZyZXF1ZW5jeSA9IGNvcmUtPmZyZXE7CiAKLQkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxWSURJT0NfR19GUkVRVUVOQ1ksZik7CisJCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhjb3JlLFZJRElPQ19HX0ZSRVFVRU5DWSxmKTsKIAogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMzM4LDgzICsxNDQwLDI2IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKGYtPnR1bmVyICE9IDApCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKDAgPT0gZmgtPnJhZGlvICYmIGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9BTkFMT0dfVFYpCisJCWlmICgwID09IHJhZGlvICYmIGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9BTkFMT0dfVFYpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKDEgPT0gZmgtPnJhZGlvICYmIGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9SQURJTykKKwkJaWYgKDEgPT0gcmFkaW8gJiYgZi0+dHlwZSAhPSBWNEwyX1RVTkVSX1JBRElPKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWRvd24oJmRldi0+bG9jayk7Ci0JCWRldi0+ZnJlcSA9IGYtPmZyZXF1ZW5jeTsKKwkJZG93bigmY29yZS0+bG9jayk7CisJCWNvcmUtPmZyZXEgPSBmLT5mcmVxdWVuY3k7CiAJCWN4ODhfbmV3c3RhdGlvbihjb3JlKTsKLQkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxWSURJT0NfU19GUkVRVUVOQ1ksZik7CisJCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhjb3JlLFZJRElPQ19TX0ZSRVFVRU5DWSxmKTsKIAogCQkvKiBXaGVuIGNoYW5naW5nIGNoYW5uZWxzIGl0IGlzIHJlcXVpcmVkIHRvIHJlc2V0IFRWQVVESU8gKi8KIAkJbXNsZWVwICgxMCk7CiAJCWN4ODhfc2V0X3R2YXVkaW8oY29yZSk7CiAKLQkJdXAoJmRldi0+bG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIC0tLSBzdHJlYW1pbmcgY2FwdHVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0JY2FzZSBWSURJT0NHTUJVRjoKLQl7Ci0JCXN0cnVjdCB2aWRlb19tYnVmICptYnVmID0gYXJnOwotCQlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnE7Ci0JCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIHJlcTsKLQkJdW5zaWduZWQgaW50IGk7Ci0KLQkJcSA9IGdldF9xdWV1ZShmaCk7Ci0JCW1lbXNldCgmcmVxLDAsc2l6ZW9mKHJlcSkpOwotCQlyZXEudHlwZSAgID0gcS0+dHlwZTsKLQkJcmVxLmNvdW50ICA9IDg7Ci0JCXJlcS5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCQllcnIgPSB2aWRlb2J1Zl9yZXFidWZzKHEsJnJlcSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJbWVtc2V0KG1idWYsMCxzaXplb2YoKm1idWYpKTsKLQkJbWJ1Zi0+ZnJhbWVzID0gcmVxLmNvdW50OwotCQltYnVmLT5zaXplICAgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgbWJ1Zi0+ZnJhbWVzOyBpKyspIHsKLQkJCW1idWYtPm9mZnNldHNbaV0gID0gcS0+YnVmc1tpXS0+Ym9mZjsKLQkJCW1idWYtPnNpemUgICAgICAgKz0gcS0+YnVmc1tpXS0+YnNpemU7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1JFUUJVRlM6Ci0JCXJldHVybiB2aWRlb2J1Zl9yZXFidWZzKGdldF9xdWV1ZShmaCksIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19RVUVSWUJVRjoKLQkJcmV0dXJuIHZpZGVvYnVmX3F1ZXJ5YnVmKGdldF9xdWV1ZShmaCksIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19RQlVGOgotCQlyZXR1cm4gdmlkZW9idWZfcWJ1ZihnZXRfcXVldWUoZmgpLCBhcmcpOwotCi0JY2FzZSBWSURJT0NfRFFCVUY6Ci0JCXJldHVybiB2aWRlb2J1Zl9kcWJ1ZihnZXRfcXVldWUoZmgpLCBhcmcsCi0JCQkJICAgICAgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JY2FzZSBWSURJT0NfU1RSRUFNT046Ci0JewotCQlpbnQgcmVzID0gZ2V0X3Jlc3NvdXJjZShmaCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXJlc19nZXQoZGV2LGZoLHJlcykpCi0JCQlyZXR1cm4gLUVCVVNZOwotCQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb24oZ2V0X3F1ZXVlKGZoKSk7Ci0JfQotCWNhc2UgVklESU9DX1NUUkVBTU9GRjoKLQl7Ci0JCWludCByZXMgPSBnZXRfcmVzc291cmNlKGZoKTsKLQotCQllcnIgPSB2aWRlb2J1Zl9zdHJlYW1vZmYoZ2V0X3F1ZXVlKGZoKSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJcmVzX2ZyZWUoZGV2LGZoLHJlcyk7CisJCXVwKCZjb3JlLT5sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZywKLQkJCQkJCSAgdmlkZW9fZG9faW9jdGwpOworCQkJCQkJICBkcml2ZXJfaW9jdGwpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTE0NjEsNyArMTUwNiw3IEBACiAJCW1lbXNldCh0LDAsc2l6ZW9mKCp0KSk7CiAJCXN0cmNweSh0LT5uYW1lLCAiUmFkaW8iKTsKIAotCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFZJRElPQ19HX1RVTkVSLHQpOworCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoY29yZSxWSURJT0NfR19UVU5FUix0KTsKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKQEAgLTE1MDEsOCArMTU0Niw4IEBACiAJCWlmICh2LT50dW5lcikgLyogT25seSB0dW5lciAwICovCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFZJRElPQ1NUVU5FUix2KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGNvcmUsVklESU9DU1RVTkVSLHYpOworCQlyZXR1cm4gMDsKIAl9CiAJY2FzZSBWSURJT0NfU19UVU5FUjoKIAl7CkBAIC0xNTExLDcgKzE1NTYsNyBAQAogCQlpZiAoMCAhPSB0LT5pbmRleCkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhkZXYtPmNvcmUsVklESU9DX1NfVFVORVIsdCk7CisJCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhjb3JlLFZJRElPQ19TX1RVTkVSLHQpOwogCiAJCXJldHVybiAwOwogCX0KQEAgLTE1NjksNyArMTYxNCw3IEBACiAJc3RydWN0IGN4ODhfYnVmZmVyICpidWY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWN4ODhfc3JhbV9jaGFubmVsX2R1bXAoZGV2LT5jb3JlLCAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyMV0pOworCWN4ODhfc3JhbV9jaGFubmVsX2R1bXAoY29yZSwgJmN4ODhfc3JhbV9jaGFubmVsc1tTUkFNX0NIMjFdKTsKIAogCWN4X2NsZWFyKE1PX1ZJRF9ETUFDTlRSTCwgMHgxMSk7CiAJY3hfY2xlYXIoVklEX0NBUFRVUkVfQ09OVFJPTCwgMHgwNik7CkBAIC0xNjE0LDE0ICsxNjU5LDE0IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzLzA6IHZpZGVvIHJpc2Mgb3AgY29kZSBlcnJvclxuIixjb3JlLT5uYW1lKTsKIAkJY3hfY2xlYXIoTU9fVklEX0RNQUNOVFJMLCAweDExKTsKIAkJY3hfY2xlYXIoVklEX0NBUFRVUkVfQ09OVFJPTCwgMHgwNik7Ci0JCWN4ODhfc3JhbV9jaGFubmVsX2R1bXAoZGV2LT5jb3JlLCAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyMV0pOworCQljeDg4X3NyYW1fY2hhbm5lbF9kdW1wKGNvcmUsICZjeDg4X3NyYW1fY2hhbm5lbHNbU1JBTV9DSDIxXSk7CiAJfQogCiAJLyogcmlzYzEgeSAqLwogCWlmIChzdGF0dXMgJiAweDAxKSB7CiAJCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CiAJCWNvdW50ID0gY3hfcmVhZChNT19WSURZX0dQQ05UKTsKLQkJY3g4OF93YWtldXAoZGV2LT5jb3JlLCAmZGV2LT52aWRxLCBjb3VudCk7CisJCWN4ODhfd2FrZXVwKGNvcmUsICZkZXYtPnZpZHEsIGNvdW50KTsKIAkJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOwogCX0KIApAQCAtMTYyOSw3ICsxNjc0LDcgQEAKIAlpZiAoc3RhdHVzICYgMHgwOCkgewogCQlzcGluX2xvY2soJmRldi0+c2xvY2spOwogCQljb3VudCA9IGN4X3JlYWQoTU9fVkJJX0dQQ05UKTsKLQkJY3g4OF93YWtldXAoZGV2LT5jb3JlLCAmZGV2LT52YmlxLCBjb3VudCk7CisJCWN4ODhfd2FrZXVwKGNvcmUsICZkZXYtPnZiaXEsIGNvdW50KTsKIAkJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOwogCX0KIApAQCAtMTc5OCw3ICsxODQzLDYgQEAKIAl9CiAKIAkvKiBpbml0aWFsaXplIGRyaXZlciBzdHJ1Y3QgKi8KLSAgICAgICAgaW5pdF9NVVRFWCgmZGV2LT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5zbG9jayk7CiAJY29yZS0+dHZub3JtID0gdHZub3JtczsKIApAQCAtMTgzNSw2ICsxODc5LDcgQEAKIAkJcmVxdWVzdF9tb2R1bGUoInR1bmVyIik7CiAJaWYgKGNvcmUtPnRkYTk4ODdfY29uZikKIAkJcmVxdWVzdF9tb2R1bGUoInRkYTk4ODciKTsKKwogCS8qIHJlZ2lzdGVyIHY0bCBkZXZpY2VzICovCiAJZGV2LT52aWRlb19kZXYgPSBjeDg4X3ZkZXZfaW5pdChjb3JlLGRldi0+cGNpLAogCQkJCQkmY3g4ODAwX3ZpZGVvX3RlbXBsYXRlLCJ2aWRlbyIpOwpAQCAtMTg3OCwxMSArMTkyMywxMSBAQAogCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LGRldik7CiAKIAkvKiBpbml0aWFsIGRldmljZSBjb25maWd1cmF0aW9uICovCi0JZG93bigmZGV2LT5sb2NrKTsKLQlpbml0X2NvbnRyb2xzKGRldik7Ci0JY3g4OF9zZXRfdHZub3JtKGRldi0+Y29yZSx0dm5vcm1zKTsKLQl2aWRlb19tdXgoZGV2LDApOwotCXVwKCZkZXYtPmxvY2spOworCWRvd24oJmNvcmUtPmxvY2spOworCWluaXRfY29udHJvbHMoY29yZSk7CisJY3g4OF9zZXRfdHZub3JtKGNvcmUsdHZub3Jtcyk7CisJdmlkZW9fbXV4KGNvcmUsMCk7CisJdXAoJmNvcmUtPmxvY2spOwogCiAJLyogc3RhcnQgdHZhdWRpbyB0aHJlYWQgKi8KIAlpZiAoY29yZS0+dHVuZXJfdHlwZSAhPSBUVU5FUl9BQlNFTlQpCkBAIC0xOTAyLDE0ICsxOTQ3LDE1IEBACiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgY3g4ODAwX2ZpbmlkZXYoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCiB7CiAgICAgICAgIHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKIAogCS8qIHN0b3AgdGhyZWFkICovCi0JaWYgKGRldi0+Y29yZS0+a3RocmVhZCkgewotCQlrdGhyZWFkX3N0b3AoZGV2LT5jb3JlLT5rdGhyZWFkKTsKLQkJZGV2LT5jb3JlLT5rdGhyZWFkID0gTlVMTDsKKwlpZiAoY29yZS0+a3RocmVhZCkgeworCQlrdGhyZWFkX3N0b3AoY29yZS0+a3RocmVhZCk7CisJCWNvcmUtPmt0aHJlYWQgPSBOVUxMOwogCX0KIAotCWN4ODhfc2h1dGRvd24oZGV2LT5jb3JlKTsgLyogRklYTUUgKi8KKwljeDg4X3NodXRkb3duKGNvcmUpOyAvKiBGSVhNRSAqLwogCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKIAogCS8qIHVucmVnaXN0ZXIgc3R1ZmYgKi8KQEAgLTE5MjEsNyArMTk2Nyw3IEBACiAJLyogZnJlZSBtZW1vcnkgKi8KIAlidGN4X3Jpc2NtZW1fZnJlZShkZXYtPnBjaSwmZGV2LT52aWRxLnN0b3BwZXIpOwogCWxpc3RfZGVsKCZkZXYtPmRldmxpc3QpOwotCWN4ODhfY29yZV9wdXQoZGV2LT5jb3JlLGRldi0+cGNpKTsKKwljeDg4X2NvcmVfcHV0KGNvcmUsZGV2LT5wY2kpOwogCWtmcmVlKGRldik7CiB9CiAKQEAgLTE5NDUsNyArMTk5MSw3IEBACiAJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOwogCiAJLyogRklYTUUgLS0gc2h1dGRvd24gZGV2aWNlICovCi0JY3g4OF9zaHV0ZG93bihkZXYtPmNvcmUpOworCWN4ODhfc2h1dGRvd24oY29yZSk7CiAKIAlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKIAlpZiAoMCAhPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGNpX2Rldiwgc3RhdGUpKSkgewpAQCAtMTk1OSwxNiArMjAwNSwzMiBAQAogewogCXN0cnVjdCBjeDg4MDBfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKwlpbnQgZXJyOwogCiAJaWYgKGRldi0+c3RhdGUuZGlzYWJsZWQpIHsKLQkJcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJCWVycj1wY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZW5hYmxlIGRldmljZVxuIiwKKwkJCQkJCSAgICAgICBjb3JlLT5uYW1lKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwogCQlkZXYtPnN0YXRlLmRpc2FibGVkID0gMDsKIAl9Ci0JcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBQQ0lfRDApOworCWVycj0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBQQ0lfRDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZW5hYmxlIGRldmljZVxuIiwKKwkJCQkgICAgICAgY29yZS0+bmFtZSk7CisKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworCQlkZXYtPnN0YXRlLmRpc2FibGVkID0gMTsKKworCQlyZXR1cm4gZXJyOworCX0KIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKIAogCS8qIEZJWE1FOiByZS1pbml0aWFsaXplIGhhcmR3YXJlICovCi0JY3g4OF9yZXNldChkZXYtPmNvcmUpOworCWN4ODhfcmVzZXQoY29yZSk7CiAKIAkvKiByZXN0YXJ0IHZpZGVvK3ZiaSBjYXB0dXJlICovCiAJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKQEAgLTIwMzAsNiArMjA5Miw4IEBACiBtb2R1bGVfaW5pdChjeDg4MDBfaW5pdCk7CiBtb2R1bGVfZXhpdChjeDg4MDBfZmluaSk7CiAKK0VYUE9SVF9TWU1CT0woY3g4OF9kb19pb2N0bCk7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKaW5kZXggZGE2NWRjOS4uZjQ4ZGQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogY3g4OC5oLHYgMS43MCAyMDA1LzA3LzI0IDE3OjQ0OjA5IG1rcnVma3kgRXhwICQKICAqCiAgKiB2NGwyIGRldmljZSBkcml2ZXIgZm9yIGN4MjM4OHggYmFzZWQgVFYgY2FyZHMKICAqCkBAIC0zNSw3ICszNCw3IEBACiAjaW5jbHVkZSAiYnRjeC1yaXNjLmgiCiAjaW5jbHVkZSAiY3g4OC1yZWcuaCIKIAotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjZGVmaW5lIENYODhfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsMCw1KQogCiAjaWZuZGVmIFRSVUUKQEAgLTQ4LDYgKzQ3LDkgQEAKIAogI2RlZmluZSBDWDg4X01BWEJPQVJEUyA4CiAKKy8qIE1heCBudW1iZXIgb2YgaW5wdXRzIGJ5IGNhcmQgKi8KKyNkZWZpbmUgTUFYX0NYODhfSU5QVVQgOAorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogZGVmaW5lcyBhbmQgZW51bXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApAQCAtMTk5LDcgKzIwMSw3IEBACiAJdW5zaWduZWQgY2hhcgkJdHVuZXJfYWRkcjsKIAl1bnNpZ25lZCBjaGFyCQlyYWRpb19hZGRyOwogCWludCAgICAgICAgICAgICAgICAgICAgIHRkYTk4ODdfY29uZjsKLQlzdHJ1Y3QgY3g4OF9pbnB1dCAgICAgICBpbnB1dFs4XTsKKwlzdHJ1Y3QgY3g4OF9pbnB1dCAgICAgICBpbnB1dFtNQVhfQ1g4OF9JTlBVVF07CiAJc3RydWN0IGN4ODhfaW5wdXQgICAgICAgcmFkaW87CiAJaW50ICAgICAgICAgICAgICAgICAgICAgYmxhY2tiaXJkOjE7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgZHZiOjE7CkBAIC0yODgsNiArMjkwLDExIEBACiAKIAkvKiBJUiByZW1vdGUgY29udHJvbCBzdGF0ZSAqLwogCXN0cnVjdCBjeDg4X0lSICAgICAgICAgICAgICppcjsKKworCXN0cnVjdCBzZW1hcGhvcmUgICAgICAgICAgIGxvY2s7CisKKwkvKiB2YXJpb3VzIHY0bCBjb250cm9scyAqLworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGZyZXE7CiB9OwogCiBzdHJ1Y3QgY3g4ODAwX2RldjsKQEAgLTMyMyw4ICszMzAsNyBAQAogc3RydWN0IGN4ODgwMF9kZXYgewogCXN0cnVjdCBjeDg4X2NvcmUgICAgICAgICAgICpjb3JlOwogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgIGRldmxpc3Q7Ci0gICAgICAgIHN0cnVjdCBzZW1hcGhvcmUgICAgICAgICAgIGxvY2s7Ci0gICAgICAgCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgIHNsb2NrOworCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgIHNsb2NrOwogCiAJLyogdmFyaW91cyBkZXZpY2UgaW5mbyAqLwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHJlc291cmNlczsKQEAgLTM0Miw3ICszNDgsNiBAQAogCXN0cnVjdCBjeDg4X2RtYXF1ZXVlICAgICAgIHZiaXE7CiAKIAkvKiB2YXJpb3VzIHY0bCBjb250cm9scyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGZyZXE7CiAKIAkvKiBvdGhlciBnbG9iYWwgc3RhdGUgaW5mbyAqLwogCXN0cnVjdCBjeDg4MDBfc3VzcGVuZF9zdGF0ZSBzdGF0ZTsKQEAgLTM1MCwxNCArMzU1LDggQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGZ1bmN0aW9uIDE6IGF1ZGlvL2Fsc2Egc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PiBtb3ZlZCB0byBjeDg4LWFsc2EuYyA8PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi1zdHJ1Y3QgY3g4ODAxX2RldiB7Ci0Jc3RydWN0IGN4ODhfY29yZSAgICAgICAgICAgKmNvcmU7Ci0KLQkvKiBwY2kgaS9vICovCi0Jc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAgKnBjaTsKLQl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICBwY2lfcmV2LHBjaV9sYXQ7Ci19OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogZnVuY3Rpb24gMjogbXBlZyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM3Myw4ICszNzIsNyBAQAogCiBzdHJ1Y3QgY3g4ODAyX2RldiB7CiAJc3RydWN0IGN4ODhfY29yZSAgICAgICAgICAgKmNvcmU7Ci0gICAgICAgIHN0cnVjdCBzZW1hcGhvcmUgICAgICAgICAgIGxvY2s7Ci0gICAgICAgCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgIHNsb2NrOworCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgIHNsb2NrOwogCiAJLyogcGNpIGkvbyAqLwogCXN0cnVjdCBwY2lfZGV2ICAgICAgICAgICAgICpwY2k7CkBAIC01NTMsOCArNTUxLDIxIEBACiBpbnQgY3g4ODAyX3N1c3BlbmRfY29tbW9uKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwogaW50IGN4ODgwMl9yZXN1bWVfY29tbW9uKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKIAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGN4ODgtdmlkZW8uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitleHRlcm4gaW50IGN4ODhfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCByYWRpbywKKwkJCQlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXZvaWQgKmFyZywgdjRsMl9raW9jdGwgZHJpdmVyX2lvY3RsKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGN4ODgtYmxhY2tiaXJkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitleHRlcm4gaW50ICgqY3g4OF9pb2N0bF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworZXh0ZXJuIHVuc2lnbmVkIGludCAoKmN4ODhfaW9jdGxfdHJhbnNsYXRvcikodW5zaWduZWQgaW50IGNtZCk7CisKIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXM6CiAgKiBjLWJhc2ljLW9mZnNldDogOAogICogRW5kOgorICoga2F0ZTogZW9sICJ1bml4IjsgaW5kZW50LXdpZHRoIDM7IHJlbW92ZS10cmFpbGluZy1zcGFjZSBvbjsgcmVwbGFjZS10cmFpbGluZy1zcGFjZS1zYXZlIG9uOyB0YWItd2lkdGggODsgcmVwbGFjZS10YWJzIG9mZjsgc3BhY2UtaW5kZW50IG9mZjsgbWl4ZWQtaW5kZW50IG9mZgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2luZHljYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaW5keWNhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjAzODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2luZHljYW0uYwpAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAqICBpbmR5Y2FtLmMgLSBTaWxpY29uIEdyYXBoaWNzIEluZHlDYW0gZGlnaXRhbCBjYW1lcmEgZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMyBMYWRpc2xhdiBNaWNobCA8bGFkaXNAbGludXgtbWlwcy5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgTWlrYWVsIE5vdXNpYWluZW4gPHRtbm91c2lhQGNjLmh1dC5maT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKy8qIEluZHlDYW0gZGVjb2RlcyBzdHJlYW0gb2YgcGhvdG9ucyBpbnRvIGRpZ2l0YWwgaW1hZ2UgcmVwcmVzZW50YXRpb24gOy0pICovCisjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjaW5jbHVkZSAiaW5keWNhbS5oIgorCisvLyNkZWZpbmUgSU5EWUNBTV9ERUJVRworCisjZGVmaW5lIElORFlDQU1fTU9EVUxFX1ZFUlNJT04gIjAuMC4zIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIlNHSSBJbmR5Q2FtIGRyaXZlciIpOworTU9EVUxFX1ZFUlNJT04oSU5EWUNBTV9NT0RVTEVfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKCJNaWthZWwgTm91c2lhaW5lbiA8dG1ub3VzaWFAY2MuaHV0LmZpPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZkZWYgSU5EWUNBTV9ERUJVRworI2RlZmluZSBkcHJpbnRrKHguLi4pIHByaW50aygiSW5keUNhbTogIiB4KTsKKyNkZWZpbmUgaW5keWNhbV9yZWdkdW1wKGNsaWVudCkgaW5keWNhbV9yZWdkdW1wX2RlYnVnKGNsaWVudCkKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoeC4uLikKKyNkZWZpbmUgaW5keWNhbV9yZWdkdW1wKGNsaWVudCkKKyNlbmRpZgorCisjZGVmaW5lIFZJTk9fQURBUFRFUgkoSTJDX0FMR09fU0dJIHwgSTJDX0hXX1NHSV9WSU5PKQorCitzdHJ1Y3QgaW5keWNhbSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlpbnQgdmVyc2lvbjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX2luZHljYW07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGluaXRzZXFbXSA9IHsKKwlJTkRZQ0FNX0NPTlRST0xfQUdDRU5BLAkJLyogSU5EWUNBTV9DT05UUk9MICovCisJSU5EWUNBTV9TSFVUVEVSX0RFRkFVTFQsCS8qIElORFlDQU1fU0hVVFRFUiAqLworCUlORFlDQU1fR0FJTl9ERUZBVUxULAkJLyogSU5EWUNBTV9HQUlOICovCisJMHgwMCwJCQkJLyogSU5EWUNBTV9CUklHSFRORVNTIChyZWFkLW9ubHkpICovCisJSU5EWUNBTV9SRURfQkFMQU5DRV9ERUZBVUxULAkvKiBJTkRZQ0FNX1JFRF9CQUxBTkNFICovCisJSU5EWUNBTV9CTFVFX0JBTEFOQ0VfREVGQVVMVCwJLyogSU5EWUNBTV9CTFVFX0JBTEFOQ0UgKi8KKwlJTkRZQ0FNX1JFRF9TQVRVUkFUSU9OX0RFRkFVTFQsCS8qIElORFlDQU1fUkVEX1NBVFVSQVRJT04gKi8KKwlJTkRZQ0FNX0JMVUVfU0FUVVJBVElPTl9ERUZBVUxULC8qIElORFlDQU1fQkxVRV9TQVRVUkFUSU9OICovCit9OworCisvKiBJbmR5Q2FtIHJlZ2lzdGVyIGhhbmRsaW5nICovCisKK3N0YXRpYyBpbnQgaW5keWNhbV9yZWFkX3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjaGFyIHJlZywKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqdmFsdWUpCit7CisJaW50IHJldDsKKworCWlmIChyZWcgPT0gSU5EWUNBTV9SRVNFVCkgeworCQlkcHJpbnRrKCJpbmR5Y2FtX3JlYWRfcmVnKCk6ICIKKwkJCSJza2lwcGluZyB3cml0ZS1vbmx5IHJlZ2lzdGVyICVkXG4iLCByZWcpOworCQkqdmFsdWUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW5keUNhbTogaW5keWNhbV9yZWFkX3JlZygpOiByZWFkIGZhaWxlZCwgIgorCQkgICAgICAgInJlZ2lzdGVyID0gMHglMDJ4XG4iLCByZWcpOworCQlyZXR1cm4gcmV0OworCX0KKworCSp2YWx1ZSA9ICh1bnNpZ25lZCBjaGFyKXJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluZHljYW1fd3JpdGVfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCWludCBlcnI7CisKKwlpZiAoKHJlZyA9PSBJTkRZQ0FNX0JSSUdIVE5FU1MpCisJICAgIHx8IChyZWcgPT0gSU5EWUNBTV9WRVJTSU9OKSkgeworCQlkcHJpbnRrKCJpbmR5Y2FtX3dyaXRlX3JlZygpOiAiCisJCQkic2tpcHBpbmcgcmVhZC1vbmx5IHJlZ2lzdGVyICVkXG4iLCByZWcpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkcHJpbnRrKCJXcml0aW5nIFJlZyAlZCA9IDB4JTAyeFxuIiwgcmVnLCB2YWx1ZSk7CisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbmR5Q2FtOiBpbmR5Y2FtX3dyaXRlX3JlZygpOiB3cml0ZSBmYWlsZWQsICIKKwkJICAgICAgICJyZWdpc3RlciA9IDB4JTAyeCwgdmFsdWUgPSAweCUwMnhcbiIsIHJlZywgdmFsdWUpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGluZHljYW1fd3JpdGVfYmxvY2soc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY2hhciByZWcsCisJCQkJdW5zaWduZWQgY2hhciBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisJdW5zaWduZWQgY2hhciBpOworCWludCBlcnI7CisKKwlmb3IgKGkgPSByZWc7IGkgPCBsZW5ndGg7IGkrKykgeworCQllcnIgPSBpbmR5Y2FtX3dyaXRlX3JlZyhjbGllbnQsIHJlZyArIGksIGRhdGFbaV0pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSGVscGVyIGZ1bmN0aW9ucyAqLworCisjaWZkZWYgSU5EWUNBTV9ERUJVRworc3RhdGljIHZvaWQgaW5keWNhbV9yZWdkdW1wX2RlYnVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisJCWluZHljYW1fcmVhZF9yZWcoY2xpZW50LCBpLCAmdmFsKTsKKwkJZHByaW50aygiUmVnICVkID0gMHglMDJ4XG4iLCBpLCB2YWwpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGluZHljYW1fZ2V0X2NvbnRyb2xzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJc3RydWN0IGluZHljYW1fY29udHJvbCAqY3RybCkKK3sKKwl1bnNpZ25lZCBjaGFyIGN0cmxfcmVnOworCisJaW5keWNhbV9yZWFkX3JlZyhjbGllbnQsIElORFlDQU1fQ09OVFJPTCwgJmN0cmxfcmVnKTsKKwljdHJsLT5hZ2MgPSAoY3RybF9yZWcgJiBJTkRZQ0FNX0NPTlRST0xfQUdDRU5BKQorCQk/IElORFlDQU1fVkFMVUVfRU5BQkxFRAorCQk6IElORFlDQU1fVkFMVUVfRElTQUJMRUQ7CisJY3RybC0+YXdiID0gKGN0cmxfcmVnICYgSU5EWUNBTV9DT05UUk9MX0FXQkNUTCkKKwkJPyBJTkRZQ0FNX1ZBTFVFX0VOQUJMRUQKKwkJOiBJTkRZQ0FNX1ZBTFVFX0RJU0FCTEVEOworCWluZHljYW1fcmVhZF9yZWcoY2xpZW50LCBJTkRZQ0FNX1NIVVRURVIsCisJCQkgKHVuc2lnbmVkIGNoYXIgKikmY3RybC0+c2h1dHRlcik7CisJaW5keWNhbV9yZWFkX3JlZyhjbGllbnQsIElORFlDQU1fR0FJTiwKKwkJCSAodW5zaWduZWQgY2hhciAqKSZjdHJsLT5nYWluKTsKKwlpbmR5Y2FtX3JlYWRfcmVnKGNsaWVudCwgSU5EWUNBTV9SRURfQkFMQU5DRSwKKwkJCSAodW5zaWduZWQgY2hhciAqKSZjdHJsLT5yZWRfYmFsYW5jZSk7CisJaW5keWNhbV9yZWFkX3JlZyhjbGllbnQsIElORFlDQU1fQkxVRV9CQUxBTkNFLAorCQkJICh1bnNpZ25lZCBjaGFyICopJmN0cmwtPmJsdWVfYmFsYW5jZSk7CisJaW5keWNhbV9yZWFkX3JlZyhjbGllbnQsIElORFlDQU1fUkVEX1NBVFVSQVRJT04sCisJCQkgKHVuc2lnbmVkIGNoYXIgKikmY3RybC0+cmVkX3NhdHVyYXRpb24pOworCWluZHljYW1fcmVhZF9yZWcoY2xpZW50LCBJTkRZQ0FNX0JMVUVfU0FUVVJBVElPTiwKKwkJCSAodW5zaWduZWQgY2hhciAqKSZjdHJsLT5ibHVlX3NhdHVyYXRpb24pOworCWluZHljYW1fcmVhZF9yZWcoY2xpZW50LCBJTkRZQ0FNX0dBTU1BLAorCQkJICh1bnNpZ25lZCBjaGFyICopJmN0cmwtPmdhbW1hKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluZHljYW1fc2V0X2NvbnRyb2xzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJc3RydWN0IGluZHljYW1fY29udHJvbCAqY3RybCkKK3sKKwl1bnNpZ25lZCBjaGFyIGN0cmxfcmVnOworCisJaW5keWNhbV9yZWFkX3JlZyhjbGllbnQsIElORFlDQU1fQ09OVFJPTCwgJmN0cmxfcmVnKTsKKwlpZiAoY3RybC0+YWdjICE9IElORFlDQU1fVkFMVUVfVU5DSEFOR0VEKSB7CisJCWlmIChjdHJsLT5hZ2MpCisJCQljdHJsX3JlZyB8PSBJTkRZQ0FNX0NPTlRST0xfQUdDRU5BOworCQllbHNlCisJCQljdHJsX3JlZyAmPSB+SU5EWUNBTV9DT05UUk9MX0FHQ0VOQTsKKwl9CisJaWYgKGN0cmwtPmF3YiAhPSBJTkRZQ0FNX1ZBTFVFX1VOQ0hBTkdFRCkgeworCQlpZiAoY3RybC0+YXdiKQorCQkJY3RybF9yZWcgfD0gSU5EWUNBTV9DT05UUk9MX0FXQkNUTDsKKwkJZWxzZQorCQkJY3RybF9yZWcgJj0gfklORFlDQU1fQ09OVFJPTF9BV0JDVEw7CisJfQorCWluZHljYW1fd3JpdGVfcmVnKGNsaWVudCwgSU5EWUNBTV9DT05UUk9MLCBjdHJsX3JlZyk7CisKKwlpZiAoY3RybC0+c2h1dHRlciA+PSAwKQorCQlpbmR5Y2FtX3dyaXRlX3JlZyhjbGllbnQsIElORFlDQU1fU0hVVFRFUiwgY3RybC0+c2h1dHRlcik7CisJaWYgKGN0cmwtPmdhaW4gPj0gMCkKKwkJaW5keWNhbV93cml0ZV9yZWcoY2xpZW50LCBJTkRZQ0FNX0dBSU4sIGN0cmwtPmdhaW4pOworCWlmIChjdHJsLT5yZWRfYmFsYW5jZSA+PSAwKQorCQlpbmR5Y2FtX3dyaXRlX3JlZyhjbGllbnQsIElORFlDQU1fUkVEX0JBTEFOQ0UsCisJCQkJICBjdHJsLT5yZWRfYmFsYW5jZSk7CisJaWYgKGN0cmwtPmJsdWVfYmFsYW5jZSA+PSAwKQorCQlpbmR5Y2FtX3dyaXRlX3JlZyhjbGllbnQsIElORFlDQU1fQkxVRV9CQUxBTkNFLAorCQkJCSAgY3RybC0+Ymx1ZV9iYWxhbmNlKTsKKwlpZiAoY3RybC0+cmVkX3NhdHVyYXRpb24gPj0gMCkKKwkJaW5keWNhbV93cml0ZV9yZWcoY2xpZW50LCBJTkRZQ0FNX1JFRF9TQVRVUkFUSU9OLAorCQkJCSAgY3RybC0+cmVkX3NhdHVyYXRpb24pOworCWlmIChjdHJsLT5ibHVlX3NhdHVyYXRpb24gPj0gMCkKKwkJaW5keWNhbV93cml0ZV9yZWcoY2xpZW50LCBJTkRZQ0FNX0JMVUVfU0FUVVJBVElPTiwKKwkJCQkgIGN0cmwtPmJsdWVfc2F0dXJhdGlvbik7CisJaWYgKGN0cmwtPmdhbW1hID49IDApCisJCWluZHljYW1fd3JpdGVfcmVnKGNsaWVudCwgSU5EWUNBTV9HQU1NQSwgY3RybC0+Z2FtbWEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEkyQy1pbnRlcmZhY2UgKi8KKworc3RhdGljIGludCBpbmR5Y2FtX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgaW5keWNhbSAqY2FtZXJhOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJTR0kgSW5keUNhbSBkcml2ZXIgdmVyc2lvbiAlc1xuIiwKKwkgICAgICAgSU5EWUNBTV9NT0RVTEVfVkVSU0lPTik7CisKKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmICghY2xpZW50KQorCQlyZXR1cm4gLUVOT01FTTsKKwljYW1lcmEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5keWNhbSksIEdGUF9LRVJORUwpOworCWlmICghY2FtZXJhKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfY2xpZW50OworCX0KKworCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCW1lbXNldChjYW1lcmEsIDAsIHNpemVvZihzdHJ1Y3QgaW5keWNhbSkpOworCisJY2xpZW50LT5hZGRyID0gYWRkcjsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwOworCWNsaWVudC0+ZHJpdmVyID0gJmkyY19kcml2ZXJfaW5keWNhbTsKKwljbGllbnQtPmZsYWdzID0gMDsKKwlzdHJjcHkoY2xpZW50LT5uYW1lLCAiSW5keUNhbSBjbGllbnQiKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjYW1lcmEpOworCisJY2FtZXJhLT5jbGllbnQgPSBjbGllbnQ7CisKKwllcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWVfY2FtZXJhOworCisJY2FtZXJhLT52ZXJzaW9uID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgSU5EWUNBTV9WRVJTSU9OKTsKKwlpZiAoY2FtZXJhLT52ZXJzaW9uICE9IENBTUVSQV9WRVJTSU9OX0lORFkgJiYKKwkgICAgY2FtZXJhLT52ZXJzaW9uICE9IENBTUVSQV9WRVJTSU9OX01PT1NFKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2RldGFjaF9jbGllbnQ7CisJfQorCXByaW50ayhLRVJOX0lORk8gIkluZHlDYW0gdiVkLiVkIGRldGVjdGVkXG4iLAorCSAgICAgICBJTkRZQ0FNX1ZFUlNJT05fTUFKT1IoY2FtZXJhLT52ZXJzaW9uKSwKKwkgICAgICAgSU5EWUNBTV9WRVJTSU9OX01JTk9SKGNhbWVyYS0+dmVyc2lvbikpOworCisJaW5keWNhbV9yZWdkdW1wKGNsaWVudCk7CisKKwkvLyBpbml0aWFsaXplCisJZXJyID0gaW5keWNhbV93cml0ZV9ibG9jayhjbGllbnQsIDAsIHNpemVvZihpbml0c2VxKSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopJmluaXRzZXEpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbmR5Q2FtIGluaXRhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXRfZGV0YWNoX2NsaWVudDsKKwl9CisKKwlpbmR5Y2FtX3JlZ2R1bXAoY2xpZW50KTsKKworCS8vIHdoaXRlIGJhbGFuY2UKKwllcnIgPSBpbmR5Y2FtX3dyaXRlX3JlZyhjbGllbnQsIElORFlDQU1fQ09OVFJPTCwKKwkJCSAgSU5EWUNBTV9DT05UUk9MX0FHQ0VOQSB8IElORFlDQU1fQ09OVFJPTF9BV0JDVEwpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbmR5Q2FtIHdoaXRlIGJhbGFuY2UgIgorCQkgICAgICAgImluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X2RldGFjaF9jbGllbnQ7CisJfQorCisJaW5keWNhbV9yZWdkdW1wKGNsaWVudCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJJbmR5Q2FtIGluaXRpYWxpemVkXG4iKTsKKworCXJldHVybiAwOworCitvdXRfZGV0YWNoX2NsaWVudDoKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworb3V0X2ZyZWVfY2FtZXJhOgorCWtmcmVlKGNhbWVyYSk7CitvdXRfZnJlZV9jbGllbnQ6CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGluZHljYW1fcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCS8qIEluZHkgc3BlY2lmaWMgY3JhcCAqLworCWlmIChhZGFwLT5pZCA9PSBWSU5PX0FEQVBURVIpCisJCXJldHVybiBpbmR5Y2FtX2F0dGFjaChhZGFwLCBJTkRZQ0FNX0FERFIsIDApOworCS8qIEZlZWwgZnJlZSB0byBhZGQgcHJvYmUgaGVyZSA6LSkgKi8KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBpbmR5Y2FtX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBpbmR5Y2FtICpjYW1lcmEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoY2FtZXJhKTsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluZHljYW1fY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgdm9pZCAqYXJnKQoreworCS8vIHN0cnVjdCBpbmR5Y2FtICpjYW1lcmEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCS8qIFRoZSBvbGQgdmlkZW9fZGVjb2RlciBpbnRlcmZhY2UganVzdCBpc24ndCBlbm91Z2gsCisJICogc28gd2UnbGwgdXNlIHNvbWUgY3VzdG9tIGNvbW1hbmRzLiAqLworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBERUNPREVSX0dFVF9DQVBBQklMSVRJRVM6IHsKKwkJc3RydWN0IHZpZGVvX2RlY29kZXJfY2FwYWJpbGl0eSAqY2FwID0gYXJnOworCisJCWNhcC0+ZmxhZ3MgID0gVklERU9fREVDT0RFUl9OVFNDOworCQljYXAtPmlucHV0cyA9IDE7CisJCWNhcC0+b3V0cHV0cyA9IDE7CisJCWJyZWFrOworCX0KKwljYXNlIERFQ09ERVJfR0VUX1NUQVRVUzogeworCQlpbnQgKmlhcmcgPSBhcmc7CisKKwkJKmlhcmcgPSBERUNPREVSX1NUQVRVU19HT09EIHwgREVDT0RFUl9TVEFUVVNfTlRTQyB8CisJCQlERUNPREVSX1NUQVRVU19DT0xPUjsKKwkJYnJlYWs7CisJfQorCWNhc2UgREVDT0RFUl9TRVRfTk9STTogeworCQlpbnQgKmlhcmcgPSBhcmc7CisKKwkJc3dpdGNoICgqaWFyZykgeworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgREVDT0RFUl9TRVRfSU5QVVQ6CXsKKwkJaW50ICppYXJnID0gYXJnOworCisJCWlmICgqaWFyZyAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwljYXNlIERFQ09ERVJfU0VUX09VVFBVVDogeworCQlpbnQgKmlhcmcgPSBhcmc7CisKKwkJaWYgKCppYXJnICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWNhc2UgREVDT0RFUl9FTkFCTEVfT1VUUFVUOiB7CisJCS8qIEFsd2F5cyBlbmFibGVkICovCisJCWJyZWFrOworCX0KKwljYXNlIERFQ09ERVJfU0VUX1BJQ1RVUkU6IHsKKwkJLy8gc3RydWN0IHZpZGVvX3BpY3R1cmUgKnBpYyA9IGFyZzsKKwkJLyogVE9ETzogY29udmVydCB2YWx1ZXMgZm9yIGluZHljYW1fc2V0X2NvbnRyb2xzKCkgKi8KKwkJYnJlYWs7CisJfQorCWNhc2UgREVDT0RFUl9JTkRZQ0FNX0dFVF9DT05UUk9MUzogeworCQlzdHJ1Y3QgaW5keWNhbV9jb250cm9sICpjdHJsID0gYXJnOworCQlpbmR5Y2FtX2dldF9jb250cm9scyhjbGllbnQsIGN0cmwpOworCX0KKwljYXNlIERFQ09ERVJfSU5EWUNBTV9TRVRfQ09OVFJPTFM6IHsKKwkJc3RydWN0IGluZHljYW1fY29udHJvbCAqY3RybCA9IGFyZzsKKwkJaW5keWNhbV9zZXRfY29udHJvbHMoY2xpZW50LCBjdHJsKTsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX2luZHljYW0gPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lIAkJPSAiaW5keWNhbSIsCisJLmlkIAkJPSBJMkNfRFJJVkVSSURfSU5EWUNBTSwKKwkuZmxhZ3MgCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyID0gaW5keWNhbV9wcm9iZSwKKwkuZGV0YWNoX2NsaWVudCAJPSBpbmR5Y2FtX2RldGFjaCwKKwkuY29tbWFuZCAJPSBpbmR5Y2FtX2NvbW1hbmQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbmR5Y2FtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmkyY19kcml2ZXJfaW5keWNhbSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpbmR5Y2FtX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmaTJjX2RyaXZlcl9pbmR5Y2FtKTsKK30KKworbW9kdWxlX2luaXQoaW5keWNhbV9pbml0KTsKK21vZHVsZV9leGl0KGluZHljYW1fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2luZHljYW0uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaW5keWNhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZGRiNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2luZHljYW0uaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqICBpbmR5Y2FtLmggLSBTaWxpY29uIEdyYXBoaWNzIEluZHlDYW0gZGlnaXRhbCBjYW1lcmEgZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMyBMYWRpc2xhdiBNaWNobCA8bGFkaXNAbGludXgtbWlwcy5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgTWlrYWVsIE5vdXNpYWluZW4gPHRtbm91c2lhQGNjLmh1dC5maT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0lORFlDQU1fSF8KKyNkZWZpbmUgX0lORFlDQU1fSF8KKworLyogSTJDIGFkZHJlc3MgZm9yIHRoZSBHdWlubmVzcyBDYW1lcmEgKi8KKyNkZWZpbmUgSU5EWUNBTV9BRERSCQkJMHg1NgorCisvKiBDYW1lcmEgdmVyc2lvbiAqLworI2RlZmluZSBDQU1FUkFfVkVSU0lPTl9JTkRZCQkweDEwCS8qIHYxLjAgKi8KKyNkZWZpbmUgQ0FNRVJBX1ZFUlNJT05fTU9PU0UJCTB4MTIJLyogdjEuMiAqLworI2RlZmluZSBJTkRZQ0FNX1ZFUlNJT05fTUFKT1IoeCkJKCgoeCkgJiAweGYwKSA+PiA0KQorI2RlZmluZSBJTkRZQ0FNX1ZFUlNJT05fTUlOT1IoeCkJKCh4KSAmIDB4MGYpCisKKy8qIFJlZ2lzdGVyIGJ1cyBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgSU5EWUNBTV9DT05UUk9MCQkJMHgwMAorI2RlZmluZSBJTkRZQ0FNX1NIVVRURVIJCQkweDAxCisjZGVmaW5lIElORFlDQU1fR0FJTgkJCTB4MDIKKyNkZWZpbmUgSU5EWUNBTV9CUklHSFRORVNTCQkweDAzIC8qIHJlYWQtb25seSAqLworI2RlZmluZSBJTkRZQ0FNX1JFRF9CQUxBTkNFCQkweDA0CisjZGVmaW5lIElORFlDQU1fQkxVRV9CQUxBTkNFCQkweDA1CisjZGVmaW5lIElORFlDQU1fUkVEX1NBVFVSQVRJT04JCTB4MDYKKyNkZWZpbmUgSU5EWUNBTV9CTFVFX1NBVFVSQVRJT04JCTB4MDcKKyNkZWZpbmUgSU5EWUNBTV9HQU1NQQkJCTB4MDgKKyNkZWZpbmUgSU5EWUNBTV9WRVJTSU9OCQkJMHgwZSAvKiByZWFkLW9ubHkgKi8KKyNkZWZpbmUgSU5EWUNBTV9SRVNFVAkJCTB4MGYgLyogd3JpdGUtb25seSAqLworCisjZGVmaW5lIElORFlDQU1fTEVECQkJMHg0NgorI2RlZmluZSBJTkRZQ0FNX09SSUVOVEFUSU9OCQkweDQ3CisjZGVmaW5lIElORFlDQU1fQlVUVE9OCQkJMHg0OAorCisvKiBGaWVsZCBkZWZpbml0aW9ucyBvZiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSU5EWUNBTV9DT05UUk9MX0FHQ0VOQQkJKDE8PDApIC8qIGF1dG9tYXRpYyBnYWluIGNvbnRyb2wgKi8KKyNkZWZpbmUgSU5EWUNBTV9DT05UUk9MX0FXQkNUTAkJKDE8PDEpIC8qIGF1dG9tYXRpYyB3aGl0ZSBiYWxhbmNlICovCisJCQkJCQkvKiAyLTMgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIElORFlDQU1fQ09OVFJPTF9FVk5GTEQJCSgxPDw0KQkvKiByZWFkLW9ubHkgKi8KKworI2RlZmluZSBJTkRZQ0FNX1NIVVRURVJfMTAwMDAJCTB4MDIJLyogMS8xMDAwMCBzZWNvbmQgKi8KKyNkZWZpbmUgSU5EWUNBTV9TSFVUVEVSXzQwMDAJCTB4MDQJLyogMS80MDAwIHNlY29uZCAqLworI2RlZmluZSBJTkRZQ0FNX1NIVVRURVJfMjAwMAkJMHgwOAkvKiAxLzIwMDAgc2Vjb25kICovCisjZGVmaW5lIElORFlDQU1fU0hVVFRFUl8xMDAwCQkweDEwCS8qIDEvMTAwMCBzZWNvbmQgKi8KKyNkZWZpbmUgSU5EWUNBTV9TSFVUVEVSXzUwMAkJMHgyMAkvKiAxLzUwMCBzZWNvbmQgKi8KKyNkZWZpbmUgSU5EWUNBTV9TSFVUVEVSXzI1MAkJMHgzZgkvKiAxLzI1MCBzZWNvbmQgKi8KKyNkZWZpbmUgSU5EWUNBTV9TSFVUVEVSXzEyNQkJMHg3ZQkvKiAxLzEyNSBzZWNvbmQgKi8KKyNkZWZpbmUgSU5EWUNBTV9TSFVUVEVSXzEwMAkJMHg5ZQkvKiAxLzEwMCBzZWNvbmQgKi8KKyNkZWZpbmUgSU5EWUNBTV9TSFVUVEVSXzYwCQkweDAwCS8qIDEvNjAgc2Vjb25kICovCisKKyNkZWZpbmUgSU5EWUNBTV9MRURfQUNUSVZFCQkJMHgxMAorI2RlZmluZSBJTkRZQ0FNX0xFRF9JTkFDVElWRQkJCTB4MzAKKyNkZWZpbmUgSU5EWUNBTV9PUklFTlRBVElPTl9CT1RUT01fVE9fVE9QCTB4NDAKKyNkZWZpbmUgSU5EWUNBTV9CVVRUT05fUkVMRUFTRUQJCQkweDEwCisKKyNkZWZpbmUgSU5EWUNBTV9TSFVUVEVSX01JTgkJMHgwMAorI2RlZmluZSBJTkRZQ0FNX1NIVVRURVJfTUFYCQkweGZmCisjZGVmaW5lIElORFlDQU1fR0FJTl9NSU4gICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBJTkRZQ0FNX0dBSU5fTUFYICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgSU5EWUNBTV9SRURfQkFMQU5DRV9NSU4gCTB4MDAgLyogdGhlIGVmZmVjdCBpcyB0aGUgb3Bwb3NpdGU/ICovCisjZGVmaW5lIElORFlDQU1fUkVEX0JBTEFOQ0VfTUFYIAkweGZmCisjZGVmaW5lIElORFlDQU1fQkxVRV9CQUxBTkNFX01JTiAgICAgICAgMHgwMCAvKiB0aGUgZWZmZWN0IGlzIHRoZSBvcHBvc2l0ZT8gKi8KKyNkZWZpbmUgSU5EWUNBTV9CTFVFX0JBTEFOQ0VfTUFYICAgICAgICAweGZmCisjZGVmaW5lIElORFlDQU1fUkVEX1NBVFVSQVRJT05fTUlOICAgICAgMHgwMAorI2RlZmluZSBJTkRZQ0FNX1JFRF9TQVRVUkFUSU9OX01BWCAgICAgIDB4ZmYKKyNkZWZpbmUgSU5EWUNBTV9CTFVFX1NBVFVSQVRJT05fTUlOCTB4MDAKKyNkZWZpbmUgSU5EWUNBTV9CTFVFX1NBVFVSQVRJT05fTUFYCTB4ZmYKKyNkZWZpbmUgSU5EWUNBTV9HQU1NQV9NSU4JCTB4MDAKKyNkZWZpbmUgSU5EWUNBTV9HQU1NQV9NQVgJCTB4ZmYKKworLyogRHJpdmVyIGludGVyZmFjZSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIElORFlDQU1fVkFMVUVfRU5BQkxFRAkJMQorI2RlZmluZSBJTkRZQ0FNX1ZBTFVFX0RJU0FCTEVECQkwCisjZGVmaW5lIElORFlDQU1fVkFMVUVfVU5DSEFOR0VECQktMQorCisvKiBXaGVuIHNldHRpbmcgY29udHJvbHMsIGEgdmFsdWUgb2YgLTEgbGVhdmVzIHRoZSBjb250cm9sIHVuY2hhbmdlZC4gKi8KK3N0cnVjdCBpbmR5Y2FtX2NvbnRyb2wgeworCWludCBhZ2M7CS8qIGJvb2xlYW4gKi8KKwlpbnQgYXdiOwkvKiBib29sZWFuICovCisJaW50IHNodXR0ZXI7CisJaW50IGdhaW47CisJaW50IHJlZF9iYWxhbmNlOworCWludCBibHVlX2JhbGFuY2U7CisJaW50IHJlZF9zYXR1cmF0aW9uOworCWludCBibHVlX3NhdHVyYXRpb247CisJaW50IGdhbW1hOworfTsKKworI2RlZmluZQlERUNPREVSX0lORFlDQU1fR0VUX0NPTlRST0xTCV9JT1IoJ2QnLCAxOTMsIHN0cnVjdCBpbmR5Y2FtX2NvbnRyb2wpCisjZGVmaW5lCURFQ09ERVJfSU5EWUNBTV9TRVRfQ09OVFJPTFMJX0lPVygnZCcsIDE5NCwgc3RydWN0IGluZHljYW1fY29udHJvbCkKKworLyogRGVmYXVsdCB2YWx1ZXMgZm9yIGNvbnRyb2xzICovCisKKyNkZWZpbmUgSU5EWUNBTV9BR0NfREVGQVVMVAkJSU5EWUNBTV9WQUxVRV9FTkFCTEVECisjZGVmaW5lIElORFlDQU1fQVdCX0RFRkFVTFQJCUlORFlDQU1fVkFMVUVfRU5BQkxFRAorCisjZGVmaW5lIElORFlDQU1fU0hVVFRFUl9ERUZBVUxUCQlJTkRZQ0FNX1NIVVRURVJfNjAKKyNkZWZpbmUgSU5EWUNBTV9HQUlOX0RFRkFVTFQJCTB4ODAKKyNkZWZpbmUgSU5EWUNBTV9SRURfQkFMQU5DRV9ERUZBVUxUCTB4MTgKKyNkZWZpbmUgSU5EWUNBTV9CTFVFX0JBTEFOQ0VfREVGQVVMVAkweGE0CisjZGVmaW5lIElORFlDQU1fUkVEX1NBVFVSQVRJT05fREVGQVVMVAkweDgwCisjZGVmaW5lIElORFlDQU1fQkxVRV9TQVRVUkFUSU9OX0RFRkFVTFQJMHhjMAorI2RlZmluZSBJTkRZQ0FNX0dBTU1BX0RFRkFVTFQJCTB4ODAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1ncGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1ncGlvLmMKaW5kZXggYTU2NTgyMy4uY2YyOTJkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtZ3Bpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWdwaW8uYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGlyLWtiZC1ncGlvLmMsdiAxLjEzIDIwMDUvMDUvMTUgMTk6MDE6MjYgbWNoZWhhYiBFeHAgJAogICoKICAqIENvcHlyaWdodCAoYykgMjAwMyBHZXJkIEtub3JyCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUGF2ZWwgTWFjaGVrCkBAIC0zNTQsNiArMzUzLDcgQEAKIAkJaXItPmlucHV0LmlkLnZlbmRvciAgPSBzdWItPmNvcmUtPnBjaS0+dmVuZG9yOwogCQlpci0+aW5wdXQuaWQucHJvZHVjdCA9IHN1Yi0+Y29yZS0+cGNpLT5kZXZpY2U7CiAJfQorCWlyLT5pbnB1dC5kZXYgPSAmc3ViLT5jb3JlLT5wY2ktPmRldjsKIAogCWlmIChpci0+cG9sbGluZykgewogCQlJTklUX1dPUksoJmlyLT53b3JrLCBpcl93b3JrLCBpcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jCmluZGV4IDlmYzUwNTUuLjY3MTA1YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogaXIta2JkLWkyYy5jLHYgMS4xMSAyMDA1LzA3LzA3IDE2OjQyOjExIG1jaGVoYWIgRXhwICQKICAqCiAgKiBrZXlib2FyZCBpbnB1dCBkcml2ZXIgZm9yIGkyYyBJUiByZW1vdGUgY29udHJvbHMKICAqCkBAIC0zMDgsNyArMzA3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9CiB7Ci0gICAgICAgIEkyQ19ERVZOQU1FKCJ1bnNldCIpLAorICAgICAgICAubmFtZSA9ICJ1bnNldCIsCiAgICAgICAgIC5kcml2ZXIgPSAmZHJpdmVyCiB9OwogCkBAIC00MjksMTAgKzQyOCwxMCBAQAogCXN0cnVjdCBpMmNfY2xpZW50IGM7IGNoYXIgYnVmOyBpbnQgaSxyYzsKIAogCXN3aXRjaCAoYWRhcC0+aWQpIHsKLQljYXNlIEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0JUODQ4OgorCWNhc2UgSTJDX0hXX0JfQlQ4NDg6CiAJCXByb2JlID0gcHJvYmVfYnR0djsKIAkJYnJlYWs7Ci0JY2FzZSBJMkNfQUxHT19TQUE3MTM0OgorCWNhc2UgSTJDX0hXX1NBQTcxMzQ6CiAJCXByb2JlID0gcHJvYmVfc2FhNzEzNDsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tZXllLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuYwppbmRleCBmZTE5NDAxLi4zZjJhODgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlICJtZXllLmgiCiAjaW5jbHVkZSA8bGludXgvbWV5ZS5oPgpAQCAtMTIxLDcgKzEyMiw3IEBACiAJbWVtc2V0KG1leWUubWNoaXBfcHRhYmxlLCAwLCBzaXplb2YobWV5ZS5tY2hpcF9wdGFibGUpKTsKIAogCS8qIGdpdmUgb25seSAzMiBiaXQgRE1BIGFkZHJlc3NlcyAqLwotCWlmIChkbWFfc2V0X21hc2soJm1leWUubWNoaXBfZGV2LT5kZXYsIDB4ZmZmZmZmZmYpKQorCWlmIChkbWFfc2V0X21hc2soJm1leWUubWNoaXBfZGV2LT5kZXYsIERNQV8zMkJJVF9NQVNLKSkKIAkJcmV0dXJuIC0xOwogCiAJbWV5ZS5tY2hpcF9wdGFibGVfdG9jID0gZG1hX2FsbG9jX2NvaGVyZW50KCZtZXllLm1jaGlwX2Rldi0+ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuYwppbmRleCA2MmYxYjhkLi5mMGQ0M2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuYwpAQCAtMTI0LDEwICsxMjQsMTQgQEAKIG1vZHVsZV9wYXJhbShhbXNvdW5kLCAgICAgICAgICBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKGRvbGJ5LCAgICAgICAgICAgIGludCwgMDY0NCk7CiAKK01PRFVMRV9QQVJNX0RFU0Mob3Btb2RlLCAiRm9yY2VzIGEgTVNQMzQwMCBvcG1vZGUuIDA9TWFudWFsLCAxPVNpbXBsZSwgMj1TaW1wbGVyIik7CiBNT0RVTEVfUEFSTV9ERVNDKG9uY2UsICJObyBjb250aW51b3VzIHN0ZXJlbyBtb25pdG9yaW5nIik7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CitNT0RVTEVfUEFSTV9ERVNDKHN0ZXJlb190aHJlc2hvbGQsICJTZXRzIHNpZ25hbCB0aHJlc2hvbGQgdG8gYWN0aXZhdGUgc3RlcmVvIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YW5kYXJkLCAiU3BlY2lmeSBhdWRpbyBzdGFuZGFyZDogMzIgPSBOVFNDLCA2NCA9IHJhZGlvLCBEZWZhdWx0OiBBdXRvZGV0ZWN0Iik7CiBNT0RVTEVfUEFSTV9ERVNDKGFtc291bmQsICJIYXJkd2lyZSBBTSBzb3VuZCBhdCA2LjVIeiAoRnJhbmNlKSwgRk0gY2FuIGF1dG9zY2FuIik7CitNT0RVTEVfUEFSTV9ERVNDKGRvbGJ5LCAiQWN0aXZhdGVzIERvbGJ5IHByb2Nlc3NzaW5nIik7CisKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkZXZpY2UgZHJpdmVyIGZvciBtc3AzNHh4IFRWIHNvdW5kIHByb2Nlc3NvciIpOwogTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciIpOwpAQCAtMTQxNiw3ICsxNDIwLDcgQEAKIHN0YXRpYyBpbnQgbXNwX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCk7CiBzdGF0aWMgaW50IG1zcF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CiAKLXN0YXRpYyBpbnQgbXNwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpOworc3RhdGljIGludCBtc3Bfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHUzMiBsZXZlbCk7CiBzdGF0aWMgaW50IG1zcF9yZXN1bWUoc3RydWN0IGRldmljZSAqIGRldiwgdTMyIGxldmVsKTsKIAogc3RhdGljIHZvaWQgbXNwX3dha2VfdGhyZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwpAQCAtMTQzNyw3ICsxNDQxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9CiB7Ci0JSTJDX0RFVk5BTUUoIih1bnNldCkiKSwKKwkubmFtZSAgICAgID0gIih1bnNldCkiLAogCS5mbGFncyAgICAgPSBJMkNfQ0xJRU5UX0FMTE9XX1VTRSwKICAgICAgICAgLmRyaXZlciAgICA9ICZkcml2ZXIsCiB9OwpAQCAtMTQ1Miw3ICsxNDU2LDcgQEAKICAgICAgICAgY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyOwogCiAgICAgICAgIGlmICgtMSA9PSBtc3AzNDAwY19yZXNldCgmY2xpZW50X3RlbXBsYXRlKSkgewotICAgICAgICAgICAgICAgIGRwcmludGsoIm1zcDM0MDA6IG5vIGNoaXAgZm91bmRcbiIpOworICAgICAgICAgICAgICAgIGRwcmludGsoIm1zcDM0eHg6IG5vIGNoaXAgZm91bmRcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCkBAIC0xNDc4LDcgKzE0ODIsNyBAQAogCWlmICgtMSA9PSBtc3AzNDAwY19yZXNldChjKSkgewogCQlrZnJlZShtc3ApOwogCQlrZnJlZShjKTsKLQkJZHByaW50aygibXNwMzQwMDogbm8gY2hpcCBmb3VuZFxuIik7CisJCWRwcmludGsoIm1zcDM0eHg6IG5vIGNoaXAgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xNDg4LDcgKzE0OTIsNyBAQAogCWlmICgoLTEgPT0gbXNwLT5yZXYxKSB8fCAoMCA9PSBtc3AtPnJldjEgJiYgMCA9PSBtc3AtPnJldjIpKSB7CiAJCWtmcmVlKG1zcCk7CiAJCWtmcmVlKGMpOwotCQlwcmludGsoIm1zcDM0MDA6IGVycm9yIHdoaWxlIHJlYWRpbmcgY2hpcCB2ZXJzaW9uXG4iKTsKKwkJZHByaW50aygibXNwMzR4eDogZXJyb3Igd2hpbGUgcmVhZGluZyBjaGlwIHZlcnNpb25cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xNTA5LDcgKzE1MTMsNyBAQAogCX0KIAogCS8qIGhlbGxvIHdvcmxkIDotKSAqLwotCXByaW50ayhLRVJOX0lORk8gIm1zcDM0eHg6IGluaXQ6IGNoaXA9JXMiLGkyY19jbGllbnRuYW1lKGMpKTsKKwlwcmludGsoS0VSTl9JTkZPICJtc3AzNHh4OiBpbml0OiBjaGlwPSVzIiwgYy0+bmFtZSk7CiAJaWYgKEhBVkVfTklDQU0obXNwKSkKIAkJcHJpbnRrKCIgK25pY2FtIik7CiAJaWYgKEhBVkVfU0lNUExFKG1zcCkpCkBAIC0xODE3LDcgKzE4MjEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1zcF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHUzMiBzdGF0ZSwgdTMyIGxldmVsKQorc3RhdGljIGludCBtc3Bfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHUzMiBsZXZlbCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5oCmluZGV4IDAyM2YzMzAuLjJkOWZmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogbXNwMzQwMC5oLHYgMS4zIDIwMDUvMDYvMTIgMDQ6MTk6MTkgbWNoZWhhYiBFeHAgJAogICovCiAKICNpZm5kZWYgTVNQMzQwMF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210MjB4eC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDIweHguYwppbmRleCAyZmI3YzJkLi45NzJhYTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210MjB4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQyMHh4LmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBtdDIweHguYyx2IDEuNSAyMDA1LzA2LzE2IDA4OjI5OjQ5IG5zaCBFeHAgJAogICoKICAqIGkyYyB0diB0dW5lciBjaGlwIGRldmljZSBkcml2ZXIKICAqIGNvbnRyb2xzIG1pY3JvdHVuZSB0dW5lcnMsIG10MjAzMiArIG10MjA1MCBhdCB0aGUgbW9tZW50LgpAQCAtNDk0LDYgKzQ5Myw3IEBACiAJbWVtc2V0KGJ1ZiwwLHNpemVvZihidWYpKTsKIAl0LT50dl9mcmVxICAgID0gTlVMTDsKIAl0LT5yYWRpb19mcmVxID0gTlVMTDsKKwl0LT5zdGFuZGJ5ICAgID0gTlVMTDsKIAluYW1lID0gInVua25vd24iOwogCiAgICAgICAgIGkyY19tYXN0ZXJfc2VuZChjLGJ1ZiwxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NngyMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y2eDIwLmMKaW5kZXggMzQzMzYxOS4uYjNmNGQyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y2eDIwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y2eDIwLmMKQEAgLTE2NCwxMCArMTY0LDEwIEBACiAJRERFQlVHKDQsICZjLT5kZXYsICJlbnRlcmVkIik7CiAKIAlzd2l0Y2ggKGMtPmFkYXB0ZXItPmlkKSB7Ci0JY2FzZSBJMkNfQUxHT19TTUJVUyB8IEkyQ19IV19TTUJVU19PVjUxMToKKwljYXNlIEkyQ19IV19TTUJVU19PVjUxMToKIAkJcmMgPSBvdl93cml0ZV9yZWd2YWxzKGMsIHJlZ3ZhbHNfaW5pdF82eDIwXzUxMSk7CiAJCWJyZWFrOwotCWNhc2UgSTJDX0FMR09fU01CVVMgfCBJMkNfSFdfU01CVVNfT1Y1MTg6CisJY2FzZSBJMkNfSFdfU01CVVNfT1Y1MTg6CiAJCXJjID0gb3Zfd3JpdGVfcmVndmFscyhjLCByZWd2YWxzX2luaXRfNngyMF81MTgpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMzM4LDcgKzMzOCw3IEBACiAJLyoqKioqKioqIFBhbGV0dGUtc3BlY2lmaWMgcmVncyAqKioqKioqKi8KIAogCS8qIE9WNTE4IG5lZWRzIDggYml0IG11bHRpcGxleGVkIGluIGNvbG9yIG1vZGUsIGFuZCAxNiBiaXQgaW4gQiZXICovCi0JaWYgKGMtPmFkYXB0ZXItPmlkID09IChJMkNfQUxHT19TTUJVUyB8IEkyQ19IV19TTUJVU19PVjUxOCkpIHsKKwlpZiAoYy0+YWRhcHRlci0+aWQgPT0gSTJDX0hXX1NNQlVTX09WNTE4KSB7CiAJCWlmICh3aW4tPmZvcm1hdCA9PSBWSURFT19QQUxFVFRFX0dSRVkpCiAJCQlvdl93cml0ZV9tYXNrKGMsIDB4MTMsIDB4MDAsIDB4MjApOwogCQllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjZ4MzAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NngzMC5jCmluZGV4IDQ0YTg0MjMuLjZlYWI0NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NngzMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NngzMC5jCkBAIC0zMDEsNyArMzAxLDcgQEAKIAkvKioqKioqKiogUGFsZXR0ZS1zcGVjaWZpYyByZWdzICoqKioqKioqLwogCiAJaWYgKHdpbi0+Zm9ybWF0ID09IFZJREVPX1BBTEVUVEVfR1JFWSkgewotCQlpZiAoYy0+YWRhcHRlci0+aWQgPT0gKEkyQ19BTEdPX1NNQlVTIHwgSTJDX0hXX1NNQlVTX09WNTE4KSkgeworCQlpZiAoYy0+YWRhcHRlci0+aWQgPT0gSTJDX0hXX1NNQlVTX09WNTE4KSB7CiAJCQkvKiBEbyBub3RoaW5nIC0gd2UncmUgYWxyZWFkeSBpbiA4LWJpdCBtb2RlICovCiAJCX0gZWxzZSB7CiAJCQlvdl93cml0ZV9tYXNrKGMsIDB4MTMsIDB4MjAsIDB4MjApOwpAQCAtMzEzLDcgKzMxMyw3IEBACiAJCSAqIFRoZXJlZm9yZSwgdGhlIE9WNjYzMCBuZWVkcyB0byBiZSBpbiA4LWJpdCBtdWx0aXBsZXhlZAogCQkgKiBvdXRwdXQgbW9kZSAqLwogCi0JCWlmIChjLT5hZGFwdGVyLT5pZCA9PSAoSTJDX0FMR09fU01CVVMgfCBJMkNfSFdfU01CVVNfT1Y1MTgpKSB7CisJCWlmIChjLT5hZGFwdGVyLT5pZCA9PSBJMkNfSFdfU01CVVNfT1Y1MTgpIHsKIAkJCS8qIERvIG5vdGhpbmcgLSB3ZSB3YW50IHRvIHN0YXkgaW4gOC1iaXQgbW9kZSAqLwogCQkJLyogV2FybmluZzogTWVzc2luZyB3aXRoIHJlZyAweDEzIGJyZWFrcyBPVjUxOCBjb2xvciAqLwogCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292Y2FtY2hpcF9jb3JlLmMKaW5kZXggNTRkZDU2MS4uMmRlMzRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfY29yZS5jCkBAIC0yOTYsMTAgKzI5NiwxMCBAQAogCSAqIGF0dGFjaCB0byBhZGFwdGVycyB0aGF0IGFyZSBrbm93biB0byBjb250YWluIE9WIGNhbWVyYSBjaGlwcy4gKi8KIAogCXN3aXRjaCAoYWRhcC0+aWQpIHsKLQljYXNlIChJMkNfQUxHT19TTUJVUyB8IEkyQ19IV19TTUJVU19PVjUxMSk6Ci0JY2FzZSAoSTJDX0FMR09fU01CVVMgfCBJMkNfSFdfU01CVVNfT1Y1MTgpOgotCWNhc2UgKEkyQ19BTEdPX1NNQlVTIHwgSTJDX0hXX1NNQlVTX09WRlgyKToKLQljYXNlIChJMkNfQUxHT19TTUJVUyB8IEkyQ19IV19TTUJVU19XOTk2OENGKToKKwljYXNlIEkyQ19IV19TTUJVU19PVjUxMToKKwljYXNlIEkyQ19IV19TTUJVU19PVjUxODoKKwljYXNlIEkyQ19IV19TTUJVU19PVkZYMjoKKwljYXNlIEkyQ19IV19TTUJVU19XOTk2OENGOgogCQlQREVCVUcoMSwgIkFkYXB0ZXIgSUQgMHglMDZ4IGFjY2VwdGVkIiwgYWRhcC0+aWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMzE0LDcgKzMxNCw3IEBACiAJfQogCW1lbWNweShjLCAmY2xpZW50X3RlbXBsYXRlLCBzaXplb2YgKmMpOwogCWMtPmFkYXB0ZXIgPSBhZGFwOwotCXN0cmNweShpMmNfY2xpZW50bmFtZShjKSwgIk9WPz8/PyIpOworCXN0cmNweShjLT5uYW1lLCAiT1Y/Pz8/Iik7CiAKIAlvdiA9IGttYWxsb2Moc2l6ZW9mICpvdiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFvdikgewpAQCAtMzI4LDcgKzMyOCw3IEBACiAJaWYgKHJjIDwgMCkKIAkJZ290byBlcnJvcjsKIAotCXN0cmNweShpMmNfY2xpZW50bmFtZShjKSwgY2hpcF9uYW1lc1tvdi0+c3VidHlwZV0pOworCXN0cmNweShjLT5uYW1lLCBjaGlwX25hbWVzW292LT5zdWJ0eXBlXSk7CiAKIAlQREVCVUcoMSwgIkNhbWVyYSBjaGlwIGRldGVjdGlvbiBjb21wbGV0ZSIpOwogCkBAIC00MjEsNyArNDIxLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7Ci0JSTJDX0RFVk5BTUUoIih1bnNldCkiKSwKKwkubmFtZSA9CQkiKHVuc2V0KSIsCiAJLmRyaXZlciA9CSZkcml2ZXIsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Jkcy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9yZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDMzN2QwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9yZHMuaApAQCAtMCwwICsxLDQ4IEBACisvKgorCisgICAgVHlwZXMgYW5kIGRlZmluZXMgbmVlZGVkIGZvciBSRFMuIFRoaXMgaXMgaW5jbHVkZWQgYnkKKyAgICBzYWE2NTg4LmMgYW5kIGV2ZXJ5IGRyaXZlciAoZS5nLiBidHR2LWRyaXZlci5jKSB0aGF0IHdhbnRzCisgICAgdG8gdXNlIHRoZSBzYWE2NTg4IG1vZHVsZS4KKworICAgIEluc3RlYWQgb2YgaGF2aW5nIGEgc2VwZXJhdGUgcmRzLmgsIEknZCBwcmVmZXIgdG8gaW5jbHVkZQorICAgIHRoaXMgc3R1ZmYgaW4gb25lIG9mIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGZpbGVzIGxpa2UgdHVuZXIuaAorCisgICAgKGMpIDIwMDUgYnkgSGFucyBKLiBLb2NoCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfUkRTX0gKKyNkZWZpbmUgX1JEU19ICisKK3N0cnVjdCByZHNfY29tbWFuZCB7CisJdW5zaWduZWQgaW50ICBibG9ja19jb3VudDsKKwlpbnQgICAgICAgICAgIHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisJc3RydWN0IGZpbGUgICAqaW5zdGFuY2U7CisJcG9sbF90YWJsZSAgICAqZXZlbnRfbGlzdDsKK307CisKKyNkZWZpbmUgUkRTX0NNRF9PUEVOCV9JT1coJ1InLDEsaW50KQorI2RlZmluZSBSRFNfQ01EX0NMT1NFCV9JT1coJ1InLDIsaW50KQorI2RlZmluZSBSRFNfQ01EX1JFQUQJX0lPUignUicsMyxpbnQpCisjZGVmaW5lIFJEU19DTURfUE9MTAlfSU9SKCdSJyw0LGludCkKKworI2VuZGlmCisKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNjU4OC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE2NTg4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2NTdhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNjU4OC5jCkBAIC0wLDAgKzEsNTM0IEBACisvKgorICAgIERyaXZlciBmb3IgU0FBNjU4OCBSRFMgZGVjb2RlcgorCisgICAgKGMpIDIwMDUgSGFucyBKLiBLb2NoCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaWQuaD4KKworI2luY2x1ZGUgInJkcy5oIgorCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKKwkweDIwID4+IDEsCisJMHgyMiA+PiAxLAorCUkyQ19DTElFTlRfRU5ELAorfTsKKworSTJDX0NMSUVOVF9JTlNNT0Q7CisKKy8qIGluc21vZCBvcHRpb25zICovCitzdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeHRhbCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHJiZHMgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBwbHZsID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnVmYmxvY2tzID0gMTAwOworCitNT0RVTEVfUEFSTShkZWJ1ZywgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMiKTsKK01PRFVMRV9QQVJNKHh0YWwsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKHh0YWwsICJzZWxlY3Qgb3NjaWxsYXRvciBmcmVxdWVuY3kgKDAuLjMpLCBkZWZhdWx0IDAiKTsKK01PRFVMRV9QQVJNKHJiZHMsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKHJiZHMsICJzZWxlY3QgbW9kZSwgMD1SRFMsIDE9UkJEUywgZGVmYXVsdCAwIik7CitNT0RVTEVfUEFSTShwbHZsLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhwbHZsLCAic2VsZWN0IHBhdXNlIGxldmVsICgwLi4zKSwgZGVmYXVsdCAwIik7CitNT0RVTEVfUEFSTShidWZibG9ja3MsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGJ1ZmJsb2NrcywgIm51bWJlciBvZiBidWZmZXJlZCBibG9ja3MsIGRlZmF1bHQgMTAwIik7CisKK01PRFVMRV9ERVNDUklQVElPTigidjRsMiBkcml2ZXIgbW9kdWxlIGZvciBTQUE2NTg4IFJEUyBkZWNvZGVyIik7CitNT0RVTEVfQVVUSE9SKCJIYW5zIEouIEtvY2ggPGtvY2hAaGprLWF6LmRlPiIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBVTlNFVCAgICAgICAoLTFVKQorI2RlZmluZSBQUkVGSVggICAgICAic2FhNjU4ODogIgorI2RlZmluZSBkcHJpbnRrICAgICBpZiAoZGVidWcpIHByaW50aworCitzdHJ1Y3Qgc2FhNjU4OCB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisJdW5zaWduZWQgaW50IGJ1Zl9zaXplOworCXVuc2lnbmVkIGludCByZF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgd3JfaW5kZXg7CisJdW5zaWduZWQgaW50IGJsb2NrX2NvdW50OworCXVuc2lnbmVkIGNoYXIgbGFzdF9ibG9ja251bTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3F1ZXVlOworCWludCBkYXRhX2F2YWlsYWJsZV9mb3JfcmVhZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXI7CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBTQUE2NTg4IGRlZmluZXMKKyAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgbW9kZSBjb250cm9sIGJ5dGUgKDB3KSAqLworCisvKiBiaXQgMCsxIChEQUMwL0RBQzEpICovCisjZGVmaW5lIGNNb2RlU3RhbmRhcmQgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgY01vZGVGYXN0UEkgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBjTW9kZVJlZHVjZWRSZXF1ZXN0ICAgICAweDAyCisjZGVmaW5lIGNNb2RlSW52YWxpZCAgICAgICAgICAgIDB4MDMKKworLyogYml0IDIgKFJCRFMpICovCisjZGVmaW5lIGNQcm9jZXNzaW5nTW9kZVJEUyAgICAgIDB4MDAKKyNkZWZpbmUgY1Byb2Nlc3NpbmdNb2RlUkJEUyAgICAgMHgwNAorCisvKiBiaXQgMys0IChTWU0wL1NZTTEpICovCisjZGVmaW5lIGNFcnJDb3JyZWN0aW9uTm9uZSAgICAgIDB4MDAKKyNkZWZpbmUgY0VyckNvcnJlY3Rpb24yQml0cyAgICAgMHgwOAorI2RlZmluZSBjRXJyQ29ycmVjdGlvbjVCaXRzICAgICAweDEwCisjZGVmaW5lIGNFcnJDb3JyZWN0aW9uTm9uZVJCRFMgIDB4MTgKKworLyogYml0IDUgKE5XU1kpICovCisjZGVmaW5lIGNTeW5jTm9ybWFsICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgY1N5bmNSZXN0YXJ0ICAgICAgICAgICAgMHgyMAorCisvKiBiaXQgNiAoVFNRRCkgKi8KKyNkZWZpbmUgY1NpZ1F1YWxpdHlEZXRlY3RPRkYgICAgMHgwMAorI2RlZmluZSBjU2lnUXVhbGl0eURldGVjdE9OICAgICAweDQwCisKKy8qIGJpdCA3IChTUUNNKSAqLworI2RlZmluZSBjU2lnUXVhbGl0eVRyaWdnZXJlZCAgICAweDAwCisjZGVmaW5lIGNTaWdRdWFsaXR5Q29udGlub3VzICAgIDB4ODAKKworLyogUGF1c2UgbGV2ZWwgYW5kIGZseXdoZWVsIGNvbnRyb2wgYnl0ZSAoMXcpICovCisKKy8qIGJpdHMgMC4uNSAoRkVCMC4uRkVCNSkgKi8KKyNkZWZpbmUgY0ZseXdoZWVsTWF4QmxvY2tzTWFzayAgMHgzRgorI2RlZmluZSBjRmx5d2hlZWxEZWZhdWx0ICAgICAgICAweDIwCisKKy8qIGJpdHMgNis3IChQTDAvUEwxKSAqLworI2RlZmluZSBjUGF1c2VMZXZlbF8xMW1WCTB4MDAKKyNkZWZpbmUgY1BhdXNlTGV2ZWxfMTdtViAgICAgICAgMHg0MAorI2RlZmluZSBjUGF1c2VMZXZlbF8yN21WICAgICAgICAweDgwCisjZGVmaW5lIGNQYXVzZUxldmVsXzQzbVYgICAgICAgIDB4QzAKKworLyogUGF1c2UgdGltZS9vc2NpbGxhdG9yIGZyZXF1ZW5jeS9xdWFsaXR5IGRldGVjdG9yIGNvbnRyb2wgYnl0ZSAoMXcpICovCisKKy8qIGJpdHMgMC4uNCAoU1FTMC4uU1FTNCkgKi8KKyNkZWZpbmUgY1F1YWxpdHlEZXRlY3RTZW5zTWFzayAgMHgxRgorI2RlZmluZSBjUXVhbGl0eURldGVjdERlZmF1bHQgICAweDBGCisKKy8qIGJpdCA1IChTT1NDKSAqLworI2RlZmluZSBjU2VsZWN0T3NjRnJlcU9GRgkweDAwCisjZGVmaW5lIGNTZWxlY3RPc2NGcmVxT04JMHgyMAorCisvKiBiaXQgNis3IChQVEYwL1BURjEpICovCisjZGVmaW5lIGNPc2NGcmVxXzQzMzJrSHoJMHgwMAorI2RlZmluZSBjT3NjRnJlcV84NjY0a0h6CTB4NDAKKyNkZWZpbmUgY09zY0ZyZXFfMTI5OTZrSHoJMHg4MAorI2RlZmluZSBjT3NjRnJlcV8xNzMyOGtIegkweEMwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBibG9ja190b191c2VyX2J1ZihzdHJ1Y3Qgc2FhNjU4OCAqcywgdW5zaWduZWQgY2hhciAqdXNlcl9idWYpCit7CisJaW50IGk7CisKKwlpZiAocy0+cmRfaW5kZXggPT0gcy0+d3JfaW5kZXgpIHsKKwkJaWYgKGRlYnVnID4gMikKKwkJCWRwcmludGsoUFJFRklYICJSZWFkOiBidWZmZXIgZW1wdHkuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRlYnVnID4gMikgeworCQlkcHJpbnRrKFBSRUZJWCAiUmVhZDogIik7CisJCWZvciAoaSA9IHMtPnJkX2luZGV4OyBpIDwgcy0+cmRfaW5kZXggKyAzOyBpKyspCisJCQlkcHJpbnRrKCIweCUwMnggIiwgcy0+YnVmZmVyW2ldKTsKKwl9CisKKwlpZiAoY29weV90b191c2VyKHVzZXJfYnVmLCAmcy0+YnVmZmVyW3MtPnJkX2luZGV4XSwgMykpCisJCXJldHVybiAtRUZBVUxUOworCisJcy0+cmRfaW5kZXggKz0gMzsKKwlpZiAocy0+cmRfaW5kZXggPj0gcy0+YnVmX3NpemUpCisJCXMtPnJkX2luZGV4ID0gMDsKKwlzLT5ibG9ja19jb3VudC0tOworCisJaWYgKGRlYnVnID4gMikKKwkJZHByaW50aygiJWQgYmxvY2tzIHRvdGFsLlxuIiwgcy0+YmxvY2tfY291bnQpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfZnJvbV9idWYoc3RydWN0IHNhYTY1ODggKnMsIHN0cnVjdCByZHNfY29tbWFuZCAqYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdW5zaWduZWQgY2hhciAqYnVmX3B0ciA9IGEtPmJ1ZmZlcjsJLyogVGhpcyBpcyBhIHVzZXIgc3BhY2UgYnVmZmVyISAqLworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCByZF9ibG9ja3M7CisKKwlhLT5yZXN1bHQgPSAwOworCWlmICghYS0+YnVmZmVyKQorCQlyZXR1cm47CisKKwl3aGlsZSAoIXMtPmRhdGFfYXZhaWxhYmxlX2Zvcl9yZWFkKSB7CisJCWludCByZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocy0+cmVhZF9xdWV1ZSwKKwkJCQkJICAgICBzLT5kYXRhX2F2YWlsYWJsZV9mb3JfcmVhZCk7CisJCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKSB7CisJCQlhLT5yZXN1bHQgPSAtRUlOVFI7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXJkX2Jsb2NrcyA9IGEtPmJsb2NrX2NvdW50OworCWlmIChyZF9ibG9ja3MgPiBzLT5ibG9ja19jb3VudCkKKwkJcmRfYmxvY2tzID0gcy0+YmxvY2tfY291bnQ7CisKKwlpZiAoIXJkX2Jsb2NrcykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHJkX2Jsb2NrczsgaSsrKSB7CisJCWlmIChibG9ja190b191c2VyX2J1ZihzLCBidWZfcHRyKSkgeworCQkJYnVmX3B0ciArPSAzOworCQkJYS0+cmVzdWx0Kys7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCWEtPnJlc3VsdCAqPSAzOworCXMtPmRhdGFfYXZhaWxhYmxlX2Zvcl9yZWFkID0gKHMtPmJsb2NrX2NvdW50ID4gMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBibG9ja190b19idWYoc3RydWN0IHNhYTY1ODggKnMsIHVuc2lnbmVkIGNoYXIgKmJsb2NrYnVmKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGRlYnVnID4gMykKKwkJZHByaW50ayhQUkVGSVggIk5ldyBibG9jazogIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisJCWlmIChkZWJ1ZyA+IDMpCisJCQlkcHJpbnRrKCIweCUwMnggIiwgYmxvY2tidWZbaV0pOworCQlzLT5idWZmZXJbcy0+d3JfaW5kZXhdID0gYmxvY2tidWZbaV07CisJCXMtPndyX2luZGV4Kys7CisJfQorCisJaWYgKHMtPndyX2luZGV4ID49IHMtPmJ1Zl9zaXplKQorCQlzLT53cl9pbmRleCA9IDA7CisKKwlpZiAocy0+d3JfaW5kZXggPT0gcy0+cmRfaW5kZXgpIHsKKwkJcy0+cmRfaW5kZXgrKzsKKwkJaWYgKHMtPnJkX2luZGV4ID49IHMtPmJ1Zl9zaXplKQorCQkJcy0+cmRfaW5kZXggPSAwOworCX0gZWxzZQorCQlzLT5ibG9ja19jb3VudCsrOworCisJaWYgKGRlYnVnID4gMykKKwkJZHByaW50aygiJWQgYmxvY2tzIHRvdGFsLlxuIiwgcy0+YmxvY2tfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBzYWE2NTg4X2kyY19wb2xsKHN0cnVjdCBzYWE2NTg4ICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB0bXBidWZbNl07CisJdW5zaWduZWQgY2hhciBibG9ja251bTsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKworCS8qIEFsdGhvdWdoIHdlIG9ubHkgbmVlZCAzIGJ5dGVzLCB3ZSBoYXZlIHRvIHJlYWQgYXQgbGVhc3QgNi4KKwkgICBTQUE2NTg4IHJldHVybnMgZ2FyYmFnZSBvdGhlcndpc2UgKi8KKwlpZiAoNiAhPSBpMmNfbWFzdGVyX3JlY3YoJnMtPmNsaWVudCwgJnRtcGJ1ZlswXSwgNikpIHsKKwkJaWYgKGRlYnVnID4gMSkKKwkJCWRwcmludGsoUFJFRklYICJyZWFkIGVycm9yIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlibG9ja251bSA9IHRtcGJ1ZlswXSA+PiA1OworCWlmIChibG9ja251bSA9PSBzLT5sYXN0X2Jsb2NrbnVtKSB7CisJCWlmIChkZWJ1ZyA+IDMpCisJCQlkcHJpbnRrKCJTYXcgYmxvY2sgJWQgYWdhaW4uXG4iLCBibG9ja251bSk7CisJCXJldHVybjsKKwl9CisKKwlzLT5sYXN0X2Jsb2NrbnVtID0gYmxvY2tudW07CisKKwkvKgorCSAgIEJ5dGUgb3JkZXIgYWNjb3JkaW5nIHRvIHY0bDIgc3BlY2lmaWNhdGlvbjoKKworCSAgIEJ5dGUgMDogTGVhc3QgU2lnbmlmaWNhbnQgQnl0ZSBvZiBSRFMgQmxvY2sKKwkgICBCeXRlIDE6IE1vc3QgU2lnbmlmaWNhbnQgQnl0ZSBvZiBSRFMgQmxvY2sKKwkgICBCeXRlIDIgQml0IDc6IEVycm9yIGJpdC4gSW5kaWNhdGVzIHRoYXQgYW4gdW5jb3JyZWN0YWJsZSBlcnJvcgorCSAgIG9jY3VycmVkIGR1cmluZyByZWNlcHRpb24gb2YgdGhpcyBibG9jay4KKwkgICBCaXQgNjogQ29ycmVjdGVkIGJpdC4gSW5kaWNhdGVzIHRoYXQgYW4gZXJyb3Igd2FzCisJICAgY29ycmVjdGVkIGZvciB0aGlzIGRhdGEgYmxvY2suCisJICAgQml0cyA1LTM6IFJlY2VpdmVkIE9mZnNldC4gSW5kaWNhdGVzIHRoZSBvZmZzZXQgcmVjZWl2ZWQKKwkgICBieSB0aGUgc3luYyBzeXN0ZW0uCisJICAgQml0cyAyLTA6IE9mZnNldCBOYW1lLiBJbmRpY2F0ZXMgdGhlIG9mZnNldCBhcHBsaWVkIHRvIHRoaXMgZGF0YS4KKworCSAgIFNBQTY1ODggYnl0ZSBvcmRlciBpcyBTdGF0dXMtTVNCLUxTQiwgc28gd2UgaGF2ZSB0byBzd2FwIHRoZQorCSAgIGZpcnN0IGFuZCB0aGUgbGFzdCBvZiB0aGUgMyBieXRlcyBibG9jay4KKwkgKi8KKworCXRtcCA9IHRtcGJ1ZlsyXTsKKwl0bXBidWZbMl0gPSB0bXBidWZbMF07CisJdG1wYnVmWzBdID0gdG1wOworCisJdG1wID0gYmxvY2tudW07CisJdG1wIHw9IGJsb2NrbnVtIDw8IDM7CS8qIFJlY2VpdmVkIG9mZnNldCA9PSBPZmZzZXQgTmFtZSAoT0sgPykgKi8KKwlpZiAoKHRtcGJ1ZlsyXSAmIDB4MDMpID09IDB4MDMpCisJCXRtcCB8PSAweDgwOwkvKiB1bmNvcnJlY3RhYmxlIGVycm9yICovCisJZWxzZSBpZiAoKHRtcGJ1ZlsyXSAmIDB4MDMpICE9IDB4MDApCisJCXRtcCB8PSAweDQwOwkvKiBjb3JyZWN0ZWQgZXJyb3IgKi8KKwl0bXBidWZbMl0gPSB0bXA7CS8qIElzIHRoaXMgZW5vdWdoID8gU2hvdWxkIHdlIGFsc28gY2hlY2sgb3RoZXIgYml0cyA/ICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWJsb2NrX3RvX2J1ZihzLCB0bXBidWYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5kYXRhX2F2YWlsYWJsZV9mb3JfcmVhZCA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzLT5yZWFkX3F1ZXVlKTsKK30KKworc3RhdGljIHZvaWQgc2FhNjU4OF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNhYTY1ODggKnMgPSAoc3RydWN0IHNhYTY1ODggKilkYXRhOworCisJc2NoZWR1bGVfd29yaygmcy0+d29yayk7Cit9CisKK3N0YXRpYyB2b2lkIHNhYTY1ODhfd29yayh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzYWE2NTg4ICpzID0gKHN0cnVjdCBzYWE2NTg4ICopZGF0YTsKKworCXNhYTY1ODhfaTJjX3BvbGwocyk7CisJbW9kX3RpbWVyKCZzLT50aW1lciwgamlmZmllcyArIEhaIC8gNTApOwkvKiAyMCBtc2VjICovCit9CisKK3N0YXRpYyBpbnQgc2FhNjU4OF9jb25maWd1cmUoc3RydWN0IHNhYTY1ODggKnMpCit7CisJdW5zaWduZWQgY2hhciBidWZbM107CisJaW50IHJjOworCisJYnVmWzBdID0gY1N5bmNSZXN0YXJ0OworCWlmIChyYmRzKQorCQlidWZbMF0gfD0gY1Byb2Nlc3NpbmdNb2RlUkJEUzsKKworCWJ1ZlsxXSA9IGNGbHl3aGVlbERlZmF1bHQ7CisJc3dpdGNoIChwbHZsKSB7CisJY2FzZSAwOgorCQlidWZbMV0gfD0gY1BhdXNlTGV2ZWxfMTFtVjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlidWZbMV0gfD0gY1BhdXNlTGV2ZWxfMTdtVjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlidWZbMV0gfD0gY1BhdXNlTGV2ZWxfMjdtVjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlidWZbMV0gfD0gY1BhdXNlTGV2ZWxfNDNtVjsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisJfQorCisJYnVmWzJdID0gY1F1YWxpdHlEZXRlY3REZWZhdWx0IHwgY1NlbGVjdE9zY0ZyZXFPTjsKKworCXN3aXRjaCAoeHRhbCkgeworCWNhc2UgMDoKKwkJYnVmWzJdIHw9IGNPc2NGcmVxXzQzMzJrSHo7CisJCWJyZWFrOworCWNhc2UgMToKKwkJYnVmWzJdIHw9IGNPc2NGcmVxXzg2NjRrSHo7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYnVmWzJdIHw9IGNPc2NGcmVxXzEyOTk2a0h6OworCQlicmVhazsKKwljYXNlIDM6CisJCWJ1ZlsyXSB8PSBjT3NjRnJlcV8xNzMyOGtIejsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisJfQorCisJZHByaW50ayhQUkVGSVggIndyaXRpbmc6IDB3PTB4JTAyeCAxdz0weCUwMnggMnc9MHglMDJ4XG4iLAorCQlidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdKTsKKworCWlmICgzICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZCgmcy0+Y2xpZW50LCBidWYsIDMpKSkKKwkJcHJpbnRrKFBSRUZJWCAiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAzKVxuIiwgcmMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzYWE2NTg4X2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3Qgc2FhNjU4OCAqczsKKwljbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7CisJY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyOworCisJcHJpbnRrKFBSRUZJWCAiY2hpcCBmb3VuZCBAIDB4JXhcbiIsIGFkZHIgPDwgMSk7CisKKwlpZiAoTlVMTCA9PSAocyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXMtPmJ1Zl9zaXplID0gYnVmYmxvY2tzICogMzsKKworCWlmIChOVUxMID09IChzLT5idWZmZXIgPSBrbWFsbG9jKHMtPmJ1Zl9zaXplLCBHRlBfS0VSTkVMKSkpIHsKKwkJa2ZyZWUocyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzLT5jbGllbnQgPSBjbGllbnRfdGVtcGxhdGU7CisJcy0+YmxvY2tfY291bnQgPSAwOworCXMtPndyX2luZGV4ID0gMDsKKwlzLT5yZF9pbmRleCA9IDA7CisJcy0+bGFzdF9ibG9ja251bSA9IDB4ZmY7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+cmVhZF9xdWV1ZSk7CisJcy0+ZGF0YV9hdmFpbGFibGVfZm9yX3JlYWQgPSAwOworCWkyY19zZXRfY2xpZW50ZGF0YSgmcy0+Y2xpZW50LCBzKTsKKwlpMmNfYXR0YWNoX2NsaWVudCgmcy0+Y2xpZW50KTsKKworCXNhYTY1ODhfY29uZmlndXJlKHMpOworCisJLyogc3RhcnQgcG9sbGluZyB2aWEgZXZlbnRkICovCisJSU5JVF9XT1JLKCZzLT53b3JrLCBzYWE2NTg4X3dvcmssIHMpOworCWluaXRfdGltZXIoJnMtPnRpbWVyKTsKKwlzLT50aW1lci5mdW5jdGlvbiA9IHNhYTY1ODhfdGltZXI7CisJcy0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXM7CisJc2NoZWR1bGVfd29yaygmcy0+d29yayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYWE2NTg4X3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKyNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCisJaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKKwkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBzYWE2NTg4X2F0dGFjaCk7CisjZWxzZQorCXN3aXRjaCAoYWRhcC0+aWQpIHsKKwljYXNlIEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0JUODQ4OgorCWNhc2UgSTJDX0FMR09fQklUIHwgSTJDX0hXX0JfUklWQToKKwljYXNlIEkyQ19BTEdPX1NBQTcxMzQ6CisJCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgc2FhNjU4OF9hdHRhY2gpOworCQlicmVhazsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYWE2NTg4X2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzYWE2NTg4ICpzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkZWxfdGltZXJfc3luYygmcy0+dGltZXIpOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWtmcmVlKHMtPmJ1ZmZlcik7CisJa2ZyZWUocyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FhNjU4OF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCQkJdm9pZCAqYXJnKQoreworCXN0cnVjdCBzYWE2NTg4ICpzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHJkc19jb21tYW5kICphID0gKHN0cnVjdCByZHNfY29tbWFuZCAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJCS8qIC0tLSBvcGVuKCkgZm9yIC9kZXYvcmFkaW8gLS0tICovCisJY2FzZSBSRFNfQ01EX09QRU46CisJCWEtPnJlc3VsdCA9IDA7CS8qIHJldHVybiBlcnJvciBpZiBjaGlwIGRvZXNuJ3Qgd29yayA/Pz8gKi8KKwkJYnJlYWs7CisJCS8qIC0tLSBjbG9zZSgpIGZvciAvZGV2L3JhZGlvIC0tLSAqLworCWNhc2UgUkRTX0NNRF9DTE9TRToKKwkJcy0+ZGF0YV9hdmFpbGFibGVfZm9yX3JlYWQgPSAxOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnMtPnJlYWRfcXVldWUpOworCQlhLT5yZXN1bHQgPSAwOworCQlicmVhazsKKwkJLyogLS0tIHJlYWQoKSBmb3IgL2Rldi9yYWRpbyAtLS0gKi8KKwljYXNlIFJEU19DTURfUkVBRDoKKwkJcmVhZF9mcm9tX2J1ZihzLCBhKTsKKwkJYnJlYWs7CisJCS8qIC0tLSBwb2xsKCkgZm9yIC9kZXYvcmFkaW8gLS0tICovCisJY2FzZSBSRFNfQ01EX1BPTEw6CisJCWEtPnJlc3VsdCA9IDA7CisJCWlmIChzLT5kYXRhX2F2YWlsYWJsZV9mb3JfcmVhZCkgeworCQkJYS0+cmVzdWx0IHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCX0KKwkJcG9sbF93YWl0KGEtPmluc3RhbmNlLCAmcy0+cmVhZF9xdWV1ZSwgYS0+ZXZlbnRfbGlzdCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogbm90aGluZyAqLworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXIgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAiaTJjIHNhYTY1ODggZHJpdmVyIiwKKwkuaWQgPSAtMSwJCS8qIEZJWE1FICovCisJLmZsYWdzID0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSBzYWE2NTg4X3Byb2JlLAorCS5kZXRhY2hfY2xpZW50ID0gc2FhNjU4OF9kZXRhY2gsCisJLmNvbW1hbmQgPSBzYWE2NTg4X2NvbW1hbmQsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0geworCS5uYW1lID0gInNhYTY1ODgiLAorCS5mbGFncyA9IEkyQ19DTElFTlRfQUxMT1dfVVNFLAorCS5kcml2ZXIgPSAmZHJpdmVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2FhNjU4OF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNhYTY1ODhfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2FhNjU4OF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChzYWE2NTg4X2NsZWFudXBfbW9kdWxlKTsKKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMC5jCmluZGV4IDIyZDA1NWQuLmUxMTZiZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMC5jCkBAIC00NzAsNyArNDcwLDYgQEAKIAkubm9ybWFsX2kyYwkJPSBub3JtYWxfaTJjLAogCS5wcm9iZQkJCT0gJmlnbm9yZSwKIAkuaWdub3JlCQkJPSAmaWdub3JlLAotCS5mb3JjZQkJCT0gJmlnbm9yZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX3NhYTcxMTA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMS5jCmluZGV4IGZjZDg5NzMuLmZlOGE1ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMS5jCkBAIC00Miw3ICs0Miw2IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KQEAgLTQ4OSw3ICs0ODgsNiBAQAogCS5ub3JtYWxfaTJjCQk9IG5vcm1hbF9pMmMsCiAJLnByb2JlCQkJPSAmaWdub3JlLAogCS5pZ25vcmUJCQk9ICZpZ25vcmUsCi0JLmZvcmNlCQkJPSAmaWdub3JlLAogfTsKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXJfc2FhNzExMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE0LmMKaW5kZXggMmJhOTk3Zi4uZDlmNTBlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE0LmMKQEAgLTQ1LDcgKzQ1LDYgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgpAQCAtODI3LDcgKzgyNiw2IEBACiAJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKIAkucHJvYmUJCQk9ICZpZ25vcmUsCiAJLmlnbm9yZQkJCT0gJmlnbm9yZSwKLQkuZm9yY2UJCQk9ICZpZ25vcmUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9zYWE3MTE0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jCmluZGV4IDc5ZDA1ZWEuLjM4MjkxMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNjc1MmhzLmMKQEAgLTU5OCw3ICs1OTgsNyBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0KIHsKLQlJMkNfREVWTkFNRSgic2FhNjc1MmhzIiksCisJLm5hbWUgICAgICAgPSAic2FhNjc1MmhzIiwKIAkuZmxhZ3MgICAgICA9IEkyQ19DTElFTlRfQUxMT1dfVVNFLAogICAgICAgICAuZHJpdmVyICAgICA9ICZkcml2ZXIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKaW5kZXggODhiNzFhMi4uYWNjN2E0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogc2FhNzEzNC1jYXJkcy5jLHYgMS44MCAyMDA1LzA3LzA3IDAxOjQ5OjMwIG1rcnVma3kgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIGNhcmQtc3BlY2lmaWMgc3R1ZmYuCkBAIC0xMzczLDcgKzEzNzIsNyBAQAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAogCQkJLnZtdXggPSAxLAotCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5hbXV4ID0gTElORTEsCiAJCX0sewogCQkJLm5hbWUgPSBuYW1lX3R2LAogCQkJLnZtdXggPSAzLApAQCAtMTM4Miw3ICsxMzgxLDcgQEAKIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAogCQkJLnZtdXggPSA4LAotCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5hbXV4ID0gTElORTEsCiAJCX19LAogCQkucmFkaW8gPSB7CiAJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKQEAgLTIwMDEsNiArMjAwMCwxMTUgQEAKIAkJCS5ncGlvID0gMHgwMDAsCiAJCX0sCiAJfSwKKwlbU0FBNzEzNF9CT0FSRF9GTFlUVl9ESUdJTUFUUklYXSA9IHsKKwkJLm5hbWUJCT0gIkZseVRWIG1pbmkgQXN1cyBEaWdpbWF0cml4IiwKKwkJLmF1ZGlvX2Nsb2NrCT0gMHgwMDIwMDAwMCwKKwkJLnR1bmVyX3R5cGUJPSBUVU5FUl9MR19OVFNDX1RBTE5fTUlOSSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHZfbW9ubywKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAkJLyogcmFkaW8gdW5jb25maXJtZWQgKi8KKwkJCS5hbXV4ID0gTElORTIsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9LV09STERfVEVSTUlOQVRPUl0gPSB7CisJCS8qIEt3b3JsZCBWLVN0cmVhbSBTdHVkaW8gVFYgVGVybWluYXRvciAqLworCQkvKiAiSmFtZXMgV2ViYiA8anJ3ZWJiQHF3ZXN0Lm5ldD4gKi8KKwkJLm5hbWUgICAgICAgICAgID0gIlYtU3RyZWFtIFN0dWRpbyBUViBUZXJtaW5hdG9yIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLmdwaW9tYXNrICAgICAgID0gMSA8PCAyMSwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4MDAwMDAwMCwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsICAgICAvKiBDb21wb3NpdGUgaW5wdXQgKi8KKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDAwMDAwMCwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLCAgICAvKiBTLVZpZGVvIGlucHV0ICovCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDAwMDAwMDAsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDAyMDAwMDAsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9ZVUFOX1RVTjkwMF0gPSB7CisJCS8qIEZJWE1FOgorCQkgKiBTLVZpZGVvIGFuZCBjb21wb3NpdGUgc291cmNlcyB1bnRlc3RlZC4KKwkJICogUmFkaW8gbm90IHdvcmtpbmcuCisJCSAqIFJlbW90ZSBjb250cm9sIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisJCSAqIEZyb20gOiBjb2RlbWFzdGVyQHdlYmdlZWtzLmJlICovCisJCS5uYW1lICAgICAgICAgICA9ICJZdWFuIFRVTi05MDAgKHNhYTcxMzUpIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHI9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyPSBBRERSX1VOU0VULAorCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwMDEwMDAzLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJCS5ncGlvID0gMHgwMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDAyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDYsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDAyLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJCS5ncGlvID0gMHgwMDAxMDAwMywKKwkJfSwKKwkJLm11dGUgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4MDEsCisJCX0sCisJfSwKIH07CiAKIApAQCAtMjI3MiwxMiArMjM4MCw2IEBACiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9QVlIsCiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0JCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKLQkJLnN1YnZlbmRvciAgICA9IDB4MTEzMSwKLQkJLnN1YmRldmljZSAgICA9IDAsCi0JCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1NBQlJFTlRfU0JUVFZGTSwKLQl9LHsKLQkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAogCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLwogCQkuc3ViZGV2aWNlICAgID0gMHg5NzE1LApAQCAtMjM0Niw2ICsyNDQ4LDE4IEBACiAJCS5zdWJ2ZW5kb3IgICAgPSAweDRlNDIsCiAJCS5zdWJkZXZpY2UgICAgPSAweDA1MDIsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1RIWVBIT09OX0RWQlRfRFVPX0NBUkRCVVMsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4MTA0MywKKwkJLnN1YmRldmljZSAgICA9IDB4MDIxMCwJCS8qIG1pbmkgcGNpIE5UU0MgdmVyc2lvbiAqLworCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9GTFlUVl9ESUdJTUFUUklYLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDEwNDMsCisJCS5zdWJkZXZpY2UgICAgPSAweDAyMTAsCQkvKiBtaW5pIHBjaSBQQUwvU0VDQU0gdmVyc2lvbiAqLworCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9GTFlUVl9ESUdJTUFUUklYLAogCiAJfSx7CiAJCS8qIC0tLSBib2FyZHMgd2l0aG91dCBlZXByb20gKyBzdWJzeXN0ZW0gSUQgLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKaW5kZXggMWRiZTYxNy4uZTVlMzZmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtY29yZS5jLHYgMS4zOSAyMDA1LzA3LzA1IDE3OjM3OjM1IG5zaCBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogZHJpdmVyIGNvcmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKaW5kZXggOGJlNmE5MC4uNjM5YWU1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBzYWE3MTM0LWR2Yi5jLHYgMS4yMyAyMDA1LzA3LzI0IDIyOjEyOjQ3IG1rcnVma3kgRXhwICQKICAqCiAgKiAoYykgMjAwNCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdCiAgKgpAQCAtMjksNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAogCiAjaW5jbHVkZSAic2FhNzEzNC1yZWcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYwppbmRleCBjODUzNDhkMC4uNzdiNjI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtZW1wcmVzcy5jLHYgMS4xMSAyMDA1LzA1LzIyIDE5OjIzOjM5IG5zaCBFeHAgJAogICoKICAqIChjKSAyMDA0IEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jCmluZGV4IDEyMDNiOTMuLjcxMWFhOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogc2FhNzEzNC1pMmMuYyx2IDEuMjIgMjAwNS8wNy8yMiAwNDowOTo0MSBta3J1Zmt5IEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCiAgKiBpMmMgaW50ZXJmYWNlIHN1cHBvcnQKQEAgLTMzNCw3ICszMzMsNyBAQAogCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CiAKIAlkMXByaW50ayggIiVzIGkyYyBhdHRhY2ggW2FkZHI9MHgleCxjbGllbnQ9JXNdXG4iLAotCQljbGllbnQtPmRyaXZlci0+bmFtZSxjbGllbnQtPmFkZHIsaTJjX2NsaWVudG5hbWUoY2xpZW50KSk7CisJCSBjbGllbnQtPmRyaXZlci0+bmFtZSwgY2xpZW50LT5hZGRyLCBjbGllbnQtPm5hbWUpOwogCiAJaWYgKCFjbGllbnQtPmRyaXZlci0+Y29tbWFuZCkKIAkJcmV0dXJuIDA7CkBAIC0zNzAsOCArMzY5LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNhYTcxMzRfYWxnbyA9IHsKLQkubmFtZSAgICAgICAgICA9ICJzYWE3MTM0IiwKLQkuaWQgICAgICAgICAgICA9IEkyQ19BTEdPX1NBQTcxMzQsCiAJLm1hc3Rlcl94ZmVyICAgPSBzYWE3MTM0X2kyY194ZmVyLAogCS5hbGdvX2NvbnRyb2wgID0gYWxnb19jb250cm9sLAogCS5mdW5jdGlvbmFsaXR5ID0gZnVuY3Rpb25hbGl0eSwKQEAgLTM4MiwxNCArMzc5LDE0IEBACiAjaWZkZWYgSTJDX0NMQVNTX1RWX0FOQUxPRwogCS5jbGFzcyAgICAgICAgID0gSTJDX0NMQVNTX1RWX0FOQUxPRywKICNlbmRpZgotCUkyQ19ERVZOQU1FKCJzYWE3MTM0IiksCi0JLmlkICAgICAgICAgICAgPSBJMkNfQUxHT19TQUE3MTM0LAorCS5uYW1lICAgICAgICAgID0gInNhYTcxMzQiLAorCS5pZCAgICAgICAgICAgID0gSTJDX0hXX1NBQTcxMzQsCiAJLmFsZ28gICAgICAgICAgPSAmc2FhNzEzNF9hbGdvLAogCS5jbGllbnRfcmVnaXN0ZXIgPSBhdHRhY2hfaW5mb3JtLAogfTsKIAogc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IHNhYTcxMzRfY2xpZW50X3RlbXBsYXRlID0gewotCUkyQ19ERVZOQU1FKCJzYWE3MTM0IGludGVybmFsIiksCisJLm5hbWUJPSAic2FhNzEzNCBpbnRlcm5hbCIsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKaW5kZXggMjEzNzQwMS4uMWY0NTZjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogc2FhNzEzNC1pbnB1dC5jLHYgMS4yMSAyMDA1LzA2LzIyIDIzOjM3OjM0IG5zaCBFeHAgJAogICoKICAqIGhhbmRsZSBzYWE3MTM0IElSIHJlbW90ZXMgdmlhIGxpbnV4IGtlcm5lbCBpbnB1dCBsYXllci4KICAqCkBAIC01NjUsNiArNTY0LDcgQEAKIAkJaXItPmRldi5pZC52ZW5kb3IgID0gZGV2LT5wY2ktPnZlbmRvcjsKIAkJaXItPmRldi5pZC5wcm9kdWN0ID0gZGV2LT5wY2ktPmRldmljZTsKIAl9CisJaXItPmRldi5kZXYgPSAmZGV2LT5wY2ktPmRldjsKIAogCS8qIGFsbCBkb25lICovCiAJZGV2LT5yZW1vdGUgPSBpcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LW9zcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtb3NzLmMKaW5kZXggYjViZWRlOS4uYzIwNjMwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtb3NzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtb3NzLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBzYWE3MTM0LW9zcy5jLHYgMS4xNyAyMDA1LzA2LzI4IDIzOjQxOjQ3IG1rcnVma3kgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIG9zcyBkc3AgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1yZWcuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXJlZy5oCmluZGV4IDg3NzM0ZjIuLmFlMGM3YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXJlZy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXJlZy5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogc2FhNzEzNC1yZWcuaCx2IDEuMiAyMDA0LzA5LzE1IDE2OjE1OjI0IGtyYXhlbCBFeHAgJAogICoKICAqIHBoaWxpcHMgc2FhNzEzNCByZWdpc3RlcnMKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXRzLmMKaW5kZXggNGRkOWYxYi4uNDYzODg1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10cy5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogc2FhNzEzNC10cy5jLHYgMS4xNSAyMDA1LzA2LzE0IDIyOjQ4OjE4IGhoYWNrbWFubiBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogdmlkZW80bGludXggdmlkZW8gaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10dmF1ZGlvLmMKaW5kZXggZWVhZmE1YS4uYmFkZjJmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXR2YXVkaW8uYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtdHZhdWRpby5jLHYgMS4zMCAyMDA1LzA2LzI4IDIzOjQxOjQ3IG1rcnVma3kgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIHR2IGF1ZGlvIGRlY29kZXIgKGZtIHN0ZXJlbywgbmljYW0sIC4uLikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZiaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmJpLmMKaW5kZXggMjllNTFjYS4uZjRhZWUwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmJpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmJpLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBzYWE3MTM0LXZiaS5jLHYgMS43IDIwMDUvMDUvMjQgMjM6MTM6MDYgbnNoIEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCiAgKiB2aWRlbzRsaW51eCB2aWRlbyBpbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCmluZGV4IGE0YzJmNzUuLjM1ZTVlODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtdmlkZW8uYyx2IDEuMzYgMjAwNS8wNi8yOCAyMzo0MTo0NyBta3J1Zmt5IEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCiAgKiB2aWRlbzRsaW51eCB2aWRlbyBpbnRlcmZhY2UKQEAgLTEzNjgsMjkgKzEzNjcsNyBAQAogCXNhYV9hbmRvcmIoU0FBNzEzNF9PRk1UX0RBVEFfQSwgMHgxZiwgMCk7CiAJc2FhX2FuZG9yYihTQUE3MTM0X09GTVRfREFUQV9CLCAweDFmLCAwKTsKIAotCWlmIChkZXYtPnR1bmVyX3R5cGUgPT0gVFVORVJfUEhJTElQU19UREE4MjkwKSB7Ci0JCXU4IGRhdGFbMl07Ci0JCWludCByZXQ7Ci0JCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkcj1JMkNfQUREUl9UREE4MjkwLCAuZmxhZ3M9MCwgLmJ1Zj1kYXRhLCAubGVuID0gMn07Ci0JCWRhdGFbMF0gPSAweDIxOwotCQlkYXRhWzFdID0gMHhjMDsKLQkJcmV0ID0gaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKLQkJaWYgKHJldCAhPSAxKQotCQkJcHJpbnRrKEtFUk5fRVJSICJUREE4MjkwIGFjY2VzcyBmYWlsdXJlXG4iKTsKLQkJbXNnLmFkZHIgPSBJMkNfQUREUl9UREE4Mjc1OwotCQlkYXRhWzBdID0gMHgzMDsKLQkJZGF0YVsxXSA9IDB4ZDA7Ci0JCXJldCA9IGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7Ci0JCWlmIChyZXQgIT0gMSkKLQkJCXByaW50ayhLRVJOX0VSUiAiVERBODI3NSBhY2Nlc3MgZmFpbHVyZVxuIik7Ci0JCW1zZy5hZGRyID0gSTJDX0FERFJfVERBODI5MDsKLQkJZGF0YVswXSA9IDB4MjE7Ci0JCWRhdGFbMV0gPSAweDgwOwotCQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOwotCQlkYXRhWzBdID0gMHgwMDsKLQkJZGF0YVsxXSA9IDB4MDI7Ci0JCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7Ci0JfQorCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFRVTkVSX1NFVF9TVEFOREJZLCBOVUxMKTsKIAogCS8qIGZyZWUgc3R1ZmYgKi8KIAl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT5jYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKaW5kZXggMmFmMGNiMi4uM2VhMDkxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogc2FhNzEzNC5oLHYgMS40OSAyMDA1LzA3LzEzIDE3OjI1OjI1IG1jaGVoYWIgRXhwICQKICAqCiAgKiB2NGwyIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICoKQEAgLTE4NSw2ICsxODQsOSBAQAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX1BISUxJUFNfVE9VR0ggNjEKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfR09MRF9QTFVTSUkgNjIKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9LV09STERfWFBFUlQgNjMKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9GTFlUVl9ESUdJTUFUUklYIDY0CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfS1dPUkxEX1RFUk1JTkFUT1IgNjUKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9ZVUFOX1RVTjkwMCA2NgogCiAjZGVmaW5lIFNBQTcxMzRfTUFYQk9BUkRTIDgKICNkZWZpbmUgU0FBNzEzNF9JTlBVVF9NQVggOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTg1LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxODUuYwppbmRleCAxMDhlN2E0Li4xMzJhYTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxODUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxODUuYwpAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CkBAIC0zODcsNyArMzg2LDYgQEAKIAkubm9ybWFsX2kyYwkJPSBub3JtYWxfaTJjLAogCS5wcm9iZQkJCT0gJmlnbm9yZSwKIAkuaWdub3JlCQkJPSAmaWdub3JlLAotCS5mb3JjZQkJCT0gJmlnbm9yZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX3NhYTcxODU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxOTEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE5MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NGY1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxOTEuYwpAQCAtMCwwICsxLDUxMiBAQAorLyoKKyAqICBzYWE3MTkxLmMgLSBQaGlsaXBzIFNBQTcxOTEgdmlkZW8gZGVjb2RlciBkcml2ZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIExhZGlzbGF2IE1pY2hsIDxsYWRpc0BsaW51eC1taXBzLm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSBNaWthZWwgTm91c2lhaW5lbiA8dG1ub3VzaWFAY2MuaHV0LmZpPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2RlY29kZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgInNhYTcxOTEuaCIKKworI2RlZmluZSBTQUE3MTkxX01PRFVMRV9WRVJTSU9OICIwLjAuMyIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJQaGlsaXBzIFNBQTcxOTEgdmlkZW8gZGVjb2RlciBkcml2ZXIiKTsKK01PRFVMRV9WRVJTSU9OKFNBQTcxOTFfTU9EVUxFX1ZFUlNJT04pOworTU9EVUxFX0FVVEhPUigiTWlrYWVsIE5vdXNpYWluZW4gPHRtbm91c2lhQGNjLmh1dC5maT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBWSU5PX0FEQVBURVIJKEkyQ19BTEdPX1NHSSB8IEkyQ19IV19TR0lfVklOTykKKworc3RydWN0IHNhYTcxOTEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisKKwkvKiB0aGUgcmVnaXN0ZXIgdmFsdWVzIGFyZSBzdG9yZWQgaGVyZSBhcyB0aGUgYWN0dWFsCisJICogSTJDLXJlZ2lzdGVycyBhcmUgd3JpdGUtb25seSAqLworCXVuc2lnbmVkIGNoYXIgcmVnWzI1XTsKKworCXVuc2lnbmVkIGNoYXIgbm9ybTsKKwl1bnNpZ25lZCBjaGFyIGlucHV0OworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXJfc2FhNzE5MTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5pdHNlcVtdID0geworCTAsCS8qIFN1YmFkZHJlc3MgKi8KKwkweDUwLAkvKiBTQUE3MTkxX1JFR19JREVMICovCisJMHgzMCwJLyogU0FBNzE5MV9SRUdfSFNZQiAqLworCTB4MDAsCS8qIFNBQTcxOTFfUkVHX0hTWVMgKi8KKwkweGU4LAkvKiBTQUE3MTkxX1JFR19IQ0xCICovCisJMHhiNiwJLyogU0FBNzE5MV9SRUdfSENMUyAqLworCTB4ZjQsCS8qIFNBQTcxOTFfUkVHX0hQSEkgKi8KKwkweDAxLAkvKiBTQUE3MTkxX1JFR19MVU1BIC0gY2hyb21pbmFuY2UgdHJhcCBhY3RpdmUgKENWQlMpICovCisJMHgwMCwJLyogU0FBNzE5MV9SRUdfSFVFQyAqLworCTB4ZjgsCS8qIFNBQTcxOTFfUkVHX0NLVFEgKi8KKwkweGY4LAkvKiBTQUE3MTkxX1JFR19DS1RTICovCisJMHg5MCwJLyogU0FBNzE5MV9SRUdfUExTRSAqLworCTB4OTAsCS8qIFNBQTcxOTFfUkVHX1NFU0UgKi8KKwkweDAwLAkvKiBTQUE3MTkxX1JFR19HQUlOICovCisJMHgwYywJLyogU0FBNzE5MV9SRUdfU1REQyAtIG5vdCBTRUNBTSwgc2xvdyB0aW1lIGNvbnN0YW50ICovCisJMHg3OCwJLyogU0FBNzE5MV9SRUdfSU9DSyAtIGNocm9taW5hbmNlIGZyb20gQ1ZCUywgR1BTVzEgJiAyIG9mZiAqLworCTB4OTksCS8qIFNBQTcxOTFfUkVHX0NUTDMgLSBhdXRvbWF0aWMgZmllbGQgZGV0ZWN0aW9uICovCisJMHgwMCwJLyogU0FBNzE5MV9SRUdfQ1RMNCAqLworCTB4MmMsCS8qIFNBQTcxOTFfUkVHX0NIQ1YgKi8KKwkweDAwLAkvKiB1bnVzZWQgKi8KKwkweDAwLAkvKiB1bnVzZWQgKi8KKwkweDM0LAkvKiBTQUE3MTkxX1JFR19IUzZCICovCisJMHgwYSwJLyogU0FBNzE5MV9SRUdfSFM2UyAqLworCTB4ZjQsCS8qIFNBQTcxOTFfUkVHX0hDNkIgKi8KKwkweGNlLAkvKiBTQUE3MTkxX1JFR19IQzZTICovCisJMHhmNCwJLyogU0FBNzE5MV9SRUdfSFA2SSAqLworfTsKKworLyogU0FBNzE5MSByZWdpc3RlciBoYW5kbGluZyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBzYWE3MTkxX3JlYWRfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgICAgdW5zaWduZWQgY2hhciByZWcpCit7CisJcmV0dXJuICgoc3RydWN0IHNhYTcxOTEgKilpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSktPnJlZ1tyZWddOworfQorCitzdGF0aWMgaW50IHNhYTcxOTFfcmVhZF9zdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICp2YWx1ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgdmFsdWUsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0FBNzE5MTogc2FhNzE5MV9yZWFkX3N0YXR1cygpOiByZWFkIGZhaWxlZCIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc2FhNzE5MV93cml0ZV9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY2hhciByZWcsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisKKwkoKHN0cnVjdCBzYWE3MTkxICopaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpLT5yZWdbcmVnXSA9IHZhbHVlOworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7Cit9CisKKy8qIHRoZSBmaXJzdCBieXRlIG9mIGRhdGEgbXVzdCBiZSB0aGUgZmlyc3Qgc3ViYWRkcmVzcyBudW1iZXIgKHJlZ2lzdGVyKSAqLworc3RhdGljIGludCBzYWE3MTkxX3dyaXRlX2Jsb2NrKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCXN0cnVjdCBzYWE3MTkxICpkZWNvZGVyID0gKHN0cnVjdCBzYWE3MTkxICopaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJZm9yIChpID0gMDsgaSA8IChsZW5ndGggLSAxKTsgaSsrKSB7CisJCWRlY29kZXItPnJlZ1tkYXRhWzBdICsgaV0gPSBkYXRhW2kgKyAxXTsKKwl9CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBkYXRhLCBsZW5ndGgpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0FBNzE5MTogc2FhNzE5MV93cml0ZV9ibG9jaygpOiAiCisJCSAgICAgICAid3JpdGUgZmFpbGVkIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBzYWE3MTkxX3NldF9pbnB1dChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgaW5wdXQpCit7CisJdW5zaWduZWQgY2hhciBsdW1hID0gc2FhNzE5MV9yZWFkX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX0xVTUEpOworCXVuc2lnbmVkIGNoYXIgaW9jayA9IHNhYTcxOTFfcmVhZF9yZWcoY2xpZW50LCBTQUE3MTkxX1JFR19JT0NLKTsKKwlpbnQgZXJyOworCisJc3dpdGNoIChpbnB1dCkgeworCWNhc2UgU0FBNzE5MV9JTlBVVF9DT01QT1NJVEU6IC8qIFNldCBDb21wb3NpdGUgaW5wdXQgKi8KKwkJaW9jayAmPSB+KFNBQTcxOTFfSU9DS19DSFJTIHwgU0FBNzE5MV9JT0NLX0dQU1cxCisJCQkgIHwgU0FBNzE5MV9JT0NLX0dQU1cyKTsKKwkJLyogQ2hyb21pbmFuY2UgdHJhcCBhY3RpdmUgKi8KKwkJbHVtYSAmPSB+U0FBNzE5MV9MVU1BX0JZUFM7CisJCWJyZWFrOworCWNhc2UgU0FBNzE5MV9JTlBVVF9TVklERU86IC8qIFNldCBTLVZpZGVvIGlucHV0ICovCisJCWlvY2sgfD0gU0FBNzE5MV9JT0NLX0NIUlMgfCBTQUE3MTkxX0lPQ0tfR1BTVzI7CisJCS8qIENocm9taW5hbmNlIHRyYXAgYnlwYXNzZWQgKi8KKwkJbHVtYSB8PSBTQUE3MTkxX0xVTUFfQllQUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyID0gc2FhNzE5MV93cml0ZV9yZWcoY2xpZW50LCBTQUE3MTkxX1JFR19MVU1BLCBsdW1hKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTzsKKwllcnIgPSBzYWE3MTkxX3dyaXRlX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX0lPQ0ssIGlvY2spOworCWlmIChlcnIpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FhNzE5MV9zZXRfbm9ybShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgbm9ybSkKK3sKKwlzdHJ1Y3Qgc2FhNzE5MSAqZGVjb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGNoYXIgc3RkYyA9IHNhYTcxOTFfcmVhZF9yZWcoY2xpZW50LCBTQUE3MTkxX1JFR19TVERDKTsKKwl1bnNpZ25lZCBjaGFyIGN0bDMgPSBzYWE3MTkxX3JlYWRfcmVnKGNsaWVudCwgU0FBNzE5MV9SRUdfQ1RMMyk7CisJdW5zaWduZWQgY2hhciBjaGN2ID0gc2FhNzE5MV9yZWFkX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX0NIQ1YpOworCWludCBlcnI7CisKKwlzd2l0Y2gobm9ybSkgeworCWNhc2UgU0FBNzE5MV9OT1JNX0FVVE86IHsKKwkJdW5zaWduZWQgY2hhciBzdGF0dXM7CisKKwkJLy8gZG9lcyBzdGF0dXMgZGVwZW5kIG9uIGN1cnJlbnQgbm9ybSA/CisJCWlmIChzYWE3MTkxX3JlYWRfc3RhdHVzKGNsaWVudCwgJnN0YXR1cykpCisJCQlyZXR1cm4gLUVJTzsKKworCQlzdGRjICY9IH5TQUE3MTkxX1NURENfU0VDUzsKKwkJY3RsMyAmPSB+U0FBNzE5MV9DVEwzX0ZTRUw7CisJCWN0bDMgfD0gU0FBNzE5MV9DVEwzX0FVRkQ7CisJCWNoY3YgPSAoc3RhdHVzICYgU0FBNzE5MV9TVEFUVVNfRklEVCkKKwkJCSAgICAgICA/IFNBQTcxOTFfQ0hDVl9OVFNDIDogU0FBNzE5MV9DSENWX1BBTDsKKwkJYnJlYWs7CisJfQorCWNhc2UgU0FBNzE5MV9OT1JNX1BBTDoKKwkJc3RkYyAmPSB+U0FBNzE5MV9TVERDX1NFQ1M7CisJCWN0bDMgJj0gfihTQUE3MTkxX0NUTDNfQVVGRCB8IFNBQTcxOTFfQ1RMM19GU0VMKTsKKwkJY2hjdiA9IFNBQTcxOTFfQ0hDVl9QQUw7CisJCWJyZWFrOworCWNhc2UgU0FBNzE5MV9OT1JNX05UU0M6CisJCXN0ZGMgJj0gflNBQTcxOTFfU1REQ19TRUNTOworCQljdGwzICY9IH5TQUE3MTkxX0NUTDNfQVVGRDsKKwkJY3RsMyB8PSBTQUE3MTkxX0NUTDNfRlNFTDsKKwkJY2hjdiA9IFNBQTcxOTFfQ0hDVl9OVFNDOworCQlicmVhazsKKwljYXNlIFNBQTcxOTFfTk9STV9TRUNBTToKKwkJc3RkYyB8PSBTQUE3MTkxX1NURENfU0VDUzsKKwkJY3RsMyAmPSB+KFNBQTcxOTFfQ1RMM19BVUZEIHwgU0FBNzE5MV9DVEwzX0ZTRUwpOworCQljaGN2ID0gU0FBNzE5MV9DSENWX1BBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyID0gc2FhNzE5MV93cml0ZV9yZWcoY2xpZW50LCBTQUE3MTkxX1JFR19DVEwzLCBjdGwzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTzsKKwllcnIgPSBzYWE3MTkxX3dyaXRlX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX1NUREMsIHN0ZGMpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlPOworCWVyciA9IHNhYTcxOTFfd3JpdGVfcmVnKGNsaWVudCwgU0FBNzE5MV9SRUdfQ0hDViwgY2hjdik7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU87CisKKwlkZWNvZGVyLT5ub3JtID0gbm9ybTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYTcxOTFfZ2V0X2NvbnRyb2xzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJc3RydWN0IHNhYTcxOTFfY29udHJvbCAqY3RybCkKK3sKKwl1bnNpZ25lZCBjaGFyIGh1ZSA9IHNhYTcxOTFfcmVhZF9yZWcoY2xpZW50LCBTQUE3MTkxX1JFR19IVUVDKTsKKwl1bnNpZ25lZCBjaGFyIHN0ZGMgPSBzYWE3MTkxX3JlYWRfcmVnKGNsaWVudCwgU0FBNzE5MV9SRUdfU1REQyk7CisKKwlpZiAoaHVlIDwgMHg4MCkgeworCQlodWUgKz0gMHg4MDsKKwl9IGVsc2UgeworCQlodWUgLT0gMHg4MDsKKwl9CisJY3RybC0+aHVlID0gaHVlOworCisJY3RybC0+dnRyYyA9IChzdGRjICYgU0FBNzE5MV9TVERDX1ZUUkMpCisJCT8gU0FBNzE5MV9WQUxVRV9FTkFCTEVEIDogU0FBNzE5MV9WQUxVRV9ESVNBQkxFRDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYTcxOTFfc2V0X2NvbnRyb2xzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJc3RydWN0IHNhYTcxOTFfY29udHJvbCAqY3RybCkKK3sKKwlpbnQgZXJyOworCisJaWYgKGN0cmwtPmh1ZSA+PSAwKSB7CisJCXVuc2lnbmVkIGNoYXIgaHVlID0gY3RybC0+aHVlICYgMHhmZjsKKwkJaWYgKGh1ZSA8IDB4ODApIHsKKwkJCWh1ZSArPSAweDgwOworCQl9IGVsc2UgeworCQkJaHVlIC09IDB4ODA7CisJCX0KKwkJZXJyID0gc2FhNzE5MV93cml0ZV9yZWcoY2xpZW50LCBTQUE3MTkxX1JFR19IVUVDLCBodWUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIC1FSU87CisJfQorCWlmIChjdHJsLT52dHJjID49IDApIHsKKwkJdW5zaWduZWQgY2hhciBzdGRjID0KKwkJCXNhYTcxOTFfcmVhZF9yZWcoY2xpZW50LCBTQUE3MTkxX1JFR19TVERDKTsKKworCQlpZiAoY3RybC0+dnRyYykgeworCQkJc3RkYyB8PSBTQUE3MTkxX1NURENfVlRSQzsKKwkJfSBlbHNlIHsKKwkJCXN0ZGMgJj0gflNBQTcxOTFfU1REQ19WVFJDOworCQl9CisKKwkJZXJyID0gc2FhNzE5MV93cml0ZV9yZWcoY2xpZW50LCBTQUE3MTkxX1JFR19TVERDLCBzdGRjKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisvKiBJMkMtaW50ZXJmYWNlICovCisKK3N0YXRpYyBpbnQgc2FhNzE5MV9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHNhYTcxOTEgKmRlY29kZXI7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKworCXByaW50ayhLRVJOX0lORk8gIlBoaWxpcHMgU0FBNzE5MSBkcml2ZXIgdmVyc2lvbiAlc1xuIiwKKwkgICAgICAgU0FBNzE5MV9NT0RVTEVfVkVSU0lPTik7CisKKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZigqY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbGllbnQpCisJCXJldHVybiAtRU5PTUVNOworCWRlY29kZXIgPSBrbWFsbG9jKHNpemVvZigqZGVjb2RlciksIEdGUF9LRVJORUwpOworCWlmICghZGVjb2RlcikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2NsaWVudDsKKwl9CisKKwltZW1zZXQoY2xpZW50LCAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKKwltZW1zZXQoZGVjb2RlciwgMCwgc2l6ZW9mKHN0cnVjdCBzYWE3MTkxKSk7CisKKwljbGllbnQtPmFkZHIgPSBhZGRyOworCWNsaWVudC0+YWRhcHRlciA9IGFkYXA7CisJY2xpZW50LT5kcml2ZXIgPSAmaTJjX2RyaXZlcl9zYWE3MTkxOworCWNsaWVudC0+ZmxhZ3MgPSAwOworCXN0cmNweShjbGllbnQtPm5hbWUsICJzYWE3MTkxIGNsaWVudCIpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRlY29kZXIpOworCisJZGVjb2Rlci0+Y2xpZW50ID0gY2xpZW50OworCisJZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX2RlY29kZXI7CisKKwlkZWNvZGVyLT5pbnB1dCA9IFNBQTcxOTFfSU5QVVRfQ09NUE9TSVRFOworCWRlY29kZXItPm5vcm0gPSBTQUE3MTkxX05PUk1fQVVUTzsKKworCWVyciA9IHNhYTcxOTFfd3JpdGVfYmxvY2soY2xpZW50LCBzaXplb2YoaW5pdHNlcSksCisJCQkJICAodW5zaWduZWQgY2hhciAqKWluaXRzZXEpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTQUE3MTkxIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X2RldGFjaF9jbGllbnQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiU0FBNzE5MSBpbml0aWFsaXplZFxuIik7CisKKwlyZXR1cm4gMDsKKworb3V0X2RldGFjaF9jbGllbnQ6CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKK291dF9mcmVlX2RlY29kZXI6CisJa2ZyZWUoZGVjb2Rlcik7CitvdXRfZnJlZV9jbGllbnQ6CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNhYTcxOTFfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCS8qIEFsd2F5cyBjb25uZWN0ZWQgdG8gVklOTyAqLworCWlmIChhZGFwLT5pZCA9PSBWSU5PX0FEQVBURVIpCisJCXJldHVybiBzYWE3MTkxX2F0dGFjaChhZGFwLCBTQUE3MTkxX0FERFIsIDApOworCS8qIEZlZWwgZnJlZSB0byBhZGQgcHJvYmUgaGVyZSA6LSkgKi8KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBzYWE3MTkxX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzYWE3MTkxICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWtmcmVlKGRlY29kZXIpOworCWtmcmVlKGNsaWVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FhNzE5MV9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICB2b2lkICphcmcpCit7CisJc3RydWN0IHNhYTcxOTEgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBERUNPREVSX0dFVF9DQVBBQklMSVRJRVM6IHsKKwkJc3RydWN0IHZpZGVvX2RlY29kZXJfY2FwYWJpbGl0eSAqY2FwID0gYXJnOworCisJCWNhcC0+ZmxhZ3MgID0gVklERU9fREVDT0RFUl9QQUwgfCBWSURFT19ERUNPREVSX05UU0MgfAorCQkJICAgICAgVklERU9fREVDT0RFUl9TRUNBTSB8IFZJREVPX0RFQ09ERVJfQVVUTzsKKwkJY2FwLT5pbnB1dHMgPSAoY2xpZW50LT5hZGFwdGVyLT5pZCA9PSBWSU5PX0FEQVBURVIpID8gMiA6IDE7CisJCWNhcC0+b3V0cHV0cyA9IDE7CisJCWJyZWFrOworCX0KKwljYXNlIERFQ09ERVJfR0VUX1NUQVRVUzogeworCQlpbnQgKmlhcmcgPSBhcmc7CisJCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCQlpbnQgcmVzID0gMDsKKworCQlpZiAoc2FhNzE5MV9yZWFkX3N0YXR1cyhjbGllbnQsICZzdGF0dXMpKSB7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoKHN0YXR1cyAmIFNBQTcxOTFfU1RBVFVTX0hMQ0spID09IDApCisJCQlyZXMgfD0gREVDT0RFUl9TVEFUVVNfR09PRDsKKwkJaWYgKHN0YXR1cyAmIFNBQTcxOTFfU1RBVFVTX0NPREUpCisJCQlyZXMgfD0gREVDT0RFUl9TVEFUVVNfQ09MT1I7CisJCXN3aXRjaCAoZGVjb2Rlci0+bm9ybSkgeworCQljYXNlIFNBQTcxOTFfTk9STV9OVFNDOgorCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX05UU0M7CisJCQlicmVhazsKKwkJY2FzZSBTQUE3MTkxX05PUk1fUEFMOgorCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX1BBTDsKKwkJCWJyZWFrOworCQljYXNlIFNBQTcxOTFfTk9STV9TRUNBTToKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19TRUNBTTsKKwkJCWJyZWFrOworCQljYXNlIFNBQTcxOTFfTk9STV9BVVRPOgorCQlkZWZhdWx0OgorCQkJaWYgKHN0YXR1cyAmIFNBQTcxOTFfU1RBVFVTX0ZJRFQpCisJCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX05UU0M7CisJCQllbHNlCisJCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX1BBTDsKKwkJCWJyZWFrOworCQl9CisJCSppYXJnID0gcmVzOworCQlicmVhazsKKwl9CisJY2FzZSBERUNPREVSX1NFVF9OT1JNOiB7CisJCWludCAqaWFyZyA9IGFyZzsKKworCQlzd2l0Y2ggKCppYXJnKSB7CisJCWNhc2UgVklERU9fTU9ERV9BVVRPOgorCQkJcmV0dXJuIHNhYTcxOTFfc2V0X25vcm0oY2xpZW50LCBTQUE3MTkxX05PUk1fQVVUTyk7CisJCWNhc2UgVklERU9fTU9ERV9QQUw6CisJCQlyZXR1cm4gc2FhNzE5MV9zZXRfbm9ybShjbGllbnQsIFNBQTcxOTFfTk9STV9QQUwpOworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCXJldHVybiBzYWE3MTkxX3NldF9ub3JtKGNsaWVudCwgU0FBNzE5MV9OT1JNX05UU0MpOworCQljYXNlIFZJREVPX01PREVfU0VDQU06CisJCQlyZXR1cm4gc2FhNzE5MV9zZXRfbm9ybShjbGllbnQsIFNBQTcxOTFfTk9STV9TRUNBTSk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBERUNPREVSX1NFVF9JTlBVVDoJeworCQlpbnQgKmlhcmcgPSBhcmc7CisKKwkJc3dpdGNoIChjbGllbnQtPmFkYXB0ZXItPmlkKSB7CisJCWNhc2UgVklOT19BREFQVEVSOgorCQkJcmV0dXJuIHNhYTcxOTFfc2V0X2lucHV0KGNsaWVudCwgKmlhcmcpOworCQlkZWZhdWx0OgorCQkJaWYgKCppYXJnICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgREVDT0RFUl9TRVRfT1VUUFVUOiB7CisJCWludCAqaWFyZyA9IGFyZzsKKworCQkvKiBub3QgbXVjaCBjaG9pY2Ugb2Ygb3V0cHV0cyAqLworCQlpZiAoKmlhcmcgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisJY2FzZSBERUNPREVSX0VOQUJMRV9PVVRQVVQ6IHsKKwkJLyogQWx3YXlzIGVuYWJsZWQgKi8KKwkJYnJlYWs7CisJfQorCWNhc2UgREVDT0RFUl9TRVRfUElDVFVSRTogeworCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcGljID0gYXJnOworCQl1bnNpZ25lZCB2YWw7CisJCWludCBlcnI7CisKKwkJdmFsID0gKHBpYy0+aHVlID4+IDgpIC0gMHg4MDsKKwkJZXJyID0gc2FhNzE5MV93cml0ZV9yZWcoY2xpZW50LCBTQUE3MTkxX1JFR19IVUVDLCB2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCX0KKwljYXNlIERFQ09ERVJfU0FBNzE5MV9HRVRfU1RBVFVTOiB7CisJCXN0cnVjdCBzYWE3MTkxX3N0YXR1cyAqc3RhdHVzID0gYXJnOworCQl1bnNpZ25lZCBjaGFyIHN0YXR1c19yZWc7CisKKwkJaWYgKHNhYTcxOTFfcmVhZF9zdGF0dXMoY2xpZW50LCAmc3RhdHVzX3JlZykpCisJCQlyZXR1cm4gLUVJTzsKKwkJc3RhdHVzLT5zaWduYWwgPSAoKHN0YXR1c19yZWcgJiBTQUE3MTkxX1NUQVRVU19ITENLKSA9PSAwKQorCQkJPyBTQUE3MTkxX1ZBTFVFX0VOQUJMRUQgOiBTQUE3MTkxX1ZBTFVFX0RJU0FCTEVEOworCQlzdGF0dXMtPm50c2MgPSAoc3RhdHVzX3JlZyAmIFNBQTcxOTFfU1RBVFVTX0ZJRFQpCisJCQk/IFNBQTcxOTFfVkFMVUVfRU5BQkxFRCA6IFNBQTcxOTFfVkFMVUVfRElTQUJMRUQ7CisJCXN0YXR1cy0+Y29sb3IgPSAoc3RhdHVzX3JlZyAmIFNBQTcxOTFfU1RBVFVTX0NPREUpCisJCQk/IFNBQTcxOTFfVkFMVUVfRU5BQkxFRCA6IFNBQTcxOTFfVkFMVUVfRElTQUJMRUQ7CisKKwkJc3RhdHVzLT5pbnB1dCA9IGRlY29kZXItPmlucHV0OworCQlzdGF0dXMtPm5vcm0gPSBkZWNvZGVyLT5ub3JtOworCX0KKwljYXNlIERFQ09ERVJfU0FBNzE5MV9TRVRfTk9STTogeworCQlpbnQgKm5vcm0gPSBhcmc7CisJCXJldHVybiBzYWE3MTkxX3NldF9ub3JtKGNsaWVudCwgKm5vcm0pOworCX0KKwljYXNlIERFQ09ERVJfU0FBNzE5MV9HRVRfQ09OVFJPTFM6IHsKKwkJc3RydWN0IHNhYTcxOTFfY29udHJvbCAqY3RybCA9IGFyZzsKKwkJcmV0dXJuIHNhYTcxOTFfZ2V0X2NvbnRyb2xzKGNsaWVudCwgY3RybCk7CisJfQorCWNhc2UgREVDT0RFUl9TQUE3MTkxX1NFVF9DT05UUk9MUzogeworCQlzdHJ1Y3Qgc2FhNzE5MV9jb250cm9sICpjdHJsID0gYXJnOworCQlyZXR1cm4gc2FhNzE5MV9zZXRfY29udHJvbHMoY2xpZW50LCBjdHJsKTsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNfZHJpdmVyX3NhYTcxOTEgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lIAkJPSAic2FhNzE5MSIsCisJLmlkIAkJPSBJMkNfRFJJVkVSSURfU0FBNzE5MSwKKwkuZmxhZ3MgCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyID0gc2FhNzE5MV9wcm9iZSwKKwkuZGV0YWNoX2NsaWVudCAJPSBzYWE3MTkxX2RldGFjaCwKKwkuY29tbWFuZCAJPSBzYWE3MTkxX2NvbW1hbmQKK307CisKK3N0YXRpYyBpbnQgc2FhNzE5MV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyX3NhYTcxOTEpOworfQorCitzdGF0aWMgdm9pZCBzYWE3MTkxX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmaTJjX2RyaXZlcl9zYWE3MTkxKTsKK30KKworbW9kdWxlX2luaXQoc2FhNzE5MV9pbml0KTsKK21vZHVsZV9leGl0KHNhYTcxOTFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxOTEuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE5MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MjA0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxOTEuaApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqICBzYWE3MTkxLmggLSBQaGlsaXBzIFNBQTcxOTEgdmlkZW8gZGVjb2RlciBkcml2ZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIExhZGlzbGF2IE1pY2hsIDxsYWRpc0BsaW51eC1taXBzLm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSBNaWthZWwgTm91c2lhaW5lbiA8dG1ub3VzaWFAY2MuaHV0LmZpPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfU0FBNzE5MV9IXworI2RlZmluZSBfU0FBNzE5MV9IXworCisvKiBQaGlsaXBzIFNBQTcxOTEgRE1TRCBJMkMgYnVzIGFkZHJlc3MgKi8KKyNkZWZpbmUgU0FBNzE5MV9BRERSCQkweDhhCisKKy8qIFJlZ2lzdGVyIHN1YmFkZHJlc3Nlcy4gKi8KKyNkZWZpbmUgU0FBNzE5MV9SRUdfSURFTAkweDAwCisjZGVmaW5lIFNBQTcxOTFfUkVHX0hTWUIJMHgwMQorI2RlZmluZSBTQUE3MTkxX1JFR19IU1lTCTB4MDIKKyNkZWZpbmUgU0FBNzE5MV9SRUdfSENMQgkweDAzCisjZGVmaW5lIFNBQTcxOTFfUkVHX0hDTFMJMHgwNAorI2RlZmluZSBTQUE3MTkxX1JFR19IUEhJCTB4MDUKKyNkZWZpbmUgU0FBNzE5MV9SRUdfTFVNQQkweDA2CisjZGVmaW5lIFNBQTcxOTFfUkVHX0hVRUMJMHgwNworI2RlZmluZSBTQUE3MTkxX1JFR19DS1RRCTB4MDgKKyNkZWZpbmUgU0FBNzE5MV9SRUdfQ0tUUwkweDA5CisjZGVmaW5lIFNBQTcxOTFfUkVHX1BMU0UJMHgwYQorI2RlZmluZSBTQUE3MTkxX1JFR19TRVNFCTB4MGIKKyNkZWZpbmUgU0FBNzE5MV9SRUdfR0FJTgkweDBjCisjZGVmaW5lIFNBQTcxOTFfUkVHX1NUREMJMHgwZAorI2RlZmluZSBTQUE3MTkxX1JFR19JT0NLCTB4MGUKKyNkZWZpbmUgU0FBNzE5MV9SRUdfQ1RMMwkweDBmCisjZGVmaW5lIFNBQTcxOTFfUkVHX0NUTDQJMHgxMAorI2RlZmluZSBTQUE3MTkxX1JFR19DSENWCTB4MTEKKyNkZWZpbmUgU0FBNzE5MV9SRUdfSFM2QgkweDE0CisjZGVmaW5lIFNBQTcxOTFfUkVHX0hTNlMJMHgxNQorI2RlZmluZSBTQUE3MTkxX1JFR19IQzZCCTB4MTYKKyNkZWZpbmUgU0FBNzE5MV9SRUdfSEM2UwkweDE3CisjZGVmaW5lIFNBQTcxOTFfUkVHX0hQNkkJMHgxOAorI2RlZmluZSBTQUE3MTkxX1JFR19TVEFUVVMJMHhmZgkvKiBub3QgcmVhbGx5IGEgc3ViYWRkcmVzcyAqLworCisvKiBTdGF0dXMgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU0FBNzE5MV9TVEFUVVNfQ09ERQkweDAxCS8qIGNvbG9yIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgU0FBNzE5MV9TVEFUVVNfRklEVAkweDIwCS8qIGZvcm1hdCB0eXBlIE5UU0MvUEFMICovCisjZGVmaW5lIFNBQTcxOTFfU1RBVFVTX0hMQ0sJMHg0MAkvKiBQTEwgdW5sb2NrZWQvbG9ja2VkICovCisjZGVmaW5lIFNBQTcxOTFfU1RBVFVTX1NUVEMJMHg4MAkvKiB0di92dHIgdGltZSBjb25zdGFudCAqLworCisvKiBMdW1pbmFuY2UgQ29udHJvbCBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTQUE3MTkxX0xVTUFfQllQUwkweDgwCisKKy8qIENocm9tYSBHYWluIENvbnRyb2wgU2V0dGluZ3MgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKy8qIDA9YXV0b21hdGljIGNvbG91ci1raWxsZXIgZW5hYmxlZCwgMT1mb3JjZWQgY29sb3VyIG9uICovCisjZGVmaW5lIFNBQTcxOTFfR0FJTl9DT0xPCTB4ODAKKworLyogU3RhbmRhcmQvTW9kZSBDb250cm9sIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisvKiB0di92dHIgbW9kZSBiaXQ6IDA9VFYgbW9kZSAoc2xvdyB0aW1lIGNvbnN0YW50KSwKKyAqIDE9VlRSIG1vZGUgKGZhc3QgdGltZSBjb25zdGFudCkgKi8KKyNkZWZpbmUgU0FBNzE5MV9TVERDX1ZUUkMJMHg4MAorLyogU0VDQU0gbW9kZSBiaXQ6IDA9b3RoZXIgc3RhbmRhcmRzLCAxPVNFQ0FNICovCisjZGVmaW5lIFNBQTcxOTFfU1REQ19TRUNTCTB4MDEKKy8qIHRoZSBiaXQgZmllbGRzIGFib3ZlIG11c3QgYmUgb3InZCB3aXRoIHRoaXMgdmFsdWUgKi8KKyNkZWZpbmUgU0FBNzE5MV9TVERDX1ZBTFVFCTB4MGMKKworLyogSS9PIGFuZCBDbG9jayBDb250cm9sIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisvKiBob3Jpem9udGFsIGNsb2NrIFBMTDogMD1QTEwgY2xvc2VkLAorICogMT1QTEwgY2lyY3VpdCBvcGVuIGFuZCBob3Jpem9udGFsIGZyZXEgZml4ZWQgKi8KKyNkZWZpbmUgU0FBNzE5MV9JT0NLX0hQTEwJMHg4MAorLyogUy1WSFMgYml0IChjaHJvbWluYW5jZSBmcm9tIENWQlMgb3IgZnJvbSBjaHJvbWluYW5jZSBpbnB1dCk6CisgKiAwPWNvbnRyb2xsZWQgYnkgQllQUy1iaXQsIDE9ZnJvbSBjaHJvbWluYW5jZSBpbnB1dCAqLworI2RlZmluZSBTQUE3MTkxX0lPQ0tfQ0hSUwkweDA0CisvKiBnZW5lcmFsIHB1cnBvc2Ugc3dpdGNoIDIKKyAqIFZJTk8tc3BlY2lmaWM6IDA9dXNlZCB3aXRoIENWQlMsIDE9dXNlZCB3aXRoIFMtVmlkZW8gKi8KKyNkZWZpbmUgU0FBNzE5MV9JT0NLX0dQU1cyCTB4MDIKKy8qIGdlbmVyYWwgcHVycG9zZSBzd2l0Y2ggMSAqLworLyogVklOTy1zcGVjaWZpYzogMD1hbHdheXMsIDE9bm90IHVzZWQhKi8KKyNkZWZpbmUgU0FBNzE5MV9JT0NLX0dQU1cxCTB4MDEKKworLyogTWlzY2VsbGFuZW91cyBDb250cm9sICMxIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisvKiBhdXRvbWF0aWMgZmllbGQgZGV0ZWN0aW9uICg1MC82MEh6IHN0YW5kYXJkKSAqLworI2RlZmluZSBTQUE3MTkxX0NUTDNfQVVGRAkweDgwCisvKiBmaWVsZCBzZWxlY3Q6IChpZiBBVUZEPTApCisgKiAwPTUwSHogKDYyNSBsaW5lcyksIDE9NjBIeiAoNTI1IGxpbmVzKSAqLworI2RlZmluZSBTQUE3MTkxX0NUTDNfRlNFTAkweDQwCisvKiB0aGUgYml0IGZpZWxkcyBhYm92ZSBtdXN0IGJlIG9yJ2Qgd2l0aCB0aGlzIHZhbHVlICovCisjZGVmaW5lIFNBQTcxOTFfQ1RMM19WQUxVRQkweDE5CisKKy8qIENocm9taW5hbmNlIEdhaW4gQ29udHJvbCBSZWdpc3RlciBkZWZpbml0aW9ucworICogKG5vbWluYWwgdmFsdWUgZm9yIFVWIENDSVIgbGV2ZWwpICovCisjZGVmaW5lIFNBQTcxOTFfQ0hDVl9OVFNDCTB4MmMKKyNkZWZpbmUgU0FBNzE5MV9DSENWX1BBTAkweDU5CisKKy8qIERyaXZlciBpbnRlcmZhY2UgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU0FBNzE5MV9JTlBVVF9DT01QT1NJVEUJMAorI2RlZmluZSBTQUE3MTkxX0lOUFVUX1NWSURFTwkxCisKKyNkZWZpbmUgU0FBNzE5MV9OT1JNX0FVVE8JMAorI2RlZmluZSBTQUE3MTkxX05PUk1fUEFMCTEKKyNkZWZpbmUgU0FBNzE5MV9OT1JNX05UU0MJMgorI2RlZmluZSBTQUE3MTkxX05PUk1fU0VDQU0JMworCisjZGVmaW5lIFNBQTcxOTFfVkFMVUVfRU5BQkxFRAkJMQorI2RlZmluZSBTQUE3MTkxX1ZBTFVFX0RJU0FCTEVECQkwCisjZGVmaW5lIFNBQTcxOTFfVkFMVUVfVU5DSEFOR0VECQktMQorCitzdHJ1Y3Qgc2FhNzE5MV9zdGF0dXMgeworCS8qIDA9bm8gc2lnbmFsLCAxPXNpZ25hbCBhY3RpdmUqLworCWludCBzaWduYWw7CisJLyogMD01MGh6IChwYWwpIHNpZ25hbCwgMT02MGh6IChudHNjKSBzaWduYWwgKi8KKwlpbnQgbnRzYzsKKwkvKiAwPW5vIGNvbG9yIGRldGVjdGVkLCAxPWNvbG9yIGRldGVjdGVkICovCisJaW50IGNvbG9yOworCisJLyogY3VycmVudCBTQUE3MTkxX0lOUFVUXyAqLworCWludCBpbnB1dDsKKwkvKiBjdXJyZW50IFNBQTcxOTFfTk9STV8gKi8KKwlpbnQgbm9ybTsKK307CisKKyNkZWZpbmUgU0FBNzE5MV9IVUVfTUlOCQkweDAwCisjZGVmaW5lIFNBQTcxOTFfSFVFX01BWAkJMHhmZgorI2RlZmluZSBTQUE3MTkxX0hVRV9ERUZBVUxUCTB4ODAKKworI2RlZmluZSBTQUE3MTkxX1ZUUkNfTUlOCTB4MDAKKyNkZWZpbmUgU0FBNzE5MV9WVFJDX01BWAkweDAxCisjZGVmaW5lIFNBQTcxOTFfVlRSQ19ERUZBVUxUCTB4MDAKKworc3RydWN0IHNhYTcxOTFfY29udHJvbCB7CisJaW50IGh1ZTsKKwlpbnQgdnRyYzsKK307CisKKyNkZWZpbmUJREVDT0RFUl9TQUE3MTkxX0dFVF9TVEFUVVMJX0lPUignZCcsIDE5NSwgc3RydWN0IHNhYTcxOTFfc3RhdHVzKQorI2RlZmluZQlERUNPREVSX1NBQTcxOTFfU0VUX05PUk0JX0lPVygnZCcsIDE5NiwgaW50KQorI2RlZmluZQlERUNPREVSX1NBQTcxOTFfR0VUX0NPTlRST0xTCV9JT1IoJ2QnLCAxOTcsIHN0cnVjdCBzYWE3MTkxX2NvbnRyb2wpCisjZGVmaW5lCURFQ09ERVJfU0FBNzE5MV9TRVRfQ09OVFJPTFMJX0lPVygnZCcsIDE5OCwgc3RydWN0IHNhYTcxOTFfY29udHJvbCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0cmFkaXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RyYWRpcy5jCmluZGV4IGI1Nzc0MzUuLmQ0NDk3ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RyYWRpcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RyYWRpcy5jCkBAIC0yMTg0LDMwICsyMTg0LDE4IEBACiAJCXZmcmVlKHNhYS0+dmlkYnVmKTsKIAkJdmZyZWUoc2FhLT5hdWRidWYpOwogCQl2ZnJlZShzYWEtPm9zZGJ1Zik7Ci0JCWlmIChzYWEtPmRtYXZpZDIpCi0JCQlrZnJlZSgodm9pZCAqKSBzYWEtPmRtYXZpZDIpOworCQlrZnJlZShzYWEtPmRtYXZpZDIpOwogCQlzYWEtPmF1ZGJ1ZiA9IHNhYS0+dmlkYnVmID0gc2FhLT5vc2RidWYgPSBOVUxMOwogCQlzYWEtPmRtYXZpZDIgPSBOVUxMOwotCQlpZiAoc2FhLT5kbWFkZWJpKQotCQkJa2ZyZWUoKHZvaWQgKikgc2FhLT5kbWFkZWJpKTsKLQkJaWYgKHNhYS0+ZG1hdmlkMSkKLQkJCWtmcmVlKCh2b2lkICopIHNhYS0+ZG1hdmlkMSk7Ci0JCWlmIChzYWEtPmRtYXZpZDIpCi0JCQlrZnJlZSgodm9pZCAqKSBzYWEtPmRtYXZpZDIpOwotCQlpZiAoc2FhLT5kbWF2aWQzKQotCQkJa2ZyZWUoKHZvaWQgKikgc2FhLT5kbWF2aWQzKTsKLQkJaWYgKHNhYS0+ZG1hYTFpbikKLQkJCWtmcmVlKCh2b2lkICopIHNhYS0+ZG1hYTFpbik7Ci0JCWlmIChzYWEtPmRtYWExb3V0KQotCQkJa2ZyZWUoKHZvaWQgKikgc2FhLT5kbWFhMW91dCk7Ci0JCWlmIChzYWEtPmRtYWEyaW4pCi0JCQlrZnJlZSgodm9pZCAqKSBzYWEtPmRtYWEyaW4pOwotCQlpZiAoc2FhLT5kbWFhMm91dCkKLQkJCWtmcmVlKCh2b2lkICopIHNhYS0+ZG1hYTJvdXQpOwotCQlpZiAoc2FhLT5kbWFSUFMxKQotCQkJa2ZyZWUoKHZvaWQgKikgc2FhLT5kbWFSUFMxKTsKLQkJaWYgKHNhYS0+ZG1hUlBTMikKLQkJCWtmcmVlKCh2b2lkICopIHNhYS0+ZG1hUlBTMik7CisJCWtmcmVlKHNhYS0+ZG1hZGViaSk7CisJCWtmcmVlKHNhYS0+ZG1hdmlkMSk7CisJCWtmcmVlKHNhYS0+ZG1hdmlkMyk7CisJCWtmcmVlKHNhYS0+ZG1hYTFpbik7CisJCWtmcmVlKHNhYS0+ZG1hYTFvdXQpOworCQlrZnJlZShzYWEtPmRtYWEyaW4pOworCQlrZnJlZShzYWEtPmRtYWEyb3V0KTsKKwkJa2ZyZWUoc2FhLT5kbWFSUFMxKTsKKwkJa2ZyZWUoc2FhLT5kbWFSUFMyKTsKIAkJZnJlZV9pcnEoc2FhLT5pcnEsIHNhYSk7CiAJCWlmIChzYWEtPnNhYTcxNDZfbWVtKQogCQkJaW91bm1hcChzYWEtPnNhYTcxNDZfbWVtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhNzQzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMKaW5kZXggN2NiMWZiMy4uMjU1YjYwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMKQEAgLTMyOCw3ICszMjgsNyBAQAogCWlmIChhZGFwLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCiAJCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgdGRhNzQzMl9hdHRhY2gpOwogI2Vsc2UKLQlpZiAoYWRhcC0+aWQgPT0gKEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0JUODQ4KSkKKwlpZiAoYWRhcC0+aWQgPT0gSTJDX0hXX0JfQlQ4NDgpCiAJCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgdGRhNzQzMl9hdHRhY2gpOwogI2VuZGlmCiAJcmV0dXJuIDA7CkBAIC01MTMsNyArNTEzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9CiB7Ci0JSTJDX0RFVk5BTUUoInRkYTc0MzIiKSwKKwkubmFtZSAgICAgICA9ICJ0ZGE3NDMyIiwKIAkuZHJpdmVyICAgICA9ICZkcml2ZXIsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTgyOTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jCmluZGV4IGE4YjZhOGQuLmM2NWYwYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogdGRhODI5MC5jLHYgMS4xNSAyMDA1LzA3LzA4IDIwOjIxOjMzIG1jaGVoYWIgRXhwICQKICAqCiAgKiBpMmMgdHYgdHVuZXIgY2hpcCBkZXZpY2UgZHJpdmVyCiAgKiBjb250cm9scyB0aGUgcGhpbGlwcyB0ZGE4MjkwKzc1IHR1bmVyIGNoaXAgY29tYm8uCkBAIC05LDYgKzgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KIAorI2RlZmluZSBJMkNfQUREUl9UREE4MjkwICAgICAgICAweDRiCisjZGVmaW5lIEkyQ19BRERSX1REQTgyNzUgICAgICAgIDB4NjEKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdHJ1Y3QgZnJlcV9lbnRyeSB7CkBAIC03NSwxMCArNzcsMTIgQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19zZXRfVlNbMl0gPSAJCXsgMHgzMCwgMHg2RiB9Owogc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX3NldF9HUDAxX0NGWzJdID0gCXsgMHgyMCwgMHgwQiB9Owogc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX3RkYTgyOTBfcmVzZXRbMl0gPQl7IDB4MDAsIDB4MDAgfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY190ZGE4MjkwX3N0YW5kYnlbMl0gPQl7IDB4MDAsIDB4MDIgfTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19nYWluc2V0X29mZlsyXSA9CXsgMHgyOCwgMHgxNCB9Owogc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX2dhaW5zZXRfb25bMl0gPQl7IDB4MjgsIDB4NTQgfTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19hZ2MzXzAwWzJdID0JCXsgMHg4MCwgMHgwMCB9Owogc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX2FnYzJfQkZbMl0gPQkJeyAweDYwLCAweEJGIH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfY2IxX0QwWzJdID0JCXsgMHgzMCwgMHhEMCB9Owogc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX2NiMV9EMlsyXSA9CQl7IDB4MzAsIDB4RDIgfTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19jYjFfNTZbMl0gPQkJeyAweDMwLCAweDU2IH07CiBzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfY2IxXzUyWzJdID0JCXsgMHgzMCwgMHg1MiB9OwpAQCAtMTE3LDYgKzEyMSwxMyBAQAogCXsgSTJDX0FERFJfVERBODI5MCwgMCwgQVJSQVlfU0laRShpMmNfZ2FpbnNldF9vbiksIGkyY19nYWluc2V0X29uIH0sCiB9OwogCitzdGF0aWMgc3RydWN0IGkyY19tc2cgaTJjX21zZ19zdGFuZGJ5W10gPSB7CisJeyBJMkNfQUREUl9UREE4MjkwLCAwLCBBUlJBWV9TSVpFKGkyY19lbmFibGVfYnJpZGdlKSwgaTJjX2VuYWJsZV9icmlkZ2UgfSwKKwl7IEkyQ19BRERSX1REQTgyNzUsIDAsIEFSUkFZX1NJWkUoaTJjX2NiMV9EMCksIGkyY19jYjFfRDAgfSwKKwl7IEkyQ19BRERSX1REQTgyOTAsIDAsIEFSUkFZX1NJWkUoaTJjX2Rpc2FibGVfYnJpZGdlKSwgaTJjX2Rpc2FibGVfYnJpZGdlIH0sCisJeyBJMkNfQUREUl9UREE4MjkwLCAwLCBBUlJBWV9TSVpFKGkyY190ZGE4MjkwX3N0YW5kYnkpLCBpMmNfdGRhODI5MF9zdGFuZGJ5IH0sCit9OworCiBzdGF0aWMgaW50IHRkYTgyOTBfdHVuZShzdHJ1Y3QgaTJjX2NsaWVudCAqYykKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CkBAIC0yMDUsNiArMjE2LDExIEBACiAJcmV0dXJuIChhZmMgJiAweDgwKT8gNjU1MzU6MDsKIH0KIAorc3RhdGljIHZvaWQgc3RhbmRieShzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlpMmNfdHJhbnNmZXIoYy0+YWRhcHRlciwgaTJjX21zZ19zdGFuZGJ5LCBBUlJBWV9TSVpFKGkyY19tc2dfc3RhbmRieSkpOworfQorCiBpbnQgdGRhODI5MF9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjKQogewogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKQEAgLTIxNCw2ICsyMzAsNyBAQAogCXQtPnR2X2ZyZXEgICAgPSBzZXRfdHZfZnJlcTsKIAl0LT5yYWRpb19mcmVxID0gc2V0X3JhZGlvX2ZyZXE7CiAJdC0+aGFzX3NpZ25hbCA9IGhhc19zaWduYWw7CisJdC0+c3RhbmRieSA9IHN0YW5kYnk7CiAKIAlpMmNfbWFzdGVyX3NlbmQoYywgaTJjX2VuYWJsZV9icmlkZ2UsIEFSUkFZX1NJWkUoaTJjX2VuYWJsZV9icmlkZ2UpKTsKIAlpMmNfdHJhbnNmZXIoYy0+YWRhcHRlciwgaTJjX21zZ19pbml0LCBBUlJBWV9TSVpFKGkyY19tc2dfaW5pdCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODQwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuYwppbmRleCBjMjliZGZjLi4xNzk0Njg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuYwpAQCAtMjA1LDcgKzIwNSw3IEBACiBzdGF0aWMgaW50IGF0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJLyogbGV0J3Mgc2VlIHdoZXRoZXIgdGhpcyBpcyBhIGtub3cgYWRhcHRlciB3ZSBjYW4gYXR0YWNoIHRvICovCi0JaWYgKGFkYXB0ZXItPmlkICE9IEkyQ19BTEdPX1NBQTcxNDYpIHsKKwlpZiAoYWRhcHRlci0+aWQgIT0gSTJDX0hXX1NBQTcxNDYpIHsKIAkJZHByaW50aygicmVmdXNpbmcgdG8gcHJvYmUgb24gdW5rbm93biBhZGFwdGVyIFtuYW1lPSclcycsaWQ9MHgleF1cbiIsIGFkYXB0ZXItPm5hbWUsIGFkYXB0ZXItPmlkKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMjMxLDcgKzIzMSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0gewotCUkyQ19ERVZOQU1FKCJ0ZGE5ODQwIiksCisJLm5hbWUgPSAidGRhOTg0MCIsCiAJLmRyaXZlciA9ICZkcml2ZXIsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NzUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCmluZGV4IDU2NmUxYTUuLjdlM2RjZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAlpZiAoYWRhcC0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQogCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHRkYTk4NzVfYXR0YWNoKTsKICNlbHNlCi0JaWYgKGFkYXAtPmlkID09IChJMkNfQUxHT19CSVQgfCBJMkNfSFdfQl9CVDg0OCkpCisJaWYgKGFkYXAtPmlkID09IEkyQ19IV19CX0JUODQ4KQogCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHRkYTk4NzVfYXR0YWNoKTsKICNlbmRpZgogCXJldHVybiAwOwpAQCAtMzg0LDcgKzM4NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQogewotICAgICAgICBJMkNfREVWTkFNRSgidGRhOTg3NSIpLAorICAgICAgICAubmFtZSAgICAgID0gInRkYTk4NzUiLAogICAgICAgICAuZHJpdmVyICAgID0gJmRyaXZlciwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMKaW5kZXggMTA4YzNhZC4uMDQ1NmRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMKQEAgLTIzLDYgKzIzLDcgQEAKICAgICAgIFREQTk4ODcgKHdvcmxkKSwgVERBOTg4NSAoVVNBKQogICAgICAgTm90ZTogT1AyIG9mIHRkYTk4OHggbXVzdCBiZSBzZXQgdG8gMSwgZWxzZSBNVDIwMzIgaXMgZGlzYWJsZWQhCiAgICAtIEtOQyBPbmUgVFYtU3RhdGlvbiBSRFMgKHNhYTcxMzQpCisgICAtIEhhdXBwYXVnZSBQVlItMTUwLzUwMCAocG9zc2libHkgbW9yZSkKICovCiAKIApAQCAtNDksNyArNTAsNyBAQAogc3RydWN0IHRkYTk4ODcgewogCXN0cnVjdCBpMmNfY2xpZW50ICBjbGllbnQ7CiAJdjRsMl9zdGRfaWQgICAgICAgIHN0ZDsKLQl1bnNpZ25lZCBpbnQgICAgICAgcmFkaW87CisJZW51bSB0dW5lcl9tb2RlICAgIG1vZGU7CiAJdW5zaWduZWQgaW50ICAgICAgIGNvbmZpZzsKIAl1bnNpZ25lZCBpbnQgICAgICAgcGlubmFjbGVfaWQ7CiAJdW5zaWduZWQgaW50ICAgICAgIHVzaW5nX3Y0bDI7CkBAIC0xOTYsNyArMTk3LDcgQEAKIAkJLmIgICAgID0gKCBjTmVnYXRpdmVGbVRWICB8CiAJCQkgICBjUVNTICAgICAgICAgICApLAogCQkuYyAgICAgPSAoIGNEZWVtcGhhc2lzT04gIHwKLQkJCSAgIGNEZWVtcGhhc2lzNTAgICksCisJCQkgICBjRGVlbXBoYXNpczc1ICApLAogCQkuZSAgICAgPSAoIGNHYXRpbmdfMzYgICAgIHwKIAkJCSAgIGNBdWRpb0lGXzRfNSAgIHwKIAkJCSAgIGNWaWRlb0lGXzQ1Xzc1ICksCkBAIC0zNjQsNyArMzY1LDcgQEAKIAlzdHJ1Y3QgdHZub3JtICpub3JtID0gTlVMTDsKIAlpbnQgaTsKIAotCWlmICh0LT5yYWRpbykgeworCWlmICh0LT5tb2RlID09IFRfUkFESU8pIHsKIAkJaWYgKHQtPnJhZGlvX21vZGUgPT0gVjRMMl9UVU5FUl9NT0RFX01PTk8pCiAJCQlub3JtID0gJnJhZGlvX21vbm87CiAJCWVsc2UKQEAgLTM3OCw3ICszNzksNyBAQAogCQl9CiAJfQogCWlmIChOVUxMID09IG5vcm0pIHsKLQkJZHByaW50ayhQUkVGSVggIk9vcHM6IG5vIHR2bm9ybSBlbnRyeSBmb3VuZFxuIik7CisJCWRwcmludGsoUFJFRklYICJVbnN1cHBvcnRlZCB0dm5vcm0gZW50cnkgLSBhdWRpbyBtdXRlZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTUxOSw2ICs1MjAsMTIgQEAKIAkJCWRwcmludGsoUFJFRklYICJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtREtcbiIpOwogCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX0RLOwogCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKFBSRUZJWCAicGFsPSBhcmd1bWVudCBub3QgcmVjb2duaXNlZFxuIik7CisJCQlicmVhazsKIAkJfQogCX0KIAlpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX1NFQ0FNKSA9PSBWNEwyX1NURF9TRUNBTSkgewpAQCAtNTM1LDYgKzU0MiwxMiBAQAogCQkJZHByaW50ayhQUkVGSVggImluc21vZCBmaXh1cDogU0VDQU0gPT4gU0VDQU0tTFxuIik7CiAJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9MOwogCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKFBSRUZJWCAic2VjYW09IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtNTY5LDYgKzU4MiwxMCBAQAogCXRkYTk4ODdfc2V0X2NvbmZpZyh0LGJ1Zik7CiAJdGRhOTg4N19zZXRfaW5zbW9kKHQsYnVmKTsKIAorCWlmICh0LT5tb2RlID09IFRfU1RBTkRCWSkgeworCQlidWZbMV0gfD0gY0ZvcmNlZE11dGVBdWRpb09OOworCX0KKwogCiAJZHByaW50ayhQUkVGSVggIndyaXRpbmc6IGI9MHglMDJ4IGM9MHglMDJ4IGU9MHglMDJ4XG4iLAogCQlidWZbMV0sYnVmWzJdLGJ1ZlszXSk7CkBAIC02MTgsOSArNjM1LDkgQEAKIAkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCB0ZGE5ODg3X2F0dGFjaCk7CiAjZWxzZQogCXN3aXRjaCAoYWRhcC0+aWQpIHsKLQljYXNlIEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0JUODQ4OgotCWNhc2UgSTJDX0FMR09fQklUIHwgSTJDX0hXX0JfUklWQToKLQljYXNlIEkyQ19BTEdPX1NBQTcxMzQ6CisJY2FzZSBJMkNfSFdfQl9CVDg0ODoKKwljYXNlIEkyQ19IV19CX1JJVkE6CisJY2FzZSBJMkNfSFdfU0FBNzEzNDoKIAkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCB0ZGE5ODg3X2F0dGFjaCk7CiAJCWJyZWFrOwogCX0KQEAgLTY1MywxMCArNjcwLDE3IEBACiAKIAkvKiAtLS0gY29uZmlndXJhdGlvbiAtLS0gKi8KIAljYXNlIEFVRENfU0VUX1JBRElPOgotCQl0LT5yYWRpbyA9IDE7CisJeworCQl0LT5tb2RlID0gVF9SQURJTzsKIAkJdGRhOTg4N19jb25maWd1cmUodCk7CiAJCWJyZWFrOwotCisJfQorCWNhc2UgVFVORVJfU0VUX1NUQU5EQlk6CisJeworCQl0LT5tb2RlID0gVF9TVEFOREJZOworCQl0ZGE5ODg3X2NvbmZpZ3VyZSh0KTsKKwkJYnJlYWs7CisJfQogCWNhc2UgQVVEQ19DT05GSUdfUElOTkFDTEU6CiAJewogCQlpbnQgKmkgPSBhcmc7CkBAIC02ODksNyArNzEzLDcgQEAKIAkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnZjID0gYXJnOwogCiAJCUNIRUNLX1Y0TDI7Ci0JCXQtPnJhZGlvID0gMDsKKwkJdC0+bW9kZSA9IFRfQU5BTE9HX1RWOwogCQlpZiAodmMtPm5vcm0gPCBBUlJBWV9TSVpFKG1hcCkpCiAJCQl0LT5zdGQgPSBtYXBbdmMtPm5vcm1dOwogCQl0ZGE5ODg3X2ZpeHVwX3N0ZCh0KTsKQEAgLTcwMSw3ICs3MjUsNyBAQAogCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CiAKIAkJU1dJVENIX1Y0TDI7Ci0JCXQtPnJhZGlvID0gMDsKKwkJdC0+bW9kZSA9IFRfQU5BTE9HX1RWOwogCQl0LT5zdGQgICA9ICppZDsKIAkJdGRhOTg4N19maXh1cF9zdGQodCk7CiAJCXRkYTk4ODdfY29uZmlndXJlKHQpOwpAQCAtNzEzLDE0ICs3MzcsMTQgQEAKIAogCQlTV0lUQ0hfVjRMMjsKIAkJaWYgKFY0TDJfVFVORVJfQU5BTE9HX1RWID09IGYtPnR5cGUpIHsKLQkJCWlmICh0LT5yYWRpbyA9PSAwKQorCQkJaWYgKHQtPm1vZGUgPT0gVF9BTkFMT0dfVFYpCiAJCQkJcmV0dXJuIDA7Ci0JCQl0LT5yYWRpbyA9IDA7CisJCQl0LT5tb2RlID0gVF9BTkFMT0dfVFY7CiAJCX0KIAkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gZi0+dHlwZSkgewotCQkJaWYgKHQtPnJhZGlvID09IDEpCisJCQlpZiAodC0+bW9kZSA9PSBUX1JBRElPKQogCQkJCXJldHVybiAwOwotCQkJdC0+cmFkaW8gPSAxOworCQkJdC0+bW9kZSA9IFRfUkFESU87CiAJCX0KIAkJdGRhOTg4N19jb25maWd1cmUodCk7CiAJCWJyZWFrOwpAQCAtNzM1LDcgKzc1OSw3IEBACiAJCX07CiAJCXN0cnVjdCB2NGwyX3R1bmVyKiB0dW5lciA9IGFyZzsKIAotCQlpZiAodC0+cmFkaW8pIHsKKwkJaWYgKHQtPm1vZGUgPT0gVF9SQURJTykgewogCQkJX191OCByZWcgPSAwOwogCQkJdHVuZXItPmFmYz0wOwogCQkJaWYgKDEgPT0gaTJjX21hc3Rlcl9yZWN2KCZ0LT5jbGllbnQsJnJlZywxKSkKQEAgLTc0Nyw3ICs3NzEsNyBAQAogCXsKIAkJc3RydWN0IHY0bDJfdHVuZXIqIHR1bmVyID0gYXJnOwogCi0JCWlmICh0LT5yYWRpbykgeworCQlpZiAodC0+bW9kZSA9PSBUX1JBRElPKSB7CiAJCQl0LT5yYWRpb19tb2RlID0gdHVuZXItPmF1ZG1vZGU7CiAJCQl0ZGE5ODg3X2NvbmZpZ3VyZSAodCk7CiAJCX0KQEAgLTc2MCw3ICs3ODQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRkYTk4ODdfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICogZGV2LCB1MzIgc3RhdGUsIHUzMiBsZXZlbCkKK3N0YXRpYyBpbnQgdGRhOTg4N19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKQogewogCWRwcmludGsoInRkYTk4ODc6IHN1c3BlbmRcbiIpOwogCXJldHVybiAwOwpAQCAtNzkzLDcgKzgxNyw3IEBACiB9Owogc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9CiB7Ci0JSTJDX0RFVk5BTUUoInRkYTk4ODciKSwKKwkubmFtZSAgICAgID0gInRkYTk4ODciLAogCS5mbGFncyAgICAgPSBJMkNfQ0xJRU5UX0FMTE9XX1VTRSwKICAgICAgICAgLmRyaXZlciAgICA9ICZkcml2ZXIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZWE1NzY3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYwppbmRleCBjZWJjYzFmLi4zOGJmNTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYwpAQCAtMiw3ICsyLDYgQEAKICAqIEZvciBQaGlsaXBzIFRFQTU3NjcgRk0gQ2hpcCB1c2VkIG9uIHNvbWUgVFYgQ2FyZHMgbGlrZSBQcm9saW5rIFBpeGVsdmlldwogICogSTJDIGFkZHJlc3MgaXMgYWxsd2F5cyAweEMwLgogICoKLSAqICRJZDogdGVhNTc2Ny5jLHYgMS4yNyAyMDA1LzA3LzMxIDEyOjEwOjU2IG1jaGVoYWIgRXhwICQKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIChtY2hlaGFiQGJydHVyYm8uY29tLmJyKQogICogVGhpcyBjb2RlIGlzIHBsYWNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0yMDUsMTEgKzIwNCw2IEBACiAJCSAgICBURUE1NzY3X1NUX05PSVNFX0NUTCB8IFRFQTU3NjdfSkFQQU5fQkFORDsKIAlidWZmZXJbNF0gPSAwOwogCi0JaWYgKHQtPm1vZGUgPT0gVF9TVEFOREJZKSB7Ci0JCXR1bmVyX2RiZygiVEVBNTc2NyBzZXQgdG8gc3RhbmRieSBtb2RlXG4iKTsKLQkJYnVmZmVyWzNdIHw9IFRFQTU3NjdfU1REQlk7Ci0JfQotCiAJaWYgKHQtPmF1ZG1vZGUgPT0gVjRMMl9UVU5FUl9NT0RFX01PTk8pIHsKIAkJdHVuZXJfZGJnKCJURUE1NzY3IHNldCB0byBtb25vXG4iKTsKIAkJYnVmZmVyWzJdIHw9IFRFQTU3NjdfTU9OTzsKQEAgLTI5MCwxMyArMjg0LDMxIEBACiAJcmV0dXJuICgoYnVmZmVyWzJdICYgVEVBNTc2N19TVEVSRU9fTUFTSykgPyBWNEwyX1RVTkVSX1NVQl9TVEVSRU8gOiAwKTsKIH0KIAorc3RhdGljIHZvaWQgdGVhNTc2N19zdGFuZGJ5KHN0cnVjdCBpMmNfY2xpZW50ICpjKQoreworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzVdOworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwl1bnNpZ25lZCBkaXYsIHJjOworCisJZGl2ID0gKDg3NTAwICogNCArIDcwMCArIDIyNSArIDI1KSAvIDUwOyAvKiBTZXQgZnJlcXVlbmN5IHRvIDg3LjUgTUh6ICovCisJYnVmZmVyWzBdID0gKGRpdiA+PiA4KSAmIDB4M2Y7CisJYnVmZmVyWzFdID0gZGl2ICYgMHhmZjsKKwlidWZmZXJbMl0gPSBURUE1NzY3X1BPUlQxX0hJR0g7CisJYnVmZmVyWzNdID0gVEVBNTc2N19QT1JUMl9ISUdIIHwgVEVBNTc2N19ISUdIX0NVVF9DVFJMIHwKKwkJICAgIFRFQTU3NjdfU1RfTk9JU0VfQ1RMIHwgVEVBNTc2N19KQVBBTl9CQU5EIHwgVEVBNTc2N19TVERCWTsKKwlidWZmZXJbNF0gPSAwOworCisJaWYgKDUgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGMsIGJ1ZmZlciwgNSkpKQorCQl0dW5lcl93YXJuKCJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDUpXG4iLCByYyk7Cit9CisKIGludCB0ZWE1NzY3X2F1dG9kZXRlY3Rpb24oc3RydWN0IGkyY19jbGllbnQgKmMpCiB7CiAJdW5zaWduZWQgY2hhciBidWZmZXJbN10gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKIAlpbnQgcmM7CiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwogCi0JaWYgKDcgIT0gKHJjID0gaTJjX21hc3Rlcl9yZWN2KGMsIGJ1ZmZlciwgNykpKSB7CisJaWYgKChyYyA9IGkyY19tYXN0ZXJfcmVjdihjLCBidWZmZXIsIDcpKTwgNSkgewogCQl0dW5lcl93YXJuKCJJdCBpcyBub3QgYSBURUE1NzY3LiBSZWNlaXZlZCAlaSBieXRlcy5cbiIsIHJjKTsKIAkJcmV0dXJuIEVJTlZBTDsKIAl9CkBAIC0zMTMsMTUgKzMyNSwxMCBAQAogCSAqICAgICAgICAgIGJpdCAwICAgOiBpbnRlcm5hbGx5IHNldCB0byAwCiAJICogIEJ5dGUgNTogYml0IDc6MCA6ID09IDAKIAkgKi8KLQlpZiAoISgoYnVmZmVyWzNdICYgMHgwZikgPT0gMHgwMCkgJiYgKGJ1ZmZlcls0XSA9PSAweDAwKSkgeworCWlmICgoKGJ1ZmZlclszXSAmIDB4MGYpICE9IDB4MDApIHx8IChidWZmZXJbNF0gIT0gMHgwMCkpIHsKIAkJdHVuZXJfd2FybigiQ2hpcCBJRCBpcyBub3QgemVyby4gSXQgaXMgbm90IGEgVEVBNTc2N1xuIik7CiAJCXJldHVybiBFSU5WQUw7CiAJfQotCS8qIEl0IHNlZW1zIHRoYXQgdGVhNTc2NyByZXR1cm5zIDB4ZmYgYWZ0ZXIgdGhlIDV0aCBieXRlICovCi0JaWYgKChidWZmZXJbNV0gIT0gMHhmZikgfHwgKGJ1ZmZlcls2XSAhPSAweGZmKSkgewotCQl0dW5lcl93YXJuKCJSZXR1cm5lZCBtb3JlIHRoYW4gNSBieXRlcy4gSXQgaXMgbm90IGEgVEVBNTc2N1xuIik7Ci0JCXJldHVybiBFSU5WQUw7Ci0JfQogCiAJLyogSXQgc2VlbXMgdGhhdCB0ZWE1NzY3IHJldHVybnMgMHhmZiBhZnRlciB0aGUgNXRoIGJ5dGUgKi8KIAlpZiAoKGJ1ZmZlcls1XSAhPSAweGZmKSB8fCAoYnVmZmVyWzZdICE9IDB4ZmYpKSB7CkBAIC0zMzcsMTQgKzM0NCwxNCBAQAogewogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKIAotCXR1bmVyX2luZm8oInR5cGUgc2V0IHRvICVkICglcylcbiIsIHQtPnR5cGUsCi0JCQkiUGhpbGlwcyBURUE1NzY3SE4gRk0gUmFkaW8iKTsKKwl0dW5lcl9pbmZvKCJ0eXBlIHNldCB0byAlZCAoJXMpXG4iLCB0LT50eXBlLCAiUGhpbGlwcyBURUE1NzY3SE4gRk0gUmFkaW8iKTsKIAlzdHJsY3B5KGMtPm5hbWUsICJ0ZWE1NzY3Iiwgc2l6ZW9mKGMtPm5hbWUpKTsKIAogCXQtPnR2X2ZyZXEgPSBzZXRfdHZfZnJlcTsKIAl0LT5yYWRpb19mcmVxID0gc2V0X3JhZGlvX2ZyZXE7CiAJdC0+aGFzX3NpZ25hbCA9IHRlYTU3Njdfc2lnbmFsOwogCXQtPmlzX3N0ZXJlbyA9IHRlYTU3Njdfc3RlcmVvOworCXQtPnN0YW5kYnkgPSB0ZWE1NzY3X3N0YW5kYnk7CiAKIAlyZXR1cm4gKDApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZWE2NDE1Yy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZWE2NDE1Yy5jCmluZGV4IGI0NGRiOGEuLmVlMzY4ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNjQxNWMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MTVjLmMKQEAgLTg2LDcgKzg2LDcgQEAKIHN0YXRpYyBpbnQgYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAkvKiBsZXQncyBzZWUgd2hldGhlciB0aGlzIGlzIGEga25vdyBhZGFwdGVyIHdlIGNhbiBhdHRhY2ggdG8gKi8KLQlpZiAoYWRhcHRlci0+aWQgIT0gSTJDX0FMR09fU0FBNzE0NikgeworCWlmIChhZGFwdGVyLT5pZCAhPSBJMkNfSFdfU0FBNzE0NikgewogCQlkcHJpbnRrKCJyZWZ1c2luZyB0byBwcm9iZSBvbiB1bmtub3duIGFkYXB0ZXIgW25hbWU9JyVzJyxpZD0weCV4XVxuIiwgYWRhcHRlci0+bmFtZSwgYWRhcHRlci0+aWQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0yMDAsNyArMjAwLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7Ci0JSTJDX0RFVk5BTUUoInRlYTY0MTVjIiksCisJLm5hbWUgPSAidGVhNjQxNWMiLAogCS5kcml2ZXIgPSAmZHJpdmVyLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZWE2NDIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuYwppbmRleCA0OGQ0ZGI3Li4xNzk3NWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiBzdGF0aWMgaW50IGF0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJLyogbGV0J3Mgc2VlIHdoZXRoZXIgdGhpcyBpcyBhIGtub3cgYWRhcHRlciB3ZSBjYW4gYXR0YWNoIHRvICovCi0JaWYgKGFkYXB0ZXItPmlkICE9IEkyQ19BTEdPX1NBQTcxNDYpIHsKKwlpZiAoYWRhcHRlci0+aWQgIT0gSTJDX0hXX1NBQTcxNDYpIHsKIAkJZHByaW50aygicmVmdXNpbmcgdG8gcHJvYmUgb24gdW5rbm93biBhZGFwdGVyIFtuYW1lPSclcycsaWQ9MHgleF1cbiIsIGFkYXB0ZXItPm5hbWUsIGFkYXB0ZXItPmlkKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMTc3LDcgKzE3Nyw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0gewotCUkyQ19ERVZOQU1FKCJ0ZWE2NDIwIiksCisJLm5hbWUgPSAidGVhNjQyMCIsCiAJLmRyaXZlciA9ICZkcml2ZXIsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLTMwMzYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jCmluZGV4IDdkODI1ZTUuLjc5MjAzNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jCkBAIC00MSw3ICs0MSw2IEBACiAJLm5vcm1hbF9pMmMJPSBub3JtYWxfaTJjLAogCS5wcm9iZQkJPSAmaWdub3JlLAogCS5pZ25vcmUJCT0gJmlnbm9yZSwKLQkuZm9yY2UJCT0gJmlnbm9yZSwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE2Niw3ICsxNjUsNyBAQAogdHVuZXJfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQogewogCXRoaXNfYWRhcCA9IDA7Ci0JaWYgKGFkYXAtPmlkID09IChJMkNfQUxHT19CSVQgfCBJMkNfSFdfQl9MUCkpCisJaWYgKGFkYXAtPmlkID09IEkyQ19IV19CX0xQKQogCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHR1bmVyX2F0dGFjaCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IGYwYTU3OTguLjA1NTcyMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogdHVuZXItY29yZS5jLHYgMS42MyAyMDA1LzA3LzI4IDE4OjE5OjU1IG1jaGVoYWIgRXhwICQKICAqCiAgKiBpMmMgdHYgdHVuZXIgY2hpcCBkZXZpY2UgZHJpdmVyCiAgKiBjb3JlIGNvcmUsIGkuZS4ga2VybmVsIGludGVyZmFjZXMsIHJlZ2lzdGVyaW5nIGFuZCBzbyBvbgpAQCAtMTgyLDYgKzE4MSwxNCBAQAogCQlpMmNfbWFzdGVyX3NlbmQoYywgYnVmZmVyLCA0KTsKIAkJZGVmYXVsdF90dW5lcl9pbml0KGMpOwogCQlicmVhazsKKwljYXNlIFRVTkVSX0xHX1REVlNfSDA2MkY6CisJCS8qIFNldCB0aGUgQXV4aWxpYXJ5IEJ5dGUuICovCisJCWJ1ZmZlclsyXSAmPSB+MHgyMDsKKwkJYnVmZmVyWzJdIHw9IDB4MTg7CisJCWJ1ZmZlclszXSA9IDB4MjA7CisJCWkyY19tYXN0ZXJfc2VuZChjLCBidWZmZXIsIDQpOworCQlkZWZhdWx0X3R1bmVyX2luaXQoYyk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRlZmF1bHRfdHVuZXJfaW5pdChjKTsKIAkJYnJlYWs7CkBAIC0yMDgsMzEgKzIxNSwzMSBAQAogewogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKIAotCWlmICh0dW5fc2V0dXAtPmFkZHIgPT0gQUREUl9VTlNFVCkgewotCQlpZiAodC0+bW9kZV9tYXNrICYgdHVuX3NldHVwLT5tb2RlX21hc2spCisJaWYgKCh0dW5fc2V0dXAtPmFkZHIgPT0gQUREUl9VTlNFVCAmJgorCQkodC0+bW9kZV9tYXNrICYgdHVuX3NldHVwLT5tb2RlX21hc2spKSB8fAorCQl0dW5fc2V0dXAtPmFkZHIgPT0gYy0+YWRkcikgewogCQkJc2V0X3R5cGUoYywgdHVuX3NldHVwLT50eXBlLCB0dW5fc2V0dXAtPm1vZGVfbWFzayk7Ci0JfSBlbHNlIGlmICh0dW5fc2V0dXAtPmFkZHIgPT0gYy0+YWRkcikgewotCQlzZXRfdHlwZShjLCB0dW5fc2V0dXAtPnR5cGUsIHR1bl9zZXR1cC0+bW9kZV9tYXNrKTsKIAl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX21vZGUoc3RydWN0IHR1bmVyICp0LCBjaGFyICpjbWQpCiB7Ci0JaWYgKDEgPDwgdC0+bW9kZSAmIHQtPm1vZGVfbWFzaykgewotCQlzd2l0Y2ggKHQtPm1vZGUpIHsKLQkJY2FzZSBWNEwyX1RVTkVSX1JBRElPOgotCQkJdHVuZXJfZGJnKCJDbWQgJXMgYWNjZXB0ZWQgZm9yIHJhZGlvXG4iLCBjbWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9UVU5FUl9BTkFMT0dfVFY6Ci0JCQl0dW5lcl9kYmcoIkNtZCAlcyBhY2NlcHRlZCBmb3IgYW5hbG9nIFRWXG4iLCBjbWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9UVU5FUl9ESUdJVEFMX1RWOgotCQkJdHVuZXJfZGJnKCJDbWQgJXMgYWNjZXB0ZWQgZm9yIGRpZ2l0YWwgVFZcbiIsIGNtZCk7Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gMDsKKwlpZiAoKDEgPDwgdC0+bW9kZSAmIHQtPm1vZGVfbWFzaykgPT0gMCkgeworCQlyZXR1cm4gRUlOVkFMOwogCX0KLQlyZXR1cm4gRUlOVkFMOworCisJc3dpdGNoICh0LT5tb2RlKSB7CisJY2FzZSBWNEwyX1RVTkVSX1JBRElPOgorCQl0dW5lcl9kYmcoIkNtZCAlcyBhY2NlcHRlZCBmb3IgcmFkaW9cbiIsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9BTkFMT0dfVFY6CisJCXR1bmVyX2RiZygiQ21kICVzIGFjY2VwdGVkIGZvciBhbmFsb2cgVFZcbiIsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9ESUdJVEFMX1RWOgorCQl0dW5lcl9kYmcoIkNtZCAlcyBhY2NlcHRlZCBmb3IgZGlnaXRhbCBUVlxuIiwgY21kKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgY2hhciBwYWxbXSA9ICItIjsKQEAgLTI3NCw2ICsyODEsMTIgQEAKIAkJCXR1bmVyX2RiZyAoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1OXG4iKTsKIAkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9OOwogCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdHVuZXJfd2FybiAoInBhbD0gYXJndW1lbnQgbm90IHJlY29nbmlzZWRcbiIpOworCQkJYnJlYWs7CiAJCX0KIAl9CiAJaWYgKCh0LT5zdGQgJiBWNEwyX1NURF9TRUNBTSkgPT0gVjRMMl9TVERfU0VDQU0pIHsKQEAgLTI5MCw2ICszMDMsMTIgQEAKIAkJCXR1bmVyX2RiZyAoImluc21vZCBmaXh1cDogU0VDQU0gPT4gU0VDQU0tTFxuIik7CiAJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9MOwogCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdHVuZXJfd2FybiAoInNlY2FtPSBhcmd1bWVudCBub3QgcmVjb2duaXNlZFxuIik7CisJCQlicmVhazsKIAkJfQogCX0KIApAQCAtNDA2LDIwICs0MjUsMTggQEAKIAogc3RhdGljIGlubGluZSBpbnQgc2V0X21vZGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHR1bmVyICp0LCBpbnQgbW9kZSwgY2hhciAqY21kKQogewotCWlmIChtb2RlICE9IHQtPm1vZGUpIHsKKyAJaWYgKG1vZGUgPT0gdC0+bW9kZSkKKyAJCXJldHVybiAwOwogCi0JCXQtPm1vZGUgPSBtb2RlOwotCQlpZiAoY2hlY2tfbW9kZSh0LCBjbWQpID09IEVJTlZBTCkgewotCQkJdC0+bW9kZSA9IFRfU1RBTkRCWTsKLQkJCWlmIChWNEwyX1RVTkVSX1JBRElPID09IG1vZGUpIHsKLQkJCQlzZXRfdHZfZnJlcShjbGllbnQsIDQwMCAqIDE2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0X3JhZGlvX2ZyZXEoY2xpZW50LCA4Ny41ICogMTYwMDApOwotCQkJfQotCQkJcmV0dXJuIEVJTlZBTDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAJdC0+bW9kZSA9IG1vZGU7CisKKyAJaWYgKGNoZWNrX21vZGUodCwgY21kKSA9PSBFSU5WQUwpIHsKKyAJCXQtPm1vZGUgPSBUX1NUQU5EQlk7CisgCQlpZiAodC0+c3RhbmRieSkKKyAJCQl0LT5zdGFuZGJ5IChjbGllbnQpOworIAkJcmV0dXJuIEVJTlZBTDsKKyAgCX0KKyAgCXJldHVybiAwOwogfQogCiAjZGVmaW5lIHN3aXRjaF92NGwyKCkJaWYgKCF0LT51c2luZ192NGwyKSBcCkBAIC00NTMsNiArNDcwLDE0IEBACiAJY2FzZSBBVURDX1NFVF9SQURJTzoKIAkJc2V0X21vZGUoY2xpZW50LHQsVjRMMl9UVU5FUl9SQURJTywgIkFVRENfU0VUX1JBRElPIik7CiAJCWJyZWFrOworCWNhc2UgVFVORVJfU0VUX1NUQU5EQlk6CisJCXsKKwkJCWlmIChjaGVja19tb2RlKHQsICJUVU5FUl9TRVRfU1RBTkRCWSIpID09IEVJTlZBTCkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmICh0LT5zdGFuZGJ5KQorCQkJCXQtPnN0YW5kYnkgKGNsaWVudCk7CisJCQlicmVhazsKKwkJfQogCWNhc2UgQVVEQ19DT05GSUdfUElOTkFDTEU6CiAJCWlmIChjaGVja19tb2RlKHQsICJBVURDX0NPTkZJR19QSU5OQUNMRSIpID09IEVJTlZBTCkKIAkJCXJldHVybiAwOwpAQCAtNjcyLDcgKzY5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdHVuZXJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBzdGF0ZSwgdTMyIGxldmVsKQorc3RhdGljIGludCB0dW5lcl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCB1MzIgbGV2ZWwpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmMgPSBjb250YWluZXJfb2YgKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7CiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhIChjKTsKQEAgLTcwOSw3ICs3MzQsNyBAQAogCQkgICB9LAogfTsKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7Ci0JSTJDX0RFVk5BTUUoIih0dW5lciB1bnNldCkiKSwKKwkubmFtZSA9ICIodHVuZXIgdW5zZXQpIiwKIAkuZmxhZ3MgPSBJMkNfQ0xJRU5UX0FMTE9XX1VTRSwKIAkuZHJpdmVyID0gJmRyaXZlciwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYwppbmRleCBkZTBjOTNhLi44ZWRkNzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItc2ltcGxlLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiB0dW5lci1zaW1wbGUuYyx2IDEuNDMgMjAwNS8wNy8yOCAxODo0MToyMSBtY2hlaGFiIEV4cCAkCiAgKgogICogaTJjIHR2IHR1bmVyIGNoaXAgZGV2aWNlIGRyaXZlcgogICogY29udHJvbHMgYWxsIHRob3NlIHNpbXBsZSA0LWNvbnRyb2wtYnl0ZXMgc3R5bGUgdHVuZXJzLgpAQCAtMTAyLDYgKzEwMSw3IEBACiAgKgkibm8gZmxvYXQgaW4ga2VybmVsIiBydWxlLgogICovCiBzdGF0aWMgc3RydWN0IHR1bmVydHlwZSB0dW5lcnNbXSA9IHsKKwkvKiAwLTkgKi8KICAgICAgICAgeyAiVGVtaWMgUEFMICg0MDAyIEZINSkiLCBURU1JQywgUEFMLAogCSAgMTYqMTQwLjI1LDE2KjQ2My4yNSwweDAyLDB4MDQsMHgwMSwweDhlLDYyM30sCiAJeyAiUGhpbGlwcyBQQUxfSSAoRkkxMjQ2IGFuZCBjb21wYXRpYmxlcykiLCBQaGlsaXBzLCBQQUxfSSwKQEAgLTExMCw3ICsxMTAsNiBAQAogCSAgMTYqMTU3LjI1LDE2KjQ1MS4yNSwweEEwLDB4OTAsMHgzMCwweDhlLDczMn0sCiAJeyAiUGhpbGlwcyAoU0VDQU0rUEFMX0JHKSAoRkkxMjE2TUYsIEZNMTIxNk1GLCBGUjEyMTZNRikiLCBQaGlsaXBzLCBTRUNBTSwKIAkgIDE2KjE2OC4yNSwxNio0NDcuMjUsMHhBNywweDk3LDB4MzcsMHg4ZSw2MjN9LAotCiAJeyAiTm9UdW5lciIsIE5vVHVuZXIsIE5PVFVORVIsCiAJICAwLDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwKIAl7ICJQaGlsaXBzIFBBTF9CRyAoRkkxMjE2IGFuZCBjb21wYXRpYmxlcykiLCBQaGlsaXBzLCBQQUwsCkBAIC0xMTksMzQgKzExOCwzNCBAQAogCSAgMTYqMTU3LjI1LDE2KjQ2My4yNSwweDAyLDB4MDQsMHgwMSwweDhlLDczMn0sCiAJeyAiVGVtaWMgUEFMX0kgKDQwNjIgRlk1KSIsIFRFTUlDLCBQQUxfSSwKIAkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHgwMiwweDA0LDB4MDEsMHg4ZSw2MjN9LAotCiAgCXsgIlRlbWljIE5UU0MgKDQwMzYgRlk1KSIsIFRFTUlDLCBOVFNDLAogCSAgMTYqMTU3LjI1LDE2KjQ2My4yNSwweGEwLDB4OTAsMHgzMCwweDhlLDczMn0sCiAgICAgICAgIHsgIkFscHMgSFNCSDEiLCBURU1JQywgTlRTQywKIAkgIDE2KjEzNy4yNSwxNiozODUuMjUsMHgwMSwweDAyLDB4MDgsMHg4ZSw3MzJ9LAotICAgICAgICB7ICJBbHBzIFRTQkUxIixURU1JQyxQQUwsCisKKwkvKiAxMC0xOSAqLworICAgICAgICB7ICJBbHBzIFRTQkUxIiwgVEVNSUMsIFBBTCwKIAkgIDE2KjEzNy4yNSwxNiozODUuMjUsMHgwMSwweDAyLDB4MDgsMHg4ZSw3MzJ9LAogICAgICAgICB7ICJBbHBzIFRTQkI1IiwgQWxwcywgUEFMX0ksIC8qIHRlc3RlZCAoVUsgVUhGKSB3aXRoIE1vZHVsYXJ0ZWNoIE1NMjA1ICovCiAJICAxNioxMzMuMjUsMTYqMzUxLjI1LDB4MDEsMHgwMiwweDA4LDB4OGUsNjMyfSwKLQogICAgICAgICB7ICJBbHBzIFRTQkU1IiwgQWxwcywgUEFMLCAvKiB1bnRlc3RlZCAtIGRhdGEgc2hlZXQgZ3Vlc3MuIE9ubHkgSUYgZGlmZmVycy4gKi8KIAkgIDE2KjEzMy4yNSwxNiozNTEuMjUsMHgwMSwweDAyLDB4MDgsMHg4ZSw2MjJ9LAogICAgICAgICB7ICJBbHBzIFRTQkM1IiwgQWxwcywgUEFMLCAvKiB1bnRlc3RlZCAtIGRhdGEgc2hlZXQgZ3Vlc3MuIE9ubHkgSUYgZGlmZmVycy4gKi8KIAkgIDE2KjEzMy4yNSwxNiozNTEuMjUsMHgwMSwweDAyLDB4MDgsMHg4ZSw2MDh9LAogCXsgIlRlbWljIFBBTF9CRyAoNDAwNkZINSkiLCBURU1JQywgUEFMLAogCSAgMTYqMTcwLjAwLDE2KjQ1MC4wMCwweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCi0gIAl7ICJBbHBzIFRTQ0g2IixBbHBzLE5UU0MsCisgIAl7ICJBbHBzIFRTQ0g2IiwgQWxwcywgTlRTQywKICAgCSAgMTYqMTM3LjI1LDE2KjM4NS4yNSwweDE0LDB4MTIsMHgxMSwweDhlLDczMn0sCi0KLSAgCXsgIlRlbWljIFBBTF9ESyAoNDAxNiBGWTUpIixURU1JQyxQQUwsCisgIAl7ICJUZW1pYyBQQUxfREsgKDQwMTYgRlk1KSIsIFRFTUlDLCBQQUwsCiAgIAkgIDE2KjE2OC4yNSwxNio0NTYuMjUsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAotICAJeyAiUGhpbGlwcyBOVFNDX00gKE1LMikiLFBoaWxpcHMsTlRTQywKKyAgCXsgIlBoaWxpcHMgTlRTQ19NIChNSzIpIiwgUGhpbGlwcywgTlRTQywKICAgCSAgMTYqMTYwLjAwLDE2KjQ1NC4wMCwweGEwLDB4OTAsMHgzMCwweDhlLDczMn0sCiAgICAgICAgIHsgIlRlbWljIFBBTF9JICg0MDY2IEZZNSkiLCBURU1JQywgUEFMX0ksCiAgICAgICAgICAgMTYqMTY5LjAwLCAxNio0NTQuMDAsIDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKICAgICAgICAgeyAiVGVtaWMgUEFMKiBhdXRvICg0MDA2IEZONSkiLCBURU1JQywgUEFMLAogICAgICAgICAgIDE2KjE2OS4wMCwgMTYqNDU0LjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCiAKKwkvKiAyMC0yOSAqLwogICAgICAgICB7ICJUZW1pYyBQQUxfQkcgKDQwMDkgRlI1KSBvciBQQUxfSSAoNDA2OSBGUjUpIiwgVEVNSUMsIFBBTCwKICAgICAgICAgICAxNioxNDEuMDAsIDE2KjQ2NC4wMCwgMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAogICAgICAgICB7ICJUZW1pYyBOVFNDICg0MDM5IEZSNSkiLCBURU1JQywgTlRTQywKQEAgLTE1NSw3ICsxNTQsNiBAQAogICAgICAgICAgIDE2KjE2OS4wMCwgMTYqNDU0LjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCiAgICAgICAgIHsgIlBoaWxpcHMgUEFMX0RLIChGSTEyNTYgYW5kIGNvbXBhdGlibGVzKSIsIFBoaWxpcHMsIFBBTCwKIAkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAotCiAJeyAiUGhpbGlwcyBQQUwvU0VDQU0gbXVsdGkgKEZRMTIxNk1FKSIsIFBoaWxpcHMsIFBBTCwKIAkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAogCXsgIkxHIFBBTF9JK0ZNIChUQVBDLUkwMDFEKSIsIExHSU5OT1RFSywgUEFMX0ksCkBAIC0xNjQsMjUgKzE2MiwyNCBAQAogCSAgMTYqMTcwLjAwLDE2KjQ1MC4wMCwweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCiAJeyAiTEcgTlRTQytGTSAoVFBJOE5TUjAxRikiLCBMR0lOTk9URUssIE5UU0MsCiAJICAxNioyMTAuMDAsMTYqNDk3LjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNzMyfSwKLQogCXsgIkxHIFBBTF9CRytGTSAoVFBJOFBTQjAxRCkiLCBMR0lOTk9URUssIFBBTCwKIAkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAogCXsgIkxHIFBBTF9CRyAoVFBJOFBTQjExRCkiLCBMR0lOTk9URUssIFBBTCwKIAkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAorCisJLyogMzAtMzkgKi8KIAl7ICJUZW1pYyBQQUwqIGF1dG8gKyBGTSAoNDAwOSBGTjUpIiwgVEVNSUMsIFBBTCwKIAkgIDE2KjE0MS4wMCwgMTYqNDY0LjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCiAJeyAiU0hBUlAgTlRTQ19KUCAoMlU1SkY1NTQwKSIsIFNIQVJQLCBOVFNDLCAvKiA5NDA9MTYqNTguNzUgTlRTQ0BKYXBhbiAqLwogCSAgMTYqMTM3LjI1LDE2KjMxNy4yNSwweDAxLDB4MDIsMHgwOCwweDhlLDk0MCB9LAotCi0JeyAiU2Ftc3VuZyBQQUwgVENQTTkwOTFQRDI3IiwgU2Ftc3VuZywgUEFMLCAgLyogZnJvbSBzb3VyY2Vmb3JnZSB2M3R2ICovCisJeyAiU2Ftc3VuZyBQQUwgVENQTTkwOTFQRDI3IiwgU2Ftc3VuZywgUEFMLCAvKiBmcm9tIHNvdXJjZWZvcmdlIHYzdHYgKi8KICAgICAgICAgICAxNioxNjksMTYqNDY0LDB4QTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKLQl7ICJNVDIweHggdW5pdmVyc2FsIiwgTWljcm90dW5lLFBBTHxOVFNDLAorCXsgIk1UMjB4eCB1bml2ZXJzYWwiLCBNaWNyb3R1bmUsIFBBTHxOVFNDLAogCSAgLyogc2VlIG10MjB4eC5jIGZvciBkZXRhaWxzICovIH0sCiAJeyAiVGVtaWMgUEFMX0JHICg0MTA2IEZINSkiLCBURU1JQywgUEFMLAogICAgICAgICAgIDE2KjE0MS4wMCwgMTYqNDY0LjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCiAJeyAiVGVtaWMgUEFMX0RLL1NFQ0FNX0wgKDQwMTIgRlk1KSIsIFRFTUlDLCBQQUwsCiAgICAgICAgICAgMTYqMTQwLjI1LCAxNio0NjMuMjUsIDB4MDIsMHgwNCwweDAxLDB4OGUsNjIzfSwKLQogCXsgIlRlbWljIE5UU0MgKDQxMzYgRlk1KSIsIFRFTUlDLCBOVFNDLAogICAgICAgICAgIDE2KjE1OC4wMCwgMTYqNDUzLjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDczMn0sCiAgICAgICAgIHsgIkxHIFBBTCAobmV3ZXIgVEFQQyBzZXJpZXMpIiwgTEdJTk5PVEVLLCBQQUwsCkBAIC0xOTIsNDIgKzE4OSw0MSBAQAogCXsgIkxHIE5UU0MgKG5ld2VyIFRBUEMgc2VyaWVzKSIsIExHSU5OT1RFSywgTlRTQywKICAgICAgICAgICAxNioxNzAuMDAsIDE2KjQ1MC4wMCwgMHgwMSwweDAyLDB4MDgsMHg4ZSw3MzJ9LAogCisJLyogNDAtNDkgKi8KIAl7ICJISVRBQ0hJIFY3LUoxODBBVCIsIEhJVEFDSEksIE5UU0MsCiAJICAxNioxNzAuMDAsIDE2KjQ1MC4wMCwgMHgwMSwweDAyLDB4MDgsMHg4ZSw5NDAgfSwKIAl7ICJQaGlsaXBzIFBBTF9NSyAoRkkxMjE2IE1LKSIsIFBoaWxpcHMsIFBBTCwKIAkgIDE2KjE0MC4yNSwxNio0NjMuMjUsMHgwMSwweGMyLDB4Y2YsMHg4ZSw2MjN9LAotCXsgIlBoaWxpcHMgMTIzNkQgQVRTQy9OVFNDIGRhdWwgaW4iLFBoaWxpcHMsQVRTQywKKwl7ICJQaGlsaXBzIDEyMzZEIEFUU0MvTlRTQyBkYXVsIGluIiwgUGhpbGlwcywgQVRTQywKIAkgIDE2KjE1Ny4yNSwxNio0NTQuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw3MzJ9LAogICAgICAgICB7ICJQaGlsaXBzIE5UU0MgTUszIChGTTEyMzZNSzMgb3IgRk0xMjM2L0YpIiwgUGhpbGlwcywgTlRTQywKICAgICAgICAgICAxNioxNjAuMDAsMTYqNDQyLjAwLDB4MDEsMHgwMiwweDA0LDB4OGUsNzMyfSwKLQogICAgICAgICB7ICJQaGlsaXBzIDQgaW4gMSAoQVRJIFRWIFdvbmRlciBQcm8vQ29uZXhhbnQpIiwgUGhpbGlwcywgTlRTQywKICAgICAgICAgICAxNioxNjAuMDAsMTYqNDQyLjAwLDB4MDEsMHgwMiwweDA0LDB4OGUsNzMyfSwKLQl7ICJNaWNyb3R1bmUgNDA0OSBGTTUiLE1pY3JvdHVuZSxQQUwsCisJeyAiTWljcm90dW5lIDQwNDkgRk01IiwgTWljcm90dW5lLCBQQUwsCiAJICAxNioxNDEuMDAsMTYqNDY0LjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKIAl7ICJQYW5hc29uaWMgVlAyN3MvRU5HRTQzMjREIiwgUGFuYXNvbmljLCBOVFNDLAogCSAgMTYqMTYwLjAwLDE2KjQ1NC4wMCwweDAxLDB4MDIsMHgwOCwweGNlLDk0MH0sCiAgICAgICAgIHsgIkxHIE5UU0MgKFRBUEUgc2VyaWVzKSIsIExHSU5OT1RFSywgTlRTQywKICAgICAgICAgICAxNioxNjAuMDAsMTYqNDQyLjAwLDB4MDEsMHgwMiwweDA0LDB4OGUsNzMyIH0sCi0KICAgICAgICAgeyAiVGVubmEgVE5GIDg4MzEgQkdGRikiLCBQaGlsaXBzLCBQQUwsCiAgICAgICAgICAgMTYqMTYxLjI1LDE2KjQ2My4yNSwweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCiAJeyAiTWljcm90dW5lIDQwNDIgRkk1IEFUU0MvTlRTQyBkdWFsIGluIiwgTWljcm90dW5lLCBOVFNDLAogCSAgMTYqMTYyLjAwLDE2KjQ1Ny4wMCwweGEyLDB4OTQsMHgzMSwweDhlLDczMn0sCisKKwkvKiA1MC01OSAqLwogICAgICAgICB7ICJUQ0wgMjAwMk4iLCBUQ0wsIE5UU0MsCiAgICAgICAgICAgMTYqMTcyLjAwLDE2KjQ0OC4wMCwweDAxLDB4MDIsMHgwOCwweDhlLDczMn0sCiAJeyAiUGhpbGlwcyBQQUwvU0VDQU1fRCAoRk0gMTI1NiBJLUgzKSIsIFBoaWxpcHMsIFBBTCwKIAkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw2MjMgfSwKLQogCXsgIlRob21zb24gRERUIDc2MTAgKEFUU0MvTlRTQykiLCBUSE9NU09OLCBBVFNDLAogCSAgMTYqMTU3LjI1LDE2KjQ1NC4wMCwweDM5LDB4M2EsMHgzYywweDhlLDczMn0sCiAJeyAiUGhpbGlwcyBGUTEyODYiLCBQaGlsaXBzLCBOVFNDLAotCSAgMTYqMTYwLjAwLDE2KjQ1NC4wMCwweDQxLDB4NDIsMHgwNCwweDhlLDk0MH0sIC8vIFVIRiBiYW5kIHVudGVzdGVkCi0JeyAidGRhODI5MCs3NSIsIFBoaWxpcHMsUEFMfE5UU0MsCisJICAxNioxNjAuMDAsMTYqNDU0LjAwLDB4NDEsMHg0MiwweDA0LDB4OGUsOTQwfSwgLyogVUhGIGJhbmQgdW50ZXN0ZWQgKi8KKwl7ICJ0ZGE4MjkwKzc1IiwgUGhpbGlwcywgUEFMfE5UU0MsCiAJICAvKiBzZWUgdGRhODI5MC5jIGZvciBkZXRhaWxzICovIH0sCiAJeyAiTEcgUEFMIChUQVBFIHNlcmllcykiLCBMR0lOTk9URUssIFBBTCwKICAgICAgICAgICAxNioxNzAuMDAsIDE2KjQ1MC4wMCwgMHgwMSwweDAyLDB4MDgsMHhjZSw2MjN9LAotCiAJeyAiUGhpbGlwcyBQQUwvU0VDQU0gbXVsdGkgKEZRMTIxNkFNRSBNSzQpIiwgUGhpbGlwcywgUEFMLAogCSAgMTYqMTYwLjAwLDE2KjQ0Mi4wMCwweDAxLDB4MDIsMHgwNCwweGNlLDYyMyB9LAogCXsgIlBoaWxpcHMgRlExMjM2QSBNSzQiLCBQaGlsaXBzLCBOVFNDLApAQCAtMjM3LDYgKzIzMyw3IEBACiAJeyAiWW1lYyBUVmlzaW9uIFRWRi01NTMzTUYiLCBQaGlsaXBzLCBOVFNDLAogCSAgMTYqMTYwLjAwLDE2KjQ1NC4wMCwweDAxLDB4MDIsMHgwNCwweDhlLDczMn0sCiAKKwkvKiA2MC02NiAqLwogCXsgIlRob21zb24gRERUIDc2MTEgKEFUU0MvTlRTQykiLCBUSE9NU09OLCBBVFNDLAogCSAgMTYqMTU3LjI1LDE2KjQ1NC4wMCwweDM5LDB4M2EsMHgzYywweDhlLDczMn0sCiAJeyAiVGVuYSBUTkY5NTMzLUQvSUYvVE5GOTUzMy1CL0RGIiwgUGhpbGlwcywgUEFMLApAQCAtMjQ1LDEyICsyNDIsMTIgQEAKICAgICAgICAgICAvKiBzZWUgdGVhNTc2Ny5jIGZvciBkZXRhaWxzICovfSwKIAl7ICJQaGlsaXBzIEZNRDEyMTZNRSBNSzMgSHlicmlkIFR1bmVyIiwgUGhpbGlwcywgUEFMLAogCSAgMTYqMTYwLjAwLDE2KjQ0Mi4wMCwweDUxLDB4NTIsMHg1NCwweDg2LDYyMyB9LAotCi0JeyAiTEcgVERWUy1IMDYyRi9UVUE2MDM0IiwgTEdJTk5PVEVLLCBOVFNDLAorCXsgIkxHIFREVlMtSDA2MkYvVFVBNjAzNCIsIExHSU5OT1RFSywgQVRTQywKIAkgIDE2KjE2MC4wMCwxNio0NTUuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzJ9LAotCiAJeyAiWW1lYyBUVkY2NlQ1LUIvREZGIiwgUGhpbGlwcywgUEFMLAogICAgICAgICAgIDE2KjE2MC4yNSwxNio0NjQuMjUsMHgwMSwweDAyLDB4MDgsMHg4ZSw2MjN9LAorIAl7ICJMRyBOVFNDIChUQUxOIG1pbmkgc2VyaWVzKSIsIExHSU5OT1RFSywgTlRTQywKKwkgIDE2KjEzNy4yNSwxNiozNzMuMjUsMHgwMSwweDAyLDB4MDgsMHg4ZSw3MzIgfSwKIH07CiAKIHVuc2lnbmVkIGNvbnN0IGludCB0dW5lcl9jb3VudCA9IEFSUkFZX1NJWkUodHVuZXJzKTsKQEAgLTQ3MSw2ICs0NjgsMTAgQEAKIAljYXNlIFRVTkVSX0xHX1BBTF9GTToKIAkJYnVmZmVyWzNdID0gMHhhNTsKIAkJYnJlYWs7CisJY2FzZSBUVU5FUl9NSUNST1RVTkVfNDA0OUZNNToKKwkJZGl2ID0gKDIwICogZnJlcSkgLyAxNjAwMCArIChpbnQpKDMzLjMgKiAyMCk7IC8qIElGIDMzLjMgTUh6ICovCisJCWJ1ZmZlclszXSA9IDB4YTQ7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJ1ZmZlclszXSA9IDB4YTQ7CiAJCWJyZWFrOwpAQCAtNDk3LDYgKzQ5OCw3IEBACiAJdC0+cmFkaW9fZnJlcSA9IGRlZmF1bHRfc2V0X3JhZGlvX2ZyZXE7CiAJdC0+aGFzX3NpZ25hbCA9IHR1bmVyX3NpZ25hbDsKIAl0LT5pc19zdGVyZW8gID0gdHVuZXJfc3RlcmVvOworCXQtPnN0YW5kYnkgPSBOVUxMOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCmluZGV4IGY0MmExZWYuLjFjMzFlZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCkBAIC00Niw3ICs0NiwxNyBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAjZGVmaW5lIFVOU0VUICAgICgtMVUpCi0jZGVmaW5lIGRwcmludGsgIGlmIChkZWJ1ZykgcHJpbnRrCisKKyNkZWZpbmUgdHZhdWRpb19pbmZvKGZtdCwgYXJnLi4uKSBkbyB7XAorCXByaW50ayhLRVJOX0lORk8gInR2YXVkaW8gJWQtJTA0eDogIiBmbXQsIFwKKwkJCWNoaXAtPmMuYWRhcHRlci0+bnIsIGNoaXAtPmMuYWRkciAsICMjYXJnKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdHZhdWRpb193YXJuKGZtdCwgYXJnLi4uKSBkbyB7XAorCXByaW50ayhLRVJOX1dBUk5JTkcgInR2YXVkaW8gJWQtJTA0eDogIiBmbXQsIFwKKwkJCWNoaXAtPmMuYWRhcHRlci0+bnIsIGNoaXAtPmMuYWRkciAsICMjYXJnKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdHZhdWRpb19kYmcoZm10LCBhcmcuLi4pIGRvIHtcCisJaWYgKGRlYnVnKSBcCisJCXByaW50ayhLRVJOX0lORk8gInR2YXVkaW8gJWQtJTA0eDogIiBmbXQsIFwKKwkJCWNoaXAtPmMuYWRhcHRlci0+bnIsIGNoaXAtPmMuYWRkciAsICMjYXJnKTsgfSB3aGlsZSAoMCkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogb3VyIHN0cnVjdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTYyLDI0ICsxNzIsMjQgQEAKIAl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyXTsKIAogCWlmICgtMSA9PSBzdWJhZGRyKSB7Ci0JCWRwcmludGsoIiVzOiBjaGlwX3dyaXRlOiAweCV4XG4iLAotCQkJaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpLCB2YWwpOworCQl0dmF1ZGlvX2RiZygiJXM6IGNoaXBfd3JpdGU6IDB4JXhcbiIsCisJCQljaGlwLT5jLm5hbWUsIHZhbCk7CiAJCWNoaXAtPnNoYWRvdy5ieXRlc1sxXSA9IHZhbDsKIAkJYnVmZmVyWzBdID0gdmFsOwogCQlpZiAoMSAhPSBpMmNfbWFzdGVyX3NlbmQoJmNoaXAtPmMsYnVmZmVyLDEpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSS9PIGVycm9yICh3cml0ZSAweCV4KVxuIiwKLQkJCSAgICAgICBpMmNfY2xpZW50bmFtZSgmY2hpcC0+YyksIHZhbCk7CisJCQl0dmF1ZGlvX3dhcm4oIiVzOiBJL08gZXJyb3IgKHdyaXRlIDB4JXgpXG4iLAorCQkJCWNoaXAtPmMubmFtZSwgdmFsKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0gZWxzZSB7Ci0JCWRwcmludGsoIiVzOiBjaGlwX3dyaXRlOiByZWclZD0weCV4XG4iLAotCQkJaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpLCBzdWJhZGRyLCB2YWwpOworCQl0dmF1ZGlvX2RiZygiJXM6IGNoaXBfd3JpdGU6IHJlZyVkPTB4JXhcbiIsCisJCQljaGlwLT5jLm5hbWUsIHN1YmFkZHIsIHZhbCk7CiAJCWNoaXAtPnNoYWRvdy5ieXRlc1tzdWJhZGRyKzFdID0gdmFsOwogCQlidWZmZXJbMF0gPSBzdWJhZGRyOwogCQlidWZmZXJbMV0gPSB2YWw7CiAJCWlmICgyICE9IGkyY19tYXN0ZXJfc2VuZCgmY2hpcC0+YyxidWZmZXIsMikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJL08gZXJyb3IgKHdyaXRlIHJlZyVkPTB4JXgpXG4iLAotCQkJICAgICAgIGkyY19jbGllbnRuYW1lKCZjaGlwLT5jKSwgc3ViYWRkciwgdmFsKTsKKwkJCXR2YXVkaW9fd2FybigiJXM6IEkvTyBlcnJvciAod3JpdGUgcmVnJWQ9MHgleClcbiIsCisJCQkJCQljaGlwLT5jLm5hbWUsIHN1YmFkZHIsIHZhbCk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CkBAIC0yMDMsMzEgKzIxMywzMCBAQAogCXVuc2lnbmVkIGNoYXIgYnVmZmVyOwogCiAJaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KCZjaGlwLT5jLCZidWZmZXIsMSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEkvTyBlcnJvciAocmVhZClcbiIsCi0JCSAgICAgICBpMmNfY2xpZW50bmFtZSgmY2hpcC0+YykpOworCQl0dmF1ZGlvX3dhcm4oIiVzOiBJL08gZXJyb3IgKHJlYWQpXG4iLAorCQljaGlwLT5jLm5hbWUpOwogCQlyZXR1cm4gLTE7CiAJfQotCWRwcmludGsoIiVzOiBjaGlwX3JlYWQ6IDB4JXhcbiIsaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpLGJ1ZmZlcik7CisJdHZhdWRpb19kYmcoIiVzOiBjaGlwX3JlYWQ6IDB4JXhcbiIsY2hpcC0+Yy5uYW1lLGJ1ZmZlcik7CiAJcmV0dXJuIGJ1ZmZlcjsKIH0KIAogc3RhdGljIGludCBjaGlwX3JlYWQyKHN0cnVjdCBDSElQU1RBVEUgKmNoaXAsIGludCBzdWJhZGRyKQogewotICAgICAgICB1bnNpZ25lZCBjaGFyIHdyaXRlWzFdOwotICAgICAgICB1bnNpZ25lZCBjaGFyIHJlYWRbMV07Ci0gICAgICAgIHN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7Ci0gICAgICAgICAgICAgICAgeyBjaGlwLT5jLmFkZHIsIDAsICAgICAgICAxLCB3cml0ZSB9LAotICAgICAgICAgICAgICAgIHsgY2hpcC0+Yy5hZGRyLCBJMkNfTV9SRCwgMSwgcmVhZCAgfQotICAgICAgICB9OwotICAgICAgICB3cml0ZVswXSA9IHN1YmFkZHI7CisJdW5zaWduZWQgY2hhciB3cml0ZVsxXTsKKwl1bnNpZ25lZCBjaGFyIHJlYWRbMV07CisJc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHsKKwkJeyBjaGlwLT5jLmFkZHIsIDAsICAgICAgICAxLCB3cml0ZSB9LAorCQl7IGNoaXAtPmMuYWRkciwgSTJDX01fUkQsIDEsIHJlYWQgIH0KKwl9OworCXdyaXRlWzBdID0gc3ViYWRkcjsKIAogCWlmICgyICE9IGkyY190cmFuc2ZlcihjaGlwLT5jLmFkYXB0ZXIsbXNncywyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSS9PIGVycm9yIChyZWFkMilcbiIsCi0JCSAgICAgICBpMmNfY2xpZW50bmFtZSgmY2hpcC0+YykpOworCQl0dmF1ZGlvX3dhcm4oIiVzOiBJL08gZXJyb3IgKHJlYWQyKVxuIiwgY2hpcC0+Yy5uYW1lKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlkcHJpbnRrKCIlczogY2hpcF9yZWFkMjogcmVnJWQ9MHgleFxuIiwKLQkJaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpLHN1YmFkZHIscmVhZFswXSk7CisJdHZhdWRpb19kYmcoIiVzOiBjaGlwX3JlYWQyOiByZWclZD0weCV4XG4iLAorCQkJY2hpcC0+Yy5uYW1lLHN1YmFkZHIscmVhZFswXSk7CiAJcmV0dXJuIHJlYWRbMF07CiB9CiAKQEAgLTIzOSwxNyArMjQ4LDE5IEBACiAJCXJldHVybiAwOwogCiAJLyogdXBkYXRlIG91ciBzaGFkb3cgcmVnaXN0ZXIgc2V0OyBwcmludCBieXRlcyBpZiAoZGVidWcgPiAwKSAqLwotCWRwcmludGsoIiVzOiBjaGlwX2NtZCglcyk6IHJlZz0lZCwgZGF0YToiLAotCQlpMmNfY2xpZW50bmFtZSgmY2hpcC0+YyksbmFtZSxjbWQtPmJ5dGVzWzBdKTsKKwl0dmF1ZGlvX2RiZygiJXM6IGNoaXBfY21kKCVzKTogcmVnPSVkLCBkYXRhOiIsCisJCWNoaXAtPmMubmFtZSxuYW1lLGNtZC0+Ynl0ZXNbMF0pOwogCWZvciAoaSA9IDE7IGkgPCBjbWQtPmNvdW50OyBpKyspIHsKLQkJZHByaW50aygiIDB4JXgiLGNtZC0+Ynl0ZXNbaV0pOworCQlpZiAoZGVidWcpCisJCQlwcmludGsoIiAweCV4IixjbWQtPmJ5dGVzW2ldKTsKIAkJY2hpcC0+c2hhZG93LmJ5dGVzW2krY21kLT5ieXRlc1swXV0gPSBjbWQtPmJ5dGVzW2ldOwogCX0KLQlkcHJpbnRrKCJcbiIpOworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKCJcbiIpOwogCiAJLyogc2VuZCBkYXRhIHRvIHRoZSBjaGlwICovCiAJaWYgKGNtZC0+Y291bnQgIT0gaTJjX21hc3Rlcl9zZW5kKCZjaGlwLT5jLGNtZC0+Ynl0ZXMsY21kLT5jb3VudCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEkvTyBlcnJvciAoJXMpXG4iLCBpMmNfY2xpZW50bmFtZSgmY2hpcC0+YyksIG5hbWUpOworCQl0dmF1ZGlvX3dhcm4oIiVzOiBJL08gZXJyb3IgKCVzKVxuIiwgY2hpcC0+Yy5uYW1lLCBuYW1lKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlyZXR1cm4gMDsKQEAgLTI2NCwxOSArMjc1LDE5IEBACiAKIHN0YXRpYyB2b2lkIGNoaXBfdGhyZWFkX3dha2UodW5zaWduZWQgbG9uZyBkYXRhKQogewotICAgICAgICBzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwID0gKHN0cnVjdCBDSElQU1RBVEUqKWRhdGE7CisJc3RydWN0IENISVBTVEFURSAqY2hpcCA9IChzdHJ1Y3QgQ0hJUFNUQVRFKilkYXRhOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2hpcC0+d3EpOwogfQogCiBzdGF0aWMgaW50IGNoaXBfdGhyZWFkKHZvaWQgKmRhdGEpCiB7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0gICAgICAgIHN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSBkYXRhOworCXN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSBkYXRhOwogCXN0cnVjdCBDSElQREVTQyAgKmRlc2MgPSBjaGlwbGlzdCArIGNoaXAtPnR5cGU7CiAKLQlkYWVtb25pemUoIiVzIixpMmNfY2xpZW50bmFtZSgmY2hpcC0+YykpOworCWRhZW1vbml6ZSgiJXMiLCBjaGlwLT5jLm5hbWUpOwogCWFsbG93X3NpZ25hbChTSUdURVJNKTsKLQlkcHJpbnRrKCIlczogdGhyZWFkIHN0YXJ0ZWRcbiIsIGkyY19jbGllbnRuYW1lKCZjaGlwLT5jKSk7CisJdHZhdWRpb19kYmcoIiVzOiB0aHJlYWQgc3RhcnRlZFxuIiwgY2hpcC0+Yy5uYW1lKTsKIAogCWZvciAoOzspIHsKIAkJYWRkX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7CkBAIC0yODgsNyArMjk5LDcgQEAKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwogCQlpZiAoY2hpcC0+ZG9uZSB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwotCQlkcHJpbnRrKCIlczogdGhyZWFkIHdha2V1cFxuIiwgaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpKTsKKwkJdHZhdWRpb19kYmcoIiVzOiB0aHJlYWQgd2FrZXVwXG4iLCBjaGlwLT5jLm5hbWUpOwogCiAJCS8qIGRvbid0IGRvIGFueXRoaW5nIGZvciByYWRpbyBvciBpZiBtb2RlICE9IGF1dG8gKi8KIAkJaWYgKGNoaXAtPm5vcm0gPT0gVklERU9fTU9ERV9SQURJTyB8fCBjaGlwLT5tb2RlICE9IDApCkBAIC0zMDEsOCArMzEyLDggQEAKIAkJbW9kX3RpbWVyKCZjaGlwLT53dCwgamlmZmllcysyKkhaKTsKIAl9CiAKLQlkcHJpbnRrKCIlczogdGhyZWFkIGV4aXRpbmdcbiIsIGkyY19jbGllbnRuYW1lKCZjaGlwLT5jKSk7Ci0gICAgICAgIGNvbXBsZXRlX2FuZF9leGl0KCZjaGlwLT50ZXhpdCwgMCk7CisJdHZhdWRpb19kYmcoIiVzOiB0aHJlYWQgZXhpdGluZ1xuIiwgY2hpcC0+Yy5uYW1lKTsKKwljb21wbGV0ZV9hbmRfZXhpdCgmY2hpcC0+dGV4aXQsIDApOwogCXJldHVybiAwOwogfQogCkBAIC0zMTIsOSArMzIzLDkgQEAKIAlpbnQgbW9kZSA9IGRlc2MtPmdldG1vZGUoY2hpcCk7CiAKIAlpZiAobW9kZSA9PSBjaGlwLT5wcmV2bW9kZSkKLQkgICAgcmV0dXJuOworCQlyZXR1cm47CiAKLQlkcHJpbnRrKCIlczogdGhyZWFkIGNoZWNrbW9kZVxuIiwgaTJjX2NsaWVudG5hbWUoJmNoaXAtPmMpKTsKKwl0dmF1ZGlvX2RiZygiJXM6IHRocmVhZCBjaGVja21vZGVcbiIsIGNoaXAtPmMubmFtZSk7CiAJY2hpcC0+cHJldm1vZGUgPSBtb2RlOwogCiAJaWYgKG1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCkBAIC0zNjEsOCArMzcyLDggQEAKIAlpZiAodmFsICYgVERBOTg0MF9TVF9TVEVSRU8pCiAJCW1vZGUgfD0gVklERU9fU09VTkRfU1RFUkVPOwogCi0JZHByaW50ayAoInRkYTk4NDBfZ2V0bW9kZSgpOiByYXcgY2hpcCByZWFkOiAlZCwgcmV0dXJuOiAlZFxuIiwKLQkJIHZhbCwgbW9kZSk7CisJdHZhdWRpb19kYmcgKCJ0ZGE5ODQwX2dldG1vZGUoKTogcmF3IGNoaXAgcmVhZDogJWQsIHJldHVybjogJWRcbiIsCisJCXZhbCwgbW9kZSk7CiAJcmV0dXJuIG1vZGU7CiB9CiAKQEAgLTY1Nyw4ICs2NjgsOCBAQAogCQltb2RlIHw9IFZJREVPX1NPVU5EX1NURVJFTzsKIAlpZiAodmFsICYgVERBOTg3M19EVUFMKQogCQltb2RlIHw9IFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Ci0JZHByaW50ayAoInRkYTk4NzNfZ2V0bW9kZSgpOiByYXcgY2hpcCByZWFkOiAlZCwgcmV0dXJuOiAlZFxuIiwKLQkJIHZhbCwgbW9kZSk7CisJdHZhdWRpb19kYmcgKCJ0ZGE5ODczX2dldG1vZGUoKTogcmF3IGNoaXAgcmVhZDogJWQsIHJldHVybjogJWRcbiIsCisJCXZhbCwgbW9kZSk7CiAJcmV0dXJuIG1vZGU7CiB9CiAKQEAgLTY2OCwxMiArNjc5LDEyIEBACiAJLyoJaW50IGFkal9kYXRhID0gY2hpcC0+c2hhZG93LmJ5dGVzW1REQTk4NzNfQUQrMV0gOyAqLwogCiAJaWYgKChzd19kYXRhICYgVERBOTg3M19JTlBfTUFTSykgIT0gVERBOTg3M19JTlRFUk5BTCkgewotCQlkcHJpbnRrKCJ0ZGE5ODczX3NldG1vZGUoKTogZXh0ZXJuYWwgaW5wdXRcbiIpOworCQl0dmF1ZGlvX2RiZygidGRhOTg3M19zZXRtb2RlKCk6IGV4dGVybmFsIGlucHV0XG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWRwcmludGsoInRkYTk4NzNfc2V0bW9kZSgpOiBjaGlwLT5zaGFkb3cuYnl0ZXNbJWRdID0gJWRcbiIsIFREQTk4NzNfU1crMSwgY2hpcC0+c2hhZG93LmJ5dGVzW1REQTk4NzNfU1crMV0pOwotCWRwcmludGsoInRkYTk4NzNfc2V0bW9kZSgpOiBzd19kYXRhICA9ICVkXG4iLCBzd19kYXRhKTsKKwl0dmF1ZGlvX2RiZygidGRhOTg3M19zZXRtb2RlKCk6IGNoaXAtPnNoYWRvdy5ieXRlc1slZF0gPSAlZFxuIiwgVERBOTg3M19TVysxLCBjaGlwLT5zaGFkb3cuYnl0ZXNbVERBOTg3M19TVysxXSk7CisJdHZhdWRpb19kYmcoInRkYTk4NzNfc2V0bW9kZSgpOiBzd19kYXRhICA9ICVkXG4iLCBzd19kYXRhKTsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgVklERU9fU09VTkRfTU9OTzoKQEAgLTY5NCw3ICs3MDUsNyBAQAogCX0KIAogCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3M19TVywgc3dfZGF0YSk7Ci0JZHByaW50aygidGRhOTg3M19zZXRtb2RlKCk6IHJlcS4gbW9kZSAlZDsgY2hpcF93cml0ZTogJWRcbiIsCisJdHZhdWRpb19kYmcoInRkYTk4NzNfc2V0bW9kZSgpOiByZXEuIG1vZGUgJWQ7IGNoaXBfd3JpdGU6ICVkXG4iLAogCQltb2RlLCBzd19kYXRhKTsKIH0KIApAQCAtODMxLDkgKzg0Miw5IEBACiAJfSBlbHNlIHsgLyogZGljID09IDB4MDcgKi8KIAkJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9BTUNPTlIsIDB4ZmIpOwogCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX1NEQUNPU1IsICh0ZGE5ODc0YV9tb2RlKSA/IDB4ODE6MHg4MCk7Ci0JCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfQU9TUiwgMHgwMCk7IC8vIG9yIDB4MTAKKwkJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9BT1NSLCAweDAwKTsgLyogb3IgMHgxMCAqLwogCX0KLQlkcHJpbnRrKCJ0ZGE5ODc0YV9zZXR1cCgpOiAlcyBbMHglMDJYXS5cbiIsCisJdHZhdWRpb19kYmcoInRkYTk4NzRhX3NldHVwKCk6ICVzIFsweCUwMlhdLlxuIiwKIAkJdGRhOTg3NGFfbW9kZWxpc3RbdGRhOTg3NGFfU1REXS5uYW1lLHRkYTk4NzRhX1NURCk7CiAJcmV0dXJuIDE7CiB9CkBAIC04NzYsNyArODg3LDcgQEAKIAkJCW1vZGUgfD0gVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKIAl9CiAKLQlkcHJpbnRrKCJ0ZGE5ODc0YV9nZXRtb2RlKCk6IERTUj0weCVYLCBOU1I9MHglWCwgTkVDUj0weCVYLCByZXR1cm46ICVkLlxuIiwKKwl0dmF1ZGlvX2RiZygidGRhOTg3NGFfZ2V0bW9kZSgpOiBEU1I9MHglWCwgTlNSPTB4JVgsIE5FQ1I9MHglWCwgcmV0dXJuOiAlZC5cbiIsCiAJCSBkc3IsIG5zciwgbmVjciwgbW9kZSk7CiAJcmV0dXJuIG1vZGU7CiB9CkBAIC05MjIsNyArOTMzLDcgQEAKIAkJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9BT1NSLCBhb3NyKTsKIAkJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9NREFDT1NSLCBtZGFjb3NyKTsKIAotCQlkcHJpbnRrKCJ0ZGE5ODc0YV9zZXRtb2RlKCk6IHJlcS4gbW9kZSAlZDsgQU9TUj0weCVYLCBNREFDT1NSPTB4JVguXG4iLAorCQl0dmF1ZGlvX2RiZygidGRhOTg3NGFfc2V0bW9kZSgpOiByZXEuIG1vZGUgJWQ7IEFPU1I9MHglWCwgTURBQ09TUj0weCVYLlxuIiwKIAkJCW1vZGUsIGFvc3IsIG1kYWNvc3IpOwogCiAJfSBlbHNlIHsgLyogZGljID09IDB4MDcgKi8KQEAgLTk1Nyw3ICs5NjgsNyBAQAogCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0ZNTVIsIGZtbXIpOwogCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0FPU1IsIGFvc3IpOwogCi0JCWRwcmludGsoInRkYTk4NzRhX3NldG1vZGUoKTogcmVxLiBtb2RlICVkOyBGTU1SPTB4JVgsIEFPU1I9MHglWC5cbiIsCisJCXR2YXVkaW9fZGJnKCJ0ZGE5ODc0YV9zZXRtb2RlKCk6IHJlcS4gbW9kZSAlZDsgRk1NUj0weCVYLCBBT1NSPTB4JVguXG4iLAogCQkJbW9kZSwgZm1tciwgYW9zcik7CiAJfQogfQpAQCAtOTcxLDEwICs5ODIsMTAgQEAKIAlpZigtMSA9PSAoc2ljID0gY2hpcF9yZWFkMihjaGlwLFREQTk4NzRBX1NJQykpKQogCQlyZXR1cm4gMDsKIAotCWRwcmludGsoInRkYTk4NzRhX2NoZWNraXQoKTogRElDPTB4JVgsIFNJQz0weCVYLlxuIiwgZGljLCBzaWMpOworCXR2YXVkaW9fZGJnKCJ0ZGE5ODc0YV9jaGVja2l0KCk6IERJQz0weCVYLCBTSUM9MHglWC5cbiIsIGRpYywgc2ljKTsKIAogCWlmKChkaWMgPT0gMHgxMSl8fChkaWMgPT0gMHgwNykpIHsKLQkJcHJpbnRrKCJ0dmF1ZGlvOiBmb3VuZCB0ZGE5ODc0JXMuXG4iLCAoZGljID09IDB4MTEpID8gImEiOiJoIik7CisJCXR2YXVkaW9faW5mbygiZm91bmQgdGRhOTg3NCVzLlxuIiwgKGRpYyA9PSAweDExKSA/ICJhIjoiaCIpOwogCQl0ZGE5ODc0YV9kaWMgPSBkaWM7CS8qIHJlbWVtYmVyIGRldmljZSBpZC4gKi8KIAkJcmV0dXJuIDE7CiAJfQpAQCAtMTA5OCw3ICsxMTA5LDcgQEAKIAkJCSAgICAvKiBleHRlcm4JKi8gVERBODQyNV9TMV9DSDEsIC8qIGludGVybiAqLyBUREE4NDI1X1MxX09GRiwKIAkJCSAgICAvKiBvZmYJKi8gVERBODQyNV9TMV9PRkYsIC8qIG9uICAgICAqLyBUREE4NDI1X1MxX0NIMn07CiAKLQlpZiAoY2hpcC0+Yy5hZGFwdGVyLT5pZCA9PSAoSTJDX0FMR09fQklUIHwgSTJDX0hXX0JfUklWQSkpIHsKKwlpZiAoY2hpcC0+Yy5hZGFwdGVyLT5pZCA9PSBJMkNfSFdfQl9SSVZBKSB7CiAJCW1lbWNweSAoZGVzYy0+aW5wdXRtYXAsIGlucHV0bWFwLCBzaXplb2YgKGlucHV0bWFwKSk7CiAJfQogCXJldHVybiAwOwpAQCAtMTE0OSw3ICsxMTYwLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGF1ZGlvIGNoaXAgZGVzY3JpcHRpb25zIC0gZGVmaW5lcytmdW5jdGlvbnMgZm9yIFRBODg3NFogICAgICAgICAgICAgICAgKi8KIAotLy8gd3JpdGUgMXN0IGJ5dGUKKy8qIHdyaXRlIDFzdCBieXRlICovCiAjZGVmaW5lIFRBODg3NFpfTEVEX1NURQkweDgwCiAjZGVmaW5lIFRBODg3NFpfTEVEX0JJTAkweDQwCiAjZGVmaW5lIFRBODg3NFpfTEVEX0VYVAkweDIwCkBAIC0xMTU5LDIxICsxMTcwLDIyIEBACiAjZGVmaW5lIFRBODg3NFpfTU9ERV9TVUIJMHgwMgogI2RlZmluZSBUQTg4NzRaX01PREVfTUFJTgkweDAxCiAKLS8vIHdyaXRlIDJuZCBieXRlCi0vLyNkZWZpbmUgVEE4ODc0Wl9USQkweDgwICAvLyB0ZXN0IG1vZGUKKy8qIHdyaXRlIDJuZCBieXRlICovCisvKiNkZWZpbmUgVEE4ODc0Wl9USQkweDgwICAqLyAvKiB0ZXN0IG1vZGUgKi8KICNkZWZpbmUgVEE4ODc0Wl9TRVBBUkFUSU9OCTB4M2YKICNkZWZpbmUgVEE4ODc0Wl9TRVBBUkFUSU9OX0RFRkFVTFQJMHgxMAogCi0vLyByZWFkCisvKiByZWFkICovCiAjZGVmaW5lIFRBODg3NFpfQjEJMHg4MAogI2RlZmluZSBUQTg4NzRaX0IwCTB4NDAKICNkZWZpbmUgVEE4ODc0Wl9DSEFHX0ZMQUcJMHgyMAogCi0vLyAgICAgICAgQjEgQjAKLS8vIG1vbm8gICAgTCAgSAotLy8gc3RlcmVvICBMICBMCi0vLyBCSUwgICAgIEggIEwKLQorLyoKKyAqICAgICAgICBCMSBCMAorICogbW9ubyAgICBMICBICisgKiBzdGVyZW8gIEwgIEwKKyAqIEJJTCAgICAgSCAgTAorICovCiBzdGF0aWMgaW50IHRhODg3NHpfZ2V0bW9kZShzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwKQogewogCWludCB2YWwsIG1vZGU7CkBAIC0xMTg1LDcgKzExOTcsNyBAQAogCX1lbHNlIGlmICghKHZhbCAmIFRBODg3NFpfQjApKXsKIAkJbW9kZSB8PSBWSURFT19TT1VORF9TVEVSRU87CiAJfQotCS8vZHByaW50ayAoInRhODg3NHpfZ2V0bW9kZSgpOiByYXcgY2hpcCByZWFkOiAweCUwMngsIHJldHVybjogMHglMDJ4XG4iLCB2YWwsIG1vZGUpOworCS8qIHR2YXVkaW9fZGJnICgidGE4ODc0el9nZXRtb2RlKCk6IHJhdyBjaGlwIHJlYWQ6IDB4JTAyeCwgcmV0dXJuOiAweCUwMnhcbiIsIHZhbCwgbW9kZSk7ICovCiAJcmV0dXJuIG1vZGU7CiB9CiAKQEAgLTExOTgsNyArMTIxMCw3IEBACiB7CiAJaW50IHVwZGF0ZSA9IDE7CiAJYXVkaW9jbWQgKnQgPSBOVUxMOwotCWRwcmludGsoInRhODg3NHpfc2V0bW9kZSgpOiBtb2RlOiAweCUwMnhcbiIsIG1vZGUpOworCXR2YXVkaW9fZGJnKCJ0YTg4NzR6X3NldG1vZGUoKTogbW9kZTogMHglMDJ4XG4iLCBtb2RlKTsKIAogCXN3aXRjaChtb2RlKXsKIAljYXNlIFZJREVPX1NPVU5EX01PTk86CkBAIC0xMjM4LDExICsxMjUwLDExIEBACiBzdGF0aWMgaW50IHRkYTk4NTUgID0gMTsKIHN0YXRpYyBpbnQgdGRhOTg3MyAgPSAxOwogc3RhdGljIGludCB0ZGE5ODc0YSA9IDE7Ci1zdGF0aWMgaW50IHRlYTYzMDAgID0gMDsgIC8vIGFkZHJlc3MgY2xhc2ggd2l0aCBtc3AzNHh4Ci1zdGF0aWMgaW50IHRlYTYzMjAgID0gMDsgIC8vIGFkZHJlc3MgY2xhc2ggd2l0aCBtc3AzNHh4CitzdGF0aWMgaW50IHRlYTYzMDAgID0gMDsgIC8qIGFkZHJlc3MgY2xhc2ggd2l0aCBtc3AzNHh4ICovCitzdGF0aWMgaW50IHRlYTYzMjAgID0gMDsgIC8qIGFkZHJlc3MgY2xhc2ggd2l0aCBtc3AzNHh4ICovCiBzdGF0aWMgaW50IHRlYTY0MjAgID0gMTsKIHN0YXRpYyBpbnQgcGljMTZjNTQgPSAxOwotc3RhdGljIGludCB0YTg4NzR6ICA9IDA7ICAvLyBhZGRyZXNzIGNsYXNoIHdpdGggdGRhOTg0MAorc3RhdGljIGludCB0YTg4NzR6ICA9IDA7ICAvKiBhZGRyZXNzIGNsYXNoIHdpdGggdGRhOTg0MCAqLwogCiBtb2R1bGVfcGFyYW0odGRhODQyNSwgaW50LCAwNDQ0KTsKIG1vZHVsZV9wYXJhbSh0ZGE5ODQwLCBpbnQsIDA0NDQpOwpAQCAtMTQ0NCw3ICsxNDU2LDcgQEAKIAl7CiAJCS5uYW1lICAgICAgID0gInRhODg3NHoiLAogCQkuaWQgICAgICAgICA9IC0xLAotCQkvLy5pZCAgICAgICAgID0gSTJDX0RSSVZFUklEX1RBODg3NFosCisJCS8qLmlkICAgICAgICAgPSBJMkNfRFJJVkVSSURfVEE4ODc0WiwgKi8KIAkJLmNoZWNraXQgICAgPSB0YTg4NzR6X2NoZWNraXQsCiAJCS5pbnNtb2RvcHQgID0gJnRhODg3NHosCiAJCS5hZGRyX2xvICAgID0gSTJDX1REQTk4NDAgPj4gMSwKQEAgLTE0NzksNyArMTQ5MSw3IEBACiAJaTJjX3NldF9jbGllbnRkYXRhKCZjaGlwLT5jLCBjaGlwKTsKIAogCS8qIGZpbmQgZGVzY3JpcHRpb24gZm9yIHRoZSBjaGlwICovCi0JZHByaW50aygidHZhdWRpbzogY2hpcCBmb3VuZCBAIGkyYy1hZGRyPTB4JXhcbiIsIGFkZHI8PDEpOworCXR2YXVkaW9fZGJnKCJjaGlwIGZvdW5kIEAgMHgleFxuIiwgYWRkcjw8MSk7CiAJZm9yIChkZXNjID0gY2hpcGxpc3Q7IGRlc2MtPm5hbWUgIT0gTlVMTDsgZGVzYysrKSB7CiAJCWlmICgwID09ICooZGVzYy0+aW5zbW9kb3B0KSkKIAkJCWNvbnRpbnVlOwpAQCAtMTQ5MSwxNyArMTUwMywxOSBAQAogCQlicmVhazsKIAl9CiAJaWYgKGRlc2MtPm5hbWUgPT0gTlVMTCkgewotCQlkcHJpbnRrKCJ0dmF1ZGlvOiBubyBtYXRjaGluZyBjaGlwIGRlc2NyaXB0aW9uIGZvdW5kXG4iKTsKKwkJdHZhdWRpb19kYmcoIm5vIG1hdGNoaW5nIGNoaXAgZGVzY3JpcHRpb24gZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JcHJpbnRrKCJ0dmF1ZGlvOiBmb3VuZCAlcyBAIDB4JXhcbiIsIGRlc2MtPm5hbWUsIGFkZHI8PDEpOwotCWRwcmludGsoInR2YXVkaW86IG1hdGNoZXM6JXMlcyVzLlxuIiwKLQkJKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfVk9MVU1FKSAgICAgPyAiIHZvbHVtZSIgICAgICA6ICIiLAotCQkoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19CQVNTVFJFQkxFKSA/ICIgYmFzcy90cmVibGUiIDogIiIsCi0JCShkZXNjLT5mbGFncyAmIENISVBfSEFTX0lOUFVUU0VMKSAgID8gIiBhdWRpb211eCIgICAgOiAiIik7CisJdHZhdWRpb19pbmZvKCIlcyBmb3VuZCBAIDB4JXggKCVzKVxuIiwgZGVzYy0+bmFtZSwgYWRkcjw8MSwgYWRhcC0+bmFtZSk7CisgICAgICAgIGlmIChkZXNjLT5mbGFncykgeworICAgICAgICAgICAgICAgIHR2YXVkaW9fZGJnKCJtYXRjaGVzOiVzJXMlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19WT0xVTUUpICAgICA/ICIgdm9sdW1lIiAgICAgIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19CQVNTVFJFQkxFKSA/ICIgYmFzcy90cmVibGUiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19JTlBVVFNFTCkgICA/ICIgYXVkaW9tdXgiICAgIDogIiIpOworICAgICAgICB9CiAKIAkvKiBmaWxsIHJlcXVpcmVkIGRhdGEgc3RydWN0dXJlcyAqLwotCXN0cmNweShpMmNfY2xpZW50bmFtZSgmY2hpcC0+YyksZGVzYy0+bmFtZSk7CisJc3RyY3B5KGNoaXAtPmMubmFtZSxkZXNjLT5uYW1lKTsKIAljaGlwLT50eXBlID0gZGVzYy1jaGlwbGlzdDsKIAljaGlwLT5zaGFkb3cuY291bnQgPSBkZXNjLT5yZWdpc3RlcnMrMTsKICAgICAgICAgY2hpcC0+cHJldm1vZGUgPSAtMTsKQEAgLTE1MzcsOCArMTU1MSw4IEBACiAJCWluaXRfY29tcGxldGlvbigmY2hpcC0+dGV4aXQpOwogCQljaGlwLT50cGlkID0ga2VybmVsX3RocmVhZChjaGlwX3RocmVhZCwodm9pZCAqKWNoaXAsMCk7CiAJCWlmIChjaGlwLT50cGlkIDwgMCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBrZXJuZWxfdGhyZWFkKCkgZmFpbGVkXG4iLAotCQkJICAgICAgIGkyY19jbGllbnRuYW1lKCZjaGlwLT5jKSk7CisJCQl0dmF1ZGlvX3dhcm4oIiVzOiBrZXJuZWxfdGhyZWFkKCkgZmFpbGVkXG4iLAorCQkJICAgICAgIGNoaXAtPmMubmFtZSk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2hpcC0+d3EpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE1NDgsMTYgKzE1NjIsMTYgQEAKIHsKIAkvKiBkb24ndCBhdHRhY2ggb24gc2FhNzE0NiBiYXNlZCBjYXJkcywKIAkgICBiZWNhdXNlIGRlZGljYXRlZCBkcml2ZXJzIGFyZSB1c2VkICovCi0JaWYgKChhZGFwLT5pZCAmIEkyQ19BTEdPX1NBQTcxNDYpKQorCWlmICgoYWRhcC0+aWQgPT0gSTJDX0hXX1NBQTcxNDYpKQogCQlyZXR1cm4gMDsKICNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCiAJaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKIAkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBjaGlwX2F0dGFjaCk7CiAjZWxzZQogCXN3aXRjaCAoYWRhcC0+aWQpIHsKLQljYXNlIEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0JUODQ4OgotCWNhc2UgSTJDX0FMR09fQklUIHwgSTJDX0hXX0JfUklWQToKLQljYXNlIEkyQ19BTEdPX1NBQTcxMzQ6CisJY2FzZSBJMkNfSFdfQl9CVDg0ODoKKwljYXNlIEkyQ19IV19CX1JJVkE6CisJY2FzZSBJMkNfSFdfU0FBNzEzNDoKIAkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBjaGlwX2F0dGFjaCk7CiAJfQogI2VuZGlmCkBAIC0xNTg3LDExICsxNjAxLDExIEBACiBzdGF0aWMgaW50IGNoaXBfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewotICAgICAgICBfX3UxNiAqc2FyZyA9IGFyZzsKKwlfX3UxNiAqc2FyZyA9IGFyZzsKIAlzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IENISVBERVNDICAqZGVzYyA9IGNoaXBsaXN0ICsgY2hpcC0+dHlwZTsKIAotCWRwcmludGsoIiVzOiBjaGlwX2NvbW1hbmQgMHgleFxuIixpMmNfY2xpZW50bmFtZSgmY2hpcC0+YyksY21kKTsKKwl0dmF1ZGlvX2RiZygiJXM6IGNoaXBfY29tbWFuZCAweCV4XG4iLGNoaXAtPmMubmFtZSxjbWQpOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEFVRENfU0VUX0lOUFVUOgpAQCAtMTYwNCw3ICsxNjE4LDYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEFVRENfU0VUX1JBRElPOgotCQlkcHJpbnRrKEtFUk5fREVCVUcgInR2YXVkaW86IEFVRENfU0VUX1JBRElPXG4iKTsKIAkJY2hpcC0+bm9ybSA9IFZJREVPX01PREVfUkFESU87CiAJCWNoaXAtPndhdGNoX3N0ZXJlbyA9IDA7CiAJCS8qIGRlbF90aW1lcigmY2hpcC0+d3QpOyAqLwpAQCAtMTYxMiw3ICsxNjI1LDcgQEAKIAogCS8qIC0tLSB2NGwgaW9jdGxzIC0tLSAqLwogCS8qIHRha2UgY2FyZTogYnR0diBkb2VzIHVzZXJzcGFjZSBjb3B5aW5nLCB3ZSdsbCBnZXQgYQotCSAgIGtlcm5lbCBwb2ludGVyIGhlcmUuLi4gKi8KKwkJCQkJa2VybmVsIHBvaW50ZXIgaGVyZS4uLiAqLwogCWNhc2UgVklESU9DR0FVRElPOgogCXsKIAkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKQEAgLTE2NDYsOSArMTY1OSw5IEBACiAKIAkJaWYgKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfVk9MVU1FKSB7CiAJCQljaGlwLT5sZWZ0ID0gKG1pbig2NTUzNiAtIHZhLT5iYWxhbmNlLDMyNzY4KSAqCi0JCQkJICAgICAgdmEtPnZvbHVtZSkgLyAzMjc2ODsKKwkJCQl2YS0+dm9sdW1lKSAvIDMyNzY4OwogCQkJY2hpcC0+cmlnaHQgPSAobWluKHZhLT5iYWxhbmNlLChfX3UxNikzMjc2OCkgKgotCQkJCSAgICAgICB2YS0+dm9sdW1lKSAvIDMyNzY4OworCQkJCXZhLT52b2x1bWUpIC8gMzI3Njg7CiAJCQljaGlwX3dyaXRlKGNoaXAsZGVzYy0+bGVmdHJlZyxkZXNjLT52b2xmdW5jKGNoaXAtPmxlZnQpKTsKIAkJCWNoaXBfd3JpdGUoY2hpcCxkZXNjLT5yaWdodHJlZyxkZXNjLT52b2xmdW5jKGNoaXAtPnJpZ2h0KSk7CiAJCX0KQEAgLTE2NzAsMTcgKzE2ODMsMTYgQEAKIAl7CiAJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2YyA9IGFyZzsKIAotCQlkcHJpbnRrKEtFUk5fREVCVUcgInR2YXVkaW86IFZJRElPQ1NDSEFOXG4iKTsKIAkJY2hpcC0+bm9ybSA9IHZjLT5ub3JtOwogCQlicmVhazsKIAl9CiAJY2FzZSBWSURJT0NTRlJFUToKIAl7Ci0JICAgIAljaGlwLT5tb2RlID0gMDsgLyogYXV0b21hdGljICovCisJCWNoaXAtPm1vZGUgPSAwOyAvKiBhdXRvbWF0aWMgKi8KIAkJaWYgKGRlc2MtPmNoZWNrbW9kZSkgewogCQkJZGVzYy0+c2V0bW9kZShjaGlwLFZJREVPX1NPVU5EX01PTk8pOwotCQkgICAgCWlmIChjaGlwLT5wcmV2bW9kZSAhPSBWSURFT19TT1VORF9NT05PKQotCQkgICAgCQljaGlwLT5wcmV2bW9kZSA9IC0xOyAvKiByZXNldCBwcmV2aW91cyBtb2RlICovCisJCQlpZiAoY2hpcC0+cHJldm1vZGUgIT0gVklERU9fU09VTkRfTU9OTykKKwkJCQljaGlwLT5wcmV2bW9kZSA9IC0xOyAvKiByZXNldCBwcmV2aW91cyBtb2RlICovCiAJCQltb2RfdGltZXIoJmNoaXAtPnd0LCBqaWZmaWVzKzIqSFopOwogCQkJLyogdGhlIHRocmVhZCB3aWxsIGNhbGwgY2hlY2ttb2RlKCkgbGF0ZXIgKi8KIAkJfQpAQCAtMTY5MiwyOSArMTcwNCwzMiBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0gewogCS5vd25lciAgICAgICAgICAgPSBUSElTX01PRFVMRSwKLSAgICAgICAgLm5hbWUgICAgICAgICAgICA9ICJnZW5lcmljIGkyYyBhdWRpbyBkcml2ZXIiLAotICAgICAgICAuaWQgICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1RWQVVESU8sCi0gICAgICAgIC5mbGFncyAgICAgICAgICAgPSBJMkNfREZfTk9USUZZLAotICAgICAgICAuYXR0YWNoX2FkYXB0ZXIgID0gY2hpcF9wcm9iZSwKLSAgICAgICAgLmRldGFjaF9jbGllbnQgICA9IGNoaXBfZGV0YWNoLAotICAgICAgICAuY29tbWFuZCAgICAgICAgID0gY2hpcF9jb21tYW5kLAorCS5uYW1lICAgICAgICAgICAgPSAiZ2VuZXJpYyBpMmMgYXVkaW8gZHJpdmVyIiwKKwkuaWQgICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1RWQVVESU8sCisJLmZsYWdzICAgICAgICAgICA9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyICA9IGNoaXBfcHJvYmUsCisJLmRldGFjaF9jbGllbnQgICA9IGNoaXBfZGV0YWNoLAorCS5jb21tYW5kICAgICAgICAgPSBjaGlwX2NvbW1hbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0KIHsKLQlJMkNfREVWTkFNRSgiKHVuc2V0KSIpLAorCS5uYW1lICAgICAgID0gIih1bnNldCkiLAogCS5mbGFncyAgICAgID0gSTJDX0NMSUVOVF9BTExPV19VU0UsCi0gICAgICAgIC5kcml2ZXIgICAgID0gJmRyaXZlciwKKwkuZHJpdmVyICAgICA9ICZkcml2ZXIsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhdWRpb2NoaXBfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlzdHJ1Y3QgQ0hJUERFU0MgICpkZXNjOwotCXByaW50ayhLRVJOX0lORk8gInR2YXVkaW86IFRWIGF1ZGlvIGRlY29kZXIgKyBhdWRpby92aWRlbyBtdXggZHJpdmVyXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICJ0dmF1ZGlvOiBrbm93biBjaGlwczogIik7Ci0JZm9yIChkZXNjID0gY2hpcGxpc3Q7IGRlc2MtPm5hbWUgIT0gTlVMTDsgZGVzYysrKQotCQlwcmludGsoIiVzJXMiLCAoZGVzYyA9PSBjaGlwbGlzdCkgPyAiIiA6ICIsIixkZXNjLT5uYW1lKTsKLQlwcmludGsoIlxuIik7CisKKwlpZiAoZGVidWcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidHZhdWRpbzogVFYgYXVkaW8gZGVjb2RlciArIGF1ZGlvL3ZpZGVvIG11eCBkcml2ZXJcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJ0dmF1ZGlvOiBrbm93biBjaGlwczogIik7CisJCWZvciAoZGVzYyA9IGNoaXBsaXN0OyBkZXNjLT5uYW1lICE9IE5VTEw7IGRlc2MrKykKKwkJCXByaW50aygiJXMlcyIsIChkZXNjID09IGNoaXBsaXN0KSA/ICIiIDogIiwgIiwgZGVzYy0+bmFtZSk7CisJCXByaW50aygiXG4iKTsKKwl9CiAKIAlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMKaW5kZXggMTI3ZWMzOC4uNTM0NGQ1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYwpAQCAtNDcsMTggKzQ3LDIxIEBACiAKIHN0YXRpYyBpbnQgZGVidWcgPSAwOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTIpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDAtMSkiKTsKIAogI2RlZmluZSBTVFJNKGFycmF5LGkpIChpIDwgc2l6ZW9mKGFycmF5KS9zaXplb2YoY2hhciopID8gYXJyYXlbaV0gOiAidW5rbm93biIpCiAKLSNkZWZpbmUgZHByaW50ayhudW0sIGFyZ3MuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGRlYnVnID49IG51bSkgXAotCQkJcHJpbnRrKEtFUk5fSU5GTyAidHZlZXByb206ICIgYXJncyk7IFwKLQl9IHdoaWxlICgwKQorI2RlZmluZSB0dmVlcHJvbV9pbmZvKGZtdCwgYXJnLi4uKSBkbyB7XAorCXByaW50ayhLRVJOX0lORk8gInR2ZWVwcm9tICVkLSUwNHg6ICIgZm10LCBcCisgICAgICAgICAgICAgICAgICAgICAgICBjLT5hZGFwdGVyLT5uciwgYy0+YWRkciAsICMjYXJnKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdHZlZXByb21fd2FybihmbXQsIGFyZy4uLikgZG8ge1wKKwlwcmludGsoS0VSTl9XQVJOSU5HICJ0dmVlcHJvbSAlZC0lMDR4OiAiIGZtdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgYy0+YWRhcHRlci0+bnIsIGMtPmFkZHIgLCAjI2FyZyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHR2ZWVwcm9tX2RiZyhmbXQsIGFyZy4uLikgZG8ge1wKKwlpZiAoZGVidWcpIFwKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJ0dmVlcHJvbSAlZC0lMDR4OiAiIGZtdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgYy0+YWRhcHRlci0+bnIsIGMtPmFkZHIgLCAjI2FyZyk7IH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgVFZFRVBST01fS0VSTl9FUlIoYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSICJ0dmVlcHJvbTogIiBhcmdzKTsKLSNkZWZpbmUgVFZFRVBST01fS0VSTl9JTkZPKGFyZ3MuLi4pIHByaW50ayhLRVJOX0lORk8gInR2ZWVwcm9tOiAiIGFyZ3MpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogc29tZSBoYXVwcGF1Z2Ugc3BlY2lmaWMgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTcwLDE0ICs3MywxNCBAQAogfQogaGF1cHBhdWdlX3R1bmVyX2ZtdFtdID0KIHsKLQl7IDB4MDAwMDAwMDAsICJ1bmtub3duMSIgfSwKLQl7IDB4MDAwMDAwMDAsICJ1bmtub3duMiIgfSwKLQl7IDB4MDAwMDAwMDcsICJQQUwoQi9HKSIgfSwKLQl7IDB4MDAwMDEwMDAsICJOVFNDKE0pIiB9LAotCXsgMHgwMDAwMDAxMCwgIlBBTChJKSIgfSwKLQl7IDB4MDA0MDAwMDAsICJTRUNBTShML0y0KSIgfSwKLQl7IDB4MDAwMDBlMDAsICJQQUwoRC9LKSIgfSwKLQl7IDB4MDMwMDAwMDAsICJBVFNDIERpZ2l0YWwiIH0sCisJeyAweDAwMDAwMDAwLCAiIHVua25vd24xIiB9LAorCXsgMHgwMDAwMDAwMCwgIiB1bmtub3duMiIgfSwKKwl7IDB4MDAwMDAwMDcsICIgUEFMKEIvRykiIH0sCisJeyAweDAwMDAxMDAwLCAiIE5UU0MoTSkiIH0sCisJeyAweDAwMDAwMDEwLCAiIFBBTChJKSIgfSwKKwl7IDB4MDA0MDAwMDAsICIgU0VDQU0oTC9MJykiIH0sCisJeyAweDAwMDAwZTAwLCAiIFBBTChEL0spIiB9LAorCXsgMHgwMzAwMDAwMCwgIiBBVFNDIERpZ2l0YWwiIH0sCiB9OwogCiAvKiBUaGlzIGlzIHRoZSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgdHVuZXJzLiBNYW55IHRoYW5rcyB0byBIYXVwcGF1Z2UgZm9yCkBAIC0xNTIsMTMgKzE1NSwxMyBAQAogCXsgVFVORVJfTUlDUk9UVU5FXzQwNDlGTTUsICJNaWNyb3R1bmUgNDA0OSBGTTUifSwKIAl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBUUEk4TlNSMTFGIn0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTWljcm90dW5lIDQwNDkgRk01IEFsdCBJMkMifSwKLQl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZRMTIxNk1FIE1LMyJ9LAorCXsgVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsICJQaGlsaXBzIEZRMTIxNk1FIE1LMyJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRkkxMjM2IE1LMyJ9LAogCXsgVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsICJQaGlsaXBzIEZNMTIxNiBNRSBNSzMifSwKLQl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZNMTIzNiBNSzMifSwKKwl7IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMywgIlBoaWxpcHMgRk0xMjM2IE1LMyJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRk0xMjE2TVAgTUszIn0sCiAJLyogNjAtNjkgKi8KLQl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBTMDAxRCBNSzMifSwKKwl7IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLCAiTEcgUzAwMUQgTUszIn0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgTTAwMUQgTUszIn0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgUzcwMUQgTUszIn0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgTTcwMUQgTUszIn0sCkBAIC0xNjcsNyArMTcwLDcgQEAKIAl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUZW1pYyA0MTA2Rkg1In0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGUTEyMTZMTVAgTUszIn0sCiAJeyBUVU5FUl9MR19OVFNDX1RBUEUsICAiTEcgVEFQRSBIMDAxRiBNSzMifSwKLQl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBUQVBFIEg3MDFGIE1LMyJ9LAorCXsgVFVORVJfTEdfTlRTQ19UQVBFLCAgIkxHIFRBUEUgSDcwMUYgTUszIn0sCiAJLyogNzAtNzkgKi8KIAl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBUQUxOIEgyMDBUIn0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgVEFMTiBIMjUwVCJ9LApAQCAtMTgzLDggKzE4Niw4IEBACiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGUTEyMTZMTUUgTUszIn0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgVEFQQyBHNzAxRCJ9LAogCXsgVFVORVJfTEdfTlRTQ19ORVdfVEFQQywgIkxHIFRBUEMgSDc5MUYifSwKLQl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUQ0wgMjAwMk1CIDMifSwKLQl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUQ0wgMjAwMk1JIDMifSwKKwl7IFRVTkVSX0xHX1BBTF9ORVdfVEFQQywgIlRDTCAyMDAyTUIgMyJ9LAorCXsgVFVORVJfTEdfUEFMX05FV19UQVBDLCAiVENMIDIwMDJNSSAzIn0sCiAJeyBUVU5FUl9UQ0xfMjAwMk4sICAgICAiVENMIDIwMDJOIDZBIn0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGUTEyMzYgTUszIn0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiU2Ftc3VuZyBUQ1BOIDIxMjFQMzBBIn0sCkBAIC0xOTksMTcgKzIwMiw1MSBAQAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRlExMjM2IE1LNSJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlVuc3BlY2lmaWVkIn0sCiAJeyBUVU5FUl9MR19QQUxfVEFQRSwgICAiTEcgUEFMIChUQVBFIFNlcmllcykifSwKKyAgICAgICAgeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVW5zcGVjaWZpZWQifSwKKyAgICAgICAgeyBUVU5FUl9UQ0xfMjAwMk4sICAgICAiVENMIDIwMDJOIDVIIn0sCisJLyogMTAwLTEwMyAqLworCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlVuc3BlY2lmaWVkIn0sCisgICAgICAgIHsgVFVORVJfVEVBNTc2NywgICAgICAgIlBoaWxpcHMgVEVBNTc2N0hOIEZNIFJhZGlvIn0sCisgICAgICAgIHsgVFVORVJfQUJTRU5ULCAgICAgICAgIlVuc3BlY2lmaWVkIn0sCisgICAgICAgIHsgVFVORVJfUEhJTElQU19GTTEyMzZfTUszLCAiVENMIE1GTk0wNSA0In0sCiB9OwogCi1zdGF0aWMgY2hhciAqc25kdHlwZVtdID0gewotCSJOb25lIiwgIlRFQTYzMDAiLCAiVEVBNjMyMCIsICJUREE5ODUwIiwgIk1TUDM0MDBDIiwgIk1TUDM0MTBEIiwKLQkiTVNQMzQxNSIsICJNU1AzNDMwIiwgIk1TUDM0MzgiLCAiQ1M1MzMxIiwgIk1TUDM0MzUiLCAiTVNQMzQ0MCIsCi0JIk1TUDM0NDUiLCAiTVNQMzQxMSIsICJNU1AzNDE2IiwgIk1TUDM0MjUiLAorLyogVGhpcyBsaXN0IGlzIHN1cHBsaWVkIGJ5IEhhdXBwYXVnZS4gVGhhbmtzISAqLworc3RhdGljIGNvbnN0IGNoYXIgKmF1ZGlvSUNbXSA9IHsKKyAgICAgICAgLyogMC00ICovCisgICAgICAgICJOb25lIiwgIlRFQTYzMDAiLCAiVEVBNjMyMCIsICJUREE5ODUwIiwgIk1TUDM0MDBDIiwKKyAgICAgICAgLyogNS05ICovCisgICAgICAgICJNU1AzNDEwRCIsICJNU1AzNDE1IiwgIk1TUDM0MzAiLCAiTVNQMzQzOCIsICJDUzUzMzEiLAorICAgICAgICAvKiAxMC0xNCAqLworICAgICAgICAiTVNQMzQzNSIsICJNU1AzNDQwIiwgIk1TUDM0NDUiLCAiTVNQMzQxMSIsICJNU1AzNDE2IiwKKyAgICAgICAgLyogMTUtMTkgKi8KKyAgICAgICAgIk1TUDM0MjUiLCAiTVNQMzQ1MSIsICJNU1AzNDE4IiwgIlR5cGUgMHgxMiIsICJPS0k3NzE2IiwKKyAgICAgICAgLyogMjAtMjQgKi8KKyAgICAgICAgIk1TUDQ0MTAiLCAiTVNQNDQyMCIsICJNU1A0NDQwIiwgIk1TUDQ0NTAiLCAiTVNQNDQwOCIsCisgICAgICAgIC8qIDI1LTI5ICovCisgICAgICAgICJNU1A0NDE4IiwgIk1TUDQ0MjgiLCAiTVNQNDQ0OCIsICJNU1A0NDU4IiwgIlR5cGUgMHgxZCIsCisgICAgICAgIC8qIDMwLTM0ICovCisgICAgICAgICJDWDg4MCIsICJDWDg4MSIsICJDWDg4MyIsICJDWDg4MiIsICJDWDI1ODQwIiwKKyAgICAgICAgLyogMzUtMzggKi8KKyAgICAgICAgIkNYMjU4NDEiLCAiQ1gyNTg0MiIsICJDWDI1ODQzIiwgIkNYMjM0MTgiLAorfTsKIAotCSJUeXBlIDB4MTAiLCJUeXBlIDB4MTEiLCJUeXBlIDB4MTIiLCJUeXBlIDB4MTMiLAotCSJUeXBlIDB4MTQiLCJUeXBlIDB4MTUiLCJUeXBlIDB4MTYiLCJUeXBlIDB4MTciLAotCSJUeXBlIDB4MTgiLCJNU1A0NDE4IiwiVHlwZSAweDFhIiwiTVNQNDQ0OCIsCi0JIlR5cGUgMHgxYyIsIlR5cGUgMHgxZCIsIlR5cGUgMHgxZSIsIlR5cGUgMHgxZiIsCisvKiBUaGlzIGxpc3QgaXMgc3VwcGxpZWQgYnkgSGF1cHBhdWdlLiBUaGFua3MhICovCitzdGF0aWMgY29uc3QgY2hhciAqZGVjb2RlcklDW10gPSB7CisgICAgICAgIC8qIDAtNCAqLworICAgICAgICAiTm9uZSIsICJCVDgxNSIsICJCVDgxNyIsICJCVDgxOSIsICJCVDgxNUEiLAorICAgICAgICAvKiA1LTkgKi8KKyAgICAgICAgIkJUODE3QSIsICJCVDgxOUEiLCAiQlQ4MjciLCAiQlQ4MjkiLCAiQlQ4NDgiLAorICAgICAgICAvKiAxMC0xNCAqLworICAgICAgICAiQlQ4NDhBIiwgIkJUODQ5QSIsICJCVDgyOUEiLCAiQlQ4MjdBIiwgIkJUODc4IiwKKyAgICAgICAgLyogMTUtMTkgKi8KKyAgICAgICAgIkJUODc5IiwgIkJUODgwIiwgIlZQWDMyMjZFIiwgIlNBQTcxMTQiLCAiU0FBNzExNSIsCisgICAgICAgIC8qIDIwLTI0ICovCisgICAgICAgICJDWDg4MCIsICJDWDg4MSIsICJDWDg4MyIsICJTQUE3MTExIiwgIlNBQTcxMTMiLAorICAgICAgICAvKiAyNS0yOSAqLworICAgICAgICAiQ1g4ODIiLCAiVFZQNTE1MEEiLCAiQ1gyNTg0MCIsICJDWDI1ODQxIiwgIkNYMjU4NDIiLAorICAgICAgICAvKiAzMC0zMSAqLworICAgICAgICAiQ1gyNTg0MyIsICJDWDIzNDE4IiwKIH07CiAKIHN0YXRpYyBpbnQgaGFzUmFkaW9UdW5lcihpbnQgdHVuZXJUeXBlKQpAQCAtMjUwLDcgKzI4Nyw4IEBACiAgICAgICAgIHJldHVybiAwOwogfQogCi12b2lkIHR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2coc3RydWN0IHR2ZWVwcm9tICp0dmVlLCB1bnNpZ25lZCBjaGFyICplZXByb21fZGF0YSkKK3ZvaWQgdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZyhzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IHR2ZWVwcm9tICp0dmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplZXByb21fZGF0YSkKIHsKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJKiogVGhlIGhhdXBwYXVnZSBlZXByb20gZm9ybWF0IGlzIHRhZ2dlZApAQCAtMjYwLDEwICsyOTgsMTEgQEAKIAkqKiBpZiBwYWNrZXRbMF0gJiBmOCA9PSBmOCwgdGhlbiBFT0QgYW5kIHBhY2tldFsxXSA9PSBjaGVja3N1bQogCSoqCiAJKiogSW4gb3VyIChpdnR2KSBjYXNlIHdlJ3JlIGludGVyZXN0ZWQgaW4gdGhlIGZvbGxvd2luZzoKLQkqKiB0dW5lciB0eXBlOiB0YWcgWzAwXS4wNSBvciBbMGFdLjAxIChpbmRleCBpbnRvIGhhdXBwYXVnZV90dW5lcikKLQkqKiB0dW5lciBmbXRzOiB0YWcgWzAwXS4wNCBvciBbMGFdLjAwIChiaXRtYXNrIGluZGV4IGludG8gaGF1cHBhdWdlX3R1bmVyX2ZtdCkKLQkqKiByYWRpbzogICAgICB0YWcgWzAwXS57bGFzdH0gb3IgWzBlXS4wMCAgKGJpdG1hc2suICBiaXQyPUZNKQotCSoqIGF1ZGlvIHByb2M6IHRhZyBbMDJdLjAxIG9yIFswNV0uMDAgKGxvd2VyIG5pYmJsZSBpbmRleGVzIGx1dD8pCisJKiogdHVuZXIgdHlwZTogICB0YWcgWzAwXS4wNSBvciBbMGFdLjAxIChpbmRleCBpbnRvIGhhdXBwYXVnZV90dW5lcikKKwkqKiB0dW5lciBmbXRzOiAgIHRhZyBbMDBdLjA0IG9yIFswYV0uMDAgKGJpdG1hc2sgaW5kZXggaW50byBoYXVwcGF1Z2VfdHVuZXJfZm10KQorCSoqIHJhZGlvOiAgICAgICAgdGFnIFswMF0ue2xhc3R9IG9yIFswZV0uMDAgIChiaXRtYXNrLiAgYml0Mj1GTSkKKwkqKiBhdWRpbyBwcm9jOiAgIHRhZyBbMDJdLjAxIG9yIFswNV0uMDAgKG1hc2sgd2l0aCAweDdmKQorCSoqIGRlY29kZXIgcHJvYzogdGFnIFswOV0uMDEpCiAKIAkqKiBGdW4gaW5mbzoKIAkqKiBtb2RlbDogICAgICB0YWcgWzAwXS4wNy0wOCBvciBbMDZdLjAwLTAxCkBAIC0yNzMsMjAgKzMxMiwyNCBAQAogCSoqICMgb2YgaW5wdXRzL291dHB1dHMgPz8/CiAJKi8KIAotCWludCBpLCBqLCBsZW4sIGRvbmUsIGJlZW5oZXJlLCB0YWcsIHR1bmVyID0gMCwgdF9mb3JtYXQgPSAwOwotCWNoYXIgKnRfbmFtZSA9IE5VTEwsICp0X2ZtdF9uYW1lID0gTlVMTDsKKwlpbnQgaSwgaiwgbGVuLCBkb25lLCBiZWVuaGVyZSwgdGFnOwogCi0JZHByaW50aygxLCAiJXNcbiIsX19GVU5DVElPTl9fKTsKLQl0dmVlLT5yZXZpc2lvbiA9IGRvbmUgPSBsZW4gPSBiZWVuaGVyZSA9IDA7CisgICAgICAgIGludCB0dW5lcjEgPSAwLCB0X2Zvcm1hdDEgPSAwOworCWNoYXIgKnRfbmFtZTEgPSBOVUxMOworICAgICAgICBjb25zdCBjaGFyICp0X2ZtdF9uYW1lMVs4XSA9IHsgIiBub25lIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIgfTsKKworICAgICAgICBpbnQgdHVuZXIyID0gMCwgdF9mb3JtYXQyID0gMDsKKwljaGFyICp0X25hbWUyID0gTlVMTDsKKyAgICAgICAgY29uc3QgY2hhciAqdF9mbXRfbmFtZTJbOF0gPSB7ICIgbm9uZSIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiIH07CisKKyAgICAgICAgbWVtc2V0KHR2ZWUsIDAsIHNpemVvZigqdHZlZSkpOworCWRvbmUgPSBsZW4gPSBiZWVuaGVyZSA9IDA7CiAJZm9yIChpID0gMDsgIWRvbmUgJiYgaSA8IDI1NjsgaSArPSBsZW4pIHsKLQkJZHByaW50aygyLCAicHJvY2Vzc2luZyBwb3MgPSAlMDJ4ICglMDJ4LCAlMDJ4KVxuIiwKLQkJCWksIGVlcHJvbV9kYXRhW2ldLCBlZXByb21fZGF0YVtpICsgMV0pOwotCiAJCWlmIChlZXByb21fZGF0YVtpXSA9PSAweDg0KSB7CiAJCQlsZW4gPSBlZXByb21fZGF0YVtpICsgMV0gKyAoZWVwcm9tX2RhdGFbaSArIDJdIDw8IDgpOwotCQkJaSs9MzsKKwkJCWkgKz0gMzsKIAkJfSBlbHNlIGlmICgoZWVwcm9tX2RhdGFbaV0gJiAweGYwKSA9PSAweDcwKSB7Ci0JCQlpZiAoKGVlcHJvbV9kYXRhW2ldICYgMHgwOCkpIHsKKwkJCWlmIChlZXByb21fZGF0YVtpXSAmIDB4MDgpIHsKIAkJCQkvKiB2ZXJpZnkgY2hlY2tzdW0hICovCiAJCQkJZG9uZSA9IDE7CiAJCQkJYnJlYWs7CkBAIC0yOTQsMjQgKzMzNywzMCBAQAogCQkJbGVuID0gZWVwcm9tX2RhdGFbaV0gJiAweDA3OwogCQkJKytpOwogCQl9IGVsc2UgewotCQkJVFZFRVBST01fS0VSTl9FUlIoIkVuY291bnRlcmVkIGJhZCBwYWNrZXQgaGVhZGVyIFslMDJ4XS4gIgorCQkJdHZlZXByb21fd2FybigiRW5jb3VudGVyZWQgYmFkIHBhY2tldCBoZWFkZXIgWyUwMnhdLiAiCiAJCQkJICAgIkNvcnJ1cHQgb3Igbm90IGEgSGF1cHBhdWdlIGVlcHJvbS5cbiIsIGVlcHJvbV9kYXRhW2ldKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCWRwcmludGsoMSwgIiUzZCBbJTAyeF0gIiwgbGVuLCBlZXByb21fZGF0YVtpXSk7Ci0JCWZvcihqID0gMTsgaiA8IGxlbjsgaisrKSB7Ci0JCQlkcHJpbnRrKDEsICIlMDJ4ICIsIGVlcHJvbV9kYXRhW2kgKyBqXSk7Ci0JCX0KLQkJZHByaW50aygxLCAiXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR2ZWVwcm9tX2luZm8oIlRhZyBbJTAyeF0gKyAlZCBieXRlczoiLCBlZXByb21fZGF0YVtpXSwgbGVuIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDE7IGogPCBsZW47IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIiAlMDJ4IiwgZWVwcm9tX2RhdGFbaSArIGpdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgICAgICB9CiAKIAkJLyogcHJvY2VzcyBieSB0YWcgKi8KIAkJdGFnID0gZWVwcm9tX2RhdGFbaV07CiAJCXN3aXRjaCAodGFnKSB7CiAJCWNhc2UgMHgwMDoKLQkJCXR1bmVyID0gZWVwcm9tX2RhdGFbaSs2XTsKLQkJCXRfZm9ybWF0ID0gZWVwcm9tX2RhdGFbaSs1XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhZzogJ0NvbXByZWhlbnNpdmUnICovCisJCQl0dW5lcjEgPSBlZXByb21fZGF0YVtpKzZdOworCQkJdF9mb3JtYXQxID0gZWVwcm9tX2RhdGFbaSs1XTsKIAkJCXR2ZWUtPmhhc19yYWRpbyA9IGVlcHJvbV9kYXRhW2krbGVuLTFdOworICAgICAgICAgICAgICAgICAgICAgICAgLyogb2xkIHN0eWxlIHRhZywgZG9uJ3Qga25vdyBob3cgdG8gZGV0ZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBJUiBwcmVzZW5jZSwgbWFyayBhcyB1bmtub3duLiAqLworCQkJdHZlZS0+aGFzX2lyID0gMjsKIAkJCXR2ZWUtPm1vZGVsID0KIAkJCQllZXByb21fZGF0YVtpKzhdICsKIAkJCQkoZWVwcm9tX2RhdGFbaSs5XSA8PCA4KTsKQEAgLTMxOSwyNSArMzY4LDQzIEBACiAJCQkJKGVlcHJvbV9kYXRhW2krMTFdIDw8IDgpICsKIAkJCQkoZWVwcm9tX2RhdGFbaSsxMl0gPDwgMTYpOwogCQkJYnJlYWs7CisKIAkJY2FzZSAweDAxOgorICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFnOiAnU2VyaWFsSUQnICovCiAJCQl0dmVlLT5zZXJpYWxfbnVtYmVyID0KIAkJCQllZXByb21fZGF0YVtpKzZdICsKIAkJCQkoZWVwcm9tX2RhdGFbaSs3XSA8PCA4KSArCiAJCQkJKGVlcHJvbV9kYXRhW2krOF0gPDwgMTYpOwogCQkJYnJlYWs7CisKIAkJY2FzZSAweDAyOgotCQkJdHZlZS0+YXVkaW9fcHJvY2Vzc29yID0gZWVwcm9tX2RhdGFbaSsyXSAmIDB4MGY7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWcgJ0F1ZGlvSW5mbycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgbWFzayB3aXRoIDB4N0YsIGhpZ2ggYml0IHVzZWQgb24gc29tZSBvbGRlciBtb2RlbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluZGljYXRlIDQwNTIgbXV4IHdhcyByZW1vdmVkIGluIGZhdm9yIG9mIHVzaW5nIE1TUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzIGRpcmVjdGx5LiAqLworCQkJdHZlZS0+YXVkaW9fcHJvY2Vzc29yID0gZWVwcm9tX2RhdGFbaSsyXSAmIDB4N2Y7CiAJCQlicmVhazsKKworICAgICAgICAgICAgICAgIC8qIGNhc2UgMHgwMzogdGFnICdFRUluZm8nICovCisKIAkJY2FzZSAweDA0OgorICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFnICdTZXJpYWxJRDInICovCiAJCQl0dmVlLT5zZXJpYWxfbnVtYmVyID0KIAkJCQllZXByb21fZGF0YVtpKzVdICsKIAkJCQkoZWVwcm9tX2RhdGFbaSs2XSA8PCA4KSArCiAJCQkJKGVlcHJvbV9kYXRhW2krN10gPDwgMTYpOwogCQkJYnJlYWs7CisKIAkJY2FzZSAweDA1OgotCQkJdHZlZS0+YXVkaW9fcHJvY2Vzc29yID0gZWVwcm9tX2RhdGFbaSsxXSAmIDB4MGY7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWcgJ0F1ZGlvMicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgbWFzayB3aXRoIDB4N0YsIGhpZ2ggYml0IHVzZWQgb24gc29tZSBvbGRlciBtb2RlbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluZGljYXRlIDQwNTIgbXV4IHdhcyByZW1vdmVkIGluIGZhdm9yIG9mIHVzaW5nIE1TUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzIGRpcmVjdGx5LiAqLworCQkJdHZlZS0+YXVkaW9fcHJvY2Vzc29yID0gZWVwcm9tX2RhdGFbaSsxXSAmIDB4N2Y7CiAJCQlicmVhazsKKwogCQljYXNlIDB4MDY6CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWcgJ01vZGVsUmV2JyAqLwogCQkJdHZlZS0+bW9kZWwgPQogCQkJCWVlcHJvbV9kYXRhW2krMV0gKwogCQkJCShlZXByb21fZGF0YVtpKzJdIDw8IDgpOwpAQCAtMzQ1LDI3ICs0MTIsNjYgQEAKIAkJCQkoZWVwcm9tX2RhdGFbaSs2XSA8PCA4KSArCiAJCQkJKGVlcHJvbV9kYXRhW2krN10gPDwgMTYpOwogCQkJYnJlYWs7CisKKwkJY2FzZSAweDA3OgorICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFnICdEZXRhaWxzJzogYWNjb3JkaW5nIHRvIEhhdXBwYXVnZSBub3QgaW50ZXJlc3RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGFueSBQQ0ktZXJhIG9yIGxhdGVyIGJvYXJkcy4gKi8KKwkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgLyogdGhlcmUgaXMgbm8gdGFnIDB4MDggZGVmaW5lZCAqLworCisJCWNhc2UgMHgwOToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhZyAnVmlkZW8nICovCisJCQl0dmVlLT5kZWNvZGVyX3Byb2Nlc3NvciA9IGVlcHJvbV9kYXRhW2kgKyAxXTsKKwkJCWJyZWFrOworCiAJCWNhc2UgMHgwYToKLQkJCWlmKGJlZW5oZXJlID09IDApIHsKLQkJCQl0dW5lciA9IGVlcHJvbV9kYXRhW2krMl07Ci0JCQkJdF9mb3JtYXQgPSBlZXByb21fZGF0YVtpKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFnICdUdW5lcicgKi8KKwkJCWlmIChiZWVuaGVyZSA9PSAwKSB7CisJCQkJdHVuZXIxID0gZWVwcm9tX2RhdGFbaSsyXTsKKwkJCQl0X2Zvcm1hdDEgPSBlZXByb21fZGF0YVtpKzFdOwogCQkJCWJlZW5oZXJlID0gMTsKLQkJCQlicmVhazsKIAkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEgc2Vjb25kIChyYWRpbykgdHVuZXIgbWF5IGJlIHByZXNlbnQgKi8KKwkJCQl0dW5lcjIgPSBlZXByb21fZGF0YVtpKzJdOworCQkJCXRfZm9ybWF0MiA9IGVlcHJvbV9kYXRhW2krMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0X2Zvcm1hdDIgPT0gMCkgeyAgLyogbm90IGEgVFYgdHVuZXI/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZlZS0+aGFzX3JhZGlvID0gMTsgLyogbXVzdCBiZSByYWRpbyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMHgwYjoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhZyAnSW5wdXRzJzogYWNjb3JkaW5nIHRvIEhhdXBwYXVnZSB0aGlzIGlzIHNwZWNpZmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBlYWNoIGRyaXZlciBmYW1pbHksIHNvIG5vIGdvb2QgYXNzdW1wdGlvbnMgY2FuIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWRlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvKiBjYXNlIDB4MGM6IHRhZyAnQmFsdW4nICovCisgICAgICAgICAgICAgICAgLyogY2FzZSAweDBkOiB0YWcgJ1RlbGV0ZXh0JyAqLworCiAJCWNhc2UgMHgwZToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhZzogJ1JhZGlvJyAqLwogCQkJdHZlZS0+aGFzX3JhZGlvID0gZWVwcm9tX2RhdGFbaSsxXTsKIAkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAweDBmOgorICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFnICdJUkluZm8nICovCisgICAgICAgICAgICAgICAgICAgICAgICB0dmVlLT5oYXNfaXIgPSBlZXByb21fZGF0YVtpKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvKiBjYXNlIDB4MTA6IHRhZyAnVkJJSW5mbycgKi8KKyAgICAgICAgICAgICAgICAvKiBjYXNlIDB4MTE6IHRhZyAnUUNJbmZvJyAqLworICAgICAgICAgICAgICAgIC8qIGNhc2UgMHgxMjogdGFnICdJbmZvQml0cycgKi8KKwogCQlkZWZhdWx0OgotCQkJZHByaW50aygxLCAiTm90IHN1cmUgd2hhdCB0byBkbyB3aXRoIHRhZyBbJTAyeF1cbiIsIHRhZyk7CisJCQl0dmVlcHJvbV9kYmcoIk5vdCBzdXJlIHdoYXQgdG8gZG8gd2l0aCB0YWcgWyUwMnhdXG4iLCB0YWcpOwogCQkJLyogZHVtcCB0aGUgcmVzdCBvZiB0aGUgcGFja2V0PyAqLwogCQl9Ci0KIAl9CiAKIAlpZiAoIWRvbmUpIHsKLQkJVFZFRVBST01fS0VSTl9FUlIoIlJhbiBvdXQgb2YgZGF0YSFcbiIpOworCQl0dmVlcHJvbV93YXJuKCJSYW4gb3V0IG9mIGRhdGEhXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzc3LDQ3ICs0ODMsNzIgQEAKIAkJdHZlZS0+cmV2X3N0cls0XSA9IDA7CiAJfQogCi0gICAgICAgIGlmIChoYXNSYWRpb1R1bmVyKHR1bmVyKSAmJiAhdHZlZS0+aGFzX3JhZGlvKSB7Ci0JICAgIFRWRUVQUk9NX0tFUk5fSU5GTygiVGhlIGVlcHJvbSBzYXlzIG5vIHJhZGlvIGlzIHByZXNlbnQsIGJ1dCB0aGUgdHVuZXIgdHlwZVxuIik7Ci0JICAgIFRWRUVQUk9NX0tFUk5fSU5GTygiaW5kaWNhdGVzIG90aGVyd2lzZS4gSSB3aWxsIGFzc3VtZSB0aGF0IHJhZGlvIGlzIHByZXNlbnQuXG4iKTsKKyAgICAgICAgaWYgKGhhc1JhZGlvVHVuZXIodHVuZXIxKSAmJiAhdHZlZS0+aGFzX3JhZGlvKSB7CisJICAgIHR2ZWVwcm9tX2luZm8oIlRoZSBlZXByb20gc2F5cyBubyByYWRpbyBpcyBwcmVzZW50LCBidXQgdGhlIHR1bmVyIHR5cGVcbiIpOworCSAgICB0dmVlcHJvbV9pbmZvKCJpbmRpY2F0ZXMgb3RoZXJ3aXNlLiBJIHdpbGwgYXNzdW1lIHRoYXQgcmFkaW8gaXMgcHJlc2VudC5cbiIpOwogICAgICAgICAgICAgdHZlZS0+aGFzX3JhZGlvID0gMTsKICAgICAgICAgfQogCi0JaWYgKHR1bmVyIDwgc2l6ZW9mKGhhdXBwYXVnZV90dW5lcikvc2l6ZW9mKHN0cnVjdCBIQVVQUEFVR0VfVFVORVIpKSB7Ci0JCXR2ZWUtPnR1bmVyX3R5cGUgPSBoYXVwcGF1Z2VfdHVuZXJbdHVuZXJdLmlkOwotCQl0X25hbWUgPSBoYXVwcGF1Z2VfdHVuZXJbdHVuZXJdLm5hbWU7CisJaWYgKHR1bmVyMSA8IHNpemVvZihoYXVwcGF1Z2VfdHVuZXIpL3NpemVvZihzdHJ1Y3QgSEFVUFBBVUdFX1RVTkVSKSkgeworCQl0dmVlLT50dW5lcl90eXBlID0gaGF1cHBhdWdlX3R1bmVyW3R1bmVyMV0uaWQ7CisJCXRfbmFtZTEgPSBoYXVwcGF1Z2VfdHVuZXJbdHVuZXIxXS5uYW1lOwogCX0gZWxzZSB7Ci0JCXRfbmFtZSA9ICI8dW5rbm93bj4iOworCQl0X25hbWUxID0gInVua25vd24iOworCX0KKworCWlmICh0dW5lcjIgPCBzaXplb2YoaGF1cHBhdWdlX3R1bmVyKS9zaXplb2Yoc3RydWN0IEhBVVBQQVVHRV9UVU5FUikpIHsKKwkJdHZlZS0+dHVuZXIyX3R5cGUgPSBoYXVwcGF1Z2VfdHVuZXJbdHVuZXIyXS5pZDsKKwkJdF9uYW1lMiA9IGhhdXBwYXVnZV90dW5lclt0dW5lcjJdLm5hbWU7CisJfSBlbHNlIHsKKwkJdF9uYW1lMiA9ICJ1bmtub3duIjsKIAl9CiAKIAl0dmVlLT50dW5lcl9mb3JtYXRzID0gMDsKLQl0X2ZtdF9uYW1lID0gIjxub25lPiI7Ci0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlpZiAodF9mb3JtYXQgJiAoMTw8aSkpIHsKKwl0dmVlLT50dW5lcjJfZm9ybWF0cyA9IDA7CisJZm9yIChpID0gaiA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKHRfZm9ybWF0MSAmICgxIDw8IGkpKSB7CiAJCQl0dmVlLT50dW5lcl9mb3JtYXRzIHw9IGhhdXBwYXVnZV90dW5lcl9mbXRbaV0uaWQ7Ci0JCQkvKiB5dWNrICovCi0JCQl0X2ZtdF9uYW1lID0gaGF1cHBhdWdlX3R1bmVyX2ZtdFtpXS5uYW1lOworCQkJdF9mbXRfbmFtZTFbaisrXSA9IGhhdXBwYXVnZV90dW5lcl9mbXRbaV0ubmFtZTsKIAkJfQorICAgICAgICAgICAgICAgIGlmICh0X2Zvcm1hdDIgJiAoMSA8PCBpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHZlZS0+dHVuZXIyX2Zvcm1hdHMgfD0gaGF1cHBhdWdlX3R1bmVyX2ZtdFtpXS5pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRfZm10X25hbWUyW2orK10gPSBoYXVwcGF1Z2VfdHVuZXJfZm10W2ldLm5hbWU7CisgICAgICAgICAgICAgICAgfQogCX0KIAotCi0JVFZFRVBST01fS0VSTl9JTkZPKCJIYXVwcGF1Z2U6IG1vZGVsID0gJWQsIHJldiA9ICVzLCBzZXJpYWwjID0gJWRcbiIsCi0JCSAgIHR2ZWUtPm1vZGVsLAotCQkgICB0dmVlLT5yZXZfc3RyLAotCQkgICB0dmVlLT5zZXJpYWxfbnVtYmVyKTsKLQlUVkVFUFJPTV9LRVJOX0lORk8oInR1bmVyID0gJXMgKGlkeCA9ICVkLCB0eXBlID0gJWQpXG4iLAotCQkgICB0X25hbWUsCi0JCSAgIHR1bmVyLAotCQkgICB0dmVlLT50dW5lcl90eXBlKTsKLQlUVkVFUFJPTV9LRVJOX0lORk8oInR1bmVyIGZtdCA9ICVzIChlZXByb20gPSAweCUwMngsIHY0bDIgPSAweCUwOHgpXG4iLAotCQkgICB0X2ZtdF9uYW1lLAotCQkgICB0X2Zvcm1hdCwKLQkJICAgdHZlZS0+dHVuZXJfZm9ybWF0cyk7Ci0KLQlUVkVFUFJPTV9LRVJOX0lORk8oImF1ZGlvX3Byb2Nlc3NvciA9ICVzICh0eXBlID0gJWQpXG4iLAotCQkgICBTVFJNKHNuZHR5cGUsdHZlZS0+YXVkaW9fcHJvY2Vzc29yKSwKKwl0dmVlcHJvbV9pbmZvKCJIYXVwcGF1Z2UgbW9kZWwgJWQsIHJldiAlcywgc2VyaWFsIyAlZFxuIiwKKwkJICAgdHZlZS0+bW9kZWwsIHR2ZWUtPnJldl9zdHIsIHR2ZWUtPnNlcmlhbF9udW1iZXIpOworCXR2ZWVwcm9tX2luZm8oInR1bmVyIG1vZGVsIGlzICVzIChpZHggJWQsIHR5cGUgJWQpXG4iLAorCQkgICB0X25hbWUxLCB0dW5lcjEsIHR2ZWUtPnR1bmVyX3R5cGUpOworCXR2ZWVwcm9tX2luZm8oIlRWIHN0YW5kYXJkcyVzJXMlcyVzJXMlcyVzJXMgKGVlcHJvbSAweCUwMngpXG4iLAorCQkgICB0X2ZtdF9uYW1lMVswXSwgdF9mbXRfbmFtZTFbMV0sIHRfZm10X25hbWUxWzJdLCB0X2ZtdF9uYW1lMVszXSwKKwkJICAgdF9mbXRfbmFtZTFbNF0sIHRfZm10X25hbWUxWzVdLCB0X2ZtdF9uYW1lMVs2XSwgdF9mbXRfbmFtZTFbN10sCisgICAgICAgICAgICAgICAgICAgdF9mb3JtYXQxKTsKKyAgICAgICAgaWYgKHR1bmVyMikgeworICAgICAgICAgICAgICAgIHR2ZWVwcm9tX2luZm8oInNlY29uZCB0dW5lciBtb2RlbCBpcyAlcyAoaWR4ICVkLCB0eXBlICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbmFtZTIsIHR1bmVyMiwgdHZlZS0+dHVuZXIyX3R5cGUpOworICAgICAgICB9CisgICAgICAgIGlmICh0X2Zvcm1hdDIpIHsKKyAgICAgICAgICAgICAgICB0dmVlcHJvbV9pbmZvKCJUViBzdGFuZGFyZHMlcyVzJXMlcyVzJXMlcyVzIChlZXByb20gMHglMDJ4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZm10X25hbWUyWzBdLCB0X2ZtdF9uYW1lMlsxXSwgdF9mbXRfbmFtZTJbMl0sIHRfZm10X25hbWUyWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mbXRfbmFtZTJbNF0sIHRfZm10X25hbWUyWzVdLCB0X2ZtdF9uYW1lMls2XSwgdF9mbXRfbmFtZTJbN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Zvcm1hdDIpOworICAgICAgICB9CisJdHZlZXByb21faW5mbygiYXVkaW8gcHJvY2Vzc29yIGlzICVzIChpZHggJWQpXG4iLAorCQkgICBTVFJNKGF1ZGlvSUMsIHR2ZWUtPmF1ZGlvX3Byb2Nlc3NvciksCiAJCSAgIHR2ZWUtPmF1ZGlvX3Byb2Nlc3Nvcik7Ci0KKyAgICAgICAgaWYgKHR2ZWUtPmRlY29kZXJfcHJvY2Vzc29yKSB7CisgICAgICAgICAgICAgICAgdHZlZXByb21faW5mbygiZGVjb2RlciBwcm9jZXNzb3IgaXMgJXMgKGlkeCAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTVFJNKGRlY29kZXJJQywgdHZlZS0+ZGVjb2Rlcl9wcm9jZXNzb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZlZS0+ZGVjb2Rlcl9wcm9jZXNzb3IpOworICAgICAgICB9CisgICAgICAgIGlmICh0dmVlLT5oYXNfaXIgPT0gMikKKyAgICAgICAgICAgICAgICB0dmVlcHJvbV9pbmZvKCJoYXMgJXNyYWRpb1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZlZS0+aGFzX3JhZGlvID8gIiIgOiAibm8gIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0dmVlcHJvbV9pbmZvKCJoYXMgJXNyYWRpbywgaGFzICVzSVIgcmVtb3RlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dmVlLT5oYXNfcmFkaW8gPyAiIiA6ICJubyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dmVlLT5oYXNfaXIgPyAiIiA6ICJubyAiKTsKIH0KIEVYUE9SVF9TWU1CT0wodHZlZXByb21faGF1cHBhdWdlX2FuYWxvZyk7CiAKQEAgLTQyOSw0MCArNTYwLDMxIEBACiAJdW5zaWduZWQgY2hhciBidWY7CiAJaW50IGVycjsKIAotCWRwcmludGsoMSwgIiVzXG4iLF9fRlVOQ1RJT05fXyk7CiAJYnVmID0gMDsKLQlpZiAoMSAhPSAoZXJyID0gaTJjX21hc3Rlcl9zZW5kKGMsJmJ1ZiwxKSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAidHZlZXByb20oJXMpOiBIdWgsIG5vIGVlcHJvbSBwcmVzZW50IChlcnI9JWQpP1xuIiwKLQkJICAgICAgIGMtPm5hbWUsZXJyKTsKKwlpZiAoMSAhPSAoZXJyID0gaTJjX21hc3Rlcl9zZW5kKGMsICZidWYsIDEpKSkgeworCQl0dmVlcHJvbV9pbmZvKCJIdWgsIG5vIGVlcHJvbSBwcmVzZW50IChlcnI9JWQpP1xuIiwgZXJyKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAobGVuICE9IChlcnIgPSBpMmNfbWFzdGVyX3JlY3YoYyxlZWRhdGEsbGVuKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidHZlZXByb20oJXMpOiBpMmMgZWVwcm9tIHJlYWQgZXJyb3IgKGVycj0lZClcbiIsCi0JCSAgICAgICBjLT5uYW1lLGVycik7CisJaWYgKGxlbiAhPSAoZXJyID0gaTJjX21hc3Rlcl9yZWN2KGMsIGVlZGF0YSwgbGVuKSkpIHsKKwkJdHZlZXByb21fd2FybigiaTJjIGVlcHJvbSByZWFkIGVycm9yIChlcnI9JWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gLTE7CiAJfQorICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgIHR2ZWVwcm9tX2luZm8oImZ1bGwgMjU2LWJ5dGUgZWVwcm9tIGR1bXA6XG4iKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09IChpICUgMTYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dmVlcHJvbV9pbmZvKCIlMDJ4OiIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIgJTAyeCIsIGVlZGF0YVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMTUgPT0gKGkgJSAxNikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wodHZlZXByb21fcmVhZCk7CiAKLSNpZiAwCi1pbnQgdHZlZXByb21fZHVtcCh1bnNpZ25lZCBjaGFyICplZWRhdGEsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0KLQlkcHJpbnRrKDEsICIlc1xuIixfX0ZVTkNUSU9OX18pOwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlpZiAoMCA9PSAoaSAlIDE2KSkKLQkJCXByaW50ayhLRVJOX0lORk8gInR2ZWVwcm9tOiAlMDJ4OiIsaSk7Ci0JCXByaW50aygiICUwMngiLGVlZGF0YVtpXSk7Ci0JCWlmICgxNSA9PSAoaSAlIDE2KSkKLQkJCXByaW50aygiXG4iKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHR2ZWVwcm9tX2R1bXApOwotI2VuZGlmICAvKiAgMCAgKi8KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIG5lZWRlZCBmb3IgaXZ0di5zZi5uZXQgYXQgdGhlIG1vbWVudC4gIFNob3VsZCBnbyBhd2F5IGluIHRoZSBsb25nICAgICAgICovCiAvKiBydW4sIGp1c3QgY2FsbCB0aGUgZXhwb3J0ZWQgdHZlZXByb21fKiBkaXJlY3RseSwgdGhlcmUgaXMgbm8gcG9pbnQgaW4gICAqLwpAQCAtNDk1LDEyICs2MTcsMTMgQEAKIAkJYnVmID0ga21hbGxvYygyNTYsR0ZQX0tFUk5FTCk7CiAJCW1lbXNldChidWYsMCwyNTYpOwogCQl0dmVlcHJvbV9yZWFkKGNsaWVudCxidWYsMjU2KTsKLQkJdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZygmZWVwcm9tLGJ1Zik7CisJCXR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2coY2xpZW50LCAmZWVwcm9tLGJ1Zik7CiAJCWtmcmVlKGJ1Zik7CiAJCWVlcHJvbV9wcm9wc1swXSA9IGVlcHJvbS50dW5lcl90eXBlOwogCQllZXByb21fcHJvcHNbMV0gPSBlZXByb20udHVuZXJfZm9ybWF0czsKIAkJZWVwcm9tX3Byb3BzWzJdID0gZWVwcm9tLm1vZGVsOwogCQllZXByb21fcHJvcHNbM10gPSBlZXByb20ucmV2aXNpb247CisJCWVlcHJvbV9wcm9wc1s0XSA9IGVlcHJvbS5oYXNfcmFkaW87CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTE1LDggKzYzOCw2IEBACiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAotCWRwcmludGsoMSwiJXM6IGlkIDB4JXggQCAweCV4XG4iLF9fRlVOQ1RJT05fXywKLQkgICAgICAgYWRhcHRlci0+aWQsIGFkZHJlc3MgPDwgMSk7CiAJY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBjbGllbnQpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTMzLDggKzY1NCw3IEBACiBzdGF0aWMgaW50CiB0dmVlcHJvbV9hdHRhY2hfYWRhcHRlciAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewotCWRwcmludGsoMSwiJXM6IGlkIDB4JXhcbiIsX19GVU5DVElPTl9fLGFkYXB0ZXItPmlkKTsKLQlpZiAoYWRhcHRlci0+aWQgIT0gKEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0JUODQ4KSkKKwlpZiAoYWRhcHRlci0+aWQgIT0gSTJDX0hXX0JfQlQ4NDgpCiAJCXJldHVybiAwOwogCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgdHZlZXByb21fZGV0ZWN0X2NsaWVudCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2bWl4ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZtaXhlci5jCmluZGV4IDUxYjk5Y2QuLmQ4NmUwOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZtaXhlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZtaXhlci5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogdHZtaXhlci5jLHYgMS44IDIwMDUvMDYvMTIgMDQ6MTk6MTkgbWNoZWhhYiBFeHAgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTkxLDcgKzkwLDcgQEAKICAgICAgICAgaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7CiAgICAgICAgICAgICAgICAgbWl4ZXJfaW5mbyBpbmZvOwogICAgICAgICAgICAgICAgIHN0cmxjcHkoaW5mby5pZCwgInR2IGNhcmQiLCBzaXplb2YoaW5mby5pZCkpOwotICAgICAgICAgICAgICAgIHN0cmxjcHkoaW5mby5uYW1lLCBpMmNfY2xpZW50bmFtZShjbGllbnQpLCBzaXplb2YoaW5mby5uYW1lKSk7CisgICAgICAgICAgICAgICAgc3RybGNweShpbmZvLm5hbWUsIGNsaWVudC0+bmFtZSwgc2l6ZW9mKGluZm8ubmFtZSkpOwogICAgICAgICAgICAgICAgIGluZm8ubW9kaWZ5X2NvdW50ZXIgPSA0MiAvKiBGSVhNRSAqLzsKICAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLCBzaXplb2YoaW5mbykpKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CkBAIC0xMDAsNyArOTksNyBAQAogICAgICAgICBpZiAoY21kID09IFNPVU5EX09MRF9NSVhFUl9JTkZPKSB7CiAgICAgICAgICAgICAgICAgX29sZF9taXhlcl9pbmZvIGluZm87CiAgICAgICAgICAgICAgICAgc3RybGNweShpbmZvLmlkLCAidHYgY2FyZCIsIHNpemVvZihpbmZvLmlkKSk7Ci0gICAgICAgICAgICAgICAgc3RybGNweShpbmZvLm5hbWUsIGkyY19jbGllbnRuYW1lKGNsaWVudCksIHNpemVvZihpbmZvLm5hbWUpKTsKKyAgICAgICAgICAgICAgICBzdHJsY3B5KGluZm8ubmFtZSwgY2xpZW50LT5uYW1lLCBzaXplb2YoaW5mby5uYW1lKSk7CiAgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtMjc2LDkgKzI3NSw5IEBACiAjZWxzZQogCS8qIFRWIGNhcmQgPz8/ICovCiAJc3dpdGNoIChjbGllbnQtPmFkYXB0ZXItPmlkKSB7Ci0JY2FzZSBJMkNfQUxHT19CSVQgfCBJMkNfSFdfU01CVVNfVk9PRE9PMzoKLQljYXNlIEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0JUODQ4OgotCWNhc2UgSTJDX0FMR09fQklUIHwgSTJDX0hXX0JfUklWQToKKwljYXNlIEkyQ19IV19TTUJVU19WT09ET08zOgorCWNhc2UgSTJDX0hXX0JfQlQ4NDg6CisJY2FzZSBJMkNfSFdfQl9SSVZBOgogCQkvKiBvaywgaGF2ZSBhIGxvb2sgLi4uICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yOTUsNyArMjk0LDcgQEAKIAkJCWRldmljZXNbaV0uZGV2ID0gTlVMTDsKIAkJCWRldmljZXNbaV0ubWlub3IgPSAtMTsKIAkJCXByaW50aygidHZtaXhlcjogJXMgdW5yZWdpc3RlcmVkICgjMSlcbiIsCi0JCQkgICAgICAgaTJjX2NsaWVudG5hbWUoY2xpZW50KSk7CisJCQkgICAgICAgY2xpZW50LT5uYW1lKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtMzU0LDcgKzM1Myw3IEBACiAJCWlmIChkZXZpY2VzW2ldLm1pbm9yICE9IC0xKSB7CiAJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGRldmljZXNbaV0ubWlub3IpOwogCQkJcHJpbnRrKCJ0dm1peGVyOiAlcyB1bnJlZ2lzdGVyZWQgKCMyKVxuIiwKLQkJCSAgICAgICBpMmNfY2xpZW50bmFtZShkZXZpY2VzW2ldLmRldikpOworCQkJICAgICAgIGRldmljZXNbaV0uZGV2LT5uYW1lKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYwppbmRleCA3MGVjYmRiLi41OWJiNzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogdjRsMS1jb21wYXQuYyx2IDEuOSAyMDA1LzA2LzEyIDA0OjE5OjE5IG1jaGVoYWIgRXhwICQKICAqCiAgKglWaWRlbyBmb3IgTGludXggVHdvCiAgKglCYWNrd2FyZCBDb21wYXRpYmlsaXR5IExheWVyCkBAIC02MDQsOSArNjAzLDYgQEAKIAkJCWRwcmludGsoIlZJRElPQ0dQSUNUIC8gVklESU9DX0dfRk1UOiAlZFxuIixlcnIpOwogCQkJYnJlYWs7CiAJCX0KLSNpZiAwIC8qIEZJWE1FICovCi0JCXBpY3QtPmRlcHRoICAgPSBmbXQyLT5mbXQucGl4LmRlcHRoOwotI2VuZGlmCiAJCXBpY3QtPnBhbGV0dGUgPSBwaXhlbGZvcm1hdF90b19wYWxldHRlKAogCQkJZm10Mi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CiAJCWJyZWFrOwpAQCAtNzA3LDEzICs3MDMsNyBAQAogCX0KIAljYXNlIFZJRElPQ1NUVU5FUjogLyogIHNlbGVjdCBhIHR1bmVyIGlucHV0ICAqLwogCXsKLSNpZiAwIC8qIEZJWE1FICovCi0JCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1NfSU5QVVQsICZpKTsKLQkJaWYgKGVyciA8IDApCi0JCQlkcHJpbnRrKCJWSURJT0NTVFVORVIgLyBWSURJT0NfU19JTlBVVDogJWRcbiIsZXJyKTsKLSNlbHNlCiAJCWVyciA9IDA7Ci0jZW5kaWYKIAkJYnJlYWs7CiAJfQogCWNhc2UgVklESU9DR0ZSRVE6IC8qICBnZXQgZnJlcXVlbmN5ICAqLwpAQCAtODUyLDEyICs4NDIsNiBAQAogCQllcnIgPSAwOwogCQlicmVhazsKIAl9Ci0jaWYgMAotCWNhc2UgVklESU9DR01CVUY6Ci0JCS8qIHY0bDIgZHJpdmVycyBtdXN0IGltcGxlbWVudCB0aGF0IHRoZW1zZWxmLiAgVGhlCi0JCSAgIG1tYXAoKSBkaWZmZXJlbmNlcyBjYW4ndCBiZSB0cmFuc2xhdGVkIGZ1bGx5Ci0JCSAgIHRyYW5zcGFyZW50LCB0aHVzIHRoZXJlIGlzIG5vIHBvaW50IHRvIHRyeSB0aGF0ICovCi0jZW5kaWYKIAljYXNlIFZJRElPQ01DQVBUVVJFOiAvKiAgY2FwdHVyZSBhIGZyYW1lICAqLwogCXsKIAkJc3RydWN0IHZpZGVvX21tYXAJKm1tID0gYXJnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jCmluZGV4IGI1ZTBjZjMuLjU5N2I4ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKQEAgLTg0LDIwICs4NCw2IEBACiAgKiAgVmlkZW8gU3RhbmRhcmQgT3BlcmF0aW9ucyAoY29udHJpYnV0ZWQgYnkgTWljaGFlbCBTY2hpbWVrKQogICovCiAKLSNpZiAwIC8qIHNlZW1zIHRvIGhhdmUgbm8gdXNlcnMgKi8KLS8qIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIG1ldGhvZCB0byBkZWFsIHdpdGggdGhlIGZyYW1lcmF0ZSBmaWVsZHMuIE1vcmUKLSAgIHNvcGhpc3RpY2F0ZWQgZHJpdmVycyB3aWxsIGFjY2VzcyB0aGUgZmllbGRzIGRpcmVjdGx5LiAqLwotdW5zaWduZWQgaW50Ci12NGwyX3ZpZGVvX3N0ZF9mcHMoc3RydWN0IHY0bDJfc3RhbmRhcmQgKnZzKQotewotCWlmICh2cy0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yID4gMCkKLQkJcmV0dXJuICgoKHZzLT5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciA8PCA4KSAvCi0JCQkgdnMtPmZyYW1lcGVyaW9kLm51bWVyYXRvcikgKwotCQkJKDEgPDwgNykpIC8gKDEgPDwgOCk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHY0bDJfdmlkZW9fc3RkX2Zwcyk7Ci0jZW5kaWYKIAogLyogRmlsbCBpbiB0aGUgZmllbGRzIG9mIGEgdjRsMl9zdGFuZGFyZCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIHRoZQogICAgJ2lkJyBhbmQgJ3RyYW5zbWlzc2lvbicgcGFyYW1ldGVycy4gIFJldHVybnMgbmVnYXRpdmUgb24gZXJyb3IuICAqLwpAQCAtMjEzLDEwICsxOTksNiBAQAogCVtfSU9DX05SKFZJRElPQ19FTlVNX0ZNVCldICAgICAgID0gIlZJRElPQ19FTlVNX0ZNVCIsCiAJW19JT0NfTlIoVklESU9DX0dfRk1UKV0gICAgICAgICAgPSAiVklESU9DX0dfRk1UIiwKIAlbX0lPQ19OUihWSURJT0NfU19GTVQpXSAgICAgICAgICA9ICJWSURJT0NfU19GTVQiLAotI2lmIDAKLQlbX0lPQ19OUihWSURJT0NfR19DT01QKV0gICAgICAgICA9ICJWSURJT0NfR19DT01QIiwKLQlbX0lPQ19OUihWSURJT0NfU19DT01QKV0gICAgICAgICA9ICJWSURJT0NfU19DT01QIiwKLSNlbmRpZgogCVtfSU9DX05SKFZJRElPQ19SRVFCVUZTKV0gICAgICAgID0gIlZJRElPQ19SRVFCVUZTIiwKIAlbX0lPQ19OUihWSURJT0NfUVVFUllCVUYpXSAgICAgICA9ICJWSURJT0NfUVVFUllCVUYiLAogCVtfSU9DX05SKFZJRElPQ19HX0ZCVUYpXSAgICAgICAgID0gIlZJRElPQ19HX0ZCVUYiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYwppbmRleCAxNWY1YmI0Li41NWYxMjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IHZpZGVvLWJ1Zi1kdmIuYyx2IDEuNyAyMDA0LzEyLzA5IDEyOjUxOjM1IGtyYXhlbCBFeHAgJAogICoKICAqIHNvbWUgaGVscGVyIGZ1bmN0aW9uIGZvciBzaW1wbGUgRFZCIGNhcmRzIHdoaWNoIHNpbXBseSBETUEgdGhlCiAgKiBjb21wbGV0ZSB0cmFuc3BvcnQgc3RyZWFtIGFuZCBsZXQgdGhlIGNvbXB1dGVyIHNvcnQgZXZlcnl0aGluZyBlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYuYwppbmRleCA1YWZkYzc4Li41NzRiOGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiB2aWRlby1idWYuYyx2IDEuMTggMjAwNS8wMi8yNCAxMzozMjozMCBrcmF4ZWwgRXhwICQKICAqCiAgKiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgZm9yIHZpZGVvNGxpbnV4IGNhcHR1cmUgYnVmZmVycywgdG8gaGFuZGxlCiAgKiBtZW1vcnkgbWFuYWdlbWVudCBhbmQgUENJIERNQS4gIFJpZ2h0IG5vdyBidHR2ICsgc2FhNzEzNCB1c2UgaXQuCkBAIC0yNjgsMTAgKzI2NywxMCBAQAogCQlrZnJlZShkbWEtPnBhZ2VzKTsKIAkJZG1hLT5wYWdlcyA9IE5VTEw7CiAJfQotCWlmIChkbWEtPnZtYWxsb2MpIHsKLQkJdmZyZWUoZG1hLT52bWFsbG9jKTsKLQkJZG1hLT52bWFsbG9jID0gTlVMTDsKLQl9CisKKwl2ZnJlZShkbWEtPnZtYWxsb2MpOworCWRtYS0+dm1hbGxvYyA9IE5VTEw7CisKIAlpZiAoZG1hLT5idXNfYWRkcikgewogCQlkbWEtPmJ1c19hZGRyID0gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jCmluZGV4IDc2ZTg2ODEuLmQ4YTBmNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jCkBAIC0xLDgwICsxLDYwNiBAQAogLyoKLSAqIChpbmNvbXBsZXRlKSBEcml2ZXIgZm9yIHRoZSBWSU5PIChWaWRlbyBJbiBObyBPdXQpIHN5c3RlbSBmb3VuZCBpbiBTR0kgSW5keXMuCisgKiBEcml2ZXIgZm9yIHRoZSBWSU5PIChWaWRlbyBJbiBObyBPdXQpIHN5c3RlbSBmb3VuZCBpbiBTR0kgSW5keXMuCiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IE1pa2FlbCBOb3VzaWFpbmVuIDx0bW5vdXNpYUBjYy5odXQuZmk+CisgKgorICogQmFzZWQgb24gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGRyaXZlciBmb3IgMi40IGtlcm5lbHMgYnk6CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTGFkaXNsYXYgTWljaGwgPGxhZGlzQGxpbnV4LW1pcHMub3JnPgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKy8qCisgKiBUT0RPOgorICogLSByZW1vdmUgImhhY2tzIiBmcm9tIG1lbW9yeSBhbGxvY2F0aW9uIGNvZGUgYW5kIGltcGxlbWVudCBub3BhZ2UoKQorICogLSBjaGVjayBkZWNpbWF0aW9uLCBjYWxjdWxhdGluZyBhbmQgcmVwb3J0aW5nIGltYWdlIHNpemUgd2hlbgorICogICB1c2luZyBkZWNpbWF0aW9uCisgKiAtIGNoZWNrIHZpbm9fYWNxdWlyZV9pbnB1dCgpLCB2aW5vX3NldF9pbnB1dCgpIGFuZCBjaGFubmVsCisgKiAgIG93bmVyc2hpcCBoYW5kbGluZworICogLSByZXBvcnQgVklOTyBlcnJvci1pbnRlcnJ1cHRzIHZpYSBpb2N0bHMgPworICogLSBpbXBsZW1lbnQgcGljdHVyZSBjb250cm9scyAoYWxsIGltcGxlbWVudGVkPykKKyAqIC0gdXNlIG1hY3JvcyBmb3IgYm9vbGVhbiB2YWx1ZXMgKD8pCisgKiAtIGltcGxlbWVudCB1c2VyIG1vZGUgYnVmZmVycyBhbmQgb3ZlcmxheSAoPykKKyAqLworCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvd3JhcHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNpZmRlZiBDT05GSUdfS01PRAorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tc2dpLmg+CiAKLSNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisKICNpbmNsdWRlIDxhc20vcGFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZ2kvaXAyMi5oPgotI2luY2x1ZGUgPGFzbS9zZ2kvaHBjMy5oPgogI2luY2x1ZGUgPGFzbS9zZ2kvbWMuaD4KIAogI2luY2x1ZGUgInZpbm8uaCIKKyNpbmNsdWRlICJzYWE3MTkxLmgiCisjaW5jbHVkZSAiaW5keWNhbS5oIgogCi0vKiBkZWJ1Z2dpbmc/ICovCi0jaWYgMQotI2RlZmluZSBERUJVRyh4Li4uKSAgICAgcHJpbnRrKHgpOworLyogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBnZXQgbG90cyBhbmQgbG90cyBvZiAobW9zdGx5IHVzZWxlc3MpCisgKiBkZWJ1ZyBpbmZvLgorICogTm90ZSB0aGF0IHRoZSBkZWJ1ZyBvdXRwdXQgYWxzbyBzbG93cyBkb3duIHRoZSBkcml2ZXIgc2lnbmlmaWNhbnRseSAqLworLy8gI2RlZmluZSBWSU5PX0RFQlVHCisKKyNkZWZpbmUgVklOT19NT0RVTEVfVkVSU0lPTiAiMC4wLjMiCisjZGVmaW5lIFZJTk9fVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDMpCisKK01PRFVMRV9ERVNDUklQVElPTigiU0dJIFZJTk8gVmlkZW80TGludXgyIGRyaXZlciIpOworTU9EVUxFX1ZFUlNJT04oVklOT19NT0RVTEVfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKCJNaWthZWwgTm91c2lhaW5lbiA8dG1ub3VzaWFAY2MuaHV0LmZpPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIG1lbV9tYXBfcmVzZXJ2ZShwKSBzZXRfYml0KFBHX3Jlc2VydmVkLCAmKChwKS0+ZmxhZ3MpKQorI2RlZmluZSBtZW1fbWFwX3VucmVzZXJ2ZShwKSBjbGVhcl9iaXQoUEdfcmVzZXJ2ZWQsICYoKHApLT5mbGFncykpCisKKyNpZmRlZiBWSU5PX0RFQlVHCisjZGVmaW5lIGRwcmludGsoeC4uLikgcHJpbnRrKCJWSU5POiAiIHgpOwogI2Vsc2UKLSNkZWZpbmUgREVCVUcoeC4uLikKKyNkZWZpbmUgZHByaW50ayh4Li4uKQogI2VuZGlmCiAKKyNkZWZpbmUgVklOT19OT19DSEFOTkVMCQkJMAorI2RlZmluZSBWSU5PX0NIQU5ORUxfQQkJCTEKKyNkZWZpbmUgVklOT19DSEFOTkVMX0IJCQkyCiAKLS8qIFZJTk8gQVNJQyByZWdpc3RlcnMgKi8KLXN0cnVjdCBzZ2lfdmlubyAqdmlubzsKKyNkZWZpbmUgVklOT19QQUxfV0lEVEgJCQk3NjgKKyNkZWZpbmUgVklOT19QQUxfSEVJR0hUCQkJNTc2CisjZGVmaW5lIFZJTk9fTlRTQ19XSURUSAkJCTY0MAorI2RlZmluZSBWSU5PX05UU0NfSEVJR0hUCQk0ODAKIAotc3RhdGljIGNvbnN0IGNoYXIgKnZpbm9zdHIgPSAiVklOTyBJbmR5Q2FtL1RWIjsKLXN0YXRpYyBpbnQgdGhyZXNob2xkX2EgPSA1MTI7Ci1zdGF0aWMgaW50IHRocmVzaG9sZF9iID0gNTEyOworI2RlZmluZSBWSU5PX01JTl9XSURUSAkJCTMyCisjZGVmaW5lIFZJTk9fTUlOX0hFSUdIVAkJCTMyCiAKLXN0cnVjdCB2aW5vX2RldmljZSB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OwotI2RlZmluZSBWSU5PX0NIQU5fQQkJMQotI2RlZmluZSBWSU5PX0NIQU5fQgkJMgotCWludCBjaGFuOworI2RlZmluZSBWSU5PX0NMSVBQSU5HX1NUQVJUX09ERF9EMQkxCisjZGVmaW5lIFZJTk9fQ0xJUFBJTkdfU1RBUlRfT0REX1BBTAkxCisjZGVmaW5lIFZJTk9fQ0xJUFBJTkdfU1RBUlRfT0REX05UU0MJMQorCisjZGVmaW5lIFZJTk9fQ0xJUFBJTkdfU1RBUlRfRVZFTl9EMQkyCisjZGVmaW5lIFZJTk9fQ0xJUFBJTkdfU1RBUlRfRVZFTl9QQUwJMgorI2RlZmluZSBWSU5PX0NMSVBQSU5HX1NUQVJUX0VWRU5fTlRTQwkyCisKKyNkZWZpbmUgVklOT19JTlBVVF9DSEFOTkVMX0NPVU5UCTMKKworI2RlZmluZSBWSU5PX0lOUFVUX05PTkUJCQktMQorI2RlZmluZSBWSU5PX0lOUFVUX0NPTVBPU0lURQkJMAorI2RlZmluZSBWSU5PX0lOUFVUX1NWSURFTwkJMQorI2RlZmluZSBWSU5PX0lOUFVUX0QxCQkJMgorCisjZGVmaW5lIFZJTk9fUEFHRV9SQVRJTwkJCShQQUdFX1NJWkUgLyBWSU5PX1BBR0VfU0laRSkKKworI2RlZmluZSBWSU5PX0ZJRk9fVEhSRVNIT0xEX0RFRkFVTFQJNTEyCisKKy8qI2RlZmluZSBWSU5PX0ZSQU1FQlVGRkVSX1NJWkUJCShWSU5PX1BBTF9XSURUSCAqIFZJTk9fUEFMX0hFSUdIVCAqIDQgXAorICArIDIgKiBQQUdFX1NJWkUpKi8KKyNkZWZpbmUgVklOT19GUkFNRUJVRkZFUl9TSVpFCQkoKFZJTk9fUEFMX1dJRFRIIFwKKwkJCQkJICAqIFZJTk9fUEFMX0hFSUdIVCAqIDQgXAorCQkJCQkgICsgMyAqIFBBR0VfU0laRSkgJiB+KFBBR0VfU0laRSAtIDEpKQorCisjZGVmaW5lIFZJTk9fRlJBTUVCVUZGRVJfTUFYX0NPVU5UCTgKKworI2RlZmluZSBWSU5PX0ZSQU1FQlVGRkVSX1VOVVNFRAkJMAorI2RlZmluZSBWSU5PX0ZSQU1FQlVGRkVSX0lOX1VTRQkJMQorI2RlZmluZSBWSU5PX0ZSQU1FQlVGRkVSX1JFQURZCQkyCisKKyNkZWZpbmUgVklOT19RVUVVRV9FUlJPUgkJLTEKKyNkZWZpbmUgVklOT19RVUVVRV9NQUdJQwkJMHgyMDA1MDEyNQorCisjZGVmaW5lIFZJTk9fTUVNT1JZX05PTkUJCTAKKyNkZWZpbmUgVklOT19NRU1PUllfTU1BUAkJMQorI2RlZmluZSBWSU5PX01FTU9SWV9VU0VSUFRSCQkyCisKKyNkZWZpbmUgVklOT19EVU1NWV9ERVNDX0NPVU5UCQk0CisjZGVmaW5lIFZJTk9fREVTQ19GRVRDSF9ERUxBWQkJNQkvKiBtaWNyb3NlY29uZHMgKi8KKworLyogdGhlIG51bWJlciBpcyB0aGUgaW5kZXggZm9yIHZpbm9fZGF0YV9mb3JtYXRzICovCisjZGVmaW5lIFZJTk9fREFUQV9GTVRfTk9ORQkJLTEKKyNkZWZpbmUgVklOT19EQVRBX0ZNVF9HUkVZCQkwCisjZGVmaW5lIFZJTk9fREFUQV9GTVRfUkdCMzMyCQkxCisjZGVmaW5lIFZJTk9fREFUQV9GTVRfUkdCMzIJCTIKKyNkZWZpbmUgVklOT19EQVRBX0ZNVF9ZVVYJCTMKKy8vI2RlZmluZSBWSU5PX0RBVEFfRk1UX1JHQjI0CQk0CisKKyNkZWZpbmUgVklOT19EQVRBX0ZNVF9DT1VOVAkJNAorCisjZGVmaW5lIFZJTk9fREFUQV9OT1JNX05PTkUJCS0xCisjZGVmaW5lIFZJTk9fREFUQV9OT1JNX05UU0MJCTAKKyNkZWZpbmUgVklOT19EQVRBX05PUk1fUEFMCQkxCisjZGVmaW5lIFZJTk9fREFUQV9OT1JNX1NFQ0FNCQkyCisjZGVmaW5lIFZJTk9fREFUQV9OT1JNX0QxCQkzCisvKiBUaGUgZm9sbG93aW5nIGlzIGEgc3BlY2lhbCBlbnRyeSB0aGF0IGNhbiBiZSB1c2VkIHRvCisgKiBhdXRvZGV0ZWN0IHRoZSBub3JtLiAqLworI2RlZmluZSBWSU5PX0RBVEFfTk9STV9BVVRPCQkweGZmCisKKyNkZWZpbmUgVklOT19EQVRBX05PUk1fQ09VTlQJCTQKKworLyogSW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgKi8KKworc3RydWN0IHZpbm9faW5wdXQgeworCWNoYXIgKm5hbWU7CisJdjRsMl9zdGRfaWQgc3RkOworfTsKKworc3RydWN0IHZpbm9fY2xpcHBpbmcgeworCXVuc2lnbmVkIGludCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b207Cit9OworCitzdHJ1Y3Qgdmlub19kYXRhX2Zvcm1hdCB7CisJLyogdGhlIGRlc2NyaXB0aW9uICovCisJY2hhciAqZGVzY3JpcHRpb247CisJLyogYnl0ZXMgcGVyIHBpeGVsICovCisJdW5zaWduZWQgaW50IGJwcDsKKwkvKiBWNEwyIGZvdXJjYyBjb2RlICovCisJX191MzIgcGl4ZWxmb3JtYXQ7CisJLyogVjRMMiBjb2xvcnNwYWNlIChkdWghKSAqLworCWVudW0gdjRsMl9jb2xvcnNwYWNlIGNvbG9yc3BhY2U7Cit9OworCitzdHJ1Y3Qgdmlub19kYXRhX25vcm0geworCWNoYXIgKmRlc2NyaXB0aW9uOworCXVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OworCXN0cnVjdCB2aW5vX2NsaXBwaW5nIG9kZDsKKwlzdHJ1Y3Qgdmlub19jbGlwcGluZyBldmVuOworCisJdjRsMl9zdGRfaWQgc3RkOworCXVuc2lnbmVkIGludCBmcHNfbWluLCBmcHNfbWF4OworCV9fdTMyIGZyYW1lbGluZXM7Cit9OworCitzdHJ1Y3Qgdmlub19kZXNjcmlwdG9yX3RhYmxlIHsKKwkvKiB0aGUgbnVtYmVyIG9mIFBBR0VfU0laRSBzaXplZCBwYWdlcyBpbiB0aGUgYnVmZmVyICovCisJdW5zaWduZWQgaW50IHBhZ2VfY291bnQ7CisJLyogdmlydHVhbCAoa21hbGxvYydkKSBwb2ludGVycyB0byB0aGUgYWN0dWFsIGRhdGEKKwkgKiAoaW4gUEFHRV9TSVpFIGNodW5rcywgdXNlZCB3aXRoIG1tYXAgc3RyZWFtaW5nKSAqLworCXVuc2lnbmVkIGxvbmcgKnZpcnR1YWw7CisKKwkvKiBjcHUgYWRkcmVzcyBmb3IgdGhlIFZJTk8gZGVzY3JpcHRvciB0YWJsZQorCSAqIChjb250YWlucyBETUEgYWRkcmVzc2VzLCBWSU5PX1BBR0VfU0laRSBjaHVua3MpICovCisJdW5zaWduZWQgbG9uZyAqZG1hX2NwdTsKKwkvKiBkbWEgYWRkcmVzcyBmb3IgdGhlIFZJTk8gZGVzY3JpcHRvciB0YWJsZQorCSAqIChjb250YWlucyBETUEgYWRkcmVzc2VzLCBWSU5PX1BBR0VfU0laRSBjaHVua3MpICovCisJZG1hX2FkZHJfdCBkbWE7Cit9OworCitzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciB7CisJLyogaWRlbnRpZmllciBudWJtZXIgKi8KKwl1bnNpZ25lZCBpbnQgaWQ7CisJLyogdGhlIGxlbmd0aCBvZiB0aGUgd2hvbGUgYnVmZmVyICovCisJdW5zaWduZWQgaW50IHNpemU7CisJLyogdGhlIGxlbmd0aCBvZiBhY3R1YWwgZGF0YSBpbiBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgZGF0YV9zaXplOworCS8qIHRoZSBkYXRhIGZvcm1hdCAqLworCXVuc2lnbmVkIGludCBkYXRhX2Zvcm1hdDsKKwkvKiB0aGUgc3RhdGUgb2YgYnVmZmVyIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQgc3RhdGU7CisJLyogaXMgdGhlIGJ1ZmZlciBtYXBwZWQgaW4gdXNlciBzcGFjZT8gKi8KKwl1bnNpZ25lZCBpbnQgbWFwX2NvdW50OworCS8qIG1lbW9yeSBvZmZzZXQgZm9yIG1tYXAoKSAqLworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJLyogZnJhbWUgY291bnRlciAqLworCXVuc2lnbmVkIGludCBmcmFtZV9jb3VudGVyOworCS8qIHRpbWVzdGFtcCAod3JpdHRlbiB3aGVuIGltYWdlIGNhcHR1cmUgZmluaXNoZXMpICovCisJc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOworCisJc3RydWN0IHZpbm9fZGVzY3JpcHRvcl90YWJsZSBkZXNjX3RhYmxlOworCisJc3BpbmxvY2tfdCBzdGF0ZV9sb2NrOworfTsKKworc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfZmlmbyB7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKKworCXVuc2lnbmVkIGludCB1c2VkOworCXVuc2lnbmVkIGludCBoZWFkOworCXVuc2lnbmVkIGludCB0YWlsOworCisJdW5zaWduZWQgaW50IGRhdGFbVklOT19GUkFNRUJVRkZFUl9NQVhfQ09VTlRdOworfTsKKworc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfcXVldWUgeworCXVuc2lnbmVkIGludCBtYWdpYzsKKworCS8qIFZJTk9fTUVNT1JZX05PTkUsIFZJTk9fTUVNT1JZX01NQVAgb3IgVklOT19NRU1PUllfVVNFUlBUUiAqLworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCBsZW5ndGg7CisKKwkvKiBkYXRhIGZpZWxkIG9mIGluIGFuZCBvdXQgY29udGFpbiBpbmRleCBudW1iZXJzIGZvciBidWZmZXIgKi8KKwlzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9maWZvIGluOworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX2ZpZm8gb3V0OworCisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmJ1ZmZlcltWSU5PX0ZSQU1FQlVGRkVSX01BWF9DT1VOVF07CisKKwlzcGlubG9ja190IHF1ZXVlX2xvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBxdWV1ZV9zZW07CisJd2FpdF9xdWV1ZV9oZWFkX3QgZnJhbWVfd2FpdF9xdWV1ZTsKK307CisKK3N0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgeworCXVuc2lnbmVkIGludCBjaGFubmVsOworCisJaW50IGlucHV0OworCXVuc2lnbmVkIGludCBkYXRhX2Zvcm1hdDsKKwl1bnNpZ25lZCBpbnQgZGF0YV9ub3JtOworCXN0cnVjdCB2aW5vX2NsaXBwaW5nIGNsaXBwaW5nOworCXVuc2lnbmVkIGludCBkZWNpbWF0aW9uOworCXVuc2lnbmVkIGludCBsaW5lX3NpemU7CisJdW5zaWduZWQgaW50IGFscGhhOworCXVuc2lnbmVkIGludCBmcHM7CisJdW5zaWduZWQgaW50IGZyYW1lcnRfcmVnOworCisJdW5zaWduZWQgaW50IGZpZm9fdGhyZXNob2xkOworCisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfcXVldWUgZmJfcXVldWU7CisKKwkvKiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZmllbGQgKi8KKwl1bnNpZ25lZCBpbnQgZmllbGQ7CisKKwkvKiByZWFkIGluIHByb2dyZXNzICovCisJaW50IHJlYWRpbmc7CisJLyogc3RyZWFtaW5nIGlzIGFjdGl2ZSAqLworCWludCBzdHJlYW1pbmc7CisJLyogdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyB0aGUgcXVldWUgKi8KKwlpbnQgY2FwdHVyaW5nOworCisJc3RydWN0IHNlbWFwaG9yZSBzZW07CisJc3BpbmxvY2tfdCBjYXB0dXJlX2xvY2s7CisKKwl1bnNpZ25lZCBpbnQgdXNlcnM7CisKKwkvKiBWNEwgc3VwcG9ydCAqLworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnY0bF9kZXZpY2U7CiB9OwogCiBzdHJ1Y3Qgdmlub19jbGllbnQgeworCS8qIHRoZSBjaGFubmVsIHdoaWNoIG93bnMgdGhpcyBjbGllbnQ6CisJICogVklOT19OT19DSEFOTkVMLCBWSU5PX0NIQU5ORUxfQSBvciBWSU5PX0NIQU5ORUxfQiAqLworCXVuc2lnbmVkIGludCBvd25lcjsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqZHJpdmVyOwotCWludCBvd25lcjsKIH07CiAKLXN0cnVjdCB2aW5vX3ZpZGVvIHsKLQlzdHJ1Y3Qgdmlub19kZXZpY2UgY2hBOwotCXN0cnVjdCB2aW5vX2RldmljZSBjaEI7CitzdHJ1Y3Qgdmlub19zZXR0aW5ncyB7CisJc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyBhOworCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgYjsKIAogCXN0cnVjdCB2aW5vX2NsaWVudCBkZWNvZGVyOwogCXN0cnVjdCB2aW5vX2NsaWVudCBjYW1lcmE7CiAKLQlzdHJ1Y3Qgc2VtYXBob3JlIGlucHV0X2xvY2s7CisJLyogYSBsb2NrIGZvciB2aW5vIHJlZ2lzdGVyIGFjY2VzcyAqLworCXNwaW5sb2NrX3Qgdmlub19sb2NrOworCS8qIGEgbG9jayBmb3IgY2hhbm5lbCBpbnB1dCBjaGFuZ2VzICovCisJc3BpbmxvY2tfdCBpbnB1dF9sb2NrOwogCi0JLyogTG9hZGVkIGludG8gVklOTyBkZXNjcmlwdG9ycyB0byBjbGVhciBFbmQgT2YgRGVzY3JpcHRvcnMgdGFibGUKLQkgKiBpbnRlcnVwdCBjb25kaXRpb24gKi8KIAl1bnNpZ25lZCBsb25nIGR1bW15X3BhZ2U7Ci0JdW5zaWduZWQgaW50IGR1bW15X2J1Zls0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJc3RydWN0IHZpbm9fZGVzY3JpcHRvcl90YWJsZSBkdW1teV9kZXNjX3RhYmxlOwogfTsKIAotc3RhdGljIHN0cnVjdCB2aW5vX3ZpZGVvICpWaW5vOworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworLyoKKyAqIFVzaW5nIHZpbm9fcGl4ZWxfY29udmVyc2lvbiB0aGUgQVJHQjMyLWZvcm1hdCBwaXhlbHMgc3VwcGxpZWQKKyAqIGJ5IHRoZSBWSU5PIGNoaXAgY2FuIGJlIGNvbnZlcnRlZCB0byBtb3JlIGNvbW1vbiBmb3JtYXRzCisgKiBsaWtlIFJHQkEzMiAob3IgcHJvYmFibHkgUkdCMjQgaW4gdGhlIGZ1dHVyZSkuIFRoaXMgd2F5IHdlCisgKiBjYW4gZ2l2ZSBvdXQgZGF0YSB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgY29ycmVjdGx5IHdpdGgKKyAqIHRoZSBWNEwyLWRlZmluaXRpb25zLgorICoKKyAqIFRoZSBwaXhlbCBmb3JtYXQgaXMgc3BlY2lmaWVkIGFzIFJHQkEzMiB3aGVuIG5vIGNvbnZlcnNpb24KKyAqIGlzIHVzZWQuCisgKgorICogTm90ZSB0aGF0IHRoaXMgb25seSBhZmZlY3RzIHRoZSAzMi1iaXQgYml0IGRlcHRoLgorICoKKyAqIFVzZSBub24temVybyB2YWx1ZSB0byBlbmFibGUgY29udmVyc2lvbi4KKyAqLworc3RhdGljIGludCB2aW5vX3BpeGVsX2NvbnZlcnNpb24gPSAwOworbW9kdWxlX3BhcmFtX25hbWVkKHBpeGVsY29udiwgdmlub19waXhlbF9jb252ZXJzaW9uLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwaXhlbGNvbnYsCisJCSAiZW5hYmxlIHBpeGVsIGNvbnZlcnNpb24gKG5vbi16ZXJvIHZhbHVlIGVuYWJsZXMpIik7CisKKy8qIEludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLworCitzdGF0aWMgc3RydWN0IHNnaV92aW5vICp2aW5vOworCitzdGF0aWMgc3RydWN0IHZpbm9fc2V0dGluZ3MgKnZpbm9fZHJ2ZGF0YTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnZpbm9fZHJpdmVyX25hbWUgPSAidmlubyI7CitzdGF0aWMgY29uc3QgY2hhciAqdmlub19kcml2ZXJfZGVzY3JpcHRpb24gPSAiU0dJIFZJTk8iOworc3RhdGljIGNvbnN0IGNoYXIgKnZpbm9fYnVzX25hbWUgPSAiR0lPNjQgYnVzIjsKK3N0YXRpYyBjb25zdCBjaGFyICp2aW5vX3Y0bF9kZXZpY2VfbmFtZV9hID0gIlNHSSBWSU5PIENoYW5uZWwgQSI7CitzdGF0aWMgY29uc3QgY2hhciAqdmlub192NGxfZGV2aWNlX25hbWVfYiA9ICJTR0kgVklOTyBDaGFubmVsIEIiOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZpbm9faW5wdXQgdmlub19pbnB1dHNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJDb21wb3NpdGUiLAorCQkuc3RkCQk9IFY0TDJfU1REX05UU0MgfCBWNEwyX1NURF9QQUwgfCBWNEwyX1NURF9TRUNBTSwKKwl9LHsKKwkJLm5hbWUJCT0gIlMtVmlkZW8iLAorCQkuc3RkCQk9IFY0TDJfU1REX05UU0MgfCBWNEwyX1NURF9QQUwgfCBWNEwyX1NURF9TRUNBTSwKKwl9LHsKKwkJLm5hbWUJCT0gIkQxIChJbmR5Q2FtKSIsCisJCS5zdGQJCT0gVjRMMl9TVERfTlRTQywKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZpbm9fZGF0YV9mb3JtYXQgdmlub19kYXRhX2Zvcm1hdHNbXSA9IHsKKwl7CisJCS5kZXNjcmlwdGlvbgk9ICI4LWJpdCBncmV5c2NhbGUiLAorCQkuYnBwCQk9IDEsCisJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9HUkVZLAorCQkuY29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME0sCisJfSx7CisJCS5kZXNjcmlwdGlvbgk9ICI4LWJpdCBkaXRoZXJlZCBSR0IgMy0zLTIiLAorCQkuYnBwCQk9IDEsCisJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9SR0IzMzIsCisJCS5jb2xvcnNwYWNlCT0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJfSx7CisJCS5kZXNjcmlwdGlvbgk9ICIzMi1iaXQgUkdCIiwKKwkJLmJwcAkJPSA0LAorCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfUkdCMzIsCisJCS5jb2xvcnNwYWNlCT0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJfSx7CisJCS5kZXNjcmlwdGlvbgk9ICJZVVYgNDoyOjIiLAorCQkuYnBwCQk9IDQsCisJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9ZVVlWLCAvLyBYWFg6IHN3YXBwZWQ/CisJCS5jb2xvcnNwYWNlCT0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSwKKwl9LyoseworCQkuZGVzY3JpcHRpb24JPSAiMjQtYml0IFJHQiIsCisJCS5icHAJCT0gMywKKwkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1JHQjI0LAorCQkuY29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCQl9Ki8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdmlub19kYXRhX25vcm0gdmlub19kYXRhX25vcm1zW10gPSB7CisJeworCQkuZGVzY3JpcHRpb24JPSAiTlRTQyIsCisJCS5zdGQJCT0gVjRMMl9TVERfTlRTQywKKwkJLmZwc19taW4JPSA2LAorCQkuZnBzX21heAk9IDMwLAorCQkuZnJhbWVsaW5lcwk9IDUyNSwKKwkJLndpZHRoCQk9IFZJTk9fTlRTQ19XSURUSCwKKwkJLmhlaWdodAkJPSBWSU5PX05UU0NfSEVJR0hULAorCQkub2RkCQk9IHsKKwkJCS50b3AgCT0gVklOT19DTElQUElOR19TVEFSVF9PRERfTlRTQywKKwkJCS5sZWZ0IAk9IDAsCisJCQkuYm90dG9tCT0gVklOT19DTElQUElOR19TVEFSVF9PRERfTlRTQworCQkJKyBWSU5PX05UU0NfSEVJR0hUIC8gMiAtIDEsCisJCQkucmlnaHQgCT0gVklOT19OVFNDX1dJRFRILAorCQl9LAorCQkuZXZlbgkJPSB7CisJCQkudG9wIAk9IFZJTk9fQ0xJUFBJTkdfU1RBUlRfRVZFTl9OVFNDLAorCQkJLmxlZnQgCT0gMCwKKwkJCS5ib3R0b20JPSBWSU5PX0NMSVBQSU5HX1NUQVJUX0VWRU5fTlRTQworCQkJKyBWSU5PX05UU0NfSEVJR0hUIC8gMiAtIDEsCisJCQkucmlnaHQgCT0gVklOT19OVFNDX1dJRFRILAorCQl9LAorCX0seworCQkuZGVzY3JpcHRpb24JPSAiUEFMIiwKKwkJLnN0ZAkJPSBWNEwyX1NURF9QQUwsCisJCS5mcHNfbWluCT0gNSwKKwkJLmZwc19tYXgJPSAyNSwKKwkJLmZyYW1lbGluZXMJPSA2MjUsCisJCS53aWR0aAkJPSBWSU5PX1BBTF9XSURUSCwKKwkJLmhlaWdodAkJPSBWSU5PX1BBTF9IRUlHSFQsCisJCS5vZGQJCT0geworCQkJLnRvcCAJPSBWSU5PX0NMSVBQSU5HX1NUQVJUX09ERF9QQUwsCisJCQkubGVmdCAJPSAwLAorCQkJLmJvdHRvbQk9IFZJTk9fQ0xJUFBJTkdfU1RBUlRfT0REX1BBTAorCQkJKyBWSU5PX1BBTF9IRUlHSFQgLyAyIC0gMSwKKwkJCS5yaWdodCAJPSBWSU5PX1BBTF9XSURUSCwKKwkJfSwKKwkJLmV2ZW4JCT0geworCQkJLnRvcCAJPSBWSU5PX0NMSVBQSU5HX1NUQVJUX0VWRU5fUEFMLAorCQkJLmxlZnQgCT0gMCwKKwkJCS5ib3R0b20JPSBWSU5PX0NMSVBQSU5HX1NUQVJUX0VWRU5fUEFMCisJCQkrIFZJTk9fUEFMX0hFSUdIVCAvIDIgLSAxLAorCQkJLnJpZ2h0IAk9IFZJTk9fUEFMX1dJRFRILAorCQl9LAorCX0seworCQkuZGVzY3JpcHRpb24JPSAiU0VDQU0iLAorCQkuc3RkCQk9IFY0TDJfU1REX1NFQ0FNLAorCQkuZnBzX21pbgk9IDUsCisJCS5mcHNfbWF4CT0gMjUsCisJCS5mcmFtZWxpbmVzCT0gNjI1LAorCQkud2lkdGgJCT0gVklOT19QQUxfV0lEVEgsCisJCS5oZWlnaHQJCT0gVklOT19QQUxfSEVJR0hULAorCQkub2RkCQk9IHsKKwkJCS50b3AgCT0gVklOT19DTElQUElOR19TVEFSVF9PRERfUEFMLAorCQkJLmxlZnQgCT0gMCwKKwkJCS5ib3R0b20JPSBWSU5PX0NMSVBQSU5HX1NUQVJUX09ERF9QQUwKKwkJCSsgVklOT19QQUxfSEVJR0hUIC8gMiAtIDEsCisJCQkucmlnaHQgCT0gVklOT19QQUxfV0lEVEgsCisJCX0sCisJCS5ldmVuCQk9IHsKKwkJCS50b3AgCT0gVklOT19DTElQUElOR19TVEFSVF9FVkVOX1BBTCwKKwkJCS5sZWZ0IAk9IDAsCisJCQkuYm90dG9tCT0gVklOT19DTElQUElOR19TVEFSVF9FVkVOX1BBTAorCQkJKyBWSU5PX1BBTF9IRUlHSFQgLyAyIC0gMSwKKwkJCS5yaWdodCAJPSBWSU5PX1BBTF9XSURUSCwKKwkJfSwKKwl9LHsKKwkJLmRlc2NyaXB0aW9uCT0gIk5UU0MgKEQxIGlucHV0KSIsCisJCS5zdGQJCT0gVjRMMl9TVERfTlRTQywKKwkJLmZwc19taW4JPSA2LAorCQkuZnBzX21heAk9IDMwLAorCQkuZnJhbWVsaW5lcwk9IDUyNSwKKwkJLndpZHRoCQk9IFZJTk9fTlRTQ19XSURUSCwKKwkJLmhlaWdodAkJPSBWSU5PX05UU0NfSEVJR0hULAorCQkub2RkCQk9IHsKKwkJCS50b3AgCT0gVklOT19DTElQUElOR19TVEFSVF9PRERfRDEsCisJCQkubGVmdCAJPSAwLAorCQkJLmJvdHRvbQk9IFZJTk9fQ0xJUFBJTkdfU1RBUlRfT0REX0QxCisJCQkrIFZJTk9fTlRTQ19IRUlHSFQgLyAyIC0gMSwKKwkJCS5yaWdodCAJPSBWSU5PX05UU0NfV0lEVEgsCisJCX0sCisJCS5ldmVuCQk9IHsKKwkJCS50b3AgCT0gVklOT19DTElQUElOR19TVEFSVF9FVkVOX0QxLAorCQkJLmxlZnQgCT0gMCwKKwkJCS5ib3R0b20JPSBWSU5PX0NMSVBQSU5HX1NUQVJUX0VWRU5fRDEKKwkJCSsgVklOT19OVFNDX0hFSUdIVCAvIDIgLSAxLAorCQkJLnJpZ2h0IAk9IFZJTk9fTlRTQ19XSURUSCwKKwkJfSwKKwl9Cit9OworCisjZGVmaW5lIFZJTk9fSU5EWUNBTV9WNEwyX0NPTlRST0xfQ09VTlQJCTkKKworc3RydWN0IHY0bDJfcXVlcnljdHJsIHZpbm9faW5keWNhbV92NGwyX2NvbnRyb2xzW10gPSB7CisJeworCQkuaWQgPSBWNEwyX0NJRF9BVVRPR0FJTiwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZSA9ICJBdXRvbWF0aWMgR2FpbiBDb250cm9sIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSBJTkRZQ0FNX0FHQ19ERUZBVUxULAorCQkuZmxhZ3MgPSAwLAorCQkucmVzZXJ2ZWQgPSB7IDAsIDAgfSwKKwl9LHsKKwkJLmlkID0gVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lID0gIkF1dG9tYXRpYyBXaGl0ZSBCYWxhbmNlIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSBJTkRZQ0FNX0FXQl9ERUZBVUxULAorCQkuZmxhZ3MgPSAwLAorCQkucmVzZXJ2ZWQgPSB7IDAsIDAgfSwKKwl9LHsKKwkJLmlkID0gVjRMMl9DSURfR0FJTiwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJHYWluIiwKKwkJLm1pbmltdW0gPSBJTkRZQ0FNX0dBSU5fTUlOLAorCQkubWF4aW11bSA9IElORFlDQU1fR0FJTl9NQVgsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSBJTkRZQ0FNX0dBSU5fREVGQVVMVCwKKwkJLmZsYWdzID0gMCwKKwkJLnJlc2VydmVkID0geyAwLCAwIH0sCisJfSx7CisJCS5pZCA9IFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJSZWQgU2F0dXJhdGlvbiIsCisJCS5taW5pbXVtID0gSU5EWUNBTV9SRURfU0FUVVJBVElPTl9NSU4sCisJCS5tYXhpbXVtID0gSU5EWUNBTV9SRURfU0FUVVJBVElPTl9NQVgsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSBJTkRZQ0FNX1JFRF9TQVRVUkFUSU9OX0RFRkFVTFQsCisJCS5mbGFncyA9IDAsCisJCS5yZXNlcnZlZCA9IHsgMCwgMCB9LAorCX0seworCQkuaWQgPSBWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkJsdWUgU2F0dXJhdGlvbiIsCisJCS5taW5pbXVtID0gSU5EWUNBTV9CTFVFX1NBVFVSQVRJT05fTUlOLAorCQkubWF4aW11bSA9IElORFlDQU1fQkxVRV9TQVRVUkFUSU9OX01BWCwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IElORFlDQU1fQkxVRV9TQVRVUkFUSU9OX0RFRkFVTFQsCisJCS5mbGFncyA9IDAsCisJCS5yZXNlcnZlZCA9IHsgMCwgMCB9LAorCX0seworCQkuaWQgPSBWNEwyX0NJRF9SRURfQkFMQU5DRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJSZWQgQmFsYW5jZSIsCisJCS5taW5pbXVtID0gSU5EWUNBTV9SRURfQkFMQU5DRV9NSU4sCisJCS5tYXhpbXVtID0gSU5EWUNBTV9SRURfQkFMQU5DRV9NQVgsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSBJTkRZQ0FNX1JFRF9CQUxBTkNFX0RFRkFVTFQsCisJCS5mbGFncyA9IDAsCisJCS5yZXNlcnZlZCA9IHsgMCwgMCB9LAorCX0seworCQkuaWQgPSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiQmx1ZSBCYWxhbmNlIiwKKwkJLm1pbmltdW0gPSBJTkRZQ0FNX0JMVUVfQkFMQU5DRV9NSU4sCisJCS5tYXhpbXVtID0gSU5EWUNBTV9CTFVFX0JBTEFOQ0VfTUFYLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gSU5EWUNBTV9CTFVFX0JBTEFOQ0VfREVGQVVMVCwKKwkJLmZsYWdzID0gMCwKKwkJLnJlc2VydmVkID0geyAwLCAwIH0sCisJfSx7CisJCS5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIlNodXR0ZXIgQ29udHJvbCIsCisJCS5taW5pbXVtID0gSU5EWUNBTV9TSFVUVEVSX01JTiwKKwkJLm1heGltdW0gPSBJTkRZQ0FNX1NIVVRURVJfTUFYLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gSU5EWUNBTV9TSFVUVEVSX0RFRkFVTFQsCisJCS5mbGFncyA9IDAsCisJCS5yZXNlcnZlZCA9IHsgMCwgMCB9LAorCX0seworCQkuaWQgPSBWNEwyX0NJRF9HQU1NQSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJHYW1tYSIsCisJCS5taW5pbXVtID0gSU5EWUNBTV9HQU1NQV9NSU4sCisJCS5tYXhpbXVtID0gSU5EWUNBTV9HQU1NQV9NQVgsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSBJTkRZQ0FNX0dBTU1BX0RFRkFVTFQsCisJCS5mbGFncyA9IDAsCisJCS5yZXNlcnZlZCA9IHsgMCwgMCB9LAorCX0KK307CisKKyNkZWZpbmUgVklOT19TQUE3MTkxX1Y0TDJfQ09OVFJPTF9DT1VOVAkJMgorCitzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgdmlub19zYWE3MTkxX3Y0bDJfY29udHJvbHNbXSA9IHsKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX0hVRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJIdWUiLAorCQkubWluaW11bSA9IFNBQTcxOTFfSFVFX01JTiwKKwkJLm1heGltdW0gPSBTQUE3MTkxX0hVRV9NQVgsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSBTQUE3MTkxX0hVRV9ERUZBVUxULAorCQkuZmxhZ3MgPSAwLAorCQkucmVzZXJ2ZWQgPSB7IDAsIDAgfSwKKwl9LHsKKwkJLmlkID0gVjRMMl9DSURfUFJJVkFURV9CQVNFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lID0gIlZUUiBUaW1lIENvbnN0YW50IiwKKwkJLm1pbmltdW0gPSBTQUE3MTkxX1ZUUkNfTUlOLAorCQkubWF4aW11bSA9IFNBQTcxOTFfVlRSQ19NQVgsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSBTQUE3MTkxX1ZUUkNfREVGQVVMVCwKKwkJLmZsYWdzID0gMCwKKwkJLnJlc2VydmVkID0geyAwLCAwIH0sCisJfQorfTsKKworLyogVklOTyBJMkMgYnVzIGZ1bmN0aW9ucyAqLwogCiB1bnNpZ25lZCBpMmNfdmlub19nZXRjdHJsKHZvaWQgKmRhdGEpCiB7CkBAIC0xMTIsNDkgKzYzOCw0OSBAQAogICovCiBzdGF0aWMgaW50IGkyY192aW5vX2NsaWVudF9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlpbnQgcmVzID0gMDsKKwlpbnQgcmV0ID0gMDsKIAotCWRvd24oJlZpbm8tPmlucHV0X2xvY2spOworCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKIAlzd2l0Y2ggKGNsaWVudC0+ZHJpdmVyLT5pZCkgewogCWNhc2UgSTJDX0RSSVZFUklEX1NBQTcxOTE6Ci0JCWlmIChWaW5vLT5kZWNvZGVyLmRyaXZlcikKLQkJCXJlcyA9IC1FQlVTWTsKKwkJaWYgKHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIpCisJCQlyZXQgPSAtRUJVU1k7CiAJCWVsc2UKLQkJCVZpbm8tPmRlY29kZXIuZHJpdmVyID0gY2xpZW50OworCQkJdmlub19kcnZkYXRhLT5kZWNvZGVyLmRyaXZlciA9IGNsaWVudDsKIAkJYnJlYWs7CiAJY2FzZSBJMkNfRFJJVkVSSURfSU5EWUNBTToKLQkJaWYgKFZpbm8tPmNhbWVyYS5kcml2ZXIpCi0JCQlyZXMgPSAtRUJVU1k7CisJCWlmICh2aW5vX2RydmRhdGEtPmNhbWVyYS5kcml2ZXIpCisJCQlyZXQgPSAtRUJVU1k7CiAJCWVsc2UKLQkJCVZpbm8tPmNhbWVyYS5kcml2ZXIgPSBjbGllbnQ7CisJCQl2aW5vX2RydmRhdGEtPmNhbWVyYS5kcml2ZXIgPSBjbGllbnQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJlcyA9IC1FTk9ERVY7CisJCXJldCA9IC1FTk9ERVY7CiAJfQotCXVwKCZWaW5vLT5pbnB1dF9sb2NrKTsKKwlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKIAotCXJldHVybiByZXM7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBpMmNfdmlub19jbGllbnRfdW5yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlpbnQgcmVzID0gMDsKKwlpbnQgcmV0ID0gMDsKIAotCWRvd24oJlZpbm8tPmlucHV0X2xvY2spOwotCWlmIChjbGllbnQgPT0gVmluby0+ZGVjb2Rlci5kcml2ZXIpIHsKLQkJaWYgKFZpbm8tPmRlY29kZXIub3duZXIpCi0JCQlyZXMgPSAtRUJVU1k7CisJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCWlmIChjbGllbnQgPT0gdmlub19kcnZkYXRhLT5kZWNvZGVyLmRyaXZlcikgeworCQlpZiAodmlub19kcnZkYXRhLT5kZWNvZGVyLm93bmVyICE9IFZJTk9fTk9fQ0hBTk5FTCkKKwkJCXJldCA9IC1FQlVTWTsKIAkJZWxzZQotCQkJVmluby0+ZGVjb2Rlci5kcml2ZXIgPSBOVUxMOwotCX0gZWxzZSBpZiAoY2xpZW50ID09IFZpbm8tPmNhbWVyYS5kcml2ZXIpIHsKLQkJaWYgKFZpbm8tPmNhbWVyYS5vd25lcikKLQkJCXJlcyA9IC1FQlVTWTsKKwkJCXZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIgPSBOVUxMOworCX0gZWxzZSBpZiAoY2xpZW50ID09IHZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLmRyaXZlcikgeworCQlpZiAodmlub19kcnZkYXRhLT5jYW1lcmEub3duZXIgIT0gVklOT19OT19DSEFOTkVMKQorCQkJcmV0ID0gLUVCVVNZOwogCQllbHNlCi0JCQlWaW5vLT5jYW1lcmEuZHJpdmVyID0gTlVMTDsKKwkJCXZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLmRyaXZlciA9IE5VTEw7CiAJfQotCXVwKCZWaW5vLT5pbnB1dF9sb2NrKTsKKwlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKIAotCXJldHVybiByZXM7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciB2aW5vX2kyY19hZGFwdGVyID0KQEAgLTE3NiwxNzIgKzcwMiwzNTkxIEBACiAJcmV0dXJuIGkyY19zZ2lfZGVsX2J1cygmdmlub19pMmNfYWRhcHRlcik7CiB9CiAKLQotc3RhdGljIHZvaWQgdmlub19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbnQgaTJjX2NhbWVyYV9jb21tYW5kKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKKwlyZXR1cm4gdmlub19kcnZkYXRhLT5jYW1lcmEuZHJpdmVyLT4KKwkJZHJpdmVyLT5jb21tYW5kKHZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLmRyaXZlciwKKwkJCQljbWQsIGFyZyk7CiB9CiAKLXN0YXRpYyBpbnQgdmlub19vcGVuKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgaW50IGZsYWdzKQorc3RhdGljIGludCBpMmNfZGVjb2Rlcl9jb21tYW5kKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgdmlub19kZXZpY2UgKnZpZGV2ID0gKHN0cnVjdCB2aW5vX2RldmljZSAqKWRldjsKLQotCXJldHVybiAwOworCXJldHVybiB2aW5vX2RydmRhdGEtPmRlY29kZXIuZHJpdmVyLT4KKwkJZHJpdmVyLT5jb21tYW5kKHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIsCisJCQkJY21kLCBhcmcpOwogfQogCi1zdGF0aWMgdm9pZCB2aW5vX2Nsb3NlKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldikKKy8qIFZJTk8gZnJhbWVidWZmZXIvRE1BIGRlc2NyaXB0b3IgbWFuYWdlbWVudCAqLworCitzdGF0aWMgdm9pZCB2aW5vX2ZyZWVfYnVmZmVyX3dpdGhfY291bnQoc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmZiLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGNvdW50KQogewotCXN0cnVjdCB2aW5vX2RldmljZSAqdmlkZXYgPSAoc3RydWN0IHZpbm9fZGV2aWNlICopZGV2OwotfQorCXVuc2lnbmVkIGludCBpOwogCi1zdGF0aWMgaW50IHZpbm9fbW1hcChzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmFkciwKLQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jc3RydWN0IHZpbm9fZGV2aWNlICp2aWRldiA9IChzdHJ1Y3Qgdmlub19kZXZpY2UgKilkZXY7CisJZHByaW50aygidmlub19mcmVlX2J1ZmZlcl93aXRoX2NvdW50KCk6IGNvdW50ID0gJWRcbiIsIGNvdW50KTsKIAotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHZpbm9faW9jdGwoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IHZpbm9fZGV2aWNlICp2aWRldiA9IChzdHJ1Y3Qgdmlub19kZXZpY2UgKilkZXY7Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2aWRlb19kZXZpY2Ugdmlub19kZXZpY2UgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS50eXBlCQk9IFZJRF9UWVBFX0NBUFRVUkUgfCBWSURfVFlQRV9TVUJDQVBUVVJFLAotCS5oYXJkd2FyZQk9IFZJRF9IQVJEV0FSRV9WSU5PLAotCS5uYW1lCQk9ICJWSU5PIiwKLQkub3BlbgkJPSB2aW5vX29wZW4sCi0JLmNsb3NlCQk9IHZpbm9fY2xvc2UsCi0JLmlvY3RsCQk9IHZpbm9faW9jdGwsCi0JLm1tYXAJCT0gdmlub19tbWFwLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdmlub19pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyByZXY7Ci0JaW50IGksIHJldCA9IDA7Ci0KLQkvKiBWSU5PIGlzIEluZHkgc3BlY2lmaWMgYmVhc3QgKi8KLQlpZiAoaXAyMl9pc19mdWxsaG91c2UoKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKgotCSAqIFZJTk8gaXMgaW4gdGhlIEVJU0EgYWRkcmVzcyBzcGFjZSwgc28gdGhlIHN5c2lkIHJlZ2lzdGVyIHdpbGwgdGVsbAotCSAqIHVzIGlmIHRoZSBFSVNBX1BSRVNFTlQgcGluIG9uIE1DIGhhcyBiZWVuIHB1bGxlZCBsb3cuCi0JICoKLQkgKiBJZiBFSVNBX1BSRVNFTlQgaXMgbm90IHNldCB3ZSBkZWZpbml0ZWx5IGRvbid0IGhhdmUgYSBWSU5PIGVxdWlwZWQKLQkgKiBzeXN0ZW0uCi0JICovCi0JaWYgKCEoc2dpbWMtPnN5c3RlbWlkICYgU0dJTUNfU1lTSURfRVBSRVNFTlQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVklOTyBub3QgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQltZW1fbWFwX3VucmVzZXJ2ZSh2aXJ0X3RvX3BhZ2UoZmItPmRlc2NfdGFibGUudmlydHVhbFtpXSkpOworCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsCisJCQkJIGZiLT5kZXNjX3RhYmxlLmRtYV9jcHVbVklOT19QQUdFX1JBVElPICogaV0sCisJCQkJIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJZnJlZV9wYWdlKGZiLT5kZXNjX3RhYmxlLnZpcnR1YWxbaV0pOwogCX0KIAotCXZpbm8gPSAoc3RydWN0IHNnaV92aW5vICopaW9yZW1hcChWSU5PX0JBU0UsIHNpemVvZihzdHJ1Y3Qgc2dpX3Zpbm8pKTsKLQlpZiAoIXZpbm8pCi0JCXJldHVybiAtRUlPOworCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsCisJCQkgIFZJTk9fUEFHRV9SQVRJTyAqIChmYi0+ZGVzY190YWJsZS5wYWdlX2NvdW50ICsgNCkgKgorCQkJICBzaXplb2YoZG1hX2FkZHJfdCksICh2b2lkICopZmItPmRlc2NfdGFibGUuZG1hX2NwdSwKKwkJCSAgZmItPmRlc2NfdGFibGUuZG1hKTsKKwlrZnJlZShmYi0+ZGVzY190YWJsZS52aXJ0dWFsKTsKIAotCS8qIE9rYXksIG9uY2Ugd2Uga25vdyB0aGF0IFZJTk8gaXMgcHJlc2VudCB3ZSdsbCByZWFkIGl0cyByZXZpc2lvbgotCSAqIHNhZmUgd2F5LiBPbmUgbmV2ZXIga25vd3MuLi4gKi8KLQlpZiAoZ2V0X2RiZShyZXYsICYodmluby0+cmV2X2lkKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWSU5POiBmYWlsZWQgdG8gcmVhZCByZXZpc2lvbiByZWdpc3RlclxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X3VubWFwOwotCX0KLQlpZiAoVklOT19JRF9WQUxVRShyZXYpICE9IFZJTk9fQ0hJUF9JRCkgewotCQlwcmludGsoS0VSTl9FUlIgIlZJTk8gaXMgbm90IFZJTk8gKFJldi9JRDogMHglMDRseClcbiIsIHJldik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X3VubWFwOwotCX0KLQlwcmludGsoS0VSTl9JTkZPICJWSU5PIFJldjogMHglMDJseFxuIiwgVklOT19SRVZfTlVNKHJldikpOworCW1lbXNldChmYiwgMCwgc2l6ZW9mKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyKSk7Cit9CiAKLQlWaW5vID0gKHN0cnVjdCB2aW5vX3ZpZGVvICopCi0JCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aW5vX3ZpZGVvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFWaW5vKSB7CitzdGF0aWMgdm9pZCB2aW5vX2ZyZWVfYnVmZmVyKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYikKK3sKKwl2aW5vX2ZyZWVfYnVmZmVyX3dpdGhfY291bnQoZmIsIGZiLT5kZXNjX3RhYmxlLnBhZ2VfY291bnQpOworfQorCitzdGF0aWMgaW50IHZpbm9fYWxsb2NhdGVfYnVmZmVyKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQl1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQsIGksIGo7CisJaW50IHJldCA9IDA7CisKKwlkcHJpbnRrKCJ2aW5vX2FsbG9jYXRlX2J1ZmZlcigpOlxuIik7CisKKwlpZiAoc2l6ZSA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KGZiLCAwLCBzaXplb2Yoc3RydWN0IHZpbm9fZnJhbWVidWZmZXIpKTsKKworCWNvdW50ID0gKChzaXplIC8gUEFHRV9TSVpFKSArIDQpICYgfjM7CisKKwlkcHJpbnRrKCJ2aW5vX2FsbG9jYXRlX2J1ZmZlcigpOiBzaXplID0gJWQsIGNvdW50ID0gJWRcbiIsCisJCXNpemUsIGNvdW50KTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGFibGUgd2l0aCB2aXJ0dWFsIChwYWdlKSBhZGRyZXNzZXMgKi8KKwlmYi0+ZGVzY190YWJsZS52aXJ0dWFsID0gKHVuc2lnbmVkIGxvbmcgKikKKwkJa21hbGxvYyhjb3VudCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmYi0+ZGVzY190YWJsZS52aXJ0dWFsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGFibGUgd2l0aCBkbWEgYWRkcmVzc2VzCisJICogKGhhcyBzcGFjZSBmb3IgZm91ciBleHRyYSBkZXNjcmlwdG9ycykgKi8KKwlmYi0+ZGVzY190YWJsZS5kbWFfY3B1ID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIFZJTk9fUEFHRV9SQVRJTyAqIChjb3VudCArIDQpICoKKwkJCQkgICBzaXplb2YoZG1hX2FkZHJfdCksICZmYi0+ZGVzY190YWJsZS5kbWEsCisJCQkJICAgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghZmItPmRlc2NfdGFibGUuZG1hX2NwdSkgewogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF91bm1hcDsKKwkJZ290byBvdXRfZnJlZV92aXJ0dWFsOwogCX0KIAotCVZpbm8tPmR1bW15X3BhZ2UgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwotCWlmICghVmluby0+ZHVtbXlfcGFnZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9mcmVlX3Zpbm87Ci0JfQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCVZpbm8tPmR1bW15X2J1ZltpXSA9IFBIWVNBRERSKFZpbm8tPmR1bW15X3BhZ2UpOworCS8qIGFsbG9jYXRlIHBhZ2VzIGZvciB0aGUgYnVmZmVyIGFuZCBhY3F1aXJlIHRoZSBhY2NvcmRpbmcKKwkgKiBkbWEgYWRkcmVzc2VzICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZG1hX2FkZHJfdCBkbWFfZGF0YV9hZGRyOwogCi0Jdmluby0+Y29udHJvbCA9IDA7Ci0JLyogcHJldmVudCBWSU5PIGZyb20gdGhyb3dpbmcgc3B1cmlvdXMgaW50ZXJydXB0cyAqLwotCXZpbm8tPmEubmV4dF80X2Rlc2MgPSBQSFlTQUREUihWaW5vLT5kdW1teV9idWYpOwotCXZpbm8tPmIubmV4dF80X2Rlc2MgPSBQSFlTQUREUihWaW5vLT5kdW1teV9idWYpOwotCXVkZWxheSg1KTsKLQl2aW5vLT5pbnRyX3N0YXR1cyA9IDA7Ci0gICAgICAgIC8qIHNldCB0aHJlc2hvbGQgbGV2ZWwgKi8KLSAgICAgICAgdmluby0+YS5maWZvX3RocmVzID0gdGhyZXNob2xkX2E7Ci0Jdmluby0+Yi5maWZvX3RocmVzID0gdGhyZXNob2xkX2I7CisJCWZiLT5kZXNjX3RhYmxlLnZpcnR1YWxbaV0gPQorCQkJZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJaWYgKCFmYi0+ZGVzY190YWJsZS52aXJ0dWFsW2ldKSB7CisJCQlyZXQgPSAtRU5PQlVGUzsKKwkJCWJyZWFrOworCQl9CiAKLQlpbml0X01VVEVYKCZWaW5vLT5pbnB1dF9sb2NrKTsKKwkJZG1hX2RhdGFfYWRkciA9CisJCQlkbWFfbWFwX3NpbmdsZShOVUxMLAorCQkJCSAgICAgICAodm9pZCAqKWZiLT5kZXNjX3RhYmxlLnZpcnR1YWxbaV0sCisJCQkJICAgICAgIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKIAotCWlmIChyZXF1ZXN0X2lycShTR0lfVklOT19JUlEsIHZpbm9faW50ZXJydXB0LCAwLCB2aW5vc3RyLCBOVUxMKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlZJTk86IGlycSUwMmQgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwKLQkJICAgICAgIFNHSV9WSU5PX0lSUSk7Ci0JCXJldCA9IC1FQUdBSU47Ci0JCWdvdG8gb3V0X2ZyZWVfcGFnZTsKKwkJZm9yIChqID0gMDsgaiA8IFZJTk9fUEFHRV9SQVRJTzsgaisrKSB7CisJCQlmYi0+ZGVzY190YWJsZS5kbWFfY3B1W1ZJTk9fUEFHRV9SQVRJTyAqIGkgKyBqXSA9CisJCQkJZG1hX2RhdGFfYWRkciArIFZJTk9fUEFHRV9TSVpFICogajsKKwkJfQorCisJCW1lbV9tYXBfcmVzZXJ2ZSh2aXJ0X3RvX3BhZ2UoZmItPmRlc2NfdGFibGUudmlydHVhbFtpXSkpOwogCX0KIAotCXJldCA9IHZpbm9faTJjX2FkZF9idXMoKTsKKwkvKiBwYWdlX2NvdW50IG5lZWRzIHRvIGJlIHNldCBhbnl3YXksIGJlY2F1c2UgdGhlIGRlc2NyaXB0b3IgdGFibGUgaGFzCisJICogYmVlbiBhbGxvY2F0ZWQgYWNjb3JkaW5nIHRvIHRoaXMgbnVtYmVyICovCisJZmItPmRlc2NfdGFibGUucGFnZV9jb3VudCA9IGNvdW50OworCiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIlZJTk86IEkyQyBidXMgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfaXJxOworCQkvKiB0aGUgZGVzY3JpcHRvciB3aXRoIGluZGV4IGkgZG9lc24ndCBjb250YWluCisJCSAqIGEgdmFsaWQgYWRkcmVzcyB5ZXQgKi8KKwkJdmlub19mcmVlX2J1ZmZlcl93aXRoX2NvdW50KGZiLCBpKTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZWaW5vLT5jaEEudmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpIDwgMCkgewotCQlwcmludGsoIiVzLCBjaG5sICVkOiBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZC5cbiIsCi0JCQlWaW5vLT5jaEEudmRldi5uYW1lLCBWaW5vLT5jaEEuY2hhbik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X2kyY19kZWxfYnVzOworCS8vZmItPnNpemUgPSBzaXplOworCWZiLT5zaXplID0gY291bnQgKiBQQUdFX1NJWkU7CisJZmItPmRhdGFfZm9ybWF0ID0gVklOT19EQVRBX0ZNVF9OT05FOworCisJLyogc2V0IHRoZSBkbWEgc3RvcC1iaXQgZm9yIHRoZSBsYXN0IChjb3VudCsxKXRoIGRlc2NyaXB0b3IgKi8KKwlmYi0+ZGVzY190YWJsZS5kbWFfY3B1W1ZJTk9fUEFHRV9SQVRJTyAqIGNvdW50XSA9IFZJTk9fREVTQ19TVE9QOworCXJldHVybiAwOworCisgb3V0X2ZyZWVfdmlydHVhbDoKKwlrZnJlZShmYi0+ZGVzY190YWJsZS52aXJ0dWFsKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWYgMAorLyogdXNlciBidWZmZXJzIG5vdCBmdWxseSBpbXBsZW1lbnRlZCB5ZXQgKi8KK3N0YXRpYyBpbnQgdmlub19wcmVwYXJlX3VzZXJfYnVmZmVyKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgICAgIHZvaWQgKnVzZXIsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQsIGksIGo7CisJaW50IHJldCA9IDA7CisKKwlkcHJpbnRrKCJ2aW5vX3ByZXBhcmVfdXNlcl9idWZmZXIoKTpcbiIpOworCisJaWYgKHNpemUgPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChmYiwgMCwgc2l6ZW9mKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyKSk7CisKKwljb3VudCA9ICgoc2l6ZSAvIFBBR0VfU0laRSkpICYgfjM7CisKKwlkcHJpbnRrKCJ2aW5vX3ByZXBhcmVfdXNlcl9idWZmZXIoKTogc2l6ZSA9ICVkLCBjb3VudCA9ICVkXG4iLAorCQlzaXplLCBjb3VudCk7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRhYmxlIHdpdGggdmlydHVhbCAocGFnZSkgYWRkcmVzc2VzICovCisJZmItPmRlc2NfdGFibGUudmlydHVhbCA9ICh1bnNpZ25lZCBsb25nICopCisJCWttYWxsb2MoY291bnQgKiBzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9LRVJORUwpOworCWlmICghZmItPmRlc2NfdGFibGUudmlydHVhbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRhYmxlIHdpdGggZG1hIGFkZHJlc3NlcworCSAqIChoYXMgc3BhY2UgZm9yIGZvdXIgZXh0cmEgZGVzY3JpcHRvcnMpICovCisJZmItPmRlc2NfdGFibGUuZG1hX2NwdSA9CisJCWRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBWSU5PX1BBR0VfUkFUSU8gKiAoY291bnQgKyA0KSAqCisJCQkJICAgc2l6ZW9mKGRtYV9hZGRyX3QpLCAmZmItPmRlc2NfdGFibGUuZG1hLAorCQkJCSAgIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIWZiLT5kZXNjX3RhYmxlLmRtYV9jcHUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV92aXJ0dWFsOwogCX0KLQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZWaW5vLT5jaEIudmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpIDwgMCkgewotCQlwcmludGsoIiVzLCBjaG5sICVkOiBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZC5cbiIsCi0JCQlWaW5vLT5jaEIudmRldi5uYW1lLCBWaW5vLT5jaEIuY2hhbik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X3VucmVnaXN0ZXJfdmRldjsKKworCS8qIGFsbG9jYXRlIHBhZ2VzIGZvciB0aGUgYnVmZmVyIGFuZCBhY3F1aXJlIHRoZSBhY2NvcmRpbmcKKwkgKiBkbWEgYWRkcmVzc2VzICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZG1hX2FkZHJfdCBkbWFfZGF0YV9hZGRyOworCisJCWZiLT5kZXNjX3RhYmxlLnZpcnR1YWxbaV0gPQorCQkJZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJaWYgKCFmYi0+ZGVzY190YWJsZS52aXJ0dWFsW2ldKSB7CisJCQlyZXQgPSAtRU5PQlVGUzsKKwkJCWJyZWFrOworCQl9CisKKwkJZG1hX2RhdGFfYWRkciA9CisJCQlkbWFfbWFwX3NpbmdsZShOVUxMLAorCQkJCSAgICAgICAodm9pZCAqKWZiLT5kZXNjX3RhYmxlLnZpcnR1YWxbaV0sCisJCQkJICAgICAgIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKworCQlmb3IgKGogPSAwOyBqIDwgVklOT19QQUdFX1JBVElPOyBqKyspIHsKKwkJCWZiLT5kZXNjX3RhYmxlLmRtYV9jcHVbVklOT19QQUdFX1JBVElPICogaSArIGpdID0KKwkJCQlkbWFfZGF0YV9hZGRyICsgVklOT19QQUdFX1NJWkUgKiBqOworCQl9CisKKwkJbWVtX21hcF9yZXNlcnZlKHZpcnRfdG9fcGFnZShmYi0+ZGVzY190YWJsZS52aXJ0dWFsW2ldKSk7CisJfQorCisJLyogcGFnZV9jb3VudCBuZWVkcyB0byBiZSBzZXQgYW55d2F5LCBiZWNhdXNlIHRoZSBkZXNjcmlwdG9yIHRhYmxlIGhhcworCSAqIGJlZW4gYWxsb2NhdGVkIGFjY29yZGluZyB0byB0aGlzIG51bWJlciAqLworCWZiLT5kZXNjX3RhYmxlLnBhZ2VfY291bnQgPSBjb3VudDsKKworCWlmIChyZXQpIHsKKwkJLyogdGhlIGRlc2NyaXB0b3Igd2l0aCBpbmRleCBpIGRvZXNuJ3QgY29udGFpbgorCQkgKiBhIHZhbGlkIGFkZHJlc3MgeWV0ICovCisJCXZpbm9fZnJlZV9idWZmZXJfd2l0aF9jb3VudChmYiwgaSk7CisJCXJldHVybiByZXQ7CisJfQorCisJLy9mYi0+c2l6ZSA9IHNpemU7CisJZmItPnNpemUgPSBjb3VudCAqIFBBR0VfU0laRTsKKworCS8qIHNldCB0aGUgZG1hIHN0b3AtYml0IGZvciB0aGUgbGFzdCAoY291bnQrMSl0aCBkZXNjcmlwdG9yICovCisJZmItPmRlc2NfdGFibGUuZG1hX2NwdVtWSU5PX1BBR0VfUkFUSU8gKiBjb3VudF0gPSBWSU5PX0RFU0NfU1RPUDsKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlX3ZpcnR1YWw6CisJa2ZyZWUoZmItPmRlc2NfdGFibGUudmlydHVhbCk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2aW5vX3N5bmNfYnVmZmVyKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYikKK3sKKwlpbnQgaTsKKworCWRwcmludGsoInZpbm9fc3luY19idWZmZXIoKTpcbiIpOworCisJZm9yIChpID0gMDsgaSA8IGZiLT5kZXNjX3RhYmxlLnBhZ2VfY291bnQ7IGkrKykKKwkJZG1hX3N5bmNfc2luZ2xlKE5VTEwsCisJCQkJZmItPmRlc2NfdGFibGUuZG1hX2NwdVtWSU5PX1BBR0VfUkFUSU8gKiBpXSwKKwkJCQlQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7Cit9CisKKy8qIEZyYW1lYnVmZmVyIGZpZm8gZnVuY3Rpb25zIChuZWVkIHRvIGJlIGxvY2tlZCBleHRlcm5hbGx5KSAqLworCitzdGF0aWMgdm9pZCB2aW5vX2ZpZm9faW5pdChzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9maWZvICpmLAorCQkJICAgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlmLT5sZW5ndGggPSAwOworCWYtPnVzZWQgPSAwOworCWYtPmhlYWQgPSAwOworCWYtPnRhaWwgPSAwOworCisJaWYgKGxlbmd0aCA+IFZJTk9fRlJBTUVCVUZGRVJfTUFYX0NPVU5UKQorCQlsZW5ndGggPSBWSU5PX0ZSQU1FQlVGRkVSX01BWF9DT1VOVDsKKworCWYtPmxlbmd0aCA9IGxlbmd0aDsKK30KKworLyogcmV0dXJucyB0cnVlL2ZhbHNlICovCitzdGF0aWMgaW50IHZpbm9fZmlmb19oYXNfaWQoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfZmlmbyAqZiwgdW5zaWduZWQgaW50IGlkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IGYtPmhlYWQ7IGkgPT0gKGYtPnRhaWwgLSAxKTsgaSA9IChpICsgMSkgJSBmLT5sZW5ndGgpIHsKKwkJaWYgKGYtPmRhdGFbaV0gPT0gaWQpCisJCQlyZXR1cm4gMTsKIAl9CiAKIAlyZXR1cm4gMDsKK30KIAotb3V0X3VucmVnaXN0ZXJfdmRldjoKLQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmVmluby0+Y2hBLnZkZXYpOwotb3V0X2kyY19kZWxfYnVzOgotCXZpbm9faTJjX2RlbF9idXMoKTsKLW91dF9mcmVlX2lycToKLQlmcmVlX2lycShTR0lfVklOT19JUlEsIE5VTEwpOwotb3V0X2ZyZWVfcGFnZToKLQlmcmVlX3BhZ2UoVmluby0+ZHVtbXlfcGFnZSk7Ci1vdXRfZnJlZV92aW5vOgotCWtmcmVlKFZpbm8pOwotb3V0X3VubWFwOgotCWlvdW5tYXAodmlubyk7CisvKiByZXR1cm5zIHRydWUvZmFsc2UgKi8KK3N0YXRpYyBpbnQgdmlub19maWZvX2Z1bGwoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfZmlmbyAqZikKK3sKKwlyZXR1cm4gKGYtPnVzZWQgPT0gZi0+bGVuZ3RoKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB2aW5vX2ZpZm9fZ2V0X3VzZWQoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfZmlmbyAqZikKK3sKKwlyZXR1cm4gZi0+dXNlZDsKK30KKworc3RhdGljIGludCB2aW5vX2ZpZm9fZW5xdWV1ZShzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9maWZvICpmLCB1bnNpZ25lZCBpbnQgaWQpCit7CisJaWYgKGlkID49IGYtPmxlbmd0aCkgeworCQlyZXR1cm4gVklOT19RVUVVRV9FUlJPUjsKKwl9CisKKwlpZiAodmlub19maWZvX2hhc19pZChmLCBpZCkpIHsKKwkJcmV0dXJuIFZJTk9fUVVFVUVfRVJST1I7CisJfQorCisJaWYgKGYtPnVzZWQgPCBmLT5sZW5ndGgpIHsKKwkJZi0+ZGF0YVtmLT50YWlsXSA9IGlkOworCQlmLT50YWlsID0gKGYtPnRhaWwgKyAxKSAlIGYtPmxlbmd0aDsKKwkJZi0+dXNlZCsrOworCX0gZWxzZSB7CisJCXJldHVybiBWSU5PX1FVRVVFX0VSUk9SOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9fZmlmb19wZWVrKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX2ZpZm8gKmYsIHVuc2lnbmVkIGludCAqaWQpCit7CisJaWYgKGYtPnVzZWQgPiAwKSB7CisJCSppZCA9IGYtPmRhdGFbZi0+aGVhZF07CisJfSBlbHNlIHsKKwkJcmV0dXJuIFZJTk9fUVVFVUVfRVJST1I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub19maWZvX2RlcXVldWUoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfZmlmbyAqZiwgdW5zaWduZWQgaW50ICppZCkKK3sKKwlpZiAoZi0+dXNlZCA+IDApIHsKKwkJKmlkID0gZi0+ZGF0YVtmLT5oZWFkXTsKKwkJZi0+aGVhZCA9IChmLT5oZWFkICsgMSkgJSBmLT5sZW5ndGg7CisJCWYtPnVzZWQtLTsKKwl9IGVsc2UgeworCQlyZXR1cm4gVklOT19RVUVVRV9FUlJPUjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogRnJhbWVidWZmZXIgcXVldWUgZnVuY3Rpb25zICovCisKKy8qIGV4ZWN1dGUgd2l0aCBxdWV1ZV9sb2NrIGxvY2tlZCAqLworc3RhdGljIHZvaWQgdmlub19xdWV1ZV9mcmVlX3dpdGhfY291bnQoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfcXVldWUgKnEsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlxLT5sZW5ndGggPSAwOworCW1lbXNldCgmcS0+aW4sIDAsIHNpemVvZihzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9maWZvKSk7CisJbWVtc2V0KCZxLT5vdXQsIDAsIHNpemVvZihzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9maWZvKSk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWRwcmludGsoInZpbm9fcXVldWVfZnJlZV93aXRoX2NvdW50KCk6IGZyZWVpbmcgYnVmZmVyICVkXG4iLAorCQkJaSk7CisJCXZpbm9fZnJlZV9idWZmZXIocS0+YnVmZmVyW2ldKTsKKwkJa2ZyZWUocS0+YnVmZmVyW2ldKTsKKwl9CisKKwlxLT50eXBlID0gVklOT19NRU1PUllfTk9ORTsKKwlxLT5tYWdpYyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHZpbm9fcXVldWVfZnJlZShzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9xdWV1ZSAqcSkKK3sKKwlkcHJpbnRrKCJ2aW5vX3F1ZXVlX2ZyZWUoKTpcbiIpOworCisJaWYgKHEtPm1hZ2ljICE9IFZJTk9fUVVFVUVfTUFHSUMpCisJCXJldHVybjsKKwlpZiAocS0+dHlwZSAhPSBWSU5PX01FTU9SWV9NTUFQKQorCQlyZXR1cm47CisKKwlkb3duKCZxLT5xdWV1ZV9zZW0pOworCisJdmlub19xdWV1ZV9mcmVlX3dpdGhfY291bnQocSwgcS0+bGVuZ3RoKTsKKworCXVwKCZxLT5xdWV1ZV9zZW0pOworfQorCitzdGF0aWMgaW50IHZpbm9fcXVldWVfaW5pdChzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9xdWV1ZSAqcSwKKwkJCSAgIHVuc2lnbmVkIGludCAqbGVuZ3RoKQoreworCXVuc2lnbmVkIGludCBpOworCWludCByZXQgPSAwOworCisJZHByaW50aygidmlub19xdWV1ZV9pbml0KCk6IGxlbmd0aCA9ICVkXG4iLCAqbGVuZ3RoKTsKKworCWlmIChxLT5tYWdpYyA9PSBWSU5PX1FVRVVFX01BR0lDKSB7CisJCWRwcmludGsoInZpbm9fcXVldWVfaW5pdCgpOiBxdWV1ZSBhbHJlYWR5IGluaXRpYWxpemVkIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChxLT50eXBlICE9IFZJTk9fTUVNT1JZX05PTkUpIHsKKwkJZHByaW50aygidmlub19xdWV1ZV9pbml0KCk6IHF1ZXVlIGFscmVhZHkgaW5pdGlhbGl6ZWQhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCpsZW5ndGggPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJnEtPnF1ZXVlX3NlbSk7CisKKwlpZiAoKmxlbmd0aCA+IFZJTk9fRlJBTUVCVUZGRVJfTUFYX0NPVU5UKQorCQkqbGVuZ3RoID0gVklOT19GUkFNRUJVRkZFUl9NQVhfQ09VTlQ7CisKKwlxLT5sZW5ndGggPSAwOworCisJZm9yIChpID0gMDsgaSA8ICpsZW5ndGg7IGkrKykgeworCQlkcHJpbnRrKCJ2aW5vX3F1ZXVlX2luaXQoKTogYWxsb2NhdGluZyBidWZmZXIgJWRcbiIsIGkpOworCQlxLT5idWZmZXJbaV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXEtPmJ1ZmZlcltpXSkgeworCQkJZHByaW50aygidmlub19xdWV1ZV9pbml0KCk6IGttYWxsb2MoKSBmYWlsZWRcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0ID0gdmlub19hbGxvY2F0ZV9idWZmZXIocS0+YnVmZmVyW2ldLAorCQkJCQkgICBWSU5PX0ZSQU1FQlVGRkVSX1NJWkUpOworCQlpZiAocmV0KSB7CisJCQlrZnJlZShxLT5idWZmZXJbaV0pOworCQkJZHByaW50aygidmlub19xdWV1ZV9pbml0KCk6ICIKKwkJCQkidmlub19hbGxvY2F0ZV9idWZmZXIoKSBmYWlsZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlxLT5idWZmZXJbaV0tPmlkID0gaTsKKwkJaWYgKGkgPiAwKSB7CisJCQlxLT5idWZmZXJbaV0tPm9mZnNldCA9IHEtPmJ1ZmZlcltpIC0gMV0tPm9mZnNldCArCisJCQkJcS0+YnVmZmVyW2kgLSAxXS0+c2l6ZTsKKwkJfSBlbHNlIHsKKwkJCXEtPmJ1ZmZlcltpXS0+b2Zmc2V0ID0gMDsKKwkJfQorCisJCXNwaW5fbG9ja19pbml0KCZxLT5idWZmZXJbaV0tPnN0YXRlX2xvY2spOworCisJCWRwcmludGsoInZpbm9fcXVldWVfaW5pdCgpOiBidWZmZXIgPSAlZCwgb2Zmc2V0ID0gJWQsICIKKwkJCSJzaXplID0gJWRcbiIsIGksIHEtPmJ1ZmZlcltpXS0+b2Zmc2V0LAorCQkJcS0+YnVmZmVyW2ldLT5zaXplKTsKKwl9CisKKwlpZiAocmV0KSB7CisJCXZpbm9fcXVldWVfZnJlZV93aXRoX2NvdW50KHEsIGkpOworCQkqbGVuZ3RoID0gMDsKKwl9IGVsc2UgeworCQlxLT5sZW5ndGggPSAqbGVuZ3RoOworCQl2aW5vX2ZpZm9faW5pdCgmcS0+aW4sIHEtPmxlbmd0aCk7CisJCXZpbm9fZmlmb19pbml0KCZxLT5vdXQsIHEtPmxlbmd0aCk7CisJCXEtPnR5cGUgPSBWSU5PX01FTU9SWV9NTUFQOworCQlxLT5tYWdpYyA9IFZJTk9fUVVFVUVfTUFHSUM7CisJfQorCisJdXAoJnEtPnF1ZXVlX3NlbSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgdmlub19leGl0KHZvaWQpCitzdGF0aWMgc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKnZpbm9fcXVldWVfYWRkKHN0cnVjdAorCQkJCQkgICAgICAgdmlub19mcmFtZWJ1ZmZlcl9xdWV1ZSAqcSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBpZCkKIHsKLQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmVmluby0+Y2hBLnZkZXYpOwotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZWaW5vLT5jaEIudmRldik7Ci0Jdmlub19pMmNfZGVsX2J1cygpOwotCWZyZWVfaXJxKFNHSV9WSU5PX0lSUSwgTlVMTCk7Ci0JZnJlZV9wYWdlKFZpbm8tPmR1bW15X3BhZ2UpOwotCWtmcmVlKFZpbm8pOwotCWlvdW5tYXAodmlubyk7CisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKnJldCA9IE5VTEw7CisJdW5zaWduZWQgaW50IHRvdGFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkcHJpbnRrKCJ2aW5vX3F1ZXVlX2FkZCgpOiBpZCA9ICVkXG4iLCBpZCk7CisKKwlpZiAocS0+bWFnaWMgIT0gVklOT19RVUVVRV9NQUdJQykgeworCQlyZXR1cm4gcmV0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocS0+bGVuZ3RoID09IDApCisJCWdvdG8gb3V0OworCisJaWYgKGlkID49IHEtPmxlbmd0aCkKKwkJZ290byBvdXQ7CisKKwkvKiBub3QgbmVlZGVkPzogaWYgKHZpbm9fZmlmb19mdWxsKCZxLT5vdXQpKSB7CisJCWdvdG8gb3V0OworCQl9Ki8KKwkvKiBjaGVjayB0aGF0IG91dGdvaW5nIHF1ZXVlIGlzbid0IGFscmVhZHkgZnVsbAorCSAqIChvciB0aGF0IGl0IHdvbid0IGJlY29tZSBmdWxsKSAqLworCXRvdGFsID0gdmlub19maWZvX2dldF91c2VkKCZxLT5pbikgKworCQl2aW5vX2ZpZm9fZ2V0X3VzZWQoJnEtPm91dCk7CisJaWYgKHRvdGFsID49IHEtPmxlbmd0aCkKKwkJZ290byBvdXQ7CisKKwlpZiAodmlub19maWZvX2VucXVldWUoJnEtPmluLCBpZCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gcS0+YnVmZmVyW2lkXTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7CiB9CiAKLW1vZHVsZV9pbml0KHZpbm9faW5pdCk7Ci1tb2R1bGVfZXhpdCh2aW5vX2V4aXQpOworc3RhdGljIHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICp2aW5vX3F1ZXVlX3RyYW5zZmVyKHN0cnVjdAorCQkJCQkJICAgIHZpbm9fZnJhbWVidWZmZXJfcXVldWUgKnEpCit7CisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKnJldCA9IE5VTEw7CisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmZiOworCWludCBpZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIlZpZGVvNExpbnV4IGRyaXZlciBmb3IgU0dJIEluZHkgVklOTyAoSW5keUNhbSkiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwlkcHJpbnRrKCJ2aW5vX3F1ZXVlX3RyYW5zZmVyKCk6XG4iKTsKKworCWlmIChxLT5tYWdpYyAhPSBWSU5PX1FVRVVFX01BR0lDKSB7CisJCXJldHVybiByZXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmIChxLT5sZW5ndGggPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvLyBub3cgdGhpcyBhY3R1YWxseSByZW1vdmVzIGFuIGVudHJ5IGZyb20gdGhlIGluY29taW5nIHF1ZXVlCisJaWYgKHZpbm9fZmlmb19kZXF1ZXVlKCZxLT5pbiwgJmlkKSkgeworCQlnb3RvIG91dDsKKwl9CisKKwlkcHJpbnRrKCJ2aW5vX3F1ZXVlX3RyYW5zZmVyKCk6IGlkID0gJWRcbiIsIGlkKTsKKwlmYiA9IHEtPmJ1ZmZlcltpZF07CisKKwkvLyB3ZSBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZSBvdXRnb2luZyBxdWV1ZSBpcyBub3QgZnVsbCwgYnV0Li4uCisJaWYgKHZpbm9fZmlmb19lbnF1ZXVlKCZxLT5vdXQsIGlkKSkgeworCQlwcmludGsoS0VSTl9FUlIgInZpbm9fcXVldWVfdHJhbnNmZXIoKTogIgorCQkgICAgICAgIm91dGdvaW5nIHF1ZXVlIGlzIGZ1bGwsIHRoaXMgc2hvdWxkbid0IGhhcHBlbiFcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBmYjsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiByZXR1cm5zIHRydWUvZmFsc2UgKi8KK3N0YXRpYyBpbnQgdmlub19xdWV1ZV9pbmNvbWluZ19jb250YWlucyhzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9xdWV1ZSAqcSwKKwkJCQkJdW5zaWduZWQgaW50IGlkKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocS0+bWFnaWMgIT0gVklOT19RVUVVRV9NQUdJQykgeworCQlyZXR1cm4gcmV0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocS0+bGVuZ3RoID09IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gdmlub19maWZvX2hhc19pZCgmcS0+aW4sIGlkKTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIHJldHVybnMgdHJ1ZS9mYWxzZSAqLworc3RhdGljIGludCB2aW5vX3F1ZXVlX291dGdvaW5nX2NvbnRhaW5zKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX3F1ZXVlICpxLAorCQkJCQl1bnNpZ25lZCBpbnQgaWQpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChxLT5tYWdpYyAhPSBWSU5PX1FVRVVFX01BR0lDKSB7CisJCXJldHVybiByZXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmIChxLT5sZW5ndGggPT0gMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSB2aW5vX2ZpZm9faGFzX2lkKCZxLT5vdXQsIGlkKTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmlub19xdWV1ZV9nZXRfaW5jb21pbmcoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfcXVldWUgKnEsCisJCQkJICAgdW5zaWduZWQgaW50ICp1c2VkKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocS0+bWFnaWMgIT0gVklOT19RVUVVRV9NQUdJQykgeworCQlyZXR1cm4gVklOT19RVUVVRV9FUlJPUjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJaWYgKHEtPmxlbmd0aCA9PSAwKSB7CisJCXJldCA9IFZJTk9fUVVFVUVfRVJST1I7CisJCWdvdG8gb3V0OworCX0KKworCSp1c2VkID0gdmlub19maWZvX2dldF91c2VkKCZxLT5pbik7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZpbm9fcXVldWVfZ2V0X291dGdvaW5nKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX3F1ZXVlICpxLAorCQkJCSAgIHVuc2lnbmVkIGludCAqdXNlZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHEtPm1hZ2ljICE9IFZJTk9fUVVFVUVfTUFHSUMpIHsKKwkJcmV0dXJuIFZJTk9fUVVFVUVfRVJST1I7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmIChxLT5sZW5ndGggPT0gMCkgeworCQlyZXQgPSBWSU5PX1FVRVVFX0VSUk9SOworCQlnb3RvIG91dDsKKwl9CisKKwkqdXNlZCA9IHZpbm9fZmlmb19nZXRfdXNlZCgmcS0+b3V0KTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmlub19xdWV1ZV9nZXRfdG90YWwoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfcXVldWUgKnEsCisJCQkJdW5zaWduZWQgaW50ICp0b3RhbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHEtPm1hZ2ljICE9IFZJTk9fUVVFVUVfTUFHSUMpIHsKKwkJcmV0dXJuIFZJTk9fUVVFVUVfRVJST1I7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmIChxLT5sZW5ndGggPT0gMCkgeworCQlyZXQgPSBWSU5PX1FVRVVFX0VSUk9SOworCQlnb3RvIG91dDsKKwl9CisKKwkqdG90YWwgPSB2aW5vX2ZpZm9fZ2V0X3VzZWQoJnEtPmluKSArCisJCXZpbm9fZmlmb19nZXRfdXNlZCgmcS0+b3V0KTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqdmlub19xdWV1ZV9wZWVrKHN0cnVjdAorCQkJCQkJdmlub19mcmFtZWJ1ZmZlcl9xdWV1ZSAqcSwKKwkJCQkJCXVuc2lnbmVkIGludCAqaWQpCit7CisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKnJldCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChxLT5tYWdpYyAhPSBWSU5PX1FVRVVFX01BR0lDKSB7CisJCXJldHVybiByZXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmIChxLT5sZW5ndGggPT0gMCkKKwkJZ290byBvdXQ7CisKKwlpZiAodmlub19maWZvX3BlZWsoJnEtPmluLCBpZCkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gcS0+YnVmZmVyWyppZF07CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICp2aW5vX3F1ZXVlX3JlbW92ZShzdHJ1Y3QKKwkJCQkJCSAgdmlub19mcmFtZWJ1ZmZlcl9xdWV1ZSAqcSwKKwkJCQkJCSAgdW5zaWduZWQgaW50ICppZCkKK3sKKwlzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqcmV0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRwcmludGsoInZpbm9fcXVldWVfcmVtb3ZlKCk6XG4iKTsKKworCWlmIChxLT5tYWdpYyAhPSBWSU5PX1FVRVVFX01BR0lDKSB7CisJCXJldHVybiByZXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmIChxLT5sZW5ndGggPT0gMCkKKwkJZ290byBvdXQ7CisKKwlpZiAodmlub19maWZvX2RlcXVldWUoJnEtPm91dCwgaWQpKSB7CisJCWdvdG8gb3V0OworCX0KKworCWRwcmludGsoInZpbm9fcXVldWVfcmVtb3ZlKCk6IGlkID0gJWRcbiIsICppZCk7CisJcmV0ID0gcS0+YnVmZmVyWyppZF07CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdAordmlub19mcmFtZWJ1ZmZlciAqdmlub19xdWV1ZV9nZXRfYnVmZmVyKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX3F1ZXVlICpxLAorCQkJCQl1bnNpZ25lZCBpbnQgaWQpCit7CisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKnJldCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChxLT5tYWdpYyAhPSBWSU5PX1FVRVVFX01BR0lDKSB7CisJCXJldHVybiByZXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmIChxLT5sZW5ndGggPT0gMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoaWQgPj0gcS0+bGVuZ3RoKQorCQlnb3RvIG91dDsKKworCXJldCA9IHEtPmJ1ZmZlcltpZF07Cisgb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlub19xdWV1ZV9nZXRfbGVuZ3RoKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX3F1ZXVlICpxKQoreworCXVuc2lnbmVkIGludCBsZW5ndGggPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocS0+bWFnaWMgIT0gVklOT19RVUVVRV9NQUdJQykgeworCQlyZXR1cm4gbGVuZ3RoOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJbGVuZ3RoID0gcS0+bGVuZ3RoOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQgdmlub19xdWV1ZV9oYXNfbWFwcGVkX2J1ZmZlcnMoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfcXVldWUgKnEpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChxLT5tYWdpYyAhPSBWSU5PX1FVRVVFX01BR0lDKSB7CisJCXJldHVybiByZXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bGVuZ3RoOyBpKyspIHsKKwkJaWYgKHEtPmJ1ZmZlcltpXS0+bWFwX2NvdW50ID4gMCkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFZJTk8gZnVuY3Rpb25zICovCisKKy8qIGV4ZWN1dGUgd2l0aCBpbnB1dF9sb2NrIGxvY2tlZCAqLworc3RhdGljIHZvaWQgdmlub191cGRhdGVfbGluZV9zaXplKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcykKK3sKKwl1bnNpZ25lZCBpbnQgdyA9IHZjcy0+Y2xpcHBpbmcucmlnaHQgLSB2Y3MtPmNsaXBwaW5nLmxlZnQ7CisJdW5zaWduZWQgaW50IGQgPSB2Y3MtPmRlY2ltYXRpb247CisJdW5zaWduZWQgaW50IGJwcCA9IHZpbm9fZGF0YV9mb3JtYXRzW3Zjcy0+ZGF0YV9mb3JtYXRdLmJwcDsKKyAgICAgICAgdW5zaWduZWQgaW50IGxzaXplOworCisJZHByaW50aygidXBkYXRlX2xpbmVfc2l6ZSgpOiBiZWZvcmU6IHcgPSAlZCwgZCA9ICVkLCAiCisJCSJsaW5lX3NpemUgPSAlZFxuIiwgdywgZCwgdmNzLT5saW5lX3NpemUpOworICAgICAgICAvKiBsaW5lIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiA4IGJ5dGVzICovCisJbHNpemUgPSAoYnBwICogKHcgLyBkKSkgJiB+NzsKKwl3ID0gKGxzaXplIC8gYnBwKSAqIGQ7CisKKwl2Y3MtPmNsaXBwaW5nLnJpZ2h0ID0gdmNzLT5jbGlwcGluZy5sZWZ0ICsgdzsKKwl2Y3MtPmxpbmVfc2l6ZSA9IGxzaXplOworCWRwcmludGsoInVwZGF0ZV9saW5lX3NpemUoKTogYWZ0ZXI6IHcgPSAlZCwgZCA9ICVkLCAiCisJCSJsaW5lX3NpemUgPSAlZFxuIiwgdywgZCwgdmNzLT5saW5lX3NpemUpOworfQorCisvKiBleGVjdXRlIHdpdGggaW5wdXRfbG9jayBsb2NrZWQgKi8KK3N0YXRpYyB2b2lkIHZpbm9fc2V0X2NsaXBwaW5nKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgICAgIHVuc2lnbmVkIGludCB4LCB1bnNpZ25lZCBpbnQgeSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCB3LCB1bnNpZ25lZCBpbnQgaCkKK3sKKwl1bnNpZ25lZCBpbnQgbWF4d2lkdGgsIG1heGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgZDsKKworCW1heHdpZHRoID0gdmlub19kYXRhX25vcm1zW3Zjcy0+ZGF0YV9ub3JtXS53aWR0aDsKKwltYXhoZWlnaHQgPSB2aW5vX2RhdGFfbm9ybXNbdmNzLT5kYXRhX25vcm1dLmhlaWdodDsKKwlkID0gdmNzLT5kZWNpbWF0aW9uOworCisJeSAmPSB+MTsJLyogb2RkL2V2ZW4gZmllbGRzICovCisKKwlpZiAoeCA+IG1heHdpZHRoKSB7CisJCXggPSAwOworCX0KKwlpZiAoeSA+IG1heGhlaWdodCkgeworCQl5ID0gMDsKKwl9CisKKwlpZiAoKCh3IC8gZCkgPCBWSU5PX01JTl9XSURUSCkKKwkgICAgfHwgKChoIC8gZCkgPCBWSU5PX01JTl9IRUlHSFQpKSB7CisJCXcgPSBWSU5PX01JTl9XSURUSCAqIGQ7CisJCWggPSBWSU5PX01JTl9IRUlHSFQgKiBkOworCX0KKworCWlmICgoeCArIHcpID4gbWF4d2lkdGgpIHsKKwkJdyA9IG1heHdpZHRoIC0geDsKKwkJaWYgKCh3IC8gZCkgPCBWSU5PX01JTl9XSURUSCkKKwkJCXggPSBtYXh3aWR0aCAtIFZJTk9fTUlOX1dJRFRIICogZDsKKwl9CisJaWYgKCh5ICsgaCkgPiBtYXhoZWlnaHQpIHsKKwkJaCA9IG1heGhlaWdodCAtIHk7CisJCWlmICgoaCAvIGQpIDwgVklOT19NSU5fSEVJR0hUKQorCQkJeSA9IG1heGhlaWdodCAtIFZJTk9fTUlOX0hFSUdIVCAqIGQ7CisJfQorCisJdmNzLT5jbGlwcGluZy5sZWZ0ID0geDsKKwl2Y3MtPmNsaXBwaW5nLnRvcCA9IHk7CisJdmNzLT5jbGlwcGluZy5yaWdodCA9IHggKyB3OworCXZjcy0+Y2xpcHBpbmcuYm90dG9tID0geSArIGg7CisKKwl2aW5vX3VwZGF0ZV9saW5lX3NpemUodmNzKTsKKworCWRwcmludGsoImNsaXBwaW5nICVkLCAlZCwgJWQsICVkIC8gJWQgLSAlZFxuIiwKKwkJdmNzLT5jbGlwcGluZy5sZWZ0LCB2Y3MtPmNsaXBwaW5nLnRvcCwgdmNzLT5jbGlwcGluZy5yaWdodCwKKwkJdmNzLT5jbGlwcGluZy5ib3R0b20sIHZjcy0+ZGVjaW1hdGlvbiwgdmNzLT5saW5lX3NpemUpOworfQorCisvKiBleGVjdXRlIHdpdGggaW5wdXRfbG9jayBsb2NrZWQgKi8KK3N0YXRpYyB2b2lkIHZpbm9fc2V0X2RlZmF1bHRfY2xpcHBpbmcoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCXZpbm9fc2V0X2NsaXBwaW5nKHZjcywgMCwgMCwgdmlub19kYXRhX25vcm1zW3Zjcy0+ZGF0YV9ub3JtXS53aWR0aCwKKwkJCSAgdmlub19kYXRhX25vcm1zW3Zjcy0+ZGF0YV9ub3JtXS5oZWlnaHQpOworfQorCisvKiBleGVjdXRlIHdpdGggaW5wdXRfbG9jayBsb2NrZWQgKi8KK3N0YXRpYyB2b2lkIHZpbm9fc2V0X3NjYWxpbmcoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgpCit7CisJdW5zaWduZWQgaW50IHgsIHksIGN1cncsIGN1cmgsIGQ7CisKKwl4ID0gdmNzLT5jbGlwcGluZy5sZWZ0OworCXkgPSB2Y3MtPmNsaXBwaW5nLnRvcDsKKwljdXJ3ID0gdmNzLT5jbGlwcGluZy5yaWdodCAtIHZjcy0+Y2xpcHBpbmcubGVmdDsKKwljdXJoID0gdmNzLT5jbGlwcGluZy5ib3R0b20gLSB2Y3MtPmNsaXBwaW5nLnRvcDsKKworCWQgPSBtYXgoY3VydyAvIHcsIGN1cmggLyBoKTsKKworCWRwcmludGsoInNjYWxpbmcgdzogJWQsIGg6ICVkLCBjdXJ3OiAlZCwgY3VyaDogJWQsIGQ6ICVkXG4iLAorCQl3LCBoLCBjdXJ3LCBjdXJoLCBkKTsKKworCWlmIChkIDwgMSkgeworCQlkID0gMTsKKwl9CisJaWYgKGQgPiA4KSB7CisJCWQgPSA4OworCX0KKworCXZjcy0+ZGVjaW1hdGlvbiA9IGQ7CisJdmlub19zZXRfY2xpcHBpbmcodmNzLCB4LCB5LCB3ICogZCwgaCAqIGQpOworCisJZHByaW50aygic2NhbGluZyAlZCwgJWQsICVkLCAlZCAvICVkIC0gJWRcbiIsIHZjcy0+Y2xpcHBpbmcubGVmdCwKKwkJdmNzLT5jbGlwcGluZy50b3AsIHZjcy0+Y2xpcHBpbmcucmlnaHQsIHZjcy0+Y2xpcHBpbmcuYm90dG9tLAorCQl2Y3MtPmRlY2ltYXRpb24sIHZjcy0+bGluZV9zaXplKTsKK30KKworLyogZXhlY3V0ZSB3aXRoIGlucHV0X2xvY2sgbG9ja2VkICovCitzdGF0aWMgdm9pZCB2aW5vX3Jlc2V0X3NjYWxpbmcoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCXZpbm9fc2V0X3NjYWxpbmcodmNzLCB2Y3MtPmNsaXBwaW5nLnJpZ2h0IC0gdmNzLT5jbGlwcGluZy5sZWZ0LAorCQkJIHZjcy0+Y2xpcHBpbmcuYm90dG9tIC0gdmNzLT5jbGlwcGluZy50b3ApOworfQorCisvKiBleGVjdXRlIHdpdGggaW5wdXRfbG9jayBsb2NrZWQgKi8KK3N0YXRpYyB2b2lkIHZpbm9fc2V0X2ZyYW1lcmF0ZShzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGZwcykKK3sKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCXN3aXRjaCAodmNzLT5kYXRhX25vcm0pIHsKKwljYXNlIFZJTk9fREFUQV9OT1JNX05UU0M6CisJY2FzZSBWSU5PX0RBVEFfTk9STV9EMToKKwkJZnBzID0gKHVuc2lnbmVkIGludCkoZnBzIC8gNikgKiA2OyAvLyBGSVhNRTogcm91bmQhCisKKwkJaWYgKGZwcyA8IHZpbm9fZGF0YV9ub3Jtc1t2Y3MtPmRhdGFfbm9ybV0uZnBzX21pbikKKwkJCWZwcyA9IHZpbm9fZGF0YV9ub3Jtc1t2Y3MtPmRhdGFfbm9ybV0uZnBzX21pbjsKKwkJaWYgKGZwcyA+IHZpbm9fZGF0YV9ub3Jtc1t2Y3MtPmRhdGFfbm9ybV0uZnBzX21heCkKKwkJCWZwcyA9IHZpbm9fZGF0YV9ub3Jtc1t2Y3MtPmRhdGFfbm9ybV0uZnBzX21heDsKKworCQlzd2l0Y2ggKGZwcykgeworCQljYXNlIDY6CisJCQltYXNrID0gMHgwMDM7CisJCQlicmVhazsKKwkJY2FzZSAxMjoKKwkJCW1hc2sgPSAweDBjMzsKKwkJCWJyZWFrOworCQljYXNlIDE4OgorCQkJbWFzayA9IDB4MzMzOworCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCQltYXNrID0gMHgzZmY7CisJCQlicmVhazsKKwkJY2FzZSAzMDoKKwkJCW1hc2sgPSAweGZmZjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbWFzayA9IFZJTk9fRlJBTUVSVF9GVUxMOworCQl9CisJCXZjcy0+ZnJhbWVydF9yZWcgPSBWSU5PX0ZSQU1FUlRfUlQobWFzayk7CisJCWJyZWFrOworCWNhc2UgVklOT19EQVRBX05PUk1fUEFMOgorCWNhc2UgVklOT19EQVRBX05PUk1fU0VDQU06CisJCWZwcyA9ICh1bnNpZ25lZCBpbnQpKGZwcyAvIDUpICogNTsgLy8gRklYTUU6IHJvdW5kIQorCisJCWlmIChmcHMgPCB2aW5vX2RhdGFfbm9ybXNbdmNzLT5kYXRhX25vcm1dLmZwc19taW4pCisJCQlmcHMgPSB2aW5vX2RhdGFfbm9ybXNbdmNzLT5kYXRhX25vcm1dLmZwc19taW47CisJCWlmIChmcHMgPiB2aW5vX2RhdGFfbm9ybXNbdmNzLT5kYXRhX25vcm1dLmZwc19tYXgpCisJCQlmcHMgPSB2aW5vX2RhdGFfbm9ybXNbdmNzLT5kYXRhX25vcm1dLmZwc19tYXg7CisKKwkJc3dpdGNoIChmcHMpIHsKKwkJY2FzZSA1OgorCQkJbWFzayA9IDB4MDAzOworCQkJYnJlYWs7CisJCWNhc2UgMTA6CisJCQltYXNrID0gMHgwYzM7CisJCQlicmVhazsKKwkJY2FzZSAxNToKKwkJCW1hc2sgPSAweDMzMzsKKwkJCWJyZWFrOworCQljYXNlIDIwOgorCQkJbWFzayA9IDB4MGZmOworCQkJYnJlYWs7CisJCWNhc2UgMjU6CisJCQltYXNrID0gMHgzZmY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1hc2sgPSBWSU5PX0ZSQU1FUlRfRlVMTDsKKwkJfQorCQl2Y3MtPmZyYW1lcnRfcmVnID0gVklOT19GUkFNRVJUX1JUKG1hc2spIHwgVklOT19GUkFNRVJUX1BBTDsKKwkJYnJlYWs7CisJfQorCisJdmNzLT5mcHMgPSBmcHM7Cit9CisKKy8qIGV4ZWN1dGUgd2l0aCBpbnB1dF9sb2NrIGxvY2tlZCAqLworc3RhdGljIHZvaWQgdmlub19zZXRfZGVmYXVsdF9mcmFtZXJhdGUoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCXZpbm9fc2V0X2ZyYW1lcmF0ZSh2Y3MsIHZpbm9fZGF0YV9ub3Jtc1t2Y3MtPmRhdGFfbm9ybV0uZnBzX21heCk7Cit9CisKKy8qCisgKiBQcmVwYXJlIFZJTk8gZm9yIERNQSB0cmFuc2Zlci4uLgorICogKGV4ZWN1dGUgb25seSB3aXRoIHZpbm9fbG9jayBhbmQgaW5wdXRfbG9jayBsb2NrZWQpCisgKi8KK3N0YXRpYyBpbnQgdmlub19kbWFfc2V0dXAoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICBzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqZmIpCit7CisJdTMyIGN0cmwsIGludHI7CisJc3RydWN0IHNnaV92aW5vX2NoYW5uZWwgKmNoOworCWNvbnN0IHN0cnVjdCB2aW5vX2RhdGFfbm9ybSAqbm9ybTsKKworCWRwcmludGsoInZpbm9fZG1hX3NldHVwKCk6XG4iKTsKKworCXZjcy0+ZmllbGQgPSAwOworCWZiLT5mcmFtZV9jb3VudGVyID0gMDsKKworCWNoID0gKHZjcy0+Y2hhbm5lbCA9PSBWSU5PX0NIQU5ORUxfQSkgPyAmdmluby0+YSA6ICZ2aW5vLT5iOworCW5vcm0gPSAmdmlub19kYXRhX25vcm1zW3Zjcy0+ZGF0YV9ub3JtXTsKKworCWNoLT5wYWdlX2luZGV4ID0gMDsKKwljaC0+bGluZV9jb3VudCA9IDA7CisKKwkvKiBWSU5PIGxpbmUgc2l6ZSByZWdpc3RlciBpcyBzZXQgOCBieXRlcyBsZXNzIHRoYW4gYWN0dWFsICovCisJY2gtPmxpbmVfc2l6ZSA9IHZjcy0+bGluZV9zaXplIC0gODsKKworCS8qIGxldCBWSU5PIGtub3cgd2hlcmUgdG8gdHJhbnNmZXIgZGF0YSAqLworCWNoLT5zdGFydF9kZXNjX3RibCA9IGZiLT5kZXNjX3RhYmxlLmRtYTsKKwljaC0+bmV4dF80X2Rlc2MgPSBmYi0+ZGVzY190YWJsZS5kbWE7CisKKwkvKiBnaXZlIHZpbm8gdGltZSB0byBmZXRjaCB0aGUgZmlyc3QgZm91ciBkZXNjcmlwdG9ycywgNSB1c2VjCisJICogc2hvdWxkIGJlIG1vcmUgdGhhbiBlbm91Z2ggdGltZSAqLworCXVkZWxheShWSU5PX0RFU0NfRkVUQ0hfREVMQVkpOworCisJLyogc2V0IHRoZSBhbHBoYSByZWdpc3RlciAqLworCWNoLT5hbHBoYSA9IHZjcy0+YWxwaGE7CisKKwkvKiBzZXQgY2xpcHBpbmcgcmVnaXN0ZXJzICovCisJY2gtPmNsaXBfc3RhcnQgPSBWSU5PX0NMSVBfT0REKG5vcm0tPm9kZC50b3AgKyB2Y3MtPmNsaXBwaW5nLnRvcCAvIDIpIHwKKwkJVklOT19DTElQX0VWRU4obm9ybS0+ZXZlbi50b3AgKworCQkJICAgICAgIHZjcy0+Y2xpcHBpbmcudG9wIC8gMikgfAorCQlWSU5PX0NMSVBfWCh2Y3MtPmNsaXBwaW5nLmxlZnQpOworCWNoLT5jbGlwX2VuZCA9IFZJTk9fQ0xJUF9PREQobm9ybS0+b2RkLnRvcCArCisJCQkJICAgICB2Y3MtPmNsaXBwaW5nLmJvdHRvbSAvIDIgLSAxKSB8CisJCVZJTk9fQ0xJUF9FVkVOKG5vcm0tPmV2ZW4udG9wICsKKwkJCSAgICAgICB2Y3MtPmNsaXBwaW5nLmJvdHRvbSAvIDIgLSAxKSB8CisJCVZJTk9fQ0xJUF9YKHZjcy0+Y2xpcHBpbmcucmlnaHQpOworCS8qIEZJWE1FOiBlbmQtb2YtZmllbGQgYnVnIHdvcmthcm91bmQKKwkJICAgICAgIFZJTk9fQ0xJUF9YKFZJTk9fUEFMX1dJRFRIKTsKKwkgKi8KKworCS8qIHNldCB0aGUgc2l6ZSBvZiBhY3R1YWwgY29udGVudCBpbiB0aGUgYnVmZmVyIChERUNJTUFUSU9OICEpICovCisJZmItPmRhdGFfc2l6ZSA9ICgodmNzLT5jbGlwcGluZy5yaWdodCAtIHZjcy0+Y2xpcHBpbmcubGVmdCkgLworCQkJIHZjcy0+ZGVjaW1hdGlvbikgKgorCQkoKHZjcy0+Y2xpcHBpbmcuYm90dG9tIC0gdmNzLT5jbGlwcGluZy50b3ApIC8KKwkJIHZjcy0+ZGVjaW1hdGlvbikgKgorCQl2aW5vX2RhdGFfZm9ybWF0c1t2Y3MtPmRhdGFfZm9ybWF0XS5icHA7CisKKwljaC0+ZnJhbWVfcmF0ZSA9IHZjcy0+ZnJhbWVydF9yZWc7CisKKwljdHJsID0gdmluby0+Y29udHJvbDsKKwlpbnRyID0gdmluby0+aW50cl9zdGF0dXM7CisKKwlpZiAodmNzLT5jaGFubmVsID09IFZJTk9fQ0hBTk5FTF9BKSB7CisJCS8qIEFsbCBpbnRlcnJ1cHQgY29uZGl0aW9ucyBmb3IgdGhpcyBjaGFubmVsIHdhcyBjbGVhcmVkCisJCSAqIHNvIGNsZWFyIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIGFuZCBlbmFibGUKKwkJICogaW50ZXJydXB0cyAqLworCQlpbnRyICY9CX5WSU5PX0lOVFNUQVRfQTsKKwkJY3RybCB8PSBWSU5PX0NUUkxfQV9JTlQ7CisKKwkJLyogZW5hYmxlIHN5bmNocm9uaXphdGlvbiAqLworCQljdHJsIHw9IFZJTk9fQ1RSTF9BX1NZTkNfRU5CTDsKKworCQkvKiBlbmFibGUgZnJhbWUgYXNzZW1ibHkgKi8KKwkJY3RybCB8PSBWSU5PX0NUUkxfQV9JTlRFUkxFQVZFX0VOQkw7CisKKwkJLyogc2V0IGRlY2ltYXRpb24gdXNlZCAqLworCQlpZiAodmNzLT5kZWNpbWF0aW9uIDwgMikKKwkJCWN0cmwgJj0gflZJTk9fQ1RSTF9BX0RFQ19FTkJMOworCQllbHNlIHsKKwkJCWN0cmwgfD0gVklOT19DVFJMX0FfREVDX0VOQkw7CisJCQljdHJsICY9IH5WSU5PX0NUUkxfQV9ERUNfU0NBTEVfTUFTSzsKKwkJCWN0cmwgfD0gKHZjcy0+ZGVjaW1hdGlvbiAtIDEpIDw8CisJCQkJVklOT19DVFJMX0FfREVDX1NDQUxFX1NISUZUOworCQl9CisKKwkJLyogc2VsZWN0IGlucHV0IGludGVyZmFjZSAqLworCQlpZiAodmNzLT5pbnB1dCA9PSBWSU5PX0lOUFVUX0QxKQorCQkJY3RybCB8PSBWSU5PX0NUUkxfQV9TRUxFQ1Q7CisJCWVsc2UKKwkJCWN0cmwgJj0gflZJTk9fQ1RSTF9BX1NFTEVDVDsKKworCQkvKiBwYWxldHRlICovCisJCWN0cmwgJj0gfihWSU5PX0NUUkxfQV9MVU1BX09OTFkgfCBWSU5PX0NUUkxfQV9SR0IgfAorCQkJICBWSU5PX0NUUkxfQV9ESVRIRVIpOworCX0gZWxzZSB7CisJCWludHIgJj0gflZJTk9fSU5UU1RBVF9COworCQljdHJsIHw9IFZJTk9fQ1RSTF9CX0lOVDsKKworCQljdHJsIHw9IFZJTk9fQ1RSTF9CX1NZTkNfRU5CTDsKKwkJY3RybCB8PSBWSU5PX0NUUkxfQl9JTlRFUkxFQVZFX0VOQkw7CisKKwkJaWYgKHZjcy0+ZGVjaW1hdGlvbiA8IDIpCisJCQljdHJsICY9IH5WSU5PX0NUUkxfQl9ERUNfRU5CTDsKKwkJZWxzZSB7CisJCQljdHJsIHw9IFZJTk9fQ1RSTF9CX0RFQ19FTkJMOworCQkJY3RybCAmPSB+VklOT19DVFJMX0JfREVDX1NDQUxFX01BU0s7CisJCQljdHJsIHw9ICh2Y3MtPmRlY2ltYXRpb24gLSAxKSA8PAorCQkJCVZJTk9fQ1RSTF9CX0RFQ19TQ0FMRV9TSElGVDsKKworCQl9CisJCWlmICh2Y3MtPmlucHV0ID09IFZJTk9fSU5QVVRfRDEpCisJCQljdHJsIHw9IFZJTk9fQ1RSTF9CX1NFTEVDVDsKKwkJZWxzZQorCQkJY3RybCAmPSB+VklOT19DVFJMX0JfU0VMRUNUOworCisJCWN0cmwgJj0gfihWSU5PX0NUUkxfQl9MVU1BX09OTFkgfCBWSU5PX0NUUkxfQl9SR0IgfAorCQkJICBWSU5PX0NUUkxfQl9ESVRIRVIpOworCX0KKworCS8qIHNldCBwYWxldHRlICovCisJZmItPmRhdGFfZm9ybWF0ID0gdmNzLT5kYXRhX2Zvcm1hdDsKKworCXN3aXRjaCAodmNzLT5kYXRhX2Zvcm1hdCkgeworCQljYXNlIFZJTk9fREFUQV9GTVRfR1JFWToKKwkJCWN0cmwgfD0gKHZjcy0+Y2hhbm5lbCA9PSBWSU5PX0NIQU5ORUxfQSkgPworCQkJCVZJTk9fQ1RSTF9BX0xVTUFfT05MWSA6IFZJTk9fQ1RSTF9CX0xVTUFfT05MWTsKKwkJCWJyZWFrOworCQljYXNlIFZJTk9fREFUQV9GTVRfUkdCMzI6CisJCQljdHJsIHw9ICh2Y3MtPmNoYW5uZWwgPT0gVklOT19DSEFOTkVMX0EpID8KKwkJCQlWSU5PX0NUUkxfQV9SR0IgOiBWSU5PX0NUUkxfQl9SR0I7CisJCQlicmVhazsKKwkJY2FzZSBWSU5PX0RBVEFfRk1UX1lVVjoKKwkJCS8qIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZSAqLworCQkJYnJlYWs7CisJCWNhc2UgVklOT19EQVRBX0ZNVF9SR0IzMzI6CisJCQljdHJsIHw9ICh2Y3MtPmNoYW5uZWwgPT0gVklOT19DSEFOTkVMX0EpID8KKwkJCQlWSU5PX0NUUkxfQV9SR0IgfCBWSU5PX0NUUkxfQV9ESVRIRVIgOgorCQkJCVZJTk9fQ1RSTF9CX1JHQiB8IFZJTk9fQ1RSTF9CX0RJVEhFUjsKKwkJCWJyZWFrOworCX0KKworCXZpbm8tPmludHJfc3RhdHVzID0gaW50cjsKKwl2aW5vLT5jb250cm9sID0gY3RybDsKKworCXJldHVybiAwOworfQorCisvKiAoZXhlY3V0ZSBvbmx5IHdpdGggdmlub19sb2NrIGxvY2tlZCkgKi8KK3N0YXRpYyB2b2lkIHZpbm9fZG1hX3N0YXJ0KHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcykKK3sKKwl1MzIgY3RybCA9IHZpbm8tPmNvbnRyb2w7CisKKwlkcHJpbnRrKCJ2aW5vX2RtYV9zdGFydCgpOlxuIik7CisJY3RybCB8PSAodmNzLT5jaGFubmVsID09IFZJTk9fQ0hBTk5FTF9BKSA/CisJCVZJTk9fQ1RSTF9BX0RNQV9FTkJMIDogVklOT19DVFJMX0JfRE1BX0VOQkw7CisJdmluby0+Y29udHJvbCA9IGN0cmw7Cit9CisKKy8qIChleGVjdXRlIG9ubHkgd2l0aCB2aW5vX2xvY2sgbG9ja2VkKSAqLworc3RhdGljIHZvaWQgdmlub19kbWFfc3RvcChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MpCit7CisJdTMyIGN0cmwgPSB2aW5vLT5jb250cm9sOworCisJY3RybCAmPSAodmNzLT5jaGFubmVsID09IFZJTk9fQ0hBTk5FTF9BKSA/CisJCX5WSU5PX0NUUkxfQV9ETUFfRU5CTCA6IH5WSU5PX0NUUkxfQl9ETUFfRU5CTDsKKwl2aW5vLT5jb250cm9sID0gY3RybDsKKwlkcHJpbnRrKCJ2aW5vX2RtYV9zdG9wKCk6XG4iKTsKK30KKworLyoKKyAqIExvYWQgZHVtbXkgcGFnZSB0byBkZXNjcmlwdG9yIHJlZ2lzdGVycy4gVGhpcyBwcmV2ZW50cyBnZW5lcmF0aW5nIG9mCisgKiBzcHVyaW91cyBpbnRlcnJ1cHRzLiAoZXhlY3V0ZSBvbmx5IHdpdGggdmlub19sb2NrIGxvY2tlZCkKKyAqLworc3RhdGljIHZvaWQgdmlub19jbGVhcl9pbnRlcnJ1cHQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCXN0cnVjdCBzZ2lfdmlub19jaGFubmVsICpjaDsKKworCWNoID0gKHZjcy0+Y2hhbm5lbCA9PSBWSU5PX0NIQU5ORUxfQSkgPyAmdmluby0+YSA6ICZ2aW5vLT5iOworCisJY2gtPnBhZ2VfaW5kZXggPSAwOworCWNoLT5saW5lX2NvdW50ID0gMDsKKworCWNoLT5zdGFydF9kZXNjX3RibCA9IHZpbm9fZHJ2ZGF0YS0+ZHVtbXlfZGVzY190YWJsZS5kbWE7CisJY2gtPm5leHRfNF9kZXNjID0gdmlub19kcnZkYXRhLT5kdW1teV9kZXNjX3RhYmxlLmRtYTsKKworCXVkZWxheShWSU5PX0RFU0NfRkVUQ0hfREVMQVkpOworCWRwcmludGsoImNoYW5uZWwgJWMgY2xlYXIgaW50ZXJydXB0IGNvbmRpdGlvblxuIiwKKwkgICAgICAgKHZjcy0+Y2hhbm5lbCA9PSBWSU5PX0NIQU5ORUxfQSkgPyAnQSc6J0InKTsKK30KKworc3RhdGljIGludCB2aW5vX2NhcHR1cmUoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmZiKQoreworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGZsYWdzMjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmYi0+c3RhdGVfbG9jaywgZmxhZ3MpOworCisJaWYgKGZiLT5zdGF0ZSA9PSBWSU5PX0ZSQU1FQlVGRkVSX0lOX1VTRSkKKwkJZXJyID0gLUVCVVNZOworCWZiLT5zdGF0ZSA9IFZJTk9fRlJBTUVCVUZGRVJfSU5fVVNFOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmItPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlub19kcnZkYXRhLT52aW5vX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrLCBmbGFnczIpOworCisJdmlub19kbWFfc2V0dXAodmNzLCBmYik7CisJdmlub19kbWFfc3RhcnQodmNzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jaywgZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW5vX2RydmRhdGEtPnZpbm9fbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljCitzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqdmlub19jYXB0dXJlX2VucXVldWUoc3RydWN0CisJCQkJCSAgICAgIHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmZiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkcHJpbnRrKCJ2aW5vX2NhcHR1cmVfZW5xdWV1ZSgpOlxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmNzLT5jYXB0dXJlX2xvY2ssIGZsYWdzKTsKKworCWZiID0gdmlub19xdWV1ZV9hZGQoJnZjcy0+ZmJfcXVldWUsIGluZGV4KTsKKwlpZiAoZmIgPT0gTlVMTCkgeworCQlkcHJpbnRrKCJ2aW5vX2NhcHR1cmVfZW5xdWV1ZSgpOiB2aW5vX3F1ZXVlX2FkZCgpIGZhaWxlZCwgIgorCQkJInF1ZXVlIGZ1bGw/XG4iKTsKKwkJZ290byBvdXQ7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZjcy0+Y2FwdHVyZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZmI7Cit9CisKK3N0YXRpYyBpbnQgdmlub19jYXB0dXJlX25leHQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLCBpbnQgc3RhcnQpCit7CisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmZiOworCXVuc2lnbmVkIGludCBpbmNvbWluZywgaWQ7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFncywgZmxhZ3MyOworCisJZHByaW50aygidmlub19jYXB0dXJlX25leHQoKTpcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZjcy0+Y2FwdHVyZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoc3RhcnQpIHsKKwkJLyogc3RhcnQgY2FwdHVyZSBvbmx5IGlmIGNhcHR1cmUgaXNuJ3QgaW4gcHJvZ3Jlc3MgYWxyZWFkeSAqLworCQlpZiAodmNzLT5jYXB0dXJpbmcpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZjcy0+Y2FwdHVyZV9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJfSBlbHNlIHsKKwkJLyogY2FwdHVyZSBuZXh0IGZyYW1lOgorCQkgKiBzdG9wIGNhcHR1cmUgaWYgY2FwdHVyaW5nIGlzIG5vdCBzZXQgKi8KKwkJaWYgKCF2Y3MtPmNhcHR1cmluZykgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmNzLT5jYXB0dXJlX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJZXJyID0gdmlub19xdWV1ZV9nZXRfaW5jb21pbmcoJnZjcy0+ZmJfcXVldWUsICZpbmNvbWluZyk7CisJaWYgKGVycikgeworCQlkcHJpbnRrKCJ2aW5vX2NhcHR1cmVfbmV4dCgpOiB2aW5vX3F1ZXVlX2dldF9pbmNvbWluZygpICIKKwkJCSJmYWlsZWRcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGluY29taW5nID09IDApIHsKKwkJZHByaW50aygidmlub19jYXB0dXJlX25leHQoKTogbm8gYnVmZmVycyBhdmFpbGFibGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlmYiA9IHZpbm9fcXVldWVfcGVlaygmdmNzLT5mYl9xdWV1ZSwgJmlkKTsKKwlpZiAoZmIgPT0gTlVMTCkgeworCQlkcHJpbnRrKCJ2aW5vX2NhcHR1cmVfbmV4dCgpOiB2aW5vX3F1ZXVlX3BlZWsoKSBmYWlsZWRcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmItPnN0YXRlX2xvY2ssIGZsYWdzMik7CisJZmItPnN0YXRlID0gVklOT19GUkFNRUJVRkZFUl9VTlVTRUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmItPnN0YXRlX2xvY2ssIGZsYWdzMik7CisKKwlpZiAoc3RhcnQpIHsKKwkJdmNzLT5jYXB0dXJpbmcgPSAxOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZjcy0+Y2FwdHVyZV9sb2NrLCBmbGFncyk7CisKKwllcnIgPSB2aW5vX2NhcHR1cmUodmNzLCBmYik7CisKKwlyZXR1cm4gZXJyOworCitvdXQ6CisJdmNzLT5jYXB0dXJpbmcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZjcy0+Y2FwdHVyZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZpbm9faXNfY2FwdHVyaW5nKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcykKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmNzLT5jYXB0dXJlX2xvY2ssIGZsYWdzKTsKKworCXJldCA9IHZjcy0+Y2FwdHVyaW5nOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmNzLT5jYXB0dXJlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIHdhaXRzIHVudGlsIGEgZnJhbWUgaXMgY2FwdHVyZWQgKi8KK3N0YXRpYyBpbnQgdmlub193YWl0X2Zvcl9mcmFtZShzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MpCit7CisJd2FpdF9xdWV1ZV90IHdhaXQ7CisJaW50IGVyciA9IDA7CisKKwlkcHJpbnRrKCJ2aW5vX3dhaXRfZm9yX2ZyYW1lKCk6XG4iKTsKKworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKwkvKiBhZGQgb3Vyc2VsdmVzIGludG8gd2FpdCBxdWV1ZSAqLworCWFkZF93YWl0X3F1ZXVlKCZ2Y3MtPmZiX3F1ZXVlLmZyYW1lX3dhaXRfcXVldWUsICZ3YWl0KTsKKwkvKiBhbmQgc2V0IGN1cnJlbnQgc3RhdGUgKi8KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJLyogdG8gZW5zdXJlIHRoYXQgc2NoZWR1bGVfdGltZW91dCB3aWxsIHJldHVybiBpbW1lZGlhdGVseQorCSAqIGlmIFZJTk8gaW50ZXJydXB0IHdhcyB0cmlnZ3JlZCBtZWFud2hpbGUgKi8KKwlzY2hlZHVsZV90aW1lb3V0KEhaIC8gMTApOworCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQllcnIgPSAtRUlOVFI7CisKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdmNzLT5mYl9xdWV1ZS5mcmFtZV93YWl0X3F1ZXVlLCAmd2FpdCk7CisKKwlkcHJpbnRrKCJ2aW5vX3dhaXRfZm9yX2ZyYW1lKCk6IHdhaXRpbmcgZm9yIGZyYW1lICVzXG4iLAorCQllcnIgPyAiZmFpbGVkIiA6ICJvayIpOworCisJcmV0dXJuIGVycjsKK30KKworLyogdGhlIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBQQUdFX1NJWkUgJSA0ID09IDAgKi8KK3N0YXRpYyB2b2lkIHZpbm9fY29udmVydF90b19yZ2JhKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYikgeworCXVuc2lnbmVkIGNoYXIgKnBhZ2VwdHI7CisJdW5zaWduZWQgaW50IHBhZ2UsIGk7CisJdW5zaWduZWQgY2hhciBhOworCisJZm9yIChwYWdlID0gMDsgcGFnZSA8IGZiLT5kZXNjX3RhYmxlLnBhZ2VfY291bnQ7IHBhZ2UrKykgeworCQlwYWdlcHRyID0gKHVuc2lnbmVkIGNoYXIgKilmYi0+ZGVzY190YWJsZS52aXJ0dWFsW3BhZ2VdOworCisJCWZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkU7IGkgKz0gNCkgeworCQkJYSA9IHBhZ2VwdHJbMF07CisJCQlwYWdlcHRyWzBdID0gcGFnZXB0clszXTsKKwkJCXBhZ2VwdHJbMV0gPSBwYWdlcHRyWzJdOworCQkJcGFnZXB0clsyXSA9IHBhZ2VwdHJbMV07CisJCQlwYWdlcHRyWzNdID0gYTsKKwkJCXBhZ2VwdHIgKz0gNDsKKwkJfQorCX0KK30KKworLyogY2hlY2tzIGlmIHRoZSBidWZmZXIgaXMgaW4gY29ycmVjdCBzdGF0ZSBhbmQgc3luY3MgZGF0YSAqLworc3RhdGljIGludCB2aW5vX2NoZWNrX2J1ZmZlcihzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgIHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYikKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZHByaW50aygidmlub19jaGVja19idWZmZXIoKTpcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZiLT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3dpdGNoIChmYi0+c3RhdGUpIHsKKwljYXNlIFZJTk9fRlJBTUVCVUZGRVJfSU5fVVNFOgorCQllcnIgPSAtRUlPOworCQlicmVhazsKKwljYXNlIFZJTk9fRlJBTUVCVUZGRVJfUkVBRFk6CisJCXZpbm9fc3luY19idWZmZXIoZmIpOworCQlmYi0+c3RhdGUgPSBWSU5PX0ZSQU1FQlVGRkVSX1VOVVNFRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmItPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCWlmICghZXJyKSB7CisJCWlmICh2aW5vX3BpeGVsX2NvbnZlcnNpb24KKwkJICAgICYmIChmYi0+ZGF0YV9mb3JtYXQgPT0gVklOT19EQVRBX0ZNVF9SR0IzMikpIHsKKwkJCXZpbm9fY29udmVydF90b19yZ2JhKGZiKTsKKwkJfQorCX0gZWxzZSBpZiAoZXJyICYmIChlcnIgIT0gLUVJTlZBTCkpIHsKKwkJZHByaW50aygidmlub19jaGVja19idWZmZXIoKTogYnVmZmVyIG5vdCByZWFkeVxuIik7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZpbm9fZHJ2ZGF0YS0+dmlub19sb2NrLCBmbGFncyk7CisJCXZpbm9fZG1hX3N0b3AodmNzKTsKKwkJdmlub19jbGVhcl9pbnRlcnJ1cHQodmNzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlub19kcnZkYXRhLT52aW5vX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBmb3JjZWZ1bGx5IHRlcm1pbmF0ZXMgY2FwdHVyZSAqLworc3RhdGljIHZvaWQgdmlub19jYXB0dXJlX3N0b3Aoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCXVuc2lnbmVkIGludCBpbmNvbWluZyA9IDAsIG91dGdvaW5nID0gMCwgaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFncywgZmxhZ3MyOworCisJZHByaW50aygidmlub19jYXB0dXJlX3N0b3AoKTpcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZjcy0+Y2FwdHVyZV9sb2NrLCBmbGFncyk7CisJLyogdW5zZXQgY2FwdHVyaW5nIHRvIHN0b3AgcXVldWUgcHJvY2Vzc2luZyAqLworCXZjcy0+Y2FwdHVyaW5nID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aW5vX2RydmRhdGEtPnZpbm9fbG9jaywgZmxhZ3MyKTsKKworCXZpbm9fZG1hX3N0b3AodmNzKTsKKwl2aW5vX2NsZWFyX2ludGVycnVwdCh2Y3MpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlub19kcnZkYXRhLT52aW5vX2xvY2ssIGZsYWdzMik7CisKKwkvKiByZW1vdmUgYWxsIGl0ZW1zIGZyb20gdGhlIHF1ZXVlICovCisJaWYgKHZpbm9fcXVldWVfZ2V0X2luY29taW5nKCZ2Y3MtPmZiX3F1ZXVlLCAmaW5jb21pbmcpKSB7CisJCWRwcmludGsoInZpbm9fY2FwdHVyZV9zdG9wKCk6ICIKKwkJCSJ2aW5vX3F1ZXVlX2dldF9pbmNvbWluZygpIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKwl3aGlsZSAoaW5jb21pbmcgPiAwKSB7CisJCXZpbm9fcXVldWVfdHJhbnNmZXIoJnZjcy0+ZmJfcXVldWUpOworCisJCWlmICh2aW5vX3F1ZXVlX2dldF9pbmNvbWluZygmdmNzLT5mYl9xdWV1ZSwgJmluY29taW5nKSkgeworCQkJZHByaW50aygidmlub19jYXB0dXJlX3N0b3AoKTogIgorCQkJCSJ2aW5vX3F1ZXVlX2dldF9pbmNvbWluZygpIGZhaWxlZFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICh2aW5vX3F1ZXVlX2dldF9vdXRnb2luZygmdmNzLT5mYl9xdWV1ZSwgJm91dGdvaW5nKSkgeworCQlkcHJpbnRrKCJ2aW5vX2NhcHR1cmVfc3RvcCgpOiAiCisJCQkidmlub19xdWV1ZV9nZXRfb3V0Z29pbmcoKSBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisJd2hpbGUgKG91dGdvaW5nID4gMCkgeworCQl2aW5vX3F1ZXVlX3JlbW92ZSgmdmNzLT5mYl9xdWV1ZSwgJmlkKTsKKworCQlpZiAodmlub19xdWV1ZV9nZXRfb3V0Z29pbmcoJnZjcy0+ZmJfcXVldWUsICZvdXRnb2luZykpIHsKKwkJCWRwcmludGsoInZpbm9fY2FwdHVyZV9zdG9wKCk6ICIKKwkJCQkidmlub19xdWV1ZV9nZXRfb3V0Z29pbmcoKSBmYWlsZWRcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2Y3MtPmNhcHR1cmVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHZpbm9fY2FwdHVyZV9mYWlsZWQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwlkcHJpbnRrKCJ2aW5vX2NhcHR1cmVfZmFpbGVkKCk6XG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aW5vX2RydmRhdGEtPnZpbm9fbG9jaywgZmxhZ3MpOworCisJdmlub19kbWFfc3RvcCh2Y3MpOworCXZpbm9fY2xlYXJfaW50ZXJydXB0KHZjcyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW5vX2RydmRhdGEtPnZpbm9fbG9jaywgZmxhZ3MpOworCisJcmV0ID0gdmlub19xdWV1ZV9nZXRfaW5jb21pbmcoJnZjcy0+ZmJfcXVldWUsICZpKTsKKwlpZiAocmV0ID09IFZJTk9fUVVFVUVfRVJST1IpIHsKKwkJZHByaW50aygidmlub19xdWV1ZV9nZXRfaW5jb21pbmcoKSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGkgPT0gMCkgeworCQkvKiBubyBidWZmZXJzIHRvIHByb2Nlc3MgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJZmIgPSB2aW5vX3F1ZXVlX3BlZWsoJnZjcy0+ZmJfcXVldWUsICZpKTsKKwlpZiAoZmIgPT0gTlVMTCkgeworCQlkcHJpbnRrKCJ2aW5vX3F1ZXVlX3BlZWsoKSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmItPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwlpZiAoZmItPnN0YXRlID09IFZJTk9fRlJBTUVCVUZGRVJfSU5fVVNFKSB7CisJCWZiLT5zdGF0ZSA9IFZJTk9fRlJBTUVCVUZGRVJfVU5VU0VEOworCQl2aW5vX3F1ZXVlX3RyYW5zZmVyKCZ2Y3MtPmZiX3F1ZXVlKTsKKwkJdmlub19xdWV1ZV9yZW1vdmUoJnZjcy0+ZmJfcXVldWUsICZpKTsKKwkJLyogd2Ugc2hvdWxkIGFjdHVhbGx5IGRpc2NhcmQgdGhlIG5ld2VzdCBmcmFtZSwKKwkJICogYnV0IHdobyBjYXJlcyAuLi4gKi8KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmItPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2aW5vX2ZyYW1lX2RvbmUoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgIHVuc2lnbmVkIGludCBmYykKK3sKKwlzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqZmI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2Y3MtPmNhcHR1cmVfbG9jaywgZmxhZ3MpOworCWZiID0gdmlub19xdWV1ZV90cmFuc2ZlcigmdmNzLT5mYl9xdWV1ZSk7CisJaWYgKCFmYikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2Y3MtPmNhcHR1cmVfbG9jaywgZmxhZ3MpOworCQlkcHJpbnRrKCJ2aW5vX2ZyYW1lX2RvbmUoKTogdmlub19xdWV1ZV90cmFuc2ZlcigpIGZhaWxlZCFcbiIpOworCQlyZXR1cm47CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZjcy0+Y2FwdHVyZV9sb2NrLCBmbGFncyk7CisKKwlmYi0+ZnJhbWVfY291bnRlciA9IGZjOworCWRvX2dldHRpbWVvZmRheSgmZmItPnRpbWVzdGFtcCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmItPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwlpZiAoZmItPnN0YXRlID09IFZJTk9fRlJBTUVCVUZGRVJfSU5fVVNFKQorCQlmYi0+c3RhdGUgPSBWSU5PX0ZSQU1FQlVGRkVSX1JFQURZOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZiLT5zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwKCZ2Y3MtPmZiX3F1ZXVlLmZyYW1lX3dhaXRfcXVldWUpOworCisJdmlub19jYXB0dXJlX25leHQodmNzLCAwKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHZpbm9faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTMyIGludHI7CisJdW5zaWduZWQgaW50IGZjX2EsIGZjX2I7CisJaW50IGRvbmVfYSA9IDA7CisJaW50IGRvbmVfYiA9IDA7CisKKwlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+dmlub19sb2NrKTsKKworCWludHIgPSB2aW5vLT5pbnRyX3N0YXR1czsKKwlmY19hID0gdmluby0+YS5maWVsZF9jb3VudGVyIC8gMjsKKwlmY19iID0gdmluby0+Yi5maWVsZF9jb3VudGVyIC8gMjsKKworCS8vIFRPRE86IGhhbmRsZSBlcnJvci1pbnRlcnJ1cHRzIGluIHNvbWUgc3BlY2lhbCB3YXkgPworCisgCWlmIChpbnRyICYgVklOT19JTlRTVEFUX0EpIHsKKwkJaWYgKGludHIgJiBWSU5PX0lOVFNUQVRfQV9FT0YpIHsKKwkJCXZpbm9fZHJ2ZGF0YS0+YS5maWVsZCsrOworCQkJaWYgKHZpbm9fZHJ2ZGF0YS0+YS5maWVsZCA+IDEpIHsKKwkJCQl2aW5vX2RtYV9zdG9wKCZ2aW5vX2RydmRhdGEtPmEpOworCQkJCXZpbm9fY2xlYXJfaW50ZXJydXB0KCZ2aW5vX2RydmRhdGEtPmEpOworCQkJCXZpbm9fZHJ2ZGF0YS0+YS5maWVsZCA9IDA7CisJCQkJZG9uZV9hID0gMTsKKwkJCX0KKwkJCWRwcmludGsoImludHI6IGNoYW5uZWwgQSBlbmQtb2YtZmllbGQgaW50ZXJydXB0OiAiCisJCQkJIiUwNHhcbiIsIGludHIpOworCQl9IGVsc2UgeworCQkJdmlub19kbWFfc3RvcCgmdmlub19kcnZkYXRhLT5hKTsKKwkJCXZpbm9fY2xlYXJfaW50ZXJydXB0KCZ2aW5vX2RydmRhdGEtPmEpOworCQkJZG9uZV9hID0gMTsKKwkJCWRwcmludGsoImNoYW5uZWwgQSBlcnJvciBpbnRlcnJ1cHQ6ICUwNHhcbiIsIGludHIpOworCQl9CisJfQorCWlmIChpbnRyICYgVklOT19JTlRTVEFUX0IpIHsKKwkJaWYgKGludHIgJiBWSU5PX0lOVFNUQVRfQl9FT0YpIHsKKwkJCXZpbm9fZHJ2ZGF0YS0+Yi5maWVsZCsrOworCQkJaWYgKHZpbm9fZHJ2ZGF0YS0+Yi5maWVsZCA+IDEpIHsKKwkJCQl2aW5vX2RtYV9zdG9wKCZ2aW5vX2RydmRhdGEtPmIpOworCQkJCXZpbm9fY2xlYXJfaW50ZXJydXB0KCZ2aW5vX2RydmRhdGEtPmIpOworCQkJCXZpbm9fZHJ2ZGF0YS0+Yi5maWVsZCA9IDA7CisJCQkJZG9uZV9iID0gMTsKKwkJCX0KKwkJCWRwcmludGsoImludHI6IGNoYW5uZWwgQiBlbmQtb2YtZmllbGQgaW50ZXJydXB0OiAiCisJCQkJIiUwNHhcbiIsIGludHIpOworCQl9IGVsc2UgeworCQkJdmlub19kbWFfc3RvcCgmdmlub19kcnZkYXRhLT5iKTsKKwkJCXZpbm9fY2xlYXJfaW50ZXJydXB0KCZ2aW5vX2RydmRhdGEtPmIpOworCQkJZG9uZV9iID0gMTsKKwkJCWRwcmludGsoImNoYW5uZWwgQiBlcnJvciBpbnRlcnJ1cHQ6ICUwNHhcbiIsIGludHIpOworCQl9CisJfQorCisJLyogYWx3YXlzIHJlbWVtYmVyIHRvIGNsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKwl2aW5vLT5pbnRyX3N0YXR1cyA9IH5pbnRyOworCisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+dmlub19sb2NrKTsKKworCWlmIChkb25lX2EpIHsKKwkJdmlub19mcmFtZV9kb25lKCZ2aW5vX2RydmRhdGEtPmEsIGZjX2EpOworCQlkcHJpbnRrKCJjaGFubmVsIEEgZnJhbWUgZG9uZSwgaW50ZXJydXB0OiAlZFxuIiwgaW50cik7CisJfQorCWlmIChkb25lX2IpIHsKKwkJdmlub19mcmFtZV9kb25lKCZ2aW5vX2RydmRhdGEtPmIsIGZjX2IpOworCQlkcHJpbnRrKCJjaGFubmVsIEIgZnJhbWUgZG9uZSwgaW50ZXJydXB0OiAlZFxuIiwgaW50cik7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBWSU5PIHZpZGVvIGlucHV0IG1hbmFnZW1lbnQgKi8KKworc3RhdGljIGludCB2aW5vX2dldF9zYWE3MTkxX2lucHV0KGludCBpbnB1dCkKK3sKKwlzd2l0Y2ggKGlucHV0KSB7CisJY2FzZSBWSU5PX0lOUFVUX0NPTVBPU0lURToKKwkJcmV0dXJuIFNBQTcxOTFfSU5QVVRfQ09NUE9TSVRFOworCWNhc2UgVklOT19JTlBVVF9TVklERU86CisJCXJldHVybiBTQUE3MTkxX0lOUFVUX1NWSURFTzsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIlZJTk86IHZpbm9fZ2V0X3NhYTcxOTFfaW5wdXQoKTogIgorCQkgICAgICAgImludmFsaWQgaW5wdXQhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KK30KKworc3RhdGljIGludCB2aW5vX2dldF9zYWE3MTkxX25vcm0oaW50IG5vcm0pCit7CisJc3dpdGNoIChub3JtKSB7CisJY2FzZSBWSU5PX0RBVEFfTk9STV9BVVRPOgorCQlyZXR1cm4gU0FBNzE5MV9OT1JNX0FVVE87CisJY2FzZSBWSU5PX0RBVEFfTk9STV9QQUw6CisJCXJldHVybiBTQUE3MTkxX05PUk1fUEFMOworCWNhc2UgVklOT19EQVRBX05PUk1fTlRTQzoKKwkJcmV0dXJuIFNBQTcxOTFfTk9STV9OVFNDOworCWNhc2UgVklOT19EQVRBX05PUk1fU0VDQU06CisJCXJldHVybiBTQUE3MTkxX05PUk1fU0VDQU07CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU5POiB2aW5vX2dldF9zYWE3MTkxX25vcm0oKTogIgorCQkgICAgICAgImludmFsaWQgbm9ybSFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorfQorCisvKiBleGVjdXRlIHdpdGggaW5wdXRfbG9jayBsb2NrZWQgKi8KK3N0YXRpYyBpbnQgdmlub19pc19pbnB1dF9vd25lcihzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MpCit7CisJc3dpdGNoKHZjcy0+aW5wdXQpIHsKKwljYXNlIFZJTk9fSU5QVVRfQ09NUE9TSVRFOgorCWNhc2UgVklOT19JTlBVVF9TVklERU86CisJCXJldHVybiAodmlub19kcnZkYXRhLT5kZWNvZGVyLm93bmVyID09IHZjcy0+Y2hhbm5lbCk7CisJY2FzZSBWSU5PX0lOUFVUX0QxOgorCQlyZXR1cm4gKHZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLm93bmVyID09IHZjcy0+Y2hhbm5lbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IHZpbm9fYWNxdWlyZV9pbnB1dChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MpCit7CisJaW50IHJldCA9IDA7CisKKwlkcHJpbnRrKCJ2aW5vX2FjcXVpcmVfaW5wdXQoKTpcbiIpOworCisJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJLyogRmlyc3QgdHJ5IEQxIGFuZCB0aGVuIFNBQTcxOTEgKi8KKwlpZiAodmlub19kcnZkYXRhLT5jYW1lcmEuZHJpdmVyCisJICAgICYmICh2aW5vX2RydmRhdGEtPmNhbWVyYS5vd25lciA9PSBWSU5PX05PX0NIQU5ORUwpKSB7CisJCWlmIChpMmNfdXNlX2NsaWVudCh2aW5vX2RydmRhdGEtPmNhbWVyYS5kcml2ZXIpKSB7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CisJCX0KKworCQl2aW5vX2RydmRhdGEtPmNhbWVyYS5vd25lciA9IHZjcy0+Y2hhbm5lbDsKKwkJdmNzLT5pbnB1dCA9IFZJTk9fSU5QVVRfRDE7CisJCXZjcy0+ZGF0YV9ub3JtID0gVklOT19EQVRBX05PUk1fRDE7CisJfSBlbHNlIGlmICh2aW5vX2RydmRhdGEtPmRlY29kZXIuZHJpdmVyCisJCSAgICYmICh2aW5vX2RydmRhdGEtPmRlY29kZXIub3duZXIgPT0gVklOT19OT19DSEFOTkVMKSkgeworCQlpbnQgc2FhNzE5MV9pbnB1dDsKKwkJaW50IHNhYTcxOTFfbm9ybTsKKworCQlpZiAoaTJjX3VzZV9jbGllbnQodmlub19kcnZkYXRhLT5kZWNvZGVyLmRyaXZlcikpIHsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5vd25lciA9IHZjcy0+Y2hhbm5lbDsKKwkJdmNzLT5pbnB1dCA9IFZJTk9fSU5QVVRfQ09NUE9TSVRFOworCQl2Y3MtPmRhdGFfbm9ybSA9IFZJTk9fREFUQV9OT1JNX1BBTDsKKworCQlzYWE3MTkxX2lucHV0ID0gdmlub19nZXRfc2FhNzE5MV9pbnB1dCh2Y3MtPmlucHV0KTsKKwkJaTJjX2RlY29kZXJfY29tbWFuZChERUNPREVSX1NFVF9JTlBVVCwgJnNhYTcxOTFfaW5wdXQpOworCisJCXNhYTcxOTFfbm9ybSA9IHZpbm9fZ2V0X3NhYTcxOTFfbm9ybSh2Y3MtPmRhdGFfbm9ybSk7CisJCWkyY19kZWNvZGVyX2NvbW1hbmQoREVDT0RFUl9TQUE3MTkxX1NFVF9OT1JNLCAmc2FhNzE5MV9ub3JtKTsKKwl9IGVsc2UgeworCQl2Y3MtPmlucHV0ID0gKHZjcy0+Y2hhbm5lbCA9PSBWSU5PX0NIQU5ORUxfQSkgPworCQkJdmlub19kcnZkYXRhLT5iLmlucHV0IDogdmlub19kcnZkYXRhLT5hLmlucHV0OworCQl2Y3MtPmRhdGFfbm9ybSA9ICh2Y3MtPmNoYW5uZWwgPT0gVklOT19DSEFOTkVMX0EpID8KKwkJCXZpbm9fZHJ2ZGF0YS0+Yi5kYXRhX25vcm0gOiB2aW5vX2RydmRhdGEtPmEuZGF0YV9ub3JtOworCX0KKworCWlmICh2Y3MtPmlucHV0ID09IFZJTk9fSU5QVVRfTk9ORSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodmlub19pc19pbnB1dF9vd25lcih2Y3MpKSB7CisJCXZpbm9fc2V0X2RlZmF1bHRfY2xpcHBpbmcodmNzKTsKKwkJdmlub19zZXRfZGVmYXVsdF9mcmFtZXJhdGUodmNzKTsKKwl9CisKKwlkcHJpbnRrKCJ2aW5vX2FjcXVpcmVfaW5wdXQoKTogJXNcbiIsIHZpbm9faW5wdXRzW3Zjcy0+aW5wdXRdLm5hbWUpOworCitvdXQ6CisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZpbm9fc2V0X2lucHV0KHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywgaW50IGlucHV0KQoreworCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjczIgPSAodmNzLT5jaGFubmVsID09IFZJTk9fQ0hBTk5FTF9BKSA/CisJCSZ2aW5vX2RydmRhdGEtPmIgOiAmdmlub19kcnZkYXRhLT5hOworCWludCByZXQgPSAwOworCisJZHByaW50aygidmlub19zZXRfaW5wdXQoKTpcbiIpOworCisJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJaWYgKHZjcy0+aW5wdXQgPT0gaW5wdXQpCisJCWdvdG8gb3V0OworCisJc3dpdGNoKGlucHV0KSB7CisJY2FzZSBWSU5PX0lOUFVUX0NPTVBPU0lURToKKwljYXNlIFZJTk9fSU5QVVRfU1ZJREVPOgorCQlpZiAoIXZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICh2aW5vX2RydmRhdGEtPmRlY29kZXIub3duZXIgPT0gVklOT19OT19DSEFOTkVMKSB7CisJCQlpZiAoaTJjX3VzZV9jbGllbnQodmlub19kcnZkYXRhLT5kZWNvZGVyLmRyaXZlcikpIHsKKwkJCQlyZXQgPSAtRU5PREVWOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJdmlub19kcnZkYXRhLT5kZWNvZGVyLm93bmVyID0gdmNzLT5jaGFubmVsOworCQl9CisKKwkJaWYgKHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5vd25lciA9PSB2Y3MtPmNoYW5uZWwpIHsKKwkJCWludCBzYWE3MTkxX2lucHV0OworCQkJaW50IHNhYTcxOTFfbm9ybTsKKworCQkJdmNzLT5pbnB1dCA9IGlucHV0OworCQkJdmNzLT5kYXRhX25vcm0gPSBWSU5PX0RBVEFfTk9STV9QQUw7CisKKwkJCXNhYTcxOTFfaW5wdXQgPSB2aW5vX2dldF9zYWE3MTkxX2lucHV0KHZjcy0+aW5wdXQpOworCQkJaTJjX2RlY29kZXJfY29tbWFuZChERUNPREVSX1NFVF9JTlBVVCwgJnNhYTcxOTFfaW5wdXQpOworCQkJc2FhNzE5MV9ub3JtID0gdmlub19nZXRfc2FhNzE5MV9ub3JtKHZjcy0+ZGF0YV9ub3JtKTsKKwkJCWkyY19kZWNvZGVyX2NvbW1hbmQoREVDT0RFUl9TQUE3MTkxX1NFVF9OT1JNLAorCQkJCQkgICAgJnNhYTcxOTFfbm9ybSk7CisJCX0gZWxzZSB7CisJCQlpZiAodmNzMi0+aW5wdXQgIT0gaW5wdXQpIHsKKwkJCQlyZXQgPSAtRUJVU1k7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXZjcy0+aW5wdXQgPSBpbnB1dDsKKwkJCXZjcy0+ZGF0YV9ub3JtID0gdmNzMi0+ZGF0YV9ub3JtOworCQl9CisKKwkJaWYgKHZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLm93bmVyID09IHZjcy0+Y2hhbm5lbCkgeworCQkJLyogVHJhbnNmZXIgdGhlIG93bmVyc2hpcCBvciByZWxlYXNlIHRoZSBpbnB1dCAqLworCQkJaWYgKHZjczItPmlucHV0ID09IFZJTk9fSU5QVVRfRDEpIHsKKwkJCQl2aW5vX2RydmRhdGEtPmNhbWVyYS5vd25lciA9IHZjczItPmNoYW5uZWw7CisJCQl9IGVsc2UgeworCQkJCWkyY19yZWxlYXNlX2NsaWVudCh2aW5vX2RydmRhdGEtPgorCQkJCQkJICAgY2FtZXJhLmRyaXZlcik7CisJCQkJdmlub19kcnZkYXRhLT5jYW1lcmEub3duZXIgPSBWSU5PX05PX0NIQU5ORUw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWSU5PX0lOUFVUX0QxOgorCQlpZiAoIXZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLmRyaXZlcikgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLm93bmVyID09IFZJTk9fTk9fQ0hBTk5FTCkgeworCQkJaWYgKGkyY191c2VfY2xpZW50KHZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLmRyaXZlcikpIHsKKwkJCQlyZXQgPSAtRU5PREVWOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJdmlub19kcnZkYXRhLT5jYW1lcmEub3duZXIgPSB2Y3MtPmNoYW5uZWw7CisJCX0KKworCQlpZiAodmlub19kcnZkYXRhLT5kZWNvZGVyLm93bmVyID09IHZjcy0+Y2hhbm5lbCkgeworCQkJLyogVHJhbnNmZXIgdGhlIG93bmVyc2hpcCBvciByZWxlYXNlIHRoZSBpbnB1dCAqLworCQkJaWYgKCh2Y3MyLT5pbnB1dCA9PSBWSU5PX0lOUFVUX0NPTVBPU0lURSkgfHwKKwkJCQkgKHZjczItPmlucHV0ID09IFZJTk9fSU5QVVRfU1ZJREVPKSkgeworCQkJCXZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5vd25lciA9IHZjczItPmNoYW5uZWw7CisJCQl9IGVsc2UgeworCQkJCWkyY19yZWxlYXNlX2NsaWVudCh2aW5vX2RydmRhdGEtPgorCQkJCQkJICAgZGVjb2Rlci5kcml2ZXIpOworCQkJCXZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5vd25lciA9IFZJTk9fTk9fQ0hBTk5FTDsKKwkJCX0KKwkJfQorCisJCXZjcy0+aW5wdXQgPSBpbnB1dDsKKwkJdmNzLT5kYXRhX25vcm0gPSBWSU5PX0RBVEFfTk9STV9EMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJdmlub19zZXRfZGVmYXVsdF9jbGlwcGluZyh2Y3MpOworCXZpbm9fc2V0X2RlZmF1bHRfZnJhbWVyYXRlKHZjcyk7CisKKwlkcHJpbnRrKCJ2aW5vX3NldF9pbnB1dCgpOiAlc1xuIiwgdmlub19pbnB1dHNbdmNzLT5pbnB1dF0ubmFtZSk7CisKK291dDoKKwlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZpbm9fcmVsZWFzZV9pbnB1dChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MpCit7CisJc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzMiA9ICh2Y3MtPmNoYW5uZWwgPT0gVklOT19DSEFOTkVMX0EpID8KKwkJJnZpbm9fZHJ2ZGF0YS0+YiA6ICZ2aW5vX2RydmRhdGEtPmE7CisKKwlkcHJpbnRrKCJ2aW5vX3JlbGVhc2VfaW5wdXQoKTpcbiIpOworCisJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJLyogUmVsZWFzZSBvd25lcnNoaXAgb2YgdGhlIGNoYW5uZWwKKwkgKiBhbmQgaWYgdGhlIG90aGVyIGNoYW5uZWwgdGFrZXMgaW5wdXQgZnJvbQorCSAqIHRoZSBzYW1lIHNvdXJjZSwgdHJhbnNmZXIgdGhlIG93bmVyc2hpcCAqLworCWlmICh2aW5vX2RydmRhdGEtPmNhbWVyYS5vd25lciA9PSB2Y3MtPmNoYW5uZWwpIHsKKwkJaWYgKHZjczItPmlucHV0ID09IFZJTk9fSU5QVVRfRDEpIHsKKwkJCXZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLm93bmVyID0gdmNzMi0+Y2hhbm5lbDsKKwkJfSBlbHNlIHsKKwkJCWkyY19yZWxlYXNlX2NsaWVudCh2aW5vX2RydmRhdGEtPmNhbWVyYS5kcml2ZXIpOworCQkJdmlub19kcnZkYXRhLT5jYW1lcmEub3duZXIgPSBWSU5PX05PX0NIQU5ORUw7CisJCX0KKwl9IGVsc2UgaWYgKHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5vd25lciA9PSB2Y3MtPmNoYW5uZWwpIHsKKwkJaWYgKCh2Y3MyLT5pbnB1dCA9PSBWSU5PX0lOUFVUX0NPTVBPU0lURSkgfHwKKwkJCSAodmNzMi0+aW5wdXQgPT0gVklOT19JTlBVVF9TVklERU8pKSB7CisJCQl2aW5vX2RydmRhdGEtPmRlY29kZXIub3duZXIgPSB2Y3MyLT5jaGFubmVsOworCQl9IGVsc2UgeworCQkJaTJjX3JlbGVhc2VfY2xpZW50KHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIpOworCQkJdmlub19kcnZkYXRhLT5kZWNvZGVyLm93bmVyID0gVklOT19OT19DSEFOTkVMOworCQl9CisJfQorCXZjcy0+aW5wdXQgPSBWSU5PX0lOUFVUX05PTkU7CisKKwlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKK30KKworLyogZXhlY3V0ZSB3aXRoIGlucHV0X2xvY2sgbG9ja2VkICovCitzdGF0aWMgaW50IHZpbm9fc2V0X2RhdGFfbm9ybShzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZGF0YV9ub3JtKQoreworCWludCBzYWE3MTkxX25vcm07CisKKwlzd2l0Y2ggKHZjcy0+aW5wdXQpIHsKKwljYXNlIFZJTk9fSU5QVVRfRDE6CisJCS8qIG9ubHkgb25lICJub3JtIiBzdXBwb3J0ZWQgKi8KKwkJaWYgKGRhdGFfbm9ybSAhPSBWSU5PX0RBVEFfTk9STV9EMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFZJTk9fSU5QVVRfQ09NUE9TSVRFOgorCWNhc2UgVklOT19JTlBVVF9TVklERU86CisKKwkJc2FhNzE5MV9ub3JtID0gdmlub19nZXRfc2FhNzE5MV9ub3JtKGRhdGFfbm9ybSk7CisKKwkJaTJjX2RlY29kZXJfY29tbWFuZChERUNPREVSX1NBQTcxOTFfU0VUX05PUk0sICZzYWE3MTkxX25vcm0pOworCQl2Y3MtPmRhdGFfbm9ybSA9IGRhdGFfbm9ybTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFY0TDIgaGVscGVyIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IHZpbm9fZmluZF9kYXRhX2Zvcm1hdChfX3UzMiBwaXhlbGZvcm1hdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBWSU5PX0RBVEFfRk1UX0NPVU5UOyBpKyspIHsKKwkJaWYgKHZpbm9fZGF0YV9mb3JtYXRzW2ldLnBpeGVsZm9ybWF0ID09IHBpeGVsZm9ybWF0KQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIFZJTk9fREFUQV9GTVRfTk9ORTsKK30KKworc3RhdGljIGludCB2aW5vX2VudW1fZGF0YV9ub3JtKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywgX191MzIgaW5kZXgpCit7CisJaW50IGRhdGFfbm9ybSA9IFZJTk9fREFUQV9OT1JNX05PTkU7CisKKwlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisJc3dpdGNoKHZjcy0+aW5wdXQpIHsKKwljYXNlIFZJTk9fSU5QVVRfQ09NUE9TSVRFOgorCWNhc2UgVklOT19JTlBVVF9TVklERU86CisJCWlmIChpbmRleCA9PSAwKSB7CisJCQlkYXRhX25vcm0gPSBWSU5PX0RBVEFfTk9STV9QQUw7CisJCX0gZWxzZSBpZiAoaW5kZXggPT0gMSkgeworCQkJZGF0YV9ub3JtID0gVklOT19EQVRBX05PUk1fTlRTQzsKKwkJfSBlbHNlIGlmIChpbmRleCA9PSAyKSB7CisJCQlkYXRhX25vcm0gPSBWSU5PX0RBVEFfTk9STV9TRUNBTTsKKwkJfQorCQlicmVhazsKKwljYXNlIFZJTk9fSU5QVVRfRDE6CisJCWlmIChpbmRleCA9PSAwKSB7CisJCQlkYXRhX25vcm0gPSBWSU5PX0RBVEFfTk9STV9EMTsKKwkJfQorCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlyZXR1cm4gZGF0YV9ub3JtOworfQorCitzdGF0aWMgaW50IHZpbm9fZW51bV9pbnB1dChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsIF9fdTMyIGluZGV4KQoreworCWludCBpbnB1dCA9IFZJTk9fSU5QVVRfTk9ORTsKKworCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwlpZiAodmlub19kcnZkYXRhLT5kZWNvZGVyLmRyaXZlciAmJiB2aW5vX2RydmRhdGEtPmNhbWVyYS5kcml2ZXIpIHsKKwkJc3dpdGNoIChpbmRleCkgeworCQljYXNlIDA6CisJCQlpbnB1dCA9IFZJTk9fSU5QVVRfQ09NUE9TSVRFOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlucHV0ID0gVklOT19JTlBVVF9TVklERU87CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaW5wdXQgPSBWSU5PX0lOUFVUX0QxOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIpIHsKKwkJc3dpdGNoIChpbmRleCkgeworCQljYXNlIDA6CisJCQlpbnB1dCA9IFZJTk9fSU5QVVRfQ09NUE9TSVRFOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlucHV0ID0gVklOT19JTlBVVF9TVklERU87CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAodmlub19kcnZkYXRhLT5jYW1lcmEuZHJpdmVyKSB7CisJCXN3aXRjaCAoaW5kZXgpIHsKKwkJY2FzZSAwOgorCQkJaW5wdXQgPSBWSU5PX0lOUFVUX0QxOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlyZXR1cm4gaW5wdXQ7Cit9CisKKy8qIGV4ZWN1dGUgd2l0aCBpbnB1dF9sb2NrIGxvY2tlZCAqLworc3RhdGljIF9fdTMyIHZpbm9fZmluZF9pbnB1dF9pbmRleChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MpCit7CisJX191MzIgaW5kZXggPSAwOworCS8vIEZJWE1FOiBkZXRlY3Qgd2hlbiBubyBpbnB1dHMgYXZhaWxhYmxlCisKKwlpZiAodmlub19kcnZkYXRhLT5kZWNvZGVyLmRyaXZlciAmJiB2aW5vX2RydmRhdGEtPmNhbWVyYS5kcml2ZXIpIHsKKwkJc3dpdGNoICh2Y3MtPmlucHV0KSB7CisJCWNhc2UgVklOT19JTlBVVF9DT01QT1NJVEU6CisJCQlpbmRleCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBWSU5PX0lOUFVUX1NWSURFTzoKKwkJCWluZGV4ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFZJTk9fSU5QVVRfRDE6CisJCQlpbmRleCA9IDI7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAodmlub19kcnZkYXRhLT5kZWNvZGVyLmRyaXZlcikgeworCQlzd2l0Y2ggKHZjcy0+aW5wdXQpIHsKKwkJY2FzZSBWSU5PX0lOUFVUX0NPTVBPU0lURToKKwkJCWluZGV4ID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFZJTk9fSU5QVVRfU1ZJREVPOgorCQkJaW5kZXggPSAxOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKHZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLmRyaXZlcikgeworCQlzd2l0Y2ggKHZjcy0+aW5wdXQpIHsKKwkJY2FzZSBWSU5PX0lOUFVUX0QxOgorCQkJaW5kZXggPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKKy8qIFY0TDIgaW9jdGxzICovCisKK3N0YXRpYyB2b2lkIHZpbm9fdjRsMl9xdWVyeWNhcChzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJbWVtc2V0KGNhcCwgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkpKTsKKworCXN0cmNweShjYXAtPmRyaXZlciwgdmlub19kcml2ZXJfbmFtZSk7CisJc3RyY3B5KGNhcC0+Y2FyZCwgdmlub19kcml2ZXJfZGVzY3JpcHRpb24pOworCXN0cmNweShjYXAtPmJ1c19pbmZvLCB2aW5vX2J1c19uYW1lKTsKKwljYXAtPnZlcnNpb24gPSBWSU5PX1ZFUlNJT05fQ09ERTsKKwljYXAtPmNhcGFiaWxpdGllcyA9CisJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAorCQlWNEwyX0NBUF9TVFJFQU1JTkc7CisJLy8gVjRMMl9DQVBfT1ZFUkxBWSwgVjRMMl9DQVBfUkVBRFdSSVRFCit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX2VudW1pbnB1dChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgICAgc3RydWN0IHY0bDJfaW5wdXQgKmkpCit7CisJX191MzIgaW5kZXggPSBpLT5pbmRleDsKKwlpbnQgaW5wdXQ7CisJZHByaW50aygicmVxdWVzdGVkIGluZGV4ID0gJWRcbiIsIGluZGV4KTsKKworCWlucHV0ID0gdmlub19lbnVtX2lucHV0KHZjcywgaW5kZXgpOworCWlmIChpbnB1dCA9PSBWSU5PX0lOUFVUX05PTkUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KGksIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpOworCisJaS0+aW5kZXggPSBpbmRleDsKKwlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwlpLT5zdGQgPSB2aW5vX2lucHV0c1tpbnB1dF0uc3RkOworCXN0cmNweShpLT5uYW1lLCB2aW5vX2lucHV0c1tpbnB1dF0ubmFtZSk7CisKKwlpZiAoKGlucHV0ID09IFZJTk9fSU5QVVRfQ09NUE9TSVRFKQorCSAgICB8fCAoaW5wdXQgPT0gVklOT19JTlBVVF9TVklERU8pKSB7CisJCXN0cnVjdCBzYWE3MTkxX3N0YXR1cyBzdGF0dXM7CisJCWkyY19kZWNvZGVyX2NvbW1hbmQoREVDT0RFUl9TQUE3MTkxX0dFVF9TVEFUVVMsICZzdGF0dXMpOworCQlpLT5zdGF0dXMgfD0gc3RhdHVzLnNpZ25hbCA/IDAgOiBWNEwyX0lOX1NUX05PX1NJR05BTDsKKwkJaS0+c3RhdHVzIHw9IHN0YXR1cy5jb2xvciA/IDAgOiBWNEwyX0lOX1NUX05PX0NPTE9SOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9nX2lucHV0KHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgICAgc3RydWN0IHY0bDJfaW5wdXQgKmkpCit7CisJX191MzIgaW5kZXg7CisJaW50IGlucHV0OworCisJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCWlucHV0ID0gdmNzLT5pbnB1dDsKKwlpbmRleCA9IHZpbm9fZmluZF9pbnB1dF9pbmRleCh2Y3MpOworCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJZHByaW50aygiaW5wdXQgPSAlZFxuIiwgaW5wdXQpOworCisJaWYgKGlucHV0ID09IFZJTk9fSU5QVVRfTk9ORSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1zZXQoaSwgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2lucHV0KSk7CisKKwlpLT5pbmRleCA9IGluZGV4OworCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCWktPnN0ZCA9IHZpbm9faW5wdXRzW2lucHV0XS5zdGQ7CisJc3RyY3B5KGktPm5hbWUsIHZpbm9faW5wdXRzW2lucHV0XS5uYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9zX2lucHV0KHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgICAgc3RydWN0IHY0bDJfaW5wdXQgKmkpCit7CisJaW50IGlucHV0OworCWRwcmludGsoInJlcXVlc3RlZCBpbnB1dCA9ICVkXG4iLCBpLT5pbmRleCk7CisKKwlpbnB1dCA9IHZpbm9fZW51bV9pbnB1dCh2Y3MsIGktPmluZGV4KTsKKwlpZiAoaW5wdXQgPT0gVklOT19JTlBVVF9OT05FKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB2aW5vX3NldF9pbnB1dCh2Y3MsIGlucHV0KTsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfZW51bXN0ZChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgIHN0cnVjdCB2NGwyX3N0YW5kYXJkICpzKQoreworCWludCBpbmRleCA9IHMtPmluZGV4OworCWludCBkYXRhX25vcm0gPSB2aW5vX2VudW1fZGF0YV9ub3JtKHZjcywgaW5kZXgpOworCWRwcmludGsoInN0YW5kYXJkIGluZGV4ID0gJWRcbiIsIGluZGV4KTsKKworCWlmIChkYXRhX25vcm0gPT0gVklOT19EQVRBX05PUk1fTk9ORSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkcHJpbnRrKCJzdGFuZGFyZCBuYW1lID0gJXNcbiIsCisJICAgICAgIHZpbm9fZGF0YV9ub3Jtc1tkYXRhX25vcm1dLmRlc2NyaXB0aW9uKTsKKworCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfc3RhbmRhcmQpKTsKKwlzLT5pbmRleCA9IGluZGV4OworCisJcy0+aWQgPSB2aW5vX2RhdGFfbm9ybXNbZGF0YV9ub3JtXS5zdGQ7CisJcy0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yID0gMTsKKwlzLT5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciA9CisJCXZpbm9fZGF0YV9ub3Jtc1tkYXRhX25vcm1dLmZwc19tYXg7CisJcy0+ZnJhbWVsaW5lcyA9CisJCXZpbm9fZGF0YV9ub3Jtc1tkYXRhX25vcm1dLmZyYW1lbGluZXM7CisJc3RyY3B5KHMtPm5hbWUsCisJICAgICAgIHZpbm9fZGF0YV9ub3Jtc1tkYXRhX25vcm1dLmRlc2NyaXB0aW9uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9nX3N0ZChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICB2NGwyX3N0ZF9pZCAqc3RkKQoreworCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwlkcHJpbnRrKCJjdXJyZW50IHN0YW5kYXJkID0gJWRcbiIsIHZjcy0+ZGF0YV9ub3JtKTsKKwkqc3RkID0gdmlub19kYXRhX25vcm1zW3Zjcy0+ZGF0YV9ub3JtXS5zdGQ7CisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfc19zdGQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgdjRsMl9zdGRfaWQgKnN0ZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCS8qIGNoZWNrIGlmIHRoZSBzdGFuZGFyZCBpcyB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgaW5wdXQgKi8KKwlpZiAodmlub19pc19pbnB1dF9vd25lcih2Y3MpCisJICAgICYmICh2aW5vX2lucHV0c1t2Y3MtPmlucHV0XS5zdGQgJiAoKnN0ZCkpKSB7CisJCWRwcmludGsoInN0YW5kYXJkIGFjY2VwdGVkXG4iKTsKKworCQkvKiBjaGFuZ2UgdGhlIHZpZGVvIG5vcm0gZm9yIFNBQTcxOTEKKwkJICogYW5kIGFjY2VwdCBOVFNDIGZvciBEMSAoZG8gbm90aGluZykgKi8KKworCQlpZiAodmNzLT5pbnB1dCA9PSBWSU5PX0lOUFVUX0QxKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKCgqc3RkKSAmIFY0TDJfU1REX1BBTCkgeworCQkJdmlub19zZXRfZGF0YV9ub3JtKHZjcywgVklOT19EQVRBX05PUk1fUEFMKTsKKwkJCXZjcy0+ZGF0YV9ub3JtID0gVklOT19EQVRBX05PUk1fUEFMOworCQl9IGVsc2UgaWYgKCgqc3RkKSAmIFY0TDJfU1REX05UU0MpIHsKKwkJCXZpbm9fc2V0X2RhdGFfbm9ybSh2Y3MsIFZJTk9fREFUQV9OT1JNX05UU0MpOworCQkJdmNzLT5kYXRhX25vcm0gPSBWSU5PX0RBVEFfTk9STV9OVFNDOworCQl9IGVsc2UgaWYgKCgqc3RkKSAmIFY0TDJfU1REX1NFQ0FNKSB7CisJCQl2aW5vX3NldF9kYXRhX25vcm0odmNzLCBWSU5PX0RBVEFfTk9STV9TRUNBTSk7CisJCQl2Y3MtPmRhdGFfbm9ybSA9IFZJTk9fREFUQV9OT1JNX1NFQ0FNOworCQl9IGVsc2UgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9lbnVtX2ZtdChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmZCkKK3sKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IGZkLT50eXBlOworCWludCBpbmRleCA9IGZkLT5pbmRleDsKKwlkcHJpbnRrKCJmb3JtYXQgaW5kZXggPSAlZFxuIiwgaW5kZXgpOworCisJc3dpdGNoIChmZC0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQlpZiAoKGZkLT5pbmRleCA8IDApIHx8CisJCSAgICAoZmQtPmluZGV4ID49IFZJTk9fREFUQV9GTVRfQ09VTlQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRwcmludGsoImZvcm1hdCBuYW1lID0gJXNcbiIsCisJCSAgICAgICB2aW5vX2RhdGFfZm9ybWF0c1tpbmRleF0uZGVzY3JpcHRpb24pOworCisJCW1lbXNldChmZCwgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2ZtdGRlc2MpKTsKKwkJZmQtPmluZGV4ID0gaW5kZXg7CisJCWZkLT50eXBlID0gdHlwZTsKKwkJZmQtPnBpeGVsZm9ybWF0ID0gdmlub19kYXRhX2Zvcm1hdHNbaW5kZXhdLnBpeGVsZm9ybWF0OworCQlzdHJjcHkoZmQtPmRlc2NyaXB0aW9uLCB2aW5vX2RhdGFfZm9ybWF0c1tpbmRleF0uZGVzY3JpcHRpb24pOworCQlicmVhazsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfdHJ5X2ZtdChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzIHRlbXB2Y3M7CisKKwlzd2l0Y2ggKGYtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTogeworCQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwZiA9ICZmLT5mbXQucGl4OworCisJCWRwcmludGsoInJlcXVlc3RlZDogdyA9ICVkLCBoID0gJWRcbiIsCisJCSAgICAgICBwZi0+d2lkdGgsIHBmLT5oZWlnaHQpOworCisJCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwkJbWVtY3B5KCZ0ZW1wdmNzLCB2Y3MsIHNpemVvZihzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzKSk7CisJCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJCXRlbXB2Y3MuZGF0YV9mb3JtYXQgPSB2aW5vX2ZpbmRfZGF0YV9mb3JtYXQocGYtPnBpeGVsZm9ybWF0KTsKKwkJaWYgKHRlbXB2Y3MuZGF0YV9mb3JtYXQgPT0gVklOT19EQVRBX0ZNVF9OT05FKSB7CisJCQl0ZW1wdmNzLmRhdGFfZm9ybWF0ID0gVklOT19EQVRBX0ZNVF9SR0IzMjsKKwkJCXBmLT5waXhlbGZvcm1hdCA9CisJCQkJdmlub19kYXRhX2Zvcm1hdHNbdGVtcHZjcy5kYXRhX2Zvcm1hdF0uCisJCQkJcGl4ZWxmb3JtYXQ7CisJCX0KKworCQkvKiBkYXRhIGZvcm1hdCBtdXN0IGJlIHNldCBiZWZvcmUgY2xpcHBpbmcvc2NhbGluZyAqLworCQl2aW5vX3NldF9zY2FsaW5nKCZ0ZW1wdmNzLCBwZi0+d2lkdGgsIHBmLT5oZWlnaHQpOworCisJCWRwcmludGsoImRhdGEgZm9ybWF0ID0gJXNcbiIsCisJCSAgICAgICB2aW5vX2RhdGFfZm9ybWF0c1t0ZW1wdmNzLmRhdGFfZm9ybWF0XS5kZXNjcmlwdGlvbik7CisKKwkJcGYtPndpZHRoID0gKHRlbXB2Y3MuY2xpcHBpbmcucmlnaHQgLSB0ZW1wdmNzLmNsaXBwaW5nLmxlZnQpIC8KKwkJCXRlbXB2Y3MuZGVjaW1hdGlvbjsKKwkJcGYtPmhlaWdodCA9ICh0ZW1wdmNzLmNsaXBwaW5nLmJvdHRvbSAtIHRlbXB2Y3MuY2xpcHBpbmcudG9wKSAvCisJCQl0ZW1wdmNzLmRlY2ltYXRpb247CisKKwkJcGYtPmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCQlwZi0+Ynl0ZXNwZXJsaW5lID0gdGVtcHZjcy5saW5lX3NpemU7CisJCXBmLT5zaXplaW1hZ2UgPSB0ZW1wdmNzLmxpbmVfc2l6ZSAqCisJCQkodGVtcHZjcy5jbGlwcGluZy5ib3R0b20gLSB0ZW1wdmNzLmNsaXBwaW5nLnRvcCkgLworCQkJdGVtcHZjcy5kZWNpbWF0aW9uOworCQlwZi0+Y29sb3JzcGFjZSA9CisJCQl2aW5vX2RhdGFfZm9ybWF0c1t0ZW1wdmNzLmRhdGFfZm9ybWF0XS5jb2xvcnNwYWNlOworCisJCXBmLT5wcml2ID0gMDsKKwkJYnJlYWs7CisJfQorCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9nX2ZtdChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3dpdGNoIChmLT50eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IHsKKwkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGYgPSAmZi0+Zm10LnBpeDsKKwkJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJCXBmLT53aWR0aCA9ICh2Y3MtPmNsaXBwaW5nLnJpZ2h0IC0gdmNzLT5jbGlwcGluZy5sZWZ0KSAvCisJCQl2Y3MtPmRlY2ltYXRpb247CisJCXBmLT5oZWlnaHQgPSAodmNzLT5jbGlwcGluZy5ib3R0b20gLSB2Y3MtPmNsaXBwaW5nLnRvcCkgLworCQkJdmNzLT5kZWNpbWF0aW9uOworCQlwZi0+cGl4ZWxmb3JtYXQgPQorCQkJdmlub19kYXRhX2Zvcm1hdHNbdmNzLT5kYXRhX2Zvcm1hdF0ucGl4ZWxmb3JtYXQ7CisKKwkJcGYtPmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCQlwZi0+Ynl0ZXNwZXJsaW5lID0gdmNzLT5saW5lX3NpemU7CisJCXBmLT5zaXplaW1hZ2UgPSB2Y3MtPmxpbmVfc2l6ZSAqCisJCQkodmNzLT5jbGlwcGluZy5ib3R0b20gLSB2Y3MtPmNsaXBwaW5nLnRvcCkgLworCQkJdmNzLT5kZWNpbWF0aW9uOworCQlwZi0+Y29sb3JzcGFjZSA9CisJCQl2aW5vX2RhdGFfZm9ybWF0c1t2Y3MtPmRhdGFfZm9ybWF0XS5jb2xvcnNwYWNlOworCisJCXBmLT5wcml2ID0gMDsKKworCQlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9zX2ZtdChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJaW50IGRhdGFfZm9ybWF0OworCisJc3dpdGNoIChmLT50eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IHsKKwkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGYgPSAmZi0+Zm10LnBpeDsKKwkJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJCWlmICghdmlub19pc19pbnB1dF9vd25lcih2Y3MpKSB7CisJCQlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZGF0YV9mb3JtYXQgPSB2aW5vX2ZpbmRfZGF0YV9mb3JtYXQocGYtPnBpeGVsZm9ybWF0KTsKKwkJaWYgKGRhdGFfZm9ybWF0ID09IFZJTk9fREFUQV9GTVRfTk9ORSkgeworCQkJdmNzLT5kYXRhX2Zvcm1hdCA9IFZJTk9fREFUQV9GTVRfUkdCMzI7CisJCQlwZi0+cGl4ZWxmb3JtYXQgPQorCQkJCXZpbm9fZGF0YV9mb3JtYXRzW3Zjcy0+ZGF0YV9mb3JtYXRdLgorCQkJCXBpeGVsZm9ybWF0OworCQl9IGVsc2UgeworCQkJdmNzLT5kYXRhX2Zvcm1hdCA9IGRhdGFfZm9ybWF0OworCQl9CisKKwkJLyogZGF0YSBmb3JtYXQgbXVzdCBiZSBzZXQgYmVmb3JlIGNsaXBwaW5nL3NjYWxpbmcgKi8KKwkJdmlub19zZXRfc2NhbGluZyh2Y3MsIHBmLT53aWR0aCwgcGYtPmhlaWdodCk7CisKKwkJZHByaW50aygiZGF0YSBmb3JtYXQgPSAlc1xuIiwKKwkJICAgICAgIHZpbm9fZGF0YV9mb3JtYXRzW3Zjcy0+ZGF0YV9mb3JtYXRdLmRlc2NyaXB0aW9uKTsKKworCQlwZi0+d2lkdGggPSB2Y3MtPmNsaXBwaW5nLnJpZ2h0IC0gdmNzLT5jbGlwcGluZy5sZWZ0OworCQlwZi0+aGVpZ2h0ID0gdmNzLT5jbGlwcGluZy5ib3R0b20gLSB2Y3MtPmNsaXBwaW5nLnRvcDsKKworCQlwZi0+ZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJCXBmLT5ieXRlc3BlcmxpbmUgPSB2Y3MtPmxpbmVfc2l6ZTsKKwkJcGYtPnNpemVpbWFnZSA9IHZjcy0+bGluZV9zaXplICoKKwkJCSh2Y3MtPmNsaXBwaW5nLmJvdHRvbSAtIHZjcy0+Y2xpcHBpbmcudG9wKSAvCisJCQl2Y3MtPmRlY2ltYXRpb247CisJCXBmLT5jb2xvcnNwYWNlID0KKwkJCXZpbm9fZGF0YV9mb3JtYXRzW3Zjcy0+ZGF0YV9mb3JtYXRdLmNvbG9yc3BhY2U7CisKKwkJcGYtPnByaXYgPSAwOworCisJCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX2Nyb3BjYXAoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgICBzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjY2FwKQoreworCWNvbnN0IHN0cnVjdCB2aW5vX2RhdGFfbm9ybSAqbm9ybTsKKworCXN3aXRjaCAoY2NhcC0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisJCW5vcm0gPSAmdmlub19kYXRhX25vcm1zW3Zjcy0+ZGF0YV9ub3JtXTsKKwkJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwkJY2NhcC0+Ym91bmRzLmxlZnQgPSAwOworCQljY2FwLT5ib3VuZHMudG9wID0gMDsKKwkJY2NhcC0+Ym91bmRzLndpZHRoID0gbm9ybS0+d2lkdGg7CisJCWNjYXAtPmJvdW5kcy5oZWlnaHQgPSBub3JtLT5oZWlnaHQ7CisJCW1lbWNweSgmY2NhcC0+ZGVmcmVjdCwgJmNjYXAtPmJvdW5kcywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgdjRsMl9yZWN0KSk7CisKKwkJY2NhcC0+cGl4ZWxhc3BlY3QubnVtZXJhdG9yID0gMTsKKwkJY2NhcC0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IgPSAxOworCQlicmVhazsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfZ19jcm9wKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgICBzdHJ1Y3QgdjRsMl9jcm9wICpjKQoreworCXN3aXRjaCAoYy0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwkJYy0+Yy5sZWZ0ID0gdmNzLT5jbGlwcGluZy5sZWZ0OworCQljLT5jLnRvcCA9IHZjcy0+Y2xpcHBpbmcudG9wOworCQljLT5jLndpZHRoID0gdmNzLT5jbGlwcGluZy5yaWdodCAtIHZjcy0+Y2xpcHBpbmcubGVmdDsKKwkJYy0+Yy5oZWlnaHQgPSB2Y3MtPmNsaXBwaW5nLmJvdHRvbSAtIHZjcy0+Y2xpcHBpbmcudG9wOworCisJCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCQlicmVhazsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfc19jcm9wKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgICBzdHJ1Y3QgdjRsMl9jcm9wICpjKQoreworCXN3aXRjaCAoYy0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwkJaWYgKCF2aW5vX2lzX2lucHV0X293bmVyKHZjcykpIHsKKwkJCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJdmlub19zZXRfY2xpcHBpbmcodmNzLCBjLT5jLmxlZnQsIGMtPmMudG9wLAorCQkJCSAgYy0+Yy53aWR0aCwgYy0+Yy5oZWlnaHQpOworCisJCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCQlicmVhazsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfZ19wYXJtKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgICBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpzcCkKK3sKKwlzd2l0Y2ggKHNwLT50eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IHsKKwkJc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0gKmNwID0gJnNwLT5wYXJtLmNhcHR1cmU7CisJCW1lbXNldChjcCwgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2NhcHR1cmVwYXJtKSk7CisKKwkJY3AtPmNhcGFiaWxpdHkgPSBWNEwyX0NBUF9USU1FUEVSRlJBTUU7CisJCWNwLT50aW1lcGVyZnJhbWUubnVtZXJhdG9yID0gMTsKKworCQlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisJCWNwLT50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPSB2Y3MtPmZwczsKKwkJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwkJLy8gVE9ETzogY3AtPnJlYWRidWZmZXJzID0geHh4OworCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX3NfcGFybShzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqc3ApCit7CisJc3dpdGNoIChzcC0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOiB7CisJCXN0cnVjdCB2NGwyX2NhcHR1cmVwYXJtICpjcCA9ICZzcC0+cGFybS5jYXB0dXJlOworCisJCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwkJaWYgKCF2aW5vX2lzX2lucHV0X293bmVyKHZjcykpIHsKKwkJCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoKGNwLT50aW1lcGVyZnJhbWUubnVtZXJhdG9yID09IDApIHx8CisJCSAgICAoY3AtPnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9PSAwKSkgeworCQkJLyogcmVzZXQgZnJhbWVyYXRlICovCisJCQl2aW5vX3NldF9kZWZhdWx0X2ZyYW1lcmF0ZSh2Y3MpOworCQl9IGVsc2UgeworCQkJdmlub19zZXRfZnJhbWVyYXRlKHZjcywgY3AtPnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciAvCisJCQkJCSAgIGNwLT50aW1lcGVyZnJhbWUubnVtZXJhdG9yKTsKKwkJfQorCQlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCQkvLyBUT0RPOiBzZXQgYnVmZmVycyBhY2NvcmRpbmcgdG8gY3AtPnJlYWRidWZmZXJzCisJCWJyZWFrOworCX0KKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfcmVxYnVmcyhzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyYikKK3sKKwlpZiAodmNzLT5yZWFkaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChyYi0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOiB7CisJCS8vIFRPRE86IGNoZWNrIHF1ZXVlIHR5cGUKKwkJaWYgKHJiLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkgeworCQkJZHByaW50aygidHlwZSBub3QgbW1hcFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICh2aW5vX2lzX2NhcHR1cmluZyh2Y3MpKSB7CisJCQlkcHJpbnRrKCJidXN5LCBjYXB0dXJpbmdcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCWRwcmludGsoImNvdW50ID0gJWRcbiIsIHJiLT5jb3VudCk7CisJCWlmIChyYi0+Y291bnQgPiAwKSB7CisJCQlpZiAodmlub19xdWV1ZV9oYXNfbWFwcGVkX2J1ZmZlcnMoJnZjcy0+ZmJfcXVldWUpKSB7CisJCQkJZHByaW50aygiYnVzeSwgYnVmZmVycyBzdGlsbCBtYXBwZWRcbiIpOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9IGVsc2UgeworCQkJCXZpbm9fcXVldWVfZnJlZSgmdmNzLT5mYl9xdWV1ZSk7CisJCQkJdmlub19xdWV1ZV9pbml0KCZ2Y3MtPmZiX3F1ZXVlLCAmcmItPmNvdW50KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZpbm9fY2FwdHVyZV9zdG9wKHZjcyk7CisJCQl2aW5vX3F1ZXVlX2ZyZWUoJnZjcy0+ZmJfcXVldWUpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmlub192NGwyX2dldF9idWZmZXJfc3RhdHVzKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCQkJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmZiLAorCQkJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJaWYgKHZpbm9fcXVldWVfb3V0Z29pbmdfY29udGFpbnMoJnZjcy0+ZmJfcXVldWUsCisJCQkJCSBmYi0+aWQpKSB7CisJCWItPmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX1FVRVVFRDsKKwkJYi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19ET05FOworCX0gZWxzZSBpZiAodmlub19xdWV1ZV9pbmNvbWluZ19jb250YWlucygmdmNzLT5mYl9xdWV1ZSwKKwkJCQkgICAgICAgZmItPmlkKSkgeworCQliLT5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19ET05FOworCQliLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKKwl9IGVsc2UgeworCQliLT5mbGFncyAmPSB+KFY0TDJfQlVGX0ZMQUdfRE9ORSB8CisJCQkgICAgICBWNEwyX0JVRl9GTEFHX1FVRVVFRCk7CisJfQorCisJYi0+ZmxhZ3MgJj0gfihWNEwyX0JVRl9GTEFHX1RJTUVDT0RFKTsKKworCWlmIChmYi0+bWFwX2NvdW50ID4gMCkKKwkJYi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19NQVBQRUQ7CisKKwliLT5pbmRleCA9IGZiLT5pZDsKKwliLT5tZW1vcnkgPSAodmNzLT5mYl9xdWV1ZS50eXBlID09IFZJTk9fTUVNT1JZX01NQVApID8KKwkJVjRMMl9NRU1PUllfTU1BUCA6IFY0TDJfTUVNT1JZX1VTRVJQVFI7CisJYi0+bS5vZmZzZXQgPSBmYi0+b2Zmc2V0OworCWItPmJ5dGVzdXNlZCA9IGZiLT5kYXRhX3NpemU7CisJYi0+bGVuZ3RoID0gZmItPnNpemU7CisJYi0+ZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJYi0+c2VxdWVuY2UgPSBmYi0+ZnJhbWVfY291bnRlcjsKKwltZW1jcHkoJmItPnRpbWVzdGFtcCwgJmZiLT50aW1lc3RhbXAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOworCS8vIGItPmlucHV0ID8KKworCWRwcmludGsoImJ1ZmZlciAlZDogbGVuZ3RoID0gJWQsIGJ5dGVzdXNlZCA9ICVkLCBvZmZzZXQgPSAlZFxuIiwKKwkJZmItPmlkLCBmYi0+c2l6ZSwgZmItPmRhdGFfc2l6ZSwgZmItPm9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX3F1ZXJ5YnVmKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgICAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYikKK3sKKwlpZiAodmNzLT5yZWFkaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChiLT50eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IHsKKwkJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmZiOworCisJCS8vIFRPRE86IGNoZWNrIHF1ZXVlIHR5cGUKKwkJaWYgKGItPmluZGV4ID49IHZpbm9fcXVldWVfZ2V0X2xlbmd0aCgmdmNzLT5mYl9xdWV1ZSkpIHsKKwkJCWRwcmludGsoImludmFsaWQgaW5kZXggPSAlZFxuIiwKKwkJCSAgICAgICBiLT5pbmRleCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWZiID0gdmlub19xdWV1ZV9nZXRfYnVmZmVyKCZ2Y3MtPmZiX3F1ZXVlLAorCQkJCQkgICBiLT5pbmRleCk7CisJCWlmIChmYiA9PSBOVUxMKSB7CisJCQlkcHJpbnRrKCJ2aW5vX3F1ZXVlX2dldF9idWZmZXIoKSBmYWlsZWQiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJdmlub192NGwyX2dldF9idWZmZXJfc3RhdHVzKHZjcywgZmIsIGIpOworCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX3FidWYoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJaWYgKHZjcy0+cmVhZGluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAoYi0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOiB7CisJCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYjsKKwkJaW50IHJldDsKKworCQkvLyBUT0RPOiBjaGVjayBxdWV1ZSB0eXBlCisJCWlmIChiLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkgeworCQkJZHByaW50aygidHlwZSBub3QgbW1hcFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWZiID0gdmlub19jYXB0dXJlX2VucXVldWUodmNzLCBiLT5pbmRleCk7CisJCWlmIChmYiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdmlub192NGwyX2dldF9idWZmZXJfc3RhdHVzKHZjcywgZmIsIGIpOworCisJCWlmICh2Y3MtPnN0cmVhbWluZykgeworCQkJcmV0ID0gdmlub19jYXB0dXJlX25leHQodmNzLCAxKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX2RxYnVmKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYiwKKwkJCSAgIHVuc2lnbmVkIGludCBub25ibG9ja2luZykKK3sKKwlpZiAodmNzLT5yZWFkaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChiLT50eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IHsKKwkJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmZiOworCQl1bnNpZ25lZCBpbnQgaW5jb21pbmcsIG91dGdvaW5nOworCQlpbnQgZXJyOworCisJCS8vIFRPRE86IGNoZWNrIHF1ZXVlIHR5cGUKKworCQllcnIgPSB2aW5vX3F1ZXVlX2dldF9pbmNvbWluZygmdmNzLT5mYl9xdWV1ZSwgJmluY29taW5nKTsKKwkJaWYgKGVycikgeworCQkJZHByaW50aygidmlub19xdWV1ZV9nZXRfaW5jb21pbmcoKSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJZXJyID0gdmlub19xdWV1ZV9nZXRfb3V0Z29pbmcoJnZjcy0+ZmJfcXVldWUsICZvdXRnb2luZyk7CisJCWlmIChlcnIpIHsKKwkJCWRwcmludGsoInZpbm9fcXVldWVfZ2V0X291dGdvaW5nKCkgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJZHByaW50aygiaW5jb21pbmcgPSAlZCwgb3V0Z29pbmcgPSAlZFxuIiwgaW5jb21pbmcsIG91dGdvaW5nKTsKKworCQlpZiAob3V0Z29pbmcgPT0gMCkgeworCQkJaWYgKGluY29taW5nID09IDApIHsKKwkJCQlkcHJpbnRrKCJubyBpbmNvbWluZyBvciBvdXRnb2luZyBidWZmZXJzXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChub25ibG9ja2luZykgeworCQkJCWRwcmludGsoIm5vbi1ibG9ja2luZyBJL08gd2FzIHNlbGVjdGVkIGFuZCAiCisJCQkJCSJ0aGVyZSBhcmUgbm8gYnVmZmVycyB0byBkZXF1ZXVlXG4iKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKworCQkJZXJyID0gdmlub193YWl0X2Zvcl9mcmFtZSh2Y3MpOworCQkJaWYgKGVycikgeworCQkJCWVyciA9IHZpbm9fd2FpdF9mb3JfZnJhbWUodmNzKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCS8qIGludGVycnVwdGVkICovCisJCQkJCXZpbm9fY2FwdHVyZV9mYWlsZWQodmNzKTsKKwkJCQkJcmV0dXJuIC1FSU87CisJCQkJfQorCQkJfQorCQl9CisKKwkJZmIgPSB2aW5vX3F1ZXVlX3JlbW92ZSgmdmNzLT5mYl9xdWV1ZSwgJmItPmluZGV4KTsKKwkJaWYgKGZiID09IE5VTEwpIHsKKwkJCWRwcmludGsoInZpbm9fcXVldWVfcmVtb3ZlKCkgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZXJyID0gdmlub19jaGVja19idWZmZXIodmNzLCBmYik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gLUVJTzsKKworCQl2aW5vX3Y0bDJfZ2V0X2J1ZmZlcl9zdGF0dXModmNzLCBmYiwgYik7CisJCWJyZWFrOworCX0KKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfc3RyZWFtb24oc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCXVuc2lnbmVkIGludCBpbmNvbWluZzsKKwlpbnQgcmV0OworCWlmICh2Y3MtPnJlYWRpbmcpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAodmNzLT5zdHJlYW1pbmcpCisJCXJldHVybiAwOworCisJLy8gVE9ETzogY2hlY2sgcXVldWUgdHlwZQorCisJaWYgKHZpbm9fcXVldWVfZ2V0X2xlbmd0aCgmdmNzLT5mYl9xdWV1ZSkgPCAxKSB7CisJCWRwcmludGsoIm5vIGJ1ZmZlcnMgYWxsb2NhdGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gdmlub19xdWV1ZV9nZXRfaW5jb21pbmcoJnZjcy0+ZmJfcXVldWUsICZpbmNvbWluZyk7CisJaWYgKHJldCkgeworCQlkcHJpbnRrKCJ2aW5vX3F1ZXVlX2dldF9pbmNvbWluZygpIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZjcy0+c3RyZWFtaW5nID0gMTsKKworCWlmIChpbmNvbWluZyA+IDApIHsKKwkJcmV0ID0gdmlub19jYXB0dXJlX25leHQodmNzLCAxKTsKKwkJaWYgKHJldCkgeworCQkJdmNzLT5zdHJlYW1pbmcgPSAwOworCisJCQlkcHJpbnRrKCJjb3VsZG4ndCBzdGFydCBjYXB0dXJlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX3N0cmVhbW9mZihzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MpCit7CisJaWYgKHZjcy0+cmVhZGluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghdmNzLT5zdHJlYW1pbmcpCisJCXJldHVybiAwOworCisJdmlub19jYXB0dXJlX3N0b3AodmNzKTsKKwl2Y3MtPnN0cmVhbWluZyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfcXVlcnljdHJsKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnF1ZXJ5Y3RybCkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCXN3aXRjaCAodmNzLT5pbnB1dCkgeworCWNhc2UgVklOT19JTlBVVF9EMToKKwkJZm9yIChpID0gMDsgaSA8IFZJTk9fSU5EWUNBTV9WNEwyX0NPTlRST0xfQ09VTlQ7IGkrKykgeworCQkJaWYgKHZpbm9faW5keWNhbV92NGwyX2NvbnRyb2xzW2ldLmlkID09CisJCQkgICAgcXVlcnljdHJsLT5pZCkgeworCQkJCW1lbWNweShxdWVyeWN0cmwsCisJCQkJICAgICAgICZ2aW5vX2luZHljYW1fdjRsMl9jb250cm9sc1tpXSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCkpOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKworCQllcnIgPSAgLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBWSU5PX0lOUFVUX0NPTVBPU0lURToKKwljYXNlIFZJTk9fSU5QVVRfU1ZJREVPOgorCQlmb3IgKGkgPSAwOyBpIDwgVklOT19TQUE3MTkxX1Y0TDJfQ09OVFJPTF9DT1VOVDsgaSsrKSB7CisJCQlpZiAodmlub19zYWE3MTkxX3Y0bDJfY29udHJvbHNbaV0uaWQgPT0KKwkJCSAgICBxdWVyeWN0cmwtPmlkKSB7CisJCQkJbWVtY3B5KHF1ZXJ5Y3RybCwKKwkJCQkgICAgICAgJnZpbm9fc2FhNzE5MV92NGwyX2NvbnRyb2xzW2ldLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSk7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJfQorCisJCWVyciA9ICAtRUlOVkFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAgLUVJTlZBTDsKKwl9CisKKyBmb3VuZDoKKwlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX2dfY3RybChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgc3RydWN0IHY0bDJfY29udHJvbCAqY29udHJvbCkKK3sKKwlzdHJ1Y3QgaW5keWNhbV9jb250cm9sIGluZHljYW1fY3RybDsKKwlzdHJ1Y3Qgc2FhNzE5MV9jb250cm9sIHNhYTcxOTFfY3RybDsKKwlpbnQgZXJyID0gMDsKKworCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCXN3aXRjaCAodmNzLT5pbnB1dCkgeworCWNhc2UgVklOT19JTlBVVF9EMToKKwkJaTJjX2NhbWVyYV9jb21tYW5kKERFQ09ERVJfSU5EWUNBTV9HRVRfQ09OVFJPTFMsCisJCQkJICAgJmluZHljYW1fY3RybCk7CisKKwkJc3dpdGNoKGNvbnRyb2wtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46CisJCQljb250cm9sLT52YWx1ZSA9IGluZHljYW1fY3RybC5hZ2M7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6CisJCQljb250cm9sLT52YWx1ZSA9IGluZHljYW1fY3RybC5hd2I7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQkJY29udHJvbC0+dmFsdWUgPSBpbmR5Y2FtX2N0cmwuZ2FpbjsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRToKKwkJCWNvbnRyb2wtPnZhbHVlID0gaW5keWNhbV9jdHJsLnJlZF9zYXR1cmF0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMToKKwkJCWNvbnRyb2wtPnZhbHVlID0gaW5keWNhbV9jdHJsLmJsdWVfc2F0dXJhdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgorCQkJY29udHJvbC0+dmFsdWUgPSBpbmR5Y2FtX2N0cmwucmVkX2JhbGFuY2U7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6CisJCQljb250cm9sLT52YWx1ZSA9IGluZHljYW1fY3RybC5ibHVlX2JhbGFuY2U7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKwkJCWNvbnRyb2wtPnZhbHVlID0gaW5keWNhbV9jdHJsLnNodXR0ZXI7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9HQU1NQToKKwkJCWNvbnRyb2wtPnZhbHVlID0gaW5keWNhbV9jdHJsLmdhbW1hOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgVklOT19JTlBVVF9DT01QT1NJVEU6CisJY2FzZSBWSU5PX0lOUFVUX1NWSURFTzoKKwkJaTJjX2RlY29kZXJfY29tbWFuZChERUNPREVSX1NBQTcxOTFfR0VUX0NPTlRST0xTLAorCQkJCSAgICZzYWE3MTkxX2N0cmwpOworCisJCXN3aXRjaChjb250cm9sLT5pZCkgeworCQljYXNlIFY0TDJfQ0lEX0hVRToKKwkJCWNvbnRyb2wtPnZhbHVlID0gc2FhNzE5MV9jdHJsLmh1ZTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRToKKwkJCWNvbnRyb2wtPnZhbHVlID0gc2FhNzE5MV9jdHJsLnZ0cmM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gIC1FSU5WQUw7CisJfQorCisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9zX2N0cmwoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJc3RydWN0IGluZHljYW1fY29udHJvbCBpbmR5Y2FtX2N0cmw7CisJc3RydWN0IHNhYTcxOTFfY29udHJvbCBzYWE3MTkxX2N0cmw7CisJaW50IGk7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlzd2l0Y2ggKHZjcy0+aW5wdXQpIHsKKwljYXNlIFZJTk9fSU5QVVRfRDE6CisJCWZvciAoaSA9IDA7IGkgPCBWSU5PX0lORFlDQU1fVjRMMl9DT05UUk9MX0NPVU5UOyBpKyspIHsKKwkJCWlmICh2aW5vX2luZHljYW1fdjRsMl9jb250cm9sc1tpXS5pZCA9PQorCQkJICAgIGNvbnRyb2wtPmlkKSB7CisJCQkJaWYgKChjb250cm9sLT52YWx1ZSA+PQorCQkJCSAgICAgdmlub19pbmR5Y2FtX3Y0bDJfY29udHJvbHNbaV0ubWluaW11bSkKKwkJCQkgICAgJiYgKGNvbnRyb2wtPnZhbHVlIDw9CisJCQkJCXZpbm9faW5keWNhbV92NGwyX2NvbnRyb2xzW2ldLgorCQkJCQltYXhpbXVtKSkgeworCQkJCQlnb3RvIG9rMTsKKwkJCQl9IGVsc2UgeworCQkJCQllcnIgPSAtRVJBTkdFOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCX0KKwkJfQorCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCitvazE6CisJCWluZHljYW1fY3RybC5hZ2MgPSBJTkRZQ0FNX1ZBTFVFX1VOQ0hBTkdFRDsKKwkJaW5keWNhbV9jdHJsLmF3YiA9IElORFlDQU1fVkFMVUVfVU5DSEFOR0VEOworCQlpbmR5Y2FtX2N0cmwuc2h1dHRlciA9IElORFlDQU1fVkFMVUVfVU5DSEFOR0VEOworCQlpbmR5Y2FtX2N0cmwuZ2FpbiA9IElORFlDQU1fVkFMVUVfVU5DSEFOR0VEOworCQlpbmR5Y2FtX2N0cmwucmVkX2JhbGFuY2UgPSBJTkRZQ0FNX1ZBTFVFX1VOQ0hBTkdFRDsKKwkJaW5keWNhbV9jdHJsLmJsdWVfYmFsYW5jZSA9IElORFlDQU1fVkFMVUVfVU5DSEFOR0VEOworCQlpbmR5Y2FtX2N0cmwucmVkX3NhdHVyYXRpb24gPSBJTkRZQ0FNX1ZBTFVFX1VOQ0hBTkdFRDsKKwkJaW5keWNhbV9jdHJsLmJsdWVfc2F0dXJhdGlvbiA9IElORFlDQU1fVkFMVUVfVU5DSEFOR0VEOworCQlpbmR5Y2FtX2N0cmwuZ2FtbWEgPSBJTkRZQ0FNX1ZBTFVFX1VOQ0hBTkdFRDsKKworCQlzd2l0Y2goY29udHJvbC0+aWQpIHsKKwkJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKKwkJCWluZHljYW1fY3RybC5hZ2MgPSBjb250cm9sLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKKwkJCWluZHljYW1fY3RybC5hd2IgPSBjb250cm9sLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0dBSU46CisJCQlpbmR5Y2FtX2N0cmwuZ2FpbiA9IGNvbnRyb2wtPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9CQVNFOgorCQkJaW5keWNhbV9jdHJsLnJlZF9zYXR1cmF0aW9uID0gY29udHJvbC0+dmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxOgorCQkJaW5keWNhbV9jdHJsLmJsdWVfc2F0dXJhdGlvbiA9IGNvbnRyb2wtPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCQlpbmR5Y2FtX2N0cmwucmVkX2JhbGFuY2UgPSBjb250cm9sLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJCWluZHljYW1fY3RybC5ibHVlX2JhbGFuY2UgPSBjb250cm9sLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQkJaW5keWNhbV9jdHJsLnNodXR0ZXIgPSBjb250cm9sLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0dBTU1BOgorCQkJaW5keWNhbV9jdHJsLmdhbW1hID0gY29udHJvbC0+dmFsdWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVyciA9ICAtRUlOVkFMOworCQl9CisKKwkJaWYgKCFlcnIpCisJCQlpMmNfY2FtZXJhX2NvbW1hbmQoREVDT0RFUl9JTkRZQ0FNX1NFVF9DT05UUk9MUywKKwkJCQkJICAgJmluZHljYW1fY3RybCk7CisJCWJyZWFrOworCWNhc2UgVklOT19JTlBVVF9DT01QT1NJVEU6CisJY2FzZSBWSU5PX0lOUFVUX1NWSURFTzoKKwkJZm9yIChpID0gMDsgaSA8IFZJTk9fU0FBNzE5MV9WNEwyX0NPTlRST0xfQ09VTlQ7IGkrKykgeworCQkJaWYgKHZpbm9fc2FhNzE5MV92NGwyX2NvbnRyb2xzW2ldLmlkID09CisJCQkgICAgY29udHJvbC0+aWQpIHsKKwkJCQlpZiAoKGNvbnRyb2wtPnZhbHVlID49CisJCQkJICAgICB2aW5vX3NhYTcxOTFfdjRsMl9jb250cm9sc1tpXS5taW5pbXVtKQorCQkJCSAgICAmJiAoY29udHJvbC0+dmFsdWUgPD0KKwkJCQkJdmlub19zYWE3MTkxX3Y0bDJfY29udHJvbHNbaV0uCisJCQkJCW1heGltdW0pKSB7CisJCQkJCWdvdG8gb2syOworCQkJCX0gZWxzZSB7CisJCQkJCWVyciA9IC1FUkFOR0U7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJfQorCQl9CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisKK29rMjoKKwkJc2FhNzE5MV9jdHJsLmh1ZSA9IFNBQTcxOTFfVkFMVUVfVU5DSEFOR0VEOworCQlzYWE3MTkxX2N0cmwudnRyYyA9IFNBQTcxOTFfVkFMVUVfVU5DSEFOR0VEOworCisJCXN3aXRjaChjb250cm9sLT5pZCkgeworCQljYXNlIFY0TDJfQ0lEX0hVRToKKwkJCXNhYTcxOTFfY3RybC5odWUgPSBjb250cm9sLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRToKKwkJCXNhYTcxOTFfY3RybC52dHJjID0gY29udHJvbC0+dmFsdWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVyciA9ICAtRUlOVkFMOworCQl9CisKKwkJaWYgKCFlcnIpCisJCQlpMmNfZGVjb2Rlcl9jb21tYW5kKERFQ09ERVJfU0FBNzE5MV9TRVRfQ09OVFJPTFMsCisJCQkJCSAgICAmc2FhNzE5MV9jdHJsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gIC1FSU5WQUw7CisJfQorCitlcnJvcjoKKwlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIEZpbGUgb3BlcmF0aW9ucyAqLworCitzdGF0aWMgaW50IHZpbm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcyA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisJZHByaW50aygib3BlbigpOiBjaGFubmVsID0gJWNcbiIsCisJICAgICAgICh2Y3MtPmNoYW5uZWwgPT0gVklOT19DSEFOTkVMX0EpID8gJ0EnIDogJ0InKTsKKworCWRvd24oJnZjcy0+c2VtKTsKKworCWlmICh2Y3MtPnVzZXJzKSB7CisJCWRwcmludGsoIm9wZW4oKTogZHJpdmVyIGJ1c3lcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHZpbm9fYWNxdWlyZV9pbnB1dCh2Y3MpOworCWlmIChyZXQpIHsKKwkJZHByaW50aygib3BlbigpOiB2aW5vX2FjcXVpcmVfaW5wdXQoKSBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwl2Y3MtPnVzZXJzKys7CisKKyBvdXQ6CisJdXAoJnZjcy0+c2VtKTsKKworCWRwcmludGsoIm9wZW4oKTogJXMhXG4iLCByZXQgPyAiZmFpbGVkIiA6ICJjb21wbGV0ZSIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aW5vX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlkcHJpbnRrKCJjbG9zZSgpOlxuIik7CisKKwlkb3duKCZ2Y3MtPnNlbSk7CisKKwl2Y3MtPnVzZXJzLS07CisKKwlpZiAoIXZjcy0+dXNlcnMpIHsKKwkJdmlub19yZWxlYXNlX2lucHV0KHZjcyk7CisKKwkJLyogc3RvcCBETUEgYW5kIGZyZWUgYnVmZmVycyAqLworCQl2aW5vX2NhcHR1cmVfc3RvcCh2Y3MpOworCQl2aW5vX3F1ZXVlX2ZyZWUoJnZjcy0+ZmJfcXVldWUpOworCX0KKworCXVwKCZ2Y3MtPnNlbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmlub192bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCisJZmItPm1hcF9jb3VudCsrOworCWRwcmludGsoInZpbm9fdm1fb3BlbigpOiBjb3VudCA9ICVkXG4iLCBmYi0+bWFwX2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgdmlub192bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqZmIgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKworCWZiLT5tYXBfY291bnQtLTsKKwlkcHJpbnRrKCJ2aW5vX3ZtX2Nsb3NlKCk6IGNvdW50ID0gJWRcbiIsIGZiLT5tYXBfY291bnQpOworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHZpbm9fdm1fb3BzID0geworCS5vcGVuCT0gdmlub192bV9vcGVuLAorCS5jbG9zZQk9IHZpbm9fdm1fY2xvc2UsCit9OworCitzdGF0aWMgaW50IHZpbm9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmZiID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaSwgbGVuZ3RoOworCWludCByZXQgPSAwOworCisJZHByaW50aygibW1hcCgpOlxuIik7CisKKwkvLyBUT0RPOiByZWplY3QgbW1hcCBpZiBhbHJlYWR5IG1hcHBlZAorCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdmNzLT5zZW0pKQorCQlyZXR1cm4gLUVJTlRSOworCisJaWYgKHZjcy0+cmVhZGluZykgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCS8vIFRPRE86IGNoZWNrIHF1ZXVlIHR5cGUKKworCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpIHsKKwkJZHByaW50aygibW1hcCgpOiBhcHAgYnVnOiBQUk9UX1dSSVRFIHBsZWFzZVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkgeworCQlkcHJpbnRrKCJtbWFwKCk6IGFwcCBidWc6IE1BUF9TSEFSRUQgcGxlYXNlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogZmluZCB0aGUgY29ycmVjdCBidWZmZXIgdXNpbmcgb2Zmc2V0ICovCisJbGVuZ3RoID0gdmlub19xdWV1ZV9nZXRfbGVuZ3RoKCZ2Y3MtPmZiX3F1ZXVlKTsKKwlpZiAobGVuZ3RoID09IDApIHsKKwkJZHByaW50aygibW1hcCgpOiBxdWV1ZSBub3QgaW5pdGlhbGl6ZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJZmIgPSB2aW5vX3F1ZXVlX2dldF9idWZmZXIoJnZjcy0+ZmJfcXVldWUsIGkpOworCQlpZiAoZmIgPT0gTlVMTCkgeworCQkJZHByaW50aygibW1hcCgpOiB2aW5vX3F1ZXVlX2dldF9idWZmZXIoKSBmYWlsZWRcbiIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGZiLT5vZmZzZXQgPT0gb2Zmc2V0KQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlkcHJpbnRrKCJtbWFwKCk6IGludmFsaWQgb2Zmc2V0ID0gJWx1XG4iLCBvZmZzZXQpOworCXJldCA9IC1FSU5WQUw7CisJZ290byBvdXQ7CisKK2ZvdW5kOgorCWRwcmludGsoIm1tYXAoKTogYnVmZmVyID0gJWRcbiIsIGkpOworCisJaWYgKHNpemUgPiAoZmItPmRlc2NfdGFibGUucGFnZV9jb3VudCAqIFBBR0VfU0laRSkpIHsKKwkJZHByaW50aygibW1hcCgpOiBmYWlsZWQ6IHNpemUgPSAlbHUgPiAlbHVcbiIsCisJCQlzaXplLCBmYi0+ZGVzY190YWJsZS5wYWdlX2NvdW50ICogUEFHRV9TSVpFKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGZiLT5kZXNjX3RhYmxlLnBhZ2VfY291bnQ7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHBmbiA9CisJCQl2aXJ0X3RvX3BoeXMoKHZvaWQgKilmYi0+ZGVzY190YWJsZS52aXJ0dWFsW2ldKSA+PgorCQkJUEFHRV9TSElGVDsKKworCQlpZiAoc2l6ZSA8IFBBR0VfU0laRSkKKwkJCWJyZWFrOworCisJCS8vIHByb3RlY3Rpb24gd2FzOiBQQUdFX1JFQURPTkxZCisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGZuLCBQQUdFX1NJWkUsCisJCQkJICAgIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQkJZHByaW50aygibW1hcCgpOiByZW1hcF9wZm5fcmFuZ2UoKSBmYWlsZWRcbiIpOworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3RhcnQgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisKKwlmYi0+bWFwX2NvdW50ID0gMTsKKworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fRE9OVEVYUEFORCB8IFZNX1JFU0VSVkVEOworCXZtYS0+dm1fZmxhZ3MgJj0gflZNX0lPOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gZmI7CisJdm1hLT52bV9maWxlID0gZmlsZTsKKwl2bWEtPnZtX29wcyA9ICZ2aW5vX3ZtX29wczsKKworb3V0OgorCXVwKCZ2Y3MtPnNlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHZpbm9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqcHQpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCBvdXRnb2luZzsKKwl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKworCS8vIGxvY2sgbXV0ZXggKD8pCisJLy8gVE9ETzogdGhpcyBoYXMgdG8gYmUgY29ycmVjdGVkIGZvciBkaWZmZXJlbnQgcmVhZCBtb2RlcworCisJZHByaW50aygicG9sbCgpOlxuIik7CisKKwlpZiAodmlub19xdWV1ZV9nZXRfb3V0Z29pbmcoJnZjcy0+ZmJfcXVldWUsICZvdXRnb2luZykpIHsKKwkJZHByaW50aygicG9sbCgpOiB2aW5vX3F1ZXVlX2dldF9vdXRnb2luZygpIGZhaWxlZFxuIik7CisJCXJldCA9IFBPTExFUlI7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChvdXRnb2luZyA+IDApCisJCWdvdG8gb3ZlcjsKKworCXBvbGxfd2FpdChmaWxlLCAmdmNzLT5mYl9xdWV1ZS5mcmFtZV93YWl0X3F1ZXVlLCBwdCk7CisKKwlpZiAodmlub19xdWV1ZV9nZXRfb3V0Z29pbmcoJnZjcy0+ZmJfcXVldWUsICZvdXRnb2luZykpIHsKKwkJZHByaW50aygicG9sbCgpOiB2aW5vX3F1ZXVlX2dldF9vdXRnb2luZygpIGZhaWxlZFxuIik7CisJCXJldCA9IFBPTExFUlI7CisJCWdvdG8gZXJyb3I7CisJfQorCitvdmVyOgorCWRwcmludGsoInBvbGwoKTogZGF0YSAlc2F2YWlsYWJsZVxuIiwKKwkJKG91dGdvaW5nID4gMCkgPyAiIiA6ICJub3QgIik7CisJaWYgKG91dGdvaW5nID4gMCkgeworCQlyZXQgPSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKworZXJyb3I6CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZpbm9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcyA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisKKwlzd2l0Y2ggKF9JT0NfVFlQRShjbWQpKSB7CisJY2FzZSAndic6CisJCWRwcmludGsoImlvY3RsKCk6IFY0TDEgdW5zdXBwb3J0ZWQgKDB4JTA4eClcbiIsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgJ1YnOgorCQlkcHJpbnRrKCJpb2N0bCgpOiBWNEwyICVzICgweCUwOHgpXG4iLAorCQkJdjRsMl9pb2N0bF9uYW1lc1tfSU9DX05SKGNtZCldLCBjbWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKCJpb2N0bCgpOiB1bnN1cHBvcnRlZCBjb21tYW5kIDB4JTA4eFxuIiwgY21kKTsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCS8qIFRPRE86IFY0TDEgaW50ZXJmYWNlICh1c2UgY29tcGF0aWJpbGl0eSBsYXllcj8pICovCisJLyogVjRMMiBpbnRlcmZhY2UgKi8KKwljYXNlIFZJRElPQ19RVUVSWUNBUDogeworCQl2aW5vX3Y0bDJfcXVlcnljYXAoYXJnKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0VOVU1JTlBVVDogeworCQlyZXR1cm4gdmlub192NGwyX2VudW1pbnB1dCh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX0dfSU5QVVQ6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9nX2lucHV0KHZjcywgYXJnKTsKKwl9CisJY2FzZSBWSURJT0NfU19JTlBVVDogeworCQlyZXR1cm4gdmlub192NGwyX3NfaW5wdXQodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19FTlVNU1REOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfZW51bXN0ZCh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX0dfU1REOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfZ19zdGQodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19TX1NURDogeworCQlyZXR1cm4gdmlub192NGwyX3Nfc3RkKHZjcywgYXJnKTsKKwl9CisJY2FzZSBWSURJT0NfRU5VTV9GTVQ6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9lbnVtX2ZtdCh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX1RSWV9GTVQ6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl90cnlfZm10KHZjcywgYXJnKTsKKwl9CisJY2FzZSBWSURJT0NfR19GTVQ6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9nX2ZtdCh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX1NfRk1UOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfc19mbXQodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19DUk9QQ0FQOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfY3JvcGNhcCh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX0dfQ1JPUDogeworCQlyZXR1cm4gdmlub192NGwyX2dfY3JvcCh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX1NfQ1JPUDogeworCQlyZXR1cm4gdmlub192NGwyX3NfY3JvcCh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX0dfUEFSTTogeworCQlyZXR1cm4gdmlub192NGwyX2dfcGFybSh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX1NfUEFSTTogeworCQlyZXR1cm4gdmlub192NGwyX3NfcGFybSh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX1JFUUJVRlM6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9yZXFidWZzKHZjcywgYXJnKTsKKwl9CisJY2FzZSBWSURJT0NfUVVFUllCVUY6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9xdWVyeWJ1Zih2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX1FCVUY6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9xYnVmKHZjcywgYXJnKTsKKwl9CisJY2FzZSBWSURJT0NfRFFCVUY6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9kcWJ1Zih2Y3MsIGFyZywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCX0KKwljYXNlIFZJRElPQ19TVFJFQU1PTjogeworCQlyZXR1cm4gdmlub192NGwyX3N0cmVhbW9uKHZjcyk7CisJfQorCWNhc2UgVklESU9DX1NUUkVBTU9GRjogeworCQlyZXR1cm4gdmlub192NGwyX3N0cmVhbW9mZih2Y3MpOworCX0KKwljYXNlIFZJRElPQ19RVUVSWUNUUkw6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9xdWVyeWN0cmwodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19HX0NUUkw6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9nX2N0cmwodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19TX0NUUkw6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9zX2N0cmwodmNzLCBhcmcpOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdmNzLT5zZW0pKQorCQlyZXR1cm4gLUVJTlRSOworCisJcmV0ID0gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCB2aW5vX2RvX2lvY3RsKTsKKworCXVwKCZ2Y3MtPnNlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBJbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCAqLworCisvLyBfX2luaXRkYXRhCitzdGF0aWMgaW50IHZpbm9faW5pdF9zdGFnZSA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpbm9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gdmlub19vcGVuLAorCS5yZWxlYXNlCT0gdmlub19jbG9zZSwKKwkuaW9jdGwJCT0gdmlub19pb2N0bCwKKwkubW1hcAkJPSB2aW5vX21tYXAsCisJLnBvbGwJCT0gdmlub19wb2xsLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorfTsKKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdjRsX2RldmljZV90ZW1wbGF0ZSA9IHsKKwkubmFtZQkJPSAiTk9UIFNFVCIsCisJLy8udHlwZQkJPSBWSURfVFlQRV9DQVBUVVJFIHwgVklEX1RZUEVfU1VCQ0FQVFVSRSB8CisJLy8JVklEX1RZUEVfQ0xJUFBJTkcgfCBWSURfVFlQRV9TQ0FMRVMsIFZJRF9UWVBFX09WRVJMQVkKKwkuaGFyZHdhcmUJPSBWSURfSEFSRFdBUkVfVklOTywKKwkuZm9wcwkJPSAmdmlub19mb3BzLAorCS5taW5vcgkJPSAtMSwKK307CisKK3N0YXRpYyB2b2lkIHZpbm9fbW9kdWxlX2NsZWFudXAoaW50IHN0YWdlKQoreworCXN3aXRjaChzdGFnZSkgeworCWNhc2UgMTA6CisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZpbm9fZHJ2ZGF0YS0+Yi52NGxfZGV2aWNlKTsKKwkJdmlub19kcnZkYXRhLT5iLnY0bF9kZXZpY2UgPSBOVUxMOworCWNhc2UgOToKKwkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uodmlub19kcnZkYXRhLT5hLnY0bF9kZXZpY2UpOworCQl2aW5vX2RydmRhdGEtPmEudjRsX2RldmljZSA9IE5VTEw7CisJY2FzZSA4OgorCQl2aW5vX2kyY19kZWxfYnVzKCk7CisJY2FzZSA3OgorCQlmcmVlX2lycShTR0lfVklOT19JUlEsIE5VTEwpOworCWNhc2UgNjoKKwkJaWYgKHZpbm9fZHJ2ZGF0YS0+Yi52NGxfZGV2aWNlKSB7CisJCQl2aWRlb19kZXZpY2VfcmVsZWFzZSh2aW5vX2RydmRhdGEtPmIudjRsX2RldmljZSk7CisJCQl2aW5vX2RydmRhdGEtPmIudjRsX2RldmljZSA9IE5VTEw7CisJCX0KKwljYXNlIDU6CisJCWlmICh2aW5vX2RydmRhdGEtPmEudjRsX2RldmljZSkgeworCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2Uodmlub19kcnZkYXRhLT5hLnY0bF9kZXZpY2UpOworCQkJdmlub19kcnZkYXRhLT5hLnY0bF9kZXZpY2UgPSBOVUxMOworCQl9CisJY2FzZSA0OgorCQkvKiBhbGwgZW50cmllcyBpbiBkbWFfY3B1IGR1bW15IHRhYmxlIGhhdmUgdGhlIHNhbWUgYWRkcmVzcyAqLworCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsCisJCQkJIHZpbm9fZHJ2ZGF0YS0+ZHVtbXlfZGVzY190YWJsZS5kbWFfY3B1WzBdLAorCQkJCSBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIFZJTk9fRFVNTVlfREVTQ19DT1VOVAorCQkJCSAgKiBzaXplb2YoZG1hX2FkZHJfdCksCisJCQkJICAodm9pZCAqKXZpbm9fZHJ2ZGF0YS0+CisJCQkJICBkdW1teV9kZXNjX3RhYmxlLmRtYV9jcHUsCisJCQkJICB2aW5vX2RydmRhdGEtPmR1bW15X2Rlc2NfdGFibGUuZG1hKTsKKwljYXNlIDM6CisJCWZyZWVfcGFnZSh2aW5vX2RydmRhdGEtPmR1bW15X3BhZ2UpOworCWNhc2UgMjoKKwkJa2ZyZWUodmlub19kcnZkYXRhKTsKKwljYXNlIDE6CisJCWlvdW5tYXAodmlubyk7CisJY2FzZSAwOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKCJ2aW5vX21vZHVsZV9jbGVhbnVwKCk6IGludmFsaWQgY2xlYW51cCBzdGFnZSA9ICVkXG4iLAorCQkJc3RhZ2UpOworCX0KK30KKworc3RhdGljIGludCB2aW5vX3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByZXZfaWQ7CisKKwlpZiAoaXAyMl9pc19mdWxsaG91c2UoKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTk8gZG9lc24ndCBleGlzdCBpbiBJUDIyIEZ1bGxob3VzZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghKHNnaW1jLT5zeXN0ZW1pZCAmIFNHSU1DX1NZU0lEX0VQUkVTRU5UKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTk8gaXMgbm90IGZvdW5kIChFSVNBIEJVUyBub3QgcHJlc2VudClcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl2aW5vID0gKHN0cnVjdCBzZ2lfdmlubyAqKWlvcmVtYXAoVklOT19CQVNFLCBzaXplb2Yoc3RydWN0IHNnaV92aW5vKSk7CisJaWYgKCF2aW5vKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklOTzogaW9yZW1hcCgpIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwl2aW5vX2luaXRfc3RhZ2UrKzsKKworCWlmIChnZXRfZGJlKHJldl9pZCwgJih2aW5vLT5yZXZfaWQpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWFkIFZJTk8gcmV2aXNpb24gcmVnaXN0ZXJcbiIpOworCQl2aW5vX21vZHVsZV9jbGVhbnVwKHZpbm9faW5pdF9zdGFnZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChWSU5PX0lEX1ZBTFVFKHJldl9pZCkgIT0gVklOT19DSElQX0lEKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5rbm93biBWSU5PIGNoaXAgSUQgKFJldi9JRDogMHglMDJseClcbiIsCisJCSAgICAgICByZXZfaWQpOworCQl2aW5vX21vZHVsZV9jbGVhbnVwKHZpbm9faW5pdF9zdGFnZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIlZJTk8gd2l0aCBjaGlwIElEICVsZCwgcmV2aXNpb24gJWxkIGZvdW5kXG4iLAorCSAgICAgICBWSU5PX0lEX1ZBTFVFKHJldl9pZCksIFZJTk9fUkVWX05VTShyZXZfaWQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9faW5pdCh2b2lkKQoreworCWRtYV9hZGRyX3QgZG1hX2R1bW15X2FkZHJlc3M7CisJaW50IGk7CisKKwl2aW5vX2RydmRhdGEgPSAoc3RydWN0IHZpbm9fc2V0dGluZ3MgKikKKwkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHZpbm9fc2V0dGluZ3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZpbm9fZHJ2ZGF0YSkgeworCQl2aW5vX21vZHVsZV9jbGVhbnVwKHZpbm9faW5pdF9zdGFnZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQodmlub19kcnZkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHZpbm9fc2V0dGluZ3MpKTsKKwl2aW5vX2luaXRfc3RhZ2UrKzsKKworCS8qIGNyZWF0ZSBhIGR1bW15IGRtYSBkZXNjcmlwdG9yICovCisJdmlub19kcnZkYXRhLT5kdW1teV9wYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIXZpbm9fZHJ2ZGF0YS0+ZHVtbXlfcGFnZSkgeworCQl2aW5vX21vZHVsZV9jbGVhbnVwKHZpbm9faW5pdF9zdGFnZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl2aW5vX2luaXRfc3RhZ2UrKzsKKworCS8vIFRPRE86IHVzZSBwYWdlX2NvdW50IGluIGR1bW15X2Rlc2NfdGFibGUKKworCXZpbm9fZHJ2ZGF0YS0+ZHVtbXlfZGVzY190YWJsZS5kbWFfY3B1ID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsCisJCVZJTk9fRFVNTVlfREVTQ19DT1VOVCAqIHNpemVvZihkbWFfYWRkcl90KSwKKwkJJnZpbm9fZHJ2ZGF0YS0+ZHVtbXlfZGVzY190YWJsZS5kbWEsCisJCUdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIXZpbm9fZHJ2ZGF0YS0+ZHVtbXlfZGVzY190YWJsZS5kbWFfY3B1KSB7CisJCXZpbm9fbW9kdWxlX2NsZWFudXAodmlub19pbml0X3N0YWdlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXZpbm9faW5pdF9zdGFnZSsrOworCisJZG1hX2R1bW15X2FkZHJlc3MgPSBkbWFfbWFwX3NpbmdsZShOVUxMLAorCQkJCQkgICAodm9pZCAqKXZpbm9fZHJ2ZGF0YS0+ZHVtbXlfcGFnZSwKKwkJCQkJUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCWZvciAoaSA9IDA7IGkgPCBWSU5PX0RVTU1ZX0RFU0NfQ09VTlQ7IGkrKykgeworCQl2aW5vX2RydmRhdGEtPmR1bW15X2Rlc2NfdGFibGUuZG1hX2NwdVtpXSA9IGRtYV9kdW1teV9hZGRyZXNzOworCX0KKworCS8qIGluaXRpYWxpemUgVklOTyAqLworCisJdmluby0+Y29udHJvbCA9IDA7CisJdmluby0+YS5uZXh0XzRfZGVzYyA9IHZpbm9fZHJ2ZGF0YS0+ZHVtbXlfZGVzY190YWJsZS5kbWE7CisJdmluby0+Yi5uZXh0XzRfZGVzYyA9IHZpbm9fZHJ2ZGF0YS0+ZHVtbXlfZGVzY190YWJsZS5kbWE7CisJdWRlbGF5KFZJTk9fREVTQ19GRVRDSF9ERUxBWSk7CisKKwl2aW5vLT5pbnRyX3N0YXR1cyA9IDA7CisKKwl2aW5vLT5hLmZpZm9fdGhyZXMgPSBWSU5PX0ZJRk9fVEhSRVNIT0xEX0RFRkFVTFQ7CisJdmluby0+Yi5maWZvX3RocmVzID0gVklOT19GSUZPX1RIUkVTSE9MRF9ERUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub19pbml0X2NoYW5uZWxfc2V0dGluZ3Moc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJCSB1bnNpZ25lZCBpbnQgY2hhbm5lbCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl2Y3MtPmNoYW5uZWwgPSBjaGFubmVsOworCXZjcy0+aW5wdXQgPSBWSU5PX0lOUFVUX05PTkU7CisJdmNzLT5hbHBoYSA9IDA7CisJdmNzLT51c2VycyA9IDA7CisJdmNzLT5kYXRhX2Zvcm1hdCA9IFZJTk9fREFUQV9GTVRfR1JFWTsKKwl2Y3MtPmRhdGFfbm9ybSA9IFZJTk9fREFUQV9OT1JNX05UU0M7CisJdmNzLT5kZWNpbWF0aW9uID0gMTsKKwl2aW5vX3NldF9kZWZhdWx0X2NsaXBwaW5nKHZjcyk7CisJdmlub19zZXRfZGVmYXVsdF9mcmFtZXJhdGUodmNzKTsKKworCXZjcy0+Y2FwdHVyaW5nID0gMDsKKworCWluaXRfTVVURVgoJnZjcy0+c2VtKTsKKwlzcGluX2xvY2tfaW5pdCgmdmNzLT5jYXB0dXJlX2xvY2spOworCisJaW5pdF9NVVRFWCgmdmNzLT5mYl9xdWV1ZS5xdWV1ZV9zZW0pOworCXNwaW5fbG9ja19pbml0KCZ2Y3MtPmZiX3F1ZXVlLnF1ZXVlX2xvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZjcy0+ZmJfcXVldWUuZnJhbWVfd2FpdF9xdWV1ZSk7CisKKwl2Y3MtPnY0bF9kZXZpY2UgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoIXZjcy0+djRsX2RldmljZSkgeworCQl2aW5vX21vZHVsZV9jbGVhbnVwKHZpbm9faW5pdF9zdGFnZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl2aW5vX2luaXRfc3RhZ2UrKzsKKworCW1lbWNweSh2Y3MtPnY0bF9kZXZpY2UsICZ2NGxfZGV2aWNlX3RlbXBsYXRlLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHZpZGVvX2RldmljZSkpOworCXN0cmNweSh2Y3MtPnY0bF9kZXZpY2UtPm5hbWUsIG5hbWUpOworCXZjcy0+djRsX2RldmljZS0+cmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlOworCisJdmlkZW9fc2V0X2RydmRhdGEodmNzLT52NGxfZGV2aWNlLCB2Y3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHZpbm9fbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcHJpbnRrKEtFUk5fSU5GTyAiU0dJIFZJTk8gZHJpdmVyIHZlcnNpb24gJXNcbiIsCisJICAgICAgIFZJTk9fTU9EVUxFX1ZFUlNJT04pOworCisJcmV0ID0gdmlub19wcm9iZSgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB2aW5vX2luaXQoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogaW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMgKi8KKworCXNwaW5fbG9ja19pbml0KCZ2aW5vX2RydmRhdGEtPnZpbm9fbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlyZXQgPSB2aW5vX2luaXRfY2hhbm5lbF9zZXR0aW5ncygmdmlub19kcnZkYXRhLT5hLCBWSU5PX0NIQU5ORUxfQSwKKwkJCQkgICAgdmlub192NGxfZGV2aWNlX25hbWVfYSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHZpbm9faW5pdF9jaGFubmVsX3NldHRpbmdzKCZ2aW5vX2RydmRhdGEtPmIsIFZJTk9fQ0hBTk5FTF9CLAorCQkJCSAgICB2aW5vX3Y0bF9kZXZpY2VfbmFtZV9iKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogaW5pdGlhbGl6ZSBoYXJkd2FyZSBhbmQgcmVnaXN0ZXIgVjRMIGRldmljZXMgKi8KKworCXJldCA9IHJlcXVlc3RfaXJxKFNHSV9WSU5PX0lSUSwgdmlub19pbnRlcnJ1cHQsIDAsCisJCXZpbm9fZHJpdmVyX2Rlc2NyaXB0aW9uLCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklOTzogcmVxdWVzdGluZyBJUlEgJTAyZCBmYWlsZWRcbiIsCisJCSAgICAgICBTR0lfVklOT19JUlEpOworCQl2aW5vX21vZHVsZV9jbGVhbnVwKHZpbm9faW5pdF9zdGFnZSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwl2aW5vX2luaXRfc3RhZ2UrKzsKKworCXJldCA9IHZpbm9faTJjX2FkZF9idXMoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklOTyBJMkMgYnVzIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQl2aW5vX21vZHVsZV9jbGVhbnVwKHZpbm9faW5pdF9zdGFnZSk7CisJCXJldHVybiByZXQ7CisJfQorCXZpbm9faW5pdF9zdGFnZSsrOworCisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZpbm9fZHJ2ZGF0YS0+YS52NGxfZGV2aWNlLAorCQkJCSAgICBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU5PIGNoYW5uZWwgQSBWaWRlbzRMaW51eC1kZXZpY2UgIgorCQkgICAgICAgInJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQl2aW5vX21vZHVsZV9jbGVhbnVwKHZpbm9faW5pdF9zdGFnZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl2aW5vX2luaXRfc3RhZ2UrKzsKKworCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSh2aW5vX2RydmRhdGEtPmIudjRsX2RldmljZSwKKwkJCQkgICAgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklOTyBjaGFubmVsIEIgVmlkZW80TGludXgtZGV2aWNlICIKKwkJICAgICAgICJyZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJdmlub19tb2R1bGVfY2xlYW51cCh2aW5vX2luaXRfc3RhZ2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdmlub19pbml0X3N0YWdlKys7CisKKyNpZiBkZWZpbmVkKENPTkZJR19LTU9EKSAmJiBkZWZpbmVkKE1PRFVMRSkKKwlyZXF1ZXN0X21vZHVsZSgic2FhNzE5MSIpOworCXJlcXVlc3RfbW9kdWxlKCJpbmR5Y2FtIik7CisjZW5kaWYKKworCWRwcmludGsoImluaXQgY29tcGxldGUhXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdmlub19tb2R1bGVfZXhpdCh2b2lkKQoreworCWRwcmludGsoImV4aXRpbmcsIHN0YWdlID0gJWQgLi4uXG4iLCB2aW5vX2luaXRfc3RhZ2UpOworCXZpbm9fbW9kdWxlX2NsZWFudXAodmlub19pbml0X3N0YWdlKTsKKwlkcHJpbnRrKCJjbGVhbnVwIGNvbXBsZXRlLCBleGl0IVxuIik7Cit9CisKK21vZHVsZV9pbml0KHZpbm9fbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQodmlub19tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5oCmluZGV4IGQyZmNlNDcuLmRlMmQ2MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5oCkBAIC0xLDEzICsxLDE5IEBACiAvKgorICogRHJpdmVyIGZvciB0aGUgVklOTyAoVmlkZW8gSW4gTm8gT3V0KSBzeXN0ZW0gZm91bmQgaW4gU0dJIEluZHlzLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgVWxmIEthcmxzc29uIDx1bGZjQGJ1bi5mYWxrZW5iZXJnLnNlPgogICogQ29weXJpZ2h0IChDKSAyMDAzIExhZGlzbGF2IE1pY2hsIDxsYWRpc0BsaW51eC1taXBzLm9yZz4KICAqLwogCi0jaWZuZGVmIFZJTk9fSAotI2RlZmluZSBWSU5PX0gKKyNpZm5kZWYgX1ZJTk9fSF8KKyNkZWZpbmUgX1ZJTk9fSF8KIAogI2RlZmluZSBWSU5PX0JBU0UJMHgwMDA4MDAwMAkvKiBWaW5vIGlzIGluIHRoZSBFSVNBIGFkZHJlc3Mgc3BhY2UsCiAJCQkJCSAqIGJ1dCBpdCBpcyBub3QgYW4gRUlTQSBidXMgY2FyZCAqLworI2RlZmluZSBWSU5PX1BBR0VfU0laRQk0MDk2CiAKIHN0cnVjdCBzZ2lfdmlub19jaGFubmVsIHsKIAl1MzIgX3BhZF9hbHBoYTsKQEAgLTIxLDggKzI3LDkgQEAKIAl1MzIgX3BhZF9jbGlwX2VuZDsKIAl2b2xhdGlsZSB1MzIgY2xpcF9lbmQ7CiAKKyNkZWZpbmUgVklOT19GUkFNRVJUX0ZVTEwJMHhmZmYKICNkZWZpbmUgVklOT19GUkFNRVJUX1BBTAkoMTw8MCkJCQkvKiAwPU5UU0MgMT1QQUwgKi8KLSNkZWZpbmUgVklOT19GUkFNRVJUX1JUKHgpCSgoKHgpICYgMHgxZmZmKSA8PCAxKQkvKiBiaXRzIDE6MTIgKi8KKyNkZWZpbmUgVklOT19GUkFNRVJUX1JUKHgpCSgoKHgpICYgMHhmZmYpIDw8IDEpCS8qIGJpdHMgMToxMiAqLwogCXUzMiBfcGFkX2ZyYW1lX3JhdGU7CiAJdm9sYXRpbGUgdTMyIGZyYW1lX3JhdGU7CiAKQEAgLTY3LDE4ICs3NCwxOCBAQAogCXZvbGF0aWxlIHUzMiByZXZfaWQ7CiAKICNkZWZpbmUgVklOT19DVFJMX0xJVFRMRV9FTkRJQU4JCSgxPDwwKQotI2RlZmluZSBWSU5PX0NUUkxfQV9GSUVMRF9UUkFOU19JTlQJKDE8PDEpCS8qIEZpZWxkIHRyYW5zZmVycmVkIGludCAqLwotI2RlZmluZSBWSU5PX0NUUkxfQV9GSUZPX09GX0lOVAkJKDE8PDIpCS8qIEZJRk8gb3ZlcmZsb3cgaW50ICovCi0jZGVmaW5lIFZJTk9fQ1RSTF9BX0VORF9ERVNDX1RCTF9JTlQJKDE8PDMpCS8qIEVuZCBvZiBkZXNjIHRhYmxlIGludCAqLwotI2RlZmluZSBWSU5PX0NUUkxfQV9JTlQJCQkoVklOT19DVFJMX0FfRklFTERfVFJBTlNfSU5UIHwgXAotCQkJCQkgVklOT19DVFJMX0FfRklGT19PRl9JTlQgfCBcCi0JCQkJCSBWSU5PX0NUUkxfQV9FTkRfREVTQ19UQkxfSU5UKQotI2RlZmluZSBWSU5PX0NUUkxfQl9GSUVMRF9UUkFOU19JTlQJKDE8PDQpCS8qIEZpZWxkIHRyYW5zZmVycmVkIGludCAqLwotI2RlZmluZSBWSU5PX0NUUkxfQl9GSUZPX09GX0lOVAkJKDE8PDUpCS8qIEZJRk8gb3ZlcmZsb3cgaW50ICovCi0jZGVmaW5lIFZJTk9fQ1RSTF9CX0VORF9ERVNDX1RCTF9JTlQJKDE8PDYpCS8qIEVuZCBvZiBkZXNjIHRhYmxlIGludCAqLwotI2RlZmluZSBWSU5PX0NUUkxfQl9JTlQJCQkoVklOT19DVFJMX0JfRklFTERfVFJBTlNfSU5UIHwgXAotCQkJCQkgVklOT19DVFJMX0JfRklGT19PRl9JTlQgfCBcCi0JCQkJCSBWSU5PX0NUUkxfQl9FTkRfREVTQ19UQkxfSU5UKQorI2RlZmluZSBWSU5PX0NUUkxfQV9FT0ZfSU5UCQkoMTw8MSkJLyogRmllbGQgdHJhbnNmZXJyZWQgaW50ICovCisjZGVmaW5lIFZJTk9fQ1RSTF9BX0ZJRk9fSU5UCQkoMTw8MikJLyogRklGTyBvdmVyZmxvdyBpbnQgKi8KKyNkZWZpbmUgVklOT19DVFJMX0FfRU9EX0lOVAkJKDE8PDMpCS8qIEVuZCBvZiBkZXNjIHRhYmxlIGludCAqLworI2RlZmluZSBWSU5PX0NUUkxfQV9JTlQJCQkoVklOT19DVFJMX0FfRU9GX0lOVCB8IFwKKwkJCQkJIFZJTk9fQ1RSTF9BX0ZJRk9fSU5UIHwgXAorCQkJCQkgVklOT19DVFJMX0FfRU9EX0lOVCkKKyNkZWZpbmUgVklOT19DVFJMX0JfRU9GX0lOVAkJKDE8PDQpCS8qIEZpZWxkIHRyYW5zZmVycmVkIGludCAqLworI2RlZmluZSBWSU5PX0NUUkxfQl9GSUZPX0lOVAkJKDE8PDUpCS8qIEZJRk8gb3ZlcmZsb3cgaW50ICovCisjZGVmaW5lIFZJTk9fQ1RSTF9CX0VPRF9JTlQJCSgxPDw2KQkvKiBFbmQgb2YgZGVzYyB0YWJsZSBpbnQgKi8KKyNkZWZpbmUgVklOT19DVFJMX0JfSU5UCQkJKFZJTk9fQ1RSTF9CX0VPRl9JTlQgfCBcCisJCQkJCSBWSU5PX0NUUkxfQl9GSUZPX0lOVCB8IFwKKwkJCQkJIFZJTk9fQ1RSTF9CX0VPRF9JTlQpCiAjZGVmaW5lIFZJTk9fQ1RSTF9BX0RNQV9FTkJMCQkoMTw8NykKICNkZWZpbmUgVklOT19DVFJMX0FfSU5URVJMRUFWRV9FTkJMCSgxPDw4KQogI2RlZmluZSBWSU5PX0NUUkxfQV9TWU5DX0VOQkwJCSgxPDw5KQpAQCAtMTA0LDE4ICsxMTEsMTggQEAKIAl1MzIgX3BhZF9jb250cm9sOwogCXZvbGF0aWxlIHUzMiBjb250cm9sOwogCi0jZGVmaW5lIFZJTk9fSU5UU1RBVF9BX0ZJRUxEX1RSQU5TCSgxPDwwKQkvKiBGaWVsZCB0cmFuc2ZlcnJlZCBpbnQgKi8KLSNkZWZpbmUgVklOT19JTlRTVEFUX0FfRklGT19PRgkJKDE8PDEpCS8qIEZJRk8gb3ZlcmZsb3cgaW50ICovCi0jZGVmaW5lIFZJTk9fSU5UU1RBVF9BX0VORF9ERVNDX1RCTAkoMTw8MikJLyogRW5kIG9mIGRlc2MgdGFibGUgaW50ICovCi0jZGVmaW5lIFZJTk9fSU5UU1RBVF9BCQkJKFZJTk9fSU5UU1RBVF9BX0ZJRUxEX1RSQU5TIHwgXAotCQkJCQkgVklOT19JTlRTVEFUX0FfRklGT19PRiB8IFwKLQkJCQkJIFZJTk9fSU5UU1RBVF9BX0VORF9ERVNDX1RCTCkKLSNkZWZpbmUgVklOT19JTlRTVEFUX0JfRklFTERfVFJBTlMJKDE8PDMpCS8qIEZpZWxkIHRyYW5zZmVycmVkIGludCAqLwotI2RlZmluZSBWSU5PX0lOVFNUQVRfQl9GSUZPX09GCQkoMTw8NCkJLyogRklGTyBvdmVyZmxvdyBpbnQgKi8KLSNkZWZpbmUgVklOT19JTlRTVEFUX0JfRU5EX0RFU0NfVEJMCSgxPDw1KQkvKiBFbmQgb2YgZGVzYyB0YWJsZSBpbnQgKi8KLSNkZWZpbmUgVklOT19JTlRTVEFUX0IJCQkoVklOT19JTlRTVEFUX0JfRklFTERfVFJBTlMgfCBcCi0JCQkJCSBWSU5PX0lOVFNUQVRfQl9GSUZPX09GIHwgXAotCQkJCQkgVklOT19JTlRTVEFUX0JfRU5EX0RFU0NfVEJMKQorI2RlZmluZSBWSU5PX0lOVFNUQVRfQV9FT0YJCSgxPDwwKQkvKiBGaWVsZCB0cmFuc2ZlcnJlZCBpbnQgKi8KKyNkZWZpbmUgVklOT19JTlRTVEFUX0FfRklGTwkJKDE8PDEpCS8qIEZJRk8gb3ZlcmZsb3cgaW50ICovCisjZGVmaW5lIFZJTk9fSU5UU1RBVF9BX0VPRAkJKDE8PDIpCS8qIEVuZCBvZiBkZXNjIHRhYmxlIGludCAqLworI2RlZmluZSBWSU5PX0lOVFNUQVRfQQkJCShWSU5PX0lOVFNUQVRfQV9FT0YgfCBcCisJCQkJCSBWSU5PX0lOVFNUQVRfQV9GSUZPIHwgXAorCQkJCQkgVklOT19JTlRTVEFUX0FfRU9EKQorI2RlZmluZSBWSU5PX0lOVFNUQVRfQl9FT0YJCSgxPDwzKQkvKiBGaWVsZCB0cmFuc2ZlcnJlZCBpbnQgKi8KKyNkZWZpbmUgVklOT19JTlRTVEFUX0JfRklGTwkJKDE8PDQpCS8qIEZJRk8gb3ZlcmZsb3cgaW50ICovCisjZGVmaW5lIFZJTk9fSU5UU1RBVF9CX0VPRAkJKDE8PDUpCS8qIEVuZCBvZiBkZXNjIHRhYmxlIGludCAqLworI2RlZmluZSBWSU5PX0lOVFNUQVRfQgkJCShWSU5PX0lOVFNUQVRfQl9FT0YgfCBcCisJCQkJCSBWSU5PX0lOVFNUQVRfQl9GSUZPIHwgXAorCQkJCQkgVklOT19JTlRTVEFUX0JfRU9EKQogCXUzMiBfcGFkX2ludHJfc3RhdHVzOwogCXZvbGF0aWxlIHUzMiBpbnRyX3N0YXR1czsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZweDMyMjAuYwppbmRleCA1ZGJkOWY2Li40NDM3YmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZweDMyMjAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZweDMyMjAuYwpAQCAtNTc2LDcgKzU3Niw2IEBACiAJLm5vcm1hbF9pMmMJCT0gbm9ybWFsX2kyYywKIAkucHJvYmUJCQk9ICZpZ25vcmUsCiAJLmlnbm9yZQkJCT0gJmlnbm9yZSwKLQkuZm9yY2UJCQk9ICZpZ25vcmUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdnB4MzIyMF9pMmNfZHJpdmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2NhcmQuYwppbmRleCAyNTc0MzA4Li5lZWQyYWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2NhcmQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2NhcmQuYwpAQCAtNzM3LDcgKzczNyw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHpvcmFuX2kyY19hZGFwdGVyX3RlbXBsYXRlID0gewotCUkyQ19ERVZOQU1FKCJ6cjM2MDU3IiksCisJLm5hbWUgPSAienIzNjA1NyIsCiAJLmlkID0gSTJDX0hXX0JfWlIzNjA2NywKIAkuYWxnbyA9IE5VTEwsCiAJLmNsaWVudF9yZWdpc3RlciA9IHpvcmFuX2kyY19jbGllbnRfcmVnaXN0ZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kcml2ZXIuYwppbmRleCBiYTgzOGE0Li41M2FkZWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZHJpdmVyLmMKQEAgLTY1MCw3ICs2NTAsNyBAQAogCQkJCSAgICAgb2ZmICs9IFBBR0VfU0laRSkKIAkJCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQoTUFQX05SCiAJCQkJCQkJICAobWVtICsgb2ZmKSk7Ci0JCQkJa2ZyZWUoKHZvaWQgKikgbWVtKTsKKwkJCQlrZnJlZShtZW0pOwogCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMF0gPSAwOwogCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMV0gPSAwOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MTIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuYwppbmRleCBjMzM1MzMxLi4wNzI4NjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuYwpAQCAtODIwLDExICs4MjAsOSBAQAogICAgICAgICBtc2xlZXAoMTAwKTsJCQkvKiBXYWl0IDEvMTB0aCBvZiBhIHNlY29uZCAqLwogCiAJLyogZnJlZSB0aGUgYWxsb2NhdGVkIGZyYW1lYnVmZmVyICovCi0JaWYgKHp0di0+ZmJ1ZmZlcikKLQkJYmZyZWUoIHp0di0+ZmJ1ZmZlciwgWk9SQU5fTUFYX0ZCVUZTSVpFICk7CisJYmZyZWUoenR2LT5mYnVmZmVyLCBaT1JBTl9NQVhfRkJVRlNJWkUpOwogCXp0di0+ZmJ1ZmZlciA9IDA7Ci0JaWYgKHp0di0+b3ZlcmluZm8ub3ZlcmxheSkKLQkJa2ZyZWUoIHp0di0+b3ZlcmluZm8ub3ZlcmxheSApOworCWtmcmVlKHp0di0+b3ZlcmluZm8ub3ZlcmxheSk7CiAJenR2LT5vdmVyaW5mby5vdmVybGF5ID0gMDsKIAogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGkuaAppbmRleCA5Zjk4MzM0Li5iNjFlM2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGkuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGkuaApAQCAtNiw3ICs2LDcgQEAKICAqICAgICAgICAgIFRpdGxlOiAgTVBJIE1lc3NhZ2UgaW5kZXBlbmRlbnQgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKICAqICBDcmVhdGlvbiBEYXRlOiAgSnVseSAyNywgMjAwMAogICoKLSAqICAgIG1waS5oIFZlcnNpb246ICAwMS4wNS4wNworICogICAgbXBpLmggVmVyc2lvbjogIDAxLjA1LjA4CiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtNzEsNiArNzEsOSBAQAogICogIDAzLTExLTA1ICAwMS4wNS4wNyAgUmVtb3ZlZCBmdW5jdGlvbiBjb2RlcyBmb3IgU0NTSSBJTyAzMiBhbmQKICAqICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEFzc2lzdEV4dGVuZGVkIHJlcXVlc3RzLgogICogICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlZCBFRURQIElPQ1N0YXR1cyBjb2Rlcy4KKyAqICAwNi0yNC0wNSAgMDEuMDUuMDggIEFkZGVkIGZ1bmN0aW9uIGNvZGVzIGZvciBTQ1NJIElPIDMyIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0QXNzaXN0RXh0ZW5kZWQgcmVxdWVzdHMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBFRURQIElPQ1N0YXR1cyBjb2Rlcy4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTEwMSw3ICsxMDQsNyBAQAogLyogTm90ZTogVGhlIG1ham9yIHZlcnNpb25zIG9mIDB4ZTAgdGhyb3VnaCAweGZmIGFyZSByZXNlcnZlZCAqLwogCiAvKiB2ZXJzaW9uaW5nIGZvciB0aGlzIE1QSSBoZWFkZXIgc2V0ICovCi0jZGVmaW5lIE1QSV9IRUFERVJfVkVSU0lPTl9VTklUICAgICAgICAgICAgICgweDA5KQorI2RlZmluZSBNUElfSEVBREVSX1ZFUlNJT05fVU5JVCAgICAgICAgICAgICAoMHgwQSkKICNkZWZpbmUgTVBJX0hFQURFUl9WRVJTSU9OX0RFViAgICAgICAgICAgICAgKDB4MDApCiAjZGVmaW5lIE1QSV9IRUFERVJfVkVSU0lPTl9VTklUX01BU0sgICAgICAgICgweEZGMDApCiAjZGVmaW5lIE1QSV9IRUFERVJfVkVSU0lPTl9VTklUX1NISUZUICAgICAgICg4KQpAQCAtMjkyLDEwICsyOTUsMTMgQEAKICNkZWZpbmUgTVBJX0ZVTkNUSU9OX0RJQUdfQlVGRkVSX1BPU1QgICAgICAgICAgICAgICAoMHgxRCkKICNkZWZpbmUgTVBJX0ZVTkNUSU9OX0RJQUdfUkVMRUFTRSAgICAgICAgICAgICAgICAgICAoMHgxRSkKIAorI2RlZmluZSBNUElfRlVOQ1RJT05fU0NTSV9JT18zMiAgICAgICAgICAgICAgICAgICAgICgweDFGKQorCiAjZGVmaW5lIE1QSV9GVU5DVElPTl9MQU5fU0VORCAgICAgICAgICAgICAgICAgICAgICAgKDB4MjApCiAjZGVmaW5lIE1QSV9GVU5DVElPTl9MQU5fUkVDRUlWRSAgICAgICAgICAgICAgICAgICAgKDB4MjEpCiAjZGVmaW5lIE1QSV9GVU5DVElPTl9MQU5fUkVTRVQgICAgICAgICAgICAgICAgICAgICAgKDB4MjIpCiAKKyNkZWZpbmUgTVBJX0ZVTkNUSU9OX1RBUkdFVF9BU1NJU1RfRVhURU5ERUQgICAgICAgICAoMHgyMykKICNkZWZpbmUgTVBJX0ZVTkNUSU9OX1RBUkdFVF9DTURfQlVGX0JBU0VfUE9TVCAgICAgICAoMHgyNCkKICNkZWZpbmUgTVBJX0ZVTkNUSU9OX1RBUkdFVF9DTURfQlVGX0xJU1RfUE9TVCAgICAgICAoMHgyNSkKIApAQCAtNjgxLDYgKzY4NywxNSBAQAogI2RlZmluZSBNUElfSU9DU1RBVFVTX1NDU0lfRVhUX1RFUk1JTkFURUQgICAgICAgKDB4MDA0QykKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRm9yIHVzZSBieSBTQ1NJIEluaXRpYXRvciBhbmQgU0NTSSBUYXJnZXQgZW5kLXRvLWVuZCBkYXRhIHByb3RlY3Rpb24gICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfRUVEUF9HVUFSRF9FUlJPUiAgICAgICAgICAoMHgwMDREKQorI2RlZmluZSBNUElfSU9DU1RBVFVTX0VFRFBfUkVGX1RBR19FUlJPUiAgICAgICAgKDB4MDA0RSkKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19FRURQX0FQUF9UQUdfRVJST1IgICAgICAgICgweDAwNEYpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgU0NTSSBUYXJnZXQgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfY25mZy5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2NuZmcuaAppbmRleCAxNWIxMmIwLi5kODMzOTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfY25mZy5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9jbmZnLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBDb25maWcgbWVzc2FnZSwgc3RydWN0dXJlcywgYW5kIFBhZ2VzCiAgKiAgQ3JlYXRpb24gRGF0ZTogIEp1bHkgMjcsIDIwMDAKICAqCi0gKiAgICBtcGlfY25mZy5oIFZlcnNpb246ICAwMS4wNS4wOAorICogICAgbXBpX2NuZmcuaCBWZXJzaW9uOiAgMDEuMDUuMDkKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC0yMzIsNiArMjMyLDIzIEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBOZXcgcGh5c2ljYWwgbWFwcGluZyBtb2RlIGluIFNBUyBJTyBVbml0IFBhZ2UgMi4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIENPTkZJR19QQUdFX1NBU19FTkNMT1NVUkVfMC4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFNsb3QgYW5kIEVuY2xvc3VyZSBmaWVsZHMgdG8gU0FTIERldmljZSBQYWdlIDAuCisgKiAgMDYtMjQtMDUgIDAxLjA1LjA5ICBBZGRlZCBFRURQIGRlZmluZXMgdG8gSU9DIFBhZ2UgMS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG1vcmUgUkFJRCB0eXBlIGRlZmluZXMgdG8gSU9DIFBhZ2UgMi4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFBvcnQgRW5hYmxlIERlbGF5IHNldHRpbmdzIHRvIEJJT1MgUGFnZSAxLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgQmFkIEJsb2NrIFRhYmxlIEZ1bGwgZGVmaW5lIHRvIFJBSUQgVm9sdW1lIFBhZ2UgMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFByZXZpb3VzIFN0YXRlIGRlZmluZXMgdG8gUkFJRCBQaHlzaWNhbCBEaXNrCisgKiAgICAgICAgICAgICAgICAgICAgICBQYWdlIDAuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNYXggU2F0YSBUYXJnZXRzIGRlZmluZSBmb3IgRGlzY292ZXJ5U3RhdHVzIGZpZWxkCisgKiAgICAgICAgICAgICAgICAgICAgICBvZiBTQVMgSU8gVW5pdCBQYWdlIDAuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBEZXZpY2UgU2VsZiBUZXN0IHRvIENvbnRyb2wgRmxhZ3Mgb2YgU0FTIElPIFVuaXQKKyAqICAgICAgICAgICAgICAgICAgICAgIFBhZ2UgMS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIERpcmVjdCBBdHRhY2ggU3RhcnRpbmcgU2xvdCBOdW1iZXIgZGVmaW5lIGZvciBTQVMKKyAqICAgICAgICAgICAgICAgICAgICAgIElPIFVuaXQgUGFnZSAyLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbmV3IGZpZWxkcyBpbiBTQVMgRGV2aWNlIFBhZ2UgMiBmb3IgZW5jbG9zdXJlCisgKiAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgT3duZXJEZXZIYW5kbGUgYW5kIEZsYWdzIGZpZWxkIHRvIFNBUyBQSFkgUGFnZSAwLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgSU9DIEdQSU8gRmxhZ3MgZGVmaW5lIHRvIFNBUyBFbmNsb3N1cmUgUGFnZSAwLgorICogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgdGhlIHZhbHVlIGZvciBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZfU0FUQV9TVVBQT1JULgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtNDc3LDYgKzQ5NCw3IEBACiAjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSUNFSURfRkM5MjlYICAgICAgICAgICAgKDB4MDYyNikKICNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJQ0VJRF9GQzkzOVggICAgICAgICAgICAoMHgwNjQyKQogI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklDRUlEX0ZDOTQ5WCAgICAgICAgICAgICgweDA2NDApCisjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSUNFSURfRkM5NDlFUyAgICAgICAgICAgKDB4MDY0NikKIC8qIFNDU0kgKi8KICNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJRF81M0MxMDMwICAgICAgICAgICAgICAoMHgwMDMwKQogI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklEXzUzQzEwMzBaQyAgICAgICAgICAgICgweDAwMzEpCkBAIC03NjksOSArNzg3LDEzIEBACiB9IENPTkZJR19QQUdFX0lPQ18xLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfSU9DXzEsCiAgIElPQ1BhZ2UxX3QsIE1QSV9QT0lOVEVSIHBJT0NQYWdlMV90OwogCi0jZGVmaW5lIE1QSV9JT0NQQUdFMV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfSU9DUEFHRTFfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAoMHgwMykKIAogLyogZGVmaW5lcyBmb3IgdGhlIEZsYWdzIGZpZWxkICovCisjZGVmaW5lIE1QSV9JT0NQQUdFMV9FRURQX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgICgweDA3MDAwMDAwKQorI2RlZmluZSBNUElfSU9DUEFHRTFfRUVEUF9NT0RFX09GRiAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTVBJX0lPQ1BBR0UxX0VFRFBfTU9ERV9UMTAgICAgICAgICAgICAgICAgICAgICAgKDB4MDEwMDAwMDApCisjZGVmaW5lIE1QSV9JT0NQQUdFMV9FRURQX01PREVfTFNJXzEgICAgICAgICAgICAgICAgICAgICgweDAyMDAwMDAwKQogI2RlZmluZSBNUElfSU9DUEFHRTFfSU5JVElBVE9SX0NPTlRFWFRfUkVQTFlfRElTQUJMRSAgICAoMHgwMDAwMDAxMCkKICNkZWZpbmUgTVBJX0lPQ1BBR0UxX1JFUExZX0NPQUxFU0NJTkcgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCiAKQEAgLTc5NSw2ICs4MTcsMTEgQEAKICNkZWZpbmUgTVBJX1JBSURfVk9MX1RZUEVfSVMgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKICNkZWZpbmUgTVBJX1JBSURfVk9MX1RZUEVfSU1FICAgICAgICAgICAgICAgICAgICAgICAoMHgwMSkKICNkZWZpbmUgTVBJX1JBSURfVk9MX1RZUEVfSU0gICAgICAgICAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1JBSURfVk9MX1RZUEVfUkFJRF81ICAgICAgICAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX1JBSURfVk9MX1RZUEVfUkFJRF82ICAgICAgICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1JBSURfVk9MX1RZUEVfUkFJRF8xMCAgICAgICAgICAgICAgICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJX1JBSURfVk9MX1RZUEVfUkFJRF81MCAgICAgICAgICAgICAgICAgICAoMHgwNikKKyNkZWZpbmUgTVBJX1JBSURfVk9MX1RZUEVfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAoMHhGRikKIAogLyogSU9DIFBhZ2UgMiBWb2x1bWUgRmxhZ3MgdmFsdWVzICovCiAKQEAgLTgyMCwxMyArODQ3LDE3IEBACiB9IENPTkZJR19QQUdFX0lPQ18yLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfSU9DXzIsCiAgIElPQ1BhZ2UyX3QsIE1QSV9QT0lOVEVSIHBJT0NQYWdlMl90OwogCi0jZGVmaW5lIE1QSV9JT0NQQUdFMl9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfSU9DUEFHRTJfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAoMHgwMykKIAogLyogSU9DIFBhZ2UgMiBDYXBhYmlsaXRpZXMgZmxhZ3MgKi8KIAogI2RlZmluZSBNUElfSU9DUEFHRTJfQ0FQX0ZMQUdTX0lTX1NVUFBPUlQgICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKICNkZWZpbmUgTVBJX0lPQ1BBR0UyX0NBUF9GTEFHU19JTUVfU1VQUE9SVCAgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCiAjZGVmaW5lIE1QSV9JT0NQQUdFMl9DQVBfRkxBR1NfSU1fU1VQUE9SVCAgICAgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNUElfSU9DUEFHRTJfQ0FQX0ZMQUdTX1JBSURfNV9TVVBQT1JUICAgICAgICAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgTVBJX0lPQ1BBR0UyX0NBUF9GTEFHU19SQUlEXzZfU1VQUE9SVCAgICAgICAgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIE1QSV9JT0NQQUdFMl9DQVBfRkxBR1NfUkFJRF8xMF9TVVBQT1JUICAgICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBNUElfSU9DUEFHRTJfQ0FQX0ZMQUdTX1JBSURfNTBfU1VQUE9SVCAgICAgICAgICAoMHgwMDAwMDA0MCkKICNkZWZpbmUgTVBJX0lPQ1BBR0UyX0NBUF9GTEFHU19TRVNfU1VQUE9SVCAgICAgICAgICAgICAgKDB4MjAwMDAwMDApCiAjZGVmaW5lIE1QSV9JT0NQQUdFMl9DQVBfRkxBR1NfU0FGVEVfU1VQUE9SVCAgICAgICAgICAgICgweDQwMDAwMDAwKQogI2RlZmluZSBNUElfSU9DUEFHRTJfQ0FQX0ZMQUdTX0NST1NTX0NIQU5ORUxfU1VQUE9SVCAgICAoMHg4MDAwMDAwMCkKQEAgLTk0NSw3ICs5NzYsNyBAQAogfSBDT05GSUdfUEFHRV9CSU9TXzEsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9CSU9TXzEsCiAgIEJJT1NQYWdlMV90LCBNUElfUE9JTlRFUiBwQklPU1BhZ2UxX3Q7CiAKLSNkZWZpbmUgTVBJX0JJT1NQQUdFMV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICgweDAyKQogCiAvKiB2YWx1ZXMgZm9yIHRoZSBCaW9zT3B0aW9ucyBmaWVsZCAqLwogI2RlZmluZSBNUElfQklPU1BBR0UxX09QVElPTlNfU1BJX0VOQUJMRSAgICAgICAgICAgICAgICAoMHgwMDAwMDQwMCkKQEAgLTk1NCw2ICs5ODUsOCBAQAogI2RlZmluZSBNUElfQklPU1BBR0UxX09QVElPTlNfRElTQUJMRV9CSU9TICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKIAogLyogdmFsdWVzIGZvciB0aGUgSU9DU2V0dGluZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfTUFTS19QT1JUX0VOQUJMRV9ERUxBWSAgICAgKDB4MDBGMDAwMDApCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX1NISUZUX1BPUlRfRU5BQkxFX0RFTEFZICAgICgyMCkKICNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfTUFTS19CT09UX1BSRUZFUkVOQ0UgICAgICAgKDB4MDAwMzAwMDApCiAjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX0VOQ0xPU1VSRV9TTE9UX0JPT1QgICAgICAgICgweDAwMDAwMDAwKQogI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9TQVNfQUREUkVTU19CT09UICAgICAgICAgICAoMHgwMDAxMDAwMCkKQEAgLTExNjcsNiArMTIwMCw3IEBACiAjZGVmaW5lIE1QSV9CSU9TUEFHRTJfRk9STV9QQ0lfU0xPVF9OVU1CRVIgICAgICAgICAgICAgICgweDAzKQogI2RlZmluZSBNUElfQklPU1BBR0UyX0ZPUk1fRkNfV1dOICAgICAgICAgICAgICAgICAgICAgICAoMHgwNCkKICNkZWZpbmUgTVBJX0JJT1NQQUdFMl9GT1JNX1NBU19XV04gICAgICAgICAgICAgICAgICAgICAgKDB4MDUpCisjZGVmaW5lIE1QSV9CSU9TUEFHRTJfRk9STV9FTkNMT1NVUkVfU0xPVCAgICAgICAgICAgICAgICgweDA2KQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xOTU3LDExICsxOTkxLDExIEBACiAgIFJhaWRWb2wwU3RhdHVzX3QsIE1QSV9QT0lOVEVSIHBSYWlkVm9sMFN0YXR1c190OwogCiAvKiBSQUlEIFZvbHVtZSBQYWdlIDAgVm9sdW1lU3RhdHVzIGRlZmluZXMgKi8KLQogI2RlZmluZSBNUElfUkFJRFZPTDBfU1RBVFVTX0ZMQUdfRU5BQkxFRCAgICAgICAgICAgICAgICAoMHgwMSkKICNkZWZpbmUgTVBJX1JBSURWT0wwX1NUQVRVU19GTEFHX1FVSUVTQ0VEICAgICAgICAgICAgICAgKDB4MDIpCiAjZGVmaW5lIE1QSV9SQUlEVk9MMF9TVEFUVVNfRkxBR19SRVNZTkNfSU5fUFJPR1JFU1MgICAgICgweDA0KQogI2RlZmluZSBNUElfUkFJRFZPTDBfU1RBVFVTX0ZMQUdfVk9MVU1FX0lOQUNUSVZFICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX1JBSURWT0wwX1NUQVRVU19GTEFHX0JBRF9CTE9DS19UQUJMRV9GVUxMICAgKDB4MTApCiAKICNkZWZpbmUgTVBJX1JBSURWT0wwX1NUQVRVU19TVEFURV9PUFRJTUFMICAgICAgICAgICAgICAgKDB4MDApCiAjZGVmaW5lIE1QSV9SQUlEVk9MMF9TVEFUVVNfU1RBVEVfREVHUkFERUQgICAgICAgICAgICAgICgweDAxKQpAQCAtMjAyNSw3ICsyMDU5LDcgQEAKIH0gQ09ORklHX1BBR0VfUkFJRF9WT0xfMCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX1JBSURfVk9MXzAsCiAgIFJhaWRWb2x1bWVQYWdlMF90LCBNUElfUE9JTlRFUiBwUmFpZFZvbHVtZVBhZ2UwX3Q7CiAKLSNkZWZpbmUgTVBJX1JBSURWT0xQQUdFMF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9SQUlEVk9MUEFHRTBfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICgweDA1KQogCiAvKiB2YWx1ZXMgZm9yIFJBSUQgVm9sdW1lIFBhZ2UgMCBJbmFjdGl2ZVN0YXR1cyBmaWVsZCAqLwogI2RlZmluZSBNUElfUkFJRFZPTFBBR0UwX1VOS05PV05fSU5BQ1RJVkUgICAgICAgICAgICAgICAoMHgwMCkKQEAgLTIxMDQsNiArMjEzOCw4IEBACiAjZGVmaW5lIE1QSV9QSFlTRElTSzBfU1RBVFVTX0ZMQUdfT1VUX09GX1NZTkMgICAgICAgICAgICgweDAxKQogI2RlZmluZSBNUElfUEhZU0RJU0swX1NUQVRVU19GTEFHX1FVSUVTQ0VEICAgICAgICAgICAgICAoMHgwMikKICNkZWZpbmUgTVBJX1BIWVNESVNLMF9TVEFUVVNfRkxBR19JTkFDVElWRV9WT0xVTUUgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9QSFlTRElTSzBfU1RBVFVTX0ZMQUdfT1BUSU1BTF9QUkVWSU9VUyAgICAgICgweDAwKQorI2RlZmluZSBNUElfUEhZU0RJU0swX1NUQVRVU19GTEFHX05PVF9PUFRJTUFMX1BSRVZJT1VTICAoMHgwOCkKIAogI2RlZmluZSBNUElfUEhZU0RJU0swX1NUQVRVU19PTkxJTkUgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKICNkZWZpbmUgTVBJX1BIWVNESVNLMF9TVEFUVVNfTUlTU0lORyAgICAgICAgICAgICAgICAgICAgKDB4MDEpCkBAIC0yMTMyLDcgKzIxNjgsNyBAQAogfSBDT05GSUdfUEFHRV9SQUlEX1BIWVNfRElTS18wLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfUkFJRF9QSFlTX0RJU0tfMCwKICAgUmFpZFBoeXNEaXNrUGFnZTBfdCwgTVBJX1BPSU5URVIgcFJhaWRQaHlzRGlza1BhZ2UwX3Q7CiAKLSNkZWZpbmUgTVBJX1JBSURQSFlTRElTS1BBR0UwX1BBR0VWRVJTSU9OICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX1JBSURQSFlTRElTS1BBR0UwX1BBR0VWRVJTSU9OICAgICAgICAgICAoMHgwMikKIAogCiB0eXBlZGVmIHN0cnVjdCBfUkFJRF9QSFlTX0RJU0sxX1BBVEgKQEAgLTIyNjMsNyArMjI5OSw3IEBACiB9IENPTkZJR19QQUdFX1NBU19JT19VTklUXzAsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQVNfSU9fVU5JVF8wLAogICBTYXNJT1VuaXRQYWdlMF90LCBNUElfUE9JTlRFUiBwU2FzSU9Vbml0UGFnZTBfdDsKIAotI2RlZmluZSBNUElfU0FTSU9VTklUUEFHRTBfUEFHRVZFUlNJT04gICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1NBU0lPVU5JVFBBR0UwX1BBR0VWRVJTSU9OICAgICAgKDB4MDMpCiAKIC8qIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAwIFBvcnRGbGFncyAqLwogI2RlZmluZSBNUElfU0FTX0lPVU5JVDBfUE9SVF9GTEFHU19ESVNDT1ZFUllfSU5fUFJPR1JFU1MgICAgKDB4MDgpCkBAIC0yMjk5LDYgKzIzMzUsNyBAQAogI2RlZmluZSBNUElfU0FTX0lPVU5JVDBfRFNfU1VCVFJBQ1RJVkVfTElOSyAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMF9EU19UQUJMRV9MSU5LICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDQwMCkKICNkZWZpbmUgTVBJX1NBU19JT1VOSVQwX0RTX1VOU1VQUE9SVEVEX0RFVklDRSAgICAgICAgICAgICAgICgweDAwMDAwODAwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDBfRFNfTUFYX1NBVEFfVEFSR0VUUyAgICAgICAgICAgICAgICAgKDB4MDAwMDEwMDApCiAKIAogdHlwZWRlZiBzdHJ1Y3QgX01QSV9TQVNfSU9fVU5JVDFfUEhZX0RBVEEKQEAgLTIzMzYsNiArMjM3Myw3IEBACiAjZGVmaW5lIE1QSV9TQVNJT1VOSVRQQUdFMV9QQUdFVkVSU0lPTiAgICAgICgweDA0KQogCiAvKiB2YWx1ZXMgZm9yIFNBUyBJTyBVbml0IFBhZ2UgMSBDb250cm9sRmxhZ3MgKi8KKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfREVWSUNFX1NFTEZfVEVTVCAgICAgICAgKDB4ODAwMCkKICNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV8zXzBfTUFYICAgICAgICAgICAgKDB4NDAwMCkKICNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV8xXzVfTUFYICAgICAgICAgICAgKDB4MjAwMCkKICNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV9TV19QUkVTRVJWRSAgICAgICAgKDB4MTAwMCkKQEAgLTIzNDUsOSArMjM4Myw4IEBACiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NISUZUX0RFVl9TVVBQT1JUICAgICAgICg5KQogI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZfU1VQUE9SVF9CT1RIICAgICAgICAoMHgwMCkKICNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfREVWX1NBU19TVVBQT1JUICAgICAgICAgKDB4MDEpCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0RFVl9TQVRBX1NVUFBPUlQgICAgICAgICgweDEwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZfU0FUQV9TVVBQT1JUICAgICAgICAoMHgwMikKIAotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9BVVRPX1BPUlRfU0FNRV9TQVNfQUREUiAoMHgwMTAwKQogI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBXzQ4QklUX0xCQV9SRVFVSVJFRCAoMHgwMDgwKQogI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBX1NNQVJUX1JFUVVJUkVEICAgICAoMHgwMDQwKQogI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBX05DUV9SRVFVSVJFRCAgICAgICAoMHgwMDIwKQpAQCAtMjM5MCw3ICsyNDI3LDcgQEAKIH0gQ09ORklHX1BBR0VfU0FTX0lPX1VOSVRfMiwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX1NBU19JT19VTklUXzIsCiAgIFNhc0lPVW5pdFBhZ2UyX3QsIE1QSV9QT0lOVEVSIHBTYXNJT1VuaXRQYWdlMl90OwogCi0jZGVmaW5lIE1QSV9TQVNJT1VOSVRQQUdFMl9QQUdFVkVSU0lPTiAgICAgICgweDAzKQorI2RlZmluZSBNUElfU0FTSU9VTklUUEFHRTJfUEFHRVZFUlNJT04gICAgICAoMHgwNCkKIAogLyogdmFsdWVzIGZvciBTQVMgSU8gVW5pdCBQYWdlIDIgU3RhdHVzIGZpZWxkICovCiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMl9TVEFUVVNfRElTQUJMRURfUEVSU0lTVEVOVF9NQVBQSU5HUyAoMHgwMikKQEAgLTI0MDYsNiArMjQ0Myw3IEBACiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMl9GTEFHU19FTkNMT1NVUkVfU0xPVF9QSFlTX01BUCAgICAgICAoMHgwMikKIAogI2RlZmluZSBNUElfU0FTX0lPVU5JVDJfRkxBR1NfUkVTRVJWRV9JRF8wX0ZPUl9CT09UICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMl9GTEFHU19EQV9TVEFSVElOR19TTE9UICAgICAgICAgICAgICAoMHgyMCkKIAogCiB0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfU0FTX0lPX1VOSVRfMwpAQCAtMjU4NCwxMSArMjYyMiwxOSBAQAogewogICAgIENPTkZJR19FWFRFTkRFRF9QQUdFX0hFQURFUiAgICAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgIC8qIDAwaCAqLwogICAgIFU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBoeXNpY2FsSWRlbnRpZmllcjsgICAgIC8qIDA4aCAqLwotICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIDEwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY2xvc3VyZU1hcHBpbmc7ICAgICAgIC8qIDEwaCAqLwogfSBDT05GSUdfUEFHRV9TQVNfREVWSUNFXzIsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQVNfREVWSUNFXzIsCiAgIFNhc0RldmljZVBhZ2UyX3QsIE1QSV9QT0lOVEVSIHBTYXNEZXZpY2VQYWdlMl90OwogCi0jZGVmaW5lIE1QSV9TQVNERVZJQ0UyX1BBR0VWRVJTSU9OICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0FTREVWSUNFMl9QQUdFVkVSU0lPTiAgICAgICAgICAoMHgwMSkKKworLyogZGVmaW5lcyBmb3IgU0FTIERldmljZSBQYWdlIDIgRW5jbG9zdXJlTWFwcGluZyBmaWVsZCAqLworI2RlZmluZSBNUElfU0FTREVWSUNFMl9FTkNfTUFQX01BU0tfTUlTU0lOR19DT1VOVCAgICAgICAoMHgwMDAwMDAwRikKKyNkZWZpbmUgTVBJX1NBU0RFVklDRTJfRU5DX01BUF9TSElGVF9NSVNTSU5HX0NPVU5UICAgICAgKDApCisjZGVmaW5lIE1QSV9TQVNERVZJQ0UyX0VOQ19NQVBfTUFTS19OVU1fU0xPVFMgICAgICAgICAgICgweDAwMDAwN0YwKQorI2RlZmluZSBNUElfU0FTREVWSUNFMl9FTkNfTUFQX1NISUZUX05VTV9TTE9UUyAgICAgICAgICAoNCkKKyNkZWZpbmUgTVBJX1NBU0RFVklDRTJfRU5DX01BUF9NQVNLX1NUQVJUX0lOREVYICAgICAgICAgKDB4MDAxRkY4MDApCisjZGVmaW5lIE1QSV9TQVNERVZJQ0UyX0VOQ19NQVBfU0hJRlRfU1RBUlRfSU5ERVggICAgICAgICgxMSkKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjU5OCw3ICsyNjQ0LDggQEAKIHR5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9TQVNfUEhZXzAKIHsKICAgICBDT05GSUdfRVhURU5ERURfUEFHRV9IRUFERVIgICAgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAvKiAwMGggKi8KLSAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPd25lckRldkhhbmRsZTsgICAgICAgICAvKiAwOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAvKiAwQWggKi8KICAgICBVNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQVNBZGRyZXNzOyAgICAgICAgICAgICAvKiAwQ2ggKi8KICAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2hlZERldkhhbmRsZTsgICAgICAvKiAxNGggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2hlZFBoeUlkZW50aWZpZXI7ICAvKiAxNmggKi8KQEAgLTI2MDcsMTIgKzI2NTQsMTIgQEAKICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtbWVkTGlua1JhdGU7ICAgICAvKiAyMGggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBId0xpbmtSYXRlOyAgICAgICAgICAgICAvKiAyMWggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VDb3VudDsgICAgICAgICAgICAvKiAyMmggKi8KLSAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAvKiAyM2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAvKiAyM2ggKi8KICAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaHlJbmZvOyAgICAgICAgICAgICAgICAvKiAyNGggKi8KIH0gQ09ORklHX1BBR0VfU0FTX1BIWV8wLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0FTX1BIWV8wLAogICBTYXNQaHlQYWdlMF90LCBNUElfUE9JTlRFUiBwU2FzUGh5UGFnZTBfdDsKIAotI2RlZmluZSBNUElfU0FTUEhZMF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NBU1BIWTBfUEFHRVZFUlNJT04gICAgICAgICAgICAgKDB4MDEpCiAKIC8qIHZhbHVlcyBmb3IgU0FTIFBIWSBQYWdlIDAgUHJvZ3JhbW1lZExpbmtSYXRlIGZpZWxkICovCiAjZGVmaW5lIE1QSV9TQVNfUEhZMF9QUkFURV9NQVhfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgKDB4RjApCkBAIC0yNjMyLDYgKzI2NzksOSBAQAogI2RlZmluZSBNUElfU0FTX1BIWTBfSFdSQVRFX01JTl9SQVRFXzFfNSAgICAgICAgICAgICAgICAgICAgICAgICgweDA4KQogI2RlZmluZSBNUElfU0FTX1BIWTBfSFdSQVRFX01JTl9SQVRFXzNfMCAgICAgICAgICAgICAgICAgICAgICAgICgweDA5KQogCisvKiB2YWx1ZXMgZm9yIFNBUyBQSFkgUGFnZSAwIEZsYWdzIGZpZWxkICovCisjZGVmaW5lIE1QSV9TQVNfUEhZMF9GTEFHU19TR1BJT19ESVJFQ1RfQVRUQUNIX0VOQyAgICAgICAgICAgICAgKDB4MDEpCisKIC8qIHZhbHVlcyBmb3IgU0FTIFBIWSBQYWdlIDAgUGh5SW5mbyBmaWVsZCAqLwogI2RlZmluZSBNUElfU0FTX1BIWTBfUEhZSU5GT19TQVRBX1BPUlRfQUNUSVZFICAgICAgICAgICAgICAgICAgICgweDAwMDA0MDAwKQogI2RlZmluZSBNUElfU0FTX1BIWTBfUEhZSU5GT19TQVRBX1BPUlRfU0VMRUNUT1IgICAgICAgICAgICAgICAgICgweDAwMDAyMDAwKQpAQCAtMjY5MCw3ICsyNzQwLDcgQEAKIH0gQ09ORklHX1BBR0VfU0FTX0VOQ0xPU1VSRV8wLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0FTX0VOQ0xPU1VSRV8wLAogICBTYXNFbmNsb3N1cmVQYWdlMF90LCBNUElfUE9JTlRFUiBwU2FzRW5jbG9zdXJlUGFnZTBfdDsKIAotI2RlZmluZSBNUElfU0FTRU5DTE9TVVJFMF9QQUdFVkVSU0lPTiAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NBU0VOQ0xPU1VSRTBfUEFHRVZFUlNJT04gICAgICAgKDB4MDEpCiAKIC8qIHZhbHVlcyBmb3IgU0FTIEVuY2xvc3VyZSBQYWdlIDAgRmxhZ3MgZmllbGQgKi8KICNkZWZpbmUgTVBJX1NBU19FTkNMUzBfRkxBR1NfU0VQX0JVU19JRF9WQUxJRCAgICAgICAoMHgwMDIwKQpAQCAtMjcwMiw2ICsyNzUyLDcgQEAKICNkZWZpbmUgTVBJX1NBU19FTkNMUzBfRkxBR1NfTU5HX0lPQ19TR1BJTyAgICAgICAgICAoMHgwMDAyKQogI2RlZmluZSBNUElfU0FTX0VOQ0xTMF9GTEFHU19NTkdfRVhQX1NHUElPICAgICAgICAgICgweDAwMDMpCiAjZGVmaW5lIE1QSV9TQVNfRU5DTFMwX0ZMQUdTX01OR19TRVNfRU5DTE9TVVJFICAgICAgKDB4MDAwNCkKKyNkZWZpbmUgTVBJX1NBU19FTkNMUzBfRkxBR1NfTU5HX0lPQ19HUElPICAgICAgICAgICAoMHgwMDA1KQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaGlzdG9yeS50eHQgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaGlzdG9yeS50eHQKaW5kZXggYzllZGJlZS4uMWEzMGVmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2hpc3RvcnkudHh0CisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9oaXN0b3J5LnR4dApAQCAtNiwxNyArNiwxNyBAQAogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IExTSSBMb2dpYyBDb3Jwb3JhdGlvbi4KIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEhlYWRlciBTZXQgUmVsZWFzZSBWZXJzaW9uOiAgICAwMS4wNS4wOQorIEhlYWRlciBTZXQgUmVsZWFzZSBWZXJzaW9uOiAgICAwMS4wNS4xMAogIEhlYWRlciBTZXQgUmVsZWFzZSBEYXRlOiAgICAgICAwMy0xMS0wNQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgRmlsZW5hbWUgICAgICAgICAgICAgICBDdXJyZW50IHZlcnNpb24gICAgIFByaW9yIHZlcnNpb24KICAtLS0tLS0tLS0tICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLQotIG1waS5oICAgICAgICAgICAgICAgICAgMDEuMDUuMDcgICAgICAgICAgICAwMS4wNS4wNgotIG1waV9pb2MuaCAgICAgICAgICAgICAgMDEuMDUuMDggICAgICAgICAgICAwMS4wNS4wNwotIG1waV9jbmZnLmggICAgICAgICAgICAgMDEuMDUuMDggICAgICAgICAgICAwMS4wNS4wNwotIG1waV9pbml0LmggICAgICAgICAgICAgMDEuMDUuMDQgICAgICAgICAgICAwMS4wNS4wMwotIG1waV90YXJnLmggICAgICAgICAgICAgMDEuMDUuMDQgICAgICAgICAgICAwMS4wNS4wMworIG1waS5oICAgICAgICAgICAgICAgICAgMDEuMDUuMDggICAgICAgICAgICAwMS4wNS4wNworIG1waV9pb2MuaCAgICAgICAgICAgICAgMDEuMDUuMDkgICAgICAgICAgICAwMS4wNS4wOAorIG1waV9jbmZnLmggICAgICAgICAgICAgMDEuMDUuMDkgICAgICAgICAgICAwMS4wNS4wOAorIG1waV9pbml0LmggICAgICAgICAgICAgMDEuMDUuMDUgICAgICAgICAgICAwMS4wNS4wNAorIG1waV90YXJnLmggICAgICAgICAgICAgMDEuMDUuMDUgICAgICAgICAgICAwMS4wNS4wNAogIG1waV9mYy5oICAgICAgICAgICAgICAgMDEuMDUuMDEgICAgICAgICAgICAwMS4wNS4wMQogIG1waV9sYW4uaCAgICAgICAgICAgICAgMDEuMDUuMDEgICAgICAgICAgICAwMS4wNS4wMQogIG1waV9yYWlkLmggICAgICAgICAgICAgMDEuMDUuMDIgICAgICAgICAgICAwMS4wNS4wMgpAQCAtMjQsNyArMjQsNyBAQAogIG1waV9pbmIuaCAgICAgICAgICAgICAgMDEuMDUuMDEgICAgICAgICAgICAwMS4wNS4wMQogIG1waV9zYXMuaCAgICAgICAgICAgICAgMDEuMDUuMDEgICAgICAgICAgICAwMS4wNS4wMQogIG1waV90eXBlLmggICAgICAgICAgICAgMDEuMDUuMDEgICAgICAgICAgICAwMS4wNS4wMQotIG1waV9oaXN0b3J5LnR4dCAgICAgICAgMDEuMDUuMDkgICAgICAgICAgICAwMS4wNS4wOAorIG1waV9oaXN0b3J5LnR4dCAgICAgICAgMDEuMDUuMDkgICAgICAgICAgICAwMS4wNS4wOQogCiAKICAqICBEYXRlICAgICAgVmVyc2lvbiAgIERlc2NyaXB0aW9uCkBAIC04OCw2ICs4OCw5IEBACiAgKiAgMDMtMTEtMDUgIDAxLjA1LjA3ICBSZW1vdmVkIGZ1bmN0aW9uIGNvZGVzIGZvciBTQ1NJIElPIDMyIGFuZAogICogICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0QXNzaXN0RXh0ZW5kZWQgcmVxdWVzdHMuCiAgKiAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIEVFRFAgSU9DU3RhdHVzIGNvZGVzLgorICogIDA2LTI0LTA1ICAwMS4wNS4wOCAgQWRkZWQgZnVuY3Rpb24gY29kZXMgZm9yIFNDU0kgSU8gMzIgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRBc3Npc3RFeHRlbmRlZCByZXF1ZXN0cy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEVFRFAgSU9DU3RhdHVzIGNvZGVzLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG1waV9pb2MuaApAQCAtMTU5LDYgKzE2Miw4IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBSZXBseSBhbmQgSU9DIEluaXQgUmVxdWVzdC4KICAqICAwMy0xMS0wNSAgMDEuMDUuMDggIEFkZGVkIGZhbWlseSBjb2RlIGZvciAxMDY4RSBmYW1pbHkuCiAgKiAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIElPQ0ZhY3RzIFJlcGx5IEVFRFAgQ2FwYWJpbGl0eSBiaXQuCisgKiAgMDYtMjQtMDUgIDAxLjA1LjA5ICBBZGRlZCA1IG5ldyBJT0NGYWN0cyBSZXBseSBJT0NDYXBhYmlsaXRpZXMgYml0cy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1heCBTQVRBIFRhcmdldHMgdG8gU0FTIERpc2NvdmVyeSBFcnJvciBldmVudC4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBtcGlfY25mZy5oCkBAIC0zODAsNiArMzg1LDIzIEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBOZXcgcGh5c2ljYWwgbWFwcGluZyBtb2RlIGluIFNBUyBJTyBVbml0IFBhZ2UgMi4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIENPTkZJR19QQUdFX1NBU19FTkNMT1NVUkVfMC4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFNsb3QgYW5kIEVuY2xvc3VyZSBmaWVsZHMgdG8gU0FTIERldmljZSBQYWdlIDAuCisgKiAgMDYtMjQtMDUgIDAxLjA1LjA5ICBBZGRlZCBFRURQIGRlZmluZXMgdG8gSU9DIFBhZ2UgMS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG1vcmUgUkFJRCB0eXBlIGRlZmluZXMgdG8gSU9DIFBhZ2UgMi4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFBvcnQgRW5hYmxlIERlbGF5IHNldHRpbmdzIHRvIEJJT1MgUGFnZSAxLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgQmFkIEJsb2NrIFRhYmxlIEZ1bGwgZGVmaW5lIHRvIFJBSUQgVm9sdW1lIFBhZ2UgMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFByZXZpb3VzIFN0YXRlIGRlZmluZXMgdG8gUkFJRCBQaHlzaWNhbCBEaXNrCisgKiAgICAgICAgICAgICAgICAgICAgICBQYWdlIDAuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNYXggU2F0YSBUYXJnZXRzIGRlZmluZSBmb3IgRGlzY292ZXJ5U3RhdHVzIGZpZWxkCisgKiAgICAgICAgICAgICAgICAgICAgICBvZiBTQVMgSU8gVW5pdCBQYWdlIDAuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBEZXZpY2UgU2VsZiBUZXN0IHRvIENvbnRyb2wgRmxhZ3Mgb2YgU0FTIElPIFVuaXQKKyAqICAgICAgICAgICAgICAgICAgICAgIFBhZ2UgMS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIERpcmVjdCBBdHRhY2ggU3RhcnRpbmcgU2xvdCBOdW1iZXIgZGVmaW5lIGZvciBTQVMKKyAqICAgICAgICAgICAgICAgICAgICAgIElPIFVuaXQgUGFnZSAyLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbmV3IGZpZWxkcyBpbiBTQVMgRGV2aWNlIFBhZ2UgMiBmb3IgZW5jbG9zdXJlCisgKiAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgT3duZXJEZXZIYW5kbGUgYW5kIEZsYWdzIGZpZWxkIHRvIFNBUyBQSFkgUGFnZSAwLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgSU9DIEdQSU8gRmxhZ3MgZGVmaW5lIHRvIFNBUyBFbmNsb3N1cmUgUGFnZSAwLgorICogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgdGhlIHZhbHVlIGZvciBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZfU0FUQV9TVVBQT1JULgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG1waV9pbml0LmgKQEAgLTQxOCw2ICs0NDAsOCBAQAogICogICAgICAgICAgICAgICAgICAgICAgTW9kaWZpZWQgU0NTSSBFbmNsb3N1cmUgUHJvY2Vzc29yIFJlcXVlc3QgYW5kIFJlcGx5IHRvCiAgKiAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IEVuY2xvc3VyZS9TbG90IGFkZHJlc3NpbmcgcmF0aGVyIHRoYW4gV1dJRAogICogICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZy4KKyAqICAwNi0yNC0wNSAgMDEuMDUuMDUgIEFkZGVkIFNDU0kgSU8gMzIgc3RydWN0dXJlcyBhbmQgZGVmaW5lcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZvdXIgbmV3IGRlZmluZXMgZm9yIFNFUCBTbG90U3RhdHVzLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG1waV90YXJnLmgKQEAgLTQ2MSw2ICs0ODUsNyBAQAogICogIDEwLTA1LTA0ICAwMS4wNS4wMiAgTVNHX1RBUkdFVF9DTURfQlVGRkVSX1BPU1RfQkFTRV9MSVNUX1JFUExZIGFkZGVkLgogICogIDAyLTIyLTA1ICAwMS4wNS4wMyAgQ2hhbmdlZCBhIGNvbW1lbnQuCiAgKiAgMDMtMTEtMDUgIDAxLjA1LjA0ICBSZW1vdmVkIFRhcmdldEFzc2lzdEV4dGVuZGVkIFJlcXVlc3QuCisgKiAgMDYtMjQtMDUgIDAxLjA1LjA1ICBBZGRlZCBUYXJnZXRBc3Npc3RFeHRlbmRlZCBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG1waV9mYy5oCkBAIC01NzEsMjAgKzU5NiwyMCBAQAogCiBtcGlfaGlzdG9yeS50eHQgICAgICAgICBQYXJ0cyBsaXN0IGhpc3RvcnkKIAotRmlsZW5hbWUgICAgMDEuMDUuMDkKLS0tLS0tLS0tLS0gIC0tLS0tLS0tCi1tcGkuaCAgICAgICAwMS4wNS4wNwotbXBpX2lvYy5oICAgMDEuMDUuMDgKLW1waV9jbmZnLmggIDAxLjA1LjA4Ci1tcGlfaW5pdC5oICAwMS4wNS4wNAotbXBpX3RhcmcuaCAgMDEuMDUuMDQKLW1waV9mYy5oICAgIDAxLjA1LjAxCi1tcGlfbGFuLmggICAwMS4wNS4wMQotbXBpX3JhaWQuaCAgMDEuMDUuMDIKLW1waV90b29sLmggIDAxLjA1LjAzCi1tcGlfaW5iLmggICAwMS4wNS4wMQotbXBpX3Nhcy5oICAgMDEuMDUuMDEKLW1waV90eXBlLmggIDAxLjA1LjAxCitGaWxlbmFtZSAgICAwMS4wNS4xMCAgMDEuMDUuMDkKKy0tLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLQorbXBpLmggICAgICAgMDEuMDUuMDggIDAxLjA1LjA3CittcGlfaW9jLmggICAwMS4wNS4wOSAgMDEuMDUuMDgKK21waV9jbmZnLmggIDAxLjA1LjA5ICAwMS4wNS4wOAorbXBpX2luaXQuaCAgMDEuMDUuMDUgIDAxLjA1LjA0CittcGlfdGFyZy5oICAwMS4wNS4wNSAgMDEuMDUuMDQKK21waV9mYy5oICAgIDAxLjA1LjAxICAwMS4wNS4wMQorbXBpX2xhbi5oICAgMDEuMDUuMDEgIDAxLjA1LjAxCittcGlfcmFpZC5oICAwMS4wNS4wMiAgMDEuMDUuMDIKK21waV90b29sLmggIDAxLjA1LjAzICAwMS4wNS4wMworbXBpX2luYi5oICAgMDEuMDUuMDEgIDAxLjA1LjAxCittcGlfc2FzLmggICAwMS4wNS4wMSAgMDEuMDUuMDEKK21waV90eXBlLmggIDAxLjA1LjAxICAwMS4wNS4wMQogCiBGaWxlbmFtZSAgICAwMS4wNS4wOCAgIDAxLjA1LjA3ICAgMDEuMDUuMDYgICAwMS4wNS4wNSAgIDAxLjA1LjA0ICAgMDEuMDUuMDMKIC0tLS0tLS0tLS0gIC0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2luaXQuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pbml0LmgKaW5kZXggYWNhMDM1OC4uZDVhZjc1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2luaXQuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW5pdC5oCkBAIC02LDcgKzYsNyBAQAogICogICAgICAgICAgVGl0bGU6ICBNUEkgaW5pdGlhdG9yIG1vZGUgbWVzc2FnZXMgYW5kIHN0cnVjdHVyZXMKICAqICBDcmVhdGlvbiBEYXRlOiAgSnVuZSA4LCAyMDAwCiAgKgotICogICAgbXBpX2luaXQuaCBWZXJzaW9uOiAgMDEuMDUuMDQKKyAqICAgIG1waV9pbml0LmggVmVyc2lvbjogIDAxLjA1LjA1CiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtNDgsNiArNDgsOCBAQAogICogICAgICAgICAgICAgICAgICAgICAgTW9kaWZpZWQgU0NTSSBFbmNsb3N1cmUgUHJvY2Vzc29yIFJlcXVlc3QgYW5kIFJlcGx5IHRvCiAgKiAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IEVuY2xvc3VyZS9TbG90IGFkZHJlc3NpbmcgcmF0aGVyIHRoYW4gV1dJRAogICogICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZy4KKyAqICAwNi0yNC0wNSAgMDEuMDUuMDUgIEFkZGVkIFNDU0kgSU8gMzIgc3RydWN0dXJlcyBhbmQgZGVmaW5lcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZvdXIgbmV3IGRlZmluZXMgZm9yIFNFUCBTbG90U3RhdHVzLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtMjAzLDYgKzIwNSwxOTcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBTQ1NJIElPIDMyIG1lc3NhZ2VzIGFuZCBhc3NvY2lhdGVkIHN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ0RCWzIwXTsgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlSZWZlcmVuY2VUYWc7ICAgICAgICAvKiAxNGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5QXBwbGljYXRpb25UYWc7ICAgICAgLyogMThoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeUFwcGxpY2F0aW9uVGFnTWFzazsgIC8qIDFBaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyTGVuZ3RoOyAgICAgICAgICAgICAvKiAxQ2ggKi8KK30gTVBJX1NDU0lfSU8zMl9DREJfRUVEUDMyLCBNUElfUE9JTlRFUiBQVFJfTVBJX1NDU0lfSU8zMl9DREJfRUVEUDMyLAorICBNcGlTY3NpSW8zMkNkYkVlZHAzMl90LCBNUElfUE9JTlRFUiBwTXBpU2NzaUlvMzJDZGJFZWRwMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDREJbMTZdOyAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsgICAgICAgICAgICAgICAgIC8qIDEwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlSZWZlcmVuY2VUYWc7ICAgICAgICAvKiAxNGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5QXBwbGljYXRpb25UYWc7ICAgICAgLyogMThoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeUFwcGxpY2F0aW9uVGFnTWFzazsgIC8qIDFBaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyTGVuZ3RoOyAgICAgICAgICAgICAvKiAxQ2ggKi8KK30gTVBJX1NDU0lfSU8zMl9DREJfRUVEUDE2LCBNUElfUE9JTlRFUiBQVFJfTVBJX1NDU0lfSU8zMl9DREJfRUVEUDE2LAorICBNcGlTY3NpSW8zMkNkYkVlZHAxNl90LCBNUElfUE9JTlRFUiBwTXBpU2NzaUlvMzJDZGJFZWRwMTZfdDsKKwordHlwZWRlZiB1bmlvbgoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICBDREIzMlszMl07CisgICAgTVBJX1NDU0lfSU8zMl9DREJfRUVEUDMyIEVFRFAzMjsKKyAgICBNUElfU0NTSV9JTzMyX0NEQl9FRURQMTYgRUVEUDE2OworICAgIFNHRV9TSU1QTEVfVU5JT04gICAgICAgICBTR0U7Cit9IE1QSV9TQ1NJX0lPMzJfQ0RCX1VOSU9OLCBNUElfUE9JTlRFUiBQVFJfTVBJX1NDU0lfSU8zMl9DREJfVU5JT04sCisgIE1waVNjc2lJbzMyQ2RiX3QsIE1QSV9QT0lOVEVSIHBNcGlTY3NpSW8zMkNkYl90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRhcmdldElEOyAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQnVzOyAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgIC8qIDAyaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDRoICovCit9IE1QSV9TQ1NJX0lPMzJfQlVTX1RBUkdFVF9JRF9GT1JNLCBNUElfUE9JTlRFUiBQVFJfTVBJX1NDU0lfSU8zMl9CVVNfVEFSR0VUX0lEX0ZPUk0sCisgIE1waVNjc2lJbzMyQnVzVGFyZ2V0SWRGb3JtX3QsIE1QSV9QT0lOVEVSIHBNcGlTY3NpSW8zMkJ1c1RhcmdldElkRm9ybV90OworCit0eXBlZGVmIHVuaW9uCit7CisgICAgTVBJX1NDU0lfSU8zMl9CVVNfVEFSR0VUX0lEX0ZPUk0gICAgU0NTSUlEOworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdXSUQ7Cit9IE1QSV9TQ1NJX0lPMzJfQUREUkVTUywgTVBJX1BPSU5URVIgUFRSX01QSV9TQ1NJX0lPMzJfQUREUkVTUywKKyAgTXBpU2NzaUlvMzJBZGRyZXNzX3QsIE1QSV9QT0lOVEVSIHBNcGlTY3NpSW8zMkFkZHJlc3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX01TR19TQ1NJX0lPMzJfUkVRVUVTVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBDREJMZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5zZUJ1ZmZlckxlbmd0aDsgICAgICAgICAgICAgIC8qIDA1aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBMVU5bOF07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0aCAqLworICAgIE1QSV9TQ1NJX0lPMzJfQ0RCX1VOSU9OICAgICBDREI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgIC8qIDM4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBCaWRpcmVjdGlvbmFsRGF0YUxlbmd0aDsgICAgICAgIC8qIDNDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRhcnlSZWZlcmVuY2VUYWc7ICAgICAgICAgIC8qIDQwaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRhcnlBcHBsaWNhdGlvblRhZzsgICAgICAgIC8qIDQ0aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgICAgIC8qIDQ2aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICBFRURQRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvblRhZ1RyYW5zbGF0aW9uTWFzazsgIC8qIDRBaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBFRURQQmxvY2tTaXplOyAgICAgICAgICAgICAgICAgIC8qIDRDaCAqLworICAgIE1QSV9TQ1NJX0lPMzJfQUREUkVTUyAgICAgICBEZXZpY2VBZGRyZXNzOyAgICAgICAgICAgICAgICAgIC8qIDUwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBTR0xPZmZzZXQwOyAgICAgICAgICAgICAgICAgICAgIC8qIDU4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBTR0xPZmZzZXQxOyAgICAgICAgICAgICAgICAgICAgIC8qIDU5aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBTR0xPZmZzZXQyOyAgICAgICAgICAgICAgICAgICAgIC8qIDVBaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBTR0xPZmZzZXQzOyAgICAgICAgICAgICAgICAgICAgIC8qIDVCaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgICAgIC8qIDVDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDYwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBTZW5zZUJ1ZmZlckxvd0FkZHI7ICAgICAgICAgICAgIC8qIDY0aCAqLworICAgIFNHRV9JT19VTklPTiAgICAgICAgICAgICAgICBTR0w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDY4aCAqLworfSBNU0dfU0NTSV9JTzMyX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfU0NTSV9JTzMyX1JFUVVFU1QsCisgIFNDU0lJTzMyUmVxdWVzdF90LCBNUElfUE9JTlRFUiBwU0NTSUlPMzJSZXF1ZXN0X3Q7CisKKy8qIFNDU0kgSU8gMzIgTXNnRmxhZ3MgYml0cyAqLworI2RlZmluZSBNUElfU0NTSUlPMzJfTVNHRkxHU19TRU5TRV9XSURUSCAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfU0VOU0VfV0lEVEhfMzIgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTX1NFTlNFX1dJRFRIXzY0ICAgICAgICAgICAgICgweDAxKQorCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTX1NFTlNFX0xPQ0FUSU9OICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfU0NTSUlPMzJfTVNHRkxHU19TRU5TRV9MT0NfSE9TVCAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfU0VOU0VfTE9DX0lPQyAgICAgICAgICAgICAgKDB4MDIpCisKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfQ01EX0RFVEVSTUlORVNfREFUQV9ESVIgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTX1NHTF9PRkZTRVRTX0NIQUlOUyAgICAgICAgICgweDA4KQorI2RlZmluZSBNUElfU0NTSUlPMzJfTVNHRkxHU19NVUxUSUNBU1QgICAgICAgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfQklESVJFQ1RJT05BTCAgICAgICAgICAgICAgKDB4MjApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTX0xBUkdFX0NEQiAgICAgICAgICAgICAgICAgICgweDQwKQorCisvKiBTQ1NJIElPIDMyIEZsYWdzIGJpdHMgKi8KKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0ZMQUdTX0ZPUk1fTUFTSyAgICAgICAgICAgICAgICAgICAgKDB4MDMpCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9GTEFHU19GT1JNX1NDU0lJRCAgICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfRkxBR1NfRk9STV9XV0lEICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKworLyogU0NTSSBJTyAzMiBMVU4gZmllbGRzICovCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9MVU5fRklSU1RfTEVWRUxfQUREUkVTU0lORyAgICAgKDB4MDAwMEZGRkYpCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9MVU5fU0VDT05EX0xFVkVMX0FERFJFU1NJTkcgICAgKDB4RkZGRjAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9MVU5fVEhJUkRfTEVWRUxfQUREUkVTU0lORyAgICAgKDB4MDAwMEZGRkYpCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9MVU5fRk9VUlRIX0xFVkVMX0FERFJFU1NJTkcgICAgKDB4RkZGRjAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9MVU5fTEVWRUxfMV9XT1JEICAgICAgICAgICAgICAgKDB4RkYwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0xVTl9MRVZFTF8xX0RXT1JEICAgICAgICAgICAgICAoMHgwMDAwRkYwMCkKKworLyogU0NTSSBJTyAzMiBDb250cm9sIGJpdHMgKi8KKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfREFUQURJUkVDVElPTl9NQVNLICAgICAoMHgwMzAwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfTk9EQVRBVFJBTlNGRVIgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfV1JJVEUgICAgICAgICAgICAgICAgICAoMHgwMTAwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfUkVBRCAgICAgICAgICAgICAgICAgICAoMHgwMjAwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfQklESVJFQ1RJT05BTCAgICAgICAgICAoMHgwMzAwMDAwMCkKKworI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9BRERDREJMRU5fTUFTSyAgICAgICAgICgweEZDMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9BRERDREJMRU5fU0hJRlQgICAgICAgICgyNikKKworI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9UQVNLQVRUUklCVVRFX01BU0sgICAgICgweDAwMDAwNzAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9TSU1QTEVRICAgICAgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9IRUFET0ZRICAgICAgICAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9PUkRFUkVEUSAgICAgICAgICAgICAgICgweDAwMDAwMjAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9BQ0FRICAgICAgICAgICAgICAgICAgICgweDAwMDAwNDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9VTlRBR0dFRCAgICAgICAgICAgICAgICgweDAwMDAwNTAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9OT19ESVNDT05ORUNUICAgICAgICAgICgweDAwMDAwNzAwKQorCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX1RBU0tNQU5BR0VfTUFTSyAgICAgICAgKDB4MDBGRjAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX09CU09MRVRFICAgICAgICAgICAgICAgKDB4MDA4MDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX0NMRUFSX0FDQV9SU1YgICAgICAgICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX1RBUkdFVF9SRVNFVCAgICAgICAgICAgKDB4MDAyMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX0xVTl9SRVNFVF9SU1YgICAgICAgICAgKDB4MDAxMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX1JFU0VSVkVEICAgICAgICAgICAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX0NMUl9UQVNLX1NFVF9SU1YgICAgICAgKDB4MDAwNDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX0FCT1JUX1RBU0tfU0VUICAgICAgICAgKDB4MDAwMjAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX1JFU0VSVkVEMiAgICAgICAgICAgICAgKDB4MDAwMTAwMDApCisKKy8qIFNDU0kgSU8gMzIgRUVEUEZsYWdzICovCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9FRURQRkxBR1NfTUFTS19PUCAgICAgICAgICAgICAgKDB4MDAwNykKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19OT09QX09QICAgICAgICAgICAgICAoMHgwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfRUVEUEZMQUdTX0NIS19PUCAgICAgICAgICAgICAgICgweDAwMDEpCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9FRURQRkxBR1NfU1RSSVBfT1AgICAgICAgICAgICAgKDB4MDAwMikKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19DSEtSTV9PUCAgICAgICAgICAgICAoMHgwMDAzKQorI2RlZmluZSBNUElfU0NTSUlPMzJfRUVEUEZMQUdTX0lOU0VSVF9PUCAgICAgICAgICAgICgweDAwMDQpCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9FRURQRkxBR1NfUkVQTEFDRV9PUCAgICAgICAgICAgKDB4MDAwNikKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19DSEtSRUdFTl9PUCAgICAgICAgICAoMHgwMDA3KQorCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9FRURQRkxBR1NfUEFTU19SRUZfVEFHICAgICAgICAgKDB4MDAwOCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU184XzlUSFNfTU9ERSAgICAgICAgICAoMHgwMDEwKQorCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9FRURQRkxBR1NfVDEwX0NIS19NQVNLICAgICAgICAgKDB4MDcwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19UMTBfQ0hLX0dVQVJEICAgICAgICAoMHgwMTAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfRUVEUEZMQUdTX1QxMF9DSEtfUkVGVEFHICAgICAgICgweDAyMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9FRURQRkxBR1NfVDEwX0NIS19MQkFUQUcgICAgICAgKDB4MDQwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19UMTBfQ0hLX1NISUZUICAgICAgICAoOCkKKworI2RlZmluZSBNUElfU0NTSUlPMzJfRUVEUEZMQUdTX0lOQ19TRUNfQVBQVEFHICAgICAgICgweDEwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9FRURQRkxBR1NfSU5DX1BSSV9BUFBUQUcgICAgICAgKDB4MjAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19JTkNfU0VDX1JFRlRBRyAgICAgICAoMHg0MDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfRUVEUEZMQUdTX0lOQ19QUklfUkVGVEFHICAgICAgICgweDgwMDApCisKKworLyogU0NTSUlPMzIgSU8gcmVwbHkgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBfTVNHX1NDU0lJTzMyX0lPX1JFUExZCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUG9ydDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dMZW5ndGg7ICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENEQkxlbmd0aDsgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTZW5zZUJ1ZmZlckxlbmd0aDsgICAgICAgICAgLyogMDVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU0NTSVN0YXR1czsgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFNDU0lTdGF0ZTsgICAgICAgICAgICAgICAgICAvKiAwRGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgICAgICAgICAgLyogMEVoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DTG9nSW5mbzsgICAgICAgICAgICAgICAgIC8qIDEwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyQ291bnQ7ICAgICAgICAgICAgICAvKiAxNGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBTZW5zZUNvdW50OyAgICAgICAgICAgICAgICAgLyogMThoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VJbmZvOyAgICAgICAgICAgICAgIC8qIDFDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFRhc2tUYWc7ICAgICAgICAgICAgICAgICAgICAvKiAyMGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMjJoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgQmlkaXJlY3Rpb25hbFRyYW5zZmVyQ291bnQ7IC8qIDI0aCAqLworfSBNU0dfU0NTSUlPMzJfSU9fUkVQTFksIE1QSV9QT0lOVEVSIFBUUl9NU0dfU0NTSUlPMzJfSU9fUkVQTFksCisgIFNDU0lJTzMyUmVwbHlfdCwgTVBJX1BPSU5URVIgcFNDU0lJTzMyUmVwbHlfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICBTQ1NJIFRhc2sgTWFuYWdlbWVudCBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTMxMCwxMCArNTAzLDE0IEBACiAjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfVU5DT05GSUdVUkVEICAgICAgICAgICAgICgweDAwMDAwMDgwKQogI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX0hPVF9TUEFSRSAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMCkKICNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19SRUJVSUxEX1NUT1BQRUQgICAgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfUkVRX0NPTlNJU1RFTkNZX0NIRUNLICAgICgweDAwMDAxMDAwKQorI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX0RJU0FCTEUgICAgICAgICAgICAgICAgICAoMHgwMDAwMjAwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19SRVFfUkVTRVJWRURfREVWSUNFICAgICAgKDB4MDAwMDQwMDApCiAjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfSURFTlRJRllfUkVRVUVTVCAgICAgICAgICgweDAwMDIwMDAwKQogI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX1JFUVVFU1RfUkVNT1ZFICAgICAgICAgICAoMHgwMDA0MDAwMCkKICNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19SRVFVRVNUX0lOU0VSVCAgICAgICAgICAgKDB4MDAwODAwMDApCiAjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfRE9fTk9UX01PVkUgICAgICAgICAgICAgICgweDAwNDAwMDAwKQorI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX0FDVElWRSAgICAgICAgICAgICAgICAgICAoMHgwMDgwMDAwMCkKICNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19CX0VOQUJMRV9CWVBBU1MgICAgICAgICAgKDB4MDQwMDAwMDApCiAjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfQV9FTkFCTEVfQllQQVNTICAgICAgICAgICgweDA4MDAwMDAwKQogI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX0RFVl9PRkYgICAgICAgICAgICAgICAgICAoMHgxMDAwMDAwMCkKQEAgLTM1MiwxMSArNTQ5LDE1IEBACiAjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19VTkNPTkZJR1VSRUQgICAgICAgICAgICgweDAwMDAwMDgwKQogI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfSE9UX1NQQVJFICAgICAgICAgICAgICAoMHgwMDAwMDEwMCkKICNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX1JFQlVJTERfU1RPUFBFRCAgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19DT05TSVNURU5DWV9DSEVDSyAgICAgICgweDAwMDAxMDAwKQorI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfRElTQUJMRSAgICAgICAgICAgICAgICAoMHgwMDAwMjAwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX1JFU0VSVkVEX0RFVklDRSAgICAgICAgKDB4MDAwMDQwMDApCiAjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19SRVBPUlQgICAgICAgICAgICAgICAgICgweDAwMDEwMDAwKQogI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfSURFTlRJRllfUkVRVUVTVCAgICAgICAoMHgwMDAyMDAwMCkKICNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX1JFTU9WRV9SRUFEWSAgICAgICAgICAgKDB4MDAwNDAwMDApCiAjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19JTlNFUlRfUkVBRFkgICAgICAgICAgICgweDAwMDgwMDAwKQogI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfRE9fTk9UX1JFTU9WRSAgICAgICAgICAoMHgwMDQwMDAwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX0FDVElWRSAgICAgICAgICAgICAgICAgKDB4MDA4MDAwMDApCiAjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19CX0JZUEFTU19FTkFCTEVEICAgICAgICgweDAxMDAwMDAwKQogI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfQV9CWVBBU1NfRU5BQkxFRCAgICAgICAoMHgwMjAwMDAwMCkKICNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX0JfRU5BQkxFX0JZUEFTUyAgICAgICAgKDB4MDQwMDAwMDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW9jLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW9jLmgKaW5kZXggZjkxZWI0ZS4uOTNiNzBlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2lvYy5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pb2MuaApAQCAtNiw3ICs2LDcgQEAKICAqICAgICAgICAgIFRpdGxlOiAgTVBJIElPQywgUG9ydCwgRXZlbnQsIEZXIERvd25sb2FkLCBhbmQgRlcgVXBsb2FkIG1lc3NhZ2VzCiAgKiAgQ3JlYXRpb24gRGF0ZTogIEF1Z3VzdCAxMSwgMjAwMAogICoKLSAqICAgIG1waV9pb2MuaCBWZXJzaW9uOiAgMDEuMDUuMDgKKyAqICAgIG1waV9pb2MuaCBWZXJzaW9uOiAgMDEuMDUuMDkKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC04MSw2ICs4MSw4IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBSZXBseSBhbmQgSU9DIEluaXQgUmVxdWVzdC4KICAqICAwMy0xMS0wNSAgMDEuMDUuMDggIEFkZGVkIGZhbWlseSBjb2RlIGZvciAxMDY4RSBmYW1pbHkuCiAgKiAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIElPQ0ZhY3RzIFJlcGx5IEVFRFAgQ2FwYWJpbGl0eSBiaXQuCisgKiAgMDYtMjQtMDUgIDAxLjA1LjA5ICBBZGRlZCA1IG5ldyBJT0NGYWN0cyBSZXBseSBJT0NDYXBhYmlsaXRpZXMgYml0cy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1heCBTQVRBIFRhcmdldHMgdG8gU0FTIERpc2NvdmVyeSBFcnJvciBldmVudC4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTI2MSw3ICsyNjMsMTEgQEAKICNkZWZpbmUgTVBJX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfRElBR19UUkFDRV9CVUZGRVIgICAgICAgKDB4MDAwMDAwMDgpCiAjZGVmaW5lIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX1NOQVBTSE9UX0JVRkZFUiAgICAgICAgICgweDAwMDAwMDEwKQogI2RlZmluZSBNUElfSU9DRkFDVFNfQ0FQQUJJTElUWV9FWFRFTkRFRF9CVUZGRVIgICAgICAgICAoMHgwMDAwMDAyMCkKLQorI2RlZmluZSBNUElfSU9DRkFDVFNfQ0FQQUJJTElUWV9FRURQICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgTVBJX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfQklESVJFQ1RJT05BTCAgICAgICAgICAgKDB4MDAwMDAwODApCisjZGVmaW5lIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX01VTFRJQ0FTVCAgICAgICAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBNUElfSU9DRkFDVFNfQ0FQQUJJTElUWV9TQ1NJSU8zMiAgICAgICAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgTVBJX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfTk9fU0NTSUlPMTYgICAgICAgICAgICAgKDB4MDAwMDA0MDApCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02NzcsNiArNjgzLDcgQEAKICNkZWZpbmUgTVBJX0VWRU5UX0RTQ1ZSWV9FUlJfRFNfTVVMVFBMX1NVQlRSQUNUSVZFICAgICAgICAgICgweDAwMDAwMjAwKQogI2RlZmluZSBNUElfRVZFTlRfRFNDVlJZX0VSUl9EU19UQUJMRV9UT19UQUJMRSAgICAgICAgICAgICAgKDB4MDAwMDA0MDApCiAjZGVmaW5lIE1QSV9FVkVOVF9EU0NWUllfRVJSX0RTX01VTFRQTF9QQVRIUyAgICAgICAgICAgICAgICAoMHgwMDAwMDgwMCkKKyNkZWZpbmUgTVBJX0VWRU5UX0RTQ1ZSWV9FUlJfRFNfTUFYX1NBVEFfVEFSR0VUUyAgICAgICAgICAgICgweDAwMDAxMDAwKQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3RhcmcuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV90YXJnLmgKaW5kZXggNjIzOTAxZi4uM2Y0NjI4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3RhcmcuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfdGFyZy5oCkBAIC02LDcgKzYsNyBAQAogICogICAgICAgICAgVGl0bGU6ICBNUEkgVGFyZ2V0IG1vZGUgbWVzc2FnZXMgYW5kIHN0cnVjdHVyZXMKICAqICBDcmVhdGlvbiBEYXRlOiAgSnVuZSAyMiwgMjAwMAogICoKLSAqICAgIG1waV90YXJnLmggVmVyc2lvbjogIDAxLjA1LjA0CisgKiAgICBtcGlfdGFyZy5oIFZlcnNpb246ICAwMS4wNS4wNQogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTUzLDYgKzUzLDcgQEAKICAqICAxMC0wNS0wNCAgMDEuMDUuMDIgIE1TR19UQVJHRVRfQ01EX0JVRkZFUl9QT1NUX0JBU0VfTElTVF9SRVBMWSBhZGRlZC4KICAqICAwMi0yMi0wNSAgMDEuMDUuMDMgIENoYW5nZWQgYSBjb21tZW50LgogICogIDAzLTExLTA1ICAwMS4wNS4wNCAgUmVtb3ZlZCBUYXJnZXRBc3Npc3RFeHRlbmRlZCBSZXF1ZXN0LgorICogIDA2LTI0LTA1ICAwMS4wNS4wNSAgQWRkZWQgVGFyZ2V0QXNzaXN0RXh0ZW5kZWQgc3RydWN0dXJlcyBhbmQgZGVmaW5lcy4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTM3MSw2ICszNzIsNzcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRhcmdldCBBc3Npc3QgRXh0ZW5kZWQgUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfVEFSR0VUX0FTU0lTVF9FWFRfUkVRVUVTVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c0NvZGU7ICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0QXNzaXN0RmxhZ3M7ICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUXVldWVUYWc7ICAgICAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXBseVdvcmQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIExVTls4XTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVsYXRpdmVPZmZzZXQ7ICAgICAgICAgICAgICAgICAvKiAxOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgICAgIC8qIDFDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAgICAgLyogMjBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeVJlZmVyZW5jZVRhZzsgICAgICAgICAgICAvKiAyNGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5QXBwbGljYXRpb25UYWc7ICAgICAgICAgIC8qIDI4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlBcHBsaWNhdGlvblRhZ01hc2s7ICAgICAgLyogMkFoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAgICAgICAgICAgICAvKiAyQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgIC8qIDMwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEJpZGlyZWN0aW9uYWxEYXRhTGVuZ3RoOyAgICAgICAgLyogMzRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgU2Vjb25kYXJ5UmVmZXJlbmNlVGFnOyAgICAgICAgICAvKiAzOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBTZWNvbmRhcnlBcHBsaWNhdGlvblRhZzsgICAgICAgIC8qIDNDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNTsgICAgICAgICAgICAgICAgICAgICAgLyogM0VoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgRUVEUEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvKiA0MGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvblRhZ1RyYW5zbGF0aW9uTWFzazsgIC8qIDQyaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEVFRFBCbG9ja1NpemU7ICAgICAgICAgICAgICAgICAgLyogNDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU0dMT2Zmc2V0MDsgICAgICAgICAgICAgICAgICAgICAvKiA0OGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTR0xPZmZzZXQxOyAgICAgICAgICAgICAgICAgICAgIC8qIDQ5aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFNHTE9mZnNldDI7ICAgICAgICAgICAgICAgICAgICAgLyogNEFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU0dMT2Zmc2V0MzsgICAgICAgICAgICAgICAgICAgICAvKiA0QmggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDY7ICAgICAgICAgICAgICAgICAgICAgIC8qIDRDaCAqLworICAgIFNHRV9JT19VTklPTiAgICAgICAgICAgIFNHTFsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTBoICovCit9IE1TR19UQVJHRVRfQVNTSVNUX0VYVF9SRVFVRVNULCBNUElfUE9JTlRFUiBQVFJfTVNHX1RBUkdFVF9BU1NJU1RfRVhUX1JFUVVFU1QsCisgIFRhcmdldEFzc2lzdEV4dFJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcFRhcmdldEFzc2lzdEV4dFJlcXVlc3RfdDsKKworLyogc2VlIHRoZSBkZWZpbmVzIGFmdGVyIE1TR19UQVJHRVRfQVNTSVNUX1JFUVVFU1QgZm9yIFRhcmdldEFzc2lzdEZsYWdzICovCisKKy8qIGRlZmluZXMgZm9yIHRoZSBNc2dGbGFncyBmaWVsZCAqLworI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9NU0dGTEFHU19CSURJUkVDVElPTkFMICAgICAgICAoMHgyMCkKKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfTVNHRkxBR1NfTVVMVElDQVNUICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX01TR0ZMQUdTX1NHTF9PRkZTRVRfQ0hBSU5TICAgICgweDA4KQorCisvKiBkZWZpbmVzIGZvciB0aGUgRUVEUEZsYWdzIGZpZWxkICovCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfTUFTS19PUCAgICAgICAgICAoMHgwMDA3KQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9FRURQX05PT1BfT1AgICAgICAgICAgKDB4MDAwMCkKKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfRUVEUF9DSEtfT1AgICAgICAgICAgICgweDAwMDEpCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfU1RSSVBfT1AgICAgICAgICAoMHgwMDAyKQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9FRURQX0NIS1JNX09QICAgICAgICAgKDB4MDAwMykKKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfRUVEUF9JTlNFUlRfT1AgICAgICAgICgweDAwMDQpCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfUkVQTEFDRV9PUCAgICAgICAoMHgwMDA2KQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9FRURQX0NIS1JFR0VOX09QICAgICAgKDB4MDAwNykKKworI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9FRURQX1BBU1NfUkVGX1RBRyAgICAgKDB4MDAwOCkKKworI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9FRURQX1QxMF9DSEtfTUFTSyAgICAgKDB4MDcwMCkKKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfRUVEUF9UMTBfQ0hLX0dVQVJEICAgICgweDAxMDApCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfVDEwX0NIS19BUFBUQUcgICAoMHgwMjAwKQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9FRURQX1QxMF9DSEtfUkVGVEFHICAgKDB4MDQwMCkKKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfRUVEUF9UMTBfQ0hLX1NISUZUICAgICg4KQorCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfSU5DX1NFQ19BUFBUQUcgICAoMHgxMDAwKQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9FRURQX0lOQ19QUklfQVBQVEFHICAgKDB4MjAwMCkKKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfRUVEUF9JTkNfU0VDX1JFRlRBRyAgICgweDQwMDApCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfSU5DX1BSSV9SRUZUQUcgICAoMHg4MDAwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogVGFyZ2V0IFN0YXR1cyBTZW5kIFJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwppbmRleCBmZmJlNmY0Li5mNTE3ZDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwpAQCAtMjE4LDggKzIxOCw3IEBACiAgKgkoYWxzbyByZWZlcnJlZCB0byBhcyBhIElPIENvbnRyb2xsZXIgb3IgSU9DKS4KICAqCVRoaXMgcm91dGluZSBtdXN0IGNsZWFyIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgYWRhcHRlciBhbmQgZG9lcwogICoJc28gYnkgcmVhZGluZyB0aGUgcmVwbHkgRklGTy4gIE11bHRpcGxlIHJlcGxpZXMgbWF5IGJlIHByb2Nlc3NlZAotICoJcGVyIHNpbmdsZSBjYWxsIHRvIHRoaXMgcm91dGluZTsgdXAgdG8gTVBUX01BWF9SRVBMSUVTX1BFUl9JU1IKLSAqCXdoaWNoIGlzIGN1cnJlbnRseSBzZXQgdG8gMzIgaW4gbXB0YmFzZS5oLgorICoJcGVyIHNpbmdsZSBjYWxsIHRvIHRoaXMgcm91dGluZS4KICAqCiAgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyByZWdpc3Rlci1sZXZlbCBhY2Nlc3Mgb2YgdGhlIGFkYXB0ZXIgYnV0CiAgKglkaXNwYXRjaGVzIChjYWxscykgYSBwcm90b2NvbC1zcGVjaWZpYyBjYWxsYmFjayByb3V0aW5lIHRvIGhhbmRsZQpAQCAtMjc5LDExICsyNzgsMTEgQEAKIAkJCWNiX2lkeCA9IG1yLT51LmZyYW1lLmh3aGRyLm1zZ2N0eHUuZmxkLmNiX2lkeDsKIAkJCW1mID0gTVBUX0lOREVYXzJfTUZQVFIoaW9jLCByZXFfaWR4KTsKIAotCQkJZG1mcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJHb3Qgbm9uLVRVUkJPIHJlcGx5PSVwIHJlcV9pZHg9JXhcbiIsCi0JCQkJCWlvYy0+bmFtZSwgbXIsIHJlcV9pZHgpKTsKKwkJCWRtZnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiR290IG5vbi1UVVJCTyByZXBseT0lcCByZXFfaWR4PSV4IGNiX2lkeD0leCBGdW5jdGlvbj0leFxuIiwKKwkJCQkJaW9jLT5uYW1lLCBtciwgcmVxX2lkeCwgY2JfaWR4LCBtci0+dS5oZHIuRnVuY3Rpb24pKTsKIAkJCURCR19EVU1QX1JFUExZX0ZSQU1FKG1yKQogCi0JCQkvKiAgQ2hlY2svbG9nIElPQyBsb2cgaW5mbworCQkJIC8qICBDaGVjay9sb2cgSU9DIGxvZyBpbmZvCiAJCQkgKi8KIAkJCWlvY19zdGF0ID0gbGUxNl90b19jcHUobXItPnUucmVwbHkuSU9DU3RhdHVzKTsKIAkJCWlmIChpb2Nfc3RhdCAmIE1QSV9JT0NTVEFUVVNfRkxBR19MT0dfSU5GT19BVkFJTEFCTEUpIHsKQEAgLTM0NSw3ICszNDQsNyBAQAogCQkJaWYgKChtZikgJiYgKChtZiA+PSBNUFRfSU5ERVhfMl9NRlBUUihpb2MsIGlvYy0+cmVxX2RlcHRoKSkKIAkJCQl8fCAobWYgPCBpb2MtPnJlcV9mcmFtZXMpKSApIHsKIAkJCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVAotCQkJCQkibXB0X2ludGVycnVwdDogSW52YWxpZCBtZiAoJXApIHJlcV9pZHggKCVkKSFcbiIsIGlvYy0+bmFtZSwgKHZvaWQgKiltZiwgcmVxX2lkeCk7CisJCQkJCSJtcHRfaW50ZXJydXB0OiBJbnZhbGlkIG1mICglcCkhXG4iLCBpb2MtPm5hbWUsICh2b2lkICopbWYpOwogCQkJCWNiX2lkeCA9IDA7CiAJCQkJcGEgPSAwOwogCQkJCWZyZWVtZSA9IDA7CkBAIC0zOTksNyArMzk4LDcgQEAKICAqCUBtZjogUG9pbnRlciB0byBvcmlnaW5hbCBNUFQgcmVxdWVzdCBmcmFtZQogICoJQHJlcGx5OiBQb2ludGVyIHRvIE1QVCByZXBseSBmcmFtZSAoTlVMTCBpZiBUdXJib1JlcGx5KQogICoKLQkqCVJldHVybnMgMSBpbmRpY2F0aW5nIG9yaWdpbmFsIGFsbG9jJ2QgcmVxdWVzdCBmcmFtZSBwdHIKKyAqCVJldHVybnMgMSBpbmRpY2F0aW5nIG9yaWdpbmFsIGFsbG9jJ2QgcmVxdWVzdCBmcmFtZSBwdHIKICAqCXNob3VsZCBiZSBmcmVlZCwgb3IgMCBpZiBpdCBzaG91bGRuJ3QuCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTQwOCwyOCArNDA3LDE3IEBACiAJaW50IGZyZWVyZXEgPSAxOwogCXU4IGZ1bmM7CiAKLQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJtcHRfYmFzZV9yZXBseSgpIGNhbGxlZFxuIiwgaW9jLT5uYW1lKSk7CisJZG1mcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJtcHRfYmFzZV9yZXBseSgpIGNhbGxlZFxuIiwgaW9jLT5uYW1lKSk7CiAKLQlpZiAoKG1mID09IE5VTEwpIHx8Ci0JICAgIChtZiA+PSBNUFRfSU5ERVhfMl9NRlBUUihpb2MsIGlvYy0+cmVxX2RlcHRoKSkpIHsKLQkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAiTlVMTCBvciBCQUQgcmVxdWVzdCBmcmFtZSBwdHIhICg9JXApXG4iLAotCQkJCWlvYy0+bmFtZSwgKHZvaWQgKiltZik7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmIChyZXBseSA9PSBOVUxMKSB7Ci0JCWRwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVCAiVW5leHBlY3RlZCBOVUxMIEV2ZW50ICh0dXJibz8pIHJlcGx5IVxuIiwKLQkJCQlpb2MtPm5hbWUpKTsKLQkJcmV0dXJuIDE7Ci0JfQotCisjaWYgZGVmaW5lZChNUFRfREVCVUdfTVNHX0ZSQU1FKQogCWlmICghKHJlcGx5LT51Lmhkci5Nc2dGbGFncyAmIE1QSV9NU0dGTEFHU19DT05USU5VQVRJT05fUkVQTFkpKSB7CiAJCWRtZnByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IE9yaWdpbmFsIHJlcXVlc3QgZnJhbWUgKEAlcCkgaGVhZGVyXG4iLCBtZikpOwogCQlEQkdfRFVNUF9SRVFVRVNUX0ZSQU1FX0hEUihtZikKIAl9CisjZW5kaWYKIAogCWZ1bmMgPSByZXBseS0+dS5oZHIuRnVuY3Rpb247Ci0JZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAibXB0X2Jhc2VfcmVwbHksIEZ1bmN0aW9uPSUwMlhoXG4iLAorCWRtZnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAibXB0X2Jhc2VfcmVwbHksIEZ1bmN0aW9uPSUwMlhoXG4iLAogCQkJaW9jLT5uYW1lLCBmdW5jKSk7CiAKIAlpZiAoZnVuYyA9PSBNUElfRlVOQ1RJT05fRVZFTlRfTk9USUZJQ0FUSU9OKSB7CkBAIC00NDgsOCArNDM2LDE0IEBACiAJCSAqCUhtbW0uLi4gIEl0IHNlZW1zIHRoYXQgRXZlbnROb3RpZmljYXRpb25SZXBseSBpcyBhbiBleGNlcHRpb24KIAkJICoJdG8gdGhlIHJ1bGUgb2Ygb25lIHJlcGx5IHBlciByZXF1ZXN0LgogCQkgKi8KLQkJaWYgKHBFdlJlcGx5LT5Nc2dGbGFncyAmIE1QSV9NU0dGTEFHU19DT05USU5VQVRJT05fUkVQTFkpCisJCWlmIChwRXZSZXBseS0+TXNnRmxhZ3MgJiBNUElfTVNHRkxBR1NfQ09OVElOVUFUSU9OX1JFUExZKSB7CiAJCQlmcmVlcmVxID0gMDsKKwkJCWRldnRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIkVWRU5UX05PVElGSUNBVElPTiByZXBseSAlcCBkb2VzIG5vdCByZXR1cm4gUmVxdWVzdCBmcmFtZVxuIiwKKwkJCQlpb2MtPm5hbWUsIHBFdlJlcGx5KSk7CisJCX0gZWxzZSB7CisJCQlkZXZ0cHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJFVkVOVF9OT1RJRklDQVRJT04gcmVwbHkgJXAgcmV0dXJucyBSZXF1ZXN0IGZyYW1lXG4iLAorCQkJCWlvYy0+bmFtZSwgcEV2UmVwbHkpKTsKKwkJfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIC8vCQlMb2dFdmVudChpb2MsIHBFdlJlcGx5KTsKQEAgLTQ5MSwxMCArNDg1LDIxIEBACiAKIAkJCQlwQ2ZnLT5zdGF0dXMgPSBzdGF0dXM7CiAJCQkJaWYgKHN0YXR1cyA9PSBNUElfSU9DU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQkJcENmZy0+aGRyLT5QYWdlVmVyc2lvbiA9IHBSZXBseS0+SGVhZGVyLlBhZ2VWZXJzaW9uOwotCQkJCQlwQ2ZnLT5oZHItPlBhZ2VMZW5ndGggPSBwUmVwbHktPkhlYWRlci5QYWdlTGVuZ3RoOwotCQkJCQlwQ2ZnLT5oZHItPlBhZ2VOdW1iZXIgPSBwUmVwbHktPkhlYWRlci5QYWdlTnVtYmVyOwotCQkJCQlwQ2ZnLT5oZHItPlBhZ2VUeXBlID0gcFJlcGx5LT5IZWFkZXIuUGFnZVR5cGU7CisJCQkJCWlmICgocFJlcGx5LT5IZWFkZXIuUGFnZVR5cGUgJgorCQkJCQkgICAgTVBJX0NPTkZJR19QQUdFVFlQRV9NQVNLKSA9PQorCQkJCQkgICAgTVBJX0NPTkZJR19QQUdFVFlQRV9FWFRFTkRFRCkgeworCQkJCQkJcENmZy0+Y2ZnaGRyLmVoZHItPkV4dFBhZ2VMZW5ndGggPQorCQkJCQkJICAgIGxlMTZfdG9fY3B1KHBSZXBseS0+RXh0UGFnZUxlbmd0aCk7CisJCQkJCQlwQ2ZnLT5jZmdoZHIuZWhkci0+RXh0UGFnZVR5cGUgPQorCQkJCQkJICAgIHBSZXBseS0+RXh0UGFnZVR5cGU7CisJCQkJCX0KKwkJCQkJcENmZy0+Y2ZnaGRyLmhkci0+UGFnZVZlcnNpb24gPSBwUmVwbHktPkhlYWRlci5QYWdlVmVyc2lvbjsKKworCQkJCQkvKiBJZiB0aGlzIGlzIGEgcmVndWxhciBoZWFkZXIsIHNhdmUgUGFnZUxlbmd0aC4gKi8KKwkJCQkJLyogTE1QIERvIHRoaXMgYmV0dGVyIHNvIG5vdCB1c2luZyBhIHJlc2VydmVkIGZpZWxkISAqLworCQkJCQlwQ2ZnLT5jZmdoZHIuaGRyLT5QYWdlTGVuZ3RoID0gcFJlcGx5LT5IZWFkZXIuUGFnZUxlbmd0aDsKKwkJCQkJcENmZy0+Y2ZnaGRyLmhkci0+UGFnZU51bWJlciA9IHBSZXBseS0+SGVhZGVyLlBhZ2VOdW1iZXI7CisJCQkJCXBDZmctPmNmZ2hkci5oZHItPlBhZ2VUeXBlID0gcFJlcGx5LT5IZWFkZXIuUGFnZVR5cGU7CiAJCQkJfQogCQkJfQogCkBAIC03MDUsNyArNzEwLDcgQEAKIAkJaWYgKGRkX2NiZnVuYy0+cmVtb3ZlKQogCQkJZGRfY2JmdW5jLT5yZW1vdmUoaW9jLT5wY2lkZXYpOwogCX0KLQkKKwogCU1wdERldmljZURyaXZlckhhbmRsZXJzW2NiX2lkeF0gPSBOVUxMOwogfQogCkBAIC04MTgsNyArODIzLDcgQEAKIAl9CiAjZW5kaWYKIAotCW1mX2RtYV9hZGRyID0gKGlvYy0+cmVxX2ZyYW1lc19sb3dfZG1hICsgcmVxX29mZnNldCkgfCBpb2MtPlJlcXVlc3ROQltyZXFfaWR4XTsgIAorCW1mX2RtYV9hZGRyID0gKGlvYy0+cmVxX2ZyYW1lc19sb3dfZG1hICsgcmVxX29mZnNldCkgfCBpb2MtPlJlcXVlc3ROQltyZXFfaWR4XTsKIAlkc2dwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIm1mX2RtYV9hZGRyPSV4IHJlcV9pZHg9JWQgUmVxdWVzdE5CPSV4XG4iLCBpb2MtPm5hbWUsIG1mX2RtYV9hZGRyLCByZXFfaWR4LCBpb2MtPlJlcXVlc3ROQltyZXFfaWR4XSkpOwogCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5SZXF1ZXN0RmlmbywgbWZfZG1hX2FkZHIpOwogfQpAQCAtOTIwLDcgKzkyNSw3IEBACiAKIAkvKiBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGRvb3JiZWxscyAqLwogCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRTdGF0dXMsIDApOwotCQorCiAJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkRvb3JiZWxsLAogCQkJKChNUElfRlVOQ1RJT05fSEFORFNIQUtFPDxNUElfRE9PUkJFTExfRlVOQ1RJT05fU0hJRlQpIHwKIAkJCSAoKHJlcUJ5dGVzLzQpPDxNUElfRE9PUkJFTExfQUREX0RXT1JEU19TSElGVCkpKTsKQEAgLTkzNSwxNCArOTQwLDE0IEBACiAJCXJldHVybiAtNTsKIAogCWRoc3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBtcHRfc2VuZF9oYW5kc2hha2VfcmVxdWVzdCBzdGFydCwgV2FpdENudD0lZFxuIiwKLQkJCWlvYy0+bmFtZSwgaWkpKTsKKwkJaW9jLT5uYW1lLCBpaSkpOwogCiAJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkludFN0YXR1cywgMCk7CiAKIAlpZiAoKHIgPSBXYWl0Rm9yRG9vcmJlbGxBY2soaW9jLCA1LCBzbGVlcEZsYWcpKSA8IDApIHsKIAkJcmV0dXJuIC0yOwogCX0KLQkJCisKIAkvKiBTZW5kIHJlcXVlc3QgdmlhIGRvb3JiZWxsIGhhbmRzaGFrZSAqLwogCXJlcV9hc19ieXRlcyA9ICh1OCAqKSByZXE7CiAJZm9yIChpaSA9IDA7IGlpIDwgcmVxQnl0ZXMvNDsgaWkrKykgewpAQCAtOTg4LDkgKzk5Myw5IEBACiAJCWlmIChpb2MtPmlkID09IGlvY2lkKSB7CiAJCQkqaW9jcHAgPWlvYzsKIAkJCXJldHVybiBpb2NpZDsKLQkJfSAKKwkJfQogCX0KLQkKKwogCSppb2NwcCA9IE5VTEw7CiAJcmV0dXJuIC0xOwogfQpAQCAtMTAzMiw5ICsxMDM3LDkgQEAKIAogCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKIAkJcmV0dXJuIHI7Ci0JCisKIAlkaW5pdHByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICI6IG1wdF9hZGFwdGVyX2luc3RhbGxcbiIpKTsKLQkKKwogCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKIAkJZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNCiAJCQkiOiA2NCBCSVQgUENJIEJVUyBETUEgQUREUkVTU0lORyBTVVBQT1JURURcbiIpKTsKQEAgLTEwNTksNyArMTA2NCw3IEBACiAJaW9jLT5hbGxvY190b3RhbCA9IHNpemVvZihNUFRfQURBUFRFUik7CiAJaW9jLT5yZXFfc3ogPSBNUFRfREVGQVVMVF9GUkFNRV9TSVpFOwkJLyogYXZvaWQgZGl2IGJ5IHplcm8hICovCiAJaW9jLT5yZXBseV9zeiA9IE1QVF9SRVBMWV9GUkFNRV9TSVpFOwotCQorCiAJaW9jLT5wY2lkZXYgPSBwZGV2OwogCWlvYy0+ZGlhZ1BlbmRpbmcgPSAwOwogCXNwaW5fbG9ja19pbml0KCZpb2MtPmRpYWdMb2NrKTsKQEAgLTEwODgsNyArMTA5Myw3IEBACiAJLyogRmluZCBsb29rdXAgc2xvdC4gKi8KIAlJTklUX0xJU1RfSEVBRCgmaW9jLT5saXN0KTsKIAlpb2MtPmlkID0gbXB0X2lkcysrOwotCQorCiAJbWVtX3BoeXMgPSBtc2l6ZSA9IDA7CiAJcG9ydCA9IHBzaXplID0gMDsKIAlmb3IgKGlpPTA7IGlpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBpaSsrKSB7CkBAIC0xMTQzLDcgKzExNDgsNyBAQAogCQlpb2MtPnByb2RfbmFtZSA9ICJMU0lGQzkwOSI7CiAJCWlvYy0+YnVzX3R5cGUgPSBGQzsKIAl9Ci0JaWYgKHBkZXYtPmRldmljZSA9PSBNUElfTUFOVUZBQ1RQQUdFX0RFVklDRUlEX0ZDOTI5KSB7CisJZWxzZSBpZiAocGRldi0+ZGV2aWNlID09IE1QSV9NQU5VRkFDVFBBR0VfREVWSUNFSURfRkM5MjkpIHsKIAkJaW9jLT5wcm9kX25hbWUgPSAiTFNJRkM5MjkiOwogCQlpb2MtPmJ1c190eXBlID0gRkM7CiAJfQpAQCAtMTMyMiw3ICsxMzI3LDcgQEAKIAlyZW1vdmVfcHJvY19lbnRyeShwbmFtZSwgTlVMTCk7CiAJc3ByaW50ZihwbmFtZSwgTVBUX1BST0NGU19NUFRCQVNFRElSICIvJXMiLCBpb2MtPm5hbWUpOwogCXJlbW92ZV9wcm9jX2VudHJ5KHBuYW1lLCBOVUxMKTsKLQkKKwogCS8qIGNhbGwgcGVyIGRldmljZSBkcml2ZXIgcmVtb3ZlIGVudHJ5IHBvaW50ICovCiAJZm9yKGlpPTA7IGlpPE1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUzsgaWkrKykgewogCQlpZihNcHREZXZpY2VEcml2ZXJIYW5kbGVyc1tpaV0gJiYKQEAgLTEzMzAsNyArMTMzNSw3IEBACiAJCQlNcHREZXZpY2VEcml2ZXJIYW5kbGVyc1tpaV0tPnJlbW92ZShwZGV2KTsKIAkJfQogCX0KLQkKKwogCS8qIERpc2FibGUgaW50ZXJydXB0cyEgKi8KIAlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50TWFzaywgMHhGRkZGRkZGRik7CiAKQEAgLTE0MDMsNyArMTQwOCw3IEBACiAJdTMyIGRldmljZV9zdGF0ZSA9IHBkZXYtPmN1cnJlbnRfc3RhdGU7CiAJaW50IHJlY292ZXJ5X3N0YXRlOwogCWludCBpaTsKLQkKKwogCXByaW50ayhNWUlPQ19zX0lORk9fRk1UCiAJInBjaS1yZXN1bWU6IHBkZXY9MHglcCwgc2xvdD0lcywgUHJldmlvdXMgb3BlcmF0aW5nIHN0YXRlIFtEJWRdXG4iLAogCQlpb2MtPm5hbWUsIHBkZXYsIHBjaV9uYW1lKHBkZXYpLCBkZXZpY2Vfc3RhdGUpOwpAQCAtMTUzNCw3ICsxNTM5LDcgQEAKIAkJaWYgKChyYyA9IEdldElvY0ZhY3RzKGlvYywgc2xlZXBGbGFnLCByZWFzb24pKSA9PSAwKQogCQkJYnJlYWs7CiAJfQotCQorCiAKIAlpZiAoaWkgPT0gNSkgewogCQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiUmV0cnkgSW9jRmFjdHMgZmFpbGVkIHJjPSV4XG4iLCBpb2MtPm5hbWUsIHJjKSk7CkBAIC0xNTQyLDcgKzE1NDcsNyBAQAogCX0gZWxzZSBpZiAocmVhc29uID09IE1QVF9IT1NURVZFTlRfSU9DX0JSSU5HVVApIHsKIAkJTXB0RGlzcGxheUlvY0NhcGFiaWxpdGllcyhpb2MpOwogCX0KLQkKKwogCWlmIChhbHRfaW9jX3JlYWR5KSB7CiAJCWlmICgocmMgPSBHZXRJb2NGYWN0cyhpb2MtPmFsdF9pb2MsIHNsZWVwRmxhZywgcmVhc29uKSkgIT0gMCkgewogCQkJZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkluaXRpYWwgQWx0IElvY0ZhY3RzIGZhaWxlZCByYz0leFxuIiwgaW9jLT5uYW1lLCByYykpOwpAQCAtMTYxMyw3ICsxNjE4LDcgQEAKIAogCWlmIChyZXNldF9hbHRfaW9jX2FjdGl2ZSAmJiBpb2MtPmFsdF9pb2MpIHsKIAkJLyogKHJlKUVuYWJsZSBhbHQtSU9DISAocmVwbHkgaW50ZXJydXB0KSAqLwotCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogYWx0LSVzIHJlcGx5IGlycSByZS1lbmFibGVkXG4iLAorCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IGFsdC0lcyByZXBseSBpcnEgcmUtZW5hYmxlZFxuIiwKIAkJCQlpb2MtPmFsdF9pb2MtPm5hbWUpKTsKIAkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmFsdF9pb2MtPmNoaXAtPkludE1hc2ssIH4oTVBJX0hJTV9SSU0pKTsKIAkJaW9jLT5hbHRfaW9jLT5hY3RpdmUgPSAxOwpAQCAtMTY3MCw3ICsxNjc1LDcgQEAKIAogCQkJLyogRmluZCBJTSB2b2x1bWVzCiAJCQkgKi8KLQkJCWlmIChpb2MtPmZhY3RzLk1zZ1ZlcnNpb24gPj0gMHgwMTAyKQorCQkJaWYgKGlvYy0+ZmFjdHMuTXNnVmVyc2lvbiA+PSBNUElfVkVSU0lPTl8wMV8wMikKIAkJCQltcHRfZmluZEltVm9sdW1lcyhpb2MpOwogCiAJCQkvKiBDaGVjaywgYW5kIHBvc3NpYmx5IHJlc2V0LCB0aGUgY29hbGVzY2luZyB2YWx1ZQpAQCAtMTcwMCw3ICsxNzA1LDcgQEAKIAkJCX0KIAogCQkJaWYgKGFsdF9pb2NfcmVhZHkgJiYgTXB0UmVzZXRIYW5kbGVyc1tpaV0pIHsKLQkJCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJDYWxsaW5nIGFsdC0lcyBwb3N0X3Jlc2V0IGhhbmRsZXIgIyVkXG4iLAorCQkJCWRyc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiQ2FsbGluZyBhbHQtJXMgcG9zdF9yZXNldCBoYW5kbGVyICMlZFxuIiwKIAkJCQkJCWlvYy0+bmFtZSwgaW9jLT5hbHRfaW9jLT5uYW1lLCBpaSkpOwogCQkJCXJjICs9ICgqKE1wdFJlc2V0SGFuZGxlcnNbaWldKSkoaW9jLT5hbHRfaW9jLCBNUFRfSU9DX1BPU1RfUkVTRVQpOwogCQkJCWhhbmRsZXJzKys7CkBAIC0xNzMzLDggKzE3MzgsOCBAQAogCiAJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiUENJIGRldmljZSAlcyBkZXZmbj0leC8leCwiCiAJICAgICIgc2VhcmNoaW5nIGZvciBkZXZmbiBtYXRjaCBvbiAleCBvciAleFxuIiwKLQkJaW9jLT5uYW1lLCBwY2lfbmFtZShwZGV2KSwgcGRldi0+ZGV2Zm4sCi0JCWZ1bmMtMSwgZnVuYysxKSk7CisJCWlvYy0+bmFtZSwgcGNpX25hbWUocGRldiksIHBkZXYtPmJ1cy0+bnVtYmVyLAorCQlwZGV2LT5kZXZmbiwgZnVuYy0xLCBmdW5jKzEpKTsKIAogCXBlZXIgPSBwY2lfZ2V0X3Nsb3QocGRldi0+YnVzLCBQQ0lfREVWRk4oc2xvdCxmdW5jLTEpKTsKIAlpZiAoIXBlZXIpIHsKQEAgLTE4NjEsMzYgKzE4NjYsMzkgQEAKIHN0YXRpYyB2b2lkCiBtcHRfYWRhcHRlcl9kaXNwb3NlKE1QVF9BREFQVEVSICppb2MpCiB7Ci0JaWYgKGlvYyAhPSBOVUxMKSB7Ci0JCWludCBzel9maXJzdCwgc3pfbGFzdDsKKwlpbnQgc3pfZmlyc3QsIHN6X2xhc3Q7CiAKLQkJc3pfZmlyc3QgPSBpb2MtPmFsbG9jX3RvdGFsOworCWlmIChpb2MgPT0gTlVMTCkKKwkJcmV0dXJuOwogCi0JCW1wdF9hZGFwdGVyX2Rpc2FibGUoaW9jKTsKKwlzel9maXJzdCA9IGlvYy0+YWxsb2NfdG90YWw7CiAKLQkJaWYgKGlvYy0+cGNpX2lycSAhPSAtMSkgewotCQkJZnJlZV9pcnEoaW9jLT5wY2lfaXJxLCBpb2MpOwotCQkJaW9jLT5wY2lfaXJxID0gLTE7Ci0JCX0KKwltcHRfYWRhcHRlcl9kaXNhYmxlKGlvYyk7CiAKLQkJaWYgKGlvYy0+bWVtbWFwICE9IE5VTEwpCi0JCQlpb3VubWFwKGlvYy0+bWVtbWFwKTsKKwlpZiAoaW9jLT5wY2lfaXJxICE9IC0xKSB7CisJCWZyZWVfaXJxKGlvYy0+cGNpX2lycSwgaW9jKTsKKwkJaW9jLT5wY2lfaXJxID0gLTE7CisJfQorCisJaWYgKGlvYy0+bWVtbWFwICE9IE5VTEwpIHsKKwkJaW91bm1hcChpb2MtPm1lbW1hcCk7CisJCWlvYy0+bWVtbWFwID0gTlVMTDsKKwl9CiAKICNpZiBkZWZpbmVkKENPTkZJR19NVFJSKSAmJiAwCi0JCWlmIChpb2MtPm10cnJfcmVnID4gMCkgewotCQkJbXRycl9kZWwoaW9jLT5tdHJyX3JlZywgMCwgMCk7Ci0JCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IE1UUlIgcmVnaW9uIGRlLXJlZ2lzdGVyZWRcbiIsIGlvYy0+bmFtZSkpOwotCQl9CisJaWYgKGlvYy0+bXRycl9yZWcgPiAwKSB7CisJCW10cnJfZGVsKGlvYy0+bXRycl9yZWcsIDAsIDApOworCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IE1UUlIgcmVnaW9uIGRlLXJlZ2lzdGVyZWRcbiIsIGlvYy0+bmFtZSkpOworCX0KICNlbmRpZgogCi0JCS8qICBaYXAgdGhlIGFkYXB0ZXIgbG9va3VwIHB0ciEgICovCi0JCWxpc3RfZGVsKCZpb2MtPmxpc3QpOworCS8qICBaYXAgdGhlIGFkYXB0ZXIgbG9va3VwIHB0ciEgICovCisJbGlzdF9kZWwoJmlvYy0+bGlzdCk7CiAKLQkJc3pfbGFzdCA9IGlvYy0+YWxsb2NfdG90YWw7Ci0JCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlczogZnJlZSdkICVkIG9mICVkIGJ5dGVzXG4iLAotCQkJCWlvYy0+bmFtZSwgc3pfZmlyc3Qtc3pfbGFzdCsoaW50KXNpemVvZigqaW9jKSwgc3pfZmlyc3QpKTsKLQkJa2ZyZWUoaW9jKTsKLQl9CisJc3pfbGFzdCA9IGlvYy0+YWxsb2NfdG90YWw7CisJZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBmcmVlJ2QgJWQgb2YgJWQgYnl0ZXNcbiIsCisJCQlpb2MtPm5hbWUsIHN6X2ZpcnN0LXN6X2xhc3QrKGludClzaXplb2YoKmlvYyksIHN6X2ZpcnN0KSk7CisJa2ZyZWUoaW9jKTsKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwpAQCAtMTk3Nyw3ICsxOTg1LDcgQEAKIAl9CiAKIAkvKiBJcyBpdCBhbHJlYWR5IFJFQURZPyAqLwotCWlmICghc3RhdGVmYXVsdCAmJiAoaW9jX3N0YXRlICYgTVBJX0lPQ19TVEFURV9NQVNLKSA9PSBNUElfSU9DX1NUQVRFX1JFQURZKSAKKwlpZiAoIXN0YXRlZmF1bHQgJiYgKGlvY19zdGF0ZSAmIE1QSV9JT0NfU1RBVEVfTUFTSykgPT0gTVBJX0lPQ19TVEFURV9SRUFEWSkKIAkJcmV0dXJuIDA7CiAKIAkvKgpAQCAtMTk5NSw3ICsyMDAzLDcgQEAKIAkgKglIbW1tLi4uICBEaWQgaXQgZ2V0IGxlZnQgb3BlcmF0aW9uYWw/CiAJICovCiAJaWYgKChpb2Nfc3RhdGUgJiBNUElfSU9DX1NUQVRFX01BU0spID09IE1QSV9JT0NfU1RBVEVfT1BFUkFUSU9OQUwpIHsKLQkJZGluaXRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIklPQyBvcGVyYXRpb25hbCB1bmV4cGVjdGVkXG4iLAorCQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSU9DIG9wZXJhdGlvbmFsIHVuZXhwZWN0ZWRcbiIsCiAJCQkJaW9jLT5uYW1lKSk7CiAKIAkJLyogQ2hlY2sgV2hvSW5pdC4KQEAgLTIwMDQsOCArMjAxMiw4IEBACiAJCSAqIEVsc2UsIGZhbGwgdGhyb3VnaCB0byBLaWNrU3RhcnQgY2FzZQogCQkgKi8KIAkJd2hvaW5pdCA9IChpb2Nfc3RhdGUgJiBNUElfRE9PUkJFTExfV0hPX0lOSVRfTUFTSykgPj4gTVBJX0RPT1JCRUxMX1dIT19JTklUX1NISUZUOwotCQlkcHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0KLQkJCSI6IHdob2luaXQgMHgleFxuIHN0YXRlZmF1bHQgJWQgZm9yY2UgJWRcbiIsCisJCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0KKwkJCSI6IHdob2luaXQgMHgleCBzdGF0ZWZhdWx0ICVkIGZvcmNlICVkXG4iLAogCQkJd2hvaW5pdCwgc3RhdGVmYXVsdCwgZm9yY2UpKTsKIAkJaWYgKHdob2luaXQgPT0gTVBJX1dIT0lOSVRfUENJX1BFRVIpCiAJCQlyZXR1cm4gLTQ7CkBAIC0yMTQwLDggKzIxNDgsOCBAQAogCWdldF9mYWN0cy5GdW5jdGlvbiA9IE1QSV9GVU5DVElPTl9JT0NfRkFDVFM7CiAJLyogQXNzZXJ0OiBBbGwgb3RoZXIgZ2V0X2ZhY3RzIGZpZWxkcyBhcmUgemVybyEgKi8KIAotCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UIAotCSAgICAiU2VuZGluZyBnZXQgSW9jRmFjdHMgcmVxdWVzdCByZXFfc3o9JWQgcmVwbHlfc3o9JWRcbiIsIAorCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJICAgICJTZW5kaW5nIGdldCBJb2NGYWN0cyByZXF1ZXN0IHJlcV9zej0lZCByZXBseV9zej0lZFxuIiwKIAkgICAgaW9jLT5uYW1lLCByZXFfc3osIHJlcGx5X3N6KSk7CiAKIAkvKiBObyBub24temVybyBmaWVsZHMgaW4gdGhlIGdldF9mYWN0cyByZXF1ZXN0IGFyZSBncmVhdGVyIHRoYW4KQEAgLTIxNzQsNyArMjE4Miw3IEBACiAJCWZhY3RzLT5JT0NFeGNlcHRpb25zID0gbGUxNl90b19jcHUoZmFjdHMtPklPQ0V4Y2VwdGlvbnMpOwogCQlmYWN0cy0+SU9DU3RhdHVzID0gbGUxNl90b19jcHUoZmFjdHMtPklPQ1N0YXR1cyk7CiAJCWZhY3RzLT5JT0NMb2dJbmZvID0gbGUzMl90b19jcHUoZmFjdHMtPklPQ0xvZ0luZm8pOwotCQlzdGF0dXMgPSBmYWN0cy0+SU9DU3RhdHVzICYgTVBJX0lPQ1NUQVRVU19NQVNLOworCQlzdGF0dXMgPSBsZTE2X3RvX2NwdShmYWN0cy0+SU9DU3RhdHVzKSAmIE1QSV9JT0NTVEFUVVNfTUFTSzsKIAkJLyogQ0hFQ0tNRSEgSU9DU3RhdHVzLCBJT0NMb2dJbmZvICovCiAKIAkJZmFjdHMtPlJlcGx5UXVldWVEZXB0aCA9IGxlMTZfdG9fY3B1KGZhY3RzLT5SZXBseVF1ZXVlRGVwdGgpOwpAQCAtMjIyMSw3ICsyMjI5LDcgQEAKIAkJaWYgKCBzeiAmIDB4MDIgKQogCQkJc3ogKz0gMjsKIAkJZmFjdHMtPkZXSW1hZ2VTaXplID0gc3o7Ci0JCQorCiAJCWlmICghZmFjdHMtPlJlcXVlc3RGcmFtZVNpemUpIHsKIAkJCS8qICBTb21ldGhpbmcgaXMgd3JvbmchICAqLwogCQkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAiSU9DIHJlcG9ydGVkIGludmFsaWQgMCByZXF1ZXN0IHNpemUhXG4iLApAQCAtMjI0MCw3ICsyMjQ4LDcgQEAKIAkJaW9jLT5OQlNoaWZ0RmFjdG9yICA9IHNoaWZ0RmFjdG9yOwogCQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiTkJfZm9yXzY0X2J5dGVfZnJhbWU9JXggTkJTaGlmdEZhY3Rvcj0leCBCbG9ja1NpemU9JXhcbiIsCiAJCQkJCWlvYy0+bmFtZSwgdnYsIHNoaWZ0RmFjdG9yLCByKSk7Ci0gICAgCisKIAkJaWYgKHJlYXNvbiA9PSBNUFRfSE9TVEVWRU5UX0lPQ19CUklOR1VQKSB7CiAJCQkvKgogCQkJICogU2V0IHZhbHVlcyBmb3IgdGhpcyBJT0MncyByZXF1ZXN0ICYgcmVwbHkgZnJhbWUgc2l6ZXMsCkBAIC0yMjYxLDcgKzIyNjksNyBAQAogCQkJCXJldHVybiByOwogCQl9CiAJfSBlbHNlIHsKLQkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAKKwkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVAogCQkgICAgICJJbnZhbGlkIElPQyBmYWN0cyByZXBseSwgbXNnTGVuZ3RoPSVkIG9mZnNldG9mPSV6ZCFcbiIsCiAJCSAgICAgaW9jLT5uYW1lLCBmYWN0cy0+TXNnTGVuZ3RoLCAob2Zmc2V0b2YoSU9DRmFjdHNSZXBseV90LAogCQkgICAgIFJlcXVlc3RGcmFtZVNpemUpL3NpemVvZih1MzIpKSk7CkBAIC0yNDEzLDkgKzI0MjEsMTEgQEAKIAogCWRoc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBQb3J0RW5hYmxlIChyZXEgQCAlcClcbiIsCiAJCQlpb2MtPm5hbWUsICZpb2NfaW5pdCkpOwotCQotCWlmICgociA9IFNlbmRQb3J0RW5hYmxlKGlvYywgMCwgc2xlZXBGbGFnKSkgIT0gMCkKKworCWlmICgociA9IFNlbmRQb3J0RW5hYmxlKGlvYywgMCwgc2xlZXBGbGFnKSkgIT0gMCkgeworCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJTZW5kaW5nIFBvcnRFbmFibGUgZmFpbGVkKCVkKSFcbiIsaW9jLT5uYW1lLCByKTsKIAkJcmV0dXJuIHI7CisJfQogCiAJLyogWUlLRVMhICBTVVBFUiBJTVBPUlRBTlQhISEKIAkgKiAgUG9sbCBJb2NTdGF0ZSB1bnRpbCBfT1BFUkFUSU9OQUwgd2hpbGUgSU9DIGlzIGRvaW5nCkBAIC0yNDQwLDcgKzI0NTAsNyBAQAogCQlzdGF0ZSA9IG1wdF9HZXRJb2NTdGF0ZShpb2MsIDEpOwogCQljb3VudCsrOwogCX0KLQlkaHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIklORk8gLSBXYWl0IElPQ19PUEVSQVRJT05BTCBzdGF0ZSAoY250PSVkKVxuIiwKKwlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSU5GTyAtIFdhaXQgSU9DX09QRVJBVElPTkFMIHN0YXRlIChjbnQ9JWQpXG4iLAogCQkJaW9jLT5uYW1lLCBjb3VudCkpOwogCiAJcmV0dXJuIHI7CkBAIC0yNTI5LDcgKzI1MzksNyBAQAogCWludCBzejsKIAogCXN6ID0gaW9jLT5mYWN0cy5GV0ltYWdlU2l6ZTsKLQlkaW5pdHByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICJmcmVlX2Z3X21lbW9yeTogRlcgSW1hZ2UgIEAgJXBbJXBdLCBzej0lZFsleF0gYnl0ZXNcbiIsCisJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiZnJlZV9md19tZW1vcnk6IEZXIEltYWdlICBAICVwWyVwXSwgc3o9JWRbJXhdIGJ5dGVzXG4iLAogCQkgaW9jLT5jYWNoZWRfZncsICh2b2lkICopKHVsb25nKWlvYy0+Y2FjaGVkX2Z3X2RtYSwgc3osIHN6KSk7CiAJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgc3osCiAJCQlpb2MtPmNhY2hlZF9mdywgaW9jLT5jYWNoZWRfZndfZG1hKTsKQEAgLTI1NzMsOSArMjU4Myw5IEBACiAKIAltcHRfYWxsb2NfZndfbWVtb3J5KGlvYywgc3opOwogCi0JZGluaXRwcmludGsoKEtFUk5fV0FSTklORyBNWU5BTSAiOiBGVyBJbWFnZSAgQCAlcFslcF0sIHN6PSVkWyV4XSBieXRlc1xuIiwKKwlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IEZXIEltYWdlICBAICVwWyVwXSwgc3o9JWRbJXhdIGJ5dGVzXG4iLAogCQkgaW9jLT5jYWNoZWRfZncsICh2b2lkICopKHVsb25nKWlvYy0+Y2FjaGVkX2Z3X2RtYSwgc3osIHN6KSk7Ci0JCisKIAlpZiAoaW9jLT5jYWNoZWRfZncgPT0gTlVMTCkgewogCQkvKiBNYWpvciBGYWlsdXJlLgogCQkgKi8KQEAgLTI2MDUsMTQgKzI2MTUsMTQgQEAKIAltcHRfYWRkX3NnZSgmcmVxdWVzdFtzZ2VvZmZzZXRdLCBmbGFnc0xlbmd0aCwgaW9jLT5jYWNoZWRfZndfZG1hKTsKIAogCXNnZW9mZnNldCArPSBzaXplb2YodTMyKSArIHNpemVvZihkbWFfYWRkcl90KTsKLQlkaW5pdHByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICJTZW5kaW5nIEZXIFVwbG9hZCAocmVxIEAgJXApIHNnZW9mZnNldD0lZCBcbiIsCisJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBTZW5kaW5nIEZXIFVwbG9hZCAocmVxIEAgJXApIHNnZW9mZnNldD0lZCBcbiIsCiAJCQlwcmVxdWVzdCwgc2dlb2Zmc2V0KSk7CiAJREJHX0RVTVBfRldfUkVRVUVTVF9GUkFNRShwcmVxdWVzdCkKIAogCWlpID0gbXB0X2hhbmRzaGFrZV9yZXFfcmVwbHlfd2FpdChpb2MsIHNnZW9mZnNldCwgKHUzMiopcHJlcXVlc3QsCiAJCQkJcmVwbHlfc3osICh1MTYqKXByZXBseSwgNjUgLypzZWNvbmRzKi8sIHNsZWVwRmxhZyk7CiAKLQlkaW5pdHByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICJGVyBVcGxvYWQgY29tcGxldGVkIHJjPSV4IFxuIiwgaWkpKTsKKwlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IEZXIFVwbG9hZCBjb21wbGV0ZWQgcmM9JXggXG4iLCBpaSkpOwogCiAJY21kU3RhdHVzID0gLUVGQVVMVDsKIAlpZiAoaWkgPT0gMCkgewpAQCAtMjYyNywxMCArMjYzNywxMCBAQAogCQkJCWNtZFN0YXR1cyA9IDA7CiAJCX0KIAl9Ci0JZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIjogZG9fdXBsb2FkIHN0YXR1cyAlZCBcbiIsCisJZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIjogZG9fdXBsb2FkIGNtZFN0YXR1cz0lZCBcbiIsCiAJCQlpb2MtPm5hbWUsIGNtZFN0YXR1cykpOwogCi0JCisKIAlpZiAoY21kU3RhdHVzKSB7CiAKIAkJZGRscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICI6IGZ3IHVwbG9hZCBmYWlsZWQsIGZyZWVpbmcgaW1hZ2UgXG4iLApAQCAtMjc2MSw4ICsyNzcxLDggQEAKIAkJZndTaXplID0gKHBFeHRJbWFnZS0+SW1hZ2VTaXplICsgMykgPj4gMjsKIAkJcHRyRncgPSAodTMyICopcEV4dEltYWdlOwogCi0JCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiV3JpdGUgRXh0IEltYWdlOiAweCV4IGJ5dGVzIEAgJXAgbG9hZF9hZGRyPSV4XG4iLAotCQkJCQkJaW9jLT5uYW1lLCBmd1NpemUqNCwgcHRyRncsIGxvYWRfYWRkcikpOworCQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldyaXRlIEV4dCBJbWFnZTogMHgleCAoJWQpIGJ5dGVzIEAgJXAgbG9hZF9hZGRyPSV4XG4iLAorCQkJCQkJaW9jLT5uYW1lLCBmd1NpemUqNCwgZndTaXplKjQsIHB0ckZ3LCBsb2FkX2FkZHIpKTsKIAkJQ0hJUFJFR19QSU9fV1JJVEUzMigmaW9jLT5waW9fY2hpcC0+RGlhZ1J3QWRkcmVzcywgbG9hZF9hZGRyKTsKIAogCQl3aGlsZSAoZndTaXplLS0pIHsKQEAgLTI4NDUsOSArMjg1NSw5IEBACiAgKgkJCSAgMCBlbHNlCiAgKgogICoJUmV0dXJuczoKLSAqCQkgMSAtIGhhcmQgcmVzZXQsIFJFQURZCQotICoJCSAwIC0gbm8gcmVzZXQgZHVlIHRvIEhpc3RvcnkgYml0LCBSRUFEWQkKLSAqCQktMSAtIG5vIHJlc2V0IGR1ZSB0byBIaXN0b3J5IGJpdCBidXQgbm90IFJFQURZCQorICoJCSAxIC0gaGFyZCByZXNldCwgUkVBRFkKKyAqCQkgMCAtIG5vIHJlc2V0IGR1ZSB0byBIaXN0b3J5IGJpdCwgUkVBRFkKKyAqCQktMSAtIG5vIHJlc2V0IGR1ZSB0byBIaXN0b3J5IGJpdCBidXQgbm90IFJFQURZCiAgKgkJICAgICBPUiByZXNldCBidXQgZmFpbGVkIHRvIGNvbWUgUkVBRFkKICAqCQktMiAtIG5vIHJlc2V0LCBjb3VsZCBub3QgZW50ZXIgRElBRyBtb2RlCiAgKgkJLTMgLSByZXNldCBidXQgYmFkIEZXIGJpdApAQCAtMjk5MCw3ICszMDAwLDcgQEAKIAkJICoKIAkJICovCiAJCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5EaWFnbm9zdGljLCBkaWFnMHZhbCB8IE1QSV9ESUFHX0RJU0FCTEVfQVJNKTsKLQkJbWRlbGF5ICgxKTsKKwkJbWRlbGF5KDEpOwogCiAJCS8qCiAJCSAqIE5vdyBoaXQgdGhlIHJlc2V0IGJpdCBpbiB0aGUgRGlhZ25vc3RpYyByZWdpc3RlcgpAQCAtMzE3MCw3ICszMTgwLDcgQEAKIAl1MzIgc3RhdGU7CiAJaW50IGNudGRuLCBjb3VudDsKIAotCWRyc3ByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICI6ICVzOiBTZW5kaW5nIElPQyByZXNldCgweCUwMngpIVxuIiwKKwlkcnNwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlczogU2VuZGluZyBJT0MgcmVzZXQoMHglMDJ4KSFcbiIsCiAJCQlpb2MtPm5hbWUsIHJlc2V0X3R5cGUpKTsKIAlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+RG9vcmJlbGwsIHJlc2V0X3R5cGU8PE1QSV9ET09SQkVMTF9GVU5DVElPTl9TSElGVCk7CiAJaWYgKChyID0gV2FpdEZvckRvb3JiZWxsQWNrKGlvYywgNSwgc2xlZXBGbGFnKSkgPCAwKQpAQCAtMzM3NCw2ICszMzg0LDkgQEAKIAkJaW9jLT5yZXBseV9mcmFtZXMgPSAoTVBUX0ZSQU1FX0hEUiAqKSBtZW07CiAJCWlvYy0+cmVwbHlfZnJhbWVzX2xvd19kbWEgPSAodTMyKSAoYWxsb2NfZG1hICYgMHhGRkZGRkZGRik7CiAKKwkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcyBSZXBseUJ1ZmZlcnMgQCAlcFslcF1cbiIsCisJIAkJaW9jLT5uYW1lLCBpb2MtPnJlcGx5X2ZyYW1lcywgKHZvaWQgKikodWxvbmcpYWxsb2NfZG1hKSk7CisKIAkJYWxsb2NfZG1hICs9IHJlcGx5X3N6OwogCQltZW0gKz0gcmVwbHlfc3o7CiAKQEAgLTMzODIsNyArMzM5NSw3IEBACiAJCWlvYy0+cmVxX2ZyYW1lcyA9IChNUFRfRlJBTUVfSERSICopIG1lbTsKIAkJaW9jLT5yZXFfZnJhbWVzX2RtYSA9IGFsbG9jX2RtYTsKIAotCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLlJlcXVlc3RCdWZmZXJzIEAgJXBbJXBdXG4iLAorCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzIFJlcXVlc3RCdWZmZXJzIEAgJXBbJXBdXG4iLAogCQkJIAlpb2MtPm5hbWUsIG1lbSwgKHZvaWQgKikodWxvbmcpYWxsb2NfZG1hKSk7CiAKIAkJaW9jLT5yZXFfZnJhbWVzX2xvd19kbWEgPSAodTMyKSAoYWxsb2NfZG1hICYgMHhGRkZGRkZGRik7CkBAIC0zNDA4LDcgKzM0MjEsNyBAQAogCQlpb2MtPkNoYWluQnVmZmVyID0gbWVtOwogCQlpb2MtPkNoYWluQnVmZmVyRE1BID0gYWxsb2NfZG1hOwogCi0JCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIiA6JXMuQ2hhaW5CdWZmZXJzIEAgJXAoJXApXG4iLAorCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICIgOiVzIENoYWluQnVmZmVycyBAICVwKCVwKVxuIiwKIAkJCWlvYy0+bmFtZSwgaW9jLT5DaGFpbkJ1ZmZlciwgKHZvaWQgKikodWxvbmcpaW9jLT5DaGFpbkJ1ZmZlckRNQSkpOwogCiAJCS8qIEluaXRpYWxpemUgdGhlIGZyZWUgY2hhaW4gUS4KQEAgLTM1MTMsNyArMzUyNiw3IEBACiAgKi8KIHN0YXRpYyBpbnQKIG1wdF9oYW5kc2hha2VfcmVxX3JlcGx5X3dhaXQoTVBUX0FEQVBURVIgKmlvYywgaW50IHJlcUJ5dGVzLCB1MzIgKnJlcSwKLQkJCQlpbnQgcmVwbHlCeXRlcywgdTE2ICp1MTZyZXBseSwgaW50IG1heHdhaXQsIGludCBzbGVlcEZsYWcpCisJCWludCByZXBseUJ5dGVzLCB1MTYgKnUxNnJlcGx5LCBpbnQgbWF4d2FpdCwgaW50IHNsZWVwRmxhZykKIHsKIAlNUElEZWZhdWx0UmVwbHlfdCAqbXB0UmVwbHk7CiAJaW50IGZhaWxjbnQgPSAwOwpAQCAtMzU4OCw3ICszNjAxLDcgQEAKIAkJICovCiAJCWlmICghZmFpbGNudCAmJiAodCA9IFdhaXRGb3JEb29yYmVsbFJlcGx5KGlvYywgbWF4d2FpdCwgc2xlZXBGbGFnKSkgPCAwKQogCQkJZmFpbGNudCsrOwotCQkKKwogCQlkaHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkhhbmRTaGFrZSByZXBseSBjb3VudD0lZCVzXG4iLAogCQkJCWlvYy0+bmFtZSwgdCwgZmFpbGNudCA/ICIgLSBNSVNTSU5HIERPT1JCRUxMIFJFUExZISIgOiAiIikpOwogCkBAIC0zNzQ3LDcgKzM3NjAsNyBAQAogCX0KIAogCWRoc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiV2FpdENudD0lZCBGaXJzdCBoYW5kc2hha2UgcmVwbHkgd29yZD0lMDh4JXNcbiIsCi0JCQlpb2MtPm5hbWUsIHQsIGxlMzJfdG9fY3B1KCoodTMyICopaHNfcmVwbHkpLCAKKwkJCWlvYy0+bmFtZSwgdCwgbGUzMl90b19jcHUoKih1MzIgKiloc19yZXBseSksCiAJCQlmYWlsY250ID8gIiAtIE1JU1NJTkcgRE9PUkJFTEwgSEFORFNIQUtFISIgOiAiIikpOwogCiAJLyoKQEAgLTM4MTksNyArMzgzMiw3IEBACiAJaGRyLlBhZ2VMZW5ndGggPSAwOwogCWhkci5QYWdlTnVtYmVyID0gMDsKIAloZHIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX0xBTjsKLQljZmcuaGRyID0gJmhkcjsKKwljZmcuY2ZnaGRyLmhkciA9ICZoZHI7CiAJY2ZnLnBoeXNBZGRyID0gLTE7CiAJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOwogCWNmZy5kaXIgPSAwOwpAQCAtMzg2Myw3ICszODc2LDcgQEAKIAloZHIuUGFnZUxlbmd0aCA9IDA7CiAJaGRyLlBhZ2VOdW1iZXIgPSAxOwogCWhkci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfTEFOOwotCWNmZy5oZHIgPSAmaGRyOworCWNmZy5jZmdoZHIuaGRyID0gJmhkcjsKIAljZmcucGh5c0FkZHIgPSAtMTsKIAljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CiAJY2ZnLmRpciA9IDA7CkBAIC0zOTMwLDcgKzM5NDMsNyBAQAogCWhkci5QYWdlTGVuZ3RoID0gMDsKIAloZHIuUGFnZU51bWJlciA9IDA7CiAJaGRyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9GQ19QT1JUOwotCWNmZy5oZHIgPSAmaGRyOworCWNmZy5jZmdoZHIuaGRyID0gJmhkcjsKIAljZmcucGh5c0FkZHIgPSAtMTsKIAljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CiAJY2ZnLmRpciA9IDA7CkBAIC00MDEyLDcgKzQwMjUsNyBAQAogCWhkci5QYWdlTGVuZ3RoID0gMDsKIAloZHIuUGFnZU51bWJlciA9IDI7CiAJaGRyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9JT19VTklUOwotCWNmZy5oZHIgPSAmaGRyOworCWNmZy5jZmdoZHIuaGRyID0gJmhkcjsKIAljZmcucGh5c0FkZHIgPSAtMTsKIAljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CiAJY2ZnLmRpciA9IDA7CkBAIC00MTAyLDcgKzQxMTUsNyBAQAogCWhlYWRlci5QYWdlTGVuZ3RoID0gMDsKIAloZWFkZXIuUGFnZU51bWJlciA9IDA7CiAJaGVhZGVyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9TQ1NJX1BPUlQ7Ci0JY2ZnLmhkciA9ICZoZWFkZXI7CisJY2ZnLmNmZ2hkci5oZHIgPSAmaGVhZGVyOwogCWNmZy5waHlzQWRkciA9IC0xOwogCWNmZy5wYWdlQWRkciA9IHBvcnRudW07CiAJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOwpAQCAtNDEyMiw2ICs0MTM1LDggQEAKIAkJCQlpb2MtPnNwaV9kYXRhLm1pblN5bmNGYWN0b3IgPSBNUFRfQVNZTkM7CiAJCQkJaW9jLT5zcGlfZGF0YS5idXNUeXBlID0gTVBUX0hPU1RfQlVTX1VOS05PV047CiAJCQkJcmMgPSAxOworCQkJCWRkdnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiVW5hYmxlIHRvIHJlYWQgUG9ydFBhZ2UwIG1pblN5bmNGYWN0b3I9JXhcbiIsCisJCQkJCWlvYy0+bmFtZSwgaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yKSk7CiAJCQl9IGVsc2UgewogCQkJCS8qIFNhdmUgdGhlIFBvcnQgUGFnZSAwIGRhdGEKIAkJCQkgKi8KQEAgLTQxMzEsNyArNDE0Niw3IEBACiAKIAkJCQlpZiAoIChwUFAwLT5DYXBhYmlsaXRpZXMgJiBNUElfU0NTSVBPUlRQQUdFMF9DQVBfUUFTKSA9PSAwICkgewogCQkJCQlpb2MtPnNwaV9kYXRhLm5vUWFzIHw9IE1QVF9UQVJHRVRfTk9fTkVHT19RQVM7Ci0JCQkJCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIiA6JXMgbm9RYXMgZHVlIHRvIENhcGFiaWxpdGllcz0leFxuIiwKKwkJCQkJZGR2cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIiA6JXMgbm9RYXMgZHVlIHRvIENhcGFiaWxpdGllcz0leFxuIiwKIAkJCQkJCWlvYy0+bmFtZSwgcFBQMC0+Q2FwYWJpbGl0aWVzKSk7CiAJCQkJfQogCQkJCWlvYy0+c3BpX2RhdGEubWF4QnVzV2lkdGggPSBwUFAwLT5DYXBhYmlsaXRpZXMgJiBNUElfU0NTSVBPUlRQQUdFMF9DQVBfV0lERSA/IDEgOiAwOwpAQCAtNDE0MCw2ICs0MTU1LDggQEAKIAkJCQkJaW9jLT5zcGlfZGF0YS5tYXhTeW5jT2Zmc2V0ID0gKHU4KSAoZGF0YSA+PiAxNik7CiAJCQkJCWRhdGEgPSBwUFAwLT5DYXBhYmlsaXRpZXMgJiBNUElfU0NTSVBPUlRQQUdFMF9DQVBfTUlOX1NZTkNfUEVSSU9EX01BU0s7CiAJCQkJCWlvYy0+c3BpX2RhdGEubWluU3luY0ZhY3RvciA9ICh1OCkgKGRhdGEgPj4gOCk7CisJCQkJCWRkdnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiUG9ydFBhZ2UwIG1pblN5bmNGYWN0b3I9JXhcbiIsCisJCQkJCQlpb2MtPm5hbWUsIGlvYy0+c3BpX2RhdGEubWluU3luY0ZhY3RvcikpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWlvYy0+c3BpX2RhdGEubWF4U3luY09mZnNldCA9IDA7CiAJCQkJCWlvYy0+c3BpX2RhdGEubWluU3luY0ZhY3RvciA9IE1QVF9BU1lOQzsKQEAgLTQxNTIsOCArNDE2OSwxMSBAQAogCQkJCWlmICgoaW9jLT5zcGlfZGF0YS5idXNUeXBlID09IE1QSV9TQ1NJUE9SVFBBR0UwX1BIWV9TSUdOQUxfSFZEKSB8fAogCQkJCQkoaW9jLT5zcGlfZGF0YS5idXNUeXBlID09IE1QSV9TQ1NJUE9SVFBBR0UwX1BIWV9TSUdOQUxfU0UpKSAgewogCi0JCQkJaWYgKGlvYy0+c3BpX2RhdGEubWluU3luY0ZhY3RvciA8IE1QVF9VTFRSQSkKKwkJCQkJaWYgKGlvYy0+c3BpX2RhdGEubWluU3luY0ZhY3RvciA8IE1QVF9VTFRSQSkgewogCQkJCQkJaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yID0gTVBUX1VMVFJBOworCQkJCQkJZGR2cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJIVkQgb3IgU0UgZGV0ZWN0ZWQsIG1pblN5bmNGYWN0b3I9JXhcbiIsCisJCQkJCQkJaW9jLT5uYW1lLCBpb2MtPnNwaV9kYXRhLm1pblN5bmNGYWN0b3IpKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJCWlmIChwYnVmKSB7CkBAIC00MTY4LDcgKzQxODgsNyBAQAogCWhlYWRlci5QYWdlTGVuZ3RoID0gMDsKIAloZWFkZXIuUGFnZU51bWJlciA9IDI7CiAJaGVhZGVyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9TQ1NJX1BPUlQ7Ci0JY2ZnLmhkciA9ICZoZWFkZXI7CisJY2ZnLmNmZ2hkci5oZHIgPSAmaGVhZGVyOwogCWNmZy5waHlzQWRkciA9IC0xOwogCWNmZy5wYWdlQWRkciA9IHBvcnRudW07CiAJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOwpAQCAtNDIzNiw3ICs0MjU2LDcgQEAKIAloZWFkZXIuUGFnZUxlbmd0aCA9IDA7CiAJaGVhZGVyLlBhZ2VOdW1iZXIgPSAxOwogCWhlYWRlci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfU0NTSV9ERVZJQ0U7Ci0JY2ZnLmhkciA9ICZoZWFkZXI7CisJY2ZnLmNmZ2hkci5oZHIgPSAmaGVhZGVyOwogCWNmZy5waHlzQWRkciA9IC0xOwogCWNmZy5wYWdlQWRkciA9IHBvcnRudW07CiAJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOwpAQCAtNDI0NSw4ICs0MjY1LDggQEAKIAlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpICE9IDApCiAJCSByZXR1cm4gLUVGQVVMVDsKIAotCWlvYy0+c3BpX2RhdGEuc2RwMXZlcnNpb24gPSBjZmcuaGRyLT5QYWdlVmVyc2lvbjsKLQlpb2MtPnNwaV9kYXRhLnNkcDFsZW5ndGggPSBjZmcuaGRyLT5QYWdlTGVuZ3RoOworCWlvYy0+c3BpX2RhdGEuc2RwMXZlcnNpb24gPSBjZmcuY2ZnaGRyLmhkci0+UGFnZVZlcnNpb247CisJaW9jLT5zcGlfZGF0YS5zZHAxbGVuZ3RoID0gY2ZnLmNmZ2hkci5oZHItPlBhZ2VMZW5ndGg7CiAKIAloZWFkZXIuUGFnZVZlcnNpb24gPSAwOwogCWhlYWRlci5QYWdlTGVuZ3RoID0gMDsKQEAgLTQyNTUsOCArNDI3NSw4IEBACiAJaWYgKG1wdF9jb25maWcoaW9jLCAmY2ZnKSAhPSAwKQogCQkgcmV0dXJuIC1FRkFVTFQ7CiAKLQlpb2MtPnNwaV9kYXRhLnNkcDB2ZXJzaW9uID0gY2ZnLmhkci0+UGFnZVZlcnNpb247Ci0JaW9jLT5zcGlfZGF0YS5zZHAwbGVuZ3RoID0gY2ZnLmhkci0+UGFnZUxlbmd0aDsKKwlpb2MtPnNwaV9kYXRhLnNkcDB2ZXJzaW9uID0gY2ZnLmNmZ2hkci5oZHItPlBhZ2VWZXJzaW9uOworCWlvYy0+c3BpX2RhdGEuc2RwMGxlbmd0aCA9IGNmZy5jZmdoZHIuaGRyLT5QYWdlTGVuZ3RoOwogCiAJZGNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkhlYWRlcnM6IDA6IHZlcnNpb24gJWQgbGVuZ3RoICVkXG4iLAogCQkJaW9jLT5uYW1lLCBpb2MtPnNwaV9kYXRhLnNkcDB2ZXJzaW9uLCBpb2MtPnNwaV9kYXRhLnNkcDBsZW5ndGgpKTsKQEAgLTQyOTgsNyArNDMxOCw3IEBACiAJaGVhZGVyLlBhZ2VMZW5ndGggPSAwOwogCWhlYWRlci5QYWdlTnVtYmVyID0gMjsKIAloZWFkZXIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX0lPQzsKLQljZmcuaGRyID0gJmhlYWRlcjsKKwljZmcuY2ZnaGRyLmhkciA9ICZoZWFkZXI7CiAJY2ZnLnBoeXNBZGRyID0gLTE7CiAJY2ZnLnBhZ2VBZGRyID0gMDsKIAljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CkBAIC00Mzk0LDcgKzQ0MTQsNyBAQAogCWhlYWRlci5QYWdlTGVuZ3RoID0gMDsKIAloZWFkZXIuUGFnZU51bWJlciA9IDM7CiAJaGVhZGVyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9JT0M7Ci0JY2ZnLmhkciA9ICZoZWFkZXI7CisJY2ZnLmNmZ2hkci5oZHIgPSAmaGVhZGVyOwogCWNmZy5waHlzQWRkciA9IC0xOwogCWNmZy5wYWdlQWRkciA9IDA7CiAJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOwpAQCAtNDQ0Niw3ICs0NDY2LDcgQEAKIAloZWFkZXIuUGFnZUxlbmd0aCA9IDA7CiAJaGVhZGVyLlBhZ2VOdW1iZXIgPSA0OwogCWhlYWRlci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfSU9DOwotCWNmZy5oZHIgPSAmaGVhZGVyOworCWNmZy5jZmdoZHIuaGRyID0gJmhlYWRlcjsKIAljZmcucGh5c0FkZHIgPSAtMTsKIAljZmcucGFnZUFkZHIgPSAwOwogCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX0hFQURFUjsKQEAgLTQ0OTgsNyArNDUxOCw3IEBACiAJaGVhZGVyLlBhZ2VMZW5ndGggPSAwOwogCWhlYWRlci5QYWdlTnVtYmVyID0gMTsKIAloZWFkZXIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX0lPQzsKLQljZmcuaGRyID0gJmhlYWRlcjsKKwljZmcuY2ZnaGRyLmhkciA9ICZoZWFkZXI7CiAJY2ZnLnBoeXNBZGRyID0gLTE7CiAJY2ZnLnBhZ2VBZGRyID0gMDsKIAljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CkBAIC00NTgwLDEzICs0NjAwLDEzIEBACiAKIAlldm5wID0gKEV2ZW50Tm90aWZpY2F0aW9uX3QgKikgbXB0X2dldF9tc2dfZnJhbWUobXB0X2Jhc2VfaW5kZXgsIGlvYyk7CiAJaWYgKGV2bnAgPT0gTlVMTCkgewotCQlkcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJVbmFibGUgdG8gYWxsb2NhdGUgZXZlbnQgcmVxdWVzdCBmcmFtZSFcbiIsCisJCWRldnRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlVuYWJsZSB0byBhbGxvY2F0ZSBldmVudCByZXF1ZXN0IGZyYW1lIVxuIiwKIAkJCQlpb2MtPm5hbWUpKTsKIAkJcmV0dXJuIDA7CiAJfQogCW1lbXNldChldm5wLCAwLCBzaXplb2YoKmV2bnApKTsKIAotCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNlbmRpbmcgRXZlbnROb3RpZmljYXRpb24oJWQpXG4iLCBpb2MtPm5hbWUsIEV2U3dpdGNoKSk7CisJZGV2dHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBFdmVudE5vdGlmaWNhdGlvbiAoJWQpIHJlcXVlc3QgJXBcbiIsIGlvYy0+bmFtZSwgRXZTd2l0Y2gsIGV2bnApKTsKIAogCWV2bnAtPkZ1bmN0aW9uID0gTVBJX0ZVTkNUSU9OX0VWRU5UX05PVElGSUNBVElPTjsKIAlldm5wLT5DaGFpbk9mZnNldCA9IDA7CkBAIC00NjEwLDggKzQ2MzAsMTAgQEAKIAlFdmVudEFja190CSpwQWNrOwogCiAJaWYgKChwQWNrID0gKEV2ZW50QWNrX3QgKikgbXB0X2dldF9tc2dfZnJhbWUobXB0X2Jhc2VfaW5kZXgsIGlvYykpID09IE5VTEwpIHsKLQkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIlVuYWJsZSB0byBhbGxvY2F0ZSBldmVudCBBQ0sgcmVxdWVzdCBmcmFtZSFcbiIsCi0JCQkJaW9jLT5uYW1lKTsKKwkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIlVuYWJsZSB0byBhbGxvY2F0ZSBldmVudCBBQ0sgIgorCQkJInJlcXVlc3QgZnJhbWUgZm9yIEV2ZW50PSV4IEV2ZW50Q29udGV4dD0leCBFdmVudERhdGE9JXghXG4iLAorCQkJaW9jLT5uYW1lLCBldm5wLT5FdmVudCwgbGUzMl90b19jcHUoZXZucC0+RXZlbnRDb250ZXh0KSwKKwkJCWxlMzJfdG9fY3B1KGV2bnAtPkRhdGFbMF0pKTsKIAkJcmV0dXJuIC0xOwogCX0KIAltZW1zZXQocEFjaywgMCwgc2l6ZW9mKCpwQWNrKSk7CkBAIC00NjQ3LDEwICs0NjY5LDExIEBACiBtcHRfY29uZmlnKE1QVF9BREFQVEVSICppb2MsIENPTkZJR1BBUk1TICpwQ2ZnKQogewogCUNvbmZpZ190CSpwUmVxOworCUNvbmZpZ0V4dGVuZGVkUGFnZUhlYWRlcl90ICAqcEV4dEhkciA9IE5VTEw7CiAJTVBUX0ZSQU1FX0hEUgkqbWY7CiAJdW5zaWduZWQgbG9uZwkgZmxhZ3M7CiAJaW50CQkgaWksIHJjOwotCXUzMgkJIGZsYWdzTGVuZ3RoOworCWludAkJIGZsYWdzTGVuZ3RoOwogCWludAkJIGluX2lzcjsKIAogCS8qCVByZXZlbnQgY2FsbGluZyB3YWl0X2V2ZW50KCkgKGJlbG93KSwgaWYgY2FsbGVyIGhhcHBlbnMKQEAgLTQ2NzUsMTYgKzQ2OTgsMzAgQEAKIAlwUmVxLT5SZXNlcnZlZCA9IDA7CiAJcFJlcS0+Q2hhaW5PZmZzZXQgPSAwOwogCXBSZXEtPkZ1bmN0aW9uID0gTVBJX0ZVTkNUSU9OX0NPTkZJRzsKKworCS8qIEFzc3VtZSBwYWdlIHR5cGUgaXMgbm90IGV4dGVuZGVkIGFuZCBjbGVhciAicmVzZXJ2ZWQiIGZpZWxkcy4gKi8KIAlwUmVxLT5FeHRQYWdlTGVuZ3RoID0gMDsKIAlwUmVxLT5FeHRQYWdlVHlwZSA9IDA7CiAJcFJlcS0+TXNnRmxhZ3MgPSAwOworCiAJZm9yIChpaT0wOyBpaSA8IDg7IGlpKyspCiAJCXBSZXEtPlJlc2VydmVkMltpaV0gPSAwOwogCi0JcFJlcS0+SGVhZGVyLlBhZ2VWZXJzaW9uID0gcENmZy0+aGRyLT5QYWdlVmVyc2lvbjsKLQlwUmVxLT5IZWFkZXIuUGFnZUxlbmd0aCA9IHBDZmctPmhkci0+UGFnZUxlbmd0aDsKLQlwUmVxLT5IZWFkZXIuUGFnZU51bWJlciA9IHBDZmctPmhkci0+UGFnZU51bWJlcjsKLQlwUmVxLT5IZWFkZXIuUGFnZVR5cGUgPSAocENmZy0+aGRyLT5QYWdlVHlwZSAmIE1QSV9DT05GSUdfUEFHRVRZUEVfTUFTSyk7CisJcFJlcS0+SGVhZGVyLlBhZ2VWZXJzaW9uID0gcENmZy0+Y2ZnaGRyLmhkci0+UGFnZVZlcnNpb247CisJcFJlcS0+SGVhZGVyLlBhZ2VMZW5ndGggPSBwQ2ZnLT5jZmdoZHIuaGRyLT5QYWdlTGVuZ3RoOworCXBSZXEtPkhlYWRlci5QYWdlTnVtYmVyID0gcENmZy0+Y2ZnaGRyLmhkci0+UGFnZU51bWJlcjsKKwlwUmVxLT5IZWFkZXIuUGFnZVR5cGUgPSAocENmZy0+Y2ZnaGRyLmhkci0+UGFnZVR5cGUgJiBNUElfQ09ORklHX1BBR0VUWVBFX01BU0spOworCisJaWYgKChwQ2ZnLT5jZmdoZHIuaGRyLT5QYWdlVHlwZSAmIE1QSV9DT05GSUdfUEFHRVRZUEVfTUFTSykgPT0gTVBJX0NPTkZJR19QQUdFVFlQRV9FWFRFTkRFRCkgeworCQlwRXh0SGRyID0gKENvbmZpZ0V4dGVuZGVkUGFnZUhlYWRlcl90ICopcENmZy0+Y2ZnaGRyLmVoZHI7CisJCXBSZXEtPkV4dFBhZ2VMZW5ndGggPSBjcHVfdG9fbGUxNihwRXh0SGRyLT5FeHRQYWdlTGVuZ3RoKTsKKwkJcFJlcS0+RXh0UGFnZVR5cGUgPSBwRXh0SGRyLT5FeHRQYWdlVHlwZTsKKwkJcFJlcS0+SGVhZGVyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9FWFRFTkRFRDsKKworCQkvKiBQYWdlIExlbmd0aCBtdXN0IGJlIHRyZWF0ZWQgYXMgYSByZXNlcnZlZCBmaWVsZCBmb3IgdGhlIGV4dGVuZGVkIGhlYWRlci4gKi8KKwkJcFJlcS0+SGVhZGVyLlBhZ2VMZW5ndGggPSAwOworCX0KKwogCXBSZXEtPlBhZ2VBZGRyZXNzID0gY3B1X3RvX2xlMzIocENmZy0+cGFnZUFkZHIpOwogCiAJLyogQWRkIGEgU0dFIHRvIHRoZSBjb25maWcgcmVxdWVzdC4KQEAgLTQ2OTQsMTMgKzQ3MzEsMjEgQEAKIAllbHNlCiAJCWZsYWdzTGVuZ3RoID0gTVBUX1NHRV9GTEFHU19TU0lNUExFX1JFQUQ7CiAKLQlmbGFnc0xlbmd0aCB8PSBwQ2ZnLT5oZHItPlBhZ2VMZW5ndGggKiA0OworCWlmICgocENmZy0+Y2ZnaGRyLmhkci0+UGFnZVR5cGUgJiBNUElfQ09ORklHX1BBR0VUWVBFX01BU0spID09IE1QSV9DT05GSUdfUEFHRVRZUEVfRVhURU5ERUQpIHsKKwkJZmxhZ3NMZW5ndGggfD0gcEV4dEhkci0+RXh0UGFnZUxlbmd0aCAqIDQ7CisKKwkJZGNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNlbmRpbmcgQ29uZmlnIHJlcXVlc3QgdHlwZSAlZCwgcGFnZSAlZCBhbmQgYWN0aW9uICVkXG4iLAorCQkJaW9jLT5uYW1lLCBwUmVxLT5FeHRQYWdlVHlwZSwgcFJlcS0+SGVhZGVyLlBhZ2VOdW1iZXIsIHBSZXEtPkFjdGlvbikpOworCX0KKwllbHNlIHsKKwkJZmxhZ3NMZW5ndGggfD0gcENmZy0+Y2ZnaGRyLmhkci0+UGFnZUxlbmd0aCAqIDQ7CisKKwkJZGNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNlbmRpbmcgQ29uZmlnIHJlcXVlc3QgdHlwZSAlZCwgcGFnZSAlZCBhbmQgYWN0aW9uICVkXG4iLAorCQkJaW9jLT5uYW1lLCBwUmVxLT5IZWFkZXIuUGFnZVR5cGUsIHBSZXEtPkhlYWRlci5QYWdlTnVtYmVyLCBwUmVxLT5BY3Rpb24pKTsKKwl9CiAKIAltcHRfYWRkX3NnZSgoY2hhciAqKSZwUmVxLT5QYWdlQnVmZmVyU0dFLCBmbGFnc0xlbmd0aCwgcENmZy0+cGh5c0FkZHIpOwogCi0JZGNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNlbmRpbmcgQ29uZmlnIHJlcXVlc3QgdHlwZSAlZCwgcGFnZSAlZCBhbmQgYWN0aW9uICVkXG4iLAotCQlpb2MtPm5hbWUsIHBSZXEtPkhlYWRlci5QYWdlVHlwZSwgcFJlcS0+SGVhZGVyLlBhZ2VOdW1iZXIsIHBSZXEtPkFjdGlvbikpOwotCiAJLyogQXBwZW5kIHBDZmcgcG9pbnRlciB0byBlbmQgb2YgbWYKIAkgKi8KIAkqKCh2b2lkICoqKSAoKCh1OCAqKSBtZikgKyAoaW9jLT5yZXFfc3ogLSBzaXplb2Yodm9pZCAqKSkpKSA9ICAodm9pZCAqKSBwQ2ZnOwpAQCAtNDc4OSw4ICs0ODM0LDggQEAKIAlwUmVxLT5SZXNlcnZlZDMgPSAwOwogCXBSZXEtPk51bUFkZHJlc3NCeXRlcyA9IDB4MDE7CiAJcFJlcS0+UmVzZXJ2ZWQ0ID0gMDsKLQlwUmVxLT5EYXRhTGVuZ3RoID0gMHgwNDsKLQlwZGV2ID0gKHN0cnVjdCBwY2lfZGV2ICopIGlvYy0+cGNpZGV2OworCXBSZXEtPkRhdGFMZW5ndGggPSBjcHVfdG9fbGUxNigweDA0KTsKKwlwZGV2ID0gaW9jLT5wY2lkZXY7CiAJaWYgKHBkZXYtPmRldmZuICYgMSkKIAkJcFJlcS0+RGV2aWNlQWRkciA9IDB4QjI7CiAJZWxzZQpAQCAtNTUwNCw2ICs1NTQ5LDggQEAKIAkgKiAgSWYgbmVlZGVkLCBzZW5kIChhIHNpbmdsZSkgRXZlbnRBY2suCiAJICovCiAJaWYgKHBFdmVudFJlcGx5LT5BY2tSZXF1aXJlZCA9PSBNUElfRVZFTlRfTk9USUZJQ0FUSU9OX0FDS19SRVFVSVJFRCkgeworCQlkZXZ0cHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UCisJCQkiRXZlbnRBY2sgcmVxdWlyZWRcbiIsaW9jLT5uYW1lKSk7CiAJCWlmICgoaWkgPSBTZW5kRXZlbnRBY2soaW9jLCBwRXZlbnRSZXBseSkpICE9IDApIHsKIAkJCWRldnRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlNlbmRFdmVudEFjayByZXR1cm5lZCAlZFxuIiwKIAkJCQkJaW9jLT5uYW1lLCBpaSkpOwpAQCAtNTU4NCw3ICs1NjMxLDcgQEAKIAljYXNlIDB4MDAwODAwMDA6CiAJCWRlc2MgPSAiT3V0Ym91bmQgRE1BIE92ZXJydW4iOwogCQlicmVhazsKLQkKKwogCWNhc2UgMHgwMDA5MDAwMDoKIAkJZGVzYyA9ICJUYXNrIE1hbmFnZW1lbnQiOwogCQlicmVhazsKQEAgLTU2MDAsNyArNTY0Nyw3IEBACiAJY2FzZSAweDAwMEMwMDAwOgogCQlkZXNjID0gIlVudGFnZ2VkIFRhYmxlIFNpemUiOwogCQlicmVhazsKLQkKKwogCX0KIAogCXByaW50ayhNWUlPQ19zX0lORk9fRk1UICJMb2dJbmZvKDB4JTA4eCk6IEYvVzogJXNcbiIsIGlvYy0+bmFtZSwgbG9nX2luZm8sIGRlc2MpOwpAQCAtNTY5Miw3ICs1NzM5LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9EQVRBX1VOREVSUlVOOiAvKiAweDAwNDUgKi8KLQkJLyogVGhpcyBlcnJvciBpcyBjaGVja2VkIGluIHNjc2lfaW9fZG9uZSgpLiBTa2lwLiAKKwkJLyogVGhpcyBlcnJvciBpcyBjaGVja2VkIGluIHNjc2lfaW9fZG9uZSgpLiBTa2lwLgogCQlkZXNjID0gIlNDU0kgRGF0YSBVbmRlcnJ1biI7CiAJCSovCiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaAppbmRleCA4NDhmYjIzNi4uZjQ4MjdkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmgKQEAgLTkxNSw3ICs5MTUsMTAgQEAKIHR5cGVkZWYgc3RydWN0IF94X2NvbmZpZ19wYXJtcyB7CiAJc3RydWN0IGxpc3RfaGVhZAkgbGlua2FnZTsJLyogbGlua2VkIGxpc3QgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdAkgdGltZXI7CQkvKiB0aW1lciBmdW5jdGlvbiBmb3IgdGhpcyByZXF1ZXN0ICAqLwotCUNvbmZpZ1BhZ2VIZWFkZXJfdAkqaGRyOworCXVuaW9uIHsKKwkJQ29uZmlnRXh0ZW5kZWRQYWdlSGVhZGVyX3QJKmVoZHI7CisJCUNvbmZpZ1BhZ2VIZWFkZXJfdAkqaGRyOworCX0gY2ZnaGRyOwogCWRtYV9hZGRyX3QJCSBwaHlzQWRkcjsKIAlpbnQJCQkgd2FpdF9kb25lOwkvKiB3YWl0IGZvciB0aGlzIHJlcXVlc3QgKi8KIAl1MzIJCQkgcGFnZUFkZHI7CS8qIHByb3Blcmx5IGZvcm1hdHRlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKaW5kZXggMDVlYTU5NC4uNzU3N2MyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jCkBAIC0yNDIsNyArMjQyLDcgQEAKIAkJLyogU2V0IHRoZSBjb21tYW5kIHN0YXR1cyB0byBHT09EIGlmIElPQyBTdGF0dXMgaXMgR09PRAogCQkgKiBPUiBpZiBTQ1NJIEkvTyBjbWQgYW5kIGRhdGEgdW5kZXJydW4gb3IgcmVjb3ZlcmVkIGVycm9yLgogCQkgKi8KLQkJaW9jU3RhdHVzID0gcmVwbHktPnUucmVwbHkuSU9DU3RhdHVzICYgTVBJX0lPQ1NUQVRVU19NQVNLOworCQlpb2NTdGF0dXMgPSBsZTE2X3RvX2NwdShyZXBseS0+dS5yZXBseS5JT0NTdGF0dXMpICYgTVBJX0lPQ1NUQVRVU19NQVNLOwogCQlpZiAoaW9jU3RhdHVzICA9PSBNUElfSU9DU1RBVFVTX1NVQ0NFU1MpCiAJCQlpb2MtPmlvY3RsLT5zdGF0dXMgfD0gTVBUX0lPQ1RMX1NUQVRVU19DT01NQU5EX0dPT0Q7CiAKQEAgLTIzMjQsNyArMjMyNCw3IEBACiAJaGRyLlBhZ2VMZW5ndGggPSAwOwogCWhkci5QYWdlTnVtYmVyID0gMDsKIAloZHIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX01BTlVGQUNUVVJJTkc7Ci0JY2ZnLmhkciA9ICZoZHI7CisJY2ZnLmNmZ2hkci5oZHIgPSAmaGRyOwogCWNmZy5waHlzQWRkciA9IC0xOwogCWNmZy5wYWdlQWRkciA9IDA7CiAJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOwpAQCAtMjMzMyw3ICsyMzMzLDcgQEAKIAogCXN0cm5jcHkoa2FyZy5zZXJpYWxfbnVtYmVyLCAiICIsIDI0KTsKIAlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpID09IDApIHsKLQkJaWYgKGNmZy5oZHItPlBhZ2VMZW5ndGggPiAwKSB7CisJCWlmIChjZmcuY2ZnaGRyLmhkci0+UGFnZUxlbmd0aCA+IDApIHsKIAkJCS8qIElzc3VlIHRoZSBzZWNvbmQgY29uZmlnIHBhZ2UgcmVxdWVzdCAqLwogCQkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9DVVJSRU5UOwogCkBAIC0yNDc5LDcgKzI0NzksNyBAQAogCQloZHIuUGFnZU51bWJlciA9IDA7CiAJCWhkci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfU0NTSV9ERVZJQ0U7CiAKLQkJY2ZnLmhkciA9ICZoZHI7CisJCWNmZy5jZmdoZHIuaGRyID0gJmhkcjsKIAkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9DVVJSRU5UOwogCQljZmcuZGlyID0gMDsKIAkJY2ZnLnRpbWVvdXQgPSAwOwpAQCAtMjUyNywxNSArMjUyNywxNSBAQAogCWhkci5QYWdlTnVtYmVyID0gMzsKIAloZHIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX1NDU0lfREVWSUNFOwogCi0JY2ZnLmhkciA9ICZoZHI7CisJY2ZnLmNmZ2hkci5oZHIgPSAmaGRyOwogCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX0hFQURFUjsKIAljZmcuZGlyID0gMDsKIAljZmcudGltZW91dCA9IDA7CiAJY2ZnLnBoeXNBZGRyID0gLTE7Ci0JaWYgKChtcHRfY29uZmlnKGlvYywgJmNmZykgPT0gMCkgJiYgKGNmZy5oZHItPlBhZ2VMZW5ndGggPiAwKSkgeworCWlmICgobXB0X2NvbmZpZyhpb2MsICZjZmcpID09IDApICYmIChjZmcuY2ZnaGRyLmhkci0+UGFnZUxlbmd0aCA+IDApKSB7CiAJCS8qIElzc3VlIHRoZSBzZWNvbmQgY29uZmlnIHBhZ2UgcmVxdWVzdCAqLwogCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9SRUFEX0NVUlJFTlQ7Ci0JCWRhdGFfc3ogPSAoaW50KSBjZmcuaGRyLT5QYWdlTGVuZ3RoICogNDsKKwkJZGF0YV9zeiA9IChpbnQpIGNmZy5jZmdoZHIuaGRyLT5QYWdlTGVuZ3RoICogNDsKIAkJcGczX2FsbG9jID0gKFNDU0lEZXZpY2VQYWdlM190ICopIHBjaV9hbGxvY19jb25zaXN0ZW50KAogCQkJCQkJCWlvYy0+cGNpZGV2LCBkYXRhX3N6LCAmcGFnZV9kbWEpOwogCQlpZiAocGczX2FsbG9jKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKaW5kZXggYjlkNGY3OC4uNGEwMDNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwpAQCAtMjgxLDEyICsyODEsMTIgQEAKIAkJb2Zmc2V0ID0gKHU4ICopY2hhaW5CdWYgLSAodTggKilpb2MtPkNoYWluQnVmZmVyOwogCQljaGFpbl9pZHggPSBvZmZzZXQgLyBpb2MtPnJlcV9zejsKIAkJcmMgPSBTVUNDRVNTOwotCQlkc2dwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImdldEZyZWVDaGFpbkJ1ZmZlciAoaW5kZXggJWQpLCBnb3QgYnVmPSVwXG4iLAotCQkJaW9jLT5uYW1lLCAqcmV0SW5kZXgsIGNoYWluQnVmKSk7CisJCWRzZ3ByaW50aygoTVlJT0Nfc19FUlJfRk1UICJnZXRGcmVlQ2hhaW5CdWZmZXIgY2hhaW5CdWY9JXAgQ2hhaW5CdWZmZXI9JXAgb2Zmc2V0PSVkIGNoYWluX2lkeD0lZFxuIiwKKwkJCWlvYy0+bmFtZSwgY2hhaW5CdWYsIGlvYy0+Q2hhaW5CdWZmZXIsIG9mZnNldCwgY2hhaW5faWR4KSk7CiAJfSBlbHNlIHsKIAkJcmMgPSBGQUlMRUQ7CiAJCWNoYWluX2lkeCA9IE1QVF9IT1NUX05PX0NIQUlOOwotCQlkZmFpbHByaW50aygoTVlJT0Nfc19FUlJfRk1UICJnZXRGcmVlQ2hhaW5CdWZmZXIgZmFpbGVkXG4iLAorCQlkZmFpbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiZ2V0RnJlZUNoYWluQnVmZmVyIGZhaWxlZFxuIiwKIAkJCWlvYy0+bmFtZSkpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPkZyZWVRbG9jaywgZmxhZ3MpOwpAQCAtNDMyLDcgKzQzMiw3IEBACiAJCQkgKi8KIAkJCXBSZXEtPkNoYWluT2Zmc2V0ID0gMDsKIAkJCVJlcXVlc3ROQiA9ICgoKHNnZU9mZnNldCAtIDEpID4+IGlvYy0+TkJTaGlmdEZhY3RvcikgICsgMSkgJiAweDAzOwotCQkJZHNncHJpbnRrKChNWUlPQ19zX0VSUl9GTVQgCisJCQlkc2dwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKIAkJCSAgICAiU2luZ2xlIEJ1ZmZlciBSZXF1ZXN0TkI9JXgsIHNnZU9mZnNldD0lZFxuIiwgaW9jLT5uYW1lLCBSZXF1ZXN0TkIsIHNnZU9mZnNldCkpOwogCQkJaW9jLT5SZXF1ZXN0TkJbcmVxX2lkeF0gPSBSZXF1ZXN0TkI7CiAJCX0KQEAgLTQ5MSwxMSArNDkxLDEyIEBACiAJCS8qIE5PVEU6IHBzZ2UgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNoYWluIGVsZW1lbnQKIAkJICogaW4gY3VycmVudCBidWZmZXIuIEdldCBhIGNoYWluIGJ1ZmZlci4KIAkJICovCi0JCWRzZ3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAKLQkJICAgICJjYWxsaW5nIGdldEZyZWVDaGFpbkJ1ZmZlciBTQ1NJIGNtZD0lMDJ4ICglcClcbiIsCi0JCSAgICBpb2MtPm5hbWUsIHBSZXEtPkNEQlswXSwgU0NwbnQpKTsKLQkJaWYgKChtcHRzY3NpaF9nZXRGcmVlQ2hhaW5CdWZmZXIoaW9jLCAmbmV3SW5kZXgpKSA9PSBGQUlMRUQpCisJCWlmICgobXB0c2NzaWhfZ2V0RnJlZUNoYWluQnVmZmVyKGlvYywgJm5ld0luZGV4KSkgPT0gRkFJTEVEKSB7CisJCQlkZmFpbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkJICAgICJnZXRGcmVlQ2hhaW5CdWZmZXIgRkFJTEVEIFNDU0kgY21kPSUwMnggKCVwKVxuIiwKKyAJCQkgICAgaW9jLT5uYW1lLCBwUmVxLT5DREJbMF0sIFNDcG50KSk7CiAJCQlyZXR1cm4gRkFJTEVEOworCQl9CiAKIAkJLyogVXBkYXRlIHRoZSB0cmFja2luZyBhcnJheXMuCiAJCSAqIElmIGNoYWluU2dlID09IE5VTEwsIHVwZGF0ZSBSZXFUb0NoYWluLCBlbHNlIENoYWluVG9DaGFpbgpAQCAtNTc3LDE0ICs1NzgsMjAgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JZG1mcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCi0JCSJTY3NpRG9uZSAobWY9JXAsbXI9JXAsc2M9JXAsaWR4PSVkKVxuIiwKLQkJaW9jLT5uYW1lLCBtZiwgbXIsIHNjLCByZXFfaWR4KSk7Ci0KIAlzYy0+cmVzdWx0ID0gRElEX09LIDw8IDE2OwkJLyogU2V0IGRlZmF1bHQgcmVwbHkgYXMgT0sgKi8KIAlwU2NzaVJlcSA9IChTQ1NJSU9SZXF1ZXN0X3QgKikgbWY7CiAJcFNjc2lSZXBseSA9IChTQ1NJSU9SZXBseV90ICopIG1yOwogCisJaWYoKGlvYy0+ZmFjdHMuTXNnVmVyc2lvbiA+PSBNUElfVkVSU0lPTl8wMV8wNSkgJiYgcFNjc2lSZXBseSl7CisJCWRtZnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkJIlNjc2lEb25lIChtZj0lcCxtcj0lcCxzYz0lcCxpZHg9JWQsdGFzay10YWc9JWQpXG4iLAorCQkJaW9jLT5uYW1lLCBtZiwgbXIsIHNjLCByZXFfaWR4LCBwU2NzaVJlcGx5LT5UYXNrVGFnKSk7CisJfWVsc2V7CisJCWRtZnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkJIlNjc2lEb25lIChtZj0lcCxtcj0lcCxzYz0lcCxpZHg9JWQpXG4iLAorCQkJaW9jLT5uYW1lLCBtZiwgbXIsIHNjLCByZXFfaWR4KSk7CisJfQorCiAJaWYgKHBTY3NpUmVwbHkgPT0gTlVMTCkgewogCQkvKiBzcGVjaWFsIGNvbnRleHQgcmVwbHkgaGFuZGxpbmcgKi8KIAkJOwpAQCAtNjU4LDggKzY2NSw4IEBACiAJCQkJLyogU3VmZmljaWVudCBkYXRhIHRyYW5zZmVyIG9jY3VycmVkICovCiAJCQkJc2MtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgc2NzaV9zdGF0dXM7CiAJCQl9IGVsc2UgaWYgKCB4ZmVyX2NudCA9PSAwICkgewotCQkJCS8qIEEgQ1JDIEVycm9yIGNhdXNlcyB0aGlzIGNvbmRpdGlvbjsgcmV0cnkgKi8gCi0JCQkJc2MtPnJlc3VsdCA9IChEUklWRVJfU0VOU0UgPDwgMjQpIHwgKERJRF9PSyA8PCAxNikgfCAKKwkJCQkvKiBBIENSQyBFcnJvciBjYXVzZXMgdGhpcyBjb25kaXRpb247IHJldHJ5ICovCisJCQkJc2MtPnJlc3VsdCA9IChEUklWRVJfU0VOU0UgPDwgMjQpIHwgKERJRF9PSyA8PCAxNikgfAogCQkJCQkoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpOwogCQkJCXNjLT5zZW5zZV9idWZmZXJbMF0gPSAweDcwOwogCQkJCXNjLT5zZW5zZV9idWZmZXJbMl0gPSBOT19TRU5TRTsKQEAgLTY2OCw3ICs2NzUsOSBAQAogCQkJfSBlbHNlIHsKIAkJCQlzYy0+cmVzdWx0ID0gRElEX1NPRlRfRVJST1IgPDwgMTY7CiAJCQl9Ci0JCQlkcmVwbHlwcmludGsoKEtFUk5fTk9USUNFICJSRVNJRFVBTF9NSVNNQVRDSDogcmVzdWx0PSV4IG9uIGlkPSVkXG4iLCBzYy0+cmVzdWx0LCBzYy0+dGFyZ2V0KSk7CisJCQlkcmVwbHlwcmludGsoKEtFUk5fTk9USUNFCisJCQkgICAgIlJFU0lEVUFMX01JU01BVENIOiByZXN1bHQ9JXggb24gaWQ9JWRcbiIsCisJCQkgICAgc2MtPnJlc3VsdCwgc2MtPmRldmljZS0+aWQpKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0RBVEFfVU5ERVJSVU46CQkvKiAweDAwNDUgKi8KQEAgLTc5Niw3ICs4MDUsNiBAQAogCXJldHVybiAxOwogfQogCi0KIC8qCiAgKgltcHRzY3NpaF9mbHVzaF9ydW5uaW5nX2NtZHMgLSBGb3IgZWFjaCBjb21tYW5kIGZvdW5kLCBzZWFyY2gKICAqCQlTY3NpX0hvc3QgaW5zdGFuY2UgdGFza1EgYW5kIHJlcGx5IHRvIE9TLgpAQCAtMTAxNyw3ICsxMDI1LDcgQEAKIAlzY3NpX2hvc3RfcHV0KGhvc3QpOwogCiAJbXB0X2RldGFjaChwZGV2KTsKLQkKKwogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCkBAIC0xMDcyLDcgKzEwODAsNyBAQAogCU1QVF9TQ1NJX0hPU1QJCSpoZDsKIAogCW1wdF9yZXN1bWUocGRldik7Ci0JCisKIAlpZighaG9zdCkKIAkJcmV0dXJuIDA7CiAKQEAgLTEyMTQsOCArMTIyMiw4IEBACiAJaW50IHNpemUgPSAwOwogCiAJaWYgKGZ1bmMpIHsKLQkJLyogCi0JCSAqIHdyaXRlIGlzIG5vdCBzdXBwb3J0ZWQgCisJCS8qCisJCSAqIHdyaXRlIGlzIG5vdCBzdXBwb3J0ZWQKIAkJICovCiAJfSBlbHNlIHsKIAkJaWYgKHN0YXJ0KQpAQCAtMTUzNSwxNyArMTU0MywxNyBAQAogCSAqLwogCWlmIChtcHRzY3NpaF90bV9wZW5kaW5nX3dhaXQoaGQpID09IEZBSUxFRCkgewogCQlpZiAodHlwZSA9PSBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX0FCT1JUX1RBU0spIHsKLQkJCWR0bXByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICI6ICVzOiBUTUhhbmRsZXIgYWJvcnQ6ICIKKwkJCWR0bXByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBUTUhhbmRsZXIgYWJvcnQ6ICIKIAkJCSAgICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbGFzdCBUTSAoJWQpIHRvIGNvbXBsZXRlISBcbiIsCiAJCQkgICBoZC0+aW9jLT5uYW1lLCBoZC0+dG1QZW5kaW5nKSk7CiAJCQlyZXR1cm4gRkFJTEVEOwogCQl9IGVsc2UgaWYgKHR5cGUgPT0gTVBJX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9UQVJHRVRfUkVTRVQpIHsKLQkJCWR0bXByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICI6ICVzOiBUTUhhbmRsZXIgdGFyZ2V0IHJlc2V0OiAiCisJCQlkdG1wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlczogVE1IYW5kbGVyIHRhcmdldCByZXNldDogIgogCQkJICAgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBsYXN0IFRNICglZCkgdG8gY29tcGxldGUhIFxuIiwKIAkJCSAgIGhkLT5pb2MtPm5hbWUsIGhkLT50bVBlbmRpbmcpKTsKIAkJCXJldHVybiBGQUlMRUQ7CiAJCX0gZWxzZSBpZiAodHlwZSA9PSBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1JFU0VUX0JVUykgewotCQkJZHRtcHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gIjogJXM6IFRNSGFuZGxlciBidXMgcmVzZXQ6ICIKKwkJCWR0bXByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBUTUhhbmRsZXIgYnVzIHJlc2V0OiAiCiAJCQkgICAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGxhc3QgVE0gKCVkKSB0byBjb21wbGV0ZSEgXG4iLAogCQkJICAgaGQtPmlvYy0+bmFtZSwgaGQtPnRtUGVuZGluZykpOwogCQkJaWYgKGhkLT50bVBlbmRpbmcgJiAoMSA8PCBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1JFU0VUX0JVUykpCkBAIC0xNjMxLDggKzE2MzksNyBAQAogCWlmICgobWYgPSBtcHRfZ2V0X21zZ19mcmFtZShoZC0+aW9jLT5UYXNrQ3R4LCBoZC0+aW9jKSkgPT0gTlVMTCkgewogCQlkZmFpbHByaW50aygoTVlJT0Nfc19FUlJfRk1UICJJc3N1ZVRhc2tNZ210LCBubyBtc2cgZnJhbWVzISFcbiIsCiAJCQkJaGQtPmlvYy0+bmFtZSkpOwotCQkvL3JldHVybiBGQUlMRUQ7Ci0JCXJldHVybiAtOTk5OworCQlyZXR1cm4gRkFJTEVEOwogCX0KIAlkdG1wcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIklzc3VlVGFza01nbXQgcmVxdWVzdCBAICVwXG4iLAogCQkJaGQtPmlvYy0+bmFtZSwgbWYpKTsKQEAgLTE2NjEsOSArMTY2OCw4IEBACiAKIAlwU2NzaVRtLT5UYXNrTXNnQ29udGV4dCA9IGN0eDJhYm9ydDsKIAotCWR0bXByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAotCQkiSXNzdWVUYXNrTWdtdDogY3R4MmFib3J0ICgweCUwOHgpIHR5cGU9JWRcbiIsCi0JCWhkLT5pb2MtPm5hbWUsIGN0eDJhYm9ydCwgdHlwZSkpOworCWR0bXByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSXNzdWVUYXNrTWdtdDogY3R4MmFib3J0ICgweCUwOHgpIHR5cGU9JWRcbiIsCisJCQloZC0+aW9jLT5uYW1lLCBjdHgyYWJvcnQsIHR5cGUpKTsKIAogCURCR19EVU1QX1RNX1JFUVVFU1RfRlJBTUUoKHUzMiAqKXBTY3NpVG0pOwogCkBAIC0xOTAyLDEzICsxOTA4LDEzIEBACiAKIAkvKiAgSWYgd2UgY2FuJ3QgbG9jYXRlIHRoZSBob3N0IHRvIHJlc2V0LCB0aGVuIHdlIGZhaWxlZC4gKi8KIAlpZiAoKGhkID0gKE1QVF9TQ1NJX0hPU1QgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpID09IE5VTEwpewotCQlkdG1wcmludGsoICggS0VSTl9XQVJOSU5HIE1ZTkFNICI6IG1wdHNjc2loX2hvc3RfcmVzZXQ6ICIKKwkJZHRtcHJpbnRrKCAoIEtFUk5fSU5GTyBNWU5BTSAiOiBtcHRzY3NpaF9ob3N0X3Jlc2V0OiAiCiAJCQkgICAgICJDYW4ndCBsb2NhdGUgaG9zdCEgKHNjPSVwKVxuIiwKIAkJCSAgICAgU0NwbnQgKSApOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KIAotCXByaW50ayhLRVJOX1dBUk5JTkcgTVlOQU0gIjogJXM6ID4+IEF0dGVtcHRpbmcgaG9zdCByZXNldCEgKHNjPSVwKVxuIiwKKwlwcmludGsoS0VSTl9XQVJOSU5HIE1ZTkFNICI6ICVzOiBBdHRlbXB0aW5nIGhvc3QgcmVzZXQhIChzYz0lcClcbiIsCiAJICAgICAgIGhkLT5pb2MtPm5hbWUsIFNDcG50KTsKIAogCS8qICBJZiBvdXIgYXR0ZW1wdHMgdG8gcmVzZXQgdGhlIGhvc3QgZmFpbGVkLCB0aGVuIHJldHVybiBhIGZhaWxlZApAQCAtMTkyNCw3ICsxOTMwLDcgQEAKIAkJaGQtPnRtU3RhdGUgPSBUTV9TVEFURV9OT05FOwogCX0KIAotCWR0bXByaW50ayggKCBLRVJOX1dBUk5JTkcgTVlOQU0gIjogbXB0c2NzaWhfaG9zdF9yZXNldDogIgorCWR0bXByaW50ayggKCBLRVJOX0lORk8gTVlOQU0gIjogbXB0c2NzaWhfaG9zdF9yZXNldDogIgogCQkgICAgICJTdGF0dXMgPSAlc1xuIiwKIAkJICAgICAoc3RhdHVzID09IFNVQ0NFU1MpID8gIlNVQ0NFU1MiIDogIkZBSUxFRCIgKSApOwogCkBAIC0xOTUxLDggKzE5NTcsOCBAQAogCQlpZiAoaGQtPnRtU3RhdGUgPT0gVE1fU1RBVEVfTk9ORSkgewogCQkJaGQtPnRtU3RhdGUgPSBUTV9TVEFURV9JTl9QUk9HUkVTUzsKIAkJCWhkLT50bVBlbmRpbmcgPSAxOwotCQkJc3RhdHVzID0gU1VDQ0VTUzsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhkLT5pb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworCQkJc3RhdHVzID0gU1VDQ0VTUzsKIAkJCWJyZWFrOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhkLT5pb2MtPkZyZWVRbG9jaywgZmxhZ3MpOwpAQCAtMTk4MCw3ICsxOTg2LDcgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhkLT5pb2MtPkZyZWVRbG9jaywgZmxhZ3MpOwogCQlpZihoZC0+dG1QZW5kaW5nID09IDApIHsKIAkJCXN0YXR1cyA9IFNVQ0NFU1M7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZC0+aW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKKyAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZC0+aW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhkLT5pb2MtPkZyZWVRbG9jaywgZmxhZ3MpOwpAQCAtMjMxOCwxMCArMjMyNCwxMCBAQAogCWlmIChwVGFyZ2V0ID09IE5VTEwpIHsKIAkJLyogRHJpdmVyIGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIGRldmljZS4KIAkJICogS2VybmVsIG1heSBnZW5lcmF0ZSBhICJEdW1teSBMdW4gMCIgd2hpY2gKLQkJICogbWF5IGJlY29tZSBhIHJlYWwgTHVuIGlmIGEgCisJCSAqIG1heSBiZWNvbWUgYSByZWFsIEx1biBpZiBhCiAJCSAqICJzY3NpIGFkZC1zaW5nbGUtZGV2aWNlIiBjb21tYW5kIGlzIGV4ZWN1dGVkCi0JCSAqIHdoaWxlIHRoZSBkcml2ZXIgaXMgYWN0aXZlIChob3QtcGx1ZyBhIAotCQkgKiBkZXZpY2UpLiAgTFNJIFJhaWQgY29udHJvbGxlcnMgbmVlZCAKKwkJICogd2hpbGUgdGhlIGRyaXZlciBpcyBhY3RpdmUgKGhvdC1wbHVnIGEKKwkJICogZGV2aWNlKS4gIExTSSBSYWlkIGNvbnRyb2xsZXJzIG5lZWQKIAkJICogcXVldWVfZGVwdGggc2V0IHRvIERFVl9ISUdIIGZvciB0aGlzIHJlYXNvbi4KIAkJICovCiAJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgTVNHX1NJTVBMRV9UQUcsCkBAIC0yNjkxLDcgKzI2OTcsNyBAQAogCSAqIElmIHRoZSBwZXJpcGhlcmFsIHF1YWxpZmllciBmaWx0ZXIgaXMgZW5hYmxlZCB0aGVuIGlmIHRoZSB0YXJnZXQgcmVwb3J0cyBhIDB4MQogCSAqIChpLmUuIFRoZSB0YXJnZXIgaXMgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBkZXZpY2UgdHlwZQogCSAqIG9uIHRoaXMgbG9naWNhbCB1bml0OyBob3dldmVyLCB0aGUgcGh5c2ljYWwgZGV2aWNlIGlzIG5vdCBjdXJyZW50bHkgY29ubmVjdGVkCi0JICogdG8gdGhpcyBsb2dpY2FsIHVuaXQpIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgMHgzIChpLmUuIFRoZSB0YXJnZXQgaXMgbm90IAorCSAqIHRvIHRoaXMgbG9naWNhbCB1bml0KSBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIDB4MyAoaS5lLiBUaGUgdGFyZ2V0IGlzIG5vdAogCSAqIGNhcGFibGUgb2Ygc3VwcG9ydGluZyBhIHBoeXNpY2FsIGRldmljZSBvbiB0aGlzIGxvZ2ljYWwgdW5pdCkuIFRoaXMgaXMgdG8gd29yawogCSAqIGFyb3VuZCBhIGJ1ZyBpbiB0aCBlbWlkLWxheWVyIGluIHNvbWUgZGlzdHJpYnV0aW9ucyBpbiB3aGljaCB0aGUgbWlkLWxheWVyIHdpbGwKIAkgKiBjb250aW51ZSB0byB0cnkgdG8gY29tbXVuaWNhdGUgdG8gdGhlIExVTiBhbmQgZXZudHVhbGx5IGNyZWF0ZSBhIGR1bW15IExVTi4KQEAgLTMxOTQsOCArMzIwMCw4IEBACiAJCS8qIEdldCBhIE1GIGZvciB0aGlzIGNvbW1hbmQuCiAJCSAqLwogCQlpZiAoKG1mID0gbXB0X2dldF9tc2dfZnJhbWUoaW9jLT5Eb25lQ3R4LCBpb2MpKSA9PSBOVUxMKSB7Ci0JCQlkcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJ3cml0ZSBTRFAxOiBubyBtc2cgZnJhbWVzIVxuIiwKLQkJCQkJCWlvYy0+bmFtZSkpOworCQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIndyaXRlIFNEUDE6IG5vIG1zZyBmcmFtZXMhXG4iLAorCQkJCWlvYy0+bmFtZSkpOwogCQkJcmV0dXJuIC1FQUdBSU47CiAJCX0KIApAQCAtMzI4OSw3ICszMjk1LDcgQEAKIAkvKiBHZXQgYSBNRiBmb3IgdGhpcyBjb21tYW5kLgogCSAqLwogCWlmICgobWYgPSBtcHRfZ2V0X21zZ19mcmFtZShpb2MtPkRvbmVDdHgsIGlvYykpID09IE5VTEwpIHsKLQkJZHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAid3JpdGVJT0NQYWdlNCA6IG5vIG1zZyBmcmFtZXMhXG4iLAorCQlkZmFpbHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAid3JpdGVJT0NQYWdlNCA6IG5vIG1zZyBmcmFtZXMhXG4iLAogCQkJCQlpb2MtPm5hbWUpKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQpAQCAtMzQ0Nyw3ICszNDUzLDcgQEAKIAkJCQkgKiBzb21lIHR5cGUgb2YgZXJyb3Igb2NjdXJyZWQuCiAJCQkJICovCiAJCQkJTXBpUmFpZEFjdGlvblJlcGx5X3QJKnByID0gKE1waVJhaWRBY3Rpb25SZXBseV90ICopbXI7Ci0JCQkJaWYgKHByLT5BY3Rpb25TdGF0dXMgPT0gTVBJX1JBSURfQUNUSU9OX0FTVEFUVVNfU1VDQ0VTUykKKwkJCQlpZiAobGUxNl90b19jcHUocHItPkFjdGlvblN0YXR1cykgPT0gTVBJX1JBSURfQUNUSU9OX0FTVEFUVVNfU1VDQ0VTUykKIAkJCQkJY29tcGxldGlvbkNvZGUgPSBNUFRfU0NBTkRWX0dPT0Q7CiAJCQkJZWxzZQogCQkJCQljb21wbGV0aW9uQ29kZSA9IE1QVF9TQ0FORFZfU09NRV9FUlJPUjsKQEAgLTM5NTUsNyArMzk2MSw3IEBACiAJCQkJaGVhZGVyMS5QYWdlTGVuZ3RoID0gaW9jLT5zcGlfZGF0YS5zZHAxbGVuZ3RoOwogCQkJCWhlYWRlcjEuUGFnZU51bWJlciA9IDE7CiAJCQkJaGVhZGVyMS5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfU0NTSV9ERVZJQ0U7Ci0JCQkJY2ZnLmhkciA9ICZoZWFkZXIxOworCQkJCWNmZy5jZmdoZHIuaGRyID0gJmhlYWRlcjE7CiAJCQkJY2ZnLnBoeXNBZGRyID0gY2ZnMV9kbWFfYWRkcjsKIAkJCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9XUklURV9DVVJSRU5UOwogCQkJCWNmZy5kaXIgPSAxOwpAQCAtMzk5Niw5ICs0MDAyLDkgQEAKIAkJCWRuZWdvcHJpbnRrKCgic3luY3Jvbml6ZSBjYWNoZTogaWQ9JWQgd2lkdGg9MCBmYWN0b3I9TVBUX0FTWU5DICIKIAkJCQkib2Zmc2V0PTAgbmVnb0ZsYWdzPSV4IHJlcXVlc3Q9JXggY29uZmlnPSV4XG4iLAogCQkJCWlkLCBmbGFncywgcmVxdWVzdGVkLCBjb25maWd1cmF0aW9uKSk7Ci0JCQlwY2ZnMURhdGEtPlJlcXVlc3RlZFBhcmFtZXRlcnMgPSBsZTMyX3RvX2NwdShyZXF1ZXN0ZWQpOworCQkJcGNmZzFEYXRhLT5SZXF1ZXN0ZWRQYXJhbWV0ZXJzID0gY3B1X3RvX2xlMzIocmVxdWVzdGVkKTsKIAkJCXBjZmcxRGF0YS0+UmVzZXJ2ZWQgPSAwOwotCQkJcGNmZzFEYXRhLT5Db25maWd1cmF0aW9uID0gbGUzMl90b19jcHUoY29uZmlndXJhdGlvbik7CisJCQlwY2ZnMURhdGEtPkNvbmZpZ3VyYXRpb24gPSBjcHVfdG9fbGUzMihjb25maWd1cmF0aW9uKTsKIAkJCWNmZy5wYWdlQWRkciA9IChidXM8PDgpIHwgaWQ7CiAJCQltcHRfY29uZmlnKGhkLT5pb2MsICZjZmcpOwogCQl9CkBAIC00MzUzLDcgKzQzNTksNyBAQAogCS8qIFByZXAgY2ZnIHN0cnVjdHVyZQogCSAqLwogCWNmZy5wYWdlQWRkciA9IChidXM8PDgpIHwgaWQ7Ci0JY2ZnLmhkciA9IE5VTEw7CisJY2ZnLmNmZ2hkci5oZHIgPSBOVUxMOwogCiAJLyogUHJlcCBTRFAwIGhlYWRlcgogCSAqLwpAQCAtNDM5OSw3ICs0NDA1LDcgQEAKIAlwY2ZnMURhdGEgPSAoU0NTSURldmljZVBhZ2UxX3QgKikgKHBEdkJ1ZiArIHN6KTsKIAljZmcxX2RtYV9hZGRyID0gZHZidWZfZG1hICsgc3o7CiAKLQkvKiBTa2lwIHRoaXMgSUQ/IFNldCBjZmcuaGRyIHRvIGZvcmNlIGNvbmZpZyBwYWdlIHdyaXRlCisJLyogU2tpcCB0aGlzIElEPyBTZXQgY2ZnLmNmZ2hkci5oZHIgdG8gZm9yY2UgY29uZmlnIHBhZ2Ugd3JpdGUKIAkgKi8KIAl7CiAJCVNjc2lDZmdEYXRhICpwc3BpX2RhdGEgPSAmaGQtPmlvYy0+c3BpX2RhdGE7CkBAIC00NDE3LDcgKzQ0MjMsNyBAQAogCiAJCQkJZHYuY21kID0gTVBUX1NFVF9NQVg7CiAJCQkJbXB0c2NzaWhfZHZfcGFybXMoaGQsICZkdiwgKHZvaWQgKilwY2ZnMURhdGEpOwotCQkJCWNmZy5oZHIgPSAmaGVhZGVyMTsKKwkJCQljZmcuY2ZnaGRyLmhkciA9ICZoZWFkZXIxOwogCiAJCQkJLyogU2F2ZSB0aGUgZmluYWwgbmVnb3RpYXRlZCBzZXR0aW5ncyB0bwogCQkJCSAqIFNDU0kgZGV2aWNlIHBhZ2UgMS4KQEAgLTQ0ODMsNyArNDQ4OSw3IEBACiAJCWR2LmNtZCA9IE1QVF9TRVRfTUlOOwogCQltcHRzY3NpaF9kdl9wYXJtcyhoZCwgJmR2LCAodm9pZCAqKXBjZmcxRGF0YSk7CiAKLQkJY2ZnLmhkciA9ICZoZWFkZXIxOworCQljZmcuY2ZnaGRyLmhkciA9ICZoZWFkZXIxOwogCQljZmcucGh5c0FkZHIgPSBjZmcxX2RtYV9hZGRyOwogCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9XUklURV9DVVJSRU5UOwogCQljZmcuZGlyID0gMTsKQEAgLTQ1OTYsOCArNDYwMiw4IEBACiAJCQkJaWYgKChwYnVmMVs1Nl0gJiAweDAyKSA9PSAwKSB7CiAJCQkJCXBUYXJnZXQtPm5lZ29GbGFncyB8PSBNUFRfVEFSR0VUX05PX05FR09fUUFTOwogCQkJCQloZC0+aW9jLT5zcGlfZGF0YS5ub1FhcyA9IE1QVF9UQVJHRVRfTk9fTkVHT19RQVM7Ci0JCQkJCWRkdnByaW50aygoTVlJT0Nfc19OT1RFX0ZNVCAKLQkJCQkJICAgICJEVjogU3RhcnQgQmFzaWMgbm9RYXMgb24gaWQ9JWQgZHVlIHRvIHBidWYxWzU2XT0leFxuIiwgCisJCQkJCWRkdnByaW50aygoTVlJT0Nfc19OT1RFX0ZNVAorCQkJCQkgICAgIkRWOiBTdGFydCBCYXNpYyBub1FhcyBvbiBpZD0lZCBkdWUgdG8gcGJ1ZjFbNTZdPSV4XG4iLAogCQkJCQkgICAgaW9jLT5uYW1lLCBpZCwgcGJ1ZjFbNTZdKSk7CiAJCQkJfQogCQkJfQpAQCAtNDYzNyw3ICs0NjQzLDcgQEAKIAkJCQkJdTMyIHNkcDBfaW5mbzsKIAkJCQkJdTMyIHNkcDBfbmVnbzsKIAotCQkJCQljZmcuaGRyID0gJmhlYWRlcjA7CisJCQkJCWNmZy5jZmdoZHIuaGRyID0gJmhlYWRlcjA7CiAJCQkJCWNmZy5waHlzQWRkciA9IGNmZzBfZG1hX2FkZHI7CiAJCQkJCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1JFQURfQ1VSUkVOVDsKIAkJCQkJY2ZnLmRpciA9IDA7CkBAIC00NjczLDcgKzQ2NzksNyBAQAogCQkJCQkJaWYgKCFmaXJzdFBhc3MpCiAJCQkJCQkJZG9GYWxsYmFjayA9IDE7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlkZHZwcmludGsoKE1ZSU9DX3NfTk9URV9GTVQgCisJCQkJCQlkZHZwcmludGsoKE1ZSU9DX3NfTk9URV9GTVQKIAkJCQkJCSAgICAiRFY6SW5xdWlyeSBjb21wYXJlZCBpZD0lZCwgY2FsbGluZyBpbml0VGFyZ2V0XG4iLCBpb2MtPm5hbWUsIGlkKSk7CiAJCQkJCQloZC0+aW9jLT5zcGlfZGF0YS5kdlN0YXR1c1tpZF0gJj0gfk1QVF9TQ1NJQ0ZHX0RWX05PVF9ET05FOwogCQkJCQkJbXB0c2NzaWhfaW5pdFRhcmdldChoZCwKQEAgLTQ2ODksOCArNDY5NSw4IEBACiAKIAkJCX0gZWxzZSBpZiAocmMgPT0gTVBUX1NDQU5EVl9JU1NVRV9TRU5TRSkKIAkJCQlkb0ZhbGxiYWNrID0gMTsJLyogc2V0IGZhbGxiYWNrIGZsYWcgKi8KLQkJCWVsc2UgaWYgKChyYyA9PSBNUFRfU0NBTkRWX0RJRF9SRVNFVCkgfHwgCi0JCQkJIChyYyA9PSBNUFRfU0NBTkRWX1NFTlNFKSB8fCAKKwkJCWVsc2UgaWYgKChyYyA9PSBNUFRfU0NBTkRWX0RJRF9SRVNFVCkgfHwKKwkJCQkgKHJjID09IE1QVF9TQ0FORFZfU0VOU0UpIHx8CiAJCQkJIChyYyA9PSBNUFRfU0NBTkRWX0ZBTExCQUNLKSkKIAkJCQlkb0ZhbGxiYWNrID0gMTsJLyogc2V0IGZhbGxiYWNrIGZsYWcgKi8KIAkJCWVsc2UKQEAgLTQ3MjIsNyArNDcyOCw3IEBACiAJICogNCkgcmVsZWFzZQogCSAqIDUpIHVwZGF0ZSBuZWdvIHBhcm1zIHRvIHRhcmdldCBzdHJ1Y3QKIAkgKi8KLQljZmcuaGRyID0gJmhlYWRlcjE7CisJY2ZnLmNmZ2hkci5oZHIgPSAmaGVhZGVyMTsKIAljZmcucGh5c0FkZHIgPSBjZmcxX2RtYV9hZGRyOwogCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1dSSVRFX0NVUlJFTlQ7CiAJY2ZnLmRpciA9IDE7CkBAIC01MTIxLDEyICs1MTI3LDEyIEBACiAKIAkvKiBTZXQgaWYgY2ZnMV9kbWFfYWRkciBjb250ZW50cyBpcyB2YWxpZAogCSAqLwotCWlmICgoY2ZnLmhkciAhPSBOVUxMKSAmJiAocmV0Y29kZSA9PSAwKSl7CisJaWYgKChjZmcuY2ZnaGRyLmhkciAhPSBOVUxMKSAmJiAocmV0Y29kZSA9PSAwKSl7CiAJCS8qIElmIGRpc2ssIG5vdCBVMzIwLCBkaXNhYmxlIFFBUwogCQkgKi8KIAkJaWYgKChpbnEwID09IDApICYmIChkdi5ub3cuZmFjdG9yID4gTVBUX1VMVFJBMzIwKSkgewogCQkJaGQtPmlvYy0+c3BpX2RhdGEubm9RYXMgPSBNUFRfVEFSR0VUX05PX05FR09fUUFTOwotCQkJZGR2cHJpbnRrKChNWUlPQ19zX05PVEVfRk1UIAorCQkJZGR2cHJpbnRrKChNWUlPQ19zX05PVEVfRk1UCiAJCQkgICAgIm5vUWFzIHNldCBkdWUgdG8gaWQ9JWQgaGFzIGZhY3Rvcj0leFxuIiwgaW9jLT5uYW1lLCBpZCwgZHYubm93LmZhY3RvcikpOwogCQl9CiAKQEAgLTUxMzcsNyArNTE0Myw3IEBACiAJCSAqIHNraXAgc2F2ZSBvZiB0aGUgZmluYWwgbmVnb3RpYXRlZCBzZXR0aW5ncyB0bwogCQkgKiBTQ1NJIGRldmljZSBwYWdlIDEuCiAJCSAqCi0JCWNmZy5oZHIgPSAmaGVhZGVyMTsKKwkJY2ZnLmNmZ2hkci5oZHIgPSAmaGVhZGVyMTsKIAkJY2ZnLnBoeXNBZGRyID0gY2ZnMV9kbWFfYWRkcjsKIAkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfV1JJVEVfQ1VSUkVOVDsKIAkJY2ZnLmRpciA9IDE7CkBAIC01MjQ4LDcgKzUyNTQsNyBAQAogCQkvKiBVcGRhdGUgdG1heCB2YWx1ZXMgd2l0aCB0aG9zZSBmcm9tIERldmljZSBQYWdlIDAuKi8KIAkJcFBhZ2UwID0gKFNDU0lEZXZpY2VQYWdlMF90ICopIHBQYWdlOwogCQlpZiAocFBhZ2UwKSB7Ci0JCQl2YWwgPSBjcHVfdG9fbGUzMihwUGFnZTAtPk5lZ290aWF0ZWRQYXJhbWV0ZXJzKTsKKwkJCXZhbCA9IGxlMzJfdG9fY3B1KHBQYWdlMC0+TmVnb3RpYXRlZFBhcmFtZXRlcnMpOwogCQkJZHYtPm1heC53aWR0aCA9IHZhbCAmIE1QSV9TQ1NJREVWUEFHRTBfTlBfV0lERSA/IDEgOiAwOwogCQkJZHYtPm1heC5vZmZzZXQgPSAodmFsJk1QSV9TQ1NJREVWUEFHRTBfTlBfTkVHX1NZTkNfT0ZGU0VUX01BU0spID4+IDE2OwogCQkJZHYtPm1heC5mYWN0b3IgPSAodmFsJk1QSV9TQ1NJREVWUEFHRTBfTlBfTkVHX1NZTkNfUEVSSU9EX01BU0spID4+IDg7CkBAIC01Mjc2LDEyICs1MjgyLDEyIEBACiAJCQkJZHYtPm5vdy5vZmZzZXQsICZ2YWwsICZjb25maWd1cmF0aW9uLCBkdi0+bm93LmZsYWdzKTsKIAkJCWRuZWdvcHJpbnRrKCgiU2V0dGluZyBNYXg6IGlkPSVkIHdpZHRoPSVkIGZhY3Rvcj0leCBvZmZzZXQ9JXggbmVnb0ZsYWdzPSV4IHJlcXVlc3Q9JXggY29uZmlnPSV4XG4iLAogCQkJCWlkLCBkdi0+bm93LndpZHRoLCBkdi0+bm93LmZhY3RvciwgZHYtPm5vdy5vZmZzZXQsIGR2LT5ub3cuZmxhZ3MsIHZhbCwgY29uZmlndXJhdGlvbikpOwotCQkJcFBhZ2UxLT5SZXF1ZXN0ZWRQYXJhbWV0ZXJzID0gbGUzMl90b19jcHUodmFsKTsKKwkJCXBQYWdlMS0+UmVxdWVzdGVkUGFyYW1ldGVycyA9IGNwdV90b19sZTMyKHZhbCk7CiAJCQlwUGFnZTEtPlJlc2VydmVkID0gMDsKLQkJCXBQYWdlMS0+Q29uZmlndXJhdGlvbiA9IGxlMzJfdG9fY3B1KGNvbmZpZ3VyYXRpb24pOworCQkJcFBhZ2UxLT5Db25maWd1cmF0aW9uID0gY3B1X3RvX2xlMzIoY29uZmlndXJhdGlvbik7CiAJCX0KIAotCQlkZHZwcmludGsoKCJpZD0lZCB3aWR0aD0lZCBmYWN0b3I9JXggb2Zmc2V0PSV4IGZsYWdzPSV4IHJlcXVlc3Q9JXggY29uZmlndXJhdGlvbj0leFxuIiwKKwkJZGR2cHJpbnRrKCgiaWQ9JWQgd2lkdGg9JWQgZmFjdG9yPSV4IG9mZnNldD0leCBuZWdvRmxhZ3M9JXggcmVxdWVzdD0leCBjb25maWd1cmF0aW9uPSV4XG4iLAogCQkJCWlkLCBkdi0+bm93LndpZHRoLCBkdi0+bm93LmZhY3RvciwgZHYtPm5vdy5vZmZzZXQsIGR2LT5ub3cuZmxhZ3MsIHZhbCwgY29uZmlndXJhdGlvbikpOwogCQlicmVhazsKIApAQCAtNTMwMSw5ICs1MzA3LDkgQEAKIAkJCQlvZmZzZXQsICZ2YWwsICZjb25maWd1cmF0aW9uLCBuZWdvRmxhZ3MpOwogCQkJZG5lZ29wcmludGsoKCJTZXR0aW5nIE1pbjogaWQ9JWQgd2lkdGg9JWQgZmFjdG9yPSV4IG9mZnNldD0leCBuZWdvRmxhZ3M9JXggcmVxdWVzdD0leCBjb25maWc9JXhcbiIsCiAJCQkJaWQsIHdpZHRoLCBmYWN0b3IsIG9mZnNldCwgbmVnb0ZsYWdzLCB2YWwsIGNvbmZpZ3VyYXRpb24pKTsKLQkJCXBQYWdlMS0+UmVxdWVzdGVkUGFyYW1ldGVycyA9IGxlMzJfdG9fY3B1KHZhbCk7CisJCQlwUGFnZTEtPlJlcXVlc3RlZFBhcmFtZXRlcnMgPSBjcHVfdG9fbGUzMih2YWwpOwogCQkJcFBhZ2UxLT5SZXNlcnZlZCA9IDA7Ci0JCQlwUGFnZTEtPkNvbmZpZ3VyYXRpb24gPSBsZTMyX3RvX2NwdShjb25maWd1cmF0aW9uKTsKKwkJCXBQYWdlMS0+Q29uZmlndXJhdGlvbiA9IGNwdV90b19sZTMyKGNvbmZpZ3VyYXRpb24pOwogCQl9CiAJCWRkdnByaW50aygoImlkPSVkIHdpZHRoPSVkIGZhY3Rvcj0leCBvZmZzZXQ9JXggcmVxdWVzdD0leCBjb25maWc9JXggbmVnb0ZsYWdzPSV4XG4iLAogCQkJCWlkLCB3aWR0aCwgZmFjdG9yLCBvZmZzZXQsIHZhbCwgY29uZmlndXJhdGlvbiwgbmVnb0ZsYWdzKSk7CkBAIC01Mzc3LDEyICs1MzgzLDEyIEBACiAJCWlmIChwUGFnZTEpIHsKIAkJCW1wdHNjc2loX3NldERldmljZVBhZ2UxRmxhZ3MgKHdpZHRoLCBmYWN0b3IsIG9mZnNldCwgJnZhbCwKIAkJCQkJCSZjb25maWd1cmF0aW9uLCBkdi0+bm93LmZsYWdzKTsKLQkJCWRuZWdvcHJpbnRrKCgiRmluaXNoOiBpZD0lZCB3aWR0aD0lZCBvZmZzZXQ9JWQgZmFjdG9yPSV4IGZsYWdzPSV4IHJlcXVlc3Q9JXggY29uZmlnPSV4XG4iLAorCQkJZG5lZ29wcmludGsoKCJGaW5pc2g6IGlkPSVkIHdpZHRoPSVkIG9mZnNldD0lZCBmYWN0b3I9JXggbmVnb0ZsYWdzPSV4IHJlcXVlc3Q9JXggY29uZmlnPSV4XG4iLAogCQkJICAgICBpZCwgd2lkdGgsIG9mZnNldCwgZmFjdG9yLCBkdi0+bm93LmZsYWdzLCB2YWwsIGNvbmZpZ3VyYXRpb24pKTsKIAotCQkJcFBhZ2UxLT5SZXF1ZXN0ZWRQYXJhbWV0ZXJzID0gbGUzMl90b19jcHUodmFsKTsKKwkJCXBQYWdlMS0+UmVxdWVzdGVkUGFyYW1ldGVycyA9IGNwdV90b19sZTMyKHZhbCk7CiAJCQlwUGFnZTEtPlJlc2VydmVkID0gMDsKLQkJCXBQYWdlMS0+Q29uZmlndXJhdGlvbiA9IGxlMzJfdG9fY3B1KGNvbmZpZ3VyYXRpb24pOworCQkJcFBhZ2UxLT5Db25maWd1cmF0aW9uID0gY3B1X3RvX2xlMzIoY29uZmlndXJhdGlvbik7CiAJCX0KIAogCQlkZHZwcmludGsoKCJGaW5pc2g6IGlkPSVkIG9mZnNldD0lZCBmYWN0b3I9JXggd2lkdGg9JWQgcmVxdWVzdD0leCBjb25maWc9JXhcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNwaS5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYwppbmRleCBkZmE4ODA2Li41ODdkMTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNwaS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMKQEAgLTE2MiwxNSArMTYyLDE1IEBACiAJdTgJCQkqbWVtOwogCWludAkJCWVycm9yPTA7CiAJaW50CQkJcjsKLQkKKwogCWlmICgociA9IG1wdF9hdHRhY2gocGRldixpZCkpICE9IDApCiAJCXJldHVybiByOwotCQorCiAJaW9jID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWlvYy0+RG9uZUN0eCA9IG1wdHNwaURvbmVDdHg7CiAJaW9jLT5UYXNrQ3R4ID0gbXB0c3BpVGFza0N0eDsKIAlpb2MtPkludGVybmFsQ3R4ID0gbXB0c3BpSW50ZXJuYWxDdHg7Ci0JCisKIAkvKiAgQWRkZWQgc2FuaXR5IGNoZWNrIG9uIHJlYWRpbmVzcyBvZiB0aGUgTVBUIGFkYXB0ZXIuCiAJICovCiAJaWYgKGlvYy0+bGFzdF9zdGF0ZSAhPSBNUElfSU9DX1NUQVRFX09QRVJBVElPTkFMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9LY29uZmlnIGIvZHJpdmVycy9tZmQvS2NvbmZpZwppbmRleCAxNTg4YTU5Li41NTBmMjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWZkL0tjb25maWcKQEAgLTEzLDQgKzEzLDEzIEBACiAJZGVwZW5kcyBvbiBBUkNIX1NBMTEwMAogCXNlbGVjdCBNQ1AKIAorIyBDaGlwIGRyaXZlcnMKK2NvbmZpZyBNQ1BfVUNCMTIwMAorCXRyaXN0YXRlICJTdXBwb3J0IGZvciBVQ0IxMjAwIC8gVUNCMTMwMCIKKwlkZXBlbmRzIG9uIE1DUAorCitjb25maWcgTUNQX1VDQjEyMDBfVFMKKwl0cmlzdGF0ZSAiVG91Y2hzY3JlZW4gaW50ZXJmYWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNQ1BfVUNCMTIwMCAmJiBJTlBVVAorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCmluZGV4IDk4YmRkNmEuLmFkYjI5YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCkBAIC00LDMgKzQsOSBAQAogCiBvYmotJChDT05GSUdfTUNQKQkJKz0gbWNwLWNvcmUubwogb2JqLSQoQ09ORklHX01DUF9TQTExWDApCSs9IG1jcC1zYTExeDAubworb2JqLSQoQ09ORklHX01DUF9VQ0IxMjAwKQkrPSB1Y2IxeDAwLWNvcmUubworb2JqLSQoQ09ORklHX01DUF9VQ0IxMjAwX1RTKQkrPSB1Y2IxeDAwLXRzLm8KKworaWZlcSAoJChDT05GSUdfU0ExMTAwX0FTU0FCRVQpLHkpCitvYmotJChDT05GSUdfTUNQX1VDQjEyMDApCSs9IHVjYjF4MDAtYXNzYWJldC5vCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdWNiMXgwMC1hc3NhYmV0LmMgYi9kcml2ZXJzL21mZC91Y2IxeDAwLWFzc2FiZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI1ZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvdWNiMXgwMC1hc3NhYmV0LmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL21mZC91Y2IxeDAwLWFzc2FiZXQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSdXNzZWxsIEtpbmcsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBXZSBoYW5kbGUgdGhlIG1hY2hpbmUtc3BlY2lmaWMgYml0cyBvZiB0aGUgVUNCMXgwMCBkcml2ZXIgaGVyZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgInVjYjF4MDAuaCIKKworI2RlZmluZSBVQ0IxWDAwX0FUVFIobmFtZSxpbnB1dClcCitzdGF0aWMgc3NpemVfdCBuYW1lIyNfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJXAorCXN0cnVjdCB1Y2IxeDAwICp1Y2IgPSBjbGFzc2Rldl90b191Y2IxeDAwKGRldik7CQlcCisJaW50IHZhbDsJCQkJCQlcCisJdWNiMXgwMF9hZGNfZW5hYmxlKHVjYik7CQkJCVwKKwl2YWwgPSB1Y2IxeDAwX2FkY19yZWFkKHVjYiwgaW5wdXQsIFVDQl9OT1NZTkMpOwkJXAorCXVjYjF4MDBfYWRjX2Rpc2FibGUodWNiKTsJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOwkJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihuYW1lLDA0NDQsbmFtZSMjX3Nob3csTlVMTCkKKworVUNCMVgwMF9BVFRSKHZiYXR0LCBVQ0JfQURDX0lOUF9BRDEpOworVUNCMVgwMF9BVFRSKHZjaGFyZ2VyLCBVQ0JfQURDX0lOUF9BRDApOworVUNCMVgwMF9BVFRSKGJhdHRfdGVtcCwgVUNCX0FEQ19JTlBfQUQyKTsKKworc3RhdGljIGludCB1Y2IxeDAwX2Fzc2FiZXRfYWRkKHN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2KQoreworCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZSgmZGV2LT51Y2ItPmNkZXYsICZjbGFzc19kZXZpY2VfYXR0cl92YmF0dCk7CisJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPnVjYi0+Y2RldiwgJmNsYXNzX2RldmljZV9hdHRyX3ZjaGFyZ2VyKTsKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+dWNiLT5jZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfYmF0dF90ZW1wKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdWNiMXgwMF9hc3NhYmV0X3JlbW92ZShzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldikKK3sKKwljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+dWNiLT5jZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfYmF0dF90ZW1wKTsKKwljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+dWNiLT5jZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfdmNoYXJnZXIpOworCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZSgmZGV2LT51Y2ItPmNkZXYsICZjbGFzc19kZXZpY2VfYXR0cl92YmF0dCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWNiMXgwMF9kcml2ZXIgdWNiMXgwMF9hc3NhYmV0X2RyaXZlciA9IHsKKwkuYWRkCT0gdWNiMXgwMF9hc3NhYmV0X2FkZCwKKwkucmVtb3ZlCT0gdWNiMXgwMF9hc3NhYmV0X3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHVjYjF4MDBfYXNzYWJldF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVjYjF4MDBfcmVnaXN0ZXJfZHJpdmVyKCZ1Y2IxeDAwX2Fzc2FiZXRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVjYjF4MDBfYXNzYWJldF9leGl0KHZvaWQpCit7CisJdWNiMXgwMF91bnJlZ2lzdGVyX2RyaXZlcigmdWNiMXgwMF9hc3NhYmV0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHVjYjF4MDBfYXNzYWJldF9pbml0KTsKK21vZHVsZV9leGl0KHVjYjF4MDBfYXNzYWJldF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQXNzYWJldCBub2RkeSB0ZXN0aW5nIG9ubHkgZXhhbXBsZSBBREMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC91Y2IxeDAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjZjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC91Y2IxeDAwLWNvcmUuYwpAQCAtMCwwICsxLDY2NSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL21mZC91Y2IxeDAwLWNvcmUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgUnVzc2VsbCBLaW5nLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhlIFVDQjF4MDAgY29yZSBkcml2ZXIgcHJvdmlkZXMgYmFzaWMgc2VydmljZXMgZm9yIGhhbmRsaW5nIElPLAorICogIHRoZSBBREMsIGludGVycnVwdHMsIGFuZCBhY2Nlc3NpbmcgcmVnaXN0ZXJzLiAgSXQgaXMgZGVzaWduZWQKKyAqICBzdWNoIHRoYXQgZXZlcnl0aGluZyBnb2VzIHRocm91Z2ggdGhpcyBsYXllciwgdGhlcmVieSBwcm92aWRpbmcKKyAqICBhIGNvbnNpc3RlbnQgbG9ja2luZyBtZXRob2RvbG9neSwgYXMgd2VsbCBhcyBhbGxvd2luZyB0aGUgZHJpdmVycworICogIHRvIGJlIHVzZWQgb24gb3RoZXIgbm9uLU1DUC1lbmFibGVkIGhhcmR3YXJlIHBsYXRmb3Jtcy4KKyAqCisgKiAgTm90ZSB0aGF0IGFsbCBsb2NrcyBhcmUgcHJpdmF0ZSB0byB0aGlzIGZpbGUuICBOb3RoaW5nIGVsc2UgbWF5CisgKiAgdG91Y2ggdGhlbS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICJ1Y2IxeDAwLmgiCisKK3N0YXRpYyBERUNMQVJFX01VVEVYKHVjYjF4MDBfc2VtKTsKK3N0YXRpYyBMSVNUX0hFQUQodWNiMXgwMF9kcml2ZXJzKTsKK3N0YXRpYyBMSVNUX0hFQUQodWNiMXgwMF9kZXZpY2VzKTsKKworLyoqCisgKgl1Y2IxeDAwX2lvX3NldF9kaXIgLSBzZXQgSU8gZGlyZWN0aW9uCisgKglAdWNiOiBVQ0IxeDAwIHN0cnVjdHVyZSBkZXNjcmliaW5nIGNoaXAKKyAqCUBpbjogIGJpdGZpZWxkIG9mIElPIHBpbnMgdG8gYmUgc2V0IGFzIGlucHV0cworICoJQG91dDogYml0ZmllbGQgb2YgSU8gcGlucyB0byBiZSBzZXQgYXMgb3V0cHV0cworICoKKyAqCVNldCB0aGUgSU8gZGlyZWN0aW9uIG9mIHRoZSB0ZW4gZ2VuZXJhbCBwdXJwb3NlIElPIHBpbnMgb24KKyAqCXRoZSBVQ0IxeDAwIGNoaXAuICBUaGUgQGluIGJpdGZpZWxkIGhhcyBwcmlvcml0eSBvdmVyIHRoZQorICoJQG91dCBiaXRmaWVsZCwgaW4gdGhhdCBpZiB5b3Ugc3BlY2lmeSBhIHBpbiBhcyBib3RoIGlucHV0CisgKglhbmQgb3V0cHV0LCBpdCB3aWxsIGVuZCB1cCBhcyBhbiBpbnB1dC4KKyAqCisgKgl1Y2IxeDAwX2VuYWJsZSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgdG8gZW5hYmxlIHRoZSBjb21tcworICoJYmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICoJVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHNwaW5sb2NrLCBkaXNhYmxpbmcgaW50ZXJydXB0cy4KKyAqLwordm9pZCB1Y2IxeDAwX2lvX3NldF9kaXIoc3RydWN0IHVjYjF4MDAgKnVjYiwgdW5zaWduZWQgaW50IGluLCB1bnNpZ25lZCBpbnQgb3V0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWNiLT5pb19sb2NrLCBmbGFncyk7CisJdWNiLT5pb19kaXIgfD0gb3V0OworCXVjYi0+aW9fZGlyICY9IH5pbjsKKworCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lPX0RJUiwgdWNiLT5pb19kaXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVjYi0+aW9fbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqCXVjYjF4MDBfaW9fd3JpdGUgLSBzZXQgb3IgY2xlYXIgSU8gb3V0cHV0cworICoJQHVjYjogICBVQ0IxeDAwIHN0cnVjdHVyZSBkZXNjcmliaW5nIGNoaXAKKyAqCUBzZXQ6ICAgYml0ZmllbGQgb2YgSU8gcGlucyB0byBzZXQgdG8gbG9naWMgJzEnCisgKglAY2xlYXI6IGJpdGZpZWxkIG9mIElPIHBpbnMgdG8gc2V0IHRvIGxvZ2ljICcwJworICoKKyAqCVNldCB0aGUgSU8gb3V0cHV0IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgSU8gcGlucy4gIFRoZSB2YWx1ZQorICoJaXMgcmV0YWluZWQgaWYgdGhlIHBpbnMgYXJlIHN1YnNlcXVlbnRseSBjb25maWd1cmVkIGFzIGlucHV0cy4KKyAqCVRoZSBAY2xlYXIgYml0ZmllbGQgaGFzIHByaW9yaXR5IG92ZXIgdGhlIEBzZXQgYml0ZmllbGQgLQorICoJb3V0cHV0cyB3aWxsIGJlIGNsZWFyZWQuCisgKgorICoJdWNiMXgwMF9lbmFibGUgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIHRvIGVuYWJsZSB0aGUgY29tbXMKKyAqCWJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gdGFrZXMgYSBzcGlubG9jaywgZGlzYWJsaW5nIGludGVycnVwdHMuCisgKi8KK3ZvaWQgdWNiMXgwMF9pb193cml0ZShzdHJ1Y3QgdWNiMXgwMCAqdWNiLCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1Y2ItPmlvX2xvY2ssIGZsYWdzKTsKKwl1Y2ItPmlvX291dCB8PSBzZXQ7CisJdWNiLT5pb19vdXQgJj0gfmNsZWFyOworCisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSU9fREFUQSwgdWNiLT5pb19vdXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVjYi0+aW9fbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqCXVjYjF4MDBfaW9fcmVhZCAtIHJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIElPIHBpbnMKKyAqCUB1Y2I6IFVDQjF4MDAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpcAorICoKKyAqCVJldHVybiBhIGJpdGZpZWxkIGRlc2NyaWJpbmcgdGhlIGxvZ2ljIHN0YXRlIG9mIHRoZSB0ZW4KKyAqCWdlbmVyYWwgcHVycG9zZSBJTyBwaW5zLgorICoKKyAqCXVjYjF4MDBfZW5hYmxlIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCB0byBlbmFibGUgdGhlIGNvbW1zCisgKgliZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgYW55IHNlbWFwaG9yZXMgb3Igc3BpbmxvY2tzLgorICovCit1bnNpZ25lZCBpbnQgdWNiMXgwMF9pb19yZWFkKHN0cnVjdCB1Y2IxeDAwICp1Y2IpCit7CisJcmV0dXJuIHVjYjF4MDBfcmVnX3JlYWQodWNiLCBVQ0JfSU9fREFUQSk7Cit9CisKKy8qCisgKiBVQ0IxMzAwIGRhdGEgc2hlZXQgc2F5cyB3ZSBtdXN0OgorICogIDEuIGVuYWJsZSBBREMJPT4gNXVzIChpbmNsdWRpbmcgcmVmZXJlbmNlIHN0YXJ0dXAgdGltZSkKKyAqICAyLiBzZWxlY3QgaW5wdXQJPT4gNTEqdHNpYmNsayAgPT4gNC4zdXMKKyAqICAzLiBzdGFydCBjb252ZXJzaW9uCT0+IDEwMip0c2liY2xrID0+IDguNXVzCisgKiAodHNpYmNsayA9IDEvMTE5ODEwMDApCisgKiBQZXJpb2QgYmV0d2VlbiBTSUIgMTI4LWJpdCBmcmFtZXMgPSAxMC43dXMKKyAqLworCisvKioKKyAqCXVjYjF4MDBfYWRjX2VuYWJsZSAtIGVuYWJsZSB0aGUgQURDIGNvbnZlcnRlcgorICoJQHVjYjogVUNCMXgwMCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBjaGlwCisgKgorICoJRW5hYmxlIHRoZSB1Y2IxeDAwIGFuZCBBREMgY29udmVydGVyIG9uIHRoZSBVQ0IxeDAwIGZvciB1c2UuCisgKglBbnkgY29kZSB3aXNoaW5nIHRvIHVzZSB0aGUgQURDIGNvbnZlcnRlciBtdXN0IGNhbGwgdGhpcworICoJZnVuY3Rpb24gcHJpb3IgdG8gdXNpbmcgaXQuCisgKgorICoJVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgQURDIHNlbWFwaG9yZSB0byBwcmV2ZW50IHR3byBvciBtb3JlCisgKgljb25jdXJyZW50IHVzZXMsIGFuZCB0aGVyZWZvcmUgbWF5IHNsZWVwLiAgQXMgYSByZXN1bHQsIGl0CisgKgljYW4gb25seSBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQsIG5vdCBpbnRlcnJ1cHQKKyAqCWNvbnRleHQuCisgKgorICoJWW91IHNob3VsZCByZWxlYXNlIHRoZSBBREMgYXMgc29vbiBhcyBwb3NzaWJsZSB1c2luZworICoJdWNiMXgwMF9hZGNfZGlzYWJsZS4KKyAqLwordm9pZCB1Y2IxeDAwX2FkY19lbmFibGUoc3RydWN0IHVjYjF4MDAgKnVjYikKK3sKKwlkb3duKCZ1Y2ItPmFkY19zZW0pOworCisJdWNiLT5hZGNfY3IgfD0gVUNCX0FEQ19FTkE7CisKKwl1Y2IxeDAwX2VuYWJsZSh1Y2IpOworCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0FEQ19DUiwgdWNiLT5hZGNfY3IpOworfQorCisvKioKKyAqCXVjYjF4MDBfYWRjX3JlYWQgLSByZWFkIHRoZSBzcGVjaWZpZWQgQURDIGNoYW5uZWwKKyAqCUB1Y2I6IFVDQjF4MDAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpcAorICoJQGFkY19jaGFubmVsOiBBREMgY2hhbm5lbCBtYXNrCisgKglAc3luYzogd2FpdCBmb3Igc3luY3JvbmlzYXRpb24gcHVsc2UuCisgKgorICoJU3RhcnQgYW4gQURDIGNvbnZlcnNpb24gYW5kIHdhaXQgZm9yIHRoZSByZXN1bHQuICBOb3RlIHRoYXQKKyAqCXN5bmNocm9uaXNlZCBBREMgY29udmVyc2lvbnMgKHZpYSB0aGUgQURDU1lOQyBwaW4pIG11c3Qgd2FpdAorICoJdW50aWwgdGhlIHRyaWdnZXIgaXMgYXNzZXJ0ZWQgYW5kIHRoZSBjb252ZXJzaW9uIGlzIGZpbmlzaGVkLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gY3VycmVudGx5IHNwaW5zIHdhaXRpbmcgZm9yIHRoZSBjb252ZXJzaW9uIHRvCisgKgljb21wbGV0ZSAoMiBmcmFtZXMgbWF4IHdpdGhvdXQgc3luYykuCisgKgorICoJSWYgY2FsbGVkIGZvciBhIHN5bmNocm9uaXNlZCBBREMgY29udmVyc2lvbiwgaXQgbWF5IHNsZWVwCisgKgl3aXRoIHRoZSBBREMgc2VtYXBob3JlIGhlbGQuCisgKi8KK3Vuc2lnbmVkIGludCB1Y2IxeDAwX2FkY19yZWFkKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIGludCBhZGNfY2hhbm5lbCwgaW50IHN5bmMpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChzeW5jKQorCQlhZGNfY2hhbm5lbCB8PSBVQ0JfQURDX1NZTkNfRU5BOworCisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfQURDX0NSLCB1Y2ItPmFkY19jciB8IGFkY19jaGFubmVsKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIHVjYi0+YWRjX2NyIHwgYWRjX2NoYW5uZWwgfCBVQ0JfQURDX1NUQVJUKTsKKworCWZvciAoOzspIHsKKwkJdmFsID0gdWNiMXgwMF9yZWdfcmVhZCh1Y2IsIFVDQl9BRENfREFUQSk7CisJCWlmICh2YWwgJiBVQ0JfQURDX0RBVF9WQUwpCisJCQlicmVhazsKKwkJLyogeWllbGQgdG8gb3RoZXIgcHJvY2Vzc2VzICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCisJcmV0dXJuIFVDQl9BRENfREFUKHZhbCk7Cit9CisKKy8qKgorICoJdWNiMXgwMF9hZGNfZGlzYWJsZSAtIGRpc2FibGUgdGhlIEFEQyBjb252ZXJ0ZXIKKyAqCUB1Y2I6IFVDQjF4MDAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpcAorICoKKyAqCURpc2FibGUgdGhlIEFEQyBjb252ZXJ0ZXIgYW5kIHJlbGVhc2UgdGhlIEFEQyBzZW1hcGhvcmUuCisgKi8KK3ZvaWQgdWNiMXgwMF9hZGNfZGlzYWJsZShzdHJ1Y3QgdWNiMXgwMCAqdWNiKQoreworCXVjYi0+YWRjX2NyICY9IH5VQ0JfQURDX0VOQTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIHVjYi0+YWRjX2NyKTsKKwl1Y2IxeDAwX2Rpc2FibGUodWNiKTsKKworCXVwKCZ1Y2ItPmFkY19zZW0pOworfQorCisvKgorICogVUNCMXgwMCBJbnRlcnJ1cHQgaGFuZGxpbmcuCisgKgorICogVGhlIFVDQjF4MDAgY2FuIGdlbmVyYXRlIGludGVycnVwdHMgd2hlbiB0aGUgU0lCQ0xLIGlzIHN0b3BwZWQuCisgKiBTaW5jZSB3ZSBuZWVkIHRvIHJlYWQgYW4gaW50ZXJuYWwgcmVnaXN0ZXIsIHdlIG11c3QgcmUtZW5hYmxlCisgKiBTSUJDTEsgdG8gdGFsayB0byB0aGUgY2hpcC4gIFdlIGxlYXZlIHRoZSBjbG9jayBydW5uaW5nIHVudGlsCisgKiB3ZSBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgYWxsIGludGVycnVwdHMgZnJvbSB0aGUgY2hpcC4KKyAqLworc3RhdGljIGlycXJldHVybl90IHVjYjF4MDBfaXJxKGludCBpcnFuciwgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB1Y2IxeDAwICp1Y2IgPSBkZXZpZDsKKwlzdHJ1Y3QgdWNiMXgwMF9pcnEgKmlycTsKKwl1bnNpZ25lZCBpbnQgaXNyLCBpOworCisJdWNiMXgwMF9lbmFibGUodWNiKTsKKwlpc3IgPSB1Y2IxeDAwX3JlZ19yZWFkKHVjYiwgVUNCX0lFX1NUQVRVUyk7CisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfQ0xFQVIsIGlzcik7CisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfQ0xFQVIsIDApOworCisJZm9yIChpID0gMCwgaXJxID0gdWNiLT5pcnFfaGFuZGxlcjsgaSA8IDE2ICYmIGlzcjsgaSsrLCBpc3IgPj49IDEsIGlycSsrKQorCQlpZiAoaXNyICYgMSAmJiBpcnEtPmZuKQorCQkJaXJxLT5mbihpLCBpcnEtPmRldmlkKTsKKwl1Y2IxeDAwX2Rpc2FibGUodWNiKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKgl1Y2IxeDAwX2hvb2tfaXJxIC0gaG9vayBhIFVDQjF4MDAgaW50ZXJydXB0CisgKglAdWNiOiAgIFVDQjF4MDAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpcAorICoJQGlkeDogICBpbnRlcnJ1cHQgaW5kZXgKKyAqCUBmbjogICAgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGludGVycnVwdCBpcyB0cmlnZ2VyZWQKKyAqCUBkZXZpZDogZGV2aWNlIGlkIHRvIHBhc3MgdG8gaW50ZXJydXB0IGhhbmRsZXIKKyAqCisgKglIb29rIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0LiAgWW91IGNhbiBvbmx5IHJlZ2lzdGVyIG9uZSBoYW5kbGVyCisgKglmb3IgZWFjaCBpbnRlcnJ1cHQgc291cmNlLiAgVGhlIGludGVycnVwdCBzb3VyY2UgaXMgbm90IGVuYWJsZWQKKyAqCWJ5IHRoaXMgZnVuY3Rpb247IHVzZSB1Y2IxeDAwX2VuYWJsZV9pcnEgaW5zdGVhZC4KKyAqCisgKglJbnRlcnJ1cHQgaGFuZGxlcnMgd2lsbCBiZSBjYWxsZWQgd2l0aCBvdGhlciBpbnRlcnJ1cHRzIGVuYWJsZWQuCisgKgorICoJUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVycm9yczoKKyAqCSAtRUlOVkFMIGlmIHRoZSBpbnRlcnJ1cHQgaW5kZXggaXMgaW52YWxpZAorICoJIC1FQlVTWSBpZiB0aGUgaW50ZXJydXB0IGhhcyBhbHJlYWR5IGJlZW4gaG9va2VkCisgKi8KK2ludCB1Y2IxeDAwX2hvb2tfaXJxKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIHVuc2lnbmVkIGludCBpZHgsIHZvaWQgKCpmbikoaW50LCB2b2lkICopLCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgdWNiMXgwMF9pcnEgKmlycTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmIChpZHggPCAxNikgeworCQlpcnEgPSB1Y2ItPmlycV9oYW5kbGVyICsgaWR4OworCQlyZXQgPSAtRUJVU1k7CisKKwkJc3Bpbl9sb2NrX2lycSgmdWNiLT5sb2NrKTsKKwkJaWYgKGlycS0+Zm4gPT0gTlVMTCkgeworCQkJaXJxLT5kZXZpZCA9IGRldmlkOworCQkJaXJxLT5mbiA9IGZuOworCQkJcmV0ID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19pcnEoJnVjYi0+bG9jayk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJdWNiMXgwMF9lbmFibGVfaXJxIC0gZW5hYmxlIGFuIFVDQjF4MDAgaW50ZXJydXB0IHNvdXJjZQorICoJQHVjYjogVUNCMXgwMCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBjaGlwCisgKglAaWR4OiBpbnRlcnJ1cHQgaW5kZXgKKyAqCUBlZGdlczogaW50ZXJydXB0IGVkZ2VzIHRvIGVuYWJsZQorICoKKyAqCUVuYWJsZSB0aGUgc3BlY2lmaWVkIGludGVycnVwdCB0byB0cmlnZ2VyIG9uICVVQ0JfUklTSU5HLAorICoJJVVDQl9GQUxMSU5HIG9yIGJvdGggZWRnZXMuICBUaGUgaW50ZXJydXB0IHNob3VsZCBoYXZlIGJlZW4KKyAqCWhvb2tlZCBieSB1Y2IxeDAwX2hvb2tfaXJxLgorICovCit2b2lkIHVjYjF4MDBfZW5hYmxlX2lycShzdHJ1Y3QgdWNiMXgwMCAqdWNiLCB1bnNpZ25lZCBpbnQgaWR4LCBpbnQgZWRnZXMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpZHggPCAxNikgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdWNiLT5sb2NrLCBmbGFncyk7CisKKwkJdWNiMXgwMF9lbmFibGUodWNiKTsKKwkJaWYgKGVkZ2VzICYgVUNCX1JJU0lORykgeworCQkJdWNiLT5pcnFfcmlzX2VuYmwgfD0gMSA8PCBpZHg7CisJCQl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9SSVMsIHVjYi0+aXJxX3Jpc19lbmJsKTsKKwkJfQorCQlpZiAoZWRnZXMgJiBVQ0JfRkFMTElORykgeworCQkJdWNiLT5pcnFfZmFsX2VuYmwgfD0gMSA8PCBpZHg7CisJCQl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9GQUwsIHVjYi0+aXJxX2ZhbF9lbmJsKTsKKwkJfQorCQl1Y2IxeDAwX2Rpc2FibGUodWNiKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWNiLT5sb2NrLCBmbGFncyk7CisJfQorfQorCisvKioKKyAqCXVjYjF4MDBfZGlzYWJsZV9pcnEgLSBkaXNhYmxlIGFuIFVDQjF4MDAgaW50ZXJydXB0IHNvdXJjZQorICoJQHVjYjogVUNCMXgwMCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBjaGlwCisgKglAZWRnZXM6IGludGVycnVwdCBlZGdlcyB0byBkaXNhYmxlCisgKgorICoJRGlzYWJsZSB0aGUgc3BlY2lmaWVkIGludGVycnVwdCB0cmlnZ2VyaW5nIG9uIHRoZSBzcGVjaWZpZWQKKyAqCSglVUNCX1JJU0lORywgJVVDQl9GQUxMSU5HIG9yIGJvdGgpIGVkZ2VzLgorICovCit2b2lkIHVjYjF4MDBfZGlzYWJsZV9pcnEoc3RydWN0IHVjYjF4MDAgKnVjYiwgdW5zaWduZWQgaW50IGlkeCwgaW50IGVkZ2VzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaWR4IDwgMTYpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVjYi0+bG9jaywgZmxhZ3MpOworCisJCXVjYjF4MDBfZW5hYmxlKHVjYik7CisJCWlmIChlZGdlcyAmIFVDQl9SSVNJTkcpIHsKKwkJCXVjYi0+aXJxX3Jpc19lbmJsICY9IH4oMSA8PCBpZHgpOworCQkJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfUklTLCB1Y2ItPmlycV9yaXNfZW5ibCk7CisJCX0KKwkJaWYgKGVkZ2VzICYgVUNCX0ZBTExJTkcpIHsKKwkJCXVjYi0+aXJxX2ZhbF9lbmJsICY9IH4oMSA8PCBpZHgpOworCQkJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfRkFMLCB1Y2ItPmlycV9mYWxfZW5ibCk7CisJCX0KKwkJdWNiMXgwMF9kaXNhYmxlKHVjYik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVjYi0+bG9jaywgZmxhZ3MpOworCX0KK30KKworLyoqCisgKgl1Y2IxeDAwX2ZyZWVfaXJxIC0gZGlzYWJsZSBhbmQgZnJlZSB0aGUgc3BlY2lmaWVkIFVDQjF4MDAgaW50ZXJydXB0CisgKglAdWNiOiBVQ0IxeDAwIHN0cnVjdHVyZSBkZXNjcmliaW5nIGNoaXAKKyAqCUBpZHg6IGludGVycnVwdCBpbmRleAorICoJQGRldmlkOiBkZXZpY2UgaWQuCisgKgorICoJRGlzYWJsZSB0aGUgaW50ZXJydXB0IHNvdXJjZSBhbmQgcmVtb3ZlIHRoZSBoYW5kbGVyLiAgZGV2aWQgbXVzdAorICoJbWF0Y2ggdGhlIGRldmlkIHBhc3NlZCB3aGVuIGhvb2tpbmcgdGhlIGludGVycnVwdC4KKyAqCisgKglSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3JzOgorICoJIC1FSU5WQUwgaWYgdGhlIGludGVycnVwdCBpbmRleCBpcyBpbnZhbGlkCisgKgkgLUVOT0VOVCBpZiBkZXZpZCBkb2VzIG5vdCBtYXRjaAorICovCitpbnQgdWNiMXgwMF9mcmVlX2lycShzdHJ1Y3QgdWNiMXgwMCAqdWNiLCB1bnNpZ25lZCBpbnQgaWR4LCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgdWNiMXgwMF9pcnEgKmlycTsKKwlpbnQgcmV0OworCisJaWYgKGlkeCA+PSAxNikKKwkJZ290byBiYWQ7CisKKwlpcnEgPSB1Y2ItPmlycV9oYW5kbGVyICsgaWR4OworCXJldCA9IC1FTk9FTlQ7CisKKwlzcGluX2xvY2tfaXJxKCZ1Y2ItPmxvY2spOworCWlmIChpcnEtPmRldmlkID09IGRldmlkKSB7CisJCXVjYi0+aXJxX3Jpc19lbmJsICY9IH4oMSA8PCBpZHgpOworCQl1Y2ItPmlycV9mYWxfZW5ibCAmPSB+KDEgPDwgaWR4KTsKKworCQl1Y2IxeDAwX2VuYWJsZSh1Y2IpOworCQl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9SSVMsIHVjYi0+aXJxX3Jpc19lbmJsKTsKKwkJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfRkFMLCB1Y2ItPmlycV9mYWxfZW5ibCk7CisJCXVjYjF4MDBfZGlzYWJsZSh1Y2IpOworCisJCWlycS0+Zm4gPSBOVUxMOworCQlpcnEtPmRldmlkID0gTlVMTDsKKwkJcmV0ID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZ1Y2ItPmxvY2spOworCXJldHVybiByZXQ7CisKK2JhZDoKKwlwcmludGsoS0VSTl9FUlIgIkZyZWVpbmcgYmFkIFVDQjF4MDAgaXJxICVkXG4iLCBpZHgpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHVjYjF4MDBfYWRkX2RldihzdHJ1Y3QgdWNiMXgwMCAqdWNiLCBzdHJ1Y3QgdWNiMXgwMF9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldjsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCWRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Y2IxeDAwX2RldiksIEdGUF9LRVJORUwpOworCWlmIChkZXYpIHsKKwkJZGV2LT51Y2IgPSB1Y2I7CisJCWRldi0+ZHJ2ID0gZHJ2OworCisJCXJldCA9IGRydi0+YWRkKGRldik7CisKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlsaXN0X2FkZCgmZGV2LT5kZXZfbm9kZSwgJnVjYi0+ZGV2cyk7CisJCQlsaXN0X2FkZCgmZGV2LT5kcnZfbm9kZSwgJmRydi0+ZGV2cyk7CisJCX0gZWxzZSB7CisJCQlrZnJlZShkZXYpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHVjYjF4MDBfcmVtb3ZlX2RldihzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldikKK3sKKwlkZXYtPmRydi0+cmVtb3ZlKGRldik7CisJbGlzdF9kZWwoJmRldi0+ZGV2X25vZGUpOworCWxpc3RfZGVsKCZkZXYtPmRydl9ub2RlKTsKKwlrZnJlZShkZXYpOworfQorCisvKgorICogVHJ5IHRvIHByb2JlIG91ciBpbnRlcnJ1cHQsIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gbG90cyBvZgorICogaGFyZC1jb2RlZCBtYWNoaW5lIGRlcGVuZGVuY2llcy4gIEZvciByZWZlcmVuY2UsIHRoZSBleHBlY3RlZAorICogSVJRIG1hcHBpbmdzIGFyZToKKyAqCisgKiAgCU1hY2hpbmUJCURlZmF1bHQgSVJRCisgKglhZHNiaXRzeQlJUlFfR1BDSU40CisgKgljZXJmCQlJUlFfR1BJT19VQ0IxMjAwX0lSUQorICoJZmxleGFuZXQJSVJRX0dQSU9fR1VJCisgKglmcmVlYmlyZAlJUlFfR1BJT19GUkVFQklSRF9VQ0IxMzAwX0lSUQorICoJZ3JhcGhpY3NjbGllbnQJQURTX0VYVF9JUlEoOCkKKyAqCWdyYXBoaWNzbWFzdGVyCUFEU19FWFRfSVJRKDgpCisgKglsYXJ0CQlMQVJUX0lSUV9VQ0IxMjAwCisgKglvbW5pbWV0ZXIJSVJRX0dQSU8yMworICoJcGZzMTY4CQlJUlFfR1BJT19VQ0IxMzAwX0lSUQorICoJc2ltcGFkCQlJUlFfR1BJT19VQ0IxMzAwX0lSUQorICoJc2hhbm5vbgkJU0hBTk5PTl9JUlFfR1BJT19JUlFfQ09ERUMKKyAqCXlvcHkJCUlSUV9HUElPX1VDQjEyMDBfSVJRCisgKi8KK3N0YXRpYyBpbnQgdWNiMXgwMF9kZXRlY3RfaXJxKHN0cnVjdCB1Y2IxeDAwICp1Y2IpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCisJbWFzayA9IHByb2JlX2lycV9vbigpOworCWlmICghbWFzaykKKwkJcmV0dXJuIE5PX0lSUTsKKworCS8qCisJICogRW5hYmxlIHRoZSBBREMgaW50ZXJydXB0LgorCSAqLworCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX1JJUywgVUNCX0lFX0FEQyk7CisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfRkFMLCBVQ0JfSUVfQURDKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9DTEVBUiwgMHhmZmZmKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9DTEVBUiwgMCk7CisKKwkvKgorCSAqIENhdXNlIGFuIEFEQyBpbnRlcnJ1cHQuCisJICovCisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfQURDX0NSLCBVQ0JfQURDX0VOQSk7CisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfQURDX0NSLCBVQ0JfQURDX0VOQSB8IFVDQl9BRENfU1RBUlQpOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgY29udmVyc2lvbiB0byBjb21wbGV0ZS4KKwkgKi8KKwl3aGlsZSAoKHVjYjF4MDBfcmVnX3JlYWQodWNiLCBVQ0JfQURDX0RBVEEpICYgVUNCX0FEQ19EQVRfVkFMKSA9PSAwKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIDApOworCisJLyoKKwkgKiBEaXNhYmxlIGFuZCBjbGVhciBpbnRlcnJ1cHQuCisJICovCisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfUklTLCAwKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9GQUwsIDApOworCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0NMRUFSLCAweGZmZmYpOworCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0NMRUFSLCAwKTsKKworCS8qCisJICogUmVhZCB0cmlnZ2VyZWQgaW50ZXJydXB0LgorCSAqLworCXJldHVybiBwcm9iZV9pcnFfb2ZmKG1hc2spOworfQorCitzdGF0aWMgaW50IHVjYjF4MDBfcHJvYmUoc3RydWN0IG1jcCAqbWNwKQoreworCXN0cnVjdCB1Y2IxeDAwICp1Y2I7CisJc3RydWN0IHVjYjF4MDBfZHJpdmVyICpkcnY7CisJdW5zaWduZWQgaW50IGlkOworCWludCByZXQgPSAtRU5PREVWOworCisJbWNwX2VuYWJsZShtY3ApOworCWlkID0gbWNwX3JlZ19yZWFkKG1jcCwgVUNCX0lEKTsKKworCWlmIChpZCAhPSBVQ0JfSURfMTIwMCAmJiBpZCAhPSBVQ0JfSURfMTMwMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJVQ0IxeDAwIElEIG5vdCBmb3VuZDogJTA0eFxuIiwgaWQpOworCQlnb3RvIGVycl9kaXNhYmxlOworCX0KKworCXVjYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Y2IxeDAwKSwgR0ZQX0tFUk5FTCk7CisJcmV0ID0gLUVOT01FTTsKKwlpZiAoIXVjYikKKwkJZ290byBlcnJfZGlzYWJsZTsKKworCW1lbXNldCh1Y2IsIDAsIHNpemVvZihzdHJ1Y3QgdWNiMXgwMCkpOworCisJdWNiLT5jZGV2LmNsYXNzID0gJnVjYjF4MDBfY2xhc3M7CisJdWNiLT5jZGV2LmRldiA9ICZtY3AtPmF0dGFjaGVkX2RldmljZTsKKwlzdHJsY3B5KHVjYi0+Y2Rldi5jbGFzc19pZCwgInVjYjF4MDAiLCBzaXplb2YodWNiLT5jZGV2LmNsYXNzX2lkKSk7CisKKwlzcGluX2xvY2tfaW5pdCgmdWNiLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmdWNiLT5pb19sb2NrKTsKKwlzZW1hX2luaXQoJnVjYi0+YWRjX3NlbSwgMSk7CisKKwl1Y2ItPmlkICA9IGlkOworCXVjYi0+bWNwID0gbWNwOworCXVjYi0+aXJxID0gdWNiMXgwMF9kZXRlY3RfaXJxKHVjYik7CisJaWYgKHVjYi0+aXJxID09IE5PX0lSUSkgeworCQlwcmludGsoS0VSTl9FUlIgIlVDQjF4MDA6IElSUSBwcm9iZSBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKHVjYi0+aXJxLCB1Y2IxeDAwX2lycSwgMCwgIlVDQjF4MDAiLCB1Y2IpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1Y2IxeDAwOiB1bmFibGUgdG8gZ3JhYiBpcnElZDogJWRcbiIsCisJCQl1Y2ItPmlycSwgcmV0KTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlzZXRfaXJxX3R5cGUodWNiLT5pcnEsIElSUVRfUklTSU5HKTsKKwltY3Bfc2V0X2RydmRhdGEobWNwLCB1Y2IpOworCisJcmV0ID0gY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZ1Y2ItPmNkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2lycTsKKworCUlOSVRfTElTVF9IRUFEKCZ1Y2ItPmRldnMpOworCWRvd24oJnVjYjF4MDBfc2VtKTsKKwlsaXN0X2FkZCgmdWNiLT5ub2RlLCAmdWNiMXgwMF9kZXZpY2VzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRydiwgJnVjYjF4MDBfZHJpdmVycywgbm9kZSkgeworCQl1Y2IxeDAwX2FkZF9kZXYodWNiLCBkcnYpOworCX0KKwl1cCgmdWNiMXgwMF9zZW0pOworCWdvdG8gb3V0OworCisgZXJyX2lycToKKwlmcmVlX2lycSh1Y2ItPmlycSwgdWNiKTsKKyBlcnJfZnJlZToKKwlrZnJlZSh1Y2IpOworIGVycl9kaXNhYmxlOgorCW1jcF9kaXNhYmxlKG1jcCk7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHVjYjF4MDBfcmVtb3ZlKHN0cnVjdCBtY3AgKm1jcCkKK3sKKwlzdHJ1Y3QgdWNiMXgwMCAqdWNiID0gbWNwX2dldF9kcnZkYXRhKG1jcCk7CisJc3RydWN0IGxpc3RfaGVhZCAqbCwgKm47CisKKwlkb3duKCZ1Y2IxeDAwX3NlbSk7CisJbGlzdF9kZWwoJnVjYi0+bm9kZSk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIG4sICZ1Y2ItPmRldnMpIHsKKwkJc3RydWN0IHVjYjF4MDBfZGV2ICpkZXYgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCB1Y2IxeDAwX2RldiwgZGV2X25vZGUpOworCQl1Y2IxeDAwX3JlbW92ZV9kZXYoZGV2KTsKKwl9CisJdXAoJnVjYjF4MDBfc2VtKTsKKworCWZyZWVfaXJxKHVjYi0+aXJxLCB1Y2IpOworCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZ1Y2ItPmNkZXYpOworfQorCitzdGF0aWMgdm9pZCB1Y2IxeDAwX3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB1Y2IxeDAwICp1Y2IgPSBjbGFzc2Rldl90b191Y2IxeDAwKGRldik7CisJa2ZyZWUodWNiKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzcyB1Y2IxeDAwX2NsYXNzID0geworCS5uYW1lCQk9ICJ1Y2IxeDAwIiwKKwkucmVsZWFzZQk9IHVjYjF4MDBfcmVsZWFzZSwKK307CisKK2ludCB1Y2IxeDAwX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdWNiMXgwMF9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgdWNiMXgwMCAqdWNiOworCisJSU5JVF9MSVNUX0hFQUQoJmRydi0+ZGV2cyk7CisJZG93bigmdWNiMXgwMF9zZW0pOworCWxpc3RfYWRkKCZkcnYtPm5vZGUsICZ1Y2IxeDAwX2RyaXZlcnMpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodWNiLCAmdWNiMXgwMF9kZXZpY2VzLCBub2RlKSB7CisJCXVjYjF4MDBfYWRkX2Rldih1Y2IsIGRydik7CisJfQorCXVwKCZ1Y2IxeDAwX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdWNiMXgwMF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdWNiMXgwMF9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuLCAqbDsKKworCWRvd24oJnVjYjF4MDBfc2VtKTsKKwlsaXN0X2RlbCgmZHJ2LT5ub2RlKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgbiwgJmRydi0+ZGV2cykgeworCQlzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldiA9IGxpc3RfZW50cnkobCwgc3RydWN0IHVjYjF4MDBfZGV2LCBkcnZfbm9kZSk7CisJCXVjYjF4MDBfcmVtb3ZlX2RldihkZXYpOworCX0KKwl1cCgmdWNiMXgwMF9zZW0pOworfQorCitzdGF0aWMgaW50IHVjYjF4MDBfc3VzcGVuZChzdHJ1Y3QgbWNwICptY3AsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgdWNiMXgwMCAqdWNiID0gbWNwX2dldF9kcnZkYXRhKG1jcCk7CisJc3RydWN0IHVjYjF4MDBfZGV2ICpkZXY7CisKKwlkb3duKCZ1Y2IxeDAwX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ1Y2ItPmRldnMsIGRldl9ub2RlKSB7CisJCWlmIChkZXYtPmRydi0+c3VzcGVuZCkKKwkJCWRldi0+ZHJ2LT5zdXNwZW5kKGRldiwgc3RhdGUpOworCX0KKwl1cCgmdWNiMXgwMF9zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVjYjF4MDBfcmVzdW1lKHN0cnVjdCBtY3AgKm1jcCkKK3sKKwlzdHJ1Y3QgdWNiMXgwMCAqdWNiID0gbWNwX2dldF9kcnZkYXRhKG1jcCk7CisJc3RydWN0IHVjYjF4MDBfZGV2ICpkZXY7CisKKwlkb3duKCZ1Y2IxeDAwX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ1Y2ItPmRldnMsIGRldl9ub2RlKSB7CisJCWlmIChkZXYtPmRydi0+cmVzdW1lKQorCQkJZGV2LT5kcnYtPnJlc3VtZShkZXYpOworCX0KKwl1cCgmdWNiMXgwMF9zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG1jcF9kcml2ZXIgdWNiMXgwMF9kcml2ZXIgPSB7CisJLmRydgkJPSB7CisJCS5uYW1lCT0gInVjYjF4MDAiLAorCX0sCisJLnByb2JlCQk9IHVjYjF4MDBfcHJvYmUsCisJLnJlbW92ZQkJPSB1Y2IxeDAwX3JlbW92ZSwKKwkuc3VzcGVuZAk9IHVjYjF4MDBfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHVjYjF4MDBfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdWNiMXgwMF9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IGNsYXNzX3JlZ2lzdGVyKCZ1Y2IxeDAwX2NsYXNzKTsKKwlpZiAocmV0ID09IDApIHsKKwkJcmV0ID0gbWNwX2RyaXZlcl9yZWdpc3RlcigmdWNiMXgwMF9kcml2ZXIpOworCQlpZiAocmV0KQorCQkJY2xhc3NfdW5yZWdpc3RlcigmdWNiMXgwMF9jbGFzcyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1Y2IxeDAwX2V4aXQodm9pZCkKK3sKKwltY3BfZHJpdmVyX3VucmVnaXN0ZXIoJnVjYjF4MDBfZHJpdmVyKTsKKwljbGFzc191bnJlZ2lzdGVyKCZ1Y2IxeDAwX2NsYXNzKTsKK30KKworbW9kdWxlX2luaXQodWNiMXgwMF9pbml0KTsKK21vZHVsZV9leGl0KHVjYjF4MDBfZXhpdCk7CisKK0VYUE9SVF9TWU1CT0wodWNiMXgwMF9jbGFzcyk7CisKK0VYUE9SVF9TWU1CT0wodWNiMXgwMF9pb19zZXRfZGlyKTsKK0VYUE9SVF9TWU1CT0wodWNiMXgwMF9pb193cml0ZSk7CitFWFBPUlRfU1lNQk9MKHVjYjF4MDBfaW9fcmVhZCk7CisKK0VYUE9SVF9TWU1CT0wodWNiMXgwMF9hZGNfZW5hYmxlKTsKK0VYUE9SVF9TWU1CT0wodWNiMXgwMF9hZGNfcmVhZCk7CitFWFBPUlRfU1lNQk9MKHVjYjF4MDBfYWRjX2Rpc2FibGUpOworCitFWFBPUlRfU1lNQk9MKHVjYjF4MDBfaG9va19pcnEpOworRVhQT1JUX1NZTUJPTCh1Y2IxeDAwX2ZyZWVfaXJxKTsKK0VYUE9SVF9TWU1CT0wodWNiMXgwMF9lbmFibGVfaXJxKTsKK0VYUE9SVF9TWU1CT0wodWNiMXgwMF9kaXNhYmxlX2lycSk7CisKK0VYUE9SVF9TWU1CT0wodWNiMXgwMF9yZWdpc3Rlcl9kcml2ZXIpOworRVhQT1JUX1NZTUJPTCh1Y2IxeDAwX3VucmVnaXN0ZXJfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVUNCMXgwMCBjb3JlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdWNiMXgwMC10cy5jIGIvZHJpdmVycy9tZmQvdWNiMXgwMC10cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NTFkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiAgVG91Y2hzY3JlZW4gZHJpdmVyIGZvciBVQ0IxeDAwLWJhc2VkIHRvdWNoc2NyZWVucworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgUnVzc2VsbCBLaW5nLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogIENvcHlyaWdodCAoQykgMjAwNSBQYXZlbCBNYWNoZWsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIDIxLUphbi0yMDAyIDxqY29AaWN0LmVzPiA6CisgKgorICogQWRkZWQgc3VwcG9ydCBmb3Igc3luY2hyb25vdXMgQS9EIG1vZGUuIFRoaXMgbW9kZSBpcyB1c2VmdWwgdG8KKyAqIGF2b2lkIG5vaXNlIGluZHVjZWQgaW4gdGhlIHRvdWNocGFuZWwgYnkgdGhlIExDRCwgcHJvdmlkZWQgdGhhdAorICogdGhlIFVDQjF4MDAgaGFzIGEgdmFsaWQgTENEIHN5bmMgc2lnbmFsIHJvdXRlZCB0byBpdHMgQURDU1lOQyBwaW4uCisgKiBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBzaWduYWwgY29ubmVjdGVkIHRvIHRoZSBBRENTWU5DCisgKiBwaW4gc2hvdWxkIHByb3ZpZGUgcHVsc2VzIGV2ZW4gd2hlbiB0aGUgTENEIGlzIGJsYW5rZWQsIG90aGVyd2lzZQorICogYSBwZW4gdG91Y2ggbmVlZGVkIHRvIHVuYmxhbmsgdGhlIExDRCB3aWxsIG5ldmVyIGJlIHJlYWQuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJ1Y2IxeDAwLmgiCisKKworc3RydWN0IHVjYjF4MDBfdHMgeworCXN0cnVjdCBpbnB1dF9kZXYJaWRldjsKKwlzdHJ1Y3QgdWNiMXgwMAkJKnVjYjsKKworCXdhaXRfcXVldWVfaGVhZF90CWlycV93YWl0OworCXN0cnVjdCB0YXNrX3N0cnVjdAkqcnRhc2s7CisJdTE2CQkJeF9yZXM7CisJdTE2CQkJeV9yZXM7CisKKwlpbnQJCQlyZXN0YXJ0OjE7CisJaW50CQkJYWRjc3luYzoxOworfTsKKworc3RhdGljIGludCBhZGNzeW5jOworCitzdGF0aWMgaW5saW5lIHZvaWQgdWNiMXgwMF90c19ldnRfYWRkKHN0cnVjdCB1Y2IxeDAwX3RzICp0cywgdTE2IHByZXNzdXJlLCB1MTYgeCwgdTE2IHkpCit7CisJaW5wdXRfcmVwb3J0X2FicygmdHMtPmlkZXYsIEFCU19YLCB4KTsKKwlpbnB1dF9yZXBvcnRfYWJzKCZ0cy0+aWRldiwgQUJTX1ksIHkpOworCWlucHV0X3JlcG9ydF9hYnMoJnRzLT5pZGV2LCBBQlNfUFJFU1NVUkUsIHByZXNzdXJlKTsKKwlpbnB1dF9zeW5jKCZ0cy0+aWRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1Y2IxeDAwX3RzX2V2ZW50X3JlbGVhc2Uoc3RydWN0IHVjYjF4MDBfdHMgKnRzKQoreworCWlucHV0X3JlcG9ydF9hYnMoJnRzLT5pZGV2LCBBQlNfUFJFU1NVUkUsIDApOworCWlucHV0X3N5bmMoJnRzLT5pZGV2KTsKK30KKworLyoKKyAqIFN3aXRjaCB0byBpbnRlcnJ1cHQgbW9kZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVjYjF4MDBfdHNfbW9kZV9pbnQoc3RydWN0IHVjYjF4MDBfdHMgKnRzKQoreworCXVjYjF4MDBfcmVnX3dyaXRlKHRzLT51Y2IsIFVDQl9UU19DUiwKKwkJCVVDQl9UU19DUl9UU01YX1BPVyB8IFVDQl9UU19DUl9UU1BYX1BPVyB8CisJCQlVQ0JfVFNfQ1JfVFNNWV9HTkQgfCBVQ0JfVFNfQ1JfVFNQWV9HTkQgfAorCQkJVUNCX1RTX0NSX01PREVfSU5UKTsKK30KKworLyoKKyAqIFN3aXRjaCB0byBwcmVzc3VyZSBtb2RlLCBhbmQgcmVhZCBwcmVzc3VyZS4gIFdlIGRvbid0IG5lZWQgdG8gd2FpdAorICogaGVyZSwgc2luY2UgYm90aCBwbGF0ZXMgYXJlIGJlaW5nIGRyaXZlbi4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdWNiMXgwMF90c19yZWFkX3ByZXNzdXJlKHN0cnVjdCB1Y2IxeDAwX3RzICp0cykKK3sKKwl1Y2IxeDAwX3JlZ193cml0ZSh0cy0+dWNiLCBVQ0JfVFNfQ1IsCisJCQlVQ0JfVFNfQ1JfVFNNWF9QT1cgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfAorCQkJVUNCX1RTX0NSX1RTTVlfR05EIHwgVUNCX1RTX0NSX1RTUFlfR05EIHwKKwkJCVVDQl9UU19DUl9NT0RFX1BSRVMgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOworCisJcmV0dXJuIHVjYjF4MDBfYWRjX3JlYWQodHMtPnVjYiwgVUNCX0FEQ19JTlBfVFNQWSwgdHMtPmFkY3N5bmMpOworfQorCisvKgorICogU3dpdGNoIHRvIFggcG9zaXRpb24gbW9kZSBhbmQgbWVhc3VyZSBZIHBsYXRlLiAgV2Ugc3dpdGNoIHRoZSBwbGF0ZQorICogY29uZmlndXJhdGlvbiBpbiBwcmVzc3VyZSBtb2RlLCB0aGVuIHN3aXRjaCB0byBwb3NpdGlvbiBtb2RlLiAgVGhpcworICogZ2l2ZXMgYSBmYXN0ZXIgcmVzcG9uc2UgdGltZS4gIEV2ZW4gc28sIHdlIG5lZWQgdG8gd2FpdCBhYm91dCA1NXVzCisgKiBmb3IgdGhpbmdzIHRvIHN0YWJpbGlzZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdWNiMXgwMF90c19yZWFkX3hwb3Moc3RydWN0IHVjYjF4MDBfdHMgKnRzKQoreworCXVjYjF4MDBfcmVnX3dyaXRlKHRzLT51Y2IsIFVDQl9UU19DUiwKKwkJCVVDQl9UU19DUl9UU01YX0dORCB8IFVDQl9UU19DUl9UU1BYX1BPVyB8CisJCQlVQ0JfVFNfQ1JfTU9ERV9QUkVTIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh0cy0+dWNiLCBVQ0JfVFNfQ1IsCisJCQlVQ0JfVFNfQ1JfVFNNWF9HTkQgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfAorCQkJVUNCX1RTX0NSX01PREVfUFJFUyB8IFVDQl9UU19DUl9CSUFTX0VOQSk7CisJdWNiMXgwMF9yZWdfd3JpdGUodHMtPnVjYiwgVUNCX1RTX0NSLAorCQkJVUNCX1RTX0NSX1RTTVhfR05EIHwgVUNCX1RTX0NSX1RTUFhfUE9XIHwKKwkJCVVDQl9UU19DUl9NT0RFX1BPUyB8IFVDQl9UU19DUl9CSUFTX0VOQSk7CisKKwl1ZGVsYXkoNTUpOworCisJcmV0dXJuIHVjYjF4MDBfYWRjX3JlYWQodHMtPnVjYiwgVUNCX0FEQ19JTlBfVFNQWSwgdHMtPmFkY3N5bmMpOworfQorCisvKgorICogU3dpdGNoIHRvIFkgcG9zaXRpb24gbW9kZSBhbmQgbWVhc3VyZSBYIHBsYXRlLiAgV2Ugc3dpdGNoIHRoZSBwbGF0ZQorICogY29uZmlndXJhdGlvbiBpbiBwcmVzc3VyZSBtb2RlLCB0aGVuIHN3aXRjaCB0byBwb3NpdGlvbiBtb2RlLiAgVGhpcworICogZ2l2ZXMgYSBmYXN0ZXIgcmVzcG9uc2UgdGltZS4gIEV2ZW4gc28sIHdlIG5lZWQgdG8gd2FpdCBhYm91dCA1NXVzCisgKiBmb3IgdGhpbmdzIHRvIHN0YWJpbGlzZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdWNiMXgwMF90c19yZWFkX3lwb3Moc3RydWN0IHVjYjF4MDBfdHMgKnRzKQoreworCXVjYjF4MDBfcmVnX3dyaXRlKHRzLT51Y2IsIFVDQl9UU19DUiwKKwkJCVVDQl9UU19DUl9UU01ZX0dORCB8IFVDQl9UU19DUl9UU1BZX1BPVyB8CisJCQlVQ0JfVFNfQ1JfTU9ERV9QUkVTIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh0cy0+dWNiLCBVQ0JfVFNfQ1IsCisJCQlVQ0JfVFNfQ1JfVFNNWV9HTkQgfCBVQ0JfVFNfQ1JfVFNQWV9QT1cgfAorCQkJVUNCX1RTX0NSX01PREVfUFJFUyB8IFVDQl9UU19DUl9CSUFTX0VOQSk7CisJdWNiMXgwMF9yZWdfd3JpdGUodHMtPnVjYiwgVUNCX1RTX0NSLAorCQkJVUNCX1RTX0NSX1RTTVlfR05EIHwgVUNCX1RTX0NSX1RTUFlfUE9XIHwKKwkJCVVDQl9UU19DUl9NT0RFX1BPUyB8IFVDQl9UU19DUl9CSUFTX0VOQSk7CisKKwl1ZGVsYXkoNTUpOworCisJcmV0dXJuIHVjYjF4MDBfYWRjX3JlYWQodHMtPnVjYiwgVUNCX0FEQ19JTlBfVFNQWCwgdHMtPmFkY3N5bmMpOworfQorCisvKgorICogU3dpdGNoIHRvIFggcGxhdGUgcmVzaXN0YW5jZSBtb2RlLiAgU2V0IE1YIHRvIGdyb3VuZCwgUFggdG8KKyAqIHN1cHBseS4gIE1lYXN1cmUgY3VycmVudC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdWNiMXgwMF90c19yZWFkX3hyZXMoc3RydWN0IHVjYjF4MDBfdHMgKnRzKQoreworCXVjYjF4MDBfcmVnX3dyaXRlKHRzLT51Y2IsIFVDQl9UU19DUiwKKwkJCVVDQl9UU19DUl9UU01YX0dORCB8IFVDQl9UU19DUl9UU1BYX1BPVyB8CisJCQlVQ0JfVFNfQ1JfTU9ERV9QUkVTIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKKwlyZXR1cm4gdWNiMXgwMF9hZGNfcmVhZCh0cy0+dWNiLCAwLCB0cy0+YWRjc3luYyk7Cit9CisKKy8qCisgKiBTd2l0Y2ggdG8gWSBwbGF0ZSByZXNpc3RhbmNlIG1vZGUuICBTZXQgTVkgdG8gZ3JvdW5kLCBQWSB0bworICogc3VwcGx5LiAgTWVhc3VyZSBjdXJyZW50LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxeDAwX3RzX3JlYWRfeXJlcyhzdHJ1Y3QgdWNiMXgwMF90cyAqdHMpCit7CisJdWNiMXgwMF9yZWdfd3JpdGUodHMtPnVjYiwgVUNCX1RTX0NSLAorCQkJVUNCX1RTX0NSX1RTTVlfR05EIHwgVUNCX1RTX0NSX1RTUFlfUE9XIHwKKwkJCVVDQl9UU19DUl9NT0RFX1BSRVMgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOworCXJldHVybiB1Y2IxeDAwX2FkY19yZWFkKHRzLT51Y2IsIDAsIHRzLT5hZGNzeW5jKTsKK30KKworLyoKKyAqIFRoaXMgaXMgYSBSVCBrZXJuZWwgdGhyZWFkIHRoYXQgaGFuZGxlcyB0aGUgQURDIGFjY2Vzc2VzCisgKiAobWFpbmx5IHNvIHdlIGNhbiB1c2Ugc2VtYXBob3JlcyBpbiB0aGUgVUNCMTIwMCBjb3JlIGNvZGUKKyAqIHRvIHNlcmlhbGlzZSBhY2Nlc3NlcyB0byB0aGUgQURDKS4KKyAqLworc3RhdGljIGludCB1Y2IxeDAwX3RocmVhZCh2b2lkICpfdHMpCit7CisJc3RydWN0IHVjYjF4MDBfdHMgKnRzID0gX3RzOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOworCWludCB2YWxpZDsKKworCS8qCisJICogV2UgY291bGQgcnVuIGFzIGEgcmVhbC10aW1lIHRocmVhZC4gIEhvd2V2ZXIsIHRodXMgZmFyCisJICogdGhpcyBkb2Vzbid0IHNlZW0gdG8gYmUgbmVjZXNzYXJ5LgorCSAqLworLy8JdHNrLT5wb2xpY3kgPSBTQ0hFRF9GSUZPOworLy8JdHNrLT5ydF9wcmlvcml0eSA9IDE7CisKKwl2YWxpZCA9IDA7CisKKwlhZGRfd2FpdF9xdWV1ZSgmdHMtPmlycV93YWl0LCAmd2FpdCk7CisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJdW5zaWduZWQgaW50IHgsIHksIHAsIHZhbDsKKwkJc2lnbmVkIGxvbmcgdGltZW91dDsKKworCQl0cy0+cmVzdGFydCA9IDA7CisKKwkJdWNiMXgwMF9hZGNfZW5hYmxlKHRzLT51Y2IpOworCisJCXggPSB1Y2IxeDAwX3RzX3JlYWRfeHBvcyh0cyk7CisJCXkgPSB1Y2IxeDAwX3RzX3JlYWRfeXBvcyh0cyk7CisJCXAgPSB1Y2IxeDAwX3RzX3JlYWRfcHJlc3N1cmUodHMpOworCisJCS8qCisJCSAqIFN3aXRjaCBiYWNrIHRvIGludGVycnVwdCBtb2RlLgorCQkgKi8KKwkJdWNiMXgwMF90c19tb2RlX2ludCh0cyk7CisJCXVjYjF4MDBfYWRjX2Rpc2FibGUodHMtPnVjYik7CisKKwkJbXNsZWVwKDEwKTsKKworCQl1Y2IxeDAwX2VuYWJsZSh0cy0+dWNiKTsKKwkJdmFsID0gdWNiMXgwMF9yZWdfcmVhZCh0cy0+dWNiLCBVQ0JfVFNfQ1IpOworCisJCWlmICh2YWwgJiAoVUNCX1RTX0NSX1RTUFhfTE9XIHwgVUNCX1RTX0NSX1RTTVhfTE9XKSkgeworCQkJc2V0X3Rhc2tfc3RhdGUodHNrLCBUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCQl1Y2IxeDAwX2VuYWJsZV9pcnEodHMtPnVjYiwgVUNCX0lSUV9UU1BYLCBVQ0JfRkFMTElORyk7CisJCQl1Y2IxeDAwX2Rpc2FibGUodHMtPnVjYik7CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBzcGF0IG91dCBhIHZhbGlkIHNhbXBsZSBzZXQgbGFzdCB0aW1lLAorCQkJICogc3BpdCBvdXQgYSAicGVuIG9mZiIgc2FtcGxlIGhlcmUuCisJCQkgKi8KKwkJCWlmICh2YWxpZCkgeworCQkJCXVjYjF4MDBfdHNfZXZlbnRfcmVsZWFzZSh0cyk7CisJCQkJdmFsaWQgPSAwOworCQkJfQorCisJCQl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisJCX0gZWxzZSB7CisJCQl1Y2IxeDAwX2Rpc2FibGUodHMtPnVjYik7CisKKwkJCS8qCisJCQkgKiBGaWx0ZXJpbmcgaXMgcG9saWN5LiAgUG9saWN5IGJlbG9uZ3MgaW4gdXNlcgorCQkJICogc3BhY2UuICBXZSB0aGVyZWZvcmUgbGVhdmUgaXQgdG8gdXNlciBzcGFjZQorCQkJICogdG8gZG8gYW55IGZpbHRlcmluZyB0aGV5IHBsZWFzZS4KKwkJCSAqLworCQkJaWYgKCF0cy0+cmVzdGFydCkgeworCQkJCXVjYjF4MDBfdHNfZXZ0X2FkZCh0cywgcCwgeCwgeSk7CisJCQkJdmFsaWQgPSAxOworCQkJfQorCisJCQlzZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQl0aW1lb3V0ID0gSFogLyAxMDA7CisJCX0KKworCQl0cnlfdG9fZnJlZXplKCk7CisKKwkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwl9CisKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdHMtPmlycV93YWl0LCAmd2FpdCk7CisKKwl0cy0+cnRhc2sgPSBOVUxMOworCXJldHVybiAwOworfQorCisvKgorICogV2Ugb25seSBkZXRlY3QgdG91Y2ggc2NyZWVuIF90b3VjaGVzXyB3aXRoIHRoaXMgaW50ZXJydXB0CisgKiBoYW5kbGVyLCBhbmQgZXZlbiB0aGVuIHdlIGp1c3Qgc2NoZWR1bGUgb3VyIHRhc2suCisgKi8KK3N0YXRpYyB2b2lkIHVjYjF4MDBfdHNfaXJxKGludCBpZHgsIHZvaWQgKmlkKQoreworCXN0cnVjdCB1Y2IxeDAwX3RzICp0cyA9IGlkOworCXVjYjF4MDBfZGlzYWJsZV9pcnEodHMtPnVjYiwgVUNCX0lSUV9UU1BYLCBVQ0JfRkFMTElORyk7CisJd2FrZV91cCgmdHMtPmlycV93YWl0KTsKK30KKworc3RhdGljIGludCB1Y2IxeDAwX3RzX29wZW4oc3RydWN0IGlucHV0X2RldiAqaWRldikKK3sKKwlzdHJ1Y3QgdWNiMXgwMF90cyAqdHMgPSAoc3RydWN0IHVjYjF4MDBfdHMgKilpZGV2OworCWludCByZXQgPSAwOworCisJQlVHX09OKHRzLT5ydGFzayk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0cy0+aXJxX3dhaXQpOworCXJldCA9IHVjYjF4MDBfaG9va19pcnEodHMtPnVjYiwgVUNCX0lSUV9UU1BYLCB1Y2IxeDAwX3RzX2lycSwgdHMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qCisJICogSWYgd2UgZG8gdGhpcyBhdCBhbGwsIHdlIHNob3VsZCBhbGxvdyB0aGUgdXNlciB0bworCSAqIG1lYXN1cmUgYW5kIHJlYWQgdGhlIFggYW5kIFkgcmVzaXN0YW5jZSBhdCBhbnkgdGltZS4KKwkgKi8KKwl1Y2IxeDAwX2FkY19lbmFibGUodHMtPnVjYik7CisJdHMtPnhfcmVzID0gdWNiMXgwMF90c19yZWFkX3hyZXModHMpOworCXRzLT55X3JlcyA9IHVjYjF4MDBfdHNfcmVhZF95cmVzKHRzKTsKKwl1Y2IxeDAwX2FkY19kaXNhYmxlKHRzLT51Y2IpOworCisJdHMtPnJ0YXNrID0ga3RocmVhZF9ydW4odWNiMXgwMF90aHJlYWQsIHRzLCAia3RzZCIpOworCWlmICghSVNfRVJSKHRzLT5ydGFzaykpIHsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQl1Y2IxeDAwX2ZyZWVfaXJxKHRzLT51Y2IsIFVDQl9JUlFfVFNQWCwgdHMpOworCQl0cy0+cnRhc2sgPSBOVUxMOworCQlyZXQgPSAtRUZBVUxUOworCX0KKworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVsZWFzZSB0b3VjaHNjcmVlbiByZXNvdXJjZXMuICBEaXNhYmxlIElSUXMuCisgKi8KK3N0YXRpYyB2b2lkIHVjYjF4MDBfdHNfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqaWRldikKK3sKKwlzdHJ1Y3QgdWNiMXgwMF90cyAqdHMgPSAoc3RydWN0IHVjYjF4MDBfdHMgKilpZGV2OworCisJaWYgKHRzLT5ydGFzaykKKwkJa3RocmVhZF9zdG9wKHRzLT5ydGFzayk7CisKKwl1Y2IxeDAwX2VuYWJsZSh0cy0+dWNiKTsKKwl1Y2IxeDAwX2ZyZWVfaXJxKHRzLT51Y2IsIFVDQl9JUlFfVFNQWCwgdHMpOworCXVjYjF4MDBfcmVnX3dyaXRlKHRzLT51Y2IsIFVDQl9UU19DUiwgMCk7CisJdWNiMXgwMF9kaXNhYmxlKHRzLT51Y2IpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHVjYjF4MDBfdHNfcmVzdW1lKHN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2KQoreworCXN0cnVjdCB1Y2IxeDAwX3RzICp0cyA9IGRldi0+cHJpdjsKKworCWlmICh0cy0+cnRhc2sgIT0gTlVMTCkgeworCQkvKgorCQkgKiBSZXN0YXJ0IHRoZSBUUyB0aHJlYWQgdG8gZW5zdXJlIHRoZQorCQkgKiBUUyBpbnRlcnJ1cHQgbW9kZSBpcyBzZXQgdXAgYWdhaW4KKwkJICogYWZ0ZXIgc2xlZXAuCisJCSAqLworCQl0cy0+cmVzdGFydCA9IDE7CisJCXdha2VfdXAoJnRzLT5pcnFfd2FpdCk7CisJfQorCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgdWNiMXgwMF90c19yZXN1bWUgTlVMTAorI2VuZGlmCisKKworLyoKKyAqIEluaXRpYWxpc2F0aW9uLgorICovCitzdGF0aWMgaW50IHVjYjF4MDBfdHNfYWRkKHN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2KQoreworCXN0cnVjdCB1Y2IxeDAwX3RzICp0czsKKworCXRzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVjYjF4MDBfdHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCh0cywgMCwgc2l6ZW9mKHN0cnVjdCB1Y2IxeDAwX3RzKSk7CisKKwl0cy0+dWNiID0gZGV2LT51Y2I7CisJdHMtPmFkY3N5bmMgPSBhZGNzeW5jID8gVUNCX1NZTkMgOiBVQ0JfTk9TWU5DOworCisJdHMtPmlkZXYubmFtZSAgICAgICA9ICJUb3VjaHNjcmVlbiBwYW5lbCI7CisJdHMtPmlkZXYuaWQucHJvZHVjdCA9IHRzLT51Y2ItPmlkOworCXRzLT5pZGV2Lm9wZW4gICAgICAgPSB1Y2IxeDAwX3RzX29wZW47CisJdHMtPmlkZXYuY2xvc2UgICAgICA9IHVjYjF4MDBfdHNfY2xvc2U7CisKKwlfX3NldF9iaXQoRVZfQUJTLCB0cy0+aWRldi5ldmJpdCk7CisJX19zZXRfYml0KEFCU19YLCB0cy0+aWRldi5hYnNiaXQpOworCV9fc2V0X2JpdChBQlNfWSwgdHMtPmlkZXYuYWJzYml0KTsKKwlfX3NldF9iaXQoQUJTX1BSRVNTVVJFLCB0cy0+aWRldi5hYnNiaXQpOworCisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZ0cy0+aWRldik7CisKKwlkZXYtPnByaXYgPSB0czsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1Y2IxeDAwX3RzX3JlbW92ZShzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdWNiMXgwMF90cyAqdHMgPSBkZXYtPnByaXY7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnRzLT5pZGV2KTsKKwlrZnJlZSh0cyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWNiMXgwMF9kcml2ZXIgdWNiMXgwMF90c19kcml2ZXIgPSB7CisJLmFkZAkJPSB1Y2IxeDAwX3RzX2FkZCwKKwkucmVtb3ZlCQk9IHVjYjF4MDBfdHNfcmVtb3ZlLAorCS5yZXN1bWUJCT0gdWNiMXgwMF90c19yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB1Y2IxeDAwX3RzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdWNiMXgwMF9yZWdpc3Rlcl9kcml2ZXIoJnVjYjF4MDBfdHNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVjYjF4MDBfdHNfZXhpdCh2b2lkKQoreworCXVjYjF4MDBfdW5yZWdpc3Rlcl9kcml2ZXIoJnVjYjF4MDBfdHNfZHJpdmVyKTsKK30KKworbW9kdWxlX3BhcmFtKGFkY3N5bmMsIGludCwgMDQ0NCk7Cittb2R1bGVfaW5pdCh1Y2IxeDAwX3RzX2luaXQpOworbW9kdWxlX2V4aXQodWNiMXgwMF90c19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVUNCMXgwMCB0b3VjaHNjcmVlbiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3VjYjF4MDAuaCBiL2RyaXZlcnMvbWZkL3VjYjF4MDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjYzMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvdWNiMXgwMC5oCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvbWZkL3VjYjF4MDAuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgUnVzc2VsbCBLaW5nLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBVQ0IxMjAwX0gKKyNkZWZpbmUgVUNCMTIwMF9ICisKKyNkZWZpbmUgVUNCX0lPX0RBVEEJMHgwMAorI2RlZmluZSBVQ0JfSU9fRElSCTB4MDEKKworI2RlZmluZSBVQ0JfSU9fMAkJKDEgPDwgMCkKKyNkZWZpbmUgVUNCX0lPXzEJCSgxIDw8IDEpCisjZGVmaW5lIFVDQl9JT18yCQkoMSA8PCAyKQorI2RlZmluZSBVQ0JfSU9fMwkJKDEgPDwgMykKKyNkZWZpbmUgVUNCX0lPXzQJCSgxIDw8IDQpCisjZGVmaW5lIFVDQl9JT181CQkoMSA8PCA1KQorI2RlZmluZSBVQ0JfSU9fNgkJKDEgPDwgNikKKyNkZWZpbmUgVUNCX0lPXzcJCSgxIDw8IDcpCisjZGVmaW5lIFVDQl9JT184CQkoMSA8PCA4KQorI2RlZmluZSBVQ0JfSU9fOQkJKDEgPDwgOSkKKworI2RlZmluZSBVQ0JfSUVfUklTCTB4MDIKKyNkZWZpbmUgVUNCX0lFX0ZBTAkweDAzCisjZGVmaW5lIFVDQl9JRV9TVEFUVVMJMHgwNAorI2RlZmluZSBVQ0JfSUVfQ0xFQVIJMHgwNAorI2RlZmluZSBVQ0JfSUVfQURDCQkoMSA8PCAxMSkKKyNkZWZpbmUgVUNCX0lFX1RTUFgJCSgxIDw8IDEyKQorI2RlZmluZSBVQ0JfSUVfVFNNWAkJKDEgPDwgMTMpCisjZGVmaW5lIFVDQl9JRV9UQ0xJUAkJKDEgPDwgMTQpCisjZGVmaW5lIFVDQl9JRV9BQ0xJUAkJKDEgPDwgMTUpCisKKyNkZWZpbmUgVUNCX0lSUV9UU1BYCQkxMgorCisjZGVmaW5lIFVDQl9UQ19BCTB4MDUKKyNkZWZpbmUgVUNCX1RDX0FfTE9PUAkJKDEgPDwgNykJLyogVUNCMTIwMCAqLworI2RlZmluZSBVQ0JfVENfQV9BTVBMCQkoMSA8PCA3KQkvKiBVQ0IxMzAwICovCisKKyNkZWZpbmUgVUNCX1RDX0IJMHgwNgorI2RlZmluZSBVQ0JfVENfQl9WT0lDRV9FTkEJKDEgPDwgMykKKyNkZWZpbmUgVUNCX1RDX0JfQ0xJUAkJKDEgPDwgNCkKKyNkZWZpbmUgVUNCX1RDX0JfQVRUCQkoMSA8PCA2KQorI2RlZmluZSBVQ0JfVENfQl9TSURFX0VOQQkoMSA8PCAxMSkKKyNkZWZpbmUgVUNCX1RDX0JfTVVURQkJKDEgPDwgMTMpCisjZGVmaW5lIFVDQl9UQ19CX0lOX0VOQQkJKDEgPDwgMTQpCisjZGVmaW5lIFVDQl9UQ19CX09VVF9FTkEJKDEgPDwgMTUpCisKKyNkZWZpbmUgVUNCX0FDX0EJMHgwNworI2RlZmluZSBVQ0JfQUNfQgkweDA4CisjZGVmaW5lIFVDQl9BQ19CX0xPT1AJCSgxIDw8IDgpCisjZGVmaW5lIFVDQl9BQ19CX01VVEUJCSgxIDw8IDEzKQorI2RlZmluZSBVQ0JfQUNfQl9JTl9FTkEJCSgxIDw8IDE0KQorI2RlZmluZSBVQ0JfQUNfQl9PVVRfRU5BCSgxIDw8IDE1KQorCisjZGVmaW5lIFVDQl9UU19DUgkweDA5CisjZGVmaW5lIFVDQl9UU19DUl9UU01YX1BPVwkoMSA8PCAwKQorI2RlZmluZSBVQ0JfVFNfQ1JfVFNQWF9QT1cJKDEgPDwgMSkKKyNkZWZpbmUgVUNCX1RTX0NSX1RTTVlfUE9XCSgxIDw8IDIpCisjZGVmaW5lIFVDQl9UU19DUl9UU1BZX1BPVwkoMSA8PCAzKQorI2RlZmluZSBVQ0JfVFNfQ1JfVFNNWF9HTkQJKDEgPDwgNCkKKyNkZWZpbmUgVUNCX1RTX0NSX1RTUFhfR05ECSgxIDw8IDUpCisjZGVmaW5lIFVDQl9UU19DUl9UU01ZX0dORAkoMSA8PCA2KQorI2RlZmluZSBVQ0JfVFNfQ1JfVFNQWV9HTkQJKDEgPDwgNykKKyNkZWZpbmUgVUNCX1RTX0NSX01PREVfSU5UCSgwIDw8IDgpCisjZGVmaW5lIFVDQl9UU19DUl9NT0RFX1BSRVMJKDEgPDwgOCkKKyNkZWZpbmUgVUNCX1RTX0NSX01PREVfUE9TCSgyIDw8IDgpCisjZGVmaW5lIFVDQl9UU19DUl9CSUFTX0VOQQkoMSA8PCAxMSkKKyNkZWZpbmUgVUNCX1RTX0NSX1RTUFhfTE9XCSgxIDw8IDEyKQorI2RlZmluZSBVQ0JfVFNfQ1JfVFNNWF9MT1cJKDEgPDwgMTMpCisKKyNkZWZpbmUgVUNCX0FEQ19DUgkweDBhCisjZGVmaW5lIFVDQl9BRENfU1lOQ19FTkEJKDEgPDwgMCkKKyNkZWZpbmUgVUNCX0FEQ19WUkVGQllQX0NPTgkoMSA8PCAxKQorI2RlZmluZSBVQ0JfQURDX0lOUF9UU1BYCSgwIDw8IDIpCisjZGVmaW5lIFVDQl9BRENfSU5QX1RTTVgJKDEgPDwgMikKKyNkZWZpbmUgVUNCX0FEQ19JTlBfVFNQWQkoMiA8PCAyKQorI2RlZmluZSBVQ0JfQURDX0lOUF9UU01ZCSgzIDw8IDIpCisjZGVmaW5lIFVDQl9BRENfSU5QX0FEMAkJKDQgPDwgMikKKyNkZWZpbmUgVUNCX0FEQ19JTlBfQUQxCQkoNSA8PCAyKQorI2RlZmluZSBVQ0JfQURDX0lOUF9BRDIJCSg2IDw8IDIpCisjZGVmaW5lIFVDQl9BRENfSU5QX0FEMwkJKDcgPDwgMikKKyNkZWZpbmUgVUNCX0FEQ19FWFRfUkVGCQkoMSA8PCA1KQorI2RlZmluZSBVQ0JfQURDX1NUQVJUCQkoMSA8PCA3KQorI2RlZmluZSBVQ0JfQURDX0VOQQkJKDEgPDwgMTUpCisKKyNkZWZpbmUgVUNCX0FEQ19EQVRBCTB4MGIKKyNkZWZpbmUgVUNCX0FEQ19EQVRfVkFMCQkoMSA8PCAxNSkKKyNkZWZpbmUgVUNCX0FEQ19EQVQoeCkJCSgoKHgpICYgMHg3ZmUwKSA+PiA1KQorCisjZGVmaW5lIFVDQl9JRAkJMHgwYworI2RlZmluZSBVQ0JfSURfMTIwMAkJMHgxMDA0CisjZGVmaW5lIFVDQl9JRF8xMzAwCQkweDEwMDUKKworI2RlZmluZSBVQ0JfTU9ERQkweDBkCisjZGVmaW5lIFVDQl9NT0RFX0RZTl9WRkxBR19FTkEJKDEgPDwgMTIpCisjZGVmaW5lIFVDQl9NT0RFX0FVRF9PRkZfQ0FOCSgxIDw8IDEzKQorCisjaW5jbHVkZSAibWNwLmgiCisKK3N0cnVjdCB1Y2IxeDAwX2lycSB7CisJdm9pZCAqZGV2aWQ7CisJdm9pZCAoKmZuKShpbnQsIHZvaWQgKik7Cit9OworCitleHRlcm4gc3RydWN0IGNsYXNzIHVjYjF4MDBfY2xhc3M7CisKK3N0cnVjdCB1Y2IxeDAwIHsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCBtY3AJCSptY3A7CisJdW5zaWduZWQgaW50CQlpcnE7CisJc3RydWN0IHNlbWFwaG9yZQlhZGNfc2VtOworCXNwaW5sb2NrX3QJCWlvX2xvY2s7CisJdTE2CQkJaWQ7CisJdTE2CQkJaW9fZGlyOworCXUxNgkJCWlvX291dDsKKwl1MTYJCQlhZGNfY3I7CisJdTE2CQkJaXJxX2ZhbF9lbmJsOworCXUxNgkJCWlycV9yaXNfZW5ibDsKKwlzdHJ1Y3QgdWNiMXgwMF9pcnEJaXJxX2hhbmRsZXJbMTZdOworCXN0cnVjdCBjbGFzc19kZXZpY2UJY2RldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisJc3RydWN0IGxpc3RfaGVhZAlkZXZzOworfTsKKworc3RydWN0IHVjYjF4MDBfZHJpdmVyOworCitzdHJ1Y3QgdWNiMXgwMF9kZXYgeworCXN0cnVjdCBsaXN0X2hlYWQJZGV2X25vZGU7CisJc3RydWN0IGxpc3RfaGVhZAlkcnZfbm9kZTsKKwlzdHJ1Y3QgdWNiMXgwMAkJKnVjYjsKKwlzdHJ1Y3QgdWNiMXgwMF9kcml2ZXIJKmRydjsKKwl2b2lkCQkJKnByaXY7Cit9OworCitzdHJ1Y3QgdWNiMXgwMF9kcml2ZXIgeworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWRldnM7CisJaW50CSgqYWRkKShzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldik7CisJdm9pZAkoKnJlbW92ZSkoc3RydWN0IHVjYjF4MDBfZGV2ICpkZXYpOworCWludAkoKnN1c3BlbmQpKHN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludAkoKnJlc3VtZSkoc3RydWN0IHVjYjF4MDBfZGV2ICpkZXYpOworfTsKKworI2RlZmluZSBjbGFzc2Rldl90b191Y2IxeDAwKGNkKQljb250YWluZXJfb2YoY2QsIHN0cnVjdCB1Y2IxeDAwLCBjZGV2KQorCitpbnQgdWNiMXgwMF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVjYjF4MDBfZHJpdmVyICopOwordm9pZCB1Y2IxeDAwX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1Y2IxeDAwX2RyaXZlciAqKTsKKworLyoqCisgKgl1Y2IxeDAwX2Nsa3JhdGUgLSByZXR1cm4gdGhlIFVDQjF4MDAgU0lCIGNsb2NrIHJhdGUKKyAqCUB1Y2I6IFVDQjF4MDAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpcAorICoKKyAqCVJldHVybiB0aGUgU0lCIGNsb2NrIHJhdGUgaW4gSHouCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHVjYjF4MDBfY2xrcmF0ZShzdHJ1Y3QgdWNiMXgwMCAqdWNiKQoreworCXJldHVybiBtY3BfZ2V0X3NjbGtfcmF0ZSh1Y2ItPm1jcCk7Cit9CisKKy8qKgorICoJdWNiMXgwMF9lbmFibGUgLSBlbmFibGUgdGhlIFVDQjF4MDAgU0lCIGNsb2NrCisgKglAdWNiOiBVQ0IxeDAwIHN0cnVjdHVyZSBkZXNjcmliaW5nIGNoaXAKKyAqCisgKglFbmFibGUgdGhlIFNJQiBjbG9jay4gIFRoaXMgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVjYjF4MDBfZW5hYmxlKHN0cnVjdCB1Y2IxeDAwICp1Y2IpCit7CisJbWNwX2VuYWJsZSh1Y2ItPm1jcCk7Cit9CisKKy8qKgorICoJdWNiMXgwMF9kaXNhYmxlIC0gZGlzYWJsZSB0aGUgVUNCMXgwMCBTSUIgY2xvY2sKKyAqCUB1Y2I6IFVDQjF4MDAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpcAorICoKKyAqCURpc2FibGUgdGhlIFNJQiBjbG9jay4gIFRoZSBTSUIgY2xvY2sgd2lsbCBvbmx5IGJlIGRpc2FibGVkCisgKgl3aGVuIHRoZSBudW1iZXIgb2YgdWNiMXgwMF9lbmFibGUgY2FsbHMgbWF0Y2ggdGhlIG51bWJlciBvZgorICoJdWNiMXgwMF9kaXNhYmxlIGNhbGxzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdWNiMXgwMF9kaXNhYmxlKHN0cnVjdCB1Y2IxeDAwICp1Y2IpCit7CisJbWNwX2Rpc2FibGUodWNiLT5tY3ApOworfQorCisvKioKKyAqCXVjYjF4MDBfcmVnX3dyaXRlIC0gd3JpdGUgYSBVQ0IxeDAwIHJlZ2lzdGVyCisgKglAdWNiOiBVQ0IxeDAwIHN0cnVjdHVyZSBkZXNjcmliaW5nIGNoaXAKKyAqCUByZWc6IFVDQjF4MDAgNC1iaXQgcmVnaXN0ZXIgaW5kZXggdG8gd3JpdGUKKyAqCUB2YWw6IFVDQjF4MDAgMTYtYml0IHZhbHVlIHRvIHdyaXRlCisgKgorICoJV3JpdGUgdGhlIFVDQjF4MDAgcmVnaXN0ZXIgQHJlZyB3aXRoIHZhbHVlIEB2YWwuICBUaGUgU0lCCisgKgljbG9jayBtdXN0IGJlIHJ1bm5pbmcgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdWNiMXgwMF9yZWdfd3JpdGUoc3RydWN0IHVjYjF4MDAgKnVjYiwgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKK3sKKwltY3BfcmVnX3dyaXRlKHVjYi0+bWNwLCByZWcsIHZhbCk7Cit9CisKKy8qKgorICoJdWNiMXgwMF9yZWdfcmVhZCAtIHJlYWQgYSBVQ0IxeDAwIHJlZ2lzdGVyCisgKglAdWNiOiBVQ0IxeDAwIHN0cnVjdHVyZSBkZXNjcmliaW5nIGNoaXAKKyAqCUByZWc6IFVDQjF4MDAgNC1iaXQgcmVnaXN0ZXIgaW5kZXggdG8gd3JpdGUKKyAqCisgKglSZWFkIHRoZSBVQ0IxeDAwIHJlZ2lzdGVyIEByZWcgYW5kIHJldHVybiBpdHMgdmFsdWUuICBUaGUgU0lCCisgKgljbG9jayBtdXN0IGJlIHJ1bm5pbmcgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxeDAwX3JlZ19yZWFkKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIHVuc2lnbmVkIGludCByZWcpCit7CisJcmV0dXJuIG1jcF9yZWdfcmVhZCh1Y2ItPm1jcCwgcmVnKTsKK30KKy8qKgorICoJdWNiMXgwMF9zZXRfYXVkaW9fZGl2aXNvciAtIAorICoJQHVjYjogVUNCMXgwMCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBjaGlwCisgKglAZGl2OiBTSUIgY2xvY2sgZGl2aXNvcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdWNiMXgwMF9zZXRfYXVkaW9fZGl2aXNvcihzdHJ1Y3QgdWNiMXgwMCAqdWNiLCB1bnNpZ25lZCBpbnQgZGl2KQoreworCW1jcF9zZXRfYXVkaW9fZGl2aXNvcih1Y2ItPm1jcCwgZGl2KTsKK30KKworLyoqCisgKgl1Y2IxeDAwX3NldF90ZWxlY29tX2Rpdmlzb3IgLQorICoJQHVjYjogVUNCMXgwMCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBjaGlwCisgKglAZGl2OiBTSUIgY2xvY2sgZGl2aXNvcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdWNiMXgwMF9zZXRfdGVsZWNvbV9kaXZpc29yKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIHVuc2lnbmVkIGludCBkaXYpCit7CisJbWNwX3NldF90ZWxlY29tX2Rpdmlzb3IodWNiLT5tY3AsIGRpdik7Cit9CisKK3ZvaWQgdWNiMXgwMF9pb19zZXRfZGlyKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK3ZvaWQgdWNiMXgwMF9pb193cml0ZShzdHJ1Y3QgdWNiMXgwMCAqdWNiLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Cit1bnNpZ25lZCBpbnQgdWNiMXgwMF9pb19yZWFkKHN0cnVjdCB1Y2IxeDAwICp1Y2IpOworCisjZGVmaW5lIFVDQl9OT1NZTkMJKDApCisjZGVmaW5lIFVDQl9TWU5DCSgxKQorCit1bnNpZ25lZCBpbnQgdWNiMXgwMF9hZGNfcmVhZChzdHJ1Y3QgdWNiMXgwMCAqdWNiLCBpbnQgYWRjX2NoYW5uZWwsIGludCBzeW5jKTsKK3ZvaWQgdWNiMXgwMF9hZGNfZW5hYmxlKHN0cnVjdCB1Y2IxeDAwICp1Y2IpOwordm9pZCB1Y2IxeDAwX2FkY19kaXNhYmxlKHN0cnVjdCB1Y2IxeDAwICp1Y2IpOworCisvKgorICogV2hpY2ggZWRnZXMgb2YgdGhlIElSUSBkbyB5b3Ugd2FudCB0byBjb250cm9sIHRvZGF5PworICovCisjZGVmaW5lIFVDQl9SSVNJTkcJKDEgPDwgMCkKKyNkZWZpbmUgVUNCX0ZBTExJTkcJKDEgPDwgMSkKKworaW50IHVjYjF4MDBfaG9va19pcnEoc3RydWN0IHVjYjF4MDAgKnVjYiwgdW5zaWduZWQgaW50IGlkeCwgdm9pZCAoKmZuKShpbnQsIHZvaWQgKiksIHZvaWQgKmRldmlkKTsKK3ZvaWQgdWNiMXgwMF9lbmFibGVfaXJxKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIHVuc2lnbmVkIGludCBpZHgsIGludCBlZGdlcyk7Cit2b2lkIHVjYjF4MDBfZGlzYWJsZV9pcnEoc3RydWN0IHVjYjF4MDAgKnVjYiwgdW5zaWduZWQgaW50IGlkeCwgaW50IGVkZ2VzKTsKK2ludCB1Y2IxeDAwX2ZyZWVfaXJxKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIHVuc2lnbmVkIGludCBpZHgsIHZvaWQgKmRldmlkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaGRwdWZ0cnMvaGRwdV9jcHVzdGF0ZS5jIGIvZHJpdmVycy9taXNjL2hkcHVmdHJzL2hkcHVfY3B1c3RhdGUuYwppbmRleCA3NTAxZmFiLi40NmRlNWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaGRwdWZ0cnMvaGRwdV9jcHVzdGF0ZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9oZHB1ZnRycy9oZHB1X2NwdXN0YXRlLmMKQEAgLTE5MiwyMiArMTkyLDM3IEBACiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZGV2KTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZGU7CisJaW50IHJldDsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJY3B1c3RhdGUuc2V0X2FkZHIgPSAodW5zaWduZWQgbG9uZyAqKXJlcy0+c3RhcnQ7CiAJY3B1c3RhdGUuY2xyX2FkZHIgPSAodW5zaWduZWQgbG9uZyAqKXJlcy0+ZW5kIC0gMTsKIAotCW1pc2NfcmVnaXN0ZXIoJmNwdXN0YXRlX2Rldik7Ci0JY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic2t5X2NwdXN0YXRlIiwgMCwgMCwgY3B1c3RhdGVfcmVhZF9wcm9jLCBOVUxMKTsKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZjcHVzdGF0ZV9kZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2t5X2NwdXN0YXRlOiBVbmFibGUgdG8gcmVnaXN0ZXIgbWlzYyAiCisJCQkJCSJkZXZpY2UuXG4iKTsKKwkJY3B1c3RhdGUuc2V0X2FkZHIgPSBOVUxMOworCQljcHVzdGF0ZS5jbHJfYWRkciA9IE5VTEw7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJvY19kZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInNreV9jcHVzdGF0ZSIsIDAsIDAsCisJCQkJCWNwdXN0YXRlX3JlYWRfcHJvYywgTlVMTCk7CisJaWYgKHByb2NfZGUgPT0gTlVMTCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2t5X2NwdXN0YXRlOiBVbmFibGUgdG8gY3JlYXRlIHByb2MgIgorCQkJCQkiZGlyIGVudHJ5XG4iKTsKIAogCXByaW50ayhLRVJOX0lORk8gIlNreSBDUFUgU3RhdGUgRHJpdmVyIHYiIFNLWV9DUFVTVEFURV9WRVJTSU9OICJcbiIpOwogCXJldHVybiAwOwogfQorCiBzdGF0aWMgaW50IGhkcHVfY3B1c3RhdGVfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRkZXYpCiB7CiAKLQljcHVzdGF0ZS5zZXRfYWRkciA9IDA7Ci0JY3B1c3RhdGUuY2xyX2FkZHIgPSAwOworCWNwdXN0YXRlLnNldF9hZGRyID0gTlVMTDsKKwljcHVzdGF0ZS5jbHJfYWRkciA9IE5VTEw7CiAKIAlyZW1vdmVfcHJvY19lbnRyeSgic2t5X2NwdXN0YXRlIiwgTlVMTCk7CiAJbWlzY19kZXJlZ2lzdGVyKCZjcHVzdGF0ZV9kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS91YXJ0LmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL3VhcnQuYwppbmRleCA5MTQ4MDQ1Li43ZTk4NDM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL3VhcnQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL3VhcnQuYwpAQCAtMjUsMTUgKzI1LDE1IEBACiAjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSAiaWJtYXNtLmgiCiAjaW5jbHVkZSAibG93bGV2ZWwuaCIKIAogCiB2b2lkIGlibWFzbV9yZWdpc3Rlcl91YXJ0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApCiB7Ci0Jc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc2VyaWFsOworCXN0cnVjdCB1YXJ0X3BvcnQgdXBvcnQ7CiAJdm9pZCBfX2lvbWVtICppb21lbV9iYXNlOwogCiAJaW9tZW1fYmFzZSA9IHNwLT5iYXNlX2FkZHJlc3MgKyBTQ09VVF9DT01fQl9CQVNFOwpAQCAtNDcsMTQgKzQ3LDE0IEBACiAJCXJldHVybjsKIAl9CiAKLQltZW1zZXQoJnNlcmlhbCwgMCwgc2l6ZW9mKHNlcmlhbCkpOwotCXNlcmlhbC5pcnEJCT0gc3AtPmlycTsKLQlzZXJpYWwuYmF1ZF9iYXNlCT0gMzY4NjQwMCAvIDE2OwotCXNlcmlhbC5mbGFncwkJPSBVUEZfQVVUT1BST0JFIHwgVVBGX1NIQVJFX0lSUTsKLQlzZXJpYWwuaW9fdHlwZQkJPSBVUElPX01FTTsKLQlzZXJpYWwuaW9tZW1fYmFzZQk9IGlvbWVtX2Jhc2U7CisJbWVtc2V0KCZ1cG9ydCwgMCwgc2l6ZW9mKHN0cnVjdCB1YXJ0X3BvcnQpKTsKKwl1cG9ydC5pcnEJPSBzcC0+aXJxOworCXVwb3J0LnVhcnRjbGsJPSAzNjg2NDAwOworCXVwb3J0LmZsYWdzCT0gVVBGX0FVVE9QUk9CRSB8IFVQRl9TSEFSRV9JUlE7CisJdXBvcnQuaW90eXBlCT0gVVBJT19NRU07CisJdXBvcnQubWVtYmFzZQk9IGlvbWVtX2Jhc2U7CiAKLQlzcC0+c2VyaWFsX2xpbmUgPSByZWdpc3Rlcl9zZXJpYWwoJnNlcmlhbCk7CisJc3AtPnNlcmlhbF9saW5lID0gc2VyaWFsODI1MF9yZWdpc3Rlcl9wb3J0KCZ1cG9ydCk7CiAJaWYgKHNwLT5zZXJpYWxfbGluZSA8IDApIHsKIAkJZGV2X2VycihzcC0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHNlcmlhbCBwb3J0XG4iKTsKIAkJcmV0dXJuOwpAQCAtNjgsNSArNjgsNSBAQAogCQlyZXR1cm47CiAKIAlkaXNhYmxlX3VhcnRfaW50ZXJydXB0cyhzcC0+YmFzZV9hZGRyZXNzKTsKLQl1bnJlZ2lzdGVyX3NlcmlhbChzcC0+c2VyaWFsX2xpbmUpOworCXNlcmlhbDgyNTBfdW5yZWdpc3Rlcl9wb3J0KHNwLT5zZXJpYWxfbGluZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWMuYyBiL2RyaXZlcnMvbW1jL21tYy5jCmluZGV4IDNjNTkwNDguLmNlYWUzNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL21tYy5jCkBAIC0yLDYgKzIsOCBAQAogICogIGxpbnV4L2RyaXZlcnMvbW1jL21tYy5jCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFJ1c3NlbGwgS2luZywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICBTRCBzdXBwb3J0IENvcHlyaWdodCAoQykgMjAwNCBJYW4gTW9sdG9uLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogIFNEIHN1cHBvcnQgQ29weXJpZ2h0IChDKSAyMDA1IFBpZXJyZSBPc3NtYW4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0xNiw2ICsxOCw4IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KQEAgLTE3Miw3ICsxNzYsODEgQEAKIAogRVhQT1JUX1NZTUJPTChtbWNfd2FpdF9mb3JfY21kKTsKIAorLyoqCisgKgltbWNfd2FpdF9mb3JfYXBwX2NtZCAtIHN0YXJ0IGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgYW5kIHdhaXQgZm9yCisgCQkJICAgICAgIGNvbXBsZXRpb24KKyAqCUBob3N0OiBNTUMgaG9zdCB0byBzdGFydCBjb21tYW5kCisgKglAcmNhOiBSQ0EgdG8gc2VuZCBNTUNfQVBQX0NNRCB0bworICoJQGNtZDogTU1DIGNvbW1hbmQgdG8gc3RhcnQKKyAqCUByZXRyaWVzOiBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzCisgKgorICoJU2VuZHMgYSBNTUNfQVBQX0NNRCwgY2hlY2tzIHRoZSBjYXJkIHJlc3BvbnNlLCBzZW5kcyB0aGUgY29tbWFuZAorICoJaW4gdGhlIHBhcmFtZXRlciBhbmQgd2FpdHMgZm9yIGl0IHRvIGNvbXBsZXRlLiBSZXR1cm4gYW55IGVycm9yCisgKgl0aGF0IG9jY3VycmVkIHdoaWxlIHRoZSBjb21tYW5kIHdhcyBleGVjdXRpbmcuICBEbyBub3QgYXR0ZW1wdCB0bworICoJcGFyc2UgdGhlIHJlc3BvbnNlLgorICovCitpbnQgbW1jX3dhaXRfZm9yX2FwcF9jbWQoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgcmNhLAorCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kLCBpbnQgcmV0cmllcykKK3sKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxOworCXN0cnVjdCBtbWNfY29tbWFuZCBhcHBjbWQ7CiAKKwlpbnQgaSwgZXJyOworCisJQlVHX09OKGhvc3QtPmNhcmRfYnVzeSA9PSBOVUxMKTsKKwlCVUdfT04ocmV0cmllcyA8IDApOworCisJZXJyID0gTU1DX0VSUl9JTlZBTElEOworCisJLyoKKwkgKiBXZSBoYXZlIHRvIHJlc2VuZCBNTUNfQVBQX0NNRCBmb3IgZWFjaCBhdHRlbXB0IHNvCisJICogd2UgY2Fubm90IHVzZSB0aGUgcmV0cmllcyBmaWVsZCBpbiBtbWNfY29tbWFuZC4KKwkgKi8KKwlmb3IgKGkgPSAwO2kgPD0gcmV0cmllcztpKyspIHsKKwkJbWVtc2V0KCZtcnEsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX3JlcXVlc3QpKTsKKworCQlhcHBjbWQub3Bjb2RlID0gTU1DX0FQUF9DTUQ7CisJCWFwcGNtZC5hcmcgPSByY2EgPDwgMTY7CisJCWFwcGNtZC5mbGFncyA9IE1NQ19SU1BfUjE7CisJCWFwcGNtZC5yZXRyaWVzID0gMDsKKwkJbWVtc2V0KGFwcGNtZC5yZXNwLCAwLCBzaXplb2YoYXBwY21kLnJlc3ApKTsKKwkJYXBwY21kLmRhdGEgPSBOVUxMOworCisJCW1ycS5jbWQgPSAmYXBwY21kOworCQlhcHBjbWQuZGF0YSA9IE5VTEw7CisKKwkJbW1jX3dhaXRfZm9yX3JlcShob3N0LCAmbXJxKTsKKworCQlpZiAoYXBwY21kLmVycm9yKSB7CisJCQllcnIgPSBhcHBjbWQuZXJyb3I7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIENoZWNrIHRoYXQgY2FyZCBzdXBwb3J0ZWQgYXBwbGljYXRpb24gY29tbWFuZHMgKi8KKwkJaWYgKCEoYXBwY21kLnJlc3BbMF0gJiBSMV9BUFBfQ01EKSkKKwkJCXJldHVybiBNTUNfRVJSX0ZBSUxFRDsKKworCQltZW1zZXQoJm1ycSwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfcmVxdWVzdCkpOworCisJCW1lbXNldChjbWQtPnJlc3AsIDAsIHNpemVvZihjbWQtPnJlc3ApKTsKKwkJY21kLT5yZXRyaWVzID0gMDsKKworCQltcnEuY21kID0gY21kOworCQljbWQtPmRhdGEgPSBOVUxMOworCisJCW1tY193YWl0X2Zvcl9yZXEoaG9zdCwgJm1ycSk7CisKKwkJZXJyID0gY21kLT5lcnJvcjsKKwkJaWYgKGNtZC0+ZXJyb3IgPT0gTU1DX0VSUl9OT05FKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworRVhQT1JUX1NZTUJPTChtbWNfd2FpdF9mb3JfYXBwX2NtZCk7CisKK3N0YXRpYyBpbnQgbW1jX3NlbGVjdF9jYXJkKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19jYXJkICpjYXJkKTsKIAogLyoqCiAgKglfX21tY19jbGFpbV9ob3N0IC0gZXhjbHVzaXZlbHkgY2xhaW0gYSBob3N0CkBAIC0yMDYsMTYgKzI4NCwxMCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAlyZW1vdmVfd2FpdF9xdWV1ZSgmaG9zdC0+d3EsICZ3YWl0KTsKIAotCWlmIChjYXJkICE9ICh2b2lkICopLTEgJiYgaG9zdC0+Y2FyZF9zZWxlY3RlZCAhPSBjYXJkKSB7Ci0JCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7Ci0KLQkJaG9zdC0+Y2FyZF9zZWxlY3RlZCA9IGNhcmQ7Ci0KLQkJY21kLm9wY29kZSA9IE1NQ19TRUxFQ1RfQ0FSRDsKLQkJY21kLmFyZyA9IGNhcmQtPnJjYSA8PCAxNjsKLQkJY21kLmZsYWdzID0gTU1DX1JTUF9SMTsKLQotCQllcnIgPSBtbWNfd2FpdF9mb3JfY21kKGhvc3QsICZjbWQsIENNRF9SRVRSSUVTKTsKKwlpZiAoY2FyZCAhPSAodm9pZCAqKS0xKSB7CisJCWVyciA9IG1tY19zZWxlY3RfY2FyZChob3N0LCBjYXJkKTsKKwkJaWYgKGVyciAhPSBNTUNfRVJSX05PTkUpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCXJldHVybiBlcnI7CkBAIC0yNDUsNiArMzE3LDYzIEBACiAKIEVYUE9SVF9TWU1CT0wobW1jX3JlbGVhc2VfaG9zdCk7CiAKK3N0YXRpYyBpbnQgbW1jX3NlbGVjdF9jYXJkKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19jYXJkICpjYXJkKQoreworCWludCBlcnI7CisJc3RydWN0IG1tY19jb21tYW5kIGNtZDsKKworCUJVR19PTihob3N0LT5jYXJkX2J1c3kgPT0gTlVMTCk7CisKKwlpZiAoaG9zdC0+Y2FyZF9zZWxlY3RlZCA9PSBjYXJkKQorCQlyZXR1cm4gTU1DX0VSUl9OT05FOworCisJaG9zdC0+Y2FyZF9zZWxlY3RlZCA9IGNhcmQ7CisKKwljbWQub3Bjb2RlID0gTU1DX1NFTEVDVF9DQVJEOworCWNtZC5hcmcgPSBjYXJkLT5yY2EgPDwgMTY7CisJY21kLmZsYWdzID0gTU1DX1JTUF9SMTsKKworCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoaG9zdCwgJmNtZCwgQ01EX1JFVFJJRVMpOworCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQorCQlyZXR1cm4gZXJyOworCisJLyoKKwkgKiBEZWZhdWx0IGJ1cyB3aWR0aCBpcyAxIGJpdC4KKwkgKi8KKwlob3N0LT5pb3MuYnVzX3dpZHRoID0gTU1DX0JVU19XSURUSF8xOworCisJLyoKKwkgKiBXZSBjYW4gb25seSBjaGFuZ2UgdGhlIGJ1cyB3aWR0aCBvZiB0aGUgc2VsZWN0ZWQKKwkgKiBjYXJkIHNvIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIHB1dCB0aGUgaGFuZGxpbmcKKwkgKiBoZXJlLgorCSAqLworCWlmIChob3N0LT5jYXBzICYgTU1DX0NBUF80X0JJVF9EQVRBKSB7CisJCS8qCisJCSAqIFRoZSBjYXJkIGlzIGluIDEgYml0IG1vZGUgYnkgZGVmYXVsdCBzbworCQkgKiB3ZSBvbmx5IG5lZWQgdG8gY2hhbmdlIGlmIGl0IHN1cHBvcnRzIHRoZQorCQkgKiB3aWRlciB2ZXJzaW9uLgorCQkgKi8KKwkJaWYgKG1tY19jYXJkX3NkKGNhcmQpICYmCisJCQkoY2FyZC0+c2NyLmJ1c193aWR0aHMgJiBTRF9TQ1JfQlVTX1dJRFRIXzQpKSB7CisJCQlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kOworCQkJY21kLm9wY29kZSA9IFNEX0FQUF9TRVRfQlVTX1dJRFRIOworCQkJY21kLmFyZyA9IFNEX0JVU19XSURUSF80OworCQkJY21kLmZsYWdzID0gTU1DX1JTUF9SMTsKKworCQkJZXJyID0gbW1jX3dhaXRfZm9yX2FwcF9jbWQoaG9zdCwgY2FyZC0+cmNhLCAmY21kLAorCQkJCUNNRF9SRVRSSUVTKTsKKwkJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQorCQkJCXJldHVybiBlcnI7CisKKwkJCWhvc3QtPmlvcy5idXNfd2lkdGggPSBNTUNfQlVTX1dJRFRIXzQ7CisJCX0KKwl9CisKKwlob3N0LT5vcHMtPnNldF9pb3MoaG9zdCwgJmhvc3QtPmlvcyk7CisKKwlyZXR1cm4gTU1DX0VSUl9OT05FOworfQorCiAvKgogICogRW5zdXJlIHRoYXQgbm8gY2FyZCBpcyBzZWxlY3RlZC4KICAqLwpAQCAtMzIyLDQ4ICs0NTEsNjkgQEAKIAogCW1lbXNldCgmY2FyZC0+Y2lkLCAwLCBzaXplb2Yoc3RydWN0IG1tY19jaWQpKTsKIAotCS8qCi0JICogVGhlIHNlbGVjdGlvbiBvZiB0aGUgZm9ybWF0IGhlcmUgaXMgZ3Vlc3N3b3JrIGJhc2VkIHVwb24KLQkgKiBpbmZvcm1hdGlvbiBwZW9wbGUgaGF2ZSBzZW50IHRvIGRhdGUuCi0JICovCi0Jc3dpdGNoIChjYXJkLT5jc2QubW1jYV92c24pIHsKLQljYXNlIDA6IC8qIE1NQyB2MS4/ICovCi0JY2FzZSAxOiAvKiBNTUMgdjEuNCAqLwotCQljYXJkLT5jaWQubWFuZmlkCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDEwNCwgMjQpOwotCQljYXJkLT5jaWQucHJvZF9uYW1lWzBdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDk2LCA4KTsKLQkJY2FyZC0+Y2lkLnByb2RfbmFtZVsxXQk9IFVOU1RVRkZfQklUUyhyZXNwLCA4OCwgOCk7Ci0JCWNhcmQtPmNpZC5wcm9kX25hbWVbMl0JPSBVTlNUVUZGX0JJVFMocmVzcCwgODAsIDgpOwotCQljYXJkLT5jaWQucHJvZF9uYW1lWzNdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDcyLCA4KTsKLQkJY2FyZC0+Y2lkLnByb2RfbmFtZVs0XQk9IFVOU1RVRkZfQklUUyhyZXNwLCA2NCwgOCk7Ci0JCWNhcmQtPmNpZC5wcm9kX25hbWVbNV0JPSBVTlNUVUZGX0JJVFMocmVzcCwgNTYsIDgpOwotCQljYXJkLT5jaWQucHJvZF9uYW1lWzZdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDQ4LCA4KTsKLQkJY2FyZC0+Y2lkLmh3cmV2CQk9IFVOU1RVRkZfQklUUyhyZXNwLCA0NCwgNCk7Ci0JCWNhcmQtPmNpZC5md3JldgkJPSBVTlNUVUZGX0JJVFMocmVzcCwgNDAsIDQpOwotCQljYXJkLT5jaWQuc2VyaWFsCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDE2LCAyNCk7Ci0JCWNhcmQtPmNpZC5tb250aAkJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTIsIDQpOwotCQljYXJkLT5jaWQueWVhcgkJPSBVTlNUVUZGX0JJVFMocmVzcCwgOCwgNCkgKyAxOTk3OwotCQlicmVhazsKKwlpZiAobW1jX2NhcmRfc2QoY2FyZCkpIHsKKwkJLyoKKwkJICogU0QgZG9lc24ndCBjdXJyZW50bHkgaGF2ZSBhIHZlcnNpb24gZmllbGQgc28gd2Ugd2lsbAorCQkgKiBoYXZlIHRvIGFzc3VtZSB3ZSBjYW4gcGFyc2UgdGhpcy4KKwkJICovCisJCWNhcmQtPmNpZC5tYW5maWQJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDEyMCwgOCk7CisJCWNhcmQtPmNpZC5vZW1pZAkJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDEwNCwgMTYpOworCQljYXJkLT5jaWQucHJvZF9uYW1lWzBdCQk9IFVOU1RVRkZfQklUUyhyZXNwLCA5NiwgOCk7CisJCWNhcmQtPmNpZC5wcm9kX25hbWVbMV0JCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDg4LCA4KTsKKwkJY2FyZC0+Y2lkLnByb2RfbmFtZVsyXQkJPSBVTlNUVUZGX0JJVFMocmVzcCwgODAsIDgpOworCQljYXJkLT5jaWQucHJvZF9uYW1lWzNdCQk9IFVOU1RVRkZfQklUUyhyZXNwLCA3MiwgOCk7CisJCWNhcmQtPmNpZC5wcm9kX25hbWVbNF0JCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDY0LCA4KTsKKwkJY2FyZC0+Y2lkLmh3cmV2CQkJPSBVTlNUVUZGX0JJVFMocmVzcCwgNjAsIDQpOworCQljYXJkLT5jaWQuZndyZXYJCQk9IFVOU1RVRkZfQklUUyhyZXNwLCA1NiwgNCk7CisJCWNhcmQtPmNpZC5zZXJpYWwJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDI0LCAzMik7CisJCWNhcmQtPmNpZC55ZWFyCQkJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTIsIDgpOworCQljYXJkLT5jaWQubW9udGgJCQk9IFVOU1RVRkZfQklUUyhyZXNwLCA4LCA0KTsKIAotCWNhc2UgMjogLyogTU1DIHYyLnggPyAqLwotCWNhc2UgMzogLyogTU1DIHYzLnggPyAqLwotCQljYXJkLT5jaWQubWFuZmlkCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDEyMCwgOCk7Ci0JCWNhcmQtPmNpZC5vZW1pZAkJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTA0LCAxNik7Ci0JCWNhcmQtPmNpZC5wcm9kX25hbWVbMF0JPSBVTlNUVUZGX0JJVFMocmVzcCwgOTYsIDgpOwotCQljYXJkLT5jaWQucHJvZF9uYW1lWzFdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDg4LCA4KTsKLQkJY2FyZC0+Y2lkLnByb2RfbmFtZVsyXQk9IFVOU1RVRkZfQklUUyhyZXNwLCA4MCwgOCk7Ci0JCWNhcmQtPmNpZC5wcm9kX25hbWVbM10JPSBVTlNUVUZGX0JJVFMocmVzcCwgNzIsIDgpOwotCQljYXJkLT5jaWQucHJvZF9uYW1lWzRdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDY0LCA4KTsKLQkJY2FyZC0+Y2lkLnByb2RfbmFtZVs1XQk9IFVOU1RVRkZfQklUUyhyZXNwLCA1NiwgOCk7Ci0JCWNhcmQtPmNpZC5zZXJpYWwJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTYsIDMyKTsKLQkJY2FyZC0+Y2lkLm1vbnRoCQk9IFVOU1RVRkZfQklUUyhyZXNwLCAxMiwgNCk7Ci0JCWNhcmQtPmNpZC55ZWFyCQk9IFVOU1RVRkZfQklUUyhyZXNwLCA4LCA0KSArIDE5OTc7Ci0JCWJyZWFrOworCQljYXJkLT5jaWQueWVhciArPSAyMDAwOyAvKiBTRCBjYXJkcyB5ZWFyIG9mZnNldCAqLworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSBzZWxlY3Rpb24gb2YgdGhlIGZvcm1hdCBoZXJlIGlzIGJhc2VkIHVwb24gcHVibGlzaGVkCisJCSAqIHNwZWNzIGZyb20gc2FuZGlzayBhbmQgZnJvbSB3aGF0IHBlb3BsZSBoYXZlIHJlcG9ydGVkLgorCQkgKi8KKwkJc3dpdGNoIChjYXJkLT5jc2QubW1jYV92c24pIHsKKwkJY2FzZSAwOiAvKiBNTUMgdjEuMCAtIHYxLjIgKi8KKwkJY2FzZSAxOiAvKiBNTUMgdjEuNCAqLworCQkJY2FyZC0+Y2lkLm1hbmZpZAk9IFVOU1RVRkZfQklUUyhyZXNwLCAxMDQsIDI0KTsKKwkJCWNhcmQtPmNpZC5wcm9kX25hbWVbMF0JPSBVTlNUVUZGX0JJVFMocmVzcCwgOTYsIDgpOworCQkJY2FyZC0+Y2lkLnByb2RfbmFtZVsxXQk9IFVOU1RVRkZfQklUUyhyZXNwLCA4OCwgOCk7CisJCQljYXJkLT5jaWQucHJvZF9uYW1lWzJdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDgwLCA4KTsKKwkJCWNhcmQtPmNpZC5wcm9kX25hbWVbM10JPSBVTlNUVUZGX0JJVFMocmVzcCwgNzIsIDgpOworCQkJY2FyZC0+Y2lkLnByb2RfbmFtZVs0XQk9IFVOU1RVRkZfQklUUyhyZXNwLCA2NCwgOCk7CisJCQljYXJkLT5jaWQucHJvZF9uYW1lWzVdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDU2LCA4KTsKKwkJCWNhcmQtPmNpZC5wcm9kX25hbWVbNl0JPSBVTlNUVUZGX0JJVFMocmVzcCwgNDgsIDgpOworCQkJY2FyZC0+Y2lkLmh3cmV2CQk9IFVOU1RVRkZfQklUUyhyZXNwLCA0NCwgNCk7CisJCQljYXJkLT5jaWQuZndyZXYJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDQwLCA0KTsKKwkJCWNhcmQtPmNpZC5zZXJpYWwJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTYsIDI0KTsKKwkJCWNhcmQtPmNpZC5tb250aAkJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTIsIDQpOworCQkJY2FyZC0+Y2lkLnllYXIJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDgsIDQpICsgMTk5NzsKKwkJCWJyZWFrOwogCi0JZGVmYXVsdDoKLQkJcHJpbnRrKCIlczogY2FyZCBoYXMgdW5rbm93biBNTUNBIHZlcnNpb24gJWRcbiIsCi0JCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGNhcmQtPmNzZC5tbWNhX3Zzbik7Ci0JCW1tY19jYXJkX3NldF9iYWQoY2FyZCk7Ci0JCWJyZWFrOworCQljYXNlIDI6IC8qIE1NQyB2Mi4wIC0gdjIuMiAqLworCQljYXNlIDM6IC8qIE1NQyB2My4xIC0gdjMuMyAqLworCQkJY2FyZC0+Y2lkLm1hbmZpZAk9IFVOU1RVRkZfQklUUyhyZXNwLCAxMjAsIDgpOworCQkJY2FyZC0+Y2lkLm9lbWlkCQk9IFVOU1RVRkZfQklUUyhyZXNwLCAxMDQsIDE2KTsKKwkJCWNhcmQtPmNpZC5wcm9kX25hbWVbMF0JPSBVTlNUVUZGX0JJVFMocmVzcCwgOTYsIDgpOworCQkJY2FyZC0+Y2lkLnByb2RfbmFtZVsxXQk9IFVOU1RVRkZfQklUUyhyZXNwLCA4OCwgOCk7CisJCQljYXJkLT5jaWQucHJvZF9uYW1lWzJdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDgwLCA4KTsKKwkJCWNhcmQtPmNpZC5wcm9kX25hbWVbM10JPSBVTlNUVUZGX0JJVFMocmVzcCwgNzIsIDgpOworCQkJY2FyZC0+Y2lkLnByb2RfbmFtZVs0XQk9IFVOU1RVRkZfQklUUyhyZXNwLCA2NCwgOCk7CisJCQljYXJkLT5jaWQucHJvZF9uYW1lWzVdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDU2LCA4KTsKKwkJCWNhcmQtPmNpZC5zZXJpYWwJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTYsIDMyKTsKKwkJCWNhcmQtPmNpZC5tb250aAkJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTIsIDQpOworCQkJY2FyZC0+Y2lkLnllYXIJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDgsIDQpICsgMTk5NzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoIiVzOiBjYXJkIGhhcyB1bmtub3duIE1NQ0EgdmVyc2lvbiAlZFxuIiwKKwkJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGNhcmQtPmNzZC5tbWNhX3Zzbik7CisJCQltbWNfY2FyZF9zZXRfYmFkKGNhcmQpOworCQkJYnJlYWs7CisJCX0KIAl9CiB9CiAKQEAgLTM3NiwzNCArNTI2LDg2IEBACiAJdW5zaWduZWQgaW50IGUsIG0sIGNzZF9zdHJ1Y3Q7CiAJdTMyICpyZXNwID0gY2FyZC0+cmF3X2NzZDsKIAotCS8qCi0JICogV2Ugb25seSB1bmRlcnN0YW5kIENTRCBzdHJ1Y3R1cmUgdjEuMSBhbmQgdjIuCi0JICogdjIgaGFzIGV4dHJhIGluZm9ybWF0aW9uIGluIGJpdHMgMTUsIDExIGFuZCAxMC4KLQkgKi8KLQljc2Rfc3RydWN0ID0gVU5TVFVGRl9CSVRTKHJlc3AsIDEyNiwgMik7Ci0JaWYgKGNzZF9zdHJ1Y3QgIT0gMSAmJiBjc2Rfc3RydWN0ICE9IDIpIHsKLQkJcHJpbnRrKCIlczogdW5yZWNvZ25pc2VkIENTRCBzdHJ1Y3R1cmUgdmVyc2lvbiAlZFxuIiwKLQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgY3NkX3N0cnVjdCk7CisJaWYgKG1tY19jYXJkX3NkKGNhcmQpKSB7CisJCWNzZF9zdHJ1Y3QgPSBVTlNUVUZGX0JJVFMocmVzcCwgMTI2LCAyKTsKKwkJaWYgKGNzZF9zdHJ1Y3QgIT0gMCkgeworCQkJcHJpbnRrKCIlczogdW5yZWNvZ25pc2VkIENTRCBzdHJ1Y3R1cmUgdmVyc2lvbiAlZFxuIiwKKwkJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGNzZF9zdHJ1Y3QpOworCQkJbW1jX2NhcmRfc2V0X2JhZChjYXJkKTsKKwkJCXJldHVybjsKKwkJfQorCisJCW0gPSBVTlNUVUZGX0JJVFMocmVzcCwgMTE1LCA0KTsKKwkJZSA9IFVOU1RVRkZfQklUUyhyZXNwLCAxMTIsIDMpOworCQljc2QtPnRhY2NfbnMJID0gKHRhY2NfZXhwW2VdICogdGFjY19tYW50W21dICsgOSkgLyAxMDsKKwkJY3NkLT50YWNjX2Nsa3MJID0gVU5TVFVGRl9CSVRTKHJlc3AsIDEwNCwgOCkgKiAxMDA7CisKKwkJbSA9IFVOU1RVRkZfQklUUyhyZXNwLCA5OSwgNCk7CisJCWUgPSBVTlNUVUZGX0JJVFMocmVzcCwgOTYsIDMpOworCQljc2QtPm1heF9kdHIJICA9IHRyYW5fZXhwW2VdICogdHJhbl9tYW50W21dOworCQljc2QtPmNtZGNsYXNzCSAgPSBVTlNUVUZGX0JJVFMocmVzcCwgODQsIDEyKTsKKworCQllID0gVU5TVFVGRl9CSVRTKHJlc3AsIDQ3LCAzKTsKKwkJbSA9IFVOU1RVRkZfQklUUyhyZXNwLCA2MiwgMTIpOworCQljc2QtPmNhcGFjaXR5CSAgPSAoMSArIG0pIDw8IChlICsgMik7CisKKwkJY3NkLT5yZWFkX2Jsa2JpdHMgPSBVTlNUVUZGX0JJVFMocmVzcCwgODAsIDQpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIG9ubHkgdW5kZXJzdGFuZCBDU0Qgc3RydWN0dXJlIHYxLjEgYW5kIHYxLjIuCisJCSAqIHYxLjIgaGFzIGV4dHJhIGluZm9ybWF0aW9uIGluIGJpdHMgMTUsIDExIGFuZCAxMC4KKwkJICovCisJCWNzZF9zdHJ1Y3QgPSBVTlNUVUZGX0JJVFMocmVzcCwgMTI2LCAyKTsKKwkJaWYgKGNzZF9zdHJ1Y3QgIT0gMSAmJiBjc2Rfc3RydWN0ICE9IDIpIHsKKwkJCXByaW50aygiJXM6IHVucmVjb2duaXNlZCBDU0Qgc3RydWN0dXJlIHZlcnNpb24gJWRcbiIsCisJCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBjc2Rfc3RydWN0KTsKKwkJCW1tY19jYXJkX3NldF9iYWQoY2FyZCk7CisJCQlyZXR1cm47CisJCX0KKworCQljc2QtPm1tY2FfdnNuCSA9IFVOU1RVRkZfQklUUyhyZXNwLCAxMjIsIDQpOworCQltID0gVU5TVFVGRl9CSVRTKHJlc3AsIDExNSwgNCk7CisJCWUgPSBVTlNUVUZGX0JJVFMocmVzcCwgMTEyLCAzKTsKKwkJY3NkLT50YWNjX25zCSA9ICh0YWNjX2V4cFtlXSAqIHRhY2NfbWFudFttXSArIDkpIC8gMTA7CisJCWNzZC0+dGFjY19jbGtzCSA9IFVOU1RVRkZfQklUUyhyZXNwLCAxMDQsIDgpICogMTAwOworCisJCW0gPSBVTlNUVUZGX0JJVFMocmVzcCwgOTksIDQpOworCQllID0gVU5TVFVGRl9CSVRTKHJlc3AsIDk2LCAzKTsKKwkJY3NkLT5tYXhfZHRyCSAgPSB0cmFuX2V4cFtlXSAqIHRyYW5fbWFudFttXTsKKwkJY3NkLT5jbWRjbGFzcwkgID0gVU5TVFVGRl9CSVRTKHJlc3AsIDg0LCAxMik7CisKKwkJZSA9IFVOU1RVRkZfQklUUyhyZXNwLCA0NywgMyk7CisJCW0gPSBVTlNUVUZGX0JJVFMocmVzcCwgNjIsIDEyKTsKKwkJY3NkLT5jYXBhY2l0eQkgID0gKDEgKyBtKSA8PCAoZSArIDIpOworCisJCWNzZC0+cmVhZF9ibGtiaXRzID0gVU5TVFVGRl9CSVRTKHJlc3AsIDgwLCA0KTsKKwl9Cit9CisKKy8qCisgKiBHaXZlbiBhIDY0LWJpdCByZXNwb25zZSwgZGVjb2RlIHRvIG91ciBjYXJkIFNDUiBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIG1tY19kZWNvZGVfc2NyKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3Qgc2Rfc2NyICpzY3IgPSAmY2FyZC0+c2NyOworCXVuc2lnbmVkIGludCBzY3Jfc3RydWN0OworCXUzMiByZXNwWzRdOworCisJQlVHX09OKCFtbWNfY2FyZF9zZChjYXJkKSk7CisKKwlyZXNwWzNdID0gY2FyZC0+cmF3X3NjclsxXTsKKwlyZXNwWzJdID0gY2FyZC0+cmF3X3NjclswXTsKKworCXNjcl9zdHJ1Y3QgPSBVTlNUVUZGX0JJVFMocmVzcCwgNjAsIDQpOworCWlmIChzY3Jfc3RydWN0ICE9IDApIHsKKwkJcHJpbnRrKCIlczogdW5yZWNvZ25pc2VkIFNDUiBzdHJ1Y3R1cmUgdmVyc2lvbiAlZFxuIiwKKwkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgc2NyX3N0cnVjdCk7CiAJCW1tY19jYXJkX3NldF9iYWQoY2FyZCk7CiAJCXJldHVybjsKIAl9CiAKLQljc2QtPm1tY2FfdnNuCSA9IFVOU1RVRkZfQklUUyhyZXNwLCAxMjIsIDQpOwotCW0gPSBVTlNUVUZGX0JJVFMocmVzcCwgMTE1LCA0KTsKLQllID0gVU5TVFVGRl9CSVRTKHJlc3AsIDExMiwgMyk7Ci0JY3NkLT50YWNjX25zCSA9ICh0YWNjX2V4cFtlXSAqIHRhY2NfbWFudFttXSArIDkpIC8gMTA7Ci0JY3NkLT50YWNjX2Nsa3MJID0gVU5TVFVGRl9CSVRTKHJlc3AsIDEwNCwgOCkgKiAxMDA7Ci0KLQltID0gVU5TVFVGRl9CSVRTKHJlc3AsIDk5LCA0KTsKLQllID0gVU5TVFVGRl9CSVRTKHJlc3AsIDk2LCAzKTsKLQljc2QtPm1heF9kdHIJICA9IHRyYW5fZXhwW2VdICogdHJhbl9tYW50W21dOwotCWNzZC0+Y21kY2xhc3MJICA9IFVOU1RVRkZfQklUUyhyZXNwLCA4NCwgMTIpOwotCi0JZSA9IFVOU1RVRkZfQklUUyhyZXNwLCA0NywgMyk7Ci0JbSA9IFVOU1RVRkZfQklUUyhyZXNwLCA2MiwgMTIpOwotCWNzZC0+Y2FwYWNpdHkJICA9ICgxICsgbSkgPDwgKGUgKyAyKTsKLQotCWNzZC0+cmVhZF9ibGtiaXRzID0gVU5TVFVGRl9CSVRTKHJlc3AsIDgwLCA0KTsKKwlzY3ItPnNkYV92c24gPSBVTlNUVUZGX0JJVFMocmVzcCwgNTYsIDQpOworCXNjci0+YnVzX3dpZHRocyA9IFVOU1RVRkZfQklUUyhyZXNwLCA0OCwgNCk7CiB9CiAKIC8qCkBAIC00NTcsNiArNjU5LDExIEBACiB7CiAJc3RydWN0IG1tY19jb21tYW5kIGNtZDsKIAorCWhvc3QtPmlvcy5jaGlwX3NlbGVjdCA9IE1NQ19DU19ISUdIOworCWhvc3QtPm9wcy0+c2V0X2lvcyhob3N0LCAmaG9zdC0+aW9zKTsKKworCW1tY19kZWxheSgxKTsKKwogCWNtZC5vcGNvZGUgPSBNTUNfR09fSURMRV9TVEFURTsKIAljbWQuYXJnID0gMDsKIAljbWQuZmxhZ3MgPSBNTUNfUlNQX05PTkU7CkBAIC00NjQsNiArNjcxLDExIEBACiAJbW1jX3dhaXRfZm9yX2NtZChob3N0LCAmY21kLCAwKTsKIAogCW1tY19kZWxheSgxKTsKKworCWhvc3QtPmlvcy5jaGlwX3NlbGVjdCA9IE1NQ19DU19ET05UQ0FSRTsKKwlob3N0LT5vcHMtPnNldF9pb3MoaG9zdCwgJmhvc3QtPmlvcyk7CisKKwltbWNfZGVsYXkoMSk7CiB9CiAKIC8qCkBAIC00NzUsNyArNjg3LDkgQEAKIAogCWhvc3QtPmlvcy52ZGQgPSBiaXQ7CiAJaG9zdC0+aW9zLmJ1c19tb2RlID0gTU1DX0JVU01PREVfT1BFTkRSQUlOOworCWhvc3QtPmlvcy5jaGlwX3NlbGVjdCA9IE1NQ19DU19ET05UQ0FSRTsKIAlob3N0LT5pb3MucG93ZXJfbW9kZSA9IE1NQ19QT1dFUl9VUDsKKwlob3N0LT5pb3MuYnVzX3dpZHRoID0gTU1DX0JVU19XSURUSF8xOwogCWhvc3QtPm9wcy0+c2V0X2lvcyhob3N0LCAmaG9zdC0+aW9zKTsKIAogCW1tY19kZWxheSgxKTsKQEAgLTQ5Miw3ICs3MDYsOSBAQAogCWhvc3QtPmlvcy5jbG9jayA9IDA7CiAJaG9zdC0+aW9zLnZkZCA9IDA7CiAJaG9zdC0+aW9zLmJ1c19tb2RlID0gTU1DX0JVU01PREVfT1BFTkRSQUlOOworCWhvc3QtPmlvcy5jaGlwX3NlbGVjdCA9IE1NQ19DU19ET05UQ0FSRTsKIAlob3N0LT5pb3MucG93ZXJfbW9kZSA9IE1NQ19QT1dFUl9PRkY7CisJaG9zdC0+aW9zLmJ1c193aWR0aCA9IE1NQ19CVVNfV0lEVEhfMTsKIAlob3N0LT5vcHMtPnNldF9pb3MoaG9zdCwgJmhvc3QtPmlvcyk7CiB9CiAKQEAgLTUyNCw2ICs3NDAsMzQgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IG1tY19zZW5kX2FwcF9vcF9jb25kKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdTMyIG9jciwgdTMyICpyb2NyKQoreworCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CisJaW50IGksIGVyciA9IDA7CisKKwljbWQub3Bjb2RlID0gU0RfQVBQX09QX0NPTkQ7CisJY21kLmFyZyA9IG9jcjsKKwljbWQuZmxhZ3MgPSBNTUNfUlNQX1IzOworCisJZm9yIChpID0gMTAwOyBpOyBpLS0pIHsKKwkJZXJyID0gbW1jX3dhaXRfZm9yX2FwcF9jbWQoaG9zdCwgMCwgJmNtZCwgQ01EX1JFVFJJRVMpOworCQlpZiAoZXJyICE9IE1NQ19FUlJfTk9ORSkKKwkJCWJyZWFrOworCisJCWlmIChjbWQucmVzcFswXSAmIE1NQ19DQVJEX0JVU1kgfHwgb2NyID09IDApCisJCQlicmVhazsKKworCQllcnIgPSBNTUNfRVJSX1RJTUVPVVQ7CisKKwkJbW1jX2RlbGF5KDEwKTsKKwl9CisKKwlpZiAocm9jcikKKwkJKnJvY3IgPSBjbWQucmVzcFswXTsKKworCXJldHVybiBlcnI7Cit9CisKIC8qCiAgKiBEaXNjb3ZlciBjYXJkcyBieSByZXF1ZXN0aW5nIHRoZWlyIENJRC4gIElmIHRoaXMgY29tbWFuZAogICogdGltZXMgb3V0LCBpdCBpcyBub3QgYW4gZXJyb3I7IHRoZXJlIGFyZSBubyBmdXJ0aGVyIGNhcmRzCkBAIC01NjcsMTMgKzgxMSwzOCBAQAogCiAJCWNhcmQtPnN0YXRlICY9IH5NTUNfU1RBVEVfREVBRDsKIAotCQljbWQub3Bjb2RlID0gTU1DX1NFVF9SRUxBVElWRV9BRERSOwotCQljbWQuYXJnID0gY2FyZC0+cmNhIDw8IDE2OwotCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxOworCQlpZiAoaG9zdC0+bW9kZSA9PSBNTUNfTU9ERV9TRCkgeworCQkJbW1jX2NhcmRfc2V0X3NkKGNhcmQpOwogCi0JCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoaG9zdCwgJmNtZCwgQ01EX1JFVFJJRVMpOwotCQlpZiAoZXJyICE9IE1NQ19FUlJfTk9ORSkKLQkJCW1tY19jYXJkX3NldF9kZWFkKGNhcmQpOworCQkJY21kLm9wY29kZSA9IFNEX1NFTkRfUkVMQVRJVkVfQUREUjsKKwkJCWNtZC5hcmcgPSAwOworCQkJY21kLmZsYWdzID0gTU1DX1JTUF9SMTsKKworCQkJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChob3N0LCAmY21kLCBDTURfUkVUUklFUyk7CisJCQlpZiAoZXJyICE9IE1NQ19FUlJfTk9ORSkKKwkJCQltbWNfY2FyZF9zZXRfZGVhZChjYXJkKTsKKwkJCWVsc2UgeworCQkJCWNhcmQtPnJjYSA9IGNtZC5yZXNwWzBdID4+IDE2OworCisJCQkJaWYgKCFob3N0LT5vcHMtPmdldF9ybykgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaG9zdCBkb2VzIG5vdCAiCisJCQkJCQkic3VwcG9ydCByZWFkaW5nIHJlYWQtb25seSAiCisJCQkJCQkic3dpdGNoLiBhc3N1bWluZyB3cml0ZS1lbmFibGUuXG4iLAorCQkJCQkJbW1jX2hvc3RuYW1lKGhvc3QpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoaG9zdC0+b3BzLT5nZXRfcm8oaG9zdCkpCisJCQkJCQltbWNfY2FyZF9zZXRfcmVhZG9ubHkoY2FyZCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJY21kLm9wY29kZSA9IE1NQ19TRVRfUkVMQVRJVkVfQUREUjsKKwkJCWNtZC5hcmcgPSBjYXJkLT5yY2EgPDwgMTY7CisJCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxOworCisJCQllcnIgPSBtbWNfd2FpdF9mb3JfY21kKGhvc3QsICZjbWQsIENNRF9SRVRSSUVTKTsKKwkJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQorCQkJCW1tY19jYXJkX3NldF9kZWFkKGNhcmQpOworCQl9CiAJfQogfQogCkBAIC02MDUsNiArODc0LDc5IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBtbWNfcmVhZF9zY3JzKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBtbWNfY2FyZCAqY2FyZDsKKworCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnE7CisJc3RydWN0IG1tY19jb21tYW5kIGNtZDsKKwlzdHJ1Y3QgbW1jX2RhdGEgZGF0YTsKKworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FyZCwgJmhvc3QtPmNhcmRzLCBub2RlKSB7CisJCWlmIChjYXJkLT5zdGF0ZSAmIChNTUNfU1RBVEVfREVBRHxNTUNfU1RBVEVfUFJFU0VOVCkpCisJCQljb250aW51ZTsKKwkJaWYgKCFtbWNfY2FyZF9zZChjYXJkKSkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IG1tY19zZWxlY3RfY2FyZChob3N0LCBjYXJkKTsKKwkJaWYgKGVyciAhPSBNTUNfRVJSX05PTkUpIHsKKwkJCW1tY19jYXJkX3NldF9kZWFkKGNhcmQpOworCQkJY29udGludWU7CisJCX0KKworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfY29tbWFuZCkpOworCisJCWNtZC5vcGNvZGUgPSBNTUNfQVBQX0NNRDsKKwkJY21kLmFyZyA9IGNhcmQtPnJjYSA8PCAxNjsKKwkJY21kLmZsYWdzID0gTU1DX1JTUF9SMTsKKworCQllcnIgPSBtbWNfd2FpdF9mb3JfY21kKGhvc3QsICZjbWQsIDApOworCQlpZiAoKGVyciAhPSBNTUNfRVJSX05PTkUpIHx8ICEoY21kLnJlc3BbMF0gJiBSMV9BUFBfQ01EKSkgeworCQkJbW1jX2NhcmRfc2V0X2RlYWQoY2FyZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCW1lbXNldCgmY21kLCAwLCBzaXplb2Yoc3RydWN0IG1tY19jb21tYW5kKSk7CisKKwkJY21kLm9wY29kZSA9IFNEX0FQUF9TRU5EX1NDUjsKKwkJY21kLmFyZyA9IDA7CisJCWNtZC5mbGFncyA9IE1NQ19SU1BfUjE7CisKKwkJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2Yoc3RydWN0IG1tY19kYXRhKSk7CisKKwkJZGF0YS50aW1lb3V0X25zID0gY2FyZC0+Y3NkLnRhY2NfbnMgKiAxMDsKKwkJZGF0YS50aW1lb3V0X2Nsa3MgPSBjYXJkLT5jc2QudGFjY19jbGtzICogMTA7CisJCWRhdGEuYmxrc3pfYml0cyA9IDM7CisJCWRhdGEuYmxvY2tzID0gMTsKKwkJZGF0YS5mbGFncyA9IE1NQ19EQVRBX1JFQUQ7CisJCWRhdGEuc2cgPSAmc2c7CisJCWRhdGEuc2dfbGVuID0gMTsKKworCQltZW1zZXQoJm1ycSwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfcmVxdWVzdCkpOworCisJCW1ycS5jbWQgPSAmY21kOworCQltcnEuZGF0YSA9ICZkYXRhOworCisJCXNnX2luaXRfb25lKCZzZywgKHU4KiljYXJkLT5yYXdfc2NyLCA4KTsKKworCQllcnIgPSBtbWNfd2FpdF9mb3JfcmVxKGhvc3QsICZtcnEpOworCQlpZiAoZXJyICE9IE1NQ19FUlJfTk9ORSkgeworCQkJbW1jX2NhcmRfc2V0X2RlYWQoY2FyZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWNhcmQtPnJhd19zY3JbMF0gPSBudG9obChjYXJkLT5yYXdfc2NyWzBdKTsKKwkJY2FyZC0+cmF3X3NjclsxXSA9IG50b2hsKGNhcmQtPnJhd19zY3JbMV0pOworCisJCW1tY19kZWNvZGVfc2NyKGNhcmQpOworCX0KKworCW1tY19kZXNlbGVjdF9jYXJkcyhob3N0KTsKK30KKwogc3RhdGljIHVuc2lnbmVkIGludCBtbWNfY2FsY3VsYXRlX2Nsb2NrKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKIHsKIAlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQ7CkBAIC02NTcsMTIgKzk5OSwyNCBAQAogCQlpbnQgZXJyOwogCQl1MzIgb2NyOwogCisJCWhvc3QtPm1vZGUgPSBNTUNfTU9ERV9TRDsKKwogCQltbWNfcG93ZXJfdXAoaG9zdCk7CiAJCW1tY19pZGxlX2NhcmRzKGhvc3QpOwogCi0JCWVyciA9IG1tY19zZW5kX29wX2NvbmQoaG9zdCwgMCwgJm9jcik7Ci0JCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQotCQkJcmV0dXJuOworCQllcnIgPSBtbWNfc2VuZF9hcHBfb3BfY29uZChob3N0LCAwLCAmb2NyKTsKKworCQkvKgorCQkgKiBJZiB3ZSBmYWlsIHRvIGRldGVjdCBhbnkgU0QgY2FyZHMgdGhlbiB0cnkKKwkJICogc2VhcmNoaW5nIGZvciBNTUMgY2FyZHMuCisJCSAqLworCQlpZiAoZXJyICE9IE1NQ19FUlJfTk9ORSkgeworCQkJaG9zdC0+bW9kZSA9IE1NQ19NT0RFX01NQzsKKworCQkJZXJyID0gbW1jX3NlbmRfb3BfY29uZChob3N0LCAwLCAmb2NyKTsKKwkJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQorCQkJCXJldHVybjsKKwkJfQogCiAJCWhvc3QtPm9jciA9IG1tY19zZWxlY3Rfdm9sdGFnZShob3N0LCBvY3IpOwogCkBAIC03MDIsNyArMTA1NiwxMCBAQAogCSAqIGFsbCBnZXQgdGhlIGlkZWEgdGhhdCB0aGV5IHNob3VsZCBiZSByZWFkeSBmb3IgQ01EMi4KIAkgKiAoTXkgU2FuRGlzayBjYXJkIHNlZW1zIHRvIG5lZWQgdGhpcy4pCiAJICovCi0JbW1jX3NlbmRfb3BfY29uZChob3N0LCBob3N0LT5vY3IsIE5VTEwpOworCWlmIChob3N0LT5tb2RlID09IE1NQ19NT0RFX1NEKQorCQltbWNfc2VuZF9hcHBfb3BfY29uZChob3N0LCBob3N0LT5vY3IsIE5VTEwpOworCWVsc2UKKwkJbW1jX3NlbmRfb3BfY29uZChob3N0LCBob3N0LT5vY3IsIE5VTEwpOwogCiAJbW1jX2Rpc2NvdmVyX2NhcmRzKGhvc3QpOwogCkBAIC03MTMsMTkgKzEwNzAsMjYgQEAKIAlob3N0LT5vcHMtPnNldF9pb3MoaG9zdCwgJmhvc3QtPmlvcyk7CiAKIAltbWNfcmVhZF9jc2RzKGhvc3QpOworCisJaWYgKGhvc3QtPm1vZGUgPT0gTU1DX01PREVfU0QpCisJCW1tY19yZWFkX3NjcnMoaG9zdCk7CiB9CiAKIAogLyoqCiAgKgltbWNfZGV0ZWN0X2NoYW5nZSAtIHByb2Nlc3MgY2hhbmdlIG9mIHN0YXRlIG9uIGEgTU1DIHNvY2tldAogICoJQGhvc3Q6IGhvc3Qgd2hpY2ggY2hhbmdlZCBzdGF0ZS4KKyAqCUBkZWxheTogb3B0aW9uYWwgZGVsYXkgdG8gd2FpdCBiZWZvcmUgZGV0ZWN0aW9uIChqaWZmaWVzKQogICoKICAqCUFsbCB3ZSBrbm93IGlzIHRoYXQgY2FyZChzKSBoYXZlIGJlZW4gaW5zZXJ0ZWQgb3IgcmVtb3ZlZAogICoJZnJvbSB0aGUgc29ja2V0KHMpLiAgV2UgZG9uJ3Qga25vdyB3aGljaCBzb2NrZXQgb3IgY2FyZHMuCiAgKi8KLXZvaWQgbW1jX2RldGVjdF9jaGFuZ2Uoc3RydWN0IG1tY19ob3N0ICpob3N0KQordm9pZCBtbWNfZGV0ZWN0X2NoYW5nZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGxvbmcgZGVsYXkpCiB7Ci0Jc2NoZWR1bGVfd29yaygmaG9zdC0+ZGV0ZWN0KTsKKwlpZiAoZGVsYXkpCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaG9zdC0+ZGV0ZWN0LCBkZWxheSk7CisJZWxzZQorCQlzY2hlZHVsZV93b3JrKCZob3N0LT5kZXRlY3QpOwogfQogCiBFWFBPUlRfU1lNQk9MKG1tY19kZXRlY3RfY2hhbmdlKTsKQEAgLTgyOSw3ICsxMTkzLDcgQEAKIAlyZXQgPSBtbWNfYWRkX2hvc3Rfc3lzZnMoaG9zdCk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCW1tY19wb3dlcl9vZmYoaG9zdCk7Ci0JCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QpOworCQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LCAwKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtODk5LDcgKzEyNjMsNyBAQAogICovCiBpbnQgbW1jX3Jlc3VtZV9ob3N0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKIHsKLQltbWNfZGV0ZWN0X2NoYW5nZShob3N0KTsKKwltbWNfZGV0ZWN0X2NoYW5nZShob3N0LCAwKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jX2Jsb2NrLmMgYi9kcml2ZXJzL21tYy9tbWNfYmxvY2suYwppbmRleCBkNGVlZTk5Li5mYTgzZjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNfYmxvY2suYworKysgYi9kcml2ZXJzL21tYy9tbWNfYmxvY2suYwpAQCAtOTUsNiArOTUsMTAgQEAKIAkJaWYgKG1kLT51c2FnZSA9PSAyKQogCQkJY2hlY2tfZGlza19jaGFuZ2UoaW5vZGUtPmlfYmRldik7CiAJCXJldCA9IDA7CisKKwkJaWYgKChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKKwkJCW1tY19jYXJkX3JlYWRvbmx5KG1kLT5xdWV1ZS5jYXJkKSkKKwkJCXJldCA9IC1FUk9GUzsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNDAzLDkgKzQwNywxMCBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzICVzICVkS2lCXG4iLAorCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyAlcyAlZEtpQiAlc1xuIiwKIAkJbWQtPmRpc2stPmRpc2tfbmFtZSwgbW1jX2NhcmRfaWQoY2FyZCksIG1tY19jYXJkX25hbWUoY2FyZCksCi0JCShjYXJkLT5jc2QuY2FwYWNpdHkgPDwgY2FyZC0+Y3NkLnJlYWRfYmxrYml0cykgLyAxMDI0KTsKKwkJKGNhcmQtPmNzZC5jYXBhY2l0eSA8PCBjYXJkLT5jc2QucmVhZF9ibGtiaXRzKSAvIDEwMjQsCisJCW1tY19jYXJkX3JlYWRvbmx5KGNhcmQpPyIocm8pIjoiIik7CiAKIAltbWNfc2V0X2RydmRhdGEoY2FyZCwgbWQpOwogCWFkZF9kaXNrKG1kLT5kaXNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL21tY19zeXNmcy5jIGIvZHJpdmVycy9tbWMvbW1jX3N5c2ZzLmMKaW5kZXggYWQ4OTQ5OC4uM2Y0YTY2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvbW1jX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9tbWMvbW1jX3N5c2ZzLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAljYXJkLT5yYXdfY2lkWzJdLCBjYXJkLT5yYXdfY2lkWzNdKTsKIE1NQ19BVFRSKGNzZCwgIiUwOHglMDh4JTA4eCUwOHhcbiIsIGNhcmQtPnJhd19jc2RbMF0sIGNhcmQtPnJhd19jc2RbMV0sCiAJY2FyZC0+cmF3X2NzZFsyXSwgY2FyZC0+cmF3X2NzZFszXSk7CitNTUNfQVRUUihzY3IsICIlMDh4JTA4eFxuIiwgY2FyZC0+cmF3X3NjclswXSwgY2FyZC0+cmF3X3NjclsxXSk7CiBNTUNfQVRUUihkYXRlLCAiJTAyZC8lMDRkXG4iLCBjYXJkLT5jaWQubW9udGgsIGNhcmQtPmNpZC55ZWFyKTsKIE1NQ19BVFRSKGZ3cmV2LCAiMHgleFxuIiwgY2FyZC0+Y2lkLmZ3cmV2KTsKIE1NQ19BVFRSKGh3cmV2LCAiMHgleFxuIiwgY2FyZC0+Y2lkLmh3cmV2KTsKQEAgLTU3LDYgKzU4LDggQEAKIAlfX0FUVFJfTlVMTAogfTsKIAorc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIG1tY19kZXZfYXR0cl9zY3IgPSBNTUNfQVRUUl9STyhzY3IpOworCiAKIHN0YXRpYyB2b2lkIG1tY19yZWxlYXNlX2NhcmQoc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtMjA3LDEwICsyMTAsMjAgQEAKICAqLwogaW50IG1tY19yZWdpc3Rlcl9jYXJkKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKIHsKKwlpbnQgcmV0OworCiAJc25wcmludGYoY2FyZC0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGNhcmQtPmRldi5idXNfaWQpLAogCQkgIiVzOiUwNHgiLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGNhcmQtPnJjYSk7CiAKLQlyZXR1cm4gZGV2aWNlX2FkZCgmY2FyZC0+ZGV2KTsKKwlyZXQgPSBkZXZpY2VfYWRkKCZjYXJkLT5kZXYpOworCWlmIChyZXQgPT0gMCkgeworCQlpZiAobW1jX2NhcmRfc2QoY2FyZCkpIHsKKwkJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmY2FyZC0+ZGV2LCAmbW1jX2Rldl9hdHRyX3Njcik7CisJCQlpZiAocmV0KQorCQkJCWRldmljZV9kZWwoJmNhcmQtPmRldik7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTIxOSw4ICsyMzIsMTIgQEAKICAqLwogdm9pZCBtbWNfcmVtb3ZlX2NhcmQoc3RydWN0IG1tY19jYXJkICpjYXJkKQogewotCWlmIChtbWNfY2FyZF9wcmVzZW50KGNhcmQpKQorCWlmIChtbWNfY2FyZF9wcmVzZW50KGNhcmQpKSB7CisJCWlmIChtbWNfY2FyZF9zZChjYXJkKSkKKwkJCWRldmljZV9yZW1vdmVfZmlsZSgmY2FyZC0+ZGV2LCAmbW1jX2Rldl9hdHRyX3Njcik7CisKIAkJZGV2aWNlX2RlbCgmY2FyZC0+ZGV2KTsKKwl9CiAKIAlwdXRfZGV2aWNlKCZjYXJkLT5kZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jaS5jIGIvZHJpdmVycy9tbWMvbW1jaS5jCmluZGV4IDcxNmM0ZWYuLjkxYzc0ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL21tY2kuYworKysgYi9kcml2ZXJzL21tYy9tbWNpLmMKQEAgLTQ0Miw3ICs0NDIsNyBAQAogCiAJc3RhdHVzID0gaG9zdC0+cGxhdC0+c3RhdHVzKG1tY19kZXYoaG9zdC0+bW1jKSk7CiAJaWYgKHN0YXR1cyBeIGhvc3QtPm9sZHN0YXQpCi0JCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYyk7CisJCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYywgMCk7CiAKIAlob3N0LT5vbGRzdGF0ID0gc3RhdHVzOwogCW1vZF90aW1lcigmaG9zdC0+dGltZXIsIGppZmZpZXMgKyBIWik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9weGFtY2kuYyBiL2RyaXZlcnMvbW1jL3B4YW1jaS5jCmluZGV4IGI3OGJlYjEuLmI1M2FmNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL3B4YW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL3B4YW1jaS5jCkBAIC0zNjIsNiArMzYyLDE2IEBACiAJcHhhbWNpX3N0YXJ0X2NtZChob3N0LCBtcnEtPmNtZCwgY21kYXQpOwogfQogCitzdGF0aWMgaW50IHB4YW1jaV9nZXRfcm8oc3RydWN0IG1tY19ob3N0ICptbWMpCit7CisJc3RydWN0IHB4YW1jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKworCWlmIChob3N0LT5wZGF0YSAmJiBob3N0LT5wZGF0YS0+Z2V0X3JvKQorCQlyZXR1cm4gaG9zdC0+cGRhdGEtPmdldF9ybyhtbWMtPmRldik7CisJLyogSG9zdCBkb2Vzbid0IHN1cHBvcnQgcmVhZCBvbmx5IGRldGVjdGlvbiBzbyBhc3N1bWUgd3JpdGVhYmxlICovCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHB4YW1jaV9zZXRfaW9zKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQogewogCXN0cnVjdCBweGFtY2lfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CkBAIC00MDEsNiArNDExLDcgQEAKIAogc3RhdGljIHN0cnVjdCBtbWNfaG9zdF9vcHMgcHhhbWNpX29wcyA9IHsKIAkucmVxdWVzdAk9IHB4YW1jaV9yZXF1ZXN0LAorCS5nZXRfcm8JCT0gcHhhbWNpX2dldF9ybywKIAkuc2V0X2lvcwk9IHB4YW1jaV9zZXRfaW9zLAogfTsKIApAQCAtNDEyLDcgKzQyMyw5IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBweGFtY2lfZGV0ZWN0X2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JbW1jX2RldGVjdF9jaGFuZ2UoZGV2aWQpOworCXN0cnVjdCBweGFtY2lfaG9zdCAqaG9zdCA9IG1tY19wcml2KGRldmlkKTsKKworCW1tY19kZXRlY3RfY2hhbmdlKGRldmlkLCBob3N0LT5wZGF0YS0+ZGV0ZWN0X2RlbGF5KTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL3dic2QuYyBiL2RyaXZlcnMvbW1jL3dic2QuYwppbmRleCA0MDJjMmQ2Li5lMTFlNTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy93YnNkLmMKKysrIGIvZHJpdmVycy9tbWMvd2JzZC5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSAid2JzZC5oIgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJ3YnNkIgotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMS4zIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMS40IgogCiAjaWZkZWYgQ09ORklHX01NQ19ERUJVRwogI2RlZmluZSBEQkcoeC4uLikgXApAQCAtNzIwLDExICs3MjAsMjggQEAKIAkgKiBjYWxjdWxhdGUgQ1JDLgogCSAqCiAJICogU3BhY2UgZm9yIENSQyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBzaXplLgorCSAqIFR3byBieXRlcyBhcmUgbmVlZGVkIGZvciBlYWNoIGRhdGEgbGluZS4KIAkgKi8KLQlibGtzaXplID0gKDEgPDwgZGF0YS0+Ymxrc3pfYml0cykgKyAyOworCWlmIChob3N0LT5idXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF8xKQorCXsKKwkJYmxrc2l6ZSA9ICgxIDw8IGRhdGEtPmJsa3N6X2JpdHMpICsgMjsKKworCQl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1BCU01TQiwgKGJsa3NpemUgPj4gNCkgJiAweEYwKTsKKwkJd2JzZF93cml0ZV9pbmRleChob3N0LCBXQlNEX0lEWF9QQlNMU0IsIGJsa3NpemUgJiAweEZGKTsKKwl9CisJZWxzZSBpZiAoaG9zdC0+YnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfNCkKKwl7CisJCWJsa3NpemUgPSAoMSA8PCBkYXRhLT5ibGtzel9iaXRzKSArIDIgKiA0OwogCQotCXdic2Rfd3JpdGVfaW5kZXgoaG9zdCwgV0JTRF9JRFhfUEJTTVNCLCAoYmxrc2l6ZSA+PiA0KSAmIDB4RjApOwotCXdic2Rfd3JpdGVfaW5kZXgoaG9zdCwgV0JTRF9JRFhfUEJTTFNCLCBibGtzaXplICYgMHhGRik7CisJCXdic2Rfd3JpdGVfaW5kZXgoaG9zdCwgV0JTRF9JRFhfUEJTTVNCLCAoKGJsa3NpemUgPj4gNCkgJiAweEYwKQorCQkJfCBXQlNEX0RBVEFfV0lEVEgpOworCQl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1BCU0xTQiwgYmxrc2l6ZSAmIDB4RkYpOworCX0KKwllbHNlCisJeworCQlkYXRhLT5lcnJvciA9IE1NQ19FUlJfSU5WQUxJRDsKKwkJcmV0dXJuOworCX0KIAogCS8qCiAJICogQ2xlYXIgdGhlIEZJRk8uIFRoaXMgaXMgbmVlZGVkIGV2ZW4gZm9yIERNQQpAQCAtOTYwLDggKzk3Nyw5IEBACiAJc3RydWN0IHdic2RfaG9zdCogaG9zdCA9IG1tY19wcml2KG1tYyk7CiAJdTggY2xrLCBzZXR1cCwgcHdyOwogCQotCURCR0YoImNsb2NrICV1SHogYnVzbW9kZSAldSBwb3dlcm1vZGUgJXUgVmRkICV1XG4iLAotCQlpb3MtPmNsb2NrLCBpb3MtPmJ1c19tb2RlLCBpb3MtPnBvd2VyX21vZGUsIGlvcy0+dmRkKTsKKwlEQkdGKCJjbG9jayAldUh6IGJ1c21vZGUgJXUgcG93ZXJtb2RlICV1IGNzICV1IFZkZCAldSB3aWR0aCAldVxuIiwKKwkgICAgIGlvcy0+Y2xvY2ssIGlvcy0+YnVzX21vZGUsIGlvcy0+cG93ZXJfbW9kZSwgaW9zLT5jaGlwX3NlbGVjdCwKKwkgICAgIGlvcy0+dmRkLCBpb3MtPmJ1c193aWR0aCk7CiAKIAlzcGluX2xvY2tfYmgoJmhvc3QtPmxvY2spOwogCkBAIC0xMDAzLDMwICsxMDIxLDYzIEBACiAKIAkvKgogCSAqIE1NQyBjYXJkcyBuZWVkIHRvIGhhdmUgcGluIDEgaGlnaCBkdXJpbmcgaW5pdC4KLQkgKiBJbml0IHRpbWUgY29ycmVzcG9uZHMgcmF0aGVyIG5pY2VseSB3aXRoIHRoZSBidXMgbW9kZS4KIAkgKiBJdCB3cmVha3MgaGF2b2Mgd2l0aCB0aGUgY2FyZCBkZXRlY3Rpb24gdGhvdWdoIHNvCi0JICogdGhhdCBuZWVkcyB0byBiZSBkaXNhYmVkLgorCSAqIHRoYXQgbmVlZHMgdG8gYmUgZGlzYWJsZWQuCiAJICovCiAJc2V0dXAgPSB3YnNkX3JlYWRfaW5kZXgoaG9zdCwgV0JTRF9JRFhfU0VUVVApOwotCWlmICgoaW9zLT5wb3dlcl9tb2RlID09IE1NQ19QT1dFUl9PTikgJiYKLQkJKGlvcy0+YnVzX21vZGUgPT0gTU1DX0JVU01PREVfT1BFTkRSQUlOKSkKKwlpZiAoaW9zLT5jaGlwX3NlbGVjdCA9PSBNTUNfQ1NfSElHSCkKIAl7CisJCUJVR19PTihpb3MtPmJ1c193aWR0aCAhPSBNTUNfQlVTX1dJRFRIXzEpOwogCQlzZXR1cCB8PSBXQlNEX0RBVDNfSDsKIAkJaG9zdC0+ZmxhZ3MgfD0gV0JTRF9GSUdOT1JFX0RFVEVDVDsKIAl9CiAJZWxzZQogCXsKIAkJc2V0dXAgJj0gfldCU0RfREFUM19IOwotCQlob3N0LT5mbGFncyAmPSB+V0JTRF9GSUdOT1JFX0RFVEVDVDsKKworCQkvKgorCQkgKiBXZSBjYW5ub3QgcmVzdW1lIGNhcmQgZGV0ZWN0aW9uIGltbWVkaWF0bHkKKwkJICogYmVjYXVzZSBvZiBjYXBhY2l0YW5jZSBhbmQgZGVsYXlzIGluIHRoZSBjaGlwLgorCQkgKi8KKwkJbW9kX3RpbWVyKCZob3N0LT5pZ25vcmVfdGltZXIsIGppZmZpZXMgKyBIWi8xMDApOwogCX0KIAl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1NFVFVQLCBzZXR1cCk7CiAJCisJLyoKKwkgKiBTdG9yZSBidXMgd2lkdGggZm9yIGxhdGVyLiBXaWxsIGJlIHVzZWQgd2hlbgorCSAqIHNldHRpbmcgdXAgdGhlIGRhdGEgdHJhbnNmZXIuCisJICovCisJaG9zdC0+YnVzX3dpZHRoID0gaW9zLT5idXNfd2lkdGg7CisKIAlzcGluX3VubG9ja19iaCgmaG9zdC0+bG9jayk7CiB9CiAKK3N0YXRpYyBpbnQgd2JzZF9nZXRfcm8oc3RydWN0IG1tY19ob3N0KiBtbWMpCit7CisJc3RydWN0IHdic2RfaG9zdCogaG9zdCA9IG1tY19wcml2KG1tYyk7CisJdTggY3NyOworCisJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKKworCWNzciA9IGluYihob3N0LT5iYXNlICsgV0JTRF9DU1IpOworCWNzciB8PSBXQlNEX01TTEVEOworCW91dGIoY3NyLCBob3N0LT5iYXNlICsgV0JTRF9DU1IpOworCisJbWRlbGF5KDEpOworCisJY3NyID0gaW5iKGhvc3QtPmJhc2UgKyBXQlNEX0NTUik7CisJY3NyICY9IH5XQlNEX01TTEVEOworCW91dGIoY3NyLCBob3N0LT5iYXNlICsgV0JTRF9DU1IpOworCisJc3Bpbl91bmxvY2tfYmgoJmhvc3QtPmxvY2spOworCisJcmV0dXJuIGNzciAmIFdCU0RfV1JQVDsKK30KKwogc3RhdGljIHN0cnVjdCBtbWNfaG9zdF9vcHMgd2JzZF9vcHMgPSB7CiAJLnJlcXVlc3QJPSB3YnNkX3JlcXVlc3QsCiAJLnNldF9pb3MJPSB3YnNkX3NldF9pb3MsCisJLmdldF9ybwkJPSB3YnNkX2dldF9ybywKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKQEAgLTEwMzYsMTcgKzEwODcsMjggQEAKIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIEhlbHBlciBmdW5jdGlvbiBmb3IgY2FyZCBkZXRlY3Rpb24KKyAqIEhlbHBlciBmdW5jdGlvbiB0byByZXNldCBkZXRlY3Rpb24gaWdub3JlCiAgKi8KLXN0YXRpYyB2b2lkIHdic2RfZGV0ZWN0X2NhcmQodW5zaWduZWQgbG9uZyBkYXRhKQorCitzdGF0aWMgdm9pZCB3YnNkX3Jlc2V0X2lnbm9yZSh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IHdic2RfaG9zdCAqaG9zdCA9IChzdHJ1Y3Qgd2JzZF9ob3N0KilkYXRhOwotCQorCiAJQlVHX09OKGhvc3QgPT0gTlVMTCk7Ci0JCi0JREJHKCJFeGVjdXRpbmcgY2FyZCBkZXRlY3Rpb25cbiIpOwotCQotCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYyk7CQorCisJREJHKCJSZXNldHRpbmcgY2FyZCBkZXRlY3Rpb24gaWdub3JlXG4iKTsKKworCXNwaW5fbG9ja19iaCgmaG9zdC0+bG9jayk7CisKKwlob3N0LT5mbGFncyAmPSB+V0JTRF9GSUdOT1JFX0RFVEVDVDsKKworCS8qCisJICogQ2FyZCBzdGF0dXMgbWlnaHQgaGF2ZSBjaGFuZ2VkIGR1cmluZyB0aGUKKwkgKiBibGFja291dC4KKwkgKi8KKwl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT5jYXJkX3Rhc2tsZXQpOworCisJc3Bpbl91bmxvY2tfYmgoJmhvc3QtPmxvY2spOwogfQogCiAvKgpAQCAtMTA5MywxNCArMTE1NSwxNiBAQAogCQkJREJHKCJDYXJkIGluc2VydGVkXG4iKTsKIAkJCWhvc3QtPmZsYWdzIHw9IFdCU0RfRkNBUkRfUFJFU0VOVDsKIAkJCQorCQkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOworCiAJCQkvKgogCQkJICogRGVsYXkgY2FyZCBkZXRlY3Rpb24gdG8gYWxsb3cgZWxlY3RyaWNhbCBjb25uZWN0aW9ucwogCQkJICogdG8gc3RhYmlsaXNlLgogCQkJICovCi0JCQltb2RfdGltZXIoJmhvc3QtPnRpbWVyLCBqaWZmaWVzICsgSFovMik7CisJCQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LT5tbWMsIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7CiAJCX0KLQkJCi0JCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKKwkJZWxzZQorCQkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOwogCX0KIAllbHNlIGlmIChob3N0LT5mbGFncyAmIFdCU0RfRkNBUkRfUFJFU0VOVCkKIAl7CkBAIC0xMTIyLDggKzExODYsMTAgQEAKIAkJICovCiAJCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKIAotCQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LT5tbWMpOworCQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LT5tbWMsIDApOwogCX0KKwllbHNlCisJCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgd2JzZF90YXNrbGV0X2ZpZm8odW5zaWduZWQgbG9uZyBwYXJhbSkKQEAgLTEzMjQsMTUgKzEzOTAsMTYgQEAKIAltbWMtPmZfbWluID0gMzc1MDAwOwogCW1tYy0+Zl9tYXggPSAyNDAwMDAwMDsKIAltbWMtPm9jcl9hdmFpbCA9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNDsKKwltbWMtPmNhcHMgPSBNTUNfQ0FQXzRfQklUX0RBVEE7CiAJCiAJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmxvY2spOwogCQogCS8qCi0JICogU2V0IHVwIGRldGVjdGlvbiB0aW1lcgorCSAqIFNldCB1cCB0aW1lcnMKIAkgKi8KLQlpbml0X3RpbWVyKCZob3N0LT50aW1lcik7Ci0JaG9zdC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWhvc3Q7Ci0JaG9zdC0+dGltZXIuZnVuY3Rpb24gPSB3YnNkX2RldGVjdF9jYXJkOworCWluaXRfdGltZXIoJmhvc3QtPmlnbm9yZV90aW1lcik7CisJaG9zdC0+aWdub3JlX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylob3N0OworCWhvc3QtPmlnbm9yZV90aW1lci5mdW5jdGlvbiA9IHdic2RfcmVzZXRfaWdub3JlOwogCQogCS8qCiAJICogTWF4aW11bSBudW1iZXIgb2Ygc2VnbWVudHMuIFdvcnN0IGNhc2UgaXMgb25lIHNlY3RvciBwZXIgc2VnbWVudApAQCAtMTM3MCw3ICsxNDM3LDcgQEAKIAlob3N0ID0gbW1jX3ByaXYobW1jKTsKIAlCVUdfT04oaG9zdCA9PSBOVUxMKTsKIAkKLQlkZWxfdGltZXJfc3luYygmaG9zdC0+dGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZob3N0LT5pZ25vcmVfdGltZXIpOwogCQogCW1tY19mcmVlX2hvc3QobW1jKTsKIAkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL3dic2QuaCBiL2RyaXZlcnMvbW1jL3dic2QuaAppbmRleCA2NjFhOWY2Li45MDA1YjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy93YnNkLmgKKysrIGIvZHJpdmVycy9tbWMvd2JzZC5oCkBAIC0xMDYsNiArMTA2LDggQEAKICNkZWZpbmUgV0JTRF9DTEtfMTZNCQkweDAyCiAjZGVmaW5lIFdCU0RfQ0xLXzI0TQkJMHgwMwogCisjZGVmaW5lIFdCU0RfREFUQV9XSURUSAkJMHgwMQorCiAjZGVmaW5lIFdCU0RfREFUM19ICQkweDA4CiAjZGVmaW5lIFdCU0RfRklGT19SRVNFVAkJMHgwNAogI2RlZmluZSBXQlNEX1NPRlRfUkVTRVQJCTB4MDIKQEAgLTE2NCw2ICsxNjYsNyBAQAogCWludAkJCWZpcnN0ZXJyOwkvKiBTZWUgZmlmbyBmdW5jdGlvbnMgKi8KIAkKIAl1OAkJCWNsazsJCS8qIEN1cnJlbnQgY2xvY2sgc3BlZWQgKi8KKwl1bnNpZ25lZCBjaGFyCQlidXNfd2lkdGg7CS8qIEN1cnJlbnQgYnVzIHdpZHRoICovCiAJCiAJaW50CQkJY29uZmlnOwkJLyogQ29uZmlnIHBvcnQgKi8KIAl1OAkJCXVubG9ja19jb2RlOwkvKiBDb2RlIHRvIHVubG9jayBjb25maWcgKi8KQEAgLTE4MSw1ICsxODQsNiBAQAogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlmaW5pc2hfdGFza2xldDsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJYmxvY2tfdGFza2xldDsKIAkKLQlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsJCS8qIENhcmQgZGV0ZWN0aW9uIHRpbWVyICovCisJc3RydWN0IHRpbWVyX2xpc3QJZGV0ZWN0X3RpbWVyOwkvKiBDYXJkIGRldGVjdGlvbiB0aW1lciAqLworCXN0cnVjdCB0aW1lcl9saXN0CWlnbm9yZV90aW1lcjsJLyogSWdub3JlIGRldGVjdGlvbiB0aW1lciAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkcmFtLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL210ZHJhbS5jCmluZGV4IGJiNzEzZmUuLjE0NDMxMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkcmFtLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRyYW0uYwpAQCAtOTEsOCArOTEsNyBAQAogewogCWlmIChtdGRfaW5mbykgewogCQlkZWxfbXRkX2RldmljZShtdGRfaW5mbyk7Ci0JCWlmIChtdGRfaW5mby0+cHJpdikKLQkJCXZmcmVlKG10ZF9pbmZvLT5wcml2KTsKKwkJdmZyZWUobXRkX2luZm8tPnByaXYpOwogCQlrZnJlZShtdGRfaW5mbyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZnRsLmMgYi9kcml2ZXJzL210ZC9mdGwuYwppbmRleCBkOWFiNjBiLi5kMzJjMWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9mdGwuYworKysgYi9kcml2ZXJzL210ZC9mdGwuYwpAQCAtMTAxNywyNyArMTAxNywxNiBAQAogCiB2b2lkIGZ0bF9mcmVlcGFydChwYXJ0aXRpb25fdCAqcGFydCkKIHsKLSAgICBpZiAocGFydC0+VmlydHVhbEJsb2NrTWFwKSB7CiAJdmZyZWUocGFydC0+VmlydHVhbEJsb2NrTWFwKTsKIAlwYXJ0LT5WaXJ0dWFsQmxvY2tNYXAgPSBOVUxMOwotICAgIH0KLSAgICBpZiAocGFydC0+VmlydHVhbFBhZ2VNYXApIHsKIAlrZnJlZShwYXJ0LT5WaXJ0dWFsUGFnZU1hcCk7CiAJcGFydC0+VmlydHVhbFBhZ2VNYXAgPSBOVUxMOwotICAgIH0KLSAgICBpZiAocGFydC0+RVVOSW5mbykgewogCWtmcmVlKHBhcnQtPkVVTkluZm8pOwogCXBhcnQtPkVVTkluZm8gPSBOVUxMOwotICAgIH0KLSAgICBpZiAocGFydC0+WGZlckluZm8pIHsKIAlrZnJlZShwYXJ0LT5YZmVySW5mbyk7CiAJcGFydC0+WGZlckluZm8gPSBOVUxMOwotICAgIH0KLSAgICBpZiAocGFydC0+YmFtX2NhY2hlKSB7CiAJa2ZyZWUocGFydC0+YmFtX2NhY2hlKTsKIAlwYXJ0LT5iYW1fY2FjaGUgPSBOVUxMOwotICAgIH0KLSAgICAKIH0gLyogZnRsX2ZyZWVwYXJ0ICovCiAKIHN0YXRpYyB2b2lkIGZ0bF9hZGRfbXRkKHN0cnVjdCBtdGRfYmxrdHJhbnNfb3BzICp0ciwgc3RydWN0IG10ZF9pbmZvICptdGQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwppbmRleCBlZWU1MTE1Li4wNGU1NDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKQEAgLTUyNiw2ICs1MjYsNyBAQAogCWRvIHsKIAkJaWYgKHRoaXMtPmRldl9yZWFkeShtdGQpKQogCQkJcmV0dXJuOworCQl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiAJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW8pKTsJCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTl4LmMgYi9kcml2ZXJzL25ldC8zYzU5eC5jCmluZGV4IDA3NzQ2YjkuLjQ1NWJhOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzNjNTl4LmMKKysrIGIvZHJpdmVycy9uZXQvM2M1OXguYwpAQCAtOTczLDYgKzk3MywxMSBAQAogCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOwogCQkJdm9ydGV4X2Rvd24oZGV2LCAxKTsKIAkJfQorCQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpLCAwKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtOTgwLDggKzk4NSwxOSBAQAogc3RhdGljIGludCB2b3J0ZXhfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JaWYgKGRldiAmJiBkZXYtPnByaXYpIHsKKwlpZiAoZGV2ICYmIHZwKSB7CisJCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwkJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwkJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCB2cC0+ZnVsbF9idXNfbWFzdGVyX3J4ID8KKwkJCQkmYm9vbWVyYW5nX2ludGVycnVwdCA6ICZ2b3J0ZXhfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IHJlc2VydmUgSVJRICVkXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KIAkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewogCQkJdm9ydGV4X3VwKGRldik7CiAJCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CkBAIC0xODczLDYgKzE4ODksNyBAQAogCQl7CiAJCQlzcGluX2xvY2tfYmgoJnZwLT5sb2NrKTsKIAkJCW1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCB2cC0+cGh5c1swXSwgMSk7CisJCQltaWlfc3RhdHVzID0gbWRpb19yZWFkKGRldiwgdnAtPnBoeXNbMF0sIDEpOwogCQkJb2sgPSAxOwogCQkJaWYgKHZvcnRleF9kZWJ1ZyA+IDIpCiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNSUkgdHJhbnNjZWl2ZXIgaGFzIHN0YXR1cyAlNC40eC5cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCA3OWU4YWE2Li42YmI5MjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTM5Nyw3ICszOTcsNyBAQAogCSAgSWYgeW91J3JlIG5vdCBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSBTdW4gMywgc2F5IE4uCiAKIGNvbmZpZyBTVU4zXzgyNTg2Ci0JdHJpc3RhdGUgIlN1bjMgb24tYm9hcmQgSW50ZWwgODI1ODYgc3VwcG9ydCIKKwlib29sICJTdW4zIG9uLWJvYXJkIEludGVsIDgyNTg2IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgU1VOMwogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIG9uLWJvYXJkIEludGVsIDgyNTg2IGJhc2VkCkBAIC00NDcsNyArNDQ3LDcgQEAKIAogY29uZmlnIFNHSV9JT0MzX0VUSAogCWJvb2wgIlNHSSBJT0MzIEV0aGVybmV0IgotCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFBDSSAmJiBTR0lfSVAyNworCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFBDSSAmJiBTR0lfSVAyNyAmJiBCUk9LRU4KIAlzZWxlY3QgQ1JDMzIKIAlzZWxlY3QgTUlJCiAJaGVscApAQCAtMTkyMyw2ICsxOTIzLDIwIEBACiAJICAKIAkgIElmIGluIGRvdWJ0LCBzYXkgWS4KIAorY29uZmlnIFNJUzE5MAorCXRyaXN0YXRlICJTaVMxOTAvU2lTMTkxIGdpZ2FiaXQgZXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgU2lTIDE5MCBQQ0kgRmFzdCBFdGhlcm5ldCBhZGFwdGVyIG9yCisJICBhIFNpUyAxOTEgUENJIEdpZ2FiaXQgRXRoZXJuZXQgYWRhcHRlci4gQm90aCBhcmUgZXhwZWN0ZWQgdG8KKwkgIGFwcGVhciBpbiBsYW4gb24gbW90aGVyYm9hcmQgZGVzaWducyB3aGljaCBhcmUgYmFzZWQgb24gU2lTIDk2NQorCSAgYW5kIFNpUyA5NjYgc291dGggYnJpZGdlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzaXMxOTAuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCiBjb25maWcgU0tHRQogCXRyaXN0YXRlICJOZXcgU3lzS29ubmVjdCBHaWdhRXRoZXJuZXQgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIFBDSSAmJiBFWFBFUklNRU5UQUwKQEAgLTIwNDQsNiArMjA1OCwxMyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgYm54Mi4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCiAKK2NvbmZpZyBTUElERVJfTkVUCisJdHJpc3RhdGUgIlNwaWRlciBHaWdhYml0IEV0aGVybmV0IGRyaXZlciIKKwlkZXBlbmRzIG9uIFBDSSAmJiBQUENfQlBBCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEdpZ2FiaXQgRXRoZXJuZXQgY2hpcHMgcHJlc2VudCBvbiB0aGUKKwkgIENlbGwgUHJvY2Vzc29yLUJhc2VkIEJsYWRlcyBmcm9tIElCTS4KKwogY29uZmlnIEdJQU5GQVIKIAl0cmlzdGF0ZSAiR2lhbmZhciBFdGhlcm5ldCIKIAlkZXBlbmRzIG9uIDg1eHggfHwgODN4eApAQCAtMjA5Myw2ICsyMTE0LDI1IEBACiBtZW51ICJFdGhlcm5ldCAoMTAwMDAgTWJpdCkiCiAJZGVwZW5kcyBvbiAhVU1MCiAKK2NvbmZpZyBDSEVMU0lPX1QxCisgICAgICAgIHRyaXN0YXRlICJDaGVsc2lvIDEwR2IgRXRoZXJuZXQgc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBQQ0kKKyAgICAgICAgaGVscAorICAgICAgICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIENoZWxzaW8gTjExMCBhbmQgTjIxMCBtb2RlbHMgMTBHYiBFdGhlcm5ldAorICAgICAgICAgIGNhcmRzLiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IGFkYXB0ZXIgZmVhdHVyZXMgYW5kIHBlcmZvcm1hbmNlCisgICAgICAgICAgdHVuaW5nIGlzIGluIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9jeGdiLnR4dD4uCisKKyAgICAgICAgICBGb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBDaGVsc2lvIGFuZCBvdXIgcHJvZHVjdHMsIHZpc2l0CisgICAgICAgICAgb3VyIHdlYnNpdGUgYXQgPGh0dHA6Ly93d3cuY2hlbHNpby5jb20+LgorCisgICAgICAgICAgRm9yIGN1c3RvbWVyIHN1cHBvcnQsIHBsZWFzZSB2aXNpdCBvdXIgY3VzdG9tZXIgc3VwcG9ydCBwYWdlIGF0CisgICAgICAgICAgPGh0dHA6Ly93d3cuY2hlbHNpby5jb20vc3VwcG9ydC5odG0+LgorCisgICAgICAgICAgUGxlYXNlIHNlbmQgZmVlZGJhY2sgdG8gPGxpbnV4LWJ1Z3NAY2hlbHNpby5jb20+LgorCisgICAgICAgICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorICAgICAgICAgIHdpbGwgYmUgY2FsbGVkIGN4Z2IuCisKIGNvbmZpZyBJWEdCCiAJdHJpc3RhdGUgIkludGVsKFIpIFBSTy8xMEdiRSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCmluZGV4IGEzNjlhZTIuLjg2NDVjODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCkBAIC05LDYgKzksNyBAQAogb2JqLSQoQ09ORklHX0UxMDAwKSArPSBlMTAwMC8KIG9iai0kKENPTkZJR19JQk1fRU1BQykgKz0gaWJtX2VtYWMvCiBvYmotJChDT05GSUdfSVhHQikgKz0gaXhnYi8KK29iai0kKENPTkZJR19DSEVMU0lPX1QxKSArPSBjaGVsc2lvLwogb2JqLSQoQ09ORklHX0JPTkRJTkcpICs9IGJvbmRpbmcvCiBvYmotJChDT05GSUdfR0lBTkZBUikgKz0gZ2lhbmZhcl9kcml2ZXIubwogCkBAIC00Miw2ICs0Myw3IEBACiBvYmotJChDT05GSUdfRTEwMCkgKz0gZTEwMC5vCiBvYmotJChDT05GSUdfVExBTikgKz0gdGxhbi5vCiBvYmotJChDT05GSUdfRVBJQzEwMCkgKz0gZXBpYzEwMC5vCitvYmotJChDT05GSUdfU0lTMTkwKSArPSBzaXMxOTAubwogb2JqLSQoQ09ORklHX1NJUzkwMCkgKz0gc2lzOTAwLm8KIG9iai0kKENPTkZJR19ZRUxMT1dGSU4pICs9IHllbGxvd2Zpbi5vCiBvYmotJChDT05GSUdfQUNFTklDKSArPSBhY2VuaWMubwpAQCAtNTIsNiArNTQsOCBAQAogb2JqLSQoQ09ORklHX0ZFQUxOWCkgKz0gZmVhbG54Lm8KIG9iai0kKENPTkZJR19USUdPTjMpICs9IHRnMy5vCiBvYmotJChDT05GSUdfQk5YMikgKz0gYm54Mi5vCitzcGlkZXJuZXQteSArPSBzcGlkZXJfbmV0Lm8gc3BpZGVyX25ldF9ldGh0b29sLm8gc3VuZ2VtX3BoeS5vCitvYmotJChDT05GSUdfU1BJREVSX05FVCkgKz0gc3BpZGVybmV0Lm8KIG9iai0kKENPTkZJR19UQzM1ODE1KSArPSB0YzM1ODE1Lm8KIG9iai0kKENPTkZJR19TS0dFKSArPSBza2dlLm8KIG9iai0kKENPTkZJR19TSzk4TElOKSArPSBzazk4bGluLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYWMzMjAwLmMgYi9kcml2ZXJzL25ldC9hYzMyMDAuYwppbmRleCA5MTc5MWJhLi44YTBhZjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hYzMyMDAuYworKysgYi9kcml2ZXJzL25ldC9hYzMyMDAuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJcmV0dXJuIDA7CiBvdXQyOgogCWlmIChlaV9zdGF0dXMucmVnMCkKLQkJaW91bm1hcCgodm9pZCAqKWRldi0+bWVtX3N0YXJ0KTsKKwkJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKIG91dDE6CiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvYXJjbmV0LmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjbmV0LmMKaW5kZXggNGY5ZjY5ZS4uMTJlZjUyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJjbmV0L2FyY25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9hcmNuZXQuYwpAQCAtNTk3LDcgKzU5Nyw3IEBACiAJc3RydWN0IEFyY1Byb3RvICpwcm90bzsKIAlpbnQgdHhidWY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZnJlZXNrYiA9IDA7CisJaW50IGZyZWVza2IsIHJldHZhbDsKIAogCUJVR01TRyhEX0RVUklORywKIAkgICAgICAgInRyYW5zbWl0IHJlcXVlc3RlZCAoc3RhdHVzPSVYaCwgdHhidWZzPSVkLyVkLCBsZW49JWQsIHByb3RvY29sICV4KVxuIiwKQEAgLTYxNSw3ICs2MTUsNyBAQAogCWlmIChza2ItPmxlbiAtIEFSQ19IRFJfU0laRSA+IFhNVFUgJiYgIXByb3RvLT5jb250aW51ZV90eCkgewogCQlCVUdNU0coRF9OT1JNQUwsICJmaXhtZTogcGFja2V0IHRvbyBsYXJnZTogY29tcGVuc2F0aW5nIGJhZGx5IVxuIik7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIDA7CS8qIGRvbid0IHRyeSBhZ2FpbiAqLworCQlyZXR1cm4gTkVUREVWX1RYX09LOwkvKiBkb24ndCB0cnkgYWdhaW4gKi8KIAl9CiAKIAkvKiBXZSdyZSBidXN5IHRyYW5zbWl0dGluZyBhIHBhY2tldC4uLiAqLwpAQCAtNjIzLDggKzYyMywxMSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CiAJQUlOVE1BU0soMCk7Ci0KLQl0eGJ1ZiA9IGdldF9hcmNidWYoZGV2KTsKKwlpZihscC0+bmV4dF90eCA9PSAtMSkKKwkJdHhidWYgPSBnZXRfYXJjYnVmKGRldik7CisJZWxzZSB7CisJCXR4YnVmID0gLTE7CisJfQogCWlmICh0eGJ1ZiAhPSAtMSkgewogCQlpZiAocHJvdG8tPnByZXBhcmVfdHgoZGV2LCBwa3QsIHNrYi0+bGVuLCB0eGJ1ZikgJiYKIAkJICAgICFwcm90by0+YWNrX3R4KSB7CkBAIC02MzgsNiArNjQxLDggQEAKIAkJCWxwLT5vdXRnb2luZy5za2IgPSBza2I7CiAJCQlscC0+b3V0Z29pbmcucGt0ID0gcGt0OwogCisJCQlmcmVlc2tiID0gMDsKKwogCQkJaWYgKHByb3RvLT5jb250aW51ZV90eCAmJgogCQkJICAgIHByb3RvLT5jb250aW51ZV90eChkZXYsIHR4YnVmKSkgewogCQkJICBCVUdNU0coRF9OT1JNQUwsCkBAIC02NDUsMTAgKzY1MCwxMiBAQAogCQkJCSAiKHByb3RvPSclYycpXG4iLCBwcm90by0+c3VmZml4KTsKIAkJCX0KIAkJfQotCisJCXJldHZhbCA9IE5FVERFVl9UWF9PSzsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJCWxwLT5uZXh0X3R4ID0gdHhidWY7CiAJfSBlbHNlIHsKLQkJZnJlZXNrYiA9IDE7CisJCXJldHZhbCA9IE5FVERFVl9UWF9CVVNZOworCQlmcmVlc2tiID0gMDsKIAl9CiAKIAlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXMsIHN0YXR1czogJXhcbiIsX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fLEFTVEFUVVMoKSk7CkBAIC02NjQsNyArNjcxLDcgQEAKIAlpZiAoZnJlZXNrYikgewogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJfQotCXJldHVybiAwOwkJLyogbm8gbmVlZCB0byB0cnkgYWdhaW4gKi8KKwlyZXR1cm4gcmV0dmFsOwkJLyogbm8gbmVlZCB0byB0cnkgYWdhaW4gKi8KIH0KIAogCkBAIC02OTAsNyArNjk3LDYgQEAKIAkvKiBzdGFydCBzZW5kaW5nICovCiAJQUNPTU1BTkQoVFhjbWQgfCAobHAtPmN1cl90eCA8PCAzKSk7CiAKLQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAlscC0+c3RhdHMudHhfcGFja2V0cysrOwogCWxwLT5sYXN0dHJhbnNfZGVzdCA9IGxwLT5sYXN0bG9hZF9kZXN0OwogCWxwLT5sYXN0bG9hZF9kZXN0ID0gMDsKQEAgLTkxNyw2ICs5MjMsOSBAQAogCiAJCQlCVUdNU0coRF9SRUNPTiwgIk5ldHdvcmsgcmVjb25maWd1cmF0aW9uIGRldGVjdGVkIChzdGF0dXM9JVhoKVxuIiwKIAkJCSAgICAgICBzdGF0dXMpOworCQkJLyogTVlSRUNPTiBiaXQgaXMgYXQgYml0IDcgb2YgZGlhZ3N0YXR1cyAqLworCQkJaWYoZGlhZ3N0YXR1cyAmIDB4ODApCisJCQkJQlVHTVNHKERfUkVDT04sIlB1dCBvdXQgdGhhdCByZWNvbiBteXNlbGZcbiIpOwogCiAJCQkvKiBpcyB0aGUgUkVDT04gaW5mbyBlbXB0eSBvciBvbGQ/ICovCiAJCQlpZiAoIWxwLT5maXJzdF9yZWNvbiB8fCAhbHAtPmxhc3RfcmVjb24gfHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0YXJpX2Jpb25ldC5jIGIvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMKaW5kZXggMTc5OGNlNy4uMDA5NTM4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMKQEAgLTE1NSw3ICsxNTUsNyBAQAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgYmlvbmV0X3RpY2sodW5zaWduZWQgbG9uZyk7CiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBiaW9uZXRfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihiaW9uZXRfdGljaywgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGJpb25ldF90aW1lciwgYmlvbmV0X3RpY2ssIDAsIDApOwogCiAjZGVmaW5lIFNUUkFNX0FERFIoYSkJKCgoYSkgJiAweGZmMDAwMDAwKSA9PSAwKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGFyaV9wYW1zbmV0LmMgYi9kcml2ZXJzL25ldC9hdGFyaV9wYW1zbmV0LmMKaW5kZXggODFjMzYyYy4uOGI5OTc4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRhcmlfcGFtc25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2F0YXJpX3BhbXNuZXQuYwpAQCAtMTY1LDcgKzE2NSw3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBwYW1zbmV0X2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHBhbXNuZXRfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihwYW1zbmV0X3RpY2ssIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihwYW1zbmV0X3RpbWVyLCBwYW1zbmV0X3RpY2ssIDAsIDApOwogCiAjZGVmaW5lIFNUUkFNX0FERFIoYSkJKCgoYSkgJiAweGZmMDAwMDAwKSA9PSAwKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMgYi9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMKaW5kZXggYWQwMTEyMS4uZTAxYjZhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRhcmlsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2F0YXJpbGFuY2UuYwpAQCAtMjM1LDcgKzIzNSw3IEBACiAjZGVmaW5lCU1FTQkJbHAtPm1lbQogI2RlZmluZQlEUkVHCUlPLT5kYXRhCiAjZGVmaW5lCUFSRUcJSU8tPmFkZHIKLSNkZWZpbmUJUkVHQShhKQkoIEFSRUcgPSAoYSksIERSRUcgKQorI2RlZmluZQlSRUdBKGEpCSgqKCBBUkVHID0gKGEpLCAmRFJFRyApKQogCiAvKiBEZWZpbml0aW9ucyBmb3IgcGFja2V0IGJ1ZmZlciBhY2Nlc3M6ICovCiAjZGVmaW5lIFBLVF9CVUZfU1oJCTE1NDQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDIuYyBiL2RyaXZlcnMvbmV0L2JueDIuYwppbmRleCA3YmFiZjZhLi44MzU5OGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyLmMKKysrIGIvZHJpdmVycy9uZXQvYm54Mi5jCkBAIC0xNCw4ICsxNCw4IEBACiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkiYm54MiIKICNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCi0jZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMS4yLjIwIgotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkF1Z3VzdCAyMiwgMjAwNSIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjIuMjEiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiU2VwdGVtYmVyIDcsIDIwMDUiCiAKICNkZWZpbmUgUlVOX0FUKHgpIChqaWZmaWVzICsgKHgpKQogCkBAIC0xNTMzLDYgKzE1MzMsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CiAJc3RydWN0IGJueDIgKmJwID0gZGV2LT5wcml2OwogCisJcHJlZmV0Y2goYnAtPnN0YXR1c19ibGspOwogCVJFR19XUihicCwgQk5YMl9QQ0lDRkdfSU5UX0FDS19DTUQsCiAJCUJOWDJfUENJQ0ZHX0lOVF9BQ0tfQ01EX1VTRV9JTlRfSENfUEFSQU0gfAogCQlCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9NQVNLX0lOVCk7CkBAIC0xNTU4LDcgKzE1NTksNyBAQAogCSAqIFdoZW4gdXNpbmcgTVNJLCB0aGUgTVNJIG1lc3NhZ2Ugd2lsbCBhbHdheXMgY29tcGxldGUgYWZ0ZXIKIAkgKiB0aGUgc3RhdHVzIGJsb2NrIHdyaXRlLgogCSAqLwotCWlmICgoYnAtPnN0YXR1c19ibGstPnN0YXR1c19pZHggPT0gYnAtPmxhc3Rfc3RhdHVzX2lkeCkgfHwKKwlpZiAoKGJwLT5zdGF0dXNfYmxrLT5zdGF0dXNfaWR4ID09IGJwLT5sYXN0X3N0YXR1c19pZHgpICYmCiAJICAgIChSRUdfUkQoYnAsIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTKSAmCiAJICAgICBCTlgyX1BDSUNGR19NSVNDX1NUQVRVU19JTlRBX1ZBTFVFKSkKIAkJcmV0dXJuIElSUV9OT05FOwpAQCAtMjAwNCwxNCArMjAwNSwxNCBAQAogfQogCiBzdGF0aWMgaW50Ci1ibngyX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgYm54MiAqYnAsIGludCBzdGF0ZSkKK2JueDJfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBibngyICpicCwgcGNpX3Bvd2VyX3Qgc3RhdGUpCiB7CiAJdTE2IHBtY3NyOwogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnAtPnBkZXYsIGJwLT5wbV9jYXAgKyBQQ0lfUE1fQ1RSTCwgJnBtY3NyKTsKIAogCXN3aXRjaCAoc3RhdGUpIHsKLQljYXNlIDA6IHsKKwljYXNlIFBDSV9EMDogewogCQl1MzIgdmFsOwogCiAJCXBjaV93cml0ZV9jb25maWdfd29yZChicC0+cGRldiwgYnAtPnBtX2NhcCArIFBDSV9QTV9DVFJMLApAQCAtMjAzMiw3ICsyMDMzLDcgQEAKIAkJUkVHX1dSKGJwLCBCTlgyX1JQTV9DT05GSUcsIHZhbCk7CiAJCWJyZWFrOwogCX0KLQljYXNlIDM6IHsKKwljYXNlIFBDSV9EM2hvdDogewogCQlpbnQgaTsKIAkJdTMyIHZhbCwgd29sX21zZzsKIApAQCAtMzg4Niw3ICszODg3LDcgQEAKIAlzdHJ1Y3QgYm54MiAqYnAgPSBkZXYtPnByaXY7CiAJaW50IHJjOwogCi0JYm54Ml9zZXRfcG93ZXJfc3RhdGUoYnAsIDApOworCWJueDJfc2V0X3Bvd2VyX3N0YXRlKGJwLCBQQ0lfRDApOwogCWJueDJfZGlzYWJsZV9pbnQoYnApOwogCiAJcmMgPSBibngyX2FsbG9jX21lbShicCk7CkBAIC00MTk3LDcgKzQxOTgsNyBAQAogCWJueDJfZnJlZV9tZW0oYnApOwogCWJwLT5saW5rX3VwID0gMDsKIAluZXRpZl9jYXJyaWVyX29mZihicC0+ZGV2KTsKLQlibngyX3NldF9wb3dlcl9zdGF0ZShicCwgMyk7CisJYm54Ml9zZXRfcG93ZXJfc3RhdGUoYnAsIFBDSV9EM2hvdCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUyMDMsNyArNTIwNCw3IEBACiAJCQkgICAgICAgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfUkVHX1dJTkRPV19FTkEgfAogCQkJICAgICAgIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX1RBUkdFVF9NQl9XT1JEX1NXQVApOwogCi0JYm54Ml9zZXRfcG93ZXJfc3RhdGUoYnAsIDApOworCWJueDJfc2V0X3Bvd2VyX3N0YXRlKGJwLCBQQ0lfRDApOwogCiAJYnAtPmNoaXBfaWQgPSBSRUdfUkQoYnAsIEJOWDJfTUlTQ19JRCk7CiAKQEAgLTU0OTUsNyArNTQ5Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWJueDJfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKQorYm54Ml9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgYm54MiAqYnAgPSBkZXYtPnByaXY7CkBAIC01NTEzLDcgKzU1MTQsNyBAQAogCQlyZXNldF9jb2RlID0gQk5YMl9EUlZfTVNHX0NPREVfU1VTUEVORF9OT19XT0w7CiAJYm54Ml9yZXNldF9jaGlwKGJwLCByZXNldF9jb2RlKTsKIAlibngyX2ZyZWVfc2ticyhicCk7Ci0JYm54Ml9zZXRfcG93ZXJfc3RhdGUoYnAsIHN0YXRlKTsKKwlibngyX3NldF9wb3dlcl9zdGF0ZShicCwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC01NTI2LDcgKzU1MjcsNyBAQAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gMDsKIAotCWJueDJfc2V0X3Bvd2VyX3N0YXRlKGJwLCAwKTsKKwlibngyX3NldF9wb3dlcl9zdGF0ZShicCwgUENJX0QwKTsKIAluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CiAJYm54Ml9pbml0X25pYyhicCk7CiAJYm54Ml9uZXRpZl9zdGFydChicCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyLmggYi9kcml2ZXJzL25ldC9ibngyLmgKaW5kZXggOWFkM2Y1Ny4uNjI4NTdiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54Mi5oCisrKyBiL2RyaXZlcnMvbmV0L2JueDIuaApAQCAtNTAsNiArNTAsNyBAQAogI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogCiAvKiBIYXJkd2FyZSBkYXRhIHN0cnVjdHVyZXMgYW5kIHJlZ2lzdGVyIGRlZmluaXRpb25zIGF1dG9tYXRpY2FsbHkKICAqIGdlbmVyYXRlZCBmcm9tIFJUTCBjb2RlLiBEbyBub3QgbW9kaWZ5LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYnNkX2NvbXAuYyBiL2RyaXZlcnMvbmV0L2JzZF9jb21wLmMKaW5kZXggM2Q4OGFkNi4uZmI0MDk4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYnNkX2NvbXAuYworKysgYi9kcml2ZXJzL25ldC9ic2RfY29tcC5jCkBAIC0zMjMsMzMgKzMyMywyNyBAQAogICovCiAKIHN0YXRpYyB2b2lkIGJzZF9mcmVlICh2b2lkICpzdGF0ZSkKLSAgewotICAgIHN0cnVjdCBic2RfZGIgKmRiID0gKHN0cnVjdCBic2RfZGIgKikgc3RhdGU7Cit7CisJc3RydWN0IGJzZF9kYiAqZGIgPSBzdGF0ZTsKICAgICAKLSAgICBpZiAoZGIpCi0gICAgICB7CisJaWYgKCFkYikKKwkJcmV0dXJuOworCiAvKgogICogUmVsZWFzZSB0aGUgZGljdGlvbmFyeQogICovCi0JaWYgKGRiLT5kaWN0KQotCSAgewotCSAgICB2ZnJlZSAoZGItPmRpY3QpOwotCSAgICBkYi0+ZGljdCA9IE5VTEw7Ci0JICB9CisJdmZyZWUoZGItPmRpY3QpOworCWRiLT5kaWN0ID0gTlVMTDsKIC8qCiAgKiBSZWxlYXNlIHRoZSBzdHJpbmcgYnVmZmVyCiAgKi8KLQlpZiAoZGItPmxlbnMpCi0JICB7Ci0JICAgIHZmcmVlIChkYi0+bGVucyk7Ci0JICAgIGRiLT5sZW5zID0gTlVMTDsKLQkgIH0KKwl2ZnJlZShkYi0+bGVucyk7CisJZGItPmxlbnMgPSBOVUxMOwogLyoKICAqIEZpbmFsbHkgcmVsZWFzZSB0aGUgc3RydWN0dXJlIGl0c2VsZi4KICAqLwotCWtmcmVlIChkYik7Ci0gICAgICB9Ci0gIH0KKwlrZnJlZShkYik7Cit9CiAKIC8qCiAgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSAoZGUpIGNvbXByZXNzb3IuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvY2hlbHNpby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWU5Mjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjCisjIENoZWxzaW8gMTBHYiBOSUMgZHJpdmVyIGZvciBMaW51eC4KKyMKKworb2JqLSQoQ09ORklHX0NIRUxTSU9fVDEpICs9IGN4Z2IubworCitFWFRSQV9DRkxBR1MgKz0gLUkkKFRPUERJUikvZHJpdmVycy9uZXQvY2hlbHNpbyAkKERFQlVHX0ZMQUdTKQorCisKK2N4Z2Itb2JqcyA6PSBjeGdiMi5vIGVzcGkubyBwbTMzOTMubyBzZ2UubyBzdWJyLm8gbXY4OHgyMDF4Lm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9jb21tb24uaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzZTdiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY29tbW9uLmgKQEAgLTAsMCArMSwzMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGaWxlOiBjb21tb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICRSZXZpc2lvbjogMS4yMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJERhdGU6IDIwMDUvMDYvMjIgMDA6NDM6MjUgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBwYXJ0IG9mIHRoZSBDaGVsc2lvIDEwR2IgRXRoZXJuZXQgRHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMgICAgICAgKgorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nICAgKgorICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAgICAqCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vd3d3LmNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIC0gMjAwNSBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuICAgICAgICAgICAgICAgICAgICAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTWFpbnRhaW5lcnM6IG1haW50YWluZXJzQGNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEF1dGhvcnM6IERpbWl0cmlvcyBNaWNoYWlsaWRpcyAgIDxkbUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgVGluYSBZYW5nICAgICAgICAgICAgICAgPHRhaW5heUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGZWxpeCBNYXJ0aSAgICAgICAgICAgICA8ZmVsaXhAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIFNjb3R0IEJhcmRvbmUgICAgICAgICAgIDxzYmFyZG9uZUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgS3VydCBPdHRhd2F5ICAgICAgICAgICAgPGtvdHRhd2F5QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGcmFuayBEaU1hbWJybyAgICAgICAgICA8ZnJhbmtAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DWEdCX0NPTU1PTl9IXworI2RlZmluZSBfQ1hHQl9DT01NT05fSF8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorCisjZGVmaW5lIERSVl9ERVNDUklQVElPTiAiQ2hlbHNpbyAxMEdiIEV0aGVybmV0IERyaXZlciIKKyNkZWZpbmUgRFJWX05BTUUgImN4Z2IiCisjZGVmaW5lIERSVl9WRVJTSU9OICIyLjEuMSIKKyNkZWZpbmUgUEZYICAgICAgRFJWX05BTUUgIjogIgorCisjZGVmaW5lIENIX0VSUihmbXQsIC4uLikgICBwcmludGsoS0VSTl9FUlIgUEZYIGZtdCwgIyMgX19WQV9BUkdTX18pCisjZGVmaW5lIENIX1dBUk4oZm10LCAuLi4pICBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCBmbXQsICMjIF9fVkFfQVJHU19fKQorI2RlZmluZSBDSF9BTEVSVChmbXQsIC4uLikgcHJpbnRrKEtFUk5fQUxFUlQgUEZYIGZtdCwgIyMgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgQ0hfREVWSUNFKGRldmlkLCBzc2lkLCBpZHgpIFwKKwl7IFBDSV9WRU5ET1JfSURfQ0hFTFNJTywgZGV2aWQsIFBDSV9BTllfSUQsIHNzaWQsIDAsIDAsIGlkeCB9CisKKyNkZWZpbmUgU1VQUE9SVEVEX1BBVVNFICAgICAgICgxIDw8IDEzKQorI2RlZmluZSBTVVBQT1JURURfTE9PUEJBQ0sgICAgKDEgPDwgMTUpCisKKyNkZWZpbmUgQURWRVJUSVNFRF9QQVVTRSAgICAgICgxIDw8IDEzKQorI2RlZmluZSBBRFZFUlRJU0VEX0FTWU1fUEFVU0UgKDEgPDwgMTQpCisKK3R5cGVkZWYgc3RydWN0IGFkYXB0ZXIgYWRhcHRlcl90OworCit2b2lkIHQxX2VsbWVyMF9leHRfaW50cihhZGFwdGVyX3QgKmFkYXB0ZXIpOwordm9pZCB0MV9saW5rX2NoYW5nZWQoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcG9ydF9pZCwgaW50IGxpbmtfc3RhdHVzLAorCQkJaW50IHNwZWVkLCBpbnQgZHVwbGV4LCBpbnQgZmMpOworCitzdHJ1Y3QgdDFfcnhfbW9kZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1MzIgaWR4OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbGlzdDsKK307CisKKyNkZWZpbmUgdDFfcnhfbW9kZV9wcm9taXNjKHJtKQkocm0tPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKyNkZWZpbmUgdDFfcnhfbW9kZV9hbGxtdWx0aShybSkJKHJtLT5kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorI2RlZmluZSB0MV9yeF9tb2RlX21jX2NudChybSkJKHJtLT5kZXYtPm1jX2NvdW50KQorCitzdGF0aWMgaW5saW5lIHU4ICp0MV9nZXRfbmV4dF9tY2FkZHIoc3RydWN0IHQxX3J4X21vZGUgKnJtKQoreworCXU4ICphZGRyID0gTlVMTDsKKworCWlmIChybS0+aWR4KysgPCBybS0+ZGV2LT5tY19jb3VudCkgeworCQlhZGRyID0gcm0tPmxpc3QtPmRtaV9hZGRyOworCQlybS0+bGlzdCA9IHJtLT5saXN0LT5uZXh0OworCX0KKwlyZXR1cm4gYWRkcjsKK30KKworI2RlZmluZQlNQVhfTlBPUlRTIDQKKworI2RlZmluZSBTUEVFRF9JTlZBTElEIDB4ZmZmZgorI2RlZmluZSBEVVBMRVhfSU5WQUxJRCAweGZmCisKK2VudW0geworCUNIQlRfQk9BUkRfTjExMCwKKwlDSEJUX0JPQVJEX04yMTAKK307CisKK2VudW0geworCUNIQlRfVEVSTV9UMSwKKwlDSEJUX1RFUk1fVDIKK307CisKK2VudW0geworCUNIQlRfTUFDX1BNMzM5MywKK307CisKK2VudW0geworCUNIQlRfUEhZXzg4WDIwMTAsCit9OworCitlbnVtIHsKKwlQQVVTRV9SWCAgICAgID0gMSA8PCAwLAorCVBBVVNFX1RYICAgICAgPSAxIDw8IDEsCisJUEFVU0VfQVVUT05FRyA9IDEgPDwgMgorfTsKKworLyogUmV2aXNpb25zIG9mIFQxIGNoaXAgKi8KK2VudW0geworCVRFUk1fVDFBICAgPSAwLAorCVRFUk1fVDFCICAgPSAxLAorCVRFUk1fVDIgICAgPSAzCit9OworCitzdHJ1Y3Qgc2dlX3BhcmFtcyB7CisJdW5zaWduZWQgaW50IGNtZFFfc2l6ZVsyXTsKKwl1bnNpZ25lZCBpbnQgZnJlZWxRX3NpemVbMl07CisJdW5zaWduZWQgaW50IGxhcmdlX2J1Zl9jYXBhY2l0eTsKKwl1bnNpZ25lZCBpbnQgcnhfY29hbGVzY2VfdXNlY3M7CisJdW5zaWduZWQgaW50IGxhc3RfcnhfY29hbGVzY2VfcmF3OworCXVuc2lnbmVkIGludCBkZWZhdWx0X3J4X2NvYWxlc2NlX3VzZWNzOworCXVuc2lnbmVkIGludCBzYW1wbGVfaW50ZXJ2YWxfdXNlY3M7CisJdW5zaWduZWQgaW50IGNvYWxlc2NlX2VuYWJsZTsKKwl1bnNpZ25lZCBpbnQgcG9sbGluZzsKK307CisKK3N0cnVjdCBjaGVsc2lvX3BjaV9wYXJhbXMgeworCXVuc2lnbmVkIHNob3J0IHNwZWVkOworCXVuc2lnbmVkIGNoYXIgIHdpZHRoOworCXVuc2lnbmVkIGNoYXIgIGlzX3BjaXg7Cit9OworCitzdHJ1Y3QgYWRhcHRlcl9wYXJhbXMgeworCXN0cnVjdCBzZ2VfcGFyYW1zIHNnZTsKKwlzdHJ1Y3QgY2hlbHNpb19wY2lfcGFyYW1zIHBjaTsKKworCWNvbnN0IHN0cnVjdCBib2FyZF9pbmZvICpicmRfaW5mbzsKKworCXVuc2lnbmVkIGludCAgIG5wb3J0czsgICAgICAgICAgLyogIyBvZiBldGhlcm5ldCBwb3J0cyAqLworCXVuc2lnbmVkIGludCAgIHN0YXRzX3VwZGF0ZV9wZXJpb2Q7CisJdW5zaWduZWQgc2hvcnQgY2hpcF9yZXZpc2lvbjsKKwl1bnNpZ25lZCBjaGFyICBjaGlwX3ZlcnNpb247Cit9OworCitzdHJ1Y3QgbGlua19jb25maWcgeworCXVuc2lnbmVkIGludCAgIHN1cHBvcnRlZDsgICAgICAgIC8qIGxpbmsgY2FwYWJpbGl0aWVzICovCisJdW5zaWduZWQgaW50ICAgYWR2ZXJ0aXNpbmc7ICAgICAgLyogYWR2ZXJ0aXNlZCBjYXBhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCByZXF1ZXN0ZWRfc3BlZWQ7ICAvKiBzcGVlZCB1c2VyIGhhcyByZXF1ZXN0ZWQgKi8KKwl1bnNpZ25lZCBzaG9ydCBzcGVlZDsgICAgICAgICAgICAvKiBhY3R1YWwgbGluayBzcGVlZCAqLworCXVuc2lnbmVkIGNoYXIgIHJlcXVlc3RlZF9kdXBsZXg7IC8qIGR1cGxleCB1c2VyIGhhcyByZXF1ZXN0ZWQgKi8KKwl1bnNpZ25lZCBjaGFyICBkdXBsZXg7ICAgICAgICAgICAvKiBhY3R1YWwgbGluayBkdXBsZXggKi8KKwl1bnNpZ25lZCBjaGFyICByZXF1ZXN0ZWRfZmM7ICAgICAvKiBmbG93IGNvbnRyb2wgdXNlciBoYXMgcmVxdWVzdGVkICovCisJdW5zaWduZWQgY2hhciAgZmM7ICAgICAgICAgICAgICAgLyogYWN0dWFsIGxpbmsgZmxvdyBjb250cm9sICovCisJdW5zaWduZWQgY2hhciAgYXV0b25lZzsgICAgICAgICAgLyogYXV0b25lZ290aWF0aW5nPyAqLworfTsKKworc3RydWN0IGNtYWM7CitzdHJ1Y3QgY3BoeTsKKworc3RydWN0IHBvcnRfaW5mbyB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY21hYyAqbWFjOworCXN0cnVjdCBjcGh5ICpwaHk7CisJc3RydWN0IGxpbmtfY29uZmlnIGxpbmtfY29uZmlnOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldHN0YXRzOworfTsKKworc3RydWN0IHNnZTsKK3N0cnVjdCBwZWVzcGk7CisKK3N0cnVjdCBhZGFwdGVyIHsKKwl1OCBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXJlZF9kZXZpY2VfbWFwOworCXVuc2lnbmVkIGxvbmcgb3Blbl9kZXZpY2VfbWFwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljb25zdCBjaGFyICpuYW1lOworCWludCBtc2dfZW5hYmxlOworCXUzMiBtbWlvX2xlbjsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCBleHRfaW50cl9oYW5kbGVyX3Rhc2s7CisJc3RydWN0IGFkYXB0ZXJfcGFyYW1zIHBhcmFtczsKKworCXN0cnVjdCB2bGFuX2dyb3VwICp2bGFuX2dycDsKKworCS8qIFRlcm1pbmF0b3IgbW9kdWxlcy4gKi8KKwlzdHJ1Y3Qgc2dlICAgICpzZ2U7CisJc3RydWN0IHBlZXNwaSAqZXNwaTsKKworCXN0cnVjdCBwb3J0X2luZm8gcG9ydFtNQVhfTlBPUlRTXTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhdHNfdXBkYXRlX3Rhc2s7CisJc3RydWN0IHRpbWVyX2xpc3Qgc3RhdHNfdXBkYXRlX3RpbWVyOworCisJc3RydWN0IHNlbWFwaG9yZSBtaWJfbXV0ZXg7CisJc3BpbmxvY2tfdCB0cGlfbG9jazsKKwlzcGlubG9ja190IHdvcmtfbG9jazsKKwkvKiBndWFyZHMgYXN5bmMgb3BlcmF0aW9ucyAqLworCXNwaW5sb2NrX3QgYXN5bmNfbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJdTMyIHNsb3dfaW50cl9tYXNrOworfTsKKworZW51bSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkYXB0ZXIgZmxhZ3MgKi8KKwlGVUxMX0lOSVRfRE9ORSAgICAgICAgPSAxIDw8IDAsCisJVFNPX0NBUEFCTEUgICAgICAgICAgID0gMSA8PCAyLAorCVRDUF9DU1VNX0NBUEFCTEUgICAgICA9IDEgPDwgMywKKwlVRFBfQ1NVTV9DQVBBQkxFICAgICAgPSAxIDw8IDQsCisJVkxBTl9BQ0NFTF9DQVBBQkxFICAgID0gMSA8PCA1LAorCVJYX0NTVU1fRU5BQkxFRCAgICAgICA9IDEgPDwgNiwKK307CisKK3N0cnVjdCBtZGlvX29wczsKK3N0cnVjdCBnbWFjOworc3RydWN0IGdwaHk7CisKK3N0cnVjdCBib2FyZF9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBib2FyZDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBwb3J0X251bWJlcjsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBjYXBzOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIGNoaXBfdGVybTsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBjaGlwX21hYzsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBjaGlwX3BoeTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBjbG9ja19jb3JlOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIGNsb2NrX21jMzsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBjbG9ja19tYzQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgZXNwaV9ucG9ydHM7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgY2xvY2tfY3NwaTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBjbG9ja19lbG1lcjA7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgbWRpb19tZGllbjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBtZGlvX21kaWludjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBtZGlvX21kYzsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBtZGlvX3BoeWJhc2VhZGRyOworCXN0cnVjdCBnbWFjICAgICAgICAgICAgKmdtYWM7CisJc3RydWN0IGdwaHkgICAgICAgICAgICAqZ3BoeTsKKwlzdHJ1Y3QgbWRpb19vcHMJICAgICAgICptZGlvX29wczsKKwljb25zdCBjaGFyICAgICAgICAgICAgICpkZXNjOworfTsKKworZXh0ZXJuIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHQxX3BjaV90YmxbXTsKKworc3RhdGljIGlubGluZSBpbnQgYWRhcHRlcl9tYXRjaGVzX3R5cGUoY29uc3QgYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICAgICBpbnQgdmVyc2lvbiwgaW50IHJldmlzaW9uKQoreworCXJldHVybiBhZGFwdGVyLT5wYXJhbXMuY2hpcF92ZXJzaW9uID09IHZlcnNpb24gJiYKKwkgICAgICAgYWRhcHRlci0+cGFyYW1zLmNoaXBfcmV2aXNpb24gPT0gcmV2aXNpb247Cit9CisKKyNkZWZpbmUgdDFfaXNfVDFCKGFkYXApIGFkYXB0ZXJfbWF0Y2hlc190eXBlKGFkYXAsIENIQlRfVEVSTV9UMSwgVEVSTV9UMUIpCisjZGVmaW5lIGlzX1QyKGFkYXApICAgICBhZGFwdGVyX21hdGNoZXNfdHlwZShhZGFwLCBDSEJUX1RFUk1fVDIsIFRFUk1fVDIpCisKKy8qIFJldHVybnMgdHJ1ZSBpZiBhbiBhZGFwdGVyIHN1cHBvcnRzIFZMQU4gYWNjZWxlcmF0aW9uIGFuZCBUU08gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZsYW5fdHNvX2NhcGFibGUoY29uc3QgYWRhcHRlcl90ICphZGFwdGVyKQoreworCXJldHVybiAhdDFfaXNfVDFCKGFkYXB0ZXIpOworfQorCisjZGVmaW5lIGZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaXRlcikgXAorCWZvciAoaXRlciA9IDA7IGl0ZXIgPCAoYWRhcHRlciktPnBhcmFtcy5ucG9ydHM7ICsraXRlcikKKworI2RlZmluZSBib2FyZF9pbmZvKGFkYXB0ZXIpICgoYWRhcHRlciktPnBhcmFtcy5icmRfaW5mbykKKyNkZWZpbmUgaXNfMTBHKGFkYXB0ZXIpIChib2FyZF9pbmZvKGFkYXB0ZXIpLT5jYXBzICYgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY29yZV90aWNrc19wZXJfdXNlYyhjb25zdCBhZGFwdGVyX3QgKmFkYXApCit7CisJcmV0dXJuIGJvYXJkX2luZm8oYWRhcCktPmNsb2NrX2NvcmUgLyAxMDAwMDAwOworfQorCitleHRlcm4gaW50IHQxX3RwaV93cml0ZShhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgdmFsdWUpOworZXh0ZXJuIGludCB0MV90cGlfcmVhZChhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgKnZhbHVlKTsKKworZXh0ZXJuIHZvaWQgdDFfaW50ZXJydXB0c19lbmFibGUoYWRhcHRlcl90ICphZGFwdGVyKTsKK2V4dGVybiB2b2lkIHQxX2ludGVycnVwdHNfZGlzYWJsZShhZGFwdGVyX3QgKmFkYXB0ZXIpOworZXh0ZXJuIHZvaWQgdDFfaW50ZXJydXB0c19jbGVhcihhZGFwdGVyX3QgKmFkYXB0ZXIpOworZXh0ZXJuIGludCBlbG1lcjBfZXh0X2ludHJfaGFuZGxlcihhZGFwdGVyX3QgKmFkYXB0ZXIpOworZXh0ZXJuIGludCB0MV9zbG93X2ludHJfaGFuZGxlcihhZGFwdGVyX3QgKmFkYXB0ZXIpOworCitleHRlcm4gaW50IHQxX2xpbmtfc3RhcnQoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGNtYWMgKm1hYywgc3RydWN0IGxpbmtfY29uZmlnICpsYyk7CitleHRlcm4gY29uc3Qgc3RydWN0IGJvYXJkX2luZm8gKnQxX2dldF9ib2FyZF9pbmZvKHVuc2lnbmVkIGludCBib2FyZF9pZCk7CitleHRlcm4gY29uc3Qgc3RydWN0IGJvYXJkX2luZm8gKnQxX2dldF9ib2FyZF9pbmZvX2Zyb21faWRzKHVuc2lnbmVkIGludCBkZXZpZCwKKwkJCQkJCSAgICB1bnNpZ25lZCBzaG9ydCBzc2lkKTsKK2V4dGVybiBpbnQgdDFfc2VlcHJvbV9yZWFkKGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiAqZGF0YSk7CitleHRlcm4gaW50IHQxX2dldF9ib2FyZF9yZXYoYWRhcHRlcl90ICphZGFwdGVyLCBjb25zdCBzdHJ1Y3QgYm9hcmRfaW5mbyAqYmksCisJCSAgICAgc3RydWN0IGFkYXB0ZXJfcGFyYW1zICpwKTsKK2V4dGVybiBpbnQgdDFfaW5pdF9od19tb2R1bGVzKGFkYXB0ZXJfdCAqYWRhcHRlcik7CitleHRlcm4gaW50IHQxX2luaXRfc3dfbW9kdWxlcyhhZGFwdGVyX3QgKmFkYXB0ZXIsIGNvbnN0IHN0cnVjdCBib2FyZF9pbmZvICpiaSk7CitleHRlcm4gdm9pZCB0MV9mcmVlX3N3X21vZHVsZXMoYWRhcHRlcl90ICphZGFwdGVyKTsKK2V4dGVybiB2b2lkIHQxX2ZhdGFsX2VycihhZGFwdGVyX3QgKmFkYXB0ZXIpOworCitleHRlcm4gdm9pZCB0MV90cF9zZXRfdWRwX2NoZWNrc3VtX29mZmxvYWQoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgZW5hYmxlKTsKK2V4dGVybiB2b2lkIHQxX3RwX3NldF90Y3BfY2hlY2tzdW1fb2ZmbG9hZChhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBlbmFibGUpOworZXh0ZXJuIHZvaWQgdDFfdHBfc2V0X2lwX2NoZWNrc3VtX29mZmxvYWQoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgZW5hYmxlKTsKKworI2VuZGlmIC8qIF9DWEdCX0NPTU1PTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9jcGh5LmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL2NwaHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDEyMzQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jcGh5LmgKQEAgLTAsMCArMSwxNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGaWxlOiBjcGh5LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICRSZXZpc2lvbjogMS43ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJERhdGU6IDIwMDUvMDYvMjEgMTg6Mjk6NDcgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBwYXJ0IG9mIHRoZSBDaGVsc2lvIDEwR2IgRXRoZXJuZXQgRHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMgICAgICAgKgorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nICAgKgorICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAgICAqCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vd3d3LmNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIC0gMjAwNSBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuICAgICAgICAgICAgICAgICAgICAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTWFpbnRhaW5lcnM6IG1haW50YWluZXJzQGNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEF1dGhvcnM6IERpbWl0cmlvcyBNaWNoYWlsaWRpcyAgIDxkbUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgVGluYSBZYW5nICAgICAgICAgICAgICAgPHRhaW5heUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGZWxpeCBNYXJ0aSAgICAgICAgICAgICA8ZmVsaXhAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIFNjb3R0IEJhcmRvbmUgICAgICAgICAgIDxzYmFyZG9uZUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgS3VydCBPdHRhd2F5ICAgICAgICAgICAgPGtvdHRhd2F5QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGcmFuayBEaU1hbWJybyAgICAgICAgICA8ZnJhbmtAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DWEdCX0NQSFlfSF8KKyNkZWZpbmUgX0NYR0JfQ1BIWV9IXworCisjaW5jbHVkZSAiY29tbW9uLmgiCisKK3N0cnVjdCBtZGlvX29wcyB7CisJdm9pZCAoKmluaXQpKGFkYXB0ZXJfdCAqYWRhcHRlciwgY29uc3Qgc3RydWN0IGJvYXJkX2luZm8gKmJpKTsKKwlpbnQgICgqcmVhZCkoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsIGludCBtbWRfYWRkciwKKwkJICAgICBpbnQgcmVnX2FkZHIsIHVuc2lnbmVkIGludCAqdmFsKTsKKwlpbnQgICgqd3JpdGUpKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHBoeV9hZGRyLCBpbnQgbW1kX2FkZHIsCisJCSAgICAgIGludCByZWdfYWRkciwgdW5zaWduZWQgaW50IHZhbCk7Cit9OworCisvKiBQSFkgaW50ZXJydXB0IHR5cGVzICovCitlbnVtIHsKKwljcGh5X2NhdXNlX2xpbmtfY2hhbmdlID0gMHgxLAorCWNwaHlfY2F1c2VfZXJyb3IgPSAweDIKK307CisKK3N0cnVjdCBjcGh5OworCisvKiBQSFkgb3BlcmF0aW9ucyAqLworc3RydWN0IGNwaHlfb3BzIHsKKwl2b2lkICgqZGVzdHJveSkoc3RydWN0IGNwaHkgKik7CisJaW50ICgqcmVzZXQpKHN0cnVjdCBjcGh5ICosIGludCB3YWl0KTsKKworCWludCAoKmludGVycnVwdF9lbmFibGUpKHN0cnVjdCBjcGh5ICopOworCWludCAoKmludGVycnVwdF9kaXNhYmxlKShzdHJ1Y3QgY3BoeSAqKTsKKwlpbnQgKCppbnRlcnJ1cHRfY2xlYXIpKHN0cnVjdCBjcGh5ICopOworCWludCAoKmludGVycnVwdF9oYW5kbGVyKShzdHJ1Y3QgY3BoeSAqKTsKKworCWludCAoKmF1dG9uZWdfZW5hYmxlKShzdHJ1Y3QgY3BoeSAqKTsKKwlpbnQgKCphdXRvbmVnX2Rpc2FibGUpKHN0cnVjdCBjcGh5ICopOworCWludCAoKmF1dG9uZWdfcmVzdGFydCkoc3RydWN0IGNwaHkgKik7CisKKwlpbnQgKCphZHZlcnRpc2UpKHN0cnVjdCBjcGh5ICpwaHksIHVuc2lnbmVkIGludCBhZHZlcnRpc2VfbWFwKTsKKwlpbnQgKCpzZXRfbG9vcGJhY2spKHN0cnVjdCBjcGh5ICosIGludCBvbik7CisJaW50ICgqc2V0X3NwZWVkX2R1cGxleCkoc3RydWN0IGNwaHkgKnBoeSwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KTsKKwlpbnQgKCpnZXRfbGlua19zdGF0dXMpKHN0cnVjdCBjcGh5ICpwaHksIGludCAqbGlua19vaywgaW50ICpzcGVlZCwKKwkJCSAgICAgICBpbnQgKmR1cGxleCwgaW50ICpmYyk7Cit9OworCisvKiBBIFBIWSBpbnN0YW5jZSAqLworc3RydWN0IGNwaHkgeworCWludCBhZGRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSFkgYWRkcmVzcyAqLworCWFkYXB0ZXJfdCAqYWRhcHRlcjsgICAgICAgICAgICAgICAgICAvKiBhc3NvY2lhdGVkIGFkYXB0ZXIgKi8KKwlzdHJ1Y3QgY3BoeV9vcHMgKm9wczsgICAgICAgICAgICAgICAgLyogUEhZIG9wZXJhdGlvbnMgKi8KKwlpbnQgKCptZGlvX3JlYWQpKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHBoeV9hZGRyLCBpbnQgbW1kX2FkZHIsCisJCQkgaW50IHJlZ19hZGRyLCB1bnNpZ25lZCBpbnQgKnZhbCk7CisJaW50ICgqbWRpb193cml0ZSkoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsIGludCBtbWRfYWRkciwKKwkJCSAgaW50IHJlZ19hZGRyLCB1bnNpZ25lZCBpbnQgdmFsKTsKKwlzdHJ1Y3QgY3BoeV9pbnN0YW5jZSAqaW5zdGFuY2U7Cit9OworCisvKiBDb252ZW5pZW5jZSBNRElPIHJlYWQvd3JpdGUgd3JhcHBlcnMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG1kaW9fcmVhZChzdHJ1Y3QgY3BoeSAqY3BoeSwgaW50IG1tZCwgaW50IHJlZywKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnZhbHApCit7CisJcmV0dXJuIGNwaHktPm1kaW9fcmVhZChjcGh5LT5hZGFwdGVyLCBjcGh5LT5hZGRyLCBtbWQsIHJlZywgdmFscCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1kaW9fd3JpdGUoc3RydWN0IGNwaHkgKmNwaHksIGludCBtbWQsIGludCByZWcsCisJCQkgICAgIHVuc2lnbmVkIGludCB2YWwpCit7CisJcmV0dXJuIGNwaHktPm1kaW9fd3JpdGUoY3BoeS0+YWRhcHRlciwgY3BoeS0+YWRkciwgbW1kLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNpbXBsZV9tZGlvX3JlYWQoc3RydWN0IGNwaHkgKmNwaHksIGludCByZWcsCisJCQkJICAgdW5zaWduZWQgaW50ICp2YWxwKQoreworCXJldHVybiBtZGlvX3JlYWQoY3BoeSwgMCwgcmVnLCB2YWxwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2ltcGxlX21kaW9fd3JpdGUoc3RydWN0IGNwaHkgKmNwaHksIGludCByZWcsCisJCQkJICAgIHVuc2lnbmVkIGludCB2YWwpCit7CisJcmV0dXJuIG1kaW9fd3JpdGUoY3BoeSwgMCwgcmVnLCB2YWwpOworfQorCisvKiBDb252ZW5pZW5jZSBpbml0aWFsaXplciAqLworc3RhdGljIGlubGluZSB2b2lkIGNwaHlfaW5pdChzdHJ1Y3QgY3BoeSAqcGh5LCBhZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICAgIGludCBwaHlfYWRkciwgc3RydWN0IGNwaHlfb3BzICpwaHlfb3BzLAorCQkJICAgICBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQoreworCXBoeS0+YWRhcHRlciA9IGFkYXB0ZXI7CisJcGh5LT5hZGRyICAgID0gcGh5X2FkZHI7CisJcGh5LT5vcHMgICAgID0gcGh5X29wczsKKwlpZiAobWRpb19vcHMpIHsKKwkJcGh5LT5tZGlvX3JlYWQgID0gbWRpb19vcHMtPnJlYWQ7CisJCXBoeS0+bWRpb193cml0ZSA9IG1kaW9fb3BzLT53cml0ZTsKKwl9Cit9CisKKy8qIE9wZXJhdGlvbnMgb2YgdGhlIFBIWS1pbnN0YW5jZSBmYWN0b3J5ICovCitzdHJ1Y3QgZ3BoeSB7CisJLyogQ29uc3RydWN0IGEgUEhZIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIFBIWSBhZGRyZXNzICovCisJc3RydWN0IGNwaHkgKigqY3JlYXRlKShhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwKKwkJCSAgICAgICBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKTsKKworCS8qCisJICogUmVzZXQgdGhlIFBIWSBjaGlwLiAgVGhpcyByZXNldHMgdGhlIHdob2xlIFBIWSBjaGlwLCBub3QgaW5kaXZpZHVhbAorCSAqIHBvcnRzLgorCSAqLworCWludCAoKnJlc2V0KShhZGFwdGVyX3QgKmFkYXB0ZXIpOworfTsKKworZXh0ZXJuIHN0cnVjdCBncGh5IHQxX212ODh4MjAxeF9vcHM7CitleHRlcm4gc3RydWN0IGdwaHkgdDFfZHVtbXlfcGh5X29wczsKKworI2VuZGlmIC8qIF9DWEdCX0NQSFlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3BsNV9jbWQuaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3BsNV9jbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzkyNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jcGw1X2NtZC5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRmlsZTogY3BsNV9jbWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAkUmV2aXNpb246IDEuNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICREYXRlOiAyMDA1LzA2LzIxIDE4OjI5OjQ3ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgcGFydCBvZiB0aGUgQ2hlbHNpbyAxMEdiIEV0aGVybmV0IERyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzICAgICAgICoKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyAgICoKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgICAgKgorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogaHR0cDovL3d3dy5jaGVsc2lvLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyAtIDIwMDUgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiAgICAgICAgICAgICAgICAgICAgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIE1haW50YWluZXJzOiBtYWludGFpbmVyc0BjaGVsc2lvLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBBdXRob3JzOiBEaW1pdHJpb3MgTWljaGFpbGlkaXMgICA8ZG1AY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIFRpbmEgWWFuZyAgICAgICAgICAgICAgIDx0YWluYXlAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgRmVsaXggTWFydGkgICAgICAgICAgICAgPGZlbGl4QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBTY290dCBCYXJkb25lICAgICAgICAgICA8c2JhcmRvbmVAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIEt1cnQgT3R0YXdheSAgICAgICAgICAgIDxrb3R0YXdheUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgRnJhbmsgRGlNYW1icm8gICAgICAgICAgPGZyYW5rQGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQ1hHQl9DUEw1X0NNRF9IXworI2RlZmluZSBfQ1hHQl9DUEw1X0NNRF9IXworCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaWYgIWRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKSAmJiAhZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisjZXJyb3IgIkFkanVzdCB5b3VyIDxhc20vYnl0ZW9yZGVyLmg+IGRlZmluZXMiCisjZW5kaWYKKworZW51bSBDUExfb3Bjb2RlIHsKKwlDUExfUlhfUEtUICAgICAgICAgICAgPSAweEFELAorCUNQTF9UWF9QS1QgICAgICAgICAgICA9IDB4QjIsCisJQ1BMX1RYX1BLVF9MU08gICAgICAgID0gMHhCNiwKK307CisKK2VudW0geyAgICAgICAgICAgICAgICAvKiBUWF9QS1RfTFNPIGV0aGVybmV0IHR5cGVzICovCisJQ1BMX0VUSF9JSSwKKwlDUExfRVRIX0lJX1ZMQU4sCisJQ1BMX0VUSF84MDJfMywKKwlDUExfRVRIXzgwMl8zX1ZMQU4KK307CisKK3N0cnVjdCBjcGxfcnhfZGF0YSB7CisJdTMyIHJzdmQwOworCXUzMiBsZW47CisJdTMyIHNlcTsKKwl1MTYgdXJnOworCXU4ICByc3ZkMTsKKwl1OCAgc3RhdHVzOworfTsKKworLyoKKyAqIFdlIHdhbnQgdGhpcyBoZWFkZXIncyBhbGlnbm1lbnQgdG8gYmUgbm8gbW9yZSBzdHJpbmdlbnQgdGhhbiAyLWJ5dGUgYWxpZ25lZC4KKyAqIEFsbCBmaWVsZHMgYXJlIHU4IG9yIHUxNiBleGNlcHQgZm9yIHRoZSBsZW5ndGguICBIb3dldmVyIHRoYXQgZmllbGQgaXMgbm90CisgKiB1c2VkIHNvIHdlIGJyZWFrIGl0IGludG8gMiAxNi1iaXQgcGFydHMgdG8gZWFzaWx5IG1lZXQgb3VyIGFsaWdubWVudCBuZWVkcy4KKyAqLworc3RydWN0IGNwbF90eF9wa3QgeworCXU4IG9wY29kZTsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwl1OCBpZmY6NDsKKwl1OCBpcF9jc3VtX2RpczoxOworCXU4IGw0X2NzdW1fZGlzOjE7CisJdTggdmxhbl92YWxpZDoxOworCXU4IHJzdmQ6MTsKKyNlbHNlCisJdTggcnN2ZDoxOworCXU4IHZsYW5fdmFsaWQ6MTsKKwl1OCBsNF9jc3VtX2RpczoxOworCXU4IGlwX2NzdW1fZGlzOjE7CisJdTggaWZmOjQ7CisjZW5kaWYKKwl1MTYgdmxhbjsKKwl1MTYgbGVuX2hpOworCXUxNiBsZW5fbG87Cit9OworCitzdHJ1Y3QgY3BsX3R4X3BrdF9sc28geworCXU4IG9wY29kZTsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwl1OCBpZmY6NDsKKwl1OCBpcF9jc3VtX2RpczoxOworCXU4IGw0X2NzdW1fZGlzOjE7CisJdTggdmxhbl92YWxpZDoxOworCXU4IHJzdmQ6MTsKKyNlbHNlCisJdTggcnN2ZDoxOworCXU4IHZsYW5fdmFsaWQ6MTsKKwl1OCBsNF9jc3VtX2RpczoxOworCXU4IGlwX2NzdW1fZGlzOjE7CisJdTggaWZmOjQ7CisjZW5kaWYKKwl1MTYgdmxhbjsKKwl1MzIgbGVuOworCisJdTMyIHJzdmQyOworCXU4IHJzdmQzOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXU4IHRjcF9oZHJfd29yZHM6NDsKKwl1OCBpcF9oZHJfd29yZHM6NDsKKyNlbHNlCisJdTggaXBfaGRyX3dvcmRzOjQ7CisJdTggdGNwX2hkcl93b3Jkczo0OworI2VuZGlmCisJdTE2IGV0aF90eXBlX21zczsKK307CisKK3N0cnVjdCBjcGxfcnhfcGt0IHsKKwl1OCBvcGNvZGU7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdTggaWZmOjQ7CisJdTggY3N1bV92YWxpZDoxOworCXU4IGJhZF9wa3Q6MTsKKwl1OCB2bGFuX3ZhbGlkOjE7CisJdTggcnN2ZDoxOworI2Vsc2UKKwl1OCByc3ZkOjE7CisJdTggdmxhbl92YWxpZDoxOworCXU4IGJhZF9wa3Q6MTsKKwl1OCBjc3VtX3ZhbGlkOjE7CisJdTggaWZmOjQ7CisjZW5kaWYKKwl1MTYgY3N1bTsKKwl1MTYgdmxhbjsKKwl1MTYgbGVuOworfTsKKworI2VuZGlmIC8qIF9DWEdCX0NQTDVfQ01EX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL2N4Z2IyLmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2N4Z2IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5ZWJlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3hnYjIuYwpAQCAtMCwwICsxLDEyNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGaWxlOiBjeGdiMi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICRSZXZpc2lvbjogMS4yNSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJERhdGU6IDIwMDUvMDYvMjIgMDA6NDM6MjUgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBDaGVsc2lvIDEwR2IgRXRoZXJuZXQgRHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMgICAgICAgKgorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nICAgKgorICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAgICAqCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vd3d3LmNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIC0gMjAwNSBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuICAgICAgICAgICAgICAgICAgICAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTWFpbnRhaW5lcnM6IG1haW50YWluZXJzQGNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEF1dGhvcnM6IERpbWl0cmlvcyBNaWNoYWlsaWRpcyAgIDxkbUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgVGluYSBZYW5nICAgICAgICAgICAgICAgPHRhaW5heUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGZWxpeCBNYXJ0aSAgICAgICAgICAgICA8ZmVsaXhAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIFNjb3R0IEJhcmRvbmUgICAgICAgICAgIDxzYmFyZG9uZUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgS3VydCBPdHRhd2F5ICAgICAgICAgICAgPGtvdHRhd2F5QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGcmFuayBEaU1hbWJybyAgICAgICAgICA8ZnJhbmtAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiY3BsNV9jbWQuaCIKKyNpbmNsdWRlICJyZWdzLmgiCisjaW5jbHVkZSAiZ21hYy5oIgorI2luY2x1ZGUgImNwaHkuaCIKKyNpbmNsdWRlICJzZ2UuaCIKKyNpbmNsdWRlICJlc3BpLmgiCisKKyNpZmRlZiB3b3JrX3N0cnVjdAorI2luY2x1ZGUgPGxpbnV4L3RxdWV1ZS5oPgorI2RlZmluZSBJTklUX1dPUksgSU5JVF9UUVVFVUUKKyNkZWZpbmUgc2NoZWR1bGVfd29yayBzY2hlZHVsZV90YXNrCisjZGVmaW5lIGZsdXNoX3NjaGVkdWxlZF93b3JrIGZsdXNoX3NjaGVkdWxlZF90YXNrcworCitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWR1bGVfbWFjX3N0YXRzX3VwZGF0ZShzdHJ1Y3QgYWRhcHRlciAqYXAsIGludCBzZWNzKQoreworCW1vZF90aW1lcigmYXAtPnN0YXRzX3VwZGF0ZV90aW1lciwgamlmZmllcyArIHNlY3MgKiBIWik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYW5jZWxfbWFjX3N0YXRzX3VwZGF0ZShzdHJ1Y3QgYWRhcHRlciAqYXApCit7CisJZGVsX3RpbWVyX3N5bmMoJmFwLT5zdGF0c191cGRhdGVfdGltZXIpOworCWZsdXNoX3NjaGVkdWxlZF90YXNrcygpOworfQorCisvKgorICogU3RhdHMgdXBkYXRlIHRpbWVyIGZvciAyLjQuICBJdCBzY2hlZHVsZXMgYSB0YXNrIHRvIGRvIHRoZSBhY3R1YWwgdXBkYXRlIGFzCisgKiB3ZSBuZWVkIHRvIGFjY2VzcyBNQUMgc3RhdGlzdGljcyBpbiBwcm9jZXNzIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkIG1hY19zdGF0c190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFwID0gKHN0cnVjdCBhZGFwdGVyICopZGF0YTsKKworCXNjaGVkdWxlX3Rhc2soJmFwLT5zdGF0c191cGRhdGVfdGFzayk7Cit9CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWR1bGVfbWFjX3N0YXRzX3VwZGF0ZShzdHJ1Y3QgYWRhcHRlciAqYXAsIGludCBzZWNzKQoreworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYXAtPnN0YXRzX3VwZGF0ZV90YXNrLCBzZWNzICogSFopOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2FuY2VsX21hY19zdGF0c191cGRhdGUoc3RydWN0IGFkYXB0ZXIgKmFwKQoreworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFwLT5zdGF0c191cGRhdGVfdGFzayk7Cit9CisjZW5kaWYKKworI2RlZmluZSBNQVhfQ01EUV9FTlRSSUVTIDE2Mzg0CisjZGVmaW5lIE1BWF9DTURRMV9FTlRSSUVTIDEwMjQKKyNkZWZpbmUgTUFYX1JYX0JVRkZFUlMgMTYzODQKKyNkZWZpbmUgTUFYX1JYX0pVTUJPX0JVRkZFUlMgMTYzODQKKyNkZWZpbmUgTUFYX1RYX0JVRkZFUlNfSElHSAkxNjM4NFUKKyNkZWZpbmUgTUFYX1RYX0JVRkZFUlNfTE9XCTE1MzZVCisjZGVmaW5lIE1JTl9GTF9FTlRSSUVTIDMyCisKKyNkZWZpbmUgUE9SVF9NQVNLICgoMSA8PCBNQVhfTlBPUlRTKSAtIDEpCisKKyNkZWZpbmUgREZMVF9NU0dfRU5BQkxFIChORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0xJTksgfCBcCisJCQkgTkVUSUZfTVNHX1RJTUVSIHwgTkVUSUZfTVNHX0lGRE9XTiB8IE5FVElGX01TR19JRlVQIHxcCisJCQkgTkVUSUZfTVNHX1JYX0VSUiB8IE5FVElGX01TR19UWF9FUlIpCisKKy8qCisgKiBUaGUgRUVQUk9NIGlzIGFjdHVhbGx5IGJpZ2dlciBidXQgb25seSB0aGUgZmlyc3QgZmV3IGJ5dGVzIGFyZSB1c2VkIHNvIHdlCisgKiBvbmx5IHJlcG9ydCB0aG9zZS4KKyAqLworI2RlZmluZSBFRVBST01fU0laRSAzMgorCitNT0RVTEVfREVTQ1JJUFRJT04oRFJWX0RFU0NSSVBUSU9OKTsKK01PRFVMRV9BVVRIT1IoIkNoZWxzaW8gQ29tbXVuaWNhdGlvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBkZmx0X21zZ19lbmFibGUgPSBERkxUX01TR19FTkFCTEU7CisKK01PRFVMRV9QQVJNKGRmbHRfbXNnX2VuYWJsZSwgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGZsdF9tc2dfZW5hYmxlLCAiQ2hlbHNpbyBUMSBtZXNzYWdlIGVuYWJsZSBiaXRtYXAiKTsKKworCitzdGF0aWMgY29uc3QgY2hhciBwY2lfc3BlZWRbXVs0XSA9IHsKKwkiMzMiLCAiNjYiLCAiMTAwIiwgIjEzMyIKK307CisKKy8qCisgKiBTZXR1cCBNQUMgdG8gcmVjZWl2ZSB0aGUgdHlwZXMgb2YgcGFja2V0cyB3ZSB3YW50LgorICovCitzdGF0aWMgdm9pZCB0MV9zZXRfcnhtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJc3RydWN0IGNtYWMgKm1hYyA9IGFkYXB0ZXItPnBvcnRbZGV2LT5pZl9wb3J0XS5tYWM7CisJc3RydWN0IHQxX3J4X21vZGUgcm07CisKKwlybS5kZXYgPSBkZXY7CisJcm0uaWR4ID0gMDsKKwlybS5saXN0ID0gZGV2LT5tY19saXN0OworCW1hYy0+b3BzLT5zZXRfcnhfbW9kZShtYWMsICZybSk7Cit9CisKK3N0YXRpYyB2b2lkIGxpbmtfcmVwb3J0KHN0cnVjdCBwb3J0X2luZm8gKnApCit7CisJaWYgKCFuZXRpZl9jYXJyaWVyX29rKHAtPmRldikpCisgICAgICAgIAlwcmludGsoS0VSTl9JTkZPICIlczogbGluayBkb3duXG4iLCBwLT5kZXYtPm5hbWUpOworCWVsc2UgeworCQljb25zdCBjaGFyICpzID0gIjEwTWJwcyI7CisKKwkJc3dpdGNoIChwLT5saW5rX2NvbmZpZy5zcGVlZCkgeworCQkJY2FzZSBTUEVFRF8xMDAwMDogcyA9ICIxMEdicHMiOyBicmVhazsKKwkJCWNhc2UgU1BFRURfMTAwMDogIHMgPSAiMTAwME1icHMiOyBicmVhazsKKwkJCWNhc2UgU1BFRURfMTAwOiAgIHMgPSAiMTAwTWJwcyI7IGJyZWFrOworCQl9CisKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdXAsICVzLCAlcy1kdXBsZXhcbiIsCisJCSAgICAgICBwLT5kZXYtPm5hbWUsIHMsCisJCSAgICAgICBwLT5saW5rX2NvbmZpZy5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgPyAiZnVsbCIgOiAiaGFsZiIpOworCX0KK30KKwordm9pZCB0MV9saW5rX2NoYW5nZWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0X2lkLCBpbnQgbGlua19zdGF0LAorCQkJaW50IHNwZWVkLCBpbnQgZHVwbGV4LCBpbnQgcGF1c2UpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcCA9ICZhZGFwdGVyLT5wb3J0W3BvcnRfaWRdOworCisJaWYgKGxpbmtfc3RhdCAhPSBuZXRpZl9jYXJyaWVyX29rKHAtPmRldikpIHsKKwkJaWYgKGxpbmtfc3RhdCkKKwkJCW5ldGlmX2NhcnJpZXJfb24ocC0+ZGV2KTsKKwkJZWxzZQorCQkJbmV0aWZfY2Fycmllcl9vZmYocC0+ZGV2KTsKKwkJbGlua19yZXBvcnQocCk7CisKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxpbmtfc3RhcnQoc3RydWN0IHBvcnRfaW5mbyAqcCkKK3sKKwlzdHJ1Y3QgY21hYyAqbWFjID0gcC0+bWFjOworCisJbWFjLT5vcHMtPnJlc2V0KG1hYyk7CisJaWYgKG1hYy0+b3BzLT5tYWNhZGRyZXNzX3NldCkKKwkJbWFjLT5vcHMtPm1hY2FkZHJlc3Nfc2V0KG1hYywgcC0+ZGV2LT5kZXZfYWRkcik7CisJdDFfc2V0X3J4bW9kZShwLT5kZXYpOworCXQxX2xpbmtfc3RhcnQocC0+cGh5LCBtYWMsICZwLT5saW5rX2NvbmZpZyk7CisJbWFjLT5vcHMtPmVuYWJsZShtYWMsIE1BQ19ESVJFQ1RJT05fUlggfCBNQUNfRElSRUNUSU9OX1RYKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2h3X2NzdW0oc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKGFkYXB0ZXItPmZsYWdzICYgVFNPX0NBUEFCTEUpCisJCXQxX3RwX3NldF9pcF9jaGVja3N1bV9vZmZsb2FkKGFkYXB0ZXIsIDEpOyAvKiBmb3IgVFNPIG9ubHkgKi8KKwl0MV90cF9zZXRfdGNwX2NoZWNrc3VtX29mZmxvYWQoYWRhcHRlciwgMSk7Cit9CisKKy8qCisgKiBUaGluZ3MgdG8gZG8gdXBvbiBmaXJzdCB1c2Ugb2YgYSBjYXJkLgorICogVGhpcyBtdXN0IHJ1biB3aXRoIHRoZSBydG5sIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBjeGdiX3VwKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCWludCBlcnIgPSAwOworCisJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkpIHsKKwkJZXJyID0gdDFfaW5pdF9od19tb2R1bGVzKGFkYXB0ZXIpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZXJyOworCisJCWVuYWJsZV9od19jc3VtKGFkYXB0ZXIpOworCQlhZGFwdGVyLT5mbGFncyB8PSBGVUxMX0lOSVRfRE9ORTsKKwl9CisKKwl0MV9pbnRlcnJ1cHRzX2NsZWFyKGFkYXB0ZXIpOworCWlmICgoZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+cGRldi0+aXJxLAorCQkJICAgICAgIHQxX3NlbGVjdF9pbnRyX2hhbmRsZXIoYWRhcHRlciksIFNBX1NISVJRLAorCQkJICAgICAgIGFkYXB0ZXItPm5hbWUsIGFkYXB0ZXIpKSkgeworCQlnb3RvIG91dF9lcnI7CisJfQorCXQxX3NnZV9zdGFydChhZGFwdGVyLT5zZ2UpOworCXQxX2ludGVycnVwdHNfZW5hYmxlKGFkYXB0ZXIpOworIG91dF9lcnI6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFJlbGVhc2UgcmVzb3VyY2VzIHdoZW4gYWxsIHRoZSBwb3J0cyBoYXZlIGJlZW4gc3RvcHBlZC4KKyAqLworc3RhdGljIHZvaWQgY3hnYl9kb3duKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXQxX3NnZV9zdG9wKGFkYXB0ZXItPnNnZSk7CisJdDFfaW50ZXJydXB0c19kaXNhYmxlKGFkYXB0ZXIpOworCWZyZWVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgYWRhcHRlcik7Cit9CisKK3N0YXRpYyBpbnQgY3hnYl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlpbnQgb3RoZXJfcG9ydHMgPSBhZGFwdGVyLT5vcGVuX2RldmljZV9tYXAgJiBQT1JUX01BU0s7CisKKwlpZiAoIWFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCAmJiAoZXJyID0gY3hnYl91cChhZGFwdGVyKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJX19zZXRfYml0KGRldi0+aWZfcG9ydCwgJmFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCk7CisJbGlua19zdGFydCgmYWRhcHRlci0+cG9ydFtkZXYtPmlmX3BvcnRdKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWlmICghb3RoZXJfcG9ydHMgJiYgYWRhcHRlci0+cGFyYW1zLnN0YXRzX3VwZGF0ZV9wZXJpb2QpCisJCXNjaGVkdWxlX21hY19zdGF0c191cGRhdGUoYWRhcHRlciwKKwkJCQkJICBhZGFwdGVyLT5wYXJhbXMuc3RhdHNfdXBkYXRlX3BlcmlvZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3hnYl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCBwb3J0X2luZm8gKnAgPSAmYWRhcHRlci0+cG9ydFtkZXYtPmlmX3BvcnRdOworCXN0cnVjdCBjbWFjICptYWMgPSBwLT5tYWM7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbWFjLT5vcHMtPmRpc2FibGUobWFjLCBNQUNfRElSRUNUSU9OX1RYIHwgTUFDX0RJUkVDVElPTl9SWCk7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCWNsZWFyX2JpdChkZXYtPmlmX3BvcnQsICZhZGFwdGVyLT5vcGVuX2RldmljZV9tYXApOworCWlmIChhZGFwdGVyLT5wYXJhbXMuc3RhdHNfdXBkYXRlX3BlcmlvZCAmJgorCSAgICAhKGFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCAmIFBPUlRfTUFTSykpIHsKKwkJLyogU3RvcCBzdGF0aXN0aWNzIGFjY3VtdWxhdGlvbi4gKi8KKwkJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKwkJc3Bpbl9sb2NrKCZhZGFwdGVyLT53b3JrX2xvY2spOyAgIC8qIHN5bmMgd2l0aCB1cGRhdGUgdGFzayAqLworCQlzcGluX3VubG9jaygmYWRhcHRlci0+d29ya19sb2NrKTsKKwkJY2FuY2VsX21hY19zdGF0c191cGRhdGUoYWRhcHRlcik7CisJfQorCisJaWYgKCFhZGFwdGVyLT5vcGVuX2RldmljZV9tYXApCisJCWN4Z2JfZG93bihhZGFwdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp0MV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gJmFkYXB0ZXItPnBvcnRbZGV2LT5pZl9wb3J0XTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnMgPSAmcC0+bmV0c3RhdHM7CisJY29uc3Qgc3RydWN0IGNtYWNfc3RhdGlzdGljcyAqcHN0YXRzOworCisJLyogRG8gYSBmdWxsIHVwZGF0ZSBvZiB0aGUgTUFDIHN0YXRzICovCisJcHN0YXRzID0gcC0+bWFjLT5vcHMtPnN0YXRpc3RpY3NfdXBkYXRlKHAtPm1hYywKKwkJCQkJCSAgICAgIE1BQ19TVEFUU19VUERBVEVfRlVMTCk7CisKKwlucy0+dHhfcGFja2V0cyA9IHBzdGF0cy0+VHhVbmljYXN0RnJhbWVzT0sgKworCQlwc3RhdHMtPlR4TXVsdGljYXN0RnJhbWVzT0sgKyBwc3RhdHMtPlR4QnJvYWRjYXN0RnJhbWVzT0s7CisKKwlucy0+cnhfcGFja2V0cyA9IHBzdGF0cy0+UnhVbmljYXN0RnJhbWVzT0sgKworCQlwc3RhdHMtPlJ4TXVsdGljYXN0RnJhbWVzT0sgKyBwc3RhdHMtPlJ4QnJvYWRjYXN0RnJhbWVzT0s7CisKKwlucy0+dHhfYnl0ZXMgPSBwc3RhdHMtPlR4T2N0ZXRzT0s7CisJbnMtPnJ4X2J5dGVzID0gcHN0YXRzLT5SeE9jdGV0c09LOworCisJbnMtPnR4X2Vycm9ycyA9IHBzdGF0cy0+VHhMYXRlQ29sbGlzaW9ucyArIHBzdGF0cy0+VHhMZW5ndGhFcnJvcnMgKworCQlwc3RhdHMtPlR4VW5kZXJydW4gKyBwc3RhdHMtPlR4RnJhbWVzQWJvcnRlZER1ZVRvWFNDb2xsaXNpb25zOworCW5zLT5yeF9lcnJvcnMgPSBwc3RhdHMtPlJ4RGF0YUVycm9ycyArIHBzdGF0cy0+UnhKYWJiZXJFcnJvcnMgKworCQlwc3RhdHMtPlJ4RkNTRXJyb3JzICsgcHN0YXRzLT5SeEFsaWduRXJyb3JzICsKKwkJcHN0YXRzLT5SeFNlcXVlbmNlRXJyb3JzICsgcHN0YXRzLT5SeEZyYW1lVG9vTG9uZ0Vycm9ycyArCisJCXBzdGF0cy0+UnhTeW1ib2xFcnJvcnMgKyBwc3RhdHMtPlJ4UnVudEVycm9yczsKKworCW5zLT5tdWx0aWNhc3QgID0gcHN0YXRzLT5SeE11bHRpY2FzdEZyYW1lc09LOworCW5zLT5jb2xsaXNpb25zID0gcHN0YXRzLT5UeFRvdGFsQ29sbGlzaW9uczsKKworCS8qIGRldGFpbGVkIHJ4X2Vycm9ycyAqLworCW5zLT5yeF9sZW5ndGhfZXJyb3JzID0gcHN0YXRzLT5SeEZyYW1lVG9vTG9uZ0Vycm9ycyArCisJCXBzdGF0cy0+UnhKYWJiZXJFcnJvcnM7CisJbnMtPnJ4X292ZXJfZXJyb3JzICAgPSAwOworCW5zLT5yeF9jcmNfZXJyb3JzICAgID0gcHN0YXRzLT5SeEZDU0Vycm9yczsKKwlucy0+cnhfZnJhbWVfZXJyb3JzICA9IHBzdGF0cy0+UnhBbGlnbkVycm9yczsKKwlucy0+cnhfZmlmb19lcnJvcnMgICA9IDA7CisJbnMtPnJ4X21pc3NlZF9lcnJvcnMgPSAwOworCisJLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisJbnMtPnR4X2Fib3J0ZWRfZXJyb3JzICAgPSBwc3RhdHMtPlR4RnJhbWVzQWJvcnRlZER1ZVRvWFNDb2xsaXNpb25zOworCW5zLT50eF9jYXJyaWVyX2Vycm9ycyAgID0gMDsKKwlucy0+dHhfZmlmb19lcnJvcnMgICAgICA9IHBzdGF0cy0+VHhVbmRlcnJ1bjsKKwlucy0+dHhfaGVhcnRiZWF0X2Vycm9ycyA9IDA7CisJbnMtPnR4X3dpbmRvd19lcnJvcnMgICAgPSBwc3RhdHMtPlR4TGF0ZUNvbGxpc2lvbnM7CisJcmV0dXJuIG5zOworfQorCitzdGF0aWMgdTMyIGdldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCisJcmV0dXJuIGFkYXB0ZXItPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCisJYWRhcHRlci0+bXNnX2VuYWJsZSA9IHZhbDsKK30KKworc3RhdGljIGNoYXIgc3RhdHNfc3RyaW5nc1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisgICAgICAgICJUeE9jdGV0c09LIiwKKyAgICAgICAgIlR4T2N0ZXRzQmFkIiwKKyAgICAgICAgIlR4VW5pY2FzdEZyYW1lc09LIiwKKyAgICAgICAgIlR4TXVsdGljYXN0RnJhbWVzT0siLAorICAgICAgICAiVHhCcm9hZGNhc3RGcmFtZXNPSyIsCisgICAgICAgICJUeFBhdXNlRnJhbWVzIiwKKyAgICAgICAgIlR4RnJhbWVzV2l0aERlZmVycmVkWG1pc3Npb25zIiwKKyAgICAgICAgIlR4TGF0ZUNvbGxpc2lvbnMiLAorICAgICAgICAiVHhUb3RhbENvbGxpc2lvbnMiLAorICAgICAgICAiVHhGcmFtZXNBYm9ydGVkRHVlVG9YU0NvbGxpc2lvbnMiLAorICAgICAgICAiVHhVbmRlcnJ1biIsCisgICAgICAgICJUeExlbmd0aEVycm9ycyIsCisgICAgICAgICJUeEludGVybmFsTUFDWG1pdEVycm9yIiwKKyAgICAgICAgIlR4RnJhbWVzV2l0aEV4Y2Vzc2l2ZURlZmVycmFsIiwKKyAgICAgICAgIlR4RkNTRXJyb3JzIiwKKworICAgICAgICAiUnhPY3RldHNPSyIsCisgICAgICAgICJSeE9jdGV0c0JhZCIsCisgICAgICAgICJSeFVuaWNhc3RGcmFtZXNPSyIsCisgICAgICAgICJSeE11bHRpY2FzdEZyYW1lc09LIiwKKyAgICAgICAgIlJ4QnJvYWRjYXN0RnJhbWVzT0siLAorICAgICAgICAiUnhQYXVzZUZyYW1lcyIsCisgICAgICAgICJSeEZDU0Vycm9ycyIsCisgICAgICAgICJSeEFsaWduRXJyb3JzIiwKKyAgICAgICAgIlJ4U3ltYm9sRXJyb3JzIiwKKyAgICAgICAgIlJ4RGF0YUVycm9ycyIsCisgICAgICAgICJSeFNlcXVlbmNlRXJyb3JzIiwKKyAgICAgICAgIlJ4UnVudEVycm9ycyIsCisgICAgICAgICJSeEphYmJlckVycm9ycyIsCisgICAgICAgICJSeEludGVybmFsTUFDUmN2RXJyb3IiLAorICAgICAgICAiUnhJblJhbmdlTGVuZ3RoRXJyb3JzIiwKKyAgICAgICAgIlJ4T3V0T2ZSYW5nZUxlbmd0aEZpZWxkIiwKKyAgICAgICAgIlJ4RnJhbWVUb29Mb25nRXJyb3JzIiwKKworCSJUU08iLAorCSJWTEFOZXh0cmFjdGlvbnMiLAorCSJWTEFOaW5zZXJ0aW9ucyIsCisJIlJ4Q3N1bUdvb2QiLAorCSJUeENzdW1PZmZsb2FkIiwKKwkiUnhEcm9wcyIKKworCSJyZXNwUV9lbXB0eSIsCisJInJlc3BRX292ZXJmbG93IiwKKwkiZnJlZWxpc3RRX2VtcHR5IiwKKwkicGt0X3Rvb19iaWciLAorCSJwa3RfbWlzbWF0Y2giLAorCSJjbWRRX2Z1bGwwIiwKKwkiY21kUV9mdWxsMSIsCisJInR4X2lwZnJhZ3MiLAorCSJ0eF9yZWdfcGt0cyIsCisJInR4X2xzb19wa3RzIiwKKwkidHhfZG9fY2tzdW0iLAorCQorCSJlc3BpX0RJUDJQYXJpdHlFcnIiLAorCSJlc3BpX0RJUDRFcnIiLAorCSJlc3BpX1J4RHJvcHMiLAorCSJlc3BpX1R4RHJvcHMiLAorCSJlc3BpX1J4T3ZmbCIsCisJImVzcGlfUGFyaXR5RXJyIgorfTsKKyAKKyNkZWZpbmUgVDJfUkVHTUFQX1NJWkUgKDMgKiAxMDI0KQorCitzdGF0aWMgaW50IGdldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBUMl9SRUdNQVBfU0laRTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5md192ZXJzaW9uLCAiTi9BIik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIEFSUkFZX1NJWkUoc3RhdHNfc3RyaW5ncyk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQoreworCWlmIChzdHJpbmdzZXQgPT0gRVRIX1NTX1NUQVRTKQorCQltZW1jcHkoZGF0YSwgc3RhdHNfc3RyaW5ncywgc2l6ZW9mKHN0YXRzX3N0cmluZ3MpKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywKKwkJICAgICAgdTY0ICpkYXRhKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCBjbWFjICptYWMgPSBhZGFwdGVyLT5wb3J0W2Rldi0+aWZfcG9ydF0ubWFjOworCWNvbnN0IHN0cnVjdCBjbWFjX3N0YXRpc3RpY3MgKnM7CisJY29uc3Qgc3RydWN0IHNnZV9wb3J0X3N0YXRzICpzczsKKwljb25zdCBzdHJ1Y3Qgc2dlX2ludHJfY291bnRzICp0OworCisJcyA9IG1hYy0+b3BzLT5zdGF0aXN0aWNzX3VwZGF0ZShtYWMsIE1BQ19TVEFUU19VUERBVEVfRlVMTCk7CisJc3MgPSB0MV9zZ2VfZ2V0X3BvcnRfc3RhdHMoYWRhcHRlci0+c2dlLCBkZXYtPmlmX3BvcnQpOworCXQgPSB0MV9zZ2VfZ2V0X2ludHJfY291bnRzKGFkYXB0ZXItPnNnZSk7CisKKyAgICAgICAgKmRhdGErKyA9IHMtPlR4T2N0ZXRzT0s7CisgICAgICAgICpkYXRhKysgPSBzLT5UeE9jdGV0c0JhZDsKKyAgICAgICAgKmRhdGErKyA9IHMtPlR4VW5pY2FzdEZyYW1lc09LOworICAgICAgICAqZGF0YSsrID0gcy0+VHhNdWx0aWNhc3RGcmFtZXNPSzsKKyAgICAgICAgKmRhdGErKyA9IHMtPlR4QnJvYWRjYXN0RnJhbWVzT0s7CisgICAgICAgICpkYXRhKysgPSBzLT5UeFBhdXNlRnJhbWVzOworICAgICAgICAqZGF0YSsrID0gcy0+VHhGcmFtZXNXaXRoRGVmZXJyZWRYbWlzc2lvbnM7CisgICAgICAgICpkYXRhKysgPSBzLT5UeExhdGVDb2xsaXNpb25zOworICAgICAgICAqZGF0YSsrID0gcy0+VHhUb3RhbENvbGxpc2lvbnM7CisgICAgICAgICpkYXRhKysgPSBzLT5UeEZyYW1lc0Fib3J0ZWREdWVUb1hTQ29sbGlzaW9uczsKKyAgICAgICAgKmRhdGErKyA9IHMtPlR4VW5kZXJydW47CisgICAgICAgICpkYXRhKysgPSBzLT5UeExlbmd0aEVycm9yczsKKyAgICAgICAgKmRhdGErKyA9IHMtPlR4SW50ZXJuYWxNQUNYbWl0RXJyb3I7CisgICAgICAgICpkYXRhKysgPSBzLT5UeEZyYW1lc1dpdGhFeGNlc3NpdmVEZWZlcnJhbDsKKyAgICAgICAgKmRhdGErKyA9IHMtPlR4RkNTRXJyb3JzOworCisgICAgICAgICpkYXRhKysgPSBzLT5SeE9jdGV0c09LOworICAgICAgICAqZGF0YSsrID0gcy0+UnhPY3RldHNCYWQ7CisgICAgICAgICpkYXRhKysgPSBzLT5SeFVuaWNhc3RGcmFtZXNPSzsKKyAgICAgICAgKmRhdGErKyA9IHMtPlJ4TXVsdGljYXN0RnJhbWVzT0s7CisgICAgICAgICpkYXRhKysgPSBzLT5SeEJyb2FkY2FzdEZyYW1lc09LOworICAgICAgICAqZGF0YSsrID0gcy0+UnhQYXVzZUZyYW1lczsKKyAgICAgICAgKmRhdGErKyA9IHMtPlJ4RkNTRXJyb3JzOworICAgICAgICAqZGF0YSsrID0gcy0+UnhBbGlnbkVycm9yczsKKyAgICAgICAgKmRhdGErKyA9IHMtPlJ4U3ltYm9sRXJyb3JzOworICAgICAgICAqZGF0YSsrID0gcy0+UnhEYXRhRXJyb3JzOworICAgICAgICAqZGF0YSsrID0gcy0+UnhTZXF1ZW5jZUVycm9yczsKKyAgICAgICAgKmRhdGErKyA9IHMtPlJ4UnVudEVycm9yczsKKyAgICAgICAgKmRhdGErKyA9IHMtPlJ4SmFiYmVyRXJyb3JzOworICAgICAgICAqZGF0YSsrID0gcy0+UnhJbnRlcm5hbE1BQ1JjdkVycm9yOworICAgICAgICAqZGF0YSsrID0gcy0+UnhJblJhbmdlTGVuZ3RoRXJyb3JzOworICAgICAgICAqZGF0YSsrID0gcy0+UnhPdXRPZlJhbmdlTGVuZ3RoRmllbGQ7CisgICAgICAgICpkYXRhKysgPSBzLT5SeEZyYW1lVG9vTG9uZ0Vycm9yczsKKworCSpkYXRhKysgPSBzcy0+dHNvOworCSpkYXRhKysgPSBzcy0+dmxhbl94dHJhY3Q7CisJKmRhdGErKyA9IHNzLT52bGFuX2luc2VydDsKKwkqZGF0YSsrID0gc3MtPnJ4X2Nzb19nb29kOworCSpkYXRhKysgPSBzcy0+dHhfY3NvOworCSpkYXRhKysgPSBzcy0+cnhfZHJvcHM7CisKKwkqZGF0YSsrID0gKHU2NCl0LT5yZXNwUV9lbXB0eTsKKwkqZGF0YSsrID0gKHU2NCl0LT5yZXNwUV9vdmVyZmxvdzsKKwkqZGF0YSsrID0gKHU2NCl0LT5mcmVlbGlzdFFfZW1wdHk7CisJKmRhdGErKyA9ICh1NjQpdC0+cGt0X3Rvb19iaWc7CisJKmRhdGErKyA9ICh1NjQpdC0+cGt0X21pc21hdGNoOworCSpkYXRhKysgPSAodTY0KXQtPmNtZFFfZnVsbFswXTsKKwkqZGF0YSsrID0gKHU2NCl0LT5jbWRRX2Z1bGxbMV07CisJKmRhdGErKyA9ICh1NjQpdC0+dHhfaXBmcmFnczsKKwkqZGF0YSsrID0gKHU2NCl0LT50eF9yZWdfcGt0czsKKwkqZGF0YSsrID0gKHU2NCl0LT50eF9sc29fcGt0czsKKwkqZGF0YSsrID0gKHU2NCl0LT50eF9kb19ja3N1bTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlZ19ibG9ja19kdW1wKHN0cnVjdCBhZGFwdGVyICphcCwgdm9pZCAqYnVmLAorCQkJCSAgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgZW5kKQoreworCXUzMiAqcCA9IGJ1ZiArIHN0YXJ0OworCisJZm9yICggOyBzdGFydCA8PSBlbmQ7IHN0YXJ0ICs9IHNpemVvZih1MzIpKQorCQkqcCsrID0gcmVhZGwoYXAtPnJlZ3MgKyBzdGFydCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsCisJCSAgICAgdm9pZCAqYnVmKQoreworCXN0cnVjdCBhZGFwdGVyICphcCA9IGRldi0+cHJpdjsKKworCS8qCisJICogVmVyc2lvbiBzY2hlbWU6IGJpdHMgMC4uOTogY2hpcCB2ZXJzaW9uLCBiaXRzIDEwLi4xNTogY2hpcCByZXZpc2lvbgorCSAqLworCXJlZ3MtPnZlcnNpb24gPSAyOworCisJbWVtc2V0KGJ1ZiwgMCwgVDJfUkVHTUFQX1NJWkUpOworCXJlZ19ibG9ja19kdW1wKGFwLCBidWYsIDAsIEFfU0dfUkVTUEFDQ1VUSU1FUik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCBwb3J0X2luZm8gKnAgPSAmYWRhcHRlci0+cG9ydFtkZXYtPmlmX3BvcnRdOworCisJY21kLT5zdXBwb3J0ZWQgPSBwLT5saW5rX2NvbmZpZy5zdXBwb3J0ZWQ7CisJY21kLT5hZHZlcnRpc2luZyA9IHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nOworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQljbWQtPnNwZWVkID0gcC0+bGlua19jb25maWcuc3BlZWQ7CisJCWNtZC0+ZHVwbGV4ID0gcC0+bGlua19jb25maWcuZHVwbGV4OworCX0gZWxzZSB7CisJCWNtZC0+c3BlZWQgPSAtMTsKKwkJY21kLT5kdXBsZXggPSAtMTsKKwl9CisKKyAgICAgICAgY21kLT5wb3J0ID0gKGNtZC0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX1RQKSA/IFBPUlRfVFAgOiBQT1JUX0ZJQlJFOworICAgICAgICBjbWQtPnBoeV9hZGRyZXNzID0gcC0+cGh5LT5hZGRyOworICAgICAgICBjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKyAgICAgICAgY21kLT5hdXRvbmVnID0gcC0+bGlua19jb25maWcuYXV0b25lZzsKKyAgICAgICAgY21kLT5tYXh0eHBrdCA9IDA7CisgICAgICAgIGNtZC0+bWF4cnhwa3QgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwZWVkX2R1cGxleF90b19jYXBzKGludCBzcGVlZCwgaW50IGR1cGxleCkKK3sKKwlpbnQgY2FwID0gMDsKKworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIFNQRUVEXzEwOgorCQlpZiAoZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJY2FwID0gU1VQUE9SVEVEXzEwYmFzZVRfRnVsbDsKKwkJZWxzZQorCQkJY2FwID0gU1VQUE9SVEVEXzEwYmFzZVRfSGFsZjsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDA6CisJCWlmIChkdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQljYXAgPSBTVVBQT1JURURfMTAwYmFzZVRfRnVsbDsKKwkJZWxzZQorCQkJY2FwID0gU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGY7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwMDoKKwkJaWYgKGR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCWNhcCA9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKKwkJZWxzZQorCQkJY2FwID0gU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDAwOgorCQlpZiAoZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJY2FwID0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbDsKKwl9CisJcmV0dXJuIGNhcDsKK30KKworI2RlZmluZSBBRFZFUlRJU0VEX01BU0sgKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfCBcCisJCSAgICAgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8IFwKKwkJICAgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfCBcCisJCSAgICAgIEFEVkVSVElTRURfMTAwMDBiYXNlVF9GdWxsKQorCitzdGF0aWMgaW50IHNldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gJmFkYXB0ZXItPnBvcnRbZGV2LT5pZl9wb3J0XTsKKwlzdHJ1Y3QgbGlua19jb25maWcgKmxjID0gJnAtPmxpbmtfY29uZmlnOworCisJaWYgKCEobGMtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9BdXRvbmVnKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOyAgICAgICAgICAgICAvKiBjYW4ndCBjaGFuZ2Ugc3BlZWQvZHVwbGV4ICovCisKKwlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSkgeworCQlpbnQgY2FwID0gc3BlZWRfZHVwbGV4X3RvX2NhcHMoY21kLT5zcGVlZCwgY21kLT5kdXBsZXgpOworCisJCWlmICghKGxjLT5zdXBwb3J0ZWQgJiBjYXApIHx8IGNtZC0+c3BlZWQgPT0gU1BFRURfMTAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlsYy0+cmVxdWVzdGVkX3NwZWVkID0gY21kLT5zcGVlZDsKKwkJbGMtPnJlcXVlc3RlZF9kdXBsZXggPSBjbWQtPmR1cGxleDsKKwkJbGMtPmFkdmVydGlzaW5nID0gMDsKKwl9IGVsc2UgeworCQljbWQtPmFkdmVydGlzaW5nICY9IEFEVkVSVElTRURfTUFTSzsKKwkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJiAoY21kLT5hZHZlcnRpc2luZyAtIDEpKQorCQkJY21kLT5hZHZlcnRpc2luZyA9IGxjLT5zdXBwb3J0ZWQ7CisJCWNtZC0+YWR2ZXJ0aXNpbmcgJj0gbGMtPnN1cHBvcnRlZDsKKwkJaWYgKCFjbWQtPmFkdmVydGlzaW5nKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWxjLT5yZXF1ZXN0ZWRfc3BlZWQgPSBTUEVFRF9JTlZBTElEOworCQlsYy0+cmVxdWVzdGVkX2R1cGxleCA9IERVUExFWF9JTlZBTElEOworCQlsYy0+YWR2ZXJ0aXNpbmcgPSBjbWQtPmFkdmVydGlzaW5nIHwgQURWRVJUSVNFRF9BdXRvbmVnOworCX0KKwlsYy0+YXV0b25lZyA9IGNtZC0+YXV0b25lZzsKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQl0MV9saW5rX3N0YXJ0KHAtPnBoeSwgcC0+bWFjLCBsYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICplcGF1c2UpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJc3RydWN0IHBvcnRfaW5mbyAqcCA9ICZhZGFwdGVyLT5wb3J0W2Rldi0+aWZfcG9ydF07CisKKwllcGF1c2UtPmF1dG9uZWcgPSAocC0+bGlua19jb25maWcucmVxdWVzdGVkX2ZjICYgUEFVU0VfQVVUT05FRykgIT0gMDsKKwllcGF1c2UtPnJ4X3BhdXNlID0gKHAtPmxpbmtfY29uZmlnLmZjICYgUEFVU0VfUlgpICE9IDA7CisJZXBhdXNlLT50eF9wYXVzZSA9IChwLT5saW5rX2NvbmZpZy5mYyAmIFBBVVNFX1RYKSAhPSAwOworfQorCitzdGF0aWMgaW50IHNldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gJmFkYXB0ZXItPnBvcnRbZGV2LT5pZl9wb3J0XTsKKwlzdHJ1Y3QgbGlua19jb25maWcgKmxjID0gJnAtPmxpbmtfY29uZmlnOworCisJaWYgKGVwYXVzZS0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpCisJCWxjLT5yZXF1ZXN0ZWRfZmMgPSAwOworCWVsc2UgaWYgKGxjLT5zdXBwb3J0ZWQgJiBTVVBQT1JURURfQXV0b25lZykKKwkJbGMtPnJlcXVlc3RlZF9mYyA9IFBBVVNFX0FVVE9ORUc7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChlcGF1c2UtPnJ4X3BhdXNlKQorCQlsYy0+cmVxdWVzdGVkX2ZjIHw9IFBBVVNFX1JYOworCWlmIChlcGF1c2UtPnR4X3BhdXNlKQorCQlsYy0+cmVxdWVzdGVkX2ZjIHw9IFBBVVNFX1RYOworCWlmIChsYy0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQkJdDFfbGlua19zdGFydChwLT5waHksIHAtPm1hYywgbGMpOworCX0gZWxzZSB7CisJCWxjLT5mYyA9IGxjLT5yZXF1ZXN0ZWRfZmMgJiAoUEFVU0VfUlggfCBQQVVTRV9UWCk7CisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCQlwLT5tYWMtPm9wcy0+c2V0X3NwZWVkX2R1cGxleF9mYyhwLT5tYWMsIC0xLCAtMSwKKwkJCQkJCQkgbGMtPmZjKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworCXJldHVybiAoYWRhcHRlci0+ZmxhZ3MgJiBSWF9DU1VNX0VOQUJMRUQpICE9IDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisKKwlpZiAoZGF0YSkKKwkJYWRhcHRlci0+ZmxhZ3MgfD0gUlhfQ1NVTV9FTkFCTEVEOworCWVsc2UKKwkJYWRhcHRlci0+ZmxhZ3MgJj0gflJYX0NTVU1fRU5BQkxFRDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfdHNvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworCWlmICghKGFkYXB0ZXItPmZsYWdzICYgVFNPX0NBUEFCTEUpKQorCQlyZXR1cm4gdmFsdWUgPyAtRU9QTk9UU1VQUCA6IDA7CisJcmV0dXJuIGV0aHRvb2xfb3Bfc2V0X3RzbyhkZXYsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3NnZV9wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmUpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJaW50IGp1bWJvX2ZsID0gdDFfaXNfVDFCKGFkYXB0ZXIpID8gMSA6IDA7CisKKwllLT5yeF9tYXhfcGVuZGluZyA9IE1BWF9SWF9CVUZGRVJTOworCWUtPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSAwOworCWUtPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gTUFYX1JYX0pVTUJPX0JVRkZFUlM7CisJZS0+dHhfbWF4X3BlbmRpbmcgPSBNQVhfQ01EUV9FTlRSSUVTOworCisJZS0+cnhfcGVuZGluZyA9IGFkYXB0ZXItPnBhcmFtcy5zZ2UuZnJlZWxRX3NpemVbIWp1bWJvX2ZsXTsKKwllLT5yeF9taW5pX3BlbmRpbmcgPSAwOworCWUtPnJ4X2p1bWJvX3BlbmRpbmcgPSBhZGFwdGVyLT5wYXJhbXMuc2dlLmZyZWVsUV9zaXplW2p1bWJvX2ZsXTsKKwllLT50eF9wZW5kaW5nID0gYWRhcHRlci0+cGFyYW1zLnNnZS5jbWRRX3NpemVbMF07Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NnZV9wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmUpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJaW50IGp1bWJvX2ZsID0gdDFfaXNfVDFCKGFkYXB0ZXIpID8gMSA6IDA7CisKKwlpZiAoZS0+cnhfcGVuZGluZyA+IE1BWF9SWF9CVUZGRVJTIHx8IGUtPnJ4X21pbmlfcGVuZGluZyB8fAorCSAgICBlLT5yeF9qdW1ib19wZW5kaW5nID4gTUFYX1JYX0pVTUJPX0JVRkZFUlMgfHwKKwkgICAgZS0+dHhfcGVuZGluZyA+IE1BWF9DTURRX0VOVFJJRVMgfHwKKwkgICAgZS0+cnhfcGVuZGluZyA8IE1JTl9GTF9FTlRSSUVTIHx8CisJICAgIGUtPnJ4X2p1bWJvX3BlbmRpbmcgPCBNSU5fRkxfRU5UUklFUyB8fAorCSAgICBlLT50eF9wZW5kaW5nIDwgKGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMgKyAxKSAqIChNQVhfU0tCX0ZSQUdTICsgMSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFkYXB0ZXItPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCisgICAgICAgIHJldHVybiAtRUJVU1k7CisKKwlhZGFwdGVyLT5wYXJhbXMuc2dlLmZyZWVsUV9zaXplWyFqdW1ib19mbF0gPSBlLT5yeF9wZW5kaW5nOworCWFkYXB0ZXItPnBhcmFtcy5zZ2UuZnJlZWxRX3NpemVbanVtYm9fZmxdID0gZS0+cnhfanVtYm9fcGVuZGluZzsKKwlhZGFwdGVyLT5wYXJhbXMuc2dlLmNtZFFfc2l6ZVswXSA9IGUtPnR4X3BlbmRpbmc7CisJYWRhcHRlci0+cGFyYW1zLnNnZS5jbWRRX3NpemVbMV0gPSBlLT50eF9wZW5kaW5nID4gTUFYX0NNRFExX0VOVFJJRVMgPworCQlNQVhfQ01EUTFfRU5UUklFUyA6IGUtPnR4X3BlbmRpbmc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCisJLyoKKwkgKiBJZiBSWCBjb2FsZXNjaW5nIGlzIHJlcXVlc3RlZCB3ZSB1c2UgTkFQSSwgb3RoZXJ3aXNlIGludGVycnVwdHMuCisJICogVGhpcyBjaG9pY2UgY2FuIGJlIG1hZGUgb25seSB3aGVuIGFsbCBwb3J0cyBhbmQgdGhlIFRPRSBhcmUgb2ZmLgorCSAqLworCWlmIChhZGFwdGVyLT5vcGVuX2RldmljZV9tYXAgPT0gMCkKKwkJYWRhcHRlci0+cGFyYW1zLnNnZS5wb2xsaW5nID0gYy0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlOworCisJaWYgKGFkYXB0ZXItPnBhcmFtcy5zZ2UucG9sbGluZykgeworCQlhZGFwdGVyLT5wYXJhbXMuc2dlLnJ4X2NvYWxlc2NlX3VzZWNzID0gMDsKKwl9IGVsc2UgeworCQlhZGFwdGVyLT5wYXJhbXMuc2dlLnJ4X2NvYWxlc2NlX3VzZWNzID0gYy0+cnhfY29hbGVzY2VfdXNlY3M7CisJfQorIAlhZGFwdGVyLT5wYXJhbXMuc2dlLmNvYWxlc2NlX2VuYWJsZSA9IGMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZTsKKwlhZGFwdGVyLT5wYXJhbXMuc2dlLnNhbXBsZV9pbnRlcnZhbF91c2VjcyA9IGMtPnJhdGVfc2FtcGxlX2ludGVydmFsOworCXQxX3NnZV9zZXRfY29hbGVzY2VfcGFyYW1zKGFkYXB0ZXItPnNnZSwgJmFkYXB0ZXItPnBhcmFtcy5zZ2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqYykKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworCWMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gYWRhcHRlci0+cGFyYW1zLnNnZS5yeF9jb2FsZXNjZV91c2VjczsKKwljLT5yYXRlX3NhbXBsZV9pbnRlcnZhbCA9IGFkYXB0ZXItPnBhcmFtcy5zZ2Uuc2FtcGxlX2ludGVydmFsX3VzZWNzOworCWMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSA9IGFkYXB0ZXItPnBhcmFtcy5zZ2UuY29hbGVzY2VfZW5hYmxlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcmV0dXJuIEVFUFJPTV9TSVpFOworfQorCisjZGVmaW5lIEVFUFJPTV9NQUdJQyhhcCkgXAorCShQQ0lfVkVORE9SX0lEX0NIRUxTSU8gfCAoKGFwKS0+cGFyYW1zLmNoaXBfdmVyc2lvbiA8PCAxNikpCisKK3N0YXRpYyBpbnQgZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmUsCisJCSAgICAgIHU4ICpkYXRhKQoreworCWludCBpOworCXU4IGJ1ZltFRVBST01fU0laRV0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCisJZS0+bWFnaWMgPSBFRVBST01fTUFHSUMoYWRhcHRlcik7CisJZm9yIChpID0gZS0+b2Zmc2V0ICYgfjM7IGkgPCBlLT5vZmZzZXQgKyBlLT5sZW47IGkgKz0gc2l6ZW9mKHUzMikpCisJCXQxX3NlZXByb21fcmVhZChhZGFwdGVyLCBpLCAodTMyICopJmJ1ZltpXSk7CisJbWVtY3B5KGRhdGEsIGJ1ZiArIGUtPm9mZnNldCwgZS0+bGVuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB0MV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzICAgICAgPSBnZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyAgICAgID0gc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyAgICAgICA9IGdldF9kcnZpbmZvLAorCS5nZXRfbXNnbGV2ZWwgICAgICA9IGdldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsICAgICAgPSBzZXRfbXNnbGV2ZWwsCisJLmdldF9yaW5ncGFyYW0gICAgID0gZ2V0X3NnZV9wYXJhbSwKKwkuc2V0X3JpbmdwYXJhbSAgICAgPSBzZXRfc2dlX3BhcmFtLAorCS5nZXRfY29hbGVzY2UgICAgICA9IGdldF9jb2FsZXNjZSwKKwkuc2V0X2NvYWxlc2NlICAgICAgPSBzZXRfY29hbGVzY2UsCisJLmdldF9lZXByb21fbGVuICAgID0gZ2V0X2VlcHJvbV9sZW4sCisJLmdldF9lZXByb20gICAgICAgID0gZ2V0X2VlcHJvbSwKKwkuZ2V0X3BhdXNlcGFyYW0gICAgPSBnZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3BhdXNlcGFyYW0gICAgPSBzZXRfcGF1c2VwYXJhbSwKKwkuZ2V0X3J4X2NzdW0gICAgICAgPSBnZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0gICAgICAgPSBzZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0gICAgICAgPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bSAgICAgICA9IGV0aHRvb2xfb3Bfc2V0X3R4X2NzdW0sCisJLmdldF9zZyAgICAgICAgICAgID0gZXRodG9vbF9vcF9nZXRfc2csCisJLnNldF9zZyAgICAgICAgICAgID0gZXRodG9vbF9vcF9zZXRfc2csCisJLmdldF9saW5rICAgICAgICAgID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3N0cmluZ3MgICAgICAgPSBnZXRfc3RyaW5ncywKKwkuZ2V0X3N0YXRzX2NvdW50ICAgPSBnZXRfc3RhdHNfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzID0gZ2V0X3N0YXRzLAorCS5nZXRfcmVnc19sZW4gICAgICA9IGdldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MgICAgICAgICAgPSBnZXRfcmVncywKKwkuZ2V0X3RzbyAgICAgICAgICAgPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28gICAgICAgICAgID0gc2V0X3RzbywKK307CisKK3N0YXRpYyB2b2lkIGN4Z2JfcHJvY19jbGVhbnVwKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcikKK3sKKwljb25zdCBjaGFyICpuYW1lOworCW5hbWUgPSBhZGFwdGVyLT5uYW1lOworCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWUsIGRpcik7Cit9CisvLyNkZWZpbmUgY2h0b2Vfc2V0dXBfdG9lZGV2KGFkYXB0ZXIpIE5VTEwKKyNkZWZpbmUgdXBkYXRlX210dV90YWIoYWRhcHRlcikKKyNkZWZpbmUgd3JpdGVfc210X2VudHJ5KGFkYXB0ZXIsIGlkeCkKKworc3RhdGljIGludCB0MV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJlcSwgaW50IGNtZCkKK3sKKyAgICAgICAgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisgICAgICAgIHN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShyZXEpOworCisJc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBTSU9DR01JSVBIWToKKyAgICAgICAgICAgICAgICBkYXRhLT5waHlfaWQgPSBhZGFwdGVyLT5wb3J0W2Rldi0+aWZfcG9ydF0ucGh5LT5hZGRyOworICAgICAgICAgICAgICAgIC8qIEZBTExUSFJVICovCisgICAgICAgIGNhc2UgU0lPQ0dNSUlSRUc6IHsKKwkJc3RydWN0IGNwaHkgKnBoeSA9IGFkYXB0ZXItPnBvcnRbZGV2LT5pZl9wb3J0XS5waHk7CisJCXUzMiB2YWw7CisKKwkJaWYgKCFwaHktPm1kaW9fcmVhZCkKKyAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwkJcGh5LT5tZGlvX3JlYWQoYWRhcHRlciwgZGF0YS0+cGh5X2lkLCAwLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwKKwkJCSAgICAgICAmdmFsKTsKKyAgICAgICAgICAgICAgICBkYXRhLT52YWxfb3V0ID0gdmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworCX0KKyAgICAgICAgY2FzZSBTSU9DU01JSVJFRzogeworCQlzdHJ1Y3QgY3BoeSAqcGh5ID0gYWRhcHRlci0+cG9ydFtkZXYtPmlmX3BvcnRdLnBoeTsKKworICAgICAgICAgICAgICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKwkJaWYgKCFwaHktPm1kaW9fd3JpdGUpCisgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJCXBoeS0+bWRpb193cml0ZShhZGFwdGVyLCBkYXRhLT5waHlfaWQsIDAsIGRhdGEtPnJlZ19udW0gJiAweDFmLAorCQkJICAgICAgICBkYXRhLT52YWxfaW4pOworICAgICAgICAgICAgICAgIGJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdDFfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCBjbWFjICptYWMgPSBhZGFwdGVyLT5wb3J0W2Rldi0+aWZfcG9ydF0ubWFjOworCisJaWYgKCFtYWMtPm9wcy0+c2V0X210dSkKKyAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmIChuZXdfbXR1IDwgNjgpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmICgocmV0ID0gbWFjLT5vcHMtPnNldF9tdHUobWFjLCBuZXdfbXR1KSkpCisJCXJldHVybiByZXQ7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHQxX3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCBjbWFjICptYWMgPSBhZGFwdGVyLT5wb3J0W2Rldi0+aWZfcG9ydF0ubWFjOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwlpZiAoIW1hYy0+b3BzLT5tYWNhZGRyZXNzX3NldCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCW1hYy0+b3BzLT5tYWNhZGRyZXNzX3NldChtYWMsIGRldi0+ZGV2X2FkZHIpOworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCitzdGF0aWMgdm9pZCB2bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworCXNwaW5fbG9ja19pcnEoJmFkYXB0ZXItPmFzeW5jX2xvY2spOworCWFkYXB0ZXItPnZsYW5fZ3JwID0gZ3JwOworCXQxX3NldF92bGFuX2FjY2VsKGFkYXB0ZXIsIGdycCAhPSBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmFzeW5jX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB2bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworCXNwaW5fbG9ja19pcnEoJmFkYXB0ZXItPmFzeW5jX2xvY2spOworCWlmIChhZGFwdGVyLT52bGFuX2dycCkKKwkJYWRhcHRlci0+dmxhbl9ncnAtPnZsYW5fZGV2aWNlc1t2aWRdID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmFzeW5jX2xvY2spOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgdDFfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgICAgIHQxX3NlbGVjdF9pbnRyX2hhbmRsZXIoYWRhcHRlcikoYWRhcHRlci0+cGRldi0+aXJxLCBhZGFwdGVyLCBOVUxMKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisjZW5kaWYKKworLyoKKyAqIFBlcmlvZGljIGFjY3VtdWxhdGlvbiBvZiBNQUMgc3RhdGlzdGljcy4gIFRoaXMgaXMgdXNlZCBvbmx5IGlmIHRoZSBNQUMKKyAqIGRvZXMgbm90IGhhdmUgYW55IG90aGVyIHdheSB0byBwcmV2ZW50IHN0YXRzIGNvdW50ZXIgb3ZlcmZsb3cuCisgKi8KK3N0YXRpYyB2b2lkIG1hY19zdGF0c190YXNrKHZvaWQgKmRhdGEpCit7CisJaW50IGk7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkYXRhOworCisJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7CisJCXN0cnVjdCBwb3J0X2luZm8gKnAgPSAmYWRhcHRlci0+cG9ydFtpXTsKKworCQlpZiAobmV0aWZfcnVubmluZyhwLT5kZXYpKQorCQkJcC0+bWFjLT5vcHMtPnN0YXRpc3RpY3NfdXBkYXRlKHAtPm1hYywKKwkJCQkJCSAgICAgICBNQUNfU1RBVFNfVVBEQVRFX0ZBU1QpOworCX0KKworCS8qIFNjaGVkdWxlIHRoZSBuZXh0IHN0YXRpc3RpY3MgdXBkYXRlIGlmIGFueSBwb3J0IGlzIGFjdGl2ZS4gKi8KKwlzcGluX2xvY2soJmFkYXB0ZXItPndvcmtfbG9jayk7CisJaWYgKGFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCAmIFBPUlRfTUFTSykKKwkJc2NoZWR1bGVfbWFjX3N0YXRzX3VwZGF0ZShhZGFwdGVyLAorCQkJCQkgIGFkYXB0ZXItPnBhcmFtcy5zdGF0c191cGRhdGVfcGVyaW9kKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+d29ya19sb2NrKTsKK30KKworLyoKKyAqIFByb2Nlc3NlcyBlbG1lcjAgZXh0ZXJuYWwgaW50ZXJydXB0cyBpbiBwcm9jZXNzIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkIGV4dF9pbnRyX3Rhc2sodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRhdGE7CisKKwllbG1lcjBfZXh0X2ludHJfaGFuZGxlcihhZGFwdGVyKTsKKworCS8qIE5vdyByZWVuYWJsZSBleHRlcm5hbCBpbnRlcnJ1cHRzICovCisJc3Bpbl9sb2NrX2lycSgmYWRhcHRlci0+YXN5bmNfbG9jayk7CisJYWRhcHRlci0+c2xvd19pbnRyX21hc2sgfD0gRl9QTF9JTlRSX0VYVDsKKwl3cml0ZWwoRl9QTF9JTlRSX0VYVCwgYWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOworCXdyaXRlbChhZGFwdGVyLT5zbG93X2ludHJfbWFzayB8IEZfUExfSU5UUl9TR0VfREFUQSwKKyAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+YXN5bmNfbG9jayk7Cit9CisKKy8qCisgKiBJbnRlcnJ1cHQtY29udGV4dCBoYW5kbGVyIGZvciBlbG1lcjAgZXh0ZXJuYWwgaW50ZXJydXB0cy4KKyAqLwordm9pZCB0MV9lbG1lcjBfZXh0X2ludHIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyoKKwkgKiBTY2hlZHVsZSBhIHRhc2sgdG8gaGFuZGxlIGV4dGVybmFsIGludGVycnVwdHMgYXMgd2UgcmVxdWlyZQorCSAqIGEgcHJvY2VzcyBjb250ZXh0LiAgV2UgZGlzYWJsZSBFWFQgaW50ZXJydXB0cyBpbiB0aGUgaW50ZXJpbQorCSAqIGFuZCBsZXQgdGhlIHRhc2sgcmVlbmFibGUgdGhlbSB3aGVuIGl0J3MgZG9uZS4KKwkgKi8KKwlhZGFwdGVyLT5zbG93X2ludHJfbWFzayAmPSB+Rl9QTF9JTlRSX0VYVDsKKwl3cml0ZWwoYWRhcHRlci0+c2xvd19pbnRyX21hc2sgfCBGX1BMX0lOVFJfU0dFX0RBVEEsCisgICAgICAgICAgICAgICAgICAgYWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5leHRfaW50cl9oYW5kbGVyX3Rhc2spOworfQorCit2b2lkIHQxX2ZhdGFsX2VycihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkgeworCQl0MV9zZ2Vfc3RvcChhZGFwdGVyLT5zZ2UpOworCQl0MV9pbnRlcnJ1cHRzX2Rpc2FibGUoYWRhcHRlcik7CisJfQorCUNIX0FMRVJUKCIlczogZW5jb3VudGVyZWQgZmF0YWwgZXJyb3IsIG9wZXJhdGlvbiBzdXNwZW5kZWRcbiIsCisJCSBhZGFwdGVyLT5uYW1lKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgdmVyc2lvbl9wcmludGVkOworCisJaW50IGksIGVyciwgcGNpX3VzaW5nX2RhYyA9IDA7CisJdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0LCBtbWlvX2xlbjsKKwljb25zdCBzdHJ1Y3QgYm9hcmRfaW5mbyAqYmk7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBOVUxMOworCXN0cnVjdCBwb3J0X2luZm8gKnBpOworCisJaWYgKCF2ZXJzaW9uX3ByaW50ZWQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgLSB2ZXJzaW9uICVzXG4iLCBEUlZfREVTQ1JJUFRJT04sCisJCSAgICAgICBEUlZfVkVSU0lPTik7CisJCSsrdmVyc2lvbl9wcmludGVkOworCX0KKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJQ0hfRVJSKCIlczogY2Fubm90IGZpbmQgUENJIGRldmljZSBtZW1vcnkgYmFzZSBhZGRyZXNzXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9kaXNhYmxlX3BkZXY7CisJfQorCisJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkgeworCQlwY2lfdXNpbmdfZGFjID0gMTsKKworCQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkgeworCQkJQ0hfRVJSKCIlczogdW5hYmxlIHRvIG9idGFpbiA2NC1iaXQgRE1BIGZvciIKKwkJCSAgICAgICAiY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIiwgcGNpX25hbWUocGRldikpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X2Rpc2FibGVfcGRldjsKKwkJfQorCisJfSBlbHNlIGlmICgoZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpICE9IDApIHsKKwkJQ0hfRVJSKCIlczogbm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gb3V0X2Rpc2FibGVfcGRldjsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAoZXJyKSB7CisJCUNIX0VSUigiJXM6IGNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIiwgcGNpX25hbWUocGRldikpOworCQlnb3RvIG91dF9kaXNhYmxlX3BkZXY7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKyAgICBtbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCW1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKwliaSA9IHQxX2dldF9ib2FyZF9pbmZvKGVudC0+ZHJpdmVyX2RhdGEpOworCisJZm9yIChpID0gMDsgaSA8IGJpLT5wb3J0X251bWJlcjsgKytpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKKwkJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoYWRhcHRlciA/IDAgOiBzaXplb2YoKmFkYXB0ZXIpKTsKKwkJaWYgKCFuZXRkZXYpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9mcmVlX2RldjsKKwkJfQorCisJCVNFVF9NT0RVTEVfT1dORVIobmV0ZGV2KTsKKwkJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKKworCQlpZiAoIWFkYXB0ZXIpIHsKKwkJCWFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJCQlhZGFwdGVyLT5wZGV2ID0gcGRldjsKKwkJCWFkYXB0ZXItPnBvcnRbMF0uZGV2ID0gbmV0ZGV2OyAgLyogc28gd2UgZG9uJ3QgbGVhayBpdCAqLworCisJCQlhZGFwdGVyLT5yZWdzID0gaW9yZW1hcChtbWlvX3N0YXJ0LCBtbWlvX2xlbik7CisJCQlpZiAoIWFkYXB0ZXItPnJlZ3MpIHsKKwkJCQlDSF9FUlIoIiVzOiBjYW5ub3QgbWFwIGRldmljZSByZWdpc3RlcnNcbiIsCisJCQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0X2ZyZWVfZGV2OworCQkJfQorCisJCQlpZiAodDFfZ2V0X2JvYXJkX3JldihhZGFwdGVyLCBiaSwgJmFkYXB0ZXItPnBhcmFtcykpIHsKKwkJCQllcnIgPSAtRU5PREVWOwkgIC8qIENhbid0IGhhbmRsZSB0aGlzIGNoaXAgcmV2ICovCisJCQkJZ290byBvdXRfZnJlZV9kZXY7CisJCQl9CisKKwkJCWFkYXB0ZXItPm5hbWUgPSBwY2lfbmFtZShwZGV2KTsKKwkJCWFkYXB0ZXItPm1zZ19lbmFibGUgPSBkZmx0X21zZ19lbmFibGU7CisJCQlhZGFwdGVyLT5tbWlvX2xlbiA9IG1taW9fbGVuOworCisJCQlpbml0X01VVEVYKCZhZGFwdGVyLT5taWJfbXV0ZXgpOworCQkJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnRwaV9sb2NrKTsKKwkJCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT53b3JrX2xvY2spOworCQkJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmFzeW5jX2xvY2spOworCisJCQlJTklUX1dPUksoJmFkYXB0ZXItPmV4dF9pbnRyX2hhbmRsZXJfdGFzaywKKwkJCQkgIGV4dF9pbnRyX3Rhc2ssIGFkYXB0ZXIpOworCQkJSU5JVF9XT1JLKCZhZGFwdGVyLT5zdGF0c191cGRhdGVfdGFzaywgbWFjX3N0YXRzX3Rhc2ssCisJCQkJICBhZGFwdGVyKTsKKyNpZmRlZiB3b3JrX3N0cnVjdAorCQkJaW5pdF90aW1lcigmYWRhcHRlci0+c3RhdHNfdXBkYXRlX3RpbWVyKTsKKwkJCWFkYXB0ZXItPnN0YXRzX3VwZGF0ZV90aW1lci5mdW5jdGlvbiA9IG1hY19zdGF0c190aW1lcjsKKwkJCWFkYXB0ZXItPnN0YXRzX3VwZGF0ZV90aW1lci5kYXRhID0KKwkJCQkodW5zaWduZWQgbG9uZylhZGFwdGVyOworI2VuZGlmCisKKwkJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBuZXRkZXYpOworCQl9CisKKwkJcGkgPSAmYWRhcHRlci0+cG9ydFtpXTsKKwkJcGktPmRldiA9IG5ldGRldjsKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJbmV0ZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJCW5ldGRldi0+aWZfcG9ydCA9IGk7CisJCW5ldGRldi0+bWVtX3N0YXJ0ID0gbW1pb19zdGFydDsKKwkJbmV0ZGV2LT5tZW1fZW5kID0gbW1pb19zdGFydCArIG1taW9fbGVuIC0gMTsKKwkJbmV0ZGV2LT5wcml2ID0gYWRhcHRlcjsKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNOworCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKKworCQlhZGFwdGVyLT5mbGFncyB8PSBSWF9DU1VNX0VOQUJMRUQgfCBUQ1BfQ1NVTV9DQVBBQkxFOworCQlpZiAocGNpX3VzaW5nX2RhYykKKwkJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCQlpZiAodmxhbl90c29fY2FwYWJsZShhZGFwdGVyKSkgeworI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorCQkJYWRhcHRlci0+ZmxhZ3MgfD0gVkxBTl9BQ0NFTF9DQVBBQkxFOworCQkJbmV0ZGV2LT5mZWF0dXJlcyB8PQorCQkJCU5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKKwkJCW5ldGRldi0+dmxhbl9yeF9yZWdpc3RlciA9IHZsYW5fcnhfcmVnaXN0ZXI7CisJCQluZXRkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSB2bGFuX3J4X2tpbGxfdmlkOworI2VuZGlmCisJCQlhZGFwdGVyLT5mbGFncyB8PSBUU09fQ0FQQUJMRTsKKwkJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisJCX0KKworCQluZXRkZXYtPm9wZW4gPSBjeGdiX29wZW47CisJCW5ldGRldi0+c3RvcCA9IGN4Z2JfY2xvc2U7CisJCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0gdDFfc3RhcnRfeG1pdDsKKwkJbmV0ZGV2LT5oYXJkX2hlYWRlcl9sZW4gKz0gKGFkYXB0ZXItPmZsYWdzICYgVFNPX0NBUEFCTEUpID8KKwkJCXNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdF9sc28pIDoKKwkJCXNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdCk7CisJCW5ldGRldi0+Z2V0X3N0YXRzID0gdDFfZ2V0X3N0YXRzOworCQluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHQxX3NldF9yeG1vZGU7CisJCW5ldGRldi0+ZG9faW9jdGwgPSB0MV9pb2N0bDsKKwkJbmV0ZGV2LT5jaGFuZ2VfbXR1ID0gdDFfY2hhbmdlX210dTsKKwkJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSB0MV9zZXRfbWFjX2FkZHI7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkJbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSB0MV9uZXRwb2xsOworI2VuZGlmCisJCW5ldGRldi0+d2VpZ2h0ID0gNjQ7CisKKyAgICAgICAgU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJnQxX2V0aHRvb2xfb3BzKTsKKwl9CisKKwlpZiAodDFfaW5pdF9zd19tb2R1bGVzKGFkYXB0ZXIsIGJpKSA8IDApIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZnJlZV9kZXY7CisJfQorCisJLyoKKwkgKiBUaGUgY2FyZCBpcyBub3cgcmVhZHkgdG8gZ28uICBJZiBhbnkgZXJyb3JzIG9jY3VyIGR1cmluZyBkZXZpY2UKKwkgKiByZWdpc3RyYXRpb24gd2UgZG8gbm90IGZhaWwgdGhlIHdob2xlIGNhcmQgYnV0IHJhdGhlciBwcm9jZWVkIG9ubHkKKwkgKiB3aXRoIHRoZSBwb3J0cyB3ZSBtYW5hZ2UgdG8gcmVnaXN0ZXIgc3VjY2Vzc2Z1bGx5LiAgSG93ZXZlciB3ZSBtdXN0CisJICogcmVnaXN0ZXIgYXQgbGVhc3Qgb25lIG5ldCBkZXZpY2UuCisJICovCisJZm9yIChpID0gMDsgaSA8IGJpLT5wb3J0X251bWJlcjsgKytpKSB7CisJCWVyciA9IHJlZ2lzdGVyX25ldGRldihhZGFwdGVyLT5wb3J0W2ldLmRldik7CisJCWlmIChlcnIpCisJCQlDSF9XQVJOKCIlczogY2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UgJXMsIHNraXBwaW5nXG4iLAorCQkJCXBjaV9uYW1lKHBkZXYpLCBhZGFwdGVyLT5wb3J0W2ldLmRldi0+bmFtZSk7CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIENoYW5nZSB0aGUgbmFtZSB3ZSB1c2UgZm9yIG1lc3NhZ2VzIHRvIHRoZSBuYW1lIG9mCisJCQkgKiB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgaW50ZXJmYWNlLgorCQkJICovCisJCQlpZiAoIWFkYXB0ZXItPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCkKKwkJCQlhZGFwdGVyLT5uYW1lID0gYWRhcHRlci0+cG9ydFtpXS5kZXYtPm5hbWU7CisKKyAgICAgICAgICAgICAgICBfX3NldF9iaXQoaSwgJmFkYXB0ZXItPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCk7CisJCX0KKwl9CisJaWYgKCFhZGFwdGVyLT5yZWdpc3RlcmVkX2RldmljZV9tYXApIHsKKwkJQ0hfRVJSKCIlczogY291bGQgbm90IHJlZ2lzdGVyIGFueSBuZXQgZGV2aWNlc1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBvdXRfcmVsZWFzZV9hZGFwdGVyX3JlczsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgKHJldiAlZCksICVzICVkTUh6LyVkLWJpdFxuIiwgYWRhcHRlci0+bmFtZSwKKwkgICAgICAgYmktPmRlc2MsIGFkYXB0ZXItPnBhcmFtcy5jaGlwX3JldmlzaW9uLAorCSAgICAgICBhZGFwdGVyLT5wYXJhbXMucGNpLmlzX3BjaXggPyAiUENJWCIgOiAiUENJIiwKKwkgICAgICAgYWRhcHRlci0+cGFyYW1zLnBjaS5zcGVlZCwgYWRhcHRlci0+cGFyYW1zLnBjaS53aWR0aCk7CisJcmV0dXJuIDA7CisKKyBvdXRfcmVsZWFzZV9hZGFwdGVyX3JlczoKKwl0MV9mcmVlX3N3X21vZHVsZXMoYWRhcHRlcik7Cisgb3V0X2ZyZWVfZGV2OgorCWlmIChhZGFwdGVyKSB7CisJCWlmIChhZGFwdGVyLT5yZWdzKSBpb3VubWFwKGFkYXB0ZXItPnJlZ3MpOworCQlmb3IgKGkgPSBiaS0+cG9ydF9udW1iZXIgLSAxOyBpID49IDA7IC0taSkKKwkJCWlmIChhZGFwdGVyLT5wb3J0W2ldLmRldikgeworCQkJCWN4Z2JfcHJvY19jbGVhbnVwKGFkYXB0ZXIsIHByb2Nfcm9vdF9kcml2ZXIpOworCQkJCWtmcmVlKGFkYXB0ZXItPnBvcnRbaV0uZGV2KTsKKwkJCX0KKwl9CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKyBvdXRfZGlzYWJsZV9wZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHQxX3N3X3Jlc2V0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgQV9QQ0lDRkdfUE1fQ1NSLCAzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIEFfUENJQ0ZHX1BNX0NTUiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCByZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZGV2KSB7CisJCWludCBpOworCQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworCQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCisJCQlpZiAodGVzdF9iaXQoaSwgJmFkYXB0ZXItPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCkpCisJCQkJdW5yZWdpc3Rlcl9uZXRkZXYoYWRhcHRlci0+cG9ydFtpXS5kZXYpOworCisJCXQxX2ZyZWVfc3dfbW9kdWxlcyhhZGFwdGVyKTsKKwkJaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKKwkJd2hpbGUgKC0taSA+PSAwKQorCQkJaWYgKGFkYXB0ZXItPnBvcnRbaV0uZGV2KSB7CisJCQkJY3hnYl9wcm9jX2NsZWFudXAoYWRhcHRlciwgcHJvY19yb290X2RyaXZlcik7CisJCQkJa2ZyZWUoYWRhcHRlci0+cG9ydFtpXS5kZXYpOworCQkJfQorCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwkJdDFfc3dfcmVzZXQocGRldik7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lICAgICA9IERSVl9OQU1FLAorCS5pZF90YWJsZSA9IHQxX3BjaV90YmwsCisJLnByb2JlICAgID0gaW5pdF9vbmUsCisJLnJlbW92ZSAgID0gX19kZXZleGl0X3AocmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0MV9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0MV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodDFfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQodDFfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9lbG1lcjAuaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vZWxtZXIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5MGNiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vZWxtZXIwLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGaWxlOiBlbG1lcjAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICRSZXZpc2lvbjogMS42ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJERhdGU6IDIwMDUvMDYvMjEgMjI6NDk6NDMgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBwYXJ0IG9mIHRoZSBDaGVsc2lvIDEwR2IgRXRoZXJuZXQgRHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMgICAgICAgKgorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nICAgKgorICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAgICAqCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vd3d3LmNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIC0gMjAwNSBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuICAgICAgICAgICAgICAgICAgICAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTWFpbnRhaW5lcnM6IG1haW50YWluZXJzQGNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEF1dGhvcnM6IERpbWl0cmlvcyBNaWNoYWlsaWRpcyAgIDxkbUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgVGluYSBZYW5nICAgICAgICAgICAgICAgPHRhaW5heUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGZWxpeCBNYXJ0aSAgICAgICAgICAgICA8ZmVsaXhAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIFNjb3R0IEJhcmRvbmUgICAgICAgICAgIDxzYmFyZG9uZUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgS3VydCBPdHRhd2F5ICAgICAgICAgICAgPGtvdHRhd2F5QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGcmFuayBEaU1hbWJybyAgICAgICAgICA8ZnJhbmtAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DWEdCX0VMTUVSMF9IXworI2RlZmluZSBfQ1hHQl9FTE1FUjBfSF8KKworLyogRUxNRVIwIHJlZ2lzdGVycyAqLworI2RlZmluZSBBX0VMTUVSMF9WRVJTSU9OIDB4MTAwMDAwCisjZGVmaW5lIEFfRUxNRVIwX1BIWV9DRkcgMHgxMDAwMDQKKyNkZWZpbmUgQV9FTE1FUjBfSU5UX0VOQUJMRSAweDEwMDAwOAorI2RlZmluZSBBX0VMTUVSMF9JTlRfQ0FVU0UgMHgxMDAwMGMKKyNkZWZpbmUgQV9FTE1FUjBfR1BJX0NGRyAweDEwMDAxMAorI2RlZmluZSBBX0VMTUVSMF9HUElfU1RBVCAweDEwMDAxNAorI2RlZmluZSBBX0VMTUVSMF9HUE8gMHgxMDAwMTgKKyNkZWZpbmUgQV9FTE1FUjBfUE9SVDBfTUkxX0NGRyAweDQwMDAwMAorCisjZGVmaW5lIFNfTUkxX01ESV9FTkFCTEUgICAgMAorI2RlZmluZSBWX01JMV9NRElfRU5BQkxFKHgpICgoeCkgPDwgU19NSTFfTURJX0VOQUJMRSkKKyNkZWZpbmUgRl9NSTFfTURJX0VOQUJMRSAgICBWX01JMV9NRElfRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfTUkxX01ESV9JTlZFUlQgICAgMQorI2RlZmluZSBWX01JMV9NRElfSU5WRVJUKHgpICgoeCkgPDwgU19NSTFfTURJX0lOVkVSVCkKKyNkZWZpbmUgRl9NSTFfTURJX0lOVkVSVCAgICBWX01JMV9NRElfSU5WRVJUKDFVKQorCisjZGVmaW5lIFNfTUkxX1BSRUFNQkxFX0VOQUJMRSAgICAyCisjZGVmaW5lIFZfTUkxX1BSRUFNQkxFX0VOQUJMRSh4KSAoKHgpIDw8IFNfTUkxX1BSRUFNQkxFX0VOQUJMRSkKKyNkZWZpbmUgRl9NSTFfUFJFQU1CTEVfRU5BQkxFICAgIFZfTUkxX1BSRUFNQkxFX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX01JMV9TT0YgICAgMworI2RlZmluZSBNX01JMV9TT0YgICAgMHgzCisjZGVmaW5lIFZfTUkxX1NPRih4KSAoKHgpIDw8IFNfTUkxX1NPRikKKyNkZWZpbmUgR19NSTFfU09GKHgpICgoKHgpID4+IFNfTUkxX1NPRikgJiBNX01JMV9TT0YpCisKKyNkZWZpbmUgU19NSTFfQ0xLX0RJViAgICA1CisjZGVmaW5lIE1fTUkxX0NMS19ESVYgICAgMHhmZgorI2RlZmluZSBWX01JMV9DTEtfRElWKHgpICgoeCkgPDwgU19NSTFfQ0xLX0RJVikKKyNkZWZpbmUgR19NSTFfQ0xLX0RJVih4KSAoKCh4KSA+PiBTX01JMV9DTEtfRElWKSAmIE1fTUkxX0NMS19ESVYpCisKKyNkZWZpbmUgQV9FTE1FUjBfUE9SVDBfTUkxX0FERFIgMHg0MDAwMDQKKworI2RlZmluZSBTX01JMV9SRUdfQUREUiAgICAwCisjZGVmaW5lIE1fTUkxX1JFR19BRERSICAgIDB4MWYKKyNkZWZpbmUgVl9NSTFfUkVHX0FERFIoeCkgKCh4KSA8PCBTX01JMV9SRUdfQUREUikKKyNkZWZpbmUgR19NSTFfUkVHX0FERFIoeCkgKCgoeCkgPj4gU19NSTFfUkVHX0FERFIpICYgTV9NSTFfUkVHX0FERFIpCisKKyNkZWZpbmUgU19NSTFfUEhZX0FERFIgICAgNQorI2RlZmluZSBNX01JMV9QSFlfQUREUiAgICAweDFmCisjZGVmaW5lIFZfTUkxX1BIWV9BRERSKHgpICgoeCkgPDwgU19NSTFfUEhZX0FERFIpCisjZGVmaW5lIEdfTUkxX1BIWV9BRERSKHgpICgoKHgpID4+IFNfTUkxX1BIWV9BRERSKSAmIE1fTUkxX1BIWV9BRERSKQorCisjZGVmaW5lIEFfRUxNRVIwX1BPUlQwX01JMV9EQVRBIDB4NDAwMDA4CisKKyNkZWZpbmUgU19NSTFfREFUQSAgICAwCisjZGVmaW5lIE1fTUkxX0RBVEEgICAgMHhmZmZmCisjZGVmaW5lIFZfTUkxX0RBVEEoeCkgKCh4KSA8PCBTX01JMV9EQVRBKQorI2RlZmluZSBHX01JMV9EQVRBKHgpICgoKHgpID4+IFNfTUkxX0RBVEEpICYgTV9NSTFfREFUQSkKKworI2RlZmluZSBBX0VMTUVSMF9QT1JUMF9NSTFfT1AgMHg0MDAwMGMKKworI2RlZmluZSBTX01JMV9PUCAgICAwCisjZGVmaW5lIE1fTUkxX09QICAgIDB4MworI2RlZmluZSBWX01JMV9PUCh4KSAoKHgpIDw8IFNfTUkxX09QKQorI2RlZmluZSBHX01JMV9PUCh4KSAoKCh4KSA+PiBTX01JMV9PUCkgJiBNX01JMV9PUCkKKworI2RlZmluZSBTX01JMV9BRERSX0FVVE9JTkMgICAgMgorI2RlZmluZSBWX01JMV9BRERSX0FVVE9JTkMoeCkgKCh4KSA8PCBTX01JMV9BRERSX0FVVE9JTkMpCisjZGVmaW5lIEZfTUkxX0FERFJfQVVUT0lOQyAgICBWX01JMV9BRERSX0FVVE9JTkMoMVUpCisKKyNkZWZpbmUgU19NSTFfT1BfQlVTWSAgICAzMQorI2RlZmluZSBWX01JMV9PUF9CVVNZKHgpICgoeCkgPDwgU19NSTFfT1BfQlVTWSkKKyNkZWZpbmUgRl9NSTFfT1BfQlVTWSAgICBWX01JMV9PUF9CVVNZKDFVKQorCisjZGVmaW5lIEFfRUxNRVIwX1BPUlQxX01JMV9DRkcgMHg1MDAwMDAKKyNkZWZpbmUgQV9FTE1FUjBfUE9SVDFfTUkxX0FERFIgMHg1MDAwMDQKKyNkZWZpbmUgQV9FTE1FUjBfUE9SVDFfTUkxX0RBVEEgMHg1MDAwMDgKKyNkZWZpbmUgQV9FTE1FUjBfUE9SVDFfTUkxX09QIDB4NTAwMDBjCisjZGVmaW5lIEFfRUxNRVIwX1BPUlQyX01JMV9DRkcgMHg2MDAwMDAKKyNkZWZpbmUgQV9FTE1FUjBfUE9SVDJfTUkxX0FERFIgMHg2MDAwMDQKKyNkZWZpbmUgQV9FTE1FUjBfUE9SVDJfTUkxX0RBVEEgMHg2MDAwMDgKKyNkZWZpbmUgQV9FTE1FUjBfUE9SVDJfTUkxX09QIDB4NjAwMDBjCisjZGVmaW5lIEFfRUxNRVIwX1BPUlQzX01JMV9DRkcgMHg3MDAwMDAKKyNkZWZpbmUgQV9FTE1FUjBfUE9SVDNfTUkxX0FERFIgMHg3MDAwMDQKKyNkZWZpbmUgQV9FTE1FUjBfUE9SVDNfTUkxX0RBVEEgMHg3MDAwMDgKKyNkZWZpbmUgQV9FTE1FUjBfUE9SVDNfTUkxX09QIDB4NzAwMDBjCisKKy8qIFNpbXBsZSBiaXQgZGVmaW5pdGlvbiBmb3IgR1BJIGFuZCBHUDAgcmVnaXN0ZXJzLiAqLworI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDEgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDIgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDMgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDQgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDUgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDYgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDcgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDggICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDkgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDEwICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDExICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDEyICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDEzICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDE0ICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDE1ICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDE2ICAgICAgICAgICAgIDB4MTAwMDAKKyNkZWZpbmUgICAgIEVMTUVSMF9HUF9CSVQxNyAgICAgICAgICAgICAweDIwMDAwCisjZGVmaW5lICAgICBFTE1FUjBfR1BfQklUMTggICAgICAgICAgICAgMHg0MDAwMAorI2RlZmluZSAgICAgRUxNRVIwX0dQX0JJVDE5ICAgICAgICAgICAgIDB4ODAwMDAKKworI2RlZmluZSBNSTFfT1BfRElSRUNUX1dSSVRFIDEKKyNkZWZpbmUgTUkxX09QX0RJUkVDVF9SRUFEICAyCisKKyNkZWZpbmUgTUkxX09QX0lORElSRUNUX0FERFJFU1MgIDAKKyNkZWZpbmUgTUkxX09QX0lORElSRUNUX1dSSVRFICAgIDEKKyNkZWZpbmUgTUkxX09QX0lORElSRUNUX1JFQURfSU5DIDIKKyNkZWZpbmUgTUkxX09QX0lORElSRUNUX1JFQUQgICAgIDMKKworI2VuZGlmIC8qIF9DWEdCX0VMTUVSMF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2VzcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzA2NDI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGaWxlOiBlc3BpLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICRSZXZpc2lvbjogMS4xNCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJERhdGU6IDIwMDUvMDUvMTQgMDA6NTk6MzIgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBFdGhlcm5ldCBTUEkgZnVuY3Rpb25hbGl0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIHBhcnQgb2YgdGhlIENoZWxzaW8gMTBHYiBFdGhlcm5ldCBEcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcyAgICAgICAqCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgICAqCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICAgICoKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIGh0dHA6Ly93d3cuY2hlbHNpby5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgLSAyMDA1IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gICAgICAgICAgICAgICAgICAgICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBNYWludGFpbmVyczogbWFpbnRhaW5lcnNAY2hlbHNpby5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQXV0aG9yczogRGltaXRyaW9zIE1pY2hhaWxpZGlzICAgPGRtQGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBUaW5hIFlhbmcgICAgICAgICAgICAgICA8dGFpbmF5QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIEZlbGl4IE1hcnRpICAgICAgICAgICAgIDxmZWxpeEBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgU2NvdHQgQmFyZG9uZSAgICAgICAgICAgPHNiYXJkb25lQGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBLdXJ0IE90dGF3YXkgICAgICAgICAgICA8a290dGF3YXlAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIEZyYW5rIERpTWFtYnJvICAgICAgICAgIDxmcmFua0BjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJyZWdzLmgiCisjaW5jbHVkZSAiZXNwaS5oIgorCitzdHJ1Y3QgcGVlc3BpIHsKKwlhZGFwdGVyX3QgKmFkYXB0ZXI7CisJc3RydWN0IGVzcGlfaW50cl9jb3VudHMgaW50cl9jbnQ7CisJdTMyIG1pc2NfY3RybDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCisjZGVmaW5lIEVTUElfSU5UUl9NQVNLIChGX0RJUDRFUlIgfCBGX1JYRFJPUCB8IEZfVFhEUk9QIHwgRl9SWE9WRVJGTE9XIHwgXAorCQkJRl9SQU1QQVJJVFlFUlIgfCBGX0RJUDJQQVJJVFlFUlIpCisjZGVmaW5lIE1PTl9NQVNLICAoVl9NT05JVE9SRURfUE9SVF9OVU0oMykgfCBGX01PTklUT1JFRF9ESVJFQ1RJT04gXAorCQkgICB8IEZfTU9OSVRPUkVEX0lOVEVSRkFDRSkKKworI2RlZmluZSBUUklDTl9DTkZHIDE0CisjZGVmaW5lIFRSSUNOX0NNRF9SRUFEICAweDExCisjZGVmaW5lIFRSSUNOX0NNRF9XUklURSAweDIxCisjZGVmaW5lIFRSSUNOX0NNRF9BVFRFTVBUUyAxMAorCitzdGF0aWMgaW50IHRyaWNuX3dyaXRlKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IGJ1bmRsZV9hZGRyLCBpbnQgbW9kdWxlX2FkZHIsCisJCSAgICAgICBpbnQgY2hfYWRkciwgaW50IHJlZ19vZmZzZXQsIHUzMiB3cl9kYXRhKQoreworCWludCBidXN5LCBhdHRlbXB0cyA9IFRSSUNOX0NNRF9BVFRFTVBUUzsKKworCXdyaXRlbChWX1dSSVRFX0RBVEEod3JfZGF0YSkgfAorCSAgICAgICBWX1JFR0lTVEVSX09GRlNFVChyZWdfb2Zmc2V0KSB8CisJICAgICAgIFZfQ0hBTk5FTF9BRERSKGNoX2FkZHIpIHwgVl9NT0RVTEVfQUREUihtb2R1bGVfYWRkcikgfAorCSAgICAgICBWX0JVTkRMRV9BRERSKGJ1bmRsZV9hZGRyKSB8CisJICAgICAgIFZfU1BJNF9DT01NQU5EKFRSSUNOX0NNRF9XUklURSksCisJICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfQ01EX0FERFIpOworCXdyaXRlbCgwLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX0dPU1RBVCk7CisKKwlkbyB7CisJCWJ1c3kgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9FU1BJX0dPU1RBVCkgJiBGX0VTUElfQ01EX0JVU1k7CisJfSB3aGlsZSAoYnVzeSAmJiAtLWF0dGVtcHRzKTsKKworCWlmIChidXN5KQorCQlDSF9FUlIoIiVzOiBUUklDTiB3cml0ZSB0aW1lZCBvdXRcbiIsIGFkYXB0ZXItPm5hbWUpOworCisJcmV0dXJuIGJ1c3k7Cit9CisKKy8qIDEuIERlYXNzZXJ0IHJ4X3Jlc2V0X2NvcmUuICovCisvKiAyLiBQcm9ncmFtIFRSSUNOX0NORkcgcmVnaXN0ZXJzLiAqLworLyogMy4gRGVhc3NlcnQgcnhfcmVzZXRfbGluayAqLworc3RhdGljIGludCB0cmljbl9pbml0KGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlpbnQgICAgIGkgICAgICAgICAgICAgICA9IDA7CisJaW50ICAgICBzbWUgICAgICAgICAgICAgPSAxOworCWludCAgICAgc3RhdCAgICAgICAgICAgID0gMDsKKwlpbnQgICAgIHRpbWVvdXQgICAgICAgICA9IDA7CisJaW50ICAgICBpc19yZWFkeSAgICAgICAgPSAwOworCWludCAgICAgZHluYW1pY19kZXNrZXcgID0gMDsKKworCWlmIChkeW5hbWljX2Rlc2tldykKKwkJc21lID0gMDsKKworCisJLyogMSAqLworCXRpbWVvdXQ9MTAwMDsKKwlkbyB7CisJCXN0YXQgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX1JFU0VUKTsKKwkJaXNfcmVhZHkgPSAoc3RhdCAmIDB4NCk7CisJCXRpbWVvdXQtLTsKKwkJdWRlbGF5KDUpOworCX0gd2hpbGUgKCFpc19yZWFkeSB8fCAodGltZW91dD09MCkpOworCXdyaXRlbCgweDIsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfUkVTRVQpOworCWlmICh0aW1lb3V0PT0wKQorCXsKKwkJQ0hfRVJSKCJFU1BJIDogRVJST1IgOiBUaW1lb3V0IHRyaWNuX2luaXQoKSBcbiIpOworCQl0MV9mYXRhbF9lcnIoYWRhcHRlcik7CisJfQorCisJLyogMiAqLworCWlmIChzbWUpIHsKKwkJdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMCwgMCwgVFJJQ05fQ05GRywgMHg4MSk7CisJCXRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDEsIDAsIFRSSUNOX0NORkcsIDB4ODEpOworCQl0cmljbl93cml0ZShhZGFwdGVyLCAwLCAyLCAwLCBUUklDTl9DTkZHLCAweDgxKTsKKwl9CisJZm9yIChpPTE7IGk8PSA4OyBpKyspIHRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDAsIGksIFRSSUNOX0NORkcsIDB4ZjEpOworCWZvciAoaT0xOyBpPD0gMjsgaSsrKSB0cmljbl93cml0ZShhZGFwdGVyLCAwLCAxLCBpLCBUUklDTl9DTkZHLCAweGYxKTsKKwlmb3IgKGk9MTsgaTw9IDM7IGkrKykgdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgaSwgVFJJQ05fQ05GRywgMHhlMSk7CisJZm9yIChpPTQ7IGk8PSA0OyBpKyspIHRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDIsIGksIFRSSUNOX0NORkcsIDB4ZjEpOworCWZvciAoaT01OyBpPD0gNTsgaSsrKSB0cmljbl93cml0ZShhZGFwdGVyLCAwLCAyLCBpLCBUUklDTl9DTkZHLCAweGUxKTsKKwlmb3IgKGk9NjsgaTw9IDY7IGkrKykgdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgaSwgVFJJQ05fQ05GRywgMHhmMSk7CisJZm9yIChpPTc7IGk8PSA3OyBpKyspIHRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDIsIGksIFRSSUNOX0NORkcsIDB4ODApOworCWZvciAoaT04OyBpPD0gODsgaSsrKSB0cmljbl93cml0ZShhZGFwdGVyLCAwLCAyLCBpLCBUUklDTl9DTkZHLCAweGYxKTsKKworCS8qIDMgKi8KKwl3cml0ZWwoMHgzLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX1JFU0VUKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHQxX2VzcGlfaW50cl9lbmFibGUoc3RydWN0IHBlZXNwaSAqZXNwaSkKK3sKKwl1MzIgZW5hYmxlLCBwbF9pbnRyID0gcmVhZGwoZXNwaS0+YWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKworCS8qCisJICogQ2Fubm90IGVuYWJsZSBFU1BJIGludGVycnVwdHMgb24gVDFCIGJlY2F1c2UgSFcgYXNzZXJ0cyB0aGUKKwkgKiBpbnRlcnJ1cHQgaW5jb3JyZWN0bHksIG5hbWVseSB0aGUgZHJpdmVyIGdldHMgRVNQSSBpbnRlcnJ1cHRzCisJICogYnV0IG5vIGRhdGEgaXMgYWN0dWFsbHkgZHJvcHBlZCAoY2FuIHZlcmlmeSB0aGlzIHJlYWRpbmcgdGhlIEVTUEkKKwkgKiBkcm9wIHJlZ2lzdGVycykuICBBbHNvLCBvbmNlIHRoZSBFU1BJIGludGVycnVwdCBpcyBhc3NlcnRlZCBpdAorCSAqIGNhbm5vdCBiZSBjbGVhcmVkIChIVyBidWcpLgorCSAqLworCWVuYWJsZSA9IHQxX2lzX1QxQihlc3BpLT5hZGFwdGVyKSA/IDAgOiBFU1BJX0lOVFJfTUFTSzsKKwl3cml0ZWwoZW5hYmxlLCBlc3BpLT5hZGFwdGVyLT5yZWdzICsgQV9FU1BJX0lOVFJfRU5BQkxFKTsKKwl3cml0ZWwocGxfaW50ciB8IEZfUExfSU5UUl9FU1BJLCBlc3BpLT5hZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworfQorCit2b2lkIHQxX2VzcGlfaW50cl9jbGVhcihzdHJ1Y3QgcGVlc3BpICplc3BpKQoreworCXdyaXRlbCgweGZmZmZmZmZmLCBlc3BpLT5hZGFwdGVyLT5yZWdzICsgQV9FU1BJX0lOVFJfU1RBVFVTKTsKKwl3cml0ZWwoRl9QTF9JTlRSX0VTUEksIGVzcGktPmFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKTsKK30KKwordm9pZCB0MV9lc3BpX2ludHJfZGlzYWJsZShzdHJ1Y3QgcGVlc3BpICplc3BpKQoreworCXUzMiBwbF9pbnRyID0gcmVhZGwoZXNwaS0+YWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKworCXdyaXRlbCgwLCBlc3BpLT5hZGFwdGVyLT5yZWdzICsgQV9FU1BJX0lOVFJfRU5BQkxFKTsKKwl3cml0ZWwocGxfaW50ciAmIH5GX1BMX0lOVFJfRVNQSSwgZXNwaS0+YWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKK30KKworaW50IHQxX2VzcGlfaW50cl9oYW5kbGVyKHN0cnVjdCBwZWVzcGkgKmVzcGkpCit7CisJdTMyIGNudDsKKwl1MzIgc3RhdHVzID0gcmVhZGwoZXNwaS0+YWRhcHRlci0+cmVncyArIEFfRVNQSV9JTlRSX1NUQVRVUyk7CisKKwlpZiAoc3RhdHVzICYgRl9ESVA0RVJSKQorCQllc3BpLT5pbnRyX2NudC5ESVA0X2VycisrOworCWlmIChzdGF0dXMgJiBGX1JYRFJPUCkKKwkJZXNwaS0+aW50cl9jbnQucnhfZHJvcHMrKzsKKwlpZiAoc3RhdHVzICYgRl9UWERST1ApCisJCWVzcGktPmludHJfY250LnR4X2Ryb3BzKys7CisJaWYgKHN0YXR1cyAmIEZfUlhPVkVSRkxPVykKKwkJZXNwaS0+aW50cl9jbnQucnhfb3ZmbHcrKzsKKwlpZiAoc3RhdHVzICYgRl9SQU1QQVJJVFlFUlIpCisJCWVzcGktPmludHJfY250LnBhcml0eV9lcnIrKzsKKwlpZiAoc3RhdHVzICYgRl9ESVAyUEFSSVRZRVJSKSB7CisJCWVzcGktPmludHJfY250LkRJUDJfcGFyaXR5X2VycisrOworCisJCS8qCisJCSAqIE11c3QgcmVhZCB0aGUgZXJyb3IgY291bnQgdG8gY2xlYXIgdGhlIGludGVycnVwdAorCQkgKiB0aGF0IGl0IGNhdXNlcy4KKwkJICovCisJCWNudCA9IHJlYWRsKGVzcGktPmFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfRElQMl9FUlJfQ09VTlQpOworCX0KKworCS8qCisJICogRm9yIFQxQiB3ZSBuZWVkIHRvIHdyaXRlIDEgdG8gY2xlYXIgRVNQSSBpbnRlcnJ1cHRzLiAgRm9yIFQyKyB3ZQorCSAqIHdyaXRlIHRoZSBzdGF0dXMgYXMgaXMuCisJICovCisJaWYgKHN0YXR1cyAmJiB0MV9pc19UMUIoZXNwaS0+YWRhcHRlcikpCisJCXN0YXR1cyA9IDE7CisJd3JpdGVsKHN0YXR1cywgZXNwaS0+YWRhcHRlci0+cmVncyArIEFfRVNQSV9JTlRSX1NUQVRVUyk7CisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBlc3BpX2ludHJfY291bnRzICp0MV9lc3BpX2dldF9pbnRyX2NvdW50cyhzdHJ1Y3QgcGVlc3BpICplc3BpKQoreworICAgIHJldHVybiAmZXNwaS0+aW50cl9jbnQ7Cit9CisKK3N0YXRpYyB2b2lkIGVzcGlfc2V0dXBfZm9yX3BtMzM5MyhhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJdTMyIHdtYXJrID0gdDFfaXNfVDFCKGFkYXB0ZXIpID8gMHg0MDAwIDogMHgzMjAwOworCisJd3JpdGVsKDB4MWY0LCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1NDSF9UT0tFTjApOworCXdyaXRlbCgweDFmNCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9TQ0hfVE9LRU4xKTsKKwl3cml0ZWwoMHgxZjQsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfU0NIX1RPS0VOMik7CisJd3JpdGVsKDB4MWY0LCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1NDSF9UT0tFTjMpOworCXdyaXRlbCgweDEwMCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9SWF9GSUZPX0FMTU9TVF9FTVBUWV9XQVRFUk1BUkspOworCXdyaXRlbCh3bWFyaywgYWRhcHRlci0+cmVncyArIEFfRVNQSV9SWF9GSUZPX0FMTU9TVF9GVUxMX1dBVEVSTUFSSyk7CisJd3JpdGVsKDMsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfQ0FMRU5EQVJfTEVOR1RIKTsKKwl3cml0ZWwoMHgwODAwMDAwOCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9UUkFJTik7CisJd3JpdGVsKFZfUlhfTlBPUlRTKDEpIHwgVl9UWF9OUE9SVFMoMSksIGFkYXB0ZXItPnJlZ3MgKyBBX1BPUlRfQ09ORklHKTsKK30KKworLyogVDIgSW5pdCBwYXJ0IC0tICAqLworLyogMS4gU2V0IFRfRVNQSV9NSVNDQ1RSTF9BRERSICovCisvKiAyLiBJbml0IEVTUEkgcmVnaXN0ZXJzLiAqLworLyogMy4gSW5pdCBUcmlDTiBIYXJkIE1hY3JvICovCitpbnQgdDFfZXNwaV9pbml0KHN0cnVjdCBwZWVzcGkgKmVzcGksIGludCBtYWNfdHlwZSwgaW50IG5wb3J0cykKK3sKKwl1MzIgY250OworCisJdTMyIHN0YXR1c19lbmFibGVfZXh0cmEgPSAwOworCWFkYXB0ZXJfdCAqYWRhcHRlciA9IGVzcGktPmFkYXB0ZXI7CisJdTMyIHN0YXR1cywgYnVyc3R2YWwgPSAweDgwMDEwMDsKKworCS8qIERpc2FibGUgRVNQSSB0cmFpbmluZy4gIE1BQ3MgdGhhdCBjYW4gaGFuZGxlIGl0IGVuYWJsZSBpdCBiZWxvdy4gKi8KKwl3cml0ZWwoMCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9UUkFJTik7CisKKwlpZiAoaXNfVDIoYWRhcHRlcikpIHsKKwkJd3JpdGVsKFZfT1VUX09GX1NZTkNfQ09VTlQoNCkgfAorCQkgICAgICAgVl9ESVAyX1BBUklUWV9FUlJfVEhSRVMoMykgfAorCQkgICAgICAgVl9ESVA0X1RIUkVTKDEpLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01JU0NfQ09OVFJPTCk7CisJCWlmIChucG9ydHMgPT0gNCkgeworCQkJLyogVDIwNDogbWF4YnVyc3QxID0gMHg0MCwgbWF4YnVyc3QyID0gMHgyMCAqLworCQkJYnVyc3R2YWwgPSAweDIwMDA0MDsKKwkJfQorCX0KKwl3cml0ZWwoYnVyc3R2YWwsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfTUFYQlVSU1QxX01BWEJVUlNUMik7CisKKwlzd2l0Y2ggKG1hY190eXBlKSB7CisJY2FzZSBDSEJUX01BQ19QTTMzOTM6CisJCWVzcGlfc2V0dXBfZm9yX3BtMzM5MyhhZGFwdGVyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIGFueSBwZW5kaW5nIGludGVycnVwdHMgZnJvbSB0aGUgU1BJIGFyZQorCSAqIENsZWFyZWQgYmVmb3JlIGVuYWJsaW5nIHRoZSBpbnRlcnJ1cHQuCisJICovCisJd3JpdGVsKEVTUElfSU5UUl9NQVNLLCBlc3BpLT5hZGFwdGVyLT5yZWdzICsgQV9FU1BJX0lOVFJfRU5BQkxFKTsKKwlzdGF0dXMgPSByZWFkbChlc3BpLT5hZGFwdGVyLT5yZWdzICsgQV9FU1BJX0lOVFJfU1RBVFVTKTsKKwlpZiAoc3RhdHVzICYgRl9ESVAyUEFSSVRZRVJSKSB7CisJCWNudCA9IHJlYWRsKGVzcGktPmFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfRElQMl9FUlJfQ09VTlQpOworCX0KKworCS8qCisJICogRm9yIFQxQiB3ZSBuZWVkIHRvIHdyaXRlIDEgdG8gY2xlYXIgRVNQSSBpbnRlcnJ1cHRzLiAgRm9yIFQyKyB3ZQorCSAqIHdyaXRlIHRoZSBzdGF0dXMgYXMgaXMuCisJICovCisJaWYgKHN0YXR1cyAmJiB0MV9pc19UMUIoZXNwaS0+YWRhcHRlcikpCisJCXN0YXR1cyA9IDE7CisJd3JpdGVsKHN0YXR1cywgZXNwaS0+YWRhcHRlci0+cmVncyArIEFfRVNQSV9JTlRSX1NUQVRVUyk7CisKKwl3cml0ZWwoc3RhdHVzX2VuYWJsZV9leHRyYSB8IEZfUlhTVEFUVVNFTkFCTEUsCisJICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfRklGT19TVEFUVVNfRU5BQkxFKTsKKworCWlmIChpc19UMihhZGFwdGVyKSkgeworCQl0cmljbl9pbml0KGFkYXB0ZXIpOworCQkvKgorCQkgKiBBbHdheXMgcG9zaXRpb24gdGhlIGNvbnRyb2wgYXQgdGhlIDFzdCBwb3J0IGVncmVzcyBJTgorCQkgKiAoc29wLGVvcCkgY291bnRlciB0byByZWR1Y2UgUElPcyBmb3IgVC9OMjEwIHdvcmthcm91bmQuCisJCSAqLworCQllc3BpLT5taXNjX2N0cmwgPSAocmVhZGwoYWRhcHRlci0+cmVncyArIEFfRVNQSV9NSVNDX0NPTlRST0wpCisJCQkJICAgJiB+TU9OX01BU0spIHwgKEZfTU9OSVRPUkVEX0RJUkVDVElPTgorCQkJCSAgIHwgRl9NT05JVE9SRURfSU5URVJGQUNFKTsKKwkJd3JpdGVsKGVzcGktPm1pc2NfY3RybCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9NSVNDX0NPTlRST0wpOworCQlzcGluX2xvY2tfaW5pdCgmZXNwaS0+bG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdDFfZXNwaV9kZXN0cm95KHN0cnVjdCBwZWVzcGkgKmVzcGkpCit7CisJa2ZyZWUoZXNwaSk7Cit9CisKK3N0cnVjdCBwZWVzcGkgKnQxX2VzcGlfY3JlYXRlKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcGVlc3BpICplc3BpID0ga21hbGxvYyhzaXplb2YoKmVzcGkpLCBHRlBfS0VSTkVMKTsKKworCW1lbXNldChlc3BpLCAwLCBzaXplb2YoKmVzcGkpKTsKKworCWlmIChlc3BpKQorCQllc3BpLT5hZGFwdGVyID0gYWRhcHRlcjsKKwlyZXR1cm4gZXNwaTsKK30KKwordm9pZCB0MV9lc3BpX3NldF9taXNjX2N0cmwoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgdmFsKQoreworCXN0cnVjdCBwZWVzcGkgKmVzcGkgPSBhZGFwdGVyLT5lc3BpOworCisJaWYgKCFpc19UMihhZGFwdGVyKSkKKwkJcmV0dXJuOworCXNwaW5fbG9jaygmZXNwaS0+bG9jayk7CisJZXNwaS0+bWlzY19jdHJsID0gKHZhbCAmIH5NT05fTUFTSykgfAorCQkJICAoZXNwaS0+bWlzY19jdHJsICYgTU9OX01BU0spOworCXdyaXRlbChlc3BpLT5taXNjX2N0cmwsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfTUlTQ19DT05UUk9MKTsKKwlzcGluX3VubG9jaygmZXNwaS0+bG9jayk7Cit9CisKK3UzMiB0MV9lc3BpX2dldF9tb24oYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgYWRkciwgdTggd2FpdCkKK3sKKwl1MzIgc2VsOworCisJc3RydWN0IHBlZXNwaSAqZXNwaSA9IGFkYXB0ZXItPmVzcGk7CisKKwlpZiAoIWlzX1QyKGFkYXB0ZXIpKQorCQlyZXR1cm4gMDsKKwlzZWwgPSBWX01PTklUT1JFRF9QT1JUX05VTSgoYWRkciAmIDB4M2MpID4+IDIpOworCWlmICghd2FpdCkgeworCQlpZiAoIXNwaW5fdHJ5bG9jaygmZXNwaS0+bG9jaykpCisJCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorCQlzcGluX2xvY2soJmVzcGktPmxvY2spOworCWlmICgoc2VsICE9IChlc3BpLT5taXNjX2N0cmwgJiBNT05fTUFTSykpKSB7CisJCXdyaXRlbCgoKGVzcGktPm1pc2NfY3RybCAmIH5NT05fTUFTSykgfCBzZWwpLAorCQkgICAgICAgYWRhcHRlci0+cmVncyArIEFfRVNQSV9NSVNDX0NPTlRST0wpOworCQlzZWwgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1NDSF9UT0tFTjMpOworCQl3cml0ZWwoZXNwaS0+bWlzY19jdHJsLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01JU0NfQ09OVFJPTCk7CisJfQorCWVsc2UKKwkJc2VsID0gcmVhZGwoYWRhcHRlci0+cmVncyArIEFfRVNQSV9TQ0hfVE9LRU4zKTsKKwlzcGluX3VubG9jaygmZXNwaS0+bG9jayk7CisJcmV0dXJuIHNlbDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vZXNwaS5oIGIvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwZTM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vZXNwaS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGaWxlOiBlc3BpLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICRSZXZpc2lvbjogMS43ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJERhdGU6IDIwMDUvMDYvMjEgMTg6Mjk6NDcgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBwYXJ0IG9mIHRoZSBDaGVsc2lvIDEwR2IgRXRoZXJuZXQgRHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMgICAgICAgKgorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nICAgKgorICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAgICAqCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vd3d3LmNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIC0gMjAwNSBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuICAgICAgICAgICAgICAgICAgICAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTWFpbnRhaW5lcnM6IG1haW50YWluZXJzQGNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEF1dGhvcnM6IERpbWl0cmlvcyBNaWNoYWlsaWRpcyAgIDxkbUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgVGluYSBZYW5nICAgICAgICAgICAgICAgPHRhaW5heUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGZWxpeCBNYXJ0aSAgICAgICAgICAgICA8ZmVsaXhAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIFNjb3R0IEJhcmRvbmUgICAgICAgICAgIDxzYmFyZG9uZUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgS3VydCBPdHRhd2F5ICAgICAgICAgICAgPGtvdHRhd2F5QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGcmFuayBEaU1hbWJybyAgICAgICAgICA8ZnJhbmtAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DWEdCX0VTUElfSF8KKyNkZWZpbmUgX0NYR0JfRVNQSV9IXworCisjaW5jbHVkZSAiY29tbW9uLmgiCisKK3N0cnVjdCBlc3BpX2ludHJfY291bnRzIHsKKwl1bnNpZ25lZCBpbnQgRElQNF9lcnI7CisJdW5zaWduZWQgaW50IHJ4X2Ryb3BzOworCXVuc2lnbmVkIGludCB0eF9kcm9wczsKKwl1bnNpZ25lZCBpbnQgcnhfb3ZmbHc7CisJdW5zaWduZWQgaW50IHBhcml0eV9lcnI7CisJdW5zaWduZWQgaW50IERJUDJfcGFyaXR5X2VycjsKK307CisKK3N0cnVjdCBwZWVzcGk7CisKK3N0cnVjdCBwZWVzcGkgKnQxX2VzcGlfY3JlYXRlKGFkYXB0ZXJfdCAqYWRhcHRlcik7Cit2b2lkIHQxX2VzcGlfZGVzdHJveShzdHJ1Y3QgcGVlc3BpICplc3BpKTsKK2ludCB0MV9lc3BpX2luaXQoc3RydWN0IHBlZXNwaSAqZXNwaSwgaW50IG1hY190eXBlLCBpbnQgbnBvcnRzKTsKKwordm9pZCB0MV9lc3BpX2ludHJfZW5hYmxlKHN0cnVjdCBwZWVzcGkgKik7Cit2b2lkIHQxX2VzcGlfaW50cl9jbGVhcihzdHJ1Y3QgcGVlc3BpICopOwordm9pZCB0MV9lc3BpX2ludHJfZGlzYWJsZShzdHJ1Y3QgcGVlc3BpICopOworaW50IHQxX2VzcGlfaW50cl9oYW5kbGVyKHN0cnVjdCBwZWVzcGkgKik7Citjb25zdCBzdHJ1Y3QgZXNwaV9pbnRyX2NvdW50cyAqdDFfZXNwaV9nZXRfaW50cl9jb3VudHMoc3RydWN0IHBlZXNwaSAqZXNwaSk7CisKK3ZvaWQgdDFfZXNwaV9zZXRfbWlzY19jdHJsKGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIHZhbCk7Cit1MzIgdDFfZXNwaV9nZXRfbW9uKGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIGFkZHIsIHU4IHdhaXQpOworCisjZW5kaWYgLyogX0NYR0JfRVNQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9nbWFjLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL2dtYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDZiMGVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9nbWFjLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGaWxlOiBnbWFjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICRSZXZpc2lvbjogMS42ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJERhdGU6IDIwMDUvMDYvMjEgMTg6Mjk6NDcgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBHZW5lcmljIE1BQyBmdW5jdGlvbmFsaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIHBhcnQgb2YgdGhlIENoZWxzaW8gMTBHYiBFdGhlcm5ldCBEcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcyAgICAgICAqCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgICAqCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICAgICoKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIGh0dHA6Ly93d3cuY2hlbHNpby5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgLSAyMDA1IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gICAgICAgICAgICAgICAgICAgICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBNYWludGFpbmVyczogbWFpbnRhaW5lcnNAY2hlbHNpby5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQXV0aG9yczogRGltaXRyaW9zIE1pY2hhaWxpZGlzICAgPGRtQGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBUaW5hIFlhbmcgICAgICAgICAgICAgICA8dGFpbmF5QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIEZlbGl4IE1hcnRpICAgICAgICAgICAgIDxmZWxpeEBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgU2NvdHQgQmFyZG9uZSAgICAgICAgICAgPHNiYXJkb25lQGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBLdXJ0IE90dGF3YXkgICAgICAgICAgICA8a290dGF3YXlAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIEZyYW5rIERpTWFtYnJvICAgICAgICAgIDxmcmFua0BjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NYR0JfR01BQ19IXworI2RlZmluZSBfQ1hHQl9HTUFDX0hfCisKKyNpbmNsdWRlICJjb21tb24uaCIKKworZW51bSB7IE1BQ19TVEFUU19VUERBVEVfRkFTVCwgTUFDX1NUQVRTX1VQREFURV9GVUxMIH07CitlbnVtIHsgTUFDX0RJUkVDVElPTl9SWCA9IDEsIE1BQ19ESVJFQ1RJT05fVFggPSAyIH07CisKK3N0cnVjdCBjbWFjX3N0YXRpc3RpY3MgeworCS8qIFRyYW5zbWl0ICovCisJdTY0IFR4T2N0ZXRzT0s7CisJdTY0IFR4T2N0ZXRzQmFkOworCXU2NCBUeFVuaWNhc3RGcmFtZXNPSzsKKwl1NjQgVHhNdWx0aWNhc3RGcmFtZXNPSzsKKwl1NjQgVHhCcm9hZGNhc3RGcmFtZXNPSzsKKwl1NjQgVHhQYXVzZUZyYW1lczsKKwl1NjQgVHhGcmFtZXNXaXRoRGVmZXJyZWRYbWlzc2lvbnM7CisJdTY0IFR4TGF0ZUNvbGxpc2lvbnM7CisJdTY0IFR4VG90YWxDb2xsaXNpb25zOworCXU2NCBUeEZyYW1lc0Fib3J0ZWREdWVUb1hTQ29sbGlzaW9uczsKKwl1NjQgVHhVbmRlcnJ1bjsKKwl1NjQgVHhMZW5ndGhFcnJvcnM7CisJdTY0IFR4SW50ZXJuYWxNQUNYbWl0RXJyb3I7CisJdTY0IFR4RnJhbWVzV2l0aEV4Y2Vzc2l2ZURlZmVycmFsOworCXU2NCBUeEZDU0Vycm9yczsKKworCS8qIFJlY2VpdmUgKi8KKwl1NjQgUnhPY3RldHNPSzsKKwl1NjQgUnhPY3RldHNCYWQ7CisJdTY0IFJ4VW5pY2FzdEZyYW1lc09LOworCXU2NCBSeE11bHRpY2FzdEZyYW1lc09LOworCXU2NCBSeEJyb2FkY2FzdEZyYW1lc09LOworCXU2NCBSeFBhdXNlRnJhbWVzOworCXU2NCBSeEZDU0Vycm9yczsKKwl1NjQgUnhBbGlnbkVycm9yczsKKwl1NjQgUnhTeW1ib2xFcnJvcnM7CisJdTY0IFJ4RGF0YUVycm9yczsKKwl1NjQgUnhTZXF1ZW5jZUVycm9yczsKKwl1NjQgUnhSdW50RXJyb3JzOworCXU2NCBSeEphYmJlckVycm9yczsKKwl1NjQgUnhJbnRlcm5hbE1BQ1JjdkVycm9yOworCXU2NCBSeEluUmFuZ2VMZW5ndGhFcnJvcnM7CisJdTY0IFJ4T3V0T2ZSYW5nZUxlbmd0aEZpZWxkOworCXU2NCBSeEZyYW1lVG9vTG9uZ0Vycm9yczsKK307CisKK3N0cnVjdCBjbWFjX29wcyB7CisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBjbWFjICopOworCWludCAoKnJlc2V0KShzdHJ1Y3QgY21hYyAqKTsKKwlpbnQgKCppbnRlcnJ1cHRfZW5hYmxlKShzdHJ1Y3QgY21hYyAqKTsKKwlpbnQgKCppbnRlcnJ1cHRfZGlzYWJsZSkoc3RydWN0IGNtYWMgKik7CisJaW50ICgqaW50ZXJydXB0X2NsZWFyKShzdHJ1Y3QgY21hYyAqKTsKKwlpbnQgKCppbnRlcnJ1cHRfaGFuZGxlcikoc3RydWN0IGNtYWMgKik7CisKKwlpbnQgKCplbmFibGUpKHN0cnVjdCBjbWFjICosIGludCk7CisJaW50ICgqZGlzYWJsZSkoc3RydWN0IGNtYWMgKiwgaW50KTsKKworCWludCAoKmxvb3BiYWNrX2VuYWJsZSkoc3RydWN0IGNtYWMgKik7CisJaW50ICgqbG9vcGJhY2tfZGlzYWJsZSkoc3RydWN0IGNtYWMgKik7CisKKwlpbnQgKCpzZXRfbXR1KShzdHJ1Y3QgY21hYyAqLCBpbnQgbXR1KTsKKwlpbnQgKCpzZXRfcnhfbW9kZSkoc3RydWN0IGNtYWMgKiwgc3RydWN0IHQxX3J4X21vZGUgKnJtKTsKKworCWludCAoKnNldF9zcGVlZF9kdXBsZXhfZmMpKHN0cnVjdCBjbWFjICosIGludCBzcGVlZCwgaW50IGR1cGxleCwgaW50IGZjKTsKKwlpbnQgKCpnZXRfc3BlZWRfZHVwbGV4X2ZjKShzdHJ1Y3QgY21hYyAqLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCwKKwkJCQkgICBpbnQgKmZjKTsKKworCWNvbnN0IHN0cnVjdCBjbWFjX3N0YXRpc3RpY3MgKigqc3RhdGlzdGljc191cGRhdGUpKHN0cnVjdCBjbWFjICosIGludCk7CisKKwlpbnQgKCptYWNhZGRyZXNzX2dldCkoc3RydWN0IGNtYWMgKiwgdTggbWFjX2FkZHJbNl0pOworCWludCAoKm1hY2FkZHJlc3Nfc2V0KShzdHJ1Y3QgY21hYyAqLCB1OCBtYWNfYWRkcls2XSk7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfY21hY19pbnN0YW5jZSBjbWFjX2luc3RhbmNlOworCitzdHJ1Y3QgY21hYyB7CisJc3RydWN0IGNtYWNfc3RhdGlzdGljcyBzdGF0czsKKwlhZGFwdGVyX3QgKmFkYXB0ZXI7CisJc3RydWN0IGNtYWNfb3BzICpvcHM7CisJY21hY19pbnN0YW5jZSAqaW5zdGFuY2U7Cit9OworCitzdHJ1Y3QgZ21hYyB7CisJdW5zaWduZWQgaW50IHN0YXRzX3VwZGF0ZV9wZXJpb2Q7CisJc3RydWN0IGNtYWMgKigqY3JlYXRlKShhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBpbmRleCk7CisJaW50ICgqcmVzZXQpKGFkYXB0ZXJfdCAqKTsKK307CisKK2V4dGVybiBzdHJ1Y3QgZ21hYyB0MV9wbTMzOTNfb3BzOworZXh0ZXJuIHN0cnVjdCBnbWFjIHQxX2NoZWxzaW9fbWFjX29wczsKK2V4dGVybiBzdHJ1Y3QgZ21hYyB0MV92c2M3MzIxX29wczsKK2V4dGVybiBzdHJ1Y3QgZ21hYyB0MV9peGYxMDEwX29wczsKK2V4dGVybiBzdHJ1Y3QgZ21hYyB0MV9kdW1teV9tYWNfb3BzOworCisjZW5kaWYgLyogX0NYR0JfR01BQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9tdjg4eDIwMXguYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OHgyMDF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1MDM0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL212ODh4MjAxeC5jCkBAIC0wLDAgKzEsMjUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRmlsZTogbXY4OHgyMDF4LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAkUmV2aXNpb246IDEuMTIgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICREYXRlOiAyMDA1LzA0LzE1IDE5OjI3OjE0ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgTWFydmVsbCBQSFkgKG12ODh4MjAxeCkgZnVuY3Rpb25hbGl0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBwYXJ0IG9mIHRoZSBDaGVsc2lvIDEwR2IgRXRoZXJuZXQgRHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMgICAgICAgKgorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nICAgKgorICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAgICAqCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vd3d3LmNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIC0gMjAwNSBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuICAgICAgICAgICAgICAgICAgICAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTWFpbnRhaW5lcnM6IG1haW50YWluZXJzQGNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEF1dGhvcnM6IERpbWl0cmlvcyBNaWNoYWlsaWRpcyAgIDxkbUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgVGluYSBZYW5nICAgICAgICAgICAgICAgPHRhaW5heUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGZWxpeCBNYXJ0aSAgICAgICAgICAgICA8ZmVsaXhAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIFNjb3R0IEJhcmRvbmUgICAgICAgICAgIDxzYmFyZG9uZUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgS3VydCBPdHRhd2F5ICAgICAgICAgICAgPGtvdHRhd2F5QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGcmFuayBEaU1hbWJybyAgICAgICAgICA8ZnJhbmtAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY3BoeS5oIgorI2luY2x1ZGUgImVsbWVyMC5oIgorCisvKgorICogVGhlIDg4eDIwMTAgUmV2IEMuIHJlcXVpcmVzIHNvbWUgbGluayBzdGF0dXMgcmVnaXN0ZXJzICogdG8gYmUgcmVhZAorICogdHdpY2UgaW4gb3JkZXIgdG8gZ2V0IHRoZSByaWdodCB2YWx1ZXMuIEZ1dHVyZSAqIHJldmlzaW9ucyB3aWxsIGZpeAorICogdGhpcyBwcm9ibGVtIGFuZCB0aGVuIHRoaXMgbWFjcm8gKiBjYW4gZGlzYXBwZWFyLgorICovCisjZGVmaW5lIE1WODh4MjAxMF9MSU5LX1NUQVRVU19CVUdTICAgIDEKKworc3RhdGljIGludCBsZWRfaW5pdChzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwkvKiBTZXR1cCB0aGUgTEVEIHJlZ2lzdGVycyBzbyB3ZSBjYW4gdHVybiBvbi9vZmYuCisJICogV3JpdGluZyB0aGVzZSBiaXRzIG1hcHMgY29udHJvbCB0byBhbm90aGVyCisJICogcmVnaXN0ZXIuIG1tZCgweDEpIGFkZHIoMHg3KQorCSAqLworCW1kaW9fd3JpdGUoY3BoeSwgMHgzLCAweDgzMDQsIDB4ZGRkZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGVkX2xpbmsoc3RydWN0IGNwaHkgKmNwaHksIHUzMiBkb19lbmFibGUpCit7CisJdTMyIGxlZCA9IDA7CisjZGVmaW5lIExJTktfRU5BQkxFX0JJVCAweDEKKworCW1kaW9fcmVhZChjcGh5LCAweDEsIDB4NywgJmxlZCk7CisKKwlpZiAoZG9fZW5hYmxlICYgTElOS19FTkFCTEVfQklUKSB7CisJCWxlZCB8PSBMSU5LX0VOQUJMRV9CSVQ7CisJCW1kaW9fd3JpdGUoY3BoeSwgMHgxLCAweDcsIGxlZCk7CisJfSBlbHNlIHsKKwkJbGVkICY9IH5MSU5LX0VOQUJMRV9CSVQ7CisJCW1kaW9fd3JpdGUoY3BoeSwgMHgxLCAweDcsIGxlZCk7CisJfQorCXJldHVybiAwOworfQorCisvKiBQb3J0IFJlc2V0ICovCitzdGF0aWMgaW50IG12ODh4MjAxeF9yZXNldChzdHJ1Y3QgY3BoeSAqY3BoeSwgaW50IHdhaXQpCit7CisJLyogVGhpcyBjYW4gYmUgZG9uZSB0aHJvdWdoIHJlZ2lzdGVycy4gIEl0IGlzIG5vdCByZXF1aXJlZCBzaW5jZQorCSAqIGEgZnVsbCBjaGlwIHJlc2V0IGlzIHVzZWQuCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OHgyMDF4X2ludGVycnVwdF9lbmFibGUoc3RydWN0IGNwaHkgKmNwaHkpCit7CisJdTMyIGVsbWVyOworCisJLyogRW5hYmxlIFBIWSBMQVNJIGludGVycnVwdHMuICovCisJbWRpb193cml0ZShjcGh5LCAweDEsIDB4OTAwMiwgMHgxKTsKKworCS8qIEVuYWJsZSBNYXJ2ZWxsIGludGVycnVwdHMgdGhyb3VnaCBFbG1lcjAuICovCisJdDFfdHBpX3JlYWQoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgJmVsbWVyKTsKKwllbG1lciB8PSBFTE1FUjBfR1BfQklUNjsKKwl0MV90cGlfd3JpdGUoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgZWxtZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12ODh4MjAxeF9pbnRlcnJ1cHRfZGlzYWJsZShzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwl1MzIgZWxtZXI7CisKKwkvKiBEaXNhYmxlIFBIWSBMQVNJIGludGVycnVwdHMuICovCisJbWRpb193cml0ZShjcGh5LCAweDEsIDB4OTAwMiwgMHgwKTsKKworCS8qIERpc2FibGUgTWFydmVsbCBpbnRlcnJ1cHRzIHRocm91Z2ggRWxtZXIwLiAqLworCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsICZlbG1lcik7CisJZWxtZXIgJj0gfkVMTUVSMF9HUF9CSVQ2OworCXQxX3RwaV93cml0ZShjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfRU5BQkxFLCBlbG1lcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OHgyMDF4X2ludGVycnVwdF9jbGVhcihzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwl1MzIgZWxtZXI7CisJdTMyIHZhbDsKKworI2lmZGVmIE1WODh4MjAxMF9MSU5LX1NUQVRVU19CVUdTCisJLyogUmVxdWlyZWQgdG8gcmVhZCB0d2ljZSBiZWZvcmUgY2xlYXIgdGFrZXMgYWZmZWN0LiAqLworCW1kaW9fcmVhZChjcGh5LCAweDEsIDB4OTAwMywgJnZhbCk7CisJbWRpb19yZWFkKGNwaHksIDB4MSwgMHg5MDA0LCAmdmFsKTsKKwltZGlvX3JlYWQoY3BoeSwgMHgxLCAweDkwMDUsICZ2YWwpOworCisJLyogUmVhZCB0aGlzIHJlZ2lzdGVyIGFmdGVyIHRoZSBvdGhlcnMgYWJvdmUgaXQgZWxzZQorCSAqIHRoZSByZWdpc3RlciBkb2Vzbid0IGNsZWFyIGNvcnJlY3RseS4KKwkgKi8KKwltZGlvX3JlYWQoY3BoeSwgMHgxLCAweDEsICZ2YWwpOworI2VuZGlmCisKKwkvKiBDbGVhciBsaW5rIHN0YXR1cy4gKi8KKwltZGlvX3JlYWQoY3BoeSwgMHgxLCAweDEsICZ2YWwpOworCS8qIENsZWFyIFBIWSBMQVNJIGludGVycnVwdHMuICovCisJbWRpb19yZWFkKGNwaHksIDB4MSwgMHg5MDA1LCAmdmFsKTsKKworI2lmZGVmIE1WODh4MjAxMF9MSU5LX1NUQVRVU19CVUdTCisJLyogRG8gaXQgYWdhaW4uICovCisJbWRpb19yZWFkKGNwaHksIDB4MSwgMHg5MDAzLCAmdmFsKTsKKwltZGlvX3JlYWQoY3BoeSwgMHgxLCAweDkwMDQsICZ2YWwpOworI2VuZGlmCisKKwkvKiBDbGVhciBNYXJ2ZWxsIGludGVycnVwdHMgdGhyb3VnaCBFbG1lcjAuICovCisJdDFfdHBpX3JlYWQoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0NBVVNFLCAmZWxtZXIpOworCWVsbWVyIHw9IEVMTUVSMF9HUF9CSVQ2OworCXQxX3RwaV93cml0ZShjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfQ0FVU0UsIGVsbWVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4eDIwMXhfaW50ZXJydXB0X2hhbmRsZXIoc3RydWN0IGNwaHkgKmNwaHkpCit7CisJLyogQ2xlYXIgaW50ZXJydXB0cyAqLworCW12ODh4MjAxeF9pbnRlcnJ1cHRfY2xlYXIoY3BoeSk7CisKKwkvKiBXZSBoYXZlIG9ubHkgZW5hYmxlZCBsaW5rIGNoYW5nZSBpbnRlcnJ1cHRzIGFuZCBzbworCSAqIGNwaHlfY2F1c2UgbXVzdCBiZSBhIGxpbmsgY2hhbmdlIGludGVycnVwdC4KKwkgKi8KKwlyZXR1cm4gY3BoeV9jYXVzZV9saW5rX2NoYW5nZTsKK30KKworc3RhdGljIGludCBtdjg4eDIwMXhfc2V0X2xvb3BiYWNrKHN0cnVjdCBjcGh5ICpjcGh5LCBpbnQgb24pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OHgyMDF4X2dldF9saW5rX3N0YXR1cyhzdHJ1Y3QgY3BoeSAqY3BoeSwgaW50ICpsaW5rX29rLAorCQkJCSAgICAgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgsIGludCAqZmMpCit7CisJdTMyIHZhbCA9IDA7CisjZGVmaW5lIExJTktfU1RBVFVTX0JJVCAweDQKKworCWlmIChsaW5rX29rKSB7CisJCS8qIFJlYWQgbGluayBzdGF0dXMuICovCisJCW1kaW9fcmVhZChjcGh5LCAweDEsIDB4MSwgJnZhbCk7CisJCXZhbCAmPSBMSU5LX1NUQVRVU19CSVQ7CisJCSpsaW5rX29rID0gKHZhbCA9PSBMSU5LX1NUQVRVU19CSVQpOworCQkvKiBUdXJuIG9uL29mZiBMaW5rIExFRCAqLworCQlsZWRfbGluayhjcGh5LCAqbGlua19vayk7CisJfQorCWlmIChzcGVlZCkKKwkJKnNwZWVkID0gU1BFRURfMTAwMDA7CisJaWYgKGR1cGxleCkKKwkJKmR1cGxleCA9IERVUExFWF9GVUxMOworCWlmIChmYykKKwkJKmZjID0gUEFVU0VfUlggfCBQQVVTRV9UWDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXY4OHgyMDF4X2Rlc3Ryb3koc3RydWN0IGNwaHkgKmNwaHkpCit7CisJa2ZyZWUoY3BoeSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3BoeV9vcHMgbXY4OHgyMDF4X29wcyA9IHsKKwkuZGVzdHJveSAgICAgICAgICAgPSBtdjg4eDIwMXhfZGVzdHJveSwKKwkucmVzZXQgICAgICAgICAgICAgPSBtdjg4eDIwMXhfcmVzZXQsCisJLmludGVycnVwdF9lbmFibGUgID0gbXY4OHgyMDF4X2ludGVycnVwdF9lbmFibGUsCisJLmludGVycnVwdF9kaXNhYmxlID0gbXY4OHgyMDF4X2ludGVycnVwdF9kaXNhYmxlLAorCS5pbnRlcnJ1cHRfY2xlYXIgICA9IG12ODh4MjAxeF9pbnRlcnJ1cHRfY2xlYXIsCisJLmludGVycnVwdF9oYW5kbGVyID0gbXY4OHgyMDF4X2ludGVycnVwdF9oYW5kbGVyLAorCS5nZXRfbGlua19zdGF0dXMgICA9IG12ODh4MjAxeF9nZXRfbGlua19zdGF0dXMsCisJLnNldF9sb29wYmFjayAgICAgID0gbXY4OHgyMDF4X3NldF9sb29wYmFjaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3BoeSAqbXY4OHgyMDF4X3BoeV9jcmVhdGUoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsCisJCQkJCSBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQoreworCXUzMiB2YWw7CisJc3RydWN0IGNwaHkgKmNwaHkgPSBrbWFsbG9jKHNpemVvZigqY3BoeSksIEdGUF9LRVJORUwpOworCisJaWYgKCFjcGh5KQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoY3BoeSwgMCwgc2l6ZW9mKCpjcGh5KSk7CisJY3BoeV9pbml0KGNwaHksIGFkYXB0ZXIsIHBoeV9hZGRyLCAmbXY4OHgyMDF4X29wcywgbWRpb19vcHMpOworCisJLyogQ29tbWFuZHMgdGhlIFBIWSB0byBlbmFibGUgWEZQJ3MgY2xvY2suICovCisJbWRpb19yZWFkKGNwaHksIDB4MywgMHg4MzAwLCAmdmFsKTsKKwltZGlvX3dyaXRlKGNwaHksIDB4MywgMHg4MzAwLCB2YWwgfCAxKTsKKworCS8qIENsZWFyIGxpbmsgc3RhdHVzLiBSZXF1aXJlZCBiZWNhdXNlIG9mIGEgYnVnIGluIHRoZSBQSFkuICAqLworCW1kaW9fcmVhZChjcGh5LCAweDEsIDB4OCwgJnZhbCk7CisJbWRpb19yZWFkKGNwaHksIDB4MywgMHg4LCAmdmFsKTsKKworCS8qIEFsbG93cyBmb3IgTGluayxBY2sgTEVEIHR1cm4gb24vb2ZmICovCisJbGVkX2luaXQoY3BoeSk7CisJcmV0dXJuIGNwaHk7Cit9CisKKy8qIENoaXAgUmVzZXQgKi8KK3N0YXRpYyBpbnQgbXY4OHgyMDF4X3BoeV9yZXNldChhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJdTMyIHZhbDsKKworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgJnZhbCk7CisJdmFsICY9IH40OworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CisJbXNsZWVwKDEwMCk7CisKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwgfCA0KTsKKwltc2xlZXAoMTAwMCk7CisKKwkvKiBOb3cgbGV0cyBlbmFibGUgdGhlIExhc2VyLiBEZWxheSAxMDB1cyAqLworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgJnZhbCk7CisJdmFsIHw9IDB4ODAwMDsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCXVkZWxheSgxMDApOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZ3BoeSB0MV9tdjg4eDIwMXhfb3BzID0geworCW12ODh4MjAxeF9waHlfY3JlYXRlLAorCW12ODh4MjAxeF9waHlfcmVzZXQKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3BtMzM5My5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9wbTMzOTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGExNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9wbTMzOTMuYwpAQCAtMCwwICsxLDgyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZpbGU6IHBtMzM5My5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJFJldmlzaW9uOiAxLjE2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAkRGF0ZTogMjAwNS8wNS8xNCAwMDo1OTozMiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIFBNQy9TSUVSUkEgKHBtMzM5MykgTUFDLVBIWSBmdW5jdGlvbmFsaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgcGFydCBvZiB0aGUgQ2hlbHNpbyAxMEdiIEV0aGVybmV0IERyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzICAgICAgICoKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyAgICoKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgICAgKgorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogaHR0cDovL3d3dy5jaGVsc2lvLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyAtIDIwMDUgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiAgICAgICAgICAgICAgICAgICAgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIE1haW50YWluZXJzOiBtYWludGFpbmVyc0BjaGVsc2lvLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBBdXRob3JzOiBEaW1pdHJpb3MgTWljaGFpbGlkaXMgICA8ZG1AY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIFRpbmEgWWFuZyAgICAgICAgICAgICAgIDx0YWluYXlAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgRmVsaXggTWFydGkgICAgICAgICAgICAgPGZlbGl4QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBTY290dCBCYXJkb25lICAgICAgICAgICA8c2JhcmRvbmVAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIEt1cnQgT3R0YXdheSAgICAgICAgICAgIDxrb3R0YXdheUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgRnJhbmsgRGlNYW1icm8gICAgICAgICAgPGZyYW5rQGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInJlZ3MuaCIKKyNpbmNsdWRlICJnbWFjLmgiCisjaW5jbHVkZSAiZWxtZXIwLmgiCisjaW5jbHVkZSAic3VuaTF4MTBnZXhwX3JlZ3MuaCIKKworLyogODAyLjNhZSAxMEdiL3MgTURJTyBNYW5hZ2VhYmxlIERldmljZShNTUQpCisgKi8KK2VudW0geworICAgIE1NRF9SRVNFUlZFRCwKKyAgICBNTURfUE1BUE1ELAorICAgIE1NRF9XSVMsCisgICAgTU1EX1BDUywKKyAgICBNTURfUEhZX1hHWFMsCS8qIFhHTUlJIEV4dGVuZGVyIFN1YmxheWVyICovCisgICAgTU1EX0RURV9YR1hTLAorfTsKKworZW51bSB7CisgICAgUEhZX1hHWFNfQ1RSTF8xLAorICAgIFBIWV9YR1hTX1NUQVRVU18xCit9OworCisjZGVmaW5lIE9GRlNFVChSRUdfQUREUikgICAgKFJFR19BRERSIDw8IDIpCisKKy8qIE1heCBmcmFtZSBzaXplIFBNMzM5MyBjYW4gaGFuZGxlLiBJbmNsdWRlcyBFdGhlcm5ldCBoZWFkZXIgYW5kIENSQy4gKi8KKyNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgIDk2MDAKKworI2RlZmluZSBJUEcgMTIKKyNkZWZpbmUgVFhYR19DT05GMV9WQUwgKChJUEcgPDwgU1VOSTF4MTBHRVhQX0JJVE9GRl9UWFhHX0lQR1QpIHwgXAorCVNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR18zMkJJVF9BTElHTiB8IFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR19DUkNFTiB8IFwKKwlTVU5JMXgxMEdFWFBfQklUTVNLX1RYWEdfUEFERU4pCisjZGVmaW5lIFJYWEdfQ09ORjFfVkFMIChTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfUFVSRVAgfCAweDE0IHwgXAorCVNVTkkxeDEwR0VYUF9CSVRNU0tfUlhYR19GTENISyB8IFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhYR19DUkNfU1RSSVApCisKKy8qIFVwZGF0ZSBzdGF0aXN0aWNzIGV2ZXJ5IDE1IG1pbnV0ZXMgKi8KKyNkZWZpbmUgU1RBVFNfVElDS19TRUNTICgxNSAqIDYwKQorCitlbnVtIHsgICAgICAgICAgICAgICAgICAgICAvKiBSTU9OIHJlZ2lzdGVycyAqLworCVJ4T2N0ZXRzUmVjZWl2ZWRPSyA9IFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xX0xPVywKKwlSeFVuaWNhc3RGcmFtZXNSZWNlaXZlZE9LID0gU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzRfTE9XLAorCVJ4TXVsdGljYXN0RnJhbWVzUmVjZWl2ZWRPSyA9IFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl81X0xPVywKKwlSeEJyb2FkY2FzdEZyYW1lc1JlY2VpdmVkT0sgPSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfNl9MT1csCisJUnhQQVVTRU1BQ0N0cmxGcmFtZXNSZWNlaXZlZCA9IFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl84X0xPVywKKwlSeEZyYW1lQ2hlY2tTZXF1ZW5jZUVycm9ycyA9IFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMF9MT1csCisJUnhGcmFtZXNMb3N0RHVlVG9JbnRlcm5hbE1BQ0Vycm9ycyA9IFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xMV9MT1csCisJUnhTeW1ib2xFcnJvcnMgPSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMTJfTE9XLAorCVJ4SW5SYW5nZUxlbmd0aEVycm9ycyA9IFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xM19MT1csCisJUnhGcmFtZXNUb29Mb25nRXJyb3JzID0gU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzE1X0xPVywKKwlSeEphYmJlcnMgPSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMTZfTE9XLAorCVJ4RnJhZ21lbnRzID0gU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzE3X0xPVywKKwlSeFVuZGVyc2l6ZWRGcmFtZXMgPSAgU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzE4X0xPVywKKworCVR4T2N0ZXRzVHJhbnNtaXR0ZWRPSyA9IFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8zM19MT1csCisJVHhGcmFtZXNMb3N0RHVlVG9JbnRlcm5hbE1BQ1RyYW5zbWlzc2lvbkVycm9yID0gU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzM1X0xPVywKKwlUeFRyYW5zbWl0U3lzdGVtRXJyb3IgPSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMzZfTE9XLAorCVR4VW5pY2FzdEZyYW1lc1RyYW5zbWl0dGVkT0sgPSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMzhfTE9XLAorCVR4TXVsdGljYXN0RnJhbWVzVHJhbnNtaXR0ZWRPSyA9IFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl80MF9MT1csCisJVHhCcm9hZGNhc3RGcmFtZXNUcmFuc21pdHRlZE9LID0gU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzQyX0xPVywKKwlUeFBBVVNFTUFDQ3RybEZyYW1lc1RyYW5zbWl0dGVkID0gU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzQzX0xPVworfTsKKworc3RydWN0IF9jbWFjX2luc3RhbmNlIHsKKwl1OCBlbmFibGVkOworCXU4IGZjOworCXU4IG1hY19hZGRyWzZdOworfTsKKworc3RhdGljIGludCBwbXJlYWQoc3RydWN0IGNtYWMgKmNtYWMsIHUzMiByZWcsIHUzMiAqIGRhdGEzMikKK3sKKwl0MV90cGlfcmVhZChjbWFjLT5hZGFwdGVyLCBPRkZTRVQocmVnKSwgZGF0YTMyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbXdyaXRlKHN0cnVjdCBjbWFjICpjbWFjLCB1MzIgcmVnLCB1MzIgZGF0YTMyKQoreworCXQxX3RwaV93cml0ZShjbWFjLT5hZGFwdGVyLCBPRkZTRVQocmVnKSwgZGF0YTMyKTsKKwlyZXR1cm4gMDsKK30KKworLyogUG9ydCByZXNldC4gKi8KK3N0YXRpYyBpbnQgcG0zMzkzX3Jlc2V0KHN0cnVjdCBjbWFjICpjbWFjKQoreworCXJldHVybiAwOworfQorCisvKgorICogRW5hYmxlIGludGVycnVwdHMgZm9yIHRoZSBQTTMzOTMKKworCTEuIEVuYWJsZSBQTTMzOTMgQkxPQ0sgaW50ZXJydXB0cy4KKwkyLiBFbmFibGUgUE0zMzkzIE1hc3RlciBJbnRlcnJ1cHQgYml0KElOVEUpCisJMy4gRW5hYmxlIEVMTUVSJ3MgUE0zMzkzIGJpdC4KKwk0LiBFbmFibGUgVGVybWluYXRvciBleHRlcm5hbCBpbnRlcnJ1cHQuCisqLworc3RhdGljIGludCBwbTMzOTNfaW50ZXJydXB0X2VuYWJsZShzdHJ1Y3QgY21hYyAqY21hYykKK3sKKwl1MzIgcGxfaW50cjsKKworCS8qIFBNMzM5MyAtIEVuYWJsaW5nIGFsbCBoYXJkd2FyZSBibG9jayBpbnRlcnJ1cHRzLgorCSAqLworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19TRVJERVNfMzEyNV9JTlRFUlJVUFRfRU5BQkxFLCAweGZmZmYpOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19YUkZfSU5URVJSVVBUX0VOQUJMRSwgMHhmZmZmKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfWFJGX0RJQUdfSU5URVJSVVBUX0VOQUJMRSwgMHhmZmZmKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fSU5URVJSVVBUX0VOQUJMRSwgMHhmZmZmKTsKKworCS8qIERvbid0IGludGVycnVwdCBvbiBzdGF0aXN0aWNzIG92ZXJmbG93LCB3ZSBhcmUgcG9sbGluZyAqLworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9JTlRFUlJVUFRfTUFTS18wLCAwKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfSU5URVJSVVBUX01BU0tfMSwgMCk7CisJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0lOVEVSUlVQVF9NQVNLXzIsIDApOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9JTlRFUlJVUFRfTUFTS18zLCAwKTsKKworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19JRkxYX0ZJRk9fT1ZFUkZMT1dfRU5BQkxFLCAweGZmZmYpOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19QTDRPRFBfSU5URVJSVVBUX01BU0ssIDB4ZmZmZik7CisJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1hURUZfSU5URVJSVVBUX0VOQUJMRSwgMHhmZmZmKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfVFhPQU1fSU5URVJSVVBUX0VOQUJMRSwgMHhmZmZmKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19DT05GSUdfMywgMHhmZmZmKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUEw0SU9fTE9DS19ERVRFQ1RfTUFTSywgMHhmZmZmKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19DT05GSUdfMywgMHhmZmZmKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUEw0SURVX0lOVEVSUlVQVF9NQVNLLCAweGZmZmYpOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19FRkxYX0ZJRk9fT1ZFUkZMT1dfRVJST1JfRU5BQkxFLCAweGZmZmYpOworCisJLyogUE0zMzkzIC0gR2xvYmFsIGludGVycnVwdCBlbmFibGUKKwkgKi8KKwkvKiBUQkQgWFhYIERpc2FibGUgZm9yIG5vdyB1bnRpbCB3ZSBmaWd1cmUgb3V0IHdoeSBlcnJvciBpbnRlcnJ1cHRzIGtlZXAgYXNzZXJ0aW5nLiAqLworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19HTE9CQUxfSU5URVJSVVBUX0VOQUJMRSwKKwkJMCAvKlNVTkkxeDEwR0VYUF9CSVRNU0tfVE9QX0lOVEUgKi8gKTsKKworCS8qIFRFUk1JTkFUT1IgLSBQTF9JTlRFUlVQVFNfRVhUICovCisJcGxfaW50ciA9IHJlYWRsKGNtYWMtPmFkYXB0ZXItPnJlZ3MgKyBBX1BMX0VOQUJMRSk7CisJcGxfaW50ciB8PSBGX1BMX0lOVFJfRVhUOworCXdyaXRlbChwbF9pbnRyLCBjbWFjLT5hZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtMzM5M19pbnRlcnJ1cHRfZGlzYWJsZShzdHJ1Y3QgY21hYyAqY21hYykKK3sKKwl1MzIgZWxtZXI7CisKKwkvKiBQTTMzOTMgLSBFbmFibGluZyBIVyBpbnRlcnJ1cHQgYmxvY2tzLiAqLworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19TRVJERVNfMzEyNV9JTlRFUlJVUFRfRU5BQkxFLCAwKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfWFJGX0lOVEVSUlVQVF9FTkFCTEUsIDApOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19YUkZfRElBR19JTlRFUlJVUFRfRU5BQkxFLCAwKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhPQU1fSU5URVJSVVBUX0VOQUJMRSwgMCk7CisJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0lOVEVSUlVQVF9NQVNLXzAsIDApOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9JTlRFUlJVUFRfTUFTS18xLCAwKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfSU5URVJSVVBUX01BU0tfMiwgMCk7CisJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0lOVEVSUlVQVF9NQVNLXzMsIDApOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19JRkxYX0ZJRk9fT1ZFUkZMT1dfRU5BQkxFLCAwKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUEw0T0RQX0lOVEVSUlVQVF9NQVNLLCAwKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfWFRFRl9JTlRFUlJVUFRfRU5BQkxFLCAwKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfVFhPQU1fSU5URVJSVVBUX0VOQUJMRSwgMCk7CisJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfQ09ORklHXzMsIDApOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19QTDRJT19MT0NLX0RFVEVDVF9NQVNLLCAwKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19DT05GSUdfMywgMCk7CisJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1BMNElEVV9JTlRFUlJVUFRfTUFTSywgMCk7CisJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX0VGTFhfRklGT19PVkVSRkxPV19FUlJPUl9FTkFCTEUsIDApOworCisJLyogUE0zMzkzIC0gR2xvYmFsIGludGVycnVwdCBlbmFibGUgKi8KKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfR0xPQkFMX0lOVEVSUlVQVF9FTkFCTEUsIDApOworCisJLyogRUxNRVIgLSBFeHRlcm5hbCBjaGlwIGludGVycnVwdHMuICovCisJdDFfdHBpX3JlYWQoY21hYy0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgJmVsbWVyKTsKKwllbG1lciAmPSB+RUxNRVIwX0dQX0JJVDE7CisJdDFfdHBpX3dyaXRlKGNtYWMtPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsIGVsbWVyKTsKKworCS8qIFRFUk1JTkFUT1IgLSBQTF9JTlRFUlVQVFNfRVhUICovCisJLyogRE8gTk9UIERJU0FCTEUgVEVSTUlOQVRPUidzIEVYVEVSTkFMIElOVEVSUlVQVFMuIEFOT1RIRVIgQ0hJUAorCSAqIENPVUxEIFdBTlQgVEhFTSBFTkFCTEVELiBXZSBkaXNhYmxlIFBNMzM5MyBhdCB0aGUgRUxNRVIgbGV2ZWwuCisJICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbTMzOTNfaW50ZXJydXB0X2NsZWFyKHN0cnVjdCBjbWFjICpjbWFjKQoreworCXUzMiBlbG1lcjsKKwl1MzIgcGxfaW50cjsKKwl1MzIgdmFsMzI7CisKKwkvKiBQTTMzOTMgLSBDbGVhcmluZyBIVyBpbnRlcnJ1cHQgYmxvY2tzLiBOb3RlLCB0aGlzIGFzc3VtZXMKKwkgKiAgICAgICAgICBiaXQgV0NJTU9ERT0wIGZvciBhIGNsZWFyLW9uLXJlYWQuCisJICovCisJcG1yZWFkKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfU0VSREVTXzMxMjVfSU5URVJSVVBUX1NUQVRVUywgJnZhbDMyKTsKKwlwbXJlYWQoY21hYywgU1VOSTF4MTBHRVhQX1JFR19YUkZfSU5URVJSVVBUX1NUQVRVUywgJnZhbDMyKTsKKwlwbXJlYWQoY21hYywgU1VOSTF4MTBHRVhQX1JFR19YUkZfRElBR19JTlRFUlJVUFRfU1RBVFVTLCAmdmFsMzIpOworCXBtcmVhZChjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1JYT0FNX0lOVEVSUlVQVF9TVEFUVVMsICZ2YWwzMik7CisJcG1yZWFkKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUEw0T0RQX0lOVEVSUlVQVCwgJnZhbDMyKTsKKwlwbXJlYWQoY21hYywgU1VOSTF4MTBHRVhQX1JFR19YVEVGX0lOVEVSUlVQVF9TVEFUVVMsICZ2YWwzMik7CisJcG1yZWFkKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfSUZMWF9GSUZPX09WRVJGTE9XX0lOVEVSUlVQVCwgJnZhbDMyKTsKKwlwbXJlYWQoY21hYywgU1VOSTF4MTBHRVhQX1JFR19UWE9BTV9JTlRFUlJVUFRfU1RBVFVTLCAmdmFsMzIpOworCXBtcmVhZChjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfSU5URVJSVVBULCAmdmFsMzIpOworCXBtcmVhZChjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1RYWEdfSU5URVJSVVBULCAmdmFsMzIpOworCXBtcmVhZChjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1BMNElEVV9JTlRFUlJVUFQsICZ2YWwzMik7CisJcG1yZWFkKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfRUZMWF9GSUZPX09WRVJGTE9XX0VSUk9SX0lORElDQVRJT04sCisJICAgICAgICZ2YWwzMik7CisJcG1yZWFkKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUEw0SU9fTE9DS19ERVRFQ1RfU1RBVFVTLCAmdmFsMzIpOworCXBtcmVhZChjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1BMNElPX0xPQ0tfREVURUNUX0NIQU5HRSwgJnZhbDMyKTsKKworCS8qIFBNMzM5MyAtIEdsb2JhbCBpbnRlcnJ1cHQgc3RhdHVzCisJICovCisJcG1yZWFkKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfTUFTVEVSX0lOVEVSUlVQVF9TVEFUVVMsICZ2YWwzMik7CisKKwkvKiBFTE1FUiAtIEV4dGVybmFsIGNoaXAgaW50ZXJydXB0cy4KKwkgKi8KKwl0MV90cGlfcmVhZChjbWFjLT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfQ0FVU0UsICZlbG1lcik7CisJZWxtZXIgfD0gRUxNRVIwX0dQX0JJVDE7CisJdDFfdHBpX3dyaXRlKGNtYWMtPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9DQVVTRSwgZWxtZXIpOworCisJLyogVEVSTUlOQVRPUiAtIFBMX0lOVEVSVVBUU19FWFQKKwkgKi8KKwlwbF9pbnRyID0gcmVhZGwoY21hYy0+YWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOworCXBsX2ludHIgfD0gRl9QTF9JTlRSX0VYVDsKKwl3cml0ZWwocGxfaW50ciwgY21hYy0+YWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgaW50IHBtMzM5M19pbnRlcnJ1cHRfaGFuZGxlcihzdHJ1Y3QgY21hYyAqY21hYykKK3sKKwl1MzIgbWFzdGVyX2ludHJfc3RhdHVzOworLyoKKwkxLiBSZWFkIG1hc3RlciBpbnRlcnJ1cHQgcmVnaXN0ZXIuCisJMi4gUmVhZCBCTE9DSydzIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXJzLgorCTMuIEhhbmRsZSBCTE9DSyBpbnRlcnJ1cHRzLgorKi8KKwkvKiBSZWFkIHRoZSBtYXN0ZXIgaW50ZXJydXB0IHN0YXR1cyByZWdpc3Rlci4gKi8KKwlwbXJlYWQoY21hYywgU1VOSTF4MTBHRVhQX1JFR19NQVNURVJfSU5URVJSVVBUX1NUQVRVUywKKwkgICAgICAgJm1hc3Rlcl9pbnRyX3N0YXR1cyk7CisKKwkvKiBUQkQgWFhYIExldHMganVzdCBjbGVhciBldmVyeXRoaW5nIGZvciBub3cgKi8KKwlwbTMzOTNfaW50ZXJydXB0X2NsZWFyKGNtYWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0zMzkzX2VuYWJsZShzdHJ1Y3QgY21hYyAqY21hYywgaW50IHdoaWNoKQoreworCWlmICh3aGljaCAmIE1BQ19ESVJFQ1RJT05fUlgpCisJCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0NPTkZJR18xLAorCQkJKFJYWEdfQ09ORjFfVkFMIHwgU1VOSTF4MTBHRVhQX0JJVE1TS19SWFhHX1JYRU4pKTsKKworCWlmICh3aGljaCAmIE1BQ19ESVJFQ1RJT05fVFgpIHsKKwkJdTMyIHZhbCA9IFRYWEdfQ09ORjFfVkFMIHwgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX1RYRU4wOworCisJCWlmIChjbWFjLT5pbnN0YW5jZS0+ZmMgJiBQQVVTRV9SWCkKKwkJCXZhbCB8PSBTVU5JMXgxMEdFWFBfQklUTVNLX1RYWEdfRkNSWDsKKwkJaWYgKGNtYWMtPmluc3RhbmNlLT5mYyAmIFBBVVNFX1RYKQorCQkJdmFsIHw9IFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR19GQ1RYOworCQlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfVFhYR19DT05GSUdfMSwgdmFsKTsKKwl9CisKKwljbWFjLT5pbnN0YW5jZS0+ZW5hYmxlZCB8PSB3aGljaDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbTMzOTNfZW5hYmxlX3BvcnQoc3RydWN0IGNtYWMgKmNtYWMsIGludCB3aGljaCkKK3sKKwkvKiBDbGVhciBwb3J0IHN0YXRpc3RpY3MgKi8KKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09OVFJPTCwKKwkJU1VOSTF4MTBHRVhQX0JJVE1TS19NU1RBVF9DTEVBUik7CisJdWRlbGF5KDIpOworCW1lbXNldCgmY21hYy0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgY21hY19zdGF0aXN0aWNzKSk7CisKKwlwbTMzOTNfZW5hYmxlKGNtYWMsIHdoaWNoKTsKKworCS8qCisJICogWFhYIFRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgdGhlIFBIWSBhbmQgcHJlZmVycmFibHkgbm90IGF0IGFsbC4KKwkgKiBUaGUgUEhZIGRvZXNuJ3QgZ2l2ZSB1cyBsaW5rIHN0YXR1cyBpbmRpY2F0aW9uIG9uIGl0cyBvd24gc28gaGF2ZQorCSAqIHRoZSBsaW5rIG1hbmFnZW1lbnQgY29kZSBxdWVyeSBpdCBpbnN0ZWFkLgorCSAqLworCXsKKwkJZXh0ZXJuIHZvaWQgbGlua19jaGFuZ2VkKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHBvcnRfaWQpOworCisJCWxpbmtfY2hhbmdlZChjbWFjLT5hZGFwdGVyLCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0zMzkzX2Rpc2FibGUoc3RydWN0IGNtYWMgKmNtYWMsIGludCB3aGljaCkKK3sKKwlpZiAod2hpY2ggJiBNQUNfRElSRUNUSU9OX1JYKQorCQlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19DT05GSUdfMSwgUlhYR19DT05GMV9WQUwpOworCWlmICh3aGljaCAmIE1BQ19ESVJFQ1RJT05fVFgpCisJCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19UWFhHX0NPTkZJR18xLCBUWFhHX0NPTkYxX1ZBTCk7CisKKwkvKgorCSAqIFRoZSBkaXNhYmxlIGlzIGdyYWNlZnVsLiBHaXZlIHRoZSBQTTMzOTMgdGltZS4gIENhbid0IHdhaXQgdmVyeQorCSAqIGxvbmcgaGVyZSwgd2UgbWF5IGJlIGhvbGRpbmcgbG9ja3MuCisJICovCisJdWRlbGF5KDIwKTsKKworCWNtYWMtPmluc3RhbmNlLT5lbmFibGVkICY9IH53aGljaDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbTMzOTNfbG9vcGJhY2tfZW5hYmxlKHN0cnVjdCBjbWFjICpjbWFjKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtMzM5M19sb29wYmFja19kaXNhYmxlKHN0cnVjdCBjbWFjICpjbWFjKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtMzM5M19zZXRfbXR1KHN0cnVjdCBjbWFjICpjbWFjLCBpbnQgbXR1KQoreworCWludCBlbmFibGVkID0gY21hYy0+aW5zdGFuY2UtPmVuYWJsZWQ7CisKKwkvKiBNQVhfRlJBTUVfU0laRSBpbmNsdWRlcyBoZWFkZXIgKyBGQ1MsIG10dSBkb2Vzbid0ICovCisJbXR1ICs9IDE0ICsgNDsKKwlpZiAobXR1ID4gTUFYX0ZSQU1FX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRGlzYWJsZSBSeC9UeCBNQUMgYmVmb3JlIGNvbmZpZ3VyaW5nIGl0LiAqLworCWlmIChlbmFibGVkKQorCQlwbTMzOTNfZGlzYWJsZShjbWFjLCBNQUNfRElSRUNUSU9OX1JYIHwgTUFDX0RJUkVDVElPTl9UWCk7CisKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19NQVhfRlJBTUVfTEVOR1RILCBtdHUpOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19UWFhHX01BWF9GUkFNRV9TSVpFLCBtdHUpOworCisJaWYgKGVuYWJsZWQpCisJCXBtMzM5M19lbmFibGUoY21hYywgZW5hYmxlZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgY2FsY19jcmModTggKmIsIGludCBsZW4pCit7CisJaW50IGk7CisJdTMyIGNyYyA9ICh1MzIpfjA7CisKKwkvKiBjYWxjdWxhdGUgY3JjIG9uZSBiaXQgYXQgYSB0aW1lICovCisJd2hpbGUgKGxlbi0tKSB7CisJCWNyYyBePSAqYisrOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAoY3JjICYgMHgxKQorCQkJCWNyYyA9IChjcmMgPj4gMSkgXiAweGVkYjg4MzIwOworCQkJZWxzZQorCQkJCWNyYyA9IChjcmMgPj4gMSk7CisJCX0KKwl9CisKKwkvKiByZXZlcnNlIGJpdHMgKi8KKwljcmMgPSAoKGNyYyA+PiA0KSAmIDB4MGYwZjBmMGYpIHwgKChjcmMgPDwgNCkgJiAweGYwZjBmMGYwKTsKKwljcmMgPSAoKGNyYyA+PiAyKSAmIDB4MzMzMzMzMzMpIHwgKChjcmMgPDwgMikgJiAweGNjY2NjY2NjKTsKKwljcmMgPSAoKGNyYyA+PiAxKSAmIDB4NTU1NTU1NTUpIHwgKChjcmMgPDwgMSkgJiAweGFhYWFhYWFhKTsKKwkvKiBzd2FwIGJ5dGVzICovCisJY3JjID0gKGNyYyA+PiAxNikgfCAoY3JjIDw8IDE2KTsKKwljcmMgPSAoY3JjID4+IDggJiAweDAwZmYwMGZmKSB8IChjcmMgPDwgOCAmIDB4ZmYwMGZmMDApOworCisJcmV0dXJuIGNyYzsKK30KKworc3RhdGljIGludCBwbTMzOTNfc2V0X3J4X21vZGUoc3RydWN0IGNtYWMgKmNtYWMsIHN0cnVjdCB0MV9yeF9tb2RlICpybSkKK3sKKwlpbnQgZW5hYmxlZCA9IGNtYWMtPmluc3RhbmNlLT5lbmFibGVkICYgTUFDX0RJUkVDVElPTl9SWDsKKwl1MzIgcnhfbW9kZTsKKworCS8qIERpc2FibGUgTUFDIFJYIGJlZm9yZSByZWNvbmZpZ3VyaW5nIGl0ICovCisJaWYgKGVuYWJsZWQpCisJCXBtMzM5M19kaXNhYmxlKGNtYWMsIE1BQ19ESVJFQ1RJT05fUlgpOworCisJcG1yZWFkKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19BRERSRVNTX0ZJTFRFUl9DT05UUk9MXzIsICZyeF9tb2RlKTsKKwlyeF9tb2RlICY9IH4oU1VOSTF4MTBHRVhQX0JJVE1TS19SWFhHX1BNT0RFIHwKKwkJICAgICBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfTUhBU0hfRU4pOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0FERFJFU1NfRklMVEVSX0NPTlRST0xfMiwKKwkJKHUxNilyeF9tb2RlKTsKKworCWlmICh0MV9yeF9tb2RlX3Byb21pc2Mocm0pKSB7CisJCS8qIFByb21pc2N1b3VzIG1vZGUuICovCisJCXJ4X21vZGUgfD0gU1VOSTF4MTBHRVhQX0JJVE1TS19SWFhHX1BNT0RFOworCX0KKwlpZiAodDFfcnhfbW9kZV9hbGxtdWx0aShybSkpIHsKKwkJLyogQWNjZXB0IGFsbCBtdWx0aWNhc3QuICovCisJCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19SWFhHX01VTFRJQ0FTVF9IQVNIX0xPVywgMHhmZmZmKTsKKwkJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfTVVMVElDQVNUX0hBU0hfTUlETE9XLCAweGZmZmYpOworCQlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19NVUxUSUNBU1RfSEFTSF9NSURISUdILCAweGZmZmYpOworCQlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19NVUxUSUNBU1RfSEFTSF9ISUdILCAweGZmZmYpOworCQlyeF9tb2RlIHw9IFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhYR19NSEFTSF9FTjsKKwl9IGVsc2UgaWYgKHQxX3J4X21vZGVfbWNfY250KHJtKSkgeworCQkvKiBBY2NlcHQgb25lIG9yIG1vcmUgbXVsdGljYXN0KHMpLiAqLworCQl1OCAqYWRkcjsKKwkJaW50IGJpdDsKKwkJdTE2IG1jX2ZpbHRlcls0XSA9IHsgMCwgfTsKKworCQl3aGlsZSAoKGFkZHIgPSB0MV9nZXRfbmV4dF9tY2FkZHIocm0pKSkgeworCQkJYml0ID0gKGNhbGNfY3JjKGFkZHIsIEVUSF9BTEVOKSA+PiAyMykgJiAweDNmOwkvKiBiaXRbMjM6MjhdICovCisJCQltY19maWx0ZXJbYml0ID4+IDRdIHw9IDEgPDwgKGJpdCAmIDB4Zik7CisJCX0KKwkJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfTVVMVElDQVNUX0hBU0hfTE9XLCBtY19maWx0ZXJbMF0pOworCQlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19NVUxUSUNBU1RfSEFTSF9NSURMT1csIG1jX2ZpbHRlclsxXSk7CisJCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19SWFhHX01VTFRJQ0FTVF9IQVNIX01JREhJR0gsIG1jX2ZpbHRlclsyXSk7CisJCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19SWFhHX01VTFRJQ0FTVF9IQVNIX0hJR0gsIG1jX2ZpbHRlclszXSk7CisJCXJ4X21vZGUgfD0gU1VOSTF4MTBHRVhQX0JJVE1TS19SWFhHX01IQVNIX0VOOworCX0KKworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0FERFJFU1NfRklMVEVSX0NPTlRST0xfMiwgKHUxNilyeF9tb2RlKTsKKworCWlmIChlbmFibGVkKQorCQlwbTMzOTNfZW5hYmxlKGNtYWMsIE1BQ19ESVJFQ1RJT05fUlgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0zMzkzX2dldF9zcGVlZF9kdXBsZXhfZmMoc3RydWN0IGNtYWMgKmNtYWMsIGludCAqc3BlZWQsCisJCQkJICAgICAgaW50ICpkdXBsZXgsIGludCAqZmMpCit7CisJaWYgKHNwZWVkKQorCQkqc3BlZWQgPSBTUEVFRF8xMDAwMDsKKwlpZiAoZHVwbGV4KQorCQkqZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJaWYgKGZjKQorCQkqZmMgPSBjbWFjLT5pbnN0YW5jZS0+ZmM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0zMzkzX3NldF9zcGVlZF9kdXBsZXhfZmMoc3RydWN0IGNtYWMgKmNtYWMsIGludCBzcGVlZCwgaW50IGR1cGxleCwKKwkJCQkgICAgICBpbnQgZmMpCit7CisJaWYgKHNwZWVkID49IDAgJiYgc3BlZWQgIT0gU1BFRURfMTAwMDApCisJCXJldHVybiAtMTsKKwlpZiAoZHVwbGV4ID49IDAgJiYgZHVwbGV4ICE9IERVUExFWF9GVUxMKQorCQlyZXR1cm4gLTE7CisJaWYgKGZjICYgfihQQVVTRV9UWCB8IFBBVVNFX1JYKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGZjICE9IGNtYWMtPmluc3RhbmNlLT5mYykgeworCQljbWFjLT5pbnN0YW5jZS0+ZmMgPSAodTgpIGZjOworCQlpZiAoY21hYy0+aW5zdGFuY2UtPmVuYWJsZWQgJiBNQUNfRElSRUNUSU9OX1RYKQorCQkJcG0zMzkzX2VuYWJsZShjbWFjLCBNQUNfRElSRUNUSU9OX1RYKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUk1PTl9VUERBVEUobWFjLCBuYW1lLCBzdGF0X25hbWUpIFwKKwl7IFwKKwkJdDFfdHBpX3JlYWQoKG1hYyktPmFkYXB0ZXIsIE9GRlNFVChuYW1lKSwgJnZhbDApOwlcCisJCXQxX3RwaV9yZWFkKChtYWMpLT5hZGFwdGVyLCBPRkZTRVQoKChuYW1lKSsxKSksICZ2YWwxKTsgXAorCQl0MV90cGlfcmVhZCgobWFjKS0+YWRhcHRlciwgT0ZGU0VUKCgobmFtZSkrMikpLCAmdmFsMik7IFwKKwkJKG1hYyktPnN0YXRzLnN0YXRfbmFtZSA9ICgodTY0KXZhbDAgJiAweGZmZmYpIHwgXAorCQkJCQkJKCgodTY0KXZhbDEgJiAweGZmZmYpIDw8IDE2KSB8IFwKKwkJCQkJCSgoKHU2NCl2YWwyICYgMHhmZikgPDwgMzIpIHwgXAorCQkJCQkJKChtYWMpLT5zdGF0cy5zdGF0X25hbWUgJiBcCisJCQkJCQkJKH4odTY0KTAgPDwgNDApKTsgXAorCQlpZiAocm8gJglcCisJCQkoKG5hbWUgLSAgU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSXzBfTE9XKSA+PiAyKSkgXAorCQkJKG1hYyktPnN0YXRzLnN0YXRfbmFtZSArPSAoKHU2NCkxIDw8IDQwKTsgXAorCX0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbWFjX3N0YXRpc3RpY3MgKnBtMzM5M191cGRhdGVfc3RhdGlzdGljcyhzdHJ1Y3QgY21hYyAqbWFjLAorCQkJCQkJCSAgICAgIGludCBmbGFnKQoreworCXU2NAlybzsKKwl1MzIJdmFsMCwgdmFsMSwgdmFsMiwgdmFsMzsKKworCS8qIFNuYXAgdGhlIGNvdW50ZXJzICovCisJcG13cml0ZShtYWMsIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09OVFJPTCwKKwkJU1VOSTF4MTBHRVhQX0JJVE1TS19NU1RBVF9TTkFQKTsKKworCS8qIENvdW50ZXIgcm9sbG92ZXIsIGNsZWFyIG9uIHJlYWQgKi8KKwlwbXJlYWQobWFjLCBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfUk9MTE9WRVJfMCwgJnZhbDApOworCXBtcmVhZChtYWMsIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl9ST0xMT1ZFUl8xLCAmdmFsMSk7CisJcG1yZWFkKG1hYywgU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT1VOVEVSX1JPTExPVkVSXzIsICZ2YWwyKTsKKwlwbXJlYWQobWFjLCBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfUk9MTE9WRVJfMywgJnZhbDMpOworCXJvID0gKCh1NjQpdmFsMCAmIDB4ZmZmZikgfCAoKCh1NjQpdmFsMSAmIDB4ZmZmZikgPDwgMTYpIHwKKwkJKCgodTY0KXZhbDIgJiAweGZmZmYpIDw8IDMyKSB8ICgoKHU2NCl2YWwzICYgMHhmZmZmKSA8PCA0OCk7CisKKwkvKiBSeCBzdGF0cyAqLworCVJNT05fVVBEQVRFKG1hYywgUnhPY3RldHNSZWNlaXZlZE9LLCBSeE9jdGV0c09LKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4VW5pY2FzdEZyYW1lc1JlY2VpdmVkT0ssIFJ4VW5pY2FzdEZyYW1lc09LKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4TXVsdGljYXN0RnJhbWVzUmVjZWl2ZWRPSywgUnhNdWx0aWNhc3RGcmFtZXNPSyk7CisJUk1PTl9VUERBVEUobWFjLCBSeEJyb2FkY2FzdEZyYW1lc1JlY2VpdmVkT0ssIFJ4QnJvYWRjYXN0RnJhbWVzT0spOworCVJNT05fVVBEQVRFKG1hYywgUnhQQVVTRU1BQ0N0cmxGcmFtZXNSZWNlaXZlZCwgUnhQYXVzZUZyYW1lcyk7CisJUk1PTl9VUERBVEUobWFjLCBSeEZyYW1lQ2hlY2tTZXF1ZW5jZUVycm9ycywgUnhGQ1NFcnJvcnMpOworCVJNT05fVVBEQVRFKG1hYywgUnhGcmFtZXNMb3N0RHVlVG9JbnRlcm5hbE1BQ0Vycm9ycywKKwkJCQlSeEludGVybmFsTUFDUmN2RXJyb3IpOworCVJNT05fVVBEQVRFKG1hYywgUnhTeW1ib2xFcnJvcnMsIFJ4U3ltYm9sRXJyb3JzKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4SW5SYW5nZUxlbmd0aEVycm9ycywgUnhJblJhbmdlTGVuZ3RoRXJyb3JzKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4RnJhbWVzVG9vTG9uZ0Vycm9ycyAsIFJ4RnJhbWVUb29Mb25nRXJyb3JzKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4SmFiYmVycywgUnhKYWJiZXJFcnJvcnMpOworCVJNT05fVVBEQVRFKG1hYywgUnhGcmFnbWVudHMsIFJ4UnVudEVycm9ycyk7CisJUk1PTl9VUERBVEUobWFjLCBSeFVuZGVyc2l6ZWRGcmFtZXMsIFJ4UnVudEVycm9ycyk7CisKKwkvKiBUeCBzdGF0cyAqLworCVJNT05fVVBEQVRFKG1hYywgVHhPY3RldHNUcmFuc21pdHRlZE9LLCBUeE9jdGV0c09LKTsKKwlSTU9OX1VQREFURShtYWMsIFR4RnJhbWVzTG9zdER1ZVRvSW50ZXJuYWxNQUNUcmFuc21pc3Npb25FcnJvciwKKwkJCQlUeEludGVybmFsTUFDWG1pdEVycm9yKTsKKwlSTU9OX1VQREFURShtYWMsIFR4VHJhbnNtaXRTeXN0ZW1FcnJvciwgVHhGQ1NFcnJvcnMpOworCVJNT05fVVBEQVRFKG1hYywgVHhVbmljYXN0RnJhbWVzVHJhbnNtaXR0ZWRPSywgVHhVbmljYXN0RnJhbWVzT0spOworCVJNT05fVVBEQVRFKG1hYywgVHhNdWx0aWNhc3RGcmFtZXNUcmFuc21pdHRlZE9LLCBUeE11bHRpY2FzdEZyYW1lc09LKTsKKwlSTU9OX1VQREFURShtYWMsIFR4QnJvYWRjYXN0RnJhbWVzVHJhbnNtaXR0ZWRPSywgVHhCcm9hZGNhc3RGcmFtZXNPSyk7CisJUk1PTl9VUERBVEUobWFjLCBUeFBBVVNFTUFDQ3RybEZyYW1lc1RyYW5zbWl0dGVkLCBUeFBhdXNlRnJhbWVzKTsKKworCXJldHVybiAmbWFjLT5zdGF0czsKK30KKworc3RhdGljIGludCBwbTMzOTNfbWFjYWRkcmVzc19nZXQoc3RydWN0IGNtYWMgKmNtYWMsIHU4IG1hY19hZGRyWzZdKQoreworCW1lbWNweShtYWNfYWRkciwgY21hYy0+aW5zdGFuY2UtPm1hY19hZGRyLCA2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbTMzOTNfbWFjYWRkcmVzc19zZXQoc3RydWN0IGNtYWMgKmNtYWMsIHU4IG1hWzZdKQoreworCXUzMiB2YWwsIGxvLCBtaWQsIGhpLCBlbmFibGVkID0gY21hYy0+aW5zdGFuY2UtPmVuYWJsZWQ7CisKKwkvKgorCSAqIE1BQyBhZGRyOiAwMDowNzo0MzowMDoxMzowOQorCSAqCisJICogbWFbNV0gPSAweDA5CisJICogbWFbNF0gPSAweDEzCisJICogbWFbM10gPSAweDAwCisJICogbWFbMl0gPSAweDQzCisJICogbWFbMV0gPSAweDA3CisJICogbWFbMF0gPSAweDAwCisJICoKKwkgKiBUaGUgUE0zMzkzIHJlcXVpcmVzIGJ5dGUgc3dhcHBpbmcgYW5kIHJldmVyc2Ugb3JkZXIgZW50cnkKKwkgKiB3aGVuIHByb2dyYW1taW5nIE1BQyBhZGRyZXNzZXM6CisJICoKKwkgKiBsb3dfYml0c1sxNTowXSAgICA9IG1hWzFdOm1hWzBdCisJICogbWlkX2JpdHNbMzE6MTZdICAgPSBtYVszXTptYVsyXQorCSAqIGhpZ2hfYml0c1s0NzozMl0gID0gbWFbNV06bWFbNF0KKwkgKi8KKworCS8qIFN0b3JlIGxvY2FsIGNvcHkgKi8KKwltZW1jcHkoY21hYy0+aW5zdGFuY2UtPm1hY19hZGRyLCBtYSwgNik7CisKKwlsbyA9ICgodTMyKSBtYVsxXSA8PCA4KSB8ICh1MzIpIG1hWzBdOworCW1pZCA9ICgodTMyKSBtYVszXSA8PCA4KSB8ICh1MzIpIG1hWzJdOworCWhpID0gKCh1MzIpIG1hWzVdIDw8IDgpIHwgKHUzMikgbWFbNF07CisKKwkvKiBEaXNhYmxlIFJ4L1R4IE1BQyBiZWZvcmUgY29uZmlndXJpbmcgaXQuICovCisJaWYgKGVuYWJsZWQpCisJCXBtMzM5M19kaXNhYmxlKGNtYWMsIE1BQ19ESVJFQ1RJT05fUlggfCBNQUNfRElSRUNUSU9OX1RYKTsKKworCS8qIFNldCBSWFhHIFN0YXRpb24gQWRkcmVzcyAqLworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19SWFhHX1NBXzE1XzAsIGxvKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19TQV8zMV8xNiwgbWlkKTsKKwlwbXdyaXRlKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19TQV80N18zMiwgaGkpOworCisJLyogU2V0IFRYWEcgU3RhdGlvbiBBZGRyZXNzICovCisJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1RYWEdfU0FfMTVfMCwgbG8pOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19UWFhHX1NBXzMxXzE2LCBtaWQpOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19UWFhHX1NBXzQ3XzMyLCBoaSk7CisKKwkvKiBTZXR1cCBFeGFjdCBNYXRjaCBGaWx0ZXIgMSB3aXRoIG91ciBNQUMgYWRkcmVzcworCSAqCisJICogTXVzdCBkaXNhYmxlIGV4YWN0IG1hdGNoIGZpbHRlciBiZWZvcmUgY29uZmlndXJpbmcgaXQuCisJICovCisJcG1yZWFkKGNtYWMsIFNVTkkxeDEwR0VYUF9SRUdfUlhYR19BRERSRVNTX0ZJTFRFUl9DT05UUk9MXzAsICZ2YWwpOworCXZhbCAmPSAweGZmMGY7CisJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfQUREUkVTU19GSUxURVJfQ09OVFJPTF8wLCB2YWwpOworCisJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfRVhBQ1RfTUFUQ0hfQUREUl8xX0xPVywgbG8pOworCXBtd3JpdGUoY21hYywgU1VOSTF4MTBHRVhQX1JFR19SWFhHX0VYQUNUX01BVENIX0FERFJfMV9NSUQsIG1pZCk7CisJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfRVhBQ1RfTUFUQ0hfQUREUl8xX0hJR0gsIGhpKTsKKworCXZhbCB8PSAweDAwOTA7CisJcG13cml0ZShjbWFjLCBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfQUREUkVTU19GSUxURVJfQ09OVFJPTF8wLCB2YWwpOworCisJaWYgKGVuYWJsZWQpCisJCXBtMzM5M19lbmFibGUoY21hYywgZW5hYmxlZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBtMzM5M19kZXN0cm95KHN0cnVjdCBjbWFjICpjbWFjKQoreworCWtmcmVlKGNtYWMpOworfQorCitzdGF0aWMgc3RydWN0IGNtYWNfb3BzIHBtMzM5M19vcHMgPSB7CisJLmRlc3Ryb3kgICAgICAgICAgICAgICAgID0gcG0zMzkzX2Rlc3Ryb3ksCisJLnJlc2V0ICAgICAgICAgICAgICAgICAgID0gcG0zMzkzX3Jlc2V0LAorCS5pbnRlcnJ1cHRfZW5hYmxlICAgICAgICA9IHBtMzM5M19pbnRlcnJ1cHRfZW5hYmxlLAorCS5pbnRlcnJ1cHRfZGlzYWJsZSAgICAgICA9IHBtMzM5M19pbnRlcnJ1cHRfZGlzYWJsZSwKKwkuaW50ZXJydXB0X2NsZWFyICAgICAgICAgPSBwbTMzOTNfaW50ZXJydXB0X2NsZWFyLAorCS5pbnRlcnJ1cHRfaGFuZGxlciAgICAgICA9IHBtMzM5M19pbnRlcnJ1cHRfaGFuZGxlciwKKwkuZW5hYmxlICAgICAgICAgICAgICAgICAgPSBwbTMzOTNfZW5hYmxlX3BvcnQsCisJLmRpc2FibGUgICAgICAgICAgICAgICAgID0gcG0zMzkzX2Rpc2FibGUsCisJLmxvb3BiYWNrX2VuYWJsZSAgICAgICAgID0gcG0zMzkzX2xvb3BiYWNrX2VuYWJsZSwKKwkubG9vcGJhY2tfZGlzYWJsZSAgICAgICAgPSBwbTMzOTNfbG9vcGJhY2tfZGlzYWJsZSwKKwkuc2V0X210dSAgICAgICAgICAgICAgICAgPSBwbTMzOTNfc2V0X210dSwKKwkuc2V0X3J4X21vZGUgICAgICAgICAgICAgPSBwbTMzOTNfc2V0X3J4X21vZGUsCisJLmdldF9zcGVlZF9kdXBsZXhfZmMgICAgID0gcG0zMzkzX2dldF9zcGVlZF9kdXBsZXhfZmMsCisJLnNldF9zcGVlZF9kdXBsZXhfZmMgICAgID0gcG0zMzkzX3NldF9zcGVlZF9kdXBsZXhfZmMsCisJLnN0YXRpc3RpY3NfdXBkYXRlICAgICAgID0gcG0zMzkzX3VwZGF0ZV9zdGF0aXN0aWNzLAorCS5tYWNhZGRyZXNzX2dldCAgICAgICAgICA9IHBtMzM5M19tYWNhZGRyZXNzX2dldCwKKwkubWFjYWRkcmVzc19zZXQgICAgICAgICAgPSBwbTMzOTNfbWFjYWRkcmVzc19zZXQKK307CisKK3N0YXRpYyBzdHJ1Y3QgY21hYyAqcG0zMzkzX21hY19jcmVhdGUoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGNtYWMgKmNtYWM7CisKKwljbWFjID0ga21hbGxvYyhzaXplb2YoKmNtYWMpICsgc2l6ZW9mKGNtYWNfaW5zdGFuY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNtYWMpCisJCXJldHVybiBOVUxMOworCW1lbXNldChjbWFjLCAwLCBzaXplb2YoKmNtYWMpKTsKKworCWNtYWMtPm9wcyA9ICZwbTMzOTNfb3BzOworCWNtYWMtPmluc3RhbmNlID0gKGNtYWNfaW5zdGFuY2UgKikgKGNtYWMgKyAxKTsKKwljbWFjLT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbWFjLT5pbnN0YW5jZS0+ZmMgPSBQQVVTRV9UWCB8IFBBVVNFX1JYOworCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDAwMDEpLCAweDAwMDA4MDAwKTsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MDAwMSksIDB4MDAwMDAwMDApOworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMzA4KSwgMHgwMDAwOTgwMCk7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIzMDUpLCAweDAwMDAxMDAxKTsgICAvKiBQTDRJTyBFbmFibGUgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjMyMCksIDB4MDAwMDg4MDApOworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMzIxKSwgMHgwMDAwODgwMCk7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIzMjIpLCAweDAwMDA4ODAwKTsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjMyMyksIDB4MDAwMDg4MDApOworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMzI0KSwgMHgwMDAwODgwMCk7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIzMjUpLCAweDAwMDA4ODAwKTsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjMyNiksIDB4MDAwMDg4MDApOworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMzI3KSwgMHgwMDAwODgwMCk7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIzMjgpLCAweDAwMDA4ODAwKTsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjMyOSksIDB4MDAwMDg4MDApOworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMzJhKSwgMHgwMDAwODgwMCk7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIzMmIpLCAweDAwMDA4ODAwKTsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjMyYyksIDB4MDAwMDg4MDApOworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMzJkKSwgMHgwMDAwODgwMCk7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIzMmUpLCAweDAwMDA4ODAwKTsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjMyZiksIDB4MDAwMDg4MDApOworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMzBkKSwgMHgwMDAwOWMwMCk7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIzMDQpLCAweDAwMDAwMjAyKTsJLyogUEw0SU8gQ2FsZW5kYXIgUmVwZXRpdGlvbnMgKi8KKworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgzMjAwKSwgMHgwMDAwODA4MCk7CS8qIEVGTFggRW5hYmxlICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDMyMTApLCAweDAwMDAwMDAwKTsJLyogRUZMWCBDaGFubmVsIERlcHJvdmlzaW9uICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDMyMDMpLCAweDAwMDAwMDAwKTsJLyogRUZMWCBMb3cgTGltaXQgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MzIwNCksIDB4MDAwMDAwNDApOwkvKiBFRkxYIEhpZ2ggTGltaXQgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MzIwNSksIDB4MDAwMDAyY2MpOwkvKiBFRkxYIEFsbW9zdCBGdWxsICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDMyMDYpLCAweDAwMDAwMTk5KTsJLyogRUZMWCBBbG1vc3QgRW1wdHkgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MzIwNyksIDB4MDAwMDAyNDApOwkvKiBFRkxYIEN1dCBUaHJvdWdoIFRocmVzaG9sZCAqLworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgzMjAyKSwgMHgwMDAwMDAwMCk7CS8qIEVGTFggSW5kaXJlY3QgUmVnaXN0ZXIgVXBkYXRlICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDMyMTApLCAweDAwMDAwMDAxKTsJLyogRUZMWCBDaGFubmVsIFByb3Zpc2lvbiAqLworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgzMjA4KSwgMHgwMDAwZmZmZik7CS8qIEVGTFggVW5kb2N1bWVudGVkICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDMyMGEpLCAweDAwMDBmZmZmKTsJLyogRUZMWCBVbmRvY3VtZW50ZWQgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MzIwYyksIDB4MDAwMGZmZmYpOwkvKiBFRkxYIGVuYWJsZSBvdmVyZmxvdyBpbnRlcnJ1cHQgVGhlIG90aGVyIGJpdCBhcmUgdW5kb2N1bWVudGVkICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDMyMGUpLCAweDAwMDBmZmZmKTsJLyogRUZMWCBVbmRvY3VtZW50ZWQgKi8KKworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMjAwKSwgMHgwMDAwYzAwMCk7CS8qIElGTFggQ29uZmlndXJhdGlvbiAtIGVuYWJsZSAqLworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMjAxKSwgMHgwMDAwMDAwMCk7CS8qIElGTFggQ2hhbm5lbCBEZXByb3Zpc2lvbiAqLworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMjBlKSwgMHgwMDAwMDAwMCk7CS8qIElGTFggTG93IExpbWl0ICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIyMGYpLCAweDAwMDAwMTAwKTsJLyogSUZMWCBIaWdoIExpbWl0ICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIyMTApLCAweDAwMDAwYzAwKTsJLyogSUZMWCBBbG1vc3QgRnVsbCBMaW1pdCAqLworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMjExKSwgMHgwMDAwMDU5OSk7CS8qIElGTFggQWxtb3N0IEVtcHR5IExpbWl0ICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIyMGQpLCAweDAwMDAwMDAwKTsJLyogSUZMWCBJbmRpcmVjdCBSZWdpc3RlciBVcGRhdGUgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjIwMSksIDB4MDAwMDAwMDEpOwkvKiBJRkxYIENoYW5uZWwgUHJvdmlzaW9uICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIyMDMpLCAweDAwMDBmZmZmKTsJLyogSUZMWCBVbmRvY3VtZW50ZWQgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjIwNSksIDB4MDAwMGZmZmYpOwkvKiBJRkxYIFVuZG9jdW1lbnRlZCAqLworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMjA5KSwgMHgwMDAwZmZmZik7CS8qIElGTFggRW5hYmxlIG92ZXJmbG93IGludGVycnVwdC4gIFRoZSBvdGhlciBiaXQgYXJlIHVuZG9jdW1lbnRlZCAqLworCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIyNDEpLCAweGZmZmZmZmZlKTsJLyogUEw0TU9TIFVuZG9jdW1lbnRlZCAqLworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMjQyKSwgMHgwMDAwZmZmZik7CS8qIFBMNE1PUyBVbmRvY3VtZW50ZWQgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjI0MyksIDB4MDAwMDAwMDgpOwkvKiBQTDRNT1MgU3RhcnZpbmcgQnVyc3QgU2l6ZSAqLworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMjQ0KSwgMHgwMDAwMDAwOCk7CS8qIFBMNE1PUyBIdW5ncnkgQnVyc3QgU2l6ZSAqLworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMjQ1KSwgMHgwMDAwMDAwOCk7CS8qIFBMNE1PUyBUcmFuc2ZlciBTaXplICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIyNDApLCAweDAwMDAwMDA1KTsJLyogUEw0TU9TIERpc2FibGUgKi8KKworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMjgwKSwgMHgwMDAwMjEwMyk7CS8qIFBMNE9EUCBUcmFpbmluZyBSZXBlYXQgYW5kIFNPUCBydWxlICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIyODQpLCAweDAwMDAwMDAwKTsJLyogUEw0T0RQIE1BWF9UIHNldHRpbmcgKi8KKworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgzMjgwKSwgMHgwMDAwMDA4Nyk7CS8qIFBMNElEVSBFbmFibGUgZGF0YSBmb3J3YXJkLCBwb3J0IHN0YXRlIG1hY2hpbmUuIFNldCBBTExPV19OT05fWkVST19PTEIgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MzI4MiksIDB4MDAwMDAwMWYpOwkvKiBQTDRJRFUgRW5hYmxlIERpcDQgY2hlY2sgZXJyb3IgaW50ZXJydXB0cyAqLworCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDMwNDApLCAweDBjMzIpOwkvKiAjIFRYWEcgQ29uZmlnICovCisJLyogRm9yIFQxIHVzZSB0aW1lciBiYXNlZCBNYWMgZmxvdyBjb250cm9sLiAqLworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgzMDRkKSwgMHg4MDAwKTsKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjA0MCksIDB4MDU5Yyk7CS8qICMgUlhYRyBDb25maWcgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjA0OSksIDB4MDAwMSk7CS8qICMgUlhYRyBDdXQgVGhyb3VnaCAqLworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMDcwKSwgMHgwMDAwKTsJLyogIyBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKworCS8qIFNldHVwIEV4YWN0IE1hdGNoIEZpbHRlciAwIHRvIGFsbG93IGJyb2FkY2FzdCBwYWNrZXRzLgorCSAqLworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBPRkZTRVQoMHgyMDZlKSwgMHgwMDAwKTsJLyogIyBEaXNhYmxlIE1hdGNoIEVuYWJsZSBiaXQgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjA0YSksIDB4ZmZmZik7CS8qICMgbG93IGFkZHIgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjA0YiksIDB4ZmZmZik7CS8qICMgbWlkIGFkZHIgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MjA0YyksIDB4ZmZmZik7CS8qICMgaGlnaCBhZGRyICovCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE9GRlNFVCgweDIwNmUpLCAweDAwMDkpOwkvKiAjIEVuYWJsZSBNYXRjaCBFbmFibGUgYml0ICovCisKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MDAwMyksIDB4MDAwMCk7CS8qICMgTk8gU09QLyBQQURfRU4gc2V0dXAgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MDEwMCksIDB4MGZmMCk7CS8qICMgUlhFUUIgZGlzYWJsZWQgKi8KKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKDB4MDEwMSksIDB4MGYwZik7CS8qICMgTm8gUHJlZW1waGFzaXMgKi8KKworCXJldHVybiBjbWFjOworfQorCitzdGF0aWMgaW50IHBtMzM5M19tYWNfcmVzZXQoYWRhcHRlcl90ICogYWRhcHRlcikKK3sKKwl1MzIgdmFsOworCXUzMiB4OworCXUzMiBpc19wbDRfcmVzZXRfZmluaXNoZWQ7CisJdTMyIGlzX3BsNF9vdXRvZl9sb2NrOworCXUzMiBpc194YXVpX21hYmNfcGxsX2xvY2tlZDsKKwl1MzIgc3VjY2Vzc2Z1bF9yZXNldDsKKwlpbnQgaTsKKworCS8qIFRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIHJlcXVpcmVkIHRvIHByb3Blcmx5IHJlc2V0CisJICogdGhlIFBNMzM5My4gVGhpcyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBpbiB0aGUKKwkgKiBQTTMzOTMgZGF0YXNoZWV0IChJc3N1ZSAyOiBOb3ZlbWJlciAyMDAyKQorCSAqIHNlY3Rpb24gMTMuMSAtLSBEZXZpY2UgUmVzZXQuCisJICoKKwkgKiBUaGUgUE0zMzkzIGhhcyB0aHJlZSB0eXBlcyBvZiBjb21wb25lbnRzIHRoYXQgYXJlCisJICogaW5kaXZpZHVhbGx5IHJlc2V0OgorCSAqCisJICogRFJFU0VUQiAgICAgIC0gRGlnaXRhbCBjaXJjdWl0cnkKKwkgKiBQTDRfQVJFU0VUQiAgLSBQTDQgYW5hbG9nIGNpcmN1aXRyeQorCSAqIFhBVUlfQVJFU0VUQiAtIFhBVUkgYnVzIGFuYWxvZyBjaXJjdWl0cnkKKwkgKgorCSAqIFN0ZXBzIHRvIHJlc2V0IFBNMzM5MyB1c2luZyBSU1RCIHBpbjoKKwkgKgorCSAqIDEuIEFzc2VydCBSU1RCIHBpbiBsb3cgKCB3cml0ZSAwICkKKwkgKiAyLiBXYWl0IGF0IGxlYXN0IDFtcyB0byBpbml0aWF0ZSBhIGNvbXBsZXRlIGluaXRpYWxpemF0aW9uIG9mIGRldmljZS4KKwkgKiAzLiBXYWl0IHVudGlsIGFsbCBleHRlcm5hbCBjbG9ja3MgYW5kIFJFRlNFTCBhcmUgc3RhYmxlLgorCSAqIDQuIFdhaXQgbWluaW11bSBvZiAxbXMuIChhZnRlciBleHRlcm5hbCBjbG9ja3MgYW5kIFJFRkVMIGFyZSBzdGFibGUpCisJICogNS4gRGUtYXNzZXJ0IFJTVEIgKCB3cml0ZSAxICkKKwkgKiA2LiBXYWl0IHVudGlsIGludGVybmFsIHRpbWVycyB0byBleHBpcmVzIGFmdGVyIH4xNG1zLgorCSAqICAgIC0gQWxsb3dzIGFuYWxvZyBjbG9jayBzeW50aGVzaXplcihQTDRDU1UpIHRvIHN0YWJpbGl6ZSB0bworCSAqICAgICAgc2VsZWN0ZWQgcmVmZXJlbmNlIGZyZXF1ZW5jeSBiZWZvcmUgYWxsb3dpbmcgdGhlIGRpZ2l0YWwKKwkgKiAgICAgIHBvcnRpb24gb2YgdGhlIGRldmljZSB0byBvcGVyYXRlLgorCSAqIDcuIFdhaXQgYXQgbGVhc3QgMjAwdXMgZm9yIFhBVUkgaW50ZXJmYWNlIHRvIHN0YWJpbGl6ZS4KKwkgKiA4LiBWZXJpZnkgdGhlIFBNMzM5MyBjYW1lIG91dCBvZiByZXNldCBzdWNjZXNzZnVsbHkuCisJICogICAgU2V0IHN1Y2Nlc3NmdWwgcmVzZXQgZmxhZyBpZiBldmVyeXRoaW5nIHdvcmtlZCBlbHNlIHRyeSBhZ2FpbgorCSAqICAgIGEgZmV3IG1vcmUgdGltZXMuCisJICovCisKKwlzdWNjZXNzZnVsX3Jlc2V0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMyAmJiAhc3VjY2Vzc2Z1bF9yZXNldDsgaSsrKSB7CisJCS8qIDEgKi8KKwkJdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwkJdmFsICY9IH4xOworCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCisJCS8qIDIgKi8KKwkJbXNsZWVwKDEpOworCisJCS8qIDMgKi8KKwkJbXNsZWVwKDEpOworCisJCS8qIDQgKi8KKwkJbXNsZWVwKDIgLyoxIGV4dHJhIG1zIGZvciBzYWZldHkgKi8gKTsKKworCQkvKiA1ICovCisJCXZhbCB8PSAxOworCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCisJCS8qIDYgKi8KKwkJbXNsZWVwKDE1IC8qMSBleHRyYSBtcyBmb3Igc2FmZXR5ICovICk7CisKKwkJLyogNyAqLworCQltc2xlZXAoMSk7CisKKwkJLyogOCAqLworCisJCS8qIEhhcyBQTDQgYW5hbG9nIGJsb2NrIGNvbWUgb3V0IG9mIHJlc2V0IGNvcnJlY3RseT8gKi8KKwkJdDFfdHBpX3JlYWQoYWRhcHRlciwgT0ZGU0VUKFNVTkkxeDEwR0VYUF9SRUdfREVWSUNFX1NUQVRVUyksICZ2YWwpOworCQlpc19wbDRfcmVzZXRfZmluaXNoZWQgPSAodmFsICYgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfRVhQSVJFRCk7CisKKwkJLyogVEJEIFhYWCBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9QTDRfSVNfRE9PTCBnZXRzIGxvY2tlZCBsYXRlciBpbiB0aGUgaW5pdCBzZXF1ZW5jZQorCQkgKiAgICAgICAgIGZpZ3VyZSBvdXQgd2h5PyAqLworCisJCS8qIEhhdmUgYWxsIFBMNCBibG9jayBjbG9ja3MgbG9ja2VkPyAqLworCQl4ID0gKFNVTkkxeDEwR0VYUF9CSVRNU0tfVE9QX1BMNF9JRF9ET09MCisJCSAgICAgLyp8IFNVTkkxeDEwR0VYUF9CSVRNU0tfVE9QX1BMNF9JU19ET09MICovICB8CisJCSAgICAgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfUEw0X0lEX1JPT0wgfAorCQkgICAgIFNVTkkxeDEwR0VYUF9CSVRNU0tfVE9QX1BMNF9JU19ST09MIHwKKwkJICAgICBTVU5JMXgxMEdFWFBfQklUTVNLX1RPUF9QTDRfT1VUX1JPT0wpOworCQlpc19wbDRfb3V0b2ZfbG9jayA9ICh2YWwgJiB4KTsKKworCQkvKiA/Pz8gSWYgdGhpcyBmYWlscywgbWlnaHQgYmUgYWJsZSB0byBzb2Z0d2FyZSByZXNldCB0aGUgWEFVSSBwYXJ0CisJCSAqICAgICBhbmQgdHJ5IHRvIHJlY292ZXIuLi4gdGh1cyBzYXZpbmcgdXMgZnJvbSBkb2luZyBhbm90aGVyIEhXIHJlc2V0ICovCisJCS8qIEhhcyB0aGUgWEFVSSBNQUJDIFBMTCBjaXJjdWl0cnkgc3RhYmxpemVkPyAqLworCQlpc194YXVpX21hYmNfcGxsX2xvY2tlZCA9CisJCSAgICAodmFsICYgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfU1hSQV9FWFBJUkVEKTsKKworCQlzdWNjZXNzZnVsX3Jlc2V0ID0gKGlzX3BsNF9yZXNldF9maW5pc2hlZCAmJiAhaXNfcGw0X291dG9mX2xvY2sKKwkJCQkgICAgJiYgaXNfeGF1aV9tYWJjX3BsbF9sb2NrZWQpOworCX0KKwlyZXR1cm4gc3VjY2Vzc2Z1bF9yZXNldCA/IDAgOiAxOworfQorCitzdHJ1Y3QgZ21hYyB0MV9wbTMzOTNfb3BzID0geworCVNUQVRTX1RJQ0tfU0VDUywKKwlwbTMzOTNfbWFjX2NyZWF0ZSwKKwlwbTMzOTNfbWFjX3Jlc2V0Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9yZWdzLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTBlMTFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9yZWdzLmgKQEAgLTAsMCArMSw0NjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGaWxlOiByZWdzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICRSZXZpc2lvbjogMS44ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJERhdGU6IDIwMDUvMDYvMjEgMTg6Mjk6NDggJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBwYXJ0IG9mIHRoZSBDaGVsc2lvIDEwR2IgRXRoZXJuZXQgRHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMgICAgICAgKgorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nICAgKgorICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAgICAqCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vd3d3LmNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIC0gMjAwNSBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuICAgICAgICAgICAgICAgICAgICAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTWFpbnRhaW5lcnM6IG1haW50YWluZXJzQGNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEF1dGhvcnM6IERpbWl0cmlvcyBNaWNoYWlsaWRpcyAgIDxkbUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgVGluYSBZYW5nICAgICAgICAgICAgICAgPHRhaW5heUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGZWxpeCBNYXJ0aSAgICAgICAgICAgICA8ZmVsaXhAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIFNjb3R0IEJhcmRvbmUgICAgICAgICAgIDxzYmFyZG9uZUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgS3VydCBPdHRhd2F5ICAgICAgICAgICAgPGtvdHRhd2F5QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGcmFuayBEaU1hbWJybyAgICAgICAgICA8ZnJhbmtAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DWEdCX1JFR1NfSF8KKyNkZWZpbmUgX0NYR0JfUkVHU19IXworCisvKiBTR0UgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFfU0dfQ09OVFJPTCAweDAKKworI2RlZmluZSBTX0NNRFEwX0VOQUJMRSAgICAwCisjZGVmaW5lIFZfQ01EUTBfRU5BQkxFKHgpICgoeCkgPDwgU19DTURRMF9FTkFCTEUpCisjZGVmaW5lIEZfQ01EUTBfRU5BQkxFICAgIFZfQ01EUTBfRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfQ01EUTFfRU5BQkxFICAgIDEKKyNkZWZpbmUgVl9DTURRMV9FTkFCTEUoeCkgKCh4KSA8PCBTX0NNRFExX0VOQUJMRSkKKyNkZWZpbmUgRl9DTURRMV9FTkFCTEUgICAgVl9DTURRMV9FTkFCTEUoMVUpCisKKyNkZWZpbmUgU19GTDBfRU5BQkxFICAgIDIKKyNkZWZpbmUgVl9GTDBfRU5BQkxFKHgpICgoeCkgPDwgU19GTDBfRU5BQkxFKQorI2RlZmluZSBGX0ZMMF9FTkFCTEUgICAgVl9GTDBfRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfRkwxX0VOQUJMRSAgICAzCisjZGVmaW5lIFZfRkwxX0VOQUJMRSh4KSAoKHgpIDw8IFNfRkwxX0VOQUJMRSkKKyNkZWZpbmUgRl9GTDFfRU5BQkxFICAgIFZfRkwxX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX0NQTF9FTkFCTEUgICAgNAorI2RlZmluZSBWX0NQTF9FTkFCTEUoeCkgKCh4KSA8PCBTX0NQTF9FTkFCTEUpCisjZGVmaW5lIEZfQ1BMX0VOQUJMRSAgICBWX0NQTF9FTkFCTEUoMVUpCisKKyNkZWZpbmUgU19SRVNQT05TRV9RVUVVRV9FTkFCTEUgICAgNQorI2RlZmluZSBWX1JFU1BPTlNFX1FVRVVFX0VOQUJMRSh4KSAoKHgpIDw8IFNfUkVTUE9OU0VfUVVFVUVfRU5BQkxFKQorI2RlZmluZSBGX1JFU1BPTlNFX1FVRVVFX0VOQUJMRSAgICBWX1JFU1BPTlNFX1FVRVVFX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX0NNRFFfUFJJT1JJVFkgICAgNgorI2RlZmluZSBNX0NNRFFfUFJJT1JJVFkgICAgMHgzCisjZGVmaW5lIFZfQ01EUV9QUklPUklUWSh4KSAoKHgpIDw8IFNfQ01EUV9QUklPUklUWSkKKyNkZWZpbmUgR19DTURRX1BSSU9SSVRZKHgpICgoKHgpID4+IFNfQ01EUV9QUklPUklUWSkgJiBNX0NNRFFfUFJJT1JJVFkpCisKKyNkZWZpbmUgU19ESVNBQkxFX0NNRFExX0dUUyAgICA5CisjZGVmaW5lIFZfRElTQUJMRV9DTURRMV9HVFMoeCkgKCh4KSA8PCBTX0RJU0FCTEVfQ01EUTFfR1RTKQorI2RlZmluZSBGX0RJU0FCTEVfQ01EUTFfR1RTICAgIFZfRElTQUJMRV9DTURRMV9HVFMoMVUpCisKKyNkZWZpbmUgU19ESVNBQkxFX0ZMMF9HVFMgICAgMTAKKyNkZWZpbmUgVl9ESVNBQkxFX0ZMMF9HVFMoeCkgKCh4KSA8PCBTX0RJU0FCTEVfRkwwX0dUUykKKyNkZWZpbmUgRl9ESVNBQkxFX0ZMMF9HVFMgICAgVl9ESVNBQkxFX0ZMMF9HVFMoMVUpCisKKyNkZWZpbmUgU19ESVNBQkxFX0ZMMV9HVFMgICAgMTEKKyNkZWZpbmUgVl9ESVNBQkxFX0ZMMV9HVFMoeCkgKCh4KSA8PCBTX0RJU0FCTEVfRkwxX0dUUykKKyNkZWZpbmUgRl9ESVNBQkxFX0ZMMV9HVFMgICAgVl9ESVNBQkxFX0ZMMV9HVFMoMVUpCisKKyNkZWZpbmUgU19FTkFCTEVfQklHX0VORElBTiAgICAxMgorI2RlZmluZSBWX0VOQUJMRV9CSUdfRU5ESUFOKHgpICgoeCkgPDwgU19FTkFCTEVfQklHX0VORElBTikKKyNkZWZpbmUgRl9FTkFCTEVfQklHX0VORElBTiAgICBWX0VOQUJMRV9CSUdfRU5ESUFOKDFVKQorCisjZGVmaW5lIFNfSVNDU0lfQ09BTEVTQ0UgICAgMTQKKyNkZWZpbmUgVl9JU0NTSV9DT0FMRVNDRSh4KSAoKHgpIDw8IFNfSVNDU0lfQ09BTEVTQ0UpCisjZGVmaW5lIEZfSVNDU0lfQ09BTEVTQ0UgICAgVl9JU0NTSV9DT0FMRVNDRSgxVSkKKworI2RlZmluZSBTX1JYX1BLVF9PRkZTRVQgICAgMTUKKyNkZWZpbmUgVl9SWF9QS1RfT0ZGU0VUKHgpICgoeCkgPDwgU19SWF9QS1RfT0ZGU0VUKQorCisjZGVmaW5lIFNfVkxBTl9YVFJBQ1QgICAgMTgKKyNkZWZpbmUgVl9WTEFOX1hUUkFDVCh4KSAoKHgpIDw8IFNfVkxBTl9YVFJBQ1QpCisjZGVmaW5lIEZfVkxBTl9YVFJBQ1QgICAgVl9WTEFOX1hUUkFDVCgxVSkKKworI2RlZmluZSBBX1NHX0RPT1JCRUxMIDB4NAorI2RlZmluZSBBX1NHX0NNRDBCQVNFTFdSIDB4OAorI2RlZmluZSBBX1NHX0NNRDBCQVNFVVBSIDB4YworI2RlZmluZSBBX1NHX0NNRDFCQVNFTFdSIDB4MTAKKyNkZWZpbmUgQV9TR19DTUQxQkFTRVVQUiAweDE0CisjZGVmaW5lIEFfU0dfRkwwQkFTRUxXUiAweDE4CisjZGVmaW5lIEFfU0dfRkwwQkFTRVVQUiAweDFjCisjZGVmaW5lIEFfU0dfRkwxQkFTRUxXUiAweDIwCisjZGVmaW5lIEFfU0dfRkwxQkFTRVVQUiAweDI0CisjZGVmaW5lIEFfU0dfQ01EMFNJWkUgMHgyOAorI2RlZmluZSBBX1NHX0ZMMFNJWkUgMHgyYworI2RlZmluZSBBX1NHX1JTUFNJWkUgMHgzMAorI2RlZmluZSBBX1NHX1JTUEJBU0VMV1IgMHgzNAorI2RlZmluZSBBX1NHX1JTUEJBU0VVUFIgMHgzOAorI2RlZmluZSBBX1NHX0ZMVEhSRVNIT0xEIDB4M2MKKyNkZWZpbmUgQV9TR19SU1BRVUVVRUNSRURJVCAweDQwCisjZGVmaW5lIEFfU0dfU0xFRVBJTkcgMHg0OAorI2RlZmluZSBBX1NHX0lOVFJUSU1FUiAweDRjCisjZGVmaW5lIEFfU0dfQ01EMVNJWkUgMHhiMAorI2RlZmluZSBBX1NHX0ZMMVNJWkUgMHhiNAorI2RlZmluZSBBX1NHX0lOVF9FTkFCTEUgMHhiOAorCisjZGVmaW5lIFNfUkVTUFFfRVhIQVVTVEVEICAgIDAKKyNkZWZpbmUgVl9SRVNQUV9FWEhBVVNURUQoeCkgKCh4KSA8PCBTX1JFU1BRX0VYSEFVU1RFRCkKKyNkZWZpbmUgRl9SRVNQUV9FWEhBVVNURUQgICAgVl9SRVNQUV9FWEhBVVNURUQoMVUpCisKKyNkZWZpbmUgU19SRVNQUV9PVkVSRkxPVyAgICAxCisjZGVmaW5lIFZfUkVTUFFfT1ZFUkZMT1coeCkgKCh4KSA8PCBTX1JFU1BRX09WRVJGTE9XKQorI2RlZmluZSBGX1JFU1BRX09WRVJGTE9XICAgIFZfUkVTUFFfT1ZFUkZMT1coMVUpCisKKyNkZWZpbmUgU19GTF9FWEhBVVNURUQgICAgMgorI2RlZmluZSBWX0ZMX0VYSEFVU1RFRCh4KSAoKHgpIDw8IFNfRkxfRVhIQVVTVEVEKQorI2RlZmluZSBGX0ZMX0VYSEFVU1RFRCAgICBWX0ZMX0VYSEFVU1RFRCgxVSkKKworI2RlZmluZSBTX1BBQ0tFVF9UT09fQklHICAgIDMKKyNkZWZpbmUgVl9QQUNLRVRfVE9PX0JJRyh4KSAoKHgpIDw8IFNfUEFDS0VUX1RPT19CSUcpCisjZGVmaW5lIEZfUEFDS0VUX1RPT19CSUcgICAgVl9QQUNLRVRfVE9PX0JJRygxVSkKKworI2RlZmluZSBTX1BBQ0tFVF9NSVNNQVRDSCAgICA0CisjZGVmaW5lIFZfUEFDS0VUX01JU01BVENIKHgpICgoeCkgPDwgU19QQUNLRVRfTUlTTUFUQ0gpCisjZGVmaW5lIEZfUEFDS0VUX01JU01BVENIICAgIFZfUEFDS0VUX01JU01BVENIKDFVKQorCisjZGVmaW5lIEFfU0dfSU5UX0NBVVNFIDB4YmMKKyNkZWZpbmUgQV9TR19SRVNQQUNDVVRJTUVSIDB4YzAKKworLyogTUMzIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFNfUkVBRFkgICAgMQorI2RlZmluZSBWX1JFQURZKHgpICgoeCkgPDwgU19SRUFEWSkKKyNkZWZpbmUgRl9SRUFEWSAgICBWX1JFQURZKDFVKQorCisvKiBNQzQgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgQV9NQzRfQ0ZHIDB4MTgwCisjZGVmaW5lIFNfTUM0X1NMT1cgICAgMjUKKyNkZWZpbmUgVl9NQzRfU0xPVyh4KSAoKHgpIDw8IFNfTUM0X1NMT1cpCisjZGVmaW5lIEZfTUM0X1NMT1cgICAgVl9NQzRfU0xPVygxVSkKKworLyogVFBJIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIEFfVFBJX0FERFIgMHgyODAKKyNkZWZpbmUgQV9UUElfV1JfREFUQSAweDI4NAorI2RlZmluZSBBX1RQSV9SRF9EQVRBIDB4Mjg4CisjZGVmaW5lIEFfVFBJX0NTUiAweDI4YworCisjZGVmaW5lIFNfVFBJV1IgICAgMAorI2RlZmluZSBWX1RQSVdSKHgpICgoeCkgPDwgU19UUElXUikKKyNkZWZpbmUgRl9UUElXUiAgICBWX1RQSVdSKDFVKQorCisjZGVmaW5lIFNfVFBJUkRZICAgIDEKKyNkZWZpbmUgVl9UUElSRFkoeCkgKCh4KSA8PCBTX1RQSVJEWSkKKyNkZWZpbmUgRl9UUElSRFkgICAgVl9UUElSRFkoMVUpCisKKyNkZWZpbmUgQV9UUElfUEFSIDB4MjljCisKKyNkZWZpbmUgU19UUElQQVIgICAgMAorI2RlZmluZSBNX1RQSVBBUiAgICAweDdmCisjZGVmaW5lIFZfVFBJUEFSKHgpICgoeCkgPDwgU19UUElQQVIpCisjZGVmaW5lIEdfVFBJUEFSKHgpICgoKHgpID4+IFNfVFBJUEFSKSAmIE1fVFBJUEFSKQorCisvKiBUUCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBBX1RQX0lOX0NPTkZJRyAweDMwMAorCisjZGVmaW5lIFNfVFBfSU5fQ1NQSV9DUEwgICAgMworI2RlZmluZSBWX1RQX0lOX0NTUElfQ1BMKHgpICgoeCkgPDwgU19UUF9JTl9DU1BJX0NQTCkKKyNkZWZpbmUgRl9UUF9JTl9DU1BJX0NQTCAgICBWX1RQX0lOX0NTUElfQ1BMKDFVKQorCisjZGVmaW5lIFNfVFBfSU5fQ1NQSV9DSEVDS19JUF9DU1VNICAgIDUKKyNkZWZpbmUgVl9UUF9JTl9DU1BJX0NIRUNLX0lQX0NTVU0oeCkgKCh4KSA8PCBTX1RQX0lOX0NTUElfQ0hFQ0tfSVBfQ1NVTSkKKyNkZWZpbmUgRl9UUF9JTl9DU1BJX0NIRUNLX0lQX0NTVU0gICAgVl9UUF9JTl9DU1BJX0NIRUNLX0lQX0NTVU0oMVUpCisKKyNkZWZpbmUgU19UUF9JTl9DU1BJX0NIRUNLX1RDUF9DU1VNICAgIDYKKyNkZWZpbmUgVl9UUF9JTl9DU1BJX0NIRUNLX1RDUF9DU1VNKHgpICgoeCkgPDwgU19UUF9JTl9DU1BJX0NIRUNLX1RDUF9DU1VNKQorI2RlZmluZSBGX1RQX0lOX0NTUElfQ0hFQ0tfVENQX0NTVU0gICAgVl9UUF9JTl9DU1BJX0NIRUNLX1RDUF9DU1VNKDFVKQorCisjZGVmaW5lIFNfVFBfSU5fRVNQSV9FVEhFUk5FVCAgICA4CisjZGVmaW5lIFZfVFBfSU5fRVNQSV9FVEhFUk5FVCh4KSAoKHgpIDw8IFNfVFBfSU5fRVNQSV9FVEhFUk5FVCkKKyNkZWZpbmUgRl9UUF9JTl9FU1BJX0VUSEVSTkVUICAgIFZfVFBfSU5fRVNQSV9FVEhFUk5FVCgxVSkKKworI2RlZmluZSBTX1RQX0lOX0VTUElfQ0hFQ0tfSVBfQ1NVTSAgICAxMgorI2RlZmluZSBWX1RQX0lOX0VTUElfQ0hFQ0tfSVBfQ1NVTSh4KSAoKHgpIDw8IFNfVFBfSU5fRVNQSV9DSEVDS19JUF9DU1VNKQorI2RlZmluZSBGX1RQX0lOX0VTUElfQ0hFQ0tfSVBfQ1NVTSAgICBWX1RQX0lOX0VTUElfQ0hFQ0tfSVBfQ1NVTSgxVSkKKworI2RlZmluZSBTX1RQX0lOX0VTUElfQ0hFQ0tfVENQX0NTVU0gICAgMTMKKyNkZWZpbmUgVl9UUF9JTl9FU1BJX0NIRUNLX1RDUF9DU1VNKHgpICgoeCkgPDwgU19UUF9JTl9FU1BJX0NIRUNLX1RDUF9DU1VNKQorI2RlZmluZSBGX1RQX0lOX0VTUElfQ0hFQ0tfVENQX0NTVU0gICAgVl9UUF9JTl9FU1BJX0NIRUNLX1RDUF9DU1VNKDFVKQorCisjZGVmaW5lIFNfT0ZGTE9BRF9ESVNBQkxFICAgIDE0CisjZGVmaW5lIFZfT0ZGTE9BRF9ESVNBQkxFKHgpICgoeCkgPDwgU19PRkZMT0FEX0RJU0FCTEUpCisjZGVmaW5lIEZfT0ZGTE9BRF9ESVNBQkxFICAgIFZfT0ZGTE9BRF9ESVNBQkxFKDFVKQorCisjZGVmaW5lIEFfVFBfT1VUX0NPTkZJRyAweDMwNAorCisjZGVmaW5lIFNfVFBfT1VUX0NTUElfQ1BMICAgIDIKKyNkZWZpbmUgVl9UUF9PVVRfQ1NQSV9DUEwoeCkgKCh4KSA8PCBTX1RQX09VVF9DU1BJX0NQTCkKKyNkZWZpbmUgRl9UUF9PVVRfQ1NQSV9DUEwgICAgVl9UUF9PVVRfQ1NQSV9DUEwoMVUpCisKKyNkZWZpbmUgU19UUF9PVVRfRVNQSV9FVEhFUk5FVCAgICA2CisjZGVmaW5lIFZfVFBfT1VUX0VTUElfRVRIRVJORVQoeCkgKCh4KSA8PCBTX1RQX09VVF9FU1BJX0VUSEVSTkVUKQorI2RlZmluZSBGX1RQX09VVF9FU1BJX0VUSEVSTkVUICAgIFZfVFBfT1VUX0VTUElfRVRIRVJORVQoMVUpCisKKyNkZWZpbmUgU19UUF9PVVRfRVNQSV9HRU5FUkFURV9JUF9DU1VNICAgIDEwCisjZGVmaW5lIFZfVFBfT1VUX0VTUElfR0VORVJBVEVfSVBfQ1NVTSh4KSAoKHgpIDw8IFNfVFBfT1VUX0VTUElfR0VORVJBVEVfSVBfQ1NVTSkKKyNkZWZpbmUgRl9UUF9PVVRfRVNQSV9HRU5FUkFURV9JUF9DU1VNICAgIFZfVFBfT1VUX0VTUElfR0VORVJBVEVfSVBfQ1NVTSgxVSkKKworI2RlZmluZSBTX1RQX09VVF9FU1BJX0dFTkVSQVRFX1RDUF9DU1VNICAgIDExCisjZGVmaW5lIFZfVFBfT1VUX0VTUElfR0VORVJBVEVfVENQX0NTVU0oeCkgKCh4KSA8PCBTX1RQX09VVF9FU1BJX0dFTkVSQVRFX1RDUF9DU1VNKQorI2RlZmluZSBGX1RQX09VVF9FU1BJX0dFTkVSQVRFX1RDUF9DU1VNICAgIFZfVFBfT1VUX0VTUElfR0VORVJBVEVfVENQX0NTVU0oMVUpCisKKyNkZWZpbmUgQV9UUF9HTE9CQUxfQ09ORklHIDB4MzA4CisKKyNkZWZpbmUgU19JUF9UVEwgICAgMAorI2RlZmluZSBNX0lQX1RUTCAgICAweGZmCisjZGVmaW5lIFZfSVBfVFRMKHgpICgoeCkgPDwgU19JUF9UVEwpCisKKyNkZWZpbmUgU19UQ1BfQ1NVTSAgICAxMQorI2RlZmluZSBWX1RDUF9DU1VNKHgpICgoeCkgPDwgU19UQ1BfQ1NVTSkKKyNkZWZpbmUgRl9UQ1BfQ1NVTSAgICBWX1RDUF9DU1VNKDFVKQorCisjZGVmaW5lIFNfVURQX0NTVU0gICAgMTIKKyNkZWZpbmUgVl9VRFBfQ1NVTSh4KSAoKHgpIDw8IFNfVURQX0NTVU0pCisjZGVmaW5lIEZfVURQX0NTVU0gICAgVl9VRFBfQ1NVTSgxVSkKKworI2RlZmluZSBTX0lQX0NTVU0gICAgMTMKKyNkZWZpbmUgVl9JUF9DU1VNKHgpICgoeCkgPDwgU19JUF9DU1VNKQorI2RlZmluZSBGX0lQX0NTVU0gICAgVl9JUF9DU1VNKDFVKQorCisjZGVmaW5lIFNfUEFUSF9NVFUgICAgMTUKKyNkZWZpbmUgVl9QQVRIX01UVSh4KSAoKHgpIDw8IFNfUEFUSF9NVFUpCisjZGVmaW5lIEZfUEFUSF9NVFUgICAgVl9QQVRIX01UVSgxVSkKKworI2RlZmluZSBTXzVUVVBMRV9MT09LVVAgICAgMTcKKyNkZWZpbmUgVl81VFVQTEVfTE9PS1VQKHgpICgoeCkgPDwgU181VFVQTEVfTE9PS1VQKQorCisjZGVmaW5lIFNfU1lOX0NPT0tJRV9QQVJBTUVURVIgICAgMjYKKyNkZWZpbmUgVl9TWU5fQ09PS0lFX1BBUkFNRVRFUih4KSAoKHgpIDw8IFNfU1lOX0NPT0tJRV9QQVJBTUVURVIpCisKKyNkZWZpbmUgQV9UUF9QQ19DT05GSUcgMHgzNDgKKyNkZWZpbmUgU19ESVNfVFhfRklMTF9XSU5fUFVTSCAgICAxMgorI2RlZmluZSBWX0RJU19UWF9GSUxMX1dJTl9QVVNIKHgpICgoeCkgPDwgU19ESVNfVFhfRklMTF9XSU5fUFVTSCkKKyNkZWZpbmUgRl9ESVNfVFhfRklMTF9XSU5fUFVTSCAgICBWX0RJU19UWF9GSUxMX1dJTl9QVVNIKDFVKQorCisjZGVmaW5lIFNfVFBfUENfUkVWICAgIDMwCisjZGVmaW5lIE1fVFBfUENfUkVWICAgIDB4MworI2RlZmluZSBHX1RQX1BDX1JFVih4KSAoKCh4KSA+PiBTX1RQX1BDX1JFVikgJiBNX1RQX1BDX1JFVikKKyNkZWZpbmUgQV9UUF9SRVNFVCAweDQ0YworI2RlZmluZSBTX1RQX1JFU0VUICAgIDAKKyNkZWZpbmUgVl9UUF9SRVNFVCh4KSAoKHgpIDw8IFNfVFBfUkVTRVQpCisjZGVmaW5lIEZfVFBfUkVTRVQgICAgVl9UUF9SRVNFVCgxVSkKKworI2RlZmluZSBBX1RQX0lOVF9FTkFCTEUgMHg0NzAKKyNkZWZpbmUgQV9UUF9JTlRfQ0FVU0UgMHg0NzQKKyNkZWZpbmUgQV9UUF9UWF9EUk9QX0NPTkZJRyAweDRiOAorCisjZGVmaW5lIFNfRU5BQkxFX1RYX0RST1AgICAgMzEKKyNkZWZpbmUgVl9FTkFCTEVfVFhfRFJPUCh4KSAoKHgpIDw8IFNfRU5BQkxFX1RYX0RST1ApCisjZGVmaW5lIEZfRU5BQkxFX1RYX0RST1AgICAgVl9FTkFCTEVfVFhfRFJPUCgxVSkKKworI2RlZmluZSBTX0VOQUJMRV9UWF9FUlJPUiAgICAzMAorI2RlZmluZSBWX0VOQUJMRV9UWF9FUlJPUih4KSAoKHgpIDw8IFNfRU5BQkxFX1RYX0VSUk9SKQorI2RlZmluZSBGX0VOQUJMRV9UWF9FUlJPUiAgICBWX0VOQUJMRV9UWF9FUlJPUigxVSkKKworI2RlZmluZSBTX0RST1BfVElDS1NfQ05UICAgIDQKKyNkZWZpbmUgVl9EUk9QX1RJQ0tTX0NOVCh4KSAoKHgpIDw8IFNfRFJPUF9USUNLU19DTlQpCisKKyNkZWZpbmUgU19OVU1fUEtUU19EUk9QUEVEICAgIDAKKyNkZWZpbmUgVl9OVU1fUEtUU19EUk9QUEVEKHgpICgoeCkgPDwgU19OVU1fUEtUU19EUk9QUEVEKQorCisvKiBDU1BJIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFNfRElQNEVSUiAgICAwCisjZGVmaW5lIFZfRElQNEVSUih4KSAoKHgpIDw8IFNfRElQNEVSUikKKyNkZWZpbmUgRl9ESVA0RVJSICAgIFZfRElQNEVSUigxVSkKKworI2RlZmluZSBTX1JYRFJPUCAgICAxCisjZGVmaW5lIFZfUlhEUk9QKHgpICgoeCkgPDwgU19SWERST1ApCisjZGVmaW5lIEZfUlhEUk9QICAgIFZfUlhEUk9QKDFVKQorCisjZGVmaW5lIFNfVFhEUk9QICAgIDIKKyNkZWZpbmUgVl9UWERST1AoeCkgKCh4KSA8PCBTX1RYRFJPUCkKKyNkZWZpbmUgRl9UWERST1AgICAgVl9UWERST1AoMVUpCisKKyNkZWZpbmUgU19SWE9WRVJGTE9XICAgIDMKKyNkZWZpbmUgVl9SWE9WRVJGTE9XKHgpICgoeCkgPDwgU19SWE9WRVJGTE9XKQorI2RlZmluZSBGX1JYT1ZFUkZMT1cgICAgVl9SWE9WRVJGTE9XKDFVKQorCisjZGVmaW5lIFNfUkFNUEFSSVRZRVJSICAgIDQKKyNkZWZpbmUgVl9SQU1QQVJJVFlFUlIoeCkgKCh4KSA8PCBTX1JBTVBBUklUWUVSUikKKyNkZWZpbmUgRl9SQU1QQVJJVFlFUlIgICAgVl9SQU1QQVJJVFlFUlIoMVUpCisKKy8qIEVTUEkgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgQV9FU1BJX1NDSF9UT0tFTjAgMHg4ODAKKyNkZWZpbmUgQV9FU1BJX1NDSF9UT0tFTjEgMHg4ODQKKyNkZWZpbmUgQV9FU1BJX1NDSF9UT0tFTjIgMHg4ODgKKyNkZWZpbmUgQV9FU1BJX1NDSF9UT0tFTjMgMHg4OGMKKyNkZWZpbmUgQV9FU1BJX1JYX0ZJRk9fQUxNT1NUX0VNUFRZX1dBVEVSTUFSSyAweDg5MAorI2RlZmluZSBBX0VTUElfUlhfRklGT19BTE1PU1RfRlVMTF9XQVRFUk1BUksgMHg4OTQKKyNkZWZpbmUgQV9FU1BJX0NBTEVOREFSX0xFTkdUSCAweDg5OAorI2RlZmluZSBBX1BPUlRfQ09ORklHIDB4ODljCisKKyNkZWZpbmUgU19SWF9OUE9SVFMgICAgMAorI2RlZmluZSBWX1JYX05QT1JUUyh4KSAoKHgpIDw8IFNfUlhfTlBPUlRTKQorCisjZGVmaW5lIFNfVFhfTlBPUlRTICAgIDgKKyNkZWZpbmUgVl9UWF9OUE9SVFMoeCkgKCh4KSA8PCBTX1RYX05QT1JUUykKKworI2RlZmluZSBBX0VTUElfRklGT19TVEFUVVNfRU5BQkxFIDB4OGEwCisKKyNkZWZpbmUgU19SWFNUQVRVU0VOQUJMRSAgICAwCisjZGVmaW5lIFZfUlhTVEFUVVNFTkFCTEUoeCkgKCh4KSA8PCBTX1JYU1RBVFVTRU5BQkxFKQorI2RlZmluZSBGX1JYU1RBVFVTRU5BQkxFICAgIFZfUlhTVEFUVVNFTkFCTEUoMVUpCisKKyNkZWZpbmUgU19JTlRFTDEwMTBNT0RFICAgIDQKKyNkZWZpbmUgVl9JTlRFTDEwMTBNT0RFKHgpICgoeCkgPDwgU19JTlRFTDEwMTBNT0RFKQorI2RlZmluZSBGX0lOVEVMMTAxME1PREUgICAgVl9JTlRFTDEwMTBNT0RFKDFVKQorCisjZGVmaW5lIEFfRVNQSV9NQVhCVVJTVDFfTUFYQlVSU1QyIDB4OGE4CisjZGVmaW5lIEFfRVNQSV9UUkFJTiAweDhhYworI2RlZmluZSBBX0VTUElfSU5UUl9TVEFUVVMgMHg4YzgKKworI2RlZmluZSBTX0RJUDJQQVJJVFlFUlIgICAgNQorI2RlZmluZSBWX0RJUDJQQVJJVFlFUlIoeCkgKCh4KSA8PCBTX0RJUDJQQVJJVFlFUlIpCisjZGVmaW5lIEZfRElQMlBBUklUWUVSUiAgICBWX0RJUDJQQVJJVFlFUlIoMVUpCisKKyNkZWZpbmUgQV9FU1BJX0lOVFJfRU5BQkxFIDB4OGNjCisjZGVmaW5lIEFfUlhfRFJPUF9USFJFU0hPTEQgMHg4ZDAKKyNkZWZpbmUgQV9FU1BJX1JYX1JFU0VUIDB4OGVjCisjZGVmaW5lIEFfRVNQSV9NSVNDX0NPTlRST0wgMHg4ZjAKKworI2RlZmluZSBTX09VVF9PRl9TWU5DX0NPVU5UICAgIDAKKyNkZWZpbmUgVl9PVVRfT0ZfU1lOQ19DT1VOVCh4KSAoKHgpIDw8IFNfT1VUX09GX1NZTkNfQ09VTlQpCisKKyNkZWZpbmUgU19ESVAyX1BBUklUWV9FUlJfVEhSRVMgICAgNQorI2RlZmluZSBWX0RJUDJfUEFSSVRZX0VSUl9USFJFUyh4KSAoKHgpIDw8IFNfRElQMl9QQVJJVFlfRVJSX1RIUkVTKQorCisjZGVmaW5lIFNfRElQNF9USFJFUyAgICA5CisjZGVmaW5lIFZfRElQNF9USFJFUyh4KSAoKHgpIDw8IFNfRElQNF9USFJFUykKKworI2RlZmluZSBTX01PTklUT1JFRF9QT1JUX05VTSAgICAyNQorI2RlZmluZSBWX01PTklUT1JFRF9QT1JUX05VTSh4KSAoKHgpIDw8IFNfTU9OSVRPUkVEX1BPUlRfTlVNKQorCisjZGVmaW5lIFNfTU9OSVRPUkVEX0RJUkVDVElPTiAgICAyNworI2RlZmluZSBWX01PTklUT1JFRF9ESVJFQ1RJT04oeCkgKCh4KSA8PCBTX01PTklUT1JFRF9ESVJFQ1RJT04pCisjZGVmaW5lIEZfTU9OSVRPUkVEX0RJUkVDVElPTiAgICBWX01PTklUT1JFRF9ESVJFQ1RJT04oMVUpCisKKyNkZWZpbmUgU19NT05JVE9SRURfSU5URVJGQUNFICAgIDI4CisjZGVmaW5lIFZfTU9OSVRPUkVEX0lOVEVSRkFDRSh4KSAoKHgpIDw8IFNfTU9OSVRPUkVEX0lOVEVSRkFDRSkKKyNkZWZpbmUgRl9NT05JVE9SRURfSU5URVJGQUNFICAgIFZfTU9OSVRPUkVEX0lOVEVSRkFDRSgxVSkKKworI2RlZmluZSBBX0VTUElfRElQMl9FUlJfQ09VTlQgMHg4ZjQKKyNkZWZpbmUgQV9FU1BJX0NNRF9BRERSIDB4OGY4CisKKyNkZWZpbmUgU19XUklURV9EQVRBICAgIDAKKyNkZWZpbmUgVl9XUklURV9EQVRBKHgpICgoeCkgPDwgU19XUklURV9EQVRBKQorCisjZGVmaW5lIFNfUkVHSVNURVJfT0ZGU0VUICAgIDgKKyNkZWZpbmUgVl9SRUdJU1RFUl9PRkZTRVQoeCkgKCh4KSA8PCBTX1JFR0lTVEVSX09GRlNFVCkKKworI2RlZmluZSBTX0NIQU5ORUxfQUREUiAgICAxMgorI2RlZmluZSBWX0NIQU5ORUxfQUREUih4KSAoKHgpIDw8IFNfQ0hBTk5FTF9BRERSKQorCisjZGVmaW5lIFNfTU9EVUxFX0FERFIgICAgMTYKKyNkZWZpbmUgVl9NT0RVTEVfQUREUih4KSAoKHgpIDw8IFNfTU9EVUxFX0FERFIpCisKKyNkZWZpbmUgU19CVU5ETEVfQUREUiAgICAyMAorI2RlZmluZSBWX0JVTkRMRV9BRERSKHgpICgoeCkgPDwgU19CVU5ETEVfQUREUikKKworI2RlZmluZSBTX1NQSTRfQ09NTUFORCAgICAyNAorI2RlZmluZSBWX1NQSTRfQ09NTUFORCh4KSAoKHgpIDw8IFNfU1BJNF9DT01NQU5EKQorCisjZGVmaW5lIEFfRVNQSV9HT1NUQVQgMHg4ZmMKKyNkZWZpbmUgU19FU1BJX0NNRF9CVVNZICAgIDgKKyNkZWZpbmUgVl9FU1BJX0NNRF9CVVNZKHgpICgoeCkgPDwgU19FU1BJX0NNRF9CVVNZKQorI2RlZmluZSBGX0VTUElfQ01EX0JVU1kgICAgVl9FU1BJX0NNRF9CVVNZKDFVKQorCisvKiBQTCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBBX1BMX0VOQUJMRSAweGEwMAorCisjZGVmaW5lIFNfUExfSU5UUl9TR0VfRVJSICAgIDAKKyNkZWZpbmUgVl9QTF9JTlRSX1NHRV9FUlIoeCkgKCh4KSA8PCBTX1BMX0lOVFJfU0dFX0VSUikKKyNkZWZpbmUgRl9QTF9JTlRSX1NHRV9FUlIgICAgVl9QTF9JTlRSX1NHRV9FUlIoMVUpCisKKyNkZWZpbmUgU19QTF9JTlRSX1NHRV9EQVRBICAgIDEKKyNkZWZpbmUgVl9QTF9JTlRSX1NHRV9EQVRBKHgpICgoeCkgPDwgU19QTF9JTlRSX1NHRV9EQVRBKQorI2RlZmluZSBGX1BMX0lOVFJfU0dFX0RBVEEgICAgVl9QTF9JTlRSX1NHRV9EQVRBKDFVKQorCisjZGVmaW5lIFNfUExfSU5UUl9UUCAgICA2CisjZGVmaW5lIFZfUExfSU5UUl9UUCh4KSAoKHgpIDw8IFNfUExfSU5UUl9UUCkKKyNkZWZpbmUgRl9QTF9JTlRSX1RQICAgIFZfUExfSU5UUl9UUCgxVSkKKworI2RlZmluZSBTX1BMX0lOVFJfRVNQSSAgICA4CisjZGVmaW5lIFZfUExfSU5UUl9FU1BJKHgpICgoeCkgPDwgU19QTF9JTlRSX0VTUEkpCisjZGVmaW5lIEZfUExfSU5UUl9FU1BJICAgIFZfUExfSU5UUl9FU1BJKDFVKQorCisjZGVmaW5lIFNfUExfSU5UUl9QQ0lYICAgIDEwCisjZGVmaW5lIFZfUExfSU5UUl9QQ0lYKHgpICgoeCkgPDwgU19QTF9JTlRSX1BDSVgpCisjZGVmaW5lIEZfUExfSU5UUl9QQ0lYICAgIFZfUExfSU5UUl9QQ0lYKDFVKQorCisjZGVmaW5lIFNfUExfSU5UUl9FWFQgICAgMTEKKyNkZWZpbmUgVl9QTF9JTlRSX0VYVCh4KSAoKHgpIDw8IFNfUExfSU5UUl9FWFQpCisjZGVmaW5lIEZfUExfSU5UUl9FWFQgICAgVl9QTF9JTlRSX0VYVCgxVSkKKworI2RlZmluZSBBX1BMX0NBVVNFIDB4YTA0CisKKy8qIE1DNSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBBX01DNV9DT05GSUcgMHhjMDQKKworI2RlZmluZSBTX1RDQU1fUkVTRVQgICAgMQorI2RlZmluZSBWX1RDQU1fUkVTRVQoeCkgKCh4KSA8PCBTX1RDQU1fUkVTRVQpCisjZGVmaW5lIEZfVENBTV9SRVNFVCAgICBWX1RDQU1fUkVTRVQoMVUpCisKKyNkZWZpbmUgU19NX0JVU19FTkFCTEUgICAgNQorI2RlZmluZSBWX01fQlVTX0VOQUJMRSh4KSAoKHgpIDw8IFNfTV9CVVNfRU5BQkxFKQorI2RlZmluZSBGX01fQlVTX0VOQUJMRSAgICBWX01fQlVTX0VOQUJMRSgxVSkKKworLyogUENJQ0ZHIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIEFfUENJQ0ZHX1BNX0NTUiAweDQ0CisjZGVmaW5lIEFfUENJQ0ZHX1ZQRF9BRERSIDB4NGEKKworI2RlZmluZSBTX1ZQRF9PUF9GTEFHICAgIDE1CisjZGVmaW5lIFZfVlBEX09QX0ZMQUcoeCkgKCh4KSA8PCBTX1ZQRF9PUF9GTEFHKQorI2RlZmluZSBGX1ZQRF9PUF9GTEFHICAgIFZfVlBEX09QX0ZMQUcoMVUpCisKKyNkZWZpbmUgQV9QQ0lDRkdfVlBEX0RBVEEgMHg0YworCisjZGVmaW5lIEFfUENJQ0ZHX0lOVFJfRU5BQkxFIDB4ZjQKKyNkZWZpbmUgQV9QQ0lDRkdfSU5UUl9DQVVTRSAweGY4CisKKyNkZWZpbmUgQV9QQ0lDRkdfTU9ERSAweGZjCisKKyNkZWZpbmUgU19QQ0lfTU9ERV82NEJJVCAgICAwCisjZGVmaW5lIFZfUENJX01PREVfNjRCSVQoeCkgKCh4KSA8PCBTX1BDSV9NT0RFXzY0QklUKQorI2RlZmluZSBGX1BDSV9NT0RFXzY0QklUICAgIFZfUENJX01PREVfNjRCSVQoMVUpCisKKyNkZWZpbmUgU19QQ0lfTU9ERV9QQ0lYICAgIDUKKyNkZWZpbmUgVl9QQ0lfTU9ERV9QQ0lYKHgpICgoeCkgPDwgU19QQ0lfTU9ERV9QQ0lYKQorI2RlZmluZSBGX1BDSV9NT0RFX1BDSVggICAgVl9QQ0lfTU9ERV9QQ0lYKDFVKQorCisjZGVmaW5lIFNfUENJX01PREVfQ0xLICAgIDYKKyNkZWZpbmUgTV9QQ0lfTU9ERV9DTEsgICAgMHgzCisjZGVmaW5lIEdfUENJX01PREVfQ0xLKHgpICgoKHgpID4+IFNfUENJX01PREVfQ0xLKSAmIE1fUENJX01PREVfQ0xLKQorCisjZW5kaWYgLyogX0NYR0JfUkVHU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiNDFkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmMKQEAgLTAsMCArMSwxNjg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRmlsZTogc2dlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAkUmV2aXNpb246IDEuMjYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICREYXRlOiAyMDA1LzA2LzIxIDE4OjI5OjQ4ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgRE1BIGVuZ2luZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBwYXJ0IG9mIHRoZSBDaGVsc2lvIDEwR2IgRXRoZXJuZXQgRHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMgICAgICAgKgorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nICAgKgorICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAgICAqCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vd3d3LmNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIC0gMjAwNSBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuICAgICAgICAgICAgICAgICAgICAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTWFpbnRhaW5lcnM6IG1haW50YWluZXJzQGNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEF1dGhvcnM6IERpbWl0cmlvcyBNaWNoYWlsaWRpcyAgIDxkbUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgVGluYSBZYW5nICAgICAgICAgICAgICAgPHRhaW5heUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGZWxpeCBNYXJ0aSAgICAgICAgICAgICA8ZmVsaXhAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIFNjb3R0IEJhcmRvbmUgICAgICAgICAgIDxzYmFyZG9uZUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgS3VydCBPdHRhd2F5ICAgICAgICAgICAgPGtvdHRhd2F5QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGcmFuayBEaU1hbWJybyAgICAgICAgICA8ZnJhbmtAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorCisjaW5jbHVkZSAiY3BsNV9jbWQuaCIKKyNpbmNsdWRlICJzZ2UuaCIKKyNpbmNsdWRlICJyZWdzLmgiCisjaW5jbHVkZSAiZXNwaS5oIgorCisKKyNpZmRlZiBORVRJRl9GX1RTTworI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2VuZGlmCisKKyNkZWZpbmUgU0dFX0NNRFFfTgkJMgorI2RlZmluZSBTR0VfRlJFRUxRX04JCTIKKyNkZWZpbmUgU0dFX0NNRFEwX0VfTgkJMTAyNAorI2RlZmluZSBTR0VfQ01EUTFfRV9OCQkxMjgKKyNkZWZpbmUgU0dFX0ZSRUVMX1NJWkUJCTQwOTYKKyNkZWZpbmUgU0dFX0pVTUJPX0ZSRUVMX1NJWkUJNTEyCisjZGVmaW5lIFNHRV9GUkVFTF9SRUZJTExfVEhSRVNICTE2CisjZGVmaW5lIFNHRV9SRVNQUV9FX04JCTEwMjQKKyNkZWZpbmUgU0dFX0lOVFJUSU1FUl9OUkVTCTEwMDAKKyNkZWZpbmUgU0dFX1JYX0NPUFlfVEhSRVMJMjU2CisjZGVmaW5lIFNHRV9SWF9TTV9CVUZfU0laRQkxNTM2CisKKyMgZGVmaW5lIFNHRV9SWF9EUk9QX1RIUkVTIDIKKworI2RlZmluZSBTR0VfUkVTUFFfUkVQTEVOSVNIX1RIUkVTIChTR0VfUkVTUFFfRV9OIC8gNCkKKworLyoKKyAqIFBlcmlvZCBvZiB0aGUgVFggYnVmZmVyIHJlY2xhaW0gdGltZXIuICBUaGlzIHRpbWVyIGRvZXMgbm90IG5lZWQgdG8gcnVuCisgKiBmcmVxdWVudGx5IGFzIFRYIGJ1ZmZlcnMgYXJlIHVzdWFsbHkgcmVjbGFpbWVkIGJ5IG5ldyBUWCBwYWNrZXRzLgorICovCisjZGVmaW5lIFRYX1JFQ0xBSU1fUEVSSU9EIChIWiAvIDQpCisKKyNpZm5kZWYgTkVUX0lQX0FMSUdOCisjIGRlZmluZSBORVRfSVBfQUxJR04gMgorI2VuZGlmCisKKyNkZWZpbmUgTV9DTURfTEVOICAgICAgIDB4N2ZmZmZmZmYKKyNkZWZpbmUgVl9DTURfTEVOKHYpICAgICh2KQorI2RlZmluZSBHX0NNRF9MRU4odikgICAgKCh2KSAmIE1fQ01EX0xFTikKKyNkZWZpbmUgVl9DTURfR0VOMSh2KSAgICgodikgPDwgMzEpCisjZGVmaW5lIFZfQ01EX0dFTjIodikgICAodikKKyNkZWZpbmUgRl9DTURfREFUQVZBTElEICgxIDw8IDEpCisjZGVmaW5lIEZfQ01EX1NPUCAgICAgICAoMSA8PCAyKQorI2RlZmluZSBWX0NNRF9FT1AodikgICAgKCh2KSA8PCAzKQorCisvKgorICogQ29tbWFuZCBxdWV1ZSwgcmVjZWl2ZSBidWZmZXIgbGlzdCwgYW5kIHJlc3BvbnNlIHF1ZXVlIGRlc2NyaXB0b3JzLgorICovCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCitzdHJ1Y3QgY21kUV9lIHsKKwl1MzIgYWRkcl9sbzsKKwl1MzIgbGVuX2dlbjsKKwl1MzIgZmxhZ3M7CisJdTMyIGFkZHJfaGk7Cit9OworCitzdHJ1Y3QgZnJlZWxRX2UgeworCXUzMiBhZGRyX2xvOworCXUzMiBsZW5fZ2VuOworCXUzMiBnZW4yOworCXUzMiBhZGRyX2hpOworfTsKKworc3RydWN0IHJlc3BRX2UgeworCXUzMiBRc2xlZXBpbmcJCTogNDsKKwl1MzIgQ21kcTFDcmVkaXRSZXR1cm4JOiA1OworCXUzMiBDbWRxMURtYUNvbXBsZXRlCTogNTsKKwl1MzIgQ21kcTBDcmVkaXRSZXR1cm4JOiA1OworCXUzMiBDbWRxMERtYUNvbXBsZXRlCTogNTsKKwl1MzIgRnJlZWxpc3RRaWQJCTogMjsKKwl1MzIgQ3JlZGl0VmFsaWQJCTogMTsKKwl1MzIgRGF0YVZhbGlkCQk6IDE7CisJdTMyIE9mZmxvYWQJCTogMTsKKwl1MzIgRW9wCQkJOiAxOworCXUzMiBTb3AJCQk6IDE7CisJdTMyIEdlbmVyYXRpb25CaXQJOiAxOworCXUzMiBCdWZmZXJMZW5ndGg7Cit9OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCitzdHJ1Y3QgY21kUV9lIHsKKwl1MzIgbGVuX2dlbjsKKwl1MzIgYWRkcl9sbzsKKwl1MzIgYWRkcl9oaTsKKwl1MzIgZmxhZ3M7Cit9OworCitzdHJ1Y3QgZnJlZWxRX2UgeworCXUzMiBsZW5fZ2VuOworCXUzMiBhZGRyX2xvOworCXUzMiBhZGRyX2hpOworCXUzMiBnZW4yOworfTsKKworc3RydWN0IHJlc3BRX2UgeworCXUzMiBCdWZmZXJMZW5ndGg7CisJdTMyIEdlbmVyYXRpb25CaXQJOiAxOworCXUzMiBTb3AJCQk6IDE7CisJdTMyIEVvcAkJCTogMTsKKwl1MzIgT2ZmbG9hZAkJOiAxOworCXUzMiBEYXRhVmFsaWQJCTogMTsKKwl1MzIgQ3JlZGl0VmFsaWQJCTogMTsKKwl1MzIgRnJlZWxpc3RRaWQJCTogMjsKKwl1MzIgQ21kcTBEbWFDb21wbGV0ZQk6IDU7CisJdTMyIENtZHEwQ3JlZGl0UmV0dXJuCTogNTsKKwl1MzIgQ21kcTFEbWFDb21wbGV0ZQk6IDU7CisJdTMyIENtZHExQ3JlZGl0UmV0dXJuCTogNTsKKwl1MzIgUXNsZWVwaW5nCQk6IDQ7Cit9IDsKKyNlbmRpZgorCisvKgorICogU1cgQ29udGV4dCBDb21tYW5kIGFuZCBGcmVlbGlzdCBRdWV1ZSBEZXNjcmlwdG9ycworICovCitzdHJ1Y3QgY21kUV9jZSB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlERUNMQVJFX1BDSV9VTk1BUF9BRERSKGRtYV9hZGRyKTsKKwlERUNMQVJFX1BDSV9VTk1BUF9MRU4oZG1hX2xlbik7Cit9OworCitzdHJ1Y3QgZnJlZWxRX2NlIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCURFQ0xBUkVfUENJX1VOTUFQX0FERFIoZG1hX2FkZHIpOworCURFQ0xBUkVfUENJX1VOTUFQX0xFTihkbWFfbGVuKTsKK307CisKKy8qCisgKiBTVyBjb21tYW5kLCBmcmVlbGlzdCBhbmQgcmVzcG9uc2UgcmluZ3MKKyAqLworc3RydWN0IGNtZFEgeworCXVuc2lnbmVkIGxvbmcgICBzdGF0dXM7ICAgICAgICAgLyogSFcgRE1BIGZldGNoIHN0YXR1cyAqLworCXVuc2lnbmVkIGludCAgICBpbl91c2U7ICAgICAgICAgLyogIyBvZiBpbi11c2UgY29tbWFuZCBkZXNjcmlwdG9ycyAqLworCXVuc2lnbmVkIGludAlzaXplOwkgICAgICAgIC8qICMgb2YgZGVzY3JpcHRvcnMgKi8KKwl1bnNpZ25lZCBpbnQJcHJvY2Vzc2VkOyAgICAgIC8qIHRvdGFsICMgb2YgZGVzY3MgSFcgaGFzIHByb2Nlc3NlZCAqLworCXVuc2lnbmVkIGludAljbGVhbmVkOyAgICAgICAgLyogdG90YWwgIyBvZiBkZXNjcyBTVyBoYXMgcmVjbGFpbWVkICovCisJdW5zaWduZWQgaW50CXN0b3BfdGhyZXM7ICAgICAvKiBTVyBUWCBxdWV1ZSBzdXNwZW5kIHRocmVzaG9sZCAqLworCXUxNgkJcGlkeDsgICAgICAgICAgIC8qIHByb2R1Y2VyIGluZGV4IChTVykgKi8KKwl1MTYJCWNpZHg7ICAgICAgICAgICAvKiBjb25zdW1lciBpbmRleCAoSFcpICovCisJdTgJCWdlbmJpdDsgICAgICAgICAvKiBjdXJyZW50IGdlbmVyYXRpb24gKD12YWxpZCkgYml0ICovCisJdTgJCXNvcDsgICAgICAgICAgICAvKiBpcyBuZXh0IGVudHJ5IHN0YXJ0IG9mIHBhY2tldD8gKi8KKwlzdHJ1Y3QgY21kUV9lICAqZW50cmllczsgICAgICAgIC8qIEhXIGNvbW1hbmQgZGVzY3JpcHRvciBRICovCisJc3RydWN0IGNtZFFfY2UgKmNlbnRyaWVzOyAgICAgICAvKiBTVyBjb21tYW5kIGNvbnRleHQgZGVzY3JpcHRvciBRICovCisJc3BpbmxvY2tfdAlsb2NrOyAgICAgICAgICAgLyogTG9jayB0byBwcm90ZWN0IGNtZFEgZW5xdWV1aW5nICovCisJZG1hX2FkZHJfdAlkbWFfYWRkcjsgICAgICAgLyogRE1BIGFkZHIgSFcgY29tbWFuZCBkZXNjcmlwdG9yIFEgKi8KK307CisKK3N0cnVjdCBmcmVlbFEgeworCXVuc2lnbmVkIGludAljcmVkaXRzOyAgICAgICAgLyogIyBvZiBhdmFpbGFibGUgUlggYnVmZmVycyAqLworCXVuc2lnbmVkIGludAlzaXplOwkgICAgICAgIC8qIGZyZWUgbGlzdCBjYXBhY2l0eSAqLworCXUxNgkJcGlkeDsgICAgICAgICAgIC8qIHByb2R1Y2VyIGluZGV4IChTVykgKi8KKwl1MTYJCWNpZHg7ICAgICAgICAgICAvKiBjb25zdW1lciBpbmRleCAoSFcpICovCisJdTE2CQlyeF9idWZmZXJfc2l6ZTsgLyogQnVmZmVyIHNpemUgb24gdGhpcyBmcmVlIGxpc3QgKi8KKwl1MTYJCWRtYV9vZmZzZXQ7ICAgICAvKiBETUEgb2Zmc2V0IHRvIGFsaWduIElQIGhlYWRlcnMgKi8KKwl1MTYJCXJlY3ljbGVxX2lkeDsgICAvKiBza2IgcmVjeWNsZSBxIHRvIHVzZSAqLworCXU4CQlnZW5iaXQ7CSAgICAgICAgLyogY3VycmVudCBnZW5lcmF0aW9uICg9dmFsaWQpIGJpdCAqLworCXN0cnVjdCBmcmVlbFFfZQkqZW50cmllczsgICAgICAgLyogSFcgZnJlZWxpc3QgZGVzY3JpcHRvciBRICovCisJc3RydWN0IGZyZWVsUV9jZSAqY2VudHJpZXM7ICAgICAvKiBTVyBmcmVlbGlzdCBjb250ZXh0IGRlc2NyaXB0b3IgUSAqLworCWRtYV9hZGRyX3QJZG1hX2FkZHI7ICAgICAgIC8qIERNQSBhZGRyIEhXIGZyZWVsaXN0IGRlc2NyaXB0b3IgUSAqLworfTsKKworc3RydWN0IHJlc3BRIHsKKwl1bnNpZ25lZCBpbnQJY3JlZGl0czsgICAgICAgIC8qIGNyZWRpdHMgdG8gYmUgcmV0dXJuZWQgdG8gU0dFICovCisJdW5zaWduZWQgaW50CXNpemU7CSAgICAgICAgLyogIyBvZiByZXNwb25zZSBRIGRlc2NyaXB0b3JzICovCisJdTE2CQljaWR4OwkgICAgICAgIC8qIGNvbnN1bWVyIGluZGV4IChTVykgKi8KKwl1OAkJZ2VuYml0OwkgICAgICAgIC8qIGN1cnJlbnQgZ2VuZXJhdGlvbig9dmFsaWQpIGJpdCAqLworCXN0cnVjdCByZXNwUV9lICplbnRyaWVzOyAgICAgICAgLyogSFcgcmVzcG9uc2UgZGVzY3JpcHRvciBRICovCisJZG1hX2FkZHJfdAlkbWFfYWRkcjsgICAgICAgLyogRE1BIGFkZHIgSFcgcmVzcG9uc2UgZGVzY3JpcHRvciBRICovCit9OworCisvKiBCaXQgZmxhZ3MgZm9yIGNtZFEuc3RhdHVzICovCitlbnVtIHsKKwlDTURRX1NUQVRfUlVOTklORyA9IDEsICAgICAgICAgIC8qIGZldGNoIGVuZ2luZSBpcyBydW5uaW5nICovCisJQ01EUV9TVEFUX0xBU1RfUEtUX0RCID0gMiAgICAgICAvKiBsYXN0IHBhY2tldCBydW5nIHRoZSBkb29yYmVsbCAqLworfTsKKworLyoKKyAqIE1haW4gU0dFIGRhdGEgc3RydWN0dXJlCisgKgorICogSW50ZXJydXB0cyBhcmUgaGFuZGxlZCBieSBhIHNpbmdsZSBDUFUgYW5kIGl0IGlzIGxpa2VseSB0aGF0IG9uIGEgTVAgc3lzdGVtCisgKiB0aGUgYXBwbGljYXRpb24gaXMgbWlncmF0ZWQgdG8gYW5vdGhlciBDUFUuIEluIHRoYXQgc2NlbmFyaW8sIHdlIHRyeSB0bworICogc2VwZXJhdGUgdGhlIFJYKGluIGlycSBjb250ZXh0KSBhbmQgVFggc3RhdGUgaW4gb3JkZXIgdG8gZGVjcmVhc2UgbWVtb3J5CisgKiBjb250ZW50aW9uLgorICovCitzdHJ1Y3Qgc2dlIHsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsgCS8qIGFkYXB0ZXIgYmFja3BvaW50ZXIgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAgICAgIC8qIG5ldGRldmljZSBiYWNrcG9pbnRlciAqLworCXN0cnVjdCBmcmVlbFEgCWZyZWVsUVtTR0VfRlJFRUxRX05dOyAvKiBidWZmZXIgZnJlZSBsaXN0cyAqLworCXN0cnVjdCByZXNwUSAJcmVzcFE7CQkvKiByZXNwb25zZSBRICovCisJdW5zaWduZWQgbG9uZyAgIHN0b3BwZWRfdHhfcXVldWVzOyAvKiBiaXRtYXAgb2Ygc3VzcGVuZGVkIFR4IHF1ZXVlcyAqLworCXVuc2lnbmVkIGludAlyeF9wa3RfcGFkOyAgICAgLyogUlggcGFkZGluZyBmb3IgTDIgcGFja2V0cyAqLworCXVuc2lnbmVkIGludAlqdW1ib19mbDsgICAgICAgLyoganVtYm8gZnJlZWxpc3QgUSBpbmRleCAqLworCXVuc2lnbmVkIGludAlpbnRydGltZXJfbnJlczsJLyogbm8tcmVzb3VyY2UgaW50ZXJydXB0IHRpbWVyICovCisJdW5zaWduZWQgaW50CWZpeGVkX2ludHJ0aW1lcjsvKiBub24tYWRhcHRpdmUgaW50ZXJydXB0IHRpbWVyICovCisJc3RydWN0IHRpbWVyX2xpc3QgdHhfcmVjbGFpbV90aW1lcjsgLyogcmVjbGFpbXMgVFggYnVmZmVycyAqLworCXN0cnVjdCB0aW1lcl9saXN0IGVzcGlidWdfdGltZXI7CisJdW5zaWduZWQgaW50CWVzcGlidWdfdGltZW91dDsKKwlzdHJ1Y3Qgc2tfYnVmZgkqZXNwaWJ1Z19za2I7CisJdTMyCQlzZ2VfY29udHJvbDsJLyogc2hhZG93IHZhbHVlIG9mIHNnZSBjb250cm9sIHJlZyAqLworCXN0cnVjdCBzZ2VfaW50cl9jb3VudHMgc3RhdHM7CisJc3RydWN0IHNnZV9wb3J0X3N0YXRzIHBvcnRfc3RhdHNbTUFYX05QT1JUU107CisJc3RydWN0IGNtZFEgY21kUVtTR0VfQ01EUV9OXSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworfTsKKworLyoKKyAqIFBJTyB0byBpbmRpY2F0ZSB0aGF0IG1lbW9yeSBtYXBwZWQgUSBjb250YWlucyB2YWxpZCBkZXNjcmlwdG9yKHMpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZG9vcmJlbGxfcGlvKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgdmFsKQoreworCXdtYigpOworCXdyaXRlbCh2YWwsIGFkYXB0ZXItPnJlZ3MgKyBBX1NHX0RPT1JCRUxMKTsKK30KKworLyoKKyAqIEZyZWVzIGFsbCBSWCBidWZmZXJzIG9uIHRoZSBmcmVlbGlzdCBRLiBUaGUgY2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQKKyAqIHRoZSBTR0UgaXMgdHVybmVkIG9mZiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBmcmVlX2ZyZWVsUV9idWZmZXJzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgZnJlZWxRICpxKQoreworCXVuc2lnbmVkIGludCBjaWR4ID0gcS0+Y2lkeDsKKworCXdoaWxlIChxLT5jcmVkaXRzLS0pIHsKKwkJc3RydWN0IGZyZWVsUV9jZSAqY2UgPSAmcS0+Y2VudHJpZXNbY2lkeF07CisKKwkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBwY2lfdW5tYXBfYWRkcihjZSwgZG1hX2FkZHIpLAorCQkJCSBwY2lfdW5tYXBfbGVuKGNlLCBkbWFfbGVuKSwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYihjZS0+c2tiKTsKKwkJY2UtPnNrYiA9IE5VTEw7CisJCWlmICgrK2NpZHggPT0gcS0+c2l6ZSkKKwkJCWNpZHggPSAwOworCX0KK30KKworLyoKKyAqIEZyZWUgUlggZnJlZSBsaXN0IGFuZCByZXNwb25zZSBxdWV1ZSByZXNvdXJjZXMuCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfcnhfcmVzb3VyY2VzKHN0cnVjdCBzZ2UgKnNnZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHNnZS0+YWRhcHRlci0+cGRldjsKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgaTsKKworCWlmIChzZ2UtPnJlc3BRLmVudHJpZXMpIHsKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVzcFFfZSkgKiBzZ2UtPnJlc3BRLnNpemU7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZSwgc2dlLT5yZXNwUS5lbnRyaWVzLAorCQkJCSAgICBzZ2UtPnJlc3BRLmRtYV9hZGRyKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU0dFX0ZSRUVMUV9OOyBpKyspIHsKKwkJc3RydWN0IGZyZWVsUSAqcSA9ICZzZ2UtPmZyZWVsUVtpXTsKKworCQlpZiAocS0+Y2VudHJpZXMpIHsKKwkJCWZyZWVfZnJlZWxRX2J1ZmZlcnMocGRldiwgcSk7CisJCQlrZnJlZShxLT5jZW50cmllcyk7CisJCX0KKwkJaWYgKHEtPmVudHJpZXMpIHsKKwkJCXNpemUgPSBzaXplb2Yoc3RydWN0IGZyZWVsUV9lKSAqIHEtPnNpemU7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemUsIHEtPmVudHJpZXMsCisJCQkJCSAgICBxLT5kbWFfYWRkcik7CisJCX0KKwl9Cit9CisKKy8qCisgKiBBbGxvY2F0ZXMgYmFzaWMgUlggcmVzb3VyY2VzLCBjb25zaXN0aW5nIG9mIG1lbW9yeSBtYXBwZWQgZnJlZWxpc3QgUXMgYW5kIGEKKyAqIHJlc3BvbnNlIHF1ZXVlLgorICovCitzdGF0aWMgaW50IGFsbG9jX3J4X3Jlc291cmNlcyhzdHJ1Y3Qgc2dlICpzZ2UsIHN0cnVjdCBzZ2VfcGFyYW1zICpwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gc2dlLT5hZGFwdGVyLT5wZGV2OworCXVuc2lnbmVkIGludCBzaXplLCBpOworCisJZm9yIChpID0gMDsgaSA8IFNHRV9GUkVFTFFfTjsgaSsrKSB7CisJCXN0cnVjdCBmcmVlbFEgKnEgPSAmc2dlLT5mcmVlbFFbaV07CisKKwkJcS0+Z2VuYml0ID0gMTsKKwkJcS0+c2l6ZSA9IHAtPmZyZWVsUV9zaXplW2ldOworCQlxLT5kbWFfb2Zmc2V0ID0gc2dlLT5yeF9wa3RfcGFkID8gMCA6IE5FVF9JUF9BTElHTjsKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnJlZWxRX2UpICogcS0+c2l6ZTsKKwkJcS0+ZW50cmllcyA9IChzdHJ1Y3QgZnJlZWxRX2UgKikKKwkJCSAgICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemUsICZxLT5kbWFfYWRkcik7CisJCWlmICghcS0+ZW50cmllcykKKwkJCWdvdG8gZXJyX25vX21lbTsKKwkJbWVtc2V0KHEtPmVudHJpZXMsIDAsIHNpemUpOworCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBmcmVlbFFfY2UpICogcS0+c2l6ZTsKKwkJcS0+Y2VudHJpZXMgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXEtPmNlbnRyaWVzKQorCQkJZ290byBlcnJfbm9fbWVtOworCQltZW1zZXQocS0+Y2VudHJpZXMsIDAsIHNpemUpOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBidWZmZXIgc2l6ZXMgZm9yIHRoZSB0d28gZnJlZSBsaXN0cy4gIEZMMCBhY2NvbW1vZGF0ZXMKKwkgKiByZWd1bGFyIHNpemVkIEV0aGVybmV0IGZyYW1lcywgRkwxIGlzIHNpemVkIG5vdCB0byBleGNlZWQgMTZLLAorCSAqIGluY2x1ZGluZyBhbGwgdGhlIHNrX2J1ZmYgb3ZlcmhlYWQuCisJICoKKwkgKiBOb3RlOiBGb3IgVDIgRkwwIGFuZCBGTDEgYXJlIHJldmVyc2VkLgorCSAqLworCXNnZS0+ZnJlZWxRWyFzZ2UtPmp1bWJvX2ZsXS5yeF9idWZmZXJfc2l6ZSA9IFNHRV9SWF9TTV9CVUZfU0laRSArCisJCXNpemVvZihzdHJ1Y3QgY3BsX3J4X2RhdGEpICsKKwkJc2dlLT5mcmVlbFFbIXNnZS0+anVtYm9fZmxdLmRtYV9vZmZzZXQ7CisJc2dlLT5mcmVlbFFbc2dlLT5qdW1ib19mbF0ucnhfYnVmZmVyX3NpemUgPSAoMTYgKiAxMDI0KSAtCisJCVNLQl9EQVRBX0FMSUdOKHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSk7CisKKwkvKgorCSAqIFNldHVwIHdoaWNoIHNrYiByZWN5Y2xlIFEgc2hvdWxkIGJlIHVzZWQgd2hlbiByZWN5Y2xpbmcgYnVmZmVycyBmcm9tCisJICogZWFjaCBmcmVlIGxpc3QuCisJICovCisJc2dlLT5mcmVlbFFbIXNnZS0+anVtYm9fZmxdLnJlY3ljbGVxX2lkeCA9IDA7CisJc2dlLT5mcmVlbFFbc2dlLT5qdW1ib19mbF0ucmVjeWNsZXFfaWR4ID0gMTsKKworCXNnZS0+cmVzcFEuZ2VuYml0ID0gMTsKKwlzZ2UtPnJlc3BRLnNpemUgPSBTR0VfUkVTUFFfRV9OOworCXNnZS0+cmVzcFEuY3JlZGl0cyA9IDA7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVzcFFfZSkgKiBzZ2UtPnJlc3BRLnNpemU7CisJc2dlLT5yZXNwUS5lbnRyaWVzID0gKHN0cnVjdCByZXNwUV9lICopCisJCXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemUsICZzZ2UtPnJlc3BRLmRtYV9hZGRyKTsKKwlpZiAoIXNnZS0+cmVzcFEuZW50cmllcykKKwkJZ290byBlcnJfbm9fbWVtOworCW1lbXNldChzZ2UtPnJlc3BRLmVudHJpZXMsIDAsIHNpemUpOworCXJldHVybiAwOworCitlcnJfbm9fbWVtOgorCWZyZWVfcnhfcmVzb3VyY2VzKHNnZSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qCisgKiBSZWNsYWltcyBuIFRYIGRlc2NyaXB0b3JzIGFuZCBmcmVlcyB0aGUgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdGhlbS4KKyAqLworc3RhdGljIHZvaWQgZnJlZV9jbWRRX2J1ZmZlcnMoc3RydWN0IHNnZSAqc2dlLCBzdHJ1Y3QgY21kUSAqcSwgdW5zaWduZWQgaW50IG4pCit7CisJc3RydWN0IGNtZFFfY2UgKmNlOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gc2dlLT5hZGFwdGVyLT5wZGV2OworCXVuc2lnbmVkIGludCBjaWR4ID0gcS0+Y2lkeDsKKworCXEtPmluX3VzZSAtPSBuOworCWNlID0gJnEtPmNlbnRyaWVzW2NpZHhdOworCXdoaWxlIChuLS0pIHsKKwkJaWYgKHEtPnNvcCkKKwkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgcGNpX3VubWFwX2FkZHIoY2UsIGRtYV9hZGRyKSwKKwkJCSAJCSBwY2lfdW5tYXBfbGVuKGNlLCBkbWFfbGVuKSwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQllbHNlCisJCQlwY2lfdW5tYXBfcGFnZShwZGV2LCBwY2lfdW5tYXBfYWRkcihjZSwgZG1hX2FkZHIpLAorCQkJIAkgICAgICAgcGNpX3VubWFwX2xlbihjZSwgZG1hX2xlbiksCisJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlxLT5zb3AgPSAwOworCQlpZiAoY2UtPnNrYikgeworCQkJZGV2X2tmcmVlX3NrYihjZS0+c2tiKTsKKwkJCXEtPnNvcCA9IDE7CisJCX0KKwkJY2UrKzsKKwkJaWYgKCsrY2lkeCA9PSBxLT5zaXplKSB7CisJCQljaWR4ID0gMDsKKwkJCWNlID0gcS0+Y2VudHJpZXM7CisJCX0KKwl9CisJcS0+Y2lkeCA9IGNpZHg7Cit9CisKKy8qCisgKiBGcmVlIFRYIHJlc291cmNlcy4KKyAqCisgKiBBc3N1bWVzIHRoYXQgU0dFIGlzIHN0b3BwZWQgYW5kIGFsbCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgZnJlZV90eF9yZXNvdXJjZXMoc3RydWN0IHNnZSAqc2dlKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gc2dlLT5hZGFwdGVyLT5wZGV2OworCXVuc2lnbmVkIGludCBzaXplLCBpOworCisJZm9yIChpID0gMDsgaSA8IFNHRV9DTURRX047IGkrKykgeworCQlzdHJ1Y3QgY21kUSAqcSA9ICZzZ2UtPmNtZFFbaV07CisKKwkJaWYgKHEtPmNlbnRyaWVzKSB7CisJCQlpZiAocS0+aW5fdXNlKQorCQkJCWZyZWVfY21kUV9idWZmZXJzKHNnZSwgcSwgcS0+aW5fdXNlKTsKKwkJCWtmcmVlKHEtPmNlbnRyaWVzKTsKKwkJfQorCQlpZiAocS0+ZW50cmllcykgeworCQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21kUV9lKSAqIHEtPnNpemU7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemUsIHEtPmVudHJpZXMsCisJCQkJCSAgICBxLT5kbWFfYWRkcik7CisJCX0KKwl9Cit9CisKKy8qCisgKiBBbGxvY2F0ZXMgYmFzaWMgVFggcmVzb3VyY2VzLCBjb25zaXN0aW5nIG9mIG1lbW9yeSBtYXBwZWQgY29tbWFuZCBRcy4KKyAqLworc3RhdGljIGludCBhbGxvY190eF9yZXNvdXJjZXMoc3RydWN0IHNnZSAqc2dlLCBzdHJ1Y3Qgc2dlX3BhcmFtcyAqcCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHNnZS0+YWRhcHRlci0+cGRldjsKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTR0VfQ01EUV9OOyBpKyspIHsKKwkJc3RydWN0IGNtZFEgKnEgPSAmc2dlLT5jbWRRW2ldOworCisJCXEtPmdlbmJpdCA9IDE7CisJCXEtPnNvcCA9IDE7CisJCXEtPnNpemUgPSBwLT5jbWRRX3NpemVbaV07CisJCXEtPmluX3VzZSA9IDA7CisJCXEtPnN0YXR1cyA9IDA7CisJCXEtPnByb2Nlc3NlZCA9IHEtPmNsZWFuZWQgPSAwOworCQlxLT5zdG9wX3RocmVzID0gMDsKKwkJc3Bpbl9sb2NrX2luaXQoJnEtPmxvY2spOworCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBjbWRRX2UpICogcS0+c2l6ZTsKKwkJcS0+ZW50cmllcyA9IChzdHJ1Y3QgY21kUV9lICopCisJCQkgICAgICBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplLCAmcS0+ZG1hX2FkZHIpOworCQlpZiAoIXEtPmVudHJpZXMpCisJCQlnb3RvIGVycl9ub19tZW07CisJCW1lbXNldChxLT5lbnRyaWVzLCAwLCBzaXplKTsKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21kUV9jZSkgKiBxLT5zaXplOworCQlxLT5jZW50cmllcyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcS0+Y2VudHJpZXMpCisJCQlnb3RvIGVycl9ub19tZW07CisJCW1lbXNldChxLT5jZW50cmllcywgMCwgc2l6ZSk7CisJfQorCisJLyoKKwkgKiBDb21tYW5kUSAwIGhhbmRsZXMgRXRoZXJuZXQgYW5kIFRPRSBwYWNrZXRzLCB3aGlsZSBxdWV1ZSAxIGlzIFRPRQorCSAqIG9ubHkuICBGb3IgcXVldWUgMCBzZXQgdGhlIHN0b3AgdGhyZXNob2xkIHNvIHdlIGNhbiBoYW5kbGUgb25lIG1vcmUKKwkgKiBwYWNrZXQgZnJvbSBlYWNoIHBvcnQsIHBsdXMgcmVzZXJ2ZSBhbiBhZGRpdGlvbmFsIDI0IGVudHJpZXMgZm9yCisJICogRXRoZXJuZXQgcGFja2V0cyBvbmx5LiAgUXVldWUgMSBuZXZlciBzdXNwZW5kcyBub3IgZG8gd2UgcmVzZXJ2ZQorCSAqIHNwYWNlIGZvciBFdGhlcm5ldCBwYWNrZXRzLgorCSAqLworCXNnZS0+Y21kUVswXS5zdG9wX3RocmVzID0gc2dlLT5hZGFwdGVyLT5wYXJhbXMubnBvcnRzICoKKwkJKE1BWF9TS0JfRlJBR1MgKyAxKTsKKwlyZXR1cm4gMDsKKworZXJyX25vX21lbToKKwlmcmVlX3R4X3Jlc291cmNlcyhzZ2UpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfcmluZ19wYXJhbXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBhZGRyLAorCQkJCSAgICAgdTMyIHNpemUsIGludCBiYXNlX3JlZ19sbywKKwkJCQkgICAgIGludCBiYXNlX3JlZ19oaSwgaW50IHNpemVfcmVnKQoreworCXdyaXRlbCgodTMyKWFkZHIsIGFkYXB0ZXItPnJlZ3MgKyBiYXNlX3JlZ19sbyk7CisJd3JpdGVsKGFkZHIgPj4gMzIsIGFkYXB0ZXItPnJlZ3MgKyBiYXNlX3JlZ19oaSk7CisJd3JpdGVsKHNpemUsIGFkYXB0ZXItPnJlZ3MgKyBzaXplX3JlZyk7Cit9CisKKy8qCisgKiBFbmFibGUvZGlzYWJsZSBWTEFOIGFjY2VsZXJhdGlvbi4KKyAqLwordm9pZCB0MV9zZXRfdmxhbl9hY2NlbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IG9uX29mZikKK3sKKwlzdHJ1Y3Qgc2dlICpzZ2UgPSBhZGFwdGVyLT5zZ2U7CisKKwlzZ2UtPnNnZV9jb250cm9sICY9IH5GX1ZMQU5fWFRSQUNUOworCWlmIChvbl9vZmYpCisJCXNnZS0+c2dlX2NvbnRyb2wgfD0gRl9WTEFOX1hUUkFDVDsKKwlpZiAoYWRhcHRlci0+b3Blbl9kZXZpY2VfbWFwKSB7CisJCXdyaXRlbChzZ2UtPnNnZV9jb250cm9sLCBhZGFwdGVyLT5yZWdzICsgQV9TR19DT05UUk9MKTsKKwkJcmVhZGwoYWRhcHRlci0+cmVncyArIEFfU0dfQ09OVFJPTCk7IC8qIGZsdXNoICovCisJfQorfQorCisvKgorICogUHJvZ3JhbXMgdGhlIHZhcmlvdXMgU0dFIHJlZ2lzdGVycy4gSG93ZXZlciwgdGhlIGVuZ2luZSBpcyBub3QgeWV0IGVuYWJsZWQsCisgKiBidXQgc2dlLT5zZ2VfY29udHJvbCBpcyBzZXR1cCBhbmQgcmVhZHkgdG8gZ28uCisgKi8KK3N0YXRpYyB2b2lkIGNvbmZpZ3VyZV9zZ2Uoc3RydWN0IHNnZSAqc2dlLCBzdHJ1Y3Qgc2dlX3BhcmFtcyAqcCkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYXAgPSBzZ2UtPmFkYXB0ZXI7CisJCisJd3JpdGVsKDAsIGFwLT5yZWdzICsgQV9TR19DT05UUk9MKTsKKwlzZXR1cF9yaW5nX3BhcmFtcyhhcCwgc2dlLT5jbWRRWzBdLmRtYV9hZGRyLCBzZ2UtPmNtZFFbMF0uc2l6ZSwKKwkJCSAgQV9TR19DTUQwQkFTRUxXUiwgQV9TR19DTUQwQkFTRVVQUiwgQV9TR19DTUQwU0laRSk7CisJc2V0dXBfcmluZ19wYXJhbXMoYXAsIHNnZS0+Y21kUVsxXS5kbWFfYWRkciwgc2dlLT5jbWRRWzFdLnNpemUsCisJCQkgIEFfU0dfQ01EMUJBU0VMV1IsIEFfU0dfQ01EMUJBU0VVUFIsIEFfU0dfQ01EMVNJWkUpOworCXNldHVwX3JpbmdfcGFyYW1zKGFwLCBzZ2UtPmZyZWVsUVswXS5kbWFfYWRkciwKKwkJCSAgc2dlLT5mcmVlbFFbMF0uc2l6ZSwgQV9TR19GTDBCQVNFTFdSLAorCQkJICBBX1NHX0ZMMEJBU0VVUFIsIEFfU0dfRkwwU0laRSk7CisJc2V0dXBfcmluZ19wYXJhbXMoYXAsIHNnZS0+ZnJlZWxRWzFdLmRtYV9hZGRyLAorCQkJICBzZ2UtPmZyZWVsUVsxXS5zaXplLCBBX1NHX0ZMMUJBU0VMV1IsCisJCQkgIEFfU0dfRkwxQkFTRVVQUiwgQV9TR19GTDFTSVpFKTsKKworCS8qIFRoZSB0aHJlc2hvbGQgY29tcGFyaXNvbiB1c2VzIDwuICovCisJd3JpdGVsKFNHRV9SWF9TTV9CVUZfU0laRSArIDEsIGFwLT5yZWdzICsgQV9TR19GTFRIUkVTSE9MRCk7CisKKwlzZXR1cF9yaW5nX3BhcmFtcyhhcCwgc2dlLT5yZXNwUS5kbWFfYWRkciwgc2dlLT5yZXNwUS5zaXplLAorCQkJICBBX1NHX1JTUEJBU0VMV1IsIEFfU0dfUlNQQkFTRVVQUiwgQV9TR19SU1BTSVpFKTsKKwl3cml0ZWwoKHUzMilzZ2UtPnJlc3BRLnNpemUgLSAxLCBhcC0+cmVncyArIEFfU0dfUlNQUVVFVUVDUkVESVQpOworCisJc2dlLT5zZ2VfY29udHJvbCA9IEZfQ01EUTBfRU5BQkxFIHwgRl9DTURRMV9FTkFCTEUgfCBGX0ZMMF9FTkFCTEUgfAorCQlGX0ZMMV9FTkFCTEUgfCBGX0NQTF9FTkFCTEUgfCBGX1JFU1BPTlNFX1FVRVVFX0VOQUJMRSB8CisJCVZfQ01EUV9QUklPUklUWSgyKSB8IEZfRElTQUJMRV9DTURRMV9HVFMgfCBGX0lTQ1NJX0NPQUxFU0NFIHwKKwkJRl9ESVNBQkxFX0ZMMF9HVFMgfCBGX0RJU0FCTEVfRkwxX0dUUyB8CisJCVZfUlhfUEtUX09GRlNFVChzZ2UtPnJ4X3BrdF9wYWQpOworCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJc2dlLT5zZ2VfY29udHJvbCB8PSBGX0VOQUJMRV9CSUdfRU5ESUFOOworI2VuZGlmCisKKwkvKiBJbml0aWFsaXplIG5vLXJlc291cmNlIHRpbWVyICovCisJc2dlLT5pbnRydGltZXJfbnJlcyA9IFNHRV9JTlRSVElNRVJfTlJFUyAqIGNvcmVfdGlja3NfcGVyX3VzZWMoYXApOworCisJdDFfc2dlX3NldF9jb2FsZXNjZV9wYXJhbXMoc2dlLCBwKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgcGF5bG9hZCBjYXBhY2l0eSBvZiB0aGUganVtYm8gZnJlZS1saXN0IGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGp1bWJvX3BheWxvYWRfY2FwYWNpdHkoY29uc3Qgc3RydWN0IHNnZSAqc2dlKQoreworCXJldHVybiBzZ2UtPmZyZWVsUVtzZ2UtPmp1bWJvX2ZsXS5yeF9idWZmZXJfc2l6ZSAtCisJCXNnZS0+ZnJlZWxRW3NnZS0+anVtYm9fZmxdLmRtYV9vZmZzZXQgLQorCQlzaXplb2Yoc3RydWN0IGNwbF9yeF9kYXRhKTsKK30KKworLyoKKyAqIEZyZWVzIGFsbCBTR0UgcmVsYXRlZCByZXNvdXJjZXMgYW5kIHRoZSBzZ2Ugc3RydWN0dXJlIGl0c2VsZgorICovCit2b2lkIHQxX3NnZV9kZXN0cm95KHN0cnVjdCBzZ2UgKnNnZSkKK3sKKwlpZiAoc2dlLT5lc3BpYnVnX3NrYikKKwkJa2ZyZWVfc2tiKHNnZS0+ZXNwaWJ1Z19za2IpOworCisJZnJlZV90eF9yZXNvdXJjZXMoc2dlKTsKKwlmcmVlX3J4X3Jlc291cmNlcyhzZ2UpOworCWtmcmVlKHNnZSk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZXMgbmV3IFJYIGJ1ZmZlcnMgb24gdGhlIGZyZWVsaXN0IFEgKGFuZCB0cmFja3MgdGhlbSBvbiB0aGUgZnJlZWxpc3QKKyAqIGNvbnRleHQgUSkgdW50aWwgdGhlIFEgaXMgZnVsbCBvciBhbGxvY19za2IgZmFpbHMuCisgKgorICogSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgZ2VuZXJhdGlvbiBiaXRzIGFscmVhZHkgbWF0Y2gsIGluZGljYXRpbmcgdGhhdCB0aGUKKyAqIGJ1ZmZlciBpcyBhbHJlYWR5IHZhbGlkIGFuZCBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUuIFRoaXMgaGFwcGVucyB3aGVuIHdlCisgKiBjb3BpZWQgYSByZWNlaXZlZCBidWZmZXIgaW50byBhIG5ldyBza19idWZmIGR1cmluZyB0aGUgaW50ZXJydXB0IHByb2Nlc3NpbmcuCisgKgorICogSWYgdGhlIFNHRSBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgYWxpZ24gcGFja2V0cyBwcm9wZXJseSAoIXNnZS0+cnhfcGt0X3BhZCksCisgKiB3ZSBzcGVjaWZ5IGEgUlhfT0ZGU0VUIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBJUCBoZWFkZXIgaXMgNEIKKyAqIGFsaWduZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJlZmlsbF9mcmVlX2xpc3Qoc3RydWN0IHNnZSAqc2dlLCBzdHJ1Y3QgZnJlZWxRICpxKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gc2dlLT5hZGFwdGVyLT5wZGV2OworCXN0cnVjdCBmcmVlbFFfY2UgKmNlID0gJnEtPmNlbnRyaWVzW3EtPnBpZHhdOworCXN0cnVjdCBmcmVlbFFfZSAqZSA9ICZxLT5lbnRyaWVzW3EtPnBpZHhdOworCXVuc2lnbmVkIGludCBkbWFfbGVuID0gcS0+cnhfYnVmZmVyX3NpemUgLSBxLT5kbWFfb2Zmc2V0OworCisKKwl3aGlsZSAocS0+Y3JlZGl0cyA8IHEtPnNpemUpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCisJCXNrYiA9IGFsbG9jX3NrYihxLT5yeF9idWZmZXJfc2l6ZSwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisKKwkJc2tiX3Jlc2VydmUoc2tiLCBxLT5kbWFfb2Zmc2V0KTsKKwkJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwgZG1hX2xlbiwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWNlLT5za2IgPSBza2I7CisJCXBjaV91bm1hcF9hZGRyX3NldChjZSwgZG1hX2FkZHIsIG1hcHBpbmcpOworCQlwY2lfdW5tYXBfbGVuX3NldChjZSwgZG1hX2xlbiwgZG1hX2xlbik7CisJCWUtPmFkZHJfbG8gPSAodTMyKW1hcHBpbmc7CisJCWUtPmFkZHJfaGkgPSAodTY0KW1hcHBpbmcgPj4gMzI7CisJCWUtPmxlbl9nZW4gPSBWX0NNRF9MRU4oZG1hX2xlbikgfCBWX0NNRF9HRU4xKHEtPmdlbmJpdCk7CisJCXdtYigpOworCQllLT5nZW4yID0gVl9DTURfR0VOMihxLT5nZW5iaXQpOworCisJCWUrKzsKKwkJY2UrKzsKKwkJaWYgKCsrcS0+cGlkeCA9PSBxLT5zaXplKSB7CisJCQlxLT5waWR4ID0gMDsKKwkJCXEtPmdlbmJpdCBePSAxOworCQkJY2UgPSBxLT5jZW50cmllczsKKwkJCWUgPSBxLT5lbnRyaWVzOworCQl9CisJCXEtPmNyZWRpdHMrKzsKKwl9CisKK30KKworLyoKKyAqIENhbGxzIHJlZmlsbF9mcmVlX2xpc3QgZm9yIGJvdGggZnJlZSBsaXN0cy4gSWYgd2UgY2Fubm90IGZpbGwgYXQgbGVhc3QgMS80CisgKiBvZiBib3RoIHJpbmdzLCB3ZSBnbyBpbnRvICdmZXcgaW50ZXJydXB0IG1vZGUnIGluIG9yZGVyIHRvIGdpdmUgdGhlIHN5c3RlbQorICogdGltZSB0byBmcmVlIHVwIHJlc291cmNlcy4KKyAqLworc3RhdGljIHZvaWQgZnJlZWxRc19lbXB0eShzdHJ1Y3Qgc2dlICpzZ2UpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBzZ2UtPmFkYXB0ZXI7CisJdTMyIGlycV9yZWcgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9TR19JTlRfRU5BQkxFKTsKKwl1MzIgaXJxaG9sZG9mZl9yZWc7CisKKwlyZWZpbGxfZnJlZV9saXN0KHNnZSwgJnNnZS0+ZnJlZWxRWzBdKTsKKwlyZWZpbGxfZnJlZV9saXN0KHNnZSwgJnNnZS0+ZnJlZWxRWzFdKTsKKworCWlmIChzZ2UtPmZyZWVsUVswXS5jcmVkaXRzID4gKHNnZS0+ZnJlZWxRWzBdLnNpemUgPj4gMikgJiYKKwkgICAgc2dlLT5mcmVlbFFbMV0uY3JlZGl0cyA+IChzZ2UtPmZyZWVsUVsxXS5zaXplID4+IDIpKSB7CisJCWlycV9yZWcgfD0gRl9GTF9FWEhBVVNURUQ7CisJCWlycWhvbGRvZmZfcmVnID0gc2dlLT5maXhlZF9pbnRydGltZXI7CisJfSBlbHNlIHsKKwkJLyogQ2xlYXIgdGhlIEZfRkxfRVhIQVVTVEVEIGludGVycnVwdHMgZm9yIG5vdyAqLworCQlpcnFfcmVnICY9IH5GX0ZMX0VYSEFVU1RFRDsKKwkJaXJxaG9sZG9mZl9yZWcgPSBzZ2UtPmludHJ0aW1lcl9ucmVzOworCX0KKwl3cml0ZWwoaXJxaG9sZG9mZl9yZWcsIGFkYXB0ZXItPnJlZ3MgKyBBX1NHX0lOVFJUSU1FUik7CisJd3JpdGVsKGlycV9yZWcsIGFkYXB0ZXItPnJlZ3MgKyBBX1NHX0lOVF9FTkFCTEUpOworCisJLyogV2UgcmVlbmFibGUgdGhlIFFzIHRvIGZvcmNlIGEgZnJlZWxpc3QgR1RTIGludGVycnVwdCBsYXRlciAqLworCWRvb3JiZWxsX3BpbyhhZGFwdGVyLCBGX0ZMMF9FTkFCTEUgfCBGX0ZMMV9FTkFCTEUpOworfQorCisjZGVmaW5lIFNHRV9QTF9JTlRSX01BU0sgKEZfUExfSU5UUl9TR0VfRVJSIHwgRl9QTF9JTlRSX1NHRV9EQVRBKQorI2RlZmluZSBTR0VfSU5UX0ZBVEFMIChGX1JFU1BRX09WRVJGTE9XIHwgRl9QQUNLRVRfVE9PX0JJRyB8IEZfUEFDS0VUX01JU01BVENIKQorI2RlZmluZSBTR0VfSU5UX0VOQUJMRSAoRl9SRVNQUV9FWEhBVVNURUQgfCBGX1JFU1BRX09WRVJGTE9XIHwgXAorCQkJRl9GTF9FWEhBVVNURUQgfCBGX1BBQ0tFVF9UT09fQklHIHwgRl9QQUNLRVRfTUlTTUFUQ0gpCisKKy8qCisgKiBEaXNhYmxlIFNHRSBJbnRlcnJ1cHRzCisgKi8KK3ZvaWQgdDFfc2dlX2ludHJfZGlzYWJsZShzdHJ1Y3Qgc2dlICpzZ2UpCit7CisJdTMyIHZhbCA9IHJlYWRsKHNnZS0+YWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKworCXdyaXRlbCh2YWwgJiB+U0dFX1BMX0lOVFJfTUFTSywgc2dlLT5hZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworCXdyaXRlbCgwLCBzZ2UtPmFkYXB0ZXItPnJlZ3MgKyBBX1NHX0lOVF9FTkFCTEUpOworfQorCisvKgorICogRW5hYmxlIFNHRSBpbnRlcnJ1cHRzLgorICovCit2b2lkIHQxX3NnZV9pbnRyX2VuYWJsZShzdHJ1Y3Qgc2dlICpzZ2UpCit7CisJdTMyIGVuID0gU0dFX0lOVF9FTkFCTEU7CisJdTMyIHZhbCA9IHJlYWRsKHNnZS0+YWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKworCWlmIChzZ2UtPmFkYXB0ZXItPmZsYWdzICYgVFNPX0NBUEFCTEUpCisJCWVuICY9IH5GX1BBQ0tFVF9UT09fQklHOworCXdyaXRlbChlbiwgc2dlLT5hZGFwdGVyLT5yZWdzICsgQV9TR19JTlRfRU5BQkxFKTsKKwl3cml0ZWwodmFsIHwgU0dFX1BMX0lOVFJfTUFTSywgc2dlLT5hZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworfQorCisvKgorICogQ2xlYXIgU0dFIGludGVycnVwdHMuCisgKi8KK3ZvaWQgdDFfc2dlX2ludHJfY2xlYXIoc3RydWN0IHNnZSAqc2dlKQoreworCXdyaXRlbChTR0VfUExfSU5UUl9NQVNLLCBzZ2UtPmFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKTsKKwl3cml0ZWwoMHhmZmZmZmZmZiwgc2dlLT5hZGFwdGVyLT5yZWdzICsgQV9TR19JTlRfQ0FVU0UpOworfQorCisvKgorICogU0dFICdFcnJvcicgaW50ZXJydXB0IGhhbmRsZXIKKyAqLworaW50IHQxX3NnZV9pbnRyX2Vycm9yX2hhbmRsZXIoc3RydWN0IHNnZSAqc2dlKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gc2dlLT5hZGFwdGVyOworCXUzMiBjYXVzZSA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX1NHX0lOVF9DQVVTRSk7CisKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBUU09fQ0FQQUJMRSkKKwkJY2F1c2UgJj0gfkZfUEFDS0VUX1RPT19CSUc7CisJaWYgKGNhdXNlICYgRl9SRVNQUV9FWEhBVVNURUQpCisJCXNnZS0+c3RhdHMucmVzcFFfZW1wdHkrKzsKKwlpZiAoY2F1c2UgJiBGX1JFU1BRX09WRVJGTE9XKSB7CisJCXNnZS0+c3RhdHMucmVzcFFfb3ZlcmZsb3crKzsKKwkJQ0hfQUxFUlQoIiVzOiBTR0UgcmVzcG9uc2UgcXVldWUgb3ZlcmZsb3dcbiIsCisJCQkgYWRhcHRlci0+bmFtZSk7CisJfQorCWlmIChjYXVzZSAmIEZfRkxfRVhIQVVTVEVEKSB7CisJCXNnZS0+c3RhdHMuZnJlZWxpc3RRX2VtcHR5Kys7CisJCWZyZWVsUXNfZW1wdHkoc2dlKTsKKwl9CisJaWYgKGNhdXNlICYgRl9QQUNLRVRfVE9PX0JJRykgeworCQlzZ2UtPnN0YXRzLnBrdF90b29fYmlnKys7CisJCUNIX0FMRVJUKCIlczogU0dFIG1heCBwYWNrZXQgc2l6ZSBleGNlZWRlZFxuIiwKKwkJCSBhZGFwdGVyLT5uYW1lKTsKKwl9CisJaWYgKGNhdXNlICYgRl9QQUNLRVRfTUlTTUFUQ0gpIHsKKwkJc2dlLT5zdGF0cy5wa3RfbWlzbWF0Y2grKzsKKwkJQ0hfQUxFUlQoIiVzOiBTR0UgcGFja2V0IG1pc21hdGNoXG4iLCBhZGFwdGVyLT5uYW1lKTsKKwl9CisJaWYgKGNhdXNlICYgU0dFX0lOVF9GQVRBTCkKKwkJdDFfZmF0YWxfZXJyKGFkYXB0ZXIpOworCisJd3JpdGVsKGNhdXNlLCBhZGFwdGVyLT5yZWdzICsgQV9TR19JTlRfQ0FVU0UpOworCXJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3Qgc2dlX2ludHJfY291bnRzICp0MV9zZ2VfZ2V0X2ludHJfY291bnRzKHN0cnVjdCBzZ2UgKnNnZSkKK3sKKwlyZXR1cm4gJnNnZS0+c3RhdHM7Cit9CisKK2NvbnN0IHN0cnVjdCBzZ2VfcG9ydF9zdGF0cyAqdDFfc2dlX2dldF9wb3J0X3N0YXRzKHN0cnVjdCBzZ2UgKnNnZSwgaW50IHBvcnQpCit7CisJcmV0dXJuICZzZ2UtPnBvcnRfc3RhdHNbcG9ydF07Cit9CisKKy8qKgorICoJcmVjeWNsZV9mbF9idWYgLSByZWN5Y2xlIGEgZnJlZSBsaXN0IGJ1ZmZlcgorICoJQGZsOiB0aGUgZnJlZSBsaXN0CisgKglAaWR4OiBpbmRleCBvZiBidWZmZXIgdG8gcmVjeWNsZQorICoKKyAqCVJlY3ljbGVzIHRoZSBzcGVjaWZpZWQgYnVmZmVyIG9uIHRoZSBnaXZlbiBmcmVlIGxpc3QgYnkgYWRkaW5nIGl0IGF0CisgKgl0aGUgbmV4dCBhdmFpbGFibGUgc2xvdCBvbiB0aGUgbGlzdC4KKyAqLworc3RhdGljIHZvaWQgcmVjeWNsZV9mbF9idWYoc3RydWN0IGZyZWVsUSAqZmwsIGludCBpZHgpCit7CisJc3RydWN0IGZyZWVsUV9lICpmcm9tID0gJmZsLT5lbnRyaWVzW2lkeF07CisJc3RydWN0IGZyZWVsUV9lICp0byA9ICZmbC0+ZW50cmllc1tmbC0+cGlkeF07CisKKwlmbC0+Y2VudHJpZXNbZmwtPnBpZHhdID0gZmwtPmNlbnRyaWVzW2lkeF07CisJdG8tPmFkZHJfbG8gPSBmcm9tLT5hZGRyX2xvOworCXRvLT5hZGRyX2hpID0gZnJvbS0+YWRkcl9oaTsKKwl0by0+bGVuX2dlbiA9IEdfQ01EX0xFTihmcm9tLT5sZW5fZ2VuKSB8IFZfQ01EX0dFTjEoZmwtPmdlbmJpdCk7CisJd21iKCk7CisJdG8tPmdlbjIgPSBWX0NNRF9HRU4yKGZsLT5nZW5iaXQpOworCWZsLT5jcmVkaXRzKys7CisKKwlpZiAoKytmbC0+cGlkeCA9PSBmbC0+c2l6ZSkgeworCQlmbC0+cGlkeCA9IDA7CisJCWZsLT5nZW5iaXQgXj0gMTsKKwl9Cit9CisKKy8qKgorICoJZ2V0X3BhY2tldCAtIHJldHVybiB0aGUgbmV4dCBpbmdyZXNzIHBhY2tldCBidWZmZXIKKyAqCUBwZGV2OiB0aGUgUENJIGRldmljZSB0aGF0IHJlY2VpdmVkIHRoZSBwYWNrZXQKKyAqCUBmbDogdGhlIFNHRSBmcmVlIGxpc3QgaG9sZGluZyB0aGUgcGFja2V0CisgKglAbGVuOiB0aGUgYWN0dWFsIHBhY2tldCBsZW5ndGgsIGV4Y2x1ZGluZyBhbnkgU0dFIHBhZGRpbmcKKyAqCUBkbWFfcGFkOiBwYWRkaW5nIGF0IGJlZ2lubmluZyBvZiBidWZmZXIgbGVmdCBieSBTR0UgRE1BCisgKglAc2tiX3BhZDogcGFkZGluZyB0byBiZSB1c2VkIGlmIHRoZSBwYWNrZXQgaXMgY29waWVkCisgKglAY29weV90aHJlczogbGVuZ3RoIHRocmVzaG9sZCB1bmRlciB3aGljaCBhIHBhY2tldCBzaG91bGQgYmUgY29waWVkCisgKglAZHJvcF90aHJlczogIyBvZiByZW1haW5pbmcgYnVmZmVycyBiZWZvcmUgd2Ugc3RhcnQgZHJvcHBpbmcgcGFja2V0cworICoKKyAqCUdldCB0aGUgbmV4dCBwYWNrZXQgZnJvbSBhIGZyZWUgbGlzdCBhbmQgY29tcGxldGUgc2V0dXAgb2YgdGhlCisgKglza19idWZmLiAgSWYgdGhlIHBhY2tldCBpcyBzbWFsbCB3ZSBtYWtlIGEgY29weSBhbmQgcmVjeWNsZSB0aGUKKyAqCW9yaWdpbmFsIGJ1ZmZlciwgb3RoZXJ3aXNlIHdlIHVzZSB0aGUgb3JpZ2luYWwgYnVmZmVyIGl0c2VsZi4gIElmIGEKKyAqCXBvc2l0aXZlIGRyb3AgdGhyZXNob2xkIGlzIHN1cHBsaWVkIHBhY2tldHMgYXJlIGRyb3BwZWQgYW5kIHRoZWlyCisgKglidWZmZXJzIHJlY3ljbGVkIGlmIChhKSB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBidWZmZXJzIGlzIHVuZGVyIHRoZQorICoJdGhyZXNob2xkIGFuZCB0aGUgcGFja2V0IGlzIHRvbyBiaWcgdG8gY29weSwgb3IgKGIpIHRoZSBwYWNrZXQgc2hvdWxkCisgKgliZSBjb3BpZWQgYnV0IHRoZXJlIGlzIG5vIG1lbW9yeSBmb3IgdGhlIGNvcHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmdldF9wYWNrZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCSBzdHJ1Y3QgZnJlZWxRICpmbCwgdW5zaWduZWQgaW50IGxlbiwKKwkJCQkJIGludCBkbWFfcGFkLCBpbnQgc2tiX3BhZCwKKwkJCQkJIHVuc2lnbmVkIGludCBjb3B5X3RocmVzLAorCQkJCQkgdW5zaWduZWQgaW50IGRyb3BfdGhyZXMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgZnJlZWxRX2NlICpjZSA9ICZmbC0+Y2VudHJpZXNbZmwtPmNpZHhdOworCisJaWYgKGxlbiA8IGNvcHlfdGhyZXMpIHsKKwkJc2tiID0gYWxsb2Nfc2tiKGxlbiArIHNrYl9wYWQsIEdGUF9BVE9NSUMpOworCQlpZiAobGlrZWx5KHNrYiAhPSBOVUxMKSkgeworCQkJc2tiX3Jlc2VydmUoc2tiLCBza2JfcGFkKTsKKwkJCXNrYl9wdXQoc2tiLCBsZW4pOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHBkZXYsCisJCQkJCSAgICBwY2lfdW5tYXBfYWRkcihjZSwgZG1hX2FkZHIpLAorIAkJCQkJICAgIHBjaV91bm1hcF9sZW4oY2UsIGRtYV9sZW4pLAorCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCW1lbWNweShza2ItPmRhdGEsIGNlLT5za2ItPmRhdGEgKyBkbWFfcGFkLCBsZW4pOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBkZXYsCisJCQkJCSAgICBwY2lfdW5tYXBfYWRkcihjZSwgZG1hX2FkZHIpLAorIAkJCQkJICAgIHBjaV91bm1hcF9sZW4oY2UsIGRtYV9sZW4pLAorCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJfSBlbHNlIGlmICghZHJvcF90aHJlcykKKwkJCWdvdG8gdXNlX29yaWdfYnVmOworCisJCXJlY3ljbGVfZmxfYnVmKGZsLCBmbC0+Y2lkeCk7CisJCXJldHVybiBza2I7CisJfQorCisJaWYgKGZsLT5jcmVkaXRzIDwgZHJvcF90aHJlcykgeworCQlyZWN5Y2xlX2ZsX2J1ZihmbCwgZmwtPmNpZHgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKK3VzZV9vcmlnX2J1ZjoKKwlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIHBjaV91bm1hcF9hZGRyKGNlLCBkbWFfYWRkciksCisJCQkgcGNpX3VubWFwX2xlbihjZSwgZG1hX2xlbiksIFBDSV9ETUFfRlJPTURFVklDRSk7CisJc2tiID0gY2UtPnNrYjsKKwlza2JfcmVzZXJ2ZShza2IsIGRtYV9wYWQpOworCXNrYl9wdXQoc2tiLCBsZW4pOworCXJldHVybiBza2I7Cit9CisKKy8qKgorICoJdW5leHBlY3RlZF9vZmZsb2FkIC0gaGFuZGxlIGFuIHVuZXhwZWN0ZWQgb2ZmbG9hZCBwYWNrZXQKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQGZsOiB0aGUgZnJlZSBsaXN0IHRoYXQgcmVjZWl2ZWQgdGhlIHBhY2tldAorICoKKyAqCUNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYW4gdW5leHBlY3RlZCBvZmZsb2FkIHBhY2tldCAoZS5nLiwgdGhlIFRPRQorICoJZnVuY3Rpb24gaXMgZGlzYWJsZWQgb3IgdGhlIGNhcmQgaXMgYSBOSUMpLiAgUHJpbnRzIGEgbWVzc2FnZSBhbmQKKyAqCXJlY3ljbGVzIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIHVuZXhwZWN0ZWRfb2ZmbG9hZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGZyZWVsUSAqZmwpCit7CisJc3RydWN0IGZyZWVsUV9jZSAqY2UgPSAmZmwtPmNlbnRyaWVzW2ZsLT5jaWR4XTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gY2UtPnNrYjsKKworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShhZGFwdGVyLT5wZGV2LCBwY2lfdW5tYXBfYWRkcihjZSwgZG1hX2FkZHIpLAorCQkJICAgIHBjaV91bm1hcF9sZW4oY2UsIGRtYV9sZW4pLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCUNIX0VSUigiJXM6IHVuZXhwZWN0ZWQgb2ZmbG9hZCBwYWNrZXQsIGNtZCAldVxuIiwKKwkgICAgICAgYWRhcHRlci0+bmFtZSwgKnNrYi0+ZGF0YSk7CisJcmVjeWNsZV9mbF9idWYoZmwsIGZsLT5jaWR4KTsKK30KKworLyoKKyAqIFdyaXRlIHRoZSBjb21tYW5kIGRlc2NyaXB0b3JzIHRvIHRyYW5zbWl0IHRoZSBnaXZlbiBza2Igc3RhcnRpbmcgYXQKKyAqIGRlc2NyaXB0b3IgcGlkeCB3aXRoIHRoZSBnaXZlbiBnZW5lcmF0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfdHhfZGVzY3Moc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICB1bnNpZ25lZCBpbnQgcGlkeCwgdW5zaWduZWQgaW50IGdlbiwKKwkJCQkgIHN0cnVjdCBjbWRRICpxKQoreworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwlzdHJ1Y3QgY21kUV9lICplLCAqZTE7CisJc3RydWN0IGNtZFFfY2UgKmNlOworCXVuc2lnbmVkIGludCBpLCBmbGFncywgbmZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKworCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShhZGFwdGVyLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJIHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJY2UgPSAmcS0+Y2VudHJpZXNbcGlkeF07CisJY2UtPnNrYiA9IE5VTEw7CisJcGNpX3VubWFwX2FkZHJfc2V0KGNlLCBkbWFfYWRkciwgbWFwcGluZyk7CisJcGNpX3VubWFwX2xlbl9zZXQoY2UsIGRtYV9sZW4sIHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbik7CisKKwlmbGFncyA9IEZfQ01EX0RBVEFWQUxJRCB8IEZfQ01EX1NPUCB8IFZfQ01EX0VPUChuZnJhZ3MgPT0gMCkgfAorCQlWX0NNRF9HRU4yKGdlbik7CisJZSA9ICZxLT5lbnRyaWVzW3BpZHhdOworCWUtPmFkZHJfbG8gPSAodTMyKW1hcHBpbmc7CisJZS0+YWRkcl9oaSA9ICh1NjQpbWFwcGluZyA+PiAzMjsKKwllLT5sZW5fZ2VuID0gVl9DTURfTEVOKHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbikgfCBWX0NNRF9HRU4xKGdlbik7CisJZm9yIChlMSA9IGUsIGkgPSAwOyBuZnJhZ3MtLTsgaSsrKSB7CisJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKworCQljZSsrOworCQllMSsrOworCQlpZiAoKytwaWR4ID09IHEtPnNpemUpIHsKKwkJCXBpZHggPSAwOworCQkJZ2VuIF49IDE7CisJCQljZSA9IHEtPmNlbnRyaWVzOworCQkJZTEgPSBxLT5lbnRyaWVzOworCQl9CisKKwkJbWFwcGluZyA9IHBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCBmcmFnLT5wYWdlLAorCQkJCSAgICAgICBmcmFnLT5wYWdlX29mZnNldCwgZnJhZy0+c2l6ZSwKKwkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCWNlLT5za2IgPSBOVUxMOworCQlwY2lfdW5tYXBfYWRkcl9zZXQoY2UsIGRtYV9hZGRyLCBtYXBwaW5nKTsKKwkJcGNpX3VubWFwX2xlbl9zZXQoY2UsIGRtYV9sZW4sIGZyYWctPnNpemUpOworCisJCWUxLT5hZGRyX2xvID0gKHUzMiltYXBwaW5nOworCQllMS0+YWRkcl9oaSA9ICh1NjQpbWFwcGluZyA+PiAzMjsKKwkJZTEtPmxlbl9nZW4gPSBWX0NNRF9MRU4oZnJhZy0+c2l6ZSkgfCBWX0NNRF9HRU4xKGdlbik7CisJCWUxLT5mbGFncyA9IEZfQ01EX0RBVEFWQUxJRCB8IFZfQ01EX0VPUChuZnJhZ3MgPT0gMCkgfAorCQkJICAgIFZfQ01EX0dFTjIoZ2VuKTsKKwl9CisKKwljZS0+c2tiID0gc2tiOworCXdtYigpOworCWUtPmZsYWdzID0gZmxhZ3M7Cit9CisKKy8qCisgKiBDbGVhbiB1cCBjb21wbGV0ZWQgVHggYnVmZmVycy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJlY2xhaW1fY29tcGxldGVkX3R4KHN0cnVjdCBzZ2UgKnNnZSwgc3RydWN0IGNtZFEgKnEpCit7CisJdW5zaWduZWQgaW50IHJlY2xhaW0gPSBxLT5wcm9jZXNzZWQgLSBxLT5jbGVhbmVkOworCisJaWYgKHJlY2xhaW0pIHsKKwkJZnJlZV9jbWRRX2J1ZmZlcnMoc2dlLCBxLCByZWNsYWltKTsKKwkJcS0+Y2xlYW5lZCArPSByZWNsYWltOworCX0KK30KKworI2lmbmRlZiBTRVRfRVRIVE9PTF9PUFMKKyMgZGVmaW5lIF9fbmV0aWZfcnhfY29tcGxldGUoZGV2KSBuZXRpZl9yeF9jb21wbGV0ZShkZXYpCisjZW5kaWYKKworLyoKKyAqIFdlIGNhbm5vdCB1c2UgdGhlIHN0YW5kYXJkIG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoKSBiZWNhdXNlIHdlIGhhdmUgbXVsdGlwbGUKKyAqIHBvcnRzIHBsdXMgdGhlIFRPRSBhbGwgbXVsdGlwbGV4aW5nIG9udG8gYSBzaW5nbGUgcmVzcG9uc2UgcXVldWUsIHRoZXJlZm9yZQorICogYWNjZXB0aW5nIG5ldyByZXNwb25zZXMgY2Fubm90IGRlcGVuZCBvbiB0aGUgc3RhdGUgb2YgYW55IHBhcnRpY3VsYXIgcG9ydC4KKyAqIFNvIGRlZmluZSBvdXIgb3duIGVxdWl2YWxlbnQgdGhhdCBvbWl0cyB0aGUgbmV0aWZfcnVubmluZygpIHRlc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5hcGlfc2NoZWR1bGVfcHJlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAhdGVzdF9hbmRfc2V0X2JpdChfX0xJTktfU1RBVEVfUlhfU0NIRUQsICZkZXYtPnN0YXRlKTsKK30KKworCisvKioKKyAqCXNnZV9yeCAtIHByb2Nlc3MgYW4gaW5ncmVzcyBldGhlcm5ldCBwYWNrZXQKKyAqCUBzZ2U6IHRoZSBzZ2Ugc3RydWN0dXJlCisgKglAZmw6IHRoZSBmcmVlIGxpc3QgdGhhdCBjb250YWlucyB0aGUgcGFja2V0IGJ1ZmZlcgorICoJQGxlbjogdGhlIHBhY2tldCBsZW5ndGgKKyAqCisgKglQcm9jZXNzIGFuIGluZ3Jlc3MgZXRoZXJuZXQgcGFrY2V0IGFuZCBkZWxpdmVyIGl0IHRvIHRoZSBzdGFjay4KKyAqLworc3RhdGljIGludCBzZ2Vfcngoc3RydWN0IHNnZSAqc2dlLCBzdHJ1Y3QgZnJlZWxRICpmbCwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBjcGxfcnhfcGt0ICpwOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gc2dlLT5hZGFwdGVyOworCisJc2dlLT5zdGF0cy5ldGhlcm5ldF9wa3RzKys7CisJc2tiID0gZ2V0X3BhY2tldChhZGFwdGVyLT5wZGV2LCBmbCwgbGVuIC0gc2dlLT5yeF9wa3RfcGFkLAorCQkJIHNnZS0+cnhfcGt0X3BhZCwgMiwgU0dFX1JYX0NPUFlfVEhSRVMsCisJCQkgU0dFX1JYX0RST1BfVEhSRVMpOworCWlmICghc2tiKSB7CisJCXNnZS0+cG9ydF9zdGF0c1swXS5yeF9kcm9wcysrOyAvKiBjaGFyZ2Ugb25seSBwb3J0IDAgZm9yIG5vdyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlwID0gKHN0cnVjdCBjcGxfcnhfcGt0ICopc2tiLT5kYXRhOworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpwKSk7CisJc2tiLT5kZXYgPSBhZGFwdGVyLT5wb3J0W3AtPmlmZl0uZGV2OworCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7CisJaWYgKChhZGFwdGVyLT5mbGFncyAmIFJYX0NTVU1fRU5BQkxFRCkgJiYgcC0+Y3N1bSA9PSAweGZmZmYgJiYKKwkgICAgc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgJiYKKwkgICAgKHNrYi0+ZGF0YVs5XSA9PSBJUFBST1RPX1RDUCB8fCBza2ItPmRhdGFbOV0gPT0gSVBQUk9UT19VRFApKSB7CisJCXNnZS0+cG9ydF9zdGF0c1twLT5pZmZdLnJ4X2Nzb19nb29kKys7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJfSBlbHNlCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCWlmICh1bmxpa2VseShhZGFwdGVyLT52bGFuX2dycCAmJiBwLT52bGFuX3ZhbGlkKSkgeworCQlzZ2UtPnBvcnRfc3RhdHNbcC0+aWZmXS52bGFuX3h0cmFjdCsrOworCQlpZiAoYWRhcHRlci0+cGFyYW1zLnNnZS5wb2xsaW5nKQorCQkJdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwgYWRhcHRlci0+dmxhbl9ncnAsCisJCQkJCQkgbnRvaHMocC0+dmxhbikpOworCQllbHNlCisJCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBhZGFwdGVyLT52bGFuX2dycCwKKwkJCQkJbnRvaHMocC0+dmxhbikpOworCX0gZWxzZSBpZiAoYWRhcHRlci0+cGFyYW1zLnNnZS5wb2xsaW5nKQorCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCWVsc2UKKwkJbmV0aWZfcngoc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhIGNvbW1hbmQgcXVldWUgaGFzIGVub3VnaCBhdmFpbGFibGUgZGVzY3JpcHRvcnMgdGhhdAorICogd2UgY2FuIHJlc3VtZSBUeCBvcGVyYXRpb24gYWZ0ZXIgdGVtcG9yYXJpbHkgZGlzYWJsaW5nIGl0cyBwYWNrZXQgcXVldWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGVub3VnaF9mcmVlX1R4X2Rlc2NzKGNvbnN0IHN0cnVjdCBjbWRRICpxKQoreworCXVuc2lnbmVkIGludCByID0gcS0+cHJvY2Vzc2VkIC0gcS0+Y2xlYW5lZDsKKworCXJldHVybiBxLT5pbl91c2UgLSByIDwgKHEtPnNpemUgPj4gMSk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBzdWZmaWNpZW50IHNwYWNlIGhhcyBiZWNvbWUgYXZhaWxhYmxlIGluIHRoZSBTR0UgY29tbWFuZCBxdWV1ZXMKKyAqIGFmdGVyIHRoZSBUeCBwYWNrZXQgc2NoZWR1bGVycyBoYXZlIGJlZW4gc3VzcGVuZGVkIHRvIHJlc3RhcnQgdGhlIFR4IHBhdGguCisgKi8KK3N0YXRpYyB2b2lkIHJlc3RhcnRfdHhfcXVldWVzKHN0cnVjdCBzZ2UgKnNnZSkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHNnZS0+YWRhcHRlcjsKKworCWlmIChlbm91Z2hfZnJlZV9UeF9kZXNjcygmc2dlLT5jbWRRWzBdKSkgeworCQlpbnQgaTsKKworCQlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZCA9IGFkYXAtPnBvcnRbaV0uZGV2OworCisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KG5kLT5pZl9wb3J0LAorCQkJCQkgICAgICAgJnNnZS0+c3RvcHBlZF90eF9xdWV1ZXMpICYmCisJCQkgICAgbmV0aWZfcnVubmluZyhuZCkpIHsKKwkJCQlzZ2UtPnN0YXRzLmNtZFFfcmVzdGFydGVkWzNdKys7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShuZCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiB1cGRhdGVfdHhfaW5mbyBpcyBjYWxsZWQgZnJvbSB0aGUgaW50ZXJydXB0IGhhbmRsZXIvTkFQSSB0byByZXR1cm4gY21kUTAgCisgKiBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB1cGRhdGVfdHhfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgCisJCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzLCAKKwkJCQkJICB1bnNpZ25lZCBpbnQgcHIwKQoreworCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKKwlzdHJ1Y3QgY21kUSAqY21kcSA9ICZzZ2UtPmNtZFFbMF07CisKKwljbWRxLT5wcm9jZXNzZWQgKz0gcHIwOworCisJaWYgKGZsYWdzICYgRl9DTURRMF9FTkFCTEUpIHsKKwkJY2xlYXJfYml0KENNRFFfU1RBVF9SVU5OSU5HLCAmY21kcS0+c3RhdHVzKTsKKwkKKwkJaWYgKGNtZHEtPmNsZWFuZWQgKyBjbWRxLT5pbl91c2UgIT0gY21kcS0+cHJvY2Vzc2VkICYmCisJCSAgICAhdGVzdF9hbmRfc2V0X2JpdChDTURRX1NUQVRfTEFTVF9QS1RfREIsICZjbWRxLT5zdGF0dXMpKSB7CisJCQlzZXRfYml0KENNRFFfU1RBVF9SVU5OSU5HLCAmY21kcS0+c3RhdHVzKTsKKwkJCXdyaXRlbChGX0NNRFEwX0VOQUJMRSwgYWRhcHRlci0+cmVncyArIEFfU0dfRE9PUkJFTEwpOworCQl9CisJIAlmbGFncyAmPSB+Rl9DTURRMF9FTkFCTEU7CisJfQorCQorCWlmICh1bmxpa2VseShzZ2UtPnN0b3BwZWRfdHhfcXVldWVzICE9IDApKQorCQlyZXN0YXJ0X3R4X3F1ZXVlcyhzZ2UpOworCisJcmV0dXJuIGZsYWdzOworfQorCisvKgorICogUHJvY2VzcyBTR0UgcmVzcG9uc2VzLCB1cCB0byB0aGUgc3VwcGxpZWQgYnVkZ2V0LiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mCisgKiByZXNwb25zZXMgcHJvY2Vzc2VkLiAgQSBuZWdhdGl2ZSBidWRnZXQgaXMgZWZmZWN0aXZlbHkgdW5saW1pdGVkLgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfcmVzcG9uc2VzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKKwlzdHJ1Y3QgcmVzcFEgKnEgPSAmc2dlLT5yZXNwUTsKKwlzdHJ1Y3QgcmVzcFFfZSAqZSA9ICZxLT5lbnRyaWVzW3EtPmNpZHhdOworCWludCBidWRnZXRfbGVmdCA9IGJ1ZGdldDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworCXVuc2lnbmVkIGludCBjbWRxX3Byb2Nlc3NlZFtTR0VfQ01EUV9OXSA9IHswLCAwfTsKKwkKKworCXdoaWxlIChsaWtlbHkoYnVkZ2V0X2xlZnQgJiYgZS0+R2VuZXJhdGlvbkJpdCA9PSBxLT5nZW5iaXQpKSB7CisJCWZsYWdzIHw9IGUtPlFzbGVlcGluZzsKKwkJCisJCWNtZHFfcHJvY2Vzc2VkWzBdICs9IGUtPkNtZHEwQ3JlZGl0UmV0dXJuOworCQljbWRxX3Byb2Nlc3NlZFsxXSArPSBlLT5DbWRxMUNyZWRpdFJldHVybjsKKwkJCisJCS8qIFdlIGJhdGNoIHVwZGF0ZXMgdG8gdGhlIFRYIHNpZGUgdG8gYXZvaWQgY2FjaGVsaW5lCisJCSAqIHBpbmctcG9uZyBvZiBUWCBzdGF0ZSBpbmZvcm1hdGlvbiBvbiBNUCB3aGVyZSB0aGUgc2VuZGVyCisJCSAqIG1pZ2h0IHJ1biBvbiBhIGRpZmZlcmVudCBDUFUgdGhhbiB0aGlzIGZ1bmN0aW9uLi4uCisJCSAqLworCQlpZiAodW5saWtlbHkoZmxhZ3MgJiBGX0NNRFEwX0VOQUJMRSB8fCBjbWRxX3Byb2Nlc3NlZFswXSA+IDY0KSkgeworCQkJZmxhZ3MgPSB1cGRhdGVfdHhfaW5mbyhhZGFwdGVyLCBmbGFncywgY21kcV9wcm9jZXNzZWRbMF0pOworCQkJY21kcV9wcm9jZXNzZWRbMF0gPSAwOworCQl9CisJCWlmICh1bmxpa2VseShjbWRxX3Byb2Nlc3NlZFsxXSA+IDE2KSkgeworCQkJc2dlLT5jbWRRWzFdLnByb2Nlc3NlZCArPSBjbWRxX3Byb2Nlc3NlZFsxXTsKKwkJCWNtZHFfcHJvY2Vzc2VkWzFdID0gMDsKKwkJfQorCQlpZiAobGlrZWx5KGUtPkRhdGFWYWxpZCkpIHsKKwkJCXN0cnVjdCBmcmVlbFEgKmZsID0gJnNnZS0+ZnJlZWxRW2UtPkZyZWVsaXN0UWlkXTsKKworCQkJaWYgKHVubGlrZWx5KCFlLT5Tb3AgfHwgIWUtPkVvcCkpCisJCQkJQlVHKCk7CisJCQlpZiAodW5saWtlbHkoZS0+T2ZmbG9hZCkpCisJCQkJdW5leHBlY3RlZF9vZmZsb2FkKGFkYXB0ZXIsIGZsKTsKKwkJCWVsc2UKKwkJCQlzZ2Vfcngoc2dlLCBmbCwgZS0+QnVmZmVyTGVuZ3RoKTsKKworCQkJLyoKKwkJCSAqIE5vdGU6IHRoaXMgZGVwZW5kcyBvbiBlYWNoIHBhY2tldCBjb25zdW1pbmcgYQorCQkJICogc2luZ2xlIGZyZWUtbGlzdCBidWZmZXI7IGNmLiB0aGUgQlVHIGFib3ZlLgorCQkJICovCisJCQlpZiAoKytmbC0+Y2lkeCA9PSBmbC0+c2l6ZSkKKwkJCQlmbC0+Y2lkeCA9IDA7CisJCQlpZiAodW5saWtlbHkoLS1mbC0+Y3JlZGl0cyA8CisJCQkJICAgICBmbC0+c2l6ZSAtIFNHRV9GUkVFTF9SRUZJTExfVEhSRVNIKSkKKwkJCQlyZWZpbGxfZnJlZV9saXN0KHNnZSwgZmwpOworCQl9IGVsc2UKKwkJCXNnZS0+c3RhdHMucHVyZV9yc3BzKys7CisKKwkJZSsrOworCQlpZiAodW5saWtlbHkoKytxLT5jaWR4ID09IHEtPnNpemUpKSB7CisJCQlxLT5jaWR4ID0gMDsKKwkJCXEtPmdlbmJpdCBePSAxOworCQkJZSA9IHEtPmVudHJpZXM7CisJCX0KKwkJcHJlZmV0Y2goZSk7CisKKwkJaWYgKCsrcS0+Y3JlZGl0cyA+IFNHRV9SRVNQUV9SRVBMRU5JU0hfVEhSRVMpIHsKKwkJCXdyaXRlbChxLT5jcmVkaXRzLCBhZGFwdGVyLT5yZWdzICsgQV9TR19SU1BRVUVVRUNSRURJVCk7CisJCQlxLT5jcmVkaXRzID0gMDsKKwkJfQorCQktLWJ1ZGdldF9sZWZ0OworCX0KKworCWZsYWdzID0gdXBkYXRlX3R4X2luZm8oYWRhcHRlciwgZmxhZ3MsIGNtZHFfcHJvY2Vzc2VkWzBdKTsgCisJc2dlLT5jbWRRWzFdLnByb2Nlc3NlZCArPSBjbWRxX3Byb2Nlc3NlZFsxXTsKKworCWJ1ZGdldCAtPSBidWRnZXRfbGVmdDsKKwlyZXR1cm4gYnVkZ2V0OworfQorCisvKgorICogQSBzaW1wbGVyIHZlcnNpb24gb2YgcHJvY2Vzc19yZXNwb25zZXMoKSB0aGF0IGhhbmRsZXMgb25seSBwdXJlIChpLmUuLAorICogbm9uIGRhdGEtY2FycnlpbmcpIHJlc3BvbnNlcy4gIFN1Y2ggcmVzcG9uZXMgYXJlIHRvbyBsaWdodC13ZWlnaHQgdG8ganVzdGlmeQorICogY2FsbGluZyBhIHNvZnRpcnEgd2hlbiB1c2luZyBOQVBJLCBzbyB3ZSBoYW5kbGUgdGhlbSBzcGVjaWFsbHkgaW4gaGFyZAorICogaW50ZXJydXB0IGNvbnRleHQuICBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYSBwb2ludGVyIHRvIGEgcmVzcG9uc2UsCisgKiB3aGljaCB0aGUgY2FsbGVyIG11c3QgZW5zdXJlIGlzIGEgdmFsaWQgcHVyZSByZXNwb25zZS4gIFJldHVybnMgMSBpZiBpdAorICogZW5jb3VudGVycyBhIHZhbGlkIGRhdGEtY2FycnlpbmcgcmVzcG9uc2UsIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfcHVyZV9yZXNwb25zZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCByZXNwUV9lICplKQoreworCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKKwlzdHJ1Y3QgcmVzcFEgKnEgPSAmc2dlLT5yZXNwUTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworCXVuc2lnbmVkIGludCBjbWRxX3Byb2Nlc3NlZFtTR0VfQ01EUV9OXSA9IHswLCAwfTsKKworCWRvIHsKKwkJZmxhZ3MgfD0gZS0+UXNsZWVwaW5nOworCisJCWNtZHFfcHJvY2Vzc2VkWzBdICs9IGUtPkNtZHEwQ3JlZGl0UmV0dXJuOworCQljbWRxX3Byb2Nlc3NlZFsxXSArPSBlLT5DbWRxMUNyZWRpdFJldHVybjsKKwkJCisJCWUrKzsKKwkJaWYgKHVubGlrZWx5KCsrcS0+Y2lkeCA9PSBxLT5zaXplKSkgeworCQkJcS0+Y2lkeCA9IDA7CisJCQlxLT5nZW5iaXQgXj0gMTsKKwkJCWUgPSBxLT5lbnRyaWVzOworCQl9CisJCXByZWZldGNoKGUpOworCisJCWlmICgrK3EtPmNyZWRpdHMgPiBTR0VfUkVTUFFfUkVQTEVOSVNIX1RIUkVTKSB7CisJCQl3cml0ZWwocS0+Y3JlZGl0cywgYWRhcHRlci0+cmVncyArIEFfU0dfUlNQUVVFVUVDUkVESVQpOworCQkJcS0+Y3JlZGl0cyA9IDA7CisJCX0KKwkJc2dlLT5zdGF0cy5wdXJlX3JzcHMrKzsKKwl9IHdoaWxlIChlLT5HZW5lcmF0aW9uQml0ID09IHEtPmdlbmJpdCAmJiAhZS0+RGF0YVZhbGlkKTsKKworCWZsYWdzID0gdXBkYXRlX3R4X2luZm8oYWRhcHRlciwgZmxhZ3MsIGNtZHFfcHJvY2Vzc2VkWzBdKTsgCisJc2dlLT5jbWRRWzFdLnByb2Nlc3NlZCArPSBjbWRxX3Byb2Nlc3NlZFsxXTsKKworCXJldHVybiBlLT5HZW5lcmF0aW9uQml0ID09IHEtPmdlbmJpdDsKK30KKworLyoKKyAqIEhhbmRsZXIgZm9yIG5ldyBkYXRhIGV2ZW50cyB3aGVuIHVzaW5nIE5BUEkuICBUaGlzIGRvZXMgbm90IG5lZWQgYW55IGxvY2tpbmcKKyAqIG9yIHByb3RlY3Rpb24gZnJvbSBpbnRlcnJ1cHRzIGFzIGRhdGEgaW50ZXJydXB0cyBhcmUgb2ZmIGF0IHRoaXMgcG9pbnQgYW5kCisgKiBvdGhlciBhZGFwdGVyIGludGVycnVwdHMgZG8gbm90IGludGVyZmVyZS4KKyAqLworc3RhdGljIGludCB0MV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCWludCBlZmZlY3RpdmVfYnVkZ2V0ID0gbWluKCpidWRnZXQsIGRldi0+cXVvdGEpOworCisJaW50IHdvcmtfZG9uZSA9IHByb2Nlc3NfcmVzcG9uc2VzKGFkYXB0ZXIsIGVmZmVjdGl2ZV9idWRnZXQpOworCSpidWRnZXQgLT0gd29ya19kb25lOworCWRldi0+cXVvdGEgLT0gd29ya19kb25lOworCisJaWYgKHdvcmtfZG9uZSA+PSBlZmZlY3RpdmVfYnVkZ2V0KQorCQlyZXR1cm4gMTsKKworCV9fbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKKworCS8qCisJICogQmVjYXVzZSB3ZSBkb24ndCBhdG9taWNhbGx5IGZsdXNoIHRoZSBmb2xsb3dpbmcgd3JpdGUgaXQgaXMKKwkgKiBwb3NzaWJsZSB0aGF0IGluIHZlcnkgcmFyZSBjYXNlcyBpdCBjYW4gcmVhY2ggdGhlIGRldmljZSBpbiBhIHdheQorCSAqIHRoYXQgcmFjZXMgd2l0aCBhIG5ldyByZXNwb25zZSBiZWluZyB3cml0dGVuIHBsdXMgYW4gZXJyb3IgaW50ZXJydXB0CisJICogY2F1c2luZyB0aGUgTkFQSSBpbnRlcnJ1cHQgaGFuZGxlciBiZWxvdyB0byByZXR1cm4gdW5oYW5kbGVkIHN0YXR1cworCSAqIHRvIHRoZSBPUy4gIFRvIHByb3RlY3QgYWdhaW5zdCB0aGlzIHdvdWxkIHJlcXVpcmUgZmx1c2hpbmcgdGhlIHdyaXRlCisJICogYW5kIGRvaW5nIGJvdGggdGhlIHdyaXRlIGFuZCB0aGUgZmx1c2ggd2l0aCBpbnRlcnJ1cHRzIG9mZi4gIFdheSB0b28KKwkgKiBleHBlbnNpdmUgYW5kIHVuanVzdGlmaWFibGUgZ2l2ZW4gdGhlIHJhcml0eSBvZiB0aGUgcmFjZS4KKwkgKi8KKwl3cml0ZWwoYWRhcHRlci0+c2dlLT5yZXNwUS5jaWR4LCBhZGFwdGVyLT5yZWdzICsgQV9TR19TTEVFUElORyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBpcyBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgcG9sbGluZy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmFwaV9pc19zY2hlZHVsZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gdGVzdF9iaXQoX19MSU5LX1NUQVRFX1JYX1NDSEVELCAmZGV2LT5zdGF0ZSk7Cit9CisKKy8qCisgKiBOQVBJIHZlcnNpb24gb2YgdGhlIG1haW4gaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB0MV9pbnRlcnJ1cHRfbmFwaShpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaGFuZGxlZDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRhdGE7CisJc3RydWN0IHNnZSAqc2dlID0gYWRhcHRlci0+c2dlOworCXN0cnVjdCByZXNwUSAqcSA9ICZhZGFwdGVyLT5zZ2UtPnJlc3BROworCisJLyoKKwkgKiBDbGVhciB0aGUgU0dFX0RBVEEgaW50ZXJydXB0IGZpcnN0IHRoaW5nLiAgTm9ybWFsbHkgdGhlIE5BUEkKKwkgKiBoYW5kbGVyIGhhcyBjb250cm9sIG9mIHRoZSByZXNwb25zZSBxdWV1ZSBhbmQgdGhlIGludGVycnVwdCBoYW5kbGVyCisJICogY2FuIGxvb2sgYXQgdGhlIHF1ZXVlIHJlbGlhYmx5IG9ubHkgb25jZSBpdCBrbm93cyBOQVBJIGlzIG9mZi4KKwkgKiBXZSBjYW4ndCB3YWl0IHRoYXQgbG9uZyB0byBjbGVhciB0aGUgU0dFX0RBVEEgaW50ZXJydXB0IGJlY2F1c2Ugd2UKKwkgKiBjb3VsZCByYWNlIHdpdGggdDFfcG9sbCByZWFybWluZyB0aGUgU0dFIGludGVycnVwdCwgc28gd2UgbmVlZCB0bworCSAqIGNsZWFyIHRoZSBpbnRlcnJ1cHQgc3BlY3VsYXRpdmVseSBhbmQgcmVhbGx5IGVhcmx5IG9uLgorCSAqLworCXdyaXRlbChGX1BMX0lOVFJfU0dFX0RBVEEsIGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKTsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+YXN5bmNfbG9jayk7CisJaWYgKCFuYXBpX2lzX3NjaGVkdWxlZChzZ2UtPm5ldGRldikpIHsKKwkJc3RydWN0IHJlc3BRX2UgKmUgPSAmcS0+ZW50cmllc1txLT5jaWR4XTsKKworCQlpZiAoZS0+R2VuZXJhdGlvbkJpdCA9PSBxLT5nZW5iaXQpIHsKKwkJCWlmIChlLT5EYXRhVmFsaWQgfHwKKwkJCSAgICBwcm9jZXNzX3B1cmVfcmVzcG9uc2VzKGFkYXB0ZXIsIGUpKSB7CisJCQkJaWYgKGxpa2VseShuYXBpX3NjaGVkdWxlX3ByZXAoc2dlLT5uZXRkZXYpKSkKKwkJCQkJX19uZXRpZl9yeF9zY2hlZHVsZShzZ2UtPm5ldGRldik7CisJCQkJZWxzZQorCQkJCQlwcmludGsoS0VSTl9DUklUCisJCQkJCSAgICAgICAiTkFQSSBzY2hlZHVsZSBmYWlsdXJlIVxuIik7CisJCQl9IGVsc2UKKwkJCXdyaXRlbChxLT5jaWR4LCBhZGFwdGVyLT5yZWdzICsgQV9TR19TTEVFUElORyk7CisJCQloYW5kbGVkID0gMTsKKwkJCWdvdG8gdW5sb2NrOworCQl9IGVsc2UKKwkJd3JpdGVsKHEtPmNpZHgsIGFkYXB0ZXItPnJlZ3MgKyBBX1NHX1NMRUVQSU5HKTsKKwl9ICBlbHNlCisJaWYgKHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKSAmIEZfUExfSU5UUl9TR0VfREFUQSkKKwkJcHJpbnRrKEtFUk5fRVJSICJkYXRhIGludGVycnVwdCB3aGlsZSBOQVBJIHJ1bm5pbmdcbiIpOworCQorCWhhbmRsZWQgPSB0MV9zbG93X2ludHJfaGFuZGxlcihhZGFwdGVyKTsKKwlpZiAoIWhhbmRsZWQpCisJCXNnZS0+c3RhdHMudW5oYW5kbGVkX2lycXMrKzsKKyB1bmxvY2s6CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPmFzeW5jX2xvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQgIT0gMCk7Cit9CisKKy8qCisgKiBNYWluIGludGVycnVwdCBoYW5kbGVyLCBvcHRpbWl6ZWQgYXNzdW1pbmcgdGhhdCB3ZSB0b29rIGEgJ0RBVEEnCisgKiBpbnRlcnJ1cHQuCisgKgorICogMS4gQ2xlYXIgdGhlIGludGVycnVwdAorICogMi4gTG9vcCB3aGlsZSB3ZSBmaW5kIHZhbGlkIGRlc2NyaXB0b3JzIGFuZCBwcm9jZXNzIHRoZW07IGFjY3VtdWxhdGUKKyAqICAgICAgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSBsb29wCisgKiAzLiBUZWxsIHRoZSBTR0UgYXQgd2hpY2ggaW5kZXggd2Ugc3RvcHBlZCBwcm9jZXNzaW5nIGRlc2NyaXB0b3JzCisgKiA0LiBCb29ra2VlcGluZzsgZnJlZSBUWCBidWZmZXJzLCByaW5nIGRvb3JiZWxsIGlmIHRoZXJlIGFyZSBhbnkKKyAqICAgICAgb3V0c3RhbmRpbmcgVFggYnVmZmVycyB3YWl0aW5nLCByZXBsZW5pc2ggUlggYnVmZmVycywgcG90ZW50aWFsbHkKKyAqICAgICAgcmVlbmFibGUgdXBwZXIgbGF5ZXJzIGlmIHRoZXkgd2VyZSB0dXJuZWQgb2ZmIGR1ZSB0byBsYWNrIG9mIFRYCisgKiAgICAgIHJlc291cmNlcyB3aGljaCBhcmUgYXZhaWxhYmxlIGFnYWluLgorICogNS4gSWYgd2UgdG9vayBhbiBpbnRlcnJ1cHQsIGJ1dCBubyB2YWxpZCByZXNwUSBkZXNjcmlwdG9ycyB3YXMgZm91bmQgd2UKKyAqICAgICAgbGV0IHRoZSBzbG93X2ludHJfaGFuZGxlciBydW4gYW5kIGRvIGVycm9yIGhhbmRsaW5nLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdDFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmNvb2tpZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHdvcmtfZG9uZTsKKwlzdHJ1Y3QgcmVzcFFfZSAqZTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGNvb2tpZTsKKwlzdHJ1Y3QgcmVzcFEgKlEgPSAmYWRhcHRlci0+c2dlLT5yZXNwUTsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+YXN5bmNfbG9jayk7CisJZSA9ICZRLT5lbnRyaWVzW1EtPmNpZHhdOworCXByZWZldGNoKGUpOworCisJd3JpdGVsKEZfUExfSU5UUl9TR0VfREFUQSwgYWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOworCisJaWYgKGxpa2VseShlLT5HZW5lcmF0aW9uQml0ID09IFEtPmdlbmJpdCkpCisJCXdvcmtfZG9uZSA9IHByb2Nlc3NfcmVzcG9uc2VzKGFkYXB0ZXIsIC0xKTsKKwllbHNlCisJCXdvcmtfZG9uZSA9IHQxX3Nsb3dfaW50cl9oYW5kbGVyKGFkYXB0ZXIpOworCisJLyoKKwkgKiBUaGUgdW5jb25kaXRpb25hbCBjbGVhcmluZyBvZiB0aGUgUExfQ0FVU0UgYWJvdmUgbWF5IGhhdmUgcmFjZWQKKwkgKiB3aXRoIERNQSBjb21wbGV0aW9uIGFuZCB0aGUgY29ycmVzcG9uZGluZyBnZW5lcmF0aW9uIG9mIGEgcmVzcG9uc2UKKwkgKiB0byBjYXVzZSB1cyB0byBtaXNzIHRoZSByZXN1bHRpbmcgZGF0YSBpbnRlcnJ1cHQuICBUaGUgbmV4dCB3cml0ZQorCSAqIGlzIGFsc28gdW5jb25kaXRpb25hbCB0byByZWNvdmVyIHRoZSBtaXNzZWQgaW50ZXJydXB0IGFuZCByZW5kZXIKKwkgKiB0aGlzIHJhY2UgaGFybWxlc3MuCisJICovCisJd3JpdGVsKFEtPmNpZHgsIGFkYXB0ZXItPnJlZ3MgKyBBX1NHX1NMRUVQSU5HKTsKKworCWlmICghd29ya19kb25lKQorCQlhZGFwdGVyLT5zZ2UtPnN0YXRzLnVuaGFuZGxlZF9pcnFzKys7CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPmFzeW5jX2xvY2spOworCXJldHVybiBJUlFfUkVUVkFMKHdvcmtfZG9uZSAhPSAwKTsKK30KKworaW50cl9oYW5kbGVyX3QgdDFfc2VsZWN0X2ludHJfaGFuZGxlcihhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJcmV0dXJuIGFkYXB0ZXItPnBhcmFtcy5zZ2UucG9sbGluZyA/IHQxX2ludGVycnVwdF9uYXBpIDogdDFfaW50ZXJydXB0OworfQorCisvKgorICogRW5xdWV1ZXMgdGhlIHNrX2J1ZmYgb250byB0aGUgY21kUVtxaWRdIGFuZCBoYXMgaGFyZHdhcmUgZmV0Y2ggaXQuCisgKgorICogVGhlIGNvZGUgZmlndXJlcyBvdXQgaG93IG1hbnkgZW50cmllcyB0aGUgc2tfYnVmZiB3aWxsIHJlcXVpcmUgaW4gdGhlCisgKiBjbWRRIGFuZCB1cGRhdGVzIHRoZSBjbWRRIGRhdGEgc3RydWN0dXJlIHdpdGggdGhlIHN0YXRlIG9uY2UgdGhlIGVucXVldWUKKyAqIGhhcyBjb21wbGV0ZS4gVGhlbiwgaXQgZG9lc24ndCBhY2Nlc3MgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgYW55bW9yZSwgYnV0CisgKiB1c2VzIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBvbiB0aGUgc3RhY2suIEluIGNvbmp1Y3Rpb24gd2l0aCBhIHNwaW5sb2NrCisgKiBhcm91bmQgdGhhdCBjb2RlLCB3ZSBjYW4gbWFrZSB0aGUgZnVuY3Rpb24gcmVlbnRyYW50IHdpdGhvdXQgaG9sZGluZyB0aGUKKyAqIGxvY2sgd2hlbiB3ZSBhY3R1YWxseSBlbnF1ZXVlICh3aGljaCBtaWdodCBiZSBleHBlbnNpdmUsIGVzcGVjaWFsbHkgb24KKyAqIGFyY2hpdGVjdHVyZXMgd2l0aCBJTyBNTVVzKS4KKyAqCisgKiBUaGlzIHJ1bnMgd2l0aCBzb2Z0aXJxcyBkaXNhYmxlZC4KKyAqLwordW5zaWduZWQgaW50IHQxX3NnZV90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJICAgICAgIHVuc2lnbmVkIGludCBxaWQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNnZSAqc2dlID0gYWRhcHRlci0+c2dlOworCXN0cnVjdCBjbWRRICpxID0gJnNnZS0+Y21kUVtxaWRdOworCXVuc2lnbmVkIGludCBjcmVkaXRzLCBwaWR4LCBnZW5iaXQsIGNvdW50OworCisJc3Bpbl9sb2NrKCZxLT5sb2NrKTsKKwlyZWNsYWltX2NvbXBsZXRlZF90eChzZ2UsIHEpOworCisJcGlkeCA9IHEtPnBpZHg7CisJY3JlZGl0cyA9IHEtPnNpemUgLSBxLT5pbl91c2U7CisJY291bnQgPSAxICsgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKworCXsJLyogRXRoZXJuZXQgcGFja2V0ICovCisJIAlpZiAodW5saWtlbHkoY3JlZGl0cyA8IGNvdW50KSkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJc2V0X2JpdChkZXYtPmlmX3BvcnQsICZzZ2UtPnN0b3BwZWRfdHhfcXVldWVzKTsKKwkJCXNnZS0+c3RhdHMuY21kUV9mdWxsWzNdKys7CisJCQlzcGluX3VubG9jaygmcS0+bG9jayk7CisJCQlDSF9FUlIoIiVzOiBUeCByaW5nIGZ1bGwgd2hpbGUgcXVldWUgYXdha2UhXG4iLAorCQkJICAgICAgIGFkYXB0ZXItPm5hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHVubGlrZWx5KGNyZWRpdHMgLSBjb3VudCA8IHEtPnN0b3BfdGhyZXMpKSB7CisJCQlzZ2UtPnN0YXRzLmNtZFFfZnVsbFszXSsrOworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJc2V0X2JpdChkZXYtPmlmX3BvcnQsICZzZ2UtPnN0b3BwZWRfdHhfcXVldWVzKTsKKwkJfQorCX0KKwlxLT5pbl91c2UgKz0gY291bnQ7CisJZ2VuYml0ID0gcS0+Z2VuYml0OworCXEtPnBpZHggKz0gY291bnQ7CisJaWYgKHEtPnBpZHggPj0gcS0+c2l6ZSkgeworCQlxLT5waWR4IC09IHEtPnNpemU7CisJCXEtPmdlbmJpdCBePSAxOworCX0KKwlzcGluX3VubG9jaygmcS0+bG9jayk7CisKKwl3cml0ZV90eF9kZXNjcyhhZGFwdGVyLCBza2IsIHBpZHgsIGdlbmJpdCwgcSk7CisKKwkvKgorCSAqIFdlIGFsd2F5cyByaW5nIHRoZSBkb29yYmVsbCBmb3IgY21kUTEuICBGb3IgY21kUTAsIHdlIG9ubHkgcmluZworCSAqIHRoZSBkb29yYmVsbCBpZiB0aGUgUSBpcyBhc2xlZXAuIFRoZXJlIGlzIGEgbmF0dXJhbCByYWNlLCB3aGVyZQorCSAqIHRoZSBoYXJkd2FyZSBpcyBnb2luZyB0byBzbGVlcCBqdXN0IGFmdGVyIHdlIGNoZWNrZWQsIGhvd2V2ZXIsCisJICogdGhlbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBkZXRlY3QgdGhlIG91dHN0YW5kaW5nIFRYIHBhY2tldAorCSAqIGFuZCByaW5nIHRoZSBkb29yYmVsbCBmb3IgdXMuCisJICovCisJaWYgKHFpZCkKKwkJZG9vcmJlbGxfcGlvKGFkYXB0ZXIsIEZfQ01EUTFfRU5BQkxFKTsKKwllbHNlIHsKKwkJY2xlYXJfYml0KENNRFFfU1RBVF9MQVNUX1BLVF9EQiwgJnEtPnN0YXR1cyk7CisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KENNRFFfU1RBVF9SVU5OSU5HLCAmcS0+c3RhdHVzKSA9PSAwKSB7CisJCQlzZXRfYml0KENNRFFfU1RBVF9MQVNUX1BLVF9EQiwgJnEtPnN0YXR1cyk7CisJCQl3cml0ZWwoRl9DTURRMF9FTkFCTEUsIGFkYXB0ZXItPnJlZ3MgKyBBX1NHX0RPT1JCRUxMKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNS19FVEhfVFlQRV9NU1ModHlwZSwgbXNzKSAoKChtc3MpICYgMHgzRkZGKSB8ICgodHlwZSkgPDwgMTQpKQorCisvKgorICoJZXRoX2hkcl9sZW4gLSByZXR1cm4gdGhlIGxlbmd0aCBvZiBhbiBFdGhlcm5ldCBoZWFkZXIKKyAqCUBkYXRhOiBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgRXRoZXJuZXQgaGVhZGVyCisgKgorICoJUmV0dXJucyB0aGUgbGVuZ3RoIG9mIGFuIEV0aGVybmV0IGhlYWRlciwgaW5jbHVkaW5nIG9wdGlvbmFsIFZMQU4gdGFnLgorICovCitzdGF0aWMgaW5saW5lIGludCBldGhfaGRyX2xlbihjb25zdCB2b2lkICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBldGhoZHIgKmUgPSBkYXRhOworCisJcmV0dXJuIGUtPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMVEpID8gVkxBTl9FVEhfSExFTiA6IEVUSF9ITEVOOworfQorCisvKgorICogQWRkcyB0aGUgQ1BMIGhlYWRlciB0byB0aGUgc2tfYnVmZiBhbmQgcGFzc2VzIGl0IHRvIHQxX3NnZV90eC4KKyAqLworaW50IHQxX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2dlX3BvcnRfc3RhdHMgKnN0ID0gJmFkYXB0ZXItPnNnZS0+cG9ydF9zdGF0c1tkZXYtPmlmX3BvcnRdOworCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKKwlzdHJ1Y3QgY3BsX3R4X3BrdCAqY3BsOworCisjaWZkZWYgTkVUSUZfRl9UU08KKwlpZiAoc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSkgeworCQlpbnQgZXRoX3R5cGU7CisJCXN0cnVjdCBjcGxfdHhfcGt0X2xzbyAqaGRyOworCisJCXN0LT50c28rKzsKKworCQlldGhfdHlwZSA9IHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhID09IEVUSF9ITEVOID8KKwkJCUNQTF9FVEhfSUkgOiBDUExfRVRIX0lJX1ZMQU47CisKKwkJaGRyID0gKHN0cnVjdCBjcGxfdHhfcGt0X2xzbyAqKXNrYl9wdXNoKHNrYiwgc2l6ZW9mKCpoZHIpKTsKKwkJaGRyLT5vcGNvZGUgPSBDUExfVFhfUEtUX0xTTzsKKwkJaGRyLT5pcF9jc3VtX2RpcyA9IGhkci0+bDRfY3N1bV9kaXMgPSAwOworCQloZHItPmlwX2hkcl93b3JkcyA9IHNrYi0+bmguaXBoLT5paGw7CisJCWhkci0+dGNwX2hkcl93b3JkcyA9IHNrYi0+aC50aC0+ZG9mZjsKKwkJaGRyLT5ldGhfdHlwZV9tc3MgPSBodG9ucyhNS19FVEhfVFlQRV9NU1MoZXRoX3R5cGUsCisJCQkJCQlza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKSk7CisJCWhkci0+bGVuID0gaHRvbmwoc2tiLT5sZW4gLSBzaXplb2YoKmhkcikpOworCQljcGwgPSAoc3RydWN0IGNwbF90eF9wa3QgKiloZHI7CisJCXNnZS0+c3RhdHMudHhfbHNvX3BrdHMrKzsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJLyoKKwkgCSAqIFBhY2tldHMgc2hvcnRlciB0aGFuIEVUSF9ITEVOIGNhbiBicmVhayB0aGUgTUFDLCBkcm9wIHRoZW0KKwkJICogZWFybHkuICBBbHNvLCB3ZSBtYXkgZ2V0IG92ZXJzaXplZCBwYWNrZXRzIGJlY2F1c2Ugc29tZQorCQkgKiBwYXJ0cyBvZiB0aGUga2VybmVsIGRvbid0IGhhbmRsZSBvdXIgdW51c3VhbCBoYXJkX2hlYWRlcl9sZW4KKwkJICogcmlnaHQsIGRyb3AgdGhvc2UgdG9vLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgRVRIX0hMRU4gfHwKKwkJCSAgICAgc2tiLT5sZW4gPiBkZXYtPm10dSArIGV0aF9oZHJfbGVuKHNrYi0+ZGF0YSkpKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJcmV0dXJuIE5FVF9YTUlUX1NVQ0NFU1M7CisJCX0KKworCQkvKgorCQkgKiBXZSBhcmUgdXNpbmcgYSBub24tc3RhbmRhcmQgaGFyZF9oZWFkZXJfbGVuIGFuZCBzb21lIGtlcm5lbAorCQkgKiBjb21wb25lbnRzLCBzdWNoIGFzIHBrdGdlbiwgZG8gbm90IGhhbmRsZSBpdCByaWdodC4KKwkJICogQ29tcGxhaW4gd2hlbiB0aGlzIGhhcHBlbnMgYnV0IHRyeSB0byBmaXggdGhpbmdzIHVwLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHNrYl9oZWFkcm9vbShza2IpIDwKKwkJCSAgICAgZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSBFVEhfSExFTikpIHsKKwkJCXN0cnVjdCBza19idWZmICpvcmlnX3NrYiA9IHNrYjsKKworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbmFkZXF1YXRlIGhlYWRyb29tIGluICIKKwkJCQkgICAgICAgIlR4IHBhY2tldFxuIiwgZGV2LT5uYW1lKTsKKwkJCXNrYiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgc2l6ZW9mKCpjcGwpKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KG9yaWdfc2tiKTsKKwkJCWlmICghc2tiKQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBVRFBfQ1NVTV9DQVBBQkxFKSAmJgorCQkgICAgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcgJiYKKwkJICAgIHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJCWlmICh1bmxpa2VseShza2JfY2hlY2tzdW1faGVscChza2IsIDApKSkgeworCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisKKwkJLyogSG1tbSwgYXNzdW1pbmcgdG8gY2F0Y2ggdGhlIGdyYXRpb3VzIGFycC4uLiBhbmQgd2UnbGwgdXNlCisJCSAqIGl0IHRvIGZsdXNoIG91dCBzdHVjayBlc3BpIHBhY2tldHMuLi4KKwkJICAqLworCQlpZiAodW5saWtlbHkoIWFkYXB0ZXItPnNnZS0+ZXNwaWJ1Z19za2IpKSB7CisJCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9BUlApICYmCisJCQkgICAgc2tiLT5uaC5hcnBoLT5hcl9vcCA9PSBodG9ucyhBUlBPUF9SRVFVRVNUKSkgeworCQkJCWFkYXB0ZXItPnNnZS0+ZXNwaWJ1Z19za2IgPSBza2I7CisJCQkJLyogV2Ugd2FudCB0byByZS11c2UgdGhpcyBza2IgbGF0ZXIuIFdlCisJCQkJICogc2ltcGx5IGJ1bXAgdGhlIHJlZmVyZW5jZSBjb3VudCBhbmQgaXQKKwkJCQkgKiB3aWxsIG5vdCBiZSBmcmVlZC4uLgorCQkJCSAqLworCQkJCXNrYiA9IHNrYl9nZXQoc2tiKTsKKwkJCX0KKwkJfQorCisJCWNwbCA9IChzdHJ1Y3QgY3BsX3R4X3BrdCAqKV9fc2tiX3B1c2goc2tiLCBzaXplb2YoKmNwbCkpOworCQljcGwtPm9wY29kZSA9IENQTF9UWF9QS1Q7CisJCWNwbC0+aXBfY3N1bV9kaXMgPSAxOyAgICAvKiBTVyBjYWxjdWxhdGVzIElQIGNzdW0gKi8KKwkJY3BsLT5sNF9jc3VtX2RpcyA9IHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXID8gMCA6IDE7CisJCS8qIHRoZSBsZW5ndGggZmllbGQgaXNuJ3QgdXNlZCBzbyBkb24ndCBib3RoZXIgc2V0dGluZyBpdCAqLworCisJCXN0LT50eF9jc28gKz0gKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKTsKKwkJc2dlLT5zdGF0cy50eF9kb19ja3N1bSArPSAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpOworCQlzZ2UtPnN0YXRzLnR4X3JlZ19wa3RzKys7CisJfQorCWNwbC0+aWZmID0gZGV2LT5pZl9wb3J0OworCisjaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisJaWYgKGFkYXB0ZXItPnZsYW5fZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQljcGwtPnZsYW5fdmFsaWQgPSAxOworCQljcGwtPnZsYW4gPSBodG9ucyh2bGFuX3R4X3RhZ19nZXQoc2tiKSk7CisJCXN0LT52bGFuX2luc2VydCsrOworCX0gZWxzZQorI2VuZGlmCisJCWNwbC0+dmxhbl92YWxpZCA9IDA7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gdDFfc2dlX3R4KHNrYiwgYWRhcHRlciwgMCwgZGV2KTsKK30KKworLyoKKyAqIENhbGxiYWNrIGZvciB0aGUgVHggYnVmZmVyIHJlY2xhaW0gdGltZXIuICBSdW5zIHdpdGggc29mdGlycXMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHNnZV90eF9yZWNsYWltX2NiKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2dlICpzZ2UgPSAoc3RydWN0IHNnZSAqKWRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0dFX0NNRFFfTjsgKytpKSB7CisJCXN0cnVjdCBjbWRRICpxID0gJnNnZS0+Y21kUVtpXTsKKworCQlpZiAoIXNwaW5fdHJ5bG9jaygmcS0+bG9jaykpCisJCQljb250aW51ZTsKKworCQlyZWNsYWltX2NvbXBsZXRlZF90eChzZ2UsIHEpOworCQlpZiAoaSA9PSAwICYmIHEtPmluX3VzZSkgICAvKiBmbHVzaCBwZW5kaW5nIGNyZWRpdHMgKi8KKwkJCXdyaXRlbChGX0NNRFEwX0VOQUJMRSwKKwkJCQlzZ2UtPmFkYXB0ZXItPnJlZ3MgKyBBX1NHX0RPT1JCRUxMKTsKKworCQlzcGluX3VubG9jaygmcS0+bG9jayk7CisJfQorCW1vZF90aW1lcigmc2dlLT50eF9yZWNsYWltX3RpbWVyLCBqaWZmaWVzICsgVFhfUkVDTEFJTV9QRVJJT0QpOworfQorCisvKgorICogUHJvcGFnYXRlIGNoYW5nZXMgb2YgdGhlIFNHRSBjb2FsZXNjaW5nIHBhcmFtZXRlcnMgdG8gdGhlIEhXLgorICovCitpbnQgdDFfc2dlX3NldF9jb2FsZXNjZV9wYXJhbXMoc3RydWN0IHNnZSAqc2dlLCBzdHJ1Y3Qgc2dlX3BhcmFtcyAqcCkKK3sKKwlzZ2UtPm5ldGRldi0+cG9sbCA9IHQxX3BvbGw7CisJc2dlLT5maXhlZF9pbnRydGltZXIgPSBwLT5yeF9jb2FsZXNjZV91c2VjcyAqCisJCWNvcmVfdGlja3NfcGVyX3VzZWMoc2dlLT5hZGFwdGVyKTsKKwl3cml0ZWwoc2dlLT5maXhlZF9pbnRydGltZXIsIHNnZS0+YWRhcHRlci0+cmVncyArIEFfU0dfSU5UUlRJTUVSKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbG9jYXRlcyBib3RoIFJYIGFuZCBUWCByZXNvdXJjZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIFNHRS4gSG93ZXZlciwKKyAqIHRoZSBoYXJkd2FyZSBpcyBub3QgZW5hYmxlZCB5ZXQuCisgKi8KK2ludCB0MV9zZ2VfY29uZmlndXJlKHN0cnVjdCBzZ2UgKnNnZSwgc3RydWN0IHNnZV9wYXJhbXMgKnApCit7CisJaWYgKGFsbG9jX3J4X3Jlc291cmNlcyhzZ2UsIHApKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoYWxsb2NfdHhfcmVzb3VyY2VzKHNnZSwgcCkpIHsKKwkJZnJlZV9yeF9yZXNvdXJjZXMoc2dlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNvbmZpZ3VyZV9zZ2Uoc2dlLCBwKTsKKworCS8qCisJICogTm93IHRoYXQgd2UgaGF2ZSBzaXplZCB0aGUgZnJlZSBsaXN0cyBjYWxjdWxhdGUgdGhlIHBheWxvYWQKKwkgKiBjYXBhY2l0eSBvZiB0aGUgbGFyZ2UgYnVmZmVycy4gIE90aGVyIHBhcnRzIG9mIHRoZSBkcml2ZXIgdXNlCisJICogdGhpcyB0byBzZXQgdGhlIG1heCBvZmZsb2FkIGNvYWxlc2Npbmcgc2l6ZSBzbyB0aGF0IFJYIHBhY2tldHMKKwkgKiBkbyBub3Qgb3ZlcmZsb3cgb3VyIGxhcmdlIGJ1ZmZlcnMuCisJICovCisJcC0+bGFyZ2VfYnVmX2NhcGFjaXR5ID0ganVtYm9fcGF5bG9hZF9jYXBhY2l0eShzZ2UpOworCXJldHVybiAwOworfQorCisvKgorICogRGlzYWJsZXMgdGhlIERNQSBlbmdpbmUuCisgKi8KK3ZvaWQgdDFfc2dlX3N0b3Aoc3RydWN0IHNnZSAqc2dlKQoreworCXdyaXRlbCgwLCBzZ2UtPmFkYXB0ZXItPnJlZ3MgKyBBX1NHX0NPTlRST0wpOworCSh2b2lkKSByZWFkbChzZ2UtPmFkYXB0ZXItPnJlZ3MgKyBBX1NHX0NPTlRST0wpOyAvKiBmbHVzaCAqLworCWlmIChpc19UMihzZ2UtPmFkYXB0ZXIpKQorCQlkZWxfdGltZXJfc3luYygmc2dlLT5lc3BpYnVnX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmc2dlLT50eF9yZWNsYWltX3RpbWVyKTsKK30KKworLyoKKyAqIEVuYWJsZXMgdGhlIERNQSBlbmdpbmUuCisgKi8KK3ZvaWQgdDFfc2dlX3N0YXJ0KHN0cnVjdCBzZ2UgKnNnZSkKK3sKKwlyZWZpbGxfZnJlZV9saXN0KHNnZSwgJnNnZS0+ZnJlZWxRWzBdKTsKKwlyZWZpbGxfZnJlZV9saXN0KHNnZSwgJnNnZS0+ZnJlZWxRWzFdKTsKKworCXdyaXRlbChzZ2UtPnNnZV9jb250cm9sLCBzZ2UtPmFkYXB0ZXItPnJlZ3MgKyBBX1NHX0NPTlRST0wpOworCWRvb3JiZWxsX3BpbyhzZ2UtPmFkYXB0ZXIsIEZfRkwwX0VOQUJMRSB8IEZfRkwxX0VOQUJMRSk7CisJKHZvaWQpIHJlYWRsKHNnZS0+YWRhcHRlci0+cmVncyArIEFfU0dfQ09OVFJPTCk7IC8qIGZsdXNoICovCisKKwltb2RfdGltZXIoJnNnZS0+dHhfcmVjbGFpbV90aW1lciwgamlmZmllcyArIFRYX1JFQ0xBSU1fUEVSSU9EKTsKKworCWlmIChpc19UMihzZ2UtPmFkYXB0ZXIpKSAKKwkJbW9kX3RpbWVyKCZzZ2UtPmVzcGlidWdfdGltZXIsIGppZmZpZXMgKyBzZ2UtPmVzcGlidWdfdGltZW91dCk7Cit9CisKKy8qCisgKiBDYWxsYmFjayBmb3IgdGhlIFQyIEVTUEkgJ3N0dWNrIHBhY2tldCBmZWF0dXJlJyB3b3JrYW9ydW5kCisgKi8KK3N0YXRpYyB2b2lkIGVzcGlidWdfd29ya2Fyb3VuZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopZGF0YTsKKwlzdHJ1Y3Qgc2dlICpzZ2UgPSBhZGFwdGVyLT5zZ2U7CisKKwlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5wb3J0WzBdLmRldikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNnZS0+ZXNwaWJ1Z19za2I7CisKKwkJdTMyIHNlb3AgPSB0MV9lc3BpX2dldF9tb24oYWRhcHRlciwgMHg5MzAsIDApOworCisJCWlmICgoc2VvcCAmIDB4ZmZmMGZmZikgPT0gMHhmZmYgJiYgc2tiKSB7CisJCQlpZiAoIXNrYi0+Y2JbMF0pIHsKKwkJCQl1OCBjaF9tYWNfYWRkcltFVEhfQUxFTl0gPQorCQkJCSAgICB7MHgwLCAweDcsIDB4NDMsIDB4MCwgMHgwLCAweDB9OworCQkJCW1lbWNweShza2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IGNwbF90eF9wa3QpLAorCQkJCSAgICBjaF9tYWNfYWRkciwgRVRIX0FMRU4pOworCQkJCW1lbWNweShza2ItPmRhdGEgKyBza2ItPmxlbiAtIDEwLCBjaF9tYWNfYWRkciwKKwkJCQkgICAgRVRIX0FMRU4pOworCQkJCXNrYi0+Y2JbMF0gPSAweGZmOworCQkJfQorCisJCQkvKiBidW1wIHRoZSByZWZlcmVuY2UgY291bnQgdG8gYXZvaWQgZnJlZWluZyBvZiB0aGUKKwkJCSAqIHNrYiBvbmNlIHRoZSBETUEgaGFzIGNvbXBsZXRlZC4KKwkJCSAqLworCQkJc2tiID0gc2tiX2dldChza2IpOworCQkJdDFfc2dlX3R4KHNrYiwgYWRhcHRlciwgMCwgYWRhcHRlci0+cG9ydFswXS5kZXYpOworCQl9CisJfQorCW1vZF90aW1lcigmc2dlLT5lc3BpYnVnX3RpbWVyLCBqaWZmaWVzICsgc2dlLT5lc3BpYnVnX3RpbWVvdXQpOworfQorCisvKgorICogQ3JlYXRlcyBhIHQxX3NnZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgc3VnZ2VzdGVkIHJlc291cmNlIHBhcmFtZXRlcnMuCisgKi8KK3N0cnVjdCBzZ2UgKiBfX2RldmluaXQgdDFfc2dlX2NyZWF0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgIHN0cnVjdCBzZ2VfcGFyYW1zICpwKQoreworCXN0cnVjdCBzZ2UgKnNnZSA9IGttYWxsb2Moc2l6ZW9mKCpzZ2UpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc2dlKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoc2dlLCAwLCBzaXplb2YoKnNnZSkpOworCisJc2dlLT5hZGFwdGVyID0gYWRhcHRlcjsKKwlzZ2UtPm5ldGRldiA9IGFkYXB0ZXItPnBvcnRbMF0uZGV2OworCXNnZS0+cnhfcGt0X3BhZCA9IHQxX2lzX1QxQihhZGFwdGVyKSA/IDAgOiAyOworCXNnZS0+anVtYm9fZmwgPSB0MV9pc19UMUIoYWRhcHRlcikgPyAxIDogMDsKKworCWluaXRfdGltZXIoJnNnZS0+dHhfcmVjbGFpbV90aW1lcik7CisJc2dlLT50eF9yZWNsYWltX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzZ2U7CisJc2dlLT50eF9yZWNsYWltX3RpbWVyLmZ1bmN0aW9uID0gc2dlX3R4X3JlY2xhaW1fY2I7CisKKwlpZiAoaXNfVDIoc2dlLT5hZGFwdGVyKSkgeworCQlpbml0X3RpbWVyKCZzZ2UtPmVzcGlidWdfdGltZXIpOworCQlzZ2UtPmVzcGlidWdfdGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKSZlc3BpYnVnX3dvcmthcm91bmQ7CisJCXNnZS0+ZXNwaWJ1Z190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2dlLT5hZGFwdGVyOworCQlzZ2UtPmVzcGlidWdfdGltZW91dCA9IDE7CisJfQorCSAKKworCXAtPmNtZFFfc2l6ZVswXSA9IFNHRV9DTURRMF9FX047CisJcC0+Y21kUV9zaXplWzFdID0gU0dFX0NNRFExX0VfTjsKKwlwLT5mcmVlbFFfc2l6ZVshc2dlLT5qdW1ib19mbF0gPSBTR0VfRlJFRUxfU0laRTsKKwlwLT5mcmVlbFFfc2l6ZVtzZ2UtPmp1bWJvX2ZsXSA9IFNHRV9KVU1CT19GUkVFTF9TSVpFOworCXAtPnJ4X2NvYWxlc2NlX3VzZWNzID0gIDUwOworCXAtPmNvYWxlc2NlX2VuYWJsZSA9IDA7CisJcC0+c2FtcGxlX2ludGVydmFsX3VzZWNzID0gMDsKKwlwLT5wb2xsaW5nID0gMDsKKworCXJldHVybiBzZ2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5oIGIvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzRiMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuaApAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZpbGU6IHNnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJFJldmlzaW9uOiAxLjExICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJERhdGU6IDIwMDUvMDYvMjEgMjI6MTA6NTUgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBwYXJ0IG9mIHRoZSBDaGVsc2lvIDEwR2IgRXRoZXJuZXQgRHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMgICAgICAgKgorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nICAgKgorICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAgICAqCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vd3d3LmNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIC0gMjAwNSBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuICAgICAgICAgICAgICAgICAgICAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTWFpbnRhaW5lcnM6IG1haW50YWluZXJzQGNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEF1dGhvcnM6IERpbWl0cmlvcyBNaWNoYWlsaWRpcyAgIDxkbUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgVGluYSBZYW5nICAgICAgICAgICAgICAgPHRhaW5heUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGZWxpeCBNYXJ0aSAgICAgICAgICAgICA8ZmVsaXhAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIFNjb3R0IEJhcmRvbmUgICAgICAgICAgIDxzYmFyZG9uZUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgS3VydCBPdHRhd2F5ICAgICAgICAgICAgPGtvdHRhd2F5QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGcmFuayBEaU1hbWJybyAgICAgICAgICA8ZnJhbmtAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DWEdCX1NHRV9IXworI2RlZmluZSBfQ1hHQl9TR0VfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaWZuZGVmIElSUV9SRVRWQUwKKyNkZWZpbmUgSVJRX1JFVFZBTCh4KQordHlwZWRlZiB2b2lkIGlycXJldHVybl90OworI2VuZGlmCisKK3R5cGVkZWYgaXJxcmV0dXJuX3QgKCppbnRyX2hhbmRsZXJfdCkoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworCitzdHJ1Y3Qgc2dlX2ludHJfY291bnRzIHsKKwl1bnNpZ25lZCBpbnQgcmVzcFFfZW1wdHk7ICAgICAgLyogIyB0aW1lcyByZXNwUSBlbXB0eSAqLworCXVuc2lnbmVkIGludCByZXNwUV9vdmVyZmxvdzsgICAvKiAjIHJlc3BRIG92ZXJmbG93IChmYXRhbCkgKi8KKwl1bnNpZ25lZCBpbnQgZnJlZWxpc3RRX2VtcHR5OyAgLyogIyB0aW1lcyBmcmVlbGlzdCBlbXB0eSAqLworCXVuc2lnbmVkIGludCBwa3RfdG9vX2JpZzsgICAgICAvKiBwYWNrZXQgdG9vIGxhcmdlIChmYXRhbCkgKi8KKwl1bnNpZ25lZCBpbnQgcGt0X21pc21hdGNoOworCXVuc2lnbmVkIGludCBjbWRRX2Z1bGxbM107ICAgICAvKiBub3QgSFcgSVJRLCBob3N0IGNtZFFbXSBmdWxsICovCisJdW5zaWduZWQgaW50IGNtZFFfcmVzdGFydGVkWzNdOy8qICMgb2YgdGltZXMgY21kUSBYIHdhcyByZXN0YXJ0ZWQgKi8KKwl1bnNpZ25lZCBpbnQgZXRoZXJuZXRfcGt0czsgICAgLyogIyBvZiBFdGhlcm5ldCBwYWNrZXRzIHJlY2VpdmVkICovCisJdW5zaWduZWQgaW50IG9mZmxvYWRfcGt0czsgICAgIC8qICMgb2Ygb2ZmbG9hZCBwYWNrZXRzIHJlY2VpdmVkICovCisJdW5zaWduZWQgaW50IG9mZmxvYWRfYnVuZGxlczsgIC8qICMgb2Ygb2ZmbG9hZCBwa3QgYnVuZGxlcyBkZWxpdmVyZWQgKi8KKwl1bnNpZ25lZCBpbnQgcHVyZV9yc3BzOyAgICAgICAgLyogIyBvZiBub24tcGF5bG9hZCByZXNwb25zZXMgKi8KKwl1bnNpZ25lZCBpbnQgdW5oYW5kbGVkX2lycXM7ICAgLyogIyBvZiB1bmhhbmRsZWQgaW50ZXJydXB0cyAqLworCXVuc2lnbmVkIGludCB0eF9pcGZyYWdzOworCXVuc2lnbmVkIGludCB0eF9yZWdfcGt0czsKKwl1bnNpZ25lZCBpbnQgdHhfbHNvX3BrdHM7CisJdW5zaWduZWQgaW50IHR4X2RvX2Nrc3VtOworfTsKKworc3RydWN0IHNnZV9wb3J0X3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIHJ4X2Nzb19nb29kOyAgICAgLyogIyBvZiBzdWNjZXNzZnVsIFJYIGNzdW0gb2ZmbG9hZHMgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2NzbzsgICAgICAgICAgLyogIyBvZiBUWCBjaGVja3N1bSBvZmZsb2FkcyAqLworCXVuc2lnbmVkIGxvbmcgdmxhbl94dHJhY3Q7ICAgICAvKiAjIG9mIFZMQU4gdGFnIGV4dHJhY3Rpb25zICovCisJdW5zaWduZWQgbG9uZyB2bGFuX2luc2VydDsgICAgIC8qICMgb2YgVkxBTiB0YWcgZXh0cmFjdGlvbnMgKi8KKwl1bnNpZ25lZCBsb25nIHRzbzsgICAgICAgICAgICAgLyogIyBvZiBUU08gcmVxdWVzdHMgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2Ryb3BzOyAgICAgICAgLyogIyBvZiBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIG5vIG1lbSAqLworfTsKKworc3RydWN0IHNrX2J1ZmY7CitzdHJ1Y3QgbmV0X2RldmljZTsKK3N0cnVjdCBhZGFwdGVyOworc3RydWN0IHNnZV9wYXJhbXM7CitzdHJ1Y3Qgc2dlOworCitzdHJ1Y3Qgc2dlICp0MV9zZ2VfY3JlYXRlKHN0cnVjdCBhZGFwdGVyICosIHN0cnVjdCBzZ2VfcGFyYW1zICopOworaW50IHQxX3NnZV9jb25maWd1cmUoc3RydWN0IHNnZSAqLCBzdHJ1Y3Qgc2dlX3BhcmFtcyAqKTsKK2ludCB0MV9zZ2Vfc2V0X2NvYWxlc2NlX3BhcmFtcyhzdHJ1Y3Qgc2dlICosIHN0cnVjdCBzZ2VfcGFyYW1zICopOwordm9pZCB0MV9zZ2VfZGVzdHJveShzdHJ1Y3Qgc2dlICopOworaW50cl9oYW5kbGVyX3QgdDFfc2VsZWN0X2ludHJfaGFuZGxlcihhZGFwdGVyX3QgKmFkYXB0ZXIpOwordW5zaWduZWQgaW50IHQxX3NnZV90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJICAgICAgIHVuc2lnbmVkIGludCBxaWQsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworaW50IHQxX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHQxX3NldF92bGFuX2FjY2VsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgb25fb2ZmKTsKK3ZvaWQgdDFfc2dlX3N0YXJ0KHN0cnVjdCBzZ2UgKik7Cit2b2lkIHQxX3NnZV9zdG9wKHN0cnVjdCBzZ2UgKik7CitpbnQgdDFfc2dlX2ludHJfZXJyb3JfaGFuZGxlcihzdHJ1Y3Qgc2dlICopOwordm9pZCB0MV9zZ2VfaW50cl9lbmFibGUoc3RydWN0IHNnZSAqKTsKK3ZvaWQgdDFfc2dlX2ludHJfZGlzYWJsZShzdHJ1Y3Qgc2dlICopOwordm9pZCB0MV9zZ2VfaW50cl9jbGVhcihzdHJ1Y3Qgc2dlICopOworY29uc3Qgc3RydWN0IHNnZV9pbnRyX2NvdW50cyAqdDFfc2dlX2dldF9pbnRyX2NvdW50cyhzdHJ1Y3Qgc2dlICpzZ2UpOworY29uc3Qgc3RydWN0IHNnZV9wb3J0X3N0YXRzICp0MV9zZ2VfZ2V0X3BvcnRfc3RhdHMoc3RydWN0IHNnZSAqc2dlLCBpbnQgcG9ydCk7CisKKyNlbmRpZiAvKiBfQ1hHQl9TR0VfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3Vici5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9zdWJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViYjVkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3Vici5jCkBAIC0wLDAgKzEsODEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRmlsZTogc3Vici5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAkUmV2aXNpb246IDEuMjcgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICREYXRlOiAyMDA1LzA2LzIyIDAxOjA4OjM2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgVmFyaW91cyBzdWJyb3V0aW5lcyAoaW50cixwaW8sZXRjLikgdXNlZCBieSBDaGVsc2lvIDEwRyBFdGhlcm5ldCBkcml2ZXIuICoKKyAqICBwYXJ0IG9mIHRoZSBDaGVsc2lvIDEwR2IgRXRoZXJuZXQgRHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMgICAgICAgKgorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nICAgKgorICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAgICAqCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vd3d3LmNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIC0gMjAwNSBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuICAgICAgICAgICAgICAgICAgICAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTWFpbnRhaW5lcnM6IG1haW50YWluZXJzQGNoZWxzaW8uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEF1dGhvcnM6IERpbWl0cmlvcyBNaWNoYWlsaWRpcyAgIDxkbUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgVGluYSBZYW5nICAgICAgICAgICAgICAgPHRhaW5heUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGZWxpeCBNYXJ0aSAgICAgICAgICAgICA8ZmVsaXhAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgIFNjb3R0IEJhcmRvbmUgICAgICAgICAgIDxzYmFyZG9uZUBjaGVsc2lvLmNvbT4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgS3VydCBPdHRhd2F5ICAgICAgICAgICAgPGtvdHRhd2F5QGNoZWxzaW8uY29tPiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICBGcmFuayBEaU1hbWJybyAgICAgICAgICA8ZnJhbmtAY2hlbHNpby5jb20+ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZWxtZXIwLmgiCisjaW5jbHVkZSAicmVncy5oIgorI2luY2x1ZGUgImdtYWMuaCIKKyNpbmNsdWRlICJjcGh5LmgiCisjaW5jbHVkZSAic2dlLmgiCisjaW5jbHVkZSAiZXNwaS5oIgorCisvKioKKyAqCXQxX3dhaXRfb3BfZG9uZSAtIHdhaXQgdW50aWwgYW4gb3BlcmF0aW9uIGlzIGNvbXBsZXRlZAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorICoJQHJlZzogdGhlIHJlZ2lzdGVyIHRvIGNoZWNrIGZvciBjb21wbGV0aW9uCisgKglAbWFzazogYSBzaW5nbGUtYml0IGZpZWxkIHdpdGhpbiBAcmVnIHRoYXQgaW5kaWNhdGVzIGNvbXBsZXRpb24KKyAqCUBwb2xhcml0eTogdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVkCisgKglAYXR0ZW1wdHM6IG51bWJlciBvZiBjaGVjayBpdGVyYXRpb25zCisgKiAgICAgIEBkZWxheTogZGVsYXkgaW4gdXNlY3MgYmV0d2VlbiBpdGVyYXRpb25zCisgKgorICoJV2FpdCB1bnRpbCBhbiBvcGVyYXRpb24gaXMgY29tcGxldGVkIGJ5IGNoZWNraW5nIGEgYml0IGluIGEgcmVnaXN0ZXIKKyAqCXVwIHRvIEBhdHRlbXB0cyB0aW1lcy4gIFJldHVybnMgJTAgaWYgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMgYW5kICUxCisgKglvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgdDFfd2FpdF9vcF9kb25lKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHJlZywgdTMyIG1hc2ssIGludCBwb2xhcml0eSwKKwkJICAgIGludCBhdHRlbXB0cywgaW50IGRlbGF5KQoreworCXdoaWxlICgxKSB7CisJCXUzMiB2YWwgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgcmVnKSAmIG1hc2s7CisKKwkJaWYgKCEhdmFsID09IHBvbGFyaXR5KQorCQkJcmV0dXJuIDA7CisJCWlmICgtLWF0dGVtcHRzID09IDApCisJCQlyZXR1cm4gMTsKKwkJaWYgKGRlbGF5KQorCQkJdWRlbGF5KGRlbGF5KTsKKwl9Cit9CisKKyNkZWZpbmUgVFBJX0FUVEVNUFRTIDUwCisKKy8qCisgKiBXcml0ZSBhIHJlZ2lzdGVyIG92ZXIgdGhlIFRQSSBpbnRlcmZhY2UgKHVubG9ja2VkIGFuZCBsb2NrZWQgdmVyc2lvbnMpLgorICovCitzdGF0aWMgaW50IF9fdDFfdHBpX3dyaXRlKGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiB2YWx1ZSkKK3sKKwlpbnQgdHBpX2J1c3k7CisKKwl3cml0ZWwoYWRkciwgYWRhcHRlci0+cmVncyArIEFfVFBJX0FERFIpOworCXdyaXRlbCh2YWx1ZSwgYWRhcHRlci0+cmVncyArIEFfVFBJX1dSX0RBVEEpOworCXdyaXRlbChGX1RQSVdSLCBhZGFwdGVyLT5yZWdzICsgQV9UUElfQ1NSKTsKKworCXRwaV9idXN5ID0gdDFfd2FpdF9vcF9kb25lKGFkYXB0ZXIsIEFfVFBJX0NTUiwgRl9UUElSRFksIDEsCisJCQkJICAgVFBJX0FUVEVNUFRTLCAzKTsKKwlpZiAodHBpX2J1c3kpCisJCUNIX0FMRVJUKCIlczogVFBJIHdyaXRlIHRvIDB4JXggZmFpbGVkXG4iLAorCQkJIGFkYXB0ZXItPm5hbWUsIGFkZHIpOworCXJldHVybiB0cGlfYnVzeTsKK30KKworaW50IHQxX3RwaV93cml0ZShhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgdmFsdWUpCit7CisJaW50IHJldDsKKworCXNwaW5fbG9jaygmKGFkYXB0ZXIpLT50cGlfbG9jayk7CisJcmV0ID0gX190MV90cGlfd3JpdGUoYWRhcHRlciwgYWRkciwgdmFsdWUpOworCXNwaW5fdW5sb2NrKCYoYWRhcHRlciktPnRwaV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVhZCBhIHJlZ2lzdGVyIG92ZXIgdGhlIFRQSSBpbnRlcmZhY2UgKHVubG9ja2VkIGFuZCBsb2NrZWQgdmVyc2lvbnMpLgorICovCitzdGF0aWMgaW50IF9fdDFfdHBpX3JlYWQoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgYWRkciwgdTMyICp2YWxwKQoreworCWludCB0cGlfYnVzeTsKKworCXdyaXRlbChhZGRyLCBhZGFwdGVyLT5yZWdzICsgQV9UUElfQUREUik7CisJd3JpdGVsKDAsIGFkYXB0ZXItPnJlZ3MgKyBBX1RQSV9DU1IpOworCisJdHBpX2J1c3kgPSB0MV93YWl0X29wX2RvbmUoYWRhcHRlciwgQV9UUElfQ1NSLCBGX1RQSVJEWSwgMSwKKwkJCQkgICBUUElfQVRURU1QVFMsIDMpOworCWlmICh0cGlfYnVzeSkKKwkJQ0hfQUxFUlQoIiVzOiBUUEkgcmVhZCBmcm9tIDB4JXggZmFpbGVkXG4iLAorCQkJIGFkYXB0ZXItPm5hbWUsIGFkZHIpOworCWVsc2UKKwkJKnZhbHAgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9UUElfUkRfREFUQSk7CisJcmV0dXJuIHRwaV9idXN5OworfQorCitpbnQgdDFfdHBpX3JlYWQoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgYWRkciwgdTMyICp2YWxwKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2soJihhZGFwdGVyKS0+dHBpX2xvY2spOworCXJldCA9IF9fdDFfdHBpX3JlYWQoYWRhcHRlciwgYWRkciwgdmFscCk7CisJc3Bpbl91bmxvY2soJihhZGFwdGVyKS0+dHBpX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhIHBvcnQncyBsaW5rIHNldHRpbmdzIGNoYW5nZSB0byBwcm9wYWdhdGUgdGhlIG5ldyB2YWx1ZXMgdG8gdGhlCisgKiBhc3NvY2lhdGVkIFBIWSBhbmQgTUFDLiAgQWZ0ZXIgcGVyZm9ybWluZyB0aGUgY29tbW9uIHRhc2tzIGl0IGludm9rZXMgYW4KKyAqIE9TLXNwZWNpZmljIGhhbmRsZXIuCisgKi8KKy8qIHN0YXRpYyAqLyB2b2lkIGxpbmtfY2hhbmdlZChhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBwb3J0X2lkKQoreworCWludCBsaW5rX29rLCBzcGVlZCwgZHVwbGV4LCBmYzsKKwlzdHJ1Y3QgY3BoeSAqcGh5ID0gYWRhcHRlci0+cG9ydFtwb3J0X2lkXS5waHk7CisJc3RydWN0IGxpbmtfY29uZmlnICpsYyA9ICZhZGFwdGVyLT5wb3J0W3BvcnRfaWRdLmxpbmtfY29uZmlnOworCisJcGh5LT5vcHMtPmdldF9saW5rX3N0YXR1cyhwaHksICZsaW5rX29rLCAmc3BlZWQsICZkdXBsZXgsICZmYyk7CisKKwlsYy0+c3BlZWQgPSBzcGVlZCA8IDAgPyBTUEVFRF9JTlZBTElEIDogc3BlZWQ7CisJbGMtPmR1cGxleCA9IGR1cGxleCA8IDAgPyBEVVBMRVhfSU5WQUxJRCA6IGR1cGxleDsKKwlpZiAoIShsYy0+cmVxdWVzdGVkX2ZjICYgUEFVU0VfQVVUT05FRykpCisJCWZjID0gbGMtPnJlcXVlc3RlZF9mYyAmIChQQVVTRV9SWCB8IFBBVVNFX1RYKTsKKworCWlmIChsaW5rX29rICYmIHNwZWVkID49IDAgJiYgbGMtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJLyogU2V0IE1BQyBzcGVlZCwgZHVwbGV4LCBhbmQgZmxvdyBjb250cm9sIHRvIG1hdGNoIFBIWS4gKi8KKwkJc3RydWN0IGNtYWMgKm1hYyA9IGFkYXB0ZXItPnBvcnRbcG9ydF9pZF0ubWFjOworCisJCW1hYy0+b3BzLT5zZXRfc3BlZWRfZHVwbGV4X2ZjKG1hYywgc3BlZWQsIGR1cGxleCwgZmMpOworCQlsYy0+ZmMgPSAodW5zaWduZWQgY2hhcilmYzsKKwl9CisJdDFfbGlua19jaGFuZ2VkKGFkYXB0ZXIsIHBvcnRfaWQsIGxpbmtfb2ssIHNwZWVkLCBkdXBsZXgsIGZjKTsKK30KKworc3RhdGljIGludCB0MV9wY2lfaW50cl9oYW5kbGVyKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwl1MzIgcGNpeF9jYXVzZTsKKworICAgIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwgQV9QQ0lDRkdfSU5UUl9DQVVTRSwgJnBjaXhfY2F1c2UpOworCisJaWYgKHBjaXhfY2F1c2UpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LCBBX1BDSUNGR19JTlRSX0NBVVNFLAorCQkJCQkgcGNpeF9jYXVzZSk7CisJCXQxX2ZhdGFsX2VycihhZGFwdGVyKTsgICAgLyogUENJIGVycm9ycyBhcmUgZmF0YWwgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFdhaXQgdW50aWwgRWxtZXIncyBNSTEgaW50ZXJmYWNlIGlzIHJlYWR5IGZvciBuZXcgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIGludCBtaTFfd2FpdF91bnRpbF9yZWFkeShhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBtaTFfcmVnKQoreworCWludCBhdHRlbXB0cyA9IDEwMCwgYnVzeTsKKworCWRvIHsKKwkJdTMyIHZhbDsKKworCQlfX3QxX3RwaV9yZWFkKGFkYXB0ZXIsIG1pMV9yZWcsICZ2YWwpOworCQlidXN5ID0gdmFsICYgRl9NSTFfT1BfQlVTWTsKKwkJaWYgKGJ1c3kpCisJCQl1ZGVsYXkoMTApOworCX0gd2hpbGUgKGJ1c3kgJiYgLS1hdHRlbXB0cyk7CisJaWYgKGJ1c3kpCisJCUNIX0FMRVJUKCIlczogTURJTyBvcGVyYXRpb24gdGltZWQgb3V0XG4iLAorCQkJIGFkYXB0ZXItPm5hbWUpOworCXJldHVybiBidXN5OworfQorCisvKgorICogTUkxIE1ESU8gaW5pdGlhbGl6YXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIG1pMV9tZGlvX2luaXQoYWRhcHRlcl90ICphZGFwdGVyLCBjb25zdCBzdHJ1Y3QgYm9hcmRfaW5mbyAqYmkpCit7CisJdTMyIGNsa2RpdiA9IGJpLT5jbG9ja19lbG1lcjAgLyAoMiAqIGJpLT5tZGlvX21kYykgLSAxOworCXUzMiB2YWwgPSBGX01JMV9QUkVBTUJMRV9FTkFCTEUgfCBWX01JMV9NRElfSU5WRVJUKGJpLT5tZGlvX21kaWludikgfAorCQlWX01JMV9NRElfRU5BQkxFKGJpLT5tZGlvX21kaWVuKSB8IFZfTUkxX0NMS19ESVYoY2xrZGl2KTsKKworCWlmICghKGJpLT5jYXBzICYgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCkpCisJCXZhbCB8PSBWX01JMV9TT0YoMSk7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX1BPUlQwX01JMV9DRkcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbWkxX21kaW9fZXh0X3JlYWQoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsIGludCBtbWRfYWRkciwKKwkJCSAgICAgaW50IHJlZ19hZGRyLCB1bnNpZ25lZCBpbnQgKnZhbHApCit7CisJdTMyIGFkZHIgPSBWX01JMV9SRUdfQUREUihtbWRfYWRkcikgfCBWX01JMV9QSFlfQUREUihwaHlfYWRkcik7CisKKwlzcGluX2xvY2soJihhZGFwdGVyKS0+dHBpX2xvY2spOworCisJLyogV3JpdGUgdGhlIGFkZHJlc3Mgd2Ugd2FudC4gKi8KKwlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9QT1JUMF9NSTFfQUREUiwgYWRkcik7CisJX190MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfUE9SVDBfTUkxX0RBVEEsIHJlZ19hZGRyKTsKKwlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9QT1JUMF9NSTFfT1AsCisJCSAgICAgICBNSTFfT1BfSU5ESVJFQ1RfQUREUkVTUyk7CisJbWkxX3dhaXRfdW50aWxfcmVhZHkoYWRhcHRlciwgQV9FTE1FUjBfUE9SVDBfTUkxX09QKTsKKworCS8qIFdyaXRlIHRoZSBvcGVyYXRpb24gd2Ugd2FudC4gKi8KKwlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9QT1JUMF9NSTFfT1AsIE1JMV9PUF9JTkRJUkVDVF9SRUFEKTsKKwltaTFfd2FpdF91bnRpbF9yZWFkeShhZGFwdGVyLCBBX0VMTUVSMF9QT1JUMF9NSTFfT1ApOworCisJLyogUmVhZCB0aGUgZGF0YS4gKi8KKwlfX3QxX3RwaV9yZWFkKGFkYXB0ZXIsIEFfRUxNRVIwX1BPUlQwX01JMV9EQVRBLCB2YWxwKTsKKwlzcGluX3VubG9jaygmKGFkYXB0ZXIpLT50cGlfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWkxX21kaW9fZXh0X3dyaXRlKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHBoeV9hZGRyLCBpbnQgbW1kX2FkZHIsCisJCQkgICAgICBpbnQgcmVnX2FkZHIsIHVuc2lnbmVkIGludCB2YWwpCit7CisJdTMyIGFkZHIgPSBWX01JMV9SRUdfQUREUihtbWRfYWRkcikgfCBWX01JMV9QSFlfQUREUihwaHlfYWRkcik7CisKKwlzcGluX2xvY2soJihhZGFwdGVyKS0+dHBpX2xvY2spOworCisJLyogV3JpdGUgdGhlIGFkZHJlc3Mgd2Ugd2FudC4gKi8KKwlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9QT1JUMF9NSTFfQUREUiwgYWRkcik7CisJX190MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfUE9SVDBfTUkxX0RBVEEsIHJlZ19hZGRyKTsKKwlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9QT1JUMF9NSTFfT1AsCisJCSAgICAgICBNSTFfT1BfSU5ESVJFQ1RfQUREUkVTUyk7CisJbWkxX3dhaXRfdW50aWxfcmVhZHkoYWRhcHRlciwgQV9FTE1FUjBfUE9SVDBfTUkxX09QKTsKKworCS8qIFdyaXRlIHRoZSBkYXRhLiAqLworCV9fdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX1BPUlQwX01JMV9EQVRBLCB2YWwpOworCV9fdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX1BPUlQwX01JMV9PUCwgTUkxX09QX0lORElSRUNUX1dSSVRFKTsKKwltaTFfd2FpdF91bnRpbF9yZWFkeShhZGFwdGVyLCBBX0VMTUVSMF9QT1JUMF9NSTFfT1ApOworCXNwaW5fdW5sb2NrKCYoYWRhcHRlciktPnRwaV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBtZGlvX29wcyBtaTFfbWRpb19leHRfb3BzID0geworCW1pMV9tZGlvX2luaXQsCisJbWkxX21kaW9fZXh0X3JlYWQsCisJbWkxX21kaW9fZXh0X3dyaXRlCit9OworCitlbnVtIHsKKwlDSF9CUkRfTjExMF8xRiwKKwlDSF9CUkRfTjIxMF8xRiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYm9hcmRfaW5mbyB0MV9ib2FyZFtdID0geworCit7IENIQlRfQk9BUkRfTjExMCwgMS8qcG9ydHMjKi8sCisgIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUgLypjYXBzKi8sIENIQlRfVEVSTV9UMSwKKyAgQ0hCVF9NQUNfUE0zMzkzLCBDSEJUX1BIWV84OFgyMDEwLAorICAxMjUwMDAwMDAvKmNsay1jb3JlKi8sIDAvKmNsay1tYzMqLywgMC8qY2xrLW1jNCovLAorICAxLyplc3BpLXBvcnRzKi8sIDAvKmNsay1jc3BpKi8sIDQ0LypjbGstZWxtZXIwKi8sIDAvKm1kaWVuKi8sCisgIDAvKm1kaWludiovLCAxLyptZGMqLywgMC8qcGh5YmFzZWFkZHIqLywgJnQxX3BtMzM5M19vcHMsCisgICZ0MV9tdjg4eDIwMXhfb3BzLCAmbWkxX21kaW9fZXh0X29wcywKKyAgIkNoZWxzaW8gTjExMCAxeDEwR0Jhc2VYIE5JQyIgfSwKKworeyBDSEJUX0JPQVJEX04yMTAsIDEvKnBvcnRzIyovLAorICBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0ZJQlJFIC8qY2FwcyovLCBDSEJUX1RFUk1fVDIsCisgIENIQlRfTUFDX1BNMzM5MywgQ0hCVF9QSFlfODhYMjAxMCwKKyAgMTI1MDAwMDAwLypjbGstY29yZSovLCAwLypjbGstbWMzKi8sIDAvKmNsay1tYzQqLywKKyAgMS8qZXNwaS1wb3J0cyovLCAwLypjbGstY3NwaSovLCA0NC8qY2xrLWVsbWVyMCovLCAwLyptZGllbiovLAorICAwLyptZGlpbnYqLywgMS8qbWRjKi8sIDAvKnBoeWJhc2VhZGRyKi8sICZ0MV9wbTMzOTNfb3BzLAorICAmdDFfbXY4OHgyMDF4X29wcywgJm1pMV9tZGlvX2V4dF9vcHMsCisgICJDaGVsc2lvIE4yMTAgMXgxMEdCYXNlWCBOSUMiIH0sCisKK307CisKK3N0cnVjdCBwY2lfZGV2aWNlX2lkIHQxX3BjaV90YmxbXSA9IHsKKwlDSF9ERVZJQ0UoNywgMCwgQ0hfQlJEX04xMTBfMUYpLAorCUNIX0RFVklDRSgxMCwgMSwgQ0hfQlJEX04yMTBfMUYpLAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHQxX3BjaV90YmwpOworCisvKgorICogUmV0dXJuIHRoZSBib2FyZF9pbmZvIHN0cnVjdHVyZSB3aXRoIGEgZ2l2ZW4gaW5kZXguICBPdXQtb2YtcmFuZ2UgaW5kaWNlcworICogcmV0dXJuIE5VTEwuCisgKi8KK2NvbnN0IHN0cnVjdCBib2FyZF9pbmZvICp0MV9nZXRfYm9hcmRfaW5mbyh1bnNpZ25lZCBpbnQgYm9hcmRfaWQpCit7CisJcmV0dXJuIGJvYXJkX2lkIDwgQVJSQVlfU0laRSh0MV9ib2FyZCkgPyAmdDFfYm9hcmRbYm9hcmRfaWRdIDogTlVMTDsKK30KKworc3RydWN0IGNoZWxzaW9fdnBkX3QgeworCXUzMiBmb3JtYXRfdmVyc2lvbjsKKwl1OCBzZXJpYWxfbnVtYmVyWzE2XTsKKwl1OCBtYWNfYmFzZV9hZGRyZXNzWzZdOworCXU4IHBhZFsyXTsgICAgICAgICAgIC8qIG1ha2UgbXVsdGlwbGUtb2YtNCBzaXplIHJlcXVpcmVtZW50IGV4cGxpY2l0ICovCit9OworCisjZGVmaW5lIEVFUFJPTVNJWkUgICAgICAgICg4ICogMTAyNCkKKyNkZWZpbmUgRUVQUk9NX01BWF9QT0xMICAgNAorCisvKgorICogUmVhZCBTRUVQUk9NLiBBIHplcm8gaXMgd3JpdHRlbiB0byB0aGUgZmxhZyByZWdpc3RlciB3aGVuIHRoZSBhZGRyZXMgaXMKKyAqIHdyaXR0ZW4gdG8gdGhlIENvbnRyb2wgcmVnaXN0ZXIuIFRoZSBoYXJkd2FyZSBkZXZpY2Ugd2lsbCBzZXQgdGhlIGZsYWcgdG8gYQorICogb25lIHdoZW4gNEIgaGF2ZSBiZWVuIHRyYW5zZmVycmVkIHRvIHRoZSBEYXRhIHJlZ2lzdGVyLgorICovCitpbnQgdDFfc2VlcHJvbV9yZWFkKGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiAqZGF0YSkKK3sKKwlpbnQgaSA9IEVFUFJPTV9NQVhfUE9MTDsKKwl1MTYgdmFsOworCisJaWYgKGFkZHIgPj0gRUVQUk9NU0laRSB8fCAoYWRkciAmIDMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBjaV93cml0ZV9jb25maWdfd29yZChhZGFwdGVyLT5wZGV2LCBBX1BDSUNGR19WUERfQUREUiwgKHUxNilhZGRyKTsKKwlkbyB7CisJCXVkZWxheSg1MCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFkYXB0ZXItPnBkZXYsIEFfUENJQ0ZHX1ZQRF9BRERSLCAmdmFsKTsKKwl9IHdoaWxlICghKHZhbCAmIEZfVlBEX09QX0ZMQUcpICYmIC0taSk7CisKKwlpZiAoISh2YWwgJiBGX1ZQRF9PUF9GTEFHKSkgeworCQlDSF9FUlIoIiVzOiByZWFkaW5nIEVFUFJPTSBhZGRyZXNzIDB4JXggZmFpbGVkXG4iLAorCQkgICAgICAgYWRhcHRlci0+bmFtZSwgYWRkcik7CisJCXJldHVybiAtRUlPOworCX0KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwgQV9QQ0lDRkdfVlBEX0RBVEEsIGRhdGEpOworCSpkYXRhID0gbGUzMl90b19jcHUoKmRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHQxX2VlcHJvbV92cGRfZ2V0KGFkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IGNoZWxzaW9fdnBkX3QgKnZwZCkKK3sKKwlpbnQgYWRkciwgcmV0ID0gMDsKKworCWZvciAoYWRkciA9IDA7ICFyZXQgJiYgYWRkciA8IHNpemVvZigqdnBkKTsgYWRkciArPSBzaXplb2YodTMyKSkKKwkJcmV0ID0gdDFfc2VlcHJvbV9yZWFkKGFkYXB0ZXIsIGFkZHIsCisJCQkJICAgICAgKHUzMiAqKSgodTggKil2cGQgKyBhZGRyKSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVhZCBhIHBvcnQncyBNQUMgYWRkcmVzcyBmcm9tIHRoZSBWUEQgUk9NLgorICovCitzdGF0aWMgaW50IHZwZF9tYWNhZGRyZXNzX2dldChhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBpbmRleCwgdTggbWFjX2FkZHJbXSkKK3sKKwlzdHJ1Y3QgY2hlbHNpb192cGRfdCB2cGQ7CisKKwlpZiAodDFfZWVwcm9tX3ZwZF9nZXQoYWRhcHRlciwgJnZwZCkpCisJCXJldHVybiAxOworCW1lbWNweShtYWNfYWRkciwgdnBkLm1hY19iYXNlX2FkZHJlc3MsIDUpOworCW1hY19hZGRyWzVdID0gdnBkLm1hY19iYXNlX2FkZHJlc3NbNV0gKyBpbmRleDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB1cCB0aGUgTUFDL1BIWSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBsaW5rIHNldHRpbmdzLgorICoKKyAqIElmIHRoZSBQSFkgY2FuIGF1dG8tbmVnb3RpYXRlIGZpcnN0IGRlY2lkZSB3aGF0IHRvIGFkdmVydGlzZSwgdGhlbgorICogZW5hYmxlL2Rpc2FibGUgYXV0by1uZWdvdGlhdGlvbiBhcyBkZXNpcmVkIGFuZCByZXNldC4KKyAqCisgKiBJZiB0aGUgUEhZIGRvZXMgbm90IGF1dG8tbmVnb3RpYXRlIHdlIGp1c3QgcmVzZXQgaXQuCisgKgorICogSWYgYXV0by1uZWdvdGlhdGlvbiBpcyBvZmYgc2V0IHRoZSBNQUMgdG8gdGhlIHByb3BlciBzcGVlZC9kdXBsZXgvRkMsCisgKiBvdGhlcndpc2UgZG8gaXQgbGF0ZXIgYmFzZWQgb24gdGhlIG91dGNvbWUgb2YgYXV0by1uZWdvdGlhdGlvbi4KKyAqLworaW50IHQxX2xpbmtfc3RhcnQoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGNtYWMgKm1hYywgc3RydWN0IGxpbmtfY29uZmlnICpsYykKK3sKKwl1bnNpZ25lZCBpbnQgZmMgPSBsYy0+cmVxdWVzdGVkX2ZjICYgKFBBVVNFX1JYIHwgUEFVU0VfVFgpOworCisJaWYgKGxjLT5zdXBwb3J0ZWQgJiBTVVBQT1JURURfQXV0b25lZykgeworCQlsYy0+YWR2ZXJ0aXNpbmcgJj0gfihBRFZFUlRJU0VEX0FTWU1fUEFVU0UgfCBBRFZFUlRJU0VEX1BBVVNFKTsKKwkJaWYgKGZjKSB7CisJCQlsYy0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BU1lNX1BBVVNFOworCQkJaWYgKGZjID09IChQQVVTRV9SWCB8IFBBVVNFX1RYKSkKKwkJCQlsYy0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QQVVTRTsKKwkJfQorCQlwaHktPm9wcy0+YWR2ZXJ0aXNlKHBoeSwgbGMtPmFkdmVydGlzaW5nKTsKKworCQlpZiAobGMtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSB7CisJCQlsYy0+c3BlZWQgPSBsYy0+cmVxdWVzdGVkX3NwZWVkOworCQkJbGMtPmR1cGxleCA9IGxjLT5yZXF1ZXN0ZWRfZHVwbGV4OworCQkJbGMtPmZjID0gKHVuc2lnbmVkIGNoYXIpZmM7CisJCQltYWMtPm9wcy0+c2V0X3NwZWVkX2R1cGxleF9mYyhtYWMsIGxjLT5zcGVlZCwKKwkJCQkJCSAgICAgIGxjLT5kdXBsZXgsIGZjKTsKKwkJCS8qIEFsc28gZGlzYWJsZXMgYXV0b25lZyAqLworCQkJcGh5LT5vcHMtPnNldF9zcGVlZF9kdXBsZXgocGh5LCBsYy0+c3BlZWQsIGxjLT5kdXBsZXgpOworCQkJcGh5LT5vcHMtPnJlc2V0KHBoeSwgMCk7CisJCX0gZWxzZQorCQkJcGh5LT5vcHMtPmF1dG9uZWdfZW5hYmxlKHBoeSk7IC8qIGFsc28gcmVzZXRzIFBIWSAqLworCX0gZWxzZSB7CisJCW1hYy0+b3BzLT5zZXRfc3BlZWRfZHVwbGV4X2ZjKG1hYywgLTEsIC0xLCBmYyk7CisJCWxjLT5mYyA9ICh1bnNpZ25lZCBjaGFyKWZjOworCQlwaHktPm9wcy0+cmVzZXQocGh5LCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFeHRlcm5hbCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgYm9hcmRzIHVzaW5nIGVsbWVyMC4KKyAqLworaW50IGVsbWVyMF9leHRfaW50cl9oYW5kbGVyKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKyAgICAJc3RydWN0IGNwaHkgKnBoeTsKKwlpbnQgcGh5X2NhdXNlOworICAgIAl1MzIgY2F1c2U7CisKKwl0MV90cGlfcmVhZChhZGFwdGVyLCBBX0VMTUVSMF9JTlRfQ0FVU0UsICZjYXVzZSk7CisKKwlzd2l0Y2ggKGJvYXJkX2luZm8oYWRhcHRlciktPmJvYXJkKSB7CisJY2FzZSBDSEJUX0JPQVJEX04yMTA6CisJY2FzZSBDSEJUX0JPQVJEX04xMTA6CisJCWlmIChjYXVzZSAmIEVMTUVSMF9HUF9CSVQ2KSB7IC8qIE1hcnZlbGwgODh4MjAxMCBpbnRlcnJ1cHQgKi8KKwkJCXBoeSA9IGFkYXB0ZXItPnBvcnRbMF0ucGh5OworCQkJcGh5X2NhdXNlID0gcGh5LT5vcHMtPmludGVycnVwdF9oYW5kbGVyKHBoeSk7CisJCQlpZiAocGh5X2NhdXNlICYgY3BoeV9jYXVzZV9saW5rX2NoYW5nZSkKKwkJCQlsaW5rX2NoYW5nZWQoYWRhcHRlciwgMCk7CisJCX0KKwkJYnJlYWs7CisJfQorCXQxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9JTlRfQ0FVU0UsIGNhdXNlKTsKKwlyZXR1cm4gMDsKK30KKworLyogRW5hYmxlcyBhbGwgaW50ZXJydXB0cy4gKi8KK3ZvaWQgdDFfaW50ZXJydXB0c19lbmFibGUoYWRhcHRlcl90ICphZGFwdGVyKQoreworCXVuc2lnbmVkIGludCBpOworCXUzMiBwbF9pbnRyOworCisJYWRhcHRlci0+c2xvd19pbnRyX21hc2sgPSBGX1BMX0lOVFJfU0dFX0VSUjsKKworCXQxX3NnZV9pbnRyX2VuYWJsZShhZGFwdGVyLT5zZ2UpOworCWlmIChhZGFwdGVyLT5lc3BpKSB7CisJCWFkYXB0ZXItPnNsb3dfaW50cl9tYXNrIHw9IEZfUExfSU5UUl9FU1BJOworCQl0MV9lc3BpX2ludHJfZW5hYmxlKGFkYXB0ZXItPmVzcGkpOworCX0KKworCS8qIEVuYWJsZSBNQUMvUEhZIGludGVycnVwdHMgZm9yIGVhY2ggcG9ydC4gKi8KKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKKwkJYWRhcHRlci0+cG9ydFtpXS5tYWMtPm9wcy0+aW50ZXJydXB0X2VuYWJsZShhZGFwdGVyLT5wb3J0W2ldLm1hYyk7CisJCWFkYXB0ZXItPnBvcnRbaV0ucGh5LT5vcHMtPmludGVycnVwdF9lbmFibGUoYWRhcHRlci0+cG9ydFtpXS5waHkpOworCX0KKworCS8qIEVuYWJsZSBQQ0lYICYgZXh0ZXJuYWwgY2hpcCBpbnRlcnJ1cHRzIG9uIEFTSUMgYm9hcmRzLiAqLworCXBsX2ludHIgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworCisJLyogUENJLVggaW50ZXJydXB0cyAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwgQV9QQ0lDRkdfSU5UUl9FTkFCTEUsCisJCQkgICAgICAgMHhmZmZmZmZmZik7CisKKwlhZGFwdGVyLT5zbG93X2ludHJfbWFzayB8PSBGX1BMX0lOVFJfRVhUIHwgRl9QTF9JTlRSX1BDSVg7CisJcGxfaW50ciB8PSBGX1BMX0lOVFJfRVhUIHwgRl9QTF9JTlRSX1BDSVg7CisJd3JpdGVsKHBsX2ludHIsIGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0VOQUJMRSk7Cit9CisKKy8qIERpc2FibGVzIGFsbCBpbnRlcnJ1cHRzLiAqLwordm9pZCB0MV9pbnRlcnJ1cHRzX2Rpc2FibGUoYWRhcHRlcl90KiBhZGFwdGVyKQoreworCXVuc2lnbmVkIGludCBpOworCisJdDFfc2dlX2ludHJfZGlzYWJsZShhZGFwdGVyLT5zZ2UpOworCWlmIChhZGFwdGVyLT5lc3BpKQorCQl0MV9lc3BpX2ludHJfZGlzYWJsZShhZGFwdGVyLT5lc3BpKTsKKworCS8qIERpc2FibGUgTUFDL1BIWSBpbnRlcnJ1cHRzIGZvciBlYWNoIHBvcnQuICovCisJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7CisJCWFkYXB0ZXItPnBvcnRbaV0ubWFjLT5vcHMtPmludGVycnVwdF9kaXNhYmxlKGFkYXB0ZXItPnBvcnRbaV0ubWFjKTsKKwkJYWRhcHRlci0+cG9ydFtpXS5waHktPm9wcy0+aW50ZXJydXB0X2Rpc2FibGUoYWRhcHRlci0+cG9ydFtpXS5waHkpOworCX0KKworCS8qIERpc2FibGUgUENJWCAmIGV4dGVybmFsIGNoaXAgaW50ZXJydXB0cy4gKi8KKwl3cml0ZWwoMCwgYWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKworCS8qIFBDSS1YIGludGVycnVwdHMgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsIEFfUENJQ0ZHX0lOVFJfRU5BQkxFLCAwKTsKKworCWFkYXB0ZXItPnNsb3dfaW50cl9tYXNrID0gMDsKK30KKworLyogQ2xlYXJzIGFsbCBpbnRlcnJ1cHRzICovCit2b2lkIHQxX2ludGVycnVwdHNfY2xlYXIoYWRhcHRlcl90KiBhZGFwdGVyKQoreworCXVuc2lnbmVkIGludCBpOworCXUzMiBwbF9pbnRyOworCisKKwl0MV9zZ2VfaW50cl9jbGVhcihhZGFwdGVyLT5zZ2UpOworCWlmIChhZGFwdGVyLT5lc3BpKQorCQl0MV9lc3BpX2ludHJfY2xlYXIoYWRhcHRlci0+ZXNwaSk7CisKKwkvKiBDbGVhciBNQUMvUEhZIGludGVycnVwdHMgZm9yIGVhY2ggcG9ydC4gKi8KKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKKwkJYWRhcHRlci0+cG9ydFtpXS5tYWMtPm9wcy0+aW50ZXJydXB0X2NsZWFyKGFkYXB0ZXItPnBvcnRbaV0ubWFjKTsKKwkJYWRhcHRlci0+cG9ydFtpXS5waHktPm9wcy0+aW50ZXJydXB0X2NsZWFyKGFkYXB0ZXItPnBvcnRbaV0ucGh5KTsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgZXh0ZXJuYWwgZGV2aWNlcy4gKi8KKyAgICAJcGxfaW50ciA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKTsKKworCXdyaXRlbChwbF9pbnRyIHwgRl9QTF9JTlRSX0VYVCB8IEZfUExfSU5UUl9QQ0lYLAorCSAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9QTF9DQVVTRSk7CisKKwkvKiBQQ0ktWCBpbnRlcnJ1cHRzICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LCBBX1BDSUNGR19JTlRSX0NBVVNFLCAweGZmZmZmZmZmKTsKK30KKworLyoKKyAqIFNsb3cgcGF0aCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgQVNJQ3MuCisgKi8KK2ludCB0MV9zbG93X2ludHJfaGFuZGxlcihhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJdTMyIGNhdXNlID0gcmVhZGwoYWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOworCisJY2F1c2UgJj0gYWRhcHRlci0+c2xvd19pbnRyX21hc2s7CisJaWYgKCFjYXVzZSkKKwkJcmV0dXJuIDA7CisJaWYgKGNhdXNlICYgRl9QTF9JTlRSX1NHRV9FUlIpCisJCXQxX3NnZV9pbnRyX2Vycm9yX2hhbmRsZXIoYWRhcHRlci0+c2dlKTsKKwlpZiAoY2F1c2UgJiBGX1BMX0lOVFJfRVNQSSkKKwkJdDFfZXNwaV9pbnRyX2hhbmRsZXIoYWRhcHRlci0+ZXNwaSk7CisJaWYgKGNhdXNlICYgRl9QTF9JTlRSX1BDSVgpCisJCXQxX3BjaV9pbnRyX2hhbmRsZXIoYWRhcHRlcik7CisJaWYgKGNhdXNlICYgRl9QTF9JTlRSX0VYVCkKKwkJdDFfZWxtZXIwX2V4dF9pbnRyKGFkYXB0ZXIpOworCisJLyogQ2xlYXIgdGhlIGludGVycnVwdHMganVzdCBwcm9jZXNzZWQuICovCisJd3JpdGVsKGNhdXNlLCBhZGFwdGVyLT5yZWdzICsgQV9QTF9DQVVTRSk7CisJKHZvaWQpcmVhZGwoYWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOyAvKiBmbHVzaCB3cml0ZXMgKi8KKwlyZXR1cm4gMTsKK30KKworLyogUGF1c2UgZGVhZGxvY2sgYXZvaWRhbmNlIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgRFJPUF9NU0VDIDE2CisjZGVmaW5lIERST1BfUEtUU19DTlQgIDEKKworc3RhdGljIHZvaWQgc2V0X2NzdW1fb2ZmbG9hZChhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBjc3VtX2JpdCwgaW50IGVuYWJsZSkKK3sKKwl1MzIgdmFsID0gcmVhZGwoYWRhcHRlci0+cmVncyArIEFfVFBfR0xPQkFMX0NPTkZJRyk7CisKKwlpZiAoZW5hYmxlKQorCQl2YWwgfD0gY3N1bV9iaXQ7CisJZWxzZQorCQl2YWwgJj0gfmNzdW1fYml0OworCXdyaXRlbCh2YWwsIGFkYXB0ZXItPnJlZ3MgKyBBX1RQX0dMT0JBTF9DT05GSUcpOworfQorCit2b2lkIHQxX3RwX3NldF9pcF9jaGVja3N1bV9vZmZsb2FkKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IGVuYWJsZSkKK3sKKwlzZXRfY3N1bV9vZmZsb2FkKGFkYXB0ZXIsIEZfSVBfQ1NVTSwgZW5hYmxlKTsKK30KKwordm9pZCB0MV90cF9zZXRfdWRwX2NoZWNrc3VtX29mZmxvYWQoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgZW5hYmxlKQoreworCXNldF9jc3VtX29mZmxvYWQoYWRhcHRlciwgRl9VRFBfQ1NVTSwgZW5hYmxlKTsKK30KKwordm9pZCB0MV90cF9zZXRfdGNwX2NoZWNrc3VtX29mZmxvYWQoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgZW5hYmxlKQoreworCXNldF9jc3VtX29mZmxvYWQoYWRhcHRlciwgRl9UQ1BfQ1NVTSwgZW5hYmxlKTsKK30KKworc3RhdGljIHZvaWQgdDFfdHBfcmVzZXQoYWRhcHRlcl90ICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgdHBfY2xrKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBGX1RQX0lOX0NTUElfQ1BMIHwgRl9UUF9JTl9DU1BJX0NIRUNLX0lQX0NTVU0gfAorCSAgICAgIEZfVFBfSU5fQ1NQSV9DSEVDS19UQ1BfQ1NVTSB8IEZfVFBfSU5fRVNQSV9FVEhFUk5FVDsKKwl2YWwgfD0gRl9UUF9JTl9FU1BJX0NIRUNLX0lQX0NTVU0gfAorCSAgICAgICBGX1RQX0lOX0VTUElfQ0hFQ0tfVENQX0NTVU07CisJd3JpdGVsKHZhbCwgYWRhcHRlci0+cmVncyArIEFfVFBfSU5fQ09ORklHKTsKKwl3cml0ZWwoRl9UUF9PVVRfQ1NQSV9DUEwgfAorCSAgICAgICBGX1RQX09VVF9FU1BJX0VUSEVSTkVUIHwKKwkgICAgICAgRl9UUF9PVVRfRVNQSV9HRU5FUkFURV9JUF9DU1VNIHwKKwkgICAgICAgRl9UUF9PVVRfRVNQSV9HRU5FUkFURV9UQ1BfQ1NVTSwKKwkgICAgICAgYWRhcHRlci0+cmVncyArIEFfVFBfT1VUX0NPTkZJRyk7CisKKwl2YWwgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9UUF9HTE9CQUxfQ09ORklHKTsKKwl2YWwgJj0gfihGX0lQX0NTVU0gfCBGX1VEUF9DU1VNIHwgRl9UQ1BfQ1NVTSk7CisJd3JpdGVsKHZhbCwgYWRhcHRlci0+cmVncyArIEFfVFBfR0xPQkFMX0NPTkZJRyk7CisKKwkvKgorCSAqIEVuYWJsZSBwYXVzZSBmcmFtZSBkZWFkbG9jayBwcmV2ZW50aW9uLgorCSAqLworCWlmIChpc19UMihhZGFwdGVyKSkgeworCQl1MzIgZHJvcF90aWNrcyA9IERST1BfTVNFQyAqICh0cF9jbGsgLyAxMDAwKTsKKworCQl3cml0ZWwoRl9FTkFCTEVfVFhfRFJPUCB8IEZfRU5BQkxFX1RYX0VSUk9SIHwKKwkJICAgICAgIFZfRFJPUF9USUNLU19DTlQoZHJvcF90aWNrcykgfAorCQkgICAgICAgVl9OVU1fUEtUU19EUk9QUEVEKERST1BfUEtUU19DTlQpLAorCQkgICAgICAgYWRhcHRlci0+cmVncyArIEFfVFBfVFhfRFJPUF9DT05GSUcpOworCX0KKworCXdyaXRlbChGX1RQX1JFU0VULCBhZGFwdGVyLT5yZWdzICsgQV9UUF9SRVNFVCk7Cit9CisKK2ludCBfX2RldmluaXQgdDFfZ2V0X2JvYXJkX3JldihhZGFwdGVyX3QgKmFkYXB0ZXIsIGNvbnN0IHN0cnVjdCBib2FyZF9pbmZvICpiaSwKKwkJCSAgICAgICBzdHJ1Y3QgYWRhcHRlcl9wYXJhbXMgKnApCit7CisJcC0+Y2hpcF92ZXJzaW9uID0gYmktPmNoaXBfdGVybTsKKwlpZiAocC0+Y2hpcF92ZXJzaW9uID09IENIQlRfVEVSTV9UMSB8fAorCSAgICBwLT5jaGlwX3ZlcnNpb24gPT0gQ0hCVF9URVJNX1QyKSB7CisJCXUzMiB2YWwgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9UUF9QQ19DT05GSUcpOworCisJCXZhbCA9IEdfVFBfUENfUkVWKHZhbCk7CisJCWlmICh2YWwgPT0gMikKKwkJCXAtPmNoaXBfcmV2aXNpb24gPSBURVJNX1QxQjsKKwkJZWxzZSBpZiAodmFsID09IDMpCisJCQlwLT5jaGlwX3JldmlzaW9uID0gVEVSTV9UMjsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCX0gZWxzZQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmFibGUgYm9hcmQgY29tcG9uZW50cyBvdGhlciB0aGFuIHRoZSBDaGVsc2lvIGNoaXAsIHN1Y2ggYXMgZXh0ZXJuYWwgTUFDCisgKiBhbmQgUEhZLgorICovCitzdGF0aWMgaW50IGJvYXJkX2luaXQoYWRhcHRlcl90ICphZGFwdGVyLCBjb25zdCBzdHJ1Y3QgYm9hcmRfaW5mbyAqYmkpCit7CisJc3dpdGNoIChiaS0+Ym9hcmQpIHsKKwljYXNlIENIQlRfQk9BUkRfTjExMDoKKwljYXNlIENIQlRfQk9BUkRfTjIxMDoKKwkJd3JpdGVsKFZfVFBJUEFSKDB4ZiksIGFkYXB0ZXItPnJlZ3MgKyBBX1RQSV9QQVIpOworICAgIAkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgMHg4MDApOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRlcm1pbmF0b3IgSFcgbW9kdWxlcy4gIE5vdGUgdGhhdCBleHRlcm5hbAorICogTUFDIGFuZCBQSFlzIGFyZSBpbml0aWFsaXplZCBzZXBhcmF0ZWx5LgorICovCitpbnQgdDFfaW5pdF9od19tb2R1bGVzKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlpbnQgZXJyID0gLUVJTzsKKwljb25zdCBzdHJ1Y3QgYm9hcmRfaW5mbyAqYmkgPSBib2FyZF9pbmZvKGFkYXB0ZXIpOworCisJaWYgKCFiaS0+Y2xvY2tfbWM0KSB7CisJCXUzMiB2YWwgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9NQzRfQ0ZHKTsKKworCQl3cml0ZWwodmFsIHwgRl9SRUFEWSB8IEZfTUM0X1NMT1csIGFkYXB0ZXItPnJlZ3MgKyBBX01DNF9DRkcpOworCQl3cml0ZWwoRl9NX0JVU19FTkFCTEUgfCBGX1RDQU1fUkVTRVQsCisJCSAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9NQzVfQ09ORklHKTsKKwl9CisKKwlpZiAoYWRhcHRlci0+ZXNwaSAmJiB0MV9lc3BpX2luaXQoYWRhcHRlci0+ZXNwaSwgYmktPmNoaXBfbWFjLAorCQkJCQkgIGJpLT5lc3BpX25wb3J0cykpCisJCWdvdG8gb3V0X2VycjsKKworCXQxX3RwX3Jlc2V0KGFkYXB0ZXIsIGJpLT5jbG9ja19jb3JlKTsKKworCWVyciA9IHQxX3NnZV9jb25maWd1cmUoYWRhcHRlci0+c2dlLCAmYWRhcHRlci0+cGFyYW1zLnNnZSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZXJyOworCisJZXJyID0gMDsKKyBvdXRfZXJyOgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgYSBjYXJkJ3MgUENJIG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBnZXRfcGNpX21vZGUoYWRhcHRlcl90ICphZGFwdGVyLCBzdHJ1Y3QgY2hlbHNpb19wY2lfcGFyYW1zICpwKQoreworCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzcGVlZF9tYXBbXSA9IHsgMzMsIDY2LCAxMDAsIDEzMyB9OworCXUzMiBwY2lfbW9kZTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LCBBX1BDSUNGR19NT0RFLCAmcGNpX21vZGUpOworCXAtPnNwZWVkID0gc3BlZWRfbWFwW0dfUENJX01PREVfQ0xLKHBjaV9tb2RlKV07CisJcC0+d2lkdGggPSAocGNpX21vZGUgJiBGX1BDSV9NT0RFXzY0QklUKSA/IDY0IDogMzI7CisJcC0+aXNfcGNpeCA9IChwY2lfbW9kZSAmIEZfUENJX01PREVfUENJWCkgIT0gMDsKK30KKworLyoKKyAqIFJlbGVhc2UgdGhlIHN0cnVjdHVyZXMgaG9sZGluZyB0aGUgU1cgcGVyLVRlcm1pbmF0b3ItSFctbW9kdWxlIHN0YXRlLgorICovCit2b2lkIHQxX2ZyZWVfc3dfbW9kdWxlcyhhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKKwkJc3RydWN0IGNtYWMgKm1hYyA9IGFkYXB0ZXItPnBvcnRbaV0ubWFjOworCQlzdHJ1Y3QgY3BoeSAqcGh5ID0gYWRhcHRlci0+cG9ydFtpXS5waHk7CisKKwkJaWYgKG1hYykKKwkJCW1hYy0+b3BzLT5kZXN0cm95KG1hYyk7CisJCWlmIChwaHkpCisJCQlwaHktPm9wcy0+ZGVzdHJveShwaHkpOworCX0KKworCWlmIChhZGFwdGVyLT5zZ2UpCisJCXQxX3NnZV9kZXN0cm95KGFkYXB0ZXItPnNnZSk7CisJaWYgKGFkYXB0ZXItPmVzcGkpCisJCXQxX2VzcGlfZGVzdHJveShhZGFwdGVyLT5lc3BpKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfbGlua19jb25maWcoc3RydWN0IGxpbmtfY29uZmlnICpsYywKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGJvYXJkX2luZm8gKmJpKQoreworCWxjLT5zdXBwb3J0ZWQgPSBiaS0+Y2FwczsKKwlsYy0+cmVxdWVzdGVkX3NwZWVkID0gbGMtPnNwZWVkID0gU1BFRURfSU5WQUxJRDsKKwlsYy0+cmVxdWVzdGVkX2R1cGxleCA9IGxjLT5kdXBsZXggPSBEVVBMRVhfSU5WQUxJRDsKKwlsYy0+cmVxdWVzdGVkX2ZjID0gbGMtPmZjID0gUEFVU0VfUlggfCBQQVVTRV9UWDsKKwlpZiAobGMtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9BdXRvbmVnKSB7CisJCWxjLT5hZHZlcnRpc2luZyA9IGxjLT5zdXBwb3J0ZWQ7CisJCWxjLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJCWxjLT5yZXF1ZXN0ZWRfZmMgfD0gUEFVU0VfQVVUT05FRzsKKwl9IGVsc2UgeworCQlsYy0+YWR2ZXJ0aXNpbmcgPSAwOworCQlsYy0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwl9Cit9CisKKworLyoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBob2xkIHRoZSBTVyBzdGF0ZSBvZgorICogdGhlIFRlcm1pbmF0b3IgSFcgbW9kdWxlcy4KKyAqLworaW50IF9fZGV2aW5pdCB0MV9pbml0X3N3X21vZHVsZXMoYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSBjb25zdCBzdHJ1Y3QgYm9hcmRfaW5mbyAqYmkpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlhZGFwdGVyLT5wYXJhbXMuYnJkX2luZm8gPSBiaTsKKwlhZGFwdGVyLT5wYXJhbXMubnBvcnRzID0gYmktPnBvcnRfbnVtYmVyOworCWFkYXB0ZXItPnBhcmFtcy5zdGF0c191cGRhdGVfcGVyaW9kID0gYmktPmdtYWMtPnN0YXRzX3VwZGF0ZV9wZXJpb2Q7CisKKwlhZGFwdGVyLT5zZ2UgPSB0MV9zZ2VfY3JlYXRlKGFkYXB0ZXIsICZhZGFwdGVyLT5wYXJhbXMuc2dlKTsKKwlpZiAoIWFkYXB0ZXItPnNnZSkgeworCQlDSF9FUlIoIiVzOiBTR0UgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLAorCQkgICAgICAgYWRhcHRlci0+bmFtZSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGJpLT5lc3BpX25wb3J0cyAmJiAhKGFkYXB0ZXItPmVzcGkgPSB0MV9lc3BpX2NyZWF0ZShhZGFwdGVyKSkpIHsKKwkJQ0hfRVJSKCIlczogRVNQSSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCisJCSAgICAgICBhZGFwdGVyLT5uYW1lKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlib2FyZF9pbml0KGFkYXB0ZXIsIGJpKTsKKwliaS0+bWRpb19vcHMtPmluaXQoYWRhcHRlciwgYmkpOworCWlmIChiaS0+Z3BoeS0+cmVzZXQpCisJCWJpLT5ncGh5LT5yZXNldChhZGFwdGVyKTsKKwlpZiAoYmktPmdtYWMtPnJlc2V0KQorCQliaS0+Z21hYy0+cmVzZXQoYWRhcHRlcik7CisKKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKKwkJdTggaHdfYWRkcls2XTsKKwkJc3RydWN0IGNtYWMgKm1hYzsKKwkJaW50IHBoeV9hZGRyID0gYmktPm1kaW9fcGh5YmFzZWFkZHIgKyBpOworCisJCWFkYXB0ZXItPnBvcnRbaV0ucGh5ID0gYmktPmdwaHktPmNyZWF0ZShhZGFwdGVyLCBwaHlfYWRkciwKKwkJCQkJCQliaS0+bWRpb19vcHMpOworCQlpZiAoIWFkYXB0ZXItPnBvcnRbaV0ucGh5KSB7CisJCQlDSF9FUlIoIiVzOiBQSFkgJWQgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLAorCQkJICAgICAgIGFkYXB0ZXItPm5hbWUsIGkpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWFkYXB0ZXItPnBvcnRbaV0ubWFjID0gbWFjID0gYmktPmdtYWMtPmNyZWF0ZShhZGFwdGVyLCBpKTsKKwkJaWYgKCFtYWMpIHsKKwkJCUNIX0VSUigiJXM6IE1BQyAlZCBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCisJCQkgICAgICAgYWRhcHRlci0+bmFtZSwgaSk7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyoKKwkJICogR2V0IHRoZSBwb3J0J3MgTUFDIGFkZHJlc3NlcyBlaXRoZXIgZnJvbSB0aGUgRUVQUk9NIGlmIG9uZQorCQkgKiBleGlzdHMgb3IgdGhlIG9uZSBoYXJkY29kZWQgaW4gdGhlIE1BQy4KKwkJICovCisJCWlmICh2cGRfbWFjYWRkcmVzc19nZXQoYWRhcHRlciwgaSwgaHdfYWRkcikpIHsKKwkJCUNIX0VSUigiJXM6IGNvdWxkIG5vdCByZWFkIE1BQyBhZGRyZXNzIGZyb20gVlBEIFJPTVxuIiwKKwkJCSAgICAgICBhZGFwdGVyLT5wb3J0W2ldLmRldi0+bmFtZSk7CisJCQlnb3RvIGVycm9yOworCQl9CisJCW1lbWNweShhZGFwdGVyLT5wb3J0W2ldLmRldi0+ZGV2X2FkZHIsIGh3X2FkZHIsIEVUSF9BTEVOKTsKKwkJaW5pdF9saW5rX2NvbmZpZygmYWRhcHRlci0+cG9ydFtpXS5saW5rX2NvbmZpZywgYmkpOworCX0KKworCWdldF9wY2lfbW9kZShhZGFwdGVyLCAmYWRhcHRlci0+cGFyYW1zLnBjaSk7CisJdDFfaW50ZXJydXB0c19jbGVhcihhZGFwdGVyKTsKKwlyZXR1cm4gMDsKKworIGVycm9yOgorCXQxX2ZyZWVfc3dfbW9kdWxlcyhhZGFwdGVyKTsKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3N1bmkxeDEwZ2V4cF9yZWdzLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL3N1bmkxeDEwZ2V4cF9yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4MTZjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3VuaTF4MTBnZXhwX3JlZ3MuaApAQCAtMCwwICsxLDIxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZpbGU6IHN1bmkxeDEwZ2V4cF9yZWdzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogJFJldmlzaW9uOiAxLjkgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAkRGF0ZTogMjAwNS8wNi8yMiAwMDoxNzowNCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIFBNQy9TSUVSUkEgKHBtMzM5MykgTUFDLVBIWSBmdW5jdGlvbmFsaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgcGFydCBvZiB0aGUgQ2hlbHNpbyAxMEdiIEV0aGVybmV0IERyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzICAgICAgICoKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyAgICoKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgICAgKgorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogaHR0cDovL3d3dy5jaGVsc2lvLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIE1haW50YWluZXJzOiBtYWludGFpbmVyc0BjaGVsc2lvLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBBdXRob3JzOiBQTUMvU0lFUlJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DWEdCX1NVTkkxeDEwR0VYUF9SRUdTX0hfCisjZGVmaW5lIF9DWEdCX1NVTkkxeDEwR0VYUF9SRUdTX0hfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogUy9VTkktMXgxMEdFLVhQIFJFR0lTVEVSIEFERFJFU1MgTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJlZmVyIHRvIHRoZSBSZWdpc3RlciBCaXQgTWFza3MgYmVsbG93IGZvciB0aGUgbmFtaW5nIG9mIGVhY2ggcmVnaXN0ZXIgYW5kICovCisvKiB0byB0aGUgUy9VTkktMXgxMEdFLVhQIERhdGEgU2hlZXQgZm9yIHRoZSBzaWduaWZpY2F0aW9uIG9mIGVhY2ggYml0ICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0RFVklDRV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01BU1RFUl9JTlRFUlJVUFRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0dMT0JBTF9JTlRFUlJVUFRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1NFUkRFU18zMTI1X0lOVEVSUlVQVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgIDB4MDEwMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1NFUkRFU18zMTI1X0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgIDB4MDEwNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfQ09ORklHXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA0MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfQ09ORklHXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA0MgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA0MworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfTUFYX0ZSQU1FX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA0NQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfU0FfMTVfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA0NgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfU0FfMzFfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA0NworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfU0FfNDdfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA0OAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfRVhBQ1RfTUFUQ0hfQUREUl8xX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MjA0RAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfRVhBQ1RfTUFUQ0hfQUREUl8xX01JRCAgICAgICAgICAgICAgICAgICAgIDB4MjA0RQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfRVhBQ1RfTUFUQ0hfQUREUl8xX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MjA0RgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfTVVMVElDQVNUX0hBU0hfTE9XICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA2QQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfTVVMVElDQVNUX0hBU0hfTUlETE9XICAgICAgICAgICAgICAgICAgICAgIDB4MjA2QgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfTVVMVElDQVNUX0hBU0hfTUlESElHSCAgICAgICAgICAgICAgICAgICAgIDB4MjA2QworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfTVVMVElDQVNUX0hBU0hfSElHSCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA2RAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfQUREUkVTU19GSUxURVJfQ09OVFJPTF8wICAgICAgICAgICAgICAgICAgIDB4MjA2RQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYWEdfQUREUkVTU19GSUxURVJfQ09OVFJPTF8yICAgICAgICAgICAgICAgICAgIDB4MjA3MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl9JTlRFUlJVUFRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4OAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl9JTlRFUlJVUFRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4OQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl9ESUFHX0lOVEVSUlVQVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4QgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hSRl9ESUFHX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4QworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYT0FNX0lOVEVSUlVQVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjBDNworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1JYT0FNX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjBDOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfUk9MTE9WRVJfMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfUk9MTE9WRVJfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfUk9MTE9WRVJfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfUk9MTE9WRVJfMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0lOVEVSUlVQVF9NQVNLXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwNQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0lOVEVSUlVQVF9NQVNLXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwNgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0lOVEVSUlVQVF9NQVNLXzIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwNworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0lOVEVSUlVQVF9NQVNLXzMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjExMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjExNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfNF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEyMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfNV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEyNAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfNl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEyOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfOF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEzMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMTBfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEzOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMTFfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEzQworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMTJfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjE0MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMTNfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjE0NAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMTVfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjE0QworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMTZfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjE1MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMTdfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjE1NAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMThfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjE1OAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMzNfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjE5NAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMzVfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjE5QworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMzZfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjFBMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMzhfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjFBOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfNDBfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjFCMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfNDJfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjFCOAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfNDNfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjFCQworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0lGTFhfRklGT19PVkVSRkxPV19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIDB4MjIwOQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0lGTFhfRklGT19PVkVSRkxPV19JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgIDB4MjIwQQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNE9EUF9JTlRFUlJVUFRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjI4MgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNE9EUF9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjI4MworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElPX0xPQ0tfREVURUNUX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMwMAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElPX0xPQ0tfREVURUNUX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMwMQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElPX0xPQ0tfREVURUNUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMwMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYWEdfQ09ORklHXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA0MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYWEdfQ09ORklHXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA0MgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYWEdfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA0MworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYWEdfTUFYX0ZSQU1FX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA0NQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYWEdfU0FfMTVfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA0NworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYWEdfU0FfMzFfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA0OAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYWEdfU0FfNDdfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA0OQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hURUZfSU5URVJSVVBUX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA4NAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1hURUZfSU5URVJSVVBUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA4NQorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX0lOVEVSUlVQVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDNgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1RYT0FNX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzBDNworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0VGTFhfRklGT19PVkVSRkxPV19FUlJPUl9FTkFCTEUgICAgICAgICAgICAgICAgIDB4MzIwQworI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX0VGTFhfRklGT19PVkVSRkxPV19FUlJPUl9JTkRJQ0FUSU9OICAgICAgICAgICAgIDB4MzIwRAorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElEVV9JTlRFUlJVUFRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzI4MgorI2RlZmluZSBTVU5JMXgxMEdFWFBfUkVHX1BMNElEVV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzI4MworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgIC0tIEVuZCByZWdpc3RlciBvZmZzZXQgZGVmaW5pdGlvbnMgLS0gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogU1VOSS0xeDEwR0UtWFAgUkVHSVNURVIgQklUIE1BU0tTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDAwMDQ6IFMvVU5JLTF4MTBHRS1YUCBEZXZpY2UgU3RhdHVzCisgKiAgICBCaXQgOSBUT1BfU1hSQV9FWFBJUkVECisgKiAgICBCaXQgOCBUT1BfTURJT19CVVNZCisgKiAgICBCaXQgNyBUT1BfRFRSQgorICogICAgQml0IDYgVE9QX0VYUElSRUQKKyAqICAgIEJpdCA1IFRPUF9QQVVTRUQKKyAqICAgIEJpdCA0IFRPUF9QTDRfSURfRE9PTAorICogICAgQml0IDMgVE9QX1BMNF9JU19ET09MCisgKiAgICBCaXQgMiBUT1BfUEw0X0lEX1JPT0wKKyAqICAgIEJpdCAxIFRPUF9QTDRfSVNfUk9PTAorICogICAgQml0IDAgVE9QX1BMNF9PVVRfUk9PTAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfU1hSQV9FWFBJUkVEICAweDAyMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfRVhQSVJFRCAgICAgICAweDAwNDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfUEw0X0lEX0RPT0wgICAweDAwMTAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfUEw0X0lTX0RPT0wgICAweDAwMDgKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfUEw0X0lEX1JPT0wgICAweDAwMDQKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfUEw0X0lTX1JPT0wgICAweDAwMDIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UT1BfUEw0X09VVF9ST09MICAweDAwMDEKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDAwMEU6UE0zMzkzIEdsb2JhbCBpbnRlcnJ1cHQgZW5hYmxlCisgKiAgICBCaXQgMTUgVE9QX0lOVEUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVE9QX0lOVEUgIDB4ODAwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjA0MDogUlhYRyBDb25maWd1cmF0aW9uIDEKKyAqICAgIEJpdCAxNSAgUlhYR19SWEVOCisgKiAgICBCaXQgMTQgIFJYWEdfUk9DRgorICogICAgQml0IDEzICBSWFhHX1BBRF9TVFJJUAorICogICAgQml0IDEwICBSWFhHX1BVUkVQCisgKiAgICBCaXQgOSAgIFJYWEdfTE9OR1AKKyAqICAgIEJpdCA4ICAgUlhYR19QQVJGCisgKiAgICBCaXQgNyAgIFJYWEdfRkxDSEsKKyAqICAgIEJpdCA1ICAgUlhYR19QQVNTX0NUUkwKKyAqICAgIEJpdCAzICAgUlhYR19DUkNfU1RSSVAKKyAqICAgIEJpdCAyLTAgUlhYR19NSUZHCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfUlhFTiAgICAgICAweDgwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19SWFhHX1BVUkVQICAgICAgMHgwNDAwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfUlhYR19GTENISyAgICAgIDB4MDA4MAorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfQ1JDX1NUUklQICAweDAwMDgKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciAweDIwNzA6IFJYWEcgQWRkcmVzcyBGaWx0ZXIgQ29udHJvbCAyCisgKiAgICBCaXQgMSBSWFhHX1BNT0RFCisgKiAgICBCaXQgMCBSWFhHX01IQVNIX0VOCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfUE1PREUgICAgIDB4MDAwMgorI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX1JYWEdfTUhBU0hfRU4gIDB4MDAwMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ2lzdGVyIDB4MjEwMDogTVNUQVQgQ29udHJvbAorICogICAgQml0IDIgTVNUQVRfV1JJVEUKKyAqICAgIEJpdCAxIE1TVEFUX0NMRUFSCisgKiAgICBCaXQgMCBNU1RBVF9TTkFQCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVU5JMXgxMEdFWFBfQklUTVNLX01TVEFUX0NMRUFSICAweDAwMDIKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19NU1RBVF9TTkFQICAgMHgwMDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVnaXN0ZXIgMHgzMDQwOiBUWFhHIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMQorICogICAgQml0IDE1ICAgVFhYR19UWEVOMAorICogICAgQml0IDEzICAgVFhYR19IT1NUUEFVU0UKKyAqICAgIEJpdCAxMi03IFRYWEdfSVBHVAorICogICAgQml0IDUgICAgVFhYR18zMkJJVF9BTElHTgorICogICAgQml0IDQgICAgVFhYR19DUkNFTgorICogICAgQml0IDMgICAgVFhYR19GQ1RYCisgKiAgICBCaXQgMiAgICBUWFhHX0ZDUlgKKyAqICAgIEJpdCAxICAgIFRYWEdfUEFERU4KKyAqICAgIEJpdCAwICAgIFRYWEdfU1BSRQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE1TS19UWFhHX1RYRU4wICAgICAgICAweDgwMDAKKyNkZWZpbmUgU1VOSTF4MTBHRVhQX0JJVE9GRl9UWFhHX0lQR1QgICAgICAgICA3CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR18zMkJJVF9BTElHTiAgMHgwMDIwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR19DUkNFTiAgICAgICAgMHgwMDEwCisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR19GQ1RYICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR19GQ1JYICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFNVTkkxeDEwR0VYUF9CSVRNU0tfVFhYR19QQURFTiAgICAgICAgMHgwMDAyCisKKyNlbmRpZiAvKiBfQ1hHQl9TVU5JMXgxMEdFWFBfUkVHU19IXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCmluZGV4IDQ0MjY3MDguLmI2OGI5Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCisrKyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCkBAIC0zODQsOCArMzg0LDggQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmV0d29ya190cl9jdHJsX3NoYWRvdyA9IDA7CiAKIC8qIE5ldHdvcmsgc3BlZWQgaW5kaWNhdGlvbi4gKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzcGVlZF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGNsZWFyX2xlZF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihzcGVlZF90aW1lciwgTlVMTCwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGNsZWFyX2xlZF90aW1lciwgTlVMTCwgMCwgMCk7CiBzdGF0aWMgaW50IGN1cnJlbnRfc3BlZWQ7IC8qIFNwZWVkIHJlYWQgZnJvbSB0cmFuc2NlaXZlciAqLwogc3RhdGljIGludCBjdXJyZW50X3NwZWVkX3NlbGVjdGlvbjsgLyogU3BlZWQgc2VsZWN0ZWQgYnkgdXNlciAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGVkX25leHRfdGltZTsKQEAgLTM5Myw3ICszOTMsNyBAQAogc3RhdGljIGludCByeF9xdWV1ZV9sZW47CiAKIC8qIER1cGxleCAqLwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGR1cGxleF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihkdXBsZXhfdGltZXIsIE5VTEwsIDAsIDApOwogc3RhdGljIGludCBmdWxsX2R1cGxleDsKIHN0YXRpYyBlbnVtIGR1cGxleCBjdXJyZW50X2R1cGxleDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3M4OXgwLmMgYi9kcml2ZXJzL25ldC9jczg5eDAuYwppbmRleCBiNzgwMzA3Li5jZGMwN2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jczg5eDAuYworKysgYi9kcml2ZXJzL25ldC9jczg5eDAuYwpAQCAtMjQ3LDYgKzI0Nyw5IEBACiBzdGF0aWMgaW50IGdldF9lZXByb21fY2tzdW0oaW50IG9mZiwgaW50IGxlbiwgaW50ICpidWZmZXIpOwogc3RhdGljIGludCBzZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CiBzdGF0aWMgdm9pZCBjb3VudF9yeF9lcnJvcnMoaW50IHN0YXR1cywgc3RydWN0IG5ldF9sb2NhbCAqbHApOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBuZXRfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCiAjaWYgQUxMT1dfRE1BCiBzdGF0aWMgdm9pZCBnZXRfZG1hX2NoYW5uZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCByZWxlYXNlX2RtYV9idWZmKHN0cnVjdCBuZXRfbG9jYWwgKmxwKTsKQEAgLTQwNSw2ICs0MDgsMTkgQEAKIAlyZXR1cm4gLTE7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoKKyAqIFBvbGxpbmcgcmVjZWl2ZSAtIHVzZWQgYnkgbmV0Y29uc29sZSBhbmQgb3RoZXIgZGlhZ25vc3RpYyB0b29scworICogdG8gYWxsb3cgbmV0d29yayBpL28gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICovCitzdGF0aWMgdm9pZCBuZXRfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCW5ldF9pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKwogLyogVGhpcyBpcyB0aGUgcmVhbCBwcm9iZSByb3V0aW5lLiAgTGludXggaGFzIGEgaGlzdG9yeSBvZiBmcmllbmRseSBkZXZpY2UKICAgIHByb2JlcyBvbiB0aGUgSVNBIGJ1cy4gIEEgZ29vZCBkZXZpY2UgcHJvYmVzIGF2b2lkcyBkb2luZyB3cml0ZXMsIGFuZAogICAgdmVyaWZpZXMgdGhhdCB0aGUgY29ycmVjdCBkZXZpY2UgZXhpc3RzIGFuZCBmdW5jdGlvbnMuCkBAIC03NjAsNiArNzc2LDkgQEAKIAlkZXYtPmdldF9zdGF0cwkJPSBuZXRfZ2V0X3N0YXRzOwogCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0OwogCWRldi0+c2V0X21hY19hZGRyZXNzIAk9IHNldF9tYWNfYWRkcmVzczsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyCT0gbmV0X3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgogCiAJcHJpbnRrKCJcbiIpOwogCWlmIChuZXRfZGVidWcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbTkwMDAuYyBiL2RyaXZlcnMvbmV0L2RtOTAwMC5jCmluZGV4IDY0NDBhODkuLmU1NGZjMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RtOTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2RtOTAwMC5jCkBAIC0xMTQwLDcgKzExNDAsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1kbTkwMDBfZHJ2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgc3RhdGUsIHUzMiBsZXZlbCkKK2RtOTAwMF9kcnZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAuYyBiL2RyaXZlcnMvbmV0L2UxMDAuYwppbmRleCBkMGZhMjQ0Li4yNWNjMjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMC5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAKLSAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCkBAIC0xNTYsNyArMTU2LDcgQEAKIAogI2RlZmluZSBEUlZfTkFNRQkJImUxMDAiCiAjZGVmaW5lIERSVl9FWFQJCSItTkFQSSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JCSIzLjQuOC1rMiJEUlZfRVhUCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMy40LjE0LWsyIkRSVl9FWFQKICNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCQkiSW50ZWwoUikgUFJPLzEwMCBOZXR3b3JrIERyaXZlciIKICNkZWZpbmUgRFJWX0NPUFlSSUdIVAkJIkNvcHlyaWdodChjKSAxOTk5LTIwMDUgSW50ZWwgQ29ycG9yYXRpb24iCiAjZGVmaW5lIFBGWAkJCURSVl9OQU1FICI6ICIKQEAgLTc4NSw2ICs3ODUsNyBAQAogfQogCiAjZGVmaW5lIEUxMDBfV0FJVF9TQ0JfVElNRU9VVCAyMDAwMCAvKiB3ZSBtaWdodCBoYXZlIHRvIHdhaXQgMTAwbXMhISEgKi8KKyNkZWZpbmUgRTEwMF9XQUlUX1NDQl9GQVNUIDIwICAgICAgIC8qIGRlbGF5IGxpa2UgdGhlIG9sZCBjb2RlICovCiBzdGF0aWMgaW5saW5lIGludCBlMTAwX2V4ZWNfY21kKHN0cnVjdCBuaWMgKm5pYywgdTggY21kLCBkbWFfYWRkcl90IGRtYV9hZGRyKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC03OTgsNyArNzk5LDcgQEAKIAkJaWYobGlrZWx5KCFyZWFkYigmbmljLT5jc3ItPnNjYi5jbWRfbG8pKSkKIAkJCWJyZWFrOwogCQljcHVfcmVsYXgoKTsKLQkJaWYodW5saWtlbHkoaSA+IChFMTAwX1dBSVRfU0NCX1RJTUVPVVQgPj4gMSkpKQorCQlpZih1bmxpa2VseShpID4gRTEwMF9XQUlUX1NDQl9GQVNUKSkKIAkJCXVkZWxheSg1KTsKIAl9CiAJaWYodW5saWtlbHkoaSA9PSBFMTAwX1dBSVRfU0NCX1RJTUVPVVQpKSB7CkBAIC05MDIsOCArOTAzLDggQEAKIAogc3RhdGljIHZvaWQgZTEwMF9nZXRfZGVmYXVsdHMoc3RydWN0IG5pYyAqbmljKQogewotCXN0cnVjdCBwYXJhbV9yYW5nZSByZmRzID0geyAubWluID0gMTYsIC5tYXggPSAyNTYsIC5jb3VudCA9IDY0IH07Ci0Jc3RydWN0IHBhcmFtX3JhbmdlIGNicyAgPSB7IC5taW4gPSA2NCwgLm1heCA9IDI1NiwgLmNvdW50ID0gNjQgfTsKKwlzdHJ1Y3QgcGFyYW1fcmFuZ2UgcmZkcyA9IHsgLm1pbiA9IDE2LCAubWF4ID0gMjU2LCAuY291bnQgPSAyNTYgfTsKKwlzdHJ1Y3QgcGFyYW1fcmFuZ2UgY2JzICA9IHsgLm1pbiA9IDY0LCAubWF4ID0gMjU2LCAuY291bnQgPSAxMjggfTsKIAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG5pYy0+cGRldiwgUENJX1JFVklTSU9OX0lELCAmbmljLT5yZXZfaWQpOwogCS8qIE1BQyB0eXBlIGlzIGVuY29kZWQgYXMgcmV2IElEOyBleGNlcHRpb246IElDSCBpcyB0cmVhdGVkIGFzIDgyNTU5ICovCkBAIC0xMDA2LDI1ICsxMDA3LDIxMyBAQAogCQljWzE2XSwgY1sxN10sIGNbMThdLCBjWzE5XSwgY1syMF0sIGNbMjFdLCBjWzIyXSwgY1syM10pOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgTWljcm8gY29kZSBmb3IgODA4NjoxMjI5IFJldiA4ICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICBQYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgRDEwMU0gQi1zdGVwICAqLworI2RlZmluZSBEMTAxTV9DUFVTQVZFUl9USU1FUl9EV09SRAkJNzgKKyNkZWZpbmUgRDEwMU1fQ1BVU0FWRVJfQlVORExFX0RXT1JECQk2NQorI2RlZmluZSBEMTAxTV9DUFVTQVZFUl9NSU5fU0laRV9EV09SRAkJMTI2CisKKyNkZWZpbmUgRDEwMU1fQl9SQ1ZCVU5ETEVfVUNPREUgXAore1wKKzB4MDA1NTAyMTUsIDB4RkZGRjA0MzcsIDB4RkZGRkZGRkYsIDB4MDZBNzA3ODksIDB4RkZGRkZGRkYsIDB4MDU1OEZGRkYsIFwKKzB4MDAwQzAwMDEsIDB4MDAxMDEzMTIsIDB4MDAwQzAwMDgsIDB4MDAzODAyMTYsIFwKKzB4MDAxMDAwOUMsIDB4MDAyMDQwNTYsIDB4MDAyMzgwQ0MsIDB4MDAzODAwNTYsIFwKKzB4MDAxMDAwOUMsIDB4MDAyNDRDMEIsIDB4MDAwMDA4MDAsIDB4MDAxMjQ4MTgsIFwKKzB4MDAzODA0MzgsIDB4MDAwMDAwMDAsIDB4MDAxNDAwMDAsIDB4MDAzODA1NTUsIFwKKzB4MDAzMDgwMDAsIDB4MDAxMDA2NjIsIDB4MDAxMDA1NjEsIDB4MDAwRTA0MDgsIFwKKzB4MDAxMzQ4NjEsIDB4MDAwQzAwMDIsIDB4MDAxMDMwOTMsIDB4MDAzMDgwMDAsIFwKKzB4MDAxMDA2MjQsIDB4MDAxMDA1NjEsIDB4MDAwRTA0MDgsIDB4MDAxMDA4NjEsIFwKKzB4MDAwQzAwN0UsIDB4MDAyMjJDMjEsIDB4MDAwQzAwMDIsIDB4MDAxMDMwOTMsIFwKKzB4MDAzODBDN0EsIDB4MDAwODAwMDAsIDB4MDAxMDMwOTAsIDB4MDAzODBDN0EsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAxMDAwOUMsIDB4MDAyNDRDMkQsIDB4MDAwMTAwMDQsIDB4MDAwNDEwMDAsIFwKKzB4MDAzQTA0MzcsIDB4MDAwNDQwMTAsIDB4MDAzODA3OEEsIDB4MDAwMDAwMDAsIFwKKzB4MDAxMDAwOTksIDB4MDAyMDZDN0EsIDB4MDAxMDAwOUMsIDB4MDAyNDRDNDgsIFwKKzB4MDAxMzA4MjQsIDB4MDAwQzAwMDEsIDB4MDAxMDEyMTMsIDB4MDAyNjBDNzUsIFwKKzB4MDAwNDEwMDAsIDB4MDAwMTAwMDQsIDB4MDAxMzA4MjYsIDB4MDAwQzAwMDYsIFwKKzB4MDAyMjA2QTgsIDB4MDAxM0M5MjYsIDB4MDAxMDEzMTMsIDB4MDAzODA2QTgsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwODA2MDAsIDB4MDAxMDFCMTAsIDB4MDAwNTAwMDQsIDB4MDAxMDA4MjYsIFwKKzB4MDAxMDEyMTAsIDB4MDAzODBDMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAyMTE1NUIsIDB4MDAxMDAwOTksIDB4MDAyMDY1NTksIDB4MDAxMDAwOUMsIFwKKzB4MDAyNDQ1NTksIDB4MDAxMzA4MzYsIDB4MDAwQzAwMDAsIDB4MDAyMjBDNjIsIFwKKzB4MDAwQzAwMDEsIDB4MDAxMDFCMTMsIDB4MDAyMjlDMEUsIDB4MDAyMTBDMEUsIFwKKzB4MDAyMjZDMEUsIDB4MDAyMTZDMEUsIDB4MDAyMkZDMEUsIDB4MDAyMTVDMEUsIFwKKzB4MDAyMTRDMEUsIDB4MDAzODA1NTUsIDB4MDAwMTAwMDQsIDB4MDAwNDEwMDAsIFwKKzB4MDAyNzhDNjcsIDB4MDAwNDA4MDAsIDB4MDAwMTgxMDAsIDB4MDAzQTA0MzcsIFwKKzB4MDAxMzA4MjYsIDB4MDAwQzAwMDEsIDB4MDAyMjA1NTksIDB4MDAxMDEzMTMsIFwKKzB4MDAzODA1NTksIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAxMzA4MzEsIDB4MDAxMDA5MEIsIDB4MDAxMjQ4MTMsIFwKKzB4MDAwQ0ZGODAsIDB4MDAyNjA2QUIsIDB4MDAwNDEwMDAsIDB4MDAwMTAwMDQsIFwKKzB4MDAzODA2QTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIE1pY3JvIGNvZGUgZm9yIDgwODY6MTIyOSBSZXYgOSAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgUGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIEQxMDFTICAqLworI2RlZmluZSBEMTAxU19DUFVTQVZFUl9USU1FUl9EV09SRAkJNzgKKyNkZWZpbmUgRDEwMVNfQ1BVU0FWRVJfQlVORExFX0RXT1JECQk2NworI2RlZmluZSBEMTAxU19DUFVTQVZFUl9NSU5fU0laRV9EV09SRAkJMTI4CisKKyNkZWZpbmUgRDEwMVNfUkNWQlVORExFX1VDT0RFIFwKK3tcCisweDAwNTUwMjQyLCAweEZGRkYwNDdFLCAweEZGRkZGRkZGLCAweDA2RkYwODE4LCAweEZGRkZGRkZGLCAweDA1QTZGRkZGLCBcCisweDAwMEMwMDAxLCAweDAwMTAxMzEyLCAweDAwMEMwMDA4LCAweDAwMzgwMjQzLCBcCisweDAwMTAwMDlDLCAweDAwMjA0MDU2LCAweDAwMjM4MEQwLCAweDAwMzgwMDU2LCBcCisweDAwMTAwMDlDLCAweDAwMjQ0RjhCLCAweDAwMDAwODAwLCAweDAwMTI0ODE4LCBcCisweDAwMzgwNDdGLCAweDAwMDAwMDAwLCAweDAwMTQwMDAwLCAweDAwMzgwNUEzLCBcCisweDAwMzA4MDAwLCAweDAwMTAwNjEwLCAweDAwMTAwNTYxLCAweDAwMEUwNDA4LCBcCisweDAwMTM0ODYxLCAweDAwMEMwMDAyLCAweDAwMTAzMDkzLCAweDAwMzA4MDAwLCBcCisweDAwMTAwNjI0LCAweDAwMTAwNTYxLCAweDAwMEUwNDA4LCAweDAwMTAwODYxLCBcCisweDAwMEMwMDdFLCAweDAwMjIyRkExLCAweDAwMEMwMDAyLCAweDAwMTAzMDkzLCBcCisweDAwMzgwRjkwLCAweDAwMDgwMDAwLCAweDAwMTAzMDkwLCAweDAwMzgwRjkwLCBcCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCisweDAwMTAwMDlDLCAweDAwMjQ0RkFELCAweDAwMDEwMDA0LCAweDAwMDQxMDAwLCBcCisweDAwM0EwNDdFLCAweDAwMDQ0MDEwLCAweDAwMzgwODE5LCAweDAwMDAwMDAwLCBcCisweDAwMTAwMDk5LCAweDAwMjA2RkZELCAweDAwMTAwMDlBLCAweDAwMjBBRkZELCBcCisweDAwMTAwMDlDLCAweDAwMjQ0RkM4LCAweDAwMTMwODI0LCAweDAwMEMwMDAxLCBcCisweDAwMTAxMjEzLCAweDAwMjYwRkY3LCAweDAwMDQxMDAwLCAweDAwMDEwMDA0LCBcCisweDAwMTMwODI2LCAweDAwMEMwMDA2LCAweDAwMjIwNzAwLCAweDAwMTNDOTI2LCBcCisweDAwMTAxMzEzLCAweDAwMzgwNzAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCisweDAwMDgwNjAwLCAweDAwMTAxQjEwLCAweDAwMDUwMDA0LCAweDAwMTAwODI2LCBcCisweDAwMTAxMjEwLCAweDAwMzgwRkI2LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCisweDAwMjExNUE5LCAweDAwMTAwMDk5LCAweDAwMjA2NUE3LCAweDAwMTAwMDlBLCBcCisweDAwMjBBNUE3LCAweDAwMTAwMDlDLCAweDAwMjQ0NUE3LCAweDAwMTMwODM2LCBcCisweDAwMEMwMDAwLCAweDAwMjIwRkU0LCAweDAwMEMwMDAxLCAweDAwMTAxQjEzLCBcCisweDAwMjI5RjhFLCAweDAwMjEwRjhFLCAweDAwMjI2RjhFLCAweDAwMjE2RjhFLCBcCisweDAwMjJGRjhFLCAweDAwMjE1RjhFLCAweDAwMjE0RjhFLCAweDAwMzgwNUEzLCBcCisweDAwMDEwMDA0LCAweDAwMDQxMDAwLCAweDAwMjc4RkU5LCAweDAwMDQwODAwLCBcCisweDAwMDE4MTAwLCAweDAwM0EwNDdFLCAweDAwMTMwODI2LCAweDAwMEMwMDAxLCBcCisweDAwMjIwNUE3LCAweDAwMTAxMzEzLCAweDAwMzgwNUE3LCAweDAwMDAwMDAwLCBcCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMTMwODMxLCBcCisweDAwMTAwOTBCLCAweDAwMTI0ODEzLCAweDAwMENGRjgwLCAweDAwMjYwNzAzLCBcCisweDAwMDQxMDAwLCAweDAwMDEwMDA0LCAweDAwMzgwNzAwICBcCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBNaWNybyBjb2RlIGZvciB0aGUgODA4NjoxMjI5IFJldiBGLzEwICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogIFBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSBEMTAyIEUtc3RlcCAgKi8KKyNkZWZpbmUgRDEwMl9FX0NQVVNBVkVSX1RJTUVSX0RXT1JECQk0MgorI2RlZmluZSBEMTAyX0VfQ1BVU0FWRVJfQlVORExFX0RXT1JECQk1NAorI2RlZmluZSBEMTAyX0VfQ1BVU0FWRVJfTUlOX1NJWkVfRFdPUkQJCTQ2CisKKyNkZWZpbmUgICAgIEQxMDJfRV9SQ1ZCVU5ETEVfVUNPREUgXAore1wKKzB4MDA3RDAyOEYsIDB4MEU0MjA0RjksIDB4MTRFRDBDODUsIDB4MTRGQTE0RTksIDB4MEVGNzBFMzYsIDB4MUZGRjFGRkYsIFwKKzB4MDBFMDE0QjksIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDBFMDE0QkQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDBFMDE0RDUsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDBFMDE0QzEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDBFMDE0QzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAyMDA2MDAsIDB4MDBFMDE0RUUsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAzMEZGODAsIDB4MDA5NDBFNDYsIDB4MDAwMzgyMDAsIDB4MDAxMDIwMDAsIFwKKzB4MDBFMDBFNDMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAzMDAwMDYsIDB4MDBFMDE0RkIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDA5MDZFNDEsIDB4MDA4MDBFM0MsIDB4MDBFMDBFMzksIDB4MDAwMDAwMDAsIFwKKzB4MDA5MDZFRkQsIDB4MDA5MDBFRkQsIDB4MDBFMDBFRjgsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKK30KKwogc3RhdGljIHZvaWQgZTEwMF9sb2FkX3Vjb2RlKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGNiICpjYiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpbnQgaTsKLQlzdGF0aWMgY29uc3QgdTMyIHVjb2RlW1VDT0RFX1NJWkVdID0gewotCQkvKiBORlMgcGFja2V0cyBhcmUgbWlzaW50ZXJwcmV0ZWQgYXMgVENPIHBhY2tldHMgYW5kCi0JCSAqIGluY29ycmVjdGx5IHJvdXRlZCB0byB0aGUgQk1DIG92ZXIgU01CdXMuICBUaGlzCi0JCSAqIG1pY3JvY29kZSBwYXRjaCBjaGVja3MgdGhlIGZyYWdtZW50ZWQgSVAgYml0IGluIHRoZQotCQkgKiBORlMvVURQIGhlYWRlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIE5GUyBhbmQgVENPLiAqLwotCQkweDBFRjcwRTM2LCAweDFGRkYxRkZGLCAweDFGRkYxRkZGLCAweDFGRkYxRkZGLCAweDFGRkYxRkZGLAotCQkweDFGRkYxRkZGLCAweDAwOTA2RTQxLCAweDAwODAwRTNDLCAweDAwRTAwRTM5LCAweDAwMDAwMDAwLAotCQkweDAwOTA2RUZELCAweDAwOTAwRUZELAkweDAwRTAwRUY4LAotCX07CisvKiAqSU5ERU5ULU9GRiogKi8KKwlzdGF0aWMgc3RydWN0IHsKKwkJdTMyIHVjb2RlW1VDT0RFX1NJWkUgKyAxXTsKKwkJdTggbWFjOworCQl1OCB0aW1lcl9kd29yZDsKKwkJdTggYnVuZGxlX2R3b3JkOworCQl1OCBtaW5fc2l6ZV9kd29yZDsKKwl9IHVjb2RlX29wdHNbXSA9IHsKKwkJeyBEMTAxTV9CX1JDVkJVTkRMRV9VQ09ERSwKKwkJICBtYWNfODI1NTlfRDEwMU0sCisJCSAgRDEwMU1fQ1BVU0FWRVJfVElNRVJfRFdPUkQsCisJCSAgRDEwMU1fQ1BVU0FWRVJfQlVORExFX0RXT1JELAorCQkgIEQxMDFNX0NQVVNBVkVSX01JTl9TSVpFX0RXT1JEIH0sCisJCXsgRDEwMVNfUkNWQlVORExFX1VDT0RFLAorCQkgIG1hY184MjU1OV9EMTAxUywKKwkJICBEMTAxU19DUFVTQVZFUl9USU1FUl9EV09SRCwKKwkJICBEMTAxU19DUFVTQVZFUl9CVU5ETEVfRFdPUkQsCisJCSAgRDEwMVNfQ1BVU0FWRVJfTUlOX1NJWkVfRFdPUkQgfSwKKwkJeyBEMTAyX0VfUkNWQlVORExFX1VDT0RFLAorCQkgIG1hY184MjU1MV9GLAorCQkgIEQxMDJfRV9DUFVTQVZFUl9USU1FUl9EV09SRCwKKwkJICBEMTAyX0VfQ1BVU0FWRVJfQlVORExFX0RXT1JELAorCQkgIEQxMDJfRV9DUFVTQVZFUl9NSU5fU0laRV9EV09SRCB9LAorCQl7IEQxMDJfRV9SQ1ZCVU5ETEVfVUNPREUsCisJCSAgbWFjXzgyNTUxXzEwLAorCQkgIEQxMDJfRV9DUFVTQVZFUl9USU1FUl9EV09SRCwKKwkJICBEMTAyX0VfQ1BVU0FWRVJfQlVORExFX0RXT1JELAorCQkgIEQxMDJfRV9DUFVTQVZFUl9NSU5fU0laRV9EV09SRCB9LAorCQl7IHswfSwgMCwgMCwgMCwgMH0KKwl9LCAqb3B0czsKKy8qICpJTkRFTlQtT04qICovCiAKLQlpZihuaWMtPm1hYyA9PSBtYWNfODI1NTFfRiB8fCBuaWMtPm1hYyA9PSBtYWNfODI1NTFfMTApIHsKLQkJZm9yKGkgPSAwOyBpIDwgVUNPREVfU0laRTsgaSsrKQotCQkJY2ItPnUudWNvZGVbaV0gPSBjcHVfdG9fbGUzMih1Y29kZVtpXSk7Ci0JCWNiLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY2JfdWNvZGUpOwotCX0gZWxzZQotCQljYi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNiX25vcCk7CisjZGVmaW5lIEJVTkRMRVNNQUxMIDEKKyNkZWZpbmUgQlVORExFTUFYIDUwCisjZGVmaW5lIElOVERFTEFZIDE1MDAwCisKKwlvcHRzID0gdWNvZGVfb3B0czsKKworCS8qIGRvIG5vdCBsb2FkIHUtY29kZSBmb3IgSUNIIGRldmljZXMgKi8KKwlpZiAobmljLT5mbGFncyAmIGljaCkKKwkJcmV0dXJuOworCisJLyogU2VhcmNoIGZvciB1Y29kZSBtYXRjaCBhZ2FpbnN0IGgvdyByZXZfaWQgKi8KKwl3aGlsZSAob3B0cy0+bWFjKSB7CisJCWlmIChuaWMtPm1hYyA9PSBvcHRzLT5tYWMpIHsKKwkJCWludCBpOworCQkJdTMyICp1Y29kZSA9IG9wdHMtPnVjb2RlOworCisJCQkvKiBJbnNlcnQgdXNlci10dW5hYmxlIHNldHRpbmdzICovCisJCQl1Y29kZVtvcHRzLT50aW1lcl9kd29yZF0gJj0gMHhGRkZGMDAwMDsKKwkJCXVjb2RlW29wdHMtPnRpbWVyX2R3b3JkXSB8PQorCQkJCSh1MTYpIElOVERFTEFZOworCQkJdWNvZGVbb3B0cy0+YnVuZGxlX2R3b3JkXSAmPSAweEZGRkYwMDAwOworCQkJdWNvZGVbb3B0cy0+YnVuZGxlX2R3b3JkXSB8PSAodTE2KSBCVU5ETEVNQVg7CisJCQl1Y29kZVtvcHRzLT5taW5fc2l6ZV9kd29yZF0gJj0gMHhGRkZGMDAwMDsKKwkJCXVjb2RlW29wdHMtPm1pbl9zaXplX2R3b3JkXSB8PQorCQkJCShCVU5ETEVTTUFMTCkgPyAgMHhGRkZGIDogMHhGRjgwOworCisJCQlmb3IoaSA9IDA7IGkgPCBVQ09ERV9TSVpFOyBpKyspCisJCQkJY2ItPnUudWNvZGVbaV0gPSBjcHVfdG9fbGUzMih1Y29kZVtpXSk7CisJCQljYi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNiX3Vjb2RlKTsKKwkJCXJldHVybjsKKwkJfQorCQlvcHRzKys7CisJfQorCisJY2ItPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjYl9ub3ApOwogfQogCiBzdGF0aWMgdm9pZCBlMTAwX3NldHVwX2lhYWRkcihzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBjYiAqY2IsCkBAIC0xMzA3LDE0ICsxNDk2LDE1IEBACiB7CiAJY2ItPmNvbW1hbmQgPSBuaWMtPnR4X2NvbW1hbmQ7CiAJLyogaW50ZXJydXB0IGV2ZXJ5IDE2IHBhY2tldHMgcmVnYXJkbGVzcyBvZiBkZWxheSAqLwotCWlmKChuaWMtPmNic19hdmFpbCAmIH4xNSkgPT0gbmljLT5jYnNfYXZhaWwpIGNiLT5jb21tYW5kIHw9IGNiX2k7CisJaWYoKG5pYy0+Y2JzX2F2YWlsICYgfjE1KSA9PSBuaWMtPmNic19hdmFpbCkKKwkJY2ItPmNvbW1hbmQgfD0gY3B1X3RvX2xlMTYoY2JfaSk7CiAJY2ItPnUudGNiLnRiZF9hcnJheSA9IGNiLT5kbWFfYWRkciArIG9mZnNldG9mKHN0cnVjdCBjYiwgdS50Y2IudGJkKTsKIAljYi0+dS50Y2IudGNiX2J5dGVfY291bnQgPSAwOwogCWNiLT51LnRjYi50aHJlc2hvbGQgPSBuaWMtPnR4X3RocmVzaG9sZDsKIAljYi0+dS50Y2IudGJkX2NvdW50ID0gMTsKIAljYi0+dS50Y2IudGJkLmJ1Zl9hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUobmljLT5wZGV2LAogCQlza2ItPmRhdGEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKSk7Ci0JLy8gY2hlY2sgZm9yIG1hcHBpbmcgZmFpbHVyZT8KKwkvKiBjaGVjayBmb3IgbWFwcGluZyBmYWlsdXJlPyAqLwogCWNiLT51LnRjYi50YmQuc2l6ZSA9IGNwdV90b19sZTE2KHNrYi0+bGVuKTsKIH0KIApAQCAtMTUzOSw3ICsxNzI5LDcgQEAKIAkJLyogRG9uJ3QgaW5kaWNhdGUgaWYgaGFyZHdhcmUgaW5kaWNhdGVzIGVycm9ycyAqLwogCQluaWMtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JfSBlbHNlIGlmKGFjdHVhbF9zaXplID4gbmljLT5uZXRkZXYtPm10dSArIFZMQU5fRVRIX0hMRU4pIHsKKwl9IGVsc2UgaWYoYWN0dWFsX3NpemUgPiBFVEhfREFUQV9MRU4gKyBWTEFOX0VUSF9ITEVOKSB7CiAJCS8qIERvbid0IGluZGljYXRlIG92ZXJzaXplZCBmcmFtZXMgKi8KIAkJbmljLT5yeF9vdmVyX2xlbmd0aF9lcnJvcnMrKzsKIAkJbmljLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOwpAQCAtMTcwNiw2ICsxODk2LDcgQEAKIHN0YXRpYyB2b2lkIGUxMDBfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKIAllMTAwX2Rpc2FibGVfaXJxKG5pYyk7CiAJZTEwMF9pbnRyKG5pYy0+cGRldi0+aXJxLCBuZXRkZXYsIE5VTEwpOwogCWUxMDBfdHhfY2xlYW4obmljKTsKQEAgLTIxMDgsNiArMjI5OSw4IEBACiAJfQogCWZvcihpID0gMDsgaSA8IEUxMDBfVEVTVF9MRU47IGkrKykKIAkJdGVzdC0+ZmxhZ3MgfD0gZGF0YVtpXSA/IEVUSF9URVNUX0ZMX0ZBSUxFRCA6IDA7CisKKwltc2xlZXBfaW50ZXJydXB0aWJsZSg0ICogMTAwMCk7CiB9CiAKIHN0YXRpYyBpbnQgZTEwMF9waHlzX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBkYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaCBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKaW5kZXggOTNlOWY4Ny4uNTFjMmIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCkBAIC0xMjcwLDcgKzEyNzAsNyBAQAogCiAvKiBTdHJ1Y3R1cmUgY29udGFpbmluZyB2YXJpYWJsZXMgdXNlZCBieSB0aGUgc2hhcmVkIGNvZGUgKGUxMDAwX2h3LmMpICovCiBzdHJ1Y3QgZTEwMDBfaHcgewotICAgIHVpbnQ4X3QgKmh3X2FkZHI7CisgICAgdWludDhfdCBfX2lvbWVtICpod19hZGRyOwogICAgIHVpbnQ4X3QgKmZsYXNoX2FkZHJlc3M7CiAgICAgZTEwMDBfbWFjX3R5cGUgbWFjX3R5cGU7CiAgICAgZTEwMDBfcGh5X3R5cGUgcGh5X3R5cGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKaW5kZXggOWI1OTZlMC4uN2M4YTBhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwpAQCAtMTYyLDcgKzE2Miw3IEBACiBzdGF0aWMgdm9pZCBlMTAwMF92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCk7CiBzdGF0aWMgdm9pZCBlMTAwMF9yZXN0b3JlX3ZsYW4oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCi1zdGF0aWMgaW50IGUxMDAwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVpbnQzMl90IHN0YXRlKTsKK3N0YXRpYyBpbnQgZTEwMDBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgZTEwMDBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKICNlbmRpZgpAQCAtMzY0Miw3ICszNjQyLDcgQEAKIH0KIAogc3RhdGljIGludAotZTEwMDBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDMyX3Qgc3RhdGUpCitlMTAwMF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CkBAIC0zNzI2LDkgKzM3MjYsNyBAQAogCX0KIAogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQotCXN0YXRlID0gKHN0YXRlID4gMCkgPyAzIDogMDsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHN0YXRlKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzc0MSwxMyArMzczOSwxMyBAQAogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAl1aW50MzJfdCBtYW5jLCByZXRfdmFsLCBzd3NtOwogCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CiAJcmV0X3ZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCi0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIDMsIDApOwotCXBjaV9lbmFibGVfd2FrZShwZGV2LCA0LCAwKTsgLyogNCA9PSBEMyBjb2xkICovCisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7CisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOwogCiAJZTEwMDBfcmVzZXQoYWRhcHRlcik7CiAJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgV1VTLCB+MCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYyBiL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jCmluZGV4IDdkOTM5NDguLmQ2ZWVmZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jCkBAIC0xMzcyLDcgKzEzNzIsNyBAQAogCiAJLyogc3luY2hyb25pemVkIGFnYWluc3Qgb3BlbiA6IHJ0bmxfbG9jaygpIGhlbGQgYnkgY2FsbGVyICovCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQl1OCAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKwkJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKIAkJLyoKIAkJICogSXQgc2VlbXMgdGhhdCB0aGUgbmljIHByZWxvYWRzIHZhbGlkIHJpbmcgZW50cmllcyBpbnRvIGFuCiAJCSAqIGludGVybmFsIGJ1ZmZlci4gVGhlIHByb2NlZHVyZSBmb3IgZmx1c2hpbmcgZXZlcnl0aGluZyBpcwpAQCAtMTQyMyw3ICsxNDIzLDcgQEAKIAogc3RhdGljIHZvaWQgbnZfY29weV9tYWNfdG9faHcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQl1OCAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOwogCXUzMiBtYWNbMl07CiAKIAltYWNbMF0gPSAoZGV2LT5kZXZfYWRkclswXSA8PCAwKSArIChkZXYtPmRldl9hZGRyWzFdIDw8IDgpICsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbWFjaGkuYyBiL2RyaXZlcnMvbmV0L2hhbWFjaGkuYwppbmRleCBkOWRmMWQ5Li5iYzlhM2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1hY2hpLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtYWNoaS5jCkBAIC0yMDQsNiArMjA0LDEwIEBACiAKICNkZWZpbmUgUlVOX0FUKHgpIChqaWZmaWVzICsgKHgpKQogCisjaWZuZGVmIEFERFJMRU4KKyNkZWZpbmUgQUREUkxFTiAzMgorI2VuZGlmCisKIC8qIENvbmRlbnNlZCBidXMrZW5kaWFuIHBvcnRhYmlsaXR5IG9wZXJhdGlvbnMuICovCiAjaWYgQUREUkxFTiA9PSA2NAogI2RlZmluZSBjcHVfdG9fbGVYWChhZGRyKQljcHVfdG9fbGU2NChhZGRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0uYwppbmRleCA0MTIxM2VmLi5mNTJlZTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0uYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0uYwpAQCAtMTcwLDcgKzE3MCw3IEBACiBzdGF0aWMgY2hhciBheDI1X3Rlc3RbN10gPQogeydMJyA8PCAxLCAnSScgPDwgMSwgJ04nIDw8IDEsICdVJyA8PCAxLCAnWCcgPDwgMSwgJyAnIDw8IDEsICcxJyA8PCAxfTsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHlhbV90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUih5YW1fdGltZXIsIE5VTEwsIDAsIDApOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCmluZGV4IDQ2ZTAwMjIuLjZjNzY2ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLCBJUkRBX1VTQl9TUEVFRF9NVFUsCiAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYnVsa19jYWxsYmFjaywgc2VsZik7CiAJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gVVNCX0lSREFfSEVBREVSOwotCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfQVNZTkNfVU5MSU5LOworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSAwOwogCiAJLyogSXJxIGRpc2FibGVkIC0+IEdGUF9BVE9NSUMgKi8KIAlpZiAoKHJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpKSB7CkBAIC00MDEsMTUgKzQwMSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGF0YSwgSVJEQV9TS0JfTUFYX01UVSwKICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWxrX2NhbGxiYWNrLCBza2IpOwogCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHNrYi0+bGVuOwotCS8qIE5vdGUgOiB1bmxpbmsgKm11c3QqIGJlIEFzeW5jaHJvbm91cyBiZWNhdXNlIG9mIHRoZSBjb2RlIGluIAotCSAqIGlyZGFfdXNiX25ldF90aW1lb3V0KCkgLT4gY2FsbCBpbiBpcnEgLSBKZWFuIElJICovCi0JdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9BU1lOQ19VTkxJTks7CiAJLyogVGhpcyBmbGFnIChVUkJfWkVST19QQUNLRVQpIGluZGljYXRlcyB0aGF0IHdoYXQgd2Ugc2VuZCBpcyBub3QKIAkgKiBhIGNvbnRpbnVvdXMgc3RyZWFtIG9mIGRhdGEgYnV0IHNlcGFyYXRlIHBhY2tldHMuCiAJICogSW4gdGhpcyBjYXNlLCB0aGUgVVNCIGxheWVyIHdpbGwgaW5zZXJ0IGFuIGVtcHR5IFVTQiBmcmFtZSAoVEQpCiAJICogYWZ0ZXIgZWFjaCBvZiBvdXIgcGFja2V0cyB0aGF0IGlzIGV4YWN0IG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLgogCSAqIFRoaXMgaXMgaG93IHRoZSBkb25nbGUgd2lsbCBkZXRlY3QgdGhlIGVuZCBvZiBwYWNrZXQgLSBKZWFuIElJICovCi0JdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfWkVST19QQUNLRVQ7CisJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9aRVJPX1BBQ0tFVDsKIAogCS8qIEdlbmVyYXRlIG1pbiB0dXJuIHRpbWUuIEZJWE1FOiBjYW4gd2UgZG8gYmV0dGVyIHRoYW4gdGhpcz8gKi8KIAkvKiBUcnlpbmcgdG8gYSB0dXJuYXJvdW5kIHRpbWUgYXQgdGhpcyBsZXZlbCBpcyB0cnlpbmcgdG8gbWVhc3VyZQpAQCAtNjMwLDggKzYyNyw2IEBACiAJCQkgKiBpbiBjb21wbGV0aW9uIGhhbmRsZXIsIGJlY2F1c2UgdXJiLT5zdGF0dXMgd2lsbAogCQkJICogYmUgLUVOT0VOVC4gV2Ugd2lsbCBmaXggdGhhdCBhdCB0aGUgbmV4dCB3YXRjaGRvZywKIAkJCSAqIGxlYXZpbmcgbW9yZSB0aW1lIHRvIFVTQiB0byByZWNvdmVyLi4uCi0JCQkgKiBBbHNvLCB3ZSBhcmUgaW4gaW50ZXJydXB0LCBzbyB3ZSBuZWVkIHRvIGhhdmUKLQkJCSAqIFVSQl9BU1lOQ19VTkxJTksgdG8gd29yayBwcm9wZXJseS4uLgogCQkJICogSmVhbiBJSSAqLwogCQkJZG9uZSA9IDE7CiAJCQlicmVhazsKQEAgLTEwMDgsOSArMTAwMyw3IEBACiAJCX0KIAl9CiAJLyogQ2FuY2VsIFR4IGFuZCBzcGVlZCBVUkIgLSBuZWVkIHRvIGJlIHN5bmNocm9ub3VzIHRvIGF2b2lkIHJhY2VzICovCi0Jc2VsZi0+dHhfdXJiLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX0FTWU5DX1VOTElOSzsKIAl1c2Jfa2lsbF91cmIoc2VsZi0+dHhfdXJiKTsKLQlzZWxmLT5zcGVlZF91cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfQVNZTkNfVU5MSU5LOwogCXVzYl9raWxsX3VyYihzZWxmLT5zcGVlZF91cmIpOwogCiAJLyogU3RvcCBhbmQgcmVtb3ZlIGluc3RhbmNlIG9mIElyTEFQICovCkBAIC0xNTIxLDkgKzE1MTQsNyBAQAogCQkJdXNiX2tpbGxfdXJiKHNlbGYtPnJ4X3VyYltpXSk7CiAJCS8qIENhbmNlbCBUeCBhbmQgc3BlZWQgVVJCLgogCQkgKiBUb2dnbGUgZmxhZ3MgdG8gbWFrZSBzdXJlIGl0J3Mgc3luY2hyb25vdXMuICovCi0JCXNlbGYtPnR4X3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CiAJCXVzYl9raWxsX3VyYihzZWxmLT50eF91cmIpOwotCQlzZWxmLT5zcGVlZF91cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfQVNZTkNfVU5MSU5LOwogCQl1c2Jfa2lsbF91cmIoc2VsZi0+c3BlZWRfdXJiKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKaW5kZXggMTAxMjVhMS4uZGQ4OWJkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKQEAgLTQsMTAgKzQsMTAgQEAKICAqIERlc2NyaXB0aW9uOiAgIERyaXZlciBmb3IgdGhlIFNNQyBJbmZyYXJlZCBDb21tdW5pY2F0aW9ucyBDb250cm9sbGVyCiAgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAgKiBBdXRob3I6ICAgICAgICBEYW5pZWxlIFBlcmkgKHBlcmlAY3NhaS51bmlwYS5pdCkKLSAqIENyZWF0ZWQgYXQ6ICAgIAotICogTW9kaWZpZWQgYXQ6ICAgCi0gKiBNb2RpZmllZCBieTogICAKLSAqIAorICogQ3JlYXRlZCBhdDoKKyAqIE1vZGlmaWVkIGF0OgorICogTW9kaWZpZWQgYnk6CisgKgogICogICAgIENvcHlyaWdodCAoYykgMjAwMiAgICAgIERhbmllbGUgUGVyaQogICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAyICAgICAgSmVhbiBUb3VycmlsaGVzCkBAIC0xNywyNiArMTcsMjYgQEAKICAqCiAgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAxICAgICAgU3RlZmFuaSBTZWlib2xkCiAgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgRGFnIEJyYXR0bGkKLSAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaG9tYXMgRGF2aXMsIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRob21hcyBEYXZpcywKICAqCiAgKglhbmQgaXJwb3J0LmM6CiAgKgogICogICAgIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCwgMTk5OS0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiAKKyAqCiAgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKICAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCi0gKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCi0gKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogICogICAgIE1BIDAyMTExLTEzMDcgVVNBCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjgsMjQgKzY4LDQyIEBACiAjaW5jbHVkZSAic21zYy1pcmNjMi5oIgogI2luY2x1ZGUgInNtc2Mtc2lvLmgiCiAKKworTU9EVUxFX0FVVEhPUigiRGFuaWVsZSBQZXJpIDxwZXJpQGNzYWkudW5pcGEuaXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNNQyBJckNDIFNJUi9GSVIgY29udHJvbGxlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBpcmNjX2RtYSA9IDI1NTsKK21vZHVsZV9wYXJhbShpcmNjX2RtYSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJjY19kbWEsICJETUEgY2hhbm5lbCIpOworCitzdGF0aWMgaW50IGlyY2NfaXJxID0gMjU1OworbW9kdWxlX3BhcmFtKGlyY2NfaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcmNjX2lycSwgIklSUSBsaW5lIik7CisKK3N0YXRpYyBpbnQgaXJjY19maXI7Cittb2R1bGVfcGFyYW0oaXJjY19maXIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyY2NfZmlyLCAiRklSIEJhc2UgQWRkcmVzcyIpOworCitzdGF0aWMgaW50IGlyY2Nfc2lyOworbW9kdWxlX3BhcmFtKGlyY2Nfc2lyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcmNjX3NpciwgIlNJUiBCYXNlIEFkZHJlc3MiKTsKKworc3RhdGljIGludCBpcmNjX2NmZzsKK21vZHVsZV9wYXJhbShpcmNjX2NmZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJjY19jZmcsICJDb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyIpOworCitzdGF0aWMgaW50IGlyY2NfdHJhbnNjZWl2ZXI7Cittb2R1bGVfcGFyYW0oaXJjY190cmFuc2NlaXZlciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJjY190cmFuc2NlaXZlciwgIlRyYW5zY2VpdmVyIHR5cGUiKTsKKwogLyogVHlwZXMgKi8KIAogc3RydWN0IHNtc2NfdHJhbnNjZWl2ZXIgewogCWNoYXIgKm5hbWU7Ci0Jdm9pZCAoKnNldF9mb3Jfc3BlZWQpKGludCBmaXJfYmFzZSwgdTMyIHNwZWVkKTsJCisJdm9pZCAoKnNldF9mb3Jfc3BlZWQpKGludCBmaXJfYmFzZSwgdTMyIHNwZWVkKTsKIAlpbnQgICgqcHJvYmUpKGludCBmaXJfYmFzZSk7CiB9OwotdHlwZWRlZiBzdHJ1Y3Qgc21zY190cmFuc2NlaXZlciBzbXNjX3RyYW5zY2VpdmVyX3Q7Ci0KLSNpZiAwCi1zdHJ1Y3Qgc21jX2NoaXAgewotCWNoYXIgKm5hbWU7Ci0JdTE2IGZsYWdzOwotCXU4IGRldmlkOwotCXU4IHJldjsKLX07Ci10eXBlZGVmIHN0cnVjdCBzbWNfY2hpcCBzbWNfY2hpcF90OwotI2VuZGlmCiAKIHN0cnVjdCBzbXNjX2NoaXAgewogCWNoYXIgKm5hbWU7CkBAIC05NiwyMCArMTE0LDE4IEBACiAJdTggZGV2aWQ7CiAJdTggcmV2OwogfTsKLXR5cGVkZWYgc3RydWN0IHNtc2NfY2hpcCBzbXNjX2NoaXBfdDsKIAogc3RydWN0IHNtc2NfY2hpcF9hZGRyZXNzIHsKIAl1bnNpZ25lZCBpbnQgY2ZnX2Jhc2U7CiAJdW5zaWduZWQgaW50IHR5cGU7CiB9OwotdHlwZWRlZiBzdHJ1Y3Qgc21zY19jaGlwX2FkZHJlc3Mgc21zY19jaGlwX2FkZHJlc3NfdDsKIAogLyogUHJpdmF0ZSBkYXRhIGZvciBlYWNoIGluc3RhbmNlICovCiBzdHJ1Y3Qgc21zY19pcmNjX2NiIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAgICAgLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCBpcmxhcF9jYiAgICAqaXJsYXA7IC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KLQkKKwogCWNoaXBpb190IGlvOyAgICAgICAgICAgICAgIC8qIElyREEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLwogCWlvYnVmZl90IHR4X2J1ZmY7ICAgICAgICAgIC8qIFRyYW5zbWl0IGJ1ZmZlciAqLwogCWlvYnVmZl90IHJ4X2J1ZmY7ICAgICAgICAgIC8qIFJlY2VpdmUgYnVmZmVyICovCkBAIC0xMTksNyArMTM1LDcgQEAKIAlzdHJ1Y3QgcW9zX2luZm8gcW9zOyAgICAgICAvKiBRb1MgY2FwYWJpbGl0aWVzIGZvciB0aGlzIGRldmljZSAqLwogCiAJc3BpbmxvY2tfdCBsb2NrOyAgICAgICAgICAgLyogRm9yIHNlcmlhbGl6aW5nIG9wZXJhdGlvbnMgKi8KLQkKKwogCV9fdTMyIG5ld19zcGVlZDsKIAlfX3UzMiBmbGFnczsgICAgICAgICAgICAgICAvKiBJbnRlcmZhY2UgZmxhZ3MgKi8KIApAQCAtMTI3LDE4ICsxNDMsMjAgQEAKIAlpbnQgdHhfbGVuOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzIGluIHR4X2J1ZmYgKi8KIAogCWludCB0cmFuc2NlaXZlcjsKLQlzdHJ1Y3QgcG1fZGV2ICpwbWRldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGRldjsKIH07CiAKIC8qIENvbnN0YW50cyAqLwogCi1zdGF0aWMgY29uc3QgY2hhciAqZHJpdmVyX25hbWUgPSAic21zYy1pcmNjMiI7Ci0jZGVmaW5lCURJTSh4KQkoc2l6ZW9mKHgpLyhzaXplb2YoKih4KSkpKQorI2RlZmluZSBTTVNDX0lSQ0MyX0RSSVZFUl9OQU1FCQkJInNtc2MtaXJjYzIiCisKICNkZWZpbmUgU01TQ19JUkNDMl9DX0lSREFfRkFMTEJBQ0tfU1BFRUQJOTYwMAogI2RlZmluZSBTTVNDX0lSQ0MyX0NfREVGQVVMVF9UUkFOU0NFSVZFUgkxCi0jZGVmaW5lIFNNU0NfSVJDQzJfQ19ORVRfVElNRU9VVAkJCTAKKyNkZWZpbmUgU01TQ19JUkNDMl9DX05FVF9USU1FT1VUCQkwCiAjZGVmaW5lIFNNU0NfSVJDQzJfQ19TSVJfU1RPUAkJCTAKIAorc3RhdGljIGNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lID0gU01TQ19JUkNDMl9EUklWRVJfTkFNRTsKKwogLyogUHJvdG90eXBlcyAqLwogCiBzdGF0aWMgaW50IHNtc2NfaXJjY19vcGVuKHVuc2lnbmVkIGludCBmaXJiYXNlLCB1bnNpZ25lZCBpbnQgc2lyYmFzZSwgdTggZG1hLCB1OCBpcnEpOwpAQCAtMTQ3LDE1ICsxNjUsMTUgQEAKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXR1cF9xb3Moc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CiBzdGF0aWMgdm9pZCBzbXNjX2lyY2NfaW5pdF9jaGlwKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOwogc3RhdGljIGludCBfX2V4aXQgc21zY19pcmNjX2Nsb3NlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOwotc3RhdGljIGludCAgc21zY19pcmNjX2RtYV9yZWNlaXZlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpOyAKLXN0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKTsKK3N0YXRpYyBpbnQgIHNtc2NfaXJjY19kbWFfcmVjZWl2ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfcmVjZWl2ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKIHN0YXRpYyBpbnQgIHNtc2NfaXJjY19oYXJkX3htaXRfc2lyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCAgc21zY19pcmNjX2hhcmRfeG1pdF9maXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3htaXQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSwgaW50IGJvZnMpOwotc3RhdGljIHZvaWQgc21zY19pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpOwotc3RhdGljIHZvaWQgc21zY19pcmNjX2NoYW5nZV9zcGVlZCh2b2lkICpwcml2LCB1MzIgc3BlZWQpOwotc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF9zaXJfc3BlZWQodm9pZCAqcHJpdiwgdTMyIHNwZWVkKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfeG1pdChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgYm9mcyk7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIHUzMiBzcGVlZCk7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3Npcl9zcGVlZChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCB1MzIgc3BlZWQpOwogc3RhdGljIGlycXJldHVybl90IHNtc2NfaXJjY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBzdGF0aWMgaXJxcmV0dXJuX3Qgc21zY19pcmNjX2ludGVycnVwdF9zaXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2lyX3N0YXJ0KHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOwpAQCAtMTcxLDcgKzE4OSw2IEBACiBzdGF0aWMgdm9pZCBzbXNjX2lyY2NfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKICNlbmRpZgogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzbXNjX2lyY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgIHNtc2NfaXJjY19wbXByb2Moc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSk7CiBzdGF0aWMgaW50IHNtc2NfaXJjY19pc19yZWNlaXZpbmcoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CiBzdGF0aWMgdm9pZCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXIoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CiBzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX2Zvcl9zcGVlZChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCB1MzIgc3BlZWQpOwpAQCAtMTc5LDkgKzE5Niw5IEBACiAKIC8qIFByb2JpbmcgKi8KIHN0YXRpYyBpbnQgX19pbml0IHNtc2NfaXJjY19sb29rX2Zvcl9jaGlwcyh2b2lkKTsKLXN0YXRpYyBjb25zdCBzbXNjX2NoaXBfdCAqIF9faW5pdCBzbXNjX2lyY2NfcHJvYmUodW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsdTggcmVnLGNvbnN0IHNtc2NfY2hpcF90ICpjaGlwLGNoYXIgKnR5cGUpOwotc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX2ZsYXQoY29uc3Qgc21zY19jaGlwX3QgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgY2hhciAqdHlwZSk7Ci1zdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fcGFnZWQoY29uc3Qgc21zY19jaGlwX3QgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgY2hhciAqdHlwZSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqIF9faW5pdCBzbXNjX2lyY2NfcHJvYmUodW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIHU4IHJlZywgY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqY2hpcCwgY2hhciAqdHlwZSk7CitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fZmxhdChjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICpjaGlwcywgdW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIGNoYXIgKnR5cGUpOworc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX3BhZ2VkKGNvbnN0IHN0cnVjdCBzbXNjX2NoaXAgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgY2hhciAqdHlwZSk7CiBzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fZmRjKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlKTsKIHN0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19scGModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UpOwogCkBAIC0xOTYsMjEgKzIxMywyNiBAQAogCiAvKiBQb3dlciBNYW5hZ2VtZW50ICovCiAKLXN0YXRpYyB2b2lkIHNtc2NfaXJjY19zdXNwZW5kKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOwotc3RhdGljIHZvaWQgc21zY19pcmNjX3dha2V1cChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKLXN0YXRpYyBpbnQgc21zY19pcmNjX3BtcHJvYyhzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKTsKK3N0YXRpYyBpbnQgc21zY19pcmNjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHUzMiBsZXZlbCk7CitzdGF0aWMgaW50IHNtc2NfaXJjY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpOwogCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgc21zY19pcmNjX2RyaXZlciA9IHsKKwkubmFtZQkJPSBTTVNDX0lSQ0MyX0RSSVZFUl9OQU1FLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5zdXNwZW5kCT0gc21zY19pcmNjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzbXNjX2lyY2NfcmVzdW1lLAorfTsKIAogLyogVHJhbnNjZWl2ZXJzIGZvciBTTVNDLWlyY2MgKi8KIAotc3RhdGljIHNtc2NfdHJhbnNjZWl2ZXJfdCBzbXNjX3RyYW5zY2VpdmVyc1tdPQorc3RhdGljIHN0cnVjdCBzbXNjX3RyYW5zY2VpdmVyIHNtc2NfdHJhbnNjZWl2ZXJzW10gPQogewotCXsgIlRvc2hpYmEgU2F0ZWxsaXRlIDE4MDAgKEdQIGRhdGEgcGluIHNlbGVjdCkiLCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMCwgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMH0sCi0JeyAiRmFzdCBwaW4gc2VsZWN0Iiwgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0LCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2Zhc3RfcGluX3NlbGVjdH0sCi0JeyAiQVRDIElSTW9kZSIsIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0Yywgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19hdGN9LAotCXsgTlVMTCwgTlVMTH0KKwl7ICJUb3NoaWJhIFNhdGVsbGl0ZSAxODAwIChHUCBkYXRhIHBpbiBzZWxlY3QpIiwgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl90b3NoaWJhX3NhdDE4MDAsIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl90b3NoaWJhX3NhdDE4MDAgfSwKKwl7ICJGYXN0IHBpbiBzZWxlY3QiLCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3QsIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0IH0sCisJeyAiQVRDIElSTW9kZSIsIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0Yywgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19hdGMgfSwKKwl7IE5VTEwsIE5VTEwgfQogfTsKLSNkZWZpbmUgU01TQ19JUkNDMl9DX05VTUJFUl9PRl9UUkFOU0NFSVZFUlMgKERJTShzbXNjX3RyYW5zY2VpdmVycyktMSkKKyNkZWZpbmUgU01TQ19JUkNDMl9DX05VTUJFUl9PRl9UUkFOU0NFSVZFUlMgKEFSUkFZX1NJWkUoc21zY190cmFuc2NlaXZlcnMpIC0gMSkKIAogLyogIFNNQyBTdXBlcklPIGNoaXBzZXRzIGRlZmluaXRpb25zICovCiAKQEAgLTIyMSw3ICsyNDMsNyBAQAogI2RlZmluZQlGSVIJNAkvKiBTdXBlcklPIENoaXAgaGFzIGZhc3QgSVJEQSAqLwogI2RlZmluZQlTRVJ4NAk4CS8qIFN1cGVySU8gQ2hpcCBzdXBwb3J0cyAxMTUsMiBLQmF1ZCAqIDQ9NDYwLDggS0JhdWQgKi8KIAotc3RhdGljIHNtc2NfY2hpcF90IF9faW5pdGRhdGEgZmRjX2NoaXBzX2ZsYXRbXT0KK3N0YXRpYyBzdHJ1Y3Qgc21zY19jaGlwIF9faW5pdGRhdGEgZmRjX2NoaXBzX2ZsYXRbXSA9CiB7CiAJLyogQmFzZSBhZGRyZXNzIDB4M2YwIG9yIDB4MzcwICovCiAJeyAiMzdDNDQiLAlLRVk1NV8xfE5vSVJEQSwJCTB4MDAsIDB4MDAgfSwgLyogVGhpcyBjaGlwIGNhbm5vdCBiZSBkZXRlY3RlZCAqLwpAQCAtMjM1LDcgKzI1Nyw3IEBACiAJeyBOVUxMIH0KIH07CiAKLXN0YXRpYyBzbXNjX2NoaXBfdCBfX2luaXRkYXRhIGZkY19jaGlwc19wYWdlZFtdPQorc3RhdGljIHN0cnVjdCBzbXNjX2NoaXAgX19pbml0ZGF0YSBmZGNfY2hpcHNfcGFnZWRbXSA9CiB7CiAJLyogQmFzZSBhZGRyZXNzIDB4M2YwIG9yIDB4MzcwICovCiAJeyAiMzdCNzJYIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NGMsIDB4MDAgfSwKQEAgLTI1NCw3ICsyNzYsNyBAQAogCXsgTlVMTCB9CiB9OwogCi1zdGF0aWMgc21zY19jaGlwX3QgX19pbml0ZGF0YSBscGNfY2hpcHNfZmxhdFtdPQorc3RhdGljIHN0cnVjdCBzbXNjX2NoaXAgX19pbml0ZGF0YSBscGNfY2hpcHNfZmxhdFtdID0KIHsKIAkvKiBCYXNlIGFkZHJlc3MgMHgyRSBvciAweDRFICovCiAJeyAiNDdOMjI3IiwJS0VZNTVfMXxGSVJ8U0VSeDQsCTB4NWEsIDB4MDAgfSwKQEAgLTI2Miw3ICsyODQsNyBAQAogCXsgTlVMTCB9CiB9OwogCi1zdGF0aWMgc21zY19jaGlwX3QgX19pbml0ZGF0YSBscGNfY2hpcHNfcGFnZWRbXT0KK3N0YXRpYyBzdHJ1Y3Qgc21zY19jaGlwIF9faW5pdGRhdGEgbHBjX2NoaXBzX3BhZ2VkW10gPQogewogCS8qIEJhc2UgYWRkcmVzcyAweDJFIG9yIDB4NEUgKi8KIAl7ICI0N0IyN1giLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg1MSwgMHgwMCB9LApAQCAtMjgxLDMzICszMDMsMjUgQEAKICNkZWZpbmUgU01TQ1NJT19UWVBFX0ZMQVQJNAogI2RlZmluZSBTTVNDU0lPX1RZUEVfUEFHRUQJOAogCi1zdGF0aWMgc21zY19jaGlwX2FkZHJlc3NfdCBfX2luaXRkYXRhIHBvc3NpYmxlX2FkZHJlc3Nlc1tdPQorc3RhdGljIHN0cnVjdCBzbXNjX2NoaXBfYWRkcmVzcyBfX2luaXRkYXRhIHBvc3NpYmxlX2FkZHJlc3Nlc1tdID0KIHsKLQl7MHgzZjAsIFNNU0NTSU9fVFlQRV9GREN8U01TQ1NJT19UWVBFX0ZMQVR8U01TQ1NJT19UWVBFX1BBR0VEfSwKLQl7MHgzNzAsIFNNU0NTSU9fVFlQRV9GREN8U01TQ1NJT19UWVBFX0ZMQVR8U01TQ1NJT19UWVBFX1BBR0VEfSwKLQl7MHhlMCwgU01TQ1NJT19UWVBFX0ZEQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUR9LAotCXsweDJlLCBTTVNDU0lPX1RZUEVfTFBDfFNNU0NTSU9fVFlQRV9GTEFUfFNNU0NTSU9fVFlQRV9QQUdFRH0sCi0JezB4NGUsIFNNU0NTSU9fVFlQRV9MUEN8U01TQ1NJT19UWVBFX0ZMQVR8U01TQ1NJT19UWVBFX1BBR0VEfSwKLQl7MCwwfQorCXsgMHgzZjAsIFNNU0NTSU9fVFlQRV9GREN8U01TQ1NJT19UWVBFX0ZMQVR8U01TQ1NJT19UWVBFX1BBR0VEIH0sCisJeyAweDM3MCwgU01TQ1NJT19UWVBFX0ZEQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUQgfSwKKwl7IDB4ZTAsICBTTVNDU0lPX1RZUEVfRkRDfFNNU0NTSU9fVFlQRV9GTEFUfFNNU0NTSU9fVFlQRV9QQUdFRCB9LAorCXsgMHgyZSwgIFNNU0NTSU9fVFlQRV9MUEN8U01TQ1NJT19UWVBFX0ZMQVR8U01TQ1NJT19UWVBFX1BBR0VEIH0sCisJeyAweDRlLCAgU01TQ1NJT19UWVBFX0xQQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUQgfSwKKwl7IDAsIDAgfQogfTsKIAogLyogR2xvYmFscyAqLwogCi1zdGF0aWMgc3RydWN0IHNtc2NfaXJjY19jYiAqZGV2X3NlbGZbXSA9IHsgTlVMTCwgTlVMTH07Ci0KLXN0YXRpYyBpbnQgaXJjY19pcnE9MjU1Owotc3RhdGljIGludCBpcmNjX2RtYT0yNTU7Ci1zdGF0aWMgaW50IGlyY2NfZmlyPTA7Ci1zdGF0aWMgaW50IGlyY2Nfc2lyPTA7Ci1zdGF0aWMgaW50IGlyY2NfY2ZnPTA7Ci1zdGF0aWMgaW50IGlyY2NfdHJhbnNjZWl2ZXI9MDsKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0CWRldl9jb3VudD0wOworc3RhdGljIHN0cnVjdCBzbXNjX2lyY2NfY2IgKmRldl9zZWxmW10gPSB7IE5VTEwsIE5VTEwgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBkZXZfY291bnQ7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZWdpc3Rlcl9iYW5rKGludCBpb2Jhc2UsIGludCBiYW5rKQogewotICAgICAgICBvdXRiKCgoaW5iKGlvYmFzZStJUkNDX01BU1RFUikgJiAweGYwKSB8IChiYW5rICYgMHgwNykpLAotICAgICAgICAgICAgICAgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKKyAgICAgICAgb3V0YigoKGluYihpb2Jhc2UgKyBJUkNDX01BU1RFUikgJiAweGYwKSB8IChiYW5rICYgMHgwNykpLAorICAgICAgICAgICAgICAgaW9iYXNlICsgSVJDQ19NQVNURVIpOwogfQogCiAKQEAgLTMyNywzNCArMzQxLDQ0IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IHNtc2NfaXJjY19pbml0KHZvaWQpCiB7Ci0JaW50IHJldD0tRU5PREVWOworCWludCByZXQ7CiAKIAlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKIAotCWRldl9jb3VudD0wOwotIAotCWlmICgoaXJjY19maXI+MCkmJihpcmNjX3Npcj4wKSkgeworCXJldCA9IGRyaXZlcl9yZWdpc3Rlcigmc21zY19pcmNjX2RyaXZlcik7CisJaWYgKHJldCkgeworCQlJUkRBX0VSUk9SKCIlcywgQ2FuJ3QgcmVnaXN0ZXIgZHJpdmVyIVxuIiwgZHJpdmVyX25hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9jb3VudCA9IDA7CisKKwlpZiAoaXJjY19maXIgPiAwICYmIGlyY2Nfc2lyID4gMCkgewogCQlJUkRBX01FU1NBR0UoIiBPdmVycmlkaW5nIEZJUiBhZGRyZXNzIDB4JTA0eFxuIiwgaXJjY19maXIpOwogCQlJUkRBX01FU1NBR0UoIiBPdmVycmlkaW5nIFNJUiBhZGRyZXNzIDB4JTA0eFxuIiwgaXJjY19zaXIpOwogCi0JCWlmIChzbXNjX2lyY2Nfb3BlbihpcmNjX2ZpciwgaXJjY19zaXIsIGlyY2NfZG1hLCBpcmNjX2lycSkgPT0gMCkKLQkJCXJldHVybiAwOworCQlpZiAoc21zY19pcmNjX29wZW4oaXJjY19maXIsIGlyY2Nfc2lyLCBpcmNjX2RtYSwgaXJjY19pcnEpKQorCQkJcmV0ID0gLUVOT0RFVjsKKwl9IGVsc2UgeworCQlyZXQgPSAtRU5PREVWOwogCi0JCXJldHVybiAtRU5PREVWOwotCX0KKwkJLyogdHJ5IHVzZXIgcHJvdmlkZWQgY29uZmlndXJhdGlvbiByZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8KKwkJaWYgKGlyY2NfY2ZnID4gMCkgeworCQkJSVJEQV9NRVNTQUdFKCIgT3ZlcnJpZGluZyBjb25maWd1cmF0aW9uIGFkZHJlc3MgIgorCQkJCSAgICAgIjB4JTA0eFxuIiwgaXJjY19jZmcpOworCQkJaWYgKCFzbXNjX3N1cGVyaW9fZmRjKGlyY2NfY2ZnKSkKKwkJCQlyZXQgPSAwOworCQkJaWYgKCFzbXNjX3N1cGVyaW9fbHBjKGlyY2NfY2ZnKSkKKwkJCQlyZXQgPSAwOworCQl9CiAKLQkvKiB0cnkgdXNlciBwcm92aWRlZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLwotCWlmIChpcmNjX2NmZz4wKSB7Ci0JICAgICAgICBJUkRBX01FU1NBR0UoIiBPdmVycmlkaW5nIGNvbmZpZ3VyYXRpb24gYWRkcmVzcyAweCUwNHhcbiIsCi0JCQkgICAgIGlyY2NfY2ZnKTsKLQkJaWYgKCFzbXNjX3N1cGVyaW9fZmRjKGlyY2NfY2ZnKSkKLQkJCXJldCA9IDA7Ci0JCWlmICghc21zY19zdXBlcmlvX2xwYyhpcmNjX2NmZykpCisJCWlmIChzbXNjX2lyY2NfbG9va19mb3JfY2hpcHMoKSA+IDApCiAJCQlyZXQgPSAwOwogCX0KLQkKLQlpZihzbXNjX2lyY2NfbG9va19mb3JfY2hpcHMoKT4wKSByZXQgPSAwOwotCQorCisJaWYgKHJldCkKKwkJZHJpdmVyX3VucmVnaXN0ZXIoJnNtc2NfaXJjY19kcml2ZXIpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzY5LDE1ICszOTMsMTUgQEAKIAlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50IGVycjsKLQkKKwogCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJZXJyID0gc21zY19pcmNjX3ByZXNlbnQoZmlyX2Jhc2UsIHNpcl9iYXNlKTsKLQlpZihlcnIpIAorCWlmIChlcnIpCiAJCWdvdG8gZXJyX291dDsKLQkJCisKIAllcnIgPSAtRU5PTUVNOwotCWlmIChkZXZfY291bnQgPiBESU0oZGV2X3NlbGYpKSB7CisJaWYgKGRldl9jb3VudCA+PSBBUlJBWV9TSVpFKGRldl9zZWxmKSkgewogCSAgICAgICAgSVJEQV9XQVJOSU5HKCIlcygpLCB0b28gbWFueSBkZXZpY2VzIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJZ290byBlcnJfb3V0MTsKIAl9CkBAIC0zOTYsMTQgKzQyMCwxNCBAQAogCWRldi0+aGFyZF9zdGFydF94bWl0ID0gc21zY19pcmNjX2hhcmRfeG1pdF9zaXI7CiAjaWYgU01TQ19JUkNDMl9DX05FVF9USU1FT1VUCiAJZGV2LT50eF90aW1lb3V0CSAgICAgPSBzbXNjX2lyY2NfdGltZW91dDsKLQlkZXYtPndhdGNoZG9nX3RpbWVvICA9IEhaKjI7ICAvKiBBbGxvdyBlbm91Z2ggdGltZSBmb3Igc3BlZWQgY2hhbmdlICovCisJZGV2LT53YXRjaGRvZ190aW1lbyAgPSBIWiAqIDI7ICAvKiBBbGxvdyBlbm91Z2ggdGltZSBmb3Igc3BlZWQgY2hhbmdlICovCiAjZW5kaWYKIAlkZXYtPm9wZW4gICAgICAgICAgICA9IHNtc2NfaXJjY19uZXRfb3BlbjsKIAlkZXYtPnN0b3AgICAgICAgICAgICA9IHNtc2NfaXJjY19uZXRfY2xvc2U7CiAJZGV2LT5kb19pb2N0bCAgICAgICAgPSBzbXNjX2lyY2NfbmV0X2lvY3RsOwogCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBzbXNjX2lyY2NfbmV0X2dldF9zdGF0czsKLQkKLQlzZWxmID0gZGV2LT5wcml2OworCisJc2VsZiA9IG5ldGRldl9wcml2KGRldik7CiAJc2VsZi0+bmV0ZGV2ID0gZGV2OwogCiAJLyogTWFrZSBpZmNvbmZpZyBkaXNwbGF5IHNvbWUgZGV0YWlscyAqLwpAQCAtNDExLDEwICs0MzUsMTAgQEAKIAlkZXYtPmlycSA9IHNlbGYtPmlvLmlycSA9IGlycTsKIAogCS8qIE5lZWQgdG8gc3RvcmUgc2VsZiBzb21ld2hlcmUgKi8KLQlkZXZfc2VsZltkZXZfY291bnQrK10gPSBzZWxmOworCWRldl9zZWxmW2Rldl9jb3VudF0gPSBzZWxmOwogCXNwaW5fbG9ja19pbml0KCZzZWxmLT5sb2NrKTsKIAotCXNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUgPSBTTVNDX0lSQ0MyX1JYX0JVRkZfVFJVRVNJWkU7IAorCXNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUgPSBTTVNDX0lSQ0MyX1JYX0JVRkZfVFJVRVNJWkU7CiAJc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSA9IFNNU0NfSVJDQzJfVFhfQlVGRl9UUlVFU0laRTsKIAogCXNlbGYtPnJ4X2J1ZmYuaGVhZCA9CkBAIC00NDIsMzMgKzQ2Niw0MCBAQAogCXNlbGYtPnJ4X2J1ZmYuc3RhdGUgPSBPVVRTSURFX0ZSQU1FOwogCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKIAlzZWxmLT5yeF9idWZmLmRhdGEgPSBzZWxmLT5yeF9idWZmLmhlYWQ7Ci0JICAgCisKIAlzbXNjX2lyY2Nfc2V0dXBfaW8oc2VsZiwgZmlyX2Jhc2UsIHNpcl9iYXNlLCBkbWEsIGlycSk7Ci0KIAlzbXNjX2lyY2Nfc2V0dXBfcW9zKHNlbGYpOwotCiAJc21zY19pcmNjX2luaXRfY2hpcChzZWxmKTsKLQkKLQlpZihpcmNjX3RyYW5zY2VpdmVyID4gMCAgJiYgCi0JICAgaXJjY190cmFuc2NlaXZlciA8IFNNU0NfSVJDQzJfQ19OVU1CRVJfT0ZfVFJBTlNDRUlWRVJTKQorCisJaWYgKGlyY2NfdHJhbnNjZWl2ZXIgPiAwICAmJgorCSAgICBpcmNjX3RyYW5zY2VpdmVyIDwgU01TQ19JUkNDMl9DX05VTUJFUl9PRl9UUkFOU0NFSVZFUlMpCiAJCXNlbGYtPnRyYW5zY2VpdmVyID0gaXJjY190cmFuc2NlaXZlcjsKIAllbHNlCiAJCXNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcihzZWxmKTsKIAogCWVyciA9IHJlZ2lzdGVyX25ldGRldihzZWxmLT5uZXRkZXYpOwotCWlmKGVycikgeworCWlmIChlcnIpIHsKIAkJSVJEQV9FUlJPUigiJXMsIE5ldHdvcmsgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iLAogCQkJICAgZHJpdmVyX25hbWUpOwogCQlnb3RvIGVycl9vdXQ0OwogCX0KIAotCXNlbGYtPnBtZGV2ID0gcG1fcmVnaXN0ZXIoUE1fU1lTX0RFViwgUE1fU1lTX0lSREEsIHNtc2NfaXJjY19wbXByb2MpOwotCWlmIChzZWxmLT5wbWRldikKLQkJc2VsZi0+cG1kZXYtPmRhdGEgPSBzZWxmOworCXNlbGYtPnBsZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShTTVNDX0lSQ0MyX0RSSVZFUl9OQU1FLAorCQkJCQkJICAgICAgZGV2X2NvdW50LCBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKHNlbGYtPnBsZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKHNlbGYtPnBsZGV2KTsKKwkJZ290byBlcnJfb3V0NTsKKwl9CisJZGV2X3NldF9kcnZkYXRhKCZzZWxmLT5wbGRldi0+ZGV2LCBzZWxmKTsKIAogCUlSREFfTUVTU0FHRSgiSXJEQTogUmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsIGRldi0+bmFtZSk7CisJZGV2X2NvdW50Kys7CiAKIAlyZXR1cm4gMDsKKworIGVycl9vdXQ1OgorCXVucmVnaXN0ZXJfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKICBlcnJfb3V0NDoKIAlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAogCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKQEAgLTQ3Nyw3ICs1MDgsNyBAQAogCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKICBlcnJfb3V0MjoKIAlmcmVlX25ldGRldihzZWxmLT5uZXRkZXYpOwotCWRldl9zZWxmWy0tZGV2X2NvdW50XSA9IE5VTEw7CisJZGV2X3NlbGZbZGV2X2NvdW50XSA9IE5VTEw7CiAgZXJyX291dDE6CiAJcmVsZWFzZV9yZWdpb24oZmlyX2Jhc2UsIFNNU0NfSVJDQzJfRklSX0NISVBfSU9fRVhURU5UKTsKIAlyZWxlYXNlX3JlZ2lvbihzaXJfYmFzZSwgU01TQ19JUkNDMl9TSVJfQ0hJUF9JT19FWFRFTlQpOwpAQCAtNTExLDE2ICs1NDIsMTYgQEAKIAogCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDMpOwogCi0JaGlnaCAgICA9IGluYihmaXJfYmFzZStJUkNDX0lEX0hJR0gpOwotCWxvdyAgICAgPSBpbmIoZmlyX2Jhc2UrSVJDQ19JRF9MT1cpOwotCWNoaXAgICAgPSBpbmIoZmlyX2Jhc2UrSVJDQ19DSElQX0lEKTsKLQl2ZXJzaW9uID0gaW5iKGZpcl9iYXNlK0lSQ0NfVkVSU0lPTik7Ci0JY29uZmlnICA9IGluYihmaXJfYmFzZStJUkNDX0lOVEVSRkFDRSk7CisJaGlnaCAgICA9IGluYihmaXJfYmFzZSArIElSQ0NfSURfSElHSCk7CisJbG93ICAgICA9IGluYihmaXJfYmFzZSArIElSQ0NfSURfTE9XKTsKKwljaGlwICAgID0gaW5iKGZpcl9iYXNlICsgSVJDQ19DSElQX0lEKTsKKwl2ZXJzaW9uID0gaW5iKGZpcl9iYXNlICsgSVJDQ19WRVJTSU9OKTsKKwljb25maWcgID0gaW5iKGZpcl9iYXNlICsgSVJDQ19JTlRFUkZBQ0UpOwogCWRtYSAgICAgPSBjb25maWcgJiBJUkNDX0lOVEVSRkFDRV9ETUFfTUFTSzsKIAlpcnEgICAgID0gKGNvbmZpZyAmIElSQ0NfSU5URVJGQUNFX0lSUV9NQVNLKSA+PiA0OwogCi0JaWYgKGhpZ2ggIT0gMHgxMCB8fCBsb3cgIT0gMHhiOCB8fCAoY2hpcCAhPSAweGYxICYmIGNoaXAgIT0gMHhmMikpIHsgCi0JICAgICAgICBJUkRBX1dBUk5JTkcoIiVzKCksIGFkZHIgMHglMDR4IC0gbm8gZGV2aWNlIGZvdW5kIVxuIiwKKwlpZiAoaGlnaCAhPSAweDEwIHx8IGxvdyAhPSAweGI4IHx8IChjaGlwICE9IDB4ZjEgJiYgY2hpcCAhPSAweGYyKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIGFkZHIgMHglMDR4IC0gbm8gZGV2aWNlIGZvdW5kIVxuIiwKIAkJCSAgICAgX19GVU5DVElPTl9fLCBmaXJfYmFzZSk7CiAJCWdvdG8gb3V0MzsKIAl9CkBAIC01MjksNiArNTYwLDcgQEAKIAkJICAgICBjaGlwICYgMHgwZiwgdmVyc2lvbiwgZmlyX2Jhc2UsIHNpcl9iYXNlLCBkbWEsIGlycSk7CiAKIAlyZXR1cm4gMDsKKwogIG91dDM6CiAJcmVsZWFzZV9yZWdpb24oc2lyX2Jhc2UsIFNNU0NfSVJDQzJfU0lSX0NISVBfSU9fRVhURU5UKTsKICBvdXQyOgpAQCAtNTQzLDE2ICs1NzUsMTYgQEAKICAqICAgIFNldHVwIEkvTwogICoKICAqLwotc3RhdGljIHZvaWQgc21zY19pcmNjX3NldHVwX2lvKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIAotCQkJICAgICAgIHVuc2lnbmVkIGludCBmaXJfYmFzZSwgdW5zaWduZWQgaW50IHNpcl9iYXNlLCAKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXR1cF9pbyhzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBmaXJfYmFzZSwgdW5zaWduZWQgaW50IHNpcl9iYXNlLAogCQkJICAgICAgIHU4IGRtYSwgdTggaXJxKQogewogCXVuc2lnbmVkIGNoYXIgY29uZmlnLCBjaGlwX2RtYSwgY2hpcF9pcnE7CiAKIAlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAzKTsKLQljb25maWcgID0gaW5iKGZpcl9iYXNlK0lSQ0NfSU5URVJGQUNFKTsKLQljaGlwX2RtYSAgICAgPSBjb25maWcgJiBJUkNDX0lOVEVSRkFDRV9ETUFfTUFTSzsKLQljaGlwX2lycSAgICAgPSAoY29uZmlnICYgSVJDQ19JTlRFUkZBQ0VfSVJRX01BU0spID4+IDQ7CisJY29uZmlnID0gaW5iKGZpcl9iYXNlICsgSVJDQ19JTlRFUkZBQ0UpOworCWNoaXBfZG1hID0gY29uZmlnICYgSVJDQ19JTlRFUkZBQ0VfRE1BX01BU0s7CisJY2hpcF9pcnEgPSAoY29uZmlnICYgSVJDQ19JTlRFUkZBQ0VfSVJRX01BU0spID4+IDQ7CiAKIAlzZWxmLT5pby5maXJfYmFzZSAgPSBmaXJfYmFzZTsKIAlzZWxmLT5pby5zaXJfYmFzZSAgPSBzaXJfYmFzZTsKQEAgLTU2NiwxNyArNTk4LDE1IEBACiAJCQlJUkRBX01FU1NBR0UoIiVzLCBPdmVycmlkaW5nIElSUSAtIGNoaXAgc2F5cyAlZCwgdXNpbmcgJWRcbiIsCiAJCQkJICAgICBkcml2ZXJfbmFtZSwgY2hpcF9pcnEsIGlycSk7CiAJCXNlbGYtPmlvLmlycSA9IGlycTsKLQl9Ci0JZWxzZQorCX0gZWxzZQogCQlzZWxmLT5pby5pcnEgPSBjaGlwX2lycTsKLQkKKwogCWlmIChkbWEgPCAyNTUpIHsKIAkJaWYgKGRtYSAhPSBjaGlwX2RtYSkKIAkJCUlSREFfTUVTU0FHRSgiJXMsIE92ZXJyaWRpbmcgRE1BIC0gY2hpcCBzYXlzICVkLCB1c2luZyAlZFxuIiwKIAkJCQkgICAgIGRyaXZlcl9uYW1lLCBjaGlwX2RtYSwgZG1hKTsKIAkJc2VsZi0+aW8uZG1hID0gZG1hOwotCX0KLQllbHNlCisJfSBlbHNlCiAJCXNlbGYtPmlvLmRtYSA9IGNoaXBfZG1hOwogCiB9CkBAIC01OTEsNyArNjIxLDcgQEAKIHsKIAkvKiBJbml0aWFsaXplIFFvUyBmb3IgdGhpcyBkZXZpY2UgKi8KIAlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZzZWxmLT5xb3MpOwotCQorCiAJc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHwKIAkJSVJfMTE1MjAwfElSXzU3NjAwMHxJUl8xMTUyMDAwfChJUl80MDAwMDAwIDw8IDgpOwogCkBAIC02MDgsNDMgKzYzOCw0MyBAQAogICovCiBzdGF0aWMgdm9pZCBzbXNjX2lyY2NfaW5pdF9jaGlwKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCiB7Ci0JaW50IGlvYmFzZSwgaXJfbW9kZSwgY3RybCwgZmFzdDsgCi0JCi0JSVJEQV9BU1NFUlQoIHNlbGYgIT0gTlVMTCwgcmV0dXJuOyApOwotCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCWludCBpb2Jhc2UsIGlyX21vZGUsIGN0cmwsIGZhc3Q7CiAKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CiAJaXJfbW9kZSA9IElSQ0NfQ0ZHQV9JUkRBX1NJUl9BOwogCWN0cmwgPSAwOwogCWZhc3QgPSAwOwogCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCW91dGIoSVJDQ19NQVNURVJfUkVTRVQsIGlvYmFzZStJUkNDX01BU1RFUik7Ci0Jb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19NQVNURVIpOworCW91dGIoSVJDQ19NQVNURVJfUkVTRVQsIGlvYmFzZSArIElSQ0NfTUFTVEVSKTsKKwlvdXRiKDB4MDAsIGlvYmFzZSArIElSQ0NfTUFTVEVSKTsKIAogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKLQlvdXRiKCgoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdBKSAmIDB4ODcpIHwgaXJfbW9kZSksIAotCSAgICAgaW9iYXNlK0lSQ0NfU0NFX0NGR0EpOworCW91dGIoKChpbmIoaW9iYXNlICsgSVJDQ19TQ0VfQ0ZHQSkgJiAweDg3KSB8IGlyX21vZGUpLAorCSAgICAgaW9iYXNlICsgSVJDQ19TQ0VfQ0ZHQSk7CiAKICNpZmRlZiBzbXNjXzY2OSAvKiBVc2VzIHBpbiA4OC84OSBmb3IgUngvVHggKi8KLQlvdXRiKCgoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdCKSAmIDB4M2YpIHwgSVJDQ19DRkdCX01VWF9DT00pLCAKLQkgICAgIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKLSNlbHNlCQotCW91dGIoKChpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgMHgzZikgfCBJUkNDX0NGR0JfTVVYX0lSKSwKLQkgICAgIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKLSNlbmRpZgkKLQkodm9pZCkgaW5iKGlvYmFzZStJUkNDX0ZJRk9fVEhSRVNIT0xEKTsKLQlvdXRiKFNNU0NfSVJDQzJfRklGT19USFJFU0hPTEQsIGlvYmFzZStJUkNDX0ZJRk9fVEhSRVNIT0xEKTsKLQkKKwlvdXRiKCgoaW5iKGlvYmFzZSArIElSQ0NfU0NFX0NGR0IpICYgMHgzZikgfCBJUkNDX0NGR0JfTVVYX0NPTSksCisJICAgICBpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKTsKKyNlbHNlCisJb3V0YigoKGluYihpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKSAmIDB4M2YpIHwgSVJDQ19DRkdCX01VWF9JUiksCisJICAgICBpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKTsKKyNlbmRpZgorCSh2b2lkKSBpbmIoaW9iYXNlICsgSVJDQ19GSUZPX1RIUkVTSE9MRCk7CisJb3V0YihTTVNDX0lSQ0MyX0ZJRk9fVEhSRVNIT0xELCBpb2Jhc2UgKyBJUkNDX0ZJRk9fVEhSRVNIT0xEKTsKKwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCA0KTsKLQlvdXRiKChpbmIoaW9iYXNlK0lSQ0NfQ09OVFJPTCkgJiAweDMwKSB8IGN0cmwsIGlvYmFzZStJUkNDX0NPTlRST0wpOwotCQorCW91dGIoKGluYihpb2Jhc2UgKyBJUkNDX0NPTlRST0wpICYgMHgzMCkgfCBjdHJsLCBpb2Jhc2UgKyBJUkNDX0NPTlRST0wpOworCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCW91dGIoZmFzdCwgaW9iYXNlK0lSQ0NfTENSX0EpOworCW91dGIoZmFzdCwgaW9iYXNlICsgSVJDQ19MQ1JfQSk7CiAKIAlzbXNjX2lyY2Nfc2V0X3Npcl9zcGVlZChzZWxmLCBTTVNDX0lSQ0MyX0NfSVJEQV9GQUxMQkFDS19TUEVFRCk7Ci0JCisKIAkvKiBQb3dlciBvbiBkZXZpY2UgKi8KLQlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX01BU1RFUik7CisJb3V0YigweDAwLCBpb2Jhc2UgKyBJUkNDX01BU1RFUik7CiB9CiAKIC8qCkBAIC02NjIsMTIgKzY5MiwxMiBAQAogCiAJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOwogCi0Jc2VsZiA9IGRldi0+cHJpdjsKKwlzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CiAKIAlJUkRBX0RFQlVHKDIsICIlcygpLCAlcywgKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUsIGNtZCk7Ci0JCisKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ1NCQU5EV0lEVEg6IC8qIFNldCBiYW5kd2lkdGggKi8KIAkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQpAQCAtNzAzLDE0ICs3MzMsMTQgQEAKIAlkZWZhdWx0OgogCQlyZXQgPSAtRU9QTk9UU1VQUDsKIAl9Ci0JCisKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNtc2NfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIGRldi0+cHJpdjsKLQkKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwogCXJldHVybiAmc2VsZi0+c3RhdHM7CiB9CiAKQEAgLTcyNCwxMSArNzU0LDkgQEAKIAogc3RhdGljIHZvaWQgc21zY19pcmNjX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmOworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OwotCQogCUlSREFfV0FSTklORygiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgY2hhbmdpbmcgc3BlZWQgdG86ICVkXG4iLAogCQkgICAgIGRldi0+bmFtZSwgc2VsZi0+aW8uc3BlZWQpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CkBAIC03NTEsMjYgKzc3OSwyMyBAQAogewogCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaW9iYXNlOwogCXMzMiBzcGVlZDsKIAogCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAwOyk7Ci0JCi0Jc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKworCXNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKIAotCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOwotCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQorCiAJLyogTWFrZSBzdXJlIHRlc3Qgb2Ygc2VsZi0+aW8uc3BlZWQgJiBzcGVlZCBjaGFuZ2UgYXJlIGF0b21pYyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KIAlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKLQlpZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJaWYgKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkICYmIHNwZWVkICE9IC0xKSB7CiAJCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZSAqLwogCQlpZiAoIXNrYi0+bGVuKSB7CiAJCQkvKgpAQCAtNzg3LDI3ICs4MTIsMjYgQEAKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKIAkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCXJldHVybiAwOwotCQl9IGVsc2UgewotCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CiAJCX0KKwkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CiAJfQogCiAJLyogSW5pdCB0eCBidWZmZXIgKi8KIAlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CiAKIAkvKiBDb3B5IHNrYiB0byB0eF9idWZmIHdoaWxlIHdyYXBwaW5nLCBzdHVmZmluZyBhbmQgbWFraW5nIENSQyAqLwotCXNlbGYtPnR4X2J1ZmYubGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBzZWxmLT50eF9idWZmLmRhdGEsIAorCXNlbGYtPnR4X2J1ZmYubGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBzZWxmLT50eF9idWZmLmRhdGEsCiAJCQkJCSAgIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOwotCQorCiAJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CiAKIAkvKiBUdXJuIG9uIHRyYW5zbWl0IGZpbmlzaGVkIGludGVycnVwdC4gV2lsbCBmaXJlIGltbWVkaWF0ZWx5ISAgKi8KLQlvdXRiKFVBUlRfSUVSX1RIUkksIGlvYmFzZStVQVJUX0lFUik7IAorCW91dGIoVUFSVF9JRVJfVEhSSSwgc2VsZi0+aW8uc2lyX2Jhc2UgKyBVQVJUX0lFUik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CiAKIAlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODI2LDkgKzg1MCw5IEBACiAKIAlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOwogCi0Jc3dpdGNoKHNwZWVkKSB7CisJc3dpdGNoIChzcGVlZCkgewogCWRlZmF1bHQ6Ci0JY2FzZSA1NzYwMDA6CQkKKwljYXNlIDU3NjAwMDoKIAkJaXJfbW9kZSA9IElSQ0NfQ0ZHQV9JUkRBX0hETEM7CiAJCWN0cmwgPSBJUkNDX0NSQzsKIAkJZmFzdCA9IDA7CkBAIC04NTMsMTQgKzg3NywxNCBAQAogCU5vdyBpbiB0cmFuY2VpdmVyIQogCS8qIFRoaXMgY2F1c2VzIGFuIGludGVycnVwdCAqLwogCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDApOwotCW91dGIoKGluYihmaXJfYmFzZStJUkNDX0xDUl9BKSAmICAweGJmKSB8IGZhc3QsIGZpcl9iYXNlK0lSQ0NfTENSX0EpOworCW91dGIoKGluYihmaXJfYmFzZSArIElSQ0NfTENSX0EpICYgIDB4YmYpIHwgZmFzdCwgZmlyX2Jhc2UgKyBJUkNDX0xDUl9BKTsKIAkjZW5kaWYKLQkKKwogCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDEpOwotCW91dGIoKChpbmIoZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQSkgJiBJUkNDX1NDRV9DRkdBX0JMT0NLX0NUUkxfQklUU19NQVNLKSB8IGlyX21vZGUpLCBmaXJfYmFzZStJUkNDX1NDRV9DRkdBKTsKLQkKKwlvdXRiKCgoaW5iKGZpcl9iYXNlICsgSVJDQ19TQ0VfQ0ZHQSkgJiBJUkNDX1NDRV9DRkdBX0JMT0NLX0NUUkxfQklUU19NQVNLKSB8IGlyX21vZGUpLCBmaXJfYmFzZSArIElSQ0NfU0NFX0NGR0EpOworCiAJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgNCk7Ci0Jb3V0YigoaW5iKGZpcl9iYXNlK0lSQ0NfQ09OVFJPTCkgJiAweDMwKSB8IGN0cmwsIGZpcl9iYXNlK0lSQ0NfQ09OVFJPTCk7CisJb3V0YigoaW5iKGZpcl9iYXNlICsgSVJDQ19DT05UUk9MKSAmIDB4MzApIHwgY3RybCwgZmlyX2Jhc2UgKyBJUkNDX0NPTlRST0wpOwogfQogCiAvKgpAQCAtODg1LDMxICs5MDksMzEgQEAKIAkvKiBSZXNldCBldmVyeXRoaW5nICovCiAKIAkvKiBJbnN0YWxsIEZJUiB0cmFuc21pdCBoYW5kbGVyICovCi0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzbXNjX2lyY2NfaGFyZF94bWl0X2ZpcjsJCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzbXNjX2lyY2NfaGFyZF94bWl0X2ZpcjsKIAogCS8qIENsZWFyIEZJRk8gKi8KLQlvdXRiKGluYihmaXJfYmFzZStJUkNDX0xDUl9BKXxJUkNDX0xDUl9BX0ZJRk9fUkVTRVQsIGZpcl9iYXNlK0lSQ0NfTENSX0EpOworCW91dGIoaW5iKGZpcl9iYXNlICsgSVJDQ19MQ1JfQSkgfCBJUkNDX0xDUl9BX0ZJRk9fUkVTRVQsIGZpcl9iYXNlICsgSVJDQ19MQ1JfQSk7CiAKIAkvKiBFbmFibGUgaW50ZXJydXB0ICovCi0JLypvdXRiKElSQ0NfSUVSX0FDVElWRV9GUkFNRXxJUkNDX0lFUl9FT00sIGZpcl9iYXNlK0lSQ0NfSUVSKTsqLworCS8qb3V0YihJUkNDX0lFUl9BQ1RJVkVfRlJBTUV8SVJDQ19JRVJfRU9NLCBmaXJfYmFzZSArIElSQ0NfSUVSKTsqLwogCiAJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMSk7CiAKLQkvKiBTZWxlY3QgdGhlIFRYL1JYIGludGVyZmFjZSAqLwkKKwkvKiBTZWxlY3QgdGhlIFRYL1JYIGludGVyZmFjZSAqLwogI2lmZGVmIFNNU0NfNjY5IC8qIFVzZXMgcGluIDg4Lzg5IGZvciBSeC9UeCAqLwotCW91dGIoKChpbmIoZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgJiAweDNmKSB8IElSQ0NfQ0ZHQl9NVVhfQ09NKSwgCi0JICAgICBmaXJfYmFzZStJUkNDX1NDRV9DRkdCKTsKLSNlbHNlCQotCW91dGIoKChpbmIoZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgJiAweDNmKSB8IElSQ0NfQ0ZHQl9NVVhfSVIpLAotCSAgICAgZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7Ci0jZW5kaWYJCi0JKHZvaWQpIGluYihmaXJfYmFzZStJUkNDX0ZJRk9fVEhSRVNIT0xEKTsKKwlvdXRiKCgoaW5iKGZpcl9iYXNlICsgSVJDQ19TQ0VfQ0ZHQikgJiAweDNmKSB8IElSQ0NfQ0ZHQl9NVVhfQ09NKSwKKwkgICAgIGZpcl9iYXNlICsgSVJDQ19TQ0VfQ0ZHQik7CisjZWxzZQorCW91dGIoKChpbmIoZmlyX2Jhc2UgKyBJUkNDX1NDRV9DRkdCKSAmIDB4M2YpIHwgSVJDQ19DRkdCX01VWF9JUiksCisJICAgICBmaXJfYmFzZSArIElSQ0NfU0NFX0NGR0IpOworI2VuZGlmCisJKHZvaWQpIGluYihmaXJfYmFzZSArIElSQ0NfRklGT19USFJFU0hPTEQpOwogCiAJLyogRW5hYmxlIFNDRSBpbnRlcnJ1cHRzICovCi0Jb3V0YigwLCBmaXJfYmFzZStJUkNDX01BU1RFUik7CisJb3V0YigwLCBmaXJfYmFzZSArIElSQ0NfTUFTVEVSKTsKIAlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAwKTsKLQlvdXRiKElSQ0NfSUVSX0FDVElWRV9GUkFNRXxJUkNDX0lFUl9FT00sIGZpcl9iYXNlK0lSQ0NfSUVSKTsKLQlvdXRiKElSQ0NfTUFTVEVSX0lOVF9FTiwgZmlyX2Jhc2UrSVJDQ19NQVNURVIpOworCW91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FIHwgSVJDQ19JRVJfRU9NLCBmaXJfYmFzZSArIElSQ0NfSUVSKTsKKwlvdXRiKElSQ0NfTUFTVEVSX0lOVF9FTiwgZmlyX2Jhc2UgKyBJUkNDX01BU1RFUik7CiB9CiAKIC8qCkBAIC05MjMsMTMgKzk0NywxMyBAQAogCWludCBmaXJfYmFzZTsKIAogCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCQorCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKIAogCWZpcl9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CiAJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMCk7Ci0JLypvdXRiKElSQ0NfTUFTVEVSX1JFU0VULCBmaXJfYmFzZStJUkNDX01BU1RFUik7Ki8JCi0Jb3V0YihpbmIoZmlyX2Jhc2UrSVJDQ19MQ1JfQikgJiBJUkNDX0xDUl9CX1NJUF9FTkFCTEUsIGZpcl9iYXNlK0lSQ0NfTENSX0IpOworCS8qb3V0YihJUkNDX01BU1RFUl9SRVNFVCwgZmlyX2Jhc2UgKyBJUkNDX01BU1RFUik7Ki8KKwlvdXRiKGluYihmaXJfYmFzZSArIElSQ0NfTENSX0IpICYgSVJDQ19MQ1JfQl9TSVBfRU5BQkxFLCBmaXJfYmFzZSArIElSQ0NfTENSX0IpOwogfQogCiAKQEAgLTk0MSwxOCArOTY1LDE1IEBACiAgKiBUaGlzIGZ1bmN0aW9uICptdXN0KiBiZSBjYWxsZWQgd2l0aCBzcGlubG9jayBoZWxkLCBiZWNhdXNlIGl0IG1heQogICogYmUgY2FsbGVkIGZyb20gdGhlIGlycSBoYW5kbGVyLiAtIEplYW4gSUkKICAqLwotc3RhdGljIHZvaWQgc21zY19pcmNjX2NoYW5nZV9zcGVlZCh2b2lkICpwcml2LCB1MzIgc3BlZWQpCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIHUzMiBzcGVlZCkKIHsKLQlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgcHJpdjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCWludCBpb2Jhc2U7CiAJaW50IGxhc3Rfc3BlZWRfd2FzX3NpcjsKLQkKKwogCUlSREFfREVCVUcoMCwgIiVzKCkgY2hhbmdpbmcgc3BlZWQgdG86ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNwZWVkKTsKIAogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CiAJZGV2ID0gc2VsZi0+bmV0ZGV2OwotCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOwogCiAJbGFzdF9zcGVlZF93YXNfc2lyID0gc2VsZi0+aW8uc3BlZWQgPD0gU01TQ19JUkNDMl9NQVhfU0lSX1NQRUVEOwogCkBAIC05NjEsMzAgKzk4MiwzMCBAQAogCXNwZWVkPSAxMTUyMDAwOwogCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CiAJbGFzdF9zcGVlZF93YXNfc2lyID0gMDsKLQlzbXNjX2lyY2NfZmlyX3N0YXJ0KHNlbGYpOwkKKwlzbXNjX2lyY2NfZmlyX3N0YXJ0KHNlbGYpOwogCSNlbmRpZgotCQotCWlmKHNlbGYtPmlvLnNwZWVkID09IDApCisKKwlpZiAoc2VsZi0+aW8uc3BlZWQgPT0gMCkKIAkJc21zY19pcmNjX3Npcl9zdGFydChzZWxmKTsKIAogCSNpZiAwCi0JaWYoIWxhc3Rfc3BlZWRfd2FzX3Npcikgc3BlZWQgPSBzZWxmLT5pby5zcGVlZDsKKwlpZiAoIWxhc3Rfc3BlZWRfd2FzX3Npcikgc3BlZWQgPSBzZWxmLT5pby5zcGVlZDsKIAkjZW5kaWYKIAotCWlmKHNlbGYtPmlvLnNwZWVkICE9IHNwZWVkKSBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX2Zvcl9zcGVlZChzZWxmLCBzcGVlZCk7CisJaWYgKHNlbGYtPmlvLnNwZWVkICE9IHNwZWVkKQorCQlzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX2Zvcl9zcGVlZChzZWxmLCBzcGVlZCk7CiAKIAlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOwotCQotCWlmKHNwZWVkIDw9IFNNU0NfSVJDQzJfTUFYX1NJUl9TUEVFRCkgewotCQlpZighbGFzdF9zcGVlZF93YXNfc2lyKSB7CisKKwlpZiAoc3BlZWQgPD0gU01TQ19JUkNDMl9NQVhfU0lSX1NQRUVEKSB7CisJCWlmICghbGFzdF9zcGVlZF93YXNfc2lyKSB7CiAJCQlzbXNjX2lyY2NfZmlyX3N0b3Aoc2VsZik7CiAJCQlzbXNjX2lyY2Nfc2lyX3N0YXJ0KHNlbGYpOwogCQl9Ci0JCXNtc2NfaXJjY19zZXRfc2lyX3NwZWVkKHNlbGYsIHNwZWVkKTsgCi0JfQotCWVsc2UgewotCQlpZihsYXN0X3NwZWVkX3dhc19zaXIpIHsKLQkJCSNpZiBTTVNDX0lSQ0MyX0NfU0lSX1NUT1AJCQorCQlzbXNjX2lyY2Nfc2V0X3Npcl9zcGVlZChzZWxmLCBzcGVlZCk7CisJfSBlbHNlIHsKKwkJaWYgKGxhc3Rfc3BlZWRfd2FzX3NpcikgeworCQkJI2lmIFNNU0NfSVJDQzJfQ19TSVJfU1RPUAogCQkJc21zY19pcmNjX3Npcl9zdG9wKHNlbGYpOwogCQkJI2VuZGlmCiAJCQlzbXNjX2lyY2NfZmlyX3N0YXJ0KHNlbGYpOwpAQCAtOTk0LDEzICsxMDE1LDEzIEBACiAJCSNpZiAwCiAJCXNlbGYtPnR4X2J1ZmYubGVuID0gMTA7CiAJCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKLQkJCi0JCXNtc2NfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UsIDQwMDApOworCisJCXNtc2NfaXJjY19kbWFfeG1pdChzZWxmLCA0MDAwKTsKIAkJI2VuZGlmCiAJCS8qIEJlIHJlYWR5IGZvciBpbmNvbWluZyBmcmFtZXMgKi8KLQkJc21zY19pcmNjX2RtYV9yZWNlaXZlKHNlbGYsIGlvYmFzZSk7CisJCXNtc2NfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKIAl9Ci0JCisKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CiAKQEAgLTEwMTAsMTAgKzEwMzEsOSBAQAogICogICAgU2V0IHNwZWVkIG9mIElyREEgcG9ydCB0byBzcGVjaWZpZWQgYmF1ZHJhdGUKICAqCiAgKi8KLXZvaWQgc21zY19pcmNjX3NldF9zaXJfc3BlZWQodm9pZCAqcHJpdiwgX191MzIgc3BlZWQpCit2b2lkIHNtc2NfaXJjY19zZXRfc2lyX3NwZWVkKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIF9fdTMyIHNwZWVkKQogewotCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBwcml2OwotCWludCBpb2Jhc2U7IAorCWludCBpb2Jhc2U7CiAJaW50IGZjcjsgICAgLyogRklGTyBjb250cm9sIHJlZyAqLwogCWludCBsY3I7ICAgIC8qIExpbmUgY29udHJvbCByZWcgKi8KIAlpbnQgZGl2aXNvcjsKQEAgLTEwMjIsMzggKzEwNDIsMzYgQEAKIAogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CiAJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7Ci0JCisKIAkvKiBVcGRhdGUgYWNjb3VudGluZyBmb3IgbmV3IHNwZWVkICovCiAJc2VsZi0+aW8uc3BlZWQgPSBzcGVlZDsKIAogCS8qIFR1cm4gb2ZmIGludGVycnVwdHMgKi8KLQlvdXRiKDAsIGlvYmFzZStVQVJUX0lFUik7IAorCW91dGIoMCwgaW9iYXNlICsgVUFSVF9JRVIpOwogCi0JZGl2aXNvciA9IFNNU0NfSVJDQzJfTUFYX1NJUl9TUEVFRC9zcGVlZDsKLQkKKwlkaXZpc29yID0gU01TQ19JUkNDMl9NQVhfU0lSX1NQRUVEIC8gc3BlZWQ7CisKIAlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTzsKIAotCS8qIAorCS8qCiAJICogVXNlIHRyaWdnZXIgbGV2ZWwgMSB0byBhdm9pZCAzIG1zLiB0aW1lb3V0IGRlbGF5IGF0IDk2MDAgYnBzLCBhbmQKIAkgKiBhbG1vc3QgMSw3IG1zIGF0IDE5MjAwIGJwcy4gQXQgc3BlZWRzIGFib3ZlIHRoYXQgd2UgY2FuIGp1c3QgZm9yZ2V0Ci0JICogYWJvdXQgdGhpcyB0aW1lb3V0IHNpbmNlIGl0IHdpbGwgYWx3YXlzIGJlIGZhc3QgZW5vdWdoLiAKKwkgKiBhYm91dCB0aGlzIHRpbWVvdXQgc2luY2UgaXQgd2lsbCBhbHdheXMgYmUgZmFzdCBlbm91Z2guCiAJICovCi0JaWYgKHNlbGYtPmlvLnNwZWVkIDwgMzg0MDApCi0JCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE7Ci0JZWxzZSAKLQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTQ7Ci0gICAgICAgIAorCWZjciB8PSBzZWxmLT5pby5zcGVlZCA8IDM4NDAwID8KKwkJVUFSVF9GQ1JfVFJJR0dFUl8xIDogVUFSVF9GQ1JfVFJJR0dFUl8xNDsKKwogCS8qIElyREEgcG9ydHMgdXNlIDhOMSAqLwogCWxjciA9IFVBUlRfTENSX1dMRU44OwotCQotCW91dGIoVUFSVF9MQ1JfRExBQiB8IGxjciwgaW9iYXNlK1VBUlRfTENSKTsgLyogU2V0IERMQUIgKi8KLQlvdXRiKGRpdmlzb3IgJiAweGZmLCAgICAgIGlvYmFzZStVQVJUX0RMTCk7IC8qIFNldCBzcGVlZCAqLwotCW91dGIoZGl2aXNvciA+PiA4LAkgIGlvYmFzZStVQVJUX0RMTSk7Ci0Jb3V0YihsY3IsCQkgIGlvYmFzZStVQVJUX0xDUik7IC8qIFNldCA4TjEJKi8KLQlvdXRiKGZjciwJCSAgaW9iYXNlK1VBUlRfRkNSKTsgLyogRW5hYmxlIEZJRk8ncyAqLworCisJb3V0YihVQVJUX0xDUl9ETEFCIHwgbGNyLCBpb2Jhc2UgKyBVQVJUX0xDUik7IC8qIFNldCBETEFCICovCisJb3V0YihkaXZpc29yICYgMHhmZiwgICAgICBpb2Jhc2UgKyBVQVJUX0RMTCk7IC8qIFNldCBzcGVlZCAqLworCW91dGIoZGl2aXNvciA+PiA4LAkgIGlvYmFzZSArIFVBUlRfRExNKTsKKwlvdXRiKGxjciwJCSAgaW9iYXNlICsgVUFSVF9MQ1IpOyAvKiBTZXQgOE4xICovCisJb3V0YihmY3IsCQkgIGlvYmFzZSArIFVBUlRfRkNSKTsgLyogRW5hYmxlIEZJRk8ncyAqLwogCiAJLyogVHVybiBvbiBpbnRlcnJ1cHMgKi8KLQlvdXRiKFVBUlRfSUVSX1JMU0l8VUFSVF9JRVJfUkRJfFVBUlRfSUVSX1RIUkksIGlvYmFzZStVQVJUX0lFUik7CisJb3V0YihVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJIHwgVUFSVF9JRVJfVEhSSSwgaW9iYXNlICsgVUFSVF9JRVIpOwogCiAJSVJEQV9ERUJVRygyLCAiJXMoKSBzcGVlZCBjaGFuZ2VkIHRvOiAlZFxuIiwgX19GVU5DVElPTl9fLCBzcGVlZCk7CiB9CkBAIC0xMDcwLDE1ICsxMDg4LDEyIEBACiAJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXMzMiBzcGVlZDsKLQlpbnQgaW9iYXNlOwogCWludCBtdHQ7CiAKIAlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKLQlzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCXNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKIAotCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOwotCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCiAJLyogTWFrZSBzdXJlIHRlc3Qgb2Ygc2VsZi0+aW8uc3BlZWQgJiBzcGVlZCBjaGFuZ2UgYXJlIGF0b21pYyAqLwpAQCAtMTA4NiwzMCArMTEwMSwzMSBAQAogCiAJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkIGFmdGVyIHRoaXMgZnJhbWUgKi8KIAlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKLQlpZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJaWYgKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkICYmIHNwZWVkICE9IC0xKSB7CiAJCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZSAqLwogCQlpZiAoIXNrYi0+bGVuKSB7CiAJCQkvKiBOb3RlIDogeW91IHNob3VsZCBtYWtlIHN1cmUgdGhhdCBzcGVlZCBjaGFuZ2VzCiAJCQkgKiBhcmUgbm90IGdvaW5nIHRvIGNvcnJ1cHQgYW55IG91dGdvaW5nIGZyYW1lLgogCQkJICogTG9vayBhdCBuc2MtaXJjYyBmb3IgdGhlIGdvcnkgZGV0YWlscyAtIEplYW4gSUkgKi8KLQkJCXNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc3BlZWQpOyAKKwkJCXNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc3BlZWQpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOwogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZQotCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJCX0KKworCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKIAl9Ci0JCisKIAltZW1jcHkoc2VsZi0+dHhfYnVmZi5oZWFkLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAogCXNlbGYtPnR4X2J1ZmYubGVuID0gc2tiLT5sZW47CiAJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOwotCQotCW10dCA9IGlyZGFfZ2V0X210dChza2IpOwkKKworCW10dCA9IGlyZGFfZ2V0X210dChza2IpOwogCWlmIChtdHQpIHsKIAkJaW50IGJvZnM7CiAKLQkJLyogCisJCS8qCiAJCSAqIENvbXB1dGUgaG93IG1hbnkgQk9GcyAoU1RBIG9yIFBBJ3MpIHdlIG5lZWQgdG8gd2FzdGUgdGhlCiAJCSAqIG1pbiB0dXJuIHRpbWUgZ2l2ZW4gdGhlIHNwZWVkIG9mIHRoZSBsaW5rLgogCQkgKi8KQEAgLTExMTcsMTEgKzExMzMsMTIgQEAKIAkJaWYgKGJvZnMgPiA0MDk1KQogCQkJYm9mcyA9IDQwOTU7CiAKLQkJc21zY19pcmNjX2RtYV94bWl0KHNlbGYsIGlvYmFzZSwgYm9mcyk7CisJCXNtc2NfaXJjY19kbWFfeG1pdChzZWxmLCBib2ZzKTsKIAl9IGVsc2UgewogCQkvKiBUcmFuc21pdCBmcmFtZSAqLwotCQlzbXNjX2lyY2NfZG1hX3htaXQoc2VsZiwgaW9iYXNlLCAwKTsKKwkJc21zY19pcmNjX2RtYV94bWl0KHNlbGYsIDApOwogCX0KKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKQEAgLTExMjksNDMgKzExNDYsNDQgQEAKIH0KIAogLyoKLSAqIEZ1bmN0aW9uIHNtc2NfaXJjY19kbWFfeG1pdCAoc2VsZiwgaW9iYXNlKQorICogRnVuY3Rpb24gc21zY19pcmNjX2RtYV94bWl0IChzZWxmLCBib2ZzKQogICoKICAqICAgIFRyYW5zbWl0IGRhdGEgdXNpbmcgRE1BCiAgKgogICovCi1zdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3htaXQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSwgaW50IGJvZnMpCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3htaXQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGJvZnMpCiB7CisJaW50IGlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOwogCXU4IGN0cmw7CiAKIAlJUkRBX0RFQlVHKDMsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKICNpZiAxCiAJLyogRGlzYWJsZSBSeCAqLwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKLQlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX0xDUl9CKTsKKwlvdXRiKDB4MDAsIGlvYmFzZSArIElSQ0NfTENSX0IpOwogI2VuZGlmCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOwotCW91dGIoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdCKSAmIH5JUkNDX0NGR0JfRE1BX0VOQUJMRSwgCi0JICAgICBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisJb3V0YihpbmIoaW9iYXNlICsgSVJDQ19TQ0VfQ0ZHQikgJiB+SVJDQ19DRkdCX0RNQV9FTkFCTEUsCisJICAgICBpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKTsKIAogCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CiAKIAkvKiBTZXQgQk9GIGFkZGl0aW9uYWwgY291bnQgZm9yIGdlbmVyYXRpbmcgdGhlIG1pbiB0dXJuIHRpbWUgKi8KIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgNCk7Ci0Jb3V0Yihib2ZzICYgMHhmZiwgaW9iYXNlK0lSQ0NfQk9GX0NPVU5UX0xPKTsKLQljdHJsID0gaW5iKGlvYmFzZStJUkNDX0NPTlRST0wpICYgMHhmMDsKLQlvdXRiKGN0cmwgfCAoKGJvZnMgPj4gOCkgJiAweDBmKSwgaW9iYXNlK0lSQ0NfQk9GX0NPVU5UX0hJKTsKKwlvdXRiKGJvZnMgJiAweGZmLCBpb2Jhc2UgKyBJUkNDX0JPRl9DT1VOVF9MTyk7CisJY3RybCA9IGluYihpb2Jhc2UgKyBJUkNDX0NPTlRST0wpICYgMHhmMDsKKwlvdXRiKGN0cmwgfCAoKGJvZnMgPj4gOCkgJiAweDBmKSwgaW9iYXNlICsgSVJDQ19CT0ZfQ09VTlRfSEkpOwogCiAJLyogU2V0IG1heCBUeCBmcmFtZSBzaXplICovCi0Jb3V0YihzZWxmLT50eF9idWZmLmxlbiA+PiA4LCBpb2Jhc2UrSVJDQ19UWF9TSVpFX0hJKTsKLQlvdXRiKHNlbGYtPnR4X2J1ZmYubGVuICYgMHhmZiwgaW9iYXNlK0lSQ0NfVFhfU0laRV9MTyk7CisJb3V0YihzZWxmLT50eF9idWZmLmxlbiA+PiA4LCBpb2Jhc2UgKyBJUkNDX1RYX1NJWkVfSEkpOworCW91dGIoc2VsZi0+dHhfYnVmZi5sZW4gJiAweGZmLCBpb2Jhc2UgKyBJUkNDX1RYX1NJWkVfTE8pOwogCiAJLypvdXRiKFVBUlRfTUNSX09VVDIsIHNlbGYtPmlvLnNpcl9iYXNlICsgVUFSVF9NQ1IpOyovCi0JCisKIAkvKiBFbmFibGUgYnVyc3QgbW9kZSBjaGlwIFR4IERNQSAqLwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKLQlvdXRiKGluYihpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgfCBJUkNDX0NGR0JfRE1BX0VOQUJMRSB8Ci0JICAgICBJUkNDX0NGR0JfRE1BX0JVUlNULCBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisJb3V0YihpbmIoaW9iYXNlICsgSVJDQ19TQ0VfQ0ZHQikgfCBJUkNDX0NGR0JfRE1BX0VOQUJMRSB8CisJICAgICBJUkNDX0NGR0JfRE1BX0JVUlNULCBpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKTsKIAogCS8qIFNldHVwIERNQSBjb250cm9sbGVyIChtdXN0IGJlIGRvbmUgYWZ0ZXIgZW5hYmxpbmcgY2hpcCBETUEpICovCiAJaXJkYV9zZXR1cF9kbWEoc2VsZi0+aW8uZG1hLCBzZWxmLT50eF9idWZmX2RtYSwgc2VsZi0+dHhfYnVmZi5sZW4sCkBAIC0xMTc0LDUwICsxMTkyLDUyIEBACiAJLyogRW5hYmxlIGludGVycnVwdCAqLwogCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCW91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FIHwgSVJDQ19JRVJfRU9NLCBpb2Jhc2UrSVJDQ19JRVIpOwotCW91dGIoSVJDQ19NQVNURVJfSU5UX0VOLCBpb2Jhc2UrSVJDQ19NQVNURVIpOwotCQorCW91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FIHwgSVJDQ19JRVJfRU9NLCBpb2Jhc2UgKyBJUkNDX0lFUik7CisJb3V0YihJUkNDX01BU1RFUl9JTlRfRU4sIGlvYmFzZSArIElSQ0NfTUFTVEVSKTsKKwogCS8qIEVuYWJsZSB0cmFuc21pdCAqLwotCW91dGIoSVJDQ19MQ1JfQl9TQ0VfVFJBTlNNSVQgfCBJUkNDX0xDUl9CX1NJUF9FTkFCTEUsIGlvYmFzZStJUkNDX0xDUl9CKTsKKwlvdXRiKElSQ0NfTENSX0JfU0NFX1RSQU5TTUlUIHwgSVJDQ19MQ1JfQl9TSVBfRU5BQkxFLCBpb2Jhc2UgKyBJUkNDX0xDUl9CKTsKIH0KIAogLyoKICAqIEZ1bmN0aW9uIHNtc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZSAoc2VsZikKICAqCi0gKiAgICBUaGUgdHJhbnNmZXIgb2YgYSBmcmFtZSBpbiBmaW5pc2hlZC4gVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgYmUgY2FsbGVkIAorICogICAgVGhlIHRyYW5zZmVyIG9mIGEgZnJhbWUgaW4gZmluaXNoZWQuIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZAogICogICAgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyCiAgKgogICovCi1zdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSkKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQogeworCWludCBpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwogCUlSREFfREVCVUcoMywgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogI2lmIDAKIAkvKiBEaXNhYmxlIFR4ICovCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCW91dGIoMHgwMCwgaW9iYXNlK0lSQ0NfTENSX0IpOworCW91dGIoMHgwMCwgaW9iYXNlICsgSVJDQ19MQ1JfQik7CiAjZW5kaWYKLQlyZWdpc3Rlcl9iYW5rKHNlbGYtPmlvLmZpcl9iYXNlLCAxKTsKLQlvdXRiKGluYihzZWxmLT5pby5maXJfYmFzZStJUkNDX1NDRV9DRkdCKSAmIH5JUkNDX0NGR0JfRE1BX0VOQUJMRSwKLQkgICAgIHNlbGYtPmlvLmZpcl9iYXNlK0lSQ0NfU0NFX0NGR0IpOworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKKwlvdXRiKGluYihpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKSAmIH5JUkNDX0NGR0JfRE1BX0VOQUJMRSwKKwkgICAgIGlvYmFzZSArIElSQ0NfU0NFX0NGR0IpOwogCiAJLyogQ2hlY2sgZm9yIHVuZGVycnVuISAqLwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKLQlpZiAoaW5iKGlvYmFzZStJUkNDX0xTUikgJiBJUkNDX0xTUl9VTkRFUlJVTikgeworCWlmIChpbmIoaW9iYXNlICsgSVJDQ19MU1IpICYgSVJDQ19MU1JfVU5ERVJSVU4pIHsKIAkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCXNlbGYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CiAKIAkJLyogUmVzZXQgZXJyb3IgY29uZGl0aW9uICovCiAJCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKLQkJb3V0YihJUkNDX01BU1RFUl9FUlJPUl9SRVNFVCwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKLQkJb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19NQVNURVIpOworCQlvdXRiKElSQ0NfTUFTVEVSX0VSUk9SX1JFU0VULCBpb2Jhc2UgKyBJUkNDX01BU1RFUik7CisJCW91dGIoMHgwMCwgaW9iYXNlICsgSVJDQ19NQVNURVIpOwogCX0gZWxzZSB7CiAJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gIHNlbGYtPnR4X2J1ZmYubGVuOworCQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKIAl9CiAKIAkvKiBDaGVjayBpZiBpdCdzIHRpbWUgdG8gY2hhbmdlIHRoZSBzcGVlZCAqLwogCWlmIChzZWxmLT5uZXdfc3BlZWQpIHsKLQkJc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzZWxmLT5uZXdfc3BlZWQpOwkJCisJCXNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+bmV3X3NwZWVkKTsKIAkJc2VsZi0+bmV3X3NwZWVkID0gMDsKIAl9CiAKQEAgLTEyMzEsMzEgKzEyNTEsMzIgQEAKICAqICAgIGlmIGl0IHN0YXJ0cyB0byByZWNlaXZlIGEgZnJhbWUuCiAgKgogICovCi1zdGF0aWMgaW50IHNtc2NfaXJjY19kbWFfcmVjZWl2ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKSAKK3N0YXRpYyBpbnQgc21zY19pcmNjX2RtYV9yZWNlaXZlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCiB7CisJaW50IGlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOwogI2lmIDAKIAkvKiBUdXJuIG9mZiBjaGlwIERNQSAqLwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKLQlvdXRiKGluYihpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgJiB+SVJDQ19DRkdCX0RNQV9FTkFCTEUsIAotCSAgICAgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOworCW91dGIoaW5iKGlvYmFzZSArIElSQ0NfU0NFX0NGR0IpICYgfklSQ0NfQ0ZHQl9ETUFfRU5BQkxFLAorCSAgICAgaW9iYXNlICsgSVJDQ19TQ0VfQ0ZHQik7CiAjZW5kaWYKLQkKKwogCS8qIERpc2FibGUgVHggKi8KIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7Ci0Jb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19MQ1JfQik7CisJb3V0YigweDAwLCBpb2Jhc2UgKyBJUkNDX0xDUl9CKTsKIAogCS8qIFR1cm4gb2ZmIGNoaXAgRE1BICovCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOwotCW91dGIoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdCKSAmIH5JUkNDX0NGR0JfRE1BX0VOQUJMRSwgCi0JICAgICBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisJb3V0YihpbmIoaW9iYXNlICsgSVJDQ19TQ0VfQ0ZHQikgJiB+SVJDQ19DRkdCX0RNQV9FTkFCTEUsCisJICAgICBpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKTsKIAogCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1JFQ1Y7CiAJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOwogCiAJLyogU2V0IG1heCBSeCBmcmFtZSBzaXplICovCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDQpOwotCW91dGIoKDIwNTAgPj4gOCkgJiAweDBmLCBpb2Jhc2UrSVJDQ19SWF9TSVpFX0hJKTsKLQlvdXRiKDIwNTAgJiAweGZmLCBpb2Jhc2UrSVJDQ19SWF9TSVpFX0xPKTsKKwlvdXRiKCgyMDUwID4+IDgpICYgMHgwZiwgaW9iYXNlICsgSVJDQ19SWF9TSVpFX0hJKTsKKwlvdXRiKDIwNTAgJiAweGZmLCBpb2Jhc2UgKyBJUkNDX1JYX1NJWkVfTE8pOwogCiAJLyogU2V0dXAgRE1BIGNvbnRyb2xsZXIgKi8KIAlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsIHNlbGYtPnJ4X2J1ZmZfZG1hLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLApAQCAtMTI2Myw4MyArMTI4NCw4MyBAQAogCiAJLyogRW5hYmxlIGJ1cnN0IG1vZGUgY2hpcCBSeCBETUEgKi8KIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMSk7Ci0Jb3V0YihpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0IpIHwgSVJDQ19DRkdCX0RNQV9FTkFCTEUgfCAKLQkgICAgIElSQ0NfQ0ZHQl9ETUFfQlVSU1QsIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKwlvdXRiKGluYihpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKSB8IElSQ0NfQ0ZHQl9ETUFfRU5BQkxFIHwKKwkgICAgIElSQ0NfQ0ZHQl9ETUFfQlVSU1QsIGlvYmFzZSArIElSQ0NfU0NFX0NGR0IpOwogCiAJLyogRW5hYmxlIGludGVycnVwdCAqLwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKLQlvdXRiKElSQ0NfSUVSX0FDVElWRV9GUkFNRSB8IElSQ0NfSUVSX0VPTSwgaW9iYXNlK0lSQ0NfSUVSKTsKLQlvdXRiKElSQ0NfTUFTVEVSX0lOVF9FTiwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKLQorCW91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FIHwgSVJDQ19JRVJfRU9NLCBpb2Jhc2UgKyBJUkNDX0lFUik7CisJb3V0YihJUkNDX01BU1RFUl9JTlRfRU4sIGlvYmFzZSArIElSQ0NfTUFTVEVSKTsKIAogCS8qIEVuYWJsZSByZWNlaXZlciAqLwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKLQlvdXRiKElSQ0NfTENSX0JfU0NFX1JFQ0VJVkUgfCBJUkNDX0xDUl9CX1NJUF9FTkFCTEUsIAotCSAgICAgaW9iYXNlK0lSQ0NfTENSX0IpOwotCQorCW91dGIoSVJDQ19MQ1JfQl9TQ0VfUkVDRUlWRSB8IElSQ0NfTENSX0JfU0lQX0VOQUJMRSwKKwkgICAgIGlvYmFzZSArIElSQ0NfTENSX0IpOworCiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBGdW5jdGlvbiBzbXNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZiwgaW9iYXNlKQorICogRnVuY3Rpb24gc21zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHNlbGYpCiAgKgogICogICAgRmluaXNoZWQgd2l0aCByZWNlaXZpbmcgZnJhbWVzCiAgKgogICovCi1zdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSkKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGxlbiwgbXNnY250LCBsc3I7Ci0JCisJaW50IGlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCQorCiAJSVJEQV9ERUJVRygzLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAjaWYgMAogCS8qIERpc2FibGUgUnggKi8KIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7Ci0Jb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19MQ1JfQik7CisJb3V0YigweDAwLCBpb2Jhc2UgKyBJUkNDX0xDUl9CKTsKICNlbmRpZgogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKLQlvdXRiKGluYihpb2Jhc2UrSVJDQ19MU0FSKSAmIH5JUkNDX0xTQVJfQUREUkVTU19NQVNLLCBpb2Jhc2UrSVJDQ19MU0FSKTsKLQlsc3I9IGluYihpb2Jhc2UrSVJDQ19MU1IpOwotCW1zZ2NudCA9IGluYihpb2Jhc2UrSVJDQ19MQ1JfQikgJiAweDA4OworCW91dGIoaW5iKGlvYmFzZSArIElSQ0NfTFNBUikgJiB+SVJDQ19MU0FSX0FERFJFU1NfTUFTSywgaW9iYXNlICsgSVJDQ19MU0FSKTsKKwlsc3I9IGluYihpb2Jhc2UgKyBJUkNDX0xTUik7CisJbXNnY250ID0gaW5iKGlvYmFzZSArIElSQ0NfTENSX0IpICYgMHgwODsKIAogCUlSREFfREVCVUcoMiwgIiVzOiBkbWEgY291bnQgPSAlZFxuIiwgX19GVU5DVElPTl9fLAogCQkgICBnZXRfZG1hX3Jlc2lkdWUoc2VsZi0+aW8uZG1hKSk7CiAKIAlsZW4gPSBzZWxmLT5yeF9idWZmLnRydWVzaXplIC0gZ2V0X2RtYV9yZXNpZHVlKHNlbGYtPmlvLmRtYSk7CiAKLQkvKiBMb29rIGZvciBlcnJvcnMgCi0JICovCQotCi0JaWYobHNyICYgKElSQ0NfTFNSX0ZSQU1FX0VSUk9SIHwgSVJDQ19MU1JfQ1JDX0VSUk9SIHwgSVJDQ19MU1JfU0laRV9FUlJPUikpIHsKKwkvKiBMb29rIGZvciBlcnJvcnMgKi8KKwlpZiAobHNyICYgKElSQ0NfTFNSX0ZSQU1FX0VSUk9SIHwgSVJDQ19MU1JfQ1JDX0VSUk9SIHwgSVJDQ19MU1JfU0laRV9FUlJPUikpIHsKIAkJc2VsZi0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCWlmKGxzciAmIElSQ0NfTFNSX0ZSQU1FX0VSUk9SKSBzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKLQkJaWYobHNyICYgSVJDQ19MU1JfQ1JDX0VSUk9SKSBzZWxmLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7Ci0JCWlmKGxzciAmIElSQ0NfTFNSX1NJWkVfRVJST1IpIHNlbGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKLQkJaWYobHNyICYgKElSQ0NfTFNSX1VOREVSUlVOIHwgSVJDQ19MU1JfT1ZFUlJVTikpIHNlbGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJaWYgKGxzciAmIElSQ0NfTFNSX0ZSQU1FX0VSUk9SKQorCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWlmIChsc3IgJiBJUkNDX0xTUl9DUkNfRVJST1IpCisJCQlzZWxmLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWlmIChsc3IgJiBJUkNDX0xTUl9TSVpFX0VSUk9SKQorCQkJc2VsZi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZiAobHNyICYgKElSQ0NfTFNSX1VOREVSUlVOIHwgSVJDQ19MU1JfT1ZFUlJVTikpCisJCQlzZWxmLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCXJldHVybjsKIAl9Ci0JLyogUmVtb3ZlIENSQyAqLwotCWlmIChzZWxmLT5pby5zcGVlZCA8IDQwMDAwMDApCi0JCWxlbiAtPSAyOwotCWVsc2UKLQkJbGVuIC09IDQ7CiAKLQlpZiAoKGxlbiA8IDIpIHx8IChsZW4gPiAyMDUwKSkgeworCS8qIFJlbW92ZSBDUkMgKi8KKwlsZW4gLT0gc2VsZi0+aW8uc3BlZWQgPCA0MDAwMDAwID8gMiA6IDQ7CisKKwlpZiAobGVuIDwgMiB8fCBsZW4gPiAyMDUwKSB7CiAJCUlSREFfV0FSTklORygiJXMoKSwgYm9ndXMgbGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CiAJCXJldHVybjsKIAl9CiAJSVJEQV9ERUJVRygyLCAiJXM6IG1zZ2NudCA9ICVkLCBsZW49JWRcbiIsIF9fRlVOQ1RJT05fXywgbXNnY250LCBsZW4pOwogCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihsZW4rMSk7Ci0JaWYgKCFza2IpICB7CisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAxKTsKKwlpZiAoIXNrYikgewogCQlJUkRBX1dBUk5JTkcoIiVzKCksIG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBmcmFtZS5cbiIsCiAJCQkgICAgIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybjsKLQl9CQkJCisJfQogCS8qIE1ha2Ugc3VyZSBJUCBoZWFkZXIgZ2V0cyBhbGlnbmVkICovCi0Jc2tiX3Jlc2VydmUoc2tiLCAxKTsgCisJc2tiX3Jlc2VydmUoc2tiLCAxKTsKIAogCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4pOwogCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKQEAgLTEzNTcsNyArMTM3OCw3IEBACiAgKiAgICBSZWNlaXZlIG9uZSBmcmFtZSBmcm9tIHRoZSBpbmZyYXJlZCBwb3J0CiAgKgogICovCi1zdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2lyX3JlY2VpdmUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikgCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2lyX3JlY2VpdmUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKIHsKIAlpbnQgYm9ndXNjb3VudCA9IDA7CiAJaW50IGlvYmFzZTsKQEAgLTEzNjYsMjAgKzEzODcsMjAgQEAKIAogCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOwogCi0JLyogIAotCSAqIFJlY2VpdmUgYWxsIGNoYXJhY3RlcnMgaW4gUnggRklGTywgdW53cmFwIGFuZCB1bnN0dWZmIHRoZW0uIAotICAgICAgICAgKiBhc3luY191bndyYXBfY2hhciB3aWxsIGRlbGl2ZXIgYWxsIGZvdW5kIGZyYW1lcyAgCisJLyoKKwkgKiBSZWNlaXZlIGFsbCBjaGFyYWN0ZXJzIGluIFJ4IEZJRk8sIHVud3JhcCBhbmQgdW5zdHVmZiB0aGVtLgorICAgICAgICAgKiBhc3luY191bndyYXBfY2hhciB3aWxsIGRlbGl2ZXIgYWxsIGZvdW5kIGZyYW1lcwogCSAqLwogCWRvIHsKLQkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLCAKLQkJCQkgIGluYihpb2Jhc2UrVUFSVF9SWCkpOworCQlhc3luY191bndyYXBfY2hhcihzZWxmLT5uZXRkZXYsICZzZWxmLT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsCisJCQkJICBpbmIoaW9iYXNlICsgVUFSVF9SWCkpOwogCiAJCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBzdGF5IGhlcmUgdG8gbG9uZyAqLwogCQlpZiAoYm9ndXNjb3VudCsrID4gMzIpIHsKIAkJCUlSREFfREVCVUcoMiwgIiVzKCksIGJyZWFraW5nIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJCWJyZWFrOwogCQl9Ci0JfSB3aGlsZSAoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9EUik7CQorCX0gd2hpbGUgKGluYihpb2Jhc2UgKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9EUik7CiB9CiAKIApAQCAtMTM5NywxOCArMTQxOCwxOSBAQAogCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOwogCiAJaWYgKGRldiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwKIAkJICAgICAgIGRyaXZlcl9uYW1lLCBpcnEpOwogCQlnb3RvIGlycV9yZXQ7CiAJfQotCXNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisKKwlzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiBJUlFfTk9ORTspOwogCiAJLyogU2VyaWFsaXNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpbiB2YXJpb3VzIENQVXMsIHN0b3AgVHggcGF0aCAqLwotCXNwaW5fbG9jaygmc2VsZi0+bG9jayk7CQorCXNwaW5fbG9jaygmc2VsZi0+bG9jayk7CiAKIAkvKiBDaGVjayBpZiB3ZSBzaG91bGQgdXNlIHRoZSBTSVIgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQlpZiAoc2VsZi0+aW8uc3BlZWQgPD0gIFNNU0NfSVJDQzJfTUFYX1NJUl9TUEVFRCkgeworCWlmIChzZWxmLT5pby5zcGVlZCA8PSBTTVNDX0lSQ0MyX01BWF9TSVJfU1BFRUQpIHsKIAkJcmV0ID0gc21zY19pcmNjX2ludGVycnVwdF9zaXIoZGV2KTsKIAkJZ290byBpcnFfcmV0X3VubG9jazsKIAl9CkBAIC0xNDE2LDI1ICsxNDM4LDI1IEBACiAJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CiAKIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7Ci0JaWlyID0gaW5iKGlvYmFzZStJUkNDX0lJUik7Ci0JaWYgKGlpciA9PSAwKSAKKwlpaXIgPSBpbmIoaW9iYXNlICsgSVJDQ19JSVIpOworCWlmIChpaXIgPT0gMCkKIAkJZ290byBpcnFfcmV0X3VubG9jazsKIAlyZXQgPSBJUlFfSEFORExFRDsKIAogCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLwotCW91dGIoMCwgaW9iYXNlK0lSQ0NfSUVSKTsKLQlsY3JhID0gaW5iKGlvYmFzZStJUkNDX0xDUl9BKTsKLQlsc3IgPSBpbmIoaW9iYXNlK0lSQ0NfTFNSKTsKLQkKKwlvdXRiKDAsIGlvYmFzZSArIElSQ0NfSUVSKTsKKwlsY3JhID0gaW5iKGlvYmFzZSArIElSQ0NfTENSX0EpOworCWxzciA9IGluYihpb2Jhc2UgKyBJUkNDX0xTUik7CisKIAlJUkRBX0RFQlVHKDIsICIlcygpLCBpaXIgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgaWlyKTsKIAogCWlmIChpaXIgJiBJUkNDX0lJUl9FT00pIHsKIAkJaWYgKHNlbGYtPmlvLmRpcmVjdGlvbiA9PSBJT19SRUNWKQotCQkJc21zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHNlbGYsIGlvYmFzZSk7CisJCQlzbXNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZik7CiAJCWVsc2UKLQkJCXNtc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzZWxmLCBpb2Jhc2UpOwotCQkKLQkJc21zY19pcmNjX2RtYV9yZWNlaXZlKHNlbGYsIGlvYmFzZSk7CisJCQlzbXNjX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc2VsZik7CisKKwkJc21zY19pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOwogCX0KIAogCWlmIChpaXIgJiBJUkNDX0lJUl9BQ1RJVkVfRlJBTUUpIHsKQEAgLTE0NDQsNyArMTQ2Niw3IEBACiAJLyogRW5hYmxlIGludGVycnVwdHMgYWdhaW4gKi8KIAogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKLQlvdXRiKElSQ0NfSUVSX0FDVElWRV9GUkFNRXxJUkNDX0lFUl9FT00sIGlvYmFzZStJUkNDX0lFUik7CisJb3V0YihJUkNDX0lFUl9BQ1RJVkVfRlJBTUUgfCBJUkNDX0lFUl9FT00sIGlvYmFzZSArIElSQ0NfSUVSKTsKIAogIGlycV9yZXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZzZWxmLT5sb2NrKTsKQEAgLTE0NTksNyArMTQ4MSw3IEBACiAgKi8KIHN0YXRpYyBpcnFyZXR1cm5fdCBzbXNjX2lyY2NfaW50ZXJydXB0X3NpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSBkZXYtPnByaXY7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGJvZ3VzY291bnQgPSAwOwogCWludCBpb2Jhc2U7CiAJaW50IGlpciwgbHNyOwpAQCAtMTQ2OSwxNCArMTQ5MSwxNCBAQAogCiAJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CiAKLQlpaXIgPSBpbmIoaW9iYXNlK1VBUlRfSUlSKSAmIFVBUlRfSUlSX0lEOworCWlpciA9IGluYihpb2Jhc2UgKyBVQVJUX0lJUikgJiBVQVJUX0lJUl9JRDsKIAlpZiAoaWlyID09IDApCiAJCXJldHVybiBJUlFfTk9ORTsKIAl3aGlsZSAoaWlyKSB7CiAJCS8qIENsZWFyIGludGVycnVwdCAqLwotCQlsc3IgPSBpbmIoaW9iYXNlK1VBUlRfTFNSKTsKKwkJbHNyID0gaW5iKGlvYmFzZSArIFVBUlRfTFNSKTsKIAotCQlJUkRBX0RFQlVHKDQsICIlcygpLCBpaXI9JTAyeCwgbHNyPSUwMngsIGlvYmFzZT0lI3hcbiIsIAorCQlJUkRBX0RFQlVHKDQsICIlcygpLCBpaXI9JTAyeCwgbHNyPSUwMngsIGlvYmFzZT0lI3hcbiIsCiAJCQkgICAgX19GVU5DVElPTl9fLCBpaXIsIGxzciwgaW9iYXNlKTsKIAogCQlzd2l0Y2ggKGlpcikgewpAQCAtMTQ5NiwxMyArMTUxOCwxMyBAQAogCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5oYW5kbGVkIElJUj0lI3hcbiIsCiAJCQkJICAgX19GVU5DVElPTl9fLCBpaXIpOwogCQkJYnJlYWs7Ci0JCX0gCi0JCQorCQl9CisKIAkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHN0YXkgaGVyZSB0byBsb25nICovCiAJCWlmIChib2d1c2NvdW50KysgPiAxMDApCiAJCQlicmVhazsKIAotIAkgICAgICAgIGlpciA9IGluYihpb2Jhc2UgKyBVQVJUX0lJUikgJiBVQVJUX0lJUl9JRDsKKwkgICAgICAgIGlpciA9IGluYihpb2Jhc2UgKyBVQVJUX0lJUikgJiBVQVJUX0lJUl9JRDsKIAl9CiAJLypzcGluX3VubG9jaygmc2VsZi0+bG9jayk7Ki8KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0xNTI5LDcgKzE1NTEsNyBAQAogCQkgICBnZXRfZG1hX3Jlc2lkdWUoc2VsZi0+aW8uZG1hKSk7CiAKIAlzdGF0dXMgPSAoc2VsZi0+cnhfYnVmZi5zdGF0ZSAhPSBPVVRTSURFX0ZSQU1FKTsKLQkKKwogCXJldHVybiBzdGF0dXM7CiB9CiAjZW5kaWYgLyogdW51c2VkICovCkBAIC0xNTQ0LDE5ICsxNTY2LDE2IEBACiBzdGF0aWMgaW50IHNtc2NfaXJjY19uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7Ci0JaW50IGlvYmFzZTsKIAljaGFyIGh3bmFtZVsxNl07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCQotCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKLQlzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OwotCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKLQkKLQlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKIAotCWlmIChyZXF1ZXN0X2lycShzZWxmLT5pby5pcnEsIHNtc2NfaXJjY19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKworCWlmIChyZXF1ZXN0X2lycShzZWxmLT5pby5pcnEsIHNtc2NfaXJjY19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwKIAkJCSh2b2lkICopIGRldikpIHsKIAkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIGFsbG9jYXRlIGlycT0lZFxuIiwKIAkJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+aW8uaXJxKTsKQEAgLTE1NjgsMTQgKzE1ODcsMTQgQEAKIAlzZWxmLT5pby5zcGVlZCA9IDA7CiAJc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBTTVNDX0lSQ0MyX0NfSVJEQV9GQUxMQkFDS19TUEVFRCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOwotCQorCiAJLyogR2l2ZSBzZWxmIGEgaGFyZHdhcmUgbmFtZSAqLwogCS8qIEl0IHdvdWxkIGJlIGNvb2wgdG8gb2ZmZXIgdGhlIGNoaXAgcmV2aXNpb24gaGVyZSAtIEplYW4gSUkgKi8KIAlzcHJpbnRmKGh3bmFtZSwgIlNNU0MgQCAweCUwM3giLCBzZWxmLT5pby5maXJfYmFzZSk7CiAKLQkvKiAKKwkvKgogCSAqIE9wZW4gbmV3IElyTEFQIGxheWVyIGluc3RhbmNlLCBub3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZQotCSAqIGluaXRpYWxpemVkIHByb3Blcmx5IAorCSAqIGluaXRpYWxpemVkIHByb3Blcmx5CiAJICovCiAJc2VsZi0+aXJsYXAgPSBpcmxhcF9vcGVuKGRldiwgJnNlbGYtPnFvcywgaHduYW1lKTsKIApAQCAtMTU5MCw3ICsxNjA5LDcgQEAKIAkJCSAgICAgX19GVU5DVElPTl9fLCBzZWxmLT5pby5kbWEpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9Ci0JCisKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCiAJcmV0dXJuIDA7CkBAIC0xNjA1LDczICsxNjI0LDUzIEBACiBzdGF0aWMgaW50IHNtc2NfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmOwotCWludCBpb2Jhc2U7CiAKIAlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQkKKwogCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKLQlzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OwkKKwlzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7Ci0JCi0JaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CiAKIAkvKiBTdG9wIGRldmljZSAqLwogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQkKKwogCS8qIFN0b3AgYW5kIHJlbW92ZSBpbnN0YW5jZSBvZiBJckxBUCAqLwogCWlmIChzZWxmLT5pcmxhcCkKIAkJaXJsYXBfY2xvc2Uoc2VsZi0+aXJsYXApOwogCXNlbGYtPmlybGFwID0gTlVMTDsKIAogCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgZGV2KTsKLQogCWRpc2FibGVfZG1hKHNlbGYtPmlvLmRtYSk7Ci0KIAlmcmVlX2RtYShzZWxmLT5pby5kbWEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgc21zY19pcmNjX3N1c3BlbmQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3N0YXRpYyBpbnQgc21zY19pcmNjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHUzMiBsZXZlbCkKIHsKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKIAlJUkRBX01FU1NBR0UoIiVzLCBTdXNwZW5kaW5nXG4iLCBkcml2ZXJfbmFtZSk7CiAKLQlpZiAoc2VsZi0+aW8uc3VzcGVuZGVkKQotCQlyZXR1cm47CisJaWYgKGxldmVsID09IFNVU1BFTkRfRElTQUJMRSAmJiAhc2VsZi0+aW8uc3VzcGVuZGVkKSB7CisJCXNtc2NfaXJjY19uZXRfY2xvc2Uoc2VsZi0+bmV0ZGV2KTsKKwkJc2VsZi0+aW8uc3VzcGVuZGVkID0gMTsKKwl9CiAKLQlzbXNjX2lyY2NfbmV0X2Nsb3NlKHNlbGYtPm5ldGRldik7Ci0KLQlzZWxmLT5pby5zdXNwZW5kZWQgPSAxOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzbXNjX2lyY2Nfd2FrZXVwKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCitzdGF0aWMgaW50IHNtc2NfaXJjY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCiB7Ci0JaWYgKCFzZWxmLT5pby5zdXNwZW5kZWQpCi0JCXJldHVybjsKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQkvKiBUaGUgY29kZSB3YXMgZG9pbmcgYSAiY2xpKCkiIGhlcmUsIGJ1dCB0aGlzIGNhbid0IGJlIHJpZ2h0LgotCSAqIElmIHlvdSBuZWVkIHByb3RlY3Rpb24sIGRvIGl0IGluIG5ldF9vcGVuIHdpdGggYSBzcGlubG9jawotCSAqIG9yIGdpdmUgYSBnb29kIHJlYXNvbi4gLSBKZWFuIElJICovCisJaWYgKGxldmVsID09IFJFU1VNRV9FTkFCTEUgJiYgc2VsZi0+aW8uc3VzcGVuZGVkKSB7CiAKLQlzbXNjX2lyY2NfbmV0X29wZW4oc2VsZi0+bmV0ZGV2KTsKLQkKLQlJUkRBX01FU1NBR0UoIiVzLCBXYWtpbmcgdXBcbiIsIGRyaXZlcl9uYW1lKTsKLX0KKwkJc21zY19pcmNjX25ldF9vcGVuKHNlbGYtPm5ldGRldik7CisJCXNlbGYtPmlvLnN1c3BlbmRlZCA9IDA7CiAKLXN0YXRpYyBpbnQgc21zY19pcmNjX3BtcHJvYyhzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKQotewotICAgICAgICBzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IqKSBkZXYtPmRhdGE7Ci0gICAgICAgIGlmIChzZWxmKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChycXN0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBQTV9TVVNQRU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgc21zY19pcmNjX3N1c3BlbmQoc2VsZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFBNX1JFU1VNRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNtc2NfaXJjY193YWtldXAoc2VsZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJSVJEQV9NRVNTQUdFKCIlcywgV2FraW5nIHVwXG4iLCBkcml2ZXJfbmFtZSk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xNjkwLDEwICsxNjg5LDcgQEAKIAogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CiAKLQlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKLQotCWlmIChzZWxmLT5wbWRldikKLQkJcG1fdW5yZWdpc3RlcihzZWxmLT5wbWRldik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc2VsZi0+cGxkZXYpOwogCiAJLyogUmVtb3ZlIG5ldGRldmljZSAqLwogCXVucmVnaXN0ZXJfbmV0ZGV2KHNlbGYtPm5ldGRldik7CkBAIC0xNzAyLDE1ICsxNjk4LDE2IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKIAogCS8qIFN0b3AgaW50ZXJydXB0cyAqLworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKLQlvdXRiKDAsIGlvYmFzZStJUkNDX0lFUik7Ci0Jb3V0YihJUkNDX01BU1RFUl9SRVNFVCwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKLQlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX01BU1RFUik7CisJb3V0YigwLCBpb2Jhc2UgKyBJUkNDX0lFUik7CisJb3V0YihJUkNDX01BU1RFUl9SRVNFVCwgaW9iYXNlICsgSVJDQ19NQVNURVIpOworCW91dGIoMHgwMCwgaW9iYXNlICsgSVJDQ19NQVNURVIpOwogI2lmIDAKIAkvKiBSZXNldCB0byBTSVIgbW9kZSAqLwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKLSAgICAgICAgb3V0YihJUkNDX0NGR0FfSVJEQV9TSVJfQXxJUkNDX0NGR0FfVFhfUE9MQVJJVFksIGlvYmFzZStJUkNDX1NDRV9DRkdBKTsKLSAgICAgICAgb3V0YihJUkNDX0NGR0JfSVIsIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKyAgICAgICAgb3V0YihJUkNDX0NGR0FfSVJEQV9TSVJfQXxJUkNDX0NGR0FfVFhfUE9MQVJJVFksIGlvYmFzZSArIElSQ0NfU0NFX0NGR0EpOworICAgICAgICBvdXRiKElSQ0NfQ0ZHQl9JUiwgaW9iYXNlICsgSVJDQ19TQ0VfQ0ZHQik7CiAjZW5kaWYKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CiAKQEAgLTE3MjAsNyArMTcxNyw3IEBACiAKIAlyZWxlYXNlX3JlZ2lvbihzZWxmLT5pby5maXJfYmFzZSwgc2VsZi0+aW8uZmlyX2V4dCk7CiAKLQlJUkRBX0RFQlVHKDAsICIlcygpLCByZWxlYXNpbmcgMHglMDN4XG4iLCBfX0ZVTkNUSU9OX18sIAorCUlSREFfREVCVUcoMCwgIiVzKCksIHJlbGVhc2luZyAweCUwM3hcbiIsIF9fRlVOQ1RJT05fXywKIAkJICAgc2VsZi0+aW8uc2lyX2Jhc2UpOwogCiAJcmVsZWFzZV9yZWdpb24oc2VsZi0+aW8uc2lyX2Jhc2UsIHNlbGYtPmlvLnNpcl9leHQpOwpAQCAtMTcyOCw3ICsxNzI1LDcgQEAKIAlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkKQogCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAogCQkJCSAgc2VsZi0+dHhfYnVmZi5oZWFkLCBzZWxmLT50eF9idWZmX2RtYSk7Ci0JCisKIAlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkKQogCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAogCQkJCSAgc2VsZi0+cnhfYnVmZi5oZWFkLCBzZWxmLT5yeF9idWZmX2RtYSk7CkBAIC0xNzQ0LDEwICsxNzQxLDEyIEBACiAKIAlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKIAotCWZvciAoaT0wOyBpIDwgMjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQlpZiAoZGV2X3NlbGZbaV0pCiAJCQlzbXNjX2lyY2NfY2xvc2UoZGV2X3NlbGZbaV0pOwogCX0KKworCWRyaXZlcl91bnJlZ2lzdGVyKCZzbXNjX2lyY2NfZHJpdmVyKTsKIH0KIAogLyoKQEAgLTE3NjMsMzQgKzE3NjIsMzQgQEAKIAogCUlSREFfREVCVUcoMywgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsJCi0JZGV2PSBzZWxmLT5uZXRkZXY7Ci0JSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybjspOwkJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlkZXYgPSBzZWxmLT5uZXRkZXY7CisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybjspOwogCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnNtc2NfaXJjY19oYXJkX3htaXRfc2lyOwogCiAJZmlyX2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKIAlzaXJfYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOwogCiAJLyogUmVzZXQgZXZlcnl0aGluZyAqLwotCW91dGIoSVJDQ19NQVNURVJfUkVTRVQsIGZpcl9iYXNlK0lSQ0NfTUFTVEVSKTsKKwlvdXRiKElSQ0NfTUFTVEVSX1JFU0VULCBmaXJfYmFzZSArIElSQ0NfTUFTVEVSKTsKIAogCSNpZiBTTVNDX0lSQ0MyX0NfU0lSX1NUT1AKIAkvKnNtc2NfaXJjY19zaXJfc3RvcChzZWxmKTsqLwogCSNlbmRpZgogCiAJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMSk7Ci0Jb3V0YigoKGluYihmaXJfYmFzZStJUkNDX1NDRV9DRkdBKSAmIElSQ0NfU0NFX0NGR0FfQkxPQ0tfQ1RSTF9CSVRTX01BU0spIHwgSVJDQ19DRkdBX0lSREFfU0lSX0EpLCBmaXJfYmFzZStJUkNDX1NDRV9DRkdBKTsKKwlvdXRiKCgoaW5iKGZpcl9iYXNlICsgSVJDQ19TQ0VfQ0ZHQSkgJiBJUkNDX1NDRV9DRkdBX0JMT0NLX0NUUkxfQklUU19NQVNLKSB8IElSQ0NfQ0ZHQV9JUkRBX1NJUl9BKSwgZmlyX2Jhc2UgKyBJUkNDX1NDRV9DRkdBKTsKIAogCS8qIEluaXRpYWxpemUgVUFSVCAqLwotCW91dGIoVUFSVF9MQ1JfV0xFTjgsIHNpcl9iYXNlK1VBUlRfTENSKTsgIC8qIFJlc2V0IERMQUIgKi8KLQlvdXRiKChVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9PVVQyKSwgc2lyX2Jhc2UrVUFSVF9NQ1IpOwotCQorCW91dGIoVUFSVF9MQ1JfV0xFTjgsIHNpcl9iYXNlICsgVUFSVF9MQ1IpOyAgLyogUmVzZXQgRExBQiAqLworCW91dGIoKFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX09VVDIpLCBzaXJfYmFzZSArIFVBUlRfTUNSKTsKKwogCS8qIFR1cm4gb24gaW50ZXJydXBzICovCi0Jb3V0YihVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJIHxVQVJUX0lFUl9USFJJLCBzaXJfYmFzZStVQVJUX0lFUik7CisJb3V0YihVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJIHxVQVJUX0lFUl9USFJJLCBzaXJfYmFzZSArIFVBUlRfSUVSKTsKIAogCUlSREFfREVCVUcoMywgIiVzKCkgLSBleGl0XG4iLCBfX0ZVTkNUSU9OX18pOwogCi0Jb3V0YigweDAwLCBmaXJfYmFzZStJUkNDX01BU1RFUik7CisJb3V0YigweDAwLCBmaXJfYmFzZSArIElSQ0NfTUFTVEVSKTsKIH0KIAogI2lmIFNNU0NfSVJDQzJfQ19TSVJfU1RPUApAQCAtMTgwMiwxMCArMTgwMSwxMCBAQAogCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOwogCiAJLyogUmVzZXQgVUFSVCAqLwotCW91dGIoMCwgaW9iYXNlK1VBUlRfTUNSKTsKLQkKKwlvdXRiKDAsIGlvYmFzZSArIFVBUlRfTUNSKTsKKwogCS8qIFR1cm4gb2ZmIGludGVycnVwdHMgKi8KLQlvdXRiKDAsIGlvYmFzZStVQVJUX0lFUik7CisJb3V0YigwLCBpb2Jhc2UgKyBVQVJUX0lFUik7CiB9CiAjZW5kaWYKIApAQCAtMTgzMSwxNiArMTgzMCwxNiBAQAogCS8qIEZpbmlzaGVkIHdpdGggZnJhbWU/ICAqLwogCWlmIChzZWxmLT50eF9idWZmLmxlbiA+IDApICB7CiAJCS8qIFdyaXRlIGRhdGEgbGVmdCBpbiB0cmFuc21pdCBidWZmZXIgKi8KLQkJYWN0dWFsID0gc21zY19pcmNjX3Npcl93cml0ZShpb2Jhc2UsIHNlbGYtPmlvLmZpZm9fc2l6ZSwgCisJCWFjdHVhbCA9IHNtc2NfaXJjY19zaXJfd3JpdGUoaW9iYXNlLCBzZWxmLT5pby5maWZvX3NpemUsCiAJCQkJICAgICAgc2VsZi0+dHhfYnVmZi5kYXRhLCBzZWxmLT50eF9idWZmLmxlbik7CiAJCXNlbGYtPnR4X2J1ZmYuZGF0YSArPSBhY3R1YWw7CiAJCXNlbGYtPnR4X2J1ZmYubGVuICAtPSBhY3R1YWw7CiAJfSBlbHNlIHsKLQkKKwogCS8qaWYgKHNlbGYtPnR4X2J1ZmYubGVuID09MCkgIHsqLwotCQkKLQkJLyogCi0JCSAqICBOb3cgc2VyaWFsIGJ1ZmZlciBpcyBhbG1vc3QgZnJlZSAmIHdlIGNhbiBzdGFydCAKKworCQkvKgorCQkgKiAgTm93IHNlcmlhbCBidWZmZXIgaXMgYWxtb3N0IGZyZWUgJiB3ZSBjYW4gc3RhcnQKIAkJICogIHRyYW5zbWlzc2lvbiBvZiBhbm90aGVyIHBhY2tldC4gQnV0IGZpcnN0IHdlIG11c3QgY2hlY2sKIAkJICogIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgaGFyZHdhcmUKIAkJICovCkBAIC0xODU2LDIxICsxODU1LDE5IEBACiAJCX0KIAkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOwogCi0JCWlmKHNlbGYtPmlvLnNwZWVkIDw9IDExNTIwMCkgewotCQkvKiAKLQkJICogUmVzZXQgUnggRklGTyB0byBtYWtlIHN1cmUgdGhhdCBhbGwgcmVmbGVjdGVkIHRyYW5zbWl0IGRhdGEKLQkJICogaXMgZGlzY2FyZGVkLiBUaGlzIGlzIG5lZWRlZCBmb3IgaGFsZiBkdXBsZXggb3BlcmF0aW9uCi0JCSAqLwotCQlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX0NMRUFSX1JDVlI7Ci0JCWlmIChzZWxmLT5pby5zcGVlZCA8IDM4NDAwKQotCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTsKLQkJZWxzZSAKLQkJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE0OworCQlpZiAoc2VsZi0+aW8uc3BlZWQgPD0gMTE1MjAwKSB7CisJCQkvKgorCQkJICogUmVzZXQgUnggRklGTyB0byBtYWtlIHN1cmUgdGhhdCBhbGwgcmVmbGVjdGVkIHRyYW5zbWl0IGRhdGEKKwkJCSAqIGlzIGRpc2NhcmRlZC4gVGhpcyBpcyBuZWVkZWQgZm9yIGhhbGYgZHVwbGV4IG9wZXJhdGlvbgorCQkJICovCisJCQlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX0NMRUFSX1JDVlI7CisJCQlmY3IgfD0gc2VsZi0+aW8uc3BlZWQgPCAzODQwMCA/CisJCQkJCVVBUlRfRkNSX1RSSUdHRVJfMSA6IFVBUlRfRkNSX1RSSUdHRVJfMTQ7CiAKLQkJb3V0YihmY3IsIGlvYmFzZStVQVJUX0ZDUik7CisJCQlvdXRiKGZjciwgaW9iYXNlICsgVUFSVF9GQ1IpOwogCi0JCS8qIFR1cm4gb24gcmVjZWl2ZSBpbnRlcnJ1cHRzICovCi0JCW91dGIoVUFSVF9JRVJfUkRJLCBpb2Jhc2UrVUFSVF9JRVIpOworCQkJLyogVHVybiBvbiByZWNlaXZlIGludGVycnVwdHMgKi8KKwkJCW91dGIoVUFSVF9JRVJfUkRJLCBpb2Jhc2UgKyBVQVJUX0lFUik7CiAJCX0KIAl9CiB9CkBAIC0xODg0LDE3ICsxODgxLDE3IEBACiBzdGF0aWMgaW50IHNtc2NfaXJjY19zaXJfd3JpdGUoaW50IGlvYmFzZSwgaW50IGZpZm9fc2l6ZSwgX191OCAqYnVmLCBpbnQgbGVuKQogewogCWludCBhY3R1YWwgPSAwOwotCQorCiAJLyogVHggRklGTyBzaG91bGQgYmUgZW1wdHkhICovCi0JaWYgKCEoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9USFJFKSkgeworCWlmICghKGluYihpb2Jhc2UgKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9USFJFKSkgewogCQlJUkRBX1dBUk5JTkcoIiVzKCksIGZhaWxlZCwgZmlmbyBub3QgZW1wdHkhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gMDsKIAl9Ci0gICAgICAgIAorCiAJLyogRmlsbCBGSUZPIHdpdGggY3VycmVudCBmcmFtZSAqLwotCXdoaWxlICgoZmlmb19zaXplLS0gPiAwKSAmJiAoYWN0dWFsIDwgbGVuKSkgeworCXdoaWxlIChmaWZvX3NpemUtLSA+IDAgJiYgYWN0dWFsIDwgbGVuKSB7CiAJCS8qIFRyYW5zbWl0IG5leHQgYnl0ZSAqLwotCQlvdXRiKGJ1ZlthY3R1YWxdLCBpb2Jhc2UrVUFSVF9UWCk7CisJCW91dGIoYnVmW2FjdHVhbF0sIGlvYmFzZSArIFVBUlRfVFgpOwogCQlhY3R1YWwrKzsKIAl9CiAJcmV0dXJuIGFjdHVhbDsKQEAgLTE5MjEsMjAgKzE5MTgsMjEgQEAKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcihzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQogewogCXVuc2lnbmVkIGludAlpOwotCQorCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKLQkKLQlmb3IoaT0wOyBzbXNjX3RyYW5zY2VpdmVyc1tpXS5uYW1lIT1OVUxMOyBpKyspIAotCQlpZigoKnNtc2NfdHJhbnNjZWl2ZXJzW2ldLnByb2JlKShzZWxmLT5pby5maXJfYmFzZSkpIHsKKworCWZvciAoaSA9IDA7IHNtc2NfdHJhbnNjZWl2ZXJzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCQlpZiAoc21zY190cmFuc2NlaXZlcnNbaV0ucHJvYmUoc2VsZi0+aW8uZmlyX2Jhc2UpKSB7CiAJCQlJUkRBX01FU1NBR0UoIiAlcyB0cmFuc2NlaXZlciBmb3VuZFxuIiwKIAkJCQkgICAgIHNtc2NfdHJhbnNjZWl2ZXJzW2ldLm5hbWUpOwotCQkJc2VsZi0+dHJhbnNjZWl2ZXI9IGkrMTsKKwkJCXNlbGYtPnRyYW5zY2VpdmVyPSBpICsgMTsKIAkJCXJldHVybjsKIAkJfQorCiAJSVJEQV9NRVNTQUdFKCJObyB0cmFuc2NlaXZlciBmb3VuZC4gRGVmYXVsdGluZyB0byAlc1xuIiwKIAkJICAgICBzbXNjX3RyYW5zY2VpdmVyc1tTTVNDX0lSQ0MyX0NfREVGQVVMVF9UUkFOU0NFSVZFUl0ubmFtZSk7Ci0JCQkKLQlzZWxmLT50cmFuc2NlaXZlcj0gU01TQ19JUkNDMl9DX0RFRkFVTFRfVFJBTlNDRUlWRVI7CisKKwlzZWxmLT50cmFuc2NlaXZlciA9IFNNU0NfSVJDQzJfQ19ERUZBVUxUX1RSQU5TQ0VJVkVSOwogfQogCiAKQEAgLTE5NDcsOSArMTk0NSwxMCBAQAogc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9mb3Jfc3BlZWQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgdTMyIHNwZWVkKQogewogCXVuc2lnbmVkIGludCB0cng7Ci0JCisKIAl0cnggPSBzZWxmLT50cmFuc2NlaXZlcjsKLQlpZih0cng+MCkgKCpzbXNjX3RyYW5zY2VpdmVyc1t0cngtMV0uc2V0X2Zvcl9zcGVlZCkoc2VsZi0+aW8uZmlyX2Jhc2UsIHNwZWVkKTsKKwlpZiAodHJ4ID4gMCkKKwkJc21zY190cmFuc2NlaXZlcnNbdHJ4IC0gMV0uc2V0X2Zvcl9zcGVlZChzZWxmLT5pby5maXJfYmFzZSwgc3BlZWQpOwogfQogCiAvKgpAQCAtMTk3NywxNiArMTk3NiwxNCBAQAogCiBzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2lyX3dhaXRfaHdfdHJhbnNtaXR0ZXJfZmluaXNoKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCiB7Ci0JaW50IGlvYmFzZTsKKwlpbnQgaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CiAJaW50IGNvdW50ID0gU01TQ19JUkNDMl9IV19UUkFOU01JVFRFUl9USU1FT1VUX1VTOwotCQotCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOwotCQorCiAJLyogQ2FsaWJyYXRlZCBidXN5IGxvb3AgKi8KLQl3aGlsZSgoY291bnQtLSA+IDApICYmICEoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkKKwl3aGlsZSAoY291bnQtLSA+IDAgJiYgIShpbmIoaW9iYXNlICsgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCkpCiAJCXVkZWxheSgxKTsKIAotCWlmKGNvdW50ID09IDApCisJaWYgKGNvdW50ID09IDApCiAJCUlSREFfREVCVUcoMCwgIiVzKCk6IHN0dWNrIHRyYW5zbWl0dGVyXG4iLCBfX0ZVTkNUSU9OX18pOwogfQogCkBAIC0xOTk4LDQwICsxOTk1LDQyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNtc2NfaXJjY19sb29rX2Zvcl9jaGlwcyh2b2lkKQogewotCXNtc2NfY2hpcF9hZGRyZXNzX3QgKmFkZHJlc3M7Ci0JY2hhcgkqdHlwZTsKKwlzdHJ1Y3Qgc21zY19jaGlwX2FkZHJlc3MgKmFkZHJlc3M7CisJY2hhciAqdHlwZTsKIAl1bnNpZ25lZCBpbnQgY2ZnX2Jhc2UsIGZvdW5kOwotCQorCiAJZm91bmQgPSAwOwogCWFkZHJlc3MgPSBwb3NzaWJsZV9hZGRyZXNzZXM7Ci0JCi0Jd2hpbGUoYWRkcmVzcy0+Y2ZnX2Jhc2UpeworCisJd2hpbGUgKGFkZHJlc3MtPmNmZ19iYXNlKSB7CiAJCWNmZ19iYXNlID0gYWRkcmVzcy0+Y2ZnX2Jhc2U7Ci0JCQorCiAJCS8qcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoKTogcHJvYmluZzogMHglMDJ4IGZvcjogMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIGNmZ19iYXNlLCBhZGRyZXNzLT50eXBlKTsqLwotCQkKLQkJaWYoIGFkZHJlc3MtPnR5cGUgJiBTTVNDU0lPX1RZUEVfRkRDKXsKKworCQlpZiAoYWRkcmVzcy0+dHlwZSAmIFNNU0NTSU9fVFlQRV9GREMpIHsKIAkJCXR5cGUgPSAiRkRDIjsKLQkJCWlmKChhZGRyZXNzLT50eXBlKSAmIFNNU0NTSU9fVFlQRV9GTEFUKSB7Ci0JCQkJaWYoIXNtc2Nfc3VwZXJpb19mbGF0KGZkY19jaGlwc19mbGF0LGNmZ19iYXNlLCB0eXBlKSkgZm91bmQrKzsKLQkJCX0KLQkJCWlmKChhZGRyZXNzLT50eXBlKSAmIFNNU0NTSU9fVFlQRV9QQUdFRCkgewotCQkJCWlmKCFzbXNjX3N1cGVyaW9fcGFnZWQoZmRjX2NoaXBzX3BhZ2VkLGNmZ19iYXNlLCB0eXBlKSkgZm91bmQrKzsJCQotCQkJfQkJCQorCQkJaWYgKGFkZHJlc3MtPnR5cGUgJiBTTVNDU0lPX1RZUEVfRkxBVCkKKwkJCQlpZiAoIXNtc2Nfc3VwZXJpb19mbGF0KGZkY19jaGlwc19mbGF0LCBjZmdfYmFzZSwgdHlwZSkpCisJCQkJCWZvdW5kKys7CisKKwkJCWlmIChhZGRyZXNzLT50eXBlICYgU01TQ1NJT19UWVBFX1BBR0VEKQorCQkJCWlmICghc21zY19zdXBlcmlvX3BhZ2VkKGZkY19jaGlwc19wYWdlZCwgY2ZnX2Jhc2UsIHR5cGUpKQorCQkJCQlmb3VuZCsrOwogCQl9Ci0JCWlmKCBhZGRyZXNzLT50eXBlICYgU01TQ1NJT19UWVBFX0xQQyl7CisJCWlmIChhZGRyZXNzLT50eXBlICYgU01TQ1NJT19UWVBFX0xQQykgewogCQkJdHlwZSA9ICJMUEMiOwotCQkJaWYoKGFkZHJlc3MtPnR5cGUpICYgU01TQ1NJT19UWVBFX0ZMQVQpIHsKLQkJCQlpZighc21zY19zdXBlcmlvX2ZsYXQobHBjX2NoaXBzX2ZsYXQsY2ZnX2Jhc2UsdHlwZSkpIGZvdW5kKys7Ci0JCQl9Ci0JCQlpZigoYWRkcmVzcy0+dHlwZSkgJiBTTVNDU0lPX1RZUEVfUEFHRUQpIHsKLQkJCQlpZighc21zY19zdXBlcmlvX3BhZ2VkKGxwY19jaGlwc19wYWdlZCxjZmdfYmFzZSwiTFBDIikpIGZvdW5kKys7CQkKLQkJCX0JCQkKKwkJCWlmIChhZGRyZXNzLT50eXBlICYgU01TQ1NJT19UWVBFX0ZMQVQpCisJCQkJaWYgKCFzbXNjX3N1cGVyaW9fZmxhdChscGNfY2hpcHNfZmxhdCwgY2ZnX2Jhc2UsIHR5cGUpKQorCQkJCQlmb3VuZCsrOworCisJCQlpZiAoYWRkcmVzcy0+dHlwZSAmIFNNU0NTSU9fVFlQRV9QQUdFRCkKKwkJCQlpZiAoIXNtc2Nfc3VwZXJpb19wYWdlZChscGNfY2hpcHNfcGFnZWQsIGNmZ19iYXNlLCB0eXBlKSkKKwkJCQkJZm91bmQrKzsKIAkJfQogCQlhZGRyZXNzKys7CiAJfQogCXJldHVybiBmb3VuZDsKLX0gCit9CiAKIC8qCiAgKiBGdW5jdGlvbiBzbXNjX3N1cGVyaW9fZmxhdCAoY2hpcCwgYmFzZSwgdHlwZSkKQEAgLTIwMzksNyArMjAzOCw3IEBACiAgKiAgICBUcnkgdG8gZ2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBzbWMgU3VwZXJJTyBjaGlwIHdpdGggZmxhdCByZWdpc3RlciBtb2RlbAogICoKICAqLwotc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX2ZsYXQoY29uc3Qgc21zY19jaGlwX3QgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdiYXNlLCBjaGFyICp0eXBlKQorc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX2ZsYXQoY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ2Jhc2UsIGNoYXIgKnR5cGUpCiB7CiAJdW5zaWduZWQgc2hvcnQgZmlyYmFzZSwgc2lyYmFzZTsKIAl1OCBtb2RlLCBkbWEsIGlycTsKQEAgLTIwNDcsMzkgKzIwNDYsMzcgQEAKIAogCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JaWYgKHNtc2NfaXJjY19wcm9iZShjZmdiYXNlLCBTTVNDU0lPRkxBVF9ERVZJQ0VJRF9SRUcsIGNoaXBzLCB0eXBlKT09TlVMTCkKKwlpZiAoc21zY19pcmNjX3Byb2JlKGNmZ2Jhc2UsIFNNU0NTSU9GTEFUX0RFVklDRUlEX1JFRywgY2hpcHMsIHR5cGUpID09IE5VTEwpCiAJCXJldHVybiByZXQ7CiAKIAlvdXRiKFNNU0NTSU9GTEFUX1VBUlRNT0RFMENfUkVHLCBjZmdiYXNlKTsKLQltb2RlID0gaW5iKGNmZ2Jhc2UrMSk7Ci0JCisJbW9kZSA9IGluYihjZmdiYXNlICsgMSk7CisKIAkvKnByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCk6IG1vZGU6IDB4JTAyeFxuIiwgX19GVU5DVElPTl9fLCBtb2RlKTsqLwotCQotCWlmKCEobW9kZSAmIFNNU0NTSU9GTEFUX1VBUlQyTU9ERV9WQUxfSVJEQSkpCisKKwlpZiAoIShtb2RlICYgU01TQ1NJT0ZMQVRfVUFSVDJNT0RFX1ZBTF9JUkRBKSkKIAkJSVJEQV9XQVJOSU5HKCIlcygpOiBJckRBIG5vdCBlbmFibGVkXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJb3V0YihTTVNDU0lPRkxBVF9VQVJUMkJBU0VBRERSX1JFRywgY2ZnYmFzZSk7Ci0Jc2lyYmFzZSA9IGluYihjZmdiYXNlKzEpIDw8IDI7CisJc2lyYmFzZSA9IGluYihjZmdiYXNlICsgMSkgPDwgMjsKIAotICAgCS8qIEZJUiBpb2Jhc2UgKi8KKwkvKiBGSVIgaW9iYXNlICovCiAJb3V0YihTTVNDU0lPRkxBVF9GSVJCQVNFQUREUl9SRUcsIGNmZ2Jhc2UpOwotCWZpcmJhc2UgPSBpbmIoY2ZnYmFzZSsxKSA8PCAzOworCWZpcmJhc2UgPSBpbmIoY2ZnYmFzZSArIDEpIDw8IDM7CiAKIAkvKiBETUEgKi8KIAlvdXRiKFNNU0NTSU9GTEFUX0ZJUkRNQVNFTEVDVF9SRUcsIGNmZ2Jhc2UpOwotCWRtYSA9IGluYihjZmdiYXNlKzEpICYgU01TQ1NJT0ZMQVRfRklSRE1BU0VMRUNUX01BU0s7Ci0JCisJZG1hID0gaW5iKGNmZ2Jhc2UgKyAxKSAmIFNNU0NTSU9GTEFUX0ZJUkRNQVNFTEVDVF9NQVNLOworCiAJLyogSVJRICovCiAJb3V0YihTTVNDU0lPRkxBVF9VQVJUSVJRU0VMRUNUX1JFRywgY2ZnYmFzZSk7Ci0JaXJxID0gaW5iKGNmZ2Jhc2UrMSkgJiBTTVNDU0lPRkxBVF9VQVJUMklSUVNFTEVDVF9NQVNLOworCWlycSA9IGluYihjZmdiYXNlICsgMSkgJiBTTVNDU0lPRkxBVF9VQVJUMklSUVNFTEVDVF9NQVNLOwogCiAJSVJEQV9NRVNTQUdFKCIlcygpOiBmaXI6IDB4JTAyeCwgc2lyOiAweCUwMngsIGRtYTogJTAyZCwgaXJxOiAlZCwgbW9kZTogMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIGZpcmJhc2UsIHNpcmJhc2UsIGRtYSwgaXJxLCBtb2RlKTsKIAotCWlmIChmaXJiYXNlKSB7Ci0JCWlmIChzbXNjX2lyY2Nfb3BlbihmaXJiYXNlLCBzaXJiYXNlLCBkbWEsIGlycSkgPT0gMCkKLQkJCXJldD0wOyAKLQl9Ci0JCisJaWYgKGZpcmJhc2UgJiYgc21zY19pcmNjX29wZW4oZmlyYmFzZSwgc2lyYmFzZSwgZG1hLCBpcnEpID09IDApCisJCXJldCA9IDA7CisKIAkvKiBFeGl0IGNvbmZpZ3VyYXRpb24gKi8KIAlvdXRiKFNNU0NTSU9fQ0ZHRVhJVEtFWSwgY2ZnYmFzZSk7CiAKQEAgLTIwOTIsMjYgKzIwODksMjYgQEAKICAqICAgIFRyeSAgdG8gZ2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBzbWMgU3VwZXJJTyBjaGlwIHdpdGggcGFnZWQgcmVnaXN0ZXIgbW9kZWwKICAqCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19wYWdlZChjb25zdCBzbXNjX2NoaXBfdCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLCBjaGFyICp0eXBlKQorc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX3BhZ2VkKGNvbnN0IHN0cnVjdCBzbXNjX2NoaXAgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgY2hhciAqdHlwZSkKIHsKIAl1bnNpZ25lZCBzaG9ydCBmaXJfaW8sIHNpcl9pbzsKIAlpbnQgcmV0ID0gLUVOT0RFVjsKLQkKKwogCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JaWYgKHNtc2NfaXJjY19wcm9iZShjZmdfYmFzZSwweDIwLGNoaXBzLHR5cGUpPT1OVUxMKQorCWlmIChzbXNjX2lyY2NfcHJvYmUoY2ZnX2Jhc2UsIDB4MjAsIGNoaXBzLCB0eXBlKSA9PSBOVUxMKQogCQlyZXR1cm4gcmV0OwotCQorCiAJLyogU2VsZWN0IGxvZ2ljYWwgZGV2aWNlIChVQVJUMikgKi8KIAlvdXRiKDB4MDcsIGNmZ19iYXNlKTsKIAlvdXRiKDB4MDUsIGNmZ19iYXNlICsgMSk7Ci0JCQorCiAJLyogU0lSIGlvYmFzZSAqLwogCW91dGIoMHg2MCwgY2ZnX2Jhc2UpOwotCXNpcl9pbyAgPSBpbmIoY2ZnX2Jhc2UgKyAxKSA8PCA4OworCXNpcl9pbyA9IGluYihjZmdfYmFzZSArIDEpIDw8IDg7CiAJb3V0YigweDYxLCBjZmdfYmFzZSk7CiAJc2lyX2lvIHw9IGluYihjZmdfYmFzZSArIDEpOwotCQkKKwogCS8qIFJlYWQgRklSIGJhc2UgKi8KIAlvdXRiKDB4NjIsIGNmZ19iYXNlKTsKIAlmaXJfaW8gPSBpbmIoY2ZnX2Jhc2UgKyAxKSA8PCA4OwpAQCAtMjExOSwxMSArMjExNiw5IEBACiAJZmlyX2lvIHw9IGluYihjZmdfYmFzZSArIDEpOwogCW91dGIoMHgyYiwgY2ZnX2Jhc2UpOyAvKiA/Pz8gKi8KIAotCWlmIChmaXJfaW8pIHsKLQkJaWYgKHNtc2NfaXJjY19vcGVuKGZpcl9pbywgc2lyX2lvLCBpcmNjX2RtYSwgaXJjY19pcnEpID09IDApCi0JCQlyZXQ9MDsgCi0JfQotCQorCWlmIChmaXJfaW8gJiYgc21zY19pcmNjX29wZW4oZmlyX2lvLCBzaXJfaW8sIGlyY2NfZG1hLCBpcmNjX2lycSkgPT0gMCkKKwkJcmV0ID0gMDsKKwogCS8qIEV4aXQgY29uZmlndXJhdGlvbiAqLwogCW91dGIoU01TQ1NJT19DRkdFWElUS0VZLCBjZmdfYmFzZSk7CiAKQEAgLTIxMzEsMjEgKzIxMjYsMTcgQEAKIH0KIAogCi1zdGF0aWMgaW50IF9faW5pdCBzbXNjX2FjY2Vzcyh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSx1bnNpZ25lZCBjaGFyIHJlZykKK3N0YXRpYyBpbnQgX19pbml0IHNtc2NfYWNjZXNzKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLCB1bnNpZ25lZCBjaGFyIHJlZykKIHsKIAlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKIAogCW91dGIocmVnLCBjZmdfYmFzZSk7Ci0KLQlpZiAoaW5iKGNmZ19iYXNlKSE9cmVnKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gaW5iKGNmZ19iYXNlKSAhPSByZWcgPyAtMSA6IDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzbXNjX2NoaXBfdCAqIF9faW5pdCBzbXNjX2lyY2NfcHJvYmUodW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsdTggcmVnLGNvbnN0IHNtc2NfY2hpcF90ICpjaGlwLGNoYXIgKnR5cGUpCitzdGF0aWMgY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqIF9faW5pdCBzbXNjX2lyY2NfcHJvYmUodW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIHU4IHJlZywgY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqY2hpcCwgY2hhciAqdHlwZSkKIHsKLQl1OCBkZXZpZCx4ZGV2aWQscmV2OyAKKwl1OCBkZXZpZCwgeGRldmlkLCByZXY7CiAKIAlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKIApAQCAtMjE1OCw3ICsyMTQ5LDcgQEAKIAogCW91dGIocmVnLCBjZmdfYmFzZSk7CiAKLQl4ZGV2aWQ9aW5iKGNmZ19iYXNlKzEpOworCXhkZXZpZCA9IGluYihjZmdfYmFzZSArIDEpOwogCiAJLyogRW50ZXIgY29uZmlndXJhdGlvbiAqLwogCkBAIC0yMTY4LDUxICsyMTU5LDQ5IEBACiAJaWYgKHNtc2NfYWNjZXNzKGNmZ19iYXNlLDB4NTUpKQkvKiBzZW5kIHNlY29uZCBrZXkgYW5kIGNoZWNrICovCiAJCXJldHVybiBOVUxMOwogCSNlbmRpZgotCQorCiAJLyogcHJvYmUgZGV2aWNlIElEICovCiAKLQlpZiAoc21zY19hY2Nlc3MoY2ZnX2Jhc2UscmVnKSkKKwlpZiAoc21zY19hY2Nlc3MoY2ZnX2Jhc2UsIHJlZykpCiAJCXJldHVybiBOVUxMOwogCi0JZGV2aWQ9aW5iKGNmZ19iYXNlKzEpOwotCQotCWlmIChkZXZpZD09MCkJCQkvKiB0eXBpY2FsIHZhbHVlIGZvciB1bnVzZWQgcG9ydCAqLwotCQlyZXR1cm4gTlVMTDsKKwlkZXZpZCA9IGluYihjZmdfYmFzZSArIDEpOwogCi0JaWYgKGRldmlkPT0weGZmKQkJLyogdHlwaWNhbCB2YWx1ZSBmb3IgdW51c2VkIHBvcnQgKi8KKwlpZiAoZGV2aWQgPT0gMCB8fCBkZXZpZCA9PSAweGZmKQkvKiB0eXBpY2FsIHZhbHVlcyBmb3IgdW51c2VkIHBvcnQgKi8KIAkJcmV0dXJuIE5VTEw7CiAKIAkvKiBwcm9iZSByZXZpc2lvbiBJRCAqLwogCi0JaWYgKHNtc2NfYWNjZXNzKGNmZ19iYXNlLHJlZysxKSkKKwlpZiAoc21zY19hY2Nlc3MoY2ZnX2Jhc2UsIHJlZyArIDEpKQogCQlyZXR1cm4gTlVMTDsKIAotCXJldj1pbmIoY2ZnX2Jhc2UrMSk7CisJcmV2ID0gaW5iKGNmZ19iYXNlICsgMSk7CiAKLQlpZiAocmV2Pj0xMjgpCQkJLyogaSB0aGluayB0aGlzIHdpbGwgbWFrZSBubyBzZW5zZSAqLworCWlmIChyZXYgPj0gMTI4KQkJCS8qIGkgdGhpbmsgdGhpcyB3aWxsIG1ha2Ugbm8gc2Vuc2UgKi8KIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoZGV2aWQ9PXhkZXZpZCkJCS8qIHByb3RlY3Rpb24gYWdhaW5zdCBmYWxzZSBwb3NpdGl2ZXMgKi8gICAgICAgIAorCWlmIChkZXZpZCA9PSB4ZGV2aWQpCQkvKiBwcm90ZWN0aW9uIGFnYWluc3QgZmFsc2UgcG9zaXRpdmVzICovCiAJCXJldHVybiBOVUxMOwogCiAJLyogQ2hlY2sgZm9yIGV4cGVjdGVkIGRldmljZSBJRDsgYXJlIHRoZXJlIG90aGVycz8gKi8KIAotCXdoaWxlKGNoaXAtPmRldmlkIT1kZXZpZCkgeworCXdoaWxlIChjaGlwLT5kZXZpZCAhPSBkZXZpZCkgewogCiAJCWNoaXArKzsKIAotCQlpZiAoY2hpcC0+bmFtZT09TlVMTCkKKwkJaWYgKGNoaXAtPm5hbWUgPT0gTlVMTCkKIAkJCXJldHVybiBOVUxMOwogCX0KIAotCUlSREFfTUVTU0FHRSgiZm91bmQgU01DIFN1cGVySU8gQ2hpcCAoZGV2aWQ9MHglMDJ4IHJldj0lMDJYIGJhc2U9MHglMDR4KTogJXMlc1xuIixkZXZpZCxyZXYsY2ZnX2Jhc2UsdHlwZSxjaGlwLT5uYW1lKTsKKwlJUkRBX01FU1NBR0UoImZvdW5kIFNNQyBTdXBlcklPIENoaXAgKGRldmlkPTB4JTAyeCByZXY9JTAyWCBiYXNlPTB4JTA0eCk6ICVzJXNcbiIsCisJCSAgICAgZGV2aWQsIHJldiwgY2ZnX2Jhc2UsIHR5cGUsIGNoaXAtPm5hbWUpOwogCi0JaWYgKGNoaXAtPnJldj5yZXYpewotCQlJUkRBX01FU1NBR0UoIlJldmlzaW9uIGhpZ2hlciB0aGFuIGV4cGVjdGVkXG4iKTsJCisJaWYgKGNoaXAtPnJldiA+IHJldikgeworCQlJUkRBX01FU1NBR0UoIlJldmlzaW9uIGhpZ2hlciB0aGFuIGV4cGVjdGVkXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCQotCWlmIChjaGlwLT5mbGFncyZOb0lSREEpCisKKwlpZiAoY2hpcC0+ZmxhZ3MgJiBOb0lSREEpCiAJCUlSREFfTUVTU0FHRSgiY2hpcHNldCBkb2VzIG5vdCBzdXBwb3J0IElSREFcbiIpOwogCiAJcmV0dXJuIGNoaXA7CkBAIC0yMjI2LDggKzIyMTUsOCBAQAogCQlJUkRBX1dBUk5JTkcoIiVzOiBjYW4ndCBnZXQgY2ZnX2Jhc2Ugb2YgMHglMDN4XG4iLAogCQkJICAgICBfX0ZVTkNUSU9OX18sIGNmZ19iYXNlKTsKIAl9IGVsc2UgewotCQlpZiAoIXNtc2Nfc3VwZXJpb19mbGF0KGZkY19jaGlwc19mbGF0LGNmZ19iYXNlLCJGREMiKQotCQkgICAgfHwhc21zY19zdXBlcmlvX3BhZ2VkKGZkY19jaGlwc19wYWdlZCxjZmdfYmFzZSwiRkRDIikpCisJCWlmICghc21zY19zdXBlcmlvX2ZsYXQoZmRjX2NoaXBzX2ZsYXQsIGNmZ19iYXNlLCAiRkRDIikgfHwKKwkJICAgICFzbXNjX3N1cGVyaW9fcGFnZWQoZmRjX2NoaXBzX3BhZ2VkLCBjZmdfYmFzZSwgIkZEQyIpKQogCQkJcmV0ID0gIDA7CiAKIAkJcmVsZWFzZV9yZWdpb24oY2ZnX2Jhc2UsIDIpOwpAQCAtMjI0NCw5ICsyMjMzLDEwIEBACiAJCUlSREFfV0FSTklORygiJXM6IGNhbid0IGdldCBjZmdfYmFzZSBvZiAweCUwM3hcbiIsCiAJCQkgICAgIF9fRlVOQ1RJT05fXywgY2ZnX2Jhc2UpOwogCX0gZWxzZSB7Ci0JCWlmICghc21zY19zdXBlcmlvX2ZsYXQobHBjX2NoaXBzX2ZsYXQsY2ZnX2Jhc2UsIkxQQyIpCi0JCSAgICB8fCFzbXNjX3N1cGVyaW9fcGFnZWQobHBjX2NoaXBzX3BhZ2VkLGNmZ19iYXNlLCJMUEMiKSkKKwkJaWYgKCFzbXNjX3N1cGVyaW9fZmxhdChscGNfY2hpcHNfZmxhdCwgY2ZnX2Jhc2UsICJMUEMiKSB8fAorCQkgICAgIXNtc2Nfc3VwZXJpb19wYWdlZChscGNfY2hpcHNfcGFnZWQsIGNmZ19iYXNlLCAiTFBDIikpCiAJCQlyZXQgPSAwOworCiAJCXJlbGVhc2VfcmVnaW9uKGNmZ19iYXNlLCAyKTsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTIyNjksMTggKzIyNTksMjMgQEAKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0YyhpbnQgZmlyX2Jhc2UsIHUzMiBzcGVlZCkKIHsKIAl1bnNpZ25lZCBsb25nIGppZmZpZXNfbm93LCBqaWZmaWVzX3RpbWVvdXQ7Ci0JdTgJdmFsOwotCQotCWppZmZpZXNfbm93PSBqaWZmaWVzOwotCWppZmZpZXNfdGltZW91dD0gamlmZmllcytTTVNDX0lSQ0MyX0FUQ19QUk9HUkFNTUlOR19USU1FT1VUX0pJRkZJRVM7Ci0JCisJdTggdmFsOworCisJamlmZmllc19ub3cgPSBqaWZmaWVzOworCWppZmZpZXNfdGltZW91dCA9IGppZmZpZXMgKyBTTVNDX0lSQ0MyX0FUQ19QUk9HUkFNTUlOR19USU1FT1VUX0pJRkZJRVM7CisKIAkvKiBBVEMgKi8KIAlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCA0KTsKLQlvdXRiKChpbmIoZmlyX2Jhc2UrSVJDQ19BVEMpICYgSVJDQ19BVENfTUFTSykgfElSQ0NfQVRDX25QUk9HUkVBRFl8SVJDQ19BVENfRU5BQkxFLCBmaXJfYmFzZStJUkNDX0FUQyk7Ci0Jd2hpbGUoKHZhbD0oaW5iKGZpcl9iYXNlK0lSQ0NfQVRDKSAmIElSQ0NfQVRDX25QUk9HUkVBRFkpKSAmJiAhdGltZV9hZnRlcihqaWZmaWVzLCBqaWZmaWVzX3RpbWVvdXQpKTsKLQlpZih2YWwpCisJb3V0YigoaW5iKGZpcl9iYXNlICsgSVJDQ19BVEMpICYgSVJDQ19BVENfTUFTSykgfCBJUkNDX0FUQ19uUFJPR1JFQURZfElSQ0NfQVRDX0VOQUJMRSwKKwkgICAgIGZpcl9iYXNlICsgSVJDQ19BVEMpOworCisJd2hpbGUgKCh2YWwgPSAoaW5iKGZpcl9iYXNlICsgSVJDQ19BVEMpICYgSVJDQ19BVENfblBST0dSRUFEWSkpICYmCisJCSF0aW1lX2FmdGVyKGppZmZpZXMsIGppZmZpZXNfdGltZW91dCkpCisJCS8qIGVtcHR5ICovOworCisJaWYgKHZhbCkKIAkJSVJEQV9XQVJOSU5HKCIlcygpOiBBVEM6IDB4JTAyeFxuIiwgX19GVU5DVElPTl9fLAotCQkJICAgICBpbmIoZmlyX2Jhc2UrSVJDQ19BVEMpKTsKKwkJCSAgICAgaW5iKGZpcl9iYXNlICsgSVJDQ19BVEMpKTsKIH0KIAogLyoKQEAgLTIyOTgsMzQgKzIyOTMsMzIgQEAKIC8qCiAgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3Qoc2VsZiwgc3BlZWQpCiAgKgotICogICAgU2V0IHRyYW5zY2VpdmVyIAorICogICAgU2V0IHRyYW5zY2VpdmVyCiAgKgogICovCiAKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2Zhc3RfcGluX3NlbGVjdChpbnQgZmlyX2Jhc2UsIHUzMiBzcGVlZCkKIHsKLQl1OAlmYXN0X21vZGU7Ci0JCi0Jc3dpdGNoKHNwZWVkKQotCXsKLQkJZGVmYXVsdDoKLQkJY2FzZSA1NzYwMDAgOgotCQlmYXN0X21vZGUgPSAwOyAKKwl1OCBmYXN0X21vZGU7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJZGVmYXVsdDoKKwljYXNlIDU3NjAwMCA6CisJCWZhc3RfbW9kZSA9IDA7CiAJCWJyZWFrOwotCQljYXNlIDExNTIwMDAgOgotCQljYXNlIDQwMDAwMDAgOgorCWNhc2UgMTE1MjAwMCA6CisJY2FzZSA0MDAwMDAwIDoKIAkJZmFzdF9tb2RlID0gSVJDQ19MQ1JfQV9GQVNUOwogCQlicmVhazsKLQkJCiAJfQogCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDApOwotCW91dGIoKGluYihmaXJfYmFzZStJUkNDX0xDUl9BKSAmICAweGJmKSB8IGZhc3RfbW9kZSwgZmlyX2Jhc2UrSVJDQ19MQ1JfQSk7CisJb3V0YigoaW5iKGZpcl9iYXNlICsgSVJDQ19MQ1JfQSkgJiAweGJmKSB8IGZhc3RfbW9kZSwgZmlyX2Jhc2UgKyBJUkNDX0xDUl9BKTsKIH0KIAogLyoKICAqIEZ1bmN0aW9uIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0KGZpcl9iYXNlKQogICoKLSAqICAgIFByb2JlIHRyYW5zY2VpdmVyIAorICogICAgUHJvYmUgdHJhbnNjZWl2ZXIKICAqCiAgKi8KIApAQCAtMjMzNywzNSArMjMzMCwzNCBAQAogLyoKICAqIEZ1bmN0aW9uIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfdG9zaGliYV9zYXQxODAwKGZpcl9iYXNlLCBzcGVlZCkKICAqCi0gKiAgICBTZXQgdHJhbnNjZWl2ZXIgCisgKiAgICBTZXQgdHJhbnNjZWl2ZXIKICAqCiAgKi8KIAogc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl90b3NoaWJhX3NhdDE4MDAoaW50IGZpcl9iYXNlLCB1MzIgc3BlZWQpCiB7Ci0JdTgJZmFzdF9tb2RlOwotCQotCXN3aXRjaChzcGVlZCkKLQl7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgNTc2MDAwIDoKLQkJZmFzdF9tb2RlID0gMDsgCisJdTggZmFzdF9tb2RlOworCisJc3dpdGNoIChzcGVlZCkgeworCWRlZmF1bHQ6CisJY2FzZSA1NzYwMDAgOgorCQlmYXN0X21vZGUgPSAwOwogCQlicmVhazsKLQkJY2FzZSAxMTUyMDAwIDoKLQkJY2FzZSA0MDAwMDAwIDoKKwljYXNlIDExNTIwMDAgOgorCWNhc2UgNDAwMDAwMCA6CiAJCWZhc3RfbW9kZSA9IC8qSVJDQ19MQ1JfQV9GQVNUIHwqLyBJUkNDX0xDUl9BX0dQX0RBVEE7CiAJCWJyZWFrOwotCQkKKwogCX0KIAkvKiBUaGlzIGNhdXNlcyBhbiBpbnRlcnJ1cHQgKi8KIAlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAwKTsKLQlvdXRiKChpbmIoZmlyX2Jhc2UrSVJDQ19MQ1JfQSkgJiAgMHhiZikgfCBmYXN0X21vZGUsIGZpcl9iYXNlK0lSQ0NfTENSX0EpOworCW91dGIoKGluYihmaXJfYmFzZSArIElSQ0NfTENSX0EpICYgIDB4YmYpIHwgZmFzdF9tb2RlLCBmaXJfYmFzZSArIElSQ0NfTENSX0EpOwogfQogCiAvKgogICogRnVuY3Rpb24gc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMChmaXJfYmFzZSkKICAqCi0gKiAgICBQcm9iZSB0cmFuc2NlaXZlciAKKyAqICAgIFByb2JlIHRyYW5zY2VpdmVyCiAgKgogICovCiAKQEAgLTIzNzcsMjAgKzIzNjksMyBAQAogCiBtb2R1bGVfaW5pdChzbXNjX2lyY2NfaW5pdCk7CiBtb2R1bGVfZXhpdChzbXNjX2lyY2NfY2xlYW51cCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkRhbmllbGUgUGVyaSA8cGVyaUBjc2FpLnVuaXBhLml0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTTUMgSXJDQyBTSVIvRklSIGNvbnRyb2xsZXIgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLW1vZHVsZV9wYXJhbShpcmNjX2RtYSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaXJjY19kbWEsICJETUEgY2hhbm5lbCIpOwotbW9kdWxlX3BhcmFtKGlyY2NfaXJxLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpcmNjX2lycSwgIklSUSBsaW5lIik7Ci1tb2R1bGVfcGFyYW0oaXJjY19maXIsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlyY2NfZmlyLCAiRklSIEJhc2UgQWRkcmVzcyIpOwotbW9kdWxlX3BhcmFtKGlyY2Nfc2lyLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpcmNjX3NpciwgIlNJUiBCYXNlIEFkZHJlc3MiKTsKLW1vZHVsZV9wYXJhbShpcmNjX2NmZywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaXJjY19jZmcsICJDb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyIpOwotbW9kdWxlX3BhcmFtKGlyY2NfdHJhbnNjZWl2ZXIsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlyY2NfdHJhbnNjZWl2ZXIsICJUcmFuc2NlaXZlciB0eXBlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5oCmluZGV4IDQ1ODYxMWMuLjBjMzYyODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5oCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogJElkOiBzbXNjLWlyY2MyLmgsdiAxLjEyLjIuMSAyMDAyLzEwLzI3IDEwOjUyOjM3IGRpcCBFeHAgJCAgICAgICAgICAgICAgIAorICogJElkOiBzbXNjLWlyY2MyLmgsdiAxLjEyLjIuMSAyMDAyLzEwLzI3IDEwOjUyOjM3IGRpcCBFeHAgJAogICoKICAqIERlc2NyaXB0aW9uOiAgIERlZmluaXRpb25zIGZvciB0aGUgU01DIElyQ0MgY2hpcHNldAogICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgpAQCAtOSwyNSArOSwyNSBAQAogICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogQmFzZWQgb24gc21jLWlyY2MuaDoKLSAqIAorICoKICAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCwgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5LCBUaG9tYXMgRGF2aXMgKHRhZGF2aXNAanBzLm5ldD4KICAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCiAgKgotICogICAgICAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICogCisgKgogICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCiAgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAotICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAotICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICAqICAgICBNQSAwMjExMS0xMzA3IFVTQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTExMiwxMCArMTEyLDEwIEBACiAKICNkZWZpbmUgICBJUkNDX0NGR0FfQ09NCQkJCTB4MDAKICNkZWZpbmUJCUlSQ0NfU0NFX0NGR0FfQkxPQ0tfQ1RSTF9CSVRTX01BU0sJMHg4NwotI2RlZmluZSAgIAlJUkNDX0NGR0FfSVJEQV9TSVJfQQkweDA4Ci0jZGVmaW5lICAgCUlSQ0NfQ0ZHQV9BU0tfU0lSCQkweDEwCi0jZGVmaW5lICAgCUlSQ0NfQ0ZHQV9JUkRBX1NJUl9CCTB4MTgKLSNkZWZpbmUgICAJSVJDQ19DRkdBX0lSREFfSERMQwkJMHgyMAorI2RlZmluZQkJSVJDQ19DRkdBX0lSREFfU0lSX0EJMHgwOAorI2RlZmluZQkJSVJDQ19DRkdBX0FTS19TSVIJCTB4MTAKKyNkZWZpbmUJCUlSQ0NfQ0ZHQV9JUkRBX1NJUl9CCTB4MTgKKyNkZWZpbmUJCUlSQ0NfQ0ZHQV9JUkRBX0hETEMJCTB4MjAKICNkZWZpbmUJCUlSQ0NfQ0ZHQV9JUkRBXzRQUE0JCTB4MjgKICNkZWZpbmUJCUlSQ0NfQ0ZHQV9DT05TVU1FUgkJMHgzMAogI2RlZmluZQkJSVJDQ19DRkdBX1JBV19JUgkJMHgzOApAQCAtMTMwLDcgKzEzMCw3IEBACiAjZGVmaW5lIElSQ0NfQ0ZHQl9MUEJDS19UWF9DUkMJICAgMHgxMAogI2RlZmluZSBJUkNDX0NGR0JfTk9XQUlUCSAgIDB4MDgKICNkZWZpbmUgSVJDQ19DRkdCX1NUUklOR19NT1ZFCSAgIDB4MDQKLSNkZWZpbmUgSVJDQ19DRkdCX0RNQV9CVVJTVCAJICAgMHgwMgorI2RlZmluZSBJUkNDX0NGR0JfRE1BX0JVUlNUCSAgIDB4MDIKICNkZWZpbmUgSVJDQ19DRkdCX0RNQV9FTkFCTEUJICAgMHgwMQogCiAjZGVmaW5lIElSQ0NfQ0ZHQl9NVVhfQ09NICAgICAgICAgIDB4MDAKQEAgLTE0MSwxMSArMTQxLDExIEBACiAvKiBSZWdpc3RlciBibG9jayAzIC0gSWRlbnRpZmljYXRpb24gUmVnaXN0ZXJzISAqLwogI2RlZmluZSBJUkNDX0lEX0hJR0gJICAgICAgICAgICAweDAwICAgLyogMHgxMCAqLwogI2RlZmluZSBJUkNDX0lEX0xPVwkgICAgICAgICAgIDB4MDEgICAvKiAweEI4ICovCi0jZGVmaW5lIElSQ0NfQ0hJUF9JRCAJICAgICAgICAgICAweDAyICAgLyogMHhGMSAqLworI2RlZmluZSBJUkNDX0NISVBfSUQJICAgICAgICAgICAweDAyICAgLyogMHhGMSAqLwogI2RlZmluZSBJUkNDX1ZFUlNJT04JICAgICAgICAgICAweDAzICAgLyogMHgwMSAqLwogI2RlZmluZSBJUkNDX0lOVEVSRkFDRQkgICAgICAgICAgIDB4MDQgICAvKiBsb3cgNCA9IERNQSwgaGlnaCA0ID0gSVJRICovCi0jZGVmaW5lIAlJUkNDX0lOVEVSRkFDRV9ETUFfTUFTSwkweDBGICAgLyogbG93IDQgPSBETUEsIGhpZ2ggNCA9IElSUSAqLwotI2RlZmluZSAJSVJDQ19JTlRFUkZBQ0VfSVJRX01BU0sJMHhGMCAgIC8qIGxvdyA0ID0gRE1BLCBoaWdoIDQgPSBJUlEgKi8KKyNkZWZpbmUJCUlSQ0NfSU5URVJGQUNFX0RNQV9NQVNLCTB4MEYgICAvKiBsb3cgNCA9IERNQSwgaGlnaCA0ID0gSVJRICovCisjZGVmaW5lCQlJUkNDX0lOVEVSRkFDRV9JUlFfTUFTSwkweEYwICAgLyogbG93IDQgPSBETUEsIGhpZ2ggNCA9IElSUSAqLwogCiAvKiBSZWdpc3RlciBibG9jayA0IC0gSXJEQSAqLwogI2RlZmluZSBJUkNDX0NPTlRST0wgICAgICAgICAgICAgICAweDAwCkBAIC0xNjMsMTAgKzE2MywxMCBAQAogCiAvKiBSZWdpc3RlciBibG9jayA1IC0gSXJEQSAqLwogI2RlZmluZSBJUkNDX0FUQwkJCQkJMHgwMAotI2RlZmluZSAJSVJDQ19BVENfblBST0dSRUFEWQkJMHg4MAotI2RlZmluZSAJSVJDQ19BVENfU1BFRUQJCQkweDQwCi0jZGVmaW5lIAlJUkNDX0FUQ19FTkFCTEUJCQkweDIwCi0jZGVmaW5lIAlJUkNDX0FUQ19NQVNLCQkJMHhFMAorI2RlZmluZQkJSVJDQ19BVENfblBST0dSRUFEWQkJMHg4MAorI2RlZmluZQkJSVJDQ19BVENfU1BFRUQJCQkweDQwCisjZGVmaW5lCQlJUkNDX0FUQ19FTkFCTEUJCQkweDIwCisjZGVmaW5lCQlJUkNDX0FUQ19NQVNLCQkJMHhFMAogCiAKICNkZWZpbmUgSVJDQ19JUkhBTEZEVVBMRVhfVElNRU9VVAkweDAxCkBAIC0xNzgsOCArMTc4LDggQEAKICAqLwogCiAjZGVmaW5lIFNNU0NfSVJDQzJfTUFYX1NJUl9TUEVFRAkJMTE1MjAwCi0jZGVmaW5lIFNNU0NfSVJDQzJfRklSX0NISVBfSU9fRVhURU5UIAk4Ci0jZGVmaW5lIFNNU0NfSVJDQzJfU0lSX0NISVBfSU9fRVhURU5UIAk4CisjZGVmaW5lIFNNU0NfSVJDQzJfRklSX0NISVBfSU9fRVhURU5UCTgKKyNkZWZpbmUgU01TQ19JUkNDMl9TSVJfQ0hJUF9JT19FWFRFTlQJOAogI2RlZmluZSBTTVNDX0lSQ0MyX0ZJRk9fU0laRQkJCTE2CiAjZGVmaW5lIFNNU0NfSVJDQzJfRklGT19USFJFU0hPTEQJCTY0CiAvKiBNYXggRE1BIGJ1ZmZlciBzaXplIG5lZWRlZCA9IChkYXRhX3NpemUgKyA2KSAqICh3aW5kb3dfc2l6ZSkgKyA2OyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuYwppbmRleCAwMDZlNGY1Li42ZDlkZTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuYwpAQCAtMTc0OSwxMSArMTc0OSw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJdmxzaV9pcmRhX2Rldl90ICppZGV2OwogCi0JaWYgKHN0YXRlIDwgMSB8fCBzdGF0ZSA+IDMgKSB7Ci0JCUlSREFfRVJST1IoIiVzIC0gJXM6IGludmFsaWQgcG0gc3RhdGUgcmVxdWVzdDogJXVcbiIsCi0JCQkgICBfX0ZVTkNUSU9OX18sIFBDSURFVl9OQU1FKHBkZXYpLCBzdGF0ZSk7Ci0JCXJldHVybiAwOwotCX0KIAlpZiAoIW5kZXYpIHsKIAkJSVJEQV9FUlJPUigiJXMgLSAlczogbm8gbmV0ZGV2aWNlIFxuIiwKIAkJCSAgIF9fRlVOQ1RJT05fXywgUENJREVWX05BTUUocGRldikpOwpAQCAtMTc2MiwxMiArMTc1NywxMiBAQAogCWlkZXYgPSBuZGV2LT5wcml2OwkKIAlkb3duKCZpZGV2LT5zZW0pOwogCWlmIChwZGV2LT5jdXJyZW50X3N0YXRlICE9IDApIHsJCQkvKiBhbHJlYWR5IHN1c3BlbmRlZCAqLwotCQlpZiAoc3RhdGUgPiBwZGV2LT5jdXJyZW50X3N0YXRlKSB7CS8qIHNpbXBseSBnbyBkZWVwZXIgKi8KLQkJCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldixzdGF0ZSk7Ci0JCQlwZGV2LT5jdXJyZW50X3N0YXRlID0gc3RhdGU7CisJCWlmIChzdGF0ZS5ldmVudCA+IHBkZXYtPmN1cnJlbnRfc3RhdGUpIHsJLyogc2ltcGx5IGdvIGRlZXBlciAqLworCQkJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJCQlwZGV2LT5jdXJyZW50X3N0YXRlID0gc3RhdGUuZXZlbnQ7CiAJCX0KIAkJZWxzZQotCQkJSVJEQV9FUlJPUigiJXMgLSAlczogaW52YWxpZCBzdXNwZW5kIHJlcXVlc3QgJXUgLT4gJXVcbiIsIF9fRlVOQ1RJT05fXywgUENJREVWX05BTUUocGRldiksIHBkZXYtPmN1cnJlbnRfc3RhdGUsIHN0YXRlKTsKKwkJCUlSREFfRVJST1IoIiVzIC0gJXM6IGludmFsaWQgc3VzcGVuZCByZXF1ZXN0ICV1IC0+ICV1XG4iLCBfX0ZVTkNUSU9OX18sIFBDSURFVl9OQU1FKHBkZXYpLCBwZGV2LT5jdXJyZW50X3N0YXRlLCBzdGF0ZS5ldmVudCk7CiAJCXVwKCZpZGV2LT5zZW0pOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNzgxLDggKzE3NzYsOCBAQAogCQkJaWRldi0+bmV3X2JhdWQgPSBpZGV2LT5iYXVkOwogCX0KIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldixzdGF0ZSk7Ci0JcGRldi0+Y3VycmVudF9zdGF0ZSA9IHN0YXRlOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCXBkZXYtPmN1cnJlbnRfc3RhdGUgPSBzdGF0ZS5ldmVudDsKIAlpZGV2LT5yZXN1bWVfb2sgPSAxOwogCXVwKCZpZGV2LT5zZW0pOwogCXJldHVybiAwOwpAQCAtMTgwNyw4ICsxODAyLDggQEAKIAkJcmV0dXJuIDA7CiAJfQogCQotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7Ci0JcGRldi0+Y3VycmVudF9zdGF0ZSA9IDA7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBkZXYtPmN1cnJlbnRfc3RhdGUgPSBQTV9FVkVOVF9PTjsKIAogCWlmICghaWRldi0+cmVzdW1lX29rKSB7CiAJCS8qIHNob3VsZCBiZSBvYnNvbGV0ZSBub3cgLSBidXQgdXNlZCB0byBoYXBwZW4gZHVlIHRvOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmggYi9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuaAppbmRleCA0MTQ2OTRhLi43NDFhZWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuaAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuaApAQCAtNjksMTQgKzY5LDggQEAKIAogI2Vsc2UgLyogMi41IG9yIGxhdGVyICovCiAKLS8qIHJlY2VudCAyLjUvMi42IHN0b3JlcyBwY2kgZGV2aWNlIG5hbWVzIGF0IHZhcnlpbmcgcGxhY2VzIDstKSAqLwotI2lmZGVmIENPTkZJR19QQ0lfTkFNRVMKLS8qIGh1bWFuIHJlYWRhYmxlIG5hbWUgKi8KLSNkZWZpbmUgUENJREVWX05BTUUocGRldikJKChwZGV2KS0+cHJldHR5X25hbWUpCi0jZWxzZQogLyogd2hhdGV2ZXIgd2UgZ2V0IGZyb20gdGhlIGFzc29jaWF0ZWQgc3RydWN0IGRldmljZSAtIGJ1czpzbG90OmRldi5mbiBpZCAqLwogI2RlZmluZSBQQ0lERVZfTkFNRShwZGV2KQkocGNpX25hbWUocGRldikpCi0jZW5kaWYKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKaW5kZXggMTgzYmE5Ny4uM2Q1NmNmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKQEAgLTQsNiArNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgS3lsZSBBLiBMdWNrZSAoa2x1Y2tlQHVzLmlibS5jb20pLCBJQk0gQ29ycC4KICAqIFN1YnN0YW50aWFsbHkgY2xlYW5lZCB1cCBieToKICAqIENvcHlyaWdodCAoQykgMjAwMyBEYXZpZCBHaWJzb24gPGR3Z0BhdTEuaWJtLmNvbT4sIElCTSBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IE1pY2hhZWwgRWxsZXJtYW4sIElCTSBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtNzksMTIgKzgwLDU1IEBACiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3Zpby5oPgogCi0jaW5jbHVkZSAiaXNlcmllc192ZXRoLmgiCisjdW5kZWYgREVCVUcKIAogTU9EVUxFX0FVVEhPUigiS3lsZSBMdWNrZSA8a2x1Y2tlQHVzLmlibS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oImlTZXJpZXMgVmlydHVhbCBldGhlcm5ldCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAorI2RlZmluZSBWRVRIX0VWRU5UX0NBUAkoMCkKKyNkZWZpbmUgVkVUSF9FVkVOVF9GUkFNRVMJKDEpCisjZGVmaW5lIFZFVEhfRVZFTlRfTU9OSVRPUgkoMikKKyNkZWZpbmUgVkVUSF9FVkVOVF9GUkFNRVNfQUNLCSgzKQorCisjZGVmaW5lIFZFVEhfTUFYX0FDS1NfUEVSX01TRwkoMjApCisjZGVmaW5lIFZFVEhfTUFYX0ZSQU1FU19QRVJfTVNHCSg2KQorCitzdHJ1Y3QgdmV0aF9mcmFtZXNfZGF0YSB7CisJdTMyIGFkZHJbVkVUSF9NQVhfRlJBTUVTX1BFUl9NU0ddOworCXUxNiBsZW5bVkVUSF9NQVhfRlJBTUVTX1BFUl9NU0ddOworCXUzMiBlb2ZtYXNrOworfTsKKyNkZWZpbmUgVkVUSF9FT0ZfU0hJRlQJCSgzMi1WRVRIX01BWF9GUkFNRVNfUEVSX01TRykKKworc3RydWN0IHZldGhfZnJhbWVzX2Fja19kYXRhIHsKKwl1MTYgdG9rZW5bVkVUSF9NQVhfQUNLU19QRVJfTVNHXTsKK307CisKK3N0cnVjdCB2ZXRoX2NhcF9kYXRhIHsKKwl1OCBjYXBzX3ZlcnNpb247CisJdTggcnN2ZDE7CisJdTE2IG51bV9idWZmZXJzOworCXUxNiBhY2tfdGhyZXNob2xkOworCXUxNiByc3ZkMjsKKwl1MzIgYWNrX3RpbWVvdXQ7CisJdTMyIHJzdmQzOworCXU2NCByc3ZkNFszXTsKK307CisKK3N0cnVjdCB2ZXRoX2xwZXZlbnQgeworCXN0cnVjdCBIdkxwRXZlbnQgYmFzZV9ldmVudDsKKwl1bmlvbiB7CisJCXN0cnVjdCB2ZXRoX2NhcF9kYXRhIGNhcHNfZGF0YTsKKwkJc3RydWN0IHZldGhfZnJhbWVzX2RhdGEgZnJhbWVzX2RhdGE7CisJCXN0cnVjdCB2ZXRoX2ZyYW1lc19hY2tfZGF0YSBmcmFtZXNfYWNrX2RhdGE7CisJfSB1OworCit9OworCisjZGVmaW5lIERSVl9OQU1FCSJpc2VyaWVzX3ZldGgiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIyLjAiCisKICNkZWZpbmUgVkVUSF9OVU1CVUZGRVJTCQkoMTIwKQogI2RlZmluZSBWRVRIX0FDS1RJTUVPVVQgCSgxMDAwMDAwKSAvKiBtaWNyb3NlY29uZHMgKi8KICNkZWZpbmUgVkVUSF9NQVhfTUNBU1QJCSgxMikKQEAgLTExMyw5ICsxNTcsOSBAQAogCiBzdHJ1Y3QgdmV0aF9tc2cgewogCXN0cnVjdCB2ZXRoX21zZyAqbmV4dDsKLQlzdHJ1Y3QgVmV0aEZyYW1lc0RhdGEgZGF0YTsKKwlzdHJ1Y3QgdmV0aF9mcmFtZXNfZGF0YSBkYXRhOwogCWludCB0b2tlbjsKLQl1bnNpZ25lZCBsb25nIGluX3VzZTsKKwlpbnQgaW5fdXNlOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGRldmljZSAqZGV2OwogfTsKQEAgLTEyNSwyMyArMTY5LDI4IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IHN0YXRlbWFjaGluZV93cTsKIAlzdHJ1Y3QgdmV0aF9tc2cgKm1zZ3M7CiAJaW50IG51bV9ldmVudHM7Ci0Jc3RydWN0IFZldGhDYXBEYXRhIGxvY2FsX2NhcHM7CisJc3RydWN0IHZldGhfY2FwX2RhdGEgbG9jYWxfY2FwczsKIAorCXN0cnVjdCBrb2JqZWN0IGtvYmplY3Q7CiAJc3RydWN0IHRpbWVyX2xpc3QgYWNrX3RpbWVyOwogCisJc3RydWN0IHRpbWVyX2xpc3QgcmVzZXRfdGltZXI7CisJdW5zaWduZWQgaW50IHJlc2V0X3RpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBsYXN0X2NvbnRhY3Q7CisJaW50IG91dHN0YW5kaW5nX3R4OworCiAJc3BpbmxvY2tfdCBsb2NrOwogCXVuc2lnbmVkIGxvbmcgc3RhdGU7CiAJSHZMcEluc3RhbmNlSWQgc3JjX2luc3Q7CiAJSHZMcEluc3RhbmNlSWQgZHN0X2luc3Q7Ci0Jc3RydWN0IFZldGhMcEV2ZW50IGNhcF9ldmVudCwgY2FwX2Fja19ldmVudDsKKwlzdHJ1Y3QgdmV0aF9scGV2ZW50IGNhcF9ldmVudCwgY2FwX2Fja19ldmVudDsKIAl1MTYgcGVuZGluZ19hY2tzW1ZFVEhfTUFYX0FDS1NfUEVSX01TR107CiAJdTMyIG51bV9wZW5kaW5nX2Fja3M7CiAKIAlpbnQgbnVtX2Fja19ldmVudHM7Ci0Jc3RydWN0IFZldGhDYXBEYXRhIHJlbW90ZV9jYXBzOworCXN0cnVjdCB2ZXRoX2NhcF9kYXRhIHJlbW90ZV9jYXBzOwogCXUzMiBhY2tfdGltZW91dDsKIAotCXNwaW5sb2NrX3QgbXNnX3N0YWNrX2xvY2s7CiAJc3RydWN0IHZldGhfbXNnICptc2dfc3RhY2tfaGVhZDsKIH07CiAKQEAgLTE1MSwxNSArMjAwLDE3IEBACiAJdTY0IG1hY19hZGRyOwogCUh2THBJbmRleE1hcCBscGFyX21hcDsKIAotCXNwaW5sb2NrX3QgcGVuZGluZ19nYXRlOwotCXN0cnVjdCBza19idWZmICpwZW5kaW5nX3NrYjsKLQlIdkxwSW5kZXhNYXAgcGVuZGluZ19scG1hc2s7CisJLyogcXVldWVfbG9jayBwcm90ZWN0cyB0aGUgc3RvcHBlZF9tYXAgYW5kIGRldidzIHF1ZXVlLiAqLworCXNwaW5sb2NrX3QgcXVldWVfbG9jazsKKwlIdkxwSW5kZXhNYXAgc3RvcHBlZF9tYXA7CiAKKwkvKiBtY2FzdF9nYXRlIHByb3RlY3RzIHByb21pc2N1b3VzLCBudW1fbWNhc3QgJiBtY2FzdF9hZGRyLiAqLwogCXJ3bG9ja190IG1jYXN0X2dhdGU7CiAJaW50IHByb21pc2N1b3VzOwotCWludCBhbGxfbWNhc3Q7CiAJaW50IG51bV9tY2FzdDsKIAl1NjQgbWNhc3RfYWRkcltWRVRIX01BWF9NQ0FTVF07CisKKwlzdHJ1Y3Qga29iamVjdCBrb2JqZWN0OwogfTsKIAogc3RhdGljIEh2THBJbmRleCB0aGlzX2xwOwpAQCAtMTY4LDQ0ICsyMTksNTYgQEAKIAogc3RhdGljIGludCB2ZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCB2ZXRoX3JlY3ljbGVfbXNnKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqLCBzdHJ1Y3QgdmV0aF9tc2cgKik7Ci1zdGF0aWMgdm9pZCB2ZXRoX2ZsdXNoX3BlbmRpbmcoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngpOwotc3RhdGljIHZvaWQgdmV0aF9yZWNlaXZlKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqLCBzdHJ1Y3QgVmV0aExwRXZlbnQgKik7Ci1zdGF0aWMgdm9pZCB2ZXRoX3RpbWVkX2Fjayh1bnNpZ25lZCBsb25nIGNvbm5lY3Rpb25QdHIpOworc3RhdGljIHZvaWQgdmV0aF93YWtlX3F1ZXVlcyhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCk7CitzdGF0aWMgdm9pZCB2ZXRoX3N0b3BfcXVldWVzKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KTsKK3N0YXRpYyB2b2lkIHZldGhfcmVjZWl2ZShzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKiwgc3RydWN0IHZldGhfbHBldmVudCAqKTsKK3N0YXRpYyB2b2lkIHZldGhfcmVsZWFzZV9jb25uZWN0aW9uKHN0cnVjdCBrb2JqZWN0ICprb2JqZWN0KTsKK3N0YXRpYyB2b2lkIHZldGhfdGltZWRfYWNrKHVuc2lnbmVkIGxvbmcgcHRyKTsKK3N0YXRpYyB2b2lkIHZldGhfdGltZWRfcmVzZXQodW5zaWduZWQgbG9uZyBwdHIpOwogCiAvKgogICogVXRpbGl0eSBmdW5jdGlvbnMKICAqLwogCi0jZGVmaW5lIHZldGhfcHJpbnRrKHByaW8sIGZtdCwgYXJncy4uLikgXAotCXByaW50ayhwcmlvICIlczogIiBmbXQsIF9fRklMRV9fLCAjIyBhcmdzKQorI2RlZmluZSB2ZXRoX2luZm8oZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiAiIGZtdCwgIyMgYXJncykKIAogI2RlZmluZSB2ZXRoX2Vycm9yKGZtdCwgYXJncy4uLikgXAotCXByaW50ayhLRVJOX0VSUiAiKCVzOiUzLjNkKSBFUlJPUjogIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXyAsICMjIGFyZ3MpCisJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IEVycm9yOiAiIGZtdCwgIyMgYXJncykKIAorI2lmZGVmIERFQlVHCisjZGVmaW5lIHZldGhfZGVidWcoZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogIiBmbXQsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSB2ZXRoX2RlYnVnKGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLyogWW91IG11c3QgaG9sZCB0aGUgY29ubmVjdGlvbidzIGxvY2sgd2hlbiB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uLiAqLwogc3RhdGljIGlubGluZSB2b2lkIHZldGhfc3RhY2tfcHVzaChzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCwKIAkJCQkgICBzdHJ1Y3QgdmV0aF9tc2cgKm1zZykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNueC0+bXNnX3N0YWNrX2xvY2ssIGZsYWdzKTsKIAltc2ctPm5leHQgPSBjbngtPm1zZ19zdGFja19oZWFkOwogCWNueC0+bXNnX3N0YWNrX2hlYWQgPSBtc2c7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY254LT5tc2dfc3RhY2tfbG9jaywgZmxhZ3MpOwogfQogCisvKiBZb3UgbXVzdCBob2xkIHRoZSBjb25uZWN0aW9uJ3MgbG9jayB3aGVuIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24uICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB2ZXRoX21zZyAqdmV0aF9zdGFja19wb3Aoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdmV0aF9tc2cgKm1zZzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZjbngtPm1zZ19zdGFja19sb2NrLCBmbGFncyk7CiAJbXNnID0gY254LT5tc2dfc3RhY2tfaGVhZDsKIAlpZiAobXNnKQogCQljbngtPm1zZ19zdGFja19oZWFkID0gY254LT5tc2dfc3RhY2tfaGVhZC0+bmV4dDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbngtPm1zZ19zdGFja19sb2NrLCBmbGFncyk7CisKIAlyZXR1cm4gbXNnOwogfQogCisvKiBZb3UgbXVzdCBob2xkIHRoZSBjb25uZWN0aW9uJ3MgbG9jayB3aGVuIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24uICovCitzdGF0aWMgaW5saW5lIGludCB2ZXRoX3N0YWNrX2lzX2VtcHR5KHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KQoreworCXJldHVybiBjbngtPm1zZ19zdGFja19oZWFkID09IE5VTEw7Cit9CisKIHN0YXRpYyBpbmxpbmUgSHZMcEV2ZW50X1JjCiB2ZXRoX3NpZ25hbGV2ZW50KHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254LCB1MTYgc3VidHlwZSwKIAkJIEh2THBFdmVudF9BY2tJbmQgYWNraW5kLCBIdkxwRXZlbnRfQWNrVHlwZSBhY2t0eXBlLApAQCAtMjQ5LDcgKzMxMiw3IEBACiAJc3RydWN0IHZldGhfYWxsb2NhdGlvbiB2YyA9IHsgQ09NUExFVElPTl9JTklUSUFMSVpFUih2Yy5jKSwgMCB9OwogCiAJbWZfYWxsb2NhdGVfbHBfZXZlbnRzKHJscCwgSHZMcEV2ZW50X1R5cGVfVmlydHVhbExhbiwKLQkJCSAgICBzaXplb2Yoc3RydWN0IFZldGhMcEV2ZW50KSwgbnVtYmVyLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgdmV0aF9scGV2ZW50KSwgbnVtYmVyLAogCQkJICAgICZ2ZXRoX2NvbXBsZXRlX2FsbG9jYXRpb24sICZ2Yyk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmdmMuYyk7CiAKQEAgLTI1Nyw2ICszMjAsMTM3IEBACiB9CiAKIC8qCisgKiBzeXNmcyBzdXBwb3J0CisgKi8KKworc3RydWN0IHZldGhfY254X2F0dHJpYnV0ZSB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKiwgY2hhciAqYnVmKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqLCBjb25zdCBjaGFyICpidWYpOworfTsKKworc3RhdGljIHNzaXplX3QgdmV0aF9jbnhfYXR0cmlidXRlX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmV0aF9jbnhfYXR0cmlidXRlICpjbnhfYXR0cjsKKwlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueDsKKworCWNueF9hdHRyID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCB2ZXRoX2NueF9hdHRyaWJ1dGUsIGF0dHIpOworCWNueCA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24sIGtvYmplY3QpOworCisJaWYgKCFjbnhfYXR0ci0+c2hvdykKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gY254X2F0dHItPnNob3coY254LCBidWYpOworfQorCisjZGVmaW5lIENVU1RPTV9DTlhfQVRUUihfbmFtZSwgX2Zvcm1hdCwgX2V4cHJlc3Npb24pCQkJXAorc3RhdGljIHNzaXplX3QgX25hbWUjI19zaG93KHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254LCBjaGFyICpidWYpXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsIF9mb3JtYXQsIF9leHByZXNzaW9uKTsJCQlcCit9CQkJCQkJCQkJXAorc3RydWN0IHZldGhfY254X2F0dHJpYnV0ZSB2ZXRoX2NueF9hdHRyXyMjX25hbWUgPSBfX0FUVFJfUk8oX25hbWUpCisKKyNkZWZpbmUgU0lNUExFX0NOWF9BVFRSKF9uYW1lKQlcCisJQ1VTVE9NX0NOWF9BVFRSKF9uYW1lLCAiJWx1XG4iLCAodW5zaWduZWQgbG9uZyljbngtPl9uYW1lKQorCitTSU1QTEVfQ05YX0FUVFIob3V0c3RhbmRpbmdfdHgpOworU0lNUExFX0NOWF9BVFRSKHJlbW90ZV9scCk7CitTSU1QTEVfQ05YX0FUVFIobnVtX2V2ZW50cyk7CitTSU1QTEVfQ05YX0FUVFIoc3JjX2luc3QpOworU0lNUExFX0NOWF9BVFRSKGRzdF9pbnN0KTsKK1NJTVBMRV9DTlhfQVRUUihudW1fcGVuZGluZ19hY2tzKTsKK1NJTVBMRV9DTlhfQVRUUihudW1fYWNrX2V2ZW50cyk7CitDVVNUT01fQ05YX0FUVFIoYWNrX3RpbWVvdXQsICIlZFxuIiwgamlmZmllc190b19tc2VjcyhjbngtPmFja190aW1lb3V0KSk7CitDVVNUT01fQ05YX0FUVFIocmVzZXRfdGltZW91dCwgIiVkXG4iLCBqaWZmaWVzX3RvX21zZWNzKGNueC0+cmVzZXRfdGltZW91dCkpOworQ1VTVE9NX0NOWF9BVFRSKHN0YXRlLCAiMHglLjRsWFxuIiwgY254LT5zdGF0ZSk7CitDVVNUT01fQ05YX0FUVFIobGFzdF9jb250YWN0LCAiJWRcbiIsIGNueC0+bGFzdF9jb250YWN0ID8KKwkJamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gY254LT5sYXN0X2NvbnRhY3QpIDogMCk7CisKKyNkZWZpbmUgR0VUX0NOWF9BVFRSKF9uYW1lKQkoJnZldGhfY254X2F0dHJfIyNfbmFtZS5hdHRyKQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdmV0aF9jbnhfZGVmYXVsdF9hdHRyc1tdID0geworCUdFVF9DTlhfQVRUUihvdXRzdGFuZGluZ190eCksCisJR0VUX0NOWF9BVFRSKHJlbW90ZV9scCksCisJR0VUX0NOWF9BVFRSKG51bV9ldmVudHMpLAorCUdFVF9DTlhfQVRUUihyZXNldF90aW1lb3V0KSwKKwlHRVRfQ05YX0FUVFIobGFzdF9jb250YWN0KSwKKwlHRVRfQ05YX0FUVFIoc3RhdGUpLAorCUdFVF9DTlhfQVRUUihzcmNfaW5zdCksCisJR0VUX0NOWF9BVFRSKGRzdF9pbnN0KSwKKwlHRVRfQ05YX0FUVFIobnVtX3BlbmRpbmdfYWNrcyksCisJR0VUX0NOWF9BVFRSKG51bV9hY2tfZXZlbnRzKSwKKwlHRVRfQ05YX0FUVFIoYWNrX3RpbWVvdXQpLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIHZldGhfY254X3N5c2ZzX29wcyA9IHsKKwkJLnNob3cgPSB2ZXRoX2NueF9hdHRyaWJ1dGVfc2hvdworfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgdmV0aF9scGFyX2Nvbm5lY3Rpb25fa3R5cGUgPSB7CisJLnJlbGVhc2UJPSB2ZXRoX3JlbGVhc2VfY29ubmVjdGlvbiwKKwkuc3lzZnNfb3BzCT0gJnZldGhfY254X3N5c2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycwk9IHZldGhfY254X2RlZmF1bHRfYXR0cnMKK307CisKK3N0cnVjdCB2ZXRoX3BvcnRfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCB2ZXRoX3BvcnQgKiwgY2hhciAqYnVmKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCB2ZXRoX3BvcnQgKiwgY29uc3QgY2hhciAqYnVmKTsKK307CisKK3N0YXRpYyBzc2l6ZV90IHZldGhfcG9ydF9hdHRyaWJ1dGVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2ZXRoX3BvcnRfYXR0cmlidXRlICpwb3J0X2F0dHI7CisJc3RydWN0IHZldGhfcG9ydCAqcG9ydDsKKworCXBvcnRfYXR0ciA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgdmV0aF9wb3J0X2F0dHJpYnV0ZSwgYXR0cik7CisJcG9ydCA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgdmV0aF9wb3J0LCBrb2JqZWN0KTsKKworCWlmICghcG9ydF9hdHRyLT5zaG93KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBwb3J0X2F0dHItPnNob3cocG9ydCwgYnVmKTsKK30KKworI2RlZmluZSBDVVNUT01fUE9SVF9BVFRSKF9uYW1lLCBfZm9ybWF0LCBfZXhwcmVzc2lvbikJCQlcCitzdGF0aWMgc3NpemVfdCBfbmFtZSMjX3Nob3coc3RydWN0IHZldGhfcG9ydCAqcG9ydCwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsIF9mb3JtYXQsIF9leHByZXNzaW9uKTsJCQlcCit9CQkJCQkJCQkJXAorc3RydWN0IHZldGhfcG9ydF9hdHRyaWJ1dGUgdmV0aF9wb3J0X2F0dHJfIyNfbmFtZSA9IF9fQVRUUl9STyhfbmFtZSkKKworI2RlZmluZSBTSU1QTEVfUE9SVF9BVFRSKF9uYW1lKQlcCisJQ1VTVE9NX1BPUlRfQVRUUihfbmFtZSwgIiVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpcG9ydC0+X25hbWUpCisKK1NJTVBMRV9QT1JUX0FUVFIocHJvbWlzY3VvdXMpOworU0lNUExFX1BPUlRfQVRUUihudW1fbWNhc3QpOworQ1VTVE9NX1BPUlRfQVRUUihscGFyX21hcCwgIjB4JVhcbiIsIHBvcnQtPmxwYXJfbWFwKTsKK0NVU1RPTV9QT1JUX0FUVFIoc3RvcHBlZF9tYXAsICIweCVYXG4iLCBwb3J0LT5zdG9wcGVkX21hcCk7CitDVVNUT01fUE9SVF9BVFRSKG1hY19hZGRyLCAiMHglbFhcbiIsIHBvcnQtPm1hY19hZGRyKTsKKworI2RlZmluZSBHRVRfUE9SVF9BVFRSKF9uYW1lKQkoJnZldGhfcG9ydF9hdHRyXyMjX25hbWUuYXR0cikKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2ZXRoX3BvcnRfZGVmYXVsdF9hdHRyc1tdID0geworCUdFVF9QT1JUX0FUVFIobWFjX2FkZHIpLAorCUdFVF9QT1JUX0FUVFIobHBhcl9tYXApLAorCUdFVF9QT1JUX0FUVFIoc3RvcHBlZF9tYXApLAorCUdFVF9QT1JUX0FUVFIocHJvbWlzY3VvdXMpLAorCUdFVF9QT1JUX0FUVFIobnVtX21jYXN0KSwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyB2ZXRoX3BvcnRfc3lzZnNfb3BzID0geworCS5zaG93ID0gdmV0aF9wb3J0X2F0dHJpYnV0ZV9zaG93Cit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSB2ZXRoX3BvcnRfa3R5cGUgPSB7CisJLnN5c2ZzX29wcwk9ICZ2ZXRoX3BvcnRfc3lzZnNfb3BzLAorCS5kZWZhdWx0X2F0dHJzCT0gdmV0aF9wb3J0X2RlZmF1bHRfYXR0cnMKK307CisKKy8qCiAgKiBMUEFSIGNvbm5lY3Rpb24gY29kZQogICovCiAKQEAgLTI2Niw3ICs0NjAsNyBAQAogfQogCiBzdGF0aWMgdm9pZCB2ZXRoX3Rha2VfY2FwKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254LAotCQkJICBzdHJ1Y3QgVmV0aExwRXZlbnQgKmV2ZW50KQorCQkJICBzdHJ1Y3QgdmV0aF9scGV2ZW50ICpldmVudCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yNzgsNyArNDcyLDcgQEAKIAkJCQkJCSAgSHZMcEV2ZW50X1R5cGVfVmlydHVhbExhbik7CiAKIAlpZiAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfR09UQ0FQUykgewotCQl2ZXRoX2Vycm9yKCJSZWNlaXZlZCBhIHNlY29uZCBjYXBhYmlsaXRpZXMgZnJvbSBscGFyICVkXG4iLAorCQl2ZXRoX2Vycm9yKCJSZWNlaXZlZCBhIHNlY29uZCBjYXBhYmlsaXRpZXMgZnJvbSBMUEFSICVkLlxuIiwKIAkJCSAgIGNueC0+cmVtb3RlX2xwKTsKIAkJZXZlbnQtPmJhc2VfZXZlbnQueFJjID0gSHZMcEV2ZW50X1JjX0J1ZmZlck5vdEF2YWlsYWJsZTsKIAkJSHZDYWxsRXZlbnRfYWNrTHBFdmVudCgoc3RydWN0IEh2THBFdmVudCAqKSBldmVudCk7CkBAIC0yOTEsMTMgKzQ4NSwxMyBAQAogfQogCiBzdGF0aWMgdm9pZCB2ZXRoX3Rha2VfY2FwX2FjayhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCwKLQkJCSAgICAgIHN0cnVjdCBWZXRoTHBFdmVudCAqZXZlbnQpCisJCQkgICAgICBzdHJ1Y3QgdmV0aF9scGV2ZW50ICpldmVudCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNueC0+bG9jaywgZmxhZ3MpOwogCWlmIChjbngtPnN0YXRlICYgVkVUSF9TVEFURV9HT1RDQVBBQ0spIHsKLQkJdmV0aF9lcnJvcigiUmVjZWl2ZWQgYSBzZWNvbmQgY2FwYWJpbGl0aWVzIGFjayBmcm9tIGxwYXIgJWRcbiIsCisJCXZldGhfZXJyb3IoIlJlY2VpdmVkIGEgc2Vjb25kIGNhcGFiaWxpdGllcyBhY2sgZnJvbSBMUEFSICVkLlxuIiwKIAkJCSAgIGNueC0+cmVtb3RlX2xwKTsKIAl9IGVsc2UgewogCQltZW1jcHkoJmNueC0+Y2FwX2Fja19ldmVudCwgZXZlbnQsCkBAIC0zMDksMTkgKzUwMywyNCBAQAogfQogCiBzdGF0aWMgdm9pZCB2ZXRoX3Rha2VfbW9uaXRvcl9hY2soc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCi0JCQkJICBzdHJ1Y3QgVmV0aExwRXZlbnQgKmV2ZW50KQorCQkJCSAgc3RydWN0IHZldGhfbHBldmVudCAqZXZlbnQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjbngtPmxvY2ssIGZsYWdzKTsKLQl2ZXRoX3ByaW50ayhLRVJOX0RFQlVHLCAiTW9uaXRvciBhY2sgcmV0dXJuZWQgZm9yIGxwYXIgJWRcbiIsCi0JCSAgICBjbngtPnJlbW90ZV9scCk7Ci0JY254LT5zdGF0ZSB8PSBWRVRIX1NUQVRFX1JFU0VUOwotCXZldGhfa2lja19zdGF0ZW1hY2hpbmUoY254KTsKKwl2ZXRoX2RlYnVnKCJjbnggJWQ6IGxvc3QgY29ubmVjdGlvbi5cbiIsIGNueC0+cmVtb3RlX2xwKTsKKworCS8qIEF2b2lkIGtpY2tpbmcgdGhlIHN0YXRlbWFjaGluZSBvbmNlIHdlJ3JlIHNodXRkb3duLgorCSAqIEl0J3MgdW5uZWNlc3NhcnkgYW5kIGl0IGNvdWxkIGJyZWFrIHZldGhfc3RvcF9jb25uZWN0aW9uKCkuICovCisKKwlpZiAoISAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfU0hVVERPV04pKSB7CisJCWNueC0+c3RhdGUgfD0gVkVUSF9TVEFURV9SRVNFVDsKKwkJdmV0aF9raWNrX3N0YXRlbWFjaGluZShjbngpOworCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbngtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgdmV0aF9oYW5kbGVfYWNrKHN0cnVjdCBWZXRoTHBFdmVudCAqZXZlbnQpCitzdGF0aWMgdm9pZCB2ZXRoX2hhbmRsZV9hY2soc3RydWN0IHZldGhfbHBldmVudCAqZXZlbnQpCiB7CiAJSHZMcEluZGV4IHJscCA9IGV2ZW50LT5iYXNlX2V2ZW50LnhUYXJnZXRMcDsKIAlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCA9IHZldGhfY254W3JscF07CkBAIC0zMjksNTggKzUyOCw2NyBAQAogCUJVR19PTighIGNueCk7CiAKIAlzd2l0Y2ggKGV2ZW50LT5iYXNlX2V2ZW50LnhTdWJ0eXBlKSB7Ci0JY2FzZSBWZXRoRXZlbnRUeXBlQ2FwOgorCWNhc2UgVkVUSF9FVkVOVF9DQVA6CiAJCXZldGhfdGFrZV9jYXBfYWNrKGNueCwgZXZlbnQpOwogCQlicmVhazsKLQljYXNlIFZldGhFdmVudFR5cGVNb25pdG9yOgorCWNhc2UgVkVUSF9FVkVOVF9NT05JVE9SOgogCQl2ZXRoX3Rha2VfbW9uaXRvcl9hY2soY254LCBldmVudCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXZldGhfZXJyb3IoIlVua25vd24gYWNrIHR5cGUgJWQgZnJvbSBscGFyICVkXG4iLAotCQkJICAgZXZlbnQtPmJhc2VfZXZlbnQueFN1YnR5cGUsIHJscCk7CisJCXZldGhfZXJyb3IoIlVua25vd24gYWNrIHR5cGUgJWQgZnJvbSBMUEFSICVkLlxuIiwKKwkJCQlldmVudC0+YmFzZV9ldmVudC54U3VidHlwZSwgcmxwKTsKIAl9OwogfQogCi1zdGF0aWMgdm9pZCB2ZXRoX2hhbmRsZV9pbnQoc3RydWN0IFZldGhMcEV2ZW50ICpldmVudCkKK3N0YXRpYyB2b2lkIHZldGhfaGFuZGxlX2ludChzdHJ1Y3QgdmV0aF9scGV2ZW50ICpldmVudCkKIHsKIAlIdkxwSW5kZXggcmxwID0gZXZlbnQtPmJhc2VfZXZlbnQueFNvdXJjZUxwOwogCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254ID0gdmV0aF9jbnhbcmxwXTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOworCWludCBpLCBhY2tlZCA9IDA7CiAKIAlCVUdfT04oISBjbngpOwogCiAJc3dpdGNoIChldmVudC0+YmFzZV9ldmVudC54U3VidHlwZSkgewotCWNhc2UgVmV0aEV2ZW50VHlwZUNhcDoKKwljYXNlIFZFVEhfRVZFTlRfQ0FQOgogCQl2ZXRoX3Rha2VfY2FwKGNueCwgZXZlbnQpOwogCQlicmVhazsKLQljYXNlIFZldGhFdmVudFR5cGVNb25pdG9yOgorCWNhc2UgVkVUSF9FVkVOVF9NT05JVE9SOgogCQkvKiBkbyBub3RoaW5nLi4uIHRoaXMnbGwgaGFuZyBvdXQgaGVyZSB0aWwgd2UncmUgZGVhZCwKIAkJICogYW5kIHRoZSBoeXBlcnZpc29yIHdpbGwgcmV0dXJuIGl0IGZvciB1cy4gKi8KIAkJYnJlYWs7Ci0JY2FzZSBWZXRoRXZlbnRUeXBlRnJhbWVzQWNrOgorCWNhc2UgVkVUSF9FVkVOVF9GUkFNRVNfQUNLOgogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY254LT5sb2NrLCBmbGFncyk7CisKIAkJZm9yIChpID0gMDsgaSA8IFZFVEhfTUFYX0FDS1NfUEVSX01TRzsgKytpKSB7CiAJCQl1MTYgbXNnbnVtID0gZXZlbnQtPnUuZnJhbWVzX2Fja19kYXRhLnRva2VuW2ldOwogCi0JCQlpZiAobXNnbnVtIDwgVkVUSF9OVU1CVUZGRVJTKQorCQkJaWYgKG1zZ251bSA8IFZFVEhfTlVNQlVGRkVSUykgewogCQkJCXZldGhfcmVjeWNsZV9tc2coY254LCBjbngtPm1zZ3MgKyBtc2dudW0pOworCQkJCWNueC0+b3V0c3RhbmRpbmdfdHgtLTsKKwkJCQlhY2tlZCsrOworCQkJfQogCQl9CisKKwkJaWYgKGFja2VkID4gMCkgeworCQkJY254LT5sYXN0X2NvbnRhY3QgPSBqaWZmaWVzOworCQkJdmV0aF93YWtlX3F1ZXVlcyhjbngpOworCQl9CisKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY254LT5sb2NrLCBmbGFncyk7Ci0JCXZldGhfZmx1c2hfcGVuZGluZyhjbngpOwogCQlicmVhazsKLQljYXNlIFZldGhFdmVudFR5cGVGcmFtZXM6CisJY2FzZSBWRVRIX0VWRU5UX0ZSQU1FUzoKIAkJdmV0aF9yZWNlaXZlKGNueCwgZXZlbnQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQl2ZXRoX2Vycm9yKCJVbmtub3duIGludGVycnVwdCB0eXBlICVkIGZyb20gbHBhciAlZFxuIiwKLQkJCSAgIGV2ZW50LT5iYXNlX2V2ZW50LnhTdWJ0eXBlLCBybHApOworCQl2ZXRoX2Vycm9yKCJVbmtub3duIGludGVycnVwdCB0eXBlICVkIGZyb20gTFBBUiAlZC5cbiIsCisJCQkJZXZlbnQtPmJhc2VfZXZlbnQueFN1YnR5cGUsIHJscCk7CiAJfTsKIH0KIAogc3RhdGljIHZvaWQgdmV0aF9oYW5kbGVfZXZlbnQoc3RydWN0IEh2THBFdmVudCAqZXZlbnQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBWZXRoTHBFdmVudCAqdmV0aF9ldmVudCA9IChzdHJ1Y3QgVmV0aExwRXZlbnQgKilldmVudDsKKwlzdHJ1Y3QgdmV0aF9scGV2ZW50ICp2ZXRoX2V2ZW50ID0gKHN0cnVjdCB2ZXRoX2xwZXZlbnQgKilldmVudDsKIAogCWlmIChldmVudC0+eEZsYWdzLnhGdW5jdGlvbiA9PSBIdkxwRXZlbnRfRnVuY3Rpb25fQWNrKQogCQl2ZXRoX2hhbmRsZV9hY2sodmV0aF9ldmVudCk7CkBAIC0zOTAsNyArNTk4LDcgQEAKIAogc3RhdGljIGludCB2ZXRoX3Byb2Nlc3NfY2FwcyhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCkKIHsKLQlzdHJ1Y3QgVmV0aENhcERhdGEgKnJlbW90ZV9jYXBzID0gJmNueC0+cmVtb3RlX2NhcHM7CisJc3RydWN0IHZldGhfY2FwX2RhdGEgKnJlbW90ZV9jYXBzID0gJmNueC0+cmVtb3RlX2NhcHM7CiAJaW50IG51bV9hY2tzX25lZWRlZDsKIAogCS8qIENvbnZlcnQgdGltZXIgdG8gamlmZmllcyAqLwpAQCAtNDAwLDggKzYwOCw4IEBACiAJICAgICB8fCAocmVtb3RlX2NhcHMtPmFja190aHJlc2hvbGQgPiBWRVRIX01BWF9BQ0tTX1BFUl9NU0cpCiAJICAgICB8fCAocmVtb3RlX2NhcHMtPmFja190aHJlc2hvbGQgPT0gMCkKIAkgICAgIHx8IChjbngtPmFja190aW1lb3V0ID09IDApICkgewotCQl2ZXRoX2Vycm9yKCJSZWNlaXZlZCBpbmNvbXBhdGlibGUgY2FwYWJpbGl0aWVzIGZyb20gbHBhciAlZFxuIiwKLQkJCSAgIGNueC0+cmVtb3RlX2xwKTsKKwkJdmV0aF9lcnJvcigiUmVjZWl2ZWQgaW5jb21wYXRpYmxlIGNhcGFiaWxpdGllcyBmcm9tIExQQVIgJWQuXG4iLAorCQkJCWNueC0+cmVtb3RlX2xwKTsKIAkJcmV0dXJuIEh2THBFdmVudF9SY19JbnZhbGlkU3VidHlwZURhdGE7CiAJfQogCkBAIC00MTgsOCArNjI2LDggQEAKIAkJCWNueC0+bnVtX2Fja19ldmVudHMgKz0gbnVtOwogCiAJCWlmIChjbngtPm51bV9hY2tfZXZlbnRzIDwgbnVtX2Fja3NfbmVlZGVkKSB7Ci0JCQl2ZXRoX2Vycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBlbm91Z2ggYWNrIGV2ZW50cyBmb3IgbHBhciAlZFxuIiwKLQkJCQkgICBjbngtPnJlbW90ZV9scCk7CisJCQl2ZXRoX2Vycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBlbm91Z2ggYWNrIGV2ZW50cyAiCisJCQkJCSJmb3IgTFBBUiAlZC5cbiIsIGNueC0+cmVtb3RlX2xwKTsKIAogCQkJcmV0dXJuIEh2THBFdmVudF9SY19CdWZmZXJOb3RBdmFpbGFibGU7CiAJCX0KQEAgLTQ0MCwxNSArNjQ4LDE1IEBACiAKICByZXN0YXJ0OgogCWlmIChjbngtPnN0YXRlICYgVkVUSF9TVEFURV9SRVNFVCkgewotCQlpbnQgaTsKLQotCQlkZWxfdGltZXIoJmNueC0+YWNrX3RpbWVyKTsKLQogCQlpZiAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfT1BFTikKIAkJCUh2Q2FsbEV2ZW50X2Nsb3NlTHBFdmVudFBhdGgoY254LT5yZW1vdGVfbHAsCiAJCQkJCQkgICAgIEh2THBFdmVudF9UeXBlX1ZpcnR1YWxMYW4pOwogCi0JCS8qIHJlc2V0IGFjayBkYXRhICovCisJCS8qCisJCSAqIFJlc2V0IGFjayBkYXRhLiBUaGlzIHByZXZlbnRzIHRoZSBhY2tfdGltZXIgYWN0dWFsbHkKKwkJICogZG9pbmcgYW55dGhpbmcsIGV2ZW4gaWYgaXQgcnVucyBvbmUgbW9yZSB0aW1lIHdoZW4KKwkJICogd2UgZHJvcCB0aGUgbG9jayBiZWxvdy4KKwkJICovCiAJCW1lbXNldCgmY254LT5wZW5kaW5nX2Fja3MsIDB4ZmYsIHNpemVvZiAoY254LT5wZW5kaW5nX2Fja3MpKTsKIAkJY254LT5udW1fcGVuZGluZ19hY2tzID0gMDsKIApAQCAtNDU4LDE0ICs2NjYsMzIgQEAKIAkJCQl8IFZFVEhfU1RBVEVfU0VOVENBUEFDSyB8IFZFVEhfU1RBVEVfUkVBRFkpOwogCiAJCS8qIENsZWFuIHVwIGFueSBsZWZ0b3ZlciBtZXNzYWdlcyAqLwotCQlpZiAoY254LT5tc2dzKQorCQlpZiAoY254LT5tc2dzKSB7CisJCQlpbnQgaTsKIAkJCWZvciAoaSA9IDA7IGkgPCBWRVRIX05VTUJVRkZFUlM7ICsraSkKIAkJCQl2ZXRoX3JlY3ljbGVfbXNnKGNueCwgY254LT5tc2dzICsgaSk7CisJCX0KKworCQljbngtPm91dHN0YW5kaW5nX3R4ID0gMDsKKwkJdmV0aF93YWtlX3F1ZXVlcyhjbngpOworCisJCS8qIERyb3AgdGhlIGxvY2sgc28gd2UgY2FuIGRvIHN0dWZmIHRoYXQgbWlnaHQgc2xlZXAgb3IKKwkJICogdGFrZSBvdGhlciBsb2Nrcy4gKi8KIAkJc3Bpbl91bmxvY2tfaXJxKCZjbngtPmxvY2spOwotCQl2ZXRoX2ZsdXNoX3BlbmRpbmcoY254KTsKKworCQlkZWxfdGltZXJfc3luYygmY254LT5hY2tfdGltZXIpOworCQlkZWxfdGltZXJfc3luYygmY254LT5yZXNldF90aW1lcik7CisKIAkJc3Bpbl9sb2NrX2lycSgmY254LT5sb2NrKTsKKwogCQlpZiAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfUkVTRVQpCiAJCQlnb3RvIHJlc3RhcnQ7CisKKwkJLyogSGFjaywgd2FpdCBmb3IgdGhlIG90aGVyIGVuZCB0byByZXNldCBpdHNlbGYuICovCisJCWlmICghIChjbngtPnN0YXRlICYgVkVUSF9TVEFURV9TSFVURE9XTikpIHsKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY254LT5zdGF0ZW1hY2hpbmVfd3EsIDUgKiBIWik7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAogCWlmIChjbngtPnN0YXRlICYgVkVUSF9TVEFURV9TSFVURE9XTikKQEAgLTQ4OCw3ICs3MTQsNyBAQAogCiAJaWYgKCAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfT1BFTikKIAkgICAgICYmICEoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfU0VOVE1PTikgKSB7Ci0JCXJjID0gdmV0aF9zaWduYWxldmVudChjbngsIFZldGhFdmVudFR5cGVNb25pdG9yLAorCQlyYyA9IHZldGhfc2lnbmFsZXZlbnQoY254LCBWRVRIX0VWRU5UX01PTklUT1IsCiAJCQkJICAgICAgSHZMcEV2ZW50X0Fja0luZF9Eb0FjaywKIAkJCQkgICAgICBIdkxwRXZlbnRfQWNrVHlwZV9EZWZlcnJlZEFjaywKIAkJCQkgICAgICAwLCAwLCAwLCAwLCAwLCAwKTsKQEAgLTQ5OCw5ICs3MjQsOCBAQAogCQl9IGVsc2UgewogCQkJaWYgKCAocmMgIT0gSHZMcEV2ZW50X1JjX1BhcnRpdGlvbkRlYWQpCiAJCQkgICAgICYmIChyYyAhPSBIdkxwRXZlbnRfUmNfUGF0aENsb3NlZCkgKQotCQkJCXZldGhfZXJyb3IoIkVycm9yIHNlbmRpbmcgbW9uaXRvciB0byAiCi0JCQkJCSAgICJscGFyICVkLCByYz0leFxuIiwKLQkJCQkJICAgcmxwLCAoaW50KSByYyk7CisJCQkJdmV0aF9lcnJvcigiRXJyb3Igc2VuZGluZyBtb25pdG9yIHRvIExQQVIgJWQsICIKKwkJCQkJCSJyYyA9ICVkXG4iLCBybHAsIHJjKTsKIAogCQkJLyogT2ggd2VsbCwgaG9wZSB3ZSBnZXQgYSBjYXAgZnJvbSB0aGUgb3RoZXIKIAkJCSAqIGVuZCBhbmQgZG8gYmV0dGVyIHdoZW4gdGhhdCBraWNrcyB1cyAqLwpAQCAtNTEyLDcgKzczNyw3IEBACiAJICAgICAmJiAhKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX1NFTlRDQVBTKSkgewogCQl1NjQgKnJhd2NhcCA9ICh1NjQgKikmY254LT5sb2NhbF9jYXBzOwogCi0JCXJjID0gdmV0aF9zaWduYWxldmVudChjbngsIFZldGhFdmVudFR5cGVDYXAsCisJCXJjID0gdmV0aF9zaWduYWxldmVudChjbngsIFZFVEhfRVZFTlRfQ0FQLAogCQkJCSAgICAgIEh2THBFdmVudF9BY2tJbmRfRG9BY2ssCiAJCQkJICAgICAgSHZMcEV2ZW50X0Fja1R5cGVfSW1tZWRpYXRlQWNrLAogCQkJCSAgICAgIDAsIHJhd2NhcFswXSwgcmF3Y2FwWzFdLCByYXdjYXBbMl0sCkBAIC01MjMsOSArNzQ4LDkgQEAKIAkJfSBlbHNlIHsKIAkJCWlmICggKHJjICE9IEh2THBFdmVudF9SY19QYXJ0aXRpb25EZWFkKQogCQkJICAgICAmJiAocmMgIT0gSHZMcEV2ZW50X1JjX1BhdGhDbG9zZWQpICkKLQkJCQl2ZXRoX2Vycm9yKCJFcnJvciBzZW5kaW5nIGNhcHMgdG8gIgotCQkJCQkgICAibHBhciAlZCwgcmM9JXhcbiIsCi0JCQkJCSAgIHJscCwgKGludCkgcmMpOworCQkJCXZldGhfZXJyb3IoIkVycm9yIHNlbmRpbmcgY2FwcyB0byBMUEFSICVkLCAiCisJCQkJCQkicmMgPSAlZFxuIiwgcmxwLCByYyk7CisKIAkJCS8qIE9oIHdlbGwsIGhvcGUgd2UgZ2V0IGEgY2FwIGZyb20gdGhlIG90aGVyCiAJCQkgKiBlbmQgYW5kIGRvIGJldHRlciB3aGVuIHRoYXQga2lja3MgdXMgKi8KIAkJCWdvdG8gb3V0OwpAQCAtNTM0LDcgKzc1OSw3IEBACiAKIAlpZiAoKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX0dPVENBUFMpCiAJICAgICYmICEoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfU0VOVENBUEFDSykpIHsKLQkJc3RydWN0IFZldGhDYXBEYXRhICpyZW1vdGVfY2FwcyA9ICZjbngtPnJlbW90ZV9jYXBzOworCQlzdHJ1Y3QgdmV0aF9jYXBfZGF0YSAqcmVtb3RlX2NhcHMgPSAmY254LT5yZW1vdGVfY2FwczsKIAogCQltZW1jcHkocmVtb3RlX2NhcHMsICZjbngtPmNhcF9ldmVudC51LmNhcHNfZGF0YSwKIAkJICAgICAgIHNpemVvZigqcmVtb3RlX2NhcHMpKTsKQEAgLTU2NSwxMCArNzkwLDggQEAKIAkJCWFkZF90aW1lcigmY254LT5hY2tfdGltZXIpOwogCQkJY254LT5zdGF0ZSB8PSBWRVRIX1NUQVRFX1JFQURZOwogCQl9IGVsc2UgewotCQkJdmV0aF9wcmludGsoS0VSTl9FUlIsICJDYXBzIHJlamVjdGVkIChyYz0lZCkgYnkgIgotCQkJCSAgICAibHBhciAlZFxuIiwKLQkJCQkgICAgY254LT5jYXBfYWNrX2V2ZW50LmJhc2VfZXZlbnQueFJjLAotCQkJCSAgICBybHApOworCQkJdmV0aF9lcnJvcigiQ2FwcyByZWplY3RlZCBieSBMUEFSICVkLCByYyA9ICVkXG4iLAorCQkJCQlybHAsIGNueC0+Y2FwX2Fja19ldmVudC5iYXNlX2V2ZW50LnhSYyk7CiAJCQlnb3RvIGNhbnRfY29wZTsKIAkJfQogCX0KQEAgLTU4MSw4ICs4MDQsOCBAQAogCS8qIEZJWE1FOiB3ZSBnZXQgaGVyZSBpZiBzb21ldGhpbmcgaGFwcGVucyB3ZSByZWFsbHkgY2FuJ3QKIAkgKiBjb3BlIHdpdGguICBUaGUgbGluayB3aWxsIG5ldmVyIHdvcmsgb25jZSB3ZSBnZXQgaGVyZSwgYW5kCiAJICogYWxsIHdlIGNhbiBkbyBpcyBub3QgbG9jayB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtIHVwICovCi0JdmV0aF9lcnJvcigiQmFkbmVzcyBvbiBjb25uZWN0aW9uIHRvIGxwYXIgJWQgKHN0YXRlPSUwNGx4KSAiCi0JCSAgICIgLSBzaHV0dGluZyBkb3duXG4iLCBybHAsIGNueC0+c3RhdGUpOworCXZldGhfZXJyb3IoIlVucmVjb3ZlcmFibGUgZXJyb3Igb24gY29ubmVjdGlvbiB0byBMUEFSICVkLCBzaHV0dGluZyBkb3duIgorCQkJIiAoc3RhdGUgPSAweCUwNGx4KVxuIiwgcmxwLCBjbngtPnN0YXRlKTsKIAljbngtPnN0YXRlIHw9IFZFVEhfU1RBVEVfU0hVVERPV047CiAJc3Bpbl91bmxvY2tfaXJxKCZjbngtPmxvY2spOwogfQpAQCAtNTkxLDcgKzgxNCw3IEBACiB7CiAJc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbng7CiAJc3RydWN0IHZldGhfbXNnICptc2dzOwotCWludCBpOworCWludCBpLCByYzsKIAogCWlmICggKHJscCA9PSB0aGlzX2xwKQogCSAgICAgfHwgISBIdkxwQ29uZmlnX2RvTHBzQ29tbXVuaWNhdGVPblZpcnR1YWxMYW4odGhpc19scCwgcmxwKSApCkBAIC02MDUsMjIgKzgyOCwzNiBAQAogCWNueC0+cmVtb3RlX2xwID0gcmxwOwogCXNwaW5fbG9ja19pbml0KCZjbngtPmxvY2spOwogCUlOSVRfV09SSygmY254LT5zdGF0ZW1hY2hpbmVfd3EsIHZldGhfc3RhdGVtYWNoaW5lLCBjbngpOworCiAJaW5pdF90aW1lcigmY254LT5hY2tfdGltZXIpOwogCWNueC0+YWNrX3RpbWVyLmZ1bmN0aW9uID0gdmV0aF90aW1lZF9hY2s7CiAJY254LT5hY2tfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjbng7CisKKwlpbml0X3RpbWVyKCZjbngtPnJlc2V0X3RpbWVyKTsKKwljbngtPnJlc2V0X3RpbWVyLmZ1bmN0aW9uID0gdmV0aF90aW1lZF9yZXNldDsKKwljbngtPnJlc2V0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY254OworCWNueC0+cmVzZXRfdGltZW91dCA9IDUgKiBIWiAqIChWRVRIX0FDS1RJTUVPVVQgLyAxMDAwMDAwKTsKKwogCW1lbXNldCgmY254LT5wZW5kaW5nX2Fja3MsIDB4ZmYsIHNpemVvZiAoY254LT5wZW5kaW5nX2Fja3MpKTsKIAogCXZldGhfY254W3JscF0gPSBjbng7CiAKKwkvKiBUaGlzIGdldHMgdXMgMSByZWZlcmVuY2UsIHdoaWNoIGlzIGhlbGQgb24gYmVoYWxmIG9mIHRoZSBkcml2ZXIKKwkgKiBpbmZyYXN0cnVjdHVyZS4gSXQncyByZWxlYXNlZCBhdCBtb2R1bGUgdW5sb2FkLiAqLworCWtvYmplY3RfaW5pdCgmY254LT5rb2JqZWN0KTsKKwljbngtPmtvYmplY3Qua3R5cGUgPSAmdmV0aF9scGFyX2Nvbm5lY3Rpb25fa3R5cGU7CisJcmMgPSBrb2JqZWN0X3NldF9uYW1lKCZjbngtPmtvYmplY3QsICJjbnglLjJkIiwgcmxwKTsKKwlpZiAocmMgIT0gMCkKKwkJcmV0dXJuIHJjOworCiAJbXNncyA9IGttYWxsb2MoVkVUSF9OVU1CVUZGRVJTICogc2l6ZW9mKHN0cnVjdCB2ZXRoX21zZyksIEdGUF9LRVJORUwpOwogCWlmICghIG1zZ3MpIHsKLQkJdmV0aF9lcnJvcigiQ2FuJ3QgYWxsb2NhdGUgYnVmZmVycyBmb3IgbHBhciAlZFxuIiwgcmxwKTsKKwkJdmV0aF9lcnJvcigiQ2FuJ3QgYWxsb2NhdGUgYnVmZmVycyBmb3IgTFBBUiAlZC5cbiIsIHJscCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWNueC0+bXNncyA9IG1zZ3M7CiAJbWVtc2V0KG1zZ3MsIDAsIFZFVEhfTlVNQlVGRkVSUyAqIHNpemVvZihzdHJ1Y3QgdmV0aF9tc2cpKTsKLQlzcGluX2xvY2tfaW5pdCgmY254LT5tc2dfc3RhY2tfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgVkVUSF9OVU1CVUZGRVJTOyBpKyspIHsKIAkJbXNnc1tpXS50b2tlbiA9IGk7CkBAIC02MzAsOCArODY3LDcgQEAKIAljbngtPm51bV9ldmVudHMgPSB2ZXRoX2FsbG9jYXRlX2V2ZW50cyhybHAsIDIgKyBWRVRIX05VTUJVRkZFUlMpOwogCiAJaWYgKGNueC0+bnVtX2V2ZW50cyA8ICgyICsgVkVUSF9OVU1CVUZGRVJTKSkgewotCQl2ZXRoX2Vycm9yKCJDYW4ndCBhbGxvY2F0ZSBldmVudHMgZm9yIGxwYXIgJWQsIG9ubHkgZ290ICVkXG4iLAotCQkJICAgcmxwLCBjbngtPm51bV9ldmVudHMpOworCQl2ZXRoX2Vycm9yKCJDYW4ndCBhbGxvY2F0ZSBlbm91Z2ggZXZlbnRzIGZvciBMUEFSICVkLlxuIiwgcmxwKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC02NDIsMTEgKzg3OCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHZldGhfc3RvcF9jb25uZWN0aW9uKHU4IHJscCkKK3N0YXRpYyB2b2lkIHZldGhfc3RvcF9jb25uZWN0aW9uKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KQogewotCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254ID0gdmV0aF9jbnhbcmxwXTsKLQotCWlmICghIGNueCkKKwlpZiAoIWNueCkKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycSgmY254LT5sb2NrKTsKQEAgLTY1NCwxMiArODg4LDIzIEBACiAJdmV0aF9raWNrX3N0YXRlbWFjaGluZShjbngpOwogCXNwaW5fdW5sb2NrX2lycSgmY254LT5sb2NrKTsKIAotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJLyogVGhlcmUncyBhIHNsaW0gY2hhbmNlIHRoZSByZXNldCBjb2RlIGhhcyBqdXN0IHF1ZXVlZCB0aGUKKwkgKiBzdGF0ZW1hY2hpbmUgdG8gcnVuIGluIGZpdmUgc2Vjb25kcy4gSWYgc28gd2UgbmVlZCB0byBjYW5jZWwKKwkgKiB0aGF0IGFuZCByZXF1ZXVlIHRoZSB3b3JrIHRvIHJ1biBub3cuICovCisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJmNueC0+c3RhdGVtYWNoaW5lX3dxKSkgeworCQlzcGluX2xvY2tfaXJxKCZjbngtPmxvY2spOworCQl2ZXRoX2tpY2tfc3RhdGVtYWNoaW5lKGNueCk7CisJCXNwaW5fdW5sb2NrX2lycSgmY254LT5sb2NrKTsKKwl9CiAKLQkvKiBGSVhNRTogbm90IHN1cmUgaWYgdGhpcyBpcyBuZWNlc3NhcnkgLSB3aWxsIGFscmVhZHkgaGF2ZQotCSAqIGJlZW4gZGVsZXRlZCBieSB0aGUgc3RhdGUgbWFjaGluZSwganVzdCB3YW50IHRvIG1ha2Ugc3VyZQotCSAqIGl0cyBub3QgcnVubmluZyBhbnkgbW9yZSAqLwotCWRlbF90aW1lcl9zeW5jKCZjbngtPmFja190aW1lcik7CisJLyogV2FpdCBmb3IgdGhlIHN0YXRlIG1hY2hpbmUgdG8gcnVuLiAqLworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfZGVzdHJveV9jb25uZWN0aW9uKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KQoreworCWlmICghY254KQorCQlyZXR1cm47CiAKIAlpZiAoY254LT5udW1fZXZlbnRzID4gMCkKIAkJbWZfZGVhbGxvY2F0ZV9scF9ldmVudHMoY254LT5yZW1vdGVfbHAsCkBAIC02NzEsMTggKzkxNiwxOCBAQAogCQkJCSAgICAgIEh2THBFdmVudF9UeXBlX1ZpcnR1YWxMYW4sCiAJCQkJICAgICAgY254LT5udW1fYWNrX2V2ZW50cywKIAkJCQkgICAgICBOVUxMLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgdmV0aF9kZXN0cm95X2Nvbm5lY3Rpb24odTggcmxwKQotewotCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254ID0gdmV0aF9jbnhbcmxwXTsKLQotCWlmICghIGNueCkKLQkJcmV0dXJuOwogCiAJa2ZyZWUoY254LT5tc2dzKTsKKwl2ZXRoX2NueFtjbngtPnJlbW90ZV9scF0gPSBOVUxMOwogCWtmcmVlKGNueCk7Ci0JdmV0aF9jbnhbcmxwXSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfcmVsZWFzZV9jb25uZWN0aW9uKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254OworCWNueCA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24sIGtvYmplY3QpOworCXZldGhfc3RvcF9jb25uZWN0aW9uKGNueCk7CisJdmV0aF9kZXN0cm95X2Nvbm5lY3Rpb24oY254KTsKIH0KIAogLyoKQEAgLTcyNiwxNyArOTcxLDE1IEBACiAKIAl3cml0ZV9sb2NrX2lycXNhdmUoJnBvcnQtPm1jYXN0X2dhdGUsIGZsYWdzKTsKIAotCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJLyogc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsCi0JCSAgICAgICBkZXYtPm5hbWUpOworCWlmICgoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwKKwkJCShkZXYtPm1jX2NvdW50ID4gVkVUSF9NQVhfTUNBU1QpKSB7CiAJCXBvcnQtPnByb21pc2N1b3VzID0gMTsKLQl9IGVsc2UgaWYgKCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKLQkJICAgIHx8IChkZXYtPm1jX2NvdW50ID4gVkVUSF9NQVhfTUNBU1QpICkgewotCQlwb3J0LT5hbGxfbWNhc3QgPSAxOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OwogCQlpbnQgaTsKIAorCQlwb3J0LT5wcm9taXNjdW91cyA9IDA7CisKIAkJLyogVXBkYXRlIHRhYmxlICovCiAJCXBvcnQtPm51bV9tY2FzdCA9IDA7CiAKQEAgLTc1OCw5ICsxMDAxLDEwIEBACiAKIHN0YXRpYyB2b2lkIHZldGhfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKLQlzdHJuY3B5KGluZm8tPmRyaXZlciwgInZldGgiLCBzaXplb2YoaW5mby0+ZHJpdmVyKSAtIDEpOworCXN0cm5jcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikgLSAxKTsKIAlpbmZvLT5kcml2ZXJbc2l6ZW9mKGluZm8tPmRyaXZlcikgLSAxXSA9ICdcMCc7Ci0Jc3RybmNweShpbmZvLT52ZXJzaW9uLCAiMS4wIiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pIC0gMSk7CisJc3RybmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pIC0gMSk7CisJaW5mby0+dmVyc2lvbltzaXplb2YoaW5mby0+dmVyc2lvbikgLSAxXSA9ICdcMCc7CiB9CiAKIHN0YXRpYyBpbnQgdmV0aF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQpAQCAtNzkxLDQ5ICsxMDM1LDYgQEAKIAkuZ2V0X2xpbmsgPSB2ZXRoX2dldF9saW5rLAogfTsKIAotc3RhdGljIHZvaWQgdmV0aF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHZldGhfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdmV0aF9wb3J0ICopZGV2LT5wcml2OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwb3J0LT5zdGF0czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOwotCi0Jc3RhdHMtPnR4X2Vycm9ycysrOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPnBlbmRpbmdfZ2F0ZSwgZmxhZ3MpOwotCi0JaWYgKCFwb3J0LT5wZW5kaW5nX2xwbWFzaykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5wZW5kaW5nX2dhdGUsIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUeCB0aW1lb3V0ISAgUmVzZXR0aW5nIGxwIGNvbm5lY3Rpb25zOiAlMDh4XG4iLAotCSAgICAgICBkZXYtPm5hbWUsIHBvcnQtPnBlbmRpbmdfbHBtYXNrKTsKLQotCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVETFBTOyBpKyspIHsKLQkJc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbnggPSB2ZXRoX2NueFtpXTsKLQotCQlpZiAoISAocG9ydC0+cGVuZGluZ19scG1hc2sgJiAoMTw8aSkpKQotCQkJY29udGludWU7Ci0KLQkJLyogSWYgd2UncmUgcGVuZGluZyBvbiBpdCwgd2UgbXVzdCBiZSBjb25uZWN0ZWQgdG8gaXQsCi0JCSAqIHNvIHdlIHNob3VsZCBjZXJ0YWlubHkgaGF2ZSBhIHN0cnVjdHVyZSBmb3IgaXQuICovCi0JCUJVR19PTighIGNueCk7Ci0KLQkJLyogVGhlb3JldGljYWxseSB3ZSBjb3VsZCBiZSBraWNraW5nIGEgY29ubmVjdGlvbgotCQkgKiB3aGljaCBkb2Vzbid0IGRlc2VydmUgaXQsIGJ1dCBpbiBwcmFjdGljZSBpZiB3ZSd2ZQotCQkgKiBoYWQgYSBUeCB0aW1lb3V0LCB0aGUgcGVuZGluZ19scG1hc2sgd2lsbCBoYXZlCi0JCSAqIGV4YWN0bHkgb25lIGJpdCBzZXQgLSB0aGUgY29ubmVjdGlvbiBjYXVzaW5nIHRoZQotCQkgKiBwcm9ibGVtLiAqLwotCQlzcGluX2xvY2soJmNueC0+bG9jayk7Ci0JCWNueC0+c3RhdGUgfD0gVkVUSF9TVEFURV9SRVNFVDsKLQkJdmV0aF9raWNrX3N0YXRlbWFjaGluZShjbngpOwotCQlzcGluX3VubG9jaygmY254LT5sb2NrKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5wZW5kaW5nX2dhdGUsIGZsYWdzKTsKLX0KLQogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IHZldGhfcHJvYmVfb25lKGludCB2bGFuLCBzdHJ1Y3QgZGV2aWNlICp2ZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CkBAIC04NDgsOCArMTA0OSw5IEBACiAKIAlwb3J0ID0gKHN0cnVjdCB2ZXRoX3BvcnQgKikgZGV2LT5wcml2OwogCi0Jc3Bpbl9sb2NrX2luaXQoJnBvcnQtPnBlbmRpbmdfZ2F0ZSk7CisJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPnF1ZXVlX2xvY2spOwogCXJ3bG9ja19pbml0KCZwb3J0LT5tY2FzdF9nYXRlKTsKKwlwb3J0LT5zdG9wcGVkX21hcCA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSFZNQVhBUkNISVRFQ1RFRExQUzsgaSsrKSB7CiAJCUh2THBWaXJ0dWFsTGFuSW5kZXhNYXAgbWFwOwpAQCAtODgyLDIyICsxMDg0LDI0IEBACiAJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB2ZXRoX3NldF9tdWx0aWNhc3RfbGlzdDsKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKIAotCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAyICogKFZFVEhfQUNLVElNRU9VVCAqIEhaIC8gMTAwMDAwMCk7Ci0JZGV2LT50eF90aW1lb3V0ID0gdmV0aF90eF90aW1lb3V0OwotCiAJU0VUX05FVERFVl9ERVYoZGV2LCB2ZGV2KTsKIAogCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKHJjICE9IDApIHsKLQkJdmV0aF9wcmludGsoS0VSTl9FUlIsCi0JCQkgICAgIkZhaWxlZCB0byByZWdpc3RlciBldGhlcm5ldCBkZXZpY2UgZm9yIHZsYW4gJWRcbiIsCi0JCQkgICAgdmxhbik7CisJCXZldGhfZXJyb3IoIkZhaWxlZCByZWdpc3RlcmluZyBuZXQgZGV2aWNlIGZvciB2bGFuJWQuXG4iLCB2bGFuKTsKIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JdmV0aF9wcmludGsoS0VSTl9ERUJVRywgIiVzIGF0dGFjaGVkIHRvIGlTZXJpZXMgdmxhbiAlZCAobHBhcl9tYXA9MHglMDR4KVxuIiwKLQkJICAgIGRldi0+bmFtZSwgdmxhbiwgcG9ydC0+bHBhcl9tYXApOworCWtvYmplY3RfaW5pdCgmcG9ydC0+a29iamVjdCk7CisJcG9ydC0+a29iamVjdC5wYXJlbnQgPSAmZGV2LT5jbGFzc19kZXYua29iajsKKwlwb3J0LT5rb2JqZWN0Lmt0eXBlICA9ICZ2ZXRoX3BvcnRfa3R5cGU7CisJa29iamVjdF9zZXRfbmFtZSgmcG9ydC0+a29iamVjdCwgInZldGhfcG9ydCIpOworCWlmICgwICE9IGtvYmplY3RfYWRkKCZwb3J0LT5rb2JqZWN0KSkKKwkJdmV0aF9lcnJvcigiRmFpbGVkIGFkZGluZyBwb3J0IGZvciAlcyB0byBzeXNmcy5cbiIsIGRldi0+bmFtZSk7CisKKwl2ZXRoX2luZm8oIiVzIGF0dGFjaGVkIHRvIGlTZXJpZXMgdmxhbiAlZCAoTFBBUiBtYXAgPSAweCUuNFgpXG4iLAorCQkJZGV2LT5uYW1lLCB2bGFuLCBwb3J0LT5scGFyX21hcCk7CiAKIAlyZXR1cm4gZGV2OwogfQpAQCAtOTEyLDk4ICsxMTE2LDk1IEBACiAJc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbnggPSB2ZXRoX2NueFtybHBdOwogCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQgPSAoc3RydWN0IHZldGhfcG9ydCAqKSBkZXYtPnByaXY7CiAJSHZMcEV2ZW50X1JjIHJjOwotCXUzMiBkbWFfYWRkcmVzcywgZG1hX2xlbmd0aDsKIAlzdHJ1Y3QgdmV0aF9tc2cgKm1zZyA9IE5VTEw7Ci0JaW50IGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghIGNueCkgewotCQlwb3J0LT5zdGF0cy50eF9lcnJvcnMrKzsKLQkJZGV2X2tmcmVlX3NrYihza2IpOworCWlmICghIGNueCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNueC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKCEgKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX1JFQURZKSkKLQkJZ290byBkcm9wOworCQlnb3RvIG5vX2Vycm9yOwogCi0JaWYgKChza2ItPmxlbiAtIDE0KSA+IFZFVEhfTUFYX01UVSkKKwlpZiAoKHNrYi0+bGVuIC0gRVRIX0hMRU4pID4gVkVUSF9NQVhfTVRVKQogCQlnb3RvIGRyb3A7CiAKIAltc2cgPSB2ZXRoX3N0YWNrX3BvcChjbngpOwotCi0JaWYgKCEgbXNnKSB7Ci0JCWVyciA9IDE7CisJaWYgKCEgbXNnKQogCQlnb3RvIGRyb3A7Ci0JfQogCi0JZG1hX2xlbmd0aCA9IHNrYi0+bGVuOwotCWRtYV9hZGRyZXNzID0gZG1hX21hcF9zaW5nbGUocG9ydC0+ZGV2LCBza2ItPmRhdGEsCi0JCQkJICAgICBkbWFfbGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKwltc2ctPmluX3VzZSA9IDE7CisJbXNnLT5za2IgPSBza2JfZ2V0KHNrYik7CiAKLQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZG1hX2FkZHJlc3MpKQorCW1zZy0+ZGF0YS5hZGRyWzBdID0gZG1hX21hcF9zaW5nbGUocG9ydC0+ZGV2LCBza2ItPmRhdGEsCisJCQkJc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKG1zZy0+ZGF0YS5hZGRyWzBdKSkKIAkJZ290byByZWN5Y2xlX2FuZF9kcm9wOwogCi0JLyogSXMgaXQgcmVhbGx5IG5lY2Vzc2FyeSB0byBjaGVjayB0aGUgbGVuZ3RoIGFuZCBhZGRyZXNzCi0JICogZmllbGRzIG9mIHRoZSBmaXJzdCBlbnRyeSBoZXJlPyAqLwotCW1zZy0+c2tiID0gc2tiOwogCW1zZy0+ZGV2ID0gcG9ydC0+ZGV2OwotCW1zZy0+ZGF0YS5hZGRyWzBdID0gZG1hX2FkZHJlc3M7Ci0JbXNnLT5kYXRhLmxlblswXSA9IGRtYV9sZW5ndGg7CisJbXNnLT5kYXRhLmxlblswXSA9IHNrYi0+bGVuOwogCW1zZy0+ZGF0YS5lb2ZtYXNrID0gMSA8PCBWRVRIX0VPRl9TSElGVDsKLQlzZXRfYml0KDAsICYobXNnLT5pbl91c2UpKTsKLQlyYyA9IHZldGhfc2lnbmFsZGF0YShjbngsIFZldGhFdmVudFR5cGVGcmFtZXMsIG1zZy0+dG9rZW4sICZtc2ctPmRhdGEpOworCisJcmMgPSB2ZXRoX3NpZ25hbGRhdGEoY254LCBWRVRIX0VWRU5UX0ZSQU1FUywgbXNnLT50b2tlbiwgJm1zZy0+ZGF0YSk7CiAKIAlpZiAocmMgIT0gSHZMcEV2ZW50X1JjX0dvb2QpCiAJCWdvdG8gcmVjeWNsZV9hbmRfZHJvcDsKIAorCS8qIElmIHRoZSB0aW1lcidzIG5vdCBhbHJlYWR5IHJ1bm5pbmcsIHN0YXJ0IGl0IG5vdy4gKi8KKwlpZiAoMCA9PSBjbngtPm91dHN0YW5kaW5nX3R4KQorCQltb2RfdGltZXIoJmNueC0+cmVzZXRfdGltZXIsIGppZmZpZXMgKyBjbngtPnJlc2V0X3RpbWVvdXQpOworCisJY254LT5sYXN0X2NvbnRhY3QgPSBqaWZmaWVzOworCWNueC0+b3V0c3RhbmRpbmdfdHgrKzsKKworCWlmICh2ZXRoX3N0YWNrX2lzX2VtcHR5KGNueCkpCisJCXZldGhfc3RvcF9xdWV1ZXMoY254KTsKKworIG5vX2Vycm9yOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNueC0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogCiAgcmVjeWNsZV9hbmRfZHJvcDoKLQltc2ctPnNrYiA9IE5VTEw7Ci0JLyogbmVlZCB0byBzZXQgaW4gdXNlIHRvIG1ha2UgdmV0aF9yZWN5Y2xlX21zZyBpbiBjYXNlIHRoaXMKLQkgKiB3YXMgYSBtYXBwaW5nIGZhaWx1cmUgKi8KLQlzZXRfYml0KDAsICZtc2ctPmluX3VzZSk7CiAJdmV0aF9yZWN5Y2xlX21zZyhjbngsIG1zZyk7CiAgZHJvcDoKLQlwb3J0LT5zdGF0cy50eF9lcnJvcnMrKzsKLQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY254LT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMTsKIH0KIAotc3RhdGljIEh2THBJbmRleE1hcCB2ZXRoX3RyYW5zbWl0X3RvX21hbnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKK3N0YXRpYyB2b2lkIHZldGhfdHJhbnNtaXRfdG9fbWFueShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgIEh2THBJbmRleE1hcCBscG1hc2ssCiAJCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdmV0aF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB2ZXRoX3BvcnQgKikgZGV2LT5wcml2OwotCWludCBpOwotCWludCByYzsKKwlpbnQgaSwgc3VjY2VzcywgZXJyb3I7CisKKwlzdWNjZXNzID0gZXJyb3IgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURMUFM7IGkrKykgewogCQlpZiAoKGxwbWFzayAmICgxIDw8IGkpKSA9PSAwKQogCQkJY29udGludWU7CiAKLQkJcmMgPSB2ZXRoX3RyYW5zbWl0X3RvX29uZShza2JfZ2V0KHNrYiksIGksIGRldik7Ci0JCWlmICghIHJjKQotCQkJbHBtYXNrICY9IH4oMTw8aSk7CisJCWlmICh2ZXRoX3RyYW5zbWl0X3RvX29uZShza2IsIGksIGRldikpCisJCQllcnJvciA9IDE7CisJCWVsc2UKKwkJCXN1Y2Nlc3MgPSAxOwogCX0KIAotCWlmICghIGxwbWFzaykgeworCWlmIChlcnJvcikKKwkJcG9ydC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwlpZiAoc3VjY2VzcykgewogCQlwb3J0LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJCXBvcnQtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCX0KLQotCXJldHVybiBscG1hc2s7CiB9CiAKIHN0YXRpYyBpbnQgdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgY2hhciAqZnJhbWUgPSBza2ItPmRhdGE7CiAJc3RydWN0IHZldGhfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdmV0aF9wb3J0ICopIGRldi0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCUh2THBJbmRleE1hcCBscG1hc2s7CiAKIAlpZiAoISAoZnJhbWVbMF0gJiAweDAxKSkgewpAQCAtMTAyMCw0NCArMTIyMSwyNyBAQAogCQlscG1hc2sgPSBwb3J0LT5scGFyX21hcDsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+cGVuZGluZ19nYXRlLCBmbGFncyk7CisJdmV0aF90cmFuc21pdF90b19tYW55KHNrYiwgbHBtYXNrLCBkZXYpOwogCi0JbHBtYXNrID0gdmV0aF90cmFuc21pdF90b19tYW55KHNrYiwgbHBtYXNrLCBkZXYpOwotCi0JZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0KLQlpZiAoISBscG1hc2spIHsKLQkJZGV2X2tmcmVlX3NrYihza2IpOwotCX0gZWxzZSB7Ci0JCWlmIChwb3J0LT5wZW5kaW5nX3NrYikgewotCQkJdmV0aF9lcnJvcigiJXM6IFR4IHdoaWxlIHNrYiB3YXMgcGVuZGluZyFcbiIsCi0JCQkJICAgZGV2LT5uYW1lKTsKLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnBlbmRpbmdfZ2F0ZSwgZmxhZ3MpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlwb3J0LT5wZW5kaW5nX3NrYiA9IHNrYjsKLQkJcG9ydC0+cGVuZGluZ19scG1hc2sgPSBscG1hc2s7Ci0JCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5wZW5kaW5nX2dhdGUsIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKIAlyZXR1cm4gMDsKIH0KIAorLyogWW91IG11c3QgaG9sZCB0aGUgY29ubmVjdGlvbidzIGxvY2sgd2hlbiB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uLiAqLwogc3RhdGljIHZvaWQgdmV0aF9yZWN5Y2xlX21zZyhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCwKIAkJCSAgICAgc3RydWN0IHZldGhfbXNnICptc2cpCiB7CiAJdTMyIGRtYV9hZGRyZXNzLCBkbWFfbGVuZ3RoOwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmbXNnLT5pbl91c2UpKSB7CisJaWYgKG1zZy0+aW5fdXNlKSB7CisJCW1zZy0+aW5fdXNlID0gMDsKIAkJZG1hX2FkZHJlc3MgPSBtc2ctPmRhdGEuYWRkclswXTsKIAkJZG1hX2xlbmd0aCA9IG1zZy0+ZGF0YS5sZW5bMF07CiAKLQkJZG1hX3VubWFwX3NpbmdsZShtc2ctPmRldiwgZG1hX2FkZHJlc3MsIGRtYV9sZW5ndGgsCi0JCQkJIERNQV9UT19ERVZJQ0UpOworCQlpZiAoIWRtYV9tYXBwaW5nX2Vycm9yKGRtYV9hZGRyZXNzKSkKKwkJCWRtYV91bm1hcF9zaW5nbGUobXNnLT5kZXYsIGRtYV9hZGRyZXNzLCBkbWFfbGVuZ3RoLAorCQkJCQlETUFfVE9fREVWSUNFKTsKIAogCQlpZiAobXNnLT5za2IpIHsKIAkJCWRldl9rZnJlZV9za2JfYW55KG1zZy0+c2tiKTsKQEAgLTEwNjYsMTUgKzEyNTAsMTYgQEAKIAogCQltZW1zZXQoJm1zZy0+ZGF0YSwgMCwgc2l6ZW9mKG1zZy0+ZGF0YSkpOwogCQl2ZXRoX3N0YWNrX3B1c2goY254LCBtc2cpOwotCX0gZWxzZQotCQlpZiAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfT1BFTikKLQkJCXZldGhfZXJyb3IoIkJvZ3VzIGZyYW1lcyBhY2sgZnJvbSBscGFyICVkICgjJWQpXG4iLAotCQkJCSAgIGNueC0+cmVtb3RlX2xwLCBtc2ctPnRva2VuKTsKKwl9IGVsc2UgaWYgKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX09QRU4pIHsKKwkJdmV0aF9lcnJvcigiTm9uLXBlbmRpbmcgZnJhbWUgKCMgJWQpIGFja2VkIGJ5IExQQVIgJWQuXG4iLAorCQkJCWNueC0+cmVtb3RlX2xwLCBtc2ctPnRva2VuKTsKKwl9CiB9CiAKLXN0YXRpYyB2b2lkIHZldGhfZmx1c2hfcGVuZGluZyhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCkKK3N0YXRpYyB2b2lkIHZldGhfd2FrZV9xdWV1ZXMoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngpCiB7CiAJaW50IGk7CisKIAlmb3IgKGkgPSAwOyBpIDwgSFZNQVhBUkNISVRFQ1RFRFZJUlRVQUxMQU5TOyBpKyspIHsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHZldGhfZGV2W2ldOwogCQlzdHJ1Y3QgdmV0aF9wb3J0ICpwb3J0OwpAQCAtMTA4OCwyMiArMTI3Myw3OSBAQAogCQlpZiAoISAocG9ydC0+bHBhcl9tYXAgJiAoMTw8Y254LT5yZW1vdGVfbHApKSkKIAkJCWNvbnRpbnVlOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5wZW5kaW5nX2dhdGUsIGZsYWdzKTsKLQkJaWYgKHBvcnQtPnBlbmRpbmdfc2tiKSB7Ci0JCQlwb3J0LT5wZW5kaW5nX2xwbWFzayA9Ci0JCQkJdmV0aF90cmFuc21pdF90b19tYW55KHBvcnQtPnBlbmRpbmdfc2tiLAotCQkJCQkJICAgICAgcG9ydC0+cGVuZGluZ19scG1hc2ssCi0JCQkJCQkgICAgICBkZXYpOwotCQkJaWYgKCEgcG9ydC0+cGVuZGluZ19scG1hc2spIHsKLQkJCQlkZXZfa2ZyZWVfc2tiX2FueShwb3J0LT5wZW5kaW5nX3NrYik7Ci0JCQkJcG9ydC0+cGVuZGluZ19za2IgPSBOVUxMOwotCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLQkJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCQlwb3J0LT5zdG9wcGVkX21hcCAmPSB+KDEgPDwgY254LT5yZW1vdGVfbHApOworCisJCWlmICgwID09IHBvcnQtPnN0b3BwZWRfbWFwICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQkJdmV0aF9kZWJ1ZygiY254ICVkOiB3b2tlIHF1ZXVlIGZvciAlcy5cbiIsCisJCQkJCWNueC0+cmVtb3RlX2xwLCBkZXYtPm5hbWUpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnBlbmRpbmdfZ2F0ZSwgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJfQogfQogCitzdGF0aWMgdm9pZCB2ZXRoX3N0b3BfcXVldWVzKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURWSVJUVUFMTEFOUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB2ZXRoX2RldltpXTsKKwkJc3RydWN0IHZldGhfcG9ydCAqcG9ydDsKKworCQlpZiAoISBkZXYpCisJCQljb250aW51ZTsKKworCQlwb3J0ID0gKHN0cnVjdCB2ZXRoX3BvcnQgKilkZXYtPnByaXY7CisKKwkJLyogSWYgdGhpcyBjbnggaXMgbm90IG9uIHRoZSB2bGFuIGZvciB0aGlzIHBvcnQsIGNvbnRpbnVlICovCisJCWlmICghIChwb3J0LT5scGFyX21hcCAmICgxIDw8IGNueC0+cmVtb3RlX2xwKSkpCisJCQljb250aW51ZTsKKworCQlzcGluX2xvY2soJnBvcnQtPnF1ZXVlX2xvY2spOworCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcG9ydC0+c3RvcHBlZF9tYXAgfD0gKDEgPDwgY254LT5yZW1vdGVfbHApOworCisJCXZldGhfZGVidWcoImNueCAlZDogc3RvcHBlZCBxdWV1ZSBmb3IgJXMsIG1hcCA9IDB4JXguXG4iLAorCQkJCWNueC0+cmVtb3RlX2xwLCBkZXYtPm5hbWUsIHBvcnQtPnN0b3BwZWRfbWFwKTsKKworCQlzcGluX3VubG9jaygmcG9ydC0+cXVldWVfbG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCB2ZXRoX3RpbWVkX3Jlc2V0KHVuc2lnbmVkIGxvbmcgcHRyKQoreworCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254ID0gKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqKXB0cjsKKwl1bnNpZ25lZCBsb25nIHRyaWdnZXJfdGltZSwgZmxhZ3M7CisKKwkvKiBGSVhNRSBpcyBpdCBwb3NzaWJsZSB0aGlzIGZpcmVzIGFmdGVyIHZldGhfc3RvcF9jb25uZWN0aW9uKCk/CisJICogVGhhdCB3b3VsZCByZXNjaGVkdWxlIHRoZSBzdGF0ZW1hY2hpbmUgZm9yIDUgc2Vjb25kcyBhbmQgcHJvYmFibHkKKwkgKiBleGVjdXRlIGl0IGFmdGVyIHRoZSBtb2R1bGUncyBiZWVuIHVubG9hZGVkLiBIbW0uICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY254LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoY254LT5vdXRzdGFuZGluZ190eCA+IDApIHsKKwkJdHJpZ2dlcl90aW1lID0gY254LT5sYXN0X2NvbnRhY3QgKyBjbngtPnJlc2V0X3RpbWVvdXQ7CisKKwkJaWYgKHRyaWdnZXJfdGltZSA8IGppZmZpZXMpIHsKKwkJCWNueC0+c3RhdGUgfD0gVkVUSF9TVEFURV9SRVNFVDsKKwkJCXZldGhfa2lja19zdGF0ZW1hY2hpbmUoY254KTsKKwkJCXZldGhfZXJyb3IoIiVkIHBhY2tldHMgbm90IGFja2VkIGJ5IExQQVIgJWQgd2l0aGluICVkICIKKwkJCQkJInNlY29uZHMsIHJlc2V0dGluZy5cbiIsCisJCQkJCWNueC0+b3V0c3RhbmRpbmdfdHgsIGNueC0+cmVtb3RlX2xwLAorCQkJCQljbngtPnJlc2V0X3RpbWVvdXQgLyBIWik7CisJCX0gZWxzZSB7CisJCQkvKiBSZXNjaGVkdWxlIHRoZSB0aW1lciAqLworCQkJdHJpZ2dlcl90aW1lID0gamlmZmllcyArIGNueC0+cmVzZXRfdGltZW91dDsKKwkJCW1vZF90aW1lcigmY254LT5yZXNldF90aW1lciwgdHJpZ2dlcl90aW1lKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNueC0+bG9jaywgZmxhZ3MpOworfQorCiAvKgogICogUnggcGF0aAogICovCkBAIC0xMTE3LDEyICsxMzU5LDkgQEAKIAlpZiAoIChtYWNfYWRkciA9PSBwb3J0LT5tYWNfYWRkcikgfHwgKG1hY19hZGRyID09IDB4ZmZmZmZmZmZmZmZmMDAwMCkgKQogCQlyZXR1cm4gMTsKIAotCWlmICghICgoKGNoYXIgKikgJm1hY19hZGRyKVswXSAmIDB4MDEpKQotCQlyZXR1cm4gMDsKLQogCXJlYWRfbG9ja19pcnFzYXZlKCZwb3J0LT5tY2FzdF9nYXRlLCBmbGFncyk7CiAKLQlpZiAocG9ydC0+cHJvbWlzY3VvdXMgfHwgcG9ydC0+YWxsX21jYXN0KSB7CisJaWYgKHBvcnQtPnByb21pc2N1b3VzKSB7CiAJCXdhbnRlZCA9IDE7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTExNzUsMjEgKzE0MTQsMjEgQEAKIHsKIAlIdkxwRXZlbnRfUmMgcmM7CiAKLQlyYyA9IHZldGhfc2lnbmFsZGF0YShjbngsIFZldGhFdmVudFR5cGVGcmFtZXNBY2ssCisJcmMgPSB2ZXRoX3NpZ25hbGRhdGEoY254LCBWRVRIX0VWRU5UX0ZSQU1FU19BQ0ssCiAJCQkgICAgIDAsICZjbngtPnBlbmRpbmdfYWNrcyk7CiAKIAlpZiAocmMgIT0gSHZMcEV2ZW50X1JjX0dvb2QpCi0JCXZldGhfZXJyb3IoIkVycm9yIDB4JXggYWNraW5nIGZyYW1lcyBmcm9tIGxwYXIgJWQhXG4iLAotCQkJICAgKHVuc2lnbmVkKXJjLCBjbngtPnJlbW90ZV9scCk7CisJCXZldGhfZXJyb3IoIkZhaWxlZCBhY2tpbmcgZnJhbWVzIGZyb20gTFBBUiAlZCwgcmMgPSAlZFxuIiwKKwkJCQljbngtPnJlbW90ZV9scCwgKGludClyYyk7CiAKIAljbngtPm51bV9wZW5kaW5nX2Fja3MgPSAwOwogCW1lbXNldCgmY254LT5wZW5kaW5nX2Fja3MsIDB4ZmYsIHNpemVvZihjbngtPnBlbmRpbmdfYWNrcykpOwogfQogCiBzdGF0aWMgdm9pZCB2ZXRoX3JlY2VpdmUoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCi0JCQkgc3RydWN0IFZldGhMcEV2ZW50ICpldmVudCkKKwkJCSBzdHJ1Y3QgdmV0aF9scGV2ZW50ICpldmVudCkKIHsKLQlzdHJ1Y3QgVmV0aEZyYW1lc0RhdGEgKnNlbmRkYXRhID0gJmV2ZW50LT51LmZyYW1lc19kYXRhOworCXN0cnVjdCB2ZXRoX2ZyYW1lc19kYXRhICpzZW5kZGF0YSA9ICZldmVudC0+dS5mcmFtZXNfZGF0YTsKIAlpbnQgc3RhcnRjaHVuayA9IDA7CiAJaW50IG5jaHVua3M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEyMTYsOSArMTQ1NSwxMCBAQAogCQkvKiBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGF0IGxlYXN0IDEgRU9GIGVudHJ5IGluIHRoZQogCQkgKiByZW1haW5pbmcgZW50cmllcyAqLwogCQlpZiAoISAoc2VuZGRhdGEtPmVvZm1hc2sgPj4gKHN0YXJ0Y2h1bmsgKyBWRVRIX0VPRl9TSElGVCkpKSB7Ci0JCQl2ZXRoX2Vycm9yKCJtaXNzaW5nIEVPRiBmcmFnIGluIGV2ZW50ICIKLQkJCQkgICAiZW9mbWFzaz0weCV4IHN0YXJ0Y2h1bms9JWRcbiIsCi0JCQkJICAgKHVuc2lnbmVkKSBzZW5kZGF0YS0+ZW9mbWFzaywgc3RhcnRjaHVuayk7CisJCQl2ZXRoX2Vycm9yKCJNaXNzaW5nIEVPRiBmcmFnbWVudCBpbiBldmVudCAiCisJCQkJCSJlb2ZtYXNrID0gMHgleCBzdGFydGNodW5rID0gJWRcbiIsCisJCQkJCSh1bnNpZ25lZClzZW5kZGF0YS0+ZW9mbWFzaywKKwkJCQkJc3RhcnRjaHVuayk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xMjM3LDggKzE0NzcsOSBAQAogCQkvKiBuY2h1bmtzID09ICMgb2YgY2h1bmtzIGluIHRoaXMgZnJhbWUgKi8KIAogCQlpZiAoKGxlbmd0aCAtIEVUSF9ITEVOKSA+IFZFVEhfTUFYX01UVSkgewotCQkJdmV0aF9lcnJvcigiUmVjZWl2ZWQgb3ZlcnNpemUgZnJhbWUgZnJvbSBscGFyICVkICIKLQkJCQkgICAiKGxlbmd0aD0lZClcbiIsIGNueC0+cmVtb3RlX2xwLCBsZW5ndGgpOworCQkJdmV0aF9lcnJvcigiUmVjZWl2ZWQgb3ZlcnNpemUgZnJhbWUgZnJvbSBMUEFSICVkICIKKwkJCQkJIihsZW5ndGggPSAlZClcbiIsCisJCQkJCWNueC0+cmVtb3RlX2xwLCBsZW5ndGgpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTMzMSwxNSArMTU3MiwzMyBAQAogCiBzdGF0aWMgaW50IHZldGhfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQogewotCWludCBpID0gdmRldi0+dW5pdF9hZGRyZXNzOworCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHZldGhfcG9ydCAqcG9ydDsKKwlpbnQgaTsKIAotCWRldiA9IHZldGhfZGV2W2ldOwotCWlmIChkZXYgIT0gTlVMTCkgewotCQl2ZXRoX2RldltpXSA9IE5VTEw7Ci0JCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JCWZyZWVfbmV0ZGV2KGRldik7CisJZGV2ID0gdmV0aF9kZXZbdmRldi0+dW5pdF9hZGRyZXNzXTsKKworCWlmICghIGRldikKKwkJcmV0dXJuIDA7CisKKwlwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVETFBTOyBpKyspIHsKKwkJY254ID0gdmV0aF9jbnhbaV07CisKKwkJaWYgKGNueCAmJiAocG9ydC0+bHBhcl9tYXAgJiAoMSA8PCBpKSkpIHsKKwkJCS8qIERyb3Agb3VyIHJlZmVyZW5jZSB0byBjb25uZWN0aW9ucyBvbiBvdXIgVkxBTiAqLworCQkJa29iamVjdF9wdXQoJmNueC0+a29iamVjdCk7CisJCX0KIAl9CisKKwl2ZXRoX2Rldlt2ZGV2LT51bml0X2FkZHJlc3NdID0gTlVMTDsKKwlrb2JqZWN0X2RlbCgmcG9ydC0+a29iamVjdCk7CisJa29iamVjdF9wdXQoJnBvcnQtPmtvYmplY3QpOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMzQ3LDYgKzE2MDYsNyBAQAogewogCWludCBpID0gdmRldi0+dW5pdF9hZGRyZXNzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHZldGhfcG9ydCAqcG9ydDsKIAogCWRldiA9IHZldGhfcHJvYmVfb25lKGksICZ2ZGV2LT5kZXYpOwogCWlmIChkZXYgPT0gTlVMTCkgewpAQCAtMTM1NSwxMSArMTYxNSwyMyBAQAogCX0KIAl2ZXRoX2RldltpXSA9IGRldjsKIAotCS8qIFN0YXJ0IHRoZSBzdGF0ZSBtYWNoaW5lIG9uIGVhY2ggY29ubmVjdGlvbiwgdG8gY29tbWVuY2UKLQkgKiBsaW5rIG5lZ290aWF0aW9uICovCi0JZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURMUFM7IGkrKykKLQkJaWYgKHZldGhfY254W2ldKQotCQkJdmV0aF9raWNrX3N0YXRlbWFjaGluZSh2ZXRoX2NueFtpXSk7CisJcG9ydCA9IChzdHJ1Y3QgdmV0aF9wb3J0KiluZXRkZXZfcHJpdihkZXYpOworCisJLyogU3RhcnQgdGhlIHN0YXRlIG1hY2hpbmUgb24gZWFjaCBjb25uZWN0aW9uIG9uIHRoaXMgdmxhbi4gSWYgd2UncmUKKwkgKiB0aGUgZmlyc3QgZGV2IHRvIGRvIHNvIHRoaXMgd2lsbCBjb21tZW5jZSBsaW5rIG5lZ290aWF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURMUFM7IGkrKykgeworCQlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueDsKKworCQlpZiAoISAocG9ydC0+bHBhcl9tYXAgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKworCQljbnggPSB2ZXRoX2NueFtpXTsKKwkJaWYgKCFjbngpCisJCQljb250aW51ZTsKKworCQlrb2JqZWN0X2dldCgmY254LT5rb2JqZWN0KTsKKwkJdmV0aF9raWNrX3N0YXRlbWFjaGluZShjbngpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTM3NSw3ICsxNjQ3LDcgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCB2ZXRoX2RldmljZV90YWJsZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciB2ZXRoX2RyaXZlciA9IHsKLQkubmFtZSA9ICJpc2VyaWVzX3ZldGgiLAorCS5uYW1lID0gRFJWX05BTUUsCiAJLmlkX3RhYmxlID0gdmV0aF9kZXZpY2VfdGFibGUsCiAJLnByb2JlID0gdmV0aF9wcm9iZSwKIAkucmVtb3ZlID0gdmV0aF9yZW1vdmUKQEAgLTEzODgsMjkgKzE2NjAsMjkgQEAKIHZvaWQgX19leGl0IHZldGhfbW9kdWxlX2NsZWFudXAodm9pZCkKIHsKIAlpbnQgaTsKKwlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueDsKIAotCS8qIFN0b3AgdGhlIHF1ZXVlcyBmaXJzdCB0byBzdG9wIGFueSBuZXcgcGFja2V0cyBiZWluZyBzZW50LiAqLwotCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVEVklSVFVBTExBTlM7IGkrKykKLQkJaWYgKHZldGhfZGV2W2ldKQotCQkJbmV0aWZfc3RvcF9xdWV1ZSh2ZXRoX2RldltpXSk7Ci0KLQkvKiBTdG9wIHRoZSBjb25uZWN0aW9ucyBiZWZvcmUgd2UgdW5yZWdpc3RlciB0aGUgZHJpdmVyLiBUaGlzCi0JICogZW5zdXJlcyB0aGVyZSdzIG5vIHNrYnMgbHlpbmcgYXJvdW5kIGhvbGRpbmcgdGhlIGRldmljZSBvcGVuLiAqLwotCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVETFBTOyArK2kpCi0JCXZldGhfc3RvcF9jb25uZWN0aW9uKGkpOwotCisJLyogRGlzY29ubmVjdCBvdXIgImlycSIgdG8gc3RvcCBldmVudHMgY29taW5nIGZyb20gdGhlIEh5cGVydmlzb3IuICovCiAJSHZMcEV2ZW50X3VucmVnaXN0ZXJIYW5kbGVyKEh2THBFdmVudF9UeXBlX1ZpcnR1YWxMYW4pOwogCi0JLyogSHlwZXJ2aXNvciBjYWxsYmFja3MgbWF5IGhhdmUgc2NoZWR1bGVkIG1vcmUgd29yayB3aGlsZSB3ZQotCSAqIHdlcmUgc3RvcGluZyBjb25uZWN0aW9ucy4gTm93IHRoYXQgd2UndmUgZGlzY29ubmVjdGVkIGZyb20KLQkgKiB0aGUgaHlwZXJ2aXNvciBtYWtlIHN1cmUgZXZlcnl0aGluZydzIGZpbmlzaGVkLiAqLworCS8qIE1ha2Ugc3VyZSBhbnkgd29yayBxdWV1ZWQgZnJvbSBIeXBlcnZpc29yIGNhbGxiYWNrcyBpcyBmaW5pc2hlZC4gKi8KIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCisJZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURMUFM7ICsraSkgeworCQljbnggPSB2ZXRoX2NueFtpXTsKKworCQlpZiAoIWNueCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFJlbW92ZSB0aGUgY29ubmVjdGlvbiBmcm9tIHN5c2ZzICovCisJCWtvYmplY3RfZGVsKCZjbngtPmtvYmplY3QpOworCQkvKiBEcm9wIHRoZSBkcml2ZXIncyByZWZlcmVuY2UgdG8gdGhlIGNvbm5lY3Rpb24gKi8KKwkJa29iamVjdF9wdXQoJmNueC0+a29iamVjdCk7CisJfQorCisJLyogVW5yZWdpc3RlciB0aGUgZHJpdmVyLCB3aGljaCB3aWxsIGNsb3NlIGFsbCB0aGUgbmV0ZGV2cyBhbmQgc3RvcAorCSAqIHRoZSBjb25uZWN0aW9ucyB3aGVuIHRoZXkncmUgbm8gbG9uZ2VyIHJlZmVyZW5jZWQuICovCiAJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ2ZXRoX2RyaXZlcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSFZNQVhBUkNISVRFQ1RFRExQUzsgKytpKQotCQl2ZXRoX2Rlc3Ryb3lfY29ubmVjdGlvbihpKTsKLQogfQogbW9kdWxlX2V4aXQodmV0aF9tb2R1bGVfY2xlYW51cCk7CiAKQEAgLTE0MjMsMTUgKzE2OTUsMzcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVETFBTOyArK2kpIHsKIAkJcmMgPSB2ZXRoX2luaXRfY29ubmVjdGlvbihpKTsKLQkJaWYgKHJjICE9IDApIHsKLQkJCXZldGhfbW9kdWxlX2NsZWFudXAoKTsKLQkJCXJldHVybiByYzsKLQkJfQorCQlpZiAocmMgIT0gMCkKKwkJCWdvdG8gZXJyb3I7CiAJfQogCiAJSHZMcEV2ZW50X3JlZ2lzdGVySGFuZGxlcihIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsTGFuLAogCQkJCSAgJnZldGhfaGFuZGxlX2V2ZW50KTsKIAotCXJldHVybiB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZ2ZXRoX2RyaXZlcik7CisJcmMgPSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZ2ZXRoX2RyaXZlcik7CisJaWYgKHJjICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFZNQVhBUkNISVRFQ1RFRExQUzsgKytpKSB7CisJCXN0cnVjdCBrb2JqZWN0ICprb2JqOworCisJCWlmICghdmV0aF9jbnhbaV0pCisJCQljb250aW51ZTsKKworCQlrb2JqID0gJnZldGhfY254W2ldLT5rb2JqZWN0OworCQlrb2JqLT5wYXJlbnQgPSAmdmV0aF9kcml2ZXIuZHJpdmVyLmtvYmo7CisJCS8qIElmIHRoZSBhZGQgZmFpbGVzLCBjb21wbGFpbiBidXQgb3RoZXJ3aXNlIGNvbnRpbnVlICovCisJCWlmICgwICE9IGtvYmplY3RfYWRkKGtvYmopKQorCQkJdmV0aF9lcnJvcigiY254ICVkOiBGYWlsZWQgYWRkaW5nIHRvIHN5c2ZzLlxuIiwgaSk7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVETFBTOyArK2kpIHsKKwkJdmV0aF9kZXN0cm95X2Nvbm5lY3Rpb24odmV0aF9jbnhbaV0pOworCX0KKworCXJldHVybiByYzsKIH0KIG1vZHVsZV9pbml0KHZldGhfbW9kdWxlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmggYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzNzBmNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIEZpbGUgdmV0aC5oIGNyZWF0ZWQgYnkgS3lsZSBBLiBMdWNrZSBvbiBNb24gQXVnICA3IDIwMDAuICovCi0KLSNpZm5kZWYgX0lTRVJJRVNfVkVUSF9ICi0jZGVmaW5lIF9JU0VSSUVTX1ZFVEhfSAotCi0jZGVmaW5lIFZldGhFdmVudFR5cGVDYXAJKDApCi0jZGVmaW5lIFZldGhFdmVudFR5cGVGcmFtZXMJKDEpCi0jZGVmaW5lIFZldGhFdmVudFR5cGVNb25pdG9yCSgyKQotI2RlZmluZSBWZXRoRXZlbnRUeXBlRnJhbWVzQWNrCSgzKQotCi0jZGVmaW5lIFZFVEhfTUFYX0FDS1NfUEVSX01TRwkoMjApCi0jZGVmaW5lIFZFVEhfTUFYX0ZSQU1FU19QRVJfTVNHCSg2KQotCi1zdHJ1Y3QgVmV0aEZyYW1lc0RhdGEgewotCXUzMiBhZGRyW1ZFVEhfTUFYX0ZSQU1FU19QRVJfTVNHXTsKLQl1MTYgbGVuW1ZFVEhfTUFYX0ZSQU1FU19QRVJfTVNHXTsKLQl1MzIgZW9mbWFzazsKLX07Ci0jZGVmaW5lIFZFVEhfRU9GX1NISUZUCQkoMzItVkVUSF9NQVhfRlJBTUVTX1BFUl9NU0cpCi0KLXN0cnVjdCBWZXRoRnJhbWVzQWNrRGF0YSB7Ci0JdTE2IHRva2VuW1ZFVEhfTUFYX0FDS1NfUEVSX01TR107Ci19OwotCi1zdHJ1Y3QgVmV0aENhcERhdGEgewotCXU4IGNhcHNfdmVyc2lvbjsKLQl1OCByc3ZkMTsKLQl1MTYgbnVtX2J1ZmZlcnM7Ci0JdTE2IGFja190aHJlc2hvbGQ7Ci0JdTE2IHJzdmQyOwotCXUzMiBhY2tfdGltZW91dDsKLQl1MzIgcnN2ZDM7Ci0JdTY0IHJzdmQ0WzNdOwotfTsKLQotc3RydWN0IFZldGhMcEV2ZW50IHsKLQlzdHJ1Y3QgSHZMcEV2ZW50IGJhc2VfZXZlbnQ7Ci0JdW5pb24gewotCQlzdHJ1Y3QgVmV0aENhcERhdGEgY2Fwc19kYXRhOwotCQlzdHJ1Y3QgVmV0aEZyYW1lc0RhdGEgZnJhbWVzX2RhdGE7Ci0JCXN0cnVjdCBWZXRoRnJhbWVzQWNrRGF0YSBmcmFtZXNfYWNrX2RhdGE7Ci0JfSB1OwotCi19OwotCi0jZW5kaWYJLyogX0lTRVJJRVNfVkVUSF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYwppbmRleCBmYjZiMjMyLi4yNWM5YTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKQEAgLTU4LDExICs1OCwxMCBAQAogCiAjZGVmaW5lIElOVF9DQVVTRV9VTk1BU0tfQUxMCQkweDAwMDdmZmZmCiAjZGVmaW5lIElOVF9DQVVTRV9VTk1BU0tfQUxMX0VYVAkweDAwMTFmZmZmCi0jaWZkZWYgTVY2NDNYWF9SWF9RVUVVRV9GSUxMX09OX1RBU0sKICNkZWZpbmUgSU5UX0NBVVNFX01BU0tfQUxMCQkweDAwMDAwMDAwCisjZGVmaW5lIElOVF9DQVVTRV9NQVNLX0FMTF9FWFQJCTB4MDAwMDAwMDAKICNkZWZpbmUgSU5UX0NBVVNFX0NIRUNLX0JJVFMJCUlOVF9DQVVTRV9VTk1BU0tfQUxMCiAjZGVmaW5lIElOVF9DQVVTRV9DSEVDS19CSVRTX0VYVAlJTlRfQ0FVU0VfVU5NQVNLX0FMTF9FWFQKLSNlbmRpZgogCiAjaWZkZWYgTVY2NDNYWF9DSEVDS1NVTV9PRkZMT0FEX1RYCiAjZGVmaW5lIE1BWF9ERVNDU19QRVJfU0tCCShNQVhfU0tCX0ZSQUdTICsgMSkKQEAgLTk1LDcgKzk0LDcgQEAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKm12NjQzeHhfZXRoX3NoYXJlZF9iYXNlOwogCiAvKiB1c2VkIHRvIHByb3RlY3QgTVY2NDNYWF9FVEhfU01JX1JFRywgd2hpY2ggaXMgc2hhcmVkIGFjcm9zcyBwb3J0cyAqLwotc3RhdGljIHNwaW5sb2NrX3QgbXY2NDN4eF9ldGhfcGh5X2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG12NjQzeHhfZXRoX3BoeV9sb2NrKTsKIAogc3RhdGljIGlubGluZSB1MzIgbXZfcmVhZChpbnQgb2Zmc2V0KQogewpAQCAtMjU5LDE0ICsyNTgsMTMgQEAKIHN0YXRpYyB2b2lkIG12NjQzeHhfZXRoX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiBjb25maWdfcmVnOwogCi0JY29uZmlnX3JlZyA9IGV0aGVybmV0X2dldF9jb25maWdfcmVnKG1wLT5wb3J0X251bSk7CiAJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKLQkJY29uZmlnX3JlZyB8PSAodTMyKSBNVjY0M1hYX0VUSF9VTklDQVNUX1BST01JU0NVT1VTX01PREU7CisJCW1wLT5wb3J0X2NvbmZpZyB8PSAodTMyKSBNVjY0M1hYX0VUSF9VTklDQVNUX1BST01JU0NVT1VTX01PREU7CiAJZWxzZQotCQljb25maWdfcmVnICY9IH4odTMyKSBNVjY0M1hYX0VUSF9VTklDQVNUX1BST01JU0NVT1VTX01PREU7Ci0JZXRoZXJuZXRfc2V0X2NvbmZpZ19yZWcobXAtPnBvcnRfbnVtLCBjb25maWdfcmVnKTsKKwkJbXAtPnBvcnRfY29uZmlnICY9IH4odTMyKSBNVjY0M1hYX0VUSF9VTklDQVNUX1BST01JU0NVT1VTX01PREU7CisKKwltdl93cml0ZShNVjY0M1hYX0VUSF9QT1JUX0NPTkZJR19SRUcobXAtPnBvcnRfbnVtKSwgbXAtPnBvcnRfY29uZmlnKTsKIH0KIAogLyoKQEAgLTM2OSwxNSArMzY3LDYgQEAKIAogCQkJZGV2X2tmcmVlX3NrYl9pcnEocGt0X2luZm8ucmV0dXJuX2luZm8pOwogCQkJcmVsZWFzZWQgPSAwOwotCi0JCQkvKgotCQkJICogRGVjcmVtZW50IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgc2ticyBjb3VudGVyIG9uCi0JCQkgKiB0aGUgVFggcXVldWUuCi0JCQkgKi8KLQkJCWlmIChtcC0+dHhfcmluZ19za2JzID09IDApCi0JCQkJcGFuaWMoIkVSUk9SIC0gVFggb3V0c3RhbmRpbmcgU0tCcyIKLQkJCQkJCSIgY291bnRlciBpcyBjb3JydXB0ZWQiKTsKLQkJCW1wLT50eF9yaW5nX3NrYnMtLTsKIAkJfSBlbHNlCiAJCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBwa3RfaW5mby5idWZfcHRyLAogCQkJCQlwa3RfaW5mby5ieXRlX2NudCwgRE1BX1RPX0RFVklDRSk7CkBAIC00MTIsMTUgKzQwMSwxMyBAQAogCXN0cnVjdCBwa3RfaW5mbyBwa3RfaW5mbzsKIAogI2lmZGVmIE1WNjQzWFhfTkFQSQotCXdoaWxlIChldGhfcG9ydF9yZWNlaXZlKG1wLCAmcGt0X2luZm8pID09IEVUSF9PSyAmJiBidWRnZXQgPiAwKSB7CisJd2hpbGUgKGJ1ZGdldC0tID4gMCAmJiBldGhfcG9ydF9yZWNlaXZlKG1wLCAmcGt0X2luZm8pID09IEVUSF9PSykgewogI2Vsc2UKIAl3aGlsZSAoZXRoX3BvcnRfcmVjZWl2ZShtcCwgJnBrdF9pbmZvKSA9PSBFVEhfT0spIHsKICNlbmRpZgogCQltcC0+cnhfcmluZ19za2JzLS07CiAJCXJlY2VpdmVkX3BhY2tldHMrKzsKLSNpZmRlZiBNVjY0M1hYX05BUEkKLQkJYnVkZ2V0LS07Ci0jZW5kaWYKKwogCQkvKiBVcGRhdGUgc3RhdGlzdGljcy4gTm90ZSBieXRlIGNvdW50IGluY2x1ZGVzIDQgYnl0ZSBDUkMgY291bnQgKi8KIAkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKIAkJc3RhdHMtPnJ4X2J5dGVzICs9IHBrdF9pbmZvLmJ5dGVfY250OwpAQCAtMTA0NCw5ICsxMDMxLDYgQEAKIAkJCQkJCURNQV9UT19ERVZJQ0UpOwogCiAJCQlkZXZfa2ZyZWVfc2tiX2lycShwa3RfaW5mby5yZXR1cm5faW5mbyk7Ci0KLQkJCWlmIChtcC0+dHhfcmluZ19za2JzKQotCQkJCW1wLT50eF9yaW5nX3NrYnMtLTsKIAkJfSBlbHNlCiAJCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBwa3RfaW5mby5idWZfcHRyLAogCQkJCQlwa3RfaW5mby5ieXRlX2NudCwgRE1BX1RPX0RFVklDRSk7CkBAIC0xMTg5LDcgKzExNzMsNiBAQAogCQlwa3RfaW5mby5idWZfcHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLCBza2ItPmxlbiwKIAkJCQkJCQlETUFfVE9fREVWSUNFKTsKIAkJcGt0X2luZm8ucmV0dXJuX2luZm8gPSBza2I7Ci0JCW1wLT50eF9yaW5nX3NrYnMrKzsKIAkJc3RhdHVzID0gZXRoX3BvcnRfc2VuZChtcCwgJnBrdF9pbmZvKTsKIAkJaWYgKChzdGF0dXMgPT0gRVRIX0VSUk9SKSB8fCAoc3RhdHVzID09IEVUSF9RVUVVRV9GVUxMKSkKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIG9uIHRyYW5zbWl0dGluZyBwYWNrZXRcbiIsCkBAIC0xMjc0LDcgKzEyNTcsNiBAQAogCQkJCXBrdF9pbmZvLmNtZF9zdHMgfD0gRVRIX1RYX0VOQUJMRV9JTlRFUlJVUFQgfAogCQkJCQkJCUVUSF9UWF9MQVNUX0RFU0M7CiAJCQkJcGt0X2luZm8ucmV0dXJuX2luZm8gPSBza2I7Ci0JCQkJbXAtPnR4X3Jpbmdfc2ticysrOwogCQkJfSBlbHNlIHsKIAkJCQlwa3RfaW5mby5yZXR1cm5faW5mbyA9IDA7CiAJCQl9CkBAIC0xMzExLDcgKzEyOTMsNiBAQAogCXBrdF9pbmZvLmJ1Zl9wdHIgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBza2ItPmRhdGEsIHNrYi0+bGVuLAogCQkJCQkJCQlETUFfVE9fREVWSUNFKTsKIAlwa3RfaW5mby5yZXR1cm5faW5mbyA9IHNrYjsKLQltcC0+dHhfcmluZ19za2JzKys7CiAJc3RhdHVzID0gZXRoX3BvcnRfc2VuZChtcCwgJnBrdF9pbmZvKTsKIAlpZiAoKHN0YXR1cyA9PSBFVEhfRVJST1IpIHx8IChzdGF0dXMgPT0gRVRIX1FVRVVFX0ZVTEwpKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBvbiB0cmFuc21pdHRpbmcgcGFja2V0XG4iLApAQCAtMTM1Niw2ICsxMzM3LDQzIEBACiAJcmV0dXJuICZtcC0+c3RhdHM7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIGlubGluZSB2b2lkIG12NjQzeHhfZW5hYmxlX2lycShzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCkKK3sKKwlpbnQgcG9ydF9udW0gPSBtcC0+cG9ydF9udW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOworCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyhwb3J0X251bSksCisJCQkJCUlOVF9DQVVTRV9VTk1BU0tfQUxMKTsKKwltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfRVhURU5EX01BU0tfUkVHKHBvcnRfbnVtKSwKKwkJCQkJSU5UX0NBVVNFX1VOTUFTS19BTExfRVhUKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXY2NDN4eF9kaXNhYmxlX2lycShzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCkKK3sKKwlpbnQgcG9ydF9udW0gPSBtcC0+cG9ydF9udW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOworCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyhwb3J0X251bSksCisJCQkJCUlOVF9DQVVTRV9NQVNLX0FMTCk7CisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX0VYVEVORF9NQVNLX1JFRyhwb3J0X251bSksCisJCQkJCUlOVF9DQVVTRV9NQVNLX0FMTF9FWFQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG12NjQzeHhfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCW12NjQzeHhfZGlzYWJsZV9pcnEobXApOworCW12NjQzeHhfZXRoX2ludF9oYW5kbGVyKG5ldGRldi0+aXJxLCBuZXRkZXYsIE5VTEwpOworCW12NjQzeHhfZW5hYmxlX2lycShtcCk7Cit9CisjZW5kaWYKKwogLyovCiAgKiBtdjY0M3h4X2V0aF9wcm9iZQogICoKQEAgLTE0MDYsNiArMTQyNCwxMCBAQAogCWRldi0+d2VpZ2h0ID0gNjQ7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBtdjY0M3h4X25ldHBvbGw7CisjZW5kaWYKKwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAyICogSFo7CiAJZGV2LT50eF9xdWV1ZV9sZW4gPSBtcC0+dHhfcmluZ19zaXplOwogCWRldi0+YmFzZV9hZGRyID0gMDsKQEAgLTE4ODMsNiArMTkwNSw5IEBACiAJLyogRW5hYmxlIHBvcnQgUnguICovCiAJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRyhwb3J0X251bSksCiAJCQkJCQltcC0+cG9ydF9yeF9xdWV1ZV9jb21tYW5kKTsKKworCS8qIERpc2FibGUgcG9ydCBiYW5kd2lkdGggbGltaXRzIGJ5IGNsZWFyaW5nIE1UVSByZWdpc3RlciAqLworCW12X3dyaXRlKE1WNjQzWFhfRVRIX01BWElNVU1fVFJBTlNNSVRfVU5JVChwb3J0X251bSksIDApOwogfQogCiAvKgpAQCAtMjI5MiwzNCArMjMxNyw2IEBACiAJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcocG9ydF9udW0pLCByZWdfZGF0YSk7CiB9CiAKLS8qCi0gKiBldGhlcm5ldF9zZXRfY29uZmlnX3JlZyAtIFNldCBzcGVjaWZpZWQgYml0cyBpbiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgotICoKLSAqIERFU0NSSVBUSU9OOgotICoJVGhpcyBmdW5jdGlvbiBzZXRzIHNwZWNpZmllZCBiaXRzIGluIHRoZSBnaXZlbiBldGhlcm5ldAotICoJY29uZmlndXJhdGlvbiByZWdpc3Rlci4KLSAqCi0gKiBJTlBVVDoKLSAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JRXRoZXJuZXQgUG9ydCBudW1iZXIuCi0gKgl1bnNpZ25lZCBpbnQJdmFsdWUJCTMyIGJpdCB2YWx1ZS4KLSAqCi0gKiBPVVRQVVQ6Ci0gKglUaGUgc2V0IGJpdHMgaW4gdGhlIHZhbHVlIHBhcmFtZXRlciBhcmUgc2V0IGluIHRoZSBjb25maWd1cmF0aW9uCi0gKglyZWdpc3Rlci4KLSAqCi0gKiBSRVRVUk46Ci0gKglOb25lLgotICoKLSAqLwotc3RhdGljIHZvaWQgZXRoZXJuZXRfc2V0X2NvbmZpZ19yZWcodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSwKLQkJCQkJCQl1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdW5zaWduZWQgaW50IGV0aF9jb25maWdfcmVnOwotCi0JZXRoX2NvbmZpZ19yZWcgPSBtdl9yZWFkKE1WNjQzWFhfRVRIX1BPUlRfQ09ORklHX1JFRyhldGhfcG9ydF9udW0pKTsKLQlldGhfY29uZmlnX3JlZyB8PSB2YWx1ZTsKLQltdl93cml0ZShNVjY0M1hYX0VUSF9QT1JUX0NPTkZJR19SRUcoZXRoX3BvcnRfbnVtKSwgZXRoX2NvbmZpZ19yZWcpOwotfQogCiBzdGF0aWMgaW50IGV0aF9wb3J0X2F1dG9uZWdfc3VwcG9ydGVkKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pCiB7CkBAIC0yMzQ2LDMxICsyMzQzLDYgQEAKIH0KIAogLyoKLSAqIGV0aGVybmV0X2dldF9jb25maWdfcmVnIC0gR2V0IHRoZSBwb3J0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKLSAqCi0gKiBERVNDUklQVElPTjoKLSAqCVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlciB2YWx1ZSBvZiB0aGUgZ2l2ZW4KLSAqCWV0aGVybmV0IHBvcnQuCi0gKgotICogSU5QVVQ6Ci0gKgl1bnNpZ25lZCBpbnQJZXRoX3BvcnRfbnVtCUV0aGVybmV0IFBvcnQgbnVtYmVyLgotICoKLSAqIE9VVFBVVDoKLSAqCU5vbmUuCi0gKgotICogUkVUVVJOOgotICoJUG9ydCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHZhbHVlLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGV0aGVybmV0X2dldF9jb25maWdfcmVnKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pCi17Ci0JdW5zaWduZWQgaW50IGV0aF9jb25maWdfcmVnOwotCi0JZXRoX2NvbmZpZ19yZWcgPSBtdl9yZWFkKE1WNjQzWFhfRVRIX1BPUlRfQ09ORklHX0VYVEVORF9SRUcKLQkJCQkJCQkJKGV0aF9wb3J0X251bSkpOwotCXJldHVybiBldGhfY29uZmlnX3JlZzsKLX0KLQotLyoKICAqIGV0aF9wb3J0X3JlYWRfc21pX3JlZyAtIFJlYWQgUEhZIHJlZ2lzdGVycwogICoKICAqIERFU0NSSVBUSU9OOgpAQCAtMjUyOCw2ICsyNTAwLDkgQEAKIAkJcmV0dXJuIEVUSF9FUlJPUjsKIAl9CiAKKwltcC0+dHhfcmluZ19za2JzKys7CisJQlVHX09OKG1wLT50eF9yaW5nX3NrYnMgPiBtcC0+dHhfcmluZ19zaXplKTsKKwogCS8qIEdldCB0aGUgVHggRGVzYyByaW5nIGluZGV4ZXMgKi8KIAl0eF9kZXNjX2N1cnIgPSBtcC0+dHhfY3Vycl9kZXNjX3E7CiAJdHhfZGVzY191c2VkID0gbXAtPnR4X3VzZWRfZGVzY19xOwpAQCAtMjU5NCw2ICsyNTY5LDkgQEAKIAlpZiAobXAtPnR4X3Jlc291cmNlX2VycikKIAkJcmV0dXJuIEVUSF9RVUVVRV9GVUxMOwogCisJbXAtPnR4X3Jpbmdfc2ticysrOworCUJVR19PTihtcC0+dHhfcmluZ19za2JzID4gbXAtPnR4X3Jpbmdfc2l6ZSk7CisKIAkvKiBHZXQgdGhlIFR4IERlc2MgcmluZyBpbmRleGVzICovCiAJdHhfZGVzY19jdXJyID0gbXAtPnR4X2N1cnJfZGVzY19xOwogCXR4X2Rlc2NfdXNlZCA9IG1wLT50eF91c2VkX2Rlc2NfcTsKQEAgLTI2OTQsNiArMjY3Miw5IEBACiAJLyogQW55IFR4IHJldHVybiBjYW5jZWxzIHRoZSBUeCByZXNvdXJjZSBlcnJvciBzdGF0dXMgKi8KIAltcC0+dHhfcmVzb3VyY2VfZXJyID0gMDsKIAorCUJVR19PTihtcC0+dHhfcmluZ19za2JzID09IDApOworCW1wLT50eF9yaW5nX3NrYnMtLTsKKwogCXJldHVybiBFVEhfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmggYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5oCmluZGV4IDc2NzhiNTkuLmJjZmRhNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmgKKysrIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguaApAQCAtNDA4LDEwICs0MDgsNiBAQAogc3RhdGljIHZvaWQgZXRoX3BvcnRfcmVzZXQodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSk7CiBzdGF0aWMgdm9pZCBldGhfcG9ydF9zdGFydChzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCk7CiAKLXN0YXRpYyB2b2lkIGV0aGVybmV0X3NldF9jb25maWdfcmVnKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0sCi0JCQkJICAgIHVuc2lnbmVkIGludCB2YWx1ZSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGV0aGVybmV0X2dldF9jb25maWdfcmVnKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pOwotCiAvKiBQb3J0IE1BQyBhZGRyZXNzIHJvdXRpbmVzICovCiBzdGF0aWMgdm9pZCBldGhfcG9ydF91Y19hZGRyX3NldCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtLAogCQkJCSB1bnNpZ25lZCBjaGFyICpwX2FkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUzMjEwLmMgYi9kcml2ZXJzL25ldC9uZTMyMTAuYwppbmRleCA2YzkyZjA5Li43MzUwMWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZTMyMTAuYworKysgYi9kcml2ZXJzL25ldC9uZTMyMTAuYwpAQCAtMjYsOSArMjYsNiBAQAogCVVwZGF0ZWQgdG8gRUlTQSBwcm9iaW5nIEFQSSA1LzIwMDMgYnkgTWFyYyBaeW5naWVyLgogKi8KIAotc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQotCSJuZTMyMTAuYzogRHJpdmVyIHJldmlzaW9uIHYwLjAzLCAzMC8wOS85OFxuIjsKLQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTE5Nyw3ICsxOTQsNyBAQAogCWVpX3N0YXR1cy5wcml2ID0gcGh5c19tZW07CiAKIAlpZiAoZWlfZGVidWcgPiAwKQotCQlwcmludGsodmVyc2lvbik7CisJCXByaW50aygibmUzMjEwIGxvYWRlZC5cbiIpOwogCiAJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmbmUzMjEwX3Jlc2V0XzgzOTA7CiAJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJm5lMzIxMF9ibG9ja19pbnB1dDsKQEAgLTM2MCwxMiArMzU3LDEyIEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVWSUNFX1RBQkxFKGVpc2EsIG5lMzIxMF9pZHMpOwogCi1pbnQgbmUzMjEwX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgbmUzMjEwX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gZWlzYV9kcml2ZXJfcmVnaXN0ZXIgKCZuZTMyMTBfZWlzYV9kcml2ZXIpOwogfQogCi12b2lkIG5lMzIxMF9jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBuZTMyMTBfY2xlYW51cCh2b2lkKQogewogCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZuZTMyMTBfZWlzYV9kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L0tjb25maWcgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwppbmRleCA2YTJmZTM1Li4xNGY0ZGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwpAQCAtNiw3ICs2LDcgQEAKIAogY29uZmlnIFBIWUxJQgogCXRyaXN0YXRlICJQSFkgRGV2aWNlIHN1cHBvcnQgYW5kIGluZnJhc3RydWN0dXJlIgotCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgKEJST0tFTiB8fCAhQVJDSF9TMzkwKQogCWhlbHAKIAkgIEV0aGVybmV0IGNvbnRyb2xsZXJzIGFyZSB1c3VhbGx5IGF0dGFjaGVkIHRvIFBIWQogCSAgZGV2aWNlcy4gIFRoaXMgb3B0aW9uIHByb3ZpZGVzIGluZnJhc3RydWN0dXJlIGZvcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21kaW9fYnVzLmMgYi9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYwppbmRleCA0MWY2MmMwLi45MDYzMDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYworKysgYi9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAvKiBTdXNwZW5kIGFuZCByZXN1bWUuICBDb3BpZWQgZnJvbSBwbGF0Zm9ybV9zdXNwZW5kIGFuZAogICogcGxhdGZvcm1fcmVzdW1lCiAgKi8KLXN0YXRpYyBpbnQgbWRpb19idXNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICogZGV2LCB1MzIgc3RhdGUpCitzdGF0aWMgaW50IG1kaW9fYnVzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKQEAgLTE3MCw3ICsxNzAsNyBAQAogCXJldHVybiBidXNfcmVnaXN0ZXIoJm1kaW9fYnVzX3R5cGUpOwogfQogCi12b2lkIF9fZXhpdCBtZGlvX2J1c19leGl0KHZvaWQpCit2b2lkIG1kaW9fYnVzX2V4aXQodm9pZCkKIHsKIAlidXNfdW5yZWdpc3RlcigmbWRpb19idXNfdHlwZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jIGIvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYwppbmRleCBiYjcxNjM4Li4wZGY3ZTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKQEAgLTEyMzIsOSArMTIzMiw3IEBACiAJbmF2YWlsID0gMDsJLyogdG90YWwgIyBvZiB1c2FibGUgY2hhbm5lbHMgKG5vdCBkZXJlZ2lzdGVyZWQpICovCiAJaGRybGVuID0gKHBwcC0+ZmxhZ3MgJiBTQ19NUF9YU0hPUlRTRVEpPyBNUEhEUkxFTl9TU046IE1QSERSTEVOOwogCWkgPSAwOwotCWxpc3QgPSAmcHBwLT5jaGFubmVsczsKLQl3aGlsZSAoKGxpc3QgPSBsaXN0LT5uZXh0KSAhPSAmcHBwLT5jaGFubmVscykgewotCQlwY2ggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjaGFubmVsLCBjbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwY2gsICZwcHAtPmNoYW5uZWxzLCBjbGlzdCkgewogCQluYXZhaWwgKz0gcGNoLT5hdmFpbCA9IChwY2gtPmNoYW4gIT0gTlVMTCk7CiAJCWlmIChwY2gtPmF2YWlsKSB7CiAJCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZwY2gtPmZpbGUueHEpIHx8CkBAIC0xMjgwLDYgKzEyNzgsNyBAQAogCiAJLyogc2tpcCB0byB0aGUgY2hhbm5lbCBhZnRlciB0aGUgb25lIHdlIGxhc3QgdXNlZAogCSAgIGFuZCBzdGFydCBhdCB0aGF0IG9uZSAqLworCWxpc3QgPSAmcHBwLT5jaGFubmVsczsKIAlmb3IgKGkgPSAwOyBpIDwgcHBwLT5ueGNoYW47ICsraSkgewogCQlsaXN0ID0gbGlzdC0+bmV4dDsKIAkJaWYgKGxpc3QgPT0gJnBwcC0+Y2hhbm5lbHMpIHsKQEAgLTE3MzAsNyArMTcyOSw3IEBACiBwcHBfcmVjZWl2ZV9tcF9mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjaGFubmVsICpwY2gpCiB7CiAJdTMyIG1hc2ssIHNlcTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXN0cnVjdCBjaGFubmVsICpjaDsKIAlpbnQgbXBoZHJsZW4gPSAocHBwLT5mbGFncyAmIFNDX01QX1NIT1JUU0VRKT8gTVBIRFJMRU5fU1NOOiBNUEhEUkxFTjsKIAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIG1waGRybGVuKSB8fCBwcHAtPm1ycnUgPT0gMCkKQEAgLTE3ODQsOCArMTc4Myw3IEBACiAJICogVGhlIGxpc3Qgb2YgY2hhbm5lbHMgY2FuJ3QgY2hhbmdlIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgcmVjZWl2ZQogCSAqIHNpZGUgb2YgdGhlIHBwcCB1bml0IGxvY2tlZC4KIAkgKi8KLQlmb3IgKGwgPSBwcHAtPmNoYW5uZWxzLm5leHQ7IGwgIT0gJnBwcC0+Y2hhbm5lbHM7IGwgPSBsLT5uZXh0KSB7Ci0JCXN0cnVjdCBjaGFubmVsICpjaCA9IGxpc3RfZW50cnkobCwgc3RydWN0IGNoYW5uZWwsIGNsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmcHBwLT5jaGFubmVscywgY2xpc3QpIHsKIAkJaWYgKHNlcV9iZWZvcmUoY2gtPmxhc3RzZXEsIHNlcSkpCiAJCQlzZXEgPSBjaC0+bGFzdHNlcTsKIAl9CkBAIC0yMjcxLDEwICsyMjY5LDggQEAKIGZpbmRfY29tcF9lbnRyeShpbnQgcHJvdG8pCiB7CiAJc3RydWN0IGNvbXByZXNzb3JfZW50cnkgKmNlOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSAmY29tcHJlc3Nvcl9saXN0OwogCi0Jd2hpbGUgKChsaXN0ID0gbGlzdC0+bmV4dCkgIT0gJmNvbXByZXNzb3JfbGlzdCkgewotCQljZSA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNvbXByZXNzb3JfZW50cnksIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2UsICZjb21wcmVzc29yX2xpc3QsIGxpc3QpIHsKIAkJaWYgKGNlLT5jb21wLT5jb21wcmVzc19wcm90byA9PSBwcm90bykKIAkJCXJldHVybiBjZTsKIAl9CkBAIC0yNTQwLDIwICsyNTM2LDE1IEBACiBwcHBfZmluZF9jaGFubmVsKGludCB1bml0KQogewogCXN0cnVjdCBjaGFubmVsICpwY2g7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAotCWxpc3QgPSAmbmV3X2NoYW5uZWxzOwotCXdoaWxlICgobGlzdCA9IGxpc3QtPm5leHQpICE9ICZuZXdfY2hhbm5lbHMpIHsKLQkJcGNoID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgY2hhbm5lbCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwY2gsICZuZXdfY2hhbm5lbHMsIGxpc3QpIHsKIAkJaWYgKHBjaC0+ZmlsZS5pbmRleCA9PSB1bml0KSB7CiAJCQlsaXN0X2RlbCgmcGNoLT5saXN0KTsKIAkJCWxpc3RfYWRkKCZwY2gtPmxpc3QsICZhbGxfY2hhbm5lbHMpOwogCQkJcmV0dXJuIHBjaDsKIAkJfQogCX0KLQlsaXN0ID0gJmFsbF9jaGFubmVsczsKLQl3aGlsZSAoKGxpc3QgPSBsaXN0LT5uZXh0KSAhPSAmYWxsX2NoYW5uZWxzKSB7Ci0JCXBjaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNoYW5uZWwsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGNoLCAmYWxsX2NoYW5uZWxzLCBsaXN0KSB7CiAJCWlmIChwY2gtPmZpbGUuaW5kZXggPT0gdW5pdCkKIAkJCXJldHVybiBwY2g7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby1yZWdzLmggYi9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaAppbmRleCAyMjM0YThmLi43Y2VmZTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaAorKysgYi9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaApAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHJlZ3MuaDogQSBMaW51eCBQQ0ktWCBFdGhlcm5ldCBkcml2ZXIgZm9yIFMySU8gMTBHYkUgU2VydmVyIE5JQworICogcmVncy5oOiBBIExpbnV4IFBDSS1YIEV0aGVybmV0IGRyaXZlciBmb3IgTmV0ZXJpb24gMTBHYkUgU2VydmVyIE5JQwogICogQ29weXJpZ2h0KGMpIDIwMDItMjAwNSBOZXRlcmlvbiBJbmMuCiAKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKQEAgLTcxMywxMyArNzEzLDE2IEBACiAJdTY0IG1jX2Vycl9yZWc7CiAjZGVmaW5lIE1DX0VSUl9SRUdfRUNDX0RCX0VSUl9MICAgICAgICAgICAgQklUKDE0KQogI2RlZmluZSBNQ19FUlJfUkVHX0VDQ19EQl9FUlJfVSAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgTUNfRVJSX1JFR19NSVJJX0VDQ19EQl9FUlJfMCAgICAgICBCSVQoMTgpCisjZGVmaW5lIE1DX0VSUl9SRUdfTUlSSV9FQ0NfREJfRVJSXzEgICAgICAgQklUKDIwKQogI2RlZmluZSBNQ19FUlJfUkVHX01JUklfQ1JJX0VSUl8wICAgICAgICAgIEJJVCgyMikKICNkZWZpbmUgTUNfRVJSX1JFR19NSVJJX0NSSV9FUlJfMSAgICAgICAgICBCSVQoMjMpCiAjZGVmaW5lIE1DX0VSUl9SRUdfU01fRVJSICAgICAgICAgICAgICAgICAgQklUKDMxKQotI2RlZmluZSBNQ19FUlJfUkVHX0VDQ19BTExfU05HCQkgICAoQklUKDYpIHwgXAotCQkJCQlCSVQoNykgfCBCSVQoMTcpIHwgQklUKDE5KSkKLSNkZWZpbmUgTUNfRVJSX1JFR19FQ0NfQUxMX0RCTAkJICAgKEJJVCgxNCkgfCBcCi0JCQkJCUJJVCgxNSkgfCBCSVQoMTgpIHwgQklUKDIwKSkKKyNkZWZpbmUgTUNfRVJSX1JFR19FQ0NfQUxMX1NORwkJICAgKEJJVCgyKSB8IEJJVCgzKSB8IEJJVCg0KSB8IEJJVCg1KSB8XAorCQkJCQkgICAgQklUKDYpIHwgQklUKDcpIHwgQklUKDE3KSB8IEJJVCgxOSkpCisjZGVmaW5lIE1DX0VSUl9SRUdfRUNDX0FMTF9EQkwJCSAgIChCSVQoMTApIHwgQklUKDExKSB8IEJJVCgxMikgfFwKKwkJCQkJICAgIEJJVCgxMykgfCBCSVQoMTQpIHwgQklUKDE1KSB8XAorCQkJCQkgICAgQklUKDE4KSB8IEJJVCgyMCkpCiAJdTY0IG1jX2Vycl9tYXNrOwogCXU2NCBtY19lcnJfYWxhcm07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uYyBiL2RyaXZlcnMvbmV0L3MyaW8uYwppbmRleCA3Y2E3ODIyLi5jODI5ZTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLmMKKysrIGIvZHJpdmVycy9uZXQvczJpby5jCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogczJpby5jOiBBIExpbnV4IFBDSS1YIEV0aGVybmV0IGRyaXZlciBmb3IgUzJJTyAxMEdiRSBTZXJ2ZXIgTklDCisgKiBzMmlvLmM6IEEgTGludXggUENJLVggRXRoZXJuZXQgZHJpdmVyIGZvciBOZXRlcmlvbiAxMEdiRSBTZXJ2ZXIgTklDCiAgKiBDb3B5cmlnaHQoYykgMjAwMi0yMDA1IE5ldGVyaW9uIEluYy4KIAogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgpAQCAtMjgsNyArMjgsNyBAQAogICogZXhwbGFpbmF0aW9uIG9mIGFsbCB0aGUgdmFyaWFibGVzLgogICogcnhfcmluZ19udW0gOiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2dyYW0gdGhlIG51bWJlciBvZiByZWNlaXZlIHJpbmdzIHVzZWQKICAqIGluIHRoZSBkcml2ZXIuCi0gKiByeF9yaW5nX2xlbjogVGhpcyBkZWZpbmVzIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgZWFjaCByaW5nIGNhbiBoYXZlLiBUaGlzCisgKiByeF9yaW5nX3N6OiBUaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBlYWNoIHJpbmcgY2FuIGhhdmUuIFRoaXMKICAqIGlzIGFsc28gYW4gYXJyYXkgb2Ygc2l6ZSA4LgogICogdHhfZmlmb19udW06IFRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIFR4IEZJRk9zIHRoYXRzIHVzZWQgaW50IHRoZSBkcml2ZXIuCiAgKiB0eF9maWZvX2xlbjogVGhpcyB0b28gaXMgYW4gYXJyYXkgb2YgOC4gRWFjaCBlbGVtZW50IGRlZmluZXMgdGhlIG51bWJlciBvZgpAQCAtNjcsNyArNjcsNyBAQAogCiAvKiBTMmlvIERyaXZlciBuYW1lICYgdmVyc2lvbi4gKi8KIHN0YXRpYyBjaGFyIHMyaW9fZHJpdmVyX25hbWVbXSA9ICJOZXRlcmlvbiI7Ci1zdGF0aWMgY2hhciBzMmlvX2RyaXZlcl92ZXJzaW9uW10gPSAiVmVyc2lvbiAyLjAuMy4xIjsKK3N0YXRpYyBjaGFyIHMyaW9fZHJpdmVyX3ZlcnNpb25bXSA9ICJWZXJzaW9uIDIuMC44LjEiOwogCiBzdGF0aWMgaW5saW5lIGludCBSWERfSVNfVVAyRFQoUnhEX3QgKnJ4ZHApCiB7CkBAIC0zNTQsNyArMzU0LDcgQEAKIAlpbnQgbHN0X3NpemUsIGxzdF9wZXJfcGFnZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CiAjaWZkZWYgQ09ORklHXzJCVUZGX01PREUKLQl1NjQgdG1wOworCXVuc2lnbmVkIGxvbmcgdG1wOwogCWJ1ZmZBZGRfdCAqYmE7CiAjZW5kaWYKIApAQCAtNDA0LDcgKzQwNCw3IEBACiAJCSAgICBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbiAtIDE7CiAJCW1hY19jb250cm9sLT5maWZvc1tpXS5maWZvX25vID0gaTsKIAkJbWFjX2NvbnRyb2wtPmZpZm9zW2ldLm5pYyA9IG5pYzsKLQkJbWFjX2NvbnRyb2wtPmZpZm9zW2ldLm1heF90eGRzID0gTUFYX1NLQl9GUkFHUzsKKwkJbWFjX2NvbnRyb2wtPmZpZm9zW2ldLm1heF90eGRzID0gTUFYX1NLQl9GUkFHUyArIDE7CiAKIAkJZm9yIChqID0gMDsgaiA8IHBhZ2VfbnVtOyBqKyspIHsKIAkJCWludCBrID0gMDsKQEAgLTQxOCw2ICs0MTgsMjYgQEAKIAkJCQlEQkdfUFJJTlQoRVJSX0RCRywgImZhaWxlZCBmb3IgVHhETFxuIik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CisJCQkvKiBJZiB3ZSBnb3QgYSB6ZXJvIERNQSBhZGRyZXNzKGNhbiBoYXBwZW4gb24KKwkJCSAqIGNlcnRhaW4gcGxhdGZvcm1zIGxpa2UgUFBDKSwgcmVhbGxvY2F0ZS4KKwkJCSAqIFN0b3JlIHZpcnR1YWwgYWRkcmVzcyBvZiBwYWdlIHdlIGRvbid0IHdhbnQsCisJCQkgKiB0byBiZSBmcmVlZCBsYXRlci4KKwkJCSAqLworCQkJaWYgKCF0bXBfcCkgeworCQkJCW1hY19jb250cm9sLT56ZXJvZG1hX3ZpcnRfYWRkciA9IHRtcF92OworCQkJCURCR19QUklOVChJTklUX0RCRywgCisJCQkJIiVzOiBaZXJvIERNQSBhZGRyZXNzIGZvciBUeERMLiAiLCBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChJTklUX0RCRywgCisJCQkJIlZpcnR1YWwgYWRkcmVzcyAlbGx4XG4iLCAodTY0KXRtcF92KTsKKwkJCQl0bXBfdiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5pYy0+cGRldiwKKwkJCQkJCSAgICAgUEFHRV9TSVpFLCAmdG1wX3ApOworCQkJCWlmICghdG1wX3YpIHsKKwkJCQkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkJCSAgInBjaV9hbGxvY19jb25zaXN0ZW50ICIpOworCQkJCQlEQkdfUFJJTlQoRVJSX0RCRywgImZhaWxlZCBmb3IgVHhETFxuIik7CisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCX0KKwkJCX0KIAkJCXdoaWxlIChrIDwgbHN0X3Blcl9wYWdlKSB7CiAJCQkJaW50IGwgPSAoaiAqIGxzdF9wZXJfcGFnZSkgKyBrOwogCQkJCWlmIChsID09IGNvbmZpZy0+dHhfY2ZnW2ldLmZpZm9fbGVuKQpAQCAtNTQyLDE4ICs1NjIsMTggQEAKIAkJCQkgICAgKEJVRjBfTEVOICsgQUxJR05fU0laRSwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYgKCFiYS0+YmFfMF9vcmcpCiAJCQkJCXJldHVybiAtRU5PTUVNOwotCQkJCXRtcCA9ICh1NjQpIGJhLT5iYV8wX29yZzsKKwkJCQl0bXAgPSAodW5zaWduZWQgbG9uZykgYmEtPmJhXzBfb3JnOwogCQkJCXRtcCArPSBBTElHTl9TSVpFOwotCQkJCXRtcCAmPSB+KCh1NjQpIEFMSUdOX1NJWkUpOworCQkJCXRtcCAmPSB+KCh1bnNpZ25lZCBsb25nKSBBTElHTl9TSVpFKTsKIAkJCQliYS0+YmFfMCA9ICh2b2lkICopIHRtcDsKIAogCQkJCWJhLT5iYV8xX29yZyA9ICh2b2lkICopIGttYWxsb2MKIAkJCQkgICAgKEJVRjFfTEVOICsgQUxJR05fU0laRSwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYgKCFiYS0+YmFfMV9vcmcpCiAJCQkJCXJldHVybiAtRU5PTUVNOwotCQkJCXRtcCA9ICh1NjQpIGJhLT5iYV8xX29yZzsKKwkJCQl0bXAgPSAodW5zaWduZWQgbG9uZykgYmEtPmJhXzFfb3JnOwogCQkJCXRtcCArPSBBTElHTl9TSVpFOwotCQkJCXRtcCAmPSB+KCh1NjQpIEFMSUdOX1NJWkUpOworCQkJCXRtcCAmPSB+KCh1bnNpZ25lZCBsb25nKSBBTElHTl9TSVpFKTsKIAkJCQliYS0+YmFfMSA9ICh2b2lkICopIHRtcDsKIAkJCQlrKys7CiAJCQl9CkBAIC02MDAsNyArNjIwLDcgQEAKIAltYWNfaW5mb190ICptYWNfY29udHJvbDsKIAlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CiAJaW50IGxzdF9zaXplLCBsc3RfcGVyX3BhZ2U7Ci0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CiAKIAlpZiAoIW5pYykKIAkJcmV0dXJuOwpAQCAtNjE2LDkgKzYzNiwxMCBAQAogCQkJCQkJbHN0X3Blcl9wYWdlKTsKIAkJZm9yIChqID0gMDsgaiA8IHBhZ2VfbnVtOyBqKyspIHsKIAkJCWludCBtZW1fYmxrcyA9IChqICogbHN0X3Blcl9wYWdlKTsKLQkJCWlmICgoIW1hY19jb250cm9sLT5maWZvc1tpXS5saXN0X2luZm8pIHx8Ci0JCQkJKCFtYWNfY29udHJvbC0+Zmlmb3NbaV0ubGlzdF9pbmZvW21lbV9ibGtzXS4KLQkJCQkgbGlzdF92aXJ0X2FkZHIpKQorCQkJaWYgKCFtYWNfY29udHJvbC0+Zmlmb3NbaV0ubGlzdF9pbmZvKQorCQkJCXJldHVybjsJCisJCQlpZiAoIW1hY19jb250cm9sLT5maWZvc1tpXS5saXN0X2luZm9bbWVtX2Jsa3NdLgorCQkJCSBsaXN0X3ZpcnRfYWRkcikKIAkJCQlicmVhazsKIAkJCXBjaV9mcmVlX2NvbnNpc3RlbnQobmljLT5wZGV2LCBQQUdFX1NJWkUsCiAJCQkJCSAgICBtYWNfY29udHJvbC0+Zmlmb3NbaV0uCkBAIC02MjgsNiArNjQ5LDE4IEBACiAJCQkJCSAgICBsaXN0X2luZm9bbWVtX2Jsa3NdLgogCQkJCQkgICAgbGlzdF9waHlfYWRkcik7CiAJCX0KKwkJLyogSWYgd2UgZ290IGEgemVybyBETUEgYWRkcmVzcyBkdXJpbmcgYWxsb2NhdGlvbiwKKwkJICogZnJlZSB0aGUgcGFnZSBub3cKKwkJICovCisJCWlmIChtYWNfY29udHJvbC0+emVyb2RtYV92aXJ0X2FkZHIpIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQobmljLT5wZGV2LCBQQUdFX1NJWkUsCisJCQkJCSAgICBtYWNfY29udHJvbC0+emVyb2RtYV92aXJ0X2FkZHIsCisJCQkJCSAgICAoZG1hX2FkZHJfdCkwKTsKKwkJCURCR19QUklOVChJTklUX0RCRywgCisJCQkiJXM6IEZyZWVpbmcgVHhETCB3aXRoIHplcm8gRE1BIGFkZHIuICIsIGRldi0+bmFtZSk7CisJCQlEQkdfUFJJTlQoSU5JVF9EQkcsICJWaXJ0dWFsIGFkZHJlc3MgJWxseFxuIiwKKwkJCSh1NjQpKG1hY19jb250cm9sLT56ZXJvZG1hX3ZpcnRfYWRkcikpOworCQl9CiAJCWtmcmVlKG1hY19jb250cm9sLT5maWZvc1tpXS5saXN0X2luZm8pOwogCX0KIApAQCAtNjg2LDcgKzcxOSw3IEBACiAKIHN0YXRpYyBpbnQgczJpb192ZXJpZnlfcGNpX21vZGUobmljX3QgKm5pYykKIHsKLQlYRU5BX2Rldl9jb25maWdfdCAqYmFyMCA9IChYRU5BX2Rldl9jb25maWdfdCAqKSBuaWMtPmJhcjA7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKIAlyZWdpc3RlciB1NjQgdmFsNjQgPSAwOwogCWludCAgICAgbW9kZTsKIApAQCAtNzA0LDcgKzczNyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgczJpb19wcmludF9wY2lfbW9kZShuaWNfdCAqbmljKQogewotCVhFTkFfZGV2X2NvbmZpZ190ICpiYXIwID0gKFhFTkFfZGV2X2NvbmZpZ190ICopIG5pYy0+YmFyMDsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOwogCXJlZ2lzdGVyIHU2NCB2YWw2NCA9IDA7CiAJaW50CW1vZGU7CiAJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnID0gJm5pYy0+Y29uZmlnOwpAQCAtMTQwMyw3ICsxNDM2LDcgQEAKIAl3cml0ZXEoMHhmZmJiZmZiYmZmYmJmZmJiVUxMLCAmYmFyMC0+bWNfcGF1c2VfdGhyZXNoX3E0cTcpOwogCiAJLyogRGlzYWJsZSBSTUFDIFBBRCBTVFJJUFBJTkcgKi8KLQlhZGQgPSAodm9pZCAqKSAmYmFyMC0+bWFjX2NmZzsKKwlhZGQgPSAmYmFyMC0+bWFjX2NmZzsKIAl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tYWNfY2ZnKTsKIAl2YWw2NCAmPSB+KE1BQ19DRkdfUk1BQ19TVFJJUF9QQUQpOwogCXdyaXRlcShSTUFDX0NGR19LRVkoMHg0QzBEKSwgJmJhcjAtPnJtYWNfY2ZnX2tleSk7CkBAIC0xOTM0LDcgKzE5NjcsNyBAQAogCQl2YWw2NCB8PSAweDAwMDA4MDAwMDAwMDAwMDBVTEw7CiAJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdwaW9fY29udHJvbCk7CiAJCXZhbDY0ID0gMHgwNDExMDQwNDAwMDAwMDAwVUxMOwotCQl3cml0ZXEodmFsNjQsICh2b2lkIF9faW9tZW0gKikgKCh1OCAqKSBiYXIwICsgMHgyNzAwKSk7CisJCXdyaXRlcSh2YWw2NCwgKHZvaWQgX19pb21lbSAqKWJhcjAgKyAweDI3MDApOwogCX0KIAogCS8qCkBAIC0yMzk1LDcgKzI0MjgsNyBAQAogCWludCBwa3RfY250ID0gMCwgb3JnX3BrdHNfdG9fcHJvY2VzczsKIAltYWNfaW5mb190ICptYWNfY29udHJvbDsKIAlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7Ci0JWEVOQV9kZXZfY29uZmlnX3QgKmJhcjAgPSAoWEVOQV9kZXZfY29uZmlnX3QgKikgbmljLT5iYXIwOworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CiAJdTY0IHZhbDY0OwogCWludCBpOwogCkBAIC0yNDc5LDkgKzI1MTIsMTAgQEAKICNlbmRpZgogCXNwaW5fbG9jaygmbmljLT5yeF9sb2NrKTsKIAlpZiAoYXRvbWljX3JlYWQoJm5pYy0+Y2FyZF9zdGF0ZSkgPT0gQ0FSRF9ET1dOKSB7Ci0JCURCR19QUklOVChFUlJfREJHLCAiJXM6ICVzIGdvaW5nIGRvd24gZm9yIHJlc2V0XG4iLAorCQlEQkdfUFJJTlQoSU5UUl9EQkcsICIlczogJXMgZ29pbmcgZG93biBmb3IgcmVzZXRcbiIsCiAJCQkgIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lKTsKIAkJc3Bpbl91bmxvY2soJm5pYy0+cnhfbG9jayk7CisJCXJldHVybjsKIAl9CiAKIAlnZXRfaW5mbyA9IHJpbmdfZGF0YS0+cnhfY3Vycl9nZXRfaW5mbzsKQEAgLTI1OTYsOCArMjYzMCwxNCBAQAogCQlpZiAodHhkbHAtPkNvbnRyb2xfMSAmIFRYRF9UX0NPREUpIHsKIAkJCXVuc2lnbmVkIGxvbmcgbG9uZyBlcnI7CiAJCQllcnIgPSB0eGRscC0+Q29udHJvbF8xICYgVFhEX1RfQ09ERTsKLQkJCURCR19QUklOVChFUlJfREJHLCAiKioqVHhEIGVycm9yICVsbHhcbiIsCi0JCQkJICBlcnIpOworCQkJaWYgKChlcnIgPj4gNDgpID09IDB4QSkgeworCQkJCURCR19QUklOVChUWF9EQkcsICJUeEQgcmV0dXJuZWQgZHVlIFwKKwkJCQkJCXRvIGxvc3Mgb2YgbGlua1xuIik7CisJCQl9CisJCQllbHNlIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIioqKlR4RCBlcnJvciBcCisJCQkJCQklbGx4XG4iLCBlcnIpOworCQkJfQogCQl9CiAKIAkJc2tiID0gKHN0cnVjdCBza19idWZmICopICgodW5zaWduZWQgbG9uZykKQEAgLTI2ODksMTIgKzI3MjksMTYgQEAKIAkJaWYgKHZhbDY0ICYgTUNfRVJSX1JFR19FQ0NfQUxMX0RCTCkgewogCQkJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0LgogCQkJCWRvdWJsZV9lY2NfZXJycysrOwotCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogRGV2aWNlIGluZGljYXRlcyAiLAorCQkJREJHX1BSSU5UKElOSVRfREJHLCAiJXM6IERldmljZSBpbmRpY2F0ZXMgIiwKIAkJCQkgIGRldi0+bmFtZSk7Ci0JCQlEQkdfUFJJTlQoRVJSX0RCRywgImRvdWJsZSBFQ0MgZXJyb3IhIVxuIik7CisJCQlEQkdfUFJJTlQoSU5JVF9EQkcsICJkb3VibGUgRUNDIGVycm9yISFcbiIpOwogCQkJaWYgKG5pYy0+ZGV2aWNlX3R5cGUgIT0gWEZSQU1FX0lJX0RFVklDRSkgewotCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQkJCQlzY2hlZHVsZV93b3JrKCZuaWMtPnJzdF90aW1lcl90YXNrKTsKKwkJCQkvKiBSZXNldCBYZnJhbWVJIG9ubHkgaWYgY3JpdGljYWwgZXJyb3IgKi8KKwkJCQlpZiAodmFsNjQgJiAoTUNfRVJSX1JFR19NSVJJX0VDQ19EQl9FUlJfMCB8CisJCQkJCSAgICAgTUNfRVJSX1JFR19NSVJJX0VDQ19EQl9FUlJfMSkpIHsKKwkJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJCQlzY2hlZHVsZV93b3JrKCZuaWMtPnJzdF90aW1lcl90YXNrKTsKKwkJCQl9CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuCkBAIC0yNzA2LDcgKzI3NTAsOCBAQAogCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnNlcnJfc291cmNlKTsKIAlpZiAodmFsNjQgJiBTRVJSX1NPVVJDRV9BTlkpIHsKIAkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogRGV2aWNlIGluZGljYXRlcyAiLCBkZXYtPm5hbWUpOwotCQlEQkdfUFJJTlQoRVJSX0RCRywgInNlcmlvdXMgZXJyb3IhIVxuIik7CisJCURCR19QUklOVChFUlJfREJHLCAic2VyaW91cyBlcnJvciAlbGx4ISFcbiIsIAorCQkJICAodW5zaWduZWQgbG9uZyBsb25nKXZhbDY0KTsKIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCQlzY2hlZHVsZV93b3JrKCZuaWMtPnJzdF90aW1lcl90YXNrKTsKIAl9CkBAIC0yODMxLDcgKzI4NzYsNyBAQAogCQl2YWw2NCB8PSAweDAwMDA4MDAwMDAwMDAwMDBVTEw7CiAJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdwaW9fY29udHJvbCk7CiAJCXZhbDY0ID0gMHgwNDExMDQwNDAwMDAwMDAwVUxMOwotCQl3cml0ZXEodmFsNjQsICh2b2lkIF9faW9tZW0gKikgKCh1OCAqKSBiYXIwICsgMHgyNzAwKSk7CisJCXdyaXRlcSh2YWw2NCwgKHZvaWQgX19pb21lbSAqKWJhcjAgKyAweDI3MDApOwogCX0KIAogCS8qCkBAIC0zMTMwLDcgKzMxNzUsNyBAQAogCXF1ZXVlX2xlbiA9IG1hY19jb250cm9sLT5maWZvc1txdWV1ZV0udHhfY3Vycl9wdXRfaW5mby5maWZvX2xlbiArIDE7CiAJLyogQXZvaWQgInB1dCIgcG9pbnRlciBnb2luZyBiZXlvbmQgImdldCIgcG9pbnRlciAqLwogCWlmICh0eGRwLT5Ib3N0X0NvbnRyb2wgfHwgKCgocHV0X29mZiArIDEpICUgcXVldWVfbGVuKSA9PSBnZXRfb2ZmKSkgewotCQlEQkdfUFJJTlQoRVJSX0RCRywgIkVycm9yIGluIHhtaXQsIE5vIGZyZWUgVFhEcy5cbiIpOworCQlEQkdfUFJJTlQoVFhfREJHLCAiRXJyb3IgaW4geG1pdCwgTm8gZnJlZSBUWERzLlxuIik7CiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+dHhfbG9jaywgZmxhZ3MpOwpAQCAtMzIzNCw3ICszMjc5LDcgQEAKIAogc3RhdGljIHZvaWQgczJpb190eHBpY19pbnRyX2hhbmRsZShuaWNfdCAqc3ApCiB7Ci0JWEVOQV9kZXZfY29uZmlnX3QgKmJhcjAgPSAoWEVOQV9kZXZfY29uZmlnX3QgKikgc3AtPmJhcjA7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOwogCXU2NCB2YWw2NDsKIAogCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnBpY19pbnRfc3RhdHVzKTsKQEAgLTM1MjgsNyArMzU3Myw3IEBACiAKIAkJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CiAJCXNwLT5wcm9taXNjX2ZsZyA9IDE7Ci0JCURCR19QUklOVChFUlJfREJHLCAiJXM6IGVudGVyZWQgcHJvbWlzY3VvdXMgbW9kZVxuIiwKKwkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6IGVudGVyZWQgcHJvbWlzY3VvdXMgbW9kZVxuIiwKIAkJCSAgZGV2LT5uYW1lKTsKIAl9IGVsc2UgaWYgKCEoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSAmJiAoc3AtPnByb21pc2NfZmxnKSkgewogCQkvKiAgUmVtb3ZlIHRoZSBOSUMgZnJvbSBwcm9taXNjdW91cyBtb2RlICovCkBAIC0zNTQzLDcgKzM1ODgsNyBAQAogCiAJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19jZmcpOwogCQlzcC0+cHJvbWlzY19mbGcgPSAwOwotCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBsZWZ0IHByb21pc2N1b3VzIG1vZGVcbiIsCisJCURCR19QUklOVChJTkZPX0RCRywgIiVzOiBsZWZ0IHByb21pc2N1b3VzIG1vZGVcbiIsCiAJCQkgIGRldi0+bmFtZSk7CiAJfQogCkBAIC01MzI1LDcgKzUzNzAsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JY29uZmlnLT5tYXhfdHhkcyA9IE1BWF9TS0JfRlJBR1M7CisJY29uZmlnLT5tYXhfdHhkcyA9IE1BWF9TS0JfRlJBR1MgKyAxOwogCiAJLyogUnggc2lkZSBwYXJhbWV0ZXJzLiAqLwogCWlmIChyeF9yaW5nX3N6WzBdID09IDApCkBAIC01NTI1LDkgKzU1NzAsMTQgQEAKIAlpZiAoc3AtPmRldmljZV90eXBlICYgWEZSQU1FX0lJX0RFVklDRSkgewogCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBOZXRlcmlvbiBYZnJhbWUgSUkgMTBHYkUgYWRhcHRlciAiLAogCQkJICBkZXYtPm5hbWUpOwotCQlEQkdfUFJJTlQoRVJSX0RCRywgIihyZXYgJWQpLCBEcml2ZXIgJXNcbiIsCisJCURCR19QUklOVChFUlJfREJHLCAiKHJldiAlZCksICVzIiwKIAkJCQlnZXRfeGVuYV9yZXZfaWQoc3AtPnBkZXYpLAogCQkJCXMyaW9fZHJpdmVyX3ZlcnNpb24pOworI2lmZGVmIENPTkZJR18yQlVGRl9NT0RFCisJCURCR19QUklOVChFUlJfREJHLCAiLCBCdWZmZXIgbW9kZSAlZCIsMik7CisjZW5kaWYKKworCQlEQkdfUFJJTlQoRVJSX0RCRywgIlxuQ29weXJpZ2h0KGMpIDIwMDItMjAwNSBOZXRlcmlvbiBJbmMuXG4iKTsKIAkJREJHX1BSSU5UKEVSUl9EQkcsICJNQUMgQUREUjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCiAJCQkgIHNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbMF0sCiAJCQkgIHNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbMV0sCkBAIC01NTQ0LDkgKzU1OTQsMTMgQEAKIAl9IGVsc2UgewogCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBOZXRlcmlvbiBYZnJhbWUgSSAxMEdiRSBhZGFwdGVyICIsCiAJCQkgIGRldi0+bmFtZSk7Ci0JCURCR19QUklOVChFUlJfREJHLCAiKHJldiAlZCksIERyaXZlciAlc1xuIiwKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIocmV2ICVkKSwgJXMiLAogCQkJCQlnZXRfeGVuYV9yZXZfaWQoc3AtPnBkZXYpLAogCQkJCQlzMmlvX2RyaXZlcl92ZXJzaW9uKTsKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCQlEQkdfUFJJTlQoRVJSX0RCRywgIiwgQnVmZmVyIG1vZGUgJWQiLDIpOworI2VuZGlmCisJCURCR19QUklOVChFUlJfREJHLCAiXG5Db3B5cmlnaHQoYykgMjAwMi0yMDA1IE5ldGVyaW9uIEluYy5cbiIpOwogCQlEQkdfUFJJTlQoRVJSX0RCRywgIk1BQyBBRERSOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKIAkJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclswXSwKIAkJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclsxXSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uaCBiL2RyaXZlcnMvbmV0L3MyaW8uaAppbmRleCBiYzY0ZDk2Li44OTE1MWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLmgKKysrIGIvZHJpdmVycy9uZXQvczJpby5oCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogczJpby5oOiBBIExpbnV4IFBDSS1YIEV0aGVybmV0IGRyaXZlciBmb3IgUzJJTyAxMEdiRSBTZXJ2ZXIgTklDCisgKiBzMmlvLmg6IEEgTGludXggUENJLVggRXRoZXJuZXQgZHJpdmVyIGZvciBOZXRlcmlvbiAxMEdiRSBTZXJ2ZXIgTklDCiAgKiBDb3B5cmlnaHQoYykgMjAwMi0yMDA1IE5ldGVyaW9uIEluYy4KIAogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgpAQCAtNjIyLDYgKzYyMiw5IEBACiAJLyogRmlmbyBzcGVjaWZpYyBzdHJ1Y3R1cmUgKi8KIAlmaWZvX2luZm9fdCBmaWZvc1tNQVhfVFhfRklGT1NdOwogCisJLyogU2F2ZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgVHhEIHBhZ2Ugd2l0aCB6ZXJvIERNQSBhZGRyKGlmIGFueSkgKi8KKwl2b2lkICp6ZXJvZG1hX3ZpcnRfYWRkcjsKKwogLyogcnggc2lkZSBzdHVmZiAqLwogCS8qIFJpbmcgc3BlY2lmaWMgc3RydWN0dXJlICovCiAJcmluZ19pbmZvX3QgcmluZ3NbTUFYX1JYX1JJTkdTXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NpczE5MC5jIGIvZHJpdmVycy9uZXQvc2lzMTkwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmNzU1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NpczE5MC5jCkBAIC0wLDAgKzEsMTg4NCBAQAorLyoKKyAgIHNpczE5MC5jOiBTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtcyBTaVMxOTAgZXRoZXJuZXQgZHJpdmVyCisKKyAgIENvcHlyaWdodCAoYykgMjAwMyBLLk0uIExpdSA8a21saXVAc2lzLmNvbT4KKyAgIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisgICBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUgRnJhbmNvaXMgUm9taWV1IDxyb21pZXVAZnIuem9yZWlsLmNvbT4KKworICAgQmFzZWQgb24gcjgxNjkuYywgdGczLmMsIDgxMzljcC5jLCBza2dlLmMsIGVwaWMxMDAuYyBhbmQgU2lTIDE5MC8xOTEKKyAgIGdlbnVpbmUgZHJpdmVyLgorCisgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAgRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorICAgcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorICAgYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKyAgIHN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2RlZmluZSBuZXRfZHJ2KHAsIGFyZy4uLikJaWYgKG5ldGlmX21zZ19kcnYocCkpIFwKKwkJCQkJcHJpbnRrKGFyZykKKyNkZWZpbmUgbmV0X3Byb2JlKHAsIGFyZy4uLikJaWYgKG5ldGlmX21zZ19wcm9iZShwKSkgXAorCQkJCQlwcmludGsoYXJnKQorI2RlZmluZSBuZXRfbGluayhwLCBhcmcuLi4pCWlmIChuZXRpZl9tc2dfbGluayhwKSkgXAorCQkJCQlwcmludGsoYXJnKQorI2RlZmluZSBuZXRfaW50cihwLCBhcmcuLi4pCWlmIChuZXRpZl9tc2dfaW50cihwKSkgXAorCQkJCQlwcmludGsoYXJnKQorI2RlZmluZSBuZXRfdHhfZXJyKHAsIGFyZy4uLikJaWYgKG5ldGlmX21zZ190eF9lcnIocCkpIFwKKwkJCQkJcHJpbnRrKGFyZykKKworI2RlZmluZSBQSFlfTUFYX0FERFIJCTMyCisjZGVmaW5lIFBIWV9JRF9BTlkJCTB4MWYKKyNkZWZpbmUgTUlJX1JFR19BTlkJCTB4MWYKKworI2lmZGVmIENPTkZJR19TSVMxOTBfTkFQSQorI2RlZmluZSBOQVBJX1NVRkZJWAkiLU5BUEkiCisjZWxzZQorI2RlZmluZSBOQVBJX1NVRkZJWAkiIgorI2VuZGlmCisKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjIiIE5BUElfU1VGRklYCisjZGVmaW5lIERSVl9OQU1FCQkic2lzMTkwIgorI2RlZmluZSBTSVMxOTBfRFJJVkVSX05BTUUJRFJWX05BTUUgIiBHaWdhYml0IEV0aGVybmV0IGRyaXZlciAiIERSVl9WRVJTSU9OCisjZGVmaW5lIFBGWCBEUlZfTkFNRSAiOiAiCisKKyNpZmRlZiBDT05GSUdfU0lTMTkwX05BUEkKKyNkZWZpbmUgc2lzMTkwX3J4X3NrYgkJCW5ldGlmX3JlY2VpdmVfc2tiCisjZGVmaW5lIHNpczE5MF9yeF9xdW90YShjb3VudCwgcXVvdGEpCW1pbihjb3VudCwgcXVvdGEpCisjZWxzZQorI2RlZmluZSBzaXMxOTBfcnhfc2tiCQkJbmV0aWZfcngKKyNkZWZpbmUgc2lzMTkwX3J4X3F1b3RhKGNvdW50LCBxdW90YSkJY291bnQKKyNlbmRpZgorCisjZGVmaW5lIE1BQ19BRERSX0xFTgkJNgorCisjZGVmaW5lIE5VTV9UWF9ERVNDCQk2NAkvKiBbOC4uMTAyNF0gKi8KKyNkZWZpbmUgTlVNX1JYX0RFU0MJCTY0CS8qIFs4Li44MTkyXSAqLworI2RlZmluZSBUWF9SSU5HX0JZVEVTCQkoTlVNX1RYX0RFU0MgKiBzaXplb2Yoc3RydWN0IFR4RGVzYykpCisjZGVmaW5lIFJYX1JJTkdfQllURVMJCShOVU1fUlhfREVTQyAqIHNpemVvZihzdHJ1Y3QgUnhEZXNjKSkKKyNkZWZpbmUgUlhfQlVGX1NJWkUJCTE1MzYKKyNkZWZpbmUgUlhfQlVGX01BU0sJCTB4ZmZmOAorCisjZGVmaW5lIFNJUzE5MF9SRUdTX1NJWkUJMHg4MAorI2RlZmluZSBTSVMxOTBfVFhfVElNRU9VVAkoNipIWikKKyNkZWZpbmUgU0lTMTkwX1BIWV9USU1FT1VUCSgxMCpIWikKKyNkZWZpbmUgU0lTMTkwX01TR19ERUZBVUxUCShORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwgXAorCQkJCSBORVRJRl9NU0dfTElOSyB8IE5FVElGX01TR19JRlVQIHwgXAorCQkJCSBORVRJRl9NU0dfSUZET1dOKQorCisvKiBFbmhhbmNlZCBQSFkgYWNjZXNzIHJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFaG5NSUlyZWFkCQkweDAwMDAKKyNkZWZpbmUgRWhuTUlJd3JpdGUJCTB4MDAyMAorI2RlZmluZSBFaG5NSUlkYXRhU2hpZnQJCTE2CisjZGVmaW5lIEVobk1JSXBtZFNoaWZ0CQk2CS8qIDcwMTYgb25seSAqLworI2RlZmluZSBFaG5NSUlyZWdTaGlmdAkJMTEKKyNkZWZpbmUgRWhuTUlJcmVxCQkweDAwMTAKKyNkZWZpbmUgRWhuTUlJbm90RG9uZQkJMHgwMDEwCisKKy8qIFdyaXRlL3JlYWQgTU1JTyByZWdpc3RlciAqLworI2RlZmluZSBTSVNfVzgocmVnLCB2YWwpCXdyaXRlYiAoKHZhbCksIGlvYWRkciArIChyZWcpKQorI2RlZmluZSBTSVNfVzE2KHJlZywgdmFsKQl3cml0ZXcgKCh2YWwpLCBpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgU0lTX1czMihyZWcsIHZhbCkJd3JpdGVsICgodmFsKSwgaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFNJU19SOChyZWcpCQlyZWFkYiAoaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFNJU19SMTYocmVnKQkJcmVhZHcgKGlvYWRkciArIChyZWcpKQorI2RlZmluZSBTSVNfUjMyKHJlZykJCXJlYWRsIChpb2FkZHIgKyAocmVnKSkKKworI2RlZmluZSBTSVNfUENJX0NPTU1JVCgpCVNJU19SMzIoSW50ckNvbnRyb2wpCisKK2VudW0gc2lzMTkwX3JlZ2lzdGVycyB7CisJVHhDb250cm9sCQk9IDB4MDAsCisJVHhEZXNjU3RhcnRBZGRyCQk9IDB4MDQsCisJcnN2MAkJCT0gMHgwOCwJLy8gcmVzZXJ2ZWQKKwlUeFN0cwkJCT0gMHgwYywJLy8gdW51c2VkIChDb250cm9sL1N0YXR1cykKKwlSeENvbnRyb2wJCT0gMHgxMCwKKwlSeERlc2NTdGFydEFkZHIJCT0gMHgxNCwKKwlyc3YxCQkJPSAweDE4LAkvLyByZXNlcnZlZAorCVJ4U3RzCQkJPSAweDFjLAkvLyB1bnVzZWQKKwlJbnRyU3RhdHVzCQk9IDB4MjAsCisJSW50ck1hc2sJCT0gMHgyNCwKKwlJbnRyQ29udHJvbAkJPSAweDI4LAorCUludHJUaW1lcgkJPSAweDJjLAkvLyB1bnVzZWQgKEludGVydXB0IFRpbWVyKQorCVBNQ29udHJvbAkJPSAweDMwLAkvLyB1bnVzZWQgKFBvd2VyIE1nbXQgQ29udHJvbC9TdGF0dXMpCisJcnN2MgkJCT0gMHgzNCwJLy8gcmVzZXJ2ZWQKKwlST01Db250cm9sCQk9IDB4MzgsCisJUk9NSW50ZXJmYWNlCQk9IDB4M2MsCisJU3RhdGlvbkNvbnRyb2wJCT0gMHg0MCwKKwlHTUlJQ29udHJvbAkJPSAweDQ0LAorCUdJb0NSCQkJPSAweDQ4LCAvLyB1bnVzZWQgKEdNQUMgSU8gQ29tcGVuc2F0aW9uKQorCUdJb0N0cmwJCQk9IDB4NGMsIC8vIHVudXNlZCAoR01BQyBJTyBDb250cm9sKQorCVR4TWFjQ29udHJvbAkJPSAweDUwLAorCVR4TGltaXQJCQk9IDB4NTQsIC8vIHVudXNlZCAoVHggTUFDIFRpbWVyL1RyeUxpbWl0KQorCVJHRGVsYXkJCQk9IDB4NTgsIC8vIHVudXNlZCAoUkdNSUkgVHggSW50ZXJuYWwgRGVsYXkpCisJcnN2MwkJCT0gMHg1YywgLy8gcmVzZXJ2ZWQKKwlSeE1hY0NvbnRyb2wJCT0gMHg2MCwKKwlSeE1hY0FkZHIJCT0gMHg2MiwKKwlSeEhhc2hUYWJsZQkJPSAweDY4LAorCS8vIFVuZG9jdW1lbnRlZAkJPSAweDZjLAorCVJ4V29sQ3RybAkJPSAweDcwLAorCVJ4V29sRGF0YQkJPSAweDc0LCAvLyB1bnVzZWQgKFJ4IFdPTCBEYXRhIEFjY2VzcykKKwlSeE1QU0NvbnRyb2wJCT0gMHg3OCwJLy8gdW51c2VkIChSeCBNUFMgQ29udHJvbCkKKwlyc3Y0CQkJPSAweDdjLCAvLyByZXNlcnZlZAorfTsKKworZW51bSBzaXMxOTBfcmVnaXN0ZXJfY29udGVudCB7CisJLyogSW50clN0YXR1cyAqLworCVNvZnRJbnQJCQk9IDB4NDAwMDAwMDAsCS8vIHVudXNlZAorCVRpbWV1cAkJCT0gMHgyMDAwMDAwMCwJLy8gdW51c2VkCisJUGF1c2VGcmFtZQkJPSAweDAwMDgwMDAwLAkvLyB1bnVzZWQKKwlNYWdpY1BhY2tldAkJPSAweDAwMDQwMDAwLAkvLyB1bnVzZWQKKwlXYWtldXBGcmFtZQkJPSAweDAwMDIwMDAwLAkvLyB1bnVzZWQKKwlMaW5rQ2hhbmdlCQk9IDB4MDAwMTAwMDAsCisJUnhRRW1wdHkJCT0gMHgwMDAwMDA4MCwKKwlSeFFJbnQJCQk9IDB4MDAwMDAwNDAsCisJVHhRMUVtcHR5CQk9IDB4MDAwMDAwMjAsCS8vIHVudXNlZAorCVR4UTFJbnQJCQk9IDB4MDAwMDAwMTAsCisJVHhRMEVtcHR5CQk9IDB4MDAwMDAwMDgsCS8vIHVudXNlZAorCVR4UTBJbnQJCQk9IDB4MDAwMDAwMDQsCisJUnhIYWx0CQkJPSAweDAwMDAwMDAyLAorCVR4SGFsdAkJCT0gMHgwMDAwMDAwMSwKKworCS8qIHtSeC9UeH1DbWRCaXRzICovCisJQ21kUmVzZXQJCT0gMHgxMCwKKwlDbWRSeEVuYgkJPSAweDA4LAkJLy8gdW51c2VkCisJQ21kVHhFbmIJCT0gMHgwMSwKKwlSeEJ1ZkVtcHR5CQk9IDB4MDEsCQkvLyB1bnVzZWQKKworCS8qIENmZzkzNDZCaXRzICovCisJQ2ZnOTM0Nl9Mb2NrCQk9IDB4MDAsCQkvLyB1bnVzZWQKKwlDZmc5MzQ2X1VubG9jawkJPSAweGMwLAkJLy8gdW51c2VkCisKKwkvKiBSeE1hY0NvbnRyb2wgKi8KKwlBY2NlcHRFcnIJCT0gMHgyMCwJCS8vIHVudXNlZAorCUFjY2VwdFJ1bnQJCT0gMHgxMCwJCS8vIHVudXNlZAorCUFjY2VwdEJyb2FkY2FzdAkJPSAweDA4MDAsCisJQWNjZXB0TXVsdGljYXN0CQk9IDB4MDQwMCwKKwlBY2NlcHRNeVBoeXMJCT0gMHgwMjAwLAorCUFjY2VwdEFsbFBoeXMJCT0gMHgwMTAwLAorCisJLyogUnhDb25maWdCaXRzICovCisJUnhDZmdGSUZPU2hpZnQJCT0gMTMsCisJUnhDZmdETUFTaGlmdAkJPSA4LAkJLy8gMHgxYSBpbiBSeENvbnRyb2wgPworCisJLyogVHhDb25maWdCaXRzICovCisJVHhJbnRlckZyYW1lR2FwU2hpZnQJPSAyNCwKKwlUeERNQVNoaWZ0CQk9IDgsIC8qIERNQSBidXJzdCB2YWx1ZSAoMC03KSBpcyBzaGlmdCB0aGlzIG1hbnkgYml0cyAqLworCisJTGlua1N0YXR1cwkJPSAweDAyLAkJLy8gdW51c2VkCisJRnVsbER1cAkJCT0gMHgwMSwJCS8vIHVudXNlZAorCisJLyogVEJJQ1NSQml0ICovCisJVEJJTGlua09LCQk9IDB4MDIwMDAwMDAsCS8vIHVudXNlZAorfTsKKworc3RydWN0IFR4RGVzYyB7CisJX19sZTMyIFBTaXplOworCV9fbGUzMiBzdGF0dXM7CisJX19sZTMyIGFkZHI7CisJX19sZTMyIHNpemU7Cit9OworCitzdHJ1Y3QgUnhEZXNjIHsKKwlfX2xlMzIgUFNpemU7CisJX19sZTMyIHN0YXR1czsKKwlfX2xlMzIgYWRkcjsKKwlfX2xlMzIgc2l6ZTsKK307CisKK2VudW0gX0Rlc2NTdGF0dXNCaXQgeworCS8qIF9EZXNjLnN0YXR1cyAqLworCU9XTmJpdAkJPSAweDgwMDAwMDAwLCAvLyBSWE9XTi9UWE9XTgorCUlOVGJpdAkJPSAweDQwMDAwMDAwLCAvLyBSWElOVC9UWElOVAorCUNSQ2JpdAkJPSAweDAwMDIwMDAwLCAvLyBDUkNPRkYvQ1JDRU4KKwlQQURiaXQJCT0gMHgwMDAxMDAwMCwgLy8gUFJFQUREL1BBREVOCisJLyogX0Rlc2Muc2l6ZSAqLworCVJpbmdFbmQJCT0gMHg4MDAwMDAwMCwKKwkvKiBUeERlc2Muc3RhdHVzICovCisJTFNFTgkJPSAweDA4MDAwMDAwLCAvLyBUU08gPyAtLSBGUgorCUlQQ1MJCT0gMHgwNDAwMDAwMCwKKwlUQ1BDUwkJPSAweDAyMDAwMDAwLAorCVVEUENTCQk9IDB4MDEwMDAwMDAsCisJQlNURU4JCT0gMHgwMDgwMDAwMCwKKwlFWFRFTgkJPSAweDAwNDAwMDAwLAorCURFRkVOCQk9IDB4MDAyMDAwMDAsCisJQktGRU4JCT0gMHgwMDEwMDAwMCwKKwlDUlNFTgkJPSAweDAwMDgwMDAwLAorCUNPTEVOCQk9IDB4MDAwNDAwMDAsCisJVEhPTDMJCT0gMHgzMDAwMDAwMCwKKwlUSE9MMgkJPSAweDIwMDAwMDAwLAorCVRIT0wxCQk9IDB4MTAwMDAwMDAsCisJVEhPTDAJCT0gMHgwMDAwMDAwMCwKKwkvKiBSeERlc2Muc3RhdHVzICovCisJSVBPTgkJPSAweDIwMDAwMDAwLAorCVRDUE9OCQk9IDB4MTAwMDAwMDAsCisJVURQT04JCT0gMHgwODAwMDAwMCwKKwlXYWt1cAkJPSAweDAwNDAwMDAwLAorCU1hZ2ljCQk9IDB4MDAyMDAwMDAsCisJUGF1c2UJCT0gMHgwMDEwMDAwMCwKKwlERUZiaXQJCT0gMHgwMDIwMDAwMCwKKwlCQ0FTVAkJPSAweDAwMGMwMDAwLAorCU1DQVNUCQk9IDB4MDAwODAwMDAsCisJVUNBU1QJCT0gMHgwMDA0MDAwMCwKKwkvKiBSeERlc2MuUFNpemUgKi8KKwlUQUdPTgkJPSAweDgwMDAwMDAwLAorCVJ4RGVzY0NvdW50TWFzawk9IDB4N2YwMDAwMDAsIC8vIG11bHRpLWRlc2MgcGt0IHdoZW4gPiAxID8gLS0gRlIKKwlBQk9SVAkJPSAweDAwODAwMDAwLAorCVNIT1JUCQk9IDB4MDA0MDAwMDAsCisJTElNSVQJCT0gMHgwMDIwMDAwMCwKKwlNSUlFUgkJPSAweDAwMTAwMDAwLAorCU9WUlVOCQk9IDB4MDAwODAwMDAsCisJTklCT04JCT0gMHgwMDA0MDAwMCwKKwlDT0xPTgkJPSAweDAwMDIwMDAwLAorCUNSQ09LCQk9IDB4MDAwMTAwMDAsCisJUnhTaXplTWFzawk9IDB4MDAwMGZmZmYKKwkvKgorCSAqIFRoZSBhc2ljIGNvdWxkIGFwcGFyZW50bHkgZG8gdmxhbiwgVFNPLCBqdW1ibyAoc2lzMTkxIG9ubHkpIGFuZAorCSAqIHByb3ZpZGUgdHdvICh1bnVzZWQgd2l0aCBMaW51eCkgVHggcXVldWVzLiBObyBwdWJsaWNhbGx5CisJICogYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gYWxhcy4KKwkgKi8KK307CisKK2VudW0gc2lzMTkwX2VlcHJvbV9hY2Nlc3NfcmVnaXN0ZXJfYml0cyB7CisJRUVDUwk9IDB4MDAwMDAwMDEsCS8vIHVudXNlZAorCUVFQ0xLCT0gMHgwMDAwMDAwMiwJLy8gdW51c2VkCisJRUVETwk9IDB4MDAwMDAwMDgsCS8vIHVudXNlZAorCUVFREkJPSAweDAwMDAwMDA0LAkvLyB1bnVzZWQKKwlFRVJFUQk9IDB4MDAwMDAwODAsCisJRUVST1AJPSAweDAwMDAwMjAwLAorCUVFV09QCT0gMHgwMDAwMDEwMAkvLyB1bnVzZWQKK307CisKKy8qIEVFUFJPTSBBZGRyZXNzZXMgKi8KK2VudW0gc2lzMTkwX2VlcHJvbV9hZGRyZXNzIHsKKwlFRVBST01TaWduYXR1cmUJPSAweDAwLAorCUVFUFJPTUNMSwk9IDB4MDEsCS8vIHVudXNlZAorCUVFUFJPTUluZm8JPSAweDAyLAorCUVFUFJPTU1BQ0FkZHIJPSAweDAzCit9OworCitlbnVtIHNpczE5MF9mZWF0dXJlIHsKKwlGX0hBU19SR01JSQk9IDEsCisJRl9QSFlfODhFMTExMQk9IDIsCisJRl9QSFlfQkNNNTQ2MQk9IDQKK307CisKK3N0cnVjdCBzaXMxOTBfcHJpdmF0ZSB7CisJdm9pZCBfX2lvbWVtICptbWlvX2FkZHI7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3BpbmxvY2tfdCBsb2NrOworCXUzMiByeF9idWZfc3o7CisJdTMyIGN1cl9yeDsKKwl1MzIgY3VyX3R4OworCXUzMiBkaXJ0eV9yeDsKKwl1MzIgZGlydHlfdHg7CisJZG1hX2FkZHJfdCByeF9kbWE7CisJZG1hX2FkZHJfdCB0eF9kbWE7CisJc3RydWN0IFJ4RGVzYyAqUnhEZXNjUmluZzsKKwlzdHJ1Y3QgVHhEZXNjICpUeERlc2NSaW5nOworCXN0cnVjdCBza19idWZmICpSeF9za2J1ZmZbTlVNX1JYX0RFU0NdOworCXN0cnVjdCBza19idWZmICpUeF9za2J1ZmZbTlVNX1RYX0RFU0NdOworCXN0cnVjdCB3b3JrX3N0cnVjdCBwaHlfdGFzazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl1MzIgbXNnX2VuYWJsZTsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpX2lmOworCXN0cnVjdCBsaXN0X2hlYWQgZmlyc3RfcGh5OworCXUzMiBmZWF0dXJlczsKK307CisKK3N0cnVjdCBzaXMxOTBfcGh5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50IHBoeV9pZDsKKwl1MTYgaWRbMl07CisJdTE2IHN0YXR1czsKKwl1OCAgdHlwZTsKK307CisKK2VudW0gc2lzMTkwX3BoeV90eXBlIHsKKwlVTktOT1dOCT0gMHgwMCwKKwlIT01FCT0gMHgwMSwKKwlMQU4JPSAweDAyLAorCU1JWAk9IDB4MDMKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX2NoaXBfaW5mbyB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgIHUxNiBpZFsyXTsKKyAgICAgICAgdW5zaWduZWQgaW50IHR5cGU7CisJdTMyIGZlYXR1cmU7Cit9IG1paV9jaGlwX3RhYmxlW10gPSB7CisJeyAiQnJvYWRjb20gUEhZIEJDTTU0NjEiLCB7IDB4MDAyMCwgMHg2MGMwIH0sIExBTiwgRl9QSFlfQkNNNTQ2MSB9LAorCXsgIkFnZXJlIFBIWSBFVDExMDFCIiwgICAgeyAweDAyODIsIDB4ZjAxMCB9LCBMQU4sIDAgfSwKKwl7ICJNYXJ2ZWxsIFBIWSA4OEUxMTExIiwgIHsgMHgwMTQxLCAweDBjYzAgfSwgTEFOLCBGX1BIWV84OEUxMTExIH0sCisJeyAiUmVhbHRlayBQSFkgUlRMODIwMSIsICB7IDB4MDAwMCwgMHg4MjAwIH0sIExBTiwgMCB9LAorCXsgTlVMTCwgfQorfTsKKworY29uc3Qgc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKK30gc2lzX2NoaXBfaW5mb1tdID0geworCXsgIlNpUyAxOTAgUENJIEZhc3QgRXRoZXJuZXQgYWRhcHRlciIgfSwKKwl7ICJTaVMgMTkxIFBDSSBHaWdhYml0IEV0aGVybmV0IGFkYXB0ZXIiIH0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2lzMTkwX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NJLCAweDAxOTApLCAwLCAwLCAwIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIDB4MDE5MSksIDAsIDAsIDEgfSwKKwl7IDAsIH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2lzMTkwX3BjaV90YmwpOworCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDIwMDsKKworc3RhdGljIHN0cnVjdCB7CisJdTMyIG1zZ19lbmFibGU7Cit9IGRlYnVnID0geyAtMSB9OworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNpUyBzaXMxOTAgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIiKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2NvcHlicmVhaywgIkNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGRlYnVnLm1zZ19lbmFibGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgdmVyYm9zaXR5IGxldmVsICgwPW5vbmUsIC4uLiwgMTY9YWxsKSIpOworTU9EVUxFX0FVVEhPUigiSy5NLiBMaXUgPGttbGl1QHNpcy5jb20+LCBVZWltb3IgPHJvbWlldUBmci56b3JlaWwuY29tPiIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgY29uc3QgdTMyIHNpczE5MF9pbnRyX21hc2sgPQorCVJ4UUVtcHR5IHwgUnhRSW50IHwgVHhRMUludCB8IFR4UTBJbnQgfCBSeEhhbHQgfCBUeEhhbHQgfCBMaW5rQ2hhbmdlOworCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBmaWx0ZXIgKHZzLiBSeC1hbGwtbXVsdGljYXN0KS4KKyAqIFRoZSBjaGlwcyB1c2UgYSA2NCBlbGVtZW50IGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIEV0aGVybmV0IENSQy4KKyAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKK3N0YXRpYyB2b2lkIF9fbWRpb19jbWQodm9pZCBfX2lvbWVtICppb2FkZHIsIHUzMiBjdGwpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlTSVNfVzMyKEdNSUlDb250cm9sLCBjdGwpOworCisJbXNsZWVwKDEpOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmICghKFNJU19SMzIoR01JSUNvbnRyb2wpICYgRWhuTUlJbm90RG9uZSkpCisJCQlicmVhazsKKwkJbXNsZWVwKDEpOworCX0KKworCWlmIChpID4gOTk5KQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJQSFkgY29tbWFuZCBmYWlsZWQgIVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBwaHlfaWQsIGludCByZWcsIGludCB2YWwpCit7CisJX19tZGlvX2NtZChpb2FkZHIsIEVobk1JSXJlcSB8IEVobk1JSXdyaXRlIHwKKwkJKCgodTMyKSByZWcpIDw8IEVobk1JSXJlZ1NoaWZ0KSB8IChwaHlfaWQgPDwgRWhuTUlJcG1kU2hpZnQpIHwKKwkJKCgodTMyKSB2YWwpIDw8IEVobk1JSWRhdGFTaGlmdCkpOworfQorCitzdGF0aWMgaW50IG1kaW9fcmVhZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IHBoeV9pZCwgaW50IHJlZykKK3sKKwlfX21kaW9fY21kKGlvYWRkciwgRWhuTUlJcmVxIHwgRWhuTUlJcmVhZCB8CisJCSgoKHUzMikgcmVnKSA8PCBFaG5NSUlyZWdTaGlmdCkgfCAocGh5X2lkIDw8IEVobk1JSXBtZFNoaWZ0KSk7CisKKwlyZXR1cm4gKHUxNikgKFNJU19SMzIoR01JSUNvbnRyb2wpID4+IEVobk1JSWRhdGFTaGlmdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnLCBpbnQgdmFsKQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbWRpb193cml0ZSh0cC0+bW1pb19hZGRyLCBwaHlfaWQsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGludCBfX21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnKQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuIG1kaW9fcmVhZCh0cC0+bW1pb19hZGRyLCBwaHlfaWQsIHJlZyk7Cit9CisKK3N0YXRpYyB1MTYgbWRpb19yZWFkX2xhdGNoZWQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBwaHlfaWQsIGludCByZWcpCit7CisJbWRpb19yZWFkKGlvYWRkciwgcGh5X2lkLCByZWcpOworCXJldHVybiBtZGlvX3JlYWQoaW9hZGRyLCBwaHlfaWQsIHJlZyk7Cit9CisKK3N0YXRpYyB1MTYgX19kZXZpbml0IHNpczE5MF9yZWFkX2VlcHJvbSh2b2lkIF9faW9tZW0gKmlvYWRkciwgdTMyIHJlZykKK3sKKwl1MTYgZGF0YSA9IDB4ZmZmZjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghKFNJU19SMzIoUk9NQ29udHJvbCkgJiAweDAwMDIpKQorCQlyZXR1cm4gMDsKKworCVNJU19XMzIoUk9NSW50ZXJmYWNlLCBFRVJFUSB8IEVFUk9QIHwgKHJlZyA8PCAxMCkpOworCisJZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKSB7CisJCWlmICghKFNJU19SMzIoUk9NSW50ZXJmYWNlKSAmIEVFUkVRKSkgeworCQkJZGF0YSA9IChTSVNfUjMyKFJPTUludGVyZmFjZSkgJiAweGZmZmYwMDAwKSA+PiAxNjsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgxKTsKKwl9CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX2lycV9tYXNrX2FuZF9hY2sodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJU0lTX1czMihJbnRyTWFzaywgMHgwMCk7CisJU0lTX1czMihJbnRyU3RhdHVzLCAweGZmZmZmZmZmKTsKKwlTSVNfUENJX0NPTU1JVCgpOworfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfYXNpY19kb3duKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggRE1BIHByb2Nlc3Nlcy4gKi8KKworCVNJU19XMzIoVHhDb250cm9sLCAweDFhMDApOworCVNJU19XMzIoUnhDb250cm9sLCAweDFhMDApOworCisJc2lzMTkwX2lycV9tYXNrX2FuZF9hY2soaW9hZGRyKTsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX21hcmtfYXNfbGFzdF9kZXNjcmlwdG9yKHN0cnVjdCBSeERlc2MgKmRlc2MpCit7CisJZGVzYy0+c2l6ZSB8PSBjcHVfdG9fbGUzMihSaW5nRW5kKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNpczE5MF9naXZlX3RvX2FzaWMoc3RydWN0IFJ4RGVzYyAqZGVzYywgdTMyIHJ4X2J1Zl9zeikKK3sKKwl1MzIgZW9yID0gbGUzMl90b19jcHUoZGVzYy0+c2l6ZSkgJiBSaW5nRW5kOworCisJZGVzYy0+UFNpemUgPSAweDA7CisJZGVzYy0+c2l6ZSA9IGNwdV90b19sZTMyKChyeF9idWZfc3ogJiBSWF9CVUZfTUFTSykgfCBlb3IpOworCXdtYigpOworCWRlc2MtPnN0YXR1cyA9IGNwdV90b19sZTMyKE9XTmJpdCB8IElOVGJpdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaXMxOTBfbWFwX3RvX2FzaWMoc3RydWN0IFJ4RGVzYyAqZGVzYywgZG1hX2FkZHJfdCBtYXBwaW5nLAorCQkJCSAgICAgIHUzMiByeF9idWZfc3opCit7CisJZGVzYy0+YWRkciA9IGNwdV90b19sZTMyKG1hcHBpbmcpOworCXNpczE5MF9naXZlX3RvX2FzaWMoZGVzYywgcnhfYnVmX3N6KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNpczE5MF9tYWtlX3VudXNhYmxlX2J5X2FzaWMoc3RydWN0IFJ4RGVzYyAqZGVzYykKK3sKKwlkZXNjLT5QU2l6ZSA9IDB4MDsKKwlkZXNjLT5hZGRyID0gMHhkZWFkYmVlZjsKKwlkZXNjLT5zaXplICY9IGNwdV90b19sZTMyKFJpbmdFbmQpOworCXdtYigpOworCWRlc2MtPnN0YXR1cyA9IDB4MDsKK30KKworc3RhdGljIGludCBzaXMxOTBfYWxsb2Nfcnhfc2tiKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrX2J1ZmYsCisJCQkgICAgICAgc3RydWN0IFJ4RGVzYyAqZGVzYywgdTMyIHJ4X2J1Zl9zeikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwlpbnQgcmV0ID0gMDsKKworCXNrYiA9IGRldl9hbGxvY19za2IocnhfYnVmX3N6KTsKKwlpZiAoIXNrYikKKwkJZ290byBlcnJfb3V0OworCisJKnNrX2J1ZmYgPSBza2I7CisKKwltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocGRldiwgc2tiLT5kYXRhLCByeF9idWZfc3osCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwlzaXMxOTBfbWFwX3RvX2FzaWMoZGVzYywgbWFwcGluZywgcnhfYnVmX3N6KTsKK291dDoKKwlyZXR1cm4gcmV0OworCitlcnJfb3V0OgorCXJldCA9IC1FTk9NRU07CisJc2lzMTkwX21ha2VfdW51c2FibGVfYnlfYXNpYyhkZXNjKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHUzMiBzaXMxOTBfcnhfZmlsbChzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICB1MzIgc3RhcnQsIHUzMiBlbmQpCit7CisJdTMyIGN1cjsKKworCWZvciAoY3VyID0gc3RhcnQ7IGN1ciA8IGVuZDsgY3VyKyspIHsKKwkJaW50IHJldCwgaSA9IGN1ciAlIE5VTV9SWF9ERVNDOworCisJCWlmICh0cC0+Unhfc2tidWZmW2ldKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gc2lzMTkwX2FsbG9jX3J4X3NrYih0cC0+cGNpX2RldiwgdHAtPlJ4X3NrYnVmZiArIGksCisJCQkJCSAgdHAtPlJ4RGVzY1JpbmcgKyBpLCB0cC0+cnhfYnVmX3N6KTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGN1ciAtIHN0YXJ0OworfQorCitzdGF0aWMgaW5saW5lIGludCBzaXMxOTBfdHJ5X3J4X2NvcHkoc3RydWN0IHNrX2J1ZmYgKipza19idWZmLCBpbnQgcGt0X3NpemUsCisJCQkJICAgICBzdHJ1Y3QgUnhEZXNjICpkZXNjLCBpbnQgcnhfYnVmX3N6KQoreworCWludCByZXQgPSAtMTsKKworCWlmIChwa3Rfc2l6ZSA8IHJ4X2NvcHlicmVhaykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X3NpemUgKyBORVRfSVBfQUxJR04pOworCQlpZiAoc2tiKSB7CisJCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgc2tfYnVmZlswXS0+ZGF0YSwgcGt0X3NpemUsIDApOworCQkJKnNrX2J1ZmYgPSBza2I7CisJCQlzaXMxOTBfZ2l2ZV90b19hc2ljKGRlc2MsIHJ4X2J1Zl9zeik7CisJCQlyZXQgPSAwOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNpczE5MF9yeF9wa3RfZXJyKHUzMiBzdGF0dXMsIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cykKK3sKKyNkZWZpbmUgRXJyTWFzawkoT1ZSVU4gfCBTSE9SVCB8IExJTUlUIHwgTUlJRVIgfCBOSUJPTiB8IENPTE9OIHwgQUJPUlQpCisKKwlpZiAoKHN0YXR1cyAmIENSQ09LKSAmJiAhKHN0YXR1cyAmIEVyck1hc2spKQorCQlyZXR1cm4gMDsKKworCWlmICghKHN0YXR1cyAmIENSQ09LKSkKKwkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKKwllbHNlIGlmIChzdGF0dXMgJiBPVlJVTikKKwkJc3RhdHMtPnJ4X292ZXJfZXJyb3JzKys7CisJZWxzZSBpZiAoc3RhdHVzICYgKFNIT1JUIHwgTElNSVQpKQorCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCWVsc2UgaWYgKHN0YXR1cyAmIChNSUlFUiB8IE5JQk9OIHwgQ09MT04pKQorCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7CisKKwlzdGF0cy0+cnhfZXJyb3JzKys7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNpczE5MF9yeF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwLCB2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdHAtPnN0YXRzOworCXUzMiByeF9sZWZ0LCBjdXJfcnggPSB0cC0+Y3VyX3J4OworCXUzMiBkZWx0YSwgY291bnQ7CisKKwlyeF9sZWZ0ID0gTlVNX1JYX0RFU0MgKyB0cC0+ZGlydHlfcnggLSBjdXJfcng7CisJcnhfbGVmdCA9IHNpczE5MF9yeF9xdW90YShyeF9sZWZ0LCAodTMyKSBkZXYtPnF1b3RhKTsKKworCWZvciAoOyByeF9sZWZ0ID4gMDsgcnhfbGVmdC0tLCBjdXJfcngrKykgeworCQl1bnNpZ25lZCBpbnQgZW50cnkgPSBjdXJfcnggJSBOVU1fUlhfREVTQzsKKwkJc3RydWN0IFJ4RGVzYyAqZGVzYyA9IHRwLT5SeERlc2NSaW5nICsgZW50cnk7CisJCXUzMiBzdGF0dXM7CisKKwkJaWYgKGRlc2MtPnN0YXR1cyAmIE9XTmJpdCkKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9IGxlMzJfdG9fY3B1KGRlc2MtPlBTaXplKTsKKworCQkvLyBuZXRfaW50cih0cCwgS0VSTl9JTkZPICIlczogUnggUFNpemUgPSAlMDh4LlxuIiwgZGV2LT5uYW1lLAorCQkvLwkgc3RhdHVzKTsKKworCQlpZiAoc2lzMTkwX3J4X3BrdF9lcnIoc3RhdHVzLCBzdGF0cykgPCAwKQorCQkJc2lzMTkwX2dpdmVfdG9fYXNpYyhkZXNjLCB0cC0+cnhfYnVmX3N6KTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHAtPlJ4X3NrYnVmZltlbnRyeV07CisJCQlpbnQgcGt0X3NpemUgPSAoc3RhdHVzICYgUnhTaXplTWFzaykgLSA0OworCQkJdm9pZCAoKnBjaV9hY3Rpb24pKHN0cnVjdCBwY2lfZGV2ICosIGRtYV9hZGRyX3QsCisJCQkJc2l6ZV90LCBpbnQpID0gcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlOworCisJCQlpZiAodW5saWtlbHkocGt0X3NpemUgPiB0cC0+cnhfYnVmX3N6KSkgeworCQkJCW5ldF9pbnRyKHRwLCBLRVJOX0lORk8KKwkJCQkJICIlczogKGZyYWcpIHN0YXR1cyA9ICUwOHguXG4iLAorCQkJCQkgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQlzaXMxOTBfZ2l2ZV90b19hc2ljKGRlc2MsIHRwLT5yeF9idWZfc3opOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBjaV9kZXYsCisJCQkJbGUzMl90b19jcHUoZGVzYy0+YWRkciksIHRwLT5yeF9idWZfc3osCisJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJaWYgKHNpczE5MF90cnlfcnhfY29weSgmc2tiLCBwa3Rfc2l6ZSwgZGVzYywKKwkJCQkJICAgICAgIHRwLT5yeF9idWZfc3opKSB7CisJCQkJcGNpX2FjdGlvbiA9IHBjaV91bm1hcF9zaW5nbGU7CisJCQkJdHAtPlJ4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJCXNpczE5MF9tYWtlX3VudXNhYmxlX2J5X2FzaWMoZGVzYyk7CisJCQl9CisKKwkJCXBjaV9hY3Rpb24odHAtPnBjaV9kZXYsIGxlMzJfdG9fY3B1KGRlc2MtPmFkZHIpLAorCQkJCSAgIHRwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3B1dChza2IsIHBrdF9zaXplKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKwkJCXNpczE5MF9yeF9za2Ioc2tiKTsKKworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCQlzdGF0cy0+cnhfYnl0ZXMgKz0gcGt0X3NpemU7CisJCQlpZiAoKHN0YXR1cyAmIEJDQVNUKSA9PSBNQ0FTVCkKKwkJCQlzdGF0cy0+bXVsdGljYXN0Kys7CisJCX0KKwl9CisJY291bnQgPSBjdXJfcnggLSB0cC0+Y3VyX3J4OworCXRwLT5jdXJfcnggPSBjdXJfcng7CisKKwlkZWx0YSA9IHNpczE5MF9yeF9maWxsKHRwLCBkZXYsIHRwLT5kaXJ0eV9yeCwgdHAtPmN1cl9yeCk7CisJaWYgKCFkZWx0YSAmJiBjb3VudCAmJiBuZXRpZl9tc2dfaW50cih0cCkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBSeCBidWZmZXIgYWxsb2NhdGVkLlxuIiwgZGV2LT5uYW1lKTsKKwl0cC0+ZGlydHlfcnggKz0gZGVsdGE7CisKKwlpZiAoKCh0cC0+ZGlydHlfcnggKyBOVU1fUlhfREVTQykgPT0gdHAtPmN1cl9yeCkgJiYgbmV0aWZfbXNnX2ludHIodHApKQorCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IFJ4IGJ1ZmZlcnMgZXhoYXVzdGVkLlxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX3VubWFwX3R4X3NrYihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzdHJ1Y3QgVHhEZXNjICpkZXNjKQoreworCXVuc2lnbmVkIGludCBsZW47CisKKwlsZW4gPSBza2ItPmxlbiA8IEVUSF9aTEVOID8gRVRIX1pMRU4gOiBza2ItPmxlbjsKKworCXBjaV91bm1hcF9zaW5nbGUocGRldiwgbGUzMl90b19jcHUoZGVzYy0+YWRkciksIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwltZW1zZXQoZGVzYywgMHgwMCwgc2l6ZW9mKCpkZXNjKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF90eF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwLCB2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwl1MzIgcGVuZGluZywgZGlydHlfdHggPSB0cC0+ZGlydHlfdHg7CisJLyoKKwkgKiBJdCB3b3VsZCBub3QgYmUgbmVlZGVkIGlmIHF1ZXVlaW5nIHdhcyBhbGxvd2VkIHRvIGJlIGVuYWJsZWQKKwkgKiBhZ2FpbiB0b28gZWFybHkgKGhpbnQ6IHRoaW5rIHByZWVtcHQgYW5kIHVuY2xvY2tlZCBzbXAgc3lzdGVtcykuCisJICovCisJdW5zaWduZWQgaW50IHF1ZXVlX3N0b3BwZWQ7CisKKwlzbXBfcm1iKCk7CisJcGVuZGluZyA9IHRwLT5jdXJfdHggLSBkaXJ0eV90eDsKKwlxdWV1ZV9zdG9wcGVkID0gKHBlbmRpbmcgPT0gTlVNX1RYX0RFU0MpOworCisJZm9yICg7IHBlbmRpbmc7IHBlbmRpbmctLSwgZGlydHlfdHgrKykgeworCQl1bnNpZ25lZCBpbnQgZW50cnkgPSBkaXJ0eV90eCAlIE5VTV9UWF9ERVNDOworCQlzdHJ1Y3QgVHhEZXNjICp0eGQgPSB0cC0+VHhEZXNjUmluZyArIGVudHJ5OworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCWlmIChsZTMyX3RvX2NwdSh0eGQtPnN0YXR1cykgJiBPV05iaXQpCisJCQlicmVhazsKKworCQlza2IgPSB0cC0+VHhfc2tidWZmW2VudHJ5XTsKKworCQl0cC0+c3RhdHMudHhfcGFja2V0cysrOworCQl0cC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkJc2lzMTkwX3VubWFwX3R4X3NrYih0cC0+cGNpX2Rldiwgc2tiLCB0eGQpOworCQl0cC0+VHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJfQorCisJaWYgKHRwLT5kaXJ0eV90eCAhPSBkaXJ0eV90eCkgeworCQl0cC0+ZGlydHlfdHggPSBkaXJ0eV90eDsKKwkJc21wX3dtYigpOworCQlpZiAocXVldWVfc3RvcHBlZCkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9Cit9CisKKy8qCisgKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrIGFuZCBjbGVhbnMgdXAgYWZ0ZXIKKyAqIHRoZSBUeCB0aHJlYWQuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzaXMxOTBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKl9fZGV2LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gX19kZXY7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gU0lTX1IzMihJbnRyU3RhdHVzKTsKKworCWlmICgoc3RhdHVzID09IDB4ZmZmZmZmZmYpIHx8ICFzdGF0dXMpCisJCWdvdG8gb3V0OworCisJaGFuZGxlZCA9IDE7CisKKwlpZiAodW5saWtlbHkoIW5ldGlmX3J1bm5pbmcoZGV2KSkpIHsKKwkJc2lzMTkwX2FzaWNfZG93bihpb2FkZHIpOworCQlnb3RvIG91dDsKKwl9CisKKwlTSVNfVzMyKEludHJTdGF0dXMsIHN0YXR1cyk7CisKKwkvLyBuZXRfaW50cih0cCwgS0VSTl9JTkZPICIlczogc3RhdHVzID0gJTA4eC5cbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBMaW5rQ2hhbmdlKSB7CisJCW5ldF9pbnRyKHRwLCBLRVJOX0lORk8gIiVzOiBsaW5rIGNoYW5nZS5cbiIsIGRldi0+bmFtZSk7CisJCXNjaGVkdWxlX3dvcmsoJnRwLT5waHlfdGFzayk7CisJfQorCisJaWYgKHN0YXR1cyAmIFJ4UUludCkKKwkJc2lzMTkwX3J4X2ludGVycnVwdChkZXYsIHRwLCBpb2FkZHIpOworCisJaWYgKHN0YXR1cyAmIFR4UTBJbnQpCisJCXNpczE5MF90eF9pbnRlcnJ1cHQoZGV2LCB0cCwgaW9hZGRyKTsKK291dDoKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBzaXMxOTBfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBjaV9kZXY7CisKKwlkaXNhYmxlX2lycShwZGV2LT5pcnEpOworCXNpczE5MF9pbnRlcnJ1cHQocGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEocGRldi0+aXJxKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzaXMxOTBfZnJlZV9yeF9za2Ioc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnNrX2J1ZmYsIHN0cnVjdCBSeERlc2MgKmRlc2MpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGNpX2RldjsKKworCXBjaV91bm1hcF9zaW5nbGUocGRldiwgbGUzMl90b19jcHUoZGVzYy0+YWRkciksIHRwLT5yeF9idWZfc3osCisJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlkZXZfa2ZyZWVfc2tiKCpza19idWZmKTsKKwkqc2tfYnVmZiA9IE5VTEw7CisJc2lzMTkwX21ha2VfdW51c2FibGVfYnlfYXNpYyhkZXNjKTsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX3J4X2NsZWFyKHN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHApCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgeworCQlpZiAoIXRwLT5SeF9za2J1ZmZbaV0pCisJCQljb250aW51ZTsKKwkJc2lzMTkwX2ZyZWVfcnhfc2tiKHRwLCB0cC0+Unhfc2tidWZmICsgaSwgdHAtPlJ4RGVzY1JpbmcgKyBpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF9pbml0X3JpbmdfaW5kZXhlcyhzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwKQoreworCXRwLT5kaXJ0eV90eCA9IHRwLT5kaXJ0eV9yeCA9IHRwLT5jdXJfdHggPSB0cC0+Y3VyX3J4ID0gMDsKK30KKworc3RhdGljIGludCBzaXMxOTBfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzaXMxOTBfaW5pdF9yaW5nX2luZGV4ZXModHApOworCisJbWVtc2V0KHRwLT5UeF9za2J1ZmYsIDB4MCwgTlVNX1RYX0RFU0MgKiBzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKikpOworCW1lbXNldCh0cC0+Unhfc2tidWZmLCAweDAsIE5VTV9SWF9ERVNDICogc2l6ZW9mKHN0cnVjdCBza19idWZmICopKTsKKworCWlmIChzaXMxOTBfcnhfZmlsbCh0cCwgZGV2LCAwLCBOVU1fUlhfREVTQykgIT0gTlVNX1JYX0RFU0MpCisJCWdvdG8gZXJyX3J4X2NsZWFyOworCisJc2lzMTkwX21hcmtfYXNfbGFzdF9kZXNjcmlwdG9yKHRwLT5SeERlc2NSaW5nICsgTlVNX1JYX0RFU0MgLSAxKTsKKworCXJldHVybiAwOworCitlcnJfcnhfY2xlYXI6CisJc2lzMTkwX3J4X2NsZWFyKHRwKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIG1jX2ZpbHRlclsyXTsJLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisJdTE2IHJ4X21vZGU7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCW5ldF9kcnYodHAsIEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwKKwkJCWRldi0+bmFtZSk7CisJCXJ4X21vZGUgPQorCQkJQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzIHwKKwkJCUFjY2VwdEFsbFBoeXM7CisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpIHx8CisJCSAgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgcGVyZmVjdGx5IC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWludCBiaXRfbnIgPQorCQkJCWV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgPj4gMjY7CisJCQltY19maWx0ZXJbYml0X25yID4+IDVdIHw9IDEgPDwgKGJpdF9uciAmIDMxKTsKKwkJCXJ4X21vZGUgfD0gQWNjZXB0TXVsdGljYXN0OworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlTSVNfVzE2KFJ4TWFjQ29udHJvbCwgcnhfbW9kZSB8IDB4Mik7CisJU0lTX1czMihSeEhhc2hUYWJsZSwgbWNfZmlsdGVyWzBdKTsKKwlTSVNfVzMyKFJ4SGFzaFRhYmxlICsgNCwgbWNfZmlsdGVyWzFdKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF9zb2Z0X3Jlc2V0KHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCVNJU19XMzIoSW50ckNvbnRyb2wsIDB4ODAwMCk7CisJU0lTX1BDSV9DT01NSVQoKTsKKwltc2xlZXAoMSk7CisJU0lTX1czMihJbnRyQ29udHJvbCwgMHgwKTsKKwlzaXMxOTBfYXNpY19kb3duKGlvYWRkcik7CisJbXNsZWVwKDEpOworfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfaHdfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisKKwlzaXMxOTBfc29mdF9yZXNldChpb2FkZHIpOworCisJU0lTX1czMihUeERlc2NTdGFydEFkZHIsIHRwLT50eF9kbWEpOworCVNJU19XMzIoUnhEZXNjU3RhcnRBZGRyLCB0cC0+cnhfZG1hKTsKKworCVNJU19XMzIoSW50clN0YXR1cywgMHhmZmZmZmZmZik7CisJU0lTX1czMihJbnRyTWFzaywgMHgwKTsKKwlTSVNfVzMyKEdNSUlDb250cm9sLCAweDApOworCVNJU19XMzIoVHhNYWNDb250cm9sLCAweDYwKTsKKwlTSVNfVzE2KFJ4TWFjQ29udHJvbCwgMHgwMik7CisJU0lTX1czMihSeEhhc2hUYWJsZSwgMHgwKTsKKwlTSVNfVzMyKDB4NmMsIDB4MCk7CisJU0lTX1czMihSeFdvbEN0cmwsIDB4MCk7CisJU0lTX1czMihSeFdvbERhdGEsIDB4MCk7CisKKwlTSVNfUENJX0NPTU1JVCgpOworCisJc2lzMTkwX3NldF9yeF9tb2RlKGRldik7CisKKwkvKiBFbmFibGUgYWxsIGtub3duIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJU0lTX1czMihJbnRyTWFzaywgc2lzMTkwX2ludHJfbWFzayk7CisKKwlTSVNfVzMyKFR4Q29udHJvbCwgMHgxYTAwIHwgQ21kVHhFbmIpOworCVNJU19XMzIoUnhDb250cm9sLCAweDFhMWQpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX3BoeV90YXNrKHZvaWQgKiBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgcGh5X2lkID0gdHAtPm1paV9pZi5waHlfaWQ7CisJdTE2IHZhbDsKKworCXJ0bmxfbG9jaygpOworCisJdmFsID0gbWRpb19yZWFkKGlvYWRkciwgcGh5X2lkLCBNSUlfQk1DUik7CisJaWYgKHZhbCAmIEJNQ1JfUkVTRVQpIHsKKwkJLy8gRklYTUU6IG5lZWRsZXNzbHkgaGlnaCA/ICAtLSBGUiAwMi8wNy8yMDA1CisJCW1vZF90aW1lcigmdHAtPnRpbWVyLCBqaWZmaWVzICsgSFovMTApOworCX0gZWxzZSBpZiAoIShtZGlvX3JlYWRfbGF0Y2hlZChpb2FkZHIsIHBoeV9pZCwgTUlJX0JNU1IpICYKKwkJICAgICBCTVNSX0FORUdDT01QTEVURSkpIHsKKwkJbmV0X2xpbmsodHAsIEtFUk5fV0FSTklORyAiJXM6IFBIWSByZXNldCB1bnRpbCBsaW5rIHVwLlxuIiwKKwkJCSBkZXYtPm5hbWUpOworCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQltZGlvX3dyaXRlKGlvYWRkciwgcGh5X2lkLCBNSUlfQk1DUiwgdmFsIHwgQk1DUl9SRVNFVCk7CisJCW1vZF90aW1lcigmdHAtPnRpbWVyLCBqaWZmaWVzICsgU0lTMTkwX1BIWV9USU1FT1VUKTsKKwl9IGVsc2UgeworCQkvKiBSZWpvaWNlICEgKi8KKwkJc3RydWN0IHsKKwkJCWludCB2YWw7CisJCQl1MzIgY3RsOworCQkJY29uc3QgY2hhciAqbXNnOworCQl9IHJlZzMxW10gPSB7CisJCQl7IExQQV8xMDAwWEZVTEwgfCBMUEFfU0xDVCwgMHgwNzAwMGMwMCB8IDB4MDAwMDEwMDAsCisJCQkJIjEwMDAgTWJwcyBGdWxsIER1cGxleCIgfSwKKwkJCXsgTFBBXzEwMDBYSEFMRiB8IExQQV9TTENULCAweDA3MDAwYzAwLAorCQkJCSIxMDAwIE1icHMgSGFsZiBEdXBsZXgiIH0sCisJCQl7IExQQV8xMDBGVUxMLCAweDA0MDAwODAwIHwgMHgwMDAwMTAwMCwKKwkJCQkiMTAwIE1icHMgRnVsbCBEdXBsZXgiIH0sCisJCQl7IExQQV8xMDBIQUxGLCAweDA0MDAwODAwLAorCQkJCSIxMDAgTWJwcyBIYWxmIER1cGxleCIgfSwKKwkJCXsgTFBBXzEwRlVMTCwgMHgwNDAwMDQwMCB8IDB4MDAwMDEwMDAsCisJCQkJIjEwIE1icHMgRnVsbCBEdXBsZXgiIH0sCisJCQl7IExQQV8xMEhBTEYsIDB4MDQwMDA0MDAsCisJCQkJIjEwIE1icHMgSGFsZiBEdXBsZXgiIH0sCisJCQl7IDAsIDB4MDQwMDA0MDAsICJ1bmtub3duIiB9CisgCQl9LCAqcDsKKwkJdTE2IGFkdjsKKworCQl2YWwgPSBtZGlvX3JlYWQoaW9hZGRyLCBwaHlfaWQsIDB4MWYpOworCQluZXRfbGluayh0cCwgS0VSTl9JTkZPICIlczogbWlpIGV4dCA9ICUwNHguXG4iLCBkZXYtPm5hbWUsIHZhbCk7CisKKwkJdmFsID0gbWRpb19yZWFkKGlvYWRkciwgcGh5X2lkLCBNSUlfTFBBKTsKKwkJYWR2ID0gbWRpb19yZWFkKGlvYWRkciwgcGh5X2lkLCBNSUlfQURWRVJUSVNFKTsKKwkJbmV0X2xpbmsodHAsIEtFUk5fSU5GTyAiJXM6IG1paSBscGEgPSAlMDR4IGFkdiA9ICUwNHguXG4iLAorCQkJIGRldi0+bmFtZSwgdmFsLCBhZHYpOworCisJCXZhbCAmPSBhZHY7CisKKwkJZm9yIChwID0gcmVnMzE7IHAtPnZhbDsgcCsrKSB7CisJCQlpZiAoKHZhbCAmIHAtPnZhbCkgPT0gcC0+dmFsKQorCQkJCWJyZWFrOworCQl9CisKKwkJcC0+Y3RsIHw9IFNJU19SMzIoU3RhdGlvbkNvbnRyb2wpICYgfjB4MGYwMDFjMDA7CisKKwkJaWYgKCh0cC0+ZmVhdHVyZXMgJiBGX0hBU19SR01JSSkgJiYKKwkJICAgICh0cC0+ZmVhdHVyZXMgJiBGX1BIWV9CQ001NDYxKSkgeworCQkJLy8gU2V0IFR4IERlbGF5IGluIFJHTUlJIG1vZGUuCisJCQltZGlvX3dyaXRlKGlvYWRkciwgcGh5X2lkLCAweDE4LCAweGYxYzcpOworCQkJdWRlbGF5KDIwMCk7CisJCQltZGlvX3dyaXRlKGlvYWRkciwgcGh5X2lkLCAweDFjLCAweDhjMDApOworCQkJcC0+Y3RsIHw9IDB4MDMwMDAwMDA7CisJCX0KKworCQlTSVNfVzMyKFN0YXRpb25Db250cm9sLCBwLT5jdGwpOworCisJCWlmICh0cC0+ZmVhdHVyZXMgJiBGX0hBU19SR01JSSkgeworCQkJU0lTX1czMihSR0RlbGF5LCAweDA0NDEpOworCQkJU0lTX1czMihSR0RlbGF5LCAweDA0NDApOworCQl9CisKKwkJbmV0X2xpbmsodHAsIEtFUk5fSU5GTyAiJXM6IGxpbmsgb24gJXMgbW9kZS5cbiIsIGRldi0+bmFtZSwKKwkJCSBwLT5tc2cpOworCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJfQorCisJcnRubF91bmxvY2soKTsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX3BoeV90aW1lcih1bnNpZ25lZCBsb25nIF9fb3BhcXVlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilfX29wYXF1ZTsKKwlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChsaWtlbHkobmV0aWZfcnVubmluZyhkZXYpKSkKKwkJc2NoZWR1bGVfd29yaygmdHAtPnBoeV90YXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNpczE5MF9kZWxldGVfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWRlbF90aW1lcl9zeW5jKCZ0cC0+dGltZXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2lzMTkwX3JlcXVlc3RfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIgPSAmdHAtPnRpbWVyOworCisJaW5pdF90aW1lcih0aW1lcik7CisJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgU0lTMTkwX1BIWV9USU1FT1VUOworCXRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXRpbWVyLT5mdW5jdGlvbiA9IHNpczE5MF9waHlfdGltZXI7CisJYWRkX3RpbWVyKHRpbWVyKTsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX3NldF9yeGJ1ZnNpemUoc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCwKKwkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgbXR1ID0gZGV2LT5tdHU7CisKKwl0cC0+cnhfYnVmX3N6ID0gKG10dSA+IFJYX0JVRl9TSVpFKSA/IG10dSArIEVUSF9ITEVOICsgOCA6IFJYX0JVRl9TSVpFOworCS8qIFJ4RGVzYy0+c2l6ZSBoYXMgYSBsaWNlbmNlIHRvIGtpbGwgdGhlIGxvd2VyIGJpdHMgKi8KKwlpZiAodHAtPnJ4X2J1Zl9zeiAmIDB4MDcpIHsKKwkJdHAtPnJ4X2J1Zl9zeiArPSA4OworCQl0cC0+cnhfYnVmX3N6ICY9IFJYX0JVRl9NQVNLOworCX0KK30KKworc3RhdGljIGludCBzaXMxOTBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBjaV9kZXY7CisJaW50IHJjID0gLUVOT01FTTsKKworCXNpczE5MF9zZXRfcnhidWZzaXplKHRwLCBkZXYpOworCisJLyoKKwkgKiBSeCBhbmQgVHggZGVzY3JpcHRvcnMgbmVlZCAyNTYgYnl0ZXMgYWxpZ25tZW50LgorCSAqIHBjaV9hbGxvY19jb25zaXN0ZW50KCkgZ3VhcmFudGVlcyBhIHN0cm9uZ2VyIGFsaWdubWVudC4KKwkgKi8KKwl0cC0+VHhEZXNjUmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFRYX1JJTkdfQllURVMsICZ0cC0+dHhfZG1hKTsKKwlpZiAoIXRwLT5UeERlc2NSaW5nKQorCQlnb3RvIG91dDsKKworCXRwLT5SeERlc2NSaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUlhfUklOR19CWVRFUywgJnRwLT5yeF9kbWEpOworCWlmICghdHAtPlJ4RGVzY1JpbmcpCisJCWdvdG8gZXJyX2ZyZWVfdHhfMDsKKworCXJjID0gc2lzMTkwX2luaXRfcmluZyhkZXYpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyX2ZyZWVfcnhfMTsKKworCUlOSVRfV09SSygmdHAtPnBoeV90YXNrLCBzaXMxOTBfcGh5X3Rhc2ssIGRldik7CisKKwlzaXMxOTBfcmVxdWVzdF90aW1lcihkZXYpOworCisJcmMgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgc2lzMTkwX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycl9yZWxlYXNlX3RpbWVyXzI7CisKKwlzaXMxOTBfaHdfc3RhcnQoZGV2KTsKK291dDoKKwlyZXR1cm4gcmM7CisKK2Vycl9yZWxlYXNlX3RpbWVyXzI6CisJc2lzMTkwX2RlbGV0ZV90aW1lcihkZXYpOworCXNpczE5MF9yeF9jbGVhcih0cCk7CitlcnJfZnJlZV9yeF8xOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBjaV9kZXYsIFJYX1JJTkdfQllURVMsIHRwLT5SeERlc2NSaW5nLAorCQl0cC0+cnhfZG1hKTsKK2Vycl9mcmVlX3R4XzA6CisJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGNpX2RldiwgVFhfUklOR19CWVRFUywgdHAtPlR4RGVzY1JpbmcsCisJCXRwLT50eF9kbWEpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfdHhfY2xlYXIoc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSB0cC0+VHhfc2tidWZmW2ldOworCisJCWlmICghc2tiKQorCQkJY29udGludWU7CisKKwkJc2lzMTkwX3VubWFwX3R4X3NrYih0cC0+cGNpX2Rldiwgc2tiLCB0cC0+VHhEZXNjUmluZyArIGkpOworCQl0cC0+VHhfc2tidWZmW2ldID0gTlVMTDsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCisJCXRwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJfQorCXRwLT5jdXJfdHggPSB0cC0+ZGlydHlfdHggPSAwOworfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBpbnQgcG9sbF9sb2NrZWQgPSAwOworCisJc2lzMTkwX2RlbGV0ZV90aW1lcihkZXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWRvIHsKKwkJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCisJCXNpczE5MF9hc2ljX2Rvd24oaW9hZGRyKTsKKworCQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCQlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCisJCWlmICghcG9sbF9sb2NrZWQpIHsKKwkJCW5ldGlmX3BvbGxfZGlzYWJsZShkZXYpOworCQkJcG9sbF9sb2NrZWQrKzsKKwkJfQorCisJCXN5bmNocm9uaXplX3NjaGVkKCk7CisKKwl9IHdoaWxlIChTSVNfUjMyKEludHJNYXNrKSk7CisKKwlzaXMxOTBfdHhfY2xlYXIodHApOworCXNpczE5MF9yeF9jbGVhcih0cCk7Cit9CisKK3N0YXRpYyBpbnQgc2lzMTkwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGNpX2RldjsKKworCXNpczE5MF9kb3duKGRldik7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCW5ldGlmX3BvbGxfZW5hYmxlKGRldik7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1JJTkdfQllURVMsIHRwLT5UeERlc2NSaW5nLCB0cC0+dHhfZG1hKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFJYX1JJTkdfQllURVMsIHRwLT5SeERlc2NSaW5nLCB0cC0+cnhfZG1hKTsKKworCXRwLT5UeERlc2NSaW5nID0gTlVMTDsKKwl0cC0+UnhEZXNjUmluZyA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaXMxOTBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1MzIgbGVuLCBlbnRyeSwgZGlydHlfdHg7CisJc3RydWN0IFR4RGVzYyAqZGVzYzsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBFVEhfWkxFTikpIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoIXNrYikgeworCQkJdHAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWxlbiA9IEVUSF9aTEVOOworCX0gZWxzZSB7CisJCWxlbiA9IHNrYi0+bGVuOworCX0KKworCWVudHJ5ID0gdHAtPmN1cl90eCAlIE5VTV9UWF9ERVNDOworCWRlc2MgPSB0cC0+VHhEZXNjUmluZyArIGVudHJ5OworCisJaWYgKHVubGlrZWx5KGxlMzJfdG9fY3B1KGRlc2MtPnN0YXR1cykgJiBPV05iaXQpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJbmV0X3R4X2Vycih0cCwgS0VSTl9FUlIgUEZYCisJCQkgICAiJXM6IEJVRyEgVHggUmluZyBmdWxsIHdoZW4gcXVldWUgYXdha2UhXG4iLAorCQkJICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGNpX2Rldiwgc2tiLT5kYXRhLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJdHAtPlR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisKKwlkZXNjLT5QU2l6ZSA9IGNwdV90b19sZTMyKGxlbik7CisJZGVzYy0+YWRkciA9IGNwdV90b19sZTMyKG1hcHBpbmcpOworCisJZGVzYy0+c2l6ZSA9IGNwdV90b19sZTMyKGxlbik7CisJaWYgKGVudHJ5ID09IChOVU1fVFhfREVTQyAtIDEpKQorCQlkZXNjLT5zaXplIHw9IGNwdV90b19sZTMyKFJpbmdFbmQpOworCisJd21iKCk7CisKKwlkZXNjLT5zdGF0dXMgPSBjcHVfdG9fbGUzMihPV05iaXQgfCBJTlRiaXQgfCBERUZiaXQgfCBDUkNiaXQgfCBQQURiaXQpOworCisJdHAtPmN1cl90eCsrOworCisJc21wX3dtYigpOworCisJU0lTX1czMihUeENvbnRyb2wsIDB4MWEwMCB8IENtZFJlc2V0IHwgQ21kVHhFbmIpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlkaXJ0eV90eCA9IHRwLT5kaXJ0eV90eDsKKwlpZiAoKHRwLT5jdXJfdHggLSBOVU1fVFhfREVTQykgPT0gZGlydHlfdHgpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzbXBfcm1iKCk7CisJCWlmIChkaXJ0eV90eCAhPSB0cC0+ZGlydHlfdHgpCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorb3V0OgorCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2lzMTkwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZ0cC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF9mcmVlX3BoeShzdHJ1Y3QgbGlzdF9oZWFkICpmaXJzdF9waHkpCit7CisJc3RydWN0IHNpczE5MF9waHkgKmN1ciwgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3VyLCBuZXh0LCBmaXJzdF9waHksIGxpc3QpIHsKKwkJa2ZyZWUoY3VyKTsKKwl9Cit9CisKKy8qKgorICoJc2lzMTkwX2RlZmF1bHRfcGh5IC0gU2VsZWN0IGRlZmF1bHQgUEhZIGZvciBzaXMxOTAgbWFjLgorICoJQGRldjogdGhlIG5ldCBkZXZpY2UgdG8gcHJvYmUgZm9yCisgKgorICoJU2VsZWN0IGZpcnN0IGRldGVjdGVkIFBIWSB3aXRoIGxpbmsgYXMgZGVmYXVsdC4KKyAqCUlmIG5vIG9uZSBpcyBsaW5rIG9uLCBzZWxlY3QgUEhZIHdob3NlIHR5cGVzIGlzIEhPTUUgYXMgZGVmYXVsdC4KKyAqCUlmIEhPTUUgZG9lc24ndCBleGlzdCwgc2VsZWN0IExBTi4KKyAqLworc3RhdGljIHUxNiBzaXMxOTBfZGVmYXVsdF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2lzMTkwX3BoeSAqcGh5LCAqcGh5X2hvbWUsICpwaHlfZGVmYXVsdCwgKnBoeV9sYW47CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1paV9pZl9pbmZvICptaWlfaWYgPSAmdHAtPm1paV9pZjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTE2IHN0YXR1czsKKworCXBoeV9ob21lID0gcGh5X2RlZmF1bHQgPSBwaHlfbGFuID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocGh5LCAmdHAtPmZpcnN0X3BoeSwgbGlzdCkgeworCQlzdGF0dXMgPSBtZGlvX3JlYWRfbGF0Y2hlZChpb2FkZHIsIHBoeS0+cGh5X2lkLCBNSUlfQk1TUik7CisKKwkJLy8gTGluayBPTiAmIE5vdCBzZWxlY3QgZGVmYXVsdCBQSFkgJiBub3QgZ2hvc3QgUEhZLgorCQlpZiAoKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykgJiYKKwkJICAgICFwaHlfZGVmYXVsdCAmJgorCQkgICAgKHBoeS0+dHlwZSAhPSBVTktOT1dOKSkgeworCQkJcGh5X2RlZmF1bHQgPSBwaHk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBtZGlvX3JlYWQoaW9hZGRyLCBwaHktPnBoeV9pZCwgTUlJX0JNQ1IpOworCQkJbWRpb193cml0ZShpb2FkZHIsIHBoeS0+cGh5X2lkLCBNSUlfQk1DUiwKKwkJCQkgICBzdGF0dXMgfCBCTUNSX0FORU5BQkxFIHwgQk1DUl9JU09MQVRFKTsKKwkJCWlmIChwaHktPnR5cGUgPT0gSE9NRSkKKwkJCQlwaHlfaG9tZSA9IHBoeTsKKwkJCWVsc2UgaWYgKHBoeS0+dHlwZSA9PSBMQU4pCisJCQkJcGh5X2xhbiA9IHBoeTsKKwkJfQorCX0KKworCWlmICghcGh5X2RlZmF1bHQpIHsKKwkJaWYgKHBoeV9ob21lKQorCQkJcGh5X2RlZmF1bHQgPSBwaHlfaG9tZTsKKwkJZWxzZSBpZiAocGh5X2xhbikKKwkJCXBoeV9kZWZhdWx0ID0gcGh5X2xhbjsKKwkJZWxzZQorCQkJcGh5X2RlZmF1bHQgPSBsaXN0X2VudHJ5KCZ0cC0+Zmlyc3RfcGh5LAorCQkJCQkJIHN0cnVjdCBzaXMxOTBfcGh5LCBsaXN0KTsKKwl9CisKKwlpZiAobWlpX2lmLT5waHlfaWQgIT0gcGh5X2RlZmF1bHQtPnBoeV9pZCkgeworCQltaWlfaWYtPnBoeV9pZCA9IHBoeV9kZWZhdWx0LT5waHlfaWQ7CisJCW5ldF9wcm9iZSh0cCwgS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IFVzaW5nIHRyYW5zY2VpdmVyIGF0IGFkZHJlc3MgJWQgYXMgZGVmYXVsdC5cbiIsCisJCSAgICAgICBwY2lfbmFtZSh0cC0+cGNpX2RldiksIG1paV9pZi0+cGh5X2lkKTsKKwl9CisKKwlzdGF0dXMgPSBtZGlvX3JlYWQoaW9hZGRyLCBtaWlfaWYtPnBoeV9pZCwgTUlJX0JNQ1IpOworCXN0YXR1cyAmPSAofkJNQ1JfSVNPTEFURSk7CisKKwltZGlvX3dyaXRlKGlvYWRkciwgbWlpX2lmLT5waHlfaWQsIE1JSV9CTUNSLCBzdGF0dXMpOworCXN0YXR1cyA9IG1kaW9fcmVhZF9sYXRjaGVkKGlvYWRkciwgbWlpX2lmLT5waHlfaWQsIE1JSV9CTVNSKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF9pbml0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwLAorCQkJICAgIHN0cnVjdCBzaXMxOTBfcGh5ICpwaHksIHVuc2lnbmVkIGludCBwaHlfaWQsCisJCQkgICAgdTE2IG1paV9zdGF0dXMpCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXN0cnVjdCBtaWlfY2hpcF9pbmZvICpwOworCisJSU5JVF9MSVNUX0hFQUQoJnBoeS0+bGlzdCk7CisJcGh5LT5zdGF0dXMgPSBtaWlfc3RhdHVzOworCXBoeS0+cGh5X2lkID0gcGh5X2lkOworCisJcGh5LT5pZFswXSA9IG1kaW9fcmVhZChpb2FkZHIsIHBoeV9pZCwgTUlJX1BIWVNJRDEpOworCXBoeS0+aWRbMV0gPSBtZGlvX3JlYWQoaW9hZGRyLCBwaHlfaWQsIE1JSV9QSFlTSUQyKTsKKworCWZvciAocCA9IG1paV9jaGlwX3RhYmxlOyBwLT50eXBlOyBwKyspIHsKKwkJaWYgKChwLT5pZFswXSA9PSBwaHktPmlkWzBdKSAmJgorCQkgICAgKHAtPmlkWzFdID09IChwaHktPmlkWzFdICYgMHhmZmYwKSkpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHAtPmlkWzFdKSB7CisJCXBoeS0+dHlwZSA9IChwLT50eXBlID09IE1JWCkgPworCQkJKChtaWlfc3RhdHVzICYgKEJNU1JfMTAwRlVMTCB8IEJNU1JfMTAwSEFMRikpID8KKwkJCQlMQU4gOiBIT01FKSA6IHAtPnR5cGU7CisJCXRwLT5mZWF0dXJlcyB8PSBwLT5mZWF0dXJlOworCX0gZWxzZQorCQlwaHktPnR5cGUgPSBVTktOT1dOOworCisJbmV0X3Byb2JlKHRwLCBLRVJOX0lORk8gIiVzOiAlcyB0cmFuc2NlaXZlciBhdCBhZGRyZXNzICVkLlxuIiwKKwkJICBwY2lfbmFtZSh0cC0+cGNpX2RldiksCisJCSAgKHBoeS0+dHlwZSA9PSBVTktOT1dOKSA/ICJVbmtub3duIFBIWSIgOiBwLT5uYW1lLCBwaHlfaWQpOworfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfbWlpX3Byb2JlXzg4ZTExMTFfZml4dXAoc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCkKK3sKKwlpZiAodHAtPmZlYXR1cmVzICYgRl9QSFlfODhFMTExMSkgeworCQl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJCWludCBwaHlfaWQgPSB0cC0+bWlpX2lmLnBoeV9pZDsKKwkJdTE2IHJlZ1syXVsyXSA9IHsKKwkJCXsgMHg4MDhiLCAweDBjZTEgfSwKKwkJCXsgMHg4MDhmLCAweDBjNjAgfQorCQl9LCAqcDsKKworCQlwID0gKHRwLT5mZWF0dXJlcyAmIEZfSEFTX1JHTUlJKSA/IHJlZ1swXSA6IHJlZ1sxXTsKKworCQltZGlvX3dyaXRlKGlvYWRkciwgcGh5X2lkLCAweDFiLCBwWzBdKTsKKwkJdWRlbGF5KDIwMCk7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCBwaHlfaWQsIDB4MTQsIHBbMV0pOworCQl1ZGVsYXkoMjAwKTsKKwl9Cit9CisKKy8qKgorICoJc2lzMTkwX21paV9wcm9iZSAtIFByb2JlIE1JSSBQSFkgZm9yIHNpczE5MAorICoJQGRldjogdGhlIG5ldCBkZXZpY2UgdG8gcHJvYmUgZm9yCisgKgorICoJU2VhcmNoIGZvciB0b3RhbCBvZiAzMiBwb3NzaWJsZSBtaWkgcGh5IGFkZHJlc3Nlcy4KKyAqCUlkZW50aWZ5IGFuZCBzZXQgY3VycmVudCBwaHkgaWYgZm91bmQgb25lLAorICoJcmV0dXJuIGVycm9yIGlmIGl0IGZhaWxlZCB0byBmb3VuZC4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc2lzMTkwX21paV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpX2lmID0gJnRwLT5taWlfaWY7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWludCBwaHlfaWQ7CisJaW50IHJjID0gMDsKKworCUlOSVRfTElTVF9IRUFEKCZ0cC0+Zmlyc3RfcGh5KTsKKworCWZvciAocGh5X2lkID0gMDsgcGh5X2lkIDwgUEhZX01BWF9BRERSOyBwaHlfaWQrKykgeworCQlzdHJ1Y3Qgc2lzMTkwX3BoeSAqcGh5OworCQl1MTYgc3RhdHVzOworCisJCXN0YXR1cyA9IG1kaW9fcmVhZF9sYXRjaGVkKGlvYWRkciwgcGh5X2lkLCBNSUlfQk1TUik7CisKKwkJLy8gVHJ5IG5leHQgbWlpIGlmIHRoZSBjdXJyZW50IG9uZSBpcyBub3QgYWNjZXNzaWJsZS4KKwkJaWYgKHN0YXR1cyA9PSAweGZmZmYgfHwgc3RhdHVzID09IDB4MDAwMCkKKwkJCWNvbnRpbnVlOworCisJCXBoeSA9IGttYWxsb2Moc2l6ZW9mKCpwaHkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwaHkpIHsKKwkJCXNpczE5MF9mcmVlX3BoeSgmdHAtPmZpcnN0X3BoeSk7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXNpczE5MF9pbml0X3BoeShkZXYsIHRwLCBwaHksIHBoeV9pZCwgc3RhdHVzKTsKKworCQlsaXN0X2FkZCgmdHAtPmZpcnN0X3BoeSwgJnBoeS0+bGlzdCk7CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJnRwLT5maXJzdF9waHkpKSB7CisJCW5ldF9wcm9iZSh0cCwgS0VSTl9JTkZPICIlczogTm8gTUlJIHRyYW5zY2VpdmVycyBmb3VuZCFcbiIsCisJCQkgIHBjaV9uYW1lKHRwLT5wY2lfZGV2KSk7CisJCXJjID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU2VsZWN0IGRlZmF1bHQgUEhZIGZvciBtYWMgKi8KKwlzaXMxOTBfZGVmYXVsdF9waHkoZGV2KTsKKworCXNpczE5MF9taWlfcHJvYmVfODhlMTExMV9maXh1cCh0cCk7CisKKwltaWlfaWYtPmRldiA9IGRldjsKKwltaWlfaWYtPm1kaW9fcmVhZCA9IF9fbWRpb19yZWFkOworCW1paV9pZi0+bWRpb193cml0ZSA9IF9fbWRpb193cml0ZTsKKwltaWlfaWYtPnBoeV9pZF9tYXNrID0gUEhZX0lEX0FOWTsKKwltaWlfaWYtPnJlZ19udW1fbWFzayA9IE1JSV9SRUdfQU5ZOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNpczE5MF9taWlfcmVtb3ZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzaXMxOTBfZnJlZV9waHkoJnRwLT5maXJzdF9waHkpOworfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfcmVsZWFzZV9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaW91bm1hcCh0cC0+bW1pb19hZGRyKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKiBfX2RldmluaXQgc2lzMTkwX2luaXRfYm9hcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWludCByYzsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqdHApKTsKKwlpZiAoIWRldikgeworCQluZXRfZHJ2KCZkZWJ1ZywgS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2MgbmV3IGV0aGVybmV0XG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfMDsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl0cC0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KGRlYnVnLm1zZ19lbmFibGUsIFNJUzE5MF9NU0dfREVGQVVMVCk7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYyA8IDApIHsKKwkJbmV0X3Byb2JlKHRwLCBLRVJOX0VSUiAiJXM6IGVuYWJsZSBmYWlsdXJlXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyX2ZyZWVfZGV2XzE7CisJfQorCisJcmMgPSAtRU5PREVWOworCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCW5ldF9wcm9iZSh0cCwgS0VSTl9FUlIgIiVzOiByZWdpb24gIzAgaXMgbm8gTU1JTyByZXNvdXJjZS5cbiIsCisJCQkgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfcGNpX2Rpc2FibGVfMjsKKwl9CisJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPCBTSVMxOTBfUkVHU19TSVpFKSB7CisJCW5ldF9wcm9iZSh0cCwgS0VSTl9FUlIgIiVzOiBpbnZhbGlkIFBDSSByZWdpb24gc2l6ZShzKS5cbiIsCisJCQkgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfcGNpX2Rpc2FibGVfMjsKKwl9CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyYyA8IDApIHsKKwkJbmV0X3Byb2JlKHRwLCBLRVJOX0VSUiBQRlggIiVzOiBjb3VsZCBub3QgcmVxdWVzdCByZWdpb25zLlxuIiwKKwkJCSAgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9wY2lfZGlzYWJsZV8yOworCX0KKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJaWYgKHJjIDwgMCkgeworCQluZXRfcHJvYmUodHAsIEtFUk5fRVJSICIlczogRE1BIGNvbmZpZ3VyYXRpb24gZmFpbGVkLlxuIiwKKwkJCSAgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9mcmVlX3Jlc18zOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJaW9hZGRyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksIFNJUzE5MF9SRUdTX1NJWkUpOworCWlmICghaW9hZGRyKSB7CisJCW5ldF9wcm9iZSh0cCwgS0VSTl9FUlIgIiVzOiBjYW5ub3QgcmVtYXAgTU1JTywgYWJvcnRpbmdcbiIsCisJCQkgIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9mcmVlX3Jlc18zOworCX0KKworCXRwLT5wY2lfZGV2ID0gcGRldjsKKwl0cC0+bW1pb19hZGRyID0gaW9hZGRyOworCisJc2lzMTkwX2lycV9tYXNrX2FuZF9hY2soaW9hZGRyKTsKKworCXNpczE5MF9zb2Z0X3Jlc2V0KGlvYWRkcik7CitvdXQ6CisJcmV0dXJuIGRldjsKKworZXJyX2ZyZWVfcmVzXzM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9wY2lfZGlzYWJsZV8yOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9mcmVlX2Rldl8xOgorCWZyZWVfbmV0ZGV2KGRldik7CitlcnJfb3V0XzA6CisJZGV2ID0gRVJSX1BUUihyYyk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXU4IHRtcDg7CisKKwkvKiBEaXNhYmxlIFR4LCBpZiBub3QgYWxyZWFkeSAqLworCXRtcDggPSBTSVNfUjgoVHhDb250cm9sKTsKKwlpZiAodG1wOCAmIENtZFR4RW5iKQorCQlTSVNfVzgoVHhDb250cm9sLCB0bXA4ICYgfkNtZFR4RW5iKTsKKworCisJbmV0X3R4X2Vycih0cCwgS0VSTl9JTkZPICIlczogVHJhbnNtaXQgdGltZW91dCwgc3RhdHVzICUwOHggJTA4eC5cbiIsCisJCSAgIGRldi0+bmFtZSwgU0lTX1IzMihUeENvbnRyb2wpLCBTSVNfUjMyKFR4U3RzKSk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCVNJU19XMzIoSW50ck1hc2ssIDB4MDAwMCk7CisKKwkvKiBTdG9wIGEgc2hhcmVkIGludGVycnVwdCBmcm9tIHNjYXZlbmdpbmcgd2hpbGUgd2UgYXJlLiAqLworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzaXMxOTBfdHhfY2xlYXIodHApOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJLyogLi4uYW5kIGZpbmFsbHksIHJlc2V0IGV2ZXJ5dGhpbmcuICovCisJc2lzMTkwX2h3X3N0YXJ0KGRldik7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF9zZXRfcmdtaWkoc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCwgdTggcmVnKQoreworCXRwLT5mZWF0dXJlcyB8PSAocmVnICYgMHg4MCkgPyBGX0hBU19SR01JSSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpczE5MF9nZXRfbWFjX2FkZHJfZnJvbV9lZXByb20oc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXUxNiBzaWc7CisJaW50IGk7CisKKwluZXRfcHJvYmUodHAsIEtFUk5fSU5GTyAiJXM6IFJlYWQgTUFDIGFkZHJlc3MgZnJvbSBFRVBST01cbiIsCisJCSAgcGNpX25hbWUocGRldikpOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgc2FuZSBFRVBST00gKi8KKwlzaWcgPSAodTE2KSBzaXMxOTBfcmVhZF9lZXByb20oaW9hZGRyLCBFRVBST01TaWduYXR1cmUpOworCisJaWYgKChzaWcgPT0gMHhmZmZmKSB8fCAoc2lnID09IDB4MDAwMCkpIHsKKwkJbmV0X3Byb2JlKHRwLCBLRVJOX0lORk8gIiVzOiBFcnJvciBFRVBST00gcmVhZCAleC5cbiIsCisJCQkgIHBjaV9uYW1lKHBkZXYpLCBzaWcpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBHZXQgTUFDIGFkZHJlc3MgZnJvbSBFRVBST00gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFDX0FERFJfTEVOIC8gMjsgaSsrKSB7CisJCV9fbGUxNiB3ID0gc2lzMTkwX3JlYWRfZWVwcm9tKGlvYWRkciwgRUVQUk9NTUFDQWRkciArIGkpOworCisJCSgodTE2ICopZGV2LT5kZXZfYWRkcilbMF0gPSBsZTE2X3RvX2NwdSh3KTsKKwl9CisKKwlzaXMxOTBfc2V0X3JnbWlpKHRwLCBzaXMxOTBfcmVhZF9lZXByb20oaW9hZGRyLCBFRVBST01JbmZvKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzaXMxOTBfZ2V0X21hY19hZGRyX2Zyb21fYXBjIC0gR2V0IE1BQyBhZGRyZXNzIGZvciBTaVM5NjUgbW9kZWwKKyAqCUBwZGV2OiBQQ0kgZGV2aWNlCisgKglAZGV2OiAgbmV0d29yayBkZXZpY2UgdG8gZ2V0IGFkZHJlc3MgZm9yCisgKgorICoJU2lTOTY1IG1vZGVsLCB1c2UgQVBDIENNT1MgUkFNIHRvIHN0b3JlIE1BQyBhZGRyZXNzLgorICoJQVBDIENNT1MgUkFNIGlzIGFjY2Vzc2VkIHRocm91Z2ggSVNBIGJyaWRnZS4KKyAqCU1BQyBhZGRyZXNzIGlzIHJlYWQgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpczE5MF9nZXRfbWFjX2FkZHJfZnJvbV9hcGMoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKmlzYV9icmlkZ2U7CisJdTggcmVnLCB0bXA4OworCWludCBpOworCisJbmV0X3Byb2JlKHRwLCBLRVJOX0lORk8gIiVzOiBSZWFkIE1BQyBhZGRyZXNzIGZyb20gQVBDLlxuIiwKKwkJICBwY2lfbmFtZShwZGV2KSk7CisKKwlpc2FfYnJpZGdlID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TSSwgMHgwOTY1LCBOVUxMKTsKKwlpZiAoIWlzYV9icmlkZ2UpIHsKKwkJbmV0X3Byb2JlKHRwLCBLRVJOX0lORk8gIiVzOiBDYW4gbm90IGZpbmQgSVNBIGJyaWRnZS5cbiIsCisJCQkgIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogRW5hYmxlIHBvcnQgNzhoICYgNzloIHRvIGFjY2VzcyBBUEMgUmVnaXN0ZXJzLiAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGlzYV9icmlkZ2UsIDB4NDgsICZ0bXA4KTsKKwlyZWcgPSAodG1wOCAmIH4weDAyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg0OCwgcmVnKTsKKwl1ZGVsYXkoNTApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGlzYV9icmlkZ2UsIDB4NDgsICZyZWcpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQUNfQUREUl9MRU47IGkrKykgeworICAgICAgICAgICAgICAgIG91dGIoMHg5ICsgaSwgMHg3OCk7CisgICAgICAgICAgICAgICAgZGV2LT5kZXZfYWRkcltpXSA9IGluYigweDc5KTsKKyAgICAgICAgfQorCisJb3V0YigweDEyLCAweDc4KTsKKwlyZWcgPSBpbmIoMHg3OSk7CisKKwlzaXMxOTBfc2V0X3JnbWlpKHRwLCByZWcpOworCisJLyogUmVzdG9yZSB0aGUgdmFsdWUgdG8gSVNBIEJyaWRnZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDQ4LCB0bXA4KTsKKwlwY2lfZGV2X3B1dChpc2FfYnJpZGdlKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICAgICAgc2lzMTkwX2luaXRfcnhmaWx0ZXIgLSBJbml0aWFsaXplIHRoZSBSeCBmaWx0ZXIKKyAqICAgICAgQGRldjogbmV0d29yayBkZXZpY2UgdG8gaW5pdGlhbGl6ZQorICoKKyAqICAgICAgU2V0IHJlY2VpdmUgZmlsdGVyIGFkZHJlc3MgdG8gb3VyIE1BQyBhZGRyZXNzCisgKiAgICAgIGFuZCBlbmFibGUgcGFja2V0IGZpbHRlcmluZy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNpczE5MF9pbml0X3J4ZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXUxNiBjdGw7CisJaW50IGk7CisKKwljdGwgPSBTSVNfUjE2KFJ4TWFjQ29udHJvbCk7CisJLyoKKwkgKiBEaXNhYmxlIHBhY2tldCBmaWx0ZXJpbmcgYmVmb3JlIHNldHRpbmcgZmlsdGVyLgorCSAqIE5vdGU6IFNpUydzIGRyaXZlciB3cml0ZXMgMzIgYml0cyBidXQgUnhNYWNDb250cm9sIGlzIDE2IGJpdHMKKwkgKiBvbmx5IGFuZCBmb2xsb3dlZCBieSBSeE1hY0FkZHIgKDYgYnl0ZXMpLiBTdHJhbmdlLiAtLSBGUgorCSAqLworCVNJU19XMTYoUnhNYWNDb250cm9sLCBjdGwgJiB+MHgwZjAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQUNfQUREUl9MRU47IGkrKykKKwkJU0lTX1c4KFJ4TWFjQWRkciArIGksIGRldi0+ZGV2X2FkZHJbaV0pOworCisJU0lTX1cxNihSeE1hY0NvbnRyb2wsIGN0bCk7CisJU0lTX1BDSV9DT01NSVQoKTsKK30KKworc3RhdGljIGludCBzaXMxOTBfZ2V0X21hY19hZGRyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IGZyb207CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDczLCAmZnJvbSk7CisKKwlyZXR1cm4gKGZyb20gJiAweDAwMDAwMDAxKSA/CisJCXNpczE5MF9nZXRfbWFjX2FkZHJfZnJvbV9hcGMocGRldiwgZGV2KSA6CisJCXNpczE5MF9nZXRfbWFjX2FkZHJfZnJvbV9lZXByb20ocGRldiwgZGV2KTsKK30KKworc3RhdGljIHZvaWQgc2lzMTkwX3NldF9zcGVlZF9hdXRvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWludCBwaHlfaWQgPSB0cC0+bWlpX2lmLnBoeV9pZDsKKwlpbnQgdmFsOworCisJbmV0X2xpbmsodHAsIEtFUk5fSU5GTyAiJXM6IEVuYWJsaW5nIEF1dG8tbmVnb3RpYXRpb24uXG4iLCBkZXYtPm5hbWUpOworCisJdmFsID0gbWRpb19yZWFkKGlvYWRkciwgcGh5X2lkLCBNSUlfQURWRVJUSVNFKTsKKworCS8vIEVuYWJsZSAxMC8xMDAgRnVsbC9IYWxmIE1vZGUsIGxlYXZlIE1JSV9BRFZFUlRJU0UgYml0NDowCisJLy8gdW5jaGFuZ2VkLgorCW1kaW9fd3JpdGUoaW9hZGRyLCBwaHlfaWQsIE1JSV9BRFZFUlRJU0UsICh2YWwgJiBBRFZFUlRJU0VfU0xDVCkgfAorCQkgICBBRFZFUlRJU0VfMTAwRlVMTCB8IEFEVkVSVElTRV8xMEZVTEwgfAorCQkgICBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMEhBTEYpOworCisJLy8gRW5hYmxlIDEwMDAgRnVsbCBNb2RlLgorCW1kaW9fd3JpdGUoaW9hZGRyLCBwaHlfaWQsIE1JSV9DVFJMMTAwMCwgQURWRVJUSVNFXzEwMDBGVUxMKTsKKworCS8vIEVuYWJsZSBhdXRvLW5lZ290aWF0aW9uIGFuZCByZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24uCisJbWRpb193cml0ZShpb2FkZHIsIHBoeV9pZCwgTUlJX0JNQ1IsCisJCSAgIEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCB8IEJNQ1JfUkVTRVQpOworfQorCitzdGF0aWMgaW50IHNpczE5MF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gbWlpX2V0aHRvb2xfZ3NldCgmdHAtPm1paV9pZiwgY21kKTsKK30KKworc3RhdGljIGludCBzaXMxOTBfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuIG1paV9ldGh0b29sX3NzZXQoJnRwLT5taWlfaWYsIGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpczE5MF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHRwLT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgc2lzMTkwX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBTSVMxOTBfUkVHU19TSVpFOworfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywKKwkJCSAgICB2b2lkICpwKQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocmVncy0+bGVuID4gU0lTMTkwX1JFR1NfU0laRSkKKwkJcmVncy0+bGVuID0gU0lTMTkwX1JFR1NfU0laRTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCW1lbWNweV9mcm9taW8ocCwgdHAtPm1taW9fYWRkciwgcmVncy0+bGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHNpczE5MF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmdHAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgc2lzMTkwX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuIHRwLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCBzaXMxOTBfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXRwLT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc2lzMTkwX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MJPSBzaXMxOTBfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJPSBzaXMxOTBfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwk9IHNpczE5MF9nZXRfZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuCT0gc2lzMTkwX2dldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MJPSBzaXMxOTBfZ2V0X3JlZ3MsCisJLmdldF9saW5rCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsCT0gc2lzMTkwX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCT0gc2lzMTkwX3NldF9tc2dsZXZlbCwKKwkubndheV9yZXNldAk9IHNpczE5MF9ud2F5X3Jlc2V0LAorfTsKKworc3RhdGljIGludCBzaXMxOTBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IHNpczE5MF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gIW5ldGlmX3J1bm5pbmcoZGV2KSA/IC1FSU5WQUwgOgorCQlnZW5lcmljX21paV9pb2N0bCgmdHAtPm1paV9pZiwgaWZfbWlpKGlmciksIGNtZCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpczE5MF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb24gPSAwOworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgcmM7CisKKwlpZiAoIXByaW50ZWRfdmVyc2lvbikgeworCQluZXRfZHJ2KCZkZWJ1ZywgS0VSTl9JTkZPIFNJUzE5MF9EUklWRVJfTkFNRSAiIGxvYWRlZC5cbiIpOworCQlwcmludGVkX3ZlcnNpb24gPSAxOworCX0KKworCWRldiA9IHNpczE5MF9pbml0X2JvYXJkKHBkZXYpOworCWlmIChJU19FUlIoZGV2KSkgeworCQlyYyA9IFBUUl9FUlIoZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisKKwlyYyA9IHNpczE5MF9nZXRfbWFjX2FkZHIocGRldiwgZGV2KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycl9yZWxlYXNlX2JvYXJkOworCisJc2lzMTkwX2luaXRfcnhmaWx0ZXIoZGV2KTsKKworCUlOSVRfV09SSygmdHAtPnBoeV90YXNrLCBzaXMxOTBfcGh5X3Rhc2ssIGRldik7CisKKwlkZXYtPm9wZW4gPSBzaXMxOTBfb3BlbjsKKwlkZXYtPnN0b3AgPSBzaXMxOTBfY2xvc2U7CisJZGV2LT5kb19pb2N0bCA9IHNpczE5MF9pb2N0bDsKKwlkZXYtPmdldF9zdGF0cyA9IHNpczE5MF9nZXRfc3RhdHM7CisJZGV2LT50eF90aW1lb3V0ID0gc2lzMTkwX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFNJUzE5MF9UWF9USU1FT1VUOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gc2lzMTkwX3N0YXJ0X3htaXQ7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IHNpczE5MF9uZXRwb2xsOworI2VuZGlmCisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzaXMxOTBfc2V0X3J4X21vZGU7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJnNpczE5MF9ldGh0b29sX29wcyk7CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykgMHhkZWFkOworCisJc3Bpbl9sb2NrX2luaXQoJnRwLT5sb2NrKTsKKworCXJjID0gc2lzMTkwX21paV9wcm9iZShkZXYpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyX3JlbGVhc2VfYm9hcmQ7CisKKwlyYyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyX3JlbW92ZV9taWk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCW5ldF9wcm9iZSh0cCwgS0VSTl9JTkZPICIlczogJXMgYXQgJXAgKElSUTogJWQpLCAiCisJICAgICAgICIlMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeFxuIiwKKwkgICAgICAgcGNpX25hbWUocGRldiksIHNpc19jaGlwX2luZm9bZW50LT5kcml2ZXJfZGF0YV0ubmFtZSwKKwkgICAgICAgaW9hZGRyLCBkZXYtPmlycSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclsyXSwgZGV2LT5kZXZfYWRkclszXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisKKwluZXRfcHJvYmUodHAsIEtFUk5fSU5GTyAiJXM6ICVzIG1vZGUuXG4iLCBkZXYtPm5hbWUsCisJCSAgKHRwLT5mZWF0dXJlcyAmIEZfSEFTX1JHTUlJKSA/ICJSR01JSSIgOiAiR01JSSIpOworCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCXNpczE5MF9zZXRfc3BlZWRfYXV0byhkZXYpOworb3V0OgorCXJldHVybiByYzsKKworZXJyX3JlbW92ZV9taWk6CisJc2lzMTkwX21paV9yZW1vdmUoZGV2KTsKK2Vycl9yZWxlYXNlX2JvYXJkOgorCXNpczE5MF9yZWxlYXNlX2JvYXJkKHBkZXYpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc2lzMTkwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNpczE5MF9taWlfcmVtb3ZlKGRldik7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlzaXMxOTBfcmVsZWFzZV9ib2FyZChwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzaXMxOTBfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJPSBzaXMxOTBfcGNpX3RibCwKKwkucHJvYmUJCT0gc2lzMTkwX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2lzMTkwX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2lzMTkwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc2lzMTkwX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2lzMTkwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzaXMxOTBfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNpczE5MF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChzaXMxOTBfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jOTF4LmggYi9kcml2ZXJzL25ldC9zbWM5MXguaAppbmRleCBhOWIwNmI4Li5hYzljZTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MXguaAorKysgYi9kcml2ZXJzL25ldC9zbWM5MXguaApAQCAtOTg2LDcgKzk4Niw3IEBACiAJfSkKICNlbmRpZgogCi0jaWYgU01DX0NBTl9VU0VfREFUQUNTCisjaWZkZWYgU01DX0NBTl9VU0VfREFUQUNTCiAjZGVmaW5lIFNNQ19QVVNIX0RBVEEocCwgbCkJCQkJCQlcCiAJaWYgKCBscC0+ZGF0YWNzICkgewkJCQkJCVwKIAkJdW5zaWduZWQgY2hhciAqX19wdHIgPSAocCk7CQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYyBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTE5MjIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCkBAIC0wLDAgKzEsMjMzNCBAQAorLyoKKyAqIE5ldHdvcmsgZGV2aWNlIGRyaXZlciBmb3IgQ2VsbCBQcm9jZXNzb3ItQmFzZWQgQmxhZGUKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA1CisgKgorICogQXV0aG9ycyA6IFV0eiBCYWNoZXIgPHV0ei5iYWNoZXJAZGUuaWJtLmNvbT4KKyAqICAgICAgICAgICBKZW5zIE9zdGVya2FtcCA8SmVucy5Pc3RlcmthbXBAZGUuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisKKyNpbmNsdWRlICJzcGlkZXJfbmV0LmgiCisKK01PRFVMRV9BVVRIT1IoIlV0eiBCYWNoZXIgPHV0ei5iYWNoZXJAZGUuaWJtLmNvbT4gYW5kIEplbnMgT3N0ZXJrYW1wICIgXAorCSAgICAgICI8SmVucy5Pc3RlcmthbXBAZGUuaWJtLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3BpZGVyIFNvdXRoYnJpZGdlIEdpZ2FiaXQgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgcnhfZGVzY3JpcHRvcnMgPSBTUElERVJfTkVUX1JYX0RFU0NSSVBUT1JTX0RFRkFVTFQ7CitzdGF0aWMgaW50IHR4X2Rlc2NyaXB0b3JzID0gU1BJREVSX05FVF9UWF9ERVNDUklQVE9SU19ERUZBVUxUOworCittb2R1bGVfcGFyYW0ocnhfZGVzY3JpcHRvcnMsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0odHhfZGVzY3JpcHRvcnMsIGludCwgMDY0NCk7CisKK01PRFVMRV9QQVJNX0RFU0MocnhfZGVzY3JpcHRvcnMsICJudW1iZXIgb2YgZGVzY3JpcHRvcnMgdXNlZCAiIFwKKwkJICJpbiByeCBjaGFpbnMiKTsKK01PRFVMRV9QQVJNX0RFU0ModHhfZGVzY3JpcHRvcnMsICJudW1iZXIgb2YgZGVzY3JpcHRvcnMgdXNlZCAiIFwKKwkJICJpbiB0eCBjaGFpbiIpOworCitjaGFyIHNwaWRlcl9uZXRfZHJpdmVyX25hbWVbXSA9ICJzcGlkZXJuZXQiOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3BpZGVyX25ldF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkFfMiwgUENJX0RFVklDRV9JRF9UT1NISUJBX1NQSURFUl9ORVQsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzcGlkZXJfbmV0X3BjaV90YmwpOworCisvKioKKyAqIHNwaWRlcl9uZXRfcmVhZF9yZWcgLSByZWFkcyBhbiBTTU1JTyByZWdpc3RlciBvZiBhIGNhcmQKKyAqIEBjYXJkOiBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcmVnOiByZWdpc3RlciB0byByZWFkIGZyb20KKyAqCisgKiByZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgU01NSU8gcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB1MzIKK3NwaWRlcl9uZXRfcmVhZF9yZWcoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwgdTMyIHJlZykKK3sKKwl1MzIgdmFsdWU7CisKKwl2YWx1ZSA9IHJlYWRsKGNhcmQtPnJlZ3MgKyByZWcpOworCXZhbHVlID0gbGUzMl90b19jcHUodmFsdWUpOworCisJcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfd3JpdGVfcmVnIC0gd3JpdGVzIHRvIGFuIFNNTUlPIHJlZ2lzdGVyIG9mIGEgY2FyZAorICogQGNhcmQ6IGRldmljZSBzdHJ1Y3R1cmUKKyAqIEByZWc6IHJlZ2lzdGVyIHRvIHdyaXRlIHRvCisgKiBAdmFsdWU6IHZhbHVlIHRvIHdyaXRlIGludG8gdGhlIHNwZWNpZmllZCBTTU1JTyByZWdpc3RlcgorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF93cml0ZV9yZWcoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwgdTMyIHJlZywgdTMyIHZhbHVlKQoreworCXZhbHVlID0gY3B1X3RvX2xlMzIodmFsdWUpOworCXdyaXRlbCh2YWx1ZSwgY2FyZC0+cmVncyArIHJlZyk7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF93cml0ZV9yZWdfc3luYyAtIHdyaXRlcyB0byBhbiBTTU1JTyByZWdpc3RlciBvZiBhIGNhcmQKKyAqIEBjYXJkOiBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcmVnOiByZWdpc3RlciB0byB3cml0ZSB0bworICogQHZhbHVlOiB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBzcGVjaWZpZWQgU01NSU8gcmVnaXN0ZXIKKyAqCisgKiBVbmxpa2Ugc3BpZGVyX25ldF93cml0ZV9yZWcsIHRoaXMgd2lsbCBhbHNvIG1ha2Ugc3VyZSB0aGUKKyAqIGRhdGEgYXJyaXZlcyBvbiB0aGUgY2FyZCBieSByZWFkaW5nIHRoZSByZWcgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3dyaXRlX3JlZ19zeW5jKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsIHUzMiByZWcsIHUzMiB2YWx1ZSkKK3sKKwl2YWx1ZSA9IGNwdV90b19sZTMyKHZhbHVlKTsKKwl3cml0ZWwodmFsdWUsIGNhcmQtPnJlZ3MgKyByZWcpOworCSh2b2lkKXJlYWRsKGNhcmQtPnJlZ3MgKyByZWcpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfcnhfaXJxX29mZiAtIHN3aXRjaCBvZmYgcnggaXJxIG9uIHRoaXMgc3BpZGVyIGNhcmQKKyAqIEBjYXJkOiBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogc3dpdGNoZXMgb2ZmIHJ4IGlycSBieSBtYXNraW5nIHRoZW0gb3V0IGluIHRoZSBHSElJTlRuTVNLIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3J4X2lycV9vZmYoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwl1MzIgcmVndmFsdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pbnRtYXNrX2xvY2ssIGZsYWdzKTsKKwlyZWd2YWx1ZSA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HSElJTlQwTVNLKTsKKwlyZWd2YWx1ZSAmPSB+U1BJREVSX05FVF9SWElOVDsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZ19zeW5jKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSywgcmVndmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmludG1hc2tfbG9jaywgZmxhZ3MpOworfQorCisvKiogc3BpZGVyX25ldF93cml0ZV9waHkgLSB3cml0ZSB0byBwaHkgcmVnaXN0ZXIKKyAqIEBuZXRkZXY6IGFkYXB0ZXIgdG8gYmUgd3JpdHRlbiB0bworICogQG1paV9pZDogaWQgb2YgTUlJCisgKiBAcmVnOiBQSFkgcmVnaXN0ZXIKKyAqIEB2YWw6IHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gcGh5IHJlZ2lzdGVyCisgKgorICogc3BpZGVyX25ldF93cml0ZV9waHlfcmVnaXN0ZXIgd3JpdGVzIHRvIGFuIGFyYml0cmFyeSBQSFkKKyAqIHJlZ2lzdGVyIHZpYSB0aGUgc3BpZGVyIEdQQ1dPUENNRCByZWdpc3Rlci4gV2UgYXNzdW1lIHRoZSBxdWV1ZSBkb2VzCisgKiBub3QgcnVuIGZ1bGwgKG5vdCBtb3JlIHRoYW4gMTUgY29tbWFuZHMgb3V0c3RhbmRpbmcpLgorICoqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfd3JpdGVfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBtaWlfaWQsCisJCSAgICAgaW50IHJlZywgaW50IHZhbCkKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgd3JpdGV2YWx1ZTsKKworCXdyaXRldmFsdWUgPSAoKHUzMiltaWlfaWQgPDwgMjEpIHwKKwkJKCh1MzIpcmVnIDw8IDE2KSB8ICgodTMyKXZhbCk7CisKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dQQ1dPUENNRCwgd3JpdGV2YWx1ZSk7Cit9CisKKy8qKiBzcGlkZXJfbmV0X3JlYWRfcGh5IC0gcmVhZCBmcm9tIHBoeSByZWdpc3RlcgorICogQG5ldGRldjogbmV0d29yayBkZXZpY2UgdG8gYmUgcmVhZCBmcm9tCisgKiBAbWlpX2lkOiBpZCBvZiBNSUkKKyAqIEByZWc6IFBIWSByZWdpc3RlcgorICoKKyAqIFJldHVybnMgdmFsdWUgcmVhZCBmcm9tIFBIWSByZWdpc3RlcgorICoKKyAqIHNwaWRlcl9uZXRfd3JpdGVfcGh5IHJlYWRzIGZyb20gYW4gYXJiaXRyYXJ5IFBIWQorICogcmVnaXN0ZXIgdmlhIHRoZSBzcGlkZXIgR1BDUk9QQ01EIHJlZ2lzdGVyCisgKiovCitzdGF0aWMgaW50CitzcGlkZXJfbmV0X3JlYWRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBtaWlfaWQsIGludCByZWcpCit7CisJc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIHJlYWR2YWx1ZTsKKworCXJlYWR2YWx1ZSA9ICgodTMyKW1paV9pZCA8PCAyMSkgfCAoKHUzMilyZWcgPDwgMTYpOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR1BDUk9QQ01ELCByZWFkdmFsdWUpOworCisJLyogd2UgZG9uJ3QgdXNlIHNlbWFwaG9yZXMgdG8gd2FpdCBmb3IgYW4gU1BJREVSX05FVF9HUFJPUENNUElOVAorCSAqIGludGVycnVwdCwgYXMgd2UgcG9sbCBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHJlYWQgb3BlcmF0aW9uCisJICogaW4gc3BpZGVyX25ldF9yZWFkX3BoeS4gU2hvdWxkIHRha2UgYWJvdXQgNTAgdXMgKi8KKwlkbyB7CisJCXJlYWR2YWx1ZSA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HUENST1BDTUQpOworCX0gd2hpbGUgKHJlYWR2YWx1ZSAmIFNQSURFUl9ORVRfR1BSRVhFQyk7CisKKwlyZWFkdmFsdWUgJj0gU1BJREVSX05FVF9HUFJEQVRfTUFTSzsKKworCXJldHVybiByZWFkdmFsdWU7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9yeF9pcnFfb24gLSBzd2l0Y2ggb24gcnggaXJxIG9uIHRoaXMgc3BpZGVyIGNhcmQKKyAqIEBjYXJkOiBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogc3dpdGNoZXMgb24gcnggaXJxIGJ5IGVuYWJsaW5nIHRoZW0gaW4gdGhlIEdISUlOVG5NU0sgcmVnaXN0ZXIKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfcnhfaXJxX29uKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJdTMyIHJlZ3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aW50bWFza19sb2NrLCBmbGFncyk7CisJcmVndmFsdWUgPSBzcGlkZXJfbmV0X3JlYWRfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSyk7CisJcmVndmFsdWUgfD0gU1BJREVSX05FVF9SWElOVDsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZ19zeW5jKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSywgcmVndmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmludG1hc2tfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfdHhfaXJxX29mZiAtIHN3aXRjaCBvZmYgdHggaXJxIG9uIHRoaXMgc3BpZGVyIGNhcmQKKyAqIEBjYXJkOiBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogc3dpdGNoZXMgb2ZmIHR4IGlycSBieSBtYXNraW5nIHRoZW0gb3V0IGluIHRoZSBHSElJTlRuTVNLIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3R4X2lycV9vZmYoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwl1MzIgcmVndmFsdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pbnRtYXNrX2xvY2ssIGZsYWdzKTsKKwlyZWd2YWx1ZSA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HSElJTlQwTVNLKTsKKwlyZWd2YWx1ZSAmPSB+U1BJREVSX05FVF9UWElOVDsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZ19zeW5jKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSywgcmVndmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmludG1hc2tfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfdHhfaXJxX29uIC0gc3dpdGNoIG9uIHR4IGlycSBvbiB0aGlzIHNwaWRlciBjYXJkCisgKiBAY2FyZDogZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHN3aXRjaGVzIG9uIHR4IGlycSBieSBlbmFibGluZyB0aGVtIGluIHRoZSBHSElJTlRuTVNLIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3R4X2lycV9vbihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCXUzMiByZWd2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmludG1hc2tfbG9jaywgZmxhZ3MpOworCXJlZ3ZhbHVlID0gc3BpZGVyX25ldF9yZWFkX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDBNU0spOworCXJlZ3ZhbHVlIHw9IFNQSURFUl9ORVRfVFhJTlQ7CisJc3BpZGVyX25ldF93cml0ZV9yZWdfc3luYyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDBNU0ssIHJlZ3ZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pbnRtYXNrX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3NldF9wcm9taXNjIC0gc2V0cyB0aGUgdW5pY2FzdCBhZGRyZXNzIG9yIHRoZSBwcm9taXNjdW91cyBtb2RlCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiBzcGlkZXJfbmV0X3NldF9wcm9taXNjIHNldHMgdGhlIHVuaWNhc3QgZGVzdGluYXRpb24gYWRkcmVzcyBmaWx0ZXIgYW5kCisgKiB0aHVzIGVpdGhlciBhbGxvd3MgZm9yIG5vbi1wcm9taXNjIG1vZGUgb3IgcHJvbWlzYyBtb2RlCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3NldF9wcm9taXNjKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJdTMyIG1hY3UsIG1hY2w7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGNhcmQtPm5ldGRldjsKKworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJLyogY2xlYXIgZGVzdGluYXRpb24gZW50cnkgMCAqLworCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNUlVBRklMblIsIDApOworCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNUlVBRklMblIgKyAweDA0LCAwKTsKKwkJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HTVJVQTBGSUwxNVIsCisJCQkJICAgICBTUElERVJfTkVUX1BST01JU0NfVkFMVUUpOworCX0gZWxzZSB7CisJCW1hY3UgPSBuZXRkZXYtPmRldl9hZGRyWzBdOworCQltYWN1IDw8PSA4OworCQltYWN1IHw9IG5ldGRldi0+ZGV2X2FkZHJbMV07CisJCW1lbWNweSgmbWFjbCwgJm5ldGRldi0+ZGV2X2FkZHJbMl0sIHNpemVvZihtYWNsKSk7CisKKwkJbWFjdSB8PSBTUElERVJfTkVUX1VBX0RFU0NSX1ZBTFVFOworCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNUlVBRklMblIsIG1hY3UpOworCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNUlVBRklMblIgKyAweDA0LCBtYWNsKTsKKwkJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HTVJVQTBGSUwxNVIsCisJCQkJICAgICBTUElERVJfTkVUX05PTlBST01JU0NfVkFMVUUpOworCX0KK30KKworLyoqCisgKiBzcGlkZXJfbmV0X2dldF9tYWNfYWRkcmVzcyAtIHJlYWQgbWFjIGFkZHJlc3MgZnJvbSBzcGlkZXIgY2FyZAorICogQGNhcmQ6IGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZWFkcyBNQUMgYWRkcmVzcyBmcm9tIEdNQUNVTklNQUNVIGFuZCBHTUFDVU5JTUFDTCByZWdpc3RlcnMKKyAqLworc3RhdGljIGludAorc3BpZGVyX25ldF9nZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgbWFjbCwgbWFjdTsKKworCW1hY2wgPSBzcGlkZXJfbmV0X3JlYWRfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01BQ1VOSU1BQ0wpOworCW1hY3UgPSBzcGlkZXJfbmV0X3JlYWRfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01BQ1VOSU1BQ1UpOworCisJbmV0ZGV2LT5kZXZfYWRkclswXSA9IChtYWN1ID4+IDI0KSAmIDB4ZmY7CisJbmV0ZGV2LT5kZXZfYWRkclsxXSA9IChtYWN1ID4+IDE2KSAmIDB4ZmY7CisJbmV0ZGV2LT5kZXZfYWRkclsyXSA9IChtYWN1ID4+IDgpICYgMHhmZjsKKwluZXRkZXYtPmRldl9hZGRyWzNdID0gbWFjdSAmIDB4ZmY7CisJbmV0ZGV2LT5kZXZfYWRkcls0XSA9IChtYWNsID4+IDgpICYgMHhmZjsKKwluZXRkZXYtPmRldl9hZGRyWzVdID0gbWFjbCAmIDB4ZmY7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoJm5ldGRldi0+ZGV2X2FkZHJbMF0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyAtLSByZXR1cm5zIHRoZSBzdGF0dXMgb2YgYSBkZXNjcmlwdG9yCisgKiBAZGVzY3I6IGRlc2NyaXB0b3IgdG8gbG9vayBhdAorICoKKyAqIHJldHVybnMgdGhlIHN0YXR1cyBhcyBpbiB0aGUgZG1hY19jbWRfc3RhdHVzIGZpZWxkIG9mIHRoZSBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyBlbnVtIHNwaWRlcl9uZXRfZGVzY3Jfc3RhdHVzCitzcGlkZXJfbmV0X2dldF9kZXNjcl9zdGF0dXMoc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyKQoreworCXUzMiBjbWRfc3RhdHVzOworCXJtYigpOworCWNtZF9zdGF0dXMgPSBkZXNjci0+ZG1hY19jbWRfc3RhdHVzOworCXJtYigpOworCWNtZF9zdGF0dXMgPj49IFNQSURFUl9ORVRfREVTQ1JfSU5EX1BST0NfU0hJRlQ7CisJLyogbm8gbmVlZCB0byBtYXNrIG91dCBhbnkgYml0cywgYXMgY21kX3N0YXR1cyBpcyAzMiBiaXRzIHdpZGUgb25seQorCSAqIChhbmQgdW5zaWduZWQpICovCisJcmV0dXJuIGNtZF9zdGF0dXM7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9zZXRfZGVzY3Jfc3RhdHVzIC0tIHNldHMgdGhlIHN0YXR1cyBvZiBhIGRlc2NyaXB0b3IKKyAqIEBkZXNjcjogZGVzY3JpcHRvciB0byBjaGFuZ2UKKyAqIEBzdGF0dXM6IHN0YXR1cyB0byBzZXQgaW4gdGhlIGRlc2NyaXB0b3IKKyAqCisgKiBjaGFuZ2VzIHRoZSBzdGF0dXMgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gRG9lc24ndCBjaGFuZ2Ugb3RoZXIgYml0cworICogaW4gdGhlIHN0YXR1cworICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9zZXRfZGVzY3Jfc3RhdHVzKHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjciwKKwkJCSAgICBlbnVtIHNwaWRlcl9uZXRfZGVzY3Jfc3RhdHVzIHN0YXR1cykKK3sKKwl1MzIgY21kX3N0YXR1czsKKwkvKiByZWFkIHRoZSBzdGF0dXMgKi8KKwltYigpOworCWNtZF9zdGF0dXMgPSBkZXNjci0+ZG1hY19jbWRfc3RhdHVzOworCS8qIGNsZWFuIHRoZSB1cHBlciA0IGJpdHMgKi8KKwljbWRfc3RhdHVzICY9IFNQSURFUl9ORVRfREVTQ1JfSU5EX1BST0NfTUFTS087CisJLyogYWRkIHRoZSBzdGF0dXMgdG8gaXQgKi8KKwljbWRfc3RhdHVzIHw9ICgodTMyKXN0YXR1cyk8PFNQSURFUl9ORVRfREVTQ1JfSU5EX1BST0NfU0hJRlQ7CisJLyogYW5kIHdyaXRlIGl0IGJhY2sgKi8KKwlkZXNjci0+ZG1hY19jbWRfc3RhdHVzID0gY21kX3N0YXR1czsKKwl3bWIoKTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X2ZyZWVfY2hhaW4gLSBmcmVlIGRlc2NyaXB0b3IgY2hhaW4KKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICogQGNoYWluOiBhZGRyZXNzIG9mIGNoYWluCisgKgorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9mcmVlX2NoYWluKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsCisJCSAgICAgIHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyX2NoYWluICpjaGFpbikKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3I7CisKKwlmb3IgKGRlc2NyID0gY2hhaW4tPnRhaWw7ICFkZXNjci0+YnVzX2FkZHI7IGRlc2NyID0gZGVzY3ItPm5leHQpIHsKKwkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVzX2FkZHIsCisJCQkJIFNQSURFUl9ORVRfREVTQ1JfU0laRSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJZGVzY3ItPmJ1c19hZGRyID0gMDsKKwl9Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9pbml0X2NoYWluIC0gbGlua3MgZGVzY3JpcHRvciBjaGFpbgorICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKiBAY2hhaW46IGFkZHJlc3Mgb2YgY2hhaW4KKyAqIEBzdGFydF9kZXNjcjogYWRkcmVzcyBvZiBkZXNjcmlwdG9yIGFycmF5CisgKiBAbm86IG51bWJlciBvZiBkZXNjcmlwdG9ycworICoKKyAqIHdlIG1hbmFnZSBhIGNpcmN1bGFyIGxpc3QgdGhhdCBtaXJyb3JzIHRoZSBoYXJkd2FyZSBzdHJ1Y3R1cmUsCisgKiBleGNlcHQgdGhhdCB0aGUgaGFyZHdhcmUgdXNlcyBidXMgYWRkcmVzc2VzLgorICoKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfaW5pdF9jaGFpbihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkLAorCQkgICAgICAgc3RydWN0IHNwaWRlcl9uZXRfZGVzY3JfY2hhaW4gKmNoYWluLAorCQkgICAgICAgc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKnN0YXJ0X2Rlc2NyLCBpbnQgbm8pCit7CisJaW50IGk7CisJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyOworCisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmNoYWluX2xvY2spOworCisJZGVzY3IgPSBzdGFydF9kZXNjcjsKKwltZW1zZXQoZGVzY3IsIDAsIHNpemVvZigqZGVzY3IpICogbm8pOworCisJLyogc2V0IHVwIHRoZSBoYXJkd2FyZSBwb2ludGVycyBpbiBlYWNoIGRlc2NyaXB0b3IgKi8KKwlmb3IgKGk9MDsgaTxubzsgaSsrLCBkZXNjcisrKSB7CisJCXNwaWRlcl9uZXRfc2V0X2Rlc2NyX3N0YXR1cyhkZXNjciwgU1BJREVSX05FVF9ERVNDUl9OT1RfSU5fVVNFKTsKKworCQlkZXNjci0+YnVzX2FkZHIgPQorCQkJcGNpX21hcF9zaW5nbGUoY2FyZC0+cGRldiwgZGVzY3IsCisJCQkJICAgICAgIFNQSURFUl9ORVRfREVTQ1JfU0laRSwKKwkJCQkgICAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKworCQlpZiAoZGVzY3ItPmJ1c19hZGRyID09IERNQV9FUlJPUl9DT0RFKQorCQkJZ290byBpb21tdV9lcnJvcjsKKworCQlkZXNjci0+bmV4dCA9IGRlc2NyICsgMTsKKwkJZGVzY3ItPnByZXYgPSBkZXNjciAtIDE7CisKKwl9CisJLyogZG8gYWN0dWFsIGNpcmN1bGFyIGxpc3QgKi8KKwkoZGVzY3ItMSktPm5leHQgPSBzdGFydF9kZXNjcjsKKwlzdGFydF9kZXNjci0+cHJldiA9IGRlc2NyLTE7CisKKwlkZXNjciA9IHN0YXJ0X2Rlc2NyOworCWZvciAoaT0wOyBpIDwgbm87IGkrKywgZGVzY3IrKykgeworCQlkZXNjci0+bmV4dF9kZXNjcl9hZGRyID0gZGVzY3ItPm5leHQtPmJ1c19hZGRyOworCX0KKworCWNoYWluLT5oZWFkID0gc3RhcnRfZGVzY3I7CisJY2hhaW4tPnRhaWwgPSBzdGFydF9kZXNjcjsKKworCXJldHVybiAwOworCitpb21tdV9lcnJvcjoKKwlkZXNjciA9IHN0YXJ0X2Rlc2NyOworCWZvciAoaT0wOyBpIDwgbm87IGkrKywgZGVzY3IrKykKKwkJaWYgKGRlc2NyLT5idXNfYWRkcikKKwkJCXBjaV91bm1hcF9zaW5nbGUoY2FyZC0+cGRldiwgZGVzY3ItPmJ1c19hZGRyLAorCQkJCQkgU1BJREVSX05FVF9ERVNDUl9TSVpFLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCXJldHVybiAtRU5PTUVNOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZnJlZV9yeF9jaGFpbl9jb250ZW50cyAtIGZyZWVzIGRlc2NyIGNvbnRlbnRzIGluIHJ4IGNoYWluCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZQorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9mcmVlX3J4X2NoYWluX2NvbnRlbnRzKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyOworCisJZGVzY3IgPSBjYXJkLT5yeF9jaGFpbi5oZWFkOworCXdoaWxlIChkZXNjci0+bmV4dCAhPSBjYXJkLT5yeF9jaGFpbi5oZWFkKSB7CisJCWlmIChkZXNjci0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiKGRlc2NyLT5za2IpOworCQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVmX2FkZHIsCisJCQkJCSBTUElERVJfTkVUX01BWF9NVFUsCisJCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQl9CisJCWRlc2NyID0gZGVzY3ItPm5leHQ7CisJfQorfQorCisvKioKKyAqIHNwaWRlcl9uZXRfcHJlcGFyZV9yeF9kZXNjciAtIHJlaW5pdGlhbGl6ZXMgYSByeCBkZXNjcmlwdG9yCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqIEBkZXNjcjogZGVzY3JpcHRvciB0byByZS1pbml0CisgKgorICogcmV0dXJuIDAgb24gc3VjY2VzLCA8MCBvbiBmYWlsdXJlCisgKgorICogYWxsb2NhdGVzIGEgbmV3IHJ4IHNrYiwgaW9tbXUtbWFwcyBpdCBhbmQgYXR0YWNoZXMgaXQgdG8gdGhlIGRlc2NyaXB0b3IuCisgKiBBY3RpdmF0ZSB0aGUgZGVzY3JpcHRvciBzdGF0ZS13aXNlCisgKi8KK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfcHJlcGFyZV9yeF9kZXNjcihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkLAorCQkJICAgIHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjcikKK3sKKwlpbnQgZXJyb3IgPSAwOworCWludCBvZmZzZXQ7CisJaW50IGJ1ZnNpemU7CisKKwkvKiB3ZSBuZWVkIHRvIHJvdW5kIHVwIHRoZSBidWZmZXIgc2l6ZSB0byBhIG11bHRpcGxlIG9mIDEyOCAqLworCWJ1ZnNpemUgPSAoU1BJREVSX05FVF9NQVhfTVRVICsgU1BJREVSX05FVF9SWEJVRl9BTElHTiAtIDEpICYKKwkJKH4oU1BJREVSX05FVF9SWEJVRl9BTElHTiAtIDEpKTsKKworCS8qIGFuZCB3ZSBuZWVkIHRvIGhhdmUgaXQgMTI4IGJ5dGUgYWxpZ25lZCwgdGhlcmVmb3JlIHdlIGFsbG9jYXRlIGEKKwkgKiBiaXQgbW9yZSAqLworCS8qIGFsbG9jYXRlIGFuIHNrYiAqLworCWRlc2NyLT5za2IgPSBkZXZfYWxsb2Nfc2tiKGJ1ZnNpemUgKyBTUElERVJfTkVUX1JYQlVGX0FMSUdOIC0gMSk7CisJaWYgKCFkZXNjci0+c2tiKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlpZiAobmV0aWZfbXNnX3J4X2VycihjYXJkKSkKKwkJCQlwcl9lcnIoIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlICIKKwkJCQkJInJ4IGJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkZXNjci0+YnVmX3NpemUgPSBidWZzaXplOworCWRlc2NyLT5yZXN1bHRfc2l6ZSA9IDA7CisJZGVzY3ItPnZhbGlkX3NpemUgPSAwOworCWRlc2NyLT5kYXRhX3N0YXR1cyA9IDA7CisJZGVzY3ItPmRhdGFfZXJyb3IgPSAwOworCisJb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nKWRlc2NyLT5za2ItPmRhdGEpICYKKwkJKFNQSURFUl9ORVRfUlhCVUZfQUxJR04gLSAxKTsKKwlpZiAob2Zmc2V0KQorCQlza2JfcmVzZXJ2ZShkZXNjci0+c2tiLCBTUElERVJfTkVUX1JYQlVGX0FMSUdOIC0gb2Zmc2V0KTsKKwkvKiBpby1tbXUtbWFwIHRoZSBza2IgKi8KKwlkZXNjci0+YnVmX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+c2tiLT5kYXRhLAorCQkJCQkgU1BJREVSX05FVF9NQVhfTVRVLAorCQkJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwlpZiAoZGVzY3ItPmJ1Zl9hZGRyID09IERNQV9FUlJPUl9DT0RFKSB7CisJCWRldl9rZnJlZV9za2JfYW55KGRlc2NyLT5za2IpOworCQlpZiAobmV0aWZfbXNnX3J4X2VycihjYXJkKSkKKwkJCXByX2VycigiQ291bGQgbm90IGlvbW11LW1hcCByeCBidWZmZXJcbiIpOworCQlzcGlkZXJfbmV0X3NldF9kZXNjcl9zdGF0dXMoZGVzY3IsIFNQSURFUl9ORVRfREVTQ1JfTk9UX0lOX1VTRSk7CisJfSBlbHNlIHsKKwkJZGVzY3ItPmRtYWNfY21kX3N0YXR1cyA9IFNQSURFUl9ORVRfRE1BQ19SWF9DQVJET1dORUQ7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZW5hYmxlX3J4Y3RhaWxzIC0gc2V0cyBSWCBkbWFjIGNoYWluIHRhaWwgYWRkcmVzc2VzCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiBzcGlkZXJfbmV0X2VuYWJsZV9yeGN0YWlscyBzZXRzIHRoZSBSWCBETUFDIGNoYWluIHRhaWwgYWRyZXNzZXMgaW4gdGhlCisgKiBjaGlwIGJ5IHdyaXRpbmcgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyLiBETUEgaXMgZW5hYmxlZCBpbgorICogc3BpZGVyX25ldF9lbmFibGVfcnhkbWFjLgorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9lbmFibGVfcnhjaHRhaWxzKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJLyogYXNzdW1lIGNoYWluIGlzIGFsaWduZWQgY29ycmVjdGx5ICovCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HREFEQ0hBICwKKwkJCSAgICAgY2FyZC0+cnhfY2hhaW4udGFpbC0+YnVzX2FkZHIpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZW5hYmxlX3J4ZG1hYyAtIGVuYWJsZXMgYSByZWNlaXZlIERNQSBjb250cm9sbGVyCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiBzcGlkZXJfbmV0X2VuYWJsZV9yeGRtYWMgZW5hYmxlcyB0aGUgRE1BIGNvbnRyb2xsZXIgYnkgc2V0dGluZyBSWF9ETUFfRU4KKyAqIGluIHRoZSBHREFETUFDQ05UUiByZWdpc3RlcgorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9lbmFibGVfcnhkbWFjKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HREFETUFDQ05UUiwKKwkJCSAgICAgU1BJREVSX05FVF9ETUFfUlhfVkFMVUUpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluIC0gcmVmaWxscyBkZXNjcmlwdG9ycy9za2JzIGluIHRoZSByeCBjaGFpbnMKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHJlZmlsbHMgZGVzY3JpcHRvcnMgaW4gYWxsIGNoYWlucyAobGFzdCB1c2VkIGNoYWluIGZpcnN0KTogYWxsb2NhdGVzIHNrYnMKKyAqIGFuZCBpb21tdS1tYXBzIHRoZW0uCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3JlZmlsbF9yeF9jaGFpbihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyX2NoYWluICpjaGFpbjsKKwlpbnQgY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljaGFpbiA9ICZjYXJkLT5yeF9jaGFpbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jaGFpbl9sb2NrLCBmbGFncyk7CisJd2hpbGUgKHNwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyhjaGFpbi0+aGVhZCkgPT0KKwkJCQlTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0UpIHsKKwkJaWYgKHNwaWRlcl9uZXRfcHJlcGFyZV9yeF9kZXNjcihjYXJkLCBjaGFpbi0+aGVhZCkpCisJCQlicmVhazsKKwkJY291bnQrKzsKKwkJY2hhaW4tPmhlYWQgPSBjaGFpbi0+aGVhZC0+bmV4dDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2hhaW5fbG9jaywgZmxhZ3MpOworCisJLyogY291bGQgYmUgb3B0aW1pemVkLCBvbmx5IGRvIHRoYXQsIGlmIHdlIGtub3cgdGhlIERNQSBwcm9jZXNzaW5nCisJICogaGFzIHRlcm1pbmF0ZWQgKi8KKwlpZiAoY291bnQpCisJCXNwaWRlcl9uZXRfZW5hYmxlX3J4ZG1hYyhjYXJkKTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X2FsbG9jX3J4X3NrYnMgLSBhbGxvY2F0ZXMgcnggc2ticyBpbiByeCBkZXNjcmlwdG9yIGNoYWlucworICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludAorc3BpZGVyX25ldF9hbGxvY19yeF9za2JzKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcl9jaGFpbiAqY2hhaW47CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCisJY2hhaW4gPSAmY2FyZC0+cnhfY2hhaW47CisJLyogcHV0IGF0IGxlYXN0IG9uZSBidWZmZXIgaW50byB0aGUgY2hhaW4uIGlmIHRoaXMgZmFpbHMsCisJICogd2UndmUgZ290IGEgcHJvYmxlbS4gaWYgbm90LCBzcGlkZXJfbmV0X3JlZmlsbF9yeF9jaGFpbgorCSAqIHdpbGwgZG8gdGhlIHJlc3QgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uICovCisJaWYgKHNwaWRlcl9uZXRfcHJlcGFyZV9yeF9kZXNjcihjYXJkLCBjaGFpbi0+aGVhZCkpCisJCWdvdG8gZXJyb3I7CisJZWxzZQorCQljaGFpbi0+aGVhZCA9IGNoYWluLT5oZWFkLT5uZXh0OworCisJLyogdGhpcyB3aWxsIGFsbG9jYXRlIHRoZSByZXN0IG9mIHRoZSByeCBidWZmZXJzOyBpZiBub3QsIGl0J3MKKwkgKiBidXNpbmVzcyBhcyB1c3VhbCBsYXRlciBvbiAqLworCXNwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluKGNhcmQpOworCXJldHVybiAwOworCitlcnJvcjoKKwlzcGlkZXJfbmV0X2ZyZWVfcnhfY2hhaW5fY29udGVudHMoY2FyZCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3JlbGVhc2VfdHhfZGVzY3IgLSBwcm9jZXNzZXMgYSB1c2VkIHR4IGRlc2NyaXB0b3IKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICogQGRlc2NyOiBkZXNjcmlwdG9yIHRvIHJlbGVhc2UKKyAqCisgKiByZWxlYXNlcyBhIHVzZWQgdHggZGVzY3JpcHRvciAodW5tYXBwaW5nLCBmcmVlaW5nIG9mIHNrYikKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfcmVsZWFzZV90eF9kZXNjcihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkLAorCQkJICAgIHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogdW5tYXAgdGhlIHNrYiAqLworCXNrYiA9IGRlc2NyLT5za2I7CisJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVmX2FkZHIsIHNrYi0+bGVuLAorCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisJLyogc2V0IHN0YXR1cyB0byBub3QgdXNlZCAqLworCXNwaWRlcl9uZXRfc2V0X2Rlc2NyX3N0YXR1cyhkZXNjciwgU1BJREVSX05FVF9ERVNDUl9OT1RfSU5fVVNFKTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3JlbGVhc2VfdHhfY2hhaW4gLSBwcm9jZXNzZXMgc2VudCB0eCBkZXNjcmlwdG9ycworICogQGNhcmQ6IGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAYnJ1dGFsOiBpZiBzZXQsIGRvbid0IGNhcmUgYWJvdXQgd2hldGhlciBkZXNjcmlwdG9yIHNlZW1zIHRvIGJlIGluIHVzZQorICoKKyAqIHJlbGVhc2VzIHRoZSB0eCBkZXNjcmlwdG9ycyB0aGF0IHNwaWRlciBoYXMgZmluaXNoZWQgd2l0aCAoaWYgbm9uLWJydXRhbCkKKyAqIG9yIHNpbXBseSByZWxlYXNlIHR4IGRlc2NyaXB0b3JzIChpZiBicnV0YWwpCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3JlbGVhc2VfdHhfY2hhaW4oc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwgaW50IGJydXRhbCkKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcl9jaGFpbiAqdHhfY2hhaW4gPSAmY2FyZC0+dHhfY2hhaW47CisJZW51bSBzcGlkZXJfbmV0X2Rlc2NyX3N0YXR1cyBzdGF0dXM7CisKKwlzcGlkZXJfbmV0X3R4X2lycV9vZmYoY2FyZCk7CisKKwkvKiBubyBsb2NrIGZvciBjaGFpbiBuZWVkZWQsIGlmIHRoaXMgaXMgb25seSBleGVjdXRlZCBvbmNlIGF0IGEgdGltZSAqLworYWdhaW46CisJZm9yICg7OykgeworCQlzdGF0dXMgPSBzcGlkZXJfbmV0X2dldF9kZXNjcl9zdGF0dXModHhfY2hhaW4tPnRhaWwpOworCQlzd2l0Y2ggKHN0YXR1cykgeworCQljYXNlIFNQSURFUl9ORVRfREVTQ1JfQ0FSRE9XTkVEOgorCQkJaWYgKCFicnV0YWwpIGdvdG8gb3V0OworCQkJLyogZmFsbHRocm91Z2gsIGlmIHdlIHJlbGVhc2UgdGhlIGRlc2NyaXB0b3JzCisJCQkgKiBicnV0YWxseSAodGhlbiB3ZSBkb24ndCBjYXJlIGFib3V0CisJCQkgKiBTUElERVJfTkVUX0RFU0NSX0NBUkRPV05FRCkgKi8KKwkJY2FzZSBTUElERVJfTkVUX0RFU0NSX1JFU1BPTlNFX0VSUk9SOgorCQljYXNlIFNQSURFUl9ORVRfREVTQ1JfUFJPVEVDVElPTl9FUlJPUjoKKwkJY2FzZSBTUElERVJfTkVUX0RFU0NSX0ZPUkNFX0VORDoKKwkJCWlmIChuZXRpZl9tc2dfdHhfZXJyKGNhcmQpKQorCQkJCXByX2VycigiJXM6IGZvcmNpbmcgZW5kIG9mIHR4IGRlc2NyaXB0b3IgIgorCQkJCSAgICAgICAid2l0aCBzdGF0dXMgeCUwMnhcbiIsCisJCQkJICAgICAgIGNhcmQtPm5ldGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCWNhcmQtPm5ldGRldl9zdGF0cy50eF9kcm9wcGVkKys7CisJCQlicmVhazsKKworCQljYXNlIFNQSURFUl9ORVRfREVTQ1JfQ09NUExFVEU6CisJCQljYXJkLT5uZXRkZXZfc3RhdHMudHhfcGFja2V0cysrOworCQkJY2FyZC0+bmV0ZGV2X3N0YXRzLnR4X2J5dGVzICs9CisJCQkJdHhfY2hhaW4tPnRhaWwtPnNrYi0+bGVuOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDogLyogYW55IG90aGVyIHZhbHVlICg9PSBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0UpICovCisJCQlnb3RvIG91dDsKKwkJfQorCQlzcGlkZXJfbmV0X3JlbGVhc2VfdHhfZGVzY3IoY2FyZCwgdHhfY2hhaW4tPnRhaWwpOworCQl0eF9jaGFpbi0+dGFpbCA9IHR4X2NoYWluLT50YWlsLT5uZXh0OworCX0KK291dDoKKwluZXRpZl93YWtlX3F1ZXVlKGNhcmQtPm5ldGRldik7CisKKwlpZiAoIWJydXRhbCkgeworCQkvKiBzd2l0Y2ggb24gdHggaXJxcyAod2hpbGUgd2UgYXJlIHN0aWxsIGluIHRoZSBpbnRlcnJ1cHQKKwkJICogaGFuZGxlciwgc28gd2UgZG9uJ3QgZ2V0IGFuIGludGVycnVwdCksIGNoZWNrIGFnYWluCisJCSAqIGZvciBkb25lIGRlc2NyaXB0b3JzLiBUaGlzIHJlc3VsdHMgaW4gZmV3ZXIgaW50ZXJydXB0cyAqLworCQlzcGlkZXJfbmV0X3R4X2lycV9vbihjYXJkKTsKKwkJc3RhdHVzID0gc3BpZGVyX25ldF9nZXRfZGVzY3Jfc3RhdHVzKHR4X2NoYWluLT50YWlsKTsKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJCWNhc2UgU1BJREVSX05FVF9ERVNDUl9SRVNQT05TRV9FUlJPUjoKKwkJCWNhc2UgU1BJREVSX05FVF9ERVNDUl9QUk9URUNUSU9OX0VSUk9SOgorCQkJY2FzZSBTUElERVJfTkVUX0RFU0NSX0ZPUkNFX0VORDoKKwkJCWNhc2UgU1BJREVSX05FVF9ERVNDUl9DT01QTEVURToKKwkJCQlnb3RvIGFnYWluOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCX0KKworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZ2V0X211bHRpY2FzdF9oYXNoIC0gZ2VuZXJhdGVzIGhhc2ggZm9yIG11bHRpY2FzdCBmaWx0ZXIgdGFibGUKKyAqIEBhZGRyOiBtdWx0aWNhc3QgYWRkcmVzcworICoKKyAqIHJldHVybnMgdGhlIGhhc2ggdmFsdWUuCisgKgorICogc3BpZGVyX25ldF9nZXRfbXVsdGljYXN0X2hhc2ggY2FsY3VsYXRlcyBhIGhhc2ggdmFsdWUgZm9yIGEgZ2l2ZW4gbXVsdGljYXN0CisgKiBhZGRyZXNzLCB0aGF0IGlzIHVzZWQgdG8gc2V0IHRoZSBtdWx0aWNhc3QgZmlsdGVyIHRhYmxlcworICovCitzdGF0aWMgdTgKK3NwaWRlcl9uZXRfZ2V0X211bHRpY2FzdF9oYXNoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIF9fdTggKmFkZHIpCit7CisJLyogRklYTUU6IGFuIGFkZHIgb2YgMDE6MDA6NWU6MDA6MDA6MDEgbXVzdCByZXN1bHQgaW4gMHhhOSwKKwkgKiBmZjpmZjpmZjpmZjpmZjpmZiBtdXN0IHJlc3VsdCBpbiAweGZkICovCisJdTMyIGNyYzsKKwl1OCBoYXNoOworCisJY3JjID0gY3JjMzJfYmUofjAsIGFkZHIsIG5ldGRldi0+YWRkcl9sZW4pOworCisJaGFzaCA9IChjcmMgPj4gMjcpOworCWhhc2ggPDw9IDM7CisJaGFzaCB8PSBjcmMgJiA3OworCisJcmV0dXJuIGhhc2g7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9zZXRfbXVsdGkgLSBzZXRzIG11bHRpY2FzdCBhZGRyZXNzZXMgYW5kIHByb21pc2MgZmxhZ3MKKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogc3BpZGVyX25ldF9zZXRfbXVsdGkgY29uZmlndXJlcyBtdWx0aWNhc3QgYWRkcmVzc2VzIGFzIG5lZWRlZCBmb3IgdGhlCisgKiBuZXRkZXYgaW50ZXJmYWNlLiBJdCBhbHNvIHNldHMgdXAgbXVsdGljYXN0LCBhbGxtdWx0aSBhbmQgcHJvbWlzYworICogZmxhZ3MgYXBwcm9wcmlhdGVseQorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jOworCXU4IGhhc2g7CisJaW50IGk7CisJdTMyIHJlZzsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBsb25nIGJpdG1hc2tbU1BJREVSX05FVF9NVUxUSUNBU1RfSEFTSEVTIC8gQklUU19QRVJfTE9OR10gPQorCQl7MCwgfTsKKworCXNwaWRlcl9uZXRfc2V0X3Byb21pc2MoY2FyZCk7CisKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQlmb3IgKGkgPSAwOyBpIDwgU1BJREVSX05FVF9NVUxUSUNBU1RfSEFTSEVTOyBpKyspIHsKKwkJCXNldF9iaXQoaSwgYml0bWFzayk7CisJCX0KKwkJZ290byB3cml0ZV9oYXNoOworCX0KKworCS8qIHdlbGwsIHdlIGtub3csIHdoYXQgdGhlIGJyb2FkY2FzdCBoYXNoIHZhbHVlIGlzOiBpdCdzIHhmZAorCWhhc2ggPSBzcGlkZXJfbmV0X2dldF9tdWx0aWNhc3RfaGFzaChuZXRkZXYsIG5ldGRldi0+YnJvYWRjYXN0KTsgKi8KKwlzZXRfYml0KDB4ZmQsIGJpdG1hc2spOworCisJZm9yIChtYyA9IG5ldGRldi0+bWNfbGlzdDsgbWM7IG1jID0gbWMtPm5leHQpIHsKKwkJaGFzaCA9IHNwaWRlcl9uZXRfZ2V0X211bHRpY2FzdF9oYXNoKG5ldGRldiwgbWMtPmRtaV9hZGRyKTsKKwkJc2V0X2JpdChoYXNoLCBiaXRtYXNrKTsKKwl9CisKK3dyaXRlX2hhc2g6CisJZm9yIChpID0gMDsgaSA8IFNQSURFUl9ORVRfTVVMVElDQVNUX0hBU0hFUyAvIDQ7IGkrKykgeworCQlyZWcgPSAwOworCQlpZiAodGVzdF9iaXQoaSAqIDQsIGJpdG1hc2spKQorCQkJcmVnICs9IDB4MDg7CisJCXJlZyA8PD0gODsKKwkJaWYgKHRlc3RfYml0KGkgKiA0ICsgMSwgYml0bWFzaykpCisJCQlyZWcgKz0gMHgwODsKKwkJcmVnIDw8PSA4OworCQlpZiAodGVzdF9iaXQoaSAqIDQgKyAyLCBiaXRtYXNrKSkKKwkJCXJlZyArPSAweDA4OworCQlyZWcgPDw9IDg7CisJCWlmICh0ZXN0X2JpdChpICogNCArIDMsIGJpdG1hc2spKQorCQkJcmVnICs9IDB4MDg7CisKKwkJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HTVJNSEZJTG5SICsgaSAqIDQsIHJlZyk7CisJfQorfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZGlzYWJsZV9yeGRtYWMgLSBkaXNhYmxlcyB0aGUgcmVjZWl2ZSBETUEgY29udHJvbGxlcgorICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKgorICogc3BpZGVyX25ldF9kaXNhYmxlX3J4ZG1hYyB0ZXJtaW5hdGVzIHByb2Nlc3Npbmcgb24gdGhlIERNQSBjb250cm9sbGVyIGJ5CisgKiB0dXJpbmcgb2ZmIERNQSBhbmQgaXNzdWVpbmcgYSBmb3JjZSBlbmQKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfZGlzYWJsZV9yeGRtYWMoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dEQURNQUNDTlRSLAorCQkJICAgICBTUElERVJfTkVUX0RNQV9SWF9GRU5EX1ZBTFVFKTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3N0b3AgLSBjYWxsZWQgdXBvbiBpZmNvbmZpZyBkb3duCisgKiBAbmV0ZGV2OiBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIGFsd2F5cyByZXR1cm5zIDAKKyAqLworaW50CitzcGlkZXJfbmV0X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCW5ldGlmX3BvbGxfZGlzYWJsZShuZXRkZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJLyogZGlzYWJsZS9tYXNrIGFsbCBpbnRlcnJ1cHRzICovCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HSElJTlQwTVNLLCAwKTsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDFNU0ssIDApOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UMk1TSywgMCk7CisKKwkvKiBmcmVlX2lycShuZXRkZXYtPmlycSwgbmV0ZGV2KTsqLworCWZyZWVfaXJxKHRvX3BjaV9kZXYobmV0ZGV2LT5jbGFzc19kZXYuZGV2KS0+aXJxLCBuZXRkZXYpOworCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HRFRETUFDQ05UUiwKKwkJCSAgICAgU1BJREVSX05FVF9ETUFfVFhfRkVORF9WQUxVRSk7CisKKwkvKiB0dXJuIG9mZiBETUEsIGZvcmNlIGVuZCAqLworCXNwaWRlcl9uZXRfZGlzYWJsZV9yeGRtYWMoY2FyZCk7CisKKwkvKiByZWxlYXNlIGNoYWlucyAqLworCXNwaWRlcl9uZXRfcmVsZWFzZV90eF9jaGFpbihjYXJkLCAxKTsKKworCXNwaWRlcl9uZXRfZnJlZV9jaGFpbihjYXJkLCAmY2FyZC0+dHhfY2hhaW4pOworCXNwaWRlcl9uZXRfZnJlZV9jaGFpbihjYXJkLCAmY2FyZC0+cnhfY2hhaW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9nZXRfbmV4dF90eF9kZXNjciAtIHJldHVybnMgdGhlIG5leHQgYXZhaWxhYmxlIHR4IGRlc2NyaXB0b3IKKyAqIEBjYXJkOiBkZXZpY2Ugc3RydWN0dXJlIHRvIGdldCBkZXNjcmlwdG9yIGZyb20KKyAqCisgKiByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGRlc2NyaXB0b3IsIG9yIE5VTEwgaWYgbm90IGF2YWlsYWJsZS4KKyAqLworc3RhdGljIHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICoKK3NwaWRlcl9uZXRfZ2V0X25leHRfdHhfZGVzY3Ioc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwkvKiBjaGVjaywgaWYgaGVhZCBwb2ludHMgdG8gbm90LWluLXVzZSBkZXNjciAqLworCWlmICggc3BpZGVyX25ldF9nZXRfZGVzY3Jfc3RhdHVzKGNhcmQtPnR4X2NoYWluLmhlYWQpID09CisJICAgICBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0UgKSB7CisJCXJldHVybiBjYXJkLT50eF9jaGFpbi5oZWFkOworCX0gZWxzZSB7CisJCXJldHVybiBOVUxMOworCX0KK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3NldF90eGRlc2NyX2NtZHN0YXQgLSBzZXRzIHRoZSB0eCBkZXNjcmlwdG9yIGNvbW1hbmQgZmllbGQKKyAqIEBkZXNjcjogZGVzY3JpcHRvciBzdHJ1Y3R1cmUgdG8gZmlsbCBvdXQKKyAqIEBza2I6IHBhY2tldCB0byBjb25zaWRlcgorICoKKyAqIGZpbGxzIG91dCB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIGZpZWxkIG9mIHRoZSBkZXNjcmlwdG9yIHN0cnVjdHVyZSwKKyAqIGRlcGVuZGluZyBvbiBoYXJkd2FyZSBjaGVja3N1bSBzZXR0aW5ncy4gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIGEgd21iKCkKKyAqIGhhcyBleGVjdXRlZCBiZWZvcmUuCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3NldF90eGRlc2NyX2NtZHN0YXQoc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyLAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX0hXKSB7CisJCWRlc2NyLT5kbWFjX2NtZF9zdGF0dXMgPSBTUElERVJfTkVUX0RNQUNfQ01EU1RBVF9OT0NTOworCQlyZXR1cm47CisJfQorCisJLyogaXMgcGFja2V0IGlwPworCSAqIGlmIHllczogdGNwPyB1ZHA/ICovCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCWlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKKwkJCWRlc2NyLT5kbWFjX2NtZF9zdGF0dXMgPSBTUElERVJfTkVUX0RNQUNfQ01EU1RBVF9UQ1BDUzsKKwkJfSBlbHNlIGlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKKwkJCWRlc2NyLT5kbWFjX2NtZF9zdGF0dXMgPSBTUElERVJfTkVUX0RNQUNfQ01EU1RBVF9VRFBDUzsKKwkJfSBlbHNlIHsgLyogdGhlIHN0YWNrIHNob3VsZCBjaGVja3N1bSBub24tdGNwIGFuZCBub24tdWRwCisJCQkgICAgcGFja2V0cyBvbiBoaXMgb3duOiBORVRJRl9GX0lQX0NTVU0gKi8KKwkJCWRlc2NyLT5kbWFjX2NtZF9zdGF0dXMgPSBTUElERVJfTkVUX0RNQUNfQ01EU1RBVF9OT0NTOworCQl9CisJfQorfQorCisvKioKKyAqIHNwaWRlcl9uZXRfcHJlcGFyZV90eF9kZXNjciAtIGZpbGwgdHggZGVzY3JpcHRvciB3aXRoIHNrYiBkYXRhCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqIEBkZXNjcjogZGVzY3JpcHRvciBzdHJ1Y3R1cmUgdG8gZmlsbCBvdXQKKyAqIEBza2I6IHBhY2tldCB0byB1c2UKKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZS4KKyAqCisgKiBmaWxscyBvdXQgdGhlIGRlc2NyaXB0b3Igc3RydWN0dXJlIHdpdGggc2tiIGRhdGEgYW5kIGxlbi4gQ29waWVzIGRhdGEsCisgKiBpZiBuZWVkZWQgKDMyYml0IERNQSEpCisgKi8KK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfcHJlcGFyZV90eF9kZXNjcihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkLAorCQkJICAgIHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjciwKKwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWRlc2NyLT5idWZfYWRkciA9IHBjaV9tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCWlmIChkZXNjci0+YnVmX2FkZHIgPT0gRE1BX0VSUk9SX0NPREUpIHsKKwkJaWYgKG5ldGlmX21zZ190eF9lcnIoY2FyZCkpCisJCQlwcl9lcnIoImNvdWxkIG5vdCBpb21tdS1tYXAgcGFja2V0ICglcCwgJWkpLiAiCisJCQkJICAiRHJvcHBpbmcgcGFja2V0XG4iLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGVzY3ItPmJ1Zl9zaXplID0gc2tiLT5sZW47CisJZGVzY3ItPnNrYiA9IHNrYjsKKwlkZXNjci0+ZGF0YV9zdGF0dXMgPSAwOworCisJLyogbWFrZSBzdXJlIHRoZSBhYm92ZSB2YWx1ZXMgYXJlIGluIG1lbW9yeSBiZWZvcmUgd2UgY2hhbmdlIHRoZQorCSAqIHN0YXR1cyAqLworCXdtYigpOworCisJc3BpZGVyX25ldF9zZXRfdHhkZXNjcl9jbWRzdGF0KGRlc2NyLHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X2tpY2tfdHhfZG1hIC0gZW5hYmxlcyBUWCBETUEgcHJvY2Vzc2luZworICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKiBAZGVzY3I6IGRlc2NyaXB0b3IgYWRkcmVzcyB0byBlbmFibGUgVFggcHJvY2Vzc2luZyBhdAorICoKKyAqIHNwaWRlcl9uZXRfa2lja190eF9kbWEgd3JpdGVzIHRoZSBjdXJyZW50IHR4IGNoYWluIGhlYWQgYXMgc3RhcnQgYWRkcmVzcworICogb2YgdGhlIHR4IGRlc2NyaXB0b3IgY2hhaW4gYW5kIGVuYWJsZXMgdGhlIHRyYW5zbWlzc2lvbiBETUEgZW5naW5lCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X2tpY2tfdHhfZG1hKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsCisJCSAgICAgICBzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3IpCit7CisJLyogdGhpcyBpcyB0aGUgb25seSBkZXNjcmlwdG9yIGluIHRoZSBvdXRwdXQgY2hhaW4uCisJICogRW5hYmxlIFRYIERNQSAqLworCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HRFREQ0hBLAorCQkJICAgICBkZXNjci0+YnVzX2FkZHIpOworCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HRFRETUFDQ05UUiwKKwkJCSAgICAgU1BJREVSX05FVF9ETUFfVFhfVkFMVUUpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfeG1pdCAtIHRyYW5zbWl0cyBhIGZyYW1lIG92ZXIgdGhlIGRldmljZQorICogQHNrYjogcGFja2V0IHRvIHNlbmQgb3V0CisgKiBAbmV0ZGV2OiBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjcjsKKwlpbnQgcmVzdWx0OworCisJZGVzY3IgPSBzcGlkZXJfbmV0X2dldF9uZXh0X3R4X2Rlc2NyKGNhcmQpOworCisJaWYgKCFkZXNjcikgeworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwkJZGVzY3IgPSBzcGlkZXJfbmV0X2dldF9uZXh0X3R4X2Rlc2NyKGNhcmQpOworCQlpZiAoIWRlc2NyKQorCQkJZ290byBlcnJvcjsKKwkJZWxzZQorCQkJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKwl9CisKKwlyZXN1bHQgPSBzcGlkZXJfbmV0X3ByZXBhcmVfdHhfZGVzY3IoY2FyZCwgZGVzY3IsIHNrYik7CisJaWYgKHJlc3VsdCkKKwkJZ290byBlcnJvcjsKKworCWNhcmQtPnR4X2NoYWluLmhlYWQgPSBjYXJkLT50eF9jaGFpbi5oZWFkLT5uZXh0OworCisJLyogbWFrZSBzdXJlIHRoZSBzdGF0dXMgZnJvbSBzcGlkZXJfbmV0X3ByZXBhcmVfdHhfZGVzY3IgaXMgaW4KKwkgKiBtZW1vcnkgYmVmb3JlIHdlIGNoZWNrIG91dCB0aGUgcHJldmlvdXMgZGVzY3JpcHRvciAqLworCXdtYigpOworCisJaWYgKHNwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyhkZXNjci0+cHJldikgIT0KKwkgICAgU1BJREVSX05FVF9ERVNDUl9DQVJET1dORUQpCisJCXNwaWRlcl9uZXRfa2lja190eF9kbWEoY2FyZCwgZGVzY3IpOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworZXJyb3I6CisJY2FyZC0+bmV0ZGV2X3N0YXRzLnR4X2Ryb3BwZWQrKzsKKwlyZXR1cm4gTkVUREVWX1RYX0xPQ0tFRDsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X2RvX2lvY3RsIC0gY2FsbGVkIGZvciBkZXZpY2UgaW9jdGxzCisgKiBAbmV0ZGV2OiBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQGlmcjogcmVxdWVzdCBwYXJhbWV0ZXIgc3RydWN0dXJlIGZvciBpb2N0bAorICogQGNtZDogY29tbWFuZCBjb2RlIGZvciBpb2N0bAorICoKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLiBDdXJyZW50bHksIHdlIGhhdmUgbm8gc3BlY2lhbCBpb2N0bHMuCisgKiAtRU9QTk9UU1VQUCBpcyByZXR1cm5lZCwgaWYgYW4gdW5rbm93biBpb2N0bCB3YXMgcmVxdWVzdGVkCisgKi8KK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCisvKioKKyAqIHNwaWRlcl9uZXRfcGFzc19za2JfdXAgLSB0YWtlcyBhbiBza2IgZnJvbSBhIGRlc2NyaXB0b3IgYW5kIHBhc3NlcyBpdCBvbgorICogQGRlc2NyOiBkZXNjcmlwdG9yIHRvIHByb2Nlc3MKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMSBvbiBzdWNjZXNzLCAwIGlmIG5vIHBhY2tldCB3YXMgcGFzc2VkIHRvIHRoZSBzdGFjaworICoKKyAqIGlvbW11LXVubWFwcyB0aGUgc2tiLCBmaWxscyBvdXQgc2tiIHN0cnVjdHVyZSBhbmQgcGFzc2VzIHRoZSBkYXRhIHRvIHRoZQorICogc3RhY2suIFRoZSBkZXNjcmlwdG9yIHN0YXRlIGlzIG5vdCBjaGFuZ2VkLgorICovCitzdGF0aWMgaW50CitzcGlkZXJfbmV0X3Bhc3Nfc2tiX3VwKHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjciwKKwkJICAgICAgIHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXUzMiBkYXRhX3N0YXR1cywgZGF0YV9lcnJvcjsKKworCWRhdGFfc3RhdHVzID0gZGVzY3ItPmRhdGFfc3RhdHVzOworCWRhdGFfZXJyb3IgPSBkZXNjci0+ZGF0YV9lcnJvcjsKKworCW5ldGRldiA9IGNhcmQtPm5ldGRldjsKKworCS8qIGNoZWNrIGZvciBlcnJvcnMgaW4gdGhlIGRhdGFfZXJyb3IgZmxhZyAqLworCWlmICgoZGF0YV9lcnJvciAmIFNQSURFUl9ORVRfREFUQV9FUlJPUl9NQVNLKSAmJgorCSAgICBuZXRpZl9tc2dfcnhfZXJyKGNhcmQpKQorCQlwcl9lcnIoImVycm9yIGluIHJlY2VpdmVkIGRlc2NyaXB0b3IgZm91bmQsICIKKwkJICAgICAgICJkYXRhX3N0YXR1cz14JTA4eCwgZGF0YV9lcnJvcj14JTA4eFxuIiwKKwkJICAgICAgIGRhdGFfc3RhdHVzLCBkYXRhX2Vycm9yKTsKKworCS8qIHByZXBhcmUgc2tiLCB1bm1hcCBkZXNjcmlwdG9yICovCisJc2tiID0gZGVzY3ItPnNrYjsKKwlwY2lfdW5tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGRlc2NyLT5idWZfYWRkciwgU1BJREVSX05FVF9NQVhfTVRVLAorCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwkvKiB0aGUgY2FzZXMgd2UnbGwgdGhyb3cgYXdheSB0aGUgcGFja2V0IGltbWVkaWF0ZWx5ICovCisJaWYgKGRhdGFfZXJyb3IgJiBTUElERVJfTkVUX0RFU1RST1lfUlhfRkxBR1MpCisJCXJldHVybiAwOworCisJc2tiLT5kZXYgPSBuZXRkZXY7CisJc2tiX3B1dChza2IsIGRlc2NyLT52YWxpZF9zaXplKTsKKworCS8qIHRoZSBjYXJkIHNlZW1zIHRvIGFkZCAyIGJ5dGVzIG9mIGp1bmsgaW4gZnJvbnQKKwkgKiBvZiB0aGUgZXRoZXJuZXQgZnJhbWUgKi8KKyNkZWZpbmUgU1BJREVSX01JU0FMSUdOCQkyCisJc2tiX3B1bGwoc2tiLCBTUElERVJfTUlTQUxJR04pOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CisKKwkvKiBjaGVja3N1bSBvZmZsb2FkICovCisJaWYgKGNhcmQtPm9wdGlvbnMucnhfY3N1bSkgeworCQlpZiAoIChkYXRhX3N0YXR1cyAmIFNQSURFUl9ORVRfREFUQV9TVEFUVVNfQ0hLX01BU0spICYmCisJCSAgICAgKCEoZGF0YV9lcnJvciAmIFNQSURFUl9ORVRfREFUQV9FUlJPUl9DSEtfTUFTSykpICkKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCWVsc2UKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwl9IGVsc2UgeworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJfQorCisJaWYgKGRhdGFfc3RhdHVzICYgU1BJREVSX05FVF9WTEFOX1BBQ0tFVCkgeworCQkvKiBmdXJ0aGVyIGVuaGFuY2VtZW50czogSFctYWNjZWwgVkxBTgorCQkgKiB2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2IKKwkJICovCisJfQorCisJLyogcGFzcyBza2IgdXAgdG8gc3RhY2sgKi8KKwluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCisJLyogdXBkYXRlIG5ldGRldmljZSBzdGF0aXN0aWNzICovCisJY2FyZC0+bmV0ZGV2X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwljYXJkLT5uZXRkZXZfc3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X2RlY29kZV9kZXNjciAtIHByb2Nlc3NlcyBhbiByeCBkZXNjcmlwdG9yCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIDEgaWYgYSBwYWNrZXQgaGFzIGJlZW4gc2VudCB0byB0aGUgc3RhY2ssIG90aGVyd2lzZSAwCisgKgorICogcHJvY2Vzc2VzIGFuIHJ4IGRlc2NyaXB0b3IgYnkgaW9tbXUtdW5tYXBwaW5nIHRoZSBkYXRhIGJ1ZmZlciBhbmQgcGFzc2luZworICogdGhlIHBhY2tldCB1cCB0byB0aGUgc3RhY2sKKyAqLworc3RhdGljIGludAorc3BpZGVyX25ldF9kZWNvZGVfb25lX2Rlc2NyKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJZW51bSBzcGlkZXJfbmV0X2Rlc2NyX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyOworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyX2NoYWluICpjaGFpbjsKKwlpbnQgcmVzdWx0OworCisJY2hhaW4gPSAmY2FyZC0+cnhfY2hhaW47CisJZGVzY3IgPSBjaGFpbi0+dGFpbDsKKworCXN0YXR1cyA9IHNwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyhkZXNjcik7CisKKwlpZiAoc3RhdHVzID09IFNQSURFUl9ORVRfREVTQ1JfQ0FSRE9XTkVEKSB7CisJCS8qIG5vdGhpbmcgaW4gdGhlIGRlc2NyaXB0b3IgeWV0ICovCisJCXJldHVybiAwOworCX0KKworCWlmIChzdGF0dXMgPT0gU1BJREVSX05FVF9ERVNDUl9OT1RfSU5fVVNFKSB7CisJCS8qIG5vdCBpbml0aWFsaXplZCB5ZXQsIEkgYmV0IGNoYWluLT50YWlsID09IGNoYWluLT5oZWFkCisJCSAqIGFuZCB0aGUgcmluZyBpcyBlbXB0eSAqLworCQlzcGlkZXJfbmV0X3JlZmlsbF9yeF9jaGFpbihjYXJkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZGVzY3JpcHRvciBkZWZpbml0aXZlbHkgdXNlZCAtLSBtb3ZlIG9uIGhlYWQgKi8KKwljaGFpbi0+dGFpbCA9IGRlc2NyLT5uZXh0OworCisJcmVzdWx0ID0gMDsKKwlpZiAoIChzdGF0dXMgPT0gU1BJREVSX05FVF9ERVNDUl9SRVNQT05TRV9FUlJPUikgfHwKKwkgICAgIChzdGF0dXMgPT0gU1BJREVSX05FVF9ERVNDUl9QUk9URUNUSU9OX0VSUk9SKSB8fAorCSAgICAgKHN0YXR1cyA9PSBTUElERVJfTkVUX0RFU0NSX0ZPUkNFX0VORCkgKSB7CisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKGNhcmQpKQorCQkJcHJfZXJyKCIlczogZHJvcHBpbmcgUlggZGVzY3JpcHRvciB3aXRoIHN0YXRlICVkXG4iLAorCQkJICAgICAgIGNhcmQtPm5ldGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJY2FyZC0+bmV0ZGV2X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJZ290byByZWZpbGw7CisJfQorCisJaWYgKCAoc3RhdHVzICE9IFNQSURFUl9ORVRfREVTQ1JfQ09NUExFVEUpICYmCisJICAgICAoc3RhdHVzICE9IFNQSURFUl9ORVRfREVTQ1JfRlJBTUVfRU5EKSApIHsKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIoY2FyZCkpCisJCQlwcl9lcnIoIiVzOiBSWCBkZXNjcmlwdG9yIHdpdGggc3RhdGUgJWRcbiIsCisJCQkgICAgICAgY2FyZC0+bmV0ZGV2LT5uYW1lLCBzdGF0dXMpOworCQlnb3RvIHJlZmlsbDsKKwl9CisKKwkvKiBvaywgd2UndmUgZ290IGEgcGFja2V0IGluIGRlc2NyICovCisJcmVzdWx0ID0gc3BpZGVyX25ldF9wYXNzX3NrYl91cChkZXNjciwgY2FyZCk7CityZWZpbGw6CisJc3BpZGVyX25ldF9zZXRfZGVzY3Jfc3RhdHVzKGRlc2NyLCBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0UpOworCS8qIGNoYW5nZSB0aGUgZGVzY3JpcHRvciBzdGF0ZTogKi8KKwlzcGlkZXJfbmV0X3JlZmlsbF9yeF9jaGFpbihjYXJkKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9wb2xsIC0gTkFQSSBwb2xsIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgc3RhY2sgdG8gcmV0dXJuIHBhY2tldHMKKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVkZ2V0OiBudW1iZXIgb2YgcGFja2V0cyB3ZSBjYW4gcGFzcyB0byB0aGUgc3RhY2sgYXQgbW9zdAorICoKKyAqIHJldHVybnMgMCBpZiBubyBtb3JlIHBhY2tldHMgYXZhaWxhYmxlIHRvIHRoZSBkcml2ZXIvc3RhY2suIFJldHVybnMgMSwKKyAqIGlmIHRoZSBxdW90YSBpcyBleGNlZWRlZCwgYnV0IHRoZSBkcml2ZXIgaGFzIHN0aWxsIHBhY2tldHMuCisgKgorICogc3BpZGVyX25ldF9wb2xsIHJldHVybnMgYWxsIHBhY2tldHMgZnJvbSB0aGUgcnggZGVzY3JpcHRvcnMgdG8gdGhlIHN0YWNrCisgKiAodXNpbmcgbmV0aWZfcmVjZWl2ZV9za2IpLiBJZiBhbGwvZW5vdWdoIHBhY2tldHMgYXJlIHVwLCB0aGUgZHJpdmVyCisgKiByZWVuYWJsZXMgaW50ZXJydXB0cyBhbmQgcmV0dXJucyAwLiBJZiBub3QsIDEgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcGFja2V0c190b19kbywgcGFja2V0c19kb25lID0gMDsKKwlpbnQgbm9fbW9yZV9wYWNrZXRzID0gMDsKKworCXBhY2tldHNfdG9fZG8gPSBtaW4oKmJ1ZGdldCwgbmV0ZGV2LT5xdW90YSk7CisKKwl3aGlsZSAocGFja2V0c190b19kbykgeworCQlpZiAoc3BpZGVyX25ldF9kZWNvZGVfb25lX2Rlc2NyKGNhcmQpKSB7CisJCQlwYWNrZXRzX2RvbmUrKzsKKwkJCXBhY2tldHNfdG9fZG8tLTsKKwkJfSBlbHNlIHsKKwkJCS8qIG5vIG1vcmUgcGFja2V0cyBmb3IgdGhlIHN0YWNrICovCisJCQlub19tb3JlX3BhY2tldHMgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwluZXRkZXYtPnF1b3RhIC09IHBhY2tldHNfZG9uZTsKKwkqYnVkZ2V0IC09IHBhY2tldHNfZG9uZTsKKworCS8qIGlmIGFsbCBwYWNrZXRzIGFyZSBpbiB0aGUgc3RhY2ssIGVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXR1cm4gMCAqLworCS8qIGlmIG5vdCwgcmV0dXJuIDEgKi8KKwlpZiAobm9fbW9yZV9wYWNrZXRzKSB7CisJCW5ldGlmX3J4X2NvbXBsZXRlKG5ldGRldik7CisJCXNwaWRlcl9uZXRfcnhfaXJxX29uKGNhcmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3ZsYW5fcnhfcmVnIC0gaW5pdGlhbGl6ZXMgVkxBTiBzdHJ1Y3R1cmVzIGluIHRoZSBkcml2ZXIgYW5kIGNhcmQKKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZ3JwOiB2bGFuX2dyb3VwIHN0cnVjdHVyZSB0aGF0IGlzIHJlZ2lzdGVyZWQgKE5VTEwgb24gZGVzdHJveWluZyBpbnRlcmZhY2UpCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3ZsYW5fcnhfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJLyogZnVydGhlciBlbmhhbmNlbWVudC4uLiB5ZXQgdG8gZG8gKi8KKwlyZXR1cm47Cit9CisKKy8qKgorICogc3BpZGVyX25ldF92bGFuX3J4X2FkZCAtIGFkZHMgVkxBTiBpZCB0byB0aGUgY2FyZCBmaWx0ZXIKKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdmlkOiBWTEFOIGlkIHRvIGFkZAorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF92bGFuX3J4X2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MTZfdCB2aWQpCit7CisJLyogZnVydGhlciBlbmhhbmNlbWVudC4uLiB5ZXQgdG8gZG8gKi8KKwkvKiBhZGQgdmlkIHRvIGNhcmQncyBWTEFOIGZpbHRlciB0YWJsZSAqLworCXJldHVybjsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3ZsYW5fcnhfa2lsbCAtIHJlbW92ZXMgVkxBTiBpZCB0byB0aGUgY2FyZCBmaWx0ZXIKKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdmlkOiBWTEFOIGlkIHRvIHJlbW92ZQorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF92bGFuX3J4X2tpbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKQoreworCS8qIGZ1cnRoZXIgZW5oYW5jZW1lbnQuLi4geWV0IHRvIGRvICovCisJLyogcmVtb3ZlIHZpZCBmcm9tIGNhcmQncyBWTEFOIGZpbHRlciB0YWJsZSAqLworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZ2V0X3N0YXRzIC0gZ2V0IGludGVyZmFjZSBzdGF0aXN0aWNzCisgKiBAbmV0ZGV2OiBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgdGhlIGludGVyZmFjZSBzdGF0aXN0aWNzIHJlc2lkaW5nIGluIHRoZSBzcGlkZXJfbmV0X2NhcmQgc3RydWN0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitzcGlkZXJfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZjYXJkLT5uZXRkZXZfc3RhdHM7CisJcmV0dXJuIHN0YXRzOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfY2hhbmdlX210dSAtIGNoYW5nZXMgdGhlIE1UVSBvZiBhbiBpbnRlcmZhY2UKKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbmV3X210dTogbmV3IE1UVSB2YWx1ZQorICoKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSkKK3sKKwkvKiBubyBuZWVkIHRvIHJlLWFsbG9jIHNrYnMgb3Igc28gLS0gdGhlIG1heCBtdHUgaXMgYWJvdXQgMi4zaworCSAqIGFuZCBtdHUgaXMgb3V0Ym91bmQgb25seSBhbnl3YXkgKi8KKwlpZiAoIChuZXdfbXR1IDwgU1BJREVSX05FVF9NSU5fTVRVICkgfHwKKwkJKG5ld19tdHUgPiBTUElERVJfTkVUX01BWF9NVFUpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfc2V0X21hYyAtIHNldHMgdGhlIE1BQyBvZiBhbiBpbnRlcmZhY2UKKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcHRyOiBwb2ludGVyIHRvIG5ldyBNQUMgYWRkcmVzcworICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLiBDdXJyZW50bHksIHdlIGRvbid0IHN1cHBvcnQgdGhpcworICogYW5kIHdpbGwgYWx3YXlzIHJldHVybiBFT1BOT1RTVVBQLgorICovCitzdGF0aWMgaW50CitzcGlkZXJfbmV0X3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgbWFjbCwgbWFjdSwgcmVndmFsdWU7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJLyogc3dpdGNoIG9mZiBHTUFDVFBFIGFuZCBHTUFDUlBFICovCisJcmVndmFsdWUgPSBzcGlkZXJfbmV0X3JlYWRfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01BQ09QRU1EKTsKKwlyZWd2YWx1ZSAmPSB+KCgxIDw8IDUpIHwgKDEgPDwgNikpOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01BQ09QRU1ELCByZWd2YWx1ZSk7CisKKwkvKiB3cml0ZSBtYWMgKi8KKwltYWN1ID0gKGFkZHItPnNhX2RhdGFbMF08PDI0KSArIChhZGRyLT5zYV9kYXRhWzFdPDwxNikgKworCQkoYWRkci0+c2FfZGF0YVsyXTw8OCkgKyAoYWRkci0+c2FfZGF0YVszXSk7CisJbWFjbCA9IChhZGRyLT5zYV9kYXRhWzRdPDw4KSArIChhZGRyLT5zYV9kYXRhWzVdKTsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNQUNVTklNQUNVLCBtYWN1KTsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNQUNVTklNQUNMLCBtYWNsKTsKKworCS8qIHN3aXRjaCBHTUFDVFBFIGFuZCBHTUFDUlBFIGJhY2sgb24gKi8KKwlyZWd2YWx1ZSA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HTUFDT1BFTUQpOworCXJlZ3ZhbHVlIHw9ICgoMSA8PCA1KSB8ICgxIDw8IDYpKTsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNQUNPUEVNRCwgcmVndmFsdWUpOworCisJc3BpZGVyX25ldF9zZXRfcHJvbWlzYyhjYXJkKTsKKworCS8qIGxvb2sgdXAsIHdoZXRoZXIgd2UgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWwgKi8KKwlpZiAoc3BpZGVyX25ldF9nZXRfbWFjX2FkZHJlc3MobmV0ZGV2KSkKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCWlmIChtZW1jbXAobmV0ZGV2LT5kZXZfYWRkcixhZGRyLT5zYV9kYXRhLG5ldGRldi0+YWRkcl9sZW4pKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X2VuYWJsZV90eGRtYWMgLSBlbmFibGVzIGEgVFggRE1BIGNvbnRyb2xsZXIKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHNwaWRlcl9uZXRfZW5hYmxlX3R4ZG1hYyBlbmFibGVzIHRoZSBUWCBETUEgY29udHJvbGxlciBieSBzZXR0aW5nIHRoZQorICogZGVzY3JpcHRvciBjaGFpbiB0YWlsIGFkZHJlc3MKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfZW5hYmxlX3R4ZG1hYyhzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCS8qIGFzc3VtZSBjaGFpbiBpcyBhbGlnbmVkIGNvcnJlY3RseSAqLworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0RURENIQSwKKwkJCSAgICAgY2FyZC0+dHhfY2hhaW4udGFpbC0+YnVzX2FkZHIpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfaGFuZGxlX2Vycm9yX2lycSAtIGhhbmRsZXMgZXJyb3JzIHJhaXNlZCBieSBhbiBpbnRlcnJ1cHQKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICogQHN0YXR1c19yZWc6IGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgMCAoR0hJSU5UMFNUUykKKyAqCisgKiBzcGlkZXJfbmV0X2hhbmRsZV9lcnJvcl9pcnEgdHJlYXRzIG9yIGlnbm9yZXMgYWxsIGVycm9yIGNvbmRpdGlvbnMKKyAqIGZvdW5kIHdoZW4gYW4gaW50ZXJydXB0IGlzIHByZXNlbnRlZAorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9oYW5kbGVfZXJyb3JfaXJxKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsIHUzMiBzdGF0dXNfcmVnKQoreworCXUzMiBlcnJvcl9yZWcxLCBlcnJvcl9yZWcyOworCXUzMiBpOworCWludCBzaG93X2Vycm9yID0gMTsKKworCWVycm9yX3JlZzEgPSBzcGlkZXJfbmV0X3JlYWRfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UMVNUUyk7CisJZXJyb3JfcmVnMiA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HSElJTlQyU1RTKTsKKworCS8qIGNoZWNrIEdISUlOVDBTVFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWlmIChzdGF0dXNfcmVnKQorCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJCWlmIChzdGF0dXNfcmVnICYgKDE8PGkpKQorCQkJCXN3aXRjaCAoaSkKKwl7CisJLyogbGV0IGVycm9yX3JlZzEgYW5kIGVycm9yX3JlZzIgZXZhbHVhdGlvbiBkZWNpZGUsIHdoYXQgdG8gZG8KKwljYXNlIFNQSURFUl9ORVRfUEhZSU5UOgorCWNhc2UgU1BJREVSX05FVF9HTUFDMklOVDoKKwljYXNlIFNQSURFUl9ORVRfR01BQzFJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dJUFNJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dGSUZPSU5UOgorCWNhc2UgU1BJREVSX05FVF9ETUFDSU5UOgorCWNhc2UgU1BJREVSX05FVF9HU1lTSU5UOgorCQlicmVhazsgKi8KKworCWNhc2UgU1BJREVSX05FVF9HUFdPUENNUElOVDoKKwkJLyogUEhZIHdyaXRlIG9wZXJhdGlvbiBjb21wbGV0ZWQgKi8KKwkJc2hvd19lcnJvciA9IDA7CisJCWJyZWFrOworCWNhc2UgU1BJREVSX05FVF9HUFJPUENNUElOVDoKKwkJLyogUEhZIHJlYWQgb3BlcmF0aW9uIGNvbXBsZXRlZCAqLworCQkvKiB3ZSBkb24ndCB1c2Ugc2VtYXBob3JlcywgYXMgd2UgcG9sbCBmb3IgdGhlIGNvbXBsZXRpb24KKwkJICogb2YgdGhlIHJlYWQgb3BlcmF0aW9uIGluIHNwaWRlcl9uZXRfcmVhZF9waHkuIFNob3VsZCB0YWtlCisJCSAqIGFib3V0IDUwIHVzICovCisJCXNob3dfZXJyb3IgPSAwOworCQlicmVhazsKKwljYXNlIFNQSURFUl9ORVRfR1BXRkZJTlQ6CisJCS8qIFBIWSBjb21tYW5kIHF1ZXVlIGZ1bGwgKi8KKwkJaWYgKG5ldGlmX21zZ19pbnRyKGNhcmQpKQorCQkJcHJfZXJyKCJQSFkgd3JpdGUgcXVldWUgZnVsbFxuIik7CisJCXNob3dfZXJyb3IgPSAwOworCQlicmVhazsKKworCS8qIGNhc2UgU1BJREVSX05FVF9HUk1EQURSSU5UOiBub3QgdXNlZC4gcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dSTUFSUElOVDogbm90IHVzZWQuIHByaW50IGEgbWVzc2FnZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HUk1NUElOVDogbm90IHVzZWQuIHByaW50IGEgbWVzc2FnZSAqLworCisJY2FzZSBTUElERVJfTkVUX0dEVERFTjBJTlQ6CisJCS8qIHNvbWVvbmUgaGFzIHNldCBUWF9ETUFfRU4gdG8gMCAqLworCQlzaG93X2Vycm9yID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNQSURFUl9ORVRfR0REREVOMElOVDogLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIFNQSURFUl9ORVRfR0RDREVOMElOVDogLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIFNQSURFUl9ORVRfR0RCREVOMElOVDogLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIFNQSURFUl9ORVRfR0RBREVOMElOVDoKKwkJLyogc29tZW9uZSBoYXMgc2V0IFJYX0RNQV9FTiB0byAwICovCisJCXNob3dfZXJyb3IgPSAwOworCQlicmVhazsKKworCS8qIFJYIGludGVycnVwdHMgKi8KKwljYXNlIFNQSURFUl9ORVRfR0RERkRDSU5UOgorCWNhc2UgU1BJREVSX05FVF9HRENGRENJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dEQkZEQ0lOVDoKKwljYXNlIFNQSURFUl9ORVRfR0RBRkRDSU5UOgorCS8qIGNhc2UgU1BJREVSX05FVF9HRE5NSU5UOiBub3QgdXNlZC4gcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dDTk1JTlQ6IG5vdCB1c2VkLiBwcmludCBhIG1lc3NhZ2UgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR0JOTUlOVDogbm90IHVzZWQuIHByaW50IGEgbWVzc2FnZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HQU5NSU5UOiBub3QgdXNlZC4gcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dSRk5NSU5UOiBub3QgdXNlZC4gcHJpbnQgYSBtZXNzYWdlICovCisJCXNob3dfZXJyb3IgPSAwOworCQlicmVhazsKKworCS8qIFRYIGludGVycnVwdHMgKi8KKwljYXNlIFNQSURFUl9ORVRfR0RURkRDSU5UOgorCQlzaG93X2Vycm9yID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTUElERVJfTkVUX0dUVEVESU5UOgorCQlzaG93X2Vycm9yID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTUElERVJfTkVUX0dEVERDRUlOVDoKKwkJLyogY2hhaW4gZW5kLiBJZiBhIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHNlbnQsIGtpY2sgb2ZmCisJCSAqIHR4IGRtYQorCQlpZiAoY2FyZC0+dHhfY2hhaW4udGFpbCA9PSBjYXJkLT50eF9jaGFpbi5oZWFkKQorCQkJc3BpZGVyX25ldF9raWNrX3R4X2RtYShjYXJkKTsKKwkJc2hvd19lcnJvciA9IDA7ICovCisJCWJyZWFrOworCisJLyogY2FzZSBTUElERVJfTkVUX0cxVE1DTlRJTlQ6IG5vdCB1c2VkLiBwcmludCBhIG1lc3NhZ2UgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR0ZSRUVDTlRJTlQ6IG5vdCB1c2VkLiBwcmludCBhIG1lc3NhZ2UgKi8KKwl9CisKKwkvKiBjaGVjayBHSElJTlQxU1RTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlpZiAoZXJyb3JfcmVnMSkKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCQlpZiAoZXJyb3JfcmVnMSAmICgxPDxpKSkKKwkJCQlzd2l0Y2ggKGkpCisJeworCWNhc2UgU1BJREVSX05FVF9HVE1GTExJTlQ6CisJCWlmIChuZXRpZl9tc2dfaW50cihjYXJkKSkKKwkJCXByX2VycigiU3BpZGVyIFRYIFJBTSBmdWxsXG4iKTsKKwkJc2hvd19lcnJvciA9IDA7CisJCWJyZWFrOworCWNhc2UgU1BJREVSX05FVF9HUk1GTExJTlQ6CisJCWlmIChuZXRpZl9tc2dfaW50cihjYXJkKSkKKwkJCXByX2VycigiU3BpZGVyIFJYIFJBTSBmdWxsLCBpbmNvbWluZyBwYWNrZXRzICIKKwkJCSAgICAgICAibWlnaHQgYmUgZGlzY2FyZGVkICFcbiIpOworCQluZXRpZl9yeF9zY2hlZHVsZShjYXJkLT5uZXRkZXYpOworCQlzcGlkZXJfbmV0X2VuYWJsZV9yeGNodGFpbHMoY2FyZCk7CisJCXNwaWRlcl9uZXRfZW5hYmxlX3J4ZG1hYyhjYXJkKTsKKwkJYnJlYWs7CisKKwkvKiBjYXNlIFNQSURFUl9ORVRfR1RNU0hUSU5UOiBwcm9ibGVtLCBwcmludCBhIG1lc3NhZ2UgKi8KKwljYXNlIFNQSURFUl9ORVRfR0RUSU5WRElOVDoKKwkJLyogYWxscmlnaHR5LiB0eCBmcm9tIHByZXZpb3VzIGRlc2NyIG9rICovCisJCXNob3dfZXJyb3IgPSAwOworCQlicmVhazsKKwkvKiBjYXNlIFNQSURFUl9ORVRfR1JGREZMTElOVDogcHJpbnQgYSBtZXNzYWdlIGRvd24gdGhlcmUgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR1JGQ0ZMTElOVDogcHJpbnQgYSBtZXNzYWdlIGRvd24gdGhlcmUgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR1JGQkZMTElOVDogcHJpbnQgYSBtZXNzYWdlIGRvd24gdGhlcmUgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR1JGQUZMTElOVDogcHJpbnQgYSBtZXNzYWdlIGRvd24gdGhlcmUgKi8KKworCS8qIGNoYWluIGVuZCAqLworCWNhc2UgU1BJREVSX05FVF9HREREQ0VJTlQ6IC8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBTUElERVJfTkVUX0dEQ0RDRUlOVDogLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIFNQSURFUl9ORVRfR0RCRENFSU5UOiAvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgU1BJREVSX05FVF9HREFEQ0VJTlQ6CisJCWlmIChuZXRpZl9tc2dfaW50cihjYXJkKSkKKwkJCXByX2VycigiZ290IGRlc2NyaXB0b3IgY2hhaW4gZW5kIGludGVycnVwdCwgIgorCQkJICAgICAgICJyZXN0YXJ0aW5nIERNQUMgJWMuXG4iLAorCQkJICAgICAgICdEJytpLVNQSURFUl9ORVRfR0RERENFSU5UKTsKKwkJc3BpZGVyX25ldF9yZWZpbGxfcnhfY2hhaW4oY2FyZCk7CisJCXNob3dfZXJyb3IgPSAwOworCQlicmVhazsKKworCS8qIGludmFsaWQgZGVzY3JpcHRvciAqLworCWNhc2UgU1BJREVSX05FVF9HRERJTlZESU5UOiAvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgU1BJREVSX05FVF9HRENJTlZESU5UOiAvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgU1BJREVSX05FVF9HREJJTlZESU5UOiAvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgU1BJREVSX05FVF9HREFJTlZESU5UOgorCQkvKiBjb3VsZCBoYXBwZW4gd2hlbiByeCBjaGFpbiBpcyBmdWxsICovCisJCXNwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluKGNhcmQpOworCQlzaG93X2Vycm9yID0gMDsKKwkJYnJlYWs7CisKKwkvKiBjYXNlIFNQSURFUl9ORVRfR0RUUlNFUklOVDogcHJvYmxlbSwgcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dERFJTRVJJTlQ6IHByb2JsZW0sIHByaW50IGEgbWVzc2FnZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HRENSU0VSSU5UOiBwcm9ibGVtLCBwcmludCBhIG1lc3NhZ2UgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR0RCUlNFUklOVDogcHJvYmxlbSwgcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dEQVJTRVJJTlQ6IHByb2JsZW0sIHByaW50IGEgbWVzc2FnZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HRFNFUklOVDogcHJvYmxlbSwgcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dEVFBURVJJTlQ6IHByb2JsZW0sIHByaW50IGEgbWVzc2FnZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HRERQVEVSSU5UOiBwcm9ibGVtLCBwcmludCBhIG1lc3NhZ2UgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR0RDUFRFUklOVDogcHJvYmxlbSwgcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dEQlBURVJJTlQ6IHByb2JsZW0sIHByaW50IGEgbWVzc2FnZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HREFQVEVSSU5UOiBwcm9ibGVtLCBwcmludCBhIG1lc3NhZ2UgKi8KKwlkZWZhdWx0OgorCQlzaG93X2Vycm9yID0gMTsKKwkJYnJlYWs7CisJfQorCisJLyogY2hlY2sgR0hJSU5UMlNUUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJaWYgKGVycm9yX3JlZzIpCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQkJaWYgKGVycm9yX3JlZzIgJiAoMTw8aSkpCisJCQkJc3dpdGNoIChpKQorCXsKKwkvKiB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbiAod2FudCAgdG8pIGRvIGF0IHRoaXMgdGltZS4gTG9nIGEKKwkgKiBtZXNzYWdlLCB3ZSBjYW4gc3dpdGNoIG9uIGFuZCBvZmYgdGhlIHNwZWNpZmljIHZhbHVlcyBsYXRlciBvbgorCWNhc2UgU1BJREVSX05FVF9HUFJPUEVSSU5UOgorCWNhc2UgU1BJREVSX05FVF9HTUNUQ1JTTkdJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dNQ1RMQ09MSU5UOgorCWNhc2UgU1BJREVSX05FVF9HTUNUVE1PVElOVDoKKwljYXNlIFNQSURFUl9ORVRfR01DUkNBRVJJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dNQ1JDQUxFUklOVDoKKwljYXNlIFNQSURFUl9ORVRfR01DUkFMTkVSSU5UOgorCWNhc2UgU1BJREVSX05FVF9HTUNST1ZSSU5UOgorCWNhc2UgU1BJREVSX05FVF9HTUNSUk5USU5UOgorCWNhc2UgU1BJREVSX05FVF9HTUNSUlhFUklOVDoKKwljYXNlIFNQSURFUl9ORVRfR1RJVENTRVJJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dUSUZNVEVSSU5UOgorCWNhc2UgU1BJREVSX05FVF9HVElQS1RSVktJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dUSVNQSU5HSU5UOgorCWNhc2UgU1BJREVSX05FVF9HVElTQUROR0lOVDoKKwljYXNlIFNQSURFUl9ORVRfR1RJU1BETkdJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dSSUZNVEVSSU5UOgorCWNhc2UgU1BJREVSX05FVF9HUklQS1RSVktJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dSSVNQSU5HSU5UOgorCWNhc2UgU1BJREVSX05FVF9HUklTQUROR0lOVDoKKwljYXNlIFNQSURFUl9ORVRfR1JJU1BETkdJTlQ6CisJCWJyZWFrOworCSovCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlpZiAoKHNob3dfZXJyb3IpICYmIChuZXRpZl9tc2dfaW50cihjYXJkKSkpCisJCXByX2VycigiR290IGVycm9yIGludGVycnVwdCwgR0hJSU5UMFNUUyA9IDB4JTA4eCwgIgorCQkgICAgICAgIkdISUlOVDFTVFMgPSAweCUwOHgsIEdISUlOVDJTVFMgPSAweCUwOHhcbiIsCisJCSAgICAgICBzdGF0dXNfcmVnLCBlcnJvcl9yZWcxLCBlcnJvcl9yZWcyKTsKKworCS8qIGNsZWFyIGludGVycnVwdCBzb3VyY2VzICovCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HSElJTlQxU1RTLCBlcnJvcl9yZWcxKTsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDJTVFMsIGVycm9yX3JlZzIpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfaW50ZXJydXB0IC0gaW50ZXJydXB0IGhhbmRsZXIgZm9yIHNwaWRlcl9uZXQKKyAqIEBpcnE6IGludGVydXB0IG51bWJlcgorICogQHB0cjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKiBAcmVnczogUFUgcmVnaXN0ZXJzCisgKgorICogcmV0dXJucyBJUlFfSEFORExFRCwgaWYgaW50ZXJydXB0IHdhcyBmb3IgZHJpdmVyLCBvciBJUlFfTk9ORSwgaWYgbm8KKyAqIGludGVycnVwdCBmb3VuZCByYWlzZWQgYnkgY2FyZC4KKyAqCisgKiBUaGlzIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgdGhhdCB0dXJucyBvZmYKKyAqIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlIGFuZCBtYWtlcyB0aGUgc3RhY2sgcG9sbCB0aGUgZHJpdmVyCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorc3BpZGVyX25ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqcHRyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHRyOworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUzMiBzdGF0dXNfcmVnOworCisJc3RhdHVzX3JlZyA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HSElJTlQwU1RTKTsKKworCWlmICghc3RhdHVzX3JlZykKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKHN0YXR1c19yZWcgJiBTUElERVJfTkVUX1RYSU5UKQorCQlzcGlkZXJfbmV0X3JlbGVhc2VfdHhfY2hhaW4oY2FyZCwgMCk7CisKKwlpZiAoc3RhdHVzX3JlZyAmIFNQSURFUl9ORVRfUlhJTlQgKSB7CisJCXNwaWRlcl9uZXRfcnhfaXJxX29mZihjYXJkKTsKKwkJbmV0aWZfcnhfc2NoZWR1bGUobmV0ZGV2KTsKKwl9CisKKwkvKiB3ZSBkbyB0aGlzIGFmdGVyIHJ4IGFuZCB0eCBwcm9jZXNzaW5nLCBhcyB3ZSB3YW50IHRoZSB0eCBjaGFpbgorCSAqIHByb2Nlc3NlZCB0byBzZWUsIHdoZXRoZXIgd2Ugc2hvdWxkIHJlc3RhcnQgdHggZG1hIHByb2Nlc3NpbmcgKi8KKwlzcGlkZXJfbmV0X2hhbmRsZV9lcnJvcl9pcnEoY2FyZCwgc3RhdHVzX3JlZyk7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc291cmNlcyAqLworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UMFNUUywgc3RhdHVzX3JlZyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoqCisgKiBzcGlkZXJfbmV0X3BvbGxfY29udHJvbGxlciAtIGFydGlmaWNpYWwgaW50ZXJydXB0IGZvciBuZXRjb25zb2xlIGV0Yy4KKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogc2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXRjb25zb2xlLnR4dAorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlkaXNhYmxlX2lycShuZXRkZXYtPmlycSk7CisJc3BpZGVyX25ldF9pbnRlcnJ1cHQobmV0ZGV2LT5pcnEsIG5ldGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShuZXRkZXYtPmlycSk7Cit9CisjZW5kaWYgLyogQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgKi8KKworLyoqCisgKiBzcGlkZXJfbmV0X2luaXRfY2FyZCAtIGluaXRpYWxpemVzIHRoZSBjYXJkCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiBzcGlkZXJfbmV0X2luaXRfY2FyZCBpbml0aWFsaXplcyB0aGUgY2FyZCBzbyB0aGF0IG90aGVyIHJlZ2lzdGVycyBjYW4KKyAqIGJlIHVzZWQKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfaW5pdF9jYXJkKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9DS1JDVFJMLAorCQkJICAgICBTUElERVJfTkVUX0NLUkNUUkxfU1RPUF9WQUxVRSk7CisKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0NLUkNUUkwsCisJCQkgICAgIFNQSURFUl9ORVRfQ0tSQ1RSTF9SVU5fVkFMVUUpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZW5hYmxlX2NhcmQgLSBlbmFibGVzIHRoZSBjYXJkIGJ5IHNldHRpbmcgYWxsIGtpbmRzIG9mIHJlZ3MKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHNwaWRlcl9uZXRfZW5hYmxlX2NhcmQgc2V0cyBhIGxvdCBvZiBTTU1JTyByZWdpc3RlcnMgdG8gZW5hYmxlIHRoZSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfZW5hYmxlX2NhcmQoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwlpbnQgaTsKKwkvKiB0aGUgZm9sbG93aW5nIGFycmF5IGNvbnNpc3RzIG9mIChyZWdpc3RlciksKHZhbHVlKSBwYWlycworCSAqIHRoYXQgYXJlIHNldCBpbiB0aGlzIGZ1bmN0aW9uLiBBIHJlZ2lzdGVyIG9mIDAgZW5kcyB0aGUgbGlzdCAqLworCXUzMiByZWdzW11bMl0gPSB7CisJCXsgU1BJREVSX05FVF9HUkVTVU1JTlROVU0sIDAgfSwKKwkJeyBTUElERVJfTkVUX0dSRUlOVE5VTSwgMCB9LAorCisJCS8qIHNldCBpbnRlcnJ1cHQgZnJhbWUgbnVtYmVyIHJlZ2lzdGVycyAqLworCQkvKiBjbGVhciB0aGUgc2luZ2xlIERNQSBlbmdpbmUgcmVnaXN0ZXJzIGZpcnN0ICovCisJCXsgU1BJREVSX05FVF9HRkFGUk1OVU0sIFNQSURFUl9ORVRfR0ZYRlJBTUVTX1ZBTFVFIH0sCisJCXsgU1BJREVSX05FVF9HRkJGUk1OVU0sIFNQSURFUl9ORVRfR0ZYRlJBTUVTX1ZBTFVFIH0sCisJCXsgU1BJREVSX05FVF9HRkNGUk1OVU0sIFNQSURFUl9ORVRfR0ZYRlJBTUVTX1ZBTFVFIH0sCisJCXsgU1BJREVSX05FVF9HRkRGUk1OVU0sIFNQSURFUl9ORVRfR0ZYRlJBTUVTX1ZBTFVFIH0sCisJCS8qIHRoZW4gc2V0LCB3aGF0IHdlIHJlYWxseSBuZWVkICovCisJCXsgU1BJREVSX05FVF9HRkZSTU5VTSwgU1BJREVSX05FVF9GUkFNRU5VTV9WQUxVRSB9LAorCisJCS8qIHRpbWVyIGNvdW50ZXIgcmVnaXN0ZXJzIGFuZCBzdHVmZiAqLworCQl7IFNQSURFUl9ORVRfR0ZSRUVDTk5VTSwgMCB9LAorCQl7IFNQSURFUl9ORVRfR09ORVRJTUVOVU0sIDAgfSwKKwkJeyBTUElERVJfTkVUX0dUT1VURlJNTlVNLCAwIH0sCisKKwkJLyogUlggbW9kZSBzZXR0aW5nICovCisJCXsgU1BJREVSX05FVF9HUlhNRFNFVCwgU1BJREVSX05FVF9SWE1PREVfVkFMVUUgfSwKKwkJLyogVFggbW9kZSBzZXR0aW5nICovCisJCXsgU1BJREVSX05FVF9HVFhNRFNFVCwgU1BJREVSX05FVF9UWE1PREVfVkFMVUUgfSwKKwkJLyogSVBTRUMgbW9kZSBzZXR0aW5nICovCisJCXsgU1BJREVSX05FVF9HSVBTRUNJTklULCBTUElERVJfTkVUX0lQU0VDSU5JVF9WQUxVRSB9LAorCisJCXsgU1BJREVSX05FVF9HRlRSRVNUUlQsIFNQSURFUl9ORVRfUkVTVEFSVF9WQUxVRSB9LAorCisJCXsgU1BJREVSX05FVF9HTVJXT0xDVFJMLCAwIH0sCisJCXsgU1BJREVSX05FVF9HVEVTVE1ELCAwIH0sCisKKwkJeyBTUElERVJfTkVUX0dNQUNJTlRFTiwgMCB9LAorCisJCS8qIGZsb3cgY29udHJvbCBzdHVmZiAqLworCQl7IFNQSURFUl9ORVRfR01BQ0FQQVVTRSwgU1BJREVSX05FVF9NQUNBUEFVU0VfVkFMVUUgfSwKKwkJeyBTUElERVJfTkVUX0dNQUNUWFBBVVNFLCBTUElERVJfTkVUX1RYUEFVU0VfVkFMVUUgfSwKKworCQl7IFNQSURFUl9ORVRfR01BQ0JTVExNVCwgU1BJREVSX05FVF9CVVJTVExNVF9WQUxVRSB9LAorCQl7IDAsIDB9CisJfTsKKworCWkgPSAwOworCXdoaWxlIChyZWdzW2ldWzBdKSB7CisJCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIHJlZ3NbaV1bMF0sIHJlZ3NbaV1bMV0pOworCQlpKys7CisJfQorCisJLyogY2xlYXIgdW5pY2FzdCBmaWx0ZXIgdGFibGUgZW50cmllcyAxIHRvIDE0ICovCisJZm9yIChpID0gMTsgaSA8PSAxNDsgaSsrKSB7CisJCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsCisJCQkJICAgICBTUElERVJfTkVUX0dNUlVBRklMblIgKyBpICogOCwKKwkJCQkgICAgIDB4MDAwODAwMDApOworCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLAorCQkJCSAgICAgU1BJREVSX05FVF9HTVJVQUZJTG5SICsgaSAqIDggKyA0LAorCQkJCSAgICAgMHgwMDAwMDAwMCk7CisJfQorCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HTVJVQTBGSUwxNVIsIDB4MDgwODAwMDApOworCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9FQ01PREUsIFNQSURFUl9ORVRfRUNNT0RFX1ZBTFVFKTsKKworCS8qIHNldCBjaGFpbiB0YWlsIGFkcmVzcyBmb3IgUlggY2hhaW5zIGFuZAorCSAqIGVuYWJsZSBETUEgKi8KKwlzcGlkZXJfbmV0X2VuYWJsZV9yeGNodGFpbHMoY2FyZCk7CisJc3BpZGVyX25ldF9lbmFibGVfcnhkbWFjKGNhcmQpOworCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HUlhETUFFTiwgU1BJREVSX05FVF9XT0xfVkFMVUUpOworCisJLyogc2V0IGNoYWluIHRhaWwgYWRyZXNzIGZvciBUWCBjaGFpbiAqLworCXNwaWRlcl9uZXRfZW5hYmxlX3R4ZG1hYyhjYXJkKTsKKworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01BQ0xFTkxNVCwKKwkJCSAgICAgU1BJREVSX05FVF9MRU5MTVRfVkFMVUUpOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01BQ01PREUsCisJCQkgICAgIFNQSURFUl9ORVRfTUFDTU9ERV9WQUxVRSk7CisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HTUFDT1BFTUQsCisJCQkgICAgIFNQSURFUl9ORVRfT1BNT0RFX1ZBTFVFKTsKKworCS8qIHNldCBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcnMgKi8KKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDBNU0ssCisJCQkgICAgIFNQSURFUl9ORVRfSU5UMF9NQVNLX1ZBTFVFKTsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDFNU0ssCisJCQkgICAgIFNQSURFUl9ORVRfSU5UMV9NQVNLX1ZBTFVFKTsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDJNU0ssCisJCQkgICAgIFNQSURFUl9ORVRfSU5UMl9NQVNLX1ZBTFVFKTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X29wZW4gLSBjYWxsZWQgdXBvbiBpZm9uZmlnIHVwCisgKiBAbmV0ZGV2OiBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlCisgKgorICogc3BpZGVyX25ldF9vcGVuIGFsbG9jYXRlcyBhbGwgdGhlIGRlc2NyaXB0b3JzIGFuZCBtZW1vcnkgbmVlZGVkIGZvcgorICogb3BlcmF0aW9uLCBzZXRzIHVwIG11bHRpY2FzdCBsaXN0IGFuZCBlbmFibGVzIGludGVycnVwdHMKKyAqLworaW50CitzcGlkZXJfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoc3BpZGVyX25ldF9pbml0X2NoYWluKGNhcmQsICZjYXJkLT50eF9jaGFpbiwKKwkJCSAgY2FyZC0+ZGVzY3IsIHR4X2Rlc2NyaXB0b3JzKSkKKwkJZ290byBhbGxvY190eF9mYWlsZWQ7CisJaWYgKHNwaWRlcl9uZXRfaW5pdF9jaGFpbihjYXJkLCAmY2FyZC0+cnhfY2hhaW4sCisJCQkgIGNhcmQtPmRlc2NyICsgdHhfZGVzY3JpcHRvcnMsIHJ4X2Rlc2NyaXB0b3JzKSkKKwkJZ290byBhbGxvY19yeF9mYWlsZWQ7CisKKwkvKiBhbGxvY2F0ZSByeCBza2JzICovCisJaWYgKHNwaWRlcl9uZXRfYWxsb2Nfcnhfc2ticyhjYXJkKSkKKwkJZ290byBhbGxvY19za2JzX2ZhaWxlZDsKKworCXNwaWRlcl9uZXRfc2V0X211bHRpKG5ldGRldik7CisKKwkvKiBmdXJ0aGVyIGVuaGFuY2VtZW50OiBzZXR1cCBodyB2bGFuLCBpZiBuZWVkZWQgKi8KKworCXJlc3VsdCA9IC1FQlVTWTsKKwlpZiAocmVxdWVzdF9pcnEobmV0ZGV2LT5pcnEsIHNwaWRlcl9uZXRfaW50ZXJydXB0LAorCQkJICAgICBTQV9TSElSUSwgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpKQorCQlnb3RvIHJlZ2lzdGVyX2ludF9mYWlsZWQ7CisKKwlzcGlkZXJfbmV0X2VuYWJsZV9jYXJkKGNhcmQpOworCisJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKwluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CisJbmV0aWZfcG9sbF9lbmFibGUobmV0ZGV2KTsKKworCXJldHVybiAwOworCityZWdpc3Rlcl9pbnRfZmFpbGVkOgorCXNwaWRlcl9uZXRfZnJlZV9yeF9jaGFpbl9jb250ZW50cyhjYXJkKTsKK2FsbG9jX3NrYnNfZmFpbGVkOgorCXNwaWRlcl9uZXRfZnJlZV9jaGFpbihjYXJkLCAmY2FyZC0+cnhfY2hhaW4pOworYWxsb2NfcnhfZmFpbGVkOgorCXNwaWRlcl9uZXRfZnJlZV9jaGFpbihjYXJkLCAmY2FyZC0+dHhfY2hhaW4pOworYWxsb2NfdHhfZmFpbGVkOgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9zZXR1cF9waHkgLSBzZXR1cCBQSFkKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlCisgKgorICogc3BpZGVyX25ldF9zZXR1cF9waHkgaXMgdXNlZCBhcyBwYXJ0IG9mIHNwaWRlcl9uZXRfcHJvYmUuIFNldHMKKyAqIHRoZSBQSFkgdG8gMTAwMCBNYnBzCisgKiovCitzdGF0aWMgaW50CitzcGlkZXJfbmV0X3NldHVwX3BoeShzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBtaWlfcGh5ICpwaHkgPSAmY2FyZC0+cGh5OworCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HRFRETUFTRUwsCisJCQkgICAgIFNQSURFUl9ORVRfRE1BU0VMX1ZBTFVFKTsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dQQ0NUUkwsCisJCQkgICAgIFNQSURFUl9ORVRfUEhZX0NUUkxfVkFMVUUpOworCXBoeS0+bWlpX2lkID0gMTsKKwlwaHktPmRldiA9IGNhcmQtPm5ldGRldjsKKwlwaHktPm1kaW9fcmVhZCA9IHNwaWRlcl9uZXRfcmVhZF9waHk7CisJcGh5LT5tZGlvX3dyaXRlID0gc3BpZGVyX25ldF93cml0ZV9waHk7CisKKwltaWlfcGh5X3Byb2JlKHBoeSwgcGh5LT5taWlfaWQpOworCisJaWYgKHBoeS0+ZGVmLT5vcHMtPnNldHVwX2ZvcmNlZCkKKwkJcGh5LT5kZWYtPm9wcy0+c2V0dXBfZm9yY2VkKHBoeSwgU1BFRURfMTAwMCwgRFVQTEVYX0ZVTEwpOworCisJLyogdGhlIGZvbGxvd2luZyB0d28gd3JpdGVzIGNvdWxkIGJlIG1vdmVkIHRvIHN1bmdlbV9waHkuYyAqLworCS8qIGVuYWJsZSBmaWJlciBtb2RlICovCisJc3BpZGVyX25ldF93cml0ZV9waHkoY2FyZC0+bmV0ZGV2LCAxLCBNSUlfTkNPTkZJRywgMHg5MDIwKTsKKwkvKiBMRURzIGFjdGl2ZSBpbiBib3RoIG1vZGVzLCBhdXRvc2Vuc2UgcHJpbyA9IGZpYmVyICovCisJc3BpZGVyX25ldF93cml0ZV9waHkoY2FyZC0+bmV0ZGV2LCAxLCBNSUlfTkNPTkZJRywgMHg5NDVmKTsKKworCXBoeS0+ZGVmLT5vcHMtPnJlYWRfbGluayhwaHkpOworCXByX2luZm8oIkZvdW5kICVzIHdpdGggJWkgTWJwcywgJXMtZHVwbGV4LlxuIiwgcGh5LT5kZWYtPm5hbWUsCisJCXBoeS0+c3BlZWQsIHBoeS0+ZHVwbGV4PT0xID8gIkZ1bGwiIDogIkhhbGYiKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZG93bmxvYWRfZmlybXdhcmUgLSBsb2FkcyBmaXJtd2FyZSBpbnRvIHRoZSBhZGFwdGVyCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqIEBmaXJtd2FyZTogZmlybXdhcmUgcG9pbnRlcgorICoKKyAqIHNwaWRlcl9uZXRfZG93bmxvYWRfZmlybXdhcmUgbG9hZHMgdGhlIGZpcm13YXJlIG9wZW5lZCBieQorICogc3BpZGVyX25ldF9pbml0X2Zpcm13YXJlIGludG8gdGhlIGFkYXB0ZXIuCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmUpCit7CisJaW50IHNlcXVlbmNlciwgaTsKKwl1MzIgKmZ3X3B0ciA9ICh1MzIgKilmaXJtd2FyZS0+ZGF0YTsKKworCS8qIHN0b3Agc2VxdWVuY2VycyAqLworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR1NJTklULAorCQkJICAgICBTUElERVJfTkVUX1NUT1BfU0VRX1ZBTFVFKTsKKworCWZvciAoc2VxdWVuY2VyID0gMDsgc2VxdWVuY2VyIDwgNjsgc2VxdWVuY2VyKyspIHsKKwkJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwKKwkJCQkgICAgIFNQSURFUl9ORVRfR1NuUFJHQURSICsgc2VxdWVuY2VyICogOCwgMCk7CisJCWZvciAoaSA9IDA7IGkgPCBTUElERVJfTkVUX0ZJUk1XQVJFX0xFTjsgaSsrKSB7CisJCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dTblBSR0RBVCArCisJCQkJCSAgICAgc2VxdWVuY2VyICogOCwgKmZ3X3B0cik7CisJCQlmd19wdHIrKzsKKwkJfQorCX0KKworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR1NJTklULAorCQkJICAgICBTUElERVJfTkVUX1JVTl9TRVFfVkFMVUUpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfaW5pdF9maXJtd2FyZSAtIHJlYWRzIGluIGZpcm13YXJlIHBhcnRzCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZQorICoKKyAqIHNwaWRlcl9uZXRfaW5pdF9maXJtd2FyZSBvcGVucyB0aGUgc2VxdWVuY2VyIGZpcm13YXJlIGFuZCBkb2VzIHNvbWUgYmFzaWMKKyAqIGNoZWNrcy4gVGhpcyBmdW5jdGlvbiBvcGVucyBhbmQgcmVsZWFzZXMgdGhlIGZpcm13YXJlIHN0cnVjdHVyZS4gQSBjYWxsCisgKiB0byBkb3dubG9hZCB0aGUgZmlybXdhcmUgaXMgcGVyZm9ybWVkIGJlZm9yZSB0aGUgcmVsZWFzZS4KKyAqCisgKiBGaXJtd2FyZSBmb3JtYXQKKyAqID09PT09PT09PT09PT09PQorICogc3BpZGVyX2Z3LmJpbiBpcyBleHBlY3RlZCB0byBiZSBhIGZpbGUgY29udGFpbmluZyA2KjEwMjQqNCBieXRlcywgNGsgYmVpbmcKKyAqIHRoZSBwcm9ncmFtIGZvciBlYWNoIHNlcXVlbmNlci4gVXNlIHRoZSBjb21tYW5kCisgKiAgICB0YWlsIC1xIC1uICsyIFNlcV9jb2RlMV8weDA4OC50eHQgU2VxX2NvZGUyXzB4MDkwLnR4dCAgICAgICAgICAgICAgXAorICogICAgICAgICBTZXFfY29kZTNfMHgwOTgudHh0IFNlcV9jb2RlNF8weDBBMC50eHQgU2VxX2NvZGU1XzB4MEE4LnR4dCAgIFwKKyAqICAgICAgICAgU2VxX2NvZGU2XzB4MEIwLnR4dCB8IHh4ZCAtciAtcCAtYzQgPiBzcGlkZXJfZncuYmluCisgKgorICogdG8gZ2VuZXJhdGUgc3BpZGVyX2Z3LmJpbiwgaWYgeW91IGhhdmUgc2VxdWVuY2VyIHByb2dyYW1zIHdpdGggc29tZXRoaW5nCisgKiBsaWtlIHRoZSBmb2xsb3dpbmcgY29udGVudHMgZm9yIGVhY2ggc2VxdWVuY2VyOgorICogICAgPE9ORSBMSU5FIENPTU1FTlQ+CisgKiAgICA8RklSU1QgNC1CWVRFUy1XT1JEIEZPUiBTRVFVRU5DRVI+CisgKiAgICA8U0VDT05EIDQtQllURVMtV09SRCBGT1IgU0VRVUVOQ0VSPgorICogICAgIC4uLgorICogICAgPDEwMjR0aCA0LUJZVEVTLVdPUkQgRk9SIFNFUVVFTkNFUj4KKyAqLworc3RhdGljIGludAorc3BpZGVyX25ldF9pbml0X2Zpcm13YXJlKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKKwlpbnQgZXJyID0gLUVJTzsKKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmaXJtd2FyZSwKKwkJCSAgICAgU1BJREVSX05FVF9GSVJNV0FSRV9OQU1FLCAmY2FyZC0+cGRldi0+ZGV2KSA8IDApIHsKKwkJaWYgKG5ldGlmX21zZ19wcm9iZShjYXJkKSkKKwkJCXByX2VycigiQ291bGRuJ3QgcmVhZCBpbiBzZXF1ZW5jZXIgZGF0YSBmaWxlICVzLlxuIiwKKwkJCSAgICAgICBTUElERVJfTkVUX0ZJUk1XQVJFX05BTUUpOworCQlmaXJtd2FyZSA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChmaXJtd2FyZS0+c2l6ZSAhPSA2ICogU1BJREVSX05FVF9GSVJNV0FSRV9MRU4gKiBzaXplb2YodTMyKSkgeworCQlpZiAobmV0aWZfbXNnX3Byb2JlKGNhcmQpKQorCQkJcHJfZXJyKCJJbnZhbGlkIHNpemUgb2Ygc2VxdWVuY2VyIGRhdGEgZmlsZSAlcy5cbiIsCisJCQkgICAgICAgU1BJREVSX05FVF9GSVJNV0FSRV9OQU1FKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3BpZGVyX25ldF9kb3dubG9hZF9maXJtd2FyZShjYXJkLCBmaXJtd2FyZSk7CisKKwllcnIgPSAwOworb3V0OgorCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3dvcmthcm91bmRfcnhyYW1mdWxsIC0gd29yayBhcm91bmQgZmlybXdhcmUgYnVnCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiBubyByZXR1cm4gdmFsdWUKKyAqKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3dvcmthcm91bmRfcnhyYW1mdWxsKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJaW50IGksIHNlcXVlbmNlciA9IDA7CisKKwkvKiBjYW5jZWwgcmVzZXQgKi8KKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0NLUkNUUkwsCisJCQkgICAgIFNQSURFUl9ORVRfQ0tSQ1RSTF9SVU5fVkFMVUUpOworCisJLyogZW1wdHkgc2VxdWVuY2VyIGRhdGEgKi8KKwlmb3IgKHNlcXVlbmNlciA9IDA7IHNlcXVlbmNlciA8IDY7IHNlcXVlbmNlcisrKSB7CisJCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR1NuUFJHREFUICsKKwkJCQkgICAgIHNlcXVlbmNlciAqIDgsIDB4MCk7CisJCWZvciAoaSA9IDA7IGkgPCBTUElERVJfTkVUX0ZJUk1XQVJFX0xFTjsgaSsrKSB7CisJCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dTblBSR0RBVCArCisJCQkJCSAgICAgc2VxdWVuY2VyICogOCwgMHgwKTsKKwkJfQorCX0KKworCS8qIHNldCBzZXF1ZW5jZXIgb3BlcmF0aW9uICovCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HU0lOSVQsIDB4MDAwMDAwZmUpOworCisJLyogcmVzZXQgKi8KKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0NLUkNUUkwsCisJCQkgICAgIFNQSURFUl9ORVRfQ0tSQ1RSTF9TVE9QX1ZBTFVFKTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3R4X3RpbWVvdXRfdGFzayAtIHRhc2sgc2NoZWR1bGVkIGJ5IHRoZSB3YXRjaGRvZyB0aW1lb3V0CisgKiBmdW5jdGlvbiAodG8gYmUgY2FsbGVkIG5vdCB1bmRlciBpbnRlcnJ1cHQgc3RhdHVzKQorICogQGRhdGE6IGRhdGEsIGlzIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogY2FsbGVkIGFzIHRhc2sgd2hlbiB0eCBoYW5ncywgcmVzZXRzIGludGVyZmFjZSAoaWYgaW50ZXJmYWNlIGlzIHVwKQorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF90eF90aW1lb3V0X3Rhc2sodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGF0YTsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmICghKG5ldGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQlnb3RvIG91dDsKKworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKwlzcGlkZXJfbmV0X3N0b3AobmV0ZGV2KTsKKworCXNwaWRlcl9uZXRfd29ya2Fyb3VuZF9yeHJhbWZ1bGwoY2FyZCk7CisJc3BpZGVyX25ldF9pbml0X2NhcmQoY2FyZCk7CisKKwlpZiAoc3BpZGVyX25ldF9zZXR1cF9waHkoY2FyZCkpCisJCWdvdG8gb3V0OworCWlmIChzcGlkZXJfbmV0X2luaXRfZmlybXdhcmUoY2FyZCkpCisJCWdvdG8gb3V0OworCisJc3BpZGVyX25ldF9vcGVuKG5ldGRldik7CisJc3BpZGVyX25ldF9raWNrX3R4X2RtYShjYXJkLCBjYXJkLT50eF9jaGFpbi5oZWFkKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CisKK291dDoKKwlhdG9taWNfZGVjKCZjYXJkLT50eF90aW1lb3V0X3Rhc2tfY291bnRlcik7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF90eF90aW1lb3V0IC0gY2FsbGVkIHdoZW4gdGhlIHR4IHRpbWVvdXQgd2F0Y2hkb2cga2lja3MgaW4uCisgKiBAbmV0ZGV2OiBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIGNhbGxlZCwgaWYgdHggaGFuZ3MuIFNjaGVkdWxlcyBhIHRhc2sgdGhhdCByZXNldHMgdGhlIGludGVyZmFjZQorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZDsKKworCWNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWF0b21pY19pbmMoJmNhcmQtPnR4X3RpbWVvdXRfdGFza19jb3VudGVyKTsKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJc2NoZWR1bGVfd29yaygmY2FyZC0+dHhfdGltZW91dF90YXNrKTsKKwllbHNlCisJCWF0b21pY19kZWMoJmNhcmQtPnR4X3RpbWVvdXRfdGFza19jb3VudGVyKTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3NldHVwX25ldGRldl9vcHMgLSBpbml0aWFsaXphdGlvbiBvZiBuZXRfZGV2aWNlIG9wZXJhdGlvbnMKKyAqIEBuZXRkZXY6IG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogZmlsbHMgb3V0IGZ1bmN0aW9uIHBvaW50ZXJzIGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9zZXR1cF9uZXRkZXZfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJbmV0ZGV2LT5vcGVuID0gJnNwaWRlcl9uZXRfb3BlbjsKKwluZXRkZXYtPnN0b3AgPSAmc3BpZGVyX25ldF9zdG9wOworCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0gJnNwaWRlcl9uZXRfeG1pdDsKKwluZXRkZXYtPmdldF9zdGF0cyA9ICZzcGlkZXJfbmV0X2dldF9zdGF0czsKKwluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzcGlkZXJfbmV0X3NldF9tdWx0aTsKKwluZXRkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZzcGlkZXJfbmV0X3NldF9tYWM7CisJbmV0ZGV2LT5jaGFuZ2VfbXR1ID0gJnNwaWRlcl9uZXRfY2hhbmdlX210dTsKKwluZXRkZXYtPmRvX2lvY3RsID0gJnNwaWRlcl9uZXRfZG9faW9jdGw7CisJLyogdHggd2F0Y2hkb2cgKi8KKwluZXRkZXYtPnR4X3RpbWVvdXQgPSAmc3BpZGVyX25ldF90eF90aW1lb3V0OworCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSBTUElERVJfTkVUX1dBVENIRE9HX1RJTUVPVVQ7CisJLyogTkFQSSAqLworCW5ldGRldi0+cG9sbCA9ICZzcGlkZXJfbmV0X3BvbGw7CisJbmV0ZGV2LT53ZWlnaHQgPSBTUElERVJfTkVUX05BUElfV0VJR0hUOworCS8qIEhXIFZMQU4gKi8KKwluZXRkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSAmc3BpZGVyX25ldF92bGFuX3J4X3JlZzsKKwluZXRkZXYtPnZsYW5fcnhfYWRkX3ZpZCA9ICZzcGlkZXJfbmV0X3ZsYW5fcnhfYWRkOworCW5ldGRldi0+dmxhbl9yeF9raWxsX3ZpZCA9ICZzcGlkZXJfbmV0X3ZsYW5fcnhfa2lsbDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS8qIHBvbGwgY29udHJvbGxlciAqLworCW5ldGRldi0+cG9sbF9jb250cm9sbGVyID0gJnNwaWRlcl9uZXRfcG9sbF9jb250cm9sbGVyOworI2VuZGlmIC8qIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSICovCisJLyogZXRodG9vbCBvcHMgKi8KKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJnNwaWRlcl9uZXRfZXRodG9vbF9vcHM7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9zZXR1cF9uZXRkZXYgLSBpbml0aWFsaXphdGlvbiBvZiBuZXRfZGV2aWNlCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciA8MCBvbiBmYWlsdXJlCisgKgorICogc3BpZGVyX25ldF9zZXR1cF9uZXRkZXYgaW5pdGlhbGl6ZXMgdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiovCitzdGF0aWMgaW50CitzcGlkZXJfbmV0X3NldHVwX25ldGRldihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGNhcmQtPm5ldGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCXN0cnVjdCBzb2NrYWRkciBhZGRyOworCXU4ICptYWM7CisKKwlTRVRfTU9EVUxFX09XTkVSKG5ldGRldik7CisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmY2FyZC0+cGRldi0+ZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShjYXJkLT5wZGV2LCBuZXRkZXYpOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5pbnRtYXNrX2xvY2spOworCW5ldGRldi0+aXJxID0gY2FyZC0+cGRldi0+aXJxOworCisJY2FyZC0+b3B0aW9ucy5yeF9jc3VtID0gU1BJREVSX05FVF9SWF9DU1VNX0RFRkFVTFQ7CisKKwlzcGlkZXJfbmV0X3NldHVwX25ldGRldl9vcHMobmV0ZGV2KTsKKworCW5ldGRldi0+ZmVhdHVyZXMgPSAwOworCS8qIHNvbWUgdGltZTogTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYIHwKKwkgKgkJTkVUSUZfRl9IV19WTEFOX0ZJTFRFUiAqLworCisJbmV0ZGV2LT5pcnEgPSBjYXJkLT5wZGV2LT5pcnE7CisKKwlkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShjYXJkLT5wZGV2KTsKKwlpZiAoIWRuKQorCQlyZXR1cm4gLUVJTzsKKworCW1hYyA9ICh1OCAqKWdldF9wcm9wZXJ0eShkbiwgImxvY2FsLW1hYy1hZGRyZXNzIiwgTlVMTCk7CisJaWYgKCFtYWMpCisJCXJldHVybiAtRUlPOworCW1lbWNweShhZGRyLnNhX2RhdGEsIG1hYywgRVRIX0FMRU4pOworCisJcmVzdWx0ID0gc3BpZGVyX25ldF9zZXRfbWFjKG5ldGRldiwgJmFkZHIpOworCWlmICgocmVzdWx0KSAmJiAobmV0aWZfbXNnX3Byb2JlKGNhcmQpKSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IE1BQyBhZGRyZXNzOiAlaVxuIiwgcmVzdWx0KTsKKworCXJlc3VsdCA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWlmIChyZXN1bHQpIHsKKwkJaWYgKG5ldGlmX21zZ19wcm9iZShjYXJkKSkKKwkJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgbmV0X2RldmljZTogJWlcbiIsCisJCQkJICByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWlmIChuZXRpZl9tc2dfcHJvYmUoY2FyZCkpCisJCXByX2luZm8oIkluaXRpYWxpemVkIGRldmljZSAlcy5cbiIsIG5ldGRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X2FsbG9jX2NhcmQgLSBhbGxvY2F0ZXMgbmV0X2RldmljZSBhbmQgY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIHRoZSBjYXJkIHN0cnVjdHVyZSBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3JzCisgKgorICogdGhlIGNhcmQgYW5kIG5ldF9kZXZpY2Ugc3RydWN0dXJlcyBhcmUgbGlua2VkIHRvIGVhY2ggb3RoZXIKKyAqLworc3RhdGljIHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKgorc3BpZGVyX25ldF9hbGxvY19jYXJkKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkOworCXNpemVfdCBhbGxvY19zaXplOworCisJYWxsb2Nfc2l6ZSA9IHNpemVvZiAoKmNhcmQpICsKKwkJc2l6ZW9mIChzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcikgKiByeF9kZXNjcmlwdG9ycyArCisJCXNpemVvZiAoc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IpICogdHhfZGVzY3JpcHRvcnM7CisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoYWxsb2Nfc2l6ZSk7CisJaWYgKCFuZXRkZXYpCisJCXJldHVybiBOVUxMOworCisJY2FyZCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJY2FyZC0+bmV0ZGV2ID0gbmV0ZGV2OworCWNhcmQtPm1zZ19lbmFibGUgPSBTUElERVJfTkVUX0RFRkFVTFRfTVNHOworCUlOSVRfV09SSygmY2FyZC0+dHhfdGltZW91dF90YXNrLCBzcGlkZXJfbmV0X3R4X3RpbWVvdXRfdGFzaywgbmV0ZGV2KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT53YWl0cSk7CisJYXRvbWljX3NldCgmY2FyZC0+dHhfdGltZW91dF90YXNrX2NvdW50ZXIsIDApOworCisJcmV0dXJuIGNhcmQ7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF91bmRvX3BjaV9zZXR1cCAtIHJlbGVhc2VzIFBDSSByZXNzb3VyY2VzCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiBzcGlkZXJfbmV0X3VuZG9fcGNpX3NldHVwIHJlbGVhc2VzIHRoZSBtYXBwZWQgcmVnaW9ucworICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF91bmRvX3BjaV9zZXR1cChzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCWlvdW5tYXAoY2FyZC0+cmVncyk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhjYXJkLT5wZGV2KTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3NldHVwX3BjaV9kZXYgLSBzZXRzIHVwIHRoZSBkZXZpY2UgaW4gdGVybXMgb2YgUENJIG9wZXJhdGlvbnMKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICogQHBkZXY6IFBDSSBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIHRoZSBjYXJkIHN0cnVjdHVyZSBvciBOVUxMIGlmIGFueSBlcnJvcnMgb2NjdXIKKyAqCisgKiBzcGlkZXJfbmV0X3NldHVwX3BjaV9kZXYgaW5pdGlhbGl6ZXMgcGRldiBhbmQgdG9nZXRoZXIgd2l0aCB0aGUKKyAqIGZ1bmN0aW9ucyBjYWxsZWQgaW4gc3BpZGVyX25ldF9vcGVuIGNvbmZpZ3VyZXMgdGhlIGRldmljZSBzbyB0aGF0CisgKiBkYXRhIGNhbiBiZSB0cmFuc2ZlcnJlZCBvdmVyIGl0CisgKiBUaGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUgaXMgYXR0YWNoZWQgdG8gdGhlIGNhcmQgc3RydWN0dXJlLCBpZiB0aGUKKyAqIGZ1bmN0aW9uIHJldHVybnMgd2l0aG91dCBlcnJvci4KKyAqKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICoKK3NwaWRlcl9uZXRfc2V0dXBfcGNpX2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkOworCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydCwgbW1pb19sZW47CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJcHJfZXJyKCJDb3VsZG4ndCBlbmFibGUgUENJIGRldmljZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQlwcl9lcnIoIkNvdWxkbid0IGZpbmQgcHJvcGVyIFBDSSBkZXZpY2UgYmFzZSBhZGRyZXNzLlxuIik7CisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2OworCX0KKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIHNwaWRlcl9uZXRfZHJpdmVyX25hbWUpKSB7CisJCXByX2VycigiQ291bGRuJ3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2OworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJY2FyZCA9IHNwaWRlcl9uZXRfYWxsb2NfY2FyZCgpOworCWlmICghY2FyZCkgeworCQlwcl9lcnIoIkNvdWxkbid0IGFsbG9jYXRlIG5ldF9kZXZpY2Ugc3RydWN0dXJlLCAiCisJCQkgICJhYm9ydGluZy5cbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCWNhcmQtPnBkZXYgPSBwZGV2OworCisJLyogZmV0Y2ggYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgZmlyc3QgcmVzb3VyY2UgKi8KKwltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCW1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKworCWNhcmQtPm5ldGRldi0+bWVtX3N0YXJ0ID0gbW1pb19zdGFydDsKKwljYXJkLT5uZXRkZXYtPm1lbV9lbmQgPSBtbWlvX3N0YXJ0ICsgbW1pb19sZW47CisJY2FyZC0+cmVncyA9IGlvcmVtYXAobW1pb19zdGFydCwgbW1pb19sZW4pOworCisJaWYgKCFjYXJkLT5yZWdzKSB7CisJCXByX2VycigiQ291bGRuJ3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uczsKKwl9CisKKwlyZXR1cm4gY2FyZDsKKworb3V0X3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworb3V0X2Rpc2FibGVfZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9wcm9iZSAtIGluaXRpYWxpemF0aW9uIG9mIGEgZGV2aWNlCisgKiBAcGRldjogUENJIGRldmljZQorICogQGVudDogZW50cnkgaW4gdGhlIGRldmljZSBpZCBsaXN0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUKKyAqCisgKiBzcGlkZXJfbmV0X3Byb2JlIGluaXRpYWxpemVzIHBkZXYgYW5kIHJlZ2lzdGVycyBhIG5ldF9kZXZpY2UKKyAqIHN0cnVjdHVyZSBmb3IgaXQuIEFmdGVyIHRoYXQsIHRoZSBkZXZpY2UgY2FuIGJlIGlmY29uZmlnJ2VkIHVwCisgKiovCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc3BpZGVyX25ldF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgZXJyID0gLUVJTzsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkOworCisJY2FyZCA9IHNwaWRlcl9uZXRfc2V0dXBfcGNpX2RldihwZGV2KTsKKwlpZiAoIWNhcmQpCisJCWdvdG8gb3V0OworCisJc3BpZGVyX25ldF93b3JrYXJvdW5kX3J4cmFtZnVsbChjYXJkKTsKKwlzcGlkZXJfbmV0X2luaXRfY2FyZChjYXJkKTsKKworCWVyciA9IHNwaWRlcl9uZXRfc2V0dXBfcGh5KGNhcmQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VuZG9fcGNpOworCisJZXJyID0gc3BpZGVyX25ldF9pbml0X2Zpcm13YXJlKGNhcmQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VuZG9fcGNpOworCisJZXJyID0gc3BpZGVyX25ldF9zZXR1cF9uZXRkZXYoY2FyZCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5kb19wY2k7CisKKwlyZXR1cm4gMDsKKworb3V0X3VuZG9fcGNpOgorCXNwaWRlcl9uZXRfdW5kb19wY2lfc2V0dXAoY2FyZCk7CisJZnJlZV9uZXRkZXYoY2FyZC0+bmV0ZGV2KTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfcmVtb3ZlIC0gcmVtb3ZhbCBvZiBhIGRldmljZQorICogQHBkZXY6IFBDSSBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZQorICoKKyAqIHNwaWRlcl9uZXRfcmVtb3ZlIGlzIGNhbGxlZCB0byByZW1vdmUgdGhlIGRldmljZSBhbmQgdW5yZWdpc3RlcnMgdGhlCisgKiBuZXRfZGV2aWNlCisgKiovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK3NwaWRlcl9uZXRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZDsKKworCW5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwljYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXdhaXRfZXZlbnQoY2FyZC0+d2FpdHEsCisJCSAgIGF0b21pY19yZWFkKCZjYXJkLT50eF90aW1lb3V0X3Rhc2tfY291bnRlcikgPT0gMCk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCisJLyogc3dpdGNoIG9mZiBjYXJkICovCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9DS1JDVFJMLAorCQkJICAgICBTUElERVJfTkVUX0NLUkNUUkxfU1RPUF9WQUxVRSk7CisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9DS1JDVFJMLAorCQkJICAgICBTUElERVJfTkVUX0NLUkNUUkxfUlVOX1ZBTFVFKTsKKworCXNwaWRlcl9uZXRfdW5kb19wY2lfc2V0dXAoY2FyZCk7CisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNwaWRlcl9uZXRfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSBzcGlkZXJfbmV0X2RyaXZlcl9uYW1lLAorCS5pZF90YWJsZQk9IHNwaWRlcl9uZXRfcGNpX3RibCwKKwkucHJvYmUJCT0gc3BpZGVyX25ldF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNwaWRlcl9uZXRfcmVtb3ZlKQorfTsKKworLyoqCisgKiBzcGlkZXJfbmV0X2luaXQgLSBpbml0IGZ1bmN0aW9uIHdoZW4gdGhlIGRyaXZlciBpcyBsb2FkZWQKKyAqCisgKiBzcGlkZXJfbmV0X2luaXQgcmVnaXN0ZXJzIHRoZSBkZXZpY2UgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNwaWRlcl9uZXRfaW5pdCh2b2lkKQoreworCWlmIChyeF9kZXNjcmlwdG9ycyA8IFNQSURFUl9ORVRfUlhfREVTQ1JJUFRPUlNfTUlOKSB7CisJCXJ4X2Rlc2NyaXB0b3JzID0gU1BJREVSX05FVF9SWF9ERVNDUklQVE9SU19NSU47CisJCXByX2luZm8oImFkanVzdGluZyByeCBkZXNjcmlwdG9ycyB0byAlaS5cbiIsIHJ4X2Rlc2NyaXB0b3JzKTsKKwl9CisJaWYgKHJ4X2Rlc2NyaXB0b3JzID4gU1BJREVSX05FVF9SWF9ERVNDUklQVE9SU19NQVgpIHsKKwkJcnhfZGVzY3JpcHRvcnMgPSBTUElERVJfTkVUX1JYX0RFU0NSSVBUT1JTX01BWDsKKwkJcHJfaW5mbygiYWRqdXN0aW5nIHJ4IGRlc2NyaXB0b3JzIHRvICVpLlxuIiwgcnhfZGVzY3JpcHRvcnMpOworCX0KKwlpZiAodHhfZGVzY3JpcHRvcnMgPCBTUElERVJfTkVUX1RYX0RFU0NSSVBUT1JTX01JTikgeworCQl0eF9kZXNjcmlwdG9ycyA9IFNQSURFUl9ORVRfVFhfREVTQ1JJUFRPUlNfTUlOOworCQlwcl9pbmZvKCJhZGp1c3RpbmcgdHggZGVzY3JpcHRvcnMgdG8gJWkuXG4iLCB0eF9kZXNjcmlwdG9ycyk7CisJfQorCWlmICh0eF9kZXNjcmlwdG9ycyA+IFNQSURFUl9ORVRfVFhfREVTQ1JJUFRPUlNfTUFYKSB7CisJCXR4X2Rlc2NyaXB0b3JzID0gU1BJREVSX05FVF9UWF9ERVNDUklQVE9SU19NQVg7CisJCXByX2luZm8oImFkanVzdGluZyB0eCBkZXNjcmlwdG9ycyB0byAlaS5cbiIsIHR4X2Rlc2NyaXB0b3JzKTsKKwl9CisKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc3BpZGVyX25ldF9kcml2ZXIpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfY2xlYW51cCAtIGV4aXQgZnVuY3Rpb24gd2hlbiBkcml2ZXIgaXMgdW5sb2FkZWQKKyAqCisgKiBzcGlkZXJfbmV0X2NsZWFudXAgdW5yZWdpc3RlcnMgdGhlIGRldmljZSBkcml2ZXIKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHNwaWRlcl9uZXRfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc3BpZGVyX25ldF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzcGlkZXJfbmV0X2luaXQpOworbW9kdWxlX2V4aXQoc3BpZGVyX25ldF9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuaCBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmIyZjIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5oCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogTmV0d29yayBkZXZpY2UgZHJpdmVyIGZvciBDZWxsIFByb2Nlc3Nvci1CYXNlZCBCbGFkZQorICoKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDUKKyAqCisgKiBBdXRob3JzIDogVXR6IEJhY2hlciA8dXR6LmJhY2hlckBkZS5pYm0uY29tPgorICogICAgICAgICAgIEplbnMgT3N0ZXJrYW1wIDxKZW5zLk9zdGVya2FtcEBkZS5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX1NQSURFUl9ORVRfSAorI2RlZmluZSBfU1BJREVSX05FVF9ICisKKyNpbmNsdWRlICJzdW5nZW1fcGh5LmgiCisKK2V4dGVybiBpbnQgc3BpZGVyX25ldF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworZXh0ZXJuIGludCBzcGlkZXJfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CisKK2V4dGVybiBzdHJ1Y3QgZXRodG9vbF9vcHMgc3BpZGVyX25ldF9ldGh0b29sX29wczsKKworZXh0ZXJuIGNoYXIgc3BpZGVyX25ldF9kcml2ZXJfbmFtZVtdOworCisjZGVmaW5lIFNQSURFUl9ORVRfTUFYX01UVQkJCTIzMDgKKyNkZWZpbmUgU1BJREVSX05FVF9NSU5fTVRVCQkJNjQKKworI2RlZmluZSBTUElERVJfTkVUX1JYQlVGX0FMSUdOCQkJMTI4CisKKyNkZWZpbmUgU1BJREVSX05FVF9SWF9ERVNDUklQVE9SU19ERUZBVUxUCTY0CisjZGVmaW5lIFNQSURFUl9ORVRfUlhfREVTQ1JJUFRPUlNfTUlOCQkxNgorI2RlZmluZSBTUElERVJfTkVUX1JYX0RFU0NSSVBUT1JTX01BWAkJMjU2CisKKyNkZWZpbmUgU1BJREVSX05FVF9UWF9ERVNDUklQVE9SU19ERUZBVUxUCTY0CisjZGVmaW5lIFNQSURFUl9ORVRfVFhfREVTQ1JJUFRPUlNfTUlOCQkxNgorI2RlZmluZSBTUElERVJfTkVUX1RYX0RFU0NSSVBUT1JTX01BWAkJMjU2CisKKyNkZWZpbmUgU1BJREVSX05FVF9SWF9DU1VNX0RFRkFVTFQJCTEKKworI2RlZmluZSBTUElERVJfTkVUX1dBVENIRE9HX1RJTUVPVVQgNSpIWgorI2RlZmluZSBTUElERVJfTkVUX05BUElfV0VJR0hUIDY0CisKKyNkZWZpbmUgU1BJREVSX05FVF9GSVJNV0FSRV9MRU4JCTEwMjQKKyNkZWZpbmUgU1BJREVSX05FVF9GSVJNV0FSRV9OQU1FCSJzcGlkZXJfZncuYmluIgorCisvKiogc3BpZGVyX25ldCBTTU1JTyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU1BJREVSX05FVF9HSElJTlQwU1RTCQkweDAwMDAwMDAwCisjZGVmaW5lIFNQSURFUl9ORVRfR0hJSU5UMVNUUwkJMHgwMDAwMDAwNAorI2RlZmluZSBTUElERVJfTkVUX0dISUlOVDJTVFMJCTB4MDAwMDAwMDgKKyNkZWZpbmUgU1BJREVSX05FVF9HSElJTlQwTVNLCQkweDAwMDAwMDEwCisjZGVmaW5lIFNQSURFUl9ORVRfR0hJSU5UMU1TSwkJMHgwMDAwMDAxNAorI2RlZmluZSBTUElERVJfTkVUX0dISUlOVDJNU0sJCTB4MDAwMDAwMTgKKworI2RlZmluZSBTUElERVJfTkVUX0dSRVNVTUlOVE5VTQkJMHgwMDAwMDAyMAorI2RlZmluZSBTUElERVJfTkVUX0dSRUlOVE5VTQkJMHgwMDAwMDAyNAorCisjZGVmaW5lIFNQSURFUl9ORVRfR0ZGUk1OVU0JCTB4MDAwMDAwMjgKKyNkZWZpbmUgU1BJREVSX05FVF9HRkFGUk1OVU0JCTB4MDAwMDAwMmMKKyNkZWZpbmUgU1BJREVSX05FVF9HRkJGUk1OVU0JCTB4MDAwMDAwMzAKKyNkZWZpbmUgU1BJREVSX05FVF9HRkNGUk1OVU0JCTB4MDAwMDAwMzQKKyNkZWZpbmUgU1BJREVSX05FVF9HRkRGUk1OVU0JCTB4MDAwMDAwMzgKKworLyogY2xlYXIgdGhlbSAoZG9uJ3QgdXNlIGl0KSAqLworI2RlZmluZSBTUElERVJfTkVUX0dGUkVFQ05OVU0JCTB4MDAwMDAwM2MKKyNkZWZpbmUgU1BJREVSX05FVF9HT05FVElNRU5VTQkJMHgwMDAwMDA0MAorCisjZGVmaW5lIFNQSURFUl9ORVRfR1RPVVRGUk1OVU0JCTB4MDAwMDAwNDQKKworI2RlZmluZSBTUElERVJfTkVUX0dUWE1EU0VUCQkweDAwMDAwMDUwCisjZGVmaW5lIFNQSURFUl9ORVRfR1BDQ1RSTAkJMHgwMDAwMDA1NAorI2RlZmluZSBTUElERVJfTkVUX0dSWE1EU0VUCQkweDAwMDAwMDU4CisjZGVmaW5lIFNQSURFUl9ORVRfR0lQU0VDSU5JVAkJMHgwMDAwMDA1YworI2RlZmluZSBTUElERVJfTkVUX0dGVFJFU1RSVAkJMHgwMDAwMDA2MAorI2RlZmluZSBTUElERVJfTkVUX0dSWERNQUVOCQkweDAwMDAwMDY0CisjZGVmaW5lIFNQSURFUl9ORVRfR01SV09MQ1RSTAkJMHgwMDAwMDA2OAorI2RlZmluZSBTUElERVJfTkVUX0dQQ1dPUENNRAkJMHgwMDAwMDA2YworI2RlZmluZSBTUElERVJfTkVUX0dQQ1JPUENNRAkJMHgwMDAwMDA3MAorI2RlZmluZSBTUElERVJfTkVUX0dUVEZSTUNOVAkJMHgwMDAwMDA3OAorI2RlZmluZSBTUElERVJfTkVUX0dURVNUTUQJCTB4MDAwMDAwN2MKKworI2RlZmluZSBTUElERVJfTkVUX0dTSU5JVAkJMHgwMDAwMDA4MAorI2RlZmluZSBTUElERVJfTkVUX0dTblBSR0FEUgkJMHgwMDAwMDA4NAorI2RlZmluZSBTUElERVJfTkVUX0dTblBSR0RBVAkJMHgwMDAwMDA4OAorCisjZGVmaW5lIFNQSURFUl9ORVRfR01BQ09QRU1ECQkweDAwMDAwMTAwCisjZGVmaW5lIFNQSURFUl9ORVRfR01BQ0xFTkxNVAkJMHgwMDAwMDEwOAorI2RlZmluZSBTUElERVJfTkVUX0dNQUNJTlRFTgkJMHgwMDAwMDExOAorI2RlZmluZSBTUElERVJfTkVUX0dNQUNQSFlDVFJMCQkweDAwMDAwMTIwCisKKyNkZWZpbmUgU1BJREVSX05FVF9HTUFDQVBBVVNFCQkweDAwMDAwMTU0CisjZGVmaW5lIFNQSURFUl9ORVRfR01BQ1RYUEFVU0UJCTB4MDAwMDAxNjQKKworI2RlZmluZSBTUElERVJfTkVUX0dNQUNNT0RFCQkweDAwMDAwMWIwCisjZGVmaW5lIFNQSURFUl9ORVRfR01BQ0JTVExNVAkJMHgwMDAwMDFiNAorCisjZGVmaW5lIFNQSURFUl9ORVRfR01BQ1VOSU1BQ1UJCTB4MDAwMDAxYzAKKyNkZWZpbmUgU1BJREVSX05FVF9HTUFDVU5JTUFDTAkJMHgwMDAwMDFjOAorCisjZGVmaW5lIFNQSURFUl9ORVRfR01STUhGSUxuUgkJMHgwMDAwMDQwMAorI2RlZmluZSBTUElERVJfTkVUX01VTFRJQ0FTVF9IQVNIRVMJMjU2CisKKyNkZWZpbmUgU1BJREVSX05FVF9HTVJVQUZJTG5SCQkweDAwMDAwNTAwCisjZGVmaW5lIFNQSURFUl9ORVRfR01SVUEwRklMMTVSCQkweDAwMDAwNTc4CisKKy8qIFJYIERNQSBjb250cm9sbGVyIHJlZ2lzdGVycywgYWxsIDB4MDAwMDBhLi4gYXJlIGZvciBETUEgY29udHJvbGxlciBBLAorICogMHgwMDAwMGIuLiBmb3IgRE1BIGNvbnRyb2xsZXIgQiwgZXRjLiAqLworI2RlZmluZSBTUElERVJfTkVUX0dEQURDSEEJCTB4MDAwMDBhMDAKKyNkZWZpbmUgU1BJREVSX05FVF9HREFETUFDQ05UUgkJMHgwMDAwMGEwNAorI2RlZmluZSBTUElERVJfTkVUX0dEQUNURFBBCQkweDAwMDAwYTA4CisjZGVmaW5lIFNQSURFUl9ORVRfR0RBQ1REQ05UCQkweDAwMDAwYTBjCisjZGVmaW5lIFNQSURFUl9ORVRfR0RBQ0RCQUREUgkJMHgwMDAwMGEyMAorI2RlZmluZSBTUElERVJfTkVUX0dEQUNEQlNJWkUJCTB4MDAwMDBhMjQKKyNkZWZpbmUgU1BJREVSX05FVF9HREFDTkVYVERBCQkweDAwMDAwYTI4CisjZGVmaW5lIFNQSURFUl9ORVRfR0RBQ0NPTVNUCQkweDAwMDAwYTJjCisjZGVmaW5lIFNQSURFUl9ORVRfR0RBV0JDT01TVAkJMHgwMDAwMGEzMAorI2RlZmluZSBTUElERVJfTkVUX0dEQVdCUlNJWkUJCTB4MDAwMDBhMzQKKyNkZWZpbmUgU1BJREVSX05FVF9HREFXQlZTSVpFCQkweDAwMDAwYTM4CisjZGVmaW5lIFNQSURFUl9ORVRfR0RBV0JUUlNUCQkweDAwMDAwYTNjCisjZGVmaW5lIFNQSURFUl9ORVRfR0RBV0JUUkVSUgkJMHgwMDAwMGE0MAorCisvKiBUWCBETUEgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU1BJREVSX05FVF9HRFREQ0hBCQkweDAwMDAwZTAwCisjZGVmaW5lIFNQSURFUl9ORVRfR0RURE1BQ0NOVFIJCTB4MDAwMDBlMDQKKyNkZWZpbmUgU1BJREVSX05FVF9HRFRDRFBBCQkweDAwMDAwZTA4CisjZGVmaW5lIFNQSURFUl9ORVRfR0RURE1BU0VMCQkweDAwMDAwZTE0CisKKyNkZWZpbmUgU1BJREVSX05FVF9FQ01PREUJCTB4MDAwMDBmMDAKKy8qIGNsb2NrIGFuZCByZXNldCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFNQSURFUl9ORVRfQ0tSQ1RSTAkJMHgwMDAwMGZmMAorCisvKiogU0NPTkZJRyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU1BJREVSX05FVF9TQ09ORklHX0lPQUNURQkweDAwMDAyODEwCisKKy8qKiBoYXJkY29kZWQgcmVnaXN0ZXIgdmFsdWVzICovCisjZGVmaW5lIFNQSURFUl9ORVRfSU5UMF9NQVNLX1ZBTFVFCTB4M2Y3ZmUzZmYKKyNkZWZpbmUgU1BJREVSX05FVF9JTlQxX01BU0tfVkFMVUUJMHhmZmZmZmZmZgorLyogbm8gTUFDIGFib3J0cyAtPiBhdXRvIHJldHJhbnNtaXNzaW9uICovCisjZGVmaW5lIFNQSURFUl9ORVRfSU5UMl9NQVNLX1ZBTFVFCTB4ZmZmZmZmZjEKKworLyogY2xlYXIgY291bnRlciB3aGVuIGludGVycnVwdCBzb3VyY2VzIGFyZSBjbGVhcmVkCisjZGVmaW5lIFNQSURFUl9ORVRfRlJBTUVOVU1fVkFMVUUJMHgwMDAxZjAwMSAqLworLyogd2UgcmVseSBvbiBmbGFnZ2VkIGRlc2NyaXB0b3IgaW50ZXJydXB0cyAqLworI2RlZmluZSBTUElERVJfTkVUX0ZSQU1FTlVNX1ZBTFVFCTB4MDAwMDAwMDAKKy8qIHNldCB0aGlzIGZpcnN0LCB0aGVuIHRoZSBGUkFNRU5VTV9WQUxVRSAqLworI2RlZmluZSBTUElERVJfTkVUX0dGWEZSQU1FU19WQUxVRQkweDAwMDAwMDAwCisKKyNkZWZpbmUgU1BJREVSX05FVF9TVE9QX1NFUV9WQUxVRQkweDAwMDAwMDAwCisjZGVmaW5lIFNQSURFUl9ORVRfUlVOX1NFUV9WQUxVRQkweDAwMDAwMDdlCisKKyNkZWZpbmUgU1BJREVSX05FVF9QSFlfQ1RSTF9WQUxVRQkweDAwMDQwMDQwCisvKiAjZGVmaW5lIFNQSURFUl9ORVRfUEhZX0NUUkxfVkFMVUUJMHgwMTA3MDA4MCovCisjZGVmaW5lIFNQSURFUl9ORVRfUlhNT0RFX1ZBTFVFCQkweDAwMDAwMDExCisvKiBhdXRvIHJldHJhbnNtaXNzaW9uIGluIGNhc2Ugb2YgTUFDIGFib3J0cyAqLworI2RlZmluZSBTUElERVJfTkVUX1RYTU9ERV9WQUxVRQkJMHgwMDAxMDAwMAorI2RlZmluZSBTUElERVJfTkVUX1JFU1RBUlRfVkFMVUUJMHgwMDAwMDAwMAorI2RlZmluZSBTUElERVJfTkVUX1dPTF9WQUxVRQkJMHgwMDAwMTExMQorI2lmIDAKKyNkZWZpbmUgU1BJREVSX05FVF9XT0xfVkFMVUUJCTB4MDAwMDAwMDAKKyNlbmRpZgorI2RlZmluZSBTUElERVJfTkVUX0lQU0VDSU5JVF9WQUxVRQkweDAwZjAwMGY4CisKKy8qIHBhdXNlIGZyYW1lczogYXV0b21hdGljLCBubyB1cHBlciByZXRyYW5zbWlzc2lvbiBjb3VudCAqLworLyogb3V0c2lkZSBsb29wYmFjayBtb2RlOiBFVE9NT0Qgc2lnbmFsIGRvbnQgbWF0dGVyLCBub3QgY29ubmVjdGVkICovCisjZGVmaW5lIFNQSURFUl9ORVRfT1BNT0RFX1ZBTFVFCQkweDAwMDAwMDYzCisvKiNkZWZpbmUgU1BJREVSX05FVF9PUE1PREVfVkFMVUUJCTB4MDAxYjAwNjIqLworI2RlZmluZSBTUElERVJfTkVUX0xFTkxNVF9WQUxVRQkJMHgwMDAwMDkwOAorCisjZGVmaW5lIFNQSURFUl9ORVRfTUFDQVBBVVNFX1ZBTFVFCTB4MDAwMDA4MDAgLyogYWJvdXQgMSBtcyAqLworI2RlZmluZSBTUElERVJfTkVUX1RYUEFVU0VfVkFMVUUJMHgwMDAwMDAwMAorCisjZGVmaW5lIFNQSURFUl9ORVRfTUFDTU9ERV9WQUxVRQkweDAwMDAwMDAxCisjZGVmaW5lIFNQSURFUl9ORVRfQlVSU1RMTVRfVkFMVUUJMHgwMDAwMDIwMCAvKiBhYm91dCAxNiB1cyAqLworCisvKiAxKDApCQkJCQllbmFibGUgci90eCBkbWEKKyAqICAwMDAwMDAwCQkJCWZpeGVkIHRvIDAKKyAqCisgKiAgICAgICAgIDAwMDAwMAkJCWZpeGVkIHRvIDAKKyAqICAgICAgICAgICAgICAgMCgxKQkJCWVuL2Rpc2FibGUgZGVzY3Igd3JpdGViYWNrIG9uIGZvcmNlIGVuZAorICogICAgICAgICAgICAgICAgMCgxKQkJCWZvcmNlIGVuZAorICoKKyAqICAgICAgICAgICAgICAgICAwMDAwMDAJCWZpeGVkIHRvIDAKKyAqICAgICAgICAgICAgICAgICAgICAgICAwMAkJYnVyc3QgYWxpZ25tZW50OiAxMjggYnl0ZXMKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAwMDAwMAlmaXhlZCB0byAwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAJZGVzY3Igd3JpdGViYWNrIHNpemUgMzIgYnl0ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAoMSkJZGVzY3IgY2hhaW4gZW5kIGludGVycnVwdCBlbmFibGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKDEpCWRlc2NyIHN0YXR1cyB3cml0ZWJhY2sgZW5hYmxlICovCisKKy8qIHRvIHNldCBSWF9ETUFfRU4gKi8KKyNkZWZpbmUgU1BJREVSX05FVF9ETUFfUlhfVkFMVUUJCTB4ODAwMDAwMDAKKyNkZWZpbmUgU1BJREVSX05FVF9ETUFfUlhfRkVORF9WQUxVRQkweDAwMDMwMDAzCisvKiB0byBzZXQgVFhfRE1BX0VOICovCisjZGVmaW5lIFNQSURFUl9ORVRfRE1BX1RYX1ZBTFVFCQkweDgwMDAwMDAwCisjZGVmaW5lIFNQSURFUl9ORVRfRE1BX1RYX0ZFTkRfVkFMVUUJMHgwMDAzMDAwMworCisvKiBTUElERVJfTkVUX1VBX0RFU0NSX1ZBTFVFIGlzIE9SJ2VkIHdpdGggdGhlIHVuaWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBTUElERVJfTkVUX1VBX0RFU0NSX1ZBTFVFCTB4MDAwODAwMDAKKyNkZWZpbmUgU1BJREVSX05FVF9QUk9NSVNDX1ZBTFVFCTB4MDAwODAwMDAKKyNkZWZpbmUgU1BJREVSX05FVF9OT05QUk9NSVNDX1ZBTFVFCTB4MDAwMDAwMDAKKworI2RlZmluZSBTUElERVJfTkVUX0RNQVNFTF9WQUxVRQkJMHgwMDAwMDAwMQorCisjZGVmaW5lIFNQSURFUl9ORVRfRUNNT0RFX1ZBTFVFCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgU1BJREVSX05FVF9DS1JDVFJMX1JVTl9WQUxVRQkweDFmZmYwMTBmCisjZGVmaW5lIFNQSURFUl9ORVRfQ0tSQ1RSTF9TVE9QX1ZBTFVFCTB4MDAwMDAxMGYKKworI2RlZmluZSBTUElERVJfTkVUX1NCSU1TVEFURV9WQUxVRQkweDAwMDAwMDAwCisjZGVmaW5lIFNQSURFUl9ORVRfU0JUTVNUQVRFX1ZBTFVFCTB4MDAwMDAwMDAKKworLyogU1BJREVSX05FVF9HSElJTlQwU1RTIGJpdHMsIGluIHJldmVyc2Ugb3JkZXIgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkCisgKiB3aXRoIDEgPDwgU1BJREVSX05FVF8uLi4gKi8KK2VudW0gc3BpZGVyX25ldF9pbnQwX3N0YXR1cyB7CisJU1BJREVSX05FVF9HUEhZSU5UID0gMCwKKwlTUElERVJfTkVUX0dNQUMySU5ULAorCVNQSURFUl9ORVRfR01BQzFJTlQsCisJU1BJREVSX05FVF9HSVBTSU5ULAorCVNQSURFUl9ORVRfR0ZJRk9JTlQsCisJU1BJREVSX05FVF9HRE1BQ0lOVCwKKwlTUElERVJfTkVUX0dTWVNJTlQsCisJU1BJREVSX05FVF9HUFdPUENNUElOVCwKKwlTUElERVJfTkVUX0dQUk9QQ01QSU5ULAorCVNQSURFUl9ORVRfR1BXRkZJTlQsCisJU1BJREVSX05FVF9HUk1EQURSSU5ULAorCVNQSURFUl9ORVRfR1JNQVJQSU5ULAorCVNQSURFUl9ORVRfR1JNTVBJTlQsCisJU1BJREVSX05FVF9HRFRERU4wSU5ULAorCVNQSURFUl9ORVRfR0REREVOMElOVCwKKwlTUElERVJfTkVUX0dEQ0RFTjBJTlQsCisJU1BJREVSX05FVF9HREJERU4wSU5ULAorCVNQSURFUl9ORVRfR0RBREVOMElOVCwKKwlTUElERVJfTkVUX0dEVEZEQ0lOVCwKKwlTUElERVJfTkVUX0dEREZEQ0lOVCwKKwlTUElERVJfTkVUX0dEQ0ZEQ0lOVCwKKwlTUElERVJfTkVUX0dEQkZEQ0lOVCwKKwlTUElERVJfTkVUX0dEQUZEQ0lOVCwKKwlTUElERVJfTkVUX0dUVEVESU5ULAorCVNQSURFUl9ORVRfR0RURENFSU5ULAorCVNQSURFUl9ORVRfR1JGRE5NSU5ULAorCVNQSURFUl9ORVRfR1JGQ05NSU5ULAorCVNQSURFUl9ORVRfR1JGQk5NSU5ULAorCVNQSURFUl9ORVRfR1JGQU5NSU5ULAorCVNQSURFUl9ORVRfR1JGTk1JTlQsCisJU1BJREVSX05FVF9HMVRNQ05USU5ULAorCVNQSURFUl9ORVRfR0ZSRUVDTlRJTlQKK307CisvKiBHSElJTlQxU1RTIGJpdHMgKi8KK2VudW0gc3BpZGVyX25ldF9pbnQxX3N0YXR1cyB7CisJU1BJREVSX05FVF9HVE1GTExJTlQgPSAwLAorCVNQSURFUl9ORVRfR1JNRkxMSU5ULAorCVNQSURFUl9ORVRfR1RNU0hUSU5ULAorCVNQSURFUl9ORVRfR0RUSU5WRElOVCwKKwlTUElERVJfTkVUX0dSRkRGTExJTlQsCisJU1BJREVSX05FVF9HREREQ0VJTlQsCisJU1BJREVSX05FVF9HRERJTlZESU5ULAorCVNQSURFUl9ORVRfR1JGQ0ZMTElOVCwKKwlTUElERVJfTkVUX0dEQ0RDRUlOVCwKKwlTUElERVJfTkVUX0dEQ0lOVkRJTlQsCisJU1BJREVSX05FVF9HUkZCRkxMSU5ULAorCVNQSURFUl9ORVRfR0RCRENFSU5ULAorCVNQSURFUl9ORVRfR0RCSU5WRElOVCwKKwlTUElERVJfTkVUX0dSRkFGTExJTlQsCisJU1BJREVSX05FVF9HREFEQ0VJTlQsCisJU1BJREVSX05FVF9HREFJTlZESU5ULAorCVNQSURFUl9ORVRfR0RUUlNFUklOVCwKKwlTUElERVJfTkVUX0dERFJTRVJJTlQsCisJU1BJREVSX05FVF9HRENSU0VSSU5ULAorCVNQSURFUl9ORVRfR0RCUlNFUklOVCwKKwlTUElERVJfTkVUX0dEQVJTRVJJTlQsCisJU1BJREVSX05FVF9HRFNFUklOVCwKKwlTUElERVJfTkVUX0dEVFBURVJJTlQsCisJU1BJREVSX05FVF9HRERQVEVSSU5ULAorCVNQSURFUl9ORVRfR0RDUFRFUklOVCwKKwlTUElERVJfTkVUX0dEQlBURVJJTlQsCisJU1BJREVSX05FVF9HREFQVEVSSU5UCit9OworLyogR0hJSU5UMlNUUyBiaXRzICovCitlbnVtIHNwaWRlcl9uZXRfaW50Ml9zdGF0dXMgeworCVNQSURFUl9ORVRfR1BST1BFUklOVCA9IDAsCisJU1BJREVSX05FVF9HTUNUQ1JTTkdJTlQsCisJU1BJREVSX05FVF9HTUNUTENPTElOVCwKKwlTUElERVJfTkVUX0dNQ1RUTU9USU5ULAorCVNQSURFUl9ORVRfR01DUkNBRVJJTlQsCisJU1BJREVSX05FVF9HTUNSQ0FMRVJJTlQsCisJU1BJREVSX05FVF9HTUNSQUxORVJJTlQsCisJU1BJREVSX05FVF9HTUNST1ZSSU5ULAorCVNQSURFUl9ORVRfR01DUlJOVElOVCwKKwlTUElERVJfTkVUX0dNQ1JSWEVSSU5ULAorCVNQSURFUl9ORVRfR1RJVENTRVJJTlQsCisJU1BJREVSX05FVF9HVElGTVRFUklOVCwKKwlTUElERVJfTkVUX0dUSVBLVFJWS0lOVCwKKwlTUElERVJfTkVUX0dUSVNQSU5HSU5ULAorCVNQSURFUl9ORVRfR1RJU0FETkdJTlQsCisJU1BJREVSX05FVF9HVElTUEROR0lOVCwKKwlTUElERVJfTkVUX0dSSUZNVEVSSU5ULAorCVNQSURFUl9ORVRfR1JJUEtUUlZLSU5ULAorCVNQSURFUl9ORVRfR1JJU1BJTkdJTlQsCisJU1BJREVSX05FVF9HUklTQUROR0lOVCwKKwlTUElERVJfTkVUX0dSSVNQRE5HSU5UCit9OworCisjZGVmaW5lIFNQSURFUl9ORVRfVFhJTlQJKCAoMSA8PCBTUElERVJfTkVUX0dUVEVESU5UKSB8IFwKKwkJCQkgICgxIDw8IFNQSURFUl9ORVRfR0RURENFSU5UKSB8IFwKKwkJCQkgICgxIDw8IFNQSURFUl9ORVRfR0RURkRDSU5UKSApCisKKy8qIHdlIHJlbHkgb24gZmxhZ2dlZCBkZXNjcmlwdG9yIGludGVycnVwdHMqLworI2RlZmluZSBTUElERVJfTkVUX1JYSU5UCSggKDEgPDwgU1BJREVSX05FVF9HREFGRENJTlQpIHwgXAorCQkJCSAgKDEgPDwgU1BJREVSX05FVF9HUk1GTExJTlQpICkKKworI2RlZmluZSBTUElERVJfTkVUX0dQUkVYRUMJCTB4ODAwMDAwMDAKKyNkZWZpbmUgU1BJREVSX05FVF9HUFJEQVRfTUFTSwkJMHgwMDAwZmZmZgorCisvKiBkZXNjcmlwdG9yIGJpdHMKKyAqCisgKiAxMDEwCQkJCQlkZXNjcmlwdG9yIHJlYWR5CisgKiAgICAgMAkJCQlkZXNjciBpbiBtaWRkbGUgb2YgY2hhaW4KKyAqICAgICAgMDAwCQkJCWZpeGVkIHRvIDAKKyAqCisgKiAgICAgICAgIDAJCQkJbm8gaW50ZXJydXB0IG9uIGNvbXBsZXRpb24KKyAqICAgICAgICAgIDAwMAkJCQlmaXhlZCB0byAwCisgKiAgICAgICAgICAgICAxCQkJbm8gaXBzZWMgcHJvY2Vzc2luZworICogICAgICAgICAgICAgIDEJCQlsYXN0IGRlc2NyaXB0b3IgZm9yIHRoaXMgZnJhbWUKKyAqICAgICAgICAgICAgICAgMDAJCQlubyBjaGVja3N1bQorICogICAgICAgICAgICAgICAxMAkJCXRjcCBjaGVja3N1bQorICogICAgICAgICAgICAgICAxMQkJCXVkcCBjaGVja3N1bQorICoKKyAqICAgICAgICAgICAgICAgICAwMAkJCWZpeGVkIHRvIDAKKyAqICAgICAgICAgICAgICAgICAgIDAJCQlmaXhlZCB0byAwCisgKiAgICAgICAgICAgICAgICAgICAgMAkJCW5vIGludGVycnVwdCBvbiByZXNwb25zZSBlcnJvcnMKKyAqICAgICAgICAgICAgICAgICAgICAgMAkJbm8gaW50ZXJydXB0IG9uIGludmFsaWQgZGVzY3IKKyAqICAgICAgICAgICAgICAgICAgICAgIDAJCW5vIGludGVycnVwdCBvbiBkbWEgcHJvY2VzcyB0ZXJtaW5hdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgIDAJCW5vIGludGVycnVwdCBvbiBkZXNjciBjaGFpbiBlbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgMAkJbm8gaW50ZXJydXB0IG9uIGRlc2NyIGNvbXBsZXRlCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgMDAwCQlmaXhlZCB0byAwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCQlyZXNwb25zZSBlcnJvciBpbnRlcnJ1cHQgc3RhdHVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAlpbnZhbGlkIGRlc2NyIHN0YXR1cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCWRtYSB0ZXJtaW5hdGlvbiBzdGF0dXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAJZGVzY3IgY2hhaW4gZW5kIHN0YXR1cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAJZGVzY3IgY29tcGxldGUgc3RhdHVzICovCisjZGVmaW5lIFNQSURFUl9ORVRfRE1BQ19DTURTVEFUX05PQ1MJMHhhMDBjMDAwMAorI2RlZmluZSBTUElERVJfTkVUX0RNQUNfQ01EU1RBVF9UQ1BDUwkweGEwMGUwMDAwCisjZGVmaW5lIFNQSURFUl9ORVRfRE1BQ19DTURTVEFUX1VEUENTCTB4YTAwZjAwMDAKKyNkZWZpbmUgU1BJREVSX05FVF9ERVNDUl9JTkRfUFJPQ19TSElGVAkyOAorI2RlZmluZSBTUElERVJfTkVUX0RFU0NSX0lORF9QUk9DX01BU0tPCTB4MGZmZmZmZmYKKworLyogZGVzY3IgcmVhZHksIGRlc2NyIGlzIGluIG1pZGRsZSBvZiBjaGFpbiwgZ2V0IGludGVycnVwdCBvbiBjb21wbGV0aW9uICovCisjZGVmaW5lIFNQSURFUl9ORVRfRE1BQ19SWF9DQVJET1dORUQJMHhhMDgwMDAwMAorCisvKiBtdWx0aWNhc3QgaXMgbm8gcHJvYmxlbSAqLworI2RlZmluZSBTUElERVJfTkVUX0RBVEFfRVJST1JfTUFTSwkweGZmZmZiZmZmCisKK2VudW0gc3BpZGVyX25ldF9kZXNjcl9zdGF0dXMgeworCVNQSURFUl9ORVRfREVTQ1JfQ09NUExFVEUJCT0gMHgwMCwgLyogdXNlZCBpbiByeCBhbmQgdHggKi8KKwlTUElERVJfTkVUX0RFU0NSX1JFU1BPTlNFX0VSUk9SCQk9IDB4MDEsIC8qIHVzZWQgaW4gcnggYW5kIHR4ICovCisJU1BJREVSX05FVF9ERVNDUl9QUk9URUNUSU9OX0VSUk9SCT0gMHgwMiwgLyogdXNlZCBpbiByeCBhbmQgdHggKi8KKwlTUElERVJfTkVUX0RFU0NSX0ZSQU1FX0VORAkJPSAweDA0LCAvKiB1c2VkIGluIHJ4ICovCisJU1BJREVSX05FVF9ERVNDUl9GT1JDRV9FTkQJCT0gMHgwNSwgLyogdXNlZCBpbiByeCBhbmQgdHggKi8KKwlTUElERVJfTkVUX0RFU0NSX0NBUkRPV05FRAkJPSAweDBhLCAvKiB1c2VkIGluIHJ4IGFuZCB0eCAqLworCVNQSURFUl9ORVRfREVTQ1JfTk9UX0lOX1VTRSAvKiBhbnkgb3RoZXIgdmFsdWUgKi8KK307CisKK3N0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyIHsKKwkvKiBhcyBkZWZpbmVkIGJ5IHRoZSBoYXJkd2FyZSAqLworCWRtYV9hZGRyX3QgYnVmX2FkZHI7CisJdTMyIGJ1Zl9zaXplOworCWRtYV9hZGRyX3QgbmV4dF9kZXNjcl9hZGRyOworCXUzMiBkbWFjX2NtZF9zdGF0dXM7CisJdTMyIHJlc3VsdF9zaXplOworCXUzMiB2YWxpZF9zaXplOwkvKiBhbGwgemVyb2VzIGZvciB0eCAqLworCXUzMiBkYXRhX3N0YXR1czsKKwl1MzIgZGF0YV9lcnJvcjsJLyogYWxsIHplcm9lcyBmb3IgdHggKi8KKworCS8qIHVzZWQgaW4gdGhlIGRyaXZlciAqLworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBidXNfYWRkcjsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqbmV4dDsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqcHJldjsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKworc3RydWN0IHNwaWRlcl9uZXRfZGVzY3JfY2hhaW4geworCS8qIHdlIHdhbGsgZnJvbSB0YWlsIHRvIGhlYWQgKi8KKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqaGVhZDsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqdGFpbDsKK307CisKKy8qIGRlc2NyaXB0b3IgZGF0YV9zdGF0dXMgYml0cyAqLworI2RlZmluZSBTUElERVJfTkVUX1JYSVBDSEsJCTI5CisjZGVmaW5lIFNQSURFUl9ORVRfVENQVURQSVBDSEsJCTI4CisjZGVmaW5lIFNQSURFUl9ORVRfREFUQV9TVEFUVVNfQ0hLX01BU0sJKDEgPDwgU1BJREVSX05FVF9SWElQQ0hLIHwgXAorCQkJCQkgMSA8PCBTUElERVJfTkVUX1RDUFVEUElQQ0hLKQorCisjZGVmaW5lIFNQSURFUl9ORVRfVkxBTl9QQUNLRVQJCTIxCisKKy8qIGRlc2NyaXB0b3IgZGF0YV9lcnJvciBiaXRzICovCisjZGVmaW5lIFNQSURFUl9ORVRfUlhJUENIS0VSUgkJMjcKKyNkZWZpbmUgU1BJREVSX05FVF9SWFRDUENIS0VSUgkJMjYKKyNkZWZpbmUgU1BJREVSX05FVF9EQVRBX0VSUk9SX0NIS19NQVNLCSgxIDw8IFNQSURFUl9ORVRfUlhJUENIS0VSUiB8IFwKKwkJCQkJIDEgPDwgU1BJREVSX05FVF9SWFRDUENIS0VSUikKKworLyogdGhlIGNhc2VzIHdlIGRvbid0IHBhc3MgdGhlIHBhY2tldCB0byB0aGUgc3RhY2sgKi8KKyNkZWZpbmUgU1BJREVSX05FVF9ERVNUUk9ZX1JYX0ZMQUdTCTB4NzAxMzgwMDAKKworI2RlZmluZSBTUElERVJfTkVUX0RFU0NSX1NJWkUJCTMyCisKKy8qIHRoaXMgd2lsbCBiZSBiaWdnZXIgc29tZSB0aW1lICovCitzdHJ1Y3Qgc3BpZGVyX25ldF9vcHRpb25zIHsKKwlpbnQgcnhfY3N1bTsgLyogZm9yIHJ4OiBpZiAwIGlwX3N1bW1lZD1OT05FLAorCQkJaWYgMSBhbmQgaHcgaGFzIHZlcmlmaWVkLCBpcF9zdW1tZWQ9VU5ORUNFU1NBUlkgKi8KK307CisKKyNkZWZpbmUgU1BJREVSX05FVF9ERUZBVUxUX01TRwkJKCBORVRJRl9NU0dfRFJWIHwgXAorCQkJCQkgIE5FVElGX01TR19QUk9CRSB8IFwKKwkJCQkJICBORVRJRl9NU0dfTElOSyB8IFwKKwkJCQkJICBORVRJRl9NU0dfVElNRVIgfCBcCisJCQkJCSAgTkVUSUZfTVNHX0lGRE9XTiB8IFwKKwkJCQkJICBORVRJRl9NU0dfSUZVUCB8IFwKKwkJCQkJICBORVRJRl9NU0dfUlhfRVJSIHwgXAorCQkJCQkgIE5FVElGX01TR19UWF9FUlIgfCBcCisJCQkJCSAgTkVUSUZfTVNHX1RYX1FVRVVFRCB8IFwKKwkJCQkJICBORVRJRl9NU0dfSU5UUiB8IFwKKwkJCQkJICBORVRJRl9NU0dfVFhfRE9ORSB8IFwKKwkJCQkJICBORVRJRl9NU0dfUlhfU1RBVFVTIHwgXAorCQkJCQkgIE5FVElGX01TR19QS1REQVRBIHwgXAorCQkJCQkgIE5FVElGX01TR19IVyB8IFwKKwkJCQkJICBORVRJRl9NU0dfV09MICkKKworc3RydWN0IHNwaWRlcl9uZXRfY2FyZCB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgbWlpX3BoeSBwaHk7CisKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcl9jaGFpbiB0eF9jaGFpbjsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcl9jaGFpbiByeF9jaGFpbjsKKwlzcGlubG9ja190IGNoYWluX2xvY2s7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRkZXZfc3RhdHM7CisKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9vcHRpb25zIG9wdGlvbnM7CisKKwlzcGlubG9ja190IGludG1hc2tfbG9jazsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF90aW1lb3V0X3Rhc2s7CisJYXRvbWljX3QgdHhfdGltZW91dF90YXNrX2NvdW50ZXI7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CisKKwkvKiBmb3IgZXRodG9vbCAqLworCWludCBtc2dfZW5hYmxlOworCisJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgZGVzY3JbMF07Cit9OworCisjZGVmaW5lIHByX2VycihmbXQsYXJnLi4uKSBcCisJcHJpbnRrKEtFUk5fRVJSIGZtdCAsIyNhcmcpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0X2V0aHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDJlNjBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldF9ldGh0b29sLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBOZXR3b3JrIGRldmljZSBkcml2ZXIgZm9yIENlbGwgUHJvY2Vzc29yLUJhc2VkIEJsYWRlCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNQorICoKKyAqIEF1dGhvcnMgOiBVdHogQmFjaGVyIDx1dHouYmFjaGVyQGRlLmlibS5jb20+CisgKiAgICAgICAgICAgSmVucyBPc3RlcmthbXAgPEplbnMuT3N0ZXJrYW1wQGRlLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgInNwaWRlcl9uZXQuaCIKKworc3RhdGljIGludAorc3BpZGVyX25ldF9ldGh0b29sX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQ7CisJY2FyZCA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwljbWQtPnN1cHBvcnRlZCAgID0gKFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkgICAgIFNVUFBPUlRFRF9GSUJSRSk7CisJY21kLT5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCSAgICAgQURWRVJUSVNFRF9GSUJSRSk7CisJY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwljbWQtPnNwZWVkID0gY2FyZC0+cGh5LnNwZWVkOworCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfZXRodG9vbF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCit7CisJc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZDsKKwljYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIGNsZWFyIGFuZCBmaWxsIG91dCBpbmZvICovCisJbWVtc2V0KGRydmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvKSk7CisJc3RybmNweShkcnZpbmZvLT5kcml2ZXIsIHNwaWRlcl9uZXRfZHJpdmVyX25hbWUsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sICIwLjEiLCAzMik7CisJc3RyY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sICJubyBpbmZvcm1hdGlvbiIpOworCXN0cm5jcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGNhcmQtPnBkZXYpLCAzMik7Cit9CisKK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X2V0aHRvb2xfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29saW5mbykKK3sKKwkvKiBubyBzdXBwb3J0IGZvciB3b2wgKi8KKwl3b2xpbmZvLT5zdXBwb3J0ZWQgPSAwOworCXdvbGluZm8tPndvbG9wdHMgPSAwOworfQorCitzdGF0aWMgdTMyCitzcGlkZXJfbmV0X2V0aHRvb2xfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZDsKKwljYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gY2FyZC0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfZXRodG9vbF9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQl1MzIgbGV2ZWwpCit7CisJc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZDsKKwljYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwljYXJkLT5tc2dfZW5hYmxlID0gbGV2ZWw7Cit9CisKK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfZXRodG9vbF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQlzcGlkZXJfbmV0X3N0b3AobmV0ZGV2KTsKKwkJc3BpZGVyX25ldF9vcGVuKG5ldGRldik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyCitzcGlkZXJfbmV0X2V0aHRvb2xfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2LT5wcml2OworCisJcmV0dXJuIGNhcmQtPm9wdGlvbnMucnhfY3N1bTsKK30KKworc3RhdGljIGludAorc3BpZGVyX25ldF9ldGh0b29sX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBuKQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXYtPnByaXY7CisKKwljYXJkLT5vcHRpb25zLnJ4X2NzdW0gPSBuOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZXRodG9vbF9vcHMgc3BpZGVyX25ldF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCQk9IHNwaWRlcl9uZXRfZXRodG9vbF9nZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCQk9IHNwaWRlcl9uZXRfZXRodG9vbF9nZXRfZHJ2aW5mbywKKwkuZ2V0X3dvbAkJPSBzcGlkZXJfbmV0X2V0aHRvb2xfZ2V0X3dvbCwKKwkuZ2V0X21zZ2xldmVsCQk9IHNwaWRlcl9uZXRfZXRodG9vbF9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBzcGlkZXJfbmV0X2V0aHRvb2xfc2V0X21zZ2xldmVsLAorCS5ud2F5X3Jlc2V0CQk9IHNwaWRlcl9uZXRfZXRodG9vbF9ud2F5X3Jlc2V0LAorCS5nZXRfcnhfY3N1bQkJPSBzcGlkZXJfbmV0X2V0aHRvb2xfZ2V0X3J4X2NzdW0sCisJLnNldF9yeF9jc3VtCQk9IHNwaWRlcl9uZXRfZXRodG9vbF9zZXRfcnhfY3N1bSwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jIGIvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMKaW5kZXggMWY0M2JiZi4uNWM4ZmNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogI2RlZmluZQlNRU0JbHAtPm1lbQogI2RlZmluZQlEUkVHCWxwLT5pb2Jhc2VbMF0KICNkZWZpbmUJQVJFRwlscC0+aW9iYXNlWzFdCi0jZGVmaW5lCVJFR0EoYSkJKCBBUkVHID0gKGEpLCBEUkVHICkKKyNkZWZpbmUJUkVHQShhKQkoKiggQVJFRyA9IChhKSwgJkRSRUcgKSkKIAogLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBMYW5jZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5nZW0uYyBiL2RyaXZlcnMvbmV0L3N1bmdlbS5jCmluZGV4IDI2MDhlN2EuLmRlMzk5NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmdlbS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmdlbS5jCkBAIC05NDgsNiArOTQ4LDcgQEAKIAkJdTMyIGdlbV9zdGF0dXMgPSByZWFkbChncC0+cmVncyArIEdSRUdfU1RBVCk7CiAKIAkJaWYgKGdlbV9zdGF0dXMgPT0gMCkgeworCQkJbmV0aWZfcG9sbF9lbmFibGUoZGV2KTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gSVJRX05PTkU7CiAJCX0KQEAgLTI4MTYsNyArMjgxNyw3IEBACiAKICNpZiAoIWRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChDT05GSUdfUFBDX1BNQUMpKQogLyogRmV0Y2ggTUFDIGFkZHJlc3MgZnJvbSB2aXRhbCBwcm9kdWN0IGRhdGEgb2YgUENJIFJPTS4gKi8KLXN0YXRpYyB2b2lkIGZpbmRfZXRoX2FkZHJfaW5fdnBkKHZvaWQgX19pb21lbSAqcm9tX2Jhc2UsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmRldl9hZGRyKQorc3RhdGljIGludCBmaW5kX2V0aF9hZGRyX2luX3ZwZCh2b2lkIF9faW9tZW0gKnJvbV9iYXNlLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpkZXZfYWRkcikKIHsKIAlpbnQgdGhpc19vZmZzZXQ7CiAKQEAgLTI4MzcsMzUgKzI4MzgsMjcgQEAKIAogCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogCQkJZGV2X2FkZHJbaV0gPSByZWFkYihwICsgaSk7Ci0JCWJyZWFrOworCQlyZXR1cm4gMTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGdldF9nZW1fbWFjX25vbm9icChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCiB7Ci0JdTMyIHJvbV9yZWdfb3JpZzsKLQl2b2lkIF9faW9tZW0gKnA7CisJc2l6ZV90IHNpemU7CisJdm9pZCBfX2lvbWVtICpwID0gcGNpX21hcF9yb20ocGRldiwgJnNpemUpOwogCi0JaWYgKHBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnBhcmVudCA9PSBOVUxMKSB7Ci0JCWlmIChwY2lfYXNzaWduX3Jlc291cmNlKHBkZXYsIFBDSV9ST01fUkVTT1VSQ0UpIDwgMCkKLQkJCWdvdG8gdXNlX3JhbmRvbTsKKwlpZiAocCkgeworCQkJaW50IGZvdW5kOworCisJCWZvdW5kID0gcmVhZGIocCkgPT0gMHg1NSAmJgorCQkJcmVhZGIocCArIDEpID09IDB4YWEgJiYKKwkJCWZpbmRfZXRoX2FkZHJfaW5fdnBkKHAsICg2NCAqIDEwMjQpLCBkZXZfYWRkcik7CisJCXBjaV91bm1hcF9yb20ocGRldiwgcCk7CisJCWlmIChmb3VuZCkKKwkJCXJldHVybjsKIAl9CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcGRldi0+cm9tX2Jhc2VfcmVnLCAmcm9tX3JlZ19vcmlnKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywKLQkJCSAgICAgICByb21fcmVnX29yaWcgfCBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKLQotCXAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBQQ0lfUk9NX1JFU09VUkNFKSwgKDY0ICogMTAyNCkpOwotCWlmIChwICE9IE5VTEwgJiYgcmVhZGIocCkgPT0gMHg1NSAmJiByZWFkYihwICsgMSkgPT0gMHhhYSkKLQkJZmluZF9ldGhfYWRkcl9pbl92cGQocCwgKDY0ICogMTAyNCksIGRldl9hZGRyKTsKLQotCWlmIChwICE9IE5VTEwpCi0JCWlvdW5tYXAocCk7Ci0KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywgcm9tX3JlZ19vcmlnKTsKLQlyZXR1cm47Ci0KLXVzZV9yYW5kb206CiAJLyogU3VuIE1BQyBwcmVmaXggdGhlbiAzIHJhbmRvbSBieXRlcy4gKi8KIAlkZXZfYWRkclswXSA9IDB4MDg7CiAJZGV2X2FkZHJbMV0gPSAweDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtLmggYi9kcml2ZXJzL25ldC9zdW5nZW0uaAppbmRleCA3MTQzZmQ3Li5mZjhhZTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5nZW0uaAorKysgYi9kcml2ZXJzL25ldC9zdW5nZW0uaApAQCAtMTAyMCw3ICsxMDIwLDcgQEAKIAkJCiAJc3RydWN0IGdlbV9pbml0X2Jsb2NrCSppbml0X2Jsb2NrOwogCXN0cnVjdCBza19idWZmCQkqcnhfc2tic1tSWF9SSU5HX1NJWkVdOwotCXN0cnVjdCBza19idWZmCQkqdHhfc2tic1tSWF9SSU5HX1NJWkVdOworCXN0cnVjdCBza19idWZmCQkqdHhfc2tic1tUWF9SSU5HX1NJWkVdOwogCWRtYV9hZGRyX3QJCWdibG9ja19kdm1hOwogCiAJc3RydWN0IHBjaV9kZXYJCSpwZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuaG1lLmMgYi9kcml2ZXJzL25ldC9zdW5obWUuYwppbmRleCBmMDJmZTQxLi45ZjA0NmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5obWUuYworKysgYi9kcml2ZXJzL25ldC9zdW5obWUuYwpAQCAtMjk1NCw3ICsyOTU0LDcgQEAKIH0KIAogLyogRmV0Y2ggTUFDIGFkZHJlc3MgZnJvbSB2aXRhbCBwcm9kdWN0IGRhdGEgb2YgUENJIFJPTS4gKi8KLXN0YXRpYyB2b2lkIGZpbmRfZXRoX2FkZHJfaW5fdnBkKHZvaWQgX19pb21lbSAqcm9tX2Jhc2UsIGludCBsZW4sIGludCBpbmRleCwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCitzdGF0aWMgaW50IGZpbmRfZXRoX2FkZHJfaW5fdnBkKHZvaWQgX19pb21lbSAqcm9tX2Jhc2UsIGludCBsZW4sIGludCBpbmRleCwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCiB7CiAJaW50IHRoaXNfb2Zmc2V0OwogCkBAIC0yOTc3LDQyICsyOTc3LDMzIEBACiAKIAkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJCQkJZGV2X2FkZHJbaV0gPSByZWFkYihwICsgaSk7Ci0JCQlicmVhazsKKwkJCXJldHVybiAxOwogCQl9CiAJCWluZGV4LS07CiAJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBnZXRfaG1lX21hY19ub25zcGFyYyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCiB7Ci0JdTMyIHJvbV9yZWdfb3JpZzsKLQl2b2lkIF9faW9tZW0gKnA7Ci0JaW50IGluZGV4OworCXNpemVfdCBzaXplOworCXZvaWQgX19pb21lbSAqcCA9IHBjaV9tYXBfcm9tKHBkZXYsICZzaXplKTsKIAotCWluZGV4ID0gMDsKLQlpZiAoaXNfcXVhdHRyb19wKHBkZXYpKQotCQlpbmRleCA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKKwlpZiAocCkgeworCQlpbnQgaW5kZXggPSAwOworCQlpbnQgZm91bmQ7CiAKLQlpZiAocGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0ucGFyZW50ID09IE5VTEwpIHsKLQkJaWYgKHBjaV9hc3NpZ25fcmVzb3VyY2UocGRldiwgUENJX1JPTV9SRVNPVVJDRSkgPCAwKQotCQkJZ290byB1c2VfcmFuZG9tOworCQlpZiAoaXNfcXVhdHRyb19wKHBkZXYpKQorCQkJaW5kZXggPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CisKKwkJZm91bmQgPSByZWFkYihwKSA9PSAweDU1ICYmCisJCQlyZWFkYihwICsgMSkgPT0gMHhhYSAmJgorCQkJZmluZF9ldGhfYWRkcl9pbl92cGQocCwgKDY0ICogMTAyNCksIGluZGV4LCBkZXZfYWRkcik7CisJCXBjaV91bm1hcF9yb20ocGRldiwgcCk7CisJCWlmIChmb3VuZCkKKwkJCXJldHVybjsKIAl9CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcGRldi0+cm9tX2Jhc2VfcmVnLCAmcm9tX3JlZ19vcmlnKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywKLQkJCSAgICAgICByb21fcmVnX29yaWcgfCBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKLQotCXAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBQQ0lfUk9NX1JFU09VUkNFKSwgKDY0ICogMTAyNCkpOwotCWlmIChwICE9IE5VTEwgJiYgcmVhZGIocCkgPT0gMHg1NSAmJiByZWFkYihwICsgMSkgPT0gMHhhYSkKLQkJZmluZF9ldGhfYWRkcl9pbl92cGQocCwgKDY0ICogMTAyNCksIGluZGV4LCBkZXZfYWRkcik7Ci0KLQlpZiAocCAhPSBOVUxMKQotCQlpb3VubWFwKHApOwotCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBwZGV2LT5yb21fYmFzZV9yZWcsIHJvbV9yZWdfb3JpZyk7Ci0JcmV0dXJuOwotCi11c2VfcmFuZG9tOgogCS8qIFN1biBNQUMgcHJlZml4IHRoZW4gMyByYW5kb20gYnl0ZXMuICovCiAJZGV2X2FkZHJbMF0gPSAweDA4OwogCWRldl9hZGRyWzFdID0gMHgwMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RnMy5jIGIvZHJpdmVycy9uZXQvdGczLmMKaW5kZXggYWY4MjYzYS4uZGM1NzM1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGczLmMKKysrIGIvZHJpdmVycy9uZXQvdGczLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAKICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KIApAQCAtNjYsOCArNjcsOCBAQAogCiAjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJInRnMyIKICNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCi0jZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMy4zNyIKLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJBdWd1c3QgMjUsIDIwMDUiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMy4zOSIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJTZXB0ZW1iZXIgNSwgMjAwNSIKIAogI2RlZmluZSBURzNfREVGX01BQ19NT0RFCTAKICNkZWZpbmUgVEczX0RFRl9SWF9NT0RFCQkwCkBAIC0xMjEsMTIgKzEyMiw5IEBACiAJCQkgICAgICAgICAgIFRHM19SWF9SQ0JfUklOR19TSVpFKHRwKSkKICNkZWZpbmUgVEczX1RYX1JJTkdfQllURVMJKHNpemVvZihzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjKSAqIFwKIAkJCQkgVEczX1RYX1JJTkdfU0laRSkKLSNkZWZpbmUgVFhfUklOR19HQVAoVFApCVwKLQkoVEczX1RYX1JJTkdfU0laRSAtIChUUCktPnR4X3BlbmRpbmcpCiAjZGVmaW5lIFRYX0JVRkZTX0FWQUlMKFRQKQkJCQkJCVwKLQkoKChUUCktPnR4X2NvbnMgPD0gKFRQKS0+dHhfcHJvZCkgPwkJCQlcCi0JICAoVFApLT50eF9jb25zICsgKFRQKS0+dHhfcGVuZGluZyAtIChUUCktPnR4X3Byb2QgOgkJXAotCSAgKFRQKS0+dHhfY29ucyAtIChUUCktPnR4X3Byb2QgLSBUWF9SSU5HX0dBUChUUCkpCisJKChUUCktPnR4X3BlbmRpbmcgLQkJCQkJCVwKKwkgKCgoVFApLT50eF9wcm9kIC0gKFRQKS0+dHhfY29ucykgJiAoVEczX1RYX1JJTkdfU0laRSAtIDEpKSkKICNkZWZpbmUgTkVYVF9UWChOKQkJKCgoTikgKyAxKSAmIChURzNfVFhfUklOR19TSVpFIC0gMSkpCiAKICNkZWZpbmUgUlhfUEtUX0JVRl9TWgkJKDE1MzYgKyB0cC0+cnhfb2Zmc2V0ICsgNjQpCkBAIC00OTAsNyArNDg4LDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHRnM19jb25kX2ludChzdHJ1Y3QgdGczICp0cCkKIHsKLQlpZiAodHAtPmh3X3N0YXR1cy0+c3RhdHVzICYgU0RfU1RBVFVTX1VQREFURUQpCisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1RBR0dFRF9TVEFUVVMpICYmCisJICAgICh0cC0+aHdfc3RhdHVzLT5zdGF0dXMgJiBTRF9TVEFUVVNfVVBEQVRFRCkpCiAJCXR3MzIoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8IEdSQ19MQ0xDVFJMX1NFVElOVCk7CiB9CiAKQEAgLTI4ODAsOSArMjg3OSwxMyBAQAogCiAJdHAtPnR4X2NvbnMgPSBzd19pZHg7CiAKLQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZCh0cC0+ZGV2KSAmJgotCSAgICAoVFhfQlVGRlNfQVZBSUwodHApID4gVEczX1RYX1dBS0VVUF9USFJFU0gpKQotCQluZXRpZl93YWtlX3F1ZXVlKHRwLT5kZXYpOworCWlmICh1bmxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKHRwLT5kZXYpKSkgeworCQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQodHAtPmRldikgJiYKKwkJICAgIChUWF9CVUZGU19BVkFJTCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCkpCisJCQluZXRpZl93YWtlX3F1ZXVlKHRwLT5kZXYpOworCQlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCX0KIH0KIAogLyogUmV0dXJucyBzaXplIG9mIHNrYiBhbGxvY2F0ZWQgb3IgPCAwIG9uIGVycm9yLgpAQCAtMzE5OCw5ICszMjAxLDcgQEAKIAogCS8qIHJ1biBUWCBjb21wbGV0aW9uIHRocmVhZCAqLwogCWlmIChzYmxrLT5pZHhbMF0udHhfY29uc3VtZXIgIT0gdHAtPnR4X2NvbnMpIHsKLQkJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CiAJCXRnM190eCh0cCk7Ci0JCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CiAJfQogCiAJLyogcnVuIFJYIHRocmVhZCwgd2l0aGluIHRoZSBib3VuZHMgc2V0IGJ5IE5BUEkuCkBAIC0zMjIwLDE4ICszMjIxLDE3IEBACiAJCW5ldGRldi0+cXVvdGEgLT0gd29ya19kb25lOwogCX0KIAotCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVEFHR0VEX1NUQVRVUykKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1RBR0dFRF9TVEFUVVMpIHsKIAkJdHAtPmxhc3RfdGFnID0gc2Jsay0+c3RhdHVzX3RhZzsKLQlybWIoKTsKLQlzYmxrLT5zdGF0dXMgJj0gflNEX1NUQVRVU19VUERBVEVEOworCQlybWIoKTsKKwl9IGVsc2UKKwkJc2Jsay0+c3RhdHVzICY9IH5TRF9TVEFUVVNfVVBEQVRFRDsKIAogCS8qIGlmIG5vIG1vcmUgd29yaywgdGVsbCBuZXQgc3RhY2sgYW5kIE5JQyB3ZSdyZSBkb25lICovCiAJZG9uZSA9ICF0ZzNfaGFzX3dvcmsodHApOwogCWlmIChkb25lKSB7Ci0JCXNwaW5fbG9jaygmdHAtPmxvY2spOwogCQluZXRpZl9yeF9jb21wbGV0ZShuZXRkZXYpOwogCQl0ZzNfcmVzdGFydF9pbnRzKHRwKTsKLQkJc3Bpbl91bmxvY2soJnRwLT5sb2NrKTsKIAl9CiAKIAlyZXR1cm4gKGRvbmUgPyAwIDogMSk7CkBAIC0zMjc5LDggKzMyNzksOSBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCB0ZzNfaHdfc3RhdHVzICpzYmxrID0gdHAtPmh3X3N0YXR1czsKIAorCXByZWZldGNoKHRwLT5od19zdGF0dXMpOworCXByZWZldGNoKCZ0cC0+cnhfcmNiW3RwLT5yeF9yY2JfcHRyXSk7CiAJLyoKIAkgKiBXcml0aW5nIGFueSB2YWx1ZSB0byBpbnRyLW1ib3gtMCBjbGVhcnMgUENJIElOVEEjIGFuZAogCSAqIGNoaXAtaW50ZXJuYWwgaW50ZXJydXB0IHBlbmRpbmcgZXZlbnRzLgpAQCAtMzI4OSwxOSArMzI5MCw5IEBACiAJICogZXZlbnQgY29hbGVzY2luZy4KIAkgKi8KIAl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLCAweDAwMDAwMDAxKTsKLQl0cC0+bGFzdF90YWcgPSBzYmxrLT5zdGF0dXNfdGFnOwotCXJtYigpOwotCWlmICh0ZzNfaXJxX3N5bmModHApKQotCQlnb3RvIG91dDsKLQlzYmxrLT5zdGF0dXMgJj0gflNEX1NUQVRVU19VUERBVEVEOwotCWlmIChsaWtlbHkodGczX2hhc193b3JrKHRwKSkpCisJaWYgKGxpa2VseSghdGczX2lycV9zeW5jKHRwKSkpCiAJCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7CQkvKiBzY2hlZHVsZSBOQVBJIHBvbGwgKi8KLQllbHNlIHsKLQkJLyogTm8gd29yaywgcmUtZW5hYmxlIGludGVycnVwdHMuICAqLwotCQl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLAotCQkJICAgICB0cC0+bGFzdF90YWcgPDwgMjQpOwotCX0KLW91dDoKKwogCXJldHVybiBJUlFfUkVUVkFMKDEpOwogfQogCkBAIC0zMzMxLDkgKzMzMjIsMTAgQEAKIAkJaWYgKHRnM19pcnFfc3luYyh0cCkpCiAJCQlnb3RvIG91dDsKIAkJc2Jsay0+c3RhdHVzICY9IH5TRF9TVEFUVVNfVVBEQVRFRDsKLQkJaWYgKGxpa2VseSh0ZzNfaGFzX3dvcmsodHApKSkKKwkJaWYgKGxpa2VseSh0ZzNfaGFzX3dvcmsodHApKSkgeworCQkJcHJlZmV0Y2goJnRwLT5yeF9yY2JbdHAtPnJ4X3JjYl9wdHJdKTsKIAkJCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7CQkvKiBzY2hlZHVsZSBOQVBJIHBvbGwgKi8KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQkvKiBObyB3b3JrLCBzaGFyZWQgaW50ZXJydXB0IHBlcmhhcHM/ICByZS1lbmFibGUKIAkJCSAqIGludGVycnVwdHMsIGFuZCBmbHVzaCB0aGF0IFBDSSB3cml0ZQogCQkJICovCkBAIC0zMzU5LDcgKzMzNTEsNyBAQAogCSAqIFJlYWRpbmcgdGhlIFBDSSBTdGF0ZSByZWdpc3RlciB3aWxsIGNvbmZpcm0gd2hldGhlciB0aGUKIAkgKiBpbnRlcnJ1cHQgaXMgb3VycyBhbmQgd2lsbCBmbHVzaCB0aGUgc3RhdHVzIGJsb2NrLgogCSAqLwotCWlmICgoc2Jsay0+c3RhdHVzICYgU0RfU1RBVFVTX1VQREFURUQpIHx8CisJaWYgKChzYmxrLT5zdGF0dXNfdGFnICE9IHRwLT5sYXN0X3RhZykgfHwKIAkgICAgISh0cjMyKFRHM1BDSV9QQ0lTVEFURSkgJiBQQ0lTVEFURV9JTlRfTk9UX0FDVElWRSkpIHsKIAkJLyoKIAkJICogd3JpdGluZyBhbnkgdmFsdWUgdG8gaW50ci1tYm94LTAgY2xlYXJzIFBDSSBJTlRBIyBhbmQKQEAgLTMzNzAsMTkgKzMzNjIsMTcgQEAKIAkJICovCiAJCXR3MzJfbWFpbGJveChNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1csCiAJCQkgICAgIDB4MDAwMDAwMDEpOwotCQl0cC0+bGFzdF90YWcgPSBzYmxrLT5zdGF0dXNfdGFnOwotCQlybWIoKTsKIAkJaWYgKHRnM19pcnFfc3luYyh0cCkpCiAJCQlnb3RvIG91dDsKLQkJc2Jsay0+c3RhdHVzICY9IH5TRF9TVEFUVVNfVVBEQVRFRDsKLQkJaWYgKGxpa2VseSh0ZzNfaGFzX3dvcmsodHApKSkKLQkJCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7CQkvKiBzY2hlZHVsZSBOQVBJIHBvbGwgKi8KLQkJZWxzZSB7Ci0JCQkvKiBubyB3b3JrLCBzaGFyZWQgaW50ZXJydXB0IHBlcmhhcHM/ICByZS1lbmFibGUKLQkJCSAqIGludGVycnVwdHMsIGFuZCBmbHVzaCB0aGF0IFBDSSB3cml0ZQorCQlpZiAobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChkZXYpKSB7CisJCQlwcmVmZXRjaCgmdHAtPnJ4X3JjYlt0cC0+cnhfcmNiX3B0cl0pOworCQkJLyogVXBkYXRlIGxhc3RfdGFnIHRvIG1hcmsgdGhhdCB0aGlzIHN0YXR1cyBoYXMgYmVlbgorCQkJICogc2Vlbi4gQmVjYXVzZSBpbnRlcnJ1cHQgbWF5IGJlIHNoYXJlZCwgd2UgbWF5IGJlCisJCQkgKiByYWNpbmcgd2l0aCB0ZzNfcG9sbCgpLCBzbyBvbmx5IHVwZGF0ZSBsYXN0X3RhZworCQkJICogaWYgdGczX3BvbGwoKSBpcyBub3Qgc2NoZWR1bGVkLgogCQkJICovCi0JCQl0dzMyX21haWxib3hfZihNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1csCi0JCQkJICAgICAgIHRwLT5sYXN0X3RhZyA8PCAyNCk7CisJCQl0cC0+bGFzdF90YWcgPSBzYmxrLT5zdGF0dXNfdGFnOworCQkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOwogCQl9CiAJfSBlbHNlIHsJLyogc2hhcmVkIGludGVycnVwdCAqLwogCQloYW5kbGVkID0gMDsKQEAgLTM3MTYsOCArMzcwNiwxMSBAQAogCXR3MzJfdHhfbWJveCgoTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAgKyBURzNfNjRCSVRfUkVHX0xPVyksIGVudHJ5KTsKIAogCXRwLT50eF9wcm9kID0gZW50cnk7Ci0JaWYgKFRYX0JVRkZTX0FWQUlMKHRwKSA8PSAoTUFYX1NLQl9GUkFHUyArIDEpKQorCWlmIChUWF9CVUZGU19BVkFJTCh0cCkgPD0gKE1BWF9TS0JfRlJBR1MgKyAxKSkgewogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCWlmIChUWF9CVUZGU19BVkFJTCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCkKKwkJCW5ldGlmX3dha2VfcXVldWUodHAtPmRldik7CisJfQogCiBvdXRfdW5sb2NrOgogICAgIAltbWlvd2IoKTsKQEAgLTU5NjAsNyArNTk1Myw3IEBACiAJdHczMihNQUNfTEVEX0NUUkwsIHRwLT5sZWRfY3RybCk7CiAKIAl0dzMyKE1BQ19NSV9TVEFULCBNQUNfTUlfU1RBVF9MTktTVEFUX0FUVE5fRU5BQik7Ci0JaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgeworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0FOWV9TRVJERVMpIHsKIAkJdHczMl9mKE1BQ19SWF9NT0RFLCBSWF9NT0RFX1JFU0VUKTsKIAkJdWRlbGF5KDEwKTsKIAl9CkBAIC02MjQyLDYgKzYyMzUsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKKwl0cC0+aHdfc3RhdHVzLT5zdGF0dXMgJj0gflNEX1NUQVRVU19VUERBVEVEOwogCXRnM19lbmFibGVfaW50cyh0cCk7CiAKIAl0dzMyX2YoSE9TVENDX01PREUsIHRwLT5jb2FsZXNjZV9tb2RlIHwgSE9TVENDX01PREVfRU5BQkxFIHwKQEAgLTc1NTcsNiArNzU1MSwzOCBAQAogCX0KIH0KIAorc3RhdGljIGludCB0ZzNfcGh5c19pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcodHAtPmRldikpCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKGRhdGEgPT0gMCkKKwkJZGF0YSA9IDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGRhdGEgKiAyKTsgaSsrKSB7CisJCWlmICgoaSAlIDIpID09IDApCisJCQl0dzMyKE1BQ19MRURfQ1RSTCwgTEVEX0NUUkxfTE5LTEVEX09WRVJSSURFIHwKKwkJCQkJICAgTEVEX0NUUkxfMTAwME1CUFNfT04gfAorCQkJCQkgICBMRURfQ1RSTF8xMDBNQlBTX09OIHwKKwkJCQkJICAgTEVEX0NUUkxfMTBNQlBTX09OIHwKKwkJCQkJICAgTEVEX0NUUkxfVFJBRkZJQ19PVkVSUklERSB8CisJCQkJCSAgIExFRF9DVFJMX1RSQUZGSUNfQkxJTksgfAorCQkJCQkgICBMRURfQ1RSTF9UUkFGRklDX0xFRCk7CisJCisJCWVsc2UKKwkJCXR3MzIoTUFDX0xFRF9DVFJMLCBMRURfQ1RSTF9MTktMRURfT1ZFUlJJREUgfAorCQkJCQkgICBMRURfQ1RSTF9UUkFGRklDX09WRVJSSURFKTsKKworCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoNTAwKSkKKwkJCWJyZWFrOworCX0KKwl0dzMyKE1BQ19MRURfQ1RSTCwgdHAtPmxlZF9jdHJsKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgdGczX2dldF9ldGh0b29sX3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBldGh0b29sX3N0YXRzICplc3RhdHMsIHU2NCAqdG1wX3N0YXRzKQogewpAQCAtNzYxNiw3ICs3NjQyLDcgQEAKIAlpZiAoIW5ldGlmX3J1bm5pbmcodHAtPmRldikpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9BTllfU0VSREVTKQogCQltYXggPSBURzNfU0VSREVTX1RJTUVPVVRfU0VDOwogCWVsc2UKIAkJbWF4ID0gVEczX0NPUFBFUl9USU1FT1VUX1NFQzsKQEAgLTc5MDEsOSArNzkyNywxMiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgdGczX3Rlc3RfbG9vcGJhY2soc3RydWN0IHRnMyAqdHApCisjZGVmaW5lIFRHM19NQUNfTE9PUEJBQ0sJMAorI2RlZmluZSBURzNfUEhZX0xPT1BCQUNLCTEKKworc3RhdGljIGludCB0ZzNfcnVuX2xvb3BiYWNrKHN0cnVjdCB0ZzMgKnRwLCBpbnQgbG9vcGJhY2tfbW9kZSkKIHsKLQl1MzIgbWFjX21vZGUsIHNlbmRfaWR4LCByeF9zdGFydF9pZHgsIHJ4X2lkeCwgdHhfaWR4LCBvcGFxdWVfa2V5OworCXUzMiBtYWNfbW9kZSwgcnhfc3RhcnRfaWR4LCByeF9pZHgsIHR4X2lkeCwgb3BhcXVlX2tleTsKIAl1MzIgZGVzY19pZHg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnJ4X3NrYjsKIAl1OCAqdHhfZGF0YTsKQEAgLTc5MTEsMTggKzc5NDAsMjYgQEAKIAlpbnQgbnVtX3BrdHMsIHR4X2xlbiwgcnhfbGVuLCBpLCBlcnI7CiAJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyAqZGVzYzsKIAotCWlmICghbmV0aWZfcnVubmluZyh0cC0+ZGV2KSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGxvb3BiYWNrX21vZGUgPT0gVEczX01BQ19MT09QQkFDSykgeworCQltYWNfbW9kZSA9ICh0cC0+bWFjX21vZGUgJiB+TUFDX01PREVfUE9SVF9NT0RFX01BU0spIHwKKwkJCSAgIE1BQ19NT0RFX1BPUlRfSU5UX0xQQkFDSyB8IE1BQ19NT0RFX0xJTktfUE9MQVJJVFkgfAorCQkJICAgTUFDX01PREVfUE9SVF9NT0RFX0dNSUk7CisJCXR3MzIoTUFDX01PREUsIG1hY19tb2RlKTsKKwl9IGVsc2UgaWYgKGxvb3BiYWNrX21vZGUgPT0gVEczX1BIWV9MT09QQkFDSykgeworCQltYWNfbW9kZSA9ICh0cC0+bWFjX21vZGUgJiB+TUFDX01PREVfUE9SVF9NT0RFX01BU0spIHwKKwkJCSAgIE1BQ19NT0RFX0xJTktfUE9MQVJJVFkgfCBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKKwkJaWYgKCh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spID09IFBIWV9JRF9CQ001NDAxKQorCQkJbWFjX21vZGUgJj0gfk1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJCXR3MzIoTUFDX01PREUsIG1hY19tb2RlKTsKKworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBCTUNSX0xPT1BCQUNLIHwgQk1DUl9GVUxMRFBMWCB8CisJCQkJCSAgIEJNQ1JfU1BFRUQxMDAwKTsKKwl9CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWVyciA9IC1FSU87CiAKLQl0ZzNfcmVzZXRfaHcodHApOwotCi0JbWFjX21vZGUgPSAodHAtPm1hY19tb2RlICYgfk1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLKSB8Ci0JCSAgIE1BQ19NT0RFX1BPUlRfSU5UX0xQQkFDSyB8IE1BQ19NT0RFX0xJTktfUE9MQVJJVFkgfAotCQkgICBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKLQl0dzMyKE1BQ19NT0RFLCBtYWNfbW9kZSk7Ci0KIAl0eF9sZW4gPSAxNTE0OwogCXNrYiA9IGRldl9hbGxvY19za2IodHhfbGVuKTsKIAl0eF9kYXRhID0gc2tiX3B1dChza2IsIHR4X2xlbik7CkBAIC03OTQzLDE1ICs3OTgwLDE1IEBACiAKIAlyeF9zdGFydF9pZHggPSB0cC0+aHdfc3RhdHVzLT5pZHhbMF0ucnhfcHJvZHVjZXI7CiAKLQlzZW5kX2lkeCA9IDA7CiAJbnVtX3BrdHMgPSAwOwogCi0JdGczX3NldF90eGQodHAsIHNlbmRfaWR4LCBtYXAsIHR4X2xlbiwgMCwgMSk7CisJdGczX3NldF90eGQodHAsIHRwLT50eF9wcm9kLCBtYXAsIHR4X2xlbiwgMCwgMSk7CiAKLQlzZW5kX2lkeCsrOworCXRwLT50eF9wcm9kKys7CiAJbnVtX3BrdHMrKzsKIAotCXR3MzJfdHhfbWJveChNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMCArIFRHM182NEJJVF9SRUdfTE9XLCBzZW5kX2lkeCk7CisJdHczMl90eF9tYm94KE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csCisJCSAgICAgdHAtPnR4X3Byb2QpOwogCXRyMzJfbWFpbGJveChNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMCArIFRHM182NEJJVF9SRUdfTE9XKTsKIAogCXVkZWxheSgxMCk7CkBAIC03OTY0LDcgKzgwMDEsNyBAQAogCiAJCXR4X2lkeCA9IHRwLT5od19zdGF0dXMtPmlkeFswXS50eF9jb25zdW1lcjsKIAkJcnhfaWR4ID0gdHAtPmh3X3N0YXR1cy0+aWR4WzBdLnJ4X3Byb2R1Y2VyOwotCQlpZiAoKHR4X2lkeCA9PSBzZW5kX2lkeCkgJiYKKwkJaWYgKCh0eF9pZHggPT0gdHAtPnR4X3Byb2QpICYmCiAJCSAgICAocnhfaWR4ID09IChyeF9zdGFydF9pZHggKyBudW1fcGt0cykpKQogCQkJYnJlYWs7CiAJfQpAQCAtNzk3Miw3ICs4MDA5LDcgQEAKIAlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCBtYXAsIHR4X2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAJZGV2X2tmcmVlX3NrYihza2IpOwogCi0JaWYgKHR4X2lkeCAhPSBzZW5kX2lkeCkKKwlpZiAodHhfaWR4ICE9IHRwLT50eF9wcm9kKQogCQlnb3RvIG91dDsKIAogCWlmIChyeF9pZHggIT0gcnhfc3RhcnRfaWR4ICsgbnVtX3BrdHMpCkBAIC04MDA4LDYgKzgwNDUsMzAgQEAKIAlyZXR1cm4gZXJyOwogfQogCisjZGVmaW5lIFRHM19NQUNfTE9PUEJBQ0tfRkFJTEVECQkxCisjZGVmaW5lIFRHM19QSFlfTE9PUEJBQ0tfRkFJTEVECQkyCisjZGVmaW5lIFRHM19MT09QQkFDS19GQUlMRUQJCShURzNfTUFDX0xPT1BCQUNLX0ZBSUxFRCB8CVwKKwkJCQkJIFRHM19QSFlfTE9PUEJBQ0tfRkFJTEVEKQorCitzdGF0aWMgaW50IHRnM190ZXN0X2xvb3BiYWNrKHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBlcnIgPSAwOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKHRwLT5kZXYpKQorCQlyZXR1cm4gVEczX0xPT1BCQUNLX0ZBSUxFRDsKKworCXRnM19yZXNldF9odyh0cCk7CisKKwlpZiAodGczX3J1bl9sb29wYmFjayh0cCwgVEczX01BQ19MT09QQkFDSykpCisJCWVyciB8PSBURzNfTUFDX0xPT1BCQUNLX0ZBSUxFRDsKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpKSB7CisJCWlmICh0ZzNfcnVuX2xvb3BiYWNrKHRwLCBURzNfUEhZX0xPT1BCQUNLKSkKKwkJCWVyciB8PSBURzNfUEhZX0xPT1BCQUNLX0ZBSUxFRDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgdm9pZCB0ZzNfc2VsZl90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3Rlc3QgKmV0ZXN0LAogCQkJICB1NjQgKmRhdGEpCiB7CkBAIC04MDQ4LDEwICs4MTA5LDggQEAKIAkJCWV0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CiAJCQlkYXRhWzNdID0gMTsKIAkJfQotCQlpZiAodGczX3Rlc3RfbG9vcGJhY2sodHApICE9IDApIHsKKwkJaWYgKChkYXRhWzRdID0gdGczX3Rlc3RfbG9vcGJhY2sodHApKSAhPSAwKQogCQkJZXRlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKLQkJCWRhdGFbNF0gPSAxOwotCQl9CiAKIAkJdGczX2Z1bGxfdW5sb2NrKHRwKTsKIApAQCAtODIzOSw2ICs4Mjk4LDcgQEAKIAkuc2VsZl90ZXN0X2NvdW50CT0gdGczX2dldF90ZXN0X2NvdW50LAogCS5zZWxmX3Rlc3QJCT0gdGczX3NlbGZfdGVzdCwKIAkuZ2V0X3N0cmluZ3MJCT0gdGczX2dldF9zdHJpbmdzLAorCS5waHlzX2lkCQk9IHRnM19waHlzX2lkLAogCS5nZXRfc3RhdHNfY291bnQJPSB0ZzNfZ2V0X3N0YXRzX2NvdW50LAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IHRnM19nZXRfZXRodG9vbF9zdGF0cywKIAkuZ2V0X2NvYWxlc2NlCQk9IHRnM19nZXRfY29hbGVzY2UsCkBAIC04MzAzLDcgKzgzNjMsOCBAQAogCQl0dzMyKE5WUkFNX0NGRzEsIG52Y2ZnMSk7CiAJfQogCi0JaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKSB7CisJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkgfHwKKwkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzgwKSkgewogCQlzd2l0Y2ggKG52Y2ZnMSAmIE5WUkFNX0NGRzFfVkVORE9SX01BU0spIHsKIAkJCWNhc2UgRkxBU0hfVkVORE9SX0FUTUVMX0ZMQVNIX0JVRkZFUkVEOgogCQkJCXRwLT5udnJhbV9qZWRlY251bSA9IEpFREVDX0FUTUVMOwpAQCAtODcxNyw4ICs4Nzc4LDkgQEAKIAkJaWYgKGkgPT0gKGxlbiAtIDQpKQogCQkJbnZyYW1fY21kIHw9IE5WUkFNX0NNRF9MQVNUOwogCi0JCWlmICgodHAtPm52cmFtX2plZGVjbnVtID09IEpFREVDX1NUKSAmJgotCQkJKG52cmFtX2NtZCAmIE5WUkFNX0NNRF9GSVJTVCkpIHsKKwkJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTc1MikgJiYKKwkJICAgICh0cC0+bnZyYW1famVkZWNudW0gPT0gSkVERUNfU1QpICYmCisJCSAgICAobnZyYW1fY21kICYgTlZSQU1fQ01EX0ZJUlNUKSkgewogCiAJCQlpZiAoKHJldCA9IHRnM19udnJhbV9leGVjX2NtZCh0cCwKIAkJCQlOVlJBTV9DTURfV1JFTiB8IE5WUkFNX0NNRF9HTyB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9LY29uZmlnIGIvZHJpdmVycy9uZXQvdHVsaXAvS2NvbmZpZwppbmRleCBlMmNkYWY4Li44Yzk2MzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL0tjb25maWcKQEAgLTEzNSw2ICsxMzUsMTggQEAKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsCiAJICBiZSBjYWxsZWQgZG1mZS4KIAorY29uZmlnIFVMSTUyNlgKKwl0cmlzdGF0ZSAiVUxpIE01MjZ4IGNvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9UVUxJUCAmJiBQQ0kKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBpcyBmb3IgVUxpIE01MjYxL001MjYzIDEwLzEwME0gRXRoZXJuZXQgQ29udHJvbGxlcgorCSAgKDxodHRwOi8vd3d3LnVsaS5jb20udHcvPikuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgdWxpNTI2eC4KKwkgIAogY29uZmlnIFBDTUNJQV9YSVJDT00KIAl0cmlzdGF0ZSAiWGlyY29tIENhcmRCdXMgc3VwcG9ydCAobmV3IGRyaXZlcikiCiAJZGVwZW5kcyBvbiBORVRfVFVMSVAgJiYgQ0FSREJVUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC90dWxpcC9NYWtlZmlsZQppbmRleCA4YmI5YjQ2Li40NTEwOTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC90dWxpcC9NYWtlZmlsZQpAQCAtOSw2ICs5LDcgQEAKIG9iai0kKENPTkZJR19ERTIxMDRYKQkJKz0gZGUyMTA0eC5vCiBvYmotJChDT05GSUdfVFVMSVApCQkrPSB0dWxpcC5vCiBvYmotJChDT05GSUdfREU0WDUpCQkrPSBkZTR4NS5vCitvYmotJChDT05GSUdfVUxJNTI2WCkJCSs9IHVsaTUyNngubwogCiAjIERlY2xhcmUgbXVsdGktcGFydCBkcml2ZXJzLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKaW5kZXggZmMzNTNlMy4uYTIyZDAwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwpAQCAtMTkzNCw3ICsxOTM0LDcgQEAKIAlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGU7CiAJaW50IHJjOwogCXZvaWQgX19pb21lbSAqcmVnczsKLQlsb25nIHBjaWFkZHI7CisJdW5zaWduZWQgbG9uZyBwY2lhZGRyOwogCXN0YXRpYyBpbnQgYm9hcmRfaWR4ID0gLTE7CiAKIAlib2FyZF9pZHgrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCmluZGV4IDkzODAwYzEuLmVlNDhiZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwpAQCAtMjE0NCw5ICsyMTQ0LDkgQEAKICAgICB1X2xvbmcgaW9iYXNlID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB1cHBlciAzMiBiaXRzIGluIEFscGhhcyAqLwogICAgIGludCBpLCBqLCBjZnJ2OwogICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAqd2FsayA9ICZwZGV2LT5idXNfbGlzdDsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3YWxrOwogCi0gICAgZm9yICh3YWxrID0gd2Fsay0+bmV4dDsgd2FsayAhPSAmcGRldi0+YnVzX2xpc3Q7IHdhbGsgPSB3YWxrLT5uZXh0KSB7CisgICAgbGlzdF9mb3JfZWFjaCh3YWxrLCAmcGRldi0+YnVzX2xpc3QpIHsKIAlzdHJ1Y3QgcGNpX2RldiAqdGhpc19kZXYgPSBwY2lfZGV2X2Iod2Fsayk7CiAKIAkvKiBTa2lwIHRoZSBwY2lfYnVzIGxpc3QgZW50cnkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMgYi9kcml2ZXJzL25ldC90dWxpcC9tZWRpYS5jCmluZGV4IGUyNmMzMWYuLmY1MzM5NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvbWVkaWEuYwpAQCAtODEsMjUgKzgxLDYgQEAKIAkJcmV0dXJuIHJldHZhbCAmIDB4ZmZmZjsKIAl9CiAKLQlpZih0cC0+Y2hpcF9pZCA9PSBVTEk1MjZYICYmIHRwLT5yZXZpc2lvbiA+PSAweDQwKSB7Ci0JCWludCB2YWx1ZTsKLQkJaW50IGkgPSAxMDAwOwotCQkKLQkJdmFsdWUgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I5KTsKLQkJaW93cml0ZTMyKHZhbHVlICYgMHhGRkVGRkZGRiwgaW9hZGRyICsgQ1NSOSk7Ci0JCQotCQl2YWx1ZSA9IChwaHlfaWQgPDwgMjEpIHwgKGxvY2F0aW9uIDw8IDE2KSB8IDB4MDgwMDAwMDA7Ci0JCWlvd3JpdGUzMih2YWx1ZSwgaW9hZGRyICsgQ1NSMTApOwotCQkKLQkJd2hpbGUoLS1pID4gMCkgewotCQkJbWRpb19kZWxheSgpOwotCQkJaWYoaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTApICYgMHgxMDAwMDAwMCkKLQkJCQlicmVhazsKLQkJfQotCQlyZXR2YWwgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5taWlfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gcmV0dmFsICYgMHhGRkZGOwotCX0KIAkvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIGF0IGxlYXN0IDMyIGxvZ2ljIG9uZXMuICovCiAJZm9yIChpID0gMzI7IGkgPj0gMDsgaS0tKSB7CiAJCWlvd3JpdGUzMihNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CkBAIC0xNTksMjMgKzE0MCw2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5taWlfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQotCWlmICh0cC0+Y2hpcF9pZCA9PSBVTEk1MjZYICYmIHRwLT5yZXZpc2lvbiA+PSAweDQwKSB7Ci0JCWludCB2YWx1ZTsKLQkJaW50IGkgPSAxMDAwOwotCQkKLQkJdmFsdWUgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I5KTsKLQkJaW93cml0ZTMyKHZhbHVlICYgMHhGRkVGRkZGRiwgaW9hZGRyICsgQ1NSOSk7Ci0JCQotCQl2YWx1ZSA9IChwaHlfaWQgPDwgMjEpIHwgKGxvY2F0aW9uIDw8IDE2KSB8IDB4MDQwMDAwMDAgfCAodmFsICYgMHhGRkZGKTsKLQkJaW93cml0ZTMyKHZhbHVlLCBpb2FkZHIgKyBDU1IxMCk7Ci0JCQotCQl3aGlsZSgtLWkgPiAwKSB7Ci0JCQlpZiAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTApICYgMHgxMDAwMDAwMCkKLQkJCQlicmVhazsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bWlpX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KIAkJCiAJLyogRXN0YWJsaXNoIHN5bmMgYnkgc2VuZGluZyAzMiBsb2dpYyBvbmVzLiAqLwogCWZvciAoaSA9IDMyOyBpID49IDA7IGktLSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdGltZXIuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3RpbWVyLmMKaW5kZXggNjkxNTY4Mi4uZTA1OGE5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvdGltZXIuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC90aW1lci5jCkBAIC0zOSw3ICszOSw2IEBACiAJY2FzZSBNWDk4NzEzOgogCWNhc2UgQ09NUEVYOTg4MToKIAljYXNlIERNOTEwWDoKLQljYXNlIFVMSTUyNlg6CiAJZGVmYXVsdDogewogCQlzdHJ1Y3QgbWVkaWFsZWFmICptbGVhZjsKIAkJdW5zaWduZWQgY2hhciAqcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmggYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcC5oCmluZGV4IDIwMzQ2ZDguLjA1ZDJkOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmgKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXAuaApAQCAtODgsNyArODgsNiBAQAogCUkyMTE0NSwKIAlETTkxMFgsCiAJQ09ORVhBTlQsCi0JVUxJNTI2WAogfTsKIAogCkBAIC00ODIsMTEgKzQ4MSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0dWxpcF9yZXN0YXJ0X3J4dHgoc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwKQogewotCWlmKCEodHAtPmNoaXBfaWQgPT0gVUxJNTI2WCAmJiAKLQkJKHRwLT5yZXZpc2lvbiA9PSAweDQwIHx8IHRwLT5yZXZpc2lvbiA9PSAweDUwKSkpIHsKLQkJdHVsaXBfc3RvcF9yeHR4KHRwKTsKLQkJdWRlbGF5KDUpOwotCX0KKwl0dWxpcF9zdG9wX3J4dHgodHApOworCXVkZWxheSg1KTsKIAl0dWxpcF9zdGFydF9yeHR4KHRwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCmluZGV4IGQ0NWQ4ZjUuLjYyNjZhOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKQEAgLTE5OSw5ICsxOTksNiBAQAogICB7ICJDb25leGFudCBMQU5maW5pdHkiLCAyNTYsIDB4MDAwMWViZWYsCiAJSEFTX01JSSB8IEhBU19BQ1BJLCB0dWxpcF90aW1lciB9LAogCi0gICAvKiBVTGk1MjZYICovCi0gICB7ICJVTGkgTTUyNjEvTTUyNjMiLCAxMjgsIDB4MDAwMWViZWYsCi0gICAgICAgIEhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBDU1IxMl9JTl9TUk9NIHwgSEFTX0FDUEksIHR1bGlwX3RpbWVyIH0sCiB9OwogCiAKQEAgLTIzOSwxMCArMjM2LDkgQEAKIAl7IDB4MTczNywgMHhBQjA5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAogCXsgMHgxNzM3LCAweEFCMDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCiAJeyAweDE3QjMsIDB4QUIwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKLSAJeyAweDEwYjksIDB4NTI2MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVUxJNTI2WCB9LAkvKiBBTGkgMTU2MyBpbnRlZ3JhdGVkIGV0aGVybmV0ICovCi0gCXsgMHgxMGI5LCAweDUyNjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFVMSTUyNlggfSwJLyogQUxpIDE1NjMgaW50ZWdyYXRlZCBldGhlcm5ldCAqLwogCXsgMHgxMGI3LCAweDkzMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sIC8qIDNDb20gM0NTT0hPMTAwQi1UWCAqLwogCXsgMHgxNGVhLCAweGFiMDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sIC8qIFBsYW5leCBGTlctMzYwMi1UWCAqLworCXsgMHgxNDE0LCAweDAwMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCiAJeyB9IC8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHR1bGlwX3BjaV90YmwpOwpAQCAtNTIyLDcgKzUxOCw3IEBACiAJCQkJICAgZGV2LT5uYW1lKTsKIAl9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IERDMjExNDAgfHwgdHAtPmNoaXBfaWQgPT0gREMyMTE0MgogCQkJICAgfHwgdHAtPmNoaXBfaWQgPT0gTVg5ODcxMyB8fCB0cC0+Y2hpcF9pZCA9PSBDT01QRVg5ODgxCi0JCQkgICB8fCB0cC0+Y2hpcF9pZCA9PSBETTkxMFggfHwgdHAtPmNoaXBfaWQgPT0gVUxJNTI2WCkgeworCQkJICAgfHwgdHAtPmNoaXBfaWQgPT0gRE05MTBYKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAyMTE0MCB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlOC44eCwgIgogCQkJICAgIlNJQSAlOC44eCAlOC44eCAlOC44eCAlOC44eCwgcmVzZXR0aW5nLi4uXG4iLAogCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpLApAQCAtMTEwMywxOCArMTA5OSwxNiBAQAogCQkJZW50cnkgPSB0cC0+Y3VyX3R4KysgJSBUWF9SSU5HX1NJWkU7CiAKIAkJCWlmIChlbnRyeSAhPSAwKSB7Ci0JCQkJLyogQXZvaWQgYSBjaGlwIGVycmF0YSBieSBwcmVmaXhpbmcgYSBkdW1teSBlbnRyeS4gRG9uJ3QgZG8KLQkJCQkgICB0aGlzIG9uIHRoZSBVTEk1MjZYIGFzIGl0IHRyaWdnZXJzIGEgZGlmZmVyZW50IHByb2JsZW0gKi8KLQkJCQlpZiAoISh0cC0+Y2hpcF9pZCA9PSBVTEk1MjZYICYmICh0cC0+cmV2aXNpb24gPT0gMHg0MCB8fCB0cC0+cmV2aXNpb24gPT0gMHg1MCkpKSB7Ci0JCQkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBOVUxMOwotCQkJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZyA9IDA7Ci0JCQkJCXRwLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggPQotCQkJCQkJKGVudHJ5ID09IFRYX1JJTkdfU0laRS0xKSA/IGNwdV90b19sZTMyKERFU0NfUklOR19XUkFQKSA6IDA7Ci0JCQkJCXRwLT50eF9yaW5nW2VudHJ5XS5idWZmZXIxID0gMDsKLQkJCQkJLyogTXVzdCBzZXQgRGVzY093bmVkIGxhdGVyIHRvIGF2b2lkIHJhY2Ugd2l0aCBjaGlwICovCi0JCQkJCWR1bW15ID0gZW50cnk7Ci0JCQkJCWVudHJ5ID0gdHAtPmN1cl90eCsrICUgVFhfUklOR19TSVpFOwotCQkJCX0KKwkJCQkvKiBBdm9pZCBhIGNoaXAgZXJyYXRhIGJ5IHByZWZpeGluZyBhIGR1bW15IGVudHJ5LiAqLworCQkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBOVUxMOworCQkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nID0gMDsKKwkJCQl0cC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0KKwkJCQkJKGVudHJ5ID09IFRYX1JJTkdfU0laRS0xKSA/IGNwdV90b19sZTMyKERFU0NfUklOR19XUkFQKSA6IDA7CisJCQkJdHAtPnR4X3JpbmdbZW50cnldLmJ1ZmZlcjEgPSAwOworCQkJCS8qIE11c3Qgc2V0IERlc2NPd25lZCBsYXRlciB0byBhdm9pZCByYWNlIHdpdGggY2hpcCAqLworCQkJCWR1bW15ID0gZW50cnk7CisJCQkJZW50cnkgPSB0cC0+Y3VyX3R4KysgJSBUWF9SSU5HX1NJWkU7CisKIAkJCX0KIAogCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9IE5VTEw7CkBAIC0xMjM1LDEwICsxMjI5LDYgQEAKIHsKIAlpZiAocGRldi0+dmVuZG9yID09IDB4MTI4MiAmJiBwZGV2LT5kZXZpY2UgPT0gMHg5MTAyKQogCQlyZXR1cm4gMTsKLQlpZiAocGRldi0+dmVuZG9yID09IDB4MTBiOSAmJiBwZGV2LT5kZXZpY2UgPT0gMHg1MjYxKQotCQlyZXR1cm4gMTsKLQlpZiAocGRldi0+dmVuZG9yID09IDB4MTBiOSAmJiBwZGV2LT5kZXZpY2UgPT0gMHg1MjYzKQotCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTY4MCw3ICsxNjcwLDYgQEAKIAlzd2l0Y2ggKGNoaXBfaWR4KSB7CiAJY2FzZSBEQzIxMTQwOgogCWNhc2UgRE05MTBYOgotCWNhc2UgVUxJNTI2WDoKIAlkZWZhdWx0OgogCQlpZiAodHAtPm10YWJsZSkKIAkJCWlvd3JpdGUzMih0cC0+bXRhYmxlLT5jc3IxMmRpciB8IDB4MTAwLCBpb2FkZHIgKyBDU1IxMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMgYi9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0MzE2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3VsaTUyNnguYwpAQCAtMCwwICsxLDE3NDkgQEAKKy8qCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAgICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAKKyovCisKKyNkZWZpbmUgRFJWX05BTUUJInVsaTUyNngiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjkuMyIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjIwMDUtNy0yOSIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKy8qIEJvYXJkL1N5c3RlbS9EZWJ1ZyBpbmZvcm1hdGlvbi9kZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUENJX1VMSTUyNjFfSUQgIDB4NTI2MTEwQjkJLyogVUxpIE01MjYxIElEKi8KKyNkZWZpbmUgUENJX1VMSTUyNjNfSUQgIDB4NTI2MzEwQjkJLyogVUxpIE01MjYzIElEKi8KKworI2RlZmluZSBVTEk1MjZYX0lPX1NJWkUgMHgxMDAKKyNkZWZpbmUgVFhfREVTQ19DTlQgICAgIDB4MjAgICAgICAgICAgICAvKiBBbGxvY2F0ZWQgVHggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgUlhfREVTQ19DTlQgICAgIDB4MzAgICAgICAgICAgICAvKiBBbGxvY2F0ZWQgUnggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgVFhfRlJFRV9ERVNDX0NOVCAoVFhfREVTQ19DTlQgLSAyKQkvKiBNYXggVFggcGFja2V0IGNvdW50ICovCisjZGVmaW5lIFRYX1dBS0VfREVTQ19DTlQgKFRYX0RFU0NfQ05UIC0gMykJLyogVFggd2FrZXVwIGNvdW50ICovCisjZGVmaW5lIERFU0NfQUxMX0NOVCAgICAoVFhfREVTQ19DTlQgKyBSWF9ERVNDX0NOVCkKKyNkZWZpbmUgVFhfQlVGX0FMTE9DICAgIDB4NjAwCisjZGVmaW5lIFJYX0FMTE9DX1NJWkUgICAweDYyMAorI2RlZmluZSBVTEk1MjZYX1JFU0VUICAgIDEKKyNkZWZpbmUgQ1IwX0RFRkFVTFQgICAgIDAKKyNkZWZpbmUgQ1I2X0RFRkFVTFQgICAgIDB4MjIyMDAwMDAKKyNkZWZpbmUgQ1I3X0RFRkFVTFQgICAgIDB4MTgwYzEKKyNkZWZpbmUgQ1IxNV9ERUZBVUxUICAgIDB4MDYgICAgICAgICAgICAvKiBUeEphYmJlciBSeFdhdGNoZG9nICovCisjZGVmaW5lIFRERVMwX0VSUl9NQVNLICAweDQzMDIgICAgICAgICAgLyogVFhKVCwgTEMsIEVDLCBGVUUgKi8KKyNkZWZpbmUgTUFYX1BBQ0tFVF9TSVpFIDE1MTQKKyNkZWZpbmUgVUxJNTI2MV9NQVhfTVVMVElDQVNUIDE0CisjZGVmaW5lIFJYX0NPUFlfU0laRQkxMDAKKyNkZWZpbmUgTUFYX0NIRUNLX1BBQ0tFVCAweDgwMDAKKworI2RlZmluZSBVTEk1MjZYXzEwTUhGICAgICAgMAorI2RlZmluZSBVTEk1MjZYXzEwME1IRiAgICAgMQorI2RlZmluZSBVTEk1MjZYXzEwTUZEICAgICAgNAorI2RlZmluZSBVTEk1MjZYXzEwME1GRCAgICAgNQorI2RlZmluZSBVTEk1MjZYX0FVVE8gICAgICAgOAorCisjZGVmaW5lIFVMSTUyNlhfVFhUSF83MgkweDQwMDAwMAkvKiBUWCBUSCA3MiBieXRlICovCisjZGVmaW5lIFVMSTUyNlhfVFhUSF85NgkweDQwNDAwMAkvKiBUWCBUSCA5NiBieXRlICovCisjZGVmaW5lIFVMSTUyNlhfVFhUSF8xMjgJMHgwMDAwCQkvKiBUWCBUSCAxMjggYnl0ZSAqLworI2RlZmluZSBVTEk1MjZYX1RYVEhfMjU2CTB4NDAwMAkJLyogVFggVEggMjU2IGJ5dGUgKi8KKyNkZWZpbmUgVUxJNTI2WF9UWFRIXzUxMgkweDgwMDAJCS8qIFRYIFRIIDUxMiBieXRlICovCisjZGVmaW5lIFVMSTUyNlhfVFhUSF8xSwkweEMwMDAJCS8qIFRYIFRIIDFLICBieXRlICovCisKKyNkZWZpbmUgVUxJNTI2WF9USU1FUl9XVVQgIChqaWZmaWVzICsgSFogKiAxKS8qIHRpbWVyIHdha2V1cCB0aW1lIDogMSBzZWNvbmQgKi8KKyNkZWZpbmUgVUxJNTI2WF9UWF9USU1FT1VUICgoMTYqSFopLzIpCS8qIHR4IHBhY2tldCB0aW1lLW91dCB0aW1lIDggcyIgKi8KKyNkZWZpbmUgVUxJNTI2WF9UWF9LSUNLIAkoNCpIWi8yKQkvKiB0eCBwYWNrZXQgS2ljay1vdXQgdGltZSAyIHMiICovCisKKyNkZWZpbmUgVUxJNTI2WF9EQlVHKGRidWdfbm93LCBtc2csIHZhbHVlKSBpZiAodWxpNTI2eF9kZWJ1ZyB8fCAoZGJ1Z19ub3cpKSBwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXMgJWx4XG4iLCAobXNnKSwgKGxvbmcpICh2YWx1ZSkpCisKKyNkZWZpbmUgU0hPV19NRURJQV9UWVBFKG1vZGUpIHByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBDaGFuZ2UgU3BlZWQgdG8gJXNNaHogJXMgZHVwbGV4XG4iLG1vZGUgJiAxID8iMTAwIjoiMTAiLCBtb2RlICYgNCA/ICJmdWxsIjoiaGFsZiIpOworCisKKy8qIENSOSBkZWZpbml0aW9uOiBTUk9NL01JSSAqLworI2RlZmluZSBDUjlfU1JPTV9SRUFEICAgMHg0ODAwCisjZGVmaW5lIENSOV9TUkNTICAgICAgICAweDEKKyNkZWZpbmUgQ1I5X1NSQ0xLICAgICAgIDB4MgorI2RlZmluZSBDUjlfQ1JET1VUICAgICAgMHg4CisjZGVmaW5lIFNST01fREFUQV8wICAgICAweDAKKyNkZWZpbmUgU1JPTV9EQVRBXzEgICAgIDB4NAorI2RlZmluZSBQSFlfREFUQV8xICAgICAgMHgyMDAwMAorI2RlZmluZSBQSFlfREFUQV8wICAgICAgMHgwMDAwMAorI2RlZmluZSBNRENMS0ggICAgICAgICAgMHgxMDAwMAorCisjZGVmaW5lIFBIWV9QT1dFUl9ET1dOCTB4ODAwCisKKyNkZWZpbmUgU1JPTV9WNDFfQ09ERSAgIDB4MTQKKworI2RlZmluZSBTUk9NX0NMS19XUklURShkYXRhLCBpb2FkZHIpCQkJCQlcCisJCW91dGwoZGF0YXxDUjlfU1JPTV9SRUFEfENSOV9TUkNTLGlvYWRkcik7CQlcCisJCXVkZWxheSg1KTsJCQkJCQlcCisJCW91dGwoZGF0YXxDUjlfU1JPTV9SRUFEfENSOV9TUkNTfENSOV9TUkNMSyxpb2FkZHIpOwlcCisJCXVkZWxheSg1KTsJCQkJCQlcCisJCW91dGwoZGF0YXxDUjlfU1JPTV9SRUFEfENSOV9TUkNTLGlvYWRkcik7CQlcCisJCXVkZWxheSg1KTsKKworLyogU3RydWN0dXJlL2VudW0gZGVjbGFyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RydWN0IHR4X2Rlc2MgeworICAgICAgICB1MzIgdGRlczAsIHRkZXMxLCB0ZGVzMiwgdGRlczM7IC8qIERhdGEgZm9yIHRoZSBjYXJkICovCisgICAgICAgIGNoYXIgKnR4X2J1Zl9wdHI7ICAgICAgICAgICAgICAgLyogRGF0YSBmb3IgdXMgKi8KKyAgICAgICAgc3RydWN0IHR4X2Rlc2MgKm5leHRfdHhfZGVzYzsKK30gX19hdHRyaWJ1dGVfXygoIGFsaWduZWQoMzIpICkpOworCitzdHJ1Y3QgcnhfZGVzYyB7CisJdTMyIHJkZXMwLCByZGVzMSwgcmRlczIsIHJkZXMzOyAvKiBEYXRhIGZvciB0aGUgY2FyZCAqLworCXN0cnVjdCBza19idWZmICpyeF9za2JfcHRyOwkvKiBEYXRhIGZvciB1cyAqLworCXN0cnVjdCByeF9kZXNjICpuZXh0X3J4X2Rlc2M7Cit9IF9fYXR0cmlidXRlX18oKCBhbGlnbmVkKDMyKSApKTsKKworc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyB7CisJdTMyIGNoaXBfaWQ7CQkJLyogQ2hpcCB2ZW5kb3IvRGV2aWNlIElEICovCisJc3RydWN0IG5ldF9kZXZpY2UgKm5leHRfZGV2OwkvKiBuZXh0IGRldmljZSAqLworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkJLyogUENJIGRldmljZSAqLworCXNwaW5sb2NrX3QgbG9jazsKKworCWxvbmcgaW9hZGRyOwkJCS8qIEkvTyBiYXNlIGFkZHJlc3MgKi8KKwl1MzIgY3IwX2RhdGE7CisJdTMyIGNyNV9kYXRhOworCXUzMiBjcjZfZGF0YTsKKwl1MzIgY3I3X2RhdGE7CisJdTMyIGNyMTVfZGF0YTsKKworCS8qIHBvaW50ZXIgZm9yIG1lbW9yeSBwaHlzaWNhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdCBidWZfcG9vbF9kbWFfcHRyOwkvKiBUeCBidWZmZXIgcG9vbCBtZW1vcnkgKi8KKwlkbWFfYWRkcl90IGJ1Zl9wb29sX2RtYV9zdGFydDsJLyogVHggYnVmZmVyIHBvb2wgYWxpZ24gZHdvcmQgKi8KKwlkbWFfYWRkcl90IGRlc2NfcG9vbF9kbWFfcHRyOwkvKiBkZXNjcmlwdG9yIHBvb2wgbWVtb3J5ICovCisJZG1hX2FkZHJfdCBmaXJzdF90eF9kZXNjX2RtYTsKKwlkbWFfYWRkcl90IGZpcnN0X3J4X2Rlc2NfZG1hOworCisJLyogZGVzY3JpcHRvciBwb2ludGVyICovCisJdW5zaWduZWQgY2hhciAqYnVmX3Bvb2xfcHRyOwkvKiBUeCBidWZmZXIgcG9vbCBtZW1vcnkgKi8KKwl1bnNpZ25lZCBjaGFyICpidWZfcG9vbF9zdGFydDsJLyogVHggYnVmZmVyIHBvb2wgYWxpZ24gZHdvcmQgKi8KKwl1bnNpZ25lZCBjaGFyICpkZXNjX3Bvb2xfcHRyOwkvKiBkZXNjcmlwdG9yIHBvb2wgbWVtb3J5ICovCisJc3RydWN0IHR4X2Rlc2MgKmZpcnN0X3R4X2Rlc2M7CisJc3RydWN0IHR4X2Rlc2MgKnR4X2luc2VydF9wdHI7CisJc3RydWN0IHR4X2Rlc2MgKnR4X3JlbW92ZV9wdHI7CisJc3RydWN0IHJ4X2Rlc2MgKmZpcnN0X3J4X2Rlc2M7CisJc3RydWN0IHJ4X2Rlc2MgKnJ4X2luc2VydF9wdHI7CisJc3RydWN0IHJ4X2Rlc2MgKnJ4X3JlYWR5X3B0cjsJLyogcGFja2V0IGNvbWUgcG9pbnRlciAqLworCXVuc2lnbmVkIGxvbmcgdHhfcGFja2V0X2NudDsJLyogdHJhbnNtaXR0ZWQgcGFja2V0IGNvdW50ICovCisJdW5zaWduZWQgbG9uZyByeF9hdmFpbF9jbnQ7CS8qIGF2YWlsYWJsZSByeCBkZXNjcmlwdG9yIGNvdW50ICovCisJdW5zaWduZWQgbG9uZyBpbnRlcnZhbF9yeF9jbnQ7CS8qIHJ4IHBhY2tldCBjb3VudCBhIGNhbGxiYWNrIHRpbWUgKi8KKworCXUxNiBkYnVnX2NudDsKKwl1MTYgTklDX2NhcGFiaWxpdHk7CQkvKiBOSUMgbWVkaWEgY2FwYWJpbGl0eSAqLworCXUxNiBQSFlfcmVnNDsJCQkvKiBTYXZlZCBQaHl4Y2VyIHJlZ2lzdGVyIDQgdmFsdWUgKi8KKworCXU4IG1lZGlhX21vZGU7CQkJLyogdXNlciBzcGVjaWZ5IG1lZGlhIG1vZGUgKi8KKwl1OCBvcF9tb2RlOwkJCS8qIHJlYWwgd29yayBtZWRpYSBtb2RlICovCisJdTggcGh5X2FkZHI7CisJdTggbGlua19mYWlsZWQ7CQkJLyogRXZlciBsaW5rIGZhaWxlZCAqLworCXU4IHdhaXRfcmVzZXQ7CQkJLyogSGFyZHdhcmUgZmFpbGVkLCBuZWVkIHRvIHJlc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKwkvKiBTeXN0ZW0gZGVmaW5lZCBzdGF0aXN0aWMgY291bnRlciAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJLyogRHJpdmVyIGRlZmluZWQgc3RhdGlzdGljIGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2ZpZm9fdW5kZXJydW47CisJdW5zaWduZWQgbG9uZyB0eF9sb3NzX2NhcnJpZXI7CisJdW5zaWduZWQgbG9uZyB0eF9ub19jYXJyaWVyOworCXVuc2lnbmVkIGxvbmcgdHhfbGF0ZV9jb2xsaXNpb247CisJdW5zaWduZWQgbG9uZyB0eF9leGNlc3NpdmVfY29sbGlzaW9uOworCXVuc2lnbmVkIGxvbmcgdHhfamFiYmVyX3RpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyByZXNldF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHJlc2V0X2NyODsKKwl1bnNpZ25lZCBsb25nIHJlc2V0X2ZhdGFsOworCXVuc2lnbmVkIGxvbmcgcmVzZXRfVFh0aW1lb3V0OworCisJLyogTklDIFNST00gZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgc3JvbVsxMjhdOworCXU4IGluaXQ7CQorfTsKKworZW51bSB1bGk1MjZ4X29mZnNldHMgeworCURDUjAgPSAweDAwLCBEQ1IxID0gMHgwOCwgRENSMiA9IDB4MTAsIERDUjMgPSAweDE4LCBEQ1I0ID0gMHgyMCwKKwlEQ1I1ID0gMHgyOCwgRENSNiA9IDB4MzAsIERDUjcgPSAweDM4LCBEQ1I4ID0gMHg0MCwgRENSOSA9IDB4NDgsCisJRENSMTAgPSAweDUwLCBEQ1IxMSA9IDB4NTgsIERDUjEyID0gMHg2MCwgRENSMTMgPSAweDY4LCBEQ1IxNCA9IDB4NzAsCisJRENSMTUgPSAweDc4Cit9OworCitlbnVtIHVsaTUyNnhfQ1I2X2JpdHMgeworCUNSNl9SWFNDID0gMHgyLCBDUjZfUEJGID0gMHg4LCBDUjZfUE0gPSAweDQwLCBDUjZfUEFNID0gMHg4MCwKKwlDUjZfRkRNID0gMHgyMDAsIENSNl9UWFNDID0gMHgyMDAwLCBDUjZfU1RJID0gMHgxMDAwMDAsCisJQ1I2X1NGVCA9IDB4MjAwMDAwLCBDUjZfUlhBID0gMHg0MDAwMDAwMCwgQ1I2X05PX1BVUkdFID0gMHgyMDAwMDAwMAorfTsKKworLyogR2xvYmFsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgcHJpbnRlZF92ZXJzaW9uOworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCUtFUk5fSU5GTyBEUlZfTkFNRSAiOiBVTGkgTTUyNjEvTTUyNjMgbmV0IGRyaXZlciwgdmVyc2lvbiAiCisJRFJWX1ZFUlNJT04gIiAoIiBEUlZfUkVMREFURSAiKVxuIjsKKworc3RhdGljIGludCB1bGk1MjZ4X2RlYnVnOworc3RhdGljIHVuc2lnbmVkIGNoYXIgdWxpNTI2eF9tZWRpYV9tb2RlID0gVUxJNTI2WF9BVVRPOworc3RhdGljIHUzMiB1bGk1MjZ4X2NyNl91c2VyX3NldDsKKworLyogRm9yIG1vZHVsZSBpbnB1dCBwYXJhbWV0ZXIgKi8KK3N0YXRpYyBpbnQgZGVidWc7CitzdGF0aWMgdTMyIGNyNnNldDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1vZGUgPSA4OworCisvKiBmdW5jdGlvbiBkZWNsYXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IHVsaTUyNnhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgdWxpNTI2eF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCB1bGk1MjZ4X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiB1bGk1MjZ4X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIHVsaTUyNnhfc2V0X2ZpbHRlcl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CitzdGF0aWMgdTE2IHJlYWRfc3JvbV93b3JkKGxvbmcsIGludCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgdWxpNTI2eF9pbnRlcnJ1cHQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIHZvaWQgdWxpNTI2eF9kZXNjcmlwdG9yX2luaXQoc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqLCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIGFsbG9jYXRlX3J4X2J1ZmZlcihzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICopOworc3RhdGljIHZvaWQgdXBkYXRlX2NyNih1MzIsIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgc2VuZF9maWx0ZXJfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50KTsKK3N0YXRpYyB1MTYgcGh5X3JlYWQodW5zaWduZWQgbG9uZywgdTgsIHU4LCB1MzIpOworc3RhdGljIHUxNiBwaHlfcmVhZGJ5X2NyMTAodW5zaWduZWQgbG9uZywgdTgsIHU4KTsKK3N0YXRpYyB2b2lkIHBoeV93cml0ZSh1bnNpZ25lZCBsb25nLCB1OCwgdTgsIHUxNiwgdTMyKTsKK3N0YXRpYyB2b2lkIHBoeV93cml0ZWJ5X2NyMTAodW5zaWduZWQgbG9uZywgdTgsIHU4LCB1MTYpOworc3RhdGljIHZvaWQgcGh5X3dyaXRlXzFiaXQodW5zaWduZWQgbG9uZywgdTMyLCB1MzIpOworc3RhdGljIHUxNiBwaHlfcmVhZF8xYml0KHVuc2lnbmVkIGxvbmcsIHUzMik7CitzdGF0aWMgdTggdWxpNTI2eF9zZW5zZV9zcGVlZChzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICopOworc3RhdGljIHZvaWQgdWxpNTI2eF9wcm9jZXNzX21vZGUoc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqKTsKK3N0YXRpYyB2b2lkIHVsaTUyNnhfdGltZXIodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCB1bGk1MjZ4X3J4X3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICopOworc3RhdGljIHZvaWQgdWxpNTI2eF9mcmVlX3R4X3BrdChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICopOworc3RhdGljIHZvaWQgdWxpNTI2eF9yZXVzZV9za2Ioc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyB2b2lkIHVsaTUyNnhfZHluYW1pY19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIHVsaTUyNnhfZnJlZV9yeGJ1ZmZlcihzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICopOworc3RhdGljIHZvaWQgdWxpNTI2eF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQgdWxpNTI2eF9zZXRfcGh5eGNlcihzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICopOworCisvKiBVTEk1MjZYIG5ldHdvcmsgYm9hcmQgcm91dGluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKglTZWFyY2ggVUxJNTI2WCBib2FyZCwgYWxsb2NhdGUgc3BhY2UgYW5kIHJlZ2lzdGVyIGl0CisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgdWxpNTI2eF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqZGI7CS8qIGJvYXJkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGksIGVycjsKKwkKKwlVTEk1MjZYX0RCVUcoMCwgInVsaTUyNnhfaW5pdF9vbmUoKSIsIDApOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKHZlcnNpb24pOworCisJLyogSW5pdCBuZXR3b3JrIGRldmljZSAqLworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqZGIpKTsKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogMzItYml0IFBDSSBETUEgbm90IGF2YWlsYWJsZS5cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZnJlZTsKKwl9CisKKwkvKiBFbmFibGUgTWFzdGVyL0lPIGFjY2VzcywgRGlzYWJsZSBtZW1vcnkgYWNjZXNzICovCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisKKwlpZiAoIXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogSS9PIGJhc2UgaXMgemVyb1xuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCX0KKworCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApIDwgKFVMSTUyNlhfSU9fU0laRSkgKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBBbGxvY2F0ZWQgSS9PIHNpemUgdG9vIHNtYWxsXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBGYWlsZWQgdG8gcmVxdWVzdCBQQ0kgcmVnaW9uc1xuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCX0KKworCS8qIEluaXQgc3lzdGVtICYgZGV2aWNlICovCisJZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogQWxsb2NhdGUgVHgvUnggZGVzY3JpcHRvciBtZW1vcnkgKi8KKwlkYi0+ZGVzY19wb29sX3B0ciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiBERVNDX0FMTF9DTlQgKyAweDIwLCAmZGItPmRlc2NfcG9vbF9kbWFfcHRyKTsKKwlpZihkYi0+ZGVzY19wb29sX3B0ciA9PSBOVUxMKQorCXsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X25vbWVtOworCX0KKwlkYi0+YnVmX3Bvb2xfcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgVFhfQlVGX0FMTE9DICogVFhfREVTQ19DTlQgKyA0LCAmZGItPmJ1Zl9wb29sX2RtYV9wdHIpOworCWlmKGRiLT5idWZfcG9vbF9wdHIgPT0gTlVMTCkKKwl7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9ub21lbTsKKwl9CisJCisJZGItPmZpcnN0X3R4X2Rlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKikgZGItPmRlc2NfcG9vbF9wdHI7CisJZGItPmZpcnN0X3R4X2Rlc2NfZG1hID0gZGItPmRlc2NfcG9vbF9kbWFfcHRyOworCWRiLT5idWZfcG9vbF9zdGFydCA9IGRiLT5idWZfcG9vbF9wdHI7CisJZGItPmJ1Zl9wb29sX2RtYV9zdGFydCA9IGRiLT5idWZfcG9vbF9kbWFfcHRyOworCisJZGItPmNoaXBfaWQgPSBlbnQtPmRyaXZlcl9kYXRhOworCWRiLT5pb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJCisJZGItPnBkZXYgPSBwZGV2OworCWRiLT5pbml0ID0gMTsKKwkKKwlkZXYtPmJhc2VfYWRkciA9IGRiLT5pb2FkZHI7CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJCisJLyogUmVnaXN0ZXIgc29tZSBuZWNlc3NhcnkgZnVuY3Rpb25zICovCisJZGV2LT5vcGVuID0gJnVsaTUyNnhfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ1bGk1MjZ4X3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gJnVsaTUyNnhfc3RvcDsKKwlkZXYtPmdldF9zdGF0cyA9ICZ1bGk1MjZ4X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZ1bGk1MjZ4X3NldF9maWx0ZXJfbW9kZTsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKKwlzcGluX2xvY2tfaW5pdCgmZGItPmxvY2spOworCisJCQorCS8qIHJlYWQgNjQgd29yZCBzcm9tIGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKwkJKCh1MTYgKikgZGItPnNyb20pW2ldID0gY3B1X3RvX2xlMTYocmVhZF9zcm9tX3dvcmQoZGItPmlvYWRkciwgaSkpOworCisJLyogU2V0IE5vZGUgYWRkcmVzcyAqLworCWlmKCgodTE2ICopIGRiLT5zcm9tKVswXSA9PSAweGZmZmYgfHwgKCh1MTYgKikgZGItPnNyb20pWzBdID09IDApCQkvKiBTUk9NIGFic2VudCwgc28gcmVhZCBNQUMgYWRkcmVzcyBmcm9tIElEIFRhYmxlICovCisJeworCQlvdXRsKDB4MTAwMDAsIGRiLT5pb2FkZHIgKyBEQ1IwKTsJLy9EaWFnbm9zaXMgbW9kZQorCQlvdXRsKDB4MWMwLCBkYi0+aW9hZGRyICsgRENSMTMpOwkvL1Jlc2V0IGRpYW5vc3RpYyBwb2ludGVyIHBvcnQKKwkJb3V0bCgwLCBkYi0+aW9hZGRyICsgRENSMTQpOwkJLy9DbGVhciByZXNldCBwb3J0CisJCW91dGwoMHgxMCwgZGItPmlvYWRkciArIERDUjE0KTsJCS8vUmVzZXQgSUQgVGFibGUgcG9pbnRlcgorCQlvdXRsKDAsIGRiLT5pb2FkZHIgKyBEQ1IxNCk7CQkvL0NsZWFyIHJlc2V0IHBvcnQKKwkJb3V0bCgwLCBkYi0+aW9hZGRyICsgRENSMTMpOwkJLy9DbGVhciBDUjEzCisJCW91dGwoMHgxYjAsIGRiLT5pb2FkZHIgKyBEQ1IxMyk7CS8vU2VsZWN0IElEIFRhYmxlIGFjY2VzcyBwb3J0CisJCS8vUmVhZCBNQUMgYWRkcmVzcyBmcm9tIENSMTQKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCWRldi0+ZGV2X2FkZHJbaV0gPSBpbmwoZGItPmlvYWRkciArIERDUjE0KTsKKwkJLy9SZWFkIGVuZAorCQlvdXRsKDAsIGRiLT5pb2FkZHIgKyBEQ1IxMyk7CS8vQ2xlYXIgQ1IxMworCQlvdXRsKDAsIGRiLT5pb2FkZHIgKyBEQ1IwKTsJCS8vQ2xlYXIgQ1IwCisJCXVkZWxheSgxMCk7CisJfQorCWVsc2UJCS8qRXhpc3QgU1JPTSovCisJeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJZGV2LT5kZXZfYWRkcltpXSA9IGRiLT5zcm9tWzIwICsgaV07CisJfQorCWVyciA9IHJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfcmVzOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVMaSBNJTA0bHggYXQgcGNpJXMsIixkZXYtPm5hbWUsZW50LT5kcml2ZXJfZGF0YSA+PiAxNixwY2lfbmFtZShwZGV2KSk7CisJCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlYyUwMngiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiwgaXJxICVkLlxuIiwgZGV2LT5pcnEpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfbm9tZW06CisJaWYoZGItPmRlc2NfcG9vbF9wdHIpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIERFU0NfQUxMX0NOVCArIDB4MjAsCisJCQlkYi0+ZGVzY19wb29sX3B0ciwgZGItPmRlc2NfcG9vbF9kbWFfcHRyKTsKKwkJCQorCWlmKGRiLT5idWZfcG9vbF9wdHIgIT0gTlVMTCkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9CVUZfQUxMT0MgKiBUWF9ERVNDX0NOVCArIDQsCisJCQlkYi0+YnVmX3Bvb2xfcHRyLCBkYi0+YnVmX3Bvb2xfZG1hX3B0cik7CitlcnJfb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyX291dF9mcmVlOgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdWxpNTI2eF9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB1bGk1MjZ4X2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCVVMSTUyNlhfREJVRygwLCAidWxpNTI2eF9yZW1vdmVfb25lKCkiLCAwKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGItPnBkZXYsIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKgorCQkJCURFU0NfQUxMX0NOVCArIDB4MjAsIGRiLT5kZXNjX3Bvb2xfcHRyLAorIAkJCQlkYi0+ZGVzY19wb29sX2RtYV9wdHIpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGItPnBkZXYsIFRYX0JVRl9BTExPQyAqIFRYX0RFU0NfQ05UICsgNCwKKwkJCQlkYi0+YnVmX3Bvb2xfcHRyLCBkYi0+YnVmX3Bvb2xfZG1hX3B0cik7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7CS8qIGZyZWUgYm9hcmQgaW5mb3JtYXRpb24gKi8KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCVVMSTUyNlhfREJVRygwLCAidWxpNTI2eF9yZW1vdmVfb25lKCkgZXhpdCIsIDApOworfQorCisKKy8qCisgKglPcGVuIHRoZSBpbnRlcmZhY2UuCisgKglUaGUgaW50ZXJmYWNlIGlzIG9wZW5lZCB3aGVuZXZlciAiaWZjb25maWciIGFjdGl2YXRlcyBpdC4KKyAqLworCitzdGF0aWMgaW50IHVsaTUyNnhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCVVMSTUyNlhfREJVRygwLCAidWxpNTI2eF9vcGVuIiwgMCk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnVsaTUyNnhfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBzeXN0ZW0gdmFyaWFibGUgaW5pdCAqLworCWRiLT5jcjZfZGF0YSA9IENSNl9ERUZBVUxUIHwgdWxpNTI2eF9jcjZfdXNlcl9zZXQ7CisJZGItPnR4X3BhY2tldF9jbnQgPSAwOworCWRiLT5yeF9hdmFpbF9jbnQgPSAwOworCWRiLT5saW5rX2ZhaWxlZCA9IDE7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwlkYi0+d2FpdF9yZXNldCA9IDA7CisKKwlkYi0+TklDX2NhcGFiaWxpdHkgPSAweGY7CS8qIEFsbCBjYXBhYmlsaXR5Ki8KKwlkYi0+UEhZX3JlZzQgPSAweDFlMDsKKworCS8qIENSNiBvcGVyYXRpb24gbW9kZSBkZWNpc2lvbiAqLworCWRiLT5jcjZfZGF0YSB8PSBVTEk1MjZYX1RYVEhfMjU2OworCWRiLT5jcjBfZGF0YSA9IENSMF9ERUZBVUxUOworCQorCS8qIEluaXRpYWxpemUgVUxJNTI2WCBib2FyZCAqLworCXVsaTUyNnhfaW5pdChkZXYpOworCisJLyogQWN0aXZlIFN5c3RlbSBJbnRlcmZhY2UgKi8KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwkvKiBzZXQgYW5kIGFjdGl2ZSBhIHRpbWVyIHByb2Nlc3MgKi8KKwlpbml0X3RpbWVyKCZkYi0+dGltZXIpOworCWRiLT50aW1lci5leHBpcmVzID0gVUxJNTI2WF9USU1FUl9XVVQgKyBIWiAqIDI7CisJZGItPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJZGItPnRpbWVyLmZ1bmN0aW9uID0gJnVsaTUyNnhfdGltZXI7CisJYWRkX3RpbWVyKCZkYi0+dGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoJSW5pdGlhbGl6ZSBVTEk1MjZYIGJvYXJkCisgKglSZXNldCBVTEk1MjZYIGJvYXJkCisgKglJbml0aWFsaXplIFRYL1J4IGRlc2NyaXB0b3IgY2hhaW4gc3RydWN0dXJlCisgKglTZW5kIHRoZSBzZXQtdXAgZnJhbWUKKyAqCUVuYWJsZSBUeC9SeCBtYWNoaW5lCisgKi8KKworc3RhdGljIHZvaWQgdWxpNTI2eF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGItPmlvYWRkcjsKKwl1OAlwaHlfdG1wOworCXUxNglwaHlfdmFsdWU7CisJdTE2IHBoeV9yZWdfcmVzZXQ7CisKKwlVTEk1MjZYX0RCVUcoMCwgInVsaTUyNnhfaW5pdCgpIiwgMCk7CisKKwkvKiBSZXNldCBNNTI2eCBNQUMgY29udHJvbGxlciAqLworCW91dGwoVUxJNTI2WF9SRVNFVCwgaW9hZGRyICsgRENSMCk7CS8qIFJFU0VUIE1BQyAqLworCXVkZWxheSgxMDApOworCW91dGwoZGItPmNyMF9kYXRhLCBpb2FkZHIgKyBEQ1IwKTsKKwl1ZGVsYXkoNSk7CisKKwkvKiBQaHkgYWRkciA6IEluIHNvbWUgYm9hcmRzLE01MjYxL001MjYzIHBoeSBhZGRyZXNzICE9IDEgKi8KKwlkYi0+cGh5X2FkZHIgPSAxOworCWZvcihwaHlfdG1wPTA7cGh5X3RtcDwzMjtwaHlfdG1wKyspCisJeworCQlwaHlfdmFsdWU9cGh5X3JlYWQoZGItPmlvYWRkcixwaHlfdG1wLDMsZGItPmNoaXBfaWQpOy8vcGVlciBhZGQKKwkJaWYocGh5X3ZhbHVlICE9IDB4ZmZmZiYmcGh5X3ZhbHVlIT0wKQorCQl7CisJCQlkYi0+cGh5X2FkZHIgPSBwaHlfdG1wOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYocGh5X3RtcCA9PSAzMikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuIG5vdCBmaW5kIHRoZSBwaHkgYWRkcmVzcyEhISIpOworCS8qIFBhcnNlciBTUk9NIGFuZCBtZWRpYSBtb2RlICovCisJZGItPm1lZGlhX21vZGUgPSB1bGk1MjZ4X21lZGlhX21vZGU7CisKKwkvKiBQaHl4Y2VyIGNhcGFiaWxpdHkgc2V0dGluZyAqLworCXBoeV9yZWdfcmVzZXQgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIGRiLT5jaGlwX2lkKTsKKwlwaHlfcmVnX3Jlc2V0ID0gKHBoeV9yZWdfcmVzZXQgfCAweDgwMDApOworCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIHBoeV9yZWdfcmVzZXQsIGRiLT5jaGlwX2lkKTsKKwl1ZGVsYXkoNTAwKTsKKworCS8qIFByb2Nlc3MgUGh5eGNlciBNZWRpYSBNb2RlICovCisJdWxpNTI2eF9zZXRfcGh5eGNlcihkYik7CisKKwkvKiBNZWRpYSBNb2RlIFByb2Nlc3MgKi8KKwlpZiAoICEoZGItPm1lZGlhX21vZGUgJiBVTEk1MjZYX0FVVE8pICkKKwkJZGItPm9wX21vZGUgPSBkYi0+bWVkaWFfbW9kZTsgCS8qIEZvcmNlIE1vZGUgKi8KKworCS8qIEluaXRpYWxpemUgVHJhbnNtaXQvUmVjZWl2ZSBkZWNyaXB0b3IgYW5kIENSMy80ICovCisJdWxpNTI2eF9kZXNjcmlwdG9yX2luaXQoZGIsIGlvYWRkcik7CisKKwkvKiBJbml0IENSNiB0byBwcm9ncmFtIE01MjZYIG9wZXJhdGlvbiAqLworCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBpb2FkZHIpOworCisJLyogU2VuZCBzZXR1cCBmcmFtZSAqLworCXNlbmRfZmlsdGVyX2ZyYW1lKGRldiwgZGV2LT5tY19jb3VudCk7CS8qIE01MjYxL001MjYzICovCisKKwkvKiBJbml0IENSNywgaW50ZXJydXB0IGFjdGl2ZSBiaXQgKi8KKwlkYi0+Y3I3X2RhdGEgPSBDUjdfREVGQVVMVDsKKwlvdXRsKGRiLT5jcjdfZGF0YSwgaW9hZGRyICsgRENSNyk7CisKKwkvKiBJbml0IENSMTUsIFR4IGphYmJlciBhbmQgUnggd2F0Y2hkb2cgdGltZXIgKi8KKwlvdXRsKGRiLT5jcjE1X2RhdGEsIGlvYWRkciArIERDUjE1KTsKKworCS8qIEVuYWJsZSBVTEk1MjZYIFR4L1J4IGZ1bmN0aW9uICovCisJZGItPmNyNl9kYXRhIHw9IENSNl9SWFNDIHwgQ1I2X1RYU0M7CisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGlvYWRkcik7Cit9CisKKworLyoKKyAqCUhhcmR3YXJlIHN0YXJ0IHRyYW5zbWlzc2lvbi4KKyAqCVNlbmQgYSBwYWNrZXQgdG8gbWVkaWEgZnJvbSB0aGUgdXBwZXIgbGF5ZXIuCisgKi8KKworc3RhdGljIGludCB1bGk1MjZ4X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHR4X2Rlc2MgKnR4cHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlVTEk1MjZYX0RCVUcoMCwgInVsaTUyNnhfc3RhcnRfeG1pdCIsIDApOworCisJLyogUmVzb3VyY2UgZmxhZyBjaGVjayAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFRvbyBsYXJnZSBwYWNrZXQgY2hlY2sgKi8KKwlpZiAoc2tiLT5sZW4gPiBNQVhfUEFDS0VUX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IGJpZyBwYWNrZXQgPSAlZFxuIiwgKHUxNilza2ItPmxlbik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRiLT5sb2NrLCBmbGFncyk7CisKKwkvKiBObyBUeCByZXNvdXJjZSBjaGVjaywgaXQgbmV2ZXIgaGFwcGVuIG5yb21hbGx5ICovCisJaWYgKGRiLT50eF9wYWNrZXRfY250ID49IFRYX0ZSRUVfREVTQ19DTlQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IE5vIFR4IHJlc291cmNlICVsZFxuIiwgZGItPnR4X3BhY2tldF9jbnQpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBEaXNhYmxlIE5JQyBpbnRlcnJ1cHQgKi8KKwlvdXRsKDAsIGRldi0+YmFzZV9hZGRyICsgRENSNyk7CisKKwkvKiB0cmFuc21pdCB0aGlzIHBhY2tldCAqLworCXR4cHRyID0gZGItPnR4X2luc2VydF9wdHI7CisJbWVtY3B5KHR4cHRyLT50eF9idWZfcHRyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwl0eHB0ci0+dGRlczEgPSBjcHVfdG9fbGUzMigweGUxMDAwMDAwIHwgc2tiLT5sZW4pOworCisJLyogUG9pbnQgdG8gbmV4dCB0cmFuc21pdCBmcmVlIGRlc2NyaXB0b3IgKi8KKwlkYi0+dHhfaW5zZXJ0X3B0ciA9IHR4cHRyLT5uZXh0X3R4X2Rlc2M7CisKKwkvKiBUcmFuc21pdCBQYWNrZXQgUHJvY2VzcyAqLworCWlmICggKGRiLT50eF9wYWNrZXRfY250IDwgVFhfREVTQ19DTlQpICkgeworCQl0eHB0ci0+dGRlczAgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsJLyogU2V0IG93bmVyIGJpdCAqLworCQlkYi0+dHhfcGFja2V0X2NudCsrOwkJCS8qIFJlYWR5IHRvIHNlbmQgKi8KKwkJb3V0bCgweDEsIGRldi0+YmFzZV9hZGRyICsgRENSMSk7CS8qIElzc3VlIFR4IHBvbGxpbmcgKi8KKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CQkvKiBzYXZlZCB0aW1lIHN0YW1wICovCisJfQorCisJLyogVHggcmVzb3VyY2UgY2hlY2sgKi8KKwlpZiAoIGRiLT50eF9wYWNrZXRfY250IDwgVFhfRlJFRV9ERVNDX0NOVCApCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCS8qIFJlc3RvcmUgQ1I3IHRvIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCW91dGwoZGItPmNyN19kYXRhLCBkZXYtPmJhc2VfYWRkciArIERDUjcpOworCQorCS8qIGZyZWUgdGhpcyBTS0IgKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJU3RvcCB0aGUgaW50ZXJmYWNlLgorICoJVGhlIGludGVyZmFjZSBpcyBzdG9wcGVkIHdoZW4gaXQgaXMgYnJvdWdodC4KKyAqLworCitzdGF0aWMgaW50IHVsaTUyNnhfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB1bGk1MjZ4X2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJVUxJNTI2WF9EQlVHKDAsICJ1bGk1MjZ4X3N0b3AiLCAwKTsKKworCS8qIGRpc2FibGUgc3lzdGVtICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogZGVsZXRlZCB0aW1lciAqLworCWRlbF90aW1lcl9zeW5jKCZkYi0+dGltZXIpOworCisJLyogUmVzZXQgJiBzdG9wIFVMSTUyNlggYm9hcmQgKi8KKwlvdXRsKFVMSTUyNlhfUkVTRVQsIGlvYWRkciArIERDUjApOworCXVkZWxheSg1KTsKKwlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAwLCAweDgwMDAsIGRiLT5jaGlwX2lkKTsKKworCS8qIGZyZWUgaW50ZXJydXB0ICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwkvKiBmcmVlIGFsbG9jYXRlZCByeCBidWZmZXIgKi8KKwl1bGk1MjZ4X2ZyZWVfcnhidWZmZXIoZGIpOworCisjaWYgMAorCS8qIHNob3cgc3RhdGlzdGljIGNvdW50ZXIgKi8KKwlwcmludGsoRFJWX05BTUUgIjogRlU6JWx4IEVDOiVseCBMQzolbHggTkM6JWx4IExPQzolbHggVFhKVDolbHggUkVTRVQ6JWx4IFJDUjg6JWx4IEZBTDolbHggVFQ6JWx4XG4iLAorCQlkYi0+dHhfZmlmb191bmRlcnJ1biwgZGItPnR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb24sCisJCWRiLT50eF9sYXRlX2NvbGxpc2lvbiwgZGItPnR4X25vX2NhcnJpZXIsIGRiLT50eF9sb3NzX2NhcnJpZXIsCisJCWRiLT50eF9qYWJiZXJfdGltZW91dCwgZGItPnJlc2V0X2NvdW50LCBkYi0+cmVzZXRfY3I4LAorCQlkYi0+cmVzZXRfZmF0YWwsIGRiLT5yZXNldF9UWHRpbWVvdXQpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJTTUyNjEvTTUyNjMgaW5zdGVycnVwdCBoYW5kbGVyCisgKglyZWNlaXZlIHRoZSBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIsIGZyZWUgdGhlIHRyYW5zbWl0dGVkIHBhY2tldAorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCB1bGk1MjZ4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghZGV2KSB7CisJCVVMSTUyNlhfREJVRygxLCAidWxpNTI2eF9pbnRlcnJ1cHQoKSB3aXRob3V0IERFVklDRSBhcmciLCAwKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOworCW91dGwoMCwgaW9hZGRyICsgRENSNyk7CisKKwkvKiBHb3QgVUxJNTI2WCBzdGF0dXMgKi8KKwlkYi0+Y3I1X2RhdGEgPSBpbmwoaW9hZGRyICsgRENSNSk7CisJb3V0bChkYi0+Y3I1X2RhdGEsIGlvYWRkciArIERDUjUpOworCWlmICggIShkYi0+Y3I1X2RhdGEgJiAweDE4MGMxKSApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJb3V0bChkYi0+Y3I3X2RhdGEsIGlvYWRkciArIERDUjcpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyogQ2hlY2sgc3lzdGVtIHN0YXR1cyAqLworCWlmIChkYi0+Y3I1X2RhdGEgJiAweDIwMDApIHsKKwkJLyogc3lzdGVtIGJ1cyBlcnJvciBoYXBwZW4gKi8KKwkJVUxJNTI2WF9EQlVHKDEsICJTeXN0ZW0gYnVzIGVycm9yIGhhcHBlbi4gQ1I1PSIsIGRiLT5jcjVfZGF0YSk7CisJCWRiLT5yZXNldF9mYXRhbCsrOworCQlkYi0+d2FpdF9yZXNldCA9IDE7CS8qIE5lZWQgdG8gUkVTRVQgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCSAvKiBSZWNlaXZlZCB0aGUgY29taW5nIHBhY2tldCAqLworCWlmICggKGRiLT5jcjVfZGF0YSAmIDB4NDApICYmIGRiLT5yeF9hdmFpbF9jbnQgKQorCQl1bGk1MjZ4X3J4X3BhY2tldChkZXYsIGRiKTsKKworCS8qIHJlYWxsb2NhdGUgcnggZGVzY3JpcHRvciBidWZmZXIgKi8KKwlpZiAoZGItPnJ4X2F2YWlsX2NudDxSWF9ERVNDX0NOVCkKKwkJYWxsb2NhdGVfcnhfYnVmZmVyKGRiKTsKKworCS8qIEZyZWUgdGhlIHRyYW5zbWl0dGVkIGRlc2NyaXB0b3IgKi8KKwlpZiAoIGRiLT5jcjVfZGF0YSAmIDB4MDEpCisJCXVsaTUyNnhfZnJlZV90eF9wa3QoZGV2LCBkYik7CisKKwkvKiBSZXN0b3JlIENSNyB0byBlbmFibGUgaW50ZXJydXB0IG1hc2sgKi8KKwlvdXRsKGRiLT5jcjdfZGF0YSwgaW9hZGRyICsgRENSNyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKgorICoJRnJlZSBUWCByZXNvdXJjZSBhZnRlciBUWCBjb21wbGV0ZQorICovCisKK3N0YXRpYyB2b2lkIHVsaTUyNnhfZnJlZV90eF9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqIGRiKQoreworCXN0cnVjdCB0eF9kZXNjICp0eHB0cjsKKwl1MzIgdGRlczA7CisKKwl0eHB0ciA9IGRiLT50eF9yZW1vdmVfcHRyOworCXdoaWxlKGRiLT50eF9wYWNrZXRfY250KSB7CisJCXRkZXMwID0gbGUzMl90b19jcHUodHhwdHItPnRkZXMwKTsKKwkJLyogcHJpbnRrKERSVl9OQU1FICI6IHRkZXMwPSV4XG4iLCB0ZGVzMCk7ICovCisJCWlmICh0ZGVzMCAmIDB4ODAwMDAwMDApCisJCQlicmVhazsKKworCQkvKiBBIHBhY2tldCBzZW50IGNvbXBsZXRlZCAqLworCQlkYi0+dHhfcGFja2V0X2NudC0tOworCQlkYi0+c3RhdHMudHhfcGFja2V0cysrOworCisJCS8qIFRyYW5zbWl0IHN0YXRpc3RpYyBjb3VudGVyICovCisJCWlmICggdGRlczAgIT0gMHg3ZmZmZmZmZiApIHsKKwkJCS8qIHByaW50ayhEUlZfTkFNRSAiOiB0ZGVzMD0leFxuIiwgdGRlczApOyAqLworCQkJZGItPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHRkZXMwID4+IDMpICYgMHhmOworCQkJZGItPnN0YXRzLnR4X2J5dGVzICs9IGxlMzJfdG9fY3B1KHR4cHRyLT50ZGVzMSkgJiAweDdmZjsKKwkJCWlmICh0ZGVzMCAmIFRERVMwX0VSUl9NQVNLKSB7CisJCQkJZGItPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCWlmICh0ZGVzMCAmIDB4MDAwMikgewkvKiBVbmRlclJ1biAqLworCQkJCQlkYi0+dHhfZmlmb191bmRlcnJ1bisrOworCQkJCQlpZiAoICEoZGItPmNyNl9kYXRhICYgQ1I2X1NGVCkgKSB7CisJCQkJCQlkYi0+Y3I2X2RhdGEgPSBkYi0+Y3I2X2RhdGEgfCBDUjZfU0ZUOworCQkJCQkJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCQkJCQl9CisJCQkJfQorCQkJCWlmICh0ZGVzMCAmIDB4MDEwMCkKKwkJCQkJZGItPnR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb24rKzsKKwkJCQlpZiAodGRlczAgJiAweDAyMDApCisJCQkJCWRiLT50eF9sYXRlX2NvbGxpc2lvbisrOworCQkJCWlmICh0ZGVzMCAmIDB4MDQwMCkKKwkJCQkJZGItPnR4X25vX2NhcnJpZXIrKzsKKwkJCQlpZiAodGRlczAgJiAweDA4MDApCisJCQkJCWRiLT50eF9sb3NzX2NhcnJpZXIrKzsKKwkJCQlpZiAodGRlczAgJiAweDQwMDApCisJCQkJCWRiLT50eF9qYWJiZXJfdGltZW91dCsrOworCQkJfQorCQl9CisKKyAgICAJCXR4cHRyID0gdHhwdHItPm5leHRfdHhfZGVzYzsKKwl9LyogRW5kIG9mIHdoaWxlICovCisKKwkvKiBVcGRhdGUgVFggcmVtb3ZlIHBvaW50ZXIgdG8gbmV4dCAqLworCWRiLT50eF9yZW1vdmVfcHRyID0gdHhwdHI7CisKKwkvKiBSZXNvdXJjZSBhdmFpbGFibGUgY2hlY2sgKi8KKwlpZiAoIGRiLT50eF9wYWNrZXRfY250IDwgVFhfV0FLRV9ERVNDX0NOVCApCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsJLyogQWN0aXZlIHVwcGVyIGxheWVyLCBzZW5kIGFnYWluICovCit9CisKKworLyoKKyAqCVJlY2VpdmUgdGhlIGNvbWUgcGFja2V0IGFuZCBwYXNzIHRvIHVwcGVyIGxheWVyCisgKi8KKworc3RhdGljIHZvaWQgdWxpNTI2eF9yeF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqIGRiKQoreworCXN0cnVjdCByeF9kZXNjICpyeHB0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByeGxlbjsKKwl1MzIgcmRlczA7CisJCisJcnhwdHIgPSBkYi0+cnhfcmVhZHlfcHRyOworCisJd2hpbGUoZGItPnJ4X2F2YWlsX2NudCkgeworCQlyZGVzMCA9IGxlMzJfdG9fY3B1KHJ4cHRyLT5yZGVzMCk7CisJCWlmIChyZGVzMCAmIDB4ODAwMDAwMDApCS8qIHBhY2tldCBvd25lciBjaGVjayAqLworCQl7CisJCQlicmVhazsKKwkJfQorCisJCWRiLT5yeF9hdmFpbF9jbnQtLTsKKwkJZGItPmludGVydmFsX3J4X2NudCsrOworCisJCXBjaV91bm1hcF9zaW5nbGUoZGItPnBkZXYsIGxlMzJfdG9fY3B1KHJ4cHRyLT5yZGVzMiksIFJYX0FMTE9DX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWlmICggKHJkZXMwICYgMHgzMDApICE9IDB4MzAwKSB7CisJCQkvKiBBIHBhY2tldCB3aXRob3V0IEZpcnN0L0xhc3QgZmxhZyAqLworCQkJLyogcmV1c2UgdGhpcyBTS0IgKi8KKwkJCVVMSTUyNlhfREJVRygwLCAiUmV1c2UgU0sgYnVmZmVyLCByZGVzMCIsIHJkZXMwKTsKKwkJCXVsaTUyNnhfcmV1c2Vfc2tiKGRiLCByeHB0ci0+cnhfc2tiX3B0cik7CisJCX0gZWxzZSB7CisJCQkvKiBBIHBhY2tldCB3aXRoIEZpcnN0L0xhc3QgZmxhZyAqLworCQkJcnhsZW4gPSAoIChyZGVzMCA+PiAxNikgJiAweDNmZmYpIC0gNDsKKworCQkJLyogZXJyb3Igc3VtbWFyeSBiaXQgY2hlY2sgKi8KKwkJCWlmIChyZGVzMCAmIDB4ODAwMCkgeworCQkJCS8qIFRoaXMgaXMgYSBlcnJvciBwYWNrZXQgKi8KKwkJCQkvL3ByaW50ayhEUlZfTkFNRSAiOiByZGVzMDogJWx4XG4iLCByZGVzMCk7CisJCQkJZGItPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWlmIChyZGVzMCAmIDEpCisJCQkJCWRiLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCWlmIChyZGVzMCAmIDIpCisJCQkJCWRiLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJaWYgKHJkZXMwICYgMHg4MCkKKwkJCQkJZGItPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCX0KKworCQkJaWYgKCAhKHJkZXMwICYgMHg4MDAwKSB8fAorCQkJCSgoZGItPmNyNl9kYXRhICYgQ1I2X1BNKSAmJiAocnhsZW4+NikpICkgeworCQkJCXNrYiA9IHJ4cHRyLT5yeF9za2JfcHRyOworCQkKKwkJCQkvKiBHb29kIHBhY2tldCwgc2VuZCB0byB1cHBlciBsYXllciAqLworCQkJCS8qIFNob3JzdCBwYWNrZXQgdXNlZCBuZXcgU0tCICovCisJCQkJaWYgKCAocnhsZW4gPCBSWF9DT1BZX1NJWkUpICYmCisJCQkJCSggKHNrYiA9IGRldl9hbGxvY19za2IocnhsZW4gKyAyKSApCisJCQkJCSE9IE5VTEwpICkgeworCQkJCQkvKiBzaXplIGxlc3MgdGhhbiBDT1BZX1NJWkUsIGFsbG9jYXRlIGEgcnhsZW4gU0tCICovCisJCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAvKiAxNmJ5dGUgYWxpZ24gKi8KKwkJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCByeGxlbiksIHJ4cHRyLT5yeF9za2JfcHRyLT50YWlsLCByeGxlbik7CisJCQkJCXVsaTUyNnhfcmV1c2Vfc2tiKGRiLCByeHB0ci0+cnhfc2tiX3B0cik7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJCXNrYl9wdXQoc2tiLCByeGxlbik7CisJCQkJfQorCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCWRiLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJZGItPnN0YXRzLnJ4X2J5dGVzICs9IHJ4bGVuOworCQkJCQorCQkJfSBlbHNlIHsKKwkJCQkvKiBSZXVzZSBTS0IgYnVmZmVyIHdoZW4gdGhlIHBhY2tldCBpcyBlcnJvciAqLworCQkJCVVMSTUyNlhfREJVRygwLCAiUmV1c2UgU0sgYnVmZmVyLCByZGVzMCIsIHJkZXMwKTsKKwkJCQl1bGk1MjZ4X3JldXNlX3NrYihkYiwgcnhwdHItPnJ4X3NrYl9wdHIpOworCQkJfQorCQl9CisKKwkJcnhwdHIgPSByeHB0ci0+bmV4dF9yeF9kZXNjOworCX0KKworCWRiLT5yeF9yZWFkeV9wdHIgPSByeHB0cjsKK30KKworCisvKgorICoJR2V0IHN0YXRpc3RpY3MgZnJvbSBkcml2ZXIuCisgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogdWxpNTI2eF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisKKwlVTEk1MjZYX0RCVUcoMCwgInVsaTUyNnhfZ2V0X3N0YXRzIiwgMCk7CisJcmV0dXJuICZkYi0+c3RhdHM7Cit9CisKKworLyoKKyAqIFNldCBVTEk1MjZYIG11bHRpY2FzdCBhZGRyZXNzCisgKi8KKworc3RhdGljIHZvaWQgdWxpNTI2eF9zZXRfZmlsdGVyX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqZGIgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVVMSTUyNlhfREJVRygwLCAidWxpNTI2eF9zZXRfZmlsdGVyX21vZGUoKSIsIDApOworCXNwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlVTEk1MjZYX0RCVUcoMCwgIkVuYWJsZSBQUk9NIE1vZGUiLCAwKTsKKwkJZGItPmNyNl9kYXRhIHw9IENSNl9QTSB8IENSNl9QQkY7CisJCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBkYi0+aW9hZGRyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJIHx8IGRldi0+bWNfY291bnQgPiBVTEk1MjYxX01BWF9NVUxUSUNBU1QpIHsKKwkJVUxJNTI2WF9EQlVHKDAsICJQYXNzIGFsbCBtdWx0aWNhc3QgYWRkcmVzcyIsIGRldi0+bWNfY291bnQpOworCQlkYi0+Y3I2X2RhdGEgJj0gfihDUjZfUE0gfCBDUjZfUEJGKTsKKwkJZGItPmNyNl9kYXRhIHw9IENSNl9QQU07CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlVTEk1MjZYX0RCVUcoMCwgIlNldCBtdWx0aWNhc3QgYWRkcmVzcyIsIGRldi0+bWNfY291bnQpOworCXNlbmRfZmlsdGVyX2ZyYW1lKGRldiwgZGV2LT5tY19jb3VudCk7IAkvKiBNNTI2MS9NNTI2MyAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitVTGlfZXRodG9vbF9nc2V0KHN0cnVjdCB1bGk1MjZ4X2JvYXJkX2luZm8gKmRiLCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJZWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCSAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCSAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF9BdXRvbmVnIHwKKwkgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEX01JSSk7CisJCQorCWVjbWQtPmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwKKwkgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCSAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfAorCSAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAorCSAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VEX0F1dG9uZWcgfAorCSAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VEX01JSSk7CisKKworCWVjbWQtPnBvcnQgPSBQT1JUX01JSTsKKwllY21kLT5waHlfYWRkcmVzcyA9IGRiLT5waHlfYWRkcjsKKworCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwkJCisJZWNtZC0+c3BlZWQgPSAxMDsKKwllY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkKKwlpZihkYi0+b3BfbW9kZT09VUxJNTI2WF8xMDBNSEYgfHwgZGItPm9wX21vZGU9PVVMSTUyNlhfMTAwTUZEKQorCXsKKwkJZWNtZC0+c3BlZWQgPSAxMDA7ICAgICAgICAgICAgICAgCisJfQorCWlmKGRiLT5vcF9tb2RlPT1VTEk1MjZYXzEwTUZEIHx8IGRiLT5vcF9tb2RlPT1VTEk1MjZYXzEwME1GRCkKKwl7CisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOworCX0KKwlpZihkYi0+bGlua19mYWlsZWQpCisJeworCQllY21kLT5zcGVlZCA9IC0xOworCQllY21kLT5kdXBsZXggPSAtMTsJCisJfQorCQorCWlmIChkYi0+bWVkaWFfbW9kZSAmIFVMSTUyNlhfQVVUTykKKwl7CQorCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJfQorfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCB1bGk1MjZ4X2JvYXJkX2luZm8gKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCWlmIChucC0+cGRldikKKwkJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGRldikpOworCWVsc2UKKwkJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIkVJU0EgMHglbHggJWQiLAorCQkJZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKK30KKworc3RhdGljIGludCBuZXRkZXZfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKSB7CisJc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCVVMaV9ldGh0b29sX2dzZXQobnAsIGNtZCk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICpucCA9IG5ldGRldl9wcml2KGRldik7CisJCQorCWlmKG5wLT5saW5rX2ZhaWxlZCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgdWxpNTI2eF9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfUEhZIHwgV0FLRV9NQUdJQzsKKwl3b2wtPndvbG9wdHMgPSAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MJCT0gbmV0ZGV2X2dldF9zZXR0aW5ncywKKwkuZ2V0X2xpbmsJCT0gbmV0ZGV2X2dldF9saW5rLAorCS5nZXRfd29sCQk9IHVsaTUyNnhfZ2V0X3dvbCwKK307CisKKy8qCisgKglBIHBlcmlvZGljIHRpbWVyIHJvdXRpbmUKKyAqCUR5bmFtaWMgbWVkaWEgc2Vuc2UsIGFsbG9jYXRlIFJ4IGJ1ZmZlci4uLgorICovCisKK3N0YXRpYyB2b2lkIHVsaTUyNnhfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXUzMiB0bXBfY3I4OworCXVuc2lnbmVkIGNoYXIgdG1wX2NyMTI9MDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IFRtcFNwZWVkPTEwOworCQorCS8vVUxJNTI2WF9EQlVHKDAsICJ1bGk1MjZ4X3RpbWVyKCkiLCAwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGItPmxvY2ssIGZsYWdzKTsKKworCQorCS8qIER5bmFtaWMgcmVzZXQgVUxJNTI2WCA6IHN5c3RlbSBlcnJvciBvciB0cmFuc21pdCB0aW1lLW91dCAqLworCXRtcF9jcjggPSBpbmwoZGItPmlvYWRkciArIERDUjgpOworCWlmICggKGRiLT5pbnRlcnZhbF9yeF9jbnQ9PTApICYmICh0bXBfY3I4KSApIHsKKwkJZGItPnJlc2V0X2NyOCsrOworCQlkYi0+d2FpdF9yZXNldCA9IDE7CisJfQorCWRiLT5pbnRlcnZhbF9yeF9jbnQgPSAwOworCisJLyogVFggcG9sbGluZyBraWNrIG1vbml0b3IgKi8KKwlpZiAoIGRiLT50eF9wYWNrZXRfY250ICYmCisJICAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGRldi0+dHJhbnNfc3RhcnQgKyBVTEk1MjZYX1RYX0tJQ0spICkgeworCQlvdXRsKDB4MSwgZGV2LT5iYXNlX2FkZHIgKyBEQ1IxKTsgICAvLyBUeCBwb2xsaW5nIGFnYWluIAorCisJCS8vIFRYIFRpbWVvdXQgCisJCWlmICggdGltZV9hZnRlcihqaWZmaWVzLCBkZXYtPnRyYW5zX3N0YXJ0ICsgVUxJNTI2WF9UWF9USU1FT1VUKSApIHsKKwkJCWRiLT5yZXNldF9UWHRpbWVvdXQrKzsKKwkJCWRiLT53YWl0X3Jlc2V0ID0gMTsKKwkJCXByaW50ayggIiVzOiBUeCB0aW1lb3V0IC0gcmVzZXR0aW5nXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCX0KKwl9CisKKwlpZiAoZGItPndhaXRfcmVzZXQpIHsKKwkJVUxJNTI2WF9EQlVHKDAsICJEeW5hbWljIFJlc2V0IGRldmljZSIsIGRiLT50eF9wYWNrZXRfY250KTsKKwkJZGItPnJlc2V0X2NvdW50Kys7CisJCXVsaTUyNnhfZHluYW1pY19yZXNldChkZXYpOworCQlkYi0+dGltZXIuZXhwaXJlcyA9IFVMSTUyNlhfVElNRVJfV1VUOworCQlhZGRfdGltZXIoJmRiLT50aW1lcik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBMaW5rIHN0YXR1cyBjaGVjaywgRHluYW1pYyBtZWRpYSB0eXBlIGNoYW5nZSAqLworCWlmKChwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDUsIGRiLT5jaGlwX2lkKSAmIDB4MDFlMCkhPTApCisJCXRtcF9jcjEyID0gMzsKKworCWlmICggISh0bXBfY3IxMiAmIDB4MykgJiYgIWRiLT5saW5rX2ZhaWxlZCApIHsKKwkJLyogTGluayBGYWlsZWQgKi8KKwkJVUxJNTI2WF9EQlVHKDAsICJMaW5rIEZhaWxlZCIsIHRtcF9jcjEyKTsKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidWxpNTI2eDogJXMgTklDIExpbmsgaXMgRG93blxuIixkZXYtPm5hbWUpOworCQlkYi0+bGlua19mYWlsZWQgPSAxOworCisJCS8qIEZvciBGb3JjZSAxMC8xMDBNIEhhbGYvRnVsbCBtb2RlOiBFbmFibGUgQXV0by1OZWdvIG1vZGUgKi8KKwkJLyogQVVUTyBkb24ndCBuZWVkICovCisJCWlmICggIShkYi0+bWVkaWFfbW9kZSAmIDB4OCkgKQorCQkJcGh5X3dyaXRlKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMCwgMHgxMDAwLCBkYi0+Y2hpcF9pZCk7CisKKwkJLyogQVVUTyBtb2RlLCBpZiBJTlQgcGh5eGNlciBsaW5rIGZhaWxlZCwgc2VsZWN0IEVYVCBkZXZpY2UgKi8KKwkJaWYgKGRiLT5tZWRpYV9tb2RlICYgVUxJNTI2WF9BVVRPKSB7CisJCQlkYi0+Y3I2X2RhdGEmPX4weDAwMDAwMjAwOwkvKiBiaXQ5PTAsIEhEIG1vZGUgKi8KKwkJCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBkYi0+aW9hZGRyKTsKKwkJfQorCX0gZWxzZQorCQlpZiAoKHRtcF9jcjEyICYgMHgzKSAmJiBkYi0+bGlua19mYWlsZWQpIHsKKwkJCVVMSTUyNlhfREJVRygwLCAiTGluayBsaW5rIE9LIiwgdG1wX2NyMTIpOworCQkJZGItPmxpbmtfZmFpbGVkID0gMDsKKworCQkJLyogQXV0byBTZW5zZSBTcGVlZCAqLworCQkJaWYgKCAoZGItPm1lZGlhX21vZGUgJiBVTEk1MjZYX0FVVE8pICYmCisJCQkJdWxpNTI2eF9zZW5zZV9zcGVlZChkYikgKQorCQkJCWRiLT5saW5rX2ZhaWxlZCA9IDE7CisJCQl1bGk1MjZ4X3Byb2Nlc3NfbW9kZShkYik7CisJCQkKKwkJCWlmKGRiLT5saW5rX2ZhaWxlZD09MCkKKwkJCXsKKwkJCQlpZihkYi0+b3BfbW9kZT09VUxJNTI2WF8xMDBNSEYgfHwgZGItPm9wX21vZGU9PVVMSTUyNlhfMTAwTUZEKQorCQkJCXsKKwkJCQkJVG1wU3BlZWQgPSAxMDA7CisJCQkJfQorCQkJCWlmKGRiLT5vcF9tb2RlPT1VTEk1MjZYXzEwTUZEIHx8IGRiLT5vcF9tb2RlPT1VTEk1MjZYXzEwME1GRCkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0lORk8gInVsaTUyNng6ICVzIE5JQyBMaW5rIGlzIFVwICVkIE1icHMgRnVsbCBkdXBsZXhcbiIsZGV2LT5uYW1lLFRtcFNwZWVkKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAidWxpNTI2eDogJXMgTklDIExpbmsgaXMgVXAgJWQgTWJwcyBIYWxmIGR1cGxleFxuIixkZXYtPm5hbWUsVG1wU3BlZWQpOworCQkJCX0KKwkJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCQl9CisJCQkvKiBTSE9XX01FRElBX1RZUEUoZGItPm9wX21vZGUpOyAqLworCQl9CisJCWVsc2UgaWYoISh0bXBfY3IxMiAmIDB4MykgJiYgZGItPmxpbmtfZmFpbGVkKQorCQl7CisJCQlpZihkYi0+aW5pdD09MSkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJ1bGk1MjZ4OiAlcyBOSUMgTGluayBpcyBEb3duXG4iLGRldi0+bmFtZSk7CisJCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCX0KKwkJfQorCQlkYi0+aW5pdD0wOworCisJLyogVGltZXIgYWN0aXZlIGFnYWluICovCisJZGItPnRpbWVyLmV4cGlyZXMgPSBVTEk1MjZYX1RJTUVSX1dVVDsKKwlhZGRfdGltZXIoJmRiLT50aW1lcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKK30KKworCisvKgorICoJRHluYW1pYyByZXNldCB0aGUgVUxJNTI2WCBib2FyZAorICoJU3RvcCBVTEk1MjZYIGJvYXJkCisgKglGcmVlIFR4L1J4IGFsbG9jYXRlZCBtZW1vcnkKKyAqCVJlc2V0IFVMSTUyNlggYm9hcmQKKyAqCVJlLWluaXRpYWxpemUgVUxJNTI2WCBib2FyZAorICovCisKK3N0YXRpYyB2b2lkIHVsaTUyNnhfZHluYW1pY19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB1bGk1MjZ4X2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCVVMSTUyNlhfREJVRygwLCAidWxpNTI2eF9keW5hbWljX3Jlc2V0KCkiLCAwKTsKKworCS8qIFNvcHQgTUFDIGNvbnRyb2xsZXIgKi8KKwlkYi0+Y3I2X2RhdGEgJj0gfihDUjZfUlhTQyB8IENSNl9UWFNDKTsJLyogRGlzYWJsZSBUeC9SeCAqLworCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBkZXYtPmJhc2VfYWRkcik7CisJb3V0bCgwLCBkZXYtPmJhc2VfYWRkciArIERDUjcpOwkJLyogRGlzYWJsZSBJbnRlcnJ1cHQgKi8KKwlvdXRsKGlubChkZXYtPmJhc2VfYWRkciArIERDUjUpLCBkZXYtPmJhc2VfYWRkciArIERDUjUpOworCisJLyogRGlzYWJsZSB1cHBlciBsYXllciBpbnRlcmZhY2UgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBGcmVlIFJ4IEFsbG9jYXRlIGJ1ZmZlciAqLworCXVsaTUyNnhfZnJlZV9yeGJ1ZmZlcihkYik7CisKKwkvKiBzeXN0ZW0gdmFyaWFibGUgaW5pdCAqLworCWRiLT50eF9wYWNrZXRfY250ID0gMDsKKwlkYi0+cnhfYXZhaWxfY250ID0gMDsKKwlkYi0+bGlua19mYWlsZWQgPSAxOworCWRiLT5pbml0PTE7CisJZGItPndhaXRfcmVzZXQgPSAwOworCisJLyogUmUtaW5pdGlhbGl6ZSBVTEk1MjZYIGJvYXJkICovCisJdWxpNTI2eF9pbml0KGRldik7CisKKwkvKiBSZXN0YXJ0IHVwcGVyIGxheWVyIGludGVyZmFjZSAqLworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworCisvKgorICoJZnJlZSBhbGwgYWxsb2NhdGVkIHJ4IGJ1ZmZlcgorICovCisKK3N0YXRpYyB2b2lkIHVsaTUyNnhfZnJlZV9yeGJ1ZmZlcihzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICogZGIpCit7CisJVUxJNTI2WF9EQlVHKDAsICJ1bGk1MjZ4X2ZyZWVfcnhidWZmZXIoKSIsIDApOworCisJLyogZnJlZSBhbGxvY2F0ZWQgcnggYnVmZmVyICovCisJd2hpbGUgKGRiLT5yeF9hdmFpbF9jbnQpIHsKKwkJZGV2X2tmcmVlX3NrYihkYi0+cnhfcmVhZHlfcHRyLT5yeF9za2JfcHRyKTsKKwkJZGItPnJ4X3JlYWR5X3B0ciA9IGRiLT5yeF9yZWFkeV9wdHItPm5leHRfcnhfZGVzYzsKKwkJZGItPnJ4X2F2YWlsX2NudC0tOworCX0KK30KKworCisvKgorICoJUmV1c2UgdGhlIFNLIGJ1ZmZlcgorICovCisKK3N0YXRpYyB2b2lkIHVsaTUyNnhfcmV1c2Vfc2tiKHN0cnVjdCB1bGk1MjZ4X2JvYXJkX2luZm8gKmRiLCBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYikKK3sKKwlzdHJ1Y3QgcnhfZGVzYyAqcnhwdHIgPSBkYi0+cnhfaW5zZXJ0X3B0cjsKKworCWlmICghKHJ4cHRyLT5yZGVzMCAmIGNwdV90b19sZTMyKDB4ODAwMDAwMDApKSkgeworCQlyeHB0ci0+cnhfc2tiX3B0ciA9IHNrYjsKKwkJcnhwdHItPnJkZXMyID0gY3B1X3RvX2xlMzIoIHBjaV9tYXBfc2luZ2xlKGRiLT5wZGV2LCBza2ItPnRhaWwsIFJYX0FMTE9DX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSkgKTsKKwkJd21iKCk7CisJCXJ4cHRyLT5yZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOworCQlkYi0+cnhfYXZhaWxfY250Kys7CisJCWRiLT5yeF9pbnNlcnRfcHRyID0gcnhwdHItPm5leHRfcnhfZGVzYzsKKwl9IGVsc2UKKwkJVUxJNTI2WF9EQlVHKDAsICJTSyBCdWZmZXIgcmV1c2UgbWV0aG9kIGVycm9yIiwgZGItPnJ4X2F2YWlsX2NudCk7Cit9CisKKworLyoKKyAqCUluaXRpYWxpemUgdHJhbnNtaXQvUmVjZWl2ZSBkZXNjcmlwdG9yCisgKglVc2luZyBDaGFpbiBzdHJ1Y3R1cmUsIGFuZCBhbGxvY2F0ZSBUeC9SeCBidWZmZXIKKyAqLworCitzdGF0aWMgdm9pZCB1bGk1MjZ4X2Rlc2NyaXB0b3JfaW5pdChzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICpkYiwgdW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJc3RydWN0IHR4X2Rlc2MgKnRtcF90eDsKKwlzdHJ1Y3QgcnhfZGVzYyAqdG1wX3J4OworCXVuc2lnbmVkIGNoYXIgKnRtcF9idWY7CisJZG1hX2FkZHJfdCB0bXBfdHhfZG1hLCB0bXBfcnhfZG1hOworCWRtYV9hZGRyX3QgdG1wX2J1Zl9kbWE7CisJaW50IGk7CisKKwlVTEk1MjZYX0RCVUcoMCwgInVsaTUyNnhfZGVzY3JpcHRvcl9pbml0KCkiLCAwKTsKKworCS8qIHR4IGRlc2NyaXB0b3Igc3RhcnQgcG9pbnRlciAqLworCWRiLT50eF9pbnNlcnRfcHRyID0gZGItPmZpcnN0X3R4X2Rlc2M7CisJZGItPnR4X3JlbW92ZV9wdHIgPSBkYi0+Zmlyc3RfdHhfZGVzYzsKKwlvdXRsKGRiLT5maXJzdF90eF9kZXNjX2RtYSwgaW9hZGRyICsgRENSNCk7ICAgICAvKiBUWCBERVNDIGFkZHJlc3MgKi8KKworCS8qIHJ4IGRlc2NyaXB0b3Igc3RhcnQgcG9pbnRlciAqLworCWRiLT5maXJzdF9yeF9kZXNjID0gKHZvaWQgKilkYi0+Zmlyc3RfdHhfZGVzYyArIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiBUWF9ERVNDX0NOVDsKKwlkYi0+Zmlyc3RfcnhfZGVzY19kbWEgPSAgZGItPmZpcnN0X3R4X2Rlc2NfZG1hICsgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIFRYX0RFU0NfQ05UOworCWRiLT5yeF9pbnNlcnRfcHRyID0gZGItPmZpcnN0X3J4X2Rlc2M7CisJZGItPnJ4X3JlYWR5X3B0ciA9IGRiLT5maXJzdF9yeF9kZXNjOworCW91dGwoZGItPmZpcnN0X3J4X2Rlc2NfZG1hLCBpb2FkZHIgKyBEQ1IzKTsJLyogUlggREVTQyBhZGRyZXNzICovCisKKwkvKiBJbml0IFRyYW5zbWl0IGNoYWluICovCisJdG1wX2J1ZiA9IGRiLT5idWZfcG9vbF9zdGFydDsKKwl0bXBfYnVmX2RtYSA9IGRiLT5idWZfcG9vbF9kbWFfc3RhcnQ7CisJdG1wX3R4X2RtYSA9IGRiLT5maXJzdF90eF9kZXNjX2RtYTsKKwlmb3IgKHRtcF90eCA9IGRiLT5maXJzdF90eF9kZXNjLCBpID0gMDsgaSA8IFRYX0RFU0NfQ05UOyBpKyssIHRtcF90eCsrKSB7CisJCXRtcF90eC0+dHhfYnVmX3B0ciA9IHRtcF9idWY7CisJCXRtcF90eC0+dGRlczAgPSBjcHVfdG9fbGUzMigwKTsKKwkJdG1wX3R4LT50ZGVzMSA9IGNwdV90b19sZTMyKDB4ODEwMDAwMDApOwkvKiBJQywgY2hhaW4gKi8KKwkJdG1wX3R4LT50ZGVzMiA9IGNwdV90b19sZTMyKHRtcF9idWZfZG1hKTsKKwkJdG1wX3R4X2RtYSArPSBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpOworCQl0bXBfdHgtPnRkZXMzID0gY3B1X3RvX2xlMzIodG1wX3R4X2RtYSk7CisJCXRtcF90eC0+bmV4dF90eF9kZXNjID0gdG1wX3R4ICsgMTsKKwkJdG1wX2J1ZiA9IHRtcF9idWYgKyBUWF9CVUZfQUxMT0M7CisJCXRtcF9idWZfZG1hID0gdG1wX2J1Zl9kbWEgKyBUWF9CVUZfQUxMT0M7CisJfQorCSgtLXRtcF90eCktPnRkZXMzID0gY3B1X3RvX2xlMzIoZGItPmZpcnN0X3R4X2Rlc2NfZG1hKTsKKwl0bXBfdHgtPm5leHRfdHhfZGVzYyA9IGRiLT5maXJzdF90eF9kZXNjOworCisJIC8qIEluaXQgUmVjZWl2ZSBkZXNjcmlwdG9yIGNoYWluICovCisJdG1wX3J4X2RtYT1kYi0+Zmlyc3RfcnhfZGVzY19kbWE7CisJZm9yICh0bXBfcnggPSBkYi0+Zmlyc3RfcnhfZGVzYywgaSA9IDA7IGkgPCBSWF9ERVNDX0NOVDsgaSsrLCB0bXBfcngrKykgeworCQl0bXBfcngtPnJkZXMwID0gY3B1X3RvX2xlMzIoMCk7CisJCXRtcF9yeC0+cmRlczEgPSBjcHVfdG9fbGUzMigweDAxMDAwNjAwKTsKKwkJdG1wX3J4X2RtYSArPSBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpOworCQl0bXBfcngtPnJkZXMzID0gY3B1X3RvX2xlMzIodG1wX3J4X2RtYSk7CisJCXRtcF9yeC0+bmV4dF9yeF9kZXNjID0gdG1wX3J4ICsgMTsKKwl9CisJKC0tdG1wX3J4KS0+cmRlczMgPSBjcHVfdG9fbGUzMihkYi0+Zmlyc3RfcnhfZGVzY19kbWEpOworCXRtcF9yeC0+bmV4dF9yeF9kZXNjID0gZGItPmZpcnN0X3J4X2Rlc2M7CisKKwkvKiBwcmUtYWxsb2NhdGUgUnggYnVmZmVyICovCisJYWxsb2NhdGVfcnhfYnVmZmVyKGRiKTsKK30KKworCisvKgorICoJVXBkYXRlIENSNiB2YWx1ZQorICoJRmlyc3RseSBzdG9wIFVMSTUyNlgsIHRoZW4gd3JpdHRlbiB2YWx1ZSBhbmQgc3RhcnQKKyAqLworCitzdGF0aWMgdm9pZCB1cGRhdGVfY3I2KHUzMiBjcjZfZGF0YSwgdW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisKKwlvdXRsKGNyNl9kYXRhLCBpb2FkZHIgKyBEQ1I2KTsKKwl1ZGVsYXkoNSk7Cit9CisKKworLyoKKyAqCVNlbmQgYSBzZXR1cCBmcmFtZSBmb3IgTTUyNjEvTTUyNjMKKyAqCVRoaXMgc2V0dXAgZnJhbWUgaW5pdGlhbGl6ZSBVTEk1MjZYIGFkZHJlc3MgZmlsdGVyIG1vZGUKKyAqLworCitzdGF0aWMgdm9pZCBzZW5kX2ZpbHRlcl9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWNfY250KQoreworCXN0cnVjdCB1bGk1MjZ4X2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jcHRyOworCXN0cnVjdCB0eF9kZXNjICp0eHB0cjsKKwl1MTYgKiBhZGRycHRyOworCXUzMiAqIHN1cHRyOworCWludCBpOworCisJVUxJNTI2WF9EQlVHKDAsICJzZW5kX2ZpbHRlcl9mcmFtZSgpIiwgMCk7CisKKwl0eHB0ciA9IGRiLT50eF9pbnNlcnRfcHRyOworCXN1cHRyID0gKHUzMiAqKSB0eHB0ci0+dHhfYnVmX3B0cjsKKworCS8qIE5vZGUgYWRkcmVzcyAqLworCWFkZHJwdHIgPSAodTE2ICopIGRldi0+ZGV2X2FkZHI7CisJKnN1cHRyKysgPSBhZGRycHRyWzBdOworCSpzdXB0cisrID0gYWRkcnB0clsxXTsKKwkqc3VwdHIrKyA9IGFkZHJwdHJbMl07CisKKwkvKiBicm9hZGNhc3QgYWRkcmVzcyAqLworCSpzdXB0cisrID0gMHhmZmZmOworCSpzdXB0cisrID0gMHhmZmZmOworCSpzdXB0cisrID0gMHhmZmZmOworCisJLyogZml0IHRoZSBtdWx0aWNhc3QgYWRkcmVzcyAqLworCWZvciAobWNwdHIgPSBkZXYtPm1jX2xpc3QsIGkgPSAwOyBpIDwgbWNfY250OyBpKyssIG1jcHRyID0gbWNwdHItPm5leHQpIHsKKwkJYWRkcnB0ciA9ICh1MTYgKikgbWNwdHItPmRtaV9hZGRyOworCQkqc3VwdHIrKyA9IGFkZHJwdHJbMF07CisJCSpzdXB0cisrID0gYWRkcnB0clsxXTsKKwkJKnN1cHRyKysgPSBhZGRycHRyWzJdOworCX0KKworCWZvciAoOyBpPDE0OyBpKyspIHsKKwkJKnN1cHRyKysgPSAweGZmZmY7CisJCSpzdXB0cisrID0gMHhmZmZmOworCQkqc3VwdHIrKyA9IDB4ZmZmZjsKKwl9CisKKwkvKiBwcmVwYXJlIHRoZSBzZXR1cCBmcmFtZSAqLworCWRiLT50eF9pbnNlcnRfcHRyID0gdHhwdHItPm5leHRfdHhfZGVzYzsKKwl0eHB0ci0+dGRlczEgPSBjcHVfdG9fbGUzMigweDg5MDAwMGMwKTsKKworCS8qIFJlc291cmNlIENoZWNrIGFuZCBTZW5kIHRoZSBzZXR1cCBwYWNrZXQgKi8KKwlpZiAoZGItPnR4X3BhY2tldF9jbnQgPCBUWF9ERVNDX0NOVCkgeworCQkvKiBSZXNvdXJjZSBFbXB0eSAqLworCQlkYi0+dHhfcGFja2V0X2NudCsrOworCQl0eHB0ci0+dGRlczAgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsKKwkJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEgfCAweDIwMDAsIGRldi0+YmFzZV9hZGRyKTsKKwkJb3V0bCgweDEsIGRldi0+YmFzZV9hZGRyICsgRENSMSk7CS8qIElzc3VlIFR4IHBvbGxpbmcgKi8KKwkJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRldi0+YmFzZV9hZGRyKTsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBObyBUeCByZXNvdXJjZSAtIFNlbmRfZmlsdGVyX2ZyYW1lIVxuIik7Cit9CisKKworLyoKKyAqCUFsbG9jYXRlIHJ4IGJ1ZmZlciwKKyAqCUFzIHBvc3NpYmxlIGFzIGFsbG9jYXRlIG1heGl1bW4gUnggYnVmZmVyCisgKi8KKworc3RhdGljIHZvaWQgYWxsb2NhdGVfcnhfYnVmZmVyKHN0cnVjdCB1bGk1MjZ4X2JvYXJkX2luZm8gKmRiKQoreworCXN0cnVjdCByeF9kZXNjICpyeHB0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJcnhwdHIgPSBkYi0+cnhfaW5zZXJ0X3B0cjsKKworCXdoaWxlKGRiLT5yeF9hdmFpbF9jbnQgPCBSWF9ERVNDX0NOVCkgeworCQlpZiAoICggc2tiID0gZGV2X2FsbG9jX3NrYihSWF9BTExPQ19TSVpFKSApID09IE5VTEwgKQorCQkJYnJlYWs7CisJCXJ4cHRyLT5yeF9za2JfcHRyID0gc2tiOyAvKiBGSVhNRSAoPykgKi8KKwkJcnhwdHItPnJkZXMyID0gY3B1X3RvX2xlMzIoIHBjaV9tYXBfc2luZ2xlKGRiLT5wZGV2LCBza2ItPnRhaWwsIFJYX0FMTE9DX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSkgKTsKKwkJd21iKCk7CisJCXJ4cHRyLT5yZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOworCQlyeHB0ciA9IHJ4cHRyLT5uZXh0X3J4X2Rlc2M7CisJCWRiLT5yeF9hdmFpbF9jbnQrKzsKKwl9CisKKwlkYi0+cnhfaW5zZXJ0X3B0ciA9IHJ4cHRyOworfQorCisKKy8qCisgKglSZWFkIG9uZSB3b3JkIGRhdGEgZnJvbSB0aGUgc2VyaWFsIFJPTQorICovCisKK3N0YXRpYyB1MTYgcmVhZF9zcm9tX3dvcmQobG9uZyBpb2FkZHIsIGludCBvZmZzZXQpCit7CisJaW50IGk7CisJdTE2IHNyb21fZGF0YSA9IDA7CisJbG9uZyBjcjlfaW9hZGRyID0gaW9hZGRyICsgRENSOTsKKworCW91dGwoQ1I5X1NST01fUkVBRCwgY3I5X2lvYWRkcik7CisJb3V0bChDUjlfU1JPTV9SRUFEIHwgQ1I5X1NSQ1MsIGNyOV9pb2FkZHIpOworCisJLyogU2VuZCB0aGUgUmVhZCBDb21tYW5kIDExMGIgKi8KKwlTUk9NX0NMS19XUklURShTUk9NX0RBVEFfMSwgY3I5X2lvYWRkcik7CisJU1JPTV9DTEtfV1JJVEUoU1JPTV9EQVRBXzEsIGNyOV9pb2FkZHIpOworCVNST01fQ0xLX1dSSVRFKFNST01fREFUQV8wLCBjcjlfaW9hZGRyKTsKKworCS8qIFNlbmQgdGhlIG9mZnNldCAqLworCWZvciAoaSA9IDU7IGkgPj0gMDsgaS0tKSB7CisJCXNyb21fZGF0YSA9IChvZmZzZXQgJiAoMSA8PCBpKSkgPyBTUk9NX0RBVEFfMSA6IFNST01fREFUQV8wOworCQlTUk9NX0NMS19XUklURShzcm9tX2RhdGEsIGNyOV9pb2FkZHIpOworCX0KKworCW91dGwoQ1I5X1NST01fUkVBRCB8IENSOV9TUkNTLCBjcjlfaW9hZGRyKTsKKworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCW91dGwoQ1I5X1NST01fUkVBRCB8IENSOV9TUkNTIHwgQ1I5X1NSQ0xLLCBjcjlfaW9hZGRyKTsKKwkJdWRlbGF5KDUpOworCQlzcm9tX2RhdGEgPSAoc3JvbV9kYXRhIDw8IDEpIHwgKChpbmwoY3I5X2lvYWRkcikgJiBDUjlfQ1JET1VUKSA/IDEgOiAwKTsKKwkJb3V0bChDUjlfU1JPTV9SRUFEIHwgQ1I5X1NSQ1MsIGNyOV9pb2FkZHIpOworCQl1ZGVsYXkoNSk7CisJfQorCisJb3V0bChDUjlfU1JPTV9SRUFELCBjcjlfaW9hZGRyKTsKKwlyZXR1cm4gc3JvbV9kYXRhOworfQorCisKKy8qCisgKglBdXRvIHNlbnNlIHRoZSBtZWRpYSBtb2RlCisgKi8KKworc3RhdGljIHU4IHVsaTUyNnhfc2Vuc2Vfc3BlZWQoc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqIGRiKQoreworCXU4IEVyckZsYWcgPSAwOworCXUxNiBwaHlfbW9kZTsKKworCXBoeV9tb2RlID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxLCBkYi0+Y2hpcF9pZCk7CisJcGh5X21vZGUgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDEsIGRiLT5jaGlwX2lkKTsKKworCWlmICggKHBoeV9tb2RlICYgMHgyNCkgPT0gMHgyNCApIHsKKwkJCisJCXBoeV9tb2RlID0gKChwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDUsIGRiLT5jaGlwX2lkKSAmIDB4MDFlMCk8PDcpOworCQlpZihwaHlfbW9kZSYweDgwMDApCisJCQlwaHlfbW9kZSA9IDB4ODAwMDsKKwkJZWxzZSBpZihwaHlfbW9kZSYweDQwMDApCisJCQlwaHlfbW9kZSA9IDB4NDAwMDsKKwkJZWxzZSBpZihwaHlfbW9kZSYweDIwMDApCisJCQlwaHlfbW9kZSA9IDB4MjAwMDsKKwkJZWxzZQorCQkJcGh5X21vZGUgPSAweDEwMDA7CisJCQorCQkvKiBwcmludGsoRFJWX05BTUUgIjogUGh5X21vZGUgJXggIixwaHlfbW9kZSk7ICovCisJCXN3aXRjaCAocGh5X21vZGUpIHsKKwkJY2FzZSAweDEwMDA6IGRiLT5vcF9tb2RlID0gVUxJNTI2WF8xME1IRjsgYnJlYWs7CisJCWNhc2UgMHgyMDAwOiBkYi0+b3BfbW9kZSA9IFVMSTUyNlhfMTBNRkQ7IGJyZWFrOworCQljYXNlIDB4NDAwMDogZGItPm9wX21vZGUgPSBVTEk1MjZYXzEwME1IRjsgYnJlYWs7CisJCWNhc2UgMHg4MDAwOiBkYi0+b3BfbW9kZSA9IFVMSTUyNlhfMTAwTUZEOyBicmVhazsKKwkJZGVmYXVsdDogZGItPm9wX21vZGUgPSBVTEk1MjZYXzEwTUhGOyBFcnJGbGFnID0gMTsgYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlkYi0+b3BfbW9kZSA9IFVMSTUyNlhfMTBNSEY7CisJCVVMSTUyNlhfREJVRygwLCAiTGluayBGYWlsZWQgOiIsIHBoeV9tb2RlKTsKKwkJRXJyRmxhZyA9IDE7CisJfQorCisJcmV0dXJuIEVyckZsYWc7Cit9CisKKworLyoKKyAqCVNldCAxMC8xMDAgcGh5eGNlciBjYXBhYmlsaXR5CisgKglBVVRPIG1vZGUgOiBwaHl4Y2VyIHJlZ2lzdGVyNCBpcyBOSUMgY2FwYWJpbGl0eQorICoJRm9yY2UgbW9kZTogcGh5eGNlciByZWdpc3RlcjQgaXMgdGhlIGZvcmNlIG1lZGlhCisgKi8KKworc3RhdGljIHZvaWQgdWxpNTI2eF9zZXRfcGh5eGNlcihzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICpkYikKK3sKKwl1MTYgcGh5X3JlZzsKKwkKKwkvKiBQaHl4Y2VyIGNhcGFiaWxpdHkgc2V0dGluZyAqLworCXBoeV9yZWcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDQsIGRiLT5jaGlwX2lkKSAmIH4weDAxZTA7CisKKwlpZiAoZGItPm1lZGlhX21vZGUgJiBVTEk1MjZYX0FVVE8pIHsKKwkJLyogQVVUTyBNb2RlICovCisJCXBoeV9yZWcgfD0gZGItPlBIWV9yZWc0OworCX0gZWxzZSB7CisJCS8qIEZvcmNlIE1vZGUgKi8KKwkJc3dpdGNoKGRiLT5tZWRpYV9tb2RlKSB7CisJCWNhc2UgVUxJNTI2WF8xME1IRjogcGh5X3JlZyB8PSAweDIwOyBicmVhazsKKwkJY2FzZSBVTEk1MjZYXzEwTUZEOiBwaHlfcmVnIHw9IDB4NDA7IGJyZWFrOworCQljYXNlIFVMSTUyNlhfMTAwTUhGOiBwaHlfcmVnIHw9IDB4ODA7IGJyZWFrOworCQljYXNlIFVMSTUyNlhfMTAwTUZEOiBwaHlfcmVnIHw9IDB4MTAwOyBicmVhazsKKwkJfQorCQkKKwl9CisKKyAgCS8qIFdyaXRlIG5ldyBjYXBhYmlsaXR5IHRvIFBoeXhjZXIgUmVnNCAqLworCWlmICggIShwaHlfcmVnICYgMHgwMWUwKSkgeworCQlwaHlfcmVnfD1kYi0+UEhZX3JlZzQ7CisJCWRiLT5tZWRpYV9tb2RlfD1VTEk1MjZYX0FVVE87CisJfQorCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDQsIHBoeV9yZWcsIGRiLT5jaGlwX2lkKTsKKworIAkvKiBSZXN0YXJ0IEF1dG8tTmVnb3RpYXRpb24gKi8KKwlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAwLCAweDEyMDAsIGRiLT5jaGlwX2lkKTsKKwl1ZGVsYXkoNTApOworfQorCisKKy8qCisgKglQcm9jZXNzIG9wLW1vZGUKKyAJQVVUTyBtb2RlIDogUEhZIGNvbnRyb2xsZXIgaW4gQXV0by1uZWdvdGlhdGlvbiBNb2RlCisgKglGb3JjZSBtb2RlOiBQSFkgY29udHJvbGxlciBpbiBmb3JjZSBtb2RlIHdpdGggSFVCCisgKgkJCU4td2F5IGZvcmNlIGNhcGFiaWxpdHkgd2l0aCBTV0lUQ0gKKyAqLworCitzdGF0aWMgdm9pZCB1bGk1MjZ4X3Byb2Nlc3NfbW9kZShzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICpkYikKK3sKKwl1MTYgcGh5X3JlZzsKKworCS8qIEZ1bGwgRHVwbGV4IE1vZGUgQ2hlY2sgKi8KKwlpZiAoZGItPm9wX21vZGUgJiAweDQpCisJCWRiLT5jcjZfZGF0YSB8PSBDUjZfRkRNOwkvKiBTZXQgRnVsbCBEdXBsZXggQml0ICovCisJZWxzZQorCQlkYi0+Y3I2X2RhdGEgJj0gfkNSNl9GRE07CS8qIENsZWFyIEZ1bGwgRHVwbGV4IEJpdCAqLworCisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCisJLyogMTAvMTAwTSBwaHl4Y2VyIGZvcmNlIG1vZGUgbmVlZCAqLworCWlmICggIShkYi0+bWVkaWFfbW9kZSAmIDB4OCkpIHsKKwkJLyogRm9yZWNlIE1vZGUgKi8KKwkJcGh5X3JlZyA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgNiwgZGItPmNoaXBfaWQpOworCQlpZiAoICEocGh5X3JlZyAmIDB4MSkgKSB7CisJCQkvKiBwYXJ0ZXIgd2l0aG91dCBOLVdheSBjYXBhYmlsaXR5ICovCisJCQlwaHlfcmVnID0gMHgwOworCQkJc3dpdGNoKGRiLT5vcF9tb2RlKSB7CisJCQljYXNlIFVMSTUyNlhfMTBNSEY6IHBoeV9yZWcgPSAweDA7IGJyZWFrOworCQkJY2FzZSBVTEk1MjZYXzEwTUZEOiBwaHlfcmVnID0gMHgxMDA7IGJyZWFrOworCQkJY2FzZSBVTEk1MjZYXzEwME1IRjogcGh5X3JlZyA9IDB4MjAwMDsgYnJlYWs7CisJCQljYXNlIFVMSTUyNlhfMTAwTUZEOiBwaHlfcmVnID0gMHgyMTAwOyBicmVhazsKKwkJCX0KKwkJCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIHBoeV9yZWcsIGRiLT5jaGlwX2lkKTsKKyAgICAgICAJCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAwLCBwaHlfcmVnLCBkYi0+Y2hpcF9pZCk7CisJCX0KKwl9Cit9CisKKworLyoKKyAqCVdyaXRlIGEgd29yZCB0byBQaHkgcmVnaXN0ZXIKKyAqLworCitzdGF0aWMgdm9pZCBwaHlfd3JpdGUodW5zaWduZWQgbG9uZyBpb2Jhc2UsIHU4IHBoeV9hZGRyLCB1OCBvZmZzZXQsIHUxNiBwaHlfZGF0YSwgdTMyIGNoaXBfaWQpCit7CisJdTE2IGk7CisJdW5zaWduZWQgbG9uZyBpb2FkZHI7CisKKwlpZihjaGlwX2lkID09IFBDSV9VTEk1MjYzX0lEKQorCXsKKwkJcGh5X3dyaXRlYnlfY3IxMChpb2Jhc2UsIHBoeV9hZGRyLCBvZmZzZXQsIHBoeV9kYXRhKTsKKwkJcmV0dXJuOworCX0KKwkvKiBNNTI2MS9NNTI2MyBDaGlwICovCisJaW9hZGRyID0gaW9iYXNlICsgRENSOTsKKworCS8qIFNlbmQgMzMgc3luY2hyb25pemF0aW9uIGNsb2NrIHRvIFBoeSBjb250cm9sbGVyICovCisJZm9yIChpID0gMDsgaSA8IDM1OyBpKyspCisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMSwgY2hpcF9pZCk7CisKKwkvKiBTZW5kIHN0YXJ0IGNvbW1hbmQoMDEpIHRvIFBoeSAqLworCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMCwgY2hpcF9pZCk7CisJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xLCBjaGlwX2lkKTsKKworCS8qIFNlbmQgd3JpdGUgY29tbWFuZCgwMSkgdG8gUGh5ICovCisJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8wLCBjaGlwX2lkKTsKKwlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzEsIGNoaXBfaWQpOworCisJLyogU2VuZCBQaHkgYWRkcmVzcyAqLworCWZvciAoaSA9IDB4MTA7IGkgPiAwOyBpID0gaSA+PiAxKQorCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIHBoeV9hZGRyICYgaSA/IFBIWV9EQVRBXzEgOiBQSFlfREFUQV8wLCBjaGlwX2lkKTsKKworCS8qIFNlbmQgcmVnaXN0ZXIgYWRkcmVzcyAqLworCWZvciAoaSA9IDB4MTA7IGkgPiAwOyBpID0gaSA+PiAxKQorCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIG9mZnNldCAmIGkgPyBQSFlfREFUQV8xIDogUEhZX0RBVEFfMCwgY2hpcF9pZCk7CisKKwkvKiB3cml0dGVuIHRyYXNuaXRpb24gKi8KKwlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzEsIGNoaXBfaWQpOworCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMCwgY2hpcF9pZCk7CisKKwkvKiBXcml0ZSBhIHdvcmQgZGF0YSB0byBQSFkgY29udHJvbGxlciAqLworCWZvciAoIGkgPSAweDgwMDA7IGkgPiAwOyBpID4+PSAxKQorCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIHBoeV9kYXRhICYgaSA/IFBIWV9EQVRBXzEgOiBQSFlfREFUQV8wLCBjaGlwX2lkKTsKKwkKK30KKworCisvKgorICoJUmVhZCBhIHdvcmQgZGF0YSBmcm9tIHBoeSByZWdpc3RlcgorICovCisKK3N0YXRpYyB1MTYgcGh5X3JlYWQodW5zaWduZWQgbG9uZyBpb2Jhc2UsIHU4IHBoeV9hZGRyLCB1OCBvZmZzZXQsIHUzMiBjaGlwX2lkKQoreworCWludCBpOworCXUxNiBwaHlfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKworCWlmKGNoaXBfaWQgPT0gUENJX1VMSTUyNjNfSUQpCisJCXJldHVybiBwaHlfcmVhZGJ5X2NyMTAoaW9iYXNlLCBwaHlfYWRkciwgb2Zmc2V0KTsKKwkvKiBNNTI2MS9NNTI2MyBDaGlwICovCisJaW9hZGRyID0gaW9iYXNlICsgRENSOTsKKwkKKwkvKiBTZW5kIDMzIHN5bmNocm9uaXphdGlvbiBjbG9jayB0byBQaHkgY29udHJvbGxlciAqLworCWZvciAoaSA9IDA7IGkgPCAzNTsgaSsrKQorCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzEsIGNoaXBfaWQpOworCisJLyogU2VuZCBzdGFydCBjb21tYW5kKDAxKSB0byBQaHkgKi8KKwlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzAsIGNoaXBfaWQpOworCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMSwgY2hpcF9pZCk7CisKKwkvKiBTZW5kIHJlYWQgY29tbWFuZCgxMCkgdG8gUGh5ICovCisJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xLCBjaGlwX2lkKTsKKwlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzAsIGNoaXBfaWQpOworCisJLyogU2VuZCBQaHkgYWRkcmVzcyAqLworCWZvciAoaSA9IDB4MTA7IGkgPiAwOyBpID0gaSA+PiAxKQorCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIHBoeV9hZGRyICYgaSA/IFBIWV9EQVRBXzEgOiBQSFlfREFUQV8wLCBjaGlwX2lkKTsKKworCS8qIFNlbmQgcmVnaXN0ZXIgYWRkcmVzcyAqLworCWZvciAoaSA9IDB4MTA7IGkgPiAwOyBpID0gaSA+PiAxKQorCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIG9mZnNldCAmIGkgPyBQSFlfREFUQV8xIDogUEhZX0RBVEFfMCwgY2hpcF9pZCk7CisKKwkvKiBTa2lwIHRyYW5zaXRpb24gc3RhdGUgKi8KKwlwaHlfcmVhZF8xYml0KGlvYWRkciwgY2hpcF9pZCk7CisKKwkvKiByZWFkIDE2Yml0IGRhdGEgKi8KKwlmb3IgKHBoeV9kYXRhID0gMCwgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXBoeV9kYXRhIDw8PSAxOworCQlwaHlfZGF0YSB8PSBwaHlfcmVhZF8xYml0KGlvYWRkciwgY2hpcF9pZCk7CisJfQorCisJcmV0dXJuIHBoeV9kYXRhOworfQorCitzdGF0aWMgdTE2IHBoeV9yZWFkYnlfY3IxMCh1bnNpZ25lZCBsb25nIGlvYmFzZSwgdTggcGh5X2FkZHIsIHU4IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkcixjcjEwX3ZhbHVlOworCQorCWlvYWRkciA9IGlvYmFzZSArIERDUjEwOworCWNyMTBfdmFsdWUgPSBwaHlfYWRkcjsKKwljcjEwX3ZhbHVlID0gKGNyMTBfdmFsdWU8PDUpICsgb2Zmc2V0OworCWNyMTBfdmFsdWUgPSAoY3IxMF92YWx1ZTw8MTYpICsgMHgwODAwMDAwMDsKKwlvdXRsKGNyMTBfdmFsdWUsaW9hZGRyKTsKKwl1ZGVsYXkoMSk7CisJd2hpbGUoMSkKKwl7CisJCWNyMTBfdmFsdWUgPSBpbmwoaW9hZGRyKTsKKwkJaWYoY3IxMF92YWx1ZSYweDEwMDAwMDAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoY3IxMF92YWx1ZSYweDBmZmZmKTsKK30KKworc3RhdGljIHZvaWQgcGh5X3dyaXRlYnlfY3IxMCh1bnNpZ25lZCBsb25nIGlvYmFzZSwgdTggcGh5X2FkZHIsIHU4IG9mZnNldCwgdTE2IHBoeV9kYXRhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyLGNyMTBfdmFsdWU7CisJCisJaW9hZGRyID0gaW9iYXNlICsgRENSMTA7CisJY3IxMF92YWx1ZSA9IHBoeV9hZGRyOworCWNyMTBfdmFsdWUgPSAoY3IxMF92YWx1ZTw8NSkgKyBvZmZzZXQ7CisJY3IxMF92YWx1ZSA9IChjcjEwX3ZhbHVlPDwxNikgKyAweDA0MDAwMDAwICsgcGh5X2RhdGE7CisJb3V0bChjcjEwX3ZhbHVlLGlvYWRkcik7CisJdWRlbGF5KDEpOworfQorLyoKKyAqCVdyaXRlIG9uZSBiaXQgZGF0YSB0byBQaHkgQ29udHJvbGxlcgorICovCisKK3N0YXRpYyB2b2lkIHBoeV93cml0ZV8xYml0KHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MzIgcGh5X2RhdGEsIHUzMiBjaGlwX2lkKQoreworCW91dGwocGh5X2RhdGEgLCBpb2FkZHIpOwkJCS8qIE1JSSBDbG9jayBMb3cgKi8KKwl1ZGVsYXkoMSk7CisJb3V0bChwaHlfZGF0YSAgfCBNRENMS0gsIGlvYWRkcik7CS8qIE1JSSBDbG9jayBIaWdoICovCisJdWRlbGF5KDEpOworCW91dGwocGh5X2RhdGEgLCBpb2FkZHIpOwkJCS8qIE1JSSBDbG9jayBMb3cgKi8KKwl1ZGVsYXkoMSk7Cit9CisKKworLyoKKyAqCVJlYWQgb25lIGJpdCBwaHkgZGF0YSBmcm9tIFBIWSBjb250cm9sbGVyCisgKi8KKworc3RhdGljIHUxNiBwaHlfcmVhZF8xYml0KHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MzIgY2hpcF9pZCkKK3sKKwl1MTYgcGh5X2RhdGE7CisJCisJb3V0bCgweDUwMDAwICwgaW9hZGRyKTsKKwl1ZGVsYXkoMSk7CisJcGh5X2RhdGEgPSAoIGlubChpb2FkZHIpID4+IDE5ICkgJiAweDE7CisJb3V0bCgweDQwMDAwICwgaW9hZGRyKTsKKwl1ZGVsYXkoMSk7CisKKwlyZXR1cm4gcGh5X2RhdGE7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHVsaTUyNnhfcGNpX3RibFtdID0geworCXsgMHgxMEI5LCAweDUyNjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFBDSV9VTEk1MjYxX0lEIH0sCisJeyAweDEwQjksIDB4NTI2MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUENJX1VMSTUyNjNfSUQgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdWxpNTI2eF9wY2lfdGJsKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdWxpNTI2eF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInVsaTUyNngiLAorCS5pZF90YWJsZQk9IHVsaTUyNnhfcGNpX3RibCwKKwkucHJvYmUJCT0gdWxpNTI2eF9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHVsaTUyNnhfcmVtb3ZlX29uZSksCit9OworCitNT0RVTEVfQVVUSE9SKCJQZWVyIENoZW4sIHBlZXIuY2hlbkB1bGkuY29tLnR3Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlVMaSBNNTI2MS9NNTI2MyBmYXN0IGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitNT0RVTEVfUEFSTShkZWJ1ZywgImkiKTsKK01PRFVMRV9QQVJNKG1vZGUsICJpIik7CitNT0RVTEVfUEFSTShjcjZzZXQsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVUxpIE01MjYxL001MjYzIGVuYWJsZSBkZWJ1Z2dpbmcgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZSwgIlVMaSBNNTI2MS9NNTI2MzogQml0IDA6IDEwLzEwME1icHMsIGJpdCAyOiBkdXBsZXgsIGJpdCA4OiBIb21lUE5BIik7CisKKy8qCURlc2NyaXB0aW9uOgorICoJd2hlbiB1c2VyIHVzZWQgaW5zbW9kIHRvIGFkZCBtb2R1bGUsIHN5c3RlbSBpbnZva2VkIGluaXRfbW9kdWxlKCkKKyAqCXRvIHJlZ2lzdGVyIHRoZSBzZXJ2aWNlcy4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCB1bGk1MjZ4X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJjOworCisJcHJpbnRrKHZlcnNpb24pOworCXByaW50ZWRfdmVyc2lvbiA9IDE7CisKKwlVTEk1MjZYX0RCVUcoMCwgImluaXRfbW9kdWxlKCkgIiwgZGVidWcpOworCisJaWYgKGRlYnVnKQorCQl1bGk1MjZ4X2RlYnVnID0gZGVidWc7CS8qIHNldCBkZWJ1ZyBmbGFnICovCisJaWYgKGNyNnNldCkKKwkJdWxpNTI2eF9jcjZfdXNlcl9zZXQgPSBjcjZzZXQ7CisKKyAJc3dpdGNoKG1vZGUpIHsKKyAgIAljYXNlIFVMSTUyNlhfMTBNSEY6CisJY2FzZSBVTEk1MjZYXzEwME1IRjoKKwljYXNlIFVMSTUyNlhfMTBNRkQ6CisJY2FzZSBVTEk1MjZYXzEwME1GRDoKKwkJdWxpNTI2eF9tZWRpYV9tb2RlID0gbW9kZTsKKwkJYnJlYWs7CisJZGVmYXVsdDp1bGk1MjZ4X21lZGlhX21vZGUgPSBVTEk1MjZYX0FVVE87CisJCWJyZWFrOworCX0KKworCXJjID0gcGNpX21vZHVsZV9pbml0KCZ1bGk1MjZ4X2RyaXZlcik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCURlc2NyaXB0aW9uOgorICoJd2hlbiB1c2VyIHVzZWQgcm1tb2QgdG8gZGVsZXRlIG1vZHVsZSwgc3lzdGVtIGludm9rZWQgY2xlYW5fbW9kdWxlKCkKKyAqCXRvIHVuLXJlZ2lzdGVyIGFsbCByZWdpc3RlcmVkIHNlcnZpY2VzLgorICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bGk1MjZ4X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJVUxJNTI2WF9EQlVHKDAsICJ1bGk1MjZ4X2NsZWFuX21vZHVsZSgpICIsIGRlYnVnKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnVsaTUyNnhfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodWxpNTI2eF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh1bGk1MjZ4X2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bi5jIGIvZHJpdmVycy9uZXQvdHVuLmMKaW5kZXggZWZmYWIwYi4uNTBiOGM2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVuLmMKKysrIGIvZHJpdmVycy9uZXQvdHVuLmMKQEAgLTE4LDYgKzE4LDkgQEAKIC8qCiAgKiAgQ2hhbmdlczoKICAqCisgKiAgTWlrZSBLZXJzaGF3IDxkcmFnb3JuQGtpc21ldHdpcmVsZXNzLm5ldD4gMjAwNS8wOC8xNAorICogICAgQWRkIFRVTlNFVExJTksgaW9jdGwgdG8gc2V0IHRoZSBsaW5rIGVuY2Fwc3VsYXRpb24KKyAqCiAgKiAgTWFyayBTbWl0aCA8bWFya3p6enNtaXRoQHlhaG9vLmNvbS5hdT4KICAqICAgVXNlIHJhbmRvbV9ldGhlcl9hZGRyKCkgZm9yIHRhcCBNQUMgYWRkcmVzcy4KICAqCkBAIC02MTIsNiArNjE1LDE4IEBACiAJCURCRyhLRVJOX0lORk8gIiVzOiBvd25lciBzZXQgdG8gJWRcbiIsIHR1bi0+ZGV2LT5uYW1lLCB0dW4tPm93bmVyKTsKIAkJYnJlYWs7CiAKKwljYXNlIFRVTlNFVExJTks6CisJCS8qIE9ubHkgYWxsb3cgc2V0dGluZyB0aGUgdHlwZSB3aGVuIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCQlpZiAodHVuLT5kZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQlEQkcoS0VSTl9JTkZPICIlczogTGlua3R5cGUgc2V0IGZhaWxlZCBiZWNhdXNlIGludGVyZmFjZSBpcyB1cFxuIiwKKwkJCQl0dW4tPmRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9IGVsc2UgeworCQkJdHVuLT5kZXYtPnR5cGUgPSAoaW50KSBhcmc7CisJCQlEQkcoS0VSTl9JTkZPICIlczogbGlua3R5cGUgc2V0IHRvICVkXG4iLCB0dW4tPmRldi0+bmFtZSwgdHVuLT5kZXYtPnR5cGUpOworCQl9CisJCWJyZWFrOworCiAjaWZkZWYgVFVOX0RFQlVHCiAJY2FzZSBUVU5TRVRERUJVRzoKIAkJdHVuLT5kZWJ1ZyA9IGFyZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zeW5jcHBwLmMgYi9kcml2ZXJzL25ldC93YW4vc3luY3BwcC5jCmluZGV4IGY1OGM3OTQuLmI1NmE3YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9zeW5jcHBwLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3N5bmNwcHAuYwpAQCAtMTQ0MCw2ICsxNDQwLDcgQEAKICAqCUBza2I6CVRoZSBidWZmZXIgdG8gcHJvY2VzcwogICoJQGRldjoJVGhlIGRldmljZSBpdCBhcnJpdmVkIG9uCiAgKglAcDogVW51c2VkCisgKglAb3JpZ19kZXY6IFVudXNlZAogICoKICAqCVByb3RvY29sIGdsdWUuIFRoaXMgZHJpdmVzIHRoZSBkZWZlcnJlZCBwcm9jZXNzaW5nIG1vZGUgdGhlIHBvb3JlcgogICoJY2FyZHMgdXNlLiBUaGlzIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgY2FyZHMgdGhhdCBkbyBub3QgaGF2ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKaW5kZXggZWMzZjc1YS4uMDBhMDdmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnCkBAIC0xMzcsNiArMTM3LDExMCBAQAogY29tbWVudCAiV2lyZWxlc3MgODAyLjExYiBJU0EvUENJIGNhcmRzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgKElTQSB8fCBQQ0kgfHwgUFBDX1BNQUMgfHwgUENNQ0lBKQogCitjb25maWcgSVBXMjEwMAorCXRyaXN0YXRlICJJbnRlbCBQUk8vV2lyZWxlc3MgMjEwMCBOZXR3b3JrIENvbm5lY3Rpb24iCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENJICYmIElFRUU4MDIxMQorCXNlbGVjdCBGV19MT0FERVIKKwktLS1oZWxwLS0tCisgICAgICAgICAgQSBkcml2ZXIgZm9yIHRoZSBJbnRlbCBQUk8vV2lyZWxlc3MgMjEwMCBOZXR3b3JrIAorCSAgQ29ubmVjdGlvbiA4MDIuMTFiIHdpcmVsZXNzIG5ldHdvcmsgYWRhcHRlci4KKworICAgICAgICAgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvUkVBRE1FLmlwdzIxMDA+IGZvciBpbmZvcm1hdGlvbiBvbgorICAgICAgICAgIHRoZSBjYXBhYmlsaXRpZXMgY3VycmVudGx5IGVuYWJsZWQgaW4gdGhpcyBkcml2ZXIgYW5kIGZvciB0aXBzCisgICAgICAgICAgZm9yIGRlYnVnZ2luZyBpc3N1ZXMgYW5kIHByb2JsZW1zLgorCisJICBJbiBvcmRlciB0byB1c2UgdGhpcyBkcml2ZXIsIHlvdSB3aWxsIG5lZWQgYSBmaXJtd2FyZSBpbWFnZSBmb3IgaXQuCisgICAgICAgICAgWW91IGNhbiBvYnRhaW4gdGhlIGZpcm13YXJlIGZyb20KKwkgIDxodHRwOi8vaXB3MjEwMC5zZi5uZXQvPi4gIE9uY2UgeW91IGhhdmUgdGhlIGZpcm13YXJlIGltYWdlLCB5b3UgCisJICB3aWxsIG5lZWQgdG8gcGxhY2UgaXQgaW4gL2V0Yy9maXJtd2FyZS4KKworICAgICAgICAgIFlvdSB3aWxsIGFsc28gdmVyeSBsaWtlbHkgbmVlZCB0aGUgV2lyZWxlc3MgVG9vbHMgaW4gb3JkZXIgdG8KKyAgICAgICAgICBjb25maWd1cmUgeW91ciBjYXJkOgorCisgICAgICAgICAgPGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvVG9vbHMuaHRtbD4uCisgCisgICAgICAgICAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSB0aGUgZHJpdmVyIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorICAgICAgICAgIGluc2VydGVkIGluIGFuZCByZW12b2VkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KSwKKyAgICAgICAgICBzYXkgTSBoZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZQorICAgICAgICAgIHdpbGwgYmUgY2FsbGVkIGlwdzIxMDAua28uCisJCitjb25maWcgSVBXMjEwMF9NT05JVE9SCisgICAgICAgIGJvb2wgIkVuYWJsZSBwcm9taXNjdW91cyBtb2RlIgorICAgICAgICBkZXBlbmRzIG9uIElQVzIxMDAKKyAgICAgICAgLS0taGVscC0tLQorCSAgRW5hYmxlcyBwcm9taXNjdW91cy9tb25pdG9yIG1vZGUgc3VwcG9ydCBmb3IgdGhlIGlwdzIxMDAgZHJpdmVyLgorCSAgV2l0aCB0aGlzIGZlYXR1cmUgY29tcGlsZWQgaW50byB0aGUgZHJpdmVyLCB5b3UgY2FuIHN3aXRjaCB0byAKKwkgIHByb21pc2N1b3VzIG1vZGUgdmlhIHRoZSBXaXJlbGVzcyBUb29sJ3MgTW9uaXRvciBtb2RlLiAgV2hpbGUgaW4gdGhpcworCSAgbW9kZSwgbm8gcGFja2V0cyBjYW4gYmUgc2VudC4KKworY29uZmlnIElQV19ERUJVRworCWJvb2wgIkVuYWJsZSBmdWxsIGRlYnVnZ2luZyBvdXRwdXQgaW4gSVBXMjEwMCBtb2R1bGUuIgorCWRlcGVuZHMgb24gSVBXMjEwMAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIGRlYnVnIHRyYWNpbmcgb3V0cHV0IGZvciB0aGUgSVBXMjEwMC4gIAorCisJICBUaGlzIHdpbGwgcmVzdWx0IGluIHRoZSBrZXJuZWwgbW9kdWxlIGJlaW5nIH42MGsgbGFyZ2VyLiAgWW91IGNhbiAKKwkgIGNvbnRyb2wgd2hpY2ggZGVidWcgb3V0cHV0IGlzIHNlbnQgdG8gdGhlIGtlcm5lbCBsb2cgYnkgc2V0dGluZyB0aGUgCisJICB2YWx1ZSBpbiAKKworCSAgL3N5cy9idXMvcGNpL2RyaXZlcnMvaXB3MjEwMC9kZWJ1Z19sZXZlbAorCisJICBUaGlzIGVudHJ5IHdpbGwgb25seSBleGlzdCBpZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLgorCisJICBJZiB5b3UgYXJlIG5vdCB0cnlpbmcgdG8gZGVidWcgb3IgZGV2ZWxvcCB0aGUgSVBXMjEwMCBkcml2ZXIsIHlvdSAKKwkgIG1vc3QgbGlrZWx5IHdhbnQgdG8gc2F5IE4gaGVyZS4KKworY29uZmlnIElQVzIyMDAKKwl0cmlzdGF0ZSAiSW50ZWwgUFJPL1dpcmVsZXNzIDIyMDBCRyBhbmQgMjkxNUFCRyBOZXR3b3JrIENvbm5lY3Rpb24iCisJZGVwZW5kcyBvbiBJRUVFODAyMTEgJiYgUENJCisJc2VsZWN0IEZXX0xPQURFUgorCS0tLWhlbHAtLS0KKyAgICAgICAgICBBIGRyaXZlciBmb3IgdGhlIEludGVsIFBSTy9XaXJlbGVzcyAyMjAwQkcgYW5kIDI5MTVBQkcgTmV0d29yaworCSAgQ29ubmVjdGlvbiBhZGFwdGVycy4gCisKKyAgICAgICAgICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL1JFQURNRS5pcHcyMjAwPiBmb3IgCisJICBpbmZvcm1hdGlvbiBvbiB0aGUgY2FwYWJpbGl0aWVzIGN1cnJlbnRseSBlbmFibGVkIGluIHRoaXMgCisJICBkcml2ZXIgYW5kIGZvciB0aXBzIGZvciBkZWJ1Z2dpbmcgaXNzdWVzIGFuZCBwcm9ibGVtcy4KKworCSAgSW4gb3JkZXIgdG8gdXNlIHRoaXMgZHJpdmVyLCB5b3Ugd2lsbCBuZWVkIGEgZmlybXdhcmUgaW1hZ2UgZm9yIGl0LgorICAgICAgICAgIFlvdSBjYW4gb2J0YWluIHRoZSBmaXJtd2FyZSBmcm9tCisJICA8aHR0cDovL2lwdzIyMDAuc2YubmV0Lz4uICBTZWUgdGhlIGFib3ZlIHJlZmVyZW5jZWQgUkVBRE1FLmlwdzIyMDAgCisJICBmb3IgaW5mb3JtYXRpb24gb24gd2hlcmUgdG8gaW5zdGFsbCB0aGUgZmlybWFyZSBpbWFnZXMuCisKKyAgICAgICAgICBZb3Ugd2lsbCBhbHNvIHZlcnkgbGlrZWx5IG5lZWQgdGhlIFdpcmVsZXNzIFRvb2xzIGluIG9yZGVyIHRvCisgICAgICAgICAgY29uZmlndXJlIHlvdXIgY2FyZDoKKworICAgICAgICAgIDxodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L1Rvb2xzLmh0bWw+LgorIAorICAgICAgICAgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIGRyaXZlciBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKyAgICAgICAgICBpbnNlcnRlZCBpbiBhbmQgcmVtdm9lZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCksCisgICAgICAgICAgc2F5IE0gaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUKKyAgICAgICAgICB3aWxsIGJlIGNhbGxlZCBpcHcyMjAwLmtvLgorCitjb25maWcgSVBXX0RFQlVHCisJYm9vbCAiRW5hYmxlIGZ1bGwgZGVidWdnaW5nIG91dHB1dCBpbiBJUFcyMjAwIG1vZHVsZS4iCisJZGVwZW5kcyBvbiBJUFcyMjAwCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gd2lsbCBlbmFibGUgZGVidWcgdHJhY2luZyBvdXRwdXQgZm9yIHRoZSBJUFcyMjAwLiAgCisKKwkgIFRoaXMgd2lsbCByZXN1bHQgaW4gdGhlIGtlcm5lbCBtb2R1bGUgYmVpbmcgfjEwMGsgbGFyZ2VyLiAgWW91IGNhbiAKKwkgIGNvbnRyb2wgd2hpY2ggZGVidWcgb3V0cHV0IGlzIHNlbnQgdG8gdGhlIGtlcm5lbCBsb2cgYnkgc2V0dGluZyB0aGUgCisJICB2YWx1ZSBpbiAKKworCSAgL3N5cy9idXMvcGNpL2RyaXZlcnMvaXB3MjIwMC9kZWJ1Z19sZXZlbAorCisJICBUaGlzIGVudHJ5IHdpbGwgb25seSBleGlzdCBpZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLgorCisJICBUbyBzZXQgYSB2YWx1ZSwgc2ltcGx5IGVjaG8gYW4gOC1ieXRlIGhleCB2YWx1ZSB0byB0aGUgc2FtZSBmaWxlOgorCisJICAlIGVjaG8gMHgwMDAwMEZGTyA+IC9zeXMvYnVzL3BjaS9kcml2ZXJzL2lwdzIyMDAvZGVidWdfbGV2ZWwKKworCSAgWW91IGNhbiBmaW5kIHRoZSBsaXN0IG9mIGRlYnVnIG1hc2sgdmFsdWVzIGluIAorCSAgZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5oCisKKwkgIElmIHlvdSBhcmUgbm90IHRyeWluZyB0byBkZWJ1ZyBvciBkZXZlbG9wIHRoZSBJUFcyMjAwIGRyaXZlciwgeW91IAorCSAgbW9zdCBsaWtlbHkgd2FudCB0byBzYXkgTiBoZXJlLgorCiBjb25maWcgQUlSTwogCXRyaXN0YXRlICJDaXNjby9BaXJvbmV0IDM0WC8zNVgvNDUwMC80ODAwIElTQSBhbmQgUENJIGNhcmRzIgogCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIElTQSAmJiAoUENJIHx8IEJST0tFTikKQEAgLTE4NSw4ICsyODksOCBAQAogCSAgYSBub24tc3RhbmRhcmQgaW50ZXJmYWNlCiAKIGNvbmZpZyBQTFhfSEVSTUVTCi0JdHJpc3RhdGUgIkhlcm1lcyBpbiBQTFg5MDUyIGJhc2VkIFBDSSBhZGFwdG9yIHN1cHBvcnQgKE5ldGdlYXIgTUEzMDEgZXRjLikgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgSEVSTUVTICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJIZXJtZXMgaW4gUExYOTA1MiBiYXNlZCBQQ0kgYWRhcHRvciBzdXBwb3J0IChOZXRnZWFyIE1BMzAxIGV0Yy4pIgorCWRlcGVuZHMgb24gUENJICYmIEhFUk1FUwogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBQQ01DSUEgY2FyZHMgc3VwcG9ydGVkIGJ5IHRoZSAiSGVybWVzIiAoYWthCiAJICBvcmlub2NvKSBkcml2ZXIgd2hlbiB1c2VkIGluIFBMWDkwNTIgYmFzZWQgUENJIGFkYXB0b3JzLiAgVGhlc2UKQEAgLTE5NSwxMiArMjk5LDkgQEAKIAkgIDgwMi4xMWIgUENNQ0lBIGNhcmRzIGNhbiBiZSB1c2VkIGluIGRlc2t0b3AgbWFjaGluZXMuICBUaGUgTmV0Z2VhcgogCSAgTUEzMDEgaXMgc3VjaCBhbiBhZGFwdG9yLgogCi0JICBTdXBwb3J0IGZvciB0aGVzZSBhZGFwdG9ycyBpcyBzbyBmYXIgc3RpbGwgaW5jb21wbGV0ZSBhbmQgYnVnZ3kuCi0JICBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KLQogY29uZmlnIFRNRF9IRVJNRVMKLQl0cmlzdGF0ZSAiSGVybWVzIGluIFRNRDcxNjAgYmFzZWQgUENJIGFkYXB0b3Igc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFBDSSAmJiBIRVJNRVMgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIkhlcm1lcyBpbiBUTUQ3MTYwIGJhc2VkIFBDSSBhZGFwdG9yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgSEVSTUVTCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFBDTUNJQSBjYXJkcyBzdXBwb3J0ZWQgYnkgdGhlICJIZXJtZXMiIChha2EKIAkgIG9yaW5vY28pIGRyaXZlciB3aGVuIHVzZWQgaW4gVE1ENzE2MCBiYXNlZCBQQ0kgYWRhcHRvcnMuICBUaGVzZQpAQCAtMjA4LDEyICszMDksMTggQEAKIAkgIFBDSSA8LT4gUENNQ0lBIGJyaWRnZS4gIFNldmVyYWwgdmVuZG9ycyBzZWxsIHN1Y2ggYWRhcHRvcnMgc28gdGhhdAogCSAgODAyLjExYiBQQ01DSUEgY2FyZHMgY2FuIGJlIHVzZWQgaW4gZGVza3RvcCBtYWNoaW5lcy4KIAotCSAgU3VwcG9ydCBmb3IgdGhlc2UgYWRhcHRvcnMgaXMgc28gZmFyIHN0aWxsIGluY29tcGxldGUgYW5kIGJ1Z2d5LgotCSAgWW91IGhhdmUgYmVlbiB3YXJuZWQuCitjb25maWcgTk9SVEVMX0hFUk1FUworCXRyaXN0YXRlICJOb3J0ZWwgZW1vYmlsaXR5IFBDSSBhZGFwdG9yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgSEVSTUVTCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFBDTUNJQSBjYXJkcyBzdXBwb3J0ZWQgYnkgdGhlICJIZXJtZXMiIChha2EKKwkgIG9yaW5vY28pIGRyaXZlciB3aGVuIHVzZWQgaW4gTm9ydGVsIGVtb2JpbGl0eSBQQ0kgYWRhcHRvcnMuICBUaGVzZQorCSAgYWRhcHRvcnMgYXJlIG5vdCBmdWxsIFBDTUNJQSBjb250cm9sbGVycywgYnV0IGFjdCBhcyBhIG1vcmUgbGltaXRlZAorCSAgUENJIDwtPiBQQ01DSUEgYnJpZGdlLgogCiBjb25maWcgUENJX0hFUk1FUwotCXRyaXN0YXRlICJQcmlzbSAyLjUgUENJIDgwMi4xMWIgYWRhcHRvciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gUENJICYmIEhFUk1FUyAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiUHJpc20gMi41IFBDSSA4MDIuMTFiIGFkYXB0b3Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSSAmJiBIRVJNRVMKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgUENJIGFuZCBtaW5pLVBDSSA4MDIuMTFiIHdpcmVsZXNzIE5JQ3MgYmFzZWQgb24KIAkgIHRoZSBQcmlzbSAyLjUgY2hpcHNldC4gIFRoZXNlIGFyZSB0cnVlIFBDSSBjYXJkcywgbm90IHRoZSA4MDIuMTFiCkBAIC0yNjgsNiArMzc1LDE5IEBACiAJICBjb25maWd1cmUgeW91ciBjYXJkIGFuZCB0aGF0IC9ldGMvcGNtY2lhL3dpcmVsZXNzLm9wdHMgd29ya3M6CiAJICA8aHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC9Ub29scy5odG1sPi4KIAorY29uZmlnIFBDTUNJQV9TUEVDVFJVTQorCXRyaXN0YXRlICJTeW1ib2wgU3BlY3RydW0yNCBUcmlsb2d5IFBDTUNJQSBjYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBICYmIEhFUk1FUworCS0tLWhlbHAtLS0KKworCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgODAyLjExYiBjYXJkcyB1c2luZyBSQU0tbG9hZGFibGUgU3ltYm9sCisJICBmaXJtd2FyZSwgc3VjaCBhcyBTeW1ib2wgV2lyZWxlc3MgTmV0d29ya2VyIExBNDEwMCwgQ29tcGFjdEZsYXNoCisJICBjYXJkcyBieSBTb2NrZXQgQ29tbXVuaWNhdGlvbnMgYW5kIEludGVsIFBSTy9XaXJlbGVzcyAyMDExQi4KKworCSAgVGhpcyBkcml2ZXIgcmVxdWlyZXMgZmlybXdhcmUgZG93bmxvYWQgb24gc3RhcnR1cC4gIFV0aWxpdGllcworCSAgZm9yIGRvd25sb2FkaW5nIFN5bWJvbCBmaXJtd2FyZSBhcmUgYXZhaWxhYmxlIGF0CisJICA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9vcmlub2NvLz4KKwogY29uZmlnIEFJUk9fQ1MKIAl0cmlzdGF0ZSAiQ2lzY28vQWlyb25ldCAzNFgvMzVYLzQ1MDAvNDgwMCBQQ01DSUEgY2FyZHMiCiAJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBICYmIChCUk9LRU4gfHwgIU0zMlIpCkBAIC0zNTUsNiArNDc1LDggQEAKIAkgIHNheSBNIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBwcmlzbTU0LmtvLgogCitzb3VyY2UgImRyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9LY29uZmlnIgorCiAjIHllcywgdGhpcyB3b3JrcyBldmVuIHdoZW4gbm8gZHJpdmVycyBhcmUgc2VsZWN0ZWQKIGNvbmZpZyBORVRfV0lSRUxFU1MKIAlib29sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlCmluZGV4IDJiODc4NDEuLjNhNmY3YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlCkBAIC0yLDYgKzIsMTAgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBXaXJlbGVzcyBuZXR3b3JrIGRldmljZSBkcml2ZXJzLgogIwogCitvYmotJChDT05GSUdfSVBXMjEwMCkgKz0gaXB3MjEwMC5vCisKK29iai0kKENPTkZJR19JUFcyMjAwKSArPSBpcHcyMjAwLm8KKwogb2JqLSQoQ09ORklHX1NUUklQKSArPSBzdHJpcC5vCiBvYmotJChDT05GSUdfQVJMQU4pICs9IGFybGFuLm8gCiAKQEAgLTE4LDYgKzIyLDggQEAKIG9iai0kKENPTkZJR19QTFhfSEVSTUVTKQkrPSBvcmlub2NvX3BseC5vCiBvYmotJChDT05GSUdfUENJX0hFUk1FUykJKz0gb3Jpbm9jb19wY2kubwogb2JqLSQoQ09ORklHX1RNRF9IRVJNRVMpCSs9IG9yaW5vY29fdG1kLm8KK29iai0kKENPTkZJR19OT1JURUxfSEVSTUVTKQkrPSBvcmlub2NvX25vcnRlbC5vCitvYmotJChDT05GSUdfUENNQ0lBX1NQRUNUUlVNKQkrPSBzcGVjdHJ1bV9jcy5vCiAKIG9iai0kKENPTkZJR19BSVJPKQkJKz0gYWlyby5vCiBvYmotJChDT05GSUdfQUlST19DUykJCSs9IGFpcm9fY3MubyBhaXJvLm8KQEAgLTI4LDYgKzM0LDggQEAKIAogb2JqLSQoQ09ORklHX1BSSVNNNTQpCQkrPSBwcmlzbTU0LwogCitvYmotJChDT05GSUdfSE9TVEFQKQkJKz0gaG9zdGFwLworCiAjIDE2LWJpdCB3aXJlbGVzcyBQQ01DSUEgY2xpZW50IGRyaXZlcnMKIG9iai0kKENPTkZJR19QQ01DSUFfUkFZQ1MpCSs9IHJheV9jcy5vCiBvYmotJChDT05GSUdfUENNQ0lBX1dMMzUwMSkJKz0gd2wzNTAxX2NzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwppbmRleCBkZjIwYWRjLi4yYmU2NWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCkBAIC0xMDQwLDcgKzEwNDAsNyBAQAogCXUxNiBzdGF0dXM7CiB9IFdpZmlDdGxIZHI7CiAKLVdpZmlDdGxIZHIgd2lmaWN0bGhkcjgwMjMgPSB7CitzdGF0aWMgV2lmaUN0bEhkciB3aWZpY3RsaGRyODAyMyA9IHsKIAkuY3RsaGRyID0gewogCQkuY3RsCT0gSE9TVF9ET05UX1JMU0UsCiAJfQpAQCAtMTExMSwxMyArMTExMSwxMyBAQAogc3RhdGljIHZvaWQgdGltZXJfZnVuYyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOwogc3RhdGljIGludCBhaXJvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwogI2lmZGVmIFdJUkVMRVNTX0VYVAotc3RydWN0IGl3X3N0YXRpc3RpY3MgKmFpcm9fZ2V0X3dpcmVsZXNzX3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqYWlyb19nZXRfd2lyZWxlc3Nfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgYWlyb19yZWFkX3dpcmVsZXNzX3N0YXRzIChzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCk7CiAjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCiAjaWZkZWYgQ0lTQ09fRVhUCiBzdGF0aWMgaW50IHJlYWRyaWRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGFpcm9uZXRfaW9jdGwgKmNvbXApOwogc3RhdGljIGludCB3cml0ZXJpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYWlyb25ldF9pb2N0bCAqY29tcCk7Ci1pbnQgZmxhc2hjYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGFpcm9uZXRfaW9jdGwgKmNvbXApOworc3RhdGljIGludCBmbGFzaGNhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYWlyb25ldF9pb2N0bCAqY29tcCk7CiAjZW5kaWYgLyogQ0lTQ09fRVhUICovCiAjaWZkZWYgTUlDU1VQUE9SVAogc3RhdGljIHZvaWQgbWljaW5pdChzdHJ1Y3QgYWlyb19pbmZvICphaSk7CkBAIC0xMjI2LDYgKzEyMjYsMTIgQEAKIHN0YXRpYyBpbnQgdGFrZWRvd25fcHJvY19lbnRyeSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiApOwogCitzdGF0aWMgaW50IGNtZHJlc2V0KHN0cnVjdCBhaXJvX2luZm8gKmFpKTsKK3N0YXRpYyBpbnQgc2V0Zmxhc2htb2RlIChzdHJ1Y3QgYWlyb19pbmZvICphaSk7CitzdGF0aWMgaW50IGZsYXNoZ2NoYXIoc3RydWN0IGFpcm9faW5mbyAqYWksaW50IG1hdGNoYnl0ZSxpbnQgZHdlbGx0aW1lKTsKK3N0YXRpYyBpbnQgZmxhc2hwdXRidWYoc3RydWN0IGFpcm9faW5mbyAqYWkpOworc3RhdGljIGludCBmbGFzaHJlc3RhcnQoc3RydWN0IGFpcm9faW5mbyAqYWksc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKICNpZmRlZiBNSUNTVVBQT1JUCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlDIFJPVVRJTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgKgpAQCAtMTIzNCwxMCArMTI0MCwxMSBAQAogCiBzdGF0aWMgaW50IFJ4U2VxVmFsaWQgKHN0cnVjdCBhaXJvX2luZm8gKmFpLG1pY2NudHggKmNvbnRleHQsaW50IG1jYXN0LHUzMiBtaWNTZXEpOwogc3RhdGljIHZvaWQgTW92ZVdpbmRvdyhtaWNjbnR4ICpjb250ZXh0LCB1MzIgbWljU2VxKTsKLXZvaWQgZW1taDMyX3NldHNlZWQoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4ICpwa2V5LCBpbnQga2V5bGVuLCBzdHJ1Y3QgY3J5cHRvX3RmbSAqKTsKLXZvaWQgZW1taDMyX2luaXQoZW1taDMyX2NvbnRleHQgKmNvbnRleHQpOwotdm9pZCBlbW1oMzJfdXBkYXRlKGVtbWgzMl9jb250ZXh0ICpjb250ZXh0LCB1OCAqcE9jdGV0cywgaW50IGxlbik7Ci12b2lkIGVtbWgzMl9maW5hbChlbW1oMzJfY29udGV4dCAqY29udGV4dCwgdTggZGlnZXN0WzRdKTsKK3N0YXRpYyB2b2lkIGVtbWgzMl9zZXRzZWVkKGVtbWgzMl9jb250ZXh0ICpjb250ZXh0LCB1OCAqcGtleSwgaW50IGtleWxlbiwgc3RydWN0IGNyeXB0b190Zm0gKik7CitzdGF0aWMgdm9pZCBlbW1oMzJfaW5pdChlbW1oMzJfY29udGV4dCAqY29udGV4dCk7CitzdGF0aWMgdm9pZCBlbW1oMzJfdXBkYXRlKGVtbWgzMl9jb250ZXh0ICpjb250ZXh0LCB1OCAqcE9jdGV0cywgaW50IGxlbik7CitzdGF0aWMgdm9pZCBlbW1oMzJfZmluYWwoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4IGRpZ2VzdFs0XSk7CitzdGF0aWMgaW50IGZsYXNocGNoYXIoc3RydWN0IGFpcm9faW5mbyAqYWksaW50IGJ5dGUsaW50IGR3ZWxsdGltZSk7CiAKIC8qIG1pY2luaXQgLSBJbml0aWFsaXplIG1pYyBzZWVkICovCiAKQEAgLTEzMDEsNyArMTMwOCw3IEBACiAJaW50IGk7CiAKIAlpZiAoYWktPnRmbSA9PSBOVUxMKQotCSAgICAgICAgYWktPnRmbSA9IGNyeXB0b19hbGxvY190Zm0oImFlcyIsIDApOworCSAgICAgICAgYWktPnRmbSA9IGNyeXB0b19hbGxvY190Zm0oImFlcyIsIENSWVBUT19URk1fUkVRX01BWV9TTEVFUCk7CiAKICAgICAgICAgaWYgKGFpLT50Zm0gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiYWlybzogZmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciBBRVNcbiIpOwpAQCAtMTMxNSw3ICsxMzIyLDcgQEAKIAlyZXR1cm4gU1VDQ0VTUzsKIH0KIAotY2hhciBtaWNzbmFwW109IHsweEFBLDB4QUEsMHgwMywweDAwLDB4NDAsMHg5NiwweDAwLDB4MDJ9Oworc3RhdGljIGNoYXIgbWljc25hcFtdID0gezB4QUEsMHhBQSwweDAzLDB4MDAsMHg0MCwweDk2LDB4MDAsMHgwMn07CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBEZXNjcmlwdGlvbjogTWljIGEgcGFja2V0CkBAIC0xNTcwLDcgKzE1NzcsNyBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgYWVzX2NvdW50ZXJbMTZdOwogCiAvKiBleHBhbmQgdGhlIGtleSB0byBmaWxsIHRoZSBNTUggY29lZmZpY2llbnQgYXJyYXkgKi8KLXZvaWQgZW1taDMyX3NldHNlZWQoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4ICpwa2V5LCBpbnQga2V5bGVuLCBzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQorc3RhdGljIHZvaWQgZW1taDMyX3NldHNlZWQoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4ICpwa2V5LCBpbnQga2V5bGVuLCBzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewogICAvKiB0YWtlIHRoZSBrZXlpbmcgbWF0ZXJpYWwsIGV4cGFuZCBpZiBuZWNlc3NhcnksIHRydW5jYXRlIGF0IDE2LWJ5dGVzICovCiAgIC8qIHJ1biB0aHJvdWdoIEFFUyBjb3VudGVyIG1vZGUgdG8gZ2VuZXJhdGUgY29udGV4dC0+Y29lZmZbXSAqLwpAQCAtMTYwMiw3ICsxNjA5LDcgQEAKIH0KIAogLyogcHJlcGFyZSBmb3IgY2FsY3VsYXRpb24gb2YgYSBuZXcgbWljICovCi12b2lkIGVtbWgzMl9pbml0KGVtbWgzMl9jb250ZXh0ICpjb250ZXh0KQorc3RhdGljIHZvaWQgZW1taDMyX2luaXQoZW1taDMyX2NvbnRleHQgKmNvbnRleHQpCiB7CiAJLyogcHJlcGFyZSBmb3IgbmV3IG1pYyBjYWxjdWxhdGlvbiAqLwogCWNvbnRleHQtPmFjY3VtID0gMDsKQEAgLTE2MTAsNyArMTYxNyw3IEBACiB9CiAKIC8qIGFkZCBzb21lIGJ5dGVzIHRvIHRoZSBtaWMgY2FsY3VsYXRpb24gKi8KLXZvaWQgZW1taDMyX3VwZGF0ZShlbW1oMzJfY29udGV4dCAqY29udGV4dCwgdTggKnBPY3RldHMsIGludCBsZW4pCitzdGF0aWMgdm9pZCBlbW1oMzJfdXBkYXRlKGVtbWgzMl9jb250ZXh0ICpjb250ZXh0LCB1OCAqcE9jdGV0cywgaW50IGxlbikKIHsKIAlpbnQJY29lZmZfcG9zaXRpb24sIGJ5dGVfcG9zaXRpb247CiAgIApAQCAtMTY1Miw3ICsxNjU5LDcgQEAKIHN0YXRpYyB1MzIgbWFzazMyWzRdID0geyAweDAwMDAwMDAwTCwgMHhGRjAwMDAwMEwsIDB4RkZGRjAwMDBMLCAweEZGRkZGRjAwTCB9OwogCiAvKiBjYWxjdWxhdGUgdGhlIG1pYyAqLwotdm9pZCBlbW1oMzJfZmluYWwoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4IGRpZ2VzdFs0XSkKK3N0YXRpYyB2b2lkIGVtbWgzMl9maW5hbChlbW1oMzJfY29udGV4dCAqY29udGV4dCwgdTggZGlnZXN0WzRdKQogewogCWludAljb2VmZl9wb3NpdGlvbiwgYnl0ZV9wb3NpdGlvbjsKIAl1MzIJdmFsOwpAQCAtMjIzMiw3ICsyMjM5LDcgQEAKIAl1MzIgKnZhbHMgPSBzdGF0c19yaWQudmFsczsKIAogCWNsZWFyX2JpdChKT0JfU1RBVFMsICZhaS0+ZmxhZ3MpOwotCWlmIChhaS0+cG93ZXIpIHsKKwlpZiAoYWktPnBvd2VyLmV2ZW50KSB7CiAJCXVwKCZhaS0+c2VtKTsKIAkJcmV0dXJuOwogCX0KQEAgLTIyNTUsNyArMjI2Miw3IEBACiAJYWktPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gdmFsc1swXTsKIH0KIAotc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFpcm9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFpcm9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSAgZGV2LT5wcml2OwogCkBAIC0yNDAzLDggKzI0MTAsNyBAQAogCQl9CiAgICAgICAgIH0KICNpZmRlZiBNSUNTVVBQT1JUCi0JaWYgKGFpLT50Zm0pCi0JCWNyeXB0b19mcmVlX3RmbShhaS0+dGZtKTsKKwljcnlwdG9fZnJlZV90Zm0oYWktPnRmbSk7CiAjZW5kaWYKIAlkZWxfYWlyb19kZXYoIGRldiApOwogCWZyZWVfbmV0ZGV2KCBkZXYgKTsKQEAgLTI0MTQsNyArMjQyMCw3IEBACiAKIHN0YXRpYyBpbnQgYWRkX2Fpcm9fZGV2KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CiAKLWludCB3bGxfaGVhZGVyX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKQorc3RhdGljIGludCB3bGxfaGVhZGVyX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKQogewogCW1lbWNweShoYWRkciwgc2tiLT5tYWMucmF3ICsgMTAsIEVUSF9BTEVOKTsKIAlyZXR1cm4gRVRIX0FMRU47CkBAIC0yNjgxLDcgKzI2ODcsNyBAQAogCXJldHVybiBkZXY7CiB9CiAKLWludCByZXNldF9jYXJkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICwgaW50IGxvY2spIHsKK3N0YXRpYyBpbnQgcmVzZXRfY2FyZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiAsIGludCBsb2NrKSB7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CiAKIAlpZiAobG9jayAmJiBkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQpAQCAtMjY5Niw5ICsyNzAyLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IG5ldF9kZXZpY2UgKl9pbml0X2Fpcm9fY2FyZCggdW5zaWduZWQgc2hvcnQgaXJxLCBpbnQgcG9ydCwKLQkJCQkgICAgaW50IGlzX3BjbWNpYSwgc3RydWN0IHBjaV9kZXYgKnBjaSwKLQkJCQkgICAgc3RydWN0IGRldmljZSAqZG1kZXYgKQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpfaW5pdF9haXJvX2NhcmQoIHVuc2lnbmVkIHNob3J0IGlycSwgaW50IHBvcnQsCisJCQkJCSAgIGludCBpc19wY21jaWEsIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJCSAgIHN0cnVjdCBkZXZpY2UgKmRtZGV2ICkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBhaXJvX2luZm8gKmFpOwpAQCAtMjk2Miw3ICsyOTY4LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKGFpLT5wb3dlciB8fCB0ZXN0X2JpdChGTEFHX0ZMQVNISU5HLCAmYWktPmZsYWdzKSkgeworCQlpZiAoYWktPnBvd2VyLmV2ZW50IHx8IHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpKSB7CiAJCQl1cCgmYWktPnNlbSk7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMzI1Miw3ICszMjU4LDcgQEAKIAkJCQl3c3RhdHMubm9pc2UgPSBhcHJpdi0+d3N0YXRzLnF1YWwubm9pc2U7CiAJCQkJd3N0YXRzLnVwZGF0ZWQgPSBJV19RVUFMX0xFVkVMX1VQREFURUQKIAkJCQkJfCBJV19RVUFMX1FVQUxfVVBEQVRFRAotCQkJCQl8IElXX1FVQUxfTk9JU0VfVVBEQVRFRDsKKwkJCQkJfCBJV19RVUFMX0RCTTsKIAkJCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KIAkJCQl3aXJlbGVzc19zcHlfdXBkYXRlKGRldiwgc2EsICZ3c3RhdHMpOwogCQkJfQpAQCAtMzU5OCw3ICszNjA0LDcgQEAKIAkJd3N0YXRzLm5vaXNlID0gYWktPndzdGF0cy5xdWFsLm5vaXNlOwogCQl3c3RhdHMudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9VUERBVEVECiAJCQl8IElXX1FVQUxfTEVWRUxfVVBEQVRFRAotCQkJfCBJV19RVUFMX05PSVNFX1VQREFURUQ7CisJCQl8IElXX1FVQUxfREJNOwogCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KIAkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShhaS0+ZGV2LCBzYSwgJndzdGF0cyk7CiAJfQpAQCAtNTUxNCw3ICs1NTIwLDcgQEAKIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKIAlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBhaS0+cG93ZXIpLCAwKTsKIAotCWlmIChhaS0+cG93ZXIgPiAxKSB7CisJaWYgKGFpLT5wb3dlci5ldmVudCA+IDEpIHsKIAkJcmVzZXRfY2FyZChkZXYsIDApOwogCQltcGlfaW5pdF9kZXNjcmlwdG9ycyhhaSk7CiAJCXNldHVwX2NhcmQoYWksIGRldi0+ZGV2X2FkZHIsIDApOwpAQCAtNjQ4MywyMiArNjQ4OSwyMCBAQAogCQlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsJLyogJSAqLwogCWVsc2UKIAkJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSBhaXJvX2dldF9tYXhfcXVhbGl0eSgmY2FwX3JpZCk7Ci0JcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsJLyogMCBtZWFucyB3ZSB1c2UgZEJtICAqLwotCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7Ci0JcmFuZ2UtPm1heF9xdWFsLnVwZGF0ZWQgPSAwOworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDB4MTAwIC0gMTIwOwkvKiAtMTIwIGRCbSAqLworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDB4MTAwIC0gMTIwOwkvKiAtMTIwIGRCbSAqLwogCiAJLyogRXhwZXJpbWVudGFsIG1lYXN1cmVtZW50cyAtIGJvdW5kYXJ5IDExLzUuNSBNYi9zICovCiAJLyogTm90ZSA6IHdpdGggb3Igd2l0aG91dCB0aGUgKGxvY2FsLT5yc3NpKSwgcmVzdWx0cwogCSAqIGFyZSBzb21ld2hhdCBkaWZmZXJlbnQuIC0gSmVhbiBJSSAqLwogCWlmIChsb2NhbC0+cnNzaSkgewotCQlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDUwOwkvKiAlICovCi0JCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDE4NjsJLyogLTcwIGRCbSAqLworCQlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDUwOwkJLyogJSAqLworCQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAweDEwMCAtIDcwOwkvKiAtNzAgZEJtICovCiAJfSBlbHNlIHsKIAkJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSBhaXJvX2dldF9hdmdfcXVhbGl0eSgmY2FwX3JpZCk7Ci0JCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDE3NjsJLyogLTgwIGRCbSAqLworCQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAweDEwMCAtIDgwOwkvKiAtODAgZEJtICovCiAJfQotCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7Ci0JcmFuZ2UtPmF2Z19xdWFsLnVwZGF0ZWQgPSAwOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDB4MTAwIC0gODU7CQkvKiAtODUgZEJtICovCiAKIAlmb3IoaSA9IDAgOyBpIDwgOCA7IGkrKykgewogCQlyYW5nZS0+Yml0cmF0ZVtpXSA9IGNhcF9yaWQuc3VwcG9ydGVkUmF0ZXNbaV0gKiA1MDAwMDA7CkBAIC02NzIxLDE1ICs2NzI1LDE3IEBACiAJCWlmIChsb2NhbC0+cnNzaSkgewogCQkJcXVhbFtpXS5sZXZlbCA9IDB4MTAwIC0gQlNTTGlzdC5kQm07CiAJCQlxdWFsW2ldLnF1YWwgPSBhaXJvX2RibV90b19wY3QoIGxvY2FsLT5yc3NpLCBCU1NMaXN0LmRCbSApOwotCQkJcXVhbFtpXS51cGRhdGVkID0gSVdfUVVBTF9RVUFMX1VQREFURUQ7CisJCQlxdWFsW2ldLnVwZGF0ZWQgPSBJV19RVUFMX1FVQUxfVVBEQVRFRAorCQkJCQl8IElXX1FVQUxfTEVWRUxfVVBEQVRFRAorCQkJCQl8IElXX1FVQUxfREJNOwogCQl9IGVsc2UgewogCQkJcXVhbFtpXS5sZXZlbCA9IChCU1NMaXN0LmRCbSArIDMyMSkgLyAyOwogCQkJcXVhbFtpXS5xdWFsID0gMDsKLQkJCXF1YWxbaV0udXBkYXRlZCA9IElXX1FVQUxfUVVBTF9JTlZBTElEOworCQkJcXVhbFtpXS51cGRhdGVkID0gSVdfUVVBTF9RVUFMX0lOVkFMSUQKKwkJCQkJfCBJV19RVUFMX0xFVkVMX1VQREFURUQKKwkJCQkJfCBJV19RVUFMX0RCTTsKIAkJfQogCQlxdWFsW2ldLm5vaXNlID0gbG9jYWwtPndzdGF0cy5xdWFsLm5vaXNlOwotCQlxdWFsW2ldLnVwZGF0ZWQgPSBJV19RVUFMX0xFVkVMX1VQREFURUQKLQkJCQl8IElXX1FVQUxfTk9JU0VfVVBEQVRFRDsKIAkJaWYgKEJTU0xpc3QuaW5kZXggPT0gMHhmZmZmKQogCQkJYnJlYWs7CiAJfQpAQCAtNjg1NSwxNSArNjg2MSwxNyBAQAogCWlmIChhaS0+cnNzaSkgewogCQlpd2UudS5xdWFsLmxldmVsID0gMHgxMDAgLSBic3MtPmRCbTsKIAkJaXdlLnUucXVhbC5xdWFsID0gYWlyb19kYm1fdG9fcGN0KCBhaS0+cnNzaSwgYnNzLT5kQm0gKTsKLQkJaXdlLnUucXVhbC51cGRhdGVkID0gSVdfUVVBTF9RVUFMX1VQREFURUQ7CisJCWl3ZS51LnF1YWwudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9VUERBVEVECisJCQkJfCBJV19RVUFMX0xFVkVMX1VQREFURUQKKwkJCQl8IElXX1FVQUxfREJNOwogCX0gZWxzZSB7CiAJCWl3ZS51LnF1YWwubGV2ZWwgPSAoYnNzLT5kQm0gKyAzMjEpIC8gMjsKIAkJaXdlLnUucXVhbC5xdWFsID0gMDsKLQkJaXdlLnUucXVhbC51cGRhdGVkID0gSVdfUVVBTF9RVUFMX0lOVkFMSUQ7CisJCWl3ZS51LnF1YWwudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9JTlZBTElECisJCQkJfCBJV19RVUFMX0xFVkVMX1VQREFURUQKKwkJCQl8IElXX1FVQUxfREJNOwogCX0KIAlpd2UudS5xdWFsLm5vaXNlID0gYWktPndzdGF0cy5xdWFsLm5vaXNlOwotCWl3ZS51LnF1YWwudXBkYXRlZCA9IElXX1FVQUxfTEVWRUxfVVBEQVRFRAotCQkJfCBJV19RVUFMX05PSVNFX1VQREFURUQ7CiAJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKIAogCS8qIEFkZCBlbmNyeXB0aW9uIGNhcGFiaWxpdHkgKi8KQEAgLTcxMTYsNyArNzEyNCw3IEBACiAJaW50IHJjID0gMDsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2OwogCi0JaWYgKGFpLT5wb3dlcikKKwlpZiAoYWktPnBvd2VyLmV2ZW50KQogCQlyZXR1cm4gMDsKIAogCXN3aXRjaCAoY21kKSB7CkBAIC03MTk1LDcgKzcyMDMsNyBAQAogCiAJLyogR2V0IHN0YXRzIG91dCBvZiB0aGUgY2FyZCAqLwogCWNsZWFyX2JpdChKT0JfV1NUQVRTLCAmbG9jYWwtPmZsYWdzKTsKLQlpZiAobG9jYWwtPnBvd2VyKSB7CisJaWYgKGxvY2FsLT5wb3dlci5ldmVudCkgewogCQl1cCgmbG9jYWwtPnNlbSk7CiAJCXJldHVybjsKIAl9CkBAIC03MjE2LDEzICs3MjI0LDEyIEBACiAJCWxvY2FsLT53c3RhdHMucXVhbC5sZXZlbCA9IChzdGF0dXNfcmlkLm5vcm1hbGl6ZWRTaWduYWxTdHJlbmd0aCArIDMyMSkgLyAyOwogCQlsb2NhbC0+d3N0YXRzLnF1YWwucXVhbCA9IGFpcm9fZ2V0X3F1YWxpdHkoJnN0YXR1c19yaWQsICZjYXBfcmlkKTsKIAl9Ci0JbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX1FVQUxfVVBEQVRFRCB8IElXX1FVQUxfTEVWRUxfVVBEQVRFRDsKIAlpZiAoc3RhdHVzX3JpZC5sZW4gPj0gMTI0KSB7CiAJCWxvY2FsLT53c3RhdHMucXVhbC5ub2lzZSA9IDB4MTAwIC0gc3RhdHVzX3JpZC5ub2lzZWRCbTsKLQkJbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9OT0lTRV9VUERBVEVEOworCQlsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IElXX1FVQUxfQUxMX1VQREFURUQgfCBJV19RVUFMX0RCTTsKIAl9IGVsc2UgewogCQlsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSAwOwotCQlsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7CisJCWxvY2FsLT53c3RhdHMucXVhbC51cGRhdGVkID0gSVdfUVVBTF9RVUFMX1VQREFURUQgfCBJV19RVUFMX0xFVkVMX1VQREFURUQgfCBJV19RVUFMX05PSVNFX0lOVkFMSUQgfCBJV19RVUFMX0RCTTsKIAl9CiAKIAkvKiBQYWNrZXRzIGRpc2NhcmRlZCBpbiB0aGUgd2lyZWxlc3MgYWRhcHRlciBkdWUgdG8gd2lyZWxlc3MKQEAgLTcyMzUsNyArNzI0Miw3IEBACiAJbG9jYWwtPndzdGF0cy5taXNzLmJlYWNvbiA9IHZhbHNbMzRdOwogfQogCi1zdHJ1Y3QgaXdfc3RhdGlzdGljcyAqYWlyb19nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqYWlyb19nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9ICBkZXYtPnByaXY7CiAKQEAgLTc0NTAsMTQgKzc0NTcsOCBAQAogICogRmxhc2ggY29tbWFuZCBzd2l0Y2ggdGFibGUKICAqLwogCi1pbnQgZmxhc2hjYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGFpcm9uZXRfaW9jdGwgKmNvbXApIHsKK3N0YXRpYyBpbnQgZmxhc2hjYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGFpcm9uZXRfaW9jdGwgKmNvbXApIHsKIAlpbnQgejsKLQlpbnQgY21kcmVzZXQoc3RydWN0IGFpcm9faW5mbyAqKTsKLQlpbnQgc2V0Zmxhc2htb2RlKHN0cnVjdCBhaXJvX2luZm8gKik7Ci0JaW50IGZsYXNoZ2NoYXIoc3RydWN0IGFpcm9faW5mbyAqLGludCxpbnQpOwotCWludCBmbGFzaHBjaGFyKHN0cnVjdCBhaXJvX2luZm8gKixpbnQsaW50KTsKLQlpbnQgZmxhc2hwdXRidWYoc3RydWN0IGFpcm9faW5mbyAqKTsKLQlpbnQgZmxhc2hyZXN0YXJ0KHN0cnVjdCBhaXJvX2luZm8gKixzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIAogCS8qIE9ubHkgc3VwZXItdXNlciBjYW4gbW9kaWZ5IGZsYXNoICovCiAJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQpAQCAtNzUxNSw3ICs3NTE2LDcgQEAKICAqIGNhcmQuCiAgKi8KIAotaW50IGNtZHJlc2V0KHN0cnVjdCBhaXJvX2luZm8gKmFpKSB7CitzdGF0aWMgaW50IGNtZHJlc2V0KHN0cnVjdCBhaXJvX2luZm8gKmFpKSB7CiAJZGlzYWJsZV9NQUMoYWksIDEpOwogCiAJaWYoIXdhaXRidXN5IChhaSkpewpAQCAtNzUzOSw3ICs3NTQwLDcgQEAKICAqIG1vZGUKICAqLwogCi1pbnQgc2V0Zmxhc2htb2RlIChzdHJ1Y3QgYWlyb19pbmZvICphaSkgeworc3RhdGljIGludCBzZXRmbGFzaG1vZGUgKHN0cnVjdCBhaXJvX2luZm8gKmFpKSB7CiAJc2V0X2JpdCAoRkxBR19GTEFTSElORywgJmFpLT5mbGFncyk7CiAKIAlPVVQ0NTAwKGFpLCBTV1MwLCBGTEFTSF9DT01NQU5EKTsKQEAgLTc1NjYsNyArNzU2Nyw3IEBACiAgKiB4IDUwdXMgZm9yICBlY2hvIC4KICAqLwogCi1pbnQgZmxhc2hwY2hhcihzdHJ1Y3QgYWlyb19pbmZvICphaSxpbnQgYnl0ZSxpbnQgZHdlbGx0aW1lKSB7CitzdGF0aWMgaW50IGZsYXNocGNoYXIoc3RydWN0IGFpcm9faW5mbyAqYWksaW50IGJ5dGUsaW50IGR3ZWxsdGltZSkgewogCWludCBlY2hvOwogCWludCB3YWl0dGltZTsKIApAQCAtNzYwNiw3ICs3NjA3LDcgQEAKICAqIEdldCBhIGNoYXJhY3RlciBmcm9tIHRoZSBjYXJkIG1hdGNoaW5nIG1hdGNoYnl0ZQogICogU3RlcCAzKQogICovCi1pbnQgZmxhc2hnY2hhcihzdHJ1Y3QgYWlyb19pbmZvICphaSxpbnQgbWF0Y2hieXRlLGludCBkd2VsbHRpbWUpeworc3RhdGljIGludCBmbGFzaGdjaGFyKHN0cnVjdCBhaXJvX2luZm8gKmFpLGludCBtYXRjaGJ5dGUsaW50IGR3ZWxsdGltZSl7CiAJaW50ICAgICAgICAgICByY2hhcjsKIAl1bnNpZ25lZCBjaGFyIHJieXRlPTA7CiAKQEAgLTc2MzcsNyArNzYzOCw3IEBACiAgKiBzZW5kIHRvIHRoZSBjYXJkCiAgKi8KIAotaW50IGZsYXNocHV0YnVmKHN0cnVjdCBhaXJvX2luZm8gKmFpKXsKK3N0YXRpYyBpbnQgZmxhc2hwdXRidWYoc3RydWN0IGFpcm9faW5mbyAqYWkpewogCWludCAgICAgICAgICAgIG53b3JkczsKIAogCS8qIFdyaXRlIHN0dWZmICovCkBAIC03NjU5LDcgKzc2NjAsNyBAQAogLyoKICAqCiAgKi8KLWludCBmbGFzaHJlc3RhcnQoc3RydWN0IGFpcm9faW5mbyAqYWksc3RydWN0IG5ldF9kZXZpY2UgKmRldil7CitzdGF0aWMgaW50IGZsYXNocmVzdGFydChzdHJ1Y3QgYWlyb19pbmZvICphaSxzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KXsKIAlpbnQgICAgaSxzdGF0dXM7CiAKIAlzc2xlZXAoMSk7CQkJLyogQWRkZWQgMTIvNy8wMCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKaW5kZXggMThhN2QzOC4uNTg3ODY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCkBAIC02OCw3ICs2OCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgImllZWU4MDJfMTEuaCIKKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CiAjaW5jbHVkZSAiYXRtZWwuaCIKIAogI2RlZmluZSBEUklWRVJfTUFKT1IgMApAQCAtNjE4LDEyICs2MTgsMTIgQEAKIHN0YXRpYyB2b2lkIGF0bWVsX3dtZW0zMihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IHBvcywgdTMyIGRhdGEpOwogc3RhdGljIHZvaWQgYXRtZWxfY29tbWFuZF9pcnEoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpOwogc3RhdGljIGludCBhdG1lbF92YWxpZGF0ZV9jaGFubmVsKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgY2hhbm5lbCk7Ci1zdGF0aWMgdm9pZCBhdG1lbF9tYW5hZ2VtZW50X2ZyYW1lKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlciwgCitzdGF0aWMgdm9pZCBhdG1lbF9tYW5hZ2VtZW50X2ZyYW1lKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyLCAKIAkJCQkgICB1MTYgZnJhbWVfbGVuLCB1OCByc3NpKTsKIHN0YXRpYyB2b2lkIGF0bWVsX21hbmFnZW1lbnRfdGltZXIodV9sb25nIGEpOwogc3RhdGljIHZvaWQgYXRtZWxfc2VuZF9jb21tYW5kKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgY29tbWFuZCwgdm9pZCAqY21kLCBpbnQgY21kX3NpemUpOwogc3RhdGljIGludCBhdG1lbF9zZW5kX2NvbW1hbmRfd2FpdChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGNvbW1hbmQsIHZvaWQgKmNtZCwgaW50IGNtZF9zaXplKTsKLXN0YXRpYyB2b2lkIGF0bWVsX3RyYW5zbWl0X21hbmFnZW1lbnRfZnJhbWUoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyLAorc3RhdGljIHZvaWQgYXRtZWxfdHJhbnNtaXRfbWFuYWdlbWVudF9mcmFtZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlciwKIAkJCQkJICAgIHU4ICpib2R5LCBpbnQgYm9keV9sZW4pOwogCiBzdGF0aWMgdTggYXRtZWxfZ2V0X21pYjgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4KTsKQEAgLTgyNyw3ICs4MjcsNyBAQAogc3RhdGljIGludCBzdGFydF90eCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGllZWU4MDJfMTFfaGRyIGhlYWRlcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciBoZWFkZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MTYgYnVmZiwgZnJhbWVfY3RsLCBsZW4gPSAoRVRIX1pMRU4gPCBza2ItPmxlbikgPyBza2ItPmxlbiA6IEVUSF9aTEVOOwogCXU4IFNOQVBfUkZDMTAyNFs2XSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKQEAgLTg2MywxNyArODYzLDE3IEBACiAJCXJldHVybiAxOwogCX0KIAkKLQlmcmFtZV9jdGwgPSBJRUVFODAyXzExX0ZUWVBFX0RBVEE7CisJZnJhbWVfY3RsID0gSUVFRTgwMjExX0ZUWVBFX0RBVEE7CiAJaGVhZGVyLmR1cmF0aW9uX2lkID0gMDsKIAloZWFkZXIuc2VxX2N0bCA9IDA7CiAJaWYgKHByaXYtPndlcF9pc19vbikKLQkJZnJhbWVfY3RsIHw9IElFRUU4MDJfMTFfRkNUTF9XRVA7CisJCWZyYW1lX2N0bCB8PSBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQ7CiAJaWYgKHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfQURIT0MpIHsKIAkJbWVtY3B5KCZoZWFkZXIuYWRkcjEsIHNrYi0+ZGF0YSwgNik7CiAJCW1lbWNweSgmaGVhZGVyLmFkZHIyLCBkZXYtPmRldl9hZGRyLCA2KTsKIAkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsIHByaXYtPkJTU0lELCA2KTsKIAl9IGVsc2UgewotCQlmcmFtZV9jdGwgfD0gSUVFRTgwMl8xMV9GQ1RMX1RPRFM7CisJCWZyYW1lX2N0bCB8PSBJRUVFODAyMTFfRkNUTF9UT0RTOwogCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKIAkJbWVtY3B5KCZoZWFkZXIuYWRkcjIsIGRldi0+ZGV2X2FkZHIsIDYpOwogCQltZW1jcHkoJmhlYWRlci5hZGRyMywgc2tiLT5kYXRhLCA2KTsKQEAgLTkwMiw3ICs5MDIsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBhdG1lbF90cmFuc21pdF9tYW5hZ2VtZW50X2ZyYW1lKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCAKLQkJCQkJICAgIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyLAorCQkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlciwKIAkJCQkJICAgIHU4ICpib2R5LCBpbnQgYm9keV9sZW4pCiB7CiAJdTE2IGJ1ZmY7CkBAIC05MTcsNyArOTE3LDcgQEAKIAl0eF91cGRhdGVfZGVzY3JpcHRvcihwcml2LCBoZWFkZXItPmFkZHIxWzBdICYgMHgwMSwgbGVuLCBidWZmLCBUWF9QQUNLRVRfVFlQRV9NR01UKTsKIH0KIAkKLXN0YXRpYyB2b2lkIGZhc3RfcnhfcGF0aChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIsIAorc3RhdGljIHZvaWQgZmFzdF9yeF9wYXRoKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyLCAKIAkJCSB1MTYgbXNkdV9zaXplLCB1MTYgcnhfcGFja2V0X2xvYywgdTMyIGNyYykKIHsKIAkvKiBmYXN0IHBhdGg6IHVuZnJhZ21lbnRlZCBwYWNrZXQgY29weSBkaXJlY3RseSBpbnRvIHNrYnVmICovCkBAIC05NTUsNyArOTU1LDcgQEAKIAl9CiAJCiAJbWVtY3B5KHNrYnAsIGhlYWRlci0+YWRkcjEsIDYpOyAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCi0JaWYgKGxlMTZfdG9fY3B1KGhlYWRlci0+ZnJhbWVfY3RsKSAmIElFRUU4MDJfMTFfRkNUTF9GUk9NRFMpIAorCWlmIChsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCkgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpIAogCQltZW1jcHkoJnNrYnBbNl0sIGhlYWRlci0+YWRkcjMsIDYpOwogCWVsc2UKIAkJbWVtY3B5KCZza2JwWzZdLCBoZWFkZXItPmFkZHIyLCA2KTsgLyogc291cmNlIGFkZHJlc3MgKi8KQEAgLTk5MCwxNCArOTkwLDE0IEBACiAJcmV0dXJuIChjcmMgXiAweGZmZmZmZmZmKSA9PSBuZXRjcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGZyYWdfcnhfcGF0aChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIsIAorc3RhdGljIHZvaWQgZnJhZ19yeF9wYXRoKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyLCAKIAkJCSB1MTYgbXNkdV9zaXplLCB1MTYgcnhfcGFja2V0X2xvYywgdTMyIGNyYywgdTE2IHNlcV9ubywgdTggZnJhZ19ubywgaW50IG1vcmVfZnJhZ3MpCiB7CiAJdTggbWFjNFs2XTsgCiAJdTggc291cmNlWzZdOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQlpZiAobGUxNl90b19jcHUoaGVhZGVyLT5mcmFtZV9jdGwpICYgSUVFRTgwMl8xMV9GQ1RMX0ZST01EUykgCisJaWYgKGxlMTZfdG9fY3B1KGhlYWRlci0+ZnJhbWVfY3RsKSAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykgCiAJCW1lbWNweShzb3VyY2UsIGhlYWRlci0+YWRkcjMsIDYpOwogCWVsc2UKIAkJbWVtY3B5KHNvdXJjZSwgaGVhZGVyLT5hZGRyMiwgNik7IApAQCAtMTA4Miw3ICsxMDgyLDcgQEAKIHN0YXRpYyB2b2lkIHJ4X2RvbmVfaXJxKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQogewogCWludCBpOwotCXN0cnVjdCBpZWVlODAyXzExX2hkciBoZWFkZXI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgaGVhZGVyOwogCQogCWZvciAoaSA9IDA7IAogCSAgICAgYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfcngocHJpdiwgUlhfREVTQ19GTEFHU19PRkZTRVQsIHByaXYtPnJ4X2Rlc2NfaGVhZCkpID09IFJYX0RFU0NfRkxBR19WQUxJRCAmJgpAQCAtMTExNyw3ICsxMTE3LDcgQEAKIAkJLyogcHJvYmUgZm9yIENSQyB1c2UgaGVyZSBpZiBuZWVkZWQgIG9uY2UgZml2ZSBwYWNrZXRzIGhhdmUgYXJyaXZlZCB3aXRoCiAJCSAgIHRoZSBzYW1lIGNyYyBzdGF0dXMsIHdlIGFzc3VtZSB3ZSBrbm93IHdoYXQncyBoYXBwZW5pbmcgYW5kIHN0b3AgcHJvYmluZyAqLwogCQlpZiAocHJpdi0+cHJvYmVfY3JjKSB7Ci0JCQlpZiAoIXByaXYtPndlcF9pc19vbiB8fCAhKGZyYW1lX2N0bCAmIElFRUU4MDJfMTFfRkNUTF9XRVApKSB7CisJCQlpZiAoIXByaXYtPndlcF9pc19vbiB8fCAhKGZyYW1lX2N0bCAmIElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCkpIHsKIAkJCQlwcml2LT5kb19yeF9jcmMgPSBwcm9iZV9jcmMocHJpdiwgcnhfcGFja2V0X2xvYywgbXNkdV9zaXplKTsKIAkJCX0gZWxzZSB7CiAJCQkJcHJpdi0+ZG9fcnhfY3JjID0gcHJvYmVfY3JjKHByaXYsIHJ4X3BhY2tldF9sb2MgKyAyNCwgbXNkdV9zaXplIC0gMjQpOwpAQCAtMTEzMiwxNiArMTEzMiwxNiBAQAogCQl9CiAJCSAgICAKIAkJLyogZG9uJ3QgQ1JDIGhlYWRlciB3aGVuIFdFUCBpbiB1c2UgKi8KLQkJaWYgKHByaXYtPmRvX3J4X2NyYyAmJiAoIXByaXYtPndlcF9pc19vbiB8fCAhKGZyYW1lX2N0bCAmIElFRUU4MDJfMTFfRkNUTF9XRVApKSkgeworCQlpZiAocHJpdi0+ZG9fcnhfY3JjICYmICghcHJpdi0+d2VwX2lzX29uIHx8ICEoZnJhbWVfY3RsICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSkpIHsKIAkJCWNyYyA9IGNyYzMyX2xlKDB4ZmZmZmZmZmYsICh1bnNpZ25lZCBjaGFyICopJmhlYWRlciwgMjQpOwogCQl9CiAJCW1zZHVfc2l6ZSAtPSAyNDsgLyogaGVhZGVyICovCiAKLQkJaWYgKChmcmFtZV9jdGwgJiBJRUVFODAyXzExX0ZDVExfRlRZUEUpID09IElFRUU4MDJfMTFfRlRZUEVfREFUQSkgeyAKKwkJaWYgKChmcmFtZV9jdGwgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpIHsgCiAJCQkKLQkJCWludCBtb3JlX2ZyYWdtZW50cyA9IGZyYW1lX2N0bCAmIElFRUU4MDJfMTFfRkNUTF9NT1JFRlJBR1M7Ci0JCQl1OCBwYWNrZXRfZnJhZ21lbnRfbm8gPSBzZXFfY29udHJvbCAmIElFRUU4MDJfMTFfU0NUTF9GUkFHOwotCQkJdTE2IHBhY2tldF9zZXF1ZW5jZV9ubyA9IChzZXFfY29udHJvbCAmIElFRUU4MDJfMTFfU0NUTF9TRVEpID4+IDQ7CisJCQlpbnQgbW9yZV9mcmFnbWVudHMgPSBmcmFtZV9jdGwgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1M7CisJCQl1OCBwYWNrZXRfZnJhZ21lbnRfbm8gPSBzZXFfY29udHJvbCAmIElFRUU4MDIxMV9TQ1RMX0ZSQUc7CisJCQl1MTYgcGFja2V0X3NlcXVlbmNlX25vID0gKHNlcV9jb250cm9sICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0OwogCQkJCiAJCQlpZiAoIW1vcmVfZnJhZ21lbnRzICYmIHBhY2tldF9mcmFnbWVudF9ubyA9PSAwICkgewogCQkJCWZhc3RfcnhfcGF0aChwcml2LCAmaGVhZGVyLCBtc2R1X3NpemUsIHJ4X3BhY2tldF9sb2MsIGNyYyk7CkBAIC0xMTUxLDcgKzExNTEsNyBAQAogCQkJfQogCQl9CiAJCQotCQlpZiAoKGZyYW1lX2N0bCAmIElFRUU4MDJfMTFfRkNUTF9GVFlQRSkgPT0gSUVFRTgwMl8xMV9GVFlQRV9NR01UKSB7CisJCWlmICgoZnJhbWVfY3RsICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpID09IElFRUU4MDIxMV9GVFlQRV9NR01UKSB7CiAJCQkvKiBjb3B5IHJlc3Qgb2YgcGFja2V0IGludG8gYnVmZmVyICovCiAJCQlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAodW5zaWduZWQgY2hhciAqKSZwcml2LT5yeF9idWYsIHJ4X3BhY2tldF9sb2MgKyAyNCwgbXNkdV9zaXplKTsKIAkJCQpAQCAtMTU5Myw3ICsxNTkzLDYgQEAKIAlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGF0bWVsX3NldF9tYWNfYWRkcmVzczsKIAlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHN0YXJ0X3R4OwogCWRldi0+Z2V0X3N0YXRzID0gYXRtZWxfZ2V0X3N0YXRzOwotCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gYXRtZWxfZ2V0X3dpcmVsZXNzX3N0YXRzOwogCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJmF0bWVsX2hhbmRsZXJfZGVmOwogCWRldi0+ZG9faW9jdGwgPSBhdG1lbF9pb2N0bDsKIAlkZXYtPmlycSA9IGlycTsKQEAgLTI0MTEsNyArMjQxMCw4IEBACiAJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YoYXRtZWxfcHJpdmF0ZV9hcmdzKS9zaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksIAogCS5zdGFuZGFyZAk9IChpd19oYW5kbGVyICopIGF0bWVsX2hhbmRsZXIsCiAJLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBhdG1lbF9wcml2YXRlX2hhbmRsZXIsIAotCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBhdG1lbF9wcml2YXRlX2FyZ3MKKwkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgYXRtZWxfcHJpdmF0ZV9hcmdzLAorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBhdG1lbF9nZXRfd2lyZWxlc3Nfc3RhdHMKIH07CiAKIHN0YXRpYyBpbnQgYXRtZWxfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKQEAgLTI0MjQsMTkgKzI0MjQsNiBAQAogCWNoYXIgZG9tYWluW1JFR0RPTUFJTlNaKzFdOwogCiAJc3dpdGNoIChjbWQpIHsKLQljYXNlIFNJT0NHSVdQUklWOgotCQlpZih3cnEtPnUuZGF0YS5wb2ludGVyKSB7Ci0JCQkvKiBTZXQgdGhlIG51bWJlciBvZiBpb2N0bCBhdmFpbGFibGUgKi8KLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihhdG1lbF9wcml2YXRlX2FyZ3MpIC8gc2l6ZW9mKGF0bWVsX3ByaXZhdGVfYXJnc1swXSk7Ci0JCQkKLQkJCS8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLwotCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAotCQkJCQkgKHVfY2hhciAqKSBhdG1lbF9wcml2YXRlX2FyZ3MsCi0JCQkJCSBzaXplb2YoYXRtZWxfcHJpdmF0ZV9hcmdzKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCiAJY2FzZSBBVE1FTElESUZDOgogCQl3cnEtPnUucGFyYW0udmFsdWUgPSBBVE1FTE1BR0lDOwkJCiAJCWJyZWFrOwpAQCAtMjY2MywxMCArMjY1MCwxMCBAQAogIAogc3RhdGljIHZvaWQgc2VuZF9hdXRoZW50aWNhdGlvbl9yZXF1ZXN0KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCAqY2hhbGxlbmdlLCBpbnQgY2hhbGxlbmdlX2xlbikKIHsKLQlzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgaGVhZGVyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyIGhlYWRlcjsKIAlzdHJ1Y3QgYXV0aF9ib2R5IGF1dGg7CiAJCi0JaGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDJfMTFfRlRZUEVfTUdNVCB8IElFRUU4MDJfMTFfU1RZUEVfQVVUSCk7IAorCWhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9BVVRIKTsgCiAJaGVhZGVyLmR1cmF0aW9uX2lkCT0gY3B1X3RvX2xlMTYoMHg4MDAwKTsJCiAJaGVhZGVyLnNlcV9jdGwgPSAwOwogCW1lbWNweShoZWFkZXIuYWRkcjEsIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7CkBAIC0yNjc3LDcgKzI2NjQsNyBAQAogCQlhdXRoLmFsZyA9IGNwdV90b19sZTE2KEM4MDIxMV9NR01UX0FBTl9TSEFSRURLRVkpOyAKIAkJLyogbm8gV0VQIGZvciBhdXRoZW50aWNhdGlvbiBmcmFtZXMgd2l0aCBUclNlcU5vIDEgKi8KIAkJaWYgKHByaXYtPkN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0gIT0gMSkKLQkJCWhlYWRlci5mcmFtZV9jdGwgfD0gIGNwdV90b19sZTE2KElFRUU4MDJfMTFfRkNUTF9XRVApOyAKKwkJCWhlYWRlci5mcmFtZV9jdGwgfD0gIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCk7CiAJfSBlbHNlIHsKIAkJYXV0aC5hbGcgPSBjcHVfdG9fbGUxNihDODAyMTFfTUdNVF9BQU5fT1BFTlNZU1RFTSk7CiAJfQpAQCAtMjcwMSw3ICsyNjg4LDcgQEAKIHsKIAl1OCAqc3NpZF9lbF9wOwogCWludCBib2R5c2l6ZTsKLQlzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgaGVhZGVyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyIGhlYWRlcjsKIAlzdHJ1Y3QgYXNzX3JlcV9mb3JtYXQgewogCQl1MTYgY2FwYWJpbGl0eTsKIAkJdTE2IGxpc3Rlbl9pbnRlcnZhbDsgCkBAIC0yNzE0LDggKzI3MDEsOCBAQAogCQl1OCByYXRlc1s0XTsKIAl9IGJvZHk7CiAJCQotCWhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyXzExX0ZUWVBFX01HTVQgfCAKLQkJKGlzX3JlYXNzb2MgPyBJRUVFODAyXzExX1NUWVBFX1JFQVNTT0NfUkVRIDogSUVFRTgwMl8xMV9TVFlQRV9BU1NPQ19SRVEpKTsKKwloZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfCAKKwkJKGlzX3JlYXNzb2MgPyBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEgOiBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRKSk7CiAJaGVhZGVyLmR1cmF0aW9uX2lkID0gY3B1X3RvX2xlMTYoMHg4MDAwKTsKIAloZWFkZXIuc2VxX2N0bCA9IDA7CiAKQEAgLTI3NTEsOSArMjczOCw5IEBACiAJYXRtZWxfdHJhbnNtaXRfbWFuYWdlbWVudF9mcmFtZShwcml2LCAmaGVhZGVyLCAodm9pZCAqKSZib2R5LCBib2R5c2l6ZSk7CiB9CiAKLXN0YXRpYyBpbnQgaXNfZnJhbWVfZnJvbV9jdXJyZW50X2JzcyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIpCitzdGF0aWMgaW50IGlzX2ZyYW1lX2Zyb21fY3VycmVudF9ic3Moc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCiB7Ci0JaWYgKGxlMTZfdG9fY3B1KGhlYWRlci0+ZnJhbWVfY3RsKSAmIElFRUU4MDJfMTFfRkNUTF9GUk9NRFMpCisJaWYgKGxlMTZfdG9fY3B1KGhlYWRlci0+ZnJhbWVfY3RsKSAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykKIAkJcmV0dXJuIG1lbWNtcChoZWFkZXItPmFkZHIzLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpID09IDA7CiAJZWxzZQogCQlyZXR1cm4gbWVtY21wKGhlYWRlci0+YWRkcjIsIHByaXYtPkN1cnJlbnRCU1NJRCwgNikgPT0gMDsKQEAgLTI4MDEsNyArMjc4OCw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgc3RvcmVfYnNzX2luZm8oc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyLAorc3RhdGljIHZvaWQgc3RvcmVfYnNzX2luZm8oc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIsCiAJCQkgICB1MTYgY2FwYWJpbGl0eSwgdTE2IGJlYWNvbl9wZXJpb2QsIHU4IGNoYW5uZWwsIHU4IHJzc2ksIAogCQkJICAgdTggc3NpZF9sZW4sIHU4ICpzc2lkLCBpbnQgaXNfYmVhY29uKQogewpAQCAtMzA4NSwxMiArMzA3MiwxMiBAQAogfQogCiAvKiBkZWFscyB3aXRoIGluY29taW5nIG1hbmFnbWVudCBmcmFtZXMuICovCi1zdGF0aWMgdm9pZCBhdG1lbF9tYW5hZ2VtZW50X2ZyYW1lKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlciwgCitzdGF0aWMgdm9pZCBhdG1lbF9tYW5hZ2VtZW50X2ZyYW1lKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyLCAKIAkJICAgICAgdTE2IGZyYW1lX2xlbiwgdTggcnNzaSkKIHsKIAl1MTYgc3VidHlwZTsKIAkKLQlzd2l0Y2ggKHN1YnR5cGUgPSBsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCkgJiBJRUVFODAyXzExX0ZDVExfU1RZUEUpIHsKKwlzd2l0Y2ggKHN1YnR5cGUgPSBsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCkgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkgewogCWNhc2UgQzgwMjExX1NVQlRZUEVfTUdNVF9CRUFDT04gOgogCWNhc2UgQzgwMjExX1NVQlRZUEVfTUdNVF9Qcm9iZVJlc3BvbnNlOgogCQkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmNDFjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9LY29uZmlnCkBAIC0wLDAgKzEsNzMgQEAKK2NvbmZpZyBIT1NUQVAKKwl0cmlzdGF0ZSAiSUVFRSA4MDIuMTEgZm9yIEhvc3QgQVAgKFByaXNtMi8yLjUvMyBhbmQgV0VQL1RLSVAvQ0NNUCkiCisJZGVwZW5kcyBvbiBORVRfUkFESU8KKwlzZWxlY3QgSUVFRTgwMjExCisJc2VsZWN0IElFRUU4MDIxMV9DUllQVF9XRVAKKwktLS1oZWxwLS0tCisJU2hhcmVkIGRyaXZlciBjb2RlIGZvciBJRUVFIDgwMi4xMWIgd2lyZWxlc3MgY2FyZHMgYmFzZWQgb24KKwlJbnRlcnNpbCBQcmlzbTIvMi41LzMgY2hpcHNldC4gVGhpcyBkcml2ZXIgc3VwcG9ydHMgc28gY2FsbGVkCisJSG9zdCBBUCBtb2RlIHRoYXQgYWxsb3dzIHRoZSBjYXJkIHRvIGFjdCBhcyBhbiBJRUVFIDgwMi4xMQorCWFjY2VzcyBwb2ludC4KKworCVNlZSA8aHR0cDovL2hvc3RhcC5lcGl0ZXN0LmZpLz4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisJSG9zdCBBUCBkcml2ZXIgY29uZmlndXJhdGlvbiBhbmQgdG9vbHMuIFRoaXMgc2l0ZSBpbmNsdWRlcworCWluZm9ybWF0aW9uIGFuZCB0b29scyAoaG9zdGFwZCBhbmQgd3BhX3N1cHBsaWNhbnQpIGZvciBXUEEvV1BBMgorCXN1cHBvcnQuCisKKwlUaGlzIG9wdGlvbiBpbmNsdWRlcyB0aGUgYmFzZSBIb3N0IEFQIGRyaXZlciBjb2RlIHRoYXQgaXMgc2hhcmVkIGJ5CisJZGlmZmVyZW50IGhhcmR3YXJlIG1vZGVscy4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIGVuYWJsZSBzdXBwb3J0IGZvcgorCVBMWC9QQ0kvQ1MgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIHRvIGFjdHVhbGx5IHVzZSB0aGUgZHJpdmVyLgorCisJVGhlIGRyaXZlciBjYW4gYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUgYW5kIGl0IHdpbGwgYmUgY2FsbGVkCisJImhvc3RhcC5rbyIuCisKK2NvbmZpZyBIT1NUQVBfRklSTVdBUkUKKwlib29sICJTdXBwb3J0IGRvd25sb2FkaW5nIGZpcm13YXJlIGltYWdlcyB3aXRoIEhvc3QgQVAgZHJpdmVyIgorCWRlcGVuZHMgb24gSE9TVEFQCisJLS0taGVscC0tLQorCUNvbmZpZ3VyZSBIb3N0IEFQIGRyaXZlciB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIGZpcm13YXJlIGltYWdlCisJZG93bmxvYWQuIEN1cnJlbnQgdmVyc2lvbiBzdXBwb3J0cyBvbmx5IGRvd25sb2FkaW5nIHRvIHZvbGF0aWxlLCBpLmUuLAorCVJBTSBtZW1vcnkuIEZsYXNoIHVwZ3JhZGUgaXMgbm90IHlldCBzdXBwb3J0ZWQuCisKKwlGaXJtd2FyZSBpbWFnZSBkb3dubG9hZGluZyBuZWVkcyB1c2VyIHNwYWNlIHRvb2wsIHByaXNtMl9zcmVjLiBJdCBpcworCWF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9ob3N0YXAuZXBpdGVzdC5maS8uCisKK2NvbmZpZyBIT1NUQVBfUExYCisJdHJpc3RhdGUgIkhvc3QgQVAgZHJpdmVyIGZvciBQcmlzbTIvMi41LzMgaW4gUExYOTA1MiBQQ0kgYWRhcHRvcnMiCisJZGVwZW5kcyBvbiBQQ0kgJiYgSE9TVEFQCisJLS0taGVscC0tLQorCUhvc3QgQVAgZHJpdmVyJ3MgdmVyc2lvbiBmb3IgUHJpc20yLzIuNS8zIFBDIENhcmRzIGluIFBMWDkwNTIgYmFzZWQKKwlQQ0kgYWRhcHRvcnMuCisKKwkiSG9zdCBBUCBzdXBwb3J0IGZvciBQcmlzbTIvMi41LzMgSUVFRSA4MDIuMTFiIiBpcyByZXF1aXJlZCBmb3IgdGhpcworCWRyaXZlciBhbmQgaXRzIGhlbHAgdGV4dCBpbmNsdWRlcyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBIb3N0IEFQCisJZHJpdmVyLgorCisJVGhlIGRyaXZlciBjYW4gYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUgYW5kIHdpbGwgYmUgbmFtZWQKKwkiaG9zdGFwX3BseC5rbyIuCisKK2NvbmZpZyBIT1NUQVBfUENJCisJdHJpc3RhdGUgIkhvc3QgQVAgZHJpdmVyIGZvciBQcmlzbTIuNSBQQ0kgYWRhcHRvcnMiCisJZGVwZW5kcyBvbiBQQ0kgJiYgSE9TVEFQCisJLS0taGVscC0tLQorCUhvc3QgQVAgZHJpdmVyJ3MgdmVyc2lvbiBmb3IgUHJpc20yLjUgUENJIGFkYXB0b3JzLgorCisJIkhvc3QgQVAgc3VwcG9ydCBmb3IgUHJpc20yLzIuNS8zIElFRUUgODAyLjExYiIgaXMgcmVxdWlyZWQgZm9yIHRoaXMKKwlkcml2ZXIgYW5kIGl0cyBoZWxwIHRleHQgaW5jbHVkZXMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgSG9zdCBBUAorCWRyaXZlci4KKworCVRoZSBkcml2ZXIgY2FuIGJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlIGFuZCB3aWxsIGJlIG5hbWVkCisJImhvc3RhcF9wY2kua28iLgorCitjb25maWcgSE9TVEFQX0NTCisJdHJpc3RhdGUgIkhvc3QgQVAgZHJpdmVyIGZvciBQcmlzbTIvMi41LzMgUEMgQ2FyZHMiCisJZGVwZW5kcyBvbiBQQ01DSUEhPW4gJiYgSE9TVEFQCisJLS0taGVscC0tLQorCUhvc3QgQVAgZHJpdmVyJ3MgdmVyc2lvbiBmb3IgUHJpc20yLzIuNS8zIFBDIENhcmRzLgorCisJIkhvc3QgQVAgc3VwcG9ydCBmb3IgUHJpc20yLzIuNS8zIElFRUUgODAyLjExYiIgaXMgcmVxdWlyZWQgZm9yIHRoaXMKKwlkcml2ZXIgYW5kIGl0cyBoZWxwIHRleHQgaW5jbHVkZXMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgSG9zdCBBUAorCWRyaXZlci4KKworCVRoZSBkcml2ZXIgY2FuIGJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlIGFuZCB3aWxsIGJlIG5hbWVkCisJImhvc3RhcF9jcy5rbyIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM2MjIzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai0kKENPTkZJR19IT1NUQVApICs9IGhvc3RhcC5vCisKK29iai0kKENPTkZJR19IT1NUQVBfQ1MpICs9IGhvc3RhcF9jcy5vCitvYmotJChDT05GSUdfSE9TVEFQX1BMWCkgKz0gaG9zdGFwX3BseC5vCitvYmotJChDT05GSUdfSE9TVEFQX1BDSSkgKz0gaG9zdGFwX3BjaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmNTgyMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXAuYwpAQCAtMCwwICsxLDExOTggQEAKKy8qCisgKiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcyBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIgZm9yCisgKiBJbnRlcnNpbCBQcmlzbTIvMi41LzMgLSBob3N0YXAubyBtb2R1bGUsIGNvbW1vbiByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICogPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1LCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9jcnlwdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJob3N0YXBfd2xhbi5oIgorI2luY2x1ZGUgImhvc3RhcF84MDIxMS5oIgorI2luY2x1ZGUgImhvc3RhcF9hcC5oIgorI2luY2x1ZGUgImhvc3RhcC5oIgorCitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3QgQVAgY29tbW9uIHJvdXRpbmVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihQUklTTTJfVkVSU0lPTik7CisKKyNkZWZpbmUgVFhfVElNRU9VVCAoMiAqIEhaKQorCisjZGVmaW5lIFBSSVNNMl9NQVhfRlJBTUVfU0laRSAyMzA0CisjZGVmaW5lIFBSSVNNMl9NSU5fTVRVIDI1NgorLyogRklYOiAqLworI2RlZmluZSBQUklTTTJfTUFYX01UVSAoUFJJU00yX01BWF9GUkFNRV9TSVpFIC0gKDYgLyogTExDICovICsgOCAvKiBXRVAgKi8pKQorCisKKy8qIGhvc3RhcC5jICovCitzdGF0aWMgaW50IHByaXNtMl93ZHNfYWRkKGxvY2FsX2luZm9fdCAqbG9jYWwsIHU4ICpyZW1vdGVfYWRkciwKKwkJCSAgaW50IHJ0bmxfbG9ja2VkKTsKK3N0YXRpYyBpbnQgcHJpc20yX3dkc19kZWwobG9jYWxfaW5mb190ICpsb2NhbCwgdTggKnJlbW90ZV9hZGRyLAorCQkJICBpbnQgcnRubF9sb2NrZWQsIGludCBkb19ub3RfcmVtb3ZlKTsKKworLyogaG9zdGFwX2FwLmMgKi8KK3N0YXRpYyBpbnQgcHJpc20yX2FwX2dldF9zdGFfcXVhbChsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3Qgc29ja2FkZHIgYWRkcltdLAorCQkJCSAgc3RydWN0IGl3X3F1YWxpdHkgcXVhbFtdLCBpbnQgYnVmX3NpemUsCisJCQkJICBpbnQgYXBsaXN0KTsKK3N0YXRpYyBpbnQgcHJpc20yX2FwX3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZmZlcik7CitzdGF0aWMgaW50IHByaXNtMl9ob3N0YXBkKHN0cnVjdCBhcF9kYXRhICphcCwKKwkJCSAgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSk7CitzdGF0aWMgdm9pZCAqIGFwX2NyeXB0X2dldF9wdHJzKHN0cnVjdCBhcF9kYXRhICphcCwgdTggKmFkZHIsIGludCBwZXJtYW5lbnQsCisJCQkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqKmNyeXB0KTsKK3N0YXRpYyB2b2lkIGFwX2NvbnRyb2xfa2lja2FsbChzdHJ1Y3QgYXBfZGF0YSAqYXApOworI2lmbmRlZiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UCitzdGF0aWMgaW50IGFwX2NvbnRyb2xfYWRkX21hYyhzdHJ1Y3QgbWFjX3Jlc3RyaWN0aW9ucyAqbWFjX3Jlc3RyaWN0aW9ucywKKwkJCSAgICAgIHU4ICptYWMpOworc3RhdGljIGludCBhcF9jb250cm9sX2RlbF9tYWMoc3RydWN0IG1hY19yZXN0cmljdGlvbnMgKm1hY19yZXN0cmljdGlvbnMsCisJCQkgICAgICB1OCAqbWFjKTsKK3N0YXRpYyB2b2lkIGFwX2NvbnRyb2xfZmx1c2hfbWFjcyhzdHJ1Y3QgbWFjX3Jlc3RyaWN0aW9ucyAqbWFjX3Jlc3RyaWN0aW9ucyk7CitzdGF0aWMgaW50IGFwX2NvbnRyb2xfa2lja19tYWMoc3RydWN0IGFwX2RhdGEgKmFwLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHU4ICptYWMpOworI2VuZGlmIC8qICFQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCisKKworc3RhdGljIGNvbnN0IGxvbmcgZnJlcV9saXN0W10gPSB7IDI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsIDI0MzIsIDI0MzcsIDI0NDIsCisJCQkJICAyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0IH07CisjZGVmaW5lIEZSRVFfQ09VTlQgKHNpemVvZihmcmVxX2xpc3QpIC8gc2l6ZW9mKGZyZXFfbGlzdFswXSkpCisKKworLyogU2VlIElFRUUgODAyLjFIIGZvciBMTEMvU05BUCBlbmNhcHN1bGF0aW9uL2RlY2Fwc3VsYXRpb24gKi8KKy8qIEV0aGVybmV0LUlJIHNuYXAgaGVhZGVyIChSRkMxMDQyIGZvciBtb3N0IEV0aGVyVHlwZXMpICovCitzdGF0aWMgdW5zaWduZWQgY2hhciByZmMxMDQyX2hlYWRlcltdID0KK3sgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworLyogQnJpZGdlLVR1bm5lbCBoZWFkZXIgKGZvciBFdGhlclR5cGVzIEVUSF9QX0FBUlAgYW5kIEVUSF9QX0lQWCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJyaWRnZV90dW5uZWxfaGVhZGVyW10gPQoreyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4IH07CisvKiBObyBlbmNhcHN1bGF0aW9uIGhlYWRlciBpZiBFdGhlclR5cGUgPCAweDYwMCAoPWxlbmd0aCkgKi8KKworCisvKiBGSVg6IHRoZXNlIGNvdWxkIGJlIGNvbXBpbGVkIHNlcGFyYXRlbHkgYW5kIGxpbmtlZCB0b2dldGhlciB0byBob3N0YXAubyAqLworI2luY2x1ZGUgImhvc3RhcF9hcC5jIgorI2luY2x1ZGUgImhvc3RhcF9pbmZvLmMiCisjaW5jbHVkZSAiaG9zdGFwX2lvY3RsLmMiCisjaW5jbHVkZSAiaG9zdGFwX3Byb2MuYyIKKyNpbmNsdWRlICJob3N0YXBfODAyMTFfcnguYyIKKyNpbmNsdWRlICJob3N0YXBfODAyMTFfdHguYyIKKworCitzdHJ1Y3QgbmV0X2RldmljZSAqIGhvc3RhcF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBsb2NhbF9pbmZvICpsb2NhbCwKKwkJCQkJIGludCB0eXBlLCBpbnQgcnRubF9sb2NrZWQsCisJCQkJCSBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsICptZGV2OworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlpbnQgcmV0OworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBob3N0YXBfaW50ZXJmYWNlKSk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZmFjZS0+ZGV2ID0gZGV2OworCWlmYWNlLT5sb2NhbCA9IGxvY2FsOworCWlmYWNlLT50eXBlID0gdHlwZTsKKwlsaXN0X2FkZCgmaWZhY2UtPmxpc3QsICZsb2NhbC0+aG9zdGFwX2ludGVyZmFjZXMpOworCisJbWRldiA9IGxvY2FsLT5kZXY7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIG1kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJZGV2LT5iYXNlX2FkZHIgPSBtZGV2LT5iYXNlX2FkZHI7CisJZGV2LT5pcnEgPSBtZGV2LT5pcnE7CisJZGV2LT5tZW1fc3RhcnQgPSBtZGV2LT5tZW1fc3RhcnQ7CisJZGV2LT5tZW1fZW5kID0gbWRldi0+bWVtX2VuZDsKKworCWhvc3RhcF9zZXR1cF9kZXYoZGV2LCBsb2NhbCwgMCk7CisJZGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgIiVzJXMiLCBwcmVmaXgsIG5hbWUpOworCWlmICghcnRubF9sb2NrZWQpCisJCXJ0bmxfbG9jaygpOworCisJcmV0ID0gMDsKKwlpZiAoc3RyY2hyKGRldi0+bmFtZSwgJyUnKSkKKwkJcmV0ID0gZGV2X2FsbG9jX25hbWUoZGV2LCBkZXYtPm5hbWUpOworCisJU0VUX05FVERFVl9ERVYoZGV2LCBtZGV2LT5jbGFzc19kZXYuZGV2KTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IHJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCisJaWYgKCFydG5sX2xvY2tlZCkKKwkJcnRubF91bmxvY2soKTsKKworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmYWlsZWQgdG8gYWRkIG5ldyBuZXRkZXZpY2UhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZWdpc3RlcmVkIG5ldGRldmljZSAlc1xuIiwKKwkgICAgICAgbWRldi0+bmFtZSwgZGV2LT5uYW1lKTsKKworCXJldHVybiBkZXY7Cit9CisKKwordm9pZCBob3N0YXBfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcnRubF9sb2NrZWQsCisJCQkgICAgIGludCByZW1vdmVfZnJvbV9saXN0KQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKworCWlmICghZGV2KQorCQlyZXR1cm47CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAocmVtb3ZlX2Zyb21fbGlzdCkgeworCQlsaXN0X2RlbCgmaWZhY2UtPmxpc3QpOworCX0KKworCWlmIChkZXYgPT0gaWZhY2UtPmxvY2FsLT5kZGV2KQorCQlpZmFjZS0+bG9jYWwtPmRkZXYgPSBOVUxMOworCWVsc2UgaWYgKGRldiA9PSBpZmFjZS0+bG9jYWwtPmFwZGV2KQorCQlpZmFjZS0+bG9jYWwtPmFwZGV2ID0gTlVMTDsKKwllbHNlIGlmIChkZXYgPT0gaWZhY2UtPmxvY2FsLT5zdGFkZXYpCisJCWlmYWNlLT5sb2NhbC0+c3RhZGV2ID0gTlVMTDsKKworCWlmIChydG5sX2xvY2tlZCkKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwllbHNlCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwkvKiBkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldigpIHdpbGwgZnJlZSB0aGUgZGV2aWNlIGRhdGEsIGluY2x1ZGluZworCSAqIHByaXZhdGUgZGF0YSwgd2hlbiByZW1vdmluZyB0aGUgZGV2aWNlICovCit9CisKKworc3RhdGljIGlubGluZSBpbnQgcHJpc20yX3dkc19zcGVjaWFsX2FkZHIodTggKmFkZHIpCit7CisJaWYgKGFkZHJbMF0gfHwgYWRkclsxXSB8fCBhZGRyWzJdIHx8IGFkZHJbM10gfHwgYWRkcls0XSB8fCBhZGRyWzVdKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX3dkc19hZGQobG9jYWxfaW5mb190ICpsb2NhbCwgdTggKnJlbW90ZV9hZGRyLAorCQkJICBpbnQgcnRubF9sb2NrZWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlLCAqZW1wdHksICptYXRjaDsKKworCWVtcHR5ID0gbWF0Y2ggPSBOVUxMOworCXJlYWRfbG9ja19iaCgmbG9jYWwtPmlmYWNlX2xvY2spOworCWxpc3RfZm9yX2VhY2gocHRyLCAmbG9jYWwtPmhvc3RhcF9pbnRlcmZhY2VzKSB7CisJCWlmYWNlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBob3N0YXBfaW50ZXJmYWNlLCBsaXN0KTsKKwkJaWYgKGlmYWNlLT50eXBlICE9IEhPU1RBUF9JTlRFUkZBQ0VfV0RTKQorCQkJY29udGludWU7CisKKwkJaWYgKHByaXNtMl93ZHNfc3BlY2lhbF9hZGRyKGlmYWNlLT51Lndkcy5yZW1vdGVfYWRkcikpCisJCQllbXB0eSA9IGlmYWNlOworCQllbHNlIGlmIChtZW1jbXAoaWZhY2UtPnUud2RzLnJlbW90ZV9hZGRyLCByZW1vdGVfYWRkciwKKwkJCQlFVEhfQUxFTikgPT0gMCkgeworCQkJbWF0Y2ggPSBpZmFjZTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghbWF0Y2ggJiYgZW1wdHkgJiYgIXByaXNtMl93ZHNfc3BlY2lhbF9hZGRyKHJlbW90ZV9hZGRyKSkgeworCQkvKiB0YWtlIHByZS1hbGxvY2F0ZWQgZW50cnkgaW50byB1c2UgKi8KKwkJbWVtY3B5KGVtcHR5LT51Lndkcy5yZW1vdGVfYWRkciwgcmVtb3RlX2FkZHIsIEVUSF9BTEVOKTsKKwkJcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5pZmFjZV9sb2NrKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1c2luZyBwcmUtYWxsb2NhdGVkIFdEUyBuZXRkZXZpY2UgJXNcbiIsCisJCSAgICAgICBsb2NhbC0+ZGV2LT5uYW1lLCBlbXB0eS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+aWZhY2VfbG9jayk7CisKKwlpZiAoIXByaXNtMl93ZHNfc3BlY2lhbF9hZGRyKHJlbW90ZV9hZGRyKSkgeworCQlpZiAobWF0Y2gpCisJCQlyZXR1cm4gLUVFWElTVDsKKwkJaG9zdGFwX2FkZF9zdGEobG9jYWwtPmFwLCByZW1vdGVfYWRkcik7CisJfQorCisJaWYgKGxvY2FsLT53ZHNfY29ubmVjdGlvbnMgPj0gbG9jYWwtPndkc19tYXhfY29ubmVjdGlvbnMpCisJCXJldHVybiAtRU5PQlVGUzsKKworCS8qIHZlcmlmeSB0aGF0IHRoZXJlIGlzIHJvb20gZm9yIHdkcyMgcG9zdGZpeCBpbiB0aGUgaW50ZXJmYWNlIG5hbWUgKi8KKwlpZiAoc3RybGVuKGxvY2FsLT5kZXYtPm5hbWUpID4gSUZOQU1TSVogLSA1KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICInJXMnIHRvbyBsb25nIGJhc2UgZGV2aWNlIG5hbWVcbiIsCisJCSAgICAgICBsb2NhbC0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2ID0gaG9zdGFwX2FkZF9pbnRlcmZhY2UobG9jYWwsIEhPU1RBUF9JTlRFUkZBQ0VfV0RTLCBydG5sX2xvY2tlZCwKKwkJCQkgICBsb2NhbC0+ZGRldi0+bmFtZSwgIndkcyVkIik7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwltZW1jcHkoaWZhY2UtPnUud2RzLnJlbW90ZV9hZGRyLCByZW1vdGVfYWRkciwgRVRIX0FMRU4pOworCisJbG9jYWwtPndkc19jb25uZWN0aW9ucysrOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfd2RzX2RlbChsb2NhbF9pbmZvX3QgKmxvY2FsLCB1OCAqcmVtb3RlX2FkZHIsCisJCQkgIGludCBydG5sX2xvY2tlZCwgaW50IGRvX25vdF9yZW1vdmUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlLCAqc2VsZWN0ZWQgPSBOVUxMOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZsb2NhbC0+aWZhY2VfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2gocHRyLCAmbG9jYWwtPmhvc3RhcF9pbnRlcmZhY2VzKSB7CisJCWlmYWNlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBob3N0YXBfaW50ZXJmYWNlLCBsaXN0KTsKKwkJaWYgKGlmYWNlLT50eXBlICE9IEhPU1RBUF9JTlRFUkZBQ0VfV0RTKQorCQkJY29udGludWU7CisKKwkJaWYgKG1lbWNtcChpZmFjZS0+dS53ZHMucmVtb3RlX2FkZHIsIHJlbW90ZV9hZGRyLAorCQkJICAgRVRIX0FMRU4pID09IDApIHsKKwkJCXNlbGVjdGVkID0gaWZhY2U7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoc2VsZWN0ZWQgJiYgIWRvX25vdF9yZW1vdmUpCisJCWxpc3RfZGVsKCZzZWxlY3RlZC0+bGlzdCk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5pZmFjZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoc2VsZWN0ZWQpIHsKKwkJaWYgKGRvX25vdF9yZW1vdmUpCisJCQltZW1zZXQoc2VsZWN0ZWQtPnUud2RzLnJlbW90ZV9hZGRyLCAwLCBFVEhfQUxFTik7CisJCWVsc2UgeworCQkJaG9zdGFwX3JlbW92ZV9pbnRlcmZhY2Uoc2VsZWN0ZWQtPmRldiwgcnRubF9sb2NrZWQsIDApOworCQkJbG9jYWwtPndkc19jb25uZWN0aW9ucy0tOworCQl9CisJfQorCisJcmV0dXJuIHNlbGVjdGVkID8gMCA6IC1FTk9ERVY7Cit9CisKKwordTE2IGhvc3RhcF90eF9jYWxsYmFja19yZWdpc3Rlcihsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJCXZvaWQgKCpmdW5jKShzdHJ1Y3Qgc2tfYnVmZiAqLCBpbnQgb2ssIHZvaWQgKiksCisJCQkJdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBob3N0YXBfdHhfY2FsbGJhY2tfaW5mbyAqZW50cnk7CisKKwllbnRyeSA9IChzdHJ1Y3QgaG9zdGFwX3R4X2NhbGxiYWNrX2luZm8gKikga21hbGxvYyhzaXplb2YoKmVudHJ5KSwKKwkJCQkJCQkgICBHRlBfQVRPTUlDKTsKKwlpZiAoZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwllbnRyeS0+ZnVuYyA9IGZ1bmM7CisJZW50cnktPmRhdGEgPSBkYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJZW50cnktPmlkeCA9IGxvY2FsLT50eF9jYWxsYmFjayA/IGxvY2FsLT50eF9jYWxsYmFjay0+aWR4ICsgMSA6IDE7CisJZW50cnktPm5leHQgPSBsb2NhbC0+dHhfY2FsbGJhY2s7CisJbG9jYWwtPnR4X2NhbGxiYWNrID0gZW50cnk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlbnRyeS0+aWR4OworfQorCisKK2ludCBob3N0YXBfdHhfY2FsbGJhY2tfdW5yZWdpc3Rlcihsb2NhbF9pbmZvX3QgKmxvY2FsLCB1MTYgaWR4KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGhvc3RhcF90eF9jYWxsYmFja19pbmZvICpjYiwgKnByZXYgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJY2IgPSBsb2NhbC0+dHhfY2FsbGJhY2s7CisJd2hpbGUgKGNiICE9IE5VTEwgJiYgY2ItPmlkeCAhPSBpZHgpIHsKKwkJcHJldiA9IGNiOworCQljYiA9IGNiLT5uZXh0OworCX0KKwlpZiAoY2IpIHsKKwkJaWYgKHByZXYgPT0gTlVMTCkKKwkJCWxvY2FsLT50eF9jYWxsYmFjayA9IGNiLT5uZXh0OworCQllbHNlCisJCQlwcmV2LT5uZXh0ID0gY2ItPm5leHQ7CisJCWtmcmVlKGNiKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBjYiA/IDAgOiAtMTsKK30KKworCisvKiB2YWwgaXMgaW4gaG9zdCBieXRlIG9yZGVyICovCitpbnQgaG9zdGFwX3NldF93b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByaWQsIHUxNiB2YWwpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCXUxNiB0bXAgPSBjcHVfdG9fbGUxNih2YWwpOworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gaWZhY2UtPmxvY2FsLT5mdW5jLT5zZXRfcmlkKGRldiwgcmlkLCAmdG1wLCAyKTsKK30KKworCitpbnQgaG9zdGFwX3NldF9zdHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJpZCwgY29uc3QgY2hhciAqdmFsKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwljaGFyIGJ1ZltNQVhfU1NJRF9MRU4gKyAyXTsKKwlpbnQgbGVuOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxlbiA9IHN0cmxlbih2YWwpOworCWlmIChsZW4gPiBNQVhfU1NJRF9MRU4pCisJCXJldHVybiAtMTsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJYnVmWzBdID0gbGVuOyAvKiBsaXR0bGUgZW5kaWFuIDE2IGJpdCB3b3JkICovCisJbWVtY3B5KGJ1ZiArIDIsIHZhbCwgbGVuKTsKKworCXJldHVybiBpZmFjZS0+bG9jYWwtPmZ1bmMtPnNldF9yaWQoZGV2LCByaWQsICZidWYsIE1BWF9TU0lEX0xFTiArIDIpOworfQorCisKK3UxNiBob3N0YXBfZ2V0X3BvcnR0eXBlKGxvY2FsX2luZm9fdCAqbG9jYWwpCit7CisJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfQURIT0MgJiYgbG9jYWwtPnBzZXVkb19hZGhvYykKKwkJcmV0dXJuIEhGQTM4NFhfUE9SVFRZUEVfUFNFVURPX0lCU1M7CisJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCXJldHVybiBIRkEzODRYX1BPUlRUWVBFX0lCU1M7CisJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCisJCXJldHVybiBIRkEzODRYX1BPUlRUWVBFX0JTUzsKKwlpZiAobG9jYWwtPml3X21vZGUgPT0gSVdfTU9ERV9SRVBFQVQpCisJCXJldHVybiBIRkEzODRYX1BPUlRUWVBFX1dEUzsKKwlpZiAobG9jYWwtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gSEZBMzg0WF9QT1JUVFlQRV9QU0VVRE9fSUJTUzsKKwlyZXR1cm4gSEZBMzg0WF9QT1JUVFlQRV9IT1NUQVA7Cit9CisKKworaW50IGhvc3RhcF9zZXRfZW5jcnlwdGlvbihsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXUxNiB2YWwsIG9sZF92YWw7CisJaW50IGksIGtleWxlbiwgbGVuLCBpZHg7CisJY2hhciBrZXlidWZbV0VQX0tFWV9MRU4gKyAxXTsKKwllbnVtIHsgTk9ORSwgV0VQLCBPVEhFUiB9IGVuY3J5cHRfdHlwZTsKKworCWlkeCA9IGxvY2FsLT50eF9rZXlpZHg7CisJaWYgKGxvY2FsLT5jcnlwdFtpZHhdID09IE5VTEwgfHwgbG9jYWwtPmNyeXB0W2lkeF0tPm9wcyA9PSBOVUxMKQorCQllbmNyeXB0X3R5cGUgPSBOT05FOworCWVsc2UgaWYgKHN0cmNtcChsb2NhbC0+Y3J5cHRbaWR4XS0+b3BzLT5uYW1lLCAiV0VQIikgPT0gMCkKKwkJZW5jcnlwdF90eXBlID0gV0VQOworCWVsc2UKKwkJZW5jcnlwdF90eXBlID0gT1RIRVI7CisKKwlpZiAobG9jYWwtPmZ1bmMtPmdldF9yaWQobG9jYWwtPmRldiwgSEZBMzg0WF9SSURfQ05GV0VQRkxBR1MsICZ2YWwsIDIsCisJCQkJIDEpIDwgMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IHJlYWQgY3VycmVudCBXRVAgZmxhZ3MuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlsZTE2X3RvX2NwdXMoJnZhbCk7CisJb2xkX3ZhbCA9IHZhbDsKKworCWlmIChlbmNyeXB0X3R5cGUgIT0gTk9ORSB8fCBsb2NhbC0+cHJpdmFjeV9pbnZva2VkKQorCQl2YWwgfD0gSEZBMzg0WF9XRVBGTEFHU19QUklWQUNZSU5WT0tFRDsKKwllbHNlCisJCXZhbCAmPSB+SEZBMzg0WF9XRVBGTEFHU19QUklWQUNZSU5WT0tFRDsKKworCWlmIChsb2NhbC0+b3Blbl93ZXAgfHwgZW5jcnlwdF90eXBlID09IE5PTkUgfHwKKwkgICAgKChsb2NhbC0+aWVlZV84MDJfMXggfHwgbG9jYWwtPndwYSkgJiYgbG9jYWwtPmhvc3RfZGVjcnlwdCkpCisJCXZhbCAmPSB+SEZBMzg0WF9XRVBGTEFHU19FWENMVURFVU5FTkNSWVBURUQ7CisJZWxzZQorCQl2YWwgfD0gSEZBMzg0WF9XRVBGTEFHU19FWENMVURFVU5FTkNSWVBURUQ7CisKKwlpZiAoKGVuY3J5cHRfdHlwZSAhPSBOT05FIHx8IGxvY2FsLT5wcml2YWN5X2ludm9rZWQpICYmCisJICAgIChlbmNyeXB0X3R5cGUgPT0gT1RIRVIgfHwgbG9jYWwtPmhvc3RfZW5jcnlwdCkpCisJCXZhbCB8PSBIRkEzODRYX1dFUEZMQUdTX0hPU1RFTkNSWVBUOworCWVsc2UKKwkJdmFsICY9IH5IRkEzODRYX1dFUEZMQUdTX0hPU1RFTkNSWVBUOworCWlmICgoZW5jcnlwdF90eXBlICE9IE5PTkUgfHwgbG9jYWwtPnByaXZhY3lfaW52b2tlZCkgJiYKKwkgICAgKGVuY3J5cHRfdHlwZSA9PSBPVEhFUiB8fCBsb2NhbC0+aG9zdF9kZWNyeXB0KSkKKwkJdmFsIHw9IEhGQTM4NFhfV0VQRkxBR1NfSE9TVERFQ1JZUFQ7CisJZWxzZQorCQl2YWwgJj0gfkhGQTM4NFhfV0VQRkxBR1NfSE9TVERFQ1JZUFQ7CisKKwlpZiAodmFsICE9IG9sZF92YWwgJiYKKwkgICAgaG9zdGFwX3NldF93b3JkKGxvY2FsLT5kZXYsIEhGQTM4NFhfUklEX0NORldFUEZMQUdTLCB2YWwpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3Qgd3JpdGUgbmV3IFdFUCBmbGFncyAoMHgleClcbiIsCisJCSAgICAgICB2YWwpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKGVuY3J5cHRfdHlwZSAhPSBXRVApCisJCXJldHVybiAwOworCisJLyogMTA0LWJpdCBzdXBwb3J0IHNlZW1zIHRvIHJlcXVpcmUgdGhhdCBhbGwgdGhlIGtleXMgYXJlIHNldCB0byB0aGUKKwkgKiBzYW1lIGtleWxlbiAqLworCWtleWxlbiA9IDY7IC8qIGZpcnN0IDUgb2N0ZXRzICovCisJbGVuID0gbG9jYWwtPmNyeXB0W2lkeF0tPm9wcy0+Z2V0X2tleShrZXlidWYsIHNpemVvZihrZXlidWYpLAorCQkJCQkgICAgICBOVUxMLCBsb2NhbC0+Y3J5cHRbaWR4XS0+cHJpdik7CisJaWYgKGlkeCA+PSAwICYmIGlkeCA8IFdFUF9LRVlTICYmIGxlbiA+IDUpCisJCWtleWxlbiA9IFdFUF9LRVlfTEVOICsgMTsgLyogZmlyc3QgMTMgb2N0ZXRzICovCisKKwlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgeworCQltZW1zZXQoa2V5YnVmLCAwLCBzaXplb2Yoa2V5YnVmKSk7CisJCWlmIChsb2NhbC0+Y3J5cHRbaV0pIHsKKwkJCSh2b2lkKSBsb2NhbC0+Y3J5cHRbaV0tPm9wcy0+Z2V0X2tleSgKKwkJCQlrZXlidWYsIHNpemVvZihrZXlidWYpLAorCQkJCU5VTEwsIGxvY2FsLT5jcnlwdFtpXS0+cHJpdik7CisJCX0KKwkJaWYgKGxvY2FsLT5mdW5jLT5zZXRfcmlkKGxvY2FsLT5kZXYsCisJCQkJCSBIRkEzODRYX1JJRF9DTkZERUZBVUxUS0VZMCArIGksCisJCQkJCSBrZXlidWYsIGtleWxlbikpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3Qgc2V0IGtleSAlZCAobGVuPSVkKVxuIiwKKwkJCSAgICAgICBpLCBrZXlsZW4pOworCQkJZ290byBmYWlsOworCQl9CisJfQorCWlmIChob3N0YXBfc2V0X3dvcmQobG9jYWwtPmRldiwgSEZBMzg0WF9SSURfQ05GV0VQREVGQVVMVEtFWUlELCBpZHgpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3Qgc2V0IGRlZmF1bHQga2V5aWQgJWRcbiIsIGlkeCk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbmNyeXB0aW9uIHNldHVwIGZhaWxlZFxuIiwgbG9jYWwtPmRldi0+bmFtZSk7CisJcmV0dXJuIC0xOworfQorCisKK2ludCBob3N0YXBfc2V0X2FudHNlbChsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXUxNiB2YWw7CisJaW50IHJldCA9IDA7CisKKwlpZiAobG9jYWwtPmFudHNlbF90eCAhPSBIT1NUQVBfQU5UU0VMX0RPX05PVF9UT1VDSCAmJgorCSAgICBsb2NhbC0+ZnVuYy0+Y21kKGxvY2FsLT5kZXYsIEhGQTM4NFhfQ01EQ09ERV9SRUFETUlGLAorCQkJICAgICBIRkEzODZYX0NSX1RYX0NPTkZJR1VSRSwKKwkJCSAgICAgTlVMTCwgJnZhbCkgPT0gMCkgeworCQl2YWwgJj0gfihCSVQoMikgfCBCSVQoMSkpOworCQlzd2l0Y2ggKGxvY2FsLT5hbnRzZWxfdHgpIHsKKwkJY2FzZSBIT1NUQVBfQU5UU0VMX0RJVkVSU0lUWToKKwkJCXZhbCB8PSBCSVQoMSk7CisJCQlicmVhazsKKwkJY2FzZSBIT1NUQVBfQU5UU0VMX0xPVzoKKwkJCWJyZWFrOworCQljYXNlIEhPU1RBUF9BTlRTRUxfSElHSDoKKwkJCXZhbCB8PSBCSVQoMik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChsb2NhbC0+ZnVuYy0+Y21kKGxvY2FsLT5kZXYsIEhGQTM4NFhfQ01EQ09ERV9XUklURU1JRiwKKwkJCQkgICAgIEhGQTM4NlhfQ1JfVFhfQ09ORklHVVJFLCAmdmFsLCBOVUxMKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNldHRpbmcgVFggQW50U2VsIGZhaWxlZFxuIiwKKwkJCSAgICAgICBsb2NhbC0+ZGV2LT5uYW1lKTsKKwkJCXJldCA9IC0xOworCQl9CisJfQorCisJaWYgKGxvY2FsLT5hbnRzZWxfcnggIT0gSE9TVEFQX0FOVFNFTF9ET19OT1RfVE9VQ0ggJiYKKwkgICAgbG9jYWwtPmZ1bmMtPmNtZChsb2NhbC0+ZGV2LCBIRkEzODRYX0NNRENPREVfUkVBRE1JRiwKKwkJCSAgICAgSEZBMzg2WF9DUl9SWF9DT05GSUdVUkUsCisJCQkgICAgIE5VTEwsICZ2YWwpID09IDApIHsKKwkJdmFsICY9IH4oQklUKDEpIHwgQklUKDApKTsKKwkJc3dpdGNoIChsb2NhbC0+YW50c2VsX3J4KSB7CisJCWNhc2UgSE9TVEFQX0FOVFNFTF9ESVZFUlNJVFk6CisJCQlicmVhazsKKwkJY2FzZSBIT1NUQVBfQU5UU0VMX0xPVzoKKwkJCXZhbCB8PSBCSVQoMCk7CisJCQlicmVhazsKKwkJY2FzZSBIT1NUQVBfQU5UU0VMX0hJR0g6CisJCQl2YWwgfD0gQklUKDApIHwgQklUKDEpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobG9jYWwtPmZ1bmMtPmNtZChsb2NhbC0+ZGV2LCBIRkEzODRYX0NNRENPREVfV1JJVEVNSUYsCisJCQkJICAgICBIRkEzODZYX0NSX1JYX0NPTkZJR1VSRSwgJnZhbCwgTlVMTCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzZXR0aW5nIFJYIEFudFNlbCBmYWlsZWRcbiIsCisJCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSk7CisJCQlyZXQgPSAtMTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKworaW50IGhvc3RhcF9zZXRfcm9hbWluZyhsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXUxNiB2YWw7CisKKwlzd2l0Y2ggKGxvY2FsLT5ob3N0X3JvYW1pbmcpIHsKKwljYXNlIDE6CisJCXZhbCA9IEhGQTM4NFhfUk9BTUlOR19IT1NUOworCQlicmVhazsKKwljYXNlIDI6CisJCXZhbCA9IEhGQTM4NFhfUk9BTUlOR19ESVNBQkxFRDsKKwkJYnJlYWs7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCXZhbCA9IEhGQTM4NFhfUk9BTUlOR19GSVJNV0FSRTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGhvc3RhcF9zZXRfd29yZChsb2NhbC0+ZGV2LCBIRkEzODRYX1JJRF9DTkZST0FNSU5HTU9ERSwgdmFsKTsKK30KKworCitpbnQgaG9zdGFwX3NldF9hdXRoX2FsZ3MobG9jYWxfaW5mb190ICpsb2NhbCkKK3sKKwlpbnQgdmFsID0gbG9jYWwtPmF1dGhfYWxnczsKKwkvKiBBdCBsZWFzdCBTVEEgZi93IHYwLjYuMiBzZWVtcyB0byBoYXZlIGlzc3VlcyB3aXRoIGNuZkF1dGhlbnRpY2F0aW9uCisJICogc2V0IHRvIGluY2x1ZGUgYm90aCBPcGVuIGFuZCBTaGFyZWQgS2V5IGZsYWdzLiBJdCB0cmllcyB0byB1c2UKKwkgKiBTaGFyZWQgS2V5IGF1dGhlbnRpY2F0aW9uIGluIHRoYXQgY2FzZSBldmVuIGlmIFdFUCBrZXlzIGFyZSBub3QKKwkgKiBjb25maWd1cmVkLi4gU1RBIGYvdyB2MC43LjYgaXMgYWJsZSB0byBoYW5kbGUgc3VjaCBjb25maWd1cmF0aW9uLAorCSAqIGJ1dCBpdCBpcyB1bmtub3duIHdoZW4gdGhpcyB3YXMgZml4ZWQgYmV0d2VlbiAwLjYuMiAuLiAwLjcuNi4gKi8KKwlpZiAobG9jYWwtPnN0YV9md192ZXIgPCBQUklTTTJfRldfVkVSKDAsNywwKSAmJgorCSAgICB2YWwgIT0gUFJJU00yX0FVVEhfT1BFTiAmJiB2YWwgIT0gUFJJU00yX0FVVEhfU0hBUkVEX0tFWSkKKwkJdmFsID0gUFJJU00yX0FVVEhfT1BFTjsKKworCWlmIChob3N0YXBfc2V0X3dvcmQobG9jYWwtPmRldiwgSEZBMzg0WF9SSURfQ05GQVVUSEVOVElDQVRJT04sIHZhbCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNuZkF1dGhlbnRpY2F0aW9uIHNldHRpbmcgdG8gMHgleCAiCisJCSAgICAgICAiZmFpbGVkXG4iLCBsb2NhbC0+ZGV2LT5uYW1lLCBsb2NhbC0+YXV0aF9hbGdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBob3N0YXBfZHVtcF9yeF9oZWFkZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IGhmYTM4NHhfcnhfZnJhbWUgKnJ4KQoreworCXUxNiBzdGF0dXMsIGZjOworCisJc3RhdHVzID0gX19sZTE2X3RvX2NwdShyeC0+c3RhdHVzKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogUlggc3RhdHVzPTB4JTA0eCAocG9ydD0lZCwgdHlwZT0lZCwgIgorCSAgICAgICAiZmNzZXJyPSVkKSBzaWxlbmNlPSVkIHNpZ25hbD0lZCByYXRlPSVkIHJ4Zmxvdz0lZDsgIgorCSAgICAgICAiamlmZmllcz0lbGRcbiIsCisJICAgICAgIG5hbWUsIHN0YXR1cywgKHN0YXR1cyA+PiA4KSAmIDB4MDcsIHN0YXR1cyA+PiAxMywgc3RhdHVzICYgMSwKKwkgICAgICAgcngtPnNpbGVuY2UsIHJ4LT5zaWduYWwsIHJ4LT5yYXRlLCByeC0+cnhmbG93LCBqaWZmaWVzKTsKKworCWZjID0gX19sZTE2X3RvX2NwdShyeC0+ZnJhbWVfY29udHJvbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgIEZDPTB4JTA0eCAodHlwZT0lZDolZCkgZHVyPTB4JTA0eCBzZXE9MHglMDR4ICIKKwkgICAgICAgImRhdGFfbGVuPSVkJXMlc1xuIiwKKwkgICAgICAgZmMsIFdMQU5fRkNfR0VUX1RZUEUoZmMpID4+IDIsIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSA+PiA0LAorCSAgICAgICBfX2xlMTZfdG9fY3B1KHJ4LT5kdXJhdGlvbl9pZCksIF9fbGUxNl90b19jcHUocngtPnNlcV9jdHJsKSwKKwkgICAgICAgX19sZTE2X3RvX2NwdShyeC0+ZGF0YV9sZW4pLAorCSAgICAgICBmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMgPyAiIFtUb0RTXSIgOiAiIiwKKwkgICAgICAgZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMgPyAiIFtGcm9tRFNdIiA6ICIiKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIgICBBMT0iIE1BQ1NUUiAiIEEyPSIgTUFDU1RSICIgQTM9IiBNQUNTVFIgIiBBND0iCisJICAgICAgIE1BQ1NUUiAiXG4iLAorCSAgICAgICBNQUMyU1RSKHJ4LT5hZGRyMSksIE1BQzJTVFIocngtPmFkZHIyKSwgTUFDMlNUUihyeC0+YWRkcjMpLAorCSAgICAgICBNQUMyU1RSKHJ4LT5hZGRyNCkpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiAgIGRzdD0iIE1BQ1NUUiAiIHNyYz0iIE1BQ1NUUiAiIGxlbj0lZFxuIiwKKwkgICAgICAgTUFDMlNUUihyeC0+ZHN0X2FkZHIpLCBNQUMyU1RSKHJ4LT5zcmNfYWRkciksCisJICAgICAgIF9fYmUxNl90b19jcHUocngtPmxlbikpOworfQorCisKK3ZvaWQgaG9zdGFwX2R1bXBfdHhfaGVhZGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBoZmEzODR4X3R4X2ZyYW1lICp0eCkKK3sKKwl1MTYgZmM7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRYIHN0YXR1cz0weCUwNHggcmV0cnlfY291bnQ9JWQgdHhfcmF0ZT0lZCAiCisJICAgICAgICJ0eF9jb250cm9sPTB4JTA0eDsgamlmZmllcz0lbGRcbiIsCisJICAgICAgIG5hbWUsIF9fbGUxNl90b19jcHUodHgtPnN0YXR1cyksIHR4LT5yZXRyeV9jb3VudCwgdHgtPnR4X3JhdGUsCisJICAgICAgIF9fbGUxNl90b19jcHUodHgtPnR4X2NvbnRyb2wpLCBqaWZmaWVzKTsKKworCWZjID0gX19sZTE2X3RvX2NwdSh0eC0+ZnJhbWVfY29udHJvbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgIEZDPTB4JTA0eCAodHlwZT0lZDolZCkgZHVyPTB4JTA0eCBzZXE9MHglMDR4ICIKKwkgICAgICAgImRhdGFfbGVuPSVkJXMlc1xuIiwKKwkgICAgICAgZmMsIFdMQU5fRkNfR0VUX1RZUEUoZmMpID4+IDIsIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSA+PiA0LAorCSAgICAgICBfX2xlMTZfdG9fY3B1KHR4LT5kdXJhdGlvbl9pZCksIF9fbGUxNl90b19jcHUodHgtPnNlcV9jdHJsKSwKKwkgICAgICAgX19sZTE2X3RvX2NwdSh0eC0+ZGF0YV9sZW4pLAorCSAgICAgICBmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMgPyAiIFtUb0RTXSIgOiAiIiwKKwkgICAgICAgZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMgPyAiIFtGcm9tRFNdIiA6ICIiKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIgICBBMT0iIE1BQ1NUUiAiIEEyPSIgTUFDU1RSICIgQTM9IiBNQUNTVFIgIiBBND0iCisJICAgICAgIE1BQ1NUUiAiXG4iLAorCSAgICAgICBNQUMyU1RSKHR4LT5hZGRyMSksIE1BQzJTVFIodHgtPmFkZHIyKSwgTUFDMlNUUih0eC0+YWRkcjMpLAorCSAgICAgICBNQUMyU1RSKHR4LT5hZGRyNCkpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiAgIGRzdD0iIE1BQ1NUUiAiIHNyYz0iIE1BQ1NUUiAiIGxlbj0lZFxuIiwKKwkgICAgICAgTUFDMlNUUih0eC0+ZHN0X2FkZHIpLCBNQUMyU1RSKHR4LT5zcmNfYWRkciksCisJICAgICAgIF9fYmUxNl90b19jcHUodHgtPmxlbikpOworfQorCisKK2ludCBob3N0YXBfODAyMTFfaGVhZGVyX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKQoreworCW1lbWNweShoYWRkciwgc2tiLT5tYWMucmF3ICsgMTAsIEVUSF9BTEVOKTsgLyogYWRkcjIgKi8KKwlyZXR1cm4gRVRIX0FMRU47Cit9CisKKworaW50IGhvc3RhcF84MDIxMV9wcmlzbV9oZWFkZXJfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgY2hhciAqaGFkZHIpCit7CisJaWYgKCoodTMyICopc2tiLT5tYWMucmF3ID09IExXTkdfQ0FQX0RJRF9CQVNFKSB7CisJCW1lbWNweShoYWRkciwgc2tiLT5tYWMucmF3ICsKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbGludXhfd2xhbl9uZ19wcmlzbV9oZHIpICsgMTAsCisJCSAgICAgICBFVEhfQUxFTik7IC8qIGFkZHIyICovCisJfSBlbHNlIHsgLyogKCoodTMyICopc2tiLT5tYWMucmF3ID09IGh0b25sKExXTkdfQ0FQSERSX1ZFUlNJT04pKSAqLworCQltZW1jcHkoaGFkZHIsIHNrYi0+bWFjLnJhdyArCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGxpbnV4X3dsYW5fbmdfY2FwX2hkcikgKyAxMCwKKwkJICAgICAgIEVUSF9BTEVOKTsgLyogYWRkcjIgKi8KKwl9CisJcmV0dXJuIEVUSF9BTEVOOworfQorCisKK2ludCBob3N0YXBfODAyMTFfZ2V0X2hkcmxlbih1MTYgZmMpCit7CisJaW50IGhkcmxlbiA9IDI0OworCisJc3dpdGNoIChXTEFOX0ZDX0dFVF9UWVBFKGZjKSkgeworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6CisJCWlmICgoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpKQorCQkJaGRybGVuID0gMzA7IC8qIEFkZHI0ICovCisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0NUTDoKKwkJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShmYykpIHsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQ1RTOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BQ0s6CisJCQloZHJsZW4gPSAxMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaGRybGVuID0gMTY7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaGRybGVuOworfQorCisKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpob3N0YXBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJmlmYWNlLT5zdGF0czsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCisJUERFQlVHKERFQlVHX0ZMT1csICIlczogcHJpc20yX2Nsb3NlXG4iLCBkZXYtPm5hbWUpOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKGRldiA9PSBsb2NhbC0+ZGRldikgeworCQlwcmlzbTJfc3RhX2RlYXV0aChsb2NhbCwgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOworCX0KKyNpZm5kZWYgUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVAorCWlmICghbG9jYWwtPmhvc3RhcGQgJiYgZGV2ID09IGxvY2FsLT5kZXYgJiYKKwkgICAgKCFsb2NhbC0+ZnVuYy0+Y2FyZF9wcmVzZW50IHx8IGxvY2FsLT5mdW5jLT5jYXJkX3ByZXNlbnQobG9jYWwpKSAmJgorCSAgICBsb2NhbC0+aHdfcmVhZHkgJiYgbG9jYWwtPmFwICYmIGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQorCQlob3N0YXBfZGVhdXRoX2FsbF9zdGFzKGRldiwgbG9jYWwtPmFwLCAxKTsKKyNlbmRpZiAvKiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCisKKwlpZiAobG9jYWwtPmZ1bmMtPmRldl9jbG9zZSAmJiBsb2NhbC0+ZnVuYy0+ZGV2X2Nsb3NlKGxvY2FsKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGV2ID09IGxvY2FsLT5kZXYpIHsKKwkJbG9jYWwtPmZ1bmMtPmh3X3NodXRkb3duKGRldiwgSE9TVEFQX0hXX0VOQUJMRV9DTURDT01QTCk7CisJfQorCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwl9CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJbW9kdWxlX3B1dChsb2NhbC0+aHdfbW9kdWxlKTsKKworCWxvY2FsLT5udW1fZGV2X29wZW4tLTsKKworCWlmIChkZXYgIT0gbG9jYWwtPmRldiAmJiBsb2NhbC0+ZGV2LT5mbGFncyAmIElGRl9VUCAmJgorCSAgICBsb2NhbC0+bWFzdGVyX2Rldl9hdXRvX29wZW4gJiYgbG9jYWwtPm51bV9kZXZfb3BlbiA9PSAxKSB7CisJCS8qIENsb3NlIG1hc3RlciByYWRpbyBpbnRlcmZhY2UgYXV0b21hdGljYWxseSBpZiBpdCB3YXMgYWxzbworCQkgKiBvcGVuZWQgYXV0b21hdGljYWxseSBhbmQgd2UgYXJlIG5vdyBjbG9zaW5nIHRoZSBsYXN0CisJCSAqIHJlbWFpbmluZyBub24tbWFzdGVyIGRldmljZS4gKi8KKwkJZGV2X2Nsb3NlKGxvY2FsLT5kZXYpOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKworCVBERUJVRyhERUJVR19GTE9XLCAiJXM6IHByaXNtMl9vcGVuXG4iLCBkZXYtPm5hbWUpOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKGxvY2FsLT5ub19wcmkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjb3VsZCBub3Qgc2V0IGludGVyZmFjZSBVUCAtIG5vIFBSSSAiCisJCSAgICAgICAiZi93XG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKGxvY2FsLT5mdW5jLT5jYXJkX3ByZXNlbnQgJiYgIWxvY2FsLT5mdW5jLT5jYXJkX3ByZXNlbnQobG9jYWwpKSB8fAorCSAgICBsb2NhbC0+aHdfZG93bmxvYWRpbmcpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGxvY2FsLT5mdW5jLT5kZXZfb3BlbiAmJiBsb2NhbC0+ZnVuYy0+ZGV2X29wZW4obG9jYWwpKQorCQlyZXR1cm4gMTsKKworCWlmICghdHJ5X21vZHVsZV9nZXQobG9jYWwtPmh3X21vZHVsZSkpCisJCXJldHVybiAtRU5PREVWOworCWxvY2FsLT5udW1fZGV2X29wZW4rKzsKKworCWlmICghbG9jYWwtPmRldl9lbmFibGVkICYmIGxvY2FsLT5mdW5jLT5od19lbmFibGUoZGV2LCAxKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY291bGQgbm90IGVuYWJsZSBNQUMgcG9ydFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXByaXNtMl9jbG9zZShkZXYpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCFsb2NhbC0+ZGV2X2VuYWJsZWQpCisJCXByaXNtMl9jYWxsYmFjayhsb2NhbCwgUFJJU00yX0NBTExCQUNLX0VOQUJMRSk7CisJbG9jYWwtPmRldl9lbmFibGVkID0gMTsKKworCWlmIChkZXYgIT0gbG9jYWwtPmRldiAmJiAhKGxvY2FsLT5kZXYtPmZsYWdzICYgSUZGX1VQKSkgeworCQkvKiBNYXN0ZXIgcmFkaW8gaW50ZXJmYWNlIGlzIG5lZWRlZCBmb3IgYWxsIG9wZXJhdGlvbiwgc28gb3BlbgorCQkgKiBpdCBhdXRvbWF0aWNhbGx5IHdoZW4gYW55IHZpcnR1YWwgbmV0X2RldmljZSBpcyBvcGVuZWQuICovCisJCWxvY2FsLT5tYXN0ZXJfZGV2X2F1dG9fb3BlbiA9IDE7CisJCWRldl9vcGVuKGxvY2FsLT5kZXYpOworCX0KKworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAobG9jYWwtPmZ1bmMtPnNldF9yaWQoZGV2LCBIRkEzODRYX1JJRF9DTkZPV05NQUNBRERSLCBhZGRyLT5zYV9kYXRhLAorCQkJCSBFVEhfQUxFTikgPCAwIHx8IGxvY2FsLT5mdW5jLT5yZXNldF9wb3J0KGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVhZF9sb2NrX2JoKCZsb2NhbC0+aWZhY2VfbG9jayk7CisJbGlzdF9mb3JfZWFjaChwdHIsICZsb2NhbC0+aG9zdGFwX2ludGVyZmFjZXMpIHsKKwkJaWZhY2UgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UsIGxpc3QpOworCQltZW1jcHkoaWZhY2UtPmRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwl9CisJbWVtY3B5KGxvY2FsLT5kZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CisJcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5pZmFjZV9sb2NrKTsKKworCXJldHVybiAwOworfQorCisKKy8qIFRPRE86IHRvIGJlIGZ1cnRoZXIgaW1wbGVtZW50ZWQgYXMgc29vbiBhcyBQcmlzbTIgZnVsbHkgc3VwcG9ydHMKKyAqICAgICAgIEdyb3VwQWRkcmVzc2VzIGFuZCBjb3JyZWN0IGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlICovCit2b2lkIGhvc3RhcF9zZXRfbXVsdGljYXN0X2xpc3RfcXVldWUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisJaWYgKGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX1BST01JU0NVT1VTTU9ERSwKKwkJCSAgICBsb2NhbC0+aXNfcHJvbWlzYykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzYWJsaW5nIHByb21pc2N1b3VzIG1vZGUgZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBsb2NhbC0+aXNfcHJvbWlzYyA/ICJlbiIgOiAiZGlzIik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGhvc3RhcF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZiAwCisJLyogRklYOiBwcm9taXNjdW91cyBtb2RlIHNlZW1zIHRvIGJlIGNhdXNpbmcgYSBsb3Qgb2YgcHJvYmxlbXMgd2l0aAorCSAqIHNvbWUgc3RhdGlvbiBmaXJtd2FyZSB2ZXJzaW9ucyAoRkNTRXJyIGZyYW1lcywgaW52YWxpZCBNQUNQb3J0LCBldGMuCisJICogY29ycnVwdGVkIGluY29taW5nIGZyYW1lcykuIFRoaXMgY29kZSBpcyBub3cgY29tbWVudGVkIG91dCB3aGlsZSB0aGUKKwkgKiBwcm9ibGVtcyBhcmUgaW52ZXN0aWdhdGVkLiAqLworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCWlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykpIHsKKwkJbG9jYWwtPmlzX3Byb21pc2MgPSAxOworCX0gZWxzZSB7CisJCWxvY2FsLT5pc19wcm9taXNjID0gMDsKKwl9CisKKwlzY2hlZHVsZV93b3JrKCZsb2NhbC0+c2V0X211bHRpY2FzdF9saXN0X3F1ZXVlKTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKG5ld19tdHUgPCBQUklTTTJfTUlOX01UVSB8fCBuZXdfbXR1ID4gUFJJU00yX01BWF9NVFUpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJc3RydWN0IGhmYTM4NHhfcmVncyByZWdzOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgVHggdGltZWQgb3V0ISBSZXNldHRpbmcgY2FyZFxuIiwgZGV2LT5uYW1lKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGxvY2FsLT5kZXYpOworCisJbG9jYWwtPmZ1bmMtPnJlYWRfcmVncyhkZXYsICZyZWdzKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENNRD0lMDR4IEVWU1RBVD0lMDR4ICIKKwkgICAgICAgIk9GRlNFVDA9JTA0eCBPRkZTRVQxPSUwNHggU1dTVVBQT1JUMD0lMDR4XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHJlZ3MuY21kLCByZWdzLmV2c3RhdCwgcmVncy5vZmZzZXQwLCByZWdzLm9mZnNldDEsCisJICAgICAgIHJlZ3Muc3dzdXBwb3J0MCk7CisKKwlsb2NhbC0+ZnVuYy0+c2NoZWR1bGVfcmVzZXQobG9jYWwpOworfQorCisKK3ZvaWQgaG9zdGFwX3NldHVwX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkgICAgICBpbnQgbWFpbl9kZXYpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWV0aGVyX3NldHVwKGRldik7CisKKwkvKiBrZXJuZWwgY2FsbGJhY2tzICovCisJZGV2LT5nZXRfc3RhdHMgPSBob3N0YXBfZ2V0X3N0YXRzOworCWlmIChpZmFjZSkgeworCQkvKiBDdXJyZW50bHksIHdlIHBvaW50IHRvIHRoZSBwcm9wZXIgc3B5X2RhdGEgb25seSBvbgorCQkgKiB0aGUgbWFpbl9kZXYuIFRoaXMgY291bGQgYmUgZml4ZWQuIEplYW4gSUkgKi8KKwkJaWZhY2UtPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmaWZhY2UtPnNweV9kYXRhOworCQlkZXYtPndpcmVsZXNzX2RhdGEgPSAmaWZhY2UtPndpcmVsZXNzX2RhdGE7CisJfQorCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPQorCQkoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZob3N0YXBfaXdfaGFuZGxlcl9kZWY7CisJZGV2LT5kb19pb2N0bCA9IGhvc3RhcF9pb2N0bDsKKwlkZXYtPm9wZW4gPSBwcmlzbTJfb3BlbjsKKwlkZXYtPnN0b3AgPSBwcmlzbTJfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBob3N0YXBfZGF0YV9zdGFydF94bWl0OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gcHJpc20yX3NldF9tYWNfYWRkcmVzczsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGhvc3RhcF9zZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5jaGFuZ2VfbXR1ID0gcHJpc20yX2NoYW5nZV9tdHU7CisJZGV2LT50eF90aW1lb3V0ID0gcHJpc20yX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKwlkZXYtPm10dSA9IGxvY2FsLT5tdHU7CisJaWYgKCFtYWluX2RldikgeworCQkvKiB1c2UgbWFpbiByYWRpbyBkZXZpY2UgcXVldWUgKi8KKwkJZGV2LT50eF9xdWV1ZV9sZW4gPSAwOworCX0KKworCVNFVF9FVEhUT09MX09QUyhkZXYsICZwcmlzbTJfZXRodG9vbF9vcHMpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworfQorCisKK3N0YXRpYyBpbnQgaG9zdGFwX2VuYWJsZV9ob3N0YXBkKGxvY2FsX2luZm9fdCAqbG9jYWwsIGludCBydG5sX2xvY2tlZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPmRldjsKKworCWlmIChsb2NhbC0+YXBkZXYpCisJCXJldHVybiAtRUVYSVNUOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbmFibGluZyBob3N0YXBkIG1vZGVcbiIsIGRldi0+bmFtZSk7CisKKwlsb2NhbC0+YXBkZXYgPSBob3N0YXBfYWRkX2ludGVyZmFjZShsb2NhbCwgSE9TVEFQX0lOVEVSRkFDRV9BUCwKKwkJCQkJICAgIHJ0bmxfbG9ja2VkLCBsb2NhbC0+ZGRldi0+bmFtZSwKKwkJCQkJICAgICJhcCIpOworCWlmIChsb2NhbC0+YXBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsb2NhbC0+YXBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGhvc3RhcF9tZ210X3N0YXJ0X3htaXQ7CisJbG9jYWwtPmFwZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMTsKKwlsb2NhbC0+YXBkZXYtPmhhcmRfaGVhZGVyX3BhcnNlID0gaG9zdGFwXzgwMjExX2hlYWRlcl9wYXJzZTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaG9zdGFwX2Rpc2FibGVfaG9zdGFwZChsb2NhbF9pbmZvX3QgKmxvY2FsLCBpbnQgcnRubF9sb2NrZWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRpc2FibGluZyBob3N0YXBkIG1vZGVcbiIsIGRldi0+bmFtZSk7CisKKwlob3N0YXBfcmVtb3ZlX2ludGVyZmFjZShsb2NhbC0+YXBkZXYsIHJ0bmxfbG9ja2VkLCAxKTsKKwlsb2NhbC0+YXBkZXYgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBob3N0YXBfZW5hYmxlX2hvc3RhcGRfc3RhKGxvY2FsX2luZm9fdCAqbG9jYWwsIGludCBydG5sX2xvY2tlZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPmRldjsKKworCWlmIChsb2NhbC0+c3RhZGV2KQorCQlyZXR1cm4gLUVFWElTVDsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogZW5hYmxpbmcgaG9zdGFwZCBTVEEgbW9kZVxuIiwgZGV2LT5uYW1lKTsKKworCWxvY2FsLT5zdGFkZXYgPSBob3N0YXBfYWRkX2ludGVyZmFjZShsb2NhbCwgSE9TVEFQX0lOVEVSRkFDRV9TVEEsCisJCQkJCSAgICAgcnRubF9sb2NrZWQsIGxvY2FsLT5kZGV2LT5uYW1lLAorCQkJCQkgICAgICJzdGEiKTsKKwlpZiAobG9jYWwtPnN0YWRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaG9zdGFwX2Rpc2FibGVfaG9zdGFwZF9zdGEobG9jYWxfaW5mb190ICpsb2NhbCwgaW50IHJ0bmxfbG9ja2VkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsb2NhbC0+ZGV2OworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkaXNhYmxpbmcgaG9zdGFwZCBtb2RlXG4iLCBkZXYtPm5hbWUpOworCisJaG9zdGFwX3JlbW92ZV9pbnRlcmZhY2UobG9jYWwtPnN0YWRldiwgcnRubF9sb2NrZWQsIDEpOworCWxvY2FsLT5zdGFkZXYgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGhvc3RhcF9zZXRfaG9zdGFwZChsb2NhbF9pbmZvX3QgKmxvY2FsLCBpbnQgdmFsLCBpbnQgcnRubF9sb2NrZWQpCit7CisJaW50IHJldDsKKworCWlmICh2YWwgPCAwIHx8IHZhbCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxvY2FsLT5ob3N0YXBkID09IHZhbCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodmFsKSB7CisJCXJldCA9IGhvc3RhcF9lbmFibGVfaG9zdGFwZChsb2NhbCwgcnRubF9sb2NrZWQpOworCQlpZiAocmV0ID09IDApCisJCQlsb2NhbC0+aG9zdGFwZCA9IDE7CisJfSBlbHNlIHsKKwkJbG9jYWwtPmhvc3RhcGQgPSAwOworCQlyZXQgPSBob3N0YXBfZGlzYWJsZV9ob3N0YXBkKGxvY2FsLCBydG5sX2xvY2tlZCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWxvY2FsLT5ob3N0YXBkID0gMTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBob3N0YXBfc2V0X2hvc3RhcGRfc3RhKGxvY2FsX2luZm9fdCAqbG9jYWwsIGludCB2YWwsIGludCBydG5sX2xvY2tlZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHZhbCA8IDAgfHwgdmFsID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobG9jYWwtPmhvc3RhcGRfc3RhID09IHZhbCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodmFsKSB7CisJCXJldCA9IGhvc3RhcF9lbmFibGVfaG9zdGFwZF9zdGEobG9jYWwsIHJ0bmxfbG9ja2VkKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJbG9jYWwtPmhvc3RhcGRfc3RhID0gMTsKKwl9IGVsc2UgeworCQlsb2NhbC0+aG9zdGFwZF9zdGEgPSAwOworCQlyZXQgPSBob3N0YXBfZGlzYWJsZV9ob3N0YXBkX3N0YShsb2NhbCwgcnRubF9sb2NrZWQpOworCQlpZiAocmV0ICE9IDApCisJCQlsb2NhbC0+aG9zdGFwZF9zdGEgPSAxOworCX0KKworCisJcmV0dXJuIHJldDsKK30KKworCitpbnQgcHJpc20yX3VwZGF0ZV9jb21tc19xdWFsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGhmYTM4NHhfY29tbXNfcXVhbGl0eSBzcTsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKwlpZiAoIWxvY2FsLT5zdGFfZndfdmVyKQorCQlyZXQgPSAtMTsKKwllbHNlIGlmIChsb2NhbC0+c3RhX2Z3X3ZlciA+PSBQUklTTTJfRldfVkVSKDEsMywxKSkgeworCQlpZiAobG9jYWwtPmZ1bmMtPmdldF9yaWQobG9jYWwtPmRldiwKKwkJCQkJIEhGQTM4NFhfUklEX0RCTUNPTU1TUVVBTElUWSwKKwkJCQkJICZzcSwgc2l6ZW9mKHNxKSwgMSkgPj0gMCkgeworCQkJbG9jYWwtPmNvbW1zX3F1YWwgPSAoczE2KSBsZTE2X3RvX2NwdShzcS5jb21tX3F1YWwpOworCQkJbG9jYWwtPmF2Z19zaWduYWwgPSAoczE2KSBsZTE2X3RvX2NwdShzcS5zaWduYWxfbGV2ZWwpOworCQkJbG9jYWwtPmF2Z19ub2lzZSA9IChzMTYpIGxlMTZfdG9fY3B1KHNxLm5vaXNlX2xldmVsKTsKKwkJCWxvY2FsLT5sYXN0X2NvbW1zX3F1YWxfdXBkYXRlID0gamlmZmllczsKKwkJfSBlbHNlCisJCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQlpZiAobG9jYWwtPmZ1bmMtPmdldF9yaWQobG9jYWwtPmRldiwgSEZBMzg0WF9SSURfQ09NTVNRVUFMSVRZLAorCQkJCQkgJnNxLCBzaXplb2Yoc3EpLCAxKSA+PSAwKSB7CisJCQlsb2NhbC0+Y29tbXNfcXVhbCA9IGxlMTZfdG9fY3B1KHNxLmNvbW1fcXVhbCk7CisJCQlsb2NhbC0+YXZnX3NpZ25hbCA9IEhGQTM4NFhfTEVWRUxfVE9fZEJtKAorCQkJCWxlMTZfdG9fY3B1KHNxLnNpZ25hbF9sZXZlbCkpOworCQkJbG9jYWwtPmF2Z19ub2lzZSA9IEhGQTM4NFhfTEVWRUxfVE9fZEJtKAorCQkJCWxlMTZfdG9fY3B1KHNxLm5vaXNlX2xldmVsKSk7CisJCQlsb2NhbC0+bGFzdF9jb21tc19xdWFsX3VwZGF0ZSA9IGppZmZpZXM7CisJCX0gZWxzZQorCQkJcmV0ID0gLTE7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitpbnQgcHJpc20yX3N0YV9zZW5kX21nbXQobG9jYWxfaW5mb190ICpsb2NhbCwgdTggKmRzdCwgdTE2IHN0eXBlLAorCQkJIHU4ICpib2R5LCBzaXplX3QgYm9keWxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBob3N0YXBfaWVlZTgwMjExX21nbXQgKm1nbXQ7CisJc3RydWN0IGhvc3RhcF9za2JfdHhfZGF0YSAqbWV0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPmRldjsKKworCXNrYiA9IGRldl9hbGxvY19za2IoSUVFRTgwMjExX01HTVRfSERSX0xFTiArIGJvZHlsZW4pOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZ210ID0gKHN0cnVjdCBob3N0YXBfaWVlZTgwMjExX21nbXQgKikKKwkJc2tiX3B1dChza2IsIElFRUU4MDIxMV9NR01UX0hEUl9MRU4pOworCW1lbXNldChtZ210LCAwLCBJRUVFODAyMTFfTUdNVF9IRFJfTEVOKTsKKwltZ210LT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBzdHlwZSk7CisJbWVtY3B5KG1nbXQtPmRhLCBkc3QsIEVUSF9BTEVOKTsKKwltZW1jcHkobWdtdC0+c2EsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobWdtdC0+YnNzaWQsIGRzdCwgRVRIX0FMRU4pOworCWlmIChib2R5KQorCQltZW1jcHkoc2tiX3B1dChza2IsIGJvZHlsZW4pLCBib2R5LCBib2R5bGVuKTsKKworCW1ldGEgPSAoc3RydWN0IGhvc3RhcF9za2JfdHhfZGF0YSAqKSBza2ItPmNiOworCW1lbXNldChtZXRhLCAwLCBzaXplb2YoKm1ldGEpKTsKKwltZXRhLT5tYWdpYyA9IEhPU1RBUF9TS0JfVFhfREFUQV9NQUdJQzsKKwltZXRhLT5pZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPm1hYy5yYXcgPSBza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlkZXZfcXVldWVfeG1pdChza2IpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IHByaXNtMl9zdGFfZGVhdXRoKGxvY2FsX2luZm9fdCAqbG9jYWwsIHUxNiByZWFzb24pCit7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWludCByZXQ7CisKKwlpZiAobG9jYWwtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSB8fAorCSAgICBtZW1jbXAobG9jYWwtPmJzc2lkLCAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwgRVRIX0FMRU4pID09IDAgfHwKKwkgICAgbWVtY21wKGxvY2FsLT5ic3NpZCwgIlx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NCIsIEVUSF9BTEVOKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJlYXNvbiA9IGNwdV90b19sZTE2KHJlYXNvbik7CisJcmV0ID0gcHJpc20yX3N0YV9zZW5kX21nbXQobG9jYWwsIGxvY2FsLT5ic3NpZCwgSUVFRTgwMjExX1NUWVBFX0RFQVVUSCwKKwkJCQkgICAodTggKikgJnJlYXNvbiwgMik7CisJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChsb2NhbC0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaG9zdGFwX3Byb2M7CisKK3N0YXRpYyBpbnQgX19pbml0IGhvc3RhcF9pbml0KHZvaWQpCit7CisJaWYgKHByb2NfbmV0ICE9IE5VTEwpIHsKKwkJaG9zdGFwX3Byb2MgPSBwcm9jX21rZGlyKCJob3N0YXAiLCBwcm9jX25ldCk7CisJCWlmICghaG9zdGFwX3Byb2MpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gbWtkaXIgIgorCQkJICAgICAgICIvcHJvYy9uZXQvaG9zdGFwXG4iKTsKKwl9IGVsc2UKKwkJaG9zdGFwX3Byb2MgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGhvc3RhcF9leGl0KHZvaWQpCit7CisJaWYgKGhvc3RhcF9wcm9jICE9IE5VTEwpIHsKKwkJaG9zdGFwX3Byb2MgPSBOVUxMOworCQlyZW1vdmVfcHJvY19lbnRyeSgiaG9zdGFwIiwgcHJvY19uZXQpOworCX0KK30KKworCitFWFBPUlRfU1lNQk9MKGhvc3RhcF9zZXRfd29yZCk7CitFWFBPUlRfU1lNQk9MKGhvc3RhcF9zZXRfc3RyaW5nKTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwX2dldF9wb3J0dHlwZSk7CitFWFBPUlRfU1lNQk9MKGhvc3RhcF9zZXRfZW5jcnlwdGlvbik7CitFWFBPUlRfU1lNQk9MKGhvc3RhcF9zZXRfYW50c2VsKTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwX3NldF9yb2FtaW5nKTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwX3NldF9hdXRoX2FsZ3MpOworRVhQT1JUX1NZTUJPTChob3N0YXBfZHVtcF9yeF9oZWFkZXIpOworRVhQT1JUX1NZTUJPTChob3N0YXBfZHVtcF90eF9oZWFkZXIpOworRVhQT1JUX1NZTUJPTChob3N0YXBfODAyMTFfaGVhZGVyX3BhcnNlKTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwXzgwMjExX3ByaXNtX2hlYWRlcl9wYXJzZSk7CitFWFBPUlRfU1lNQk9MKGhvc3RhcF84MDIxMV9nZXRfaGRybGVuKTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwX2dldF9zdGF0cyk7CitFWFBPUlRfU1lNQk9MKGhvc3RhcF9zZXR1cF9kZXYpOworRVhQT1JUX1NZTUJPTChob3N0YXBfcHJvYyk7CitFWFBPUlRfU1lNQk9MKGhvc3RhcF9zZXRfbXVsdGljYXN0X2xpc3RfcXVldWUpOworRVhQT1JUX1NZTUJPTChob3N0YXBfc2V0X2hvc3RhcGQpOworRVhQT1JUX1NZTUJPTChob3N0YXBfc2V0X2hvc3RhcGRfc3RhKTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwX2FkZF9pbnRlcmZhY2UpOworRVhQT1JUX1NZTUJPTChob3N0YXBfcmVtb3ZlX2ludGVyZmFjZSk7CitFWFBPUlRfU1lNQk9MKHByaXNtMl91cGRhdGVfY29tbXNfcXVhbCk7CisKK21vZHVsZV9pbml0KGhvc3RhcF9pbml0KTsKK21vZHVsZV9leGl0KGhvc3RhcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmFjODliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcC5oCkBAIC0wLDAgKzEsNTcgQEAKKyNpZm5kZWYgSE9TVEFQX0gKKyNkZWZpbmUgSE9TVEFQX0gKKworLyogaG9zdGFwLmMgKi8KKworZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaG9zdGFwX3Byb2M7CisKK3UxNiBob3N0YXBfdHhfY2FsbGJhY2tfcmVnaXN0ZXIobG9jYWxfaW5mb190ICpsb2NhbCwKKwkJCQl2b2lkICgqZnVuYykoc3RydWN0IHNrX2J1ZmYgKiwgaW50IG9rLCB2b2lkICopLAorCQkJCXZvaWQgKmRhdGEpOworaW50IGhvc3RhcF90eF9jYWxsYmFja191bnJlZ2lzdGVyKGxvY2FsX2luZm9fdCAqbG9jYWwsIHUxNiBpZHgpOworaW50IGhvc3RhcF9zZXRfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmlkLCB1MTYgdmFsKTsKK2ludCBob3N0YXBfc2V0X3N0cmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmlkLCBjb25zdCBjaGFyICp2YWwpOwordTE2IGhvc3RhcF9nZXRfcG9ydHR5cGUobG9jYWxfaW5mb190ICpsb2NhbCk7CitpbnQgaG9zdGFwX3NldF9lbmNyeXB0aW9uKGxvY2FsX2luZm9fdCAqbG9jYWwpOworaW50IGhvc3RhcF9zZXRfYW50c2VsKGxvY2FsX2luZm9fdCAqbG9jYWwpOworaW50IGhvc3RhcF9zZXRfcm9hbWluZyhsb2NhbF9pbmZvX3QgKmxvY2FsKTsKK2ludCBob3N0YXBfc2V0X2F1dGhfYWxncyhsb2NhbF9pbmZvX3QgKmxvY2FsKTsKK3ZvaWQgaG9zdGFwX2R1bXBfcnhfaGVhZGVyKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICBjb25zdCBzdHJ1Y3QgaGZhMzg0eF9yeF9mcmFtZSAqcngpOwordm9pZCBob3N0YXBfZHVtcF90eF9oZWFkZXIoY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBoZmEzODR4X3R4X2ZyYW1lICp0eCk7CitpbnQgaG9zdGFwXzgwMjExX2hlYWRlcl9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyICpoYWRkcik7CitpbnQgaG9zdGFwXzgwMjExX3ByaXNtX2hlYWRlcl9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyICpoYWRkcik7CitpbnQgaG9zdGFwXzgwMjExX2dldF9oZHJsZW4odTE2IGZjKTsKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpob3N0YXBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBob3N0YXBfc2V0dXBfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGxvY2FsX2luZm9fdCAqbG9jYWwsCisJCSAgICAgIGludCBtYWluX2Rldik7Cit2b2lkIGhvc3RhcF9zZXRfbXVsdGljYXN0X2xpc3RfcXVldWUodm9pZCAqZGF0YSk7CitpbnQgaG9zdGFwX3NldF9ob3N0YXBkKGxvY2FsX2luZm9fdCAqbG9jYWwsIGludCB2YWwsIGludCBydG5sX2xvY2tlZCk7CitpbnQgaG9zdGFwX3NldF9ob3N0YXBkX3N0YShsb2NhbF9pbmZvX3QgKmxvY2FsLCBpbnQgdmFsLCBpbnQgcnRubF9sb2NrZWQpOwordm9pZCBob3N0YXBfY2xlYW51cChsb2NhbF9pbmZvX3QgKmxvY2FsKTsKK3ZvaWQgaG9zdGFwX2NsZWFudXBfaGFuZGxlcih2b2lkICpkYXRhKTsKK3N0cnVjdCBuZXRfZGV2aWNlICogaG9zdGFwX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGxvY2FsX2luZm8gKmxvY2FsLAorCQkJCQkgaW50IHR5cGUsIGludCBydG5sX2xvY2tlZCwKKwkJCQkJIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGhvc3RhcF9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBydG5sX2xvY2tlZCwKKwkJCSAgICAgaW50IHJlbW92ZV9mcm9tX2xpc3QpOworaW50IHByaXNtMl91cGRhdGVfY29tbXNfcXVhbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBwcmlzbTJfc3RhX3NlbmRfbWdtdChsb2NhbF9pbmZvX3QgKmxvY2FsLCB1OCAqZHN0LCB1MTYgc3R5cGUsCisJCQkgdTggKmJvZHksIHNpemVfdCBib2R5bGVuKTsKK2ludCBwcmlzbTJfc3RhX2RlYXV0aChsb2NhbF9pbmZvX3QgKmxvY2FsLCB1MTYgcmVhc29uKTsKKworCisvKiBob3N0YXBfcHJvYy5jICovCisKK3ZvaWQgaG9zdGFwX2luaXRfcHJvYyhsb2NhbF9pbmZvX3QgKmxvY2FsKTsKK3ZvaWQgaG9zdGFwX3JlbW92ZV9wcm9jKGxvY2FsX2luZm9fdCAqbG9jYWwpOworCisKKy8qIGhvc3RhcF9pbmZvLmMgKi8KKwordm9pZCBob3N0YXBfaW5mb19pbml0KGxvY2FsX2luZm9fdCAqbG9jYWwpOwordm9pZCBob3N0YXBfaW5mb19wcm9jZXNzKGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IpOworCisKKyNlbmRpZiAvKiBIT1NUQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTA2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExLmgKQEAgLTAsMCArMSw5NiBAQAorI2lmbmRlZiBIT1NUQVBfODAyMTFfSAorI2RlZmluZSBIT1NUQVBfODAyMTFfSAorCitzdHJ1Y3QgaG9zdGFwX2llZWU4MDIxMV9tZ210IHsKKwl1MTYgZnJhbWVfY29udHJvbDsKKwl1MTYgZHVyYXRpb247CisJdTggZGFbNl07CisJdTggc2FbNl07CisJdTggYnNzaWRbNl07CisJdTE2IHNlcV9jdHJsOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUxNiBhdXRoX2FsZzsKKwkJCXUxNiBhdXRoX3RyYW5zYWN0aW9uOworCQkJdTE2IHN0YXR1c19jb2RlOworCQkJLyogcG9zc2libHkgZm9sbG93ZWQgYnkgQ2hhbGxlbmdlIHRleHQgKi8KKwkJCXU4IHZhcmlhYmxlWzBdOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhdXRoOworCQlzdHJ1Y3QgeworCQkJdTE2IHJlYXNvbl9jb2RlOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBkZWF1dGg7CisJCXN0cnVjdCB7CisJCQl1MTYgY2FwYWJfaW5mbzsKKwkJCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJCQkvKiBmb2xsb3dlZCBieSBTU0lEIGFuZCBTdXBwb3J0ZWQgcmF0ZXMgKi8KKwkJCXU4IHZhcmlhYmxlWzBdOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhc3NvY19yZXE7CisJCXN0cnVjdCB7CisJCQl1MTYgY2FwYWJfaW5mbzsKKwkJCXUxNiBzdGF0dXNfY29kZTsKKwkJCXUxNiBhaWQ7CisJCQkvKiBmb2xsb3dlZCBieSBTdXBwb3J0ZWQgcmF0ZXMgKi8KKwkJCXU4IHZhcmlhYmxlWzBdOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhc3NvY19yZXNwLCByZWFzc29jX3Jlc3A7CisJCXN0cnVjdCB7CisJCQl1MTYgY2FwYWJfaW5mbzsKKwkJCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJCQl1OCBjdXJyZW50X2FwWzZdOworCQkJLyogZm9sbG93ZWQgYnkgU1NJRCBhbmQgU3VwcG9ydGVkIHJhdGVzICovCisJCQl1OCB2YXJpYWJsZVswXTsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcmVhc3NvY19yZXE7CisJCXN0cnVjdCB7CisJCQl1MTYgcmVhc29uX2NvZGU7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGRpc2Fzc29jOworCQlzdHJ1Y3QgeworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwcm9iZV9yZXE7CisJCXN0cnVjdCB7CisJCQl1OCB0aW1lc3RhbXBbOF07CisJCQl1MTYgYmVhY29uX2ludDsKKwkJCXUxNiBjYXBhYl9pbmZvOworCQkJLyogZm9sbG93ZWQgYnkgc29tZSBvZiBTU0lELCBTdXBwb3J0ZWQgcmF0ZXMsCisJCQkgKiBGSCBQYXJhbXMsIERTIFBhcmFtcywgQ0YgUGFyYW1zLCBJQlNTIFBhcmFtcywgVElNICovCisJCQl1OCB2YXJpYWJsZVswXTsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYmVhY29uLCBwcm9iZV9yZXNwOworCX0gdTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKyNkZWZpbmUgSUVFRTgwMjExX01HTVRfSERSX0xFTiAyNAorI2RlZmluZSBJRUVFODAyMTFfREFUQV9IRFIzX0xFTiAyNAorI2RlZmluZSBJRUVFODAyMTFfREFUQV9IRFI0X0xFTiAzMAorCisKK3N0cnVjdCBob3N0YXBfODAyMTFfcnhfc3RhdHVzIHsKKwl1MzIgbWFjX3RpbWU7CisJdTggc2lnbmFsOworCXU4IG5vaXNlOworCXUxNiByYXRlOyAvKiBpbiAxMDAga2JwcyAqLworfTsKKworCit2b2lkIGhvc3RhcF84MDIxMV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgIHN0cnVjdCBob3N0YXBfODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0cyk7CisKKworLyogcHJpc20yX3J4XzgwMjExICd0eXBlJyBhcmd1bWVudCAqLworZW51bSB7CisJUFJJU00yX1JYX01PTklUT1IsIFBSSVNNMl9SWF9NR01ULCBQUklTTTJfUlhfTk9OX0FTU09DLAorCVBSSVNNMl9SWF9OVUxMRlVOQ19BQ0sKK307CisKK2ludCBwcmlzbTJfcnhfODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgIHN0cnVjdCBob3N0YXBfODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0cywgaW50IHR5cGUpOwordm9pZCBob3N0YXBfODAyMTFfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBzdHJ1Y3QgaG9zdGFwXzgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHMpOwordm9pZCBob3N0YXBfZHVtcF9yeF84MDIxMShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgaG9zdGFwXzgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHMpOworCit2b2lkIGhvc3RhcF9kdW1wX3R4XzgwMjExKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBza19idWZmICpza2IpOworaW50IGhvc3RhcF9kYXRhX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgaG9zdGFwX21nbXRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0cnVjdCBza19idWZmICogaG9zdGFwX3R4X2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0KTsKK2ludCBob3N0YXBfbWFzdGVyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNlbmRpZiAvKiBIT1NUQVBfODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV9yeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTAxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3J4LmMKQEAgLTAsMCArMSwxMDkxIEBACisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgImhvc3RhcF84MDIxMS5oIgorI2luY2x1ZGUgImhvc3RhcC5oIgorCit2b2lkIGhvc3RhcF9kdW1wX3J4XzgwMjExKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBob3N0YXBfODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0cykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXUxNiBmYzsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJYIHNpZ25hbD0lZCBub2lzZT0lZCByYXRlPSVkIGxlbj0lZCAiCisJICAgICAgICJqaWZmaWVzPSVsZFxuIiwKKwkgICAgICAgbmFtZSwgcnhfc3RhdHMtPnNpZ25hbCwgcnhfc3RhdHMtPm5vaXNlLCByeF9zdGF0cy0+cmF0ZSwKKwkgICAgICAgc2tiLT5sZW4sIGppZmZpZXMpOworCisJaWYgKHNrYi0+bGVuIDwgMikKKwkJcmV0dXJuOworCisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgIEZDPTB4JTA0eCAodHlwZT0lZDolZCklcyVzIiwKKwkgICAgICAgZmMsIFdMQU5fRkNfR0VUX1RZUEUoZmMpID4+IDIsIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSA+PiA0LAorCSAgICAgICBmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMgPyAiIFtUb0RTXSIgOiAiIiwKKwkgICAgICAgZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMgPyAiIFtGcm9tRFNdIiA6ICIiKTsKKworCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOKSB7CisJCXByaW50aygiXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50aygiIGR1cj0weCUwNHggc2VxPTB4JTA0eFxuIiwgbGUxNl90b19jcHUoaGRyLT5kdXJhdGlvbl9pZCksCisJICAgICAgIGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCkpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiAgIEExPSIgTUFDU1RSICIgQTI9IiBNQUNTVFIgIiBBMz0iIE1BQ1NUUiwKKwkgICAgICAgTUFDMlNUUihoZHItPmFkZHIxKSwgTUFDMlNUUihoZHItPmFkZHIyKSwgTUFDMlNUUihoZHItPmFkZHIzKSk7CisJaWYgKHNrYi0+bGVuID49IDMwKQorCQlwcmludGsoIiBBND0iIE1BQ1NUUiwgTUFDMlNUUihoZHItPmFkZHI0KSk7CisJcHJpbnRrKCJcbiIpOworfQorCisKKy8qIFNlbmQgUlggZnJhbWUgdG8gbmV0aWYgd2l0aCA4MDIuMTEgKGFuZCBwb3NzaWJsZSBwcmlzbSkgaGVhZGVyLgorICogQ2FsbGVkIGZyb20gaGFyZHdhcmUgb3Igc29mdHdhcmUgSVJRIGNvbnRleHQuICovCitpbnQgcHJpc20yX3J4XzgwMjExKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICBzdHJ1Y3QgaG9zdGFwXzgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHMsIGludCB0eXBlKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCBoZHJsZW4sIHBoZHJsZW4sIGhlYWRfbmVlZCwgdGFpbF9uZWVkOworCXUxNiBmYzsKKwlpbnQgcHJpc21faGVhZGVyLCByZXQ7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNKSB7CisJCWlmIChsb2NhbC0+bW9uaXRvcl90eXBlID09IFBSSVNNMl9NT05JVE9SX1BSSVNNKSB7CisJCQlwcmlzbV9oZWFkZXIgPSAxOworCQkJcGhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgbGludXhfd2xhbl9uZ19wcmlzbV9oZHIpOworCQl9IGVsc2UgeyAvKiBsb2NhbC0+bW9uaXRvcl90eXBlID09IFBSSVNNMl9NT05JVE9SX0NBUEhEUiAqLworCQkJcHJpc21faGVhZGVyID0gMjsKKwkJCXBoZHJsZW4gPSBzaXplb2Yoc3RydWN0IGxpbnV4X3dsYW5fbmdfY2FwX2hkcik7CisJCX0KKwl9IGVsc2UgeworCQlwcmlzbV9oZWFkZXIgPSAwOworCQlwaGRybGVuID0gMDsKKwl9CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCisJaWYgKHR5cGUgPT0gUFJJU00yX1JYX01HTVQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfVkVSUykpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkcm9wcGVkIG1hbmFnZW1lbnQgZnJhbWUgd2l0aCBoZWFkZXIgIgorCQkgICAgICAgInZlcnNpb24gJWRcbiIsIGRldi0+bmFtZSwgZmMgJiBJRUVFODAyMTFfRkNUTF9WRVJTKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaGRybGVuID0gaG9zdGFwXzgwMjExX2dldF9oZHJsZW4oZmMpOworCisJLyogY2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIHJvb20gZm9yIGV4dHJhIGRhdGE7IGlmIG5vdCwgZXhwYW5kIHNrYgorCSAqIGJ1ZmZlciB0byBiZSBsYXJnZSBlbm91Z2ggZm9yIHRoZSBjaGFuZ2VzICovCisJaGVhZF9uZWVkID0gcGhkcmxlbjsKKwl0YWlsX25lZWQgPSAwOworI2lmZGVmIFBSSVNNMl9BRERfQk9HVVNfQ1JDCisJdGFpbF9uZWVkICs9IDQ7CisjZW5kaWYgLyogUFJJU00yX0FERF9CT0dVU19DUkMgKi8KKworCWhlYWRfbmVlZCAtPSBza2JfaGVhZHJvb20oc2tiKTsKKwl0YWlsX25lZWQgLT0gc2tiX3RhaWxyb29tKHNrYik7CisKKwlpZiAoaGVhZF9uZWVkID4gMCB8fCB0YWlsX25lZWQgPiAwKSB7CisJCWlmIChwc2tiX2V4cGFuZF9oZWFkKHNrYiwgaGVhZF9uZWVkID4gMCA/IGhlYWRfbmVlZCA6IDAsCisJCQkJICAgICB0YWlsX25lZWQgPiAwID8gdGFpbF9uZWVkIDogMCwKKwkJCQkgICAgIEdGUF9BVE9NSUMpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHByaXNtMl9yeF84MDIxMSBmYWlsZWQgdG8gIgorCQkJICAgICAgICJyZWFsbG9jYXRlIHNrYiBidWZmZXJcbiIsIGRldi0+bmFtZSk7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBXZSBub3cgaGF2ZSBhbiBza2Igd2l0aCBlbm91Z2ggaGVhZCBhbmQgdGFpbCByb29tLCBzbyBqdXN0IGluc2VydAorCSAqIHRoZSBleHRyYSBkYXRhICovCisKKyNpZmRlZiBQUklTTTJfQUREX0JPR1VTX0NSQworCW1lbXNldChza2JfcHV0KHNrYiwgNCksIDB4ZmYsIDQpOyAvKiBQcmlzbTIgc3RyaXBzIENSQyAqLworI2VuZGlmIC8qIFBSSVNNMl9BRERfQk9HVVNfQ1JDICovCisKKwlpZiAocHJpc21faGVhZGVyID09IDEpIHsKKwkJc3RydWN0IGxpbnV4X3dsYW5fbmdfcHJpc21faGRyICpoZHI7CisJCWhkciA9IChzdHJ1Y3QgbGludXhfd2xhbl9uZ19wcmlzbV9oZHIgKikKKwkJCXNrYl9wdXNoKHNrYiwgcGhkcmxlbik7CisJCW1lbXNldChoZHIsIDAsIHBoZHJsZW4pOworCQloZHItPm1zZ2NvZGUgPSBMV05HX0NBUF9ESURfQkFTRTsKKwkJaGRyLT5tc2dsZW4gPSBzaXplb2YoKmhkcik7CisJCW1lbWNweShoZHItPmRldm5hbWUsIGRldi0+bmFtZSwgc2l6ZW9mKGhkci0+ZGV2bmFtZSkpOworI2RlZmluZSBMV05HX1NFVFZBTChmLGkscyxsLGQpIFwKK2hkci0+Zi5kaWQgPSBMV05HX0NBUF9ESURfQkFTRSB8IChpIDw8IDEyKTsgXAoraGRyLT5mLnN0YXR1cyA9IHM7IGhkci0+Zi5sZW4gPSBsOyBoZHItPmYuZGF0YSA9IGQKKwkJTFdOR19TRVRWQUwoaG9zdHRpbWUsIDEsIDAsIDQsIGppZmZpZXMpOworCQlMV05HX1NFVFZBTChtYWN0aW1lLCAyLCAwLCA0LCByeF9zdGF0cy0+bWFjX3RpbWUpOworCQlMV05HX1NFVFZBTChjaGFubmVsLCAzLCAxIC8qIG5vIHZhbHVlICovLCA0LCAwKTsKKwkJTFdOR19TRVRWQUwocnNzaSwgNCwgMSAvKiBubyB2YWx1ZSAqLywgNCwgMCk7CisJCUxXTkdfU0VUVkFMKHNxLCA1LCAxIC8qIG5vIHZhbHVlICovLCA0LCAwKTsKKwkJTFdOR19TRVRWQUwoc2lnbmFsLCA2LCAwLCA0LCByeF9zdGF0cy0+c2lnbmFsKTsKKwkJTFdOR19TRVRWQUwobm9pc2UsIDcsIDAsIDQsIHJ4X3N0YXRzLT5ub2lzZSk7CisJCUxXTkdfU0VUVkFMKHJhdGUsIDgsIDAsIDQsIHJ4X3N0YXRzLT5yYXRlIC8gNSk7CisJCUxXTkdfU0VUVkFMKGlzdHgsIDksIDAsIDQsIDApOworCQlMV05HX1NFVFZBTChmcm1sZW4sIDEwLCAwLCA0LCBza2ItPmxlbiAtIHBoZHJsZW4pOworI3VuZGVmIExXTkdfU0VUVkFMCisJfSBlbHNlIGlmIChwcmlzbV9oZWFkZXIgPT0gMikgeworCQlzdHJ1Y3QgbGludXhfd2xhbl9uZ19jYXBfaGRyICpoZHI7CisJCWhkciA9IChzdHJ1Y3QgbGludXhfd2xhbl9uZ19jYXBfaGRyICopCisJCQlza2JfcHVzaChza2IsIHBoZHJsZW4pOworCQltZW1zZXQoaGRyLCAwLCBwaGRybGVuKTsKKwkJaGRyLT52ZXJzaW9uICAgID0gaHRvbmwoTFdOR19DQVBIRFJfVkVSU0lPTik7CisJCWhkci0+bGVuZ3RoICAgICA9IGh0b25sKHBoZHJsZW4pOworCQloZHItPm1hY3RpbWUgICAgPSBfX2NwdV90b19iZTY0KHJ4X3N0YXRzLT5tYWNfdGltZSk7CisJCWhkci0+aG9zdHRpbWUgICA9IF9fY3B1X3RvX2JlNjQoamlmZmllcyk7CisJCWhkci0+cGh5dHlwZSAgICA9IGh0b25sKDQpOyAvKiBkc3NfZG90MTFfYiAqLworCQloZHItPmNoYW5uZWwgICAgPSBodG9ubChsb2NhbC0+Y2hhbm5lbCk7CisJCWhkci0+ZGF0YXJhdGUgICA9IGh0b25sKHJ4X3N0YXRzLT5yYXRlKTsKKwkJaGRyLT5hbnRlbm5hICAgID0gaHRvbmwoMCk7IC8qIHVua25vd24gKi8KKwkJaGRyLT5wcmlvcml0eSAgID0gaHRvbmwoMCk7IC8qIHVua25vd24gKi8KKwkJaGRyLT5zc2lfdHlwZSAgID0gaHRvbmwoMyk7IC8qIHJhdyAqLworCQloZHItPnNzaV9zaWduYWwgPSBodG9ubChyeF9zdGF0cy0+c2lnbmFsKTsKKwkJaGRyLT5zc2lfbm9pc2UgID0gaHRvbmwocnhfc3RhdHMtPm5vaXNlKTsKKwkJaGRyLT5wcmVhbWJsZSAgID0gaHRvbmwoMCk7IC8qIHVua25vd24gKi8KKwkJaGRyLT5lbmNvZGluZyAgID0gaHRvbmwoMSk7IC8qIGNjayAqLworCX0KKworCXJldCA9IHNrYi0+bGVuIC0gcGhkcmxlbjsKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLCBoZHJsZW4pOworCWlmIChwcmlzbV9oZWFkZXIpCisJCXNrYl9wdWxsKHNrYiwgcGhkcmxlbik7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzIpOworCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOworCW5ldGlmX3J4KHNrYik7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIHZvaWQgbW9uaXRvcl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICAgc3RydWN0IGhvc3RhcF84MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXRzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKKwlpbnQgbGVuOworCisJbGVuID0gcHJpc20yX3J4XzgwMjExKGRldiwgc2tiLCByeF9zdGF0cywgUFJJU00yX1JYX01PTklUT1IpOworCXN0YXRzID0gaG9zdGFwX2dldF9zdGF0cyhkZXYpOworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IGxlbjsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJpc20yX2ZyYWdfZW50cnkgKgorcHJpc20yX2ZyYWdfY2FjaGVfZmluZChsb2NhbF9pbmZvX3QgKmxvY2FsLCB1bnNpZ25lZCBpbnQgc2VxLAorCQkgICAgICAgdW5zaWduZWQgaW50IGZyYWcsIHU4ICpzcmMsIHU4ICpkc3QpCit7CisJc3RydWN0IHByaXNtMl9mcmFnX2VudHJ5ICplbnRyeTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBQUklTTTJfRlJBR19DQUNIRV9MRU47IGkrKykgeworCQllbnRyeSA9ICZsb2NhbC0+ZnJhZ19jYWNoZVtpXTsKKwkJaWYgKGVudHJ5LT5za2IgIT0gTlVMTCAmJgorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBlbnRyeS0+Zmlyc3RfZnJhZ190aW1lICsgMiAqIEhaKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleHBpcmluZyBmcmFnbWVudCBjYWNoZSBlbnRyeSAiCisJCQkgICAgICAgInNlcT0ldSBsYXN0X2ZyYWc9JXVcbiIsCisJCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSwgZW50cnktPnNlcSwgZW50cnktPmxhc3RfZnJhZyk7CisJCQlkZXZfa2ZyZWVfc2tiKGVudHJ5LT5za2IpOworCQkJZW50cnktPnNrYiA9IE5VTEw7CisJCX0KKworCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMICYmIGVudHJ5LT5zZXEgPT0gc2VxICYmCisJCSAgICAoZW50cnktPmxhc3RfZnJhZyArIDEgPT0gZnJhZyB8fCBmcmFnID09IC0xKSAmJgorCQkgICAgbWVtY21wKGVudHJ5LT5zcmNfYWRkciwgc3JjLCBFVEhfQUxFTikgPT0gMCAmJgorCQkgICAgbWVtY21wKGVudHJ5LT5kc3RfYWRkciwgZHN0LCBFVEhfQUxFTikgPT0gMCkKKwkJCXJldHVybiBlbnRyeTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitwcmlzbTJfZnJhZ19jYWNoZV9nZXQobG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwl1MTYgc2M7CisJdW5zaWduZWQgaW50IGZyYWcsIHNlcTsKKwlzdHJ1Y3QgcHJpc20yX2ZyYWdfZW50cnkgKmVudHJ5OworCisJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOworCWZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYykgPj4gNDsKKworCWlmIChmcmFnID09IDApIHsKKwkJLyogUmVzZXJ2ZSBlbm91Z2ggc3BhY2UgdG8gZml0IG1heGltdW0gZnJhbWUgbGVuZ3RoICovCisJCXNrYiA9IGRldl9hbGxvY19za2IobG9jYWwtPmRldi0+bXR1ICsKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyKSArCisJCQkJICAgIDggLyogTExDICovICsKKwkJCQkgICAgMiAvKiBhbGlnbm1lbnQgKi8gKworCQkJCSAgICA4IC8qIFdFUCAqLyArIEVUSF9BTEVOIC8qIFdEUyAqLyk7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCisJCWVudHJ5ID0gJmxvY2FsLT5mcmFnX2NhY2hlW2xvY2FsLT5mcmFnX25leHRfaWR4XTsKKwkJbG9jYWwtPmZyYWdfbmV4dF9pZHgrKzsKKwkJaWYgKGxvY2FsLT5mcmFnX25leHRfaWR4ID49IFBSSVNNMl9GUkFHX0NBQ0hFX0xFTikKKwkJCWxvY2FsLT5mcmFnX25leHRfaWR4ID0gMDsKKworCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMKQorCQkJZGV2X2tmcmVlX3NrYihlbnRyeS0+c2tiKTsKKworCQllbnRyeS0+Zmlyc3RfZnJhZ190aW1lID0gamlmZmllczsKKwkJZW50cnktPnNlcSA9IHNlcTsKKwkJZW50cnktPmxhc3RfZnJhZyA9IGZyYWc7CisJCWVudHJ5LT5za2IgPSBza2I7CisJCW1lbWNweShlbnRyeS0+c3JjX2FkZHIsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGVudHJ5LT5kc3RfYWRkciwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisJCS8qIHJlY2VpdmVkIGEgZnJhZ21lbnQgb2YgYSBmcmFtZSBmb3Igd2hpY2ggdGhlIGhlYWQgZnJhZ21lbnQKKwkJICogc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlY2VpdmVkICovCisJCWVudHJ5ID0gcHJpc20yX2ZyYWdfY2FjaGVfZmluZChsb2NhbCwgc2VxLCBmcmFnLCBoZHItPmFkZHIyLAorCQkJCQkgICAgICAgaGRyLT5hZGRyMSk7CisJCWlmIChlbnRyeSAhPSBOVUxMKSB7CisJCQllbnRyeS0+bGFzdF9mcmFnID0gZnJhZzsKKwkJCXNrYiA9IGVudHJ5LT5za2I7CisJCX0KKwl9CisKKwlyZXR1cm4gc2tiOworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIGludCBwcmlzbTJfZnJhZ19jYWNoZV9pbnZhbGlkYXRlKGxvY2FsX2luZm9fdCAqbG9jYWwsCisJCQkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJdTE2IHNjOworCXVuc2lnbmVkIGludCBzZXE7CisJc3RydWN0IHByaXNtMl9mcmFnX2VudHJ5ICplbnRyeTsKKworCXNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKwlzZXEgPSBXTEFOX0dFVF9TRVFfU0VRKHNjKSA+PiA0OworCisJZW50cnkgPSBwcmlzbTJfZnJhZ19jYWNoZV9maW5kKGxvY2FsLCBzZXEsIC0xLCBoZHItPmFkZHIyLCBoZHItPmFkZHIxKTsKKworCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogY291bGQgbm90IGludmFsaWRhdGUgZnJhZ21lbnQgY2FjaGUgIgorCQkgICAgICAgImVudHJ5IChzZXE9JXUpXG4iLAorCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSwgc2VxKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVudHJ5LT5za2IgPSBOVUxMOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaG9zdGFwX2Jzc19pbmZvICpfX2hvc3RhcF9nZXRfYnNzKGxvY2FsX2luZm9fdCAqbG9jYWwsIHU4ICpic3NpZCwKKwkJCQkJCXU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBob3N0YXBfYnNzX2luZm8gKmJzczsKKworCWxpc3RfZm9yX2VhY2gocHRyLCAmbG9jYWwtPmJzc19saXN0KSB7CisJCWJzcyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgaG9zdGFwX2Jzc19pbmZvLCBsaXN0KTsKKwkJaWYgKG1lbWNtcChic3MtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pID09IDAgJiYKKwkJICAgIChzc2lkID09IE5VTEwgfHwKKwkJICAgICAoc3NpZF9sZW4gPT0gYnNzLT5zc2lkX2xlbiAmJgorCQkgICAgICBtZW1jbXAoc3NpZCwgYnNzLT5zc2lkLCBzc2lkX2xlbikgPT0gMCkpKSB7CisJCQlsaXN0X21vdmUoJmJzcy0+bGlzdCwgJmxvY2FsLT5ic3NfbGlzdCk7CisJCQlyZXR1cm4gYnNzOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHN0cnVjdCBob3N0YXBfYnNzX2luZm8gKl9faG9zdGFwX2FkZF9ic3MobG9jYWxfaW5mb190ICpsb2NhbCwgdTggKmJzc2lkLAorCQkJCQkJdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2Jzc19pbmZvICpic3M7CisKKwlpZiAobG9jYWwtPm51bV9ic3NfaW5mbyA+PSBIT1NUQVBfTUFYX0JTU19DT1VOVCkgeworCQlic3MgPSBsaXN0X2VudHJ5KGxvY2FsLT5ic3NfbGlzdC5wcmV2LAorCQkJCSBzdHJ1Y3QgaG9zdGFwX2Jzc19pbmZvLCBsaXN0KTsKKwkJbGlzdF9kZWwoJmJzcy0+bGlzdCk7CisJCWxvY2FsLT5udW1fYnNzX2luZm8tLTsKKwl9IGVsc2UgeworCQlic3MgPSAoc3RydWN0IGhvc3RhcF9ic3NfaW5mbyAqKQorCQkJa21hbGxvYyhzaXplb2YoKmJzcyksIEdGUF9BVE9NSUMpOworCQlpZiAoYnNzID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoYnNzLCAwLCBzaXplb2YoKmJzcykpOworCW1lbWNweShic3MtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShic3MtPnNzaWQsIHNzaWQsIHNzaWRfbGVuKTsKKwlic3MtPnNzaWRfbGVuID0gc3NpZF9sZW47CisJbG9jYWwtPm51bV9ic3NfaW5mbysrOworCWxpc3RfYWRkKCZic3MtPmxpc3QsICZsb2NhbC0+YnNzX2xpc3QpOworCXJldHVybiBic3M7Cit9CisKKworc3RhdGljIHZvaWQgX19ob3N0YXBfZXhwaXJlX2Jzcyhsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXN0cnVjdCBob3N0YXBfYnNzX2luZm8gKmJzczsKKworCXdoaWxlIChsb2NhbC0+bnVtX2Jzc19pbmZvID4gMCkgeworCQlic3MgPSBsaXN0X2VudHJ5KGxvY2FsLT5ic3NfbGlzdC5wcmV2LAorCQkJCSBzdHJ1Y3QgaG9zdGFwX2Jzc19pbmZvLCBsaXN0KTsKKwkJaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsIGJzcy0+bGFzdF91cGRhdGUgKyA2MCAqIEhaKSkKKwkJCWJyZWFrOworCisJCWxpc3RfZGVsKCZic3MtPmxpc3QpOworCQlsb2NhbC0+bnVtX2Jzc19pbmZvLS07CisJCWtmcmVlKGJzcyk7CisJfQorfQorCisKKy8qIEJvdGggSUVFRSA4MDIuMTEgQmVhY29uIGFuZCBQcm9iZSBSZXNwb25zZSBmcmFtZXMgaGF2ZSBzaW1pbGFyIHN0cnVjdHVyZSwgc28KKyAqIHRoZSBzYW1lIHJvdXRpbmUgY2FuIGJlIHVzZWQgdG8gcGFyc2UgYm90aCBvZiB0aGVtLiAqLworc3RhdGljIHZvaWQgaG9zdGFwX3J4X3N0YV9iZWFjb24obG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgaW50IHN0eXBlKQoreworCXN0cnVjdCBob3N0YXBfaWVlZTgwMjExX21nbXQgKm1nbXQ7CisJaW50IGxlZnQsIGNoYW4gPSAwOworCXU4ICpwb3M7CisJdTggKnNzaWQgPSBOVUxMLCAqd3BhID0gTlVMTCwgKnJzbiA9IE5VTEw7CisJc2l6ZV90IHNzaWRfbGVuID0gMCwgd3BhX2xlbiA9IDAsIHJzbl9sZW4gPSAwOworCXN0cnVjdCBob3N0YXBfYnNzX2luZm8gKmJzczsKKworCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV9NR01UX0hEUl9MRU4gKyBzaXplb2YobWdtdC0+dS5iZWFjb24pKQorCQlyZXR1cm47CisKKwltZ210ID0gKHN0cnVjdCBob3N0YXBfaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOworCXBvcyA9IG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlOworCWxlZnQgPSBza2ItPmxlbiAtIChwb3MgLSBza2ItPmRhdGEpOworCisJd2hpbGUgKGxlZnQgPj0gMikgeworCQlpZiAoMiArIHBvc1sxXSA+IGxlZnQpCisJCQlyZXR1cm47IC8qIHBhcnNlIGZhaWxlZCAqLworCQlzd2l0Y2ggKCpwb3MpIHsKKwkJY2FzZSBXTEFOX0VJRF9TU0lEOgorCQkJc3NpZCA9IHBvcyArIDI7CisJCQlzc2lkX2xlbiA9IHBvc1sxXTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0dFTkVSSUM6CisJCQlpZiAocG9zWzFdID49IDQgJiYKKwkJCSAgICBwb3NbMl0gPT0gMHgwMCAmJiBwb3NbM10gPT0gMHg1MCAmJgorCQkJICAgIHBvc1s0XSA9PSAweGYyICYmIHBvc1s1XSA9PSAxKSB7CisJCQkJd3BhID0gcG9zOworCQkJCXdwYV9sZW4gPSBwb3NbMV0gKyAyOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfUlNOOgorCQkJcnNuID0gcG9zOworCQkJcnNuX2xlbiA9IHBvc1sxXSArIDI7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9EU19QQVJBTVM6CisJCQlpZiAocG9zWzFdID49IDEpCisJCQkJY2hhbiA9IHBvc1syXTsKKwkJCWJyZWFrOworCQl9CisJCWxlZnQgLT0gMiArIHBvc1sxXTsKKwkJcG9zICs9IDIgKyBwb3NbMV07CisJfQorCisJaWYgKHdwYV9sZW4gPiBNQVhfV1BBX0lFX0xFTikKKwkJd3BhX2xlbiA9IE1BWF9XUEFfSUVfTEVOOworCWlmIChyc25fbGVuID4gTUFYX1dQQV9JRV9MRU4pCisJCXJzbl9sZW4gPSBNQVhfV1BBX0lFX0xFTjsKKwlpZiAoc3NpZF9sZW4gPiBzaXplb2YoYnNzLT5zc2lkKSkKKwkJc3NpZF9sZW4gPSBzaXplb2YoYnNzLT5zc2lkKTsKKworCXNwaW5fbG9jaygmbG9jYWwtPmxvY2spOworCWJzcyA9IF9faG9zdGFwX2dldF9ic3MobG9jYWwsIG1nbXQtPmJzc2lkLCBzc2lkLCBzc2lkX2xlbik7CisJaWYgKGJzcyA9PSBOVUxMKQorCQlic3MgPSBfX2hvc3RhcF9hZGRfYnNzKGxvY2FsLCBtZ210LT5ic3NpZCwgc3NpZCwgc3NpZF9sZW4pOworCWlmIChic3MpIHsKKwkJYnNzLT5sYXN0X3VwZGF0ZSA9IGppZmZpZXM7CisJCWJzcy0+Y291bnQrKzsKKwkJYnNzLT5jYXBhYl9pbmZvID0gbGUxNl90b19jcHUobWdtdC0+dS5iZWFjb24uY2FwYWJfaW5mbyk7CisJCWlmICh3cGEpIHsKKwkJCW1lbWNweShic3MtPndwYV9pZSwgd3BhLCB3cGFfbGVuKTsKKwkJCWJzcy0+d3BhX2llX2xlbiA9IHdwYV9sZW47CisJCX0gZWxzZQorCQkJYnNzLT53cGFfaWVfbGVuID0gMDsKKwkJaWYgKHJzbikgeworCQkJbWVtY3B5KGJzcy0+cnNuX2llLCByc24sIHJzbl9sZW4pOworCQkJYnNzLT5yc25faWVfbGVuID0gcnNuX2xlbjsKKwkJfSBlbHNlCisJCQlic3MtPnJzbl9pZV9sZW4gPSAwOworCQlic3MtPmNoYW4gPSBjaGFuOworCX0KKwlfX2hvc3RhcF9leHBpcmVfYnNzKGxvY2FsKTsKKwlzcGluX3VubG9jaygmbG9jYWwtPmxvY2spOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50Citob3N0YXBfcnhfZnJhbWVfbWdtdChsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgIHN0cnVjdCBob3N0YXBfODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCSAgICAgdTE2IHN0eXBlKQoreworCWlmIChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCQlob3N0YXBfdXBkYXRlX3N0YV9wcyhsb2NhbCwgKHN0cnVjdCBpZWVlODAyMTFfaGRyICopCisJCQkJICAgICBza2ItPmRhdGEpOworCX0KKworCWlmIChsb2NhbC0+aG9zdGFwZCAmJiB0eXBlID09IElFRUU4MDIxMV9GVFlQRV9NR01UKSB7CisJCWlmIChzdHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OICYmCisJCSAgICBsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisJCQkvKiBQcm9jZXNzIGJlYWNvbiBmcmFtZXMgYWxzbyBpbiBrZXJuZWwgZHJpdmVyIHRvCisJCQkgKiB1cGRhdGUgU1RBKEFQKSB0YWJsZSBzdGF0aXN0aWNzICovCisJCQlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoc2tiMikKKwkJCQlob3N0YXBfcngoc2tiMi0+ZGV2LCBza2IyLCByeF9zdGF0cyk7CisJCX0KKworCQkvKiBzZW5kIG1hbmFnZW1lbnQgZnJhbWVzIHRvIHRoZSB1c2VyIHNwYWNlIGRhZW1vbiBmb3IKKwkJICogcHJvY2Vzc2luZyAqLworCQlsb2NhbC0+YXBkZXZzdGF0cy5yeF9wYWNrZXRzKys7CisJCWxvY2FsLT5hcGRldnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlpZiAobG9jYWwtPmFwZGV2ID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCXByaXNtMl9yeF84MDIxMShsb2NhbC0+YXBkZXYsIHNrYiwgcnhfc3RhdHMsIFBSSVNNMl9SWF9NR01UKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCWlmICh0eXBlICE9IElFRUU4MDIxMV9GVFlQRV9NR01UICYmCisJCSAgICB0eXBlICE9IElFRUU4MDIxMV9GVFlQRV9DVEwpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5rbm93biBtYW5hZ2VtZW50IGZyYW1lICIKKwkJCSAgICAgICAiKHR5cGU9MHglMDJ4LCBzdHlwZT0weCUwMngpIGRyb3BwZWRcbiIsCisJCQkgICAgICAgc2tiLT5kZXYtPm5hbWUsIHR5cGUgPj4gMiwgc3R5cGUgPj4gNCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlob3N0YXBfcngoc2tiLT5kZXYsIHNrYiwgcnhfc3RhdHMpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gSUVFRTgwMjExX0ZUWVBFX01HTVQgJiYKKwkJICAgKHN0eXBlID09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04gfHwKKwkJICAgIHN0eXBlID09IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKSkgeworCQlob3N0YXBfcnhfc3RhX2JlYWNvbihsb2NhbCwgc2tiLCBzdHlwZSk7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gSUVFRTgwMjExX0ZUWVBFX01HTVQgJiYKKwkJICAgKHN0eXBlID09IElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQIHx8CisJCSAgICBzdHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQKSkgeworCQkvKiBJZ25vcmUgKFJlKUFzc29jUmVzcCBzaWxlbnRseSBzaW5jZSB0aGVzZSBhcmUgbm90IGN1cnJlbnRseQorCQkgKiBuZWVkZWQgYnV0IGFyZSBzdGlsbCByZWNlaXZlZCB3aGVuIFdQQS9SU04gbW9kZSBpcyBlbmFibGVkLgorCQkgKi8KKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaG9zdGFwX3J4X2ZyYW1lX21nbXQ6IGRyb3BwZWQgdW5oYW5kbGVkIgorCQkgICAgICAgIiBtYW5hZ2VtZW50IGZyYW1lIGluIG5vbi1Ib3N0IEFQIG1vZGUgKHR5cGU9JWQ6JWQpXG4iLAorCQkgICAgICAgc2tiLT5kZXYtPm5hbWUsIHR5cGUgPj4gMiwgc3R5cGUgPj4gNCk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICpwcmlzbTJfcnhfZ2V0X3dkcyhsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJCQkJICAgdTggKmFkZHIpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisKKwlyZWFkX2xvY2tfYmgoJmxvY2FsLT5pZmFjZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHB0ciwgJmxvY2FsLT5ob3N0YXBfaW50ZXJmYWNlcykgeworCQlpZmFjZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSwgbGlzdCk7CisJCWlmIChpZmFjZS0+dHlwZSA9PSBIT1NUQVBfSU5URVJGQUNFX1dEUyAmJgorCQkgICAgbWVtY21wKGlmYWNlLT51Lndkcy5yZW1vdGVfYWRkciwgYWRkciwgRVRIX0FMRU4pID09IDApCisJCQlicmVhazsKKwkJaWZhY2UgPSBOVUxMOworCX0KKwlyZWFkX3VubG9ja19iaCgmbG9jYWwtPmlmYWNlX2xvY2spOworCisJcmV0dXJuIGlmYWNlID8gaWZhY2UtPmRldiA6IE5VTEw7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQKK2hvc3RhcF9yeF9mcmFtZV93ZHMobG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJICAgIHUxNiBmYywgc3RydWN0IG5ldF9kZXZpY2UgKip3ZHMpCit7CisJLyogRklYOiBpcyB0aGlzIHJlYWxseSBzdXBwb3NlZCB0byBhY2NlcHQgV0RTIGZyYW1lcyBvbmx5IGluIE1hc3RlcgorCSAqIG1vZGU/IFdoYXQgYWJvdXQgUmVwZWF0ZXIgb3IgTWFuYWdlZCB3aXRoIFdEUyBmcmFtZXM/ICovCisJaWYgKChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgIT0KKwkgICAgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpICYmCisJICAgIChsb2NhbC0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUiB8fCAhKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykpKQorCQlyZXR1cm4gMDsgLyogbm90IGEgV0RTIGZyYW1lICovCisKKwkvKiBQb3NzaWJsZSBXRFMgZnJhbWU6IGVpdGhlciBJRUVFIDgwMi4xMSBjb21wbGlhbnQgKGlmIEZyb21EUykKKwkgKiBvciBvd24gbm9uLXN0YW5kYXJkIGZyYW1lIHdpdGggNHRoIGFkZHJlc3MgYWZ0ZXIgcGF5bG9hZCAqLworCWlmIChtZW1jbXAoaGRyLT5hZGRyMSwgbG9jYWwtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSAhPSAwICYmCisJICAgIChoZHItPmFkZHIxWzBdICE9IDB4ZmYgfHwgaGRyLT5hZGRyMVsxXSAhPSAweGZmIHx8CisJICAgICBoZHItPmFkZHIxWzJdICE9IDB4ZmYgfHwgaGRyLT5hZGRyMVszXSAhPSAweGZmIHx8CisJICAgICBoZHItPmFkZHIxWzRdICE9IDB4ZmYgfHwgaGRyLT5hZGRyMVs1XSAhPSAweGZmKSkgeworCQkvKiBSQSAob3IgQlNTSUQpIGlzIG5vdCBvdXJzIC0gZHJvcCAqLworCQlQREVCVUcoREVCVUdfRVhUUkEsICIlczogcmVjZWl2ZWQgV0RTIGZyYW1lIHdpdGggIgorCQkgICAgICAgIm5vdCBvd24gb3IgYnJvYWRjYXN0ICVzPSIgTUFDU1RSICJcbiIsCisJCSAgICAgICBsb2NhbC0+ZGV2LT5uYW1lLAorCQkgICAgICAgZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMgPyAiUkEiIDogIkJTU0lEIiwKKwkJICAgICAgIE1BQzJTVFIoaGRyLT5hZGRyMSkpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY2hlY2sgaWYgdGhlIGZyYW1lIGNhbWUgZnJvbSBhIHJlZ2lzdGVyZWQgV0RTIGNvbm5lY3Rpb24gKi8KKwkqd2RzID0gcHJpc20yX3J4X2dldF93ZHMobG9jYWwsIGhkci0+YWRkcjIpOworCWlmICgqd2RzID09IE5VTEwgJiYgZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMgJiYKKwkgICAgKGxvY2FsLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKKwkgICAgICEobG9jYWwtPndkc190eXBlICYgSE9TVEFQX1dEU19BUF9DTElFTlQpIHx8CisJICAgICBtZW1jbXAoaGRyLT5hZGRyMiwgbG9jYWwtPmJzc2lkLCBFVEhfQUxFTikgIT0gMCkpIHsKKwkJLyogcmVxdWlyZSB0aGF0IFdEUyBsaW5rIGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCBUQSBvciB0aGUKKwkJICogZnJhbWUgaXMgZnJvbSBjdXJyZW50IEFQIHdoZW4gdXNpbmcgJ0FQIGNsaWVudCBtb2RlJyAqLworCQlQREVCVUcoREVCVUdfRVhUUkEsICIlczogcmVjZWl2ZWQgV0RTWzQgYWRkcl0gZnJhbWUgIgorCQkgICAgICAgImZyb20gdW5rbm93biBUQT0iIE1BQ1NUUiAiXG4iLAorCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSwgTUFDMlNUUihoZHItPmFkZHIyKSk7CisJCWlmIChsb2NhbC0+YXAgJiYgbG9jYWwtPmFwLT5hdXRvbV9hcF93ZHMpCisJCQlob3N0YXBfd2RzX2xpbmtfb3Blcihsb2NhbCwgaGRyLT5hZGRyMiwgV0RTX0FERCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKndkcyAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSAmJiBsb2NhbC0+YXAgJiYKKwkgICAgaG9zdGFwX2lzX3N0YV9hc3NvYyhsb2NhbC0+YXAsIGhkci0+YWRkcjIpKSB7CisJCS8qIFNUQSBpcyBhY3R1YWxseSBhc3NvY2lhdGVkIHdpdGggdXMgZXZlbiB0aG91Z2ggaXQgaGFzIGEKKwkJICogcmVnaXN0ZXJlZCBXRFMgbGluay4gQXNzdW1lIGl0IGlzIGluICdBUCBjbGllbnQnIG1vZGUuCisJCSAqIFNpbmNlIHRoaXMgaXMgYSAzLWFkZHIgZnJhbWUsIGFzc3VtZSBpdCBpcyBub3QgKGJvZ3VzKSBXRFMKKwkJICogZnJhbWUgYW5kIHByb2Nlc3MgaXQgbGlrZSBhbnkgbm9ybWFsIFRvRFMgZnJhbWUgZnJvbQorCQkgKiBhc3NvY2lhdGVkIFNUQS4gKi8KKwkJKndkcyA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBob3N0YXBfaXNfZWFwb2xfZnJhbWUobG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPmRldjsKKwl1MTYgZmMsIGV0aGVydHlwZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXU4ICpwb3M7CisKKwlpZiAoc2tiLT5sZW4gPCAyNCkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCisJLyogY2hlY2sgdGhhdCB0aGUgZnJhbWUgaXMgdW5pY2FzdCBmcmFtZSB0byB1cyAqLworCWlmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJICAgIElFRUU4MDIxMV9GQ1RMX1RPRFMgJiYKKwkgICAgbWVtY21wKGhkci0+YWRkcjEsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwICYmCisJICAgIG1lbWNtcChoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkvKiBUb0RTIGZyYW1lIHdpdGggb3duIGFkZHIgQlNTSUQgYW5kIERBICovCisJfSBlbHNlIGlmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJCSAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyAmJgorCQkgICBtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJLyogRnJvbURTIGZyYW1lIHdpdGggb3duIGFkZHIgYXMgREEgKi8KKwl9IGVsc2UKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2tiLT5sZW4gPCAyNCArIDgpCisJCXJldHVybiAwOworCisJLyogY2hlY2sgZm9yIHBvcnQgYWNjZXNzIGVudGl0eSBFdGhlcm5ldCB0eXBlICovCisJcG9zID0gc2tiLT5kYXRhICsgMjQ7CisJZXRoZXJ0eXBlID0gKHBvc1s2XSA8PCA4KSB8IHBvc1s3XTsKKwlpZiAoZXRoZXJ0eXBlID09IEVUSF9QX1BBRSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citob3N0YXBfcnhfZnJhbWVfZGVjcnlwdChsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCWludCByZXMsIGhkcmxlbjsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJaGRybGVuID0gaG9zdGFwXzgwMjExX2dldF9oZHJsZW4obGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKTsKKworCWlmIChsb2NhbC0+dGtpcF9jb3VudGVybWVhc3VyZXMgJiYKKwkgICAgc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJUS0lQIikgPT0gMCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRLSVAgY291bnRlcm1lYXN1cmVzOiBkcm9wcGVkICIKKwkJCSAgICAgICAicmVjZWl2ZWQgcGFja2V0IGZyb20gIiBNQUNTVFIgIlxuIiwKKwkJCSAgICAgICBsb2NhbC0+ZGV2LT5uYW1lLCBNQUMyU1RSKGhkci0+YWRkcjIpKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gY3J5cHQtPm9wcy0+ZGVjcnlwdF9tcGR1KHNrYiwgaGRybGVuLCBjcnlwdC0+cHJpdik7CisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkZWNyeXB0aW9uIGZhaWxlZCAoU0E9IiBNQUNTVFIKKwkJICAgICAgICIpIHJlcz0lZFxuIiwKKwkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUsIE1BQzJTVFIoaGRyLT5hZGRyMiksIHJlcyk7CisJCWxvY2FsLT5jb21tX3RhbGxpZXMucnhfZGlzY2FyZHNfd2VwX3VuZGVjcnlwdGFibGUrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiByZXM7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgaW5saW5lIGludAoraG9zdGFwX3J4X2ZyYW1lX2RlY3J5cHRfbXNkdShsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBpbnQga2V5aWR4LCBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0KQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJaW50IHJlcywgaGRybGVuOworCisJaWYgKGNyeXB0ID09IE5VTEwgfHwgY3J5cHQtPm9wcy0+ZGVjcnlwdF9tc2R1ID09IE5VTEwpCisJCXJldHVybiAwOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwloZHJsZW4gPSBob3N0YXBfODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpOworCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gY3J5cHQtPm9wcy0+ZGVjcnlwdF9tc2R1KHNrYiwga2V5aWR4LCBoZHJsZW4sIGNyeXB0LT5wcml2KTsKKwlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKKwlpZiAocmVzIDwgMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1TRFUgZGVjcnlwdGlvbi9NSUMgdmVyaWZpY2F0aW9uIGZhaWxlZCIKKwkJICAgICAgICIgKFNBPSIgTUFDU1RSICIga2V5aWR4PSVkKVxuIiwKKwkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUsIE1BQzJTVFIoaGRyLT5hZGRyMiksIGtleWlkeCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBBbGwgcmVjZWl2ZWQgZnJhbWVzIGFyZSBzZW50IHRvIHRoaXMgZnVuY3Rpb24uIEBza2IgY29udGFpbnMgdGhlIGZyYW1lIGluCisgKiBJRUVFIDgwMi4xMSBmb3JtYXQsIGkuZS4sIGluIHRoZSBmb3JtYXQgaXQgd2FzIHNlbnQgb3ZlciBhaXIuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKS4gKi8KK3ZvaWQgaG9zdGFwXzgwMjExX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgc3RydWN0IGhvc3RhcF84MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXRzKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJc2l6ZV90IGhkcmxlbjsKKwl1MTYgZmMsIHR5cGUsIHN0eXBlLCBzYzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqd2RzID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisJdW5zaWduZWQgaW50IGZyYWc7CisJdTggKnBheWxvYWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBOVUxMOworCXUxNiBldGhlcnR5cGU7CisJaW50IGZyYW1lX2F1dGhvcml6ZWQgPSAwOworCWludCBmcm9tX2Fzc29jX2FwID0gMDsKKwl1OCBkc3RbRVRIX0FMRU5dOworCXU4IHNyY1tFVEhfQUxFTl07CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCA9IE5VTEw7CisJdm9pZCAqc3RhID0gTlVMTDsKKwlpbnQga2V5aWR4ID0gMDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKwlpZmFjZS0+c3RhdHMucnhfcGFja2V0cysrOworCWlmYWNlLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qIGRldiBpcyB0aGUgbWFzdGVyIHJhZGlvIGRldmljZTsgY2hhbmdlIHRoaXMgdG8gYmUgdGhlIGRlZmF1bHQKKwkgKiB2aXJ0dWFsIGludGVyZmFjZSAodGhpcyBtYXkgYmUgY2hhbmdlZCB0byBXRFMgZGV2aWNlIGJlbG93KSAqLworCWRldiA9IGxvY2FsLT5kZGV2OworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJc3RhdHMgPSBob3N0YXBfZ2V0X3N0YXRzKGRldik7CisKKwlpZiAoc2tiLT5sZW4gPCAxMCkKKwkJZ290byByeF9kcm9wcGVkOworCisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOworCXN0eXBlID0gV0xBTl9GQ19HRVRfU1RZUEUoZmMpOworCXNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKwlmcmFnID0gV0xBTl9HRVRfU0VRX0ZSQUcoc2MpOworCWhkcmxlbiA9IGhvc3RhcF84MDIxMV9nZXRfaGRybGVuKGZjKTsKKworCS8qIFB1dCB0aGlzIGNvZGUgaGVyZSBzbyB0aGF0IHdlIGF2b2lkIGR1cGxpY2F0aW5nIGl0IGluIGFsbAorCSAqIFJ4IHBhdGhzLiAtIEplYW4gSUkgKi8KKyNpZmRlZiBJV19XSVJFTEVTU19TUFkJCS8qIGRlZmluZWQgaW4gaXdfaGFuZGxlci5oICovCisJLyogSWYgc3B5IG1vbml0b3Jpbmcgb24gKi8KKwlpZiAoaWZhY2UtPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSB7CisJCXN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKwkJd3N0YXRzLmxldmVsID0gcnhfc3RhdHMtPnNpZ25hbDsKKwkJd3N0YXRzLm5vaXNlID0gcnhfc3RhdHMtPm5vaXNlOworCQl3c3RhdHMudXBkYXRlZCA9IDY7CS8qIE5vIHF1YWwgdmFsdWUgKi8KKwkJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJCXdpcmVsZXNzX3NweV91cGRhdGUoZGV2LCBoZHItPmFkZHIyLCAmd3N0YXRzKTsKKwl9CisjZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCisJaG9zdGFwX3VwZGF0ZV9yeF9zdGF0cyhsb2NhbC0+YXAsIGhkciwgcnhfc3RhdHMpOworCisJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgeworCQltb25pdG9yX3J4KGRldiwgc2tiLCByeF9zdGF0cyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobG9jYWwtPmhvc3RfZGVjcnlwdCkgeworCQlpbnQgaWR4ID0gMDsKKwkJaWYgKHNrYi0+bGVuID49IGhkcmxlbiArIDMpCisJCQlpZHggPSBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNjsKKwkJY3J5cHQgPSBsb2NhbC0+Y3J5cHRbaWR4XTsKKwkJc3RhID0gTlVMTDsKKworCQkvKiBVc2Ugc3RhdGlvbiBzcGVjaWZpYyBrZXkgdG8gb3ZlcnJpZGUgZGVmYXVsdCBrZXlzIGlmIHRoZQorCQkgKiByZWNlaXZlciBhZGRyZXNzIGlzIGEgdW5pY2FzdCBhZGRyZXNzICgiaW5kaXZpZHVhbCBSQSIpLiBJZgorCQkgKiBiY3J4X3N0YV9rZXkgcGFyYW1ldGVyIGlzIHNldCwgc3RhdGlvbiBzcGVjaWZpYyBrZXkgaXMgdXNlZAorCQkgKiBldmVuIHdpdGggYnJvYWQvbXVsdGljYXN0IHRhcmdldHMgKHRoaXMgaXMgYWdhaW5zdCBJRUVFCisJCSAqIDgwMi4xMSwgYnV0IG1ha2VzIGl0IGVhc2llciB0byB1c2UgZGlmZmVyZW50IGtleXMgd2l0aAorCQkgKiBzdGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IFdFUCBrZXkgbWFwcGluZykuICovCisKKwkJaWYgKCEoaGRyLT5hZGRyMVswXSAmIDB4MDEpIHx8IGxvY2FsLT5iY3J4X3N0YV9rZXkpCisJCQkodm9pZCkgaG9zdGFwX2hhbmRsZV9zdGFfY3J5cHRvKGxvY2FsLCBoZHIsICZjcnlwdCwKKwkJCQkJCQkmc3RhKTsKKworCQkvKiBhbGxvdyBOVUxMIGRlY3J5cHQgdG8gaW5kaWNhdGUgYW4gc3RhdGlvbiBzcGVjaWZpYyBvdmVycmlkZQorCQkgKiBmb3IgZGVmYXVsdCBlbmNyeXB0aW9uICovCisJCWlmIChjcnlwdCAmJiAoY3J5cHQtPm9wcyA9PSBOVUxMIHx8CisJCQkgICAgICBjcnlwdC0+b3BzLT5kZWNyeXB0X21wZHUgPT0gTlVMTCkpCisJCQljcnlwdCA9IE5VTEw7CisKKwkJaWYgKCFjcnlwdCAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpKSB7CisjaWYgMAorCQkJLyogVGhpcyBzZWVtcyB0byBiZSB0cmlnZ2VyZWQgYnkgc29tZSAobXVsdGljYXN0PykKKwkJCSAqIGZyYW1lcyBmcm9tIG90aGVyIHRoYW4gY3VycmVudCBCU1MsIHNvIGp1c3QgZHJvcCB0aGUKKwkJCSAqIGZyYW1lcyBzaWxlbnRseSBpbnN0ZWFkIG9mIGZpbGxpbmcgc3lzdGVtIGxvZyB3aXRoCisJCQkgKiB0aGVzZSByZXBvcnRzLiAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBXRVAgZGVjcnlwdGlvbiBmYWlsZWQgKG5vdCBzZXQpIgorCQkJICAgICAgICIgKFNBPSIgTUFDU1RSICIpXG4iLAorCQkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUsIE1BQzJTVFIoaGRyLT5hZGRyMikpOworI2VuZGlmCisJCQlsb2NhbC0+Y29tbV90YWxsaWVzLnJ4X2Rpc2NhcmRzX3dlcF91bmRlY3J5cHRhYmxlKys7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwl9CisKKwlpZiAodHlwZSAhPSBJRUVFODAyMTFfRlRZUEVfREFUQSkgeworCQlpZiAodHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfTUdNVCAmJgorCQkgICAgc3R5cGUgPT0gSUVFRTgwMjExX1NUWVBFX0FVVEggJiYKKwkJICAgIGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEICYmIGxvY2FsLT5ob3N0X2RlY3J5cHQgJiYKKwkJICAgIChrZXlpZHggPSBob3N0YXBfcnhfZnJhbWVfZGVjcnlwdChsb2NhbCwgc2tiLCBjcnlwdCkpIDwgMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gZGVjcnlwdCBtZ210OjphdXRoICIKKwkJCSAgICAgICAiZnJvbSAiIE1BQ1NUUiAiXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgTUFDMlNUUihoZHItPmFkZHIyKSk7CisJCQkvKiBUT0RPOiBjb3VsZCBpbmZvcm0gaG9zdGFwZCBhYm91dCB0aGlzIHNvIHRoYXQgaXQKKwkJCSAqIGNvdWxkIHNlbmQgYXV0aCBmYWlsdXJlIHJlcG9ydCAqLworCQkJZ290byByeF9kcm9wcGVkOworCQl9CisKKwkJaWYgKGhvc3RhcF9yeF9mcmFtZV9tZ210KGxvY2FsLCBza2IsIHJ4X3N0YXRzLCB0eXBlLCBzdHlwZSkpCisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCWVsc2UKKwkJCWdvdG8gcnhfZXhpdDsKKwl9CisKKwkvKiBEYXRhIGZyYW1lIC0gZXh0cmFjdCBzcmMvZHN0IGFkZHJlc3NlcyAqLworCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwlzd2l0Y2ggKGZjICYgKElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFMpKSB7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFM6CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyMywgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOKQorCQkJZ290byByeF9kcm9wcGVkOworCQltZW1jcHkoZHN0LCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjQsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQltZW1jcHkoZHN0LCBoZHItPmFkZHIxLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGhvc3RhcF9yeF9mcmFtZV93ZHMobG9jYWwsIGhkciwgZmMsICZ3ZHMpKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJaWYgKHdkcykgeworCQlza2ItPmRldiA9IGRldiA9IHdkczsKKwkJc3RhdHMgPSBob3N0YXBfZ2V0X3N0YXRzKGRldik7CisJfQorCisJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF3ZHMgJiYKKwkgICAgKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PQorCSAgICBJRUVFODAyMTFfRkNUTF9GUk9NRFMgJiYKKwkgICAgbG9jYWwtPnN0YWRldiAmJgorCSAgICBtZW1jbXAoaGRyLT5hZGRyMiwgbG9jYWwtPmFzc29jX2FwX2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJCS8qIEZyYW1lIGZyb20gQlNTSUQgb2YgdGhlIEFQIGZvciB3aGljaCB3ZSBhcmUgYSBjbGllbnQgKi8KKwkJc2tiLT5kZXYgPSBkZXYgPSBsb2NhbC0+c3RhZGV2OworCQlzdGF0cyA9IGhvc3RhcF9nZXRfc3RhdHMoZGV2KTsKKwkJZnJvbV9hc3NvY19hcCA9IDE7CisJfQorCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCWlmICgobG9jYWwtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgfHwKKwkgICAgIGxvY2FsLT5pd19tb2RlID09IElXX01PREVfUkVQRUFUKSAmJgorCSAgICAhZnJvbV9hc3NvY19hcCkgeworCQlzd2l0Y2ggKGhvc3RhcF9oYW5kbGVfc3RhX3J4KGxvY2FsLCBkZXYsIHNrYiwgcnhfc3RhdHMsCisJCQkJCSAgICAgd2RzICE9IE5VTEwpKSB7CisJCWNhc2UgQVBfUlhfQ09OVElOVUVfTk9UX0FVVEhPUklaRUQ6CisJCQlmcmFtZV9hdXRob3JpemVkID0gMDsKKwkJCWJyZWFrOworCQljYXNlIEFQX1JYX0NPTlRJTlVFOgorCQkJZnJhbWVfYXV0aG9yaXplZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBBUF9SWF9EUk9QOgorCQkJZ290byByeF9kcm9wcGVkOworCQljYXNlIEFQX1JYX0VYSVQ6CisJCQlnb3RvIHJ4X2V4aXQ7CisJCX0KKwl9CisKKwkvKiBOdWxsZnVuYyBmcmFtZXMgbWF5IGhhdmUgUFMtYml0IHNldCwgc28gdGhleSBtdXN0IGJlIHBhc3NlZCB0bworCSAqIGhvc3RhcF9oYW5kbGVfc3RhX3J4KCkgYmVmb3JlIGJlaW5nIGRyb3BwZWQgaGVyZS4gKi8KKwlpZiAoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEEgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMICYmCisJICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTCkgeworCQlpZiAoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX05VTExGVU5DKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSWDogZHJvcHBlZCBkYXRhIGZyYW1lICIKKwkJCSAgICAgICAid2l0aCBubyBkYXRhICh0eXBlPTB4JTAyeCwgc3VidHlwZT0weCUwMngpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgdHlwZSA+PiAyLCBzdHlwZSA+PiA0KTsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKworCS8qIHNrYjogaGRyICsgKHBvc3NpYmx5IGZyYWdtZW50ZWQsIHBvc3NpYmx5IGVuY3J5cHRlZCkgcGF5bG9hZCAqLworCisJaWYgKGxvY2FsLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSAmJgorCSAgICAoa2V5aWR4ID0gaG9zdGFwX3J4X2ZyYW1lX2RlY3J5cHQobG9jYWwsIHNrYiwgY3J5cHQpKSA8IDApCisJCWdvdG8gcnhfZHJvcHBlZDsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCisJLyogc2tiOiBoZHIgKyAocG9zc2libHkgZnJhZ21lbnRlZCkgcGxhaW50ZXh0IHBheWxvYWQgKi8KKworCWlmIChsb2NhbC0+aG9zdF9kZWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCkgJiYKKwkgICAgKGZyYWcgIT0gMCB8fCAoZmMgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpKSkgeworCQlpbnQgZmxlbjsKKwkJc3RydWN0IHNrX2J1ZmYgKmZyYWdfc2tiID0KKwkJCXByaXNtMl9mcmFnX2NhY2hlX2dldChsb2NhbCwgaGRyKTsKKwkJaWYgKCFmcmFnX3NrYikgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSeCBjYW5ub3QgZ2V0IHNrYiBmcm9tICIKKwkJCSAgICAgICAiZnJhZ21lbnQgY2FjaGUgKG1vcmVmcmFnPSVkIHNlcT0ldSBmcmFnPSV1KVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIChmYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykgIT0gMCwKKwkJCSAgICAgICBXTEFOX0dFVF9TRVFfU0VRKHNjKSA+PiA0LCBmcmFnKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCisJCWZsZW4gPSBza2ItPmxlbjsKKwkJaWYgKGZyYWcgIT0gMCkKKwkJCWZsZW4gLT0gaGRybGVuOworCisJCWlmIChmcmFnX3NrYi0+dGFpbCArIGZsZW4gPiBmcmFnX3NrYi0+ZW5kKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaG9zdCBkZWNyeXB0ZWQgYW5kICIKKwkJCSAgICAgICAicmVhc3NlbWJsZWQgZnJhbWUgZGlkIG5vdCBmaXQgc2tiXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlwcmlzbTJfZnJhZ19jYWNoZV9pbnZhbGlkYXRlKGxvY2FsLCBoZHIpOworCQkJZ290byByeF9kcm9wcGVkOworCQl9CisKKwkJaWYgKGZyYWcgPT0gMCkgeworCQkJLyogY29weSBmaXJzdCBmcmFnbWVudCAoaW5jbHVkaW5nIGZ1bGwgaGVhZGVycykgaW50bworCQkJICogYmVnaW5uaW5nIG9mIHRoZSBmcmFnbWVudCBjYWNoZSBza2IgKi8KKwkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhLCBmbGVuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGFwcGVuZCBmcmFtZSBwYXlsb2FkIHRvIHRoZSBlbmQgb2YgdGhlIGZyYWdtZW50CisJCQkgKiBjYWNoZSBza2IgKi8KKwkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhICsgaGRybGVuLAorCQkJICAgICAgIGZsZW4pOworCQl9CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJc2tiID0gTlVMTDsKKworCQlpZiAoZmMgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpIHsKKwkJCS8qIG1vcmUgZnJhZ21lbnRzIGV4cGVjdGVkIC0gbGVhdmUgdGhlIHNrYiBpbiBmcmFnbWVudAorCQkJICogY2FjaGUgZm9yIG5vdzsgaXQgd2lsbCBiZSBkZWxpdmVyZWQgdG8gdXBwZXIgbGF5ZXJzCisJCQkgKiBhZnRlciBhbGwgZnJhZ21lbnRzIGhhdmUgYmVlbiByZWNlaXZlZCAqLworCQkJZ290byByeF9leGl0OworCQl9CisKKwkJLyogdGhpcyB3YXMgdGhlIGxhc3QgZnJhZ21lbnQgYW5kIHRoZSBmcmFtZSB3aWxsIGJlCisJCSAqIGRlbGl2ZXJlZCwgc28gcmVtb3ZlIHNrYiBmcm9tIGZyYWdtZW50IGNhY2hlICovCisJCXNrYiA9IGZyYWdfc2tiOworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCQlwcmlzbTJfZnJhZ19jYWNoZV9pbnZhbGlkYXRlKGxvY2FsLCBoZHIpOworCX0KKworCS8qIHNrYjogaGRyICsgKHBvc3NpYmxlIHJlYXNzZW1ibGVkKSBmdWxsIE1TRFUgcGF5bG9hZDsgcG9zc2libHkgc3RpbGwKKwkgKiBlbmNyeXB0ZWQvYXV0aGVudGljYXRlZCAqLworCisJaWYgKGxvY2FsLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSAmJgorCSAgICBob3N0YXBfcnhfZnJhbWVfZGVjcnlwdF9tc2R1KGxvY2FsLCBza2IsIGtleWlkeCwgY3J5cHQpKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSAmJiAhbG9jYWwtPm9wZW5fd2VwKSB7CisJCWlmIChsb2NhbC0+aWVlZV84MDJfMXggJiYKKwkJICAgIGhvc3RhcF9pc19lYXBvbF9mcmFtZShsb2NhbCwgc2tiKSkgeworCQkJLyogcGFzcyB1bmVuY3J5cHRlZCBFQVBPTCBmcmFtZXMgZXZlbiBpZiBlbmNyeXB0aW9uIGlzCisJCQkgKiBjb25maWd1cmVkICovCisJCQlQREVCVUcoREVCVUdfRVhUUkEyLCAiJXM6IFJYOiBJRUVFIDgwMi4xWCAtIHBhc3NpbmcgIgorCQkJICAgICAgICJ1bmVuY3J5cHRlZCBFQVBPTCBmcmFtZVxuIiwgbG9jYWwtPmRldi0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVuY3J5cHRpb24gY29uZmlndXJlZCwgYnV0IFJYICIKKwkJCSAgICAgICAiZnJhbWUgbm90IGVuY3J5cHRlZCAoU0E9IiBNQUNTVFIgIilcbiIsCisJCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSwgTUFDMlNUUihoZHItPmFkZHIyKSk7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwl9CisKKwlpZiAobG9jYWwtPmRyb3BfdW5lbmNyeXB0ZWQgJiYgIShmYyAmIElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCkgJiYKKwkgICAgIWhvc3RhcF9pc19lYXBvbF9mcmFtZShsb2NhbCwgc2tiKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRyb3BwZWQgdW5lbmNyeXB0ZWQgUlggZGF0YSAiCisJCQkgICAgICAgImZyYW1lIGZyb20gIiBNQUNTVFIgIiAoZHJvcF91bmVuY3J5cHRlZD0xKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIE1BQzJTVFIoaGRyLT5hZGRyMikpOworCQl9CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKwkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBwbGFpbnRleHQgcGF5bG9hZCAqLworCisJcGF5bG9hZCA9IHNrYi0+ZGF0YSArIGhkcmxlbjsKKwlldGhlcnR5cGUgPSAocGF5bG9hZFs2XSA8PCA4KSB8IHBheWxvYWRbN107CisKKwkvKiBJZiBJRUVFIDgwMi4xWCBpcyB1c2VkLCBjaGVjayB3aGV0aGVyIHRoZSBwb3J0IGlzIGF1dGhvcml6ZWQgdG8gc2VuZAorCSAqIHRoZSByZWNlaXZlZCBmcmFtZS4gKi8KKwlpZiAobG9jYWwtPmllZWVfODAyXzF4ICYmIGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCWlmIChldGhlcnR5cGUgPT0gRVRIX1BfUEFFKSB7CisJCQlQREVCVUcoREVCVUdfRVhUUkEyLCAiJXM6IFJYOiBJRUVFIDgwMi4xWCBmcmFtZVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJaWYgKGxvY2FsLT5ob3N0YXBkICYmIGxvY2FsLT5hcGRldikgeworCQkJCS8qIFNlbmQgSUVFRSA4MDIuMVggZnJhbWVzIHRvIHRoZSB1c2VyCisJCQkJICogc3BhY2UgZGFlbW9uIGZvciBwcm9jZXNzaW5nICovCisJCQkJcHJpc20yX3J4XzgwMjExKGxvY2FsLT5hcGRldiwgc2tiLCByeF9zdGF0cywKKwkJCQkJCVBSSVNNMl9SWF9NR01UKTsKKwkJCQlsb2NhbC0+YXBkZXZzdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJbG9jYWwtPmFwZGV2c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJZ290byByeF9leGl0OworCQkJfQorCQl9IGVsc2UgaWYgKCFmcmFtZV9hdXRob3JpemVkKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRyb3BwZWQgZnJhbWUgZnJvbSAiCisJCQkgICAgICAgInVuYXV0aG9yaXplZCBwb3J0IChJRUVFIDgwMi4xWCk6ICIKKwkJCSAgICAgICAiZXRoZXJ0eXBlPTB4JTA0eFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGV0aGVydHlwZSk7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwl9CisKKwkvKiBjb252ZXJ0IGhkciArIHBvc3NpYmxlIExMQyBoZWFkZXJzIGludG8gRXRoZXJuZXQgaGVhZGVyICovCisJaWYgKHNrYi0+bGVuIC0gaGRybGVuID49IDggJiYKKwkgICAgKChtZW1jbXAocGF5bG9hZCwgcmZjMTA0Ml9oZWFkZXIsIDYpID09IDAgJiYKKwkgICAgICBldGhlcnR5cGUgIT0gRVRIX1BfQUFSUCAmJiBldGhlcnR5cGUgIT0gRVRIX1BfSVBYKSB8fAorCSAgICAgbWVtY21wKHBheWxvYWQsIGJyaWRnZV90dW5uZWxfaGVhZGVyLCA2KSA9PSAwKSkgeworCQkvKiByZW1vdmUgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gYW5kCisJCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCisJCXNrYl9wdWxsKHNrYiwgaGRybGVuICsgNik7CisJCW1lbWNweShza2JfcHVzaChza2IsIEVUSF9BTEVOKSwgc3JjLCBFVEhfQUxFTik7CisJCW1lbWNweShza2JfcHVzaChza2IsIEVUSF9BTEVOKSwgZHN0LCBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJdTE2IGxlbjsKKwkJLyogTGVhdmUgRXRoZXJuZXQgaGVhZGVyIHBhcnQgb2YgaGRyIGFuZCBmdWxsIHBheWxvYWQgKi8KKwkJc2tiX3B1bGwoc2tiLCBoZHJsZW4pOworCQlsZW4gPSBodG9ucyhza2ItPmxlbik7CisJCW1lbWNweShza2JfcHVzaChza2IsIDIpLCAmbGVuLCAyKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBzcmMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBkc3QsIEVUSF9BTEVOKTsKKwl9CisKKwlpZiAod2RzICYmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJCSAgICBJRUVFODAyMTFfRkNUTF9UT0RTKSAmJgorCSAgICBza2ItPmxlbiA+PSBFVEhfSExFTiArIEVUSF9BTEVOKSB7CisJCS8qIE5vbi1zdGFuZGFyZCBmcmFtZTogZ2V0IGFkZHI0IGZyb20gaXRzIGJvZ3VzIGxvY2F0aW9uIGFmdGVyCisJCSAqIHRoZSBwYXlsb2FkICovCisJCW1lbWNweShza2ItPmRhdGEgKyBFVEhfQUxFTiwKKwkJICAgICAgIHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIEVUSF9BTEVOKTsKKwl9CisKKwlzdGF0cy0+cnhfcGFja2V0cysrOworCXN0YXRzLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworCWlmIChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiAmJiAhd2RzICYmCisJICAgIGxvY2FsLT5hcC0+YnJpZGdlX3BhY2tldHMpIHsKKwkJaWYgKGRzdFswXSAmIDB4MDEpIHsKKwkJCS8qIGNvcHkgbXVsdGljYXN0IGZyYW1lIGJvdGggdG8gdGhlIGhpZ2hlciBsYXllcnMgYW5kCisJCQkgKiB0byB0aGUgd2lyZWxlc3MgbWVkaWEgKi8KKwkJCWxvY2FsLT5hcC0+YnJpZGdlZF9tdWx0aWNhc3QrKzsKKwkJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IyID09IE5VTEwpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBza2JfY2xvbmUgZmFpbGVkIGZvciAiCisJCQkJICAgICAgICJtdWx0aWNhc3QgZnJhbWVcbiIsIGRldi0+bmFtZSk7CisJCX0gZWxzZSBpZiAoaG9zdGFwX2lzX3N0YV9hdXRob3JpemVkKGxvY2FsLT5hcCwgZHN0KSkgeworCQkJLyogc2VuZCBmcmFtZSBkaXJlY3RseSB0byB0aGUgYXNzb2NpYXRlZCBTVEEgdXNpbmcKKwkJCSAqIHdpcmVsZXNzIG1lZGlhIGFuZCBub3QgcGFzc2luZyB0byBoaWdoZXIgbGF5ZXJzICovCisJCQlsb2NhbC0+YXAtPmJyaWRnZWRfdW5pY2FzdCsrOworCQkJc2tiMiA9IHNrYjsKKwkJCXNrYiA9IE5VTEw7CisJCX0KKwl9CisKKwlpZiAoc2tiMiAhPSBOVUxMKSB7CisJCS8qIHNlbmQgdG8gd2lyZWxlc3MgbWVkaWEgKi8KKwkJc2tiMi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8zKTsKKwkJc2tiMi0+bWFjLnJhdyA9IHNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGE7CisJCS8qIHNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGEgKyBFVEhfSExFTjsgKi8KKwkJc2tiMi0+ZGV2ID0gZGV2OworCQlkZXZfcXVldWVfeG1pdChza2IyKTsKKwl9CisKKwlpZiAoc2tiKSB7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOworCQlza2ItPmRldiA9IGRldjsKKwkJbmV0aWZfcngoc2tiKTsKKwl9CisKKyByeF9leGl0OgorCWlmIChzdGEpCisJCWhvc3RhcF9oYW5kbGVfc3RhX3JlbGVhc2Uoc3RhKTsKKwlyZXR1cm47CisKKyByeF9kcm9wcGVkOgorCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJZ290byByeF9leGl0OworfQorCisKK0VYUE9SVF9TWU1CT0woaG9zdGFwXzgwMjExX3J4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzU4MDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV90eC5jCkBAIC0wLDAgKzEsNTI0IEBACit2b2lkIGhvc3RhcF9kdW1wX3R4XzgwMjExKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwl1MTYgZmM7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUWCBsZW49JWQgamlmZmllcz0lbGRcbiIsCisJICAgICAgIG5hbWUsIHNrYi0+bGVuLCBqaWZmaWVzKTsKKworCWlmIChza2ItPmxlbiA8IDIpCisJCXJldHVybjsKKworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXByaW50ayhLRVJOX0RFQlVHICIgICBGQz0weCUwNHggKHR5cGU9JWQ6JWQpJXMlcyIsCisJICAgICAgIGZjLCBXTEFOX0ZDX0dFVF9UWVBFKGZjKSA+PiAyLCBXTEFOX0ZDX0dFVF9TVFlQRShmYykgPj4gNCwKKwkgICAgICAgZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTID8gIiBbVG9EU10iIDogIiIsCisJICAgICAgIGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTID8gIiBbRnJvbURTXSIgOiAiIik7CisKKwlpZiAoc2tiLT5sZW4gPCBJRUVFODAyMTFfREFUQV9IRFIzX0xFTikgeworCQlwcmludGsoIlxuIik7CisJCXJldHVybjsKKwl9CisKKwlwcmludGsoIiBkdXI9MHglMDR4IHNlcT0weCUwNHhcbiIsIGxlMTZfdG9fY3B1KGhkci0+ZHVyYXRpb25faWQpLAorCSAgICAgICBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIgICBBMT0iIE1BQ1NUUiAiIEEyPSIgTUFDU1RSICIgQTM9IiBNQUNTVFIsCisJICAgICAgIE1BQzJTVFIoaGRyLT5hZGRyMSksIE1BQzJTVFIoaGRyLT5hZGRyMiksIE1BQzJTVFIoaGRyLT5hZGRyMykpOworCWlmIChza2ItPmxlbiA+PSAzMCkKKwkJcHJpbnRrKCIgQTQ9IiBNQUNTVFIsIE1BQzJTVFIoaGRyLT5hZGRyNCkpOworCXByaW50aygiXG4iKTsKK30KKworCisvKiBoYXJkX3N0YXJ0X3htaXQgZnVuY3Rpb24gZm9yIGRhdGEgaW50ZXJmYWNlcyAod2xhbiMsIHdsYW4jd2RzIywgd2xhbiNzdGEpCisgKiBDb252ZXJ0IEV0aGVybmV0IGhlYWRlciBpbnRvIGEgc3VpdGFibGUgSUVFRSA4MDIuMTEgaGVhZGVyIGRlcGVuZGluZyBvbgorICogZGV2aWNlIGNvbmZpZ3VyYXRpb24uICovCitpbnQgaG9zdGFwX2RhdGFfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCBuZWVkX2hlYWRyb29tLCBuZWVkX3RhaWxyb29tID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciBoZHI7CisJdTE2IGZjLCBldGhlcnR5cGUgPSAwOworCWVudW0geworCQlXRFNfTk8gPSAwLCBXRFNfT1dOX0ZSQU1FLCBXRFNfQ09NUExJQU5UX0ZSQU1FCisJfSB1c2Vfd2RzID0gV0RTX05POworCXU4ICplbmNhcHNfZGF0YTsKKwlpbnQgaGRyX2xlbiwgZW5jYXBzX2xlbiwgc2tpcF9oZWFkZXJfYnl0ZXM7CisJaW50IHRvX2Fzc29jX2FwID0gMDsKKwlzdHJ1Y3QgaG9zdGFwX3NrYl90eF9kYXRhICptZXRhOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKHNrYi0+bGVuIDwgRVRIX0hMRU4pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBob3N0YXBfZGF0YV9zdGFydF94bWl0OiBzaG9ydCBza2IgIgorCQkgICAgICAgIihsZW49JWQpXG4iLCBkZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCWlmIChsb2NhbC0+ZGRldiAhPSBkZXYpIHsKKwkJdXNlX3dkcyA9IChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiAmJgorCQkJICAgIShsb2NhbC0+d2RzX3R5cGUgJiBIT1NUQVBfV0RTX1NUQU5EQVJEX0ZSQU1FKSkgPworCQkJV0RTX09XTl9GUkFNRSA6IFdEU19DT01QTElBTlRfRlJBTUU7CisJCWlmIChkZXYgPT0gbG9jYWwtPnN0YWRldikgeworCQkJdG9fYXNzb2NfYXAgPSAxOworCQkJdXNlX3dkcyA9IFdEU19OTzsKKwkJfSBlbHNlIGlmIChkZXYgPT0gbG9jYWwtPmFwZGV2KSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHByaXNtMl90eDogdHJ5aW5nIHRvIHVzZSAiCisJCQkgICAgICAgIkFQIGRldmljZSB3aXRoIEV0aGVybmV0IG5ldCBkZXZcbiIsIGRldi0+bmFtZSk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfUkVQRUFUKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHByaXNtMl90eDogdHJ5aW5nIHRvIHVzZSAiCisJCQkgICAgICAgIm5vbi1XRFMgbGluayBpbiBSZXBlYXRlciBtb2RlXG4iLCBkZXYtPm5hbWUpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBICYmCisJCQkgICAobG9jYWwtPndkc190eXBlICYgSE9TVEFQX1dEU19BUF9DTElFTlQpICYmCisJCQkgICBtZW1jbXAoc2tiLT5kYXRhICsgRVRIX0FMRU4sIGRldi0+ZGV2X2FkZHIsCisJCQkJICBFVEhfQUxFTikgIT0gMCkgeworCQkJLyogQVAgY2xpZW50IG1vZGU6IHNlbmQgZnJhbWVzIHdpdGggZm9yZWlnbiBzcmMgYWRkcgorCQkJICogdXNpbmcgNC1hZGRyIFdEUyBmcmFtZXMgKi8KKwkJCXVzZV93ZHMgPSBXRFNfQ09NUExJQU5UX0ZSQU1FOworCQl9CisJfQorCisJLyogSW5jb21pbmcgc2tiLT5kYXRhOiBkc3RfYWRkcls2XSwgc3JjX2FkZHJbNl0sIHByb3RvWzJdLCBwYXlsb2FkCisJICogPT0+CisJICogUHJpc20yIFRYIGZyYW1lIHdpdGggODAyLjExIGhlYWRlcjoKKwkgKiB0eGRlc2MgKGFkZHJlc3Mgb3JkZXIgZGVwZW5kaW5nIG9uIHVzZWQgbW9kZTsgaW5jbHVkZXMgZHN0X2FkZHIgYW5kCisJICogc3JjX2FkZHIpLCBwb3NzaWJsZSBlbmNhcHN1bGF0aW9uIChSRkMxMDQyL0JyaWRnZS1UdW5uZWw7CisJICogcHJvdG9bMl0sIHBheWxvYWQgeywgcG9zc2libGUgYWRkcjRbNl19ICovCisKKwlldGhlcnR5cGUgPSAoc2tiLT5kYXRhWzEyXSA8PCA4KSB8IHNrYi0+ZGF0YVsxM107CisKKwltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOworCisJLyogTGVuZ3RoIG9mIGRhdGEgYWZ0ZXIgSUVFRSA4MDIuMTEgaGVhZGVyICovCisJZW5jYXBzX2RhdGEgPSBOVUxMOworCWVuY2Fwc19sZW4gPSAwOworCXNraXBfaGVhZGVyX2J5dGVzID0gRVRIX0hMRU47CisJaWYgKGV0aGVydHlwZSA9PSBFVEhfUF9BQVJQIHx8IGV0aGVydHlwZSA9PSBFVEhfUF9JUFgpIHsKKwkJZW5jYXBzX2RhdGEgPSBicmlkZ2VfdHVubmVsX2hlYWRlcjsKKwkJZW5jYXBzX2xlbiA9IHNpemVvZihicmlkZ2VfdHVubmVsX2hlYWRlcik7CisJCXNraXBfaGVhZGVyX2J5dGVzIC09IDI7CisJfSBlbHNlIGlmIChldGhlcnR5cGUgPj0gMHg2MDApIHsKKwkJZW5jYXBzX2RhdGEgPSByZmMxMDQyX2hlYWRlcjsKKwkJZW5jYXBzX2xlbiA9IHNpemVvZihyZmMxMDQyX2hlYWRlcik7CisJCXNraXBfaGVhZGVyX2J5dGVzIC09IDI7CisJfQorCisJZmMgPSBJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9TVFlQRV9EQVRBOworCWhkcl9sZW4gPSBJRUVFODAyMTFfREFUQV9IRFIzX0xFTjsKKworCWlmICh1c2Vfd2RzICE9IFdEU19OTykgeworCQkvKiBOb3RlISBQcmlzbTIgc3RhdGlvbiBmaXJtd2FyZSBoYXMgcHJvYmxlbXMgd2l0aCBzZW5kaW5nIHJlYWwKKwkJICogODAyLjExIGZyYW1lcyB3aXRoIGZvdXIgYWRkcmVzc2VzOyB1bnRpbCB0aGVzZSBwcm9ibGVtcyBjYW4KKwkJICogYmUgZml4ZWQgb3Igd29ya2VkIGFyb3VuZCwgNC1hZGRyIGZyYW1lcyBuZWVkZWQgZm9yIFdEUyBhcmUKKwkJICogdXNpbmcgaW5jb21wYXRpYmxlIGZvcm1hdDogRnJvbURTIGZsYWcgaXMgbm90IHNldCBhbmQgdGhlCisJCSAqIGZvdXJ0aCBhZGRyZXNzIGlzIGFkZGVkIGFmdGVyIHRoZSBmcmFtZSBwYXlsb2FkOyBpdCBpcworCQkgKiBhc3N1bWVkLCB0aGF0IHRoZSByZWNlaXZpbmcgc3RhdGlvbiBrbm93cyBob3cgdG8gaGFuZGxlIHRoaXMKKwkJICogZnJhbWUgZm9ybWF0ICovCisKKwkJaWYgKHVzZV93ZHMgPT0gV0RTX0NPTVBMSUFOVF9GUkFNRSkgeworCQkJZmMgfD0gSUVFRTgwMjExX0ZDVExfRlJPTURTIHwgSUVFRTgwMjExX0ZDVExfVE9EUzsKKwkJCS8qIEZyb20mVG8gRFM6IEFkZHIxID0gUkEsIEFkZHIyID0gVEEsIEFkZHIzID0gREEsCisJCQkgKiBBZGRyNCA9IFNBICovCisJCQltZW1jcHkoJmhkci5hZGRyNCwgc2tiLT5kYXRhICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkJCWhkcl9sZW4gKz0gRVRIX0FMRU47CisJCX0gZWxzZSB7CisJCQkvKiBib2d1cyA0LWFkZHIgZm9ybWF0IHRvIHdvcmthcm91bmQgUHJpc20yIHN0YXRpb24KKwkJCSAqIGYvdyBidWcgKi8KKwkJCWZjIHw9IElFRUU4MDIxMV9GQ1RMX1RPRFM7CisJCQkvKiBGcm9tIERTOiBBZGRyMSA9IERBICh1c2VkIGFzIFJBKSwKKwkJCSAqIEFkZHIyID0gQlNTSUQgKHVzZWQgYXMgVEEpLCBBZGRyMyA9IFNBICh1c2VkIGFzIERBKSwKKwkJCSAqLworCisJCQkvKiBTQSBmcm9tIHNrYi0+ZGF0YSArIEVUSF9BTEVOIHdpbGwgYmUgYWRkZWQgYWZ0ZXIKKwkJCSAqIGZyYW1lIHBheWxvYWQ7IHVzZSBoZHIuYWRkcjQgYXMgYSB0ZW1wb3JhcnkgYnVmZmVyCisJCQkgKi8KKwkJCW1lbWNweSgmaGRyLmFkZHI0LCBza2ItPmRhdGEgKyBFVEhfQUxFTiwgRVRIX0FMRU4pOworCQkJbmVlZF90YWlscm9vbSArPSBFVEhfQUxFTjsKKwkJfQorCisJCS8qIHNlbmQgYnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgZnJhbWVzIHRvIGJyb2FkY2FzdCBSQSwgaWYKKwkJICogY29uZmlndXJlZDsgb3RoZXJ3aXNlLCB1c2UgdW5pY2FzdCBSQSBvZiB0aGUgV0RTIGxpbmsgKi8KKwkJaWYgKChsb2NhbC0+d2RzX3R5cGUgJiBIT1NUQVBfV0RTX0JST0FEQ0FTVF9SQSkgJiYKKwkJICAgIHNrYi0+ZGF0YVswXSAmIDB4MDEpCisJCQltZW1zZXQoJmhkci5hZGRyMSwgMHhmZiwgRVRIX0FMRU4pOworCQllbHNlIGlmIChpZmFjZS0+dHlwZSA9PSBIT1NUQVBfSU5URVJGQUNFX1dEUykKKwkJCW1lbWNweSgmaGRyLmFkZHIxLCBpZmFjZS0+dS53ZHMucmVtb3RlX2FkZHIsCisJCQkgICAgICAgRVRIX0FMRU4pOworCQllbHNlCisJCQltZW1jcHkoJmhkci5hZGRyMSwgbG9jYWwtPmJzc2lkLCBFVEhfQUxFTik7CisJCW1lbWNweSgmaGRyLmFkZHIyLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCW1lbWNweSgmaGRyLmFkZHIzLCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKKwl9IGVsc2UgaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF0b19hc3NvY19hcCkgeworCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9GUk9NRFM7CisJCS8qIEZyb20gRFM6IEFkZHIxID0gREEsIEFkZHIyID0gQlNTSUQsIEFkZHIzID0gU0EgKi8KKwkJbWVtY3B5KCZoZHIuYWRkcjEsIHNrYi0+ZGF0YSwgRVRIX0FMRU4pOworCQltZW1jcHkoJmhkci5hZGRyMiwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCQltZW1jcHkoJmhkci5hZGRyMywgc2tiLT5kYXRhICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwl9IGVsc2UgaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgfHwgdG9fYXNzb2NfYXApIHsKKwkJZmMgfD0gSUVFRTgwMjExX0ZDVExfVE9EUzsKKwkJLyogVG8gRFM6IEFkZHIxID0gQlNTSUQsIEFkZHIyID0gU0EsIEFkZHIzID0gREEgKi8KKwkJbWVtY3B5KCZoZHIuYWRkcjEsIHRvX2Fzc29jX2FwID8KKwkJICAgICAgIGxvY2FsLT5hc3NvY19hcF9hZGRyIDogbG9jYWwtPmJzc2lkLCBFVEhfQUxFTik7CisJCW1lbWNweSgmaGRyLmFkZHIyLCBza2ItPmRhdGEgKyBFVEhfQUxFTiwgRVRIX0FMRU4pOworCQltZW1jcHkoJmhkci5hZGRyMywgc2tiLT5kYXRhLCBFVEhfQUxFTik7CisJfSBlbHNlIGlmIChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCS8qIG5vdCBGcm9tL1RvIERTOiBBZGRyMSA9IERBLCBBZGRyMiA9IFNBLCBBZGRyMyA9IEJTU0lEICovCisJCW1lbWNweSgmaGRyLmFkZHIxLCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KCZoZHIuYWRkcjIsIHNrYi0+ZGF0YSArIEVUSF9BTEVOLCBFVEhfQUxFTik7CisJCW1lbWNweSgmaGRyLmFkZHIzLCBsb2NhbC0+YnNzaWQsIEVUSF9BTEVOKTsKKwl9CisKKwloZHIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoZmMpOworCisJc2tiX3B1bGwoc2tiLCBza2lwX2hlYWRlcl9ieXRlcyk7CisJbmVlZF9oZWFkcm9vbSA9IGxvY2FsLT5mdW5jLT5uZWVkX3R4X2hlYWRyb29tICsgaGRyX2xlbiArIGVuY2Fwc19sZW47CisJaWYgKHNrYl90YWlscm9vbShza2IpIDwgbmVlZF90YWlscm9vbSkgeworCQlza2IgPSBza2JfdW5zaGFyZShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCWlmYWNlLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAocHNrYl9leHBhbmRfaGVhZChza2IsIG5lZWRfaGVhZHJvb20sIG5lZWRfdGFpbHJvb20sCisJCQkJICAgICBHRlBfQVRPTUlDKSkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlpZmFjZS0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgbmVlZF9oZWFkcm9vbSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqdG1wID0gc2tiOworCQlza2IgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIG5lZWRfaGVhZHJvb20pOworCQlrZnJlZV9za2IodG1wKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlpZmFjZS0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlza2IgPSBza2JfdW5zaGFyZShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCWlmYWNlLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChlbmNhcHNfZGF0YSkKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgZW5jYXBzX2xlbiksIGVuY2Fwc19kYXRhLCBlbmNhcHNfbGVuKTsKKwltZW1jcHkoc2tiX3B1c2goc2tiLCBoZHJfbGVuKSwgJmhkciwgaGRyX2xlbik7CisJaWYgKHVzZV93ZHMgPT0gV0RTX09XTl9GUkFNRSkgeworCQltZW1jcHkoc2tiX3B1dChza2IsIEVUSF9BTEVOKSwgJmhkci5hZGRyNCwgRVRIX0FMRU4pOworCX0KKworCWlmYWNlLT5zdGF0cy50eF9wYWNrZXRzKys7CisJaWZhY2UtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCW1ldGEgPSAoc3RydWN0IGhvc3RhcF9za2JfdHhfZGF0YSAqKSBza2ItPmNiOworCW1lbXNldChtZXRhLCAwLCBzaXplb2YoKm1ldGEpKTsKKwltZXRhLT5tYWdpYyA9IEhPU1RBUF9TS0JfVFhfREFUQV9NQUdJQzsKKwlpZiAodXNlX3dkcykKKwkJbWV0YS0+ZmxhZ3MgfD0gSE9TVEFQX1RYX0ZMQUdTX1dEUzsKKwltZXRhLT5ldGhlcnR5cGUgPSBldGhlcnR5cGU7CisJbWV0YS0+aWZhY2UgPSBpZmFjZTsKKworCS8qIFNlbmQgSUVFRSA4MDIuMTEgZW5jYXBzdWxhdGVkIGZyYW1lIHVzaW5nIHRoZSBtYXN0ZXIgcmFkaW8gZGV2aWNlICovCisJc2tiLT5kZXYgPSBsb2NhbC0+ZGV2OworCWRldl9xdWV1ZV94bWl0KHNrYik7CisJcmV0dXJuIDA7Cit9CisKKworLyogaGFyZF9zdGFydF94bWl0IGZ1bmN0aW9uIGZvciBob3N0YXBkIHdsYW4jYXAgaW50ZXJmYWNlcyAqLworaW50IGhvc3RhcF9tZ210X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlzdHJ1Y3QgaG9zdGFwX3NrYl90eF9kYXRhICptZXRhOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJdTE2IGZjOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKHNrYi0+bGVuIDwgMTApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBob3N0YXBfbWdtdF9zdGFydF94bWl0OiBzaG9ydCBza2IgIgorCQkgICAgICAgIihsZW49JWQpXG4iLCBkZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCWlmYWNlLT5zdGF0cy50eF9wYWNrZXRzKys7CisJaWZhY2UtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJbWV0YSA9IChzdHJ1Y3QgaG9zdGFwX3NrYl90eF9kYXRhICopIHNrYi0+Y2I7CisJbWVtc2V0KG1ldGEsIDAsIHNpemVvZigqbWV0YSkpOworCW1ldGEtPm1hZ2ljID0gSE9TVEFQX1NLQl9UWF9EQVRBX01BR0lDOworCW1ldGEtPmlmYWNlID0gaWZhY2U7CisKKwlpZiAoc2tiLT5sZW4gPj0gSUVFRTgwMjExX0RBVEFfSERSM19MRU4gKyBzaXplb2YocmZjMTA0Ml9oZWFkZXIpICsgMikgeworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCQlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwkJaWYgKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBICYmCisJCSAgICBXTEFOX0ZDX0dFVF9TVFlQRShmYykgPT0gSUVFRTgwMjExX1NUWVBFX0RBVEEpIHsKKwkJCXU4ICpwb3MgPSAmc2tiLT5kYXRhW0lFRUU4MDIxMV9EQVRBX0hEUjNfTEVOICsKKwkJCQkJICAgICBzaXplb2YocmZjMTA0Ml9oZWFkZXIpXTsKKwkJCW1ldGEtPmV0aGVydHlwZSA9IChwb3NbMF0gPDwgOCkgfCBwb3NbMV07CisJCX0KKwl9CisKKwkvKiBTZW5kIElFRUUgODAyLjExIGVuY2Fwc3VsYXRlZCBmcmFtZSB1c2luZyB0aGUgbWFzdGVyIHJhZGlvIGRldmljZSAqLworCXNrYi0+ZGV2ID0gbG9jYWwtPmRldjsKKwlkZXZfcXVldWVfeG1pdChza2IpOworCXJldHVybiAwOworfQorCisKKy8qIENhbGxlZCBvbmx5IGZyb20gc29mdHdhcmUgSVJRICovCitzdHJ1Y3Qgc2tfYnVmZiAqIGhvc3RhcF90eF9lbmNyeXB0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXUxNiBmYzsKKwlpbnQgaGRyX2xlbiwgcmVzOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihza2ItPmRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAoc2tiLT5sZW4gPCBJRUVFODAyMTFfREFUQV9IRFIzX0xFTikgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGxvY2FsLT50a2lwX2NvdW50ZXJtZWFzdXJlcyAmJgorCSAgICBjcnlwdCAmJiBjcnlwdC0+b3BzICYmIHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiVEtJUCIpID09IDApIHsKKwkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUS0lQIGNvdW50ZXJtZWFzdXJlczogZHJvcHBlZCAiCisJCQkgICAgICAgIlRYIHBhY2tldCB0byAiIE1BQ1NUUiAiXG4iLAorCQkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUsIE1BQzJTVFIoaGRyLT5hZGRyMSkpOworCQl9CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlza2IgPSBza2JfdW5zaGFyZShza2IsIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKHNrYl9oZWFkcm9vbShza2IpIDwgY3J5cHQtPm9wcy0+ZXh0cmFfcHJlZml4X2xlbiB8fAorCSAgICAgc2tiX3RhaWxyb29tKHNrYikgPCBjcnlwdC0+b3BzLT5leHRyYV9wb3N0Zml4X2xlbikgJiYKKwkgICAgcHNrYl9leHBhbmRfaGVhZChza2IsIGNyeXB0LT5vcHMtPmV4dHJhX3ByZWZpeF9sZW4sCisJCQkgICAgIGNyeXB0LT5vcHMtPmV4dHJhX3Bvc3RmaXhfbGVuLCBHRlBfQVRPTUlDKSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKyAJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJaGRyX2xlbiA9IGhvc3RhcF84MDIxMV9nZXRfaGRybGVuKGZjKTsKKworCS8qIEhvc3QtYmFzZWQgSUVFRSA4MDIuMTEgZnJhZ21lbnRhdGlvbiBmb3IgVFggaXMgbm90IHlldCBzdXBwb3J0ZWQsIHNvCisJICogY2FsbCBib3RoIE1TRFUgYW5kIE1QRFUgZW5jcnlwdGlvbiBmdW5jdGlvbnMgZnJvbSBoZXJlLiAqLworCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOworCXJlcyA9IDA7CisJaWYgKGNyeXB0LT5vcHMtPmVuY3J5cHRfbXNkdSkKKwkJcmVzID0gY3J5cHQtPm9wcy0+ZW5jcnlwdF9tc2R1KHNrYiwgaGRyX2xlbiwgY3J5cHQtPnByaXYpOworCWlmIChyZXMgPT0gMCAmJiBjcnlwdC0+b3BzLT5lbmNyeXB0X21wZHUpCisJCXJlcyA9IGNyeXB0LT5vcHMtPmVuY3J5cHRfbXBkdShza2IsIGhkcl9sZW4sIGNyeXB0LT5wcml2KTsKKwlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKKwlpZiAocmVzIDwgMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworCisvKiBoYXJkX3N0YXJ0X3htaXQgZnVuY3Rpb24gZm9yIG1hc3RlciByYWRpbyBpbnRlcmZhY2Ugd2lmaSMuCisgKiBBUCBwcm9jZXNzaW5nIChUWCByYXRlIGNvbnRyb2wsIHBvd2VyIHNhdmUgYnVmZmVyaW5nLCBldGMuKS4KKyAqIFVzZSBoYXJkd2FyZSBUWCBmdW5jdGlvbiB0byBzZW5kIHRoZSBmcmFtZS4gKi8KK2ludCBob3N0YXBfbWFzdGVyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgcmV0ID0gMTsKKwl1MTYgZmM7CisJc3RydWN0IGhvc3RhcF90eF9kYXRhIHR4OworCWFwX3R4X3JldCB0eF9yZXQ7CisJc3RydWN0IGhvc3RhcF9za2JfdHhfZGF0YSAqbWV0YTsKKwlpbnQgbm9fZW5jcnlwdCA9IDA7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCXR4LnNrYiA9IHNrYjsKKwl0eC5zdGFfcHRyID0gTlVMTDsKKworCW1ldGEgPSAoc3RydWN0IGhvc3RhcF9za2JfdHhfZGF0YSAqKSBza2ItPmNiOworCWlmIChtZXRhLT5tYWdpYyAhPSBIT1NUQVBfU0tCX1RYX0RBVEFfTUFHSUMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnZhbGlkIHNrYi0+Y2IgbWFnaWMgKDB4JTA4eCwgIgorCQkgICAgICAgImV4cGVjdGVkIDB4JTA4eClcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG1ldGEtPm1hZ2ljLCBIT1NUQVBfU0tCX1RYX0RBVEFfTUFHSUMpOworCQlyZXQgPSAwOworCQlpZmFjZS0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKGxvY2FsLT5ob3N0X2VuY3J5cHQpIHsKKwkJLyogU2V0IGNyeXB0IHRvIGRlZmF1bHQgYWxnb3JpdGhtIGFuZCBrZXk7IHdpbGwgYmUgcmVwbGFjZWQgaW4KKwkJICogQVAgY29kZSBpZiBTVEEgaGFzIG93biBhbGcva2V5ICovCisJCXR4LmNyeXB0ID0gbG9jYWwtPmNyeXB0W2xvY2FsLT50eF9rZXlpZHhdOworCQl0eC5ob3N0X2VuY3J5cHQgPSAxOworCX0gZWxzZSB7CisJCXR4LmNyeXB0ID0gTlVMTDsKKwkJdHguaG9zdF9lbmNyeXB0ID0gMDsKKwl9CisKKwlpZiAoc2tiLT5sZW4gPCAyNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGhvc3RhcF9tYXN0ZXJfc3RhcnRfeG1pdDogc2hvcnQgc2tiICIKKwkJICAgICAgICIobGVuPSVkKVxuIiwgZGV2LT5uYW1lLCBza2ItPmxlbik7CisJCXJldCA9IDA7CisJCWlmYWNlLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBGSVggKD8pOgorCSAqIFdpLUZpIDgwMi4xMWIgdGVzdCBwbGFuIHN1Z2dlc3RzIHRoYXQgQVAgc2hvdWxkIGlnbm9yZSBwb3dlciBzYXZlCisJICogYml0IGluIGF1dGhlbnRpY2F0aW9uIGFuZCAocmUpYXNzb2NpYXRpb24gZnJhbWVzIGFuZCBhc3N1bWUgdGhhCisJICogU1RBIHJlbWFpbnMgYXdha2UgZm9yIHRoZSByZXNwb25zZS4gKi8KKwl0eF9yZXQgPSBob3N0YXBfaGFuZGxlX3N0YV90eChsb2NhbCwgJnR4KTsKKwlza2IgPSB0eC5za2I7CisJbWV0YSA9IChzdHJ1Y3QgaG9zdGFwX3NrYl90eF9kYXRhICopIHNrYi0+Y2I7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKyAJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJc3dpdGNoICh0eF9yZXQpIHsKKwljYXNlIEFQX1RYX0NPTlRJTlVFOgorCQlicmVhazsKKwljYXNlIEFQX1RYX0NPTlRJTlVFX05PVF9BVVRIT1JJWkVEOgorCQlpZiAobG9jYWwtPmllZWVfODAyXzF4ICYmCisJCSAgICBXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSAmJgorCQkgICAgbWV0YS0+ZXRoZXJ0eXBlICE9IEVUSF9QX1BBRSAmJgorCQkgICAgIShtZXRhLT5mbGFncyAmIEhPU1RBUF9UWF9GTEFHU19XRFMpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRyb3BwZWQgZnJhbWUgdG8gdW5hdXRob3JpemVkICIKKwkJCSAgICAgICAicG9ydCAoSUVFRSA4MDIuMVgpOiBldGhlcnR5cGU9MHglMDR4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgbWV0YS0+ZXRoZXJ0eXBlKTsKKwkJCWhvc3RhcF9kdW1wX3R4XzgwMjExKGRldi0+bmFtZSwgc2tiKTsKKworCQkJcmV0ID0gMDsgLyogZHJvcCBwYWNrZXQgKi8KKwkJCWlmYWNlLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBUF9UWF9EUk9QOgorCQlyZXQgPSAwOyAvKiBkcm9wIHBhY2tldCAqLworCQlpZmFjZS0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlnb3RvIGZhaWw7CisJY2FzZSBBUF9UWF9SRVRSWToKKwkJZ290byBmYWlsOworCWNhc2UgQVBfVFhfQlVGRkVSRUQ6CisJCS8qIGRvIG5vdCBmcmVlIHNrYiBoZXJlLCBpdCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlCisJCSAqIGJ1ZmZlcmVkIGZyYW1lIGlzIHNlbnQvdGltZWQgb3V0ICovCisJCXJldCA9IDA7CisJCWdvdG8gdHhfZXhpdDsKKwl9CisKKwkvKiBSZXF1ZXN0IFRYIGNhbGxiYWNrIGlmIHByb3RvY29sIHZlcnNpb24gaXMgMiBpbiA4MDIuMTEgaGVhZGVyOworCSAqIHRoaXMgdmVyc2lvbiAyIGlzIGEgc3BlY2lhbCBjYXNlIHVzZWQgYmV0d2VlbiBob3N0YXBkIGFuZCBrZXJuZWwKKwkgKiBkcml2ZXIgKi8KKwlpZiAoKChmYyAmIElFRUU4MDIxMV9GQ1RMX1ZFUlMpID09IEJJVCgxKSkgJiYKKwkgICAgbG9jYWwtPmFwICYmIGxvY2FsLT5hcC0+dHhfY2FsbGJhY2tfaWR4ICYmIG1ldGEtPnR4X2NiX2lkeCA9PSAwKSB7CisJCW1ldGEtPnR4X2NiX2lkeCA9IGxvY2FsLT5hcC0+dHhfY2FsbGJhY2tfaWR4OworCisJCS8qIHJlbW92ZSBzcGVjaWFsIHZlcnNpb24gZnJvbSB0aGUgZnJhbWUgaGVhZGVyICovCisJCWZjICY9IH5JRUVFODAyMTFfRkNUTF9WRVJTOworCQloZHItPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KGZjKTsKKwl9CisKKwlpZiAoV0xBTl9GQ19HRVRfVFlQRShmYykgIT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpIHsKKwkJbm9fZW5jcnlwdCA9IDE7CisJCXR4LmNyeXB0ID0gTlVMTDsKKwl9CisKKwlpZiAobG9jYWwtPmllZWVfODAyXzF4ICYmIG1ldGEtPmV0aGVydHlwZSA9PSBFVEhfUF9QQUUgJiYgdHguY3J5cHQgJiYKKwkgICAgIShmYyAmIElFRUU4MDIxMV9GQ1RMX1ZFUlMpKSB7CisJCW5vX2VuY3J5cHQgPSAxOworCQlQREVCVUcoREVCVUdfRVhUUkEyLCAiJXM6IFRYOiBJRUVFIDgwMi4xWCAtIHBhc3NpbmcgIgorCQkgICAgICAgInVuZW5jcnlwdGVkIEVBUE9MIGZyYW1lXG4iLCBkZXYtPm5hbWUpOworCQl0eC5jcnlwdCA9IE5VTEw7IC8qIG5vIGVuY3J5cHRpb24gZm9yIElFRUUgODAyLjFYIGZyYW1lcyAqLworCX0KKworCWlmICh0eC5jcnlwdCAmJiAoIXR4LmNyeXB0LT5vcHMgfHwgIXR4LmNyeXB0LT5vcHMtPmVuY3J5cHRfbXBkdSkpCisJCXR4LmNyeXB0ID0gTlVMTDsKKwllbHNlIGlmICgodHguY3J5cHQgfHwgbG9jYWwtPmNyeXB0W2xvY2FsLT50eF9rZXlpZHhdKSAmJiAhbm9fZW5jcnlwdCkgeworCQkvKiBBZGQgSVNXRVAgZmxhZyBib3RoIGZvciBmaXJtd2FyZSBhbmQgaG9zdCBiYXNlZCBlbmNyeXB0aW9uCisJCSAqLworCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQ7CisJCWhkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoZmMpOworCX0gZWxzZSBpZiAobG9jYWwtPmRyb3BfdW5lbmNyeXB0ZWQgJiYKKwkJICAgV0xBTl9GQ19HRVRfVFlQRShmYykgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgJiYKKwkJICAgbWV0YS0+ZXRoZXJ0eXBlICE9IEVUSF9QX1BBRSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRyb3BwZWQgdW5lbmNyeXB0ZWQgVFggZGF0YSAiCisJCQkgICAgICAgImZyYW1lIChkcm9wX3VuZW5jcnlwdGVkPTEpXG4iLCBkZXYtPm5hbWUpOworCQl9CisJCWlmYWNlLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCXJldCA9IDA7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAodHguY3J5cHQpIHsKKwkJc2tiID0gaG9zdGFwX3R4X2VuY3J5cHQoc2tiLCB0eC5jcnlwdCk7CisJCWlmIChza2IgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUWCAtIGVuY3J5cHRpb24gZmFpbGVkXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlyZXQgPSAwOworCQkJZ290byBmYWlsOworCQl9CisJCW1ldGEgPSAoc3RydWN0IGhvc3RhcF9za2JfdHhfZGF0YSAqKSBza2ItPmNiOworCQlpZiAobWV0YS0+bWFnaWMgIT0gSE9TVEFQX1NLQl9UWF9EQVRBX01BR0lDKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludmFsaWQgc2tiLT5jYiBtYWdpYyAoMHglMDh4LCAiCisJCQkgICAgICAgImV4cGVjdGVkIDB4JTA4eCkgYWZ0ZXIgaG9zdGFwX3R4X2VuY3J5cHRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBtZXRhLT5tYWdpYywKKwkJCSAgICAgICBIT1NUQVBfU0tCX1RYX0RBVEFfTUFHSUMpOworCQkJcmV0ID0gMDsKKwkJCWlmYWNlLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlpZiAobG9jYWwtPmZ1bmMtPnR4ID09IE5VTEwgfHwgbG9jYWwtPmZ1bmMtPnR4KHNrYiwgZGV2KSkgeworCQlyZXQgPSAwOworCQlpZmFjZS0+c3RhdHMudHhfZHJvcHBlZCsrOworCX0gZWxzZSB7CisJCXJldCA9IDA7CisJCWlmYWNlLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWlmYWNlLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwl9CisKKyBmYWlsOgorCWlmICghcmV0ICYmIHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworIHR4X2V4aXQ6CisJaWYgKHR4LnN0YV9wdHIpCisJCWhvc3RhcF9oYW5kbGVfc3RhX3JlbGVhc2UodHguc3RhX3B0cik7CisJcmV0dXJuIHJldDsKK30KKworCitFWFBPUlRfU1lNQk9MKGhvc3RhcF9kdW1wX3R4XzgwMjExKTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwX3R4X2VuY3J5cHQpOworRVhQT1JUX1NZTUJPTChob3N0YXBfbWFzdGVyX3N0YXJ0X3htaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMGNlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmMKQEAgLTAsMCArMSwzMjg4IEBACisvKgorICogSW50ZXJzaWwgUHJpc20yIGRyaXZlciB3aXRoIEhvc3QgQVAgKHNvZnR3YXJlIGFjY2VzcyBwb2ludCkgc3VwcG9ydAorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgdG8gYmUgaW5jbHVkZWQgaW50byBob3N0YXAuYyB3aGVuIFMvVyBBUCBmdW5jdGlvbmFsaXR5IGlzCisgKiBjb21waWxlZC4KKyAqCisgKiBBUDogIEZJWDoKKyAqIC0gaWYgdW5pY2FzdCBDbGFzcyAyIChhc3NvYyxyZWFzc29jLGRpc2Fzc29jKSBmcmFtZSByZWNlaXZlZCBmcm9tCisgKiAgIHVuYXV0aGVudGljYXRlZCBTVEEsIHNlbmQgZGVhdXRoLiBmcmFtZSAoODgwMi4xMTogNS41KQorICogLSBpZiB1bmljYXN0IENsYXNzIDMgKGRhdGEgd2l0aCB0by9mcm9tIERTLGRlYXV0aCxwc3BvbGwpIGZyYW1lIHJlY2VpdmVkCisgKiAgIGZyb20gYXV0aGVudGljYXRlZCwgYnV0IHVuYXNzb2MgU1RBLCBzZW5kIGRpc2Fzc29jIGZyYW1lICg4ODAyLjExOiA1LjUpCisgKiAtIGlmIHVuaWNhc3QgQ2xhc3MgMyByZWNlaXZlZCBmcm9tIHVuYXV0aGVudGljYXRlZCBTVEEsIHNlbmQgZGVhdXRoLiBmcmFtZQorICogICAoODgwMi4xMTogNS41KQorICovCisKK3N0YXRpYyBpbnQgb3RoZXJfYXBfcG9saWN5W01BWF9QQVJNX0RFVklDRVNdID0geyBBUF9PVEhFUl9BUF9TS0lQX0FMTCwKKwkJCQkJCSBERUZfSU5UUyB9OworbW9kdWxlX3BhcmFtX2FycmF5KG90aGVyX2FwX3BvbGljeSwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mob3RoZXJfYXBfcG9saWN5LCAiT3RoZXIgQVAgYmVhY29uIG1vbml0b3JpbmcgcG9saWN5ICgwLTMpIik7CisKK3N0YXRpYyBpbnQgYXBfbWF4X2luYWN0aXZpdHlbTUFYX1BBUk1fREVWSUNFU10gPSB7IEFQX01BWF9JTkFDVElWSVRZX1NFQywKKwkJCQkJCSAgIERFRl9JTlRTIH07Cittb2R1bGVfcGFyYW1fYXJyYXkoYXBfbWF4X2luYWN0aXZpdHksIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFwX21heF9pbmFjdGl2aXR5LCAiQVAgdGltZW91dCAoaW4gc2Vjb25kcykgZm9yIHN0YXRpb24gIgorCQkgImluYWN0aXZpdHkiKTsKKworc3RhdGljIGludCBhcF9icmlkZ2VfcGFja2V0c1tNQVhfUEFSTV9ERVZJQ0VTXSA9IHsgMSwgREVGX0lOVFMgfTsKK21vZHVsZV9wYXJhbV9hcnJheShhcF9icmlkZ2VfcGFja2V0cywgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYXBfYnJpZGdlX3BhY2tldHMsICJCcmlkZ2UgcGFja2V0cyBkaXJlY3RseSBiZXR3ZWVuICIKKwkJICJzdGF0aW9ucyIpOworCitzdGF0aWMgaW50IGF1dG9tX2FwX3dkc1tNQVhfUEFSTV9ERVZJQ0VTXSA9IHsgMCwgREVGX0lOVFMgfTsKK21vZHVsZV9wYXJhbV9hcnJheShhdXRvbV9hcF93ZHMsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1dG9tX2FwX3dkcywgIkFkZCBXRFMgY29ubmVjdGlvbnMgdG8gb3RoZXIgQVBzICIKKwkJICJhdXRvbWF0aWNhbGx5Iik7CisKKworc3RhdGljIHN0cnVjdCBzdGFfaW5mbyogYXBfZ2V0X3N0YShzdHJ1Y3QgYXBfZGF0YSAqYXAsIHU4ICpzdGEpOworc3RhdGljIHZvaWQgaG9zdGFwX2V2ZW50X2V4cGlyZWRfc3RhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CitzdGF0aWMgdm9pZCBoYW5kbGVfYWRkX3Byb2NfcXVldWUodm9pZCAqZGF0YSk7CisKKyNpZm5kZWYgUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVAorc3RhdGljIHZvaWQgaGFuZGxlX3dkc19vcGVyX3F1ZXVlKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgcHJpc20yX3NlbmRfbWdtdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICB1MTYgdHlwZV9zdWJ0eXBlLCBjaGFyICpib2R5LAorCQkJICAgICBpbnQgYm9keV9sZW4sIHU4ICphZGRyLCB1MTYgdHhfY2JfaWR4KTsKKyNlbmRpZiAvKiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCisKKworI2lmbmRlZiBQUklTTTJfTk9fUFJPQ0ZTX0RFQlVHCitzdGF0aWMgaW50IGFwX2RlYnVnX3Byb2NfcmVhZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJY2hhciAqcCA9IHBhZ2U7CisJc3RydWN0IGFwX2RhdGEgKmFwID0gKHN0cnVjdCBhcF9kYXRhICopIGRhdGE7CisKKwlpZiAob2ZmICE9IDApIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCXAgKz0gc3ByaW50ZihwLCAiQnJpZGdlZFVuaWNhc3RGcmFtZXM9JXVcbiIsIGFwLT5icmlkZ2VkX3VuaWNhc3QpOworCXAgKz0gc3ByaW50ZihwLCAiQnJpZGdlZE11bHRpY2FzdEZyYW1lcz0ldVxuIiwgYXAtPmJyaWRnZWRfbXVsdGljYXN0KTsKKwlwICs9IHNwcmludGYocCwgIm1heF9pbmFjdGl2aXR5PSV1XG4iLCBhcC0+bWF4X2luYWN0aXZpdHkgLyBIWik7CisJcCArPSBzcHJpbnRmKHAsICJicmlkZ2VfcGFja2V0cz0ldVxuIiwgYXAtPmJyaWRnZV9wYWNrZXRzKTsKKwlwICs9IHNwcmludGYocCwgIm51bGxmdW5jX2Fjaz0ldVxuIiwgYXAtPm51bGxmdW5jX2Fjayk7CisJcCArPSBzcHJpbnRmKHAsICJhdXRvbV9hcF93ZHM9JXVcbiIsIGFwLT5hdXRvbV9hcF93ZHMpOworCXAgKz0gc3ByaW50ZihwLCAiYXV0aF9hbGdzPSV1XG4iLCBhcC0+bG9jYWwtPmF1dGhfYWxncyk7CisJcCArPSBzcHJpbnRmKHAsICJ0eF9kcm9wX25vbmFzc29jPSV1XG4iLCBhcC0+dHhfZHJvcF9ub25hc3NvYyk7CisKKwlyZXR1cm4gKHAgLSBwYWdlKTsKK30KKyNlbmRpZiAvKiBQUklTTTJfTk9fUFJPQ0ZTX0RFQlVHICovCisKKworc3RhdGljIHZvaWQgYXBfc3RhX2hhc2hfYWRkKHN0cnVjdCBhcF9kYXRhICphcCwgc3RydWN0IHN0YV9pbmZvICpzdGEpCit7CisJc3RhLT5obmV4dCA9IGFwLT5zdGFfaGFzaFtTVEFfSEFTSChzdGEtPmFkZHIpXTsKKwlhcC0+c3RhX2hhc2hbU1RBX0hBU0goc3RhLT5hZGRyKV0gPSBzdGE7Cit9CisKK3N0YXRpYyB2b2lkIGFwX3N0YV9oYXNoX2RlbChzdHJ1Y3QgYXBfZGF0YSAqYXAsIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQoreworCXN0cnVjdCBzdGFfaW5mbyAqczsKKworCXMgPSBhcC0+c3RhX2hhc2hbU1RBX0hBU0goc3RhLT5hZGRyKV07CisJaWYgKHMgPT0gTlVMTCkgcmV0dXJuOworCWlmIChtZW1jbXAocy0+YWRkciwgc3RhLT5hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQlhcC0+c3RhX2hhc2hbU1RBX0hBU0goc3RhLT5hZGRyKV0gPSBzLT5obmV4dDsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChzLT5obmV4dCAhPSBOVUxMICYmIG1lbWNtcChzLT5obmV4dC0+YWRkciwgc3RhLT5hZGRyLCBFVEhfQUxFTikKKwkgICAgICAgIT0gMCkKKwkJcyA9IHMtPmhuZXh0OworCWlmIChzLT5obmV4dCAhPSBOVUxMKQorCQlzLT5obmV4dCA9IHMtPmhuZXh0LT5obmV4dDsKKwllbHNlCisJCXByaW50aygiQVA6IGNvdWxkIG5vdCByZW1vdmUgU1RBICIgTUFDU1RSICIgZnJvbSBoYXNoIHRhYmxlXG4iLAorCQkgICAgICAgTUFDMlNUUihzdGEtPmFkZHIpKTsKK30KKworc3RhdGljIHZvaWQgYXBfZnJlZV9zdGEoc3RydWN0IGFwX2RhdGEgKmFwLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKK3sKKwlpZiAoc3RhLT5hcCAmJiBzdGEtPmxvY2FsKQorCQlob3N0YXBfZXZlbnRfZXhwaXJlZF9zdGEoc3RhLT5sb2NhbC0+ZGV2LCBzdGEpOworCisJaWYgKGFwLT5wcm9jICE9IE5VTEwpIHsKKwkJY2hhciBuYW1lWzIwXTsKKwkJc3ByaW50ZihuYW1lLCBNQUNTVFIsIE1BQzJTVFIoc3RhLT5hZGRyKSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWUsIGFwLT5wcm9jKTsKKwl9CisKKwlpZiAoc3RhLT5jcnlwdCkgeworCQlzdGEtPmNyeXB0LT5vcHMtPmRlaW5pdChzdGEtPmNyeXB0LT5wcml2KTsKKwkJa2ZyZWUoc3RhLT5jcnlwdCk7CisJCXN0YS0+Y3J5cHQgPSBOVUxMOworCX0KKworCXNrYl9xdWV1ZV9wdXJnZSgmc3RhLT50eF9idWYpOworCisJYXAtPm51bV9zdGEtLTsKKyNpZm5kZWYgUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVAorCWlmIChzdGEtPmFpZCA+IDApCisJCWFwLT5zdGFfYWlkW3N0YS0+YWlkIC0gMV0gPSBOVUxMOworCisJaWYgKCFzdGEtPmFwICYmIHN0YS0+dS5zdGEuY2hhbGxlbmdlKQorCQlrZnJlZShzdGEtPnUuc3RhLmNoYWxsZW5nZSk7CisJZGVsX3RpbWVyKCZzdGEtPnRpbWVyKTsKKyNlbmRpZiAvKiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCisKKwlrZnJlZShzdGEpOworfQorCisKK3N0YXRpYyB2b2lkIGhvc3RhcF9zZXRfdGltKGxvY2FsX2luZm9fdCAqbG9jYWwsIGludCBhaWQsIGludCBzZXQpCit7CisJaWYgKGxvY2FsLT5mdW5jLT5zZXRfdGltKQorCQlsb2NhbC0+ZnVuYy0+c2V0X3RpbShsb2NhbC0+ZGV2LCBhaWQsIHNldCk7Cit9CisKKworc3RhdGljIHZvaWQgaG9zdGFwX2V2ZW50X25ld19zdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHN0YV9pbmZvICpzdGEpCit7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwltZW1jcHkod3JxdS5hZGRyLnNhX2RhdGEsIHN0YS0+YWRkciwgRVRIX0FMRU4pOworCXdycXUuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZSRUdJU1RFUkVELCAmd3JxdSwgTlVMTCk7Cit9CisKKworc3RhdGljIHZvaWQgaG9zdGFwX2V2ZW50X2V4cGlyZWRfc3RhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCW1lbWNweSh3cnF1LmFkZHIuc2FfZGF0YSwgc3RhLT5hZGRyLCBFVEhfQUxFTik7CisJd3JxdS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVkVYUElSRUQsICZ3cnF1LCBOVUxMKTsKK30KKworCisjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKKworc3RhdGljIHZvaWQgYXBfaGFuZGxlX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IChzdHJ1Y3Qgc3RhX2luZm8gKikgZGF0YTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXN0cnVjdCBhcF9kYXRhICphcDsKKwl1bnNpZ25lZCBsb25nIG5leHRfdGltZSA9IDA7CisJaW50IHdhc19hc3NvYzsKKworCWlmIChzdGEgPT0gTlVMTCB8fCBzdGEtPmxvY2FsID09IE5VTEwgfHwgc3RhLT5sb2NhbC0+YXAgPT0gTlVMTCkgeworCQlQREVCVUcoREVCVUdfQVAsICJhcF9oYW5kbGVfdGltZXIoKSBjYWxsZWQgd2l0aCBOVUxMIGRhdGFcbiIpOworCQlyZXR1cm47CisJfQorCisJbG9jYWwgPSBzdGEtPmxvY2FsOworCWFwID0gbG9jYWwtPmFwOworCXdhc19hc3NvYyA9IHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9BU1NPQzsKKworCWlmIChhdG9taWNfcmVhZCgmc3RhLT51c2VycykgIT0gMCkKKwkJbmV4dF90aW1lID0gamlmZmllcyArIEhaOworCWVsc2UgaWYgKChzdGEtPmZsYWdzICYgV0xBTl9TVEFfUEVSTSkgJiYgIShzdGEtPmZsYWdzICYgV0xBTl9TVEFfQVVUSCkpCisJCW5leHRfdGltZSA9IGppZmZpZXMgKyBhcC0+bWF4X2luYWN0aXZpdHk7CisKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgc3RhLT5sYXN0X3J4ICsgYXAtPm1heF9pbmFjdGl2aXR5KSkgeworCQkvKiBzdGF0aW9uIGFjdGl2aXR5IGRldGVjdGVkOyByZXNldCB0aW1lb3V0IHN0YXRlICovCisJCXN0YS0+dGltZW91dF9uZXh0ID0gU1RBX05VTExGVU5DOworCQluZXh0X3RpbWUgPSBzdGEtPmxhc3RfcnggKyBhcC0+bWF4X2luYWN0aXZpdHk7CisJfSBlbHNlIGlmIChzdGEtPnRpbWVvdXRfbmV4dCA9PSBTVEFfRElTQVNTT0MgJiYKKwkJICAgIShzdGEtPmZsYWdzICYgV0xBTl9TVEFfUEVORElOR19QT0xMKSkgeworCQkvKiBTVEEgQUNLZWQgZGF0YSBudWxsZnVuYyBmcmFtZSBwb2xsICovCisJCXN0YS0+dGltZW91dF9uZXh0ID0gU1RBX05VTExGVU5DOworCQluZXh0X3RpbWUgPSBqaWZmaWVzICsgYXAtPm1heF9pbmFjdGl2aXR5OworCX0KKworCWlmIChuZXh0X3RpbWUpIHsKKwkJc3RhLT50aW1lci5leHBpcmVzID0gbmV4dF90aW1lOworCQlhZGRfdGltZXIoJnN0YS0+dGltZXIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHN0YS0+YXApCisJCXN0YS0+dGltZW91dF9uZXh0ID0gU1RBX0RFQVVUSDsKKworCWlmIChzdGEtPnRpbWVvdXRfbmV4dCA9PSBTVEFfREVBVVRIICYmICEoc3RhLT5mbGFncyAmIFdMQU5fU1RBX1BFUk0pKSB7CisJCXNwaW5fbG9jaygmYXAtPnN0YV90YWJsZV9sb2NrKTsKKwkJYXBfc3RhX2hhc2hfZGVsKGFwLCBzdGEpOworCQlsaXN0X2RlbCgmc3RhLT5saXN0KTsKKwkJc3Bpbl91bmxvY2soJmFwLT5zdGFfdGFibGVfbG9jayk7CisJCXN0YS0+ZmxhZ3MgJj0gfihXTEFOX1NUQV9BVVRIIHwgV0xBTl9TVEFfQVNTT0MpOworCX0gZWxzZSBpZiAoc3RhLT50aW1lb3V0X25leHQgPT0gU1RBX0RJU0FTU09DKQorCQlzdGEtPmZsYWdzICY9IH5XTEFOX1NUQV9BU1NPQzsKKworCWlmICh3YXNfYXNzb2MgJiYgIShzdGEtPmZsYWdzICYgV0xBTl9TVEFfQVNTT0MpICYmICFzdGEtPmFwKQorCQlob3N0YXBfZXZlbnRfZXhwaXJlZF9zdGEobG9jYWwtPmRldiwgc3RhKTsKKworCWlmIChzdGEtPnRpbWVvdXRfbmV4dCA9PSBTVEFfREVBVVRIICYmIHN0YS0+YWlkID4gMCAmJgorCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZzdGEtPnR4X2J1ZikpIHsKKwkJaG9zdGFwX3NldF90aW0obG9jYWwsIHN0YS0+YWlkLCAwKTsKKwkJc3RhLT5mbGFncyAmPSB+V0xBTl9TVEFfVElNOworCX0KKworCWlmIChzdGEtPmFwKSB7CisJCWlmIChhcC0+YXV0b21fYXBfd2RzKSB7CisJCQlQREVCVUcoREVCVUdfQVAsICIlczogcmVtb3ZpbmcgYXV0b21hdGljIFdEUyAiCisJCQkgICAgICAgImNvbm5lY3Rpb24gdG8gQVAgIiBNQUNTVFIgIlxuIiwKKwkJCSAgICAgICBsb2NhbC0+ZGV2LT5uYW1lLCBNQUMyU1RSKHN0YS0+YWRkcikpOworCQkJaG9zdGFwX3dkc19saW5rX29wZXIobG9jYWwsIHN0YS0+YWRkciwgV0RTX0RFTCk7CisJCX0KKwl9IGVsc2UgaWYgKHN0YS0+dGltZW91dF9uZXh0ID09IFNUQV9OVUxMRlVOQykgeworCQkvKiBzZW5kIGRhdGEgZnJhbWUgdG8gcG9sbCBTVEEgYW5kIGNoZWNrIHdoZXRoZXIgdGhpcyBmcmFtZQorCQkgKiBpcyBBQ0tlZCAqLworCQkvKiBGSVg6IElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQyB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlLCBidXQKKwkJICogaXQgaXMgYXBwYXJlbnRseSBub3QgcmV0cmllZCBzbyBUWCBFeGMgZXZlbnRzIGFyZSBub3QKKwkJICogcmVjZWl2ZWQgZm9yIGl0ICovCisJCXN0YS0+ZmxhZ3MgfD0gV0xBTl9TVEFfUEVORElOR19QT0xMOworCQlwcmlzbTJfc2VuZF9tZ210KGxvY2FsLT5kZXYsIElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKKwkJCQkgSUVFRTgwMjExX1NUWVBFX0RBVEEsIE5VTEwsIDAsCisJCQkJIHN0YS0+YWRkciwgYXAtPnR4X2NhbGxiYWNrX3BvbGwpOworCX0gZWxzZSB7CisJCWludCBkZWF1dGggPSBzdGEtPnRpbWVvdXRfbmV4dCA9PSBTVEFfREVBVVRIOworCQl1MTYgcmVzcDsKKwkJUERFQlVHKERFQlVHX0FQLCAiJXM6IHNlbmRpbmcgJXMgaW5mbyB0byBTVEEgIiBNQUNTVFIKKwkJICAgICAgICIobGFzdD0lbHUsIGppZmZpZXM9JWx1KVxuIiwKKwkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUsCisJCSAgICAgICBkZWF1dGggPyAiZGVhdXRoZW50aWNhdGlvbiIgOiAiZGlzYXNzb2NpYXRpb24iLAorCQkgICAgICAgTUFDMlNUUihzdGEtPmFkZHIpLCBzdGEtPmxhc3RfcngsIGppZmZpZXMpOworCisJCXJlc3AgPSBjcHVfdG9fbGUxNihkZWF1dGggPyBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEIDoKKwkJCQkgICBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSk7CisJCXByaXNtMl9zZW5kX21nbXQobG9jYWwtPmRldiwgSUVFRTgwMjExX0ZUWVBFX01HTVQgfAorCQkJCSAoZGVhdXRoID8gSUVFRTgwMjExX1NUWVBFX0RFQVVUSCA6CisJCQkJICBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MpLAorCQkJCSAoY2hhciAqKSAmcmVzcCwgMiwgc3RhLT5hZGRyLCAwKTsKKwl9CisKKwlpZiAoc3RhLT50aW1lb3V0X25leHQgPT0gU1RBX0RFQVVUSCkgeworCQlpZiAoc3RhLT5mbGFncyAmIFdMQU5fU1RBX1BFUk0pIHsKKwkJCVBERUJVRyhERUJVR19BUCwgIiVzOiBTVEEgIiBNQUNTVFIgIiB3b3VsZCBoYXZlIGJlZW4gIgorCQkJICAgICAgICJyZW1vdmVkLCBidXQgaXQgaGFzICdwZXJtJyBmbGFnXG4iLAorCQkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUsIE1BQzJTVFIoc3RhLT5hZGRyKSk7CisJCX0gZWxzZQorCQkJYXBfZnJlZV9zdGEoYXAsIHN0YSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RhLT50aW1lb3V0X25leHQgPT0gU1RBX05VTExGVU5DKSB7CisJCXN0YS0+dGltZW91dF9uZXh0ID0gU1RBX0RJU0FTU09DOworCQlzdGEtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgQVBfRElTQVNTT0NfREVMQVk7CisJfSBlbHNlIHsKKwkJc3RhLT50aW1lb3V0X25leHQgPSBTVEFfREVBVVRIOworCQlzdGEtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgQVBfREVBVVRIX0RFTEFZOworCX0KKworCWFkZF90aW1lcigmc3RhLT50aW1lcik7Cit9CisKKwordm9pZCBob3N0YXBfZGVhdXRoX2FsbF9zdGFzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBhcF9kYXRhICphcCwKKwkJCSAgICBpbnQgcmVzZW5kKQoreworCXU4IGFkZHJbRVRIX0FMRU5dOworCXUxNiByZXNwOworCWludCBpOworCisJUERFQlVHKERFQlVHX0FQLCAiJXM6IERlYXV0aGVudGljYXRlIGFsbCBzdGF0aW9uc1xuIiwgZGV2LT5uYW1lKTsKKwltZW1zZXQoYWRkciwgMHhmZiwgRVRIX0FMRU4pOworCisJcmVzcCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCk7CisKKwkvKiBkZWF1dGggbWVzc2FnZSBzZW50OyB0cnkgdG8gcmVzZW5kIGl0IGZldyB0aW1lczsgdGhlIG1lc3NhZ2UgaXMKKwkgKiBicm9hZGNhc3QsIHNvIGl0IG1heSBiZSBkZWxheWVkIHVudGlsIG5leHQgRFRJTTsgdGhlcmUgaXMgbm90IG11Y2gKKwkgKiBlbHNlIHdlIGNhbiBkbyBhdCB0aGlzIHBvaW50IHNpbmNlIHRoZSBkcml2ZXIgaXMgZ29pbmcgdG8gYmUgc2h1dAorCSAqIGRvd24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCXByaXNtMl9zZW5kX21nbXQoZGV2LCBJRUVFODAyMTFfRlRZUEVfTUdNVCB8CisJCQkJIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgsCisJCQkJIChjaGFyICopICZyZXNwLCAyLCBhZGRyLCAwKTsKKworCQlpZiAoIXJlc2VuZCB8fCBhcC0+bnVtX3N0YSA8PSAwKQorCQkJcmV0dXJuOworCisJCW1kZWxheSg1MCk7CisJfQorfQorCisKK3N0YXRpYyBpbnQgYXBfY29udHJvbF9wcm9jX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpwID0gcGFnZTsKKwlzdHJ1Y3QgYXBfZGF0YSAqYXAgPSAoc3RydWN0IGFwX2RhdGEgKikgZGF0YTsKKwljaGFyICpwb2xpY3lfdHh0OworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKKworCWlmIChvZmYgIT0gMCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChhcC0+bWFjX3Jlc3RyaWN0aW9ucy5wb2xpY3kpIHsKKwljYXNlIE1BQ19QT0xJQ1lfT1BFTjoKKwkJcG9saWN5X3R4dCA9ICJvcGVuIjsKKwkJYnJlYWs7CisJY2FzZSBNQUNfUE9MSUNZX0FMTE9XOgorCQlwb2xpY3lfdHh0ID0gImFsbG93IjsKKwkJYnJlYWs7CisJY2FzZSBNQUNfUE9MSUNZX0RFTlk6CisJCXBvbGljeV90eHQgPSAiZGVueSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBvbGljeV90eHQgPSAidW5rbm93biI7CisJCWJyZWFrOworCX07CisJcCArPSBzcHJpbnRmKHAsICJNQUMgcG9saWN5OiAlc1xuIiwgcG9saWN5X3R4dCk7CisJcCArPSBzcHJpbnRmKHAsICJNQUMgZW50cmllczogJXVcbiIsIGFwLT5tYWNfcmVzdHJpY3Rpb25zLmVudHJpZXMpOworCXAgKz0gc3ByaW50ZihwLCAiTUFDIGxpc3Q6XG4iKTsKKwlzcGluX2xvY2tfYmgoJmFwLT5tYWNfcmVzdHJpY3Rpb25zLmxvY2spOworCWZvciAocHRyID0gYXAtPm1hY19yZXN0cmljdGlvbnMubWFjX2xpc3QubmV4dDsKKwkgICAgIHB0ciAhPSAmYXAtPm1hY19yZXN0cmljdGlvbnMubWFjX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgeworCQlpZiAocCAtIHBhZ2UgPiBQQUdFX1NJWkUgLSA4MCkgeworCQkJcCArPSBzcHJpbnRmKHAsICJBbGwgZW50cmllcyBkaWQgbm90IGZpdCBvbmUgcGFnZS5cbiIpOworCQkJYnJlYWs7CisJCX0KKworCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWFjX2VudHJ5LCBsaXN0KTsKKwkJcCArPSBzcHJpbnRmKHAsIE1BQ1NUUiAiXG4iLCBNQUMyU1RSKGVudHJ5LT5hZGRyKSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhcC0+bWFjX3Jlc3RyaWN0aW9ucy5sb2NrKTsKKworCXJldHVybiAocCAtIHBhZ2UpOworfQorCisKK3N0YXRpYyBpbnQgYXBfY29udHJvbF9hZGRfbWFjKHN0cnVjdCBtYWNfcmVzdHJpY3Rpb25zICptYWNfcmVzdHJpY3Rpb25zLAorCQkJICAgICAgdTggKm1hYykKK3sKKwlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1hY19lbnRyeSksIEdGUF9LRVJORUwpOworCWlmIChlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwltZW1jcHkoZW50cnktPmFkZHIsIG1hYywgRVRIX0FMRU4pOworCisJc3Bpbl9sb2NrX2JoKCZtYWNfcmVzdHJpY3Rpb25zLT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgJm1hY19yZXN0cmljdGlvbnMtPm1hY19saXN0KTsKKwltYWNfcmVzdHJpY3Rpb25zLT5lbnRyaWVzKys7CisJc3Bpbl91bmxvY2tfYmgoJm1hY19yZXN0cmljdGlvbnMtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhcF9jb250cm9sX2RlbF9tYWMoc3RydWN0IG1hY19yZXN0cmljdGlvbnMgKm1hY19yZXN0cmljdGlvbnMsCisJCQkgICAgICB1OCAqbWFjKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKKworCXNwaW5fbG9ja19iaCgmbWFjX3Jlc3RyaWN0aW9ucy0+bG9jayk7CisJZm9yIChwdHIgPSBtYWNfcmVzdHJpY3Rpb25zLT5tYWNfbGlzdC5uZXh0OworCSAgICAgcHRyICE9ICZtYWNfcmVzdHJpY3Rpb25zLT5tYWNfbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtYWNfZW50cnksIGxpc3QpOworCisJCWlmIChtZW1jbXAoZW50cnktPmFkZHIsIG1hYywgRVRIX0FMRU4pID09IDApIHsKKwkJCWxpc3RfZGVsKHB0cik7CisJCQlrZnJlZShlbnRyeSk7CisJCQltYWNfcmVzdHJpY3Rpb25zLT5lbnRyaWVzLS07CisJCQlzcGluX3VubG9ja19iaCgmbWFjX3Jlc3RyaWN0aW9ucy0+bG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmbWFjX3Jlc3RyaWN0aW9ucy0+bG9jayk7CisJcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBpbnQgYXBfY29udHJvbF9tYWNfZGVueShzdHJ1Y3QgbWFjX3Jlc3RyaWN0aW9ucyAqbWFjX3Jlc3RyaWN0aW9ucywKKwkJCSAgICAgICB1OCAqbWFjKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKKwlpbnQgZm91bmQgPSAwOworCisJaWYgKG1hY19yZXN0cmljdGlvbnMtPnBvbGljeSA9PSBNQUNfUE9MSUNZX09QRU4pCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2JoKCZtYWNfcmVzdHJpY3Rpb25zLT5sb2NrKTsKKwlmb3IgKHB0ciA9IG1hY19yZXN0cmljdGlvbnMtPm1hY19saXN0Lm5leHQ7CisJICAgICBwdHIgIT0gJm1hY19yZXN0cmljdGlvbnMtPm1hY19saXN0OyBwdHIgPSBwdHItPm5leHQpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1hY19lbnRyeSwgbGlzdCk7CisKKwkJaWYgKG1lbWNtcChlbnRyeS0+YWRkciwgbWFjLCBFVEhfQUxFTikgPT0gMCkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJm1hY19yZXN0cmljdGlvbnMtPmxvY2spOworCisJaWYgKG1hY19yZXN0cmljdGlvbnMtPnBvbGljeSA9PSBNQUNfUE9MSUNZX0FMTE9XKQorCQlyZXR1cm4gIWZvdW5kOworCWVsc2UKKwkJcmV0dXJuIGZvdW5kOworfQorCisKK3N0YXRpYyB2b2lkIGFwX2NvbnRyb2xfZmx1c2hfbWFjcyhzdHJ1Y3QgbWFjX3Jlc3RyaWN0aW9ucyAqbWFjX3Jlc3RyaWN0aW9ucykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuOworCXN0cnVjdCBtYWNfZW50cnkgKmVudHJ5OworCisJaWYgKG1hY19yZXN0cmljdGlvbnMtPmVudHJpZXMgPT0gMCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZtYWNfcmVzdHJpY3Rpb25zLT5sb2NrKTsKKwlmb3IgKHB0ciA9IG1hY19yZXN0cmljdGlvbnMtPm1hY19saXN0Lm5leHQsIG4gPSBwdHItPm5leHQ7CisJICAgICBwdHIgIT0gJm1hY19yZXN0cmljdGlvbnMtPm1hY19saXN0OworCSAgICAgcHRyID0gbiwgbiA9IHB0ci0+bmV4dCkgeworCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWFjX2VudHJ5LCBsaXN0KTsKKwkJbGlzdF9kZWwocHRyKTsKKwkJa2ZyZWUoZW50cnkpOworCX0KKwltYWNfcmVzdHJpY3Rpb25zLT5lbnRyaWVzID0gMDsKKwlzcGluX3VubG9ja19iaCgmbWFjX3Jlc3RyaWN0aW9ucy0+bG9jayk7Cit9CisKKworc3RhdGljIGludCBhcF9jb250cm9sX2tpY2tfbWFjKHN0cnVjdCBhcF9kYXRhICphcCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICB1OCAqbWFjKQoreworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCXUxNiByZXNwOworCisJc3Bpbl9sb2NrX2JoKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCXN0YSA9IGFwX2dldF9zdGEoYXAsIG1hYyk7CisJaWYgKHN0YSkgeworCQlhcF9zdGFfaGFzaF9kZWwoYXAsIHN0YSk7CisJCWxpc3RfZGVsKCZzdGEtPmxpc3QpOworCX0KKwlzcGluX3VubG9ja19iaCgmYXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmICghc3RhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlc3AgPSBjcHVfdG9fbGUxNihXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEKTsKKwlwcmlzbTJfc2VuZF9tZ210KGRldiwgSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBJRUVFODAyMTFfU1RZUEVfREVBVVRILAorCQkJIChjaGFyICopICZyZXNwLCAyLCBzdGEtPmFkZHIsIDApOworCisJaWYgKChzdGEtPmZsYWdzICYgV0xBTl9TVEFfQVNTT0MpICYmICFzdGEtPmFwKQorCQlob3N0YXBfZXZlbnRfZXhwaXJlZF9zdGEoZGV2LCBzdGEpOworCisJYXBfZnJlZV9zdGEoYXAsIHN0YSk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQgKi8KKworCitzdGF0aWMgdm9pZCBhcF9jb250cm9sX2tpY2thbGwoc3RydWN0IGFwX2RhdGEgKmFwKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisKKwlzcGluX2xvY2tfYmgoJmFwLT5zdGFfdGFibGVfbG9jayk7CisJZm9yIChwdHIgPSBhcC0+c3RhX2xpc3QubmV4dCwgbiA9IHB0ci0+bmV4dDsgcHRyICE9ICZhcC0+c3RhX2xpc3Q7CisJICAgICBwdHIgPSBuLCBuID0gcHRyLT5uZXh0KSB7CisJCXN0YSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3Qgc3RhX2luZm8sIGxpc3QpOworCQlhcF9zdGFfaGFzaF9kZWwoYXAsIHN0YSk7CisJCWxpc3RfZGVsKCZzdGEtPmxpc3QpOworCQlpZiAoKHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9BU1NPQykgJiYgIXN0YS0+YXAgJiYgc3RhLT5sb2NhbCkKKwkJCWhvc3RhcF9ldmVudF9leHBpcmVkX3N0YShzdGEtPmxvY2FsLT5kZXYsIHN0YSk7CisJCWFwX2ZyZWVfc3RhKGFwLCBzdGEpOworCX0KKwlzcGluX3VubG9ja19iaCgmYXAtPnN0YV90YWJsZV9sb2NrKTsKK30KKworCisjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKKworI2RlZmluZSBQUk9DX0xJTUlUIChQQUdFX1NJWkUgLSA4MCkKKworc3RhdGljIGludCBwcmlzbTJfYXBfcHJvY19yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJY2hhciAqcCA9IHBhZ2U7CisJc3RydWN0IGFwX2RhdGEgKmFwID0gKHN0cnVjdCBhcF9kYXRhICopIGRhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCWludCBpOworCisJaWYgKG9mZiA+IFBST0NfTElNSVQpIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCXAgKz0gc3ByaW50ZihwLCAiIyBCU1NJRCBDSEFOIFNJR05BTCBOT0lTRSBSQVRFIFNTSUQgRkxBR1NcbiIpOworCXNwaW5fbG9ja19iaCgmYXAtPnN0YV90YWJsZV9sb2NrKTsKKwlmb3IgKHB0ciA9IGFwLT5zdGFfbGlzdC5uZXh0OyBwdHIgIT0gJmFwLT5zdGFfbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7CisJCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKSBwdHI7CisKKwkJaWYgKCFzdGEtPmFwKQorCQkJY29udGludWU7CisKKwkJcCArPSBzcHJpbnRmKHAsIE1BQ1NUUiAiICVkICVkICVkICVkICciLCBNQUMyU1RSKHN0YS0+YWRkciksCisJCQkgICAgIHN0YS0+dS5hcC5jaGFubmVsLCBzdGEtPmxhc3Rfcnhfc2lnbmFsLAorCQkJICAgICBzdGEtPmxhc3Rfcnhfc2lsZW5jZSwgc3RhLT5sYXN0X3J4X3JhdGUpOworCQlmb3IgKGkgPSAwOyBpIDwgc3RhLT51LmFwLnNzaWRfbGVuOyBpKyspCisJCQlwICs9IHNwcmludGYocCwgKChzdGEtPnUuYXAuc3NpZFtpXSA+PSAzMiAmJgorCQkJCQkgIHN0YS0+dS5hcC5zc2lkW2ldIDwgMTI3KSA/CisJCQkJCSAiJWMiIDogIjwlMDJ4PiIpLAorCQkJCSAgICAgc3RhLT51LmFwLnNzaWRbaV0pOworCQlwICs9IHNwcmludGYocCwgIiciKTsKKwkJaWYgKHN0YS0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpCisJCQlwICs9IHNwcmludGYocCwgIiBbRVNTXSIpOworCQlpZiAoc3RhLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpCisJCQlwICs9IHNwcmludGYocCwgIiBbSUJTU10iKTsKKwkJaWYgKHN0YS0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQorCQkJcCArPSBzcHJpbnRmKHAsICIgW1dFUF0iKTsKKwkJcCArPSBzcHJpbnRmKHAsICJcbiIpOworCisJCWlmICgocCAtIHBhZ2UpID4gUFJPQ19MSU1JVCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgImhvc3RhcDogYXAgcHJvYyBkaWQgbm90IGZpdFxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmYXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmICgocCAtIHBhZ2UpIDw9IG9mZikgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCXJldHVybiAocCAtIHBhZ2UgLSBvZmYpOworfQorI2VuZGlmIC8qIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQgKi8KKworCit2b2lkIGhvc3RhcF9jaGVja19zdGFfZndfdmVyc2lvbihzdHJ1Y3QgYXBfZGF0YSAqYXAsIGludCBzdGFfZndfdmVyKQoreworCWlmICghYXApCisJCXJldHVybjsKKworCWlmIChzdGFfZndfdmVyID09IFBSSVNNMl9GV19WRVIoMCw4LDApKSB7CisJCVBERUJVRyhERUJVR19BUCwgIlVzaW5nIGRhdGE6Om51bGxmdW5jIEFDSyB3b3JrYXJvdW5kIC0gIgorCQkgICAgICAgImZpcm13YXJlIHVwZ3JhZGUgcmVjb21tZW5kZWRcbiIpOworCQlhcC0+bnVsbGZ1bmNfYWNrID0gMTsKKwl9IGVsc2UKKwkJYXAtPm51bGxmdW5jX2FjayA9IDA7CisKKwlpZiAoc3RhX2Z3X3ZlciA9PSBQUklTTTJfRldfVkVSKDEsNCwyKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogV2FybmluZzogc2Vjb25kYXJ5IHN0YXRpb24gZmlybXdhcmUgIgorCQkgICAgICAgInZlcnNpb24gMS40LjIgZG9lcyBub3Qgc2VlbSB0byB3b3JrIGluIEhvc3QgQVAgbW9kZVxuIiwKKwkJICAgICAgIGFwLT5sb2NhbC0+ZGV2LT5uYW1lKTsKKwl9Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgdm9pZCBob3N0YXBfYXBfdHhfY2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9rLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhcF9kYXRhICphcCA9IGRhdGE7CisJdTE2IGZjOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisKKwlpZiAoIWFwLT5sb2NhbC0+aG9zdGFwZCB8fCAhYXAtPmxvY2FsLT5hcGRldikgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCisJLyogUGFzcyB0aGUgVFggY2FsbGJhY2sgZnJhbWUgdG8gdGhlIGhvc3RhcGQ7IHVzZSA4MDIuMTEgaGVhZGVyIHZlcnNpb24KKwkgKiAxIHRvIGluZGljYXRlIGZhaWx1cmUgKG5vIEFDSykgYW5kIDIgc3VjY2VzcyAoZnJhbWUgQUNLZWQpICovCisKKwlmYyAmPSB+SUVFRTgwMjExX0ZDVExfVkVSUzsKKwlmYyB8PSBvayA/IEJJVCgxKSA6IEJJVCgwKTsKKwloZHItPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KGZjKTsKKworCXNrYi0+ZGV2ID0gYXAtPmxvY2FsLT5hcGRldjsKKwlza2JfcHVsbChza2IsIGhvc3RhcF84MDIxMV9nZXRfaGRybGVuKGZjKSk7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzIpOworCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOworCW5ldGlmX3J4KHNrYik7Cit9CisKKworI2lmbmRlZiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyB2b2lkIGhvc3RhcF9hcF90eF9jYl9hdXRoKHN0cnVjdCBza19idWZmICpza2IsIGludCBvaywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYXBfZGF0YSAqYXAgPSBkYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhcC0+bG9jYWwtPmRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXUxNiBmYywgKnBvcywgYXV0aF9hbGcsIGF1dGhfdHJhbnNhY3Rpb24sIHN0YXR1czsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IE5VTEw7CisJY2hhciAqdHh0ID0gTlVMTDsKKworCWlmIChhcC0+bG9jYWwtPmhvc3RhcGQpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwlpZiAoV0xBTl9GQ19HRVRfVFlQRShmYykgIT0gSUVFRTgwMjExX0ZUWVBFX01HTVQgfHwKKwkgICAgV0xBTl9GQ19HRVRfU1RZUEUoZmMpICE9IElFRUU4MDIxMV9TVFlQRV9BVVRIIHx8CisJICAgIHNrYi0+bGVuIDwgSUVFRTgwMjExX01HTVRfSERSX0xFTiArIDYpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBob3N0YXBfYXBfdHhfY2JfYXV0aCByZWNlaXZlZCBpbnZhbGlkICIKKwkJICAgICAgICJmcmFtZVxuIiwgZGV2LT5uYW1lKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJcG9zID0gKHUxNiAqKSAoc2tiLT5kYXRhICsgSUVFRTgwMjExX01HTVRfSERSX0xFTik7CisJYXV0aF9hbGcgPSBsZTE2X3RvX2NwdSgqcG9zKyspOworCWF1dGhfdHJhbnNhY3Rpb24gPSBsZTE2X3RvX2NwdSgqcG9zKyspOworCXN0YXR1cyA9IGxlMTZfdG9fY3B1KCpwb3MrKyk7CisKKwlpZiAoIW9rKSB7CisJCXR4dCA9ICJmcmFtZSB3YXMgbm90IEFDS2VkIjsKKwkJZ290byBkb25lOworCX0KKworCXNwaW5fbG9jaygmYXAtPnN0YV90YWJsZV9sb2NrKTsKKwlzdGEgPSBhcF9nZXRfc3RhKGFwLCBoZHItPmFkZHIxKTsKKwlpZiAoc3RhKQorCQlhdG9taWNfaW5jKCZzdGEtPnVzZXJzKTsKKwlzcGluX3VubG9jaygmYXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmICghc3RhKSB7CisJCXR4dCA9ICJTVEEgbm90IGZvdW5kIjsKKwkJZ290byBkb25lOworCX0KKworCWlmIChzdGF0dXMgPT0gV0xBTl9TVEFUVVNfU1VDQ0VTUyAmJgorCSAgICAoKGF1dGhfYWxnID09IFdMQU5fQVVUSF9PUEVOICYmIGF1dGhfdHJhbnNhY3Rpb24gPT0gMikgfHwKKwkgICAgIChhdXRoX2FsZyA9PSBXTEFOX0FVVEhfU0hBUkVEX0tFWSAmJiBhdXRoX3RyYW5zYWN0aW9uID09IDQpKSkgeworCQl0eHQgPSAiU1RBIGF1dGhlbnRpY2F0ZWQiOworCQlzdGEtPmZsYWdzIHw9IFdMQU5fU1RBX0FVVEg7CisJCXN0YS0+bGFzdF9hdXRoID0gamlmZmllczsKKwl9IGVsc2UgaWYgKHN0YXR1cyAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKQorCQl0eHQgPSAiYXV0aGVudGljYXRpb24gZmFpbGVkIjsKKworIGRvbmU6CisJaWYgKHN0YSkKKwkJYXRvbWljX2RlYygmc3RhLT51c2Vycyk7CisJaWYgKHR4dCkgeworCQlQREVCVUcoREVCVUdfQVAsICIlczogIiBNQUNTVFIgIiBhdXRoX2NiIC0gYWxnPSVkIHRyYW5zIz0lZCAiCisJCSAgICAgICAic3RhdHVzPSVkIC0gJXNcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIE1BQzJTVFIoaGRyLT5hZGRyMSksIGF1dGhfYWxnLAorCQkgICAgICAgYXV0aF90cmFuc2FjdGlvbiwgc3RhdHVzLCB0eHQpOworCX0KKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgdm9pZCBob3N0YXBfYXBfdHhfY2JfYXNzb2Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9rLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhcF9kYXRhICphcCA9IGRhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFwLT5sb2NhbC0+ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJdTE2IGZjLCAqcG9zLCBzdGF0dXM7CisJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBOVUxMOworCWNoYXIgKnR4dCA9IE5VTEw7CisKKwlpZiAoYXAtPmxvY2FsLT5ob3N0YXBkKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJaWYgKFdMQU5fRkNfR0VUX1RZUEUoZmMpICE9IElFRUU4MDIxMV9GVFlQRV9NR01UIHx8CisJICAgIChXTEFOX0ZDX0dFVF9TVFlQRShmYykgIT0gSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1AgJiYKKwkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAhPSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQKSB8fAorCSAgICBza2ItPmxlbiA8IElFRUU4MDIxMV9NR01UX0hEUl9MRU4gKyA0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaG9zdGFwX2FwX3R4X2NiX2Fzc29jIHJlY2VpdmVkIGludmFsaWQgIgorCQkgICAgICAgImZyYW1lXG4iLCBkZXYtPm5hbWUpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIW9rKSB7CisJCXR4dCA9ICJmcmFtZSB3YXMgbm90IEFDS2VkIjsKKwkJZ290byBkb25lOworCX0KKworCXNwaW5fbG9jaygmYXAtPnN0YV90YWJsZV9sb2NrKTsKKwlzdGEgPSBhcF9nZXRfc3RhKGFwLCBoZHItPmFkZHIxKTsKKwlpZiAoc3RhKQorCQlhdG9taWNfaW5jKCZzdGEtPnVzZXJzKTsKKwlzcGluX3VubG9jaygmYXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmICghc3RhKSB7CisJCXR4dCA9ICJTVEEgbm90IGZvdW5kIjsKKwkJZ290byBkb25lOworCX0KKworCXBvcyA9ICh1MTYgKikgKHNrYi0+ZGF0YSArIElFRUU4MDIxMV9NR01UX0hEUl9MRU4pOworCXBvcysrOworCXN0YXR1cyA9IGxlMTZfdG9fY3B1KCpwb3MrKyk7CisJaWYgKHN0YXR1cyA9PSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7CisJCWlmICghKHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9BU1NPQykpCisJCQlob3N0YXBfZXZlbnRfbmV3X3N0YShkZXYsIHN0YSk7CisJCXR4dCA9ICJTVEEgYXNzb2NpYXRlZCI7CisJCXN0YS0+ZmxhZ3MgfD0gV0xBTl9TVEFfQVNTT0M7CisJCXN0YS0+bGFzdF9hc3NvYyA9IGppZmZpZXM7CisJfSBlbHNlCisJCXR4dCA9ICJhc3NvY2lhdGlvbiBmYWlsZWQiOworCisgZG9uZToKKwlpZiAoc3RhKQorCQlhdG9taWNfZGVjKCZzdGEtPnVzZXJzKTsKKwlpZiAodHh0KSB7CisJCVBERUJVRyhERUJVR19BUCwgIiVzOiAiIE1BQ1NUUiAiIGFzc29jX2NiIC0gJXNcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIE1BQzJTVFIoaGRyLT5hZGRyMSksIHR4dCk7CisJfQorCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpOyBUWCBjYWxsYmFjayBmb3IgcG9sbCBmcmFtZXMgdXNlZAorICogaW4gdmVyaWZ5aW5nIHdoZXRoZXIgdGhlIFNUQSBpcyBzdGlsbCBwcmVzZW50LiAqLworc3RhdGljIHZvaWQgaG9zdGFwX2FwX3R4X2NiX3BvbGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9rLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhcF9kYXRhICphcCA9IGRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKworCWlmIChza2ItPmxlbiA8IDI0KQorCQlnb3RvIGZhaWw7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwlpZiAob2spIHsKKwkJc3Bpbl9sb2NrKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCQlzdGEgPSBhcF9nZXRfc3RhKGFwLCBoZHItPmFkZHIxKTsKKwkJaWYgKHN0YSkKKwkJCXN0YS0+ZmxhZ3MgJj0gfldMQU5fU1RBX1BFTkRJTkdfUE9MTDsKKwkJc3Bpbl91bmxvY2soJmFwLT5zdGFfdGFibGVfbG9jayk7CisJfSBlbHNlIHsKKwkJUERFQlVHKERFQlVHX0FQLCAiJXM6IFNUQSAiIE1BQ1NUUiAiIGRpZCBub3QgQUNLIGFjdGl2aXR5ICIKKwkJICAgICAgICJwb2xsIGZyYW1lXG4iLCBhcC0+bG9jYWwtPmRldi0+bmFtZSwKKwkJICAgICAgIE1BQzJTVFIoaGRyLT5hZGRyMSkpOworCX0KKworIGZhaWw6CisJZGV2X2tmcmVlX3NrYihza2IpOworfQorI2VuZGlmIC8qIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQgKi8KKworCit2b2lkIGhvc3RhcF9pbml0X2RhdGEobG9jYWxfaW5mb190ICpsb2NhbCkKK3sKKwlzdHJ1Y3QgYXBfZGF0YSAqYXAgPSBsb2NhbC0+YXA7CisKKwlpZiAoYXAgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJob3N0YXBfaW5pdF9kYXRhOiBhcCA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQoYXAsIDAsIHNpemVvZihzdHJ1Y3QgYXBfZGF0YSkpOworCWFwLT5sb2NhbCA9IGxvY2FsOworCisJYXAtPmFwX3BvbGljeSA9IEdFVF9JTlRfUEFSTShvdGhlcl9hcF9wb2xpY3ksIGxvY2FsLT5jYXJkX2lkeCk7CisJYXAtPmJyaWRnZV9wYWNrZXRzID0gR0VUX0lOVF9QQVJNKGFwX2JyaWRnZV9wYWNrZXRzLCBsb2NhbC0+Y2FyZF9pZHgpOworCWFwLT5tYXhfaW5hY3Rpdml0eSA9CisJCUdFVF9JTlRfUEFSTShhcF9tYXhfaW5hY3Rpdml0eSwgbG9jYWwtPmNhcmRfaWR4KSAqIEhaOworCWFwLT5hdXRvbV9hcF93ZHMgPSBHRVRfSU5UX1BBUk0oYXV0b21fYXBfd2RzLCBsb2NhbC0+Y2FyZF9pZHgpOworCisJc3Bpbl9sb2NrX2luaXQoJmFwLT5zdGFfdGFibGVfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmFwLT5zdGFfbGlzdCk7CisKKwkvKiBJbml0aWFsaXplIHRhc2sgcXVldWUgc3RydWN0dXJlIGZvciBBUCBtYW5hZ2VtZW50ICovCisJSU5JVF9XT1JLKCZsb2NhbC0+YXAtPmFkZF9zdGFfcHJvY19xdWV1ZSwgaGFuZGxlX2FkZF9wcm9jX3F1ZXVlLCBhcCk7CisKKwlhcC0+dHhfY2FsbGJhY2tfaWR4ID0KKwkJaG9zdGFwX3R4X2NhbGxiYWNrX3JlZ2lzdGVyKGxvY2FsLCBob3N0YXBfYXBfdHhfY2IsIGFwKTsKKwlpZiAoYXAtPnR4X2NhbGxiYWNrX2lkeCA9PSAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIFRYIGNhbGxiYWNrIGZvciAiCisJCSAgICAgICAiQVBcbiIsIGxvY2FsLT5kZXYtPm5hbWUpOworI2lmbmRlZiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UCisJSU5JVF9XT1JLKCZsb2NhbC0+YXAtPndkc19vcGVyX3F1ZXVlLCBoYW5kbGVfd2RzX29wZXJfcXVldWUsIGxvY2FsKTsKKworCWFwLT50eF9jYWxsYmFja19hdXRoID0KKwkJaG9zdGFwX3R4X2NhbGxiYWNrX3JlZ2lzdGVyKGxvY2FsLCBob3N0YXBfYXBfdHhfY2JfYXV0aCwgYXApOworCWFwLT50eF9jYWxsYmFja19hc3NvYyA9CisJCWhvc3RhcF90eF9jYWxsYmFja19yZWdpc3Rlcihsb2NhbCwgaG9zdGFwX2FwX3R4X2NiX2Fzc29jLCBhcCk7CisJYXAtPnR4X2NhbGxiYWNrX3BvbGwgPQorCQlob3N0YXBfdHhfY2FsbGJhY2tfcmVnaXN0ZXIobG9jYWwsIGhvc3RhcF9hcF90eF9jYl9wb2xsLCBhcCk7CisJaWYgKGFwLT50eF9jYWxsYmFja19hdXRoID09IDAgfHwgYXAtPnR4X2NhbGxiYWNrX2Fzc29jID09IDAgfHwKKwkJYXAtPnR4X2NhbGxiYWNrX3BvbGwgPT0gMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBUWCBjYWxsYmFjayBmb3IgIgorCQkgICAgICAgIkFQXG4iLCBsb2NhbC0+ZGV2LT5uYW1lKTsKKworCXNwaW5fbG9ja19pbml0KCZhcC0+bWFjX3Jlc3RyaWN0aW9ucy5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmYXAtPm1hY19yZXN0cmljdGlvbnMubWFjX2xpc3QpOworI2VuZGlmIC8qIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQgKi8KKworCWFwLT5pbml0aWFsaXplZCA9IDE7Cit9CisKKwordm9pZCBob3N0YXBfaW5pdF9hcF9wcm9jKGxvY2FsX2luZm9fdCAqbG9jYWwpCit7CisJc3RydWN0IGFwX2RhdGEgKmFwID0gbG9jYWwtPmFwOworCisJYXAtPnByb2MgPSBsb2NhbC0+cHJvYzsKKwlpZiAoYXAtPnByb2MgPT0gTlVMTCkKKwkJcmV0dXJuOworCisjaWZuZGVmIFBSSVNNMl9OT19QUk9DRlNfREVCVUcKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJhcF9kZWJ1ZyIsIDAsIGFwLT5wcm9jLAorCQkJICAgICAgIGFwX2RlYnVnX3Byb2NfcmVhZCwgYXApOworI2VuZGlmIC8qIFBSSVNNMl9OT19QUk9DRlNfREVCVUcgKi8KKworI2lmbmRlZiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UCisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiYXBfY29udHJvbCIsIDAsIGFwLT5wcm9jLAorCQkJICAgICAgIGFwX2NvbnRyb2xfcHJvY19yZWFkLCBhcCk7CisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiYXAiLCAwLCBhcC0+cHJvYywKKwkJCSAgICAgICBwcmlzbTJfYXBfcHJvY19yZWFkLCBhcCk7CisjZW5kaWYgLyogUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLworCit9CisKKwordm9pZCBob3N0YXBfZnJlZV9kYXRhKHN0cnVjdCBhcF9kYXRhICphcCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuLCAqcHRyOworCisJaWYgKGFwID09IE5VTEwgfHwgIWFwLT5pbml0aWFsaXplZCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaG9zdGFwX2ZyZWVfZGF0YTogYXAgaGFzIG5vdCB5ZXQgYmVlbiAiCisJCSAgICAgICAiaW5pdGlhbGl6ZWQgLSBza2lwIHJlc291cmNlIGZyZWVpbmdcbiIpOworCQlyZXR1cm47CisJfQorCisjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKKwlpZiAoYXAtPmNyeXB0KQorCQlhcC0+Y3J5cHQtPmRlaW5pdChhcC0+Y3J5cHRfcHJpdik7CisJYXAtPmNyeXB0ID0gYXAtPmNyeXB0X3ByaXYgPSBOVUxMOworI2VuZGlmIC8qIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQgKi8KKworCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG4sICZhcC0+c3RhX2xpc3QpIHsKKwkJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IHN0YV9pbmZvLCBsaXN0KTsKKwkJYXBfc3RhX2hhc2hfZGVsKGFwLCBzdGEpOworCQlsaXN0X2RlbCgmc3RhLT5saXN0KTsKKwkJaWYgKChzdGEtPmZsYWdzICYgV0xBTl9TVEFfQVNTT0MpICYmICFzdGEtPmFwICYmIHN0YS0+bG9jYWwpCisJCQlob3N0YXBfZXZlbnRfZXhwaXJlZF9zdGEoc3RhLT5sb2NhbC0+ZGV2LCBzdGEpOworCQlhcF9mcmVlX3N0YShhcCwgc3RhKTsKKwl9CisKKyNpZm5kZWYgUFJJU00yX05PX1BST0NGU19ERUJVRworCWlmIChhcC0+cHJvYyAhPSBOVUxMKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJhcF9kZWJ1ZyIsIGFwLT5wcm9jKTsKKwl9CisjZW5kaWYgLyogUFJJU00yX05PX1BST0NGU19ERUJVRyAqLworCisjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKKwlpZiAoYXAtPnByb2MgIT0gTlVMTCkgeworCSAgcmVtb3ZlX3Byb2NfZW50cnkoImFwIiwgYXAtPnByb2MpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiYXBfY29udHJvbCIsIGFwLT5wcm9jKTsKKwl9CisJYXBfY29udHJvbF9mbHVzaF9tYWNzKCZhcC0+bWFjX3Jlc3RyaWN0aW9ucyk7CisjZW5kaWYgLyogUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLworCisJYXAtPmluaXRpYWxpemVkID0gMDsKK30KKworCisvKiBjYWxsZXIgc2hvdWxkIGhhdmUgbXV0ZXggZm9yIEFQIFNUQSBsaXN0IGhhbmRsaW5nICovCitzdGF0aWMgc3RydWN0IHN0YV9pbmZvKiBhcF9nZXRfc3RhKHN0cnVjdCBhcF9kYXRhICphcCwgdTggKnN0YSkKK3sKKwlzdHJ1Y3Qgc3RhX2luZm8gKnM7CisKKwlzID0gYXAtPnN0YV9oYXNoW1NUQV9IQVNIKHN0YSldOworCXdoaWxlIChzICE9IE5VTEwgJiYgbWVtY21wKHMtPmFkZHIsIHN0YSwgRVRIX0FMRU4pICE9IDApCisJCXMgPSBzLT5obmV4dDsKKwlyZXR1cm4gczsKK30KKworCisjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKKworLyogQ2FsbGVkIGZyb20gdGltZXIgaGFuZGxlciBhbmQgZnJvbSBzY2hlZHVsZWQgQVAgcXVldWUgaGFuZGxlcnMgKi8KK3N0YXRpYyB2b2lkIHByaXNtMl9zZW5kX21nbXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgdTE2IHR5cGVfc3VidHlwZSwgY2hhciAqYm9keSwKKwkJCSAgICAgaW50IGJvZHlfbGVuLCB1OCAqYWRkciwgdTE2IHR4X2NiX2lkeCkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXUxNiBmYzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBob3N0YXBfc2tiX3R4X2RhdGEgKm1ldGE7CisJaW50IGhkcmxlbjsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKwlkZXYgPSBsb2NhbC0+ZGV2OyAvKiBhbHdheXMgdXNlIG1hc3RlciByYWRpbyBkZXZpY2UgKi8KKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkgeworCQlQREVCVUcoREVCVUdfQVAsICIlczogcHJpc20yX3NlbmRfbWdtdCAtIGRldmljZSBpcyBub3QgVVAgLSAiCisJCSAgICAgICAiY2Fubm90IHNlbmQgZnJhbWVcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZigqaGRyKSArIGJvZHlfbGVuKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJUERFQlVHKERFQlVHX0FQLCAiJXM6IHByaXNtMl9zZW5kX21nbXQgZmFpbGVkIHRvIGFsbG9jYXRlICIKKwkJICAgICAgICJza2JcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlmYyA9IHR5cGVfc3VidHlwZTsKKwloZHJsZW4gPSBob3N0YXBfODAyMTFfZ2V0X2hkcmxlbihmYyk7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYl9wdXQoc2tiLCBoZHJsZW4pOworCWlmIChib2R5KQorCQltZW1jcHkoc2tiX3B1dChza2IsIGJvZHlfbGVuKSwgYm9keSwgYm9keV9sZW4pOworCisJbWVtc2V0KGhkciwgMCwgaGRybGVuKTsKKworCS8qIEZJWDogY3RybDo6YWNrIHNlbmRpbmcgdXNlZCBzcGVjaWFsIEhGQTM4NFhfVFhfQ1RSTF84MDJfMTEKKwkgKiB0eF9jb250cm9sIGluc3RlYWQgb2YgdXNpbmcgbG9jYWwtPnR4X2NvbnRyb2wgKi8KKworCisJbWVtY3B5KGhkci0+YWRkcjEsIGFkZHIsIEVUSF9BTEVOKTsgLyogREEgLyBSQSAqLworCWlmIChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSkgeworCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9GUk9NRFM7CisJCW1lbWNweShoZHItPmFkZHIyLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7IC8qIEJTU0lEICovCisJCW1lbWNweShoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7IC8qIFNBICovCisJfSBlbHNlIGlmIChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfQ1RMKSB7CisJCS8qIGNvbnRyb2w6QUNLIGRvZXMgbm90IGhhdmUgYWRkcjIgb3IgYWRkcjMgKi8KKwkJbWVtc2V0KGhkci0+YWRkcjIsIDAsIEVUSF9BTEVOKTsKKwkJbWVtc2V0KGhkci0+YWRkcjMsIDAsIEVUSF9BTEVOKTsKKwl9IGVsc2UgeworCQltZW1jcHkoaGRyLT5hZGRyMiwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOyAvKiBTQSAqLworCQltZW1jcHkoaGRyLT5hZGRyMywgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOyAvKiBCU1NJRCAqLworCX0KKworCWhkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoZmMpOworCisJbWV0YSA9IChzdHJ1Y3QgaG9zdGFwX3NrYl90eF9kYXRhICopIHNrYi0+Y2I7CisJbWVtc2V0KG1ldGEsIDAsIHNpemVvZigqbWV0YSkpOworCW1ldGEtPm1hZ2ljID0gSE9TVEFQX1NLQl9UWF9EQVRBX01BR0lDOworCW1ldGEtPmlmYWNlID0gaWZhY2U7CisJbWV0YS0+dHhfY2JfaWR4ID0gdHhfY2JfaWR4OworCisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKK30KKyNlbmRpZiAvKiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCisKKworc3RhdGljIGludCBwcmlzbTJfc3RhX3Byb2NfcmVhZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWNoYXIgKnAgPSBwYWdlOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKSBkYXRhOworCWludCBpOworCisJLyogRklYOiBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbi4uIHRoZSBTVEEgZGF0YSBjb3VsZCBoYXZlIGp1c3QgZXhwaXJlZCwKKwkgKiBidXQgcHJvYyBlbnRyeSB3YXMgc3RpbGwgaGVyZSBzbyB0aGF0IHRoZSByZWFkIGNvdWxkIGhhdmUgc3RhcnRlZDsKKwkgKiBzb21lIGxvY2tpbmcgc2hvdWxkIGJlIGRvbmUgaGVyZS4uICovCisKKwlpZiAob2ZmICE9IDApIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCXAgKz0gc3ByaW50ZihwLCAiJXM9IiBNQUNTVFIgIlxudXNlcnM9JWRcbmFpZD0lZFxuIgorCQkgICAgICJmbGFncz0weCUwNHglcyVzJXMlcyVzJXMlc1xuIgorCQkgICAgICJjYXBhYmlsaXR5PTB4JTAyeFxubGlzdGVuX2ludGVydmFsPSVkXG5zdXBwb3J0ZWRfcmF0ZXM9IiwKKwkJICAgICBzdGEtPmFwID8gIkFQIiA6ICJTVEEiLAorCQkgICAgIE1BQzJTVFIoc3RhLT5hZGRyKSwgYXRvbWljX3JlYWQoJnN0YS0+dXNlcnMpLCBzdGEtPmFpZCwKKwkJICAgICBzdGEtPmZsYWdzLAorCQkgICAgIHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9BVVRIID8gIiBBVVRIIiA6ICIiLAorCQkgICAgIHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9BU1NPQyA/ICIgQVNTT0MiIDogIiIsCisJCSAgICAgc3RhLT5mbGFncyAmIFdMQU5fU1RBX1BTID8gIiBQUyIgOiAiIiwKKwkJICAgICBzdGEtPmZsYWdzICYgV0xBTl9TVEFfVElNID8gIiBUSU0iIDogIiIsCisJCSAgICAgc3RhLT5mbGFncyAmIFdMQU5fU1RBX1BFUk0gPyAiIFBFUk0iIDogIiIsCisJCSAgICAgc3RhLT5mbGFncyAmIFdMQU5fU1RBX0FVVEhPUklaRUQgPyAiIEFVVEhPUklaRUQiIDogIiIsCisJCSAgICAgc3RhLT5mbGFncyAmIFdMQU5fU1RBX1BFTkRJTkdfUE9MTCA/ICIgUE9MTCIgOiAiIiwKKwkJICAgICBzdGEtPmNhcGFiaWxpdHksIHN0YS0+bGlzdGVuX2ludGVydmFsKTsKKwkvKiBzdXBwb3J0ZWRfcmF0ZXM6IDUwMCBrYml0L3MgdW5pdHMgd2l0aCBtc2IgaWdub3JlZCAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RhLT5zdXBwb3J0ZWRfcmF0ZXMpOyBpKyspCisJCWlmIChzdGEtPnN1cHBvcnRlZF9yYXRlc1tpXSAhPSAwKQorCQkJcCArPSBzcHJpbnRmKHAsICIlZCVzTWJwcyAiLAorCQkJCSAgICAgKHN0YS0+c3VwcG9ydGVkX3JhdGVzW2ldICYgMHg3ZikgLyAyLAorCQkJCSAgICAgc3RhLT5zdXBwb3J0ZWRfcmF0ZXNbaV0gJiAxID8gIi41IiA6ICIiKTsKKwlwICs9IHNwcmludGYocCwgIlxuamlmZmllcz0lbHVcbmxhc3RfYXV0aD0lbHVcbmxhc3RfYXNzb2M9JWx1XG4iCisJCSAgICAgImxhc3Rfcng9JWx1XG5sYXN0X3R4PSVsdVxucnhfcGFja2V0cz0lbHVcbiIKKwkJICAgICAidHhfcGFja2V0cz0lbHVcbiIKKwkJICAgICAicnhfYnl0ZXM9JWx1XG50eF9ieXRlcz0lbHVcbmJ1ZmZlcl9jb3VudD0lZFxuIgorCQkgICAgICJsYXN0X3J4OiBzaWxlbmNlPSVkIGRCbSBzaWduYWw9JWQgZEJtIHJhdGU9JWQlcyBNYnBzXG4iCisJCSAgICAgInR4X3JhdGU9JWRcbnR4WzFNXT0lZFxudHhbMk1dPSVkXG50eFs1LjVNXT0lZFxuIgorCQkgICAgICJ0eFsxMU1dPSVkXG4iCisJCSAgICAgInJ4WzFNXT0lZFxucnhbMk1dPSVkXG5yeFs1LjVNXT0lZFxucnhbMTFNXT0lZFxuIiwKKwkJICAgICBqaWZmaWVzLCBzdGEtPmxhc3RfYXV0aCwgc3RhLT5sYXN0X2Fzc29jLCBzdGEtPmxhc3RfcngsCisJCSAgICAgc3RhLT5sYXN0X3R4LAorCQkgICAgIHN0YS0+cnhfcGFja2V0cywgc3RhLT50eF9wYWNrZXRzLCBzdGEtPnJ4X2J5dGVzLAorCQkgICAgIHN0YS0+dHhfYnl0ZXMsIHNrYl9xdWV1ZV9sZW4oJnN0YS0+dHhfYnVmKSwKKwkJICAgICBzdGEtPmxhc3Rfcnhfc2lsZW5jZSwKKwkJICAgICBzdGEtPmxhc3Rfcnhfc2lnbmFsLCBzdGEtPmxhc3RfcnhfcmF0ZSAvIDEwLAorCQkgICAgIHN0YS0+bGFzdF9yeF9yYXRlICUgMTAgPyAiLjUiIDogIiIsCisJCSAgICAgc3RhLT50eF9yYXRlLCBzdGEtPnR4X2NvdW50WzBdLCBzdGEtPnR4X2NvdW50WzFdLAorCQkgICAgIHN0YS0+dHhfY291bnRbMl0sIHN0YS0+dHhfY291bnRbM10sICBzdGEtPnJ4X2NvdW50WzBdLAorCQkgICAgIHN0YS0+cnhfY291bnRbMV0sIHN0YS0+cnhfY291bnRbMl0sIHN0YS0+cnhfY291bnRbM10pOworCWlmIChzdGEtPmNyeXB0ICYmIHN0YS0+Y3J5cHQtPm9wcyAmJiBzdGEtPmNyeXB0LT5vcHMtPnByaW50X3N0YXRzKQorCQlwID0gc3RhLT5jcnlwdC0+b3BzLT5wcmludF9zdGF0cyhwLCBzdGEtPmNyeXB0LT5wcml2KTsKKyNpZm5kZWYgUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVAorCWlmIChzdGEtPmFwKSB7CisJCWlmIChzdGEtPnUuYXAuY2hhbm5lbCA+PSAwKQorCQkJcCArPSBzcHJpbnRmKHAsICJjaGFubmVsPSVkXG4iLCBzdGEtPnUuYXAuY2hhbm5lbCk7CisJCXAgKz0gc3ByaW50ZihwLCAic3NpZD0iKTsKKwkJZm9yIChpID0gMDsgaSA8IHN0YS0+dS5hcC5zc2lkX2xlbjsgaSsrKQorCQkJcCArPSBzcHJpbnRmKHAsICgoc3RhLT51LmFwLnNzaWRbaV0gPj0gMzIgJiYKKwkJCQkJICBzdGEtPnUuYXAuc3NpZFtpXSA8IDEyNykgPworCQkJCQkgIiVjIiA6ICI8JTAyeD4iKSwKKwkJCQkgICAgIHN0YS0+dS5hcC5zc2lkW2ldKTsKKwkJcCArPSBzcHJpbnRmKHAsICJcbiIpOworCX0KKyNlbmRpZiAvKiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCisKKwlyZXR1cm4gKHAgLSBwYWdlKTsKK30KKworCitzdGF0aWMgdm9pZCBoYW5kbGVfYWRkX3Byb2NfcXVldWUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYXBfZGF0YSAqYXAgPSAoc3RydWN0IGFwX2RhdGEgKikgZGF0YTsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKwljaGFyIG5hbWVbMjBdOworCXN0cnVjdCBhZGRfc3RhX3Byb2NfZGF0YSAqZW50cnksICpwcmV2OworCisJZW50cnkgPSBhcC0+YWRkX3N0YV9wcm9jX2VudHJpZXM7CisJYXAtPmFkZF9zdGFfcHJvY19lbnRyaWVzID0gTlVMTDsKKworCXdoaWxlIChlbnRyeSkgeworCQlzcGluX2xvY2tfYmgoJmFwLT5zdGFfdGFibGVfbG9jayk7CisJCXN0YSA9IGFwX2dldF9zdGEoYXAsIGVudHJ5LT5hZGRyKTsKKwkJaWYgKHN0YSkKKwkJCWF0b21pY19pbmMoJnN0YS0+dXNlcnMpOworCQlzcGluX3VubG9ja19iaCgmYXAtPnN0YV90YWJsZV9sb2NrKTsKKworCQlpZiAoc3RhKSB7CisJCQlzcHJpbnRmKG5hbWUsIE1BQ1NUUiwgTUFDMlNUUihzdGEtPmFkZHIpKTsKKwkJCXN0YS0+cHJvYyA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoCisJCQkJbmFtZSwgMCwgYXAtPnByb2MsCisJCQkJcHJpc20yX3N0YV9wcm9jX3JlYWQsIHN0YSk7CisKKwkJCWF0b21pY19kZWMoJnN0YS0+dXNlcnMpOworCQl9CisKKwkJcHJldiA9IGVudHJ5OworCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQlrZnJlZShwcmV2KTsKKwl9Cit9CisKKworc3RhdGljIHN0cnVjdCBzdGFfaW5mbyAqIGFwX2FkZF9zdGEoc3RydWN0IGFwX2RhdGEgKmFwLCB1OCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKworCXN0YSA9IChzdHJ1Y3Qgc3RhX2luZm8gKikKKwkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHN0YV9pbmZvKSwgR0ZQX0FUT01JQyk7CisJaWYgKHN0YSA9PSBOVUxMKSB7CisJCVBERUJVRyhERUJVR19BUCwgIkFQOiBrbWFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGluaXRpYWxpemUgU1RBIGluZm8gZGF0YSAqLworCW1lbXNldChzdGEsIDAsIHNpemVvZihzdHJ1Y3Qgc3RhX2luZm8pKTsKKwlzdGEtPmxvY2FsID0gYXAtPmxvY2FsOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnN0YS0+dHhfYnVmKTsKKwltZW1jcHkoc3RhLT5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CisKKwlhdG9taWNfaW5jKCZzdGEtPnVzZXJzKTsKKwlzcGluX2xvY2tfYmgoJmFwLT5zdGFfdGFibGVfbG9jayk7CisJbGlzdF9hZGQoJnN0YS0+bGlzdCwgJmFwLT5zdGFfbGlzdCk7CisJYXAtPm51bV9zdGErKzsKKwlhcF9zdGFfaGFzaF9hZGQoYXAsIHN0YSk7CisJc3Bpbl91bmxvY2tfYmgoJmFwLT5zdGFfdGFibGVfbG9jayk7CisKKwlpZiAoYXAtPnByb2MpIHsKKwkJc3RydWN0IGFkZF9zdGFfcHJvY19kYXRhICplbnRyeTsKKwkJLyogc2NoZWR1bGUgYSBub24taW50ZXJydXB0IGNvbnRleHQgcHJvY2VzcyB0byBhZGQgYSBwcm9jZnMKKwkJICogZW50cnkgZm9yIHRoZSBTVEEgc2luY2UgcHJvY2ZzIGNvZGUgdXNlIEdGUF9LRVJORUwgKi8KKwkJZW50cnkgPSBrbWFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGVudHJ5KSB7CisJCQltZW1jcHkoZW50cnktPmFkZHIsIHN0YS0+YWRkciwgRVRIX0FMRU4pOworCQkJZW50cnktPm5leHQgPSBhcC0+YWRkX3N0YV9wcm9jX2VudHJpZXM7CisJCQlhcC0+YWRkX3N0YV9wcm9jX2VudHJpZXMgPSBlbnRyeTsKKwkJCXNjaGVkdWxlX3dvcmsoJmFwLT5hZGRfc3RhX3Byb2NfcXVldWUpOworCQl9IGVsc2UKKwkJCXByaW50ayhLRVJOX0RFQlVHICJGYWlsZWQgdG8gYWRkIFNUQSBwcm9jIGRhdGFcbiIpOworCX0KKworI2lmbmRlZiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UCisJaW5pdF90aW1lcigmc3RhLT50aW1lcik7CisJc3RhLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIGFwLT5tYXhfaW5hY3Rpdml0eTsKKwlzdGEtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgc3RhOworCXN0YS0+dGltZXIuZnVuY3Rpb24gPSBhcF9oYW5kbGVfdGltZXI7CisJaWYgKCFhcC0+bG9jYWwtPmhvc3RhcGQpCisJCWFkZF90aW1lcigmc3RhLT50aW1lcik7CisjZW5kaWYgLyogUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLworCisJcmV0dXJuIHN0YTsKK30KKworCitzdGF0aWMgaW50IGFwX3R4X3JhdGVfb2soaW50IHJhdGVpZHgsIHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJIGxvY2FsX2luZm9fdCAqbG9jYWwpCit7CisJaWYgKHJhdGVpZHggPiBzdGEtPnR4X21heF9yYXRlIHx8CisJICAgICEoc3RhLT50eF9zdXBwX3JhdGVzICYgKDEgPDwgcmF0ZWlkeCkpKQorCQlyZXR1cm4gMDsKKworCWlmIChsb2NhbC0+dHhfcmF0ZV9jb250cm9sICE9IDAgJiYKKwkgICAgIShsb2NhbC0+dHhfcmF0ZV9jb250cm9sICYgKDEgPDwgcmF0ZWlkeCkpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl9jaGVja190eF9yYXRlcyhzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKK3sKKwlpbnQgaTsKKworCXN0YS0+dHhfc3VwcF9yYXRlcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdGEtPnN1cHBvcnRlZF9yYXRlcyk7IGkrKykgeworCQlpZiAoKHN0YS0+c3VwcG9ydGVkX3JhdGVzW2ldICYgMHg3ZikgPT0gMikKKwkJCXN0YS0+dHhfc3VwcF9yYXRlcyB8PSBXTEFOX1JBVEVfMU07CisJCWlmICgoc3RhLT5zdXBwb3J0ZWRfcmF0ZXNbaV0gJiAweDdmKSA9PSA0KQorCQkJc3RhLT50eF9zdXBwX3JhdGVzIHw9IFdMQU5fUkFURV8yTTsKKwkJaWYgKChzdGEtPnN1cHBvcnRlZF9yYXRlc1tpXSAmIDB4N2YpID09IDExKQorCQkJc3RhLT50eF9zdXBwX3JhdGVzIHw9IFdMQU5fUkFURV81TTU7CisJCWlmICgoc3RhLT5zdXBwb3J0ZWRfcmF0ZXNbaV0gJiAweDdmKSA9PSAyMikKKwkJCXN0YS0+dHhfc3VwcF9yYXRlcyB8PSBXTEFOX1JBVEVfMTFNOworCX0KKwlzdGEtPnR4X21heF9yYXRlID0gc3RhLT50eF9yYXRlID0gc3RhLT50eF9yYXRlX2lkeCA9IDA7CisJaWYgKHN0YS0+dHhfc3VwcF9yYXRlcyAmIFdMQU5fUkFURV8xTSkgeworCQlzdGEtPnR4X21heF9yYXRlID0gMDsKKwkJaWYgKGFwX3R4X3JhdGVfb2soMCwgc3RhLCBzdGEtPmxvY2FsKSkgeworCQkJc3RhLT50eF9yYXRlID0gMTA7CisJCQlzdGEtPnR4X3JhdGVfaWR4ID0gMDsKKwkJfQorCX0KKwlpZiAoc3RhLT50eF9zdXBwX3JhdGVzICYgV0xBTl9SQVRFXzJNKSB7CisJCXN0YS0+dHhfbWF4X3JhdGUgPSAxOworCQlpZiAoYXBfdHhfcmF0ZV9vaygxLCBzdGEsIHN0YS0+bG9jYWwpKSB7CisJCQlzdGEtPnR4X3JhdGUgPSAyMDsKKwkJCXN0YS0+dHhfcmF0ZV9pZHggPSAxOworCQl9CisJfQorCWlmIChzdGEtPnR4X3N1cHBfcmF0ZXMgJiBXTEFOX1JBVEVfNU01KSB7CisJCXN0YS0+dHhfbWF4X3JhdGUgPSAyOworCQlpZiAoYXBfdHhfcmF0ZV9vaygyLCBzdGEsIHN0YS0+bG9jYWwpKSB7CisJCQlzdGEtPnR4X3JhdGUgPSA1NTsKKwkJCXN0YS0+dHhfcmF0ZV9pZHggPSAyOworCQl9CisJfQorCWlmIChzdGEtPnR4X3N1cHBfcmF0ZXMgJiBXTEFOX1JBVEVfMTFNKSB7CisJCXN0YS0+dHhfbWF4X3JhdGUgPSAzOworCQlpZiAoYXBfdHhfcmF0ZV9vaygzLCBzdGEsIHN0YS0+bG9jYWwpKSB7CisJCQlzdGEtPnR4X3JhdGUgPSAxMTA7CisJCQlzdGEtPnR4X3JhdGVfaWR4ID0gMzsKKwkJfQorCX0KK30KKworCisjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKKworc3RhdGljIHZvaWQgYXBfY3J5cHRfaW5pdChzdHJ1Y3QgYXBfZGF0YSAqYXApCit7CisJYXAtPmNyeXB0ID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKCJXRVAiKTsKKworCWlmIChhcC0+Y3J5cHQpIHsKKwkJaWYgKGFwLT5jcnlwdC0+aW5pdCkgeworCQkJYXAtPmNyeXB0X3ByaXYgPSBhcC0+Y3J5cHQtPmluaXQoMCk7CisJCQlpZiAoYXAtPmNyeXB0X3ByaXYgPT0gTlVMTCkKKwkJCQlhcC0+Y3J5cHQgPSBOVUxMOworCQkJZWxzZSB7CisJCQkJdTgga2V5W1dFUF9LRVlfTEVOXTsKKwkJCQlnZXRfcmFuZG9tX2J5dGVzKGtleSwgV0VQX0tFWV9MRU4pOworCQkJCWFwLT5jcnlwdC0+c2V0X2tleShrZXksIFdFUF9LRVlfTEVOLCBOVUxMLAorCQkJCQkJICAgYXAtPmNyeXB0X3ByaXYpOworCQkJfQorCQl9CisJfQorCisJaWYgKGFwLT5jcnlwdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFQIGNvdWxkIG5vdCBpbml0aWFsaXplIFdFUDogbG9hZCBtb2R1bGUgIgorCQkgICAgICAgImllZWU4MDIxMV9jcnlwdF93ZXAua29cbiIpOworCX0KK30KKworCisvKiBHZW5lcmF0ZSBjaGFsbGVuZ2UgZGF0YSBmb3Igc2hhcmVkIGtleSBhdXRoZW50aWNhdGlvbi4gSUVFRSA4MDIuMTEgc3BlY2lmaWVzCisgKiB0aGF0IFdFUCBhbGdvcml0aG0gaXMgdXNlZCBmb3IgZ2VuZXJhdGluZyBjaGFsbGFuZ2UuIFRoaXMgc2hvdWxkIGJlIHVuaXF1ZSwKKyAqIGJ1dCBvdGhlcndpc2UgdGhlcmUgaXMgbm90IHJlYWxseSBuZWVkIGZvciByYW5kb21uZXNzIGV0Yy4gSW5pdGlhbGl6ZSBXRVAKKyAqIHdpdGggcHNldWRvIHJhbmRvbSBrZXkgYW5kIHRoZW4gdXNlIGluY3JlYXNpbmcgSVYgdG8gZ2V0IHVuaXF1ZSBjaGFsbGVuZ2UKKyAqIHN0cmVhbXMuCisgKgorICogQ2FsbGVkIG9ubHkgYXMgYSBzY2hlZHVsZWQgdGFzayBmb3IgcGVuZGluZyBBUCBmcmFtZXMuCisgKi8KK3N0YXRpYyBjaGFyICogYXBfYXV0aF9tYWtlX2NoYWxsZW5nZShzdHJ1Y3QgYXBfZGF0YSAqYXApCit7CisJY2hhciAqdG1wYnVmOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAoYXAtPmNyeXB0ID09IE5VTEwpIHsKKwkJYXBfY3J5cHRfaW5pdChhcCk7CisJCWlmIChhcC0+Y3J5cHQgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCXRtcGJ1ZiA9IChjaGFyICopIGttYWxsb2MoV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4sIEdGUF9BVE9NSUMpOworCWlmICh0bXBidWYgPT0gTlVMTCkgeworCQlQREVCVUcoREVCVUdfQVAsICJBUDoga21hbGxvYyBmYWlsZWQgZm9yIGNoYWxsZW5nZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IoV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4gKworCQkJICAgIGFwLT5jcnlwdC0+ZXh0cmFfcHJlZml4X2xlbiArCisJCQkgICAgYXAtPmNyeXB0LT5leHRyYV9wb3N0Zml4X2xlbik7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCWtmcmVlKHRtcGJ1Zik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgYXAtPmNyeXB0LT5leHRyYV9wcmVmaXhfbGVuKTsKKwltZW1zZXQoc2tiX3B1dChza2IsIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOKSwgMCwKKwkgICAgICAgV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4pOworCWlmIChhcC0+Y3J5cHQtPmVuY3J5cHRfbXBkdShza2IsIDAsIGFwLT5jcnlwdF9wcml2KSkgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCWtmcmVlKHRtcGJ1Zik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbWNweSh0bXBidWYsIHNrYi0+ZGF0YSArIGFwLT5jcnlwdC0+ZXh0cmFfcHJlZml4X2xlbiwKKwkgICAgICAgV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4pOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiB0bXBidWY7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSBzY2hlZHVsZWQgdGFzayBmb3IgcGVuZGluZyBBUCBmcmFtZXMuICovCitzdGF0aWMgdm9pZCBoYW5kbGVfYXV0aGVuKGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBob3N0YXBfODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0cykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPmRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwlzaXplX3QgaGRybGVuOworCXN0cnVjdCBhcF9kYXRhICphcCA9IGxvY2FsLT5hcDsKKwljaGFyIGJvZHlbOCArIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOXSwgKmNoYWxsZW5nZSA9IE5VTEw7CisJaW50IGxlbiwgb2xlbjsKKwl1MTYgYXV0aF9hbGcsIGF1dGhfdHJhbnNhY3Rpb24sIHN0YXR1c19jb2RlLCAqcG9zOworCXUxNiByZXNwID0gV0xBTl9TVEFUVVNfU1VDQ0VTUywgZmM7CisJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQ7CisJY2hhciAqdHh0ID0gIiI7CisKKwlsZW4gPSBza2ItPmxlbiAtIElFRUU4MDIxMV9NR01UX0hEUl9MRU47CisKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwloZHJsZW4gPSBob3N0YXBfODAyMTFfZ2V0X2hkcmxlbihmYyk7CisKKwlpZiAobGVuIDwgNikgeworCQlQREVCVUcoREVCVUdfQVAsICIlczogaGFuZGxlX2F1dGhlbiAtIHRvbyBzaG9ydCBwYXlsb2FkICIKKwkJICAgICAgICIobGVuPSVkKSBmcm9tICIgTUFDU1RSICJcbiIsIGRldi0+bmFtZSwgbGVuLAorCQkgICAgICAgTUFDMlNUUihoZHItPmFkZHIyKSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfYmgoJmxvY2FsLT5hcC0+c3RhX3RhYmxlX2xvY2spOworCXN0YSA9IGFwX2dldF9zdGEobG9jYWwtPmFwLCBoZHItPmFkZHIyKTsKKwlpZiAoc3RhKQorCQlhdG9taWNfaW5jKCZzdGEtPnVzZXJzKTsKKwlzcGluX3VubG9ja19iaCgmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisKKwlpZiAoc3RhICYmIHN0YS0+Y3J5cHQpCisJCWNyeXB0ID0gc3RhLT5jcnlwdDsKKwllbHNlIHsKKwkJaW50IGlkeCA9IDA7CisJCWlmIChza2ItPmxlbiA+PSBoZHJsZW4gKyAzKQorCQkJaWR4ID0gc2tiLT5kYXRhW2hkcmxlbiArIDNdID4+IDY7CisJCWNyeXB0ID0gbG9jYWwtPmNyeXB0W2lkeF07CisJfQorCisJcG9zID0gKHUxNiAqKSAoc2tiLT5kYXRhICsgSUVFRTgwMjExX01HTVRfSERSX0xFTik7CisJYXV0aF9hbGcgPSBfX2xlMTZfdG9fY3B1KCpwb3MpOworCXBvcysrOworCWF1dGhfdHJhbnNhY3Rpb24gPSBfX2xlMTZfdG9fY3B1KCpwb3MpOworCXBvcysrOworCXN0YXR1c19jb2RlID0gX19sZTE2X3RvX2NwdSgqcG9zKTsKKwlwb3MrKzsKKworCWlmIChtZW1jbXAoZGV2LT5kZXZfYWRkciwgaGRyLT5hZGRyMiwgRVRIX0FMRU4pID09IDAgfHwKKwkgICAgYXBfY29udHJvbF9tYWNfZGVueSgmYXAtPm1hY19yZXN0cmljdGlvbnMsIGhkci0+YWRkcjIpKSB7CisJCXR4dCA9ICJhdXRoZW50aWNhdGlvbiBkZW5pZWQiOworCQlyZXNwID0gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICgoKGxvY2FsLT5hdXRoX2FsZ3MgJiBQUklTTTJfQVVUSF9PUEVOKSAmJgorCSAgICAgYXV0aF9hbGcgPT0gV0xBTl9BVVRIX09QRU4pIHx8CisJICAgICgobG9jYWwtPmF1dGhfYWxncyAmIFBSSVNNMl9BVVRIX1NIQVJFRF9LRVkpICYmCisJICAgICBjcnlwdCAmJiBhdXRoX2FsZyA9PSBXTEFOX0FVVEhfU0hBUkVEX0tFWSkpIHsKKwl9IGVsc2UgeworCQl0eHQgPSAidW5zdXBwb3J0ZWQgYWxnb3JpdGhtIjsKKwkJcmVzcCA9IFdMQU5fU1RBVFVTX05PVF9TVVBQT1JURURfQVVUSF9BTEc7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAobGVuID49IDgpIHsKKwkJdTggKnUgPSAodTggKikgcG9zOworCQlpZiAoKnUgPT0gV0xBTl9FSURfQ0hBTExFTkdFKSB7CisJCQlpZiAoKih1ICsgMSkgIT0gV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4pIHsKKwkJCQl0eHQgPSAiaW52YWxpZCBjaGFsbGVuZ2UgbGVuIjsKKwkJCQlyZXNwID0gV0xBTl9TVEFUVVNfQ0hBTExFTkdFX0ZBSUw7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJaWYgKGxlbiAtIDggPCBXTEFOX0FVVEhfQ0hBTExFTkdFX0xFTikgeworCQkJCXR4dCA9ICJjaGFsbGVuZ2UgdW5kZXJmbG93IjsKKwkJCQlyZXNwID0gV0xBTl9TVEFUVVNfQ0hBTExFTkdFX0ZBSUw7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJY2hhbGxlbmdlID0gKGNoYXIgKikgKHUgKyAyKTsKKwkJfQorCX0KKworCWlmIChzdGEgJiYgc3RhLT5hcCkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGEtPnUuYXAubGFzdF9iZWFjb24gKworCQkJICAgICAgICgxMCAqIHN0YS0+bGlzdGVuX2ludGVydmFsICogSFopIC8gMTAyNCkpIHsKKwkJCVBERUJVRyhERUJVR19BUCwgIiVzOiBubyBiZWFjb25zIHJlY2VpdmVkIGZvciBhIHdoaWxlLCIKKwkJCSAgICAgICAiIGFzc3VtaW5nIEFQICIgTUFDU1RSICIgaXMgbm93IFNUQVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIE1BQzJTVFIoc3RhLT5hZGRyKSk7CisJCQlzdGEtPmFwID0gMDsKKwkJCXN0YS0+ZmxhZ3MgPSAwOworCQkJc3RhLT51LnN0YS5jaGFsbGVuZ2UgPSBOVUxMOworCQl9IGVsc2UgeworCQkJdHh0ID0gIkFQIHRyeWluZyB0byBhdXRoZW50aWNhdGU/IjsKKwkJCXJlc3AgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJaWYgKChhdXRoX2FsZyA9PSBXTEFOX0FVVEhfT1BFTiAmJiBhdXRoX3RyYW5zYWN0aW9uID09IDEpIHx8CisJICAgIChhdXRoX2FsZyA9PSBXTEFOX0FVVEhfU0hBUkVEX0tFWSAmJgorCSAgICAgKGF1dGhfdHJhbnNhY3Rpb24gPT0gMSB8fAorCSAgICAgIChhdXRoX3RyYW5zYWN0aW9uID09IDMgJiYgc3RhICE9IE5VTEwgJiYKKwkgICAgICAgc3RhLT51LnN0YS5jaGFsbGVuZ2UgIT0gTlVMTCkpKSkgeworCX0gZWxzZSB7CisJCXR4dCA9ICJ1bmtub3duIGF1dGhlbnRpY2F0aW9uIHRyYW5zYWN0aW9uIG51bWJlciI7CisJCXJlc3AgPSBXTEFOX1NUQVRVU19VTktOT1dOX0FVVEhfVFJBTlNBQ1RJT047CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoc3RhID09IE5VTEwpIHsKKwkJdHh0ID0gIm5ldyBTVEEiOworCisJCWlmIChsb2NhbC0+YXAtPm51bV9zdGEgPj0gTUFYX1NUQV9DT1VOVCkgeworCQkJLyogRklYOiBtaWdodCB0cnkgdG8gcmVtb3ZlIHNvbWUgb2xkIFNUQXMgZmlyc3Q/ICovCisJCQl0eHQgPSAibm8gbW9yZSByb29tIGZvciBuZXcgU1RBcyI7CisJCQlyZXNwID0gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXN0YSA9IGFwX2FkZF9zdGEobG9jYWwtPmFwLCBoZHItPmFkZHIyKTsKKwkJaWYgKHN0YSA9PSBOVUxMKSB7CisJCQl0eHQgPSAiYXBfYWRkX3N0YSBmYWlsZWQiOworCQkJcmVzcCA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlzd2l0Y2ggKGF1dGhfYWxnKSB7CisJY2FzZSBXTEFOX0FVVEhfT1BFTjoKKwkJdHh0ID0gImF1dGhPSyI7CisJCS8qIElFRUUgODAyLjExIHN0YW5kYXJkIGlzIG5vdCBjb21wbGV0ZWx5IGNsZWFyIGFib3V0CisJCSAqIHdoZXRoZXIgU1RBIGlzIGNvbnNpZGVyZWQgYXV0aGVudGljYXRlZCBhZnRlcgorCQkgKiBhdXRoZW50aWNhdGlvbiBPSyBmcmFtZSBoYXMgYmVlbiBzZW5kIG9yIGFmdGVyIGl0CisJCSAqIGhhcyBiZWVuIEFDS2VkLiBJbiBvcmRlciB0byByZWR1Y2UgaW50ZXJvcGVyYWJpbGl0eQorCQkgKiBpc3N1ZXMsIG1hcmsgdGhlIFNUQSBhdXRoZW50aWNhdGVkIGJlZm9yZSBBQ0suICovCisJCXN0YS0+ZmxhZ3MgfD0gV0xBTl9TVEFfQVVUSDsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQVVUSF9TSEFSRURfS0VZOgorCQlpZiAoYXV0aF90cmFuc2FjdGlvbiA9PSAxKSB7CisJCQlpZiAoc3RhLT51LnN0YS5jaGFsbGVuZ2UgPT0gTlVMTCkgeworCQkJCXN0YS0+dS5zdGEuY2hhbGxlbmdlID0KKwkJCQkJYXBfYXV0aF9tYWtlX2NoYWxsZW5nZShsb2NhbC0+YXApOworCQkJCWlmIChzdGEtPnUuc3RhLmNoYWxsZW5nZSA9PSBOVUxMKSB7CisJCQkJCXJlc3AgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworCQkJCQlnb3RvIGZhaWw7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHN0YS0+dS5zdGEuY2hhbGxlbmdlID09IE5VTEwgfHwKKwkJCSAgICBjaGFsbGVuZ2UgPT0gTlVMTCB8fAorCQkJICAgIG1lbWNtcChzdGEtPnUuc3RhLmNoYWxsZW5nZSwgY2hhbGxlbmdlLAorCQkJCSAgIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOKSAhPSAwIHx8CisJCQkgICAgIShmYyAmIElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCkpIHsKKwkJCQl0eHQgPSAiY2hhbGxlbmdlIHJlc3BvbnNlIGluY29ycmVjdCI7CisJCQkJcmVzcCA9IFdMQU5fU1RBVFVTX0NIQUxMRU5HRV9GQUlMOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKworCQkJdHh0ID0gImNoYWxsZW5nZSBPSyAtIGF1dGhPSyI7CisJCQkvKiBJRUVFIDgwMi4xMSBzdGFuZGFyZCBpcyBub3QgY29tcGxldGVseSBjbGVhciBhYm91dAorCQkJICogd2hldGhlciBTVEEgaXMgY29uc2lkZXJlZCBhdXRoZW50aWNhdGVkIGFmdGVyCisJCQkgKiBhdXRoZW50aWNhdGlvbiBPSyBmcmFtZSBoYXMgYmVlbiBzZW5kIG9yIGFmdGVyIGl0CisJCQkgKiBoYXMgYmVlbiBBQ0tlZC4gSW4gb3JkZXIgdG8gcmVkdWNlIGludGVyb3BlcmFiaWxpdHkKKwkJCSAqIGlzc3VlcywgbWFyayB0aGUgU1RBIGF1dGhlbnRpY2F0ZWQgYmVmb3JlIEFDSy4gKi8KKwkJCXN0YS0+ZmxhZ3MgfD0gV0xBTl9TVEFfQVVUSDsKKwkJCWtmcmVlKHN0YS0+dS5zdGEuY2hhbGxlbmdlKTsKKwkJCXN0YS0+dS5zdGEuY2hhbGxlbmdlID0gTlVMTDsKKwkJfQorCQlicmVhazsKKwl9CisKKyBmYWlsOgorCXBvcyA9ICh1MTYgKikgYm9keTsKKwkqcG9zID0gY3B1X3RvX2xlMTYoYXV0aF9hbGcpOworCXBvcysrOworCSpwb3MgPSBjcHVfdG9fbGUxNihhdXRoX3RyYW5zYWN0aW9uICsgMSk7CisJcG9zKys7CisJKnBvcyA9IGNwdV90b19sZTE2KHJlc3ApOyAvKiBzdGF0dXNfY29kZSAqLworCXBvcysrOworCW9sZW4gPSA2OworCisJaWYgKHJlc3AgPT0gV0xBTl9TVEFUVVNfU1VDQ0VTUyAmJiBzdGEgIT0gTlVMTCAmJgorCSAgICBzdGEtPnUuc3RhLmNoYWxsZW5nZSAhPSBOVUxMICYmCisJICAgIGF1dGhfYWxnID09IFdMQU5fQVVUSF9TSEFSRURfS0VZICYmIGF1dGhfdHJhbnNhY3Rpb24gPT0gMSkgeworCQl1OCAqdG1wID0gKHU4ICopIHBvczsKKwkJKnRtcCsrID0gV0xBTl9FSURfQ0hBTExFTkdFOworCQkqdG1wKysgPSBXTEFOX0FVVEhfQ0hBTExFTkdFX0xFTjsKKwkJcG9zKys7CisJCW1lbWNweShwb3MsIHN0YS0+dS5zdGEuY2hhbGxlbmdlLCBXTEFOX0FVVEhfQ0hBTExFTkdFX0xFTik7CisJCW9sZW4gKz0gMiArIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOOworCX0KKworCXByaXNtMl9zZW5kX21nbXQoZGV2LCBJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9BVVRILAorCQkJIGJvZHksIG9sZW4sIGhkci0+YWRkcjIsIGFwLT50eF9jYWxsYmFja19hdXRoKTsKKworCWlmIChzdGEpIHsKKwkJc3RhLT5sYXN0X3J4ID0gamlmZmllczsKKwkJYXRvbWljX2RlYygmc3RhLT51c2Vycyk7CisJfQorCisJaWYgKHJlc3ApIHsKKwkJUERFQlVHKERFQlVHX0FQLCAiJXM6ICIgTUFDU1RSICIgYXV0aCAoYWxnPSVkIHRyYW5zIz0lZCAiCisJCSAgICAgICAic3RhdD0lZCBsZW49JWQgZmM9JTA0eCkgPT0+ICVkICglcylcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIE1BQzJTVFIoaGRyLT5hZGRyMiksIGF1dGhfYWxnLAorCQkgICAgICAgYXV0aF90cmFuc2FjdGlvbiwgc3RhdHVzX2NvZGUsIGxlbiwgZmMsIHJlc3AsIHR4dCk7CisJfQorfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgc2NoZWR1bGVkIHRhc2sgZm9yIHBlbmRpbmcgQVAgZnJhbWVzLiAqLworc3RhdGljIHZvaWQgaGFuZGxlX2Fzc29jKGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IGhvc3RhcF84MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXRzLCBpbnQgcmVhc3NvYykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPmRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwljaGFyIGJvZHlbMTJdLCAqcCwgKmxwb3M7CisJaW50IGxlbiwgbGVmdDsKKwl1MTYgKnBvczsKKwl1MTYgcmVzcCA9IFdMQU5fU1RBVFVTX1NVQ0NFU1M7CisJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBOVUxMOworCWludCBzZW5kX2RlYXV0aCA9IDA7CisJY2hhciAqdHh0ID0gIiI7CisJdTggcHJldl9hcFtFVEhfQUxFTl07CisKKwlsZWZ0ID0gbGVuID0gc2tiLT5sZW4gLSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOOworCisJaWYgKGxlbiA8IChyZWFzc29jID8gMTAgOiA0KSkgeworCQlQREVCVUcoREVCVUdfQVAsICIlczogaGFuZGxlX2Fzc29jIC0gdG9vIHNob3J0IHBheWxvYWQgIgorCQkgICAgICAgIihsZW49JWQsIHJlYXNzb2M9JWQpIGZyb20gIiBNQUNTVFIgIlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbGVuLCByZWFzc29jLCBNQUMyU1RSKGhkci0+YWRkcjIpKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19iaCgmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisJc3RhID0gYXBfZ2V0X3N0YShsb2NhbC0+YXAsIGhkci0+YWRkcjIpOworCWlmIChzdGEgPT0gTlVMTCB8fCAoc3RhLT5mbGFncyAmIFdMQU5fU1RBX0FVVEgpID09IDApIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5hcC0+c3RhX3RhYmxlX2xvY2spOworCQl0eHQgPSAidHJ5aW5nIHRvIGFzc29jaWF0ZSBiZWZvcmUgYXV0aGVudGljYXRpb24iOworCQlzZW5kX2RlYXV0aCA9IDE7CisJCXJlc3AgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworCQlzdGEgPSBOVUxMOyAvKiBkbyBub3QgZGVjcmVtZW50IHN0YS0+dXNlcnMgKi8KKwkJZ290byBmYWlsOworCX0KKwlhdG9taWNfaW5jKCZzdGEtPnVzZXJzKTsKKwlzcGluX3VubG9ja19iaCgmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisKKwlwb3MgPSAodTE2ICopIChza2ItPmRhdGEgKyBJRUVFODAyMTFfTUdNVF9IRFJfTEVOKTsKKwlzdGEtPmNhcGFiaWxpdHkgPSBfX2xlMTZfdG9fY3B1KCpwb3MpOworCXBvcysrOyBsZWZ0IC09IDI7CisJc3RhLT5saXN0ZW5faW50ZXJ2YWwgPSBfX2xlMTZfdG9fY3B1KCpwb3MpOworCXBvcysrOyBsZWZ0IC09IDI7CisKKwlpZiAocmVhc3NvYykgeworCQltZW1jcHkocHJldl9hcCwgcG9zLCBFVEhfQUxFTik7CisJCXBvcysrOyBwb3MrKzsgcG9zKys7IGxlZnQgLT0gNjsKKwl9IGVsc2UKKwkJbWVtc2V0KHByZXZfYXAsIDAsIEVUSF9BTEVOKTsKKworCWlmIChsZWZ0ID49IDIpIHsKKwkJdW5zaWduZWQgaW50IGlsZWZ0OworCQl1bnNpZ25lZCBjaGFyICp1ID0gKHVuc2lnbmVkIGNoYXIgKikgcG9zOworCisJCWlmICgqdSA9PSBXTEFOX0VJRF9TU0lEKSB7CisJCQl1Kys7IGxlZnQtLTsKKwkJCWlsZWZ0ID0gKnU7CisJCQl1Kys7IGxlZnQtLTsKKworCQkJaWYgKGlsZWZ0ID4gbGVmdCB8fCBpbGVmdCA+IE1BWF9TU0lEX0xFTikgeworCQkJCXR4dCA9ICJTU0lEIG92ZXJmbG93IjsKKwkJCQlyZXNwID0gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisKKwkJCWlmIChpbGVmdCAhPSBzdHJsZW4obG9jYWwtPmVzc2lkKSB8fAorCQkJICAgIG1lbWNtcChsb2NhbC0+ZXNzaWQsIHUsIGlsZWZ0KSAhPSAwKSB7CisJCQkJdHh0ID0gIm5vdCBvdXIgU1NJRCI7CisJCQkJcmVzcCA9IFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9VTlNQRUM7CisJCQkJZ290byBmYWlsOworCQkJfQorCisJCQl1ICs9IGlsZWZ0OworCQkJbGVmdCAtPSBpbGVmdDsKKwkJfQorCisJCWlmIChsZWZ0ID49IDIgJiYgKnUgPT0gV0xBTl9FSURfU1VQUF9SQVRFUykgeworCQkJdSsrOyBsZWZ0LS07CisJCQlpbGVmdCA9ICp1OworCQkJdSsrOyBsZWZ0LS07CisKKwkJCWlmIChpbGVmdCA+IGxlZnQgfHwgaWxlZnQgPT0gMCB8fAorCQkJICAgIGlsZWZ0ID4gV0xBTl9TVVBQX1JBVEVTX01BWCkgeworCQkJCXR4dCA9ICJTVVBQX1JBVEVTIGxlbiBlcnJvciI7CisJCQkJcmVzcCA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisJCQkJZ290byBmYWlsOworCQkJfQorCisJCQltZW1zZXQoc3RhLT5zdXBwb3J0ZWRfcmF0ZXMsIDAsCisJCQkgICAgICAgc2l6ZW9mKHN0YS0+c3VwcG9ydGVkX3JhdGVzKSk7CisJCQltZW1jcHkoc3RhLT5zdXBwb3J0ZWRfcmF0ZXMsIHUsIGlsZWZ0KTsKKwkJCXByaXNtMl9jaGVja190eF9yYXRlcyhzdGEpOworCisJCQl1ICs9IGlsZWZ0OworCQkJbGVmdCAtPSBpbGVmdDsKKwkJfQorCisJCWlmIChsZWZ0ID4gMCkgeworCQkJUERFQlVHKERFQlVHX0FQLCAiJXM6IGFzc29jIGZyb20gIiBNQUNTVFIgIiB3aXRoIGV4dHJhIgorCQkJICAgICAgICIgZGF0YSAoJWQgYnl0ZXMpIFsiLAorCQkJICAgICAgIGRldi0+bmFtZSwgTUFDMlNUUihoZHItPmFkZHIyKSwgbGVmdCk7CisJCQl3aGlsZSAobGVmdCA+IDApIHsKKwkJCQlQREVCVUcyKERFQlVHX0FQLCAiPCUwMng+IiwgKnUpOworCQkJCXUrKzsgbGVmdC0tOworCQkJfQorCQkJUERFQlVHMihERUJVR19BUCwgIl1cbiIpOworCQl9CisJfSBlbHNlIHsKKwkJdHh0ID0gImZyYW1lIHVuZGVyZmxvdyI7CisJCXJlc3AgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogZ2V0IGEgdW5pcXVlIEFJRCAqLworCWlmIChzdGEtPmFpZCA+IDApCisJCXR4dCA9ICJPSywgb2xkIEFJRCI7CisJZWxzZSB7CisJCXNwaW5fbG9ja19iaCgmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisJCWZvciAoc3RhLT5haWQgPSAxOyBzdGEtPmFpZCA8PSBNQVhfQUlEX1RBQkxFX1NJWkU7IHN0YS0+YWlkKyspCisJCQlpZiAobG9jYWwtPmFwLT5zdGFfYWlkW3N0YS0+YWlkIC0gMV0gPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJaWYgKHN0YS0+YWlkID4gTUFYX0FJRF9UQUJMRV9TSVpFKSB7CisJCQlzdGEtPmFpZCA9IDA7CisJCQlzcGluX3VubG9ja19iaCgmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisJCQlyZXNwID0gV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBOworCQkJdHh0ID0gIm5vIHJvb20gZm9yIG1vcmUgQUlEcyI7CisJCX0gZWxzZSB7CisJCQlsb2NhbC0+YXAtPnN0YV9haWRbc3RhLT5haWQgLSAxXSA9IHN0YTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+YXAtPnN0YV90YWJsZV9sb2NrKTsKKwkJCXR4dCA9ICJPSywgbmV3IEFJRCI7CisJCX0KKwl9CisKKyBmYWlsOgorCXBvcyA9ICh1MTYgKikgYm9keTsKKworCWlmIChzZW5kX2RlYXV0aCkgeworCQkqcG9zID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigKKwkJCVdMQU5fUkVBU09OX1NUQV9SRVFfQVNTT0NfV0lUSE9VVF9BVVRIKTsKKwkJcG9zKys7CisJfSBlbHNlIHsKKwkJLyogRklYOiBDRi1Qb2xsYWJsZSBhbmQgQ0YtUG9sbFJlcSBzaG91bGQgYmUgc2V0IHRvIG1hdGNoIHRoZQorCQkgKiB2YWx1ZXMgaW4gYmVhY29ucy9wcm9iZSByZXNwb25zZXMgKi8KKwkJLyogRklYOiBob3cgYWJvdXQgcHJpdmFjeSBhbmQgV0VQPyAqLworCQkvKiBjYXBhYmlsaXR5ICovCisJCSpwb3MgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9FU1MpOworCQlwb3MrKzsKKworCQkvKiBzdGF0dXNfY29kZSAqLworCQkqcG9zID0gX19jcHVfdG9fbGUxNihyZXNwKTsKKwkJcG9zKys7CisKKwkJKnBvcyA9IF9fY3B1X3RvX2xlMTYoKHN0YSAmJiBzdGEtPmFpZCA+IDAgPyBzdGEtPmFpZCA6IDApIHwKKwkJCQkgICAgIEJJVCgxNCkgfCBCSVQoMTUpKTsgLyogQUlEICovCisJCXBvcysrOworCisJCS8qIFN1cHBvcnRlZCByYXRlcyAoSW5mb3JtYXRpb24gZWxlbWVudCkgKi8KKwkJcCA9IChjaGFyICopIHBvczsKKwkJKnArKyA9IFdMQU5fRUlEX1NVUFBfUkFURVM7CisJCWxwb3MgPSBwOworCQkqcCsrID0gMDsgLyogbGVuICovCisJCWlmIChsb2NhbC0+dHhfcmF0ZV9jb250cm9sICYgV0xBTl9SQVRFXzFNKSB7CisJCQkqcCsrID0gbG9jYWwtPmJhc2ljX3JhdGVzICYgV0xBTl9SQVRFXzFNID8gMHg4MiA6IDB4MDI7CisJCQkoKmxwb3MpKys7CisJCX0KKwkJaWYgKGxvY2FsLT50eF9yYXRlX2NvbnRyb2wgJiBXTEFOX1JBVEVfMk0pIHsKKwkJCSpwKysgPSBsb2NhbC0+YmFzaWNfcmF0ZXMgJiBXTEFOX1JBVEVfMk0gPyAweDg0IDogMHgwNDsKKwkJCSgqbHBvcykrKzsKKwkJfQorCQlpZiAobG9jYWwtPnR4X3JhdGVfY29udHJvbCAmIFdMQU5fUkFURV81TTUpIHsKKwkJCSpwKysgPSBsb2NhbC0+YmFzaWNfcmF0ZXMgJiBXTEFOX1JBVEVfNU01ID8KKwkJCQkweDhiIDogMHgwYjsKKwkJCSgqbHBvcykrKzsKKwkJfQorCQlpZiAobG9jYWwtPnR4X3JhdGVfY29udHJvbCAmIFdMQU5fUkFURV8xMU0pIHsKKwkJCSpwKysgPSBsb2NhbC0+YmFzaWNfcmF0ZXMgJiBXTEFOX1JBVEVfMTFNID8KKwkJCQkweDk2IDogMHgxNjsKKwkJCSgqbHBvcykrKzsKKwkJfQorCQlwb3MgPSAodTE2ICopIHA7CisJfQorCisJcHJpc20yX3NlbmRfbWdtdChkZXYsIElFRUU4MDIxMV9GVFlQRV9NR01UIHwKKwkJCSAoc2VuZF9kZWF1dGggPyBJRUVFODAyMTFfU1RZUEVfREVBVVRIIDoKKwkJCSAgKHJlYXNzb2MgPyBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQIDoKKwkJCSAgIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQKSksCisJCQkgYm9keSwgKHU4ICopIHBvcyAtICh1OCAqKSBib2R5LAorCQkJIGhkci0+YWRkcjIsCisJCQkgc2VuZF9kZWF1dGggPyAwIDogbG9jYWwtPmFwLT50eF9jYWxsYmFja19hc3NvYyk7CisKKwlpZiAoc3RhKSB7CisJCWlmIChyZXNwID09IFdMQU5fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXN0YS0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkvKiBTVEEgd2lsbCBiZSBtYXJrZWQgYXNzb2NpYXRlZCBmcm9tIFRYIGNhbGxiYWNrLCBpZgorCQkJICogQXNzb2NSZXNwIGlzIEFDS2VkICovCisJCX0KKwkJYXRvbWljX2RlYygmc3RhLT51c2Vycyk7CisJfQorCisjaWYgMAorCVBERUJVRyhERUJVR19BUCwgIiVzOiAiIE1BQ1NUUiAiICVzYXNzb2MgKGxlbj0lZCBwcmV2X2FwPSIgTUFDU1RSCisJICAgICAgICIpID0+ICVkKCVkKSAoJXMpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIE1BQzJTVFIoaGRyLT5hZGRyMiksIHJlYXNzb2MgPyAicmUiIDogIiIsIGxlbiwKKwkgICAgICAgTUFDMlNUUihwcmV2X2FwKSwgcmVzcCwgc2VuZF9kZWF1dGgsIHR4dCk7CisjZW5kaWYKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHNjaGVkdWxlZCB0YXNrIGZvciBwZW5kaW5nIEFQIGZyYW1lcy4gKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9kZWF1dGgobG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgc3RydWN0IGhvc3RhcF84MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXRzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsb2NhbC0+ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWNoYXIgKmJvZHkgPSAoY2hhciAqKSAoc2tiLT5kYXRhICsgSUVFRTgwMjExX01HTVRfSERSX0xFTik7CisJaW50IGxlbjsKKwl1MTYgcmVhc29uX2NvZGUsICpwb3M7CisJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBOVUxMOworCisJbGVuID0gc2tiLT5sZW4gLSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOOworCisJaWYgKGxlbiA8IDIpIHsKKwkJcHJpbnRrKCJoYW5kbGVfZGVhdXRoIC0gdG9vIHNob3J0IHBheWxvYWQgKGxlbj0lZClcbiIsIGxlbik7CisJCXJldHVybjsKKwl9CisKKwlwb3MgPSAodTE2ICopIGJvZHk7CisJcmVhc29uX2NvZGUgPSBfX2xlMTZfdG9fY3B1KCpwb3MpOworCisJUERFQlVHKERFQlVHX0FQLCAiJXM6IGRlYXV0aGVudGljYXRpb246ICIgTUFDU1RSICIgbGVuPSVkLCAiCisJICAgICAgICJyZWFzb25fY29kZT0lZFxuIiwgZGV2LT5uYW1lLCBNQUMyU1RSKGhkci0+YWRkcjIpLCBsZW4sCisJICAgICAgIHJlYXNvbl9jb2RlKTsKKworCXNwaW5fbG9ja19iaCgmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisJc3RhID0gYXBfZ2V0X3N0YShsb2NhbC0+YXAsIGhkci0+YWRkcjIpOworCWlmIChzdGEgIT0gTlVMTCkgeworCQlpZiAoKHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9BU1NPQykgJiYgIXN0YS0+YXApCisJCQlob3N0YXBfZXZlbnRfZXhwaXJlZF9zdGEobG9jYWwtPmRldiwgc3RhKTsKKwkJc3RhLT5mbGFncyAmPSB+KFdMQU5fU1RBX0FVVEggfCBXTEFOX1NUQV9BU1NPQyk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+YXAtPnN0YV90YWJsZV9sb2NrKTsKKwlpZiAoc3RhID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogZGVhdXRoZW50aWNhdGlvbiBmcm9tICIgTUFDU1RSICIsICIKKwkgICAgICAgInJlYXNvbl9jb2RlPSVkLCBidXQgU1RBIG5vdCBhdXRoZW50aWNhdGVkXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICBNQUMyU1RSKGhkci0+YWRkcjIpLCByZWFzb25fY29kZSk7CisJfQorfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgc2NoZWR1bGVkIHRhc2sgZm9yIHBlbmRpbmcgQVAgZnJhbWVzLiAqLworc3RhdGljIHZvaWQgaGFuZGxlX2Rpc2Fzc29jKGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgc3RydWN0IGhvc3RhcF84MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXRzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsb2NhbC0+ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWNoYXIgKmJvZHkgPSBza2ItPmRhdGEgKyBJRUVFODAyMTFfTUdNVF9IRFJfTEVOOworCWludCBsZW47CisJdTE2IHJlYXNvbl9jb2RlLCAqcG9zOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gTlVMTDsKKworCWxlbiA9IHNrYi0+bGVuIC0gSUVFRTgwMjExX01HTVRfSERSX0xFTjsKKworCWlmIChsZW4gPCAyKSB7CisJCXByaW50aygiaGFuZGxlX2Rpc2Fzc29jIC0gdG9vIHNob3J0IHBheWxvYWQgKGxlbj0lZClcbiIsIGxlbik7CisJCXJldHVybjsKKwl9CisKKwlwb3MgPSAodTE2ICopIGJvZHk7CisJcmVhc29uX2NvZGUgPSBfX2xlMTZfdG9fY3B1KCpwb3MpOworCisJUERFQlVHKERFQlVHX0FQLCAiJXM6IGRpc2Fzc29jaWF0aW9uOiAiIE1BQ1NUUiAiIGxlbj0lZCwgIgorCSAgICAgICAicmVhc29uX2NvZGU9JWRcbiIsIGRldi0+bmFtZSwgTUFDMlNUUihoZHItPmFkZHIyKSwgbGVuLAorCSAgICAgICByZWFzb25fY29kZSk7CisKKwlzcGluX2xvY2tfYmgoJmxvY2FsLT5hcC0+c3RhX3RhYmxlX2xvY2spOworCXN0YSA9IGFwX2dldF9zdGEobG9jYWwtPmFwLCBoZHItPmFkZHIyKTsKKwlpZiAoc3RhICE9IE5VTEwpIHsKKwkJaWYgKChzdGEtPmZsYWdzICYgV0xBTl9TVEFfQVNTT0MpICYmICFzdGEtPmFwKQorCQkJaG9zdGFwX2V2ZW50X2V4cGlyZWRfc3RhKGxvY2FsLT5kZXYsIHN0YSk7CisJCXN0YS0+ZmxhZ3MgJj0gfldMQU5fU1RBX0FTU09DOworCX0KKwlzcGluX3VubG9ja19iaCgmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisJaWYgKHN0YSA9PSBOVUxMKSB7CisJCXByaW50aygiJXM6IGRpc2Fzc29jaWF0aW9uIGZyb20gIiBNQUNTVFIgIiwgIgorCQkgICAgICAgInJlYXNvbl9jb2RlPSVkLCBidXQgU1RBIG5vdCBhdXRoZW50aWNhdGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBNQUMyU1RSKGhkci0+YWRkcjIpLCByZWFzb25fY29kZSk7CisJfQorfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgc2NoZWR1bGVkIHRhc2sgZm9yIHBlbmRpbmcgQVAgZnJhbWVzLiAqLworc3RhdGljIHZvaWQgYXBfaGFuZGxlX2RhdGFfbnVsbGZ1bmMobG9jYWxfaW5mb190ICpsb2NhbCwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPmRldjsKKworCS8qIHNvbWUgU1RBIGYvdydzIHNlZW0gdG8gcmVxdWlyZSBjb250cm9sOjpBQ0sgZnJhbWUgZm9yCisJICogZGF0YTo6bnVsbGZ1bmMsIGJ1dCBhdCBsZWFzdCBQcmlzbTIgc3RhdGlvbiBmL3cgdmVyc2lvbiAwLjguMCBkb2VzCisJICogbm90IHNlbmQgdGhpcy4uCisJICogc2VuZCBjb250cm9sOjpBQ0sgZm9yIHRoZSBkYXRhOjpudWxsZnVuYyAqLworCisJcHJpbnRrKEtFUk5fREVCVUcgIlNlbmRpbmcgY29udHJvbDo6QUNLIGZvciBkYXRhOjpudWxsZnVuY1xuIik7CisJcHJpc20yX3NlbmRfbWdtdChkZXYsIElFRUU4MDIxMV9GVFlQRV9DVEwgfCBJRUVFODAyMTFfU1RZUEVfQUNLLAorCQkJIE5VTEwsIDAsIGhkci0+YWRkcjIsIDApOworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgc2NoZWR1bGVkIHRhc2sgZm9yIHBlbmRpbmcgQVAgZnJhbWVzLiAqLworc3RhdGljIHZvaWQgYXBfaGFuZGxlX2Ryb3BwZWRfZGF0YShsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisJdTE2IHJlYXNvbjsKKworCXNwaW5fbG9ja19iaCgmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisJc3RhID0gYXBfZ2V0X3N0YShsb2NhbC0+YXAsIGhkci0+YWRkcjIpOworCWlmIChzdGEpCisJCWF0b21pY19pbmMoJnN0YS0+dXNlcnMpOworCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+YXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmIChzdGEgIT0gTlVMTCAmJiAoc3RhLT5mbGFncyAmIFdMQU5fU1RBX0FTU09DKSkgeworCQlQREVCVUcoREVCVUdfQVAsICJhcF9oYW5kbGVfZHJvcHBlZF9kYXRhOiBTVEEgaXMgbm93IG9rYXk/XG4iKTsKKwkJYXRvbWljX2RlYygmc3RhLT51c2Vycyk7CisJCXJldHVybjsKKwl9CisKKwlyZWFzb24gPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KAorCQlXTEFOX1JFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPQ19TVEEpOworCXByaXNtMl9zZW5kX21nbXQoZGV2LCBJRUVFODAyMTFfRlRZUEVfTUdNVCB8CisJCQkgKChzdGEgPT0gTlVMTCB8fCAhKHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9BU1NPQykpID8KKwkJCSAgSUVFRTgwMjExX1NUWVBFX0RFQVVUSCA6IElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyksCisJCQkgKGNoYXIgKikgJnJlYXNvbiwgc2l6ZW9mKHJlYXNvbiksIGhkci0+YWRkcjIsIDApOworCisJaWYgKHN0YSkKKwkJYXRvbWljX2RlYygmc3RhLT51c2Vycyk7Cit9CisKKyNlbmRpZiAvKiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSBzY2hlZHVsZWQgdGFzayBmb3IgcGVuZGluZyBBUCBmcmFtZXMuICovCitzdGF0aWMgdm9pZCBwc3BvbGxfc2VuZF9idWZmZXJlZChsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaG9zdGFwX3NrYl90eF9kYXRhICptZXRhOworCisJaWYgKCEoc3RhLT5mbGFncyAmIFdMQU5fU1RBX1BTKSkgeworCQkvKiBTdGF0aW9uIGhhcyBtb3ZlZCB0byBub24tUFMgbW9kZSwgc28gc2VuZCBhbGwgYnVmZmVyZWQKKwkJICogZnJhbWVzIHVzaW5nIG5vcm1hbCBkZXZpY2UgcXVldWUuICovCisJCWRldl9xdWV1ZV94bWl0KHNrYik7CisJCXJldHVybjsKKwl9CisKKwkvKiBhZGQgYSBmbGFnIGZvciBob3N0YXBfaGFuZGxlX3N0YV90eCgpIHRvIGtub3cgdGhhdCB0aGlzIHNrYiBzaG91bGQKKwkgKiBiZSBwYXNzZWQgdGhyb3VnaCBldmVuIHRob3VnaCBTVEEgaXMgdXNpbmcgUFMgKi8KKwltZXRhID0gKHN0cnVjdCBob3N0YXBfc2tiX3R4X2RhdGEgKikgc2tiLT5jYjsKKwltZXRhLT5mbGFncyB8PSBIT1NUQVBfVFhfRkxBR1NfQlVGRkVSRURfRlJBTUU7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnN0YS0+dHhfYnVmKSkgeworCQkvKiBpbmRpY2F0ZSB0byBTVEEgdGhhdCBtb3JlIGZyYW1lcyBmb2xsb3cgKi8KKwkJbWV0YS0+ZmxhZ3MgfD0gSE9TVEFQX1RYX0ZMQUdTX0FERF9NT1JFREFUQTsKKwl9CisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHNjaGVkdWxlZCB0YXNrIGZvciBwZW5kaW5nIEFQIGZyYW1lcy4gKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9wc3BvbGwobG9jYWxfaW5mb190ICpsb2NhbCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSAgc3RydWN0IGhvc3RhcF84MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXRzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsb2NhbC0+ZGV2OworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCXUxNiBhaWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCVBERUJVRyhERUJVR19QUzIsICJoYW5kbGVfcHNwb2xsOiBCU1NJRD0iIE1BQ1NUUiAiLCBUQT0iIE1BQ1NUUgorCSAgICAgICAiIFBXUk1HVD0lZFxuIiwKKwkgICAgICAgTUFDMlNUUihoZHItPmFkZHIxKSwgTUFDMlNUUihoZHItPmFkZHIyKSwKKwkgICAgICAgISEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpICYgSUVFRTgwMjExX0ZDVExfUE0pKTsKKworCWlmIChtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKSB7CisJCVBERUJVRyhERUJVR19BUCwgImhhbmRsZV9wc3BvbGwgLSBhZGRyMShCU1NJRCk9IiBNQUNTVFIKKwkJICAgICAgICIgbm90IG93biBNQUNcbiIsIE1BQzJTVFIoaGRyLT5hZGRyMSkpOworCQlyZXR1cm47CisJfQorCisJYWlkID0gX19sZTE2X3RvX2NwdShoZHItPmR1cmF0aW9uX2lkKTsKKwlpZiAoKGFpZCAmIChCSVQoMTUpIHwgQklUKDE0KSkpICE9IChCSVQoMTUpIHwgQklUKDE0KSkpIHsKKwkJUERFQlVHKERFQlVHX1BTLCAiICAgUFNQT0xMIGFuZCBBSURbMTU6MTRdIG5vdCBzZXRcbiIpOworCQlyZXR1cm47CisJfQorCWFpZCAmPSB+QklUKDE1KSAmIH5CSVQoMTQpOworCWlmIChhaWQgPT0gMCB8fCBhaWQgPiBNQVhfQUlEX1RBQkxFX1NJWkUpIHsKKwkJUERFQlVHKERFQlVHX1BTLCAiICAgaW52YWxpZCBhaWQ9JWRcbiIsIGFpZCk7CisJCXJldHVybjsKKwl9CisJUERFQlVHKERFQlVHX1BTMiwgIiAgIGFpZD0lZFxuIiwgYWlkKTsKKworCXNwaW5fbG9ja19iaCgmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisJc3RhID0gYXBfZ2V0X3N0YShsb2NhbC0+YXAsIGhkci0+YWRkcjIpOworCWlmIChzdGEpCisJCWF0b21pY19pbmMoJnN0YS0+dXNlcnMpOworCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+YXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmIChzdGEgPT0gTlVMTCkgeworCQlQREVCVUcoREVCVUdfUFMsICIgICBTVEEgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc3RhLT5haWQgIT0gYWlkKSB7CisJCVBERUJVRyhERUJVR19QUywgIiAgIHJlY2VpdmVkIGFpZD0laSBkb2VzIG5vdCBtYXRjaCB3aXRoICIKKwkJICAgICAgICJhc3NvYy5haWQ9JWRcbiIsIGFpZCwgc3RhLT5haWQpOworCQlyZXR1cm47CisJfQorCisJLyogRklYOiB0b2RvOgorCSAqIC0gYWRkIHRpbWVvdXQgZm9yIGJ1ZmZlcmluZyAoY2xlYXIgYWlkIGluIFRJTSB2ZWN0b3IgaWYgYnVmZmVyIHRpbWVkCisJICogICBvdXQgKGV4cGlyeSB0aW1lIG11c3QgYmUgbG9uZ2VyIHRoYW4gTGlzdGVuSW50ZXJ2YWwgZm9yCisJICogICB0aGUgY29ycmVzcG9uZGluZyBTVEE7ICI4ODAyLTExOiAxMS4yLjEuOSBBUCBhZ2luZyBmdW5jdGlvbiIKKwkgKiAtIHdoYXQgdG8gZG8sIGlmIGJ1ZmZlcmVkLCBwc3BvbGxlZCwgYW5kIHNlbnQgZnJhbWUgaXMgbm90IEFDS2VkIGJ5CisJICogICBzdGE7IHN0b3JlIGJ1ZmZlciBmb3IgbGF0ZXIgdXNlIGFuZCBsZWF2ZSBUSU0gYWlkIGJpdCBzZXQ/IHVzZQorCSAqICAgVFggZXZlbnQgdG8gY2hlY2sgd2hldGhlciBmcmFtZSB3YXMgQUNLZWQ/CisJICovCisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzdGEtPnR4X2J1ZikpICE9IE5VTEwpIHsKKwkJLyogc2VuZCBidWZmZXJlZCBmcmFtZSAuLiAqLworCQlQREVCVUcoREVCVUdfUFMyLCAiU2VuZGluZyBidWZmZXJlZCBmcmFtZSB0byBTVEEgYWZ0ZXIgUFMgUE9MTCIKKwkJICAgICAgICIgKGJ1ZmZlcl9jb3VudD0lZClcbiIsIHNrYl9xdWV1ZV9sZW4oJnN0YS0+dHhfYnVmKSk7CisKKwkJcHNwb2xsX3NlbmRfYnVmZmVyZWQobG9jYWwsIHN0YSwgc2tiKTsKKworCQlpZiAoc3RhLT5mbGFncyAmIFdMQU5fU1RBX1BTKSB7CisJCQkvKiBzZW5kIG9ubHkgb25lIGJ1ZmZlcmVkIHBhY2tldCBwZXIgUFMgUG9sbCAqLworCQkJLyogRklYOiBzaG91bGQgaWdub3JlIGZ1cnRoZXIgUFMgUG9sbHMgdW50aWwgdGhlCisJCQkgKiBidWZmZXJlZCBwYWNrZXQgdGhhdCB3YXMganVzdCBzZW50IGlzIGFja25vd2xlZGdlZAorCQkJICogKFR4IG9yIFR4RXhjIGV2ZW50KSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZzdGEtPnR4X2J1ZikpIHsKKwkJLyogdHJ5IHRvIGNsZWFyIGFpZCBmcm9tIFRJTSAqLworCQlpZiAoIShzdGEtPmZsYWdzICYgV0xBTl9TVEFfVElNKSkKKwkJCVBERUJVRyhERUJVR19QUzIsICAiUmUtdW5zZXR0aW5nIFRJTSBmb3IgYWlkICVkXG4iLAorCQkJICAgICAgIGFpZCk7CisJCWhvc3RhcF9zZXRfdGltKGxvY2FsLCBhaWQsIDApOworCQlzdGEtPmZsYWdzICY9IH5XTEFOX1NUQV9USU07CisJfQorCisJYXRvbWljX2RlYygmc3RhLT51c2Vycyk7Cit9CisKKworI2lmbmRlZiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UCisKK3N0YXRpYyB2b2lkIGhhbmRsZV93ZHNfb3Blcl9xdWV1ZSh2b2lkICpkYXRhKQoreworCWxvY2FsX2luZm9fdCAqbG9jYWwgPSBkYXRhOworCXN0cnVjdCB3ZHNfb3Blcl9kYXRhICplbnRyeSwgKnByZXY7CisKKwlzcGluX2xvY2tfYmgoJmxvY2FsLT5sb2NrKTsKKwllbnRyeSA9IGxvY2FsLT5hcC0+d2RzX29wZXJfZW50cmllczsKKwlsb2NhbC0+YXAtPndkc19vcGVyX2VudHJpZXMgPSBOVUxMOworCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+bG9jayk7CisKKwl3aGlsZSAoZW50cnkpIHsKKwkJUERFQlVHKERFQlVHX0FQLCAiJXM6ICVzIGF1dG9tYXRpYyBXRFMgY29ubmVjdGlvbiAiCisJCSAgICAgICAidG8gQVAgIiBNQUNTVFIgIlxuIiwKKwkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUsCisJCSAgICAgICBlbnRyeS0+dHlwZSA9PSBXRFNfQUREID8gImFkZGluZyIgOiAicmVtb3ZpbmciLAorCQkgICAgICAgTUFDMlNUUihlbnRyeS0+YWRkcikpOworCQlpZiAoZW50cnktPnR5cGUgPT0gV0RTX0FERCkKKwkJCXByaXNtMl93ZHNfYWRkKGxvY2FsLCBlbnRyeS0+YWRkciwgMCk7CisJCWVsc2UgaWYgKGVudHJ5LT50eXBlID09IFdEU19ERUwpCisJCQlwcmlzbTJfd2RzX2RlbChsb2NhbCwgZW50cnktPmFkZHIsIDAsIDEpOworCisJCXByZXYgPSBlbnRyeTsKKwkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwkJa2ZyZWUocHJldik7CisJfQorfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgc2NoZWR1bGVkIHRhc2sgZm9yIHBlbmRpbmcgQVAgZnJhbWVzLiAqLworc3RhdGljIHZvaWQgaGFuZGxlX2JlYWNvbihsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgaG9zdGFwXzgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHMpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJY2hhciAqYm9keSA9IHNrYi0+ZGF0YSArIElFRUU4MDIxMV9NR01UX0hEUl9MRU47CisJaW50IGxlbiwgbGVmdDsKKwl1MTYgKnBvcywgYmVhY29uX2ludCwgY2FwYWJpbGl0eTsKKwljaGFyICpzc2lkID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICpzdXBwX3JhdGVzID0gTlVMTDsKKwlpbnQgc3NpZF9sZW4gPSAwLCBzdXBwX3JhdGVzX2xlbiA9IDA7CisJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBOVUxMOworCWludCBuZXdfc3RhID0gMCwgY2hhbm5lbCA9IC0xOworCisJbGVuID0gc2tiLT5sZW4gLSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOOworCisJaWYgKGxlbiA8IDggKyAyICsgMikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaGFuZGxlX2JlYWNvbiAtIHRvbyBzaG9ydCBwYXlsb2FkICIKKwkJICAgICAgICIobGVuPSVkKVxuIiwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCXBvcyA9ICh1MTYgKikgYm9keTsKKwlsZWZ0ID0gbGVuOworCisJLyogVGltZXN0YW1wICg4IG9jdGV0cykgKi8KKwlwb3MgKz0gNDsgbGVmdCAtPSA4OworCS8qIEJlYWNvbiBpbnRlcnZhbCAoMiBvY3RldHMpICovCisJYmVhY29uX2ludCA9IF9fbGUxNl90b19jcHUoKnBvcyk7CisJcG9zKys7IGxlZnQgLT0gMjsKKwkvKiBDYXBhYmlsaXR5IGluZm9ybWF0aW9uICgyIG9jdGV0cykgKi8KKwljYXBhYmlsaXR5ID0gX19sZTE2X3RvX2NwdSgqcG9zKTsKKwlwb3MrKzsgbGVmdCAtPSAyOworCisJaWYgKGxvY2FsLT5hcC0+YXBfcG9saWN5ICE9IEFQX09USEVSX0FQX0VWRU5fSUJTUyAmJgorCSAgICBjYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpCisJCXJldHVybjsKKworCWlmIChsZWZ0ID49IDIpIHsKKwkJdW5zaWduZWQgaW50IGlsZWZ0OworCQl1bnNpZ25lZCBjaGFyICp1ID0gKHVuc2lnbmVkIGNoYXIgKikgcG9zOworCisJCWlmICgqdSA9PSBXTEFOX0VJRF9TU0lEKSB7CisJCQl1Kys7IGxlZnQtLTsKKwkJCWlsZWZ0ID0gKnU7CisJCQl1Kys7IGxlZnQtLTsKKworCQkJaWYgKGlsZWZ0ID4gbGVmdCB8fCBpbGVmdCA+IE1BWF9TU0lEX0xFTikgeworCQkJCVBERUJVRyhERUJVR19BUCwgIlNTSUQ6IG92ZXJmbG93XG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWlmIChsb2NhbC0+YXAtPmFwX3BvbGljeSA9PSBBUF9PVEhFUl9BUF9TQU1FX1NTSUQgJiYKKwkJCSAgICAoaWxlZnQgIT0gc3RybGVuKGxvY2FsLT5lc3NpZCkgfHwKKwkJCSAgICAgbWVtY21wKGxvY2FsLT5lc3NpZCwgdSwgaWxlZnQpICE9IDApKSB7CisJCQkJLyogbm90IG91ciBTU0lEICovCisJCQkJcmV0dXJuOworCQkJfQorCisJCQlzc2lkID0gdTsKKwkJCXNzaWRfbGVuID0gaWxlZnQ7CisKKwkJCXUgKz0gaWxlZnQ7CisJCQlsZWZ0IC09IGlsZWZ0OworCQl9CisKKwkJaWYgKCp1ID09IFdMQU5fRUlEX1NVUFBfUkFURVMpIHsKKwkJCXUrKzsgbGVmdC0tOworCQkJaWxlZnQgPSAqdTsKKwkJCXUrKzsgbGVmdC0tOworCisJCQlpZiAoaWxlZnQgPiBsZWZ0IHx8IGlsZWZ0ID09IDAgfHwgaWxlZnQgPiA4KSB7CisJCQkJUERFQlVHKERFQlVHX0FQLCAiIC0gU1VQUF9SQVRFUyBsZW4gZXJyb3JcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJc3VwcF9yYXRlcyA9IHU7CisJCQlzdXBwX3JhdGVzX2xlbiA9IGlsZWZ0OworCisJCQl1ICs9IGlsZWZ0OworCQkJbGVmdCAtPSBpbGVmdDsKKwkJfQorCisJCWlmICgqdSA9PSBXTEFOX0VJRF9EU19QQVJBTVMpIHsKKwkJCXUrKzsgbGVmdC0tOworCQkJaWxlZnQgPSAqdTsKKwkJCXUrKzsgbGVmdC0tOworCisJCQlpZiAoaWxlZnQgPiBsZWZ0IHx8IGlsZWZ0ICE9IDEpIHsKKwkJCQlQREVCVUcoREVCVUdfQVAsICIgLSBEU19QQVJBTVMgbGVuIGVycm9yXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWNoYW5uZWwgPSAqdTsKKworCQkJdSArPSBpbGVmdDsKKwkJCWxlZnQgLT0gaWxlZnQ7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfYmgoJmxvY2FsLT5hcC0+c3RhX3RhYmxlX2xvY2spOworCXN0YSA9IGFwX2dldF9zdGEobG9jYWwtPmFwLCBoZHItPmFkZHIyKTsKKwlpZiAoc3RhICE9IE5VTEwpCisJCWF0b21pY19pbmMoJnN0YS0+dXNlcnMpOworCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+YXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmIChzdGEgPT0gTlVMTCkgeworCQkvKiBhZGQgbmV3IEFQICovCisJCW5ld19zdGEgPSAxOworCQlzdGEgPSBhcF9hZGRfc3RhKGxvY2FsLT5hcCwgaGRyLT5hZGRyMik7CisJCWlmIChzdGEgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAicHJpc20yOiBrbWFsbG9jIGZhaWxlZCBmb3IgQVAgIgorCQkJICAgICAgICJkYXRhIHN0cnVjdHVyZVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJaG9zdGFwX2V2ZW50X25ld19zdGEobG9jYWwtPmRldiwgc3RhKTsKKworCQkvKiBtYXJrIEFQcyBhdXRoZW50aWNhdGlvbiBhbmQgYXNzb2NpYXRlZCBmb3IgcHNldWRvIGFkLWhvYworCQkgKiBzdHlsZSBjb21tdW5pY2F0aW9uICovCisJCXN0YS0+ZmxhZ3MgPSBXTEFOX1NUQV9BVVRIIHwgV0xBTl9TVEFfQVNTT0M7CisKKwkJaWYgKGxvY2FsLT5hcC0+YXV0b21fYXBfd2RzKSB7CisJCQlob3N0YXBfd2RzX2xpbmtfb3Blcihsb2NhbCwgc3RhLT5hZGRyLCBXRFNfQUREKTsKKwkJfQorCX0KKworCXN0YS0+YXAgPSAxOworCWlmIChzc2lkKSB7CisJCXN0YS0+dS5hcC5zc2lkX2xlbiA9IHNzaWRfbGVuOworCQltZW1jcHkoc3RhLT51LmFwLnNzaWQsIHNzaWQsIHNzaWRfbGVuKTsKKwkJc3RhLT51LmFwLnNzaWRbc3NpZF9sZW5dID0gJ1wwJzsKKwl9IGVsc2UgeworCQlzdGEtPnUuYXAuc3NpZF9sZW4gPSAwOworCQlzdGEtPnUuYXAuc3NpZFswXSA9ICdcMCc7CisJfQorCXN0YS0+dS5hcC5jaGFubmVsID0gY2hhbm5lbDsKKwlzdGEtPnJ4X3BhY2tldHMrKzsKKwlzdGEtPnJ4X2J5dGVzICs9IGxlbjsKKwlzdGEtPnUuYXAubGFzdF9iZWFjb24gPSBzdGEtPmxhc3RfcnggPSBqaWZmaWVzOworCXN0YS0+Y2FwYWJpbGl0eSA9IGNhcGFiaWxpdHk7CisJc3RhLT5saXN0ZW5faW50ZXJ2YWwgPSBiZWFjb25faW50OworCisJYXRvbWljX2RlYygmc3RhLT51c2Vycyk7CisKKwlpZiAobmV3X3N0YSkgeworCQltZW1zZXQoc3RhLT5zdXBwb3J0ZWRfcmF0ZXMsIDAsIHNpemVvZihzdGEtPnN1cHBvcnRlZF9yYXRlcykpOworCQltZW1jcHkoc3RhLT5zdXBwb3J0ZWRfcmF0ZXMsIHN1cHBfcmF0ZXMsIHN1cHBfcmF0ZXNfbGVuKTsKKwkJcHJpc20yX2NoZWNrX3R4X3JhdGVzKHN0YSk7CisJfQorfQorCisjZW5kaWYgLyogUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLworCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldC4gKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9hcF9pdGVtKGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICBzdHJ1Y3QgaG9zdGFwXzgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHMpCit7CisjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPmRldjsKKyNlbmRpZiAvKiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCisJdTE2IGZjLCB0eXBlLCBzdHlwZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCisJLyogRklYOiBzaG91bGQgZ2l2ZSBza2ItPmxlbiB0byBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgY2hlY2sgdGhhdCB0aGUKKwkgKiBidWZmZXIgaXMgbG9uZyBlbm91Z2ggKi8KKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXR5cGUgPSBXTEFOX0ZDX0dFVF9UWVBFKGZjKTsKKwlzdHlwZSA9IFdMQU5fRkNfR0VUX1NUWVBFKGZjKTsKKworI2lmbmRlZiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UCisJaWYgKCFsb2NhbC0+aG9zdGFwZCAmJiB0eXBlID09IElFRUU4MDIxMV9GVFlQRV9EQVRBKSB7CisJCVBERUJVRyhERUJVR19BUCwgImhhbmRsZV9hcF9pdGVtIC0gZGF0YSBmcmFtZVxuIik7CisKKwkJaWYgKCEoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSB8fAorCQkgICAgKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgeworCQkJaWYgKHN0eXBlID09IElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQykgeworCQkJCS8qIG5vIFRvRFMgbnVsbGZ1bmMgc2VlbXMgdG8gYmUgdXNlZCB0byBjaGVjaworCQkJCSAqIEFQIGFzc29jaWF0aW9uOyBzbyBzZW5kIHJlamVjdCBtZXNzYWdlIHRvCisJCQkJICogc3BlZWQgdXAgcmUtYXNzb2NpYXRpb24gKi8KKwkJCQlhcF9oYW5kbGVfZHJvcHBlZF9kYXRhKGxvY2FsLCBoZHIpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCVBERUJVRyhERUJVR19BUCwgIiAgIG5vdCBUb0RTIGZyYW1lIChmYz0weCUwNHgpXG4iLAorCQkJICAgICAgIGZjKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWlmIChtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKSB7CisJCQlQREVCVUcoREVCVUdfQVAsICJoYW5kbGVfYXBfaXRlbSAtIGFkZHIxKEJTU0lEKT0iCisJCQkgICAgICAgTUFDU1RSICIgbm90IG93biBNQUNcbiIsCisJCQkgICAgICAgTUFDMlNUUihoZHItPmFkZHIxKSk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlpZiAobG9jYWwtPmFwLT5udWxsZnVuY19hY2sgJiYKKwkJICAgIHN0eXBlID09IElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQykKKwkJCWFwX2hhbmRsZV9kYXRhX251bGxmdW5jKGxvY2FsLCBoZHIpOworCQllbHNlCisJCQlhcF9oYW5kbGVfZHJvcHBlZF9kYXRhKGxvY2FsLCBoZHIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHR5cGUgPT0gSUVFRTgwMjExX0ZUWVBFX01HTVQgJiYgc3R5cGUgPT0gSUVFRTgwMjExX1NUWVBFX0JFQUNPTikgeworCQloYW5kbGVfYmVhY29uKGxvY2FsLCBza2IsIHJ4X3N0YXRzKTsKKwkJZ290byBkb25lOworCX0KKyNlbmRpZiAvKiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCisKKwlpZiAodHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfQ1RMICYmIHN0eXBlID09IElFRUU4MDIxMV9TVFlQRV9QU1BPTEwpIHsKKwkJaGFuZGxlX3BzcG9sbChsb2NhbCwgaGRyLCByeF9zdGF0cyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAobG9jYWwtPmhvc3RhcGQpIHsKKwkJUERFQlVHKERFQlVHX0FQLCAiVW5rbm93biBmcmFtZSBpbiBBUCBxdWV1ZTogdHlwZT0weCUwMnggIgorCQkgICAgICAgInN1YnR5cGU9MHglMDJ4XG4iLCB0eXBlLCBzdHlwZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKyNpZm5kZWYgUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVAorCWlmICh0eXBlICE9IElFRUU4MDIxMV9GVFlQRV9NR01UKSB7CisJCVBERUJVRyhERUJVR19BUCwgImhhbmRsZV9hcF9pdGVtIC0gbm90IGEgbWFuYWdlbWVudCBmcmFtZT9cbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKG1lbWNtcChoZHItPmFkZHIxLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpIHsKKwkJUERFQlVHKERFQlVHX0FQLCAiaGFuZGxlX2FwX2l0ZW0gLSBhZGRyMShEQSk9IiBNQUNTVFIKKwkJICAgICAgICIgbm90IG93biBNQUNcbiIsIE1BQzJTVFIoaGRyLT5hZGRyMSkpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKG1lbWNtcChoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpIHsKKwkJUERFQlVHKERFQlVHX0FQLCAiaGFuZGxlX2FwX2l0ZW0gLSBhZGRyMyhCU1NJRCk9IiBNQUNTVFIKKwkJICAgICAgICIgbm90IG93biBNQUNcbiIsIE1BQzJTVFIoaGRyLT5hZGRyMykpOworCQlnb3RvIGRvbmU7CisJfQorCisJc3dpdGNoIChzdHlwZSkgeworCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUToKKwkJaGFuZGxlX2Fzc29jKGxvY2FsLCBza2IsIHJ4X3N0YXRzLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUDoKKwkJUERFQlVHKERFQlVHX0FQLCAiPT0+IEFTU09DIFJFU1AgKGlnbm9yZWQpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVE6CisJCWhhbmRsZV9hc3NvYyhsb2NhbCwgc2tiLCByeF9zdGF0cywgMSk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVTUDoKKwkJUERFQlVHKERFQlVHX0FQLCAiPT0+IFJFQVNTT0MgUkVTUCAoaWdub3JlZClcbiIpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9TVFlQRV9BVElNOgorCQlQREVCVUcoREVCVUdfQVAsICI9PT4gQVRJTSAoaWdub3JlZClcbiIpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQzoKKwkJaGFuZGxlX2Rpc2Fzc29jKGxvY2FsLCBza2IsIHJ4X3N0YXRzKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVVUSDoKKwkJaGFuZGxlX2F1dGhlbihsb2NhbCwgc2tiLCByeF9zdGF0cyk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1NUWVBFX0RFQVVUSDoKKwkJaGFuZGxlX2RlYXV0aChsb2NhbCwgc2tiLCByeF9zdGF0cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBERUJVRyhERUJVR19BUCwgIlVua25vd24gbWdtdCBmcmFtZSBzdWJ0eXBlIDB4JTAyeFxuIiwKKwkJICAgICAgIHN0eXBlID4+IDQpOworCQlicmVhazsKKwl9CisjZW5kaWYgLyogUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLworCisgZG9uZToKKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCit2b2lkIGhvc3RhcF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICAgICBzdHJ1Y3QgaG9zdGFwXzgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHMpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJdTE2IGZjOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAoc2tiLT5sZW4gPCAxNikKKwkJZ290byBkcm9wOworCisJbG9jYWwtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisKKwlpZiAobG9jYWwtPmFwLT5hcF9wb2xpY3kgPT0gQVBfT1RIRVJfQVBfU0tJUF9BTEwgJiYKKwkgICAgV0xBTl9GQ19HRVRfVFlQRShmYykgPT0gSUVFRTgwMjExX0ZUWVBFX01HTVQgJiYKKwkgICAgV0xBTl9GQ19HRVRfU1RZUEUoZmMpID09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pCisJCWdvdG8gZHJvcDsKKworCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0hPU1RBUCk7CisJaGFuZGxlX2FwX2l0ZW0obG9jYWwsIHNrYiwgcnhfc3RhdHMpOworCXJldHVybjsKKworIGRyb3A6CisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIHZvaWQgc2NoZWR1bGVfcGFja2V0X3NlbmQobG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IHN0YV9pbmZvICpzdGEpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXN0cnVjdCBob3N0YXBfODAyMTFfcnhfc3RhdHVzIHJ4X3N0YXRzOworCisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc3RhLT50eF9idWYpKQorCQlyZXR1cm47CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKDE2KTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzY2hlZHVsZV9wYWNrZXRfc2VuZDogc2tiIGFsbG9jICIKKwkJICAgICAgICJmYWlsZWRcbiIsIGxvY2FsLT5kZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYl9wdXQoc2tiLCAxNik7CisKKwkvKiBHZW5lcmF0ZSBhIGZha2UgcHNwb2xsIGZyYW1lIHRvIHN0YXJ0IHBhY2tldCBkZWxpdmVyeSAqLworCWhkci0+ZnJhbWVfY3RsID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigKKwkJSUVFRTgwMjExX0ZUWVBFX0NUTCB8IElFRUU4MDIxMV9TVFlQRV9QU1BPTEwpOworCW1lbWNweShoZHItPmFkZHIxLCBsb2NhbC0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShoZHItPmFkZHIyLCBzdGEtPmFkZHIsIEVUSF9BTEVOKTsKKwloZHItPmR1cmF0aW9uX2lkID0gY3B1X3RvX2xlMTYoc3RhLT5haWQgfCBCSVQoMTUpIHwgQklUKDE0KSk7CisKKwlQREVCVUcoREVCVUdfUFMyLCAiJXM6IFNjaGVkdWxpbmcgYnVmZmVyZWQgcGFja2V0IGRlbGl2ZXJ5IGZvciAiCisJICAgICAgICJTVEEgIiBNQUNTVFIgIlxuIiwgbG9jYWwtPmRldi0+bmFtZSwgTUFDMlNUUihzdGEtPmFkZHIpKTsKKworCXNrYi0+ZGV2ID0gbG9jYWwtPmRldjsKKworCW1lbXNldCgmcnhfc3RhdHMsIDAsIHNpemVvZihyeF9zdGF0cykpOworCWhvc3RhcF9yeChsb2NhbC0+ZGV2LCBza2IsICZyeF9zdGF0cyk7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfYXBfZ2V0X3N0YV9xdWFsKGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBzb2NrYWRkciBhZGRyW10sCisJCQkJICBzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW10sIGludCBidWZfc2l6ZSwKKwkJCQkgIGludCBhcGxpc3QpCit7CisJc3RydWN0IGFwX2RhdGEgKmFwID0gbG9jYWwtPmFwOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlpbnQgY291bnQgPSAwOworCisJc3Bpbl9sb2NrX2JoKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCisJZm9yIChwdHIgPSBhcC0+c3RhX2xpc3QubmV4dDsgcHRyICE9IE5VTEwgJiYgcHRyICE9ICZhcC0+c3RhX2xpc3Q7CisJICAgICBwdHIgPSBwdHItPm5leHQpIHsKKwkJc3RydWN0IHN0YV9pbmZvICpzdGEgPSAoc3RydWN0IHN0YV9pbmZvICopIHB0cjsKKworCQlpZiAoYXBsaXN0ICYmICFzdGEtPmFwKQorCQkJY29udGludWU7CisJCWFkZHJbY291bnRdLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGFkZHJbY291bnRdLnNhX2RhdGEsIHN0YS0+YWRkciwgRVRIX0FMRU4pOworCQlpZiAoc3RhLT5sYXN0X3J4X3NpbGVuY2UgPT0gMCkKKwkJCXF1YWxbY291bnRdLnF1YWwgPSBzdGEtPmxhc3Rfcnhfc2lnbmFsIDwgMjcgPworCQkJCTAgOiAoc3RhLT5sYXN0X3J4X3NpZ25hbCAtIDI3KSAqIDkyIC8gMTI3OworCQllbHNlCisJCQlxdWFsW2NvdW50XS5xdWFsID0gc3RhLT5sYXN0X3J4X3NpZ25hbCAtCisJCQkJc3RhLT5sYXN0X3J4X3NpbGVuY2UgLSAzNTsKKwkJcXVhbFtjb3VudF0ubGV2ZWwgPSBIRkEzODRYX0xFVkVMX1RPX2RCbShzdGEtPmxhc3Rfcnhfc2lnbmFsKTsKKwkJcXVhbFtjb3VudF0ubm9pc2UgPSBIRkEzODRYX0xFVkVMX1RPX2RCbShzdGEtPmxhc3Rfcnhfc2lsZW5jZSk7CisJCXF1YWxbY291bnRdLnVwZGF0ZWQgPSBzdGEtPmxhc3RfcnhfdXBkYXRlZDsKKworCQlzdGEtPmxhc3RfcnhfdXBkYXRlZCA9IDA7CisKKwkJY291bnQrKzsKKwkJaWYgKGNvdW50ID49IGJ1Zl9zaXplKQorCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCisKKy8qIFRyYW5zbGF0ZSBvdXIgbGlzdCBvZiBBY2Nlc3MgUG9pbnRzICYgU3RhdGlvbnMgdG8gYSBjYXJkIGluZGVwZW5kYW50CisgKiBmb3JtYXQgdGhhdCB0aGUgV2lyZWxlc3MgVG9vbHMgd2lsbCB1bmRlcnN0YW5kIC0gSmVhbiBJSSAqLworc3RhdGljIGludCBwcmlzbTJfYXBfdHJhbnNsYXRlX3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmZmVyKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXN0cnVjdCBhcF9kYXRhICphcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IGl3X2V2ZW50IGl3ZTsKKwljaGFyICpjdXJyZW50X2V2ID0gYnVmZmVyOworCWNoYXIgKmVuZF9idWYgPSBidWZmZXIgKyBJV19TQ0FOX01BWF9EQVRBOworI2lmICFkZWZpbmVkKFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQpCisJY2hhciBidWZbNjRdOworI2VuZGlmCisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisJYXAgPSBsb2NhbC0+YXA7CisKKwlzcGluX2xvY2tfYmgoJmFwLT5zdGFfdGFibGVfbG9jayk7CisKKwlmb3IgKHB0ciA9IGFwLT5zdGFfbGlzdC5uZXh0OyBwdHIgIT0gTlVMTCAmJiBwdHIgIT0gJmFwLT5zdGFfbGlzdDsKKwkgICAgIHB0ciA9IHB0ci0+bmV4dCkgeworCQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IChzdHJ1Y3Qgc3RhX2luZm8gKikgcHRyOworCisJCS8qIEZpcnN0IGVudHJ5ICpNVVNUKiBiZSB0aGUgQVAgTUFDIGFkZHJlc3MgKi8KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIHN0YS0+YWRkciwgRVRIX0FMRU4pOworCQlpd2UubGVuID0gSVdfRVZfQUREUl9MRU47CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkJICBJV19FVl9BRERSX0xFTik7CisKKwkJLyogVXNlIHRoZSBtb2RlIHRvIGluZGljYXRlIGlmIGl0J3MgYSBzdGF0aW9uIG9yCisJCSAqIGFuIEFjY2VzcyBQb2ludCAqLworCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJCWlmIChzdGEtPmFwKQorCQkJaXdlLnUubW9kZSA9IElXX01PREVfTUFTVEVSOworCQllbHNlCisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJaXdlLmxlbiA9IElXX0VWX1VJTlRfTEVOOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJCSAgSVdfRVZfVUlOVF9MRU4pOworCisJCS8qIFNvbWUgcXVhbGl0eSAqLworCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gSVdFVlFVQUw7CisJCWlmIChzdGEtPmxhc3Rfcnhfc2lsZW5jZSA9PSAwKQorCQkJaXdlLnUucXVhbC5xdWFsID0gc3RhLT5sYXN0X3J4X3NpZ25hbCA8IDI3ID8KKwkJCQkwIDogKHN0YS0+bGFzdF9yeF9zaWduYWwgLSAyNykgKiA5MiAvIDEyNzsKKwkJZWxzZQorCQkJaXdlLnUucXVhbC5xdWFsID0gc3RhLT5sYXN0X3J4X3NpZ25hbCAtCisJCQkJc3RhLT5sYXN0X3J4X3NpbGVuY2UgLSAzNTsKKwkJaXdlLnUucXVhbC5sZXZlbCA9IEhGQTM4NFhfTEVWRUxfVE9fZEJtKHN0YS0+bGFzdF9yeF9zaWduYWwpOworCQlpd2UudS5xdWFsLm5vaXNlID0gSEZBMzg0WF9MRVZFTF9UT19kQm0oc3RhLT5sYXN0X3J4X3NpbGVuY2UpOworCQlpd2UudS5xdWFsLnVwZGF0ZWQgPSBzdGEtPmxhc3RfcnhfdXBkYXRlZDsKKwkJaXdlLmxlbiA9IElXX0VWX1FVQUxfTEVOOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJCSAgSVdfRVZfUVVBTF9MRU4pOworCisjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKKwkJaWYgKHN0YS0+YXApIHsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdGEtPnUuYXAuc3NpZF9sZW47CisJCQlpd2UudS5kYXRhLmZsYWdzID0gMTsKKwkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJCSAgJml3ZSwKKwkJCQkJCQkgIHN0YS0+dS5hcC5zc2lkKTsKKworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCQkJaWYgKHN0YS0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQorCQkJCWl3ZS51LmRhdGEuZmxhZ3MgPQorCQkJCQlJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJCWVsc2UKKwkJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCQkJICAmaXdlLAorCQkJCQkJCSAgc3RhLT51LmFwLnNzaWQKKwkJCQkJCQkgIC8qIDAgYnl0ZSBtZW1jcHkgKi8pOworCisJCQlpZiAoc3RhLT51LmFwLmNoYW5uZWwgPiAwICYmCisJCQkgICAgc3RhLT51LmFwLmNoYW5uZWwgPD0gRlJFUV9DT1VOVCkgeworCQkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQkJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworCQkJCWl3ZS51LmZyZXEubSA9IGZyZXFfbGlzdFtzdGEtPnUuYXAuY2hhbm5lbCAtIDFdCisJCQkJCSogMTAwMDAwOworCQkJCWl3ZS51LmZyZXEuZSA9IDE7CisJCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KAorCQkJCQljdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQlJV19FVl9GUkVRX0xFTik7CisJCQl9CisKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwkJCXNwcmludGYoYnVmLCAiYmVhY29uX2ludGVydmFsPSVkIiwKKwkJCQlzdGEtPmxpc3Rlbl9pbnRlcnZhbCk7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCQkJICAmaXdlLCBidWYpOworCQl9CisjZW5kaWYgLyogUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLworCisJCXN0YS0+bGFzdF9yeF91cGRhdGVkID0gMDsKKworCQkvKiBUbyBiZSBjb250aW51ZWQsIHdlIHNob3VsZCBtYWtlIGdvb2QgdXNlIG9mIElXRVZDVVNUT00gKi8KKwl9CisKKwlzcGluX3VubG9ja19iaCgmYXAtPnN0YV90YWJsZV9sb2NrKTsKKworCXJldHVybiBjdXJyZW50X2V2IC0gYnVmZmVyOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2hvc3RhcGRfYWRkX3N0YShzdHJ1Y3QgYXBfZGF0YSAqYXAsCisJCQkJICBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtKQoreworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCisJc3Bpbl9sb2NrX2JoKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCXN0YSA9IGFwX2dldF9zdGEoYXAsIHBhcmFtLT5zdGFfYWRkcik7CisJaWYgKHN0YSkKKwkJYXRvbWljX2luYygmc3RhLT51c2Vycyk7CisJc3Bpbl91bmxvY2tfYmgoJmFwLT5zdGFfdGFibGVfbG9jayk7CisKKwlpZiAoc3RhID09IE5VTEwpIHsKKwkJc3RhID0gYXBfYWRkX3N0YShhcCwgcGFyYW0tPnN0YV9hZGRyKTsKKwkJaWYgKHN0YSA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmICghKHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9BU1NPQykgJiYgIXN0YS0+YXAgJiYgc3RhLT5sb2NhbCkKKwkJaG9zdGFwX2V2ZW50X25ld19zdGEoc3RhLT5sb2NhbC0+ZGV2LCBzdGEpOworCisJc3RhLT5mbGFncyB8PSBXTEFOX1NUQV9BVVRIIHwgV0xBTl9TVEFfQVNTT0M7CisJc3RhLT5sYXN0X3J4ID0gamlmZmllczsKKwlzdGEtPmFpZCA9IHBhcmFtLT51LmFkZF9zdGEuYWlkOworCXN0YS0+Y2FwYWJpbGl0eSA9IHBhcmFtLT51LmFkZF9zdGEuY2FwYWJpbGl0eTsKKwlzdGEtPnR4X3N1cHBfcmF0ZXMgPSBwYXJhbS0+dS5hZGRfc3RhLnR4X3N1cHBfcmF0ZXM7CisJaWYgKHN0YS0+dHhfc3VwcF9yYXRlcyAmIFdMQU5fUkFURV8xTSkKKwkJc3RhLT5zdXBwb3J0ZWRfcmF0ZXNbMF0gPSAyOworCWlmIChzdGEtPnR4X3N1cHBfcmF0ZXMgJiBXTEFOX1JBVEVfMk0pCisJCXN0YS0+c3VwcG9ydGVkX3JhdGVzWzFdID0gNDsKKyAJaWYgKHN0YS0+dHhfc3VwcF9yYXRlcyAmIFdMQU5fUkFURV81TTUpCisJCXN0YS0+c3VwcG9ydGVkX3JhdGVzWzJdID0gMTE7CisJaWYgKHN0YS0+dHhfc3VwcF9yYXRlcyAmIFdMQU5fUkFURV8xMU0pCisJCXN0YS0+c3VwcG9ydGVkX3JhdGVzWzNdID0gMjI7CisJcHJpc20yX2NoZWNrX3R4X3JhdGVzKHN0YSk7CisJYXRvbWljX2RlYygmc3RhLT51c2Vycyk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaG9zdGFwZF9yZW1vdmVfc3RhKHN0cnVjdCBhcF9kYXRhICphcCwKKwkJCQkgICAgIHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0pCit7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisKKwlzcGluX2xvY2tfYmgoJmFwLT5zdGFfdGFibGVfbG9jayk7CisJc3RhID0gYXBfZ2V0X3N0YShhcCwgcGFyYW0tPnN0YV9hZGRyKTsKKwlpZiAoc3RhKSB7CisJCWFwX3N0YV9oYXNoX2RlbChhcCwgc3RhKTsKKwkJbGlzdF9kZWwoJnN0YS0+bGlzdCk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCisJaWYgKCFzdGEpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKChzdGEtPmZsYWdzICYgV0xBTl9TVEFfQVNTT0MpICYmICFzdGEtPmFwICYmIHN0YS0+bG9jYWwpCisJCWhvc3RhcF9ldmVudF9leHBpcmVkX3N0YShzdGEtPmxvY2FsLT5kZXYsIHN0YSk7CisJYXBfZnJlZV9zdGEoYXAsIHN0YSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9ob3N0YXBkX2dldF9pbmZvX3N0YShzdHJ1Y3QgYXBfZGF0YSAqYXAsCisJCQkJICAgICAgIHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0pCit7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisKKwlzcGluX2xvY2tfYmgoJmFwLT5zdGFfdGFibGVfbG9jayk7CisJc3RhID0gYXBfZ2V0X3N0YShhcCwgcGFyYW0tPnN0YV9hZGRyKTsKKwlpZiAoc3RhKQorCQlhdG9taWNfaW5jKCZzdGEtPnVzZXJzKTsKKwlzcGluX3VubG9ja19iaCgmYXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmICghc3RhKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXBhcmFtLT51LmdldF9pbmZvX3N0YS5pbmFjdGl2ZV9zZWMgPSAoamlmZmllcyAtIHN0YS0+bGFzdF9yeCkgLyBIWjsKKworCWF0b21pY19kZWMoJnN0YS0+dXNlcnMpOworCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaG9zdGFwZF9zZXRfZmxhZ3Nfc3RhKHN0cnVjdCBhcF9kYXRhICphcCwKKwkJCQkJc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSkKK3sKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKworCXNwaW5fbG9ja19iaCgmYXAtPnN0YV90YWJsZV9sb2NrKTsKKwlzdGEgPSBhcF9nZXRfc3RhKGFwLCBwYXJhbS0+c3RhX2FkZHIpOworCWlmIChzdGEpIHsKKwkJc3RhLT5mbGFncyB8PSBwYXJhbS0+dS5zZXRfZmxhZ3Nfc3RhLmZsYWdzX29yOworCQlzdGEtPmZsYWdzICY9IHBhcmFtLT51LnNldF9mbGFnc19zdGEuZmxhZ3NfYW5kOworCX0KKwlzcGluX3VubG9ja19iaCgmYXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmICghc3RhKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2hvc3RhcGRfc3RhX2NsZWFyX3N0YXRzKHN0cnVjdCBhcF9kYXRhICphcCwKKwkJCQkJICBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtKQoreworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCWludCByYXRlOworCisJc3Bpbl9sb2NrX2JoKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCXN0YSA9IGFwX2dldF9zdGEoYXAsIHBhcmFtLT5zdGFfYWRkcik7CisJaWYgKHN0YSkgeworCQlzdGEtPnJ4X3BhY2tldHMgPSBzdGEtPnR4X3BhY2tldHMgPSAwOworCQlzdGEtPnJ4X2J5dGVzID0gc3RhLT50eF9ieXRlcyA9IDA7CisJCWZvciAocmF0ZSA9IDA7IHJhdGUgPCBXTEFOX1JBVEVfQ09VTlQ7IHJhdGUrKykgeworCQkJc3RhLT50eF9jb3VudFtyYXRlXSA9IDA7CisJCQlzdGEtPnJ4X2NvdW50W3JhdGVdID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmYXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmICghc3RhKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2hvc3RhcGQoc3RydWN0IGFwX2RhdGEgKmFwLAorCQkJICBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtKQoreworCXN3aXRjaCAocGFyYW0tPmNtZCkgeworCWNhc2UgUFJJU00yX0hPU1RBUERfRkxVU0g6CisJCWFwX2NvbnRyb2xfa2lja2FsbChhcCk7CisJCXJldHVybiAwOworCWNhc2UgUFJJU00yX0hPU1RBUERfQUREX1NUQToKKwkJcmV0dXJuIHByaXNtMl9ob3N0YXBkX2FkZF9zdGEoYXAsIHBhcmFtKTsKKwljYXNlIFBSSVNNMl9IT1NUQVBEX1JFTU9WRV9TVEE6CisJCXJldHVybiBwcmlzbTJfaG9zdGFwZF9yZW1vdmVfc3RhKGFwLCBwYXJhbSk7CisJY2FzZSBQUklTTTJfSE9TVEFQRF9HRVRfSU5GT19TVEE6CisJCXJldHVybiBwcmlzbTJfaG9zdGFwZF9nZXRfaW5mb19zdGEoYXAsIHBhcmFtKTsKKwljYXNlIFBSSVNNMl9IT1NUQVBEX1NFVF9GTEFHU19TVEE6CisJCXJldHVybiBwcmlzbTJfaG9zdGFwZF9zZXRfZmxhZ3Nfc3RhKGFwLCBwYXJhbSk7CisJY2FzZSBQUklTTTJfSE9TVEFQRF9TVEFfQ0xFQVJfU1RBVFM6CisJCXJldHVybiBwcmlzbTJfaG9zdGFwZF9zdGFfY2xlYXJfc3RhdHMoYXAsIHBhcmFtKTsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJwcmlzbTJfaG9zdGFwZDogdW5rbm93biBjbWQ9JWRcbiIsCisJCSAgICAgICBwYXJhbS0+Y21kKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworCisvKiBVcGRhdGUgc3RhdGlvbiBpbmZvIGZvciBob3N0LWJhc2VkIFRYIHJhdGUgY29udHJvbCBhbmQgcmV0dXJuIGN1cnJlbnQKKyAqIFRYIHJhdGUgKi8KK3N0YXRpYyBpbnQgYXBfdXBkYXRlX3N0YV90eF9yYXRlKHN0cnVjdCBzdGFfaW5mbyAqc3RhLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXQgPSBzdGEtPnR4X3JhdGU7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlzdGEtPnR4X2NvdW50W3N0YS0+dHhfcmF0ZV9pZHhdKys7CisJc3RhLT50eF9zaW5jZV9sYXN0X2ZhaWx1cmUrKzsKKwlzdGEtPnR4X2NvbnNlY3V0aXZlX2V4YyA9IDA7CisJaWYgKHN0YS0+dHhfc2luY2VfbGFzdF9mYWlsdXJlID49IFdMQU5fUkFURV9VUERBVEVfQ09VTlQgJiYKKwkgICAgc3RhLT50eF9yYXRlX2lkeCA8IHN0YS0+dHhfbWF4X3JhdGUpIHsKKwkJLyogdXNlIG5leHQgaGlnaGVyIHJhdGUgKi8KKwkJaW50IG9sZF9yYXRlLCBuZXdfcmF0ZTsKKwkJb2xkX3JhdGUgPSBuZXdfcmF0ZSA9IHN0YS0+dHhfcmF0ZV9pZHg7CisJCXdoaWxlIChuZXdfcmF0ZSA8IHN0YS0+dHhfbWF4X3JhdGUpIHsKKwkJCW5ld19yYXRlKys7CisJCQlpZiAoYXBfdHhfcmF0ZV9vayhuZXdfcmF0ZSwgc3RhLCBsb2NhbCkpIHsKKwkJCQlzdGEtPnR4X3JhdGVfaWR4ID0gbmV3X3JhdGU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKG9sZF9yYXRlICE9IHN0YS0+dHhfcmF0ZV9pZHgpIHsKKwkJCXN3aXRjaCAoc3RhLT50eF9yYXRlX2lkeCkgeworCQkJY2FzZSAwOiBzdGEtPnR4X3JhdGUgPSAxMDsgYnJlYWs7CisJCQljYXNlIDE6IHN0YS0+dHhfcmF0ZSA9IDIwOyBicmVhazsKKwkJCWNhc2UgMjogc3RhLT50eF9yYXRlID0gNTU7IGJyZWFrOworCQkJY2FzZSAzOiBzdGEtPnR4X3JhdGUgPSAxMTA7IGJyZWFrOworCQkJZGVmYXVsdDogc3RhLT50eF9yYXRlID0gMDsgYnJlYWs7CisJCQl9CisJCQlQREVCVUcoREVCVUdfQVAsICIlczogU1RBICIgTUFDU1RSICIgVFggcmF0ZSByYWlzZWQgdG8iCisJCQkgICAgICAgIiAlZFxuIiwgZGV2LT5uYW1lLCBNQUMyU1RSKHN0YS0+YWRkciksCisJCQkgICAgICAgc3RhLT50eF9yYXRlKTsKKwkJfQorCQlzdGEtPnR4X3NpbmNlX2xhc3RfZmFpbHVyZSA9IDA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCisvKiBDYWxsZWQgb25seSBmcm9tIHNvZnR3YXJlIElSUS4gQ2FsbGVkIGZvciBlYWNoIFRYIGZyYW1lIHByaW9yIHBvc3NpYmxlCisgKiBlbmNyeXB0aW9uIGFuZCB0cmFuc21pdC4gKi8KK2FwX3R4X3JldCBob3N0YXBfaGFuZGxlX3N0YV90eChsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3QgaG9zdGFwX3R4X2RhdGEgKnR4KQoreworCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHgtPnNrYjsKKwlpbnQgc2V0X3RpbSwgcmV0OworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJc3RydWN0IGhvc3RhcF9za2JfdHhfZGF0YSAqbWV0YTsKKworCW1ldGEgPSAoc3RydWN0IGhvc3RhcF9za2JfdHhfZGF0YSAqKSBza2ItPmNiOworCXJldCA9IEFQX1RYX0NPTlRJTlVFOworCWlmIChsb2NhbC0+YXAgPT0gTlVMTCB8fCBza2ItPmxlbiA8IDEwIHx8CisJICAgIG1ldGEtPmlmYWNlLT50eXBlID09IEhPU1RBUF9JTlRFUkZBQ0VfU1RBKQorCQlnb3RvIG91dDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisKKwlpZiAoaGRyLT5hZGRyMVswXSAmIDB4MDEpIHsKKwkJLyogYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZSAtIG5vIEFQIHJlbGF0ZWQgcHJvY2Vzc2luZyAqLworCQlnb3RvIG91dDsKKwl9CisKKwkvKiB1bmljYXN0IHBhY2tldCAtIGNoZWNrIHdoZXRoZXIgZGVzdGluYXRpb24gU1RBIGlzIGFzc29jaWF0ZWQgKi8KKwlzcGluX2xvY2soJmxvY2FsLT5hcC0+c3RhX3RhYmxlX2xvY2spOworCXN0YSA9IGFwX2dldF9zdGEobG9jYWwtPmFwLCBoZHItPmFkZHIxKTsKKwlpZiAoc3RhKQorCQlhdG9taWNfaW5jKCZzdGEtPnVzZXJzKTsKKwlzcGluX3VubG9jaygmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisKKwlpZiAobG9jYWwtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgJiYgc3RhID09IE5VTEwgJiYKKwkgICAgIShtZXRhLT5mbGFncyAmIEhPU1RBUF9UWF9GTEFHU19XRFMpICYmCisJICAgIG1ldGEtPmlmYWNlLT50eXBlICE9IEhPU1RBUF9JTlRFUkZBQ0VfTUFTVEVSICYmCisJICAgIG1ldGEtPmlmYWNlLT50eXBlICE9IEhPU1RBUF9JTlRFUkZBQ0VfQVApIHsKKyNpZiAwCisJCS8qIFRoaXMgY2FuIGhhcHBlbiwgZS5nLiwgd2hlbiB3bGFuMCBpcyBhZGRlZCB0byBhIGJyaWRnZSBhbmQKKwkJICogYnJpZGdpbmcgY29kZSBkb2VzIG5vdCBrbm93IHdoaWNoIHBvcnQgaXMgdGhlIGNvcnJlY3QgdGFyZ2V0CisJCSAqIGZvciBhIHVuaWNhc3QgZnJhbWUuIEluIHRoaXMgY2FzZSwgdGhlIHBhY2tldCBpcyBzZW5kIHRvIGFsbAorCQkgKiBwb3J0cyBvZiB0aGUgYnJpZGdlLiBTaW5jZSB0aGlzIGlzIGEgdmFsaWQgc2NlbmFyaW8sIGRvIG5vdAorCQkgKiBwcmludCBvdXQgYW55IGVycm9ycyBoZXJlLiAqLworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQVA6IGRyb3AgcGFja2V0IHRvIG5vbi1hc3NvY2lhdGVkICIKKwkJCSAgICAgICAiU1RBICIgTUFDU1RSICJcbiIsIE1BQzJTVFIoaGRyLT5hZGRyMSkpOworCQl9CisjZW5kaWYKKwkJbG9jYWwtPmFwLT50eF9kcm9wX25vbmFzc29jKys7CisJCXJldCA9IEFQX1RYX0RST1A7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzdGEgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIShzdGEtPmZsYWdzICYgV0xBTl9TVEFfQVVUSE9SSVpFRCkpCisJCXJldCA9IEFQX1RYX0NPTlRJTlVFX05PVF9BVVRIT1JJWkVEOworCisJLyogU2V0IHR4X3JhdGUgaWYgdXNpbmcgaG9zdC1iYXNlZCBUWCByYXRlIGNvbnRyb2wgKi8KKwlpZiAoIWxvY2FsLT5md190eF9yYXRlX2NvbnRyb2wpCisJCWxvY2FsLT5hcC0+bGFzdF90eF9yYXRlID0gbWV0YS0+cmF0ZSA9CisJCQlhcF91cGRhdGVfc3RhX3R4X3JhdGUoc3RhLCBsb2NhbC0+ZGV2KTsKKworCWlmIChsb2NhbC0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUikKKwkJZ290byBvdXQ7CisKKwlpZiAoIShzdGEtPmZsYWdzICYgV0xBTl9TVEFfUFMpKQorCQlnb3RvIG91dDsKKworCWlmIChtZXRhLT5mbGFncyAmIEhPU1RBUF9UWF9GTEFHU19BRERfTU9SRURBVEEpIHsKKwkJLyogaW5kaWNhdGUgdG8gU1RBIHRoYXQgbW9yZSBmcmFtZXMgZm9sbG93ICovCisJCWhkci0+ZnJhbWVfY3RsIHw9CisJCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBKTsKKwl9CisKKwlpZiAobWV0YS0+ZmxhZ3MgJiBIT1NUQVBfVFhfRkxBR1NfQlVGRkVSRURfRlJBTUUpIHsKKwkJLyogcGFja2V0IHdhcyBhbHJlYWR5IGJ1ZmZlcmVkIGFuZCBub3cgc2VuZCBkdWUgdG8KKwkJICogUFMgcG9sbCwgc28gZG8gbm90IHJlYnVmZmVyIGl0ICovCisJCWdvdG8gb3V0OworCX0KKworCWlmIChza2JfcXVldWVfbGVuKCZzdGEtPnR4X2J1ZikgPj0gU1RBX01BWF9UWF9CVUZGRVIpIHsKKwkJUERFQlVHKERFQlVHX1BTLCAiJXM6IE5vIG1vcmUgc3BhY2UgaW4gU1RBICgiIE1BQ1NUUiAiKSdzIFBTICIKKwkJICAgICAgICJtb2RlIGJ1ZmZlclxuIiwgbG9jYWwtPmRldi0+bmFtZSwgTUFDMlNUUihzdGEtPmFkZHIpKTsKKwkJLyogTWFrZSBzdXJlIHRoYXQgVElNIGlzIHNldCBmb3IgdGhlIHN0YXRpb24gKGl0IG1pZ2h0IG5vdCBiZQorCQkgKiBhZnRlciBBUCB3bGFuIGh3IHJlc2V0KS4gKi8KKwkJLyogRklYOiBzaG91bGQgZml4IGh3IHJlc2V0IHRvIHJlc3RvcmUgYml0cyBiYXNlZCBvbiBTVEEKKwkJICogYnVmZmVyIHN0YXRlLi4gKi8KKwkJaG9zdGFwX3NldF90aW0obG9jYWwsIHN0YS0+YWlkLCAxKTsKKwkJc3RhLT5mbGFncyB8PSBXTEFOX1NUQV9USU07CisJCXJldCA9IEFQX1RYX0RST1A7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFNUQSBpbiBQUyBtb2RlLCBidWZmZXIgZnJhbWUgZm9yIGxhdGVyIGRlbGl2ZXJ5ICovCisJc2V0X3RpbSA9IHNrYl9xdWV1ZV9lbXB0eSgmc3RhLT50eF9idWYpOworCXNrYl9xdWV1ZV90YWlsKCZzdGEtPnR4X2J1Ziwgc2tiKTsKKwkvKiBGSVg6IGNvdWxkIHNhdmUgUlggdGltZSB0byBza2IgYW5kIGV4cGlyZSBidWZmZXJlZCBmcmFtZXMgYWZ0ZXIKKwkgKiBzb21lIHRpbWUgaWYgU1RBIGRvZXMgbm90IHBvbGwgZm9yIHRoZW0gKi8KKworCWlmIChzZXRfdGltKSB7CisJCWlmIChzdGEtPmZsYWdzICYgV0xBTl9TVEFfVElNKQorCQkJUERFQlVHKERFQlVHX1BTMiwgIlJlLXNldHRpbmcgVElNIGZvciBhaWQgJWRcbiIsCisJCQkgICAgICAgc3RhLT5haWQpOworCQlob3N0YXBfc2V0X3RpbShsb2NhbCwgc3RhLT5haWQsIDEpOworCQlzdGEtPmZsYWdzIHw9IFdMQU5fU1RBX1RJTTsKKwl9CisKKwlyZXQgPSBBUF9UWF9CVUZGRVJFRDsKKworIG91dDoKKwlpZiAoc3RhICE9IE5VTEwpIHsKKwkJaWYgKHJldCA9PSBBUF9UWF9DT05USU5VRSB8fAorCQkgICAgcmV0ID09IEFQX1RYX0NPTlRJTlVFX05PVF9BVVRIT1JJWkVEKSB7CisJCQlzdGEtPnR4X3BhY2tldHMrKzsKKwkJCXN0YS0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQlzdGEtPmxhc3RfdHggPSBqaWZmaWVzOworCQl9CisKKwkJaWYgKChyZXQgPT0gQVBfVFhfQ09OVElOVUUgfHwKKwkJICAgICByZXQgPT0gQVBfVFhfQ09OVElOVUVfTk9UX0FVVEhPUklaRUQpICYmCisJCSAgICBzdGEtPmNyeXB0ICYmIHR4LT5ob3N0X2VuY3J5cHQpIHsKKwkJCXR4LT5jcnlwdCA9IHN0YS0+Y3J5cHQ7CisJCQl0eC0+c3RhX3B0ciA9IHN0YTsgLyogaG9zdGFwX2hhbmRsZV9zdGFfcmVsZWFzZSgpIHdpbGwKKwkJCQkJICAgICogYmUgY2FsbGVkIHRvIHJlbGVhc2Ugc3RhIGluZm8KKwkJCQkJICAgICogbGF0ZXIgKi8KKwkJfSBlbHNlCisJCQlhdG9taWNfZGVjKCZzdGEtPnVzZXJzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK3ZvaWQgaG9zdGFwX2hhbmRsZV9zdGFfcmVsZWFzZSh2b2lkICpwdHIpCit7CisJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBwdHI7CisJYXRvbWljX2RlYygmc3RhLT51c2Vycyk7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCit2b2lkIGhvc3RhcF9oYW5kbGVfc3RhX3R4X2V4Yyhsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJc3RydWN0IGhvc3RhcF9za2JfdHhfZGF0YSAqbWV0YTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJbWV0YSA9IChzdHJ1Y3QgaG9zdGFwX3NrYl90eF9kYXRhICopIHNrYi0+Y2I7CisKKwlzcGluX2xvY2soJmxvY2FsLT5hcC0+c3RhX3RhYmxlX2xvY2spOworCXN0YSA9IGFwX2dldF9zdGEobG9jYWwtPmFwLCBoZHItPmFkZHIxKTsKKwlpZiAoIXN0YSkgeworCQlzcGluX3VubG9jaygmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisJCVBERUJVRyhERUJVR19BUCwgIiVzOiBDb3VsZCBub3QgZmluZCBTVEEgIiBNQUNTVFIgIiBmb3IgdGhpcyAiCisJCSAgICAgICAiVFggZXJyb3IgKEAlbHUpXG4iLAorCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSwgTUFDMlNUUihoZHItPmFkZHIxKSwgamlmZmllcyk7CisJCXJldHVybjsKKwl9CisKKwlzdGEtPnR4X3NpbmNlX2xhc3RfZmFpbHVyZSA9IDA7CisJc3RhLT50eF9jb25zZWN1dGl2ZV9leGMrKzsKKworCWlmIChzdGEtPnR4X2NvbnNlY3V0aXZlX2V4YyA+PSBXTEFOX1JBVEVfREVDUkVBU0VfVEhSRVNIT0xEICYmCisJICAgIHN0YS0+dHhfcmF0ZV9pZHggPiAwICYmIG1ldGEtPnJhdGUgPD0gc3RhLT50eF9yYXRlKSB7CisJCS8qIHVzZSBuZXh0IGxvd2VyIHJhdGUgKi8KKwkJaW50IG9sZCwgcmF0ZTsKKwkJb2xkID0gcmF0ZSA9IHN0YS0+dHhfcmF0ZV9pZHg7CisJCXdoaWxlIChyYXRlID4gMCkgeworCQkJcmF0ZS0tOworCQkJaWYgKGFwX3R4X3JhdGVfb2socmF0ZSwgc3RhLCBsb2NhbCkpIHsKKwkJCQlzdGEtPnR4X3JhdGVfaWR4ID0gcmF0ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAob2xkICE9IHN0YS0+dHhfcmF0ZV9pZHgpIHsKKwkJCXN3aXRjaCAoc3RhLT50eF9yYXRlX2lkeCkgeworCQkJY2FzZSAwOiBzdGEtPnR4X3JhdGUgPSAxMDsgYnJlYWs7CisJCQljYXNlIDE6IHN0YS0+dHhfcmF0ZSA9IDIwOyBicmVhazsKKwkJCWNhc2UgMjogc3RhLT50eF9yYXRlID0gNTU7IGJyZWFrOworCQkJY2FzZSAzOiBzdGEtPnR4X3JhdGUgPSAxMTA7IGJyZWFrOworCQkJZGVmYXVsdDogc3RhLT50eF9yYXRlID0gMDsgYnJlYWs7CisJCQl9CisJCQlQREVCVUcoREVCVUdfQVAsICIlczogU1RBICIgTUFDU1RSICIgVFggcmF0ZSBsb3dlcmVkICIKKwkJCSAgICAgICAidG8gJWRcbiIsIGxvY2FsLT5kZXYtPm5hbWUsIE1BQzJTVFIoc3RhLT5hZGRyKSwKKwkJCSAgICAgICBzdGEtPnR4X3JhdGUpOworCQl9CisJCXN0YS0+dHhfY29uc2VjdXRpdmVfZXhjID0gMDsKKwl9CisJc3Bpbl91bmxvY2soJmxvY2FsLT5hcC0+c3RhX3RhYmxlX2xvY2spOworfQorCisKK3N0YXRpYyB2b2lkIGhvc3RhcF91cGRhdGVfc3RhX3BzMihsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKKwkJCQkgIGludCBwd3JtZ3QsIGludCB0eXBlLCBpbnQgc3R5cGUpCit7CisJaWYgKHB3cm1ndCAmJiAhKHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9QUykpIHsKKwkJc3RhLT5mbGFncyB8PSBXTEFOX1NUQV9QUzsKKwkJUERFQlVHKERFQlVHX1BTMiwgIlNUQSAiIE1BQ1NUUiAiIGNoYW5nZWQgdG8gdXNlIFBTICIKKwkJICAgICAgICJtb2RlICh0eXBlPTB4JTAyWCwgc3R5cGU9MHglMDJYKVxuIiwKKwkJICAgICAgIE1BQzJTVFIoc3RhLT5hZGRyKSwgdHlwZSA+PiAyLCBzdHlwZSA+PiA0KTsKKwl9IGVsc2UgaWYgKCFwd3JtZ3QgJiYgKHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9QUykpIHsKKwkJc3RhLT5mbGFncyAmPSB+V0xBTl9TVEFfUFM7CisJCVBERUJVRyhERUJVR19QUzIsICJTVEEgIiBNQUNTVFIgIiBjaGFuZ2VkIHRvIG5vdCB1c2UgIgorCQkgICAgICAgIlBTIG1vZGUgKHR5cGU9MHglMDJYLCBzdHlwZT0weCUwMlgpXG4iLAorCQkgICAgICAgTUFDMlNUUihzdGEtPmFkZHIpLCB0eXBlID4+IDIsIHN0eXBlID4+IDQpOworCQlpZiAodHlwZSAhPSBJRUVFODAyMTFfRlRZUEVfQ1RMIHx8CisJCSAgICBzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfUFNQT0xMKQorCQkJc2NoZWR1bGVfcGFja2V0X3NlbmQobG9jYWwsIHN0YSk7CisJfQorfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKS4gQ2FsbGVkIGZvciBlYWNoIFJYIGZyYW1lIHRvIHVwZGF0ZQorICogU1RBIHBvd2VyIHNhdmluZyBzdGF0ZS4gcHdybWd0IGlzIGEgZmxhZyBmcm9tIDgwMi4xMSBmcmFtZV9jdGwgZmllbGQuICovCitpbnQgaG9zdGFwX3VwZGF0ZV9zdGFfcHMobG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKK3sKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKwl1MTYgZmM7CisKKwlzcGluX2xvY2soJmxvY2FsLT5hcC0+c3RhX3RhYmxlX2xvY2spOworCXN0YSA9IGFwX2dldF9zdGEobG9jYWwtPmFwLCBoZHItPmFkZHIyKTsKKwlpZiAoc3RhKQorCQlhdG9taWNfaW5jKCZzdGEtPnVzZXJzKTsKKwlzcGluX3VubG9jaygmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisKKwlpZiAoIXN0YSkKKwkJcmV0dXJuIC0xOworCisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJaG9zdGFwX3VwZGF0ZV9zdGFfcHMyKGxvY2FsLCBzdGEsIGZjICYgSUVFRTgwMjExX0ZDVExfUE0sCisJCQkgICAgICBXTEFOX0ZDX0dFVF9UWVBFKGZjKSwgV0xBTl9GQ19HRVRfU1RZUEUoZmMpKTsKKworCWF0b21pY19kZWMoJnN0YS0+dXNlcnMpOworCXJldHVybiAwOworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKS4gQ2FsbGVkIGZvciBlYWNoIFJYIGZyYW1lIGFmdGVyCisgKiBnZXR0aW5nIFJYIGhlYWRlciBhbmQgcGF5bG9hZCBmcm9tIGhhcmR3YXJlLiAqLworYXBfcnhfcmV0IGhvc3RhcF9oYW5kbGVfc3RhX3J4KGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgaG9zdGFwXzgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHMsCisJCQkgICAgICAgaW50IHdkcykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCXUxNiBmYywgdHlwZSwgc3R5cGU7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKworCWlmIChsb2NhbC0+YXAgPT0gTlVMTCkKKwkJcmV0dXJuIEFQX1JYX0NPTlRJTlVFOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXR5cGUgPSBXTEFOX0ZDX0dFVF9UWVBFKGZjKTsKKwlzdHlwZSA9IFdMQU5fRkNfR0VUX1NUWVBFKGZjKTsKKworCXNwaW5fbG9jaygmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisJc3RhID0gYXBfZ2V0X3N0YShsb2NhbC0+YXAsIGhkci0+YWRkcjIpOworCWlmIChzdGEpCisJCWF0b21pY19pbmMoJnN0YS0+dXNlcnMpOworCXNwaW5fdW5sb2NrKCZsb2NhbC0+YXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmIChzdGEgJiYgIShzdGEtPmZsYWdzICYgV0xBTl9TVEFfQVVUSE9SSVpFRCkpCisJCXJldCA9IEFQX1JYX0NPTlRJTlVFX05PVF9BVVRIT1JJWkVEOworCWVsc2UKKwkJcmV0ID0gQVBfUlhfQ09OVElOVUU7CisKKworCWlmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpIHsKKwkJaWYgKCF3ZHMgJiYgKHN0YSA9PSBOVUxMIHx8ICEoc3RhLT5mbGFncyAmIFdMQU5fU1RBX0FTU09DKSkpIHsKKwkJCWlmIChsb2NhbC0+aG9zdGFwZCkgeworCQkJCXByaXNtMl9yeF84MDIxMShsb2NhbC0+YXBkZXYsIHNrYiwgcnhfc3RhdHMsCisJCQkJCQlQUklTTTJfUlhfTk9OX0FTU09DKTsKKyNpZm5kZWYgUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVAorCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRyb3BwZWQgcmVjZWl2ZWQgcGFja2V0IgorCQkJCSAgICAgICAiIGZyb20gbm9uLWFzc29jaWF0ZWQgU1RBICIgTUFDU1RSCisJCQkJICAgICAgICIgKHR5cGU9MHglMDJ4LCBzdWJ0eXBlPTB4JTAyeClcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgTUFDMlNUUihoZHItPmFkZHIyKSwKKwkJCQkgICAgICAgdHlwZSA+PiAyLCBzdHlwZSA+PiA0KTsKKwkJCQlob3N0YXBfcngoZGV2LCBza2IsIHJ4X3N0YXRzKTsKKyNlbmRpZiAvKiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCisJCQl9CisJCQlyZXQgPSBBUF9SWF9FWElUOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgaWYgKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSB7CisJCWlmICghd2RzKSB7CisJCQkvKiBGcm9tRFMgZnJhbWUgLSBub3QgZm9yIHVzOyBwcm9iYWJseQorCQkJICogYnJvYWRjYXN0L211bHRpY2FzdCBpbiBhbm90aGVyIEJTUyAtIGRyb3AgKi8KKwkJCWlmIChtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiT2RkLi4gRnJvbURTIHBhY2tldCAiCisJCQkJICAgICAgICJyZWNlaXZlZCB3aXRoIG93biBCU1NJRFxuIik7CisJCQkJaG9zdGFwX2R1bXBfcnhfODAyMTEoZGV2LT5uYW1lLCBza2IsIHJ4X3N0YXRzKTsKKwkJCX0KKwkJCXJldCA9IEFQX1JYX0RST1A7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSBpZiAoc3R5cGUgPT0gSUVFRTgwMjExX1NUWVBFX05VTExGVU5DICYmIHN0YSA9PSBOVUxMICYmCisJCSAgIG1lbWNtcChoZHItPmFkZHIxLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCisJCWlmIChsb2NhbC0+aG9zdGFwZCkgeworCQkJcHJpc20yX3J4XzgwMjExKGxvY2FsLT5hcGRldiwgc2tiLCByeF9zdGF0cywKKwkJCQkJUFJJU00yX1JYX05PTl9BU1NPQyk7CisjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKKwkJfSBlbHNlIHsKKwkJCS8qIEF0IGxlYXN0IEx1Y2VudCBmL3cgc2VlbXMgdG8gc2VuZCBkYXRhOjpudWxsZnVuYworCQkJICogZnJhbWVzIHdpdGggbm8gVG9EUyBmbGFnIHdoZW4gdGhlIGN1cnJlbnQgQVAgcmV0dXJucworCQkJICogYWZ0ZXIgYmVpbmcgdW5hdmFpbGFibGUgZm9yIHNvbWUgdGltZS4gU3BlZWQgdXAKKwkJCSAqIHJlLWFzc29jaWF0aW9uIGJ5IGluZm9ybWluZyB0aGUgc3RhdGlvbiBhYm91dCBpdCBub3QKKwkJCSAqIGJlaW5nIGFzc29jaWF0ZWQuICovCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlamVjdGVkIHJlY2VpdmVkIG51bGxmdW5jICIKKwkJCSAgICAgICAiZnJhbWUgd2l0aG91dCBUb0RTIGZyb20gbm90IGFzc29jaWF0ZWQgU1RBICIKKwkJCSAgICAgICBNQUNTVFIgIlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIE1BQzJTVFIoaGRyLT5hZGRyMikpOworCQkJaG9zdGFwX3J4KGRldiwgc2tiLCByeF9zdGF0cyk7CisjZW5kaWYgLyogUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLworCQl9CisJCXJldCA9IEFQX1JYX0VYSVQ7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoc3R5cGUgPT0gSUVFRTgwMjExX1NUWVBFX05VTExGVU5DKSB7CisJCS8qIEF0IGxlYXN0IEx1Y2VudCBjYXJkcyBzZWVtIHRvIHNlbmQgcGVyaW9kaWMgbnVsbGZ1bmMKKwkJICogZnJhbWVzIHdpdGggVG9EUy4gTGV0IHRoZXNlIHRocm91Z2ggdG8gdXBkYXRlIFNRCisJCSAqIHN0YXRzIGFuZCBQUyBzdGF0ZS4gTnVsbGZ1bmMgZnJhbWVzIGRvIG5vdCBjb250YWluCisJCSAqIGFueSBkYXRhIGFuZCB0aGV5IHdpbGwgYmUgZHJvcHBlZCBiZWxvdy4gKi8KKwl9IGVsc2UgeworCQkvKiBJZiBCU1NJRCAoQWRkcjMpIGlzIGZvcmVpZ24sIHRoaXMgZnJhbWUgaXMgYSBub3JtYWwKKwkJICogYnJvYWRjYXN0IGZyYW1lIGZyb20gYW4gSUJTUyBuZXR3b3JrLiBEcm9wIGl0IHNpbGVudGx5LgorCQkgKiBJZiBCU1NJRCBpcyBvd24sIHJlcG9ydCB0aGUgZHJvcHBpbmcgb2YgdGhpcyBmcmFtZS4gKi8KKwkJaWYgKG1lbWNtcChoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkcm9wcGVkIHJlY2VpdmVkIHBhY2tldCBmcm9tICIKKwkJCSAgICAgICBNQUNTVFIgIiB3aXRoIG5vIFRvRFMgZmxhZyAodHlwZT0weCUwMngsICIKKwkJCSAgICAgICAic3VidHlwZT0weCUwMngpXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgTUFDMlNUUihoZHItPmFkZHIyKSwgdHlwZSA+PiAyLCBzdHlwZSA+PiA0KTsKKwkJCWhvc3RhcF9kdW1wX3J4XzgwMjExKGRldi0+bmFtZSwgc2tiLCByeF9zdGF0cyk7CisJCX0KKwkJcmV0ID0gQVBfUlhfRFJPUDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHN0YSkgeworCQlob3N0YXBfdXBkYXRlX3N0YV9wczIobG9jYWwsIHN0YSwgZmMgJiBJRUVFODAyMTFfRkNUTF9QTSwKKwkJCQkgICAgICB0eXBlLCBzdHlwZSk7CisKKwkJc3RhLT5yeF9wYWNrZXRzKys7CisJCXN0YS0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCXN0YS0+bGFzdF9yeCA9IGppZmZpZXM7CisJfQorCisJaWYgKGxvY2FsLT5hcC0+bnVsbGZ1bmNfYWNrICYmIHN0eXBlID09IElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQyAmJgorCSAgICBmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpIHsKKwkJaWYgKGxvY2FsLT5ob3N0YXBkKSB7CisJCQlwcmlzbTJfcnhfODAyMTEobG9jYWwtPmFwZGV2LCBza2IsIHJ4X3N0YXRzLAorCQkJCQlQUklTTTJfUlhfTlVMTEZVTkNfQUNLKTsKKyNpZm5kZWYgUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVAorCQl9IGVsc2UgeworCQkJLyogc29tZSBTVEEgZi93J3Mgc2VlbSB0byByZXF1aXJlIGNvbnRyb2w6OkFDSyBmcmFtZQorCQkJICogZm9yIGRhdGE6Om51bGxmdW5jLCBidXQgUHJpc20yIGYvdyAwLjguMCAoYXQgbGVhc3QKKwkJCSAqIGZyb20gQ29tcGFxKSBkb2VzIG5vdCBzZW5kIHRoaXMuLiBUcnkgdG8gZ2VuZXJhdGUKKwkJCSAqIEFDSyBmb3IgdGhlc2UgZnJhbWVzIGZyb20gdGhlIGhvc3QgZHJpdmVyIHRvIG1ha2UKKwkJCSAqIHBvd2VyIHNhdmluZyB3b3JrIHdpdGgsIGUuZy4sIEx1Y2VudCBXYXZlTEFOIGYvdyAqLworCQkJaG9zdGFwX3J4KGRldiwgc2tiLCByeF9zdGF0cyk7CisjZW5kaWYgLyogUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLworCQl9CisJCXJldCA9IEFQX1JYX0VYSVQ7CisJCWdvdG8gb3V0OworCX0KKworIG91dDoKKwlpZiAoc3RhKQorCQlhdG9taWNfZGVjKCZzdGEtPnVzZXJzKTsKKworCXJldHVybiByZXQ7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitpbnQgaG9zdGFwX2hhbmRsZV9zdGFfY3J5cHRvKGxvY2FsX2luZm9fdCAqbG9jYWwsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0LAorCQkJICAgICB2b2lkICoqc3RhX3B0cikKK3sKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKworCXNwaW5fbG9jaygmbG9jYWwtPmFwLT5zdGFfdGFibGVfbG9jayk7CisJc3RhID0gYXBfZ2V0X3N0YShsb2NhbC0+YXAsIGhkci0+YWRkcjIpOworCWlmIChzdGEpCisJCWF0b21pY19pbmMoJnN0YS0+dXNlcnMpOworCXNwaW5fdW5sb2NrKCZsb2NhbC0+YXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmICghc3RhKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoc3RhLT5jcnlwdCkgeworCQkqY3J5cHQgPSBzdGEtPmNyeXB0OworCQkqc3RhX3B0ciA9IHN0YTsKKwkJLyogaG9zdGFwX2hhbmRsZV9zdGFfcmVsZWFzZSgpIHdpbGwgYmUgY2FsbGVkIHRvIHJlbGVhc2UgU1RBCisJCSAqIGluZm8gKi8KKwl9IGVsc2UKKwkJYXRvbWljX2RlYygmc3RhLT51c2Vycyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK2ludCBob3N0YXBfaXNfc3RhX2Fzc29jKHN0cnVjdCBhcF9kYXRhICphcCwgdTggKnN0YV9hZGRyKQoreworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCXN0YSA9IGFwX2dldF9zdGEoYXAsIHN0YV9hZGRyKTsKKwlpZiAoc3RhICE9IE5VTEwgJiYgKHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9BU1NPQykgJiYgIXN0YS0+YXApCisJCXJldCA9IDE7CisJc3Bpbl91bmxvY2soJmFwLT5zdGFfdGFibGVfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworaW50IGhvc3RhcF9pc19zdGFfYXV0aG9yaXplZChzdHJ1Y3QgYXBfZGF0YSAqYXAsIHU4ICpzdGFfYWRkcikKK3sKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmYXAtPnN0YV90YWJsZV9sb2NrKTsKKwlzdGEgPSBhcF9nZXRfc3RhKGFwLCBzdGFfYWRkcik7CisJaWYgKHN0YSAhPSBOVUxMICYmIChzdGEtPmZsYWdzICYgV0xBTl9TVEFfQVNTT0MpICYmICFzdGEtPmFwICYmCisJICAgICgoc3RhLT5mbGFncyAmIFdMQU5fU1RBX0FVVEhPUklaRUQpIHx8CisJICAgICBhcC0+bG9jYWwtPmllZWVfODAyXzF4ID09IDApKQorCQlyZXQgPSAxOworCXNwaW5fdW5sb2NrKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK2ludCBob3N0YXBfYWRkX3N0YShzdHJ1Y3QgYXBfZGF0YSAqYXAsIHU4ICpzdGFfYWRkcikKK3sKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKwlpbnQgcmV0ID0gMTsKKworCWlmICghYXApCisJCXJldHVybiAtMTsKKworCXNwaW5fbG9jaygmYXAtPnN0YV90YWJsZV9sb2NrKTsKKwlzdGEgPSBhcF9nZXRfc3RhKGFwLCBzdGFfYWRkcik7CisJaWYgKHN0YSkKKwkJcmV0ID0gMDsKKwlzcGluX3VubG9jaygmYXAtPnN0YV90YWJsZV9sb2NrKTsKKworCWlmIChyZXQgPT0gMSkgeworCQlzdGEgPSBhcF9hZGRfc3RhKGFwLCBzdGFfYWRkcik7CisJCWlmICghc3RhKQorCQkJcmV0ID0gLTE7CisJCXN0YS0+ZmxhZ3MgPSBXTEFOX1NUQV9BVVRIIHwgV0xBTl9TVEFfQVNTT0M7CisJCXN0YS0+YXAgPSAxOworCQltZW1zZXQoc3RhLT5zdXBwb3J0ZWRfcmF0ZXMsIDAsIHNpemVvZihzdGEtPnN1cHBvcnRlZF9yYXRlcykpOworCQkvKiBObyB3YXkgb2Yga25vd2luZyB3aGljaCByYXRlcyBhcmUgc3VwcG9ydGVkIHNpbmNlIHdlIGRpZCBub3QKKwkJICogZ2V0IHN1cHBvcnRlZCByYXRlcyBlbGVtZW50IGZyb20gYmVhY29uL2Fzc29jIHJlcS4gQXNzdW1lCisJCSAqIHRoYXQgcmVtb3RlIGVuZCBzdXBwb3J0cyBhbGwgODAyLjExYiByYXRlcy4gKi8KKwkJc3RhLT5zdXBwb3J0ZWRfcmF0ZXNbMF0gPSAweDgyOworCQlzdGEtPnN1cHBvcnRlZF9yYXRlc1sxXSA9IDB4ODQ7CisJCXN0YS0+c3VwcG9ydGVkX3JhdGVzWzJdID0gMHgwYjsKKwkJc3RhLT5zdXBwb3J0ZWRfcmF0ZXNbM10gPSAweDE2OworCQlzdGEtPnR4X3N1cHBfcmF0ZXMgPSBXTEFOX1JBVEVfMU0gfCBXTEFOX1JBVEVfMk0gfAorCQkJV0xBTl9SQVRFXzVNNSB8IFdMQU5fUkFURV8xMU07CisJCXN0YS0+dHhfcmF0ZSA9IDExMDsKKwkJc3RhLT50eF9tYXhfcmF0ZSA9IHN0YS0+dHhfcmF0ZV9pZHggPSAzOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitpbnQgaG9zdGFwX3VwZGF0ZV9yeF9zdGF0cyhzdHJ1Y3QgYXBfZGF0YSAqYXAsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgc3RydWN0IGhvc3RhcF84MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXRzKQoreworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCisJaWYgKCFhcCkKKwkJcmV0dXJuIC0xOworCisJc3Bpbl9sb2NrKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCXN0YSA9IGFwX2dldF9zdGEoYXAsIGhkci0+YWRkcjIpOworCWlmIChzdGEpIHsKKwkJc3RhLT5sYXN0X3J4X3NpbGVuY2UgPSByeF9zdGF0cy0+bm9pc2U7CisJCXN0YS0+bGFzdF9yeF9zaWduYWwgPSByeF9zdGF0cy0+c2lnbmFsOworCQlzdGEtPmxhc3RfcnhfcmF0ZSA9IHJ4X3N0YXRzLT5yYXRlOworCQlzdGEtPmxhc3RfcnhfdXBkYXRlZCA9IDc7CisJCWlmIChyeF9zdGF0cy0+cmF0ZSA9PSAxMCkKKwkJCXN0YS0+cnhfY291bnRbMF0rKzsKKwkJZWxzZSBpZiAocnhfc3RhdHMtPnJhdGUgPT0gMjApCisJCQlzdGEtPnJ4X2NvdW50WzFdKys7CisJCWVsc2UgaWYgKHJ4X3N0YXRzLT5yYXRlID09IDU1KQorCQkJc3RhLT5yeF9jb3VudFsyXSsrOworCQllbHNlIGlmIChyeF9zdGF0cy0+cmF0ZSA9PSAxMTApCisJCQlzdGEtPnJ4X2NvdW50WzNdKys7CisJfQorCXNwaW5fdW5sb2NrKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCisJcmV0dXJuIHN0YSA/IDAgOiAtMTsKK30KKworCit2b2lkIGhvc3RhcF91cGRhdGVfcmF0ZXMobG9jYWxfaW5mb190ICpsb2NhbCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IGFwX2RhdGEgKmFwID0gbG9jYWwtPmFwOworCisJaWYgKCFhcCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCWZvciAocHRyID0gYXAtPnN0YV9saXN0Lm5leHQ7IHB0ciAhPSAmYXAtPnN0YV9saXN0OyBwdHIgPSBwdHItPm5leHQpIHsKKwkJc3RydWN0IHN0YV9pbmZvICpzdGEgPSAoc3RydWN0IHN0YV9pbmZvICopIHB0cjsKKwkJcHJpc20yX2NoZWNrX3R4X3JhdGVzKHN0YSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhcC0+c3RhX3RhYmxlX2xvY2spOworfQorCisKK3N0YXRpYyB2b2lkICogYXBfY3J5cHRfZ2V0X3B0cnMoc3RydWN0IGFwX2RhdGEgKmFwLCB1OCAqYWRkciwgaW50IHBlcm1hbmVudCwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKioqY3J5cHQpCit7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisKKwlzcGluX2xvY2tfYmgoJmFwLT5zdGFfdGFibGVfbG9jayk7CisJc3RhID0gYXBfZ2V0X3N0YShhcCwgYWRkcik7CisJaWYgKHN0YSkKKwkJYXRvbWljX2luYygmc3RhLT51c2Vycyk7CisJc3Bpbl91bmxvY2tfYmgoJmFwLT5zdGFfdGFibGVfbG9jayk7CisKKwlpZiAoIXN0YSAmJiBwZXJtYW5lbnQpCisJCXN0YSA9IGFwX2FkZF9zdGEoYXAsIGFkZHIpOworCisJaWYgKCFzdGEpCisJCXJldHVybiBOVUxMOworCisJaWYgKHBlcm1hbmVudCkKKwkJc3RhLT5mbGFncyB8PSBXTEFOX1NUQV9QRVJNOworCisJKmNyeXB0ID0gJnN0YS0+Y3J5cHQ7CisKKwlyZXR1cm4gc3RhOworfQorCisKK3ZvaWQgaG9zdGFwX2FkZF93ZHNfbGlua3MobG9jYWxfaW5mb190ICpsb2NhbCkKK3sKKwlzdHJ1Y3QgYXBfZGF0YSAqYXAgPSBsb2NhbC0+YXA7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCisJc3Bpbl9sb2NrX2JoKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCWxpc3RfZm9yX2VhY2gocHRyLCAmYXAtPnN0YV9saXN0KSB7CisJCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBzdGFfaW5mbywgbGlzdCk7CisJCWlmIChzdGEtPmFwKQorCQkJaG9zdGFwX3dkc19saW5rX29wZXIobG9jYWwsIHN0YS0+YWRkciwgV0RTX0FERCk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhcC0+c3RhX3RhYmxlX2xvY2spOworCisJc2NoZWR1bGVfd29yaygmbG9jYWwtPmFwLT53ZHNfb3Blcl9xdWV1ZSk7Cit9CisKKwordm9pZCBob3N0YXBfd2RzX2xpbmtfb3Blcihsb2NhbF9pbmZvX3QgKmxvY2FsLCB1OCAqYWRkciwgd2RzX29wZXJfdHlwZSB0eXBlKQoreworCXN0cnVjdCB3ZHNfb3Blcl9kYXRhICplbnRyeTsKKworCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFlbnRyeSkKKwkJcmV0dXJuOworCW1lbWNweShlbnRyeS0+YWRkciwgYWRkciwgRVRIX0FMRU4pOworCWVudHJ5LT50eXBlID0gdHlwZTsKKwlzcGluX2xvY2tfYmgoJmxvY2FsLT5sb2NrKTsKKwllbnRyeS0+bmV4dCA9IGxvY2FsLT5hcC0+d2RzX29wZXJfZW50cmllczsKKwlsb2NhbC0+YXAtPndkc19vcGVyX2VudHJpZXMgPSBlbnRyeTsKKwlzcGluX3VubG9ja19iaCgmbG9jYWwtPmxvY2spOworCisJc2NoZWR1bGVfd29yaygmbG9jYWwtPmFwLT53ZHNfb3Blcl9xdWV1ZSk7Cit9CisKKworRVhQT1JUX1NZTUJPTChob3N0YXBfaW5pdF9kYXRhKTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwX2luaXRfYXBfcHJvYyk7CitFWFBPUlRfU1lNQk9MKGhvc3RhcF9mcmVlX2RhdGEpOworRVhQT1JUX1NZTUJPTChob3N0YXBfY2hlY2tfc3RhX2Z3X3ZlcnNpb24pOworRVhQT1JUX1NZTUJPTChob3N0YXBfaGFuZGxlX3N0YV90eCk7CitFWFBPUlRfU1lNQk9MKGhvc3RhcF9oYW5kbGVfc3RhX3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTChob3N0YXBfaGFuZGxlX3N0YV90eF9leGMpOworRVhQT1JUX1NZTUJPTChob3N0YXBfdXBkYXRlX3N0YV9wcyk7CitFWFBPUlRfU1lNQk9MKGhvc3RhcF9oYW5kbGVfc3RhX3J4KTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwX2lzX3N0YV9hc3NvYyk7CitFWFBPUlRfU1lNQk9MKGhvc3RhcF9pc19zdGFfYXV0aG9yaXplZCk7CitFWFBPUlRfU1lNQk9MKGhvc3RhcF9hZGRfc3RhKTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwX3VwZGF0ZV9yYXRlcyk7CitFWFBPUlRfU1lNQk9MKGhvc3RhcF9hZGRfd2RzX2xpbmtzKTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwX3dkc19saW5rX29wZXIpOworI2lmbmRlZiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UCitFWFBPUlRfU1lNQk9MKGhvc3RhcF9kZWF1dGhfYWxsX3N0YXMpOworI2VuZGlmIC8qIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTZhNTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5oCkBAIC0wLDAgKzEsMjYxIEBACisjaWZuZGVmIEhPU1RBUF9BUF9ICisjZGVmaW5lIEhPU1RBUF9BUF9ICisKKy8qIEFQIGRhdGEgc3RydWN0dXJlcyBmb3IgU1RBcyAqLworCisvKiBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgdG8gYnVmZmVyIHBlciBTVEEgKi8KKyNkZWZpbmUgU1RBX01BWF9UWF9CVUZGRVIgMzIKKworLyogU1RBIGZsYWdzICovCisjZGVmaW5lIFdMQU5fU1RBX0FVVEggQklUKDApCisjZGVmaW5lIFdMQU5fU1RBX0FTU09DIEJJVCgxKQorI2RlZmluZSBXTEFOX1NUQV9QUyBCSVQoMikKKyNkZWZpbmUgV0xBTl9TVEFfVElNIEJJVCgzKSAvKiBUSU0gYml0IGlzIG9uIGZvciBQUyBzdGF0aW9ucyAqLworI2RlZmluZSBXTEFOX1NUQV9QRVJNIEJJVCg0KSAvKiBwZXJtYW5lbnQ7IGRvIG5vdCByZW1vdmUgZW50cnkgb24gZXhwaXJhdGlvbiAqLworI2RlZmluZSBXTEFOX1NUQV9BVVRIT1JJWkVEIEJJVCg1KSAvKiBJZiA4MDIuMVggaXMgdXNlZCwgdGhpcyBmbGFnIGlzCisJCQkJICAgICogY29udHJvbGxpbmcgd2hldGhlciBTVEEgaXMgYXV0aG9yaXplZCB0bworCQkJCSAgICAqIHNlbmQgYW5kIHJlY2VpdmUgbm9uLUlFRUUgODAyLjFYIGZyYW1lcworCQkJCSAgICAqLworI2RlZmluZSBXTEFOX1NUQV9QRU5ESU5HX1BPTEwgQklUKDYpIC8qIHBlbmRpbmcgYWN0aXZpdHkgcG9sbCBub3QgQUNLZWQgKi8KKworI2RlZmluZSBXTEFOX1JBVEVfMU0gQklUKDApCisjZGVmaW5lIFdMQU5fUkFURV8yTSBCSVQoMSkKKyNkZWZpbmUgV0xBTl9SQVRFXzVNNSBCSVQoMikKKyNkZWZpbmUgV0xBTl9SQVRFXzExTSBCSVQoMykKKyNkZWZpbmUgV0xBTl9SQVRFX0NPVU5UIDQKKworLyogTWF4aW11bSBzaXplIG9mIFN1cHBvcnRlZCBSYXRlcyBpbmZvIGVsZW1lbnQuIElFRUUgODAyLjExIGhhcyBhIGxpbWl0IG9mIDgsCisgKiBidXQgc29tZSBwcmUtc3RhbmRhcmQgSUVFRSA4MDIuMTFnIHByb2R1Y3RzIHVzZSBsb25nZXIgZWxlbWVudHMuICovCisjZGVmaW5lIFdMQU5fU1VQUF9SQVRFU19NQVggMzIKKworLyogVHJ5IHRvIGluY3JlYXNlIFRYIHJhdGUgYWZ0ZXIgIyBzdWNjZXNzZnVsbHkgc2VudCBjb25zZWN1dGl2ZSBwYWNrZXRzICovCisjZGVmaW5lIFdMQU5fUkFURV9VUERBVEVfQ09VTlQgNTAKKworLyogRGVjcmVhc2UgVFggcmF0ZSBhZnRlciAjIGNvbnNlY3V0aXZlIGRyb3BwZWQgcGFja2V0cyAqLworI2RlZmluZSBXTEFOX1JBVEVfREVDUkVBU0VfVEhSRVNIT0xEIDIKKworc3RydWN0IHN0YV9pbmZvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHN0YV9pbmZvICpobmV4dDsgLyogbmV4dCBlbnRyeSBpbiBoYXNoIHRhYmxlIGxpc3QgKi8KKwlhdG9taWNfdCB1c2VyczsgLyogbnVtYmVyIG9mIHVzZXJzIChkbyBub3QgcmVtb3ZlIGlmID4gMCkgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CisKKwl1OCBhZGRyWzZdOworCXUxNiBhaWQ7IC8qIFNUQSdzIHVuaXF1ZSBBSUQgKDEgLi4gMjAwNykgb3IgMCBpZiBub3QgeWV0IGFzc2lnbmVkICovCisJdTMyIGZsYWdzOworCXUxNiBjYXBhYmlsaXR5OworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7IC8qIG9yIGJlYWNvbl9pbnQgZm9yIEFQcyAqLworCXU4IHN1cHBvcnRlZF9yYXRlc1tXTEFOX1NVUFBfUkFURVNfTUFYXTsKKworCXVuc2lnbmVkIGxvbmcgbGFzdF9hdXRoOworCXVuc2lnbmVkIGxvbmcgbGFzdF9hc3NvYzsKKwl1bnNpZ25lZCBsb25nIGxhc3Rfcng7CisJdW5zaWduZWQgbG9uZyBsYXN0X3R4OworCXVuc2lnbmVkIGxvbmcgcnhfcGFja2V0cywgdHhfcGFja2V0czsKKwl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzLCB0eF9ieXRlczsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X2J1ZjsKKwkvKiBGSVg6IHRpbWVvdXQgYnVmZmVycyB3aXRoIGFuIGV4cGlyeSB0aW1lIHNvbWVob3cgZGVyaXZlZCBmcm9tCisJICogbGlzdGVuX2ludGVydmFsICovCisKKwlzOCBsYXN0X3J4X3NpbGVuY2U7IC8qIE5vaXNlIGluIGRCbSAqLworCXM4IGxhc3Rfcnhfc2lnbmFsOyAvKiBTaWduYWwgc3RyZW5ndGggaW4gZEJtICovCisJdTggbGFzdF9yeF9yYXRlOyAvKiBUWCByYXRlIGluIDAuMSBNYnBzICovCisJdTggbGFzdF9yeF91cGRhdGVkOyAvKiBJV1NQWSdzIHN0cnVjdCBpd19xdWFsaXR5Ojp1cGRhdGVkICovCisKKwl1OCB0eF9zdXBwX3JhdGVzOyAvKiBiaXQgZmllbGQgb2Ygc3VwcG9ydGVkIFRYIHJhdGVzICovCisJdTggdHhfcmF0ZTsgLyogY3VycmVudCBUWCByYXRlIChpbiAwLjEgTWJwcykgKi8KKwl1OCB0eF9yYXRlX2lkeDsgLyogY3VycmVudCBUWCByYXRlIChXTEFOX1JBVEVfKikgKi8KKwl1OCB0eF9tYXhfcmF0ZTsgLyogbWF4IFRYIHJhdGUgKFdMQU5fUkFURV8qKSAqLworCXUzMiB0eF9jb3VudFtXTEFOX1JBVEVfQ09VTlRdOyAvKiBudW1iZXIgb2YgZnJhbWVzIHNlbnQgKHBlciByYXRlKSAqLworCXUzMiByeF9jb3VudFtXTEFOX1JBVEVfQ09VTlRdOyAvKiBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIChwZXIgcmF0ZSkKKwkJCQkJKi8KKwl1MzIgdHhfc2luY2VfbGFzdF9mYWlsdXJlOworCXUzMiB0eF9jb25zZWN1dGl2ZV9leGM7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0OworCisJaW50IGFwOyAvKiB3aGV0aGVyIHRoaXMgc3RhdGlvbiBpcyBhbiBBUCAqLworCisJbG9jYWxfaW5mb190ICpsb2NhbDsKKworI2lmbmRlZiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJY2hhciAqY2hhbGxlbmdlOyAvKiBzaGFyZWQga2V5IGF1dGhlbnRpY2F0aW9uCisJCQkJCSAgKiBjaGFsbGVuZ2UgKi8KKwkJfSBzdGE7CisJCXN0cnVjdCB7CisJCQlpbnQgc3NpZF9sZW47CisJCQl1bnNpZ25lZCBjaGFyIHNzaWRbTUFYX1NTSURfTEVOICsgMV07IC8qIEFQJ3Mgc3NpZCAqLworCQkJaW50IGNoYW5uZWw7CisJCQl1bnNpZ25lZCBsb25nIGxhc3RfYmVhY29uOyAvKiBsYXN0IFJYIGJlYWNvbiB0aW1lICovCisJCX0gYXA7CisJfSB1OworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJZW51bSB7IFNUQV9OVUxMRlVOQyA9IDAsIFNUQV9ESVNBU1NPQywgU1RBX0RFQVVUSCB9IHRpbWVvdXRfbmV4dDsKKyNlbmRpZiAvKiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCit9OworCisKKyNkZWZpbmUgTUFYX1NUQV9DT1VOVCAxMDI0CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIEFJRHMgdG8gdXNlIGZvciBTVEFzOyBtdXN0IGJlIDIwMDcgb3IgbG93ZXIKKyAqICg4ODAyLjExIGxpbWl0YXRpb24pICovCisjZGVmaW5lIE1BWF9BSURfVEFCTEVfU0laRSAxMjgKKworI2RlZmluZSBTVEFfSEFTSF9TSVpFIDI1NgorI2RlZmluZSBTVEFfSEFTSChzdGEpIChzdGFbNV0pCisKKworLyogRGVmYXVsdCB2YWx1ZSBmb3IgbWF4aW11bSBzdGF0aW9uIGluYWN0aXZpdHkuIEFmdGVyIEFQX01BWF9JTkFDVElWSVRZX1NFQworICogaGFzIHBhc3NlZCBzaW5jZSBsYXN0IHJlY2VpdmVkIGZyYW1lIGZyb20gdGhlIHN0YXRpb24sIGEgbnVsbGZ1bmMgZGF0YQorICogZnJhbWUgaXMgc2VudCB0byB0aGUgc3RhdGlvbi4gSWYgdGhpcyBmcmFtZSBpcyBub3QgYWNrbm93bGVkZ2VkIGFuZCBubyBvdGhlcgorICogZnJhbWVzIGhhdmUgYmVlbiByZWNlaXZlZCwgdGhlIHN0YXRpb24gd2lsbCBiZSBkaXNhc3NvY2lhdGVkIGFmdGVyCisgKiBBUF9ESVNBU1NPQ19ERUxBWS4gU2ltaWxhcmlseSwgYSB0aGUgc3RhdGlvbiB3aWxsIGJlIGRlYXV0aGVudGljYXRlZCBhZnRlcgorICogQVBfREVBVVRIX0RFTEFZLiBBUF9USU1FT1VUX1JFU09MVVRJT04gaXMgdGhlIHJlc29sdXRpb24gdGhhdCBpcyB1c2VkIHdpdGgKKyAqIG1heCBpbmFjdGl2aXR5IHRpbWVyLiAqLworI2RlZmluZSBBUF9NQVhfSU5BQ1RJVklUWV9TRUMgKDUgKiA2MCkKKyNkZWZpbmUgQVBfRElTQVNTT0NfREVMQVkgKEhaKQorI2RlZmluZSBBUF9ERUFVVEhfREVMQVkgKEhaKQorCisvKiBhcF9wb2xpY3k6IHdoZXRoZXIgdG8gYWNjZXB0IGZyYW1lcyB0by9mcm9tIG90aGVyIEFQcy9JQlNTICovCit0eXBlZGVmIGVudW0geworCUFQX09USEVSX0FQX1NLSVBfQUxMID0gMCwKKwlBUF9PVEhFUl9BUF9TQU1FX1NTSUQgPSAxLAorCUFQX09USEVSX0FQX0FMTCA9IDIsCisJQVBfT1RIRVJfQVBfRVZFTl9JQlNTID0gMworfSBhcF9wb2xpY3lfZW51bTsKKworI2RlZmluZSBQUklTTTJfQVVUSF9PUEVOIEJJVCgwKQorI2RlZmluZSBQUklTTTJfQVVUSF9TSEFSRURfS0VZIEJJVCgxKQorCisKKy8qIE1BQyBhZGRyZXNzLWJhc2VkIHJlc3RyaWN0aW9ucyAqLworc3RydWN0IG1hY19lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXU4IGFkZHJbNl07Cit9OworCitzdHJ1Y3QgbWFjX3Jlc3RyaWN0aW9ucyB7CisJZW51bSB7IE1BQ19QT0xJQ1lfT1BFTiA9IDAsIE1BQ19QT0xJQ1lfQUxMT1csIE1BQ19QT0xJQ1lfREVOWSB9IHBvbGljeTsKKwl1bnNpZ25lZCBpbnQgZW50cmllczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1hY19saXN0OworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKworc3RydWN0IGFkZF9zdGFfcHJvY19kYXRhIHsKKwl1OCBhZGRyW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgYWRkX3N0YV9wcm9jX2RhdGEgKm5leHQ7Cit9OworCisKK3R5cGVkZWYgZW51bSB7IFdEU19BREQsIFdEU19ERUwgfSB3ZHNfb3Blcl90eXBlOworc3RydWN0IHdkc19vcGVyX2RhdGEgeworCXdkc19vcGVyX3R5cGUgdHlwZTsKKwl1OCBhZGRyW0VUSF9BTEVOXTsKKwlzdHJ1Y3Qgd2RzX29wZXJfZGF0YSAqbmV4dDsKK307CisKKworc3RydWN0IGFwX2RhdGEgeworCWludCBpbml0aWFsaXplZDsgLyogd2hldGhlciBhcF9kYXRhIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgYnJpZGdlX3BhY2tldHM7IC8qIHNlbmQgcGFja2V0IHRvIGFzc29jaWF0ZWQgU1RBcyBkaXJlY3RseSB0byB0aGUKKwkJCSAgICAgKiB3aXJlbGVzcyBtZWRpYSBpbnN0ZWFkIG9mIGhpZ2hlciBsYXllcnMgaW4gdGhlCisJCQkgICAgICoga2VybmVsICovCisJdW5zaWduZWQgaW50IGJyaWRnZWRfdW5pY2FzdDsgLyogbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIGJyaWRnZWQgb24KKwkJCQkgICAgICAgKiB3aXJlbGVzcyBtZWRpYSAqLworCXVuc2lnbmVkIGludCBicmlkZ2VkX211bHRpY2FzdDsgLyogbnVtYmVyIG9mIG5vbi11bmljYXN0IGZyYW1lcworCQkJCQkgKiBicmlkZ2VkIG9uIHdpcmVsZXNzIG1lZGlhICovCisJdW5zaWduZWQgaW50IHR4X2Ryb3Bfbm9uYXNzb2M7IC8qIG51bWJlciBvZiB1bmljYXN0IFRYIHBhY2tldHMgZHJvcHBlZAorCQkJCQkqIGJlY2F1c2UgdGhleSB3ZXJlIHRvIGFuIGFkZHJlc3MgdGhhdAorCQkJCQkqIHdhcyBub3QgYXNzb2NpYXRlZCAqLworCWludCBudWxsZnVuY19hY2s7IC8qIHVzZSB3b3JrYXJvdW5kIGZvciBudWxsZnVuYyBmcmFtZSBBQ0tzICovCisKKwlzcGlubG9ja190IHN0YV90YWJsZV9sb2NrOworCWludCBudW1fc3RhOyAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBzdGFfbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgc3RhX2xpc3Q7IC8qIFNUQSBpbmZvIGxpc3QgaGVhZCAqLworCXN0cnVjdCBzdGFfaW5mbyAqc3RhX2hhc2hbU1RBX0hBU0hfU0laRV07CisKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CisKKwlhcF9wb2xpY3lfZW51bSBhcF9wb2xpY3k7CisJdW5zaWduZWQgaW50IG1heF9pbmFjdGl2aXR5OworCWludCBhdXRvbV9hcF93ZHM7CisKKwlzdHJ1Y3QgbWFjX3Jlc3RyaWN0aW9ucyBtYWNfcmVzdHJpY3Rpb25zOyAvKiBNQUMtYmFzZWQgYXV0aCAqLworCWludCBsYXN0X3R4X3JhdGU7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYWRkX3N0YV9wcm9jX3F1ZXVlOworCXN0cnVjdCBhZGRfc3RhX3Byb2NfZGF0YSAqYWRkX3N0YV9wcm9jX2VudHJpZXM7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2RzX29wZXJfcXVldWU7CisJc3RydWN0IHdkc19vcGVyX2RhdGEgKndkc19vcGVyX2VudHJpZXM7CisKKwl1MTYgdHhfY2FsbGJhY2tfaWR4OworCisjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKKwkvKiBwb2ludGVycyB0byBTVEEgaW5mbzsgYmFzZWQgb24gYWxsb2NhdGVkIEFJRCBvciBOVUxMIGlmIEFJRCBmcmVlCisJICogQUlEIGlzIGluIHRoZSByYW5nZSAxLTIwMDcsIHNvIHN0YV9haWRbMF0gY29ycmVzcG9uZGVycyB0byBBSUQgMQorCSAqIGFuZCBzbyBvbgorCSAqLworCXN0cnVjdCBzdGFfaW5mbyAqc3RhX2FpZFtNQVhfQUlEX1RBQkxFX1NJWkVdOworCisJdTE2IHR4X2NhbGxiYWNrX2F1dGgsIHR4X2NhbGxiYWNrX2Fzc29jLCB0eF9jYWxsYmFja19wb2xsOworCisJLyogV0VQIG9wZXJhdGlvbnMgZm9yIGdlbmVyYXRpbmcgY2hhbGxlbmdlcyB0byBiZSB1c2VkIHdpdGggc2hhcmVkIGtleQorCSAqIGF1dGhlbnRpY2F0aW9uICovCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpjcnlwdDsKKwl2b2lkICpjcnlwdF9wcml2OworI2VuZGlmIC8qIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQgKi8KK307CisKKwordm9pZCBob3N0YXBfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgICAgICAgc3RydWN0IGhvc3RhcF84MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXRzKTsKK3ZvaWQgaG9zdGFwX2luaXRfZGF0YShsb2NhbF9pbmZvX3QgKmxvY2FsKTsKK3ZvaWQgaG9zdGFwX2luaXRfYXBfcHJvYyhsb2NhbF9pbmZvX3QgKmxvY2FsKTsKK3ZvaWQgaG9zdGFwX2ZyZWVfZGF0YShzdHJ1Y3QgYXBfZGF0YSAqYXApOwordm9pZCBob3N0YXBfY2hlY2tfc3RhX2Z3X3ZlcnNpb24oc3RydWN0IGFwX2RhdGEgKmFwLCBpbnQgc3RhX2Z3X3Zlcik7CisKK3R5cGVkZWYgZW51bSB7CisJQVBfVFhfQ09OVElOVUUsIEFQX1RYX0RST1AsIEFQX1RYX1JFVFJZLCBBUF9UWF9CVUZGRVJFRCwKKwlBUF9UWF9DT05USU5VRV9OT1RfQVVUSE9SSVpFRAorfSBhcF90eF9yZXQ7CitzdHJ1Y3QgaG9zdGFwX3R4X2RhdGEgeworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGhvc3RfZW5jcnlwdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0OworCXZvaWQgKnN0YV9wdHI7Cit9OworYXBfdHhfcmV0IGhvc3RhcF9oYW5kbGVfc3RhX3R4KGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBob3N0YXBfdHhfZGF0YSAqdHgpOwordm9pZCBob3N0YXBfaGFuZGxlX3N0YV9yZWxlYXNlKHZvaWQgKnB0cik7Cit2b2lkIGhvc3RhcF9oYW5kbGVfc3RhX3R4X2V4Yyhsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBob3N0YXBfdXBkYXRlX3N0YV9wcyhsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKTsKK3R5cGVkZWYgZW51bSB7CisJQVBfUlhfQ09OVElOVUUsIEFQX1JYX0RST1AsIEFQX1JYX0VYSVQsIEFQX1JYX0NPTlRJTlVFX05PVF9BVVRIT1JJWkVECit9IGFwX3J4X3JldDsKK2FwX3J4X3JldCBob3N0YXBfaGFuZGxlX3N0YV9yeChsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IGhvc3RhcF84MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXRzLAorCQkJICAgICAgIGludCB3ZHMpOworaW50IGhvc3RhcF9oYW5kbGVfc3RhX2NyeXB0byhsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCwKKwkJCSAgICAgdm9pZCAqKnN0YV9wdHIpOworaW50IGhvc3RhcF9pc19zdGFfYXNzb2Moc3RydWN0IGFwX2RhdGEgKmFwLCB1OCAqc3RhX2FkZHIpOworaW50IGhvc3RhcF9pc19zdGFfYXV0aG9yaXplZChzdHJ1Y3QgYXBfZGF0YSAqYXAsIHU4ICpzdGFfYWRkcik7CitpbnQgaG9zdGFwX2FkZF9zdGEoc3RydWN0IGFwX2RhdGEgKmFwLCB1OCAqc3RhX2FkZHIpOworaW50IGhvc3RhcF91cGRhdGVfcnhfc3RhdHMoc3RydWN0IGFwX2RhdGEgKmFwLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgc3RydWN0IGhvc3RhcF84MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXRzKTsKK3ZvaWQgaG9zdGFwX3VwZGF0ZV9yYXRlcyhsb2NhbF9pbmZvX3QgKmxvY2FsKTsKK3ZvaWQgaG9zdGFwX2FkZF93ZHNfbGlua3MobG9jYWxfaW5mb190ICpsb2NhbCk7Cit2b2lkIGhvc3RhcF93ZHNfbGlua19vcGVyKGxvY2FsX2luZm9fdCAqbG9jYWwsIHU4ICphZGRyLCB3ZHNfb3Blcl90eXBlIHR5cGUpOworCisjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKK3ZvaWQgaG9zdGFwX2RlYXV0aF9hbGxfc3RhcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYXBfZGF0YSAqYXAsCisJCQkgICAgaW50IHJlc2VuZCk7CisjZW5kaWYgLyogUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLworCisjZW5kaWYgLyogSE9TVEFQX0FQX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY29tbW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGZhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NvbW1vbi5oCkBAIC0wLDAgKzEsNDM1IEBACisjaWZuZGVmIEhPU1RBUF9DT01NT05fSAorI2RlZmluZSBIT1NUQVBfQ09NTU9OX0gKKworI2RlZmluZSBCSVQoeCkgKDEgPDwgKHgpKQorCisjZGVmaW5lIE1BQzJTVFIoYSkgKGEpWzBdLCAoYSlbMV0sIChhKVsyXSwgKGEpWzNdLCAoYSlbNF0sIChhKVs1XQorI2RlZmluZSBNQUNTVFIgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorCisKKy8qIElFRUUgODAyLjExIGRlZmluZXMgKi8KKworLyogSW5mb3JtYXRpb24gRWxlbWVudCBJRHMgKi8KKyNkZWZpbmUgV0xBTl9FSURfU1NJRCAwCisjZGVmaW5lIFdMQU5fRUlEX1NVUFBfUkFURVMgMQorI2RlZmluZSBXTEFOX0VJRF9GSF9QQVJBTVMgMgorI2RlZmluZSBXTEFOX0VJRF9EU19QQVJBTVMgMworI2RlZmluZSBXTEFOX0VJRF9DRl9QQVJBTVMgNAorI2RlZmluZSBXTEFOX0VJRF9USU0gNQorI2RlZmluZSBXTEFOX0VJRF9JQlNTX1BBUkFNUyA2CisjZGVmaW5lIFdMQU5fRUlEX0NIQUxMRU5HRSAxNgorI2RlZmluZSBXTEFOX0VJRF9SU04gNDgKKyNkZWZpbmUgV0xBTl9FSURfR0VORVJJQyAyMjEKKworCisvKiBIRkEzODRYIENvbmZpZ3VyYXRpb24gUklEcyAqLworI2RlZmluZSBIRkEzODRYX1JJRF9DTkZQT1JUVFlQRSAweEZDMDAKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GT1dOTUFDQUREUiAweEZDMDEKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GREVTSVJFRFNTSUQgMHhGQzAyCisjZGVmaW5lIEhGQTM4NFhfUklEX0NORk9XTkNIQU5ORUwgMHhGQzAzCisjZGVmaW5lIEhGQTM4NFhfUklEX0NORk9XTlNTSUQgMHhGQzA0CisjZGVmaW5lIEhGQTM4NFhfUklEX0NORk9XTkFUSU1XSU5ET1cgMHhGQzA1CisjZGVmaW5lIEhGQTM4NFhfUklEX0NORlNZU1RFTVNDQUxFIDB4RkMwNgorI2RlZmluZSBIRkEzODRYX1JJRF9DTkZNQVhEQVRBTEVOIDB4RkMwNworI2RlZmluZSBIRkEzODRYX1JJRF9DTkZXRFNBRERSRVNTIDB4RkMwOAorI2RlZmluZSBIRkEzODRYX1JJRF9DTkZQTUVOQUJMRUQgMHhGQzA5CisjZGVmaW5lIEhGQTM4NFhfUklEX0NORlBNRVBTIDB4RkMwQQorI2RlZmluZSBIRkEzODRYX1JJRF9DTkZNVUxUSUNBU1RSRUNFSVZFIDB4RkMwQgorI2RlZmluZSBIRkEzODRYX1JJRF9DTkZNQVhTTEVFUERVUkFUSU9OIDB4RkMwQworI2RlZmluZSBIRkEzODRYX1JJRF9DTkZQTUhPTERPVkVSRFVSQVRJT04gMHhGQzBECisjZGVmaW5lIEhGQTM4NFhfUklEX0NORk9XTk5BTUUgMHhGQzBFCisjZGVmaW5lIEhGQTM4NFhfUklEX0NORk9XTkRUSU1QRVJJT0QgMHhGQzEwCisjZGVmaW5lIEhGQTM4NFhfUklEX0NORldEU0FERFJFU1MxIDB4RkMxMSAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9DTkZXRFNBRERSRVNTMiAweEZDMTIgLyogQVAgZi93IG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GV0RTQUREUkVTUzMgMHhGQzEzIC8qIEFQIGYvdyBvbmx5ICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0NORldEU0FERFJFU1M0IDB4RkMxNCAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9DTkZXRFNBRERSRVNTNSAweEZDMTUgLyogQVAgZi93IG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GV0RTQUREUkVTUzYgMHhGQzE2IC8qIEFQIGYvdyBvbmx5ICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0NORk1VTFRJQ0FTVFBNQlVGRkVSSU5HIDB4RkMxNyAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9VTktOT1dOMSAweEZDMjAKKyNkZWZpbmUgSEZBMzg0WF9SSURfVU5LTk9XTjIgMHhGQzIxCisjZGVmaW5lIEhGQTM4NFhfUklEX0NORldFUERFRkFVTFRLRVlJRCAweEZDMjMKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GREVGQVVMVEtFWTAgMHhGQzI0CisjZGVmaW5lIEhGQTM4NFhfUklEX0NORkRFRkFVTFRLRVkxIDB4RkMyNQorI2RlZmluZSBIRkEzODRYX1JJRF9DTkZERUZBVUxUS0VZMiAweEZDMjYKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GREVGQVVMVEtFWTMgMHhGQzI3CisjZGVmaW5lIEhGQTM4NFhfUklEX0NORldFUEZMQUdTIDB4RkMyOAorI2RlZmluZSBIRkEzODRYX1JJRF9DTkZXRVBLRVlNQVBQSU5HVEFCTEUgMHhGQzI5CisjZGVmaW5lIEhGQTM4NFhfUklEX0NORkFVVEhFTlRJQ0FUSU9OIDB4RkMyQQorI2RlZmluZSBIRkEzODRYX1JJRF9DTkZNQVhBU1NPQ1NUQSAweEZDMkIgLyogQVAgZi93IG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GVFhDT05UUk9MIDB4RkMyQworI2RlZmluZSBIRkEzODRYX1JJRF9DTkZST0FNSU5HTU9ERSAweEZDMkQKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GSE9TVEFVVEhFTlRJQ0FUSU9OIDB4RkMyRSAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9DTkZSQ1ZDUkNFUlJPUiAweEZDMzAKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GTU1MSUZFIDB4RkMzMQorI2RlZmluZSBIRkEzODRYX1JJRF9DTkZBTFRSRVRSWUNPVU5UIDB4RkMzMgorI2RlZmluZSBIRkEzODRYX1JJRF9DTkZCRUFDT05JTlQgMHhGQzMzCisjZGVmaW5lIEhGQTM4NFhfUklEX0NORkFQUENGSU5GTyAweEZDMzQgLyogQVAgZi93IG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GU1RBUENGSU5GTyAweEZDMzUKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GUFJJT1JJVFlRVVNBR0UgMHhGQzM3CisjZGVmaW5lIEhGQTM4NFhfUklEX0NORlRJTUNUUkwgMHhGQzQwCisjZGVmaW5lIEhGQTM4NFhfUklEX1VOS05PV04zIDB4RkM0MSAvKiBhZGRlZCBpbiBTVEEgZi93IDAuNy54ICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0NORlRISVJUWTJUQUxMWSAweEZDNDIgLyogYWRkZWQgaW4gU1RBIGYvdyAwLjguMCAqLworI2RlZmluZSBIRkEzODRYX1JJRF9DTkZFTkhTRUNVUklUWSAweEZDNDMgLyogQVAgZi93IG9yIFNUQSBmL3cgPj0gMS42LjMgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GREJNQURKVVNUIDB4RkM0NiAvKiBhZGRlZCBpbiBTVEEgZi93IDEuMy4xICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0dFTkVSSUNFTEVNRU5UIDB4RkM0OCAvKiBhZGRlZCBpbiBTVEEgZi93IDEuNy4wOworCQkJCQkgICAqIHdyaXRlIG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfUFJPUEFHQVRJT05ERUxBWSAweEZDNDkgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjcuNiAqLworI2RlZmluZSBIRkEzODRYX1JJRF9HUk9VUEFERFJFU1NFUyAweEZDODAKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ1JFQVRFSUJTUyAweEZDODEKKyNkZWZpbmUgSEZBMzg0WF9SSURfRlJBR01FTlRBVElPTlRIUkVTSE9MRCAweEZDODIKKyNkZWZpbmUgSEZBMzg0WF9SSURfUlRTVEhSRVNIT0xEIDB4RkM4MworI2RlZmluZSBIRkEzODRYX1JJRF9UWFJBVEVDT05UUk9MIDB4RkM4NAorI2RlZmluZSBIRkEzODRYX1JJRF9QUk9NSVNDVU9VU01PREUgMHhGQzg1CisjZGVmaW5lIEhGQTM4NFhfUklEX0ZSQUdNRU5UQVRJT05USFJFU0hPTEQwIDB4RkM5MCAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9GUkFHTUVOVEFUSU9OVEhSRVNIT0xEMSAweEZDOTEgLyogQVAgZi93IG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfRlJBR01FTlRBVElPTlRIUkVTSE9MRDIgMHhGQzkyIC8qIEFQIGYvdyBvbmx5ICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0ZSQUdNRU5UQVRJT05USFJFU0hPTEQzIDB4RkM5MyAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9GUkFHTUVOVEFUSU9OVEhSRVNIT0xENCAweEZDOTQgLyogQVAgZi93IG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfRlJBR01FTlRBVElPTlRIUkVTSE9MRDUgMHhGQzk1IC8qIEFQIGYvdyBvbmx5ICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0ZSQUdNRU5UQVRJT05USFJFU0hPTEQ2IDB4RkM5NiAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9SVFNUSFJFU0hPTEQwIDB4RkM5NyAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9SVFNUSFJFU0hPTEQxIDB4RkM5OCAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9SVFNUSFJFU0hPTEQyIDB4RkM5OSAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9SVFNUSFJFU0hPTEQzIDB4RkM5QSAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9SVFNUSFJFU0hPTEQ0IDB4RkM5QiAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9SVFNUSFJFU0hPTEQ1IDB4RkM5QyAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9SVFNUSFJFU0hPTEQ2IDB4RkM5RCAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9UWFJBVEVDT05UUk9MMCAweEZDOUUgLyogQVAgZi93IG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfVFhSQVRFQ09OVFJPTDEgMHhGQzlGIC8qIEFQIGYvdyBvbmx5ICovCisjZGVmaW5lIEhGQTM4NFhfUklEX1RYUkFURUNPTlRST0wyIDB4RkNBMCAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9UWFJBVEVDT05UUk9MMyAweEZDQTEgLyogQVAgZi93IG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfVFhSQVRFQ09OVFJPTDQgMHhGQ0EyIC8qIEFQIGYvdyBvbmx5ICovCisjZGVmaW5lIEhGQTM4NFhfUklEX1RYUkFURUNPTlRST0w1IDB4RkNBMyAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9UWFJBVEVDT05UUk9MNiAweEZDQTQgLyogQVAgZi93IG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GU0hPUlRQUkVBTUJMRSAweEZDQjAKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GRVhDTFVERUxPTkdQUkVBTUJMRSAweEZDQjEKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GQVVUSEVOVElDQVRJT05SU1BUTyAweEZDQjIKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GQkFTSUNSQVRFUyAweEZDQjMKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GU1VQUE9SVEVEUkFURVMgMHhGQ0I0CisjZGVmaW5lIEhGQTM4NFhfUklEX0NORkZBTExCQUNLQ1RSTCAweEZDQjUgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjMuMSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9XRVBLRVlESVNBQkxFIDB4RkNCNiAvKiBhZGRlZCBpbiBTVEEgZi93IDEuMy4xICovCisjZGVmaW5lIEhGQTM4NFhfUklEX1dFUEtFWU1BUElOREVYIDB4RkNCNyAvKiA/ICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0JST0FEQ0FTVEtFWUlEIDB4RkNCOCAvKiA/ICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0VOVFNFQ0ZMQUdFWUlEIDB4RkNCOSAvKiA/ICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0NORlBBU1NJVkVTQ0FOQ1RSTCAweEZDQkEgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjUuMCAqLworI2RlZmluZSBIRkEzODRYX1JJRF9TU05IQU5ETElOR01PREUgMHhGQ0JCIC8qIGFkZGVkIGluIFNUQSBmL3cgMS43LjAgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfTURDQ09OVFJPTCAweEZDQkMgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjcuMCAqLworI2RlZmluZSBIRkEzODRYX1JJRF9NRENDT1VOVFJZIDB4RkNCRCAvKiBhZGRlZCBpbiBTVEEgZi93IDEuNy4wICovCisjZGVmaW5lIEhGQTM4NFhfUklEX1RYUE9XRVJNQVggMHhGQ0JFIC8qIGFkZGVkIGluIFNUQSBmL3cgMS43LjAgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GTEZPRU5BQkxFRCAweEZDQkYgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjYuMyAqLworI2RlZmluZSBIRkEzODRYX1JJRF9DQVBJTkZPIDB4RkNDMCAvKiBhZGRlZCBpbiBTVEEgZi93IDEuNy4wICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0xJU1RFTklOVEVSVkFMIDB4RkNDMSAvKiBhZGRlZCBpbiBTVEEgZi93IDEuNy4wICovCisjZGVmaW5lIEhGQTM4NFhfUklEX1NXX0FOVF9ESVYgMHhGQ0MyIC8qIGFkZGVkIGluIFNUQSBmL3cgMS43LjA7IFByaXNtMyAqLworI2RlZmluZSBIRkEzODRYX1JJRF9MRURfQ1RSTCAweEZDQzQgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjcuNiAqLworI2RlZmluZSBIRkEzODRYX1JJRF9IRk9ERUxBWSAweEZDQzUgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjcuNiAqLworI2RlZmluZSBIRkEzODRYX1JJRF9ESVNBTExPV0VEQlNTSUQgMHhGQ0M2IC8qIGFkZGVkIGluIFNUQSBmL3cgMS44LjAgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfVElDS1RJTUUgMHhGQ0UwCisjZGVmaW5lIEhGQTM4NFhfUklEX1NDQU5SRVFVRVNUIDB4RkNFMQorI2RlZmluZSBIRkEzODRYX1JJRF9KT0lOUkVRVUVTVCAweEZDRTIKKyNkZWZpbmUgSEZBMzg0WF9SSURfQVVUSEVOVElDQVRFU1RBVElPTiAweEZDRTMgLyogQVAgZi93IG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfQ0hBTk5FTElORk9SRVFVRVNUIDB4RkNFNCAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9IT1NUU0NBTiAweEZDRTUgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjMuMSAqLworCisvKiBIRkEzODRYIEluZm9ybWF0aW9uIFJJRHMgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfTUFYTE9BRFRJTUUgMHhGRDAwCisjZGVmaW5lIEhGQTM4NFhfUklEX0RPV05MT0FEQlVGRkVSIDB4RkQwMQorI2RlZmluZSBIRkEzODRYX1JJRF9QUklJRCAweEZEMDIKKyNkZWZpbmUgSEZBMzg0WF9SSURfUFJJU1VQUkFOR0UgMHhGRDAzCisjZGVmaW5lIEhGQTM4NFhfUklEX0NGSUFDVFJBTkdFUyAweEZEMDQKKyNkZWZpbmUgSEZBMzg0WF9SSURfTklDU0VSTlVNIDB4RkQwQQorI2RlZmluZSBIRkEzODRYX1JJRF9OSUNJRCAweEZEMEIKKyNkZWZpbmUgSEZBMzg0WF9SSURfTUZJU1VQUkFOR0UgMHhGRDBDCisjZGVmaW5lIEhGQTM4NFhfUklEX0NGSVNVUFJBTkdFIDB4RkQwRAorI2RlZmluZSBIRkEzODRYX1JJRF9DSEFOTkVMTElTVCAweEZEMTAKKyNkZWZpbmUgSEZBMzg0WF9SSURfUkVHVUxBVE9SWURPTUFJTlMgMHhGRDExCisjZGVmaW5lIEhGQTM4NFhfUklEX1RFTVBUWVBFIDB4RkQxMgorI2RlZmluZSBIRkEzODRYX1JJRF9DSVMgMHhGRDEzCisjZGVmaW5lIEhGQTM4NFhfUklEX1NUQUlEIDB4RkQyMAorI2RlZmluZSBIRkEzODRYX1JJRF9TVEFTVVBSQU5HRSAweEZEMjEKKyNkZWZpbmUgSEZBMzg0WF9SSURfTUZJQUNUUkFOR0VTIDB4RkQyMgorI2RlZmluZSBIRkEzODRYX1JJRF9DRklBQ1RSQU5HRVMyIDB4RkQyMworI2RlZmluZSBIRkEzODRYX1JJRF9QUk9EVUNUTkFNRSAweEZEMjQgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjMuMTsKKwkJCQkJKiBvbmx5IFByaXNtMi41KD8pICovCisjZGVmaW5lIEhGQTM4NFhfUklEX1BPUlRTVEFUVVMgMHhGRDQwCisjZGVmaW5lIEhGQTM4NFhfUklEX0NVUlJFTlRTU0lEIDB4RkQ0MQorI2RlZmluZSBIRkEzODRYX1JJRF9DVVJSRU5UQlNTSUQgMHhGRDQyCisjZGVmaW5lIEhGQTM4NFhfUklEX0NPTU1TUVVBTElUWSAweEZENDMKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ1VSUkVOVFRYUkFURSAweEZENDQKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ1VSUkVOVEJFQUNPTklOVEVSVkFMIDB4RkQ0NQorI2RlZmluZSBIRkEzODRYX1JJRF9DVVJSRU5UU0NBTEVUSFJFU0hPTERTIDB4RkQ0NgorI2RlZmluZSBIRkEzODRYX1JJRF9QUk9UT0NPTFJTUFRJTUUgMHhGRDQ3CisjZGVmaW5lIEhGQTM4NFhfUklEX1NIT1JUUkVUUllMSU1JVCAweEZENDgKKyNkZWZpbmUgSEZBMzg0WF9SSURfTE9OR1JFVFJZTElNSVQgMHhGRDQ5CisjZGVmaW5lIEhGQTM4NFhfUklEX01BWFRSQU5TTUlUTElGRVRJTUUgMHhGRDRBCisjZGVmaW5lIEhGQTM4NFhfUklEX01BWFJFQ0VJVkVMSUZFVElNRSAweEZENEIKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ0ZQT0xMQUJMRSAweEZENEMKKyNkZWZpbmUgSEZBMzg0WF9SSURfQVVUSEVOVElDQVRJT05BTEdPUklUSE1TIDB4RkQ0RAorI2RlZmluZSBIRkEzODRYX1JJRF9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQgMHhGRDRGCisjZGVmaW5lIEhGQTM4NFhfUklEX0RCTUNPTU1TUVVBTElUWSAweEZENTEgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjMuMSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9DVVJSRU5UVFhSQVRFMSAweEZEODAgLyogQVAgZi93IG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfQ1VSUkVOVFRYUkFURTIgMHhGRDgxIC8qIEFQIGYvdyBvbmx5ICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0NVUlJFTlRUWFJBVEUzIDB4RkQ4MiAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9DVVJSRU5UVFhSQVRFNCAweEZEODMgLyogQVAgZi93IG9ubHkgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfQ1VSUkVOVFRYUkFURTUgMHhGRDg0IC8qIEFQIGYvdyBvbmx5ICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0NVUlJFTlRUWFJBVEU2IDB4RkQ4NSAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9PV05NQUNBRERSIDB4RkQ4NiAvKiBBUCBmL3cgb25seSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9TQ0FOUkVTVUxUU1RBQkxFIDB4RkQ4OCAvKiBhZGRlZCBpbiBTVEEgZi93IDAuOC4zICovCisjZGVmaW5lIEhGQTM4NFhfUklEX0hPU1RTQ0FOUkVTVUxUUyAweEZEODkgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjMuMSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9BVVRIRU5USUNBVElPTlVTRUQgMHhGRDhBIC8qIGFkZGVkIGluIFNUQSBmL3cgMS4zLjQgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfQ05GRkFBU1dJVENIQ1RSTCAweEZEOEIgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjYuMyAqLworI2RlZmluZSBIRkEzODRYX1JJRF9BU1NPQ0lBVElPTkZBSUxVUkUgMHhGRDhEIC8qIGFkZGVkIGluIFNUQSBmL3cgMS44LjAgKi8KKyNkZWZpbmUgSEZBMzg0WF9SSURfUEhZVFlQRSAweEZEQzAKKyNkZWZpbmUgSEZBMzg0WF9SSURfQ1VSUkVOVENIQU5ORUwgMHhGREMxCisjZGVmaW5lIEhGQTM4NFhfUklEX0NVUlJFTlRQT1dFUlNUQVRFIDB4RkRDMgorI2RlZmluZSBIRkEzODRYX1JJRF9DQ0FNT0RFIDB4RkRDMworI2RlZmluZSBIRkEzODRYX1JJRF9TVVBQT1JURUREQVRBUkFURVMgMHhGREM2CisjZGVmaW5lIEhGQTM4NFhfUklEX0xGT19WT0xUX1JFR19URVNUX1JFUyAweEZEQzcgLyogYWRkZWQgaW4gU1RBIGYvdyAxLjcuMSAqLworI2RlZmluZSBIRkEzODRYX1JJRF9CVUlMRFNFUSAweEZGRkUKKyNkZWZpbmUgSEZBMzg0WF9SSURfRldJRCAweEZGRkYKKworCitzdHJ1Y3QgaGZhMzg0eF9jb21wX2lkZW50Cit7CisJdTE2IGlkOworCXUxNiB2YXJpYW50OworCXUxNiBtYWpvcjsKKwl1MTYgbWlub3I7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBIRkEzODRYX0NPTVBfSURfUFJJIDB4MTUKKyNkZWZpbmUgSEZBMzg0WF9DT01QX0lEX1NUQSAweDFmCisjZGVmaW5lIEhGQTM4NFhfQ09NUF9JRF9GV19BUCAweDE0YgorCitzdHJ1Y3QgaGZhMzg0eF9zdXBfcmFuZ2UKK3sKKwl1MTYgcm9sZTsKKwl1MTYgaWQ7CisJdTE2IHZhcmlhbnQ7CisJdTE2IGJvdHRvbTsKKwl1MTYgdG9wOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworc3RydWN0IGhmYTM4NHhfYnVpbGRfaWQKK3sKKwl1MTYgcHJpX3NlcTsKKwl1MTYgc2VjX3NlcTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBGRDAxIC0gRG93bmxvYWQgQnVmZmVyICovCitzdHJ1Y3QgaGZhMzg0eF9yaWRfZG93bmxvYWRfYnVmZmVyCit7CisJdTE2IHBhZ2U7CisJdTE2IG9mZnNldDsKKwl1MTYgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEJTUyBjb25uZWN0aW9uIHF1YWxpdHkgKFJJRCBGRDQzIHJhbmdlLCBSSUQgRkQ1MSBkQm0tbm9ybWFsaXplZCkgKi8KK3N0cnVjdCBoZmEzODR4X2NvbW1zX3F1YWxpdHkgeworCXUxNiBjb21tX3F1YWw7IC8qIDAgLi4gOTIgKi8KKwl1MTYgc2lnbmFsX2xldmVsOyAvKiAyNyAuLiAxNTQgKi8KKwl1MTYgbm9pc2VfbGV2ZWw7IC8qIDI3IC4uIDE1NCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyogbmV0ZGV2aWNlIHByaXZhdGUgaW9jdGxzICh1c2VkLCBlLmcuLCB3aXRoIGl3cHJpdiBmcm9tIHVzZXIgc3BhY2UpICovCisKKy8qIE5ldyB3aXJlbGVzcyBleHRlbnNpb25zIEFQSSAtIFNFVC9HRVQgY29udmVudGlvbiAoZXZlbiBpb2N0bCBudW1iZXJzIGFyZQorICogcm9vdCBvbmx5KQorICovCisjZGVmaW5lIFBSSVNNMl9JT0NUTF9QUklTTTJfUEFSQU0gKFNJT0NJV0ZJUlNUUFJJViArIDApCisjZGVmaW5lIFBSSVNNMl9JT0NUTF9HRVRfUFJJU00yX1BBUkFNIChTSU9DSVdGSVJTVFBSSVYgKyAxKQorI2RlZmluZSBQUklTTTJfSU9DVExfV1JJVEVNSUYgKFNJT0NJV0ZJUlNUUFJJViArIDIpCisjZGVmaW5lIFBSSVNNMl9JT0NUTF9SRUFETUlGIChTSU9DSVdGSVJTVFBSSVYgKyAzKQorI2RlZmluZSBQUklTTTJfSU9DVExfTU9OSVRPUiAoU0lPQ0lXRklSU1RQUklWICsgNCkKKyNkZWZpbmUgUFJJU00yX0lPQ1RMX1JFU0VUIChTSU9DSVdGSVJTVFBSSVYgKyA2KQorI2RlZmluZSBQUklTTTJfSU9DVExfSU5RVUlSRSAoU0lPQ0lXRklSU1RQUklWICsgOCkKKyNkZWZpbmUgUFJJU00yX0lPQ1RMX1dEU19BREQgKFNJT0NJV0ZJUlNUUFJJViArIDEwKQorI2RlZmluZSBQUklTTTJfSU9DVExfV0RTX0RFTCAoU0lPQ0lXRklSU1RQUklWICsgMTIpCisjZGVmaW5lIFBSSVNNMl9JT0NUTF9TRVRfUklEX1dPUkQgKFNJT0NJV0ZJUlNUUFJJViArIDE0KQorI2RlZmluZSBQUklTTTJfSU9DVExfTUFDQ01EIChTSU9DSVdGSVJTVFBSSVYgKyAxNikKKyNkZWZpbmUgUFJJU00yX0lPQ1RMX0FERE1BQyAoU0lPQ0lXRklSU1RQUklWICsgMTgpCisjZGVmaW5lIFBSSVNNMl9JT0NUTF9ERUxNQUMgKFNJT0NJV0ZJUlNUUFJJViArIDIwKQorI2RlZmluZSBQUklTTTJfSU9DVExfS0lDS01BQyAoU0lPQ0lXRklSU1RQUklWICsgMjIpCisKKy8qIGZvbGxvd2luZyBhcmUgbm90IGluIFNJT0NHSVdQUklWIGxpc3Q7IGNoZWNrIHBlcm1pc3Npb24gaW4gdGhlIGRyaXZlciBjb2RlCisgKi8KKyNkZWZpbmUgUFJJU00yX0lPQ1RMX0RPV05MT0FEIChTSU9DREVWUFJJVkFURSArIDEzKQorI2RlZmluZSBQUklTTTJfSU9DVExfSE9TVEFQRCAoU0lPQ0RFVlBSSVZBVEUgKyAxNCkKKworCisvKiBQUklTTTJfSU9DVExfUFJJU00yX1BBUkFNIGlvY3RsKCkgc3VidHlwZXM6ICovCitlbnVtIHsKKwkvKiBQUklTTTJfUEFSQU1fUFRZUEUgPSAxLCAqLyAvKiBSRU1PVkVEIDIwMDMtMTAtMjIgKi8KKwlQUklTTTJfUEFSQU1fVFhSQVRFQ1RSTCA9IDIsCisJUFJJU00yX1BBUkFNX0JFQUNPTl9JTlQgPSAzLAorCVBSSVNNMl9QQVJBTV9QU0VVRE9fSUJTUyA9IDQsCisJUFJJU00yX1BBUkFNX0FMQyA9IDUsCisJLyogUFJJU00yX1BBUkFNX1RYUE9XRVIgPSA2LCAqLyAvKiBSRU1PVkVEIDIwMDMtMTAtMjIgKi8KKwlQUklTTTJfUEFSQU1fRFVNUCA9IDcsCisJUFJJU00yX1BBUkFNX09USEVSX0FQX1BPTElDWSA9IDgsCisJUFJJU00yX1BBUkFNX0FQX01BWF9JTkFDVElWSVRZID0gOSwKKwlQUklTTTJfUEFSQU1fQVBfQlJJREdFX1BBQ0tFVFMgPSAxMCwKKwlQUklTTTJfUEFSQU1fRFRJTV9QRVJJT0QgPSAxMSwKKwlQUklTTTJfUEFSQU1fQVBfTlVMTEZVTkNfQUNLID0gMTIsCisJUFJJU00yX1BBUkFNX01BWF9XRFMgPSAxMywKKwlQUklTTTJfUEFSQU1fQVBfQVVUT01fQVBfV0RTID0gMTQsCisJUFJJU00yX1BBUkFNX0FQX0FVVEhfQUxHUyA9IDE1LAorCVBSSVNNMl9QQVJBTV9NT05JVE9SX0FMTE9XX0ZDU0VSUiA9IDE2LAorCVBSSVNNMl9QQVJBTV9IT1NUX0VOQ1JZUFQgPSAxNywKKwlQUklTTTJfUEFSQU1fSE9TVF9ERUNSWVBUID0gMTgsCisJLyogUFJJU00yX1BBUkFNX0JVU19NQVNURVJfVEhSRVNIT0xEX1JYID0gMTksIFJFTU9WRUQgMjAwNS0wOC0xNCAqLworCS8qIFBSSVNNMl9QQVJBTV9CVVNfTUFTVEVSX1RIUkVTSE9MRF9UWCA9IDIwLCBSRU1PVkVEIDIwMDUtMDgtMTQgKi8KKwlQUklTTTJfUEFSQU1fSE9TVF9ST0FNSU5HID0gMjEsCisJUFJJU00yX1BBUkFNX0JDUlhfU1RBX0tFWSA9IDIyLAorCVBSSVNNMl9QQVJBTV9JRUVFXzgwMl8xWCA9IDIzLAorCVBSSVNNMl9QQVJBTV9BTlRTRUxfVFggPSAyNCwKKwlQUklTTTJfUEFSQU1fQU5UU0VMX1JYID0gMjUsCisJUFJJU00yX1BBUkFNX01PTklUT1JfVFlQRSA9IDI2LAorCVBSSVNNMl9QQVJBTV9XRFNfVFlQRSA9IDI3LAorCVBSSVNNMl9QQVJBTV9IT1NUU0NBTiA9IDI4LAorCVBSSVNNMl9QQVJBTV9BUF9TQ0FOID0gMjksCisJUFJJU00yX1BBUkFNX0VOSF9TRUMgPSAzMCwKKwlQUklTTTJfUEFSQU1fSU9fREVCVUcgPSAzMSwKKwlQUklTTTJfUEFSQU1fQkFTSUNfUkFURVMgPSAzMiwKKwlQUklTTTJfUEFSQU1fT1BFUl9SQVRFUyA9IDMzLAorCVBSSVNNMl9QQVJBTV9IT1NUQVBEID0gMzQsCisJUFJJU00yX1BBUkFNX0hPU1RBUERfU1RBID0gMzUsCisJUFJJU00yX1BBUkFNX1dQQSA9IDM2LAorCVBSSVNNMl9QQVJBTV9QUklWQUNZX0lOVk9LRUQgPSAzNywKKwlQUklTTTJfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVMgPSAzOCwKKwlQUklTTTJfUEFSQU1fRFJPUF9VTkVOQ1JZUFRFRCA9IDM5LAorCVBSSVNNMl9QQVJBTV9TQ0FOX0NIQU5ORUxfTUFTSyA9IDQwLAorfTsKKworZW51bSB7IEhPU1RBUF9BTlRTRUxfRE9fTk9UX1RPVUNIID0gMCwgSE9TVEFQX0FOVFNFTF9ESVZFUlNJVFkgPSAxLAorICAgICAgIEhPU1RBUF9BTlRTRUxfTE9XID0gMiwgSE9TVEFQX0FOVFNFTF9ISUdIID0gMyB9OworCisKKy8qIFBSSVNNMl9JT0NUTF9NQUNDTUQgaW9jdGwoKSBzdWJjb21tYW5kczogKi8KK2VudW0geyBBUF9NQUNfQ01EX1BPTElDWV9PUEVOID0gMCwgQVBfTUFDX0NNRF9QT0xJQ1lfQUxMT1cgPSAxLAorICAgICAgIEFQX01BQ19DTURfUE9MSUNZX0RFTlkgPSAyLCBBUF9NQUNfQ01EX0ZMVVNIID0gMywKKyAgICAgICBBUF9NQUNfQ01EX0tJQ0tBTEwgPSA0IH07CisKKworLyogUFJJU00yX0lPQ1RMX0RPV05MT0FEIGlvY3RsKCkgZGxfY21kOiAqLworZW51bSB7CisJUFJJU00yX0RPV05MT0FEX1ZPTEFUSUxFID0gMSAvKiBSQU0gKi8sCisJLyogTm90ZSEgT2xkIHZlcnNpb25zIG9mIHByaXNtMl9zcmVjIGhhdmUgYSBmYXRhbCBlcnJvciBpbiBDUkMtMTYKKwkgKiBjYWxjdWxhdGlvbiwgd2hpY2ggd2lsbCBjb3JydXB0IGFsbCBub24tdm9sYXRpbGUgZG93bmxvYWRzLgorCSAqIFBSSVNNMl9ET1dOTE9BRF9OT05fVk9MQVRJTEUgdXNlZCB0byBiZSAyLCBidXQgaXQgaXMgbm93IDMgdG8KKwkgKiBwcmV2ZW50IHVzZSBvZiBvbGQgdmVyc2lvbnMgb2YgcHJpc20yX3NyZWMgZm9yIG5vbi12b2xhdGlsZQorCSAqIGRvd25sb2FkLiAqLworCVBSSVNNMl9ET1dOTE9BRF9OT05fVk9MQVRJTEUgPSAzIC8qIEZMQVNIICovLAorCVBSSVNNMl9ET1dOTE9BRF9WT0xBVElMRV9HRU5FU0lTID0gNCAvKiBSQU0gaW4gR2VuZXNpcyBtb2RlICovLAorCS8qIFBlcnNpc3RlbnQgdmVyc2lvbnMgb2Ygdm9sYXRpbGUgZG93bmxvYWQgY29tbWFuZHMgKGtlZXAgZmlybXdhcmUKKwkgKiBkYXRhIGluIG1lbW9yeSBhbmQgYXV0b21hdGljYWxseSByZS1kb3dubG9hZCBhZnRlciBod19yZXNldCAqLworCVBSSVNNMl9ET1dOTE9BRF9WT0xBVElMRV9QRVJTSVNURU5UID0gNSwKKwlQUklTTTJfRE9XTkxPQURfVk9MQVRJTEVfR0VORVNJU19QRVJTSVNURU5UID0gNiwKK307CisKK3N0cnVjdCBwcmlzbTJfZG93bmxvYWRfcGFyYW0geworCXUzMiBkbF9jbWQ7CisJdTMyIHN0YXJ0X2FkZHI7CisJdTMyIG51bV9hcmVhczsKKwlzdHJ1Y3QgcHJpc20yX2Rvd25sb2FkX2FyZWEgeworCQl1MzIgYWRkcjsgLyogd2xhbiBjYXJkIGFkZHJlc3MgKi8KKwkJdTMyIGxlbjsKKwkJdm9pZCBfX3VzZXIgKnB0cjsgLyogcG9pbnRlciB0byBkYXRhIGluIHVzZXIgc3BhY2UgKi8KKwl9IGRhdGFbMF07Cit9OworCisjZGVmaW5lIFBSSVNNMl9NQVhfRE9XTkxPQURfQVJFQV9MRU4gMTMxMDcyCisjZGVmaW5lIFBSSVNNMl9NQVhfRE9XTkxPQURfTEVOIDI2MjE0NAorCisKKy8qIFBSSVNNMl9JT0NUTF9IT1NUQVBEIGlvY3RsKCkgY21kOiAqLworZW51bSB7CisJUFJJU00yX0hPU1RBUERfRkxVU0ggPSAxLAorCVBSSVNNMl9IT1NUQVBEX0FERF9TVEEgPSAyLAorCVBSSVNNMl9IT1NUQVBEX1JFTU9WRV9TVEEgPSAzLAorCVBSSVNNMl9IT1NUQVBEX0dFVF9JTkZPX1NUQSA9IDQsCisJLyogUkVNT1ZFRDogUFJJU00yX0hPU1RBUERfUkVTRVRfVFhFWENfU1RBID0gNSwgKi8KKwlQUklTTTJfU0VUX0VOQ1JZUFRJT04gPSA2LAorCVBSSVNNMl9HRVRfRU5DUllQVElPTiA9IDcsCisJUFJJU00yX0hPU1RBUERfU0VUX0ZMQUdTX1NUQSA9IDgsCisJUFJJU00yX0hPU1RBUERfR0VUX1JJRCA9IDksCisJUFJJU00yX0hPU1RBUERfU0VUX1JJRCA9IDEwLAorCVBSSVNNMl9IT1NUQVBEX1NFVF9BU1NPQ19BUF9BRERSID0gMTEsCisJUFJJU00yX0hPU1RBUERfU0VUX0dFTkVSSUNfRUxFTUVOVCA9IDEyLAorCVBSSVNNMl9IT1NUQVBEX01MTUUgPSAxMywKKwlQUklTTTJfSE9TVEFQRF9TQ0FOX1JFUSA9IDE0LAorCVBSSVNNMl9IT1NUQVBEX1NUQV9DTEVBUl9TVEFUUyA9IDE1LAorfTsKKworI2RlZmluZSBQUklTTTJfSE9TVEFQRF9NQVhfQlVGX1NJWkUgMTAyNAorI2RlZmluZSBQUklTTTJfSE9TVEFQRF9SSURfSERSX0xFTiBcCisoKGludCkgKCYoKHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqKSAwKS0+dS5yaWQuZGF0YSkpCisjZGVmaW5lIFBSSVNNMl9IT1NUQVBEX0dFTkVSSUNfRUxFTUVOVF9IRFJfTEVOIFwKKygoaW50KSAoJigoc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICopIDApLT51LmdlbmVyaWNfZWxlbS5kYXRhKSkKKworLyogTWF4aW11bSBsZW5ndGggZm9yIGFsZ29yaXRobSBuYW1lcyAoLTEgZm9yIG51bCB0ZXJtaW5hdGlvbikgdXNlZCBpbiBpb2N0bCgpCisgKi8KKyNkZWZpbmUgSE9TVEFQX0NSWVBUX0FMR19OQU1FX0xFTiAxNgorCisKK3N0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSB7CisJdTMyIGNtZDsKKwl1OCBzdGFfYWRkcltFVEhfQUxFTl07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTE2IGFpZDsKKwkJCXUxNiBjYXBhYmlsaXR5OworCQkJdTggdHhfc3VwcF9yYXRlczsKKwkJfSBhZGRfc3RhOworCQlzdHJ1Y3QgeworCQkJdTMyIGluYWN0aXZlX3NlYzsKKwkJfSBnZXRfaW5mb19zdGE7CisJCXN0cnVjdCB7CisJCQl1OCBhbGdbSE9TVEFQX0NSWVBUX0FMR19OQU1FX0xFTl07CisJCQl1MzIgZmxhZ3M7CisJCQl1MzIgZXJyOworCQkJdTggaWR4OworCQkJdTggc2VxWzhdOyAvKiBzZXF1ZW5jZSBjb3VudGVyIChzZXQ6IFJYLCBnZXQ6IFRYKSAqLworCQkJdTE2IGtleV9sZW47CisJCQl1OCBrZXlbMF07CisJCX0gY3J5cHQ7CisJCXN0cnVjdCB7CisJCQl1MzIgZmxhZ3NfYW5kOworCQkJdTMyIGZsYWdzX29yOworCQl9IHNldF9mbGFnc19zdGE7CisJCXN0cnVjdCB7CisJCQl1MTYgcmlkOworCQkJdTE2IGxlbjsKKwkJCXU4IGRhdGFbMF07CisJCX0gcmlkOworCQlzdHJ1Y3QgeworCQkJdTggbGVuOworCQkJdTggZGF0YVswXTsKKwkJfSBnZW5lcmljX2VsZW07CisJCXN0cnVjdCB7CisjZGVmaW5lIE1MTUVfU1RBX0RFQVVUSCAwCisjZGVmaW5lIE1MTUVfU1RBX0RJU0FTU09DIDEKKwkJCXUxNiBjbWQ7CisJCQl1MTYgcmVhc29uX2NvZGU7CisJCX0gbWxtZTsKKwkJc3RydWN0IHsKKwkJCXU4IHNzaWRfbGVuOworCQkJdTggc3NpZFszMl07CisJCX0gc2Nhbl9yZXE7CisJfSB1OworfTsKKworI2RlZmluZSBIT1NUQVBfQ1JZUFRfRkxBR19TRVRfVFhfS0VZIEJJVCgwKQorI2RlZmluZSBIT1NUQVBfQ1JZUFRfRkxBR19QRVJNQU5FTlQgQklUKDEpCisKKyNkZWZpbmUgSE9TVEFQX0NSWVBUX0VSUl9VTktOT1dOX0FMRyAyCisjZGVmaW5lIEhPU1RBUF9DUllQVF9FUlJfVU5LTk9XTl9BRERSIDMKKyNkZWZpbmUgSE9TVEFQX0NSWVBUX0VSUl9DUllQVF9JTklUX0ZBSUxFRCA0CisjZGVmaW5lIEhPU1RBUF9DUllQVF9FUlJfS0VZX1NFVF9GQUlMRUQgNQorI2RlZmluZSBIT1NUQVBfQ1JZUFRfRVJSX1RYX0tFWV9TRVRfRkFJTEVEIDYKKyNkZWZpbmUgSE9TVEFQX0NSWVBUX0VSUl9DQVJEX0NPTkZfRkFJTEVEIDcKKworCisjZW5kaWYgLyogSE9TVEFQX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NvbmZpZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWQzNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jb25maWcuaApAQCAtMCwwICsxLDU1IEBACisjaWZuZGVmIEhPU1RBUF9DT05GSUdfSAorI2RlZmluZSBIT1NUQVBfQ09ORklHX0gKKworI2RlZmluZSBQUklTTTJfVkVSU0lPTiAiMC40LjQta2VybmVsIgorCisvKiBJbiB0aGUgcHJldmlvdXMgdmVyc2lvbnMgb2YgSG9zdCBBUCBkcml2ZXIsIHN1cHBvcnQgZm9yIHVzZXIgc3BhY2UgdmVyc2lvbgorICogb2YgSUVFRSA4MDIuMTEgbWFuYWdlbWVudCAoaG9zdGFwZCkgdXNlZCB0byBiZSBkaXNhYmxlZCBpbiB0aGUgZGVmYXVsdAorICogY29uZmlndXJhdGlvbi4gRnJvbSBub3cgb24sIHN1cHBvcnQgZm9yIGhvc3RhcGQgaXMgYWx3YXlzIGluY2x1ZGVkIGFuZCBpdCBpcworICogcG9zc2libGUgdG8gZGlzYWJsZSBrZXJuZWwgZHJpdmVyIHZlcnNpb24gb2YgSUVFRSA4MDIuMTEgbWFuYWdlbWVudCB3aXRoIGEKKyAqIHNlcGFyYXRlIGRlZmluZSwgUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVC4gKi8KKy8qICNkZWZpbmUgUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLworCisvKiBNYXhpbXVtIG51bWJlciBvZiBldmVudHMgaGFuZGxlciBwZXIgb25lIGludGVycnVwdCAqLworI2RlZmluZSBQUklTTTJfTUFYX0lOVEVSUlVQVF9FVkVOVFMgMjAKKworLyogSW5jbHVkZSBjb2RlIGZvciBkb3dubG9hZGluZyBmaXJtd2FyZSBpbWFnZXMgaW50byB2b2xhdGlsZSBSQU0uICovCisjZGVmaW5lIFBSSVNNMl9ET1dOTE9BRF9TVVBQT1JUCisKKy8qIEFsbG93IGtlcm5lbCBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSBkb3dubG9hZCBzdXBwb3J0LiAqLworI2lmICFkZWZpbmVkKFBSSVNNMl9ET1dOTE9BRF9TVVBQT1JUKSAmJiBkZWZpbmVkKENPTkZJR19IT1NUQVBfRklSTVdBUkUpCisjZGVmaW5lIFBSSVNNMl9ET1dOTE9BRF9TVVBQT1JUCisjZW5kaWYKKworI2lmZGVmIFBSSVNNMl9ET1dOTE9BRF9TVVBQT1JUCisvKiBBbGxvdyB3cml0aW5nIGZpcm13YXJlIGltYWdlcyBpbnRvIGZsYXNoLCBpLmUuLCB0byBub24tdm9sYXRpbGUgc3RvcmFnZS4KKyAqIEJlZm9yZSB5b3UgZW5hYmxlIHRoaXMgb3B0aW9uLCB5b3Ugc2hvdWxkIG1ha2UgYWJzb2x1dGVseSBzdXJlIHRoYXQgeW91IGFyZQorICogdXNpbmcgcHJpc20yX3NyZWMgdXRpbGl0eSB0aGF0IGNvbWVzIHdpdGggVEhJUyB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIhCisgKiBJbiBhZGRpdGlvbiwgcGxlYXNlIG5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBraWxsIHlvdXIgY2FyZCB3aXRoCisgKiBub24tdm9sYXRpbGUgZG93bmxvYWQgaWYgeW91IGFyZSB1c2luZyBpbmNvcnJlY3QgaW1hZ2UuIFRoaXMgZmVhdHVyZSBoYXMgbm90CisgKiBiZWVuIGZ1bGx5IHRlc3RlZCwgc28gcGxlYXNlIGJlIGNhcmVmdWwgd2l0aCBpdC4gKi8KKy8qICNkZWZpbmUgUFJJU00yX05PTl9WT0xBVElMRV9ET1dOTE9BRCAqLworI2VuZGlmIC8qIFBSSVNNMl9ET1dOTE9BRF9TVVBQT1JUICovCisKKy8qIFNhdmUgbG93LWxldmVsIEkvTyBmb3IgZGVidWdnaW5nLiBUaGlzIHNob3VsZCBub3QgYmUgZW5hYmxlZCBpbiBub3JtYWwgdXNlLgorICovCisvKiAjZGVmaW5lIFBSSVNNMl9JT19ERUJVRyAqLworCisvKiBGb2xsb3dpbmcgZGVmaW5lcyBjYW4gYmUgdXNlZCB0byByZW1vdmUgdW5uZWVkZWQgcGFydHMgb2YgdGhlIGRyaXZlciwgZS5nLiwKKyAqIHRvIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBrZXJuZWwgbW9kdWxlLiBEZWZpbml0aW9ucyBjYW4gYmUgYWRkZWQgaGVyZSBpbgorICogaG9zdGFwX2NvbmZpZy5oIG9yIHRoZXkgY2FuIGJlIGFkZGVkIHRvIG1ha2UgY29tbWFuZCB3aXRoIEVYVFJBX0NGTEFHUywKKyAqIGUuZy4sCisgKiAnbWFrZSBwY2NhcmQgRVhUUkFfQ0ZMQUdTPSItRFBSSVNNMl9OT19ERUJVRyAtRFBSSVNNMl9OT19QUk9DRlNfREVCVUciJworICovCisKKy8qIERvIG5vdCBpbmNsdWRlIGRlYnVnIG1lc3NhZ2VzIGludG8gdGhlIGRyaXZlciAqLworLyogI2RlZmluZSBQUklTTTJfTk9fREVCVUcgKi8KKworLyogRG8gbm90IGluY2x1ZGUgL3Byb2MvbmV0L3ByaXNtMi93bGFuIy97cmVnaXN0ZXJzLGRlYnVnfSAqLworLyogI2RlZmluZSBQUklTTTJfTk9fUFJPQ0ZTX0RFQlVHICovCisKKy8qIERvIG5vdCBpbmNsdWRlIHN0YXRpb24gZnVuY3Rpb25hbGl0eSAoaS5lLiwgYWxsb3cgb25seSBNYXN0ZXIgKEhvc3QgQVApIG1vZGUKKyAqLworLyogI2RlZmluZSBQUklTTTJfTk9fU1RBVElPTl9NT0RFUyAqLworCisjZW5kaWYgLyogSE9TVEFQX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhODNiYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYwpAQCAtMCwwICsxLDEwMzAgQEAKKyNkZWZpbmUgUFJJU00yX1BDQ0FSRAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiaG9zdGFwX3dsYW4uaCIKKworCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9IFBSSVNNMl9WRVJTSU9OICIgKEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4pIjsKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gImhvc3RhcF9jcyI7CitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3QgPSBOVUxMOworCitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cHBvcnQgZm9yIEludGVyc2lsIFByaXNtMi1iYXNlZCA4MDIuMTEgd2lyZWxlc3MgTEFOICIKKwkJICAgImNhcmRzIChQQyBDYXJkKS4iKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJJbnRlcnNpbCBQcmlzbTItYmFzZWQgV0xBTiBjYXJkcyAoUEMgQ2FyZCkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFBSSVNNMl9WRVJTSU9OKTsKKworCitzdGF0aWMgaW50IGlnbm9yZV9jaXNfdmNjOworbW9kdWxlX3BhcmFtKGlnbm9yZV9jaXNfdmNjLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZ25vcmVfY2lzX3ZjYywgIklnbm9yZSBicm9rZW4gQ0lTIFZDQyBlbnRyeSIpOworCisKKy8qIHN0cnVjdCBsb2NhbF9pbmZvOjpod19wcml2ICovCitzdHJ1Y3QgaG9zdGFwX2NzX3ByaXYgeworCWRldl9ub2RlX3Qgbm9kZTsKKwlkZXZfbGlua190ICpsaW5rOworCWludCBzYW5kaXNrX2Nvbm5lY3RwbHVzOworfTsKKworCisjaWZkZWYgUFJJU00yX0lPX0RFQlVHCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZmEzODR4X291dGJfZGVidWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGEsIHU4IHYpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKwlwcmlzbTJfaW9fZGVidWdfYWRkKGRldiwgUFJJU00yX0lPX0RFQlVHX0NNRF9PVVRCLCBhLCB2KTsKKwlvdXRiKHYsIGRldi0+YmFzZV9hZGRyICsgYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB1OCBoZmEzODR4X2luYl9kZWJ1ZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHY7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJdiA9IGluYihkZXYtPmJhc2VfYWRkciArIGEpOworCXByaXNtMl9pb19kZWJ1Z19hZGQoZGV2LCBQUklTTTJfSU9fREVCVUdfQ01EX0lOQiwgYSwgdik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhmYTM4NHhfb3V0d19kZWJ1ZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYSwgdTE2IHYpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKwlwcmlzbTJfaW9fZGVidWdfYWRkKGRldiwgUFJJU00yX0lPX0RFQlVHX0NNRF9PVVRXLCBhLCB2KTsKKwlvdXR3KHYsIGRldi0+YmFzZV9hZGRyICsgYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgaGZhMzg0eF9pbndfZGVidWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgdjsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKwl2ID0gaW53KGRldi0+YmFzZV9hZGRyICsgYSk7CisJcHJpc20yX2lvX2RlYnVnX2FkZChkZXYsIFBSSVNNMl9JT19ERUJVR19DTURfSU5XLCBhLCB2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+bG9jaywgZmxhZ3MpOworCXJldHVybiB2OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGZhMzg0eF9vdXRzd19kZWJ1ZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYSwKKwkJCQkgICAgICAgdTggKmJ1ZiwgaW50IHdjKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJcHJpc20yX2lvX2RlYnVnX2FkZChkZXYsIFBSSVNNMl9JT19ERUJVR19DTURfT1VUU1csIGEsIHdjKTsKKwlvdXRzdyhkZXYtPmJhc2VfYWRkciArIGEsIGJ1Ziwgd2MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZmEzODR4X2luc3dfZGVidWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGEsCisJCQkJICAgICAgdTggKmJ1ZiwgaW50IHdjKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJcHJpc20yX2lvX2RlYnVnX2FkZChkZXYsIFBSSVNNMl9JT19ERUJVR19DTURfSU5TVywgYSwgd2MpOworCWluc3coZGV2LT5iYXNlX2FkZHIgKyBhLCBidWYsIHdjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+bG9jaywgZmxhZ3MpOworfQorCisjZGVmaW5lIEhGQTM4NFhfT1VUQih2LGEpIGhmYTM4NHhfb3V0Yl9kZWJ1ZyhkZXYsIChhKSwgKHYpKQorI2RlZmluZSBIRkEzODRYX0lOQihhKSBoZmEzODR4X2luYl9kZWJ1ZyhkZXYsIChhKSkKKyNkZWZpbmUgSEZBMzg0WF9PVVRXKHYsYSkgaGZhMzg0eF9vdXR3X2RlYnVnKGRldiwgKGEpLCAodikpCisjZGVmaW5lIEhGQTM4NFhfSU5XKGEpIGhmYTM4NHhfaW53X2RlYnVnKGRldiwgKGEpKQorI2RlZmluZSBIRkEzODRYX09VVFNXKGEsIGJ1Ziwgd2MpIGhmYTM4NHhfb3V0c3dfZGVidWcoZGV2LCAoYSksIChidWYpLCAod2MpKQorI2RlZmluZSBIRkEzODRYX0lOU1coYSwgYnVmLCB3YykgaGZhMzg0eF9pbnN3X2RlYnVnKGRldiwgKGEpLCAoYnVmKSwgKHdjKSkKKworI2Vsc2UgLyogUFJJU00yX0lPX0RFQlVHICovCisKKyNkZWZpbmUgSEZBMzg0WF9PVVRCKHYsYSkgb3V0YigodiksIGRldi0+YmFzZV9hZGRyICsgKGEpKQorI2RlZmluZSBIRkEzODRYX0lOQihhKSBpbmIoZGV2LT5iYXNlX2FkZHIgKyAoYSkpCisjZGVmaW5lIEhGQTM4NFhfT1VUVyh2LGEpIG91dHcoKHYpLCBkZXYtPmJhc2VfYWRkciArIChhKSkKKyNkZWZpbmUgSEZBMzg0WF9JTlcoYSkgaW53KGRldi0+YmFzZV9hZGRyICsgKGEpKQorI2RlZmluZSBIRkEzODRYX0lOU1coYSwgYnVmLCB3YykgaW5zdyhkZXYtPmJhc2VfYWRkciArIChhKSwgYnVmLCB3YykKKyNkZWZpbmUgSEZBMzg0WF9PVVRTVyhhLCBidWYsIHdjKSBvdXRzdyhkZXYtPmJhc2VfYWRkciArIChhKSwgYnVmLCB3YykKKworI2VuZGlmIC8qIFBSSVNNMl9JT19ERUJVRyAqLworCisKK3N0YXRpYyBpbnQgaGZhMzg0eF9mcm9tX2JhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgYmFwLCB2b2lkICpidWYsCisJCQkgICAgaW50IGxlbikKK3sKKwl1MTYgZF9vZmY7CisJdTE2ICpwb3M7CisKKwlkX29mZiA9IChiYXAgPT0gMSkgPyBIRkEzODRYX0RBVEExX09GRiA6IEhGQTM4NFhfREFUQTBfT0ZGOworCXBvcyA9ICh1MTYgKikgYnVmOworCisJaWYgKGxlbiAvIDIpCisJCUhGQTM4NFhfSU5TVyhkX29mZiwgYnVmLCBsZW4gLyAyKTsKKwlwb3MgKz0gbGVuIC8gMjsKKworCWlmIChsZW4gJiAxKQorCQkqKChjaGFyICopIHBvcykgPSBIRkEzODRYX0lOQihkX29mZik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhmYTM4NHhfdG9fYmFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBiYXAsIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwl1MTYgZF9vZmY7CisJdTE2ICpwb3M7CisKKwlkX29mZiA9IChiYXAgPT0gMSkgPyBIRkEzODRYX0RBVEExX09GRiA6IEhGQTM4NFhfREFUQTBfT0ZGOworCXBvcyA9ICh1MTYgKikgYnVmOworCisJaWYgKGxlbiAvIDIpCisJCUhGQTM4NFhfT1VUU1coZF9vZmYsIGJ1ZiwgbGVuIC8gMik7CisJcG9zICs9IGxlbiAvIDI7CisKKwlpZiAobGVuICYgMSkKKwkJSEZBMzg0WF9PVVRCKCooKGNoYXIgKikgcG9zKSwgZF9vZmYpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogRklYOiBUaGlzIG1pZ2h0IGNoYW5nZSBhdCBzb21lIHBvaW50Li4gKi8KKyNpbmNsdWRlICJob3N0YXBfaHcuYyIKKworCisKK3N0YXRpYyB2b2lkIHByaXNtMl9kZXRhY2goZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCBwcmlzbTJfcmVsZWFzZSh1X2xvbmcgYXJnKTsKK3N0YXRpYyBpbnQgcHJpc20yX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCWV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKKworc3RhdGljIGludCBwcmlzbTJfcGNjYXJkX2NhcmRfcHJlc2VudChsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXN0cnVjdCBob3N0YXBfY3NfcHJpdiAqaHdfcHJpdiA9IGxvY2FsLT5od19wcml2OworCWlmIChod19wcml2ICE9IE5VTEwgJiYgaHdfcHJpdi0+bGluayAhPSBOVUxMICYmCisJICAgICgoaHdfcHJpdi0+bGluay0+c3RhdGUgJiAoREVWX1BSRVNFTlQgfCBERVZfQ09ORklHKSkgPT0KKwkgICAgIChERVZfUFJFU0VOVCB8IERFVl9DT05GSUcpKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFNhbkRpc2sgQ29tcGFjdEZsYXNoIFdMQU4gRmxhc2hjYXJkIC0gUHJvZHVjdCBNYW51YWwgdjEuMAorICogRG9jdW1lbnQgTm8uIDIwLTEwLTAwMDU4LCBKYW51YXJ5IDIwMDQKKyAqIGh0dHA6Ly93d3cuc2FuZGlzay5jb20vcGRmL2luZHVzdHJpYWwvUHJvZE1hbnVhbENGV0xBTnYxLjAucGRmCisgKi8KKyNkZWZpbmUgU0FORElTS19XTEFOX0FDVElWQVRJT05fT0ZGIDB4NDAKKyNkZWZpbmUgU0FORElTS19IQ1JfT0ZGIDB4NDIKKworCitzdGF0aWMgdm9pZCBzYW5kaXNrX3NldF9pb2Jhc2UobG9jYWxfaW5mb190ICpsb2NhbCkKK3sKKwlpbnQgcmVzOworCWNvbmZfcmVnX3QgcmVnOworCXN0cnVjdCBob3N0YXBfY3NfcHJpdiAqaHdfcHJpdiA9IGxvY2FsLT5od19wcml2OworCisJcmVnLkZ1bmN0aW9uID0gMDsKKwlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7CisJcmVnLk9mZnNldCA9IDB4MTA7IC8qIDB4M2YwIElPIGJhc2UgMSAqLworCXJlZy5WYWx1ZSA9IGh3X3ByaXYtPmxpbmstPmlvLkJhc2VQb3J0MSAmIDB4MDBmZjsKKwlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluay0+aGFuZGxlLAorCQkJCQkJICAgJnJlZyk7CisJaWYgKHJlcyAhPSBDU19TVUNDRVNTKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJQcmlzbTMgU2FuRGlzayAtIGZhaWxlZCB0byBzZXQgSS9PIGJhc2UgMCAtIgorCQkgICAgICAgIiByZXM9JWRcbiIsIHJlcyk7CisJfQorCXVkZWxheSgxMCk7CisKKwlyZWcuRnVuY3Rpb24gPSAwOworCXJlZy5BY3Rpb24gPSBDU19XUklURTsKKwlyZWcuT2Zmc2V0ID0gMHgxMjsgLyogMHgzZjIgSU8gYmFzZSAyICovCisJcmVnLlZhbHVlID0gKGh3X3ByaXYtPmxpbmstPmlvLkJhc2VQb3J0MSAmIDB4ZmYwMCkgPj4gODsKKwlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluay0+aGFuZGxlLAorCQkJCQkJICAgJnJlZyk7CisJaWYgKHJlcyAhPSBDU19TVUNDRVNTKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJQcmlzbTMgU2FuRGlzayAtIGZhaWxlZCB0byBzZXQgSS9PIGJhc2UgMSAtIgorCQkgICAgICAgIiByZXM9JWRcbiIsIHJlcyk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHNhbmRpc2tfd3JpdGVfaGNyKGxvY2FsX2luZm9fdCAqbG9jYWwsIGludCBoY3IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CisJaW50IGk7CisKKwlIRkEzODRYX09VVEIoMHg4MCwgU0FORElTS19XTEFOX0FDVElWQVRJT05fT0ZGKTsKKwl1ZGVsYXkoNTApOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCUhGQTM4NFhfT1VUQihoY3IsIFNBTkRJU0tfSENSX09GRik7CisJfQorCXVkZWxheSg1NSk7CisJSEZBMzg0WF9PVVRCKDB4NDUsIFNBTkRJU0tfV0xBTl9BQ1RJVkFUSU9OX09GRik7Cit9CisKKworc3RhdGljIGludCBzYW5kaXNrX2VuYWJsZV93aXJlbGVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXMsIHJldCA9IDA7CisJY29uZl9yZWdfdCByZWc7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlID0gZGV2LT5wcml2OworCWxvY2FsX2luZm9fdCAqbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisJdHVwbGVfdCB0dXBsZTsKKwljaXNwYXJzZV90ICpwYXJzZSA9IE5VTEw7CisJdV9jaGFyIGJ1Zls2NF07CisJc3RydWN0IGhvc3RhcF9jc19wcml2ICpod19wcml2ID0gbG9jYWwtPmh3X3ByaXY7CisKKwlpZiAoaHdfcHJpdi0+bGluay0+aW8uTnVtUG9ydHMxIDwgMHg0MikgeworCQkvKiBOb3QgZW5vdWdoIHBvcnRzIHRvIGJlIFNhbkRpc2sgbXVsdGktZnVuY3Rpb24gY2FyZCAqLworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCisJcGFyc2UgPSBrbWFsbG9jKHNpemVvZihjaXNwYXJzZV90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBhcnNlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7CisJdHVwbGUuQXR0cmlidXRlcyA9IFRVUExFX1JFVFVSTl9DT01NT047CisJdHVwbGUuVHVwbGVEYXRhID0gYnVmOworCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKwlpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShod19wcml2LT5saW5rLT5oYW5kbGUsICZ0dXBsZSkgfHwKKwkgICAgcGNtY2lhX2dldF90dXBsZV9kYXRhKGh3X3ByaXYtPmxpbmstPmhhbmRsZSwgJnR1cGxlKSB8fAorCSAgICBwY21jaWFfcGFyc2VfdHVwbGUoaHdfcHJpdi0+bGluay0+aGFuZGxlLCAmdHVwbGUsIHBhcnNlKSB8fAorCSAgICBwYXJzZS0+bWFuZmlkLm1hbmYgIT0gMHhkNjAxIHx8IHBhcnNlLT5tYW5maWQuY2FyZCAhPSAweDAxMDEpIHsKKwkJLyogTm8gU2FuRGlzayBtYW5maWQgZm91bmQgKi8KKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9MT05HTElOS19NRkM7CisJaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaHdfcHJpdi0+bGluay0+aGFuZGxlLCAmdHVwbGUpIHx8CisJICAgIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShod19wcml2LT5saW5rLT5oYW5kbGUsICZ0dXBsZSkgfHwKKwkgICAgcGNtY2lhX3BhcnNlX3R1cGxlKGh3X3ByaXYtPmxpbmstPmhhbmRsZSwgJnR1cGxlLCBwYXJzZSkgfHwKKwkJcGFyc2UtPmxvbmdsaW5rX21mYy5uZm4gPCAyKSB7CisJCS8qIE5vIG11bHRpLWZ1bmN0aW9uIGxpbmtzIGZvdW5kICovCisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE11bHRpLWZ1bmN0aW9uIFNhbkRpc2sgQ29ubmVjdFBsdXMgZGV0ZWN0ZWQiCisJICAgICAgICIgLSB1c2luZyB2ZW5kb3Itc3BlY2lmaWMgaW5pdGlhbGl6YXRpb25cbiIsIGRldi0+bmFtZSk7CisJaHdfcHJpdi0+c2FuZGlza19jb25uZWN0cGx1cyA9IDE7CisKKwlyZWcuRnVuY3Rpb24gPSAwOworCXJlZy5BY3Rpb24gPSBDU19XUklURTsKKwlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKKwlyZWcuVmFsdWUgPSBDT1JfU09GVF9SRVNFVDsKKwlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluay0+aGFuZGxlLAorCQkJCQkJICAgJnJlZyk7CisJaWYgKHJlcyAhPSBDU19TVUNDRVNTKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2FuRGlzayAtIENPUiBzcmVzZXQgZmFpbGVkICglZClcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHJlcyk7CisJCWdvdG8gZG9uZTsKKwl9CisJbWRlbGF5KDUpOworCisJcmVnLkZ1bmN0aW9uID0gMDsKKwlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7CisJcmVnLk9mZnNldCA9IENJU1JFR19DT1I7CisJLyoKKwkgKiBEbyBub3QgZW5hYmxlIGludGVycnVwdHMgaGVyZSB0byBhdm9pZCBzb21lIGJvZ3VzIGV2ZW50cy4gSW50ZXJydXB0cworCSAqIHdpbGwgYmUgZW5hYmxlZCBkdXJpbmcgdGhlIGZpcnN0IGNvcl9zcmVzZXQgY2FsbC4KKwkgKi8KKwlyZWcuVmFsdWUgPSBDT1JfTEVWRUxfUkVRIHwgMHg4IHwgQ09SX0FERFJfREVDT0RFIHwgQ09SX0ZVTkNfRU5BOworCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLT5oYW5kbGUsCisJCQkJCQkgICAmcmVnKTsKKwlpZiAocmVzICE9IENTX1NVQ0NFU1MpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTYW5EaXNrIC0gQ09SIHNyZXNldCBmYWlsZWQgKCVkKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcmVzKTsKKwkJZ290byBkb25lOworCX0KKwltZGVsYXkoNSk7CisKKwlzYW5kaXNrX3NldF9pb2Jhc2UobG9jYWwpOworCisJSEZBMzg0WF9PVVRCKDB4YzUsIFNBTkRJU0tfV0xBTl9BQ1RJVkFUSU9OX09GRik7CisJdWRlbGF5KDEwKTsKKwlIRkEzODRYX09VVEIoMHg0YiwgU0FORElTS19XTEFOX0FDVElWQVRJT05fT0ZGKTsKKwl1ZGVsYXkoMTApOworCitkb25lOgorCWtmcmVlKHBhcnNlKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl9wY2NhcmRfY29yX3NyZXNldChsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCWludCByZXM7CisJY29uZl9yZWdfdCByZWc7CisJc3RydWN0IGhvc3RhcF9jc19wcml2ICpod19wcml2ID0gbG9jYWwtPmh3X3ByaXY7CisKKwlpZiAoIXByaXNtMl9wY2NhcmRfY2FyZF9wcmVzZW50KGxvY2FsKSkKKwkgICAgICAgcmV0dXJuOworCisJcmVnLkZ1bmN0aW9uID0gMDsKKwlyZWcuQWN0aW9uID0gQ1NfUkVBRDsKKwlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKKwlyZWcuVmFsdWUgPSAwOworCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLT5oYW5kbGUsCisJCQkJCQkgICAmcmVnKTsKKwlpZiAocmVzICE9IENTX1NVQ0NFU1MpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInByaXNtMl9wY2NhcmRfY29yX3NyZXNldCBmYWlsZWQgMSAoJWQpXG4iLAorCQkgICAgICAgcmVzKTsKKwkJcmV0dXJuOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAicHJpc20yX3BjY2FyZF9jb3Jfc3Jlc2V0OiBvcmlnaW5hbCBDT1IgJTAyeFxuIiwKKwkgICAgICAgcmVnLlZhbHVlKTsKKworCXJlZy5BY3Rpb24gPSBDU19XUklURTsKKwlyZWcuVmFsdWUgfD0gQ09SX1NPRlRfUkVTRVQ7CisJcmVzID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGh3X3ByaXYtPmxpbmstPmhhbmRsZSwKKwkJCQkJCSAgICZyZWcpOworCWlmIChyZXMgIT0gQ1NfU1VDQ0VTUykgeworCQlwcmludGsoS0VSTl9ERUJVRyAicHJpc20yX3BjY2FyZF9jb3Jfc3Jlc2V0IGZhaWxlZCAyICglZClcbiIsCisJCSAgICAgICByZXMpOworCQlyZXR1cm47CisJfQorCisJbWRlbGF5KGh3X3ByaXYtPnNhbmRpc2tfY29ubmVjdHBsdXMgPyA1IDogMik7CisKKwlyZWcuVmFsdWUgJj0gfkNPUl9TT0ZUX1JFU0VUOworCWlmIChod19wcml2LT5zYW5kaXNrX2Nvbm5lY3RwbHVzKQorCQlyZWcuVmFsdWUgfD0gQ09SX0lSRVFfRU5BOworCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLT5oYW5kbGUsCisJCQkJCQkgICAmcmVnKTsKKwlpZiAocmVzICE9IENTX1NVQ0NFU1MpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInByaXNtMl9wY2NhcmRfY29yX3NyZXNldCBmYWlsZWQgMyAoJWQpXG4iLAorCQkgICAgICAgcmVzKTsKKwkJcmV0dXJuOworCX0KKworCW1kZWxheShod19wcml2LT5zYW5kaXNrX2Nvbm5lY3RwbHVzID8gNSA6IDIpOworCisJaWYgKGh3X3ByaXYtPnNhbmRpc2tfY29ubmVjdHBsdXMpCisJCXNhbmRpc2tfc2V0X2lvYmFzZShsb2NhbCk7Cit9CisKKworc3RhdGljIHZvaWQgcHJpc20yX3BjY2FyZF9nZW5lc2lzX3Jlc2V0KGxvY2FsX2luZm9fdCAqbG9jYWwsIGludCBoY3IpCit7CisJaW50IHJlczsKKwljb25mX3JlZ190IHJlZzsKKwlpbnQgb2xkX2NvcjsKKwlzdHJ1Y3QgaG9zdGFwX2NzX3ByaXYgKmh3X3ByaXYgPSBsb2NhbC0+aHdfcHJpdjsKKworCWlmICghcHJpc20yX3BjY2FyZF9jYXJkX3ByZXNlbnQobG9jYWwpKQorCSAgICAgICByZXR1cm47CisKKwlpZiAoaHdfcHJpdi0+c2FuZGlza19jb25uZWN0cGx1cykgeworCQlzYW5kaXNrX3dyaXRlX2hjcihsb2NhbCwgaGNyKTsKKwkJcmV0dXJuOworCX0KKworCXJlZy5GdW5jdGlvbiA9IDA7CisJcmVnLkFjdGlvbiA9IENTX1JFQUQ7CisJcmVnLk9mZnNldCA9IENJU1JFR19DT1I7CisJcmVnLlZhbHVlID0gMDsKKwlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluay0+aGFuZGxlLAorCQkJCQkJICAgJnJlZyk7CisJaWYgKHJlcyAhPSBDU19TVUNDRVNTKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTJfcGNjYXJkX2dlbmVzaXNfc3Jlc2V0IGZhaWxlZCAxICIKKwkJICAgICAgICIoJWQpXG4iLCByZXMpOworCQlyZXR1cm47CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTJfcGNjYXJkX2dlbmVzaXNfc3Jlc2V0OiBvcmlnaW5hbCBDT1IgJTAyeFxuIiwKKwkgICAgICAgcmVnLlZhbHVlKTsKKwlvbGRfY29yID0gcmVnLlZhbHVlOworCisJcmVnLkFjdGlvbiA9IENTX1dSSVRFOworCXJlZy5WYWx1ZSB8PSBDT1JfU09GVF9SRVNFVDsKKwlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluay0+aGFuZGxlLAorCQkJCQkJICAgJnJlZyk7CisJaWYgKHJlcyAhPSBDU19TVUNDRVNTKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTJfcGNjYXJkX2dlbmVzaXNfc3Jlc2V0IGZhaWxlZCAyICIKKwkJICAgICAgICIoJWQpXG4iLCByZXMpOworCQlyZXR1cm47CisJfQorCisJbWRlbGF5KDEwKTsKKworCS8qIFNldHVwIEdlbmVzaXMgbW9kZSAqLworCXJlZy5BY3Rpb24gPSBDU19XUklURTsKKwlyZWcuVmFsdWUgPSBoY3I7CisJcmVnLk9mZnNldCA9IENJU1JFR19DQ1NSOworCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLT5oYW5kbGUsCisJCQkJCQkgICAmcmVnKTsKKwlpZiAocmVzICE9IENTX1NVQ0NFU1MpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInByaXNtMl9wY2NhcmRfZ2VuZXNpc19zcmVzZXQgZmFpbGVkIDMgIgorCQkgICAgICAgIiglZClcbiIsIHJlcyk7CisJCXJldHVybjsKKwl9CisJbWRlbGF5KDEwKTsKKworCXJlZy5BY3Rpb24gPSBDU19XUklURTsKKwlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKKwlyZWcuVmFsdWUgPSBvbGRfY29yICYgfkNPUl9TT0ZUX1JFU0VUOworCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLT5oYW5kbGUsCisJCQkJCQkgICAmcmVnKTsKKwlpZiAocmVzICE9IENTX1NVQ0NFU1MpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInByaXNtMl9wY2NhcmRfZ2VuZXNpc19zcmVzZXQgZmFpbGVkIDQgIgorCQkgICAgICAgIiglZClcbiIsIHJlcyk7CisJCXJldHVybjsKKwl9CisKKwltZGVsYXkoMTApOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX3BjY2FyZF9kZXZfb3Blbihsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXN0cnVjdCBob3N0YXBfY3NfcHJpdiAqaHdfcHJpdiA9IGxvY2FsLT5od19wcml2OworCWh3X3ByaXYtPmxpbmstPm9wZW4rKzsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9wY2NhcmRfZGV2X2Nsb3NlKGxvY2FsX2luZm9fdCAqbG9jYWwpCit7CisJc3RydWN0IGhvc3RhcF9jc19wcml2ICpod19wcml2OworCisJaWYgKGxvY2FsID09IE5VTEwgfHwgbG9jYWwtPmh3X3ByaXYgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisJaHdfcHJpdiA9IGxvY2FsLT5od19wcml2OworCWlmIChod19wcml2LT5saW5rID09IE5VTEwpCisJCXJldHVybiAxOworCisJaWYgKCFod19wcml2LT5saW5rLT5vcGVuKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBwcmlzbTJfcGNjYXJkX2Rldl9jbG9zZSgpOiAiCisJCSAgICAgICAibGluayBub3Qgb3Blbj8hXG4iLCBsb2NhbC0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaHdfcHJpdi0+bGluay0+b3Blbi0tOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBwcmlzbTJfaGVscGVyX2Z1bmN0aW9ucyBwcmlzbTJfcGNjYXJkX2Z1bmNzID0KK3sKKwkuY2FyZF9wcmVzZW50CT0gcHJpc20yX3BjY2FyZF9jYXJkX3ByZXNlbnQsCisJLmNvcl9zcmVzZXQJPSBwcmlzbTJfcGNjYXJkX2Nvcl9zcmVzZXQsCisJLmRldl9vcGVuCT0gcHJpc20yX3BjY2FyZF9kZXZfb3BlbiwKKwkuZGV2X2Nsb3NlCT0gcHJpc20yX3BjY2FyZF9kZXZfY2xvc2UsCisJLmdlbmVzaXNfcmVzZXQJPSBwcmlzbTJfcGNjYXJkX2dlbmVzaXNfcmVzZXQsCisJLmh3X3R5cGUJPSBIT1NUQVBfSFdfUENDQVJELAorfTsKKworCisvKiBhbGxvY2F0ZSBsb2NhbCBkYXRhIGFuZCByZWdpc3RlciB3aXRoIENhcmRTZXJ2aWNlcworICogaW5pdGlhbGl6ZSBkZXZfbGluayBzdHJ1Y3R1cmUsIGJ1dCBkbyBub3QgY29uZmlndXJlIHRoZSBjYXJkIHlldCAqLworc3RhdGljIGRldl9saW5rX3QgKnByaXNtMl9hdHRhY2godm9pZCkKK3sKKwlkZXZfbGlua190ICpsaW5rOworCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworCWludCByZXQ7CisKKwlsaW5rID0ga21hbGxvYyhzaXplb2YoZGV2X2xpbmtfdCksIEdGUF9LRVJORUwpOworCWlmIChsaW5rID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KGxpbmssIDAsIHNpemVvZihkZXZfbGlua190KSk7CisKKwlQREVCVUcoREVCVUdfSFcsICIlczogc2V0dGluZyBWY2M9MzMgKGNvbnN0YW50KVxuIiwgZGV2X2luZm8pOworCWxpbmstPmNvbmYuVmNjID0gMzM7CisJbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisKKwkvKiByZWdpc3RlciB3aXRoIENhcmRTZXJ2aWNlcyAqLworCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKKwlkZXZfbGlzdCA9IGxpbms7CisJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKwljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKwlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwkJcHJpc20yX2RldGFjaChsaW5rKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBsaW5rOworfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKwlkZXZfbGlua190ICoqbGlua3A7CisKKwlQREVCVUcoREVCVUdfRkxPVywgInByaXNtMl9kZXRhY2hcbiIpOworCisJZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwkJaWYgKCpsaW5rcCA9PSBsaW5rKQorCQkJYnJlYWs7CisJaWYgKCpsaW5rcCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBdHRlbXB0IHRvIGRldGFjaCBub24tZXhpc3RpbmcgIgorCQkgICAgICAgIlBDTUNJQSBjbGllbnRcbiIsIGRldl9pbmZvKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJcHJpc20yX3JlbGVhc2UoKHVfbG9uZylsaW5rKTsKKwl9CisKKwlpZiAobGluay0+aGFuZGxlKSB7CisJCWludCByZXMgPSBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKwkJaWYgKHJlcykgeworCQkJcHJpbnRrKCJDYXJkU2VydmljZShEZXJlZ2lzdGVyQ2xpZW50KSA9PiAlZFxuIiwgcmVzKTsKKwkJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgRGVyZWdpc3RlckNsaWVudCwgcmVzKTsKKwkJfQorCX0KKworCSpsaW5rcCA9IGxpbmstPm5leHQ7CisJLyogcmVsZWFzZSBuZXQgZGV2aWNlcyAqLworCWlmIChsaW5rLT5wcml2KSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwkJZGV2ID0gbGluay0+cHJpdjsKKwkJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCQlrZnJlZShpZmFjZS0+bG9jYWwtPmh3X3ByaXYpOworCQlpZmFjZS0+bG9jYWwtPmh3X3ByaXYgPSBOVUxMOworCQlwcmlzbTJfZnJlZV9sb2NhbF9kYXRhKGRldik7CisJfQorCWtmcmVlKGxpbmspOworfQorCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBDRkdfQ0hFQ0syKGZuLCByZXRmKSBcCitkbyB7IGludCByZXQgPSAocmV0Zik7IFwKK2lmIChyZXQgIT0gMCkgeyBcCisJUERFQlVHKERFQlVHX0VYVFJBLCAiQ2FyZFNlcnZpY2VzKCIgI2ZuICIpIHJldHVybmVkICVkXG4iLCByZXQpOyBcCisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBmbiwgcmV0KTsgXAorCWdvdG8gbmV4dF9lbnRyeTsgXAorfSBcCit9IHdoaWxlICgwKQorCisKKy8qIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50IGlzIHJlY2VpdmVkIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBCisgKiBzb2NrZXQgYW5kIG1ha2UgdGhlIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbSAqLworc3RhdGljIGludCBwcmlzbTJfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgcmV0ID0gMTsKKwl0dXBsZV90IHR1cGxlOworCWNpc3BhcnNlX3QgKnBhcnNlOworCWludCBsYXN0X2ZuLCBsYXN0X3JldDsKKwl1X2NoYXIgYnVmWzY0XTsKKwljb25maWdfaW5mb190IGNvbmY7CisJY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0ID0geyAwIH07CisJc3RydWN0IGhvc3RhcF9jc19wcml2ICpod19wcml2OworCisJUERFQlVHKERFQlVHX0ZMT1csICJwcmlzbTJfY29uZmlnKClcbiIpOworCisJcGFyc2UgPSBrbWFsbG9jKHNpemVvZihjaXNwYXJzZV90KSwgR0ZQX0tFUk5FTCk7CisJaHdfcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpod19wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBhcnNlID09IE5VTEwgfHwgaHdfcHJpdiA9PSBOVUxMKSB7CisJCWtmcmVlKHBhcnNlKTsKKwkJa2ZyZWUoaHdfcHJpdik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkOworCX0KKwltZW1zZXQoaHdfcHJpdiwgMCwgc2l6ZW9mKCpod19wcml2KSk7CisKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOworCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKwl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKwl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLT5oYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmstPmhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmstPmhhbmRsZSwgJnR1cGxlLCBwYXJzZSkpOworCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLT5jb25maWcuYmFzZTsKKwlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS0+Y29uZmlnLnJtYXNrWzBdOworCisJQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sCisJCSBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhsaW5rLT5oYW5kbGUsICZjb25mKSk7CisJUERFQlVHKERFQlVHX0hXLCAiJXM6ICVzIFZjYz0lZCAoZnJvbSBjb25maWcpXG4iLCBkZXZfaW5mbywKKwkgICAgICAgaWdub3JlX2Npc192Y2MgPyAiaWdub3JpbmciIDogInNldHRpbmciLCBjb25mLlZjYyk7CisJbGluay0+Y29uZi5WY2MgPSBjb25mLlZjYzsKKworCS8qIExvb2sgZm9yIGFuIGFwcHJvcHJpYXRlIGNvbmZpZ3VyYXRpb24gdGFibGUgZW50cnkgaW4gdGhlIENJUyAqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluay0+aGFuZGxlLCAmdHVwbGUpKTsKKwlmb3IgKDs7KSB7CisJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UtPmNmdGFibGVfZW50cnkpOworCQlDRkdfQ0hFQ0syKEdldFR1cGxlRGF0YSwKKwkJCSAgIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLT5oYW5kbGUsICZ0dXBsZSkpOworCQlDRkdfQ0hFQ0syKFBhcnNlVHVwbGUsCisJCQkgICBwY21jaWFfcGFyc2VfdHVwbGUobGluay0+aGFuZGxlLCAmdHVwbGUsIHBhcnNlKSk7CisKKwkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUKQorCQkJZGZsdCA9ICpjZmc7CisJCWlmIChjZmctPmluZGV4ID09IDApCisJCQlnb3RvIG5leHRfZW50cnk7CisJCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OworCQlQREVCVUcoREVCVUdfRVhUUkEsICJDaGVja2luZyBDRlRBQkxFX0VOVFJZIDB4JTAyWCAiCisJCSAgICAgICAiKGRlZmF1bHQgMHglMDJYKVxuIiwgY2ZnLT5pbmRleCwgZGZsdC5pbmRleCk7CisKKwkJLyogRG9lcyB0aGlzIGNhcmQgbmVlZCBhdWRpbyBvdXRwdXQ/ICovCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfQVVESU8pIHsKKwkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOworCQkJbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKKwkJfQorCisJCS8qIFVzZSBwb3dlciBzZXR0aW5ncyBmb3IgVmNjIGFuZCBWcHAgaWYgcHJlc2VudCAqLworCQkvKiAgTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KKwkJaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJCWlmIChjb25mLlZjYyAhPSBjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLworCQkJICAgIDEwMDAwICYmICFpZ25vcmVfY2lzX3ZjYykgeworCQkJCVBERUJVRyhERUJVR19FWFRSQSwgIiAgVmNjIG1pc21hdGNoIC0gc2tpcHBpbmciCisJCQkJICAgICAgICIgdGhpcyBlbnRyeVxuIik7CisJCQkJZ290byBuZXh0X2VudHJ5OworCQkJfQorCQl9IGVsc2UgaWYgKGRmbHQudmNjLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJCWlmIChjb25mLlZjYyAhPSBkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLworCQkJICAgIDEwMDAwICYmICFpZ25vcmVfY2lzX3ZjYykgeworCQkJCVBERUJVRyhERUJVR19FWFRSQSwgIiAgVmNjIChkZWZhdWx0KSBtaXNtYXRjaCAiCisJCQkJICAgICAgICItIHNraXBwaW5nIHRoaXMgZW50cnlcbiIpOworCQkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJCX0KKwkJfQorCisJCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkJY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCQllbHNlIGlmIChkZmx0LnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkJZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCisJCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLworCQlpZiAoY2ZnLT5pcnEuSVJRSW5mbzEgfHwgZGZsdC5pcnEuSVJRSW5mbzEpCisJCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCQllbHNlIGlmICghKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkpIHsKKwkJCS8qIEF0IGxlYXN0IENvbXBhcSBXTDIwMCBkb2VzIG5vdCBoYXZlIElSUUluZm8xIHNldCwKKwkJCSAqIGJ1dCBpdCBkb2VzIG5vdCB3b3JrIHdpdGhvdXQgaW50ZXJydXB0cy4uICovCisJCQlwcmludGsoIkNvbmZpZyBoYXMgbm8gSVJRIGluZm8sIGJ1dCB0cnlpbmcgdG8gZW5hYmxlICIKKwkJCSAgICAgICAiSVJRIGFueXdheS4uXG4iKTsKKwkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisJCX0KKworCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KKwkJUERFQlVHKERFQlVHX0VYVFJBLCAiSU8gd2luZG93IHNldHRpbmdzOiBjZmctPmlvLm53aW49JWQgIgorCQkgICAgICAgImRmbHQuaW8ubndpbj0lZFxuIiwKKwkJICAgICAgIGNmZy0+aW8ubndpbiwgZGZsdC5pby5ud2luKTsKKwkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKKwkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKKwkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKKwkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJCQlQREVCVUcoREVCVUdfRVhUUkEsICJpby0+ZmxhZ3MgPSAweCUwNFgsICIKKwkJCSAgICAgICAiaW8uYmFzZT0weCUwNHgsIGxlbj0lZFxuIiwgaW8tPmZsYWdzLAorCQkJICAgICAgIGlvLT53aW5bMF0uYmFzZSwgaW8tPndpblswXS5sZW4pOworCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCQkJbGluay0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJgorCQkJCUNJU1RQTF9JT19MSU5FU19NQVNLOworCQkJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOworCQkJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCQlpZiAoaW8tPm53aW4gPiAxKSB7CisJCQkJbGluay0+aW8uQXR0cmlidXRlczIgPSBsaW5rLT5pby5BdHRyaWJ1dGVzMTsKKwkJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7CisJCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47CisJCQl9CisJCX0KKworCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLworCQlDRkdfQ0hFQ0syKFJlcXVlc3RJTywKKwkJCSAgIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSk7CisKKwkJLyogVGhpcyBjb25maWd1cmF0aW9uIHRhYmxlIGVudHJ5IGlzIE9LICovCisJCWJyZWFrOworCisJbmV4dF9lbnRyeToKKwkJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLAorCQkJIHBjbWNpYV9nZXRfbmV4dF90dXBsZShsaW5rLT5oYW5kbGUsICZ0dXBsZSkpOworCX0KKworCS8qIE5lZWQgdG8gYWxsb2NhdGUgbmV0X2RldmljZSBiZWZvcmUgcmVxdWVzdGluZyBJUlEgaGFuZGxlciAqLworCWRldiA9IHByaXNtMl9pbml0X2xvY2FsX2RhdGEoJnByaXNtMl9wY2NhcmRfZnVuY3MsIDAsCisJCQkJICAgICAmaGFuZGxlX3RvX2RldihsaW5rLT5oYW5kbGUpKTsKKwlpZiAoZGV2ID09IE5VTEwpCisJCWdvdG8gZmFpbGVkOworCWxpbmstPnByaXYgPSBkZXY7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisJbG9jYWwtPmh3X3ByaXYgPSBod19wcml2OworCWh3X3ByaXYtPmxpbmsgPSBsaW5rOworCXN0cmNweShod19wcml2LT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworCWxpbmstPmRldiA9ICZod19wcml2LT5ub2RlOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFzc2lnbiBhCisJICogaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LCB1bmxlc3MgdGhlICdIYW5kbGVyJyBtZW1iZXIgb2YgdGhlCisJICogaXJxIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4KKwkgKi8KKwlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKSB7CisJCWxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworCQlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisJCWxpbmstPmlycS5IYW5kbGVyID0gcHJpc20yX2ludGVycnVwdDsKKwkJbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworCQlDU19DSEVDSyhSZXF1ZXN0SVJRLAorCQkJIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKwl9CisKKwkvKgorCSAqIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisJICogdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcsIGFuZCBwdXR0aW5nIHRoZQorCSAqIGNhcmQgYW5kIGhvc3QgaW50ZXJmYWNlIGludG8gIk1lbW9yeSBhbmQgSU8iIG1vZGUuCisJICovCisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sCisJCSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworCWRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworCWRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworCisJLyogRmluYWxseSwgcmVwb3J0IHdoYXQgd2UndmUgZG9uZSAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbmRleCAweCUwMng6IFZjYyAlZC4lZCIsCisJICAgICAgIGRldl9pbmZvLCBsaW5rLT5jb25mLkNvbmZpZ0luZGV4LAorCSAgICAgICBsaW5rLT5jb25mLlZjYyAvIDEwLCBsaW5rLT5jb25mLlZjYyAlIDEwKTsKKwlpZiAobGluay0+Y29uZi5WcHAxKQorCQlwcmludGsoIiwgVnBwICVkLiVkIiwgbGluay0+Y29uZi5WcHAxIC8gMTAsCisJCSAgICAgICBsaW5rLT5jb25mLlZwcDEgJSAxMCk7CisJaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKKwkJcHJpbnRrKCIsIGlycSAlZCIsIGxpbmstPmlycS5Bc3NpZ25lZElSUSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkJcHJpbnRrKCIsIGlvIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDEsCisJCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDErbGluay0+aW8uTnVtUG9ydHMxLTEpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czIpCisJCXByaW50aygiICYgMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MiwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MitsaW5rLT5pby5OdW1Qb3J0czItMSk7CisJcHJpbnRrKCJcbiIpOworCisJbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworCisJbG9jYWwtPnNodXRkb3duID0gMDsKKworCXNhbmRpc2tfZW5hYmxlX3dpcmVsZXNzKGRldik7CisKKwlyZXQgPSBwcmlzbTJfaHdfY29uZmlnKGRldiwgMSk7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gaG9zdGFwX2h3X3JlYWR5KGRldik7CisJCWlmIChyZXQgPT0gMCAmJiBsb2NhbC0+ZGRldikKKwkJCXN0cmNweShod19wcml2LT5ub2RlLmRldl9uYW1lLCBsb2NhbC0+ZGRldi0+bmFtZSk7CisJfQorCWtmcmVlKHBhcnNlKTsKKwlyZXR1cm4gcmV0OworCisgY3NfZmFpbGVkOgorCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworCisgZmFpbGVkOgorCWtmcmVlKHBhcnNlKTsKKwlrZnJlZShod19wcml2KTsKKwlwcmlzbTJfcmVsZWFzZSgodV9sb25nKWxpbmspOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQgcHJpc20yX3JlbGVhc2UodV9sb25nIGFyZykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gKGRldl9saW5rX3QgKilhcmc7CisKKwlQREVCVUcoREVCVUdfRkxPVywgInByaXNtMl9yZWxlYXNlXG4iKTsKKworCWlmIChsaW5rLT5wcml2KSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCQlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisKKwkJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQkJcHJpc20yX2h3X3NodXRkb3duKGRldiwgMCk7CisJCWlmYWNlLT5sb2NhbC0+c2h1dGRvd24gPSAxOworCX0KKworCWlmIChsaW5rLT53aW4pCisJCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxKQorCQlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJaWYgKGxpbmstPmlycS5Bc3NpZ25lZElSUSkKKwkJcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKKworCVBERUJVRyhERUJVR19GTE9XLCAicmVsZWFzZSAtIGRvbmVcbiIpOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCWV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBsaW5rLT5wcml2OworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJCVBERUJVRyhERUJVR19FWFRSQSwgIiVzOiBDU19FVkVOVF9DQVJEX0lOU0VSVElPTlxuIiwgZGV2X2luZm8pOworCQlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwkJaWYgKHByaXNtMl9jb25maWcobGluaykpIHsKKwkJCVBERUJVRyhERUJVR19FWFRSQSwgInByaXNtMl9jb25maWcoKSBmYWlsZWRcbiIpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCVBERUJVRyhERUJVR19FWFRSQSwgIiVzOiBDU19FVkVOVF9DQVJEX1JFTU9WQUxcbiIsIGRldl9pbmZvKTsKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCQlwcmlzbTJfcmVsZWFzZSgodV9sb25nKSBsaW5rKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJUERFQlVHKERFQlVHX0VYVFJBLCAiJXM6IENTX0VWRU5UX1BNX1NVU1BFTkRcbiIsIGRldl9pbmZvKTsKKwkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkJUERFQlVHKERFQlVHX0VYVFJBLCAiJXM6IENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMXG4iLCBkZXZfaW5mbyk7CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCWlmIChsaW5rLT5vcGVuKSB7CisJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCX0KKwkJCXByaXNtMl9zdXNwZW5kKGRldik7CisJCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwkJUERFQlVHKERFQlVHX0VYVFJBLCAiJXM6IENTX0VWRU5UX1BNX1JFU1VNRVxuIiwgZGV2X2luZm8pOworCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCQlQREVCVUcoREVCVUdfRVhUUkEsICIlczogQ1NfRVZFTlRfQ0FSRF9SRVNFVFxuIiwgZGV2X2luZm8pOworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQlwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwKKwkJCQkJCSAgICAgJmxpbmstPmNvbmYpOworCQkJcHJpc20yX2h3X3NodXRkb3duKGRldiwgMSk7CisJCQlwcmlzbTJfaHdfY29uZmlnKGRldiwgbGluay0+b3BlbiA/IDAgOiAxKTsKKwkJCWlmIChsaW5rLT5vcGVuKSB7CisJCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQREVCVUcoREVCVUdfRVhUUkEsICIlczogcHJpc20yX2V2ZW50KCkgLSB1bmtub3duIGV2ZW50ICVkXG4iLAorCQkgICAgICAgZGV2X2luZm8sIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBob3N0YXBfY3NfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDBiLCAweDcxMDApLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAwYiwgMHg3MzAwKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMDEsIDB4MDc3NyksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTI2LCAweDgwMDApLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEzOCwgMHgwMDAyKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNTYsIDB4MDAwMiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjUwLCAweDAwMDIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI2ZiwgMHgwMzBiKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNzQsIDB4MTYxMiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjc0LCAweDE2MTMpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI4YSwgMHgwMDAyKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyYWEsIDB4MDAwMiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMmQyLCAweDAwMDEpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4NTBjMiwgMHgwMDAxKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDUwYzIsIDB4NzMwMCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhjMDBmLCAweDAwMDApLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4ZDYwMSwgMHgwMDAyKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweGQ2MDEsIDB4MDAwNSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhkNjAxLCAweDAwMTApLAorCVBDTUNJQV9NRkNfREVWSUNFX1BST0RfSUQxMigwLCAiU2FuRGlzayIsICJDb25uZWN0UGx1cyIsCisJCQkJICAgIDB4N2E5NTRiZDksIDB4NzRiZTAwYzYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoCisJCSJJbnRlcnNpbCIsICJQUklTTSAyXzUgUENNQ0lBIEFEQVBURVIiLAkiSVNMMzczMDBQIiwKKwkJIkV2YWwtUmV2QSIsCisJCTB4NGI4MDFhMTcsIDB4NjM0NWEwYmYsIDB4YzkwNDlhMzksIDB4YzIzYWRjMGUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygKKwkJIkFkZHRyb24iLCAiQVdQLTEwMCBXaXJlbGVzcyBQQ01DSUEiLCAiVmVyc2lvbiAwMS4wMiIsCisJCTB4ZTZlYzUyY2UsIDB4MDg2NDlhZjIsIDB4NGI3NGJhYTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygKKwkJIkQiLCAiTGluayBEV0wtNjUwIDExTWJwcyBXTEFOIENhcmQiLCAiVmVyc2lvbiAwMS4wMiIsCisJCTB4NzFiMTg1ODksIDB4YjZmMWIwYWIsIDB4NGI3NGJhYTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygKKwkJIkluc3RhbnQgV2lyZWxlc3MgIiwgIiBOZXR3b3JrIFBDIENBUkQiLCAiVmVyc2lvbiAwMS4wMiIsCisJCTB4MTFkOTAxYWYsIDB4NmU5YmQ5MjYsIDB4NGI3NGJhYTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygKKwkJIlNNQyIsICJTTUMyNjMyVyIsICJWZXJzaW9uIDAxLjAyIiwKKwkJMHhjNGY4YjE4YiwgMHg0NzRhMWYyYSwgMHg0Yjc0YmFhMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkJVRkZBTE8iLCAiV0xJLUNGLVMxMUciLCAKKwkJCQkweDJkZWNlY2UzLCAweDgyMDY3YzE4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ29tcGFxIiwgIldMMjAwXzExTWJwc19XaXJlbGVzc19QQ0lfQ2FyZCIsCisJCQkJMHg1NGY3YzQ5YywgMHgxNWE3NWU1YiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklOVEVSU0lMIiwgIkhGQTM4NHgvSUVFRSIsCisJCQkJMHg3NGM1ZTQwZCwgMHhkYjQ3MmExOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxpbmtzeXMiLCAiV2lyZWxlc3MgQ29tcGFjdEZsYXNoIENhcmQiLAorCQkJCTB4MDczM2NjODEsIDB4MGM1MmYzOTUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKAorCQkiWm9vbUFpciAxMU1icHMgSGlnaCIsICJSYXRlIHdpcmVsZXNzIE5ldHdvcmtpbmciLAorCQkweDI3M2ZlM2RiLCAweDMyYTFlYWVlKSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgaG9zdGFwX2NzX2lkcyk7CisKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGhvc3RhcF9kcml2ZXIgPSB7CisJLmRydgkJPSB7CisJCS5uYW1lCT0gImhvc3RhcF9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IHByaXNtMl9hdHRhY2gsCisJLmRldGFjaAkJPSBwcmlzbTJfZGV0YWNoLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZXZlbnQJCT0gcHJpc20yX2V2ZW50LAorCS5pZF90YWJsZQk9IGhvc3RhcF9jc19pZHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3ByaXNtMl9wY2NhcmQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXNcbiIsIGRldl9pbmZvLCB2ZXJzaW9uKTsKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmaG9zdGFwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3ByaXNtMl9wY2NhcmQodm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJmhvc3RhcF9kcml2ZXIpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBEcml2ZXIgdW5sb2FkZWRcbiIsIGRldl9pbmZvKTsKK30KKworCittb2R1bGVfaW5pdChpbml0X3ByaXNtMl9wY2NhcmQpOworbW9kdWxlX2V4aXQoZXhpdF9wcmlzbTJfcGNjYXJkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfZG93bmxvYWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfZG93bmxvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjI2YjUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9kb3dubG9hZC5jCkBAIC0wLDAgKzEsNzY2IEBACitzdGF0aWMgaW50IHByaXNtMl9lbmFibGVfYXV4X3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGVuYWJsZSkKK3sKKwl1MTYgdmFsLCByZWc7CisJaW50IGksIHRyaWVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAobG9jYWwtPm5vX3ByaSkgeworCQlpZiAoZW5hYmxlKSB7CisJCQlQREVCVUcoREVCVUdfRVhUUkEyLCAiJXM6IG5vIFBSSSBmL3cgLSBhc3N1bWluZyBBdXggIgorCQkJICAgICAgICJwb3J0IGlzIGFscmVhZHkgZW5hYmxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPmNtZGxvY2ssIGZsYWdzKTsKKworCS8qIHdhaXQgdW50aWwgYnVzeSBiaXQgaXMgY2xlYXIgKi8KKwl0cmllcyA9IEhGQTM4NFhfQ01EX0JVU1lfVElNRU9VVDsKKwl3aGlsZSAoSEZBMzg0WF9JTlcoSEZBMzg0WF9DTURfT0ZGKSAmIEhGQTM4NFhfQ01EX0JVU1kgJiYgdHJpZXMgPiAwKSB7CisJCXRyaWVzLS07CisJCXVkZWxheSgxKTsKKwl9CisJaWYgKHRyaWVzID09IDApIHsKKwkJcmVnID0gSEZBMzg0WF9JTlcoSEZBMzg0WF9DTURfT0ZGKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmNtZGxvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKCIlczogcHJpc20yX2VuYWJsZV9hdXhfcG9ydCAtIHRpbWVvdXQgLSByZWc9MHglMDR4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCByZWcpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwl2YWwgPSBIRkEzODRYX0lOVyhIRkEzODRYX0NPTlRST0xfT0ZGKTsKKworCWlmIChlbmFibGUpIHsKKwkJSEZBMzg0WF9PVVRXKEhGQTM4NFhfQVVYX01BR0lDMCwgSEZBMzg0WF9QQVJBTTBfT0ZGKTsKKwkJSEZBMzg0WF9PVVRXKEhGQTM4NFhfQVVYX01BR0lDMSwgSEZBMzg0WF9QQVJBTTFfT0ZGKTsKKwkJSEZBMzg0WF9PVVRXKEhGQTM4NFhfQVVYX01BR0lDMiwgSEZBMzg0WF9QQVJBTTJfT0ZGKTsKKworCQlpZiAoKHZhbCAmIEhGQTM4NFhfQVVYX1BPUlRfTUFTSykgIT0gSEZBMzg0WF9BVVhfUE9SVF9ESVNBQkxFRCkKKwkJCXByaW50aygicHJpc20yX2VuYWJsZV9hdXhfcG9ydDogd2FzIG5vdCBkaXNhYmxlZCE/XG4iKTsKKwkJdmFsICY9IH5IRkEzODRYX0FVWF9QT1JUX01BU0s7CisJCXZhbCB8PSBIRkEzODRYX0FVWF9QT1JUX0VOQUJMRTsKKwl9IGVsc2UgeworCQlIRkEzODRYX09VVFcoMCwgSEZBMzg0WF9QQVJBTTBfT0ZGKTsKKwkJSEZBMzg0WF9PVVRXKDAsIEhGQTM4NFhfUEFSQU0xX09GRik7CisJCUhGQTM4NFhfT1VUVygwLCBIRkEzODRYX1BBUkFNMl9PRkYpOworCisJCWlmICgodmFsICYgSEZBMzg0WF9BVVhfUE9SVF9NQVNLKSAhPSBIRkEzODRYX0FVWF9QT1JUX0VOQUJMRUQpCisJCQlwcmludGsoInByaXNtMl9lbmFibGVfYXV4X3BvcnQ6IHdhcyBub3QgZW5hYmxlZCE/XG4iKTsKKwkJdmFsICY9IH5IRkEzODRYX0FVWF9QT1JUX01BU0s7CisJCXZhbCB8PSBIRkEzODRYX0FVWF9QT1JUX0RJU0FCTEU7CisJfQorCUhGQTM4NFhfT1VUVyh2YWwsIEhGQTM4NFhfQ09OVFJPTF9PRkYpOworCisJdWRlbGF5KDUpOworCisJaSA9IDEwMDAwOworCXdoaWxlIChpID4gMCkgeworCQl2YWwgPSBIRkEzODRYX0lOVyhIRkEzODRYX0NPTlRST0xfT0ZGKTsKKwkJdmFsICY9IEhGQTM4NFhfQVVYX1BPUlRfTUFTSzsKKworCQlpZiAoKGVuYWJsZSAmJiB2YWwgPT0gSEZBMzg0WF9BVVhfUE9SVF9FTkFCTEVEKSB8fAorCQkgICAgKCFlbmFibGUgJiYgdmFsID09IEhGQTM4NFhfQVVYX1BPUlRfRElTQUJMRUQpKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwkJaS0tOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5jbWRsb2NrLCBmbGFncyk7CisKKwlpZiAoaSA9PSAwKSB7CisJCXByaW50aygicHJpc20yX2VuYWJsZV9hdXhfcG9ydCglZCkgdGltZWQgb3V0XG4iLAorCQkgICAgICAgZW5hYmxlKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBoZmEzODR4X2Zyb21fYXV4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhZGRyLCBpbnQgbGVuLAorCQkJICAgIHZvaWQgKmJ1ZikKK3sKKwl1MTYgcGFnZSwgb2Zmc2V0OworCWlmIChhZGRyICYgMSB8fCBsZW4gJiAxKQorCQlyZXR1cm4gLTE7CisKKwlwYWdlID0gYWRkciA+PiA3OworCW9mZnNldCA9IGFkZHIgJiAweDdmOworCisJSEZBMzg0WF9PVVRXKHBhZ2UsIEhGQTM4NFhfQVVYUEFHRV9PRkYpOworCUhGQTM4NFhfT1VUVyhvZmZzZXQsIEhGQTM4NFhfQVVYT0ZGU0VUX09GRik7CisKKwl1ZGVsYXkoNSk7CisKKyNpZmRlZiBQUklTTTJfUENJCisJeworCQl1MTYgKnBvcyA9ICh1MTYgKikgYnVmOworCQl3aGlsZSAobGVuID4gMCkgeworCQkJKnBvcysrID0gSEZBMzg0WF9JTldfREFUQShIRkEzODRYX0FVWERBVEFfT0ZGKTsKKwkJCWxlbiAtPSAyOworCQl9CisJfQorI2Vsc2UgLyogUFJJU00yX1BDSSAqLworCUhGQTM4NFhfSU5TVyhIRkEzODRYX0FVWERBVEFfT0ZGLCBidWYsIGxlbiAvIDIpOworI2VuZGlmIC8qIFBSSVNNMl9QQ0kgKi8KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaGZhMzg0eF90b19hdXgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFkZHIsIGludCBsZW4sCisJCQkgIHZvaWQgKmJ1ZikKK3sKKwl1MTYgcGFnZSwgb2Zmc2V0OworCWlmIChhZGRyICYgMSB8fCBsZW4gJiAxKQorCQlyZXR1cm4gLTE7CisKKwlwYWdlID0gYWRkciA+PiA3OworCW9mZnNldCA9IGFkZHIgJiAweDdmOworCisJSEZBMzg0WF9PVVRXKHBhZ2UsIEhGQTM4NFhfQVVYUEFHRV9PRkYpOworCUhGQTM4NFhfT1VUVyhvZmZzZXQsIEhGQTM4NFhfQVVYT0ZGU0VUX09GRik7CisKKwl1ZGVsYXkoNSk7CisKKyNpZmRlZiBQUklTTTJfUENJCisJeworCQl1MTYgKnBvcyA9ICh1MTYgKikgYnVmOworCQl3aGlsZSAobGVuID4gMCkgeworCQkJSEZBMzg0WF9PVVRXX0RBVEEoKnBvcysrLCBIRkEzODRYX0FVWERBVEFfT0ZGKTsKKwkJCWxlbiAtPSAyOworCQl9CisJfQorI2Vsc2UgLyogUFJJU00yX1BDSSAqLworCUhGQTM4NFhfT1VUU1coSEZBMzg0WF9BVVhEQVRBX09GRiwgYnVmLCBsZW4gLyAyKTsKKyNlbmRpZiAvKiBQUklTTTJfUENJICovCisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9wZGFfb2sodTggKmJ1ZikKK3sKKwl1MTYgKnBkYSA9ICh1MTYgKikgYnVmOworCWludCBwb3M7CisJdTE2IGxlbiwgcGRyOworCisJaWYgKGJ1ZlswXSA9PSAweGZmICYmIGJ1ZlsxXSA9PSAweDAwICYmIGJ1ZlsyXSA9PSAweGZmICYmCisJICAgIGJ1ZlszXSA9PSAweDAwKQorCQlyZXR1cm4gMDsKKworCXBvcyA9IDA7CisJd2hpbGUgKHBvcyArIDEgPCBQUklTTTJfUERBX1NJWkUgLyAyKSB7CisJCWxlbiA9IGxlMTZfdG9fY3B1KHBkYVtwb3NdKTsKKwkJcGRyID0gbGUxNl90b19jcHUocGRhW3BvcyArIDFdKTsKKwkJaWYgKGxlbiA9PSAwIHx8IHBvcyArIGxlbiA+IFBSSVNNMl9QREFfU0laRSAvIDIpCisJCQlyZXR1cm4gMDsKKworCQlpZiAocGRyID09IDB4MDAwMCAmJiBsZW4gPT0gMikgeworCQkJLyogUERBIGVuZCBmb3VuZCAqLworCQkJcmV0dXJuIDE7CisJCX0KKworCQlwb3MgKz0gbGVuICsgMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9kb3dubG9hZF9hdXhfZHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgdW5zaWduZWQgaW50IGFkZHIsIGludCBsZW4sIHU4ICpidWYpCit7CisJaW50IHJlczsKKworCXByaXNtMl9lbmFibGVfYXV4X3BvcnQoZGV2LCAxKTsKKwlyZXMgPSBoZmEzODR4X2Zyb21fYXV4KGRldiwgYWRkciwgbGVuLCBidWYpOworCXByaXNtMl9lbmFibGVfYXV4X3BvcnQoZGV2LCAwKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdTggKiBwcmlzbTJfcmVhZF9wZGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCAqYnVmOworCWludCByZXMsIGksIGZvdW5kID0gMDsKKyNkZWZpbmUgTlVNX1BEQV9BRERSUyA0CisJdW5zaWduZWQgaW50IHBkYV9hZGRyW05VTV9QREFfQUREUlNdID0geworCQkweDdmMDAwMCAvKiBvdGhlcnMgdGhhbiBIRkEzODQxICovLAorCQkweDNmMDAwMCAvKiBIRkEzODQxICovLAorCQkweDM5MDAwMCAvKiBhcHBhcmVudGx5IHVzZWQgaW4gb2xkZXIgY2FyZHMgKi8sCisJCTB4N2YwMDAyIC8qIEludGVsIFBSTy9XaXJlbGVzcyAyMDExQiAoUENJKSAqLywKKwl9OworCisJYnVmID0gKHU4ICopIGttYWxsb2MoUFJJU00yX1BEQV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogTm90ZTogd2xhbiBjYXJkIHNob3VsZCBiZSBpbiBpbml0aWFsIHN0YXRlIChqdXN0IGFmdGVyIGluaXQgY21kKQorCSAqIGFuZCBubyBvdGhlciBvcGVyYXRpb25zIHNob3VsZCBiZSBwZXJmb3JtZWQgY29uY3VycmVudGx5LiAqLworCisJcHJpc20yX2VuYWJsZV9hdXhfcG9ydChkZXYsIDEpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9QREFfQUREUlM7IGkrKykgeworCQlQREVCVUcoREVCVUdfRVhUUkEyLCAiJXM6IHRyeWluZyB0byByZWFkIFBEQSBmcm9tIDB4JTA4eCIsCisJCSAgICAgICBkZXYtPm5hbWUsIHBkYV9hZGRyW2ldKTsKKwkJcmVzID0gaGZhMzg0eF9mcm9tX2F1eChkZXYsIHBkYV9hZGRyW2ldLCBQUklTTTJfUERBX1NJWkUsIGJ1Zik7CisJCWlmIChyZXMpCisJCQljb250aW51ZTsKKwkJaWYgKHJlcyA9PSAwICYmIHByaXNtMl9wZGFfb2soYnVmKSkgeworCQkJUERFQlVHMihERUJVR19FWFRSQTIsICI6IE9LXG4iKTsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJUERFQlVHMihERUJVR19FWFRSQTIsICI6IGZhaWxlZFxuIik7CisJCX0KKwl9CisKKwlwcmlzbTJfZW5hYmxlX2F1eF9wb3J0KGRldiwgMCk7CisKKwlpZiAoIWZvdW5kKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdmFsaWQgUERBIG5vdCBmb3VuZFxuIiwgZGV2LT5uYW1lKTsKKwkJa2ZyZWUoYnVmKTsKKwkJYnVmID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2Rvd25sb2FkX3ZvbGF0aWxlKGxvY2FsX2luZm9fdCAqbG9jYWwsCisJCQkJICAgIHN0cnVjdCBwcmlzbTJfZG93bmxvYWRfZGF0YSAqcGFyYW0pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CisJaW50IHJldCA9IDAsIGk7CisJdTE2IHBhcmFtMCwgcGFyYW0xOworCisJaWYgKGxvY2FsLT5od19kb3dubG9hZGluZykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWxyZWFkeSBkb3dubG9hZGluZyAtIGFib3J0aW5nIG5ldyAiCisJCSAgICAgICAicmVxdWVzdFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWxvY2FsLT5od19kb3dubG9hZGluZyA9IDE7CisJaWYgKGxvY2FsLT5wcmlfb25seSkgeworCQloZmEzODR4X2Rpc2FibGVfaW50ZXJydXB0cyhkZXYpOworCX0gZWxzZSB7CisJCXByaXNtMl9od19zaHV0ZG93bihkZXYsIDApOworCisJCWlmIChwcmlzbTJfaHdfaW5pdChkZXYsIDApKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGluaXRpYWxpemUgY2FyZCBmb3IiCisJCQkgICAgICAgIiBkb3dubG9hZFxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldCA9IC0xOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAocHJpc20yX2VuYWJsZV9hdXhfcG9ydChkZXYsIDEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgZW5hYmxlIEFVWCBwb3J0XG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCXBhcmFtMCA9IHBhcmFtLT5zdGFydF9hZGRyICYgMHhmZmZmOworCXBhcmFtMSA9IHBhcmFtLT5zdGFydF9hZGRyID4+IDE2OworCisJSEZBMzg0WF9PVVRXKDAsIEhGQTM4NFhfUEFSQU0yX09GRik7CisJSEZBMzg0WF9PVVRXKHBhcmFtMSwgSEZBMzg0WF9QQVJBTTFfT0ZGKTsKKwlpZiAoaGZhMzg0eF9jbWRfd2FpdChkZXYsIEhGQTM4NFhfQ01EQ09ERV9ET1dOTE9BRCB8CisJCQkgICAgIChIRkEzODRYX1BST0dNT0RFX0VOQUJMRV9WT0xBVElMRSA8PCA4KSwKKwkJCSAgICAgcGFyYW0wKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRG93bmxvYWQgY29tbWFuZCBleGVjdXRpb24gZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwYXJhbS0+bnVtX2FyZWFzOyBpKyspIHsKKwkJUERFQlVHKERFQlVHX0VYVFJBMiwgIiVzOiBXcml0aW5nICVkIGJ5dGVzIGF0IDB4JTA4eFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcGFyYW0tPmRhdGFbaV0ubGVuLCBwYXJhbS0+ZGF0YVtpXS5hZGRyKTsKKwkJaWYgKGhmYTM4NHhfdG9fYXV4KGRldiwgcGFyYW0tPmRhdGFbaV0uYWRkciwKKwkJCQkgICBwYXJhbS0+ZGF0YVtpXS5sZW4sIHBhcmFtLT5kYXRhW2ldLmRhdGEpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUkFNIGRvd25sb2FkIGF0IDB4JTA4eCAiCisJCQkgICAgICAgIihsZW49JWQpIGZhaWxlZFxuIiwgZGV2LT5uYW1lLAorCQkJICAgICAgIHBhcmFtLT5kYXRhW2ldLmFkZHIsIHBhcmFtLT5kYXRhW2ldLmxlbik7CisJCQlyZXQgPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJSEZBMzg0WF9PVVRXKHBhcmFtMSwgSEZBMzg0WF9QQVJBTTFfT0ZGKTsKKwlIRkEzODRYX09VVFcoMCwgSEZBMzg0WF9QQVJBTTJfT0ZGKTsKKwlpZiAoaGZhMzg0eF9jbWRfbm9fd2FpdChkZXYsIEhGQTM4NFhfQ01EQ09ERV9ET1dOTE9BRCB8CisJCQkJKEhGQTM4NFhfUFJPR01PREVfRElTQUJMRSA8PCA4KSwgcGFyYW0wKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRG93bmxvYWQgY29tbWFuZCBleGVjdXRpb24gZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwkvKiBQcm9nTW9kZSBkaXNhYmxlIGNhdXNlcyB0aGUgaGFyZHdhcmUgdG8gcmVzdGFydCBpdHNlbGYgZnJvbSB0aGUKKwkgKiBnaXZlbiBzdGFydGluZyBhZGRyZXNzLiBHaXZlIGh3IHNvbWUgdGltZSBhbmQgQUNLIGNvbW1hbmQganVzdCBpbgorCSAqIGNhc2UgcmVzdGFydCBkaWQgbm90IGhhcHBlbi4gKi8KKwltZGVsYXkoNSk7CisJSEZBMzg0WF9PVVRXKEhGQTM4NFhfRVZfQ01ELCBIRkEzODRYX0VWQUNLX09GRik7CisKKwlpZiAocHJpc20yX2VuYWJsZV9hdXhfcG9ydChkZXYsIDApKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRGlzYWJsaW5nIEFVWCBwb3J0IGZhaWxlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCS8qIGNvbnRpbnVlIGFueXdheS4uIHJlc3RhcnQgc2hvdWxkIGhhdmUgdGFrZW4gY2FyZSBvZiB0aGlzICovCisJfQorCisJbWRlbGF5KDUpOworCWxvY2FsLT5od19kb3dubG9hZGluZyA9IDA7CisJaWYgKHByaXNtMl9od19jb25maWcoZGV2LCAyKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FyZCBjb25maWd1cmF0aW9uIGFmdGVyIFJBTSAiCisJCSAgICAgICAiZG93bmxvYWQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisgb3V0OgorCWxvY2FsLT5od19kb3dubG9hZGluZyA9IDA7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9lbmFibGVfZ2VuZXNpcyhsb2NhbF9pbmZvX3QgKmxvY2FsLCBpbnQgaGNyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsb2NhbC0+ZGV2OworCXU4IGluaXRzZXFbNF0gPSB7IDB4MDAsIDB4ZTEsIDB4YTEsIDB4ZmYgfTsKKwl1OCByZWFkYnVmWzRdOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0ZXN0IEdlbmVzaXMgbW9kZSB3aXRoIEhDUiAweCUwMnhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgaGNyKTsKKwlsb2NhbC0+ZnVuYy0+Y29yX3NyZXNldChsb2NhbCk7CisJaGZhMzg0eF90b19hdXgoZGV2LCAweDdlMDAzOCwgc2l6ZW9mKGluaXRzZXEpLCBpbml0c2VxKTsKKwlsb2NhbC0+ZnVuYy0+Z2VuZXNpc19yZXNldChsb2NhbCwgaGNyKTsKKworCS8qIFJlYWRiYWNrIHRlc3QgKi8KKwloZmEzODR4X2Zyb21fYXV4KGRldiwgMHg3ZTAwMzgsIHNpemVvZihyZWFkYnVmKSwgcmVhZGJ1Zik7CisJaGZhMzg0eF90b19hdXgoZGV2LCAweDdlMDAzOCwgc2l6ZW9mKGluaXRzZXEpLCBpbml0c2VxKTsKKwloZmEzODR4X2Zyb21fYXV4KGRldiwgMHg3ZTAwMzgsIHNpemVvZihyZWFkYnVmKSwgcmVhZGJ1Zik7CisKKwlpZiAobWVtY21wKGluaXRzZXEsIHJlYWRidWYsIHNpemVvZihpbml0c2VxKSkgPT0gMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiUmVhZGJhY2sgdGVzdCBzdWNjZWVkZWQsIEhDUiAweCUwMnhcbiIsCisJCSAgICAgICBoY3IpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiUmVhZGJhY2sgdGVzdCBmYWlsZWQsIEhDUiAweCUwMnggIgorCQkgICAgICAgIndyaXRlICUwMnggJTAyeCAlMDJ4ICUwMnggcmVhZCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkgICAgICAgaGNyLCBpbml0c2VxWzBdLCBpbml0c2VxWzFdLCBpbml0c2VxWzJdLCBpbml0c2VxWzNdLAorCQkgICAgICAgcmVhZGJ1ZlswXSwgcmVhZGJ1ZlsxXSwgcmVhZGJ1ZlsyXSwgcmVhZGJ1ZlszXSk7CisJCXJldHVybiAxOworCX0KK30KKworCitzdGF0aWMgaW50IHByaXNtMl9nZXRfcmFtX3NpemUobG9jYWxfaW5mb190ICpsb2NhbCkKK3sKKwlpbnQgcmV0OworCisJLyogVHJ5IHRvIGVuYWJsZSBnZW5lc2lzIG1vZGU7IDB4MUYgZm9yIHg4IFNSQU0gb3IgMHgwRiBmb3IgeDE2IFNSQU0gKi8KKwlpZiAocHJpc20yX2VuYWJsZV9nZW5lc2lzKGxvY2FsLCAweDFmKSA9PSAwKQorCQlyZXQgPSA4OworCWVsc2UgaWYgKHByaXNtMl9lbmFibGVfZ2VuZXNpcyhsb2NhbCwgMHgwZikgPT0gMCkKKwkJcmV0ID0gMTY7CisJZWxzZQorCQlyZXQgPSAtMTsKKworCS8qIERpc2FibGUgZ2VuZXNpcyBtb2RlICovCisJbG9jYWwtPmZ1bmMtPmdlbmVzaXNfcmVzZXQobG9jYWwsIHJldCA9PSAxNiA/IDB4MDcgOiAweDE3KTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfZG93bmxvYWRfZ2VuZXNpcyhsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJCSAgIHN0cnVjdCBwcmlzbTJfZG93bmxvYWRfZGF0YSAqcGFyYW0pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CisJaW50IHJhbTE2ID0gMCwgaTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChsb2NhbC0+aHdfZG93bmxvYWRpbmcpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFscmVhZHkgZG93bmxvYWRpbmcgLSBhYm9ydGluZyBuZXcgIgorCQkgICAgICAgInJlcXVlc3RcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKCFsb2NhbC0+ZnVuYy0+Z2VuZXNpc19yZXNldCB8fCAhbG9jYWwtPmZ1bmMtPmNvcl9zcmVzZXQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdlbmVzaXMgbW9kZSBkb3dubG9hZGluZyBub3Qgc3VwcG9ydGVkICIKKwkJICAgICAgICJ3aXRoIHRoaXMgaHdtb2RlbFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWxvY2FsLT5od19kb3dubG9hZGluZyA9IDE7CisKKwlpZiAocHJpc20yX2VuYWJsZV9hdXhfcG9ydChkZXYsIDEpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIGVuYWJsZSBBVVggcG9ydFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWlmIChsb2NhbC0+c3JhbV90eXBlID09IC0xKSB7CisJCS8qIDB4MUYgZm9yIHg4IFNSQU0gb3IgMHgwRiBmb3IgeDE2IFNSQU0gKi8KKwkJaWYgKHByaXNtMl9lbmFibGVfZ2VuZXNpcyhsb2NhbCwgMHgxZikgPT0gMCkgeworCQkJcmFtMTYgPSAwOworCQkJUERFQlVHKERFQlVHX0VYVFJBMiwgIiVzOiBHZW5lc2lzIG1vZGUgT0sgdXNpbmcgeDggIgorCQkJICAgICAgICJTUkFNXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgaWYgKHByaXNtMl9lbmFibGVfZ2VuZXNpcyhsb2NhbCwgMHgwZikgPT0gMCkgeworCQkJcmFtMTYgPSAxOworCQkJUERFQlVHKERFQlVHX0VYVFJBMiwgIiVzOiBHZW5lc2lzIG1vZGUgT0sgdXNpbmcgeDE2ICIKKwkJCSAgICAgICAiU1JBTVxuIiwgZGV2LT5uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ291bGQgbm90IGluaXRpYXRlIGdlbmVzaXMgIgorCQkJICAgICAgICJtb2RlXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHByaXNtMl9lbmFibGVfZ2VuZXNpcyhsb2NhbCwgbG9jYWwtPnNyYW1fdHlwZSA9PSA4ID8KKwkJCQkJICAweDFmIDogMHgwZikpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogRmFpbGVkIHRvIHNldCBHZW5lc2lzICIKKwkJCSAgICAgICAibW9kZSAoc3JhbV90eXBlPSVkKVxuIiwgZGV2LT5uYW1lLAorCQkJICAgICAgIGxvY2FsLT5zcmFtX3R5cGUpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJhbTE2ID0gbG9jYWwtPnNyYW1fdHlwZSAhPSA4OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwYXJhbS0+bnVtX2FyZWFzOyBpKyspIHsKKwkJUERFQlVHKERFQlVHX0VYVFJBMiwgIiVzOiBXcml0aW5nICVkIGJ5dGVzIGF0IDB4JTA4eFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcGFyYW0tPmRhdGFbaV0ubGVuLCBwYXJhbS0+ZGF0YVtpXS5hZGRyKTsKKwkJaWYgKGhmYTM4NHhfdG9fYXV4KGRldiwgcGFyYW0tPmRhdGFbaV0uYWRkciwKKwkJCQkgICBwYXJhbS0+ZGF0YVtpXS5sZW4sIHBhcmFtLT5kYXRhW2ldLmRhdGEpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUkFNIGRvd25sb2FkIGF0IDB4JTA4eCAiCisJCQkgICAgICAgIihsZW49JWQpIGZhaWxlZFxuIiwgZGV2LT5uYW1lLAorCQkJICAgICAgIHBhcmFtLT5kYXRhW2ldLmFkZHIsIHBhcmFtLT5kYXRhW2ldLmxlbik7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlQREVCVUcoREVCVUdfRVhUUkEyLCAiRGlzYWJsZSBnZW5lc2lzIG1vZGVcbiIpOworCWxvY2FsLT5mdW5jLT5nZW5lc2lzX3Jlc2V0KGxvY2FsLCByYW0xNiA/IDB4MDcgOiAweDE3KTsKKwlpZiAocHJpc20yX2VuYWJsZV9hdXhfcG9ydChkZXYsIDApKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRmFpbGVkIHRvIGRpc2FibGUgQVVYIHBvcnRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCX0KKworCW1kZWxheSg1KTsKKwlsb2NhbC0+aHdfZG93bmxvYWRpbmcgPSAwOworCisJUERFQlVHKERFQlVHX0VYVFJBMiwgIlRyeWluZyB0byBpbml0aWFsaXplIGNhcmRcbiIpOworCS8qCisJICogTWFrZSBzdXJlIHRoZSBJTklUIGNvbW1hbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBjb21tYW5kIGNvbXBsZXRpb24KKwkgKiBldmVudCBieSBkaXNhYmxpbmcgaW50ZXJydXB0cy4KKwkgKi8KKwloZmEzODR4X2Rpc2FibGVfaW50ZXJydXB0cyhkZXYpOworCWlmIChwcmlzbTJfaHdfaW5pdChkZXYsIDEpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogSW5pdGlhbGl6YXRpb24gYWZ0ZXIgZ2VuZXNpcyBtb2RlICIKKwkJICAgICAgICJkb3dubG9hZCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCVBERUJVRyhERUJVR19FWFRSQTIsICJDYXJkIGluaXRpYWxpemVkIC0gcnVubmluZyBQUkkgb25seVxuIik7CisJaWYgKHByaXNtMl9od19pbml0MihkZXYsIDEpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogSW5pdGlhbGl6YXRpb24oMikgYWZ0ZXIgZ2VuZXNpcyBtb2RlICIKKwkJICAgICAgICJkb3dubG9hZCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworIG91dDoKKwlsb2NhbC0+aHdfZG93bmxvYWRpbmcgPSAwOworCXJldHVybiByZXQ7Cit9CisKKworI2lmZGVmIFBSSVNNMl9OT05fVk9MQVRJTEVfRE9XTkxPQUQKKy8qIE5vdGUhIE5vbi12b2xhdGlsZSBkb3dubG9hZGluZyBmdW5jdGlvbmFsaXR5IGhhcyBub3QgeWV0IGJlZW4gdGVzdGVkCisgKiB0aG9yb3VnaGx5IGFuZCBpdCBtYXkgY29ycnVwdCBmbGFzaCBpbWFnZSBhbmQgZWZmZWN0aXZlbHkga2lsbCB0aGUgY2FyZCB0aGF0CisgKiBpcyBiZWluZyB1cGRhdGVkLiBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4gKi8KKworc3RhdGljIGlubGluZSBpbnQgcHJpc20yX2Rvd25sb2FkX2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCXUzMiBhZGRyLCB1OCAqZGF0YSwKKwkJCQkJdTMyIGJ1ZmFkZHIsIGludCByZXN0X2xlbikKK3sKKwl1MTYgcGFyYW0wLCBwYXJhbTE7CisJaW50IGJsb2NrX2xlbjsKKworCWJsb2NrX2xlbiA9IHJlc3RfbGVuIDwgNDA5NiA/IHJlc3RfbGVuIDogNDA5NjsKKworCXBhcmFtMCA9IGFkZHIgJiAweGZmZmY7CisJcGFyYW0xID0gYWRkciA+PiAxNjsKKworCUhGQTM4NFhfT1VUVyhibG9ja19sZW4sIEhGQTM4NFhfUEFSQU0yX09GRik7CisJSEZBMzg0WF9PVVRXKHBhcmFtMSwgSEZBMzg0WF9QQVJBTTFfT0ZGKTsKKworCWlmIChoZmEzODR4X2NtZF93YWl0KGRldiwgSEZBMzg0WF9DTURDT0RFX0RPV05MT0FEIHwKKwkJCSAgICAgKEhGQTM4NFhfUFJPR01PREVfRU5BQkxFX05PTl9WT0xBVElMRSA8PCA4KSwKKwkJCSAgICAgcGFyYW0wKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRmxhc2ggZG93bmxvYWQgY29tbWFuZCBleGVjdXRpb24gIgorCQkgICAgICAgImZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChoZmEzODR4X3RvX2F1eChkZXYsIGJ1ZmFkZHIsIGJsb2NrX2xlbiwgZGF0YSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZsYXNoIGRvd25sb2FkIGF0IDB4JTA4eCAiCisJCSAgICAgICAiKGxlbj0lZCkgZmFpbGVkXG4iLCBkZXYtPm5hbWUsIGFkZHIsIGJsb2NrX2xlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlIRkEzODRYX09VVFcoMCwgSEZBMzg0WF9QQVJBTTJfT0ZGKTsKKwlIRkEzODRYX09VVFcoMCwgSEZBMzg0WF9QQVJBTTFfT0ZGKTsKKwlpZiAoaGZhMzg0eF9jbWRfd2FpdChkZXYsIEhGQTM4NFhfQ01EQ09ERV9ET1dOTE9BRCB8CisJCQkgICAgIChIRkEzODRYX1BST0dNT0RFX1BST0dSQU1fTk9OX1ZPTEFUSUxFIDw8IDgpLAorCQkJICAgICAwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRmxhc2ggd3JpdGUgY29tbWFuZCBleGVjdXRpb24gIgorCQkgICAgICAgImZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBibG9ja19sZW47Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfZG93bmxvYWRfbm9udm9sYXRpbGUobG9jYWxfaW5mb190ICpsb2NhbCwKKwkJCQkgICAgICAgc3RydWN0IHByaXNtMl9kb3dubG9hZF9kYXRhICpkbCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPmRldjsKKwlpbnQgcmV0ID0gMCwgaTsKKwlzdHJ1Y3QgeworCQl1MTYgcGFnZTsKKwkJdTE2IG9mZnNldDsKKwkJdTE2IGxlbjsKKwl9IGRsYnVmZmVyOworCXUzMiBidWZhZGRyOworCisJaWYgKGxvY2FsLT5od19kb3dubG9hZGluZykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWxyZWFkeSBkb3dubG9hZGluZyAtIGFib3J0aW5nIG5ldyAiCisJCSAgICAgICAicmVxdWVzdFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IGxvY2FsLT5mdW5jLT5nZXRfcmlkKGRldiwgSEZBMzg0WF9SSURfRE9XTkxPQURCVUZGRVIsCisJCQkJICAgJmRsYnVmZmVyLCA2LCAwKTsKKworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgcmVhZCBkb3dubG9hZCBidWZmZXIgIgorCQkgICAgICAgInBhcmFtZXRlcnNcbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWRsYnVmZmVyLnBhZ2UgPSBsZTE2X3RvX2NwdShkbGJ1ZmZlci5wYWdlKTsKKwlkbGJ1ZmZlci5vZmZzZXQgPSBsZTE2X3RvX2NwdShkbGJ1ZmZlci5vZmZzZXQpOworCWRsYnVmZmVyLmxlbiA9IGxlMTZfdG9fY3B1KGRsYnVmZmVyLmxlbik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiRG93bmxvYWQgYnVmZmVyOiAlZCBieXRlcyBhdCAweCUwNHg6MHglMDR4XG4iLAorCSAgICAgICBkbGJ1ZmZlci5sZW4sIGRsYnVmZmVyLnBhZ2UsIGRsYnVmZmVyLm9mZnNldCk7CisKKwlidWZhZGRyID0gKGRsYnVmZmVyLnBhZ2UgPDwgNykgKyBkbGJ1ZmZlci5vZmZzZXQ7CisKKwlsb2NhbC0+aHdfZG93bmxvYWRpbmcgPSAxOworCisJaWYgKCFsb2NhbC0+cHJpX29ubHkpIHsKKwkJcHJpc20yX2h3X3NodXRkb3duKGRldiwgMCk7CisKKwkJaWYgKHByaXNtMl9od19pbml0KGRldiwgMCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSBjYXJkIGZvciIKKwkJCSAgICAgICAiIGRvd25sb2FkXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0ID0gLTE7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWhmYTM4NHhfZGlzYWJsZV9pbnRlcnJ1cHRzKGRldik7CisKKwlpZiAocHJpc20yX2VuYWJsZV9hdXhfcG9ydChkZXYsIDEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgZW5hYmxlIEFVWCBwb3J0XG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogc3RhcnRpbmcgZmxhc2ggZG93bmxvYWRcbiIsIGRldi0+bmFtZSk7CisJZm9yIChpID0gMDsgaSA8IGRsLT5udW1fYXJlYXM7IGkrKykgeworCQlpbnQgcmVzdF9sZW4gPSBkbC0+ZGF0YVtpXS5sZW47CisJCWludCBkYXRhX29mZiA9IDA7CisKKwkJd2hpbGUgKHJlc3RfbGVuID4gMCkgeworCQkJaW50IGJsb2NrX2xlbjsKKworCQkJYmxvY2tfbGVuID0gcHJpc20yX2Rvd25sb2FkX2Jsb2NrKAorCQkJCWRldiwgZGwtPmRhdGFbaV0uYWRkciArIGRhdGFfb2ZmLAorCQkJCWRsLT5kYXRhW2ldLmRhdGEgKyBkYXRhX29mZiwgYnVmYWRkciwKKwkJCQlyZXN0X2xlbik7CisKKwkJCWlmIChibG9ja19sZW4gPCAwKSB7CisJCQkJcmV0ID0gLTE7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJlc3RfbGVuIC09IGJsb2NrX2xlbjsKKwkJCWRhdGFfb2ZmICs9IGJsb2NrX2xlbjsKKwkJfQorCX0KKworCUhGQTM4NFhfT1VUVygwLCBIRkEzODRYX1BBUkFNMV9PRkYpOworCUhGQTM4NFhfT1VUVygwLCBIRkEzODRYX1BBUkFNMl9PRkYpOworCWlmIChoZmEzODR4X2NtZF93YWl0KGRldiwgSEZBMzg0WF9DTURDT0RFX0RPV05MT0FEIHwKKwkJCQkoSEZBMzg0WF9QUk9HTU9ERV9ESVNBQkxFIDw8IDgpLCAwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRG93bmxvYWQgY29tbWFuZCBleGVjdXRpb24gZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwcmlzbTJfZW5hYmxlX2F1eF9wb3J0KGRldiwgMCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEaXNhYmxpbmcgQVVYIHBvcnQgZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJLyogY29udGludWUgYW55d2F5Li4gcmVzdGFydCBzaG91bGQgaGF2ZSB0YWtlbiBjYXJlIG9mIHRoaXMgKi8KKwl9CisKKwltZGVsYXkoNSk7CisKKwlsb2NhbC0+ZnVuYy0+aHdfcmVzZXQoZGV2KTsKKwlsb2NhbC0+aHdfZG93bmxvYWRpbmcgPSAwOworCWlmIChwcmlzbTJfaHdfY29uZmlnKGRldiwgMikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhcmQgY29uZmlndXJhdGlvbiBhZnRlciBmbGFzaCAiCisJCSAgICAgICAiZG93bmxvYWQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2FyZCBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkgYWZ0ZXIgIgorCQkgICAgICAgImZsYXNoIGRvd25sb2FkXG4iLCBkZXYtPm5hbWUpOworCX0KKworIG91dDoKKwlsb2NhbC0+aHdfZG93bmxvYWRpbmcgPSAwOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogUFJJU00yX05PTl9WT0xBVElMRV9ET1dOTE9BRCAqLworCisKK3N0YXRpYyB2b2lkIHByaXNtMl9kb3dubG9hZF9mcmVlX2RhdGEoc3RydWN0IHByaXNtMl9kb3dubG9hZF9kYXRhICpkbCkKK3sKKwlpbnQgaTsKKworCWlmIChkbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgZGwtPm51bV9hcmVhczsgaSsrKQorCQlrZnJlZShkbC0+ZGF0YVtpXS5kYXRhKTsKKwlrZnJlZShkbCk7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfZG93bmxvYWQobG9jYWxfaW5mb190ICpsb2NhbCwKKwkJCSAgIHN0cnVjdCBwcmlzbTJfZG93bmxvYWRfcGFyYW0gKnBhcmFtKQoreworCWludCByZXQgPSAwOworCWludCBpOworCXUzMiB0b3RhbF9sZW4gPSAwOworCXN0cnVjdCBwcmlzbTJfZG93bmxvYWRfZGF0YSAqZGwgPSBOVUxMOworCisJcHJpbnRrKEtFUk5fREVCVUcgInByaXNtMl9kb3dubG9hZDogZGxfY21kPSVkIHN0YXJ0X2FkZHI9MHglMDh4ICIKKwkgICAgICAgIm51bV9hcmVhcz0lZFxuIiwKKwkgICAgICAgcGFyYW0tPmRsX2NtZCwgcGFyYW0tPnN0YXJ0X2FkZHIsIHBhcmFtLT5udW1fYXJlYXMpOworCisJaWYgKHBhcmFtLT5udW1fYXJlYXMgPiAxMDApIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZGwgPSBrbWFsbG9jKHNpemVvZigqZGwpICsgcGFyYW0tPm51bV9hcmVhcyAqCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBwcmlzbTJfZG93bmxvYWRfZGF0YV9hcmVhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRsID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCW1lbXNldChkbCwgMCwgc2l6ZW9mKCpkbCkgKyBwYXJhbS0+bnVtX2FyZWFzICoKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBwcmlzbTJfZG93bmxvYWRfZGF0YV9hcmVhKSk7CisJZGwtPmRsX2NtZCA9IHBhcmFtLT5kbF9jbWQ7CisJZGwtPnN0YXJ0X2FkZHIgPSBwYXJhbS0+c3RhcnRfYWRkcjsKKwlkbC0+bnVtX2FyZWFzID0gcGFyYW0tPm51bV9hcmVhczsKKwlmb3IgKGkgPSAwOyBpIDwgcGFyYW0tPm51bV9hcmVhczsgaSsrKSB7CisJCVBERUJVRyhERUJVR19FWFRSQTIsCisJCSAgICAgICAiICBhcmVhICVkOiBhZGRyPTB4JTA4eCBsZW49JWQgcHRyPTB4JXBcbiIsCisJCSAgICAgICBpLCBwYXJhbS0+ZGF0YVtpXS5hZGRyLCBwYXJhbS0+ZGF0YVtpXS5sZW4sCisJCSAgICAgICBwYXJhbS0+ZGF0YVtpXS5wdHIpOworCisJCWRsLT5kYXRhW2ldLmFkZHIgPSBwYXJhbS0+ZGF0YVtpXS5hZGRyOworCQlkbC0+ZGF0YVtpXS5sZW4gPSBwYXJhbS0+ZGF0YVtpXS5sZW47CisKKwkJdG90YWxfbGVuICs9IHBhcmFtLT5kYXRhW2ldLmxlbjsKKwkJaWYgKHBhcmFtLT5kYXRhW2ldLmxlbiA+IFBSSVNNMl9NQVhfRE9XTkxPQURfQVJFQV9MRU4gfHwKKwkJICAgIHRvdGFsX2xlbiA+IFBSSVNNMl9NQVhfRE9XTkxPQURfTEVOKSB7CisJCQlyZXQgPSAtRTJCSUc7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWRsLT5kYXRhW2ldLmRhdGEgPSBrbWFsbG9jKGRsLT5kYXRhW2ldLmxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChkbC0+ZGF0YVtpXS5kYXRhID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcihkbC0+ZGF0YVtpXS5kYXRhLCBwYXJhbS0+ZGF0YVtpXS5wdHIsCisJCQkJICAgcGFyYW0tPmRhdGFbaV0ubGVuKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJc3dpdGNoIChwYXJhbS0+ZGxfY21kKSB7CisJY2FzZSBQUklTTTJfRE9XTkxPQURfVk9MQVRJTEU6CisJY2FzZSBQUklTTTJfRE9XTkxPQURfVk9MQVRJTEVfUEVSU0lTVEVOVDoKKwkJcmV0ID0gcHJpc20yX2Rvd25sb2FkX3ZvbGF0aWxlKGxvY2FsLCBkbCk7CisJCWJyZWFrOworCWNhc2UgUFJJU00yX0RPV05MT0FEX1ZPTEFUSUxFX0dFTkVTSVM6CisJY2FzZSBQUklTTTJfRE9XTkxPQURfVk9MQVRJTEVfR0VORVNJU19QRVJTSVNURU5UOgorCQlyZXQgPSBwcmlzbTJfZG93bmxvYWRfZ2VuZXNpcyhsb2NhbCwgZGwpOworCQlicmVhazsKKwljYXNlIFBSSVNNMl9ET1dOTE9BRF9OT05fVk9MQVRJTEU6CisjaWZkZWYgUFJJU00yX05PTl9WT0xBVElMRV9ET1dOTE9BRAorCQlyZXQgPSBwcmlzbTJfZG93bmxvYWRfbm9udm9sYXRpbGUobG9jYWwsIGRsKTsKKyNlbHNlIC8qIFBSSVNNMl9OT05fVk9MQVRJTEVfRE9XTkxPQUQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vbi12b2xhdGlsZSBkb3dubG9hZGluZyBub3QgZW5hYmxlZFxuIiwKKwkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKyNlbmRpZiAvKiBQUklTTTJfTk9OX1ZPTEFUSUxFX0RPV05MT0FEICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5zdXBwb3J0ZWQgZG93bmxvYWQgY29tbWFuZCAlZFxuIiwKKwkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUsIHBhcmFtLT5kbF9jbWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9OworCisgb3V0OgorCWlmIChyZXQgPT0gMCAmJiBkbCAmJgorCSAgICBwYXJhbS0+ZGxfY21kID09IFBSSVNNMl9ET1dOTE9BRF9WT0xBVElMRV9HRU5FU0lTX1BFUlNJU1RFTlQpIHsKKwkJcHJpc20yX2Rvd25sb2FkX2ZyZWVfZGF0YShsb2NhbC0+ZGxfcHJpKTsKKwkJbG9jYWwtPmRsX3ByaSA9IGRsOworCX0gZWxzZSBpZiAocmV0ID09IDAgJiYgZGwgJiYKKwkJICAgcGFyYW0tPmRsX2NtZCA9PSBQUklTTTJfRE9XTkxPQURfVk9MQVRJTEVfUEVSU0lTVEVOVCkgeworCQlwcmlzbTJfZG93bmxvYWRfZnJlZV9kYXRhKGxvY2FsLT5kbF9zZWMpOworCQlsb2NhbC0+ZGxfc2VjID0gZGw7CisJfSBlbHNlCisJCXByaXNtMl9kb3dubG9hZF9mcmVlX2RhdGEoZGwpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaHcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTMzYTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9ody5jCkBAIC0wLDAgKzEsMzQ0NSBAQAorLyoKKyAqIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlciBmb3IKKyAqIEludGVyc2lsIFByaXNtMi8yLjUvMy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSwgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogRklYOgorICogLSB0aGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IG9mIGFzc29jaWF0aW5nIFRYIHBhY2tldHMgdG8gY29ycmVjdCB3ZHMgZGV2aWNlCisgKiAgIHdoZW4gVFggRXhjL09LIGV2ZW50IG9jY3Vycywgc28gYWxsIHR4X3BhY2tldHMgYW5kIHNvbWUKKyAqICAgdHhfZXJyb3JzL3R4X2Ryb3BwZWQgYXJlIGFkZGVkIHRvIHRoZSBtYWluIG5ldGRldmljZTsgdXNpbmcgc3dfc3VwcG9ydAorICogICBmaWVsZCBpbiB0eGRlc2MgbWlnaHQgYmUgdXNlZCB0byBmaXggdGhpcyAodXNpbmcgQWxsb2MgZXZlbnQgdG8gaW5jcmVtZW50CisgKiAgIHR4X3BhY2tldHMgd291bGQgbmVlZCBzb21lIGZ1cnRoZXIgaW5mbyBpbiB0eGZpZCB0YWJsZSkKKyAqCisgKiBCdWZmZXIgQWNjZXNzIFBhdGggKEJBUCkgdXNhZ2U6CisgKiAgIFByaXNtMiBjYXJkcyBoYXZlIHR3byBzZXBhcmF0ZSBCQVBzIGZvciBhY2Nlc3NpbmcgdGhlIGNhcmQgbWVtb3J5LiBUaGVzZQorICogICBzaG91bGQgYWxsb3cgY29uY3VycmVudCBhY2Nlc3MgdG8gdHdvIGRpZmZlcmVudCBmcmFtZXMgYW5kIHRoZSBkcml2ZXIKKyAqICAgcHJldmlvdXNseSB1c2VkIEJBUDAgZm9yIHNlbmRpbmcgZGF0YSBhbmQgQkFQMSBmb3IgcmVjZWl2aW5nIGRhdGEuCisgKiAgIEhvd2V2ZXIsIHRoZXJlIHNlZW1zIHRvIGJlIG51bWJlciBvZiBpc3N1ZXMgd2l0aCBjb25jdXJyZW50IGFjY2VzcyBhbmQgYXQKKyAqICAgbGVhc3Qgb25lIGtub3cgaGFyZHdhcmUgYnVnIGluIHVzaW5nIEJBUDAgYW5kIEJBUDEgY29uY3VycmVudGx5IHdpdGggUENJCisgKiAgIFByaXNtMi41LiBUaGVyZWZvcmUsIHRoZSBkcml2ZXIgbm93IG9ubHkgdXNlcyBCQVAwIGZvciBtb3ZpbmcgZGF0YSBiZXR3ZWVuCisgKiAgIGhvc3QgYW5kIGNhcmQgbWVtb3JpZXMuIEJBUDAgYWNjZXNzZXMgYXJlIHByb3RlY3RlZCB3aXRoIGxvY2FsLT5iYXBsb2NrCisgKiAgIChzcGluX2xvY2tfYmgpIHRvIHByZXZlbnQgY29uY3VycmVudCB1c2UuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9jcnlwdC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgImhvc3RhcF84MDIxMS5oIgorI2luY2x1ZGUgImhvc3RhcC5oIgorI2luY2x1ZGUgImhvc3RhcF9hcC5oIgorCisKKy8qICNkZWZpbmUgZmluYWxfdmVyc2lvbiAqLworCitzdGF0aWMgaW50IG10dSA9IDE1MDA7Cittb2R1bGVfcGFyYW0obXR1LCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhtdHUsICJNYXhpbXVtIHRyYW5zZmVyIHVuaXQiKTsKKworc3RhdGljIGludCBjaGFubmVsW01BWF9QQVJNX0RFVklDRVNdID0geyAzLCBERUZfSU5UUyB9OworbW9kdWxlX3BhcmFtX2FycmF5KGNoYW5uZWwsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNoYW5uZWwsICJJbml0aWFsIGNoYW5uZWwiKTsKKworc3RhdGljIGNoYXIgZXNzaWRbMzNdID0gInRlc3QiOworbW9kdWxlX3BhcmFtX3N0cmluZyhlc3NpZCwgZXNzaWQsIHNpemVvZihlc3NpZCksIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlc3NpZCwgIkhvc3QgQVAncyBFU1NJRCIpOworCitzdGF0aWMgaW50IGl3X21vZGVbTUFYX1BBUk1fREVWSUNFU10gPSB7IElXX01PREVfTUFTVEVSLCBERUZfSU5UUyB9OworbW9kdWxlX3BhcmFtX2FycmF5KGl3X21vZGUsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGl3X21vZGUsICJJbml0aWFsIG9wZXJhdGlvbiBtb2RlIik7CisKK3N0YXRpYyBpbnQgYmVhY29uX2ludFtNQVhfUEFSTV9ERVZJQ0VTXSA9IHsgMTAwLCBERUZfSU5UUyB9OworbW9kdWxlX3BhcmFtX2FycmF5KGJlYWNvbl9pbnQsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJlYWNvbl9pbnQsICJCZWFjb24gaW50ZXJ2YWwgKDEgPSAxMDI0IHVzZWMpIik7CisKK3N0YXRpYyBpbnQgZHRpbV9wZXJpb2RbTUFYX1BBUk1fREVWSUNFU10gPSB7IDEsIERFRl9JTlRTIH07Cittb2R1bGVfcGFyYW1fYXJyYXkoZHRpbV9wZXJpb2QsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR0aW1fcGVyaW9kLCAiRFRJTSBwZXJpb2QiKTsKKworc3RhdGljIGNoYXIgZGV2X3RlbXBsYXRlWzE2XSA9ICJ3bGFuJWQiOworbW9kdWxlX3BhcmFtX3N0cmluZyhkZXZfdGVtcGxhdGUsIGRldl90ZW1wbGF0ZSwgc2l6ZW9mKGRldl90ZW1wbGF0ZSksIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfdGVtcGxhdGUsICJQcmVmaXggZm9yIG5ldHdvcmsgZGV2aWNlIG5hbWUgKGRlZmF1bHQ6ICIKKwkJICJ3bGFuJWQpIik7CisKKyNpZmRlZiBmaW5hbF92ZXJzaW9uCisjZGVmaW5lIEVYVFJBX0VWRU5UU19XVEVSUiAwCisjZWxzZQorLyogY2hlY2sgV1RFUlIgZXZlbnRzIChXYWl0IFRpbWUtb3V0KSBpbiBkZXZlbG9wbWVudCB2ZXJzaW9ucyAqLworI2RlZmluZSBFWFRSQV9FVkVOVFNfV1RFUlIgSEZBMzg0WF9FVl9XVEVSUgorI2VuZGlmCisKKy8qIEV2ZW50cyB0aGF0IHdpbGwgYmUgdXNpbmcgQkFQMCAqLworI2RlZmluZSBIRkEzODRYX0JBUDBfRVZFTlRTIFwKKwkoSEZBMzg0WF9FVl9UWEVYQyB8IEhGQTM4NFhfRVZfUlggfCBIRkEzODRYX0VWX0lORk8gfCBIRkEzODRYX0VWX1RYKQorCisvKiBldmVudCBtYXNrLCBpLmUuLCBldmVudHMgdGhhdCB3aWxsIHJlc3VsdCBpbiBhbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSEZBMzg0WF9FVkVOVF9NQVNLIFwKKwkoSEZBMzg0WF9CQVAwX0VWRU5UUyB8IEhGQTM4NFhfRVZfQUxMT0MgfCBIRkEzODRYX0VWX0lORkRST1AgfCBcCisJSEZBMzg0WF9FVl9DTUQgfCBIRkEzODRYX0VWX1RJQ0sgfCBcCisJRVhUUkFfRVZFTlRTX1dURVJSKQorCisvKiBEZWZhdWx0IFRYIGNvbnRyb2wgZmxhZ3M6IHVzZSA4MDIuMTEgaGVhZGVycyBhbmQgcmVxdWVzdCBpbnRlcnJ1cHQgZm9yCisgKiBmYWlsZWQgdHJhbnNtaXRzLiBGcmFtZXMgdGhhdCByZXF1ZXN0IEFDSyBjYWxsYmFjaywgd2lsbCBhZGQKKyAqIF9UWF9PSyBmbGFnIGFuZCBfQUxUX1JUUlkgZmxhZyBtYXkgYmUgdXNlZCB0byBzZWxlY3QgZGlmZmVyZW50IHJldHJ5IHBvbGljeS4KKyAqLworI2RlZmluZSBIRkEzODRYX1RYX0NUUkxfRkxBR1MgXAorCShIRkEzODRYX1RYX0NUUkxfODAyXzExIHwgSEZBMzg0WF9UWF9DVFJMX1RYX0VYKQorCisKKy8qIGNhLiAxIHVzZWMgKi8KKyNkZWZpbmUgSEZBMzg0WF9DTURfQlVTWV9USU1FT1VUIDUwMDAKKyNkZWZpbmUgSEZBMzg0WF9CQVBfQlVTWV9USU1FT1VUIDUwMDAwCisKKy8qIGNhLiAxMCB1c2VjICovCisjZGVmaW5lIEhGQTM4NFhfQ01EX0NPTVBMX1RJTUVPVVQgMjAwMDAKKyNkZWZpbmUgSEZBMzg0WF9ETF9DT01QTF9USU1FT1VUIDEwMDAwMDAKKworLyogV2FpdCB0aW1lcyBmb3IgaW5pdGlhbGl6YXRpb247IHlpZWxkIHRvIG90aGVyIHByb2Nlc3NlcyB0byBhdm9pZCBidXN5CisgKiB3YWl0aW5nIGZvciBsb25nIHRpbWUuICovCisjZGVmaW5lIEhGQTM4NFhfSU5JVF9USU1FT1VUIChIWiAvIDIpIC8qIDUwMCBtcyAqLworI2RlZmluZSBIRkEzODRYX0FMTE9DX0NPTVBMX1RJTUVPVVQgKEhaIC8gMjApIC8qIDUwIG1zICovCisKKworc3RhdGljIHZvaWQgcHJpc20yX2h3X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcHJpc20yX2NoZWNrX3N0YV9md192ZXJzaW9uKGxvY2FsX2luZm9fdCAqbG9jYWwpOworCisjaWZkZWYgUFJJU00yX0RPV05MT0FEX1NVUFBPUlQKKy8qIGhvc3RhcF9kb3dubG9hZC5jICovCitzdGF0aWMgaW50IHByaXNtMl9kb3dubG9hZF9hdXhfZHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgYWRkciwgaW50IGxlbiwgdTggKmJ1Zik7CitzdGF0aWMgdTggKiBwcmlzbTJfcmVhZF9wZGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHByaXNtMl9kb3dubG9hZChsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJICAgc3RydWN0IHByaXNtMl9kb3dubG9hZF9wYXJhbSAqcGFyYW0pOworc3RhdGljIHZvaWQgcHJpc20yX2Rvd25sb2FkX2ZyZWVfZGF0YShzdHJ1Y3QgcHJpc20yX2Rvd25sb2FkX2RhdGEgKmRsKTsKK3N0YXRpYyBpbnQgcHJpc20yX2Rvd25sb2FkX3ZvbGF0aWxlKGxvY2FsX2luZm9fdCAqbG9jYWwsCisJCQkJICAgIHN0cnVjdCBwcmlzbTJfZG93bmxvYWRfZGF0YSAqcGFyYW0pOworc3RhdGljIGludCBwcmlzbTJfZG93bmxvYWRfZ2VuZXNpcyhsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJCSAgIHN0cnVjdCBwcmlzbTJfZG93bmxvYWRfZGF0YSAqcGFyYW0pOworc3RhdGljIGludCBwcmlzbTJfZ2V0X3JhbV9zaXplKGxvY2FsX2luZm9fdCAqbG9jYWwpOworI2VuZGlmIC8qIFBSSVNNMl9ET1dOTE9BRF9TVVBQT1JUICovCisKKworCisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorLyogbWFnaWMgdmFsdWUgd3JpdHRlbiB0byBTV1NVUFBPUlQwIHJlZy4gZm9yIGRldGVjdGluZyB3aGV0aGVyIGNhcmQgaXMgc3RpbGwKKyAqIHByZXNlbnQgKi8KKyNkZWZpbmUgSEZBMzg0WF9NQUdJQyAweDhBMzIKKyNlbmRpZgorCisKK3N0YXRpYyB1MTYgaGZhMzg0eF9yZWFkX3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgcmVnKQoreworCXJldHVybiBIRkEzODRYX0lOVyhyZWcpOworfQorCisKK3N0YXRpYyB2b2lkIGhmYTM4NHhfcmVhZF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaGZhMzg0eF9yZWdzICpyZWdzKQoreworCXJlZ3MtPmNtZCA9IEhGQTM4NFhfSU5XKEhGQTM4NFhfQ01EX09GRik7CisJcmVncy0+ZXZzdGF0ID0gSEZBMzg0WF9JTlcoSEZBMzg0WF9FVlNUQVRfT0ZGKTsKKwlyZWdzLT5vZmZzZXQwID0gSEZBMzg0WF9JTlcoSEZBMzg0WF9PRkZTRVQwX09GRik7CisJcmVncy0+b2Zmc2V0MSA9IEhGQTM4NFhfSU5XKEhGQTM4NFhfT0ZGU0VUMV9PRkYpOworCXJlZ3MtPnN3c3VwcG9ydDAgPSBIRkEzODRYX0lOVyhIRkEzODRYX1NXU1VQUE9SVDBfT0ZGKTsKK30KKworCisvKioKKyAqIF9faG9zdGFwX2NtZF9xdWV1ZV9mcmVlIC0gRnJlZSBQcmlzbTIgY29tbWFuZCBxdWV1ZSBlbnRyeSAocHJpdmF0ZSkKKyAqIEBsb2NhbDogcG9pbnRlciB0byBwcml2YXRlIEhvc3QgQVAgZHJpdmVyIGRhdGEKKyAqIEBlbnRyeTogUHJpc20yIGNvbW1hbmQgcXVldWUgZW50cnkgdG8gYmUgZnJlZWQKKyAqIEBkZWxfcmVxOiByZXF1ZXN0IHRoZSBlbnRyeSB0byBiZSByZW1vdmVkCisgKgorICogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIGZvciBmcmVlaW5nIFByaXNtMiBjb21tYW5kIHF1ZXVlIGVudHJpZXMuCisgKiBDYWxsZXIgbXVzdCBoYXZlIGFjcXVpcmVkIGxvY2FsLT5jbWRsb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2hvc3RhcF9jbWRfcXVldWVfZnJlZShsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJCQkgICBzdHJ1Y3QgaG9zdGFwX2NtZF9xdWV1ZSAqZW50cnksCisJCQkJCSAgIGludCBkZWxfcmVxKQoreworCWlmIChkZWxfcmVxKSB7CisJCWVudHJ5LT5kZWxfcmVxID0gMTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZlbnRyeS0+bGlzdCkpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5saXN0KTsKKwkJCWxvY2FsLT5jbWRfcXVldWVfbGVuLS07CisJCX0KKwl9CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZW50cnktPnVzZWNudCkgJiYgZW50cnktPmRlbF9yZXEpCisJCWtmcmVlKGVudHJ5KTsKK30KKworCisvKioKKyAqIGhvc3RhcF9jbWRfcXVldWVfZnJlZSAtIEZyZWUgUHJpc20yIGNvbW1hbmQgcXVldWUgZW50cnkKKyAqIEBsb2NhbDogcG9pbnRlciB0byBwcml2YXRlIEhvc3QgQVAgZHJpdmVyIGRhdGEKKyAqIEBlbnRyeTogUHJpc20yIGNvbW1hbmQgcXVldWUgZW50cnkgdG8gYmUgZnJlZWQKKyAqIEBkZWxfcmVxOiByZXF1ZXN0IHRoZSBlbnRyeSB0byBiZSByZW1vdmVkCisgKgorICogRnJlZSBhIFByaXNtMiBjb21tYW5kIHF1ZXVlIGVudHJ5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaG9zdGFwX2NtZF9xdWV1ZV9mcmVlKGxvY2FsX2luZm9fdCAqbG9jYWwsCisJCQkJCSBzdHJ1Y3QgaG9zdGFwX2NtZF9xdWV1ZSAqZW50cnksCisJCQkJCSBpbnQgZGVsX3JlcSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5jbWRsb2NrLCBmbGFncyk7CisJX19ob3N0YXBfY21kX3F1ZXVlX2ZyZWUobG9jYWwsIGVudHJ5LCBkZWxfcmVxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+Y21kbG9jaywgZmxhZ3MpOworfQorCisKKy8qKgorICogcHJpc20yX2NsZWFyX2NtZF9xdWV1ZSAtIEZyZWUgYWxsIHBlbmRpbmcgUHJpc20yIGNvbW1hbmQgcXVldWUgZW50cmllcworICogQGxvY2FsOiBwb2ludGVyIHRvIHByaXZhdGUgSG9zdCBBUCBkcml2ZXIgZGF0YQorICovCitzdGF0aWMgdm9pZCBwcmlzbTJfY2xlYXJfY21kX3F1ZXVlKGxvY2FsX2luZm9fdCAqbG9jYWwpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBob3N0YXBfY21kX3F1ZXVlICplbnRyeTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+Y21kbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG4sICZsb2NhbC0+Y21kX3F1ZXVlKSB7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBob3N0YXBfY21kX3F1ZXVlLCBsaXN0KTsKKwkJYXRvbWljX2luYygmZW50cnktPnVzZWNudCk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVtb3ZlZCBwZW5kaW5nIGNtZF9xdWV1ZSBlbnRyeSAiCisJCSAgICAgICAiKHR5cGU9JWQsIGNtZD0weCUwNHgsIHBhcmFtMD0weCUwNHgpXG4iLAorCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSwgZW50cnktPnR5cGUsIGVudHJ5LT5jbWQsCisJCSAgICAgICBlbnRyeS0+cGFyYW0wKTsKKwkJX19ob3N0YXBfY21kX3F1ZXVlX2ZyZWUobG9jYWwsIGVudHJ5LCAxKTsKKwl9CisJaWYgKGxvY2FsLT5jbWRfcXVldWVfbGVuKSB7CisJCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW47IHByaW50IGRlYnVnIG1lc3NhZ2UgYW5kIGNsZWFyCisJCSAqIHF1ZXVlIGxlbmd0aC4gKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjbWRfcXVldWVfbGVuICglZCkgbm90IHplcm8gYWZ0ZXIgIgorCQkgICAgICAgImZsdXNoXG4iLCBsb2NhbC0+ZGV2LT5uYW1lLCBsb2NhbC0+Y21kX3F1ZXVlX2xlbik7CisJCWxvY2FsLT5jbWRfcXVldWVfbGVuID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmNtZGxvY2ssIGZsYWdzKTsKK30KKworCisvKioKKyAqIGhmYTM4NHhfY21kX2lzc3VlIC0gSXNzdWUgYSBQcmlzbTIgY29tbWFuZCB0byB0aGUgaGFyZHdhcmUKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICogQGVudHJ5OiBQcmlzbTIgY29tbWFuZCBxdWV1ZSBlbnRyeSB0byBiZSBpc3N1ZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgaGZhMzg0eF9jbWRfaXNzdWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGhvc3RhcF9jbWRfcXVldWUgKmVudHJ5KQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCB0cmllczsKKwl1MTYgcmVnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAobG9jYWwtPmZ1bmMtPmNhcmRfcHJlc2VudCAmJiAhbG9jYWwtPmZ1bmMtPmNhcmRfcHJlc2VudChsb2NhbCkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGVudHJ5LT5pc3N1ZWQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkcml2ZXIgYnVnIC0gcmUtaXNzdWluZyBjb21tYW5kIEAlcFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZW50cnkpOworCX0KKworCS8qIHdhaXQgdW50aWwgYnVzeSBiaXQgaXMgY2xlYXI7IHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBjbGVhciBzaW5jZSB0aGUKKwkgKiBjb21tYW5kcyBhcmUgc2VyaWFsaXplZCAqLworCXRyaWVzID0gSEZBMzg0WF9DTURfQlVTWV9USU1FT1VUOworCXdoaWxlIChIRkEzODRYX0lOVyhIRkEzODRYX0NNRF9PRkYpICYgSEZBMzg0WF9DTURfQlVTWSAmJiB0cmllcyA+IDApIHsKKwkJdHJpZXMtLTsKKwkJdWRlbGF5KDEpOworCX0KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCWlmICh0cmllcyAhPSBIRkEzODRYX0NNRF9CVVNZX1RJTUVPVVQpIHsKKwkJcHJpc20yX2lvX2RlYnVnX2Vycm9yKGRldiwgMSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaGZhMzg0eF9jbWRfaXNzdWU6IGNtZCByZWcgd2FzIGJ1c3kgIgorCQkgICAgICAgImZvciAlZCB1c2VjXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICBIRkEzODRYX0NNRF9CVVNZX1RJTUVPVVQgLSB0cmllcyk7CisJfQorI2VuZGlmCisJaWYgKHRyaWVzID09IDApIHsKKwkJcmVnID0gSEZBMzg0WF9JTlcoSEZBMzg0WF9DTURfT0ZGKTsKKwkJcHJpc20yX2lvX2RlYnVnX2Vycm9yKGRldiwgMik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaGZhMzg0eF9jbWRfaXNzdWUgLSB0aW1lb3V0IC0gIgorCQkgICAgICAgInJlZz0weCUwNHhcbiIsIGRldi0+bmFtZSwgcmVnKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJLyogd3JpdGUgY29tbWFuZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+Y21kbG9jaywgZmxhZ3MpOworCUhGQTM4NFhfT1VUVyhlbnRyeS0+cGFyYW0wLCBIRkEzODRYX1BBUkFNMF9PRkYpOworCUhGQTM4NFhfT1VUVyhlbnRyeS0+cGFyYW0xLCBIRkEzODRYX1BBUkFNMV9PRkYpOworCUhGQTM4NFhfT1VUVyhlbnRyeS0+Y21kLCBIRkEzODRYX0NNRF9PRkYpOworCWVudHJ5LT5pc3N1ZWQgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5jbWRsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIGhmYTM4NHhfY21kIC0gSXNzdWUgYSBQcmlzbTIgY29tbWFuZCBhbmQgd2FpdCAoc2xlZXApIGZvciBjb21wbGV0aW9uCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBjbWQ6IFByaXNtMiBjb21tYW5kIGNvZGUgKEhGQTM4NFhfQ01EX0NPREVfKikKKyAqIEBwYXJhbTA6IHZhbHVlIGZvciBQYXJhbTAgcmVnaXN0ZXIKKyAqIEBwYXJhbTE6IHZhbHVlIGZvciBQYXJhbTEgcmVnaXN0ZXIgKHBvaW50ZXI7ICVOVUxMIGlmIG5vdCB1c2VkKQorICogQHJlc3AwOiBwb2ludGVyIGZvciBSZXNwMCBkYXRhIG9yICVOVUxMIGlmIFJlc3AwIGlzIG5vdCBuZWVkZWQKKyAqCisgKiBJc3N1ZSBnaXZlbiBjb21tYW5kIChwb3NzaWJseSBhZnRlciB3YWl0aW5nIGluIGNvbW1hbmQgcXVldWUpIGFuZCBzbGVlcAorICogdW50aWwgdGhlIGNvbW1hbmQgaXMgY29tcGxldGVkIChvciB0aW1lZCBvdXQgb3IgaW50ZXJydXB0ZWQpLiBUaGlzIGNhbiBiZQorICogY2FsbGVkIG9ubHkgZnJvbSB1c2VyIHByb2Nlc3MgY29udGV4dC4KKyAqLworc3RhdGljIGludCBoZmEzODR4X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgY21kLCB1MTYgcGFyYW0wLAorCQkgICAgICAgdTE2ICpwYXJhbTEsIHUxNiAqcmVzcDApCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJaW50IGVyciwgcmVzLCBpc3N1ZSwgaXNzdWVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBob3N0YXBfY21kX3F1ZXVlICplbnRyeTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCWlmIChpbl9pbnRlcnJ1cHQoKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGhmYTM4NHhfY21kIGNhbGxlZCBmcm9tIGludGVycnVwdCAiCisJCSAgICAgICAiY29udGV4dFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChsb2NhbC0+Y21kX3F1ZXVlX2xlbiA+PSBIT1NUQVBfQ01EX1FVRVVFX01BWF9MRU4pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoZmEzODR4X2NtZDogY21kX3F1ZXVlIGZ1bGxcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCisJZW50cnkgPSAoc3RydWN0IGhvc3RhcF9jbWRfcXVldWUgKikKKwkJa21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CisJaWYgKGVudHJ5ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoZmEzODR4X2NtZCAtIGttYWxsb2MgZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKCplbnRyeSkpOworCWF0b21pY19zZXQoJmVudHJ5LT51c2VjbnQsIDEpOworCWVudHJ5LT50eXBlID0gQ01EX1NMRUVQOworCWVudHJ5LT5jbWQgPSBjbWQ7CisJZW50cnktPnBhcmFtMCA9IHBhcmFtMDsKKwlpZiAocGFyYW0xKQorCQllbnRyeS0+cGFyYW0xID0gKnBhcmFtMTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlbnRyeS0+Y29tcGwpOworCisJLyogcHJlcGFyZSB0byB3YWl0IGZvciBjb21tYW5kIGNvbXBsZXRpb24gZXZlbnQsIGJ1dCBkbyBub3Qgc2xlZXAgeWV0CisJICovCisJYWRkX3dhaXRfcXVldWUoJmVudHJ5LT5jb21wbCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPmNtZGxvY2ssIGZsYWdzKTsKKwlpc3N1ZSA9IGxpc3RfZW1wdHkoJmxvY2FsLT5jbWRfcXVldWUpOworCWlmIChpc3N1ZSkKKwkJZW50cnktPmlzc3VpbmcgPSAxOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmbG9jYWwtPmNtZF9xdWV1ZSk7CisJbG9jYWwtPmNtZF9xdWV1ZV9sZW4rKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+Y21kbG9jaywgZmxhZ3MpOworCisJZXJyID0gMDsKKwlpZiAoIWlzc3VlKQorCQlnb3RvIHdhaXRfY29tcGxldGlvbjsKKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJZXJyID0gLUVJTlRSOworCisJaWYgKCFlcnIpIHsKKwkJaWYgKGhmYTM4NHhfY21kX2lzc3VlKGRldiwgZW50cnkpKQorCQkJZXJyID0gLUVUSU1FRE9VVDsKKwkJZWxzZQorCQkJaXNzdWVkID0gMTsKKwl9CisKKyB3YWl0X2NvbXBsZXRpb246CisJaWYgKCFlcnIgJiYgZW50cnktPnR5cGUgIT0gQ01EX0NPTVBMRVRFRCkgeworCQkvKiBzbGVlcCB1bnRpbCBjb21tYW5kIGlzIGNvbXBsZXRlZCBvciB0aW1lZCBvdXQgKi8KKwkJcmVzID0gc2NoZWR1bGVfdGltZW91dCgyICogSFopOworCX0gZWxzZQorCQlyZXMgPSAtMTsKKworCWlmICghZXJyICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQllcnIgPSAtRUlOVFI7CisKKwlpZiAoZXJyICYmIGlzc3VlZCkgeworCQkvKiB0aGUgY29tbWFuZCB3YXMgaXNzdWVkLCBzbyBhIENtZENvbXBsIGV2ZW50IHNob3VsZCBvY2N1cgorCQkgKiBzb29uOyBob3dldmVyLCB0aGVyZSdzIGEgcGVuZGluZyBzaWduYWwgYW5kCisJCSAqIHNjaGVkdWxlX3RpbWVvdXQoKSB3b3VsZCBiZSBpbnRlcnJ1cHRlZDsgd2FpdCBhIHNob3J0IHBlcmlvZAorCQkgKiBvZiB0aW1lIHRvIGF2b2lkIHJlbW92aW5nIGVudHJ5IGZyb20gdGhlIGxpc3QgYmVmb3JlCisJCSAqIENtZENvbXBsIGV2ZW50ICovCisJCXVkZWxheSgzMDApOworCX0KKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmVudHJ5LT5jb21wbCwgJndhaXQpOworCisJLyogSWYgZW50cnktPmxpc3QgaXMgc3RpbGwgaW4gdGhlIGxpc3QsIGl0IG11c3QgYmUgcmVtb3ZlZAorCSAqIGZpcnN0IGFuZCBpbiB0aGlzIGNhc2UgcHJpc20yX2NtZF9ldigpIGRvZXMgbm90IHlldCBoYXZlCisJICogbG9jYWwgcmVmZXJlbmNlIHRvIGl0LCBhbmQgdGhlIGRhdGEgY2FuIGJlIGtmcmVlKCknZAorCSAqIGhlcmUuIElmIHRoZSBjb21tYW5kIGNvbXBsZXRpb24gZXZlbnQgaXMgc3RpbGwgZ2VuZXJhdGVkLAorCSAqIGl0IHdpbGwgYmUgYXNzaWduZWQgdG8gbmV4dCAocG9zc2libHkpIHBlbmRpbmcgY29tbWFuZCwgYnV0CisJICogdGhlIGRyaXZlciB3aWxsIHJlc2V0IHRoZSBjYXJkIGFueXdheSBkdWUgdG8gdGltZW91dAorCSAqCisJICogSWYgdGhlIGVudHJ5IGlzIG5vdCBpbiB0aGUgbGlzdCBwcmlzbTJfY21kX2V2KCkgaGFzIGEgbG9jYWwKKwkgKiByZWZlcmVuY2UgdG8gaXQsIGJ1dCBrZWVwcyBjbWRsb2NrIGFzIGxvbmcgYXMgdGhlIGRhdGEgaXMKKwkgKiBuZWVkZWQsIHNvIHRoZSBkYXRhIGNhbiBiZSBrZnJlZSgpJ2QgaGVyZS4gKi8KKworCS8qIEZJWDogaWYgdGhlIGVudHJ5LT5saXN0IGlzIGluIHRoZSBsaXN0LCBpdCBoYXMgbm90IGJlZW4gY29tcGxldGVkCisJICogeWV0LCBzbyByZW1vdmluZyBpdCBoZXJlIGlzIHNvbWV3aGF0IHdyb25nLi4gdGhpcyBjb3VsZCBjYXVzZQorCSAqIHJlZmVyZW5jZXMgdG8gZnJlZWQgbWVtb3J5IGFuZCBuZXh0IGxpc3RfZGVsKCkgY2F1c2luZyBOVUxMIHBvaW50ZXIKKwkgKiBkZXJlZmVyZW5jZS4uIGl0IHdvdWxkIHByb2JhYmx5IGJlIGJldHRlciB0byBsZWF2ZSB0aGUgZW50cnkgaW4gdGhlCisJICogbGlzdCBhbmQgdGhlIGxpc3Qgc2hvdWxkIGJlIGVtcHRpZWQgZHVyaW5nIGh3IHJlc2V0ICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPmNtZGxvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmVudHJ5LT5saXN0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGhmYTM4NHhfY21kOiBlbnRyeSBzdGlsbCBpbiBsaXN0PyAiCisJCSAgICAgICAiKGVudHJ5PSVwLCB0eXBlPSVkLCByZXM9JWQpXG4iLCBkZXYtPm5hbWUsIGVudHJ5LAorCQkgICAgICAgZW50cnktPnR5cGUsIHJlcyk7CisJCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5saXN0KTsKKwkJbG9jYWwtPmNtZF9xdWV1ZV9sZW4tLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmNtZGxvY2ssIGZsYWdzKTsKKworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoZmEzODR4X2NtZDogaW50ZXJydXB0ZWQ7IGVycj0lZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmVzID0gZXJyOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGVudHJ5LT50eXBlICE9IENNRF9DT01QTEVURUQpIHsKKwkJdTE2IHJlZyA9IEhGQTM4NFhfSU5XKEhGQTM4NFhfRVZTVEFUX09GRik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaGZhMzg0eF9jbWQ6IGNvbW1hbmQgd2FzIG5vdCAiCisJCSAgICAgICAiY29tcGxldGVkIChyZXM9JWQsIGVudHJ5PSVwLCB0eXBlPSVkLCBjbWQ9MHglMDR4LCAiCisJCSAgICAgICAicGFyYW0wPTB4JTA0eCwgRVZTVEFUPSUwNHggSU5URU49JTA0eClcbiIsIGRldi0+bmFtZSwKKwkJICAgICAgIHJlcywgZW50cnksIGVudHJ5LT50eXBlLCBlbnRyeS0+Y21kLCBlbnRyeS0+cGFyYW0wLCByZWcsCisJCSAgICAgICBIRkEzODRYX0lOVyhIRkEzODRYX0lOVEVOX09GRikpOworCQlpZiAocmVnICYgSEZBMzg0WF9FVl9DTUQpIHsKKwkJCS8qIENvbW1hbmQgY29tcGxldGlvbiBldmVudCBpcyBwZW5kaW5nLCBidXQgdGhlCisJCQkgKiBpbnRlcnJ1cHQgd2FzIG5vdCBkZWxpdmVyZWQgLSBwcm9iYWJseSBhbiBpc3N1ZQorCQkJICogd2l0aCBwY21jaWEtY3MgY29uZmlndXJhdGlvbi4gKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnRlcnJ1cHQgZGVsaXZlcnkgZG9lcyBub3QgIgorCQkJICAgICAgICJzZWVtIHRvIHdvcmtcbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJcHJpc20yX2lvX2RlYnVnX2Vycm9yKGRldiwgMyk7CisJCXJlcyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAocmVzcDAgIT0gTlVMTCkKKwkJKnJlc3AwID0gZW50cnktPnJlc3AwOworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJaWYgKGVudHJ5LT5yZXMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDTUQ9MHglMDR4ID0+IHJlcz0weCUwMngsICIKKwkJICAgICAgICJyZXNwMD0weCUwNHhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGNtZCwgZW50cnktPnJlcywgZW50cnktPnJlc3AwKTsKKwl9CisjZW5kaWYgLyogZmluYWxfdmVyc2lvbiAqLworCisJcmVzID0gZW50cnktPnJlczsKKyBkb25lOgorCWhvc3RhcF9jbWRfcXVldWVfZnJlZShsb2NhbCwgZW50cnksIDEpOworCXJldHVybiByZXM7Cit9CisKKworLyoqCisgKiBoZmEzODR4X2NtZF9jYWxsYmFjayAtIElzc3VlIGEgUHJpc20yIGNvbW1hbmQ7IGNhbGxiYWNrIHdoZW4gY29tcGxldGVkCisgKiBAZGV2OiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEBjbWQ6IFByaXNtMiBjb21tYW5kIGNvZGUgKEhGQTM4NFhfQ01EX0NPREVfKikKKyAqIEBwYXJhbTA6IHZhbHVlIGZvciBQYXJhbTAgcmVnaXN0ZXIKKyAqIEBjYWxsYmFjazogY29tbWFuZCBjb21wbGV0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uICglTlVMTCA9IG5vIGNhbGxiYWNrKQorICogQGNvbnRleHQ6IGNvbnRleHQgZGF0YSB0byBiZSBnaXZlbiB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBJc3N1ZSBnaXZlbiBjb21tYW5kIChwb3NzaWJseSBhZnRlciB3YWl0aW5nIGluIGNvbW1hbmQgcXVldWUpIGFuZCB1c2UKKyAqIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGluZGljYXRlIGNvbW1hbmQgY29tcGxldGlvbi4gVGhpcyBjYW4gYmUgY2FsbGVkIGJvdGgKKyAqIGZyb20gdXNlciBhbmQgaW50ZXJydXB0IGNvbnRleHQuIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpbgorICogaGFyZHdhcmUgSVJRIGNvbnRleHQuIEl0IGNhbiBiZSAlTlVMTCwgd2hlbiBubyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbgorICogY29tbWFuZCBpcyBjb21wbGV0ZWQuCisgKi8KK3N0YXRpYyBpbnQgaGZhMzg0eF9jbWRfY2FsbGJhY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGNtZCwgdTE2IHBhcmFtMCwKKwkJCQl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkgbG9uZyBjb250ZXh0LCB1MTYgcmVzcDAsCisJCQkJCQkgdTE2IHN0YXR1cyksCisJCQkJbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCBpc3N1ZSwgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGhvc3RhcF9jbWRfcXVldWUgKmVudHJ5OworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKGxvY2FsLT5jbWRfcXVldWVfbGVuID49IEhPU1RBUF9DTURfUVVFVUVfTUFYX0xFTiArIDIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoZmEzODR4X2NtZDogY21kX3F1ZXVlIGZ1bGxcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJZW50cnkgPSAoc3RydWN0IGhvc3RhcF9jbWRfcXVldWUgKikKKwkJa21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CisJaWYgKGVudHJ5ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoZmEzODR4X2NtZF9jYWxsYmFjayAtIGttYWxsb2MgIgorCQkgICAgICAgImZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKCplbnRyeSkpOworCWF0b21pY19zZXQoJmVudHJ5LT51c2VjbnQsIDEpOworCWVudHJ5LT50eXBlID0gQ01EX0NBTExCQUNLOworCWVudHJ5LT5jbWQgPSBjbWQ7CisJZW50cnktPnBhcmFtMCA9IHBhcmFtMDsKKwllbnRyeS0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKwllbnRyeS0+Y29udGV4dCA9IGNvbnRleHQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPmNtZGxvY2ssIGZsYWdzKTsKKwlpc3N1ZSA9IGxpc3RfZW1wdHkoJmxvY2FsLT5jbWRfcXVldWUpOworCWlmIChpc3N1ZSkKKwkJZW50cnktPmlzc3VpbmcgPSAxOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmbG9jYWwtPmNtZF9xdWV1ZSk7CisJbG9jYWwtPmNtZF9xdWV1ZV9sZW4rKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+Y21kbG9jaywgZmxhZ3MpOworCisJaWYgKGlzc3VlICYmIGhmYTM4NHhfY21kX2lzc3VlKGRldiwgZW50cnkpKQorCQlyZXQgPSAtRVRJTUVET1VUOworCWVsc2UKKwkJcmV0ID0gMDsKKworCWhvc3RhcF9jbWRfcXVldWVfZnJlZShsb2NhbCwgZW50cnksIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogX19oZmEzODR4X2NtZF9ub193YWl0IC0gSXNzdWUgYSBQcmlzbTIgY29tbWFuZCAocHJpdmF0ZSkKKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICogQGNtZDogUHJpc20yIGNvbW1hbmQgY29kZSAoSEZBMzg0WF9DTURfQ09ERV8qKQorICogQHBhcmFtMDogdmFsdWUgZm9yIFBhcmFtMCByZWdpc3RlcgorICogQGlvX2RlYnVnX251bTogSS9PIGRlYnVnIGVycm9yIG51bWJlcgorICoKKyAqIFNoYXJlZCBoZWxwZXIgZnVuY3Rpb24gZm9yIGhmYTM4NHhfY21kX3dhaXQoKSBhbmQgaGZhMzg0eF9jbWRfbm9fd2FpdCgpLgorICovCitzdGF0aWMgaW50IF9faGZhMzg0eF9jbWRfbm9fd2FpdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgY21kLCB1MTYgcGFyYW0wLAorCQkJCSBpbnQgaW9fZGVidWdfbnVtKQoreworCWludCB0cmllczsKKwl1MTYgcmVnOworCisJLyogd2FpdCB1bnRpbCBidXN5IGJpdCBpcyBjbGVhcjsgdGhpcyBzaG91bGQgYWx3YXlzIGJlIGNsZWFyIHNpbmNlIHRoZQorCSAqIGNvbW1hbmRzIGFyZSBzZXJpYWxpemVkICovCisJdHJpZXMgPSBIRkEzODRYX0NNRF9CVVNZX1RJTUVPVVQ7CisJd2hpbGUgKEhGQTM4NFhfSU5XKEhGQTM4NFhfQ01EX09GRikgJiBIRkEzODRYX0NNRF9CVVNZICYmIHRyaWVzID4gMCkgeworCQl0cmllcy0tOworCQl1ZGVsYXkoMSk7CisJfQorCWlmICh0cmllcyA9PSAwKSB7CisJCXJlZyA9IEhGQTM4NFhfSU5XKEhGQTM4NFhfQ01EX09GRik7CisJCXByaXNtMl9pb19kZWJ1Z19lcnJvcihkZXYsIGlvX2RlYnVnX251bSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogX19oZmEzODR4X2NtZF9ub193YWl0KCVkKSAtIHRpbWVvdXQgLSAiCisJCSAgICAgICAicmVnPTB4JTA0eFxuIiwgZGV2LT5uYW1lLCBpb19kZWJ1Z19udW0sIHJlZyk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCS8qIHdyaXRlIGNvbW1hbmQgKi8KKwlIRkEzODRYX09VVFcocGFyYW0wLCBIRkEzODRYX1BBUkFNMF9PRkYpOworCUhGQTM4NFhfT1VUVyhjbWQsIEhGQTM4NFhfQ01EX09GRik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIGhmYTM4NHhfY21kX3dhaXQgLSBJc3N1ZSBhIFByaXNtMiBjb21tYW5kIGFuZCBidXN5IHdhaXQgZm9yIGNvbXBsZXRpb24KKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICogQGNtZDogUHJpc20yIGNvbW1hbmQgY29kZSAoSEZBMzg0WF9DTURfQ09ERV8qKQorICogQHBhcmFtMDogdmFsdWUgZm9yIFBhcmFtMCByZWdpc3RlcgorICovCitzdGF0aWMgaW50IGhmYTM4NHhfY21kX3dhaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGNtZCwgdTE2IHBhcmFtMCkKK3sKKwlpbnQgcmVzLCB0cmllczsKKwl1MTYgcmVnOworCisJcmVzID0gX19oZmEzODR4X2NtZF9ub193YWl0KGRldiwgY21kLCBwYXJhbTAsIDQpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKyAgICAgICAgLyogd2FpdCBmb3IgY29tbWFuZCBjb21wbGV0aW9uICovCisJaWYgKChjbWQgJiBIRkEzODRYX0NNRENPREVfTUFTSykgPT0gSEZBMzg0WF9DTURDT0RFX0RPV05MT0FEKQorCQl0cmllcyA9IEhGQTM4NFhfRExfQ09NUExfVElNRU9VVDsKKwllbHNlCisJCXRyaWVzID0gSEZBMzg0WF9DTURfQ09NUExfVElNRU9VVDsKKworICAgICAgICB3aGlsZSAoIShIRkEzODRYX0lOVyhIRkEzODRYX0VWU1RBVF9PRkYpICYgSEZBMzg0WF9FVl9DTUQpICYmCisgICAgICAgICAgICAgICB0cmllcyA+IDApIHsKKyAgICAgICAgICAgICAgICB0cmllcy0tOworICAgICAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyaWVzID09IDApIHsKKyAgICAgICAgICAgICAgICByZWcgPSBIRkEzODRYX0lOVyhIRkEzODRYX0VWU1RBVF9PRkYpOworCQlwcmlzbTJfaW9fZGVidWdfZXJyb3IoZGV2LCA1KTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IGhmYTM4NHhfY21kX3dhaXQgLSB0aW1lb3V0MiAtICIKKwkJICAgICAgICJyZWc9MHglMDR4XG4iLCBkZXYtPm5hbWUsIHJlZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FVElNRURPVVQ7CisgICAgICAgIH0KKworICAgICAgICByZXMgPSAoSEZBMzg0WF9JTlcoSEZBMzg0WF9TVEFUVVNfT0ZGKSAmCisgICAgICAgICAgICAgICAoQklUKDE0KSB8IEJJVCgxMykgfCBCSVQoMTIpIHwgQklUKDExKSB8IEJJVCgxMCkgfCBCSVQoOSkgfAorICAgICAgICAgICAgICAgIEJJVCg4KSkpID4+IDg7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwlpZiAocmVzKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ01EPTB4JTA0eCA9PiByZXM9MHglMDJ4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBjbWQsIHJlcyk7CisJfQorI2VuZGlmCisKKwlIRkEzODRYX09VVFcoSEZBMzg0WF9FVl9DTUQsIEhGQTM4NFhfRVZBQ0tfT0ZGKTsKKworCXJldHVybiByZXM7Cit9CisKKworLyoqCisgKiBoZmEzODR4X2NtZF9ub193YWl0IC0gSXNzdWUgYSBQcmlzbTIgY29tbWFuZDsgZG8gbm90IHdhaXQgZm9yIGNvbXBsZXRpb24KKyAqIEBkZXY6IHBvaW50ZXIgdG8gbmV0X2RldmljZQorICogQGNtZDogUHJpc20yIGNvbW1hbmQgY29kZSAoSEZBMzg0WF9DTURfQ09ERV8qKQorICogQHBhcmFtMDogdmFsdWUgZm9yIFBhcmFtMCByZWdpc3RlcgorICovCitzdGF0aWMgaW5saW5lIGludCBoZmEzODR4X2NtZF9ub193YWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBjbWQsCisJCQkJICAgICAgdTE2IHBhcmFtMCkKK3sKKwlyZXR1cm4gX19oZmEzODR4X2NtZF9ub193YWl0KGRldiwgY21kLCBwYXJhbTAsIDYpOworfQorCisKKy8qKgorICogcHJpc20yX2NtZF9ldiAtIFByaXNtMiBjb21tYW5kIGNvbXBsZXRpb24gZXZlbnQgaGFuZGxlcgorICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCisgKgorICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIGNvbW1hbmQgY29tcGxldGlvbiBldmVudHMuIENhbGxlZCBieSB0aGUgbWFpbgorICogaW50ZXJydXB0IGhhbmRsZXIgaW4gaGFyZHdhcmUgSVJRIGNvbnRleHQuIFJlYWQgUmVzcDAgYW5kIHN0YXR1cyByZWdpc3RlcnMKKyAqIGZyb20gdGhlIGhhcmR3YXJlIGFuZCBBQ0sgdGhlIGV2ZW50LiBEZXBlbmRpbmcgb24gdGhlIGlzc3VlZCBjb21tYW5kIHR5cGUKKyAqIGVpdGhlciB3YWtlIHVwIHRoZSBzbGVlcGluZyBwcm9jZXNzIHRoYXQgaXMgd2FpdGluZyBmb3IgY29tbWFuZCBjb21wbGV0aW9uCisgKiBvciBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4gSXNzdWUgdGhlIG5leHQgY29tbWFuZCwgaWYgb25lIGlzIHBlbmRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHByaXNtMl9jbWRfZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlzdHJ1Y3QgaG9zdGFwX2NtZF9xdWV1ZSAqZW50cnkgPSBOVUxMOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJc3Bpbl9sb2NrKCZsb2NhbC0+Y21kbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZsb2NhbC0+Y21kX3F1ZXVlKSkgeworCQllbnRyeSA9IGxpc3RfZW50cnkobG9jYWwtPmNtZF9xdWV1ZS5uZXh0LAorCQkJCSAgIHN0cnVjdCBob3N0YXBfY21kX3F1ZXVlLCBsaXN0KTsKKwkJYXRvbWljX2luYygmZW50cnktPnVzZWNudCk7CisJCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5saXN0KTsKKwkJbG9jYWwtPmNtZF9xdWV1ZV9sZW4tLTsKKworCQlpZiAoIWVudHJ5LT5pc3N1ZWQpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ29tbWFuZCBjb21wbGV0aW9uIGV2ZW50LCBidXQgIgorCQkJICAgICAgICJjbWQgbm90IGlzc3VlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCV9faG9zdGFwX2NtZF9xdWV1ZV9mcmVlKGxvY2FsLCBlbnRyeSwgMSk7CisJCQllbnRyeSA9IE5VTEw7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmxvY2FsLT5jbWRsb2NrKTsKKworCWlmICghZW50cnkpIHsKKwkJSEZBMzg0WF9PVVRXKEhGQTM4NFhfRVZfQ01ELCBIRkEzODRYX0VWQUNLX09GRik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ29tbWFuZCBjb21wbGV0aW9uIGV2ZW50LCBidXQgbm8gIgorCQkgICAgICAgInBlbmRpbmcgY29tbWFuZHNcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwllbnRyeS0+cmVzcDAgPSBIRkEzODRYX0lOVyhIRkEzODRYX1JFU1AwX09GRik7CisJZW50cnktPnJlcyA9IChIRkEzODRYX0lOVyhIRkEzODRYX1NUQVRVU19PRkYpICYKKwkJICAgICAgKEJJVCgxNCkgfCBCSVQoMTMpIHwgQklUKDEyKSB8IEJJVCgxMSkgfCBCSVQoMTApIHwKKwkJICAgICAgIEJJVCg5KSB8IEJJVCg4KSkpID4+IDg7CisJSEZBMzg0WF9PVVRXKEhGQTM4NFhfRVZfQ01ELCBIRkEzODRYX0VWQUNLX09GRik7CisKKwkvKiBUT0RPOiByZXN0IG9mIHRoZSBDbWRFdiBoYW5kbGluZyBjb3VsZCBiZSBtb3ZlZCB0byB0YXNrbGV0ICovCisJaWYgKGVudHJ5LT50eXBlID09IENNRF9TTEVFUCkgeworCQllbnRyeS0+dHlwZSA9IENNRF9DT01QTEVURUQ7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZW50cnktPmNvbXBsKTsKKwl9IGVsc2UgaWYgKGVudHJ5LT50eXBlID09IENNRF9DQUxMQkFDSykgeworCQlpZiAoZW50cnktPmNhbGxiYWNrKQorCQkJZW50cnktPmNhbGxiYWNrKGRldiwgZW50cnktPmNvbnRleHQsIGVudHJ5LT5yZXNwMCwKKwkJCQkJZW50cnktPnJlcyk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnZhbGlkIGNvbW1hbmQgY29tcGxldGlvbiB0eXBlICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlbnRyeS0+dHlwZSk7CisJfQorCWhvc3RhcF9jbWRfcXVldWVfZnJlZShsb2NhbCwgZW50cnksIDEpOworCisJLyogaXNzdWUgbmV4dCBjb21tYW5kLCBpZiBwZW5kaW5nICovCisJZW50cnkgPSBOVUxMOworCXNwaW5fbG9jaygmbG9jYWwtPmNtZGxvY2spOworCWlmICghbGlzdF9lbXB0eSgmbG9jYWwtPmNtZF9xdWV1ZSkpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KGxvY2FsLT5jbWRfcXVldWUubmV4dCwKKwkJCQkgICBzdHJ1Y3QgaG9zdGFwX2NtZF9xdWV1ZSwgbGlzdCk7CisJCWlmIChlbnRyeS0+aXNzdWluZykgeworCQkJLyogaGZhMzg0eF9jbWQoKSBoYXMgYWxyZWFkeSBzdGFydGVkIGlzc3VpbmcgdGhpcworCQkJICogY29tbWFuZCwgc28gZG8gbm90IHN0YXJ0IGhlcmUgKi8KKwkJCWVudHJ5ID0gTlVMTDsKKwkJfQorCQlpZiAoZW50cnkpCisJCQlhdG9taWNfaW5jKCZlbnRyeS0+dXNlY250KTsKKwl9CisJc3Bpbl91bmxvY2soJmxvY2FsLT5jbWRsb2NrKTsKKworCWlmIChlbnRyeSkgeworCQkvKiBpc3N1ZSBuZXh0IGNvbW1hbmQ7IGlmIGNvbW1hbmQgaXNzdWluZyBmYWlscywgcmVtb3ZlIHRoZQorCQkgKiBlbnRyeSBmcm9tIGNtZF9xdWV1ZSAqLworCQlpbnQgcmVzID0gaGZhMzg0eF9jbWRfaXNzdWUoZGV2LCBlbnRyeSk7CisJCXNwaW5fbG9jaygmbG9jYWwtPmNtZGxvY2spOworCQlfX2hvc3RhcF9jbWRfcXVldWVfZnJlZShsb2NhbCwgZW50cnksIHJlcyk7CisJCXNwaW5fdW5sb2NrKCZsb2NhbC0+Y21kbG9jayk7CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IGhmYTM4NHhfd2FpdF9vZmZzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG9fb2ZmKQoreworCWludCB0cmllcyA9IEhGQTM4NFhfQkFQX0JVU1lfVElNRU9VVDsKKwlpbnQgcmVzID0gSEZBMzg0WF9JTlcob19vZmYpICYgSEZBMzg0WF9PRkZTRVRfQlVTWTsKKworCXdoaWxlIChyZXMgJiYgdHJpZXMgPiAwKSB7CisJCXRyaWVzLS07CisJCXVkZWxheSgxKTsKKwkJcmVzID0gSEZBMzg0WF9JTlcob19vZmYpICYgSEZBMzg0WF9PRkZTRVRfQlVTWTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworCisvKiBPZmZzZXQgbXVzdCBiZSBldmVuICovCitzdGF0aWMgaW50IGhmYTM4NHhfc2V0dXBfYmFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBiYXAsIHUxNiBpZCwKKwkJCSAgICAgaW50IG9mZnNldCkKK3sKKwl1MTYgb19vZmYsIHNfb2ZmOworCWludCByZXQgPSAwOworCisJaWYgKG9mZnNldCAlIDIgfHwgYmFwID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYmFwID09IEJBUDEpIHsKKwkJb19vZmYgPSBIRkEzODRYX09GRlNFVDFfT0ZGOworCQlzX29mZiA9IEhGQTM4NFhfU0VMRUNUMV9PRkY7CisJfSBlbHNlIHsKKwkJb19vZmYgPSBIRkEzODRYX09GRlNFVDBfT0ZGOworCQlzX29mZiA9IEhGQTM4NFhfU0VMRUNUMF9PRkY7CisJfQorCisJaWYgKGhmYTM4NHhfd2FpdF9vZmZzZXQoZGV2LCBvX29mZikpIHsKKwkJcHJpc20yX2lvX2RlYnVnX2Vycm9yKGRldiwgNyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaGZhMzg0eF9zZXR1cF9iYXAgLSB0aW1lb3V0IGJlZm9yZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gb3V0OworCX0KKworCUhGQTM4NFhfT1VUVyhpZCwgc19vZmYpOworCUhGQTM4NFhfT1VUVyhvZmZzZXQsIG9fb2ZmKTsKKworCWlmIChoZmEzODR4X3dhaXRfb2Zmc2V0KGRldiwgb19vZmYpKSB7CisJCXByaXNtMl9pb19kZWJ1Z19lcnJvcihkZXYsIDgpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGhmYTM4NHhfc2V0dXBfYmFwIC0gdGltZW91dCBhZnRlclxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gb3V0OworCX0KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCWlmIChIRkEzODRYX0lOVyhvX29mZikgJiBIRkEzODRYX09GRlNFVF9FUlIpIHsKKwkJcHJpc20yX2lvX2RlYnVnX2Vycm9yKGRldiwgOSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaGZhMzg0eF9zZXR1cF9iYXAgLSBvZmZzZXQgZXJyb3IgIgorCQkgICAgICAgIiglZCwweDA0JXgsJWQpOyByZWc9MHglMDR4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBiYXAsIGlkLCBvZmZzZXQsIEhGQTM4NFhfSU5XKG9fb2ZmKSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorI2VuZGlmCisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGhmYTM4NHhfZ2V0X3JpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgcmlkLCB2b2lkICpidWYsIGludCBsZW4sCisJCQkgICBpbnQgZXhhY3RfbGVuKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCByZXMsIHJsZW4gPSAwOworCXN0cnVjdCBoZmEzODR4X3JpZF9oZHIgcmVjOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKGxvY2FsLT5ub19wcmkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjYW5ub3QgZ2V0IFJJRCAlMDR4IChsZW49JWQpIC0gbm8gUFJJICIKKwkJICAgICAgICJmL3dcbiIsIGRldi0+bmFtZSwgcmlkLCBsZW4pOworCQlyZXR1cm4gLUVOT1RUWTsgLyogV2VsbC4uIG5vdCByZWFsbHkgY29ycmVjdCwgYnV0IHJldHVybgorCQkJCSAqIHNvbWV0aGluZyB1bmlxdWUgZW5vdWdoLi4gKi8KKwl9CisKKwlpZiAoKGxvY2FsLT5mdW5jLT5jYXJkX3ByZXNlbnQgJiYgIWxvY2FsLT5mdW5jLT5jYXJkX3ByZXNlbnQobG9jYWwpKSB8fAorCSAgICBsb2NhbC0+aHdfZG93bmxvYWRpbmcpCisJCXJldHVybiAtRU5PREVWOworCisJcmVzID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZsb2NhbC0+cmlkX2JhcF9zZW0pOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlyZXMgPSBoZmEzODR4X2NtZChkZXYsIEhGQTM4NFhfQ01EQ09ERV9BQ0NFU1MsIHJpZCwgTlVMTCwgTlVMTCk7CisJaWYgKHJlcykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGhmYTM4NHhfZ2V0X3JpZDogQ01EQ09ERV9BQ0NFU1MgZmFpbGVkICIKKwkJICAgICAgICIocmVzPSVkLCByaWQ9JTA0eCwgbGVuPSVkKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcmVzLCByaWQsIGxlbik7CisJCXVwKCZsb2NhbC0+cmlkX2JhcF9zZW0pOworCQlyZXR1cm4gcmVzOworCX0KKworCXNwaW5fbG9ja19iaCgmbG9jYWwtPmJhcGxvY2spOworCisJcmVzID0gaGZhMzg0eF9zZXR1cF9iYXAoZGV2LCBCQVAwLCByaWQsIDApOworCWlmICghcmVzKQorCQlyZXMgPSBoZmEzODR4X2Zyb21fYmFwKGRldiwgQkFQMCwgJnJlYywgc2l6ZW9mKHJlYykpOworCisJaWYgKGxlMTZfdG9fY3B1KHJlYy5sZW4pID09IDApIHsKKwkJLyogUklEIG5vdCBhdmFpbGFibGUgKi8KKwkJcmVzID0gLUVOT0RBVEE7CisJfQorCisJcmxlbiA9IChsZTE2X3RvX2NwdShyZWMubGVuKSAtIDEpICogMjsKKwlpZiAoIXJlcyAmJiBleGFjdF9sZW4gJiYgcmxlbiAhPSBsZW4pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoZmEzODR4X2dldF9yaWQgLSBSSUQgbGVuIG1pc21hdGNoOiAiCisJCSAgICAgICAicmlkPTB4JTA0eCwgbGVuPSVkIChleHBlY3RlZCAlZClcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHJpZCwgcmxlbiwgbGVuKTsKKwkJcmVzID0gLUVOT0RBVEE7CisJfQorCisJaWYgKCFyZXMpCisJCXJlcyA9IGhmYTM4NHhfZnJvbV9iYXAoZGV2LCBCQVAwLCBidWYsIGxlbik7CisKKwlzcGluX3VubG9ja19iaCgmbG9jYWwtPmJhcGxvY2spOworCXVwKCZsb2NhbC0+cmlkX2JhcF9zZW0pOworCisJaWYgKHJlcykgeworCQlpZiAocmVzICE9IC1FTk9EQVRBKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoZmEzODR4X2dldF9yaWQgKHJpZD0lMDR4LCAiCisJCQkgICAgICAgImxlbj0lZCkgLSBmYWlsZWQgLSByZXM9JWRcbiIsIGRldi0+bmFtZSwgcmlkLAorCQkJICAgICAgIGxlbiwgcmVzKTsKKwkJaWYgKHJlcyA9PSAtRVRJTUVET1VUKQorCQkJcHJpc20yX2h3X3Jlc2V0KGRldik7CisJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIHJsZW47Cit9CisKKworc3RhdGljIGludCBoZmEzODR4X3NldF9yaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHJpZCwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXN0cnVjdCBoZmEzODR4X3JpZF9oZHIgcmVjOworCWludCByZXM7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAobG9jYWwtPm5vX3ByaSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNhbm5vdCBzZXQgUklEICUwNHggKGxlbj0lZCkgLSBubyBQUkkgIgorCQkgICAgICAgImYvd1xuIiwgZGV2LT5uYW1lLCByaWQsIGxlbik7CisJCXJldHVybiAtRU5PVFRZOyAvKiBXZWxsLi4gbm90IHJlYWxseSBjb3JyZWN0LCBidXQgcmV0dXJuCisJCQkJICogc29tZXRoaW5nIHVuaXF1ZSBlbm91Z2guLiAqLworCX0KKworCWlmICgobG9jYWwtPmZ1bmMtPmNhcmRfcHJlc2VudCAmJiAhbG9jYWwtPmZ1bmMtPmNhcmRfcHJlc2VudChsb2NhbCkpIHx8CisJICAgIGxvY2FsLT5od19kb3dubG9hZGluZykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZWMucmlkID0gY3B1X3RvX2xlMTYocmlkKTsKKwkvKiBSSUQgbGVuIGluIHdvcmRzIGFuZCArMSBmb3IgcmVjLnJpZCAqLworCXJlYy5sZW4gPSBjcHVfdG9fbGUxNihsZW4gLyAyICsgbGVuICUgMiArIDEpOworCisJcmVzID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZsb2NhbC0+cmlkX2JhcF9zZW0pOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlzcGluX2xvY2tfYmgoJmxvY2FsLT5iYXBsb2NrKTsKKwlyZXMgPSBoZmEzODR4X3NldHVwX2JhcChkZXYsIEJBUDAsIHJpZCwgMCk7CisJaWYgKCFyZXMpCisJCXJlcyA9IGhmYTM4NHhfdG9fYmFwKGRldiwgQkFQMCwgJnJlYywgc2l6ZW9mKHJlYykpOworCWlmICghcmVzKQorCQlyZXMgPSBoZmEzODR4X3RvX2JhcChkZXYsIEJBUDAsIGJ1ZiwgbGVuKTsKKwlzcGluX3VubG9ja19iaCgmbG9jYWwtPmJhcGxvY2spOworCisJaWYgKHJlcykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGhmYTM4NHhfc2V0X3JpZCAocmlkPSUwNHgsIGxlbj0lZCkgLSAiCisJCSAgICAgICAiZmFpbGVkIC0gcmVzPSVkXG4iLCBkZXYtPm5hbWUsIHJpZCwgbGVuLCByZXMpOworCQl1cCgmbG9jYWwtPnJpZF9iYXBfc2VtKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlyZXMgPSBoZmEzODR4X2NtZChkZXYsIEhGQTM4NFhfQ01EQ09ERV9BQ0NFU1NfV1JJVEUsIHJpZCwgTlVMTCwgTlVMTCk7CisJdXAoJmxvY2FsLT5yaWRfYmFwX3NlbSk7CisJaWYgKHJlcykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGhmYTM4NHhfc2V0X3JpZDogQ01EQ09ERV9BQ0NFU1NfV1JJVEUgIgorCQkgICAgICAgImZhaWxlZCAocmVzPSVkLCByaWQ9JTA0eCwgbGVuPSVkKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcmVzLCByaWQsIGxlbik7CisJCXJldHVybiByZXM7CisJfQorCisJaWYgKHJlcyA9PSAtRVRJTUVET1VUKQorCQlwcmlzbTJfaHdfcmVzZXQoZGV2KTsKKworCXJldHVybiByZXM7Cit9CisKKworc3RhdGljIHZvaWQgaGZhMzg0eF9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgYW5kIGNsZWFyIGV2ZW50IHN0YXR1cyAqLworCUhGQTM4NFhfT1VUVygwLCBIRkEzODRYX0lOVEVOX09GRik7CisJSEZBMzg0WF9PVVRXKDB4ZmZmZiwgSEZBMzg0WF9FVkFDS19PRkYpOworfQorCisKK3N0YXRpYyB2b2lkIGhmYTM4NHhfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBhY2sgcGVuZGluZyBldmVudHMgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzIGZyb20gc2VsZWN0ZWQgZXZlbnRzICovCisJSEZBMzg0WF9PVVRXKDB4ZmZmZiwgSEZBMzg0WF9FVkFDS19PRkYpOworCUhGQTM4NFhfT1VUVyhIRkEzODRYX0VWRU5UX01BU0ssIEhGQTM4NFhfSU5URU5fT0ZGKTsKK30KKworCitzdGF0aWMgdm9pZCBoZmEzODR4X2V2ZW50c19ub19iYXAwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJSEZBMzg0WF9PVVRXKEhGQTM4NFhfRVZFTlRfTUFTSyAmIH5IRkEzODRYX0JBUDBfRVZFTlRTLAorCQkgICAgIEhGQTM4NFhfSU5URU5fT0ZGKTsKK30KKworCitzdGF0aWMgdm9pZCBoZmEzODR4X2V2ZW50c19hbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlIRkEzODRYX09VVFcoSEZBMzg0WF9FVkVOVF9NQVNLLCBIRkEzODRYX0lOVEVOX09GRik7Cit9CisKKworc3RhdGljIHZvaWQgaGZhMzg0eF9ldmVudHNfb25seV9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlIRkEzODRYX09VVFcoSEZBMzg0WF9FVl9DTUQsIEhGQTM4NFhfSU5URU5fT0ZGKTsKK30KKworCitzdGF0aWMgdTE2IGhmYTM4NHhfYWxsb2NhdGVfZmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBsZW4pCit7CisJdTE2IGZpZDsKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworCisJLyogRklYOiB0aGlzIGNvdWxkIGJlIHJlcGxhY2Ugd2l0aCBoZmEzODR4X2NtZCgpIGlmIHRoZSBBbGxvYyBldmVudAorCSAqIGJlbG93IHdvdWxkIGJlIGhhbmRsZWQgbGlrZSBDbWRDb21wbCBldmVudCAoc2xlZXAgaGVyZSwgd2FrZSB1cCBmcm9tCisJICogaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlpZiAoaGZhMzg0eF9jbWRfd2FpdChkZXYsIEhGQTM4NFhfQ01EQ09ERV9BTExPQywgbGVuKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNhbm5vdCBhbGxvY2F0ZSBmaWQsIGxlbj0lZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbGVuKTsKKwkJcmV0dXJuIDB4ZmZmZjsKKwl9CisKKwlkZWxheSA9IGppZmZpZXMgKyBIRkEzODRYX0FMTE9DX0NPTVBMX1RJTUVPVVQ7CisJd2hpbGUgKCEoSEZBMzg0WF9JTlcoSEZBMzg0WF9FVlNUQVRfT0ZGKSAmIEhGQTM4NFhfRVZfQUxMT0MpICYmCisJICAgICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIGRlbGF5KSkKKwkJeWllbGQoKTsKKwlpZiAoIShIRkEzODRYX0lOVyhIRkEzODRYX0VWU1RBVF9PRkYpICYgSEZBMzg0WF9FVl9BTExPQykpIHsKKwkJcHJpbnRrKCIlczogZmlkIGFsbG9jYXRlLCBsZW49JWQgLSB0aW1lb3V0XG4iLCBkZXYtPm5hbWUsIGxlbik7CisJCXJldHVybiAweGZmZmY7CisJfQorCisJZmlkID0gSEZBMzg0WF9JTlcoSEZBMzg0WF9BTExPQ0ZJRF9PRkYpOworCUhGQTM4NFhfT1VUVyhIRkEzODRYX0VWX0FMTE9DLCBIRkEzODRYX0VWQUNLX09GRik7CisKKwlyZXR1cm4gZmlkOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX3Jlc2V0X3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgcmVzOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKCFsb2NhbC0+ZGV2X2VuYWJsZWQpCisJCXJldHVybiAwOworCisJcmVzID0gaGZhMzg0eF9jbWQoZGV2LCBIRkEzODRYX0NNRENPREVfRElTQUJMRSwgMCwKKwkJCSAgTlVMTCwgTlVMTCk7CisJaWYgKHJlcykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXNldCBwb3J0IGZhaWxlZCB0byBkaXNhYmxlIHBvcnRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCWVsc2UgeworCQlyZXMgPSBoZmEzODR4X2NtZChkZXYsIEhGQTM4NFhfQ01EQ09ERV9FTkFCTEUsIDAsCisJCQkJICBOVUxMLCBOVUxMKTsKKwkJaWYgKHJlcykKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVzZXQgcG9ydCBmYWlsZWQgdG8gZW5hYmxlICIKKwkJCSAgICAgICAicG9ydFxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwkvKiBJdCBsb29rcyBsaWtlIGF0IGxlYXN0IHNvbWUgU1RBIGZpcm13YXJlIHZlcnNpb25zIHJlc2V0CisJICogZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgYmFjayB0byAyMzQ2IGFmdGVyIGVuYWJsZSBjb21tYW5kLiBSZXN0b3JlCisJICogdGhlIGNvbmZpZ3VyZWQgdmFsdWUsIGlmIGl0IGRpZmZlcnMgZnJvbSB0aGlzIGRlZmF1bHQuICovCisJaWYgKGxvY2FsLT5mcmFnbV90aHJlc2hvbGQgIT0gMjM0NiAmJgorCSAgICBob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9GUkFHTUVOVEFUSU9OVEhSRVNIT0xELAorCQkJICAgIGxvY2FsLT5mcmFnbV90aHJlc2hvbGQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIHJlc3RvcmUgZnJhZ21lbnRhdGlvbiAiCisJCSAgICAgICAidGhyZXNob2xkICglZCkgYWZ0ZXIgUG9ydDAgZW5hYmxlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBsb2NhbC0+ZnJhZ21fdGhyZXNob2xkKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2dldF92ZXJzaW9uX2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHJpZCwKKwkJCQkgICBjb25zdCBjaGFyICp0eHQpCit7CisJc3RydWN0IGhmYTM4NHhfY29tcF9pZGVudCBjb21wOworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKGxvY2FsLT5ub19wcmkpIHsKKwkJLyogUFJJIGYvdyBub3QgeWV0IGF2YWlsYWJsZSAtIGNhbm5vdCByZWFkIFJJRHMgKi8KKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoaGZhMzg0eF9nZXRfcmlkKGRldiwgcmlkLCAmY29tcCwgc2l6ZW9mKGNvbXApLCAxKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBnZXQgUklEIGZvciBjb21wb25lbnQgJXNcbiIsIHR4dCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXM6IGlkPTB4JTAyeCB2JWQuJWQuJWRcbiIsIGRldi0+bmFtZSwgdHh0LAorCSAgICAgICBfX2xlMTZfdG9fY3B1KGNvbXAuaWQpLCBfX2xlMTZfdG9fY3B1KGNvbXAubWFqb3IpLAorCSAgICAgICBfX2xlMTZfdG9fY3B1KGNvbXAubWlub3IpLCBfX2xlMTZfdG9fY3B1KGNvbXAudmFyaWFudCkpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX3NldHVwX3JpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1MTYgdG1wOworCWludCByZXQgPSAwOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfVElDS1RJTUUsIDIwMDApOworCisJaWYgKCFsb2NhbC0+ZndfYXApIHsKKwkJdG1wID0gaG9zdGFwX2dldF9wb3J0dHlwZShsb2NhbCk7CisJCXJldCA9IGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX0NORlBPUlRUWVBFLCB0bXApOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoIiVzOiBQb3J0IHR5cGUgc2V0dGluZyB0byAlZCBmYWlsZWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCB0bXApOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJLyogU2V0dGluZyBTU0lEIHRvIGVtcHR5IHN0cmluZyBzZWVtcyB0byBraWxsIHRoZSBjYXJkIGluIEhvc3QgQVAgbW9kZQorCSAqLworCWlmIChsb2NhbC0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUiB8fCBsb2NhbC0+ZXNzaWRbMF0gIT0gJ1wwJykgeworCQlyZXQgPSBob3N0YXBfc2V0X3N0cmluZyhkZXYsIEhGQTM4NFhfUklEX0NORk9XTlNTSUQsCisJCQkJCWxvY2FsLT5lc3NpZCk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50aygiJXM6IEFQIG93biBTU0lEIHNldHRpbmcgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJcmV0ID0gaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GTUFYREFUQUxFTiwKKwkJCSAgICAgIFBSSVNNMl9EQVRBX01BWExFTik7CisJaWYgKHJldCkgeworCQlwcmludGsoIiVzOiBNQUMgZGF0YSBsZW5ndGggc2V0dGluZyB0byAlZCBmYWlsZWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIFBSSVNNMl9EQVRBX01BWExFTik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoaGZhMzg0eF9nZXRfcmlkKGRldiwgSEZBMzg0WF9SSURfQ0hBTk5FTExJU1QsICZ0bXAsIDIsIDEpIDwgMCkgeworCQlwcmludGsoIiVzOiBDaGFubmVsIGxpc3QgcmVhZCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisJbG9jYWwtPmNoYW5uZWxfbWFzayA9IF9fbGUxNl90b19jcHUodG1wKTsKKworCWlmIChsb2NhbC0+Y2hhbm5lbCA8IDEgfHwgbG9jYWwtPmNoYW5uZWwgPiAxNCB8fAorCSAgICAhKGxvY2FsLT5jaGFubmVsX21hc2sgJiAoMSA8PCAobG9jYWwtPmNoYW5uZWwgLSAxKSkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDaGFubmVsIHNldHRpbmcgb3V0IG9mIHJhbmdlICIKKwkJICAgICAgICIoJWQpIVxuIiwgZGV2LT5uYW1lLCBsb2NhbC0+Y2hhbm5lbCk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX0NORk9XTkNIQU5ORUwsIGxvY2FsLT5jaGFubmVsKTsKKwlpZiAocmV0KSB7CisJCXByaW50aygiJXM6IENoYW5uZWwgc2V0dGluZyB0byAlZCBmYWlsZWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGxvY2FsLT5jaGFubmVsKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX0NORkJFQUNPTklOVCwKKwkJCSAgICAgIGxvY2FsLT5iZWFjb25faW50KTsKKwlpZiAocmV0KSB7CisJCXByaW50aygiJXM6IEJlYWNvbiBpbnRlcnZhbCBzZXR0aW5nIHRvICVkIGZhaWxlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbG9jYWwtPmJlYWNvbl9pbnQpOworCQkvKiB0aGlzIG1heSBmYWlsIHdpdGggU3ltYm9sL0x1Y2VudCBmaXJtd2FyZSAqLworCQlpZiAocmV0ID09IC1FVElNRURPVVQpCisJCQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0gaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GT1dORFRJTVBFUklPRCwKKwkJCSAgICAgIGxvY2FsLT5kdGltX3BlcmlvZCk7CisJaWYgKHJldCkgeworCQlwcmludGsoIiVzOiBEVElNIHBlcmlvZCBzZXR0aW5nIHRvICVkIGZhaWxlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbG9jYWwtPmR0aW1fcGVyaW9kKTsKKwkJLyogdGhpcyBtYXkgZmFpbCB3aXRoIFN5bWJvbC9MdWNlbnQgZmlybXdhcmUgKi8KKwkJaWYgKHJldCA9PSAtRVRJTUVET1VUKQorCQkJZ290byBmYWlsOworCX0KKworCXJldCA9IGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX1BST01JU0NVT1VTTU9ERSwKKwkJCSAgICAgIGxvY2FsLT5pc19wcm9taXNjKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9JTkZPICIlczogU2V0dGluZyBwcm9taXNjdW91cyBtb2RlICglZCkgZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBsb2NhbC0+aXNfcHJvbWlzYyk7CisKKwlpZiAoIWxvY2FsLT5md19hcCkgeworCQlyZXQgPSBob3N0YXBfc2V0X3N0cmluZyhkZXYsIEhGQTM4NFhfUklEX0NORkRFU0lSRURTU0lELAorCQkJCQlsb2NhbC0+ZXNzaWQpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoIiVzOiBEZXNpcmVkIFNTSUQgc2V0dGluZyBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwkvKiBTZXR1cCBUWFJhdGVDb250cm9sLCBkZWZhdWx0cyB0byBhbGxvdyB1c2Ugb2YgMSwgMiwgNS41LCBhbmQKKwkgKiAxMSBNYnBzIGluIGF1dG9tYXRpYyBUWCByYXRlIGZhbGxiYWNrIGFuZCAxIGFuZCAyIE1icHMgYXMgYmFzaWMKKwkgKiByYXRlcyAqLworCWlmIChsb2NhbC0+dHhfcmF0ZV9jb250cm9sID09IDApIHsKKwkJbG9jYWwtPnR4X3JhdGVfY29udHJvbCA9CisJCQlIRkEzODRYX1JBVEVTXzFNQlBTIHwKKwkJCUhGQTM4NFhfUkFURVNfMk1CUFMgfAorCQkJSEZBMzg0WF9SQVRFU181TUJQUyB8CisJCQlIRkEzODRYX1JBVEVTXzExTUJQUzsKKwl9CisJaWYgKGxvY2FsLT5iYXNpY19yYXRlcyA9PSAwKQorCQlsb2NhbC0+YmFzaWNfcmF0ZXMgPSBIRkEzODRYX1JBVEVTXzFNQlBTIHwgSEZBMzg0WF9SQVRFU18yTUJQUzsKKworCWlmICghbG9jYWwtPmZ3X2FwKSB7CisJCXJldCA9IGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX1RYUkFURUNPTlRST0wsCisJCQkJICAgICAgbG9jYWwtPnR4X3JhdGVfY29udHJvbCk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50aygiJXM6IFRYUmF0ZUNvbnRyb2wgc2V0dGluZyB0byAlZCBmYWlsZWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBsb2NhbC0+dHhfcmF0ZV9jb250cm9sKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXJldCA9IGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX0NORlNVUFBPUlRFRFJBVEVTLAorCQkJCSAgICAgIGxvY2FsLT50eF9yYXRlX2NvbnRyb2wpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoIiVzOiBjbmZTdXBwb3J0ZWRSYXRlcyBzZXR0aW5nIHRvICVkIGZhaWxlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGxvY2FsLT50eF9yYXRlX2NvbnRyb2wpOworCQl9CisKKwkJcmV0ID0gaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GQkFTSUNSQVRFUywKKwkJCQkgICAgICBsb2NhbC0+YmFzaWNfcmF0ZXMpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoIiVzOiBjbmZCYXNpY1JhdGVzIHNldHRpbmcgdG8gJWQgZmFpbGVkXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgbG9jYWwtPmJhc2ljX3JhdGVzKTsKKwkJfQorCisJCXJldCA9IGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX0NSRUFURUlCU1MsIDEpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoIiVzOiBDcmVhdGUgSUJTUyBzZXR0aW5nIHRvIDEgZmFpbGVkXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCX0KKwl9CisKKwlpZiAobG9jYWwtPm5hbWVfc2V0KQorCQkodm9pZCkgaG9zdGFwX3NldF9zdHJpbmcoZGV2LCBIRkEzODRYX1JJRF9DTkZPV05OQU1FLAorCQkJCQkgbG9jYWwtPm5hbWUpOworCisJaWYgKGhvc3RhcF9zZXRfZW5jcnlwdGlvbihsb2NhbCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvdWxkIG5vdCBjb25maWd1cmUgZW5jcnlwdGlvblxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJfQorCisJKHZvaWQpIGhvc3RhcF9zZXRfYW50c2VsKGxvY2FsKTsKKworCWlmIChob3N0YXBfc2V0X3JvYW1pbmcobG9jYWwpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb3VsZCBub3Qgc2V0IGhvc3Qgcm9hbWluZ1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJfQorCisJaWYgKGxvY2FsLT5zdGFfZndfdmVyID49IFBSSVNNMl9GV19WRVIoMSw2LDMpICYmCisJICAgIGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX0NORkVOSFNFQ1VSSVRZLCBsb2NhbC0+ZW5oX3NlYykpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjbmZFbmhTZWN1cml0eSBzZXR0aW5nIHRvIDB4JXggZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBsb2NhbC0+ZW5oX3NlYyk7CisKKwkvKiAzMi1iaXQgdGFsbGllcyB3ZXJlIGFkZGVkIGluIFNUQSBmL3cgMC44LjAsIGJ1dCB0aGV5IHdlcmUgYXBwYXJlbnRseQorCSAqIG5vdCB3b3JraW5nIGNvcnJlY3RseSAobGFzdCBzZXZlbiBjb3VudGVycyByZXBvcnQgYm9ndXMgdmFsdWVzKS4KKwkgKiBUaGlzIGhhcyBiZWVuIGZpeGVkIGluIDAuOC4yLCBzbyBlbmFibGUgMzItYml0IHRhbGxpZXMgb25seQorCSAqIGJlZ2lubmluZyB3aXRoIHRoYXQgZmlybXdhcmUgdmVyc2lvbi4gQW5vdGhlciBidWcgZml4IGZvciAzMi1iaXQKKwkgKiB0YWxsaWVzIGluIDEuNC4wOyBzaG91bGQgMTYtYml0IHRhbGxpZXMgYmUgdXNlZCBmb3Igc29tZSBvdGhlcgorCSAqIHZlcnNpb25zLCB0b28/ICovCisJaWYgKGxvY2FsLT5zdGFfZndfdmVyID49IFBSSVNNMl9GV19WRVIoMCw4LDIpKSB7CisJCWlmIChob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZUSElSVFkyVEFMTFksIDEpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY25mVGhpcnR5MlRhbGx5IHNldHRpbmcgIgorCQkJICAgICAgICJmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCQlsb2NhbC0+dGFsbGllczMyID0gMDsKKwkJfSBlbHNlCisJCQlsb2NhbC0+dGFsbGllczMyID0gMTsKKwl9IGVsc2UKKwkJbG9jYWwtPnRhbGxpZXMzMiA9IDA7CisKKwlob3N0YXBfc2V0X2F1dGhfYWxncyhsb2NhbCk7CisKKwlpZiAoaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfRlJBR01FTlRBVElPTlRIUkVTSE9MRCwKKwkJCSAgICBsb2NhbC0+ZnJhZ21fdGhyZXNob2xkKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogc2V0dGluZyBGcmFnbWVudGF0aW9uVGhyZXNob2xkIHRvICVkICIKKwkJICAgICAgICJmYWlsZWRcbiIsIGRldi0+bmFtZSwgbG9jYWwtPmZyYWdtX3RocmVzaG9sZCk7CisJfQorCisJaWYgKGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX1JUU1RIUkVTSE9MRCwKKwkJCSAgICBsb2NhbC0+cnRzX3RocmVzaG9sZCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNldHRpbmcgUlRTVGhyZXNob2xkIHRvICVkIGZhaWxlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbG9jYWwtPnJ0c190aHJlc2hvbGQpOworCX0KKworCWlmIChsb2NhbC0+bWFudWFsX3JldHJ5X2NvdW50ID49IDAgJiYKKwkgICAgaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GQUxUUkVUUllDT1VOVCwKKwkJCSAgICBsb2NhbC0+bWFudWFsX3JldHJ5X2NvdW50KSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogc2V0dGluZyBjbmZBbHRSZXRyeUNvdW50IHRvICVkIGZhaWxlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbG9jYWwtPm1hbnVhbF9yZXRyeV9jb3VudCk7CisJfQorCisJaWYgKGxvY2FsLT5zdGFfZndfdmVyID49IFBSSVNNMl9GV19WRVIoMSwzLDEpICYmCisJICAgIGhmYTM4NHhfZ2V0X3JpZChkZXYsIEhGQTM4NFhfUklEX0NORkRCTUFESlVTVCwgJnRtcCwgMiwgMSkgPT0gMikgeworCQlsb2NhbC0+cnNzaV90b19kQm0gPSBsZTE2X3RvX2NwdSh0bXApOworCX0KKworCWlmIChsb2NhbC0+c3RhX2Z3X3ZlciA+PSBQUklTTTJfRldfVkVSKDEsNywwKSAmJiBsb2NhbC0+d3BhICYmCisJICAgIGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX1NTTkhBTkRMSU5HTU9ERSwgMSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNldHRpbmcgc3NuSGFuZGxpbmdNb2RlIHRvIDEgZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwl9CisKKwlpZiAobG9jYWwtPnN0YV9md192ZXIgPj0gUFJJU00yX0ZXX1ZFUigxLDcsMCkgJiYgbG9jYWwtPmdlbmVyaWNfZWxlbSAmJgorCSAgICBoZmEzODR4X3NldF9yaWQoZGV2LCBIRkEzODRYX1JJRF9HRU5FUklDRUxFTUVOVCwKKwkJCSAgICBsb2NhbC0+Z2VuZXJpY19lbGVtLCBsb2NhbC0+Z2VuZXJpY19lbGVtX2xlbikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNldHRpbmcgZ2VuZXJpY0VsZW1lbnQgZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwl9CisKKyBmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaHdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5pdGlhbCkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgcmV0LCBmaXJzdCA9IDE7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgZGVsYXk7CisKKwlQREVCVUcoREVCVUdfRkxPVywgInByaXNtMl9od19pbml0KClcbiIpOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJY2xlYXJfYml0KEhPU1RBUF9CSVRTX1RSQU5TTUlULCAmbG9jYWwtPmJpdHMpOworCisgaW5pdDoKKwkvKiBpbml0aWFsaXplIEhGQSAzODR4ICovCisJcmV0ID0gaGZhMzg0eF9jbWRfbm9fd2FpdChkZXYsIEhGQTM4NFhfQ01EQ09ERV9JTklULCAwKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBmaXJzdCBjb21tYW5kIGZhaWxlZCAtIGFzc3VtaW5nIGNhcmQgIgorCQkgICAgICAgImRvZXMgbm90IGhhdmUgcHJpbWFyeSBmaXJtd2FyZVxuIiwgZGV2X2luZm8pOworCX0KKworCWlmIChmaXJzdCAmJiAoSEZBMzg0WF9JTlcoSEZBMzg0WF9FVlNUQVRfT0ZGKSAmIEhGQTM4NFhfRVZfQ01EKSkgeworCQkvKiBFdlN0YXQgaGFzIENtZCBiaXQgc2V0IGluIHNvbWUgY2FzZXMsIHNvIHJldHJ5IG9uY2UgaWYgbm8KKwkJICogd2FpdCB3YXMgbmVlZGVkICovCisJCUhGQTM4NFhfT1VUVyhIRkEzODRYX0VWX0NNRCwgSEZBMzg0WF9FVkFDS19PRkYpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGluaXQgY29tbWFuZCBjb21wbGV0ZWQgdG9vIHF1aWNrbHkgLSAiCisJCSAgICAgICAicmV0cnlpbmdcbiIsIGRldi0+bmFtZSk7CisJCWZpcnN0ID0gMDsKKwkJZ290byBpbml0OworCX0KKworCXN0YXJ0ID0gamlmZmllczsKKwlkZWxheSA9IGppZmZpZXMgKyBIRkEzODRYX0lOSVRfVElNRU9VVDsKKwl3aGlsZSAoIShIRkEzODRYX0lOVyhIRkEzODRYX0VWU1RBVF9PRkYpICYgSEZBMzg0WF9FVl9DTUQpICYmCisJICAgICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIGRlbGF5KSkKKwkJeWllbGQoKTsKKwlpZiAoIShIRkEzODRYX0lOVyhIRkEzODRYX0VWU1RBVF9PRkYpICYgSEZBMzg0WF9FVl9DTUQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogYXNzdW1pbmcgbm8gUHJpbWFyeSBpbWFnZSBpbiAiCisJCSAgICAgICAiZmxhc2ggLSBjYXJkIGluaXRpYWxpemF0aW9uIG5vdCBjb21wbGV0ZWRcbiIsCisJCSAgICAgICBkZXZfaW5mbyk7CisJCWxvY2FsLT5ub19wcmkgPSAxOworI2lmZGVmIFBSSVNNMl9ET1dOTE9BRF9TVVBQT1JUCisJCQlpZiAobG9jYWwtPnNyYW1fdHlwZSA9PSAtMSkKKwkJCQlsb2NhbC0+c3JhbV90eXBlID0gcHJpc20yX2dldF9yYW1fc2l6ZShsb2NhbCk7CisjZW5kaWYgLyogUFJJU00yX0RPV05MT0FEX1NVUFBPUlQgKi8KKwkJcmV0dXJuIDE7CisJfQorCWxvY2FsLT5ub19wcmkgPSAwOworCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTJfaHdfaW5pdDogaW5pdGlhbGl6ZWQgaW4gJWx1IG1zXG4iLAorCSAgICAgICAoamlmZmllcyAtIHN0YXJ0KSAqIDEwMDAgLyBIWik7CisJSEZBMzg0WF9PVVRXKEhGQTM4NFhfRVZfQ01ELCBIRkEzODRYX0VWQUNLX09GRik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaHdfaW5pdDIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluaXRpYWwpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJaW50IGk7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKyNpZmRlZiBQUklTTTJfRE9XTkxPQURfU1VQUE9SVAorCWtmcmVlKGxvY2FsLT5wZGEpOworCWlmIChsb2NhbC0+bm9fcHJpKQorCQlsb2NhbC0+cGRhID0gTlVMTDsKKwllbHNlCisJCWxvY2FsLT5wZGEgPSBwcmlzbTJfcmVhZF9wZGEoZGV2KTsKKyNlbmRpZiAvKiBQUklTTTJfRE9XTkxPQURfU1VQUE9SVCAqLworCisJaGZhMzg0eF9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJSEZBMzg0WF9PVVRXKEhGQTM4NFhfTUFHSUMsIEhGQTM4NFhfU1dTVVBQT1JUMF9PRkYpOworCWlmIChIRkEzODRYX0lOVyhIRkEzODRYX1NXU1VQUE9SVDBfT0ZGKSAhPSBIRkEzODRYX01BR0lDKSB7CisJCXByaW50aygiU1dTVVBQT1JUMCB3cml0ZS9yZWFkIGZhaWxlZDogJTA0WCAhPSAlMDRYXG4iLAorCQkgICAgICAgSEZBMzg0WF9JTlcoSEZBMzg0WF9TV1NVUFBPUlQwX09GRiksIEhGQTM4NFhfTUFHSUMpOworCQlnb3RvIGZhaWxlZDsKKwl9CisjZW5kaWYKKworCWlmIChpbml0aWFsIHx8IGxvY2FsLT5wcmlfb25seSkgeworCQloZmEzODR4X2V2ZW50c19vbmx5X2NtZChkZXYpOworCQkvKiBnZXQgY2FyZCB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisJCWlmIChwcmlzbTJfZ2V0X3ZlcnNpb25faW5mbyhkZXYsIEhGQTM4NFhfUklEX05JQ0lELCAiTklDIikgfHwKKwkJICAgIHByaXNtMl9nZXRfdmVyc2lvbl9pbmZvKGRldiwgSEZBMzg0WF9SSURfUFJJSUQsICJQUkkiKSkgeworCQkJaGZhMzg0eF9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisKKwkJaWYgKHByaXNtMl9nZXRfdmVyc2lvbl9pbmZvKGRldiwgSEZBMzg0WF9SSURfU1RBSUQsICJTVEEiKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBGYWlsZWQgdG8gcmVhZCBTVEEgZi93IHZlcnNpb24gIgorCQkJICAgICAgICItIG9ubHkgUHJpbWFyeSBmL3cgcHJlc2VudFxuIiwgZGV2LT5uYW1lKTsKKwkJCWxvY2FsLT5wcmlfb25seSA9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsb2NhbC0+cHJpX29ubHkgPSAwOworCQloZmEzODR4X2Rpc2FibGVfaW50ZXJydXB0cyhkZXYpOworCX0KKworCS8qIEZJWDogY291bGQgY29udmVydCBhbGxvY2F0ZV9maWQgdG8gdXNlIHNsZWVwaW5nIENtZENvbXBsIHdhaXQgYW5kCisJICogZW5hYmxlIGludGVycnVwdHMgYmVmb3JlIHRoaXMuIFRoaXMgd291bGQgYWxzbyByZXF1aXJlIHNvbWUgc29ydCBvZgorCSAqIHNsZWVwaW5nIEFsbG9jRXYgd2FpdGluZyAqLworCisJLyogYWxsb2NhdGUgVFggRklEcyAqLworCWxvY2FsLT50eGZpZF9sZW4gPSBQUklTTTJfVFhGSURfTEVOOworCWZvciAoaSA9IDA7IGkgPCBQUklTTTJfVFhGSURfQ09VTlQ7IGkrKykgeworCQlsb2NhbC0+dHhmaWRbaV0gPSBoZmEzODR4X2FsbG9jYXRlX2ZpZChkZXYsIGxvY2FsLT50eGZpZF9sZW4pOworCQlpZiAobG9jYWwtPnR4ZmlkW2ldID09IDB4ZmZmZiAmJiBsb2NhbC0+dHhmaWRfbGVuID4gMTYwMCkgeworCQkJbG9jYWwtPnR4ZmlkW2ldID0gaGZhMzg0eF9hbGxvY2F0ZV9maWQoZGV2LCAxNjAwKTsKKwkJCWlmIChsb2NhbC0+dHhmaWRbaV0gIT0gMHhmZmZmKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBVc2luZyBzaG9ydGVyIFRYIEZJRCAiCisJCQkJICAgICAgICIoMTYwMCBieXRlcylcbiIsIGRldi0+bmFtZSk7CisJCQkJbG9jYWwtPnR4ZmlkX2xlbiA9IDE2MDA7CisJCQl9CisJCX0KKwkJaWYgKGxvY2FsLT50eGZpZFtpXSA9PSAweGZmZmYpCisJCQlnb3RvIGZhaWxlZDsKKwkJbG9jYWwtPmludHJhbnNtaXRmaWRbaV0gPSBQUklTTTJfVFhGSURfRU1QVFk7CisJfQorCisJaGZhMzg0eF9ldmVudHNfb25seV9jbWQoZGV2KTsKKworCWlmIChpbml0aWFsKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwkJcHJpc20yX2NoZWNrX3N0YV9md192ZXJzaW9uKGxvY2FsKTsKKworCQlpZiAoaGZhMzg0eF9nZXRfcmlkKGRldiwgSEZBMzg0WF9SSURfQ05GT1dOTUFDQUREUiwKKwkJCQkgICAgJmRldi0+ZGV2X2FkZHIsIDYsIDEpIDwgMCkgeworCQkJcHJpbnRrKCIlczogY291bGQgbm90IGdldCBvd24gTUFDIGFkZHJlc3NcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJfQorCQlsaXN0X2Zvcl9lYWNoKHB0ciwgJmxvY2FsLT5ob3N0YXBfaW50ZXJmYWNlcykgeworCQkJaWZhY2UgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UsIGxpc3QpOworCQkJbWVtY3B5KGlmYWNlLT5kZXYtPmRldl9hZGRyLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCX0KKwl9IGVsc2UgaWYgKGxvY2FsLT5md19hcCkKKwkJcHJpc20yX2NoZWNrX3N0YV9md192ZXJzaW9uKGxvY2FsKTsKKworCXByaXNtMl9zZXR1cF9yaWRzKGRldik7CisKKwkvKiBNQUMgaXMgbm93IGNvbmZpZ3VyZWQsIGJ1dCBwb3J0IDAgaXMgbm90IHlldCBlbmFibGVkICovCisJcmV0dXJuIDA7CisKKyBmYWlsZWQ6CisJaWYgKCFsb2NhbC0+bm9fcHJpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLCBkZXZfaW5mbyk7CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaHdfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbml0aWFsKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCB3YXNfcmVzZXR0aW5nOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCXdhc19yZXNldHRpbmcgPSBsb2NhbC0+aHdfcmVzZXR0aW5nOworCisJaWYgKGhmYTM4NHhfY21kKGRldiwgSEZBMzg0WF9DTURDT0RFX0VOQUJMRSwgMCwgTlVMTCwgTlVMTCkpIHsKKwkJcHJpbnRrKCIlczogTUFDIHBvcnQgMCBlbmFibGluZyBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWxvY2FsLT5od19yZWFkeSA9IDE7CisJbG9jYWwtPmh3X3Jlc2V0X3RyaWVzID0gMDsKKwlsb2NhbC0+aHdfcmVzZXR0aW5nID0gMDsKKwloZmEzODR4X2VuYWJsZV9pbnRlcnJ1cHRzKGRldik7CisKKwkvKiBhdCBsZWFzdCBELUxpbmsgRFdMLTY1MCBzZWVtcyB0byByZXF1aXJlIGFkZGl0aW9uYWwgcG9ydCByZXNldAorCSAqIGJlZm9yZSBpdCBzdGFydHMgYWN0aW5nIGFzIGFuIEFQLCBzbyByZXNldCBwb3J0IGF1dG9tYXRpY2FsbHkKKwkgKiBoZXJlIGp1c3QgaW4gY2FzZSAqLworCWlmIChpbml0aWFsICYmIHByaXNtMl9yZXNldF9wb3J0KGRldikpIHsKKwkJcHJpbnRrKCIlczogTUFDIHBvcnQgMCByZXNldGluZyBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWlmICh3YXNfcmVzZXR0aW5nICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQkvKiBJZiBod19yZXNldCgpIHdhcyBjYWxsZWQgZHVyaW5nIHBlbmRpbmcgdHJhbnNtaXQsIG5ldGlmCisJCSAqIHF1ZXVlIHdhcyBzdG9wcGVkLiBXYWtlIGl0IHVwIG5vdyBzaW5jZSB0aGUgd2xhbiBjYXJkIGhhcworCQkgKiBiZWVuIHJlc2V0dGVkLiAqLworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaHdfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbml0aWFsKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKGxvY2FsLT5od19kb3dubG9hZGluZykKKwkJcmV0dXJuIDE7CisKKwlpZiAocHJpc20yX2h3X2luaXQoZGV2LCBpbml0aWFsKSkgeworCQlyZXR1cm4gbG9jYWwtPm5vX3ByaSA/IDAgOiAxOworCX0KKworCWlmIChwcmlzbTJfaHdfaW5pdDIoZGV2LCBpbml0aWFsKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBFbmFibGUgZmlybXdhcmUgaWYgc2Vjb25kYXJ5IGltYWdlIGlzIGxvYWRlZCBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZQorCSAqIG5ldGRldmljZXMgaXMgdXAuICovCisJaWYgKCFsb2NhbC0+cHJpX29ubHkgJiYKKwkgICAgKGluaXRpYWwgPT0gMCB8fCAoaW5pdGlhbCA9PSAyICYmIGxvY2FsLT5udW1fZGV2X29wZW4gPiAwKSkpIHsKKwkJaWYgKCFsb2NhbC0+ZGV2X2VuYWJsZWQpCisJCQlwcmlzbTJfY2FsbGJhY2sobG9jYWwsIFBSSVNNMl9DQUxMQkFDS19FTkFCTEUpOworCQlsb2NhbC0+ZGV2X2VuYWJsZWQgPSAxOworCQlyZXR1cm4gcHJpc20yX2h3X2VuYWJsZShkZXYsIGluaXRpYWwpOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl9od19zaHV0ZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbm9fZGlzYWJsZSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCS8qIEFsbG93IG9ubHkgY29tbWFuZCBjb21wbGV0aW9uIGV2ZW50cyBkdXJpbmcgZGlzYWJsZSAqLworCWhmYTM4NHhfZXZlbnRzX29ubHlfY21kKGRldik7CisKKwlsb2NhbC0+aHdfcmVhZHkgPSAwOworCWlmIChsb2NhbC0+ZGV2X2VuYWJsZWQpCisJCXByaXNtMl9jYWxsYmFjayhsb2NhbCwgUFJJU00yX0NBTExCQUNLX0RJU0FCTEUpOworCWxvY2FsLT5kZXZfZW5hYmxlZCA9IDA7CisKKwlpZiAobG9jYWwtPmZ1bmMtPmNhcmRfcHJlc2VudCAmJiAhbG9jYWwtPmZ1bmMtPmNhcmRfcHJlc2VudChsb2NhbCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjYXJkIGFscmVhZHkgcmVtb3ZlZCBvciBub3QgY29uZmlndXJlZCAiCisJCSAgICAgICAiZHVyaW5nIHNodXRkb3duXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKChub19kaXNhYmxlICYgSE9TVEFQX0hXX05PX0RJU0FCTEUpID09IDAgJiYKKwkgICAgaGZhMzg0eF9jbWQoZGV2LCBIRkEzODRYX0NNRENPREVfRElTQUJMRSwgMCwgTlVMTCwgTlVMTCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTaHV0ZG93biBmYWlsZWRcbiIsIGRldl9pbmZvKTsKKworCWhmYTM4NHhfZGlzYWJsZV9pbnRlcnJ1cHRzKGRldik7CisKKwlpZiAobm9fZGlzYWJsZSAmIEhPU1RBUF9IV19FTkFCTEVfQ01EQ09NUEwpCisJCWhmYTM4NHhfZXZlbnRzX29ubHlfY21kKGRldik7CisJZWxzZQorCQlwcmlzbTJfY2xlYXJfY21kX3F1ZXVlKGxvY2FsKTsKK30KKworCitzdGF0aWMgdm9pZCBwcmlzbTJfaHdfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKworI2lmIDAKKwlzdGF0aWMgbG9uZyBsYXN0X3Jlc2V0ID0gMDsKKworCS8qIGRvIG5vdCByZXNldCBjYXJkIG1vcmUgdGhhbiBvbmNlIHBlciBzZWNvbmQgdG8gYXZvaWQgZW5kaW5nIHVwIGluIGEKKwkgKiBidXN5IGxvb3AgcmVzZXRpbmcgdGhlIGNhcmQgKi8KKwlpZiAodGltZV9iZWZvcmVfZXEoamlmZmllcywgbGFzdF9yZXNldCArIEhaKSkKKwkJcmV0dXJuOworCWxhc3RfcmVzZXQgPSBqaWZmaWVzOworI2VuZGlmCisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAoaW5faW50ZXJydXB0KCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkcml2ZXIgYnVnIC0gcHJpc20yX2h3X3Jlc2V0KCkgY2FsbGVkICIKKwkJICAgICAgICJpbiBpbnRlcnJ1cHQgY29udGV4dFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChsb2NhbC0+aHdfZG93bmxvYWRpbmcpCisJCXJldHVybjsKKworCWlmIChsb2NhbC0+aHdfcmVzZXR0aW5nKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlczogYWxyZWFkeSByZXNldHRpbmcgY2FyZCAtICIKKwkJICAgICAgICJpZ25vcmluZyByZXNldCByZXF1ZXN0XG4iLCBkZXZfaW5mbywgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWxvY2FsLT5od19yZXNldF90cmllcysrOworCWlmIChsb2NhbC0+aHdfcmVzZXRfdHJpZXMgPiAxMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdG9vIG1hbnkgcmVzZXQgdHJpZXMsIHNraXBwaW5nXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlczogcmVzZXR0aW5nIGNhcmRcbiIsIGRldl9pbmZvLCBkZXYtPm5hbWUpOworCWhmYTM4NHhfZGlzYWJsZV9pbnRlcnJ1cHRzKGRldik7CisJbG9jYWwtPmh3X3Jlc2V0dGluZyA9IDE7CisJaWYgKGxvY2FsLT5mdW5jLT5jb3Jfc3Jlc2V0KSB7CisJCS8qIEhvc3Qgc3lzdGVtIHNlZW1zIHRvIGhhbmcgaW4gc29tZSBjYXNlcyB3aXRoIGhpZ2ggdHJhZmZpYworCQkgKiBsb2FkIG9yIHNoYXJlZCBpbnRlcnJ1cHRzIGR1cmluZyBDT1Igc3Jlc2V0LiBEaXNhYmxlIHNoYXJlZAorCQkgKiBpbnRlcnJ1cHRzIGR1cmluZyByZXNldCB0byBhdm9pZCB0aGVzZSBjcmFzaGVzLiBDT1Mgc3Jlc2V0CisJCSAqIHRha2VzIHF1aXRlIGEgbG9uZyB0aW1lLCBzbyBpdCBpcyB1bmZvcnR1bmF0ZSB0aGF0IHRoaXMKKwkJICogc2VlbXMgdG8gYmUgbmVlZGVkLiBBbnl3YXksIEkgZG8gbm90IGtub3cgb2YgYW55IGJldHRlciB3YXkKKwkJICogb2YgYXZvaWRpbmcgdGhlIGNyYXNoLiAqLworCQlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJCWxvY2FsLT5mdW5jLT5jb3Jfc3Jlc2V0KGxvY2FsKTsKKwkJZW5hYmxlX2lycShkZXYtPmlycSk7CisJfQorCXByaXNtMl9od19zaHV0ZG93bihkZXYsIDEpOworCXByaXNtMl9od19jb25maWcoZGV2LCAwKTsKKwlsb2NhbC0+aHdfcmVzZXR0aW5nID0gMDsKKworI2lmZGVmIFBSSVNNMl9ET1dOTE9BRF9TVVBQT1JUCisJaWYgKGxvY2FsLT5kbF9wcmkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwZXJzaXN0ZW50IGRvd25sb2FkIG9mIHByaW1hcnkgIgorCQkgICAgICAgImZpcm13YXJlXG4iLCBkZXYtPm5hbWUpOworCQlpZiAocHJpc20yX2Rvd25sb2FkX2dlbmVzaXMobG9jYWwsIGxvY2FsLT5kbF9wcmkpIDwgMCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkb3dubG9hZCAoUFJJKSBmYWlsZWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwl9CisKKwlpZiAobG9jYWwtPmRsX3NlYykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBlcnNpc3RlbnQgZG93bmxvYWQgb2Ygc2Vjb25kYXJ5ICIKKwkJICAgICAgICJmaXJtd2FyZVxuIiwgZGV2LT5uYW1lKTsKKwkJaWYgKHByaXNtMl9kb3dubG9hZF92b2xhdGlsZShsb2NhbCwgbG9jYWwtPmRsX3NlYykgPCAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRvd25sb2FkIChTRUMpIGZhaWxlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCX0KKyNlbmRpZiAvKiBQUklTTTJfRE9XTkxPQURfU1VQUE9SVCAqLworCisJLyogVE9ETzogcmVzdG9yZSBiZWFjb24gVElNIGJpdHMgZm9yIFNUQXMgdGhhdCBoYXZlIGJ1ZmZlcmVkIGZyYW1lcyAqLworfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl9zY2hlZHVsZV9yZXNldChsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXNjaGVkdWxlX3dvcmsoJmxvY2FsLT5yZXNldF9xdWV1ZSk7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgc2NoZWR1bGVkIHRhc2sgYWZ0ZXIgbm90aWNpbmcgY2FyZCB0aW1lb3V0IGluIGludGVycnVwdAorICogY29udGV4dCAqLworc3RhdGljIHZvaWQgaGFuZGxlX3Jlc2V0X3F1ZXVlKHZvaWQgKmRhdGEpCit7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IChsb2NhbF9pbmZvX3QgKikgZGF0YTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogc2NoZWR1bGVkIGNhcmQgcmVzZXRcbiIsIGxvY2FsLT5kZXYtPm5hbWUpOworCXByaXNtMl9od19yZXNldChsb2NhbC0+ZGV2KTsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGxvY2FsLT5kZXYpKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBQUklTTTJfVFhGSURfQ09VTlQ7IGkrKykKKwkJCWlmIChsb2NhbC0+aW50cmFuc21pdGZpZFtpXSA9PSBQUklTTTJfVFhGSURfRU1QVFkpIHsKKwkJCQlQREVCVUcoREVCVUdfRVhUUkEsICJwcmlzbTJfdHhfdGltZW91dDogIgorCQkJCSAgICAgICAid2FrZSB1cCBxdWV1ZVxuIik7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShsb2NhbC0+ZGV2KTsKKwkJCQlicmVhazsKKwkJCX0KKwl9Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfZ2V0X3R4ZmlkX2lkeChsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCWludCBpZHgsIGVuZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT50eGZpZGxvY2ssIGZsYWdzKTsKKwllbmQgPSBpZHggPSBsb2NhbC0+bmV4dF90eGZpZDsKKwlkbyB7CisJCWlmIChsb2NhbC0+aW50cmFuc21pdGZpZFtpZHhdID09IFBSSVNNMl9UWEZJRF9FTVBUWSkgeworCQkJbG9jYWwtPmludHJhbnNtaXRmaWRbaWR4XSA9IFBSSVNNMl9UWEZJRF9SRVNFUlZFRDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT50eGZpZGxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiBpZHg7CisJCX0KKwkJaWR4Kys7CisJCWlmIChpZHggPj0gUFJJU00yX1RYRklEX0NPVU5UKQorCQkJaWR4ID0gMDsKKwl9IHdoaWxlIChpZHggIT0gZW5kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+dHhmaWRsb2NrLCBmbGFncyk7CisKKwlQREVCVUcoREVCVUdfRVhUUkEyLCAicHJpc20yX2dldF90eGZpZF9pZHg6IG5vIHJvb20gaW4gdHhmaWQgYnVmOiAiCisJICAgICAgICJwYWNrZXQgZHJvcHBlZFxuIik7CisJbG9jYWwtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKworCXJldHVybiAtMTsKK30KKworCisvKiBDYWxsZWQgb25seSBmcm9tIGhhcmR3YXJlIElSUSAqLworc3RhdGljIHZvaWQgcHJpc20yX3RyYW5zbWl0X2NiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGxvbmcgY29udGV4dCwKKwkJCSAgICAgICB1MTYgcmVzcDAsIHUxNiByZXMpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJaW50IGlkeCA9IChpbnQpIGNvbnRleHQ7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAocmVzKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcHJpc20yX3RyYW5zbWl0X2NiIC0gcmVzPTB4JTAyeFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcmVzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpZHggPCAwIHx8IGlkeCA+PSBQUklTTTJfVFhGSURfQ09VTlQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwcmlzbTJfdHJhbnNtaXRfY2IgY2FsbGVkIHdpdGggaW52YWxpZCAiCisJCSAgICAgICAiaWR4PSVkXG4iLCBkZXYtPm5hbWUsIGlkeCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChIT1NUQVBfQklUU19UUkFOU01JVCwgJmxvY2FsLT5iaXRzKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRyaXZlciBidWc6IHByaXNtMl90cmFuc21pdF9jYiBjYWxsZWQgIgorCQkgICAgICAgIndpdGggbm8gcGVuZGluZyB0cmFuc21pdFxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCS8qIHJlYWR5IGZvciBuZXh0IFRYLCBzbyB3YWtlIHVwIHF1ZXVlIHRoYXQgd2FzIHN0b3BwZWQgaW4KKwkJICogcHJpc20yX3RyYW5zbWl0KCkgKi8KKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCXNwaW5fbG9jaygmbG9jYWwtPnR4ZmlkbG9jayk7CisKKwkvKiBXaXRoIHJlY2xhaW0sIFJlc3AwIGNvbnRhaW5zIG5ldyB0eGZpZCBmb3IgdHJhbnNtaXQ7IHRoZSBvbGQgdHhmaWQKKwkgKiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWxsb2NhdGVkIGZvciB0aGUgbmV4dCBUWCBmcmFtZSAqLworCWxvY2FsLT5pbnRyYW5zbWl0ZmlkW2lkeF0gPSByZXNwMDsKKworCVBERUJVRyhERUJVR19GSUQsICIlczogcHJpc20yX3RyYW5zbWl0X2NiOiB0eGZpZFslZF09MHglMDR4LCAiCisJICAgICAgICJyZXNwMD0weCUwNHgsIHRyYW5zbWl0X3R4ZmlkPTB4JTA0eFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBpZHgsIGxvY2FsLT50eGZpZFtpZHhdLAorCSAgICAgICByZXNwMCwgbG9jYWwtPmludHJhbnNtaXRmaWRbbG9jYWwtPm5leHRfdHhmaWRdKTsKKworCWlkeCsrOworCWlmIChpZHggPj0gUFJJU00yX1RYRklEX0NPVU5UKQorCQlpZHggPSAwOworCWxvY2FsLT5uZXh0X3R4ZmlkID0gaWR4OworCisJLyogY2hlY2sgaWYgYWxsIFRYIGJ1ZmZlcnMgYXJlIG9jY3VwaWVkICovCisJZG8geworCQlpZiAobG9jYWwtPmludHJhbnNtaXRmaWRbaWR4XSA9PSBQUklTTTJfVFhGSURfRU1QVFkpIHsKKwkJCXNwaW5fdW5sb2NrKCZsb2NhbC0+dHhmaWRsb2NrKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZHgrKzsKKwkJaWYgKGlkeCA+PSBQUklTTTJfVFhGSURfQ09VTlQpCisJCQlpZHggPSAwOworCX0gd2hpbGUgKGlkeCAhPSBsb2NhbC0+bmV4dF90eGZpZCk7CisJc3Bpbl91bmxvY2soJmxvY2FsLT50eGZpZGxvY2spOworCisJLyogbm8gZW1wdHkgVFggYnVmZmVycywgc3RvcCBxdWV1ZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKK30KKworCisvKiBDYWxsZWQgb25seSBmcm9tIHNvZnR3YXJlIElSUSBpZiBQQ0kgYnVzIG1hc3RlciBpcyBub3QgdXNlZCAod2l0aCBidXMgbWFzdGVyCisgKiB0aGlzIGNhbiBiZSBjYWxsZWQgYm90aCBmcm9tIHNvZnR3YXJlIGFuZCBoYXJkd2FyZSBJUlEpICovCitzdGF0aWMgaW50IHByaXNtMl90cmFuc21pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaWR4KQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCByZXM7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwkvKiBUaGUgZHJpdmVyIHRyaWVzIHRvIHN0b3AgbmV0aWYgcXVldWUgc28gdGhhdCB0aGVyZSB3b3VsZCBub3QgYmUKKwkgKiBtb3JlIHRoYW4gb25lIGF0dGVtcHQgdG8gdHJhbnNtaXQgZnJhbWVzIGdvaW5nIG9uOyBjaGVjayB0aGF0IHRoaXMKKwkgKiBpcyByZWFsbHkgdGhlIGNhc2UgKi8KKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KEhPU1RBUF9CSVRTX1RSQU5TTUlULCAmbG9jYWwtPmJpdHMpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZHJpdmVyIGJ1ZyAtIHByaXNtMl90cmFuc21pdCgpIGNhbGxlZCAiCisJCSAgICAgICAid2hlbiBwcmV2aW91cyBUWCB3YXMgcGVuZGluZ1xuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHN0b3AgdGhlIHF1ZXVlIGZvciB0aGUgdGltZSB0aGF0IHRyYW5zbWl0IGlzIHBlbmRpbmcgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiB0cmFuc21pdCBwYWNrZXQgKi8KKwlyZXMgPSBoZmEzODR4X2NtZF9jYWxsYmFjaygKKwkJZGV2LAorCQlIRkEzODRYX0NNRENPREVfVFJBTlNNSVQgfCBIRkEzODRYX0NNRF9UWF9SRUNMQUlNLAorCQlsb2NhbC0+dHhmaWRbaWR4XSwKKwkJcHJpc20yX3RyYW5zbWl0X2NiLCAobG9uZykgaWR4KTsKKworCWlmIChyZXMpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHByaXNtMl90cmFuc21pdDogQ01EQ09ERV9UUkFOU01JVCAiCisJCSAgICAgICAiZmFpbGVkIChyZXM9JWQpXG4iLCBkZXYtPm5hbWUsIHJlcyk7CisJCXN0YXRzID0gaG9zdGFwX2dldF9zdGF0cyhkZXYpOworCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXJldHVybiAtMTsKKwl9CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkvKiBTaW5jZSB3ZSBkaWQgbm90IHdhaXQgZm9yIGNvbW1hbmQgY29tcGxldGlvbiwgdGhlIGNhcmQgY29udGludWVzCisJICogdG8gcHJvY2VzcyBvbiB0aGUgYmFja2dyb3VuZCBhbmQgd2Ugd2lsbCBmaW5pc2ggaGFuZGxpbmcgd2hlbgorCSAqIGNvbW1hbmQgY29tcGxldGlvbiBldmVudCBpcyBoYW5kbGVkIChwcmlzbTJfY21kX2V2KCkgZnVuY3Rpb24pICovCisKKwlyZXR1cm4gMDsKK30KKworCisvKiBTZW5kIElFRUUgODAyLjExIGZyYW1lIChjb252ZXJ0IHRoZSBoZWFkZXIgaW50byBQcmlzbTIgVFggZGVzY3JpcHRvciBhbmQKKyAqIHNlbmQgdGhlIHBheWxvYWQgd2l0aCB0aGlzIGRlc2NyaXB0b3IpICovCisvKiBDYWxsZWQgb25seSBmcm9tIHNvZnR3YXJlIElSUSAqLworc3RhdGljIGludCBwcmlzbTJfdHhfODAyMTEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlzdHJ1Y3QgaGZhMzg0eF90eF9mcmFtZSB0eGRlc2M7CisJc3RydWN0IGhvc3RhcF9za2JfdHhfZGF0YSAqbWV0YTsKKwlpbnQgaGRyX2xlbiwgZGF0YV9sZW4sIGlkeCwgcmVzLCByZXQgPSAtMTsKKwl1MTYgdHhfY29udHJvbCwgZmM7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwltZXRhID0gKHN0cnVjdCBob3N0YXBfc2tiX3R4X2RhdGEgKikgc2tiLT5jYjsKKworCXByaXNtMl9jYWxsYmFjayhsb2NhbCwgUFJJU00yX0NBTExCQUNLX1RYX1NUQVJUKTsKKworCWlmICgobG9jYWwtPmZ1bmMtPmNhcmRfcHJlc2VudCAmJiAhbG9jYWwtPmZ1bmMtPmNhcmRfcHJlc2VudChsb2NhbCkpIHx8CisJICAgICFsb2NhbC0+aHdfcmVhZHkgfHwgbG9jYWwtPmh3X2Rvd25sb2FkaW5nIHx8IGxvY2FsLT5wcmlfb25seSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHByaXNtMl90eF84MDIxMTogaHcgbm90IHJlYWR5IC0iCisJCQkgICAgICAgIiBza2lwcGluZ1xuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQlnb3RvIGZhaWw7CisJfQorCisJbWVtc2V0KCZ0eGRlc2MsIDAsIHNpemVvZih0eGRlc2MpKTsKKworCS8qIHNrYi0+ZGF0YSBzdGFydHMgd2l0aCB0eGRlc2MtPmZyYW1lX2NvbnRyb2wgKi8KKwloZHJfbGVuID0gMjQ7CisJbWVtY3B5KCZ0eGRlc2MuZnJhbWVfY29udHJvbCwgc2tiLT5kYXRhLCBoZHJfbGVuKTsKKyAJZmMgPSBsZTE2X3RvX2NwdSh0eGRlc2MuZnJhbWVfY29udHJvbCk7CisJaWYgKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBICYmCisJICAgIChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykgJiYKKwkgICAgc2tiLT5sZW4gPj0gMzApIHsKKwkJLyogQWRkcjQgKi8KKwkJbWVtY3B5KHR4ZGVzYy5hZGRyNCwgc2tiLT5kYXRhICsgaGRyX2xlbiwgRVRIX0FMRU4pOworCQloZHJfbGVuICs9IEVUSF9BTEVOOworCX0KKworCXR4X2NvbnRyb2wgPSBsb2NhbC0+dHhfY29udHJvbDsKKwlpZiAobWV0YS0+dHhfY2JfaWR4KSB7CisJCXR4X2NvbnRyb2wgfD0gSEZBMzg0WF9UWF9DVFJMX1RYX09LOworCQl0eGRlc2Muc3dfc3VwcG9ydCA9IGNwdV90b19sZTE2KG1ldGEtPnR4X2NiX2lkeCk7CisJfQorCXR4ZGVzYy50eF9jb250cm9sID0gY3B1X3RvX2xlMTYodHhfY29udHJvbCk7CisJdHhkZXNjLnR4X3JhdGUgPSBtZXRhLT5yYXRlOworCisJZGF0YV9sZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CisJdHhkZXNjLmRhdGFfbGVuID0gY3B1X3RvX2xlMTYoZGF0YV9sZW4pOworCXR4ZGVzYy5sZW4gPSBjcHVfdG9fYmUxNihkYXRhX2xlbik7CisKKwlpZHggPSBwcmlzbTJfZ2V0X3R4ZmlkX2lkeChsb2NhbCk7CisJaWYgKGlkeCA8IDApCisJCWdvdG8gZmFpbDsKKworCWlmIChsb2NhbC0+ZnJhbWVfZHVtcCAmIFBSSVNNMl9EVU1QX1RYX0hEUikKKwkJaG9zdGFwX2R1bXBfdHhfaGVhZGVyKGRldi0+bmFtZSwgJnR4ZGVzYyk7CisKKwlzcGluX2xvY2soJmxvY2FsLT5iYXBsb2NrKTsKKwlyZXMgPSBoZmEzODR4X3NldHVwX2JhcChkZXYsIEJBUDAsIGxvY2FsLT50eGZpZFtpZHhdLCAwKTsKKworCWlmICghcmVzKQorCQlyZXMgPSBoZmEzODR4X3RvX2JhcChkZXYsIEJBUDAsICZ0eGRlc2MsIHNpemVvZih0eGRlc2MpKTsKKwlpZiAoIXJlcykKKwkJcmVzID0gaGZhMzg0eF90b19iYXAoZGV2LCBCQVAwLCBza2ItPmRhdGEgKyBoZHJfbGVuLAorCQkJCSAgICAgc2tiLT5sZW4gLSBoZHJfbGVuKTsKKwlzcGluX3VubG9jaygmbG9jYWwtPmJhcGxvY2spOworCisJaWYgKCFyZXMpCisJCXJlcyA9IHByaXNtMl90cmFuc21pdChkZXYsIGlkeCk7CisJaWYgKHJlcykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHByaXNtMl90eF84MDIxMSAtIHRvIEJBUDAgZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJbG9jYWwtPmludHJhbnNtaXRmaWRbaWR4XSA9IFBSSVNNMl9UWEZJRF9FTVBUWTsKKwkJc2NoZWR1bGVfd29yaygmbG9jYWwtPnJlc2V0X3F1ZXVlKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IDA7CisKK2ZhaWw6CisJcHJpc20yX2NhbGxiYWNrKGxvY2FsLCBQUklTTTJfQ0FMTEJBQ0tfVFhfRU5EKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIFNvbWUgU01QIHN5c3RlbXMgaGF2ZSByZXBvcnRlZCBudW1iZXIgb2Ygb2RkIGVycm9ycyB3aXRoIGhvc3RhcF9wY2kuIGZpZAorICogcmVnaXN0ZXIgaGFzIGNoYW5nZWQgdmFsdWVzIGJldHdlZW4gY29uc2VjdXRpdmUgcmVhZHMgZm9yIGFuIHVua25vd24gcmVhc29uLgorICogVGhpcyBzaG91bGQgcmVhbGx5IG5vdCBoYXBwZW4sIHNvIG1vcmUgZGVidWdnaW5nIGlzIG5lZWRlZC4gVGhpcyB0ZXN0CisgKiB2ZXJzaW9uIGlzIGEgYmlnIHNsb3dlciwgYnV0IGl0IHdpbGwgZGV0ZWN0IG1vc3Qgb2Ygc3VjaCByZWdpc3RlciBjaGFuZ2VzCisgKiBhbmQgd2lsbCB0cnkgdG8gZ2V0IHRoZSBjb3JyZWN0IGZpZCBldmVudHVhbGx5LiAqLworI2RlZmluZSBFWFRSQV9GSURfUkVBRF9URVNUUworCitzdGF0aWMgaW5saW5lIHUxNiBwcmlzbTJfcmVhZF9maWRfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiByZWcpCit7CisjaWZkZWYgRVhUUkFfRklEX1JFQURfVEVTVFMKKwl1MTYgdmFsLCB2YWwyLCB2YWwzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJdmFsID0gSEZBMzg0WF9JTlcocmVnKTsKKwkJdmFsMiA9IEhGQTM4NFhfSU5XKHJlZyk7CisJCXZhbDMgPSBIRkEzODRYX0lOVyhyZWcpOworCisJCWlmICh2YWwgPT0gdmFsMiAmJiB2YWwgPT0gdmFsMykKKwkJCXJldHVybiB2YWw7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkZXRlY3RlZCBmaWQgY2hhbmdlICh0cnk9JWQsIHJlZz0lMDR4KToiCisJCSAgICAgICAiICUwNHggJTA0eCAlMDR4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBpLCByZWcsIHZhbCwgdmFsMiwgdmFsMyk7CisJCWlmICgodmFsID09IHZhbDIgfHwgdmFsID09IHZhbDMpICYmIHZhbCAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJaWYgKHZhbDIgPT0gdmFsMyAmJiB2YWwyICE9IDApCisJCQlyZXR1cm4gdmFsMjsKKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVoaHVoLi4gY291bGQgbm90IHJlYWQgZ29vZCBmaWQgZnJvbSByZWcgIgorCSAgICAgICAiJTA0eCAoJTA0eCAlMDR4ICUwNHgpXG4iLCBkZXYtPm5hbWUsIHJlZywgdmFsLCB2YWwyLCB2YWwzKTsKKwlyZXR1cm4gdmFsOworI2Vsc2UgLyogRVhUUkFfRklEX1JFQURfVEVTVFMgKi8KKwlyZXR1cm4gSEZBMzg0WF9JTlcocmVnKTsKKyNlbmRpZiAvKiBFWFRSQV9GSURfUkVBRF9URVNUUyAqLworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIHZvaWQgcHJpc20yX3J4KGxvY2FsX2luZm9fdCAqbG9jYWwpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CisJaW50IHJlcywgcnhfcGVuZGluZyA9IDA7CisJdTE2IGxlbiwgaGRyX2xlbiwgcnhmaWQsIHN0YXR1cywgbWFjcG9ydDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisJc3RydWN0IGhmYTM4NHhfcnhfZnJhbWUgcnhkZXNjOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisJcHJpc20yX2NhbGxiYWNrKGxvY2FsLCBQUklTTTJfQ0FMTEJBQ0tfUlhfU1RBUlQpOworCXN0YXRzID0gaG9zdGFwX2dldF9zdGF0cyhkZXYpOworCisJcnhmaWQgPSBwcmlzbTJfcmVhZF9maWRfcmVnKGRldiwgSEZBMzg0WF9SWEZJRF9PRkYpOworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJaWYgKHJ4ZmlkID09IDApIHsKKwkJcnhmaWQgPSBIRkEzODRYX0lOVyhIRkEzODRYX1JYRklEX09GRik7CisJCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTJfcng6IHJ4ZmlkPTAgKG5leHQgMHglMDR4KVxuIiwKKwkJICAgICAgIHJ4ZmlkKTsKKwkJaWYgKHJ4ZmlkID09IDApIHsKKwkJCXNjaGVkdWxlX3dvcmsoJmxvY2FsLT5yZXNldF9xdWV1ZSk7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwkJLyogdHJ5IHRvIGNvbnRpbnVlIHdpdGggdGhlIG5ldyByeGZpZCB2YWx1ZSAqLworCX0KKyNlbmRpZgorCisJc3Bpbl9sb2NrKCZsb2NhbC0+YmFwbG9jayk7CisJcmVzID0gaGZhMzg0eF9zZXR1cF9iYXAoZGV2LCBCQVAwLCByeGZpZCwgMCk7CisJaWYgKCFyZXMpCisJCXJlcyA9IGhmYTM4NHhfZnJvbV9iYXAoZGV2LCBCQVAwLCAmcnhkZXNjLCBzaXplb2YocnhkZXNjKSk7CisKKwlpZiAocmVzKSB7CisJCXNwaW5fdW5sb2NrKCZsb2NhbC0+YmFwbG9jayk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogY29weSBmcm9tIEJBUDAgZmFpbGVkICVkXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICByZXMpOworCQlpZiAocmVzID09IC1FVElNRURPVVQpIHsKKwkJCXNjaGVkdWxlX3dvcmsoJmxvY2FsLT5yZXNldF9xdWV1ZSk7CisJCX0KKwkJZ290byByeF9kcm9wcGVkOworCX0KKworCWxlbiA9IGxlMTZfdG9fY3B1KHJ4ZGVzYy5kYXRhX2xlbik7CisJaGRyX2xlbiA9IHNpemVvZihyeGRlc2MpOworCXN0YXR1cyA9IGxlMTZfdG9fY3B1KHJ4ZGVzYy5zdGF0dXMpOworCW1hY3BvcnQgPSAoc3RhdHVzID4+IDgpICYgMHgwNzsKKworCS8qIERyb3AgZnJhbWVzIHdpdGggdG9vIGxhcmdlIHJlcG9ydGVkIHBheWxvYWQgbGVuZ3RoLiBNb25pdG9yIG1vZGUKKwkgKiBzZWVtcyB0byBzb21ldGltZXMgcGFzcyBmcmFtZXMgKGUuZy4sIGN0cmw6OmFjaykgd2l0aCBzaWduZWQgYW5kCisJICogbmVnYXRpdmUgdmFsdWUsIHNvIGFsbG93IGFsc28gdmFsdWVzIDY1NTIyIC4uIDY1NTM0ICgtMTQgLi4gLTIpIGZvcgorCSAqIG1hY3BvcnQgNyAqLworCWlmIChsZW4gPiBQUklTTTJfREFUQV9NQVhMRU4gKyA4IC8qIFdFUCAqLykgeworCQlpZiAobWFjcG9ydCA9PSA3ICYmIGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgeworCQkJaWYgKGxlbiA+PSAodTE2KSAtMTQpIHsKKwkJCQloZHJfbGVuIC09IDY1NTM1IC0gbGVuOworCQkJCWhkcl9sZW4tLTsKKwkJCX0KKwkJCWxlbiA9IDA7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9jaygmbG9jYWwtPmJhcGxvY2spOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlZCBmcmFtZSB3aXRoIGludmFsaWQgIgorCQkJICAgICAgICJsZW5ndGggMHglMDR4XG4iLCBkZXYtPm5hbWUsIGxlbik7CisJCQlob3N0YXBfZHVtcF9yeF9oZWFkZXIoZGV2LT5uYW1lLCAmcnhkZXNjKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgaGRyX2xlbik7CisJaWYgKCFza2IpIHsKKwkJc3Bpbl91bmxvY2soJmxvY2FsLT5iYXBsb2NrKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSWCBmYWlsZWQgdG8gYWxsb2NhdGUgc2tiXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKwlza2ItPmRldiA9IGRldjsKKwltZW1jcHkoc2tiX3B1dChza2IsIGhkcl9sZW4pLCAmcnhkZXNjLCBoZHJfbGVuKTsKKworCWlmIChsZW4gPiAwKQorCQlyZXMgPSBoZmEzODR4X2Zyb21fYmFwKGRldiwgQkFQMCwgc2tiX3B1dChza2IsIGxlbiksIGxlbik7CisJc3Bpbl91bmxvY2soJmxvY2FsLT5iYXBsb2NrKTsKKwlpZiAocmVzKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUlggZmFpbGVkIHRvIHJlYWQgIgorCQkgICAgICAgImZyYW1lIGRhdGFcbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKwlza2JfcXVldWVfdGFpbCgmbG9jYWwtPnJ4X2xpc3QsIHNrYik7CisJdGFza2xldF9zY2hlZHVsZSgmbG9jYWwtPnJ4X3Rhc2tsZXQpOworCisgcnhfZXhpdDoKKwlwcmlzbTJfY2FsbGJhY2sobG9jYWwsIFBSSVNNMl9DQUxMQkFDS19SWF9FTkQpOworCWlmICghcnhfcGVuZGluZykgeworCQlIRkEzODRYX09VVFcoSEZBMzg0WF9FVl9SWCwgSEZBMzg0WF9FVkFDS19PRkYpOworCX0KKworCXJldHVybjsKKworIHJ4X2Ryb3BwZWQ6CisJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJZ290byByeF9leGl0OworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIHZvaWQgaG9zdGFwX3J4X3NrYihsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoZmEzODR4X3J4X2ZyYW1lICpyeGRlc2M7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCXN0cnVjdCBob3N0YXBfODAyMTFfcnhfc3RhdHVzIHN0YXRzOworCWludCBoZHJsZW4sIHJ4X2hkcmxlbjsKKworCXJ4X2hkcmxlbiA9IHNpemVvZigqcnhkZXNjKTsKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2YoKnJ4ZGVzYykpIHsKKwkJLyogQWxsb3cgbW9uaXRvciBtb2RlIHRvIHJlY2VpdmUgc2hvcnRlciBmcmFtZXMgKi8KKwkJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUiAmJgorCQkgICAgc2tiLT5sZW4gPj0gc2l6ZW9mKCpyeGRlc2MpIC0gMzApIHsKKwkJCXJ4X2hkcmxlbiA9IHNrYi0+bGVuOworCQl9IGVsc2UgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJcnhkZXNjID0gKHN0cnVjdCBoZmEzODR4X3J4X2ZyYW1lICopIHNrYi0+ZGF0YTsKKworCWlmIChsb2NhbC0+ZnJhbWVfZHVtcCAmIFBSSVNNMl9EVU1QX1JYX0hEUiAmJgorCSAgICBza2ItPmxlbiA+PSBzaXplb2YoKnJ4ZGVzYykpCisJCWhvc3RhcF9kdW1wX3J4X2hlYWRlcihkZXYtPm5hbWUsIHJ4ZGVzYyk7CisKKwlpZiAobGUxNl90b19jcHUocnhkZXNjLT5zdGF0dXMpICYgSEZBMzg0WF9SWF9TVEFUVVNfRkNTRVJSICYmCisJICAgICghbG9jYWwtPm1vbml0b3JfYWxsb3dfZmNzZXJyIHx8CisJICAgICBsb2NhbC0+aXdfbW9kZSAhPSBJV19NT0RFX01PTklUT1IpKQorCQlnb3RvIGRyb3A7CisKKwlpZiAoc2tiLT5sZW4gPiBQUklTTTJfREFUQV9NQVhMRU4pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSWDogbGVuKCVkKSA+IE1BWCglZClcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHNrYi0+bGVuLCBQUklTTTJfREFUQV9NQVhMRU4pOworCQlnb3RvIGRyb3A7CisJfQorCisJc3RhdHMubWFjX3RpbWUgPSBsZTMyX3RvX2NwdShyeGRlc2MtPnRpbWUpOworCXN0YXRzLnNpZ25hbCA9IHJ4ZGVzYy0+c2lnbmFsIC0gbG9jYWwtPnJzc2lfdG9fZEJtOworCXN0YXRzLm5vaXNlID0gcnhkZXNjLT5zaWxlbmNlIC0gbG9jYWwtPnJzc2lfdG9fZEJtOworCXN0YXRzLnJhdGUgPSByeGRlc2MtPnJhdGU7CisKKwkvKiBDb252ZXJ0IFByaXNtMiBSWCBzdHJ1Y3R1cmUgaW50byBJRUVFIDgwMi4xMSBoZWFkZXIgKi8KKwloZHJsZW4gPSBob3N0YXBfODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShyeGRlc2MtPmZyYW1lX2NvbnRyb2wpKTsKKwlpZiAoaGRybGVuID4gcnhfaGRybGVuKQorCQloZHJsZW4gPSByeF9oZHJsZW47CisKKwltZW1tb3ZlKHNrYl9wdWxsKHNrYiwgcnhfaGRybGVuIC0gaGRybGVuKSwKKwkJJnJ4ZGVzYy0+ZnJhbWVfY29udHJvbCwgaGRybGVuKTsKKworCWhvc3RhcF84MDIxMV9yeChkZXYsIHNrYiwgJnN0YXRzKTsKKwlyZXR1cm47CisKKyBkcm9wOgorCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyB2b2lkIGhvc3RhcF9yeF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gKGxvY2FsX2luZm9fdCAqKSBkYXRhOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZsb2NhbC0+cnhfbGlzdCkpICE9IE5VTEwpCisJCWhvc3RhcF9yeF9za2IobG9jYWwsIHNrYik7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgZnJvbSBoYXJkd2FyZSBJUlEgKi8KK3N0YXRpYyB2b2lkIHByaXNtMl9hbGxvY19ldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCBpZHg7CisJdTE2IGZpZDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCWZpZCA9IHByaXNtMl9yZWFkX2ZpZF9yZWcoZGV2LCBIRkEzODRYX0FMTE9DRklEX09GRik7CisKKwlQREVCVUcoREVCVUdfRklELCAiRklEOiBpbnRlcnJ1cHQ6IEFMTE9DIC0gZmlkPTB4JTA0eFxuIiwgZmlkKTsKKworCXNwaW5fbG9jaygmbG9jYWwtPnR4ZmlkbG9jayk7CisJaWR4ID0gbG9jYWwtPm5leHRfYWxsb2M7CisKKwlkbyB7CisJCWlmIChsb2NhbC0+dHhmaWRbaWR4XSA9PSBmaWQpIHsKKwkJCVBERUJVRyhERUJVR19GSUQsICJGSUQ6IGZvdW5kIG1hdGNoaW5nIHR4ZmlkWyVkXVxuIiwKKwkJCSAgICAgICBpZHgpOworCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmIChsb2NhbC0+aW50cmFuc21pdGZpZFtpZHhdID09IFBSSVNNMl9UWEZJRF9FTVBUWSkKKwkJCQlwcmludGsoIkFscmVhZHkgcmVsZWFzZWQgdHhmaWQgZm91bmQgYXQgaWR4ICIKKwkJCQkgICAgICAgIiVkXG4iLCBpZHgpOworCQkJaWYgKGxvY2FsLT5pbnRyYW5zbWl0ZmlkW2lkeF0gPT0gUFJJU00yX1RYRklEX1JFU0VSVkVEKQorCQkJCXByaW50aygiQWxyZWFkeSByZXNlcnZlZCB0eGZpZCBmb3VuZCBhdCBpZHggIgorCQkJCSAgICAgICAiJWRcbiIsIGlkeCk7CisjZW5kaWYKKwkJCWxvY2FsLT5pbnRyYW5zbWl0ZmlkW2lkeF0gPSBQUklTTTJfVFhGSURfRU1QVFk7CisJCQlpZHgrKzsKKwkJCWxvY2FsLT5uZXh0X2FsbG9jID0gaWR4ID49IFBSSVNNMl9UWEZJRF9DT1VOVCA/IDAgOgorCQkJCWlkeDsKKworCQkJaWYgKCF0ZXN0X2JpdChIT1NUQVBfQklUU19UUkFOU01JVCwgJmxvY2FsLT5iaXRzKSAmJgorCQkJICAgIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwkJCXNwaW5fdW5sb2NrKCZsb2NhbC0+dHhmaWRsb2NrKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlkeCsrOworCQlpZiAoaWR4ID49IFBSSVNNMl9UWEZJRF9DT1VOVCkKKwkJCWlkeCA9IDA7CisJfSB3aGlsZSAoaWR4ICE9IGxvY2FsLT5uZXh0X2FsbG9jKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgZmluZCBtYXRjaGluZyB0eGZpZCAoMHglMDR4LCBuZXcgIgorCSAgICAgICAicmVhZCAweCUwNHgpIGZvciBhbGxvYyBldmVudFxuIiwgZGV2LT5uYW1lLCBmaWQsCisJICAgICAgIEhGQTM4NFhfSU5XKEhGQTM4NFhfQUxMT0NGSURfT0ZGKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlRYRklEczoiKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IFBSSVNNMl9UWEZJRF9DT1VOVDsgaWR4KyspCisJCXByaW50aygiICUwNHhbJTA0eF0iLCBsb2NhbC0+dHhmaWRbaWR4XSwKKwkJICAgICAgIGxvY2FsLT5pbnRyYW5zbWl0ZmlkW2lkeF0pOworCXByaW50aygiXG4iKTsKKwlzcGluX3VubG9jaygmbG9jYWwtPnR4ZmlkbG9jayk7CisKKwkvKiBGSVg6IHNob3VsZCBwcm9iYWJseSBzY2hlZHVsZSByZXNldDsgcmVmZXJlbmNlIHRvIG9uZSB0eGZpZCB3YXMgbG9zdAorCSAqIGNvbXBsZXRlbHkuLiBCYWQgdGhpbmdzIHdpbGwgaGFwcGVuIGlmIHdlIHJ1biBvdXQgb2YgdHhmaWRzCisJICogQWN0dWFsbHksIHRoaXMgd2lsbCBjYXVzZSBuZXRkZXYgd2F0Y2hkb2cgdG8gbm90aWNlIFRYIHRpbWVvdXQgYW5kCisJICogdGhlbiBjYXJkIHJlc2V0IGFmdGVyIGFsbCB0eGZpZHMgaGF2ZSBiZWVuIGxlYWtlZC4gKi8KK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyB2b2lkIGhvc3RhcF90eF9jYWxsYmFjayhsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJICAgICAgIHN0cnVjdCBoZmEzODR4X3R4X2ZyYW1lICp0eGRlc2MsIGludCBvaywKKwkJCSAgICAgICBjaGFyICpwYXlsb2FkKQoreworCXUxNiBzd19zdXBwb3J0LCBoZHJsZW4sIGxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBob3N0YXBfdHhfY2FsbGJhY2tfaW5mbyAqY2I7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCBmcmFtZSB3YXMgZnJvbSB1cy4gKi8KKwlpZiAobWVtY21wKHR4ZGVzYy0+YWRkcjIsIGxvY2FsLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUWCBjYWxsYmFjayAtIGZvcmVpZ24gZnJhbWVcbiIsCisJCSAgICAgICBsb2NhbC0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXN3X3N1cHBvcnQgPSBsZTE2X3RvX2NwdSh0eGRlc2MtPnN3X3N1cHBvcnQpOworCisJc3Bpbl9sb2NrKCZsb2NhbC0+bG9jayk7CisJY2IgPSBsb2NhbC0+dHhfY2FsbGJhY2s7CisJd2hpbGUgKGNiICE9IE5VTEwgJiYgY2ItPmlkeCAhPSBzd19zdXBwb3J0KQorCQljYiA9IGNiLT5uZXh0OworCXNwaW5fdW5sb2NrKCZsb2NhbC0+bG9jayk7CisKKwlpZiAoY2IgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNvdWxkIG5vdCBmaW5kIFRYIGNhbGxiYWNrIChpZHggJWQpXG4iLAorCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSwgc3dfc3VwcG9ydCk7CisJCXJldHVybjsKKwl9CisKKwloZHJsZW4gPSBob3N0YXBfODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdSh0eGRlc2MtPmZyYW1lX2NvbnRyb2wpKTsKKwlsZW4gPSBsZTE2X3RvX2NwdSh0eGRlc2MtPmRhdGFfbGVuKTsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGhkcmxlbiArIGxlbik7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaG9zdGFwX3R4X2NhbGxiYWNrIGZhaWxlZCB0byBhbGxvY2F0ZSAiCisJCSAgICAgICAic2tiXG4iLCBsb2NhbC0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCW1lbWNweShza2JfcHV0KHNrYiwgaGRybGVuKSwgKHZvaWQgKikgJnR4ZGVzYy0+ZnJhbWVfY29udHJvbCwgaGRybGVuKTsKKwlpZiAocGF5bG9hZCkKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBwYXlsb2FkLCBsZW4pOworCisJc2tiLT5kZXYgPSBsb2NhbC0+ZGV2OworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKworCWNiLT5mdW5jKHNrYiwgb2ssIGNiLT5kYXRhKTsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBpbnQgaG9zdGFwX3R4X2NvbXBsX3JlYWQobG9jYWxfaW5mb190ICpsb2NhbCwgaW50IGVycm9yLAorCQkJCXN0cnVjdCBoZmEzODR4X3R4X2ZyYW1lICp0eGRlc2MsCisJCQkJY2hhciAqKnBheWxvYWQpCit7CisJdTE2IGZpZCwgbGVuOworCWludCByZXMsIHJldCA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CisKKwlmaWQgPSBwcmlzbTJfcmVhZF9maWRfcmVnKGRldiwgSEZBMzg0WF9UWENPTVBMRklEX09GRik7CisKKwlQREVCVUcoREVCVUdfRklELCAiaW50ZXJydXB0OiBUWCAoZXJyPSVkKSAtIGZpZD0weCUwNHhcbiIsIGZpZCwgZXJyb3IpOworCisJc3Bpbl9sb2NrKCZsb2NhbC0+YmFwbG9jayk7CisJcmVzID0gaGZhMzg0eF9zZXR1cF9iYXAoZGV2LCBCQVAwLCBmaWQsIDApOworCWlmICghcmVzKQorCQlyZXMgPSBoZmEzODR4X2Zyb21fYmFwKGRldiwgQkFQMCwgdHhkZXNjLCBzaXplb2YoKnR4ZGVzYykpOworCWlmIChyZXMpIHsKKwkJUERFQlVHKERFQlVHX0VYVFJBLCAiJXM6IFRYIChlcnI9JWQpIC0gZmlkPTB4JTA0eCAtIGNvdWxkIG5vdCAiCisJCSAgICAgICAicmVhZCB0eGRlc2NcbiIsIGRldi0+bmFtZSwgZXJyb3IsIGZpZCk7CisJCWlmIChyZXMgPT0gLUVUSU1FRE9VVCkgeworCQkJc2NoZWR1bGVfd29yaygmbG9jYWwtPnJlc2V0X3F1ZXVlKTsKKwkJfQorCQlyZXQgPSAtMTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAodHhkZXNjLT5zd19zdXBwb3J0KSB7CisJCWxlbiA9IGxlMTZfdG9fY3B1KHR4ZGVzYy0+ZGF0YV9sZW4pOworCQlpZiAobGVuIDwgUFJJU00yX0RBVEFfTUFYTEVOKSB7CisJCQkqcGF5bG9hZCA9IChjaGFyICopIGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwkJCWlmICgqcGF5bG9hZCA9PSBOVUxMIHx8CisJCQkgICAgaGZhMzg0eF9mcm9tX2JhcChkZXYsIEJBUDAsICpwYXlsb2FkLCBsZW4pKSB7CisJCQkJUERFQlVHKERFQlVHX0VYVFJBLCAiJXM6IGNvdWxkIG5vdCByZWFkIFRYICIKKwkJCQkgICAgICAgImZyYW1lIHBheWxvYWRcbiIsIGRldi0+bmFtZSk7CisJCQkJa2ZyZWUoKnBheWxvYWQpOworCQkJCSpwYXlsb2FkID0gTlVMTDsKKwkJCQlyZXQgPSAtMTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKwl9CisKKyBmYWlsOgorCXNwaW5fdW5sb2NrKCZsb2NhbC0+YmFwbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIHZvaWQgcHJpc20yX3R4X2V2KGxvY2FsX2luZm9fdCAqbG9jYWwpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CisJY2hhciAqcGF5bG9hZCA9IE5VTEw7CisJc3RydWN0IGhmYTM4NHhfdHhfZnJhbWUgdHhkZXNjOworCisJaWYgKGhvc3RhcF90eF9jb21wbF9yZWFkKGxvY2FsLCAwLCAmdHhkZXNjLCAmcGF5bG9hZCkpCisJCWdvdG8gZmFpbDsKKworCWlmIChsb2NhbC0+ZnJhbWVfZHVtcCAmIFBSSVNNMl9EVU1QX1RYX0hEUikgeworCQlQREVCVUcoREVCVUdfRVhUUkEsICIlczogVFggLSBzdGF0dXM9MHglMDR4ICIKKwkJICAgICAgICJyZXRyeV9jb3VudD0lZCB0eF9yYXRlPSVkIHNlcV9jdHJsPSVkICIKKwkJICAgICAgICJkdXJhdGlvbl9pZD0lZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbGUxNl90b19jcHUodHhkZXNjLnN0YXR1cyksCisJCSAgICAgICB0eGRlc2MucmV0cnlfY291bnQsIHR4ZGVzYy50eF9yYXRlLAorCQkgICAgICAgbGUxNl90b19jcHUodHhkZXNjLnNlcV9jdHJsKSwKKwkJICAgICAgIGxlMTZfdG9fY3B1KHR4ZGVzYy5kdXJhdGlvbl9pZCkpOworCX0KKworCWlmICh0eGRlc2Muc3dfc3VwcG9ydCkKKwkJaG9zdGFwX3R4X2NhbGxiYWNrKGxvY2FsLCAmdHhkZXNjLCAxLCBwYXlsb2FkKTsKKwlrZnJlZShwYXlsb2FkKTsKKworIGZhaWw6CisJSEZBMzg0WF9PVVRXKEhGQTM4NFhfRVZfVFgsIEhGQTM4NFhfRVZBQ0tfT0ZGKTsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyB2b2lkIGhvc3RhcF9zdGFfdHhfZXhjX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWxvY2FsX2luZm9fdCAqbG9jYWwgPSAobG9jYWxfaW5mb190ICopIGRhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmxvY2FsLT5zdGFfdHhfZXhjX2xpc3QpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBoZmEzODR4X3R4X2ZyYW1lICp0eGRlc2MgPQorCQkJKHN0cnVjdCBoZmEzODR4X3R4X2ZyYW1lICopIHNrYi0+ZGF0YTsKKworCQlpZiAoc2tiLT5sZW4gPj0gc2l6ZW9mKCp0eGRlc2MpKSB7CisJCQkvKiBDb252ZXJ0IFByaXNtMiBSWCBzdHJ1Y3R1cmUgaW50byBJRUVFIDgwMi4xMSBoZWFkZXIKKwkJCSAqLworCQkJdTE2IGZjID0gbGUxNl90b19jcHUodHhkZXNjLT5mcmFtZV9jb250cm9sKTsKKwkJCWludCBoZHJsZW4gPSBob3N0YXBfODAyMTFfZ2V0X2hkcmxlbihmYyk7CisJCQltZW1tb3ZlKHNrYl9wdWxsKHNrYiwgc2l6ZW9mKCp0eGRlc2MpIC0gaGRybGVuKSwKKwkJCQkmdHhkZXNjLT5mcmFtZV9jb250cm9sLCBoZHJsZW4pOworCisJCQlob3N0YXBfaGFuZGxlX3N0YV90eF9leGMobG9jYWwsIHNrYik7CisJCX0KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyB2b2lkIHByaXNtMl90eGV4Yyhsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsb2NhbC0+ZGV2OworCXUxNiBzdGF0dXMsIGZjOworCWludCBzaG93X2R1bXAsIHJlczsKKwljaGFyICpwYXlsb2FkID0gTlVMTDsKKwlzdHJ1Y3QgaGZhMzg0eF90eF9mcmFtZSB0eGRlc2M7CisKKwlzaG93X2R1bXAgPSBsb2NhbC0+ZnJhbWVfZHVtcCAmIFBSSVNNMl9EVU1QX1RYRVhDX0hEUjsKKwlsb2NhbC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwlyZXMgPSBob3N0YXBfdHhfY29tcGxfcmVhZChsb2NhbCwgMSwgJnR4ZGVzYywgJnBheWxvYWQpOworCUhGQTM4NFhfT1VUVyhIRkEzODRYX0VWX1RYRVhDLCBIRkEzODRYX0VWQUNLX09GRik7CisJaWYgKHJlcykKKwkJcmV0dXJuOworCisJc3RhdHVzID0gbGUxNl90b19jcHUodHhkZXNjLnN0YXR1cyk7CisKKwkvKiBXZSBwcm9kdWNlIGEgVFhEUk9QIGV2ZW50IG9ubHkgZm9yIHJldHJ5IG9yIGxpZmV0aW1lCisJICogZXhjZWVkZWQsIGJlY2F1c2UgdGhhdCdzIHRoZSBvbmx5IHN0YXR1cyB0aGF0IHJlYWxseSBtZWFuCisJICogdGhhdCB0aGlzIHBhcnRpY3VsYXIgbm9kZSB3ZW50IGF3YXkuCisJICogT3RoZXIgZXJyb3JzIG1lYW5zIHRoYXQgKndlKiBzY3Jld2VkIHVwLiAtIEplYW4gSUkgKi8KKwlpZiAoc3RhdHVzICYgKEhGQTM4NFhfVFhfU1RBVFVTX1JFVFJZRVJSIHwgSEZBMzg0WF9UWF9TVEFUVVNfQUdFREVSUikpCisJeworCQl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisKKwkJLyogQ29weSA4MDIuMTEgZGVzdCBhZGRyZXNzLiAqLworCQltZW1jcHkod3JxdS5hZGRyLnNhX2RhdGEsIHR4ZGVzYy5hZGRyMSwgRVRIX0FMRU4pOworCQl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVlRYRFJPUCwgJndycXUsIE5VTEwpOworCX0gZWxzZQorCQlzaG93X2R1bXAgPSAxOworCisJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSIHx8CisJICAgIGxvY2FsLT5pd19tb2RlID09IElXX01PREVfUkVQRUFUIHx8CisJICAgIGxvY2FsLT53ZHNfdHlwZSAmIEhPU1RBUF9XRFNfQVBfQ0xJRU5UKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHR4ZGVzYykpOworCQlpZiAoc2tiKSB7CisJCQltZW1jcHkoc2tiX3B1dChza2IsIHNpemVvZih0eGRlc2MpKSwgJnR4ZGVzYywKKwkJCSAgICAgICBzaXplb2YodHhkZXNjKSk7CisJCQlza2JfcXVldWVfdGFpbCgmbG9jYWwtPnN0YV90eF9leGNfbGlzdCwgc2tiKTsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmxvY2FsLT5zdGFfdHhfZXhjX3Rhc2tsZXQpOworCQl9CisJfQorCisJaWYgKHR4ZGVzYy5zd19zdXBwb3J0KQorCQlob3N0YXBfdHhfY2FsbGJhY2sobG9jYWwsICZ0eGRlc2MsIDAsIHBheWxvYWQpOworCWtmcmVlKHBheWxvYWQpOworCisJaWYgKCFzaG93X2R1bXApCisJCXJldHVybjsKKworCVBERUJVRyhERUJVR19FWFRSQSwgIiVzOiBUWEVYQyAtIHN0YXR1cz0weCUwNHggKCVzJXMlcyVzKSIKKwkgICAgICAgIiB0eF9jb250cm9sPSUwNHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzLAorCSAgICAgICBzdGF0dXMgJiBIRkEzODRYX1RYX1NUQVRVU19SRVRSWUVSUiA/ICJbUmV0cnlFcnJdIiA6ICIiLAorCSAgICAgICBzdGF0dXMgJiBIRkEzODRYX1RYX1NUQVRVU19BR0VERVJSID8gIltBZ2VkRXJyXSIgOiAiIiwKKwkgICAgICAgc3RhdHVzICYgSEZBMzg0WF9UWF9TVEFUVVNfRElTQ09OID8gIltEaXNjb25dIiA6ICIiLAorCSAgICAgICBzdGF0dXMgJiBIRkEzODRYX1RYX1NUQVRVU19GT1JNRVJSID8gIltGb3JtRXJyXSIgOiAiIiwKKwkgICAgICAgbGUxNl90b19jcHUodHhkZXNjLnR4X2NvbnRyb2wpKTsKKworCWZjID0gbGUxNl90b19jcHUodHhkZXNjLmZyYW1lX2NvbnRyb2wpOworCVBERUJVRyhERUJVR19FWFRSQSwgIiAgIHJldHJ5X2NvdW50PSVkIHR4X3JhdGU9JWQgZmM9MHglMDR4ICIKKwkgICAgICAgIiglcyVzJXM6OiVkJXMlcylcbiIsCisJICAgICAgIHR4ZGVzYy5yZXRyeV9jb3VudCwgdHhkZXNjLnR4X3JhdGUsIGZjLAorCSAgICAgICBXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfTUdNVCA/ICJNZ210IiA6ICIiLAorCSAgICAgICBXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfQ1RMID8gIkN0cmwiIDogIiIsCisJICAgICAgIFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBID8gIkRhdGEiIDogIiIsCisJICAgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSA+PiA0LAorCSAgICAgICBmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMgPyAiIFRvRFMiIDogIiIsCisJICAgICAgIGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTID8gIiBGcm9tRFMiIDogIiIpOworCVBERUJVRyhERUJVR19FWFRSQSwgIiAgIEExPSIgTUFDU1RSICIgQTI9IiBNQUNTVFIgIiBBMz0iCisJICAgICAgIE1BQ1NUUiAiIEE0PSIgTUFDU1RSICJcbiIsCisJICAgICAgIE1BQzJTVFIodHhkZXNjLmFkZHIxKSwgTUFDMlNUUih0eGRlc2MuYWRkcjIpLAorCSAgICAgICBNQUMyU1RSKHR4ZGVzYy5hZGRyMyksIE1BQzJTVFIodHhkZXNjLmFkZHI0KSk7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgdm9pZCBob3N0YXBfaW5mb190YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gKGxvY2FsX2luZm9fdCAqKSBkYXRhOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZsb2NhbC0+aW5mb19saXN0KSkgIT0gTlVMTCkgeworCQlob3N0YXBfaW5mb19wcm9jZXNzKGxvY2FsLCBza2IpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIHZvaWQgcHJpc20yX2luZm8obG9jYWxfaW5mb190ICpsb2NhbCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPmRldjsKKwl1MTYgZmlkOworCWludCByZXMsIGxlZnQ7CisJc3RydWN0IGhmYTM4NHhfaW5mb19mcmFtZSBpbmZvOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlmaWQgPSBIRkEzODRYX0lOVyhIRkEzODRYX0lORk9GSURfT0ZGKTsKKworCXNwaW5fbG9jaygmbG9jYWwtPmJhcGxvY2spOworCXJlcyA9IGhmYTM4NHhfc2V0dXBfYmFwKGRldiwgQkFQMCwgZmlkLCAwKTsKKwlpZiAoIXJlcykKKwkJcmVzID0gaGZhMzg0eF9mcm9tX2JhcChkZXYsIEJBUDAsICZpbmZvLCBzaXplb2YoaW5mbykpOworCWlmIChyZXMpIHsKKwkJc3Bpbl91bmxvY2soJmxvY2FsLT5iYXBsb2NrKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBnZXQgaW5mbyBmcmFtZSAoZmlkPTB4JTA0eClcbiIsCisJCSAgICAgICBmaWQpOworCQlpZiAocmVzID09IC1FVElNRURPVVQpIHsKKwkJCXNjaGVkdWxlX3dvcmsoJmxvY2FsLT5yZXNldF9xdWV1ZSk7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJbGUxNl90b19jcHVzKCZpbmZvLmxlbik7CisJbGUxNl90b19jcHVzKCZpbmZvLnR5cGUpOworCWxlZnQgPSAoaW5mby5sZW4gLSAxKSAqIDI7CisKKwlpZiAoaW5mby5sZW4gJiAweDgwMDAgfHwgaW5mby5sZW4gPT0gMCB8fCBsZWZ0ID4gMjA2MCkgeworCQkvKiBkYXRhIHJlZ2lzdGVyIHNlZW1zIHRvIGdpdmUgMHg4MDAwIGluIHNvbWUgZXJyb3IgY2FzZXMgZXZlbgorCQkgKiB0aG91Z2ggYnVzeSBiaXQgaXMgbm90IHNldCBpbiBvZmZzZXQgcmVnaXN0ZXI7CisJCSAqIGluIGFkZGl0aW9uLCBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAxIGR1ZSB0byB0eXBlIGZpZWxkICovCisJCXNwaW5fdW5sb2NrKCZsb2NhbC0+YmFwbG9jayk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVjZWl2ZWQgaW5mbyBmcmFtZSB3aXRoIGludmFsaWQgIgorCQkgICAgICAgImxlbmd0aCAweCUwNHggKHR5cGUgMHglMDR4KVxuIiwgZGV2LT5uYW1lLCBpbmZvLmxlbiwKKwkJICAgICAgIGluZm8udHlwZSk7CisJCWdvdG8gb3V0OworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKGluZm8pICsgbGVmdCk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrKCZsb2NhbC0+YmFwbG9jayk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ291bGQgbm90IGFsbG9jYXRlIHNrYiBmb3IgaW5mbyAiCisJCSAgICAgICAiZnJhbWVcbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCW1lbWNweShza2JfcHV0KHNrYiwgc2l6ZW9mKGluZm8pKSwgJmluZm8sIHNpemVvZihpbmZvKSk7CisJaWYgKGxlZnQgPiAwICYmIGhmYTM4NHhfZnJvbV9iYXAoZGV2LCBCQVAwLCBza2JfcHV0KHNrYiwgbGVmdCksIGxlZnQpKQorCXsKKwkJc3Bpbl91bmxvY2soJmxvY2FsLT5iYXBsb2NrKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEluZm8gZnJhbWUgcmVhZCBmYWlsZWQgKGZpZD0weCUwNHgsICIKKwkJICAgICAgICJsZW49MHglMDR4LCB0eXBlPTB4JTA0eFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZmlkLCBpbmZvLmxlbiwgaW5mby50eXBlKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlnb3RvIG91dDsKKwl9CisJc3Bpbl91bmxvY2soJmxvY2FsLT5iYXBsb2NrKTsKKworCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+aW5mb19saXN0LCBza2IpOworCXRhc2tsZXRfc2NoZWR1bGUoJmxvY2FsLT5pbmZvX3Rhc2tsZXQpOworCisgb3V0OgorCUhGQTM4NFhfT1VUVyhIRkEzODRYX0VWX0lORk8sIEhGQTM4NFhfRVZBQ0tfT0ZGKTsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyB2b2lkIGhvc3RhcF9iYXBfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IChsb2NhbF9pbmZvX3QgKikgZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPmRldjsKKwl1MTYgZXY7CisJaW50IGZyYW1lcyA9IDMwOworCisJaWYgKGxvY2FsLT5mdW5jLT5jYXJkX3ByZXNlbnQgJiYgIWxvY2FsLT5mdW5jLT5jYXJkX3ByZXNlbnQobG9jYWwpKQorCQlyZXR1cm47CisKKwlzZXRfYml0KEhPU1RBUF9CSVRTX0JBUF9UQVNLTEVULCAmbG9jYWwtPmJpdHMpOworCisJLyogUHJvY2VzcyBhbGwgcGVuZGluZyBCQVAgZXZlbnRzIHdpdGhvdXQgZ2VuZXJhdGluZyBuZXcgaW50ZXJydXB0cworCSAqIGZvciB0aGVtICovCisJd2hpbGUgKGZyYW1lcy0tID4gMCkgeworCQlldiA9IEhGQTM4NFhfSU5XKEhGQTM4NFhfRVZTVEFUX09GRik7CisJCWlmIChldiA9PSAweGZmZmYgfHwgIShldiAmIEhGQTM4NFhfQkFQMF9FVkVOVFMpKQorCQkJYnJlYWs7CisJCWlmIChldiAmIEhGQTM4NFhfRVZfUlgpCisJCQlwcmlzbTJfcngobG9jYWwpOworCQlpZiAoZXYgJiBIRkEzODRYX0VWX0lORk8pCisJCQlwcmlzbTJfaW5mbyhsb2NhbCk7CisJCWlmIChldiAmIEhGQTM4NFhfRVZfVFgpCisJCQlwcmlzbTJfdHhfZXYobG9jYWwpOworCQlpZiAoZXYgJiBIRkEzODRYX0VWX1RYRVhDKQorCQkJcHJpc20yX3R4ZXhjKGxvY2FsKTsKKwl9CisKKwlzZXRfYml0KEhPU1RBUF9CSVRTX0JBUF9UQVNLTEVUMiwgJmxvY2FsLT5iaXRzKTsKKwljbGVhcl9iaXQoSE9TVEFQX0JJVFNfQkFQX1RBU0tMRVQsICZsb2NhbC0+Yml0cyk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgbmV3IEJBUCBldmVudHMgKi8KKwloZmEzODR4X2V2ZW50c19hbGwoZGV2KTsKKwljbGVhcl9iaXQoSE9TVEFQX0JJVFNfQkFQX1RBU0tMRVQyLCAmbG9jYWwtPmJpdHMpOworfQorCisKKy8qIENhbGxlZCBvbmx5IGZyb20gaGFyZHdhcmUgSVJRICovCitzdGF0aWMgdm9pZCBwcmlzbTJfaW5mZHJvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfaW5xdWlyZSA9IDA7CisKKwlQREVCVUcoREVCVUdfRVhUUkEsICIlczogSU5GRFJPUCBldmVudFxuIiwgZGV2LT5uYW1lKTsKKworCS8qIHNvbWUgZmlybXdhcmUgdmVyc2lvbnMgc2VlbSB0byBnZXQgc3R1Y2sgd2l0aAorCSAqIGZ1bGwgQ29tbVRhbGxpZXMgaW4gaGlnaCB0cmFmZmljIGxvYWQgY2FzZXM7IGV2ZXJ5CisJICogcGFja2V0IHdpbGwgdGhlbiBjYXVzZSBJTkZEUk9QIGV2ZW50IGFuZCBDb21tVGFsbGllcworCSAqIGluZm8gZnJhbWUgd2lsbCBub3QgYmUgc2VudCBhdXRvbWF0aWNhbGx5LiBUcnkgdG8KKwkgKiBnZXQgb3V0IG9mIHRoaXMgc3RhdGUgYnkgaW5xdWlyaW5nIENvbW1UYWxsaWVzLiAqLworCWlmICghbGFzdF9pbnF1aXJlIHx8IHRpbWVfYWZ0ZXIoamlmZmllcywgbGFzdF9pbnF1aXJlICsgSFopKSB7CisJCWhmYTM4NHhfY21kX2NhbGxiYWNrKGRldiwgSEZBMzg0WF9DTURDT0RFX0lOUVVJUkUsCisJCQkJICAgICBIRkEzODRYX0lORk9fQ09NTVRBTExJRVMsIE5VTEwsIDApOworCQlsYXN0X2lucXVpcmUgPSBqaWZmaWVzOworCX0KK30KKworCisvKiBDYWxsZWQgb25seSBmcm9tIGhhcmR3YXJlIElSUSAqLworc3RhdGljIHZvaWQgcHJpc20yX2V2X3RpY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1MTYgZXZzdGF0LCBpbnRlbjsKKwlzdGF0aWMgaW50IHByZXZfc3R1Y2sgPSAwOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbG9jYWwtPmxhc3RfdGlja190aW1lciArIDUgKiBIWikgJiYKKwkgICAgbG9jYWwtPmxhc3RfdGlja190aW1lcikgeworCQlldnN0YXQgPSBIRkEzODRYX0lOVyhIRkEzODRYX0VWU1RBVF9PRkYpOworCQlpbnRlbiA9IEhGQTM4NFhfSU5XKEhGQTM4NFhfSU5URU5fT0ZGKTsKKwkJaWYgKCFwcmV2X3N0dWNrKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU1cgVElDSyBzdHVjaz8gIgorCQkJICAgICAgICJiaXRzPTB4JWx4IEV2U3RhdD0lMDR4IEludEVuPSUwNHhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBsb2NhbC0+Yml0cywgZXZzdGF0LCBpbnRlbik7CisJCX0KKwkJbG9jYWwtPnN3X3RpY2tfc3R1Y2srKzsKKwkJaWYgKChldnN0YXQgJiBIRkEzODRYX0JBUDBfRVZFTlRTKSAmJgorCQkgICAgKGludGVuICYgSEZBMzg0WF9CQVAwX0VWRU5UUykpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiB0cnlpbmcgdG8gcmVjb3ZlciBmcm9tIElSUSAiCisJCQkgICAgICAgImhhbmdcbiIsIGRldi0+bmFtZSk7CisJCQloZmEzODR4X2V2ZW50c19ub19iYXAwKGRldik7CisJCX0KKwkJcHJldl9zdHVjayA9IDE7CisJfSBlbHNlCisJCXByZXZfc3R1Y2sgPSAwOworfQorCisKKy8qIENhbGxlZCBvbmx5IGZyb20gaGFyZHdhcmUgSVJRICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpc20yX2NoZWNrX21hZ2ljKGxvY2FsX2luZm9fdCAqbG9jYWwpCit7CisJLyogYXQgbGVhc3QgUENJIFByaXNtMi41IHdpdGggYnVzIG1hc3RlcmluZyBzZWVtcyB0byBzb21ldGltZXMKKwkgKiByZXR1cm4gMHgwMDAwIGluIFNXU1VQUE9SVDAgZm9yIHVua25vd24gcmVhc29uLCBidXQgcmUtcmVhZGluZyB0aGUKKwkgKiByZWdpc3RlciBvbmNlIG9yIHR3aWNlIHNlZW1zIHRvIGdldCB0aGUgY29ycmVjdCB2YWx1ZS4uIFBDSSBjYXJkcworCSAqIGNhbm5vdCBhbnl3YXkgYmUgcmVtb3ZlZCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiwgc28gdGhlcmUgaXMgbm90CisJICogcmVhbGx5IGFueSBuZWVkIGZvciB0aGlzIHZlcmlmaWNhdGlvbiB3aXRoIHRoZW0uICovCisKKyNpZm5kZWYgUFJJU00yX1BDSQorI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9tYWdpY19lcnIgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsb2NhbC0+ZGV2OworCisJaWYgKEhGQTM4NFhfSU5XKEhGQTM4NFhfU1dTVVBQT1JUMF9PRkYpICE9IEhGQTM4NFhfTUFHSUMpIHsKKwkJaWYgKCFsb2NhbC0+aHdfcmVhZHkpCisJCQlyZXR1cm47CisJCUhGQTM4NFhfT1VUVygweGZmZmYsIEhGQTM4NFhfRVZBQ0tfT0ZGKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbGFzdF9tYWdpY19lcnIgKyAxMCAqIEhaKSkgeworCQkJcHJpbnRrKCIlczogSW50ZXJydXB0LCBidXQgU1dTVVBQT1JUMCBkb2VzIG5vdCBtYXRjaDogIgorCQkJICAgICAgICIlMDRYICE9ICUwNFggLSBjYXJkIHJlbW92ZWQ/XG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgSEZBMzg0WF9JTlcoSEZBMzg0WF9TV1NVUFBPUlQwX09GRiksCisJCQkgICAgICAgSEZBMzg0WF9NQUdJQyk7CisJCQlsYXN0X21hZ2ljX2VyciA9IGppZmZpZXM7CisJCX0gZWxzZSBpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdCAtIFNXU1VQUE9SVDA9JTA0eCAiCisJCQkgICAgICAgIk1BR0lDPSUwNHhcbiIsIGRldi0+bmFtZSwKKwkJCSAgICAgICBIRkEzODRYX0lOVyhIRkEzODRYX1NXU1VQUE9SVDBfT0ZGKSwKKwkJCSAgICAgICBIRkEzODRYX01BR0lDKTsKKwkJfQorCQlpZiAoSEZBMzg0WF9JTlcoSEZBMzg0WF9TV1NVUFBPUlQwX09GRikgIT0gMHhmZmZmKQorCQkJc2NoZWR1bGVfd29yaygmbG9jYWwtPnJlc2V0X3F1ZXVlKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvKiBmaW5hbF92ZXJzaW9uICovCisjZW5kaWYgLyogIVBSSVNNMl9QQ0kgKi8KK30KKworCisvKiBDYWxsZWQgb25seSBmcm9tIGhhcmR3YXJlIElSUSAqLworc3RhdGljIGlycXJldHVybl90IHByaXNtMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgZXZlbnRzID0gMDsKKwl1MTYgZXY7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlwcmlzbTJfaW9fZGVidWdfYWRkKGRldiwgUFJJU00yX0lPX0RFQlVHX0NNRF9JTlRFUlJVUFQsIDAsIDApOworCisJaWYgKGxvY2FsLT5mdW5jLT5jYXJkX3ByZXNlbnQgJiYgIWxvY2FsLT5mdW5jLT5jYXJkX3ByZXNlbnQobG9jYWwpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogSW50ZXJydXB0LCBidXQgZGV2IG5vdCBPS1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQl9CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlwcmlzbTJfY2hlY2tfbWFnaWMobG9jYWwpOworCisJZm9yICg7OykgeworCQlldiA9IEhGQTM4NFhfSU5XKEhGQTM4NFhfRVZTVEFUX09GRik7CisJCWlmIChldiA9PSAweGZmZmYpIHsKKwkJCWlmIChsb2NhbC0+c2h1dGRvd24pCisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJSEZBMzg0WF9PVVRXKDB4ZmZmZiwgSEZBMzg0WF9FVkFDS19PRkYpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwcmlzbTJfaW50ZXJydXB0OiBldj0weGZmZmZcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCisJCWV2ICY9IEhGQTM4NFhfSU5XKEhGQTM4NFhfSU5URU5fT0ZGKTsKKwkJaWYgKGV2ID09IDApCisJCQlicmVhazsKKworCQlpZiAoZXYgJiBIRkEzODRYX0VWX0NNRCkgeworCQkJcHJpc20yX2NtZF9ldihkZXYpOworCQl9CisKKwkJLyogQWJvdmUgZXZlbnRzIGFyZSBuZWVkZWQgZXZlbiBiZWZvcmUgaHcgaXMgcmVhZHksIGJ1dCBvdGhlcgorCQkgKiBldmVudHMgc2hvdWxkIGJlIHNraXBwZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBUaGlzIG1heQorCQkgKiBjaGFuZ2UgZm9yIEFsbG9jRXYgaWYgYWxsb2NhdGVfZmlkIGlzIGltcGxlbWVudGVkIHdpdGhvdXQKKwkJICogYnVzeSB3YWl0aW5nLiAqLworCQlpZiAoIWxvY2FsLT5od19yZWFkeSB8fCBsb2NhbC0+aHdfcmVzZXR0aW5nIHx8CisJCSAgICAhbG9jYWwtPmRldl9lbmFibGVkKSB7CisJCQlldiA9IEhGQTM4NFhfSU5XKEhGQTM4NFhfRVZTVEFUX09GRik7CisJCQlpZiAoZXYgJiBIRkEzODRYX0VWX0NNRCkKKwkJCQlnb3RvIG5leHRfZXZlbnQ7CisJCQlpZiAoKGV2ICYgSEZBMzg0WF9FVkVOVF9NQVNLKSA9PSAwKQorCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCWlmIChsb2NhbC0+ZGV2X2VuYWJsZWQgJiYgKGV2ICYgfkhGQTM4NFhfRVZfVElDSykgJiYKKwkJCSAgICBuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHByaXNtMl9pbnRlcnJ1cHQ6IGh3ICIKKwkJCQkgICAgICAgIm5vdCByZWFkeTsgc2tpcHBpbmcgZXZlbnRzIDB4JTA0eCAiCisJCQkJICAgICAgICIoSW50RW49MHglMDR4KSVzJXMlc1xuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBldiwKKwkJCQkgICAgICAgSEZBMzg0WF9JTlcoSEZBMzg0WF9JTlRFTl9PRkYpLAorCQkJCSAgICAgICAhbG9jYWwtPmh3X3JlYWR5ID8gIiAoIWh3X3JlYWR5KSIgOiAiIiwKKwkJCQkgICAgICAgbG9jYWwtPmh3X3Jlc2V0dGluZyA/CisJCQkJICAgICAgICIgKGh3X3Jlc2V0dGluZykiIDogIiIsCisJCQkJICAgICAgICFsb2NhbC0+ZGV2X2VuYWJsZWQgPworCQkJCSAgICAgICAiICghZGV2X2VuYWJsZWQpIiA6ICIiKTsKKwkJCX0KKwkJCUhGQTM4NFhfT1VUVyhldiwgSEZBMzg0WF9FVkFDS19PRkYpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJaWYgKGV2ICYgSEZBMzg0WF9FVl9USUNLKSB7CisJCQlwcmlzbTJfZXZfdGljayhkZXYpOworCQkJSEZBMzg0WF9PVVRXKEhGQTM4NFhfRVZfVElDSywgSEZBMzg0WF9FVkFDS19PRkYpOworCQl9CisKKwkJaWYgKGV2ICYgSEZBMzg0WF9FVl9BTExPQykgeworCQkJcHJpc20yX2FsbG9jX2V2KGRldik7CisJCQlIRkEzODRYX09VVFcoSEZBMzg0WF9FVl9BTExPQywgSEZBMzg0WF9FVkFDS19PRkYpOworCQl9CisKKwkJLyogUmVhZGluZyBkYXRhIGZyb20gdGhlIGNhcmQgaXMgcXVpdGUgdGltZSBjb25zdW1pbmcsIHNvIGRvIGl0CisJCSAqIGluIHRhc2tsZXRzLiBUWCwgVFhFWEMsIFJYLCBhbmQgSU5GTyBldmVudHMgd2lsbCBiZSBBQ0tlZAorCQkgKiBhbmQgdW5tYXNrZWQgYWZ0ZXIgbmVlZGVkIGRhdGEgaGFzIGJlZW4gcmVhZCBjb21wbGV0ZWx5LiAqLworCQlpZiAoZXYgJiBIRkEzODRYX0JBUDBfRVZFTlRTKSB7CisJCQloZmEzODR4X2V2ZW50c19ub19iYXAwKGRldik7CisJCQl0YXNrbGV0X3NjaGVkdWxlKCZsb2NhbC0+YmFwX3Rhc2tsZXQpOworCQl9CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQlpZiAoZXYgJiBIRkEzODRYX0VWX1dURVJSKSB7CisJCQlQREVCVUcoREVCVUdfRVhUUkEsICIlczogV1RFUlIgZXZlbnRcbiIsIGRldi0+bmFtZSk7CisJCQlIRkEzODRYX09VVFcoSEZBMzg0WF9FVl9XVEVSUiwgSEZBMzg0WF9FVkFDS19PRkYpOworCQl9CisjZW5kaWYgLyogZmluYWxfdmVyc2lvbiAqLworCisJCWlmIChldiAmIEhGQTM4NFhfRVZfSU5GRFJPUCkgeworCQkJcHJpc20yX2luZmRyb3AoZGV2KTsKKwkJCUhGQTM4NFhfT1VUVyhIRkEzODRYX0VWX0lORkRST1AsIEhGQTM4NFhfRVZBQ0tfT0ZGKTsKKwkJfQorCisJbmV4dF9ldmVudDoKKwkJZXZlbnRzKys7CisJCWlmIChldmVudHMgPj0gUFJJU00yX01BWF9JTlRFUlJVUFRfRVZFTlRTKSB7CisJCQlQREVCVUcoREVCVUdfRVhUUkEsICJwcmlzbTJfaW50ZXJydXB0OiA+JWQgZXZlbnRzICIKKwkJCSAgICAgICAiKEV2U3RhdD0weCUwNHgpXG4iLAorCQkJICAgICAgIFBSSVNNMl9NQVhfSU5URVJSVVBUX0VWRU5UUywKKwkJCSAgICAgICBIRkEzODRYX0lOVyhIRkEzODRYX0VWU1RBVF9PRkYpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXByaXNtMl9pb19kZWJ1Z19hZGQoZGV2LCBQUklTTTJfSU9fREVCVUdfQ01EX0lOVEVSUlVQVCwgMCwgMSk7CisJcmV0dXJuIElSUV9SRVRWQUwoZXZlbnRzKTsKK30KKworCitzdGF0aWMgdm9pZCBwcmlzbTJfY2hlY2tfc3RhX2Z3X3ZlcnNpb24obG9jYWxfaW5mb190ICpsb2NhbCkKK3sKKwlzdHJ1Y3QgaGZhMzg0eF9jb21wX2lkZW50IGNvbXA7CisJaW50IGlkLCB2YXJpYW50LCBtYWpvciwgbWlub3I7CisKKwlpZiAoaGZhMzg0eF9nZXRfcmlkKGxvY2FsLT5kZXYsIEhGQTM4NFhfUklEX1NUQUlELAorCQkJICAgICZjb21wLCBzaXplb2YoY29tcCksIDEpIDwgMCkKKwkJcmV0dXJuOworCisJbG9jYWwtPmZ3X2FwID0gMDsKKwlpZCA9IGxlMTZfdG9fY3B1KGNvbXAuaWQpOworCWlmIChpZCAhPSBIRkEzODRYX0NPTVBfSURfU1RBKSB7CisJCWlmIChpZCA9PSBIRkEzODRYX0NPTVBfSURfRldfQVApCisJCQlsb2NhbC0+ZndfYXAgPSAxOworCQlyZXR1cm47CisJfQorCisJbWFqb3IgPSBfX2xlMTZfdG9fY3B1KGNvbXAubWFqb3IpOworCW1pbm9yID0gX19sZTE2X3RvX2NwdShjb21wLm1pbm9yKTsKKwl2YXJpYW50ID0gX19sZTE2X3RvX2NwdShjb21wLnZhcmlhbnQpOworCWxvY2FsLT5zdGFfZndfdmVyID0gUFJJU00yX0ZXX1ZFUihtYWpvciwgbWlub3IsIHZhcmlhbnQpOworCisJLyogU3RhdGlvbiBmaXJtd2FyZSB2ZXJzaW9ucyBiZWZvcmUgMS40Lnggc2VlbSB0byBoYXZlIGEgYnVnIGluCisJICogZmlybXdhcmUtYmFzZWQgV0VQIGVuY3J5cHRpb24gd2hlbiB1c2luZyBIb3N0IEFQIG1vZGUsIHNvIHVzZQorCSAqIGhvc3RfZW5jcnlwdCBhcyBhIGRlZmF1bHQgZm9yIHRoZW0uIEZpcm13YXJlIHZlcnNpb24gMS40LjkgaXMgdGhlCisJICogZmlyc3Qgb25lIHRoYXQgaGFzIGJlZW4gc2VlbiB0byBwcm9kdWNlIGNvcnJlY3QgZW5jcnlwdGlvbiwgYnV0IHRoZQorCSAqIGJ1ZyBtaWdodCBiZSBmaXhlZCBiZWZvcmUgdGhhdCAoYWx0aG91Z2gsIGF0IGxlYXN0IDEuNC4yIGlzIGJyb2tlbikuCisJICovCisJbG9jYWwtPmZ3X2VuY3J5cHRfb2sgPSBsb2NhbC0+c3RhX2Z3X3ZlciA+PSBQUklTTTJfRldfVkVSKDEsNCw5KTsKKworCWlmIChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiAmJiAhbG9jYWwtPmhvc3RfZW5jcnlwdCAmJgorCSAgICAhbG9jYWwtPmZ3X2VuY3J5cHRfb2spIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkZWZhdWx0aW5nIHRvIGhvc3QtYmFzZWQgZW5jcnlwdGlvbiBhcyAiCisJCSAgICAgICAiYSB3b3JrYXJvdW5kIGZvciBmaXJtd2FyZSBidWcgaW4gSG9zdCBBUCBtb2RlIFdFUFxuIiwKKwkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUpOworCQlsb2NhbC0+aG9zdF9lbmNyeXB0ID0gMTsKKwl9CisKKwkvKiBJRUVFIDgwMi4xMSBzdGFuZGFyZCBjb21wbGlhbnQgV0RTIGZyYW1lcyAoNCBhZGRyZXNzZXMpIHdlcmUgYnJva2VuCisJICogaW4gc3RhdGlvbiBmaXJtd2FyZSB2ZXJzaW9ucyBiZWZvcmUgMS41LnguIFdpdGggdGhlc2UgdmVyc2lvbnMsIHRoZQorCSAqIGRyaXZlciB1c2VzIGEgd29ya2Fyb3VuZCB3aXRoIGJvZ3VzIGZyYW1lIGZvcm1hdCAoNHRoIGFkZHJlc3MgYWZ0ZXIKKwkgKiB0aGUgcGF5bG9hZCkuIFRoaXMgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdGhlciBBUCBkZXZpY2VzLiBTaW5jZQorCSAqIHRoZSBmaXJtd2FyZSBidWcgaXMgZml4ZWQgaW4gdGhlIGxhdGVzdCBzdGF0aW9uIGZpcm13YXJlIHZlcnNpb25zLAorCSAqIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHN0YW5kYXJkIGNvbXBsaWFudCBtb2RlIGZvciBjYXJkcyB1c2luZyBzdGF0aW9uCisJICogZmlybXdhcmUgdmVyc2lvbiAxLjUuMCBvciBuZXdlci4gKi8KKwlpZiAobG9jYWwtPnN0YV9md192ZXIgPj0gUFJJU00yX0ZXX1ZFUigxLDUsMCkpCisJCWxvY2FsLT53ZHNfdHlwZSB8PSBIT1NUQVBfV0RTX1NUQU5EQVJEX0ZSQU1FOworCWVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRlZmF1bHRpbmcgdG8gYm9ndXMgV0RTIGZyYW1lIGFzIGEgIgorCQkgICAgICAgIndvcmthcm91bmQgZm9yIGZpcm13YXJlIGJ1ZyBpbiBIb3N0IEFQIG1vZGUgV0RTXG4iLAorCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSk7CisJfQorCisJaG9zdGFwX2NoZWNrX3N0YV9md192ZXJzaW9uKGxvY2FsLT5hcCwgbG9jYWwtPnN0YV9md192ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl9jcnlwdF9kZWluaXRfZW50cmllcyhsb2NhbF9pbmZvX3QgKmxvY2FsLCBpbnQgZm9yY2UpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmVudHJ5OworCisJZm9yIChwdHIgPSBsb2NhbC0+Y3J5cHRfZGVpbml0X2xpc3QubmV4dCwgbiA9IHB0ci0+bmV4dDsKKwkgICAgIHB0ciAhPSAmbG9jYWwtPmNyeXB0X2RlaW5pdF9saXN0OyBwdHIgPSBuLCBuID0gcHRyLT5uZXh0KSB7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSwgbGlzdCk7CisKKwkJaWYgKGF0b21pY19yZWFkKCZlbnRyeS0+cmVmY250KSAhPSAwICYmICFmb3JjZSkKKwkJCWNvbnRpbnVlOworCisJCWxpc3RfZGVsKHB0cik7CisKKwkJaWYgKGVudHJ5LT5vcHMpCisJCQllbnRyeS0+b3BzLT5kZWluaXQoZW50cnktPnByaXYpOworCQlrZnJlZShlbnRyeSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl9jcnlwdF9kZWluaXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IChsb2NhbF9pbmZvX3QgKikgZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJcHJpc20yX2NyeXB0X2RlaW5pdF9lbnRyaWVzKGxvY2FsLCAwKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmxvY2FsLT5jcnlwdF9kZWluaXRfbGlzdCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbnRyaWVzIHJlbWFpbmluZyBpbiBkZWxheWVkIGNyeXB0ICIKKwkJICAgICAgICJkZWxldGlvbiBsaXN0XG4iLCBsb2NhbC0+ZGV2LT5uYW1lKTsKKwkJbG9jYWwtPmNyeXB0X2RlaW5pdF90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOworCQlhZGRfdGltZXIoJmxvY2FsLT5jcnlwdF9kZWluaXRfdGltZXIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+bG9jaywgZmxhZ3MpOworCit9CisKKworc3RhdGljIHZvaWQgaG9zdGFwX3Bhc3NpdmVfc2Nhbih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IChsb2NhbF9pbmZvX3QgKikgZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPmRldjsKKwl1MTYgY2hhbm5lbDsKKworCWlmIChsb2NhbC0+cGFzc2l2ZV9zY2FuX2ludGVydmFsIDw9IDApCisJCXJldHVybjsKKworCWlmIChsb2NhbC0+cGFzc2l2ZV9zY2FuX3N0YXRlID09IFBBU1NJVkVfU0NBTl9MSVNURU4pIHsKKwkJaW50IG1heF90cmllcyA9IDE2OworCisJCS8qIEV2ZW4gdGhvdWdoIGhvc3Qgc3lzdGVtIGRvZXMgbm90IHJlYWxseSBrbm93IHdoZW4gdGhlIFdMQU4KKwkJICogTUFDIGlzIHNlbmRpbmcgZnJhbWVzLCB0cnkgdG8gYXZvaWQgY2hhbmdpbmcgY2hhbm5lbHMgZm9yCisJCSAqIHBhc3NpdmUgc2Nhbm5pbmcgd2hlbiBhIGhvc3QtZ2VuZXJhdGVkIGZyYW1lIGlzIGJlaW5nCisJCSAqIHRyYW5zbWl0dGVkICovCisJCWlmICh0ZXN0X2JpdChIT1NUQVBfQklUU19UUkFOU01JVCwgJmxvY2FsLT5iaXRzKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwYXNzaXZlIHNjYW4gZGV0ZWN0ZWQgcGVuZGluZyAiCisJCQkgICAgICAgIlRYIC0gZGVsYXlpbmdcbiIsIGRldi0+bmFtZSk7CisJCQlsb2NhbC0+cGFzc2l2ZV9zY2FuX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDsKKwkJCWFkZF90aW1lcigmbG9jYWwtPnBhc3NpdmVfc2Nhbl90aW1lcik7CisJCQlyZXR1cm47CisJCX0KKworCQlkbyB7CisJCQlsb2NhbC0+cGFzc2l2ZV9zY2FuX2NoYW5uZWwrKzsKKwkJCWlmIChsb2NhbC0+cGFzc2l2ZV9zY2FuX2NoYW5uZWwgPiAxNCkKKwkJCQlsb2NhbC0+cGFzc2l2ZV9zY2FuX2NoYW5uZWwgPSAxOworCQkJbWF4X3RyaWVzLS07CisJCX0gd2hpbGUgKCEobG9jYWwtPmNoYW5uZWxfbWFzayAmCisJCQkgICAoMSA8PCAobG9jYWwtPnBhc3NpdmVfc2Nhbl9jaGFubmVsIC0gMSkpKSAmJgorCQkJIG1heF90cmllcyA+IDApOworCisJCWlmIChtYXhfdHJpZXMgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIGFsbG93ZWQgcGFzc2l2ZSBzY2FuIGNoYW5uZWxzIgorCQkJICAgICAgICIgZm91bmRcbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBhc3NpdmUgc2NhbiBjaGFubmVsICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBsb2NhbC0+cGFzc2l2ZV9zY2FuX2NoYW5uZWwpOworCQljaGFubmVsID0gbG9jYWwtPnBhc3NpdmVfc2Nhbl9jaGFubmVsOworCQlsb2NhbC0+cGFzc2l2ZV9zY2FuX3N0YXRlID0gUEFTU0lWRV9TQ0FOX1dBSVQ7CisJCWxvY2FsLT5wYXNzaXZlX3NjYW5fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAvIDEwOworCX0gZWxzZSB7CisJCWNoYW5uZWwgPSBsb2NhbC0+Y2hhbm5lbDsKKwkJbG9jYWwtPnBhc3NpdmVfc2Nhbl9zdGF0ZSA9IFBBU1NJVkVfU0NBTl9MSVNURU47CisJCWxvY2FsLT5wYXNzaXZlX3NjYW5fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQkJbG9jYWwtPnBhc3NpdmVfc2Nhbl9pbnRlcnZhbCAqIEhaOworCX0KKworCWlmIChoZmEzODR4X2NtZF9jYWxsYmFjayhkZXYsIEhGQTM4NFhfQ01EQ09ERV9URVNUIHwKKwkJCQkgKEhGQTM4NFhfVEVTVF9DSEFOR0VfQ0hBTk5FTCA8PCA4KSwKKwkJCQkgY2hhbm5lbCwgTlVMTCwgMCkpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBhc3NpdmUgc2NhbiBjaGFubmVsIHNldCAlZCAiCisJCSAgICAgICAiZmFpbGVkXG4iLCBkZXYtPm5hbWUsIGNoYW5uZWwpOworCisJYWRkX3RpbWVyKCZsb2NhbC0+cGFzc2l2ZV9zY2FuX3RpbWVyKTsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHNjaGVkdWxlZCB0YXNrIHdoZW4gY29tbXVuaWNhdGlvbnMgcXVhbGl0eSB2YWx1ZXMgc2hvdWxkCisgKiBiZSB1cGRhdGVkLiAqLworc3RhdGljIHZvaWQgaGFuZGxlX2NvbW1zX3F1YWxfdXBkYXRlKHZvaWQgKmRhdGEpCit7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IGRhdGE7CisJcHJpc20yX3VwZGF0ZV9jb21tc19xdWFsKGxvY2FsLT5kZXYpOworfQorCisKKy8qIFNvZnR3YXJlIHdhdGNoZG9nIC0gY2FsbGVkIGFzIGEgdGltZXIuIEhhcmR3YXJlIGludGVycnVwdCAoVGljayBldmVudCkgaXMKKyAqIHVzZWQgdG8gbW9uaXRvciB0aGF0IGxvY2FsLT5sYXN0X3RpY2tfdGltZXIgaXMgYmVpbmcgdXBkYXRlZC4gSWYgbm90LAorICogaW50ZXJydXB0IGJ1c3ktbG9vcCBpcyBhc3N1bWVkIGFuZCBkcml2ZXIgdHJpZXMgdG8gcmVjb3ZlciBieSBtYXNraW5nIG91dAorICogc29tZSBldmVudHMuICovCitzdGF0aWMgdm9pZCBob3N0YXBfdGlja190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9pbnF1aXJlID0gMDsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gKGxvY2FsX2luZm9fdCAqKSBkYXRhOworCWxvY2FsLT5sYXN0X3RpY2tfdGltZXIgPSBqaWZmaWVzOworCisJLyogSW5xdWlyZSBDb21tVGFsbGllcyBldmVyeSAxMCBzZWNvbmRzIHRvIGtlZXAgdGhlIHN0YXRpc3RpY3MgdXBkYXRlZAorCSAqIG1vcmUgb2Z0ZW4gZHVyaW5nIGxvdyBsb2FkIGFuZCB3aGVuIHVzaW5nIDMyLWJpdCB0YWxsaWVzLiAqLworCWlmICgoIWxhc3RfaW5xdWlyZSB8fCB0aW1lX2FmdGVyKGppZmZpZXMsIGxhc3RfaW5xdWlyZSArIDEwICogSFopKSAmJgorCSAgICAhbG9jYWwtPmh3X2Rvd25sb2FkaW5nICYmIGxvY2FsLT5od19yZWFkeSAmJgorCSAgICAhbG9jYWwtPmh3X3Jlc2V0dGluZyAmJiBsb2NhbC0+ZGV2X2VuYWJsZWQpIHsKKwkJaGZhMzg0eF9jbWRfY2FsbGJhY2sobG9jYWwtPmRldiwgSEZBMzg0WF9DTURDT0RFX0lOUVVJUkUsCisJCQkJICAgICBIRkEzODRYX0lORk9fQ09NTVRBTExJRVMsIE5VTEwsIDApOworCQlsYXN0X2lucXVpcmUgPSBqaWZmaWVzOworCX0KKworCWlmICgobG9jYWwtPmxhc3RfY29tbXNfcXVhbF91cGRhdGUgPT0gMCB8fAorCSAgICAgdGltZV9hZnRlcihqaWZmaWVzLCBsb2NhbC0+bGFzdF9jb21tc19xdWFsX3VwZGF0ZSArIDEwICogSFopKSAmJgorCSAgICAobG9jYWwtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSB8fAorCSAgICAgbG9jYWwtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykpIHsKKwkJc2NoZWR1bGVfd29yaygmbG9jYWwtPmNvbW1zX3F1YWxfdXBkYXRlKTsKKwl9CisKKwlsb2NhbC0+dGlja190aW1lci5leHBpcmVzID0gamlmZmllcyArIDIgKiBIWjsKKwlhZGRfdGltZXIoJmxvY2FsLT50aWNrX3RpbWVyKTsKK30KKworCisjaWZuZGVmIFBSSVNNMl9OT19QUk9DRlNfREVCVUcKK3N0YXRpYyBpbnQgcHJpc20yX3JlZ2lzdGVyc19wcm9jX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpwID0gcGFnZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gKGxvY2FsX2luZm9fdCAqKSBkYXRhOworCisJaWYgKG9mZiAhPSAwKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKyNkZWZpbmUgU0hPV19SRUcobikgXAorcCArPSBzcHJpbnRmKHAsICNuICI9JTA0eFxuIiwgaGZhMzg0eF9yZWFkX3JlZyhsb2NhbC0+ZGV2LCBIRkEzODRYXyMjbiMjX09GRikpCisKKwlTSE9XX1JFRyhDTUQpOworCVNIT1dfUkVHKFBBUkFNMCk7CisJU0hPV19SRUcoUEFSQU0xKTsKKwlTSE9XX1JFRyhQQVJBTTIpOworCVNIT1dfUkVHKFNUQVRVUyk7CisJU0hPV19SRUcoUkVTUDApOworCVNIT1dfUkVHKFJFU1AxKTsKKwlTSE9XX1JFRyhSRVNQMik7CisJU0hPV19SRUcoSU5GT0ZJRCk7CisJU0hPV19SRUcoQ09OVFJPTCk7CisJU0hPV19SRUcoU0VMRUNUMCk7CisJU0hPV19SRUcoU0VMRUNUMSk7CisJU0hPV19SRUcoT0ZGU0VUMCk7CisJU0hPV19SRUcoT0ZGU0VUMSk7CisJU0hPV19SRUcoUlhGSUQpOworCVNIT1dfUkVHKEFMTE9DRklEKTsKKwlTSE9XX1JFRyhUWENPTVBMRklEKTsKKwlTSE9XX1JFRyhTV1NVUFBPUlQwKTsKKwlTSE9XX1JFRyhTV1NVUFBPUlQxKTsKKwlTSE9XX1JFRyhTV1NVUFBPUlQyKTsKKwlTSE9XX1JFRyhFVlNUQVQpOworCVNIT1dfUkVHKElOVEVOKTsKKwlTSE9XX1JFRyhFVkFDSyk7CisJLyogRG8gbm90IHJlYWQgZGF0YSByZWdpc3RlcnMsIGJlY2F1c2UgdGhleSBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZQorCSAqIE1BQyAob2Zmc2V0ICs9IDIpICovCisJLyogU0hPV19SRUcoREFUQTApOyAqLworCS8qIFNIT1dfUkVHKERBVEExKTsgKi8KKwlTSE9XX1JFRyhBVVhQQUdFKTsKKwlTSE9XX1JFRyhBVVhPRkZTRVQpOworCS8qIFNIT1dfUkVHKEFVWERBVEEpOyAqLworI2lmZGVmIFBSSVNNMl9QQ0kKKwlTSE9XX1JFRyhQQ0lDT1IpOworCVNIT1dfUkVHKFBDSUhDUik7CisJU0hPV19SRUcoUENJX00wX0FERFJIKTsKKwlTSE9XX1JFRyhQQ0lfTTBfQUREUkwpOworCVNIT1dfUkVHKFBDSV9NMF9MRU4pOworCVNIT1dfUkVHKFBDSV9NMF9DVEwpOworCVNIT1dfUkVHKFBDSV9TVEFUVVMpOworCVNIT1dfUkVHKFBDSV9NMV9BRERSSCk7CisJU0hPV19SRUcoUENJX00xX0FERFJMKTsKKwlTSE9XX1JFRyhQQ0lfTTFfTEVOKTsKKwlTSE9XX1JFRyhQQ0lfTTFfQ1RMKTsKKyNlbmRpZiAvKiBQUklTTTJfUENJICovCisKKwlyZXR1cm4gKHAgLSBwYWdlKTsKK30KKyNlbmRpZiAvKiBQUklTTTJfTk9fUFJPQ0ZTX0RFQlVHICovCisKKworc3RydWN0IHNldF90aW1fZGF0YSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludCBhaWQ7CisJaW50IHNldDsKK307CisKK3N0YXRpYyBpbnQgcHJpc20yX3NldF90aW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFpZCwgaW50IHNldCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IHNldF90aW1fZGF0YSAqbmV3X2VudHJ5OworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJbmV3X2VudHJ5ID0gKHN0cnVjdCBzZXRfdGltX2RhdGEgKikKKwkJa21hbGxvYyhzaXplb2YoKm5ld19lbnRyeSksIEdGUF9BVE9NSUMpOworCWlmIChuZXdfZW50cnkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHByaXNtMl9zZXRfdGltOiBrbWFsbG9jIGZhaWxlZFxuIiwKKwkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KG5ld19lbnRyeSwgMCwgc2l6ZW9mKCpuZXdfZW50cnkpKTsKKwluZXdfZW50cnktPmFpZCA9IGFpZDsKKwluZXdfZW50cnktPnNldCA9IHNldDsKKworCXNwaW5fbG9ja19iaCgmbG9jYWwtPnNldF90aW1fbG9jayk7CisJbGlzdF9mb3JfZWFjaChwdHIsICZsb2NhbC0+c2V0X3RpbV9saXN0KSB7CisJCXN0cnVjdCBzZXRfdGltX2RhdGEgKmVudHJ5ID0KKwkJCWxpc3RfZW50cnkocHRyLCBzdHJ1Y3Qgc2V0X3RpbV9kYXRhLCBsaXN0KTsKKwkJaWYgKGVudHJ5LT5haWQgPT0gYWlkKSB7CisJCQlQREVCVUcoREVCVUdfUFMyLCAiJXM6IHByaXNtMl9zZXRfdGltOiBhaWQ9JWQgIgorCQkJICAgICAgICJzZXQ9JWQgPT0+ICVkXG4iLAorCQkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUsIGFpZCwgZW50cnktPnNldCwgc2V0KTsKKwkJCWVudHJ5LT5zZXQgPSBzZXQ7CisJCQlrZnJlZShuZXdfZW50cnkpOworCQkJbmV3X2VudHJ5ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChuZXdfZW50cnkpCisJCWxpc3RfYWRkX3RhaWwoJm5ld19lbnRyeS0+bGlzdCwgJmxvY2FsLT5zZXRfdGltX2xpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+c2V0X3RpbV9sb2NrKTsKKworCXNjaGVkdWxlX3dvcmsoJmxvY2FsLT5zZXRfdGltX3F1ZXVlKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGhhbmRsZV9zZXRfdGltX3F1ZXVlKHZvaWQgKmRhdGEpCit7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IChsb2NhbF9pbmZvX3QgKikgZGF0YTsKKwlzdHJ1Y3Qgc2V0X3RpbV9kYXRhICplbnRyeTsKKwl1MTYgdmFsOworCisJZm9yICg7OykgeworCQllbnRyeSA9IE5VTEw7CisJCXNwaW5fbG9ja19iaCgmbG9jYWwtPnNldF90aW1fbG9jayk7CisJCWlmICghbGlzdF9lbXB0eSgmbG9jYWwtPnNldF90aW1fbGlzdCkpIHsKKwkJCWVudHJ5ID0gbGlzdF9lbnRyeShsb2NhbC0+c2V0X3RpbV9saXN0Lm5leHQsCisJCQkJCSAgIHN0cnVjdCBzZXRfdGltX2RhdGEsIGxpc3QpOworCQkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmbG9jYWwtPnNldF90aW1fbG9jayk7CisJCWlmICghZW50cnkpCisJCQlicmVhazsKKworCQlQREVCVUcoREVCVUdfUFMyLCAiJXM6IGhhbmRsZV9zZXRfdGltX3F1ZXVlOiBhaWQ9JWQgc2V0PSVkXG4iLAorCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSwgZW50cnktPmFpZCwgZW50cnktPnNldCk7CisKKwkJdmFsID0gZW50cnktPmFpZDsKKwkJaWYgKGVudHJ5LT5zZXQpCisJCQl2YWwgfD0gMHg4MDAwOworCQlpZiAoaG9zdGFwX3NldF93b3JkKGxvY2FsLT5kZXYsIEhGQTM4NFhfUklEX0NORlRJTUNUUkwsIHZhbCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2V0X3RpbSBmYWlsZWQgKGFpZD0lZCAiCisJCQkgICAgICAgInNldD0lZClcbiIsCisJCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSwgZW50cnktPmFpZCwgZW50cnktPnNldCk7CisJCX0KKworCQlrZnJlZShlbnRyeSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl9jbGVhcl9zZXRfdGltX3F1ZXVlKGxvY2FsX2luZm9fdCAqbG9jYWwpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG4sICZsb2NhbC0+c2V0X3RpbV9saXN0KSB7CisJCXN0cnVjdCBzZXRfdGltX2RhdGEgKmVudHJ5OworCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3Qgc2V0X3RpbV9kYXRhLCBsaXN0KTsKKwkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwkJa2ZyZWUoZW50cnkpOworCX0KK30KKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKgorcHJpc20yX2luaXRfbG9jYWxfZGF0YShzdHJ1Y3QgcHJpc20yX2hlbHBlcl9mdW5jdGlvbnMgKmZ1bmNzLCBpbnQgY2FyZF9pZHgsCisJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCXN0cnVjdCBsb2NhbF9pbmZvICpsb2NhbDsKKwlpbnQgbGVuLCBpLCByZXQ7CisKKwlpZiAoZnVuY3MgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW4gPSBzdHJsZW4oZGV2X3RlbXBsYXRlKTsKKwlpZiAobGVuID49IElGTkFNU0laIHx8IHN0cnN0cihkZXZfdGVtcGxhdGUsICIlZCIpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaG9zdGFwOiBJbnZhbGlkIGRldl90ZW1wbGF0ZT0nJXMnXG4iLAorCQkgICAgICAgZGV2X3RlbXBsYXRlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBob3N0YXBfaW50ZXJmYWNlKSArCisJCTMgKyBzaXplb2Yoc3RydWN0IGxvY2FsX2luZm8pICsKKwkJMyArIHNpemVvZihzdHJ1Y3QgYXBfZGF0YSk7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihsZW4pOworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSAoc3RydWN0IGxvY2FsX2luZm8gKikgKCgoKGxvbmcpIChpZmFjZSArIDEpKSArIDMpICYgfjMpOworCWxvY2FsLT5hcCA9IChzdHJ1Y3QgYXBfZGF0YSAqKSAoKCgobG9uZykgKGxvY2FsICsgMSkpICsgMykgJiB+Myk7CisJbG9jYWwtPmRldiA9IGlmYWNlLT5kZXYgPSBkZXY7CisJaWZhY2UtPmxvY2FsID0gbG9jYWw7CisJaWZhY2UtPnR5cGUgPSBIT1NUQVBfSU5URVJGQUNFX01BU1RFUjsKKwlJTklUX0xJU1RfSEVBRCgmbG9jYWwtPmhvc3RhcF9pbnRlcmZhY2VzKTsKKworCWxvY2FsLT5od19tb2R1bGUgPSBUSElTX01PRFVMRTsKKworI2lmZGVmIFBSSVNNMl9JT19ERUJVRworCWxvY2FsLT5pb19kZWJ1Z19lbmFibGVkID0gMTsKKyNlbmRpZiAvKiBQUklTTTJfSU9fREVCVUcgKi8KKworCWxvY2FsLT5mdW5jID0gZnVuY3M7CisJbG9jYWwtPmZ1bmMtPmNtZCA9IGhmYTM4NHhfY21kOworCWxvY2FsLT5mdW5jLT5yZWFkX3JlZ3MgPSBoZmEzODR4X3JlYWRfcmVnczsKKwlsb2NhbC0+ZnVuYy0+Z2V0X3JpZCA9IGhmYTM4NHhfZ2V0X3JpZDsKKwlsb2NhbC0+ZnVuYy0+c2V0X3JpZCA9IGhmYTM4NHhfc2V0X3JpZDsKKwlsb2NhbC0+ZnVuYy0+aHdfZW5hYmxlID0gcHJpc20yX2h3X2VuYWJsZTsKKwlsb2NhbC0+ZnVuYy0+aHdfY29uZmlnID0gcHJpc20yX2h3X2NvbmZpZzsKKwlsb2NhbC0+ZnVuYy0+aHdfcmVzZXQgPSBwcmlzbTJfaHdfcmVzZXQ7CisJbG9jYWwtPmZ1bmMtPmh3X3NodXRkb3duID0gcHJpc20yX2h3X3NodXRkb3duOworCWxvY2FsLT5mdW5jLT5yZXNldF9wb3J0ID0gcHJpc20yX3Jlc2V0X3BvcnQ7CisJbG9jYWwtPmZ1bmMtPnNjaGVkdWxlX3Jlc2V0ID0gcHJpc20yX3NjaGVkdWxlX3Jlc2V0OworI2lmZGVmIFBSSVNNMl9ET1dOTE9BRF9TVVBQT1JUCisJbG9jYWwtPmZ1bmMtPnJlYWRfYXV4ID0gcHJpc20yX2Rvd25sb2FkX2F1eF9kdW1wOworCWxvY2FsLT5mdW5jLT5kb3dubG9hZCA9IHByaXNtMl9kb3dubG9hZDsKKyNlbmRpZiAvKiBQUklTTTJfRE9XTkxPQURfU1VQUE9SVCAqLworCWxvY2FsLT5mdW5jLT50eCA9IHByaXNtMl90eF84MDIxMTsKKwlsb2NhbC0+ZnVuYy0+c2V0X3RpbSA9IHByaXNtMl9zZXRfdGltOworCWxvY2FsLT5mdW5jLT5uZWVkX3R4X2hlYWRyb29tID0gMDsgLyogbm8gbmVlZCB0byBhZGQgdHhkZXNjIGluCisJCQkJCSAgICAqIHNrYi0+ZGF0YSAoRklYOiBtYXliZSBmb3IgRE1BIGJ1cworCQkJCQkgICAgKiBtYXN0ZXJpbmc/ICovCisKKwlsb2NhbC0+bXR1ID0gbXR1OworCisJcndsb2NrX2luaXQoJmxvY2FsLT5pZmFjZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbG9jYWwtPnR4ZmlkbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmxvY2FsLT5jbWRsb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbG9jYWwtPmJhcGxvY2spOworCXNwaW5fbG9ja19pbml0KCZsb2NhbC0+bG9jayk7CisJaW5pdF9NVVRFWCgmbG9jYWwtPnJpZF9iYXBfc2VtKTsKKworCWlmIChjYXJkX2lkeCA8IDAgfHwgY2FyZF9pZHggPj0gTUFYX1BBUk1fREVWSUNFUykKKwkJY2FyZF9pZHggPSAwOworCWxvY2FsLT5jYXJkX2lkeCA9IGNhcmRfaWR4OworCisJbGVuID0gc3RybGVuKGVzc2lkKTsKKwltZW1jcHkobG9jYWwtPmVzc2lkLCBlc3NpZCwKKwkgICAgICAgbGVuID4gTUFYX1NTSURfTEVOID8gTUFYX1NTSURfTEVOIDogbGVuKTsKKwlsb2NhbC0+ZXNzaWRbTUFYX1NTSURfTEVOXSA9ICdcMCc7CisJaSA9IEdFVF9JTlRfUEFSTShpd19tb2RlLCBjYXJkX2lkeCk7CisJaWYgKChpID49IElXX01PREVfQURIT0MgJiYgaSA8PSBJV19NT0RFX1JFUEVBVCkgfHwKKwkgICAgaSA9PSBJV19NT0RFX01PTklUT1IpIHsKKwkJbG9jYWwtPml3X21vZGUgPSBpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInByaXNtMjogVW5rbm93biBpd19tb2RlICVkOyB1c2luZyAiCisJCSAgICAgICAiSVdfTU9ERV9NQVNURVJcbiIsIGkpOworCQlsb2NhbC0+aXdfbW9kZSA9IElXX01PREVfTUFTVEVSOworCX0KKwlsb2NhbC0+Y2hhbm5lbCA9IEdFVF9JTlRfUEFSTShjaGFubmVsLCBjYXJkX2lkeCk7CisJbG9jYWwtPmJlYWNvbl9pbnQgPSBHRVRfSU5UX1BBUk0oYmVhY29uX2ludCwgY2FyZF9pZHgpOworCWxvY2FsLT5kdGltX3BlcmlvZCA9IEdFVF9JTlRfUEFSTShkdGltX3BlcmlvZCwgY2FyZF9pZHgpOworCWxvY2FsLT53ZHNfbWF4X2Nvbm5lY3Rpb25zID0gMTY7CisJbG9jYWwtPnR4X2NvbnRyb2wgPSBIRkEzODRYX1RYX0NUUkxfRkxBR1M7CisJbG9jYWwtPm1hbnVhbF9yZXRyeV9jb3VudCA9IC0xOworCWxvY2FsLT5ydHNfdGhyZXNob2xkID0gMjM0NzsKKwlsb2NhbC0+ZnJhZ21fdGhyZXNob2xkID0gMjM0NjsKKwlsb2NhbC0+cnNzaV90b19kQm0gPSAxMDA7IC8qIGRlZmF1bHQ7IHRvIGJlIG92ZXJyaWRlbiBieQorCQkJCSAgICogY25mRGJtQWRqdXN0LCBpZiBhdmFpbGFibGUgKi8KKwlsb2NhbC0+YXV0aF9hbGdzID0gUFJJU00yX0FVVEhfT1BFTiB8IFBSSVNNMl9BVVRIX1NIQVJFRF9LRVk7CisJbG9jYWwtPnNyYW1fdHlwZSA9IC0xOworCWxvY2FsLT5zY2FuX2NoYW5uZWxfbWFzayA9IDB4ZmZmZjsKKworCS8qIEluaXRpYWxpemUgdGFzayBxdWV1ZSBzdHJ1Y3R1cmVzICovCisJSU5JVF9XT1JLKCZsb2NhbC0+cmVzZXRfcXVldWUsIGhhbmRsZV9yZXNldF9xdWV1ZSwgbG9jYWwpOworCUlOSVRfV09SSygmbG9jYWwtPnNldF9tdWx0aWNhc3RfbGlzdF9xdWV1ZSwKKwkJICBob3N0YXBfc2V0X211bHRpY2FzdF9saXN0X3F1ZXVlLCBsb2NhbC0+ZGV2KTsKKworCUlOSVRfV09SSygmbG9jYWwtPnNldF90aW1fcXVldWUsIGhhbmRsZV9zZXRfdGltX3F1ZXVlLCBsb2NhbCk7CisJSU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5zZXRfdGltX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZsb2NhbC0+c2V0X3RpbV9sb2NrKTsKKworCUlOSVRfV09SSygmbG9jYWwtPmNvbW1zX3F1YWxfdXBkYXRlLCBoYW5kbGVfY29tbXNfcXVhbF91cGRhdGUsIGxvY2FsKTsKKworCS8qIEluaXRpYWxpemUgdGFza2xldHMgZm9yIGhhbmRsaW5nIGhhcmR3YXJlIElSUSByZWxhdGVkIG9wZXJhdGlvbnMKKwkgKiBvdXRzaWRlIGh3IElSUSBoYW5kbGVyICovCisjZGVmaW5lIEhPU1RBUF9UQVNLTEVUX0lOSVQocSwgZiwgZCkgXAorZG8geyBtZW1zZXQoKHEpLCAwLCBzaXplb2YoKihxKSkpOyAocSktPmZ1bmMgPSAoZik7IChxKS0+ZGF0YSA9IChkKTsgfSBcCit3aGlsZSAoMCkKKwlIT1NUQVBfVEFTS0xFVF9JTklUKCZsb2NhbC0+YmFwX3Rhc2tsZXQsIGhvc3RhcF9iYXBfdGFza2xldCwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgbG9jYWwpOworCisJSE9TVEFQX1RBU0tMRVRfSU5JVCgmbG9jYWwtPmluZm9fdGFza2xldCwgaG9zdGFwX2luZm9fdGFza2xldCwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgbG9jYWwpOworCWhvc3RhcF9pbmZvX2luaXQobG9jYWwpOworCisJSE9TVEFQX1RBU0tMRVRfSU5JVCgmbG9jYWwtPnJ4X3Rhc2tsZXQsCisJCQkgICAgaG9zdGFwX3J4X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKSBsb2NhbCk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbG9jYWwtPnJ4X2xpc3QpOworCisJSE9TVEFQX1RBU0tMRVRfSU5JVCgmbG9jYWwtPnN0YV90eF9leGNfdGFza2xldCwKKwkJCSAgICBob3N0YXBfc3RhX3R4X2V4Y190YXNrbGV0LCAodW5zaWduZWQgbG9uZykgbG9jYWwpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxvY2FsLT5zdGFfdHhfZXhjX2xpc3QpOworCisJSU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5jbWRfcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxvY2FsLT5ob3N0c2Nhbl93cSk7CisJSU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5jcnlwdF9kZWluaXRfbGlzdCk7CisJaW5pdF90aW1lcigmbG9jYWwtPmNyeXB0X2RlaW5pdF90aW1lcik7CisJbG9jYWwtPmNyeXB0X2RlaW5pdF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGxvY2FsOworCWxvY2FsLT5jcnlwdF9kZWluaXRfdGltZXIuZnVuY3Rpb24gPSBwcmlzbTJfY3J5cHRfZGVpbml0X2hhbmRsZXI7CisKKwlpbml0X3RpbWVyKCZsb2NhbC0+cGFzc2l2ZV9zY2FuX3RpbWVyKTsKKwlsb2NhbC0+cGFzc2l2ZV9zY2FuX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgbG9jYWw7CisJbG9jYWwtPnBhc3NpdmVfc2Nhbl90aW1lci5mdW5jdGlvbiA9IGhvc3RhcF9wYXNzaXZlX3NjYW47CisKKwlpbml0X3RpbWVyKCZsb2NhbC0+dGlja190aW1lcik7CisJbG9jYWwtPnRpY2tfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBsb2NhbDsKKwlsb2NhbC0+dGlja190aW1lci5mdW5jdGlvbiA9IGhvc3RhcF90aWNrX3RpbWVyOworCWxvY2FsLT50aWNrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMiAqIEhaOworCWFkZF90aW1lcigmbG9jYWwtPnRpY2tfdGltZXIpOworCisJSU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5ic3NfbGlzdCk7CisKKwlob3N0YXBfc2V0dXBfZGV2KGRldiwgbG9jYWwsIDEpOworCWxvY2FsLT5zYXZlZF9ldGhfaGVhZGVyX3BhcnNlID0gZGV2LT5oYXJkX2hlYWRlcl9wYXJzZTsKKworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaG9zdGFwX21hc3Rlcl9zdGFydF94bWl0OworCWRldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTE7CisJZGV2LT5oYXJkX2hlYWRlcl9wYXJzZSA9IGhvc3RhcF84MDIxMV9oZWFkZXJfcGFyc2U7CisKKwlydG5sX2xvY2soKTsKKwlyZXQgPSBkZXZfYWxsb2NfbmFtZShkZXYsICJ3aWZpJWQiKTsKKwlTRVRfTkVUREVWX0RFVihkZXYsIHNkZXYpOworCWlmIChyZXQgPj0gMCkKKwkJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CisJcnRubF91bmxvY2soKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVnaXN0ZXIgbmV0ZGV2aWNlIGZhaWxlZCFcbiIsCisJCSAgICAgICBkZXZfaW5mbyk7CisJCWdvdG8gZmFpbDsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlZ2lzdGVyZWQgbmV0ZGV2aWNlICVzXG4iLCBkZXZfaW5mbywgZGV2LT5uYW1lKTsKKworI2lmbmRlZiBQUklTTTJfTk9fUFJPQ0ZTX0RFQlVHCisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmVnaXN0ZXJzIiwgMCwgbG9jYWwtPnByb2MsCisJCQkgICAgICAgcHJpc20yX3JlZ2lzdGVyc19wcm9jX3JlYWQsIGxvY2FsKTsKKyNlbmRpZiAvKiBQUklTTTJfTk9fUFJPQ0ZTX0RFQlVHICovCisKKwlob3N0YXBfaW5pdF9kYXRhKGxvY2FsKTsKKwlyZXR1cm4gZGV2OworCisgZmFpbDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyBpbnQgaG9zdGFwX2h3X3JlYWR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCXN0cnVjdCBsb2NhbF9pbmZvICpsb2NhbDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKwlsb2NhbC0+ZGRldiA9IGhvc3RhcF9hZGRfaW50ZXJmYWNlKGxvY2FsLCBIT1NUQVBfSU5URVJGQUNFX01BSU4sIDAsCisJCQkJCSAgICIiLCBkZXZfdGVtcGxhdGUpOworCisJaWYgKGxvY2FsLT5kZGV2KSB7CisJCWlmIChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8CisJCSAgICBsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCQluZXRpZl9jYXJyaWVyX29mZihsb2NhbC0+ZGV2KTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGxvY2FsLT5kZGV2KTsKKwkJfQorCQlob3N0YXBfaW5pdF9wcm9jKGxvY2FsKTsKKwkJaG9zdGFwX2luaXRfYXBfcHJvYyhsb2NhbCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtMTsKK30KKworCitzdGF0aWMgdm9pZCBwcmlzbTJfZnJlZV9sb2NhbF9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhvc3RhcF90eF9jYWxsYmFja19pbmZvICp0eF9jYiwgKnR4X2NiX3ByZXY7CisJaW50IGk7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCXN0cnVjdCBsb2NhbF9pbmZvICpsb2NhbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuOworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJaWYgKHRpbWVyX3BlbmRpbmcoJmxvY2FsLT5jcnlwdF9kZWluaXRfdGltZXIpKQorCQlkZWxfdGltZXIoJmxvY2FsLT5jcnlwdF9kZWluaXRfdGltZXIpOworCXByaXNtMl9jcnlwdF9kZWluaXRfZW50cmllcyhsb2NhbCwgMSk7CisKKwlpZiAodGltZXJfcGVuZGluZygmbG9jYWwtPnBhc3NpdmVfc2Nhbl90aW1lcikpCisJCWRlbF90aW1lcigmbG9jYWwtPnBhc3NpdmVfc2Nhbl90aW1lcik7CisKKwlpZiAodGltZXJfcGVuZGluZygmbG9jYWwtPnRpY2tfdGltZXIpKQorCQlkZWxfdGltZXIoJmxvY2FsLT50aWNrX3RpbWVyKTsKKworCXByaXNtMl9jbGVhcl9jbWRfcXVldWUobG9jYWwpOworCisJc2tiX3F1ZXVlX3B1cmdlKCZsb2NhbC0+aW5mb19saXN0KTsKKwlza2JfcXVldWVfcHVyZ2UoJmxvY2FsLT5yeF9saXN0KTsKKwlza2JfcXVldWVfcHVyZ2UoJmxvY2FsLT5zdGFfdHhfZXhjX2xpc3QpOworCisJaWYgKGxvY2FsLT5kZXZfZW5hYmxlZCkKKwkJcHJpc20yX2NhbGxiYWNrKGxvY2FsLCBQUklTTTJfQ0FMTEJBQ0tfRElTQUJMRSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0ID0gbG9jYWwtPmNyeXB0W2ldOworCQlpZiAoY3J5cHQpIHsKKwkJCWlmIChjcnlwdC0+b3BzKQorCQkJCWNyeXB0LT5vcHMtPmRlaW5pdChjcnlwdC0+cHJpdik7CisJCQlrZnJlZShjcnlwdCk7CisJCQlsb2NhbC0+Y3J5cHRbaV0gPSBOVUxMOworCQl9CisJfQorCisJaWYgKGxvY2FsLT5hcCAhPSBOVUxMKQorCQlob3N0YXBfZnJlZV9kYXRhKGxvY2FsLT5hcCk7CisKKyNpZm5kZWYgUFJJU00yX05PX1BST0NGU19ERUJVRworCWlmIChsb2NhbC0+cHJvYyAhPSBOVUxMKQorCQlyZW1vdmVfcHJvY19lbnRyeSgicmVnaXN0ZXJzIiwgbG9jYWwtPnByb2MpOworI2VuZGlmIC8qIFBSSVNNMl9OT19QUk9DRlNfREVCVUcgKi8KKwlob3N0YXBfcmVtb3ZlX3Byb2MobG9jYWwpOworCisJdHhfY2IgPSBsb2NhbC0+dHhfY2FsbGJhY2s7CisJd2hpbGUgKHR4X2NiICE9IE5VTEwpIHsKKwkJdHhfY2JfcHJldiA9IHR4X2NiOworCQl0eF9jYiA9IHR4X2NiLT5uZXh0OworCQlrZnJlZSh0eF9jYl9wcmV2KTsKKwl9CisKKwlob3N0YXBfc2V0X2hvc3RhcGQobG9jYWwsIDAsIDApOworCWhvc3RhcF9zZXRfaG9zdGFwZF9zdGEobG9jYWwsIDAsIDApOworCisJZm9yIChpID0gMDsgaSA8IFBSSVNNMl9GUkFHX0NBQ0hFX0xFTjsgaSsrKSB7CisJCWlmIChsb2NhbC0+ZnJhZ19jYWNoZVtpXS5za2IgIT0gTlVMTCkKKwkJCWRldl9rZnJlZV9za2IobG9jYWwtPmZyYWdfY2FjaGVbaV0uc2tiKTsKKwl9CisKKyNpZmRlZiBQUklTTTJfRE9XTkxPQURfU1VQUE9SVAorCXByaXNtMl9kb3dubG9hZF9mcmVlX2RhdGEobG9jYWwtPmRsX3ByaSk7CisJcHJpc20yX2Rvd25sb2FkX2ZyZWVfZGF0YShsb2NhbC0+ZGxfc2VjKTsKKyNlbmRpZiAvKiBQUklTTTJfRE9XTkxPQURfU1VQUE9SVCAqLworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbiwgJmxvY2FsLT5ob3N0YXBfaW50ZXJmYWNlcykgeworCQlpZmFjZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSwgbGlzdCk7CisJCWlmIChpZmFjZS0+dHlwZSA9PSBIT1NUQVBfSU5URVJGQUNFX01BU1RFUikgeworCQkJLyogc3BlY2lhbCBoYW5kbGluZyBmb3IgdGhpcyBpbnRlcmZhY2UgYmVsb3cgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCWhvc3RhcF9yZW1vdmVfaW50ZXJmYWNlKGlmYWNlLT5kZXYsIDAsIDEpOworCX0KKworCXByaXNtMl9jbGVhcl9zZXRfdGltX3F1ZXVlKGxvY2FsKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG4sICZsb2NhbC0+YnNzX2xpc3QpIHsKKwkJc3RydWN0IGhvc3RhcF9ic3NfaW5mbyAqYnNzID0KKwkJCWxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgaG9zdGFwX2Jzc19pbmZvLCBsaXN0KTsKKwkJa2ZyZWUoYnNzKTsKKwl9CisKKwlrZnJlZShsb2NhbC0+cGRhKTsKKwlrZnJlZShsb2NhbC0+bGFzdF9zY2FuX3Jlc3VsdHMpOworCWtmcmVlKGxvY2FsLT5nZW5lcmljX2VsZW0pOworCisJdW5yZWdpc3Rlcl9uZXRkZXYobG9jYWwtPmRldik7CisJZnJlZV9uZXRkZXYobG9jYWwtPmRldik7Cit9CisKKworI2lmbmRlZiBQUklTTTJfUExYCitzdGF0aWMgdm9pZCBwcmlzbTJfc3VzcGVuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlzdHJ1Y3QgbG9jYWxfaW5mbyAqbG9jYWw7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCisJaWZhY2UgPSBkZXYtPnByaXY7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwkvKiBTZW5kIGRpc2Nvbm5lY3QgZXZlbnQsIGUuZy4sIHRvIHRyaWdnZXIgcmVhc3NvY2lhdGlvbiBhZnRlciByZXN1bWUKKwkgKiBpZiB3cGFfc3VwcGxpY2FudCBpcyB1c2VkLiAqLworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXdpcmVsZXNzX3NlbmRfZXZlbnQobG9jYWwtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKwkvKiBEaXNhYmxlIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSAqLworCXByaXNtMl9od19zaHV0ZG93bihkZXYsIDApOworfQorI2VuZGlmIC8qIFBSSVNNMl9QTFggKi8KKworCisvKiBUaGVzZSBtaWdodCBhdCBzb21lIHBvaW50IGJlIGNvbXBpbGVkIHNlcGFyYXRlbHkgYW5kIHVzZWQgYXMgc2VwYXJhdGUKKyAqIGtlcm5lbCBtb2R1bGVzIG9yIGxpbmtlZCBpbnRvIG9uZSAqLworI2lmZGVmIFBSSVNNMl9ET1dOTE9BRF9TVVBQT1JUCisjaW5jbHVkZSAiaG9zdGFwX2Rvd25sb2FkLmMiCisjZW5kaWYgLyogUFJJU00yX0RPV05MT0FEX1NVUFBPUlQgKi8KKworI2lmZGVmIFBSSVNNMl9DQUxMQkFDSworLyogRXh0ZXJuYWwgaG9zdGFwX2NhbGxiYWNrLmMgZmlsZSBjYW4gYmUgdXNlZCB0bywgZS5nLiwgYmxpbmsgYWN0aXZpdHkgbGVkLgorICogVGhpcyBjYW4gdXNlIHBsYXRmb3JtIHNwZWNpZmljIGNvZGUgYW5kIG11c3QgZGVmaW5lIHByaXNtMl9jYWxsYmFjaygpCisgKiBmdW5jdGlvbiAoaWYgUFJJU00yX0NBTExCQUNLIGlzIG5vdCBkZWZpbmVkLCB0aGVzZSBmdW5jdGlvbiBjYWxscyBhcmUgbm90CisgKiB1c2VkLiAqLworI2luY2x1ZGUgImhvc3RhcF9jYWxsYmFjay5jIgorI2VuZGlmIC8qIFBSSVNNMl9DQUxMQkFDSyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWE5OThmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMKQEAgLTAsMCArMSw0OTkgQEAKKy8qIEhvc3QgQVAgZHJpdmVyIEluZm8gRnJhbWUgcHJvY2Vzc2luZyAocGFydCBvZiBob3N0YXAubyBtb2R1bGUpICovCisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgdm9pZCBwcmlzbTJfaW5mb19jb21tdGFsbGllczE2KGxvY2FsX2luZm9fdCAqbG9jYWwsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkgICAgICBpbnQgbGVmdCkKK3sKKwlzdHJ1Y3QgaGZhMzg0eF9jb21tX3RhbGxpZXMgKnRhbGxpZXM7CisKKwlpZiAobGVmdCA8IHNpemVvZihzdHJ1Y3QgaGZhMzg0eF9jb21tX3RhbGxpZXMpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdG9vIHNob3J0IChsZW49JWQpIGNvbW10YWxsaWVzICIKKwkJICAgICAgICJpbmZvIGZyYW1lXG4iLCBsb2NhbC0+ZGV2LT5uYW1lLCBsZWZ0KTsKKwkJcmV0dXJuOworCX0KKworCXRhbGxpZXMgPSAoc3RydWN0IGhmYTM4NHhfY29tbV90YWxsaWVzICopIGJ1ZjsKKyNkZWZpbmUgQUREX0NPTU1fVEFMTElFUyhuYW1lKSBcCitsb2NhbC0+Y29tbV90YWxsaWVzLm5hbWUgKz0gbGUxNl90b19jcHUodGFsbGllcy0+bmFtZSkKKwlBRERfQ09NTV9UQUxMSUVTKHR4X3VuaWNhc3RfZnJhbWVzKTsKKwlBRERfQ09NTV9UQUxMSUVTKHR4X211bHRpY2FzdF9mcmFtZXMpOworCUFERF9DT01NX1RBTExJRVModHhfZnJhZ21lbnRzKTsKKwlBRERfQ09NTV9UQUxMSUVTKHR4X3VuaWNhc3Rfb2N0ZXRzKTsKKwlBRERfQ09NTV9UQUxMSUVTKHR4X211bHRpY2FzdF9vY3RldHMpOworCUFERF9DT01NX1RBTExJRVModHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9ucyk7CisJQUREX0NPTU1fVEFMTElFUyh0eF9zaW5nbGVfcmV0cnlfZnJhbWVzKTsKKwlBRERfQ09NTV9UQUxMSUVTKHR4X211bHRpcGxlX3JldHJ5X2ZyYW1lcyk7CisJQUREX0NPTU1fVEFMTElFUyh0eF9yZXRyeV9saW1pdF9leGNlZWRlZCk7CisJQUREX0NPTU1fVEFMTElFUyh0eF9kaXNjYXJkcyk7CisJQUREX0NPTU1fVEFMTElFUyhyeF91bmljYXN0X2ZyYW1lcyk7CisJQUREX0NPTU1fVEFMTElFUyhyeF9tdWx0aWNhc3RfZnJhbWVzKTsKKwlBRERfQ09NTV9UQUxMSUVTKHJ4X2ZyYWdtZW50cyk7CisJQUREX0NPTU1fVEFMTElFUyhyeF91bmljYXN0X29jdGV0cyk7CisJQUREX0NPTU1fVEFMTElFUyhyeF9tdWx0aWNhc3Rfb2N0ZXRzKTsKKwlBRERfQ09NTV9UQUxMSUVTKHJ4X2Zjc19lcnJvcnMpOworCUFERF9DT01NX1RBTExJRVMocnhfZGlzY2FyZHNfbm9fYnVmZmVyKTsKKwlBRERfQ09NTV9UQUxMSUVTKHR4X2Rpc2NhcmRzX3dyb25nX3NhKTsKKwlBRERfQ09NTV9UQUxMSUVTKHJ4X2Rpc2NhcmRzX3dlcF91bmRlY3J5cHRhYmxlKTsKKwlBRERfQ09NTV9UQUxMSUVTKHJ4X21lc3NhZ2VfaW5fbXNnX2ZyYWdtZW50cyk7CisJQUREX0NPTU1fVEFMTElFUyhyeF9tZXNzYWdlX2luX2JhZF9tc2dfZnJhZ21lbnRzKTsKKyN1bmRlZiBBRERfQ09NTV9UQUxMSUVTCit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgdm9pZCBwcmlzbTJfaW5mb19jb21tdGFsbGllczMyKGxvY2FsX2luZm9fdCAqbG9jYWwsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkgICAgICBpbnQgbGVmdCkKK3sKKwlzdHJ1Y3QgaGZhMzg0eF9jb21tX3RhbGxpZXMzMiAqdGFsbGllczsKKworCWlmIChsZWZ0IDwgc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2NvbW1fdGFsbGllczMyKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRvbyBzaG9ydCAobGVuPSVkKSBjb21tdGFsbGllczMyICIKKwkJICAgICAgICJpbmZvIGZyYW1lXG4iLCBsb2NhbC0+ZGV2LT5uYW1lLCBsZWZ0KTsKKwkJcmV0dXJuOworCX0KKworCXRhbGxpZXMgPSAoc3RydWN0IGhmYTM4NHhfY29tbV90YWxsaWVzMzIgKikgYnVmOworI2RlZmluZSBBRERfQ09NTV9UQUxMSUVTKG5hbWUpIFwKK2xvY2FsLT5jb21tX3RhbGxpZXMubmFtZSArPSBsZTMyX3RvX2NwdSh0YWxsaWVzLT5uYW1lKQorCUFERF9DT01NX1RBTExJRVModHhfdW5pY2FzdF9mcmFtZXMpOworCUFERF9DT01NX1RBTExJRVModHhfbXVsdGljYXN0X2ZyYW1lcyk7CisJQUREX0NPTU1fVEFMTElFUyh0eF9mcmFnbWVudHMpOworCUFERF9DT01NX1RBTExJRVModHhfdW5pY2FzdF9vY3RldHMpOworCUFERF9DT01NX1RBTExJRVModHhfbXVsdGljYXN0X29jdGV0cyk7CisJQUREX0NPTU1fVEFMTElFUyh0eF9kZWZlcnJlZF90cmFuc21pc3Npb25zKTsKKwlBRERfQ09NTV9UQUxMSUVTKHR4X3NpbmdsZV9yZXRyeV9mcmFtZXMpOworCUFERF9DT01NX1RBTExJRVModHhfbXVsdGlwbGVfcmV0cnlfZnJhbWVzKTsKKwlBRERfQ09NTV9UQUxMSUVTKHR4X3JldHJ5X2xpbWl0X2V4Y2VlZGVkKTsKKwlBRERfQ09NTV9UQUxMSUVTKHR4X2Rpc2NhcmRzKTsKKwlBRERfQ09NTV9UQUxMSUVTKHJ4X3VuaWNhc3RfZnJhbWVzKTsKKwlBRERfQ09NTV9UQUxMSUVTKHJ4X211bHRpY2FzdF9mcmFtZXMpOworCUFERF9DT01NX1RBTExJRVMocnhfZnJhZ21lbnRzKTsKKwlBRERfQ09NTV9UQUxMSUVTKHJ4X3VuaWNhc3Rfb2N0ZXRzKTsKKwlBRERfQ09NTV9UQUxMSUVTKHJ4X211bHRpY2FzdF9vY3RldHMpOworCUFERF9DT01NX1RBTExJRVMocnhfZmNzX2Vycm9ycyk7CisJQUREX0NPTU1fVEFMTElFUyhyeF9kaXNjYXJkc19ub19idWZmZXIpOworCUFERF9DT01NX1RBTExJRVModHhfZGlzY2FyZHNfd3Jvbmdfc2EpOworCUFERF9DT01NX1RBTExJRVMocnhfZGlzY2FyZHNfd2VwX3VuZGVjcnlwdGFibGUpOworCUFERF9DT01NX1RBTExJRVMocnhfbWVzc2FnZV9pbl9tc2dfZnJhZ21lbnRzKTsKKwlBRERfQ09NTV9UQUxMSUVTKHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHMpOworI3VuZGVmIEFERF9DT01NX1RBTExJRVMKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyB2b2lkIHByaXNtMl9pbmZvX2NvbW10YWxsaWVzKGxvY2FsX2luZm9fdCAqbG9jYWwsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkgICAgaW50IGxlZnQpCit7CisJaWYgKGxvY2FsLT50YWxsaWVzMzIpCisJCXByaXNtMl9pbmZvX2NvbW10YWxsaWVzMzIobG9jYWwsIGJ1ZiwgbGVmdCk7CisJZWxzZQorCQlwcmlzbTJfaW5mb19jb21tdGFsbGllczE2KGxvY2FsLCBidWYsIGxlZnQpOworfQorCisKKyNpZm5kZWYgUFJJU00yX05PX1NUQVRJT05fTU9ERVMKKyNpZm5kZWYgUFJJU00yX05PX0RFQlVHCitzdGF0aWMgY29uc3QgY2hhciogaGZhMzg0eF9saW5rc3RhdHVzX3N0cih1MTYgbGlua3N0YXR1cykKK3sKKwlzd2l0Y2ggKGxpbmtzdGF0dXMpIHsKKwljYXNlIEhGQTM4NFhfTElOS1NUQVRVU19DT05ORUNURUQ6CisJCXJldHVybiAiQ29ubmVjdGVkIjsKKwljYXNlIEhGQTM4NFhfTElOS1NUQVRVU19ESVNDT05ORUNURUQ6CisJCXJldHVybiAiRGlzY29ubmVjdGVkIjsKKwljYXNlIEhGQTM4NFhfTElOS1NUQVRVU19BUF9DSEFOR0U6CisJCXJldHVybiAiQWNjZXNzIHBvaW50IGNoYW5nZSI7CisJY2FzZSBIRkEzODRYX0xJTktTVEFUVVNfQVBfT1VUX09GX1JBTkdFOgorCQlyZXR1cm4gIkFjY2VzcyBwb2ludCBvdXQgb2YgcmFuZ2UiOworCWNhc2UgSEZBMzg0WF9MSU5LU1RBVFVTX0FQX0lOX1JBTkdFOgorCQlyZXR1cm4gIkFjY2VzcyBwb2ludCBpbiByYW5nZSI7CisJY2FzZSBIRkEzODRYX0xJTktTVEFUVVNfQVNTT0NfRkFJTEVEOgorCQlyZXR1cm4gIkFzc29jaWF0aW9uIGZhaWxlZCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVbmtub3duIjsKKwl9Cit9CisjZW5kaWYgLyogUFJJU00yX05PX0RFQlVHICovCisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgdm9pZCBwcmlzbTJfaW5mb19saW5rc3RhdHVzKGxvY2FsX2luZm9fdCAqbG9jYWwsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkgICAgaW50IGxlZnQpCit7CisJdTE2IHZhbDsKKwlpbnQgbm9uX3N0YV9tb2RlOworCisJLyogQWxsb2MgbmV3IEpvaW5SZXF1ZXN0cyB0byBvY2N1ciBzaW5jZSBMaW5rU3RhdHVzIGZvciB0aGUgcHJldmlvdXMKKwkgKiBoYXMgYmVlbiByZWNlaXZlZCAqLworCWxvY2FsLT5sYXN0X2pvaW5fdGltZSA9IDA7CisKKwlpZiAobGVmdCAhPSAyKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW52YWxpZCBsaW5rc3RhdHVzIGluZm8gZnJhbWUgIgorCQkgICAgICAgImxlbmd0aCAlZFxuIiwgbG9jYWwtPmRldi0+bmFtZSwgbGVmdCk7CisJCXJldHVybjsKKwl9CisKKwlub25fc3RhX21vZGUgPSBsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiB8fAorCQlsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX1JFUEVBVCB8fAorCQlsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1I7CisKKwl2YWwgPSBidWZbMF0gfCAoYnVmWzFdIDw8IDgpOworCWlmICghbm9uX3N0YV9tb2RlIHx8IHZhbCAhPSBIRkEzODRYX0xJTktTVEFUVVNfRElTQ09OTkVDVEVEKSB7CisJCVBERUJVRyhERUJVR19FWFRSQSwgIiVzOiBMaW5rU3RhdHVzPSVkICglcylcbiIsCisJCSAgICAgICBsb2NhbC0+ZGV2LT5uYW1lLCB2YWwsIGhmYTM4NHhfbGlua3N0YXR1c19zdHIodmFsKSk7CisJfQorCisJaWYgKG5vbl9zdGFfbW9kZSkgeworCQluZXRpZl9jYXJyaWVyX29uKGxvY2FsLT5kZXYpOworCQluZXRpZl9jYXJyaWVyX29uKGxvY2FsLT5kZGV2KTsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCBjdXJyZW50IEJTU0lEIGxhdGVyIGluIHNjaGVkdWxlZCB0YXNrICovCisJc2V0X2JpdChQUklTTTJfSU5GT19QRU5ESU5HX0xJTktTVEFUVVMsICZsb2NhbC0+cGVuZGluZ19pbmZvKTsKKwlsb2NhbC0+cHJldl9saW5rX3N0YXR1cyA9IHZhbDsKKwlzY2hlZHVsZV93b3JrKCZsb2NhbC0+aW5mb19xdWV1ZSk7Cit9CisKKworc3RhdGljIHZvaWQgcHJpc20yX2hvc3Rfcm9hbWluZyhsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXN0cnVjdCBoZmEzODR4X2pvaW5fcmVxdWVzdCByZXE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CisJc3RydWN0IGhmYTM4NHhfaG9zdHNjYW5fcmVzdWx0ICpzZWxlY3RlZCwgKmVudHJ5OworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobG9jYWwtPmxhc3Rfam9pbl90aW1lICYmCisJICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIGxvY2FsLT5sYXN0X2pvaW5fdGltZSArIDEwICogSFopKSB7CisJCVBERUJVRyhERUJVR19FWFRSQSwgIiVzOiBsYXN0IGpvaW4gcmVxdWVzdCBoYXMgbm90IHlldCBiZWVuICIKKwkJICAgICAgICJjb21wbGV0ZWQgLSB3YWl0aW5nIGZvciBpdCBiZWZvcmUgaXNzdWluZyBuZXcgb25lXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNjYW5SZXN1bHRzIGFyZSBzb3J0ZWQ6IGZpcnN0IEVTUyByZXN1bHRzIGluIGRlY3JlYXNpbmcgc2lnbmFsCisJICogcXVhbGl0eSB0aGVuIElCU1MgcmVzdWx0cyBpbiBzaW1pbGFyIG9yZGVyLgorCSAqIFRyaXZpYWwgcm9hbWluZyBwb2xpY3k6IGp1c3Qgc2VsZWN0IHRoZSBmaXJzdCBlbnRyeS4KKwkgKiBUaGlzIGNvdWxkIHByb2JhYmx5IGJlIGltcHJvdmVkIGJ5IGFkZGluZyBoeXN0ZXJlc2lzIHRvIGxpbWl0CisJICogbnVtYmVyIG9mIGhhbmRvZmZzLCBldGMuCisJICoKKwkgKiBDb3VsZCBkbyBwZXJpb2RpYyBSSURfU0NBTlJFUVVFU1Qgb3IgSW5xdWlyZSBGMTAxIHRvIGdldCBuZXcKKwkgKiBTY2FuUmVzdWx0cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+bG9jaywgZmxhZ3MpOworCWlmIChsb2NhbC0+bGFzdF9zY2FuX3Jlc3VsdHMgPT0gTlVMTCB8fAorCSAgICBsb2NhbC0+bGFzdF9zY2FuX3Jlc3VsdHNfY291bnQgPT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+bG9jaywgZmxhZ3MpOworCQlQREVCVUcoREVCVUdfRVhUUkEsICIlczogbm8gc2NhbiByZXN1bHRzIGZvciBob3N0IHJvYW1pbmdcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJc2VsZWN0ZWQgPSAmbG9jYWwtPmxhc3Rfc2Nhbl9yZXN1bHRzWzBdOworCisJaWYgKGxvY2FsLT5wcmVmZXJyZWRfYXBbMF0gfHwgbG9jYWwtPnByZWZlcnJlZF9hcFsxXSB8fAorCSAgICBsb2NhbC0+cHJlZmVycmVkX2FwWzJdIHx8IGxvY2FsLT5wcmVmZXJyZWRfYXBbM10gfHwKKwkgICAgbG9jYWwtPnByZWZlcnJlZF9hcFs0XSB8fCBsb2NhbC0+cHJlZmVycmVkX2FwWzVdKSB7CisJCS8qIFRyeSB0byBmaW5kIHByZWZlcnJlZCBBUCAqLworCQlQREVCVUcoREVCVUdfRVhUUkEsICIlczogUHJlZmVycmVkIEFQIEJTU0lEICIgTUFDU1RSICJcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIE1BQzJTVFIobG9jYWwtPnByZWZlcnJlZF9hcCkpOworCQlmb3IgKGkgPSAwOyBpIDwgbG9jYWwtPmxhc3Rfc2Nhbl9yZXN1bHRzX2NvdW50OyBpKyspIHsKKwkJCWVudHJ5ID0gJmxvY2FsLT5sYXN0X3NjYW5fcmVzdWx0c1tpXTsKKwkJCWlmIChtZW1jbXAobG9jYWwtPnByZWZlcnJlZF9hcCwgZW50cnktPmJzc2lkLCA2KSA9PSAwKQorCQkJeworCQkJCVBERUJVRyhERUJVR19FWFRSQSwgIiVzOiB1c2luZyBwcmVmZXJyZWQgQVAgIgorCQkJCSAgICAgICAic2VsZWN0aW9uXG4iLCBkZXYtPm5hbWUpOworCQkJCXNlbGVjdGVkID0gZW50cnk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwltZW1jcHkocmVxLmJzc2lkLCBzZWxlY3RlZC0+YnNzaWQsIDYpOworCXJlcS5jaGFubmVsID0gc2VsZWN0ZWQtPmNoaWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKworCVBERUJVRyhERUJVR19FWFRSQSwgIiVzOiBKb2luUmVxdWVzdDogQlNTSUQ9IiBNQUNTVFIgIiBjaGFubmVsPSVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIE1BQzJTVFIocmVxLmJzc2lkKSwgbGUxNl90b19jcHUocmVxLmNoYW5uZWwpKTsKKwlpZiAobG9jYWwtPmZ1bmMtPnNldF9yaWQoZGV2LCBIRkEzODRYX1JJRF9KT0lOUkVRVUVTVCwgJnJlcSwKKwkJCQkgc2l6ZW9mKHJlcSkpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogSm9pblJlcXVlc3QgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCX0KKwlsb2NhbC0+bGFzdF9qb2luX3RpbWUgPSBqaWZmaWVzOworfQorCisKK3N0YXRpYyB2b2lkIGhvc3RhcF9yZXBvcnRfc2Nhbl9jb21wbGV0ZShsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKworCS8qIEluZm9ybSB1c2VyIHNwYWNlIGFib3V0IG5ldyBzY2FuIHJlc3VsdHMgKGp1c3QgZW1wdHkgZXZlbnQsCisJICogU0lPQ0dJV1NDQU4gY2FuIGJlIHVzZWQgdG8gZmV0Y2ggZGF0YSAqLworCXdycXUuZGF0YS5sZW5ndGggPSAwOworCXdycXUuZGF0YS5mbGFncyA9IDA7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChsb2NhbC0+ZGV2LCBTSU9DR0lXU0NBTiwgJndycXUsIE5VTEwpOworCisJLyogQWxsb3cgU0lPQ0dJV1NDQU4gaGFuZGxpbmcgdG8gb2NjdXIgc2luY2Ugd2UgaGF2ZSByZWNlaXZlZAorCSAqIHNjYW5uaW5nIHJlc3VsdCAqLworCWxvY2FsLT5zY2FuX3RpbWVzdGFtcCA9IDA7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgdm9pZCBwcmlzbTJfaW5mb19zY2FucmVzdWx0cyhsb2NhbF9pbmZvX3QgKmxvY2FsLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJICAgIGludCBsZWZ0KQoreworCXUxNiAqcG9zOworCWludCBuZXdfY291bnQsIGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaGZhMzg0eF9zY2FuX3Jlc3VsdCAqcmVzOworCXN0cnVjdCBoZmEzODR4X2hvc3RzY2FuX3Jlc3VsdCAqcmVzdWx0cywgKnByZXY7CisKKwlpZiAobGVmdCA8IDQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnZhbGlkIHNjYW5yZXN1bHQgaW5mbyBmcmFtZSAiCisJCSAgICAgICAibGVuZ3RoICVkXG4iLCBsb2NhbC0+ZGV2LT5uYW1lLCBsZWZ0KTsKKwkJcmV0dXJuOworCX0KKworCXBvcyA9ICh1MTYgKikgYnVmOworCXBvcysrOworCXBvcysrOworCWxlZnQgLT0gNDsKKworCW5ld19jb3VudCA9IGxlZnQgLyBzaXplb2Yoc3RydWN0IGhmYTM4NHhfc2Nhbl9yZXN1bHQpOworCXJlc3VsdHMgPSBrbWFsbG9jKG5ld19jb3VudCAqIHNpemVvZihzdHJ1Y3QgaGZhMzg0eF9ob3N0c2Nhbl9yZXN1bHQpLAorCQkJICBHRlBfQVRPTUlDKTsKKwlpZiAocmVzdWx0cyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBDb252ZXJ0IHRvIGhvc3RzY2FuIHJlc3VsdCBmb3JtYXQuICovCisJcmVzID0gKHN0cnVjdCBoZmEzODR4X3NjYW5fcmVzdWx0ICopIHBvczsKKwlmb3IgKGkgPSAwOyBpIDwgbmV3X2NvdW50OyBpKyspIHsKKwkJbWVtY3B5KCZyZXN1bHRzW2ldLCAmcmVzW2ldLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBoZmEzODR4X3NjYW5fcmVzdWx0KSk7CisJCXJlc3VsdHNbaV0uYXRpbSA9IDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJbG9jYWwtPmxhc3Rfc2Nhbl90eXBlID0gUFJJU00yX1NDQU47CisJcHJldiA9IGxvY2FsLT5sYXN0X3NjYW5fcmVzdWx0czsKKwlsb2NhbC0+bGFzdF9zY2FuX3Jlc3VsdHMgPSByZXN1bHRzOworCWxvY2FsLT5sYXN0X3NjYW5fcmVzdWx0c19jb3VudCA9IG5ld19jb3VudDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+bG9jaywgZmxhZ3MpOworCWtmcmVlKHByZXYpOworCisJaG9zdGFwX3JlcG9ydF9zY2FuX2NvbXBsZXRlKGxvY2FsKTsKKworCS8qIFBlcmZvcm0gcmVzdCBvZiBTY2FuUmVzdWx0cyBoYW5kbGluZyBsYXRlciBpbiBzY2hlZHVsZWQgdGFzayAqLworCXNldF9iaXQoUFJJU00yX0lORk9fUEVORElOR19TQ0FOUkVTVUxUUywgJmxvY2FsLT5wZW5kaW5nX2luZm8pOworCXNjaGVkdWxlX3dvcmsoJmxvY2FsLT5pbmZvX3F1ZXVlKTsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyB2b2lkIHByaXNtMl9pbmZvX2hvc3RzY2FucmVzdWx0cyhsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJCQl1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZWZ0KQoreworCWludCBpLCByZXN1bHRfc2l6ZSwgY29weV9sZW4sIG5ld19jb3VudDsKKwlzdHJ1Y3QgaGZhMzg0eF9ob3N0c2Nhbl9yZXN1bHQgKnJlc3VsdHMsICpwcmV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2ICpwb3M7CisJdTggKnB0cjsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbG9jYWwtPmhvc3RzY2FuX3dxKTsKKworCWlmIChsZWZ0IDwgNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludmFsaWQgaG9zdHNjYW5yZXN1bHQgaW5mbyBmcmFtZSAiCisJCSAgICAgICAibGVuZ3RoICVkXG4iLCBsb2NhbC0+ZGV2LT5uYW1lLCBsZWZ0KTsKKwkJcmV0dXJuOworCX0KKworCXBvcyA9ICh1MTYgKikgYnVmOworCWNvcHlfbGVuID0gcmVzdWx0X3NpemUgPSBsZTE2X3RvX2NwdSgqcG9zKTsKKwlpZiAocmVzdWx0X3NpemUgPT0gMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludmFsaWQgcmVzdWx0X3NpemUgKDApIGluICIKKwkJICAgICAgICJob3N0c2NhbnJlc3VsdHNcbiIsIGxvY2FsLT5kZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCWlmIChjb3B5X2xlbiA+IHNpemVvZihzdHJ1Y3QgaGZhMzg0eF9ob3N0c2Nhbl9yZXN1bHQpKQorCQljb3B5X2xlbiA9IHNpemVvZihzdHJ1Y3QgaGZhMzg0eF9ob3N0c2Nhbl9yZXN1bHQpOworCisJcG9zKys7CisJcG9zKys7CisJbGVmdCAtPSA0OworCXB0ciA9ICh1OCAqKSBwb3M7CisKKwluZXdfY291bnQgPSBsZWZ0IC8gcmVzdWx0X3NpemU7CisJcmVzdWx0cyA9IGttYWxsb2MobmV3X2NvdW50ICogc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2hvc3RzY2FuX3Jlc3VsdCksCisJCQkgIEdGUF9BVE9NSUMpOworCWlmIChyZXN1bHRzID09IE5VTEwpCisJCXJldHVybjsKKwltZW1zZXQocmVzdWx0cywgMCwgbmV3X2NvdW50ICogc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2hvc3RzY2FuX3Jlc3VsdCkpOworCisJZm9yIChpID0gMDsgaSA8IG5ld19jb3VudDsgaSsrKSB7CisJCW1lbWNweSgmcmVzdWx0c1tpXSwgcHRyLCBjb3B5X2xlbik7CisJCXB0ciArPSByZXN1bHRfc2l6ZTsKKwkJbGVmdCAtPSByZXN1bHRfc2l6ZTsKKwl9CisKKwlpZiAobGVmdCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNob3J0IEhvc3RTY2FuIHJlc3VsdCBlbnRyeSAoJWQvJWQpXG4iLAorCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSwgbGVmdCwgcmVzdWx0X3NpemUpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+bG9jaywgZmxhZ3MpOworCWxvY2FsLT5sYXN0X3NjYW5fdHlwZSA9IFBSSVNNMl9IT1NUU0NBTjsKKwlwcmV2ID0gbG9jYWwtPmxhc3Rfc2Nhbl9yZXN1bHRzOworCWxvY2FsLT5sYXN0X3NjYW5fcmVzdWx0cyA9IHJlc3VsdHM7CisJbG9jYWwtPmxhc3Rfc2Nhbl9yZXN1bHRzX2NvdW50ID0gbmV3X2NvdW50OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJa2ZyZWUocHJldik7CisKKwlob3N0YXBfcmVwb3J0X3NjYW5fY29tcGxldGUobG9jYWwpOworfQorI2VuZGlmIC8qIFBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCit2b2lkIGhvc3RhcF9pbmZvX3Byb2Nlc3MobG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGZhMzg0eF9pbmZvX2ZyYW1lICppbmZvOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgbGVmdDsKKyNpZm5kZWYgUFJJU00yX05PX0RFQlVHCisJaW50IGk7CisjZW5kaWYgLyogUFJJU00yX05PX0RFQlVHICovCisKKwlpbmZvID0gKHN0cnVjdCBoZmEzODR4X2luZm9fZnJhbWUgKikgc2tiLT5kYXRhOworCWJ1ZiA9IHNrYi0+ZGF0YSArIHNpemVvZigqaW5mbyk7CisJbGVmdCA9IHNrYi0+bGVuIC0gc2l6ZW9mKCppbmZvKTsKKworCXN3aXRjaCAoaW5mby0+dHlwZSkgeworCWNhc2UgSEZBMzg0WF9JTkZPX0NPTU1UQUxMSUVTOgorCQlwcmlzbTJfaW5mb19jb21tdGFsbGllcyhsb2NhbCwgYnVmLCBsZWZ0KTsKKwkJYnJlYWs7CisKKyNpZm5kZWYgUFJJU00yX05PX1NUQVRJT05fTU9ERVMKKwljYXNlIEhGQTM4NFhfSU5GT19MSU5LU1RBVFVTOgorCQlwcmlzbTJfaW5mb19saW5rc3RhdHVzKGxvY2FsLCBidWYsIGxlZnQpOworCQlicmVhazsKKworCWNhc2UgSEZBMzg0WF9JTkZPX1NDQU5SRVNVTFRTOgorCQlwcmlzbTJfaW5mb19zY2FucmVzdWx0cyhsb2NhbCwgYnVmLCBsZWZ0KTsKKwkJYnJlYWs7CisKKwljYXNlIEhGQTM4NFhfSU5GT19IT1NUU0NBTlJFU1VMVFM6CisJCXByaXNtMl9pbmZvX2hvc3RzY2FucmVzdWx0cyhsb2NhbCwgYnVmLCBsZWZ0KTsKKwkJYnJlYWs7CisjZW5kaWYgLyogUFJJU00yX05PX1NUQVRJT05fTU9ERVMgKi8KKworI2lmbmRlZiBQUklTTTJfTk9fREVCVUcKKwlkZWZhdWx0OgorCQlQREVCVUcoREVCVUdfRVhUUkEsICIlczogSU5GTyAtIGxlbj0lZCB0eXBlPTB4JTA0eFxuIiwKKwkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUsIGluZm8tPmxlbiwgaW5mby0+dHlwZSk7CisJCVBERUJVRyhERUJVR19FWFRSQSwgIlVua25vd24gaW5mbyBmcmFtZToiKTsKKwkJZm9yIChpID0gMDsgaSA8IChsZWZ0IDwgMTAwID8gbGVmdCA6IDEwMCk7IGkrKykKKwkJCVBERUJVRzIoREVCVUdfRVhUUkEsICIgJTAyeCIsIGJ1ZltpXSk7CisJCVBERUJVRzIoREVCVUdfRVhUUkEsICJcbiIpOworCQlicmVhazsKKyNlbmRpZiAvKiBQUklTTTJfTk9fREVCVUcgKi8KKwl9Cit9CisKKworI2lmbmRlZiBQUklTTTJfTk9fU1RBVElPTl9NT0RFUworc3RhdGljIHZvaWQgaGFuZGxlX2luZm9fcXVldWVfbGlua3N0YXR1cyhsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCWludCB2YWwgPSBsb2NhbC0+cHJldl9saW5rX3N0YXR1czsKKwlpbnQgY29ubmVjdGVkOworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKworCWNvbm5lY3RlZCA9CisJCXZhbCA9PSBIRkEzODRYX0xJTktTVEFUVVNfQ09OTkVDVEVEIHx8CisJCXZhbCA9PSBIRkEzODRYX0xJTktTVEFUVVNfQVBfQ0hBTkdFIHx8CisJCXZhbCA9PSBIRkEzODRYX0xJTktTVEFUVVNfQVBfSU5fUkFOR0U7CisKKwlpZiAobG9jYWwtPmZ1bmMtPmdldF9yaWQobG9jYWwtPmRldiwgSEZBMzg0WF9SSURfQ1VSUkVOVEJTU0lELAorCQkJCSBsb2NhbC0+YnNzaWQsIEVUSF9BTEVOLCAxKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjb3VsZCBub3QgcmVhZCBDVVJSRU5UQlNTSUQgYWZ0ZXIgIgorCQkgICAgICAgIkxpbmtTdGF0dXMgZXZlbnRcbiIsIGxvY2FsLT5kZXYtPm5hbWUpOworCX0gZWxzZSB7CisJCVBERUJVRyhERUJVR19FWFRSQSwgIiVzOiBMaW5rU3RhdHVzOiBCU1NJRD0iIE1BQ1NUUiAiXG4iLAorCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSwKKwkJICAgICAgIE1BQzJTVFIoKHVuc2lnbmVkIGNoYXIgKikgbG9jYWwtPmJzc2lkKSk7CisJCWlmIChsb2NhbC0+d2RzX3R5cGUgJiBIT1NUQVBfV0RTX0FQX0NMSUVOVCkKKwkJCWhvc3RhcF9hZGRfc3RhKGxvY2FsLT5hcCwgbG9jYWwtPmJzc2lkKTsKKwl9CisKKwkvKiBHZXQgQlNTSUQgaWYgd2UgaGF2ZSBhIHZhbGlkIEFQIGFkZHJlc3MgKi8KKwlpZiAoY29ubmVjdGVkKSB7CisJCW5ldGlmX2NhcnJpZXJfb24obG9jYWwtPmRldik7CisJCW5ldGlmX2NhcnJpZXJfb24obG9jYWwtPmRkZXYpOworCQltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIGxvY2FsLT5ic3NpZCwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGxvY2FsLT5kZXYpOworCQluZXRpZl9jYXJyaWVyX29mZihsb2NhbC0+ZGRldik7CisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCX0KKwl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJLyoKKwkgKiBGaWx0ZXIgb3V0IHNlcXVlbnRpYWwgZGlzY29ubmVjdCBldmVudHMgaW4gb3JkZXIgbm90IHRvIGNhdXNlIGEKKwkgKiBmbG9vZCBvZiBTSU9DR0lXQVAgZXZlbnRzIHRoYXQgaGF2ZSBhIHJhY2UgY29uZGl0aW9uIHdpdGggRUFQT0wKKwkgKiBmcmFtZXMgYW5kIGNhbiBjb25mdXNlIHdwYV9zdXBwbGljYW50IGFib3V0IHRoZSBjdXJyZW50IGFzc29jaWF0aW9uCisJICogc3RhdHVzLgorCSAqLworCWlmIChjb25uZWN0ZWQgfHwgbG9jYWwtPnByZXZfbGlua3N0YXR1c19jb25uZWN0ZWQpCisJCXdpcmVsZXNzX3NlbmRfZXZlbnQobG9jYWwtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisJbG9jYWwtPnByZXZfbGlua3N0YXR1c19jb25uZWN0ZWQgPSBjb25uZWN0ZWQ7Cit9CisKKworc3RhdGljIHZvaWQgaGFuZGxlX2luZm9fcXVldWVfc2NhbnJlc3VsdHMobG9jYWxfaW5mb190ICpsb2NhbCkKK3sKKwlpZiAobG9jYWwtPmhvc3Rfcm9hbWluZyA9PSAxICYmIGxvY2FsLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCisJCXByaXNtMl9ob3N0X3JvYW1pbmcobG9jYWwpOworCisJaWYgKGxvY2FsLT5ob3N0X3JvYW1pbmcgPT0gMiAmJiBsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBICYmCisJICAgIG1lbWNtcChsb2NhbC0+cHJlZmVycmVkX2FwLCAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJICAgRVRIX0FMRU4pICE9IDApIHsKKwkJLyoKKwkJICogRmlybXdhcmUgc2VlbXMgdG8gYmUgZ2V0dGluZyBpbnRvIG9kZCBzdGF0ZSBpbiBob3N0X3JvYW1pbmcKKwkJICogbW9kZSAyIHdoZW4gaG9zdHNjYW4gaXMgdXNlZCB3aXRob3V0IGpvaW4gY29tbWFuZCwgc28gdHJ5CisJCSAqIHRvIGZpeCB0aGlzIGJ5IHJlLWpvaW5pbmcgdGhlIGN1cnJlbnQgQVAuIFRoaXMgZG9lcyBub3QKKwkJICogYWN0dWFsbHkgdHJpZ2dlciBhIG5ldyBhc3NvY2lhdGlvbiBpZiB0aGUgY3VycmVudCBBUCBpcworCQkgKiBzdGlsbCBpbiB0aGUgc2NhbiByZXN1bHRzLgorCQkgKi8KKwkJcHJpc20yX2hvc3Rfcm9hbWluZyhsb2NhbCk7CisJfQorfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIHNjaGVkdWxlZCB0YXNrIGFmdGVyIHJlY2VpdmluZyBpbmZvIGZyYW1lcyAodXNlZCB0byBhdm9pZAorICogcGVuZGluZyB0b28gbXVjaCB0aW1lIGluIEhXIElSUSBoYW5kbGVyKS4gKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9pbmZvX3F1ZXVlKHZvaWQgKmRhdGEpCit7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IChsb2NhbF9pbmZvX3QgKikgZGF0YTsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUFJJU00yX0lORk9fUEVORElOR19MSU5LU1RBVFVTLAorCQkJICAgICAgICZsb2NhbC0+cGVuZGluZ19pbmZvKSkKKwkJaGFuZGxlX2luZm9fcXVldWVfbGlua3N0YXR1cyhsb2NhbCk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFBSSVNNMl9JTkZPX1BFTkRJTkdfU0NBTlJFU1VMVFMsCisJCQkgICAgICAgJmxvY2FsLT5wZW5kaW5nX2luZm8pKQorCQloYW5kbGVfaW5mb19xdWV1ZV9zY2FucmVzdWx0cyhsb2NhbCk7Cit9CisjZW5kaWYgLyogUFJJU00yX05PX1NUQVRJT05fTU9ERVMgKi8KKworCit2b2lkIGhvc3RhcF9pbmZvX2luaXQobG9jYWxfaW5mb190ICpsb2NhbCkKK3sKKwlza2JfcXVldWVfaGVhZF9pbml0KCZsb2NhbC0+aW5mb19saXN0KTsKKyNpZm5kZWYgUFJJU00yX05PX1NUQVRJT05fTU9ERVMKKwlJTklUX1dPUksoJmxvY2FsLT5pbmZvX3F1ZXVlLCBoYW5kbGVfaW5mb19xdWV1ZSwgbG9jYWwpOworI2VuZGlmIC8qIFBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCit9CisKKworRVhQT1JUX1NZTUJPTChob3N0YXBfaW5mb19pbml0KTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwX2luZm9fcHJvY2Vzcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyMDM2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW9jdGwuYwpAQCAtMCwwICsxLDQxMDIgQEAKKy8qIGlvY3RsKCkgKG1vc3RseSBMaW51eCBXaXJlbGVzcyBFeHRlbnNpb25zKSByb3V0aW5lcyBmb3IgSG9zdCBBUCBkcml2ZXIgKi8KKworI2lmZGVmIGluX2F0b21pYworLyogR2V0IGtlcm5lbF9sb2NrZWQoKSBmb3IgaW5fYXRvbWljKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorCisKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqaG9zdGFwX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXN0cnVjdCBpd19zdGF0aXN0aWNzICp3c3RhdHM7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwkvKiBXaHkgYXJlIHdlIGRvaW5nIHRoYXQgPyBKZWFuIElJICovCisJaWYgKGlmYWNlLT50eXBlICE9IEhPU1RBUF9JTlRFUkZBQ0VfTUFJTikKKwkJcmV0dXJuIE5VTEw7CisKKwl3c3RhdHMgPSAmbG9jYWwtPndzdGF0czsKKworCXdzdGF0cy0+c3RhdHVzID0gMDsKKwl3c3RhdHMtPmRpc2NhcmQuY29kZSA9CisJCWxvY2FsLT5jb21tX3RhbGxpZXMucnhfZGlzY2FyZHNfd2VwX3VuZGVjcnlwdGFibGU7CisJd3N0YXRzLT5kaXNjYXJkLm1pc2MgPQorCQlsb2NhbC0+Y29tbV90YWxsaWVzLnJ4X2Zjc19lcnJvcnMgKworCQlsb2NhbC0+Y29tbV90YWxsaWVzLnJ4X2Rpc2NhcmRzX25vX2J1ZmZlciArCisJCWxvY2FsLT5jb21tX3RhbGxpZXMudHhfZGlzY2FyZHNfd3Jvbmdfc2E7CisKKwl3c3RhdHMtPmRpc2NhcmQucmV0cmllcyA9CisJCWxvY2FsLT5jb21tX3RhbGxpZXMudHhfcmV0cnlfbGltaXRfZXhjZWVkZWQ7CisJd3N0YXRzLT5kaXNjYXJkLmZyYWdtZW50ID0KKwkJbG9jYWwtPmNvbW1fdGFsbGllcy5yeF9tZXNzYWdlX2luX2JhZF9tc2dfZnJhZ21lbnRzOworCisJaWYgKGxvY2FsLT5pd19tb2RlICE9IElXX01PREVfTUFTVEVSICYmCisJICAgIGxvY2FsLT5pd19tb2RlICE9IElXX01PREVfUkVQRUFUKSB7CisJCWludCB1cGRhdGUgPSAxOworI2lmZGVmIGluX2F0b21pYworCQkvKiBSSUQgcmVhZGluZyBtaWdodCBzbGVlcCBhbmQgaXQgbXVzdCBub3QgYmUgY2FsbGVkIGluCisJCSAqIGludGVycnVwdCBjb250ZXh0IG9yIHdoaWxlIGF0b21pYy4gSG93ZXZlciwgdGhpcworCQkgKiBmdW5jdGlvbiBzZWVtcyB0byBiZSBjYWxsZWQgd2hpbGUgYXRvbWljIChhdCBsZWFzdCBpbiBMaW51eAorCQkgKiAyLjUuNTkpLiBVcGRhdGUgc2lnbmFsIHF1YWxpdHkgdmFsdWVzIG9ubHkgaWYgaW4gc3VpdGFibGUKKwkJICogY29udGV4dC4gT3RoZXJ3aXNlLCBwcmV2aW91cyB2YWx1ZXMgcmVhZCBmcm9tIHRpY2sgdGltZXIKKwkJICogd2lsbCBiZSB1c2VkLiAqLworCQlpZiAoaW5fYXRvbWljKCkpCisJCQl1cGRhdGUgPSAwOworI2VuZGlmIC8qIGluX2F0b21pYyAqLworCisJCWlmICh1cGRhdGUgJiYgcHJpc20yX3VwZGF0ZV9jb21tc19xdWFsKGRldikgPT0gMCkKKwkJCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gNzsKKworCQl3c3RhdHMtPnF1YWwucXVhbCA9IGxvY2FsLT5jb21tc19xdWFsOworCQl3c3RhdHMtPnF1YWwubGV2ZWwgPSBsb2NhbC0+YXZnX3NpZ25hbDsKKwkJd3N0YXRzLT5xdWFsLm5vaXNlID0gbG9jYWwtPmF2Z19ub2lzZTsKKwl9IGVsc2UgeworCQl3c3RhdHMtPnF1YWwucXVhbCA9IDA7CisJCXdzdGF0cy0+cXVhbC5sZXZlbCA9IDA7CisJCXdzdGF0cy0+cXVhbC5ub2lzZSA9IDA7CisJCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gMDsKKwl9CisKKwlyZXR1cm4gd3N0YXRzOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2dldF9kYXRhcmF0ZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnJhdGVzKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXU4IGJ1ZlsxMl07CisJaW50IGxlbjsKKwl1MTYgdmFsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJbGVuID0gbG9jYWwtPmZ1bmMtPmdldF9yaWQoZGV2LCBIRkEzODRYX1JJRF9TVVBQT1JURUREQVRBUkFURVMsIGJ1ZiwKKwkJCQkgICBzaXplb2YoYnVmKSwgMCk7CisJaWYgKGxlbiA8IDIpCisJCXJldHVybiAwOworCisJdmFsID0gbGUxNl90b19jcHUoKih1MTYgKikgYnVmKTsgLyogc3RyaW5nIGxlbmd0aCAqLworCisJaWYgKGxlbiAtIDIgPCB2YWwgfHwgdmFsID4gMTApCisJCXJldHVybiAwOworCisJbWVtY3B5KHJhdGVzLCBidWYgKyAyLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwl1OCByYXRlc1sxMF07CisJaW50IGxlbiwgaSwgb3ZlcjIgPSAwOworCisJbGVuID0gcHJpc20yX2dldF9kYXRhcmF0ZXMoZGV2LCByYXRlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKHJhdGVzW2ldID09IDB4MGIgfHwgcmF0ZXNbaV0gPT0gMHgxNikgeworCQkJb3ZlcjIgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzdHJjcHkobmFtZSwgb3ZlcjIgPyAiSUVFRSA4MDIuMTFiIiA6ICJJRUVFIDgwMi4xMS1EUyIpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgcHJpc20yX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGxvY2FsX2luZm9fdCAqbG9jYWwsCisJCQkJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0KQoreworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0bXAgPSAqY3J5cHQ7CisJKmNyeXB0ID0gTlVMTDsKKworCWlmICh0bXAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogbXVzdCBub3QgcnVuIG9wcy0+ZGVpbml0KCkgd2hpbGUgdGhlcmUgbWF5IGJlIHBlbmRpbmcgZW5jcnlwdCBvcgorCSAqIGRlY3J5cHQgb3BlcmF0aW9ucy4gVXNlIGEgbGlzdCBvZiBkZWxheWVkIGRlaW5pdHMgdG8gYXZvaWQgbmVlZGluZworCSAqIGxvY2tpbmcuICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmdG1wLT5saXN0LCAmbG9jYWwtPmNyeXB0X2RlaW5pdF9saXN0KTsKKwlpZiAoIXRpbWVyX3BlbmRpbmcoJmxvY2FsLT5jcnlwdF9kZWluaXRfdGltZXIpKSB7CisJCWxvY2FsLT5jcnlwdF9kZWluaXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJYWRkX3RpbWVyKCZsb2NhbC0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9zaXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5YnVmKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCBpOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0OworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGkgPCAxIHx8IGkgPiA0KQorCQlpID0gbG9jYWwtPnR4X2tleWlkeDsKKwllbHNlCisJCWktLTsKKwlpZiAoaSA8IDAgfHwgaSA+PSBXRVBfS0VZUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljcnlwdCA9ICZsb2NhbC0+Y3J5cHRbaV07CisKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQlpZiAoKmNyeXB0KQorCQkJcHJpc20yX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGxvY2FsLCBjcnlwdCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoKmNyeXB0ICE9IE5VTEwgJiYgKCpjcnlwdCktPm9wcyAhPSBOVUxMICYmCisJICAgIHN0cmNtcCgoKmNyeXB0KS0+b3BzLT5uYW1lLCAiV0VQIikgIT0gMCkgeworCQkvKiBjaGFuZ2luZyB0byB1c2UgV0VQOyBkZWluaXQgcHJldmlvdXNseSB1c2VkIGFsZ29yaXRobSAqLworCQlwcmlzbTJfY3J5cHRfZGVsYXllZF9kZWluaXQobG9jYWwsIGNyeXB0KTsKKwl9CisKKwlpZiAoKmNyeXB0ID09IE5VTEwpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpuZXdfY3J5cHQ7CisKKwkJLyogdGFrZSBXRVAgaW50byB1c2UgKi8KKwkJbmV3X2NyeXB0ID0gKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKQorCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpKTsKKwkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOworCQlpZiAoIW5ld19jcnlwdC0+b3BzKSB7CisJCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3dlcCIpOworCQkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOworCQl9CisJCWlmIChuZXdfY3J5cHQtPm9wcykKKwkJCW5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGkpOworCQlpZiAoIW5ld19jcnlwdC0+b3BzIHx8ICFuZXdfY3J5cHQtPnByaXYpIHsKKwkJCWtmcmVlKG5ld19jcnlwdCk7CisJCQluZXdfY3J5cHQgPSBOVUxMOworCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY291bGQgbm90IGluaXRpYWxpemUgV0VQOiAiCisJCQkgICAgICAgImxvYWQgbW9kdWxlIGhvc3RhcF9jcnlwdF93ZXAub1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJCSpjcnlwdCA9IG5ld19jcnlwdDsKKwl9CisKKwlpZiAoZXJxLT5sZW5ndGggPiAwKSB7CisJCWludCBsZW4gPSBlcnEtPmxlbmd0aCA8PSA1ID8gNSA6IDEzOworCQlpbnQgZmlyc3QgPSAxLCBqOworCQlpZiAobGVuID4gZXJxLT5sZW5ndGgpCisJCQltZW1zZXQoa2V5YnVmICsgZXJxLT5sZW5ndGgsIDAsIGxlbiAtIGVycS0+bGVuZ3RoKTsKKwkJKCpjcnlwdCktPm9wcy0+c2V0X2tleShrZXlidWYsIGxlbiwgTlVMTCwgKCpjcnlwdCktPnByaXYpOworCQlmb3IgKGogPSAwOyBqIDwgV0VQX0tFWVM7IGorKykgeworCQkJaWYgKGogIT0gaSAmJiBsb2NhbC0+Y3J5cHRbal0pIHsKKwkJCQlmaXJzdCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGZpcnN0KQorCQkJbG9jYWwtPnR4X2tleWlkeCA9IGk7CisJfSBlbHNlIHsKKwkJLyogTm8ga2V5IGRhdGEgLSBqdXN0IHNldCB0aGUgZGVmYXVsdCBUWCBrZXkgaW5kZXggKi8KKwkJbG9jYWwtPnR4X2tleWlkeCA9IGk7CisJfQorCisgZG9uZToKKwlsb2NhbC0+b3Blbl93ZXAgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU47CisKKwlpZiAoaG9zdGFwX3NldF9lbmNyeXB0aW9uKGxvY2FsKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNldF9lbmNyeXB0aW9uIGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRG8gbm90IHJlc2V0IHBvcnQwIGlmIGNhcmQgaXMgaW4gTWFuYWdlZCBtb2RlIHNpbmNlIHJlc2V0dGluZyB3aWxsCisJICogZ2VuZXJhdGUgbmV3IElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIHdoaWNoIG1heSBlbmQgdXAgaW4gbG9vcGluZworCSAqIHdpdGggSUVFRSA4MDIuMVguIFByaXNtMiBkb2N1bWVudGF0aW9uIHNlZW0gdG8gcmVxdWlyZSBwb3J0IHJlc2V0CisJICogYWZ0ZXIgV0VQIGNvbmZpZ3VyYXRpb24uIEhvd2V2ZXIsIGtleXMgYXJlIGFwcGFyZW50bHkgY2hhbmdlZCBhdAorCSAqIGxlYXN0IGluIE1hbmFnZWQgbW9kZS4gKi8KKwlpZiAobG9jYWwtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJiBsb2NhbC0+ZnVuYy0+cmVzZXRfcG9ydChkZXYpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVzZXRfcG9ydCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2lvY3RsX2dpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJaW50IGksIGxlbjsKKwl1MTYgdmFsOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQ7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaSA8IDEgfHwgaSA+IDQpCisJCWkgPSBsb2NhbC0+dHhfa2V5aWR4OworCWVsc2UKKwkJaS0tOworCWlmIChpIDwgMCB8fCBpID49IFdFUF9LRVlTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNyeXB0ID0gbG9jYWwtPmNyeXB0W2ldOworCWVycS0+ZmxhZ3MgPSBpICsgMTsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMgPT0gTlVMTCkgeworCQllcnEtPmxlbmd0aCA9IDA7CisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSAhPSAwKSB7CisJCS8qIG9ubHkgV0VQIGlzIHN1cHBvcnRlZCB3aXRoIHdpcmVsZXNzIGV4dGVuc2lvbnMsIHNvIGp1c3QKKwkJICogcmVwb3J0IHRoYXQgZW5jcnlwdGlvbiBpcyB1c2VkICovCisJCWVycS0+bGVuZ3RoID0gMDsKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVhZHMgZnJvbSBIRkEzODRYX1JJRF9DTkZERUZBVUxUS0VZKiByZXR1cm4gYm9ndXMgdmFsdWVzLCBzbyBzaG93CisJICogdGhlIGtleXMgZnJvbSBkcml2ZXIgYnVmZmVyICovCisJbGVuID0gY3J5cHQtPm9wcy0+Z2V0X2tleShrZXksIFdFUF9LRVlfTEVOLCBOVUxMLCBjcnlwdC0+cHJpdik7CisJZXJxLT5sZW5ndGggPSAobGVuID49IDAgPyBsZW4gOiAwKTsKKworCWlmIChsb2NhbC0+ZnVuYy0+Z2V0X3JpZChkZXYsIEhGQTM4NFhfUklEX0NORldFUEZMQUdTLCAmdmFsLCAyLCAxKSA8IDApCisJeworCQlwcmludGsoIkNORldFUEZMQUdTIHJlYWRpbmcgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlsZTE2X3RvX2NwdXMoJnZhbCk7CisJaWYgKHZhbCAmIEhGQTM4NFhfV0VQRkxBR1NfUFJJVkFDWUlOVk9LRUQpCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJZWxzZQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwlpZiAodmFsICYgSEZBMzg0WF9XRVBGTEFHU19FWENMVURFVU5FTkNSWVBURUQpCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CisJZWxzZQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBob3N0YXBfc2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgcmV0LCBiYXNpY19yYXRlczsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCWJhc2ljX3JhdGVzID0gbG9jYWwtPmJhc2ljX3JhdGVzICYgbG9jYWwtPnR4X3JhdGVfY29udHJvbDsKKwlpZiAoIWJhc2ljX3JhdGVzIHx8IGJhc2ljX3JhdGVzICE9IGxvY2FsLT5iYXNpY19yYXRlcykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogdXBkYXRpbmcgYmFzaWMgcmF0ZSBzZXQgYXV0b21hdGljYWxseSAiCisJCSAgICAgICAidG8gbWF0Y2ggd2l0aCB0aGUgbmV3IHN1cHBvcnRlZCByYXRlIHNldFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWlmICghYmFzaWNfcmF0ZXMpCisJCQliYXNpY19yYXRlcyA9IGxvY2FsLT50eF9yYXRlX2NvbnRyb2w7CisKKwkJbG9jYWwtPmJhc2ljX3JhdGVzID0gYmFzaWNfcmF0ZXM7CisJCWlmIChob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZCQVNJQ1JBVEVTLAorCQkJCSAgICBiYXNpY19yYXRlcykpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIHRvIHNldCAiCisJCQkgICAgICAgImNuZkJhc2ljUmF0ZXNcbiIsIGRldi0+bmFtZSk7CisJfQorCisJcmV0ID0gKGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX1RYUkFURUNPTlRST0wsCisJCQkgICAgICAgbG9jYWwtPnR4X3JhdGVfY29udHJvbCkgfHwKKwkgICAgICAgaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GU1VQUE9SVEVEUkFURVMsCisJCQkgICAgICAgbG9jYWwtPnR4X3JhdGVfY29udHJvbCkgfHwKKwkgICAgICAgbG9jYWwtPmZ1bmMtPnJlc2V0X3BvcnQoZGV2KSk7CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUWFJhdGVDb250cm9sL2NuZlN1cHBvcnRlZFJhdGVzICIKKwkJICAgICAgICJzZXR0aW5nIHRvIDB4JXggZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBsb2NhbC0+dHhfcmF0ZV9jb250cm9sKTsKKwl9CisKKwkvKiBVcGRhdGUgVFggcmF0ZSBjb25maWd1cmF0aW9uIGZvciBhbGwgU1RBcyBiYXNlZCBvbiBuZXcgb3BlcmF0aW9uYWwKKwkgKiByYXRlIHNldC4gKi8KKwlob3N0YXBfdXBkYXRlX3JhdGVzKGxvY2FsKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfc2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKHJycS0+Zml4ZWQpIHsKKwkJc3dpdGNoIChycnEtPnZhbHVlKSB7CisJCWNhc2UgMTEwMDAwMDA6CisJCQlsb2NhbC0+dHhfcmF0ZV9jb250cm9sID0gSEZBMzg0WF9SQVRFU18xMU1CUFM7CisJCQlicmVhazsKKwkJY2FzZSA1NTAwMDAwOgorCQkJbG9jYWwtPnR4X3JhdGVfY29udHJvbCA9IEhGQTM4NFhfUkFURVNfNU1CUFM7CisJCQlicmVhazsKKwkJY2FzZSAyMDAwMDAwOgorCQkJbG9jYWwtPnR4X3JhdGVfY29udHJvbCA9IEhGQTM4NFhfUkFURVNfMk1CUFM7CisJCQlicmVhazsKKwkJY2FzZSAxMDAwMDAwOgorCQkJbG9jYWwtPnR4X3JhdGVfY29udHJvbCA9IEhGQTM4NFhfUkFURVNfMU1CUFM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvY2FsLT50eF9yYXRlX2NvbnRyb2wgPSBIRkEzODRYX1JBVEVTXzFNQlBTIHwKKwkJCQlIRkEzODRYX1JBVEVTXzJNQlBTIHwgSEZBMzg0WF9SQVRFU181TUJQUyB8CisJCQkJSEZBMzg0WF9SQVRFU18xMU1CUFM7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAocnJxLT52YWx1ZSkgeworCQljYXNlIDExMDAwMDAwOgorCQkJbG9jYWwtPnR4X3JhdGVfY29udHJvbCA9IEhGQTM4NFhfUkFURVNfMU1CUFMgfAorCQkJCUhGQTM4NFhfUkFURVNfMk1CUFMgfCBIRkEzODRYX1JBVEVTXzVNQlBTIHwKKwkJCQlIRkEzODRYX1JBVEVTXzExTUJQUzsKKwkJCWJyZWFrOworCQljYXNlIDU1MDAwMDA6CisJCQlsb2NhbC0+dHhfcmF0ZV9jb250cm9sID0gSEZBMzg0WF9SQVRFU18xTUJQUyB8CisJCQkJSEZBMzg0WF9SQVRFU18yTUJQUyB8IEhGQTM4NFhfUkFURVNfNU1CUFM7CisJCQlicmVhazsKKwkJY2FzZSAyMDAwMDAwOgorCQkJbG9jYWwtPnR4X3JhdGVfY29udHJvbCA9IEhGQTM4NFhfUkFURVNfMU1CUFMgfAorCQkJCUhGQTM4NFhfUkFURVNfMk1CUFM7CisJCQlicmVhazsKKwkJY2FzZSAxMDAwMDAwOgorCQkJbG9jYWwtPnR4X3JhdGVfY29udHJvbCA9IEhGQTM4NFhfUkFURVNfMU1CUFM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvY2FsLT50eF9yYXRlX2NvbnRyb2wgPSBIRkEzODRYX1JBVEVTXzFNQlBTIHwKKwkJCQlIRkEzODRYX1JBVEVTXzJNQlBTIHwgSEZBMzg0WF9SQVRFU181TUJQUyB8CisJCQkJSEZBMzg0WF9SQVRFU18xMU1CUFM7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBob3N0YXBfc2V0X3JhdGUoZGV2KTsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9naXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCit7CisJdTE2IHZhbDsKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgcmV0ID0gMDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCWlmIChsb2NhbC0+ZnVuYy0+Z2V0X3JpZChkZXYsIEhGQTM4NFhfUklEX1RYUkFURUNPTlRST0wsICZ2YWwsIDIsIDEpIDwKKwkgICAgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHZhbCAmIDB4MSkgJiYgKHZhbCA+IDEpKQorCQlycnEtPmZpeGVkID0gMDsKKwllbHNlCisJCXJycS0+Zml4ZWQgPSAxOworCisJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmIGxvY2FsLT5hcCAhPSBOVUxMICYmCisJICAgICFsb2NhbC0+ZndfdHhfcmF0ZV9jb250cm9sKSB7CisJCS8qIEhGQTM4NFhfUklEX0NVUlJFTlRUWFJBVEUgc2VlbXMgdG8gYWx3YXlzIGJlIDIgTWJwcyBpbgorCQkgKiBIb3N0IEFQIG1vZGUsIHNvIHVzZSB0aGUgcmVjb3JkZWQgVFggcmF0ZSBvZiB0aGUgbGFzdCBzZW50CisJCSAqIGZyYW1lICovCisJCXJycS0+dmFsdWUgPSBsb2NhbC0+YXAtPmxhc3RfdHhfcmF0ZSA+IDAgPworCQkJbG9jYWwtPmFwLT5sYXN0X3R4X3JhdGUgKiAxMDAwMDAgOiAxMTAwMDAwMDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxvY2FsLT5mdW5jLT5nZXRfcmlkKGRldiwgSEZBMzg0WF9SSURfQ1VSUkVOVFRYUkFURSwgJnZhbCwgMiwgMSkgPAorCSAgICAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBIRkEzODRYX1JBVEVTXzFNQlBTOgorCQlycnEtPnZhbHVlID0gMTAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBIRkEzODRYX1JBVEVTXzJNQlBTOgorCQlycnEtPnZhbHVlID0gMjAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBIRkEzODRYX1JBVEVTXzVNQlBTOgorCQlycnEtPnZhbHVlID0gNTUwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBIRkEzODRYX1JBVEVTXzExTUJQUzoKKwkJcnJxLT52YWx1ZSA9IDExMDAwMDAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQlycnEtPnZhbHVlID0gMTEwMDAwMDA7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGl3X3BhcmFtICpzZW5zLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCS8qIFNldCB0aGUgZGVzaXJlZCBBUCBkZW5zaXR5ICovCisJaWYgKHNlbnMtPnZhbHVlIDwgMSB8fCBzZW5zLT52YWx1ZSA+IDMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX0NORlNZU1RFTVNDQUxFLCBzZW5zLT52YWx1ZSkgfHwKKwkgICAgbG9jYWwtPmZ1bmMtPnJlc2V0X3BvcnQoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfZ2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGl3X3BhcmFtICpzZW5zLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1MTYgdmFsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJLyogR2V0IHRoZSBjdXJyZW50IEFQIGRlbnNpdHkgKi8KKwlpZiAobG9jYWwtPmZ1bmMtPmdldF9yaWQoZGV2LCBIRkEzODRYX1JJRF9DTkZTWVNURU1TQ0FMRSwgJnZhbCwgMiwgMSkgPAorCSAgICAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNlbnMtPnZhbHVlID0gX19sZTE2X3RvX2NwdSh2YWwpOworCXNlbnMtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisKKy8qIERlcHJlY2F0ZWQgaW4gbmV3IHdpcmVsZXNzIGV4dGVuc2lvbiBBUEkgKi8KK3N0YXRpYyBpbnQgcHJpc20yX2lvY3RsX2dpd2FwbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJc3RydWN0IHNvY2thZGRyICphZGRyOworCXN0cnVjdCBpd19xdWFsaXR5ICpxdWFsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKGxvY2FsLT5pd19tb2RlICE9IElXX01PREVfTUFTVEVSKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJTSU9DR0lXQVBMSVNUIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCAiCisJCSAgICAgICAiaW4gSG9zdCBBUCBtb2RlXG4iKTsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWFkZHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogSVdfTUFYX0FQLCBHRlBfS0VSTkVMKTsKKwlxdWFsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogSVdfTUFYX0FQLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWRkciA9PSBOVUxMIHx8IHF1YWwgPT0gTlVMTCkgeworCQlrZnJlZShhZGRyKTsKKwkJa2ZyZWUocXVhbCk7CisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRhdGEtPmxlbmd0aCA9IHByaXNtMl9hcF9nZXRfc3RhX3F1YWwobG9jYWwsIGFkZHIsIHF1YWwsIElXX01BWF9BUCwgMSk7CisKKwltZW1jcHkoZXh0cmEsICZhZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIGRhdGEtPmxlbmd0aCk7CisJZGF0YS0+ZmxhZ3MgPSAxOyAvKiBoYXMgcXVhbGl0eSBpbmZvcm1hdGlvbiAqLworCW1lbWNweShleHRyYSArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogZGF0YS0+bGVuZ3RoLCAmcXVhbCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIGRhdGEtPmxlbmd0aCk7CisKKwlrZnJlZShhZGRyKTsKKwlrZnJlZShxdWFsKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2lvY3RsX3Npd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXUxNiB2YWw7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAocnRzLT5kaXNhYmxlZCkKKwkJdmFsID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigyMzQ3KTsKKwllbHNlIGlmIChydHMtPnZhbHVlIDwgMCB8fCBydHMtPnZhbHVlID4gMjM0NykKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZQorCQl2YWwgPSBfX2NwdV90b19sZTE2KHJ0cy0+dmFsdWUpOworCisJaWYgKGxvY2FsLT5mdW5jLT5zZXRfcmlkKGRldiwgSEZBMzg0WF9SSURfUlRTVEhSRVNIT0xELCAmdmFsLCAyKSB8fAorCSAgICBsb2NhbC0+ZnVuYy0+cmVzZXRfcG9ydChkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2FsLT5ydHNfdGhyZXNob2xkID0gcnRzLT52YWx1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9naXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1MTYgdmFsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKGxvY2FsLT5mdW5jLT5nZXRfcmlkKGRldiwgSEZBMzg0WF9SSURfUlRTVEhSRVNIT0xELCAmdmFsLCAyLCAxKSA8CisJICAgIDApCisJCXJldHVybiAtRUlOVkFMOworCisJcnRzLT52YWx1ZSA9IF9fbGUxNl90b19jcHUodmFsKTsKKwlydHMtPmRpc2FibGVkID0gKHJ0cy0+dmFsdWUgPT0gMjM0Nyk7CisJcnRzLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9zaXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJdTE2IHZhbDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCWlmIChydHMtPmRpc2FibGVkKQorCQl2YWwgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDIzNDYpOworCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPCAyNTYgfHwgcnRzLT52YWx1ZSA+IDIzNDYpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UKKwkJdmFsID0gX19jcHVfdG9fbGUxNihydHMtPnZhbHVlICYgfjB4MSk7IC8qIGV2ZW4gbnVtYmVycyBvbmx5ICovCisKKwlsb2NhbC0+ZnJhZ21fdGhyZXNob2xkID0gcnRzLT52YWx1ZSAmIH4weDE7CisJaWYgKGxvY2FsLT5mdW5jLT5zZXRfcmlkKGRldiwgSEZBMzg0WF9SSURfRlJBR01FTlRBVElPTlRIUkVTSE9MRCwgJnZhbCwKKwkJCQkgMikKKwkgICAgfHwgbG9jYWwtPmZ1bmMtPnJlc2V0X3BvcnQoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfZ2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXUxNiB2YWw7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAobG9jYWwtPmZ1bmMtPmdldF9yaWQoZGV2LCBIRkEzODRYX1JJRF9GUkFHTUVOVEFUSU9OVEhSRVNIT0xELAorCQkJCSAmdmFsLCAyLCAxKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcnRzLT52YWx1ZSA9IF9fbGUxNl90b19jcHUodmFsKTsKKwlydHMtPmRpc2FibGVkID0gKHJ0cy0+dmFsdWUgPT0gMjM0Nik7CisJcnRzLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworCisjaWZuZGVmIFBSSVNNMl9OT19TVEFUSU9OX01PREVTCitzdGF0aWMgaW50IGhvc3RhcF9qb2luX2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJc3RydWN0IGhmYTM4NHhfam9pbl9yZXF1ZXN0IHJlcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCXN0cnVjdCBoZmEzODR4X2hvc3RzY2FuX3Jlc3VsdCAqZW50cnk7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwltZW1jcHkocmVxLmJzc2lkLCBsb2NhbC0+cHJlZmVycmVkX2FwLCBFVEhfQUxFTik7CisJcmVxLmNoYW5uZWwgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGxvY2FsLT5sYXN0X3NjYW5fcmVzdWx0c19jb3VudDsgaSsrKSB7CisJCWlmICghbG9jYWwtPmxhc3Rfc2Nhbl9yZXN1bHRzKQorCQkJYnJlYWs7CisJCWVudHJ5ID0gJmxvY2FsLT5sYXN0X3NjYW5fcmVzdWx0c1tpXTsKKwkJaWYgKG1lbWNtcChsb2NhbC0+cHJlZmVycmVkX2FwLCBlbnRyeS0+YnNzaWQsIEVUSF9BTEVOKSA9PSAwKSB7CisJCQlyZXEuY2hhbm5lbCA9IGVudHJ5LT5jaGlkOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKworCWlmIChsb2NhbC0+ZnVuYy0+c2V0X3JpZChkZXYsIEhGQTM4NFhfUklEX0pPSU5SRVFVRVNULCAmcmVxLAorCQkJCSBzaXplb2YocmVxKSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBKb2luUmVxdWVzdCAiIE1BQ1NUUgorCQkgICAgICAgIiBmYWlsZWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIE1BQzJTVFIobG9jYWwtPnByZWZlcnJlZF9hcCkpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcnlpbmcgdG8gam9pbiBCU1NJRCAiIE1BQ1NUUiAiXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIE1BQzJTVFIobG9jYWwtPnByZWZlcnJlZF9hcCkpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogUFJJU00yX05PX1NUQVRJT05fTU9ERVMgKi8KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9zaXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisjaWZkZWYgUFJJU00yX05PX1NUQVRJT05fTU9ERVMKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisjZWxzZSAvKiBQUklTTTJfTk9fU1RBVElPTl9NT0RFUyAqLworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJbWVtY3B5KGxvY2FsLT5wcmVmZXJyZWRfYXAsICZhcF9hZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CisKKwlpZiAobG9jYWwtPmhvc3Rfcm9hbWluZyA9PSAxICYmIGxvY2FsLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKKwkJc3RydWN0IGhmYTM4NHhfc2Nhbl9yZXF1ZXN0IHNjYW5fcmVxOworCQltZW1zZXQoJnNjYW5fcmVxLCAwLCBzaXplb2Yoc2Nhbl9yZXEpKTsKKwkJc2Nhbl9yZXEuY2hhbm5lbF9saXN0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweDNmZmYpOworCQlzY2FuX3JlcS50eHJhdGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KEhGQTM4NFhfUkFURVNfMU1CUFMpOworCQlpZiAobG9jYWwtPmZ1bmMtPnNldF9yaWQoZGV2LCBIRkEzODRYX1JJRF9TQ0FOUkVRVUVTVCwKKwkJCQkJICZzY2FuX3JlcSwgc2l6ZW9mKHNjYW5fcmVxKSkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2NhblJlc3VsdHMgcmVxdWVzdCBmYWlsZWQgLSAiCisJCQkgICAgICAgInByZWZlcnJlZCBBUCBkZWxheWVkIHRvIG5leHQgdW5zb2xpY2l0ZWQgIgorCQkJICAgICAgICJzY2FuXG4iLCBkZXYtPm5hbWUpOworCQl9CisJfSBlbHNlIGlmIChsb2NhbC0+aG9zdF9yb2FtaW5nID09IDIgJiYKKwkJICAgbG9jYWwtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQlpZiAoaG9zdGFwX2pvaW5fYXAoZGV2KSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUHJlZmVycmVkIEFQIChTSU9DU0lXQVApIGlzIHVzZWQgb25seSAiCisJCSAgICAgICAiaW4gTWFuYWdlZCBtb2RlIHdoZW4gaG9zdF9yb2FtaW5nIGlzIGVuYWJsZWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCX0KKworCXJldHVybiAwOworI2VuZGlmIC8qIFBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCit9CisKK3N0YXRpYyBpbnQgcHJpc20yX2lvY3RsX2dpd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwlzd2l0Y2ggKGlmYWNlLT50eXBlKSB7CisJY2FzZSBIT1NUQVBfSU5URVJGQUNFX0FQOgorCQltZW1jcHkoJmFwX2FkZHItPnNhX2RhdGEsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJY2FzZSBIT1NUQVBfSU5URVJGQUNFX1NUQToKKwkJbWVtY3B5KCZhcF9hZGRyLT5zYV9kYXRhLCBsb2NhbC0+YXNzb2NfYXBfYWRkciwgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIEhPU1RBUF9JTlRFUkZBQ0VfV0RTOgorCQltZW1jcHkoJmFwX2FkZHItPnNhX2RhdGEsIGlmYWNlLT51Lndkcy5yZW1vdGVfYWRkciwgRVRIX0FMRU4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAobG9jYWwtPmZ1bmMtPmdldF9yaWQoZGV2LCBIRkEzODRYX1JJRF9DVVJSRU5UQlNTSUQsCisJCQkJCSAmYXBfYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4sIDEpIDwgMCkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCQkvKiBsb2NhbC0+YnNzaWQgaXMgYWxzbyB1cGRhdGVkIGluIExpbmtTdGF0dXMgaGFuZGxlciB3aGVuIGluCisJCSAqIHN0YXRpb24gbW9kZSAqLworCQltZW1jcHkobG9jYWwtPmJzc2lkLCAmYXBfYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJbWVtc2V0KGxvY2FsLT5uYW1lLCAwLCBzaXplb2YobG9jYWwtPm5hbWUpKTsKKwltZW1jcHkobG9jYWwtPm5hbWUsIG5pY2tuYW1lLCBkYXRhLT5sZW5ndGgpOworCWxvY2FsLT5uYW1lX3NldCA9IDE7CisKKwlpZiAoaG9zdGFwX3NldF9zdHJpbmcoZGV2LCBIRkEzODRYX1JJRF9DTkZPV05OQU1FLCBsb2NhbC0+bmFtZSkgfHwKKwkgICAgbG9jYWwtPmZ1bmMtPnJlc2V0X3BvcnQoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfZ2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgbGVuOworCWNoYXIgbmFtZVtNQVhfTkFNRV9MRU4gKyAzXTsKKwl1MTYgdmFsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJbGVuID0gbG9jYWwtPmZ1bmMtPmdldF9yaWQoZGV2LCBIRkEzODRYX1JJRF9DTkZPV05OQU1FLAorCQkJCSAgICZuYW1lLCBNQVhfTkFNRV9MRU4gKyAyLCAwKTsKKwl2YWwgPSBfX2xlMTZfdG9fY3B1KCoodTE2ICopIG5hbWUpOworCWlmIChsZW4gPiBNQVhfTkFNRV9MRU4gKyAyIHx8IGxlbiA8IDAgfHwgdmFsID4gTUFYX05BTUVfTEVOKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwluYW1lW3ZhbCArIDJdID0gJ1wwJzsKKwlkYXRhLT5sZW5ndGggPSB2YWwgKyAxOworCW1lbWNweShuaWNrbmFtZSwgbmFtZSArIDIsIHZhbCArIDEpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfc2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJLyogZnJlcSA9PiBjaGFuLiAqLworCWlmIChmcmVxLT5lID09IDEgJiYKKwkgICAgZnJlcS0+bSAvIDEwMDAwMCA+PSBmcmVxX2xpc3RbMF0gJiYKKwkgICAgZnJlcS0+bSAvIDEwMDAwMCA8PSBmcmVxX2xpc3RbRlJFUV9DT1VOVCAtIDFdKSB7CisJCWludCBjaDsKKwkJaW50IGZyID0gZnJlcS0+bSAvIDEwMDAwMDsKKwkJZm9yIChjaCA9IDA7IGNoIDwgRlJFUV9DT1VOVDsgY2grKykgeworCQkJaWYgKGZyID09IGZyZXFfbGlzdFtjaF0pIHsKKwkJCQlmcmVxLT5lID0gMDsKKwkJCQlmcmVxLT5tID0gY2ggKyAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGZyZXEtPmUgIT0gMCB8fCBmcmVxLT5tIDwgMSB8fCBmcmVxLT5tID4gRlJFUV9DT1VOVCB8fAorCSAgICAhKGxvY2FsLT5jaGFubmVsX21hc2sgJiAoMSA8PCAoZnJlcS0+bSAtIDEpKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9jYWwtPmNoYW5uZWwgPSBmcmVxLT5tOyAvKiBjaGFubmVsIGlzIHVzZWQgaW4gcHJpc20yX3NldHVwX3JpZHMoKSAqLworCWlmIChob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZPV05DSEFOTkVMLCBsb2NhbC0+Y2hhbm5lbCkgfHwKKwkgICAgbG9jYWwtPmZ1bmMtPnJlc2V0X3BvcnQoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfZ2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXUxNiB2YWw7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAobG9jYWwtPmZ1bmMtPmdldF9yaWQoZGV2LCBIRkEzODRYX1JJRF9DVVJSRU5UQ0hBTk5FTCwgJnZhbCwgMiwgMSkgPAorCSAgICAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxlMTZfdG9fY3B1cygmdmFsKTsKKwlpZiAodmFsIDwgMSB8fCB2YWwgPiBGUkVRX0NPVU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZyZXEtPm0gPSBmcmVxX2xpc3RbdmFsIC0gMV0gKiAxMDAwMDA7CisJZnJlcS0+ZSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBob3N0YXBfbW9uaXRvcl9zZXRfdHlwZShsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsb2NhbC0+ZGRldjsKKworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGxvY2FsLT5tb25pdG9yX3R5cGUgPT0gUFJJU00yX01PTklUT1JfUFJJU00gfHwKKwkgICAgbG9jYWwtPm1vbml0b3JfdHlwZSA9PSBQUklTTTJfTU9OSVRPUl9DQVBIRFIpIHsKKwkJZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMV9QUklTTTsKKwkJZGV2LT5oYXJkX2hlYWRlcl9wYXJzZSA9CisJCQlob3N0YXBfODAyMTFfcHJpc21faGVhZGVyX3BhcnNlOworCX0gZWxzZSB7CisJCWRldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTE7CisJCWRldi0+aGFyZF9oZWFkZXJfcGFyc2UgPSBob3N0YXBfODAyMTFfaGVhZGVyX3BhcnNlOworCX0KK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9zaXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKnNzaWQpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAoaWZhY2UtPnR5cGUgPT0gSE9TVEFQX0lOVEVSRkFDRV9XRFMpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChkYXRhLT5mbGFncyA9PSAwKQorCQlzc2lkWzBdID0gJ1wwJzsgLyogQU5ZICovCisKKwlpZiAobG9jYWwtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgJiYgc3NpZFswXSA9PSAnXDAnKSB7CisJCS8qIFNldHRpbmcgU1NJRCB0byBlbXB0eSBzdHJpbmcgc2VlbXMgdG8ga2lsbCB0aGUgY2FyZCBpbgorCQkgKiBIb3N0IEFQIG1vZGUgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBIb3N0IEFQIG1vZGUgZG9lcyBub3Qgc3VwcG9ydCAiCisJCSAgICAgICAiJ0FueScgZXNzaWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1lbWNweShsb2NhbC0+ZXNzaWQsIHNzaWQsIGRhdGEtPmxlbmd0aCk7CisJbG9jYWwtPmVzc2lkW2RhdGEtPmxlbmd0aF0gPSAnXDAnOworCisJaWYgKCghbG9jYWwtPmZ3X2FwICYmCisJICAgICBob3N0YXBfc2V0X3N0cmluZyhkZXYsIEhGQTM4NFhfUklEX0NORkRFU0lSRURTU0lELCBsb2NhbC0+ZXNzaWQpKQorCSAgICB8fCBob3N0YXBfc2V0X3N0cmluZyhkZXYsIEhGQTM4NFhfUklEX0NORk9XTlNTSUQsIGxvY2FsLT5lc3NpZCkgfHwKKwkgICAgbG9jYWwtPmZ1bmMtPnJlc2V0X3BvcnQoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1MTYgdmFsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKGlmYWNlLT50eXBlID09IEhPU1RBUF9JTlRFUkZBQ0VfV0RTKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlkYXRhLT5mbGFncyA9IDE7IC8qIGFjdGl2ZSAqLworCWlmIChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCQlkYXRhLT5sZW5ndGggPSBzdHJsZW4obG9jYWwtPmVzc2lkKTsKKwkJbWVtY3B5KGVzc2lkLCBsb2NhbC0+ZXNzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKKwl9IGVsc2UgeworCQlpbnQgbGVuOworCQljaGFyIHNzaWRbTUFYX1NTSURfTEVOICsgMl07CisJCW1lbXNldChzc2lkLCAwLCBzaXplb2Yoc3NpZCkpOworCQlsZW4gPSBsb2NhbC0+ZnVuYy0+Z2V0X3JpZChkZXYsIEhGQTM4NFhfUklEX0NVUlJFTlRTU0lELAorCQkJCQkgICAmc3NpZCwgTUFYX1NTSURfTEVOICsgMiwgMCk7CisJCXZhbCA9IF9fbGUxNl90b19jcHUoKih1MTYgKikgc3NpZCk7CisJCWlmIChsZW4gPiBNQVhfU1NJRF9MRU4gKyAyIHx8IGxlbiA8IDAgfHwgdmFsID4gTUFYX1NTSURfTEVOKSB7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKwkJZGF0YS0+bGVuZ3RoID0gdmFsOworCQltZW1jcHkoZXNzaWQsIHNzaWQgKyAyLCBJV19FU1NJRF9NQVhfU0laRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwl1OCByYXRlc1sxMF07CisJdTE2IHZhbDsKKwlpbnQgaSwgbGVuLCBvdmVyMjsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCWRhdGEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOworCisJLyogVE9ETzogY291bGQgZmlsbCBudW1fdHhwb3dlciBhbmQgdHhwb3dlciBhcnJheSB3aXRoCisJICogc29tZXRoaW5nOyBob3dldmVyLCB0aGVyZSBhcmUgMTI4IGRpZmZlcmVudCB2YWx1ZXMuLiAqLworCisJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKKworCWlmIChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IGxvY2FsLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJeworCQlyYW5nZS0+bWluX3BtcCA9IDEgKiAxMDI0OworCQlyYW5nZS0+bWF4X3BtcCA9IDY1NTM1ICogMTAyNDsKKwkJcmFuZ2UtPm1pbl9wbXQgPSAxICogMTAyNDsKKwkJcmFuZ2UtPm1heF9wbXQgPSAxMDAwICogMTAyNDsKKwkJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwkJcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8CisJCQlJV19QT1dFUl9VTklDQVNUX1IgfCBJV19QT1dFUl9BTExfUjsKKwl9CisKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxODsKKworCXJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPm1pbl9yZXRyeSA9IDA7CisJcmFuZ2UtPm1heF9yZXRyeSA9IDI1NTsKKworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBGUkVRX0NPVU5UOworCisJdmFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgRlJFUV9DT1VOVDsgaSsrKSB7CisJCWlmIChsb2NhbC0+Y2hhbm5lbF9tYXNrICYgKDEgPDwgaSkpIHsKKwkJCXJhbmdlLT5mcmVxW3ZhbF0uaSA9IGkgKyAxOworCQkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gZnJlcV9saXN0W2ldICogMTAwMDAwOworCQkJcmFuZ2UtPmZyZXFbdmFsXS5lID0gMTsKKwkJCXZhbCsrOworCQl9CisJCWlmICh2YWwgPT0gSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQkJYnJlYWs7CisJfQorCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOworCisJaWYgKGxvY2FsLT5zdGFfZndfdmVyID49IFBSSVNNMl9GV19WRVIoMSwzLDEpKSB7CisJCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gNzA7IC8qIHdoYXQgaXMgY29ycmVjdCBtYXg/IFRoaXMgd2FzIG5vdAorCQkJCQkgICAgKiBkb2N1bWVudGVkIGV4YWN0bHkuIEF0IGxlYXN0CisJCQkJCSAgICAqIDY5IGhhcyBiZWVuIG9ic2VydmVkLiAqLworCQlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOyAvKiBkQiAqLworCQlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOyAvKiBkQiAqLworCisJCS8qIFdoYXQgd291bGQgYmUgc3VpdGFibGUgdmFsdWVzIGZvciAiYXZlcmFnZS90eXBpY2FsIiBxdWFsPyAqLworCQlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDIwOworCQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAtNjA7CisJCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IC05NTsKKwl9IGVsc2UgeworCQlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDkyOyAvKiAwIC4uIDkyICovCisJCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDE1NDsgLyogMjcgLi4gMTU0ICovCisJCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDE1NDsgLyogMjcgLi4gMTU0ICovCisJfQorCXJhbmdlLT5zZW5zaXRpdml0eSA9IDM7CisKKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IFdFUF9LRVlTOworCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOworCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOworCisJb3ZlcjIgPSAwOworCWxlbiA9IHByaXNtMl9nZXRfZGF0YXJhdGVzKGRldiwgcmF0ZXMpOworCXJhbmdlLT5udW1fYml0cmF0ZXMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAocmFuZ2UtPm51bV9iaXRyYXRlcyA8IElXX01BWF9CSVRSQVRFUykgeworCQkJcmFuZ2UtPmJpdHJhdGVbcmFuZ2UtPm51bV9iaXRyYXRlc10gPQorCQkJCXJhdGVzW2ldICogNTAwMDAwOworCQkJcmFuZ2UtPm51bV9iaXRyYXRlcysrOworCQl9CisJCWlmIChyYXRlc1tpXSA9PSAweDBiIHx8IHJhdGVzW2ldID09IDB4MTYpCisJCQlvdmVyMiA9IDE7CisJfQorCS8qIGVzdGltYXRlZCBtYXhpbXVtIFRDUCB0aHJvdWdocHV0IHZhbHVlcyAoYnBzKSAqLworCXJhbmdlLT50aHJvdWdocHV0ID0gb3ZlcjIgPyA1NTAwMDAwIDogMTUwMDAwMDsKKworCXJhbmdlLT5taW5fcnRzID0gMDsKKwlyYW5nZS0+bWF4X3J0cyA9IDIzNDc7CisJcmFuZ2UtPm1pbl9mcmFnID0gMjU2OworCXJhbmdlLT5tYXhfZnJhZyA9IDIzNDY7CisKKwkvKiBFdmVudCBjYXBhYmlsaXR5IChrZXJuZWwgKyBkcml2ZXIpICovCisJcmFuZ2UtPmV2ZW50X2NhcGFbMF0gPSAoSVdfRVZFTlRfQ0FQQV9LXzAgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXVEhSU1BZKSB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdBUCkgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXU0NBTikpOworCXJhbmdlLT5ldmVudF9jYXBhWzFdID0gSVdfRVZFTlRfQ0FQQV9LXzE7CisJcmFuZ2UtPmV2ZW50X2NhcGFbNF0gPSAoSVdfRVZFTlRfQ0FQQV9NQVNLKElXRVZUWERST1ApIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soSVdFVkNVU1RPTSkgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhJV0VWUkVHSVNURVJFRCkgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhJV0VWRVhQSVJFRCkpOworCisJcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfV1BBMiB8CisJCUlXX0VOQ19DQVBBX0NJUEhFUl9US0lQIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhvc3RhcF9tb25pdG9yX21vZGVfZW5hYmxlKGxvY2FsX2luZm9fdCAqbG9jYWwpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiRW5hYmxpbmcgbW9uaXRvciBtb2RlXG4iKTsKKwlob3N0YXBfbW9uaXRvcl9zZXRfdHlwZShsb2NhbCk7CisKKwlpZiAoaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GUE9SVFRZUEUsCisJCQkgICAgSEZBMzg0WF9QT1JUVFlQRV9QU0VVRE9fSUJTUykpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlBvcnQgdHlwZSBzZXR0aW5nIGZvciBtb25pdG9yIG1vZGUgIgorCQkgICAgICAgImZhaWxlZFxuIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBIb3N0IGRlY3J5cHQgaXMgbmVlZGVkIHRvIGdldCB0aGUgSVYgYW5kIElDViBmaWVsZHM7CisJICogaG93ZXZlciwgbW9uaXRvciBtb2RlIHNlZW1zIHRvIHJlbW92ZSBXRVAgZmxhZyBmcm9tIGZyYW1lCisJICogY29udHJvbCBmaWVsZCAqLworCWlmIChob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZXRVBGTEFHUywKKwkJCSAgICBIRkEzODRYX1dFUEZMQUdTX0hPU1RFTkNSWVBUIHwKKwkJCSAgICBIRkEzODRYX1dFUEZMQUdTX0hPU1RERUNSWVBUKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiV0VQIGZsYWdzIHNldHRpbmcgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWlmIChsb2NhbC0+ZnVuYy0+cmVzZXRfcG9ydChkZXYpIHx8CisJICAgIGxvY2FsLT5mdW5jLT5jbWQoZGV2LCBIRkEzODRYX0NNRENPREVfVEVTVCB8CisJCQkgICAgIChIRkEzODRYX1RFU1RfTU9OSVRPUiA8PCA4KSwKKwkJCSAgICAgMCwgTlVMTCwgTlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlNldHRpbmcgbW9uaXRvciBtb2RlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhvc3RhcF9tb25pdG9yX21vZGVfZGlzYWJsZShsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsb2NhbC0+ZGRldjsKKworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEaXNhYmxpbmcgbW9uaXRvciBtb2RlXG4iLCBkZXYtPm5hbWUpOworCWRldi0+dHlwZSA9IEFSUEhSRF9FVEhFUjsKKwlkZXYtPmhhcmRfaGVhZGVyX3BhcnNlID0gbG9jYWwtPnNhdmVkX2V0aF9oZWFkZXJfcGFyc2U7CisJaWYgKGxvY2FsLT5mdW5jLT5jbWQoZGV2LCBIRkEzODRYX0NNRENPREVfVEVTVCB8CisJCQkgICAgIChIRkEzODRYX1RFU1RfU1RPUCA8PCA4KSwKKwkJCSAgICAgMCwgTlVMTCwgTlVMTCkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gaG9zdGFwX3NldF9lbmNyeXB0aW9uKGxvY2FsKTsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9zaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQlfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJaW50IGRvdWJsZV9yZXNldCA9IDA7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAoKm1vZGUgIT0gSVdfTU9ERV9BREhPQyAmJiAqbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisJICAgICptb2RlICE9IElXX01PREVfTUFTVEVSICYmICptb2RlICE9IElXX01PREVfUkVQRUFUICYmCisJICAgICptb2RlICE9IElXX01PREVfTU9OSVRPUikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisjaWZkZWYgUFJJU00yX05PX1NUQVRJT05fTU9ERVMKKwlpZiAoKm1vZGUgPT0gSVdfTU9ERV9BREhPQyB8fCAqbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisjZW5kaWYgLyogUFJJU00yX05PX1NUQVRJT05fTU9ERVMgKi8KKworCWlmICgqbW9kZSA9PSBsb2NhbC0+aXdfbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKm1vZGUgPT0gSVdfTU9ERV9NQVNURVIgJiYgbG9jYWwtPmVzc2lkWzBdID09ICdcMCcpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGVtcHR5IFNTSUQgbm90IGFsbG93ZWQgaW4gTWFzdGVyICIKKwkJICAgICAgICJtb2RlXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobG9jYWwtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlob3N0YXBfbW9uaXRvcl9tb2RlX2Rpc2FibGUobG9jYWwpOworCisJaWYgKChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DIHx8CisJICAgICBsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpICYmICptb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCS8qIFRoZXJlIHNlZW1zIHRvIGJlIGEgZmlybXdhcmUgYnVnIGluIGF0IGxlYXN0IFNUQSBmL3cgdjEuNS42CisJCSAqIHRoYXQgbGVhdmVzIGJlYWNvbiBmcmFtZXMgdG8gdXNlIElCU1MgdHlwZSB3aGVuIG1vdmluZyBmcm9tCisJCSAqIElCU1MgdG8gSG9zdCBBUCBtb2RlLiBEb2luZyBkb3VibGUgUG9ydDAgcmVzZXQgc2VlbXMgdG8gYmUKKwkJICogZW5vdWdoIHRvIHdvcmthcm91bmQgdGhpcy4gKi8KKwkJZG91YmxlX3Jlc2V0ID0gMTsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAicHJpc20yOiAlczogb3BlcmF0aW5nIG1vZGUgY2hhbmdlZCAiCisJICAgICAgICIlZCAtPiAlZFxuIiwgZGV2LT5uYW1lLCBsb2NhbC0+aXdfbW9kZSwgKm1vZGUpOworCWxvY2FsLT5pd19tb2RlID0gKm1vZGU7CisKKwlpZiAobG9jYWwtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlob3N0YXBfbW9uaXRvcl9tb2RlX2VuYWJsZShsb2NhbCk7CisJZWxzZSBpZiAobG9jYWwtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgJiYgIWxvY2FsLT5ob3N0X2VuY3J5cHQgJiYKKwkJICFsb2NhbC0+ZndfZW5jcnlwdF9vaykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRlZmF1bHRpbmcgdG8gaG9zdC1iYXNlZCBlbmNyeXB0aW9uIGFzICIKKwkJICAgICAgICJhIHdvcmthcm91bmQgZm9yIGZpcm13YXJlIGJ1ZyBpbiBIb3N0IEFQIG1vZGUgV0VQXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJbG9jYWwtPmhvc3RfZW5jcnlwdCA9IDE7CisJfQorCisJaWYgKGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX0NORlBPUlRUWVBFLAorCQkJICAgIGhvc3RhcF9nZXRfcG9ydHR5cGUobG9jYWwpKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGxvY2FsLT5mdW5jLT5yZXNldF9wb3J0KGRldikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkb3VibGVfcmVzZXQgJiYgbG9jYWwtPmZ1bmMtPnJlc2V0X3BvcnQoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobG9jYWwtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJiBsb2NhbC0+aXdfbW9kZSAhPSBJV19NT0RFX0FESE9DKQorCXsKKwkJLyogbmV0aWZfY2FycmllciBpcyB1c2VkIG9ubHkgaW4gY2xpZW50IG1vZGVzIGZvciBub3csIHNvIG1ha2UKKwkJICogc3VyZSBjYXJyaWVyIGlzIG9uIHdoZW4gbW92aW5nIHRvIG5vbi1jbGllbnQgbW9kZXMuICovCisJCW5ldGlmX2NhcnJpZXJfb24obG9jYWwtPmRldik7CisJCW5ldGlmX2NhcnJpZXJfb24obG9jYWwtPmRkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQlfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlzd2l0Y2ggKGlmYWNlLT50eXBlKSB7CisJY2FzZSBIT1NUQVBfSU5URVJGQUNFX1NUQToKKwkJKm1vZGUgPSBJV19NT0RFX0lORlJBOworCQlicmVhazsKKwljYXNlIEhPU1RBUF9JTlRFUkZBQ0VfV0RTOgorCQkqbW9kZSA9IElXX01PREVfUkVQRUFUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqbW9kZSA9IGxvY2FsLT5pd19tb2RlOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfc2l3cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGl3X3BhcmFtICp3cnEsIGNoYXIgKmV4dHJhKQoreworI2lmZGVmIFBSSVNNMl9OT19TVEFUSU9OX01PREVTCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2Vsc2UgLyogUFJJU00yX05PX1NUQVRJT05fTU9ERVMgKi8KKwlpbnQgcmV0ID0gMDsKKworCWlmICh3cnEtPmRpc2FibGVkKQorCQlyZXR1cm4gaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GUE1FTkFCTEVELCAwKTsKKworCXN3aXRjaCAod3JxLT5mbGFncyAmIElXX1BPV0VSX01PREUpIHsKKwljYXNlIElXX1BPV0VSX1VOSUNBU1RfUjoKKwkJcmV0ID0gaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GTVVMVElDQVNUUkVDRUlWRSwgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZQTUVOQUJMRUQsIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CisJY2FzZSBJV19QT1dFUl9BTExfUjoKKwkJcmV0ID0gaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GTVVMVElDQVNUUkVDRUlWRSwgMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZQTUVOQUJMRUQsIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CisJY2FzZSBJV19QT1dFUl9PTjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHdycS0+ZmxhZ3MgJiBJV19QT1dFUl9USU1FT1VUKSB7CisJCXJldCA9IGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX0NORlBNRU5BQkxFRCwgMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZQTUhPTERPVkVSRFVSQVRJT04sCisJCQkJICAgICAgd3JxLT52YWx1ZSAvIDEwMjQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHdycS0+ZmxhZ3MgJiBJV19QT1dFUl9QRVJJT0QpIHsKKwkJcmV0ID0gaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GUE1FTkFCTEVELCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX0NORk1BWFNMRUVQRFVSQVRJT04sCisJCQkJICAgICAgd3JxLT52YWx1ZSAvIDEwMjQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworI2VuZGlmIC8qIFBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfZ2l3cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQoreworI2lmZGVmIFBSSVNNMl9OT19TVEFUSU9OX01PREVTCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2Vsc2UgLyogUFJJU00yX05PX1NUQVRJT05fTU9ERVMgKi8KKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1MTYgZW5hYmxlLCBtY2FzdDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCWlmIChsb2NhbC0+ZnVuYy0+Z2V0X3JpZChkZXYsIEhGQTM4NFhfUklEX0NORlBNRU5BQkxFRCwgJmVuYWJsZSwgMiwgMSkKKwkgICAgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghX19sZTE2X3RvX2NwdShlbmFibGUpKSB7CisJCXJycS0+ZGlzYWJsZWQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlycnEtPmRpc2FibGVkID0gMDsKKworCWlmICgocnJxLT5mbGFncyAmIElXX1BPV0VSX1RZUEUpID09IElXX1BPV0VSX1RJTUVPVVQpIHsKKwkJdTE2IHRpbWVvdXQ7CisJCWlmIChsb2NhbC0+ZnVuYy0+Z2V0X3JpZChkZXYsCisJCQkJCSBIRkEzODRYX1JJRF9DTkZQTUhPTERPVkVSRFVSQVRJT04sCisJCQkJCSAmdGltZW91dCwgMiwgMSkgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcnJxLT5mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJCXJycS0+dmFsdWUgPSBfX2xlMTZfdG9fY3B1KHRpbWVvdXQpICogMTAyNDsKKwl9IGVsc2UgeworCQl1MTYgcGVyaW9kOworCQlpZiAobG9jYWwtPmZ1bmMtPmdldF9yaWQoZGV2LCBIRkEzODRYX1JJRF9DTkZNQVhTTEVFUERVUkFUSU9OLAorCQkJCQkgJnBlcmlvZCwgMiwgMSkgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcnJxLT5mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwkJcnJxLT52YWx1ZSA9IF9fbGUxNl90b19jcHUocGVyaW9kKSAqIDEwMjQ7CisJfQorCisJaWYgKGxvY2FsLT5mdW5jLT5nZXRfcmlkKGRldiwgSEZBMzg0WF9SSURfQ05GTVVMVElDQVNUUkVDRUlWRSwgJm1jYXN0LAorCQkJCSAyLCAxKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKF9fbGUxNl90b19jcHUobWNhc3QpKQorCQlycnEtPmZsYWdzIHw9IElXX1BPV0VSX0FMTF9SOworCWVsc2UKKwkJcnJxLT5mbGFncyB8PSBJV19QT1dFUl9VTklDQVNUX1I7CisKKwlyZXR1cm4gMDsKKyNlbmRpZiAvKiBQUklTTTJfTk9fU1RBVElPTl9NT0RFUyAqLworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2lvY3RsX3Npd3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCWlmIChycnEtPmRpc2FibGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHNldHRpbmcgcmV0cnkgbGltaXRzIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGUgY3VycmVudCBzdGF0aW9uCisJICogZmlybXdhcmUgY29kZTsgc2ltdWxhdGUgdGhpcyB3aXRoIGFsdGVybmF0aXZlIHJldHJ5IGNvdW50IGZvciBub3cgKi8KKwlpZiAocnJxLT5mbGFncyA9PSBJV19SRVRSWV9MSU1JVCkgeworCQlpZiAocnJxLT52YWx1ZSA8IDApIHsKKwkJCS8qIGRpc2FibGUgbWFudWFsIHJldHJ5IGNvdW50IHNldHRpbmcgYW5kIHVzZSBmaXJtd2FyZQorCQkJICogZGVmYXVsdHMgKi8KKwkJCWxvY2FsLT5tYW51YWxfcmV0cnlfY291bnQgPSAtMTsKKwkJCWxvY2FsLT50eF9jb250cm9sICY9IH5IRkEzODRYX1RYX0NUUkxfQUxUX1JUUlk7CisJCX0gZWxzZSB7CisJCQlpZiAoaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GQUxUUkVUUllDT1VOVCwKKwkJCQkJICAgIHJycS0+dmFsdWUpKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBbHRlcm5hdGUgcmV0cnkgY291bnQgIgorCQkJCSAgICAgICAic2V0dGluZyB0byAlZCBmYWlsZWRcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgcnJxLT52YWx1ZSk7CisJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJfQorCisJCQlsb2NhbC0+bWFudWFsX3JldHJ5X2NvdW50ID0gcnJxLT52YWx1ZTsKKwkJCWxvY2FsLT50eF9jb250cm9sIHw9IEhGQTM4NFhfVFhfQ1RSTF9BTFRfUlRSWTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKyNpZiAwCisJLyogd2hhdCBjb3VsZCBiZSBkb25lLCBpZiBmaXJtd2FyZSB3b3VsZCBzdXBwb3J0IHRoaXMuLiAqLworCisJaWYgKHJycS0+ZmxhZ3MgJiBJV19SRVRSWV9MSU1JVCkgeworCQlpZiAocnJxLT5mbGFncyAmIElXX1JFVFJZX01BWCkKKwkJCUhGQTM4NFhfUklEX0xPTkdSRVRSWUxJTUlUID0gcnJxLT52YWx1ZTsKKwkJZWxzZSBpZiAocnJxLT5mbGFncyAmIElXX1JFVFJZX01JTikKKwkJCUhGQTM4NFhfUklEX1NIT1JUUkVUUllMSU1JVCA9IHJycS0+dmFsdWU7CisJCWVsc2UgeworCQkJSEZBMzg0WF9SSURfTE9OR1JFVFJZTElNSVQgPSBycnEtPnZhbHVlOworCQkJSEZBMzg0WF9SSURfU0hPUlRSRVRSWUxJTUlUID0gcnJxLT52YWx1ZTsKKwkJfQorCisJfQorCisJaWYgKHJycS0+ZmxhZ3MgJiBJV19SRVRSWV9MSUZFVElNRSkgeworCQlIRkEzODRYX1JJRF9NQVhUUkFOU01JVExJRkVUSU1FID0gcnJxLT52YWx1ZSAvIDEwMjQ7CisJfQorCisJcmV0dXJuIDA7CisjZW5kaWYgLyogMCAqLworfQorCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9naXdyZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJdTE2IHNob3J0cmV0cnksIGxvbmdyZXRyeSwgbGlmZXRpbWUsIGFsdHJldHJ5OworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKGxvY2FsLT5mdW5jLT5nZXRfcmlkKGRldiwgSEZBMzg0WF9SSURfU0hPUlRSRVRSWUxJTUlULCAmc2hvcnRyZXRyeSwKKwkJCQkgMiwgMSkgPCAwIHx8CisJICAgIGxvY2FsLT5mdW5jLT5nZXRfcmlkKGRldiwgSEZBMzg0WF9SSURfTE9OR1JFVFJZTElNSVQsICZsb25ncmV0cnksCisJCQkJIDIsIDEpIDwgMCB8fAorCSAgICBsb2NhbC0+ZnVuYy0+Z2V0X3JpZChkZXYsIEhGQTM4NFhfUklEX01BWFRSQU5TTUlUTElGRVRJTUUsCisJCQkJICZsaWZldGltZSwgMiwgMSkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxlMTZfdG9fY3B1cygmc2hvcnRyZXRyeSk7CisJbGUxNl90b19jcHVzKCZsb25ncmV0cnkpOworCWxlMTZfdG9fY3B1cygmbGlmZXRpbWUpOworCisJcnJxLT5kaXNhYmxlZCA9IDA7CisKKwlpZiAoKHJycS0+ZmxhZ3MgJiBJV19SRVRSWV9UWVBFKSA9PSBJV19SRVRSWV9MSUZFVElNRSkgeworCQlycnEtPmZsYWdzID0gSVdfUkVUUllfTElGRVRJTUU7CisJCXJycS0+dmFsdWUgPSBsaWZldGltZSAqIDEwMjQ7CisJfSBlbHNlIHsKKwkJaWYgKGxvY2FsLT5tYW51YWxfcmV0cnlfY291bnQgPj0gMCkgeworCQkJcnJxLT5mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCQkJaWYgKGxvY2FsLT5mdW5jLT5nZXRfcmlkKGRldiwKKwkJCQkJCSBIRkEzODRYX1JJRF9DTkZBTFRSRVRSWUNPVU5ULAorCQkJCQkJICZhbHRyZXRyeSwgMiwgMSkgPj0gMCkKKwkJCQlycnEtPnZhbHVlID0gbGUxNl90b19jcHUoYWx0cmV0cnkpOworCQkJZWxzZQorCQkJCXJycS0+dmFsdWUgPSBsb2NhbC0+bWFudWFsX3JldHJ5X2NvdW50OworCQl9IGVsc2UgaWYgKChycnEtPmZsYWdzICYgSVdfUkVUUllfTUFYKSkgeworCQkJcnJxLT5mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTUFYOworCQkJcnJxLT52YWx1ZSA9IGxvbmdyZXRyeTsKKwkJfSBlbHNlIHsKKwkJCXJycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwkJCXJycS0+dmFsdWUgPSBzaG9ydHJldHJ5OworCQkJaWYgKHNob3J0cmV0cnkgIT0gbG9uZ3JldHJ5KQorCQkJCXJycS0+ZmxhZ3MgfD0gSVdfUkVUUllfTUlOOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKKy8qIE5vdGUhIFRoaXMgVFggcG93ZXIgY29udHJvbGxpbmcgaXMgZXhwZXJpbWVudGFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaW4KKyAqIHByb2R1Y3Rpb24gdXNlLiBJdCBqdXN0IHNldHMgcmF3IHBvd2VyIHJlZ2lzdGVyIGFuZCBkb2VzIG5vdCB1c2UgYW55IGtpbmQgb2YKKyAqIGZlZWRiYWNrIGluZm9ybWF0aW9uIGZyb20gdGhlIG1lYXN1cmVkIFRYIHBvd2VyIChDUjU4KS4gVGhpcyBpcyBub3cKKyAqIGNvbW1lbnRlZCBvdXQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgbm90IHVzZWQgYnkgYWNjaWRlbnQuIFRYIHBvd2VyCisgKiBjb25maWd1cmF0aW9uIHdpbGwgYmUgZW5hYmxlZCBhZ2FpbiBhZnRlciBwcm9wZXIgYWxnb3JpdGhtIHVzaW5nIGZlZWRiYWNrCisgKiBoYXMgYmVlbiBpbXBsZW1lbnRlZC4gKi8KKworI2lmZGVmIFJBV19UWFBPV0VSX1NFVFRJTkcKKy8qIE1hcCBIRkEzODZ4J3MgQ1IzMSB0byBhbmQgZnJvbSBkQm0gd2l0aCBzb21lIHNvcnQgb2YgYWQgaG9jIG1hcHBpbmcuLgorICogVGhpcyB2ZXJzaW9uIGFzc3VtZXMgZm9sbG93aW5nIG1hcHBpbmc6CisgKiBDUjMxIGlzIDctYml0IHZhbHVlIHdpdGggLTY0IHRvICs2MyByYW5nZS4KKyAqIC02NCBpcyBtYXBwZWQgaW50byArMjBkQm0gYW5kICs2MyBpbnRvIC00M2RCbS4KKyAqIFRoaXMgaXMgY2VydGFpbmx5IG5vdCBhbiBleGFjdCBtYXBwaW5nIGZvciBldmVyeSBjYXJkLCBidXQgYXQgbGVhc3QKKyAqIGluY3JlYXNpbmcgZEJtIHZhbHVlIHNob3VsZCBjb3JyZXNwb25kIHRvIGluY3JlYXNpbmcgVFggcG93ZXIuCisgKi8KKworc3RhdGljIGludCBwcmlzbTJfdHhwb3dlcl9oZmEzODZ4X3RvX2RCbSh1MTYgdmFsKQoreworCXNpZ25lZCBjaGFyIHRtcDsKKworCWlmICh2YWwgPiAyNTUpCisJCXZhbCA9IDI1NTsKKworCXRtcCA9IHZhbDsKKwl0bXAgPj49IDI7CisKKwlyZXR1cm4gLTEyIC0gdG1wOworfQorCitzdGF0aWMgdTE2IHByaXNtMl90eHBvd2VyX2RCbV90b19oZmEzODZ4KGludCB2YWwpCit7CisJc2lnbmVkIGNoYXIgdG1wOworCisJaWYgKHZhbCA+IDIwKQorCQlyZXR1cm4gMTI4OworCWVsc2UgaWYgKHZhbCA8IC00MykKKwkJcmV0dXJuIDEyNzsKKworCXRtcCA9IHZhbDsKKwl0bXAgPSAtMTIgLSB0bXA7CisJdG1wIDw8PSAyOworCisJcmV0dXJuICh1bnNpZ25lZCBjaGFyKSB0bXA7Cit9CisjZW5kaWYgLyogUkFXX1RYUE9XRVJfU0VUVElORyAqLworCisKK3N0YXRpYyBpbnQgcHJpc20yX2lvY3RsX3Npd3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKyNpZmRlZiBSQVdfVFhQT1dFUl9TRVRUSU5HCisJY2hhciAqdG1wOworI2VuZGlmCisJdTE2IHZhbDsKKwlpbnQgcmV0ID0gMDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCWlmIChycnEtPmRpc2FibGVkKSB7CisJCWlmIChsb2NhbC0+dHhwb3dlcl90eXBlICE9IFBSSVNNMl9UWFBPV0VSX09GRikgeworCQkJdmFsID0gMHhmZjsgLyogdXNlIGFsbCBzdGFuZGJ5IGFuZCBzbGVlcCBtb2RlcyAqLworCQkJcmV0ID0gbG9jYWwtPmZ1bmMtPmNtZChkZXYsIEhGQTM4NFhfQ01EQ09ERV9XUklURU1JRiwKKwkJCQkJICAgICAgIEhGQTM4NlhfQ1JfQV9EX1RFU1RfTU9ERVMyLAorCQkJCQkgICAgICAgJnZhbCwgTlVMTCk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR1cm5pbmcgcmFkaW8gb2ZmOiAlc1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHJldCA/ICJmYWlsZWQiIDogIk9LIik7CisJCQlsb2NhbC0+dHhwb3dlcl90eXBlID0gUFJJU00yX1RYUE9XRVJfT0ZGOworCQl9CisJCXJldHVybiAocmV0ID8gLUVPUE5PVFNVUFAgOiAwKTsKKwl9CisKKwlpZiAobG9jYWwtPnR4cG93ZXJfdHlwZSA9PSBQUklTTTJfVFhQT1dFUl9PRkYpIHsKKwkJdmFsID0gMDsgLyogZGlzYWJsZSBhbGwgc3RhbmRieSBhbmQgc2xlZXAgbW9kZXMgKi8KKwkJcmV0ID0gbG9jYWwtPmZ1bmMtPmNtZChkZXYsIEhGQTM4NFhfQ01EQ09ERV9XUklURU1JRiwKKwkJCQkgICAgICAgSEZBMzg2WF9DUl9BX0RfVEVTVF9NT0RFUzIsICZ2YWwsIE5VTEwpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR1cm5pbmcgcmFkaW8gb246ICVzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCByZXQgPyAiZmFpbGVkIiA6ICJPSyIpOworCQlsb2NhbC0+dHhwb3dlcl90eXBlID0gUFJJU00yX1RYUE9XRVJfVU5LTk9XTjsKKwl9CisKKyNpZmRlZiBSQVdfVFhQT1dFUl9TRVRUSU5HCisJaWYgKCFycnEtPmZpeGVkICYmIGxvY2FsLT50eHBvd2VyX3R5cGUgIT0gUFJJU00yX1RYUE9XRVJfQVVUTykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiU2V0dGluZyBBTEMgb25cbiIpOworCQl2YWwgPSBIRkEzODRYX1RFU1RfQ0ZHX0JJVF9BTEM7CisJCWxvY2FsLT5mdW5jLT5jbWQoZGV2LCBIRkEzODRYX0NNRENPREVfVEVTVCB8CisJCQkJIChIRkEzODRYX1RFU1RfQ0ZHX0JJVFMgPDwgOCksIDEsICZ2YWwsIE5VTEwpOworCQlsb2NhbC0+dHhwb3dlcl90eXBlID0gUFJJU00yX1RYUE9XRVJfQVVUTzsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxvY2FsLT50eHBvd2VyX3R5cGUgIT0gUFJJU00yX1RYUE9XRVJfRklYRUQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlNldHRpbmcgQUxDIG9mZlxuIik7CisJCXZhbCA9IEhGQTM4NFhfVEVTVF9DRkdfQklUX0FMQzsKKwkJbG9jYWwtPmZ1bmMtPmNtZChkZXYsIEhGQTM4NFhfQ01EQ09ERV9URVNUIHwKKwkJCQkgKEhGQTM4NFhfVEVTVF9DRkdfQklUUyA8PCA4KSwgMCwgJnZhbCwgTlVMTCk7CisJCQlsb2NhbC0+dHhwb3dlcl90eXBlID0gUFJJU00yX1RYUE9XRVJfRklYRUQ7CisJfQorCisJaWYgKHJycS0+ZmxhZ3MgPT0gSVdfVFhQT1dfREJNKQorCQl0bXAgPSAiZEJtIjsKKwllbHNlIGlmIChycnEtPmZsYWdzID09IElXX1RYUE9XX01XQVRUKQorCQl0bXAgPSAibVciOworCWVsc2UKKwkJdG1wID0gIlVOS05PV04iOworCXByaW50ayhLRVJOX0RFQlVHICJTZXR0aW5nIFRYIHBvd2VyIHRvICVkICVzXG4iLCBycnEtPnZhbHVlLCB0bXApOworCisJaWYgKHJycS0+ZmxhZ3MgIT0gSVdfVFhQT1dfREJNKSB7CisJCXByaW50aygiU0lPQ1NJV1RYUE9XIHdpdGggbVcgaXMgbm90IHN1cHBvcnRlZDsgdXNlIGRCbVxuIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlsb2NhbC0+dHhwb3dlciA9IHJycS0+dmFsdWU7CisJdmFsID0gcHJpc20yX3R4cG93ZXJfZEJtX3RvX2hmYTM4NngobG9jYWwtPnR4cG93ZXIpOworCWlmIChsb2NhbC0+ZnVuYy0+Y21kKGRldiwgSEZBMzg0WF9DTURDT0RFX1dSSVRFTUlGLAorCQkJICAgICBIRkEzODZYX0NSX01BTlVBTF9UWF9QT1dFUiwgJnZhbCwgTlVMTCkpCisJCXJldCA9IC1FT1BOT1RTVVBQOworI2Vsc2UgLyogUkFXX1RYUE9XRVJfU0VUVElORyAqLworCWlmIChycnEtPmZpeGVkKQorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKyNlbmRpZiAvKiBSQVdfVFhQT1dFUl9TRVRUSU5HICovCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9naXd0eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCit7CisjaWZkZWYgUkFXX1RYUE9XRVJfU0VUVElORworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXUxNiByZXNwMDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCXJycS0+ZmxhZ3MgPSBJV19UWFBPV19EQk07CisJcnJxLT5kaXNhYmxlZCA9IDA7CisJcnJxLT5maXhlZCA9IDA7CisKKwlpZiAobG9jYWwtPnR4cG93ZXJfdHlwZSA9PSBQUklTTTJfVFhQT1dFUl9BVVRPKSB7CisJCWlmIChsb2NhbC0+ZnVuYy0+Y21kKGRldiwgSEZBMzg0WF9DTURDT0RFX1JFQURNSUYsCisJCQkJICAgICBIRkEzODZYX0NSX01BTlVBTF9UWF9QT1dFUiwKKwkJCQkgICAgIE5VTEwsICZyZXNwMCkgPT0gMCkgeworCQkJcnJxLT52YWx1ZSA9IHByaXNtMl90eHBvd2VyX2hmYTM4NnhfdG9fZEJtKHJlc3AwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIENvdWxkIG5vdCBnZXQgcmVhbCB0eHBvd2VyOyBndWVzcyAxNSBkQm0gKi8KKwkJCXJycS0+dmFsdWUgPSAxNTsKKwkJfQorCX0gZWxzZSBpZiAobG9jYWwtPnR4cG93ZXJfdHlwZSA9PSBQUklTTTJfVFhQT1dFUl9PRkYpIHsKKwkJcnJxLT52YWx1ZSA9IDA7CisJCXJycS0+ZGlzYWJsZWQgPSAxOworCX0gZWxzZSBpZiAobG9jYWwtPnR4cG93ZXJfdHlwZSA9PSBQUklTTTJfVFhQT1dFUl9GSVhFRCkgeworCQlycnEtPnZhbHVlID0gbG9jYWwtPnR4cG93ZXI7CisJCXJycS0+Zml4ZWQgPSAxOworCX0gZWxzZSB7CisJCXByaW50aygiU0lPQ0dJV1RYUE9XIC0gdW5rbm93biB0eHBvd2VyX3R5cGU9JWRcbiIsCisJCSAgICAgICBsb2NhbC0+dHhwb3dlcl90eXBlKTsKKwl9CisJcmV0dXJuIDA7CisjZWxzZSAvKiBSQVdfVFhQT1dFUl9TRVRUSU5HICovCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmIC8qIFJBV19UWFBPV0VSX1NFVFRJTkcgKi8KK30KKworCisjaWZuZGVmIFBSSVNNMl9OT19TVEFUSU9OX01PREVTCisKKy8qIEhvc3RTY2FuIHJlcXVlc3Qgd29ya3Mgd2l0aCBhbmQgd2l0aG91dCBob3N0X3JvYW1pbmcgbW9kZS4gSW4gYWRkaXRpb24sIGl0CisgKiBkb2VzIG5vdCBicmVhayBjdXJyZW50IGFzc29jaWF0aW9uLiBIb3dldmVyLCBpdCByZXF1aXJlcyBuZXdlciBzdGF0aW9uCisgKiBmaXJtd2FyZSB2ZXJzaW9uICg+PSAxLjMuMSkgdGhhbiBzY2FuIHJlcXVlc3QuICovCitzdGF0aWMgaW50IHByaXNtMl9yZXF1ZXN0X2hvc3RzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgdTggKnNzaWQsIHU4IHNzaWRfbGVuKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXN0cnVjdCBoZmEzODR4X2hvc3RzY2FuX3JlcXVlc3Qgc2Nhbl9yZXE7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwltZW1zZXQoJnNjYW5fcmVxLCAwLCBzaXplb2Yoc2Nhbl9yZXEpKTsKKwlzY2FuX3JlcS5jaGFubmVsX2xpc3QgPSBjcHVfdG9fbGUxNihsb2NhbC0+Y2hhbm5lbF9tYXNrICYKKwkJCQkJICAgIGxvY2FsLT5zY2FuX2NoYW5uZWxfbWFzayk7CisJc2Nhbl9yZXEudHhyYXRlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihIRkEzODRYX1JBVEVTXzFNQlBTKTsKKwlpZiAoc3NpZCkgeworCQlpZiAoc3NpZF9sZW4gPiAzMikKKwkJCXJldHVybiAtRUlOVkFMOworCQlzY2FuX3JlcS50YXJnZXRfc3NpZF9sZW4gPSBjcHVfdG9fbGUxNihzc2lkX2xlbik7CisJCW1lbWNweShzY2FuX3JlcS50YXJnZXRfc3NpZCwgc3NpZCwgc3NpZF9sZW4pOworCX0KKworCWlmIChsb2NhbC0+ZnVuYy0+c2V0X3JpZChkZXYsIEhGQTM4NFhfUklEX0hPU1RTQ0FOLCAmc2Nhbl9yZXEsCisJCQkJIHNpemVvZihzY2FuX3JlcSkpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogSE9TVFNDQU4gZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfcmVxdWVzdF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJc3RydWN0IGhmYTM4NHhfc2Nhbl9yZXF1ZXN0IHNjYW5fcmVxOworCWludCByZXQgPSAwOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJbWVtc2V0KCZzY2FuX3JlcSwgMCwgc2l6ZW9mKHNjYW5fcmVxKSk7CisJc2Nhbl9yZXEuY2hhbm5lbF9saXN0ID0gY3B1X3RvX2xlMTYobG9jYWwtPmNoYW5uZWxfbWFzayAmCisJCQkJCSAgICBsb2NhbC0+c2Nhbl9jaGFubmVsX21hc2spOworCXNjYW5fcmVxLnR4cmF0ZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoSEZBMzg0WF9SQVRFU18xTUJQUyk7CisKKwkvKiBGSVg6CisJICogSXQgc2VlbXMgdG8gYmUgZW5vdWdoIHRvIHNldCByb2FtaW5nIG1vZGUgZm9yIGEgc2hvcnQgbW9tZW50IHRvCisJICogaG9zdC1iYXNlZCBhbmQgdGhlbiBzZXR1cCBzY2FucmVxdWVzdCBkYXRhIGFuZCByZXR1cm4gdGhlIG1vZGUgdG8KKwkgKiBmaXJtd2FyZS1iYXNlZC4KKwkgKgorCSAqIE1hc3RlciBtb2RlIHdvdWxkIG5lZWQgdG8gZHJvcCB0byBNYW5hZ2VkIG1vZGUgZm9yIGEgc2hvcnQgd2hpbGUKKwkgKiB0byBtYWtlIHNjYW5uaW5nIHdvcmsuLiBPciBzd2VlcCB0aHJvdWdoIHRoZSBkaWZmZXJlbnQgY2hhbm5lbHMgYW5kCisJICogdXNlIHBhc3NpdmUgc2NhbiBiYXNlZCBvbiBiZWFjb25zLiAqLworCisJaWYgKCFsb2NhbC0+aG9zdF9yb2FtaW5nKQorCQlob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZST0FNSU5HTU9ERSwKKwkJCQlIRkEzODRYX1JPQU1JTkdfSE9TVCk7CisKKwlpZiAobG9jYWwtPmZ1bmMtPnNldF9yaWQoZGV2LCBIRkEzODRYX1JJRF9TQ0FOUkVRVUVTVCwgJnNjYW5fcmVxLAorCQkJCSBzaXplb2Yoc2Nhbl9yZXEpKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiU0NBTlJFUVVFU1QgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWxvY2FsLT5ob3N0X3JvYW1pbmcpCisJCWhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX0NORlJPQU1JTkdNT0RFLAorCQkJCUhGQTM4NFhfUk9BTUlOR19GSVJNV0FSRSk7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UgLyogIVBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHByaXNtMl9yZXF1ZXN0X2hvc3RzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgdTggKnNzaWQsIHU4IHNzaWRfbGVuKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBwcmlzbTJfcmVxdWVzdF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisjZW5kaWYgLyogIVBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfc2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgcmV0OworCXU4ICpzc2lkID0gTlVMTCwgc3NpZF9sZW4gPSAwOworCXN0cnVjdCBpd19zY2FuX3JlcSAqcmVxID0gKHN0cnVjdCBpd19zY2FuX3JlcSAqKSBleHRyYTsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCWlmIChkYXRhLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGl3X3NjYW5fcmVxKSkKKwkJcmVxID0gTlVMTDsKKworCWlmIChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCQkvKiBJbiBtYXN0ZXIgbW9kZSwgd2UganVzdCByZXR1cm4gdGhlIHJlc3VsdHMgb2Ygb3VyIGxvY2FsCisJCSAqIHRhYmxlcywgc28gd2UgZG9uJ3QgbmVlZCB0byBzdGFydCBhbnl0aGluZy4uLgorCQkgKiBKZWFuIElJICovCisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmICghbG9jYWwtPmRldl9lbmFibGVkKQorCQlyZXR1cm4gLUVORVRET1dOOworCisJaWYgKHJlcSAmJiBkYXRhLT5mbGFncyAmIElXX1NDQU5fVEhJU19FU1NJRCkgeworCQlzc2lkID0gcmVxLT5lc3NpZDsKKwkJc3NpZF9sZW4gPSByZXEtPmVzc2lkX2xlbjsKKworCQlpZiAoc3NpZF9sZW4gJiYKKwkJICAgICgobG9jYWwtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgorCQkgICAgICBsb2NhbC0+aXdfbW9kZSAhPSBJV19NT0RFX0FESE9DKSB8fAorCQkgICAgIChsb2NhbC0+c3RhX2Z3X3ZlciA8IFBSSVNNMl9GV19WRVIoMSwzLDEpKSkpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJaWYgKGxvY2FsLT5zdGFfZndfdmVyID49IFBSSVNNMl9GV19WRVIoMSwzLDEpKQorCQlyZXQgPSBwcmlzbTJfcmVxdWVzdF9ob3N0c2NhbihkZXYsIHNzaWQsIHNzaWRfbGVuKTsKKwllbHNlCisJCXJldCA9IHByaXNtMl9yZXF1ZXN0X3NjYW4oZGV2KTsKKworCWlmIChyZXQgPT0gMCkKKwkJbG9jYWwtPnNjYW5fdGltZXN0YW1wID0gamlmZmllczsKKworCS8qIENvdWxkIGlucXVpcmUgRjEwMSwgRjEwMyBvciB3YWl0IGZvciBTSU9DR0lXU0NBTiBhbmQgcmVhZCBSSUQgKi8KKworCXJldHVybiByZXQ7Cit9CisKKworI2lmbmRlZiBQUklTTTJfTk9fU1RBVElPTl9NT0RFUworc3RhdGljIGNoYXIgKiBfX3ByaXNtMl90cmFuc2xhdGVfc2Nhbihsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJCSAgICAgIHN0cnVjdCBoZmEzODR4X2hvc3RzY2FuX3Jlc3VsdCAqc2NhbiwKKwkJCQkgICAgICBzdHJ1Y3QgaG9zdGFwX2Jzc19pbmZvICpic3MsCisJCQkJICAgICAgY2hhciAqY3VycmVudF9ldiwgY2hhciAqZW5kX2J1ZikKK3sKKwlpbnQgaSwgY2hhbjsKKwlzdHJ1Y3QgaXdfZXZlbnQgaXdlOworCWNoYXIgKmN1cnJlbnRfdmFsOworCXUxNiBjYXBhYmlsaXRpZXM7CisJdTggKnBvczsKKwl1OCAqc3NpZCwgKmJzc2lkOworCXNpemVfdCBzc2lkX2xlbjsKKwljaGFyICpidWY7CisKKwlpZiAoYnNzKSB7CisJCXNzaWQgPSBic3MtPnNzaWQ7CisJCXNzaWRfbGVuID0gYnNzLT5zc2lkX2xlbjsKKwkJYnNzaWQgPSBic3MtPmJzc2lkOworCX0gZWxzZSB7CisJCXNzaWQgPSBzY2FuLT5zc2lkOworCQlzc2lkX2xlbiA9IGxlMTZfdG9fY3B1KHNjYW4tPnNzaWRfbGVuKTsKKwkJYnNzaWQgPSBzY2FuLT5ic3NpZDsKKwl9CisJaWYgKHNzaWRfbGVuID4gMzIpCisJCXNzaWRfbGVuID0gMzI7CisKKwkvKiBGaXJzdCBlbnRyeSAqTVVTVCogYmUgdGhlIEFQIE1BQyBhZGRyZXNzICovCisJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwlpd2UuY21kID0gU0lPQ0dJV0FQOworCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIGJzc2lkLCBFVEhfQUxFTik7CisJLyogRklYOgorCSAqIEkgZG8gbm90IGtub3cgaG93IHRoaXMgaXMgcG9zc2libGUsIGJ1dCBpd2Vfc3RyZWFtX2FkZF9ldmVudAorCSAqIHNlZW1zIHRvIHJlLW9yZGVyIG1lbWNweSBleGVjdXRpb24gc28gdGhhdCBsZW4gaXMgc2V0IG9ubHkKKwkgKiBhZnRlciBjb3B5aW5nLi4gUHJlLXNldHRpbmcgbGVuIGhlcmUgImZpeGVzIiB0aGlzLCBidXQgcmVhbAorCSAqIHByb2JsZW1zIHNob3VsZCBiZSBzb2x2ZWQgKGFmdGVyIHdoaWNoIHRoZXNlIGl3ZS5sZW4KKwkgKiBzZXR0aW5ncyBjb3VsZCBiZSByZW1vdmVkIGZyb20gdGhpcyBmdW5jdGlvbikuICovCisJaXdlLmxlbiA9IElXX0VWX0FERFJfTEVOOworCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkgIElXX0VWX0FERFJfTEVOKTsKKworCS8qIE90aGVyIGVudHJpZXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG9yZGVyIHdlIGdpdmUgdGhlbSAqLworCisJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCWl3ZS51LmRhdGEubGVuZ3RoID0gc3NpZF9sZW47CisJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisJaXdlLmxlbiA9IElXX0VWX1BPSU5UX0xFTiArIGl3ZS51LmRhdGEubGVuZ3RoOworCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBzc2lkKTsKKworCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCWlmIChic3MpIHsKKwkJY2FwYWJpbGl0aWVzID0gYnNzLT5jYXBhYl9pbmZvOworCX0gZWxzZSB7CisJCWNhcGFiaWxpdGllcyA9IGxlMTZfdG9fY3B1KHNjYW4tPmNhcGFiaWxpdHkpOworCX0KKwlpZiAoY2FwYWJpbGl0aWVzICYgKFdMQU5fQ0FQQUJJTElUWV9FU1MgfAorCQkJICAgIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgeworCQlpZiAoY2FwYWJpbGl0aWVzICYgV0xBTl9DQVBBQklMSVRZX0VTUykKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwkJZWxzZQorCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCWl3ZS5sZW4gPSBJV19FVl9VSU5UX0xFTjsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCQkgIElXX0VWX1VJTlRfTEVOKTsKKwl9CisKKwltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwlpZiAoc2NhbikgeworCQljaGFuID0gc2Nhbi0+Y2hpZDsKKwl9IGVsc2UgaWYgKGJzcykgeworCQljaGFuID0gYnNzLT5jaGFuOworCX0gZWxzZSB7CisJCWNoYW4gPSAwOworCX0KKworCWlmIChjaGFuID4gMCkgeworCQlpd2UudS5mcmVxLm0gPSBmcmVxX2xpc3RbbGUxNl90b19jcHUoY2hhbiAtIDEpXSAqIDEwMDAwMDsKKwkJaXdlLnUuZnJlcS5lID0gMTsKKwkJaXdlLmxlbiA9IElXX0VWX0ZSRVFfTEVOOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJCSAgSVdfRVZfRlJFUV9MRU4pOworCX0KKworCWlmIChzY2FuKSB7CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwkJaWYgKGxvY2FsLT5sYXN0X3NjYW5fdHlwZSA9PSBQUklTTTJfSE9TVFNDQU4pIHsKKwkJCWl3ZS51LnF1YWwubGV2ZWwgPSBsZTE2X3RvX2NwdShzY2FuLT5zbCk7CisJCQlpd2UudS5xdWFsLm5vaXNlID0gbGUxNl90b19jcHUoc2Nhbi0+YW5sKTsKKwkJfSBlbHNlIHsKKwkJCWl3ZS51LnF1YWwubGV2ZWwgPQorCQkJCUhGQTM4NFhfTEVWRUxfVE9fZEJtKGxlMTZfdG9fY3B1KHNjYW4tPnNsKSk7CisJCQlpd2UudS5xdWFsLm5vaXNlID0KKwkJCQlIRkEzODRYX0xFVkVMX1RPX2RCbShsZTE2X3RvX2NwdShzY2FuLT5hbmwpKTsKKwkJfQorCQlpd2UubGVuID0gSVdfRVZfUVVBTF9MRU47CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkJICBJV19FVl9RVUFMX0xFTik7CisJfQorCisJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwlpZiAoY2FwYWJpbGl0aWVzICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpCisJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwllbHNlCisJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJaXdlLnUuZGF0YS5sZW5ndGggPSAwOworCWl3ZS5sZW4gPSBJV19FVl9QT0lOVF9MRU4gKyBpd2UudS5kYXRhLmxlbmd0aDsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIiIpOworCisJLyogVE9ETzogYWRkIFN1cHBSYXRlcyBpbnRvIEJTUyB0YWJsZSAqLworCWlmIChzY2FuKSB7CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKwkJY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKKwkJcG9zID0gc2Nhbi0+c3VwX3JhdGVzOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNjYW4tPnN1cF9yYXRlcyk7IGkrKykgeworCQkJaWYgKHBvc1tpXSA9PSAwKQorCQkJCWJyZWFrOworCQkJLyogQml0IHJhdGUgZ2l2ZW4gaW4gNTAwIGtiL3MgdW5pdHMgKCsgMHg4MCkgKi8KKwkJCWl3ZS51LmJpdHJhdGUudmFsdWUgPSAoKHBvc1tpXSAmIDB4N2YpICogNTAwMDAwKTsKKwkJCWN1cnJlbnRfdmFsID0gaXdlX3N0cmVhbV9hZGRfdmFsdWUoCisJCQkJY3VycmVudF9ldiwgY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCisJCQkJSVdfRVZfUEFSQU1fTEVOKTsKKwkJfQorCQkvKiBDaGVjayBpZiB3ZSBhZGRlZCBhbnkgZXZlbnQgKi8KKwkJaWYgKChjdXJyZW50X3ZhbCAtIGN1cnJlbnRfZXYpID4gSVdfRVZfTENQX0xFTikKKwkJCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKKwl9CisKKwkvKiBUT0RPOiBhZGQgQmVhY29uSW50LHJlc3BfcmF0ZSxhdGltIGludG8gQlNTIHRhYmxlICovCisJYnVmID0ga21hbGxvYyhNQVhfV1BBX0lFX0xFTiAqIDIgKyAzMCwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiAmJiBzY2FuKSB7CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCQlzcHJpbnRmKGJ1ZiwgImJjbl9pbnQ9JWQiLCBsZTE2X3RvX2NwdShzY2FuLT5iZWFjb25faW50ZXJ2YWwpKTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCQkgIGJ1Zik7CisKKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IElXRVZDVVNUT007CisJCXNwcmludGYoYnVmLCAicmVzcF9yYXRlPSVkIiwgbGUxNl90b19jcHUoc2Nhbi0+cmF0ZSkpOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJCSAgYnVmKTsKKworCQlpZiAobG9jYWwtPmxhc3Rfc2Nhbl90eXBlID09IFBSSVNNMl9IT1NUU0NBTiAmJgorCQkgICAgKGNhcGFiaWxpdGllcyAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgeworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCQkJc3ByaW50ZihidWYsICJhdGltPSVkIiwgbGUxNl90b19jcHUoc2Nhbi0+YXRpbSkpOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKwkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJCSAgJml3ZSwgYnVmKTsKKwkJfQorCX0KKwlrZnJlZShidWYpOworCisJaWYgKGJzcyAmJiBic3MtPndwYV9pZV9sZW4gPiAwICYmIGJzcy0+d3BhX2llX2xlbiA8PSBNQVhfV1BBX0lFX0xFTikgeworCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gSVdFVkdFTklFOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IGJzcy0+d3BhX2llX2xlbjsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KAorCQkJY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgYnNzLT53cGFfaWUpOworCX0KKworCWlmIChic3MgJiYgYnNzLT5yc25faWVfbGVuID4gMCAmJiBic3MtPnJzbl9pZV9sZW4gPD0gTUFYX1dQQV9JRV9MRU4pIHsKKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBic3MtPnJzbl9pZV9sZW47CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludCgKKwkJCWN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGJzcy0+cnNuX2llKTsKKwl9CisKKwlyZXR1cm4gY3VycmVudF9ldjsKK30KKworCisvKiBUcmFuc2xhdGUgc2NhbiBkYXRhIHJldHVybmVkIGZyb20gdGhlIGNhcmQgdG8gYSBjYXJkIGluZGVwZW5kYW50CisgKiBmb3JtYXQgdGhhdCB0aGUgV2lyZWxlc3MgVG9vbHMgd2lsbCB1bmRlcnN0YW5kIC0gSmVhbiBJSSAqLworc3RhdGljIGlubGluZSBpbnQgcHJpc20yX3RyYW5zbGF0ZV9zY2FuKGxvY2FsX2luZm9fdCAqbG9jYWwsCisJCQkJCWNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgaGZhMzg0eF9ob3N0c2Nhbl9yZXN1bHQgKnNjYW47CisJaW50IGVudHJ5LCBob3N0c2NhbjsKKwljaGFyICpjdXJyZW50X2V2ID0gYnVmZmVyOworCWNoYXIgKmVuZF9idWYgPSBidWZmZXIgKyBidWZsZW47CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCisJc3Bpbl9sb2NrX2JoKCZsb2NhbC0+bG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKHB0ciwgJmxvY2FsLT5ic3NfbGlzdCkgeworCQlzdHJ1Y3QgaG9zdGFwX2Jzc19pbmZvICpic3M7CisJCWJzcyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgaG9zdGFwX2Jzc19pbmZvLCBsaXN0KTsKKwkJYnNzLT5pbmNsdWRlZCA9IDA7CisJfQorCisJaG9zdHNjYW4gPSBsb2NhbC0+bGFzdF9zY2FuX3R5cGUgPT0gUFJJU00yX0hPU1RTQ0FOOworCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IGxvY2FsLT5sYXN0X3NjYW5fcmVzdWx0c19jb3VudDsgZW50cnkrKykgeworCQlpbnQgZm91bmQgPSAwOworCQlzY2FuID0gJmxvY2FsLT5sYXN0X3NjYW5fcmVzdWx0c1tlbnRyeV07CisKKwkJLyogUmVwb3J0IGV2ZXJ5IFNTSUQgaWYgdGhlIEFQIGlzIHVzaW5nIG11bHRpcGxlIFNTSURzLiBJZiBubworCQkgKiBCU1MgcmVjb3JkIGlzIGZvdW5kIChlLmcuLCB3aGVuIFdQQSBtb2RlIGlzIGRpc2FibGVkKSwKKwkJICogcmVwb3J0IHRoZSBBUCBvbmNlLiAqLworCQlsaXN0X2Zvcl9lYWNoKHB0ciwgJmxvY2FsLT5ic3NfbGlzdCkgeworCQkJc3RydWN0IGhvc3RhcF9ic3NfaW5mbyAqYnNzOworCQkJYnNzID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBob3N0YXBfYnNzX2luZm8sIGxpc3QpOworCQkJaWYgKG1lbWNtcChic3MtPmJzc2lkLCBzY2FuLT5ic3NpZCwgRVRIX0FMRU4pID09IDApIHsKKwkJCQlic3MtPmluY2x1ZGVkID0gMTsKKwkJCQljdXJyZW50X2V2ID0gX19wcmlzbTJfdHJhbnNsYXRlX3NjYW4oCisJCQkJCWxvY2FsLCBzY2FuLCBic3MsIGN1cnJlbnRfZXYsIGVuZF9idWYpOworCQkJCWZvdW5kKys7CisJCQl9CisJCX0KKwkJaWYgKCFmb3VuZCkgeworCQkJY3VycmVudF9ldiA9IF9fcHJpc20yX3RyYW5zbGF0ZV9zY2FuKAorCQkJCWxvY2FsLCBzY2FuLCBOVUxMLCBjdXJyZW50X2V2LCBlbmRfYnVmKTsKKwkJfQorCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBzcGFjZSBmb3Igb25lIG1vcmUgZW50cnkgKi8KKwkJaWYgKChlbmRfYnVmIC0gY3VycmVudF9ldikgPD0gSVdfRVZfQUREUl9MRU4pIHsKKwkJCS8qIEFzayB1c2VyIHNwYWNlIHRvIHRyeSBhZ2FpbiB3aXRoIGEgYmlnZ2VyIGJ1ZmZlciAqLworCQkJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5sb2NrKTsKKwkJCXJldHVybiAtRTJCSUc7CisJCX0KKwl9CisKKwkvKiBQcmlzbTIgZmlybXdhcmUgaGFzIGxpbWl0cyAoMzIgYXQgbGVhc3QgaW4gc29tZSB2ZXJzaW9ucykgZm9yIG51bWJlcgorCSAqIG9mIEJTU2VzIGluIHNjYW4gcmVzdWx0cy4gRXh0ZW5kIHRoaXMgbGltaXQgYnkgdXNpbmcgbG9jYWwgQlNTIGxpc3QuCisJICovCisJbGlzdF9mb3JfZWFjaChwdHIsICZsb2NhbC0+YnNzX2xpc3QpIHsKKwkJc3RydWN0IGhvc3RhcF9ic3NfaW5mbyAqYnNzOworCQlic3MgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGhvc3RhcF9ic3NfaW5mbywgbGlzdCk7CisJCWlmIChic3MtPmluY2x1ZGVkKQorCQkJY29udGludWU7CisJCWN1cnJlbnRfZXYgPSBfX3ByaXNtMl90cmFuc2xhdGVfc2Nhbihsb2NhbCwgTlVMTCwgYnNzLAorCQkJCQkJICAgICBjdXJyZW50X2V2LCBlbmRfYnVmKTsKKwkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgc3BhY2UgZm9yIG9uZSBtb3JlIGVudHJ5ICovCisJCWlmICgoZW5kX2J1ZiAtIGN1cnJlbnRfZXYpIDw9IElXX0VWX0FERFJfTEVOKSB7CisJCQkvKiBBc2sgdXNlciBzcGFjZSB0byB0cnkgYWdhaW4gd2l0aCBhIGJpZ2dlciBidWZmZXIgKi8KKwkJCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+bG9jayk7CisJCQlyZXR1cm4gLUUyQklHOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5sb2NrKTsKKworCXJldHVybiBjdXJyZW50X2V2IC0gYnVmZmVyOworfQorI2VuZGlmIC8qIFBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCisKKworc3RhdGljIGlubGluZSBpbnQgcHJpc20yX2lvY3RsX2dpd3NjYW5fc3RhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisjaWZkZWYgUFJJU00yX05PX1NUQVRJT05fTU9ERVMKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisjZWxzZSAvKiBQUklTTTJfTk9fU1RBVElPTl9NT0RFUyAqLworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCByZXM7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwkvKiBXYWl0IHVudGlsIHRoZSBzY2FuIGlzIGZpbmlzaGVkLiBXZSBjYW4gcHJvYmFibHkgZG8gYmV0dGVyCisJICogdGhhbiB0aGF0IC0gSmVhbiBJSSAqLworCWlmIChsb2NhbC0+c2Nhbl90aW1lc3RhbXAgJiYKKwkgICAgdGltZV9iZWZvcmUoamlmZmllcywgbG9jYWwtPnNjYW5fdGltZXN0YW1wICsgMyAqIEhaKSkgeworCQkvKiBJbXBvcnRhbnQgbm90ZSA6IHdlIGRvbid0IHdhbnQgdG8gYmxvY2sgdGhlIGNhbGxlcgorCQkgKiB1bnRpbCByZXN1bHRzIGFyZSByZWFkeSBmb3IgdmFyaW91cyByZWFzb25zLgorCQkgKiBGaXJzdCwgbWFuYWdpbmcgd2FpdCBxdWV1ZXMgaXMgY29tcGxleCBhbmQgcmFjeQorCQkgKiAodGhlcmUgbWF5IGJlIG11bHRpcGxlIHNpbXVsdGFuZW91cyBjYWxsZXJzKS4KKwkJICogU2Vjb25kLCB3ZSBncmFiIHNvbWUgcnRuZXRsaW5rIGxvY2sgYmVmb3JlIGNvbW1pbmcKKwkJICogaGVyZSAoaW4gZGV2X2lvY3RsKCkpLgorCQkgKiBUaGlyZCwgdGhlIGNhbGxlciBjYW4gd2FpdCBvbiB0aGUgV2lyZWxlc3MgRXZlbnQKKwkJICogLSBKZWFuIElJICovCisJCXJldHVybiAtRUFHQUlOOworCX0KKwlsb2NhbC0+c2Nhbl90aW1lc3RhbXAgPSAwOworCisJcmVzID0gcHJpc20yX3RyYW5zbGF0ZV9zY2FuKGxvY2FsLCBleHRyYSwgZGF0YS0+bGVuZ3RoKTsKKworCWlmIChyZXMgPj0gMCkgeworCQlkYXRhLT5sZW5ndGggPSByZXM7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiByZXM7CisJfQorI2VuZGlmIC8qIFBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfZ2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgcmVzOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCS8qIEluIE1BU1RFUiBtb2RlLCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gZ28gYXJvdW5kCisJCSAqIHNjYW5uaW5nIHRoZSBmcmVxdWVuY2llcyBhbmQgbWFrZSB0aGUgc3RhdGlvbnMgd2Ugc2VydmUKKwkJICogd2FpdCB3aGVuIHdoYXQgdGhlIHVzZXIgaXMgcmVhbGx5IGludGVyZXN0ZWQgYWJvdXQgaXMgdGhlCisJCSAqIGxpc3Qgb2Ygc3RhdGlvbnMgYW5kIGFjY2VzcyBwb2ludHMgd2UgYXJlIHRhbGtpbmcgdG8uCisJCSAqIFNvLCBqdXN0IGV4dHJhY3QgcmVzdWx0cyBmcm9tIG91ciBjYWNoZS4uLgorCQkgKiBKZWFuIElJICovCisKKwkJLyogVHJhbnNsYXRlIHRvIFdFIGZvcm1hdCAqLworCQlyZXMgPSBwcmlzbTJfYXBfdHJhbnNsYXRlX3NjYW4oZGV2LCBleHRyYSk7CisJCWlmIChyZXMgPj0gMCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlNjYW4gcmVzdWx0IHRyYW5zbGF0aW9uIHN1Y2NlZWRlZCAiCisJCQkgICAgICAgIihsZW5ndGg9JWQpXG4iLCByZXMpOworCQkJZGF0YS0+bGVuZ3RoID0gcmVzOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICJTY2FuIHJlc3VsdCB0cmFuc2xhdGlvbiBmYWlsZWQgKHJlcz0lZClcbiIsCisJCQkgICAgICAgcmVzKTsKKwkJCWRhdGEtPmxlbmd0aCA9IDA7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfSBlbHNlIHsKKwkJLyogU3RhdGlvbiBtb2RlICovCisJCXJldHVybiBwcmlzbTJfaW9jdGxfZ2l3c2Nhbl9zdGEoZGV2LCBpbmZvLCBkYXRhLCBleHRyYSk7CisJfQorfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIHByaXNtMl9wcml2W10gPSB7CisJeyBQUklTTTJfSU9DVExfTU9OSVRPUiwKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAibW9uaXRvciIgfSwKKwl7IFBSSVNNMl9JT0NUTF9SRUFETUlGLAorCSAgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAicmVhZG1pZiIgfSwKKwl7IFBSSVNNMl9JT0NUTF9XUklURU1JRiwKKwkgIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMiwgMCwgIndyaXRlbWlmIiB9LAorCXsgUFJJU00yX0lPQ1RMX1JFU0VULAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJyZXNldCIgfSwKKwl7IFBSSVNNMl9JT0NUTF9JTlFVSVJFLAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJpbnF1aXJlIiB9LAorCXsgUFJJU00yX0lPQ1RMX1NFVF9SSURfV09SRCwKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAyLCAwLCAic2V0X3JpZF93b3JkIiB9LAorCXsgUFJJU00yX0lPQ1RMX01BQ0NNRCwKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAibWFjY21kIiB9LAorCXsgUFJJU00yX0lPQ1RMX1dEU19BREQsCisJICBJV19QUklWX1RZUEVfQUREUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJ3ZHNfYWRkIiB9LAorCXsgUFJJU00yX0lPQ1RMX1dEU19ERUwsCisJICBJV19QUklWX1RZUEVfQUREUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJ3ZHNfZGVsIiB9LAorCXsgUFJJU00yX0lPQ1RMX0FERE1BQywKKwkgIElXX1BSSVZfVFlQRV9BRERSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImFkZG1hYyIgfSwKKwl7IFBSSVNNMl9JT0NUTF9ERUxNQUMsCisJICBJV19QUklWX1RZUEVfQUREUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJkZWxtYWMiIH0sCisJeyBQUklTTTJfSU9DVExfS0lDS01BQywKKwkgIElXX1BSSVZfVFlQRV9BRERSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImtpY2ttYWMiIH0sCisJLyogLS0tIHJhdyBhY2Nlc3MgdG8gc3ViLWlvY3RscyAtLS0gKi8KKwl7IFBSSVNNMl9JT0NUTF9QUklTTTJfUEFSQU0sCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMiwgMCwgInByaXNtMl9wYXJhbSIgfSwKKwl7IFBSSVNNMl9JT0NUTF9HRVRfUFJJU00yX1BBUkFNLAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldHByaXNtMl9wYXJhbSIgfSwKKwkvKiAtLS0gc3ViLWlvY3RscyBoYW5kbGVycyAtLS0gKi8KKwl7IFBSSVNNMl9JT0NUTF9QUklTTTJfUEFSQU0sCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgIiIgfSwKKwl7IFBSSVNNMl9JT0NUTF9HRVRfUFJJU00yX1BBUkFNLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICIiIH0sCisJLyogLS0tIHN1Yi1pb2N0bHMgZGVmaW5pdGlvbnMgLS0tICovCisJeyBQUklTTTJfUEFSQU1fVFhSQVRFQ1RSTCwKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAidHhyYXRlY3RybCIgfSwKKwl7IFBSSVNNMl9QQVJBTV9UWFJBVEVDVFJMLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXR0eHJhdGVjdHJsIiB9LAorCXsgUFJJU00yX1BBUkFNX0JFQUNPTl9JTlQsCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImJlYWNvbl9pbnQiIH0sCisJeyBQUklTTTJfUEFSQU1fQkVBQ09OX0lOVCwKKwkgIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0YmVhY29uX2ludCIgfSwKKyNpZm5kZWYgUFJJU00yX05PX1NUQVRJT05fTU9ERVMKKwl7IFBSSVNNMl9QQVJBTV9QU0VVRE9fSUJTUywKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAicHNldWRvX2lic3MiIH0sCisJeyBQUklTTTJfUEFSQU1fUFNFVURPX0lCU1MsCisJICAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldHBzZXVkb19pYnNzIiB9LAorI2VuZGlmIC8qIFBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCisJeyBQUklTTTJfUEFSQU1fQUxDLAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJhbGMiIH0sCisJeyBQUklTTTJfUEFSQU1fQUxDLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRhbGMiIH0sCisJeyBQUklTTTJfUEFSQU1fRFVNUCwKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiZHVtcCIgfSwKKwl7IFBSSVNNMl9QQVJBTV9EVU1QLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRkdW1wIiB9LAorCXsgUFJJU00yX1BBUkFNX09USEVSX0FQX1BPTElDWSwKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAib3RoZXJfYXBfcG9saWN5IiB9LAorCXsgUFJJU00yX1BBUkFNX09USEVSX0FQX1BPTElDWSwKKwkgIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0b3RoZXJfYXBfcG9sIiB9LAorCXsgUFJJU00yX1BBUkFNX0FQX01BWF9JTkFDVElWSVRZLAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJtYXhfaW5hY3Rpdml0eSIgfSwKKwl7IFBSSVNNMl9QQVJBTV9BUF9NQVhfSU5BQ1RJVklUWSwKKwkgIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0bWF4X2luYWN0aXZpIiB9LAorCXsgUFJJU00yX1BBUkFNX0FQX0JSSURHRV9QQUNLRVRTLAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJicmlkZ2VfcGFja2V0cyIgfSwKKwl7IFBSSVNNMl9QQVJBTV9BUF9CUklER0VfUEFDS0VUUywKKwkgIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0YnJpZGdlX3BhY2tlIiB9LAorCXsgUFJJU00yX1BBUkFNX0RUSU1fUEVSSU9ELAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJkdGltX3BlcmlvZCIgfSwKKwl7IFBSSVNNMl9QQVJBTV9EVElNX1BFUklPRCwKKwkgIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0ZHRpbV9wZXJpb2QiIH0sCisJeyBQUklTTTJfUEFSQU1fQVBfTlVMTEZVTkNfQUNLLAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJudWxsZnVuY19hY2siIH0sCisJeyBQUklTTTJfUEFSQU1fQVBfTlVMTEZVTkNfQUNLLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRudWxsZnVuY19hY2siIH0sCisJeyBQUklTTTJfUEFSQU1fTUFYX1dEUywKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAibWF4X3dkcyIgfSwKKwl7IFBSSVNNMl9QQVJBTV9NQVhfV0RTLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRtYXhfd2RzIiB9LAorCXsgUFJJU00yX1BBUkFNX0FQX0FVVE9NX0FQX1dEUywKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiYXV0b21fYXBfd2RzIiB9LAorCXsgUFJJU00yX1BBUkFNX0FQX0FVVE9NX0FQX1dEUywKKwkgIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0YXV0b21fYXBfd2RzIiB9LAorCXsgUFJJU00yX1BBUkFNX0FQX0FVVEhfQUxHUywKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiYXBfYXV0aF9hbGdzIiB9LAorCXsgUFJJU00yX1BBUkFNX0FQX0FVVEhfQUxHUywKKwkgIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0YXBfYXV0aF9hbGdzIiB9LAorCXsgUFJJU00yX1BBUkFNX01PTklUT1JfQUxMT1dfRkNTRVJSLAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJhbGxvd19mY3NlcnIiIH0sCisJeyBQUklTTTJfUEFSQU1fTU9OSVRPUl9BTExPV19GQ1NFUlIsCisJICAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldGFsbG93X2Zjc2VyciIgfSwKKwl7IFBSSVNNMl9QQVJBTV9IT1NUX0VOQ1JZUFQsCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImhvc3RfZW5jcnlwdCIgfSwKKwl7IFBSSVNNMl9QQVJBTV9IT1NUX0VOQ1JZUFQsCisJICAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldGhvc3RfZW5jcnlwdCIgfSwKKwl7IFBSSVNNMl9QQVJBTV9IT1NUX0RFQ1JZUFQsCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImhvc3RfZGVjcnlwdCIgfSwKKwl7IFBSSVNNMl9QQVJBTV9IT1NUX0RFQ1JZUFQsCisJICAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldGhvc3RfZGVjcnlwdCIgfSwKKyNpZm5kZWYgUFJJU00yX05PX1NUQVRJT05fTU9ERVMKKwl7IFBSSVNNMl9QQVJBTV9IT1NUX1JPQU1JTkcsCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImhvc3Rfcm9hbWluZyIgfSwKKwl7IFBSSVNNMl9QQVJBTV9IT1NUX1JPQU1JTkcsCisJICAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldGhvc3Rfcm9hbWluZyIgfSwKKyNlbmRpZiAvKiBQUklTTTJfTk9fU1RBVElPTl9NT0RFUyAqLworCXsgUFJJU00yX1BBUkFNX0JDUlhfU1RBX0tFWSwKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiYmNyeF9zdGFfa2V5IiB9LAorCXsgUFJJU00yX1BBUkFNX0JDUlhfU1RBX0tFWSwKKwkgIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0YmNyeF9zdGFfa2V5IiB9LAorCXsgUFJJU00yX1BBUkFNX0lFRUVfODAyXzFYLAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJpZWVlXzgwMl8xeCIgfSwKKwl7IFBSSVNNMl9QQVJBTV9JRUVFXzgwMl8xWCwKKwkgIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0aWVlZV84MDJfMXgiIH0sCisJeyBQUklTTTJfUEFSQU1fQU5UU0VMX1RYLAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJhbnRzZWxfdHgiIH0sCisJeyBQUklTTTJfUEFSQU1fQU5UU0VMX1RYLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRhbnRzZWxfdHgiIH0sCisJeyBQUklTTTJfUEFSQU1fQU5UU0VMX1JYLAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJhbnRzZWxfcngiIH0sCisJeyBQUklTTTJfUEFSQU1fQU5UU0VMX1JYLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRhbnRzZWxfcngiIH0sCisJeyBQUklTTTJfUEFSQU1fTU9OSVRPUl9UWVBFLAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJtb25pdG9yX3R5cGUiIH0sCisJeyBQUklTTTJfUEFSQU1fTU9OSVRPUl9UWVBFLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRtb25pdG9yX3R5cGUiIH0sCisJeyBQUklTTTJfUEFSQU1fV0RTX1RZUEUsCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgIndkc190eXBlIiB9LAorCXsgUFJJU00yX1BBUkFNX1dEU19UWVBFLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXR3ZHNfdHlwZSIgfSwKKwl7IFBSSVNNMl9QQVJBTV9IT1NUU0NBTiwKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiaG9zdHNjYW4iIH0sCisJeyBQUklTTTJfUEFSQU1fSE9TVFNDQU4sCisJICAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldGhvc3RzY2FuIiB9LAorCXsgUFJJU00yX1BBUkFNX0FQX1NDQU4sCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImFwX3NjYW4iIH0sCisJeyBQUklTTTJfUEFSQU1fQVBfU0NBTiwKKwkgIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0YXBfc2NhbiIgfSwKKwl7IFBSSVNNMl9QQVJBTV9FTkhfU0VDLAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJlbmhfc2VjIiB9LAorCXsgUFJJU00yX1BBUkFNX0VOSF9TRUMsCisJICAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldGVuaF9zZWMiIH0sCisjaWZkZWYgUFJJU00yX0lPX0RFQlVHCisJeyBQUklTTTJfUEFSQU1fSU9fREVCVUcsCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImlvX2RlYnVnIiB9LAorCXsgUFJJU00yX1BBUkFNX0lPX0RFQlVHLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRpb19kZWJ1ZyIgfSwKKyNlbmRpZiAvKiBQUklTTTJfSU9fREVCVUcgKi8KKwl7IFBSSVNNMl9QQVJBTV9CQVNJQ19SQVRFUywKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiYmFzaWNfcmF0ZXMiIH0sCisJeyBQUklTTTJfUEFSQU1fQkFTSUNfUkFURVMsCisJICAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldGJhc2ljX3JhdGVzIiB9LAorCXsgUFJJU00yX1BBUkFNX09QRVJfUkFURVMsCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgIm9wZXJfcmF0ZXMiIH0sCisJeyBQUklTTTJfUEFSQU1fT1BFUl9SQVRFUywKKwkgIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0b3Blcl9yYXRlcyIgfSwKKwl7IFBSSVNNMl9QQVJBTV9IT1NUQVBELAorCSAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJob3N0YXBkIiB9LAorCXsgUFJJU00yX1BBUkFNX0hPU1RBUEQsCisJICAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldGhvc3RhcGQiIH0sCisJeyBQUklTTTJfUEFSQU1fSE9TVEFQRF9TVEEsCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImhvc3RhcGRfc3RhIiB9LAorCXsgUFJJU00yX1BBUkFNX0hPU1RBUERfU1RBLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRob3N0YXBkX3N0YSIgfSwKKwl7IFBSSVNNMl9QQVJBTV9XUEEsCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgIndwYSIgfSwKKwl7IFBSSVNNMl9QQVJBTV9XUEEsCisJICAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldHdwYSIgfSwKKwl7IFBSSVNNMl9QQVJBTV9QUklWQUNZX0lOVk9LRUQsCisJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInByaXZhY3lfaW52b2tlZCIgfSwKKwl7IFBSSVNNMl9QQVJBTV9QUklWQUNZX0lOVk9LRUQsCisJICAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldHByaXZhY3lfaW52byIgfSwKKwl7IFBSSVNNMl9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUywKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAidGtpcF9jb3VudGVybWVhIiB9LAorCXsgUFJJU00yX1BBUkFNX1RLSVBfQ09VTlRFUk1FQVNVUkVTLAorCSAgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXR0a2lwX2NvdW50ZXIiIH0sCisJeyBQUklTTTJfUEFSQU1fRFJPUF9VTkVOQ1JZUFRFRCwKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiZHJvcF91bmVuY3J5cHRlIiB9LAorCXsgUFJJU00yX1BBUkFNX0RST1BfVU5FTkNSWVBURUQsCisJICAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldGRyb3BfdW5lbmNyeSIgfSwKKwl7IFBSSVNNMl9QQVJBTV9TQ0FOX0NIQU5ORUxfTUFTSywKKwkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2Nhbl9jaGFubmVscyIgfSwKKwl7IFBSSVNNMl9QQVJBTV9TQ0FOX0NIQU5ORUxfTUFTSywKKwkgIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0c2Nhbl9jaGFubmVsIiB9LAorfTsKKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9wcml2X2lucXVpcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICppKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJaWYgKGxvY2FsLT5mdW5jLT5jbWQoZGV2LCBIRkEzODRYX0NNRENPREVfSU5RVUlSRSwgKmksIE5VTEwsIE5VTEwpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9wcml2X3ByaXNtMl9wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJCSAgdm9pZCAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJaW50ICppID0gKGludCAqKSBleHRyYTsKKwlpbnQgcGFyYW0gPSAqaTsKKwlpbnQgdmFsdWUgPSAqKGkgKyAxKTsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgdmFsOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJc3dpdGNoIChwYXJhbSkgeworCWNhc2UgUFJJU00yX1BBUkFNX1RYUkFURUNUUkw6CisJCWxvY2FsLT5md190eF9yYXRlX2NvbnRyb2wgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9CRUFDT05fSU5UOgorCQlpZiAoaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GQkVBQ09OSU5ULCB2YWx1ZSkgfHwKKwkJICAgIGxvY2FsLT5mdW5jLT5yZXNldF9wb3J0KGRldikpCisJCQlyZXQgPSAtRUlOVkFMOworCQllbHNlCisJCQlsb2NhbC0+YmVhY29uX2ludCA9IHZhbHVlOworCQlicmVhazsKKworI2lmbmRlZiBQUklTTTJfTk9fU1RBVElPTl9NT0RFUworCWNhc2UgUFJJU00yX1BBUkFNX1BTRVVET19JQlNTOgorCQlpZiAodmFsdWUgPT0gbG9jYWwtPnBzZXVkb19hZGhvYykKKwkJCWJyZWFrOworCisJCWlmICh2YWx1ZSAhPSAwICYmIHZhbHVlICE9IDEpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTI6ICVzOiBwc2V1ZG8gSUJTUyBjaGFuZ2UgJWQgLT4gJWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGxvY2FsLT5wc2V1ZG9fYWRob2MsIHZhbHVlKTsKKwkJbG9jYWwtPnBzZXVkb19hZGhvYyA9IHZhbHVlOworCQlpZiAobG9jYWwtPml3X21vZGUgIT0gSVdfTU9ERV9BREhPQykKKwkJCWJyZWFrOworCisJCWlmIChob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZQT1JUVFlQRSwKKwkJCQkgICAgaG9zdGFwX2dldF9wb3J0dHlwZShsb2NhbCkpKSB7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGxvY2FsLT5mdW5jLT5yZXNldF9wb3J0KGRldikpCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKyNlbmRpZiAvKiBQUklTTTJfTk9fU1RBVElPTl9NT0RFUyAqLworCisJY2FzZSBQUklTTTJfUEFSQU1fQUxDOgorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzIEFMQ1xuIiwgZGV2LT5uYW1lLAorCQkgICAgICAgdmFsdWUgPT0gMCA/ICJEaXNhYmxpbmciIDogIkVuYWJsaW5nIik7CisJCXZhbCA9IEhGQTM4NFhfVEVTVF9DRkdfQklUX0FMQzsKKwkJbG9jYWwtPmZ1bmMtPmNtZChkZXYsIEhGQTM4NFhfQ01EQ09ERV9URVNUIHwKKwkJCQkgKEhGQTM4NFhfVEVTVF9DRkdfQklUUyA8PCA4KSwKKwkJCQkgdmFsdWUgPT0gMCA/IDAgOiAxLCAmdmFsLCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9EVU1QOgorCQlsb2NhbC0+ZnJhbWVfZHVtcCA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX09USEVSX0FQX1BPTElDWToKKwkJaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDMpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAobG9jYWwtPmFwICE9IE5VTEwpCisJCQlsb2NhbC0+YXAtPmFwX3BvbGljeSA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0FQX01BWF9JTkFDVElWSVRZOgorCQlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNyAqIDI0ICogNjAgKiA2MCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChsb2NhbC0+YXAgIT0gTlVMTCkKKwkJCWxvY2FsLT5hcC0+bWF4X2luYWN0aXZpdHkgPSB2YWx1ZSAqIEhaOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0FQX0JSSURHRV9QQUNLRVRTOgorCQlpZiAobG9jYWwtPmFwICE9IE5VTEwpCisJCQlsb2NhbC0+YXAtPmJyaWRnZV9wYWNrZXRzID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fRFRJTV9QRVJJT0Q6CisJCWlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA2NTUzNSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZPV05EVElNUEVSSU9ELCB2YWx1ZSkKKwkJICAgIHx8IGxvY2FsLT5mdW5jLT5yZXNldF9wb3J0KGRldikpCisJCQlyZXQgPSAtRUlOVkFMOworCQllbHNlCisJCQlsb2NhbC0+ZHRpbV9wZXJpb2QgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9BUF9OVUxMRlVOQ19BQ0s6CisJCWlmIChsb2NhbC0+YXAgIT0gTlVMTCkKKwkJCWxvY2FsLT5hcC0+bnVsbGZ1bmNfYWNrID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fTUFYX1dEUzoKKwkJbG9jYWwtPndkc19tYXhfY29ubmVjdGlvbnMgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9BUF9BVVRPTV9BUF9XRFM6CisJCWlmIChsb2NhbC0+YXAgIT0gTlVMTCkgeworCQkJaWYgKCFsb2NhbC0+YXAtPmF1dG9tX2FwX3dkcyAmJiB2YWx1ZSkgeworCQkJCS8qIGFkZCBXRFMgbGluayB0byBhbGwgQVBzIGluIFNUQSB0YWJsZSAqLworCQkJCWhvc3RhcF9hZGRfd2RzX2xpbmtzKGxvY2FsKTsKKwkJCX0KKwkJCWxvY2FsLT5hcC0+YXV0b21fYXBfd2RzID0gdmFsdWU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9BUF9BVVRIX0FMR1M6CisJCWxvY2FsLT5hdXRoX2FsZ3MgPSB2YWx1ZTsKKwkJaWYgKGhvc3RhcF9zZXRfYXV0aF9hbGdzKGxvY2FsKSkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fTU9OSVRPUl9BTExPV19GQ1NFUlI6CisJCWxvY2FsLT5tb25pdG9yX2FsbG93X2Zjc2VyciA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0hPU1RfRU5DUllQVDoKKwkJbG9jYWwtPmhvc3RfZW5jcnlwdCA9IHZhbHVlOworCQlpZiAoaG9zdGFwX3NldF9lbmNyeXB0aW9uKGxvY2FsKSB8fAorCQkgICAgbG9jYWwtPmZ1bmMtPnJlc2V0X3BvcnQoZGV2KSkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fSE9TVF9ERUNSWVBUOgorCQlsb2NhbC0+aG9zdF9kZWNyeXB0ID0gdmFsdWU7CisJCWlmIChob3N0YXBfc2V0X2VuY3J5cHRpb24obG9jYWwpIHx8CisJCSAgICBsb2NhbC0+ZnVuYy0+cmVzZXRfcG9ydChkZXYpKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKyNpZm5kZWYgUFJJU00yX05PX1NUQVRJT05fTU9ERVMKKwljYXNlIFBSSVNNMl9QQVJBTV9IT1NUX1JPQU1JTkc6CisJCWlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAyKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJbG9jYWwtPmhvc3Rfcm9hbWluZyA9IHZhbHVlOworCQlpZiAoaG9zdGFwX3NldF9yb2FtaW5nKGxvY2FsKSB8fCBsb2NhbC0+ZnVuYy0+cmVzZXRfcG9ydChkZXYpKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisjZW5kaWYgLyogUFJJU00yX05PX1NUQVRJT05fTU9ERVMgKi8KKworCWNhc2UgUFJJU00yX1BBUkFNX0JDUlhfU1RBX0tFWToKKwkJbG9jYWwtPmJjcnhfc3RhX2tleSA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0lFRUVfODAyXzFYOgorCQlsb2NhbC0+aWVlZV84MDJfMXggPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9BTlRTRUxfVFg6CisJCWlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiBIT1NUQVBfQU5UU0VMX0hJR0gpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlsb2NhbC0+YW50c2VsX3R4ID0gdmFsdWU7CisJCWhvc3RhcF9zZXRfYW50c2VsKGxvY2FsKTsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9BTlRTRUxfUlg6CisJCWlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiBIT1NUQVBfQU5UU0VMX0hJR0gpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlsb2NhbC0+YW50c2VsX3J4ID0gdmFsdWU7CisJCWhvc3RhcF9zZXRfYW50c2VsKGxvY2FsKTsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9NT05JVE9SX1RZUEU6CisJCWlmICh2YWx1ZSAhPSBQUklTTTJfTU9OSVRPUl84MDIxMSAmJgorCQkgICAgdmFsdWUgIT0gUFJJU00yX01PTklUT1JfQ0FQSERSICYmCisJCSAgICB2YWx1ZSAhPSBQUklTTTJfTU9OSVRPUl9QUklTTSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWxvY2FsLT5tb25pdG9yX3R5cGUgPSB2YWx1ZTsKKwkJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJCWhvc3RhcF9tb25pdG9yX3NldF90eXBlKGxvY2FsKTsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9XRFNfVFlQRToKKwkJbG9jYWwtPndkc190eXBlID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fSE9TVFNDQU46CisJeworCQlzdHJ1Y3QgaGZhMzg0eF9ob3N0c2Nhbl9yZXF1ZXN0IHNjYW5fcmVxOworCQl1MTYgcmF0ZTsKKworCQltZW1zZXQoJnNjYW5fcmVxLCAwLCBzaXplb2Yoc2Nhbl9yZXEpKTsKKwkJc2Nhbl9yZXEuY2hhbm5lbF9saXN0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweDNmZmYpOworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCWNhc2UgMTogcmF0ZSA9IEhGQTM4NFhfUkFURVNfMU1CUFM7IGJyZWFrOworCQljYXNlIDI6IHJhdGUgPSBIRkEzODRYX1JBVEVTXzJNQlBTOyBicmVhazsKKwkJY2FzZSAzOiByYXRlID0gSEZBMzg0WF9SQVRFU181TUJQUzsgYnJlYWs7CisJCWNhc2UgNDogcmF0ZSA9IEhGQTM4NFhfUkFURVNfMTFNQlBTOyBicmVhazsKKwkJZGVmYXVsdDogcmF0ZSA9IEhGQTM4NFhfUkFURVNfMU1CUFM7IGJyZWFrOworCQl9CisJCXNjYW5fcmVxLnR4cmF0ZSA9IGNwdV90b19sZTE2KHJhdGUpOworCQkvKiBsZWF2ZSBTU0lEIGVtcHR5IHRvIGFjY2VwdCBhbGwgU1NJRHMgKi8KKworCQlpZiAobG9jYWwtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJCWlmIChob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZQT1JUVFlQRSwKKwkJCQkJICAgIEhGQTM4NFhfUE9SVFRZUEVfQlNTKSB8fAorCQkJICAgIGxvY2FsLT5mdW5jLT5yZXNldF9wb3J0KGRldikpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIkxlYXZpbmcgSG9zdCBBUCBtb2RlICIKKwkJCQkgICAgICAgImZvciBIb3N0U2NhbiBmYWlsZWRcbiIpOworCQl9CisKKwkJaWYgKGxvY2FsLT5mdW5jLT5zZXRfcmlkKGRldiwgSEZBMzg0WF9SSURfSE9TVFNDQU4sICZzY2FuX3JlcSwKKwkJCQkJIHNpemVvZihzY2FuX3JlcSkpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiSE9TVFNDQU4gZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCQl3YWl0X3F1ZXVlX3QgX193YWl0OworCQkJaW5pdF93YWl0cXVldWVfZW50cnkoJl9fd2FpdCwgY3VycmVudCk7CisJCQlhZGRfd2FpdF9xdWV1ZSgmbG9jYWwtPmhvc3RzY2FuX3dxLCAmX193YWl0KTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KEhaKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXQgPSAtRUlOVFI7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmxvY2FsLT5ob3N0c2Nhbl93cSwgJl9fd2FpdCk7CisKKwkJCWlmIChob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZQT1JUVFlQRSwKKwkJCQkJICAgIEhGQTM4NFhfUE9SVFRZUEVfSE9TVEFQKSB8fAorCQkJICAgIGxvY2FsLT5mdW5jLT5yZXNldF9wb3J0KGRldikpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlJldHVybmluZyB0byBIb3N0IEFQIG1vZGUgIgorCQkJCSAgICAgICAiYWZ0ZXIgSG9zdFNjYW4gZmFpbGVkXG4iKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFBSSVNNMl9QQVJBTV9BUF9TQ0FOOgorCQlsb2NhbC0+cGFzc2l2ZV9zY2FuX2ludGVydmFsID0gdmFsdWU7CisJCWlmICh0aW1lcl9wZW5kaW5nKCZsb2NhbC0+cGFzc2l2ZV9zY2FuX3RpbWVyKSkKKwkJCWRlbF90aW1lcigmbG9jYWwtPnBhc3NpdmVfc2Nhbl90aW1lcik7CisJCWlmICh2YWx1ZSA+IDApIHsKKwkJCWxvY2FsLT5wYXNzaXZlX3NjYW5fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQkJCWxvY2FsLT5wYXNzaXZlX3NjYW5faW50ZXJ2YWwgKiBIWjsKKwkJCWFkZF90aW1lcigmbG9jYWwtPnBhc3NpdmVfc2Nhbl90aW1lcik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9FTkhfU0VDOgorCQlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWxvY2FsLT5lbmhfc2VjID0gdmFsdWU7CisJCWlmIChob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9DTkZFTkhTRUNVUklUWSwKKwkJCQkgICAgbG9jYWwtPmVuaF9zZWMpIHx8CisJCSAgICBsb2NhbC0+ZnVuYy0+cmVzZXRfcG9ydChkZXYpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY25mRW5oU2VjdXJpdHkgcmVxdWlyZXMgU1RBIGYvdyAiCisJCQkgICAgICAgIjEuNi4zIG9yIG5ld2VyXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCX0KKwkJYnJlYWs7CisKKyNpZmRlZiBQUklTTTJfSU9fREVCVUcKKwljYXNlIFBSSVNNMl9QQVJBTV9JT19ERUJVRzoKKwkJbG9jYWwtPmlvX2RlYnVnX2VuYWJsZWQgPSB2YWx1ZTsKKwkJYnJlYWs7CisjZW5kaWYgLyogUFJJU00yX0lPX0RFQlVHICovCisKKwljYXNlIFBSSVNNMl9QQVJBTV9CQVNJQ19SQVRFUzoKKwkJaWYgKCh2YWx1ZSAmIGxvY2FsLT50eF9yYXRlX2NvbnRyb2wpICE9IHZhbHVlIHx8IHZhbHVlID09IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIGJhc2ljIHJhdGUgc2V0IC0gYmFzaWMgIgorCQkJICAgICAgICJyYXRlcyBtdXN0IGJlIGluIHN1cHBvcnRlZCByYXRlIHNldFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWxvY2FsLT5iYXNpY19yYXRlcyA9IHZhbHVlOworCQlpZiAoaG9zdGFwX3NldF93b3JkKGRldiwgSEZBMzg0WF9SSURfQ05GQkFTSUNSQVRFUywKKwkJCQkgICAgbG9jYWwtPmJhc2ljX3JhdGVzKSB8fAorCQkgICAgbG9jYWwtPmZ1bmMtPnJlc2V0X3BvcnQoZGV2KSkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fT1BFUl9SQVRFUzoKKwkJbG9jYWwtPnR4X3JhdGVfY29udHJvbCA9IHZhbHVlOworCQlpZiAoaG9zdGFwX3NldF9yYXRlKGRldikpCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0hPU1RBUEQ6CisJCXJldCA9IGhvc3RhcF9zZXRfaG9zdGFwZChsb2NhbCwgdmFsdWUsIDEpOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0hPU1RBUERfU1RBOgorCQlyZXQgPSBob3N0YXBfc2V0X2hvc3RhcGRfc3RhKGxvY2FsLCB2YWx1ZSwgMSk7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fV1BBOgorCQlsb2NhbC0+d3BhID0gdmFsdWU7CisJCWlmIChsb2NhbC0+c3RhX2Z3X3ZlciA8IFBSSVNNMl9GV19WRVIoMSw3LDApKQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWVsc2UgaWYgKGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX1NTTkhBTkRMSU5HTU9ERSwKKwkJCQkJIHZhbHVlID8gMSA6IDApKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9QUklWQUNZX0lOVk9LRUQ6CisJCWxvY2FsLT5wcml2YWN5X2ludm9rZWQgPSB2YWx1ZTsKKwkJaWYgKGhvc3RhcF9zZXRfZW5jcnlwdGlvbihsb2NhbCkgfHwKKwkJICAgIGxvY2FsLT5mdW5jLT5yZXNldF9wb3J0KGRldikpCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgorCQlsb2NhbC0+dGtpcF9jb3VudGVybWVhc3VyZXMgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9EUk9QX1VORU5DUllQVEVEOgorCQlsb2NhbC0+ZHJvcF91bmVuY3J5cHRlZCA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX1NDQU5fQ0hBTk5FTF9NQVNLOgorCQlsb2NhbC0+c2Nhbl9jaGFubmVsX21hc2sgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHByaXNtMl9wYXJhbTogdW5rbm93biBwYXJhbSAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcGFyYW0pOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9wcml2X2dldF9wcmlzbTJfcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkJICAgICAgdm9pZCAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJaW50ICpwYXJhbSA9IChpbnQgKikgZXh0cmE7CisJaW50IHJldCA9IDA7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlzd2l0Y2ggKCpwYXJhbSkgeworCWNhc2UgUFJJU00yX1BBUkFNX1RYUkFURUNUUkw6CisJCSpwYXJhbSA9IGxvY2FsLT5md190eF9yYXRlX2NvbnRyb2w7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fQkVBQ09OX0lOVDoKKwkJKnBhcmFtID0gbG9jYWwtPmJlYWNvbl9pbnQ7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fUFNFVURPX0lCU1M6CisJCSpwYXJhbSA9IGxvY2FsLT5wc2V1ZG9fYWRob2M7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fQUxDOgorCQlyZXQgPSAtRU9QTk9UU1VQUDsgLyogRklYICovCisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fRFVNUDoKKwkJKnBhcmFtID0gbG9jYWwtPmZyYW1lX2R1bXA7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fT1RIRVJfQVBfUE9MSUNZOgorCQlpZiAobG9jYWwtPmFwICE9IE5VTEwpCisJCQkqcGFyYW0gPSBsb2NhbC0+YXAtPmFwX3BvbGljeTsKKwkJZWxzZQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fQVBfTUFYX0lOQUNUSVZJVFk6CisJCWlmIChsb2NhbC0+YXAgIT0gTlVMTCkKKwkJCSpwYXJhbSA9IGxvY2FsLT5hcC0+bWF4X2luYWN0aXZpdHkgLyBIWjsKKwkJZWxzZQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fQVBfQlJJREdFX1BBQ0tFVFM6CisJCWlmIChsb2NhbC0+YXAgIT0gTlVMTCkKKwkJCSpwYXJhbSA9IGxvY2FsLT5hcC0+YnJpZGdlX3BhY2tldHM7CisJCWVsc2UKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0RUSU1fUEVSSU9EOgorCQkqcGFyYW0gPSBsb2NhbC0+ZHRpbV9wZXJpb2Q7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fQVBfTlVMTEZVTkNfQUNLOgorCQlpZiAobG9jYWwtPmFwICE9IE5VTEwpCisJCQkqcGFyYW0gPSBsb2NhbC0+YXAtPm51bGxmdW5jX2FjazsKKwkJZWxzZQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fTUFYX1dEUzoKKwkJKnBhcmFtID0gbG9jYWwtPndkc19tYXhfY29ubmVjdGlvbnM7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fQVBfQVVUT01fQVBfV0RTOgorCQlpZiAobG9jYWwtPmFwICE9IE5VTEwpCisJCQkqcGFyYW0gPSBsb2NhbC0+YXAtPmF1dG9tX2FwX3dkczsKKwkJZWxzZQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fQVBfQVVUSF9BTEdTOgorCQkqcGFyYW0gPSBsb2NhbC0+YXV0aF9hbGdzOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX01PTklUT1JfQUxMT1dfRkNTRVJSOgorCQkqcGFyYW0gPSBsb2NhbC0+bW9uaXRvcl9hbGxvd19mY3NlcnI7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fSE9TVF9FTkNSWVBUOgorCQkqcGFyYW0gPSBsb2NhbC0+aG9zdF9lbmNyeXB0OworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0hPU1RfREVDUllQVDoKKwkJKnBhcmFtID0gbG9jYWwtPmhvc3RfZGVjcnlwdDsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9IT1NUX1JPQU1JTkc6CisJCSpwYXJhbSA9IGxvY2FsLT5ob3N0X3JvYW1pbmc7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fQkNSWF9TVEFfS0VZOgorCQkqcGFyYW0gPSBsb2NhbC0+YmNyeF9zdGFfa2V5OworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0lFRUVfODAyXzFYOgorCQkqcGFyYW0gPSBsb2NhbC0+aWVlZV84MDJfMXg7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fQU5UU0VMX1RYOgorCQkqcGFyYW0gPSBsb2NhbC0+YW50c2VsX3R4OworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0FOVFNFTF9SWDoKKwkJKnBhcmFtID0gbG9jYWwtPmFudHNlbF9yeDsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9NT05JVE9SX1RZUEU6CisJCSpwYXJhbSA9IGxvY2FsLT5tb25pdG9yX3R5cGU7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fV0RTX1RZUEU6CisJCSpwYXJhbSA9IGxvY2FsLT53ZHNfdHlwZTsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9IT1NUU0NBTjoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fQVBfU0NBTjoKKwkJKnBhcmFtID0gbG9jYWwtPnBhc3NpdmVfc2Nhbl9pbnRlcnZhbDsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9FTkhfU0VDOgorCQkqcGFyYW0gPSBsb2NhbC0+ZW5oX3NlYzsKKwkJYnJlYWs7CisKKyNpZmRlZiBQUklTTTJfSU9fREVCVUcKKwljYXNlIFBSSVNNMl9QQVJBTV9JT19ERUJVRzoKKwkJKnBhcmFtID0gbG9jYWwtPmlvX2RlYnVnX2VuYWJsZWQ7CisJCWJyZWFrOworI2VuZGlmIC8qIFBSSVNNMl9JT19ERUJVRyAqLworCisJY2FzZSBQUklTTTJfUEFSQU1fQkFTSUNfUkFURVM6CisJCSpwYXJhbSA9IGxvY2FsLT5iYXNpY19yYXRlczsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9PUEVSX1JBVEVTOgorCQkqcGFyYW0gPSBsb2NhbC0+dHhfcmF0ZV9jb250cm9sOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0hPU1RBUEQ6CisJCSpwYXJhbSA9IGxvY2FsLT5ob3N0YXBkOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0hPU1RBUERfU1RBOgorCQkqcGFyYW0gPSBsb2NhbC0+aG9zdGFwZF9zdGE7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfUEFSQU1fV1BBOgorCQlpZiAobG9jYWwtPnN0YV9md192ZXIgPCBQUklTTTJfRldfVkVSKDEsNywwKSkKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkqcGFyYW0gPSBsb2NhbC0+d3BhOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX1BSSVZBQ1lfSU5WT0tFRDoKKwkJKnBhcmFtID0gbG9jYWwtPnByaXZhY3lfaW52b2tlZDsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUzoKKwkJKnBhcmFtID0gbG9jYWwtPnRraXBfY291bnRlcm1lYXN1cmVzOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX0RST1BfVU5FTkNSWVBURUQ6CisJCSpwYXJhbSA9IGxvY2FsLT5kcm9wX3VuZW5jcnlwdGVkOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX1BBUkFNX1NDQU5fQ0hBTk5FTF9NQVNLOgorCQkqcGFyYW0gPSBsb2NhbC0+c2Nhbl9jaGFubmVsX21hc2s7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBnZXRfcHJpc20yX3BhcmFtOiB1bmtub3duIHBhcmFtICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCAqcGFyYW0pOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9wcml2X3JlYWRtaWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICB2b2lkICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1MTYgcmVzcDA7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlpZiAobG9jYWwtPmZ1bmMtPmNtZChkZXYsIEhGQTM4NFhfQ01EQ09ERV9SRUFETUlGLCAqZXh0cmEsIE5VTEwsCisJCQkgICAgICZyZXNwMCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwllbHNlCisJCSpleHRyYSA9IHJlc3AwOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfcHJpdl93cml0ZW1pZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICAgdm9pZCAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJdTE2IGNyLCB2YWw7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwljciA9ICpleHRyYTsKKwl2YWwgPSAqKGV4dHJhICsgMSk7CisJaWYgKGxvY2FsLT5mdW5jLT5jbWQoZGV2LCBIRkEzODRYX0NNRENPREVfV1JJVEVNSUYsIGNyLCAmdmFsLCBOVUxMKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfcHJpdl9tb25pdG9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqaSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgbW9kZTsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogcHJvY2VzcyAlZCAoJXMpIHVzZWQgZGVwcmVjYXRlZCBpd3ByaXYgbW9uaXRvciAiCisJICAgICAgICItIHVwZGF0ZSBzb2Z0d2FyZSB0byB1c2UgaXdjb25maWcgbW9kZSBtb25pdG9yXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSk7CisKKwkvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGNvZGUgLSB0aGlzIGNhbiBiZSByZW1vdmVkIGF0IHNvbWUgcG9pbnQgKi8KKworCWlmICgqaSA9PSAwKSB7CisJCS8qIERpc2FibGUgbW9uaXRvciBtb2RlIC0gb2xkIG1vZGUgd2FzIG5vdCBzYXZlZCwgc28gZ28gdG8KKwkJICogTWFzdGVyIG1vZGUgKi8KKwkJbW9kZSA9IElXX01PREVfTUFTVEVSOworCQlyZXQgPSBwcmlzbTJfaW9jdGxfc2l3bW9kZShkZXYsIE5VTEwsICZtb2RlLCBOVUxMKTsKKwl9IGVsc2UgaWYgKCppID09IDEpIHsKKwkJLyogbmV0bGluayBzb2NrZXQgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUgc2luY2UgaXQgZGlkCisJCSAqIG5vdCBzZXBhcmF0ZSBkaWZmZXJlbnQgZGV2aWNlcyBmcm9tIGVhY2ggb3RoZXIgYW5kIHdhcyBub3QKKwkJICogYmVzdCBtZXRob2QgZm9yIGRlbGl2ZXJpbmcgbGFyZ2UgYW1vdW50IG9mIHBhY2tldHMgdG8KKwkJICogdXNlciBzcGFjZSAqLworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9IGVsc2UgaWYgKCppID09IDIgfHwgKmkgPT0gMykgeworCQlzd2l0Y2ggKCppKSB7CisJCWNhc2UgMjoKKwkJCWxvY2FsLT5tb25pdG9yX3R5cGUgPSBQUklTTTJfTU9OSVRPUl84MDIxMTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlsb2NhbC0+bW9uaXRvcl90eXBlID0gUFJJU00yX01PTklUT1JfUFJJU007CisJCQlicmVhazsKKwkJfQorCQltb2RlID0gSVdfTU9ERV9NT05JVE9SOworCQlyZXQgPSBwcmlzbTJfaW9jdGxfc2l3bW9kZShkZXYsIE5VTEwsICZtb2RlLCBOVUxMKTsKKwkJaG9zdGFwX21vbml0b3JfbW9kZV9lbmFibGUobG9jYWwpOworCX0gZWxzZQorCQlyZXQgPSAtRUlOVkFMOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9wcml2X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqaSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogbWFudWFsIHJlc2V0IHJlcXVlc3QoJWQpXG4iLCBkZXYtPm5hbWUsICppKTsKKwlzd2l0Y2ggKCppKSB7CisJY2FzZSAwOgorCQkvKiBEaXNhYmxlIGFuZCBlbmFibGUgY2FyZCAqLworCQlsb2NhbC0+ZnVuYy0+aHdfc2h1dGRvd24oZGV2LCAxKTsKKwkJbG9jYWwtPmZ1bmMtPmh3X2NvbmZpZyhkZXYsIDApOworCQlicmVhazsKKworCWNhc2UgMToKKwkJLyogQ09SIHNyZXNldCAqLworCQlsb2NhbC0+ZnVuYy0+aHdfcmVzZXQoZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCS8qIERpc2FibGUgYW5kIGVuYWJsZSBwb3J0IDAgKi8KKwkJbG9jYWwtPmZ1bmMtPnJlc2V0X3BvcnQoZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCXByaXNtMl9zdGFfZGVhdXRoKGxvY2FsLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CisJCWlmIChsb2NhbC0+ZnVuYy0+Y21kKGRldiwgSEZBMzg0WF9DTURDT0RFX0RJU0FCTEUsIDAsIE5VTEwsCisJCQkJICAgICBOVUxMKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgNDoKKwkJaWYgKGxvY2FsLT5mdW5jLT5jbWQoZGV2LCBIRkEzODRYX0NNRENPREVfRU5BQkxFLCAwLCBOVUxMLAorCQkJCSAgICAgTlVMTCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9ERUJVRyAiVW5rbm93biByZXNldCByZXF1ZXN0ICVkXG4iLCAqaSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9wcml2X3NldF9yaWRfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmkpCit7CisJaW50IHJpZCA9ICppOworCWludCB2YWx1ZSA9ICooaSArIDEpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTZXQgUklEWzB4JVhdID0gJWRcbiIsIGRldi0+bmFtZSwgcmlkLCB2YWx1ZSk7CisKKwlpZiAoaG9zdGFwX3NldF93b3JkKGRldiwgcmlkLCB2YWx1ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKworI2lmbmRlZiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UCitzdGF0aWMgaW50IGFwX21hY19jbWRfaW9jdGwobG9jYWxfaW5mb190ICpsb2NhbCwgaW50ICpjbWQpCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKCpjbWQpIHsKKwljYXNlIEFQX01BQ19DTURfUE9MSUNZX09QRU46CisJCWxvY2FsLT5hcC0+bWFjX3Jlc3RyaWN0aW9ucy5wb2xpY3kgPSBNQUNfUE9MSUNZX09QRU47CisJCWJyZWFrOworCWNhc2UgQVBfTUFDX0NNRF9QT0xJQ1lfQUxMT1c6CisJCWxvY2FsLT5hcC0+bWFjX3Jlc3RyaWN0aW9ucy5wb2xpY3kgPSBNQUNfUE9MSUNZX0FMTE9XOworCQlicmVhazsKKwljYXNlIEFQX01BQ19DTURfUE9MSUNZX0RFTlk6CisJCWxvY2FsLT5hcC0+bWFjX3Jlc3RyaWN0aW9ucy5wb2xpY3kgPSBNQUNfUE9MSUNZX0RFTlk7CisJCWJyZWFrOworCWNhc2UgQVBfTUFDX0NNRF9GTFVTSDoKKwkJYXBfY29udHJvbF9mbHVzaF9tYWNzKCZsb2NhbC0+YXAtPm1hY19yZXN0cmljdGlvbnMpOworCQlicmVhazsKKwljYXNlIEFQX01BQ19DTURfS0lDS0FMTDoKKwkJYXBfY29udHJvbF9raWNrYWxsKGxvY2FsLT5hcCk7CisJCWhvc3RhcF9kZWF1dGhfYWxsX3N0YXMobG9jYWwtPmRldiwgbG9jYWwtPmFwLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLworCisKKyNpZmRlZiBQUklTTTJfRE9XTkxPQURfU1VQUE9SVAorc3RhdGljIGludCBwcmlzbTJfaW9jdGxfcHJpdl9kb3dubG9hZChsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3QgaXdfcG9pbnQgKnApCit7CisJc3RydWN0IHByaXNtMl9kb3dubG9hZF9wYXJhbSAqcGFyYW07CisJaW50IHJldCA9IDA7CisKKwlpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBwcmlzbTJfZG93bmxvYWRfcGFyYW0pIHx8CisJICAgIHAtPmxlbmd0aCA+IDEwMjQgfHwgIXAtPnBvaW50ZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJcGFyYW0gPSAoc3RydWN0IHByaXNtMl9kb3dubG9hZF9wYXJhbSAqKQorCQlrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKHBhcmFtID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IHByaXNtMl9kb3dubG9hZF9wYXJhbSkgKworCSAgICBwYXJhbS0+bnVtX2FyZWFzICogc2l6ZW9mKHN0cnVjdCBwcmlzbTJfZG93bmxvYWRfYXJlYSkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbG9jYWwtPmZ1bmMtPmRvd25sb2FkKGxvY2FsLCBwYXJhbSk7CisKKyBvdXQ6CisJaWYgKHBhcmFtICE9IE5VTEwpCisJCWtmcmVlKHBhcmFtKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogUFJJU00yX0RPV05MT0FEX1NVUFBPUlQgKi8KKworCitzdGF0aWMgaW50IHByaXNtMl9zZXRfZ2VuZXJpY2VsZW1lbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmVsZW0sCisJCQkJICAgICBzaXplX3QgbGVuKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZSA9IGRldi0+cHJpdjsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gaWZhY2UtPmxvY2FsOworCXU4ICpidWY7CisKKwkvKgorCSAqIEFkZCAxNi1iaXQgbGVuZ3RoIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBiZWNhdXNlIFByaXNtMiBSSUQKKwkgKiBpbmNsdWRlcyBpdC4KKwkgKi8KKwlidWYgPSBrbWFsbG9jKGxlbiArIDIsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkqKCh1MTYgKikgYnVmKSA9IGNwdV90b19sZTE2KGxlbik7CisJbWVtY3B5KGJ1ZiArIDIsIGVsZW0sIGxlbik7CisKKwlrZnJlZShsb2NhbC0+Z2VuZXJpY19lbGVtKTsKKwlsb2NhbC0+Z2VuZXJpY19lbGVtID0gYnVmOworCWxvY2FsLT5nZW5lcmljX2VsZW1fbGVuID0gbGVuICsgMjsKKworCXJldHVybiBsb2NhbC0+ZnVuYy0+c2V0X3JpZChsb2NhbC0+ZGV2LCBIRkEzODRYX1JJRF9HRU5FUklDRUxFTUVOVCwKKwkJCQkgICAgYnVmLCBsZW4gKyAyKTsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9zaXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZSA9IGRldi0+cHJpdjsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJc3dpdGNoIChkYXRhLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKwljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKwljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKwkJLyoKKwkJICogSG9zdCBBUCBkcml2ZXIgZG9lcyBub3QgdXNlIHRoZXNlIHBhcmFtZXRlcnMgYW5kIGFsbG93cworCQkgKiB3cGFfc3VwcGxpY2FudCB0byBjb250cm9sIHRoZW0gaW50ZXJuYWxseS4KKwkJICovCisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9US0lQX0NPVU5URVJNRUFTVVJFUzoKKwkJbG9jYWwtPnRraXBfY291bnRlcm1lYXN1cmVzID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorCQlsb2NhbC0+ZHJvcF91bmVuY3J5cHRlZCA9IGRhdGEtPnZhbHVlOworCQlicmVhazsKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCWxvY2FsLT5hdXRoX2FsZ3MgPSBkYXRhLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlpZiAoZGF0YS0+dmFsdWUgPT0gMCkgeworCQkJbG9jYWwtPndwYSA9IDA7CisJCQlpZiAobG9jYWwtPnN0YV9md192ZXIgPCBQUklTTTJfRldfVkVSKDEsNywwKSkKKwkJCQlicmVhazsKKwkJCXByaXNtMl9zZXRfZ2VuZXJpY2VsZW1lbnQoZGV2LCAiIiwgMCk7CisJCQlsb2NhbC0+aG9zdF9yb2FtaW5nID0gMDsKKwkJCWxvY2FsLT5wcml2YWN5X2ludm9rZWQgPSAwOworCQkJaWYgKGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX1NTTkhBTkRMSU5HTU9ERSwKKwkJCQkJICAgIDApIHx8CisJCQkgICAgaG9zdGFwX3NldF9yb2FtaW5nKGxvY2FsKSB8fAorCQkJICAgIGhvc3RhcF9zZXRfZW5jcnlwdGlvbihsb2NhbCkgfHwKKwkJCSAgICBsb2NhbC0+ZnVuYy0+cmVzZXRfcG9ydChkZXYpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGxvY2FsLT5zdGFfZndfdmVyIDwgUFJJU00yX0ZXX1ZFUigxLDcsMCkpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWxvY2FsLT5ob3N0X3JvYW1pbmcgPSAyOworCQlsb2NhbC0+cHJpdmFjeV9pbnZva2VkID0gMTsKKwkJbG9jYWwtPndwYSA9IDE7CisJCWlmIChob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9TU05IQU5ETElOR01PREUsIDEpIHx8CisJCSAgICBob3N0YXBfc2V0X3JvYW1pbmcobG9jYWwpIHx8CisJCSAgICBob3N0YXBfc2V0X2VuY3J5cHRpb24obG9jYWwpIHx8CisJCSAgICBsb2NhbC0+ZnVuYy0+cmVzZXRfcG9ydChkZXYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKwkJbG9jYWwtPmllZWVfODAyXzF4ID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CisJCWxvY2FsLT5wcml2YWN5X2ludm9rZWQgPSBkYXRhLT52YWx1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9naXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZSA9IGRldi0+cHJpdjsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJc3dpdGNoIChkYXRhLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKwljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKwljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKwkJLyoKKwkJICogSG9zdCBBUCBkcml2ZXIgZG9lcyBub3QgdXNlIHRoZXNlIHBhcmFtZXRlcnMgYW5kIGFsbG93cworCQkgKiB3cGFfc3VwcGxpY2FudCB0byBjb250cm9sIHRoZW0gaW50ZXJuYWxseS4KKwkJICovCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwljYXNlIElXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVM6CisJCWRhdGEtPnZhbHVlID0gbG9jYWwtPnRraXBfY291bnRlcm1lYXN1cmVzOworCQlicmVhazsKKwljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKwkJZGF0YS0+dmFsdWUgPSBsb2NhbC0+ZHJvcF91bmVuY3J5cHRlZDsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQlkYXRhLT52YWx1ZSA9IGxvY2FsLT5hdXRoX2FsZ3M7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJZGF0YS0+dmFsdWUgPSBsb2NhbC0+d3BhOworCQlicmVhazsKKwljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisJCWRhdGEtPnZhbHVlID0gbG9jYWwtPmllZWVfODAyXzF4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2lvY3RsX3Npd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2UgPSBkZXYtPnByaXY7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopIGV4dHJhOworCWludCBpLCByZXQgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0OworCXZvaWQgKnN0YV9wdHI7CisJdTggKmFkZHI7CisJY29uc3QgY2hhciAqYWxnLCAqbW9kdWxlOworCisJaSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGkgPiBXRVBfS0VZUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGkgPCAxIHx8IGkgPiBXRVBfS0VZUykKKwkJaSA9IGxvY2FsLT50eF9rZXlpZHg7CisJZWxzZQorCQlpLS07CisJaWYgKGkgPCAwIHx8IGkgPj0gV0VQX0tFWVMpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRkciA9IGV4dC0+YWRkci5zYV9kYXRhOworCWlmIChhZGRyWzBdID09IDB4ZmYgJiYgYWRkclsxXSA9PSAweGZmICYmIGFkZHJbMl0gPT0gMHhmZiAmJgorCSAgICBhZGRyWzNdID09IDB4ZmYgJiYgYWRkcls0XSA9PSAweGZmICYmIGFkZHJbNV0gPT0gMHhmZikgeworCQlzdGFfcHRyID0gTlVMTDsKKwkJY3J5cHQgPSAmbG9jYWwtPmNyeXB0W2ldOworCX0gZWxzZSB7CisJCWlmIChpICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhX3B0ciA9IGFwX2NyeXB0X2dldF9wdHJzKGxvY2FsLT5hcCwgYWRkciwgMCwgJmNyeXB0KTsKKwkJaWYgKHN0YV9wdHIgPT0gTlVMTCkgeworCQkJaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKKwkJCQkvKgorCQkJCSAqIFRPRE86IGFkZCBTVEEgZW50cnkgZm9yIHRoZSBjdXJyZW50IEFQIHNvCisJCQkJICogdGhhdCB1bmljYXN0IGtleSBjYW4gYmUgdXNlZC4gRm9yIG5vdywgdGhpcworCQkJCSAqIGlzIGVtdWxhdGVkIGJ5IHVzaW5nIGRlZmF1bHQga2V5IGlkeCAwLgorCQkJCSAqLworCQkJCWkgPSAwOworCQkJCWNyeXB0ID0gJmxvY2FsLT5jcnlwdFtpXTsKKwkJCX0gZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB8fAorCSAgICBleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX05PTkUpIHsKKwkJaWYgKCpjcnlwdCkKKwkJCXByaXNtMl9jcnlwdF9kZWxheWVkX2RlaW5pdChsb2NhbCwgY3J5cHQpOworCQlnb3RvIGRvbmU7CisJfQorCisJc3dpdGNoIChleHQtPmFsZykgeworCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisJCWFsZyA9ICJXRVAiOworCQltb2R1bGUgPSAiaWVlZTgwMjExX2NyeXB0X3dlcCI7CisJCWJyZWFrOworCWNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgorCQlhbGcgPSAiVEtJUCI7CisJCW1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfdGtpcCI7CisJCWJyZWFrOworCWNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorCQlhbGcgPSAiQ0NNUCI7CisJCW1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfY2NtcCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5zdXBwb3J0ZWQgYWxnb3JpdGhtICVkXG4iLAorCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSwgZXh0LT5hbGcpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBkb25lOworCX0KKworCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhhbGcpOworCWlmIChvcHMgPT0gTlVMTCkgeworCQlyZXF1ZXN0X21vZHVsZShtb2R1bGUpOworCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoYWxnKTsKKwl9CisJaWYgKG9wcyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5rbm93biBjcnlwdG8gYWxnICclcydcbiIsCisJCSAgICAgICBsb2NhbC0+ZGV2LT5uYW1lLCBhbGcpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChzdGFfcHRyIHx8IGV4dC0+YWxnICE9IElXX0VOQ09ERV9BTEdfV0VQKSB7CisJCS8qCisJCSAqIFBlciBzdGF0aW9uIGVuY3J5cHRpb24gYW5kIG90aGVyIHRoYW4gV0VQIGFsZ29yaXRobXMKKwkJICogcmVxdWlyZSBob3N0LWJhc2VkIGVuY3J5cHRpb24sIHNvIGZvcmNlIHRoZW0gb24KKwkJICogYXV0b21hdGljYWxseS4KKwkJICovCisJCWxvY2FsLT5ob3N0X2RlY3J5cHQgPSBsb2NhbC0+aG9zdF9lbmNyeXB0ID0gMTsKKwl9CisKKwlpZiAoKmNyeXB0ID09IE5VTEwgfHwgKCpjcnlwdCktPm9wcyAhPSBvcHMpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpuZXdfY3J5cHQ7CisKKwkJcHJpc20yX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGxvY2FsLCBjcnlwdCk7CisKKwkJbmV3X2NyeXB0ID0gKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKQorCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBkb25lOworCQl9CisJCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpKTsKKwkJbmV3X2NyeXB0LT5vcHMgPSBvcHM7CisJCW5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGkpOworCQlpZiAobmV3X2NyeXB0LT5wcml2ID09IE5VTEwpIHsKKwkJCWtmcmVlKG5ld19jcnlwdCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisKKwkJKmNyeXB0ID0gbmV3X2NyeXB0OworCX0KKworCS8qCisJICogVE9ETzogaWYgZXh0X2ZsYWdzIGRvZXMgbm90IGhhdmUgSVdfRU5DT0RFX0VYVF9SWF9TRVFfVkFMSUQsIHRoZQorCSAqIGV4aXN0aW5nIHNlcSMgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLgorCSAqIFRPRE86IGlmIGV4dF9mbGFncyBoYXMgSVdfRU5DT0RFX0VYVF9UWF9TRVFfVkFMSUQsIG5leHQgVFggc2VxIworCSAqIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBlbHNlIHRoYW4gemVyby4KKwkgKi8KKwlpZiAoKCEoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpIHx8IGV4dC0+a2V5X2xlbiA+IDApCisJICAgICYmICgqY3J5cHQpLT5vcHMtPnNldF9rZXkgJiYKKwkgICAgKCpjcnlwdCktPm9wcy0+c2V0X2tleShleHQtPmtleSwgZXh0LT5rZXlfbGVuLCBleHQtPnJ4X3NlcSwKKwkJCQkgICAoKmNyeXB0KS0+cHJpdikgPCAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczoga2V5IHNldHRpbmcgZmFpbGVkXG4iLAorCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpIHsKKwkJaWYgKCFzdGFfcHRyKQorCQkJbG9jYWwtPnR4X2tleWlkeCA9IGk7CisJCWVsc2UgaWYgKGkpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKworCWlmIChzdGFfcHRyID09IE5VTEwgJiYgZXh0LT5rZXlfbGVuID4gMCkgeworCQlpbnQgZmlyc3QgPSAxLCBqOworCQlmb3IgKGogPSAwOyBqIDwgV0VQX0tFWVM7IGorKykgeworCQkJaWYgKGogIT0gaSAmJiBsb2NhbC0+Y3J5cHRbal0pIHsKKwkJCQlmaXJzdCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGZpcnN0KQorCQkJbG9jYWwtPnR4X2tleWlkeCA9IGk7CisJfQorCisgZG9uZToKKwlpZiAoc3RhX3B0cikKKwkJaG9zdGFwX2hhbmRsZV9zdGFfcmVsZWFzZShzdGFfcHRyKTsKKworCWxvY2FsLT5vcGVuX3dlcCA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTjsKKworCS8qCisJICogRG8gbm90IHJlc2V0IHBvcnQwIGlmIGNhcmQgaXMgaW4gTWFuYWdlZCBtb2RlIHNpbmNlIHJlc2V0dGluZyB3aWxsCisJICogZ2VuZXJhdGUgbmV3IElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIHdoaWNoIG1heSBlbmQgdXAgaW4gbG9vcGluZworCSAqIHdpdGggSUVFRSA4MDIuMVguIFByaXNtMiBkb2N1bWVudGF0aW9uIHNlZW0gdG8gcmVxdWlyZSBwb3J0IHJlc2V0CisJICogYWZ0ZXIgV0VQIGNvbmZpZ3VyYXRpb24uIEhvd2V2ZXIsIGtleXMgYXJlIGFwcGFyZW50bHkgY2hhbmdlZCBhdAorCSAqIGxlYXN0IGluIE1hbmFnZWQgbW9kZS4KKwkgKi8KKwlpZiAocmV0ID09IDAgJiYKKwkgICAgKGhvc3RhcF9zZXRfZW5jcnlwdGlvbihsb2NhbCkgfHwKKwkgICAgIChsb2NhbC0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisJICAgICAgbG9jYWwtPmZ1bmMtPnJlc2V0X3BvcnQobG9jYWwtPmRldikpKSkKKwkJcmV0ID0gLUVJTlZBTDsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfZ2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZSA9IGRldi0+cHJpdjsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gaWZhY2UtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0OworCXZvaWQgKnN0YV9wdHI7CisJaW50IG1heF9rZXlfbGVuLCBpOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKikgZXh0cmE7CisJdTggKmFkZHI7CisKKwltYXhfa2V5X2xlbiA9IGVycS0+bGVuZ3RoIC0gc2l6ZW9mKCpleHQpOworCWlmIChtYXhfa2V5X2xlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGkgPCAxIHx8IGkgPiBXRVBfS0VZUykKKwkJaSA9IGxvY2FsLT50eF9rZXlpZHg7CisJZWxzZQorCQlpLS07CisKKwlhZGRyID0gZXh0LT5hZGRyLnNhX2RhdGE7CisJaWYgKGFkZHJbMF0gPT0gMHhmZiAmJiBhZGRyWzFdID09IDB4ZmYgJiYgYWRkclsyXSA9PSAweGZmICYmCisJICAgIGFkZHJbM10gPT0gMHhmZiAmJiBhZGRyWzRdID09IDB4ZmYgJiYgYWRkcls1XSA9PSAweGZmKSB7CisJCXN0YV9wdHIgPSBOVUxMOworCQljcnlwdCA9ICZsb2NhbC0+Y3J5cHRbaV07CisJfSBlbHNlIHsKKwkJaSA9IDA7CisJCXN0YV9wdHIgPSBhcF9jcnlwdF9nZXRfcHRycyhsb2NhbC0+YXAsIGFkZHIsIDAsICZjcnlwdCk7CisJCWlmIChzdGFfcHRyID09IE5VTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZXJxLT5mbGFncyA9IGkgKyAxOworCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CisKKwlpZiAoKmNyeXB0ID09IE5VTEwgfHwgKCpjcnlwdCktPm9wcyA9PSBOVUxMKSB7CisJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQlleHQtPmtleV9sZW4gPSAwOworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9IGVsc2UgeworCQlpZiAoc3RyY21wKCgqY3J5cHQpLT5vcHMtPm5hbWUsICJXRVAiKSA9PSAwKQorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJZWxzZSBpZiAoc3RyY21wKCgqY3J5cHQpLT5vcHMtPm5hbWUsICJUS0lQIikgPT0gMCkKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOworCQllbHNlIGlmIChzdHJjbXAoKCpjcnlwdCktPm9wcy0+bmFtZSwgIkNDTVAiKSA9PSAwKQorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX0NDTVA7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICgoKmNyeXB0KS0+b3BzLT5nZXRfa2V5KSB7CisJCQlleHQtPmtleV9sZW4gPQorCQkJCSgqY3J5cHQpLT5vcHMtPmdldF9rZXkoZXh0LT5rZXksCisJCQkJCQkgICAgICAgbWF4X2tleV9sZW4sCisJCQkJCQkgICAgICAgZXh0LT50eF9zZXEsCisJCQkJCQkgICAgICAgKCpjcnlwdCktPnByaXYpOworCQkJaWYgKGV4dC0+a2V5X2xlbiAmJgorCQkJICAgIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX1RLSVAgfHwKKwkJCSAgICAgZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKSkKKwkJCQlleHQtPmV4dF9mbGFncyB8PSBJV19FTkNPREVfRVhUX1RYX1NFUV9WQUxJRDsKKwkJfQorCX0KKworCWlmIChzdGFfcHRyKQorCQlob3N0YXBfaGFuZGxlX3N0YV9yZWxlYXNlKHN0YV9wdHIpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfc2V0X2VuY3J5cHRpb24obG9jYWxfaW5mb190ICpsb2NhbCwKKwkJCQkgICAgICAgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSwKKwkJCQkgICAgICAgaW50IHBhcmFtX2xlbikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKKwl2b2lkICpzdGFfcHRyOworCisJcGFyYW0tPnUuY3J5cHQuZXJyID0gMDsKKwlwYXJhbS0+dS5jcnlwdC5hbGdbSE9TVEFQX0NSWVBUX0FMR19OQU1FX0xFTiAtIDFdID0gJ1wwJzsKKworCWlmIChwYXJhbV9sZW4gIT0KKwkgICAgKGludCkgKChjaGFyICopIHBhcmFtLT51LmNyeXB0LmtleSAtIChjaGFyICopIHBhcmFtKSArCisJICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBhcmFtLT5zdGFfYWRkclswXSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkclsxXSA9PSAweGZmICYmCisJICAgIHBhcmFtLT5zdGFfYWRkclsyXSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkclszXSA9PSAweGZmICYmCisJICAgIHBhcmFtLT5zdGFfYWRkcls0XSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkcls1XSA9PSAweGZmKSB7CisJCWlmIChwYXJhbS0+dS5jcnlwdC5pZHggPj0gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhX3B0ciA9IE5VTEw7CisJCWNyeXB0ID0gJmxvY2FsLT5jcnlwdFtwYXJhbS0+dS5jcnlwdC5pZHhdOworCX0gZWxzZSB7CisJCWlmIChwYXJhbS0+dS5jcnlwdC5pZHgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhX3B0ciA9IGFwX2NyeXB0X2dldF9wdHJzKAorCQkJbG9jYWwtPmFwLCBwYXJhbS0+c3RhX2FkZHIsCisJCQkocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBIT1NUQVBfQ1JZUFRfRkxBR19QRVJNQU5FTlQpLAorCQkJJmNyeXB0KTsKKworCQlpZiAoc3RhX3B0ciA9PSBOVUxMKSB7CisJCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBIT1NUQVBfQ1JZUFRfRVJSX1VOS05PV05fQUREUjsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJub25lIikgPT0gMCkgeworCQlpZiAoY3J5cHQpCisJCQlwcmlzbTJfY3J5cHRfZGVsYXllZF9kZWluaXQobG9jYWwsIGNyeXB0KTsKKwkJZ290byBkb25lOworCX0KKworCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCWlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiV0VQIikgPT0gMCkgeworCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3dlcCIpOworCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKKwl9IGVsc2UgaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkgeworCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3RraXAiKTsKKwkJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJfSBlbHNlIGlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApIHsKKwkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF9jY21wIik7CisJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCX0KKwlpZiAob3BzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1bmtub3duIGNyeXB0byBhbGcgJyVzJ1xuIiwKKwkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUsIHBhcmFtLT51LmNyeXB0LmFsZyk7CisJCXBhcmFtLT51LmNyeXB0LmVyciA9IEhPU1RBUF9DUllQVF9FUlJfVU5LTk9XTl9BTEc7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBzdGF0aW9uIGJhc2VkIGVuY3J5cHRpb24gYW5kIG90aGVyIHRoYW4gV0VQIGFsZ29yaXRobXMgcmVxdWlyZQorCSAqIGhvc3QtYmFzZWQgZW5jcnlwdGlvbiwgc28gZm9yY2UgdGhlbSBvbiBhdXRvbWF0aWNhbGx5ICovCisJbG9jYWwtPmhvc3RfZGVjcnlwdCA9IGxvY2FsLT5ob3N0X2VuY3J5cHQgPSAxOworCisJaWYgKCpjcnlwdCA9PSBOVUxMIHx8ICgqY3J5cHQpLT5vcHMgIT0gb3BzKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OworCisJCXByaXNtMl9jcnlwdF9kZWxheWVkX2RlaW5pdChsb2NhbCwgY3J5cHQpOworCisJCW5ld19jcnlwdCA9IChzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKikKKwkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSksCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChuZXdfY3J5cHQgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQltZW1zZXQobmV3X2NyeXB0LCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSk7CisJCW5ld19jcnlwdC0+b3BzID0gb3BzOworCQluZXdfY3J5cHQtPnByaXYgPSBuZXdfY3J5cHQtPm9wcy0+aW5pdChwYXJhbS0+dS5jcnlwdC5pZHgpOworCQlpZiAobmV3X2NyeXB0LT5wcml2ID09IE5VTEwpIHsKKwkJCWtmcmVlKG5ld19jcnlwdCk7CisJCQlwYXJhbS0+dS5jcnlwdC5lcnIgPQorCQkJCUhPU1RBUF9DUllQVF9FUlJfQ1JZUFRfSU5JVF9GQUlMRUQ7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisKKwkJKmNyeXB0ID0gbmV3X2NyeXB0OworCX0KKworCWlmICgoIShwYXJhbS0+dS5jcnlwdC5mbGFncyAmIEhPU1RBUF9DUllQVF9GTEFHX1NFVF9UWF9LRVkpIHx8CisJICAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuID4gMCkgJiYgKCpjcnlwdCktPm9wcy0+c2V0X2tleSAmJgorCSAgICAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KHBhcmFtLT51LmNyeXB0LmtleSwKKwkJCQkgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuLCBwYXJhbS0+dS5jcnlwdC5zZXEsCisJCQkJICAgKCpjcnlwdCktPnByaXYpIDwgMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGtleSBzZXR0aW5nIGZhaWxlZFxuIiwKKwkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUpOworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBIT1NUQVBfQ1JZUFRfRVJSX0tFWV9TRVRfRkFJTEVEOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSE9TVEFQX0NSWVBUX0ZMQUdfU0VUX1RYX0tFWSkgeworCQlpZiAoIXN0YV9wdHIpCisJCQlsb2NhbC0+dHhfa2V5aWR4ID0gcGFyYW0tPnUuY3J5cHQuaWR4OworCQllbHNlIGlmIChwYXJhbS0+dS5jcnlwdC5pZHgpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVFgga2V5IGlkeCBzZXR0aW5nIGZhaWxlZFxuIiwKKwkJCSAgICAgICBsb2NhbC0+ZGV2LT5uYW1lKTsKKwkJCXBhcmFtLT51LmNyeXB0LmVyciA9CisJCQkJSE9TVEFQX0NSWVBUX0VSUl9UWF9LRVlfU0VUX0ZBSUxFRDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKyBkb25lOgorCWlmIChzdGFfcHRyKQorCQlob3N0YXBfaGFuZGxlX3N0YV9yZWxlYXNlKHN0YV9wdHIpOworCisJLyogRG8gbm90IHJlc2V0IHBvcnQwIGlmIGNhcmQgaXMgaW4gTWFuYWdlZCBtb2RlIHNpbmNlIHJlc2V0dGluZyB3aWxsCisJICogZ2VuZXJhdGUgbmV3IElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIHdoaWNoIG1heSBlbmQgdXAgaW4gbG9vcGluZworCSAqIHdpdGggSUVFRSA4MDIuMVguIFByaXNtMiBkb2N1bWVudGF0aW9uIHNlZW0gdG8gcmVxdWlyZSBwb3J0IHJlc2V0CisJICogYWZ0ZXIgV0VQIGNvbmZpZ3VyYXRpb24uIEhvd2V2ZXIsIGtleXMgYXJlIGFwcGFyZW50bHkgY2hhbmdlZCBhdAorCSAqIGxlYXN0IGluIE1hbmFnZWQgbW9kZS4gKi8KKwlpZiAocmV0ID09IDAgJiYKKwkgICAgKGhvc3RhcF9zZXRfZW5jcnlwdGlvbihsb2NhbCkgfHwKKwkgICAgIChsb2NhbC0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisJICAgICAgbG9jYWwtPmZ1bmMtPnJlc2V0X3BvcnQobG9jYWwtPmRldikpKSkgeworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBIT1NUQVBfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQ7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfZ2V0X2VuY3J5cHRpb24obG9jYWxfaW5mb190ICpsb2NhbCwKKwkJCQkgICAgICAgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSwKKwkJCQkgICAgICAgaW50IHBhcmFtX2xlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKKwl2b2lkICpzdGFfcHRyOworCWludCBtYXhfa2V5X2xlbjsKKworCXBhcmFtLT51LmNyeXB0LmVyciA9IDA7CisKKwltYXhfa2V5X2xlbiA9IHBhcmFtX2xlbiAtCisJCShpbnQpICgoY2hhciAqKSBwYXJhbS0+dS5jcnlwdC5rZXkgLSAoY2hhciAqKSBwYXJhbSk7CisJaWYgKG1heF9rZXlfbGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFyYW0tPnN0YV9hZGRyWzBdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzFdID09IDB4ZmYgJiYKKwkgICAgcGFyYW0tPnN0YV9hZGRyWzJdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzNdID09IDB4ZmYgJiYKKwkgICAgcGFyYW0tPnN0YV9hZGRyWzRdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzVdID09IDB4ZmYpIHsKKwkJc3RhX3B0ciA9IE5VTEw7CisJCWlmIChwYXJhbS0+dS5jcnlwdC5pZHggPj0gV0VQX0tFWVMpCisJCQlwYXJhbS0+dS5jcnlwdC5pZHggPSBsb2NhbC0+dHhfa2V5aWR4OworCQljcnlwdCA9ICZsb2NhbC0+Y3J5cHRbcGFyYW0tPnUuY3J5cHQuaWR4XTsKKwl9IGVsc2UgeworCQlwYXJhbS0+dS5jcnlwdC5pZHggPSAwOworCQlzdGFfcHRyID0gYXBfY3J5cHRfZ2V0X3B0cnMobG9jYWwtPmFwLCBwYXJhbS0+c3RhX2FkZHIsIDAsCisJCQkJCSAgICAmY3J5cHQpOworCisJCWlmIChzdGFfcHRyID09IE5VTEwpIHsKKwkJCXBhcmFtLT51LmNyeXB0LmVyciA9IEhPU1RBUF9DUllQVF9FUlJfVU5LTk9XTl9BRERSOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoKmNyeXB0ID09IE5VTEwgfHwgKCpjcnlwdCktPm9wcyA9PSBOVUxMKSB7CisJCW1lbWNweShwYXJhbS0+dS5jcnlwdC5hbGcsICJub25lIiwgNSk7CisJCXBhcmFtLT51LmNyeXB0LmtleV9sZW4gPSAwOworCQlwYXJhbS0+dS5jcnlwdC5pZHggPSAweGZmOworCX0gZWxzZSB7CisJCXN0cm5jcHkocGFyYW0tPnUuY3J5cHQuYWxnLCAoKmNyeXB0KS0+b3BzLT5uYW1lLAorCQkJSE9TVEFQX0NSWVBUX0FMR19OQU1FX0xFTik7CisJCXBhcmFtLT51LmNyeXB0LmtleV9sZW4gPSAwOworCisJCW1lbXNldChwYXJhbS0+dS5jcnlwdC5zZXEsIDAsIDgpOworCQlpZiAoKCpjcnlwdCktPm9wcy0+Z2V0X2tleSkgeworCQkJcGFyYW0tPnUuY3J5cHQua2V5X2xlbiA9CisJCQkJKCpjcnlwdCktPm9wcy0+Z2V0X2tleShwYXJhbS0+dS5jcnlwdC5rZXksCisJCQkJCQkgICAgICAgbWF4X2tleV9sZW4sCisJCQkJCQkgICAgICAgcGFyYW0tPnUuY3J5cHQuc2VxLAorCQkJCQkJICAgICAgICgqY3J5cHQpLT5wcml2KTsKKwkJfQorCX0KKworCWlmIChzdGFfcHRyKQorCQlob3N0YXBfaGFuZGxlX3N0YV9yZWxlYXNlKHN0YV9wdHIpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfZ2V0X3JpZChsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJCXN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0sCisJCQkJaW50IHBhcmFtX2xlbikKK3sKKwlpbnQgbWF4X2xlbiwgcmVzOworCisJbWF4X2xlbiA9IHBhcmFtX2xlbiAtIFBSSVNNMl9IT1NUQVBEX1JJRF9IRFJfTEVOOworCWlmIChtYXhfbGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXMgPSBsb2NhbC0+ZnVuYy0+Z2V0X3JpZChsb2NhbC0+ZGV2LCBwYXJhbS0+dS5yaWQucmlkLAorCQkJCSAgIHBhcmFtLT51LnJpZC5kYXRhLCBwYXJhbS0+dS5yaWQubGVuLCAwKTsKKwlpZiAocmVzID49IDApIHsKKwkJcGFyYW0tPnUucmlkLmxlbiA9IHJlczsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9zZXRfcmlkKGxvY2FsX2luZm9fdCAqbG9jYWwsCisJCQkJc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSwKKwkJCQlpbnQgcGFyYW1fbGVuKQoreworCWludCBtYXhfbGVuOworCisJbWF4X2xlbiA9IHBhcmFtX2xlbiAtIFBSSVNNMl9IT1NUQVBEX1JJRF9IRFJfTEVOOworCWlmIChtYXhfbGVuIDwgMCB8fCBtYXhfbGVuIDwgcGFyYW0tPnUucmlkLmxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gbG9jYWwtPmZ1bmMtPnNldF9yaWQobG9jYWwtPmRldiwgcGFyYW0tPnUucmlkLnJpZCwKKwkJCQkgICAgcGFyYW0tPnUucmlkLmRhdGEsIHBhcmFtLT51LnJpZC5sZW4pOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2lvY3RsX3NldF9hc3NvY19hcF9hZGRyKGxvY2FsX2luZm9fdCAqbG9jYWwsCisJCQkJCSAgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSwKKwkJCQkJICBpbnQgcGFyYW1fbGVuKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlc3N0YTogYXNzb2NpYXRlZCBhcyBjbGllbnQgd2l0aCBBUCAiIE1BQ1NUUiAiXG4iLAorCSAgICAgICBsb2NhbC0+ZGV2LT5uYW1lLCBNQUMyU1RSKHBhcmFtLT5zdGFfYWRkcikpOworCW1lbWNweShsb2NhbC0+YXNzb2NfYXBfYWRkciwgcGFyYW0tPnN0YV9hZGRyLCBFVEhfQUxFTik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfc2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlyZXR1cm4gcHJpc20yX3NldF9nZW5lcmljZWxlbWVudChkZXYsIGV4dHJhLCBkYXRhLT5sZW5ndGgpOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2lvY3RsX2dpd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlID0gZGV2LT5wcml2OworCWxvY2FsX2luZm9fdCAqbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisJaW50IGxlbiA9IGxvY2FsLT5nZW5lcmljX2VsZW1fbGVuIC0gMjsKKworCWlmIChsZW4gPD0gMCB8fCBsb2NhbC0+Z2VuZXJpY19lbGVtID09IE5VTEwpIHsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRhdGEtPmxlbmd0aCA8IGxlbikKKwkJcmV0dXJuIC1FMkJJRzsKKworCWRhdGEtPmxlbmd0aCA9IGxlbjsKKwltZW1jcHkoZXh0cmEsIGxvY2FsLT5nZW5lcmljX2VsZW0gKyAyLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfc2V0X2dlbmVyaWNfZWxlbWVudChsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJCQkgICAgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSwKKwkJCQkJICAgIGludCBwYXJhbV9sZW4pCit7CisJaW50IG1heF9sZW4sIGxlbjsKKworCWxlbiA9IHBhcmFtLT51LmdlbmVyaWNfZWxlbS5sZW47CisJbWF4X2xlbiA9IHBhcmFtX2xlbiAtIFBSSVNNMl9IT1NUQVBEX0dFTkVSSUNfRUxFTUVOVF9IRFJfTEVOOworCWlmIChtYXhfbGVuIDwgMCB8fCBtYXhfbGVuIDwgbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBwcmlzbTJfc2V0X2dlbmVyaWNlbGVtZW50KGxvY2FsLT5kZXYsCisJCQkJCSBwYXJhbS0+dS5nZW5lcmljX2VsZW0uZGF0YSwgbGVuKTsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9pb2N0bF9zaXdtbG1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZSA9IGRldi0+cHJpdjsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gaWZhY2UtPmxvY2FsOworCXN0cnVjdCBpd19tbG1lICptbG1lID0gKHN0cnVjdCBpd19tbG1lICopIGV4dHJhOworCXUxNiByZWFzb247CisKKwlyZWFzb24gPSBjcHVfdG9fbGUxNihtbG1lLT5yZWFzb25fY29kZSk7CisKKwlzd2l0Y2ggKG1sbWUtPmNtZCkgeworCWNhc2UgSVdfTUxNRV9ERUFVVEg6CisJCXJldHVybiBwcmlzbTJfc3RhX3NlbmRfbWdtdChsb2NhbCwgbWxtZS0+YWRkci5zYV9kYXRhLAorCQkJCQkgICAgSUVFRTgwMjExX1NUWVBFX0RFQVVUSCwKKwkJCQkJICAgICh1OCAqKSAmcmVhc29uLCAyKTsKKwljYXNlIElXX01MTUVfRElTQVNTT0M6CisJCXJldHVybiBwcmlzbTJfc3RhX3NlbmRfbWdtdChsb2NhbCwgbWxtZS0+YWRkci5zYV9kYXRhLAorCQkJCQkgICAgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DLAorCQkJCQkgICAgKHU4ICopICZyZWFzb24sIDIpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfbWxtZShsb2NhbF9pbmZvX3QgKmxvY2FsLAorCQkJICAgICBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtKQoreworCXUxNiByZWFzb247CisKKwlyZWFzb24gPSBjcHVfdG9fbGUxNihwYXJhbS0+dS5tbG1lLnJlYXNvbl9jb2RlKTsKKwlzd2l0Y2ggKHBhcmFtLT51Lm1sbWUuY21kKSB7CisJY2FzZSBNTE1FX1NUQV9ERUFVVEg6CisJCXJldHVybiBwcmlzbTJfc3RhX3NlbmRfbWdtdChsb2NhbCwgcGFyYW0tPnN0YV9hZGRyLAorCQkJCQkgICAgSUVFRTgwMjExX1NUWVBFX0RFQVVUSCwKKwkJCQkJICAgICh1OCAqKSAmcmVhc29uLCAyKTsKKwljYXNlIE1MTUVfU1RBX0RJU0FTU09DOgorCQlyZXR1cm4gcHJpc20yX3N0YV9zZW5kX21nbXQobG9jYWwsIHBhcmFtLT5zdGFfYWRkciwKKwkJCQkJICAgIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQywKKwkJCQkJICAgICh1OCAqKSAmcmVhc29uLCAyKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX2lvY3RsX3NjYW5fcmVxKGxvY2FsX2luZm9fdCAqbG9jYWwsCisJCQkJIHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0pCit7CisjaWZuZGVmIFBSSVNNMl9OT19TVEFUSU9OX01PREVTCisJaWYgKChsb2NhbC0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisJICAgICBsb2NhbC0+aXdfbW9kZSAhPSBJV19NT0RFX0FESE9DKSB8fAorCSAgICAobG9jYWwtPnN0YV9md192ZXIgPCBQUklTTTJfRldfVkVSKDEsMywxKSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghbG9jYWwtPmRldl9lbmFibGVkKQorCQlyZXR1cm4gLUVORVRET1dOOworCisJcmV0dXJuIHByaXNtMl9yZXF1ZXN0X2hvc3RzY2FuKGxvY2FsLT5kZXYsIHBhcmFtLT51LnNjYW5fcmVxLnNzaWQsCisJCQkJICAgICAgIHBhcmFtLT51LnNjYW5fcmVxLnNzaWRfbGVuKTsKKyNlbHNlIC8qIFBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmIC8qIFBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCit9CisKKworc3RhdGljIGludCBwcmlzbTJfaW9jdGxfcHJpdl9ob3N0YXBkKGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBpd19wb2ludCAqcCkKK3sKKwlzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtOworCWludCByZXQgPSAwOworCWludCBhcF9pb2N0bCA9IDA7CisKKwlpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSkgfHwKKwkgICAgcC0+bGVuZ3RoID4gUFJJU00yX0hPU1RBUERfTUFYX0JVRl9TSVpFIHx8ICFwLT5wb2ludGVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhcmFtID0gKHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqKSBrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKHBhcmFtID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAocGFyYW0tPmNtZCkgeworCWNhc2UgUFJJU00yX1NFVF9FTkNSWVBUSU9OOgorCQlyZXQgPSBwcmlzbTJfaW9jdGxfc2V0X2VuY3J5cHRpb24obG9jYWwsIHBhcmFtLCBwLT5sZW5ndGgpOworCQlicmVhazsKKwljYXNlIFBSSVNNMl9HRVRfRU5DUllQVElPTjoKKwkJcmV0ID0gcHJpc20yX2lvY3RsX2dldF9lbmNyeXB0aW9uKGxvY2FsLCBwYXJhbSwgcC0+bGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBQUklTTTJfSE9TVEFQRF9HRVRfUklEOgorCQlyZXQgPSBwcmlzbTJfaW9jdGxfZ2V0X3JpZChsb2NhbCwgcGFyYW0sIHAtPmxlbmd0aCk7CisJCWJyZWFrOworCWNhc2UgUFJJU00yX0hPU1RBUERfU0VUX1JJRDoKKwkJcmV0ID0gcHJpc20yX2lvY3RsX3NldF9yaWQobG9jYWwsIHBhcmFtLCBwLT5sZW5ndGgpOworCQlicmVhazsKKwljYXNlIFBSSVNNMl9IT1NUQVBEX1NFVF9BU1NPQ19BUF9BRERSOgorCQlyZXQgPSBwcmlzbTJfaW9jdGxfc2V0X2Fzc29jX2FwX2FkZHIobG9jYWwsIHBhcmFtLCBwLT5sZW5ndGgpOworCQlicmVhazsKKwljYXNlIFBSSVNNMl9IT1NUQVBEX1NFVF9HRU5FUklDX0VMRU1FTlQ6CisJCXJldCA9IHByaXNtMl9pb2N0bF9zZXRfZ2VuZXJpY19lbGVtZW50KGxvY2FsLCBwYXJhbSwKKwkJCQkJCSAgICAgICBwLT5sZW5ndGgpOworCQlicmVhazsKKwljYXNlIFBSSVNNMl9IT1NUQVBEX01MTUU6CisJCXJldCA9IHByaXNtMl9pb2N0bF9tbG1lKGxvY2FsLCBwYXJhbSk7CisJCWJyZWFrOworCWNhc2UgUFJJU00yX0hPU1RBUERfU0NBTl9SRVE6CisJCXJldCA9IHByaXNtMl9pb2N0bF9zY2FuX3JlcShsb2NhbCwgcGFyYW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSBwcmlzbTJfaG9zdGFwZChsb2NhbC0+YXAsIHBhcmFtKTsKKwkJYXBfaW9jdGwgPSAxOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0ID09IDEgfHwgIWFwX2lvY3RsKSB7CisJCWlmIChjb3B5X3RvX3VzZXIocC0+cG9pbnRlciwgcGFyYW0sIHAtPmxlbmd0aCkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIGlmIChhcF9pb2N0bCkKKwkJCXJldCA9IDA7CisJfQorCisgb3V0OgorCWlmIChwYXJhbSAhPSBOVUxMKQorCQlrZnJlZShwYXJhbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlzdHJuY3B5KGluZm8tPmRyaXZlciwgImhvc3RhcCIsIHNpemVvZihpbmZvLT5kcml2ZXIpIC0gMSk7CisJc3RybmNweShpbmZvLT52ZXJzaW9uLCBQUklTTTJfVkVSU0lPTiwKKwkJc2l6ZW9mKGluZm8tPnZlcnNpb24pIC0gMSk7CisJc25wcmludGYoaW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pIC0gMSwKKwkJICIlZC4lZC4lZCIsIChsb2NhbC0+c3RhX2Z3X3ZlciA+PiAxNikgJiAweGZmLAorCQkgKGxvY2FsLT5zdGFfZndfdmVyID4+IDgpICYgMHhmZiwKKwkJIGxvY2FsLT5zdGFfZndfdmVyICYgMHhmZik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgcHJpc20yX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IHByaXNtMl9nZXRfZHJ2aW5mbworfTsKKworCisvKiBTdHJ1Y3R1cmVzIHRvIGV4cG9ydCB0aGUgV2lyZWxlc3MgSGFuZGxlcnMgKi8KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcHJpc20yX2hhbmRsZXJbXSA9Cit7CisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCS8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2dldF9uYW1lLAkJCS8qIFNJT0NHSVdOQU1FICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCS8qIFNJT0NTSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCS8qIFNJT0NHSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIHByaXNtMl9pb2N0bF9zaXdmcmVxLAkJLyogU0lPQ1NJV0ZSRVEgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX2dpd2ZyZXEsCQkvKiBTSU9DR0lXRlJFUSAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfc2l3bW9kZSwJCS8qIFNJT0NTSVdNT0RFICovCisJKGl3X2hhbmRsZXIpIHByaXNtMl9pb2N0bF9naXdtb2RlLAkJLyogU0lPQ0dJV01PREUgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX3Npd3NlbnMsCQkvKiBTSU9DU0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfZ2l3c2VucywJCS8qIFNJT0NHSVdTRU5TICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUkFOR0UgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX2dpd3JhbmdlLAkJLyogU0lPQ0dJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLAkJLyogU0lPQ0dJV1BSSVYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdTVEFUUyAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLAkJLyogU0lPQ0dJV1NUQVRTICovCisJaXdfaGFuZGxlcl9zZXRfc3B5LAkJCQkvKiBTSU9DU0lXU1BZICovCisJaXdfaGFuZGxlcl9nZXRfc3B5LAkJCQkvKiBTSU9DR0lXU1BZICovCisJaXdfaGFuZGxlcl9zZXRfdGhyc3B5LAkJCQkvKiBTSU9DU0lXVEhSU1BZICovCisJaXdfaGFuZGxlcl9nZXRfdGhyc3B5LAkJCQkvKiBTSU9DR0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIHByaXNtMl9pb2N0bF9zaXdhcCwJCS8qIFNJT0NTSVdBUCAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfZ2l3YXAsCQkvKiBTSU9DR0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX3Npd21sbWUsCQkvKiBTSU9DU0lXTUxNRSAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfZ2l3YXBsaXN0LAkJLyogU0lPQ0dJV0FQTElTVCAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfc2l3c2NhbiwJCS8qIFNJT0NTSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIHByaXNtMl9pb2N0bF9naXdzY2FuLAkJLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX3Npd2Vzc2lkLAkJLyogU0lPQ1NJV0VTU0lEICovCisJKGl3X2hhbmRsZXIpIHByaXNtMl9pb2N0bF9naXdlc3NpZCwJCS8qIFNJT0NHSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfc2l3bmlja24sCQkvKiBTSU9DU0lXTklDS04gKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX2dpd25pY2tuLAkJLyogU0lPQ0dJV05JQ0tOICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfc2l3cmF0ZSwJCS8qIFNJT0NTSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIHByaXNtMl9pb2N0bF9naXdyYXRlLAkJLyogU0lPQ0dJV1JBVEUgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX3Npd3J0cywJCS8qIFNJT0NTSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX2dpd3J0cywJCS8qIFNJT0NHSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX3Npd2ZyYWcsCQkvKiBTSU9DU0lXRlJBRyAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfZ2l3ZnJhZywJCS8qIFNJT0NHSVdGUkFHICovCisJKGl3X2hhbmRsZXIpIHByaXNtMl9pb2N0bF9zaXd0eHBvdywJCS8qIFNJT0NTSVdUWFBPVyAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfZ2l3dHhwb3csCQkvKiBTSU9DR0lXVFhQT1cgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX3Npd3JldHJ5LAkJLyogU0lPQ1NJV1JFVFJZICovCisJKGl3X2hhbmRsZXIpIHByaXNtMl9pb2N0bF9naXdyZXRyeSwJCS8qIFNJT0NHSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfc2l3ZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfZ2l3ZW5jb2RlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfc2l3cG93ZXIsCQkvKiBTSU9DU0lXUE9XRVIgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX2dpd3Bvd2VyLAkJLyogU0lPQ0dJV1BPV0VSICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfc2l3Z2VuaWUsCQkvKiBTSU9DU0lXR0VOSUUgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX2dpd2dlbmllLAkJLyogU0lPQ0dJV0dFTklFICovCisJKGl3X2hhbmRsZXIpIHByaXNtMl9pb2N0bF9zaXdhdXRoLAkJLyogU0lPQ1NJV0FVVEggKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX2dpd2F1dGgsCQkvKiBTSU9DR0lXQVVUSCAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfc2l3ZW5jb2RlZXh0LAkJLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBwcmlzbTJfaW9jdGxfZ2l3ZW5jb2RlZXh0LAkJLyogU0lPQ0dJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkvKiBTSU9DU0lXUE1LU0EgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcHJpc20yX3ByaXZhdGVfaGFuZGxlcltdID0KK3sJCQkJCQkJLyogU0lPQ0lXRklSU1RQUklWICsgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX3ByaXZfcHJpc20yX3BhcmFtLAkvKiAwICovCisJKGl3X2hhbmRsZXIpIHByaXNtMl9pb2N0bF9wcml2X2dldF9wcmlzbTJfcGFyYW0sIC8qIDEgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX3ByaXZfd3JpdGVtaWYsCS8qIDIgKi8KKwkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX3ByaXZfcmVhZG1pZiwJCS8qIDMgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgaG9zdGFwX2l3X2hhbmRsZXJfZGVmID0KK3sKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHByaXNtMl9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGUJPSBzaXplb2YocHJpc20yX3ByaXZhdGVfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YocHJpc20yX3ByaXYpIC8gc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorCS5zdGFuZGFyZAk9IChpd19oYW5kbGVyICopIHByaXNtMl9oYW5kbGVyLAorCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgcHJpc20yX3ByaXZhdGVfaGFuZGxlciwKKwkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgcHJpc20yX3ByaXYsCisJLmdldF93aXJlbGVzc19zdGF0cyA9IGhvc3RhcF9nZXRfd2lyZWxlc3Nfc3RhdHMsCit9OworCisKK2ludCBob3N0YXBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopIGlmcjsKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgcmV0ID0gMDsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCXN3aXRjaCAoY21kKSB7CisJCS8qIFByaXZhdGUgaW9jdGxzIChpd3ByaXYpIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29udmVydGVkCisJCSAqIGludG8gbmV3IHdpcmVsZXNzIGV4dGVuc2lvbnMgQVBJICovCisKKwljYXNlIFBSSVNNMl9JT0NUTF9JTlFVSVJFOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldCA9IC1FUEVSTTsKKwkJZWxzZSByZXQgPSBwcmlzbTJfaW9jdGxfcHJpdl9pbnF1aXJlKGRldiwgKGludCAqKSB3cnEtPnUubmFtZSk7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfSU9DVExfTU9OSVRPUjoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXQgPSAtRVBFUk07CisJCWVsc2UgcmV0ID0gcHJpc20yX2lvY3RsX3ByaXZfbW9uaXRvcihkZXYsIChpbnQgKikgd3JxLT51Lm5hbWUpOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX0lPQ1RMX1JFU0VUOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldCA9IC1FUEVSTTsKKwkJZWxzZSByZXQgPSBwcmlzbTJfaW9jdGxfcHJpdl9yZXNldChkZXYsIChpbnQgKikgd3JxLT51Lm5hbWUpOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX0lPQ1RMX1dEU19BREQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0ID0gLUVQRVJNOworCQllbHNlIHJldCA9IHByaXNtMl93ZHNfYWRkKGxvY2FsLCB3cnEtPnUuYXBfYWRkci5zYV9kYXRhLCAxKTsKKwkJYnJlYWs7CisKKwljYXNlIFBSSVNNMl9JT0NUTF9XRFNfREVMOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldCA9IC1FUEVSTTsKKwkJZWxzZSByZXQgPSBwcmlzbTJfd2RzX2RlbChsb2NhbCwgd3JxLT51LmFwX2FkZHIuc2FfZGF0YSwgMSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBQUklTTTJfSU9DVExfU0VUX1JJRF9XT1JEOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldCA9IC1FUEVSTTsKKwkJZWxzZSByZXQgPSBwcmlzbTJfaW9jdGxfcHJpdl9zZXRfcmlkX3dvcmQoZGV2LAorCQkJCQkJCSAgKGludCAqKSB3cnEtPnUubmFtZSk7CisJCWJyZWFrOworCisjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKKwljYXNlIFBSSVNNMl9JT0NUTF9NQUNDTUQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0ID0gLUVQRVJNOworCQllbHNlIHJldCA9IGFwX21hY19jbWRfaW9jdGwobG9jYWwsIChpbnQgKikgd3JxLT51Lm5hbWUpOworCQlicmVhazsKKworCWNhc2UgUFJJU00yX0lPQ1RMX0FERE1BQzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXQgPSAtRVBFUk07CisJCWVsc2UgcmV0ID0gYXBfY29udHJvbF9hZGRfbWFjKCZsb2NhbC0+YXAtPm1hY19yZXN0cmljdGlvbnMsCisJCQkJCSAgICAgIHdycS0+dS5hcF9hZGRyLnNhX2RhdGEpOworCQlicmVhazsKKwljYXNlIFBSSVNNMl9JT0NUTF9ERUxNQUM6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0ID0gLUVQRVJNOworCQllbHNlIHJldCA9IGFwX2NvbnRyb2xfZGVsX21hYygmbG9jYWwtPmFwLT5tYWNfcmVzdHJpY3Rpb25zLAorCQkJCQkgICAgICB3cnEtPnUuYXBfYWRkci5zYV9kYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBQUklTTTJfSU9DVExfS0lDS01BQzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXQgPSAtRVBFUk07CisJCWVsc2UgcmV0ID0gYXBfY29udHJvbF9raWNrX21hYyhsb2NhbC0+YXAsIGxvY2FsLT5kZXYsCisJCQkJCSAgICAgICB3cnEtPnUuYXBfYWRkci5zYV9kYXRhKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLworCisKKwkJLyogUHJpdmF0ZSBpb2N0bHMgdGhhdCBhcmUgbm90IHVzZWQgd2l0aCBpd3ByaXY7CisJCSAqIGluIFNJT0NERVZQUklWQVRFIHJhbmdlICovCisKKyNpZmRlZiBQUklTTTJfRE9XTkxPQURfU1VQUE9SVAorCWNhc2UgUFJJU00yX0lPQ1RMX0RPV05MT0FEOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldCA9IC1FUEVSTTsKKwkJZWxzZSByZXQgPSBwcmlzbTJfaW9jdGxfcHJpdl9kb3dubG9hZChsb2NhbCwgJndycS0+dS5kYXRhKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogUFJJU00yX0RPV05MT0FEX1NVUFBPUlQgKi8KKworCWNhc2UgUFJJU00yX0lPQ1RMX0hPU1RBUEQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0ID0gLUVQRVJNOworCQllbHNlIHJldCA9IHByaXNtMl9pb2N0bF9wcml2X2hvc3RhcGQobG9jYWwsICZ3cnEtPnUuZGF0YSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjVmOGNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wY2kuYwpAQCAtMCwwICsxLDQ3MyBAQAorI2RlZmluZSBQUklTTTJfUENJCisKKy8qIEhvc3QgQVAgZHJpdmVyJ3Mgc3VwcG9ydCBmb3IgSW50ZXJzaWwgUHJpc20yLjUgUENJIGNhcmRzIGlzIGJhc2VkIG9uCisgKiBkcml2ZXIgcGF0Y2hlcyBmcm9tIFJleWsgRmxvZXRlciA8cmV5a0B2YW50cm9uaXgubmV0PiBhbmQKKyAqIEFuZHkgV2FybmVyIDxhbmR5d0Bwb2JveC5jb20+ICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJob3N0YXBfd2xhbi5oIgorCisKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0gUFJJU00yX1ZFUlNJT04gIiAoSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPikiOworc3RhdGljIGNoYXIgKmRldl9pbmZvID0gImhvc3RhcF9wY2kiOworCisKK01PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgSW50ZXJzaWwgUHJpc20yLjUtYmFzZWQgODAyLjExIHdpcmVsZXNzIExBTiAiCisJCSAgICJQQ0kgY2FyZHMuIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiSW50ZXJzaWwgUHJpc20yLjUtYmFzZWQgV0xBTiBQQ0kgY2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFBSSVNNMl9WRVJTSU9OKTsKKworCisvKiBzdHJ1Y3QgbG9jYWxfaW5mbzo6aHdfcHJpdiAqLworc3RydWN0IGhvc3RhcF9wY2lfcHJpdiB7CisJdm9pZCBfX2lvbWVtICptZW1fc3RhcnQ7Cit9OworCisKKy8qIEZJWDogZG8gd2UgbmVlZCBtYi93bWIvcm1iIHdpdGggbWVtb3J5IG9wZXJhdGlvbnM/ICovCisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHByaXNtMl9wY2lfaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCS8qIEludGVyc2lsIFByaXNtMyBJU0wzODcyIDExTWIvcyBXTEFOIENvbnRyb2xsZXIgKi8KKwl7IDB4MTI2MCwgMHgzODcyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisJLyogSW50ZXJzaWwgUHJpc20yLjUgSVNMMzg3NCAxMU1iL3MgV0xBTiBDb250cm9sbGVyICovCisJeyAweDEyNjAsIDB4Mzg3MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCS8qIFNhbXN1bmcgTWFnaWNMQU4gU1dMLTIyMTBQICovCisJeyAweDE2N2QsIDB4YTAwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgMCB9Cit9OworCisKKyNpZmRlZiBQUklTTTJfSU9fREVCVUcKKworc3RhdGljIGlubGluZSB2b2lkIGhmYTM4NHhfb3V0Yl9kZWJ1ZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYSwgdTggdikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJcHJpc20yX2lvX2RlYnVnX2FkZChkZXYsIFBSSVNNMl9JT19ERUJVR19DTURfT1VUQiwgYSwgdik7CisJd3JpdGViKHYsIGh3X3ByaXYtPm1lbV9zdGFydCArIGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggaGZhMzg0eF9pbmJfZGVidWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2OworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJdiA9IHJlYWRiKGh3X3ByaXYtPm1lbV9zdGFydCArIGEpOworCXByaXNtMl9pb19kZWJ1Z19hZGQoZGV2LCBQUklTTTJfSU9fREVCVUdfQ01EX0lOQiwgYSwgdik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhmYTM4NHhfb3V0d19kZWJ1ZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYSwgdTE2IHYpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+bG9jaywgZmxhZ3MpOworCXByaXNtMl9pb19kZWJ1Z19hZGQoZGV2LCBQUklTTTJfSU9fREVCVUdfQ01EX09VVFcsIGEsIHYpOworCXdyaXRldyh2LCBod19wcml2LT5tZW1fc3RhcnQgKyBhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBoZmEzODR4X2lud19kZWJ1ZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiB2OworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJdiA9IHJlYWR3KGh3X3ByaXYtPm1lbV9zdGFydCArIGEpOworCXByaXNtMl9pb19kZWJ1Z19hZGQoZGV2LCBQUklTTTJfSU9fREVCVUdfQ01EX0lOVywgYSwgdik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gdjsKK30KKworI2RlZmluZSBIRkEzODRYX09VVEIodixhKSBoZmEzODR4X291dGJfZGVidWcoZGV2LCAoYSksICh2KSkKKyNkZWZpbmUgSEZBMzg0WF9JTkIoYSkgaGZhMzg0eF9pbmJfZGVidWcoZGV2LCAoYSkpCisjZGVmaW5lIEhGQTM4NFhfT1VUVyh2LGEpIGhmYTM4NHhfb3V0d19kZWJ1ZyhkZXYsIChhKSwgKHYpKQorI2RlZmluZSBIRkEzODRYX0lOVyhhKSBoZmEzODR4X2lud19kZWJ1ZyhkZXYsIChhKSkKKyNkZWZpbmUgSEZBMzg0WF9PVVRXX0RBVEEodixhKSBoZmEzODR4X291dHdfZGVidWcoZGV2LCAoYSksIGNwdV90b19sZTE2KCh2KSkpCisjZGVmaW5lIEhGQTM4NFhfSU5XX0RBVEEoYSkgKHUxNikgbGUxNl90b19jcHUoaGZhMzg0eF9pbndfZGVidWcoZGV2LCAoYSkpKQorCisjZWxzZSAvKiBQUklTTTJfSU9fREVCVUcgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGhmYTM4NHhfb3V0YihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYSwgdTggdikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJc3RydWN0IGhvc3RhcF9wY2lfcHJpdiAqaHdfcHJpdjsKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJaHdfcHJpdiA9IGlmYWNlLT5sb2NhbC0+aHdfcHJpdjsKKwl3cml0ZWIodiwgaHdfcHJpdi0+bWVtX3N0YXJ0ICsgYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggaGZhMzg0eF9pbmIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCXN0cnVjdCBob3N0YXBfcGNpX3ByaXYgKmh3X3ByaXY7CisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWh3X3ByaXYgPSBpZmFjZS0+bG9jYWwtPmh3X3ByaXY7CisJcmV0dXJuIHJlYWRiKGh3X3ByaXYtPm1lbV9zdGFydCArIGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGZhMzg0eF9vdXR3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhLCB1MTYgdikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJc3RydWN0IGhvc3RhcF9wY2lfcHJpdiAqaHdfcHJpdjsKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJaHdfcHJpdiA9IGlmYWNlLT5sb2NhbC0+aHdfcHJpdjsKKwl3cml0ZXcodiwgaHdfcHJpdi0+bWVtX3N0YXJ0ICsgYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGhmYTM4NHhfaW53KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlzdHJ1Y3QgaG9zdGFwX3BjaV9wcml2ICpod19wcml2OworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlod19wcml2ID0gaWZhY2UtPmxvY2FsLT5od19wcml2OworCXJldHVybiByZWFkdyhod19wcml2LT5tZW1fc3RhcnQgKyBhKTsKK30KKworI2RlZmluZSBIRkEzODRYX09VVEIodixhKSBoZmEzODR4X291dGIoZGV2LCAoYSksICh2KSkKKyNkZWZpbmUgSEZBMzg0WF9JTkIoYSkgaGZhMzg0eF9pbmIoZGV2LCAoYSkpCisjZGVmaW5lIEhGQTM4NFhfT1VUVyh2LGEpIGhmYTM4NHhfb3V0dyhkZXYsIChhKSwgKHYpKQorI2RlZmluZSBIRkEzODRYX0lOVyhhKSBoZmEzODR4X2ludyhkZXYsIChhKSkKKyNkZWZpbmUgSEZBMzg0WF9PVVRXX0RBVEEodixhKSBoZmEzODR4X291dHcoZGV2LCAoYSksIGNwdV90b19sZTE2KCh2KSkpCisjZGVmaW5lIEhGQTM4NFhfSU5XX0RBVEEoYSkgKHUxNikgbGUxNl90b19jcHUoaGZhMzg0eF9pbncoZGV2LCAoYSkpKQorCisjZW5kaWYgLyogUFJJU00yX0lPX0RFQlVHICovCisKKworc3RhdGljIGludCBoZmEzODR4X2Zyb21fYmFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBiYXAsIHZvaWQgKmJ1ZiwKKwkJCSAgICBpbnQgbGVuKQoreworCXUxNiBkX29mZjsKKwl1MTYgKnBvczsKKworCWRfb2ZmID0gKGJhcCA9PSAxKSA/IEhGQTM4NFhfREFUQTFfT0ZGIDogSEZBMzg0WF9EQVRBMF9PRkY7CisJcG9zID0gKHUxNiAqKSBidWY7CisKKwlmb3IgKCA7IGxlbiA+IDE7IGxlbiAtPSAyKQorCQkqcG9zKysgPSBIRkEzODRYX0lOV19EQVRBKGRfb2ZmKTsKKworCWlmIChsZW4gJiAxKQorCQkqKChjaGFyICopIHBvcykgPSBIRkEzODRYX0lOQihkX29mZik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhmYTM4NHhfdG9fYmFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBiYXAsIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwl1MTYgZF9vZmY7CisJdTE2ICpwb3M7CisKKwlkX29mZiA9IChiYXAgPT0gMSkgPyBIRkEzODRYX0RBVEExX09GRiA6IEhGQTM4NFhfREFUQTBfT0ZGOworCXBvcyA9ICh1MTYgKikgYnVmOworCisJZm9yICggOyBsZW4gPiAxOyBsZW4gLT0gMikKKwkJSEZBMzg0WF9PVVRXX0RBVEEoKnBvcysrLCBkX29mZik7CisKKwlpZiAobGVuICYgMSkKKwkJSEZBMzg0WF9PVVRCKCooKGNoYXIgKikgcG9zKSwgZF9vZmYpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogRklYOiBUaGlzIG1pZ2h0IGNoYW5nZSBhdCBzb21lIHBvaW50Li4gKi8KKyNpbmNsdWRlICJob3N0YXBfaHcuYyIKKworc3RhdGljIHZvaWQgcHJpc20yX3BjaV9jb3Jfc3Jlc2V0KGxvY2FsX2luZm9fdCAqbG9jYWwpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CisJdTE2IHJlZzsKKworCXJlZyA9IEhGQTM4NFhfSU5CKEhGQTM4NFhfUENJQ09SX09GRik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBPcmlnaW5hbCBDT1IgdmFsdWU6IDB4JTB4XG4iLCBkZXYtPm5hbWUsIHJlZyk7CisKKwkvKiBsaW51eC13bGFuLW5nIHVzZXMgZXh0cmVtZWx5IGxvbmcgaG9sZCBhbmQgc2V0dGxlIHRpbWVzIGZvcgorCSAqIENPUiBzcmVzZXQuIEEgY29tbWVudCBpbiB0aGUgZHJpdmVyIGNvZGUgbWVudGlvbnMgdGhhdCB0aGUgbG9uZworCSAqIGRlbGF5cyBhcHBlYXIgdG8gYmUgbmVjZXNzYXJ5LiBIb3dldmVyLCBhdCBsZWFzdCBJQk0gMjJQNjkwMSBzZWVtcworCSAqIHRvIHdvcmsgZmluZSB3aXRoIHNob3J0ZXIgZGVsYXlzLgorCSAqCisJICogTG9uZ2VyIGRlbGF5cyBjYW4gYmUgY29uZmlndXJlZCBieSB1bmNvbW1lbnRpbmcgZm9sbG93aW5nIGxpbmU6ICovCisvKiAjZGVmaW5lIFBSSVNNMl9QQ0lfVVNFX0xPTkdfREVMQVlTICovCisKKyNpZmRlZiBQUklTTTJfUENJX1VTRV9MT05HX0RFTEFZUworCWludCBpOworCisJSEZBMzg0WF9PVVRXKHJlZyB8IDB4MDA4MCwgSEZBMzg0WF9QQ0lDT1JfT0ZGKTsKKwltZGVsYXkoMjUwKTsKKworCUhGQTM4NFhfT1VUVyhyZWcgJiB+MHgwMDgwLCBIRkEzODRYX1BDSUNPUl9PRkYpOworCW1kZWxheSg1MDApOworCisJLyogV2FpdCBmb3IgZi93IHRvIGNvbXBsZXRlIGluaXRpYWxpemF0aW9uIChDTUQ6QlVTWSA9PSAwKSAqLworCWkgPSAyMDAwMDAwIC8gMTA7CisJd2hpbGUgKChIRkEzODRYX0lOVyhIRkEzODRYX0NNRF9PRkYpICYgSEZBMzg0WF9DTURfQlVTWSkgJiYgLS1pKQorCQl1ZGVsYXkoMTApOworCisjZWxzZSAvKiBQUklTTTJfUENJX1VTRV9MT05HX0RFTEFZUyAqLworCisJSEZBMzg0WF9PVVRXKHJlZyB8IDB4MDA4MCwgSEZBMzg0WF9QQ0lDT1JfT0ZGKTsKKwltZGVsYXkoMik7CisJSEZBMzg0WF9PVVRXKHJlZyAmIH4weDAwODAsIEhGQTM4NFhfUENJQ09SX09GRik7CisJbWRlbGF5KDIpOworCisjZW5kaWYgLyogUFJJU00yX1BDSV9VU0VfTE9OR19ERUxBWVMgKi8KKworCWlmIChIRkEzODRYX0lOVyhIRkEzODRYX0NNRF9PRkYpICYgSEZBMzg0WF9DTURfQlVTWSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENPUiBzcmVzZXQgdGltZW91dFxuIiwgZGV2LT5uYW1lKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgcHJpc20yX3BjaV9nZW5lc2lzX3Jlc2V0KGxvY2FsX2luZm9fdCAqbG9jYWwsIGludCBoY3IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CisKKwlIRkEzODRYX09VVFcoMHgwMEM1LCBIRkEzODRYX1BDSUNPUl9PRkYpOworCW1kZWxheSgxMCk7CisJSEZBMzg0WF9PVVRXKGhjciwgSEZBMzg0WF9QQ0lIQ1JfT0ZGKTsKKwltZGVsYXkoMTApOworCUhGQTM4NFhfT1VUVygweDAwNDUsIEhGQTM4NFhfUENJQ09SX09GRik7CisJbWRlbGF5KDEwKTsKK30KKworCitzdGF0aWMgc3RydWN0IHByaXNtMl9oZWxwZXJfZnVuY3Rpb25zIHByaXNtMl9wY2lfZnVuY3MgPQoreworCS5jYXJkX3ByZXNlbnQJPSBOVUxMLAorCS5jb3Jfc3Jlc2V0CT0gcHJpc20yX3BjaV9jb3Jfc3Jlc2V0LAorCS5kZXZfb3Blbgk9IE5VTEwsCisJLmRldl9jbG9zZQk9IE5VTEwsCisJLmdlbmVzaXNfcmVzZXQJPSBwcmlzbTJfcGNpX2dlbmVzaXNfcmVzZXQsCisJLmh3X3R5cGUJPSBIT1NUQVBfSFdfUENJLAorfTsKKworCitzdGF0aWMgaW50IHByaXNtMl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXVuc2lnbmVkIGxvbmcgcGh5bWVtOworCXZvaWQgX19pb21lbSAqbWVtID0gTlVMTDsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdGF0aWMgaW50IGNhcmRzX2ZvdW5kIC8qID0gMCAqLzsKKwlpbnQgaXJxX3JlZ2lzdGVyZWQgPSAwOworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlzdHJ1Y3QgaG9zdGFwX3BjaV9wcml2ICpod19wcml2OworCisJaHdfcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpod19wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGh3X3ByaXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGh3X3ByaXYsIDAsIHNpemVvZigqaHdfcHJpdikpOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVJTzsKKworCXBoeW1lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBoeW1lbSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSwgIlByaXNtMiIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAicHJpc20yOiBDYW5ub3QgcmVzZXJ2ZSBQQ0kgbWVtb3J5IHJlZ2lvblxuIik7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCX0KKworCW1lbSA9IGlvcmVtYXAocGh5bWVtLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlpZiAobWVtID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwcmlzbTI6IENhbm5vdCByZW1hcCBQQ0kgbWVtb3J5IHJlZ2lvblxuIikgOworCQlnb3RvIGZhaWw7CisJfQorCisJZGV2ID0gcHJpc20yX2luaXRfbG9jYWxfZGF0YSgmcHJpc20yX3BjaV9mdW5jcywgY2FyZHNfZm91bmQsCisJCQkJICAgICAmcGRldi0+ZGV2KTsKKwlpZiAoZGV2ID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisJbG9jYWwtPmh3X3ByaXYgPSBod19wcml2OworCWNhcmRzX2ZvdW5kKys7CisKKyAgICAgICAgZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisgICAgICAgIGh3X3ByaXYtPm1lbV9zdGFydCA9IG1lbTsKKworCXByaXNtMl9wY2lfY29yX3NyZXNldChsb2NhbCk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgcHJpc20yX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwKKwkJCWRldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlcXVlc3RfaXJxIGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJZ290byBmYWlsOworCX0gZWxzZQorCQlpcnFfcmVnaXN0ZXJlZCA9IDE7CisKKwlpZiAoIWxvY2FsLT5wcmlfb25seSAmJiBwcmlzbTJfaHdfY29uZmlnKGRldiwgMSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoYXJkd2FyZSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCisJCSAgICAgICBkZXZfaW5mbyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJzaWwgUHJpc20yLjUgUENJOiAiCisJICAgICAgICJtZW09MHglbHgsIGlycT0lZFxuIiwgZGV2LT5uYW1lLCBwaHltZW0sIGRldi0+aXJxKTsKKworCXJldHVybiBob3N0YXBfaHdfcmVhZHkoZGV2KTsKKworIGZhaWw6CisJa2ZyZWUoaHdfcHJpdik7CisKKwlpZiAoaXJxX3JlZ2lzdGVyZWQgJiYgZGV2KQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWlmIChtZW0pCisJCWlvdW5tYXAobWVtKTsKKworCXJlbGVhc2VfbWVtX3JlZ2lvbihwaHltZW0sIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCisgZXJyX291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlrZnJlZShod19wcml2KTsKKwlpZiAobG9jYWwpCisJCWxvY2FsLT5od19wcml2ID0gTlVMTDsKKwlwcmlzbTJfZnJlZV9sb2NhbF9kYXRhKGRldik7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCitzdGF0aWMgdm9pZCBwcmlzbTJfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwl2b2lkIF9faW9tZW0gKm1lbV9zdGFydDsKKwlzdHJ1Y3QgaG9zdGFwX3BjaV9wcml2ICpod19wcml2OworCisJZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlod19wcml2ID0gaWZhY2UtPmxvY2FsLT5od19wcml2OworCisJLyogUmVzZXQgdGhlIGhhcmR3YXJlLCBhbmQgZW5zdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkLiAqLworCXByaXNtMl9wY2lfY29yX3NyZXNldChpZmFjZS0+bG9jYWwpOworCWhmYTM4NHhfZGlzYWJsZV9pbnRlcnJ1cHRzKGRldik7CisKKwlpZiAoZGV2LT5pcnEpCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJbWVtX3N0YXJ0ID0gaHdfcHJpdi0+bWVtX3N0YXJ0OworCWtmcmVlKGh3X3ByaXYpOworCWlmYWNlLT5sb2NhbC0+aHdfcHJpdiA9IE5VTEw7CisJcHJpc20yX2ZyZWVfbG9jYWxfZGF0YShkZXYpOworCisJaW91bm1hcChtZW1fc3RhcnQpOworCisJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKKwkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHByaXNtMl9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCX0KKwlwcmlzbTJfc3VzcGVuZChkZXYpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmlzbTJfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJcHJpc20yX2h3X2NvbmZpZyhkZXYsIDApOworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwcmlzbTJfcGNpX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHByaXNtMl9wY2lfZHJ2X2lkID0geworCS5uYW1lCQk9ICJwcmlzbTJfcGNpIiwKKwkuaWRfdGFibGUJPSBwcmlzbTJfcGNpX2lkX3RhYmxlLAorCS5wcm9iZQkJPSBwcmlzbTJfcGNpX3Byb2JlLAorCS5yZW1vdmUJCT0gcHJpc20yX3BjaV9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBwcmlzbTJfcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwcmlzbTJfcGNpX3Jlc3VtZSwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKwkvKiBMaW51eCAyLjQuNiBhZGRlZCBzYXZlX3N0YXRlIGFuZCBlbmFibGVfd2FrZSB0aGF0IGFyZSBub3QgdXNlZCBoZXJlCisJICovCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcHJpc20yX3BjaSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlc1xuIiwgZGV2X2luZm8sIHZlcnNpb24pOworCisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnByaXNtMl9wY2lfZHJ2X2lkKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9wcmlzbTJfcGNpKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwcmlzbTJfcGNpX2Rydl9pZCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERyaXZlciB1bmxvYWRlZFxuIiwgZGV2X2luZm8pOworfQorCisKK21vZHVsZV9pbml0KGluaXRfcHJpc20yX3BjaSk7Cittb2R1bGVfZXhpdChleGl0X3ByaXNtMl9wY2kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wbHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcGx4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0ZWY4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcGx4LmMKQEAgLTAsMCArMSw2NDUgQEAKKyNkZWZpbmUgUFJJU00yX1BMWAorCisvKiBIb3N0IEFQIGRyaXZlcidzIHN1cHBvcnQgZm9yIFBDIENhcmRzIG9uIFBDSSBhZGFwdGVycyB1c2luZyBQTFg5MDUyIGlzCisgKiBiYXNlZCBvbjoKKyAqIC0gSG9zdCBBUCBkcml2ZXIgcGF0Y2ggZnJvbSBqYW1lc0BtYWRpbmdsZXkub3JnCisgKiAtIGxpbnV4LXdsYW4tbmcgZHJpdmVyLCBDb3B5cmlnaHQgKEMpIEFic29sdXRlVmFsdWUgU3lzdGVtcywgSW5jLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImhvc3RhcF93bGFuLmgiCisKKworc3RhdGljIGNoYXIgKnZlcnNpb24gPSBQUklTTTJfVkVSU0lPTiAiIChKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+KSI7CitzdGF0aWMgY2hhciAqZGV2X2luZm8gPSAiaG9zdGFwX3BseCI7CisKKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBwb3J0IGZvciBJbnRlcnNpbCBQcmlzbTItYmFzZWQgODAyLjExIHdpcmVsZXNzIExBTiAiCisJCSAgICJjYXJkcyAoUExYKS4iKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJJbnRlcnNpbCBQcmlzbTItYmFzZWQgV0xBTiBjYXJkcyAoUExYKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oUFJJU00yX1ZFUlNJT04pOworCisKK3N0YXRpYyBpbnQgaWdub3JlX2NpczsKK21vZHVsZV9wYXJhbShpZ25vcmVfY2lzLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZ25vcmVfY2lzLCAiRG8gbm90IHZlcmlmeSBtYW5maWQgaW5mb3JtYXRpb24gaW4gQ0lTIik7CisKKworLyogc3RydWN0IGxvY2FsX2luZm86Omh3X3ByaXYgKi8KK3N0cnVjdCBob3N0YXBfcGx4X3ByaXYgeworCXZvaWQgX19pb21lbSAqYXR0cl9tZW07CisJdW5zaWduZWQgaW50IGNvcl9vZmZzZXQ7Cit9OworCisKKyNkZWZpbmUgUExYX01JTl9BVFRSX0xFTiA1MTIJLyogYXQgbGVhc3QgMiB4IDI1NiBpcyBuZWVkZWQgZm9yIENJUyAqLworI2RlZmluZSBDT1JfU1JFU0VUICAgICAgIDB4ODAKKyNkZWZpbmUgQ09SX0xFVkxSRVEgICAgICAweDQwCisjZGVmaW5lIENPUl9FTkFCTEVfRlVOQyAgMHgwMQorLyogUENJIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzICovCisjZGVmaW5lIFBMWF9QQ0lJUFIgICAgICAgMHgzZCAgIC8qIFBDSSBJbnRlcnJ1cHQgUGluICovCisvKiBMb2NhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAqLworI2RlZmluZSBQTFhfSU5UQ1NSICAgICAgIDB4NGMgICAvKiBJbnRlcnJ1cHQgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUExYX0lOVENTUl9QQ0lfSU5URU4gQklUKDYpIC8qIFBDSSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFBMWF9DTlRSTCAgICAgICAgMHg1MAorI2RlZmluZSBQTFhfQ05UUkxfU0VSSUFMX0VFUFJPTV9QUkVTRU5UIEJJVCgyOCkKKworCisjZGVmaW5lIFBMWERFVih2ZW5kb3IsZGV2LHN0cikgeyB2ZW5kb3IsIGRldiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwcmlzbTJfcGx4X2lkX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwlQTFhERVYoMHgxMGI3LCAweDc3NzAsICIzQ29tIEFpckNvbm5lY3QgUENJIDc3N0EiKSwKKwlQTFhERVYoMHgxMTFhLCAweDEwMjMsICJTaWVtZW5zIFNwZWVkU3RyZWFtIFNTMTAyMyIpLAorCVBMWERFVigweDEyNmMsIDB4ODAzMCwgIk5vcnRlbCBlbW9iaWxpdHkiKSwKKwlQTFhERVYoMHgxMzg1LCAweDQxMDAsICJOZXRnZWFyIE1BMzAxIiksCisJUExYREVWKDB4MTVlOCwgMHgwMTMwLCAiTmF0aW9uYWwgRGF0YWNvbW0gTkNQMTMwIChQTFg5MDUyKSIpLAorCVBMWERFVigweDE1ZTgsIDB4MDEzMSwgIk5hdGlvbmFsIERhdGFjb21tIE5DUDEzMCAoVE1ENzE2MCkiKSwKKwlQTFhERVYoMHgxNjM4LCAweDExMDAsICJFdW1pdGNvbSBXTDExMDAwIiksCisJUExYREVWKDB4MTZhYiwgMHgxMTAxLCAiR2xvYmFsIFN1biBUZWNoIEdMMjQxMTBQICg/KSIpLAorCVBMWERFVigweDE2YWIsIDB4MTEwMiwgIkxpbmtzeXMgV1BDMTEgd2l0aCBXRFQxMSIpLAorCVBMWERFVigweDE2YWIsIDB4MTEwMywgIkxvbmdzaGluZSA4MDMxIiksCisJUExYREVWKDB4MTZlYywgMHgzNjg1LCAiVVMgUm9ib3RpY3MgVVNSMjQxNSIpLAorCVBMWERFVigweGVjODAsIDB4ZWMwMCwgIkJlbGtpbiBGNUQ2MDAwIiksCisJeyAwIH0KK307CisKKworLyogQXJyYXkgb2Yga25vd24gUHJpc20yLzIuNSBQQyBDYXJkIG1hbnVmYWN0dXJlZCBpZHMuIElmIHlvdXIgY2FyZCdzIG1hbmZpZAorICogaXMgbm90IGxpc3RlZCBoZXJlLCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCBpdCBoZXJlIHRvIGdldCB0aGUgZHJpdmVyCisgKiBpbml0aWFsaXplZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgcHJpc20yX3BseF9tYW5maWQgeworCXUxNiBtYW5maWQxLCBtYW5maWQyOworfSBwcmlzbTJfcGx4X2tub3duX21hbmZpZHNbXSA9IHsKKwl7IDB4MDAwYiwgMHg3MTEwIH0gLyogRC1MaW5rIERXTC02NTAgUmV2LiBQMSAqLywKKwl7IDB4MDAwYiwgMHg3MzAwIH0gLyogUGhpbGlwcyA4MDIuMTFiIFdMQU4gUENNQ0lBICovLAorCXsgMHgwMTAxLCAweDA3NzcgfSAvKiAzQ29tIEFpckNvbm5lY3QgUENJIDc3N0EgKi8sCisJeyAweDAxMjYsIDB4ODAwMCB9IC8qIFByb3hpbSBSYW5nZUxBTiAqLywKKwl7IDB4MDEzOCwgMHgwMDAyIH0gLyogQ29tcGFxIFdMMTAwICovLAorCXsgMHgwMTU2LCAweDAwMDIgfSAvKiBJbnRlcnNpbCBQcmlzbSBJSSBSZWYuIERlc2lnbiAoYW5kIG90aGVycykgKi8sCisJeyAweDAyNmYsIDB4MDMwYiB9IC8qIEJ1ZmZhbG8gV0xJLUNGLVMxMUcgKi8sCisJeyAweDAyNzQsIDB4MTYxMiB9IC8qIExpbmtzeXMgV1BDMTEgVmVyIDIuNSAqLywKKwl7IDB4MDI3NCwgMHgxNjEzIH0gLyogTGlua3N5cyBXUEMxMSBWZXIgMyAqLywKKwl7IDB4MDI4YSwgMHgwMDAyIH0gLyogRC1MaW5rIERSQy02NTAgKi8sCisJeyAweDAyNTAsIDB4MDAwMiB9IC8qIFNhbXN1bmcgU1dMMjAwMC1OICovLAorCXsgMHhjMjUwLCAweDAwMDIgfSAvKiBFTVRBQyBBMjQyNGkgKi8sCisJeyAweGQ2MDEsIDB4MDAwMiB9IC8qIFotQ29tIFhJMzAwICovLAorCXsgMHhkNjAxLCAweDAwMDUgfSAvKiBaY29tYXggWEktMzI1SCAyMDBtVyAqLywKKwl7IDAsIDB9Cit9OworCisKKyNpZmRlZiBQUklTTTJfSU9fREVCVUcKKworc3RhdGljIGlubGluZSB2b2lkIGhmYTM4NHhfb3V0Yl9kZWJ1ZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYSwgdTggdikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJcHJpc20yX2lvX2RlYnVnX2FkZChkZXYsIFBSSVNNMl9JT19ERUJVR19DTURfT1VUQiwgYSwgdik7CisJb3V0Yih2LCBkZXYtPmJhc2VfYWRkciArIGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggaGZhMzg0eF9pbmJfZGVidWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGEpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2OworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJdiA9IGluYihkZXYtPmJhc2VfYWRkciArIGEpOworCXByaXNtMl9pb19kZWJ1Z19hZGQoZGV2LCBQUklTTTJfSU9fREVCVUdfQ01EX0lOQiwgYSwgdik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhmYTM4NHhfb3V0d19kZWJ1ZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYSwgdTE2IHYpCit7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+bG9jaywgZmxhZ3MpOworCXByaXNtMl9pb19kZWJ1Z19hZGQoZGV2LCBQUklTTTJfSU9fREVCVUdfQ01EX09VVFcsIGEsIHYpOworCW91dHcodiwgZGV2LT5iYXNlX2FkZHIgKyBhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBoZmEzODR4X2lud19kZWJ1ZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYSkKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiB2OworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJdiA9IGludyhkZXYtPmJhc2VfYWRkciArIGEpOworCXByaXNtMl9pb19kZWJ1Z19hZGQoZGV2LCBQUklTTTJfSU9fREVCVUdfQ01EX0lOVywgYSwgdik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhmYTM4NHhfb3V0c3dfZGVidWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGEsCisJCQkJICAgICAgIHU4ICpidWYsIGludCB3YykKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsID0gaWZhY2UtPmxvY2FsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7CisJcHJpc20yX2lvX2RlYnVnX2FkZChkZXYsIFBSSVNNMl9JT19ERUJVR19DTURfT1VUU1csIGEsIHdjKTsKKwlvdXRzdyhkZXYtPmJhc2VfYWRkciArIGEsIGJ1Ziwgd2MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZmEzODR4X2luc3dfZGVidWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGEsCisJCQkJICAgICAgdTggKmJ1ZiwgaW50IHdjKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKKwlwcmlzbTJfaW9fZGVidWdfYWRkKGRldiwgUFJJU00yX0lPX0RFQlVHX0NNRF9JTlNXLCBhLCB3Yyk7CisJaW5zdyhkZXYtPmJhc2VfYWRkciArIGEsIGJ1Ziwgd2MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5sb2NrLCBmbGFncyk7Cit9CisKKyNkZWZpbmUgSEZBMzg0WF9PVVRCKHYsYSkgaGZhMzg0eF9vdXRiX2RlYnVnKGRldiwgKGEpLCAodikpCisjZGVmaW5lIEhGQTM4NFhfSU5CKGEpIGhmYTM4NHhfaW5iX2RlYnVnKGRldiwgKGEpKQorI2RlZmluZSBIRkEzODRYX09VVFcodixhKSBoZmEzODR4X291dHdfZGVidWcoZGV2LCAoYSksICh2KSkKKyNkZWZpbmUgSEZBMzg0WF9JTlcoYSkgaGZhMzg0eF9pbndfZGVidWcoZGV2LCAoYSkpCisjZGVmaW5lIEhGQTM4NFhfT1VUU1coYSwgYnVmLCB3YykgaGZhMzg0eF9vdXRzd19kZWJ1ZyhkZXYsIChhKSwgKGJ1ZiksICh3YykpCisjZGVmaW5lIEhGQTM4NFhfSU5TVyhhLCBidWYsIHdjKSBoZmEzODR4X2luc3dfZGVidWcoZGV2LCAoYSksIChidWYpLCAod2MpKQorCisjZWxzZSAvKiBQUklTTTJfSU9fREVCVUcgKi8KKworI2RlZmluZSBIRkEzODRYX09VVEIodixhKSBvdXRiKCh2KSwgZGV2LT5iYXNlX2FkZHIgKyAoYSkpCisjZGVmaW5lIEhGQTM4NFhfSU5CKGEpIGluYihkZXYtPmJhc2VfYWRkciArIChhKSkKKyNkZWZpbmUgSEZBMzg0WF9PVVRXKHYsYSkgb3V0dygodiksIGRldi0+YmFzZV9hZGRyICsgKGEpKQorI2RlZmluZSBIRkEzODRYX0lOVyhhKSBpbncoZGV2LT5iYXNlX2FkZHIgKyAoYSkpCisjZGVmaW5lIEhGQTM4NFhfSU5TVyhhLCBidWYsIHdjKSBpbnN3KGRldi0+YmFzZV9hZGRyICsgKGEpLCBidWYsIHdjKQorI2RlZmluZSBIRkEzODRYX09VVFNXKGEsIGJ1Ziwgd2MpIG91dHN3KGRldi0+YmFzZV9hZGRyICsgKGEpLCBidWYsIHdjKQorCisjZW5kaWYgLyogUFJJU00yX0lPX0RFQlVHICovCisKKworc3RhdGljIGludCBoZmEzODR4X2Zyb21fYmFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBiYXAsIHZvaWQgKmJ1ZiwKKwkJCSAgICBpbnQgbGVuKQoreworCXUxNiBkX29mZjsKKwl1MTYgKnBvczsKKworCWRfb2ZmID0gKGJhcCA9PSAxKSA/IEhGQTM4NFhfREFUQTFfT0ZGIDogSEZBMzg0WF9EQVRBMF9PRkY7CisJcG9zID0gKHUxNiAqKSBidWY7CisKKwlpZiAobGVuIC8gMikKKwkJSEZBMzg0WF9JTlNXKGRfb2ZmLCBidWYsIGxlbiAvIDIpOworCXBvcyArPSBsZW4gLyAyOworCisJaWYgKGxlbiAmIDEpCisJCSooKGNoYXIgKikgcG9zKSA9IEhGQTM4NFhfSU5CKGRfb2ZmKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaGZhMzg0eF90b19iYXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGJhcCwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCXUxNiBkX29mZjsKKwl1MTYgKnBvczsKKworCWRfb2ZmID0gKGJhcCA9PSAxKSA/IEhGQTM4NFhfREFUQTFfT0ZGIDogSEZBMzg0WF9EQVRBMF9PRkY7CisJcG9zID0gKHUxNiAqKSBidWY7CisKKwlpZiAobGVuIC8gMikKKwkJSEZBMzg0WF9PVVRTVyhkX29mZiwgYnVmLCBsZW4gLyAyKTsKKwlwb3MgKz0gbGVuIC8gMjsKKworCWlmIChsZW4gJiAxKQorCQlIRkEzODRYX09VVEIoKigoY2hhciAqKSBwb3MpLCBkX29mZik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBGSVg6IFRoaXMgbWlnaHQgY2hhbmdlIGF0IHNvbWUgcG9pbnQuLiAqLworI2luY2x1ZGUgImhvc3RhcF9ody5jIgorCisKK3N0YXRpYyB2b2lkIHByaXNtMl9wbHhfY29yX3NyZXNldChsb2NhbF9pbmZvX3QgKmxvY2FsKQoreworCXVuc2lnbmVkIGNoYXIgY29yc2F2ZTsKKwlzdHJ1Y3QgaG9zdGFwX3BseF9wcml2ICpod19wcml2ID0gbG9jYWwtPmh3X3ByaXY7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvaW5nIHJlc2V0IHZpYSBkaXJlY3QgQ09SIGFjY2Vzcy5cbiIsCisJICAgICAgIGRldl9pbmZvKTsKKworCS8qIFNldCBzcmVzZXQgYml0IG9mIENPUiBhbmQgY2xlYXIgaXQgYWZ0ZXIgaG9sZCB0aW1lICovCisKKwlpZiAoaHdfcHJpdi0+YXR0cl9tZW0gPT0gTlVMTCkgeworCQkvKiBUTUQ3MTYwIC0gQ09SIGF0IGNhcmQncyBmaXJzdCBJL08gYWRkciAqLworCQljb3JzYXZlID0gaW5iKGh3X3ByaXYtPmNvcl9vZmZzZXQpOworCQlvdXRiKGNvcnNhdmUgfCBDT1JfU1JFU0VULCBod19wcml2LT5jb3Jfb2Zmc2V0KTsKKwkJbWRlbGF5KDIpOworCQlvdXRiKGNvcnNhdmUgJiB+Q09SX1NSRVNFVCwgaHdfcHJpdi0+Y29yX29mZnNldCk7CisJCW1kZWxheSgyKTsKKwl9IGVsc2UgeworCQkvKiBQTFg5MDUyICovCisJCWNvcnNhdmUgPSByZWFkYihod19wcml2LT5hdHRyX21lbSArIGh3X3ByaXYtPmNvcl9vZmZzZXQpOworCQl3cml0ZWIoY29yc2F2ZSB8IENPUl9TUkVTRVQsCisJCSAgICAgICBod19wcml2LT5hdHRyX21lbSArIGh3X3ByaXYtPmNvcl9vZmZzZXQpOworCQltZGVsYXkoMik7CisJCXdyaXRlYihjb3JzYXZlICYgfkNPUl9TUkVTRVQsCisJCSAgICAgICBod19wcml2LT5hdHRyX21lbSArIGh3X3ByaXYtPmNvcl9vZmZzZXQpOworCQltZGVsYXkoMik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl9wbHhfZ2VuZXNpc19yZXNldChsb2NhbF9pbmZvX3QgKmxvY2FsLCBpbnQgaGNyKQoreworCXVuc2lnbmVkIGNoYXIgY29yc2F2ZTsKKwlzdHJ1Y3QgaG9zdGFwX3BseF9wcml2ICpod19wcml2ID0gbG9jYWwtPmh3X3ByaXY7CisKKwlpZiAoaHdfcHJpdi0+YXR0cl9tZW0gPT0gTlVMTCkgeworCQkvKiBUTUQ3MTYwIC0gQ09SIGF0IGNhcmQncyBmaXJzdCBJL08gYWRkciAqLworCQljb3JzYXZlID0gaW5iKGh3X3ByaXYtPmNvcl9vZmZzZXQpOworCQlvdXRiKGNvcnNhdmUgfCBDT1JfU1JFU0VULCBod19wcml2LT5jb3Jfb2Zmc2V0KTsKKwkJbWRlbGF5KDEwKTsKKwkJb3V0YihoY3IsIGh3X3ByaXYtPmNvcl9vZmZzZXQgKyAyKTsKKwkJbWRlbGF5KDEwKTsKKwkJb3V0Yihjb3JzYXZlICYgfkNPUl9TUkVTRVQsIGh3X3ByaXYtPmNvcl9vZmZzZXQpOworCQltZGVsYXkoMTApOworCX0gZWxzZSB7CisJCS8qIFBMWDkwNTIgKi8KKwkJY29yc2F2ZSA9IHJlYWRiKGh3X3ByaXYtPmF0dHJfbWVtICsgaHdfcHJpdi0+Y29yX29mZnNldCk7CisJCXdyaXRlYihjb3JzYXZlIHwgQ09SX1NSRVNFVCwKKwkJICAgICAgIGh3X3ByaXYtPmF0dHJfbWVtICsgaHdfcHJpdi0+Y29yX29mZnNldCk7CisJCW1kZWxheSgxMCk7CisJCXdyaXRlYihoY3IsIGh3X3ByaXYtPmF0dHJfbWVtICsgaHdfcHJpdi0+Y29yX29mZnNldCArIDIpOworCQltZGVsYXkoMTApOworCQl3cml0ZWIoY29yc2F2ZSAmIH5DT1JfU1JFU0VULAorCQkgICAgICAgaHdfcHJpdi0+YXR0cl9tZW0gKyBod19wcml2LT5jb3Jfb2Zmc2V0KTsKKwkJbWRlbGF5KDEwKTsKKwl9Cit9CisKKworc3RhdGljIHN0cnVjdCBwcmlzbTJfaGVscGVyX2Z1bmN0aW9ucyBwcmlzbTJfcGx4X2Z1bmNzID0KK3sKKwkuY2FyZF9wcmVzZW50CT0gTlVMTCwKKwkuY29yX3NyZXNldAk9IHByaXNtMl9wbHhfY29yX3NyZXNldCwKKwkuZGV2X29wZW4JPSBOVUxMLAorCS5kZXZfY2xvc2UJPSBOVUxMLAorCS5nZW5lc2lzX3Jlc2V0CT0gcHJpc20yX3BseF9nZW5lc2lzX3Jlc2V0LAorCS5od190eXBlCT0gSE9TVEFQX0hXX1BMWCwKK307CisKKworc3RhdGljIGludCBwcmlzbTJfcGx4X2NoZWNrX2Npcyh2b2lkIF9faW9tZW0gKmF0dHJfbWVtLCBpbnQgYXR0cl9sZW4sCisJCQkJdW5zaWduZWQgaW50ICpjb3Jfb2Zmc2V0LAorCQkJCXVuc2lnbmVkIGludCAqY29yX2luZGV4KQoreworI2RlZmluZSBDSVNUUExfQ09ORklHIDB4MUEKKyNkZWZpbmUgQ0lTVFBMX01BTkZJRCAweDIwCisjZGVmaW5lIENJU1RQTF9FTkQgMHhGRgorI2RlZmluZSBDSVNfTUFYX0xFTiAyNTYKKwl1OCAqY2lzOworCWludCBpLCBwb3M7CisJdW5zaWduZWQgaW50IHJtc3osIHJhc3osIG1hbmZpZDEsIG1hbmZpZDI7CisJc3RydWN0IHByaXNtMl9wbHhfbWFuZmlkICptYW5maWQ7CisKKwljaXMgPSBrbWFsbG9jKENJU19NQVhfTEVOLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2lzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogcmVhZCBDSVM7IGl0IGlzIGluIGV2ZW4gb2Zmc2V0cyBpbiB0aGUgYmVnaW5uaW5nIG9mIGF0dHJfbWVtICovCisJZm9yIChpID0gMDsgaSA8IENJU19NQVhfTEVOOyBpKyspCisJCWNpc1tpXSA9IHJlYWRiKGF0dHJfbWVtICsgMiAqIGkpOworCXByaW50ayhLRVJOX0RFQlVHICIlczogQ0lTOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAuLi5cbiIsCisJICAgICAgIGRldl9pbmZvLCBjaXNbMF0sIGNpc1sxXSwgY2lzWzJdLCBjaXNbM10sIGNpc1s0XSwgY2lzWzVdKTsKKworCS8qIHNldCByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBQcmlzbTIgY2FyZHMganVzdCBpbiBjYXNlIENJUyBwYXJzaW5nCisJICogZmFpbHMgKi8KKwkqY29yX29mZnNldCA9IDB4M2UwOworCSpjb3JfaW5kZXggPSAweDAxOworCW1hbmZpZDEgPSBtYW5maWQyID0gMDsKKworCXBvcyA9IDA7CisJd2hpbGUgKHBvcyA8IENJU19NQVhfTEVOIC0gMSAmJiBjaXNbcG9zXSAhPSBDSVNUUExfRU5EKSB7CisJCWlmIChwb3MgKyBjaXNbcG9zICsgMV0gPj0gQ0lTX01BWF9MRU4pCisJCQlnb3RvIGNpc19lcnJvcjsKKworCQlzd2l0Y2ggKGNpc1twb3NdKSB7CisJCWNhc2UgQ0lTVFBMX0NPTkZJRzoKKwkJCWlmIChjaXNbcG9zICsgMV0gPCAxKQorCQkJCWdvdG8gY2lzX2Vycm9yOworCQkJcm1zeiA9IChjaXNbcG9zICsgMl0gJiAweDNjKSA+PiAyOworCQkJcmFzeiA9IGNpc1twb3MgKyAyXSAmIDB4MDM7CisJCQlpZiAoNCArIHJhc3ogKyBybXN6ID4gY2lzW3BvcyArIDFdKQorCQkJCWdvdG8gY2lzX2Vycm9yOworCQkJKmNvcl9pbmRleCA9IGNpc1twb3MgKyAzXSAmIDB4M0Y7CisJCQkqY29yX29mZnNldCA9IDA7CisJCQlmb3IgKGkgPSAwOyBpIDw9IHJhc3o7IGkrKykKKwkJCQkqY29yX29mZnNldCArPSBjaXNbcG9zICsgNCArIGldIDw8ICg4ICogaSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNvcl9pbmRleD0weCV4ICIKKwkJCSAgICAgICAiY29yX29mZnNldD0weCV4XG4iLCBkZXZfaW5mbywKKwkJCSAgICAgICAqY29yX2luZGV4LCAqY29yX29mZnNldCk7CisJCQlpZiAoKmNvcl9vZmZzZXQgPiBhdHRyX2xlbikgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENPUiBvZmZzZXQgbm90IHdpdGhpbiAiCisJCQkJICAgICAgICJhdHRyX21lbVxuIiwgZGV2X2luZm8pOworCQkJCWtmcmVlKGNpcyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDSVNUUExfTUFORklEOgorCQkJaWYgKGNpc1twb3MgKyAxXSA8IDQpCisJCQkJZ290byBjaXNfZXJyb3I7CisJCQltYW5maWQxID0gY2lzW3BvcyArIDJdICsgKGNpc1twb3MgKyAzXSA8PCA4KTsKKwkJCW1hbmZpZDIgPSBjaXNbcG9zICsgNF0gKyAoY2lzW3BvcyArIDVdIDw8IDgpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBtYW5maWQ9MHglMDR4LCAweCUwNHhcbiIsCisJCQkgICAgICAgZGV2X2luZm8sIG1hbmZpZDEsIG1hbmZpZDIpOworCQkJYnJlYWs7CisJCX0KKworCQlwb3MgKz0gY2lzW3BvcyArIDFdICsgMjsKKwl9CisKKwlpZiAocG9zID49IENJU19NQVhfTEVOIHx8IGNpc1twb3NdICE9IENJU1RQTF9FTkQpCisJCWdvdG8gY2lzX2Vycm9yOworCisJZm9yIChtYW5maWQgPSBwcmlzbTJfcGx4X2tub3duX21hbmZpZHM7IG1hbmZpZC0+bWFuZmlkMSAhPSAwOyBtYW5maWQrKykKKwkJaWYgKG1hbmZpZDEgPT0gbWFuZmlkLT5tYW5maWQxICYmIG1hbmZpZDIgPT0gbWFuZmlkLT5tYW5maWQyKSB7CisJCQlrZnJlZShjaXMpOworCQkJcmV0dXJuIDA7CisJCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiB1bmtub3duIG1hbmZpZCAweCUwNHgsIDB4JTA0eCAtIGFzc3VtaW5nIHRoaXMgaXMiCisJICAgICAgICIgbm90IHN1cHBvcnRlZCBjYXJkXG4iLCBkZXZfaW5mbywgbWFuZmlkMSwgbWFuZmlkMik7CisJZ290byBmYWlsOworCisgY2lzX2Vycm9yOgorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIENJUyBkYXRhXG4iLCBkZXZfaW5mbyk7CisKKyBmYWlsOgorCWtmcmVlKGNpcyk7CisJaWYgKGlnbm9yZV9jaXMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGlnbm9yZV9jaXMgcGFyYW1ldGVyIHNldCAtIGlnbm9yaW5nICIKKwkJICAgICAgICJlcnJvcnMgZHVyaW5nIENJUyB2ZXJpZmljYXRpb25cbiIsIGRldl9pbmZvKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtMTsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl9wbHhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXVuc2lnbmVkIGludCBwY2NhcmRfaW9hZGRyLCBwbHhfaW9hZGRyOworCXVuc2lnbmVkIGxvbmcgcGNjYXJkX2F0dHJfbWVtOworCXVuc2lnbmVkIGludCBwY2NhcmRfYXR0cl9sZW47CisJdm9pZCBfX2lvbWVtICphdHRyX21lbSA9IE5VTEw7CisJdW5zaWduZWQgaW50IGNvcl9vZmZzZXQsIGNvcl9pbmRleDsKKwl1MzIgcmVnOworCWxvY2FsX2luZm9fdCAqbG9jYWwgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKwlzdGF0aWMgaW50IGNhcmRzX2ZvdW5kIC8qID0gMCAqLzsKKwlpbnQgaXJxX3JlZ2lzdGVyZWQgPSAwOworCWludCB0bWQ3MTYwOworCXN0cnVjdCBob3N0YXBfcGx4X3ByaXYgKmh3X3ByaXY7CisKKwlod19wcml2ID0ga21hbGxvYyhzaXplb2YoKmh3X3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaHdfcHJpdiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoaHdfcHJpdiwgMCwgc2l6ZW9mKCpod19wcml2KSk7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRUlPOworCisJLyogTmF0aW9uYWwgRGF0YWNvbW0gTkNQMTMwIGJhc2VkIG9uIFRNRDcxNjAsIG5vdCBQTFg5MDUyLiAqLworCXRtZDcxNjAgPSAocGRldi0+dmVuZG9yID09IDB4MTVlOCkgJiYgKHBkZXYtPmRldmljZSA9PSAweDAxMzEpOworCisJcGx4X2lvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwlwY2NhcmRfaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHRtZDcxNjAgPyAyIDogMyk7CisKKwlpZiAodG1kNzE2MCkgeworCQkvKiBUTUQ3MTYwICovCisJCWF0dHJfbWVtID0gTlVMTDsgLyogbm8gYWNjZXNzIHRvIFBDIENhcmQgYXR0cmlidXRlIG1lbW9yeSAqLworCisJCXByaW50ayhLRVJOX0lORk8gIlRNRDcxNjAgUENJL1BDTUNJQSBhZGFwdGVyOiBpbz0weCV4LCAiCisJCSAgICAgICAiaXJxPSVkLCBwY2NhcmRfaW89MHgleFxuIiwKKwkJICAgICAgIHBseF9pb2FkZHIsIHBkZXYtPmlycSwgcGNjYXJkX2lvYWRkcik7CisKKwkJY29yX29mZnNldCA9IHBseF9pb2FkZHI7CisJCWNvcl9pbmRleCA9IDB4MDQ7CisKKwkJb3V0Yihjb3JfaW5kZXggfCBDT1JfTEVWTFJFUSB8IENPUl9FTkFCTEVfRlVOQywgcGx4X2lvYWRkcik7CisJCW1kZWxheSgxKTsKKwkJcmVnID0gaW5iKHBseF9pb2FkZHIpOworCQlpZiAocmVnICE9IChjb3JfaW5kZXggfCBDT1JfTEVWTFJFUSB8IENPUl9FTkFCTEVfRlVOQykpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHNldHRpbmcgQ09SIChleHBlY3RlZD0iCisJCQkgICAgICAgIjB4JTAyeCwgd2FzPTB4JTAyeClcbiIsIGRldl9pbmZvLAorCQkJICAgICAgIGNvcl9pbmRleCB8IENPUl9MRVZMUkVRIHwgQ09SX0VOQUJMRV9GVU5DLCByZWcpOworCQkJZ290byBmYWlsOworCQl9CisJfSBlbHNlIHsKKwkJLyogUExYOTA1MiAqLworCQlwY2NhcmRfYXR0cl9tZW0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisJCXBjY2FyZF9hdHRyX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMik7CisJCWlmIChwY2NhcmRfYXR0cl9sZW4gPCBQTFhfTUlOX0FUVFJfTEVOKQorCQkJZ290byBmYWlsOworCisKKwkJYXR0cl9tZW0gPSBpb3JlbWFwKHBjY2FyZF9hdHRyX21lbSwgcGNjYXJkX2F0dHJfbGVuKTsKKwkJaWYgKGF0dHJfbWVtID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCByZW1hcCBhdHRyX21lbVxuIiwKKwkJCSAgICAgICBkZXZfaW5mbyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICJQTFg5MDUyIFBDSS9QQ01DSUEgYWRhcHRlcjogIgorCQkgICAgICAgIm1lbT0weCVseCwgcGx4X2lvPTB4JXgsIGlycT0lZCwgcGNjYXJkX2lvPTB4JXhcbiIsCisJCSAgICAgICBwY2NhcmRfYXR0cl9tZW0sIHBseF9pb2FkZHIsIHBkZXYtPmlycSwgcGNjYXJkX2lvYWRkcik7CisKKwkJaWYgKHByaXNtMl9wbHhfY2hlY2tfY2lzKGF0dHJfbWVtLCBwY2NhcmRfYXR0cl9sZW4sCisJCQkJCSAmY29yX29mZnNldCwgJmNvcl9pbmRleCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIlVua25vd24gUEMgQ2FyZCBDSVMgLSBub3QgYSAiCisJCQkgICAgICAgIlByaXNtMi8yLjUgY2FyZD9cbiIpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlByaXNtMi8yLjUgUEMgQ2FyZCBkZXRlY3RlZCBpbiBQTFg5MDUyICIKKwkJICAgICAgICJhZGFwdGVyXG4iKTsKKworCQkvKiBXcml0ZSBDT1IgdG8gZW5hYmxlIFBDIENhcmQgKi8KKwkJd3JpdGViKGNvcl9pbmRleCB8IENPUl9MRVZMUkVRIHwgQ09SX0VOQUJMRV9GVU5DLAorCQkgICAgICAgYXR0cl9tZW0gKyBjb3Jfb2Zmc2V0KTsKKworCQkvKiBFbmFibGUgUENJIGludGVycnVwdHMgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgZW5hYmxlZCAqLworCQlyZWcgPSBpbmwocGx4X2lvYWRkciArIFBMWF9JTlRDU1IpOworCQlwcmludGsoS0VSTl9ERUJVRyAiUExYX0lOVENTUj0weCV4XG4iLCByZWcpOworCQlpZiAoIShyZWcgJiBQTFhfSU5UQ1NSX1BDSV9JTlRFTikpIHsKKwkJCW91dGwocmVnIHwgUExYX0lOVENTUl9QQ0lfSU5URU4sCisJCQkgICAgIHBseF9pb2FkZHIgKyBQTFhfSU5UQ1NSKTsKKwkJCWlmICghKGlubChwbHhfaW9hZGRyICsgUExYX0lOVENTUikgJgorCQkJICAgICAgUExYX0lOVENTUl9QQ0lfSU5URU4pKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBlbmFibGUgIgorCQkJCSAgICAgICAiTG9jYWwgSW50ZXJydXB0c1xuIiwgZGV2X2luZm8pOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCisJCXJlZyA9IGlubChwbHhfaW9hZGRyICsgUExYX0NOVFJMKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlBMWF9DTlRSTD0weCV4IChTZXJpYWwgRUVQUk9NICIKKwkJICAgICAgICJwcmVzZW50PSVkKVxuIiwKKwkJICAgICAgIHJlZywgKHJlZyAmIFBMWF9DTlRSTF9TRVJJQUxfRUVQUk9NX1BSRVNFTlQpICE9IDApOworCQkvKiBzaG91bGQgc2V0IFBMWF9QQ0lJUFIgdG8gMHgwMSAoSU5UQSMpIGlmIFNlcmlhbCBFRVBST00gaXMKKwkJICogbm90IHByZXNlbnQ7IGJ1dCBhcmUgdGhlcmUgcmVhbGx5IHN1Y2ggY2FyZHMgaW4gdXNlKD8pICovCisJfQorCisJZGV2ID0gcHJpc20yX2luaXRfbG9jYWxfZGF0YSgmcHJpc20yX3BseF9mdW5jcywgY2FyZHNfZm91bmQsCisJCQkJICAgICAmcGRldi0+ZGV2KTsKKwlpZiAoZGV2ID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKwlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisJbG9jYWwtPmh3X3ByaXYgPSBod19wcml2OworCWNhcmRzX2ZvdW5kKys7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmJhc2VfYWRkciA9IHBjY2FyZF9pb2FkZHI7CisJaHdfcHJpdi0+YXR0cl9tZW0gPSBhdHRyX21lbTsKKwlod19wcml2LT5jb3Jfb2Zmc2V0ID0gY29yX29mZnNldDsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBwcmlzbTJfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLAorCQkJZGV2KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVxdWVzdF9pcnEgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIGZhaWw7CisJfSBlbHNlCisJCWlycV9yZWdpc3RlcmVkID0gMTsKKworCWlmIChwcmlzbTJfaHdfY29uZmlnKGRldiwgMSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoYXJkd2FyZSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCisJCSAgICAgICBkZXZfaW5mbyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gaG9zdGFwX2h3X3JlYWR5KGRldik7CisKKyBmYWlsOgorCWtmcmVlKGh3X3ByaXYpOworCWlmIChsb2NhbCkKKwkJbG9jYWwtPmh3X3ByaXYgPSBOVUxMOworCXByaXNtMl9mcmVlX2xvY2FsX2RhdGEoZGV2KTsKKworCWlmIChpcnFfcmVnaXN0ZXJlZCAmJiBkZXYpCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJaWYgKGF0dHJfbWVtKQorCQlpb3VubWFwKGF0dHJfbWVtKTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJldHVybiAtRU5PREVWOworfQorCisKK3N0YXRpYyB2b2lkIHByaXNtMl9wbHhfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOworCXN0cnVjdCBob3N0YXBfcGx4X3ByaXYgKmh3X3ByaXY7CisKKwlkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWh3X3ByaXYgPSBpZmFjZS0+bG9jYWwtPmh3X3ByaXY7CisKKwkvKiBSZXNldCB0aGUgaGFyZHdhcmUsIGFuZCBlbnN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuICovCisJcHJpc20yX3BseF9jb3Jfc3Jlc2V0KGlmYWNlLT5sb2NhbCk7CisJaGZhMzg0eF9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKKworCWlmIChod19wcml2LT5hdHRyX21lbSkKKwkJaW91bm1hcChod19wcml2LT5hdHRyX21lbSk7CisJaWYgKGRldi0+aXJxKQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWtmcmVlKGlmYWNlLT5sb2NhbC0+aHdfcHJpdik7CisJaWZhY2UtPmxvY2FsLT5od19wcml2ID0gTlVMTDsKKwlwcmlzbTJfZnJlZV9sb2NhbF9kYXRhKGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwcmlzbTJfcGx4X2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHByaXNtMl9wbHhfZHJ2X2lkID0geworCS5uYW1lCQk9ICJwcmlzbTJfcGx4IiwKKwkuaWRfdGFibGUJPSBwcmlzbTJfcGx4X2lkX3RhYmxlLAorCS5wcm9iZQkJPSBwcmlzbTJfcGx4X3Byb2JlLAorCS5yZW1vdmUJCT0gcHJpc20yX3BseF9yZW1vdmUsCisJLnN1c3BlbmQJPSBOVUxMLAorCS5yZXN1bWUJCT0gTlVMTCwKKwkuZW5hYmxlX3dha2UJPSBOVUxMCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcHJpc20yX3BseCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlc1xuIiwgZGV2X2luZm8sIHZlcnNpb24pOworCisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnByaXNtMl9wbHhfZHJ2X2lkKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9wcmlzbTJfcGx4KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwcmlzbTJfcGx4X2Rydl9pZCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERyaXZlciB1bmxvYWRlZFxuIiwgZGV2X2luZm8pOworfQorCisKK21vZHVsZV9pbml0KGluaXRfcHJpc20yX3BseCk7Cittb2R1bGVfZXhpdChleGl0X3ByaXNtMl9wbHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wcm9jLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGE0Y2JkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wcm9jLmMKQEAgLTAsMCArMSw0NDggQEAKKy8qIC9wcm9jIHJvdXRpbmVzIGZvciBIb3N0IEFQIGRyaXZlciAqLworCisjZGVmaW5lIFBST0NfTElNSVQgKFBBR0VfU0laRSAtIDgwKQorCisKKyNpZm5kZWYgUFJJU00yX05PX1BST0NGU19ERUJVRworc3RhdGljIGludCBwcmlzbTJfZGVidWdfcHJvY19yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpwID0gcGFnZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gKGxvY2FsX2luZm9fdCAqKSBkYXRhOworCWludCBpOworCisJaWYgKG9mZiAhPSAwKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlwICs9IHNwcmludGYocCwgIm5leHRfdHhmaWQ9JWQgbmV4dF9hbGxvYz0lZFxuIiwKKwkJICAgICBsb2NhbC0+bmV4dF90eGZpZCwgbG9jYWwtPm5leHRfYWxsb2MpOworCWZvciAoaSA9IDA7IGkgPCBQUklTTTJfVFhGSURfQ09VTlQ7IGkrKykKKwkJcCArPSBzcHJpbnRmKHAsICJGSUQ6IHR4PSUwNFggaW50cmFuc21pdD0lMDRYXG4iLAorCQkJICAgICBsb2NhbC0+dHhmaWRbaV0sIGxvY2FsLT5pbnRyYW5zbWl0ZmlkW2ldKTsKKwlwICs9IHNwcmludGYocCwgIkZXIFRYIHJhdGUgY29udHJvbDogJWRcbiIsIGxvY2FsLT5md190eF9yYXRlX2NvbnRyb2wpOworCXAgKz0gc3ByaW50ZihwLCAiYmVhY29uX2ludD0lZFxuIiwgbG9jYWwtPmJlYWNvbl9pbnQpOworCXAgKz0gc3ByaW50ZihwLCAiZHRpbV9wZXJpb2Q9JWRcbiIsIGxvY2FsLT5kdGltX3BlcmlvZCk7CisJcCArPSBzcHJpbnRmKHAsICJ3ZHNfbWF4X2Nvbm5lY3Rpb25zPSVkXG4iLAorCQkgICAgIGxvY2FsLT53ZHNfbWF4X2Nvbm5lY3Rpb25zKTsKKwlwICs9IHNwcmludGYocCwgImRldl9lbmFibGVkPSVkXG4iLCBsb2NhbC0+ZGV2X2VuYWJsZWQpOworCXAgKz0gc3ByaW50ZihwLCAic3dfdGlja19zdHVjaz0lZFxuIiwgbG9jYWwtPnN3X3RpY2tfc3R1Y2spOworCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKSB7CisJCWlmIChsb2NhbC0+Y3J5cHRbaV0gJiYgbG9jYWwtPmNyeXB0W2ldLT5vcHMpIHsKKwkJCXAgKz0gc3ByaW50ZihwLCAiY3J5cHRbJWRdPSVzXG4iLAorCQkJCSAgICAgaSwgbG9jYWwtPmNyeXB0W2ldLT5vcHMtPm5hbWUpOworCQl9CisJfQorCXAgKz0gc3ByaW50ZihwLCAicHJpX29ubHk9JWRcbiIsIGxvY2FsLT5wcmlfb25seSk7CisJcCArPSBzcHJpbnRmKHAsICJwY2k9JWRcbiIsIGxvY2FsLT5mdW5jLT5od190eXBlID09IEhPU1RBUF9IV19QQ0kpOworCXAgKz0gc3ByaW50ZihwLCAic3JhbV90eXBlPSVkXG4iLCBsb2NhbC0+c3JhbV90eXBlKTsKKwlwICs9IHNwcmludGYocCwgIm5vX3ByaT0lZFxuIiwgbG9jYWwtPm5vX3ByaSk7CisKKwlyZXR1cm4gKHAgLSBwYWdlKTsKK30KKyNlbmRpZiAvKiBQUklTTTJfTk9fUFJPQ0ZTX0RFQlVHICovCisKKworc3RhdGljIGludCBwcmlzbTJfc3RhdHNfcHJvY19yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpwID0gcGFnZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gKGxvY2FsX2luZm9fdCAqKSBkYXRhOworCXN0cnVjdCBjb21tX3RhbGxpZXNfc3VtcyAqc3VtcyA9IChzdHJ1Y3QgY29tbV90YWxsaWVzX3N1bXMgKikKKwkJJmxvY2FsLT5jb21tX3RhbGxpZXM7CisKKwlpZiAob2ZmICE9IDApIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCXAgKz0gc3ByaW50ZihwLCAiVHhVbmljYXN0RnJhbWVzPSV1XG4iLCBzdW1zLT50eF91bmljYXN0X2ZyYW1lcyk7CisJcCArPSBzcHJpbnRmKHAsICJUeE11bHRpY2FzdGZyYW1lcz0ldVxuIiwgc3Vtcy0+dHhfbXVsdGljYXN0X2ZyYW1lcyk7CisJcCArPSBzcHJpbnRmKHAsICJUeEZyYWdtZW50cz0ldVxuIiwgc3Vtcy0+dHhfZnJhZ21lbnRzKTsKKwlwICs9IHNwcmludGYocCwgIlR4VW5pY2FzdE9jdGV0cz0ldVxuIiwgc3Vtcy0+dHhfdW5pY2FzdF9vY3RldHMpOworCXAgKz0gc3ByaW50ZihwLCAiVHhNdWx0aWNhc3RPY3RldHM9JXVcbiIsIHN1bXMtPnR4X211bHRpY2FzdF9vY3RldHMpOworCXAgKz0gc3ByaW50ZihwLCAiVHhEZWZlcnJlZFRyYW5zbWlzc2lvbnM9JXVcbiIsCisJCSAgICAgc3Vtcy0+dHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9ucyk7CisJcCArPSBzcHJpbnRmKHAsICJUeFNpbmdsZVJldHJ5RnJhbWVzPSV1XG4iLAorCQkgICAgIHN1bXMtPnR4X3NpbmdsZV9yZXRyeV9mcmFtZXMpOworCXAgKz0gc3ByaW50ZihwLCAiVHhNdWx0aXBsZVJldHJ5RnJhbWVzPSV1XG4iLAorCQkgICAgIHN1bXMtPnR4X211bHRpcGxlX3JldHJ5X2ZyYW1lcyk7CisJcCArPSBzcHJpbnRmKHAsICJUeFJldHJ5TGltaXRFeGNlZWRlZD0ldVxuIiwKKwkJICAgICBzdW1zLT50eF9yZXRyeV9saW1pdF9leGNlZWRlZCk7CisJcCArPSBzcHJpbnRmKHAsICJUeERpc2NhcmRzPSV1XG4iLCBzdW1zLT50eF9kaXNjYXJkcyk7CisJcCArPSBzcHJpbnRmKHAsICJSeFVuaWNhc3RGcmFtZXM9JXVcbiIsIHN1bXMtPnJ4X3VuaWNhc3RfZnJhbWVzKTsKKwlwICs9IHNwcmludGYocCwgIlJ4TXVsdGljYXN0RnJhbWVzPSV1XG4iLCBzdW1zLT5yeF9tdWx0aWNhc3RfZnJhbWVzKTsKKwlwICs9IHNwcmludGYocCwgIlJ4RnJhZ21lbnRzPSV1XG4iLCBzdW1zLT5yeF9mcmFnbWVudHMpOworCXAgKz0gc3ByaW50ZihwLCAiUnhVbmljYXN0T2N0ZXRzPSV1XG4iLCBzdW1zLT5yeF91bmljYXN0X29jdGV0cyk7CisJcCArPSBzcHJpbnRmKHAsICJSeE11bHRpY2FzdE9jdGV0cz0ldVxuIiwgc3Vtcy0+cnhfbXVsdGljYXN0X29jdGV0cyk7CisJcCArPSBzcHJpbnRmKHAsICJSeEZDU0Vycm9ycz0ldVxuIiwgc3Vtcy0+cnhfZmNzX2Vycm9ycyk7CisJcCArPSBzcHJpbnRmKHAsICJSeERpc2NhcmRzTm9CdWZmZXI9JXVcbiIsCisJCSAgICAgc3Vtcy0+cnhfZGlzY2FyZHNfbm9fYnVmZmVyKTsKKwlwICs9IHNwcmludGYocCwgIlR4RGlzY2FyZHNXcm9uZ1NBPSV1XG4iLCBzdW1zLT50eF9kaXNjYXJkc193cm9uZ19zYSk7CisJcCArPSBzcHJpbnRmKHAsICJSeERpc2NhcmRzV0VQVW5kZWNyeXB0YWJsZT0ldVxuIiwKKwkJICAgICBzdW1zLT5yeF9kaXNjYXJkc193ZXBfdW5kZWNyeXB0YWJsZSk7CisJcCArPSBzcHJpbnRmKHAsICJSeE1lc3NhZ2VJbk1zZ0ZyYWdtZW50cz0ldVxuIiwKKwkJICAgICBzdW1zLT5yeF9tZXNzYWdlX2luX21zZ19mcmFnbWVudHMpOworCXAgKz0gc3ByaW50ZihwLCAiUnhNZXNzYWdlSW5CYWRNc2dGcmFnbWVudHM9JXVcbiIsCisJCSAgICAgc3Vtcy0+cnhfbWVzc2FnZV9pbl9iYWRfbXNnX2ZyYWdtZW50cyk7CisJLyogRklYOiB0aGlzIG1heSBncm93IHRvbyBsb25nIGZvciBvbmUgcGFnZSg/KSAqLworCisJcmV0dXJuIChwIC0gcGFnZSk7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfd2RzX3Byb2NfcmVhZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWNoYXIgKnAgPSBwYWdlOworCWxvY2FsX2luZm9fdCAqbG9jYWwgPSAobG9jYWxfaW5mb190ICopIGRhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZTsKKworCWlmIChvZmYgPiBQUk9DX0xJTUlUKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZWFkX2xvY2tfYmgoJmxvY2FsLT5pZmFjZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHB0ciwgJmxvY2FsLT5ob3N0YXBfaW50ZXJmYWNlcykgeworCQlpZmFjZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSwgbGlzdCk7CisJCWlmIChpZmFjZS0+dHlwZSAhPSBIT1NUQVBfSU5URVJGQUNFX1dEUykKKwkJCWNvbnRpbnVlOworCQlwICs9IHNwcmludGYocCwgIiVzXHQiIE1BQ1NUUiAiXG4iLAorCQkJICAgICBpZmFjZS0+ZGV2LT5uYW1lLAorCQkJICAgICBNQUMyU1RSKGlmYWNlLT51Lndkcy5yZW1vdGVfYWRkcikpOworCQlpZiAoKHAgLSBwYWdlKSA+IFBST0NfTElNSVQpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogd2RzIHByb2MgZGlkIG5vdCBmaXRcbiIsCisJCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmbG9jYWwtPmlmYWNlX2xvY2spOworCisJaWYgKChwIC0gcGFnZSkgPD0gb2ZmKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJcmV0dXJuIChwIC0gcGFnZSAtIG9mZik7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfYnNzX2xpc3RfcHJvY19yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpwID0gcGFnZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gKGxvY2FsX2luZm9fdCAqKSBkYXRhOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlzdHJ1Y3QgaG9zdGFwX2Jzc19pbmZvICpic3M7CisJaW50IGk7CisKKwlpZiAob2ZmID4gUFJPQ19MSU1JVCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcCArPSBzcHJpbnRmKHAsICIjQlNTSURcdGxhc3RfdXBkYXRlXHRjb3VudFx0Y2FwYWJfaW5mb1x0U1NJRCh0eHQpXHQiCisJCSAgICAgIlNTSUQoaGV4KVx0V1BBIElFXG4iKTsKKwlzcGluX2xvY2tfYmgoJmxvY2FsLT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHB0ciwgJmxvY2FsLT5ic3NfbGlzdCkgeworCQlic3MgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGhvc3RhcF9ic3NfaW5mbywgbGlzdCk7CisJCXAgKz0gc3ByaW50ZihwLCBNQUNTVFIgIlx0JWx1XHQldVx0MHgleFx0IiwKKwkJCSAgICAgTUFDMlNUUihic3MtPmJzc2lkKSwgYnNzLT5sYXN0X3VwZGF0ZSwKKwkJCSAgICAgYnNzLT5jb3VudCwgYnNzLT5jYXBhYl9pbmZvKTsKKwkJZm9yIChpID0gMDsgaSA8IGJzcy0+c3NpZF9sZW47IGkrKykgeworCQkJcCArPSBzcHJpbnRmKHAsICIlYyIsCisJCQkJICAgICBic3MtPnNzaWRbaV0gPj0gMzIgJiYgYnNzLT5zc2lkW2ldIDwgMTI3ID8KKwkJCQkgICAgIGJzcy0+c3NpZFtpXSA6ICdfJyk7CisJCX0KKwkJcCArPSBzcHJpbnRmKHAsICJcdCIpOworCQlmb3IgKGkgPSAwOyBpIDwgYnNzLT5zc2lkX2xlbjsgaSsrKSB7CisJCQlwICs9IHNwcmludGYocCwgIiUwMngiLCBic3MtPnNzaWRbaV0pOworCQl9CisJCXAgKz0gc3ByaW50ZihwLCAiXHQiKTsKKwkJZm9yIChpID0gMDsgaSA8IGJzcy0+d3BhX2llX2xlbjsgaSsrKSB7CisJCQlwICs9IHNwcmludGYocCwgIiUwMngiLCBic3MtPndwYV9pZVtpXSk7CisJCX0KKwkJcCArPSBzcHJpbnRmKHAsICJcbiIpOworCQlpZiAoKHAgLSBwYWdlKSA+IFBST0NfTElNSVQpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQlNTIHByb2MgZGlkIG5vdCBmaXRcbiIsCisJCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmbG9jYWwtPmxvY2spOworCisJaWYgKChwIC0gcGFnZSkgPD0gb2ZmKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJcmV0dXJuIChwIC0gcGFnZSAtIG9mZik7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfY3J5cHRfcHJvY19yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpwID0gcGFnZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gKGxvY2FsX2luZm9fdCAqKSBkYXRhOworCWludCBpOworCisJaWYgKG9mZiA+IFBST0NfTElNSVQpIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCXAgKz0gc3ByaW50ZihwLCAidHhfa2V5aWR4PSVkXG4iLCBsb2NhbC0+dHhfa2V5aWR4KTsKKwlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgeworCQlpZiAobG9jYWwtPmNyeXB0W2ldICYmIGxvY2FsLT5jcnlwdFtpXS0+b3BzICYmCisJCSAgICBsb2NhbC0+Y3J5cHRbaV0tPm9wcy0+cHJpbnRfc3RhdHMpIHsKKwkJCXAgPSBsb2NhbC0+Y3J5cHRbaV0tPm9wcy0+cHJpbnRfc3RhdHMoCisJCQkJcCwgbG9jYWwtPmNyeXB0W2ldLT5wcml2KTsKKwkJfQorCX0KKworCWlmICgocCAtIHBhZ2UpIDw9IG9mZikgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCXJldHVybiAocCAtIHBhZ2UgLSBvZmYpOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX3BkYV9wcm9jX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gKGxvY2FsX2luZm9fdCAqKSBkYXRhOworCisJaWYgKGxvY2FsLT5wZGEgPT0gTlVMTCB8fCBvZmYgPj0gUFJJU00yX1BEQV9TSVpFKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAob2ZmICsgY291bnQgPiBQUklTTTJfUERBX1NJWkUpCisJCWNvdW50ID0gUFJJU00yX1BEQV9TSVpFIC0gb2ZmOworCisJbWVtY3B5KHBhZ2UsIGxvY2FsLT5wZGEgKyBvZmYsIGNvdW50KTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfYXV4X2R1bXBfcHJvY19yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gKGxvY2FsX2luZm9fdCAqKSBkYXRhOworCisJaWYgKGxvY2FsLT5mdW5jLT5yZWFkX2F1eCA9PSBOVUxMKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobG9jYWwtPmZ1bmMtPnJlYWRfYXV4KGxvY2FsLT5kZXYsIG9mZiwgY291bnQsIHBhZ2UpKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJKnN0YXJ0ID0gcGFnZTsKKworCXJldHVybiBjb3VudDsKK30KKworCisjaWZkZWYgUFJJU00yX0lPX0RFQlVHCitzdGF0aWMgaW50IHByaXNtMl9pb19kZWJ1Z19wcm9jX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWxvY2FsX2luZm9fdCAqbG9jYWwgPSAobG9jYWxfaW5mb190ICopIGRhdGE7CisJaW50IGhlYWQgPSBsb2NhbC0+aW9fZGVidWdfaGVhZDsKKwlpbnQgc3RhcnRfYnl0ZXMsIGxlZnQsIGNvcHksIGNvcGllZDsKKworCWlmIChvZmYgKyBjb3VudCA+IFBSSVNNMl9JT19ERUJVR19TSVpFICogNCkgeworCQkqZW9mID0gMTsKKwkJaWYgKG9mZiA+PSBQUklTTTJfSU9fREVCVUdfU0laRSAqIDQpCisJCQlyZXR1cm4gMDsKKwkJY291bnQgPSBQUklTTTJfSU9fREVCVUdfU0laRSAqIDQgLSBvZmY7CisJfQorCisJY29waWVkID0gMDsKKwlzdGFydF9ieXRlcyA9IChQUklTTTJfSU9fREVCVUdfU0laRSAtIGhlYWQpICogNDsKKwlsZWZ0ID0gY291bnQ7CisKKwlpZiAob2ZmIDwgc3RhcnRfYnl0ZXMpIHsKKwkJY29weSA9IHN0YXJ0X2J5dGVzIC0gb2ZmOworCQlpZiAoY29weSA+IGNvdW50KQorCQkJY29weSA9IGNvdW50OworCQltZW1jcHkocGFnZSwgKCh1OCAqKSAmbG9jYWwtPmlvX2RlYnVnW2hlYWRdKSArIG9mZiwgY29weSk7CisJCWxlZnQgLT0gY29weTsKKwkJaWYgKGxlZnQgPiAwKQorCQkJbWVtY3B5KCZwYWdlW2NvcHldLCBsb2NhbC0+aW9fZGVidWcsIGxlZnQpOworCX0gZWxzZSB7CisJCW1lbWNweShwYWdlLCAoKHU4ICopIGxvY2FsLT5pb19kZWJ1ZykgKyAob2ZmIC0gc3RhcnRfYnl0ZXMpLAorCQkgICAgICAgbGVmdCk7CisJfQorCisJKnN0YXJ0ID0gcGFnZTsKKworCXJldHVybiBjb3VudDsKK30KKyNlbmRpZiAvKiBQUklTTTJfSU9fREVCVUcgKi8KKworCisjaWZuZGVmIFBSSVNNMl9OT19TVEFUSU9OX01PREVTCitzdGF0aWMgaW50IHByaXNtMl9zY2FuX3Jlc3VsdHNfcHJvY19yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpwID0gcGFnZTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gKGxvY2FsX2luZm9fdCAqKSBkYXRhOworCWludCBlbnRyeSwgaSwgbGVuLCB0b3RhbCA9IDA7CisJc3RydWN0IGhmYTM4NHhfaG9zdHNjYW5fcmVzdWx0ICpzY2FucmVzOworCXU4ICpwb3M7CisKKwlwICs9IHNwcmludGYocCwgIkNISUQgQU5MIFNMIEJjbkludCBDYXBhYiBSYXRlIEJTU0lEIEFUSU0gU3VwUmF0ZXMgIgorCQkgICAgICJTU0lEXG4iKTsKKworCXNwaW5fbG9ja19iaCgmbG9jYWwtPmxvY2spOworCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IGxvY2FsLT5sYXN0X3NjYW5fcmVzdWx0c19jb3VudDsgZW50cnkrKykgeworCQlzY2FucmVzID0gJmxvY2FsLT5sYXN0X3NjYW5fcmVzdWx0c1tlbnRyeV07CisKKwkJaWYgKHRvdGFsICsgKHAgLSBwYWdlKSA8PSBvZmYpIHsKKwkJCXRvdGFsICs9IHAgLSBwYWdlOworCQkJcCA9IHBhZ2U7CisJCX0KKwkJaWYgKHRvdGFsICsgKHAgLSBwYWdlKSA+IG9mZiArIGNvdW50KQorCQkJYnJlYWs7CisJCWlmICgocCAtIHBhZ2UpID4gKFBBR0VfU0laRSAtIDIwMCkpCisJCQlicmVhazsKKworCQlwICs9IHNwcmludGYocCwgIiVkICVkICVkICVkIDB4JTAyeCAlZCAiIE1BQ1NUUiAiICVkICIsCisJCQkgICAgIGxlMTZfdG9fY3B1KHNjYW5yZXMtPmNoaWQpLAorCQkJICAgICAoczE2KSBsZTE2X3RvX2NwdShzY2FucmVzLT5hbmwpLAorCQkJICAgICAoczE2KSBsZTE2X3RvX2NwdShzY2FucmVzLT5zbCksCisJCQkgICAgIGxlMTZfdG9fY3B1KHNjYW5yZXMtPmJlYWNvbl9pbnRlcnZhbCksCisJCQkgICAgIGxlMTZfdG9fY3B1KHNjYW5yZXMtPmNhcGFiaWxpdHkpLAorCQkJICAgICBsZTE2X3RvX2NwdShzY2FucmVzLT5yYXRlKSwKKwkJCSAgICAgTUFDMlNUUihzY2FucmVzLT5ic3NpZCksCisJCQkgICAgIGxlMTZfdG9fY3B1KHNjYW5yZXMtPmF0aW0pKTsKKworCQlwb3MgPSBzY2FucmVzLT5zdXBfcmF0ZXM7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2NhbnJlcy0+c3VwX3JhdGVzKTsgaSsrKSB7CisJCQlpZiAocG9zW2ldID09IDApCisJCQkJYnJlYWs7CisJCQlwICs9IHNwcmludGYocCwgIjwlMDJ4PiIsIHBvc1tpXSk7CisJCX0KKwkJcCArPSBzcHJpbnRmKHAsICIgIik7CisKKwkJcG9zID0gc2NhbnJlcy0+c3NpZDsKKwkJbGVuID0gbGUxNl90b19jcHUoc2NhbnJlcy0+c3NpZF9sZW4pOworCQlpZiAobGVuID4gMzIpCisJCQlsZW4gPSAzMjsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQl1bnNpZ25lZCBjaGFyIGMgPSBwb3NbaV07CisJCQlpZiAoYyA+PSAzMiAmJiBjIDwgMTI3KQorCQkJCXAgKz0gc3ByaW50ZihwLCAiJWMiLCBjKTsKKwkJCWVsc2UKKwkJCQlwICs9IHNwcmludGYocCwgIjwlMDJ4PiIsIGMpOworCQl9CisJCXAgKz0gc3ByaW50ZihwLCAiXG4iKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5sb2NrKTsKKworCXRvdGFsICs9IChwIC0gcGFnZSk7CisJaWYgKHRvdGFsID49IG9mZiArIGNvdW50KQorCQkqZW9mID0gMTsKKworCWlmICh0b3RhbCA8IG9mZikgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGVuID0gdG90YWwgLSBvZmY7CisJaWYgKGxlbiA+IChwIC0gcGFnZSkpCisJCWxlbiA9IHAgLSBwYWdlOworCSpzdGFydCA9IHAgLSBsZW47CisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKworCXJldHVybiBsZW47Cit9CisjZW5kaWYgLyogUFJJU00yX05PX1NUQVRJT05fTU9ERVMgKi8KKworCit2b2lkIGhvc3RhcF9pbml0X3Byb2MobG9jYWxfaW5mb190ICpsb2NhbCkKK3sKKwlsb2NhbC0+cHJvYyA9IE5VTEw7CisKKwlpZiAoaG9zdGFwX3Byb2MgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaG9zdGFwIHByb2MgZGlyZWN0b3J5IG5vdCBjcmVhdGVkXG4iLAorCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlsb2NhbC0+cHJvYyA9IHByb2NfbWtkaXIobG9jYWwtPmRkZXYtPm5hbWUsIGhvc3RhcF9wcm9jKTsKKwlpZiAobG9jYWwtPnByb2MgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICIvcHJvYy9uZXQvaG9zdGFwLyVzIGNyZWF0aW9uIGZhaWxlZFxuIiwKKwkJICAgICAgIGxvY2FsLT5kZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworI2lmbmRlZiBQUklTTTJfTk9fUFJPQ0ZTX0RFQlVHCisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZGVidWciLCAwLCBsb2NhbC0+cHJvYywKKwkJCSAgICAgICBwcmlzbTJfZGVidWdfcHJvY19yZWFkLCBsb2NhbCk7CisjZW5kaWYgLyogUFJJU00yX05PX1BST0NGU19ERUJVRyAqLworCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRzIiwgMCwgbG9jYWwtPnByb2MsCisJCQkgICAgICAgcHJpc20yX3N0YXRzX3Byb2NfcmVhZCwgbG9jYWwpOworCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIndkcyIsIDAsIGxvY2FsLT5wcm9jLAorCQkJICAgICAgIHByaXNtMl93ZHNfcHJvY19yZWFkLCBsb2NhbCk7CisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicGRhIiwgMCwgbG9jYWwtPnByb2MsCisJCQkgICAgICAgcHJpc20yX3BkYV9wcm9jX3JlYWQsIGxvY2FsKTsKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJhdXhfZHVtcCIsIDAsIGxvY2FsLT5wcm9jLAorCQkJICAgICAgIHByaXNtMl9hdXhfZHVtcF9wcm9jX3JlYWQsIGxvY2FsKTsKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJic3NfbGlzdCIsIDAsIGxvY2FsLT5wcm9jLAorCQkJICAgICAgIHByaXNtMl9ic3NfbGlzdF9wcm9jX3JlYWQsIGxvY2FsKTsKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJjcnlwdCIsIDAsIGxvY2FsLT5wcm9jLAorCQkJICAgICAgIHByaXNtMl9jcnlwdF9wcm9jX3JlYWQsIGxvY2FsKTsKKyNpZmRlZiBQUklTTTJfSU9fREVCVUcKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJpb19kZWJ1ZyIsIDAsIGxvY2FsLT5wcm9jLAorCQkJICAgICAgIHByaXNtMl9pb19kZWJ1Z19wcm9jX3JlYWQsIGxvY2FsKTsKKyNlbmRpZiAvKiBQUklTTTJfSU9fREVCVUcgKi8KKyNpZm5kZWYgUFJJU00yX05PX1NUQVRJT05fTU9ERVMKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzY2FuX3Jlc3VsdHMiLCAwLCBsb2NhbC0+cHJvYywKKwkJCSAgICAgICBwcmlzbTJfc2Nhbl9yZXN1bHRzX3Byb2NfcmVhZCwgbG9jYWwpOworI2VuZGlmIC8qIFBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCit9CisKKwordm9pZCBob3N0YXBfcmVtb3ZlX3Byb2MobG9jYWxfaW5mb190ICpsb2NhbCkKK3sKKwlpZiAobG9jYWwtPnByb2MgIT0gTlVMTCkgeworI2lmbmRlZiBQUklTTTJfTk9fU1RBVElPTl9NT0RFUworCQlyZW1vdmVfcHJvY19lbnRyeSgic2Nhbl9yZXN1bHRzIiwgbG9jYWwtPnByb2MpOworI2VuZGlmIC8qIFBSSVNNMl9OT19TVEFUSU9OX01PREVTICovCisjaWZkZWYgUFJJU00yX0lPX0RFQlVHCisJCXJlbW92ZV9wcm9jX2VudHJ5KCJpb19kZWJ1ZyIsIGxvY2FsLT5wcm9jKTsKKyNlbmRpZiAvKiBQUklTTTJfSU9fREVCVUcgKi8KKwkJcmVtb3ZlX3Byb2NfZW50cnkoInBkYSIsIGxvY2FsLT5wcm9jKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImF1eF9kdW1wIiwgbG9jYWwtPnByb2MpOworCQlyZW1vdmVfcHJvY19lbnRyeSgid2RzIiwgbG9jYWwtPnByb2MpOworCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMiLCBsb2NhbC0+cHJvYyk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJic3NfbGlzdCIsIGxvY2FsLT5wcm9jKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImNyeXB0IiwgbG9jYWwtPnByb2MpOworI2lmbmRlZiBQUklTTTJfTk9fUFJPQ0ZTX0RFQlVHCisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkZWJ1ZyIsIGxvY2FsLT5wcm9jKTsKKyNlbmRpZiAvKiBQUklTTTJfTk9fUFJPQ0ZTX0RFQlVHICovCisJCWlmIChob3N0YXBfcHJvYyAhPSBOVUxMKQorCQkJcmVtb3ZlX3Byb2NfZW50cnkobG9jYWwtPnByb2MtPm5hbWUsIGhvc3RhcF9wcm9jKTsKKwl9Cit9CisKKworRVhQT1JUX1NZTUJPTChob3N0YXBfaW5pdF9wcm9jKTsKK0VYUE9SVF9TWU1CT0woaG9zdGFwX3JlbW92ZV9wcm9jKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfd2xhbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF93bGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwNjFlMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfd2xhbi5oCkBAIC0wLDAgKzEsMTAzMyBAQAorI2lmbmRlZiBIT1NUQVBfV0xBTl9ICisjZGVmaW5lIEhPU1RBUF9XTEFOX0gKKworI2luY2x1ZGUgImhvc3RhcF9jb25maWcuaCIKKyNpbmNsdWRlICJob3N0YXBfY29tbW9uLmgiCisKKyNkZWZpbmUgTUFYX1BBUk1fREVWSUNFUyA4CisjZGVmaW5lIFBBUk1fTUlOX01BWCAiMS0iIF9fTU9EVUxFX1NUUklORyhNQVhfUEFSTV9ERVZJQ0VTKQorI2RlZmluZSBERUZfSU5UUyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQorI2RlZmluZSBHRVRfSU5UX1BBUk0odmFyLGlkeCkgdmFyW3ZhcltpZHhdIDwgMCA/IDAgOiBpZHhdCisKKworLyogU3BlY2lmaWMgc2tiLT5wcm90b2NvbCB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBwYWNrZXQgYWxyZWFkeSBjb250YWlucworICogdHhkZXNjIGhlYWRlci4KKyAqIEZJWDogVGhpcyBtaWdodCBuZWVkIG93biB2YWx1ZSB0aGF0IHdvdWxkIGJlIGFsbG9jYXRlZCBlc3BlY2lhbGx5IGZvciBQcmlzbTIKKyAqIHR4ZGVzYzsgRVRIX1BfQ09OVFJPTCBpcyBjb21tZW50ZWQgYXMgIkNhcmQgc3BlY2lmaWMgY29udHJvbCBmcmFtZXMiLgorICogSG93ZXZlciwgdGhlc2Ugc2tiJ3Mgc2hvdWxkIGhhdmUgb25seSBtaW5pbWFsIHBhdGggaW4gdGhlIGtlcm5lbCBzaWRlIHNpbmNlCisgKiBwcmlzbTJfc2VuZF9tZ210KCkgc2VuZHMgdGhlc2Ugd2l0aCBkZXZfcXVldWVfeG1pdCgpIHRvIHByaXNtMl90eCgpLiAqLworI2RlZmluZSBFVEhfUF9IT1NUQVAgRVRIX1BfQ09OVFJPTAorCisvKiBBUlBIUkRfSUVFRTgwMjExX1BSSVNNIHVzZXMgYSBibG9hdGVkIHZlcnNpb24gb2YgUHJpc20yIFJYIGZyYW1lIGhlYWRlcgorICogKGZyb20gbGludXgtd2xhbi1uZykgKi8KK3N0cnVjdCBsaW51eF93bGFuX25nX3ZhbCB7CisJdTMyIGRpZDsKKwl1MTYgc3RhdHVzLCBsZW47CisJdTMyIGRhdGE7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGxpbnV4X3dsYW5fbmdfcHJpc21faGRyIHsKKwl1MzIgbXNnY29kZSwgbXNnbGVuOworCWNoYXIgZGV2bmFtZVsxNl07CisJc3RydWN0IGxpbnV4X3dsYW5fbmdfdmFsIGhvc3R0aW1lLCBtYWN0aW1lLCBjaGFubmVsLCByc3NpLCBzcSwgc2lnbmFsLAorCQlub2lzZSwgcmF0ZSwgaXN0eCwgZnJtbGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBsaW51eF93bGFuX25nX2NhcF9oZHIgeworCXUzMiB2ZXJzaW9uOworCXUzMiBsZW5ndGg7CisJdTY0IG1hY3RpbWU7CisJdTY0IGhvc3R0aW1lOworCXUzMiBwaHl0eXBlOworCXUzMiBjaGFubmVsOworCXUzMiBkYXRhcmF0ZTsKKwl1MzIgYW50ZW5uYTsKKwl1MzIgcHJpb3JpdHk7CisJdTMyIHNzaV90eXBlOworCXMzMiBzc2lfc2lnbmFsOworCXMzMiBzc2lfbm9pc2U7CisJdTMyIHByZWFtYmxlOworCXUzMiBlbmNvZGluZzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIExXTkdfQ0FQX0RJRF9CQVNFICAgKDQgfCAoMSA8PCA2KSkgLyogc2VjdGlvbiA0LCBncm91cCAxICovCisjZGVmaW5lIExXTkdfQ0FQSERSX1ZFUlNJT04gMHg4MDIxMTAwMQorCitzdHJ1Y3QgaGZhMzg0eF9yeF9mcmFtZSB7CisJLyogSEZBMzg0WCBSWCBmcmFtZSBkZXNjcmlwdG9yICovCisJdTE2IHN0YXR1czsgLyogSEZBMzg0WF9SWF9TVEFUVVNfIGZsYWdzICovCisJdTMyIHRpbWU7IC8qIHRpbWVzdGFtcCwgMSBtaWNyb3NlY29uZCByZXNvbHV0aW9uICovCisJdTggc2lsZW5jZTsgLyogMjcgLi4gMTU0OyBzZWVtcyB0byBiZSAwICovCisJdTggc2lnbmFsOyAvKiAyNyAuLiAxNTQgKi8KKwl1OCByYXRlOyAvKiAxMCwgMjAsIDU1LCBvciAxMTAgKi8KKwl1OCByeGZsb3c7CisJdTMyIHJlc2VydmVkOworCisJLyogODAyLjExICovCisJdTE2IGZyYW1lX2NvbnRyb2w7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxWzZdOworCXU4IGFkZHIyWzZdOworCXU4IGFkZHIzWzZdOworCXUxNiBzZXFfY3RybDsKKwl1OCBhZGRyNFs2XTsKKwl1MTYgZGF0YV9sZW47CisKKwkvKiA4MDIuMyAqLworCXU4IGRzdF9hZGRyWzZdOworCXU4IHNyY19hZGRyWzZdOworCXUxNiBsZW47CisKKwkvKiBmb2xsb3dlZCBieSBmcmFtZSBkYXRhOyBtYXggMjMwNCBieXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworc3RydWN0IGhmYTM4NHhfdHhfZnJhbWUgeworCS8qIEhGQTM4NFggVFggZnJhbWUgZGVzY3JpcHRvciAqLworCXUxNiBzdGF0dXM7IC8qIEhGQTM4NFhfVFhfU1RBVFVTXyBmbGFncyAqLworCXUxNiByZXNlcnZlZDE7CisJdTE2IHJlc2VydmVkMjsKKwl1MzIgc3dfc3VwcG9ydDsKKwl1OCByZXRyeV9jb3VudDsgLyogbm90IHlldCBpbXBsZW1lbnRlZCAqLworCXU4IHR4X3JhdGU7IC8qIEhvc3QgQVAgb25seTsgMCA9IGZpcm13YXJlLCBvciAxMCwgMjAsIDU1LCAxMTAgKi8KKwl1MTYgdHhfY29udHJvbDsgLyogSEZBMzg0WF9UWF9DVFJMXyBmbGFncyAqLworCisJLyogODAyLjExICovCisJdTE2IGZyYW1lX2NvbnRyb2w7IC8qIHBhcnRzIG5vdCB1c2VkICovCisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxWzZdOworCXU4IGFkZHIyWzZdOyAvKiBmaWxsZWQgYnkgZmlybXdhcmUgKi8KKwl1OCBhZGRyM1s2XTsKKwl1MTYgc2VxX2N0cmw7IC8qIGZpbGxlZCBieSBmaXJtd2FyZSAqLworCXU4IGFkZHI0WzZdOworCXUxNiBkYXRhX2xlbjsKKworCS8qIDgwMi4zICovCisJdTggZHN0X2FkZHJbNl07CisJdTggc3JjX2FkZHJbNl07CisJdTE2IGxlbjsKKworCS8qIGZvbGxvd2VkIGJ5IGZyYW1lIGRhdGE7IG1heCAyMzA0IGJ5dGVzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaGZhMzg0eF9yaWRfaGRyCit7CisJdTE2IGxlbjsKKwl1MTYgcmlkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyogTWFjcm8gZm9yIGNvbnZlcnRpbmcgc2lnbmFsIGxldmVscyAocmFuZ2UgMjcgLi4gMTU0KSB0byB3aXJlbGVzcyBleHQKKyAqIGRCbSB2YWx1ZSB3aXRoIHNvbWUgYWNjdXJhY3kgKi8KKyNkZWZpbmUgSEZBMzg0WF9MRVZFTF9UT19kQm0odikgMHgxMDAgKyAodikgKiAxMDAgLyAyNTUgLSAxMDAKKworI2RlZmluZSBIRkEzODRYX0xFVkVMX1RPX2RCbV9zaWduKHYpICh2KSAqIDEwMCAvIDI1NSAtIDEwMAorCitzdHJ1Y3QgaGZhMzg0eF9zY2FuX3JlcXVlc3QgeworCXUxNiBjaGFubmVsX2xpc3Q7CisJdTE2IHR4cmF0ZTsgLyogSEZBMzg0WF9SQVRFU18qICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGhmYTM4NHhfaG9zdHNjYW5fcmVxdWVzdCB7CisJdTE2IGNoYW5uZWxfbGlzdDsKKwl1MTYgdHhyYXRlOworCXUxNiB0YXJnZXRfc3NpZF9sZW47CisJdTggdGFyZ2V0X3NzaWRbMzJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBoZmEzODR4X2pvaW5fcmVxdWVzdCB7CisJdTggYnNzaWRbNl07CisJdTE2IGNoYW5uZWw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGhmYTM4NHhfaW5mb19mcmFtZSB7CisJdTE2IGxlbjsKKwl1MTYgdHlwZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaGZhMzg0eF9jb21tX3RhbGxpZXMgeworCXUxNiB0eF91bmljYXN0X2ZyYW1lczsKKwl1MTYgdHhfbXVsdGljYXN0X2ZyYW1lczsKKwl1MTYgdHhfZnJhZ21lbnRzOworCXUxNiB0eF91bmljYXN0X29jdGV0czsKKwl1MTYgdHhfbXVsdGljYXN0X29jdGV0czsKKwl1MTYgdHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9uczsKKwl1MTYgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKKwl1MTYgdHhfbXVsdGlwbGVfcmV0cnlfZnJhbWVzOworCXUxNiB0eF9yZXRyeV9saW1pdF9leGNlZWRlZDsKKwl1MTYgdHhfZGlzY2FyZHM7CisJdTE2IHJ4X3VuaWNhc3RfZnJhbWVzOworCXUxNiByeF9tdWx0aWNhc3RfZnJhbWVzOworCXUxNiByeF9mcmFnbWVudHM7CisJdTE2IHJ4X3VuaWNhc3Rfb2N0ZXRzOworCXUxNiByeF9tdWx0aWNhc3Rfb2N0ZXRzOworCXUxNiByeF9mY3NfZXJyb3JzOworCXUxNiByeF9kaXNjYXJkc19ub19idWZmZXI7CisJdTE2IHR4X2Rpc2NhcmRzX3dyb25nX3NhOworCXUxNiByeF9kaXNjYXJkc193ZXBfdW5kZWNyeXB0YWJsZTsKKwl1MTYgcnhfbWVzc2FnZV9pbl9tc2dfZnJhZ21lbnRzOworCXUxNiByeF9tZXNzYWdlX2luX2JhZF9tc2dfZnJhZ21lbnRzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBoZmEzODR4X2NvbW1fdGFsbGllczMyIHsKKwl1MzIgdHhfdW5pY2FzdF9mcmFtZXM7CisJdTMyIHR4X211bHRpY2FzdF9mcmFtZXM7CisJdTMyIHR4X2ZyYWdtZW50czsKKwl1MzIgdHhfdW5pY2FzdF9vY3RldHM7CisJdTMyIHR4X211bHRpY2FzdF9vY3RldHM7CisJdTMyIHR4X2RlZmVycmVkX3RyYW5zbWlzc2lvbnM7CisJdTMyIHR4X3NpbmdsZV9yZXRyeV9mcmFtZXM7CisJdTMyIHR4X211bHRpcGxlX3JldHJ5X2ZyYW1lczsKKwl1MzIgdHhfcmV0cnlfbGltaXRfZXhjZWVkZWQ7CisJdTMyIHR4X2Rpc2NhcmRzOworCXUzMiByeF91bmljYXN0X2ZyYW1lczsKKwl1MzIgcnhfbXVsdGljYXN0X2ZyYW1lczsKKwl1MzIgcnhfZnJhZ21lbnRzOworCXUzMiByeF91bmljYXN0X29jdGV0czsKKwl1MzIgcnhfbXVsdGljYXN0X29jdGV0czsKKwl1MzIgcnhfZmNzX2Vycm9yczsKKwl1MzIgcnhfZGlzY2FyZHNfbm9fYnVmZmVyOworCXUzMiB0eF9kaXNjYXJkc193cm9uZ19zYTsKKwl1MzIgcnhfZGlzY2FyZHNfd2VwX3VuZGVjcnlwdGFibGU7CisJdTMyIHJ4X21lc3NhZ2VfaW5fbXNnX2ZyYWdtZW50czsKKwl1MzIgcnhfbWVzc2FnZV9pbl9iYWRfbXNnX2ZyYWdtZW50czsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaGZhMzg0eF9zY2FuX3Jlc3VsdF9oZHIgeworCXUxNiByZXNlcnZlZDsKKwl1MTYgc2Nhbl9yZWFzb247CisjZGVmaW5lIEhGQTM4NFhfU0NBTl9JTl9QUk9HUkVTUyAwIC8qIG5vIHJlc3VsdHMgYXZhaWxhYmxlIHlldCAqLworI2RlZmluZSBIRkEzODRYX1NDQU5fSE9TVF9JTklUSUFURUQgMQorI2RlZmluZSBIRkEzODRYX1NDQU5fRklSTVdBUkVfSU5JVElBVEVEIDIKKyNkZWZpbmUgSEZBMzg0WF9TQ0FOX0lOUVVJUllfRlJPTV9IT1NUIDMKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIEhGQTM4NFhfU0NBTl9NQVhfUkVTVUxUUyAzMgorCitzdHJ1Y3QgaGZhMzg0eF9zY2FuX3Jlc3VsdCB7CisJdTE2IGNoaWQ7CisJdTE2IGFubDsKKwl1MTYgc2w7CisJdTggYnNzaWRbNl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1MTYgc3NpZF9sZW47CisJdTggc3NpZFszMl07CisJdTggc3VwX3JhdGVzWzEwXTsKKwl1MTYgcmF0ZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaGZhMzg0eF9ob3N0c2Nhbl9yZXN1bHQgeworCXUxNiBjaGlkOworCXUxNiBhbmw7CisJdTE2IHNsOworCXU4IGJzc2lkWzZdOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGNhcGFiaWxpdHk7CisJdTE2IHNzaWRfbGVuOworCXU4IHNzaWRbMzJdOworCXU4IHN1cF9yYXRlc1sxMF07CisJdTE2IHJhdGU7CisJdTE2IGF0aW07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNvbW1fdGFsbGllc19zdW1zIHsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X2ZyYWdtZW50czsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X2RlZmVycmVkX3RyYW5zbWlzc2lvbnM7CisJdW5zaWduZWQgaW50IHR4X3NpbmdsZV9yZXRyeV9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpcGxlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfcmV0cnlfbGltaXRfZXhjZWVkZWQ7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfZmNzX2Vycm9yczsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfbm9fYnVmZmVyOworCXVuc2lnbmVkIGludCB0eF9kaXNjYXJkc193cm9uZ19zYTsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfd2VwX3VuZGVjcnlwdGFibGU7CisJdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fbXNnX2ZyYWdtZW50czsKKwl1bnNpZ25lZCBpbnQgcnhfbWVzc2FnZV9pbl9iYWRfbXNnX2ZyYWdtZW50czsKK307CisKKworc3RydWN0IGhmYTM4NHhfcmVncyB7CisJdTE2IGNtZDsKKwl1MTYgZXZzdGF0OworCXUxNiBvZmZzZXQwOworCXUxNiBvZmZzZXQxOworCXUxNiBzd3N1cHBvcnQwOworfTsKKworCisjaWYgZGVmaW5lZChQUklTTTJfUENDQVJEKSB8fCBkZWZpbmVkKFBSSVNNMl9QTFgpCisvKiBJL08gcG9ydHMgZm9yIEhGQTM4NFggQ29udHJvbGxlciBhY2Nlc3MgKi8KKyNkZWZpbmUgSEZBMzg0WF9DTURfT0ZGIDB4MDAKKyNkZWZpbmUgSEZBMzg0WF9QQVJBTTBfT0ZGIDB4MDIKKyNkZWZpbmUgSEZBMzg0WF9QQVJBTTFfT0ZGIDB4MDQKKyNkZWZpbmUgSEZBMzg0WF9QQVJBTTJfT0ZGIDB4MDYKKyNkZWZpbmUgSEZBMzg0WF9TVEFUVVNfT0ZGIDB4MDgKKyNkZWZpbmUgSEZBMzg0WF9SRVNQMF9PRkYgMHgwQQorI2RlZmluZSBIRkEzODRYX1JFU1AxX09GRiAweDBDCisjZGVmaW5lIEhGQTM4NFhfUkVTUDJfT0ZGIDB4MEUKKyNkZWZpbmUgSEZBMzg0WF9JTkZPRklEX09GRiAweDEwCisjZGVmaW5lIEhGQTM4NFhfQ09OVFJPTF9PRkYgMHgxNAorI2RlZmluZSBIRkEzODRYX1NFTEVDVDBfT0ZGIDB4MTgKKyNkZWZpbmUgSEZBMzg0WF9TRUxFQ1QxX09GRiAweDFBCisjZGVmaW5lIEhGQTM4NFhfT0ZGU0VUMF9PRkYgMHgxQworI2RlZmluZSBIRkEzODRYX09GRlNFVDFfT0ZGIDB4MUUKKyNkZWZpbmUgSEZBMzg0WF9SWEZJRF9PRkYgMHgyMAorI2RlZmluZSBIRkEzODRYX0FMTE9DRklEX09GRiAweDIyCisjZGVmaW5lIEhGQTM4NFhfVFhDT01QTEZJRF9PRkYgMHgyNAorI2RlZmluZSBIRkEzODRYX1NXU1VQUE9SVDBfT0ZGIDB4MjgKKyNkZWZpbmUgSEZBMzg0WF9TV1NVUFBPUlQxX09GRiAweDJBCisjZGVmaW5lIEhGQTM4NFhfU1dTVVBQT1JUMl9PRkYgMHgyQworI2RlZmluZSBIRkEzODRYX0VWU1RBVF9PRkYgMHgzMAorI2RlZmluZSBIRkEzODRYX0lOVEVOX09GRiAweDMyCisjZGVmaW5lIEhGQTM4NFhfRVZBQ0tfT0ZGIDB4MzQKKyNkZWZpbmUgSEZBMzg0WF9EQVRBMF9PRkYgMHgzNgorI2RlZmluZSBIRkEzODRYX0RBVEExX09GRiAweDM4CisjZGVmaW5lIEhGQTM4NFhfQVVYUEFHRV9PRkYgMHgzQQorI2RlZmluZSBIRkEzODRYX0FVWE9GRlNFVF9PRkYgMHgzQworI2RlZmluZSBIRkEzODRYX0FVWERBVEFfT0ZGIDB4M0UKKyNlbmRpZiAvKiBQUklTTTJfUENDQVJEIHx8IFBSSVNNMl9QTFggKi8KKworI2lmZGVmIFBSSVNNMl9QQ0kKKy8qIE1lbW9yeSBhZGRyZXNzZXMgZm9yIElTTDM4NzQgY29udHJvbGxlciBhY2Nlc3MgKi8KKyNkZWZpbmUgSEZBMzg0WF9DTURfT0ZGIDB4MDAKKyNkZWZpbmUgSEZBMzg0WF9QQVJBTTBfT0ZGIDB4MDQKKyNkZWZpbmUgSEZBMzg0WF9QQVJBTTFfT0ZGIDB4MDgKKyNkZWZpbmUgSEZBMzg0WF9QQVJBTTJfT0ZGIDB4MEMKKyNkZWZpbmUgSEZBMzg0WF9TVEFUVVNfT0ZGIDB4MTAKKyNkZWZpbmUgSEZBMzg0WF9SRVNQMF9PRkYgMHgxNAorI2RlZmluZSBIRkEzODRYX1JFU1AxX09GRiAweDE4CisjZGVmaW5lIEhGQTM4NFhfUkVTUDJfT0ZGIDB4MUMKKyNkZWZpbmUgSEZBMzg0WF9JTkZPRklEX09GRiAweDIwCisjZGVmaW5lIEhGQTM4NFhfQ09OVFJPTF9PRkYgMHgyOAorI2RlZmluZSBIRkEzODRYX1NFTEVDVDBfT0ZGIDB4MzAKKyNkZWZpbmUgSEZBMzg0WF9TRUxFQ1QxX09GRiAweDM0CisjZGVmaW5lIEhGQTM4NFhfT0ZGU0VUMF9PRkYgMHgzOAorI2RlZmluZSBIRkEzODRYX09GRlNFVDFfT0ZGIDB4M0MKKyNkZWZpbmUgSEZBMzg0WF9SWEZJRF9PRkYgMHg0MAorI2RlZmluZSBIRkEzODRYX0FMTE9DRklEX09GRiAweDQ0CisjZGVmaW5lIEhGQTM4NFhfVFhDT01QTEZJRF9PRkYgMHg0OAorI2RlZmluZSBIRkEzODRYX1BDSUNPUl9PRkYgMHg0QworI2RlZmluZSBIRkEzODRYX1NXU1VQUE9SVDBfT0ZGIDB4NTAKKyNkZWZpbmUgSEZBMzg0WF9TV1NVUFBPUlQxX09GRiAweDU0CisjZGVmaW5lIEhGQTM4NFhfU1dTVVBQT1JUMl9PRkYgMHg1OAorI2RlZmluZSBIRkEzODRYX1BDSUhDUl9PRkYgMHg1QworI2RlZmluZSBIRkEzODRYX0VWU1RBVF9PRkYgMHg2MAorI2RlZmluZSBIRkEzODRYX0lOVEVOX09GRiAweDY0CisjZGVmaW5lIEhGQTM4NFhfRVZBQ0tfT0ZGIDB4NjgKKyNkZWZpbmUgSEZBMzg0WF9EQVRBMF9PRkYgMHg2QworI2RlZmluZSBIRkEzODRYX0RBVEExX09GRiAweDcwCisjZGVmaW5lIEhGQTM4NFhfQVVYUEFHRV9PRkYgMHg3NAorI2RlZmluZSBIRkEzODRYX0FVWE9GRlNFVF9PRkYgMHg3OAorI2RlZmluZSBIRkEzODRYX0FVWERBVEFfT0ZGIDB4N0MKKyNkZWZpbmUgSEZBMzg0WF9QQ0lfTTBfQUREUkhfT0ZGIDB4ODAKKyNkZWZpbmUgSEZBMzg0WF9QQ0lfTTBfQUREUkxfT0ZGIDB4ODQKKyNkZWZpbmUgSEZBMzg0WF9QQ0lfTTBfTEVOX09GRiAweDg4CisjZGVmaW5lIEhGQTM4NFhfUENJX00wX0NUTF9PRkYgMHg4QworI2RlZmluZSBIRkEzODRYX1BDSV9TVEFUVVNfT0ZGIDB4OTgKKyNkZWZpbmUgSEZBMzg0WF9QQ0lfTTFfQUREUkhfT0ZGIDB4QTAKKyNkZWZpbmUgSEZBMzg0WF9QQ0lfTTFfQUREUkxfT0ZGIDB4QTQKKyNkZWZpbmUgSEZBMzg0WF9QQ0lfTTFfTEVOX09GRiAweEE4CisjZGVmaW5lIEhGQTM4NFhfUENJX00xX0NUTF9PRkYgMHhBQworCisvKiBQQ0kgYnVzIG1hc3RlciBjb250cm9sIGJpdHMgKHRoZXNlIGFyZSB1bmRvY3VtZW50ZWQ7IGJhc2VkIG9uIGd1ZXNzaW5nIGFuZAorICogZXhwZXJpbWVudGluZy4uKSAqLworI2RlZmluZSBIRkEzODRYX1BDSV9DVExfRlJPTV9CQVAgKEJJVCg1KSB8IEJJVCgxKSB8IEJJVCgwKSkKKyNkZWZpbmUgSEZBMzg0WF9QQ0lfQ1RMX1RPX0JBUCAoQklUKDUpIHwgQklUKDApKQorCisjZW5kaWYgLyogUFJJU00yX1BDSSAqLworCisKKy8qIENvbW1hbmQgY29kZXMgZm9yIENNRCByZWcuICovCisjZGVmaW5lIEhGQTM4NFhfQ01EQ09ERV9JTklUIDB4MDAKKyNkZWZpbmUgSEZBMzg0WF9DTURDT0RFX0VOQUJMRSAweDAxCisjZGVmaW5lIEhGQTM4NFhfQ01EQ09ERV9ESVNBQkxFIDB4MDIKKyNkZWZpbmUgSEZBMzg0WF9DTURDT0RFX0FMTE9DIDB4MEEKKyNkZWZpbmUgSEZBMzg0WF9DTURDT0RFX1RSQU5TTUlUIDB4MEIKKyNkZWZpbmUgSEZBMzg0WF9DTURDT0RFX0lOUVVJUkUgMHgxMQorI2RlZmluZSBIRkEzODRYX0NNRENPREVfQUNDRVNTIDB4MjEKKyNkZWZpbmUgSEZBMzg0WF9DTURDT0RFX0FDQ0VTU19XUklURSAoMHgyMSB8IEJJVCg4KSkKKyNkZWZpbmUgSEZBMzg0WF9DTURDT0RFX0RPV05MT0FEIDB4MjIKKyNkZWZpbmUgSEZBMzg0WF9DTURDT0RFX1JFQURNSUYgMHgzMAorI2RlZmluZSBIRkEzODRYX0NNRENPREVfV1JJVEVNSUYgMHgzMQorI2RlZmluZSBIRkEzODRYX0NNRENPREVfVEVTVCAweDM4CisKKyNkZWZpbmUgSEZBMzg0WF9DTURDT0RFX01BU0sgMHgzRgorCisvKiBUZXN0IG1vZGUgb3BlcmF0aW9ucyAqLworI2RlZmluZSBIRkEzODRYX1RFU1RfQ0hBTkdFX0NIQU5ORUwgMHgwOAorI2RlZmluZSBIRkEzODRYX1RFU1RfTU9OSVRPUiAweDBCCisjZGVmaW5lIEhGQTM4NFhfVEVTVF9TVE9QIDB4MEYKKyNkZWZpbmUgSEZBMzg0WF9URVNUX0NGR19CSVRTIDB4MTUKKyNkZWZpbmUgSEZBMzg0WF9URVNUX0NGR19CSVRfQUxDIEJJVCgzKQorCisjZGVmaW5lIEhGQTM4NFhfQ01EX0JVU1kgQklUKDE1KQorCisjZGVmaW5lIEhGQTM4NFhfQ01EX1RYX1JFQ0xBSU0gQklUKDgpCisKKyNkZWZpbmUgSEZBMzg0WF9PRkZTRVRfRVJSIEJJVCgxNCkKKyNkZWZpbmUgSEZBMzg0WF9PRkZTRVRfQlVTWSBCSVQoMTUpCisKKworLyogUHJvZ01vZGUgZm9yIGRvd25sb2FkIGNvbW1hbmQgKi8KKyNkZWZpbmUgSEZBMzg0WF9QUk9HTU9ERV9ESVNBQkxFIDAKKyNkZWZpbmUgSEZBMzg0WF9QUk9HTU9ERV9FTkFCTEVfVk9MQVRJTEUgMQorI2RlZmluZSBIRkEzODRYX1BST0dNT0RFX0VOQUJMRV9OT05fVk9MQVRJTEUgMgorI2RlZmluZSBIRkEzODRYX1BST0dNT0RFX1BST0dSQU1fTk9OX1ZPTEFUSUxFIDMKKworI2RlZmluZSBIRkEzODRYX0FVWF9NQUdJQzAgMHhmZTAxCisjZGVmaW5lIEhGQTM4NFhfQVVYX01BR0lDMSAweGRjMjMKKyNkZWZpbmUgSEZBMzg0WF9BVVhfTUFHSUMyIDB4YmE0NQorCisjZGVmaW5lIEhGQTM4NFhfQVVYX1BPUlRfRElTQUJMRUQgMAorI2RlZmluZSBIRkEzODRYX0FVWF9QT1JUX0RJU0FCTEUgQklUKDE0KQorI2RlZmluZSBIRkEzODRYX0FVWF9QT1JUX0VOQUJMRSBCSVQoMTUpCisjZGVmaW5lIEhGQTM4NFhfQVVYX1BPUlRfRU5BQkxFRCAoQklUKDE0KSB8IEJJVCgxNSkpCisjZGVmaW5lIEhGQTM4NFhfQVVYX1BPUlRfTUFTSyAoQklUKDE0KSB8IEJJVCgxNSkpCisKKyNkZWZpbmUgUFJJU00yX1BEQV9TSVpFIDEwMjQKKworCisvKiBFdmVudHM7IEV2U3RhdCwgSW50ZXJydXB0IG1hc2sgKEludEVuKSwgYW5kIGFja25vd2xlZGdlIGJpdHMgKEV2QWNrKSAqLworI2RlZmluZSBIRkEzODRYX0VWX1RJQ0sgQklUKDE1KQorI2RlZmluZSBIRkEzODRYX0VWX1dURVJSIEJJVCgxNCkKKyNkZWZpbmUgSEZBMzg0WF9FVl9JTkZEUk9QIEJJVCgxMykKKyNpZmRlZiBQUklTTTJfUENJCisjZGVmaW5lIEhGQTM4NFhfRVZfUENJX00xIEJJVCg5KQorI2RlZmluZSBIRkEzODRYX0VWX1BDSV9NMCBCSVQoOCkKKyNlbmRpZiAvKiBQUklTTTJfUENJICovCisjZGVmaW5lIEhGQTM4NFhfRVZfSU5GTyBCSVQoNykKKyNkZWZpbmUgSEZBMzg0WF9FVl9EVElNIEJJVCg1KQorI2RlZmluZSBIRkEzODRYX0VWX0NNRCBCSVQoNCkKKyNkZWZpbmUgSEZBMzg0WF9FVl9BTExPQyBCSVQoMykKKyNkZWZpbmUgSEZBMzg0WF9FVl9UWEVYQyBCSVQoMikKKyNkZWZpbmUgSEZBMzg0WF9FVl9UWCBCSVQoMSkKKyNkZWZpbmUgSEZBMzg0WF9FVl9SWCBCSVQoMCkKKworCisvKiBIRkEzODRYIEluZm9ybWF0aW9uIGZyYW1lcyAqLworI2RlZmluZSBIRkEzODRYX0lORk9fSEFORE9WRVJBRERSIDB4RjAwMCAvKiBBUCBmL3cgPyAqLworI2RlZmluZSBIRkEzODRYX0lORk9fSEFORE9WRVJERUFVVEhBRERSIDB4RjAwMSAvKiBBUCBmL3cgMS4zLjcgKi8KKyNkZWZpbmUgSEZBMzg0WF9JTkZPX0NPTU1UQUxMSUVTIDB4RjEwMAorI2RlZmluZSBIRkEzODRYX0lORk9fU0NBTlJFU1VMVFMgMHhGMTAxCisjZGVmaW5lIEhGQTM4NFhfSU5GT19DSEFOTkVMSU5GT1JFU1VMVFMgMHhGMTAyIC8qIEFQIGYvdyBvbmx5ICovCisjZGVmaW5lIEhGQTM4NFhfSU5GT19IT1NUU0NBTlJFU1VMVFMgMHhGMTAzCisjZGVmaW5lIEhGQTM4NFhfSU5GT19MSU5LU1RBVFVTIDB4RjIwMAorI2RlZmluZSBIRkEzODRYX0lORk9fQVNTT0NTVEFUVVMgMHhGMjAxIC8qID8gKi8KKyNkZWZpbmUgSEZBMzg0WF9JTkZPX0FVVEhSRVEgMHhGMjAyIC8qID8gKi8KKyNkZWZpbmUgSEZBMzg0WF9JTkZPX1BTVVNFUkNOVCAweEYyMDMgLyogPyAqLworI2RlZmluZSBIRkEzODRYX0lORk9fS0VZSURDSEFOR0VEIDB4RjIwNCAvKiA/ICovCisKK2VudW0geyBIRkEzODRYX0xJTktTVEFUVVNfQ09OTkVDVEVEID0gMSwKKyAgICAgICBIRkEzODRYX0xJTktTVEFUVVNfRElTQ09OTkVDVEVEID0gMiwKKyAgICAgICBIRkEzODRYX0xJTktTVEFUVVNfQVBfQ0hBTkdFID0gMywKKyAgICAgICBIRkEzODRYX0xJTktTVEFUVVNfQVBfT1VUX09GX1JBTkdFID0gNCwKKyAgICAgICBIRkEzODRYX0xJTktTVEFUVVNfQVBfSU5fUkFOR0UgPSA1LAorICAgICAgIEhGQTM4NFhfTElOS1NUQVRVU19BU1NPQ19GQUlMRUQgPSA2IH07CisKK2VudW0geyBIRkEzODRYX1BPUlRUWVBFX0JTUyA9IDEsIEhGQTM4NFhfUE9SVFRZUEVfV0RTID0gMiwKKyAgICAgICBIRkEzODRYX1BPUlRUWVBFX1BTRVVET19JQlNTID0gMywgSEZBMzg0WF9QT1JUVFlQRV9JQlNTID0gMCwKKyAgICAgICBIRkEzODRYX1BPUlRUWVBFX0hPU1RBUCA9IDYgfTsKKworI2RlZmluZSBIRkEzODRYX1JBVEVTXzFNQlBTIEJJVCgwKQorI2RlZmluZSBIRkEzODRYX1JBVEVTXzJNQlBTIEJJVCgxKQorI2RlZmluZSBIRkEzODRYX1JBVEVTXzVNQlBTIEJJVCgyKQorI2RlZmluZSBIRkEzODRYX1JBVEVTXzExTUJQUyBCSVQoMykKKworI2RlZmluZSBIRkEzODRYX1JPQU1JTkdfRklSTVdBUkUgMQorI2RlZmluZSBIRkEzODRYX1JPQU1JTkdfSE9TVCAyCisjZGVmaW5lIEhGQTM4NFhfUk9BTUlOR19ESVNBQkxFRCAzCisKKyNkZWZpbmUgSEZBMzg0WF9XRVBGTEFHU19QUklWQUNZSU5WT0tFRCBCSVQoMCkKKyNkZWZpbmUgSEZBMzg0WF9XRVBGTEFHU19FWENMVURFVU5FTkNSWVBURUQgQklUKDEpCisjZGVmaW5lIEhGQTM4NFhfV0VQRkxBR1NfSE9TVEVOQ1JZUFQgQklUKDQpCisjZGVmaW5lIEhGQTM4NFhfV0VQRkxBR1NfSE9TVERFQ1JZUFQgQklUKDcpCisKKyNkZWZpbmUgSEZBMzg0WF9SWF9TVEFUVVNfTVNHVFlQRSAoQklUKDE1KSB8IEJJVCgxNCkgfCBCSVQoMTMpKQorI2RlZmluZSBIRkEzODRYX1JYX1NUQVRVU19QQ0YgQklUKDEyKQorI2RlZmluZSBIRkEzODRYX1JYX1NUQVRVU19NQUNQT1JUIChCSVQoMTApIHwgQklUKDkpIHwgQklUKDgpKQorI2RlZmluZSBIRkEzODRYX1JYX1NUQVRVU19VTkRFQ1IgQklUKDEpCisjZGVmaW5lIEhGQTM4NFhfUlhfU1RBVFVTX0ZDU0VSUiBCSVQoMCkKKworI2RlZmluZSBIRkEzODRYX1JYX1NUQVRVU19HRVRfTVNHVFlQRShzKSBcCisoKChzKSAmIEhGQTM4NFhfUlhfU1RBVFVTX01TR1RZUEUpID4+IDEzKQorI2RlZmluZSBIRkEzODRYX1JYX1NUQVRVU19HRVRfTUFDUE9SVChzKSBcCisoKChzKSAmIEhGQTM4NFhfUlhfU1RBVFVTX01BQ1BPUlQpID4+IDgpCisKK2VudW0geyBIRkEzODRYX1JYX01TR1RZUEVfTk9STUFMID0gMCwgSEZBMzg0WF9SWF9NU0dUWVBFX1JGQzEwNDIgPSAxLAorICAgICAgIEhGQTM4NFhfUlhfTVNHVFlQRV9CUklER0VUVU5ORUwgPSAyLCBIRkEzODRYX1JYX01TR1RZUEVfTUdNVCA9IDQgfTsKKworCisjZGVmaW5lIEhGQTM4NFhfVFhfQ1RSTF9BTFRfUlRSWSBCSVQoNSkKKyNkZWZpbmUgSEZBMzg0WF9UWF9DVFJMXzgwMl8xMSBCSVQoMykKKyNkZWZpbmUgSEZBMzg0WF9UWF9DVFJMXzgwMl8zIDAKKyNkZWZpbmUgSEZBMzg0WF9UWF9DVFJMX1RYX0VYIEJJVCgyKQorI2RlZmluZSBIRkEzODRYX1RYX0NUUkxfVFhfT0sgQklUKDEpCisKKyNkZWZpbmUgSEZBMzg0WF9UWF9TVEFUVVNfUkVUUllFUlIgQklUKDApCisjZGVmaW5lIEhGQTM4NFhfVFhfU1RBVFVTX0FHRURFUlIgQklUKDEpCisjZGVmaW5lIEhGQTM4NFhfVFhfU1RBVFVTX0RJU0NPTiBCSVQoMikKKyNkZWZpbmUgSEZBMzg0WF9UWF9TVEFUVVNfRk9STUVSUiBCSVQoMykKKworLyogSEZBMzg2MS8zODYzIChCQlApIENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIEhGQTM4NlhfQ1JfVFhfQ09ORklHVVJFIDB4MTIgLyogQ1I5ICovCisjZGVmaW5lIEhGQTM4NlhfQ1JfUlhfQ09ORklHVVJFIDB4MTQgLyogQ1IxMCAqLworI2RlZmluZSBIRkEzODZYX0NSX0FfRF9URVNUX01PREVTMiAweDFBIC8qIENSMTMgKi8KKyNkZWZpbmUgSEZBMzg2WF9DUl9NQU5VQUxfVFhfUE9XRVIgMHgzRSAvKiBDUjMxICovCisjZGVmaW5lIEhGQTM4NlhfQ1JfTUVBU1VSRURfVFhfUE9XRVIgMHg3NCAvKiBDUjU4ICovCisKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBQUklTTTJfVFhGSURfQ09VTlQgOAorI2RlZmluZSBQUklTTTJfREFUQV9NQVhMRU4gMjMwNAorI2RlZmluZSBQUklTTTJfVFhGSURfTEVOIChQUklTTTJfREFUQV9NQVhMRU4gKyBzaXplb2Yoc3RydWN0IGhmYTM4NHhfdHhfZnJhbWUpKQorI2RlZmluZSBQUklTTTJfVFhGSURfRU1QVFkgMHhmZmZmCisjZGVmaW5lIFBSSVNNMl9UWEZJRF9SRVNFUlZFRCAweGZmZmUKKyNkZWZpbmUgUFJJU00yX0RVTU1ZX0ZJRCAweGZmZmYKKyNkZWZpbmUgTUFYX1NTSURfTEVOIDMyCisjZGVmaW5lIE1BWF9OQU1FX0xFTiAzMiAvKiB0aGlzIGlzIGFzc3VtZWQgdG8gYmUgZXF1YWwgdG8gTUFYX1NTSURfTEVOICovCisKKyNkZWZpbmUgUFJJU00yX0RVTVBfUlhfSERSIEJJVCgwKQorI2RlZmluZSBQUklTTTJfRFVNUF9UWF9IRFIgQklUKDEpCisjZGVmaW5lIFBSSVNNMl9EVU1QX1RYRVhDX0hEUiBCSVQoMikKKworc3RydWN0IGhvc3RhcF90eF9jYWxsYmFja19pbmZvIHsKKwl1MTYgaWR4OworCXZvaWQgKCpmdW5jKShzdHJ1Y3Qgc2tfYnVmZiAqLCBpbnQgb2ssIHZvaWQgKik7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgaG9zdGFwX3R4X2NhbGxiYWNrX2luZm8gKm5leHQ7Cit9OworCisKKy8qIElFRUUgODAyLjExIHJlcXVpcmVzIHRoYXQgU1RBIHN1cHBvcnRzIGNvbmN1cnJlbnQgcmVjZXB0aW9uIG9mIGF0IGxlYXN0CisgKiB0aHJlZSBmcmFnbWVudGVkIGZyYW1lcy4gVGhpcyBkZWZpbmUgY2FuIGJlIGluY3JlYXNlZCB0byBzdXBwb3J0IG1vcmUKKyAqIGNvbmN1cnJlbnQgZnJhbWVzLCBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgZWFjaCBlbnRyeSBjYW4gY29uc3VtZSBhYm91dAorICogMiBrQiBvZiBSQU0gYW5kIGluY3JlYXNpbmcgY2FjaGUgc2l6ZSB3aWxsIHNsb3cgZG93biBmcmFtZSByZWFzc2VtYmx5LiAqLworI2RlZmluZSBQUklTTTJfRlJBR19DQUNIRV9MRU4gNAorCitzdHJ1Y3QgcHJpc20yX2ZyYWdfZW50cnkgeworCXVuc2lnbmVkIGxvbmcgZmlyc3RfZnJhZ190aW1lOworCXVuc2lnbmVkIGludCBzZXE7CisJdW5zaWduZWQgaW50IGxhc3RfZnJhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4IHNyY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBkc3RfYWRkcltFVEhfQUxFTl07Cit9OworCisKK3N0cnVjdCBob3N0YXBfY21kX3F1ZXVlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJd2FpdF9xdWV1ZV9oZWFkX3QgY29tcGw7CisJdm9sYXRpbGUgZW51bSB7IENNRF9TTEVFUCwgQ01EX0NBTExCQUNLLCBDTURfQ09NUExFVEVEIH0gdHlwZTsKKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGxvbmcgY29udGV4dCwgdTE2IHJlc3AwLAorCQkJIHUxNiByZXMpOworCWxvbmcgY29udGV4dDsKKwl1MTYgY21kLCBwYXJhbTAsIHBhcmFtMTsKKwl1MTYgcmVzcDAsIHJlczsKKwl2b2xhdGlsZSBpbnQgaXNzdWVkLCBpc3N1aW5nOworCisJYXRvbWljX3QgdXNlY250OworCWludCBkZWxfcmVxOworfTsKKworLyogb3B0aW9ucyBmb3IgaHdfc2h1dGRvd24gKi8KKyNkZWZpbmUgSE9TVEFQX0hXX05PX0RJU0FCTEUgQklUKDApCisjZGVmaW5lIEhPU1RBUF9IV19FTkFCTEVfQ01EQ09NUEwgQklUKDEpCisKK3R5cGVkZWYgc3RydWN0IGxvY2FsX2luZm8gbG9jYWxfaW5mb190OworCitzdHJ1Y3QgcHJpc20yX2hlbHBlcl9mdW5jdGlvbnMgeworCS8qIHRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiBoYXJkd2FyZSBtb2RlbCBzcGVjaWZpYyBmaWxlcworCSAqIChob3N0YXBfe2NzLHBseCxwY2l9LmMgKi8KKwlpbnQgKCpjYXJkX3ByZXNlbnQpKGxvY2FsX2luZm9fdCAqbG9jYWwpOworCXZvaWQgKCpjb3Jfc3Jlc2V0KShsb2NhbF9pbmZvX3QgKmxvY2FsKTsKKwlpbnQgKCpkZXZfb3BlbikobG9jYWxfaW5mb190ICpsb2NhbCk7CisJaW50ICgqZGV2X2Nsb3NlKShsb2NhbF9pbmZvX3QgKmxvY2FsKTsKKwl2b2lkICgqZ2VuZXNpc19yZXNldCkobG9jYWxfaW5mb190ICpsb2NhbCwgaW50IGhjcik7CisKKwkvKiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZnJvbSBob3N0YXBfaHcuYywgYnV0IHRoZXkgbWF5IGhhdmUgc29tZQorCSAqIGhhcmR3YXJlIG1vZGVsIHNwZWNpZmljIGNvZGUgKi8KKworCS8qIEZJWDogbG93LWxldmVsIGNvbW1hbmRzIGxpa2UgY21kIG1pZ2h0IGRpc2FwcGVhciBhdCBzb21lIHBvaW50IHRvCisJICogbWFrZSBpdCBlYXNpZXIgdG8gY2hhbmdlIHRoZW0gaWYgbmVlZGVkIChlLmcuLCBjbWQgd291bGQgYmUgcmVwbGFjZWQKKwkgKiB3aXRoIHdyaXRlX21pZi9yZWFkX21pZi90ZXN0Y21kL2lucXVpcmUpOyBhdCBsZWFzdCBnZXRfcmlkIGFuZAorCSAqIHNldF9yaWQgbWlnaHQgbW92ZSB0byBob3N0YXBfe2NzLHBseCxwY2l9LmMgKi8KKwlpbnQgKCpjbWQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBjbWQsIHUxNiBwYXJhbTAsIHUxNiAqcGFyYW0xLAorCQkgICB1MTYgKnJlc3AwKTsKKwl2b2lkICgqcmVhZF9yZWdzKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaGZhMzg0eF9yZWdzICpyZWdzKTsKKwlpbnQgKCpnZXRfcmlkKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgcmlkLCB2b2lkICpidWYsIGludCBsZW4sCisJCSAgICAgICBpbnQgZXhhY3RfbGVuKTsKKwlpbnQgKCpzZXRfcmlkKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgcmlkLCB2b2lkICpidWYsIGludCBsZW4pOworCWludCAoKmh3X2VuYWJsZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluaXRpYWwpOworCWludCAoKmh3X2NvbmZpZykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluaXRpYWwpOworCXZvaWQgKCpod19yZXNldCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKmh3X3NodXRkb3duKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbm9fZGlzYWJsZSk7CisJaW50ICgqcmVzZXRfcG9ydCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnNjaGVkdWxlX3Jlc2V0KShsb2NhbF9pbmZvX3QgKmxvY2FsKTsKKwlpbnQgKCpkb3dubG9hZCkobG9jYWxfaW5mb190ICpsb2NhbCwKKwkJCXN0cnVjdCBwcmlzbTJfZG93bmxvYWRfcGFyYW0gKnBhcmFtKTsKKwlpbnQgKCp0eCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJaW50ICgqc2V0X3RpbSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFpZCwgaW50IHNldCk7CisJaW50ICgqcmVhZF9hdXgpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGFkZHIsIGludCBsZW4sCisJCQl1OCAqYnVmKTsKKworCWludCBuZWVkX3R4X2hlYWRyb29tOyAvKiBudW1iZXIgb2YgYnl0ZXMgb2YgaGVhZHJvb20gbmVlZGVkIGJlZm9yZQorCQkJICAgICAgICogSUVFRSA4MDIuMTEgaGVhZGVyICovCisJZW51bSB7IEhPU1RBUF9IV19QQ0NBUkQsIEhPU1RBUF9IV19QTFgsIEhPU1RBUF9IV19QQ0kgfSBod190eXBlOworfTsKKworCitzdHJ1Y3QgcHJpc20yX2Rvd25sb2FkX2RhdGEgeworCXUzMiBkbF9jbWQ7CisJdTMyIHN0YXJ0X2FkZHI7CisJdTMyIG51bV9hcmVhczsKKwlzdHJ1Y3QgcHJpc20yX2Rvd25sb2FkX2RhdGFfYXJlYSB7CisJCXUzMiBhZGRyOyAvKiB3bGFuIGNhcmQgYWRkcmVzcyAqLworCQl1MzIgbGVuOworCQl1OCAqZGF0YTsgLyogYWxsb2NhdGVkIGRhdGEgKi8KKwl9IGRhdGFbMF07Cit9OworCisKKyNkZWZpbmUgSE9TVEFQX01BWF9CU1NfQ09VTlQgNjQKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKworc3RydWN0IGhvc3RhcF9ic3NfaW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGU7CisJdW5zaWduZWQgaW50IGNvdW50OworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwl1MTYgY2FwYWJfaW5mbzsKKwl1OCBzc2lkWzMyXTsKKwlzaXplX3Qgc3NpZF9sZW47CisJdTggd3BhX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3Qgd3BhX2llX2xlbjsKKwl1OCByc25faWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCByc25faWVfbGVuOworCWludCBjaGFuOworCWludCBpbmNsdWRlZDsKK307CisKKworLyogUGVyIHJhZGlvIHByaXZhdGUgSG9zdCBBUCBkYXRhIC0gc2hhcmVkIGJ5IGFsbCBuZXQgZGV2aWNlcyBpbnRlcmZhY2VzIHVzZWQKKyAqIGJ5IGVhY2ggcmFkaW8gKHdsYW4jLCB3bGFuI2FwLCB3bGFuI3N0YSwgV0RTKS4KKyAqICgoc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKikgbmV0ZGV2X3ByaXYoZGV2KSktPmxvY2FsIHBvaW50cyB0byB0aGlzCisgKiBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgbG9jYWxfaW5mbyB7CisJc3RydWN0IG1vZHVsZSAqaHdfbW9kdWxlOworCWludCBjYXJkX2lkeDsKKwlpbnQgZGV2X2VuYWJsZWQ7CisJaW50IG1hc3Rlcl9kZXZfYXV0b19vcGVuOyAvKiB3YXMgbWFzdGVyIGRldmljZSBvcGVuZWQgYXV0b21hdGljYWxseSAqLworCWludCBudW1fZGV2X29wZW47IC8qIG51bWJlciBvZiBvcGVuIGRldmljZXMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OyAvKiBtYXN0ZXIgcmFkaW8gZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRkZXY7IC8qIG1haW4gZGF0YSBkZXZpY2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGhvc3RhcF9pbnRlcmZhY2VzOyAvKiBIb3N0IEFQIGludGVyZmFjZSBsaXN0IChjb250YWlucworCQkJCQkgICAgICogc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgZW50cmllcykKKwkJCQkJICAgICAqLworCXJ3bG9ja190IGlmYWNlX2xvY2s7IC8qIGhvc3RhcF9pbnRlcmZhY2VzIHJlYWQgbG9jazsgdXNlIHdyaXRlIGxvY2sKKwkJCSAgICAgICogd2hlbiByZW1vdmluZyBlbnRyaWVzIGZyb20gdGhlIGxpc3QuCisJCQkgICAgICAqIFRYIGFuZCBSWCBwYXRocyBjYW4gdXNlIHJlYWQgbG9jay4gKi8KKwlzcGlubG9ja190IGNtZGxvY2ssIGJhcGxvY2ssIGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSByaWRfYmFwX3NlbTsKKwl1MTYgaW5mb2ZpZDsgLyogTUFDIGJ1ZmZlciBpZCBmb3IgaW5mbyBmcmFtZSAqLworCS8qIHR4ZmlkLCBpbnRyYW5zbWl0ZmlkLCBuZXh0X3R4dGlkLCBhbmQgbmV4dF9hbGxvYyBhcmUgcHJvdGVjdGVkIGJ5CisJICogdHhmaWRsb2NrICovCisJc3BpbmxvY2tfdCB0eGZpZGxvY2s7CisJaW50IHR4ZmlkX2xlbjsgLyogbGVuZ3RoIG9mIGFsbG9jYXRlZCBUWCBidWZmZXJzICovCisJdTE2IHR4ZmlkW1BSSVNNMl9UWEZJRF9DT1VOVF07IC8qIGJ1ZmZlciBJRHMgZm9yIFRYIGZyYW1lcyAqLworCS8qIGJ1ZmZlciBJRHMgZm9yIGludHJhbnNtaXQgZnJhbWVzIG9yIFBSSVNNMl9UWEZJRF9FTVBUWSBpZgorCSAqIGNvcnJlc3BvbmRpbmcgdHhmaWQgaXMgZnJlZSBmb3IgbmV4dCBUWCBmcmFtZSAqLworCXUxNiBpbnRyYW5zbWl0ZmlkW1BSSVNNMl9UWEZJRF9DT1VOVF07CisJaW50IG5leHRfdHhmaWQ7IC8qIGluZGV4IHRvIHRoZSBuZXh0IHR4ZmlkIHRvIGJlIGNoZWNrZWQgZm9yCisJCQkgKiBhdmFpbGFiaWxpdHkgKi8KKwlpbnQgbmV4dF9hbGxvYzsgLyogaW5kZXggdG8gdGhlIG5leHQgaW50cmFuc21pdGZpZCB0byBiZSBjaGVja2VkIGZvcgorCQkJICogYWxsb2NhdGlvbiBldmVudHMgKi8KKworCS8qIGJpdGZpZWxkIGZvciBhdG9taWMgYml0b3BzICovCisjZGVmaW5lIEhPU1RBUF9CSVRTX1RSQU5TTUlUIDAKKyNkZWZpbmUgSE9TVEFQX0JJVFNfQkFQX1RBU0tMRVQgMQorI2RlZmluZSBIT1NUQVBfQklUU19CQVBfVEFTS0xFVDIgMgorCWxvbmcgYml0czsKKworCXN0cnVjdCBhcF9kYXRhICphcDsKKworCWNoYXIgZXNzaWRbTUFYX1NTSURfTEVOICsgMV07CisJY2hhciBuYW1lW01BWF9OQU1FX0xFTiArIDFdOworCWludCBuYW1lX3NldDsKKwl1MTYgY2hhbm5lbF9tYXNrOyAvKiBtYXNrIG9mIGFsbG93ZWQgY2hhbm5lbHMgKi8KKwl1MTYgc2Nhbl9jaGFubmVsX21hc2s7IC8qIG1hc2sgb2YgY2hhbm5lbHMgdG8gYmUgc2Nhbm5lZCAqLworCXN0cnVjdCBjb21tX3RhbGxpZXNfc3VtcyBjb21tX3RhbGxpZXM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOworCWludCBpd19tb2RlOyAvKiBvcGVyYXRpbmcgbW9kZSAoSVdfTU9ERV8qKSAqLworCWludCBwc2V1ZG9fYWRob2M7IC8qIDA6IElXX01PREVfQURIT0MgaXMgcmVhbCA4MDIuMTEgY29tcGxpYW50IElCU1MKKwkJCSAgICogMTogSVdfTU9ERV9BREhPQyBpcyAicHNldWRvIElCU1MiICovCisJY2hhciBic3NpZFtFVEhfQUxFTl07CisJaW50IGNoYW5uZWw7CisJaW50IGJlYWNvbl9pbnQ7CisJaW50IGR0aW1fcGVyaW9kOworCWludCBtdHU7CisJaW50IGZyYW1lX2R1bXA7IC8qIGR1bXAgUlgvVFggZnJhbWUgaGVhZGVycywgUFJJU00yX0RVTVBfIGZsYWdzICovCisJaW50IGZ3X3R4X3JhdGVfY29udHJvbDsKKwl1MTYgdHhfcmF0ZV9jb250cm9sOworCXUxNiBiYXNpY19yYXRlczsKKwlpbnQgaHdfcmVzZXR0aW5nOworCWludCBod19yZWFkeTsKKwlpbnQgaHdfcmVzZXRfdHJpZXM7IC8qIGhvdyBtYW55IHRpbWVzIHJlc2V0IGhhcyBiZWVuIHRyaWVkICovCisJaW50IGh3X2Rvd25sb2FkaW5nOworCWludCBzaHV0ZG93bjsKKwlpbnQgcHJpX29ubHk7CisJaW50IG5vX3ByaTsgLyogbm8gUFJJIGYvdyBwcmVzZW50ICovCisJaW50IHNyYW1fdHlwZTsgLyogOCA9IHg4IFNSQU0sIDE2ID0geDE2IFNSQU0sIC0xID0gdW5rbm93biAqLworCisJZW51bSB7CisJCVBSSVNNMl9UWFBPV0VSX0FVVE8gPSAwLCBQUklTTTJfVFhQT1dFUl9PRkYsCisJCVBSSVNNMl9UWFBPV0VSX0ZJWEVELCBQUklTTTJfVFhQT1dFUl9VTktOT1dOCisJfSB0eHBvd2VyX3R5cGU7CisJaW50IHR4cG93ZXI7IC8qIGlmIHR4cG93ZXJfdHlwZSA9PSBQUklTTTJfVFhQT1dFUl9GSVhFRCAqLworCisJLyogY29tbWFuZCBxdWV1ZSBmb3IgaGZhMzg0eF9jbWQoKTsgcHJvdGVjdGVkIHdpdGggY21kbG9jayAqLworCXN0cnVjdCBsaXN0X2hlYWQgY21kX3F1ZXVlOworCS8qIG1heF9sZW4gZm9yIGNtZF9xdWV1ZTsgaW4gYWRkaXRpb24sIGNtZF9jYWxsYmFjayBjYW4gdXNlIHR3bworCSAqIGFkZGl0aW9uYWwgZW50cmllcyB0byBwcmV2ZW50IHNsZWVwaW5nIGNvbW1hbmRzIGZyb20gc3RvcHBpbmcKKwkgKiB0cmFuc21pdHMgKi8KKyNkZWZpbmUgSE9TVEFQX0NNRF9RVUVVRV9NQVhfTEVOIDE2CisJaW50IGNtZF9xdWV1ZV9sZW47IC8qIG51bWJlciBvZiBlbnRyaWVzIGluIGNtZF9xdWV1ZSAqLworCisJLyogaWYgY2FyZCB0aW1lb3V0IGlzIGRldGVjdGVkIGluIGludGVycnVwdCBjb250ZXh0LCByZXNldF9xdWV1ZSBpcworCSAqIHVzZWQgdG8gc2NoZWR1bGUgY2FyZCByZXNldGluZyB0byBiZSBkb25lIGluIHVzZXIgY29udGV4dCAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF9xdWV1ZTsKKworCS8qIEZvciBzY2hlZHVsaW5nIGEgY2hhbmdlIG9mIHRoZSBwcm9taXNjdW91cyBtb2RlIFJJRCAqLworCWludCBpc19wcm9taXNjOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzZXRfbXVsdGljYXN0X2xpc3RfcXVldWU7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2V0X3RpbV9xdWV1ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNldF90aW1fbGlzdDsKKwlzcGlubG9ja190IHNldF90aW1fbG9jazsKKworCWludCB3ZHNfbWF4X2Nvbm5lY3Rpb25zOworCWludCB3ZHNfY29ubmVjdGlvbnM7CisjZGVmaW5lIEhPU1RBUF9XRFNfQlJPQURDQVNUX1JBIEJJVCgwKQorI2RlZmluZSBIT1NUQVBfV0RTX0FQX0NMSUVOVCBCSVQoMSkKKyNkZWZpbmUgSE9TVEFQX1dEU19TVEFOREFSRF9GUkFNRSBCSVQoMikKKwl1MzIgd2RzX3R5cGU7CisJdTE2IHR4X2NvbnRyb2w7IC8qIGZsYWdzIHRvIGJlIHVzZWQgaW4gVFggZGVzY3JpcHRpb24gKi8KKwlpbnQgbWFudWFsX3JldHJ5X2NvdW50OyAvKiAtMSA9IHVzZSBmL3cgZGVmYXVsdDsgb3RoZXJ3aXNlIHJldHJ5IGNvdW50CisJCQkJICogdG8gYmUgdXNlZCB3aXRoIGFsbCBmcmFtZXMgKi8KKworCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsKKwl1bnNpZ25lZCBsb25nIHNjYW5fdGltZXN0YW1wOyAvKiBUaW1lIHN0YXJ0ZWQgdG8gc2NhbiAqLworCWVudW0geworCQlQUklTTTJfTU9OSVRPUl84MDIxMSA9IDAsIFBSSVNNMl9NT05JVE9SX1BSSVNNID0gMSwKKwkJUFJJU00yX01PTklUT1JfQ0FQSERSID0gMgorCX0gbW9uaXRvcl90eXBlOworCWludCAoKnNhdmVkX2V0aF9oZWFkZXJfcGFyc2UpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgdW5zaWduZWQgY2hhciAqaGFkZHIpOworCWludCBtb25pdG9yX2FsbG93X2Zjc2VycjsKKworCWludCBob3N0YXBkOyAvKiB3aGV0aGVyIHVzZXIgc3BhY2UgZGFlbW9uLCBob3N0YXBkLCBpcyB1c2VkIGZvciBBUAorCQkgICAgICAqIG1hbmFnZW1lbnQgKi8KKwlpbnQgaG9zdGFwZF9zdGE7IC8qIHdoZXRoZXIgaG9zdGFwZCBpcyB1c2VkIHdpdGggYW4gZXh0cmEgU1RBIGludGVyZmFjZQorCQkJICAqLworCXN0cnVjdCBuZXRfZGV2aWNlICphcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBhcGRldnN0YXRzOworCisJY2hhciBhc3NvY19hcF9hZGRyW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc3RhZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YWRldnN0YXRzOworCisjZGVmaW5lIFdFUF9LRVlTIDQKKyNkZWZpbmUgV0VQX0tFWV9MRU4gMTMKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0W1dFUF9LRVlTXTsKKwlpbnQgdHhfa2V5aWR4OyAvKiBkZWZhdWx0IFRYIGtleSBpbmRleCAoY3J5cHRbdHhfa2V5aWR4XSkgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBjcnlwdF9kZWluaXRfdGltZXI7CisJc3RydWN0IGxpc3RfaGVhZCBjcnlwdF9kZWluaXRfbGlzdDsKKworCWludCBvcGVuX3dlcDsgLyogYWxsb3cgdW5lbmNyeXB0ZWQgZnJhbWVzICovCisJaW50IGhvc3RfZW5jcnlwdDsKKwlpbnQgaG9zdF9kZWNyeXB0OworCWludCBwcml2YWN5X2ludm9rZWQ7IC8qIGZvcmNlIHByaXZhY3kgaW52b2tlZCBmbGFnIGV2ZW4gaWYgbm8ga2V5cyBhcmUKKwkJCSAgICAgICogY29uZmlndXJlZCAqLworCWludCBmd19lbmNyeXB0X29rOyAvKiB3aGV0aGVyIGZpcm13YXJlLWJhc2VkIFdFUCBlbmNyeXB0IGlzIHdvcmtpbmcKKwkJCSAgICAqIGluIEhvc3QgQVAgbW9kZSAoU1RBIGYvdyAxLjQuOSBvciBuZXdlcikgKi8KKwlpbnQgYmNyeF9zdGFfa2V5OyAvKiB1c2UgaW5kaXZpZHVhbCBrZXlzIHRvIG92ZXJyaWRlIGRlZmF1bHQga2V5cyBldmVuCisJCQkgICAqIHdpdGggUlggb2YgYnJvYWQvbXVsdGljYXN0IGZyYW1lcyAqLworCisJc3RydWN0IHByaXNtMl9mcmFnX2VudHJ5IGZyYWdfY2FjaGVbUFJJU00yX0ZSQUdfQ0FDSEVfTEVOXTsKKwl1bnNpZ25lZCBpbnQgZnJhZ19uZXh0X2lkeDsKKworCWludCBpZWVlXzgwMl8xeDsgLyogaXMgSUVFRSA4MDIuMVggdXNlZCAqLworCisJaW50IGFudHNlbF90eCwgYW50c2VsX3J4OworCWludCBydHNfdGhyZXNob2xkOyAvKiBkb3QxMVJUU1RocmVzaG9sZCAqLworCWludCBmcmFnbV90aHJlc2hvbGQ7IC8qIGRvdDExRnJhZ21lbnRhdGlvblRocmVzaG9sZCAqLworCWludCBhdXRoX2FsZ3M7IC8qIFBSSVNNMl9BVVRIXyBmbGFncyAqLworCisJaW50IGVuaF9zZWM7IC8qIGNuZkVuaFNlY3VyaXR5IG9wdGlvbnMgKGJyb2FkY2FzdCBTU0lEIGhpZGUvaWdub3JlKSAqLworCWludCB0YWxsaWVzMzI7IC8qIDMyLWJpdCB0YWxsaWVzIGluIHVzZSAqLworCisJc3RydWN0IHByaXNtMl9oZWxwZXJfZnVuY3Rpb25zICpmdW5jOworCisJdTggKnBkYTsKKwlpbnQgZndfYXA7CisjZGVmaW5lIFBSSVNNMl9GV19WRVIobWFqb3IsIG1pbm9yLCB2YXJpYW50KSBcCisoKChtYWpvcikgPDwgMTYpIHwgKChtaW5vcikgPDwgOCkgfCB2YXJpYW50KQorCXUzMiBzdGFfZndfdmVyOworCisJLyogVGFza2xldHMgZm9yIGhhbmRsaW5nIGhhcmR3YXJlIElSUSByZWxhdGVkIG9wZXJhdGlvbnMgb3V0c2lkZSBodyBJUlEKKwkgKiBoYW5kbGVyICovCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGJhcF90YXNrbGV0OworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGluZm9fdGFza2xldDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGluZm9fbGlzdDsgLyogaW5mbyBmcmFtZXMgYXMgc2tiJ3MgZm9yCisJCQkJCSogaW5mb190YXNrbGV0ICovCisKKwlzdHJ1Y3QgaG9zdGFwX3R4X2NhbGxiYWNrX2luZm8gKnR4X2NhbGxiYWNrOyAvKiByZWdpc3RlcmVkIFRYIGNhbGxiYWNrcworCQkJCQkJICAgICAgKi8KKworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCByeF90YXNrbGV0OworCXN0cnVjdCBza19idWZmX2hlYWQgcnhfbGlzdDsKKworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBzdGFfdHhfZXhjX3Rhc2tsZXQ7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBzdGFfdHhfZXhjX2xpc3Q7CisKKwlpbnQgaG9zdF9yb2FtaW5nOworCXVuc2lnbmVkIGxvbmcgbGFzdF9qb2luX3RpbWU7IC8qIHRpbWUgb2YgbGFzdCBKb2luUmVxdWVzdCAqLworCXN0cnVjdCBoZmEzODR4X2hvc3RzY2FuX3Jlc3VsdCAqbGFzdF9zY2FuX3Jlc3VsdHM7CisJaW50IGxhc3Rfc2Nhbl9yZXN1bHRzX2NvdW50OworCWVudW0geyBQUklTTTJfU0NBTiwgUFJJU00yX0hPU1RTQ0FOIH0gbGFzdF9zY2FuX3R5cGU7CisJc3RydWN0IHdvcmtfc3RydWN0IGluZm9fcXVldWU7CisJbG9uZyBwZW5kaW5nX2luZm87IC8qIGJpdCBmaWVsZCBvZiBwZW5kaW5nIGluZm9fcXVldWUgaXRlbXMgKi8KKyNkZWZpbmUgUFJJU00yX0lORk9fUEVORElOR19MSU5LU1RBVFVTIDAKKyNkZWZpbmUgUFJJU00yX0lORk9fUEVORElOR19TQ0FOUkVTVUxUUyAxCisJaW50IHByZXZfbGlua19zdGF0dXM7IC8qIHByZXZpb3VzIHJlY2VpdmVkIExpbmtTdGF0dXMgaW5mbyAqLworCWludCBwcmV2X2xpbmtzdGF0dXNfY29ubmVjdGVkOworCXU4IHByZWZlcnJlZF9hcFs2XTsgLyogdXNlIHRoaXMgQVAgaWYgcG9zc2libGUgKi8KKworI2lmZGVmIFBSSVNNMl9DQUxMQkFDSworCXZvaWQgKmNhbGxiYWNrX2RhdGE7IC8qIENhbiBiZSB1c2VkIGluIGNhbGxiYWNrczsgZS5nLiwgYWxsb2NhdGUKKwkJCSAgICAgICogb24gZW5hYmxlIGV2ZW50IGFuZCBmcmVlIG9uIGRpc2FibGUgZXZlbnQuCisJCQkgICAgICAqIEhvc3QgQVAgZHJpdmVyIGNvZGUgZG9lcyBub3QgdG91Y2ggdGhpcy4gKi8KKyNlbmRpZiAvKiBQUklTTTJfQ0FMTEJBQ0sgKi8KKworCXdhaXRfcXVldWVfaGVhZF90IGhvc3RzY2FuX3dxOworCisJLyogUGFzc2l2ZSBzY2FuIGluIEhvc3QgQVAgbW9kZSAqLworCXN0cnVjdCB0aW1lcl9saXN0IHBhc3NpdmVfc2Nhbl90aW1lcjsKKwlpbnQgcGFzc2l2ZV9zY2FuX2ludGVydmFsOyAvKiBpbiBzZWNvbmRzLCAwID0gZGlzYWJsZWQgKi8KKwlpbnQgcGFzc2l2ZV9zY2FuX2NoYW5uZWw7CisJZW51bSB7IFBBU1NJVkVfU0NBTl9XQUlULCBQQVNTSVZFX1NDQU5fTElTVEVOIH0gcGFzc2l2ZV9zY2FuX3N0YXRlOworCisJc3RydWN0IHRpbWVyX2xpc3QgdGlja190aW1lcjsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdGlja190aW1lcjsKKwl1bnNpZ25lZCBpbnQgc3dfdGlja19zdHVjazsKKworCS8qIGNvbW1zUXVhbGl0eSAvIGRCbUNvbW1zUXVhbGl0eSBkYXRhIGZyb20gcGVyaW9kaWMgcG9sbGluZzsgb25seQorCSAqIHZhbGlkIGZvciBNYW5hZ2VkIGFuZCBBZC1ob2MgbW9kZXMgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfY29tbXNfcXVhbF91cGRhdGU7CisJaW50IGNvbW1zX3F1YWw7IC8qIGluIHNvbWUgb2RkIHVuaXQuLiAqLworCWludCBhdmdfc2lnbmFsOyAvKiBpbiBkQiAobm90ZTogbmVnYXRpdmUpICovCisJaW50IGF2Z19ub2lzZTsgLyogaW4gZEIgKG5vdGU6IG5lZ2F0aXZlKSAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBjb21tc19xdWFsX3VwZGF0ZTsKKworCS8qIFJTU0kgdG8gZEJtIGFkanVzdG1lbnQgKGZvciBSWCBkZXNjcmlwdG9yIGZpZWxkcykgKi8KKwlpbnQgcnNzaV90b19kQm07IC8qIHN1YnN0cmFjdCBmcm9tIFJTU0kgdG8gZ2V0IGFwcHJveGltYXRlIGRCbSB2YWx1ZSAqLworCisJLyogQlNTIGxpc3QgLyBwcm90ZWN0ZWQgYnkgbG9jYWwtPmxvY2sgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGJzc19saXN0OworCWludCBudW1fYnNzX2luZm87CisJaW50IHdwYTsgLyogV1BBIHN1cHBvcnQgZW5hYmxlZCAqLworCWludCB0a2lwX2NvdW50ZXJtZWFzdXJlczsKKwlpbnQgZHJvcF91bmVuY3J5cHRlZDsKKwkvKiBHZW5lcmljIElFRUUgODAyLjExIGluZm8gZWxlbWVudCB0byBiZSBhZGRlZCB0bworCSAqIFByb2JlUmVzcC9CZWFjb24vKFJlKUFzc29jUmVxICovCisJdTggKmdlbmVyaWNfZWxlbTsKKwlzaXplX3QgZ2VuZXJpY19lbGVtX2xlbjsKKworI2lmZGVmIFBSSVNNMl9ET1dOTE9BRF9TVVBQT1JUCisJLyogUGVyc2lzdGVudCB2b2xhdGlsZSBkb3dubG9hZCBkYXRhICovCisJc3RydWN0IHByaXNtMl9kb3dubG9hZF9kYXRhICpkbF9wcmk7CisJc3RydWN0IHByaXNtMl9kb3dubG9hZF9kYXRhICpkbF9zZWM7CisjZW5kaWYgLyogUFJJU00yX0RPV05MT0FEX1NVUFBPUlQgKi8KKworI2lmZGVmIFBSSVNNMl9JT19ERUJVRworI2RlZmluZSBQUklTTTJfSU9fREVCVUdfU0laRSAxMDAwMAorCXUzMiBpb19kZWJ1Z1tQUklTTTJfSU9fREVCVUdfU0laRV07CisJaW50IGlvX2RlYnVnX2hlYWQ7CisJaW50IGlvX2RlYnVnX2VuYWJsZWQ7CisjZW5kaWYgLyogUFJJU00yX0lPX0RFQlVHICovCisKKwkvKiBQb2ludGVyIHRvIGhhcmR3YXJlIG1vZGVsIHNwZWNpZmljIChjcyxwY2kscGx4KSBwcml2YXRlIGRhdGEuICovCisJdm9pZCAqaHdfcHJpdjsKK307CisKKworLyogUGVyIGludGVyZmFjZSBwcml2YXRlIEhvc3QgQVAgZGF0YQorICogQWxsb2NhdGVkIGZvciBlYWNoIG5ldCBkZXZpY2UgdGhhdCBIb3N0IEFQIHVzZXMgKHdsYW4jLCB3bGFuI2FwLCB3bGFuI3N0YSwKKyAqIFdEUykgYW5kIG5ldGRldl9wcml2KGRldikgcG9pbnRzIHRvIHRoaXMgc3RydWN0dXJlLiAqLworc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgLyogbGlzdCBlbnRyeSBpbiBIb3N0IEFQIGludGVyZmFjZSBsaXN0ICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsgLyogcG9pbnRlciB0byB0aGlzIGRldmljZSAqLworCXN0cnVjdCBsb2NhbF9pbmZvICpsb2NhbDsgLyogcG9pbnRlciB0byBzaGFyZWQgcHJpdmF0ZSBkYXRhICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGl3X3NweV9kYXRhIHNweV9kYXRhOyAvKiBpd3NweSBzdXBwb3J0ICovCisJc3RydWN0IGl3X3B1YmxpY19kYXRhIHdpcmVsZXNzX2RhdGE7CisKKwllbnVtIHsKKwkJSE9TVEFQX0lOVEVSRkFDRV9NQVNURVIsCisJCUhPU1RBUF9JTlRFUkZBQ0VfTUFJTiwKKwkJSE9TVEFQX0lOVEVSRkFDRV9BUCwKKwkJSE9TVEFQX0lOVEVSRkFDRV9TVEEsCisJCUhPU1RBUF9JTlRFUkZBQ0VfV0RTLAorCX0gdHlwZTsKKworCXVuaW9uIHsKKwkJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2Vfd2RzIHsKKwkJCXU4IHJlbW90ZV9hZGRyW0VUSF9BTEVOXTsKKwkJfSB3ZHM7CisJfSB1OworfTsKKworCisjZGVmaW5lIEhPU1RBUF9TS0JfVFhfREFUQV9NQUdJQyAweGYwOGEzNmEyCisKKy8qCisgKiBUWCBtZXRhIGRhdGEgLSBzdG9yZWQgaW4gc2tiLT5jYiBidWZmZXIsIHNvIHRoaXMgbXVzdCBub3QgYmUgaW5jcmVhc2VkIG92ZXIKKyAqIHRoZSA0MC1ieXRlIGxpbWl0CisgKi8KK3N0cnVjdCBob3N0YXBfc2tiX3R4X2RhdGEgeworCXUzMiBtYWdpYzsgLyogSE9TVEFQX1NLQl9UWF9EQVRBX01BR0lDICovCisJdTggcmF0ZTsgLyogdHJhbnNtaXQgcmF0ZSAqLworI2RlZmluZSBIT1NUQVBfVFhfRkxBR1NfV0RTIEJJVCgwKQorI2RlZmluZSBIT1NUQVBfVFhfRkxBR1NfQlVGRkVSRURfRlJBTUUgQklUKDEpCisjZGVmaW5lIEhPU1RBUF9UWF9GTEFHU19BRERfTU9SRURBVEEgQklUKDIpCisJdTggZmxhZ3M7IC8qIEhPU1RBUF9UWF9GTEFHU18qICovCisJdTE2IHR4X2NiX2lkeDsKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CisJdW5zaWduZWQgbG9uZyBqaWZmaWVzOyAvKiBxdWV1ZWluZyB0aW1lc3RhbXAgKi8KKwl1bnNpZ25lZCBzaG9ydCBldGhlcnR5cGU7Cit9OworCisKKyNpZm5kZWYgUFJJU00yX05PX0RFQlVHCisKKyNkZWZpbmUgREVCVUdfRklEIEJJVCgwKQorI2RlZmluZSBERUJVR19QUyBCSVQoMSkKKyNkZWZpbmUgREVCVUdfRkxPVyBCSVQoMikKKyNkZWZpbmUgREVCVUdfQVAgQklUKDMpCisjZGVmaW5lIERFQlVHX0hXIEJJVCg0KQorI2RlZmluZSBERUJVR19FWFRSQSBCSVQoNSkKKyNkZWZpbmUgREVCVUdfRVhUUkEyIEJJVCg2KQorI2RlZmluZSBERUJVR19QUzIgQklUKDcpCisjZGVmaW5lIERFQlVHX01BU0sgKERFQlVHX1BTIHwgREVCVUdfQVAgfCBERUJVR19IVyB8IERFQlVHX0VYVFJBKQorI2RlZmluZSBQREVCVUcobiwgYXJncy4uLikgXAorZG8geyBpZiAoKG4pICYgREVCVUdfTUFTSykgcHJpbnRrKEtFUk5fREVCVUcgYXJncyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIFBERUJVRzIobiwgYXJncy4uLikgXAorZG8geyBpZiAoKG4pICYgREVCVUdfTUFTSykgcHJpbnRrKGFyZ3MpOyB9IHdoaWxlICgwKQorCisjZWxzZSAvKiBQUklTTTJfTk9fREVCVUcgKi8KKworI2RlZmluZSBQREVCVUcobiwgYXJncy4uLikKKyNkZWZpbmUgUERFQlVHMihuLCBhcmdzLi4uKQorCisjZW5kaWYgLyogUFJJU00yX05PX0RFQlVHICovCisKK2VudW0geyBCQVAwID0gMCwgQkFQMSA9IDEgfTsKKworI2RlZmluZSBQUklTTTJfSU9fREVCVUdfQ01EX0lOQiAwCisjZGVmaW5lIFBSSVNNMl9JT19ERUJVR19DTURfSU5XIDEKKyNkZWZpbmUgUFJJU00yX0lPX0RFQlVHX0NNRF9JTlNXIDIKKyNkZWZpbmUgUFJJU00yX0lPX0RFQlVHX0NNRF9PVVRCIDMKKyNkZWZpbmUgUFJJU00yX0lPX0RFQlVHX0NNRF9PVVRXIDQKKyNkZWZpbmUgUFJJU00yX0lPX0RFQlVHX0NNRF9PVVRTVyA1CisjZGVmaW5lIFBSSVNNMl9JT19ERUJVR19DTURfRVJST1IgNgorI2RlZmluZSBQUklTTTJfSU9fREVCVUdfQ01EX0lOVEVSUlVQVCA3CisKKyNpZmRlZiBQUklTTTJfSU9fREVCVUcKKworI2RlZmluZSBQUklTTTJfSU9fREVCVUdfRU5UUlkoY21kLCByZWcsIHZhbHVlKSBcCisoKChjbWQpIDw8IDI0KSB8ICgocmVnKSA8PCAxNikgfCB2YWx1ZSkKKworc3RhdGljIGlubGluZSB2b2lkIHByaXNtMl9pb19kZWJ1Z19hZGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNtZCwKKwkJCQkgICAgICAgaW50IHJlZywgaW50IHZhbHVlKQoreworCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZSA9IG5ldGRldl9wcml2KGRldik7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IGlmYWNlLT5sb2NhbDsKKworCWlmICghbG9jYWwtPmlvX2RlYnVnX2VuYWJsZWQpCisJCXJldHVybjsKKworCWxvY2FsLT5pb19kZWJ1Z1tsb2NhbC0+aW9fZGVidWdfaGVhZF0gPQlqaWZmaWVzICYgMHhmZmZmZmZmZjsKKwlpZiAoKytsb2NhbC0+aW9fZGVidWdfaGVhZCA+PSBQUklTTTJfSU9fREVCVUdfU0laRSkKKwkJbG9jYWwtPmlvX2RlYnVnX2hlYWQgPSAwOworCWxvY2FsLT5pb19kZWJ1Z1tsb2NhbC0+aW9fZGVidWdfaGVhZF0gPQorCQlQUklTTTJfSU9fREVCVUdfRU5UUlkoY21kLCByZWcsIHZhbHVlKTsKKwlpZiAoKytsb2NhbC0+aW9fZGVidWdfaGVhZCA+PSBQUklTTTJfSU9fREVCVUdfU0laRSkKKwkJbG9jYWwtPmlvX2RlYnVnX2hlYWQgPSAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmlzbTJfaW9fZGVidWdfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGVycikKK3sKKwlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvY2FsX2luZm9fdCAqbG9jYWwgPSBpZmFjZS0+bG9jYWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghbG9jYWwtPmlvX2RlYnVnX2VuYWJsZWQpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+bG9jaywgZmxhZ3MpOworCXByaXNtMl9pb19kZWJ1Z19hZGQoZGV2LCBQUklTTTJfSU9fREVCVUdfQ01EX0VSUk9SLCAwLCBlcnIpOworCWlmIChsb2NhbC0+aW9fZGVidWdfZW5hYmxlZCA9PSAxKSB7CisJCWxvY2FsLT5pb19kZWJ1Z19lbmFibGVkID0gMDsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJL08gZGVidWcgc3RvcHBlZFxuIiwgZGV2LT5uYW1lKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmxvY2ssIGZsYWdzKTsKK30KKworI2Vsc2UgLyogUFJJU00yX0lPX0RFQlVHICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmlzbTJfaW9fZGVidWdfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjbWQsCisJCQkJICAgICAgIGludCByZWcsIGludCB2YWx1ZSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByaXNtMl9pb19kZWJ1Z19lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZXJyKQoreworfQorCisjZW5kaWYgLyogUFJJU00yX0lPX0RFQlVHICovCisKKworI2lmZGVmIFBSSVNNMl9DQUxMQkFDSworZW51bSB7CisJLyogQ2FsbGVkIHdoZW4gY2FyZCBpcyBlbmFibGVkICovCisJUFJJU00yX0NBTExCQUNLX0VOQUJMRSwKKworCS8qIENhbGxlZCB3aGVuIGNhcmQgaXMgZGlzYWJsZWQgKi8KKwlQUklTTTJfQ0FMTEJBQ0tfRElTQUJMRSwKKworCS8qIENhbGxlZCB3aGVuIFJYL1RYIHN0YXJ0cy9lbmRzICovCisJUFJJU00yX0NBTExCQUNLX1JYX1NUQVJULCBQUklTTTJfQ0FMTEJBQ0tfUlhfRU5ELAorCVBSSVNNMl9DQUxMQkFDS19UWF9TVEFSVCwgUFJJU00yX0NBTExCQUNLX1RYX0VORAorfTsKK3ZvaWQgcHJpc20yX2NhbGxiYWNrKGxvY2FsX2luZm9fdCAqbG9jYWwsIGludCBldmVudCk7CisjZWxzZSAvKiBQUklTTTJfQ0FMTEJBQ0sgKi8KKyNkZWZpbmUgcHJpc20yX2NhbGxiYWNrKGQsIGUpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBQUklTTTJfQ0FMTEJBQ0sgKi8KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIEhPU1RBUF9XTEFOX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2llZWU4MDJfMTEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2llZWU4MDJfMTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkZDUyNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pZWVlODAyXzExLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jaWZuZGVmIF9JRUVFODAyXzExX0gKLSNkZWZpbmUgX0lFRUU4MDJfMTFfSAotCi0jZGVmaW5lIElFRUU4MDJfMTFfREFUQV9MRU4JCTIzMDQKLS8qIE1heGltdW0gc2l6ZSBmb3IgdGhlIE1BLVVOSVREQVRBIHByaW1pdGl2ZSwgODAyLjExIHN0YW5kYXJkIHNlY3Rpb24KLSAgIDYuMi4xLjEuMi4KLQotICAgVGhlIGZpZ3VyZSBpbiBzZWN0aW9uIDcuMS4yIHN1Z2dlc3RzIGEgYm9keSBzaXplIG9mIHVwIHRvIDIzMTIKLSAgIGJ5dGVzIGlzIGFsbG93ZWQsIHdoaWNoIGlzIGEgYml0IGNvbmZ1c2luZywgSSBzdXNwZWN0IHRoaXMKLSAgIHJlcHJlc2VudHMgdGhlIDIzMDQgYnl0ZXMgb2YgcmVhbCBkYXRhLCBwbHVzIGEgcG9zc2libGUgOCBieXRlcyBvZgotICAgV0VQIElWIGFuZCBJQ1YuICh0aGlzIGludGVycHJldGF0aW9uIHN1Z2dlc3RlZCBieSBSYW1pcm8gQmFycmVpcm8pICovCi0KLQotI2RlZmluZSBJRUVFODAyXzExX0hMRU4JCQkzMAotI2RlZmluZSBJRUVFODAyXzExX0ZSQU1FX0xFTgkJKElFRUU4MDJfMTFfREFUQV9MRU4gKyBJRUVFODAyXzExX0hMRU4pCi0KLXN0cnVjdCBpZWVlODAyXzExX2hkciB7Ci0JdTE2IGZyYW1lX2N0bDsKLQl1MTYgZHVyYXRpb25faWQ7Ci0JdTggYWRkcjFbRVRIX0FMRU5dOwotCXU4IGFkZHIyW0VUSF9BTEVOXTsKLQl1OCBhZGRyM1tFVEhfQUxFTl07Ci0JdTE2IHNlcV9jdGw7Ci0JdTggYWRkcjRbRVRIX0FMRU5dOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIEZyYW1lIGNvbnRyb2wgZmllbGQgY29uc3RhbnRzICovCi0jZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9WRVJTCQkweDAwMDIKLSNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX0ZUWVBFCQkweDAwMGMKLSNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX1NUWVBFCQkweDAwZjAKLSNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX1RPRFMJCTB4MDEwMAotI2RlZmluZSBJRUVFODAyXzExX0ZDVExfRlJPTURTCQkweDAyMDAKLSNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX01PUkVGUkFHUwkweDA0MDAKLSNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX1JFVFJZCQkweDA4MDAKLSNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX1BNCQkweDEwMDAKLSNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX01PUkVEQVRBCTB4MjAwMAotI2RlZmluZSBJRUVFODAyXzExX0ZDVExfV0VQCQkweDQwMDAKLSNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX09SREVSCQkweDgwMDAKLQotI2RlZmluZSBJRUVFODAyXzExX0ZUWVBFX01HTVQJCTB4MDAwMAotI2RlZmluZSBJRUVFODAyXzExX0ZUWVBFX0NUTAkJMHgwMDA0Ci0jZGVmaW5lIElFRUU4MDJfMTFfRlRZUEVfREFUQQkJMHgwMDA4Ci0KLS8qIG1hbmFnZW1lbnQgKi8KLSNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9BU1NPQ19SRVEJMHgwMDAwCi0jZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQVNTT0NfUkVTUCAJMHgwMDEwCi0jZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfUkVBU1NPQ19SRVEJMHgwMDIwCi0jZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfUkVBU1NPQ19SRVNQCTB4MDAzMAotI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX1BST0JFX1JFUQkweDAwNDAKLSNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9QUk9CRV9SRVNQCTB4MDA1MAotI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0JFQUNPTgkJMHgwMDgwCi0jZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQVRJTQkJMHgwMDkwCi0jZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfRElTQVNTT0MJMHgwMEEwCi0jZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQVVUSAkJMHgwMEIwCi0jZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfREVBVVRICQkweDAwQzAKLQotLyogY29udHJvbCAqLwotI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX1BTUE9MTAkJMHgwMEEwCi0jZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfUlRTCQkweDAwQjAKLSNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9DVFMJCTB4MDBDMAotI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0FDSwkJMHgwMEQwCi0jZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQ0ZFTkQJCTB4MDBFMAotI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0NGRU5EQUNLCTB4MDBGMAotCi0vKiBkYXRhICovCi0jZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfREFUQQkJMHgwMDAwCi0jZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfREFUQV9DRkFDSwkweDAwMTAKLSNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9EQVRBX0NGUE9MTAkweDAwMjAKLSNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9EQVRBX0NGQUNLUE9MTAkweDAwMzAKLSNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9OVUxMRlVOQwkweDAwNDAKLSNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9DRkFDSwkJMHgwMDUwCi0jZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQ0ZQT0xMCQkweDAwNjAKLSNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9DRkFDS1BPTEwJMHgwMDcwCi0KLSNkZWZpbmUgSUVFRTgwMl8xMV9TQ1RMX0ZSQUcJCTB4MDAwRgotI2RlZmluZSBJRUVFODAyXzExX1NDVExfU0VRCQkweEZGRjAKLQotI2VuZGlmIC8qIF9JRUVFODAyXzExX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE0ZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCkBAIC0wLDAgKzEsODY4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDAzIC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisgIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gdGhlIHNhbXBsZV8qIGZpbGVzIHByb3ZpZGVkIGJ5IFdpcmVsZXNzCisgIEV4dGVuc2lvbnMgMC4yNiBwYWNrYWdlIGFuZCBjb3B5cmlnaHQgKGMpIDE5OTctMjAwMyBKZWFuIFRvdXJyaWxoZXMKKyAgPGp0QGhwbC5ocC5jb20+CisKKyAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgSG9zdCBBUCBwcm9qZWN0LAorICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAgICA8amttYWxpbmVAY2MuaHV0LmZpPgorICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorCisgIFBvcnRpb25zIG9mIGlwdzIxMDBfbW9kX2Zpcm13YXJlX2xvYWQsIGlwdzIxMDBfZG9fbW9kX2Zpcm13YXJlX2xvYWQsIGFuZAorICBpcHcyMTAwX2Z3X2xvYWQgYXJlIGxvb3NlbHkgYmFzZWQgb24gZHJpdmVycy9zb3VuZC9zb3VuZF9maXJtd2FyZS5jCisgIGF2YWlsYWJsZSBpbiB0aGUgMi40LjI1IGtlcm5lbCBzb3VyY2VzLCBhbmQgYXJlIGNvcHlyaWdodCAoYykgQWxhbiBDb3gKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKworIEluaXRpYWwgZHJpdmVyIG9uIHdoaWNoIHRoaXMgaXMgYmFzZWQgd2FzIGRldmVsb3BlZCBieSBKYW51c3ogR29yeWNraSwKKyBNYWNpZWogVXJiYW5pYWssIGFuZCBNYWNpZWogU29zbm93c2tpLgorCisgUHJvbWlzY3VvdXMgbW9kZSBzdXBwb3J0IGFkZGVkIGJ5IEphY2VrIFd5c29jenluc2tpIGFuZCBNYWNpZWogVXJiYW5pYWsuCisKK1RoZW9yeSBvZiBPcGVyYXRpb24KKworVHggLSBDb21tYW5kcyBhbmQgRGF0YQorCitGaXJtd2FyZSBhbmQgaG9zdCBzaGFyZSBhIGNpcmN1bGFyIHF1ZXVlIG9mIFRyYW5zbWl0IEJ1ZmZlciBEZXNjcmlwdG9ycyAoVEJEcykKK0VhY2ggVEJEIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgcGh5c2ljYWwgKGRtYV9hZGRyX3QpIGFkZHJlc3Mgb2YgZGF0YSBiZWluZworc2VudCB0byB0aGUgZmlybXdhcmUgYXMgd2VsbCBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhLgorCitUaGUgaG9zdCB3cml0ZXMgdG8gdGhlIFRCRCBxdWV1ZSBhdCB0aGUgV1JJVEUgaW5kZXguICBUaGUgV1JJVEUgaW5kZXggcG9pbnRzCit0byB0aGUgX25leHRfIHBhY2tldCB0byBiZSB3cml0dGVuIGFuZCBpcyBhZHZhbmNlZCB3aGVuIGFmdGVyIHRoZSBUQkQgaGFzIGJlZW4KK2ZpbGxlZC4KKworVGhlIGZpcm13YXJlIHB1bGxzIGZyb20gdGhlIFRCRCBxdWV1ZSBhdCB0aGUgUkVBRCBpbmRleC4gIFRoZSBSRUFEIGluZGV4IHBvaW50cwordG8gdGhlIGN1cnJlbnRseSBiZWluZyByZWFkIGVudHJ5LCBhbmQgaXMgYWR2YW5jZWQgb25jZSB0aGUgZmlybXdhcmUgaXMKK2RvbmUgd2l0aCBhIHBhY2tldC4KKworV2hlbiBkYXRhIGlzIHNlbnQgdG8gdGhlIGZpcm13YXJlLCB0aGUgZmlyc3QgVEJEIGlzIHVzZWQgdG8gaW5kaWNhdGUgdG8gdGhlCitmaXJtd2FyZSBpZiBhIENvbW1hbmQgb3IgRGF0YSBpcyBiZWluZyBzZW50LiAgSWYgaXQgaXMgQ29tbWFuZCwgYWxsIG9mIHRoZQorY29tbWFuZCBpbmZvcm1hdGlvbiBpcyBjb250YWluZWQgd2l0aGluIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZmVycmVkIHRvIGJ5IHRoZQorVEJELiAgSWYgaXQgaXMgRGF0YSwgdGhlIGZpcnN0IFRCRCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZGF0YSBwYWNrZXQsIG51bWJlcgorb2YgZnJhZ21lbnRzLCBldGMuICBUaGUgbmV4dCBUQkQgdGhlbiByZWZlcnJzIHRvIHRoZSBhY3R1YWwgcGFja2V0IGxvY2F0aW9uLgorCitUaGUgVHggZmxvdyBjeWNsZSBpcyBhcyBmb2xsb3dzOgorCisxKSBpcHcyMTAwX3R4KCkgaXMgY2FsbGVkIGJ5IGtlcm5lbCB3aXRoIFNLQiB0byB0cmFuc21pdAorMikgUGFja2V0IGlzIG1vdmUgZnJvbSB0aGUgdHhfZnJlZV9saXN0IGFuZCBhcHBlbmRlZCB0byB0aGUgdHJhbnNtaXQgcGVuZGluZworICAgbGlzdCAodHhfcGVuZF9saXN0KQorMykgd29yayBpcyBzY2hlZHVsZWQgdG8gbW92ZSBwZW5kaW5nIHBhY2tldHMgaW50byB0aGUgc2hhcmVkIGNpcmN1bGFyIHF1ZXVlLgorNCkgd2hlbiBwbGFjaW5nIHBhY2tldCBpbiB0aGUgY2lyY3VsYXIgcXVldWUsIHRoZSBpbmNvbWluZyBTS0IgaXMgRE1BIG1hcHBlZAorICAgdG8gYSBwaHlzaWNhbCBhZGRyZXNzLiAgVGhhdCBhZGRyZXNzIGlzIGVudGVyZWQgaW50byBhIFRCRC4gIFR3byBUQkRzIGFyZQorICAgZmlsbGVkIG91dC4gIFRoZSBmaXJzdCBpbmRpY2F0aW5nIGEgZGF0YSBwYWNrZXQsIHRoZSBzZWNvbmQgcmVmZXJyaW5nIHRvIHRoZQorICAgYWN0dWFsIHBheWxvYWQgZGF0YS4KKzUpIHRoZSBwYWNrZXQgaXMgcmVtb3ZlZCBmcm9tIHR4X3BlbmRfbGlzdCBhbmQgcGxhY2VkIG9uIHRoZSBlbmQgb2YgdGhlCisgICBmaXJtd2FyZSBwZW5kaW5nIGxpc3QgKGZ3X3BlbmRfbGlzdCkKKzYpIGZpcm13YXJlIGlzIG5vdGlmaWVkIHRoYXQgdGhlIFdSSVRFIGluZGV4IGhhcworNykgT25jZSB0aGUgZmlybXdhcmUgaGFzIHByb2Nlc3NlZCB0aGUgVEJELCBJTlRBIGlzIHRyaWdnZXJlZC4KKzgpIEZvciBlYWNoIFR4IGludGVycnVwdCByZWNlaXZlZCBmcm9tIHRoZSBmaXJtd2FyZSwgdGhlIFJFQUQgaW5kZXggaXMgY2hlY2tlZAorICAgdG8gc2VlIHdoaWNoIFRCRHMgYXJlIGRvbmUgYmVpbmcgcHJvY2Vzc2VkLgorOSkgRm9yIGVhY2ggVEJEIHRoYXQgaGFzIGJlZW4gcHJvY2Vzc2VkLCB0aGUgSVNSIHB1bGxzIHRoZSBvbGRlc3QgcGFja2V0CisgICBmcm9tIHRoZSBmd19wZW5kX2xpc3QuCisxMClUaGUgcGFja2V0IHN0cnVjdHVyZSBjb250YWluZWQgaW4gdGhlIGZ3X3BlbmRfbGlzdCBpcyB0aGVuIHVzZWQKKyAgIHRvIHVubWFwIHRoZSBETUEgYWRkcmVzcyBhbmQgdG8gZnJlZSB0aGUgU0tCIG9yaWdpbmFsbHkgcGFzc2VkIHRvIHRoZSBkcml2ZXIKKyAgIGZyb20gdGhlIGtlcm5lbC4KKzExKVRoZSBwYWNrZXQgc3RydWN0dXJlIGlzIHBsYWNlZCBvbnRvIHRoZSB0eF9mcmVlX2xpc3QKKworVGhlIGFib3ZlIHN0ZXBzIGFyZSB0aGUgc2FtZSBmb3IgY29tbWFuZHMsIG9ubHkgdGhlIG1zZ19mcmVlX2xpc3QvbXNnX3BlbmRfbGlzdAorYXJlIHVzZWQgaW5zdGVhZCBvZiB0eF9mcmVlX2xpc3QvdHhfcGVuZF9saXN0CisKKy4uLgorCitDcml0aWNhbCBTZWN0aW9ucyAvIExvY2tpbmcgOgorCitUaGVyZSBhcmUgdHdvIGxvY2tzIHV0aWxpemVkLiAgVGhlIGZpcnN0IGlzIHRoZSBsb3cgbGV2ZWwgbG9jayAocHJpdi0+bG93X2xvY2spCit0aGF0IHByb3RlY3RzIHRoZSBmb2xsb3dpbmc6CisKKy0gQWNjZXNzIHRvIHRoZSBUeC9SeCBxdWV1ZSBsaXN0cyB2aWEgcHJpdi0+bG93X2xvY2suIFRoZSBsaXN0cyBhcmUgYXMgZm9sbG93czoKKworICB0eF9mcmVlX2xpc3QgOiBIb2xkcyBwcmUtYWxsb2NhdGVkIFR4IGJ1ZmZlcnMuCisgICAgVEFJTCBtb2RpZmllZCBpbiBfX2lwdzIxMDBfdHhfcHJvY2VzcygpCisgICAgSEVBRCBtb2RpZmllZCBpbiBpcHcyMTAwX3R4KCkKKworICB0eF9wZW5kX2xpc3QgOiBIb2xkcyB1c2VkIFR4IGJ1ZmZlcnMgd2FpdGluZyB0byBnbyBpbnRvIHRoZSBUQkQgcmluZworICAgIFRBSUwgbW9kaWZpZWQgaXB3MjEwMF90eCgpCisgICAgSEVBRCBtb2RpZmllZCBieSBpcHcyMTAwX3R4X3NlbmRfZGF0YSgpCisKKyAgbXNnX2ZyZWVfbGlzdCA6IEhvbGRzIHByZS1hbGxvY2F0ZWQgTXNnIChDb21tYW5kKSBidWZmZXJzCisgICAgVEFJTCBtb2RpZmllZCBpbiBfX2lwdzIxMDBfdHhfcHJvY2VzcygpCisgICAgSEVBRCBtb2RpZmllZCBpbiBpcHcyMTAwX2h3X3NlbmRfY29tbWFuZCgpCisKKyAgbXNnX3BlbmRfbGlzdCA6IEhvbGRzIHVzZWQgTXNnIGJ1ZmZlcnMgd2FpdGluZyB0byBnbyBpbnRvIHRoZSBUQkQgcmluZworICAgIFRBSUwgbW9kaWZpZWQgaW4gaXB3MjEwMF9od19zZW5kX2NvbW1hbmQoKQorICAgIEhFQUQgbW9kaWZpZWQgaW4gaXB3MjEwMF90eF9zZW5kX2NvbW1hbmRzKCkKKworICBUaGUgZmxvdyBvZiBkYXRhIG9uIHRoZSBUWCBzaWRlIGlzIGFzIGZvbGxvd3M6CisKKyAgTVNHX0ZSRUVfTElTVCArIENPTU1BTkQgPT4gTVNHX1BFTkRfTElTVCA9PiBUQkQgPT4gTVNHX0ZSRUVfTElTVAorICBUWF9GUkVFX0xJU1QgKyBEQVRBID0+IFRYX1BFTkRfTElTVCA9PiBUQkQgPT4gVFhfRlJFRV9MSVNUCisKKyAgVGhlIG1ldGhvZHMgdGhhdCB3b3JrIG9uIHRoZSBUQkQgcmluZyBhcmUgcHJvdGVjdGVkIHZpYSBwcml2LT5sb3dfbG9jay4KKworLSBUaGUgaW50ZXJuYWwgZGF0YSBzdGF0ZSBvZiB0aGUgZGV2aWNlIGl0c2VsZgorLSBBY2Nlc3MgdG8gdGhlIGZpcm13YXJlIHJlYWQvd3JpdGUgaW5kZXhlcyBmb3IgdGhlIEJEIHF1ZXVlcworICBhbmQgYXNzb2NpYXRlZCBsb2dpYworCitBbGwgZXh0ZXJuYWwgZW50cnkgZnVuY3Rpb25zIGFyZSBsb2NrZWQgd2l0aCB0aGUgcHJpdi0+YWN0aW9uX2xvY2sgdG8gZW5zdXJlCit0aGF0IG9ubHkgb25lIGV4dGVybmFsIGFjdGlvbiBpcyBpbnZva2VkIGF0IGEgdGltZS4KKworCisqLworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisjaW5jbHVkZSAiaXB3MjEwMC5oIgorCisjZGVmaW5lIElQVzIxMDBfVkVSU0lPTiAiMS4xLjAiCisKKyNkZWZpbmUgRFJWX05BTUUJImlwdzIxMDAiCisjZGVmaW5lIERSVl9WRVJTSU9OCUlQVzIxMDBfVkVSU0lPTgorI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JIkludGVsKFIpIFBSTy9XaXJlbGVzcyAyMTAwIE5ldHdvcmsgRHJpdmVyIgorI2RlZmluZSBEUlZfQ09QWVJJR0hUCSJDb3B5cmlnaHQoYykgMjAwMy0yMDA0IEludGVsIENvcnBvcmF0aW9uIgorCisKKy8qIERlYnVnZ2luZyBzdHVmZiAqLworI2lmZGVmIENPTkZJR19JUFdfREVCVUcKKyNkZWZpbmUgQ09ORklHX0lQVzIxMDBfUlhfREVCVUcgICAvKiBSZWNlcHRpb24gZGVidWdnaW5nICovCisjZW5kaWYKKworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK3N0YXRpYyBpbnQgbW9kZSA9IDA7CitzdGF0aWMgaW50IGNoYW5uZWwgPSAwOworc3RhdGljIGludCBhc3NvY2lhdGUgPSAxOworc3RhdGljIGludCBkaXNhYmxlID0gMDsKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBzdHJ1Y3QgaXB3MjEwMF9mdyBpcHcyMTAwX2Zpcm13YXJlOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKG1vZGUsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oY2hhbm5lbCwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShhc3NvY2lhdGUsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oZGlzYWJsZSwgaW50LCAwNDQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIGxldmVsIik7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGUsICJuZXR3b3JrIG1vZGUgKDA9QlNTLDE9SUJTUywyPU1vbml0b3IpIik7CitNT0RVTEVfUEFSTV9ERVNDKGNoYW5uZWwsICJjaGFubmVsIik7CitNT0RVTEVfUEFSTV9ERVNDKGFzc29jaWF0ZSwgImF1dG8gYXNzb2NpYXRlIHdoZW4gc2Nhbm5pbmcgKGRlZmF1bHQgb24pIik7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGUsICJtYW51YWxseSBkaXNhYmxlIHRoZSByYWRpbyAoZGVmYXVsdCAwIFtyYWRpbyBvbl0pIik7CisKK3N0YXRpYyB1MzIgaXB3MjEwMF9kZWJ1Z19sZXZlbCA9IElQV19ETF9OT05FOworCisjaWZkZWYgQ09ORklHX0lQV19ERUJVRworI2RlZmluZSBJUFdfREVCVUcobGV2ZWwsIG1lc3NhZ2UuLi4pIFwKK2RvIHsgXAorCWlmIChpcHcyMTAwX2RlYnVnX2xldmVsICYgKGxldmVsKSkgeyBcCisJCXByaW50ayhLRVJOX0RFQlVHICJpcHcyMTAwOiAlYyAlcyAiLCBcCisgICAgICAgICAgICAgICAgICAgICAgIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCAgX19GVU5DVElPTl9fKTsgXAorCQlwcmludGsobWVzc2FnZSk7IFwKKwl9IFwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBJUFdfREVCVUcobGV2ZWwsIG1lc3NhZ2UuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qIENPTkZJR19JUFdfREVCVUcgKi8KKworI2lmZGVmIENPTkZJR19JUFdfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICpjb21tYW5kX3R5cGVzW10gPSB7CisJInVuZGVmaW5lZCIsCisJInVudXNlZCIsIC8qIEhPU1RfQVRURU5USU9OICovCisJIkhPU1RfQ09NUExFVEUiLAorCSJ1bnVzZWQiLCAvKiBTTEVFUCAqLworCSJ1bnVzZWQiLCAvKiBIT1NUX1BPV0VSX0RPV04gKi8KKwkidW51c2VkIiwKKwkiU1lTVEVNX0NPTkZJRyIsCisJInVudXNlZCIsIC8qIFNFVF9JTVIgKi8KKwkiU1NJRCIsCisJIk1BTkRBVE9SWV9CU1NJRCIsCisJIkFVVEhFTlRJQ0FUSU9OX1RZUEUiLAorCSJBREFQVEVSX0FERFJFU1MiLAorCSJQT1JUX1RZUEUiLAorCSJJTlRFUk5BVElPTkFMX01PREUiLAorCSJDSEFOTkVMIiwKKwkiUlRTX1RIUkVTSE9MRCIsCisJIkZSQUdfVEhSRVNIT0xEIiwKKwkiUE9XRVJfTU9ERSIsCisJIlRYX1JBVEVTIiwKKwkiQkFTSUNfVFhfUkFURVMiLAorCSJXRVBfS0VZX0lORk8iLAorCSJ1bnVzZWQiLAorCSJ1bnVzZWQiLAorCSJ1bnVzZWQiLAorCSJ1bnVzZWQiLAorCSJXRVBfS0VZX0lOREVYIiwKKwkiV0VQX0ZMQUdTIiwKKwkiQUREX01VTFRJQ0FTVCIsCisJIkNMRUFSX0FMTF9NVUxUSUNBU1QiLAorCSJCRUFDT05fSU5URVJWQUwiLAorCSJBVElNX1dJTkRPVyIsCisJIkNMRUFSX1NUQVRJU1RJQ1MiLAorCSJ1bmRlZmluZWQiLAorCSJ1bmRlZmluZWQiLAorCSJ1bmRlZmluZWQiLAorCSJ1bmRlZmluZWQiLAorCSJUWF9QT1dFUl9JTkRFWCIsCisJInVuZGVmaW5lZCIsCisJInVuZGVmaW5lZCIsCisJInVuZGVmaW5lZCIsCisJInVuZGVmaW5lZCIsCisJInVuZGVmaW5lZCIsCisJInVuZGVmaW5lZCIsCisJIkJST0FEQ0FTVF9TQ0FOIiwKKwkiQ0FSRF9ESVNBQkxFIiwKKwkiUFJFRkVSUkVEX0JTU0lEIiwKKwkiU0VUX1NDQU5fT1BUSU9OUyIsCisJIlNDQU5fRFdFTExfVElNRSIsCisJIlNXRUVQX1RBQkxFIiwKKwkiQVBfT1JfU1RBVElPTl9UQUJMRSIsCisJIkdST1VQX09SRElOQUxTIiwKKwkiU0hPUlRfUkVUUllfTElNSVQiLAorCSJMT05HX1JFVFJZX0xJTUlUIiwKKwkidW51c2VkIiwgLyogU0FWRV9DQUxJQlJBVElPTiAqLworCSJ1bnVzZWQiLCAvKiBSRVNUT1JFX0NBTElCUkFUSU9OICovCisJInVuZGVmaW5lZCIsCisJInVuZGVmaW5lZCIsCisJInVuZGVmaW5lZCIsCisJIkhPU1RfUFJFX1BPV0VSX0RPV04iLAorCSJ1bnVzZWQiLCAvKiBIT1NUX0lOVEVSUlVQVF9DT0FMRVNDSU5HICovCisJInVuZGVmaW5lZCIsCisJIkNBUkRfRElTQUJMRV9QSFlfT0ZGIiwKKwkiTVNEVV9UWF9SQVRFUyIKKwkidW5kZWZpbmVkIiwKKwkidW5kZWZpbmVkIiwKKwkiU0VUX1NUQVRJT05fU1RBVF9CSVRTIiwKKwkiQ0xFQVJfU1RBVElPTlNfU1RBVF9CSVRTIiwKKwkiTEVBUF9ST0dVRV9NT0RFIiwKKwkiU0VUX1NFQ1VSSVRZX0lORk9STUFUSU9OIiwKKwkiRElTQVNTT0NJQVRJT05fQlNTSUQiLAorCSJTRVRfV1BBX0FTU19JRSIKK307CisjZW5kaWYKKworCisvKiBQcmUtZGVjbCB1bnRpbCB3ZSBnZXQgdGhlIGNvZGUgc29saWQgYW5kIHRoZW4gd2UgY2FuIGNsZWFuIGl0IHVwICovCitzdGF0aWMgdm9pZCBpcHcyMTAwX3R4X3NlbmRfY29tbWFuZHMoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdik7CitzdGF0aWMgdm9pZCBpcHcyMTAwX3R4X3NlbmRfZGF0YShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KTsKK3N0YXRpYyBpbnQgaXB3MjEwMF9hZGFwdGVyX3NldHVwKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpOworCitzdGF0aWMgdm9pZCBpcHcyMTAwX3F1ZXVlc19pbml0aWFsaXplKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpOworc3RhdGljIHZvaWQgaXB3MjEwMF9xdWV1ZXNfZnJlZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KTsKK3N0YXRpYyBpbnQgaXB3MjEwMF9xdWV1ZXNfYWxsb2NhdGUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdik7CisKK3N0YXRpYyBpbnQgaXB3MjEwMF9md19kb3dubG9hZChzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LAorCQkJICAgICAgIHN0cnVjdCBpcHcyMTAwX2Z3ICpmdyk7CitzdGF0aWMgaW50IGlwdzIxMDBfZ2V0X2Zpcm13YXJlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsCisJCQkJc3RydWN0IGlwdzIxMDBfZncgKmZ3KTsKK3N0YXRpYyBpbnQgaXB3MjEwMF9nZXRfZnd2ZXJzaW9uKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGNoYXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IG1heCk7CitzdGF0aWMgaW50IGlwdzIxMDBfZ2V0X3Vjb2RldmVyc2lvbihzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LCBjaGFyICpidWYsCisJCQkJICAgIHNpemVfdCBtYXgpOworc3RhdGljIHZvaWQgaXB3MjEwMF9yZWxlYXNlX2Zpcm13YXJlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsCisJCQkJICAgICBzdHJ1Y3QgaXB3MjEwMF9mdyAqZncpOworc3RhdGljIGludCBpcHcyMTAwX3Vjb2RlX2Rvd25sb2FkKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsCisJCQkJICBzdHJ1Y3QgaXB3MjEwMF9mdyAqZncpOworc3RhdGljIHZvaWQgaXB3MjEwMF93eF9ldmVudF93b3JrKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpOworc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICppcHcyMTAwX3d4X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgaXB3MjEwMF93eF9oYW5kbGVyX2RlZjsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgcmVnLCB1MzIgKnZhbCkKK3sKKwkqdmFsID0gcmVhZGwoKHZvaWQgX19pb21lbSAqKShkZXYtPmJhc2VfYWRkciArIHJlZykpOworCUlQV19ERUJVR19JTygicjogMHglMDhYID0+IDB4JTA4WFxuIiwgcmVnLCAqdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiByZWcsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgKHZvaWQgX19pb21lbSAqKShkZXYtPmJhc2VfYWRkciArIHJlZykpOworCUlQV19ERUJVR19JTygidzogMHglMDhYIDw9IDB4JTA4WFxuIiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9yZWdpc3Rlcl93b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiByZWcsIHUxNiAqdmFsKQoreworCSp2YWwgPSByZWFkdygodm9pZCBfX2lvbWVtICopKGRldi0+YmFzZV9hZGRyICsgcmVnKSk7CisJSVBXX0RFQlVHX0lPKCJyOiAweCUwOFggPT4gJTA0WFxuIiwgcmVnLCAqdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlYWRfcmVnaXN0ZXJfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgcmVnLCB1OCAqdmFsKQoreworCSp2YWwgPSByZWFkYigodm9pZCBfX2lvbWVtICopKGRldi0+YmFzZV9hZGRyICsgcmVnKSk7CisJSVBXX0RFQlVHX0lPKCJyOiAweCUwOFggPT4gJTAyWFxuIiwgcmVnLCAqdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3JlZ2lzdGVyX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHJlZywgdTE2IHZhbCkKK3sKKwl3cml0ZXcodmFsLCAodm9pZCBfX2lvbWVtICopKGRldi0+YmFzZV9hZGRyICsgcmVnKSk7CisJSVBXX0RFQlVHX0lPKCJ3OiAweCUwOFggPD0gJTA0WFxuIiwgcmVnLCB2YWwpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9yZWdpc3Rlcl9ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiByZWcsIHU4IHZhbCkKK3sKKwl3cml0ZWIodmFsLCAodm9pZCBfX2lvbWVtICopKGRldi0+YmFzZV9hZGRyICsgcmVnKSk7CisJSVBXX0RFQlVHX0lPKCJ3OiAweCUwOFggPTwgJTAyWFxuIiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGFkZHIsIHUzMiAqdmFsKQoreworCXdyaXRlX3JlZ2lzdGVyKGRldiwgSVBXX1JFR19JTkRJUkVDVF9BQ0NFU1NfQUREUkVTUywKKwkJICAgICAgIGFkZHIgJiBJUFdfUkVHX0lORElSRUNUX0FERFJfTUFTSyk7CisJcmVhZF9yZWdpc3RlcihkZXYsIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0RBVEEsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGFkZHIsIHUzMiB2YWwpCit7CisJd3JpdGVfcmVnaXN0ZXIoZGV2LCBJUFdfUkVHX0lORElSRUNUX0FDQ0VTU19BRERSRVNTLAorCQkgICAgICAgYWRkciAmIElQV19SRUdfSU5ESVJFQ1RfQUREUl9NQVNLKTsKKwl3cml0ZV9yZWdpc3RlcihkZXYsIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0RBVEEsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWFkX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyLCB1MTYgKnZhbCkKK3sKKwl3cml0ZV9yZWdpc3RlcihkZXYsIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0FERFJFU1MsCisJCSAgICAgICBhZGRyICYgSVBXX1JFR19JTkRJUkVDVF9BRERSX01BU0spOworCXJlYWRfcmVnaXN0ZXJfd29yZChkZXYsIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0RBVEEsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgYWRkciwgdTE2IHZhbCkKK3sKKwl3cml0ZV9yZWdpc3RlcihkZXYsIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0FERFJFU1MsCisJCSAgICAgICBhZGRyICYgSVBXX1JFR19JTkRJUkVDVF9BRERSX01BU0spOworCXdyaXRlX3JlZ2lzdGVyX3dvcmQoZGV2LCBJUFdfUkVHX0lORElSRUNUX0FDQ0VTU19EQVRBLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgYWRkciwgdTggKnZhbCkKK3sKKwl3cml0ZV9yZWdpc3RlcihkZXYsIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0FERFJFU1MsCisJCSAgICAgICBhZGRyICYgSVBXX1JFR19JTkRJUkVDVF9BRERSX01BU0spOworCXJlYWRfcmVnaXN0ZXJfYnl0ZShkZXYsIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0RBVEEsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgYWRkciwgdTggdmFsKQoreworCXdyaXRlX3JlZ2lzdGVyKGRldiwgSVBXX1JFR19JTkRJUkVDVF9BQ0NFU1NfQUREUkVTUywKKwkJICAgICAgIGFkZHIgJiBJUFdfUkVHX0lORElSRUNUX0FERFJfTUFTSyk7CisJd3JpdGVfcmVnaXN0ZXJfYnl0ZShkZXYsIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0RBVEEsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9uaWNfYXV0b19pbmNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgYWRkcikKK3sKKwl3cml0ZV9yZWdpc3RlcihkZXYsIElQV19SRUdfQVVUT0lOQ1JFTUVOVF9BRERSRVNTLAorCQkgICAgICAgYWRkciAmIElQV19SRUdfSU5ESVJFQ1RfQUREUl9NQVNLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX25pY19kd29yZF9hdXRvX2luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsKQoreworCXdyaXRlX3JlZ2lzdGVyKGRldiwgSVBXX1JFR19BVVRPSU5DUkVNRU5UX0RBVEEsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9uaWNfbWVtb3J5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyLCB1MzIgbGVuLAorCQkJCSAgICBjb25zdCB1OCAqYnVmKQoreworCXUzMiBhbGlnbmVkX2FkZHI7CisJdTMyIGFsaWduZWRfbGVuOworCXUzMiBkaWZfbGVuOworCXUzMiBpOworCisJLyogcmVhZCBmaXJzdCBuaWJibGUgYnl0ZSBieSBieXRlICovCisJYWxpZ25lZF9hZGRyID0gYWRkciAmICh+MHgzKTsKKwlkaWZfbGVuID0gYWRkciAtIGFsaWduZWRfYWRkcjsKKwlpZiAoZGlmX2xlbikgeworCQkvKiBTdGFydCByZWFkaW5nIGF0IGFsaWduZWRfYWRkciArIGRpZl9sZW4gKi8KKwkJd3JpdGVfcmVnaXN0ZXIoZGV2LCBJUFdfUkVHX0lORElSRUNUX0FDQ0VTU19BRERSRVNTLAorCQkJICAgICAgIGFsaWduZWRfYWRkcik7CisJCWZvciAoaSA9IGRpZl9sZW47IGkgPCA0OyBpKyssIGJ1ZisrKQorCQkJd3JpdGVfcmVnaXN0ZXJfYnl0ZSgKKwkJCQlkZXYsIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0RBVEEgKyBpLAorCQkJCSpidWYpOworCisJCWxlbiAtPSBkaWZfbGVuOworCQlhbGlnbmVkX2FkZHIgKz0gNDsKKwl9CisKKwkvKiByZWFkIERXcyB0aHJvdWdoIGF1dG9pbmNyZW1lbnQgcmVnaXN0ZXJzICovCisJd3JpdGVfcmVnaXN0ZXIoZGV2LCBJUFdfUkVHX0FVVE9JTkNSRU1FTlRfQUREUkVTUywKKwkJICAgICAgIGFsaWduZWRfYWRkcik7CisJYWxpZ25lZF9sZW4gPSBsZW4gJiAofjB4Myk7CisJZm9yIChpID0gMDsgaSA8IGFsaWduZWRfbGVuOyBpICs9IDQsIGJ1ZiArPSA0LCBhbGlnbmVkX2FkZHIgKz0gNCkKKwkJd3JpdGVfcmVnaXN0ZXIoCisJCQlkZXYsIElQV19SRUdfQVVUT0lOQ1JFTUVOVF9EQVRBLCAqKHUzMiAqKWJ1Zik7CisKKwkvKiBjb3B5IHRoZSBsYXN0IG5pYmJsZSAqLworCWRpZl9sZW4gPSBsZW4gLSBhbGlnbmVkX2xlbjsKKwl3cml0ZV9yZWdpc3RlcihkZXYsIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0FERFJFU1MsIGFsaWduZWRfYWRkcik7CisJZm9yIChpID0gMDsgaSA8IGRpZl9sZW47IGkrKywgYnVmKyspCisJCXdyaXRlX3JlZ2lzdGVyX2J5dGUoCisJCQlkZXYsIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0RBVEEgKyBpLCAqYnVmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlYWRfbmljX21lbW9yeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgYWRkciwgdTMyIGxlbiwKKwkJCQkgICB1OCAqYnVmKQoreworCXUzMiBhbGlnbmVkX2FkZHI7CisJdTMyIGFsaWduZWRfbGVuOworCXUzMiBkaWZfbGVuOworCXUzMiBpOworCisJLyogcmVhZCBmaXJzdCBuaWJibGUgYnl0ZSBieSBieXRlICovCisJYWxpZ25lZF9hZGRyID0gYWRkciAmICh+MHgzKTsKKwlkaWZfbGVuID0gYWRkciAtIGFsaWduZWRfYWRkcjsKKwlpZiAoZGlmX2xlbikgeworCQkvKiBTdGFydCByZWFkaW5nIGF0IGFsaWduZWRfYWRkciArIGRpZl9sZW4gKi8KKwkJd3JpdGVfcmVnaXN0ZXIoZGV2LCBJUFdfUkVHX0lORElSRUNUX0FDQ0VTU19BRERSRVNTLAorCQkJICAgICAgIGFsaWduZWRfYWRkcik7CisJCWZvciAoaSA9IGRpZl9sZW47IGkgPCA0OyBpKyssIGJ1ZisrKQorCQkJcmVhZF9yZWdpc3Rlcl9ieXRlKAorCQkJCWRldiwgSVBXX1JFR19JTkRJUkVDVF9BQ0NFU1NfREFUQSArIGksIGJ1Zik7CisKKwkJbGVuIC09IGRpZl9sZW47CisJCWFsaWduZWRfYWRkciArPSA0OworCX0KKworCS8qIHJlYWQgRFdzIHRocm91Z2ggYXV0b2luY3JlbWVudCByZWdpc3RlcnMgKi8KKwl3cml0ZV9yZWdpc3RlcihkZXYsIElQV19SRUdfQVVUT0lOQ1JFTUVOVF9BRERSRVNTLAorCQkgICAgICAgYWxpZ25lZF9hZGRyKTsKKwlhbGlnbmVkX2xlbiA9IGxlbiAmICh+MHgzKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWxpZ25lZF9sZW47IGkgKz0gNCwgYnVmICs9IDQsIGFsaWduZWRfYWRkciArPSA0KQorCQlyZWFkX3JlZ2lzdGVyKGRldiwgSVBXX1JFR19BVVRPSU5DUkVNRU5UX0RBVEEsCisJCQkgICAgICAodTMyICopYnVmKTsKKworCS8qIGNvcHkgdGhlIGxhc3QgbmliYmxlICovCisJZGlmX2xlbiA9IGxlbiAtIGFsaWduZWRfbGVuOworCXdyaXRlX3JlZ2lzdGVyKGRldiwgSVBXX1JFR19JTkRJUkVDVF9BQ0NFU1NfQUREUkVTUywKKwkJICAgICAgIGFsaWduZWRfYWRkcik7CisJZm9yIChpID0gMDsgaSA8IGRpZl9sZW47IGkrKywgYnVmKyspCisJCXJlYWRfcmVnaXN0ZXJfYnl0ZShkZXYsIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0RBVEEgKworCQkJCSAgIGksIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlwdzIxMDBfaHdfaXNfYWRhcHRlcl9pbl9zeXN0ZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKGRldi0+YmFzZV9hZGRyICYmCisJCShyZWFkbCgodm9pZCBfX2lvbWVtICopKGRldi0+YmFzZV9hZGRyICsgSVBXX1JFR19ET0FfREVCVUdfQVJFQV9TVEFSVCkpCisJCSA9PSBJUFdfREFUQV9ET0FfREVCVUdfVkFMVUUpKTsKK30KKworc3RhdGljIGludCBpcHcyMTAwX2dldF9vcmRpbmFsKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHUzMiBvcmQsCisJCQkgICAgICAgdm9pZCAqdmFsLCB1MzIgKmxlbikKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9vcmRpbmFscyAqb3JkaW5hbHMgPSAmcHJpdi0+b3JkaW5hbHM7CisJdTMyIGFkZHI7CisJdTMyIGZpZWxkX2luZm87CisJdTE2IGZpZWxkX2xlbjsKKwl1MTYgZmllbGRfY291bnQ7CisJdTMyIHRvdGFsX2xlbmd0aDsKKworCWlmIChvcmRpbmFscy0+dGFibGUxX2FkZHIgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IGF0dGVtcHQgdG8gdXNlIGZ3IG9yZGluYWxzICIKKwkJICAgICAgICJiZWZvcmUgdGhleSBoYXZlIGJlZW4gbG9hZGVkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChJU19PUkRJTkFMX1RBQkxFX09ORShvcmRpbmFscywgb3JkKSkgeworCQlpZiAoKmxlbiA8IElQV19PUkRfVEFCXzFfRU5UUllfU0laRSkgeworCQkJKmxlbiA9IElQV19PUkRfVEFCXzFfRU5UUllfU0laRTsKKworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJICAgICAgICI6IG9yZGluYWwgYnVmZmVyIGxlbmd0aCB0b28gc21hbGwsIG5lZWQgJXpkXG4iLAorCQkJICAgICAgIElQV19PUkRfVEFCXzFfRU5UUllfU0laRSk7CisKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcmVhZF9uaWNfZHdvcmQocHJpdi0+bmV0X2Rldiwgb3JkaW5hbHMtPnRhYmxlMV9hZGRyICsgKG9yZCA8PCAyKSwKKwkJCSAgICAgICAmYWRkcik7CisJCXJlYWRfbmljX2R3b3JkKHByaXYtPm5ldF9kZXYsIGFkZHIsIHZhbCk7CisKKwkJKmxlbiA9IElQV19PUkRfVEFCXzFfRU5UUllfU0laRTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoSVNfT1JESU5BTF9UQUJMRV9UV08ob3JkaW5hbHMsIG9yZCkpIHsKKworCQlvcmQgLT0gSVBXX1NUQVJUX09SRF9UQUJfMjsKKworCQkvKiBnZXQgdGhlIGFkZHJlc3Mgb2Ygc3RhdGlzdGljICovCisJCXJlYWRfbmljX2R3b3JkKHByaXYtPm5ldF9kZXYsIG9yZGluYWxzLT50YWJsZTJfYWRkciArIChvcmQgPDwgMyksCisJCQkgICAgICAgJmFkZHIpOworCisJCS8qIGdldCB0aGUgc2Vjb25kIERXIG9mIHN0YXRpc3RpY3MgOworCQkgKiB0d28gMTYtYml0IHdvcmRzIC0gZmlyc3QgaXMgbGVuZ3RoLCBzZWNvbmQgaXMgY291bnQgKi8KKwkJcmVhZF9uaWNfZHdvcmQocHJpdi0+bmV0X2RldiwKKwkJCSAgICAgICBvcmRpbmFscy0+dGFibGUyX2FkZHIgKyAob3JkIDw8IDMpICsgc2l6ZW9mKHUzMiksCisJCQkgICAgICAgJmZpZWxkX2luZm8pOworCisJCS8qIGdldCBlYWNoIGVudHJ5IGxlbmd0aCAqLworCQlmaWVsZF9sZW4gPSAqKCh1MTYgKikmZmllbGRfaW5mbyk7CisKKwkJLyogZ2V0IG51bWJlciBvZiBlbnRyaWVzICovCisJCWZpZWxkX2NvdW50ID0gKigoKHUxNiAqKSZmaWVsZF9pbmZvKSArIDEpOworCisJCS8qIGFib3J0IGlmIG5vIGVub3VnaHQgbWVtb3J5ICovCisJCXRvdGFsX2xlbmd0aCA9IGZpZWxkX2xlbiAqIGZpZWxkX2NvdW50OworCQlpZiAodG90YWxfbGVuZ3RoID4gKmxlbikgeworCQkJKmxlbiA9IHRvdGFsX2xlbmd0aDsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJKmxlbiA9IHRvdGFsX2xlbmd0aDsKKwkJaWYgKCF0b3RhbF9sZW5ndGgpCisJCQlyZXR1cm4gMDsKKworCQkvKiByZWFkIHRoZSBvcmRpbmFsIGRhdGEgZnJvbSB0aGUgU1JBTSAqLworCQlyZWFkX25pY19tZW1vcnkocHJpdi0+bmV0X2RldiwgYWRkciwgdG90YWxfbGVuZ3RoLCB2YWwpOworCisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogb3JkaW5hbCAlZCBuZWl0aGVyIGluIHRhYmxlIDEgbm9yICIKKwkgICAgICAgImluIHRhYmxlIDJcbiIsIG9yZCk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBpcHcyMTAwX3NldF9vcmRpbmFsKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHUzMiBvcmQsIHUzMiAqdmFsLAorCQkJICAgICAgIHUzMiAqbGVuKQoreworCXN0cnVjdCBpcHcyMTAwX29yZGluYWxzICpvcmRpbmFscyA9ICZwcml2LT5vcmRpbmFsczsKKwl1MzIgYWRkcjsKKworCWlmIChJU19PUkRJTkFMX1RBQkxFX09ORShvcmRpbmFscywgb3JkKSkgeworCQlpZiAoKmxlbiAhPSBJUFdfT1JEX1RBQl8xX0VOVFJZX1NJWkUpIHsKKwkJCSpsZW4gPSBJUFdfT1JEX1RBQl8xX0VOVFJZX1NJWkU7CisJCQlJUFdfREVCVUdfSU5GTygid3Jvbmcgc2l6ZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJlYWRfbmljX2R3b3JkKHByaXYtPm5ldF9kZXYsIG9yZGluYWxzLT50YWJsZTFfYWRkciArIChvcmQgPDwgMiksCisJCQkgICAgICAgJmFkZHIpOworCisJCXdyaXRlX25pY19kd29yZChwcml2LT5uZXRfZGV2LCBhZGRyLCAqdmFsKTsKKworCQkqbGVuID0gSVBXX09SRF9UQUJfMV9FTlRSWV9TSVpFOworCisJCXJldHVybiAwOworCX0KKworCUlQV19ERUJVR19JTkZPKCJ3cm9uZyB0YWJsZVxuIik7CisJaWYgKElTX09SRElOQUxfVEFCTEVfVFdPKG9yZGluYWxzLCBvcmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY2hhciAqc25wcmludF9saW5lKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICBjb25zdCB1OCAqZGF0YSwgdTMyIGxlbiwgdTMyIG9mcykKK3sKKwlpbnQgb3V0LCBpLCBqLCBsOworCWNoYXIgYzsKKworCW91dCA9IHNucHJpbnRmKGJ1ZiwgY291bnQsICIlMDhYIiwgb2ZzKTsKKworCWZvciAobCA9IDAsIGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGNvdW50IC0gb3V0LCAiICIpOworCQlmb3IgKGogPSAwOyBqIDwgOCAmJiBsIDwgbGVuOyBqKyssIGwrKykKKwkJCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGNvdW50IC0gb3V0LCAiJTAyWCAiLAorCQkJCQlkYXRhWyhpICogOCArIGopXSk7CisJCWZvciAoOyBqIDwgODsgaisrKQorCQkJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgY291bnQgLSBvdXQsICIgICAiKTsKKwl9CisKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBjb3VudCAtIG91dCwgIiAiKTsKKwlmb3IgKGwgPSAwLCBpID0gMDsgaSA8IDI7IGkrKykgeworCQlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBjb3VudCAtIG91dCwgIiAiKTsKKwkJZm9yIChqID0gMDsgaiA8IDggJiYgbCA8IGxlbjsgaisrLCBsKyspIHsKKwkJCWMgPSBkYXRhWyhpICogOCArIGopXTsKKwkJCWlmICghaXNhc2NpaShjKSB8fCAhaXNwcmludChjKSkKKwkJCQljID0gJy4nOworCisJCQlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBjb3VudCAtIG91dCwgIiVjIiwgYyk7CisJCX0KKworCQlmb3IgKDsgaiA8IDg7IGorKykKKwkJCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGNvdW50IC0gb3V0LCAiICIpOworCX0KKworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50a19idWYoaW50IGxldmVsLCBjb25zdCB1OCAqZGF0YSwgdTMyIGxlbikKK3sKKwljaGFyIGxpbmVbODFdOworCXUzMiBvZnMgPSAwOworCWlmICghKGlwdzIxMDBfZGVidWdfbGV2ZWwgJiBsZXZlbCkpCisJCXJldHVybjsKKworCXdoaWxlIChsZW4pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLAorCQkgICAgICAgc25wcmludF9saW5lKGxpbmUsIHNpemVvZihsaW5lKSwgJmRhdGFbb2ZzXSwKKwkJCQkgICAgbWluKGxlbiwgMTZVKSwgb2ZzKSk7CisJCW9mcyArPSAxNjsKKwkJbGVuIC09IG1pbihsZW4sIDE2VSk7CisJfQorfQorCisKKworI2RlZmluZSBNQVhfUkVTRVRfQkFDS09GRiAxMAorCitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWR1bGVfcmVzZXQoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGdldF9zZWNvbmRzKCk7CisKKwkvKiBJZiB3ZSBoYXZlbid0IHJlY2VpdmVkIGEgcmVzZXQgcmVxdWVzdCB3aXRoaW4gdGhlIGJhY2tvZmYgcGVyaW9kLAorCSAqIHRoZW4gd2UgY2FuIHJlc2V0IHRoZSBiYWNrb2ZmIGludGVydmFsIHNvIHRoaXMgcmVzZXQgb2NjdXJzCisJICogaW1tZWRpYXRlbHkgKi8KKwlpZiAocHJpdi0+cmVzZXRfYmFja29mZiAmJgorCSAgICAobm93IC0gcHJpdi0+bGFzdF9yZXNldCA+IHByaXYtPnJlc2V0X2JhY2tvZmYpKQorCQlwcml2LT5yZXNldF9iYWNrb2ZmID0gMDsKKworCXByaXYtPmxhc3RfcmVzZXQgPSBnZXRfc2Vjb25kcygpOworCisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JFU0VUX1BFTkRJTkcpKSB7CisJCUlQV19ERUJVR19JTkZPKCIlczogU2NoZWR1bGluZyBmaXJtd2FyZSByZXN0YXJ0ICglZHMpLlxuIiwKKwkJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lLCBwcml2LT5yZXNldF9iYWNrb2ZmKTsKKwkJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+bmV0X2Rldik7CisJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0X2Rldik7CisJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfUkVTRVRfUEVORElORzsKKwkJaWYgKHByaXYtPnJlc2V0X2JhY2tvZmYpCisJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVzZXRfd29yaywKKwkJCQkJICAgcHJpdi0+cmVzZXRfYmFja29mZiAqIEhaKTsKKwkJZWxzZQorCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZXNldF93b3JrKTsKKworCQlpZiAocHJpdi0+cmVzZXRfYmFja29mZiA8IE1BWF9SRVNFVF9CQUNLT0ZGKQorCQkJcHJpdi0+cmVzZXRfYmFja29mZisrOworCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKwl9IGVsc2UKKwkJSVBXX0RFQlVHX0lORk8oIiVzOiBGaXJtd2FyZSByZXN0YXJ0IGFscmVhZHkgaW4gcHJvZ3Jlc3MuXG4iLAorCQkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUpOworCit9CisKKyNkZWZpbmUgSE9TVF9DT01QTEVURV9USU1FT1VUICgyICogSFopCitzdGF0aWMgaW50IGlwdzIxMDBfaHdfc2VuZF9jb21tYW5kKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsCisJCQkJICAgc3RydWN0IGhvc3RfY29tbWFuZCAqIGNtZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OworCXN0cnVjdCBpcHcyMTAwX3R4X3BhY2tldCAqcGFja2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IDA7CisKKwlJUFdfREVCVUdfSEMoIlNlbmRpbmcgJXMgY29tbWFuZCAoIyVkKSwgJWQgYnl0ZXNcbiIsCisJCSAgICAgY29tbWFuZF90eXBlc1tjbWQtPmhvc3RfY29tbWFuZF0sIGNtZC0+aG9zdF9jb21tYW5kLAorCQkgICAgIGNtZC0+aG9zdF9jb21tYW5kX2xlbmd0aCk7CisJcHJpbnRrX2J1ZihJUFdfRExfSEMsICh1OCopY21kLT5ob3N0X2NvbW1hbmRfcGFyYW1ldGVycywKKwkJICAgY21kLT5ob3N0X2NvbW1hbmRfbGVuZ3RoKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb3dfbG9jaywgZmxhZ3MpOworCisJaWYgKHByaXYtPmZhdGFsX2Vycm9yKSB7CisJCUlQV19ERUJVR19JTkZPKCJBdHRlbXB0IHRvIHNlbmQgY29tbWFuZCB3aGlsZSBoYXJkd2FyZSBpbiBmYXRhbCBlcnJvciBjb25kaXRpb24uXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBmYWlsX3VubG9jazsKKwl9CisKKwlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfUlVOTklORykpIHsKKwkJSVBXX0RFQlVHX0lORk8oIkF0dGVtcHQgdG8gc2VuZCBjb21tYW5kIHdoaWxlIGhhcmR3YXJlIGlzIG5vdCBydW5uaW5nLlxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZmFpbF91bmxvY2s7CisJfQorCisJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19DTURfQUNUSVZFKSB7CisJCUlQV19ERUJVR19JTkZPKCJBdHRlbXB0IHRvIHNlbmQgY29tbWFuZCB3aGlsZSBhbm90aGVyIGNvbW1hbmQgaXMgcGVuZGluZy5cbiIpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZmFpbF91bmxvY2s7CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJnByaXYtPm1zZ19mcmVlX2xpc3QpKSB7CisJCUlQV19ERUJVR19JTkZPKCJubyBhdmFpbGFibGUgbXNnIGJ1ZmZlcnNcbiIpOworCQlnb3RvIGZhaWxfdW5sb2NrOworCX0KKworCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfQ01EX0FDVElWRTsKKwlwcml2LT5tZXNzYWdlc19zZW50Kys7CisKKwllbGVtZW50ID0gcHJpdi0+bXNnX2ZyZWVfbGlzdC5uZXh0OworCisJcGFja2V0ID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaXB3MjEwMF90eF9wYWNrZXQsIGxpc3QpOworCXBhY2tldC0+amlmZnlfc3RhcnQgPSBqaWZmaWVzOworCisJLyogaW5pdGlhbGl6ZSB0aGUgZmlybXdhcmUgY29tbWFuZCBwYWNrZXQgKi8KKwlwYWNrZXQtPmluZm8uY19zdHJ1Y3QuY21kLT5ob3N0X2NvbW1hbmRfcmVnID0gY21kLT5ob3N0X2NvbW1hbmQ7CisJcGFja2V0LT5pbmZvLmNfc3RydWN0LmNtZC0+aG9zdF9jb21tYW5kX3JlZzEgPSBjbWQtPmhvc3RfY29tbWFuZDE7CisJcGFja2V0LT5pbmZvLmNfc3RydWN0LmNtZC0+aG9zdF9jb21tYW5kX2xlbl9yZWcgPSBjbWQtPmhvc3RfY29tbWFuZF9sZW5ndGg7CisJcGFja2V0LT5pbmZvLmNfc3RydWN0LmNtZC0+c2VxdWVuY2UgPSBjbWQtPmhvc3RfY29tbWFuZF9zZXF1ZW5jZTsKKworCW1lbWNweShwYWNrZXQtPmluZm8uY19zdHJ1Y3QuY21kLT5ob3N0X2NvbW1hbmRfcGFyYW1zX3JlZywKKwkgICAgICAgY21kLT5ob3N0X2NvbW1hbmRfcGFyYW1ldGVycywKKwkgICAgICAgc2l6ZW9mKHBhY2tldC0+aW5mby5jX3N0cnVjdC5jbWQtPmhvc3RfY29tbWFuZF9wYXJhbXNfcmVnKSk7CisKKwlsaXN0X2RlbChlbGVtZW50KTsKKwlERUNfU1RBVCgmcHJpdi0+bXNnX2ZyZWVfc3RhdCk7CisKKwlsaXN0X2FkZF90YWlsKGVsZW1lbnQsICZwcml2LT5tc2dfcGVuZF9saXN0KTsKKwlJTkNfU1RBVCgmcHJpdi0+bXNnX3BlbmRfc3RhdCk7CisKKwlpcHcyMTAwX3R4X3NlbmRfY29tbWFuZHMocHJpdik7CisJaXB3MjEwMF90eF9zZW5kX2RhdGEocHJpdik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb3dfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBXZSBtdXN0IHdhaXQgZm9yIHRoaXMgY29tbWFuZCB0byBjb21wbGV0ZSBiZWZvcmUgYW5vdGhlcgorCSAqIGNvbW1hbmQgY2FuIGJlIHNlbnQuLi4gIGJ1dCBpZiB3ZSB3YWl0IG1vcmUgdGhhbiAzIHNlY29uZHMKKwkgKiB0aGVuIHRoZXJlIGlzIGEgcHJvYmxlbS4KKwkgKi8KKworCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQlwcml2LT53YWl0X2NvbW1hbmRfcXVldWUsICEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0NNRF9BQ1RJVkUpLAorCQlIT1NUX0NPTVBMRVRFX1RJTUVPVVQpOworCisJaWYgKGVyciA9PSAwKSB7CisJCUlQV19ERUJVR19JTkZPKCJDb21tYW5kIGNvbXBsZXRpb24gZmFpbGVkIG91dCBhZnRlciAlZG1zLlxuIiwKKwkJCSAgICAgICBIT1NUX0NPTVBMRVRFX1RJTUVPVVQgLyAoSFogLyAxMDApKTsKKwkJcHJpdi0+ZmF0YWxfZXJyb3IgPSBJUFcyMTAwX0VSUl9NU0dfVElNRU9VVDsKKwkJcHJpdi0+c3RhdHVzICY9IH5TVEFUVVNfQ01EX0FDVElWRTsKKwkJc2NoZWR1bGVfcmVzZXQocHJpdik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChwcml2LT5mYXRhbF9lcnJvcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6ICVzOiBmaXJtd2FyZSBmYXRhbCBlcnJvclxuIiwKKwkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiAhISEhISBIQUNLIFRFU1QgISEhISEKKwkgKiBXaGVuIGxvdHMgb2YgZGVidWcgdHJhY2Ugc3RhdGVtZW50cyBhcmUgZW5hYmxlZCwgdGhlIGRyaXZlcgorCSAqIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGFzIG1hbnkgZmlybXdhcmUgcmVzdGFydCBjeWNsZXMuLi4KKwkgKgorCSAqIEFzIGEgdGVzdCwgd2UncmUgc3RpY2tpbmcgaW4gYSAxLzEwMHMgZGVsYXkgaGVyZSAqLworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KEhaIC8gMTAwKTsKKworCXJldHVybiAwOworCisgZmFpbF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKKworLyoKKyAqIFZlcmlmeSB0aGUgdmFsdWVzIGFuZCBkYXRhIGFjY2VzcyBvZiB0aGUgaGFyZHdhcmUKKyAqIE5vIGxvY2tzIG5lZWRlZCBvciB1c2VkLiAgTm8gZnVuY3Rpb25zIGNhbGxlZC4KKyAqLworc3RhdGljIGludCBpcHcyMTAwX3ZlcmlmeShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCXUzMiBkYXRhMSwgZGF0YTI7CisJdTMyIGFkZHJlc3M7CisKKwl1MzIgdmFsMSA9IDB4NzY1NDMyMTA7CisJdTMyIHZhbDIgPSAweEZFRENCQTk4OworCisJLyogRG9tYWluIDAgY2hlY2sgLSBhbGwgdmFsdWVzIHNob3VsZCBiZSBET0FfREVCVUcgKi8KKwlmb3IgKGFkZHJlc3MgPSBJUFdfUkVHX0RPQV9ERUJVR19BUkVBX1NUQVJUOworCSAgICAgYWRkcmVzcyA8IElQV19SRUdfRE9BX0RFQlVHX0FSRUFfRU5EOworCSAgICAgYWRkcmVzcyArPSBzaXplb2YodTMyKSkgeworCQlyZWFkX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIGFkZHJlc3MsICZkYXRhMSk7CisJCWlmIChkYXRhMSAhPSBJUFdfREFUQV9ET0FfREVCVUdfVkFMVUUpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBEb21haW4gMSBjaGVjayAtIHVzZSBhcmJpdHJhcnkgcmVhZC93cml0ZSBjb21wYXJlICAqLworCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCA1OyBhZGRyZXNzKyspIHsKKwkJLyogVGhlIG1lbW9yeSBhcmVhIGlzIG5vdCB1c2VkIG5vdyAqLworCQl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfUkVHX0RPTUFJTl8xX09GRlNFVCArIDB4MzIsCisJCQkgICAgICAgdmFsMSk7CisJCXdyaXRlX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfRE9NQUlOXzFfT0ZGU0VUICsgMHgzNiwKKwkJCSAgICAgICB2YWwyKTsKKwkJcmVhZF9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfUkVHX0RPTUFJTl8xX09GRlNFVCArIDB4MzIsCisJCQkgICAgICAmZGF0YTEpOworCQlyZWFkX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfRE9NQUlOXzFfT0ZGU0VUICsgMHgzNiwKKwkJCSAgICAgICZkYXRhMik7CisJCWlmICh2YWwxID09IGRhdGExICYmIHZhbDIgPT0gZGF0YTIpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqCisgKiBMb29wIHVudGlsIHRoZSBDQVJEX0RJU0FCTEVEIGJpdCBpcyB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUKKyAqIHN1cHBsaWVkIHBhcmFtZXRlcgorICoKKyAqIFRPRE86IFNlZSBpZiBpdCB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCB0byBkbyBhIHdhaXQvd2FrZQorICogICAgICAgY3ljbGUgYW5kIGhhdmUgdGhlIGNvbXBsZXRpb24gZXZlbnQgdHJpZ2dlciB0aGUgd2FrZXVwCisgKgorICovCisjZGVmaW5lIElQV19DQVJEX0RJU0FCTEVfQ09NUExFVEVfV0FJVAkJICAgIDEwMAkvLyAxMDAgbWlsbGkKK3N0YXRpYyBpbnQgaXB3MjEwMF93YWl0X2Zvcl9jYXJkX3N0YXRlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGludCBzdGF0ZSkKK3sKKwlpbnQgaTsKKwl1MzIgY2FyZF9zdGF0ZTsKKwl1MzIgbGVuID0gc2l6ZW9mKGNhcmRfc3RhdGUpOworCWludCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDw9IElQV19DQVJEX0RJU0FCTEVfQ09NUExFVEVfV0FJVCAqIDEwMDA7IGkgKz0gNTApIHsKKwkJZXJyID0gaXB3MjEwMF9nZXRfb3JkaW5hbChwcml2LCBJUFdfT1JEX0NBUkRfRElTQUJMRUQsCisJCQkJCSAgJmNhcmRfc3RhdGUsICZsZW4pOworCQlpZiAoZXJyKSB7CisJCQlJUFdfREVCVUdfSU5GTygiUXVlcnkgb2YgQ0FSRF9ESVNBQkxFRCBvcmRpbmFsICIKKwkJCQkgICAgICAgImZhaWxlZC5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBXZSdsbCBicmVhayBvdXQgaWYgZWl0aGVyIHRoZSBIVyBzdGF0ZSBzYXlzIGl0IGlzCisJCSAqIGluIHRoZSBzdGF0ZSB3ZSB3YW50LCBvciBpZiBIT1NUX0NPTVBMRVRFIGNvbW1hbmQKKwkJICogZmluaXNoZXMgKi8KKwkJaWYgKChjYXJkX3N0YXRlID09IHN0YXRlKSB8fAorCQkgICAgKChwcml2LT5zdGF0dXMgJiBTVEFUVVNfRU5BQkxFRCkgPworCQkgICAgIElQV19IV19TVEFURV9FTkFCTEVEIDogSVBXX0hXX1NUQVRFX0RJU0FCTEVEKSA9PSBzdGF0ZSkgeworCQkJaWYgKHN0YXRlID09IElQV19IV19TVEFURV9FTkFCTEVEKQorCQkJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfRU5BQkxFRDsKKwkJCWVsc2UKKwkJCQlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19FTkFCTEVEOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXVkZWxheSg1MCk7CisJfQorCisJSVBXX0RFQlVHX0lORk8oImlwdzIxMDBfd2FpdF9mb3JfY2FyZF9zdGF0ZSB0byAlcyBzdGF0ZSB0aW1lZCBvdXRcbiIsCisJCSAgICAgICBzdGF0ZSA/ICJESVNBQkxFRCIgOiAiRU5BQkxFRCIpOworCXJldHVybiAtRUlPOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBQcm9jZWR1cmUgICA6ICAgc3dfcmVzZXRfYW5kX2Nsb2NrCisgICAgUHVycG9zZSAgICAgOiAgIEFzc2VydHMgcy93IHJlc2V0LCBhc3NlcnRzIGNsb2NrIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgIGFuZCB3YWl0cyBmb3IgY2xvY2sgc3RhYmlsaXphdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzd19yZXNldF9hbmRfY2xvY2soc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwlpbnQgaTsKKwl1MzIgcjsKKworCS8vIGFzc2VydCBzL3cgcmVzZXQKKwl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfUkVHX1JFU0VUX1JFRywKKwkJICAgICAgIElQV19BVVhfSE9TVF9SRVNFVF9SRUdfU1dfUkVTRVQpOworCisJLy8gd2FpdCBmb3IgY2xvY2sgc3RhYmlsaXphdGlvbgorCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKwkJdWRlbGF5KElQV19XQUlUX1JFU0VUX0FSQ19DT01QTEVURV9ERUxBWSk7CisKKwkJLy8gY2hlY2sgY2xvY2sgcmVhZHkgYml0CisJCXJlYWRfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwgSVBXX1JFR19SRVNFVF9SRUcsICZyKTsKKwkJaWYgKHIgJiBJUFdfQVVYX0hPU1RfUkVTRVRfUkVHX1BSSU5DRVRPTl9SRVNFVCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IDEwMDApCisJCXJldHVybiAtRUlPOwkvLyBUT0RPOiBiZXR0ZXIgZXJyb3IgdmFsdWUKKworCS8qIHNldCAiaW5pdGlhbGl6YXRpb24gY29tcGxldGUiIGJpdCB0byBtb3ZlIGFkYXB0ZXIgdG8KKwkgKiBEMCBzdGF0ZSAqLworCXdyaXRlX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfR1BfQ05UUkwsCisJCSAgICAgICBJUFdfQVVYX0hPU1RfR1BfQ05UUkxfQklUX0lOSVRfRE9ORSk7CisKKwkvKiB3YWl0IGZvciBjbG9jayBzdGFiaWxpemF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKwkJdWRlbGF5KElQV19XQUlUX0NMT0NLX1NUQUJJTElaQVRJT05fREVMQVkgKiA0KTsKKworCQkvKiBjaGVjayBjbG9jayByZWFkeSBiaXQgKi8KKwkJcmVhZF9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfUkVHX0dQX0NOVFJMLCAmcik7CisJCWlmIChyICYgSVBXX0FVWF9IT1NUX0dQX0NOVFJMX0JJVF9DTE9DS19SRUFEWSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IDEwMDAwKQorCQlyZXR1cm4gLUVJTzsJLyogVE9ETzogYmV0dGVyIGVycm9yIHZhbHVlICovCisKKwkvKiBzZXQgRDAgc3RhbmRieSBiaXQgKi8KKwlyZWFkX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfR1BfQ05UUkwsICZyKTsKKwl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfUkVHX0dQX0NOVFJMLAorCQkgICAgICAgciB8IElQV19BVVhfSE9TVF9HUF9DTlRSTF9CSVRfSE9TVF9BTExPV1NfU1RBTkRCWSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFByb2NlZHVyZSAgIDogICBpcHcyMTAwX2Rvd25sb2FkX2Zpcm13YXJlCisgICAgUHVycG9zZSAgICAgOiAgIEluaXRpYXplIGFkYXB0ZXIgYWZ0ZXIgcG93ZXIgb24uCisgICAgICAgICAgICAgICAgICAgIFRoZSBzZXF1ZW5jZSBpczoKKyAgICAgICAgICAgICAgICAgICAgMS4gYXNzZXJ0IHMvdyByZXNldCBmaXJzdCEKKyAgICAgICAgICAgICAgICAgICAgMi4gYXdha2UgY2xvY2tzICYgd2FpdCBmb3IgY2xvY2sgc3RhYmlsaXphdGlvbgorICAgICAgICAgICAgICAgICAgICAzLiBob2xkIEFSQyAoZG9uJ3QgYXNrIG1lIHdoeS4uLikKKyAgICAgICAgICAgICAgICAgICAgNC4gbG9hZCBEaW5vIHVjb2RlIGFuZCByZXNldC9jbG9jayBpbml0IGFnYWluCisgICAgICAgICAgICAgICAgICAgIDUuIHplcm8tb3V0IHNoYXJlZCBtZW0KKyAgICAgICAgICAgICAgICAgICAgNi4gZG93bmxvYWQgZi93CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgaXB3MjEwMF9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCXUzMiBhZGRyZXNzOworCWludCBlcnI7CisKKyNpZm5kZWYgQ09ORklHX1BNCisJLyogRmV0Y2ggdGhlIGZpcm13YXJlIGFuZCBtaWNyb2NvZGUgKi8KKwlzdHJ1Y3QgaXB3MjEwMF9mdyBpcHcyMTAwX2Zpcm13YXJlOworI2VuZGlmCisKKwlpZiAocHJpdi0+ZmF0YWxfZXJyb3IpIHsKKwkJSVBXX0RFQlVHX0VSUk9SKCIlczogaXB3MjEwMF9kb3dubG9hZF9maXJtd2FyZSBjYWxsZWQgYWZ0ZXIgIgorCQkgICAgICAgImZhdGFsIGVycm9yICVkLiAgSW50ZXJmYWNlIG11c3QgYmUgYnJvdWdodCBkb3duLlxuIiwKKwkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUsIHByaXYtPmZhdGFsX2Vycm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisjaWZkZWYgQ09ORklHX1BNCisJaWYgKCFpcHcyMTAwX2Zpcm13YXJlLnZlcnNpb24pIHsKKwkJZXJyID0gaXB3MjEwMF9nZXRfZmlybXdhcmUocHJpdiwgJmlwdzIxMDBfZmlybXdhcmUpOworCQlpZiAoZXJyKSB7CisJCQlJUFdfREVCVUdfRVJST1IoIiVzOiBpcHcyMTAwX2dldF9maXJtd2FyZSBmYWlsZWQ6ICVkXG4iLAorCQkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUsIGVycik7CisJCQlwcml2LT5mYXRhbF9lcnJvciA9IElQVzIxMDBfRVJSX0ZXX0xPQUQ7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisjZWxzZQorCWVyciA9IGlwdzIxMDBfZ2V0X2Zpcm13YXJlKHByaXYsICZpcHcyMTAwX2Zpcm13YXJlKTsKKwlpZiAoZXJyKSB7CisJCUlQV19ERUJVR19FUlJPUigiJXM6IGlwdzIxMDBfZ2V0X2Zpcm13YXJlIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lLCBlcnIpOworCQlwcml2LT5mYXRhbF9lcnJvciA9IElQVzIxMDBfRVJSX0ZXX0xPQUQ7CisJCWdvdG8gZmFpbDsKKwl9CisjZW5kaWYKKwlwcml2LT5maXJtd2FyZV92ZXJzaW9uID0gaXB3MjEwMF9maXJtd2FyZS52ZXJzaW9uOworCisJLyogcy93IHJlc2V0IGFuZCBjbG9jayBzdGFiaWxpemF0aW9uICovCisJZXJyID0gc3dfcmVzZXRfYW5kX2Nsb2NrKHByaXYpOworCWlmIChlcnIpIHsKKwkJSVBXX0RFQlVHX0VSUk9SKCIlczogc3dfcmVzZXRfYW5kX2Nsb2NrIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lLCBlcnIpOworCQlnb3RvIGZhaWw7CisJfQorCisJZXJyID0gaXB3MjEwMF92ZXJpZnkocHJpdik7CisJaWYgKGVycikgeworCQlJUFdfREVCVUdfRVJST1IoIiVzOiBpcHcyMTAwX3ZlcmlmeSBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSwgZXJyKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIEhvbGQgQVJDICovCisJd3JpdGVfbmljX2R3b3JkKHByaXYtPm5ldF9kZXYsCisJCQlJUFdfSU5URVJOQUxfUkVHSVNURVJfSEFMVF9BTkRfUkVTRVQsCisJCQkweDgwMDAwMDAwKTsKKworCS8qIGFsbG93IEFSQyB0byBydW4gKi8KKwl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfUkVHX1JFU0VUX1JFRywgMCk7CisKKwkvKiBsb2FkIG1pY3JvY29kZSAqLworCWVyciA9IGlwdzIxMDBfdWNvZGVfZG93bmxvYWQocHJpdiwgJmlwdzIxMDBfZmlybXdhcmUpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6ICVzOiBFcnJvciBsb2FkaW5nIG1pY3JvY29kZTogJWRcbiIsCisJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lLCBlcnIpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogcmVsZWFzZSBBUkMgKi8KKwl3cml0ZV9uaWNfZHdvcmQocHJpdi0+bmV0X2RldiwKKwkJCUlQV19JTlRFUk5BTF9SRUdJU1RFUl9IQUxUX0FORF9SRVNFVCwKKwkJCTB4MDAwMDAwMDApOworCisJLyogcy93IHJlc2V0IGFuZCBjbG9jayBzdGFiaWxpemF0aW9uIChhZ2FpbiEhISkgKi8KKwllcnIgPSBzd19yZXNldF9hbmRfY2xvY2socHJpdik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXM6IHN3X3Jlc2V0X2FuZF9jbG9jayBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSwgZXJyKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIGxvYWQgZi93ICovCisJZXJyID0gaXB3MjEwMF9md19kb3dubG9hZChwcml2LCAmaXB3MjEwMF9maXJtd2FyZSk7CisJaWYgKGVycikgeworCQlJUFdfREVCVUdfRVJST1IoIiVzOiBFcnJvciBsb2FkaW5nIGZpcm13YXJlOiAlZFxuIiwKKwkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUsIGVycik7CisJCWdvdG8gZmFpbDsKKwl9CisKKyNpZm5kZWYgQ09ORklHX1BNCisJLyoKKwkgKiBXaGVuIHRoZSAucmVzdW1lIG1ldGhvZCBvZiB0aGUgZHJpdmVyIGlzIGNhbGxlZCwgdGhlIG90aGVyCisJICogcGFydCBvZiB0aGUgc3lzdGVtLCBpLmUuIHRoZSBpZGUgZHJpdmVyIGNvdWxkIHN0aWxsIHN0YXkgaW4KKwkgKiB0aGUgc3VzcGVuZCBzdGFnZS4gVGhpcyBwcmV2ZW50cyB1cyBmcm9tIGxvYWRpbmcgdGhlIGZpcm13YXJlCisJICogZnJvbSB0aGUgZGlzay4gIC0tWVoKKwkgKi8KKworCS8qIGZyZWUgYW55IHN0b3JhZ2UgYWxsb2NhdGVkIGZvciBmaXJtd2FyZSBpbWFnZSAqLworCWlwdzIxMDBfcmVsZWFzZV9maXJtd2FyZShwcml2LCAmaXB3MjEwMF9maXJtd2FyZSk7CisjZW5kaWYKKworCS8qIHplcm8gb3V0IERvbWFpbiAxIGFyZWEgaW5kaXJlY3RseSAoU2kgcmVxdWlyZW1lbnQpICovCisJZm9yIChhZGRyZXNzID0gSVBXX0hPU1RfRldfU0hBUkVEX0FSRUEwOworCSAgICAgYWRkcmVzcyA8IElQV19IT1NUX0ZXX1NIQVJFRF9BUkVBMF9FTkQ7IGFkZHJlc3MgKz0gNCkKKwkJd3JpdGVfbmljX2R3b3JkKHByaXYtPm5ldF9kZXYsIGFkZHJlc3MsIDApOworCWZvciAoYWRkcmVzcyA9IElQV19IT1NUX0ZXX1NIQVJFRF9BUkVBMTsKKwkgICAgIGFkZHJlc3MgPCBJUFdfSE9TVF9GV19TSEFSRURfQVJFQTFfRU5EOyBhZGRyZXNzICs9IDQpCisJCXdyaXRlX25pY19kd29yZChwcml2LT5uZXRfZGV2LCBhZGRyZXNzLCAwKTsKKwlmb3IgKGFkZHJlc3MgPSBJUFdfSE9TVF9GV19TSEFSRURfQVJFQTI7CisJICAgICBhZGRyZXNzIDwgSVBXX0hPU1RfRldfU0hBUkVEX0FSRUEyX0VORDsgYWRkcmVzcyArPSA0KQorCQl3cml0ZV9uaWNfZHdvcmQocHJpdi0+bmV0X2RldiwgYWRkcmVzcywgMCk7CisJZm9yIChhZGRyZXNzID0gSVBXX0hPU1RfRldfU0hBUkVEX0FSRUEzOworCSAgICAgYWRkcmVzcyA8IElQV19IT1NUX0ZXX1NIQVJFRF9BUkVBM19FTkQ7IGFkZHJlc3MgKz0gNCkKKwkJd3JpdGVfbmljX2R3b3JkKHByaXYtPm5ldF9kZXYsIGFkZHJlc3MsIDApOworCWZvciAoYWRkcmVzcyA9IElQV19IT1NUX0ZXX0lOVEVSUlVQVF9BUkVBOworCSAgICAgYWRkcmVzcyA8IElQV19IT1NUX0ZXX0lOVEVSUlVQVF9BUkVBX0VORDsgYWRkcmVzcyArPSA0KQorCQl3cml0ZV9uaWNfZHdvcmQocHJpdi0+bmV0X2RldiwgYWRkcmVzcywgMCk7CisKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJaXB3MjEwMF9yZWxlYXNlX2Zpcm13YXJlKHByaXYsICZpcHcyMTAwX2Zpcm13YXJlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXB3MjEwMF9lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfSU5UX0VOQUJMRUQpCisJCXJldHVybjsKKwlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX0lOVF9FTkFCTEVEOworCXdyaXRlX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfSU5UQV9NQVNLLCBJUFdfSU5URVJSVVBUX01BU0spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXB3MjEwMF9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfSU5UX0VOQUJMRUQpKQorCQlyZXR1cm47CisJcHJpdi0+c3RhdHVzICY9IH5TVEFUVVNfSU5UX0VOQUJMRUQ7CisJd3JpdGVfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwgSVBXX1JFR19JTlRBX01BU0ssIDB4MCk7Cit9CisKKworc3RhdGljIHZvaWQgaXB3MjEwMF9pbml0aWFsaXplX29yZGluYWxzKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGlwdzIxMDBfb3JkaW5hbHMgKm9yZCA9ICZwcml2LT5vcmRpbmFsczsKKworCUlQV19ERUJVR19JTkZPKCJlbnRlclxuIik7CisKKwlyZWFkX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19NRU1fSE9TVF9TSEFSRURfT1JESU5BTFNfVEFCTEVfMSwKKwkJICAgICAgJm9yZC0+dGFibGUxX2FkZHIpOworCisJcmVhZF9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfTUVNX0hPU1RfU0hBUkVEX09SRElOQUxTX1RBQkxFXzIsCisJCSAgICAgICZvcmQtPnRhYmxlMl9hZGRyKTsKKworCXJlYWRfbmljX2R3b3JkKHByaXYtPm5ldF9kZXYsIG9yZC0+dGFibGUxX2FkZHIsICZvcmQtPnRhYmxlMV9zaXplKTsKKwlyZWFkX25pY19kd29yZChwcml2LT5uZXRfZGV2LCBvcmQtPnRhYmxlMl9hZGRyLCAmb3JkLT50YWJsZTJfc2l6ZSk7CisKKwlvcmQtPnRhYmxlMl9zaXplICY9IDB4MDAwMEZGRkY7CisKKwlJUFdfREVCVUdfSU5GTygidGFibGUgMSBzaXplOiAlZFxuIiwgb3JkLT50YWJsZTFfc2l6ZSk7CisJSVBXX0RFQlVHX0lORk8oInRhYmxlIDIgc2l6ZTogJWRcbiIsIG9yZC0+dGFibGUyX3NpemUpOworCUlQV19ERUJVR19JTkZPKCJleGl0XG4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwdzIxMDBfaHdfc2V0X2dwaW8oc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwl1MzIgcmVnID0gMDsKKwkvKgorCSAqIFNldCBHUElPIDMgd3JpdGFibGUgYnkgRlc7IEdQSU8gMSB3cml0YWJsZQorCSAqIGJ5IGRyaXZlciBhbmQgZW5hYmxlIGNsb2NrCisJICovCisJcmVnID0gKElQV19CSVRfR1BJT19HUElPM19NQVNLIHwgSVBXX0JJVF9HUElPX0dQSU8xX0VOQUJMRSB8CisJICAgICAgIElQV19CSVRfR1BJT19MRURfT0ZGKTsKKwl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfUkVHX0dQSU8sIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJmX2tpbGxfYWN0aXZlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisjZGVmaW5lIE1BWF9SRl9LSUxMX0NIRUNLUyA1CisjZGVmaW5lIFJGX0tJTExfQ0hFQ0tfREVMQVkgNDAKKworCXVuc2lnbmVkIHNob3J0IHZhbHVlID0gMDsKKwl1MzIgcmVnID0gMDsKKwlpbnQgaTsKKworCWlmICghKHByaXYtPmh3X2ZlYXR1cmVzICYgSFdfRkVBVFVSRV9SRktJTEwpKSB7CisJCXByaXYtPnN0YXR1cyAmPSB+U1RBVFVTX1JGX0tJTExfSFc7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkZfS0lMTF9DSEVDS1M7IGkrKykgeworCQl1ZGVsYXkoUkZfS0lMTF9DSEVDS19ERUxBWSk7CisJCXJlYWRfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwgSVBXX1JFR19HUElPLCAmcmVnKTsKKwkJdmFsdWUgPSAodmFsdWUgPDwgMSkgfCAoKHJlZyAmIElQV19CSVRfR1BJT19SRl9LSUxMKSA/IDAgOiAxKTsKKwl9CisKKwlpZiAodmFsdWUgPT0gMCkKKwkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19SRl9LSUxMX0hXOworCWVsc2UKKwkJcHJpdi0+c3RhdHVzICY9IH5TVEFUVVNfUkZfS0lMTF9IVzsKKworCXJldHVybiAodmFsdWUgPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF9nZXRfaHdfZmVhdHVyZXMoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwl1MzIgYWRkciwgbGVuOworCXUzMiB2YWw7CisKKwkvKgorCSAqIEVFUFJPTV9TUkFNX0RCX1NUQVJUX0FERFJFU1MgdXNpbmcgb3JkaW5hbCBpbiBvcmRpbmFsIHRhYmxlIDEKKwkgKi8KKwlsZW4gPSBzaXplb2YoYWRkcik7CisJaWYgKGlwdzIxMDBfZ2V0X29yZGluYWwoCisJCSAgICBwcml2LCBJUFdfT1JEX0VFUFJPTV9TUkFNX0RCX0JMT0NLX1NUQVJUX0FERFJFU1MsCisJCSAgICAmYWRkciwgJmxlbikpIHsKKwkJSVBXX0RFQlVHX0lORk8oImZhaWxlZCBxdWVyeWluZyBvcmRpbmFscyBhdCBsaW5lICVkXG4iLAorCQkgICAgICAgX19MSU5FX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlJUFdfREVCVUdfSU5GTygiRUVQUk9NIGFkZHJlc3M6ICUwOFhcbiIsIGFkZHIpOworCisJLyoKKwkgKiBFRVBST00gdmVyc2lvbiBpcyB0aGUgYnl0ZSBhdCBvZmZzZXQgMHhmZCBpbiBmaXJtd2FyZQorCSAqIFdlIHJlYWQgNCBieXRlcywgdGhlbiBzaGlmdCBvdXQgdGhlIGJ5dGUgd2UgYWN0dWFsbHkgd2FudCAqLworCXJlYWRfbmljX2R3b3JkKHByaXYtPm5ldF9kZXYsIGFkZHIgKyAweEZDLCAmdmFsKTsKKwlwcml2LT5lZXByb21fdmVyc2lvbiA9ICh2YWwgPj4gMjQpICYgMHhGRjsKKwlJUFdfREVCVUdfSU5GTygiRUVQUk9NIHZlcnNpb246ICVkXG4iLCBwcml2LT5lZXByb21fdmVyc2lvbik7CisKKyAgICAgICAgLyoKKwkgKiAgSFcgUkYgS2lsbCBlbmFibGUgaXMgYml0IDAgaW4gYnl0ZSBhdCBvZmZzZXQgMHgyMSBpbiBmaXJtd2FyZQorCSAqCisJICogIG5vdGljZSB0aGF0IHRoZSBFRVBST00gYml0IGlzIHJldmVyc2UgcG9sYXJpdHksIGkuZS4KKwkgKiAgICAgYml0ID0gMCAgc2lnbmlmaWVzIEhXIFJGIGtpbGwgc3dpdGNoIGlzIHN1cHBvcnRlZAorCSAqICAgICBiaXQgPSAxICBzaWduaWZpZXMgSFcgUkYga2lsbCBzd2l0Y2ggaXMgTk9UIHN1cHBvcnRlZAorCSAqLworCXJlYWRfbmljX2R3b3JkKHByaXYtPm5ldF9kZXYsIGFkZHIgKyAweDIwLCAmdmFsKTsKKwlpZiAoISgodmFsID4+IDI0KSAmIDB4MDEpKQorCQlwcml2LT5od19mZWF0dXJlcyB8PSBIV19GRUFUVVJFX1JGS0lMTDsKKworCUlQV19ERUJVR19JTkZPKCJIVyBSRiBLaWxsOiAlc3N1cHBvcnRlZC5cbiIsCisJCQkgICAocHJpdi0+aHdfZmVhdHVyZXMgJiBIV19GRUFUVVJFX1JGS0lMTCkgPworCQkJICAgIiIgOiAibm90ICIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdGFydCBmaXJtd2FyZSBleGVjdXRpb24gYWZ0ZXIgcG93ZXIgb24gYW5kIGludGlhbGl6YXRpb24KKyAqIFRoZSBzZXF1ZW5jZSBpczoKKyAqICAxLiBSZWxlYXNlIEFSQworICogIDIuIFdhaXQgZm9yIGYvdyBpbml0aWFsaXphdGlvbiBjb21wbGV0ZXM7CisgKi8KK3N0YXRpYyBpbnQgaXB3MjEwMF9zdGFydF9hZGFwdGVyKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJaW50IGk7CisJdTMyIGludGEsIGludGFfbWFzaywgZ3BpbzsKKworCUlQV19ERUJVR19JTkZPKCJlbnRlclxuIik7CisKKwlpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JVTk5JTkcpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBodyAtIGRyaXZlIGFkYXB0ZXIgdG8gRE8gc3RhdGUgYnkgc2V0dGluZworCSAqIGluaXRfZG9uZSBiaXQuIFdhaXQgZm9yIGNsa19yZWFkeSBiaXQgYW5kIERvd25sb2FkCisJICogZncgJiBkaW5vIHVjb2RlCisJICovCisJaWYgKGlwdzIxMDBfZG93bmxvYWRfZmlybXdhcmUocHJpdikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6ICVzOiBGYWlsZWQgdG8gcG93ZXIgb24gdGhlIGFkYXB0ZXIuXG4iLAorCQkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIENsZWFyIHRoZSBUeCwgUnggYW5kIE1zZyBxdWV1ZXMgYW5kIHRoZSByL3cgaW5kZXhlcworCSAqIGluIHRoZSBmaXJtd2FyZSBSQkQgYW5kIFRCRCByaW5nIHF1ZXVlICovCisJaXB3MjEwMF9xdWV1ZXNfaW5pdGlhbGl6ZShwcml2KTsKKworCWlwdzIxMDBfaHdfc2V0X2dwaW8ocHJpdik7CisKKwkvKiBUT0RPIC0tIExvb2sgYXQgZGlzYWJsaW5nIGludGVycnVwdHMgaGVyZSB0byBtYWtlIHN1cmUgbm9uZQorCSAqIGdldCBmaXJlZCBkdXJpbmcgRlcgaW5pdGlhbGl6YXRpb24gKi8KKworCS8qIFJlbGVhc2UgQVJDIC0gY2xlYXIgcmVzZXQgYml0ICovCisJd3JpdGVfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwgSVBXX1JFR19SRVNFVF9SRUcsIDApOworCisJLyogd2FpdCBmb3IgZi93IGludGlhbGl6YXRpb24gY29tcGxldGUgKi8KKwlJUFdfREVCVUdfRlcoIldhaXRpbmcgZm9yIGYvdyBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZS4uLlxuIik7CisJaSA9IDUwMDA7CisJZG8geworICAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCg0MCAqIEhaIC8gMTAwMCk7CisJCS8qIFRvZG8uLi4gd2FpdCBmb3Igc3luYyBjb21tYW5kIC4uLiAqLworCisJCXJlYWRfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwgSVBXX1JFR19JTlRBLCAmaW50YSk7CisKKwkJLyogY2hlY2sgImluaXQgZG9uZSIgYml0ICovCisJCWlmIChpbnRhICYgSVBXMjEwMF9JTlRBX0ZXX0lOSVRfRE9ORSkgeworCQkJLyogcmVzZXQgImluaXQgZG9uZSIgYml0ICovCisJCQl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfUkVHX0lOVEEsCisJCQkJICAgICAgIElQVzIxMDBfSU5UQV9GV19JTklUX0RPTkUpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBjaGVjayBlcnJvciBjb25kaXRpb25zIDogd2UgY2hlY2sgdGhlc2UgYWZ0ZXIgdGhlIGZpcm13YXJlCisJCSAqIGNoZWNrIHNvIHRoYXQgaWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorCQkgKiB3aWxsIHNlZSBpdCBhbmQgdGhlIGFkYXB0ZXIgd2lsbCBiZSByZXNldCAqLworCQlpZiAoaW50YSAmCisJCSAgICAoSVBXMjEwMF9JTlRBX0ZBVEFMX0VSUk9SIHwgSVBXMjEwMF9JTlRBX1BBUklUWV9FUlJPUikpIHsKKwkJCS8qIGNsZWFyIGVycm9yIGNvbmRpdGlvbnMgKi8KKwkJCXdyaXRlX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfSU5UQSwKKwkJCQkgICAgICAgSVBXMjEwMF9JTlRBX0ZBVEFMX0VSUk9SIHwKKwkJCQkgICAgICAgSVBXMjEwMF9JTlRBX1BBUklUWV9FUlJPUik7CisJCX0KKwl9IHdoaWxlIChpLS0pOworCisJLyogQ2xlYXIgb3V0IGFueSBwZW5kaW5nIElOVEFzIHNpbmNlIHdlIGFyZW4ndCBzdXBwb3NlZCB0byBoYXZlCisJICogaW50ZXJydXB0cyBlbmFibGVkIGF0IHRoaXMgcG9pbnQuLi4gKi8KKwlyZWFkX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfSU5UQSwgJmludGEpOworCXJlYWRfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwgSVBXX1JFR19JTlRBX01BU0ssICZpbnRhX21hc2spOworCWludGEgJj0gSVBXX0lOVEVSUlVQVF9NQVNLOworCS8qIENsZWFyIG91dCBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJaWYgKGludGEgJiBpbnRhX21hc2spCisJCXdyaXRlX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfSU5UQSwgaW50YSk7CisKKwlJUFdfREVCVUdfRlcoImYvdyBpbml0aWFsaXphdGlvbiBjb21wbGV0ZTogJXNcbiIsCisJCSAgICAgaSA/ICJTVUNDRVNTIiA6ICJGQUlMRUQiKTsKKworCWlmICghaSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6ICVzOiBGaXJtd2FyZSBkaWQgbm90IGluaXRpYWxpemUuXG4iLAorCQkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGFsbG93IGZpcm13YXJlIHRvIHdyaXRlIHRvIEdQSU8xICYgR1BJTzMgKi8KKwlyZWFkX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfR1BJTywgJmdwaW8pOworCisJZ3BpbyB8PSAoSVBXX0JJVF9HUElPX0dQSU8xX01BU0sgfCBJUFdfQklUX0dQSU9fR1BJTzNfTUFTSyk7CisKKwl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfUkVHX0dQSU8sIGdwaW8pOworCisJLyogUmVhZHkgdG8gcmVjZWl2ZSBjb21tYW5kcyAqLworCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfUlVOTklORzsKKworCS8qIFRoZSBhZGFwdGVyIGhhcyBiZWVuIHJlc2V0OyB3ZSBhcmUgbm90IGFzc29jaWF0ZWQgKi8KKwlwcml2LT5zdGF0dXMgJj0gfihTVEFUVVNfQVNTT0NJQVRJTkcgfCBTVEFUVVNfQVNTT0NJQVRFRCk7CisKKwlJUFdfREVCVUdfSU5GTygiZXhpdFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwdzIxMDBfcmVzZXRfZmF0YWxlcnJvcihzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCWlmICghcHJpdi0+ZmF0YWxfZXJyb3IpCisJCXJldHVybjsKKworCXByaXYtPmZhdGFsX2Vycm9yc1twcml2LT5mYXRhbF9pbmRleCsrXSA9IHByaXYtPmZhdGFsX2Vycm9yOworCXByaXYtPmZhdGFsX2luZGV4ICU9IElQVzIxMDBfRVJST1JfUVVFVUU7CisJcHJpdi0+ZmF0YWxfZXJyb3IgPSAwOworfQorCisKKy8qIE5PVEU6IE91ciBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgKi8KK3N0YXRpYyBpbnQgaXB3MjEwMF9wb3dlcl9jeWNsZV9hZGFwdGVyKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJdTMyIHJlZzsKKwlpbnQgaTsKKworCUlQV19ERUJVR19JTkZPKCJQb3dlciBjeWNsaW5nIHRoZSBoYXJkd2FyZS5cbiIpOworCisJaXB3MjEwMF9od19zZXRfZ3Bpbyhwcml2KTsKKworCS8qIFN0ZXAgMS4gU3RvcCBNYXN0ZXIgQXNzZXJ0ICovCisJd3JpdGVfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwgSVBXX1JFR19SRVNFVF9SRUcsCisJCSAgICAgICBJUFdfQVVYX0hPU1RfUkVTRVRfUkVHX1NUT1BfTUFTVEVSKTsKKworCS8qIFN0ZXAgMi4gV2FpdCBmb3Igc3RvcCBNYXN0ZXIgQXNzZXJ0CisJICogICAgICAgICAobm90IG1vcmUgdGhlbiA1MHVzLCBvdGhlcndpc2UgcmV0IGVycm9yICovCisJaSA9IDU7CisJZG8geworCQl1ZGVsYXkoSVBXX1dBSVRfUkVTRVRfTUFTVEVSX0FTU0VSVF9DT01QTEVURV9ERUxBWSk7CisJCXJlYWRfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwgSVBXX1JFR19SRVNFVF9SRUcsICZyZWcpOworCisJCWlmIChyZWcgJiBJUFdfQVVYX0hPU1RfUkVTRVRfUkVHX01BU1RFUl9ESVNBQkxFRCkKKwkJCWJyZWFrOworCX0gIHdoaWxlKGktLSk7CisKKwlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19SRVNFVF9QRU5ESU5HOworCisJaWYgKCFpKSB7CisJCUlQV19ERUJVR19JTkZPKCJleGl0IC0gd2FpdGVkIHRvbyBsb25nIGZvciBtYXN0ZXIgYXNzZXJ0IHN0b3BcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfUkVHX1JFU0VUX1JFRywKKwkJICAgICAgIElQV19BVVhfSE9TVF9SRVNFVF9SRUdfU1dfUkVTRVQpOworCisKKwkvKiBSZXNldCBhbnkgZmF0YWxfZXJyb3IgY29uZGl0aW9ucyAqLworCWlwdzIxMDBfcmVzZXRfZmF0YWxlcnJvcihwcml2KTsKKworCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBhZGFwdGVyIGlzIG5vdyBzdG9wcGVkIGFuZCBkaXNhYmxlZCAqLworCXByaXYtPnN0YXR1cyAmPSB+KFNUQVRVU19SVU5OSU5HIHwgU1RBVFVTX0FTU09DSUFUSU5HIHwKKwkJCSAgU1RBVFVTX0FTU09DSUFURUQgfCBTVEFUVVNfRU5BQkxFRCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNlbmQgdGhlIENBUkRfRElTQUJMRV9QSFlfT0ZGIGNvbWFtbmQgdG8gdGhlIGNhcmQgdG8gZGlzYWJsZSBpdAorICoKKyAqIEFmdGVyIGRpc2FibGluZywgaWYgdGhlIGNhcmQgd2FzIGFzc29jaWF0ZWQsIGEgU1RBVFVTX0FTU05fTE9TVCB3aWxsIGJlIHNlbnQuCisgKgorICogU1RBVFVTX0NBUkRfRElTQUJMRV9OT1RJRklDQVRJT04gd2lsbCBiZSBzZW50IHJlZ2FyZGxlc3Mgb2YKKyAqIGlmIFNUQVRVU19BU1NOX0xPU1QgaXMgc2VudC4KKyAqLworc3RhdGljIGludCBpcHcyMTAwX2h3X3BoeV9vZmYoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKworI2RlZmluZSBIV19QSFlfT0ZGX0xPT1BfREVMQVkgKEhaIC8gNTAwMCkKKworCXN0cnVjdCBob3N0X2NvbW1hbmQgY21kID0geworCQkuaG9zdF9jb21tYW5kID0gQ0FSRF9ESVNBQkxFX1BIWV9PRkYsCisJCS5ob3N0X2NvbW1hbmRfc2VxdWVuY2UgPSAwLAorCQkuaG9zdF9jb21tYW5kX2xlbmd0aCA9IDAsCisJfTsKKwlpbnQgZXJyLCBpOworCXUzMiB2YWwxLCB2YWwyOworCisJSVBXX0RFQlVHX0hDKCJDQVJEX0RJU0FCTEVfUEhZX09GRlxuIik7CisKKwkvKiBUdXJuIG9mZiB0aGUgcmFkaW8gKi8KKwllcnIgPSBpcHcyMTAwX2h3X3NlbmRfY29tbWFuZChwcml2LCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8IDI1MDA7IGkrKykgeworCQlyZWFkX25pY19kd29yZChwcml2LT5uZXRfZGV2LCBJUFcyMTAwX0NPTlRST0xfUkVHLCAmdmFsMSk7CisJCXJlYWRfbmljX2R3b3JkKHByaXYtPm5ldF9kZXYsIElQVzIxMDBfQ09NTUFORCwgJnZhbDIpOworCisJCWlmICgodmFsMSAmIElQVzIxMDBfQ09OVFJPTF9QSFlfT0ZGKSAmJgorCQkgICAgKHZhbDIgJiBJUFcyMTAwX0NPTU1BTkRfUEhZX09GRikpCisJCQlyZXR1cm4gMDsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFdfUEhZX09GRl9MT09QX0RFTEFZKTsKKwl9CisKKwlyZXR1cm4gLUVJTzsKK30KKworCitzdGF0aWMgaW50IGlwdzIxMDBfZW5hYmxlX2FkYXB0ZXIoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgaG9zdF9jb21tYW5kIGNtZCA9IHsKKwkJLmhvc3RfY29tbWFuZCA9IEhPU1RfQ09NUExFVEUsCisJCS5ob3N0X2NvbW1hbmRfc2VxdWVuY2UgPSAwLAorCQkuaG9zdF9jb21tYW5kX2xlbmd0aCA9IDAKKwl9OworCWludCBlcnIgPSAwOworCisJSVBXX0RFQlVHX0hDKCJIT1NUX0NPTVBMRVRFXG4iKTsKKworCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfRU5BQkxFRCkKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT5hZGFwdGVyX3NlbSk7CisKKwlpZiAocmZfa2lsbF9hY3RpdmUocHJpdikpIHsKKwkJSVBXX0RFQlVHX0hDKCJDb21tYW5kIGFib3J0ZWQgZHVlIHRvIFJGIGtpbGwgYWN0aXZlLlxuIik7CisJCWdvdG8gZmFpbF91cDsKKwl9CisKKwllcnIgPSBpcHcyMTAwX2h3X3NlbmRfY29tbWFuZChwcml2LCAmY21kKTsKKwlpZiAoZXJyKSB7CisJCUlQV19ERUJVR19JTkZPKCJGYWlsZWQgdG8gc2VuZCBIT1NUX0NPTVBMRVRFIGNvbW1hbmRcbiIpOworCQlnb3RvIGZhaWxfdXA7CisJfQorCisJZXJyID0gaXB3MjEwMF93YWl0X2Zvcl9jYXJkX3N0YXRlKHByaXYsIElQV19IV19TVEFURV9FTkFCTEVEKTsKKwlpZiAoZXJyKSB7CisJCUlQV19ERUJVR19JTkZPKAorCQkgICAgICAgIiVzOiBjYXJkIG5vdCByZXNwb25kaW5nIHRvIGluaXQgY29tbWFuZC5cbiIsCisJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lKTsKKwkJZ290byBmYWlsX3VwOworCX0KKworCWlmIChwcml2LT5zdG9wX2hhbmdfY2hlY2spIHsKKwkJcHJpdi0+c3RvcF9oYW5nX2NoZWNrID0gMDsKKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPmhhbmdfY2hlY2ssIEhaIC8gMik7CisJfQorCitmYWlsX3VwOgorCXVwKCZwcml2LT5hZGFwdGVyX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpcHcyMTAwX2h3X3N0b3BfYWRhcHRlcihzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworI2RlZmluZSBIV19QT1dFUl9ET1dOX0RFTEFZIChIWiAvIDEwKQorCisJc3RydWN0IGhvc3RfY29tbWFuZCBjbWQgPSB7CisJCS5ob3N0X2NvbW1hbmQgPSBIT1NUX1BSRV9QT1dFUl9ET1dOLAorCQkuaG9zdF9jb21tYW5kX3NlcXVlbmNlID0gMCwKKwkJLmhvc3RfY29tbWFuZF9sZW5ndGggPSAwLAorCX07CisJaW50IGVyciwgaTsKKwl1MzIgcmVnOworCisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JVTk5JTkcpKQorCQlyZXR1cm4gMDsKKworCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfU1RPUFBJTkc7CisKKwkvKiBXZSBjYW4gb25seSBzaHV0IGRvd24gdGhlIGNhcmQgaWYgdGhlIGZpcm13YXJlIGlzIG9wZXJhdGlvbmFsLiAgU28sCisJICogaWYgd2UgaGF2ZW4ndCByZXNldCBzaW5jZSBhIGZhdGFsX2Vycm9yLCB0aGVuIHdlIGNhbiBub3Qgc2VuZCB0aGUKKwkgKiBzaHV0ZG93biBjb21tYW5kcy4gKi8KKwlpZiAoIXByaXYtPmZhdGFsX2Vycm9yKSB7CisJCS8qIEZpcnN0LCBtYWtlIHN1cmUgdGhlIGFkYXB0ZXIgaXMgZW5hYmxlZCBzbyB0aGF0IHRoZSBQSFlfT0ZGCisJCSAqIGNvbW1hbmQgY2FuIHNodXQgaXQgZG93biAqLworCQlpcHcyMTAwX2VuYWJsZV9hZGFwdGVyKHByaXYpOworCisJCWVyciA9IGlwdzIxMDBfaHdfcGh5X29mZihwcml2KTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogRXJyb3IgZGlzYWJsaW5nIHJhZGlvICVkXG4iLCBlcnIpOworCisJCS8qCisJCSAqIElmIGluIEQwLXN0YW5kYnkgbW9kZSBnb2luZyBkaXJlY3RseSB0byBEMyBtYXkgY2F1c2UgYQorCQkgKiBQQ0kgYnVzIHZpb2xhdGlvbi4gIFRoZXJlZm9yZSB3ZSBtdXN0IGNoYW5nZSBvdXQgb2YgdGhlIEQwCisJCSAqIHN0YXRlLgorCQkgKgorCQkgKiBTZW5kaW5nIHRoZSBQUkVQQVJFX0ZPUl9QT1dFUl9ET1dOIHdpbGwgcmVzdHJpY3QgdGhlCisJCSAqIGhhcmR3YXJlIGZyb20gZ29pbmcgaW50byBzdGFuZGJ5IG1vZGUgYW5kIHdpbGwgdHJhbnNpdGlvbgorCQkgKiBvdXQgb2YgRDAtc3RhbmR5IGlmIGl0IGlzIGFscmVhZHkgaW4gdGhhdCBzdGF0ZS4KKwkJICoKKwkJICogU1RBVFVTX1BSRVBBUkVfUE9XRVJfRE9XTl9DT01QTEVURSB3aWxsIGJlIHNlbnQgYnkgdGhlCisJCSAqIGRyaXZlciB1cG9uIGNvbXBsZXRpb24uICBPbmNlIHJlY2VpdmVkLCB0aGUgZHJpdmVyIGNhbgorCQkgKiBwcm9jZWVkIHRvIHRoZSBEMyBzdGF0ZS4KKwkJICoKKwkJICogUHJlcGFyZSBmb3IgcG93ZXIgZG93biBjb21tYW5kIHRvIGZ3LiAgVGhpcyBjb21tYW5kIHdvdWxkCisJCSAqIHRha2UgSFcgb3V0IG9mIEQwLXN0YW5kYnkgYW5kIHByZXBhcmUgaXQgZm9yIEQzIHN0YXRlLgorCQkgKgorCQkgKiBDdXJyZW50bHkgRlcgZG9lcyBub3Qgc3VwcG9ydCBldmVudCBub3RpZmljYXRpb24gZm9yIHRoaXMKKwkJICogZXZlbnQuIFRoZXJlZm9yZSwgc2tpcCB3YWl0aW5nIGZvciBpdC4gIEp1c3Qgd2FpdCBhIGZpeGVkCisJCSAqIDEwMG1zCisJCSAqLworCQlJUFdfREVCVUdfSEMoIkhPU1RfUFJFX1BPV0VSX0RPV05cbiIpOworCisJCWVyciA9IGlwdzIxMDBfaHdfc2VuZF9jb21tYW5kKHByaXYsICZjbWQpOworCQlpZiAoZXJyKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiAiCisJCQkgICAgICAgIiVzOiBQb3dlciBkb3duIGNvbW1hbmQgZmFpbGVkOiBFcnJvciAlZFxuIiwKKwkJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lLCBlcnIpOworCQllbHNlIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoSFdfUE9XRVJfRE9XTl9ERUxBWSk7CisJCX0KKwl9CisKKwlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19FTkFCTEVEOworCisJLyoKKwkgKiBTZXQgR1BJTyAzIHdyaXRhYmxlIGJ5IEZXOyBHUElPIDEgd3JpdGFibGUKKwkgKiBieSBkcml2ZXIgYW5kIGVuYWJsZSBjbG9jaworCSAqLworCWlwdzIxMDBfaHdfc2V0X2dwaW8ocHJpdik7CisKKwkvKgorCSAqIFBvd2VyIGRvd24gYWRhcHRlci4gIFNlcXVlbmNlOgorCSAqIDEuIFN0b3AgbWFzdGVyIGFzc2VydCAoUkVTRVRfUkVHWzldPTEpCisJICogMi4gV2FpdCBmb3Igc3RvcCBtYXN0ZXIgKFJFU0VUX1JFR1s4XT09MSkKKwkgKiAzLiBTL3cgcmVzZXQgYXNzZXJ0IChSRVNFVF9SRUdbN10gPSAxKQorCSAqLworCisJLyogU3RvcCBtYXN0ZXIgYXNzZXJ0ICovCisJd3JpdGVfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwgSVBXX1JFR19SRVNFVF9SRUcsCisJCSAgICAgICBJUFdfQVVYX0hPU1RfUkVTRVRfUkVHX1NUT1BfTUFTVEVSKTsKKworCS8qIHdhaXQgc3RvcCBtYXN0ZXIgbm90IG1vcmUgdGhhbiA1MCB1c2VjLgorCSAqIE90aGVyd2lzZSByZXR1cm4gZXJyb3IuICovCisJZm9yIChpID0gNTsgaSA+IDA7IGktLSkgeworCQl1ZGVsYXkoMTApOworCisJCS8qIENoZWNrIG1hc3RlciBzdG9wIGJpdCAqLworCQlyZWFkX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfUkVTRVRfUkVHLCAmcmVnKTsKKworCQlpZiAocmVnICYgSVBXX0FVWF9IT1NUX1JFU0VUX1JFR19NQVNURVJfRElTQUJMRUQpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiAlczogQ291bGQgbm93IHBvd2VyIGRvd24gYWRhcHRlci5cbiIsCisJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lKTsKKworCS8qIGFzc2VydCBzL3cgcmVzZXQgKi8KKwl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfUkVHX1JFU0VUX1JFRywKKwkJICAgICAgIElQV19BVVhfSE9TVF9SRVNFVF9SRUdfU1dfUkVTRVQpOworCisJcHJpdi0+c3RhdHVzICY9IH4oU1RBVFVTX1JVTk5JTkcgfCBTVEFUVVNfU1RPUFBJTkcpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcHcyMTAwX2Rpc2FibGVfYWRhcHRlcihzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCXN0cnVjdCBob3N0X2NvbW1hbmQgY21kID0geworCQkuaG9zdF9jb21tYW5kID0gQ0FSRF9ESVNBQkxFLAorCQkuaG9zdF9jb21tYW5kX3NlcXVlbmNlID0gMCwKKwkJLmhvc3RfY29tbWFuZF9sZW5ndGggPSAwCisJfTsKKwlpbnQgZXJyID0gMDsKKworCUlQV19ERUJVR19IQygiQ0FSRF9ESVNBQkxFXG4iKTsKKworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19FTkFCTEVEKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBNYWtlIHN1cmUgd2UgY2xlYXIgdGhlIGFzc29jaWF0ZWQgc3RhdGUgKi8KKwlwcml2LT5zdGF0dXMgJj0gfihTVEFUVVNfQVNTT0NJQVRFRCB8IFNUQVRVU19BU1NPQ0lBVElORyk7CisKKwlpZiAoIXByaXYtPnN0b3BfaGFuZ19jaGVjaykgeworCQlwcml2LT5zdG9wX2hhbmdfY2hlY2sgPSAxOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5oYW5nX2NoZWNrKTsKKwl9CisKKwlkb3duKCZwcml2LT5hZGFwdGVyX3NlbSk7CisKKwllcnIgPSBpcHcyMTAwX2h3X3NlbmRfY29tbWFuZChwcml2LCAmY21kKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogZXhpdCAtIGZhaWxlZCB0byBzZW5kIENBUkRfRElTQUJMRSBjb21tYW5kXG4iKTsKKwkJZ290byBmYWlsX3VwOworCX0KKworCWVyciA9IGlwdzIxMDBfd2FpdF9mb3JfY2FyZF9zdGF0ZShwcml2LCBJUFdfSFdfU1RBVEVfRElTQUJMRUQpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiBleGl0IC0gY2FyZCBmYWlsZWQgdG8gY2hhbmdlIHRvIERJU0FCTEVEXG4iKTsKKwkJZ290byBmYWlsX3VwOworCX0KKworCUlQV19ERUJVR19JTkZPKCJUT0RPOiBpbXBsZW1lbnQgc2NhbiBzdGF0ZSBtYWNoaW5lXG4iKTsKKworZmFpbF91cDoKKwl1cCgmcHJpdi0+YWRhcHRlcl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF9zZXRfc2Nhbl9vcHRpb25zKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGhvc3RfY29tbWFuZCBjbWQgPSB7CisJCS5ob3N0X2NvbW1hbmQgPSBTRVRfU0NBTl9PUFRJT05TLAorCQkuaG9zdF9jb21tYW5kX3NlcXVlbmNlID0gMCwKKwkJLmhvc3RfY29tbWFuZF9sZW5ndGggPSA4CisJfTsKKwlpbnQgZXJyOworCisJSVBXX0RFQlVHX0lORk8oImVudGVyXG4iKTsKKworCUlQV19ERUJVR19TQ0FOKCJzZXR0aW5nIHNjYW4gb3B0aW9uc1xuIik7CisKKwljbWQuaG9zdF9jb21tYW5kX3BhcmFtZXRlcnNbMF0gPSAwOworCisJaWYgKCEocHJpdi0+Y29uZmlnICYgQ0ZHX0FTU09DSUFURSkpCisJCWNtZC5ob3N0X2NvbW1hbmRfcGFyYW1ldGVyc1swXSB8PSBJUFdfU0NBTl9OT0FTU09DSUFURTsKKwlpZiAoKHByaXYtPnNlYy5mbGFncyAmIFNFQ19FTkFCTEVEKSAmJiBwcml2LT5zZWMuZW5hYmxlZCkKKwkJY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzWzBdIHw9IElQV19TQ0FOX01JWEVEX0NFTEw7CisJaWYgKHByaXYtPmNvbmZpZyAmIENGR19QQVNTSVZFX1NDQU4pCisJCWNtZC5ob3N0X2NvbW1hbmRfcGFyYW1ldGVyc1swXSB8PSBJUFdfU0NBTl9QQVNTSVZFOworCisJY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzWzFdID0gcHJpdi0+Y2hhbm5lbF9tYXNrOworCisJZXJyID0gaXB3MjEwMF9od19zZW5kX2NvbW1hbmQocHJpdiwgJmNtZCk7CisKKwlJUFdfREVCVUdfSEMoIlNFVF9TQ0FOX09QVElPTlMgMHglMDRYXG4iLAorCQkgICAgIGNtZC5ob3N0X2NvbW1hbmRfcGFyYW1ldGVyc1swXSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfc3RhcnRfc2NhbihzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCXN0cnVjdCBob3N0X2NvbW1hbmQgY21kID0geworCQkuaG9zdF9jb21tYW5kID0gQlJPQURDQVNUX1NDQU4sCisJCS5ob3N0X2NvbW1hbmRfc2VxdWVuY2UgPSAwLAorCQkuaG9zdF9jb21tYW5kX2xlbmd0aCA9IDQKKwl9OworCWludCBlcnI7CisKKwlJUFdfREVCVUdfSEMoIlNUQVJUX1NDQU5cbiIpOworCisJY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzWzBdID0gMDsKKworCS8qIE5vIHNjYW5uaW5nIGlmIGluIG1vbml0b3IgbW9kZSAqLworCWlmIChwcml2LT5pZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJcmV0dXJuIDE7CisKKwlpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1NDQU5OSU5HKSB7CisJCUlQV19ERUJVR19TQ0FOKCJTY2FuIHJlcXVlc3RlZCB3aGlsZSBhbHJlYWR5IGluIHNjYW4uLi5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlJUFdfREVCVUdfSU5GTygiZW50ZXJcbiIpOworCisJLyogTm90IGNsZWFyaW5nIGhlcmU7IGRvaW5nIHNvIG1ha2VzIGl3bGlzdCBhbHdheXMgcmV0dXJuIG5vdGhpbmcuLi4KKwkgKgorCSAqIFdlIHNob3VsZCBtb2RpZnkgdGhlIHRhYmxlIGxvZ2ljIHRvIHVzZSBhZ2luZyB0YWJsZXMgdnMuIGNsZWFyaW5nCisJICogdGhlIHRhYmxlIG9uIGVhY2ggc2NhbiBzdGFydC4KKwkgKi8KKwlJUFdfREVCVUdfU0NBTigic3RhcnRpbmcgc2NhblxuIik7CisKKwlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1NDQU5OSU5HOworCWVyciA9IGlwdzIxMDBfaHdfc2VuZF9jb21tYW5kKHByaXYsICZjbWQpOworCWlmIChlcnIpCisJCXByaXYtPnN0YXR1cyAmPSB+U1RBVFVTX1NDQU5OSU5HOworCisJSVBXX0RFQlVHX0lORk8oImV4aXRcbiIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpcHcyMTAwX3VwKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGludCBkZWZlcnJlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDA7CisJdTMyIGxvY2s7CisJdTMyIG9yZF9sZW4gPSBzaXplb2YobG9jayk7CisKKwkvKiBRdWl0ZSBpZiBtYW51YWxseSBkaXNhYmxlZC4gKi8KKwlpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JGX0tJTExfU1cpIHsKKwkJSVBXX0RFQlVHX0lORk8oIiVzOiBSYWRpbyBpcyBkaXNhYmxlZCBieSBNYW51YWwgRGlzYWJsZSAiCisJCQkgICAgICAgInN3aXRjaFxuIiwgcHJpdi0+bmV0X2Rldi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIHRoZSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCwgdHVybiBpdCBvZmYuLi4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKKwlpcHcyMTAwX2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKKworCS8qIFJlc2V0IGFueSBmYXRhbF9lcnJvciBjb25kaXRpb25zICovCisJaXB3MjEwMF9yZXNldF9mYXRhbGVycm9yKHByaXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvd19sb2NrLCBmbGFncyk7CisKKwlpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1BPV0VSRUQgfHwKKwkgICAgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRVNFVF9QRU5ESU5HKSkgeworCQkvKiBQb3dlciBjeWNsZSB0aGUgY2FyZCAuLi4gKi8KKwkJaWYgKGlwdzIxMDBfcG93ZXJfY3ljbGVfYWRhcHRlcihwcml2KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiAlczogQ291bGQgbm90IGN5Y2xlIGFkYXB0ZXIuXG4iLAorCQkJCQkgIHByaXYtPm5ldF9kZXYtPm5hbWUpOworCQkJcmMgPSAxOworCQkJZ290byBleGl0OworCQl9CisJfSBlbHNlCisJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfUE9XRVJFRDsKKworCS8qIExvYWQgdGhlIGZpcm13YXJlLCBzdGFydCB0aGUgY2xvY2tzLCBldGMuICovCisJaWYgKGlwdzIxMDBfc3RhcnRfYWRhcHRlcihwcml2KSkgeworCSAgICAgICAJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6ICVzOiBGYWlsZWQgdG8gc3RhcnQgdGhlIGZpcm13YXJlLlxuIiwKKwkJCQlwcml2LT5uZXRfZGV2LT5uYW1lKTsKKwkJcmMgPSAxOworCQlnb3RvIGV4aXQ7CisJfQorCisJaXB3MjEwMF9pbml0aWFsaXplX29yZGluYWxzKHByaXYpOworCisJLyogRGV0ZXJtaW5lIGNhcGFiaWxpdGllcyBvZiB0aGlzIHBhcnRpY3VsYXIgSFcgY29uZmlndXJhdGlvbiAqLworCWlmIChpcHcyMTAwX2dldF9od19mZWF0dXJlcyhwcml2KSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXM6IEZhaWxlZCB0byBkZXRlcm1pbmUgSFcgZmVhdHVyZXMuXG4iLAorCQkJCXByaXYtPm5ldF9kZXYtPm5hbWUpOworCQlyYyA9IDE7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlsb2NrID0gTE9DS19OT05FOworCWlmIChpcHcyMTAwX3NldF9vcmRpbmFsKHByaXYsIElQV19PUkRfUEVSU19EQl9MT0NLLCAmbG9jaywgJm9yZF9sZW4pKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAlczogRmFpbGVkIHRvIGNsZWFyIG9yZGluYWwgbG9jay5cbiIsCisJCQkJcHJpdi0+bmV0X2Rldi0+bmFtZSk7CisJCXJjID0gMTsKKwkJZ290byBleGl0OworCX0KKworCXByaXYtPnN0YXR1cyAmPSB+U1RBVFVTX1NDQU5OSU5HOworCisJaWYgKHJmX2tpbGxfYWN0aXZlKHByaXYpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSYWRpbyBpcyBkaXNhYmxlZCBieSBSRiBzd2l0Y2guXG4iLAorCQkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSk7CisKKwkJaWYgKHByaXYtPnN0b3BfcmZfa2lsbCkgeworCQkJcHJpdi0+c3RvcF9yZl9raWxsID0gMDsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLCBIWik7CisJCX0KKworCQlkZWZlcnJlZCA9IDE7CisJfQorCisJLyogVHVybiBvbiB0aGUgaW50ZXJydXB0IHNvIHRoYXQgY29tbWFuZHMgY2FuIGJlIHByb2Nlc3NlZCAqLworCWlwdzIxMDBfZW5hYmxlX2ludGVycnVwdHMocHJpdik7CisKKwkvKiBTZW5kIGFsbCBvZiB0aGUgY29tbWFuZHMgdGhhdCBtdXN0IGJlIHNlbnQgcHJpb3IgdG8KKwkgKiBIT1NUX0NPTVBMRVRFICovCisJaWYgKGlwdzIxMDBfYWRhcHRlcl9zZXR1cChwcml2KSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXM6IEZhaWxlZCB0byBzdGFydCB0aGUgY2FyZC5cbiIsCisJCQkJcHJpdi0+bmV0X2Rldi0+bmFtZSk7CisJCXJjID0gMTsKKwkJZ290byBleGl0OworCX0KKworCWlmICghZGVmZXJyZWQpIHsKKwkJLyogRW5hYmxlIHRoZSBhZGFwdGVyIC0gc2VuZHMgSE9TVF9DT01QTEVURSAqLworCQlpZiAoaXB3MjEwMF9lbmFibGVfYWRhcHRlcihwcml2KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6ICIKKwkJCQkiJXM6IGZhaWxlZCBpbiBjYWxsIHRvIGVuYWJsZSBhZGFwdGVyLlxuIiwKKwkJCQlwcml2LT5uZXRfZGV2LT5uYW1lKTsKKwkJCWlwdzIxMDBfaHdfc3RvcF9hZGFwdGVyKHByaXYpOworCQkJcmMgPSAxOworCQkJZ290byBleGl0OworCQl9CisKKworCQkvKiBTdGFydCBhIHNjYW4gLiAuIC4gKi8KKwkJaXB3MjEwMF9zZXRfc2Nhbl9vcHRpb25zKHByaXYpOworCQlpcHcyMTAwX3N0YXJ0X3NjYW4ocHJpdik7CisJfQorCisgZXhpdDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qIENhbGxlZCBieSByZWdpc3Rlcl9uZXRkZXYoKSAqLworc3RhdGljIGludCBpcHcyMTAwX25ldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcmV0dXJuIGlwdzIxMDBfdXAocHJpdiwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGlwdzIxMDBfZG93bihzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1ID0geworCQkuYXBfYWRkciA9IHsKKwkJCS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVIKKwkJfQorCX07CisJaW50IGFzc29jaWF0ZWQgPSBwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRDsKKworCS8qIEtpbGwgdGhlIFJGIHN3aXRjaCB0aW1lciAqLworCWlmICghcHJpdi0+c3RvcF9yZl9raWxsKSB7CisJCXByaXYtPnN0b3BfcmZfa2lsbCA9IDE7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnJmX2tpbGwpOworCX0KKworCS8qIEtpbGwgdGhlIGZpcm1hcmUgaGFuZyBjaGVjayB0aW1lciAqLworCWlmICghcHJpdi0+c3RvcF9oYW5nX2NoZWNrKSB7CisJCXByaXYtPnN0b3BfaGFuZ19jaGVjayA9IDE7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmhhbmdfY2hlY2spOworCX0KKworCS8qIEtpbGwgYW55IHBlbmRpbmcgcmVzZXRzICovCisJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRVNFVF9QRU5ESU5HKQorCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgaW50ZXJydXB0IGlzIG9uIHNvIHRoYXQgRlcgY29tbWFuZHMgd2lsbCBiZQorCSAqIHByb2Nlc3NlZCBjb3JyZWN0bHkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKKwlpcHcyMTAwX2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvd19sb2NrLCBmbGFncyk7CisKKwlpZiAoaXB3MjEwMF9od19zdG9wX2FkYXB0ZXIocHJpdikpCisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAlczogRXJyb3Igc3RvcHBpbmcgYWRhcHRlci5cbiIsCisJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lKTsKKworCS8qIERvIG5vdCBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgdW50aWwgX2FmdGVyXyB3ZSBkaXNhYmxlCisJICogdGhlIGFkYXB0b3IuICBPdGhlcndpc2UgdGhlIENBUkRfRElTQUJMRSBjb21tYW5kIHdpbGwgbmV2ZXIKKwkgKiBiZSBhY2snZCBieSB0aGUgZmlybXdhcmUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKKwlpcHcyMTAwX2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb3dfbG9jaywgZmxhZ3MpOworCisjaWZkZWYgQUNQSV9DU1RBVEVfTElNSVRfREVGSU5FRAorCWlmIChwcml2LT5jb25maWcgJiBDRkdfQzNfRElTQUJMRUQpIHsKKwkJSVBXX0RFQlVHX0lORk8oRFJWX05BTUUgIjogUmVzZXR0aW5nIEMzIHRyYW5zaXRpb25zLlxuIik7CisJCWFjcGlfc2V0X2NzdGF0ZV9saW1pdChwcml2LT5jc3RhdGVfbGltaXQpOworCQlwcml2LT5jb25maWcgJj0gfkNGR19DM19ESVNBQkxFRDsKKwl9CisjZW5kaWYKKworCS8qIFdlIGhhdmUgdG8gc2lnbmFsIGFueSBzdXBwbGljYW50IGlmIHdlIGFyZSBkaXNhc3NvY2lhdGluZyAqLworCWlmIChhc3NvY2lhdGVkKQorCQl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCisJcHJpdi0+c3RhdHVzICY9IH4oU1RBVFVTX0FTU09DSUFURUQgfCBTVEFUVVNfQVNTT0NJQVRJTkcpOworCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldF9kZXYpOworCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0X2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIGlwdzIxMDBfcmVzZXRfYWRhcHRlcihzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1ID0geworCQkuYXBfYWRkciA9IHsKKwkJCS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVIKKwkJfQorCX07CisJaW50IGFzc29jaWF0ZWQgPSBwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb3dfbG9jaywgZmxhZ3MpOworCUlQV19ERUJVR19JTkZPKERSVl9OQU1FICI6ICVzOiBSZXN0YXJ0aW5nIGFkYXB0ZXIuXG4iLAorCQkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSk7CisJcHJpdi0+cmVzZXRzKys7CisJcHJpdi0+c3RhdHVzICY9IH4oU1RBVFVTX0FTU09DSUFURUQgfCBTVEFUVVNfQVNTT0NJQVRJTkcpOworCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfU0VDVVJJVFlfVVBEQVRFRDsKKworCS8qIEZvcmNlIGEgcG93ZXIgY3ljbGUgZXZlbiBpZiBpbnRlcmZhY2UgaGFzbid0IGJlZW4gb3BlbmVkCisJICogeWV0ICovCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cmVzZXRfd29yayk7CisJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19SRVNFVF9QRU5ESU5HOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvd19sb2NrLCBmbGFncyk7CisKKwlkb3duKCZwcml2LT5hY3Rpb25fc2VtKTsKKwkvKiBzdG9wIHRpbWVkIGNoZWNrcyBzbyB0aGF0IHRoZXkgZG9uJ3QgaW50ZXJmZXJlIHdpdGggcmVzZXQgKi8KKwlwcml2LT5zdG9wX2hhbmdfY2hlY2sgPSAxOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmhhbmdfY2hlY2spOworCisJLyogV2UgaGF2ZSB0byBzaWduYWwgYW55IHN1cHBsaWNhbnQgaWYgd2UgYXJlIGRpc2Fzc29jaWF0aW5nICovCisJaWYgKGFzc29jaWF0ZWQpCisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKwlpcHcyMTAwX3VwKHByaXYsIDApOworCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKKworfQorCisKK3N0YXRpYyB2b2lkIGlzcl9pbmRpY2F0ZV9hc3NvY2lhdGVkKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHUzMiBzdGF0dXMpCit7CisKKyNkZWZpbmUgTUFDX0FTU09DSUFUSU9OX1JFQURfREVMQVkgKEhaKQorCWludCByZXQsIGxlbiwgZXNzaWRfbGVuOworCWNoYXIgZXNzaWRbSVdfRVNTSURfTUFYX1NJWkVdOworCXUzMiB0eHJhdGU7CisJdTMyIGNoYW47CisJY2hhciAqdHhyYXRlbmFtZTsKKyAJdTggYnNzaWRbRVRIX0FMRU5dOworCisJLyoKKwkgKiBUQkQ6IEJTU0lEIGlzIHVzdWFsbHkgMDA6MDA6MDA6MDA6MDA6MDAgaGVyZSBhbmQgbm90CisJICogICAgICBhbiBhY3R1YWwgTUFDIG9mIHRoZSBBUC4gU2VlbXMgbGlrZSBGVyBzZXRzIHRoaXMKKwkgKiAgICAgIGFkZHJlc3MgdG9vIGxhdGUuIFJlYWQgaXQgbGF0ZXIgYW5kIGV4cG9zZSB0aHJvdWdoCisJICogICAgICAvcHJvYyBvciBzY2hlZHVsZSBhIGxhdGVyIHRhc2sgdG8gcXVlcnkgYW5kIHVwZGF0ZQorCSAqLworCisJZXNzaWRfbGVuID0gSVdfRVNTSURfTUFYX1NJWkU7CisJcmV0ID0gaXB3MjEwMF9nZXRfb3JkaW5hbChwcml2LCBJUFdfT1JEX1NUQVRfQVNTTl9TU0lELAorCQkJCSAgZXNzaWQsICZlc3NpZF9sZW4pOworCWlmIChyZXQpIHsKKwkJSVBXX0RFQlVHX0lORk8oImZhaWxlZCBxdWVyeWluZyBvcmRpbmFscyBhdCBsaW5lICVkXG4iLAorCQkJCSAgIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKworCWxlbiA9IHNpemVvZih1MzIpOworCXJldCA9IGlwdzIxMDBfZ2V0X29yZGluYWwocHJpdiwgSVBXX09SRF9DVVJSRU5UX1RYX1JBVEUsCisJCQkJICAmdHhyYXRlLCAmbGVuKTsKKwlpZiAocmV0KSB7CisJCUlQV19ERUJVR19JTkZPKCJmYWlsZWQgcXVlcnlpbmcgb3JkaW5hbHMgYXQgbGluZSAlZFxuIiwKKwkJCQkgICBfX0xJTkVfXyk7CisJCXJldHVybjsKKwl9CisKKwlsZW4gPSBzaXplb2YodTMyKTsKKwlyZXQgPSBpcHcyMTAwX2dldF9vcmRpbmFsKHByaXYsIElQV19PUkRfT1VSX0ZSRVEsICZjaGFuLCAmbGVuKTsKKwlpZiAocmV0KSB7CisJCUlQV19ERUJVR19JTkZPKCJmYWlsZWQgcXVlcnlpbmcgb3JkaW5hbHMgYXQgbGluZSAlZFxuIiwKKwkJCQkgICBfX0xJTkVfXyk7CisJCXJldHVybjsKKwl9CisJbGVuID0gRVRIX0FMRU47CisgICAgICAgIGlwdzIxMDBfZ2V0X29yZGluYWwocHJpdiwgSVBXX09SRF9TVEFUX0FTU05fQVBfQlNTSUQsICZic3NpZCwgICZsZW4pOworCWlmIChyZXQpIHsKKwkJSVBXX0RFQlVHX0lORk8oImZhaWxlZCBxdWVyeWluZyBvcmRpbmFscyBhdCBsaW5lICVkXG4iLAorCQkJCSAgIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKwltZW1jcHkocHJpdi0+aWVlZS0+YnNzaWQsIGJzc2lkLCBFVEhfQUxFTik7CisKKworCXN3aXRjaCAodHhyYXRlKSB7CisJY2FzZSBUWF9SQVRFXzFfTUJJVDoKKwkJdHhyYXRlbmFtZSA9ICIxTWJwcyI7CisJCWJyZWFrOworCWNhc2UgVFhfUkFURV8yX01CSVQ6CisJCXR4cmF0ZW5hbWUgPSAiMk1ic3AiOworCQlicmVhazsKKwljYXNlIFRYX1JBVEVfNV81X01CSVQ6CisJCXR4cmF0ZW5hbWUgPSAiNS41TWJwcyI7CisJCWJyZWFrOworCWNhc2UgVFhfUkFURV8xMV9NQklUOgorCQl0eHJhdGVuYW1lID0gIjExTWJwcyI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlQV19ERUJVR19JTkZPKCJVbmtub3duIHJhdGU6ICVkXG4iLCB0eHJhdGUpOworCQl0eHJhdGVuYW1lID0gInVua25vd24gcmF0ZSI7CisJCWJyZWFrOworCX0KKworCUlQV19ERUJVR19JTkZPKCIlczogQXNzb2NpYXRlZCB3aXRoICclcycgYXQgJXMsIGNoYW5uZWwgJWQgKEJTU0lEPSIKKwkJICAgICAgIE1BQ19GTVQgIilcbiIsCisJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lLCBlc2NhcGVfZXNzaWQoZXNzaWQsIGVzc2lkX2xlbiksCisJCSAgICAgICB0eHJhdGVuYW1lLCBjaGFuLCBNQUNfQVJHKGJzc2lkKSk7CisKKwkvKiBub3cgd2UgY29weSByZWFkIHNzaWQgaW50byBkZXYgKi8KKwlpZiAoIShwcml2LT5jb25maWcgJiBDRkdfU1RBVElDX0VTU0lEKSkgeworCQlwcml2LT5lc3NpZF9sZW4gPSBtaW4oKHU4KWVzc2lkX2xlbiwgKHU4KUlXX0VTU0lEX01BWF9TSVpFKTsKKwkJbWVtY3B5KHByaXYtPmVzc2lkLCBlc3NpZCwgcHJpdi0+ZXNzaWRfbGVuKTsKKwl9CisJcHJpdi0+Y2hhbm5lbCA9IGNoYW47CisJbWVtY3B5KHByaXYtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOworCisJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19BU1NPQ0lBVElORzsKKwlwcml2LT5jb25uZWN0X3N0YXJ0ID0gZ2V0X3NlY29uZHMoKTsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT53eF9ldmVudF93b3JrLCBIWiAvIDEwKTsKK30KKworCitzdGF0aWMgaW50IGlwdzIxMDBfc2V0X2Vzc2lkKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGNoYXIgKmVzc2lkLAorCQkJICAgICBpbnQgbGVuZ3RoLCBpbnQgYmF0Y2hfbW9kZSkKK3sKKwlpbnQgc3NpZF9sZW4gPSBtaW4obGVuZ3RoLCBJV19FU1NJRF9NQVhfU0laRSk7CisJc3RydWN0IGhvc3RfY29tbWFuZCBjbWQgPSB7CisJCS5ob3N0X2NvbW1hbmQgPSBTU0lELAorCQkuaG9zdF9jb21tYW5kX3NlcXVlbmNlID0gMCwKKwkJLmhvc3RfY29tbWFuZF9sZW5ndGggPSBzc2lkX2xlbgorCX07CisJaW50IGVycjsKKworCUlQV19ERUJVR19IQygiU1NJRDogJyVzJ1xuIiwgZXNjYXBlX2Vzc2lkKGVzc2lkLCBzc2lkX2xlbikpOworCisJaWYgKHNzaWRfbGVuKQorCQltZW1jcHkoKGNoYXIqKWNtZC5ob3N0X2NvbW1hbmRfcGFyYW1ldGVycywKKwkJICAgICAgIGVzc2lkLCBzc2lkX2xlbik7CisKKwlpZiAoIWJhdGNoX21vZGUpIHsKKwkJZXJyID0gaXB3MjEwMF9kaXNhYmxlX2FkYXB0ZXIocHJpdik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIEJ1ZyBpbiBGVyBjdXJyZW50bHkgZG9lc24ndCBob25vciBiaXQgMCBpbiBTRVRfU0NBTl9PUFRJT05TIHRvCisJICogZGlzYWJsZSBhdXRvIGFzc29jaWF0aW9uIC0tIHNvIHdlIGNoZWF0IGJ5IHNldHRpbmcgYSBib2d1cyBTU0lEICovCisJaWYgKCFzc2lkX2xlbiAmJiAhKHByaXYtPmNvbmZpZyAmIENGR19BU1NPQ0lBVEUpKSB7CisJCWludCBpOworCQl1OCAqYm9ndXMgPSAodTgqKWNtZC5ob3N0X2NvbW1hbmRfcGFyYW1ldGVyczsKKwkJZm9yIChpID0gMDsgaSA8IElXX0VTU0lEX01BWF9TSVpFOyBpKyspCisJCQlib2d1c1tpXSA9IDB4MTggKyBpOworCQljbWQuaG9zdF9jb21tYW5kX2xlbmd0aCA9IElXX0VTU0lEX01BWF9TSVpFOworCX0KKworCS8qIE5PVEU6ICBXZSBhbHdheXMgc2VuZCB0aGUgU1NJRCBjb21tYW5kIGV2ZW4gaWYgdGhlIHByb3ZpZGVkIEVTU0lEIGlzCisJICogdGhlIHNhbWUgYXMgd2hhdCB3ZSBjdXJyZW50bHkgdGhpbmsgaXMgc2V0LiAqLworCisJZXJyID0gaXB3MjEwMF9od19zZW5kX2NvbW1hbmQocHJpdiwgJmNtZCk7CisJaWYgKCFlcnIpIHsKKwkJbWVtc2V0KHByaXYtPmVzc2lkICsgc3NpZF9sZW4sIDAsCisJCSAgICAgICBJV19FU1NJRF9NQVhfU0laRSAtIHNzaWRfbGVuKTsKKwkJbWVtY3B5KHByaXYtPmVzc2lkLCBlc3NpZCwgc3NpZF9sZW4pOworCQlwcml2LT5lc3NpZF9sZW4gPSBzc2lkX2xlbjsKKwl9CisKKwlpZiAoIWJhdGNoX21vZGUpIHsKKwkJaWYgKGlwdzIxMDBfZW5hYmxlX2FkYXB0ZXIocHJpdikpCisJCQllcnIgPSAtRUlPOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGlzcl9pbmRpY2F0ZV9hc3NvY2lhdGlvbl9sb3N0KHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHUzMiBzdGF0dXMpCit7CisJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8IElQV19ETF9BU1NPQywKKwkJICAiZGlzYXNzb2NpYXRlZDogJyVzJyAiIE1BQ19GTVQgIiBcbiIsCisJCSAgZXNjYXBlX2Vzc2lkKHByaXYtPmVzc2lkLCBwcml2LT5lc3NpZF9sZW4pLAorCQkgIE1BQ19BUkcocHJpdi0+YnNzaWQpKTsKKworCXByaXYtPnN0YXR1cyAmPSB+KFNUQVRVU19BU1NPQ0lBVEVEIHwgU1RBVFVTX0FTU09DSUFUSU5HKTsKKworCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfU1RPUFBJTkcpIHsKKwkJSVBXX0RFQlVHX0lORk8oIkNhcmQgaXMgc3RvcHBpbmcgaXRzZWxmLCBkaXNjYXJkIEFTU05fTE9TVC5cbiIpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KHByaXYtPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJbWVtc2V0KHByaXYtPmllZWUtPmJzc2lkLCAwLCBFVEhfQUxFTik7CisKKwluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRfZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldF9kZXYpOworCisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JVTk5JTkcpKQorCQlyZXR1cm47CisKKwlpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1NFQ1VSSVRZX1VQREFURUQpCisJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+c2VjdXJpdHlfd29yayk7CisKKwlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnd4X2V2ZW50X3dvcmspOworfQorCitzdGF0aWMgdm9pZCBpc3JfaW5kaWNhdGVfcmZfa2lsbChzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LCB1MzIgc3RhdHVzKQoreworCUlQV19ERUJVR19JTkZPKCIlczogUkYgS2lsbCBzdGF0ZSBjaGFuZ2VkIHRvIHJhZGlvIE9GRi5cbiIsCisJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUpOworCisJLyogUkZfS0lMTCBpcyBub3cgZW5hYmxlZCAoZWxzZSB3ZSB3b3VsZG4ndCBiZSBoZXJlKSAqLworCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfUkZfS0lMTF9IVzsKKworI2lmZGVmIEFDUElfQ1NUQVRFX0xJTUlUX0RFRklORUQKKwlpZiAocHJpdi0+Y29uZmlnICYgQ0ZHX0MzX0RJU0FCTEVEKSB7CisJCUlQV19ERUJVR19JTkZPKERSVl9OQU1FICI6IFJlc2V0dGluZyBDMyB0cmFuc2l0aW9ucy5cbiIpOworCQlhY3BpX3NldF9jc3RhdGVfbGltaXQocHJpdi0+Y3N0YXRlX2xpbWl0KTsKKwkJcHJpdi0+Y29uZmlnICY9IH5DRkdfQzNfRElTQUJMRUQ7CisJfQorI2VuZGlmCisKKwkvKiBNYWtlIHN1cmUgdGhlIFJGIEtpbGwgY2hlY2sgdGltZXIgaXMgcnVubmluZyAqLworCXByaXYtPnN0b3BfcmZfa2lsbCA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cmZfa2lsbCk7CisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsIEhaKTsKK30KKworc3RhdGljIHZvaWQgaXNyX3NjYW5fY29tcGxldGUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgdTMyIHN0YXR1cykKK3sKKwlJUFdfREVCVUdfU0NBTigic2NhbiBjb21wbGV0ZVxuIik7CisJLyogQWdlIHRoZSBzY2FuIHJlc3VsdHMuLi4gKi8KKwlwcml2LT5pZWVlLT5zY2FucysrOworCXByaXYtPnN0YXR1cyAmPSB+U1RBVFVTX1NDQU5OSU5HOworfQorCisjaWZkZWYgQ09ORklHX0lQV19ERUJVRworI2RlZmluZSBJUFcyMTAwX0hBTkRMRVIodiwgZikgeyB2LCBmLCAjIHYgfQorc3RydWN0IGlwdzIxMDBfc3RhdHVzX2luZGljYXRvciB7CisJaW50IHN0YXR1czsKKwl2b2lkICgqY2IpKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHUzMiBzdGF0dXMpOworCWNoYXIgKm5hbWU7Cit9OworI2Vsc2UKKyNkZWZpbmUgSVBXMjEwMF9IQU5ETEVSKHYsIGYpIHsgdiwgZiB9CitzdHJ1Y3QgaXB3MjEwMF9zdGF0dXNfaW5kaWNhdG9yIHsKKwlpbnQgc3RhdHVzOworCXZvaWQgKCpjYikoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgdTMyIHN0YXR1cyk7Cit9OworI2VuZGlmIC8qIENPTkZJR19JUFdfREVCVUcgKi8KKworc3RhdGljIHZvaWQgaXNyX2luZGljYXRlX3NjYW5uaW5nKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHUzMiBzdGF0dXMpCit7CisJSVBXX0RFQlVHX1NDQU4oIlNjYW5uaW5nLi4uXG4iKTsKKwlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1NDQU5OSU5HOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlwdzIxMDBfc3RhdHVzX2luZGljYXRvciBzdGF0dXNfaGFuZGxlcnNbXSA9IHsKKwlJUFcyMTAwX0hBTkRMRVIoSVBXX1NUQVRFX0lOSVRJQUxJWkVELCBOVUxMKSwKKwlJUFcyMTAwX0hBTkRMRVIoSVBXX1NUQVRFX0NPVU5UUllfRk9VTkQsIE5VTEwpLAorCUlQVzIxMDBfSEFORExFUihJUFdfU1RBVEVfQVNTT0NJQVRFRCwgaXNyX2luZGljYXRlX2Fzc29jaWF0ZWQpLAorCUlQVzIxMDBfSEFORExFUihJUFdfU1RBVEVfQVNTTl9MT1NULCBpc3JfaW5kaWNhdGVfYXNzb2NpYXRpb25fbG9zdCksCisJSVBXMjEwMF9IQU5ETEVSKElQV19TVEFURV9BU1NOX0NIQU5HRUQsIE5VTEwpLAorCUlQVzIxMDBfSEFORExFUihJUFdfU1RBVEVfU0NBTl9DT01QTEVURSwgaXNyX3NjYW5fY29tcGxldGUpLAorCUlQVzIxMDBfSEFORExFUihJUFdfU1RBVEVfRU5URVJFRF9QU1AsIE5VTEwpLAorCUlQVzIxMDBfSEFORExFUihJUFdfU1RBVEVfTEVGVF9QU1AsIE5VTEwpLAorCUlQVzIxMDBfSEFORExFUihJUFdfU1RBVEVfUkZfS0lMTCwgaXNyX2luZGljYXRlX3JmX2tpbGwpLAorCUlQVzIxMDBfSEFORExFUihJUFdfU1RBVEVfRElTQUJMRUQsIE5VTEwpLAorCUlQVzIxMDBfSEFORExFUihJUFdfU1RBVEVfUE9XRVJfRE9XTiwgTlVMTCksCisJSVBXMjEwMF9IQU5ETEVSKElQV19TVEFURV9TQ0FOTklORywgaXNyX2luZGljYXRlX3NjYW5uaW5nKSwKKwlJUFcyMTAwX0hBTkRMRVIoLTEsIE5VTEwpCit9OworCisKK3N0YXRpYyB2b2lkIGlzcl9zdGF0dXNfY2hhbmdlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGludCBzdGF0dXMpCit7CisJaW50IGk7CisKKwlpZiAoc3RhdHVzID09IElQV19TVEFURV9TQ0FOTklORyAmJgorCSAgICBwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCAmJgorCSAgICAhKHByaXYtPnN0YXR1cyAmIFNUQVRVU19TQ0FOTklORykpIHsKKwkJSVBXX0RFQlVHX0lORk8oIlNjYW4gZGV0ZWN0ZWQgd2hpbGUgYXNzb2NpYXRlZCwgd2l0aCAiCisJCQkgICAgICAgIm5vIHNjYW4gcmVxdWVzdC4gIFJlc3RhcnRpbmcgZmlybXdhcmUuXG4iKTsKKworCQkvKiBXYWtlIHVwIGFueSBzbGVlcGluZyBqb2JzICovCisJCXNjaGVkdWxlX3Jlc2V0KHByaXYpOworCX0KKworCWZvciAoaSA9IDA7IHN0YXR1c19oYW5kbGVyc1tpXS5zdGF0dXMgIT0gLTE7IGkrKykgeworCQlpZiAoc3RhdHVzID09IHN0YXR1c19oYW5kbGVyc1tpXS5zdGF0dXMpIHsKKwkJCUlQV19ERUJVR19OT1RJRigiU3RhdHVzIGNoYW5nZTogJXNcbiIsCisJCQkJCSBzdGF0dXNfaGFuZGxlcnNbaV0ubmFtZSk7CisJCQlpZiAoc3RhdHVzX2hhbmRsZXJzW2ldLmNiKQorCQkJCXN0YXR1c19oYW5kbGVyc1tpXS5jYihwcml2LCBzdGF0dXMpOworCQkJcHJpdi0+d3N0YXRzLnN0YXR1cyA9IHN0YXR1czsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCUlQV19ERUJVR19OT1RJRigidW5rbm93biBzdGF0dXMgcmVjZWl2ZWQ6ICUwNHhcbiIsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIGlzcl9yeF9jb21wbGV0ZV9jb21tYW5kKAorCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsCisJc3RydWN0IGlwdzIxMDBfY21kX2hlYWRlciAqY21kKQoreworI2lmZGVmIENPTkZJR19JUFdfREVCVUcKKwlpZiAoY21kLT5ob3N0X2NvbW1hbmRfcmVnIDwgQVJSQVlfU0laRShjb21tYW5kX3R5cGVzKSkgeworCQlJUFdfREVCVUdfSEMoIkNvbW1hbmQgY29tcGxldGVkICclcyAoJWQpJ1xuIiwKKwkJCSAgICAgY29tbWFuZF90eXBlc1tjbWQtPmhvc3RfY29tbWFuZF9yZWddLAorCQkJICAgICBjbWQtPmhvc3RfY29tbWFuZF9yZWcpOworCX0KKyNlbmRpZgorCWlmIChjbWQtPmhvc3RfY29tbWFuZF9yZWcgPT0gSE9TVF9DT01QTEVURSkKKwkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19FTkFCTEVEOworCisJaWYgKGNtZC0+aG9zdF9jb21tYW5kX3JlZyA9PSBDQVJEX0RJU0FCTEUpCisJCXByaXYtPnN0YXR1cyAmPSB+U1RBVFVTX0VOQUJMRUQ7CisKKwlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19DTURfQUNUSVZFOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOworfQorCisjaWZkZWYgQ09ORklHX0lQV19ERUJVRworc3RhdGljIGNvbnN0IGNoYXIgKmZyYW1lX3R5cGVzW10gPSB7CisJIkNPTU1BTkRfU1RBVFVTX1ZBTCIsCisJIlNUQVRVU19DSEFOR0VfVkFMIiwKKwkiUDgwMjExX0RBVEFfVkFMIiwKKwkiUDgwMjNfREFUQV9WQUwiLAorCSJIT1NUX05PVElGSUNBVElPTl9WQUwiCit9OworI2VuZGlmCisKKworc3RhdGljIGlubGluZSBpbnQgaXB3MjEwMF9hbGxvY19za2IoCisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKKwlzdHJ1Y3QgaXB3MjEwMF9yeF9wYWNrZXQgKnBhY2tldCkKK3sKKwlwYWNrZXQtPnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX3J4KSk7CisJaWYgKCFwYWNrZXQtPnNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwYWNrZXQtPnJ4cCA9IChzdHJ1Y3QgaXB3MjEwMF9yeCAqKXBhY2tldC0+c2tiLT5kYXRhOworCXBhY2tldC0+ZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LCBwYWNrZXQtPnNrYi0+ZGF0YSwKKwkJCQkJICBzaXplb2Yoc3RydWN0IGlwdzIxMDBfcngpLAorCQkJCQkgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJLyogTk9URTogcGNpX21hcF9zaW5nbGUgZG9lcyBub3QgcmV0dXJuIGFuIGVycm9yIGNvZGUsIGFuZCAwIGlzIGEgdmFsaWQKKwkgKiAgICAgICBkbWFfYWRkciAqLworCisJcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBTRUFSQ0hfRVJST1IgICAweGZmZmZmZmZmCisjZGVmaW5lIFNFQVJDSF9GQUlMICAgIDB4ZmZmZmZmZmUKKyNkZWZpbmUgU0VBUkNIX1NVQ0NFU1MgMHhmZmZmZmZmMAorI2RlZmluZSBTRUFSQ0hfRElTQ0FSRCAwCisjZGVmaW5lIFNFQVJDSF9TTkFQU0hPVCAxCisKKyNkZWZpbmUgU05BUFNIT1RfQUREUihvZnMpIChwcml2LT5zbmFwc2hvdFsoKG9mcykgPj4gMTIpICYgMHhmZl0gKyAoKG9mcykgJiAweGZmZikpCitzdGF0aWMgaW5saW5lIGludCBpcHcyMTAwX3NuYXBzaG90X2FsbG9jKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJaW50IGk7CisJaWYgKHByaXYtPnNuYXBzaG90WzBdKQorCQlyZXR1cm4gMTsKKwlmb3IgKGkgPSAwOyBpIDwgMHgzMDsgaSsrKSB7CisJCXByaXYtPnNuYXBzaG90W2ldID0gKHU4KilrbWFsbG9jKDB4MTAwMCwgR0ZQX0FUT01JQyk7CisJCWlmICghcHJpdi0+c25hcHNob3RbaV0pIHsKKwkJCUlQV19ERUJVR19JTkZPKCIlczogRXJyb3IgYWxsb2NhdGluZyBzbmFwc2hvdCAiCisJCQkgICAgICAgImJ1ZmZlciAlZFxuIiwgcHJpdi0+bmV0X2Rldi0+bmFtZSwgaSk7CisJCQl3aGlsZSAoaSA+IDApCisJCQkJa2ZyZWUocHJpdi0+c25hcHNob3RbLS1pXSk7CisJCQlwcml2LT5zbmFwc2hvdFswXSA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXB3MjEwMF9zbmFwc2hvdF9mcmVlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJaW50IGk7CisJaWYgKCFwcml2LT5zbmFwc2hvdFswXSkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCAweDMwOyBpKyspCisJCWtmcmVlKHByaXYtPnNuYXBzaG90W2ldKTsKKwlwcml2LT5zbmFwc2hvdFswXSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGlwdzIxMDBfbWF0Y2hfYnVmKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHU4ICppbl9idWYsCisJCQkJICAgIHNpemVfdCBsZW4sIGludCBtb2RlKQoreworCXUzMiBpLCBqOworCXUzMiB0bXA7CisJdTggKnMsICpkOworCXUzMiByZXQ7CisKKwlzID0gaW5fYnVmOworCWlmIChtb2RlID09IFNFQVJDSF9TTkFQU0hPVCkgeworCQlpZiAoIWlwdzIxMDBfc25hcHNob3RfYWxsb2MocHJpdikpCisJCQltb2RlID0gU0VBUkNIX0RJU0NBUkQ7CisJfQorCisJZm9yIChyZXQgPSBTRUFSQ0hfRkFJTCwgaSA9IDA7IGkgPCAweDMwMDAwOyBpICs9IDQpIHsKKwkJcmVhZF9uaWNfZHdvcmQocHJpdi0+bmV0X2RldiwgaSwgJnRtcCk7CisJCWlmIChtb2RlID09IFNFQVJDSF9TTkFQU0hPVCkKKwkJCSoodTMyICopU05BUFNIT1RfQUREUihpKSA9IHRtcDsKKwkJaWYgKHJldCA9PSBTRUFSQ0hfRkFJTCkgeworCQkJZCA9ICh1OCopJnRtcDsKKwkJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCQlpZiAoKnMgIT0gKmQpIHsKKwkJCQkJcyA9IGluX2J1ZjsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJcysrOworCQkJCWQrKzsKKworCQkJCWlmICgocyAtIGluX2J1ZikgPT0gbGVuKQorCQkJCQlyZXQgPSAoaSArIGopIC0gbGVuICsgMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtb2RlID09IFNFQVJDSF9ESVNDQVJEKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICoKKyAqIDApIERpc2Nvbm5lY3QgdGhlIFNLQiBmcm9tIHRoZSBmaXJtd2FyZSAoanVzdCB1bm1hcCkKKyAqIDEpIFBhY2sgdGhlIEVUSCBoZWFkZXIgaW50byB0aGUgU0tCCisgKiAyKSBQYXNzIHRoZSBTS0IgdG8gdGhlIG5ldHdvcmsgc3RhY2sKKyAqCisgKiBXaGVuIHBhY2tldCBpcyBwcm92aWRlZCBieSB0aGUgZmlybXdhcmUsIGl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6CisgKgorICogLiAgaWVlZTgwMjExX2hkcgorICogLiAgaWVlZTgwMjExX3NuYXBfaGRyCisgKgorICogVGhlIHNpemUgb2YgdGhlIGNvbnN0cnVjdGVkIGV0aGVybmV0CisgKgorICovCisjaWZkZWYgQ09ORklHX0lQVzIxMDBfUlhfREVCVUcKK3N0YXRpYyB1OCBwYWNrZXRfZGF0YVtJUFdfUlhfTklDX0JVRkZFUl9MRU5HVEhdOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHcyMTAwX2NvcnJ1cHRpb25fZGV0ZWN0ZWQoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKKwkJCQkJICAgICAgIGludCBpKQoreworI2lmZGVmIENPTkZJR19JUFdfREVCVUdfQzMKKwlzdHJ1Y3QgaXB3MjEwMF9zdGF0dXMgKnN0YXR1cyA9ICZwcml2LT5zdGF0dXNfcXVldWUuZHJ2W2ldOworCXUzMiBtYXRjaCwgcmVnOworCWludCBqOworI2VuZGlmCisjaWZkZWYgQUNQSV9DU1RBVEVfTElNSVRfREVGSU5FRAorCWludCBsaW1pdDsKKyNlbmRpZgorCisJSVBXX0RFQlVHX0lORk8oRFJWX05BTUUgIjogUENJIGxhdGVuY3kgZXJyb3IgZGV0ZWN0ZWQgYXQgIgorCQkgICAgICAgIjB4JTA0elguXG4iLCBpICogc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX3N0YXR1cykpOworCisjaWZkZWYgQUNQSV9DU1RBVEVfTElNSVRfREVGSU5FRAorCUlQV19ERUJVR19JTkZPKERSVl9OQU1FICI6IERpc2FibGluZyBDMyB0cmFuc2l0aW9ucy5cbiIpOworCWxpbWl0ID0gYWNwaV9nZXRfY3N0YXRlX2xpbWl0KCk7CisJaWYgKGxpbWl0ID4gMikgeworCQlwcml2LT5jc3RhdGVfbGltaXQgPSBsaW1pdDsKKwkJYWNwaV9zZXRfY3N0YXRlX2xpbWl0KDIpOworCQlwcml2LT5jb25maWcgfD0gQ0ZHX0MzX0RJU0FCTEVEOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lQV19ERUJVR19DMworCS8qIEhhbHQgdGhlIGZpbXJ3YXJlIHNvIHdlIGNhbiBnZXQgYSBnb29kIGltYWdlICovCisJd3JpdGVfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwgSVBXX1JFR19SRVNFVF9SRUcsCisJCSAgICAgICBJUFdfQVVYX0hPU1RfUkVTRVRfUkVHX1NUT1BfTUFTVEVSKTsKKwlqID0gNTsKKwlkbyB7CisJCXVkZWxheShJUFdfV0FJVF9SRVNFVF9NQVNURVJfQVNTRVJUX0NPTVBMRVRFX0RFTEFZKTsKKwkJcmVhZF9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfUkVHX1JFU0VUX1JFRywgJnJlZyk7CisKKwkJaWYgKHJlZyAmIElQV19BVVhfSE9TVF9SRVNFVF9SRUdfTUFTVEVSX0RJU0FCTEVEKQorCQkJYnJlYWs7CisJfSAgd2hpbGUgKGotLSk7CisKKwltYXRjaCA9IGlwdzIxMDBfbWF0Y2hfYnVmKHByaXYsICh1OCopc3RhdHVzLAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX3N0YXR1cyksCisJCQkJICBTRUFSQ0hfU05BUFNIT1QpOworCWlmIChtYXRjaCA8IFNFQVJDSF9TVUNDRVNTKQorCQlJUFdfREVCVUdfSU5GTygiJXM6IERNQSBzdGF0dXMgbWF0Y2ggaW4gRmlybXdhcmUgYXQgIgorCQkJICAgICAgICJvZmZzZXQgMHglMDZYLCBsZW5ndGggJWQ6XG4iLAorCQkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUsIG1hdGNoLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXB3MjEwMF9zdGF0dXMpKTsKKwllbHNlCisJCUlQV19ERUJVR19JTkZPKCIlczogTm8gRE1BIHN0YXR1cyBtYXRjaCBpbiAiCisJCQkgICAgICAgIkZpcm13YXJlLlxuIiwgcHJpdi0+bmV0X2Rldi0+bmFtZSk7CisKKwlwcmludGtfYnVmKCh1OCopcHJpdi0+c3RhdHVzX3F1ZXVlLmRydiwKKwkJICAgc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX3N0YXR1cykgKiBSWF9RVUVVRV9MRU5HVEgpOworI2VuZGlmCisKKwlwcml2LT5mYXRhbF9lcnJvciA9IElQVzIxMDBfRVJSX0MzX0NPUlJVUFRJT047CisJcHJpdi0+aWVlZS0+c3RhdHMucnhfZXJyb3JzKys7CisJc2NoZWR1bGVfcmVzZXQocHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3Jfcngoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgaW50IGksCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQoreworCXN0cnVjdCBpcHcyMTAwX3N0YXR1cyAqc3RhdHVzID0gJnByaXYtPnN0YXR1c19xdWV1ZS5kcnZbaV07CisJc3RydWN0IGlwdzIxMDBfcnhfcGFja2V0ICpwYWNrZXQgPSAmcHJpdi0+cnhfYnVmZmVyc1tpXTsKKworCUlQV19ERUJVR19SWCgiSGFuZGxlci4uLlxuIik7CisKKwlpZiAodW5saWtlbHkoc3RhdHVzLT5mcmFtZV9zaXplID4gc2tiX3RhaWxyb29tKHBhY2tldC0+c2tiKSkpIHsKKwkJSVBXX0RFQlVHX0lORk8oIiVzOiBmcmFtZV9zaXplICgldSkgPiBza2JfdGFpbHJvb20gKCV1KSEiCisJCQkgICAgICAgIiAgRHJvcHBpbmcuXG4iLAorCQkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUsCisJCQkgICAgICAgc3RhdHVzLT5mcmFtZV9zaXplLCBza2JfdGFpbHJvb20ocGFja2V0LT5za2IpKTsKKwkJcHJpdi0+aWVlZS0+c3RhdHMucnhfZXJyb3JzKys7CisJCXJldHVybjsKKwl9CisKKwlpZiAodW5saWtlbHkoIW5ldGlmX3J1bm5pbmcocHJpdi0+bmV0X2RldikpKSB7CisJCXByaXYtPmllZWUtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlwcml2LT53c3RhdHMuZGlzY2FyZC5taXNjKys7CisJCUlQV19ERUJVR19EUk9QKCJEcm9wcGluZyBwYWNrZXQgd2hpbGUgaW50ZXJmYWNlIGlzIG5vdCB1cC5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHVubGlrZWx5KHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SICYmCisJCSAgICAgc3RhdHVzLT5mbGFncyAmIElQV19TVEFUVVNfRkxBR19DUkNfRVJST1IpKSB7CisJCUlQV19ERUJVR19SWCgiQ1JDIGVycm9yIGluIHBhY2tldC4gIERyb3BwaW5nLlxuIik7CisJCXByaXYtPmllZWUtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlyZXR1cm47CisJfQorCisJaWYgKHVubGlrZWx5KHByaXYtPmllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9NT05JVE9SICYmCisJCSEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0FTU09DSUFURUQpKSkgeworCQlJUFdfREVCVUdfRFJPUCgiRHJvcHBpbmcgcGFja2V0IHdoaWxlIG5vdCBhc3NvY2lhdGVkLlxuIik7CisJCXByaXYtPndzdGF0cy5kaXNjYXJkLm1pc2MrKzsKKwkJcmV0dXJuOworCX0KKworCisJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LAorCQkJIHBhY2tldC0+ZG1hX2FkZHIsCisJCQkgc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX3J4KSwKKwkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJc2tiX3B1dChwYWNrZXQtPnNrYiwgc3RhdHVzLT5mcmFtZV9zaXplKTsKKworI2lmZGVmIENPTkZJR19JUFcyMTAwX1JYX0RFQlVHCisJLyogTWFrZSBhIGNvcHkgb2YgdGhlIGZyYW1lIHNvIHdlIGNhbiBkdW1wIGl0IHRvIHRoZSBsb2dzIGlmCisJICogaWVlZTgwMjExX3J4IGZhaWxzICovCisJbWVtY3B5KHBhY2tldF9kYXRhLCBwYWNrZXQtPnNrYi0+ZGF0YSwKKwkgICAgICAgbWluX3QodTMyLCBzdGF0dXMtPmZyYW1lX3NpemUsIElQV19SWF9OSUNfQlVGRkVSX0xFTkdUSCkpOworI2VuZGlmCisKKwlpZiAoIWllZWU4MDIxMV9yeChwcml2LT5pZWVlLCBwYWNrZXQtPnNrYiwgc3RhdHMpKSB7CisjaWZkZWYgQ09ORklHX0lQVzIxMDBfUlhfREVCVUcKKwkJSVBXX0RFQlVHX0RST1AoIiVzOiBOb24gY29uc3VtZWQgcGFja2V0OlxuIiwKKwkJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lKTsKKwkJcHJpbnRrX2J1ZihJUFdfRExfRFJPUCwgcGFja2V0X2RhdGEsIHN0YXR1cy0+ZnJhbWVfc2l6ZSk7CisjZW5kaWYKKwkJcHJpdi0+aWVlZS0+c3RhdHMucnhfZXJyb3JzKys7CisKKwkJLyogaWVlZTgwMjExX3J4IGZhaWxlZCwgc28gaXQgZGlkbid0IGZyZWUgdGhlIFNLQiAqLworCQlkZXZfa2ZyZWVfc2tiX2FueShwYWNrZXQtPnNrYik7CisJCXBhY2tldC0+c2tiID0gTlVMTDsKKwl9CisKKwkvKiBXZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IFNLQiBhbmQgYXR0YWNoIGl0IHRvIHRoZSBSREIuICovCisJaWYgKHVubGlrZWx5KGlwdzIxMDBfYWxsb2Nfc2tiKHByaXYsIHBhY2tldCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogIgorCQkJIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgU0tCIG9udG8gUkJEIHJpbmcgLSBkaXNhYmxpbmcgIgorCQkJImFkYXB0ZXIuXG4iLCBwcml2LT5uZXRfZGV2LT5uYW1lKTsKKwkJLyogVE9ETzogc2NoZWR1bGUgYWRhcHRlciBzaHV0ZG93biAqLworCQlJUFdfREVCVUdfSU5GTygiVE9ETzogU2h1dGRvd24gYWRhcHRlci4uLlxuIik7CisJfQorCisJLyogVXBkYXRlIHRoZSBSREIgZW50cnkgKi8KKwlwcml2LT5yeF9xdWV1ZS5kcnZbaV0uaG9zdF9hZGRyID0gcGFja2V0LT5kbWFfYWRkcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXB3MjEwMF9jb3JydXB0aW9uX2NoZWNrKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGludCBpKQoreworCXN0cnVjdCBpcHcyMTAwX3N0YXR1cyAqc3RhdHVzID0gJnByaXYtPnN0YXR1c19xdWV1ZS5kcnZbaV07CisJc3RydWN0IGlwdzIxMDBfcnggKnUgPSBwcml2LT5yeF9idWZmZXJzW2ldLnJ4cDsKKwl1MTYgZnJhbWVfdHlwZSA9IHN0YXR1cy0+c3RhdHVzX2ZpZWxkcyAmIFNUQVRVU19UWVBFX01BU0s7CisKKwlzd2l0Y2ggKGZyYW1lX3R5cGUpIHsKKwljYXNlIENPTU1BTkRfU1RBVFVTX1ZBTDoKKwkJcmV0dXJuIChzdGF0dXMtPmZyYW1lX3NpemUgIT0gc2l6ZW9mKHUtPnJ4X2RhdGEuY29tbWFuZCkpOworCWNhc2UgU1RBVFVTX0NIQU5HRV9WQUw6CisJCXJldHVybiAoc3RhdHVzLT5mcmFtZV9zaXplICE9IHNpemVvZih1LT5yeF9kYXRhLnN0YXR1cykpOworCWNhc2UgSE9TVF9OT1RJRklDQVRJT05fVkFMOgorCQlyZXR1cm4gKHN0YXR1cy0+ZnJhbWVfc2l6ZSA8IHNpemVvZih1LT5yeF9kYXRhLm5vdGlmaWNhdGlvbikpOworCWNhc2UgUDgwMjExX0RBVEFfVkFMOgorCWNhc2UgUDgwMjNfREFUQV9WQUw6CisjaWZkZWYgQ09ORklHX0lQVzIxMDBfTU9OSVRPUgorCQlyZXR1cm4gMDsKKyNlbHNlCisJCXN3aXRjaCAoV0xBTl9GQ19HRVRfVFlQRSh1LT5yeF9kYXRhLmhlYWRlci5mcmFtZV9jdGwpKSB7CisJCWNhc2UgSUVFRTgwMjExX0ZUWVBFX01HTVQ6CisJCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0NUTDoKKwkJCXJldHVybiAwOworCQljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgorCQkJcmV0dXJuIChzdGF0dXMtPmZyYW1lX3NpemUgPgorCQkJCUlQV19NQVhfODAyXzExX1BBWUxPQURfTEVOR1RIKTsKKwkJfQorI2VuZGlmCisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBpcHcyMTAwIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGF0IHRoaXMgcG9pbnQsIGFuZCB0aGUgSVNSCisgKiBpcyB0aGUgb25seSBjb2RlIHRoYXQgY2FsbHMgdGhpcyBtZXRob2QuICBTbywgd2UgZG8gbm90IG5lZWQKKyAqIHRvIHBsYXkgd2l0aCBhbnkgbG9ja3MuCisgKgorICogUlggUXVldWUgd29ya3MgYXMgZm9sbG93czoKKyAqCisgKiBSZWFkIGluZGV4IC0gZmlybXdhcmUgcGxhY2VzIHBhY2tldCBpbiBlbnRyeSBpZGVudGlmaWVkIGJ5IHRoZQorICogICAgICAgICAgICAgIFJlYWQgaW5kZXggYW5kIGFkdmFuY2VzIFJlYWQgaW5kZXguICBJbiB0aGlzIG1hbm5lciwKKyAqICAgICAgICAgICAgICBSZWFkIGluZGV4IHdpbGwgYWx3YXlzIHBvaW50IHRvIHRoZSBuZXh0IHBhY2tldCB0bworICogICAgICAgICAgICAgIGJlIGZpbGxlZC0tYnV0IG5vdCB5ZXQgdmFsaWQuCisgKgorICogV3JpdGUgaW5kZXggLSBkcml2ZXIgZmlsbHMgdGhpcyBlbnRyeSB3aXRoIGFuIHVudXNlZCBSQkQgZW50cnkuCisgKiAgICAgICAgICAgICAgIFRoaXMgZW50cnkgaGFzIG5vdCBmaWxsZWQgYnkgdGhlIGZpcm13YXJlIHlldC4KKyAqCisgKiBJbiBiZXR3ZWVuIHRoZSBXIGFuZCBSIGluZGV4ZXMgYXJlIHRoZSBSQkRzIHRoYXQgaGF2ZSBiZWVuIHJlY2VpdmVkCisgKiBidXQgbm90IHlldCBwcm9jZXNzZWQuCisgKgorICogVGhlIHByb2Nlc3Mgb2YgaGFuZGxpbmcgcGFja2V0cyB3aWxsIHN0YXJ0IGF0IFdSSVRFICsgMSBhbmQgYWR2YW5jZQorICogdW50aWwgaXQgcmVhY2hlcyB0aGUgUkVBRCBpbmRleC4KKyAqCisgKiBUaGUgV1JJVEUgaW5kZXggaXMgY2FjaGVkIGluIHRoZSB2YXJpYWJsZSAncHJpdi0+cnhfcXVldWUubmV4dCcuCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19pcHcyMTAwX3J4X3Byb2Nlc3Moc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9iZF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4X3F1ZXVlOworCXN0cnVjdCBpcHcyMTAwX3N0YXR1c19xdWV1ZSAqc3EgPSAmcHJpdi0+c3RhdHVzX3F1ZXVlOworCXN0cnVjdCBpcHcyMTAwX3J4X3BhY2tldCAqcGFja2V0OworCXUxNiBmcmFtZV90eXBlOworCXUzMiByLCB3LCBpLCBzOworCXN0cnVjdCBpcHcyMTAwX3J4ICp1OworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHMgPSB7CisJCS5tYWNfdGltZSA9IGppZmZpZXMsCisJfTsKKworCXJlYWRfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwgSVBXX01FTV9IT1NUX1NIQVJFRF9SWF9SRUFEX0lOREVYLCAmcik7CisJcmVhZF9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfTUVNX0hPU1RfU0hBUkVEX1JYX1dSSVRFX0lOREVYLCAmdyk7CisKKwlpZiAociA+PSByeHEtPmVudHJpZXMpIHsKKwkJSVBXX0RFQlVHX1JYKCJleGl0IC0gYmFkIHJlYWQgaW5kZXhcbiIpOworCQlyZXR1cm47CisJfQorCisJaSA9IChyeHEtPm5leHQgKyAxKSAlIHJ4cS0+ZW50cmllczsKKwlzID0gaTsKKwl3aGlsZSAoaSAhPSByKSB7CisJCS8qIElQV19ERUJVR19SWCgiciA9ICVkIDogdyA9ICVkIDogcHJvY2Vzc2luZyA9ICVkXG4iLAorCQkgICByLCByeHEtPm5leHQsIGkpOyAqLworCisJCXBhY2tldCA9ICZwcml2LT5yeF9idWZmZXJzW2ldOworCisJCS8qIFN5bmMgdGhlIERNQSBmb3IgdGhlIFNUQVRVUyBidWZmZXIgc28gQ1BVIGlzIHN1cmUgdG8gZ2V0CisJCSAqIHRoZSBjb3JyZWN0IHZhbHVlcyAqLworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoCisJCQlwcml2LT5wY2lfZGV2LAorCQkJc3EtPm5pYyArIHNpemVvZihzdHJ1Y3QgaXB3MjEwMF9zdGF0dXMpICogaSwKKwkJCXNpemVvZihzdHJ1Y3QgaXB3MjEwMF9zdGF0dXMpLAorCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkvKiBTeW5jIHRoZSBETUEgZm9yIHRoZSBSWCBidWZmZXIgc28gQ1BVIGlzIHN1cmUgdG8gZ2V0CisJCSAqIHRoZSBjb3JyZWN0IHZhbHVlcyAqLworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocHJpdi0+cGNpX2RldiwgcGFja2V0LT5kbWFfYWRkciwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgaXB3MjEwMF9yeCksCisJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCWlmICh1bmxpa2VseShpcHcyMTAwX2NvcnJ1cHRpb25fY2hlY2socHJpdiwgaSkpKSB7CisJCQlpcHcyMTAwX2NvcnJ1cHRpb25fZGV0ZWN0ZWQocHJpdiwgaSk7CisJCQlnb3RvIGluY3JlbWVudDsKKwkJfQorCisJCXUgPSBwYWNrZXQtPnJ4cDsKKwkJZnJhbWVfdHlwZSA9IHNxLT5kcnZbaV0uc3RhdHVzX2ZpZWxkcyAmCisJCQlTVEFUVVNfVFlQRV9NQVNLOworCQlzdGF0cy5yc3NpID0gc3EtPmRydltpXS5yc3NpICsgSVBXMjEwMF9SU1NJX1RPX0RCTTsKKwkJc3RhdHMubGVuID0gc3EtPmRydltpXS5mcmFtZV9zaXplOworCisJCXN0YXRzLm1hc2sgPSAwOworCQlpZiAoc3RhdHMucnNzaSAhPSAwKQorCQkJc3RhdHMubWFzayB8PSBJRUVFODAyMTFfU1RBVE1BU0tfUlNTSTsKKwkJc3RhdHMuZnJlcSA9IElFRUU4MDIxMV8yNEdIWl9CQU5EOworCisJCUlQV19ERUJVR19SWCgKKwkJCSIlczogJyVzJyBmcmFtZSB0eXBlIHJlY2VpdmVkICglZCkuXG4iLAorCQkJcHJpdi0+bmV0X2Rldi0+bmFtZSwgZnJhbWVfdHlwZXNbZnJhbWVfdHlwZV0sCisJCQlzdGF0cy5sZW4pOworCisJCXN3aXRjaCAoZnJhbWVfdHlwZSkgeworCQljYXNlIENPTU1BTkRfU1RBVFVTX1ZBTDoKKwkJCS8qIFJlc2V0IFJ4IHdhdGNoZG9nICovCisJCQlpc3JfcnhfY29tcGxldGVfY29tbWFuZCgKKwkJCQlwcml2LCAmdS0+cnhfZGF0YS5jb21tYW5kKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RBVFVTX0NIQU5HRV9WQUw6CisJCQlpc3Jfc3RhdHVzX2NoYW5nZShwcml2LCB1LT5yeF9kYXRhLnN0YXR1cyk7CisJCQlicmVhazsKKworCQljYXNlIFA4MDIxMV9EQVRBX1ZBTDoKKwkJY2FzZSBQODAyM19EQVRBX1ZBTDoKKyNpZmRlZiBDT05GSUdfSVBXMjEwMF9NT05JVE9SCisJCQlpZiAocHJpdi0+aWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKKwkJCQlpc3JfcngocHJpdiwgaSwgJnN0YXRzKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKHN0YXRzLmxlbiA8IHNpemVvZih1LT5yeF9kYXRhLmhlYWRlcikpCisJCQkJYnJlYWs7CisJCQlzd2l0Y2ggKFdMQU5fRkNfR0VUX1RZUEUodS0+cnhfZGF0YS5oZWFkZXIuCisJCQkJCQkgZnJhbWVfY3RsKSkgeworCQkJY2FzZSBJRUVFODAyMTFfRlRZUEVfTUdNVDoKKwkJCQlpZWVlODAyMTFfcnhfbWd0KHByaXYtPmllZWUsCisJCQkJCQkgJnUtPnJ4X2RhdGEuaGVhZGVyLAorCQkJCQkJICZzdGF0cyk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0NUTDoKKwkJCQlicmVhazsKKworCQkJY2FzZSBJRUVFODAyMTFfRlRZUEVfREFUQToKKwkJCQlpc3JfcngocHJpdiwgaSwgJnN0YXRzKTsKKwkJCQlicmVhazsKKworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWluY3JlbWVudDoKKwkJLyogY2xlYXIgc3RhdHVzIGZpZWxkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJCRCAqLworCQlyeHEtPmRydltpXS5zdGF0dXMuaW5mby5maWVsZCA9IDA7CisKKwkJaSA9IChpICsgMSkgJSByeHEtPmVudHJpZXM7CisJfQorCisJaWYgKGkgIT0gcykgeworCQkvKiBiYWNrdHJhY2sgb25lIGVudHJ5LCB3cmFwcGluZyB0byBlbmQgaWYgYXQgMCAqLworCQlyeHEtPm5leHQgPSAoaSA/IGkgOiByeHEtPmVudHJpZXMpIC0gMTsKKworCQl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LAorCQkJICAgICAgIElQV19NRU1fSE9TVF9TSEFSRURfUlhfV1JJVEVfSU5ERVgsCisJCQkgICAgICAgcnhxLT5uZXh0KTsKKwl9Cit9CisKKworLyoKKyAqIF9faXB3MjEwMF90eF9wcm9jZXNzCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5leHQgcGFja2V0IG9uCisgKiB0aGUgZndfcGVuZF9saXN0IGhhcyBiZWVuIHByb2Nlc3NlZCBieSB0aGUgZmlybXdhcmUgeWV0LgorICoKKyAqIElmIG5vdCwgdGhlbiBpdCBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMuCisgKgorICogSWYgc28sIHRoZW4gaXQgcmVtb3ZlcyB0aGUgaXRlbSBmcm9tIHRoZSBmd19wZW5kX2xpc3QsIGZyZWVzCisgKiBhbnkgYXNzb2NpYXRlZCBzdG9yYWdlLCBhbmQgcGxhY2VzIHRoZSBpdGVtIGJhY2sgb24gdGhlCisgKiBmcmVlIGxpc3Qgb2YgaXRzIHNvdXJjZSAoZWl0aGVyIG1zZ19mcmVlX2xpc3Qgb3IgdHhfZnJlZV9saXN0KQorICoKKyAqIFRYIFF1ZXVlIHdvcmtzIGFzIGZvbGxvd3M6CisgKgorICogUmVhZCBpbmRleCAtIHBvaW50cyB0byB0aGUgbmV4dCBUQkQgdGhhdCB0aGUgZmlybXdhcmUgd2lsbAorICogICAgICAgICAgICAgIHByb2Nlc3MuICBUaGUgZmlybXdhcmUgd2lsbCByZWFkIHRoZSBkYXRhLCBhbmQgb25jZQorICogICAgICAgICAgICAgIGRvbmUgcHJvY2Vzc2luZywgaXQgd2lsbCBhZHZhbmNlIHRoZSBSZWFkIGluZGV4LgorICoKKyAqIFdyaXRlIGluZGV4IC0gZHJpdmVyIGZpbGxzIHRoaXMgZW50cnkgd2l0aCBhbiBjb25zdHJ1Y3RlZCBUQkQKKyAqICAgICAgICAgICAgICAgZW50cnkuICBUaGUgV3JpdGUgaW5kZXggaXMgbm90IGFkdmFuY2VkIHVudGlsIHRoZQorICogICAgICAgICAgICAgICBwYWNrZXQgaGFzIGJlZW4gY29uZmlndXJlZC4KKyAqCisgKiBJbiBiZXR3ZWVuIHRoZSBXIGFuZCBSIGluZGV4ZXMgYXJlIHRoZSBUQkRzIHRoYXQgaGF2ZSBOT1QgYmVlbgorICogcHJvY2Vzc2VkLiAgTGFnZ2luZyBiZWhpbmQgdGhlIFIgaW5kZXggYXJlIHBhY2tldHMgdGhhdCBoYXZlCisgKiBiZWVuIHByb2Nlc3NlZCBidXQgaGF2ZSBub3QgYmVlbiBmcmVlZCBieSB0aGUgZHJpdmVyLgorICoKKyAqIEluIG9yZGVyIHRvIGZyZWUgb2xkIHN0b3JhZ2UsIGFuIGludGVybmFsIGluZGV4IHdpbGwgYmUgbWFpbnRhaW5lZAorICogdGhhdCBwb2ludHMgdG8gdGhlIG5leHQgcGFja2V0IHRvIGJlIGZyZWVkLiAgV2hlbiBhbGwgdXNlZAorICogcGFja2V0cyBoYXZlIGJlZW4gZnJlZWQsIHRoZSBvbGRlc3QgaW5kZXggd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUKKyAqIGZpcm13YXJlJ3MgcmVhZCBpbmRleC4KKyAqCisgKiBUaGUgT0xERVNUIGluZGV4IGlzIGNhY2hlZCBpbiB0aGUgdmFyaWFibGUgJ3ByaXYtPnR4X3F1ZXVlLm9sZGVzdCcKKyAqCisgKiBCZWNhdXNlIHRoZSBUQkQgc3RydWN0dXJlIGNhbiBub3QgY29udGFpbiBhcmJpdHJhcnkgZGF0YSwgdGhlCisgKiBkcml2ZXIgbXVzdCBrZWVwIGFuIGludGVybmFsIHF1ZXVlIG9mIGNhY2hlZCBhbGxvY2F0aW9ucyBzdWNoIHRoYXQKKyAqIGl0IGNhbiBwdXQgdGhhdCBkYXRhIGJhY2sgaW50byB0aGUgdHhfZnJlZV9saXN0IGFuZCBtc2dfZnJlZV9saXN0CisgKiBmb3IgdXNlIGJ5IGZ1dHVyZSBjb21tYW5kIGFuZCBkYXRhIHBhY2tldHMuCisgKgorICovCitzdGF0aWMgaW5saW5lIGludCBfX2lwdzIxMDBfdHhfcHJvY2VzcyhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCXN0cnVjdCBpcHcyMTAwX2JkX3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhfcXVldWU7CisgICAgICAgIHN0cnVjdCBpcHcyMTAwX2JkICp0YmQ7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKwlzdHJ1Y3QgaXB3MjEwMF90eF9wYWNrZXQgKnBhY2tldDsKKwlpbnQgZGVzY3JpcHRvcnNfdXNlZDsKKwlpbnQgZSwgaTsKKwl1MzIgciwgdywgZnJhZ19udW0gPSAwOworCisJaWYgKGxpc3RfZW1wdHkoJnByaXYtPmZ3X3BlbmRfbGlzdCkpCisJCXJldHVybiAwOworCisJZWxlbWVudCA9IHByaXYtPmZ3X3BlbmRfbGlzdC5uZXh0OworCisJcGFja2V0ID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaXB3MjEwMF90eF9wYWNrZXQsIGxpc3QpOworICAgICAgICB0YmQgPSAmdHhxLT5kcnZbcGFja2V0LT5pbmRleF07CisKKwkvKiBEZXRlcm1pbmUgaG93IG1hbnkgVEJEIGVudHJpZXMgbXVzdCBiZSBmaW5pc2hlZC4uLiAqLworCXN3aXRjaCAocGFja2V0LT50eXBlKSB7CisJY2FzZSBDT01NQU5EOgorCQkvKiBDT01NQU5EIHVzZXMgb25seSBvbmUgc2xvdDsgZG9uJ3QgYWR2YW5jZSAqLworCQlkZXNjcmlwdG9yc191c2VkID0gMTsKKwkJZSA9IHR4cS0+b2xkZXN0OworCQlicmVhazsKKworCWNhc2UgREFUQToKKwkJLyogREFUQSB1c2VzIHR3byBzbG90czsgYWR2YW5jZSBhbmQgbG9vcCBwb3NpdGlvbi4gKi8KKwkJZGVzY3JpcHRvcnNfdXNlZCA9IHRiZC0+bnVtX2ZyYWdtZW50czsKKyAgICAgICAgICAgICAgICBmcmFnX251bSA9IHRiZC0+bnVtX2ZyYWdtZW50cyAtIDE7CisJCWUgPSB0eHEtPm9sZGVzdCArIGZyYWdfbnVtOworCQllICU9IHR4cS0+ZW50cmllczsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6ICVzOiBCYWQgZndfcGVuZF9saXN0IGVudHJ5IVxuIiwKKwkJCQkgICBwcml2LT5uZXRfZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogaWYgdGhlIGxhc3QgVEJEIGlzIG5vdCBkb25lIGJ5IE5JQyB5ZXQsIHRoZW4gcGFja2V0IGlzCisJICogbm90IHJlYWR5IHRvIGJlIHJlbGVhc2VkLgorCSAqCisJICovCisJcmVhZF9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfTUVNX0hPU1RfU0hBUkVEX1RYX1FVRVVFX1JFQURfSU5ERVgsCisJCSAgICAgICZyKTsKKwlyZWFkX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19NRU1fSE9TVF9TSEFSRURfVFhfUVVFVUVfV1JJVEVfSU5ERVgsCisJCSAgICAgICZ3KTsKKwlpZiAodyAhPSB0eHEtPm5leHQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogJXM6IHdyaXRlIGluZGV4IG1pc21hdGNoXG4iLAorCQkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSk7CisKKyAgICAgICAgLyoKKwkgKiB0eHEtPm5leHQgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHBhY2tldCB3cml0dGVuIHR4cS0+b2xkZXN0IGlzCisJICogdGhlIGluZGV4IG9mIHRoZSByIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBwYWNrZXQgdG8gYmUgcmVhZCBieQorCSAqIGZpcm13YXJlCisJICovCisKKworCS8qCisJICogUXVpY2sgZ3JhcGhpYyB0byBoZWxwIHlvdSB2aXN1YWxpemUgdGhlIGZvbGxvd2luZworCSAqIGlmIC8gZWxzZSBzdGF0ZW1lbnQKKwkgKgorCSAqID09PT58ICAgICAgICAgICAgICAgICAgICAgcy0tLS0+fD09PT09PT09PT09PT09PQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU+fAorCSAqIHwgYSB8IGIgfCBjIHwgZCB8IGUgfCBmIHwgZyB8IGggfCBpIHwgaiB8IGsgfCBsCisJICogICAgICAgci0tLS0+fAorCSAqICAgICAgICAgICAgICAgdworCSAqCisJICogdyAtIHVwZGF0ZWQgYnkgZHJpdmVyCisJICogciAtIHVwZGF0ZWQgYnkgZmlybXdhcmUKKwkgKiBzIC0gc3RhcnQgb2Ygb2xkZXN0IEJEIGVudHJ5ICh0eHEtPm9sZGVzdCkKKwkgKiBlIC0gZW5kIG9mIG9sZGVzdCBCRCBlbnRyeQorCSAqCisJICovCisJaWYgKCEoKHIgPD0gdyAmJiAoZSA8IHIgfHwgZSA+PSB3KSkgfHwgKGUgPCByICYmIGUgPj0gdykpKSB7CisJCUlQV19ERUJVR19UWCgiZXhpdCAtIG5vIHByb2Nlc3NlZCBwYWNrZXRzIHJlYWR5IHRvIHJlbGVhc2UuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGlzdF9kZWwoZWxlbWVudCk7CisJREVDX1NUQVQoJnByaXYtPmZ3X3BlbmRfc3RhdCk7CisKKyNpZmRlZiBDT05GSUdfSVBXX0RFQlVHCisJeworCQlpbnQgaSA9IHR4cS0+b2xkZXN0OworCQlJUFdfREVCVUdfVFgoCisJCQkiVFglZCBWPSVwIFA9JTA0WCBUPSUwNFggTD0lZFxuIiwgaSwKKwkJCSZ0eHEtPmRydltpXSwKKwkJCSh1MzIpKHR4cS0+bmljICsgaSAqIHNpemVvZihzdHJ1Y3QgaXB3MjEwMF9iZCkpLAorCQkJdHhxLT5kcnZbaV0uaG9zdF9hZGRyLAorCQkJdHhxLT5kcnZbaV0uYnVmX2xlbmd0aCk7CisKKwkJaWYgKHBhY2tldC0+dHlwZSA9PSBEQVRBKSB7CisJCQlpID0gKGkgKyAxKSAlIHR4cS0+ZW50cmllczsKKworCQkJSVBXX0RFQlVHX1RYKAorCQkJCSJUWCVkIFY9JXAgUD0lMDRYIFQ9JTA0WCBMPSVkXG4iLCBpLAorCQkJCSZ0eHEtPmRydltpXSwKKwkJCQkodTMyKSh0eHEtPm5pYyArIGkgKgorCQkJCXNpemVvZihzdHJ1Y3QgaXB3MjEwMF9iZCkpLAorCQkJCSh1MzIpdHhxLT5kcnZbaV0uaG9zdF9hZGRyLAorCQkJCXR4cS0+ZHJ2W2ldLmJ1Zl9sZW5ndGgpOworCQl9CisJfQorI2VuZGlmCisKKwlzd2l0Y2ggKHBhY2tldC0+dHlwZSkgeworCWNhc2UgREFUQToKKwkJaWYgKHR4cS0+ZHJ2W3R4cS0+b2xkZXN0XS5zdGF0dXMuaW5mby5maWVsZHMudHhUeXBlICE9IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6ICVzOiBRdWV1ZSBtaXNtYXRjaC4gICIKKwkJCSAgICAgICAiRXhwZWN0aW5nIERBVEEgVEJEIGJ1dCBwdWxsZWQgIgorCQkJICAgICAgICJzb21ldGhpbmcgZWxzZTogaWRzICVkPSVkLlxuIiwKKwkJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lLCB0eHEtPm9sZGVzdCwgcGFja2V0LT5pbmRleCk7CisKKwkJLyogREFUQSBwYWNrZXQ7IHdlIGhhdmUgdG8gdW5tYXAgYW5kIGZyZWUgdGhlIFNLQiAqLworCQlwcml2LT5pZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWZvciAoaSA9IDA7IGkgPCBmcmFnX251bTsgaSsrKSB7CisJCQl0YmQgPSAmdHhxLT5kcnZbKHBhY2tldC0+aW5kZXggKyAxICsgaSkgJQorCQkJCQl0eHEtPmVudHJpZXNdOworCisJCQlJUFdfREVCVUdfVFgoCisJCQkJIlRYJWQgUD0lMDh4IEw9JWRcbiIsCisJCQkJKHBhY2tldC0+aW5kZXggKyAxICsgaSkgJSB0eHEtPmVudHJpZXMsCisJCQkJdGJkLT5ob3N0X2FkZHIsIHRiZC0+YnVmX2xlbmd0aCk7CisKKwkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwKKwkJCQkJIHRiZC0+aG9zdF9hZGRyLAorCQkJCQkgdGJkLT5idWZfbGVuZ3RoLAorCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCX0KKworCQlwcml2LT5pZWVlLT5zdGF0cy50eF9ieXRlcyArPSBwYWNrZXQtPmluZm8uZF9zdHJ1Y3QudHhiLT5wYXlsb2FkX3NpemU7CisJCWllZWU4MDIxMV90eGJfZnJlZShwYWNrZXQtPmluZm8uZF9zdHJ1Y3QudHhiKTsKKwkJcGFja2V0LT5pbmZvLmRfc3RydWN0LnR4YiA9IE5VTEw7CisKKwkJbGlzdF9hZGRfdGFpbChlbGVtZW50LCAmcHJpdi0+dHhfZnJlZV9saXN0KTsKKwkJSU5DX1NUQVQoJnByaXYtPnR4X2ZyZWVfc3RhdCk7CisKKwkJLyogV2UgaGF2ZSBhIGZyZWUgc2xvdCBpbiB0aGUgVHggcXVldWUsIHNvIHdha2UgdXAgdGhlCisJCSAqIHRyYW5zbWl0IGxheWVyIGlmIGl0IGlzIHN0b3BwZWQuICovCisJCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCAmJgorCQkgICAgbmV0aWZfcXVldWVfc3RvcHBlZChwcml2LT5uZXRfZGV2KSkgeworCQkJSVBXX0RFQlVHX0lORk8oS0VSTl9JTkZPCisJCQkJCSAgICIlczogV2FraW5nIG5ldCBxdWV1ZS5cbiIsCisJCQkJCSAgIHByaXYtPm5ldF9kZXYtPm5hbWUpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5uZXRfZGV2KTsKKwkJfQorCisJCS8qIEEgcGFja2V0IHdhcyBwcm9jZXNzZWQgYnkgdGhlIGhhcmR3YXJlLCBzbyB1cGRhdGUgdGhlCisJCSAqIHdhdGNoZG9nICovCisJCXByaXYtPm5ldF9kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCQlicmVhazsKKworCWNhc2UgQ09NTUFORDoKKwkJaWYgKHR4cS0+ZHJ2W3R4cS0+b2xkZXN0XS5zdGF0dXMuaW5mby5maWVsZHMudHhUeXBlICE9IDEpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6ICVzOiBRdWV1ZSBtaXNtYXRjaC4gICIKKwkJCSAgICAgICAiRXhwZWN0aW5nIENPTU1BTkQgVEJEIGJ1dCBwdWxsZWQgIgorCQkJICAgICAgICJzb21ldGhpbmcgZWxzZTogaWRzICVkPSVkLlxuIiwKKwkJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lLCB0eHEtPm9sZGVzdCwgcGFja2V0LT5pbmRleCk7CisKKyNpZmRlZiBDT05GSUdfSVBXX0RFQlVHCisJCWlmIChwYWNrZXQtPmluZm8uY19zdHJ1Y3QuY21kLT5ob3N0X2NvbW1hbmRfcmVnIDwKKwkJICAgIHNpemVvZihjb21tYW5kX3R5cGVzKSAvIHNpemVvZigqY29tbWFuZF90eXBlcykpCisJCQlJUFdfREVCVUdfVFgoCisJCQkJIkNvbW1hbmQgJyVzICglZCknIHByb2Nlc3NlZDogJWQuXG4iLAorCQkJCWNvbW1hbmRfdHlwZXNbcGFja2V0LT5pbmZvLmNfc3RydWN0LmNtZC0+aG9zdF9jb21tYW5kX3JlZ10sCisJCQkJcGFja2V0LT5pbmZvLmNfc3RydWN0LmNtZC0+aG9zdF9jb21tYW5kX3JlZywKKwkJCQlwYWNrZXQtPmluZm8uY19zdHJ1Y3QuY21kLT5jbWRfc3RhdHVzX3JlZyk7CisjZW5kaWYKKworCQlsaXN0X2FkZF90YWlsKGVsZW1lbnQsICZwcml2LT5tc2dfZnJlZV9saXN0KTsKKwkJSU5DX1NUQVQoJnByaXYtPm1zZ19mcmVlX3N0YXQpOworCQlicmVhazsKKwl9CisKKwkvKiBhZHZhbmNlIG9sZGVzdCB1c2VkIFRCRCBwb2ludGVyIHRvIHN0YXJ0IG9mIG5leHQgZW50cnkgKi8KKwl0eHEtPm9sZGVzdCA9IChlICsgMSkgJSB0eHEtPmVudHJpZXM7CisJLyogaW5jcmVhc2UgYXZhaWxhYmxlIFRCRHMgbnVtYmVyICovCisJdHhxLT5hdmFpbGFibGUgKz0gZGVzY3JpcHRvcnNfdXNlZDsKKwlTRVRfU1RBVCgmcHJpdi0+dHhxX3N0YXQsIHR4cS0+YXZhaWxhYmxlKTsKKworCUlQV19ERUJVR19UWCgicGFja2V0IGxhdGVuY3kgKHNlbmQgdG8gcHJvY2VzcykgICVsZCBqaWZmaWVzXG4iLAorCQkJIGppZmZpZXMgLSBwYWNrZXQtPmppZmZ5X3N0YXJ0KTsKKworCXJldHVybiAoIWxpc3RfZW1wdHkoJnByaXYtPmZ3X3BlbmRfbGlzdCkpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lwdzIxMDBfdHhfY29tcGxldGUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoX19pcHcyMTAwX3R4X3Byb2Nlc3MocHJpdikgJiYgaSA8IDIwMCkgaSsrOworCisJaWYgKGkgPT0gMjAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogIgorCQkgICAgICAgIiVzOiBEcml2ZXIgaXMgcnVubmluZyBzbG93ICglZCBpdGVycykuXG4iLAorCQkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSwgaSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGlwdzIxMDBfdHhfc2VuZF9jb21tYW5kcyhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisJc3RydWN0IGlwdzIxMDBfdHhfcGFja2V0ICpwYWNrZXQ7CisJc3RydWN0IGlwdzIxMDBfYmRfcXVldWUgKnR4cSA9ICZwcml2LT50eF9xdWV1ZTsKKwlzdHJ1Y3QgaXB3MjEwMF9iZCAqdGJkOworCWludCBuZXh0ID0gdHhxLT5uZXh0OworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwcml2LT5tc2dfcGVuZF9saXN0KSkgeworCQkvKiBpZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UgaW4gVEJEIHF1ZXVlLCB0aGVuCisJCSAqIGRvbid0IHN0dWZmIGEgbmV3IG9uZSBpbi4KKwkJICogTk9URTogMyBhcmUgbmVlZGVkIGFzIGEgY29tbWFuZCB3aWxsIHRha2Ugb25lLAorCQkgKiAgICAgICBhbmQgdGhlcmUgaXMgYSBtaW5pbXVtIG9mIDIgdGhhdCBtdXN0IGJlCisJCSAqICAgICAgIG1haW50YWluZWQgYmV0d2VlbiB0aGUgciBhbmQgdyBpbmRleGVzCisJCSAqLworCQlpZiAodHhxLT5hdmFpbGFibGUgPD0gMykgeworCQkJSVBXX0RFQlVHX1RYKCJubyByb29tIGluIHR4X3F1ZXVlXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZWxlbWVudCA9IHByaXYtPm1zZ19wZW5kX2xpc3QubmV4dDsKKwkJbGlzdF9kZWwoZWxlbWVudCk7CisJCURFQ19TVEFUKCZwcml2LT5tc2dfcGVuZF9zdGF0KTsKKworCQlwYWNrZXQgPSBsaXN0X2VudHJ5KGVsZW1lbnQsCisJCQkJICAgIHN0cnVjdCBpcHcyMTAwX3R4X3BhY2tldCwgbGlzdCk7CisKKwkJSVBXX0RFQlVHX1RYKCJ1c2luZyBUQkQgYXQgdmlydD0lcCwgcGh5cz0lcFxuIiwKKwkJCQkgJnR4cS0+ZHJ2W3R4cS0+bmV4dF0sCisJCQkJICh2b2lkKikodHhxLT5uaWMgKyB0eHEtPm5leHQgKgorCQkJCQkgc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX2JkKSkpOworCisJCXBhY2tldC0+aW5kZXggPSB0eHEtPm5leHQ7CisKKwkJdGJkID0gJnR4cS0+ZHJ2W3R4cS0+bmV4dF07CisKKwkJLyogaW5pdGlhbGl6ZSBUQkQgKi8KKwkJdGJkLT5ob3N0X2FkZHIgPSBwYWNrZXQtPmluZm8uY19zdHJ1Y3QuY21kX3BoeXM7CisJCXRiZC0+YnVmX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXB3MjEwMF9jbWRfaGVhZGVyKTsKKwkJLyogbm90IG1hcmtpbmcgbnVtYmVyIG9mIGZyYWdtZW50cyBjYXVzZXMgcHJvYmxlbXMKKwkJICogd2l0aCBmL3cgZGVidWcgdmVyc2lvbiAqLworCQl0YmQtPm51bV9mcmFnbWVudHMgPSAxOworCQl0YmQtPnN0YXR1cy5pbmZvLmZpZWxkID0KKwkJCUlQV19CRF9TVEFUVVNfVFhfRlJBTUVfQ09NTUFORCB8CisJCQlJUFdfQkRfU1RBVFVTX1RYX0lOVEVSUlVQVF9FTkFCTEU7CisKKwkJLyogdXBkYXRlIFRCRCBxdWV1ZSBjb3VudGVycyAqLworCQl0eHEtPm5leHQrKzsKKwkJdHhxLT5uZXh0ICU9IHR4cS0+ZW50cmllczsKKwkJdHhxLT5hdmFpbGFibGUtLTsKKwkJREVDX1NUQVQoJnByaXYtPnR4cV9zdGF0KTsKKworCQlsaXN0X2FkZF90YWlsKGVsZW1lbnQsICZwcml2LT5md19wZW5kX2xpc3QpOworCQlJTkNfU1RBVCgmcHJpdi0+ZndfcGVuZF9zdGF0KTsKKwl9CisKKwlpZiAodHhxLT5uZXh0ICE9IG5leHQpIHsKKwkJLyoga2ljayBvZmYgdGhlIERNQSBieSBub3RpZnlpbmcgZmlybXdhcmUgdGhlCisJCSAqIHdyaXRlIGluZGV4IGhhcyBtb3ZlZDsgbWFrZSBzdXJlIFRCRCBzdG9yZXMgYXJlIHN5bmMnZCAqLworCQl3bWIoKTsKKwkJd3JpdGVfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwKKwkJCSAgICAgICBJUFdfTUVNX0hPU1RfU0hBUkVEX1RYX1FVRVVFX1dSSVRFX0lOREVYLAorCQkJICAgICAgIHR4cS0+bmV4dCk7CisJfQorfQorCisKKy8qCisgKiBpcHcyMTAwX3R4X3NlbmRfZGF0YQorICoKKyAqLworc3RhdGljIHZvaWQgaXB3MjEwMF90eF9zZW5kX2RhdGEoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OworCXN0cnVjdCBpcHcyMTAwX3R4X3BhY2tldCAqcGFja2V0OworCXN0cnVjdCBpcHcyMTAwX2JkX3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhfcXVldWU7CisJc3RydWN0IGlwdzIxMDBfYmQgKnRiZDsKKwlpbnQgbmV4dCA9IHR4cS0+bmV4dDsKKyAgICAgICAgaW50IGkgPSAwOworCXN0cnVjdCBpcHcyMTAwX2RhdGFfaGVhZGVyICppcHdfaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnByaXYtPnR4X3BlbmRfbGlzdCkpIHsKKwkJLyogaWYgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlIGluIFRCRCBxdWV1ZSwgdGhlbgorCQkgKiBkb24ndCBzdHVmZiBhIG5ldyBvbmUgaW4uCisJCSAqIE5PVEU6IDQgYXJlIG5lZWRlZCBhcyBhIGRhdGEgd2lsbCB0YWtlIHR3bywKKwkJICogICAgICAgYW5kIHRoZXJlIGlzIGEgbWluaW11bSBvZiAyIHRoYXQgbXVzdCBiZQorCQkgKiAgICAgICBtYWludGFpbmVkIGJldHdlZW4gdGhlIHIgYW5kIHcgaW5kZXhlcworCQkgKi8KKwkJZWxlbWVudCA9IHByaXYtPnR4X3BlbmRfbGlzdC5uZXh0OworICAgICAgICAgICAgICAgIHBhY2tldCA9IGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGlwdzIxMDBfdHhfcGFja2V0LCBsaXN0KTsKKworCQlpZiAodW5saWtlbHkoMSArIHBhY2tldC0+aW5mby5kX3N0cnVjdC50eGItPm5yX2ZyYWdzID4KKwkJCSAgICAgSVBXX01BWF9CRFMpKSB7CisJCQkvKiBUT0RPOiBTdXBwb3J0IG1lcmdpbmcgYnVmZmVycyBpZiBtb3JlIHRoYW4KKwkJCSAqIElQV19NQVhfQkRTIGFyZSB1c2VkICovCisJCQlJUFdfREVCVUdfSU5GTygKKwkJCSAgICAgICAiJXM6IE1heGltdW0gQkQgdGhlc2hvbGQgZXhjZWVkZWQuICAiCisJCQkgICAgICAgIkluY3JlYXNlIGZyYWdtZW50YXRpb24gbGV2ZWwuXG4iLAorCQkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUpOworCQl9CisKKwkJaWYgKHR4cS0+YXZhaWxhYmxlIDw9IDMgKworCQkgICAgcGFja2V0LT5pbmZvLmRfc3RydWN0LnR4Yi0+bnJfZnJhZ3MpIHsKKwkJCUlQV19ERUJVR19UWCgibm8gcm9vbSBpbiB0eF9xdWV1ZVxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWxpc3RfZGVsKGVsZW1lbnQpOworCQlERUNfU1RBVCgmcHJpdi0+dHhfcGVuZF9zdGF0KTsKKworCQl0YmQgPSAmdHhxLT5kcnZbdHhxLT5uZXh0XTsKKworCQlwYWNrZXQtPmluZGV4ID0gdHhxLT5uZXh0OworCisJCWlwd19oZHIgPSBwYWNrZXQtPmluZm8uZF9zdHJ1Y3QuZGF0YTsKKwkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGFja2V0LT5pbmZvLmRfc3RydWN0LnR4Yi0+CisJCQlmcmFnbWVudHNbMF0tPmRhdGE7CisKKwkJaWYgKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQkJLyogVG8gRFM6IEFkZHIxID0gQlNTSUQsIEFkZHIyID0gU0EsCisJCQkgICBBZGRyMyA9IERBICovCisJCQltZW1jcHkoaXB3X2hkci0+c3JjX2FkZHIsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJCW1lbWNweShpcHdfaGRyLT5kc3RfYWRkciwgaGRyLT5hZGRyMywgRVRIX0FMRU4pOworCQl9IGVsc2UgaWYgKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQkJLyogbm90IEZyb20vVG8gRFM6IEFkZHIxID0gREEsIEFkZHIyID0gU0EsCisJCQkgICBBZGRyMyA9IEJTU0lEICovCisJCQltZW1jcHkoaXB3X2hkci0+c3JjX2FkZHIsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJCW1lbWNweShpcHdfaGRyLT5kc3RfYWRkciwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCQl9CisKKwkJaXB3X2hkci0+aG9zdF9jb21tYW5kX3JlZyA9IFNFTkQ7CisJCWlwd19oZHItPmhvc3RfY29tbWFuZF9yZWcxID0gMDsKKworCQkvKiBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBob3N0IGJhc2VkIGVuY3J5cHRpb24gKi8KKwkJaXB3X2hkci0+bmVlZHNfZW5jcnlwdGlvbiA9IDA7CisJCWlwd19oZHItPmVuY3J5cHRlZCA9IHBhY2tldC0+aW5mby5kX3N0cnVjdC50eGItPmVuY3J5cHRlZDsKKwkJaWYgKHBhY2tldC0+aW5mby5kX3N0cnVjdC50eGItPm5yX2ZyYWdzID4gMSkKKwkJCWlwd19oZHItPmZyYWdtZW50X3NpemUgPQorCQkJCXBhY2tldC0+aW5mby5kX3N0cnVjdC50eGItPmZyYWdfc2l6ZSAtIElFRUU4MDIxMV8zQUREUl9MRU47CisJCWVsc2UKKwkJCWlwd19oZHItPmZyYWdtZW50X3NpemUgPSAwOworCisJCXRiZC0+aG9zdF9hZGRyID0gcGFja2V0LT5pbmZvLmRfc3RydWN0LmRhdGFfcGh5czsKKwkJdGJkLT5idWZfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX2RhdGFfaGVhZGVyKTsKKwkJdGJkLT5udW1fZnJhZ21lbnRzID0gMSArIHBhY2tldC0+aW5mby5kX3N0cnVjdC50eGItPm5yX2ZyYWdzOworCQl0YmQtPnN0YXR1cy5pbmZvLmZpZWxkID0KKwkJCUlQV19CRF9TVEFUVVNfVFhfRlJBTUVfODAyXzMgfAorCQkJSVBXX0JEX1NUQVRVU19UWF9GUkFNRV9OT1RfTEFTVF9GUkFHTUVOVDsKKwkJdHhxLT5uZXh0Kys7CisJCXR4cS0+bmV4dCAlPSB0eHEtPmVudHJpZXM7CisKKwkJSVBXX0RFQlVHX1RYKAorCQkJImRhdGEgaGVhZGVyIHRiZCBUWCVkIFA9JTA4eCBMPSVkXG4iLAorCQkJcGFja2V0LT5pbmRleCwgdGJkLT5ob3N0X2FkZHIsCisJCQl0YmQtPmJ1Zl9sZW5ndGgpOworI2lmZGVmIENPTkZJR19JUFdfREVCVUcKKwkJaWYgKHBhY2tldC0+aW5mby5kX3N0cnVjdC50eGItPm5yX2ZyYWdzID4gMSkKKwkJCUlQV19ERUJVR19GUkFHKCJmcmFnbWVudCBUeDogJWQgZnJhbWVzXG4iLAorCQkJCSAgICAgICBwYWNrZXQtPmluZm8uZF9zdHJ1Y3QudHhiLT5ucl9mcmFncyk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWNrZXQtPmluZm8uZF9zdHJ1Y3QudHhiLT5ucl9mcmFnczsgaSsrKSB7CisJCSAgICAgICAgdGJkID0gJnR4cS0+ZHJ2W3R4cS0+bmV4dF07CisJCQlpZiAoaSA9PSBwYWNrZXQtPmluZm8uZF9zdHJ1Y3QudHhiLT5ucl9mcmFncyAtIDEpCisJCQkJdGJkLT5zdGF0dXMuaW5mby5maWVsZCA9CisJCQkJCUlQV19CRF9TVEFUVVNfVFhfRlJBTUVfODAyXzMgfAorCQkJCQlJUFdfQkRfU1RBVFVTX1RYX0lOVEVSUlVQVF9FTkFCTEU7CisJCQllbHNlCisJCQkJdGJkLT5zdGF0dXMuaW5mby5maWVsZCA9CisJCQkJCUlQV19CRF9TVEFUVVNfVFhfRlJBTUVfODAyXzMgfAorCQkJCQlJUFdfQkRfU1RBVFVTX1RYX0ZSQU1FX05PVF9MQVNUX0ZSQUdNRU5UOworCisJCQl0YmQtPmJ1Zl9sZW5ndGggPSBwYWNrZXQtPmluZm8uZF9zdHJ1Y3QudHhiLT4KKwkJCQlmcmFnbWVudHNbaV0tPmxlbiAtIElFRUU4MDIxMV8zQUREUl9MRU47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRiZC0+aG9zdF9hZGRyID0gcGNpX21hcF9zaW5nbGUoCisJCQkJcHJpdi0+cGNpX2RldiwKKwkJCQlwYWNrZXQtPmluZm8uZF9zdHJ1Y3QudHhiLT5mcmFnbWVudHNbaV0tPmRhdGEgKworCQkJCUlFRUU4MDIxMV8zQUREUl9MRU4sCisJCQkJdGJkLT5idWZfbGVuZ3RoLAorCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQlJUFdfREVCVUdfVFgoCisJCQkJImRhdGEgZnJhZyB0YmQgVFglZCBQPSUwOHggTD0lZFxuIiwKKwkJCQl0eHEtPm5leHQsIHRiZC0+aG9zdF9hZGRyLCB0YmQtPmJ1Zl9sZW5ndGgpOworCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoCisJCQkJcHJpdi0+cGNpX2RldiwgdGJkLT5ob3N0X2FkZHIsCisJCQkJdGJkLT5idWZfbGVuZ3RoLAorCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQl0eHEtPm5leHQrKzsKKwkJCXR4cS0+bmV4dCAlPSB0eHEtPmVudHJpZXM7CisgICAgICAgICAgICAgICAgfQorCisJCXR4cS0+YXZhaWxhYmxlIC09IDEgKyBwYWNrZXQtPmluZm8uZF9zdHJ1Y3QudHhiLT5ucl9mcmFnczsKKwkJU0VUX1NUQVQoJnByaXYtPnR4cV9zdGF0LCB0eHEtPmF2YWlsYWJsZSk7CisKKwkJbGlzdF9hZGRfdGFpbChlbGVtZW50LCAmcHJpdi0+ZndfcGVuZF9saXN0KTsKKwkJSU5DX1NUQVQoJnByaXYtPmZ3X3BlbmRfc3RhdCk7CisJfQorCisJaWYgKHR4cS0+bmV4dCAhPSBuZXh0KSB7CisJCS8qIGtpY2sgb2ZmIHRoZSBETUEgYnkgbm90aWZ5aW5nIGZpcm13YXJlIHRoZQorCQkgKiB3cml0ZSBpbmRleCBoYXMgbW92ZWQ7IG1ha2Ugc3VyZSBUQkQgc3RvcmVzIGFyZSBzeW5jJ2QgKi8KKwkJd3JpdGVfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwKKwkJCSAgICAgICBJUFdfTUVNX0hPU1RfU0hBUkVEX1RYX1FVRVVFX1dSSVRFX0lOREVYLAorCQkJICAgICAgIHR4cS0+bmV4dCk7CisJfQorICAgICAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGlwdzIxMDBfaXJxX3Rhc2tsZXQoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+bmV0X2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpbnRhLCB0bXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKKwlpcHcyMTAwX2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKKworCXJlYWRfcmVnaXN0ZXIoZGV2LCBJUFdfUkVHX0lOVEEsICZpbnRhKTsKKworCUlQV19ERUJVR19JU1IoImVudGVyIC0gSU5UQTogMHglMDhsWFxuIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpaW50YSAmIElQV19JTlRFUlJVUFRfTUFTSyk7CisKKwlwcml2LT5pbl9pc3IrKzsKKwlwcml2LT5pbnRlcnJ1cHRzKys7CisKKwkvKiBXZSBkbyBub3QgbG9vcCBhbmQga2VlcCBwb2xsaW5nIGZvciBtb3JlIGludGVycnVwdHMgYXMgdGhpcworCSAqIGlzIGZyb3duZWQgdXBvbiBhbmQgZG9lc24ndCBwbGF5IG5pY2VseSB3aXRoIG90aGVyIHBvdGVudGlhbGx5CisJICogY2hhaW5lZCBJUlFzICovCisJSVBXX0RFQlVHX0lTUigiSU5UQTogMHglMDhsWFxuIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpaW50YSAmIElQV19JTlRFUlJVUFRfTUFTSyk7CisKKwlpZiAoaW50YSAmIElQVzIxMDBfSU5UQV9GQVRBTF9FUlJPUikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCQkJICAiOiBGYXRhbCBpbnRlcnJ1cHQuIFNjaGVkdWxpbmcgZmlybXdhcmUgcmVzdGFydC5cbiIpOworCQlwcml2LT5pbnRhX290aGVyKys7CisJCXdyaXRlX3JlZ2lzdGVyKAorCQkJZGV2LCBJUFdfUkVHX0lOVEEsCisJCQlJUFcyMTAwX0lOVEFfRkFUQUxfRVJST1IpOworCisJCXJlYWRfbmljX2R3b3JkKGRldiwgSVBXX05JQ19GQVRBTF9FUlJPUiwgJnByaXYtPmZhdGFsX2Vycm9yKTsKKwkJSVBXX0RFQlVHX0lORk8oIiVzOiBGYXRhbCBlcnJvciB2YWx1ZTogMHglMDhYXG4iLAorCQkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUsIHByaXYtPmZhdGFsX2Vycm9yKTsKKworCQlyZWFkX25pY19kd29yZChkZXYsIElQV19FUlJPUl9BRERSKHByaXYtPmZhdGFsX2Vycm9yKSwgJnRtcCk7CisJCUlQV19ERUJVR19JTkZPKCIlczogRmF0YWwgZXJyb3IgYWRkcmVzcyB2YWx1ZTogMHglMDhYXG4iLAorCQkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUsIHRtcCk7CisKKwkJLyogV2FrZSB1cCBhbnkgc2xlZXBpbmcgam9icyAqLworCQlzY2hlZHVsZV9yZXNldChwcml2KTsKKwl9CisKKwlpZiAoaW50YSAmIElQVzIxMDBfSU5UQV9QQVJJVFlfRVJST1IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6ICoqKioqIFBBUklUWSBFUlJPUiBJTlRFUlJVUFQgISEhISBcbiIpOworCQlwcml2LT5pbnRhX290aGVyKys7CisJCXdyaXRlX3JlZ2lzdGVyKAorCQkJZGV2LCBJUFdfUkVHX0lOVEEsCisJCQlJUFcyMTAwX0lOVEFfUEFSSVRZX0VSUk9SKTsKKwl9CisKKwlpZiAoaW50YSAmIElQVzIxMDBfSU5UQV9SWF9UUkFOU0ZFUikgeworCQlJUFdfREVCVUdfSVNSKCJSWCBpbnRlcnJ1cHRcbiIpOworCisJCXByaXYtPnJ4X2ludGVycnVwdHMrKzsKKworCQl3cml0ZV9yZWdpc3RlcigKKwkJCWRldiwgSVBXX1JFR19JTlRBLAorCQkJSVBXMjEwMF9JTlRBX1JYX1RSQU5TRkVSKTsKKworCQlfX2lwdzIxMDBfcnhfcHJvY2Vzcyhwcml2KTsKKwkJX19pcHcyMTAwX3R4X2NvbXBsZXRlKHByaXYpOworCX0KKworCWlmIChpbnRhICYgSVBXMjEwMF9JTlRBX1RYX1RSQU5TRkVSKSB7CisJCUlQV19ERUJVR19JU1IoIlRYIGludGVycnVwdFxuIik7CisKKwkJcHJpdi0+dHhfaW50ZXJydXB0cysrOworCisJCXdyaXRlX3JlZ2lzdGVyKGRldiwgSVBXX1JFR19JTlRBLAorCQkJICAgICAgIElQVzIxMDBfSU5UQV9UWF9UUkFOU0ZFUik7CisKKwkJX19pcHcyMTAwX3R4X2NvbXBsZXRlKHByaXYpOworCQlpcHcyMTAwX3R4X3NlbmRfY29tbWFuZHMocHJpdik7CisJCWlwdzIxMDBfdHhfc2VuZF9kYXRhKHByaXYpOworCX0KKworCWlmIChpbnRhICYgSVBXMjEwMF9JTlRBX1RYX0NPTVBMRVRFKSB7CisJCUlQV19ERUJVR19JU1IoIlRYIGNvbXBsZXRlXG4iKTsKKwkJcHJpdi0+aW50YV9vdGhlcisrOworCQl3cml0ZV9yZWdpc3RlcigKKwkJCWRldiwgSVBXX1JFR19JTlRBLAorCQkJSVBXMjEwMF9JTlRBX1RYX0NPTVBMRVRFKTsKKworCQlfX2lwdzIxMDBfdHhfY29tcGxldGUocHJpdik7CisJfQorCisJaWYgKGludGEgJiBJUFcyMTAwX0lOVEFfRVZFTlRfSU5URVJSVVBUKSB7CisJCS8qIGlwdzIxMDBfaGFuZGxlX2V2ZW50KGRldik7ICovCisJCXByaXYtPmludGFfb3RoZXIrKzsKKwkJd3JpdGVfcmVnaXN0ZXIoCisJCQlkZXYsIElQV19SRUdfSU5UQSwKKwkJCUlQVzIxMDBfSU5UQV9FVkVOVF9JTlRFUlJVUFQpOworCX0KKworCWlmIChpbnRhICYgSVBXMjEwMF9JTlRBX0ZXX0lOSVRfRE9ORSkgeworCQlJUFdfREVCVUdfSVNSKCJGVyBpbml0IGRvbmUgaW50ZXJydXB0XG4iKTsKKwkJcHJpdi0+aW50YV9vdGhlcisrOworCisJCXJlYWRfcmVnaXN0ZXIoZGV2LCBJUFdfUkVHX0lOVEEsICZ0bXApOworCQlpZiAodG1wICYgKElQVzIxMDBfSU5UQV9GQVRBTF9FUlJPUiB8CisJCQkgICBJUFcyMTAwX0lOVEFfUEFSSVRZX0VSUk9SKSkgeworCQkJd3JpdGVfcmVnaXN0ZXIoCisJCQkJZGV2LCBJUFdfUkVHX0lOVEEsCisJCQkJSVBXMjEwMF9JTlRBX0ZBVEFMX0VSUk9SIHwKKwkJCQlJUFcyMTAwX0lOVEFfUEFSSVRZX0VSUk9SKTsKKwkJfQorCisJCXdyaXRlX3JlZ2lzdGVyKGRldiwgSVBXX1JFR19JTlRBLAorCQkJICAgICAgIElQVzIxMDBfSU5UQV9GV19JTklUX0RPTkUpOworCX0KKworCWlmIChpbnRhICYgSVBXMjEwMF9JTlRBX1NUQVRVU19DSEFOR0UpIHsKKwkJSVBXX0RFQlVHX0lTUigiU3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHRcbiIpOworCQlwcml2LT5pbnRhX290aGVyKys7CisJCXdyaXRlX3JlZ2lzdGVyKAorCQkJZGV2LCBJUFdfUkVHX0lOVEEsCisJCQlJUFcyMTAwX0lOVEFfU1RBVFVTX0NIQU5HRSk7CisJfQorCisJaWYgKGludGEgJiBJUFcyMTAwX0lOVEFfU0xBVkVfTU9ERV9IT1NUX0NPTU1BTkRfRE9ORSkgeworCQlJUFdfREVCVUdfSVNSKCJzbGF2ZSBob3N0IG1vZGUgaW50ZXJydXB0XG4iKTsKKwkJcHJpdi0+aW50YV9vdGhlcisrOworCQl3cml0ZV9yZWdpc3RlcigKKwkJCWRldiwgSVBXX1JFR19JTlRBLAorCQkJSVBXMjEwMF9JTlRBX1NMQVZFX01PREVfSE9TVF9DT01NQU5EX0RPTkUpOworCX0KKworCXByaXYtPmluX2lzci0tOworCWlwdzIxMDBfZW5hYmxlX2ludGVycnVwdHMocHJpdik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb3dfbG9jaywgZmxhZ3MpOworCisJSVBXX0RFQlVHX0lTUigiZXhpdFxuIik7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IGlwdzIxMDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEsCisJCQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gZGF0YTsKKwl1MzIgaW50YSwgaW50YV9tYXNrOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKyAJc3Bpbl9sb2NrKCZwcml2LT5sb3dfbG9jayk7CisKKwkvKiBXZSBjaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIGJlIGlnbm9yaW5nIGludGVycnVwdHMgYmVmb3JlCisJICogd2UgdG91Y2ggdGhlIGhhcmR3YXJlLiAgRHVyaW5nIHVjb2RlIGxvYWQgaWYgd2UgdHJ5IGFuZCBoYW5kbGUKKwkgKiBhbiBpbnRlcnJ1cHQgd2UgY2FuIGNhdXNlIGtleWJvYXJkIHByb2JsZW1zIGFzIHdlbGwgYXMgY2F1c2UKKwkgKiB0aGUgdWNvZGUgdG8gZmFpbCB0byBpbml0aWFsaXplICovCisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0lOVF9FTkFCTEVEKSkgeworCQkvKiBTaGFyZWQgSVJRICovCisJCWdvdG8gbm9uZTsKKwl9CisKKwlyZWFkX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfSU5UQV9NQVNLLCAmaW50YV9tYXNrKTsKKwlyZWFkX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfSU5UQSwgJmludGEpOworCisJaWYgKGludGEgPT0gMHhGRkZGRkZGRikgeworCQkvKiBIYXJkd2FyZSBkaXNhcHBlYXJlZCAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IElSUSBJTlRBID09IDB4RkZGRkZGRkZcbiIpOworCQlnb3RvIG5vbmU7CisJfQorCisJaW50YSAmPSBJUFdfSU5URVJSVVBUX01BU0s7CisKKwlpZiAoIShpbnRhICYgaW50YV9tYXNrKSkgeworCQkvKiBTaGFyZWQgaW50ZXJydXB0ICovCisJCWdvdG8gbm9uZTsKKwl9CisKKwkvKiBXZSBkaXNhYmxlIHRoZSBoYXJkd2FyZSBpbnRlcnJ1cHQgaGVyZSBqdXN0IHRvIHByZXZlbnQgdW5uZWVkZWQKKwkgKiBjYWxscyB0byBiZSBtYWRlLiAgV2UgZGlzYWJsZSB0aGlzIGFnYWluIHdpdGhpbiB0aGUgYWN0dWFsCisJICogd29yayB0YXNrbGV0LCBzbyBpZiBhbm90aGVyIHBhcnQgb2YgdGhlIGNvZGUgcmUtZW5hYmxlcyB0aGUKKwkgKiBpbnRlcnJ1cHQsIHRoYXQgaXMgZmluZSAqLworCWlwdzIxMDBfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOworCisJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3Rhc2tsZXQpOworIAlzcGluX3VubG9jaygmcHJpdi0+bG93X2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworIG5vbmU6CisJc3Bpbl91bmxvY2soJnByaXYtPmxvd19sb2NrKTsKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF90eChzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisJc3RydWN0IGlwdzIxMDBfdHhfcGFja2V0ICpwYWNrZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb3dfbG9jaywgZmxhZ3MpOworCisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0FTU09DSUFURUQpKSB7CisJCUlQV19ERUJVR19JTkZPKCJDYW4gbm90IHRyYW5zbWl0IHdoZW4gbm90IGNvbm5lY3RlZC5cbiIpOworCQlwcml2LT5pZWVlLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCWdvdG8gZmFpbF91bmxvY2s7CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJnByaXYtPnR4X2ZyZWVfbGlzdCkpCisJCWdvdG8gZmFpbF91bmxvY2s7CisKKwllbGVtZW50ID0gcHJpdi0+dHhfZnJlZV9saXN0Lm5leHQ7CisJcGFja2V0ID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaXB3MjEwMF90eF9wYWNrZXQsIGxpc3QpOworCisJcGFja2V0LT5pbmZvLmRfc3RydWN0LnR4YiA9IHR4YjsKKworCUlQV19ERUJVR19UWCgiU2VuZGluZyBmcmFnbWVudCAoJWQgYnl0ZXMpOlxuIiwKKwkJCSB0eGItPmZyYWdtZW50c1swXS0+bGVuKTsKKwlwcmludGtfYnVmKElQV19ETF9UWCwgdHhiLT5mcmFnbWVudHNbMF0tPmRhdGEsCisJCSAgIHR4Yi0+ZnJhZ21lbnRzWzBdLT5sZW4pOworCisJcGFja2V0LT5qaWZmeV9zdGFydCA9IGppZmZpZXM7CisKKwlsaXN0X2RlbChlbGVtZW50KTsKKwlERUNfU1RBVCgmcHJpdi0+dHhfZnJlZV9zdGF0KTsKKworCWxpc3RfYWRkX3RhaWwoZWxlbWVudCwgJnByaXYtPnR4X3BlbmRfbGlzdCk7CisJSU5DX1NUQVQoJnByaXYtPnR4X3BlbmRfc3RhdCk7CisKKwlpcHcyMTAwX3R4X3NlbmRfZGF0YShwcml2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvd19sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7CisKKyBmYWlsX3VubG9jazoKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGlwdzIxMDBfbXNnX2FsbG9jYXRlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJaW50IGksIGosIGVyciA9IC1FSU5WQUw7CisJdm9pZCAqdjsKKwlkbWFfYWRkcl90IHA7CisKKwlwcml2LT5tc2dfYnVmZmVycyA9IChzdHJ1Y3QgaXB3MjEwMF90eF9wYWNrZXQgKilrbWFsbG9jKAorCQlJUFdfQ09NTUFORF9QT09MX1NJWkUgKiBzaXplb2Yoc3RydWN0IGlwdzIxMDBfdHhfcGFja2V0KSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5tc2dfYnVmZmVycykgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXM6IFBDSSBhbGxvYyBmYWlsZWQgZm9yIG1zZyAiCisJCSAgICAgICAiYnVmZmVycy5cbiIsIHByaXYtPm5ldF9kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgSVBXX0NPTU1BTkRfUE9PTF9TSVpFOyBpKyspIHsKKwkJdiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KAorCQkJcHJpdi0+cGNpX2RldiwKKwkJCXNpemVvZihzdHJ1Y3QgaXB3MjEwMF9jbWRfaGVhZGVyKSwKKwkJCSZwKTsKKwkJaWYgKCF2KSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogIgorCQkJICAgICAgICIlczogUENJIGFsbG9jIGZhaWxlZCBmb3IgbXNnICIKKwkJCSAgICAgICAiYnVmZmVycy5cbiIsCisJCQkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSk7CisJCQllcnIgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQltZW1zZXQodiwgMCwgc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX2NtZF9oZWFkZXIpKTsKKworCQlwcml2LT5tc2dfYnVmZmVyc1tpXS50eXBlID0gQ09NTUFORDsKKwkJcHJpdi0+bXNnX2J1ZmZlcnNbaV0uaW5mby5jX3N0cnVjdC5jbWQgPQorCQkJKHN0cnVjdCBpcHcyMTAwX2NtZF9oZWFkZXIqKXY7CisJCXByaXYtPm1zZ19idWZmZXJzW2ldLmluZm8uY19zdHJ1Y3QuY21kX3BoeXMgPSBwOworCX0KKworCWlmIChpID09IElQV19DT01NQU5EX1BPT0xfU0laRSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoCisJCQlwcml2LT5wY2lfZGV2LAorCQkJc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX2NtZF9oZWFkZXIpLAorCQkJcHJpdi0+bXNnX2J1ZmZlcnNbal0uaW5mby5jX3N0cnVjdC5jbWQsCisJCQlwcml2LT5tc2dfYnVmZmVyc1tqXS5pbmZvLmNfc3RydWN0LmNtZF9waHlzKTsKKwl9CisKKwlrZnJlZShwcml2LT5tc2dfYnVmZmVycyk7CisJcHJpdi0+bXNnX2J1ZmZlcnMgPSBOVUxMOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpcHcyMTAwX21zZ19pbml0aWFsaXplKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJaW50IGk7CisKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+bXNnX2ZyZWVfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPm1zZ19wZW5kX2xpc3QpOworCisJZm9yIChpID0gMDsgaSA8IElQV19DT01NQU5EX1BPT0xfU0laRTsgaSsrKQorCQlsaXN0X2FkZF90YWlsKCZwcml2LT5tc2dfYnVmZmVyc1tpXS5saXN0LCAmcHJpdi0+bXNnX2ZyZWVfbGlzdCk7CisJU0VUX1NUQVQoJnByaXYtPm1zZ19mcmVlX3N0YXQsIGkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwdzIxMDBfbXNnX2ZyZWUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwlpbnQgaTsKKworCWlmICghcHJpdi0+bXNnX2J1ZmZlcnMpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBJUFdfQ09NTUFORF9QT09MX1NJWkU7IGkrKykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBjaV9kZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgaXB3MjEwMF9jbWRfaGVhZGVyKSwKKwkJCQkgICAgcHJpdi0+bXNnX2J1ZmZlcnNbaV0uaW5mby5jX3N0cnVjdC5jbWQsCisJCQkJICAgIHByaXYtPm1zZ19idWZmZXJzW2ldLmluZm8uY19zdHJ1Y3QuY21kX3BoeXMpOworCX0KKworCWtmcmVlKHByaXYtPm1zZ19idWZmZXJzKTsKKwlwcml2LT5tc2dfYnVmZmVycyA9IE5VTEw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcGNpKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gY29udGFpbmVyX29mKGQsIHN0cnVjdCBwY2lfZGV2LCBkZXYpOworCWNoYXIgKm91dCA9IGJ1ZjsKKwlpbnQgaSwgajsKKwl1MzIgdmFsOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiWyUwOFhdICIsIGkgKiAxNik7CisJCWZvciAoaiA9IDA7IGogPCAxNjsgaiArPSA0KSB7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgaSAqIDE2ICsgaiwgJnZhbCk7CisJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMDhYICIsIHZhbCk7CisJCX0KKwkJb3V0ICs9IHNwcmludGYob3V0LCAiXG4iKTsKKwl9CisKKwlyZXR1cm4gb3V0IC0gYnVmOworfQorc3RhdGljIERFVklDRV9BVFRSKHBjaSwgU19JUlVHTywgc2hvd19wY2ksIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2NmZyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwID0gZC0+ZHJpdmVyX2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDh4XG4iLCAoaW50KXAtPmNvbmZpZyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoY2ZnLCBTX0lSVUdPLCBzaG93X2NmZywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnAgPSBkLT5kcml2ZXJfZGF0YTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsIChpbnQpcC0+c3RhdHVzKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihzdGF0dXMsIFNfSVJVR08sIHNob3dfc3RhdHVzLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19jYXBhYmlsaXR5KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwID0gZC0+ZHJpdmVyX2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDh4XG4iLCAoaW50KXAtPmNhcGFiaWxpdHkpOworfQorc3RhdGljIERFVklDRV9BVFRSKGNhcGFiaWxpdHksIFNfSVJVR08sIHNob3dfY2FwYWJpbGl0eSwgTlVMTCk7CisKKworI2RlZmluZSBJUFcyMTAwX1JFRyh4KSB7IElQV18gIyN4LCAjeCB9CitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1MzIgYWRkcjsKKwljb25zdCBjaGFyICpuYW1lOworfSBod19kYXRhW10gPSB7CisJSVBXMjEwMF9SRUcoUkVHX0dQX0NOVFJMKSwKKwlJUFcyMTAwX1JFRyhSRUdfR1BJTyksCisJSVBXMjEwMF9SRUcoUkVHX0lOVEEpLAorCUlQVzIxMDBfUkVHKFJFR19JTlRBX01BU0spLAorCUlQVzIxMDBfUkVHKFJFR19SRVNFVF9SRUcpLAorfTsKKyNkZWZpbmUgSVBXMjEwMF9OSUMoeCwgcykgeyB4LCAjeCwgcyB9CitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1MzIgYWRkcjsKKwljb25zdCBjaGFyICpuYW1lOworCXNpemVfdCBzaXplOworfSBuaWNfZGF0YVtdID0geworCUlQVzIxMDBfTklDKElQVzIxMDBfQ09OVFJPTF9SRUcsIDIpLAorCUlQVzIxMDBfTklDKDB4MjEwMDE0LCAxKSwKKwlJUFcyMTAwX05JQygweDIxMDAwMCwgMSksCit9OworI2RlZmluZSBJUFcyMTAwX09SRCh4LCBkKSB7IElQV19PUkRfICMjeCwgI3gsIGQgfQorc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdTggaW5kZXg7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpkZXNjOworfSBvcmRfZGF0YVtdID0geworCUlQVzIxMDBfT1JEKFNUQVRfVFhfSE9TVF9SRVFVRVNUUywgInJlcXVlc3RlZCBIb3N0IFR4J3MgKE1TRFUpIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9IT1NUX0NPTVBMRVRFLCAic3VjY2Vzc2Z1bCBIb3N0IFR4J3MgKE1TRFUpIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9ESVJfREFUQSwJICAgInN1Y2Nlc3NmdWwgRGlyZWN0ZWQgVHgncyAoTVNEVSkiKSwKKwlJUFcyMTAwX09SRChTVEFUX1RYX0RJUl9EQVRBMSwJICAgInN1Y2Nlc3NmdWwgRGlyZWN0ZWQgVHgncyAoTVNEVSkgQCAxTUIiKSwKKwlJUFcyMTAwX09SRChTVEFUX1RYX0RJUl9EQVRBMiwJICAgInN1Y2Nlc3NmdWwgRGlyZWN0ZWQgVHgncyAoTVNEVSkgQCAyTUIiKSwKKwlJUFcyMTAwX09SRChTVEFUX1RYX0RJUl9EQVRBNV81LCAgICJzdWNjZXNzZnVsIERpcmVjdGVkIFR4J3MgKE1TRFUpIEAgNV81TUIiKSwKKwlJUFcyMTAwX09SRChTVEFUX1RYX0RJUl9EQVRBMTEsCSAgICJzdWNjZXNzZnVsIERpcmVjdGVkIFR4J3MgKE1TRFUpIEAgMTFNQiIpLAorCUlQVzIxMDBfT1JEKFNUQVRfVFhfTk9ESVJfREFUQTEsICAgInN1Y2Nlc3NmdWwgTm9uX0RpcmVjdGVkIFR4J3MgKE1TRFUpIEAgMU1CIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9OT0RJUl9EQVRBMiwgICAic3VjY2Vzc2Z1bCBOb25fRGlyZWN0ZWQgVHgncyAoTVNEVSkgQCAyTUIiKSwKKwlJUFcyMTAwX09SRChTVEFUX1RYX05PRElSX0RBVEE1XzUsICJzdWNjZXNzZnVsIE5vbl9EaXJlY3RlZCBUeCdzIChNU0RVKSBAIDUuNU1CIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9OT0RJUl9EQVRBMTEsICAic3VjY2Vzc2Z1bCBOb25fRGlyZWN0ZWQgVHgncyAoTVNEVSkgQCAxMU1CIiksCisJSVBXMjEwMF9PUkQoU1RBVF9OVUxMX0RBVEEsCSAgICJzdWNjZXNzZnVsIE5VTEwgZGF0YSBUeCdzIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9SVFMsCSAgICJzdWNjZXNzZnVsIFR4IFJUUyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfVFhfQ1RTLAkgICAic3VjY2Vzc2Z1bCBUeCBDVFMiKSwKKwlJUFcyMTAwX09SRChTVEFUX1RYX0FDSywJICAgInN1Y2Nlc3NmdWwgVHggQUNLIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9BU1NOLAkgICAic3VjY2Vzc2Z1bCBBc3NvY2lhdGlvbiBUeCdzIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9BU1NOX1JFU1AsCSAgICJzdWNjZXNzZnVsIEFzc29jaWF0aW9uIHJlc3BvbnNlIFR4J3MiKSwKKwlJUFcyMTAwX09SRChTVEFUX1RYX1JFQVNTTiwJICAgInN1Y2Nlc3NmdWwgUmVhc3NvY2lhdGlvbiBUeCdzIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9SRUFTU05fUkVTUCwgICAic3VjY2Vzc2Z1bCBSZWFzc29jaWF0aW9uIHJlc3BvbnNlIFR4J3MiKSwKKwlJUFcyMTAwX09SRChTVEFUX1RYX1BST0JFLAkgICAicHJvYmVzIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCIpLAorCUlQVzIxMDBfT1JEKFNUQVRfVFhfUFJPQkVfUkVTUCwJICAgInByb2JlIHJlc3BvbnNlcyBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQiKSwKKwlJUFcyMTAwX09SRChTVEFUX1RYX0JFQUNPTiwJICAgInR4IGJlYWNvbiIpLAorCUlQVzIxMDBfT1JEKFNUQVRfVFhfQVRJTSwJICAgIlR4IEFUSU0iKSwKKwlJUFcyMTAwX09SRChTVEFUX1RYX0RJU0FTU04sCSAgICJzdWNjZXNzZnVsIERpc2Fzc29jaWF0aW9uIFRYIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9BVVRILAkgICAic3VjY2Vzc2Z1bCBBdXRoZW50aWNhdGlvbiBUeCIpLAorCUlQVzIxMDBfT1JEKFNUQVRfVFhfREVBVVRILAkgICAic3VjY2Vzc2Z1bCBEZWF1dGhlbnRpY2F0aW9uIFRYIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9UT1RBTF9CWVRFUywgICAiVG90YWwgc3VjY2Vzc2Z1bCBUeCBkYXRhIGJ5dGVzIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9SRVRSSUVTLCAgICAgICAiVHggcmV0cmllcyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfVFhfUkVUUlkxLCAgICAgICAgIlR4IHJldHJpZXMgYXQgMU1CUFMiKSwKKwlJUFcyMTAwX09SRChTVEFUX1RYX1JFVFJZMiwgICAgICAgICJUeCByZXRyaWVzIGF0IDJNQlBTIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9SRVRSWTVfNSwJICAgIlR4IHJldHJpZXMgYXQgNS41TUJQUyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfVFhfUkVUUlkxMSwJICAgIlR4IHJldHJpZXMgYXQgMTFNQlBTIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9GQUlMVVJFUywJICAgIlR4IEZhaWx1cmVzIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9NQVhfVFJJRVNfSU5fSE9QLCJ0aW1lcyBtYXggdHJpZXMgaW4gYSBob3AgZmFpbGVkIiksCisJSVBXMjEwMF9PUkQoU1RBVF9UWF9ESVNBU1NOX0ZBSUwsCSJ0aW1lcyBkaXNhc3NvY2lhdGlvbiBmYWlsZWQiKSwKKwlJUFcyMTAwX09SRChTVEFUX1RYX0VSUl9DVFMsICAgICAgICAgIm1pc3NlZC9iYWQgQ1RTIGZyYW1lcyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfVFhfRVJSX0FDSywJInR4IGVyciBkdWUgdG8gYWNrcyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfSE9TVCwJInBhY2tldHMgcGFzc2VkIHRvIGhvc3QiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX0RJUl9EQVRBLAkiZGlyZWN0ZWQgcGFja2V0cyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfRElSX0RBVEExLAkiZGlyZWN0ZWQgcGFja2V0cyBhdCAxTUIiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX0RJUl9EQVRBMiwJImRpcmVjdGVkIHBhY2tldHMgYXQgMk1CIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9ESVJfREFUQTVfNSwJImRpcmVjdGVkIHBhY2tldHMgYXQgNS41TUIiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX0RJUl9EQVRBMTEsCSJkaXJlY3RlZCBwYWNrZXRzIGF0IDExTUIiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX05PRElSX0RBVEEsIm5vbmRpcmVjdGVkIHBhY2tldHMiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX05PRElSX0RBVEExLAkibm9uZGlyZWN0ZWQgcGFja2V0cyBhdCAxTUIiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX05PRElSX0RBVEEyLAkibm9uZGlyZWN0ZWQgcGFja2V0cyBhdCAyTUIiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX05PRElSX0RBVEE1XzUsCSJub25kaXJlY3RlZCBwYWNrZXRzIGF0IDUuNU1CIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9OT0RJUl9EQVRBMTEsCSJub25kaXJlY3RlZCBwYWNrZXRzIGF0IDExTUIiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX05VTExfREFUQSwJIm51bGwgZGF0YSByeCdzIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9SVFMsCSJSeCBSVFMiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX0NUUywJIlJ4IENUUyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfQUNLLAkiUnggQUNLIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9DRkVORCwJIlJ4IENGIEVuZCIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfQ0ZFTkRfQUNLLAkiUnggQ0YgRW5kICsgQ0YgQWNrIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9BU1NOLAkiQXNzb2NpYXRpb24gUngncyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfQVNTTl9SRVNQLAkiQXNzb2NpYXRpb24gcmVzcG9uc2UgUngncyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfUkVBU1NOLAkiUmVhc3NvY2lhdGlvbiBSeCdzIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9SRUFTU05fUkVTUCwJIlJlYXNzb2NpYXRpb24gcmVzcG9uc2UgUngncyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfUFJPQkUsCSJwcm9iZSBSeCdzIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9QUk9CRV9SRVNQLAkicHJvYmUgcmVzcG9uc2UgUngncyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfQkVBQ09OLAkiUnggYmVhY29uIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9BVElNLAkiUnggQVRJTSIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfRElTQVNTTiwJImRpc2Fzc29jaWF0aW9uIFJ4IiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9BVVRILAkiYXV0aGVudGljYXRpb24gUngiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX0RFQVVUSCwJImRlYXV0aGVudGljYXRpb24gUngiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX1RPVEFMX0JZVEVTLCJUb3RhbCByeCBkYXRhIGJ5dGVzIHJlY2VpdmVkIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9FUlJfQ1JDLAkgInBhY2tldHMgd2l0aCBSeCBDUkMgZXJyb3IiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX0VSUl9DUkMxLAkgIlJ4IENSQyBlcnJvcnMgYXQgMU1CIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9FUlJfQ1JDMiwJICJSeCBDUkMgZXJyb3JzIGF0IDJNQiIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfRVJSX0NSQzVfNSwJICJSeCBDUkMgZXJyb3JzIGF0IDUuNU1CIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9FUlJfQ1JDMTEsCSAiUnggQ1JDIGVycm9ycyBhdCAxMU1CIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9EVVBMSUNBVEUxLCAiZHVwbGljYXRlIHJ4IHBhY2tldHMgYXQgMU1CIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9EVVBMSUNBVEUyLAkgImR1cGxpY2F0ZSByeCBwYWNrZXRzIGF0IDJNQiIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfRFVQTElDQVRFNV81LAkgImR1cGxpY2F0ZSByeCBwYWNrZXRzIGF0IDUuNU1CIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9EVVBMSUNBVEUxMSwJICJkdXBsaWNhdGUgcnggcGFja2V0cyBhdCAxMU1CIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9EVVBMSUNBVEUsICJkdXBsaWNhdGUgcnggcGFja2V0cyIpLAorCUlQVzIxMDBfT1JEKFBFUlNfREJfTE9DSywJImxvY2tpbmcgZncgcGVybWFuZW50ICBkYiIpLAorCUlQVzIxMDBfT1JEKFBFUlNfREJfU0laRSwJInNpemUgb2YgZncgcGVybWFuZW50ICBkYiIpLAorCUlQVzIxMDBfT1JEKFBFUlNfREJfQUREUiwJImFkZHJlc3Mgb2YgZncgcGVybWFuZW50ICBkYiIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfSU5WQUxJRF9QUk9UT0NPTCwJInJ4IGZyYW1lcyB3aXRoIGludmFsaWQgcHJvdG9jb2wiKSwKKwlJUFcyMTAwX09SRChTWVNfQk9PVF9USU1FLAkiQm9vdCB0aW1lIiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9OT19CVUZGRVIsCSJyeCBmcmFtZXMgcmVqZWN0ZWQgZHVlIHRvIG5vIGJ1ZmZlciIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfTUlTU0lOR19GUkFHLAkicnggZnJhbWVzIGRyb3BwZWQgZHVlIHRvIG1pc3NpbmcgZnJhZ21lbnQiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX09SUEhBTl9GUkFHLAkicnggZnJhbWVzIGRyb3BwZWQgZHVlIHRvIG5vbi1zZXF1ZW50aWFsIGZyYWdtZW50IiksCisJSVBXMjEwMF9PUkQoU1RBVF9SWF9PUlBIQU5fRlJBTUUsCSJyeCBmcmFtZXMgZHJvcHBlZCBkdWUgdG8gdW5tYXRjaGVkIDFzdCBmcmFtZSIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUlhfRlJBR19BR0VPVVQsCSJyeCBmcmFtZXMgZHJvcHBlZCBkdWUgdG8gdW5jb21wbGV0ZWQgZnJhbWUiKSwKKwlJUFcyMTAwX09SRChTVEFUX1JYX0lDVl9FUlJPUlMsCSJJQ1YgZXJyb3JzIGR1cmluZyBkZWNyeXB0aW9uIiksCisJSVBXMjEwMF9PUkQoU1RBVF9QU1BfU1VTUEVOU0lPTiwidGltZXMgYWRhcHRlciBzdXNwZW5kZWQiKSwKKwlJUFcyMTAwX09SRChTVEFUX1BTUF9CQ05fVElNRU9VVCwJImJlYWNvbiB0aW1lb3V0IiksCisJSVBXMjEwMF9PUkQoU1RBVF9QU1BfUE9MTF9USU1FT1VULAkicG9sbCByZXNwb25zZSB0aW1lb3V0cyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUFNQX05PTkRJUl9USU1FT1VULCAidGltZW91dHMgd2FpdGluZyBmb3IgbGFzdCB7YnJvYWQsbXVsdGl9Y2FzdCBwa3QiKSwKKwlJUFcyMTAwX09SRChTVEFUX1BTUF9SWF9EVElNUywJIlBTUCBEVElNcyByZWNlaXZlZCIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUFNQX1JYX1RJTVMsCSJQU1AgVElNcyByZWNlaXZlZCIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUFNQX1NUQVRJT05fSUQsIlBTUCBTdGF0aW9uIElEIiksCisJSVBXMjEwMF9PUkQoTEFTVF9BU1NOX1RJTUUsCSJSVEMgdGltZSBvZiBsYXN0IGFzc29jaWF0aW9uIiksCisJSVBXMjEwMF9PUkQoU1RBVF9QRVJDRU5UX01JU1NFRF9CQ05TLCJjdXJyZW50IGNhbGN1bGF0aW9uIG9mICUgbWlzc2VkIGJlYWNvbnMiKSwKKwlJUFcyMTAwX09SRChTVEFUX1BFUkNFTlRfUkVUUklFUywiY3VycmVudCBjYWxjdWxhdGlvbiBvZiAlIG1pc3NlZCB0eCByZXRyaWVzIiksCisJSVBXMjEwMF9PUkQoQVNTT0NJQVRFRF9BUF9QVFIsCSIwIGlmIG5vdCBhc3NvY2lhdGVkLCBlbHNlIHBvaW50ZXIgdG8gQVAgdGFibGUgZW50cnkiKSwKKwlJUFcyMTAwX09SRChBVkFJTEFCTEVfQVBfQ05ULAkiQVAncyBkZWNzcmliZWQgaW4gdGhlIEFQIHRhYmxlIiksCisJSVBXMjEwMF9PUkQoQVBfTElTVF9QVFIsCSJQdHIgdG8gbGlzdCBvZiBhdmFpbGFibGUgQVBzIiksCisJSVBXMjEwMF9PUkQoU1RBVF9BUF9BU1NOUywJImFzc29jaWF0aW9ucyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfQVNTTl9GQUlMLAkiYXNzb2NpYXRpb24gZmFpbHVyZXMiKSwKKwlJUFcyMTAwX09SRChTVEFUX0FTU05fUkVTUF9GQUlMLCJmYWlsdXJlcyBkdWUgdG8gcmVzcG9uc2UgZmFpbCIpLAorCUlQVzIxMDBfT1JEKFNUQVRfRlVMTF9TQ0FOUywJImZ1bGwgc2NhbnMiKSwKKwlJUFcyMTAwX09SRChDQVJEX0RJU0FCTEVELAkiQ2FyZCBEaXNhYmxlZCIpLAorCUlQVzIxMDBfT1JEKFNUQVRfUk9BTV9JTkhJQklULAkidGltZXMgcm9hbWluZyB3YXMgaW5oaWJpdGVkIGR1ZSB0byBhY3Rpdml0eSIpLAorCUlQVzIxMDBfT1JEKFJTU0lfQVRfQVNTTiwJIlJTU0kgb2YgYXNzb2NpYXRlZCBBUCBhdCB0aW1lIG9mIGFzc29jaWF0aW9uIiksCisJSVBXMjEwMF9PUkQoU1RBVF9BU1NOX0NBVVNFMSwJInJlYXNzb2NpYXRpb246IG5vIHByb2JlIHJlc3BvbnNlIG9yIFRYIG9uIGhvcCIpLAorCUlQVzIxMDBfT1JEKFNUQVRfQVNTTl9DQVVTRTIsCSJyZWFzc29jaWF0aW9uOiBwb29yIHR4L3J4IHF1YWxpdHkiKSwKKwlJUFcyMTAwX09SRChTVEFUX0FTU05fQ0FVU0UzLAkicmVhc3NvY2lhdGlvbjogdHgvcnggcXVhbGl0eSAoZXhjZXNzaXZlIEFQIGxvYWQiKSwKKwlJUFcyMTAwX09SRChTVEFUX0FTU05fQ0FVU0U0LAkicmVhc3NvY2lhdGlvbjogQVAgUlNTSSBsZXZlbCIpLAorCUlQVzIxMDBfT1JEKFNUQVRfQVNTTl9DQVVTRTUsCSJyZWFzc29jaWF0aW9ucyBkdWUgdG8gbG9hZCBsZXZlbGluZyIpLAorCUlQVzIxMDBfT1JEKFNUQVRfQVVUSF9GQUlMLAkidGltZXMgYXV0aGVudGljYXRpb24gZmFpbGVkIiksCisJSVBXMjEwMF9PUkQoU1RBVF9BVVRIX1JFU1BfRkFJTCwidGltZXMgYXV0aGVudGljYXRpb24gcmVzcG9uc2UgZmFpbGVkIiksCisJSVBXMjEwMF9PUkQoU1RBVElPTl9UQUJMRV9DTlQsCSJlbnRyaWVzIGluIGFzc29jaWF0aW9uIHRhYmxlIiksCisJSVBXMjEwMF9PUkQoUlNTSV9BVkdfQ1VSUiwJIkN1cnJlbnQgYXZnIFJTU0kiKSwKKwlJUFcyMTAwX09SRChQT1dFUl9NR01UX01PREUsCSJQb3dlciBtb2RlIC0gMD1DQU0sIDE9UFNQIiksCisJSVBXMjEwMF9PUkQoQ09VTlRSWV9DT0RFLAkiSUVFRSBjb3VudHJ5IGNvZGUgYXMgcmVjdidkIGZyb20gYmVhY29uIiksCisJSVBXMjEwMF9PUkQoQ09VTlRSWV9DSEFOTkVMUywJImNoYW5uZWxzIHN1cG9ydGVkIGJ5IGNvdW50cnkiKSwKKwlJUFcyMTAwX09SRChSRVNFVF9DTlQsCSJhZGFwdGVyIHJlc2V0cyAod2FybSkiKSwKKwlJUFcyMTAwX09SRChCRUFDT05fSU5URVJWQUwsCSJCZWFjb24gaW50ZXJ2YWwiKSwKKwlJUFcyMTAwX09SRChBTlRFTk5BX0RJVkVSU0lUWSwJIlRSVUUgaWYgYW50ZW5uYSBkaXZlcnNpdHkgaXMgZGlzYWJsZWQiKSwKKwlJUFcyMTAwX09SRChEVElNX1BFUklPRCwJImJlYWNvbiBpbnRlcnZhbHMgYmV0d2VlbiBEVElNcyIpLAorCUlQVzIxMDBfT1JEKE9VUl9GUkVRLAkiY3VycmVudCByYWRpbyBmcmVxIGxvd2VyIGRpZ2l0cyAtIGNoYW5uZWwgSUQiKSwKKwlJUFcyMTAwX09SRChSVENfVElNRSwJImN1cnJlbnQgUlRDIHRpbWUiKSwKKwlJUFcyMTAwX09SRChQT1JUX1RZUEUsCSJvcGVyYXRpbmcgbW9kZSIpLAorCUlQVzIxMDBfT1JEKENVUlJFTlRfVFhfUkFURSwJImN1cnJlbnQgdHggcmF0ZSIpLAorCUlQVzIxMDBfT1JEKFNVUFBPUlRFRF9SQVRFUywJInN1cHBvcnRlZCB0eCByYXRlcyIpLAorCUlQVzIxMDBfT1JEKEFUSU1fV0lORE9XLAkiY3VycmVudCBBVElNIFdpbmRvdyIpLAorCUlQVzIxMDBfT1JEKEJBU0lDX1JBVEVTLAkiYmFzaWMgdHggcmF0ZXMiKSwKKwlJUFcyMTAwX09SRChOSUNfSElHSEVTVF9SQVRFLAkiTklDIGhpZ2hlc3QgdHggcmF0ZSIpLAorCUlQVzIxMDBfT1JEKEFQX0hJR0hFU1RfUkFURSwJIkFQIGhpZ2hlc3QgdHggcmF0ZSIpLAorCUlQVzIxMDBfT1JEKENBUEFCSUxJVElFUywJIk1hbmFnZW1lbnQgZnJhbWUgY2FwYWJpbGl0eSBmaWVsZCIpLAorCUlQVzIxMDBfT1JEKEFVVEhfVFlQRSwJIlR5cGUgb2YgYXV0aGVudGljYXRpb24iKSwKKwlJUFcyMTAwX09SRChSQURJT19UWVBFLAkiQWRhcHRlciBjYXJkIHBsYXRmb3JtIHR5cGUiKSwKKwlJUFcyMTAwX09SRChSVFNfVEhSRVNIT0xELAkiTWluIHBhY2tldCBsZW5ndGggZm9yIFJUUyBoYW5kc2hha2luZyIpLAorCUlQVzIxMDBfT1JEKElOVF9NT0RFLAkiSW50ZXJuYXRpb25hbCBtb2RlIiksCisJSVBXMjEwMF9PUkQoRlJBR01FTlRBVElPTl9USFJFU0hPTEQsCSJwcm90b2NvbCBmcmFnIHRocmVzaG9sZCIpLAorCUlQVzIxMDBfT1JEKEVFUFJPTV9TUkFNX0RCX0JMT0NLX1NUQVJUX0FERFJFU1MsCSJFRVBST00gb2Zmc2V0IGluIFNSQU0iKSwKKwlJUFcyMTAwX09SRChFRVBST01fU1JBTV9EQl9CTE9DS19TSVpFLAkiRUVQUk9NIHNpemUgaW4gU1JBTSIpLAorCUlQVzIxMDBfT1JEKEVFUFJPTV9TS1VfQ0FQQUJJTElUWSwJIkVFUFJPTSBTS1UgQ2FwYWJpbGl0eSIpLAorCUlQVzIxMDBfT1JEKEVFUFJPTV9JQlNTXzExQl9DSEFOTkVMUywJIkVFUFJPTSBJQlNTIDExYiBjaGFubmVsIHNldCIpLAorCUlQVzIxMDBfT1JEKE1BQ19WRVJTSU9OLAkiTUFDIFZlcnNpb24iKSwKKwlJUFcyMTAwX09SRChNQUNfUkVWSVNJT04sCSJNQUMgUmV2aXNpb24iKSwKKwlJUFcyMTAwX09SRChSQURJT19WRVJTSU9OLAkiUmFkaW8gVmVyc2lvbiIpLAorCUlQVzIxMDBfT1JEKE5JQ19NQU5GX0RBVEVfVElNRSwJIk1BTkYgRGF0ZS9UaW1lIFNUQU1QIiksCisJSVBXMjEwMF9PUkQoVUNPREVfVkVSU0lPTiwJIlVjb2RlIFZlcnNpb24iKSwKK307CisKKworc3RhdGljIHNzaXplX3Qgc2hvd19yZWdpc3RlcnMoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCWludCBpOworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5ldF9kZXY7CisJY2hhciAqIG91dCA9IGJ1ZjsKKwl1MzIgdmFsID0gMDsKKworCW91dCArPSBzcHJpbnRmKG91dCwgIiUzMHMgW0FkZHJlc3MgXSA6IEhleFxuIiwgIlJlZ2lzdGVyIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihod19kYXRhKSAvIHNpemVvZigqaHdfZGF0YSkpOyBpKyspIHsKKwkJcmVhZF9yZWdpc3RlcihkZXYsIGh3X2RhdGFbaV0uYWRkciwgJnZhbCk7CisJCW91dCArPSBzcHJpbnRmKG91dCwgIiUzMHMgWyUwOFhdIDogJTA4WFxuIiwKKwkJCSAgICAgICBod19kYXRhW2ldLm5hbWUsIGh3X2RhdGFbaV0uYWRkciwgdmFsKTsKKwl9CisKKwlyZXR1cm4gb3V0IC0gYnVmOworfQorc3RhdGljIERFVklDRV9BVFRSKHJlZ2lzdGVycywgU19JUlVHTywgc2hvd19yZWdpc3RlcnMsIE5VTEwpOworCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaGFyZHdhcmUoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5ldF9kZXY7CisJY2hhciAqIG91dCA9IGJ1ZjsKKwlpbnQgaTsKKworCW91dCArPSBzcHJpbnRmKG91dCwgIiUzMHMgW0FkZHJlc3MgXSA6IEhleFxuIiwgIk5JQyBlbnRyeSIpOworCisJZm9yIChpID0gMDsgaSA8IChzaXplb2YobmljX2RhdGEpIC8gc2l6ZW9mKCpuaWNfZGF0YSkpOyBpKyspIHsKKwkJdTggdG1wODsKKwkJdTE2IHRtcDE2OworCQl1MzIgdG1wMzI7CisKKwkJc3dpdGNoIChuaWNfZGF0YVtpXS5zaXplKSB7CisJCWNhc2UgMToKKwkJCXJlYWRfbmljX2J5dGUoZGV2LCBuaWNfZGF0YVtpXS5hZGRyLCAmdG1wOCk7CisJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMzBzIFslMDhYXSA6ICUwMlhcbiIsCisJCQkJICAgICAgIG5pY19kYXRhW2ldLm5hbWUsIG5pY19kYXRhW2ldLmFkZHIsCisJCQkJICAgICAgIHRtcDgpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXJlYWRfbmljX3dvcmQoZGV2LCBuaWNfZGF0YVtpXS5hZGRyLCAmdG1wMTYpOworCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJTMwcyBbJTA4WF0gOiAlMDRYXG4iLAorCQkJCSAgICAgICBuaWNfZGF0YVtpXS5uYW1lLCBuaWNfZGF0YVtpXS5hZGRyLAorCQkJCSAgICAgICB0bXAxNik7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJcmVhZF9uaWNfZHdvcmQoZGV2LCBuaWNfZGF0YVtpXS5hZGRyLCAmdG1wMzIpOworCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJTMwcyBbJTA4WF0gOiAlMDhYXG4iLAorCQkJCSAgICAgICBuaWNfZGF0YVtpXS5uYW1lLCBuaWNfZGF0YVtpXS5hZGRyLAorCQkJCSAgICAgICB0bXAzMik7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gb3V0IC0gYnVmOworfQorc3RhdGljIERFVklDRV9BVFRSKGhhcmR3YXJlLCBTX0lSVUdPLCBzaG93X2hhcmR3YXJlLCBOVUxMKTsKKworCitzdGF0aWMgc3NpemVfdCBzaG93X21lbW9yeShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+bmV0X2RldjsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsb29wID0gMDsKKwlpbnQgbGVuID0gMDsKKwl1MzIgYnVmZmVyWzRdOworCWludCBpOworCWNoYXIgbGluZVs4MV07CisKKwlpZiAobG9vcCA+PSAweDMwMDAwKQorCQlsb29wID0gMDsKKworCS8qIHN5c2ZzIHByb3ZpZGVzIHVzIFBBR0VfU0laRSBidWZmZXIgKi8KKwl3aGlsZSAobGVuIDwgUEFHRV9TSVpFIC0gMTI4ICYmIGxvb3AgPCAweDMwMDAwKSB7CisKKwkJaWYgKHByaXYtPnNuYXBzaG90WzBdKSBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJYnVmZmVyW2ldID0gKih1MzIgKilTTkFQU0hPVF9BRERSKGxvb3AgKyBpICogNCk7CisJCWVsc2UgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCXJlYWRfbmljX2R3b3JkKGRldiwgbG9vcCArIGkgKiA0LCAmYnVmZmVyW2ldKTsKKworCQlpZiAocHJpdi0+ZHVtcF9yYXcpCisJCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sCisJCQkJICAgICAgICIlYyVjJWMlYyIKKwkJCQkgICAgICAgIiVjJWMlYyVjIgorCQkJCSAgICAgICAiJWMlYyVjJWMiCisJCQkJICAgICAgICIlYyVjJWMlYyIsCisJCQkJICAgICAgICgodTgqKWJ1ZmZlcilbMHgwXSwKKwkJCQkgICAgICAgKCh1OCopYnVmZmVyKVsweDFdLAorCQkJCSAgICAgICAoKHU4KilidWZmZXIpWzB4Ml0sCisJCQkJICAgICAgICgodTgqKWJ1ZmZlcilbMHgzXSwKKwkJCQkgICAgICAgKCh1OCopYnVmZmVyKVsweDRdLAorCQkJCSAgICAgICAoKHU4KilidWZmZXIpWzB4NV0sCisJCQkJICAgICAgICgodTgqKWJ1ZmZlcilbMHg2XSwKKwkJCQkgICAgICAgKCh1OCopYnVmZmVyKVsweDddLAorCQkJCSAgICAgICAoKHU4KilidWZmZXIpWzB4OF0sCisJCQkJICAgICAgICgodTgqKWJ1ZmZlcilbMHg5XSwKKwkJCQkgICAgICAgKCh1OCopYnVmZmVyKVsweGFdLAorCQkJCSAgICAgICAoKHU4KilidWZmZXIpWzB4Yl0sCisJCQkJICAgICAgICgodTgqKWJ1ZmZlcilbMHhjXSwKKwkJCQkgICAgICAgKCh1OCopYnVmZmVyKVsweGRdLAorCQkJCSAgICAgICAoKHU4KilidWZmZXIpWzB4ZV0sCisJCQkJICAgICAgICgodTgqKWJ1ZmZlcilbMHhmXSk7CisJCWVsc2UKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzXG4iLAorCQkJCSAgICAgICBzbnByaW50X2xpbmUobGluZSwgc2l6ZW9mKGxpbmUpLAorCQkJCQkJICAgICh1OCopYnVmZmVyLCAxNiwgbG9vcCkpOworCQlsb29wICs9IDE2OworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX21lbW9yeShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5uZXRfZGV2OworCWNvbnN0IGNoYXIgKnAgPSBidWY7CisKKwlpZiAoY291bnQgPCAxKQorCQlyZXR1cm4gY291bnQ7CisKKwlpZiAocFswXSA9PSAnMScgfHwKKwkgICAgKGNvdW50ID49IDIgJiYgdG9sb3dlcihwWzBdKSA9PSAnbycgJiYgdG9sb3dlcihwWzFdKSA9PSAnbicpKSB7CisJCUlQV19ERUJVR19JTkZPKCIlczogU2V0dGluZyBtZW1vcnkgZHVtcCB0byBSQVcgbW9kZS5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlwcml2LT5kdW1wX3JhdyA9IDE7CisKKwl9IGVsc2UgaWYgKHBbMF0gPT0gJzAnIHx8IChjb3VudCA+PSAyICYmIHRvbG93ZXIocFswXSkgPT0gJ28nICYmCisJCQkJICB0b2xvd2VyKHBbMV0pID09ICdmJykpIHsKKwkJSVBXX0RFQlVHX0lORk8oIiVzOiBTZXR0aW5nIG1lbW9yeSBkdW1wIHRvIEhFWCBtb2RlLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXByaXYtPmR1bXBfcmF3ID0gMDsKKworCX0gZWxzZSBpZiAodG9sb3dlcihwWzBdKSA9PSAncicpIHsKKwkJSVBXX0RFQlVHX0lORk8oIiVzOiBSZXNldHRpbmcgZmlybXdhcmUgc25hcHNob3QuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJaXB3MjEwMF9zbmFwc2hvdF9mcmVlKHByaXYpOworCisJfSBlbHNlCisJCUlQV19ERUJVR19JTkZPKCIlczogVXNhZ2U6IDB8b24gPSBIRVgsIDF8b2ZmID0gUkFXLCAiCisJCSAgICAgICAicmVzZXQgPSBjbGVhciBtZW1vcnkgc25hcHNob3RcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKG1lbW9yeSwgU19JV1VTUnxTX0lSVUdPLCBzaG93X21lbW9yeSwgc3RvcmVfbWVtb3J5KTsKKworCitzdGF0aWMgc3NpemVfdCBzaG93X29yZGluYWxzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXUzMiB2YWwgPSAwOworCWludCBsZW4gPSAwOworCXUzMiB2YWxfbGVuOworCXN0YXRpYyBpbnQgbG9vcCA9IDA7CisKKwlpZiAobG9vcCA+PSBzaXplb2Yob3JkX2RhdGEpIC8gc2l6ZW9mKCpvcmRfZGF0YSkpCisJCWxvb3AgPSAwOworCisJLyogc3lzZnMgcHJvdmlkZXMgdXMgUEFHRV9TSVpFIGJ1ZmZlciAqLworCXdoaWxlIChsZW4gPCBQQUdFX1NJWkUgLSAxMjggJiYKKwkgICAgICAgbG9vcCA8IChzaXplb2Yob3JkX2RhdGEpIC8gc2l6ZW9mKCpvcmRfZGF0YSkpKSB7CisKKwkJdmFsX2xlbiA9IHNpemVvZih1MzIpOworCisJCWlmIChpcHcyMTAwX2dldF9vcmRpbmFsKHByaXYsIG9yZF9kYXRhW2xvb3BdLmluZGV4LCAmdmFsLAorCQkJCQkmdmFsX2xlbikpCisJCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJbMHglMDJYXSA9IEVSUk9SICAgICVzXG4iLAorCQkJCSAgICAgICBvcmRfZGF0YVtsb29wXS5pbmRleCwKKwkJCQkgICAgICAgb3JkX2RhdGFbbG9vcF0uZGVzYyk7CisJCWVsc2UKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlsweCUwMlhdID0gMHglMDhYICVzXG4iLAorCQkJCSAgICAgICBvcmRfZGF0YVtsb29wXS5pbmRleCwgdmFsLAorCQkJCSAgICAgICBvcmRfZGF0YVtsb29wXS5kZXNjKTsKKwkJbG9vcCsrOworCX0KKworCXJldHVybiBsZW47Cit9CitzdGF0aWMgREVWSUNFX0FUVFIob3JkaW5hbHMsIFNfSVJVR08sIHNob3dfb3JkaW5hbHMsIE5VTEwpOworCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RhdHMoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJY2hhciAqIG91dCA9IGJ1ZjsKKworCW91dCArPSBzcHJpbnRmKG91dCwgImludGVycnVwdHM6ICVkIHt0eDogJWQsIHJ4OiAlZCwgb3RoZXI6ICVkfVxuIiwKKwkJICAgICAgIHByaXYtPmludGVycnVwdHMsIHByaXYtPnR4X2ludGVycnVwdHMsCisJCSAgICAgICBwcml2LT5yeF9pbnRlcnJ1cHRzLCBwcml2LT5pbnRhX290aGVyKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJmaXJtd2FyZSByZXNldHM6ICVkXG4iLCBwcml2LT5yZXNldHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImZpcm13YXJlIGhhbmdzOiAlZFxuIiwgcHJpdi0+aGFuZ3MpOworI2lmZGVmIENPTkZJR19JUFdfREVCVUcKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJwYWNrZXQgbWlzbWF0Y2ggaW1hZ2U6ICVzXG4iLAorCQkgICAgICAgcHJpdi0+c25hcHNob3RbMF0gPyAiWUVTIiA6ICJOTyIpOworI2VuZGlmCisKKwlyZXR1cm4gb3V0IC0gYnVmOworfQorc3RhdGljIERFVklDRV9BVFRSKHN0YXRzLCBTX0lSVUdPLCBzaG93X3N0YXRzLCBOVUxMKTsKKworCitzdGF0aWMgaW50IGlwdzIxMDBfc3dpdGNoX21vZGUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgdTMyIG1vZGUpCit7CisJaW50IGVycjsKKworCWlmIChtb2RlID09IHByaXYtPmllZWUtPml3X21vZGUpCisJCXJldHVybiAwOworCisJZXJyID0gaXB3MjEwMF9kaXNhYmxlX2FkYXB0ZXIocHJpdik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXM6IENvdWxkIG5vdCBkaXNhYmxlIGFkYXB0ZXIgJWRcbiIsCisJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJcHJpdi0+bmV0X2Rldi0+dHlwZSA9IEFSUEhSRF9FVEhFUjsKKwkJYnJlYWs7CisJY2FzZSBJV19NT0RFX0FESE9DOgorCQlwcml2LT5uZXRfZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfSVBXMjEwMF9NT05JVE9SCisJY2FzZSBJV19NT0RFX01PTklUT1I6CisJCXByaXYtPmxhc3RfbW9kZSA9IHByaXYtPmllZWUtPml3X21vZGU7CisJCXByaXYtPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExOworCQlicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfSVBXMjEwMF9NT05JVE9SICovCisJfQorCisJcHJpdi0+aWVlZS0+aXdfbW9kZSA9IG1vZGU7CisKKyNpZmRlZiBDT05GSUdfUE0KKyAgICAgICAgLyogSW5kaWNhdGUgaXB3MjEwMF9kb3dubG9hZF9maXJtd2FyZSBkb3dubG9hZCBmaXJtd2FyZQorCSAqIGZyb20gZGlzayBpbnN0ZWFkIG9mIG1lbW9yeS4gKi8KKwlpcHcyMTAwX2Zpcm13YXJlLnZlcnNpb24gPSAwOworI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICIlczogUmVzZXRpbmcgb24gbW9kZSBjaGFuZ2UuXG4iLAorCQlwcml2LT5uZXRfZGV2LT5uYW1lKTsKKwlwcml2LT5yZXNldF9iYWNrb2ZmID0gMDsKKwlzY2hlZHVsZV9yZXNldChwcml2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2ludGVybmFscyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpbnQgbGVuID0gMDsKKworI2RlZmluZSBEVU1QX1ZBUih4LHkpIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIyB4ICI6ICUiICMgeSAiXG4iLCBwcml2LT4geCkKKworCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiY29ubmVjdGVkOiAlbHVcbiIsCisJCQkgICAgICAgZ2V0X3NlY29uZHMoKSAtIHByaXYtPmNvbm5lY3Rfc3RhcnQpOworCWVsc2UKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAibm90IGNvbm5lY3RlZFxuIik7CisKKwlEVU1QX1ZBUihpZWVlLT5jcnlwdFtwcml2LT5pZWVlLT50eF9rZXlpZHhdLCBwKTsKKwlEVU1QX1ZBUihzdGF0dXMsIDA4bHgpOworCURVTVBfVkFSKGNvbmZpZywgMDhseCk7CisJRFVNUF9WQVIoY2FwYWJpbGl0eSwgMDhseCk7CisKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJsYXN0X3J0YzogJWx1XG4iLCAodW5zaWduZWQgbG9uZylwcml2LT5sYXN0X3J0Yyk7CisKKwlEVU1QX1ZBUihmYXRhbF9lcnJvciwgZCk7CisJRFVNUF9WQVIoc3RvcF9oYW5nX2NoZWNrLCBkKTsKKwlEVU1QX1ZBUihzdG9wX3JmX2tpbGwsIGQpOworCURVTVBfVkFSKG1lc3NhZ2VzX3NlbnQsIGQpOworCisJRFVNUF9WQVIodHhfcGVuZF9zdGF0LnZhbHVlLCBkKTsKKwlEVU1QX1ZBUih0eF9wZW5kX3N0YXQuaGksIGQpOworCisJRFVNUF9WQVIodHhfZnJlZV9zdGF0LnZhbHVlLCBkKTsKKwlEVU1QX1ZBUih0eF9mcmVlX3N0YXQubG8sIGQpOworCisJRFVNUF9WQVIobXNnX2ZyZWVfc3RhdC52YWx1ZSwgZCk7CisJRFVNUF9WQVIobXNnX2ZyZWVfc3RhdC5sbywgZCk7CisKKwlEVU1QX1ZBUihtc2dfcGVuZF9zdGF0LnZhbHVlLCBkKTsKKwlEVU1QX1ZBUihtc2dfcGVuZF9zdGF0LmhpLCBkKTsKKworCURVTVBfVkFSKGZ3X3BlbmRfc3RhdC52YWx1ZSwgZCk7CisJRFVNUF9WQVIoZndfcGVuZF9zdGF0LmhpLCBkKTsKKworCURVTVBfVkFSKHR4cV9zdGF0LnZhbHVlLCBkKTsKKwlEVU1QX1ZBUih0eHFfc3RhdC5sbywgZCk7CisKKwlEVU1QX1ZBUihpZWVlLT5zY2FucywgZCk7CisJRFVNUF9WQVIocmVzZXRfYmFja29mZiwgZCk7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIERFVklDRV9BVFRSKGludGVybmFscywgU19JUlVHTywgc2hvd19pbnRlcm5hbHMsIE5VTEwpOworCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYnNzaW5mbyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwljaGFyIGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisJdTggYnNzaWRbRVRIX0FMRU5dOworCXUzMiBjaGFuID0gMDsKKwljaGFyICogb3V0ID0gYnVmOworCWludCBsZW5ndGg7CisJaW50IHJldDsKKworCW1lbXNldChlc3NpZCwgMCwgc2l6ZW9mKGVzc2lkKSk7CisJbWVtc2V0KGJzc2lkLCAwLCBzaXplb2YoYnNzaWQpKTsKKworCWxlbmd0aCA9IElXX0VTU0lEX01BWF9TSVpFOworCXJldCA9IGlwdzIxMDBfZ2V0X29yZGluYWwocHJpdiwgSVBXX09SRF9TVEFUX0FTU05fU1NJRCwgZXNzaWQsICZsZW5ndGgpOworCWlmIChyZXQpCisJCUlQV19ERUJVR19JTkZPKCJmYWlsZWQgcXVlcnlpbmcgb3JkaW5hbHMgYXQgbGluZSAlZFxuIiwKKwkJCSAgICAgICBfX0xJTkVfXyk7CisKKwlsZW5ndGggPSBzaXplb2YoYnNzaWQpOworCXJldCA9IGlwdzIxMDBfZ2V0X29yZGluYWwocHJpdiwgSVBXX09SRF9TVEFUX0FTU05fQVBfQlNTSUQsCisJCQkJICBic3NpZCwgJmxlbmd0aCk7CisJaWYgKHJldCkKKwkJSVBXX0RFQlVHX0lORk8oImZhaWxlZCBxdWVyeWluZyBvcmRpbmFscyBhdCBsaW5lICVkXG4iLAorCQkJICAgICAgIF9fTElORV9fKTsKKworCWxlbmd0aCA9IHNpemVvZih1MzIpOworCXJldCA9IGlwdzIxMDBfZ2V0X29yZGluYWwocHJpdiwgSVBXX09SRF9PVVJfRlJFUSwgJmNoYW4sICZsZW5ndGgpOworCWlmIChyZXQpCisJCUlQV19ERUJVR19JTkZPKCJmYWlsZWQgcXVlcnlpbmcgb3JkaW5hbHMgYXQgbGluZSAlZFxuIiwKKwkJCSAgICAgICBfX0xJTkVfXyk7CisKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJFU1NJRDogJXNcbiIsIGVzc2lkKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJCU1NJRDogICAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJICAgICAgIGJzc2lkWzBdLCBic3NpZFsxXSwgYnNzaWRbMl0sCisJCSAgICAgICBic3NpZFszXSwgYnNzaWRbNF0sIGJzc2lkWzVdKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJDaGFubmVsOiAlZFxuIiwgY2hhbik7CisKKwlyZXR1cm4gb3V0IC0gYnVmOworfQorc3RhdGljIERFVklDRV9BVFRSKGJzc2luZm8sIFNfSVJVR08sIHNob3dfYnNzaW5mbywgTlVMTCk7CisKKworI2lmZGVmIENPTkZJR19JUFdfREVCVUcKK3N0YXRpYyBzc2l6ZV90IHNob3dfZGVidWdfbGV2ZWwoc3RydWN0IGRldmljZV9kcml2ZXIgKmQsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOFhcbiIsIGlwdzIxMDBfZGVidWdfbGV2ZWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9kZWJ1Z19sZXZlbChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZCwgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQpCit7CisJY2hhciAqcCA9IChjaGFyICopYnVmOworCXUzMiB2YWw7CisKKwlpZiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcgfHwgcFswXSA9PSAneCcgfHwgcFswXSA9PSAnWCcpIHsKKwkJcCsrOworCQlpZiAocFswXSA9PSAneCcgfHwgcFswXSA9PSAnWCcpCisJCQlwKys7CisJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxNik7CisJfSBlbHNlCisJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxMCk7CisJaWYgKHAgPT0gYnVmKQorCQlJUFdfREVCVUdfSU5GTyhEUlZfTkFNRQorCQkgICAgICAgIjogJXMgaXMgbm90IGluIGhleCBvciBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOworCWVsc2UKKwkJaXB3MjEwMF9kZWJ1Z19sZXZlbCA9IHZhbDsKKworCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorc3RhdGljIERSSVZFUl9BVFRSKGRlYnVnX2xldmVsLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19kZWJ1Z19sZXZlbCwKKwkJICAgc3RvcmVfZGVidWdfbGV2ZWwpOworI2VuZGlmIC8qIENPTkZJR19JUFdfREVCVUcgKi8KKworCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhdGFsX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmQsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJY2hhciAqb3V0ID0gYnVmOworCWludCBpOworCisJaWYgKHByaXYtPmZhdGFsX2Vycm9yKQorCQlvdXQgKz0gc3ByaW50ZihvdXQsICIweCUwOFhcbiIsCisJCQkgICAgICAgcHJpdi0+ZmF0YWxfZXJyb3IpOworCWVsc2UKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiMFxuIik7CisKKwlmb3IgKGkgPSAxOyBpIDw9IElQVzIxMDBfRVJST1JfUVVFVUU7IGkrKykgeworCQlpZiAoIXByaXYtPmZhdGFsX2Vycm9yc1socHJpdi0+ZmF0YWxfaW5kZXggLSBpKSAlCisJCQkJCUlQVzIxMDBfRVJST1JfUVVFVUVdKQorCQkJY29udGludWU7CisKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiJWQuIDB4JTA4WFxuIiwgaSwKKwkJCSAgICAgICBwcml2LT5mYXRhbF9lcnJvcnNbKHByaXYtPmZhdGFsX2luZGV4IC0gaSkgJQorCQkJCQkJICBJUFcyMTAwX0VSUk9SX1FVRVVFXSk7CisJfQorCisJcmV0dXJuIG91dCAtIGJ1ZjsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfZmF0YWxfZXJyb3Ioc3RydWN0IGRldmljZSAqZCwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJc2NoZWR1bGVfcmVzZXQocHJpdik7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKGZhdGFsX2Vycm9yLCBTX0lXVVNSfFNfSVJVR08sIHNob3dfZmF0YWxfZXJyb3IsIHN0b3JlX2ZhdGFsX2Vycm9yKTsKKworCitzdGF0aWMgc3NpemVfdCBzaG93X3NjYW5fYWdlKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwcml2LT5pZWVlLT5zY2FuX2FnZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3NjYW5fYWdlKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5ldF9kZXY7CisJY2hhciBidWZmZXJbXSA9ICIwMDAwMDAwMCI7CisJdW5zaWduZWQgbG9uZyBsZW4gPQorCSAgICAoc2l6ZW9mKGJ1ZmZlcikgLSAxKSA+IGNvdW50ID8gY291bnQgOiBzaXplb2YoYnVmZmVyKSAtIDE7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJY2hhciAqcCA9IGJ1ZmZlcjsKKworCUlQV19ERUJVR19JTkZPKCJlbnRlclxuIik7CisKKwlzdHJuY3B5KGJ1ZmZlciwgYnVmLCBsZW4pOworCWJ1ZmZlcltsZW5dID0gMDsKKworCWlmIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJyB8fCBwWzBdID09ICd4JyB8fCBwWzBdID09ICdYJykgeworCQlwKys7CisJCWlmIChwWzBdID09ICd4JyB8fCBwWzBdID09ICdYJykKKwkJCXArKzsKKwkJdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDE2KTsKKwl9IGVsc2UKKwkJdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDEwKTsKKwlpZiAocCA9PSBidWZmZXIpIHsKKwkJSVBXX0RFQlVHX0lORk8oIiVzOiB1c2VyIHN1cHBsaWVkIGludmFsaWQgdmFsdWUuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwl9IGVsc2UgeworCQlwcml2LT5pZWVlLT5zY2FuX2FnZSA9IHZhbDsKKwkJSVBXX0RFQlVHX0lORk8oInNldCBzY2FuX2FnZSA9ICV1XG4iLCBwcml2LT5pZWVlLT5zY2FuX2FnZSk7CisJfQorCisJSVBXX0RFQlVHX0lORk8oImV4aXRcbiIpOworCXJldHVybiBsZW47Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc2Nhbl9hZ2UsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3NjYW5fYWdlLCBzdG9yZV9zY2FuX2FnZSk7CisKKworc3RhdGljIHNzaXplX3Qgc2hvd19yZl9raWxsKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwkvKiAwIC0gUkYga2lsbCBub3QgZW5hYmxlZAorCSAgIDEgLSBTVyBiYXNlZCBSRiBraWxsIGFjdGl2ZSAoc3lzZnMpCisJICAgMiAtIEhXIGJhc2VkIFJGIGtpbGwgYWN0aXZlCisJICAgMyAtIEJvdGggSFcgYW5kIFNXIGJhZWQgUkYga2lsbCBhY3RpdmUgKi8KKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gKHN0cnVjdCBpcHcyMTAwX3ByaXYgKilkLT5kcml2ZXJfZGF0YTsKKwlpbnQgdmFsID0gKChwcml2LT5zdGF0dXMgJiBTVEFUVVNfUkZfS0lMTF9TVykgPyAweDEgOiAweDApIHwKKwkJKHJmX2tpbGxfYWN0aXZlKHByaXYpID8gMHgyIDogMHgwKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlaVxuIiwgdmFsKTsKK30KKworc3RhdGljIGludCBpcHdfcmFkaW9fa2lsbF9zdyhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LCBpbnQgZGlzYWJsZV9yYWRpbykKK3sKKwlpZiAoKGRpc2FibGVfcmFkaW8gPyAxIDogMCkgPT0KKwkgICAgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRl9LSUxMX1NXID8gMSA6IDApKQorCQlyZXR1cm4gMCA7CisKKwlJUFdfREVCVUdfUkZfS0lMTCgiTWFudWFsIFNXIFJGIEtpbGwgc2V0IHRvOiBSQURJTyAgJXNcbiIsCisJCQkgIGRpc2FibGVfcmFkaW8gPyAiT0ZGIiA6ICJPTiIpOworCisJZG93bigmcHJpdi0+YWN0aW9uX3NlbSk7CisKKwlpZiAoZGlzYWJsZV9yYWRpbykgeworCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1JGX0tJTExfU1c7CisJCWlwdzIxMDBfZG93bihwcml2KTsKKwl9IGVsc2UgeworCQlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19SRl9LSUxMX1NXOworCQlpZiAocmZfa2lsbF9hY3RpdmUocHJpdikpIHsKKwkJCUlQV19ERUJVR19SRl9LSUxMKCJDYW4gbm90IHR1cm4gcmFkaW8gYmFjayBvbiAtICIKKwkJCQkJICAiZGlzYWJsZWQgYnkgSFcgc3dpdGNoXG4iKTsKKwkJCS8qIE1ha2Ugc3VyZSB0aGUgUkZfS0lMTCBjaGVjayB0aW1lciBpcyBydW5uaW5nICovCisJCQlwcml2LT5zdG9wX3JmX2tpbGwgPSAwOworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cmZfa2lsbCk7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwKKwkJCQkJICAgSFopOworCQl9IGVsc2UKKwkJCXNjaGVkdWxlX3Jlc2V0KHByaXYpOworCX0KKworCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfcmZfa2lsbChzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlwd19yYWRpb19raWxsX3N3KHByaXYsIGJ1ZlswXSA9PSAnMScpOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihyZl9raWxsLCBTX0lXVVNSfFNfSVJVR08sIHNob3dfcmZfa2lsbCwgc3RvcmVfcmZfa2lsbCk7CisKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlwdzIxMDBfc3lzZnNfZW50cmllc1tdID0geworCSZkZXZfYXR0cl9oYXJkd2FyZS5hdHRyLAorCSZkZXZfYXR0cl9yZWdpc3RlcnMuYXR0ciwKKwkmZGV2X2F0dHJfb3JkaW5hbHMuYXR0ciwKKwkmZGV2X2F0dHJfcGNpLmF0dHIsCisJJmRldl9hdHRyX3N0YXRzLmF0dHIsCisJJmRldl9hdHRyX2ludGVybmFscy5hdHRyLAorCSZkZXZfYXR0cl9ic3NpbmZvLmF0dHIsCisJJmRldl9hdHRyX21lbW9yeS5hdHRyLAorCSZkZXZfYXR0cl9zY2FuX2FnZS5hdHRyLAorCSZkZXZfYXR0cl9mYXRhbF9lcnJvci5hdHRyLAorCSZkZXZfYXR0cl9yZl9raWxsLmF0dHIsCisJJmRldl9hdHRyX2NmZy5hdHRyLAorCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKKwkmZGV2X2F0dHJfY2FwYWJpbGl0eS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpcHcyMTAwX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBpcHcyMTAwX3N5c2ZzX2VudHJpZXMsCit9OworCisKK3N0YXRpYyBpbnQgc3RhdHVzX3F1ZXVlX2FsbG9jYXRlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGludCBlbnRyaWVzKQoreworCXN0cnVjdCBpcHcyMTAwX3N0YXR1c19xdWV1ZSAqcSA9ICZwcml2LT5zdGF0dXNfcXVldWU7CisKKwlJUFdfREVCVUdfSU5GTygiZW50ZXJcbiIpOworCisJcS0+c2l6ZSA9IGVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGlwdzIxMDBfc3RhdHVzKTsKKwlxLT5kcnYgPSAoc3RydWN0IGlwdzIxMDBfc3RhdHVzICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoCisJCXByaXYtPnBjaV9kZXYsIHEtPnNpemUsICZxLT5uaWMpOworCWlmICghcS0+ZHJ2KSB7CisJCUlQV19ERUJVR19XQVJOSU5HKAorCQkgICAgICAgIkNhbiBub3QgYWxsb2NhdGUgc3RhdHVzIHF1ZXVlLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChxLT5kcnYsIDAsIHEtPnNpemUpOworCisJSVBXX0RFQlVHX0lORk8oImV4aXRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXR1c19xdWV1ZV9mcmVlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJSVBXX0RFQlVHX0lORk8oImVudGVyXG4iKTsKKworCWlmIChwcml2LT5zdGF0dXNfcXVldWUuZHJ2KSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoCisJCQlwcml2LT5wY2lfZGV2LCBwcml2LT5zdGF0dXNfcXVldWUuc2l6ZSwKKwkJCXByaXYtPnN0YXR1c19xdWV1ZS5kcnYsIHByaXYtPnN0YXR1c19xdWV1ZS5uaWMpOworCQlwcml2LT5zdGF0dXNfcXVldWUuZHJ2ID0gTlVMTDsKKwl9CisKKwlJUFdfREVCVUdfSU5GTygiZXhpdFxuIik7Cit9CisKK3N0YXRpYyBpbnQgYmRfcXVldWVfYWxsb2NhdGUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKKwkJCSAgICAgc3RydWN0IGlwdzIxMDBfYmRfcXVldWUgKnEsIGludCBlbnRyaWVzKQoreworCUlQV19ERUJVR19JTkZPKCJlbnRlclxuIik7CisKKwltZW1zZXQocSwgMCwgc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX2JkX3F1ZXVlKSk7CisKKwlxLT5lbnRyaWVzID0gZW50cmllczsKKwlxLT5zaXplID0gZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgaXB3MjEwMF9iZCk7CisJcS0+ZHJ2ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocHJpdi0+cGNpX2RldiwgcS0+c2l6ZSwgJnEtPm5pYyk7CisJaWYgKCFxLT5kcnYpIHsKKwkJSVBXX0RFQlVHX0lORk8oImNhbid0IGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgZm9yIGJ1ZmZlciBkZXNjcmlwdG9yc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocS0+ZHJ2LCAwLCBxLT5zaXplKTsKKworCUlQV19ERUJVR19JTkZPKCJleGl0XG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiZF9xdWV1ZV9mcmVlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsCisJCQkgIHN0cnVjdCBpcHcyMTAwX2JkX3F1ZXVlICpxKQoreworCUlQV19ERUJVR19JTkZPKCJlbnRlclxuIik7CisKKwlpZiAoIXEpCisJCXJldHVybjsKKworCWlmIChxLT5kcnYpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wY2lfZGV2LAorCQkJCSAgICBxLT5zaXplLCBxLT5kcnYsIHEtPm5pYyk7CisJCXEtPmRydiA9IE5VTEw7CisJfQorCisJSVBXX0RFQlVHX0lORk8oImV4aXRcbiIpOworfQorCitzdGF0aWMgdm9pZCBiZF9xdWV1ZV9pbml0aWFsaXplKAorCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHN0cnVjdCBpcHcyMTAwX2JkX3F1ZXVlICogcSwKKwl1MzIgYmFzZSwgdTMyIHNpemUsIHUzMiByLCB1MzIgdykKK3sKKwlJUFdfREVCVUdfSU5GTygiZW50ZXJcbiIpOworCisJSVBXX0RFQlVHX0lORk8oImluaXRpYWxpemluZyBiZCBxdWV1ZSBhdCB2aXJ0PSVwLCBwaHlzPSUwOHhcbiIsIHEtPmRydiwgKHUzMilxLT5uaWMpOworCisJd3JpdGVfcmVnaXN0ZXIocHJpdi0+bmV0X2RldiwgYmFzZSwgcS0+bmljKTsKKwl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBzaXplLCBxLT5lbnRyaWVzKTsKKwl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCByLCBxLT5vbGRlc3QpOworCXdyaXRlX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIHcsIHEtPm5leHQpOworCisJSVBXX0RFQlVHX0lORk8oImV4aXRcbiIpOworfQorCitzdGF0aWMgdm9pZCBpcHcyMTAwX2tpbGxfd29ya3F1ZXVlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJaWYgKHByaXYtPndvcmtxdWV1ZSkgeworCQlwcml2LT5zdG9wX3JmX2tpbGwgPSAxOworCQlwcml2LT5zdG9wX2hhbmdfY2hlY2sgPSAxOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+c2VjdXJpdHlfd29yayk7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnd4X2V2ZW50X3dvcmspOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5oYW5nX2NoZWNrKTsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cmZfa2lsbCk7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7CisJCXByaXYtPndvcmtxdWV1ZSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGlwdzIxMDBfdHhfYWxsb2NhdGUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwlpbnQgaSwgaiwgZXJyID0gLUVJTlZBTDsKKwl2b2lkICp2OworCWRtYV9hZGRyX3QgcDsKKworCUlQV19ERUJVR19JTkZPKCJlbnRlclxuIik7CisKKwllcnIgPSBiZF9xdWV1ZV9hbGxvY2F0ZShwcml2LCAmcHJpdi0+dHhfcXVldWUsIFRYX1FVRVVFX0xFTkdUSCk7CisJaWYgKGVycikgeworCQlJUFdfREVCVUdfRVJST1IoIiVzOiBmYWlsZWQgYmRfcXVldWVfYWxsb2NhdGVcbiIsCisJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwcml2LT50eF9idWZmZXJzID0gKHN0cnVjdCBpcHcyMTAwX3R4X3BhY2tldCAqKWttYWxsb2MoCisJCVRYX1BFTkRFRF9RVUVVRV9MRU5HVEggKiBzaXplb2Yoc3RydWN0IGlwdzIxMDBfdHhfcGFja2V0KSwKKwkJR0ZQX0FUT01JQyk7CisJaWYgKCFwcml2LT50eF9idWZmZXJzKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAlczogYWxsb2MgZmFpbGVkIGZvcm0gdHggYnVmZmVycy5cbiIsCisJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lKTsKKwkJYmRfcXVldWVfZnJlZShwcml2LCAmcHJpdi0+dHhfcXVldWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUEVOREVEX1FVRVVFX0xFTkdUSDsgaSsrKSB7CisJCXYgPSBwY2lfYWxsb2NfY29uc2lzdGVudCgKKwkJCXByaXYtPnBjaV9kZXYsIHNpemVvZihzdHJ1Y3QgaXB3MjEwMF9kYXRhX2hlYWRlciksICZwKTsKKwkJaWYgKCF2KSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXM6IFBDSSBhbGxvYyBmYWlsZWQgZm9yIHR4ICIKKwkJCSAgICAgICAiYnVmZmVycy5cbiIsIHByaXYtPm5ldF9kZXYtPm5hbWUpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJpdi0+dHhfYnVmZmVyc1tpXS50eXBlID0gREFUQTsKKwkJcHJpdi0+dHhfYnVmZmVyc1tpXS5pbmZvLmRfc3RydWN0LmRhdGEgPSAoc3RydWN0IGlwdzIxMDBfZGF0YV9oZWFkZXIqKXY7CisJCXByaXYtPnR4X2J1ZmZlcnNbaV0uaW5mby5kX3N0cnVjdC5kYXRhX3BoeXMgPSBwOworCQlwcml2LT50eF9idWZmZXJzW2ldLmluZm8uZF9zdHJ1Y3QudHhiID0gTlVMTDsKKwl9CisKKwlpZiAoaSA9PSBUWF9QRU5ERURfUVVFVUVfTEVOR1RIKQorCQlyZXR1cm4gMDsKKworCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCgKKwkJCXByaXYtPnBjaV9kZXYsCisJCQlzaXplb2Yoc3RydWN0IGlwdzIxMDBfZGF0YV9oZWFkZXIpLAorCQkJcHJpdi0+dHhfYnVmZmVyc1tqXS5pbmZvLmRfc3RydWN0LmRhdGEsCisJCQlwcml2LT50eF9idWZmZXJzW2pdLmluZm8uZF9zdHJ1Y3QuZGF0YV9waHlzKTsKKwl9CisKKwlrZnJlZShwcml2LT50eF9idWZmZXJzKTsKKwlwcml2LT50eF9idWZmZXJzID0gTlVMTDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGlwdzIxMDBfdHhfaW5pdGlhbGl6ZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCWludCBpOworCisJSVBXX0RFQlVHX0lORk8oImVudGVyXG4iKTsKKworCS8qCisJICogcmVpbml0aWFsaXplIHBhY2tldCBpbmZvIGxpc3RzCisJICovCisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmZ3X3BlbmRfbGlzdCk7CisJSU5JVF9TVEFUKCZwcml2LT5md19wZW5kX3N0YXQpOworCisJLyoKKwkgKiByZWluaXRpYWxpemUgbGlzdHMKKwkgKi8KKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+dHhfcGVuZF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+dHhfZnJlZV9saXN0KTsKKwlJTklUX1NUQVQoJnByaXYtPnR4X3BlbmRfc3RhdCk7CisJSU5JVF9TVEFUKCZwcml2LT50eF9mcmVlX3N0YXQpOworCisJZm9yIChpID0gMDsgaSA8IFRYX1BFTkRFRF9RVUVVRV9MRU5HVEg7IGkrKykgeworCQkvKiBXZSBzaW1wbHkgZHJvcCBhbnkgU0tCcyB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQgZm9yCisJCSAqIHRyYW5zbWl0ICovCisJCWlmIChwcml2LT50eF9idWZmZXJzW2ldLmluZm8uZF9zdHJ1Y3QudHhiKSB7CisJCQlpZWVlODAyMTFfdHhiX2ZyZWUocHJpdi0+dHhfYnVmZmVyc1tpXS5pbmZvLmRfc3RydWN0LnR4Yik7CisJCQlwcml2LT50eF9idWZmZXJzW2ldLmluZm8uZF9zdHJ1Y3QudHhiID0gTlVMTDsKKwkJfQorCisJCWxpc3RfYWRkX3RhaWwoJnByaXYtPnR4X2J1ZmZlcnNbaV0ubGlzdCwgJnByaXYtPnR4X2ZyZWVfbGlzdCk7CisJfQorCisJU0VUX1NUQVQoJnByaXYtPnR4X2ZyZWVfc3RhdCwgaSk7CisKKwlwcml2LT50eF9xdWV1ZS5vbGRlc3QgPSAwOworCXByaXYtPnR4X3F1ZXVlLmF2YWlsYWJsZSA9IHByaXYtPnR4X3F1ZXVlLmVudHJpZXM7CisJcHJpdi0+dHhfcXVldWUubmV4dCA9IDA7CisJSU5JVF9TVEFUKCZwcml2LT50eHFfc3RhdCk7CisJU0VUX1NUQVQoJnByaXYtPnR4cV9zdGF0LCBwcml2LT50eF9xdWV1ZS5hdmFpbGFibGUpOworCisJYmRfcXVldWVfaW5pdGlhbGl6ZShwcml2LCAmcHJpdi0+dHhfcXVldWUsCisJCQkgICAgSVBXX01FTV9IT1NUX1NIQVJFRF9UWF9RVUVVRV9CRF9CQVNFLAorCQkJICAgIElQV19NRU1fSE9TVF9TSEFSRURfVFhfUVVFVUVfQkRfU0laRSwKKwkJCSAgICBJUFdfTUVNX0hPU1RfU0hBUkVEX1RYX1FVRVVFX1JFQURfSU5ERVgsCisJCQkgICAgSVBXX01FTV9IT1NUX1NIQVJFRF9UWF9RVUVVRV9XUklURV9JTkRFWCk7CisKKwlJUFdfREVCVUdfSU5GTygiZXhpdFxuIik7CisKK30KKworc3RhdGljIHZvaWQgaXB3MjEwMF90eF9mcmVlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJaW50IGk7CisKKwlJUFdfREVCVUdfSU5GTygiZW50ZXJcbiIpOworCisJYmRfcXVldWVfZnJlZShwcml2LCAmcHJpdi0+dHhfcXVldWUpOworCisJaWYgKCFwcml2LT50eF9idWZmZXJzKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUEVOREVEX1FVRVVFX0xFTkdUSDsgaSsrKSB7CisJCWlmIChwcml2LT50eF9idWZmZXJzW2ldLmluZm8uZF9zdHJ1Y3QudHhiKSB7CisJCQlpZWVlODAyMTFfdHhiX2ZyZWUocHJpdi0+dHhfYnVmZmVyc1tpXS5pbmZvLmRfc3RydWN0LnR4Yik7CisJCQlwcml2LT50eF9idWZmZXJzW2ldLmluZm8uZF9zdHJ1Y3QudHhiID0gTlVMTDsKKwkJfQorCQlpZiAocHJpdi0+dHhfYnVmZmVyc1tpXS5pbmZvLmRfc3RydWN0LmRhdGEpCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KAorCQkJCXByaXYtPnBjaV9kZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX2RhdGFfaGVhZGVyKSwKKwkJCQlwcml2LT50eF9idWZmZXJzW2ldLmluZm8uZF9zdHJ1Y3QuZGF0YSwKKwkJCQlwcml2LT50eF9idWZmZXJzW2ldLmluZm8uZF9zdHJ1Y3QuZGF0YV9waHlzKTsKKwl9CisKKwlrZnJlZShwcml2LT50eF9idWZmZXJzKTsKKwlwcml2LT50eF9idWZmZXJzID0gTlVMTDsKKworCUlQV19ERUJVR19JTkZPKCJleGl0XG4iKTsKK30KKworCisKK3N0YXRpYyBpbnQgaXB3MjEwMF9yeF9hbGxvY2F0ZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCWludCBpLCBqLCBlcnIgPSAtRUlOVkFMOworCisJSVBXX0RFQlVHX0lORk8oImVudGVyXG4iKTsKKworCWVyciA9IGJkX3F1ZXVlX2FsbG9jYXRlKHByaXYsICZwcml2LT5yeF9xdWV1ZSwgUlhfUVVFVUVfTEVOR1RIKTsKKwlpZiAoZXJyKSB7CisJCUlQV19ERUJVR19JTkZPKCJmYWlsZWQgYmRfcXVldWVfYWxsb2NhdGVcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHN0YXR1c19xdWV1ZV9hbGxvY2F0ZShwcml2LCBSWF9RVUVVRV9MRU5HVEgpOworCWlmIChlcnIpIHsKKwkJSVBXX0RFQlVHX0lORk8oImZhaWxlZCBzdGF0dXNfcXVldWVfYWxsb2NhdGVcbiIpOworCQliZF9xdWV1ZV9mcmVlKHByaXYsICZwcml2LT5yeF9xdWV1ZSk7CisJCXJldHVybiBlcnI7CisJfQorCisJLyoKKwkgKiBhbGxvY2F0ZSBwYWNrZXRzCisJICovCisJcHJpdi0+cnhfYnVmZmVycyA9IChzdHJ1Y3QgaXB3MjEwMF9yeF9wYWNrZXQgKikKKwkgICAga21hbGxvYyhSWF9RVUVVRV9MRU5HVEggKiBzaXplb2Yoc3RydWN0IGlwdzIxMDBfcnhfcGFja2V0KSwKKwkJICAgIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+cnhfYnVmZmVycykgeworCQlJUFdfREVCVUdfSU5GTygiY2FuJ3QgYWxsb2NhdGUgcnggcGFja2V0IGJ1ZmZlciB0YWJsZVxuIik7CisKKwkJYmRfcXVldWVfZnJlZShwcml2LCAmcHJpdi0+cnhfcXVldWUpOworCisJCXN0YXR1c19xdWV1ZV9mcmVlKHByaXYpOworCisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9MRU5HVEg7IGkrKykgeworCQlzdHJ1Y3QgaXB3MjEwMF9yeF9wYWNrZXQgKnBhY2tldCA9ICZwcml2LT5yeF9idWZmZXJzW2ldOworCisJCWVyciA9IGlwdzIxMDBfYWxsb2Nfc2tiKHByaXYsIHBhY2tldCk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBUaGUgQkQgaG9sZHMgdGhlIGNhY2hlIGFsaWduZWQgYWRkcmVzcyAqLworCQlwcml2LT5yeF9xdWV1ZS5kcnZbaV0uaG9zdF9hZGRyID0gcGFja2V0LT5kbWFfYWRkcjsKKwkJcHJpdi0+cnhfcXVldWUuZHJ2W2ldLmJ1Zl9sZW5ndGggPSBJUFdfUlhfTklDX0JVRkZFUl9MRU5HVEg7CisJCXByaXYtPnN0YXR1c19xdWV1ZS5kcnZbaV0uc3RhdHVzX2ZpZWxkcyA9IDA7CisJfQorCisJaWYgKGkgPT0gUlhfUVVFVUVfTEVOR1RIKQorCQlyZXR1cm4gMDsKKworCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LCBwcml2LT5yeF9idWZmZXJzW2pdLmRtYV9hZGRyLAorCQkJCSBzaXplb2Yoc3RydWN0IGlwdzIxMDBfcnhfcGFja2V0KSwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYihwcml2LT5yeF9idWZmZXJzW2pdLnNrYik7CisJfQorCisJa2ZyZWUocHJpdi0+cnhfYnVmZmVycyk7CisJcHJpdi0+cnhfYnVmZmVycyA9IE5VTEw7CisKKwliZF9xdWV1ZV9mcmVlKHByaXYsICZwcml2LT5yeF9xdWV1ZSk7CisKKwlzdGF0dXNfcXVldWVfZnJlZShwcml2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGlwdzIxMDBfcnhfaW5pdGlhbGl6ZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCUlQV19ERUJVR19JTkZPKCJlbnRlclxuIik7CisKKwlwcml2LT5yeF9xdWV1ZS5vbGRlc3QgPSAwOworCXByaXYtPnJ4X3F1ZXVlLmF2YWlsYWJsZSA9IHByaXYtPnJ4X3F1ZXVlLmVudHJpZXMgLSAxOworCXByaXYtPnJ4X3F1ZXVlLm5leHQgPSBwcml2LT5yeF9xdWV1ZS5lbnRyaWVzIC0gMTsKKworCUlOSVRfU1RBVCgmcHJpdi0+cnhxX3N0YXQpOworCVNFVF9TVEFUKCZwcml2LT5yeHFfc3RhdCwgcHJpdi0+cnhfcXVldWUuYXZhaWxhYmxlKTsKKworCWJkX3F1ZXVlX2luaXRpYWxpemUocHJpdiwgJnByaXYtPnJ4X3F1ZXVlLAorCQkJICAgIElQV19NRU1fSE9TVF9TSEFSRURfUlhfQkRfQkFTRSwKKwkJCSAgICBJUFdfTUVNX0hPU1RfU0hBUkVEX1JYX0JEX1NJWkUsCisJCQkgICAgSVBXX01FTV9IT1NUX1NIQVJFRF9SWF9SRUFEX0lOREVYLAorCQkJICAgIElQV19NRU1fSE9TVF9TSEFSRURfUlhfV1JJVEVfSU5ERVgpOworCisJLyogc2V0IHVwIHRoZSBzdGF0dXMgcXVldWUgKi8KKwl3cml0ZV9yZWdpc3Rlcihwcml2LT5uZXRfZGV2LCBJUFdfTUVNX0hPU1RfU0hBUkVEX1JYX1NUQVRVU19CQVNFLAorCQkgICAgICAgcHJpdi0+c3RhdHVzX3F1ZXVlLm5pYyk7CisKKwlJUFdfREVCVUdfSU5GTygiZXhpdFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGlwdzIxMDBfcnhfZnJlZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCWludCBpOworCisJSVBXX0RFQlVHX0lORk8oImVudGVyXG4iKTsKKworCWJkX3F1ZXVlX2ZyZWUocHJpdiwgJnByaXYtPnJ4X3F1ZXVlKTsKKwlzdGF0dXNfcXVldWVfZnJlZShwcml2KTsKKworCWlmICghcHJpdi0+cnhfYnVmZmVycykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX0xFTkdUSDsgaSsrKSB7CisJCWlmIChwcml2LT5yeF9idWZmZXJzW2ldLnJ4cCkgeworCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LAorCQkJCQkgcHJpdi0+cnhfYnVmZmVyc1tpXS5kbWFfYWRkciwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgaXB3MjEwMF9yeCksCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihwcml2LT5yeF9idWZmZXJzW2ldLnNrYik7CisJCX0KKwl9CisKKwlrZnJlZShwcml2LT5yeF9idWZmZXJzKTsKKwlwcml2LT5yeF9idWZmZXJzID0gTlVMTDsKKworCUlQV19ERUJVR19JTkZPKCJleGl0XG4iKTsKK30KKworc3RhdGljIGludCBpcHcyMTAwX3JlYWRfbWFjX2FkZHJlc3Moc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwl1MzIgbGVuZ3RoID0gRVRIX0FMRU47CisJdTggbWFjW0VUSF9BTEVOXTsKKworCWludCBlcnI7CisKKwllcnIgPSBpcHcyMTAwX2dldF9vcmRpbmFsKHByaXYsIElQV19PUkRfU1RBVF9BREFQVEVSX01BQywKKwkJCQkgIG1hYywgJmxlbmd0aCk7CisJaWYgKGVycikgeworCQlJUFdfREVCVUdfSU5GTygiTUFDIGFkZHJlc3MgcmVhZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJSVBXX0RFQlVHX0lORk8oImNhcmQgTUFDIGlzICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSAgICAgICBtYWNbMF0sIG1hY1sxXSwgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKKworCW1lbWNweShwcml2LT5uZXRfZGV2LT5kZXZfYWRkciwgbWFjLCBFVEhfQUxFTik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlybXdhcmUgQ29tbWFuZHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgaXB3MjEwMF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgaW50IGJhdGNoX21vZGUpCit7CisJc3RydWN0IGhvc3RfY29tbWFuZCBjbWQgPSB7CisJCS5ob3N0X2NvbW1hbmQgPSBBREFQVEVSX0FERFJFU1MsCisJCS5ob3N0X2NvbW1hbmRfc2VxdWVuY2UgPSAwLAorCQkuaG9zdF9jb21tYW5kX2xlbmd0aCA9IEVUSF9BTEVOCisJfTsKKwlpbnQgZXJyOworCisJSVBXX0RFQlVHX0hDKCJTRVRfTUFDX0FERFJFU1NcbiIpOworCisJSVBXX0RFQlVHX0lORk8oImVudGVyXG4iKTsKKworCWlmIChwcml2LT5jb25maWcgJiBDRkdfQ1VTVE9NX01BQykgeworCQltZW1jcHkoY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzLCBwcml2LT5tYWNfYWRkciwKKwkJICAgICAgIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHByaXYtPm5ldF9kZXYtPmRldl9hZGRyLCBwcml2LT5tYWNfYWRkciwgRVRIX0FMRU4pOworCX0gZWxzZQorCQltZW1jcHkoY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzLCBwcml2LT5uZXRfZGV2LT5kZXZfYWRkciwKKwkJICAgICAgIEVUSF9BTEVOKTsKKworCWVyciA9IGlwdzIxMDBfaHdfc2VuZF9jb21tYW5kKHByaXYsICZjbWQpOworCisJSVBXX0RFQlVHX0lORk8oImV4aXRcbiIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF9zZXRfcG9ydF90eXBlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHUzMiBwb3J0X3R5cGUsCisJCQkJIGludCBiYXRjaF9tb2RlKQoreworCXN0cnVjdCBob3N0X2NvbW1hbmQgY21kID0geworCQkuaG9zdF9jb21tYW5kID0gUE9SVF9UWVBFLAorCQkuaG9zdF9jb21tYW5kX3NlcXVlbmNlID0gMCwKKwkJLmhvc3RfY29tbWFuZF9sZW5ndGggPSBzaXplb2YodTMyKQorCX07CisJaW50IGVycjsKKworCXN3aXRjaCAocG9ydF90eXBlKSB7CisJY2FzZSBJV19NT0RFX0lORlJBOgorCQljbWQuaG9zdF9jb21tYW5kX3BhcmFtZXRlcnNbMF0gPSBJUFdfQlNTOworCQlicmVhazsKKwljYXNlIElXX01PREVfQURIT0M6CisJCWNtZC5ob3N0X2NvbW1hbmRfcGFyYW1ldGVyc1swXSA9IElQV19JQlNTOworCQlicmVhazsKKwl9CisKKwlJUFdfREVCVUdfSEMoIlBPUlRfVFlQRTogJXNcbiIsCisJCSAgICAgcG9ydF90eXBlID09IElQV19JQlNTID8gIkFkLUhvYyIgOiAiTWFuYWdlZCIpOworCisJaWYgKCFiYXRjaF9tb2RlKSB7CisJCWVyciA9IGlwdzIxMDBfZGlzYWJsZV9hZGFwdGVyKHByaXYpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXM6IENvdWxkIG5vdCBkaXNhYmxlIGFkYXB0ZXIgJWRcbiIsCisJCQkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwkvKiBzZW5kIGNtZCB0byBmaXJtd2FyZSAqLworCWVyciA9IGlwdzIxMDBfaHdfc2VuZF9jb21tYW5kKHByaXYsICZjbWQpOworCisJaWYgKCFiYXRjaF9tb2RlKQorCQlpcHcyMTAwX2VuYWJsZV9hZGFwdGVyKHByaXYpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IGlwdzIxMDBfc2V0X2NoYW5uZWwoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgdTMyIGNoYW5uZWwsCisJCQkgICAgICAgaW50IGJhdGNoX21vZGUpCit7CisJc3RydWN0IGhvc3RfY29tbWFuZCBjbWQgPSB7CisJCS5ob3N0X2NvbW1hbmQgPSBDSEFOTkVMLAorCQkuaG9zdF9jb21tYW5kX3NlcXVlbmNlID0gMCwKKwkJLmhvc3RfY29tbWFuZF9sZW5ndGggPSBzaXplb2YodTMyKQorCX07CisJaW50IGVycjsKKworCWNtZC5ob3N0X2NvbW1hbmRfcGFyYW1ldGVyc1swXSA9IGNoYW5uZWw7CisKKwlJUFdfREVCVUdfSEMoIkNIQU5ORUw6ICVkXG4iLCBjaGFubmVsKTsKKworCS8qIElmIEJTUyB0aGVuIHdlIGRvbid0IHN1cHBvcnQgY2hhbm5lbCBzZWxlY3Rpb24gKi8KKwlpZiAocHJpdi0+aWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQlyZXR1cm4gMDsKKworCWlmICgoY2hhbm5lbCAhPSAwKSAmJgorCSAgICAoKGNoYW5uZWwgPCBSRUdfTUlOX0NIQU5ORUwpIHx8IChjaGFubmVsID4gUkVHX01BWF9DSEFOTkVMKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFiYXRjaF9tb2RlKSB7CisJCWVyciA9IGlwdzIxMDBfZGlzYWJsZV9hZGFwdGVyKHByaXYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBpcHcyMTAwX2h3X3NlbmRfY29tbWFuZChwcml2LCAmY21kKTsKKwlpZiAoZXJyKSB7CisJCUlQV19ERUJVR19JTkZPKCJGYWlsZWQgdG8gc2V0IGNoYW5uZWwgdG8gJWQiLAorCQkJICAgICAgIGNoYW5uZWwpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChjaGFubmVsKQorCQlwcml2LT5jb25maWcgfD0gQ0ZHX1NUQVRJQ19DSEFOTkVMOworCWVsc2UKKwkJcHJpdi0+Y29uZmlnICY9IH5DRkdfU1RBVElDX0NIQU5ORUw7CisKKwlwcml2LT5jaGFubmVsID0gY2hhbm5lbDsKKworCWlmICghYmF0Y2hfbW9kZSkgeworCQllcnIgPSBpcHcyMTAwX2VuYWJsZV9hZGFwdGVyKHByaXYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHcyMTAwX3N5c3RlbV9jb25maWcoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgaW50IGJhdGNoX21vZGUpCit7CisJc3RydWN0IGhvc3RfY29tbWFuZCBjbWQgPSB7CisJCS5ob3N0X2NvbW1hbmQgPSBTWVNURU1fQ09ORklHLAorCQkuaG9zdF9jb21tYW5kX3NlcXVlbmNlID0gMCwKKwkJLmhvc3RfY29tbWFuZF9sZW5ndGggPSAxMiwKKwl9OworCXUzMiBpYnNzX21hc2ssIGxlbiA9IHNpemVvZih1MzIpOworCWludCBlcnI7CisKKwkvKiBTZXQgc3lzdGVtIGNvbmZpZ3VyYXRpb24gKi8KKworCWlmICghYmF0Y2hfbW9kZSkgeworCQllcnIgPSBpcHcyMTAwX2Rpc2FibGVfYWRhcHRlcihwcml2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzWzBdIHw9IElQV19DRkdfSUJTU19BVVRPX1NUQVJUOworCisJY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzWzBdIHw9IElQV19DRkdfSUJTU19NQVNLIHwKKwkJSVBXX0NGR19CU1NfTUFTSyB8CisJCUlQV19DRkdfODAyXzF4X0VOQUJMRTsKKworCWlmICghKHByaXYtPmNvbmZpZyAmIENGR19MT05HX1BSRUFNQkxFKSkKKwkJY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzWzBdIHw9IElQV19DRkdfUFJFQU1CTEVfQVVUTzsKKworCWVyciA9IGlwdzIxMDBfZ2V0X29yZGluYWwocHJpdiwKKwkJCQkgIElQV19PUkRfRUVQUk9NX0lCU1NfMTFCX0NIQU5ORUxTLAorCQkJCSAgJmlic3NfbWFzaywgICZsZW4pOworCWlmIChlcnIpCisJCWlic3NfbWFzayA9IElQV19JQlNTXzExQl9ERUZBVUxUX01BU0s7CisKKwljbWQuaG9zdF9jb21tYW5kX3BhcmFtZXRlcnNbMV0gPSBSRUdfQ0hBTk5FTF9NQVNLOworCWNtZC5ob3N0X2NvbW1hbmRfcGFyYW1ldGVyc1syXSA9IFJFR19DSEFOTkVMX01BU0sgJiBpYnNzX21hc2s7CisKKwkvKiAxMWIgb25seSAqLworCS8qY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzWzBdIHw9IERJVkVSU0lUWV9BTlRFTk5BX0E7Ki8KKworCWVyciA9IGlwdzIxMDBfaHdfc2VuZF9jb21tYW5kKHByaXYsICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKy8qIElmIElQdjYgaXMgY29uZmlndXJlZCBpbiB0aGUga2VybmVsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBmaWx0ZXIgb3V0IGFsbAorICogb2YgdGhlIG11bHRpY2FzdCBwYWNrZXRzIGFzIElQdjYgbmVlZHMgc29tZS4gKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfSVBWNikgJiYgIWRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCWNtZC5ob3N0X2NvbW1hbmQgPSBBRERfTVVMVElDQVNUOworCWNtZC5ob3N0X2NvbW1hbmRfc2VxdWVuY2UgPSAwOworCWNtZC5ob3N0X2NvbW1hbmRfbGVuZ3RoID0gMDsKKworCWlwdzIxMDBfaHdfc2VuZF9jb21tYW5kKHByaXYsICZjbWQpOworI2VuZGlmCisJaWYgKCFiYXRjaF9tb2RlKSB7CisJCWVyciA9IGlwdzIxMDBfZW5hYmxlX2FkYXB0ZXIocHJpdik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfc2V0X3R4X3JhdGVzKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHUzMiByYXRlLAorCQkJCWludCBiYXRjaF9tb2RlKQoreworCXN0cnVjdCBob3N0X2NvbW1hbmQgY21kID0geworCQkuaG9zdF9jb21tYW5kID0gQkFTSUNfVFhfUkFURVMsCisJCS5ob3N0X2NvbW1hbmRfc2VxdWVuY2UgPSAwLAorCQkuaG9zdF9jb21tYW5kX2xlbmd0aCA9IDQKKwl9OworCWludCBlcnI7CisKKwljbWQuaG9zdF9jb21tYW5kX3BhcmFtZXRlcnNbMF0gPSByYXRlICYgVFhfUkFURV9NQVNLOworCisJaWYgKCFiYXRjaF9tb2RlKSB7CisJCWVyciA9IGlwdzIxMDBfZGlzYWJsZV9hZGFwdGVyKHByaXYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBTZXQgQkFTSUMgVFggUmF0ZSBmaXJzdCAqLworCWlwdzIxMDBfaHdfc2VuZF9jb21tYW5kKHByaXYsICZjbWQpOworCisJLyogU2V0IFRYIFJhdGUgKi8KKwljbWQuaG9zdF9jb21tYW5kID0gVFhfUkFURVM7CisJaXB3MjEwMF9od19zZW5kX2NvbW1hbmQocHJpdiwgJmNtZCk7CisKKwkvKiBTZXQgTVNEVSBUWCBSYXRlICovCisJY21kLmhvc3RfY29tbWFuZCA9IE1TRFVfVFhfUkFURVM7CisJaXB3MjEwMF9od19zZW5kX2NvbW1hbmQocHJpdiwgJmNtZCk7CisKKwlpZiAoIWJhdGNoX21vZGUpIHsKKwkJZXJyID0gaXB3MjEwMF9lbmFibGVfYWRhcHRlcihwcml2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcHJpdi0+dHhfcmF0ZXMgPSByYXRlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF9zZXRfcG93ZXJfbW9kZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LAorCQkJCSAgaW50IHBvd2VyX2xldmVsKQoreworCXN0cnVjdCBob3N0X2NvbW1hbmQgY21kID0geworCQkuaG9zdF9jb21tYW5kID0gUE9XRVJfTU9ERSwKKwkJLmhvc3RfY29tbWFuZF9zZXF1ZW5jZSA9IDAsCisJCS5ob3N0X2NvbW1hbmRfbGVuZ3RoID0gNAorCX07CisJaW50IGVycjsKKworCWNtZC5ob3N0X2NvbW1hbmRfcGFyYW1ldGVyc1swXSA9IHBvd2VyX2xldmVsOworCisJZXJyID0gaXB3MjEwMF9od19zZW5kX2NvbW1hbmQocHJpdiwgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChwb3dlcl9sZXZlbCA9PSBJUFdfUE9XRVJfTU9ERV9DQU0pCisJCXByaXYtPnBvd2VyX21vZGUgPSBJUFdfUE9XRVJfTEVWRUwocHJpdi0+cG93ZXJfbW9kZSk7CisJZWxzZQorCQlwcml2LT5wb3dlcl9tb2RlID0gSVBXX1BPV0VSX0VOQUJMRUQgfCBwb3dlcl9sZXZlbDsKKworI2lmZGVmIENPTkZJR19JUFcyMTAwX1RYX1BPV0VSCisJaWYgKHByaXYtPnBvcnRfdHlwZSA9PSBJQlNTICYmCisJICAgIHByaXYtPmFkaG9jX3Bvd2VyICE9IERGVExfSUJTU19UWF9QT1dFUikgeworCQkvKiBTZXQgYmVhY29uIGludGVydmFsICovCisJCWNtZC5ob3N0X2NvbW1hbmQgPSBUWF9QT1dFUl9JTkRFWDsKKwkJY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzWzBdID0gKHUzMilwcml2LT5hZGhvY19wb3dlcjsKKworCQllcnIgPSBpcHcyMTAwX2h3X3NlbmRfY29tbWFuZChwcml2LCAmY21kKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlwdzIxMDBfc2V0X3J0c190aHJlc2hvbGQoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgdTMyIHRocmVzaG9sZCkKK3sKKwlzdHJ1Y3QgaG9zdF9jb21tYW5kIGNtZCA9IHsKKwkJLmhvc3RfY29tbWFuZCA9IFJUU19USFJFU0hPTEQsCisJCS5ob3N0X2NvbW1hbmRfc2VxdWVuY2UgPSAwLAorCQkuaG9zdF9jb21tYW5kX2xlbmd0aCA9IDQKKwl9OworCWludCBlcnI7CisKKwlpZiAodGhyZXNob2xkICYgUlRTX0RJU0FCTEVEKQorCQljbWQuaG9zdF9jb21tYW5kX3BhcmFtZXRlcnNbMF0gPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwllbHNlCisJCWNtZC5ob3N0X2NvbW1hbmRfcGFyYW1ldGVyc1swXSA9IHRocmVzaG9sZCAmIH5SVFNfRElTQUJMRUQ7CisKKwllcnIgPSBpcHcyMTAwX2h3X3NlbmRfY29tbWFuZChwcml2LCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcHJpdi0+cnRzX3RocmVzaG9sZCA9IHRocmVzaG9sZDsKKworCXJldHVybiAwOworfQorCisjaWYgMAoraW50IGlwdzIxMDBfc2V0X2ZyYWdtZW50YXRpb25fdGhyZXNob2xkKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsCisJCQkJCXUzMiB0aHJlc2hvbGQsIGludCBiYXRjaF9tb2RlKQoreworCXN0cnVjdCBob3N0X2NvbW1hbmQgY21kID0geworCQkuaG9zdF9jb21tYW5kID0gRlJBR19USFJFU0hPTEQsCisJCS5ob3N0X2NvbW1hbmRfc2VxdWVuY2UgPSAwLAorCQkuaG9zdF9jb21tYW5kX2xlbmd0aCA9IDQsCisJCS5ob3N0X2NvbW1hbmRfcGFyYW1ldGVyc1swXSA9IDAsCisJfTsKKwlpbnQgZXJyOworCisJaWYgKCFiYXRjaF9tb2RlKSB7CisJCWVyciA9IGlwdzIxMDBfZGlzYWJsZV9hZGFwdGVyKHByaXYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAodGhyZXNob2xkID09IDApCisJCXRocmVzaG9sZCA9IERFRkFVTFRfRlJBR19USFJFU0hPTEQ7CisJZWxzZSB7CisJCXRocmVzaG9sZCA9IG1heCh0aHJlc2hvbGQsIE1JTl9GUkFHX1RIUkVTSE9MRCk7CisJCXRocmVzaG9sZCA9IG1pbih0aHJlc2hvbGQsIE1BWF9GUkFHX1RIUkVTSE9MRCk7CisJfQorCisJY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzWzBdID0gdGhyZXNob2xkOworCisJSVBXX0RFQlVHX0hDKCJGUkFHX1RIUkVTSE9MRDogJXVcbiIsIHRocmVzaG9sZCk7CisKKwllcnIgPSBpcHcyMTAwX2h3X3NlbmRfY29tbWFuZChwcml2LCAmY21kKTsKKworCWlmICghYmF0Y2hfbW9kZSkKKwkJaXB3MjEwMF9lbmFibGVfYWRhcHRlcihwcml2KTsKKworCWlmICghZXJyKQorCQlwcml2LT5mcmFnX3RocmVzaG9sZCA9IHRocmVzaG9sZDsKKworCXJldHVybiBlcnI7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpcHcyMTAwX3NldF9zaG9ydF9yZXRyeShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LCB1MzIgcmV0cnkpCit7CisJc3RydWN0IGhvc3RfY29tbWFuZCBjbWQgPSB7CisJCS5ob3N0X2NvbW1hbmQgPSBTSE9SVF9SRVRSWV9MSU1JVCwKKwkJLmhvc3RfY29tbWFuZF9zZXF1ZW5jZSA9IDAsCisJCS5ob3N0X2NvbW1hbmRfbGVuZ3RoID0gNAorCX07CisJaW50IGVycjsKKworCWNtZC5ob3N0X2NvbW1hbmRfcGFyYW1ldGVyc1swXSA9IHJldHJ5OworCisJZXJyID0gaXB3MjEwMF9od19zZW5kX2NvbW1hbmQocHJpdiwgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXByaXYtPnNob3J0X3JldHJ5X2xpbWl0ID0gcmV0cnk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHcyMTAwX3NldF9sb25nX3JldHJ5KHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHUzMiByZXRyeSkKK3sKKwlzdHJ1Y3QgaG9zdF9jb21tYW5kIGNtZCA9IHsKKwkJLmhvc3RfY29tbWFuZCA9IExPTkdfUkVUUllfTElNSVQsCisJCS5ob3N0X2NvbW1hbmRfc2VxdWVuY2UgPSAwLAorCQkuaG9zdF9jb21tYW5kX2xlbmd0aCA9IDQKKwl9OworCWludCBlcnI7CisKKwljbWQuaG9zdF9jb21tYW5kX3BhcmFtZXRlcnNbMF0gPSByZXRyeTsKKworCWVyciA9IGlwdzIxMDBfaHdfc2VuZF9jb21tYW5kKHByaXYsICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwcml2LT5sb25nX3JldHJ5X2xpbWl0ID0gcmV0cnk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlwdzIxMDBfc2V0X21hbmRhdG9yeV9ic3NpZChzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LCB1OCAqYnNzaWQsCisJCQkJICAgICAgIGludCBiYXRjaF9tb2RlKQoreworCXN0cnVjdCBob3N0X2NvbW1hbmQgY21kID0geworCQkuaG9zdF9jb21tYW5kID0gTUFOREFUT1JZX0JTU0lELAorCQkuaG9zdF9jb21tYW5kX3NlcXVlbmNlID0gMCwKKwkJLmhvc3RfY29tbWFuZF9sZW5ndGggPSAoYnNzaWQgPT0gTlVMTCkgPyAwIDogRVRIX0FMRU4KKwl9OworCWludCBlcnI7CisKKyNpZmRlZiBDT05GSUdfSVBXX0RFQlVHCisJaWYgKGJzc2lkICE9IE5VTEwpCisJCUlQV19ERUJVR19IQygKKwkJCSJNQU5EQVRPUllfQlNTSUQ6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQkJYnNzaWRbMF0sIGJzc2lkWzFdLCBic3NpZFsyXSwgYnNzaWRbM10sIGJzc2lkWzRdLAorCQkJYnNzaWRbNV0pOworCWVsc2UKKwkJSVBXX0RFQlVHX0hDKCJNQU5EQVRPUllfQlNTSUQ6IDxjbGVhcj5cbiIpOworI2VuZGlmCisJLyogaWYgQlNTSUQgaXMgZW1wdHkgdGhlbiB3ZSBkaXNhYmxlIG1hbmRhdG9yeSBic3NpZCBtb2RlICovCisJaWYgKGJzc2lkICE9IE5VTEwpCisJCW1lbWNweSgodTggKiljbWQuaG9zdF9jb21tYW5kX3BhcmFtZXRlcnMsIGJzc2lkLCBFVEhfQUxFTik7CisKKwlpZiAoIWJhdGNoX21vZGUpIHsKKwkJZXJyID0gaXB3MjEwMF9kaXNhYmxlX2FkYXB0ZXIocHJpdik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGlwdzIxMDBfaHdfc2VuZF9jb21tYW5kKHByaXYsICZjbWQpOworCisJaWYgKCFiYXRjaF9tb2RlKQorCQlpcHcyMTAwX2VuYWJsZV9hZGFwdGVyKHByaXYpOworCisJcmV0dXJuIGVycjsKK30KKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfV1BBCitzdGF0aWMgaW50IGlwdzIxMDBfZGlzYXNzb2NpYXRlX2Jzc2lkKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGhvc3RfY29tbWFuZCBjbWQgPSB7CisJCS5ob3N0X2NvbW1hbmQgPSBESVNBU1NPQ0lBVElPTl9CU1NJRCwKKwkJLmhvc3RfY29tbWFuZF9zZXF1ZW5jZSA9IDAsCisJCS5ob3N0X2NvbW1hbmRfbGVuZ3RoID0gRVRIX0FMRU4KKwl9OworCWludCBlcnI7CisJaW50IGxlbjsKKworCUlQV19ERUJVR19IQygiRElTQVNTT0NJQVRJT05fQlNTSURcbiIpOworCisJbGVuID0gRVRIX0FMRU47CisJLyogVGhlIEZpcm13YXJlIGN1cnJlbnRseSBpZ25vcmVzIHRoZSBCU1NJRCBhbmQganVzdCBkaXNhc3NvY2lhdGVzIGZyb20KKwkgKiB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgQVAgLS0gYnV0IGluIHRoZSBvZmYgY2hhbmNlIHRoYXQgYSBmdXR1cmUKKwkgKiBmaXJtd2FyZSBkb2VzIHVzZSB0aGUgQlNTSUQgcHJvdmlkZWQgaGVyZSwgd2UgZ28gYWhlYWQgYW5kIHRyeSBhbmQKKwkgKiBzZXQgaXQgdG8gdGhlIGN1cnJlbnRseSBhc3NvY2lhdGVkIEFQJ3MgQlNTSUQgKi8KKwltZW1jcHkoY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzLCBwcml2LT5ic3NpZCwgRVRIX0FMRU4pOworCisJZXJyID0gaXB3MjEwMF9od19zZW5kX2NvbW1hbmQocHJpdiwgJmNtZCk7CisKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKKy8qCisgKiBQc2V1ZG8gY29kZSBmb3Igc2V0dGluZyB1cCB3cGFfZnJhbWU6CisgKi8KKyNpZiAwCit2b2lkIHgoc3RydWN0IGllZWU4MDIxMV9hc3NvY19mcmFtZSAqd3BhX2Fzc29jKQoreworCXN0cnVjdCBpcHcyMTAwX3dwYV9hc3NvY19mcmFtZSBmcmFtZTsKKwlmcmFtZS0+Zml4ZWRfaWVfbWFzayA9IElQV19XUEFfQ0FQQUJJTFRJRVMgfAorCQlJUFdfV1BBX0xJU1RFTklOVEVSVkFMIHwKKwkJSVBXX1dQQV9BUF9BRERSRVNTOworCWZyYW1lLT5jYXBhYl9pbmZvID0gd3BhX2Fzc29jLT5jYXBhYl9pbmZvOworCWZyYW1lLT5saXNlbl9pbnRlcnZhbCA9IHdwYV9hc3NvYy0+bGlzdGVudF9pbnRlcnZhbDsKKwltZW1jcHkoZnJhbWUtPmN1cnJlbnRfYXAsIHdwYV9hc3NvYy0+Y3VycmVudF9hcCwgRVRIX0FMRU4pOworCisJLyogVU5LTk9XTiAtLSBJJ20gbm90IHBvc3Rpdml2ZSBhYm91dCB0aGlzIHBhcnQ7IGRvbid0IGhhdmUgYW55IFdQQQorCSAqIHNldHVwIGhlcmUgdG8gdGVzdCBpdCB3aXRoLgorCSAqCisJICogV2FsayB0aGUgSUVzIGluIHRoZSB3cGFfYXNzb2MgYW5kIGZpZ3VyZSBvdXQgdGhlIHRvdGFsIHNpemUgb2YgYWxsCisJICogdGhhdCBkYXRhLiAgU3RpY2sgdGhhdCBpbnRvIGZyYW1lLT52YXJfaWVfbGVuLiAgVGhlbiBtZW1jcHkoKSBhbGwgb2YKKwkgKiB0aGUgSUVzIGZyb20gd3BhX2ZyYW1lIGludG8gZnJhbWUuCisJICovCisJZnJhbWUtPnZhcl9pZV9sZW4gPSBjYWxjdWxhdGVfaWVfbGVuKHdwYV9hc3NvYyk7CisJbWVtY3B5KGZyYW1lLT52YXJfaWUsICB3cGFfYXNzb2MtPnZhcmlhYmxlLCBmcmFtZS0+dmFyX2llX2xlbik7CisKKwlpcHcyMTAwX3NldF93cGFfaWUocHJpdiwgJmZyYW1lLCAwKTsKK30KKyNlbmRpZgorCisKKworCitzdGF0aWMgaW50IGlwdzIxMDBfc2V0X3dwYV9pZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICosCisJCQkgICAgICBzdHJ1Y3QgaXB3MjEwMF93cGFfYXNzb2NfZnJhbWUgKiwgaW50KQorX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworCitzdGF0aWMgaW50IGlwdzIxMDBfc2V0X3dwYV9pZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LAorCQkJICAgICAgc3RydWN0IGlwdzIxMDBfd3BhX2Fzc29jX2ZyYW1lICp3cGFfZnJhbWUsCisJCQkgICAgICBpbnQgYmF0Y2hfbW9kZSkKK3sKKwlzdHJ1Y3QgaG9zdF9jb21tYW5kIGNtZCA9IHsKKwkJLmhvc3RfY29tbWFuZCA9IFNFVF9XUEFfSUUsCisJCS5ob3N0X2NvbW1hbmRfc2VxdWVuY2UgPSAwLAorCQkuaG9zdF9jb21tYW5kX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXB3MjEwMF93cGFfYXNzb2NfZnJhbWUpLAorCX07CisJaW50IGVycjsKKworCUlQV19ERUJVR19IQygiU0VUX1dQQV9JRVxuIik7CisKKwlpZiAoIWJhdGNoX21vZGUpIHsKKwkJZXJyID0gaXB3MjEwMF9kaXNhYmxlX2FkYXB0ZXIocHJpdik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCW1lbWNweShjbWQuaG9zdF9jb21tYW5kX3BhcmFtZXRlcnMsIHdwYV9mcmFtZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX3dwYV9hc3NvY19mcmFtZSkpOworCisJZXJyID0gaXB3MjEwMF9od19zZW5kX2NvbW1hbmQocHJpdiwgJmNtZCk7CisKKwlpZiAoIWJhdGNoX21vZGUpIHsKKwkJaWYgKGlwdzIxMDBfZW5hYmxlX2FkYXB0ZXIocHJpdikpCisJCQllcnIgPSAtRUlPOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBzZWN1cml0eV9pbmZvX3BhcmFtcyB7CisJdTMyIGFsbG93ZWRfY2lwaGVyczsKKwl1MTYgdmVyc2lvbjsKKwl1OCBhdXRoX21vZGU7CisJdTggcmVwbGF5X2NvdW50ZXJzX251bWJlcjsKKwl1OCB1bmljYXN0X3VzaW5nX2dyb3VwOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBpbnQgaXB3MjEwMF9zZXRfc2VjdXJpdHlfaW5mb3JtYXRpb24oc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKKwkJCQkJICAgIGludCBhdXRoX21vZGUsCisJCQkJCSAgICBpbnQgc2VjdXJpdHlfbGV2ZWwsCisJCQkJCSAgICBpbnQgdW5pY2FzdF91c2luZ19ncm91cCwKKwkJCQkJICAgIGludCBiYXRjaF9tb2RlKQoreworCXN0cnVjdCBob3N0X2NvbW1hbmQgY21kID0geworCQkuaG9zdF9jb21tYW5kID0gU0VUX1NFQ1VSSVRZX0lORk9STUFUSU9OLAorCQkuaG9zdF9jb21tYW5kX3NlcXVlbmNlID0gMCwKKwkJLmhvc3RfY29tbWFuZF9sZW5ndGggPSBzaXplb2Yoc3RydWN0IHNlY3VyaXR5X2luZm9fcGFyYW1zKQorCX07CisJc3RydWN0IHNlY3VyaXR5X2luZm9fcGFyYW1zICpzZWN1cml0eSA9CisJCShzdHJ1Y3Qgc2VjdXJpdHlfaW5mb19wYXJhbXMgKikmY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzOworCWludCBlcnI7CisJbWVtc2V0KHNlY3VyaXR5LCAwLCBzaXplb2YoKnNlY3VyaXR5KSk7CisKKwkvKiBJZiBzaGFyZWQga2V5IEFQIGF1dGhlbnRpY2F0aW9uIGlzIHR1cm5lZCBvbiwgdGhlbiB3ZSBuZWVkIHRvCisJICogY29uZmlndXJlIHRoZSBmaXJtd2FyZSB0byB0cnkgYW5kIHVzZSBpdC4KKwkgKgorCSAqIEFjdHVhbCBkYXRhIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBob3N0LiAqLworCXNlY3VyaXR5LT5hdXRoX21vZGUgPSBhdXRoX21vZGU7CisJc2VjdXJpdHktPnVuaWNhc3RfdXNpbmdfZ3JvdXAgPSB1bmljYXN0X3VzaW5nX2dyb3VwOworCisJc3dpdGNoIChzZWN1cml0eV9sZXZlbCkgeworCWRlZmF1bHQ6CisJY2FzZSBTRUNfTEVWRUxfMDoKKwkJc2VjdXJpdHktPmFsbG93ZWRfY2lwaGVycyA9IElQV19OT05FX0NJUEhFUjsKKwkJYnJlYWs7CisJY2FzZSBTRUNfTEVWRUxfMToKKwkJc2VjdXJpdHktPmFsbG93ZWRfY2lwaGVycyA9IElQV19XRVA0MF9DSVBIRVIgfAorCQkJSVBXX1dFUDEwNF9DSVBIRVI7CisJCWJyZWFrOworCWNhc2UgU0VDX0xFVkVMXzI6CisJCXNlY3VyaXR5LT5hbGxvd2VkX2NpcGhlcnMgPSBJUFdfV0VQNDBfQ0lQSEVSIHwKKwkJCUlQV19XRVAxMDRfQ0lQSEVSIHwgSVBXX1RLSVBfQ0lQSEVSOworCQlicmVhazsKKwljYXNlIFNFQ19MRVZFTF8yX0NLSVA6CisJCXNlY3VyaXR5LT5hbGxvd2VkX2NpcGhlcnMgPSBJUFdfV0VQNDBfQ0lQSEVSIHwKKwkJCUlQV19XRVAxMDRfQ0lQSEVSIHwgSVBXX0NLSVBfQ0lQSEVSOworCQlicmVhazsKKwljYXNlIFNFQ19MRVZFTF8zOgorCQlzZWN1cml0eS0+YWxsb3dlZF9jaXBoZXJzID0gSVBXX1dFUDQwX0NJUEhFUiB8CisJCQlJUFdfV0VQMTA0X0NJUEhFUiB8IElQV19US0lQX0NJUEhFUiB8IElQV19DQ01QX0NJUEhFUjsKKwkJYnJlYWs7CisJfQorCisJSVBXX0RFQlVHX0hDKAorCQkiU0VUX1NFQ1VSSVRZX0lORk9STUFUSU9OOiBhdXRoOiVkIGNpcGhlcjoweCUwMlggKGxldmVsICVkKVxuIiwKKwkJc2VjdXJpdHktPmF1dGhfbW9kZSwgc2VjdXJpdHktPmFsbG93ZWRfY2lwaGVycywgc2VjdXJpdHlfbGV2ZWwpOworCisJc2VjdXJpdHktPnJlcGxheV9jb3VudGVyc19udW1iZXIgPSAwOworCisJaWYgKCFiYXRjaF9tb2RlKSB7CisJCWVyciA9IGlwdzIxMDBfZGlzYWJsZV9hZGFwdGVyKHByaXYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBpcHcyMTAwX2h3X3NlbmRfY29tbWFuZChwcml2LCAmY21kKTsKKworCWlmICghYmF0Y2hfbW9kZSkKKwkJaXB3MjEwMF9lbmFibGVfYWRhcHRlcihwcml2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF9zZXRfdHhfcG93ZXIoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKKwkJCQl1MzIgdHhfcG93ZXIpCit7CisJc3RydWN0IGhvc3RfY29tbWFuZCBjbWQgPSB7CisJCS5ob3N0X2NvbW1hbmQgPSBUWF9QT1dFUl9JTkRFWCwKKwkJLmhvc3RfY29tbWFuZF9zZXF1ZW5jZSA9IDAsCisJCS5ob3N0X2NvbW1hbmRfbGVuZ3RoID0gNAorCX07CisJaW50IGVyciA9IDA7CisKKwljbWQuaG9zdF9jb21tYW5kX3BhcmFtZXRlcnNbMF0gPSB0eF9wb3dlcjsKKworCWlmIChwcml2LT5pZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCWVyciA9IGlwdzIxMDBfaHdfc2VuZF9jb21tYW5kKHByaXYsICZjbWQpOworCWlmICghZXJyKQorCQlwcml2LT50eF9wb3dlciA9IHR4X3Bvd2VyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF9zZXRfaWJzc19iZWFjb25faW50ZXJ2YWwoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKKwkJCQkJICAgIHUzMiBpbnRlcnZhbCwgaW50IGJhdGNoX21vZGUpCit7CisJc3RydWN0IGhvc3RfY29tbWFuZCBjbWQgPSB7CisJCS5ob3N0X2NvbW1hbmQgPSBCRUFDT05fSU5URVJWQUwsCisJCS5ob3N0X2NvbW1hbmRfc2VxdWVuY2UgPSAwLAorCQkuaG9zdF9jb21tYW5kX2xlbmd0aCA9IDQKKwl9OworCWludCBlcnI7CisKKwljbWQuaG9zdF9jb21tYW5kX3BhcmFtZXRlcnNbMF0gPSBpbnRlcnZhbDsKKworCUlQV19ERUJVR19JTkZPKCJlbnRlclxuIik7CisKKwlpZiAocHJpdi0+aWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCWlmICghYmF0Y2hfbW9kZSkgeworCQkJZXJyID0gaXB3MjEwMF9kaXNhYmxlX2FkYXB0ZXIocHJpdik7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKworCQlpcHcyMTAwX2h3X3NlbmRfY29tbWFuZChwcml2LCAmY21kKTsKKworCQlpZiAoIWJhdGNoX21vZGUpIHsKKwkJCWVyciA9IGlwdzIxMDBfZW5hYmxlX2FkYXB0ZXIocHJpdik7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlJUFdfREVCVUdfSU5GTygiZXhpdFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGlwdzIxMDBfcXVldWVzX2luaXRpYWxpemUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwlpcHcyMTAwX3R4X2luaXRpYWxpemUocHJpdik7CisJaXB3MjEwMF9yeF9pbml0aWFsaXplKHByaXYpOworCWlwdzIxMDBfbXNnX2luaXRpYWxpemUocHJpdik7Cit9CisKK3ZvaWQgaXB3MjEwMF9xdWV1ZXNfZnJlZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQoreworCWlwdzIxMDBfdHhfZnJlZShwcml2KTsKKwlpcHcyMTAwX3J4X2ZyZWUocHJpdik7CisJaXB3MjEwMF9tc2dfZnJlZShwcml2KTsKK30KKworaW50IGlwdzIxMDBfcXVldWVzX2FsbG9jYXRlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCit7CisJaWYgKGlwdzIxMDBfdHhfYWxsb2NhdGUocHJpdikgfHwKKwkgICAgaXB3MjEwMF9yeF9hbGxvY2F0ZShwcml2KSB8fAorCSAgICBpcHcyMTAwX21zZ19hbGxvY2F0ZShwcml2KSkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIDA7CisKKyBmYWlsOgorCWlwdzIxMDBfdHhfZnJlZShwcml2KTsKKwlpcHcyMTAwX3J4X2ZyZWUocHJpdik7CisJaXB3MjEwMF9tc2dfZnJlZShwcml2KTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworI2RlZmluZSBJUFdfUFJJVkFDWV9DQVBBQkxFIDB4MDAwOAorCitzdGF0aWMgaW50IGlwdzIxMDBfc2V0X3dlcF9mbGFncyhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LCB1MzIgZmxhZ3MsCisJCQkJIGludCBiYXRjaF9tb2RlKQoreworCXN0cnVjdCBob3N0X2NvbW1hbmQgY21kID0geworCQkuaG9zdF9jb21tYW5kID0gV0VQX0ZMQUdTLAorCQkuaG9zdF9jb21tYW5kX3NlcXVlbmNlID0gMCwKKwkJLmhvc3RfY29tbWFuZF9sZW5ndGggPSA0CisJfTsKKwlpbnQgZXJyOworCisJY21kLmhvc3RfY29tbWFuZF9wYXJhbWV0ZXJzWzBdID0gZmxhZ3M7CisKKwlJUFdfREVCVUdfSEMoIldFUF9GTEFHUzogZmxhZ3MgPSAweCUwOFhcbiIsIGZsYWdzKTsKKworCWlmICghYmF0Y2hfbW9kZSkgeworCQllcnIgPSBpcHcyMTAwX2Rpc2FibGVfYWRhcHRlcihwcml2KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6ICVzOiBDb3VsZCBub3QgZGlzYWJsZSBhZGFwdGVyICVkXG4iLAorCQkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJLyogc2VuZCBjbWQgdG8gZmlybXdhcmUgKi8KKwllcnIgPSBpcHcyMTAwX2h3X3NlbmRfY29tbWFuZChwcml2LCAmY21kKTsKKworCWlmICghYmF0Y2hfbW9kZSkKKwkJaXB3MjEwMF9lbmFibGVfYWRhcHRlcihwcml2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBpcHcyMTAwX3dlcF9rZXkgeworCXU4IGlkeDsKKwl1OCBsZW47CisJdTgga2V5WzEzXTsKK307CisKKy8qIE1hY3JvcyB0byBlYXNlIHVwIHByaXRpbmcgV0VQIGtleXMgKi8KKyNkZWZpbmUgV0VQX0ZNVF82NCAgIiUwMlglMDJYJTAyWCUwMlgtJTAyWCIKKyNkZWZpbmUgV0VQX0ZNVF8xMjggIiUwMlglMDJYJTAyWCUwMlgtJTAyWCUwMlglMDJYJTAyWC0lMDJYJTAyWCUwMlgiCisjZGVmaW5lIFdFUF9TVFJfNjQoeCkgeFswXSx4WzFdLHhbMl0seFszXSx4WzRdCisjZGVmaW5lIFdFUF9TVFJfMTI4KHgpIHhbMF0seFsxXSx4WzJdLHhbM10seFs0XSx4WzVdLHhbNl0seFs3XSx4WzhdLHhbOV0seFsxMF0KKworCisvKioKKyAqIFNldCBhIHRoZSB3ZXAga2V5CisgKgorICogQHByaXY6IHN0cnVjdCB0byB3b3JrIG9uCisgKiBAaWR4OiBpbmRleCBvZiB0aGUga2V5IHdlIHdhbnQgdG8gc2V0CisgKiBAa2V5OiBwdHIgdG8gdGhlIGtleSBkYXRhIHRvIHNldAorICogQGxlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIgYXQgQGtleQorICogQGJhdGNoX21vZGU6IEZJWE1FIHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBpbiBiYXRjaCBtb2RlLCBub3QKKyAqICAgICAgICAgICAgICBkaXNhYmxpbmcgdGhlIGRldmljZS4KKyAqCisgKiBAcmV0dXJucyAwIGlmIE9LLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvci4KKyAqCisgKiBGaWxsIG91dCBhIGNvbW1hbmQgc3RydWN0dXJlIHdpdGggdGhlIG5ldyB3ZXAga2V5LCBsZW5ndGggYW4KKyAqIGluZGV4IGFuZCBzZW5kIGl0IGRvd24gdGhlIHdpcmUuCisgKi8KK3N0YXRpYyBpbnQgaXB3MjEwMF9zZXRfa2V5KHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsCisJCQkgICBpbnQgaWR4LCBjaGFyICprZXksIGludCBsZW4sIGludCBiYXRjaF9tb2RlKQoreworCWludCBrZXlsZW4gPSBsZW4gPyAobGVuIDw9IDUgPyA1IDogMTMpIDogMDsKKwlzdHJ1Y3QgaG9zdF9jb21tYW5kIGNtZCA9IHsKKwkJLmhvc3RfY29tbWFuZCA9IFdFUF9LRVlfSU5GTywKKwkJLmhvc3RfY29tbWFuZF9zZXF1ZW5jZSA9IDAsCisJCS5ob3N0X2NvbW1hbmRfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX3dlcF9rZXkpLAorCX07CisJc3RydWN0IGlwdzIxMDBfd2VwX2tleSAqd2VwX2tleSA9ICh2b2lkKiljbWQuaG9zdF9jb21tYW5kX3BhcmFtZXRlcnM7CisJaW50IGVycjsKKworCUlQV19ERUJVR19IQygiV0VQX0tFWV9JTkZPOiBpbmRleCA9ICVkLCBsZW4gPSAlZC8lZFxuIiwKKwkJCQkgaWR4LCBrZXlsZW4sIGxlbik7CisKKwkvKiBOT1RFOiBXZSBkb24ndCBjaGVjayBjYWNoZWQgdmFsdWVzIGluIGNhc2UgdGhlIGZpcm13YXJlIHdhcyByZXNldAorCSAqIG9yIHNvbWUgb3RoZXIgcHJvYmxlbSBpcyBvY2N1cmluZy4gIElmIHRoZSB1c2VyIGlzIHNldHRpbmcgdGhlIGtleSwKKwkgKiB0aGVuIHdlIHB1c2ggdGhlIGNoYW5nZSAqLworCisJd2VwX2tleS0+aWR4ID0gaWR4OworCXdlcF9rZXktPmxlbiA9IGtleWxlbjsKKworCWlmIChrZXlsZW4pIHsKKwkJbWVtY3B5KHdlcF9rZXktPmtleSwga2V5LCBsZW4pOworCQltZW1zZXQod2VwX2tleS0+a2V5ICsgbGVuLCAwLCBrZXlsZW4gLSBsZW4pOworCX0KKworCS8qIFdpbGwgYmUgb3B0aW1pemVkIG91dCBvbiBkZWJ1ZyBub3QgYmVpbmcgY29uZmlndXJlZCBpbiAqLworCWlmIChrZXlsZW4gPT0gMCkKKwkJSVBXX0RFQlVHX1dFUCgiJXM6IENsZWFyaW5nIGtleSAlZFxuIiwKKwkJCQkgIHByaXYtPm5ldF9kZXYtPm5hbWUsIHdlcF9rZXktPmlkeCk7CisJZWxzZSBpZiAoa2V5bGVuID09IDUpCisJCUlQV19ERUJVR19XRVAoIiVzOiBpZHg6ICVkLCBsZW46ICVkIGtleTogIiBXRVBfRk1UXzY0ICJcbiIsCisJCQkJICBwcml2LT5uZXRfZGV2LT5uYW1lLCB3ZXBfa2V5LT5pZHgsIHdlcF9rZXktPmxlbiwKKwkJCQkgIFdFUF9TVFJfNjQod2VwX2tleS0+a2V5KSk7CisJZWxzZQorCQlJUFdfREVCVUdfV0VQKCIlczogaWR4OiAlZCwgbGVuOiAlZCBrZXk6ICIgV0VQX0ZNVF8xMjgKKwkJCQkgICJcbiIsCisJCQkJICBwcml2LT5uZXRfZGV2LT5uYW1lLCB3ZXBfa2V5LT5pZHgsIHdlcF9rZXktPmxlbiwKKwkJCQkgIFdFUF9TVFJfMTI4KHdlcF9rZXktPmtleSkpOworCisJaWYgKCFiYXRjaF9tb2RlKSB7CisJCWVyciA9IGlwdzIxMDBfZGlzYWJsZV9hZGFwdGVyKHByaXYpOworCQkvKiBGSVhNRTogSVBHOiBzaG91bGRuJ3QgdGhpcyBwcmluayBiZSBpbiBfZGlzYWJsZV9hZGFwdGVyKCk/ICovCisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAlczogQ291bGQgbm90IGRpc2FibGUgYWRhcHRlciAlZFxuIiwKKwkJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIHNlbmQgY21kIHRvIGZpcm13YXJlICovCisJZXJyID0gaXB3MjEwMF9od19zZW5kX2NvbW1hbmQocHJpdiwgJmNtZCk7CisKKwlpZiAoIWJhdGNoX21vZGUpIHsKKwkJaW50IGVycjIgPSBpcHcyMTAwX2VuYWJsZV9hZGFwdGVyKHByaXYpOworCQlpZiAoZXJyID09IDApCisJCQllcnIgPSBlcnIyOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfc2V0X2tleV9pbmRleChzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LAorCQkJCSBpbnQgaWR4LCBpbnQgYmF0Y2hfbW9kZSkKK3sKKwlzdHJ1Y3QgaG9zdF9jb21tYW5kIGNtZCA9IHsKKwkJLmhvc3RfY29tbWFuZCA9IFdFUF9LRVlfSU5ERVgsCisJCS5ob3N0X2NvbW1hbmRfc2VxdWVuY2UgPSAwLAorCQkuaG9zdF9jb21tYW5kX2xlbmd0aCA9IDQsCisJCS5ob3N0X2NvbW1hbmRfcGFyYW1ldGVycyA9IHsgaWR4IH0sCisJfTsKKwlpbnQgZXJyOworCisJSVBXX0RFQlVHX0hDKCJXRVBfS0VZX0lOREVYOiBpbmRleCA9ICVkXG4iLCBpZHgpOworCisJaWYgKGlkeCA8IDAgfHwgaWR4ID4gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWJhdGNoX21vZGUpIHsKKwkJZXJyID0gaXB3MjEwMF9kaXNhYmxlX2FkYXB0ZXIocHJpdik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAlczogQ291bGQgbm90IGRpc2FibGUgYWRhcHRlciAlZFxuIiwKKwkJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIHNlbmQgY21kIHRvIGZpcm13YXJlICovCisJZXJyID0gaXB3MjEwMF9od19zZW5kX2NvbW1hbmQocHJpdiwgJmNtZCk7CisKKwlpZiAoIWJhdGNoX21vZGUpCisJCWlwdzIxMDBfZW5hYmxlX2FkYXB0ZXIocHJpdik7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgaXB3MjEwMF9jb25maWd1cmVfc2VjdXJpdHkoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKKwkJCQkgICAgICBpbnQgYmF0Y2hfbW9kZSkKK3sKKwlpbnQgaSwgZXJyLCBhdXRoX21vZGUsIHNlY19sZXZlbCwgdXNlX2dyb3VwOworCisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JVTk5JTkcpKQorCQlyZXR1cm4gMDsKKworCWlmICghYmF0Y2hfbW9kZSkgeworCQllcnIgPSBpcHcyMTAwX2Rpc2FibGVfYWRhcHRlcihwcml2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCFwcml2LT5zZWMuZW5hYmxlZCkgeworCQllcnIgPSBpcHcyMTAwX3NldF9zZWN1cml0eV9pbmZvcm1hdGlvbigKKwkJCXByaXYsIElQV19BVVRIX09QRU4sIFNFQ19MRVZFTF8wLCAwLCAxKTsKKwl9IGVsc2UgeworCQlhdXRoX21vZGUgPSBJUFdfQVVUSF9PUEVOOworCQlpZiAoKHByaXYtPnNlYy5mbGFncyAmIFNFQ19BVVRIX01PREUpICYmCisJCSAgICAocHJpdi0+c2VjLmF1dGhfbW9kZSA9PSBXTEFOX0FVVEhfU0hBUkVEX0tFWSkpCisJCQlhdXRoX21vZGUgPSBJUFdfQVVUSF9TSEFSRUQ7CisKKwkJc2VjX2xldmVsID0gU0VDX0xFVkVMXzA7CisJCWlmIChwcml2LT5zZWMuZmxhZ3MgJiBTRUNfTEVWRUwpCisJCQlzZWNfbGV2ZWwgPSBwcml2LT5zZWMubGV2ZWw7CisKKwkJdXNlX2dyb3VwID0gMDsKKwkJaWYgKHByaXYtPnNlYy5mbGFncyAmIFNFQ19VTklDQVNUX0dST1VQKQorCQkJdXNlX2dyb3VwID0gcHJpdi0+c2VjLnVuaWNhc3RfdXNlc19ncm91cDsKKworCQllcnIgPSBpcHcyMTAwX3NldF9zZWN1cml0eV9pbmZvcm1hdGlvbigKKwkJCSAgICBwcml2LCBhdXRoX21vZGUsIHNlY19sZXZlbCwgdXNlX2dyb3VwLCAxKTsKKwl9CisKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAocHJpdi0+c2VjLmVuYWJsZWQpIHsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJaWYgKCEocHJpdi0+c2VjLmZsYWdzICYgKDEgPDwgaSkpKSB7CisJCQkJbWVtc2V0KHByaXYtPnNlYy5rZXlzW2ldLCAwLCBXRVBfS0VZX0xFTik7CisJCQkJcHJpdi0+c2VjLmtleV9zaXplc1tpXSA9IDA7CisJCQl9IGVsc2UgeworCQkJCWVyciA9IGlwdzIxMDBfc2V0X2tleShwcml2LCBpLAorCQkJCQkJICAgICAgcHJpdi0+c2VjLmtleXNbaV0sCisJCQkJCQkgICAgICBwcml2LT5zZWMua2V5X3NpemVzW2ldLAorCQkJCQkJICAgICAgMSk7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBleGl0OworCQkJfQorCQl9CisKKwkJaXB3MjEwMF9zZXRfa2V5X2luZGV4KHByaXYsIHByaXYtPmllZWUtPnR4X2tleWlkeCwgMSk7CisJfQorCisJLyogQWx3YXlzIGVuYWJsZSBwcml2YWN5IHNvIHRoZSBIb3N0IGNhbiBmaWx0ZXIgV0VQIHBhY2tldHMgaWYKKwkgKiBlbmNyeXB0ZWQgZGF0YSBpcyBzZW50IHVwICovCisJZXJyID0gaXB3MjEwMF9zZXRfd2VwX2ZsYWdzKAorCQlwcml2LCBwcml2LT5zZWMuZW5hYmxlZCA/IElQV19QUklWQUNZX0NBUEFCTEUgOiAwLCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXQ7CisKKwlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19TRUNVUklUWV9VUERBVEVEOworCisgZXhpdDoKKwlpZiAoIWJhdGNoX21vZGUpCisJCWlwdzIxMDBfZW5hYmxlX2FkYXB0ZXIocHJpdik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBpcHcyMTAwX3NlY3VyaXR5X3dvcmsoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwkvKiBJZiB3ZSBoYXBwZW4gdG8gaGF2ZSByZWNvbm5lY3RlZCBiZWZvcmUgd2UgZ2V0IGEgY2hhbmNlIHRvCisJICogcHJvY2VzcyB0aGlzLCB0aGVuIHVwZGF0ZSB0aGUgc2VjdXJpdHkgc2V0dGluZ3MtLXdoaWNoIGNhdXNlcworCSAqIGEgZGlzYXNzb2NpYXRpb24gdG8gb2NjdXIgKi8KKwlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkgJiYKKwkgICAgcHJpdi0+c3RhdHVzICYgU1RBVFVTX1NFQ1VSSVRZX1VQREFURUQpCisJCWlwdzIxMDBfY29uZmlndXJlX3NlY3VyaXR5KHByaXYsIDApOworfQorCitzdGF0aWMgdm9pZCBzaGltX19zZXRfc2VjdXJpdHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5ICpzZWMpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGksIGZvcmNlX3VwZGF0ZSA9IDA7CisKKwlkb3duKCZwcml2LT5hY3Rpb25fc2VtKTsKKwlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfSU5JVElBTElaRUQpKQorCQlnb3RvIGRvbmU7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChzZWMtPmZsYWdzICYgKDEgPDwgaSkpIHsKKwkJCXByaXYtPnNlYy5rZXlfc2l6ZXNbaV0gPSBzZWMtPmtleV9zaXplc1tpXTsKKwkJCWlmIChzZWMtPmtleV9zaXplc1tpXSA9PSAwKQorCQkJCXByaXYtPnNlYy5mbGFncyAmPSB+KDEgPDwgaSk7CisJCQllbHNlCisJCQkJbWVtY3B5KHByaXYtPnNlYy5rZXlzW2ldLCBzZWMtPmtleXNbaV0sCisJCQkJICAgICAgIHNlYy0+a2V5X3NpemVzW2ldKTsKKwkJCXByaXYtPnNlYy5mbGFncyB8PSAoMSA8PCBpKTsKKwkJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfU0VDVVJJVFlfVVBEQVRFRDsKKwkJfQorCX0KKworCWlmICgoc2VjLT5mbGFncyAmIFNFQ19BQ1RJVkVfS0VZKSAmJgorCSAgICBwcml2LT5zZWMuYWN0aXZlX2tleSAhPSBzZWMtPmFjdGl2ZV9rZXkpIHsKKwkJaWYgKHNlYy0+YWN0aXZlX2tleSA8PSAzKSB7CisJCQlwcml2LT5zZWMuYWN0aXZlX2tleSA9IHNlYy0+YWN0aXZlX2tleTsKKwkJCXByaXYtPnNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKKwkJfSBlbHNlCisJCQlwcml2LT5zZWMuZmxhZ3MgJj0gflNFQ19BQ1RJVkVfS0VZOworCisJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfU0VDVVJJVFlfVVBEQVRFRDsKKwl9CisKKwlpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQVVUSF9NT0RFKSAmJgorCSAgICAocHJpdi0+c2VjLmF1dGhfbW9kZSAhPSBzZWMtPmF1dGhfbW9kZSkpIHsKKwkJcHJpdi0+c2VjLmF1dGhfbW9kZSA9IHNlYy0+YXV0aF9tb2RlOworCQlwcml2LT5zZWMuZmxhZ3MgfD0gU0VDX0FVVEhfTU9ERTsKKwkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19TRUNVUklUWV9VUERBVEVEOworCX0KKworCWlmIChzZWMtPmZsYWdzICYgU0VDX0VOQUJMRUQgJiYKKwkgICAgcHJpdi0+c2VjLmVuYWJsZWQgIT0gc2VjLT5lbmFibGVkKSB7CisJCXByaXYtPnNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsKKwkJcHJpdi0+c2VjLmVuYWJsZWQgPSBzZWMtPmVuYWJsZWQ7CisJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfU0VDVVJJVFlfVVBEQVRFRDsKKwkJZm9yY2VfdXBkYXRlID0gMTsKKwl9CisKKwlpZiAoc2VjLT5mbGFncyAmIFNFQ19MRVZFTCAmJgorCSAgICBwcml2LT5zZWMubGV2ZWwgIT0gc2VjLT5sZXZlbCkgeworCQlwcml2LT5zZWMubGV2ZWwgPSBzZWMtPmxldmVsOworCQlwcml2LT5zZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1NFQ1VSSVRZX1VQREFURUQ7CisJfQorCisJSVBXX0RFQlVHX1dFUCgiU2VjdXJpdHkgZmxhZ3M6ICVjICVjJWMlYyVjICVjJWMlYyVjXG4iLAorCQkJICBwcml2LT5zZWMuZmxhZ3MgJiAoMTw8OCkgPyAnMScgOiAnMCcsCisJCQkgIHByaXYtPnNlYy5mbGFncyAmICgxPDw3KSA/ICcxJyA6ICcwJywKKwkJCSAgcHJpdi0+c2VjLmZsYWdzICYgKDE8PDYpID8gJzEnIDogJzAnLAorCQkJICBwcml2LT5zZWMuZmxhZ3MgJiAoMTw8NSkgPyAnMScgOiAnMCcsCisJCQkgIHByaXYtPnNlYy5mbGFncyAmICgxPDw0KSA/ICcxJyA6ICcwJywKKwkJCSAgcHJpdi0+c2VjLmZsYWdzICYgKDE8PDMpID8gJzEnIDogJzAnLAorCQkJICBwcml2LT5zZWMuZmxhZ3MgJiAoMTw8MikgPyAnMScgOiAnMCcsCisJCQkgIHByaXYtPnNlYy5mbGFncyAmICgxPDwxKSA/ICcxJyA6ICcwJywKKwkJCSAgcHJpdi0+c2VjLmZsYWdzICYgKDE8PDApID8gJzEnIDogJzAnKTsKKworLyogQXMgYSB0ZW1wb3Jhcnkgd29yayBhcm91bmQgdG8gZW5hYmxlIFdQQSB1bnRpbCB3ZSBmaWd1cmUgb3V0IHdoeQorICogd3BhX3N1cHBsaWNhbnQgdG9nZ2xlcyB0aGUgc2VjdXJpdHkgY2FwYWJpbGl0eSBvZiB0aGUgZHJpdmVyLCB3aGljaAorICogZm9yY2VzIGEgZGlzYXNzb2NhdGlvbiB3aXRoIGZvcmNlX3VwZGF0ZS4uLgorICoKKyAqCWlmIChmb3JjZV91cGRhdGUgfHwgIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkpKi8KKwlpZiAoIShwcml2LT5zdGF0dXMgJiAoU1RBVFVTX0FTU09DSUFURUQgfCBTVEFUVVNfQVNTT0NJQVRJTkcpKSkKKwkJaXB3MjEwMF9jb25maWd1cmVfc2VjdXJpdHkocHJpdiwgMCk7Citkb25lOgorCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKK30KKworc3RhdGljIGludCBpcHcyMTAwX2FkYXB0ZXJfc2V0dXAoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwlpbnQgZXJyOworCWludCBiYXRjaF9tb2RlID0gMTsKKwl1OCAqYnNzaWQ7CisKKwlJUFdfREVCVUdfSU5GTygiZW50ZXJcbiIpOworCisJZXJyID0gaXB3MjEwMF9kaXNhYmxlX2FkYXB0ZXIocHJpdik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKyNpZmRlZiBDT05GSUdfSVBXMjEwMF9NT05JVE9SCisJaWYgKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7CisJCWVyciA9IGlwdzIxMDBfc2V0X2NoYW5uZWwocHJpdiwgcHJpdi0+Y2hhbm5lbCwgYmF0Y2hfbW9kZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCUlQV19ERUJVR19JTkZPKCJleGl0XG4iKTsKKworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYgLyogQ09ORklHX0lQVzIxMDBfTU9OSVRPUiAqLworCisJZXJyID0gaXB3MjEwMF9yZWFkX21hY19hZGRyZXNzKHByaXYpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlPOworCisJZXJyID0gaXB3MjEwMF9zZXRfbWFjX2FkZHJlc3MocHJpdiwgYmF0Y2hfbW9kZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGlwdzIxMDBfc2V0X3BvcnRfdHlwZShwcml2LCBwcml2LT5pZWVlLT5pd19tb2RlLCBiYXRjaF9tb2RlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQllcnIgPSBpcHcyMTAwX3NldF9jaGFubmVsKHByaXYsIHByaXYtPmNoYW5uZWwsIGJhdGNoX21vZGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgID0gaXB3MjEwMF9zeXN0ZW1fY29uZmlnKHByaXYsIGJhdGNoX21vZGUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBpcHcyMTAwX3NldF90eF9yYXRlcyhwcml2LCBwcml2LT50eF9yYXRlcywgYmF0Y2hfbW9kZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIERlZmF1bHQgdG8gcG93ZXIgbW9kZSBPRkYgKi8KKwllcnIgPSBpcHcyMTAwX3NldF9wb3dlcl9tb2RlKHByaXYsIElQV19QT1dFUl9NT0RFX0NBTSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGlwdzIxMDBfc2V0X3J0c190aHJlc2hvbGQocHJpdiwgcHJpdi0+cnRzX3RocmVzaG9sZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChwcml2LT5jb25maWcgJiBDRkdfU1RBVElDX0JTU0lEKQorCQlic3NpZCA9IHByaXYtPmJzc2lkOworCWVsc2UKKwkJYnNzaWQgPSBOVUxMOworCWVyciA9IGlwdzIxMDBfc2V0X21hbmRhdG9yeV9ic3NpZChwcml2LCBic3NpZCwgYmF0Y2hfbW9kZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChwcml2LT5jb25maWcgJiBDRkdfU1RBVElDX0VTU0lEKQorCQllcnIgPSBpcHcyMTAwX3NldF9lc3NpZChwcml2LCBwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfbGVuLAorCQkJCQliYXRjaF9tb2RlKTsKKwllbHNlCisJCWVyciA9IGlwdzIxMDBfc2V0X2Vzc2lkKHByaXYsIE5VTEwsIDAsIGJhdGNoX21vZGUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBpcHcyMTAwX2NvbmZpZ3VyZV9zZWN1cml0eShwcml2LCBiYXRjaF9tb2RlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQllcnIgPSBpcHcyMTAwX3NldF9pYnNzX2JlYWNvbl9pbnRlcnZhbCgKKwkJCXByaXYsIHByaXYtPmJlYWNvbl9pbnRlcnZhbCwgYmF0Y2hfbW9kZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWVyciA9IGlwdzIxMDBfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyoKKwkgIGVyciA9IGlwdzIxMDBfc2V0X2ZyYWdtZW50YXRpb25fdGhyZXNob2xkKAorCSAgcHJpdiwgcHJpdi0+ZnJhZ190aHJlc2hvbGQsIGJhdGNoX21vZGUpOworCSAgaWYgKGVycikKKwkgIHJldHVybiBlcnI7CisJKi8KKworCUlQV19ERUJVR19JTkZPKCJleGl0XG4iKTsKKworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRVhURVJOQUxMWSBDQUxMRUQgTUVUSE9EUworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIG5ldHdvcmsgbGF5ZXIgLS0gbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGgKKyAqIGlwdzIxMDBfc2V0X21hY19hZGRyZXNzKCkgZGVjbGFyZWQgYWJvdmUgY2FsbGVkIGJ5IHRoaXMgZHJpdmVyIChhbmQgdGhpcworICogbWV0aG9kIGFzIHdlbGwpIHRvIHRhbGsgdG8gdGhlIGZpcm13YXJlICovCitzdGF0aWMgaW50IGlwdzIxMDBfc2V0X2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCWludCBlcnIgPSAwOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwlkb3duKCZwcml2LT5hY3Rpb25fc2VtKTsKKworCXByaXYtPmNvbmZpZyB8PSBDRkdfQ1VTVE9NX01BQzsKKwltZW1jcHkocHJpdi0+bWFjX2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKworCWVyciA9IGlwdzIxMDBfc2V0X21hY19hZGRyZXNzKHByaXYsIDApOworCWlmIChlcnIpCisJCWdvdG8gZG9uZTsKKworCXByaXYtPnJlc2V0X2JhY2tvZmYgPSAwOworCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKKwlpcHcyMTAwX3Jlc2V0X2FkYXB0ZXIocHJpdik7CisJcmV0dXJuIDA7CisKKyBkb25lOgorCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJSVBXX0RFQlVHX0lORk8oImRldi0+b3BlblxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKKwlpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX0FTU09DSUFURUQpIHsKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb3dfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKwlzdHJ1Y3QgaXB3MjEwMF90eF9wYWNrZXQgKnBhY2tldDsKKworCUlQV19ERUJVR19JTkZPKCJlbnRlclxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKKworCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBGbHVzaCB0aGUgVFggcXVldWUgLi4uICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwcml2LT50eF9wZW5kX2xpc3QpKSB7CisJCWVsZW1lbnQgPSBwcml2LT50eF9wZW5kX2xpc3QubmV4dDsKKyAgICAgICAgICAgICAgICBwYWNrZXQgPSBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpcHcyMTAwX3R4X3BhY2tldCwgbGlzdCk7CisKKwkJbGlzdF9kZWwoZWxlbWVudCk7CisJCURFQ19TVEFUKCZwcml2LT50eF9wZW5kX3N0YXQpOworCisJCWllZWU4MDIxMV90eGJfZnJlZShwYWNrZXQtPmluZm8uZF9zdHJ1Y3QudHhiKTsKKwkJcGFja2V0LT5pbmZvLmRfc3RydWN0LnR4YiA9IE5VTEw7CisKKwkJbGlzdF9hZGRfdGFpbChlbGVtZW50LCAmcHJpdi0+dHhfZnJlZV9saXN0KTsKKwkJSU5DX1NUQVQoJnByaXYtPnR4X2ZyZWVfc3RhdCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvd19sb2NrLCBmbGFncyk7CisKKwlJUFdfREVCVUdfSU5GTygiZXhpdFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qCisgKiBUT0RPOiAgRml4IHRoaXMgZnVuY3Rpb24uLi4gaXRzIGp1c3Qgd3JvbmcKKyAqLworc3RhdGljIHZvaWQgaXB3MjEwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlwcml2LT5pZWVlLT5zdGF0cy50eF9lcnJvcnMrKzsKKworI2lmZGVmIENPTkZJR19JUFcyMTAwX01PTklUT1IKKwlpZiAocHJpdi0+aWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJldHVybjsKKyNlbmRpZgorCisJSVBXX0RFQlVHX0lORk8oIiVzOiBUWCB0aW1lZCBvdXQuICBTY2hlZHVsaW5nIGZpcm13YXJlIHJlc3RhcnQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwlzY2hlZHVsZV9yZXNldChwcml2KTsKK30KKworCisvKgorICogVE9ETzogcmVpbXBsZW1lbnQgaXQgc28gdGhhdCBpdCByZWFkcyBzdGF0aXN0aWNzCisgKiAgICAgICBmcm9tIHRoZSBhZGFwdGVyIHVzaW5nIG9yZGluYWwgdGFibGVzCisgKiAgICAgICBpbnN0ZWFkIG9mL2luIGFkZGl0aW9uIHRvIGNvbGxlY3RpbmcgdGhlbQorICogICAgICAgaW4gdGhlIGRyaXZlcgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlwdzIxMDBfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiAmcHJpdi0+aWVlZS0+c3RhdHM7Cit9CisKKy8qIFN1cHBvcnQgZm9yIHdwYV9zdXBwbGljYW50LiBXaWxsIGJlIHJlcGxhY2VkIHdpdGggV0VYVCBvbmNlCisgKiB0aGV5IGdldCBXUEEgc3VwcG9ydC4gKi8KKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX1dQQQorCisvKiBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgbXVzdCBtYXRjaCBkZWZpbml0aW9ucyBpbiBkcml2ZXJfaXB3MjEwMC5jICovCisKKyNkZWZpbmUgSVBXMjEwMF9JT0NUTF9XUEFfU1VQUExJQ0FOVAkJU0lPQ0lXRklSU1RQUklWKzMwCisKKyNkZWZpbmUgSVBXMjEwMF9DTURfU0VUX1dQQV9QQVJBTQkJMQorI2RlZmluZQlJUFcyMTAwX0NNRF9TRVRfV1BBX0lFCQkJMgorI2RlZmluZSBJUFcyMTAwX0NNRF9TRVRfRU5DUllQVElPTgkJMworI2RlZmluZSBJUFcyMTAwX0NNRF9NTE1FCQkJNAorCisjZGVmaW5lIElQVzIxMDBfUEFSQU1fV1BBX0VOQUJMRUQJCTEKKyNkZWZpbmUgSVBXMjEwMF9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUwkyCisjZGVmaW5lIElQVzIxMDBfUEFSQU1fRFJPUF9VTkVOQ1JZUFRFRAkJMworI2RlZmluZSBJUFcyMTAwX1BBUkFNX1BSSVZBQ1lfSU5WT0tFRAkJNAorI2RlZmluZSBJUFcyMTAwX1BBUkFNX0FVVEhfQUxHUwkJCTUKKyNkZWZpbmUgSVBXMjEwMF9QQVJBTV9JRUVFXzgwMl8xWAkJNgorCisjZGVmaW5lIElQVzIxMDBfTUxNRV9TVEFfREVBVVRICQkJMQorI2RlZmluZSBJUFcyMTAwX01MTUVfU1RBX0RJU0FTU09DCQkyCisKKyNkZWZpbmUgSVBXMjEwMF9DUllQVF9FUlJfVU5LTk9XTl9BTEcJCTIKKyNkZWZpbmUgSVBXMjEwMF9DUllQVF9FUlJfVU5LTk9XTl9BRERSCQkzCisjZGVmaW5lIElQVzIxMDBfQ1JZUFRfRVJSX0NSWVBUX0lOSVRfRkFJTEVECTQKKyNkZWZpbmUgSVBXMjEwMF9DUllQVF9FUlJfS0VZX1NFVF9GQUlMRUQJNQorI2RlZmluZSBJUFcyMTAwX0NSWVBUX0VSUl9UWF9LRVlfU0VUX0ZBSUxFRAk2CisjZGVmaW5lIElQVzIxMDBfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQJNworCisjZGVmaW5lCUlQVzIxMDBfQ1JZUFRfQUxHX05BTUVfTEVOCQkxNgorCitzdHJ1Y3QgaXB3MjEwMF9wYXJhbSB7CisJdTMyIGNtZDsKKwl1OCBzdGFfYWRkcltFVEhfQUxFTl07CisgICAgICAgIHVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXU4IG5hbWU7CisJCQl1MzIgdmFsdWU7CisJCX0gd3BhX3BhcmFtOworCQlzdHJ1Y3QgeworCQkJdTMyIGxlbjsKKwkJCXU4ICpkYXRhOworCQl9IHdwYV9pZTsKKwkgICAgICAgIHN0cnVjdHsKKwkJCWludCBjb21tYW5kOworICAgIAkJCWludCByZWFzb25fY29kZTsKKwkJfSBtbG1lOworCQlzdHJ1Y3QgeworCQkJdTggYWxnW0lQVzIxMDBfQ1JZUFRfQUxHX05BTUVfTEVOXTsKKwkJCXU4IHNldF90eDsKKwkJCXUzMiBlcnI7CisJCQl1OCBpZHg7CisJCQl1OCBzZXFbOF07IC8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCisJCQl1MTYga2V5X2xlbjsKKwkJCXU4IGtleVswXTsKKwkJfSBjcnlwdDsKKworCX0gdTsKK307CisKKy8qIGVuZCBvZiBkcml2ZXJfaXB3MjEwMC5jIGNvZGUgKi8KKworc3RhdGljIGludCBpcHcyMTAwX3dwYV9lbmFibGUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgaW50IHZhbHVlKXsKKworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gU0VDX0xFVkVMIHwgU0VDX0VOQUJMRUQsCisJfTsKKwlpbnQgcmV0ID0gMDsKKworCWllZWUtPndwYV9lbmFibGVkID0gdmFsdWU7CisKKwlpZiAodmFsdWUpeworCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMzsKKwkJc2VjLmVuYWJsZWQgPSAxOworCX0gZWxzZSB7CisJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworCQlzZWMuZW5hYmxlZCA9IDA7CisJfQorCisJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisJZWxzZQorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgQVVUSF9BTEdfT1BFTl9TWVNURU0JCQkweDEKKyNkZWZpbmUgQVVUSF9BTEdfU0hBUkVEX0tFWQkJCTB4MgorCitzdGF0aWMgaW50IGlwdzIxMDBfd3BhX3NldF9hdXRoX2FsZ3Moc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgaW50IHZhbHVlKXsKKworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gU0VDX0FVVEhfTU9ERSwKKwl9OworCWludCByZXQgPSAwOworCisJaWYgKHZhbHVlICYgQVVUSF9BTEdfU0hBUkVEX0tFWSl7CisJCXNlYy5hdXRoX21vZGUgPSBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKKwkJaWVlZS0+b3Blbl93ZXAgPSAwOworCX0gZWxzZSB7CisJCXNlYy5hdXRoX21vZGUgPSBXTEFOX0FVVEhfT1BFTjsKKwkJaWVlZS0+b3Blbl93ZXAgPSAxOworCX0KKworCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisJCWllZWUtPnNldF9zZWN1cml0eShpZWVlLT5kZXYsICZzZWMpOworCWVsc2UKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgaXB3MjEwMF93cGFfc2V0X3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IG5hbWUsIHUzMiB2YWx1ZSl7CisKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0PTA7CisKKwlzd2l0Y2gobmFtZSl7CisJCWNhc2UgSVBXMjEwMF9QQVJBTV9XUEFfRU5BQkxFRDoKKwkJCXJldCA9IGlwdzIxMDBfd3BhX2VuYWJsZShwcml2LCB2YWx1ZSk7CisJCQlicmVhazsKKworCQljYXNlIElQVzIxMDBfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVM6CisJCQlwcml2LT5pZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcz12YWx1ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBXMjEwMF9QQVJBTV9EUk9QX1VORU5DUllQVEVEOgorCQkJcHJpdi0+aWVlZS0+ZHJvcF91bmVuY3J5cHRlZD12YWx1ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBXMjEwMF9QQVJBTV9QUklWQUNZX0lOVk9LRUQ6CisJCQlwcml2LT5pZWVlLT5wcml2YWN5X2ludm9rZWQ9dmFsdWU7CisJCQlicmVhazsKKworCQljYXNlIElQVzIxMDBfUEFSQU1fQVVUSF9BTEdTOgorCQkJcmV0ID0gaXB3MjEwMF93cGFfc2V0X2F1dGhfYWxncyhwcml2LCB2YWx1ZSk7CisJCQlicmVhazsKKworCQljYXNlIElQVzIxMDBfUEFSQU1fSUVFRV84MDJfMVg6CisJCQlwcml2LT5pZWVlLT5pZWVlODAyXzF4PXZhbHVlOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAlczogVW5rbm93biBXUEEgcGFyYW06ICVkXG4iLAorCQkJCQkgICAgZGV2LT5uYW1lLCBuYW1lKTsKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF93cGFfbWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY29tbWFuZCwgaW50IHJlYXNvbil7CisKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0PTA7CisKKwlzd2l0Y2goY29tbWFuZCl7CisJCWNhc2UgSVBXMjEwMF9NTE1FX1NUQV9ERUFVVEg6CisJCQkvLyBzaWxlbnRseSBpZ25vcmUKKwkJCWJyZWFrOworCisJCWNhc2UgSVBXMjEwMF9NTE1FX1NUQV9ESVNBU1NPQzoKKwkJCWlwdzIxMDBfZGlzYXNzb2NpYXRlX2Jzc2lkKHByaXYpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAlczogVW5rbm93biBNTE1FIHJlcXVlc3Q6ICVkXG4iLAorCQkJCQkgICAgZGV2LT5uYW1lLCBjb21tYW5kKTsKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKwordm9pZCBpcHcyMTAwX3dwYV9hc3NvY19mcmFtZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LAorCQkJICAgICBjaGFyICp3cGFfaWUsIGludCB3cGFfaWVfbGVuKXsKKworCXN0cnVjdCBpcHcyMTAwX3dwYV9hc3NvY19mcmFtZSBmcmFtZTsKKworCWZyYW1lLmZpeGVkX2llX21hc2sgPSAwOworCisJLyogY29weSBXUEEgSUUgKi8KKwltZW1jcHkoZnJhbWUudmFyX2llLCB3cGFfaWUsIHdwYV9pZV9sZW4pOworCWZyYW1lLnZhcl9pZV9sZW4gPSB3cGFfaWVfbGVuOworCisJLyogbWFrZSBzdXJlIFdQQSBpcyBlbmFibGVkICovCisJaXB3MjEwMF93cGFfZW5hYmxlKHByaXYsIDEpOworCWlwdzIxMDBfc2V0X3dwYV9pZShwcml2LCAmZnJhbWUsIDApOworfQorCisKK3N0YXRpYyBpbnQgaXB3MjEwMF93cGFfc2V0X3dwYV9pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpcHcyMTAwX3BhcmFtICpwYXJhbSwgaW50IHBsZW4peworCisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlOworCXU4ICpidWY7CisKKwlpZiAoISBpZWVlLT53cGFfZW5hYmxlZCkKKwkgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHBhcmFtLT51LndwYV9pZS5sZW4gPiBNQVhfV1BBX0lFX0xFTiB8fAorCSAgIChwYXJhbS0+dS53cGFfaWUubGVuICYmCisJCXBhcmFtLT51LndwYV9pZS5kYXRhPT1OVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFyYW0tPnUud3BhX2llLmxlbil7CisJCWJ1ZiA9IGttYWxsb2MocGFyYW0tPnUud3BhX2llLmxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW1lbWNweShidWYsIHBhcmFtLT51LndwYV9pZS5kYXRhLCBwYXJhbS0+dS53cGFfaWUubGVuKTsKKworCQlrZnJlZShpZWVlLT53cGFfaWUpOworCQlpZWVlLT53cGFfaWUgPSBidWY7CisJCWllZWUtPndwYV9pZV9sZW4gPSBwYXJhbS0+dS53cGFfaWUubGVuOworCisJfSBlbHNlIHsKKwkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKKwkJaWVlZS0+d3BhX2llID0gTlVMTDsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IDA7CisJfQorCisJaXB3MjEwMF93cGFfYXNzb2NfZnJhbWUocHJpdiwgaWVlZS0+d3BhX2llLCBpZWVlLT53cGFfaWVfbGVuKTsKKworCXJldHVybiAwOworfQorCisvKiBpbXBsZW1lbnRhdGlvbiBib3Jyb3dlZCBmcm9tIGhvc3RhcCBkcml2ZXIgKi8KKworc3RhdGljIGludCBpcHcyMTAwX3dwYV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpcHcyMTAwX3BhcmFtICpwYXJhbSwgaW50IHBhcmFtX2xlbil7CisKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQ7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gMCwKKwl9OworCisJcGFyYW0tPnUuY3J5cHQuZXJyID0gMDsKKwlwYXJhbS0+dS5jcnlwdC5hbGdbSVBXMjEwMF9DUllQVF9BTEdfTkFNRV9MRU4gLSAxXSA9ICdcMCc7CisKKwlpZiAocGFyYW1fbGVuICE9CisJICAgIChpbnQpICgoY2hhciAqKSBwYXJhbS0+dS5jcnlwdC5rZXkgLSAoY2hhciAqKSBwYXJhbSkgKworCSAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKXsKKwkJSVBXX0RFQlVHX0lORk8oIkxlbiBtaXNtYXRjaCAlZCwgJWRcbiIsIHBhcmFtX2xlbiwgcGFyYW0tPnUuY3J5cHQua2V5X2xlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocGFyYW0tPnN0YV9hZGRyWzBdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzFdID09IDB4ZmYgJiYKKwkgICAgcGFyYW0tPnN0YV9hZGRyWzJdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzNdID09IDB4ZmYgJiYKKwkgICAgcGFyYW0tPnN0YV9hZGRyWzRdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzVdID09IDB4ZmYpIHsKKwkJaWYgKHBhcmFtLT51LmNyeXB0LmlkeCA+PSBXRVBfS0VZUykKKwkJCXJldHVybiAtRUlOVkFMOworCQljcnlwdCA9ICZpZWVlLT5jcnlwdFtwYXJhbS0+dS5jcnlwdC5pZHhdOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAibm9uZSIpID09IDApIHsKKwkJaWYgKGNyeXB0KXsKKwkJCXNlYy5lbmFibGVkID0gMDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworCQkJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEIHwgU0VDX0xFVkVMOworCQkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKwkJfQorCQlnb3RvIGRvbmU7CisJfQorCXNlYy5lbmFibGVkID0gMTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CisKKwlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKKwlpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIldFUCIpID09IDApIHsKKwkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF93ZXAiKTsKKwkJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJfSBlbHNlIGlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApIHsKKwkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF90a2lwIik7CisJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCX0gZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfY2NtcCIpOworCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKKwl9CisJaWYgKG9wcyA9PSBOVUxMKSB7CisJCUlQV19ERUJVR19JTkZPKCIlczogdW5rbm93biBjcnlwdG8gYWxnICclcydcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHBhcmFtLT51LmNyeXB0LmFsZyk7CisJCXBhcmFtLT51LmNyeXB0LmVyciA9IElQVzIxMDBfQ1JZUFRfRVJSX1VOS05PV05fQUxHOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCpjcnlwdCA9PSBOVUxMIHx8ICgqY3J5cHQpLT5vcHMgIT0gb3BzKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OworCisJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisKKwkJbmV3X2NyeXB0ID0gKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKQorCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChuZXdfY3J5cHQgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQltZW1zZXQobmV3X2NyeXB0LCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSk7CisJCW5ld19jcnlwdC0+b3BzID0gb3BzOworCQlpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKKwkJCW5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KHBhcmFtLT51LmNyeXB0LmlkeCk7CisKKwkJaWYgKG5ld19jcnlwdC0+cHJpdiA9PSBOVUxMKSB7CisJCQlrZnJlZShuZXdfY3J5cHQpOworCQkJcGFyYW0tPnUuY3J5cHQuZXJyID0KKwkJCQlJUFcyMTAwX0NSWVBUX0VSUl9DUllQVF9JTklUX0ZBSUxFRDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQkqY3J5cHQgPSBuZXdfY3J5cHQ7CisJfQorCisJaWYgKHBhcmFtLT51LmNyeXB0LmtleV9sZW4gPiAwICYmICgqY3J5cHQpLT5vcHMtPnNldF9rZXkgJiYKKwkgICAgKCpjcnlwdCktPm9wcy0+c2V0X2tleShwYXJhbS0+dS5jcnlwdC5rZXksCisJCQkJICAgcGFyYW0tPnUuY3J5cHQua2V5X2xlbiwgcGFyYW0tPnUuY3J5cHQuc2VxLAorCQkJCSAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKKwkJSVBXX0RFQlVHX0lORk8oIiVzOiBrZXkgc2V0dGluZyBmYWlsZWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJUFcyMTAwX0NSWVBUX0VSUl9LRVlfU0VUX0ZBSUxFRDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChwYXJhbS0+dS5jcnlwdC5zZXRfdHgpeworCQlpZWVlLT50eF9rZXlpZHggPSBwYXJhbS0+dS5jcnlwdC5pZHg7CisJCXNlYy5hY3RpdmVfa2V5ID0gcGFyYW0tPnUuY3J5cHQuaWR4OworCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJfQorCisJaWYgKG9wcy0+bmFtZSAhPSBOVUxMKXsKKworCQlpZiAoc3RyY21wKG9wcy0+bmFtZSwgIldFUCIpID09IDApIHsKKwkJCW1lbWNweShzZWMua2V5c1twYXJhbS0+dS5jcnlwdC5pZHhdLCBwYXJhbS0+dS5jcnlwdC5rZXksIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pOworCQkJc2VjLmtleV9zaXplc1twYXJhbS0+dS5jcnlwdC5pZHhdID0gcGFyYW0tPnUuY3J5cHQua2V5X2xlbjsKKwkJCXNlYy5mbGFncyB8PSAoMSA8PCBwYXJhbS0+dS5jcnlwdC5pZHgpOworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOworCQl9IGVsc2UgaWYgKHN0cmNtcChvcHMtPm5hbWUsICJUS0lQIikgPT0gMCkgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8yOworCQl9IGVsc2UgaWYgKHN0cmNtcChvcHMtPm5hbWUsICJDQ01QIikgPT0gMCkgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8zOworCQl9CisJfQorIGRvbmU6CisJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisKKwkvKiBEbyBub3QgcmVzZXQgcG9ydCBpZiBjYXJkIGlzIGluIE1hbmFnZWQgbW9kZSBzaW5jZSByZXNldHRpbmcgd2lsbAorCSAqIGdlbmVyYXRlIG5ldyBJRUVFIDgwMi4xMSBhdXRoZW50aWNhdGlvbiB3aGljaCBtYXkgZW5kIHVwIGluIGxvb3BpbmcKKwkgKiB3aXRoIElFRUUgODAyLjFYLiAgSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAorCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgorCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4gKi8KKwlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCisJICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgorCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmCisJICAgIGllZWUtPnJlc2V0X3BvcnQoZGV2KSkgeworCQlJUFdfREVCVUdfSU5GTygiJXM6IHJlc2V0X3BvcnQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJUFcyMTAwX0NSWVBUX0VSUl9DQVJEX0NPTkZfRkFJTEVEOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgaXB3MjEwMF93cGFfc3VwcGxpY2FudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKnApeworCisJc3RydWN0IGlwdzIxMDBfcGFyYW0gKnBhcmFtOworCWludCByZXQ9MDsKKworCUlQV19ERUJVR19JT0NUTCgid3BhX3N1cHBsaWNhbnQ6IGxlbj0lZFxuIiwgcC0+bGVuZ3RoKTsKKworCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGlwdzIxMDBfcGFyYW0pIHx8ICFwLT5wb2ludGVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhcmFtID0gKHN0cnVjdCBpcHcyMTAwX3BhcmFtICopa21hbGxvYyhwLT5sZW5ndGgsIEdGUF9LRVJORUwpOworCWlmIChwYXJhbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihwYXJhbSwgcC0+cG9pbnRlciwgcC0+bGVuZ3RoKSl7CisJCWtmcmVlKHBhcmFtKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3dpdGNoIChwYXJhbS0+Y21kKXsKKworCWNhc2UgSVBXMjEwMF9DTURfU0VUX1dQQV9QQVJBTToKKwkJcmV0ID0gaXB3MjEwMF93cGFfc2V0X3BhcmFtKGRldiwgcGFyYW0tPnUud3BhX3BhcmFtLm5hbWUsCisJCQkJCSAgICBwYXJhbS0+dS53cGFfcGFyYW0udmFsdWUpOworCQlicmVhazsKKworCWNhc2UgSVBXMjEwMF9DTURfU0VUX1dQQV9JRToKKwkJcmV0ID0gaXB3MjEwMF93cGFfc2V0X3dwYV9pZShkZXYsIHBhcmFtLCBwLT5sZW5ndGgpOworCQlicmVhazsKKworCWNhc2UgSVBXMjEwMF9DTURfU0VUX0VOQ1JZUFRJT046CisJCXJldCA9IGlwdzIxMDBfd3BhX3NldF9lbmNyeXB0aW9uKGRldiwgcGFyYW0sIHAtPmxlbmd0aCk7CisJCWJyZWFrOworCisJY2FzZSBJUFcyMTAwX0NNRF9NTE1FOgorCQlyZXQgPSBpcHcyMTAwX3dwYV9tbG1lKGRldiwgcGFyYW0tPnUubWxtZS5jb21tYW5kLAorCQkJCSAgICAgICBwYXJhbS0+dS5tbG1lLnJlYXNvbl9jb2RlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXM6IFVua25vd24gV1BBIHN1cHBsaWNhbnQgcmVxdWVzdDogJWRcbiIsCisJCQkJZGV2LT5uYW1lLCBwYXJhbS0+Y21kKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisKKwl9CisKKwlpZiAocmV0ID09IDAgJiYgY29weV90b191c2VyKHAtPnBvaW50ZXIsIHBhcmFtLCBwLT5sZW5ndGgpKQorCQlyZXQgPSAtRUZBVUxUOworCisJa2ZyZWUocGFyYW0pOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMV9XUEEgKi8KKworc3RhdGljIGludCBpcHcyMTAwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9XUEEKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisJaW50IHJldD0tMTsKKwlzd2l0Y2ggKGNtZCl7CisJICAgIGNhc2UgSVBXMjEwMF9JT0NUTF9XUEFfU1VQUExJQ0FOVDoKKwkJcmV0ID0gaXB3MjEwMF93cGFfc3VwcGxpY2FudChkZXYsICZ3cnEtPnUuZGF0YSk7CisJCXJldHVybiByZXQ7CisKKwkgICAgZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFfV1BBICovCisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKworc3RhdGljIHZvaWQgaXB3X2V0aHRvb2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwljaGFyIGZ3X3Zlcls2NF0sIHVjb2RlX3Zlcls2NF07CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKworCWlwdzIxMDBfZ2V0X2Z3dmVyc2lvbihwcml2LCBmd192ZXIsIHNpemVvZihmd192ZXIpKTsKKwlpcHcyMTAwX2dldF91Y29kZXZlcnNpb24ocHJpdiwgdWNvZGVfdmVyLCBzaXplb2YodWNvZGVfdmVyKSk7CisKKwlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksICIlczolZDolcyIsCisJCSBmd192ZXIsIHByaXYtPmVlcHJvbV92ZXJzaW9uLCB1Y29kZV92ZXIpOworCisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwcml2LT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyB1MzIgaXB3MjEwMF9ldGh0b29sX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisgICAgcmV0dXJuIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkgPyAxIDogMDsKK30KKworCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGlwdzIxMDBfZXRodG9vbF9vcHMgPSB7CisgICAgLmdldF9saW5rICAgICAgICA9IGlwdzIxMDBfZXRodG9vbF9nZXRfbGluaywKKyAgICAuZ2V0X2RydmluZm8gICAgID0gaXB3X2V0aHRvb2xfZ2V0X2RydmluZm8sCit9OworCitzdGF0aWMgdm9pZCBpcHcyMTAwX2hhbmdfY2hlY2sodm9pZCAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gYWRhcHRlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBydGMgPSAweGE1YTVhNWE1OworCXUzMiBsZW4gPSBzaXplb2YocnRjKTsKKwlpbnQgcmVzdGFydCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKKworCWlmIChwcml2LT5mYXRhbF9lcnJvciAhPSAwKSB7CisJCS8qIElmIGZhdGFsX2Vycm9yIGlzIHNldCB0aGVuIHdlIG5lZWQgdG8gcmVzdGFydCAqLworCQlJUFdfREVCVUdfSU5GTygiJXM6IEhhcmR3YXJlIGZhdGFsIGVycm9yIGRldGVjdGVkLlxuIiwKKwkJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lKTsKKworCQlyZXN0YXJ0ID0gMTsKKwl9IGVsc2UgaWYgKGlwdzIxMDBfZ2V0X29yZGluYWwocHJpdiwgSVBXX09SRF9SVENfVElNRSwgJnJ0YywgJmxlbikgfHwKKwkJICAgKHJ0YyA9PSBwcml2LT5sYXN0X3J0YykpIHsKKwkJLyogQ2hlY2sgaWYgZmlybXdhcmUgaXMgaHVuZyAqLworCQlJUFdfREVCVUdfSU5GTygiJXM6IEZpcm13YXJlIFJUQyBzdGFsbGVkLlxuIiwKKwkJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lKTsKKworCQlyZXN0YXJ0ID0gMTsKKwl9CisKKwlpZiAocmVzdGFydCkgeworCQkvKiBLaWxsIHRpbWVyICovCisJCXByaXYtPnN0b3BfaGFuZ19jaGVjayA9IDE7CisJCXByaXYtPmhhbmdzKys7CisKKwkJLyogUmVzdGFydCB0aGUgTklDICovCisJCXNjaGVkdWxlX3Jlc2V0KHByaXYpOworCX0KKworCXByaXYtPmxhc3RfcnRjID0gcnRjOworCisJaWYgKCFwcml2LT5zdG9wX2hhbmdfY2hlY2spCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5oYW5nX2NoZWNrLCBIWiAvIDIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCBpcHcyMTAwX3JmX2tpbGwodm9pZCAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gYWRhcHRlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvd19sb2NrLCBmbGFncyk7CisKKwlpZiAocmZfa2lsbF9hY3RpdmUocHJpdikpIHsKKwkJSVBXX0RFQlVHX1JGX0tJTEwoIlJGIEtpbGwgYWN0aXZlLCByZXNjaGVkdWxpbmcgR1BJTyBjaGVja1xuIik7CisJCWlmICghcHJpdi0+c3RvcF9yZl9raWxsKQorCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsIEhaKTsKKwkJZ290byBleGl0X3VubG9jazsKKwl9CisKKwkvKiBSRiBLaWxsIGlzIG5vdyBkaXNhYmxlZCwgc28gYnJpbmcgdGhlIGRldmljZSBiYWNrIHVwICovCisKKwlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfUkZfS0lMTF9NQVNLKSkgeworCQlJUFdfREVCVUdfUkZfS0lMTCgiSFcgUkYgS2lsbCBubyBsb25nZXIgYWN0aXZlLCByZXN0YXJ0aW5nICIKKwkJCQkgICJkZXZpY2VcbiIpOworCQlzY2hlZHVsZV9yZXNldChwcml2KTsKKwl9IGVsc2UKKwkJSVBXX0RFQlVHX1JGX0tJTEwoIkhXIFJGIEtpbGwgZGVhY3RpdmF0ZWQuICBTVyBSRiBLaWxsIHN0aWxsICIKKwkJCQkgICJlbmFibGVkXG4iKTsKKworIGV4aXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvd19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGlwdzIxMDBfaXJxX3Rhc2tsZXQoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdik7CisKKy8qIExvb2sgaW50byB1c2luZyBuZXRkZXYgZGVzdHJ1Y3RvciB0byBzaHV0ZG93biBpZWVlODAyMTE/ICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqaXB3MjEwMF9hbGxvY19kZXZpY2UoCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHIsCisJdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQsCisJdW5zaWduZWQgbG9uZyBtZW1fbGVuKQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWRldiA9IGFsbG9jX2llZWU4MDIxMShzaXplb2Yoc3RydWN0IGlwdzIxMDBfcHJpdikpOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKwlwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlwcml2LT5pZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcml2LT5wY2lfZGV2ID0gcGNpX2RldjsKKwlwcml2LT5uZXRfZGV2ID0gZGV2OworCisJcHJpdi0+aWVlZS0+aGFyZF9zdGFydF94bWl0ID0gaXB3MjEwMF90eDsKKwlwcml2LT5pZWVlLT5zZXRfc2VjdXJpdHkgPSBzaGltX19zZXRfc2VjdXJpdHk7CisKKwlkZXYtPm9wZW4gPSBpcHcyMTAwX29wZW47CisJZGV2LT5zdG9wID0gaXB3MjEwMF9jbG9zZTsKKwlkZXYtPmluaXQgPSBpcHcyMTAwX25ldF9pbml0OworCWRldi0+ZG9faW9jdGwgPSBpcHcyMTAwX2lvY3RsOworCWRldi0+Z2V0X3N0YXRzID0gaXB3MjEwMF9zdGF0czsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmlwdzIxMDBfZXRodG9vbF9vcHM7CisJZGV2LT50eF90aW1lb3V0ID0gaXB3MjEwMF90eF90aW1lb3V0OworCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmaXB3MjEwMF93eF9oYW5kbGVyX2RlZjsKKwlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IGlwdzIxMDBfd3hfd2lyZWxlc3Nfc3RhdHM7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBpcHcyMTAwX3NldF9hZGRyZXNzOworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAzKkhaOworCWRldi0+aXJxID0gMDsKKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyOworCWRldi0+bWVtX3N0YXJ0ID0gbWVtX3N0YXJ0OworCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgbWVtX2xlbiAtIDE7CisKKwkvKiBOT1RFOiBXZSBkb24ndCB1c2UgdGhlIHdpcmVsZXNzX2hhbmRsZXJzIGhvb2sKKwkgKiBpbiBkZXYgYXMgdGhlIHN5c3RlbSB3aWxsIHN0YXJ0IHRocm93aW5nIFdYIHJlcXVlc3RzCisJICogdG8gdXMgYmVmb3JlIHdlJ3JlIGFjdHVhbGx5IGluaXRpYWxpemVkIGFuZCBpdCBqdXN0CisJICogZW5kcyB1cCBjYXVzaW5nIHByb2JsZW1zLiAgU28sIHdlIGp1c3QgaGFuZGxlCisJICogdGhlIFdYIGV4dGVuc2lvbnMgdGhyb3VnaCB0aGUgaXB3MjEwMF9pb2N0bCBpbnRlcmZhY2UgKi8KKworCisJLyogbWVtc2V0KCkgcHV0cyBldmVyeXRoaW5nIHRvIDAsIHNvIHdlIG9ubHkgaGF2ZSBleHBsaWNpdGVseSBzZXQKKwkgKiB0aG9zZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHNvbWV0aGluZyBlbHNlICovCisKKwkvKiBJZiBwb3dlciBtYW5hZ2VtZW50IGlzIHR1cm5lZCBvbiwgZGVmYXVsdCB0byBBVVRPIG1vZGUgKi8KKwlwcml2LT5wb3dlcl9tb2RlID0gSVBXX1BPV0VSX0FVVE87CisKKworCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9XUEEKKwlwcml2LT5pZWVlLT53cGFfZW5hYmxlZCA9IDA7CisJcHJpdi0+aWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgPSAwOworCXByaXYtPmllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgPSAwOworCXByaXYtPmllZWUtPnByaXZhY3lfaW52b2tlZCA9IDA7CisJcHJpdi0+aWVlZS0+aWVlZTgwMl8xeCA9IDE7CisjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMV9XUEEgKi8KKworCS8qIFNldCBtb2R1bGUgcGFyYW1ldGVycyAqLworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMToKKwkJcHJpdi0+aWVlZS0+aXdfbW9kZSA9IElXX01PREVfQURIT0M7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19JUFcyMTAwX01PTklUT1IKKwljYXNlIDI6CisJCXByaXYtPmllZWUtPml3X21vZGUgPSBJV19NT0RFX01PTklUT1I7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwljYXNlIDA6CisJCXByaXYtPmllZWUtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCQlicmVhazsKKwl9CisKKwlpZiAoZGlzYWJsZSA9PSAxKQorCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1JGX0tJTExfU1c7CisKKwlpZiAoY2hhbm5lbCAhPSAwICYmCisJICAgICgoY2hhbm5lbCA+PSBSRUdfTUlOX0NIQU5ORUwpICYmCisJICAgICAoY2hhbm5lbCA8PSBSRUdfTUFYX0NIQU5ORUwpKSkgeworCQlwcml2LT5jb25maWcgfD0gQ0ZHX1NUQVRJQ19DSEFOTkVMOworCQlwcml2LT5jaGFubmVsID0gY2hhbm5lbDsKKwl9CisKKwlpZiAoYXNzb2NpYXRlKQorCQlwcml2LT5jb25maWcgfD0gQ0ZHX0FTU09DSUFURTsKKworCXByaXYtPmJlYWNvbl9pbnRlcnZhbCA9IERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMOworCXByaXYtPnNob3J0X3JldHJ5X2xpbWl0ID0gREVGQVVMVF9TSE9SVF9SRVRSWV9MSU1JVDsKKwlwcml2LT5sb25nX3JldHJ5X2xpbWl0ID0gREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUOworCXByaXYtPnJ0c190aHJlc2hvbGQgPSBERUZBVUxUX1JUU19USFJFU0hPTEQgfCBSVFNfRElTQUJMRUQ7CisJcHJpdi0+ZnJhZ190aHJlc2hvbGQgPSBERUZBVUxUX0ZUUyB8IEZSQUdfRElTQUJMRUQ7CisJcHJpdi0+dHhfcG93ZXIgPSBJUFdfVFhfUE9XRVJfREVGQVVMVDsKKwlwcml2LT50eF9yYXRlcyA9IERFRkFVTFRfVFhfUkFURVM7CisKKwlzdHJjcHkocHJpdi0+bmljaywgImlwdzIxMDAiKTsKKworCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb3dfbG9jayk7CisJc2VtYV9pbml0KCZwcml2LT5hY3Rpb25fc2VtLCAxKTsKKwlzZW1hX2luaXQoJnByaXYtPmFkYXB0ZXJfc2VtLCAxKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPm1zZ19mcmVlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZwcml2LT5tc2dfcGVuZF9saXN0KTsKKwlJTklUX1NUQVQoJnByaXYtPm1zZ19mcmVlX3N0YXQpOworCUlOSVRfU1RBVCgmcHJpdi0+bXNnX3BlbmRfc3RhdCk7CisKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+dHhfZnJlZV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+dHhfcGVuZF9saXN0KTsKKwlJTklUX1NUQVQoJnByaXYtPnR4X2ZyZWVfc3RhdCk7CisJSU5JVF9TVEFUKCZwcml2LT50eF9wZW5kX3N0YXQpOworCisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmZ3X3BlbmRfbGlzdCk7CisJSU5JVF9TVEFUKCZwcml2LT5md19wZW5kX3N0YXQpOworCisKKyNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORDIKKwlwcml2LT53b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FLCAwKTsKKyNlbHNlCisJcHJpdi0+d29ya3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSk7CisjZW5kaWYKKwlJTklUX1dPUksoJnByaXYtPnJlc2V0X3dvcmssCisJCSAgKHZvaWQgKCopKHZvaWQgKikpaXB3MjEwMF9yZXNldF9hZGFwdGVyLCBwcml2KTsKKwlJTklUX1dPUksoJnByaXYtPnNlY3VyaXR5X3dvcmssCisJCSAgKHZvaWQgKCopKHZvaWQgKikpaXB3MjEwMF9zZWN1cml0eV93b3JrLCBwcml2KTsKKwlJTklUX1dPUksoJnByaXYtPnd4X2V2ZW50X3dvcmssCisJCSAgKHZvaWQgKCopKHZvaWQgKikpaXB3MjEwMF93eF9ldmVudF93b3JrLCBwcml2KTsKKwlJTklUX1dPUksoJnByaXYtPmhhbmdfY2hlY2ssIGlwdzIxMDBfaGFuZ19jaGVjaywgcHJpdik7CisJSU5JVF9XT1JLKCZwcml2LT5yZl9raWxsLCBpcHcyMTAwX3JmX2tpbGwsIHByaXYpOworCisJdGFza2xldF9pbml0KCZwcml2LT5pcnFfdGFza2xldCwgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKQorCQkgICAgIGlwdzIxMDBfaXJxX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXByaXYpOworCisJLyogTk9URTogIFdlIGRvIG5vdCBzdGFydCB0aGUgZGVmZXJyZWQgd29yayBmb3Igc3RhdHVzIGNoZWNrcyB5ZXQgKi8KKwlwcml2LT5zdG9wX3JmX2tpbGwgPSAxOworCXByaXYtPnN0b3BfaGFuZ19jaGVjayA9IDE7CisKKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfcGNpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQsIG1lbV9sZW4sIG1lbV9mbGFnczsKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkciA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IE5VTEw7CisJaW50IGVyciA9IDA7CisJaW50IHJlZ2lzdGVyZWQgPSAwOworCXUzMiB2YWw7CisKKwlJUFdfREVCVUdfSU5GTygiZW50ZXJcbiIpOworCisJbWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApOworCW1lbV9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApOworCW1lbV9mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhwY2lfZGV2LCAwKTsKKworCWlmICgobWVtX2ZsYWdzICYgSU9SRVNPVVJDRV9NRU0pICE9IElPUkVTT1VSQ0VfTUVNKSB7CisJCUlQV19ERUJVR19JTkZPKCJ3ZWlyZCAtIHJlc291cmNlIHR5cGUgaXMgbm90IG1lbW9yeVxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbDsKKwl9CisKKwliYXNlX2FkZHIgPSBpb3JlbWFwX25vY2FjaGUobWVtX3N0YXJ0LCBtZW1fbGVuKTsKKwlpZiAoIWJhc2VfYWRkcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiRXJyb3IgY2FsbGluZyBpb3JlbWFwX25vY2FjaGUuXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBmYWlsOworCX0KKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG91ciBuZXRfZGV2aWNlICovCisJZGV2ID0gaXB3MjEwMF9hbGxvY19kZXZpY2UocGNpX2RldiwgYmFzZV9hZGRyLCBtZW1fc3RhcnQsIG1lbV9sZW4pOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICJFcnJvciBjYWxsaW5nIGlwdzIxMDBfYWxsb2NfZGV2aWNlLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBzZXQgdXAgUENJIG1hcHBpbmdzIGZvciBkZXZpY2UgKi8KKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICJFcnJvciBjYWxsaW5nIHBjaV9lbmFibGVfZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgcHJpdik7CisKKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIERNQV8zMkJJVF9NQVNLKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICJFcnJvciBjYWxsaW5nIHBjaV9zZXRfZG1hX21hc2suXG4iKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpX2RldiwgRFJWX05BTUUpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkgICAgICAgIkVycm9yIGNhbGxpbmcgcGNpX3JlcXVlc3RfcmVnaW9ucy5cbiIpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7CisJCXJldHVybiBlcnI7CisJfQorCisgICAgICAgIC8qIFdlIGRpc2FibGUgdGhlIFJFVFJZX1RJTUVPVVQgcmVnaXN0ZXIgKDB4NDEpIHRvIGtlZXAKKwkgKiBQQ0kgVHggcmV0cmllcyBmcm9tIGludGVyZmVyaW5nIHdpdGggQzMgQ1BVIHN0YXRlICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4NDAsICZ2YWwpOworCWlmICgodmFsICYgMHgwMDAwZmYwMCkgIT0gMCkKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQwLCB2YWwgJiAweGZmZmYwMGZmKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKworCWlmICghaXB3MjEwMF9od19pc19hZGFwdGVyX2luX3N5c3RlbShkZXYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICJEZXZpY2Ugbm90IGZvdW5kIHZpYSByZWdpc3RlciByZWFkLlxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwY2lfZGV2LT5kZXYpOworCisJLyogRm9yY2UgaW50ZXJydXB0cyB0byBiZSBzaHV0IG9mZiBvbiB0aGUgZGV2aWNlICovCisJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19JTlRfRU5BQkxFRDsKKwlpcHcyMTAwX2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBUeC9SeCBxdWV1ZXMgYW5kIGxpc3RzICovCisJaWYgKGlwdzIxMDBfcXVldWVzX2FsbG9jYXRlKHByaXYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICJFcnJvciBjYWxpbG5nIGlwdzIxMDBfcXVldWVzX2FsbG9jYXRlLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJaXB3MjEwMF9xdWV1ZXNfaW5pdGlhbGl6ZShwcml2KTsKKworCWVyciA9IHJlcXVlc3RfaXJxKHBjaV9kZXYtPmlycSwKKwkJCSAgaXB3MjEwMF9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJICBkZXYtPm5hbWUsIHByaXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkgICAgICAgIkVycm9yIGNhbGxpbmcgcmVxdWVzdF9pcnE6ICVkLlxuIiwKKwkJICAgICAgIHBjaV9kZXYtPmlycSk7CisJCWdvdG8gZmFpbDsKKwl9CisJZGV2LT5pcnEgPSBwY2lfZGV2LT5pcnE7CisKKwlJUFdfREVCVUdfSU5GTygiQXR0ZW1wdGluZyB0byByZWdpc3RlciBkZXZpY2UuLi5cbiIpOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCSAgICAgICAiOiBEZXRlY3RlZCBJbnRlbCBQUk8vV2lyZWxlc3MgMjEwMCBOZXR3b3JrIENvbm5lY3Rpb25cbiIpOworCisJLyogQnJpbmcgdXAgdGhlIGludGVyZmFjZS4gIFByZSAwLjQ2LCBhZnRlciB3ZSByZWdpc3RlcmVkIHRoZQorCSAqIG5ldHdvcmsgZGV2aWNlIHdlIHdvdWxkIGNhbGwgaXB3MjEwMF91cC4gIFRoaXMgaW50cm9kdWNlZCBhIHJhY2UKKwkgKiBjb25kaXRpb24gd2l0aCBuZXdlciBob3RwbHVnIGNvbmZpZ3VyYXRpb25zIChuZXR3b3JrIHdhcyBjb21pbmcKKwkgKiB1cCBhbmQgbWFraW5nIGNhbGxzIGJlZm9yZSB0aGUgZGV2aWNlIHdhcyBpbml0aWFsaXplZCkuCisJICoKKwkgKiBJZiB3ZSBjYWxsZWQgaXB3MjEwMF91cCBiZWZvcmUgd2UgcmVnaXN0ZXJlZCB0aGUgZGV2aWNlLCB0aGVuIHRoZQorCSAqIGRldmljZSBuYW1lIHdhc24ndCByZWdpc3RlcmVkLiAgU28sIHdlIGluc3RlYWQgdXNlIHRoZSBuZXRfZGV2LT5pbml0CisJICogbWVtYmVyIHRvIGNhbGwgYSBmdW5jdGlvbiB0aGF0IHRoZW4ganVzdCB0dXJucyBhbmQgY2FsbHMgaXB3MjEwMF91cC4KKwkgKiBuZXRfZGV2LT5pbml0IGlzIGNhbGxlZCBhZnRlciBuYW1lIGFsbG9jYXRpb24gYnV0IGJlZm9yZSB0aGUKKwkgKiBub3RpZmllciBjaGFpbiBpcyBjYWxsZWQgKi8KKwlkb3duKCZwcml2LT5hY3Rpb25fc2VtKTsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICJFcnJvciBjYWxsaW5nIHJlZ2lzdGVyX25ldGRldi5cbiIpOworCQlnb3RvIGZhaWxfdW5sb2NrOworCX0KKwlyZWdpc3RlcmVkID0gMTsKKworCUlQV19ERUJVR19JTkZPKCIlczogQm91bmQgdG8gJXNcbiIsIGRldi0+bmFtZSwgcGNpX25hbWUocGNpX2RldikpOworCisJLyogcGVyZm9ybSB0aGlzIGFmdGVyIHJlZ2lzdGVyX25ldGRldiBzbyB0aGF0IGRldi0+bmFtZSBpcyBzZXQgKi8KKwlzeXNmc19jcmVhdGVfZ3JvdXAoJnBjaV9kZXYtPmRldi5rb2JqLCAmaXB3MjEwMF9hdHRyaWJ1dGVfZ3JvdXApOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwkvKiBJZiB0aGUgUkYgS2lsbCBzd2l0Y2ggaXMgZGlzYWJsZWQsIGdvIGFoZWFkIGFuZCBjb21wbGV0ZSB0aGUKKwkgKiBzdGFydHVwIHNlcXVlbmNlICovCisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JGX0tJTExfTUFTSykpIHsKKwkJLyogRW5hYmxlIHRoZSBhZGFwdGVyIC0gc2VuZHMgSE9TVF9DT01QTEVURSAqLworCQlpZiAoaXB3MjEwMF9lbmFibGVfYWRhcHRlcihwcml2KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJICAgICAgICI6ICVzOiBmYWlsZWQgaW4gY2FsbCB0byBlbmFibGUgYWRhcHRlci5cbiIsCisJCQkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSk7CisJCQlpcHcyMTAwX2h3X3N0b3BfYWRhcHRlcihwcml2KTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIGZhaWxfdW5sb2NrOworCQl9CisKKwkJLyogU3RhcnQgYSBzY2FuIC4gLiAuICovCisJCWlwdzIxMDBfc2V0X3NjYW5fb3B0aW9ucyhwcml2KTsKKwkJaXB3MjEwMF9zdGFydF9zY2FuKHByaXYpOworCX0KKworCUlQV19ERUJVR19JTkZPKCJleGl0XG4iKTsKKworCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfSU5JVElBTElaRUQ7CisKKwl1cCgmcHJpdi0+YWN0aW9uX3NlbSk7CisKKwlyZXR1cm4gMDsKKworIGZhaWxfdW5sb2NrOgorCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKKworIGZhaWw6CisJaWYgKGRldikgeworCQlpZiAocmVnaXN0ZXJlZCkKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwkJaXB3MjEwMF9od19zdG9wX2FkYXB0ZXIocHJpdik7CisKKwkJaXB3MjEwMF9kaXNhYmxlX2ludGVycnVwdHMocHJpdik7CisKKwkJaWYgKGRldi0+aXJxKQorCQkJZnJlZV9pcnEoZGV2LT5pcnEsIHByaXYpOworCisJCWlwdzIxMDBfa2lsbF93b3JrcXVldWUocHJpdik7CisKKwkJLyogVGhlc2UgYXJlIHNhZmUgdG8gY2FsbCBldmVuIGlmIHRoZXkgd2VyZW4ndCBhbGxvY2F0ZWQgKi8KKwkJaXB3MjEwMF9xdWV1ZXNfZnJlZShwcml2KTsKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwY2lfZGV2LT5kZXYua29iaiwgJmlwdzIxMDBfYXR0cmlidXRlX2dyb3VwKTsKKworCQlmcmVlX2llZWU4MDIxMShkZXYpOworCQlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7CisJfQorCisJaWYgKGJhc2VfYWRkcikKKwkJaW91bm1hcChiYXNlX2FkZHIpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2lfZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaXB3MjEwMF9wY2lfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlpZiAocHJpdikgeworCQlkb3duKCZwcml2LT5hY3Rpb25fc2VtKTsKKworCQlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19JTklUSUFMSVpFRDsKKworCQlkZXYgPSBwcml2LT5uZXRfZGV2OworCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBjaV9kZXYtPmRldi5rb2JqLCAmaXB3MjEwMF9hdHRyaWJ1dGVfZ3JvdXApOworCisjaWZkZWYgQ09ORklHX1BNCisJCWlmIChpcHcyMTAwX2Zpcm13YXJlLnZlcnNpb24pCisJCQlpcHcyMTAwX3JlbGVhc2VfZmlybXdhcmUocHJpdiwgJmlwdzIxMDBfZmlybXdhcmUpOworI2VuZGlmCisJCS8qIFRha2UgZG93biB0aGUgaGFyZHdhcmUgKi8KKwkJaXB3MjEwMF9kb3duKHByaXYpOworCisJCS8qIFJlbGVhc2UgdGhlIHNlbWFwaG9yZSBzbyB0aGF0IHRoZSBuZXR3b3JrIHN1YnN5c3RlbSBjYW4KKwkJICogY29tcGxldGUgYW55IG5lZWRlZCBjYWxscyBpbnRvIHRoZSBkcml2ZXIuLi4gKi8KKwkJdXAoJnByaXYtPmFjdGlvbl9zZW0pOworCisJCS8qIFVucmVnaXN0ZXIgdGhlIGRldmljZSBmaXJzdCAtIHRoaXMgcmVzdWx0cyBpbiBjbG9zZSgpCisJCSAqIGJlaW5nIGNhbGxlZCBpZiB0aGUgZGV2aWNlIGlzIG9wZW4uICBJZiB3ZSBmcmVlIHN0b3JhZ2UKKwkJICogZmlyc3QsIHRoZW4gY2xvc2UoKSB3aWxsIGNyYXNoLiAqLworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJCS8qIGlwdzIxMDBfZG93biB3aWxsIGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIG1vcmUgcGVuZGluZyB3b3JrCisJCSAqIGluIHRoZSB3b3JrcXVldWUncywgc28gd2UgY2FuIHNhZmVseSByZW1vdmUgdGhlbSBub3cuICovCisJCWlwdzIxMDBfa2lsbF93b3JrcXVldWUocHJpdik7CisKKwkJaXB3MjEwMF9xdWV1ZXNfZnJlZShwcml2KTsKKworCQkvKiBGcmVlIHBvdGVudGlhbCBkZWJ1Z2dpbmcgZmlybXdhcmUgc25hcHNob3QgKi8KKwkJaXB3MjEwMF9zbmFwc2hvdF9mcmVlKHByaXYpOworCisJCWlmIChkZXYtPmlycSkKKwkJCWZyZWVfaXJxKGRldi0+aXJxLCBwcml2KTsKKworCQlpZiAoZGV2LT5iYXNlX2FkZHIpCisJCQlpb3VubWFwKCh2b2lkIF9faW9tZW0gKilkZXYtPmJhc2VfYWRkcik7CisKKwkJZnJlZV9pZWVlODAyMTEoZGV2KTsKKwl9CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKworCUlQV19ERUJVR19JTkZPKCJleGl0XG4iKTsKK30KKworCisjaWZkZWYgQ09ORklHX1BNCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDExKQorc3RhdGljIGludCBpcHcyMTAwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHUzMiBzdGF0ZSkKKyNlbHNlCitzdGF0aWMgaW50IGlwdzIxMDBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorI2VuZGlmCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+bmV0X2RldjsKKworCUlQV19ERUJVR19JTkZPKCIlczogR29pbmcgaW50byBzdXNwZW5kLi4uXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworCisJZG93bigmcHJpdi0+YWN0aW9uX3NlbSk7CisJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19JTklUSUFMSVpFRCkgeworCQkvKiBUYWtlIGRvd24gdGhlIGRldmljZTsgcG93ZXJzIGl0IG9mZiwgZXRjLiAqLworCQlpcHcyMTAwX2Rvd24ocHJpdik7CisJfQorCisJLyogUmVtb3ZlIHRoZSBQUkVTRU5UIHN0YXRlIG9mIHRoZSBkZXZpY2UgKi8KKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UgKHBjaV9kZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QzaG90KTsKKworCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5ldF9kZXY7CisJdTMyIHZhbDsKKworCWlmIChJUFcyMTAwX1BNX0RJU0FCTEVEKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPmFjdGlvbl9zZW0pOworCisJSVBXX0RFQlVHX0lORk8oIiVzOiBDb21pbmcgb3V0IG9mIHN1c3BlbmQuLi5cbiIsCisJICAgICAgIGRldi0+bmFtZSk7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisJcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CisKKwkvKgorCSAqIFN1c3BlbmQvUmVzdW1lIHJlc2V0cyB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UsIHNvIHdlIGhhdmUgdG8KKwkgKiByZS1kaXNhYmxlIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyICgweDQxKSB0byBrZWVwIFBDSSBUeCByZXRyaWVzCisJICogZnJvbSBpbnRlcmZlcmluZyB3aXRoIEMzIENQVSBzdGF0ZS4gcGNpX3Jlc3RvcmVfc3RhdGUgd29uJ3QgaGVscAorCSAqIGhlcmUgc2luY2UgaXQgb25seSByZXN0b3JlcyB0aGUgZmlyc3QgNjQgYnl0ZXMgcGNpIGNvbmZpZyBoZWFkZXIuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4NDAsICZ2YWwpOworCWlmICgodmFsICYgMHgwMDAwZmYwMCkgIT0gMCkKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQwLCB2YWwgJiAweGZmZmYwMGZmKTsKKworCS8qIFNldCB0aGUgZGV2aWNlIGJhY2sgaW50byB0aGUgUFJFU0VOVCBzdGF0ZTsgdGhpcyB3aWxsIGFsc28gd2FrZQorCSAqIHRoZSBxdWV1ZSBvZiBuZWVkZWQgKi8KKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKyAgICAgICAgLyogQnJpbmcgdGhlIGRldmljZSBiYWNrIHVwICovCisgICAgICAgIGlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRl9LSUxMX1NXKSkKKyAgICAgICAgICAgICAgICBpcHcyMTAwX3VwKHByaXYsIDApOworCisJdXAoJnByaXYtPmFjdGlvbl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjZGVmaW5lIElQVzIxMDBfREVWX0lEKHgpIHsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMDQzLCAweDgwODYsIHggfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXB3MjEwMF9wY2lfaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCUlQVzIxMDBfREVWX0lEKDB4MjUyMCksIC8qIElOIDIxMDBBIG1QQ0kgM0EgKi8KKwlJUFcyMTAwX0RFVl9JRCgweDI1MjEpLCAvKiBJTiAyMTAwQSBtUENJIDNCICovCisJSVBXMjEwMF9ERVZfSUQoMHgyNTI0KSwgLyogSU4gMjEwMEEgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjUyNSksIC8qIElOIDIxMDBBIG1QQ0kgM0IgKi8KKwlJUFcyMTAwX0RFVl9JRCgweDI1MjYpLCAvKiBJTiAyMTAwQSBtUENJIEdlbiBBMyAqLworCUlQVzIxMDBfREVWX0lEKDB4MjUyMiksIC8qIElOIDIxMDAgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjUyMyksIC8qIElOIDIxMDAgbVBDSSAzQSAqLworCUlQVzIxMDBfREVWX0lEKDB4MjUyNyksIC8qIElOIDIxMDAgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjUyOCksIC8qIElOIDIxMDAgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjUyOSksIC8qIElOIDIxMDAgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjUyQiksIC8qIElOIDIxMDAgbVBDSSAzQSAqLworCUlQVzIxMDBfREVWX0lEKDB4MjUyQyksIC8qIElOIDIxMDAgbVBDSSAzQSAqLworCUlQVzIxMDBfREVWX0lEKDB4MjUyRCksIC8qIElOIDIxMDAgbVBDSSAzQSAqLworCisJSVBXMjEwMF9ERVZfSUQoMHgyNTUwKSwgLyogSUIgMjEwMEEgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjU1MSksIC8qIElCIDIxMDAgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjU1MyksIC8qIElCIDIxMDAgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjU1NCksIC8qIElCIDIxMDAgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjU1NSksIC8qIElCIDIxMDAgbVBDSSAzQiAqLworCisJSVBXMjEwMF9ERVZfSUQoMHgyNTYwKSwgLyogREUgMjEwMEEgbVBDSSAzQSAqLworCUlQVzIxMDBfREVWX0lEKDB4MjU2MiksIC8qIERFIDIxMDBBIG1QQ0kgM0EgKi8KKwlJUFcyMTAwX0RFVl9JRCgweDI1NjMpLCAvKiBERSAyMTAwQSBtUENJIDNBICovCisJSVBXMjEwMF9ERVZfSUQoMHgyNTYxKSwgLyogREUgMjEwMCBtUENJIDNBICovCisJSVBXMjEwMF9ERVZfSUQoMHgyNTY1KSwgLyogREUgMjEwMCBtUENJIDNBICovCisJSVBXMjEwMF9ERVZfSUQoMHgyNTY2KSwgLyogREUgMjEwMCBtUENJIDNBICovCisJSVBXMjEwMF9ERVZfSUQoMHgyNTY3KSwgLyogREUgMjEwMCBtUENJIDNBICovCisKKwlJUFcyMTAwX0RFVl9JRCgweDI1NzApLCAvKiBHQSAyMTAwIG1QQ0kgM0IgKi8KKworCUlQVzIxMDBfREVWX0lEKDB4MjU4MCksIC8qIFRPIDIxMDBBIG1QQ0kgM0IgKi8KKwlJUFcyMTAwX0RFVl9JRCgweDI1ODIpLCAvKiBUTyAyMTAwQSBtUENJIDNCICovCisJSVBXMjEwMF9ERVZfSUQoMHgyNTgzKSwgLyogVE8gMjEwMEEgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjU4MSksIC8qIFRPIDIxMDAgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjU4NSksIC8qIFRPIDIxMDAgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjU4NiksIC8qIFRPIDIxMDAgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjU4NyksIC8qIFRPIDIxMDAgbVBDSSAzQiAqLworCisJSVBXMjEwMF9ERVZfSUQoMHgyNTkwKSwgLyogU08gMjEwMEEgbVBDSSAzQiAqLworCUlQVzIxMDBfREVWX0lEKDB4MjU5MiksIC8qIFNPIDIxMDBBIG1QQ0kgM0IgKi8KKwlJUFcyMTAwX0RFVl9JRCgweDI1OTEpLCAvKiBTTyAyMTAwIG1QQ0kgM0IgKi8KKwlJUFcyMTAwX0RFVl9JRCgweDI1OTMpLCAvKiBTTyAyMTAwIG1QQ0kgM0IgKi8KKwlJUFcyMTAwX0RFVl9JRCgweDI1OTYpLCAvKiBTTyAyMTAwIG1QQ0kgM0IgKi8KKwlJUFcyMTAwX0RFVl9JRCgweDI1OTgpLCAvKiBTTyAyMTAwIG1QQ0kgM0IgKi8KKworCUlQVzIxMDBfREVWX0lEKDB4MjVBMCksIC8qIEhQIDIxMDAgbVBDSSAzQiAqLworCXswLH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXB3MjEwMF9wY2lfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaXB3MjEwMF9wY2lfZHJpdmVyID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmlkX3RhYmxlID0gaXB3MjEwMF9wY2lfaWRfdGFibGUsCisJLnByb2JlID0gaXB3MjEwMF9wY2lfaW5pdF9vbmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGlwdzIxMDBfcGNpX3JlbW92ZV9vbmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gaXB3MjEwMF9zdXNwZW5kLAorCS5yZXN1bWUgPSBpcHcyMTAwX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGlwdzIxMDAgZHJpdmVyL21vZHVsZQorICoKKyAqIEByZXR1cm5zIDAgaWYgb2ssIDwgMCBlcnJubyBub2RlIGNvbiBlcnJvci4KKyAqCisgKiBOb3RlOiB3ZSBjYW5ub3QgaW5pdCB0aGUgL3Byb2Mgc3R1ZmYgdW50aWwgdGhlIFBDSSBkcml2ZXIgaXMgdGhlcmUsCisgKiBvciB3ZSByaXNrIGFuIHVubGlrZWx5IHJhY2UgY29uZGl0aW9uIG9uIHNvbWVvbmUgYWNjZXNzaW5nCisgKiB1bmluaXRpYWxpemVkIGRhdGEgaW4gdGhlIFBDSSBkZXYgc3RydWN0IHRocm91Z2ggL3Byb2MuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGlwdzIxMDBfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICI6ICVzLCAlc1xuIiwgRFJWX0RFU0NSSVBUSU9OLCBEUlZfVkVSU0lPTik7CisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiAlc1xuIiwgRFJWX0NPUFlSSUdIVCk7CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX05PV0VQCisJSVBXX0RFQlVHX0lORk8oRFJWX05BTUUgIjogQ29tcGlsZWQgd2l0aCBXRVAgZGlzYWJsZWQuXG4iKTsKKyNlbmRpZgorCisJcmV0ID0gcGNpX21vZHVsZV9pbml0KCZpcHcyMTAwX3BjaV9kcml2ZXIpOworCisjaWZkZWYgQ09ORklHX0lQV19ERUJVRworCWlwdzIxMDBfZGVidWdfbGV2ZWwgPSBkZWJ1ZzsKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoJmlwdzIxMDBfcGNpX2RyaXZlci5kcml2ZXIsCisJCQkgICAmZHJpdmVyX2F0dHJfZGVidWdfbGV2ZWwpOworI2VuZGlmCisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogQ2xlYW51cCBpcHcyMTAwIGRyaXZlciByZWdpc3RyYXRpb24KKyAqLworc3RhdGljIHZvaWQgX19leGl0IGlwdzIxMDBfZXhpdCh2b2lkKQoreworCS8qIEZJWE1FOiBJUEc6IGNoZWNrIHRoYXQgd2UgaGF2ZSBubyBpbnN0YW5jZXMgb2YgdGhlIGRldmljZXMgb3BlbiAqLworI2lmZGVmIENPTkZJR19JUFdfREVCVUcKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmlwdzIxMDBfcGNpX2RyaXZlci5kcml2ZXIsCisJCQkgICAmZHJpdmVyX2F0dHJfZGVidWdfbGV2ZWwpOworI2VuZGlmCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpcHcyMTAwX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpcHcyMTAwX2luaXQpOworbW9kdWxlX2V4aXQoaXB3MjEwMF9leGl0KTsKKworI2RlZmluZSBXRVhUX1VTRUNIQU5ORUxTIDEKKworc3RhdGljIGNvbnN0IGxvbmcgaXB3MjEwMF9mcmVxdWVuY2llc1tdID0geworCTI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsCisJMjQzMiwgMjQzNywgMjQ0MiwgMjQ0NywKKwkyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LAorCTI0NzIsIDI0ODQKK307CisKKyNkZWZpbmUgRlJFUV9DT1VOVCAoc2l6ZW9mKGlwdzIxMDBfZnJlcXVlbmNpZXMpIC8gXAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoaXB3MjEwMF9mcmVxdWVuY2llc1swXSkpCisKK3N0YXRpYyBjb25zdCBsb25nIGlwdzIxMDBfcmF0ZXNfMTFiW10gPSB7CisJMTAwMDAwMCwKKwkyMDAwMDAwLAorCTU1MDAwMDAsCisJMTEwMDAwMDAKK307CisKKyNkZWZpbmUgUkFURV9DT1VOVCAoc2l6ZW9mKGlwdzIxMDBfcmF0ZXNfMTFiKSAvIHNpemVvZihpcHcyMTAwX3JhdGVzXzExYlswXSkpCisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJLyoKKwkgKiBUaGlzIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUuICBObyBhY3Rpb24gbG9jayByZXF1aXJlZAorCSAqLworCisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0FTU09DSUFURUQpKQorCQlzdHJjcHkod3JxdS0+bmFtZSwgInVuYXNzb2NpYXRlZCIpOworCWVsc2UKKwkJc25wcmludGYod3JxdS0+bmFtZSwgSUZOQU1TSVosICJJRUVFIDgwMi4xMWIiKTsKKworCUlQV19ERUJVR19XWCgiTmFtZTogJXNcbiIsIHdycXUtPm5hbWUpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGl3X2ZyZXEgKmZ3cnEgPSAmd3JxdS0+ZnJlcTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChwcml2LT5pZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWRvd24oJnByaXYtPmFjdGlvbl9zZW0pOworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19JTklUSUFMSVpFRCkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCS8qIGlmIHNldHRpbmcgYnkgZnJlcSBjb252ZXJ0IHRvIGNoYW5uZWwgKi8KKwlpZiAoZndycS0+ZSA9PSAxKSB7CisJCWlmICgoZndycS0+bSA+PSAoaW50KSAyLjQxMmU4ICYmCisJCSAgICAgZndycS0+bSA8PSAoaW50KSAyLjQ4N2U4KSkgeworCQkJaW50IGYgPSBmd3JxLT5tIC8gMTAwMDAwOworCQkJaW50IGMgPSAwOworCisJCQl3aGlsZSAoKGMgPCBSRUdfTUFYX0NIQU5ORUwpICYmCisJCQkgICAgICAgKGYgIT0gaXB3MjEwMF9mcmVxdWVuY2llc1tjXSkpCisJCQkJYysrOworCisJCQkvKiBoYWNrIHRvIGZhbGwgdGhyb3VnaCAqLworCQkJZndycS0+ZSA9IDA7CisJCQlmd3JxLT5tID0gYyArIDE7CisJCX0KKwl9CisKKwlpZiAoZndycS0+ZSA+IDAgfHwgZndycS0+bSA+IDEwMDApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwllbHNlIHsgLyogU2V0IHRoZSBjaGFubmVsICovCisJCUlQV19ERUJVR19XWCgiU0VUIEZyZXEvQ2hhbm5lbCAtPiAlZCBcbiIsIGZ3cnEtPm0pOworCQllcnIgPSBpcHcyMTAwX3NldF9jaGFubmVsKHByaXYsIGZ3cnEtPm0sIDApOworCX0KKworIGRvbmU6CisJdXAoJnByaXYtPmFjdGlvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBpcHcyMTAwX3d4X2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZS4gIE5vIGFjdGlvbiBsb2NrIHJlcXVpcmVkCisJICovCisKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXdycXUtPmZyZXEuZSA9IDA7CisKKwkvKiBJZiB3ZSBhcmUgYXNzb2NpYXRlZCwgdHJ5aW5nIHRvIGFzc29jaWF0ZSwgb3IgaGF2ZSBhIHN0YXRpY2FsbHkKKwkgKiBjb25maWd1cmVkIENIQU5ORUwgdGhlbiByZXR1cm4gdGhhdDsgb3RoZXJ3aXNlIHJldHVybiBBTlkgKi8KKwlpZiAocHJpdi0+Y29uZmlnICYgQ0ZHX1NUQVRJQ19DSEFOTkVMIHx8CisJICAgIHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKQorCQl3cnF1LT5mcmVxLm0gPSBwcml2LT5jaGFubmVsOworCWVsc2UKKwkJd3JxdS0+ZnJlcS5tID0gMDsKKworCUlQV19ERUJVR19XWCgiR0VUIEZyZXEvQ2hhbm5lbCAtPiAlZCBcbiIsIHByaXYtPmNoYW5uZWwpOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisKKwlJUFdfREVCVUdfV1goIlNFVCBNb2RlIC0+ICVkIFxuIiwgd3JxdS0+bW9kZSk7CisKKwlpZiAod3JxdS0+bW9kZSA9PSBwcml2LT5pZWVlLT5pd19tb2RlKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPmFjdGlvbl9zZW0pOworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19JTklUSUFMSVpFRCkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCXN3aXRjaCAod3JxdS0+bW9kZSkgeworI2lmZGVmIENPTkZJR19JUFcyMTAwX01PTklUT1IKKwljYXNlIElXX01PREVfTU9OSVRPUjoKKwkJZXJyID0gaXB3MjEwMF9zd2l0Y2hfbW9kZShwcml2LCBJV19NT0RFX01PTklUT1IpOworCQlicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfSVBXMjEwMF9NT05JVE9SICovCisJY2FzZSBJV19NT0RFX0FESE9DOgorCQllcnIgPSBpcHcyMTAwX3N3aXRjaF9tb2RlKHByaXYsIElXX01PREVfQURIT0MpOworCQlicmVhazsKKwljYXNlIElXX01PREVfSU5GUkE6CisJY2FzZSBJV19NT0RFX0FVVE86CisJZGVmYXVsdDoKKwkJZXJyID0gaXB3MjEwMF9zd2l0Y2hfbW9kZShwcml2LCBJV19NT0RFX0lORlJBKTsKKwkJYnJlYWs7CisJfQorCitkb25lOgorCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKKyAJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpcHcyMTAwX3d4X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZS4gIE5vIGFjdGlvbiBsb2NrIHJlcXVpcmVkCisJICovCisKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXdycXUtPm1vZGUgPSBwcml2LT5pZWVlLT5pd19tb2RlOworCUlQV19ERUJVR19XWCgiR0VUIE1vZGUgLT4gJWRcbiIsIHdycXUtPm1vZGUpOworCisJcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBQT1dFUl9NT0RFUyA1CisKKy8qIFZhbHVlcyBhcmUgaW4gbWljcm9zZWNvbmQgKi8KK3N0YXRpYyBjb25zdCBzMzIgdGltZW91dF9kdXJhdGlvbltQT1dFUl9NT0RFU10gPSB7CisJMzUwMDAwLAorCTI1MDAwMCwKKwk3NTAwMCwKKwkzNzAwMCwKKwkyNTAwMCwKK307CisKK3N0YXRpYyBjb25zdCBzMzIgcGVyaW9kX2R1cmF0aW9uW1BPV0VSX01PREVTXSA9IHsKKwk0MDAwMDAsCisJNzAwMDAwLAorCTEwMDAwMDAsCisJMTAwMDAwMCwKKwkxMDAwMDAwCit9OworCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZS4gIE5vIGFjdGlvbiBsb2NrIHJlcXVpcmVkCisJICovCisKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKWV4dHJhOworCXUxNiB2YWw7CisJaW50IGksIGxldmVsOworCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2YoKnJhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZigqcmFuZ2UpKTsKKworCS8qIExldCdzIHRyeSB0byBrZWVwIHRoaXMgc3RydWN0IGluIHRoZSBzYW1lIG9yZGVyIGFzIGluCisJICogbGludXgvaW5jbHVkZS93aXJlbGVzcy5oCisJICovCisKKwkvKiBUT0RPOiBTZWUgd2hhdCB2YWx1ZXMgd2UgY2FuIHNldCwgYW5kIHJlbW92ZSB0aGUgb25lcyB3ZSBjYW4ndAorCSAqIHNldCwgb3IgZmlsbCB0aGVtIHdpdGggc29tZSBkZWZhdWx0IGRhdGEuCisJICovCisKKwkvKiB+NSBNYi9zIHJlYWwgKDgwMi4xMWIpICovCisJcmFuZ2UtPnRocm91Z2hwdXQgPSA1ICogMTAwMCAqIDEwMDA7CisKKy8vCXJhbmdlLT5zZW5zaXRpdml0eTsJLyogc2lnbmFsIGxldmVsIHRocmVzaG9sZCByYW5nZSAqLworCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7CisJLyogVE9ETzogRmluZCByZWFsIG1heCBSU1NJIGFuZCBzdGljayBoZXJlICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KKworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gNzA7IC8qID4gOCUgbWlzc2VkIGJlYWNvbnMgaXMgJ2JhZCcgKi8KKwkvKiBUT0RPOiBGaW5kIHJlYWwgJ2dvb2QnIHRvICdiYWQnIHRocmVzaG9sIHZhbHVlIGZvciBSU1NJICovCisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMjAgKyBJUFcyMTAwX1JTU0lfVE9fREJNOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7CisJcmFuZ2UtPmF2Z19xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLworCisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IFJBVEVfQ09VTlQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkFURV9DT1VOVCAmJiBpIDwgSVdfTUFYX0JJVFJBVEVTOyBpKyspIHsKKwkJcmFuZ2UtPmJpdHJhdGVbaV0gPSBpcHcyMTAwX3JhdGVzXzExYltpXTsKKwl9CisKKwlyYW5nZS0+bWluX3J0cyA9IE1JTl9SVFNfVEhSRVNIT0xEOworCXJhbmdlLT5tYXhfcnRzID0gTUFYX1JUU19USFJFU0hPTEQ7CisJcmFuZ2UtPm1pbl9mcmFnID0gTUlOX0ZSQUdfVEhSRVNIT0xEOworCXJhbmdlLT5tYXhfZnJhZyA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKworCXJhbmdlLT5taW5fcG1wID0gcGVyaW9kX2R1cmF0aW9uWzBdOwkvKiBNaW5pbWFsIFBNIHBlcmlvZCAqLworCXJhbmdlLT5tYXhfcG1wID0gcGVyaW9kX2R1cmF0aW9uW1BPV0VSX01PREVTLTFdOy8qIE1heGltYWwgUE0gcGVyaW9kICovCisJcmFuZ2UtPm1pbl9wbXQgPSB0aW1lb3V0X2R1cmF0aW9uW1BPV0VSX01PREVTLTFdOwkvKiBNaW5pbWFsIFBNIHRpbWVvdXQgKi8KKwlyYW5nZS0+bWF4X3BtdCA9IHRpbWVvdXRfZHVyYXRpb25bMF07LyogTWF4aW1hbCBQTSB0aW1lb3V0ICovCisKKyAgICAgICAgLyogSG93IHRvIGRlY29kZSBtYXgvbWluIFBNIHBlcmlvZCAqLworCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisgICAgICAgIC8qIEhvdyB0byBkZWNvZGUgbWF4L21pbiBQTSBwZXJpb2QgKi8KKwlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwkvKiBXaGF0IFBNIG9wdGlvbnMgYXJlIHN1cHBvcnRlZCAqLworCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfVElNRU9VVCB8IElXX1BPV0VSX1BFUklPRDsKKworCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOyAgICAgICAgICAgLyogRGlmZmVyZW50IHRva2VuIHNpemVzICovCisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7CQkvKiBOdW1iZXIgb2YgZW50cnkgaW4gdGhlIGxpc3QgKi8KKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IFdFUF9LRVlTOyAgLyogTWF4IG51bWJlciBvZiB0b2tlbnMgKi8KKy8vCXJhbmdlLT5lbmNvZGluZ19sb2dpbl9pbmRleDsJCS8qIHRva2VuIGluZGV4IGZvciBsb2dpbiB0b2tlbiAqLworCisJaWYgKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOworCQlyYW5nZS0+bnVtX3R4cG93ZXIgPSBJV19NQVhfVFhQT1dFUjsKKwkJZm9yIChpID0gMCwgbGV2ZWwgPSAoSVBXX1RYX1BPV0VSX01BWF9EQk0gKiAxNik7IGkgPCBJV19NQVhfVFhQT1dFUjsKKwkJICAgICBpKyssIGxldmVsIC09ICgoSVBXX1RYX1BPV0VSX01BWF9EQk0gLSBJUFdfVFhfUE9XRVJfTUlOX0RCTSkgKiAxNikgLworCQkJICAgICAoSVdfTUFYX1RYUE9XRVIgLSAxKSkKKwkJCXJhbmdlLT50eHBvd2VyW2ldID0gbGV2ZWwgLyAxNjsKKwl9IGVsc2UgeworCQlyYW5nZS0+dHhwb3dlcl9jYXBhID0gMDsKKwkJcmFuZ2UtPm51bV90eHBvd2VyID0gMDsKKwl9CisKKworCS8qIFNldCB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIHZlcnNpb25zICovCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTY7CisKKy8vCXJhbmdlLT5yZXRyeV9jYXBhOwkvKiBXaGF0IHJldHJ5IG9wdGlvbnMgYXJlIHN1cHBvcnRlZCAqLworLy8JcmFuZ2UtPnJldHJ5X2ZsYWdzOwkvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gcmV0cnkgbGltaXQgKi8KKy8vCXJhbmdlLT5yX3RpbWVfZmxhZ3M7CS8qIEhvdyB0byBkZWNvZGUgbWF4L21pbiByZXRyeSBsaWZlICovCisvLwlyYW5nZS0+bWluX3JldHJ5OwkvKiBNaW5pbWFsIG51bWJlciBvZiByZXRyaWVzICovCisvLwlyYW5nZS0+bWF4X3JldHJ5OwkvKiBNYXhpbWFsIG51bWJlciBvZiByZXRyaWVzICovCisvLwlyYW5nZS0+bWluX3JfdGltZTsJLyogTWluaW1hbCByZXRyeSBsaWZldGltZSAqLworLy8JcmFuZ2UtPm1heF9yX3RpbWU7CS8qIE1heGltYWwgcmV0cnkgbGlmZXRpbWUgKi8KKworICAgICAgICByYW5nZS0+bnVtX2NoYW5uZWxzID0gRlJFUV9DT1VOVDsKKworCXZhbCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEZSRVFfQ09VTlQ7IGkrKykgeworCQkvLyBUT0RPOiBJbmNsdWRlIG9ubHkgbGVnYWwgZnJlcXVlbmNpZXMgZm9yIHNvbWUgY291bnRyaWVzCisvLwkJaWYgKGxvY2FsLT5jaGFubmVsX21hc2sgJiAoMSA8PCBpKSkgeworCQkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gaSArIDE7CisJCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBpcHcyMTAwX2ZyZXF1ZW5jaWVzW2ldICogMTAwMDAwOworCQkJcmFuZ2UtPmZyZXFbdmFsXS5lID0gMTsKKwkJCXZhbCsrOworLy8JCX0KKwkJaWYgKHZhbCA9PSBJV19NQVhfRlJFUVVFTkNJRVMpCisJCWJyZWFrOworCX0KKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IHZhbDsKKworCUlQV19ERUJVR19XWCgiR0VUIFJhbmdlXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfc2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYW55W10gPSB7CisJCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKKwl9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG9mZltdID0geworCQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCisJfTsKKworCS8vIHNhbml0eSBjaGVja3MKKwlpZiAod3JxdS0+YXBfYWRkci5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJnByaXYtPmFjdGlvbl9zZW0pOworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19JTklUSUFMSVpFRCkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCWlmICghbWVtY21wKGFueSwgd3JxdS0+YXBfYWRkci5zYV9kYXRhLCBFVEhfQUxFTikgfHwKKwkgICAgIW1lbWNtcChvZmYsIHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pKSB7CisJCS8qIHdlIGRpc2FibGUgbWFuZGF0b3J5IEJTU0lEIGFzc29jaWF0aW9uICovCisJCUlQV19ERUJVR19XWCgiZXhpdCAtIGRpc2FibGUgbWFuZGF0b3J5IEJTU0lEXG4iKTsKKwkJcHJpdi0+Y29uZmlnICY9IH5DRkdfU1RBVElDX0JTU0lEOworCQllcnIgPSBpcHcyMTAwX3NldF9tYW5kYXRvcnlfYnNzaWQocHJpdiwgTlVMTCwgMCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlwcml2LT5jb25maWcgfD0gQ0ZHX1NUQVRJQ19CU1NJRDsKKwltZW1jcHkocHJpdi0+bWFuZGF0b3J5X2Jzc2lkX21hYywgd3JxdS0+YXBfYWRkci5zYV9kYXRhLCBFVEhfQUxFTik7CisKKwllcnIgPSBpcHcyMTAwX3NldF9tYW5kYXRvcnlfYnNzaWQocHJpdiwgd3JxdS0+YXBfYWRkci5zYV9kYXRhLCAwKTsKKworCUlQV19ERUJVR19XWCgiU0VUIEJTU0lEIC0+ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQkgICAgIHdycXUtPmFwX2FkZHIuc2FfZGF0YVswXSAmIDB4ZmYsCisJCSAgICAgd3JxdS0+YXBfYWRkci5zYV9kYXRhWzFdICYgMHhmZiwKKwkJICAgICB3cnF1LT5hcF9hZGRyLnNhX2RhdGFbMl0gJiAweGZmLAorCQkgICAgIHdycXUtPmFwX2FkZHIuc2FfZGF0YVszXSAmIDB4ZmYsCisJCSAgICAgd3JxdS0+YXBfYWRkci5zYV9kYXRhWzRdICYgMHhmZiwKKwkJICAgICB3cnF1LT5hcF9hZGRyLnNhX2RhdGFbNV0gJiAweGZmKTsKKworIGRvbmU6CisJdXAoJnByaXYtPmFjdGlvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJLyoKKwkgKiBUaGlzIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUuICBObyBhY3Rpb24gbG9jayByZXF1aXJlZAorCSAqLworCisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwkvKiBJZiB3ZSBhcmUgYXNzb2NpYXRlZCwgdHJ5aW5nIHRvIGFzc29jaWF0ZSwgb3IgaGF2ZSBhIHN0YXRpY2FsbHkKKwkgKiBjb25maWd1cmVkIEJTU0lEIHRoZW4gcmV0dXJuIHRoYXQ7IG90aGVyd2lzZSByZXR1cm4gQU5ZICovCisJaWYgKHByaXYtPmNvbmZpZyAmIENGR19TVEFUSUNfQlNTSUQgfHwKKwkgICAgcHJpdi0+c3RhdHVzICYgU1RBVFVTX0FTU09DSUFURUQpIHsKKwkJd3JxdS0+YXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsICZwcml2LT5ic3NpZCwgRVRIX0FMRU4pOworCX0gZWxzZQorCQltZW1zZXQod3JxdS0+YXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisKKwlJUFdfREVCVUdfV1goIkdldHRpbmcgV0FQIEJTU0lEOiAiIE1BQ19GTVQgIlxuIiwKKwkJICAgICBNQUNfQVJHKHdycXUtPmFwX2FkZHIuc2FfZGF0YSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwljaGFyICplc3NpZCA9ICIiOyAvKiBBTlkgKi8KKwlpbnQgbGVuZ3RoID0gMDsKKwlpbnQgZXJyID0gMDsKKworCWRvd24oJnByaXYtPmFjdGlvbl9zZW0pOworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19JTklUSUFMSVpFRCkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCWlmICh3cnF1LT5lc3NpZC5mbGFncyAmJiB3cnF1LT5lc3NpZC5sZW5ndGgpIHsKKwkJbGVuZ3RoID0gd3JxdS0+ZXNzaWQubGVuZ3RoIC0gMTsKKwkJZXNzaWQgPSBleHRyYTsKKwl9CisKKwlpZiAobGVuZ3RoID09IDApIHsKKwkJSVBXX0RFQlVHX1dYKCJTZXR0aW5nIEVTU0lEIHRvIEFOWVxuIik7CisJCXByaXYtPmNvbmZpZyAmPSB+Q0ZHX1NUQVRJQ19FU1NJRDsKKwkJZXJyID0gaXB3MjEwMF9zZXRfZXNzaWQocHJpdiwgTlVMTCwgMCwgMCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlsZW5ndGggPSBtaW4obGVuZ3RoLCBJV19FU1NJRF9NQVhfU0laRSk7CisKKwlwcml2LT5jb25maWcgfD0gQ0ZHX1NUQVRJQ19FU1NJRDsKKworCWlmIChwcml2LT5lc3NpZF9sZW4gPT0gbGVuZ3RoICYmICFtZW1jbXAocHJpdi0+ZXNzaWQsIGV4dHJhLCBsZW5ndGgpKSB7CisJCUlQV19ERUJVR19XWCgiRVNTSUQgc2V0IHRvIGN1cnJlbnQgRVNTSUQuXG4iKTsKKwkJZXJyID0gMDsKKwkJZ290byBkb25lOworCX0KKworCUlQV19ERUJVR19XWCgiU2V0dGluZyBFU1NJRDogJyVzJyAoJWQpXG4iLCBlc2NhcGVfZXNzaWQoZXNzaWQsIGxlbmd0aCksCisJCSAgICAgbGVuZ3RoKTsKKworCXByaXYtPmVzc2lkX2xlbiA9IGxlbmd0aDsKKwltZW1jcHkocHJpdi0+ZXNzaWQsIGVzc2lkLCBwcml2LT5lc3NpZF9sZW4pOworCisJZXJyID0gaXB3MjEwMF9zZXRfZXNzaWQocHJpdiwgZXNzaWQsIGxlbmd0aCwgMCk7CisKKyBkb25lOgorCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZS4gIE5vIGFjdGlvbiBsb2NrIHJlcXVpcmVkCisJICovCisKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8qIElmIHdlIGFyZSBhc3NvY2lhdGVkLCB0cnlpbmcgdG8gYXNzb2NpYXRlLCBvciBoYXZlIGEgc3RhdGljYWxseQorCSAqIGNvbmZpZ3VyZWQgRVNTSUQgdGhlbiByZXR1cm4gdGhhdDsgb3RoZXJ3aXNlIHJldHVybiBBTlkgKi8KKwlpZiAocHJpdi0+Y29uZmlnICYgQ0ZHX1NUQVRJQ19FU1NJRCB8fAorCSAgICBwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkgeworCQlJUFdfREVCVUdfV1goIkdldHRpbmcgZXNzaWQ6ICclcydcbiIsCisJCQkgICAgIGVzY2FwZV9lc3NpZChwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfbGVuKSk7CisJCW1lbWNweShleHRyYSwgcHJpdi0+ZXNzaWQsIHByaXYtPmVzc2lkX2xlbik7CisJCXdycXUtPmVzc2lkLmxlbmd0aCA9IHByaXYtPmVzc2lkX2xlbjsKKwkJd3JxdS0+ZXNzaWQuZmxhZ3MgPSAxOyAvKiBhY3RpdmUgKi8KKwl9IGVsc2UgeworCQlJUFdfREVCVUdfV1goIkdldHRpbmcgZXNzaWQ6IEFOWVxuIik7CisJCXdycXUtPmVzc2lkLmxlbmd0aCA9IDA7CisJCXdycXUtPmVzc2lkLmZsYWdzID0gMDsgLyogYWN0aXZlICovCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9zZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJLyoKKwkgKiBUaGlzIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUuICBObyBhY3Rpb24gbG9jayByZXF1aXJlZAorCSAqLworCisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKKwkJcmV0dXJuIC1FMkJJRzsKKworCXdycXUtPmRhdGEubGVuZ3RoID0gbWluKChzaXplX3Qpd3JxdS0+ZGF0YS5sZW5ndGgsIHNpemVvZihwcml2LT5uaWNrKSk7CisJbWVtc2V0KHByaXYtPm5pY2ssIDAsIHNpemVvZihwcml2LT5uaWNrKSk7CisJbWVtY3B5KHByaXYtPm5pY2ssIGV4dHJhLCAgd3JxdS0+ZGF0YS5sZW5ndGgpOworCisJSVBXX0RFQlVHX1dYKCJTRVQgTmlja25hbWUgLT4gJXMgXG4iLCBwcml2LT5uaWNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfZ2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCS8qCisJICogVGhpcyBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lLiAgTm8gYWN0aW9uIGxvY2sgcmVxdWlyZWQKKwkgKi8KKworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzdHJsZW4ocHJpdi0+bmljaykgKyAxOworCW1lbWNweShleHRyYSwgcHJpdi0+bmljaywgd3JxdS0+ZGF0YS5sZW5ndGgpOworCXdycXUtPmRhdGEuZmxhZ3MgPSAxOyAvKiBhY3RpdmUgKi8KKworCUlQV19ERUJVR19XWCgiR0VUIE5pY2tuYW1lIC0+ICVzIFxuIiwgZXh0cmEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHRhcmdldF9yYXRlID0gd3JxdS0+Yml0cmF0ZS52YWx1ZTsKKwl1MzIgcmF0ZTsKKwlpbnQgZXJyID0gMDsKKworCWRvd24oJnByaXYtPmFjdGlvbl9zZW0pOworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19JTklUSUFMSVpFRCkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCXJhdGUgPSAwOworCisJaWYgKHRhcmdldF9yYXRlID09IDEwMDAwMDAgfHwKKwkgICAgKCF3cnF1LT5iaXRyYXRlLmZpeGVkICYmIHRhcmdldF9yYXRlID4gMTAwMDAwMCkpCisJCXJhdGUgfD0gVFhfUkFURV8xX01CSVQ7CisJaWYgKHRhcmdldF9yYXRlID09IDIwMDAwMDAgfHwKKwkgICAgKCF3cnF1LT5iaXRyYXRlLmZpeGVkICYmIHRhcmdldF9yYXRlID4gMjAwMDAwMCkpCisJCXJhdGUgfD0gVFhfUkFURV8yX01CSVQ7CisJaWYgKHRhcmdldF9yYXRlID09IDU1MDAwMDAgfHwKKwkgICAgKCF3cnF1LT5iaXRyYXRlLmZpeGVkICYmIHRhcmdldF9yYXRlID4gNTUwMDAwMCkpCisJCXJhdGUgfD0gVFhfUkFURV81XzVfTUJJVDsKKwlpZiAodGFyZ2V0X3JhdGUgPT0gMTEwMDAwMDAgfHwKKwkgICAgKCF3cnF1LT5iaXRyYXRlLmZpeGVkICYmIHRhcmdldF9yYXRlID4gMTEwMDAwMDApKQorCQlyYXRlIHw9IFRYX1JBVEVfMTFfTUJJVDsKKwlpZiAocmF0ZSA9PSAwKQorCQlyYXRlID0gREVGQVVMVF9UWF9SQVRFUzsKKworCWVyciA9IGlwdzIxMDBfc2V0X3R4X3JhdGVzKHByaXYsIHJhdGUsIDApOworCisJSVBXX0RFQlVHX1dYKCJTRVQgUmF0ZSAtPiAlMDRYIFxuIiwgcmF0ZSk7CisgZG9uZToKKwl1cCgmcHJpdi0+YWN0aW9uX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCB2YWw7CisJaW50IGxlbiA9IHNpemVvZih2YWwpOworCWludCBlcnIgPSAwOworCisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0VOQUJMRUQpIHx8CisJICAgIHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRl9LSUxMX01BU0sgfHwKKwkgICAgIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkpIHsKKwkJd3JxdS0+Yml0cmF0ZS52YWx1ZSA9IDA7CisJCXJldHVybiAwOworCX0KKworCWRvd24oJnByaXYtPmFjdGlvbl9zZW0pOworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19JTklUSUFMSVpFRCkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCWVyciA9IGlwdzIxMDBfZ2V0X29yZGluYWwocHJpdiwgSVBXX09SRF9DVVJSRU5UX1RYX1JBVEUsICZ2YWwsICZsZW4pOworCWlmIChlcnIpIHsKKwkJSVBXX0RFQlVHX1dYKCJmYWlsZWQgcXVlcnlpbmcgb3JkaW5hbHMuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzd2l0Y2ggKHZhbCAmIFRYX1JBVEVfTUFTSykgeworCWNhc2UgVFhfUkFURV8xX01CSVQ6CisJCXdycXUtPmJpdHJhdGUudmFsdWUgPSAxMDAwMDAwOworCQlicmVhazsKKwljYXNlIFRYX1JBVEVfMl9NQklUOgorCQl3cnF1LT5iaXRyYXRlLnZhbHVlID0gMjAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBUWF9SQVRFXzVfNV9NQklUOgorCQl3cnF1LT5iaXRyYXRlLnZhbHVlID0gNTUwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBUWF9SQVRFXzExX01CSVQ6CisJCXdycXUtPmJpdHJhdGUudmFsdWUgPSAxMTAwMDAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJd3JxdS0+Yml0cmF0ZS52YWx1ZSA9IDA7CisJfQorCisJSVBXX0RFQlVHX1dYKCJHRVQgUmF0ZSAtPiAlZCBcbiIsIHdycXUtPmJpdHJhdGUudmFsdWUpOworCisgZG9uZToKKwl1cCgmcHJpdi0+YWN0aW9uX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpcHcyMTAwX3d4X3NldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgdmFsdWUsIGVycjsKKworCS8qIEF1dG8gUlRTIG5vdCB5ZXQgc3VwcG9ydGVkICovCisJaWYgKHdycXUtPnJ0cy5maXhlZCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJnByaXYtPmFjdGlvbl9zZW0pOworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19JTklUSUFMSVpFRCkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCWlmICh3cnF1LT5ydHMuZGlzYWJsZWQpCisJCXZhbHVlID0gcHJpdi0+cnRzX3RocmVzaG9sZCB8IFJUU19ESVNBQkxFRDsKKwllbHNlIHsKKwkJaWYgKHdycXUtPnJ0cy52YWx1ZSA8IDEgfHwKKwkJICAgIHdycXUtPnJ0cy52YWx1ZSA+IDIzMDQpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJdmFsdWUgPSB3cnF1LT5ydHMudmFsdWU7CisJfQorCisJZXJyID0gaXB3MjEwMF9zZXRfcnRzX3RocmVzaG9sZChwcml2LCB2YWx1ZSk7CisKKwlJUFdfREVCVUdfV1goIlNFVCBSVFMgVGhyZXNob2xkIC0+IDB4JTA4WCBcbiIsIHZhbHVlKTsKKyBkb25lOgorCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfZ2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCS8qCisJICogVGhpcyBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lLiAgTm8gYWN0aW9uIGxvY2sgcmVxdWlyZWQKKwkgKi8KKworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJd3JxdS0+cnRzLnZhbHVlID0gcHJpdi0+cnRzX3RocmVzaG9sZCAmIH5SVFNfRElTQUJMRUQ7CisJd3JxdS0+cnRzLmZpeGVkID0gMTsgLyogbm8gYXV0byBzZWxlY3QgKi8KKworCS8qIElmIFJUUyBpcyBzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUsIHRoZW4gaXQgaXMgZGlzYWJsZWQgKi8KKwl3cnF1LT5ydHMuZGlzYWJsZWQgPSAocHJpdi0+cnRzX3RocmVzaG9sZCAmIFJUU19ESVNBQkxFRCkgPyAxIDogMDsKKworCUlQV19ERUJVR19XWCgiR0VUIFJUUyBUaHJlc2hvbGQgLT4gMHglMDhYIFxuIiwgd3JxdS0+cnRzLnZhbHVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfc2V0X3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMCwgdmFsdWU7CisKKwlpZiAocHJpdi0+aWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0FESE9DKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3cnF1LT50eHBvd2VyLmRpc2FibGVkID09IDEgfHwgd3JxdS0+dHhwb3dlci5maXhlZCA9PSAwKQorCQl2YWx1ZSA9IElQV19UWF9QT1dFUl9ERUZBVUxUOworCWVsc2UgeworCQlpZiAod3JxdS0+dHhwb3dlci52YWx1ZSA8IElQV19UWF9QT1dFUl9NSU5fREJNIHx8CisJCSAgICB3cnF1LT50eHBvd2VyLnZhbHVlID4gSVBXX1RYX1BPV0VSX01BWF9EQk0pCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl2YWx1ZSA9ICh3cnF1LT50eHBvd2VyLnZhbHVlIC0gSVBXX1RYX1BPV0VSX01JTl9EQk0pICogMTYgLworCQkJKElQV19UWF9QT1dFUl9NQVhfREJNIC0gSVBXX1RYX1BPV0VSX01JTl9EQk0pOworCX0KKworCWRvd24oJnByaXYtPmFjdGlvbl9zZW0pOworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19JTklUSUFMSVpFRCkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCWVyciA9IGlwdzIxMDBfc2V0X3R4X3Bvd2VyKHByaXYsIHZhbHVlKTsKKworCUlQV19ERUJVR19XWCgiU0VUIFRYIFBvd2VyIC0+ICVkIFxuIiwgdmFsdWUpOworCisgZG9uZToKKwl1cCgmcHJpdi0+YWN0aW9uX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpcHcyMTAwX3d4X2dldF90eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJLyoKKwkgKiBUaGlzIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUuICBObyBhY3Rpb24gbG9jayByZXF1aXJlZAorCSAqLworCisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZiAocHJpdi0+aWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0FESE9DKSB7CisJCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHByaXYtPnR4X3Bvd2VyID09IElQV19UWF9QT1dFUl9ERUZBVUxUKSB7CisJCXdycXUtPnBvd2VyLmZpeGVkID0gMDsKKwkJd3JxdS0+cG93ZXIudmFsdWUgPSBJUFdfVFhfUE9XRVJfTUFYX0RCTTsKKwkJd3JxdS0+cG93ZXIuZGlzYWJsZWQgPSAxOworCX0gZWxzZSB7CisJCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMDsKKwkJd3JxdS0+cG93ZXIuZml4ZWQgPSAxOworCQl3cnF1LT5wb3dlci52YWx1ZSA9CisJCQkocHJpdi0+dHhfcG93ZXIgKgorCQkJIChJUFdfVFhfUE9XRVJfTUFYX0RCTSAtIElQV19UWF9QT1dFUl9NSU5fREJNKSkgLworCQkJKElQV19UWF9QT1dFUl9NQVggLSBJUFdfVFhfUE9XRVJfTUlOKSArCisJCQlJUFdfVFhfUE9XRVJfTUlOX0RCTTsKKwl9CisKKwl3cnF1LT5wb3dlci5mbGFncyA9IElXX1RYUE9XX0RCTTsKKworCUlQV19ERUJVR19XWCgiR0VUIFRYIFBvd2VyIC0+ICVkIFxuIiwgd3JxdS0+cG93ZXIudmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9zZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJLyoKKwkgKiBUaGlzIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUuICBObyBhY3Rpb24gbG9jayByZXF1aXJlZAorCSAqLworCisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZiAoIXdycXUtPmZyYWcuZml4ZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdycXUtPmZyYWcuZGlzYWJsZWQpIHsKKwkJcHJpdi0+ZnJhZ190aHJlc2hvbGQgfD0gRlJBR19ESVNBQkxFRDsKKwkJcHJpdi0+aWVlZS0+ZnRzID0gREVGQVVMVF9GVFM7CisJfSBlbHNlIHsKKwkJaWYgKHdycXUtPmZyYWcudmFsdWUgPCBNSU5fRlJBR19USFJFU0hPTEQgfHwKKwkJICAgIHdycXUtPmZyYWcudmFsdWUgPiBNQVhfRlJBR19USFJFU0hPTEQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT5pZWVlLT5mdHMgPSB3cnF1LT5mcmFnLnZhbHVlICYgfjB4MTsKKwkJcHJpdi0+ZnJhZ190aHJlc2hvbGQgPSBwcml2LT5pZWVlLT5mdHM7CisJfQorCisJSVBXX0RFQlVHX1dYKCJTRVQgRnJhZyBUaHJlc2hvbGQgLT4gJWQgXG4iLCBwcml2LT5pZWVlLT5mdHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJLyoKKwkgKiBUaGlzIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUuICBObyBhY3Rpb24gbG9jayByZXF1aXJlZAorCSAqLworCisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJd3JxdS0+ZnJhZy52YWx1ZSA9IHByaXYtPmZyYWdfdGhyZXNob2xkICYgfkZSQUdfRElTQUJMRUQ7CisJd3JxdS0+ZnJhZy5maXhlZCA9IDA7CS8qIG5vIGF1dG8gc2VsZWN0ICovCisJd3JxdS0+ZnJhZy5kaXNhYmxlZCA9IChwcml2LT5mcmFnX3RocmVzaG9sZCAmIEZSQUdfRElTQUJMRUQpID8gMSA6IDA7CisKKwlJUFdfREVCVUdfV1goIkdFVCBGcmFnIFRocmVzaG9sZCAtPiAlZCBcbiIsIHdycXUtPmZyYWcudmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9zZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTElGRVRJTUUgfHwKKwkgICAgd3JxdS0+cmV0cnkuZGlzYWJsZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9MSU1JVCkpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+YWN0aW9uX3NlbSk7CisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0lOSVRJQUxJWkVEKSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUlOKSB7CisJCWVyciA9IGlwdzIxMDBfc2V0X3Nob3J0X3JldHJ5KHByaXYsIHdycXUtPnJldHJ5LnZhbHVlKTsKKwkJSVBXX0RFQlVHX1dYKCJTRVQgU2hvcnQgUmV0cnkgTGltaXQgLT4gJWQgXG4iLAorCQkgICAgICAgd3JxdS0+cmV0cnkudmFsdWUpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7CisJCWVyciA9IGlwdzIxMDBfc2V0X2xvbmdfcmV0cnkocHJpdiwgd3JxdS0+cmV0cnkudmFsdWUpOworCQlJUFdfREVCVUdfV1goIlNFVCBMb25nIFJldHJ5IExpbWl0IC0+ICVkIFxuIiwKKwkJICAgICAgIHdycXUtPnJldHJ5LnZhbHVlKTsKKwkJZ290byBkb25lOworCX0KKworCWVyciA9IGlwdzIxMDBfc2V0X3Nob3J0X3JldHJ5KHByaXYsIHdycXUtPnJldHJ5LnZhbHVlKTsKKwlpZiAoIWVycikKKwkJZXJyID0gaXB3MjEwMF9zZXRfbG9uZ19yZXRyeShwcml2LCB3cnF1LT5yZXRyeS52YWx1ZSk7CisKKwlJUFdfREVCVUdfV1goIlNFVCBCb3RoIFJldHJ5IExpbWl0cyAtPiAlZCBcbiIsIHdycXUtPnJldHJ5LnZhbHVlKTsKKworIGRvbmU6CisJdXAoJnByaXYtPmFjdGlvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9nZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCS8qCisJICogVGhpcyBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lLiAgTm8gYWN0aW9uIGxvY2sgcmVxdWlyZWQKKwkgKi8KKworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJd3JxdS0+cmV0cnkuZGlzYWJsZWQgPSAwOyAvKiBjYW4ndCBiZSBkaXNhYmxlZCAqLworCisJaWYgKCh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX1RZUEUpID09CisJICAgIElXX1JFVFJZX0xJRkVUSU1FKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX01BWCkgeworCQl3cnF1LT5yZXRyeS5mbGFncyA9IElXX1JFVFJZX0xJTUlUICYgSVdfUkVUUllfTUFYOworCQl3cnF1LT5yZXRyeS52YWx1ZSA9IHByaXYtPmxvbmdfcmV0cnlfbGltaXQ7CisJfSBlbHNlIHsKKwkJd3JxdS0+cmV0cnkuZmxhZ3MgPQorCQkgICAgKHByaXYtPnNob3J0X3JldHJ5X2xpbWl0ICE9CisJCSAgICAgcHJpdi0+bG9uZ19yZXRyeV9saW1pdCkgPworCQkgICAgSVdfUkVUUllfTElNSVQgJiBJV19SRVRSWV9NSU4gOiBJV19SRVRSWV9MSU1JVDsKKworCQl3cnF1LT5yZXRyeS52YWx1ZSA9IHByaXYtPnNob3J0X3JldHJ5X2xpbWl0OworCX0KKworCUlQV19ERUJVR19XWCgiR0VUIFJldHJ5IC0+ICVkIFxuIiwgd3JxdS0+cmV0cnkudmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisKKwlkb3duKCZwcml2LT5hY3Rpb25fc2VtKTsKKwlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfSU5JVElBTElaRUQpKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZG9uZTsKKwl9CisKKwlJUFdfREVCVUdfV1goIkluaXRpYXRpbmcgc2Nhbi4uLlxuIik7CisJaWYgKGlwdzIxMDBfc2V0X3NjYW5fb3B0aW9ucyhwcml2KSB8fAorCSAgICBpcHcyMTAwX3N0YXJ0X3NjYW4ocHJpdikpIHsKKwkJSVBXX0RFQlVHX1dYKCJTdGFydCBzY2FuIGZhaWxlZC5cbiIpOworCisJCS8qIFRPRE86IE1hcmsgYSBzY2FuIGFzIHBlbmRpbmcgc28gd2hlbiBoYXJkd2FyZSBpbml0aWFsaXplZAorCQkgKiAgICAgICBhIHNjYW4gc3RhcnRzICovCisJfQorCisgZG9uZToKKwl1cCgmcHJpdi0+YWN0aW9uX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpcHcyMTAwX3d4X2dldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZS4gIE5vIGFjdGlvbiBsb2NrIHJlcXVpcmVkCisJICovCisKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9zY2FuKHByaXYtPmllZWUsIGluZm8sIHdycXUsIGV4dHJhKTsKK30KKworCisvKgorICogSW1wbGVtZW50YXRpb24gYmFzZWQgb24gY29kZSBpbiBob3N0YXAtZHJpdmVyIHYwLjEuMyBob3N0YXBfaW9jdGwuYworICovCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfc2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpCit7CisJLyoKKwkgKiBObyBjaGVjayBvZiBTVEFUVVNfSU5JVElBTElaRUQgcmVxdWlyZWQKKwkgKi8KKworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXJldHVybiBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShwcml2LT5pZWVlLCBpbmZvLCB3cnF1LCBrZXkpOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpCit7CisJLyoKKwkgKiBUaGlzIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUuICBObyBhY3Rpb24gbG9jayByZXF1aXJlZAorCSAqLworCisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHByaXYtPmllZWUsIGluZm8sIHdycXUsIGtleSk7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9zZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisKKwlkb3duKCZwcml2LT5hY3Rpb25fc2VtKTsKKwlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfSU5JVElBTElaRUQpKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAod3JxdS0+cG93ZXIuZGlzYWJsZWQpIHsKKwkJcHJpdi0+cG93ZXJfbW9kZSA9IElQV19QT1dFUl9MRVZFTChwcml2LT5wb3dlcl9tb2RlKTsKKwkJZXJyID0gaXB3MjEwMF9zZXRfcG93ZXJfbW9kZShwcml2LCBJUFdfUE9XRVJfTU9ERV9DQU0pOworCQlJUFdfREVCVUdfV1goIlNFVCBQb3dlciBNYW5hZ2VtZW50IE1vZGUgLT4gb2ZmXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCXN3aXRjaCAod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9NT0RFKSB7CisJY2FzZSBJV19QT1dFUl9PTjogICAgLyogSWYgbm90IHNwZWNpZmllZCAqLworCWNhc2UgSVdfUE9XRVJfTU9ERTogIC8qIElmIHNldCBhbGwgbWFzayAqLworCWNhc2UgSVdfUE9XRVJfQUxMX1I6IC8qIElmIGV4cGxpY2l0ZWx5IHN0YXRlIGFsbCAqLworCQlicmVhazsKKwlkZWZhdWx0OiAvKiBPdGhlcndpc2Ugd2UgZG9uJ3Qgc3VwcG9ydCBpdCAqLworCQlJUFdfREVCVUdfV1goIlNFVCBQTSBNb2RlOiAlWCBub3Qgc3VwcG9ydGVkLlxuIiwKKwkJCSAgICAgd3JxdS0+cG93ZXIuZmxhZ3MpOworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBkb25lOworCX0KKworCS8qIElmIHRoZSB1c2VyIGhhc24ndCBzcGVjaWZpZWQgYSBwb3dlciBtYW5hZ2VtZW50IG1vZGUgeWV0LCBkZWZhdWx0CisJICogdG8gQkFUVEVSWSAqLworCXByaXYtPnBvd2VyX21vZGUgPSBJUFdfUE9XRVJfRU5BQkxFRCB8IHByaXYtPnBvd2VyX21vZGU7CisJZXJyID0gaXB3MjEwMF9zZXRfcG93ZXJfbW9kZShwcml2LCBJUFdfUE9XRVJfTEVWRUwocHJpdi0+cG93ZXJfbW9kZSkpOworCisJSVBXX0RFQlVHX1dYKCJTRVQgUG93ZXIgTWFuYWdlbWVudCBNb2RlIC0+IDB4JTAyWFxuIiwKKwkJICAgICBwcml2LT5wb3dlcl9tb2RlKTsKKworIGRvbmU6CisJdXAoJnByaXYtPmFjdGlvbl9zZW0pOworCXJldHVybiBlcnI7CisKK30KKworc3RhdGljIGludCBpcHcyMTAwX3d4X2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZS4gIE5vIGFjdGlvbiBsb2NrIHJlcXVpcmVkCisJICovCisKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmICghKHByaXYtPnBvd2VyX21vZGUgJiBJUFdfUE9XRVJfRU5BQkxFRCkpIHsKKwkJd3JxdS0+cG93ZXIuZGlzYWJsZWQgPSAxOworCX0gZWxzZSB7CisJCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMDsKKwkJd3JxdS0+cG93ZXIuZmxhZ3MgPSAwOworCX0KKworCUlQV19ERUJVR19XWCgiR0VUIFBvd2VyIE1hbmFnZW1lbnQgTW9kZSAtPiAlMDJYXG4iLCBwcml2LT5wb3dlcl9tb2RlKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKgorICogSVdQUklWIGhhbmRsZXJzCisgKgorICovCisjaWZkZWYgQ09ORklHX0lQVzIxMDBfTU9OSVRPUgorc3RhdGljIGludCBpcHcyMTAwX3d4X3NldF9wcm9taXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50ICpwYXJtcyA9IChpbnQgKilleHRyYTsKKwlpbnQgZW5hYmxlID0gKHBhcm1zWzBdID4gMCk7CisJaW50IGVyciA9IDA7CisKKwlkb3duKCZwcml2LT5hY3Rpb25fc2VtKTsKKwlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfSU5JVElBTElaRUQpKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoZW5hYmxlKSB7CisJCWlmIChwcml2LT5pZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgeworCQkJZXJyID0gaXB3MjEwMF9zZXRfY2hhbm5lbChwcml2LCBwYXJtc1sxXSwgMCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJcHJpdi0+Y2hhbm5lbCA9IHBhcm1zWzFdOworCQllcnIgPSBpcHcyMTAwX3N3aXRjaF9tb2RlKHByaXYsIElXX01PREVfTU9OSVRPUik7CisJfSBlbHNlIHsKKwkJaWYgKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQkJZXJyID0gaXB3MjEwMF9zd2l0Y2hfbW9kZShwcml2LCBwcml2LT5sYXN0X21vZGUpOworCX0KKyBkb25lOgorCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfSU5JVElBTElaRUQpCisJCXNjaGVkdWxlX3Jlc2V0KHByaXYpOworCXJldHVybiAwOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBpcHcyMTAwX3d4X3NldF9wb3dlcm1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGVyciA9IDAsIG1vZGUgPSAqKGludCAqKWV4dHJhOworCisJZG93bigmcHJpdi0+YWN0aW9uX3NlbSk7CisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0lOSVRJQUxJWkVEKSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKChtb2RlIDwgMSkgfHwgKG1vZGUgPiBQT1dFUl9NT0RFUykpCisJCW1vZGUgPSBJUFdfUE9XRVJfQVVUTzsKKworCWlmIChwcml2LT5wb3dlcl9tb2RlICE9IG1vZGUpCisJCWVyciA9IGlwdzIxMDBfc2V0X3Bvd2VyX21vZGUocHJpdiwgbW9kZSk7CisgZG9uZToKKwl1cCgmcHJpdi0+YWN0aW9uX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBNQVhfUE9XRVJfU1RSSU5HIDgwCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfZ2V0X3Bvd2VybW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZS4gIE5vIGFjdGlvbiBsb2NrIHJlcXVpcmVkCisJICovCisKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgbGV2ZWwgPSBJUFdfUE9XRVJfTEVWRUwocHJpdi0+cG93ZXJfbW9kZSk7CisJczMyIHRpbWVvdXQsIHBlcmlvZDsKKworCWlmICghKHByaXYtPnBvd2VyX21vZGUgJiBJUFdfUE9XRVJfRU5BQkxFRCkpIHsKKwkJc25wcmludGYoZXh0cmEsIE1BWF9QT1dFUl9TVFJJTkcsCisJCQkgIlBvd2VyIHNhdmUgbGV2ZWw6ICVkIChPZmYpIiwgbGV2ZWwpOworCX0gZWxzZSB7CisJCXN3aXRjaCAobGV2ZWwpIHsKKwkJY2FzZSBJUFdfUE9XRVJfTU9ERV9DQU06CisJCQlzbnByaW50ZihleHRyYSwgTUFYX1BPV0VSX1NUUklORywKKwkJCQkgIlBvd2VyIHNhdmUgbGV2ZWw6ICVkIChOb25lKSIsIGxldmVsKTsKKwkJCWJyZWFrOworCQljYXNlIElQV19QT1dFUl9BVVRPOgorCQlzbnByaW50ZihleHRyYSwgTUFYX1BPV0VSX1NUUklORywKKwkJCSAiUG93ZXIgc2F2ZSBsZXZlbDogJWQgKEF1dG8pIiwgMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRpbWVvdXQgPSB0aW1lb3V0X2R1cmF0aW9uW2xldmVsIC0gMV0gLyAxMDAwOworCQkJcGVyaW9kID0gcGVyaW9kX2R1cmF0aW9uW2xldmVsIC0gMV0gLyAxMDAwOworCQkJc25wcmludGYoZXh0cmEsIE1BWF9QT1dFUl9TVFJJTkcsCisJCQkJICJQb3dlciBzYXZlIGxldmVsOiAlZCAiCisJCQkJICIoVGltZW91dCAlZG1zLCBQZXJpb2QgJWRtcykiLAorCQkJCSBsZXZlbCwgdGltZW91dCwgcGVyaW9kKTsKKwkJfQorCX0KKworCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlwdzIxMDBfd3hfc2V0X3ByZWFtYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgZXJyLCBtb2RlID0gKihpbnQgKilleHRyYTsKKworCWRvd24oJnByaXYtPmFjdGlvbl9zZW0pOworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19JTklUSUFMSVpFRCkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCWlmIChtb2RlID09IDEpCisJCXByaXYtPmNvbmZpZyB8PSBDRkdfTE9OR19QUkVBTUJMRTsKKwllbHNlIGlmIChtb2RlID09IDApCisJCXByaXYtPmNvbmZpZyAmPSB+Q0ZHX0xPTkdfUFJFQU1CTEU7CisJZWxzZSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwllcnIgPSBpcHcyMTAwX3N5c3RlbV9jb25maWcocHJpdiwgMCk7CisKK2RvbmU6CisJdXAoJnByaXYtPmFjdGlvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXB3MjEwMF93eF9nZXRfcHJlYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJLyoKKwkgKiBUaGlzIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUuICBObyBhY3Rpb24gbG9jayByZXF1aXJlZAorCSAqLworCisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZiAocHJpdi0+Y29uZmlnICYgQ0ZHX0xPTkdfUFJFQU1CTEUpCisJCXNucHJpbnRmKHdycXUtPm5hbWUsIElGTkFNU0laLCAibG9uZyAoMSkiKTsKKwllbHNlCisJCXNucHJpbnRmKHdycXUtPm5hbWUsIElGTkFNU0laLCAiYXV0byAoMCkiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXdfaGFuZGxlciBpcHcyMTAwX3d4X2hhbmRsZXJzW10gPQoreworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KKyAgICAgICAgaXB3MjEwMF93eF9nZXRfbmFtZSwgICAgICAvKiBTSU9DR0lXTkFNRSAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgKi8KKyAgICAgICAgaXB3MjEwMF93eF9zZXRfZnJlcSwgICAgICAvKiBTSU9DU0lXRlJFUSAqLworICAgICAgICBpcHcyMTAwX3d4X2dldF9mcmVxLCAgICAgIC8qIFNJT0NHSVdGUkVRICovCisgICAgICAgIGlwdzIxMDBfd3hfc2V0X21vZGUsICAgICAgLyogU0lPQ1NJV01PREUgKi8KKyAgICAgICAgaXB3MjEwMF93eF9nZXRfbW9kZSwgICAgICAvKiBTSU9DR0lXTU9ERSAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTRU5TICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NFTlMgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkFOR0UgKi8KKyAgICAgICAgaXB3MjEwMF93eF9nZXRfcmFuZ2UsICAgICAvKiBTSU9DR0lXUkFOR0UgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUFJJViAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQUklWICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NUQVRTICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NUQVRTICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTUFkgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1dJV1RIUlNQWSAqLworICAgICAgICBpcHcyMTAwX3d4X3NldF93YXAsICAgICAgIC8qIFNJT0NTSVdBUCAqLworICAgICAgICBpcHcyMTAwX3d4X2dldF93YXAsICAgICAgIC8qIFNJT0NHSVdBUCAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXQVBMSVNUIC0tIGRlcHJlY2F0ZWQgKi8KKyAgICAgICAgaXB3MjEwMF93eF9zZXRfc2NhbiwgICAgICAvKiBTSU9DU0lXU0NBTiAqLworICAgICAgICBpcHcyMTAwX3d4X2dldF9zY2FuLCAgICAgIC8qIFNJT0NHSVdTQ0FOICovCisgICAgICAgIGlwdzIxMDBfd3hfc2V0X2Vzc2lkLCAgICAgLyogU0lPQ1NJV0VTU0lEICovCisgICAgICAgIGlwdzIxMDBfd3hfZ2V0X2Vzc2lkLCAgICAgLyogU0lPQ0dJV0VTU0lEICovCisgICAgICAgIGlwdzIxMDBfd3hfc2V0X25pY2ssICAgICAgLyogU0lPQ1NJV05JQ0tOICovCisgICAgICAgIGlwdzIxMDBfd3hfZ2V0X25pY2ssICAgICAgLyogU0lPQ0dJV05JQ0tOICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAgICAgaXB3MjEwMF93eF9zZXRfcmF0ZSwgICAgICAvKiBTSU9DU0lXUkFURSAqLworICAgICAgICBpcHcyMTAwX3d4X2dldF9yYXRlLCAgICAgIC8qIFNJT0NHSVdSQVRFICovCisgICAgICAgIGlwdzIxMDBfd3hfc2V0X3J0cywgICAgICAgLyogU0lPQ1NJV1JUUyAqLworICAgICAgICBpcHcyMTAwX3d4X2dldF9ydHMsICAgICAgIC8qIFNJT0NHSVdSVFMgKi8KKyAgICAgICAgaXB3MjEwMF93eF9zZXRfZnJhZywgICAgICAvKiBTSU9DU0lXRlJBRyAqLworICAgICAgICBpcHcyMTAwX3d4X2dldF9mcmFnLCAgICAgIC8qIFNJT0NHSVdGUkFHICovCisgICAgICAgIGlwdzIxMDBfd3hfc2V0X3R4cG93LCAgICAgLyogU0lPQ1NJV1RYUE9XICovCisgICAgICAgIGlwdzIxMDBfd3hfZ2V0X3R4cG93LCAgICAgLyogU0lPQ0dJV1RYUE9XICovCisgICAgICAgIGlwdzIxMDBfd3hfc2V0X3JldHJ5LCAgICAgLyogU0lPQ1NJV1JFVFJZICovCisgICAgICAgIGlwdzIxMDBfd3hfZ2V0X3JldHJ5LCAgICAgLyogU0lPQ0dJV1JFVFJZICovCisgICAgICAgIGlwdzIxMDBfd3hfc2V0X2VuY29kZSwgICAgLyogU0lPQ1NJV0VOQ09ERSAqLworICAgICAgICBpcHcyMTAwX3d4X2dldF9lbmNvZGUsICAgIC8qIFNJT0NHSVdFTkNPREUgKi8KKyAgICAgICAgaXB3MjEwMF93eF9zZXRfcG93ZXIsICAgICAvKiBTSU9DU0lXUE9XRVIgKi8KKyAgICAgICAgaXB3MjEwMF93eF9nZXRfcG93ZXIsICAgICAvKiBTSU9DR0lXUE9XRVIgKi8KK307CisKKyNkZWZpbmUgSVBXMjEwMF9QUklWX1NFVF9NT05JVE9SCVNJT0NJV0ZJUlNUUFJJVgorI2RlZmluZSBJUFcyMTAwX1BSSVZfUkVTRVQJCVNJT0NJV0ZJUlNUUFJJVisxCisjZGVmaW5lIElQVzIxMDBfUFJJVl9TRVRfUE9XRVIJCVNJT0NJV0ZJUlNUUFJJVisyCisjZGVmaW5lIElQVzIxMDBfUFJJVl9HRVRfUE9XRVIJCVNJT0NJV0ZJUlNUUFJJViszCisjZGVmaW5lIElQVzIxMDBfUFJJVl9TRVRfTE9OR1BSRUFNQkxFCVNJT0NJV0ZJUlNUUFJJVis0CisjZGVmaW5lIElQVzIxMDBfUFJJVl9HRVRfTE9OR1BSRUFNQkxFCVNJT0NJV0ZJUlNUUFJJVis1CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIGlwdzIxMDBfcHJpdmF0ZV9hcmdzW10gPSB7CisKKyNpZmRlZiBDT05GSUdfSVBXMjEwMF9NT05JVE9SCisJeworCQlJUFcyMTAwX1BSSVZfU0VUX01PTklUT1IsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAyLCAwLCAibW9uaXRvciIKKwl9LAorCXsKKwkJSVBXMjEwMF9QUklWX1JFU0VULAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMCwgMCwgInJlc2V0IgorCX0sCisjZW5kaWYgLyogQ09ORklHX0lQVzIxMDBfTU9OSVRPUiAqLworCisJeworCQlJUFcyMTAwX1BSSVZfU0VUX1BPV0VSLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9wb3dlciIKKwl9LAorCXsKKwkJSVBXMjEwMF9QUklWX0dFVF9QT1dFUiwKKwkJMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCBNQVhfUE9XRVJfU1RSSU5HLCAiZ2V0X3Bvd2VyIgorCX0sCisJeworCQlJUFcyMTAwX1BSSVZfU0VUX0xPTkdQUkVBTUJMRSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfcHJlYW1ibGUiCisJfSwKKwl7CisJCUlQVzIxMDBfUFJJVl9HRVRfTE9OR1BSRUFNQkxFLAorCQkwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IElGTkFNU0laLCAiZ2V0X3ByZWFtYmxlIgorCX0sCit9OworCitzdGF0aWMgaXdfaGFuZGxlciBpcHcyMTAwX3ByaXZhdGVfaGFuZGxlcltdID0geworI2lmZGVmIENPTkZJR19JUFcyMTAwX01PTklUT1IKKwlpcHcyMTAwX3d4X3NldF9wcm9taXNjLAorCWlwdzIxMDBfd3hfcmVzZXQsCisjZWxzZSAvKiBDT05GSUdfSVBXMjEwMF9NT05JVE9SICovCisJTlVMTCwKKwlOVUxMLAorI2VuZGlmIC8qIENPTkZJR19JUFcyMTAwX01PTklUT1IgKi8KKwlpcHcyMTAwX3d4X3NldF9wb3dlcm1vZGUsCisJaXB3MjEwMF93eF9nZXRfcG93ZXJtb2RlLAorCWlwdzIxMDBfd3hfc2V0X3ByZWFtYmxlLAorCWlwdzIxMDBfd3hfZ2V0X3ByZWFtYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCBpd19oYW5kbGVyX2RlZiBpcHcyMTAwX3d4X2hhbmRsZXJfZGVmID0KK3sKKwkuc3RhbmRhcmQgPSBpcHcyMTAwX3d4X2hhbmRsZXJzLAorCS5udW1fc3RhbmRhcmQgPSBzaXplb2YoaXB3MjEwMF93eF9oYW5kbGVycykgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlID0gc2l6ZW9mKGlwdzIxMDBfcHJpdmF0ZV9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKyAJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YoaXB3MjEwMF9wcml2YXRlX2FyZ3MpIC8KKwlzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisJLnByaXZhdGUgPSAoaXdfaGFuZGxlciAqKWlwdzIxMDBfcHJpdmF0ZV9oYW5kbGVyLAorCS5wcml2YXRlX2FyZ3MgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKWlwdzIxMDBfcHJpdmF0ZV9hcmdzLAorfTsKKworLyoKKyAqIEdldCB3aXJlbGVzcyBzdGF0aXN0aWNzLgorICogQ2FsbGVkIGJ5IC9wcm9jL25ldC93aXJlbGVzcworICogQWxzbyBjYWxsZWQgYnkgU0lPQ0dJV1NUQVRTCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqaXB3MjEwMF93eF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwllbnVtIHsKKwkJUE9PUiA9IDMwLAorCQlGQUlSID0gNjAsCisJCUdPT0QgPSA4MCwKKwkJVkVSWV9HT09EID0gOTAsCisJCUVYQ0VMTEVOVCA9IDk1LAorCQlQRVJGRUNUID0gMTAwCisJfTsKKwlpbnQgcnNzaV9xdWFsOworCWludCB0eF9xdWFsOworCWludCBiZWFjb25fcXVhbDsKKworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpd19zdGF0aXN0aWNzICp3c3RhdHM7CisJdTMyIHJzc2ksIHF1YWxpdHksIHR4X3JldHJpZXMsIG1pc3NlZF9iZWFjb25zLCB0eF9mYWlsdXJlczsKKwl1MzIgb3JkX2xlbiA9IHNpemVvZih1MzIpOworCisJaWYgKCFwcml2KQorCQlyZXR1cm4gKHN0cnVjdCBpd19zdGF0aXN0aWNzICopIE5VTEw7CisKKwl3c3RhdHMgPSAmcHJpdi0+d3N0YXRzOworCisJLyogaWYgaHcgaXMgZGlzYWJsZWQsIHRoZW4gaXB3MjEwMF9nZXRfb3JkaW5hbCgpIGNhbid0IGJlIGNhbGxlZC4KKwkgKiBpcHcyMTAwX3d4X3dpcmVsZXNzX3N0YXRzIHNlZW1zIHRvIGJlIGNhbGxlZCBiZWZvcmUgZncgaXMKKwkgKiBpbml0aWFsaXplZC4gIFNUQVRVU19BU1NPQ0lBVEVEIHdpbGwgb25seSBiZSBzZXQgaWYgdGhlIGh3IGlzIHVwCisJICogYW5kIGFzc29jaWF0ZWQ7IGlmIG5vdCBhc3NvY2ljYXRlZCwgdGhlIHZhbHVlcyBhcmUgYWxsIG1lYW5pbmdsZXNzCisJICogYW55d2F5LCBzbyBzZXQgdGhlbSBhbGwgdG8gTlVMTCBhbmQgSU5WQUxJRCAqLworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKSkgeworCQl3c3RhdHMtPm1pc3MuYmVhY29uID0gMDsKKwkJd3N0YXRzLT5kaXNjYXJkLnJldHJpZXMgPSAwOworCQl3c3RhdHMtPnF1YWwucXVhbCA9IDA7CisJCXdzdGF0cy0+cXVhbC5sZXZlbCA9IDA7CisJCXdzdGF0cy0+cXVhbC5ub2lzZSA9IDA7CisJCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gNzsKKwkJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9OT0lTRV9JTlZBTElEIHwKKwkJCUlXX1FVQUxfUVVBTF9JTlZBTElEIHwgSVdfUVVBTF9MRVZFTF9JTlZBTElEOworCQlyZXR1cm4gd3N0YXRzOworCX0KKworCWlmIChpcHcyMTAwX2dldF9vcmRpbmFsKHByaXYsIElQV19PUkRfU1RBVF9QRVJDRU5UX01JU1NFRF9CQ05TLAorCQkJCSZtaXNzZWRfYmVhY29ucywgJm9yZF9sZW4pKQorCQlnb3RvIGZhaWxfZ2V0X29yZGluYWw7CisKKyAgICAgICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNvbm5lY3Rpb24gdGhlIHF1YWxpdHkgYW5kIGxldmVsIGlzIDAqLworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKSkgeworCQl3c3RhdHMtPnF1YWwucXVhbCA9IDA7CisJCXdzdGF0cy0+cXVhbC5sZXZlbCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKGlwdzIxMDBfZ2V0X29yZGluYWwocHJpdiwgSVBXX09SRF9SU1NJX0FWR19DVVJSLAorCQkJCQkmcnNzaSwgJm9yZF9sZW4pKQorCQkJZ290byBmYWlsX2dldF9vcmRpbmFsOworCQl3c3RhdHMtPnF1YWwubGV2ZWwgPSByc3NpICsgSVBXMjEwMF9SU1NJX1RPX0RCTTsKKwkJaWYgKHJzc2kgPCAxMCkKKwkJCXJzc2lfcXVhbCA9IHJzc2kgKiBQT09SIC8gMTA7CisJCWVsc2UgaWYgKHJzc2kgPCAxNSkKKwkJCXJzc2lfcXVhbCA9IChyc3NpIC0gMTApICogKEZBSVIgLSBQT09SKSAvIDUgKyBQT09SOworCQllbHNlIGlmIChyc3NpIDwgMjApCisJCQlyc3NpX3F1YWwgPSAocnNzaSAtIDE1KSAqIChHT09EIC0gRkFJUikgLyA1ICsgRkFJUjsKKwkJZWxzZSBpZiAocnNzaSA8IDMwKQorCQkJcnNzaV9xdWFsID0gKHJzc2kgLSAyMCkgKiAoVkVSWV9HT09EIC0gR09PRCkgLworCQkJCTEwICsgR09PRDsKKwkJZWxzZQorCQkJcnNzaV9xdWFsID0gKHJzc2kgLSAzMCkgKiAoUEVSRkVDVCAtIFZFUllfR09PRCkgLworCQkJCTEwICsgVkVSWV9HT09EOworCisJCWlmIChpcHcyMTAwX2dldF9vcmRpbmFsKHByaXYsIElQV19PUkRfU1RBVF9QRVJDRU5UX1JFVFJJRVMsCisJCQkJCSZ0eF9yZXRyaWVzLCAmb3JkX2xlbikpCisJCQlnb3RvIGZhaWxfZ2V0X29yZGluYWw7CisKKwkJaWYgKHR4X3JldHJpZXMgPiA3NSkKKwkJCXR4X3F1YWwgPSAoOTAgLSB0eF9yZXRyaWVzKSAqIFBPT1IgLyAxNTsKKwkJZWxzZSBpZiAodHhfcmV0cmllcyA+IDcwKQorCQkJdHhfcXVhbCA9ICg3NSAtIHR4X3JldHJpZXMpICogKEZBSVIgLSBQT09SKSAvIDUgKyBQT09SOworCQllbHNlIGlmICh0eF9yZXRyaWVzID4gNjUpCisJCQl0eF9xdWFsID0gKDcwIC0gdHhfcmV0cmllcykgKiAoR09PRCAtIEZBSVIpIC8gNSArIEZBSVI7CisJCWVsc2UgaWYgKHR4X3JldHJpZXMgPiA1MCkKKwkJCXR4X3F1YWwgPSAoNjUgLSB0eF9yZXRyaWVzKSAqIChWRVJZX0dPT0QgLSBHT09EKSAvCisJCQkJMTUgKyBHT09EOworCQllbHNlCisJCQl0eF9xdWFsID0gKDUwIC0gdHhfcmV0cmllcykgKgorCQkJCShQRVJGRUNUIC0gVkVSWV9HT09EKSAvIDUwICsgVkVSWV9HT09EOworCisJCWlmIChtaXNzZWRfYmVhY29ucyA+IDUwKQorCQkJYmVhY29uX3F1YWwgPSAoNjAgLSBtaXNzZWRfYmVhY29ucykgKiBQT09SIC8gMTA7CisJCWVsc2UgaWYgKG1pc3NlZF9iZWFjb25zID4gNDApCisJCQliZWFjb25fcXVhbCA9ICg1MCAtIG1pc3NlZF9iZWFjb25zKSAqIChGQUlSIC0gUE9PUikgLworCQkJCTEwICsgUE9PUjsKKwkJZWxzZSBpZiAobWlzc2VkX2JlYWNvbnMgPiAzMikKKwkJCWJlYWNvbl9xdWFsID0gKDQwIC0gbWlzc2VkX2JlYWNvbnMpICogKEdPT0QgLSBGQUlSKSAvCisJCQkJMTggKyBGQUlSOworCQllbHNlIGlmIChtaXNzZWRfYmVhY29ucyA+IDIwKQorCQkJYmVhY29uX3F1YWwgPSAoMzIgLSBtaXNzZWRfYmVhY29ucykgKgorCQkJCShWRVJZX0dPT0QgLSBHT09EKSAvIDIwICsgR09PRDsKKwkJZWxzZQorCQkJYmVhY29uX3F1YWwgPSAoMjAgLSBtaXNzZWRfYmVhY29ucykgKgorCQkJCShQRVJGRUNUIC0gVkVSWV9HT09EKSAvIDIwICsgVkVSWV9HT09EOworCisJCXF1YWxpdHkgPSBtaW4oYmVhY29uX3F1YWwsIG1pbih0eF9xdWFsLCByc3NpX3F1YWwpKTsKKworI2lmZGVmIENPTkZJR19JUFdfREVCVUcKKwkJaWYgKGJlYWNvbl9xdWFsID09IHF1YWxpdHkpCisJCQlJUFdfREVCVUdfV1goIlF1YWxpdHkgY2xhbXBlZCBieSBNaXNzZWQgQmVhY29uc1xuIik7CisJCWVsc2UgaWYgKHR4X3F1YWwgPT0gcXVhbGl0eSkKKwkJCUlQV19ERUJVR19XWCgiUXVhbGl0eSBjbGFtcGVkIGJ5IFR4IFJldHJpZXNcbiIpOworCQllbHNlIGlmIChxdWFsaXR5ICE9IDEwMCkKKwkJCUlQV19ERUJVR19XWCgiUXVhbGl0eSBjbGFtcGVkIGJ5IFNpZ25hbCBTdHJlbmd0aFxuIik7CisJCWVsc2UKKwkJCUlQV19ERUJVR19XWCgiUXVhbGl0eSBub3QgY2xhbXBlZC5cbiIpOworI2VuZGlmCisKKwkJd3N0YXRzLT5xdWFsLnF1YWwgPSBxdWFsaXR5OworCQl3c3RhdHMtPnF1YWwubGV2ZWwgPSByc3NpICsgSVBXMjEwMF9SU1NJX1RPX0RCTTsKKwl9CisKKwl3c3RhdHMtPnF1YWwubm9pc2UgPSAwOworCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gNzsKKwl3c3RhdHMtPnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7CisKKyAgICAgICAgLyogRklYTUU6IHRoaXMgaXMgcGVyY2VudCBhbmQgbm90IGEgIyAqLworCXdzdGF0cy0+bWlzcy5iZWFjb24gPSBtaXNzZWRfYmVhY29uczsKKworCWlmIChpcHcyMTAwX2dldF9vcmRpbmFsKHByaXYsIElQV19PUkRfU1RBVF9UWF9GQUlMVVJFUywKKwkJCQkmdHhfZmFpbHVyZXMsICZvcmRfbGVuKSkKKwkJZ290byBmYWlsX2dldF9vcmRpbmFsOworCXdzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzID0gdHhfZmFpbHVyZXM7CisKKwlyZXR1cm4gd3N0YXRzOworCisgZmFpbF9nZXRfb3JkaW5hbDoKKwlJUFdfREVCVUdfV1goImZhaWxlZCBxdWVyeWluZyBvcmRpbmFscy5cbiIpOworCisJcmV0dXJuIChzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqKSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpcHcyMTAwX3d4X2V2ZW50X3dvcmsoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJaW50IGxlbiA9IEVUSF9BTEVOOworCisJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19TVE9QUElORykKKwkJcmV0dXJuOworCisJZG93bigmcHJpdi0+YWN0aW9uX3NlbSk7CisKKwlJUFdfREVCVUdfV1goImVudGVyXG4iKTsKKworCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKKworCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwkvKiBGZXRjaCBCU1NJRCBmcm9tIHRoZSBoYXJkd2FyZSAqLworCWlmICghKHByaXYtPnN0YXR1cyAmIChTVEFUVVNfQVNTT0NJQVRJTkcgfCBTVEFUVVNfQVNTT0NJQVRFRCkpIHx8CisJICAgIHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRl9LSUxMX01BU0sgfHwKKwkgICAgaXB3MjEwMF9nZXRfb3JkaW5hbChwcml2LCBJUFdfT1JEX1NUQVRfQVNTTl9BUF9CU1NJRCwKKwkJCQkmcHJpdi0+YnNzaWQsICAmbGVuKSkgeworCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwl9IGVsc2UgeworCQkvKiBXZSBub3cgaGF2ZSB0aGUgQlNTSUQsIHNvIGNhbiBmaW5pc2ggc2V0dGluZyB0byB0aGUgZnVsbAorCQkgKiBhc3NvY2lhdGVkIHN0YXRlICovCisJCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KCZwcml2LT5pZWVlLT5ic3NpZCwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJcHJpdi0+c3RhdHVzICY9IH5TVEFUVVNfQVNTT0NJQVRJTkc7CisJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfQVNTT0NJQVRFRDsKKwkJbmV0aWZfY2Fycmllcl9vbihwcml2LT5uZXRfZGV2KTsKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQocHJpdi0+bmV0X2RldikpIHsKKwkJCUlQV19ERUJVR19JTkZPKCJXYWtpbmcgbmV0IHF1ZXVlLlxuIik7CisJCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPm5ldF9kZXYpOworCQl9IGVsc2UgeworCQkJSVBXX0RFQlVHX0lORk8oIlN0YXJ0aW5nIG5ldCBxdWV1ZS5cbiIpOworCQkJbmV0aWZfc3RhcnRfcXVldWUocHJpdi0+bmV0X2Rldik7CisJCX0KKwl9CisKKwlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkpIHsKKwkJSVBXX0RFQlVHX1dYKCJDb25maWd1cmluZyBFU1NJRFxuIik7CisJCWRvd24oJnByaXYtPmFjdGlvbl9zZW0pOworCQkvKiBUaGlzIGlzIGEgZGlzYXNzb2NpYXRpb24gZXZlbnQsIHNvIGtpY2sgdGhlIGZpcm13YXJlIHRvCisJCSAqIGxvb2sgZm9yIGFub3RoZXIgQVAgKi8KKwkJaWYgKHByaXYtPmNvbmZpZyAmIENGR19TVEFUSUNfRVNTSUQpCisJCQlpcHcyMTAwX3NldF9lc3NpZChwcml2LCBwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfbGVuLCAwKTsKKwkJZWxzZQorCQkJaXB3MjEwMF9zZXRfZXNzaWQocHJpdiwgTlVMTCwgMCwgMCk7CisJCXVwKCZwcml2LT5hY3Rpb25fc2VtKTsKKwl9CisKKwl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworfQorCisjZGVmaW5lIElQVzIxMDBfRldfTUFKT1JfVkVSU0lPTiAxCisjZGVmaW5lIElQVzIxMDBfRldfTUlOT1JfVkVSU0lPTiAzCisKKyNkZWZpbmUgSVBXMjEwMF9GV19NSU5PUih4KSAoKHggJiAweGZmKSA+PiA4KQorI2RlZmluZSBJUFcyMTAwX0ZXX01BSk9SKHgpICh4ICYgMHhmZikKKworI2RlZmluZSBJUFcyMTAwX0ZXX1ZFUlNJT04gKChJUFcyMTAwX0ZXX01JTk9SX1ZFUlNJT04gPDwgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQVzIxMDBfRldfTUFKT1JfVkVSU0lPTikKKworI2RlZmluZSBJUFcyMTAwX0ZXX1BSRUZJWCAiaXB3MjEwMC0iIF9fc3RyaW5naWZ5KElQVzIxMDBfRldfTUFKT1JfVkVSU0lPTikgXAorIi4iIF9fc3RyaW5naWZ5KElQVzIxMDBfRldfTUlOT1JfVkVSU0lPTikKKworI2RlZmluZSBJUFcyMTAwX0ZXX05BTUUoeCkgSVBXMjEwMF9GV19QUkVGSVggIiIgeCAiLmZ3IgorCisKKy8qCisKK0JJTkFSWSBGSVJNV0FSRSBIRUFERVIgRk9STUFUCisKK29mZnNldCAgICAgIGxlbmd0aCAgIGRlc2MKKzAgICAgICAgICAgIDIgICAgICAgIHZlcnNpb24KKzIgICAgICAgICAgIDIgICAgICAgIG1vZGUgPT0gMDpCU1MsMTpJQlNTLDI6TU9OSVRPUgorNCAgICAgICAgICAgNCAgICAgICAgZndfbGVuCis4ICAgICAgICAgICA0ICAgICAgICB1Y19sZW4KK0MgICAgICAgICAgIGZ3X2xlbiAgIGZpcm13YXJlIGRhdGEKKzEyICsgZndfbGVuIHVjX2xlbiAgIG1pY3JvY29kZSBkYXRhCisKKyovCisKK3N0cnVjdCBpcHcyMTAwX2Z3X2hlYWRlciB7CisJc2hvcnQgdmVyc2lvbjsKKwlzaG9ydCBtb2RlOworCXVuc2lnbmVkIGludCBmd19zaXplOworCXVuc2lnbmVkIGludCB1Y19zaXplOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworCitzdGF0aWMgaW50IGlwdzIxMDBfbW9kX2Zpcm13YXJlX2xvYWQoc3RydWN0IGlwdzIxMDBfZncgKmZ3KQoreworCXN0cnVjdCBpcHcyMTAwX2Z3X2hlYWRlciAqaCA9CisJCShzdHJ1Y3QgaXB3MjEwMF9md19oZWFkZXIgKilmdy0+ZndfZW50cnktPmRhdGE7CisKKwlpZiAoSVBXMjEwMF9GV19NQUpPUihoLT52ZXJzaW9uKSAhPSBJUFcyMTAwX0ZXX01BSk9SX1ZFUlNJT04pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiBGaXJtd2FyZSBpbWFnZSBub3QgY29tcGF0aWJsZSAiCisJCSAgICAgICAiKGRldGVjdGVkIHZlcnNpb24gaWQgb2YgJXUpLiAiCisJCSAgICAgICAiU2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9SRUFETUUuaXB3MjEwMFxuIiwKKwkJICAgICAgIGgtPnZlcnNpb24pOworCQlyZXR1cm4gMTsKKwl9CisKKwlmdy0+dmVyc2lvbiA9IGgtPnZlcnNpb247CisJZnctPmZ3LmRhdGEgPSBmdy0+ZndfZW50cnktPmRhdGEgKyBzaXplb2Yoc3RydWN0IGlwdzIxMDBfZndfaGVhZGVyKTsKKwlmdy0+Zncuc2l6ZSA9IGgtPmZ3X3NpemU7CisJZnctPnVjLmRhdGEgPSBmdy0+ZncuZGF0YSArIGgtPmZ3X3NpemU7CisJZnctPnVjLnNpemUgPSBoLT51Y19zaXplOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcHcyMTAwX2dldF9maXJtd2FyZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LAorCQkJCXN0cnVjdCBpcHcyMTAwX2Z3ICpmdykKK3sKKwljaGFyICpmd19uYW1lOworCWludCByYzsKKworCUlQV19ERUJVR19JTkZPKCIlczogVXNpbmcgaG90cGx1ZyBmaXJtd2FyZSBsb2FkLlxuIiwKKwkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSk7CisKKwlzd2l0Y2ggKHByaXYtPmllZWUtPml3X21vZGUpIHsKKwljYXNlIElXX01PREVfQURIT0M6CisJCWZ3X25hbWUgPSBJUFcyMTAwX0ZXX05BTUUoIi1pIik7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19JUFcyMTAwX01PTklUT1IKKwljYXNlIElXX01PREVfTU9OSVRPUjoKKwkJZndfbmFtZSA9IElQVzIxMDBfRldfTkFNRSgiLXAiKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIElXX01PREVfSU5GUkE6CisJZGVmYXVsdDoKKwkJZndfbmFtZSA9IElQVzIxMDBfRldfTkFNRSgiIik7CisJCWJyZWFrOworCX0KKworCXJjID0gcmVxdWVzdF9maXJtd2FyZSgmZnctPmZ3X2VudHJ5LCBmd19uYW1lLCAmcHJpdi0+cGNpX2Rldi0+ZGV2KTsKKworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6ICIKKwkJICAgICAgICIlczogRmlybXdhcmUgJyVzJyBub3QgYXZhaWxhYmxlIG9yIGxvYWQgZmFpbGVkLlxuIiwKKwkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUsIGZ3X25hbWUpOworCQlyZXR1cm4gcmM7CisJfQorCUlQV19ERUJVR19JTkZPKCJmaXJtd2FyZSBkYXRhICVwIHNpemUgJXpkXG4iLCBmdy0+ZndfZW50cnktPmRhdGEsCisJCQkgICBmdy0+ZndfZW50cnktPnNpemUpOworCisJaXB3MjEwMF9tb2RfZmlybXdhcmVfbG9hZChmdyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXB3MjEwMF9yZWxlYXNlX2Zpcm13YXJlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsCisJCQkJICAgICBzdHJ1Y3QgaXB3MjEwMF9mdyAqZncpCit7CisJZnctPnZlcnNpb24gPSAwOworCWlmIChmdy0+ZndfZW50cnkpCisJCXJlbGVhc2VfZmlybXdhcmUoZnctPmZ3X2VudHJ5KTsKKwlmdy0+ZndfZW50cnkgPSBOVUxMOworfQorCisKK3N0YXRpYyBpbnQgaXB3MjEwMF9nZXRfZnd2ZXJzaW9uKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGNoYXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IG1heCkKK3sKKwljaGFyIHZlcltNQVhfRldfVkVSU0lPTl9MRU5dOworCXUzMiBsZW4gPSBNQVhfRldfVkVSU0lPTl9MRU47CisJdTMyIHRtcDsKKwlpbnQgaTsKKwkvKiBmaXJtd2FyZSB2ZXJzaW9uIGlzIGFuIGFzY2lpIHN0cmluZyAobWF4IGxlbiBvZiAxNCkgKi8KKwlpZiAoaXB3MjEwMF9nZXRfb3JkaW5hbChwcml2LCBJUFdfT1JEX1NUQVRfRldfVkVSX05VTSwKKwkJCQl2ZXIsICZsZW4pKQorCQlyZXR1cm4gLUVJTzsKKwl0bXAgPSBtYXg7CisJaWYgKGxlbiA+PSBtYXgpCisJCWxlbiA9IG1heCAtIDE7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlidWZbaV0gPSB2ZXJbaV07CisJYnVmW2ldID0gJ1wwJzsKKwlyZXR1cm4gdG1wOworfQorCitzdGF0aWMgaW50IGlwdzIxMDBfZ2V0X3Vjb2RldmVyc2lvbihzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LCBjaGFyICpidWYsCisJCQkJICAgIHNpemVfdCBtYXgpCit7CisJdTMyIHZlcjsKKwl1MzIgbGVuID0gc2l6ZW9mKHZlcik7CisJLyogbWljcm9jb2RlIHZlcnNpb24gaXMgYSAzMiBiaXQgaW50ZWdlciAqLworCWlmIChpcHcyMTAwX2dldF9vcmRpbmFsKHByaXYsIElQV19PUkRfVUNPREVfVkVSU0lPTiwKKwkJCQkmdmVyLCAmbGVuKSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgbWF4LCAiJTA4WCIsIHZlcik7Cit9CisKKy8qCisgKiBPbiBleGl0LCB0aGUgZmlybXdhcmUgd2lsbCBoYXZlIGJlZW4gZnJlZWQgZnJvbSB0aGUgZncgbGlzdAorICovCitzdGF0aWMgaW50IGlwdzIxMDBfZndfZG93bmxvYWQoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgaXB3MjEwMF9mdyAqZncpCit7CisJLyogZmlybXdhcmUgaXMgY29uc3RydWN0ZWQgb2YgTiBjb250aWd1b3VzIGVudHJpZXMsIGVhY2ggZW50cnkgaXMKKwkgKiBzdHJ1Y3R1cmVkIGFzOgorCSAqCisJICogb2Zmc2V0ICAgIHNpZSAgICAgICAgIGRlc2MKKwkgKiAwICAgICAgICAgNCAgICAgICAgICAgYWRkcmVzcyB0byB3cml0ZSB0bworCSAqIDQgICAgICAgICAyICAgICAgICAgICBsZW5ndGggb2YgZGF0YSBydW4KKyAgICAgICAgICogNiAgICAgICAgIGxlbmd0aCAgICAgIGRhdGEKKwkgKi8KKwl1bnNpZ25lZCBpbnQgYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBsZW47CisKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmaXJtd2FyZV9kYXRhID0gZnctPmZ3LmRhdGE7CisJdW5zaWduZWQgaW50IGZpcm13YXJlX2RhdGFfbGVmdCA9IGZ3LT5mdy5zaXplOworCisJd2hpbGUgKGZpcm13YXJlX2RhdGFfbGVmdCA+IDApIHsKKwkgICAJYWRkciA9ICoodTMyICopKGZpcm13YXJlX2RhdGEpOworCQlmaXJtd2FyZV9kYXRhICAgICAgKz0gNDsKKwkJZmlybXdhcmVfZGF0YV9sZWZ0IC09IDQ7CisKKwkgICAJbGVuID0gKih1MTYgKikoZmlybXdhcmVfZGF0YSk7CisJCWZpcm13YXJlX2RhdGEgICAgICArPSAyOworCQlmaXJtd2FyZV9kYXRhX2xlZnQgLT0gMjsKKworCQlpZiAobGVuID4gMzIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAiCisJCQkgICAgICAgIkludmFsaWQgZmlybXdhcmUgcnVuLWxlbmd0aCBvZiAlZCBieXRlc1xuIiwKKwkJCSAgICAgICBsZW4pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQl3cml0ZV9uaWNfbWVtb3J5KHByaXYtPm5ldF9kZXYsIGFkZHIsIGxlbiwgZmlybXdhcmVfZGF0YSk7CisJCWZpcm13YXJlX2RhdGEgICAgICArPSBsZW47CisJCWZpcm13YXJlX2RhdGFfbGVmdCAtPSBsZW47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzeW1ib2xfYWxpdmVfcmVzcG9uc2UgeworCXU4IGNtZF9pZDsKKwl1OCBzZXFfbnVtOworCXU4IHVjb2RlX3JldjsKKwl1OCBlZXByb21fdmFsaWQ7CisJdTE2IHZhbGlkX2ZsYWdzOworCXU4IElFRUVfYWRkcls2XTsKKwl1MTYgZmxhZ3M7CisJdTE2IHBjYl9yZXY7CisJdTE2IGNsb2NrX3NldHRsZV90aW1lOwkvLyAxdXMgTFNCCisJdTE2IHBvd2VydXBfc2V0dGxlX3RpbWU7CS8vIDF1cyBMU0IKKwl1MTYgaG9wX3NldHRsZV90aW1lOwkvLyAxdXMgTFNCCisJdTggZGF0ZVszXTsJCS8vIG1vbnRoLCBkYXksIHllYXIKKwl1OCB0aW1lWzJdOwkJLy8gaG91cnMsIG1pbnV0ZXMKKwl1OCB1Y29kZV92YWxpZDsKK307CisKK3N0YXRpYyBpbnQgaXB3MjEwMF91Y29kZV9kb3dubG9hZChzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LAorCQkJCSAgc3RydWN0IGlwdzIxMDBfZncgKmZ3KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5uZXRfZGV2OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm1pY3JvY29kZV9kYXRhID0gZnctPnVjLmRhdGE7CisJdW5zaWduZWQgaW50IG1pY3JvY29kZV9kYXRhX2xlZnQgPSBmdy0+dWMuc2l6ZTsKKwl2b2lkIF9faW9tZW0gKnJlZyA9ICh2b2lkIF9faW9tZW0gKilkZXYtPmJhc2VfYWRkcjsKKworCXN0cnVjdCBzeW1ib2xfYWxpdmVfcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IGksIGo7CisJdTggZGF0YTsKKworCS8qIFN5bWJvbCBjb250cm9sICovCisJd3JpdGVfbmljX3dvcmQoZGV2LCBJUFcyMTAwX0NPTlRST0xfUkVHLCAweDcwMyk7CisJcmVhZGwocmVnKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIElQVzIxMDBfQ09OVFJPTF9SRUcsIDB4NzA3KTsKKwlyZWFkbChyZWcpOworCisJLyogSFcgY29uZmlnICovCisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDIxMDAxNCwgMHg3Mik7CS8qIGZpZm8gd2lkdGggPTE2ICovCisJcmVhZGwocmVnKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjEwMDE0LCAweDcyKTsJLyogZmlmbyB3aWR0aCA9MTYgKi8KKwlyZWFkbChyZWcpOworCisJLyogRU5fQ1NfQUNDRVNTIGJpdCB0byByZXNldCBjb250cm9sIHN0b3JlIHBvaW50ZXIgKi8KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjEwMDAwLCAweDQwKTsKKwlyZWFkbChyZWcpOworCXdyaXRlX25pY19ieXRlKGRldiwgMHgyMTAwMDAsIDB4MCk7CisJcmVhZGwocmVnKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjEwMDAwLCAweDQwKTsKKwlyZWFkbChyZWcpOworCisJLyogY29weSBtaWNyb2NvZGUgZnJvbSBidWZmZXIgaW50byBTeW1ib2wgKi8KKworCXdoaWxlIChtaWNyb2NvZGVfZGF0YV9sZWZ0ID4gMCkgeworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjEwMDEwLCAqbWljcm9jb2RlX2RhdGErKyk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgMHgyMTAwMTAsICptaWNyb2NvZGVfZGF0YSsrKTsKKwkJbWljcm9jb2RlX2RhdGFfbGVmdCAtPSAyOworCX0KKworCS8qIEVOX0NTX0FDQ0VTUyBiaXQgdG8gcmVzZXQgdGhlIGNvbnRyb2wgc3RvcmUgcG9pbnRlciAqLworCXdyaXRlX25pY19ieXRlKGRldiwgMHgyMTAwMDAsIDB4MCk7CisJcmVhZGwocmVnKTsKKworCS8qIEVuYWJsZSBTeXN0ZW0gKFJlZyAwKQorCSAqIGZpcnN0IGVuYWJsZSBjYXVzZXMgZ2FyYmFnZSBpbiBSWCBGSUZPICovCisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDIxMDAwMCwgMHgwKTsKKwlyZWFkbChyZWcpOworCXdyaXRlX25pY19ieXRlKGRldiwgMHgyMTAwMDAsIDB4ODApOworCXJlYWRsKHJlZyk7CisKKwkvKiBSZXNldCBFeHRlcm5hbCBCYXNlYmFuZCBSZWcgKi8KKwl3cml0ZV9uaWNfd29yZChkZXYsIElQVzIxMDBfQ09OVFJPTF9SRUcsIDB4NzAzKTsKKwlyZWFkbChyZWcpOworCXdyaXRlX25pY193b3JkKGRldiwgSVBXMjEwMF9DT05UUk9MX1JFRywgMHg3MDcpOworCXJlYWRsKHJlZyk7CisKKwkvKiBIVyBDb25maWcgKFJlZyA1KSAqLworCXdyaXRlX25pY19ieXRlKGRldiwgMHgyMTAwMTQsIDB4NzIpOwkvLyBmaWZvIHdpZHRoID0xNgorCXJlYWRsKHJlZyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDIxMDAxNCwgMHg3Mik7CS8vIGZpZm8gd2lkdGggPTE2CisJcmVhZGwocmVnKTsKKworCS8qIEVuYWJsZSBTeXN0ZW0gKFJlZyAwKQorCSAqIHNlY29uZCBlbmFibGUgc2hvdWxkIGJlIE9LICovCisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDIxMDAwMCwgMHgwMCk7CS8vIGNsZWFyIGVuYWJsZSBzeXN0ZW0KKwlyZWFkbChyZWcpOworCXdyaXRlX25pY19ieXRlKGRldiwgMHgyMTAwMDAsIDB4ODApOwkvLyBzZXQgZW5hYmxlIHN5c3RlbQorCisJLyogY2hlY2sgU3ltYm9sIGlzIGVuYWJsZWQgLSB1cHBlZCB0aGlzIGZyb20gNSBhcyBpdCB3YXNuJ3QgYWx3YXlzCisJICogY2F0Y2hpbmcgdGhlIHVwZGF0ZSAqLworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCXVkZWxheSgxMCk7CisKKwkJLyogY2hlY2sgRGlubyBpcyBlbmFibGVkIGJpdCAqLworCQlyZWFkX25pY19ieXRlKGRldiwgMHgyMTAwMDAsICZkYXRhKTsKKwkJaWYgKGRhdGEgJiAweDEpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSAxMCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXM6IEVycm9yIGluaXRpYWxpemluZyBTeW1ib2xcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBHZXQgU3ltYm9sIGFsaXZlIHJlc3BvbnNlICovCisJZm9yIChpID0gMDsgaSA8IDMwOyBpKyspIHsKKwkJLyogUmVhZCBhbGl2ZSByZXNwb25zZSBzdHJ1Y3R1cmUgKi8KKwkJZm9yIChqID0gMDsKKwkJICAgICBqIDwgKHNpemVvZihzdHJ1Y3Qgc3ltYm9sX2FsaXZlX3Jlc3BvbnNlKSA+PiAxKTsKKwkJICAgICBqKyspCisJCQlyZWFkX25pY193b3JkKGRldiwgMHgyMTAwMDQsCisJCQkJICAgICAgKCh1MTYgKikmcmVzcG9uc2UpICsgaik7CisKKwkJaWYgKChyZXNwb25zZS5jbWRfaWQgPT0gMSkgJiYKKwkJICAgIChyZXNwb25zZS51Y29kZV92YWxpZCA9PSAweDEpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJaWYgKGkgPT0gMzApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6ICVzOiBObyByZXNwb25zZSBmcm9tIFN5bWJvbCAtIGh3IG5vdCBhbGl2ZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXByaW50a19idWYoSVBXX0RMX0VSUk9SLCAodTgqKSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhM2NkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmgKQEAgLTAsMCArMSwxMTY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgSmFtZXMgUC4gS2V0cmVub3MgPGlwdzIxMDAtYWRtaW5AbGludXguaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX0lQVzIxMDBfSAorI2RlZmluZSBfSVBXMjEwMF9ICisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLy8gbmV3IGRyaXZlciBBUEkKKworI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCitzdHJ1Y3QgaXB3MjEwMF9wcml2Oworc3RydWN0IGlwdzIxMDBfdHhfcGFja2V0Oworc3RydWN0IGlwdzIxMDBfcnhfcGFja2V0OworCisjZGVmaW5lIElQV19ETF9VTklOSVQgICAgMHg4MDAwMDAwMAorI2RlZmluZSBJUFdfRExfTk9ORSAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSVBXX0RMX0FMTCAgICAgICAweDdGRkZGRkZGCisKKy8qCisgKiBUbyB1c2UgdGhlIGRlYnVnIHN5c3RlbTsKKyAqCisgKiBJZiB5b3UgYXJlIGRlZmluaW5nIGEgbmV3IGRlYnVnIGNsYXNzaWZpY2F0aW9uLCBzaW1wbHkgYWRkIGl0IHRvIHRoZSAjZGVmaW5lCisgKiBsaXN0IGhlcmUgaW4gdGhlIGZvcm0gb2Y6CisgKgorICogI2RlZmluZSBJUFdfRExfeHh4eCBWQUxVRQorICoKKyAqIHNoaWZ0aW5nIHZhbHVlIHRvIHRoZSBsZWZ0IG9uZSBiaXQgZnJvbSB0aGUgcHJldmlvdXMgZW50cnkuICB4eHh4IHNob3VsZCBiZQorICogdGhlIG5hbWUgb2YgdGhlIGNsYXNzaWZpY2F0aW9uIChmb3IgZXhhbXBsZSwgV0VQKQorICoKKyAqIFlvdSB0aGVuIG5lZWQgdG8gZWl0aGVyIGFkZCBhIElQVzIxMDBfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSVBXX0RFQlVHKElQV19ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50CisgKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KKyAqCisgKiAlIGNhdCAvcHJvYy9uZXQvaXB3MjEwMC9kZWJ1Z19sZXZlbAorICoKKyAqIHlvdSBzaW1wbHkgbmVlZCB0byBhZGQgeW91ciBlbnRyeSB0byB0aGUgaXB3MjEwMF9kZWJ1Z19sZXZlbHMgYXJyYXkuCisgKgorICogSWYgeW91IGRvIG5vdCBzZWUgZGVidWdfbGV2ZWwgaW4gL3Byb2MvbmV0L2lwdzIxMDAgdGhlbiB5b3UgZG8gbm90IGhhdmUKKyAqIENPTkZJR19JUFdfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCisgKgorICovCisKKyNkZWZpbmUgSVBXX0RMX0VSUk9SICAgICAgICAgKDE8PDApCisjZGVmaW5lIElQV19ETF9XQVJOSU5HICAgICAgICgxPDwxKQorI2RlZmluZSBJUFdfRExfSU5GTyAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSVBXX0RMX1dYICAgICAgICAgICAgKDE8PDMpCisjZGVmaW5lIElQV19ETF9IQyAgICAgICAgICAgICgxPDw1KQorI2RlZmluZSBJUFdfRExfU1RBVEUgICAgICAgICAoMTw8NikKKworI2RlZmluZSBJUFdfRExfTk9USUYgICAgICAgICAoMTw8MTApCisjZGVmaW5lIElQV19ETF9TQ0FOICAgICAgICAgICgxPDwxMSkKKyNkZWZpbmUgSVBXX0RMX0FTU09DICAgICAgICAgKDE8PDEyKQorI2RlZmluZSBJUFdfRExfRFJPUCAgICAgICAgICAoMTw8MTMpCisKKyNkZWZpbmUgSVBXX0RMX0lPQ1RMICAgICAgICAgKDE8PDE0KQorI2RlZmluZSBJUFdfRExfUkZfS0lMTCAgICAgICAoMTw8MTcpCisKKworI2RlZmluZSBJUFdfRExfTUFOQUdFICAgICAgICAoMTw8MTUpCisjZGVmaW5lIElQV19ETF9GVyAgICAgICAgICAgICgxPDwxNikKKworI2RlZmluZSBJUFdfRExfRlJBRyAgICAgICAgICAoMTw8MjEpCisjZGVmaW5lIElQV19ETF9XRVAgICAgICAgICAgICgxPDwyMikKKyNkZWZpbmUgSVBXX0RMX1RYICAgICAgICAgICAgKDE8PDIzKQorI2RlZmluZSBJUFdfRExfUlggICAgICAgICAgICAoMTw8MjQpCisjZGVmaW5lIElQV19ETF9JU1IgICAgICAgICAgICgxPDwyNSkKKyNkZWZpbmUgSVBXX0RMX0lPICAgICAgICAgICAgKDE8PDI2KQorI2RlZmluZSBJUFdfRExfVFJBQ0UgICAgICAgICAoMTw8MjgpCisKKyNkZWZpbmUgSVBXX0RFQlVHX0VSUk9SKGYsIGEuLi4pIHByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAiIGYsICMjIGEpCisjZGVmaW5lIElQV19ERUJVR19XQVJOSU5HKGYsIGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogIiBmLCAjIyBhKQorI2RlZmluZSBJUFdfREVCVUdfSU5GTyhmLi4uKSAgICBJUFdfREVCVUcoSVBXX0RMX0lORk8sICMjIGYpCisjZGVmaW5lIElQV19ERUJVR19XWChmLi4uKSAgICAgSVBXX0RFQlVHKElQV19ETF9XWCwgIyMgZikKKyNkZWZpbmUgSVBXX0RFQlVHX1NDQU4oZi4uLikgICBJUFdfREVCVUcoSVBXX0RMX1NDQU4sICMjIGYpCisjZGVmaW5lIElQV19ERUJVR19OT1RJRihmLi4uKSBJUFdfREVCVUcoSVBXX0RMX05PVElGLCAjIyBmKQorI2RlZmluZSBJUFdfREVCVUdfVFJBQ0UoZi4uLikgIElQV19ERUJVRyhJUFdfRExfVFJBQ0UsICMjIGYpCisjZGVmaW5lIElQV19ERUJVR19SWChmLi4uKSAgICAgSVBXX0RFQlVHKElQV19ETF9SWCwgIyMgZikKKyNkZWZpbmUgSVBXX0RFQlVHX1RYKGYuLi4pICAgICBJUFdfREVCVUcoSVBXX0RMX1RYLCAjIyBmKQorI2RlZmluZSBJUFdfREVCVUdfSVNSKGYuLi4pICAgIElQV19ERUJVRyhJUFdfRExfSVNSLCAjIyBmKQorI2RlZmluZSBJUFdfREVCVUdfTUFOQUdFTUVOVChmLi4uKSBJUFdfREVCVUcoSVBXX0RMX01BTkFHRSwgIyMgZikKKyNkZWZpbmUgSVBXX0RFQlVHX1dFUChmLi4uKSAgICBJUFdfREVCVUcoSVBXX0RMX1dFUCwgIyMgZikKKyNkZWZpbmUgSVBXX0RFQlVHX0hDKGYuLi4pIElQV19ERUJVRyhJUFdfRExfSEMsICMjIGYpCisjZGVmaW5lIElQV19ERUJVR19GUkFHKGYuLi4pIElQV19ERUJVRyhJUFdfRExfRlJBRywgIyMgZikKKyNkZWZpbmUgSVBXX0RFQlVHX0ZXKGYuLi4pIElQV19ERUJVRyhJUFdfRExfRlcsICMjIGYpCisjZGVmaW5lIElQV19ERUJVR19SRl9LSUxMKGYuLi4pIElQV19ERUJVRyhJUFdfRExfUkZfS0lMTCwgIyMgZikKKyNkZWZpbmUgSVBXX0RFQlVHX0RST1AoZi4uLikgSVBXX0RFQlVHKElQV19ETF9EUk9QLCAjIyBmKQorI2RlZmluZSBJUFdfREVCVUdfSU8oZi4uLikgSVBXX0RFQlVHKElQV19ETF9JTywgIyMgZikKKyNkZWZpbmUgSVBXX0RFQlVHX0lPQ1RMKGYuLi4pIElQV19ERUJVRyhJUFdfRExfSU9DVEwsICMjIGYpCisjZGVmaW5lIElQV19ERUJVR19TVEFURShmLCBhLi4uKSBJUFdfREVCVUcoSVBXX0RMX1NUQVRFIHwgSVBXX0RMX0FTU09DIHwgSVBXX0RMX0lORk8sIGYsICMjIGEpCisjZGVmaW5lIElQV19ERUJVR19BU1NPQyhmLCBhLi4uKSBJUFdfREVCVUcoSVBXX0RMX0FTU09DIHwgSVBXX0RMX0lORk8sIGYsICMjIGEpCisKK2VudW0geworCUlQV19IV19TVEFURV9ESVNBQkxFRCA9IDEsCisJSVBXX0hXX1NUQVRFX0VOQUJMRUQgPSAwCit9OworCitzdHJ1Y3Qgc3NpZF9jb250ZXh0IHsKKwljaGFyIHNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKwlpbnQgc3NpZF9sZW47CisJdW5zaWduZWQgY2hhciBic3NpZFtFVEhfQUxFTl07CisJaW50IHBvcnRfdHlwZTsKKwlpbnQgY2hhbm5lbDsKKworfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnBvcnRfdHlwZV9zdHJbXTsKK2V4dGVybiBjb25zdCBjaGFyICpiYW5kX3N0cltdOworCisjZGVmaW5lIE5VTUJFUl9PRl9CRF9QRVJfQ09NTUFORF9QQUNLRVQJCTEKKyNkZWZpbmUgTlVNQkVSX09GX0JEX1BFUl9EQVRBX1BBQ0tFVAkJMgorCisjZGVmaW5lIElQV19NQVhfQkRTIDYKKyNkZWZpbmUgTlVNQkVSX09GX09WRVJIRUFEX0JEU19QRVJfUEFDS0VUUgkyCisjZGVmaW5lIE5VTUJFUl9PRl9CRFNfVE9fTEVBVkVfRk9SX0NPTU1BTkRTCTEKKworI2RlZmluZSBSRVFVSVJFRF9TUEFDRV9JTl9SSU5HX0ZPUl9DT01NQU5EX1BBQ0tFVCBcCisgICAgKElQV19CRF9RVUVVRV9XX1JfTUlOX1NQQVJFICsgTlVNQkVSX09GX0JEX1BFUl9DT01NQU5EX1BBQ0tFVCkKKworc3RydWN0IGJkX3N0YXR1cyB7CisJdW5pb24geworCQlzdHJ1Y3QgeyB1OCBubGY6MSwgdHhUeXBlOjIsIGludEVuYWJsZWQ6MSwgcmVzZXJ2ZWQ6NDt9IGZpZWxkczsKKwkJdTggZmllbGQ7CisJfSBpbmZvOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpcHcyMTAwX2JkIHsKKwl1MzIgaG9zdF9hZGRyOworCXUzMiBidWZfbGVuZ3RoOworCXN0cnVjdCBiZF9zdGF0dXMgc3RhdHVzOworICAgICAgICAvKiBudW1iZXIgb2YgZnJhZ21lbnRzIGZvciBmcmFtZSAoc2hvdWxkIGJlIHNldCBvbmx5IGZvcgorCSAqIDFzdCBUQkQpICovCisJdTggbnVtX2ZyYWdtZW50czsKKwl1OCByZXNlcnZlZFs2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIElQV19CRF9RVUVVRV9MRU5HVEgobikgKDE8PG4pCisjZGVmaW5lIElQV19CRF9BTElHTk1FTlQoTCkgICAgKEwqc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX2JkKSkKKworI2RlZmluZSBJUFdfQkRfU1RBVFVTX1RYX0ZSQU1FXzgwMl8zICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgSVBXX0JEX1NUQVRVU19UWF9GUkFNRV9OT1RfTEFTVF9GUkFHTUVOVCAweDAxCisjZGVmaW5lIElQV19CRF9TVEFUVVNfVFhfRlJBTUVfQ09NTUFORAkJIDB4MDIKKyNkZWZpbmUgSVBXX0JEX1NUQVRVU19UWF9GUkFNRV84MDJfMTEJICAgICAgICAgMHgwNAorI2RlZmluZSBJUFdfQkRfU1RBVFVTX1RYX0lOVEVSUlVQVF9FTkFCTEUJIDB4MDgKKworc3RydWN0IGlwdzIxMDBfYmRfcXVldWUgeworCS8qIGRyaXZlciAodmlydHVhbCkgcG9pbnRlciB0byBxdWV1ZSAqLworCXN0cnVjdCBpcHcyMTAwX2JkICpkcnY7CisKKwkvKiBmaXJtd2FyZSAocGh5c2ljYWwpIHBvaW50ZXIgdG8gcXVldWUgKi8KKwlkbWFfYWRkcl90IG5pYzsKKworCS8qIExlbmd0aCBvZiBwaHkgbWVtb3J5IGFsbG9jYXRlZCBmb3IgQkRzICovCisJdTMyIHNpemU7CisKKwkvKiBOdW1iZXIgb2YgQkRzIGluIHF1ZXVlIChhbmQgaW4gYXJyYXkpICovCisJdTMyIGVudHJpZXM7CisKKwkvKiBOdW1iZXIgb2YgYXZhaWxhYmxlIEJEcyAoaW52YWxpZCBmb3IgTklDIEJEcykgKi8KKwl1MzIgYXZhaWxhYmxlOworCisJLyogT2Zmc2V0IG9mIG9sZGVzdCB1c2VkIEJEIGluIGFycmF5IChuZXh0IG9uZSB0bworCSAqIGNoZWNrIGZvciBjb21wbGV0aW9uKSAqLworCXUzMiBvbGRlc3Q7CisKKwkvKiBPZmZzZXQgb2YgbmV4dCBhdmFpbGFibGUgKHVudXNlZCkgQkQgKi8KKwl1MzIgbmV4dDsKK307CisKKyNkZWZpbmUgUlhfUVVFVUVfTEVOR1RIIDI1NgorI2RlZmluZSBUWF9RVUVVRV9MRU5HVEggMjU2CisjZGVmaW5lIEhXX1FVRVVFX0xFTkdUSCAyNTYKKworI2RlZmluZSBUWF9QRU5ERURfUVVFVUVfTEVOR1RIIChUWF9RVUVVRV9MRU5HVEggLyBOVU1CRVJfT0ZfQkRfUEVSX0RBVEFfUEFDS0VUKQorCisjZGVmaW5lIFNUQVRVU19UWVBFX01BU0sJMHgwMDAwMDAwZgorI2RlZmluZSBDT01NQU5EX1NUQVRVU19WQUwJMAorI2RlZmluZSBTVEFUVVNfQ0hBTkdFX1ZBTAkxCisjZGVmaW5lIFA4MDIxMV9EQVRBX1ZBTCAJMgorI2RlZmluZSBQODAyM19EQVRBX1ZBTAkJMworI2RlZmluZSBIT1NUX05PVElGSUNBVElPTl9WQUwJNAorCisjZGVmaW5lIElQVzIxMDBfUlNTSV9UT19EQk0gKC05OCkKKworc3RydWN0IGlwdzIxMDBfc3RhdHVzIHsKKwl1MzIgZnJhbWVfc2l6ZTsKKwl1MTYgc3RhdHVzX2ZpZWxkczsKKwl1OCBmbGFnczsKKyNkZWZpbmUgSVBXX1NUQVRVU19GTEFHX0RFQ1JZUFRFRAkoMTw8MCkKKyNkZWZpbmUgSVBXX1NUQVRVU19GTEFHX1dFUF9FTkNSWVBURUQJKDE8PDEpCisjZGVmaW5lIElQV19TVEFUVVNfRkxBR19DUkNfRVJST1IgICAgICAgKDE8PDIpCisJdTggcnNzaTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXB3MjEwMF9zdGF0dXNfcXVldWUgeworCS8qIGRyaXZlciAodmlydHVhbCkgcG9pbnRlciB0byBxdWV1ZSAqLworCXN0cnVjdCBpcHcyMTAwX3N0YXR1cyAqZHJ2OworCisJLyogZmlybXdhcmUgKHBoeXNpY2FsKSBwb2ludGVyIHRvIHF1ZXVlICovCisJZG1hX2FkZHJfdCBuaWM7CisKKwkvKiBMZW5ndGggb2YgcGh5IG1lbW9yeSBhbGxvY2F0ZWQgZm9yIEJEcyAqLworCXUzMiBzaXplOworfTsKKworI2RlZmluZSBIT1NUX0NPTU1BTkRfUEFSQU1TX1JFR19MRU4JMTAwCisjZGVmaW5lIENNRF9TVEFUVVNfUEFSQU1TX1JFR19MRU4gCTMKKworI2RlZmluZSBJUFdfV1BBX0NBUEFCSUxJVElFUyAgIDB4MQorI2RlZmluZSBJUFdfV1BBX0xJU1RFTklOVEVSVkFMIDB4MgorI2RlZmluZSBJUFdfV1BBX0FQX0FERFJFU1MgICAgIDB4NAorCisjZGVmaW5lIElQV19NQVhfVkFSX0lFX0xFTiAoKEhPU1RfQ09NTUFORF9QQVJBTVNfUkVHX0xFTiAtIDQpICogc2l6ZW9mKHUzMikpCisKK3N0cnVjdCBpcHcyMTAwX3dwYV9hc3NvY19mcmFtZSB7CisJdTE2IGZpeGVkX2llX21hc2s7CisJc3RydWN0IHsKKwkJdTE2IGNhcGFiX2luZm87CisJCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJCXU4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOworCX0gZml4ZWRfaWVzOworCXUzMiB2YXJfaWVfbGVuOworCXU4IHZhcl9pZVtJUFdfTUFYX1ZBUl9JRV9MRU5dOworfTsKKworI2RlZmluZSBJUFdfQlNTICAgICAxCisjZGVmaW5lIElQV19NT05JVE9SIDIKKyNkZWZpbmUgSVBXX0lCU1MgICAgMworCisvKioKKyAqIEBzdHJ1Y3QgX3R4X2NtZCAtIEhXQ29tbWFuZAorICogQGJyaWVmIEgvVyBjb21tYW5kIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGlwdzIxMDBfY21kX2hlYWRlciB7CisJdTMyIGhvc3RfY29tbWFuZF9yZWc7CisJdTMyIGhvc3RfY29tbWFuZF9yZWcxOworCXUzMiBzZXF1ZW5jZTsKKwl1MzIgaG9zdF9jb21tYW5kX2xlbl9yZWc7CisJdTMyIGhvc3RfY29tbWFuZF9wYXJhbXNfcmVnW0hPU1RfQ09NTUFORF9QQVJBTVNfUkVHX0xFTl07CisJdTMyIGNtZF9zdGF0dXNfcmVnOworCXUzMiBjbWRfc3RhdHVzX3BhcmFtc19yZWdbQ01EX1NUQVRVU19QQVJBTVNfUkVHX0xFTl07CisJdTMyIHJ4cV9iYXNlX3B0cjsKKwl1MzIgcnhxX25leHRfcHRyOworCXUzMiByeHFfaG9zdF9wdHI7CisJdTMyIHR4cV9iYXNlX3B0cjsKKwl1MzIgdHhxX25leHRfcHRyOworCXUzMiB0eHFfaG9zdF9wdHI7CisJdTMyIHR4X3N0YXR1c19yZWc7CisJdTMyIHJlc2VydmVkOworCXUzMiBzdGF0dXNfY2hhbmdlX3JlZzsKKwl1MzIgcmVzZXJ2ZWQxWzNdOworCXUzMiAqb3JkaW5hbDFfcHRyOworCXUzMiAqb3JkaW5hbDJfcHRyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpcHcyMTAwX2RhdGFfaGVhZGVyIHsKKwl1MzIgaG9zdF9jb21tYW5kX3JlZzsKKwl1MzIgaG9zdF9jb21tYW5kX3JlZzE7CisJdTggZW5jcnlwdGVkOwkvLyBCT09MRUFOIGluIHdpbiEgVFJVRSBpZiBmcmFtZSBpcyBlbmMgYnkgZHJpdmVyCisJdTggbmVlZHNfZW5jcnlwdGlvbjsJLy8gQk9PTEVBTiBpbiB3aW4hIFRSVUUgaWYgZnJtYSBuZWVkIHRvIGJlIGVuYyBpbiBOSUMKKwl1OCB3ZXBfaW5kZXg7CQkvLyAwIG5vIGtleSwgMS00IGtleSBpbmRleCwgMHhmZiBpbW1lZGlhdGUga2V5CisJdTgga2V5X3NpemU7CS8vIDAgbm8gaW1tIGtleSwgMHg1IDY0Yml0IGVuY3IsIDB4ZCAxMjhiaXQgZW5jciwgMHgxMCAxMjhiaXQgZW5jciBhbmQgMTI4Yml0IElWCisJdTgga2V5WzE2XTsKKwl1OCByZXNlcnZlZFsxMF07CS8vIGYvdyByZXNlcnZlZAorCXU4IHNyY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBkc3RfYWRkcltFVEhfQUxFTl07CisJdTE2IGZyYWdtZW50X3NpemU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogSG9zdCBjb21tYW5kIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgaG9zdF9jb21tYW5kIHsKKwl1MzIgaG9zdF9jb21tYW5kOwkJLy8gQ09NTUFORCBJRAorCXUzMiBob3N0X2NvbW1hbmQxOwkJLy8gQ09NTUFORCBJRAorCXUzMiBob3N0X2NvbW1hbmRfc2VxdWVuY2U7CS8vIFVOSVFVRSBDT01NQU5EIE5VTUJFUiAoSUQpCisJdTMyIGhvc3RfY29tbWFuZF9sZW5ndGg7CS8vIExFTkdUSAorCXUzMiBob3N0X2NvbW1hbmRfcGFyYW1ldGVyc1tIT1NUX0NPTU1BTkRfUEFSQU1TX1JFR19MRU5dOwkvLyBDT01NQU5EIFBBUkFNRVRFUlMKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKK3R5cGVkZWYgZW51bSB7CisJUE9XRVJfT05fUkVTRVQsCisJRVhJVF9QT1dFUl9ET1dOX1JFU0VULAorCVNXX1JFU0VULAorCUVFUFJPTV9SVywKKwlTV19SRV9JTklUCit9IGlwdzIxMDBfcmVzZXRfZXZlbnQ7CisKK2VudW0geworCUNPTU1BTkQgPSAweENBRkUsCisJREFUQSwKKwlSWAorfTsKKworCitzdHJ1Y3QgaXB3MjEwMF90eF9wYWNrZXQgeworCWludCB0eXBlOworCWludCBpbmRleDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7IC8qIENPTU1BTkQgKi8KKwkJCXN0cnVjdCBpcHcyMTAwX2NtZF9oZWFkZXIqIGNtZDsKKwkJCWRtYV9hZGRyX3QgY21kX3BoeXM7CisJCX0gY19zdHJ1Y3Q7CisJCXN0cnVjdCB7IC8qIERBVEEgKi8KKwkJCXN0cnVjdCBpcHcyMTAwX2RhdGFfaGVhZGVyKiBkYXRhOworCQkJZG1hX2FkZHJfdCBkYXRhX3BoeXM7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiOworCQl9IGRfc3RydWN0OworCX0gaW5mbzsKKwlpbnQgamlmZnlfc3RhcnQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisKK3N0cnVjdCBpcHcyMTAwX3J4X3BhY2tldCB7CisJc3RydWN0IGlwdzIxMDBfcnggKnJ4cDsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCWludCBqaWZmeV9zdGFydDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKyNkZWZpbmUgRlJBR19ESVNBQkxFRCAgICAgICAgICAgICAoMTw8MzEpCisjZGVmaW5lIFJUU19ESVNBQkxFRCAgICAgICAgICAgICAgKDE8PDMxKQorI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAgICAgICAgIDIzMDRVCisjZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEICAgICAgICAgMVUKKyNkZWZpbmUgREVGQVVMVF9SVFNfVEhSRVNIT0xEICAgICAxMDAwVQorCisjZGVmaW5lIERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMICAgMTAwVQorI2RlZmluZQlERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUIDdVCisjZGVmaW5lCURFRkFVTFRfTE9OR19SRVRSWV9MSU1JVCAgNFUKKworc3RydWN0IGlwdzIxMDBfb3JkaW5hbHMgeworCXUzMiB0YWJsZTFfYWRkcjsKKwl1MzIgdGFibGUyX2FkZHI7CisJdTMyIHRhYmxlMV9zaXplOworCXUzMiB0YWJsZTJfc2l6ZTsKK307CisKKy8qIEhvc3QgTm90aWZpY2F0aW9uIGhlYWRlciAqLworc3RydWN0IGlwdzIxMDBfbm90aWZpY2F0aW9uIHsKKwl1MzIgaG5oZHJfc3VidHlwZTsJLyogdHlwZSBvZiBob3N0IG5vdGlmaWNhdGlvbiAqLworCXUzMiBobmhkcl9zaXplOwkJLyogc2l6ZSBpbiBieXRlcyBvZiBkYXRhCisJCQkJICAgb3IgbnVtYmVyIG9mIGVudHJpZXMsIGlmIHRhYmxlLgorCQkJCSAgIERvZXMgTk9UIGluY2x1ZGUgaGVhZGVyICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBNQVhfS0VZX1NJWkUJMTYKKyNkZWZpbmUJTUFYX0tFWVMJOAorCisjZGVmaW5lIElQVzIxMDBfV0VQX0VOQUJMRSAgICAgKDE8PDEpCisjZGVmaW5lIElQVzIxMDBfV0VQX0RST1BfQ0xFQVIgKDE8PDIpCisKKyNkZWZpbmUgSVBXX05PTkVfQ0lQSEVSICAgKDE8PDApCisjZGVmaW5lIElQV19XRVA0MF9DSVBIRVIgICgxPDwxKQorI2RlZmluZSBJUFdfVEtJUF9DSVBIRVIgICAoMTw8MikKKyNkZWZpbmUgSVBXX0NDTVBfQ0lQSEVSICAgKDE8PDQpCisjZGVmaW5lIElQV19XRVAxMDRfQ0lQSEVSICgxPDw1KQorI2RlZmluZSBJUFdfQ0tJUF9DSVBIRVIgICAoMTw8NikKKworI2RlZmluZQlJUFdfQVVUSF9PUEVOICAgICAwCisjZGVmaW5lCUlQV19BVVRIX1NIQVJFRCAgIDEKKworc3RydWN0IHN0YXRpc3RpYyB7CisJaW50IHZhbHVlOworCWludCBoaTsKKwlpbnQgbG87Cit9OworCisjZGVmaW5lIElOSVRfU1RBVCh4KSBkbyB7ICBcCisgICh4KS0+dmFsdWUgPSAoeCktPmhpID0gMDsgXAorICAoeCktPmxvID0gMHg3ZmZmZmZmZjsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU0VUX1NUQVQoeCx5KSBkbyB7IFwKKyAgKHgpLT52YWx1ZSA9IHk7IFwKKyAgaWYgKCh4KS0+dmFsdWUgPiAoeCktPmhpKSAoeCktPmhpID0gKHgpLT52YWx1ZTsgXAorICBpZiAoKHgpLT52YWx1ZSA8ICh4KS0+bG8pICh4KS0+bG8gPSAoeCktPnZhbHVlOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTkNfU1RBVCh4KSBkbyB7IGlmICgrKyh4KS0+dmFsdWUgPiAoeCktPmhpKSAoeCktPmhpID0gKHgpLT52YWx1ZTsgfSBcCit3aGlsZSAoMCkKKyNkZWZpbmUgREVDX1NUQVQoeCkgZG8geyBpZiAoLS0oeCktPnZhbHVlIDwgKHgpLT5sbykgKHgpLT5sbyA9ICh4KS0+dmFsdWU7IH0gXAord2hpbGUgKDApCisKKyNkZWZpbmUgSVBXMjEwMF9FUlJPUl9RVUVVRSA1CisKKy8qIFBvd2VyIG1hbmFnZW1lbnQgY29kZTogZW5hYmxlIG9yIGRpc2FibGU/ICovCitlbnVtIHsKKyNpZmRlZiBDT05GSUdfUE0KKwlJUFcyMTAwX1BNX0RJU0FCTEVEID0gMCwKKwlQTV9TVEFURV9TSVpFID0gMTYsCisjZWxzZQorCUlQVzIxMDBfUE1fRElTQUJMRUQgPSAxLAorCVBNX1NUQVRFX1NJWkUgPSAwLAorI2VuZGlmCit9OworCisjZGVmaW5lIFNUQVRVU19QT1dFUkVEICAgICAgICAgICgxPDwwKQorI2RlZmluZSBTVEFUVVNfQ01EX0FDVElWRSAgICAgICAoMTw8MSkgIC8qKjwgaG9zdCBjb21tYW5kIGluIHByb2dyZXNzICovCisjZGVmaW5lIFNUQVRVU19SVU5OSU5HICAgICAgICAgICgxPDwyKSAgLyogQ2FyZCBpbml0aWFsaXplZCwgYnV0IG5vdCBlbmFibGVkICovCisjZGVmaW5lIFNUQVRVU19FTkFCTEVEICAgICAgICAgICgxPDwzKSAgLyogQ2FyZCBlbmFibGVkIC0tIGNhbiBzY2FuLFR4LFJ4ICovCisjZGVmaW5lIFNUQVRVU19TVE9QUElORyAgICAgICAgICgxPDw0KSAgLyogQ2FyZCBpcyBpbiBzaHV0ZG93biBwaGFzZSAqLworI2RlZmluZSBTVEFUVVNfSU5JVElBTElaRUQgICAgICAoMTw8NSkgIC8qIENhcmQgaXMgcmVhZHkgZm9yIGV4dGVybmFsIGNhbGxzICovCisjZGVmaW5lIFNUQVRVU19BU1NPQ0lBVElORyAgICAgICgxPDw5KSAgLyogQXNzb2NpYXRlZCwgYnV0IG5vIEJTU0lEIHlldCAqLworI2RlZmluZSBTVEFUVVNfQVNTT0NJQVRFRCAgICAgICAoMTw8MTApIC8qIEFzc29jaWF0ZWQgYW5kIEJTU0lEIHZhbGlkICovCisjZGVmaW5lIFNUQVRVU19JTlRfRU5BQkxFRCAgICAgICgxPDwxMSkKKyNkZWZpbmUgU1RBVFVTX1JGX0tJTExfSFcgICAgICAgKDE8PDEyKQorI2RlZmluZSBTVEFUVVNfUkZfS0lMTF9TVyAgICAgICAoMTw8MTMpCisjZGVmaW5lIFNUQVRVU19SRl9LSUxMX01BU0sgICAgIChTVEFUVVNfUkZfS0lMTF9IVyB8IFNUQVRVU19SRl9LSUxMX1NXKQorI2RlZmluZSBTVEFUVVNfRVhJVF9QRU5ESU5HICAgICAoMTw8MTQpCisKKyNkZWZpbmUgU1RBVFVTX1NDQU5fUEVORElORyAgICAgKDE8PDIzKQorI2RlZmluZSBTVEFUVVNfU0NBTk5JTkcgICAgICAgICAoMTw8MjQpCisjZGVmaW5lIFNUQVRVU19TQ0FOX0FCT1JUSU5HICAgICgxPDwyNSkKKyNkZWZpbmUgU1RBVFVTX1NDQU5fQ09NUExFVEUgICAgKDE8PDI2KQorI2RlZmluZSBTVEFUVVNfV1hfRVZFTlRfUEVORElORyAoMTw8MjcpCisjZGVmaW5lIFNUQVRVU19SRVNFVF9QRU5ESU5HICAgICgxPDwyOSkKKyNkZWZpbmUgU1RBVFVTX1NFQ1VSSVRZX1VQREFURUQgKDE8PDMwKSAvKiBTZWN1cml0eSBzeW5jIG5lZWRlZCAqLworCisKKworLyogSW50ZXJuYWwgTklDIHN0YXRlcyAqLworI2RlZmluZSBJUFdfU1RBVEVfSU5JVElBTElaRUQJKDE8PDApCisjZGVmaW5lIElQV19TVEFURV9DT1VOVFJZX0ZPVU5ECSgxPDwxKQorI2RlZmluZSBJUFdfU1RBVEVfQVNTT0NJQVRFRCAgICAoMTw8MikKKyNkZWZpbmUgSVBXX1NUQVRFX0FTU05fTE9TVAkoMTw8MykKKyNkZWZpbmUgSVBXX1NUQVRFX0FTU05fQ0hBTkdFRCAJKDE8PDQpCisjZGVmaW5lIElQV19TVEFURV9TQ0FOX0NPTVBMRVRFCSgxPDw1KQorI2RlZmluZSBJUFdfU1RBVEVfRU5URVJFRF9QU1AgCSgxPDw2KQorI2RlZmluZSBJUFdfU1RBVEVfTEVGVF9QU1AgCSgxPDw3KQorI2RlZmluZSBJUFdfU1RBVEVfUkZfS0lMTCAgICAgICAoMTw8OCkKKyNkZWZpbmUgSVBXX1NUQVRFX0RJU0FCTEVECSgxPDw5KQorI2RlZmluZSBJUFdfU1RBVEVfUE9XRVJfRE9XTgkoMTw8MTApCisjZGVmaW5lIElQV19TVEFURV9TQ0FOTklORyAgICAgICgxPDwxMSkKKworCisKKyNkZWZpbmUgQ0ZHX1NUQVRJQ19DSEFOTkVMICAgICAgKDE8PDApIC8qIFJlc3RyaWN0IGFzc29jLiB0byBzaW5nbGUgY2hhbm5lbCAqLworI2RlZmluZSBDRkdfU1RBVElDX0VTU0lEICAgICAgICAoMTw8MSkgLyogUmVzdHJpY3QgYXNzb2MuIHRvIHNpbmdsZSBTU0lEICovCisjZGVmaW5lIENGR19TVEFUSUNfQlNTSUQgICAgICAgICgxPDwyKSAvKiBSZXN0cmljdCBhc3NvYy4gdG8gc2luZ2xlIEJTU0lEICovCisjZGVmaW5lIENGR19DVVNUT01fTUFDICAgICAgICAgICgxPDwzKQorI2RlZmluZSBDRkdfTE9OR19QUkVBTUJMRSAgICAgICAoMTw8NCkKKyNkZWZpbmUgQ0ZHX0FTU09DSUFURSAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIENGR19GSVhFRF9SQVRFICAgICAgICAgICgxPDw3KQorI2RlZmluZSBDRkdfQURIT0NfQ1JFQVRFICAgICAgICAoMTw8OCkKKyNkZWZpbmUgQ0ZHX0MzX0RJU0FCTEVEICAgICAgICAgKDE8PDkpCisjZGVmaW5lIENGR19QQVNTSVZFX1NDQU4gICAgICAgICgxPDwxMCkKKworI2RlZmluZSBDQVBfU0hBUkVEX0tFWSAgICAgICAgICAoMTw8MCkgLyogT2ZmID0gT1BFTiAqLworI2RlZmluZSBDQVBfUFJJVkFDWV9PTiAgICAgICAgICAoMTw8MSkgLyogT2ZmID0gTm8gcHJpdmFjeSAqLworCitzdHJ1Y3QgaXB3MjEwMF9wcml2IHsKKworCWludCBzdG9wX2hhbmdfY2hlY2s7IC8qIFNldCAxIHdoZW4gc2h1dHRpbmcgZG93biB0byBraWxsIGhhbmdfY2hlY2sgKi8KKwlpbnQgc3RvcF9yZl9raWxsOyAvKiBTZXQgMSB3aGVuIHNodXR0aW5nIGRvd24gdG8ga2lsbCByZl9raWxsICovCisKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGNvbmZpZzsKKwl1bnNpZ25lZCBsb25nIGNhcGFiaWxpdHk7CisKKwkvKiBTdGF0aXN0aWNzICovCisJaW50IHJlc2V0czsKKwlpbnQgcmVzZXRfYmFja29mZjsKKworCS8qIENvbnRleHQgKi8KKwl1OCBlc3NpZFtJV19FU1NJRF9NQVhfU0laRV07CisJdTggZXNzaWRfbGVuOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwl1OCBjaGFubmVsOworCWludCBsYXN0X21vZGU7CisJaW50IGNzdGF0ZV9saW1pdDsKKworCXVuc2lnbmVkIGxvbmcgY29ubmVjdF9zdGFydDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfcmVzZXQ7CisKKwl1MzIgY2hhbm5lbF9tYXNrOworCXUzMiBmYXRhbF9lcnJvcjsKKwl1MzIgZmF0YWxfZXJyb3JzW0lQVzIxMDBfRVJST1JfUVVFVUVdOworCXUzMiBmYXRhbF9pbmRleDsKKwlpbnQgZWVwcm9tX3ZlcnNpb247CisJaW50IGZpcm13YXJlX3ZlcnNpb247CisJdW5zaWduZWQgbG9uZyBod19mZWF0dXJlczsKKwlpbnQgaGFuZ3M7CisJdTMyIGxhc3RfcnRjOworCWludCBkdW1wX3JhdzsgLyogMSB0byBkdW1wIHJhdyBieXRlcyBpbiAvc3lzLy4uLi9tZW1vcnkgKi8KKwl1OCogc25hcHNob3RbMHgzMF07CisKKwl1OCBtYW5kYXRvcnlfYnNzaWRfbWFjW0VUSF9BTEVOXTsKKwl1OCBtYWNfYWRkcltFVEhfQUxFTl07CisKKwlpbnQgcG93ZXJfbW9kZTsKKworCS8qIFdFUCBkYXRhICovCisJc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWM7CisJaW50IG1lc3NhZ2VzX3NlbnQ7CisKKworCWludCBzaG9ydF9yZXRyeV9saW1pdDsKKwlpbnQgbG9uZ19yZXRyeV9saW1pdDsKKworCXUzMiBydHNfdGhyZXNob2xkOworCXUzMiBmcmFnX3RocmVzaG9sZDsKKworCWludCBpbl9pc3I7CisKKwl1MzIgdHhfcmF0ZXM7CisJaW50IHR4X3Bvd2VyOworCXUzMiBiZWFjb25faW50ZXJ2YWw7CisKKwljaGFyIG5pY2tbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKworCXN0cnVjdCBpcHcyMTAwX3N0YXR1c19xdWV1ZSBzdGF0dXNfcXVldWU7CisKKwlzdHJ1Y3Qgc3RhdGlzdGljIHR4cV9zdGF0OworCXN0cnVjdCBzdGF0aXN0aWMgcnhxX3N0YXQ7CisJc3RydWN0IGlwdzIxMDBfYmRfcXVldWUgcnhfcXVldWU7CisJc3RydWN0IGlwdzIxMDBfYmRfcXVldWUgdHhfcXVldWU7CisJc3RydWN0IGlwdzIxMDBfcnhfcGFja2V0ICpyeF9idWZmZXJzOworCisJc3RydWN0IHN0YXRpc3RpYyBmd19wZW5kX3N0YXQ7CisJc3RydWN0IGxpc3RfaGVhZCBmd19wZW5kX2xpc3Q7CisKKwlzdHJ1Y3Qgc3RhdGlzdGljIG1zZ19mcmVlX3N0YXQ7CisJc3RydWN0IHN0YXRpc3RpYyBtc2dfcGVuZF9zdGF0OworCXN0cnVjdCBsaXN0X2hlYWQgbXNnX2ZyZWVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1zZ19wZW5kX2xpc3Q7CisJc3RydWN0IGlwdzIxMDBfdHhfcGFja2V0ICptc2dfYnVmZmVyczsKKworCXN0cnVjdCBzdGF0aXN0aWMgdHhfZnJlZV9zdGF0OworCXN0cnVjdCBzdGF0aXN0aWMgdHhfcGVuZF9zdGF0OworCXN0cnVjdCBsaXN0X2hlYWQgdHhfZnJlZV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgdHhfcGVuZF9saXN0OworCXN0cnVjdCBpcHcyMTAwX3R4X3BhY2tldCAqdHhfYnVmZmVyczsKKworCXN0cnVjdCBpcHcyMTAwX29yZGluYWxzIG9yZGluYWxzOworCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcl9kZXY7CisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXJxX3Rhc2tsZXQ7CisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzZWN1cml0eV93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3eF9ldmVudF93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBoYW5nX2NoZWNrOworCXN0cnVjdCB3b3JrX3N0cnVjdCByZl9raWxsOworCisJdTMyIGludGVycnVwdHM7CisJaW50IHR4X2ludGVycnVwdHM7CisJaW50IHJ4X2ludGVycnVwdHM7CisJaW50IGludGFfb3RoZXI7CisKKwlzcGlubG9ja190IGxvd19sb2NrOworCXN0cnVjdCBzZW1hcGhvcmUgYWN0aW9uX3NlbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGFkYXB0ZXJfc2VtOworCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9jb21tYW5kX3F1ZXVlOworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIb3N0IENvbW1hbmQgLT4gRnJvbSBEcml2ZXIgdG8gRlcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogSG9zdCBjb21tYW5kIGlkZW50aWZpZXJzCisgKi8KKyNkZWZpbmUgSE9TVF9DT01QTEVURSAgICAgICAgICAgMgorI2RlZmluZSBTWVNURU1fQ09ORklHICAgICAgICAgICA2CisjZGVmaW5lIFNTSUQgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTUFOREFUT1JZX0JTU0lEICAgICAgICAgOQorI2RlZmluZSBBVVRIRU5USUNBVElPTl9UWVBFICAgIDEwCisjZGVmaW5lIEFEQVBURVJfQUREUkVTUyAgICAgICAgMTEKKyNkZWZpbmUgUE9SVF9UWVBFICAgICAgICAgICAgICAxMgorI2RlZmluZSBJTlRFUk5BVElPTkFMX01PREUgICAgIDEzCisjZGVmaW5lIENIQU5ORUwgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUlRTX1RIUkVTSE9MRCAgICAgICAgICAxNQorI2RlZmluZSBGUkFHX1RIUkVTSE9MRCAgICAgICAgIDE2CisjZGVmaW5lIFBPV0VSX01PREUgICAgICAgICAgICAgMTcKKyNkZWZpbmUgVFhfUkFURVMgICAgICAgICAgICAgICAxOAorI2RlZmluZSBCQVNJQ19UWF9SQVRFUyAgICAgICAgIDE5CisjZGVmaW5lIFdFUF9LRVlfSU5GTyAgICAgICAgICAgMjAKKyNkZWZpbmUgV0VQX0tFWV9JTkRFWCAgICAgICAgICAyNQorI2RlZmluZSBXRVBfRkxBR1MgICAgICAgICAgICAgIDI2CisjZGVmaW5lIEFERF9NVUxUSUNBU1QgICAgICAgICAgMjcKKyNkZWZpbmUgQ0xFQVJfQUxMX01VTFRJQ0FTVCAgICAyOAorI2RlZmluZSBCRUFDT05fSU5URVJWQUwgICAgICAgIDI5CisjZGVmaW5lIEFUSU1fV0lORE9XICAgICAgICAgICAgMzAKKyNkZWZpbmUgQ0xFQVJfU1RBVElTVElDUyAgICAgICAzMQorI2RlZmluZSBTRU5ECQkgICAgICAgMzMKKyNkZWZpbmUgVFhfUE9XRVJfSU5ERVggICAgICAgICAzNgorI2RlZmluZSBCUk9BRENBU1RfU0NBTiAgICAgICAgIDQzCisjZGVmaW5lIENBUkRfRElTQUJMRSAgICAgICAgICAgNDQKKyNkZWZpbmUgUFJFRkVSUkVEX0JTU0lEICAgICAgICA0NQorI2RlZmluZSBTRVRfU0NBTl9PUFRJT05TICAgICAgIDQ2CisjZGVmaW5lIFNDQU5fRFdFTExfVElNRSAgICAgICAgNDcKKyNkZWZpbmUgU1dFRVBfVEFCTEUgICAgICAgICAgICA0OAorI2RlZmluZSBBUF9PUl9TVEFUSU9OX1RBQkxFICAgIDQ5CisjZGVmaW5lIEdST1VQX09SRElOQUxTICAgICAgICAgNTAKKyNkZWZpbmUgU0hPUlRfUkVUUllfTElNSVQgICAgICA1MQorI2RlZmluZSBMT05HX1JFVFJZX0xJTUlUICAgICAgIDUyCisKKyNkZWZpbmUgSE9TVF9QUkVfUE9XRVJfRE9XTiAgICA1OAorI2RlZmluZSBDQVJEX0RJU0FCTEVfUEhZX09GRiAgIDYxCisjZGVmaW5lIE1TRFVfVFhfUkFURVMgICAgICAgICAgNjIKKworCisvKiBSb2d1ZSBBUCBEZXRlY3Rpb24gKi8KKyNkZWZpbmUgU0VUX1NUQVRJT05fU1RBVF9CSVRTICAgICAgNjQKKyNkZWZpbmUgQ0xFQVJfU1RBVElPTlNfU1RBVF9CSVRTICAgNjUKKyNkZWZpbmUgTEVBUF9ST0dVRV9NT0RFICAgICAgICAgICAgNjYJLy9UT0RPIHRidyByZXBsYWNlZCBieSBDRkdfTEVBUF9ST0dVRV9BUAorI2RlZmluZSBTRVRfU0VDVVJJVFlfSU5GT1JNQVRJT04gICA2NworI2RlZmluZSBESVNBU1NPQ0lBVElPTl9CU1NJRAkgICA2OAorI2RlZmluZSBTRVRfV1BBX0lFICAgICAgICAgICAgICAgICA2OQorCisKKworLyogc3lzdGVtIGNvbmZpZ3VyYXRpb24gYml0IG1hc2s6ICovCisjZGVmaW5lIElQV19DRkdfTU9OSVRPUiAgICAgICAgICAgICAgIDB4MDAwMDQKKyNkZWZpbmUgSVBXX0NGR19QUkVBTUJMRV9BVVRPICAgICAgICAweDAwMDEwCisjZGVmaW5lIElQV19DRkdfSUJTU19BVVRPX1NUQVJUICAgICAweDAwMDIwCisjZGVmaW5lIElQV19DRkdfTE9PUEJBQ0sgICAgICAgICAgICAweDAwMTAwCisjZGVmaW5lIElQV19DRkdfQU5TV0VSX0JDU1NJRF9QUk9CRSAweDAwODAwCisjZGVmaW5lIElQV19DRkdfQlRfU0lERUJBTkRfU0lHTkFMCTB4MDIwMDAKKyNkZWZpbmUgSVBXX0NGR184MDJfMXhfRU5BQkxFICAgICAgIDB4MDQwMDAKKyNkZWZpbmUgSVBXX0NGR19CU1NfTUFTSwkJMHgwODAwMAorI2RlZmluZSBJUFdfQ0ZHX0lCU1NfTUFTSwkJMHgxMDAwMAorCisjZGVmaW5lIElQV19TQ0FOX05PQVNTT0NJQVRFICgxPDwwKQorI2RlZmluZSBJUFdfU0NBTl9NSVhFRF9DRUxMICgxPDwxKQorLyogUkVTRVJWRUQgKDE8PDIpICovCisjZGVmaW5lIElQV19TQ0FOX1BBU1NJVkUgKDE8PDMpCisKKyNkZWZpbmUgSVBXX05JQ19GQVRBTF9FUlJPUiAweDJBN0YwCisjZGVmaW5lIElQV19FUlJPUl9BRERSKHgpICh4ICYgMHgzRkZGRikKKyNkZWZpbmUgSVBXX0VSUk9SX0NPREUoeCkgKCh4ICYgMHhGRjAwMDAwMCkgPj4gMjQpCisjZGVmaW5lIElQVzIxMDBfRVJSX0MzX0NPUlJVUFRJT04gKDB4MTAgPDwgMjQpCisjZGVmaW5lIElQVzIxMDBfRVJSX01TR19USU1FT1VUICAgKDB4MTEgPDwgMjQpCisjZGVmaW5lIElQVzIxMDBfRVJSX0ZXX0xPQUQgICAgICAgKDB4MTIgPDwgMjQpCisKKyNkZWZpbmUgSVBXX01FTV9TUkFNX0hPU1RfU0hBUkVEX0xPV0VSX0JPVU5ECQkJMHgyMDAKKyNkZWZpbmUgSVBXX01FTV9TUkFNX0hPU1RfSU5URVJSVVBUX0FSRUFfTE9XRVJfQk9VTkQgIAlJUFdfTUVNX1NSQU1fSE9TVF9TSEFSRURfTE9XRVJfQk9VTkQgKyAweDBEODAKKworI2RlZmluZSBJUFdfTUVNX0hPU1RfU0hBUkVEX1JYX0JEX0JBU0UgICAgICAgICAgICAgICAgICAoSVBXX01FTV9TUkFNX0hPU1RfU0hBUkVEX0xPV0VSX0JPVU5EICsgMHg0MCkKKyNkZWZpbmUgSVBXX01FTV9IT1NUX1NIQVJFRF9SWF9TVEFUVVNfQkFTRSAgICAgICAgICAgICAgKElQV19NRU1fU1JBTV9IT1NUX1NIQVJFRF9MT1dFUl9CT1VORCArIDB4NDQpCisjZGVmaW5lIElQV19NRU1fSE9TVF9TSEFSRURfUlhfQkRfU0laRSAgICAgICAgICAgICAgICAgIChJUFdfTUVNX1NSQU1fSE9TVF9TSEFSRURfTE9XRVJfQk9VTkQgKyAweDQ4KQorI2RlZmluZSBJUFdfTUVNX0hPU1RfU0hBUkVEX1JYX1JFQURfSU5ERVggICAgICAgICAgICAgICAoSVBXX01FTV9TUkFNX0hPU1RfU0hBUkVEX0xPV0VSX0JPVU5EICsgMHhhMCkKKworI2RlZmluZSBJUFdfTUVNX0hPU1RfU0hBUkVEX1RYX1FVRVVFX0JEX0JBU0UgICAgICAgICAgKElQV19NRU1fU1JBTV9IT1NUX1NIQVJFRF9MT1dFUl9CT1VORCArIDB4MDApCisjZGVmaW5lIElQV19NRU1fSE9TVF9TSEFSRURfVFhfUVVFVUVfQkRfU0laRSAgICAgICAgICAoSVBXX01FTV9TUkFNX0hPU1RfU0hBUkVEX0xPV0VSX0JPVU5EICsgMHgwNCkKKyNkZWZpbmUgSVBXX01FTV9IT1NUX1NIQVJFRF9UWF9RVUVVRV9SRUFEX0lOREVYICAgICAgIChJUFdfTUVNX1NSQU1fSE9TVF9TSEFSRURfTE9XRVJfQk9VTkQgKyAweDgwKQorCisjZGVmaW5lIElQV19NRU1fSE9TVF9TSEFSRURfUlhfV1JJVEVfSU5ERVggXAorICAgIChJUFdfTUVNX1NSQU1fSE9TVF9JTlRFUlJVUFRfQVJFQV9MT1dFUl9CT1VORCArIDB4MjApCisKKyNkZWZpbmUgSVBXX01FTV9IT1NUX1NIQVJFRF9UWF9RVUVVRV9XUklURV9JTkRFWCBcCisgICAgKElQV19NRU1fU1JBTV9IT1NUX0lOVEVSUlVQVF9BUkVBX0xPV0VSX0JPVU5EKQorCisjZGVmaW5lIElQV19NRU1fSE9TVF9TSEFSRURfT1JESU5BTFNfVEFCTEVfMSAgIChJUFdfTUVNX1NSQU1fSE9TVF9TSEFSRURfTE9XRVJfQk9VTkQgKyAweDE4MCkKKyNkZWZpbmUgSVBXX01FTV9IT1NUX1NIQVJFRF9PUkRJTkFMU19UQUJMRV8yICAgKElQV19NRU1fU1JBTV9IT1NUX1NIQVJFRF9MT1dFUl9CT1VORCArIDB4MTg0KQorCisjZGVmaW5lIElQVzIxMDBfSU5UQV9UWF9UUkFOU0ZFUiAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQkvLyBCaXQgMCAoTFNCKQorI2RlZmluZSBJUFcyMTAwX0lOVEFfUlhfVFJBTlNGRVIgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikJLy8gQml0IDEKKyNkZWZpbmUgSVBXMjEwMF9JTlRBX1RYX0NPTVBMRVRFCSAgICAgICAoMHgwMDAwMDAwNCkJLy8gQml0IDIKKyNkZWZpbmUgSVBXMjEwMF9JTlRBX0VWRU5UX0lOVEVSUlVQVCAgICAgICAgICAgKDB4MDAwMDAwMDgpICAgICAvLyBCaXQgMworI2RlZmluZSBJUFcyMTAwX0lOVEFfU1RBVFVTX0NIQU5HRSAgICAgICAgICAgICAoMHgwMDAwMDAxMCkJLy8gQml0IDQKKyNkZWZpbmUgSVBXMjEwMF9JTlRBX0JFQUNPTl9QRVJJT0RfRVhQSVJFRCAgICAgKDB4MDAwMDAwMjApCS8vIEJpdCA1CisjZGVmaW5lIElQVzIxMDBfSU5UQV9TTEFWRV9NT0RFX0hPU1RfQ09NTUFORF9ET05FICAoMHgwMDAxMDAwMCkJLy8gQml0IDE2CisjZGVmaW5lIElQVzIxMDBfSU5UQV9GV19JTklUX0RPTkUgICAgICAgICAgICAgICgweDAxMDAwMDAwKQkvLyBCaXQgMjQKKyNkZWZpbmUgSVBXMjEwMF9JTlRBX0ZXX0NBTElCUkFUSU9OX0NBTEMgICAgICAgKDB4MDIwMDAwMDApCS8vIEJpdCAyNQorI2RlZmluZSBJUFcyMTAwX0lOVEFfRkFUQUxfRVJST1IgICAgICAgICAgICAgICAoMHg0MDAwMDAwMCkJLy8gQml0IDMwCisjZGVmaW5lIElQVzIxMDBfSU5UQV9QQVJJVFlfRVJST1IgICAgICAgICAgICAgICgweDgwMDAwMDAwKQkvLyBCaXQgMzEgKE1TQikKKworI2RlZmluZSBJUFdfQVVYX0hPU1RfUkVTRVRfUkVHX1BSSU5DRVRPTl9SRVNFVCAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIElQV19BVVhfSE9TVF9SRVNFVF9SRUdfRk9SQ0VfTk1JICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgSVBXX0FVWF9IT1NUX1JFU0VUX1JFR19QQ0lfSE9TVF9DTFVTVEVSX0ZBVEFMX05NSSAgICgweDAwMDAwMDA0KQorI2RlZmluZSBJUFdfQVVYX0hPU1RfUkVTRVRfUkVHX0NPUkVfRkFUQUxfTk1JICAgICAgICAgICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIElQV19BVVhfSE9TVF9SRVNFVF9SRUdfU1dfUkVTRVQgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgSVBXX0FVWF9IT1NUX1JFU0VUX1JFR19NQVNURVJfRElTQUJMRUQgICAgICAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBJUFdfQVVYX0hPU1RfUkVTRVRfUkVHX1NUT1BfTUFTVEVSICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCisKKyNkZWZpbmUgSVBXX0FVWF9IT1NUX0dQX0NOVFJMX0JJVF9DTE9DS19SRUFEWSAgICAgICAgICAgKDB4MDAwMDAwMDEpCS8vIEJpdCAwIChMU0IpCisjZGVmaW5lIElQV19BVVhfSE9TVF9HUF9DTlRSTF9CSVRfSE9TVF9BTExPV1NfU1RBTkRCWSAgICgweDAwMDAwMDAyKQkvLyBCaXQgMQorI2RlZmluZSBJUFdfQVVYX0hPU1RfR1BfQ05UUkxfQklUX0lOSVRfRE9ORSAgICAgICAgICAgICAoMHgwMDAwMDAwNCkJLy8gQml0IDIKKyNkZWZpbmUgSVBXX0FVWF9IT1NUX0dQX0NOVFJMX0JJVFNfU1lTX0NPTkZJRyAgICAgICAgICAgKDB4MDAwMDA3YzApCS8vIEJpdHMgNi0xMAorI2RlZmluZSBJUFdfQVVYX0hPU1RfR1BfQ05UUkxfQklUX0JVU19UWVBFICAgICAgICAgICAgICAoMHgwMDAwMDIwMCkJLy8gQml0IDkKKyNkZWZpbmUgSVBXX0FVWF9IT1NUX0dQX0NOVFJMX0JJVF9CQVIwX0JMT0NLX1NJWkUgICAgICAgKDB4MDAwMDA0MDApCS8vIEJpdCAxMAorI2RlZmluZSBJUFdfQVVYX0hPU1RfR1BfQ05UUkxfQklUX1VTQl9NT0RFICAgICAgICAgICAgICAoMHgyMDAwMDAwMCkJLy8gQml0IDI5CisjZGVmaW5lIElQV19BVVhfSE9TVF9HUF9DTlRSTF9CSVRfSE9TVF9GT1JDRVNfU1lTX0NMSyAgICgweDQwMDAwMDAwKQkvLyBCaXQgMzAKKyNkZWZpbmUgSVBXX0FVWF9IT1NUX0dQX0NOVFJMX0JJVF9GV19GT1JDRVNfU1lTX0NMSyAgICAgKDB4ODAwMDAwMDApCS8vIEJpdCAzMSAoTVNCKQorCisjZGVmaW5lIElQV19CSVRfR1BJT19HUElPMV9NQVNLICAgICAgICAgMHgwMDAwMDAwQworI2RlZmluZSBJUFdfQklUX0dQSU9fR1BJTzNfTUFTSyAgICAgICAgIDB4MDAwMDAwQzAKKyNkZWZpbmUgSVBXX0JJVF9HUElPX0dQSU8xX0VOQUJMRSAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIElQV19CSVRfR1BJT19SRl9LSUxMICAgICAgICAgICAgMHgwMDAxMDAwMAorCisjZGVmaW5lIElQV19CSVRfR1BJT19MRURfT0ZGICAgICAgICAgICAgMHgwMDAwMjAwMAkvLyBCaXQgMTMgPSAxCisKKyNkZWZpbmUgSVBXX1JFR19ET01BSU5fMF9PRkZTRVQgCTB4MDAwMAorI2RlZmluZSBJUFdfUkVHX0RPTUFJTl8xX09GRlNFVCAJSVBXX01FTV9TUkFNX0hPU1RfU0hBUkVEX0xPV0VSX0JPVU5ECisKKyNkZWZpbmUgSVBXX1JFR19JTlRBCQkJSVBXX1JFR19ET01BSU5fMF9PRkZTRVQgKyAweDAwMDgKKyNkZWZpbmUgSVBXX1JFR19JTlRBX01BU0sJCUlQV19SRUdfRE9NQUlOXzBfT0ZGU0VUICsgMHgwMDBDCisjZGVmaW5lIElQV19SRUdfSU5ESVJFQ1RfQUNDRVNTX0FERFJFU1MJSVBXX1JFR19ET01BSU5fMF9PRkZTRVQgKyAweDAwMTAKKyNkZWZpbmUgSVBXX1JFR19JTkRJUkVDVF9BQ0NFU1NfREFUQQlJUFdfUkVHX0RPTUFJTl8wX09GRlNFVCArIDB4MDAxNAorI2RlZmluZSBJUFdfUkVHX0FVVE9JTkNSRU1FTlRfQUREUkVTUwlJUFdfUkVHX0RPTUFJTl8wX09GRlNFVCArIDB4MDAxOAorI2RlZmluZSBJUFdfUkVHX0FVVE9JTkNSRU1FTlRfREFUQQlJUFdfUkVHX0RPTUFJTl8wX09GRlNFVCArIDB4MDAxQworI2RlZmluZSBJUFdfUkVHX1JFU0VUX1JFRwkJSVBXX1JFR19ET01BSU5fMF9PRkZTRVQgKyAweDAwMjAKKyNkZWZpbmUgSVBXX1JFR19HUF9DTlRSTAkJSVBXX1JFR19ET01BSU5fMF9PRkZTRVQgKyAweDAwMjQKKyNkZWZpbmUgSVBXX1JFR19HUElPCQkJSVBXX1JFR19ET01BSU5fMF9PRkZTRVQgKyAweDAwMzAKKyNkZWZpbmUgSVBXX1JFR19GV19UWVBFICAgICAgICAgICAgICAgICBJUFdfUkVHX0RPTUFJTl8xX09GRlNFVCArIDB4MDE4OAorI2RlZmluZSBJUFdfUkVHX0ZXX1ZFUlNJT04gCQlJUFdfUkVHX0RPTUFJTl8xX09GRlNFVCArIDB4MDE4QworI2RlZmluZSBJUFdfUkVHX0ZXX0NPTVBBVEFCSUxJVFlfVkVSU0lPTiBJUFdfUkVHX0RPTUFJTl8xX09GRlNFVCArIDB4MDE5MAorCisjZGVmaW5lIElQV19SRUdfSU5ESVJFQ1RfQUREUl9NQVNLCTB4MDBGRkZGRkMKKworI2RlZmluZSBJUFdfSU5URVJSVVBUX01BU0sJCTB4QzEwMTAwMTMKKworI2RlZmluZSBJUFcyMTAwX0NPTlRST0xfUkVHICAgICAgICAgICAgIDB4MjIwMDAwCisjZGVmaW5lIElQVzIxMDBfQ09OVFJPTF9QSFlfT0ZGICAgICAgICAgMHg4CisKKyNkZWZpbmUgSVBXMjEwMF9DT01NQU5ECQkJMHgwMDMwMDAwNAorI2RlZmluZSBJUFcyMTAwX0NPTU1BTkRfUEhZX09OCQkweDAKKyNkZWZpbmUgSVBXMjEwMF9DT01NQU5EX1BIWV9PRkYJCTB4MQorCisvKiBpbiBERUJVR19BUkVBLCB2YWx1ZXMgb2YgbWVtb3J5IGFsd2F5cyAweGQ1NTU1NWQ1ICovCisjZGVmaW5lIElQV19SRUdfRE9BX0RFQlVHX0FSRUFfU1RBUlQgICAgSVBXX1JFR19ET01BSU5fMF9PRkZTRVQgKyAweDAwOTAKKyNkZWZpbmUgSVBXX1JFR19ET0FfREVCVUdfQVJFQV9FTkQgICAgICBJUFdfUkVHX0RPTUFJTl8wX09GRlNFVCArIDB4MDBGRgorI2RlZmluZSBJUFdfREFUQV9ET0FfREVCVUdfVkFMVUUgICAgICAgIDB4ZDU1NTU1ZDUKKworI2RlZmluZSBJUFdfSU5URVJOQUxfUkVHSVNURVJfSEFMVF9BTkRfUkVTRVQJMHgwMDMwMDBlMAorCisjZGVmaW5lIElQV19XQUlUX0NMT0NLX1NUQUJJTElaQVRJT05fREVMQVkJICAgIDUwCS8vIG1pY3JvIHNlY29uZHMKKyNkZWZpbmUgSVBXX1dBSVRfUkVTRVRfQVJDX0NPTVBMRVRFX0RFTEFZCSAgICAxMAkvLyBtaWNybyBzZWNvbmRzCisjZGVmaW5lIElQV19XQUlUX1JFU0VUX01BU1RFUl9BU1NFUlRfQ09NUExFVEVfREVMQVkgMTAJLy8gbWljcm8gc2Vjb25kcworCisvLyBCRCByaW5nIHF1ZXVlIHJlYWQvd3JpdGUgZGlmZmVyZW5jZQorI2RlZmluZSBJUFdfQkRfUVVFVUVfV19SX01JTl9TUEFSRSAyCisKKyNkZWZpbmUgSVBXX0NBQ0hFX0xJTkVfTEVOR1RIX0RFRkFVTFQJCSAgICAweDgwCisKKyNkZWZpbmUgSVBXX0NBUkRfRElTQUJMRV9QSFlfT0ZGX0NPTVBMRVRFX1dBSVQJICAgIDEwMAkvLyAxMDAgbWlsbGkKKyNkZWZpbmUgSVBXX1BSRVBBUkVfUE9XRVJfRE9XTl9DT01QTEVURV9XQUlUCSAgICAxMDAJLy8gMTAwIG1pbGxpCisKKworCisKKyNkZWZpbmUgSVBXX0hFQURFUl84MDJfMTFfU0laRQkJIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikKKyNkZWZpbmUgSVBXX01BWF84MDIxMV9QQVlMT0FEX1NJWkUgICAgICAgICAgICAgIDIzMDRVCisjZGVmaW5lIElQV19NQVhfODAyXzExX1BBWUxPQURfTEVOR1RICQkyMzEyCisjZGVmaW5lIElQV19NQVhfQUNDRVBUQUJMRV9UWF9GUkFNRV9MRU5HVEgJMTUzNgorI2RlZmluZSBJUFdfTUlOX0FDQ0VQVEFCTEVfUlhfRlJBTUVfTEVOR1RICTYwCisjZGVmaW5lIElQV19NQVhfQUNDRVBUQUJMRV9SWF9GUkFNRV9MRU5HVEggXAorCShJUFdfTUFYX0FDQ0VQVEFCTEVfVFhfRlJBTUVfTEVOR1RIICsgSVBXX0hFQURFUl84MDJfMTFfU0laRSAtIFwKKyAgICAgICAgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKQorCisjZGVmaW5lIElQV184MDJfMTFfRkNTX0xFTkdUSCA0CisjZGVmaW5lIElQV19SWF9OSUNfQlVGRkVSX0xFTkdUSCBcCisgICAgICAgIChJUFdfTUFYXzgwMl8xMV9QQVlMT0FEX0xFTkdUSCArIElQV19IRUFERVJfODAyXzExX1NJWkUgKyBcCisJCUlQV184MDJfMTFfRkNTX0xFTkdUSCkKKworI2RlZmluZSBJUFdfODAyXzExX1BBWUxPQURfT0ZGU0VUIFwKKyAgICAgICAgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyBcCisgICAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkcikpCisKK3N0cnVjdCBpcHcyMTAwX3J4IHsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGNoYXIgcGF5bG9hZFtJUFdfUlhfTklDX0JVRkZFUl9MRU5HVEhdOworCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciBoZWFkZXI7CisJCXUzMiBzdGF0dXM7CisJCXN0cnVjdCBpcHcyMTAwX25vdGlmaWNhdGlvbiBub3RpZmljYXRpb247CisJCXN0cnVjdCBpcHcyMTAwX2NtZF9oZWFkZXIgY29tbWFuZDsKKwl9IHJ4X2RhdGE7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQml0IDAtNyBhcmUgZm9yIDgwMi4xMWIgdHggcmF0ZXMgLSAuICBCaXQgNS03IGFyZSByZXNlcnZlZCAqLworI2RlZmluZSBUWF9SQVRFXzFfTUJJVCAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRYX1JBVEVfMl9NQklUICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgVFhfUkFURV81XzVfTUJJVCAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBUWF9SQVRFXzExX01CSVQgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFRYX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAweDAwMEYKKyNkZWZpbmUgREVGQVVMVF9UWF9SQVRFUyAgICAgICAgICAgIDB4MDAwRgorCisjZGVmaW5lIElQV19QT1dFUl9NT0RFX0NBTSAgICAgICAgICAgMHgwMAkvLyhhbHdheXMgb24pCisjZGVmaW5lIElQV19QT1dFUl9JTkRFWF8xICAgICAgICAgICAgMHgwMQorI2RlZmluZSBJUFdfUE9XRVJfSU5ERVhfMiAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSVBXX1BPV0VSX0lOREVYXzMgICAgICAgICAgICAweDAzCisjZGVmaW5lIElQV19QT1dFUl9JTkRFWF80ICAgICAgICAgICAgMHgwNAorI2RlZmluZSBJUFdfUE9XRVJfSU5ERVhfNSAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgSVBXX1BPV0VSX0FVVE8gICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIElQV19QT1dFUl9NQVNLICAgICAgICAgICAgICAgMHgwRgorI2RlZmluZSBJUFdfUE9XRVJfRU5BQkxFRCAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgSVBXX1BPV0VSX0xFVkVMKHgpICAgICAgICAgICAoKHgpICYgSVBXX1BPV0VSX01BU0spCisKKyNkZWZpbmUgSVBXX1RYX1BPV0VSX0FVVE8gICAgICAgICAgICAwCisjZGVmaW5lIElQV19UWF9QT1dFUl9FTkhBTkNFRCAgICAgICAgMQorCisjZGVmaW5lIElQV19UWF9QT1dFUl9ERUZBVUxUICAgICAgICAgMzIKKyNkZWZpbmUgSVBXX1RYX1BPV0VSX01JTiAgICAgICAgICAgICAwCisjZGVmaW5lIElQV19UWF9QT1dFUl9NQVggICAgICAgICAgICAgMTYKKyNkZWZpbmUgSVBXX1RYX1BPV0VSX01JTl9EQk0gICAgICAgICAoLTEyKQorI2RlZmluZSBJUFdfVFhfUE9XRVJfTUFYX0RCTSAgICAgICAgIDE2CisKKyNkZWZpbmUgRldfU0NBTl9ET05PVF9BU1NPQ0lBVEUgICAgIDB4MDAwMSAvLyBEb250IEF0dGVtcHQgdG8gQXNzb2NpYXRlIGFmdGVyIFNjYW4KKyNkZWZpbmUgRldfU0NBTl9QQVNTSVZFICAgICAgICAgICAgIDB4MDAwOCAvLyBGb3JjZSBQQVNTU0lWRSBTY2FuCisKKyNkZWZpbmUgUkVHX01JTl9DSEFOTkVMICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVHX01BWF9DSEFOTkVMICAgICAgICAgICAgIDE0CisKKyNkZWZpbmUgUkVHX0NIQU5ORUxfTUFTSyAgICAgICAgICAgIDB4MDAwMDNGRkYKKyNkZWZpbmUgSVBXX0lCU1NfMTFCX0RFRkFVTFRfTUFTSyAgIDB4ODdmZgorCisjZGVmaW5lIERJVkVSU0lUWV9FSVRIRVIgICAgICAgICAgICAwCS8vIFVzZSBib3RoIGFudGVubmFzCisjZGVmaW5lIERJVkVSU0lUWV9BTlRFTk5BX0EgICAgICAgICAxCS8vIFVzZSBhbnRlbm5hIEEKKyNkZWZpbmUgRElWRVJTSVRZX0FOVEVOTkFfQiAgICAgICAgIDIJLy8gVXNlIGFudGVubmEgQgorCisKKyNkZWZpbmUgSE9TVF9DT01NQU5EX1dBSVQgMAorI2RlZmluZSBIT1NUX0NPTU1BTkRfTk9fV0FJVCAxCisKKyNkZWZpbmUgTE9DS19OT05FIDAKKyNkZWZpbmUgTE9DS19EUklWRVIgMQorI2RlZmluZSBMT0NLX0ZXIDIKKworI2RlZmluZSBUWVBFX1NXRUVQX09SRCAgICAgICAgICAgICAgICAgIDB4MDAwRAorI2RlZmluZSBUWVBFX0lCU1NfU1RUTl9PUkQgICAgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBUWVBFX0JTU19BUF9PUkQgICAgICAgICAgICAgICAgIDB4MDAwRgorI2RlZmluZSBUWVBFX1JBV19CRUFDT05fRU5UUlkgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBUWVBFX0NBTElCUkFUSU9OX0RBVEEgICAgICAgICAgIDB4MDAxMQorI2RlZmluZSBUWVBFX1JPR1VFX0FQX0RBVEEgICAgICAgICAgICAgIDB4MDAxMgorI2RlZmluZSBUWVBFX0FTU09DSUFUSU9OX1JFUVVFU1QJMHgwMDEzCisjZGVmaW5lIFRZUEVfUkVBU1NPQ0lBVElPTl9SRVFVRVNUCTB4MDAxNAorCisKKyNkZWZpbmUgSFdfRkVBVFVSRV9SRktJTEwgKDB4MDAwMSkKKyNkZWZpbmUgUkZfS0lMTFNXSVRDSF9PRkYgKDEpCisjZGVmaW5lIFJGX0tJTExTV0lUQ0hfT04gICgwKQorCisjZGVmaW5lIElQV19DT01NQU5EX1BPT0xfU0laRSAgICAgICAgNDAKKworI2RlZmluZSBJUFdfU1RBUlRfT1JEX1RBQl8xCQkJMQorI2RlZmluZSBJUFdfU1RBUlRfT1JEX1RBQl8yCQkJMTAwMAorCisjZGVmaW5lIElQV19PUkRfVEFCXzFfRU5UUllfU0laRQkJc2l6ZW9mKHUzMikKKworI2RlZmluZSBJU19PUkRJTkFMX1RBQkxFX09ORShtZ3IsaWQpIFwKKyAgICAoKGlkID49IElQV19TVEFSVF9PUkRfVEFCXzEpICYmIChpZCA8IG1nci0+dGFibGUxX3NpemUpKQorI2RlZmluZSBJU19PUkRJTkFMX1RBQkxFX1RXTyhtZ3IsaWQpIFwKKyAgICAoKGlkID49IElQV19TVEFSVF9PUkRfVEFCXzIpICYmIChpZCA8IChtZ3ItPnRhYmxlMl9zaXplICsgSVBXX1NUQVJUX09SRF9UQUJfMikpKQorCisjZGVmaW5lIEJTU19JRF9MRU5HVEggICAgICAgICAgICAgICA2CisKKy8vIEZpeGVkIHNpemUgZGF0YTogT3JkaW5hbCBUYWJsZSAxCit0eXBlZGVmIGVudW0gX09SRElOQUxfVEFCTEVfMSB7CS8vIE5TIC0gbWVhbnMgTm90IFN1cHBvcnRlZCBieSBGVworLy8gVHJhbnNtaXQgc3RhdGlzdGljcworCUlQV19PUkRfU1RBVF9UWF9IT1NUX1JFUVVFU1RTID0gMSwvLyAjIG9mIHJlcXVlc3RlZCBIb3N0IFR4J3MgKE1TRFUpCisJSVBXX09SRF9TVEFUX1RYX0hPU1RfQ09NUExFVEUsCS8vICMgb2Ygc3VjY2Vzc2Z1bCBIb3N0IFR4J3MgKE1TRFUpCisJSVBXX09SRF9TVEFUX1RYX0RJUl9EQVRBLAkvLyAjIG9mIHN1Y2Nlc3NmdWwgRGlyZWN0ZWQgVHgncyAoTVNEVSkKKworCUlQV19PUkRfU1RBVF9UWF9ESVJfREFUQTEgPSA0LAkvLyAjIG9mIHN1Y2Nlc3NmdWwgRGlyZWN0ZWQgVHgncyAoTVNEVSkgQCAxTUIKKwlJUFdfT1JEX1NUQVRfVFhfRElSX0RBVEEyLAkvLyAjIG9mIHN1Y2Nlc3NmdWwgRGlyZWN0ZWQgVHgncyAoTVNEVSkgQCAyTUIKKwlJUFdfT1JEX1NUQVRfVFhfRElSX0RBVEE1XzUsCS8vICMgb2Ygc3VjY2Vzc2Z1bCBEaXJlY3RlZCBUeCdzIChNU0RVKSBAIDVfNU1CCisJSVBXX09SRF9TVEFUX1RYX0RJUl9EQVRBMTEsCS8vICMgb2Ygc3VjY2Vzc2Z1bCBEaXJlY3RlZCBUeCdzIChNU0RVKSBAIDExTUIKKwlJUFdfT1JEX1NUQVRfVFhfRElSX0RBVEEyMiwJLy8gIyBvZiBzdWNjZXNzZnVsIERpcmVjdGVkIFR4J3MgKE1TRFUpIEAgMjJNQgorCisJSVBXX09SRF9TVEFUX1RYX05PRElSX0RBVEExID0gMTMsLy8gIyBvZiBzdWNjZXNzZnVsIE5vbl9EaXJlY3RlZCBUeCdzIChNU0RVKSBAIDFNQgorCUlQV19PUkRfU1RBVF9UWF9OT0RJUl9EQVRBMiwJLy8gIyBvZiBzdWNjZXNzZnVsIE5vbl9EaXJlY3RlZCBUeCdzIChNU0RVKSBAIDJNQgorCUlQV19PUkRfU1RBVF9UWF9OT0RJUl9EQVRBNV81LAkvLyAjIG9mIHN1Y2Nlc3NmdWwgTm9uX0RpcmVjdGVkIFR4J3MgKE1TRFUpIEAgNS41TUIKKwlJUFdfT1JEX1NUQVRfVFhfTk9ESVJfREFUQTExLAkvLyAjIG9mIHN1Y2Nlc3NmdWwgTm9uX0RpcmVjdGVkIFR4J3MgKE1TRFUpIEAgMTFNQgorCisJSVBXX09SRF9TVEFUX05VTExfREFUQSA9IDIxLAkvLyAjIG9mIHN1Y2Nlc3NmdWwgTlVMTCBkYXRhIFR4J3MKKwlJUFdfT1JEX1NUQVRfVFhfUlRTLAkgICAgICAgIC8vICMgb2Ygc3VjY2Vzc2Z1bCBUeCBSVFMKKwlJUFdfT1JEX1NUQVRfVFhfQ1RTLAkgICAgICAgIC8vICMgb2Ygc3VjY2Vzc2Z1bCBUeCBDVFMKKwlJUFdfT1JEX1NUQVRfVFhfQUNLLAkgICAgICAgIC8vICMgb2Ygc3VjY2Vzc2Z1bCBUeCBBQ0sKKwlJUFdfT1JEX1NUQVRfVFhfQVNTTiwJICAgICAgICAvLyAjIG9mIHN1Y2Nlc3NmdWwgQXNzb2NpYXRpb24gVHgncworCUlQV19PUkRfU1RBVF9UWF9BU1NOX1JFU1AsCS8vICMgb2Ygc3VjY2Vzc2Z1bCBBc3NvY2lhdGlvbiByZXNwb25zZSBUeCdzCisJSVBXX09SRF9TVEFUX1RYX1JFQVNTTiwJICAgICAgICAvLyAjIG9mIHN1Y2Nlc3NmdWwgUmVhc3NvY2lhdGlvbiBUeCdzCisJSVBXX09SRF9TVEFUX1RYX1JFQVNTTl9SRVNQLAkvLyAjIG9mIHN1Y2Nlc3NmdWwgUmVhc3NvY2lhdGlvbiByZXNwb25zZSBUeCdzCisJSVBXX09SRF9TVEFUX1RYX1BST0JFLAkgICAgICAgIC8vICMgb2YgcHJvYmVzIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZAorCUlQV19PUkRfU1RBVF9UWF9QUk9CRV9SRVNQLAkvLyAjIG9mIHByb2JlIHJlc3BvbnNlcyBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQKKwlJUFdfT1JEX1NUQVRfVFhfQkVBQ09OLAkgICAgICAgIC8vICMgb2YgdHggYmVhY29uCisJSVBXX09SRF9TVEFUX1RYX0FUSU0sCSAgICAgICAgLy8gIyBvZiBUeCBBVElNCisJSVBXX09SRF9TVEFUX1RYX0RJU0FTU04sCS8vICMgb2Ygc3VjY2Vzc2Z1bCBEaXNhc3NvY2lhdGlvbiBUWAorCUlQV19PUkRfU1RBVF9UWF9BVVRILAkgICAgICAgIC8vICMgb2Ygc3VjY2Vzc2Z1bCBBdXRoZW50aWNhdGlvbiBUeAorCUlQV19PUkRfU1RBVF9UWF9ERUFVVEgsCSAgICAgICAgLy8gIyBvZiBzdWNjZXNzZnVsIERlYXV0aGVudGljYXRpb24gVFgKKworCUlQV19PUkRfU1RBVF9UWF9UT1RBTF9CWVRFUyA9IDQxLC8vIFRvdGFsIHN1Y2Nlc3NmdWwgVHggZGF0YSBieXRlcworCUlQV19PUkRfU1RBVF9UWF9SRVRSSUVTLCAgICAgICAgIC8vICMgb2YgVHggcmV0cmllcworCUlQV19PUkRfU1RBVF9UWF9SRVRSWTEsICAgICAgICAgIC8vICMgb2YgVHggcmV0cmllcyBhdCAxTUJQUworCUlQV19PUkRfU1RBVF9UWF9SRVRSWTIsICAgICAgICAgIC8vICMgb2YgVHggcmV0cmllcyBhdCAyTUJQUworCUlQV19PUkRfU1RBVF9UWF9SRVRSWTVfNSwJIC8vICMgb2YgVHggcmV0cmllcyBhdCA1LjVNQlBTCisJSVBXX09SRF9TVEFUX1RYX1JFVFJZMTEsCSAvLyAjIG9mIFR4IHJldHJpZXMgYXQgMTFNQlBTCisKKwlJUFdfT1JEX1NUQVRfVFhfRkFJTFVSRVMgPSA1MSwJLy8gIyBvZiBUeCBGYWlsdXJlcworCUlQV19PUkRfU1RBVF9UWF9BQk9SVF9BVF9IT1AsCS8vTlMgLy8gIyBvZiBUeCdzIGFib3J0ZWQgYXQgaG9wIHRpbWUKKwlJUFdfT1JEX1NUQVRfVFhfTUFYX1RSSUVTX0lOX0hPUCwvLyAjIG9mIHRpbWVzIG1heCB0cmllcyBpbiBhIGhvcCBmYWlsZWQKKwlJUFdfT1JEX1NUQVRfVFhfQUJPUlRfTEFURV9ETUEsCS8vTlMgLy8gIyBvZiB0aW1lcyB0eCBhYm9ydGVkIGR1ZSB0byBsYXRlIGRtYSBzZXR1cAorCUlQV19PUkRfU1RBVF9UWF9BQk9SVF9TVFgsCS8vTlMgLy8gIyBvZiB0aW1lcyBiYWNrb2ZmIGFib3J0ZWQKKwlJUFdfT1JEX1NUQVRfVFhfRElTQVNTTl9GQUlMLAkvLyAjIG9mIHRpbWVzIGRpc2Fzc29jaWF0aW9uIGZhaWxlZAorCUlQV19PUkRfU1RBVF9UWF9FUlJfQ1RTLCAgICAgICAgIC8vICMgb2YgbWlzc2VkL2JhZCBDVFMgZnJhbWVzCisJSVBXX09SRF9TVEFUX1RYX0JQRFUsCSAgICAgICAgLy9OUyAvLyAjIG9mIHNwYW5uaW5nIHRyZWUgQlBEVXMgc2VudAorCUlQV19PUkRfU1RBVF9UWF9FUlJfQUNLLAkvLyAjIG9mIHR4IGVyciBkdWUgdG8gYWNrcworCisJLy8gUmVjZWl2ZSBzdGF0aXN0aWNzCisJSVBXX09SRF9TVEFUX1JYX0hPU1QgPSA2MSwJLy8gIyBvZiBwYWNrZXRzIHBhc3NlZCB0byBob3N0CisJSVBXX09SRF9TVEFUX1JYX0RJUl9EQVRBLAkvLyAjIG9mIGRpcmVjdGVkIHBhY2tldHMKKwlJUFdfT1JEX1NUQVRfUlhfRElSX0RBVEExLAkvLyAjIG9mIGRpcmVjdGVkIHBhY2tldHMgYXQgMU1CCisJSVBXX09SRF9TVEFUX1JYX0RJUl9EQVRBMiwJLy8gIyBvZiBkaXJlY3RlZCBwYWNrZXRzIGF0IDJNQgorCUlQV19PUkRfU1RBVF9SWF9ESVJfREFUQTVfNSwJLy8gIyBvZiBkaXJlY3RlZCBwYWNrZXRzIGF0IDUuNU1CCisJSVBXX09SRF9TVEFUX1JYX0RJUl9EQVRBMTEsCS8vICMgb2YgZGlyZWN0ZWQgcGFja2V0cyBhdCAxMU1CCisJSVBXX09SRF9TVEFUX1JYX0RJUl9EQVRBMjIsCS8vICMgb2YgZGlyZWN0ZWQgcGFja2V0cyBhdCAyMk1CCisKKwlJUFdfT1JEX1NUQVRfUlhfTk9ESVJfREFUQSA9IDcxLC8vICMgb2Ygbm9uZGlyZWN0ZWQgcGFja2V0cworCUlQV19PUkRfU1RBVF9SWF9OT0RJUl9EQVRBMSwJLy8gIyBvZiBub25kaXJlY3RlZCBwYWNrZXRzIGF0IDFNQgorCUlQV19PUkRfU1RBVF9SWF9OT0RJUl9EQVRBMiwJLy8gIyBvZiBub25kaXJlY3RlZCBwYWNrZXRzIGF0IDJNQgorCUlQV19PUkRfU1RBVF9SWF9OT0RJUl9EQVRBNV81LAkvLyAjIG9mIG5vbmRpcmVjdGVkIHBhY2tldHMgYXQgNS41TUIKKwlJUFdfT1JEX1NUQVRfUlhfTk9ESVJfREFUQTExLAkvLyAjIG9mIG5vbmRpcmVjdGVkIHBhY2tldHMgYXQgMTFNQgorCisJSVBXX09SRF9TVEFUX1JYX05VTExfREFUQSA9IDgwLAkvLyAjIG9mIG51bGwgZGF0YSByeCdzCisJSVBXX09SRF9TVEFUX1JYX1BPTEwsCS8vTlMgLy8gIyBvZiBwb2xsIHJ4CisJSVBXX09SRF9TVEFUX1JYX1JUUywJLy8gIyBvZiBSeCBSVFMKKwlJUFdfT1JEX1NUQVRfUlhfQ1RTLAkvLyAjIG9mIFJ4IENUUworCUlQV19PUkRfU1RBVF9SWF9BQ0ssCS8vICMgb2YgUnggQUNLCisJSVBXX09SRF9TVEFUX1JYX0NGRU5ELAkvLyAjIG9mIFJ4IENGIEVuZAorCUlQV19PUkRfU1RBVF9SWF9DRkVORF9BQ0ssCS8vICMgb2YgUnggQ0YgRW5kICsgQ0YgQWNrCisJSVBXX09SRF9TVEFUX1JYX0FTU04sCS8vICMgb2YgQXNzb2NpYXRpb24gUngncworCUlQV19PUkRfU1RBVF9SWF9BU1NOX1JFU1AsCS8vICMgb2YgQXNzb2NpYXRpb24gcmVzcG9uc2UgUngncworCUlQV19PUkRfU1RBVF9SWF9SRUFTU04sCS8vICMgb2YgUmVhc3NvY2lhdGlvbiBSeCdzCisJSVBXX09SRF9TVEFUX1JYX1JFQVNTTl9SRVNQLAkvLyAjIG9mIFJlYXNzb2NpYXRpb24gcmVzcG9uc2UgUngncworCUlQV19PUkRfU1RBVF9SWF9QUk9CRSwJLy8gIyBvZiBwcm9iZSBSeCdzCisJSVBXX09SRF9TVEFUX1JYX1BST0JFX1JFU1AsCS8vICMgb2YgcHJvYmUgcmVzcG9uc2UgUngncworCUlQV19PUkRfU1RBVF9SWF9CRUFDT04sCS8vICMgb2YgUnggYmVhY29uCisJSVBXX09SRF9TVEFUX1JYX0FUSU0sCS8vICMgb2YgUnggQVRJTQorCUlQV19PUkRfU1RBVF9SWF9ESVNBU1NOLAkvLyAjIG9mIGRpc2Fzc29jaWF0aW9uIFJ4CisJSVBXX09SRF9TVEFUX1JYX0FVVEgsCS8vICMgb2YgYXV0aGVudGljYXRpb24gUngKKwlJUFdfT1JEX1NUQVRfUlhfREVBVVRILAkvLyAjIG9mIGRlYXV0aGVudGljYXRpb24gUngKKworCUlQV19PUkRfU1RBVF9SWF9UT1RBTF9CWVRFUyA9IDEwMSwvLyBUb3RhbCByeCBkYXRhIGJ5dGVzIHJlY2VpdmVkCisJSVBXX09SRF9TVEFUX1JYX0VSUl9DUkMsCSAvLyAjIG9mIHBhY2tldHMgd2l0aCBSeCBDUkMgZXJyb3IKKwlJUFdfT1JEX1NUQVRfUlhfRVJSX0NSQzEsCSAvLyAjIG9mIFJ4IENSQyBlcnJvcnMgYXQgMU1CCisJSVBXX09SRF9TVEFUX1JYX0VSUl9DUkMyLAkgLy8gIyBvZiBSeCBDUkMgZXJyb3JzIGF0IDJNQgorCUlQV19PUkRfU1RBVF9SWF9FUlJfQ1JDNV81LAkgLy8gIyBvZiBSeCBDUkMgZXJyb3JzIGF0IDUuNU1CCisJSVBXX09SRF9TVEFUX1JYX0VSUl9DUkMxMSwJIC8vICMgb2YgUnggQ1JDIGVycm9ycyBhdCAxMU1CCisKKwlJUFdfT1JEX1NUQVRfUlhfRFVQTElDQVRFMSA9IDExMiwgLy8gIyBvZiBkdXBsaWNhdGUgcnggcGFja2V0cyBhdCAxTUIKKwlJUFdfT1JEX1NUQVRfUlhfRFVQTElDQVRFMiwJIC8vICMgb2YgZHVwbGljYXRlIHJ4IHBhY2tldHMgYXQgMk1CCisJSVBXX09SRF9TVEFUX1JYX0RVUExJQ0FURTVfNSwJIC8vICMgb2YgZHVwbGljYXRlIHJ4IHBhY2tldHMgYXQgNS41TUIKKwlJUFdfT1JEX1NUQVRfUlhfRFVQTElDQVRFMTEsCSAvLyAjIG9mIGR1cGxpY2F0ZSByeCBwYWNrZXRzIGF0IDExTUIKKwlJUFdfT1JEX1NUQVRfUlhfRFVQTElDQVRFID0gMTE5LCAvLyAjIG9mIGR1cGxpY2F0ZSByeCBwYWNrZXRzCisKKwlJUFdfT1JEX1BFUlNfREJfTE9DSyA9IDEyMCwJLy8gIyBsb2NraW5nIGZ3IHBlcm1hbmVudCAgZGIKKwlJUFdfT1JEX1BFUlNfREJfU0laRSwJLy8gIyBzaXplIG9mIGZ3IHBlcm1hbmVudCAgZGIKKwlJUFdfT1JEX1BFUlNfREJfQUREUiwJLy8gIyBhZGRyZXNzIG9mIGZ3IHBlcm1hbmVudCAgZGIKKwlJUFdfT1JEX1NUQVRfUlhfSU5WQUxJRF9QUk9UT0NPTCwJLy8gIyBvZiByeCBmcmFtZXMgd2l0aCBpbnZhbGlkIHByb3RvY29sCisJSVBXX09SRF9TWVNfQk9PVF9USU1FLAkvLyAjIEJvb3QgdGltZQorCUlQV19PUkRfU1RBVF9SWF9OT19CVUZGRVIsCS8vICMgb2YgcnggZnJhbWVzIHJlamVjdGVkIGR1ZSB0byBubyBidWZmZXIKKwlJUFdfT1JEX1NUQVRfUlhfQUJPUlRfTEFURV9ETUEsCS8vTlMgLy8gIyBvZiByeCBmcmFtZXMgcmVqZWN0ZWQgZHVlIHRvIGRtYSBzZXR1cCB0b28gbGF0ZQorCUlQV19PUkRfU1RBVF9SWF9BQk9SVF9BVF9IT1AsCS8vTlMgLy8gIyBvZiByeCBmcmFtZXMgYWJvcnRlZCBkdWUgdG8gaG9wCisJSVBXX09SRF9TVEFUX1JYX01JU1NJTkdfRlJBRywJLy8gIyBvZiByeCBmcmFtZXMgZHJvcHBlZCBkdWUgdG8gbWlzc2luZyBmcmFnbWVudAorCUlQV19PUkRfU1RBVF9SWF9PUlBIQU5fRlJBRywJLy8gIyBvZiByeCBmcmFtZXMgZHJvcHBlZCBkdWUgdG8gbm9uLXNlcXVlbnRpYWwgZnJhZ21lbnQKKwlJUFdfT1JEX1NUQVRfUlhfT1JQSEFOX0ZSQU1FLAkvLyAjIG9mIHJ4IGZyYW1lcyBkcm9wcGVkIGR1ZSB0byB1bm1hdGNoZWQgMXN0IGZyYW1lCisJSVBXX09SRF9TVEFUX1JYX0ZSQUdfQUdFT1VULAkvLyAjIG9mIHJ4IGZyYW1lcyBkcm9wcGVkIGR1ZSB0byB1bmNvbXBsZXRlZCBmcmFtZQorCUlQV19PUkRfU1RBVF9SWF9CQURfU1NJRCwJLy9OUyAvLyBCYWQgU1NJRCAodW51c2VkKQorCUlQV19PUkRfU1RBVF9SWF9JQ1ZfRVJST1JTLAkvLyAjIG9mIElDViBlcnJvcnMgZHVyaW5nIGRlY3J5cHRpb24KKworLy8gUFNQIFN0YXRpc3RpY3MKKwlJUFdfT1JEX1NUQVRfUFNQX1NVU1BFTlNJT04gPSAxMzcsLy8gIyBvZiB0aW1lcyBhZGFwdGVyIHN1c3BlbmRlZAorCUlQV19PUkRfU1RBVF9QU1BfQkNOX1RJTUVPVVQsCS8vICMgb2YgYmVhY29uIHRpbWVvdXQKKwlJUFdfT1JEX1NUQVRfUFNQX1BPTExfVElNRU9VVCwJLy8gIyBvZiBwb2xsIHJlc3BvbnNlIHRpbWVvdXRzCisJSVBXX09SRF9TVEFUX1BTUF9OT05ESVJfVElNRU9VVCwvLyAjIG9mIHRpbWVvdXRzIHdhaXRpbmcgZm9yIGxhc3QgYnJvYWRjYXN0L211dGljYXN0IHBrdAorCUlQV19PUkRfU1RBVF9QU1BfUlhfRFRJTVMsCS8vICMgb2YgUFNQIERUSU1zIHJlY2VpdmVkCisJSVBXX09SRF9TVEFUX1BTUF9SWF9USU1TLAkvLyAjIG9mIFBTUCBUSU1zIHJlY2VpdmVkCisJSVBXX09SRF9TVEFUX1BTUF9TVEFUSU9OX0lELAkvLyBQU1AgU3RhdGlvbiBJRAorCisvLyBBc3NvY2lhdGlvbiBhbmQgcm9hbWluZworCUlQV19PUkRfTEFTVF9BU1NOX1RJTUUgPSAxNDcsCS8vIFJUQyB0aW1lIG9mIGxhc3QgYXNzb2NpYXRpb24KKwlJUFdfT1JEX1NUQVRfUEVSQ0VOVF9NSVNTRURfQkNOUywvLyBjdXJyZW50IGNhbGN1bGF0aW9uIG9mICUgbWlzc2VkIGJlYWNvbnMKKwlJUFdfT1JEX1NUQVRfUEVSQ0VOVF9SRVRSSUVTLAkvLyBjdXJyZW50IGNhbGN1bGF0aW9uIG9mICUgbWlzc2VkIHR4IHJldHJpZXMKKwlJUFdfT1JEX0FTU09DSUFURURfQVBfUFRSLAkvLyBJZiBhc3NvY2lhdGVkLCB0aGlzIGlzIHB0ciB0byB0aGUgYXNzb2NpYXRlZAorCS8vIEFQIHRhYmxlIGVudHJ5LiBzZXQgdG8gMCBpZiBub3QgYXNzb2NpYXRlZAorCUlQV19PUkRfQVZBSUxBQkxFX0FQX0NOVCwJLy8gIyBvZiBBUCdzIGRlY3NyaWJlZCBpbiB0aGUgQVAgdGFibGUKKwlJUFdfT1JEX0FQX0xJU1RfUFRSLAkvLyBQdHIgdG8gbGlzdCBvZiBhdmFpbGFibGUgQVBzCisJSVBXX09SRF9TVEFUX0FQX0FTU05TLAkvLyAjIG9mIGFzc29jaWF0aW9ucworCUlQV19PUkRfU1RBVF9BU1NOX0ZBSUwsCS8vICMgb2YgYXNzb2NpYXRpb24gZmFpbHVyZXMKKwlJUFdfT1JEX1NUQVRfQVNTTl9SRVNQX0ZBSUwsCS8vICMgb2YgZmFpbHVyZXNkdWUgdG8gcmVzcG9uc2UgZmFpbAorCUlQV19PUkRfU1RBVF9GVUxMX1NDQU5TLAkvLyAjIG9mIGZ1bGwgc2NhbnMKKworCUlQV19PUkRfQ0FSRF9ESVNBQkxFRCwJLy8gIyBDYXJkIERpc2FibGVkCisJSVBXX09SRF9TVEFUX1JPQU1fSU5ISUJJVCwJLy8gIyBvZiB0aW1lcyByb2FtaW5nIHdhcyBpbmhpYml0ZWQgZHVlIHRvIG9uZ29pbmcgYWN0aXZpdHkKKwlJUFdfRklMTEVSXzQwLAorCUlQV19PUkRfUlNTSV9BVF9BU1NOID0gMTYwLAkvLyBSU1NJIG9mIGFzc29jaWF0ZWQgQVAgYXQgdGltZSBvZiBhc3NvY2lhdGlvbgorCUlQV19PUkRfU1RBVF9BU1NOX0NBVVNFMSwJLy8gIyBvZiByZWFzc29jaWF0aW9ucyBkdWUgdG8gbm8gdHggZnJvbSBBUCBpbiBsYXN0IE4KKwkvLyBob3BzIG9yIG5vIHByb2JfIHJlc3BvbnNlcyBpbiBsYXN0IDMgbWludXRlcworCUlQV19PUkRfU1RBVF9BU1NOX0NBVVNFMiwJLy8gIyBvZiByZWFzc29jaWF0aW9ucyBkdWUgdG8gcG9vciB0eC9yeCBxdWFsaXR5CisJSVBXX09SRF9TVEFUX0FTU05fQ0FVU0UzLAkvLyAjIG9mIHJlYXNzb2NpYXRpb25zIGR1ZSB0byB0eC9yeCBxdWFsaXR5IHdpdGggZXhjZXNzaXZlCisJLy8gbG9hZCBhdCB0aGUgQVAKKwlJUFdfT1JEX1NUQVRfQVNTTl9DQVVTRTQsCS8vICMgb2YgcmVhc3NvY2lhdGlvbnMgZHVlIHRvIEFQIFJTU0kgbGV2ZWwgZmVsbCBiZWxvdworCS8vIGVsaWdpYmxlIGdyb3VwCisJSVBXX09SRF9TVEFUX0FTU05fQ0FVU0U1LAkvLyAjIG9mIHJlYXNzb2NpYXRpb25zIGR1ZSB0byBsb2FkIGxldmVsaW5nCisJSVBXX09SRF9TVEFUX0FTU05fQ0FVU0U2LAkvL05TIC8vICMgb2YgcmVhc3NvY2lhdGlvbnMgZHVlIHRvIGRyb3BwZWQgYnkgQXAKKwlJUFdfRklMTEVSXzQxLAorCUlQV19GSUxMRVJfNDIsCisJSVBXX0ZJTExFUl80MywKKwlJUFdfT1JEX1NUQVRfQVVUSF9GQUlMLAkvLyAjIG9mIHRpbWVzIGF1dGhlbnRpY2F0aW9uIGZhaWxlZAorCUlQV19PUkRfU1RBVF9BVVRIX1JFU1BfRkFJTCwJLy8gIyBvZiB0aW1lcyBhdXRoZW50aWNhdGlvbiByZXNwb25zZSBmYWlsZWQKKwlJUFdfT1JEX1NUQVRJT05fVEFCTEVfQ05ULAkvLyAjIG9mIGVudHJpZXMgaW4gYXNzb2NpYXRpb24gdGFibGUKKworLy8gT3RoZXIgc3RhdGlzdGljcworCUlQV19PUkRfUlNTSV9BVkdfQ1VSUiA9IDE3MywJLy8gQ3VycmVudCBhdmcgUlNTSQorCUlQV19PUkRfU1RFU1RfUkVTVUxUU19DVVJSLAkvL05TIC8vIEN1cnJlbnQgc2VsZiB0ZXN0IHJlc3VsdHMgd29yZAorCUlQV19PUkRfU1RFU1RfUkVTVUxUU19DVU0sCS8vTlMgLy8gQ3VtbXVsYXRpdmUgc2VsZiB0ZXN0IHJlc3VsdHMgd29yZAorCUlQV19PUkRfU0VMRl9URVNUX1NUQVRVUywJLy9OUyAvLworCUlQV19PUkRfUE9XRVJfTUdNVF9NT0RFLAkvLyBQb3dlciBtb2RlIC0gMD1DQU0sIDE9UFNQCisJSVBXX09SRF9QT1dFUl9NR01UX0lOREVYLAkvL05TIC8vCisJSVBXX09SRF9DT1VOVFJZX0NPREUsCS8vIElFRUUgY291bnRyeSBjb2RlIGFzIHJlY3YnZCBmcm9tIGJlYWNvbgorCUlQV19PUkRfQ09VTlRSWV9DSEFOTkVMUywJLy8gY2hhbm5lbHMgc3Vwb3J0ZWQgYnkgY291bnRyeQorLy8gSVBXX09SRF9DT1VOVFJZX0NIQU5ORUxTOgorLy8gRm9yIDExYiB0aGUgbG93ZXIgMi1ieXRlIGFyZSB1c2VkIGZvciBjaGFubmVscyBmcm9tIDEtMTQKKy8vICAgYW5kIHRoZSBoaWdoZXIgMi1ieXRlIGFyZSBub3QgdXNlZC4KKwlJUFdfT1JEX1JFU0VUX0NOVCwJLy8gIyBvZiBhZGFwdGVyIHJlc2V0cyAod2FybSkKKwlJUFdfT1JEX0JFQUNPTl9JTlRFUlZBTCwJLy8gQmVhY29uIGludGVydmFsCisKKwlJUFdfT1JEX1BSSU5DRVRPTl9WRVJTSU9OID0gMTg0LAkvL05TIC8vIFByaW5jZXRvbiBWZXJzaW9uCisJSVBXX09SRF9BTlRFTk5BX0RJVkVSU0lUWSwJLy8gVFJVRSBpZiBhbnRlbm5hIGRpdmVyc2l0eSBpcyBkaXNhYmxlZAorCUlQV19PUkRfQ0NBX1JTU0ksCS8vTlMgLy8gQ0NBIFJTU0kgdmFsdWUgKGZhY3RvcnkgcHJvZ3JhbW1lZCkKKwlJUFdfT1JEX1NUQVRfRUVQUk9NX1VQREFURSwJLy9OUyAvLyAjIG9mIHRpbWVzIGNvbmZpZyBFRVBST00gdXBkYXRlZAorCUlQV19PUkRfRFRJTV9QRVJJT0QsCS8vICMgb2YgYmVhY29uIGludGVydmFscyBiZXR3ZWVuIERUSU1zCisJSVBXX09SRF9PVVJfRlJFUSwJLy8gY3VycmVudCByYWRpbyBmcmVxIGxvd2VyIGRpZ2l0cyAtIGNoYW5uZWwgSUQKKworCUlQV19PUkRfUlRDX1RJTUUgPSAxOTAsCS8vIGN1cnJlbnQgUlRDIHRpbWUKKwlJUFdfT1JEX1BPUlRfVFlQRSwJLy8gb3BlcmF0aW5nIG1vZGUKKwlJUFdfT1JEX0NVUlJFTlRfVFhfUkFURSwJLy8gY3VycmVudCB0eCByYXRlCisJSVBXX09SRF9TVVBQT1JURURfUkFURVMsCS8vIEJpdG1hcCBvZiBzdXBwb3J0ZWQgdHggcmF0ZXMKKwlJUFdfT1JEX0FUSU1fV0lORE9XLAkvLyBjdXJyZW50IEFUSU0gV2luZG93CisJSVBXX09SRF9CQVNJQ19SQVRFUywJLy8gYml0bWFwIG9mIGJhc2ljIHR4IHJhdGVzCisJSVBXX09SRF9OSUNfSElHSEVTVF9SQVRFLAkvLyBiaXRtYXAgb2YgYmFzaWMgdHggcmF0ZXMKKwlJUFdfT1JEX0FQX0hJR0hFU1RfUkFURSwJLy8gYml0bWFwIG9mIGJhc2ljIHR4IHJhdGVzCisJSVBXX09SRF9DQVBBQklMSVRJRVMsCS8vIE1hbmFnZW1lbnQgZnJhbWUgY2FwYWJpbGl0eSBmaWVsZAorCUlQV19PUkRfQVVUSF9UWVBFLAkvLyBUeXBlIG9mIGF1dGhlbnRpY2F0aW9uCisJSVBXX09SRF9SQURJT19UWVBFLAkvLyBBZGFwdGVyIGNhcmQgcGxhdGZvcm0gdHlwZQorCUlQV19PUkRfUlRTX1RIUkVTSE9MRCA9IDIwMSwJLy8gTWluIGxlbmd0aCBvZiBwYWNrZXQgYWZ0ZXIgd2hpY2ggUlRTIGhhbmRzaGFraW5nIGlzIHVzZWQKKwlJUFdfT1JEX0lOVF9NT0RFLAkvLyBJbnRlcm5hdGlvbmFsIG1vZGUKKwlJUFdfT1JEX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xELAkvLyBwcm90b2NvbCBmcmFnIHRocmVzaG9sZAorCUlQV19PUkRfRUVQUk9NX1NSQU1fREJfQkxPQ0tfU1RBUlRfQUREUkVTUywJLy8gRUVQUk9NIG9mZnNldCBpbiBTUkFNCisJSVBXX09SRF9FRVBST01fU1JBTV9EQl9CTE9DS19TSVpFLAkvLyBFRVBST00gc2l6ZSBpbiBTUkFNCisJSVBXX09SRF9FRVBST01fU0tVX0NBUEFCSUxJVFksCS8vIEVFUFJPTSBTS1UgQ2FwYWJpbGl0eSAgICAyMDYgPQorCUlQV19PUkRfRUVQUk9NX0lCU1NfMTFCX0NIQU5ORUxTLAkvLyBFRVBST00gSUJTUyAxMWIgY2hhbm5lbCBzZXQKKworCUlQV19PUkRfTUFDX1ZFUlNJT04gPSAyMDksCS8vIE1BQyBWZXJzaW9uCisJSVBXX09SRF9NQUNfUkVWSVNJT04sCS8vIE1BQyBSZXZpc2lvbgorCUlQV19PUkRfUkFESU9fVkVSU0lPTiwJLy8gUmFkaW8gVmVyc2lvbgorCUlQV19PUkRfTklDX01BTkZfREFURV9USU1FLAkvLyBNQU5GIERhdGUvVGltZSBTVEFNUAorCUlQV19PUkRfVUNPREVfVkVSU0lPTiwJLy8gVWNvZGUgVmVyc2lvbgorCUlQV19PUkRfSFdfUkZfU1dJVENIX1NUQVRFID0gMjE0LAkvLyBIVyBSRiBLaWxsIFN3aXRjaCBTdGF0ZQorfSBPUkRJTkFMVEFCTEUxOworCisvLyBvcmRpbmFsIHRhYmxlIDIKKy8vIFZhcmlhYmxlIGxlbmd0aCBkYXRhOgorI2RlZmluZSBJUFdfRklSU1RfVkFSSUFCTEVfTEVOR1RIX09SRElOQUwgICAxMDAxCisKK3R5cGVkZWYgZW51bSBfT1JESU5BTF9UQUJMRV8yIHsJLy8gTlMgLSBtZWFucyBOb3QgU3VwcG9ydGVkIGJ5IEZXCisJSVBXX09SRF9TVEFUX0JBU0UgPSAxMDAwLAkvLyBjb250YWlucyBudW1iZXIgb2YgdmFyaWFibGUgT1JEcworCUlQV19PUkRfU1RBVF9BREFQVEVSX01BQyA9IDEwMDEsCS8vIDYgYnl0ZXM6IG91ciBhZGFwdGVyIE1BQyBhZGRyZXNzCisJSVBXX09SRF9TVEFUX1BSRUZFUlJFRF9CU1NJRCA9IDEwMDIsCS8vIDYgYnl0ZXM6IEJTU0lEIG9mIHRoZSBwcmVmZXJyZWQgQVAKKwlJUFdfT1JEX1NUQVRfTUFOREFUT1JZX0JTU0lEID0gMTAwMywJLy8gNiBieXRlczogQlNTSUQgb2YgdGhlIG1hbmRhdG9yeSBBUAorCUlQV19GSUxMXzEsCQkvL05TIC8vCisJSVBXX09SRF9TVEFUX0NPVU5UUllfVEVYVCA9IDEwMDUsCS8vIDM2IGJ5dGVzOiBDb3VudHJ5IG5hbWUgdGV4dCwgRmlyc3QgdHdvIGJ5dGVzIGFyZSBDb3VudHJ5IGNvZGUKKwlJUFdfT1JEX1NUQVRfQVNTTl9TU0lEID0gMTAwNiwJLy8gMzIgYnl0ZXM6IEVTU0lEIFN0cmluZworCUlQV19PUkRfU1RBVElPTl9UQUJMRSA9IDEwMDcsCS8vID8gYnl0ZXM6IFN0YXRpb24vQVAgdGFibGUgKHZpYSBEaXJlY3QgU1NJRCBTY2FucykKKwlJUFdfT1JEX1NUQVRfU1dFRVBfVEFCTEUgPSAxMDA4LAkvLyA/IGJ5dGVzOiBTd2VlcC9Ib3N0IFRhYmxlIHRhYmxlICh2aWEgQnJvYWRjYXN0IFNjYW5zKQorCUlQV19PUkRfU1RBVF9ST0FNX0xPRyA9IDEwMDksCS8vID8gYnl0ZXM6IFJvYW1pbmcgbG9nCisJSVBXX09SRF9TVEFUX1JBVEVfTE9HID0gMTAxMCwJLy9OUyAvLyAwIGJ5dGVzOiBSYXRlIGxvZworCUlQV19PUkRfU1RBVF9GSUZPID0gMTAxMSwJLy9OUyAvLyAwIGJ5dGVzOiBGaWZvIGJ1ZmZlciBkYXRhIHN0cnVjdHVyZXMKKwlJUFdfT1JEX1NUQVRfRldfVkVSX05VTSA9IDEwMTIsCS8vIDE0IGJ5dGVzOiBmdyB2ZXJzaW9uIElEIHN0cmluZyBhcyBpbiAoYS5iYi5jY2M7ICIwLjA4LjAxMSIpCisJSVBXX09SRF9TVEFUX0ZXX0RBVEUgPSAxMDEzLAkvLyAxNCBieXRlczogZncgZGF0ZSBzdHJpbmcgKG1tbSBkZCB5eXl5OyAiTWFyIDEzIDIwMDIiKQorCUlQV19PUkRfU1RBVF9BU1NOX0FQX0JTU0lEID0gMTAxNCwJLy8gNiBieXRlczogTUFDIGFkZHJlc3Mgb2YgYXNzb2NpYXRlZCBBUAorCUlQV19PUkRfU1RBVF9ERUJVRyA9IDEwMTUsCS8vTlMgLy8gPyBieXRlczoKKwlJUFdfT1JEX1NUQVRfTklDX0JQQV9OVU0gPSAxMDE2LAkvLyAxMSBieXRlczogTklDIEJQQSBudW1iZXIgaW4gQVNDSUkKKwlJUFdfT1JEX1NUQVRfVUNPREVfREFURSA9IDEwMTcsCS8vIDUgYnl0ZXM6IHVDb2RlIGRhdGUKKwlJUFdfT1JEX1NFQ1VSSVRZX05HT1RJQVRJT05fUkVTVUxUID0gMTAxOCwKK30gT1JESU5BTFRBQkxFMjsJCS8vIE5TIC0gbWVhbnMgTm90IFN1cHBvcnRlZCBieSBGVworCisjZGVmaW5lIElQV19MQVNUX1ZBUklBQkxFX0xFTkdUSF9PUkRJTkFMICAgMTAxOAorCisjaWZuZGVmIFdJUkVMRVNTX1NQWQorI2RlZmluZSBXSVJFTEVTU19TUFkJCS8vIGVuYWJsZSBpd3NweSBzdXBwb3J0CisjZW5kaWYKKworI2RlZmluZSBJUFdfSE9TVF9GV19TSEFSRURfQVJFQTAgCTB4MDAwMmYyMDAKKyNkZWZpbmUgSVBXX0hPU1RfRldfU0hBUkVEX0FSRUEwX0VORCAJMHgwMDAyZjUxMAkvLyAweDMxMCBieXRlcworCisjZGVmaW5lIElQV19IT1NUX0ZXX1NIQVJFRF9BUkVBMSAJMHgwMDAyZjYxMAorI2RlZmluZSBJUFdfSE9TVF9GV19TSEFSRURfQVJFQTFfRU5EIAkweDAwMDJmNjMwCS8vIDB4MjAgYnl0ZXMKKworI2RlZmluZSBJUFdfSE9TVF9GV19TSEFSRURfQVJFQTIgCTB4MDAwMmZhMDAKKyNkZWZpbmUgSVBXX0hPU1RfRldfU0hBUkVEX0FSRUEyX0VORCAJMHgwMDAyZmEyMAkvLyAweDIwIGJ5dGVzCisKKyNkZWZpbmUgSVBXX0hPU1RfRldfU0hBUkVEX0FSRUEzIAkweDAwMDJmYzAwCisjZGVmaW5lIElQV19IT1NUX0ZXX1NIQVJFRF9BUkVBM19FTkQgCTB4MDAwMmZjMTAJLy8gMHgxMCBieXRlcworCisjZGVmaW5lIElQV19IT1NUX0ZXX0lOVEVSUlVQVF9BUkVBIAkweDAwMDJmZjgwCisjZGVmaW5lIElQV19IT1NUX0ZXX0lOVEVSUlVQVF9BUkVBX0VORCAJMHgwMDAzMDAwMAkvLyAweDgwIGJ5dGVzCisKK3N0cnVjdCBpcHcyMTAwX2Z3X2NodW5rIHsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJbG9uZyBsZW47CisJbG9uZyBwb3M7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IGlwdzIxMDBfZndfY2h1bmtfc2V0IHsKKyAgIAljb25zdCB2b2lkICpkYXRhOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKK307CisKK3N0cnVjdCBpcHcyMTAwX2Z3IHsKKwlpbnQgdmVyc2lvbjsKKwlzdHJ1Y3QgaXB3MjEwMF9md19jaHVua19zZXQgZnc7CisJc3RydWN0IGlwdzIxMDBfZndfY2h1bmtfc2V0IHVjOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7Cit9OworCisjZGVmaW5lIE1BWF9GV19WRVJTSU9OX0xFTiAxNAorCisjZW5kaWYgLyogX0lQVzIxMDBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjI3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKQEAgLTAsMCArMSw3MzgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIDgwMi4xMSBzdGF0dXMgY29kZSBwb3J0aW9uIG9mIHRoaXMgZmlsZSBmcm9tIGV0aGVyZWFsLTAuMTAuNjoKKyAgICBDb3B5cmlnaHQgMjAwMCwgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgorICAgIEV0aGVyZWFsIC0gTmV0d29yayB0cmFmZmljIGFuYWx5emVyCisgICAgQnkgR2VyYWxkIENvbWJzIDxnZXJhbGRAZXRoZXJlYWwuY29tPgorICAgIENvcHlyaWdodCAxOTk4IEdlcmFsZCBDb21icworCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgSmFtZXMgUC4gS2V0cmVub3MgPGlwdzIxMDAtYWRtaW5AbGludXguaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImlwdzIyMDAuaCIKKworI2RlZmluZSBJUFcyMjAwX1ZFUlNJT04gIjEuMC4wIgorI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JIkludGVsKFIpIFBSTy9XaXJlbGVzcyAyMjAwLzI5MTUgTmV0d29yayBEcml2ZXIiCisjZGVmaW5lIERSVl9DT1BZUklHSFQJIkNvcHlyaWdodChjKSAyMDAzLTIwMDQgSW50ZWwgQ29ycG9yYXRpb24iCisjZGVmaW5lIERSVl9WRVJTSU9OICAgICBJUFcyMjAwX1ZFUlNJT04KKworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK3N0YXRpYyBpbnQgY2hhbm5lbCA9IDA7CitzdGF0aWMgY2hhciAqaWZuYW1lOworc3RhdGljIGludCBtb2RlID0gMDsKKworc3RhdGljIHUzMiBpcHdfZGVidWdfbGV2ZWw7CitzdGF0aWMgaW50IGFzc29jaWF0ZSA9IDE7CitzdGF0aWMgaW50IGF1dG9fY3JlYXRlID0gMTsKK3N0YXRpYyBpbnQgZGlzYWJsZSA9IDA7CitzdGF0aWMgY29uc3QgY2hhciBpcHdfbW9kZXNbXSA9IHsKKwknYScsICdiJywgJ2cnLCAnPycKK307CisKK3N0YXRpYyB2b2lkIGlwd19yeChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpOworc3RhdGljIGludCBpcHdfcXVldWVfdHhfcmVjbGFpbShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCisJCQkJc3RydWN0IGNseDJfdHhfcXVldWUgKnR4cSwgaW50IHFpbmRleCk7CitzdGF0aWMgaW50IGlwd19xdWV1ZV9yZXNldChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpOworCitzdGF0aWMgaW50IGlwd19xdWV1ZV90eF9oY21kKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgaW50IGhjbWQsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgaW50IGxlbiwgaW50IHN5bmMpOworCitzdGF0aWMgdm9pZCBpcHdfdHhfcXVldWVfZnJlZShzdHJ1Y3QgaXB3X3ByaXYgKik7CisKK3N0YXRpYyBzdHJ1Y3QgaXB3X3J4X3F1ZXVlICppcHdfcnhfcXVldWVfYWxsb2Moc3RydWN0IGlwd19wcml2ICopOworc3RhdGljIHZvaWQgaXB3X3J4X3F1ZXVlX2ZyZWUoc3RydWN0IGlwd19wcml2ICosIHN0cnVjdCBpcHdfcnhfcXVldWUgKik7CitzdGF0aWMgdm9pZCBpcHdfcnhfcXVldWVfcmVwbGVuaXNoKHZvaWQgKik7CisKK3N0YXRpYyBpbnQgaXB3X3VwKHN0cnVjdCBpcHdfcHJpdiAqKTsKK3N0YXRpYyB2b2lkIGlwd19kb3duKHN0cnVjdCBpcHdfcHJpdiAqKTsKK3N0YXRpYyBpbnQgaXB3X2NvbmZpZyhzdHJ1Y3QgaXB3X3ByaXYgKik7CitzdGF0aWMgaW50IGluaXRfc3VwcG9ydGVkX3JhdGVzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKKwkJCQlzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyAqcHJhdGVzKTsKKworc3RhdGljIHU4IGJhbmRfYl9hY3RpdmVfY2hhbm5lbFtNQVhfQl9DSEFOTkVMU10gPSB7CisJMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAwCit9Oworc3RhdGljIHU4IGJhbmRfYV9hY3RpdmVfY2hhbm5lbFtNQVhfQV9DSEFOTkVMU10gPSB7CisJMzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1LCA1MiwgNTYsIDYwLCA2NCwgMAorfTsKKworc3RhdGljIGludCBpc192YWxpZF9jaGFubmVsKGludCBtb2RlX21hc2ssIGludCBjaGFubmVsKQoreworCWludCBpOworCisJaWYgKCFjaGFubmVsKQorCQlyZXR1cm4gMDsKKworCWlmIChtb2RlX21hc2sgJiBJRUVFX0EpCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQV9DSEFOTkVMUzsgaSsrKQorCQkJaWYgKGJhbmRfYV9hY3RpdmVfY2hhbm5lbFtpXSA9PSBjaGFubmVsKQorCQkJCXJldHVybiBJRUVFX0E7CisKKwlpZiAobW9kZV9tYXNrICYgKElFRUVfQiB8IElFRUVfRykpCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQl9DSEFOTkVMUzsgaSsrKQorCQkJaWYgKGJhbmRfYl9hY3RpdmVfY2hhbm5lbFtpXSA9PSBjaGFubmVsKQorCQkJCXJldHVybiBtb2RlX21hc2sgJiAoSUVFRV9CIHwgSUVFRV9HKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqc25wcmludF9saW5lKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICBjb25zdCB1OCAqIGRhdGEsIHUzMiBsZW4sIHUzMiBvZnMpCit7CisJaW50IG91dCwgaSwgaiwgbDsKKwljaGFyIGM7CisKKwlvdXQgPSBzbnByaW50ZihidWYsIGNvdW50LCAiJTA4WCIsIG9mcyk7CisKKwlmb3IgKGwgPSAwLCBpID0gMDsgaSA8IDI7IGkrKykgeworCQlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBjb3VudCAtIG91dCwgIiAiKTsKKwkJZm9yIChqID0gMDsgaiA8IDggJiYgbCA8IGxlbjsgaisrLCBsKyspCisJCQlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBjb3VudCAtIG91dCwgIiUwMlggIiwKKwkJCQkJZGF0YVsoaSAqIDggKyBqKV0pOworCQlmb3IgKDsgaiA8IDg7IGorKykKKwkJCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGNvdW50IC0gb3V0LCAiICAgIik7CisJfQorCisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgY291bnQgLSBvdXQsICIgIik7CisJZm9yIChsID0gMCwgaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgY291bnQgLSBvdXQsICIgIik7CisJCWZvciAoaiA9IDA7IGogPCA4ICYmIGwgPCBsZW47IGorKywgbCsrKSB7CisJCQljID0gZGF0YVsoaSAqIDggKyBqKV07CisJCQlpZiAoIWlzYXNjaWkoYykgfHwgIWlzcHJpbnQoYykpCisJCQkJYyA9ICcuJzsKKworCQkJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgY291bnQgLSBvdXQsICIlYyIsIGMpOworCQl9CisKKwkJZm9yICg7IGogPCA4OyBqKyspCisJCQlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBjb3VudCAtIG91dCwgIiAiKTsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZCBwcmludGtfYnVmKGludCBsZXZlbCwgY29uc3QgdTggKiBkYXRhLCB1MzIgbGVuKQoreworCWNoYXIgbGluZVs4MV07CisJdTMyIG9mcyA9IDA7CisJaWYgKCEoaXB3X2RlYnVnX2xldmVsICYgbGV2ZWwpKQorCQlyZXR1cm47CisKKwl3aGlsZSAobGVuKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwKKwkJICAgICAgIHNucHJpbnRfbGluZShsaW5lLCBzaXplb2YobGluZSksICZkYXRhW29mc10sCisJCQkJICAgIG1pbihsZW4sIDE2VSksIG9mcykpOworCQlvZnMgKz0gMTY7CisJCWxlbiAtPSBtaW4obGVuLCAxNlUpOworCX0KK30KKworc3RhdGljIHUzMiBfaXB3X3JlYWRfcmVnMzIoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgcmVnKTsKKyNkZWZpbmUgaXB3X3JlYWRfcmVnMzIoYSwgYikgX2lwd19yZWFkX3JlZzMyKGEsIGIpCisKK3N0YXRpYyB1OCBfaXB3X3JlYWRfcmVnOChzdHJ1Y3QgaXB3X3ByaXYgKmlwdywgdTMyIHJlZyk7CisjZGVmaW5lIGlwd19yZWFkX3JlZzgoYSwgYikgX2lwd19yZWFkX3JlZzgoYSwgYikKKworc3RhdGljIHZvaWQgX2lwd193cml0ZV9yZWc4KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTggdmFsdWUpOworc3RhdGljIGlubGluZSB2b2lkIGlwd193cml0ZV9yZWc4KHN0cnVjdCBpcHdfcHJpdiAqYSwgdTMyIGIsIHU4IGMpCit7CisJSVBXX0RFQlVHX0lPKCIlcyAlZDogd3JpdGVfaW5kaXJlY3Q4KDB4JTA4WCwgMHglMDhYKVxuIiwgX19GSUxFX18sCisJCSAgICAgX19MSU5FX18sICh1MzIpIChiKSwgKHUzMikgKGMpKTsKKwlfaXB3X3dyaXRlX3JlZzgoYSwgYiwgYyk7Cit9CisKK3N0YXRpYyB2b2lkIF9pcHdfd3JpdGVfcmVnMTYoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgcmVnLCB1MTYgdmFsdWUpOworc3RhdGljIGlubGluZSB2b2lkIGlwd193cml0ZV9yZWcxNihzdHJ1Y3QgaXB3X3ByaXYgKmEsIHUzMiBiLCB1MTYgYykKK3sKKwlJUFdfREVCVUdfSU8oIiVzICVkOiB3cml0ZV9pbmRpcmVjdDE2KDB4JTA4WCwgMHglMDhYKVxuIiwgX19GSUxFX18sCisJCSAgICAgX19MSU5FX18sICh1MzIpIChiKSwgKHUzMikgKGMpKTsKKwlfaXB3X3dyaXRlX3JlZzE2KGEsIGIsIGMpOworfQorCitzdGF0aWMgdm9pZCBfaXB3X3dyaXRlX3JlZzMyKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIHZhbHVlKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHdfd3JpdGVfcmVnMzIoc3RydWN0IGlwd19wcml2ICphLCB1MzIgYiwgdTMyIGMpCit7CisJSVBXX0RFQlVHX0lPKCIlcyAlZDogd3JpdGVfaW5kaXJlY3QzMigweCUwOFgsIDB4JTA4WClcbiIsIF9fRklMRV9fLAorCQkgICAgIF9fTElORV9fLCAodTMyKSAoYiksICh1MzIpIChjKSk7CisJX2lwd193cml0ZV9yZWczMihhLCBiLCBjKTsKK30KKworI2RlZmluZSBfaXB3X3dyaXRlOChpcHcsIG9mcywgdmFsKSB3cml0ZWIoKHZhbCksIChpcHcpLT5od19iYXNlICsgKG9mcykpCisjZGVmaW5lIGlwd193cml0ZTgoaXB3LCBvZnMsIHZhbCkgXAorIElQV19ERUJVR19JTygiJXMgJWQ6IHdyaXRlX2RpcmVjdDgoMHglMDhYLCAweCUwOFgpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sICh1MzIpKG9mcyksICh1MzIpKHZhbCkpOyBcCisgX2lwd193cml0ZTgoaXB3LCBvZnMsIHZhbCkKKworI2RlZmluZSBfaXB3X3dyaXRlMTYoaXB3LCBvZnMsIHZhbCkgd3JpdGV3KCh2YWwpLCAoaXB3KS0+aHdfYmFzZSArIChvZnMpKQorI2RlZmluZSBpcHdfd3JpdGUxNihpcHcsIG9mcywgdmFsKSBcCisgSVBXX0RFQlVHX0lPKCIlcyAlZDogd3JpdGVfZGlyZWN0MTYoMHglMDhYLCAweCUwOFgpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sICh1MzIpKG9mcyksICh1MzIpKHZhbCkpOyBcCisgX2lwd193cml0ZTE2KGlwdywgb2ZzLCB2YWwpCisKKyNkZWZpbmUgX2lwd193cml0ZTMyKGlwdywgb2ZzLCB2YWwpIHdyaXRlbCgodmFsKSwgKGlwdyktPmh3X2Jhc2UgKyAob2ZzKSkKKyNkZWZpbmUgaXB3X3dyaXRlMzIoaXB3LCBvZnMsIHZhbCkgXAorIElQV19ERUJVR19JTygiJXMgJWQ6IHdyaXRlX2RpcmVjdDMyKDB4JTA4WCwgMHglMDhYKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCAodTMyKShvZnMpLCAodTMyKSh2YWwpKTsgXAorIF9pcHdfd3JpdGUzMihpcHcsIG9mcywgdmFsKQorCisjZGVmaW5lIF9pcHdfcmVhZDgoaXB3LCBvZnMpIHJlYWRiKChpcHcpLT5od19iYXNlICsgKG9mcykpCitzdGF0aWMgaW5saW5lIHU4IF9faXB3X3JlYWQ4KGNoYXIgKmYsIHUzMiBsLCBzdHJ1Y3QgaXB3X3ByaXYgKmlwdywgdTMyIG9mcykKK3sKKwlJUFdfREVCVUdfSU8oIiVzICVkOiByZWFkX2RpcmVjdDgoMHglMDhYKVxuIiwgZiwgbCwgKHUzMikgKG9mcykpOworCXJldHVybiBfaXB3X3JlYWQ4KGlwdywgb2ZzKTsKK30KKworI2RlZmluZSBpcHdfcmVhZDgoaXB3LCBvZnMpIF9faXB3X3JlYWQ4KF9fRklMRV9fLCBfX0xJTkVfXywgaXB3LCBvZnMpCisKKyNkZWZpbmUgX2lwd19yZWFkMTYoaXB3LCBvZnMpIHJlYWR3KChpcHcpLT5od19iYXNlICsgKG9mcykpCitzdGF0aWMgaW5saW5lIHUxNiBfX2lwd19yZWFkMTYoY2hhciAqZiwgdTMyIGwsIHN0cnVjdCBpcHdfcHJpdiAqaXB3LCB1MzIgb2ZzKQoreworCUlQV19ERUJVR19JTygiJXMgJWQ6IHJlYWRfZGlyZWN0MTYoMHglMDhYKVxuIiwgZiwgbCwgKHUzMikgKG9mcykpOworCXJldHVybiBfaXB3X3JlYWQxNihpcHcsIG9mcyk7Cit9CisKKyNkZWZpbmUgaXB3X3JlYWQxNihpcHcsIG9mcykgX19pcHdfcmVhZDE2KF9fRklMRV9fLCBfX0xJTkVfXywgaXB3LCBvZnMpCisKKyNkZWZpbmUgX2lwd19yZWFkMzIoaXB3LCBvZnMpIHJlYWRsKChpcHcpLT5od19iYXNlICsgKG9mcykpCitzdGF0aWMgaW5saW5lIHUzMiBfX2lwd19yZWFkMzIoY2hhciAqZiwgdTMyIGwsIHN0cnVjdCBpcHdfcHJpdiAqaXB3LCB1MzIgb2ZzKQoreworCUlQV19ERUJVR19JTygiJXMgJWQ6IHJlYWRfZGlyZWN0MzIoMHglMDhYKVxuIiwgZiwgbCwgKHUzMikgKG9mcykpOworCXJldHVybiBfaXB3X3JlYWQzMihpcHcsIG9mcyk7Cit9CisKKyNkZWZpbmUgaXB3X3JlYWQzMihpcHcsIG9mcykgX19pcHdfcmVhZDMyKF9fRklMRV9fLCBfX0xJTkVfXywgaXB3LCBvZnMpCisKK3N0YXRpYyB2b2lkIF9pcHdfcmVhZF9pbmRpcmVjdChzdHJ1Y3QgaXB3X3ByaXYgKiwgdTMyLCB1OCAqLCBpbnQpOworI2RlZmluZSBpcHdfcmVhZF9pbmRpcmVjdChhLCBiLCBjLCBkKSBcCisJSVBXX0RFQlVHX0lPKCIlcyAlZDogcmVhZF9pbmRkaXJlY3QoMHglMDhYKSAlZCBieXRlc1xuIiwgX19GSUxFX18sIF9fTElORV9fLCAodTMyKShiKSwgZCk7IFwKKwlfaXB3X3JlYWRfaW5kaXJlY3QoYSwgYiwgYywgZCkKKworc3RhdGljIHZvaWQgX2lwd193cml0ZV9pbmRpcmVjdChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiBhZGRyLCB1OCAqIGRhdGEsCisJCQkJaW50IG51bSk7CisjZGVmaW5lIGlwd193cml0ZV9pbmRpcmVjdChhLCBiLCBjLCBkKSBcCisJSVBXX0RFQlVHX0lPKCIlcyAlZDogd3JpdGVfaW5kaXJlY3QoMHglMDhYKSAlZCBieXRlc1xuIiwgX19GSUxFX18sIF9fTElORV9fLCAodTMyKShiKSwgZCk7IFwKKyAgICAgICAgX2lwd193cml0ZV9pbmRpcmVjdChhLCBiLCBjLCBkKQorCisvKiBpbmRpcmVjdCB3cml0ZSBzICovCitzdGF0aWMgdm9pZCBfaXB3X3dyaXRlX3JlZzMyKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIHZhbHVlKQoreworCUlQV19ERUJVR19JTygiICVwIDogcmVnID0gMHglOFggOiB2YWx1ZSA9IDB4JThYXG4iLCBwcml2LCByZWcsIHZhbHVlKTsKKwlfaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0lORElSRUNUX0FERFIsIHJlZyk7CisJX2lwd193cml0ZTMyKHByaXYsIENYMl9JTkRJUkVDVF9EQVRBLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9pcHdfd3JpdGVfcmVnOChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiByZWcsIHU4IHZhbHVlKQoreworCUlQV19ERUJVR19JTygiIHJlZyA9IDB4JThYIDogdmFsdWUgPSAweCU4WFxuIiwgcmVnLCB2YWx1ZSk7CisJX2lwd193cml0ZTMyKHByaXYsIENYMl9JTkRJUkVDVF9BRERSLCByZWcgJiBDWDJfSU5ESVJFQ1RfQUREUl9NQVNLKTsKKwlfaXB3X3dyaXRlOChwcml2LCBDWDJfSU5ESVJFQ1RfREFUQSwgdmFsdWUpOworCUlQV19ERUJVR19JTygiIHJlZyA9IDB4JThsWCA6IHZhbHVlID0gMHglOFhcbiIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpKHByaXYtPmh3X2Jhc2UgKyBDWDJfSU5ESVJFQ1RfREFUQSksIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgX2lwd193cml0ZV9yZWcxNihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiByZWcsIHUxNiB2YWx1ZSkKK3sKKwlJUFdfREVCVUdfSU8oIiByZWcgPSAweCU4WCA6IHZhbHVlID0gMHglOFhcbiIsIHJlZywgdmFsdWUpOworCV9pcHdfd3JpdGUzMihwcml2LCBDWDJfSU5ESVJFQ1RfQUREUiwgcmVnICYgQ1gyX0lORElSRUNUX0FERFJfTUFTSyk7CisJX2lwd193cml0ZTE2KHByaXYsIENYMl9JTkRJUkVDVF9EQVRBLCB2YWx1ZSk7Cit9CisKKy8qIGluZGlyZWN0IHJlYWQgcyAqLworCitzdGF0aWMgdTggX2lwd19yZWFkX3JlZzgoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgcmVnKQoreworCXUzMiB3b3JkOworCV9pcHdfd3JpdGUzMihwcml2LCBDWDJfSU5ESVJFQ1RfQUREUiwgcmVnICYgQ1gyX0lORElSRUNUX0FERFJfTUFTSyk7CisJSVBXX0RFQlVHX0lPKCIgcmVnID0gMHglOFggOiBcbiIsIHJlZyk7CisJd29yZCA9IF9pcHdfcmVhZDMyKHByaXYsIENYMl9JTkRJUkVDVF9EQVRBKTsKKwlyZXR1cm4gKHdvcmQgPj4gKChyZWcgJiAweDMpICogOCkpICYgMHhmZjsKK30KKworc3RhdGljIHUzMiBfaXB3X3JlYWRfcmVnMzIoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgcmVnKQoreworCXUzMiB2YWx1ZTsKKworCUlQV19ERUJVR19JTygiJXAgOiByZWcgPSAweCUwOHhcbiIsIHByaXYsIHJlZyk7CisKKwlfaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0lORElSRUNUX0FERFIsIHJlZyk7CisJdmFsdWUgPSBfaXB3X3JlYWQzMihwcml2LCBDWDJfSU5ESVJFQ1RfREFUQSk7CisJSVBXX0RFQlVHX0lPKCIgcmVnID0gMHglNFggOiB2YWx1ZSA9IDB4JTR4IFxuIiwgcmVnLCB2YWx1ZSk7CisJcmV0dXJuIHZhbHVlOworfQorCisvKiBpdGVyYXRpdmUvYXV0by1pbmNyZW1lbnQgMzIgYml0IHJlYWRzIGFuZCB3cml0ZXMgKi8KK3N0YXRpYyB2b2lkIF9pcHdfcmVhZF9pbmRpcmVjdChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiBhZGRyLCB1OCAqIGJ1ZiwKKwkJCSAgICAgICBpbnQgbnVtKQoreworCXUzMiBhbGlnbmVkX2FkZHIgPSBhZGRyICYgQ1gyX0lORElSRUNUX0FERFJfTUFTSzsKKwl1MzIgZGlmX2xlbiA9IGFkZHIgLSBhbGlnbmVkX2FkZHI7CisJdTMyIGFsaWduZWRfbGVuOworCXUzMiBpOworCisJSVBXX0RFQlVHX0lPKCJhZGRyID0gJWksIGJ1ZiA9ICVwLCBudW0gPSAlaVxuIiwgYWRkciwgYnVmLCBudW0pOworCisJLyogUmVhZCB0aGUgZmlyc3QgbmliYmxlIGJ5dGUgYnkgYnl0ZSAqLworCWlmICh1bmxpa2VseShkaWZfbGVuKSkgeworCQkvKiBTdGFydCByZWFkaW5nIGF0IGFsaWduZWRfYWRkciArIGRpZl9sZW4gKi8KKwkJX2lwd193cml0ZTMyKHByaXYsIENYMl9JTkRJUkVDVF9BRERSLCBhbGlnbmVkX2FkZHIpOworCQlmb3IgKGkgPSBkaWZfbGVuOyBpIDwgNDsgaSsrLCBidWYrKykKKwkJCSpidWYgPSBfaXB3X3JlYWQ4KHByaXYsIENYMl9JTkRJUkVDVF9EQVRBICsgaSk7CisJCW51bSAtPSBkaWZfbGVuOworCQlhbGlnbmVkX2FkZHIgKz0gNDsKKwl9CisKKwkvKiBSZWFkIERXcyB0aHJvdWdoIGF1dG9pbmMgcmVnaXN0ZXIgKi8KKwlfaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0FVVE9JTkNfQUREUiwgYWxpZ25lZF9hZGRyKTsKKwlhbGlnbmVkX2xlbiA9IG51bSAmIENYMl9JTkRJUkVDVF9BRERSX01BU0s7CisJZm9yIChpID0gMDsgaSA8IGFsaWduZWRfbGVuOyBpICs9IDQsIGJ1ZiArPSA0LCBhbGlnbmVkX2FkZHIgKz0gNCkKKwkJKih1MzIgKikgYnVmID0gaXB3X3JlYWQzMihwcml2LCBDWDJfQVVUT0lOQ19EQVRBKTsKKworCS8qIENvcHkgdGhlIGxhc3QgbmliYmxlICovCisJZGlmX2xlbiA9IG51bSAtIGFsaWduZWRfbGVuOworCV9pcHdfd3JpdGUzMihwcml2LCBDWDJfSU5ESVJFQ1RfQUREUiwgYWxpZ25lZF9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlmX2xlbjsgaSsrLCBidWYrKykKKwkJKmJ1ZiA9IGlwd19yZWFkOChwcml2LCBDWDJfSU5ESVJFQ1RfREFUQSArIGkpOworfQorCitzdGF0aWMgdm9pZCBfaXB3X3dyaXRlX2luZGlyZWN0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHU4ICogYnVmLAorCQkJCWludCBudW0pCit7CisJdTMyIGFsaWduZWRfYWRkciA9IGFkZHIgJiBDWDJfSU5ESVJFQ1RfQUREUl9NQVNLOworCXUzMiBkaWZfbGVuID0gYWRkciAtIGFsaWduZWRfYWRkcjsKKwl1MzIgYWxpZ25lZF9sZW47CisJdTMyIGk7CisKKwlJUFdfREVCVUdfSU8oImFkZHIgPSAlaSwgYnVmID0gJXAsIG51bSA9ICVpXG4iLCBhZGRyLCBidWYsIG51bSk7CisKKwkvKiBXcml0ZSB0aGUgZmlyc3QgbmliYmxlIGJ5dGUgYnkgYnl0ZSAqLworCWlmICh1bmxpa2VseShkaWZfbGVuKSkgeworCQkvKiBTdGFydCB3cml0aW5nIGF0IGFsaWduZWRfYWRkciArIGRpZl9sZW4gKi8KKwkJX2lwd193cml0ZTMyKHByaXYsIENYMl9JTkRJUkVDVF9BRERSLCBhbGlnbmVkX2FkZHIpOworCQlmb3IgKGkgPSBkaWZfbGVuOyBpIDwgNDsgaSsrLCBidWYrKykKKwkJCV9pcHdfd3JpdGU4KHByaXYsIENYMl9JTkRJUkVDVF9EQVRBICsgaSwgKmJ1Zik7CisJCW51bSAtPSBkaWZfbGVuOworCQlhbGlnbmVkX2FkZHIgKz0gNDsKKwl9CisKKwkvKiBXcml0ZSBEV3MgdGhyb3VnaCBhdXRvaW5jIHJlZ2lzdGVyICovCisJX2lwd193cml0ZTMyKHByaXYsIENYMl9BVVRPSU5DX0FERFIsIGFsaWduZWRfYWRkcik7CisJYWxpZ25lZF9sZW4gPSBudW0gJiBDWDJfSU5ESVJFQ1RfQUREUl9NQVNLOworCWZvciAoaSA9IDA7IGkgPCBhbGlnbmVkX2xlbjsgaSArPSA0LCBidWYgKz0gNCwgYWxpZ25lZF9hZGRyICs9IDQpCisJCV9pcHdfd3JpdGUzMihwcml2LCBDWDJfQVVUT0lOQ19EQVRBLCAqKHUzMiAqKSBidWYpOworCisJLyogQ29weSB0aGUgbGFzdCBuaWJibGUgKi8KKwlkaWZfbGVuID0gbnVtIC0gYWxpZ25lZF9sZW47CisJX2lwd193cml0ZTMyKHByaXYsIENYMl9JTkRJUkVDVF9BRERSLCBhbGlnbmVkX2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCBkaWZfbGVuOyBpKyssIGJ1ZisrKQorCQlfaXB3X3dyaXRlOChwcml2LCBDWDJfSU5ESVJFQ1RfREFUQSArIGksICpidWYpOworfQorCitzdGF0aWMgdm9pZCBpcHdfd3JpdGVfZGlyZWN0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgaW50IG51bSkKK3sKKwltZW1jcHlfdG9pbygocHJpdi0+aHdfYmFzZSArIGFkZHIpLCBidWYsIG51bSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHdfc2V0X2JpdChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiByZWcsIHUzMiBtYXNrKQoreworCWlwd193cml0ZTMyKHByaXYsIHJlZywgaXB3X3JlYWQzMihwcml2LCByZWcpIHwgbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHdfY2xlYXJfYml0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIG1hc2spCit7CisJaXB3X3dyaXRlMzIocHJpdiwgcmVnLCBpcHdfcmVhZDMyKHByaXYsIHJlZykgJiB+bWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHdfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfSU5UX0VOQUJMRUQpCisJCXJldHVybjsKKwlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX0lOVF9FTkFCTEVEOworCWlwd193cml0ZTMyKHByaXYsIENYMl9JTlRBX01BU0tfUiwgQ1gyX0lOVEFfTUFTS19BTEwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXB3X2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCit7CisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0lOVF9FTkFCTEVEKSkKKwkJcmV0dXJuOworCXByaXYtPnN0YXR1cyAmPSB+U1RBVFVTX0lOVF9FTkFCTEVEOworCWlwd193cml0ZTMyKHByaXYsIENYMl9JTlRBX01BU0tfUiwgfkNYMl9JTlRBX01BU0tfQUxMKTsKK30KKworc3RhdGljIGNoYXIgKmlwd19lcnJvcl9kZXNjKHUzMiB2YWwpCit7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIElQV19GV19FUlJPUl9PSzoKKwkJcmV0dXJuICJFUlJPUl9PSyI7CisJY2FzZSBJUFdfRldfRVJST1JfRkFJTDoKKwkJcmV0dXJuICJFUlJPUl9GQUlMIjsKKwljYXNlIElQV19GV19FUlJPUl9NRU1PUllfVU5ERVJGTE9XOgorCQlyZXR1cm4gIk1FTU9SWV9VTkRFUkZMT1ciOworCWNhc2UgSVBXX0ZXX0VSUk9SX01FTU9SWV9PVkVSRkxPVzoKKwkJcmV0dXJuICJNRU1PUllfT1ZFUkZMT1ciOworCWNhc2UgSVBXX0ZXX0VSUk9SX0JBRF9QQVJBTToKKwkJcmV0dXJuICJFUlJPUl9CQURfUEFSQU0iOworCWNhc2UgSVBXX0ZXX0VSUk9SX0JBRF9DSEVDS1NVTToKKwkJcmV0dXJuICJFUlJPUl9CQURfQ0hFQ0tTVU0iOworCWNhc2UgSVBXX0ZXX0VSUk9SX05NSV9JTlRFUlJVUFQ6CisJCXJldHVybiAiRVJST1JfTk1JX0lOVEVSUlVQVCI7CisJY2FzZSBJUFdfRldfRVJST1JfQkFEX0RBVEFCQVNFOgorCQlyZXR1cm4gIkVSUk9SX0JBRF9EQVRBQkFTRSI7CisJY2FzZSBJUFdfRldfRVJST1JfQUxMT0NfRkFJTDoKKwkJcmV0dXJuICJFUlJPUl9BTExPQ19GQUlMIjsKKwljYXNlIElQV19GV19FUlJPUl9ETUFfVU5ERVJSVU46CisJCXJldHVybiAiRVJST1JfRE1BX1VOREVSUlVOIjsKKwljYXNlIElQV19GV19FUlJPUl9ETUFfU1RBVFVTOgorCQlyZXR1cm4gIkVSUk9SX0RNQV9TVEFUVVMiOworCWNhc2UgSVBXX0ZXX0VSUk9SX0RJTk9TVEFUVVNfRVJST1I6CisJCXJldHVybiAiRVJST1JfRElOT1NUQVRVU19FUlJPUiI7CisJY2FzZSBJUFdfRldfRVJST1JfRUVQUk9NU1RBVFVTX0VSUk9SOgorCQlyZXR1cm4gIkVSUk9SX0VFUFJPTVNUQVRVU19FUlJPUiI7CisJY2FzZSBJUFdfRldfRVJST1JfU1lTQVNTRVJUOgorCQlyZXR1cm4gIkVSUk9SX1NZU0FTU0VSVCI7CisJY2FzZSBJUFdfRldfRVJST1JfRkFUQUxfRVJST1I6CisJCXJldHVybiAiRVJST1JfRkFUQUxTVEFUVVNfRVJST1IiOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XTlNUQVRVU19FUlJPUiI7CisJfQorfQorCitzdGF0aWMgdm9pZCBpcHdfZHVtcF9uaWNfZXJyb3JfbG9nKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwl1MzIgZGVzYywgdGltZSwgYmxpbmsxLCBibGluazIsIGlsaW5rMSwgaWxpbmsyLCBpZGF0YSwgaSwgY291bnQsIGJhc2U7CisKKwliYXNlID0gaXB3X3JlYWQzMihwcml2LCBJUFdTVEFUVVNfRVJST1JfTE9HKTsKKwljb3VudCA9IGlwd19yZWFkX3JlZzMyKHByaXYsIGJhc2UpOworCisJaWYgKEVSUk9SX1NUQVJUX09GRlNFVCA8PSBjb3VudCAqIEVSUk9SX0VMRU1fU0laRSkgeworCQlJUFdfRVJST1IoIlN0YXJ0IElQVyBFcnJvciBMb2cgRHVtcDpcbiIpOworCQlJUFdfRVJST1IoIlN0YXR1czogMHglMDhYLCBDb25maWc6ICUwOFhcbiIsCisJCQkgIHByaXYtPnN0YXR1cywgcHJpdi0+Y29uZmlnKTsKKwl9CisKKwlmb3IgKGkgPSBFUlJPUl9TVEFSVF9PRkZTRVQ7CisJICAgICBpIDw9IGNvdW50ICogRVJST1JfRUxFTV9TSVpFOyBpICs9IEVSUk9SX0VMRU1fU0laRSkgeworCQlkZXNjID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgYmFzZSArIGkpOworCQl0aW1lID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgYmFzZSArIGkgKyAxICogc2l6ZW9mKHUzMikpOworCQlibGluazEgPSBpcHdfcmVhZF9yZWczMihwcml2LCBiYXNlICsgaSArIDIgKiBzaXplb2YodTMyKSk7CisJCWJsaW5rMiA9IGlwd19yZWFkX3JlZzMyKHByaXYsIGJhc2UgKyBpICsgMyAqIHNpemVvZih1MzIpKTsKKwkJaWxpbmsxID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgYmFzZSArIGkgKyA0ICogc2l6ZW9mKHUzMikpOworCQlpbGluazIgPSBpcHdfcmVhZF9yZWczMihwcml2LCBiYXNlICsgaSArIDUgKiBzaXplb2YodTMyKSk7CisJCWlkYXRhID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgYmFzZSArIGkgKyA2ICogc2l6ZW9mKHUzMikpOworCisJCUlQV19FUlJPUigiJXMgJWkgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsCisJCQkgIGlwd19lcnJvcl9kZXNjKGRlc2MpLCB0aW1lLCBibGluazEsIGJsaW5rMiwKKwkJCSAgaWxpbmsxLCBpbGluazIsIGlkYXRhKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlwd19kdW1wX25pY19ldmVudF9sb2coc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCXUzMiBldiwgdGltZSwgZGF0YSwgaSwgY291bnQsIGJhc2U7CisKKwliYXNlID0gaXB3X3JlYWQzMihwcml2LCBJUFdfRVZFTlRfTE9HKTsKKwljb3VudCA9IGlwd19yZWFkX3JlZzMyKHByaXYsIGJhc2UpOworCisJaWYgKEVWRU5UX1NUQVJUX09GRlNFVCA8PSBjb3VudCAqIEVWRU5UX0VMRU1fU0laRSkKKwkJSVBXX0VSUk9SKCJTdGFydCBJUFcgRXZlbnQgTG9nIER1bXA6XG4iKTsKKworCWZvciAoaSA9IEVWRU5UX1NUQVJUX09GRlNFVDsKKwkgICAgIGkgPD0gY291bnQgKiBFVkVOVF9FTEVNX1NJWkU7IGkgKz0gRVZFTlRfRUxFTV9TSVpFKSB7CisJCWV2ID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgYmFzZSArIGkpOworCQl0aW1lID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgYmFzZSArIGkgKyAxICogc2l6ZW9mKHUzMikpOworCQlkYXRhID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgYmFzZSArIGkgKyAyICogc2l6ZW9mKHUzMikpOworCisjaWZkZWYgQ09ORklHX0lQV19ERUJVRworCQlJUFdfRVJST1IoIiVpXHQweCUwOHhcdCVpXG4iLCB0aW1lLCBkYXRhLCBldik7CisjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyBpbnQgaXB3X2dldF9vcmRpbmFsKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIG9yZCwgdm9pZCAqdmFsLCB1MzIgKiBsZW4pCit7CisJdTMyIGFkZHIsIGZpZWxkX2luZm8sIGZpZWxkX2xlbiwgZmllbGRfY291bnQsIHRvdGFsX2xlbjsKKworCUlQV19ERUJVR19PUkQoIm9yZGluYWwgPSAlaVxuIiwgb3JkKTsKKworCWlmICghcHJpdiB8fCAhdmFsIHx8ICFsZW4pIHsKKwkJSVBXX0RFQlVHX09SRCgiSW52YWxpZCBhcmd1bWVudFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHZlcmlmeSBkZXZpY2Ugb3JkaW5hbCB0YWJsZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkICovCisJaWYgKCFwcml2LT50YWJsZTBfYWRkciB8fCAhcHJpdi0+dGFibGUxX2FkZHIgfHwgIXByaXYtPnRhYmxlMl9hZGRyKSB7CisJCUlQV19ERUJVR19PUkQoIkFjY2VzcyBvcmRpbmFscyBiZWZvcmUgaW5pdGlhbGl6YXRpb25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKElQV19PUkRfVEFCTEVfSURfTUFTSyAmIG9yZCkgeworCWNhc2UgSVBXX09SRF9UQUJMRV8wX01BU0s6CisJCS8qCisJCSAqIFRBQkxFIDA6IERpcmVjdCBhY2Nlc3MgdG8gYSB0YWJsZSBvZiAzMiBiaXQgdmFsdWVzCisJCSAqCisJCSAqIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSB0YWJsZSB3aXRoIHRoZSBkYXRhIGRpcmVjdGx5CisJCSAqIHJlYWQgZnJvbSB0aGUgdGFibGUKKwkJICovCisKKwkJLyogcmVtb3ZlIHRoZSB0YWJsZSBpZCBmcm9tIHRoZSBvcmRpbmFsICovCisJCW9yZCAmPSBJUFdfT1JEX1RBQkxFX1ZBTFVFX01BU0s7CisKKwkJLyogYm91bmRhcnkgY2hlY2sgKi8KKwkJaWYgKG9yZCA+IHByaXYtPnRhYmxlMF9sZW4pIHsKKwkJCUlQV19ERUJVR19PUkQoIm9yZGluYWwgdmFsdWUgKCVpKSBsb25nZXIgdGhlbiAiCisJCQkJICAgICAgIm1heCAoJWkpXG4iLCBvcmQsIHByaXYtPnRhYmxlMF9sZW4pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiB2ZXJpZnkgd2UgaGF2ZSBlbm91Z2ggcm9vbSB0byBzdG9yZSB0aGUgdmFsdWUgKi8KKwkJaWYgKCpsZW4gPCBzaXplb2YodTMyKSkgeworCQkJSVBXX0RFQlVHX09SRCgib3JkaW5hbCBidWZmZXIgbGVuZ3RoIHRvbyBzbWFsbCwgIgorCQkJCSAgICAgICJuZWVkICV6ZFxuIiwgc2l6ZW9mKHUzMikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlJUFdfREVCVUdfT1JEKCJSZWFkaW5nIFRBQkxFMFslaV0gZnJvbSBvZmZzZXQgMHglMDh4XG4iLAorCQkJICAgICAgb3JkLCBwcml2LT50YWJsZTBfYWRkciArIChvcmQgPDwgMikpOworCisJCSpsZW4gPSBzaXplb2YodTMyKTsKKwkJb3JkIDw8PSAyOworCQkqKCh1MzIgKikgdmFsKSA9IGlwd19yZWFkMzIocHJpdiwgcHJpdi0+dGFibGUwX2FkZHIgKyBvcmQpOworCQlicmVhazsKKworCWNhc2UgSVBXX09SRF9UQUJMRV8xX01BU0s6CisJCS8qCisJCSAqIFRBQkxFIDE6IEluZGlyZWN0IGFjY2VzcyB0byBhIHRhYmxlIG9mIDMyIGJpdCB2YWx1ZXMKKwkJICoKKwkJICogVGhpcyBpcyBhIGZhaXJseSBsYXJnZSB0YWJsZSBvZiB1MzIgdmFsdWVzIGVhY2gKKwkJICogcmVwcmVzZW50aW5nIHN0YXJ0aW5nIGFkZHIgZm9yIHRoZSBkYXRhICh3aGljaCBpcworCQkgKiBhbHNvIGEgdTMyKQorCQkgKi8KKworCQkvKiByZW1vdmUgdGhlIHRhYmxlIGlkIGZyb20gdGhlIG9yZGluYWwgKi8KKwkJb3JkICY9IElQV19PUkRfVEFCTEVfVkFMVUVfTUFTSzsKKworCQkvKiBib3VuZGFyeSBjaGVjayAqLworCQlpZiAob3JkID4gcHJpdi0+dGFibGUxX2xlbikgeworCQkJSVBXX0RFQlVHX09SRCgib3JkaW5hbCB2YWx1ZSB0b28gbG9uZ1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIHZlcmlmeSB3ZSBoYXZlIGVub3VnaCByb29tIHRvIHN0b3JlIHRoZSB2YWx1ZSAqLworCQlpZiAoKmxlbiA8IHNpemVvZih1MzIpKSB7CisJCQlJUFdfREVCVUdfT1JEKCJvcmRpbmFsIGJ1ZmZlciBsZW5ndGggdG9vIHNtYWxsLCAiCisJCQkJICAgICAgIm5lZWQgJXpkXG4iLCBzaXplb2YodTMyKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCSooKHUzMiAqKSB2YWwpID0KKwkJICAgIGlwd19yZWFkX3JlZzMyKHByaXYsIChwcml2LT50YWJsZTFfYWRkciArIChvcmQgPDwgMikpKTsKKwkJKmxlbiA9IHNpemVvZih1MzIpOworCQlicmVhazsKKworCWNhc2UgSVBXX09SRF9UQUJMRV8yX01BU0s6CisJCS8qCisJCSAqIFRBQkxFIDI6IEluZGlyZWN0IGFjY2VzcyB0byBhIHRhYmxlIG9mIHZhcmlhYmxlIHNpemVkIHZhbHVlcworCQkgKgorCQkgKiBUaGlzIHRhYmxlIGNvbnNpc3Qgb2Ygc2l4IHZhbHVlcywgZWFjaCBjb250YWluaW5nCisJCSAqICAgICAtIGR3b3JkIGNvbnRhaW5pbmcgdGhlIHN0YXJ0aW5nIG9mZnNldCBvZiB0aGUgZGF0YQorCQkgKiAgICAgLSBkd29yZCBjb250YWluaW5nIHRoZSBsZW5naCBpbiB0aGUgZmlyc3QgMTZiaXRzCisJCSAqICAgICAgIGFuZCB0aGUgY291bnQgaW4gdGhlIHNlY29uZCAxNmJpdHMKKwkJICovCisKKwkJLyogcmVtb3ZlIHRoZSB0YWJsZSBpZCBmcm9tIHRoZSBvcmRpbmFsICovCisJCW9yZCAmPSBJUFdfT1JEX1RBQkxFX1ZBTFVFX01BU0s7CisKKwkJLyogYm91bmRhcnkgY2hlY2sgKi8KKwkJaWYgKG9yZCA+IHByaXYtPnRhYmxlMl9sZW4pIHsKKwkJCUlQV19ERUJVR19PUkQoIm9yZGluYWwgdmFsdWUgdG9vIGxvbmdcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBnZXQgdGhlIGFkZHJlc3Mgb2Ygc3RhdGlzdGljICovCisJCWFkZHIgPSBpcHdfcmVhZF9yZWczMihwcml2LCBwcml2LT50YWJsZTJfYWRkciArIChvcmQgPDwgMykpOworCisJCS8qIGdldCB0aGUgc2Vjb25kIERXIG9mIHN0YXRpc3RpY3MgOworCQkgKiB0d28gMTYtYml0IHdvcmRzIC0gZmlyc3QgaXMgbGVuZ3RoLCBzZWNvbmQgaXMgY291bnQgKi8KKwkJZmllbGRfaW5mbyA9CisJCSAgICBpcHdfcmVhZF9yZWczMihwcml2LAorCQkJCSAgIHByaXYtPnRhYmxlMl9hZGRyICsgKG9yZCA8PCAzKSArCisJCQkJICAgc2l6ZW9mKHUzMikpOworCisJCS8qIGdldCBlYWNoIGVudHJ5IGxlbmd0aCAqLworCQlmaWVsZF9sZW4gPSAqKCh1MTYgKikgJiBmaWVsZF9pbmZvKTsKKworCQkvKiBnZXQgbnVtYmVyIG9mIGVudHJpZXMgKi8KKwkJZmllbGRfY291bnQgPSAqKCgodTE2ICopICYgZmllbGRfaW5mbykgKyAxKTsKKworCQkvKiBhYm9ydCBpZiBub3QgZW5vdWdodCBtZW1vcnkgKi8KKwkJdG90YWxfbGVuID0gZmllbGRfbGVuICogZmllbGRfY291bnQ7CisJCWlmICh0b3RhbF9sZW4gPiAqbGVuKSB7CisJCQkqbGVuID0gdG90YWxfbGVuOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkqbGVuID0gdG90YWxfbGVuOworCQlpZiAoIXRvdGFsX2xlbikKKwkJCXJldHVybiAwOworCisJCUlQV19ERUJVR19PUkQoImFkZHIgPSAweCUwOHgsIHRvdGFsX2xlbiA9ICVpLCAiCisJCQkgICAgICAiZmllbGRfaW5mbyA9IDB4JTA4eFxuIiwKKwkJCSAgICAgIGFkZHIsIHRvdGFsX2xlbiwgZmllbGRfaW5mbyk7CisJCWlwd19yZWFkX2luZGlyZWN0KHByaXYsIGFkZHIsIHZhbCwgdG90YWxfbGVuKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlJUFdfREVCVUdfT1JEKCJJbnZhbGlkIG9yZGluYWwhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXB3X2luaXRfb3JkaW5hbHMoc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCXByaXYtPnRhYmxlMF9hZGRyID0gSVBXX09SRElOQUxTX1RBQkxFX0xPV0VSOworCXByaXYtPnRhYmxlMF9sZW4gPSBpcHdfcmVhZDMyKHByaXYsIHByaXYtPnRhYmxlMF9hZGRyKTsKKworCUlQV19ERUJVR19PUkQoInRhYmxlIDAgb2Zmc2V0IGF0IDB4JTA4eCwgbGVuID0gJWlcbiIsCisJCSAgICAgIHByaXYtPnRhYmxlMF9hZGRyLCBwcml2LT50YWJsZTBfbGVuKTsKKworCXByaXYtPnRhYmxlMV9hZGRyID0gaXB3X3JlYWQzMihwcml2LCBJUFdfT1JESU5BTFNfVEFCTEVfMSk7CisJcHJpdi0+dGFibGUxX2xlbiA9IGlwd19yZWFkX3JlZzMyKHByaXYsIHByaXYtPnRhYmxlMV9hZGRyKTsKKworCUlQV19ERUJVR19PUkQoInRhYmxlIDEgb2Zmc2V0IGF0IDB4JTA4eCwgbGVuID0gJWlcbiIsCisJCSAgICAgIHByaXYtPnRhYmxlMV9hZGRyLCBwcml2LT50YWJsZTFfbGVuKTsKKworCXByaXYtPnRhYmxlMl9hZGRyID0gaXB3X3JlYWQzMihwcml2LCBJUFdfT1JESU5BTFNfVEFCTEVfMik7CisJcHJpdi0+dGFibGUyX2xlbiA9IGlwd19yZWFkX3JlZzMyKHByaXYsIHByaXYtPnRhYmxlMl9hZGRyKTsKKwlwcml2LT50YWJsZTJfbGVuICY9IDB4MDAwMGZmZmY7CS8qIHVzZSBmaXJzdCB0d28gYnl0ZXMgKi8KKworCUlQV19ERUJVR19PUkQoInRhYmxlIDIgb2Zmc2V0IGF0IDB4JTA4eCwgbGVuID0gJWlcbiIsCisJCSAgICAgIHByaXYtPnRhYmxlMl9hZGRyLCBwcml2LT50YWJsZTJfbGVuKTsKKworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBhZGRzIGEgbmV3IGF0dHJpYnV0ZSB0byB0aGUgc3lzZnMgcmVwcmVzZW50YXRpb24KKyAqIG9mIHRoaXMgZGV2aWNlIGRyaXZlciAoaS5lLiBhIG5ldyBmaWxlIGluIC9zeXMvYnVzL3BjaS9kcml2ZXJzL2lwdy8pCisgKiB1c2VkIGZvciBjb250cm9saW5nIHRoZSBkZWJ1ZyBsZXZlbC4KKyAqCisgKiBTZWUgdGhlIGxldmVsIGRlZmluaXRpb25zIGluIGlwdyBmb3IgZGV0YWlscy4KKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19kZWJ1Z19sZXZlbChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4WFxuIiwgaXB3X2RlYnVnX2xldmVsKTsKK30KK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2RlYnVnX2xldmVsKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkLAorCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwljaGFyICpwID0gKGNoYXIgKilidWY7CisJdTMyIHZhbDsKKworCWlmIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJyB8fCBwWzBdID09ICd4JyB8fCBwWzBdID09ICdYJykgeworCQlwKys7CisJCWlmIChwWzBdID09ICd4JyB8fCBwWzBdID09ICdYJykKKwkJCXArKzsKKwkJdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDE2KTsKKwl9IGVsc2UKKwkJdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDEwKTsKKwlpZiAocCA9PSBidWYpCisJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJICAgICAgICI6ICVzIGlzIG5vdCBpbiBoZXggb3IgZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKKwllbHNlCisJCWlwd19kZWJ1Z19sZXZlbCA9IHZhbDsKKworCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgRFJJVkVSX0FUVFIoZGVidWdfbGV2ZWwsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkgICBzaG93X2RlYnVnX2xldmVsLCBzdG9yZV9kZWJ1Z19sZXZlbCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcCA9IGQtPmRyaXZlcl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgKGludClwLT5zdGF0dXMpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoc3RhdHVzLCBTX0lSVUdPLCBzaG93X3N0YXR1cywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfY2ZnKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcCA9IGQtPmRyaXZlcl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgKGludClwLT5jb25maWcpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoY2ZnLCBTX0lSVUdPLCBzaG93X2NmZywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbmljX3R5cGUoc3RydWN0IGRldmljZSAqZCwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnAgPSBkLT5kcml2ZXJfZGF0YTsKKwl1OCB0eXBlID0gcC0+ZWVwcm9tW0VFUFJPTV9OSUNfVFlQRV07CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEVFUFJPTV9OSUNfVFlQRV9TVEFOREFSRDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiU1RBTkRBUkRcbiIpOworCWNhc2UgRUVQUk9NX05JQ19UWVBFX0RFTEw6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkRFTExcbiIpOworCWNhc2UgRUVQUk9NX05JQ19UWVBFX0ZVSklUU1U6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkZVSklUU1VcbiIpOworCWNhc2UgRUVQUk9NX05JQ19UWVBFX0lCTToKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiSUJNXG4iKTsKKwljYXNlIEVFUFJPTV9OSUNfVFlQRV9IUDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiSFBcbiIpOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlVOS05PV05cbiIpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobmljX3R5cGUsIFNfSVJVR08sIHNob3dfbmljX3R5cGUsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkdW1wX2Vycm9yX2xvZyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBjb3VudCkKK3sKKwljaGFyICpwID0gKGNoYXIgKilidWY7CisKKwlpZiAocFswXSA9PSAnMScpCisJCWlwd19kdW1wX25pY19lcnJvcl9sb2coKHN0cnVjdCBpcHdfcHJpdiAqKWQtPmRyaXZlcl9kYXRhKTsKKworCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZHVtcF9lcnJvcnMsIFNfSVdVU1IsIE5VTEwsIGR1bXBfZXJyb3JfbG9nKTsKKworc3RhdGljIHNzaXplX3QgZHVtcF9ldmVudF9sb2coc3RydWN0IGRldmljZSAqZCwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkgICAgICBzaXplX3QgY291bnQpCit7CisJY2hhciAqcCA9IChjaGFyICopYnVmOworCisJaWYgKHBbMF0gPT0gJzEnKQorCQlpcHdfZHVtcF9uaWNfZXZlbnRfbG9nKChzdHJ1Y3QgaXB3X3ByaXYgKilkLT5kcml2ZXJfZGF0YSk7CisKKwlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGR1bXBfZXZlbnRzLCBTX0lXVVNSLCBOVUxMLCBkdW1wX2V2ZW50X2xvZyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdWNvZGVfdmVyc2lvbihzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1MzIgbGVuID0gc2l6ZW9mKHUzMiksIHRtcCA9IDA7CisJc3RydWN0IGlwd19wcml2ICpwID0gZC0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoaXB3X2dldF9vcmRpbmFsKHAsIElQV19PUkRfU1RBVF9VQ09ERV9WRVJTSU9OLCAmdG1wLCAmbGVuKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsIHRtcCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih1Y29kZV92ZXJzaW9uLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd191Y29kZV92ZXJzaW9uLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19ydGMoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJdTMyIGxlbiA9IHNpemVvZih1MzIpLCB0bXAgPSAwOworCXN0cnVjdCBpcHdfcHJpdiAqcCA9IGQtPmRyaXZlcl9kYXRhOworCisJaWYgKGlwd19nZXRfb3JkaW5hbChwLCBJUFdfT1JEX1NUQVRfUlRDLCAmdG1wLCAmbGVuKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsIHRtcCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihydGMsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3J0YywgTlVMTCk7CisKKy8qCisgKiBBZGQgYSBkZXZpY2UgYXR0cmlidXRlIHRvIHZpZXcvY29udHJvbCB0aGUgZGVsYXkgYmV0d2VlbiBlZXByb20KKyAqIG9wZXJhdGlvbnMuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfZWVwcm9tX2RlbGF5KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IG4gPSAoKHN0cnVjdCBpcHdfcHJpdiAqKWQtPmRyaXZlcl9kYXRhKS0+ZWVwcm9tX2RlbGF5OworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCBuKTsKK30KK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2VlcHJvbV9kZWxheShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnAgPSBkLT5kcml2ZXJfZGF0YTsKKwlzc2NhbmYoYnVmLCAiJWkiLCAmcC0+ZWVwcm9tX2RlbGF5KTsKKwlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGVlcHJvbV9kZWxheSwgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIHNob3dfZWVwcm9tX2RlbGF5LCBzdG9yZV9lZXByb21fZGVsYXkpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2NvbW1hbmRfZXZlbnRfcmVnKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1MzIgcmVnID0gMDsKKwlzdHJ1Y3QgaXB3X3ByaXYgKnAgPSBkLT5kcml2ZXJfZGF0YTsKKworCXJlZyA9IGlwd19yZWFkX3JlZzMyKHAsIENYMl9JTlRFUk5BTF9DTURfRVZFTlQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgcmVnKTsKK30KK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2NvbW1hbmRfZXZlbnRfcmVnKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1MzIgcmVnOworCXN0cnVjdCBpcHdfcHJpdiAqcCA9IGQtPmRyaXZlcl9kYXRhOworCisJc3NjYW5mKGJ1ZiwgIiV4IiwgJnJlZyk7CisJaXB3X3dyaXRlX3JlZzMyKHAsIENYMl9JTlRFUk5BTF9DTURfRVZFTlQsIHJlZyk7CisJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjb21tYW5kX2V2ZW50X3JlZywgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIHNob3dfY29tbWFuZF9ldmVudF9yZWcsIHN0b3JlX2NvbW1hbmRfZXZlbnRfcmVnKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19tZW1fZ3Bpb19yZWcoc3RydWN0IGRldmljZSAqZCwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1MzIgcmVnID0gMDsKKwlzdHJ1Y3QgaXB3X3ByaXYgKnAgPSBkLT5kcml2ZXJfZGF0YTsKKworCXJlZyA9IGlwd19yZWFkX3JlZzMyKHAsIDB4MzAxMTAwKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsIHJlZyk7Cit9CitzdGF0aWMgc3NpemVfdCBzdG9yZV9tZW1fZ3Bpb19yZWcoc3RydWN0IGRldmljZSAqZCwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdTMyIHJlZzsKKwlzdHJ1Y3QgaXB3X3ByaXYgKnAgPSBkLT5kcml2ZXJfZGF0YTsKKworCXNzY2FuZihidWYsICIleCIsICZyZWcpOworCWlwd193cml0ZV9yZWczMihwLCAweDMwMTEwMCwgcmVnKTsKKwlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG1lbV9ncGlvX3JlZywgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIHNob3dfbWVtX2dwaW9fcmVnLCBzdG9yZV9tZW1fZ3Bpb19yZWcpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2luZGlyZWN0X2R3b3JkKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1MzIgcmVnID0gMDsKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkLT5kcml2ZXJfZGF0YTsKKwlpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX0lORElSRUNUX0RXT1JEKQorCQlyZWcgPSBpcHdfcmVhZF9yZWczMihwcml2LCBwcml2LT5pbmRpcmVjdF9kd29yZCk7CisJZWxzZQorCQlyZWcgPSAwOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDh4XG4iLCByZWcpOworfQorc3RhdGljIHNzaXplX3Qgc3RvcmVfaW5kaXJlY3RfZHdvcmQoc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGQtPmRyaXZlcl9kYXRhOworCisJc3NjYW5mKGJ1ZiwgIiV4IiwgJnByaXYtPmluZGlyZWN0X2R3b3JkKTsKKwlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX0lORElSRUNUX0RXT1JEOworCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoaW5kaXJlY3RfZHdvcmQsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkgICBzaG93X2luZGlyZWN0X2R3b3JkLCBzdG9yZV9pbmRpcmVjdF9kd29yZCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5kaXJlY3RfYnl0ZShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1OCByZWcgPSAwOworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGQtPmRyaXZlcl9kYXRhOworCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfSU5ESVJFQ1RfQllURSkKKwkJcmVnID0gaXB3X3JlYWRfcmVnOChwcml2LCBwcml2LT5pbmRpcmVjdF9ieXRlKTsKKwllbHNlCisJCXJlZyA9IDA7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIHJlZyk7Cit9CitzdGF0aWMgc3NpemVfdCBzdG9yZV9pbmRpcmVjdF9ieXRlKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gZC0+ZHJpdmVyX2RhdGE7CisKKwlzc2NhbmYoYnVmLCAiJXgiLCAmcHJpdi0+aW5kaXJlY3RfYnl0ZSk7CisJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19JTkRJUkVDVF9CWVRFOworCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoaW5kaXJlY3RfYnl0ZSwgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIHNob3dfaW5kaXJlY3RfYnl0ZSwgc3RvcmVfaW5kaXJlY3RfYnl0ZSk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZGlyZWN0X2R3b3JkKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJdTMyIHJlZyA9IDA7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gZC0+ZHJpdmVyX2RhdGE7CisKKwlpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX0RJUkVDVF9EV09SRCkKKwkJcmVnID0gaXB3X3JlYWQzMihwcml2LCBwcml2LT5kaXJlY3RfZHdvcmQpOworCWVsc2UKKwkJcmVnID0gMDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgcmVnKTsKK30KK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2RpcmVjdF9kd29yZChzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkLT5kcml2ZXJfZGF0YTsKKworCXNzY2FuZihidWYsICIleCIsICZwcml2LT5kaXJlY3RfZHdvcmQpOworCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfRElSRUNUX0RXT1JEOworCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZGlyZWN0X2R3b3JkLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJICAgc2hvd19kaXJlY3RfZHdvcmQsIHN0b3JlX2RpcmVjdF9kd29yZCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHJmX2tpbGxfYWN0aXZlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwlpZiAoMCA9PSAoaXB3X3JlYWQzMihwcml2LCAweDMwKSAmIDB4MTAwMDApKQorCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1JGX0tJTExfSFc7CisJZWxzZQorCQlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19SRl9LSUxMX0hXOworCisJcmV0dXJuIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfUkZfS0lMTF9IVykgPyAxIDogMDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19yZl9raWxsKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwkvKiAwIC0gUkYga2lsbCBub3QgZW5hYmxlZAorCSAgIDEgLSBTVyBiYXNlZCBSRiBraWxsIGFjdGl2ZSAoc3lzZnMpCisJICAgMiAtIEhXIGJhc2VkIFJGIGtpbGwgYWN0aXZlCisJICAgMyAtIEJvdGggSFcgYW5kIFNXIGJhZWQgUkYga2lsbCBhY3RpdmUgKi8KKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkLT5kcml2ZXJfZGF0YTsKKwlpbnQgdmFsID0gKChwcml2LT5zdGF0dXMgJiBTVEFUVVNfUkZfS0lMTF9TVykgPyAweDEgOiAweDApIHwKKwkgICAgKHJmX2tpbGxfYWN0aXZlKHByaXYpID8gMHgyIDogMHgwKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlaVxuIiwgdmFsKTsKK30KKworc3RhdGljIGludCBpcHdfcmFkaW9fa2lsbF9zdyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIGludCBkaXNhYmxlX3JhZGlvKQoreworCWlmICgoZGlzYWJsZV9yYWRpbyA/IDEgOiAwKSA9PQorCSAgICAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JGX0tJTExfU1cgPyAxIDogMCkpCisJCXJldHVybiAwOworCisJSVBXX0RFQlVHX1JGX0tJTEwoIk1hbnVhbCBTVyBSRiBLaWxsIHNldCB0bzogUkFESU8gICVzXG4iLAorCQkJICBkaXNhYmxlX3JhZGlvID8gIk9GRiIgOiAiT04iKTsKKworCWlmIChkaXNhYmxlX3JhZGlvKSB7CisJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfUkZfS0lMTF9TVzsKKworCQlpZiAocHJpdi0+d29ya3F1ZXVlKSB7CisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZXF1ZXN0X3NjYW4pOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKwkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5kb3duKTsKKwl9IGVsc2UgeworCQlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19SRl9LSUxMX1NXOworCQlpZiAocmZfa2lsbF9hY3RpdmUocHJpdikpIHsKKwkJCUlQV19ERUJVR19SRl9LSUxMKCJDYW4gbm90IHR1cm4gcmFkaW8gYmFjayBvbiAtICIKKwkJCQkJICAiZGlzYWJsZWQgYnkgSFcgc3dpdGNoXG4iKTsKKwkJCS8qIE1ha2Ugc3VyZSB0aGUgUkZfS0lMTCBjaGVjayB0aW1lciBpcyBydW5uaW5nICovCisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZl9raWxsKTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLAorCQkJCQkgICAyICogSFopOworCQl9IGVsc2UKKwkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+dXApOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yZl9raWxsKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkLT5kcml2ZXJfZGF0YTsKKworCWlwd19yYWRpb19raWxsX3N3KHByaXYsIGJ1ZlswXSA9PSAnMScpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocmZfa2lsbCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfcmZfa2lsbCwgc3RvcmVfcmZfa2lsbCk7CisKK3N0YXRpYyB2b2lkIGlwd19pcnFfdGFza2xldChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCit7CisJdTMyIGludGEsIGludGFfbWFzaywgaGFuZGxlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWludGEgPSBpcHdfcmVhZDMyKHByaXYsIENYMl9JTlRBX1JXKTsKKwlpbnRhX21hc2sgPSBpcHdfcmVhZDMyKHByaXYsIENYMl9JTlRBX01BU0tfUik7CisJaW50YSAmPSAoQ1gyX0lOVEFfTUFTS19BTEwgJiBpbnRhX21hc2spOworCisJLyogQWRkIGFueSBjYWNoZWQgSU5UQSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIGhhbmRsZWQgKi8KKwlpbnRhIHw9IHByaXYtPmlzcl9pbnRhOworCisJLyogaGFuZGxlIGFsbCB0aGUganVzdGlmaWNhdGlvbnMgZm9yIHRoZSBpbnRlcnJ1cHQgKi8KKwlpZiAoaW50YSAmIENYMl9JTlRBX0JJVF9SWF9UUkFOU0ZFUikgeworCQlpcHdfcngocHJpdik7CisJCWhhbmRsZWQgfD0gQ1gyX0lOVEFfQklUX1JYX1RSQU5TRkVSOworCX0KKworCWlmIChpbnRhICYgQ1gyX0lOVEFfQklUX1RYX0NNRF9RVUVVRSkgeworCQlJUFdfREVCVUdfSEMoIkNvbW1hbmQgY29tcGxldGVkLlxuIik7CisJCXJjID0gaXB3X3F1ZXVlX3R4X3JlY2xhaW0ocHJpdiwgJnByaXYtPnR4cV9jbWQsIC0xKTsKKwkJcHJpdi0+c3RhdHVzICY9IH5TVEFUVVNfSENNRF9BQ1RJVkU7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKwkJaGFuZGxlZCB8PSBDWDJfSU5UQV9CSVRfVFhfQ01EX1FVRVVFOworCX0KKworCWlmIChpbnRhICYgQ1gyX0lOVEFfQklUX1RYX1FVRVVFXzEpIHsKKwkJSVBXX0RFQlVHX1RYKCJUWF9RVUVVRV8xXG4iKTsKKwkJcmMgPSBpcHdfcXVldWVfdHhfcmVjbGFpbShwcml2LCAmcHJpdi0+dHhxWzBdLCAwKTsKKwkJaGFuZGxlZCB8PSBDWDJfSU5UQV9CSVRfVFhfUVVFVUVfMTsKKwl9CisKKwlpZiAoaW50YSAmIENYMl9JTlRBX0JJVF9UWF9RVUVVRV8yKSB7CisJCUlQV19ERUJVR19UWCgiVFhfUVVFVUVfMlxuIik7CisJCXJjID0gaXB3X3F1ZXVlX3R4X3JlY2xhaW0ocHJpdiwgJnByaXYtPnR4cVsxXSwgMSk7CisJCWhhbmRsZWQgfD0gQ1gyX0lOVEFfQklUX1RYX1FVRVVFXzI7CisJfQorCisJaWYgKGludGEgJiBDWDJfSU5UQV9CSVRfVFhfUVVFVUVfMykgeworCQlJUFdfREVCVUdfVFgoIlRYX1FVRVVFXzNcbiIpOworCQlyYyA9IGlwd19xdWV1ZV90eF9yZWNsYWltKHByaXYsICZwcml2LT50eHFbMl0sIDIpOworCQloYW5kbGVkIHw9IENYMl9JTlRBX0JJVF9UWF9RVUVVRV8zOworCX0KKworCWlmIChpbnRhICYgQ1gyX0lOVEFfQklUX1RYX1FVRVVFXzQpIHsKKwkJSVBXX0RFQlVHX1RYKCJUWF9RVUVVRV80XG4iKTsKKwkJcmMgPSBpcHdfcXVldWVfdHhfcmVjbGFpbShwcml2LCAmcHJpdi0+dHhxWzNdLCAzKTsKKwkJaGFuZGxlZCB8PSBDWDJfSU5UQV9CSVRfVFhfUVVFVUVfNDsKKwl9CisKKwlpZiAoaW50YSAmIENYMl9JTlRBX0JJVF9TVEFUVVNfQ0hBTkdFKSB7CisJCUlQV19XQVJOSU5HKCJTVEFUVVNfQ0hBTkdFXG4iKTsKKwkJaGFuZGxlZCB8PSBDWDJfSU5UQV9CSVRfU1RBVFVTX0NIQU5HRTsKKwl9CisKKwlpZiAoaW50YSAmIENYMl9JTlRBX0JJVF9CRUFDT05fUEVSSU9EX0VYUElSRUQpIHsKKwkJSVBXX1dBUk5JTkcoIlRYX1BFUklPRF9FWFBJUkVEXG4iKTsKKwkJaGFuZGxlZCB8PSBDWDJfSU5UQV9CSVRfQkVBQ09OX1BFUklPRF9FWFBJUkVEOworCX0KKworCWlmIChpbnRhICYgQ1gyX0lOVEFfQklUX1NMQVZFX01PREVfSE9TVF9DTURfRE9ORSkgeworCQlJUFdfV0FSTklORygiSE9TVF9DTURfRE9ORVxuIik7CisJCWhhbmRsZWQgfD0gQ1gyX0lOVEFfQklUX1NMQVZFX01PREVfSE9TVF9DTURfRE9ORTsKKwl9CisKKwlpZiAoaW50YSAmIENYMl9JTlRBX0JJVF9GV19JTklUSUFMSVpBVElPTl9ET05FKSB7CisJCUlQV19XQVJOSU5HKCJGV19JTklUSUFMSVpBVElPTl9ET05FXG4iKTsKKwkJaGFuZGxlZCB8PSBDWDJfSU5UQV9CSVRfRldfSU5JVElBTElaQVRJT05fRE9ORTsKKwl9CisKKwlpZiAoaW50YSAmIENYMl9JTlRBX0JJVF9GV19DQVJEX0RJU0FCTEVfUEhZX09GRl9ET05FKSB7CisJCUlQV19XQVJOSU5HKCJQSFlfT0ZGX0RPTkVcbiIpOworCQloYW5kbGVkIHw9IENYMl9JTlRBX0JJVF9GV19DQVJEX0RJU0FCTEVfUEhZX09GRl9ET05FOworCX0KKworCWlmIChpbnRhICYgQ1gyX0lOVEFfQklUX1JGX0tJTExfRE9ORSkgeworCQlJUFdfREVCVUdfUkZfS0lMTCgiUkZfS0lMTF9ET05FXG4iKTsKKwkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19SRl9LSUxMX0hXOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldF9kZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldF9kZXYpOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZXF1ZXN0X3NjYW4pOworCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwgMiAqIEhaKTsKKwkJaGFuZGxlZCB8PSBDWDJfSU5UQV9CSVRfUkZfS0lMTF9ET05FOworCX0KKworCWlmIChpbnRhICYgQ1gyX0lOVEFfQklUX0ZBVEFMX0VSUk9SKSB7CisJCUlQV19FUlJPUigiRmlybXdhcmUgZXJyb3IgZGV0ZWN0ZWQuICBSZXN0YXJ0aW5nLlxuIik7CisjaWZkZWYgQ09ORklHX0lQV19ERUJVRworCQlpZiAoaXB3X2RlYnVnX2xldmVsICYgSVBXX0RMX0ZXX0VSUk9SUykgeworCQkJaXB3X2R1bXBfbmljX2Vycm9yX2xvZyhwcml2KTsKKwkJCWlwd19kdW1wX25pY19ldmVudF9sb2cocHJpdik7CisJCX0KKyNlbmRpZgorCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPmFkYXB0ZXJfcmVzdGFydCk7CisJCWhhbmRsZWQgfD0gQ1gyX0lOVEFfQklUX0ZBVEFMX0VSUk9SOworCX0KKworCWlmIChpbnRhICYgQ1gyX0lOVEFfQklUX1BBUklUWV9FUlJPUikgeworCQlJUFdfRVJST1IoIlBhcml0eSBlcnJvclxuIik7CisJCWhhbmRsZWQgfD0gQ1gyX0lOVEFfQklUX1BBUklUWV9FUlJPUjsKKwl9CisKKwlpZiAoaGFuZGxlZCAhPSBpbnRhKSB7CisJCUlQV19FUlJPUigiVW5oYW5kbGVkIElOVEEgYml0cyAweCUwOHhcbiIsIGludGEgJiB+aGFuZGxlZCk7CisJfQorCisJLyogZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJaXB3X2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworfQorCisjaWZkZWYgQ09ORklHX0lQV19ERUJVRworI2RlZmluZSBJUFdfQ01EKHgpIGNhc2UgSVBXX0NNRF8gIyMgeCA6IHJldHVybiAjeAorc3RhdGljIGNoYXIgKmdldF9jbWRfc3RyaW5nKHU4IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCQlJUFdfQ01EKEhPU1RfQ09NUExFVEUpOworCQlJUFdfQ01EKFBPV0VSX0RPV04pOworCQlJUFdfQ01EKFNZU1RFTV9DT05GSUcpOworCQlJUFdfQ01EKE1VTFRJQ0FTVF9BRERSRVNTKTsKKwkJSVBXX0NNRChTU0lEKTsKKwkJSVBXX0NNRChBREFQVEVSX0FERFJFU1MpOworCQlJUFdfQ01EKFBPUlRfVFlQRSk7CisJCUlQV19DTUQoUlRTX1RIUkVTSE9MRCk7CisJCUlQV19DTUQoRlJBR19USFJFU0hPTEQpOworCQlJUFdfQ01EKFBPV0VSX01PREUpOworCQlJUFdfQ01EKFdFUF9LRVkpOworCQlJUFdfQ01EKFRHSV9UWF9LRVkpOworCQlJUFdfQ01EKFNDQU5fUkVRVUVTVCk7CisJCUlQV19DTUQoU0NBTl9SRVFVRVNUX0VYVCk7CisJCUlQV19DTUQoQVNTT0NJQVRFKTsKKwkJSVBXX0NNRChTVVBQT1JURURfUkFURVMpOworCQlJUFdfQ01EKFNDQU5fQUJPUlQpOworCQlJUFdfQ01EKFRYX0ZMVVNIKTsKKwkJSVBXX0NNRChRT1NfUEFSQU1FVEVSUyk7CisJCUlQV19DTUQoRElOT19DT05GSUcpOworCQlJUFdfQ01EKFJTTl9DQVBBQklMSVRJRVMpOworCQlJUFdfQ01EKFJYX0tFWSk7CisJCUlQV19DTUQoQ0FSRF9ESVNBQkxFKTsKKwkJSVBXX0NNRChTRUVEX05VTUJFUik7CisJCUlQV19DTUQoVFhfUE9XRVIpOworCQlJUFdfQ01EKENPVU5UUllfSU5GTyk7CisJCUlQV19DTUQoQUlST05FVF9JTkZPKTsKKwkJSVBXX0NNRChBUF9UWF9QT1dFUik7CisJCUlQV19DTUQoQ0NLTV9JTkZPKTsKKwkJSVBXX0NNRChDQ1hfVkVSX0lORk8pOworCQlJUFdfQ01EKFNFVF9DQUxJQlJBVElPTik7CisJCUlQV19DTUQoU0VOU0lUSVZJVFlfQ0FMSUIpOworCQlJUFdfQ01EKFJFVFJZX0xJTUlUKTsKKwkJSVBXX0NNRChJUFdfUFJFX1BPV0VSX0RPV04pOworCQlJUFdfQ01EKFZBUF9CRUFDT05fVEVNUExBVEUpOworCQlJUFdfQ01EKFZBUF9EVElNX1BFUklPRCk7CisJCUlQV19DTUQoRVhUX1NVUFBPUlRFRF9SQVRFUyk7CisJCUlQV19DTUQoVkFQX0xPQ0FMX1RYX1BXUl9DT05TVFJBSU5UKTsKKwkJSVBXX0NNRChWQVBfUVVJRVRfSU5URVJWQUxTKTsKKwkJSVBXX0NNRChWQVBfQ0hBTk5FTF9TV0lUQ0gpOworCQlJUFdfQ01EKFZBUF9NQU5EQVRPUllfQ0hBTk5FTFMpOworCQlJUFdfQ01EKFZBUF9DRUxMX1BXUl9MSU1JVCk7CisJCUlQV19DTUQoVkFQX0NGX1BBUkFNX1NFVCk7CisJCUlQV19DTUQoVkFQX1NFVF9CRUFDT05JTkdfU1RBVEUpOworCQlJUFdfQ01EKE1FQVNVUkVNRU5UKTsKKwkJSVBXX0NNRChQT1dFUl9DQVBBQklMSVRZKTsKKwkJSVBXX0NNRChTVVBQT1JURURfQ0hBTk5FTFMpOworCQlJUFdfQ01EKFRQQ19SRVBPUlQpOworCQlJUFdfQ01EKFdNRV9JTkZPKTsKKwkJSVBXX0NNRChQUk9EVUNUSU9OX0NPTU1BTkQpOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XTiI7CisJfQorfQorI2VuZGlmCQkJCS8qIENPTkZJR19JUFdfREVCVUcgKi8KKworI2RlZmluZSBIT1NUX0NPTVBMRVRFX1RJTUVPVVQgSFoKK3N0YXRpYyBpbnQgaXB3X3NlbmRfY21kKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgc3RydWN0IGhvc3RfY21kICpjbWQpCit7CisJaW50IHJjID0gMDsKKworCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfSENNRF9BQ1RJVkUpIHsKKwkJSVBXX0VSUk9SKCJBbHJlYWR5IHNlbmRpbmcgYSBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfSENNRF9BQ1RJVkU7CisKKwlJUFdfREVCVUdfSEMoIlNlbmRpbmcgJXMgY29tbWFuZCAoIyVkKSwgJWQgYnl0ZXNcbiIsCisJCSAgICAgZ2V0X2NtZF9zdHJpbmcoY21kLT5jbWQpLCBjbWQtPmNtZCwgY21kLT5sZW4pOworCXByaW50a19idWYoSVBXX0RMX0hPU1RfQ09NTUFORCwgKHU4ICopIGNtZC0+cGFyYW0sIGNtZC0+bGVuKTsKKworCXJjID0gaXB3X3F1ZXVlX3R4X2hjbWQocHJpdiwgY21kLT5jbWQsICZjbWQtPnBhcmFtLCBjbWQtPmxlbiwgMCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSwKKwkJCQkJICAgICAgIShwcml2LT4KKwkJCQkJCXN0YXR1cyAmIFNUQVRVU19IQ01EX0FDVElWRSksCisJCQkJCSAgICAgIEhPU1RfQ09NUExFVEVfVElNRU9VVCk7CisJaWYgKHJjID09IDApIHsKKwkJSVBXX0RFQlVHX0lORk8oIkNvbW1hbmQgY29tcGxldGlvbiBmYWlsZWQgb3V0IGFmdGVyICVkbXMuXG4iLAorCQkJICAgICAgIGppZmZpZXNfdG9fbXNlY3MoSE9TVF9DT01QTEVURV9USU1FT1VUKSk7CisJCXByaXYtPnN0YXR1cyAmPSB+U1RBVFVTX0hDTURfQUNUSVZFOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRl9LSUxMX01BU0spIHsKKwkJSVBXX0RFQlVHX0lORk8oIkNvbW1hbmQgYWJvcnRlZCBkdWUgdG8gUkYgS2lsbCBTd2l0Y2hcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfc2VuZF9ob3N0X2NvbXBsZXRlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgaG9zdF9jbWQgY21kID0geworCQkuY21kID0gSVBXX0NNRF9IT1NUX0NPTVBMRVRFLAorCQkubGVuID0gMAorCX07CisKKwlpZiAoIXByaXYpIHsKKwkJSVBXX0VSUk9SKCJJbnZhbGlkIGFyZ3NcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGlwd19zZW5kX2NtZChwcml2LCAmY21kKSkgeworCQlJUFdfRVJST1IoImZhaWxlZCB0byBzZW5kIEhPU1RfQ09NUExFVEUgY29tbWFuZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfc2VuZF9zeXN0ZW1fY29uZmlnKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKKwkJCQkgIHN0cnVjdCBpcHdfc3lzX2NvbmZpZyAqY29uZmlnKQoreworCXN0cnVjdCBob3N0X2NtZCBjbWQgPSB7CisJCS5jbWQgPSBJUFdfQ01EX1NZU1RFTV9DT05GSUcsCisJCS5sZW4gPSBzaXplb2YoKmNvbmZpZykKKwl9OworCisJaWYgKCFwcml2IHx8ICFjb25maWcpIHsKKwkJSVBXX0VSUk9SKCJJbnZhbGlkIGFyZ3NcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtY3B5KCZjbWQucGFyYW0sIGNvbmZpZywgc2l6ZW9mKCpjb25maWcpKTsKKwlpZiAoaXB3X3NlbmRfY21kKHByaXYsICZjbWQpKSB7CisJCUlQV19FUlJPUigiZmFpbGVkIHRvIHNlbmQgU1lTVEVNX0NPTkZJRyBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd19zZW5kX3NzaWQoc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqIHNzaWQsIGludCBsZW4pCit7CisJc3RydWN0IGhvc3RfY21kIGNtZCA9IHsKKwkJLmNtZCA9IElQV19DTURfU1NJRCwKKwkJLmxlbiA9IG1pbihsZW4sIElXX0VTU0lEX01BWF9TSVpFKQorCX07CisKKwlpZiAoIXByaXYgfHwgIXNzaWQpIHsKKwkJSVBXX0VSUk9SKCJJbnZhbGlkIGFyZ3NcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtY3B5KCZjbWQucGFyYW0sIHNzaWQsIGNtZC5sZW4pOworCWlmIChpcHdfc2VuZF9jbWQocHJpdiwgJmNtZCkpIHsKKwkJSVBXX0VSUk9SKCJmYWlsZWQgdG8gc2VuZCBTU0lEIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3NlbmRfYWRhcHRlcl9hZGRyZXNzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTggKiBtYWMpCit7CisJc3RydWN0IGhvc3RfY21kIGNtZCA9IHsKKwkJLmNtZCA9IElQV19DTURfQURBUFRFUl9BRERSRVNTLAorCQkubGVuID0gRVRIX0FMRU4KKwl9OworCisJaWYgKCFwcml2IHx8ICFtYWMpIHsKKwkJSVBXX0VSUk9SKCJJbnZhbGlkIGFyZ3NcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJSVBXX0RFQlVHX0lORk8oIiVzOiBTZXR0aW5nIE1BQyB0byAiIE1BQ19GTVQgIlxuIiwKKwkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUsIE1BQ19BUkcobWFjKSk7CisKKwltZW1jcHkoJmNtZC5wYXJhbSwgbWFjLCBFVEhfQUxFTik7CisKKwlpZiAoaXB3X3NlbmRfY21kKHByaXYsICZjbWQpKSB7CisJCUlQV19FUlJPUigiZmFpbGVkIHRvIHNlbmQgQURBUFRFUl9BRERSRVNTIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwd19hZGFwdGVyX3Jlc3RhcnQodm9pZCAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBhZGFwdGVyOworCisJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRl9LSUxMX01BU0spCisJCXJldHVybjsKKworCWlwd19kb3duKHByaXYpOworCWlmIChpcHdfdXAocHJpdikpIHsKKwkJSVBXX0VSUk9SKCJGYWlsZWQgdG8gdXAgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KK30KKworI2RlZmluZSBJUFdfU0NBTl9DSEVDS19XQVRDSERPRyAoNSAqIEhaKQorCitzdGF0aWMgdm9pZCBpcHdfc2Nhbl9jaGVjayh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGRhdGE7CisJaWYgKHByaXYtPnN0YXR1cyAmIChTVEFUVVNfU0NBTk5JTkcgfCBTVEFUVVNfU0NBTl9BQk9SVElORykpIHsKKwkJSVBXX0RFQlVHX1NDQU4oIlNjYW4gY29tcGxldGlvbiB3YXRjaGRvZyByZXNldHRpbmcgIgorCQkJICAgICAgICJhZGFwdGVyICglZG1zKS5cbiIsCisJCQkgICAgICAgSVBXX1NDQU5fQ0hFQ0tfV0FUQ0hET0cgLyAxMDApOworCQlpcHdfYWRhcHRlcl9yZXN0YXJ0KHByaXYpOworCX0KK30KKworc3RhdGljIGludCBpcHdfc2VuZF9zY2FuX3JlcXVlc3RfZXh0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKKwkJCQkgICAgIHN0cnVjdCBpcHdfc2Nhbl9yZXF1ZXN0X2V4dCAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgaG9zdF9jbWQgY21kID0geworCQkuY21kID0gSVBXX0NNRF9TQ0FOX1JFUVVFU1RfRVhULAorCQkubGVuID0gc2l6ZW9mKCpyZXF1ZXN0KQorCX07CisKKwlpZiAoIXByaXYgfHwgIXJlcXVlc3QpIHsKKwkJSVBXX0VSUk9SKCJJbnZhbGlkIGFyZ3NcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtY3B5KCZjbWQucGFyYW0sIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpOworCWlmIChpcHdfc2VuZF9jbWQocHJpdiwgJmNtZCkpIHsKKwkJSVBXX0VSUk9SKCJmYWlsZWQgdG8gc2VuZCBTQ0FOX1JFUVVFU1RfRVhUIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnNjYW5fY2hlY2ssCisJCQkgICBJUFdfU0NBTl9DSEVDS19XQVRDSERPRyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3NlbmRfc2Nhbl9hYm9ydChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCit7CisJc3RydWN0IGhvc3RfY21kIGNtZCA9IHsKKwkJLmNtZCA9IElQV19DTURfU0NBTl9BQk9SVCwKKwkJLmxlbiA9IDAKKwl9OworCisJaWYgKCFwcml2KSB7CisJCUlQV19FUlJPUigiSW52YWxpZCBhcmdzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChpcHdfc2VuZF9jbWQocHJpdiwgJmNtZCkpIHsKKwkJSVBXX0VSUk9SKCJmYWlsZWQgdG8gc2VuZCBTQ0FOX0FCT1JUIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3NldF9zZW5zaXRpdml0eShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUxNiBzZW5zKQoreworCXN0cnVjdCBob3N0X2NtZCBjbWQgPSB7CisJCS5jbWQgPSBJUFdfQ01EX1NFTlNJVElWSVRZX0NBTElCLAorCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpcHdfc2Vuc2l0aXZpdHlfY2FsaWIpCisJfTsKKwlzdHJ1Y3QgaXB3X3NlbnNpdGl2aXR5X2NhbGliICpjYWxpYiA9IChzdHJ1Y3QgaXB3X3NlbnNpdGl2aXR5X2NhbGliICopCisJICAgICZjbWQucGFyYW07CisJY2FsaWItPmJlYWNvbl9yc3NpX3JhdyA9IHNlbnM7CisJaWYgKGlwd19zZW5kX2NtZChwcml2LCAmY21kKSkgeworCQlJUFdfRVJST1IoImZhaWxlZCB0byBzZW5kIFNFTlNJVElWSVRZIENBTElCIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3NlbmRfYXNzb2NpYXRlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKKwkJCSAgICAgIHN0cnVjdCBpcHdfYXNzb2NpYXRlICphc3NvY2lhdGUpCit7CisJc3RydWN0IGhvc3RfY21kIGNtZCA9IHsKKwkJLmNtZCA9IElQV19DTURfQVNTT0NJQVRFLAorCQkubGVuID0gc2l6ZW9mKCphc3NvY2lhdGUpCisJfTsKKworCWlmICghcHJpdiB8fCAhYXNzb2NpYXRlKSB7CisJCUlQV19FUlJPUigiSW52YWxpZCBhcmdzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbWNweSgmY21kLnBhcmFtLCBhc3NvY2lhdGUsIHNpemVvZigqYXNzb2NpYXRlKSk7CisJaWYgKGlwd19zZW5kX2NtZChwcml2LCAmY21kKSkgeworCQlJUFdfRVJST1IoImZhaWxlZCB0byBzZW5kIEFTU09DSUFURSBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd19zZW5kX3N1cHBvcnRlZF9yYXRlcyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCisJCQkJICAgIHN0cnVjdCBpcHdfc3VwcG9ydGVkX3JhdGVzICpyYXRlcykKK3sKKwlzdHJ1Y3QgaG9zdF9jbWQgY21kID0geworCQkuY21kID0gSVBXX0NNRF9TVVBQT1JURURfUkFURVMsCisJCS5sZW4gPSBzaXplb2YoKnJhdGVzKQorCX07CisKKwlpZiAoIXByaXYgfHwgIXJhdGVzKSB7CisJCUlQV19FUlJPUigiSW52YWxpZCBhcmdzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbWNweSgmY21kLnBhcmFtLCByYXRlcywgc2l6ZW9mKCpyYXRlcykpOworCWlmIChpcHdfc2VuZF9jbWQocHJpdiwgJmNtZCkpIHsKKwkJSVBXX0VSUk9SKCJmYWlsZWQgdG8gc2VuZCBTVVBQT1JURURfUkFURVMgY29tbWFuZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfc2V0X3JhbmRvbV9zZWVkKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgaG9zdF9jbWQgY21kID0geworCQkuY21kID0gSVBXX0NNRF9TRUVEX05VTUJFUiwKKwkJLmxlbiA9IHNpemVvZih1MzIpCisJfTsKKworCWlmICghcHJpdikgeworCQlJUFdfRVJST1IoIkludmFsaWQgYXJnc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlnZXRfcmFuZG9tX2J5dGVzKCZjbWQucGFyYW0sIHNpemVvZih1MzIpKTsKKworCWlmIChpcHdfc2VuZF9jbWQocHJpdiwgJmNtZCkpIHsKKwkJSVBXX0VSUk9SKCJmYWlsZWQgdG8gc2VuZCBTRUVEX05VTUJFUiBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisjaWYgMAorc3RhdGljIGludCBpcHdfc2VuZF9jYXJkX2Rpc2FibGUoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgcGh5X29mZikKK3sKKwlzdHJ1Y3QgaG9zdF9jbWQgY21kID0geworCQkuY21kID0gSVBXX0NNRF9DQVJEX0RJU0FCTEUsCisJCS5sZW4gPSBzaXplb2YodTMyKQorCX07CisKKwlpZiAoIXByaXYpIHsKKwkJSVBXX0VSUk9SKCJJbnZhbGlkIGFyZ3NcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJKigodTMyICopICYgY21kLnBhcmFtKSA9IHBoeV9vZmY7CisKKwlpZiAoaXB3X3NlbmRfY21kKHByaXYsICZjbWQpKSB7CisJCUlQV19FUlJPUigiZmFpbGVkIHRvIHNlbmQgQ0FSRF9ESVNBQkxFIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpcHdfc2VuZF90eF9wb3dlcihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHN0cnVjdCBpcHdfdHhfcG93ZXIgKnBvd2VyKQoreworCXN0cnVjdCBob3N0X2NtZCBjbWQgPSB7CisJCS5jbWQgPSBJUFdfQ01EX1RYX1BPV0VSLAorCQkubGVuID0gc2l6ZW9mKCpwb3dlcikKKwl9OworCisJaWYgKCFwcml2IHx8ICFwb3dlcikgeworCQlJUFdfRVJST1IoIkludmFsaWQgYXJnc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1jcHkoJmNtZC5wYXJhbSwgcG93ZXIsIHNpemVvZigqcG93ZXIpKTsKKwlpZiAoaXB3X3NlbmRfY21kKHByaXYsICZjbWQpKSB7CisJCUlQV19FUlJPUigiZmFpbGVkIHRvIHNlbmQgVFhfUE9XRVIgY29tbWFuZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfc2VuZF9ydHNfdGhyZXNob2xkKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTE2IHJ0cykKK3sKKwlzdHJ1Y3QgaXB3X3J0c190aHJlc2hvbGQgcnRzX3RocmVzaG9sZCA9IHsKKwkJLnJ0c190aHJlc2hvbGQgPSBydHMsCisJfTsKKwlzdHJ1Y3QgaG9zdF9jbWQgY21kID0geworCQkuY21kID0gSVBXX0NNRF9SVFNfVEhSRVNIT0xELAorCQkubGVuID0gc2l6ZW9mKHJ0c190aHJlc2hvbGQpCisJfTsKKworCWlmICghcHJpdikgeworCQlJUFdfRVJST1IoIkludmFsaWQgYXJnc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1jcHkoJmNtZC5wYXJhbSwgJnJ0c190aHJlc2hvbGQsIHNpemVvZihydHNfdGhyZXNob2xkKSk7CisJaWYgKGlwd19zZW5kX2NtZChwcml2LCAmY21kKSkgeworCQlJUFdfRVJST1IoImZhaWxlZCB0byBzZW5kIFJUU19USFJFU0hPTEQgY29tbWFuZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfc2VuZF9mcmFnX3RocmVzaG9sZChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUxNiBmcmFnKQoreworCXN0cnVjdCBpcHdfZnJhZ190aHJlc2hvbGQgZnJhZ190aHJlc2hvbGQgPSB7CisJCS5mcmFnX3RocmVzaG9sZCA9IGZyYWcsCisJfTsKKwlzdHJ1Y3QgaG9zdF9jbWQgY21kID0geworCQkuY21kID0gSVBXX0NNRF9GUkFHX1RIUkVTSE9MRCwKKwkJLmxlbiA9IHNpemVvZihmcmFnX3RocmVzaG9sZCkKKwl9OworCisJaWYgKCFwcml2KSB7CisJCUlQV19FUlJPUigiSW52YWxpZCBhcmdzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbWNweSgmY21kLnBhcmFtLCAmZnJhZ190aHJlc2hvbGQsIHNpemVvZihmcmFnX3RocmVzaG9sZCkpOworCWlmIChpcHdfc2VuZF9jbWQocHJpdiwgJmNtZCkpIHsKKwkJSVBXX0VSUk9SKCJmYWlsZWQgdG8gc2VuZCBGUkFHX1RIUkVTSE9MRCBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd19zZW5kX3Bvd2VyX21vZGUoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgbW9kZSkKK3sKKwlzdHJ1Y3QgaG9zdF9jbWQgY21kID0geworCQkuY21kID0gSVBXX0NNRF9QT1dFUl9NT0RFLAorCQkubGVuID0gc2l6ZW9mKHUzMikKKwl9OworCXUzMiAqcGFyYW0gPSAodTMyICopICgmY21kLnBhcmFtKTsKKworCWlmICghcHJpdikgeworCQlJUFdfRVJST1IoIkludmFsaWQgYXJnc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBJZiBvbiBiYXR0ZXJ5LCBzZXQgdG8gMywgaWYgQUMgc2V0IHRvIENBTSwgZWxzZSB1c2VyCisJICogbGV2ZWwgKi8KKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIElQV19QT1dFUl9CQVRURVJZOgorCQkqcGFyYW0gPSBJUFdfUE9XRVJfSU5ERVhfMzsKKwkJYnJlYWs7CisJY2FzZSBJUFdfUE9XRVJfQUM6CisJCSpwYXJhbSA9IElQV19QT1dFUl9NT0RFX0NBTTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKnBhcmFtID0gbW9kZTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGlwd19zZW5kX2NtZChwcml2LCAmY21kKSkgeworCQlJUFdfRVJST1IoImZhaWxlZCB0byBzZW5kIFBPV0VSX01PREUgY29tbWFuZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBJUFcgZGV2aWNlIGNvbnRhaW5zIGEgTWljcm93aXJlIGNvbXBhdGlibGUgRUVQUk9NIHRoYXQgc3RvcmVzCisgKiB2YXJpb3VzIGRhdGEgbGlrZSB0aGUgTUFDIGFkZHJlc3MuICBVc3VhbGx5IHRoZSBmaXJtd2FyZSBoYXMgZXhjbHVzaXZlCisgKiBhY2Nlc3MgdG8gdGhlIGVlcHJvbSwgYnV0IGR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gKGJlZm9yZSB0aGUKKyAqIGRldmljZSBkcml2ZXIgaGFzIHNlbnQgdGhlIEhvc3RDb21wbGV0ZSBjb21tYW5kIHRvIHRoZSBmaXJtd2FyZSkgdGhlCisgKiBkZXZpY2UgZHJpdmVyIGhhcyByZWFkIGFjY2VzcyB0byB0aGUgRUVQUk9NIGJ5IHdheSBvZiBpbmRpcmVjdCBhZGRyZXNzaW5nCisgKiB0aHJvdWdoIGEgY291cGxlIG9mIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgaXMgYSBzaW1wbGlmaWVkIGltcGxlbWVudGF0aW9uIGZvciBwdWxsaW5nIGRhdGEgb3V0IG9mIHRoZQorICogdGhlIGVlcHJvbSwgYWxvbmcgd2l0aCBzb21lIGhlbHBlciBmdW5jdGlvbnMgdG8gZmluZCBpbmZvcm1hdGlvbiBpbgorICogdGhlIHBlciBkZXZpY2UgcHJpdmF0ZSBkYXRhJ3MgY29weSBvZiB0aGUgZWVwcm9tLgorICoKKyAqIE5PVEU6IFRvIGJldHRlciB1bmRlcnN0YW5kIGhvdyB0aGVzZSBmdW5jdGlvbnMgd29yayAoaS5lIHdoYXQgaXMgYSBjaGlwCisgKiAgICAgICBzZWxlY3QgYW5kIHdoeSBkbyBoYXZlIHRvIGtlZXAgZHJpdmluZyB0aGUgZWVwcm9tIGNsb2NrPyksIHJlYWQKKyAqICAgICAgIGp1c3QgYWJvdXQgYW55IGRhdGEgc2hlZXQgZm9yIGEgTWljcm93aXJlIGNvbXBhdGlibGUgRUVQUk9NLgorICovCisKKy8qIHdyaXRlIGEgMzIgYml0IHZhbHVlIGludG8gdGhlIGluZGlyZWN0IGFjY2Vzc29yIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgZWVwcm9tX3dyaXRlX3JlZyhzdHJ1Y3QgaXB3X3ByaXYgKnAsIHUzMiBkYXRhKQoreworCWlwd193cml0ZV9yZWczMihwLCBGV19NRU1fUkVHX0VFUFJPTV9BQ0NFU1MsIGRhdGEpOworCisJLyogdGhlIGVlcHJvbSByZXF1aXJlcyBzb21lIHRpbWUgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbiAqLworCXVkZWxheShwLT5lZXByb21fZGVsYXkpOworCisJcmV0dXJuOworfQorCisvKiBwZXJmb3JtIGEgY2hpcCBzZWxlY3Qgb3BlcmF0aW9uICovCitzdGF0aWMgaW5saW5lIHZvaWQgZWVwcm9tX2NzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwllZXByb21fd3JpdGVfcmVnKHByaXYsIDApOworCWVlcHJvbV93cml0ZV9yZWcocHJpdiwgRUVQUk9NX0JJVF9DUyk7CisJZWVwcm9tX3dyaXRlX3JlZyhwcml2LCBFRVBST01fQklUX0NTIHwgRUVQUk9NX0JJVF9TSyk7CisJZWVwcm9tX3dyaXRlX3JlZyhwcml2LCBFRVBST01fQklUX0NTKTsKK30KKworLyogcGVyZm9ybSBhIGNoaXAgc2VsZWN0IG9wZXJhdGlvbiAqLworc3RhdGljIGlubGluZSB2b2lkIGVlcHJvbV9kaXNhYmxlX2NzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwllZXByb21fd3JpdGVfcmVnKHByaXYsIEVFUFJPTV9CSVRfQ1MpOworCWVlcHJvbV93cml0ZV9yZWcocHJpdiwgMCk7CisJZWVwcm9tX3dyaXRlX3JlZyhwcml2LCBFRVBST01fQklUX1NLKTsKK30KKworLyogcHVzaCBhIHNpbmdsZSBiaXQgZG93biB0byB0aGUgZWVwcm9tICovCitzdGF0aWMgaW5saW5lIHZvaWQgZWVwcm9tX3dyaXRlX2JpdChzdHJ1Y3QgaXB3X3ByaXYgKnAsIHU4IGJpdCkKK3sKKwlpbnQgZCA9IChiaXQgPyBFRVBST01fQklUX0RJIDogMCk7CisJZWVwcm9tX3dyaXRlX3JlZyhwLCBFRVBST01fQklUX0NTIHwgZCk7CisJZWVwcm9tX3dyaXRlX3JlZyhwLCBFRVBST01fQklUX0NTIHwgZCB8IEVFUFJPTV9CSVRfU0spOworfQorCisvKiBwdXNoIGFuIG9wY29kZSBmb2xsb3dlZCBieSBhbiBhZGRyZXNzIGRvd24gdG8gdGhlIGVlcHJvbSAqLworc3RhdGljIHZvaWQgZWVwcm9tX29wKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTggb3AsIHU4IGFkZHIpCit7CisJaW50IGk7CisKKwllZXByb21fY3MocHJpdik7CisJZWVwcm9tX3dyaXRlX2JpdChwcml2LCAxKTsKKwllZXByb21fd3JpdGVfYml0KHByaXYsIG9wICYgMik7CisJZWVwcm9tX3dyaXRlX2JpdChwcml2LCBvcCAmIDEpOworCWZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7CisJCWVlcHJvbV93cml0ZV9iaXQocHJpdiwgYWRkciAmICgxIDw8IGkpKTsKKwl9Cit9CisKKy8qIHB1bGwgMTYgYml0cyBvZmYgdGhlIGVlcHJvbSwgb25lIGJpdCBhdCBhIHRpbWUgKi8KK3N0YXRpYyB1MTYgZWVwcm9tX3JlYWRfdTE2KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTggYWRkcikKK3sKKwlpbnQgaTsKKwl1MTYgciA9IDA7CisKKwkvKiBTZW5kIFJFQUQgT3Bjb2RlICovCisJZWVwcm9tX29wKHByaXYsIEVFUFJPTV9DTURfUkVBRCwgYWRkcik7CisKKwkvKiBTZW5kIGR1bW15IGJpdCAqLworCWVlcHJvbV93cml0ZV9yZWcocHJpdiwgRUVQUk9NX0JJVF9DUyk7CisKKwkvKiBSZWFkIHRoZSBieXRlIG9mZiB0aGUgZWVwcm9tIG9uZSBiaXQgYXQgYSB0aW1lICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJdTMyIGRhdGEgPSAwOworCQllZXByb21fd3JpdGVfcmVnKHByaXYsIEVFUFJPTV9CSVRfQ1MgfCBFRVBST01fQklUX1NLKTsKKwkJZWVwcm9tX3dyaXRlX3JlZyhwcml2LCBFRVBST01fQklUX0NTKTsKKwkJZGF0YSA9IGlwd19yZWFkX3JlZzMyKHByaXYsIEZXX01FTV9SRUdfRUVQUk9NX0FDQ0VTUyk7CisJCXIgPSAociA8PCAxKSB8ICgoZGF0YSAmIEVFUFJPTV9CSVRfRE8pID8gMSA6IDApOworCX0KKworCS8qIFNlbmQgYW5vdGhlciBkdW1teSBiaXQgKi8KKwllZXByb21fd3JpdGVfcmVnKHByaXYsIDApOworCWVlcHJvbV9kaXNhYmxlX2NzKHByaXYpOworCisJcmV0dXJuIHI7Cit9CisKKy8qIGhlbHBlciBmdW5jdGlvbiBmb3IgcHVsbGluZyB0aGUgbWFjIGFkZHJlc3Mgb3V0IG9mIHRoZSBwcml2YXRlICovCisvKiBkYXRhJ3MgY29weSBvZiB0aGUgZWVwcm9tIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIHZvaWQgZWVwcm9tX3BhcnNlX21hYyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4ICogbWFjKQoreworCXU4ICplZSA9ICh1OCAqKSBwcml2LT5lZXByb207CisJbWVtY3B5KG1hYywgJmVlW0VFUFJPTV9NQUNfQUREUkVTU10sIDYpOworfQorCisvKgorICogRWl0aGVyIHRoZSBkZXZpY2UgZHJpdmVyIChpLmUuIHRoZSBob3N0KSBvciB0aGUgZmlybXdhcmUgY2FuCisgKiBsb2FkIGVlcHJvbSBkYXRhIGludG8gdGhlIGRlc2lnbmF0ZWQgcmVnaW9uIGluIFNSQU0uICBJZiBuZWl0aGVyCisgKiBoYXBwZW5zIHRoZW4gdGhlIEZXIHdpbGwgc2h1dGRvd24gd2l0aCBhIGZhdGFsIGVycm9yLgorICoKKyAqIEluIG9yZGVyIHRvIHNpZ25hbCB0aGUgRlcgdG8gbG9hZCB0aGUgRUVQUk9NLCB0aGUgRUVQUk9NX0xPQURfRElTQUJMRQorICogYml0IG5lZWRzIHJlZ2lvbiBvZiBzaGFyZWQgU1JBTSBuZWVkcyB0byBiZSBub24temVyby4KKyAqLworc3RhdGljIHZvaWQgaXB3X2VlcHJvbV9pbml0X3NyYW0oc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCWludCBpOworCXUxNiAqZWVwcm9tID0gKHUxNiAqKSBwcml2LT5lZXByb207CisKKwlJUFdfREVCVUdfVFJBQ0UoIj4+XG4iKTsKKworCS8qIHJlYWQgZW50aXJlIGNvbnRlbnRzIG9mIGVlcHJvbSBpbnRvIHByaXZhdGUgYnVmZmVyICovCisJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorCQllZXByb21baV0gPSBlZXByb21fcmVhZF91MTYocHJpdiwgKHU4KSBpKTsKKworCS8qCisJICAgSWYgdGhlIGRhdGEgbG9va3MgY29ycmVjdCwgdGhlbiBjb3B5IGl0IHRvIG91ciBwcml2YXRlCisJICAgY29weS4gIE90aGVyd2lzZSBsZXQgdGhlIGZpcm13YXJlIGtub3cgdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uCisJICAgb24gaXQncyBvd24KKwkgKi8KKwlpZiAoKHByaXYtPmVlcHJvbSArIEVFUFJPTV9WRVJTSU9OKSAhPSAwKSB7CisJCUlQV19ERUJVR19JTkZPKCJXcml0aW5nIEVFUFJPTSBkYXRhIGludG8gU1JBTVxuIik7CisKKwkJLyogd3JpdGUgdGhlIGVlcHJvbSBkYXRhIHRvIHNyYW0gKi8KKwkJZm9yIChpID0gMDsgaSA8IENYMl9FRVBST01fSU1BR0VfU0laRTsgaSsrKQorCQkJaXB3X3dyaXRlOChwcml2LCBJUFdfRUVQUk9NX0RBVEEgKyBpLCBwcml2LT5lZXByb21baV0pOworCisJCS8qIERvIG5vdCBsb2FkIGVlcHJvbSBkYXRhIG9uIGZhdGFsIGVycm9yIG9yIHN1c3BlbmQgKi8KKwkJaXB3X3dyaXRlMzIocHJpdiwgSVBXX0VFUFJPTV9MT0FEX0RJU0FCTEUsIDApOworCX0gZWxzZSB7CisJCUlQV19ERUJVR19JTkZPKCJFbmFibGluZyBGVyBpbml0aWFsaXphdGlvbmcgb2YgU1JBTVxuIik7CisKKwkJLyogTG9hZCBlZXByb20gZGF0YSBvbiBmYXRhbCBlcnJvciBvciBzdXNwZW5kICovCisJCWlwd193cml0ZTMyKHByaXYsIElQV19FRVBST01fTE9BRF9ESVNBQkxFLCAxKTsKKwl9CisKKwlJUFdfREVCVUdfVFJBQ0UoIjw8XG4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwd196ZXJvX21lbW9yeShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiBzdGFydCwgdTMyIGNvdW50KQoreworCWNvdW50ID4+PSAyOworCWlmICghY291bnQpCisJCXJldHVybjsKKwlfaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0FVVE9JTkNfQUREUiwgc3RhcnQpOworCXdoaWxlIChjb3VudC0tKQorCQlfaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0FVVE9JTkNfREFUQSwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHdfZndfZG1hX3Jlc2V0X2NvbW1hbmRfYmxvY2tzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwlpcHdfemVyb19tZW1vcnkocHJpdiwgQ1gyX1NIQVJFRF9TUkFNX0RNQV9DT05UUk9MLAorCQkJQ0JfTlVNQkVSX09GX0VMRU1FTlRTX1NNQUxMICoKKwkJCXNpemVvZihzdHJ1Y3QgY29tbWFuZF9ibG9jaykpOworfQorCitzdGF0aWMgaW50IGlwd19md19kbWFfZW5hYmxlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sJCQkJLyogc3RhcnQgZG1hIGVuZ2luZSBidXQgbm8gdHJhbnNmZXJzIHlldCAqLworCisJSVBXX0RFQlVHX0ZXKCI+PiA6IFxuIik7CisKKwkvKiBTdGFydCB0aGUgZG1hICovCisJaXB3X2Z3X2RtYV9yZXNldF9jb21tYW5kX2Jsb2Nrcyhwcml2KTsKKworCS8qIFdyaXRlIENCIGJhc2UgYWRkcmVzcyAqLworCWlwd193cml0ZV9yZWczMihwcml2LCBDWDJfRE1BX0lfQ0JfQkFTRSwgQ1gyX1NIQVJFRF9TUkFNX0RNQV9DT05UUk9MKTsKKworCUlQV19ERUJVR19GVygiPDwgOiBcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpcHdfZndfZG1hX2Fib3J0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwl1MzIgY29udHJvbCA9IDA7CisKKwlJUFdfREVCVUdfRlcoIj4+IDpcbiIpOworCisJLy9zZXQgdGhlIFN0b3AgYW5kIEFib3J0IGJpdAorCWNvbnRyb2wgPSBETUFfQ09OVFJPTF9TTUFMTF9DQl9DT05TVF9WQUxVRSB8IERNQV9DQl9TVE9QX0FORF9BQk9SVDsKKwlpcHdfd3JpdGVfcmVnMzIocHJpdiwgQ1gyX0RNQV9JX0RNQV9DT05UUk9MLCBjb250cm9sKTsKKwlwcml2LT5zcmFtX2Rlc2MubGFzdF9jYl9pbmRleCA9IDA7CisKKwlJUFdfREVCVUdfRlcoIjw8IFxuIik7Cit9CisKK3N0YXRpYyBpbnQgaXB3X2Z3X2RtYV93cml0ZV9jb21tYW5kX2Jsb2NrKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgaW50IGluZGV4LAorCQkJCQkgIHN0cnVjdCBjb21tYW5kX2Jsb2NrICpjYikKK3sKKwl1MzIgYWRkcmVzcyA9CisJICAgIENYMl9TSEFSRURfU1JBTV9ETUFfQ09OVFJPTCArCisJICAgIChzaXplb2Yoc3RydWN0IGNvbW1hbmRfYmxvY2spICogaW5kZXgpOworCUlQV19ERUJVR19GVygiPj4gOlxuIik7CisKKwlpcHdfd3JpdGVfaW5kaXJlY3QocHJpdiwgYWRkcmVzcywgKHU4ICopIGNiLAorCQkJICAgKGludClzaXplb2Yoc3RydWN0IGNvbW1hbmRfYmxvY2spKTsKKworCUlQV19ERUJVR19GVygiPDwgOlxuIik7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBpcHdfZndfZG1hX2tpY2soc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCXUzMiBjb250cm9sID0gMDsKKwl1MzIgaW5kZXggPSAwOworCisJSVBXX0RFQlVHX0ZXKCI+PiA6XG4iKTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHByaXYtPnNyYW1fZGVzYy5sYXN0X2NiX2luZGV4OyBpbmRleCsrKQorCQlpcHdfZndfZG1hX3dyaXRlX2NvbW1hbmRfYmxvY2socHJpdiwgaW5kZXgsCisJCQkJCSAgICAgICAmcHJpdi0+c3JhbV9kZXNjLmNiX2xpc3RbaW5kZXhdKTsKKworCS8qIEVuYWJsZSB0aGUgRE1BIGluIHRoZSBDU1IgcmVnaXN0ZXIgKi8KKwlpcHdfY2xlYXJfYml0KHByaXYsIENYMl9SRVNFVF9SRUcsCisJCSAgICAgIENYMl9SRVNFVF9SRUdfTUFTVEVSX0RJU0FCTEVEIHwKKwkJICAgICAgQ1gyX1JFU0VUX1JFR19TVE9QX01BU1RFUik7CisKKwkvKiBTZXQgdGhlIFN0YXJ0IGJpdC4gKi8KKwljb250cm9sID0gRE1BX0NPTlRST0xfU01BTExfQ0JfQ09OU1RfVkFMVUUgfCBETUFfQ0JfU1RBUlQ7CisJaXB3X3dyaXRlX3JlZzMyKHByaXYsIENYMl9ETUFfSV9ETUFfQ09OVFJPTCwgY29udHJvbCk7CisKKwlJUFdfREVCVUdfRlcoIjw8IDpcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpcHdfZndfZG1hX2R1bXBfY29tbWFuZF9ibG9jayhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCit7CisJdTMyIGFkZHJlc3M7CisJdTMyIHJlZ2lzdGVyX3ZhbHVlID0gMDsKKwl1MzIgY2JfZmllbGRzX2FkZHJlc3MgPSAwOworCisJSVBXX0RFQlVHX0ZXKCI+PiA6XG4iKTsKKwlhZGRyZXNzID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgQ1gyX0RNQV9JX0NVUlJFTlRfQ0IpOworCUlQV19ERUJVR19GV19JTkZPKCJDdXJyZW50IENCIGlzIDB4JXggXG4iLCBhZGRyZXNzKTsKKworCS8qIFJlYWQgdGhlIERNQSBDb250cm9sb3IgcmVnaXN0ZXIgKi8KKwlyZWdpc3Rlcl92YWx1ZSA9IGlwd19yZWFkX3JlZzMyKHByaXYsIENYMl9ETUFfSV9ETUFfQ09OVFJPTCk7CisJSVBXX0RFQlVHX0ZXX0lORk8oIkNYMl9ETUFfSV9ETUFfQ09OVFJPTCBpcyAweCV4IFxuIiwgcmVnaXN0ZXJfdmFsdWUpOworCisJLyogUHJpbnQgdGhlIENCIHZhbHVlcyAqLworCWNiX2ZpZWxkc19hZGRyZXNzID0gYWRkcmVzczsKKwlyZWdpc3Rlcl92YWx1ZSA9IGlwd19yZWFkX3JlZzMyKHByaXYsIGNiX2ZpZWxkc19hZGRyZXNzKTsKKwlJUFdfREVCVUdfRldfSU5GTygiQ3VycmVudCBDQiBDb250cm9sRmllbGQgaXMgMHgleCBcbiIsIHJlZ2lzdGVyX3ZhbHVlKTsKKworCWNiX2ZpZWxkc19hZGRyZXNzICs9IHNpemVvZih1MzIpOworCXJlZ2lzdGVyX3ZhbHVlID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgY2JfZmllbGRzX2FkZHJlc3MpOworCUlQV19ERUJVR19GV19JTkZPKCJDdXJyZW50IENCIFNvdXJjZSBGaWVsZCBpcyAweCV4IFxuIiwgcmVnaXN0ZXJfdmFsdWUpOworCisJY2JfZmllbGRzX2FkZHJlc3MgKz0gc2l6ZW9mKHUzMik7CisJcmVnaXN0ZXJfdmFsdWUgPSBpcHdfcmVhZF9yZWczMihwcml2LCBjYl9maWVsZHNfYWRkcmVzcyk7CisJSVBXX0RFQlVHX0ZXX0lORk8oIkN1cnJlbnQgQ0IgRGVzdGluYXRpb24gRmllbGQgaXMgMHgleCBcbiIsCisJCQkgIHJlZ2lzdGVyX3ZhbHVlKTsKKworCWNiX2ZpZWxkc19hZGRyZXNzICs9IHNpemVvZih1MzIpOworCXJlZ2lzdGVyX3ZhbHVlID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgY2JfZmllbGRzX2FkZHJlc3MpOworCUlQV19ERUJVR19GV19JTkZPKCJDdXJyZW50IENCIFN0YXR1cyBGaWVsZCBpcyAweCV4IFxuIiwgcmVnaXN0ZXJfdmFsdWUpOworCisJSVBXX0RFQlVHX0ZXKCI+PiA6XG4iKTsKK30KKworc3RhdGljIGludCBpcHdfZndfZG1hX2NvbW1hbmRfYmxvY2tfaW5kZXgoc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCXUzMiBjdXJyZW50X2NiX2FkZHJlc3MgPSAwOworCXUzMiBjdXJyZW50X2NiX2luZGV4ID0gMDsKKworCUlQV19ERUJVR19GVygiPDwgOlxuIik7CisJY3VycmVudF9jYl9hZGRyZXNzID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgQ1gyX0RNQV9JX0NVUlJFTlRfQ0IpOworCisJY3VycmVudF9jYl9pbmRleCA9IChjdXJyZW50X2NiX2FkZHJlc3MgLSBDWDJfU0hBUkVEX1NSQU1fRE1BX0NPTlRST0wpIC8KKwkgICAgc2l6ZW9mKHN0cnVjdCBjb21tYW5kX2Jsb2NrKTsKKworCUlQV19ERUJVR19GV19JTkZPKCJDdXJyZW50IENCIGluZGV4IDB4JXggYWRkcmVzcyA9IDB4JVggXG4iLAorCQkJICBjdXJyZW50X2NiX2luZGV4LCBjdXJyZW50X2NiX2FkZHJlc3MpOworCisJSVBXX0RFQlVHX0ZXKCI+PiA6XG4iKTsKKwlyZXR1cm4gY3VycmVudF9jYl9pbmRleDsKKworfQorCitzdGF0aWMgaW50IGlwd19md19kbWFfYWRkX2NvbW1hbmRfYmxvY2soc3RydWN0IGlwd19wcml2ICpwcml2LAorCQkJCQl1MzIgc3JjX2FkZHJlc3MsCisJCQkJCXUzMiBkZXN0X2FkZHJlc3MsCisJCQkJCXUzMiBsZW5ndGgsCisJCQkJCWludCBpbnRlcnJ1cHRfZW5hYmxlZCwgaW50IGlzX2xhc3QpCit7CisKKwl1MzIgY29udHJvbCA9IENCX1ZBTElEIHwgQ0JfU1JDX0xFIHwgQ0JfREVTVF9MRSB8IENCX1NSQ19BVVRPSU5DIHwKKwkgICAgQ0JfU1JDX0lPX0dBVEVEIHwgQ0JfREVTVF9BVVRPSU5DIHwgQ0JfU1JDX1NJWkVfTE9ORyB8CisJICAgIENCX0RFU1RfU0laRV9MT05HOworCXN0cnVjdCBjb21tYW5kX2Jsb2NrICpjYjsKKwl1MzIgbGFzdF9jYl9lbGVtZW50ID0gMDsKKworCUlQV19ERUJVR19GV19JTkZPKCJzcmNfYWRkcmVzcz0weCV4IGRlc3RfYWRkcmVzcz0weCV4IGxlbmd0aD0weCV4XG4iLAorCQkJICBzcmNfYWRkcmVzcywgZGVzdF9hZGRyZXNzLCBsZW5ndGgpOworCisJaWYgKHByaXYtPnNyYW1fZGVzYy5sYXN0X2NiX2luZGV4ID49IENCX05VTUJFUl9PRl9FTEVNRU5UU19TTUFMTCkKKwkJcmV0dXJuIC0xOworCisJbGFzdF9jYl9lbGVtZW50ID0gcHJpdi0+c3JhbV9kZXNjLmxhc3RfY2JfaW5kZXg7CisJY2IgPSAmcHJpdi0+c3JhbV9kZXNjLmNiX2xpc3RbbGFzdF9jYl9lbGVtZW50XTsKKwlwcml2LT5zcmFtX2Rlc2MubGFzdF9jYl9pbmRleCsrOworCisJLyogQ2FsY3VsYXRlIHRoZSBuZXcgQ0IgY29udHJvbCB3b3JkICovCisJaWYgKGludGVycnVwdF9lbmFibGVkKQorCQljb250cm9sIHw9IENCX0lOVF9FTkFCTEVEOworCisJaWYgKGlzX2xhc3QpCisJCWNvbnRyb2wgfD0gQ0JfTEFTVF9WQUxJRDsKKworCWNvbnRyb2wgfD0gbGVuZ3RoOworCisJLyogQ2FsY3VsYXRlIHRoZSBDQiBFbGVtZW50J3MgY2hlY2tzdW0gdmFsdWUgKi8KKwljYi0+c3RhdHVzID0gY29udHJvbCBeIHNyY19hZGRyZXNzIF4gZGVzdF9hZGRyZXNzOworCisJLyogQ29weSB0aGUgU291cmNlIGFuZCBEZXN0aW5hdGlvbiBhZGRyZXNzZXMgKi8KKwljYi0+ZGVzdF9hZGRyID0gZGVzdF9hZGRyZXNzOworCWNiLT5zb3VyY2VfYWRkciA9IHNyY19hZGRyZXNzOworCisJLyogQ29weSB0aGUgQ29udHJvbCBXb3JkIGxhc3QgKi8KKwljYi0+Y29udHJvbCA9IGNvbnRyb2w7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfZndfZG1hX2FkZF9idWZmZXIoc3RydWN0IGlwd19wcml2ICpwcml2LAorCQkJCSB1MzIgc3JjX3BoeXMsIHUzMiBkZXN0X2FkZHJlc3MsIHUzMiBsZW5ndGgpCit7CisJdTMyIGJ5dGVzX2xlZnQgPSBsZW5ndGg7CisJdTMyIHNyY19vZmZzZXQgPSAwOworCXUzMiBkZXN0X29mZnNldCA9IDA7CisJaW50IHN0YXR1cyA9IDA7CisJSVBXX0RFQlVHX0ZXKCI+PiBcbiIpOworCUlQV19ERUJVR19GV19JTkZPKCJzcmNfcGh5cz0weCV4IGRlc3RfYWRkcmVzcz0weCV4IGxlbmd0aD0weCV4XG4iLAorCQkJICBzcmNfcGh5cywgZGVzdF9hZGRyZXNzLCBsZW5ndGgpOworCXdoaWxlIChieXRlc19sZWZ0ID4gQ0JfTUFYX0xFTkdUSCkgeworCQlzdGF0dXMgPSBpcHdfZndfZG1hX2FkZF9jb21tYW5kX2Jsb2NrKHByaXYsCisJCQkJCQkgICAgICBzcmNfcGh5cyArIHNyY19vZmZzZXQsCisJCQkJCQkgICAgICBkZXN0X2FkZHJlc3MgKworCQkJCQkJICAgICAgZGVzdF9vZmZzZXQsCisJCQkJCQkgICAgICBDQl9NQVhfTEVOR1RILCAwLCAwKTsKKwkJaWYgKHN0YXR1cykgeworCQkJSVBXX0RFQlVHX0ZXX0lORk8oIjogRmFpbGVkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlCisJCQlJUFdfREVCVUdfRldfSU5GTygiOiBBZGRlZCBuZXcgY2JcbiIpOworCisJCXNyY19vZmZzZXQgKz0gQ0JfTUFYX0xFTkdUSDsKKwkJZGVzdF9vZmZzZXQgKz0gQ0JfTUFYX0xFTkdUSDsKKwkJYnl0ZXNfbGVmdCAtPSBDQl9NQVhfTEVOR1RIOworCX0KKworCS8qIGFkZCB0aGUgYnVmZmVyIHRhaWwgKi8KKwlpZiAoYnl0ZXNfbGVmdCA+IDApIHsKKwkJc3RhdHVzID0KKwkJICAgIGlwd19md19kbWFfYWRkX2NvbW1hbmRfYmxvY2socHJpdiwgc3JjX3BoeXMgKyBzcmNfb2Zmc2V0LAorCQkJCQkJIGRlc3RfYWRkcmVzcyArIGRlc3Rfb2Zmc2V0LAorCQkJCQkJIGJ5dGVzX2xlZnQsIDAsIDApOworCQlpZiAoc3RhdHVzKSB7CisJCQlJUFdfREVCVUdfRldfSU5GTygiOiBGYWlsZWQgb24gdGhlIGJ1ZmZlciB0YWlsXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlCisJCQlJUFdfREVCVUdfRldfSU5GTworCQkJICAgICgiOiBBZGRpbmcgbmV3IGNiIC0gdGhlIGJ1ZmZlciB0YWlsXG4iKTsKKwl9CisKKwlJUFdfREVCVUdfRlcoIjw8IFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X2Z3X2RtYV93YWl0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwl1MzIgY3VycmVudF9pbmRleCA9IDA7CisJdTMyIHdhdGNoZG9nID0gMDsKKworCUlQV19ERUJVR19GVygiPj4gOiBcbiIpOworCisJY3VycmVudF9pbmRleCA9IGlwd19md19kbWFfY29tbWFuZF9ibG9ja19pbmRleChwcml2KTsKKwlJUFdfREVCVUdfRldfSU5GTygic3JhbV9kZXNjLmxhc3RfY2JfaW5kZXg6MHglOFhcbiIsCisJCQkgIChpbnQpcHJpdi0+c3JhbV9kZXNjLmxhc3RfY2JfaW5kZXgpOworCisJd2hpbGUgKGN1cnJlbnRfaW5kZXggPCBwcml2LT5zcmFtX2Rlc2MubGFzdF9jYl9pbmRleCkgeworCQl1ZGVsYXkoNTApOworCQljdXJyZW50X2luZGV4ID0gaXB3X2Z3X2RtYV9jb21tYW5kX2Jsb2NrX2luZGV4KHByaXYpOworCisJCXdhdGNoZG9nKys7CisKKwkJaWYgKHdhdGNoZG9nID4gNDAwKSB7CisJCQlJUFdfREVCVUdfRldfSU5GTygiVGltZW91dFxuIik7CisJCQlpcHdfZndfZG1hX2R1bXBfY29tbWFuZF9ibG9jayhwcml2KTsKKwkJCWlwd19md19kbWFfYWJvcnQocHJpdik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpcHdfZndfZG1hX2Fib3J0KHByaXYpOworCisJLypEaXNhYmxlIHRoZSBETUEgaW4gdGhlIENTUiByZWdpc3RlciAqLworCWlwd19zZXRfYml0KHByaXYsIENYMl9SRVNFVF9SRUcsCisJCSAgICBDWDJfUkVTRVRfUkVHX01BU1RFUl9ESVNBQkxFRCB8IENYMl9SRVNFVF9SRUdfU1RPUF9NQVNURVIpOworCisJSVBXX0RFQlVHX0ZXKCI8PCBkbWFXYWl0U3luYyBcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpcHdfcmVtb3ZlX2N1cnJlbnRfbmV0d29yayhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudCwgKnNhZmU7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrID0gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZWxlbWVudCwgc2FmZSwgJnByaXYtPmllZWUtPm5ldHdvcmtfbGlzdCkgeworCQluZXR3b3JrID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmssIGxpc3QpOworCQlpZiAoIW1lbWNtcChuZXR3b3JrLT5ic3NpZCwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKSkgeworCQkJbGlzdF9kZWwoZWxlbWVudCk7CisJCQlsaXN0X2FkZF90YWlsKCZuZXR3b3JrLT5saXN0LAorCQkJCSAgICAgICZwcml2LT5pZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogQ2hlY2sgdGhhdCBjYXJkIGlzIHN0aWxsIGFsaXZlLgorICogUmVhZHMgZGVidWcgcmVnaXN0ZXIgZnJvbSBkb21haW4wLgorICogSWYgY2FyZCBpcyBwcmVzZW50LCBwcmUtZGVmaW5lZCB2YWx1ZSBzaG91bGQKKyAqIGJlIGZvdW5kIHRoZXJlLgorICoKKyAqIEBwYXJhbSBwcml2CisgKiBAcmV0dXJuIDEgaWYgY2FyZCBpcyBwcmVzZW50LCAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGludCBpcHdfYWxpdmUoc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCXJldHVybiBpcHdfcmVhZDMyKHByaXYsIDB4OTApID09IDB4ZDU1NTU1ZDU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlwd19wb2xsX2JpdChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiBhZGRyLCB1MzIgbWFzaywKKwkJCSAgICAgICBpbnQgdGltZW91dCkKK3sKKwlpbnQgaSA9IDA7CisKKwlkbyB7CisJCWlmICgoaXB3X3JlYWQzMihwcml2LCBhZGRyKSAmIG1hc2spID09IG1hc2spCisJCQlyZXR1cm4gaTsKKwkJbWRlbGF5KDEwKTsKKwkJaSArPSAxMDsKKwl9IHdoaWxlIChpIDwgdGltZW91dCk7CisKKwlyZXR1cm4gLUVUSU1FOworfQorCisvKiBUaGVzZSBmdW5jdGlvbnMgbG9hZCB0aGUgZmlybXdhcmUgYW5kIG1pY3JvIGNvZGUgZm9yIHRoZSBvcGVyYXRpb24gb2YKKyAqIHRoZSBpcHcgaGFyZHdhcmUuICBJdCBhc3N1bWVzIHRoZSBidWZmZXIgaGFzIGFsbCB0aGUgYml0cyBmb3IgdGhlCisgKiBpbWFnZSBhbmQgdGhlIGNhbGxlciBpcyBoYW5kbGluZyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGNsZWFuIHVwLgorICovCisKK3N0YXRpYyBpbnQgaXB3X3N0b3BfbWFzdGVyKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwlpbnQgcmM7CisKKwlJUFdfREVCVUdfVFJBQ0UoIj4+IFxuIik7CisJLyogc3RvcCBtYXN0ZXIuIHR5cGljYWwgZGVsYXkgLSAwICovCisJaXB3X3NldF9iaXQocHJpdiwgQ1gyX1JFU0VUX1JFRywgQ1gyX1JFU0VUX1JFR19TVE9QX01BU1RFUik7CisKKwlyYyA9IGlwd19wb2xsX2JpdChwcml2LCBDWDJfUkVTRVRfUkVHLAorCQkJICBDWDJfUkVTRVRfUkVHX01BU1RFUl9ESVNBQkxFRCwgMTAwKTsKKwlpZiAocmMgPCAwKSB7CisJCUlQV19FUlJPUigic3RvcCBtYXN0ZXIgZmFpbGVkIGluIDEwbXNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJSVBXX0RFQlVHX0lORk8oInN0b3AgbWFzdGVyICVkbXNcbiIsIHJjKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgaXB3X2FyY19yZWxlYXNlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwlJUFdfREVCVUdfVFJBQ0UoIj4+IFxuIik7CisJbWRlbGF5KDUpOworCisJaXB3X2NsZWFyX2JpdChwcml2LCBDWDJfUkVTRVRfUkVHLCBDQkRfUkVTRVRfUkVHX1BSSU5DRVRPTl9SRVNFVCk7CisKKwkvKiBubyBvbmUga25vd3MgdGltaW5nLCBmb3Igc2FmZXR5IGFkZCBzb21lIGRlbGF5ICovCisJbWRlbGF5KDUpOworfQorCitzdHJ1Y3QgZndfaGVhZGVyIHsKKwl1MzIgdmVyc2lvbjsKKwl1MzIgbW9kZTsKK307CisKK3N0cnVjdCBmd19jaHVuayB7CisJdTMyIGFkZHJlc3M7CisJdTMyIGxlbmd0aDsKK307CisKKyNkZWZpbmUgSVBXX0ZXX01BSk9SX1ZFUlNJT04gMgorI2RlZmluZSBJUFdfRldfTUlOT1JfVkVSU0lPTiAyCisKKyNkZWZpbmUgSVBXX0ZXX01JTk9SKHgpICgoeCAmIDB4ZmYpID4+IDgpCisjZGVmaW5lIElQV19GV19NQUpPUih4KSAoeCAmIDB4ZmYpCisKKyNkZWZpbmUgSVBXX0ZXX1ZFUlNJT04gKChJUFdfRldfTUlOT1JfVkVSU0lPTiA8PCA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJUFdfRldfTUFKT1JfVkVSU0lPTikKKworI2RlZmluZSBJUFdfRldfUFJFRklYICJpcHctIiBfX3N0cmluZ2lmeShJUFdfRldfTUFKT1JfVkVSU0lPTikgXAorIi4iIF9fc3RyaW5naWZ5KElQV19GV19NSU5PUl9WRVJTSU9OKSAiLSIKKworI2lmIElQV19GV19NQUpPUl9WRVJTSU9OID49IDIgJiYgSVBXX0ZXX01JTk9SX1ZFUlNJT04gPiAwCisjZGVmaW5lIElQV19GV19OQU1FKHgpIElQV19GV19QUkVGSVggIiIgeCAiLmZ3IgorI2Vsc2UKKyNkZWZpbmUgSVBXX0ZXX05BTUUoeCkgImlwdzIyMDBfIiB4ICIuZnciCisjZW5kaWYKKworc3RhdGljIGludCBpcHdfbG9hZF91Y29kZShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4ICogZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlpbnQgcmMgPSAwLCBpLCBhZGRyOworCXU4IGNyID0gMDsKKwl1MTYgKmltYWdlOworCisJaW1hZ2UgPSAodTE2ICopIGRhdGE7CisKKwlJUFdfREVCVUdfVFJBQ0UoIj4+IFxuIik7CisKKwlyYyA9IGlwd19zdG9wX21hc3Rlcihwcml2KTsKKworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworLy8gICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJZm9yIChhZGRyID0gQ1gyX1NIQVJFRF9MT1dFUl9CT1VORDsKKwkgICAgIGFkZHIgPCBDWDJfUkVHSVNURVJfRE9NQUlOMV9FTkQ7IGFkZHIgKz0gNCkgeworCQlpcHdfd3JpdGUzMihwcml2LCBhZGRyLCAwKTsKKwl9CisKKwkvKiBubyB1Y29kZSAoeWV0KSAqLworCW1lbXNldCgmcHJpdi0+ZGlub19hbGl2ZSwgMCwgc2l6ZW9mKHByaXYtPmRpbm9fYWxpdmUpKTsKKwkvKiBkZXN0cm95IERNQSBxdWV1ZXMgKi8KKwkvKiByZXNldCBzZXF1ZW5jZSAqLworCisJaXB3X3dyaXRlX3JlZzMyKHByaXYsIENYMl9NRU1fSEFMVF9BTkRfUkVTRVQsIENYMl9CSVRfSEFMVF9SRVNFVF9PTik7CisJaXB3X2FyY19yZWxlYXNlKHByaXYpOworCWlwd193cml0ZV9yZWczMihwcml2LCBDWDJfTUVNX0hBTFRfQU5EX1JFU0VULCBDWDJfQklUX0hBTFRfUkVTRVRfT0ZGKTsKKwltZGVsYXkoMSk7CisKKwkvKiByZXNldCBQSFkgKi8KKwlpcHdfd3JpdGVfcmVnMzIocHJpdiwgQ1gyX0lOVEVSTkFMX0NNRF9FVkVOVCwgQ1gyX0JBU0VCQU5EX1BPV0VSX0RPV04pOworCW1kZWxheSgxKTsKKworCWlwd193cml0ZV9yZWczMihwcml2LCBDWDJfSU5URVJOQUxfQ01EX0VWRU5ULCAwKTsKKwltZGVsYXkoMSk7CisKKwkvKiBlbmFibGUgdWNvZGUgc3RvcmUgKi8KKwlpcHdfd3JpdGVfcmVnOChwcml2LCBESU5PX0NPTlRST0xfUkVHLCAweDApOworCWlwd193cml0ZV9yZWc4KHByaXYsIERJTk9fQ09OVFJPTF9SRUcsIERJTk9fRU5BQkxFX0NTKTsKKwltZGVsYXkoMSk7CisKKwkvKiB3cml0ZSB1Y29kZSAqLworCS8qKgorCSAqIEBidWcKKwkgKiBEbyBOT1Qgc2V0IGluZGlyZWN0IGFkZHJlc3MgcmVnaXN0ZXIgb25jZSBhbmQgdGhlbgorCSAqIHN0b3JlIGRhdGEgdG8gaW5kaXJlY3QgZGF0YSByZWdpc3RlciBpbiB0aGUgbG9vcC4KKwkgKiBJdCBzZWVtcyB2ZXJ5IHJlYXNvbmFibGUsIGJ1dCBpbiB0aGlzIGNhc2UgRElOTyBkbyBub3QKKwkgKiBhY2NlcHQgdWNvZGUuIEl0IGlzIGVzc2VudGlhbCB0byBzZXQgYWRkcmVzcyBlYWNoIHRpbWUuCisJICovCisJLyogbG9hZCBuZXcgaXB3IHVDb2RlICovCisJZm9yIChpID0gMDsgaSA8IGxlbiAvIDI7IGkrKykKKwkJaXB3X3dyaXRlX3JlZzE2KHByaXYsIENYMl9CQVNFQkFORF9DT05UUk9MX1NUT1JFLCBpbWFnZVtpXSk7CisKKwkvKiBlbmFibGUgRElOTyAqLworCWlwd193cml0ZV9yZWc4KHByaXYsIENYMl9CQVNFQkFORF9DT05UUk9MX1NUQVRVUywgMCk7CisJaXB3X3dyaXRlX3JlZzgocHJpdiwgQ1gyX0JBU0VCQU5EX0NPTlRST0xfU1RBVFVTLCBESU5PX0VOQUJMRV9TWVNURU0pOworCisJLyogdGhpcyBpcyB3aGVyZSB0aGUgaWd4IC8gd2luIGRyaXZlciBkZXZlYXRlcyBmcm9tIHRoZSBWQVAgZHJpdmVyLiAqLworCisJLyogd2FpdCBmb3IgYWxpdmUgcmVzcG9uc2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJLyogcG9sbCBmb3IgaW5jb21pbmcgZGF0YSAqLworCQljciA9IGlwd19yZWFkX3JlZzgocHJpdiwgQ1gyX0JBU0VCQU5EX0NPTlRST0xfU1RBVFVTKTsKKwkJaWYgKGNyICYgRElOT19SWEZJRk9fREFUQSkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorCisJaWYgKGNyICYgRElOT19SWEZJRk9fREFUQSkgeworCQkvKiBhbGl2ZV9jb21tYW5kX3Jlc3BvbmNlIHNpemUgaXMgTk9UIG11bHRpcGxlIG9mIDQgKi8KKwkJdTMyIHJlc3BvbnNlX2J1ZmZlclsoc2l6ZW9mKHByaXYtPmRpbm9fYWxpdmUpICsgMykgLyA0XTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZXNwb25zZV9idWZmZXIpOyBpKyspCisJCQlyZXNwb25zZV9idWZmZXJbaV0gPQorCQkJICAgIGlwd19yZWFkX3JlZzMyKHByaXYsIENYMl9CQVNFQkFORF9SWF9GSUZPX1JFQUQpOworCQltZW1jcHkoJnByaXYtPmRpbm9fYWxpdmUsIHJlc3BvbnNlX2J1ZmZlciwKKwkJICAgICAgIHNpemVvZihwcml2LT5kaW5vX2FsaXZlKSk7CisJCWlmIChwcml2LT5kaW5vX2FsaXZlLmFsaXZlX2NvbW1hbmQgPT0gMQorCQkgICAgJiYgcHJpdi0+ZGlub19hbGl2ZS51Y29kZV92YWxpZCA9PSAxKSB7CisJCQlyYyA9IDA7CisJCQlJUFdfREVCVUdfSU5GTworCQkJICAgICgiTWljcm9jb2RlIE9LLCByZXYuICVkICgweCV4KSBkZXYuICVkICgweCV4KSAiCisJCQkgICAgICJvZiAlMDJkLyUwMmQvJTAyZCAlMDJkOiUwMmRcbiIsCisJCQkgICAgIHByaXYtPmRpbm9fYWxpdmUuc29mdHdhcmVfcmV2aXNpb24sCisJCQkgICAgIHByaXYtPmRpbm9fYWxpdmUuc29mdHdhcmVfcmV2aXNpb24sCisJCQkgICAgIHByaXYtPmRpbm9fYWxpdmUuZGV2aWNlX2lkZW50aWZpZXIsCisJCQkgICAgIHByaXYtPmRpbm9fYWxpdmUuZGV2aWNlX2lkZW50aWZpZXIsCisJCQkgICAgIHByaXYtPmRpbm9fYWxpdmUudGltZV9zdGFtcFswXSwKKwkJCSAgICAgcHJpdi0+ZGlub19hbGl2ZS50aW1lX3N0YW1wWzFdLAorCQkJICAgICBwcml2LT5kaW5vX2FsaXZlLnRpbWVfc3RhbXBbMl0sCisJCQkgICAgIHByaXYtPmRpbm9fYWxpdmUudGltZV9zdGFtcFszXSwKKwkJCSAgICAgcHJpdi0+ZGlub19hbGl2ZS50aW1lX3N0YW1wWzRdKTsKKwkJfSBlbHNlIHsKKwkJCUlQV19ERUJVR19JTkZPKCJNaWNyb2NvZGUgaXMgbm90IGFsaXZlXG4iKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCUlQV19ERUJVR19JTkZPKCJObyBhbGl2ZSByZXNwb25zZSBmcm9tIERJTk9cbiIpOworCQlyYyA9IC1FVElNRTsKKwl9CisKKwkvKiBkaXNhYmxlIERJTk8sIG90aGVyd2lzZSBmb3Igc29tZSByZWFzb24KKwkgICBmaXJtd2FyZSBoYXZlIHByb2JsZW0gZ2V0dGluZyBhbGl2ZSByZXNwLiAqLworCWlwd193cml0ZV9yZWc4KHByaXYsIENYMl9CQVNFQkFORF9DT05UUk9MX1NUQVRVUywgMCk7CisKKy8vICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGlwd19sb2FkX2Zpcm13YXJlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTggKiBkYXRhLCBzaXplX3QgbGVuKQoreworCWludCByYyA9IC0xOworCWludCBvZmZzZXQgPSAwOworCXN0cnVjdCBmd19jaHVuayAqY2h1bms7CisJZG1hX2FkZHJfdCBzaGFyZWRfcGh5czsKKwl1OCAqc2hhcmVkX3ZpcnQ7CisKKwlJUFdfREVCVUdfVFJBQ0UoIjw8IDogXG4iKTsKKwlzaGFyZWRfdmlydCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHByaXYtPnBjaV9kZXYsIGxlbiwgJnNoYXJlZF9waHlzKTsKKworCWlmICghc2hhcmVkX3ZpcnQpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtbW92ZShzaGFyZWRfdmlydCwgZGF0YSwgbGVuKTsKKworCS8qIFN0YXJ0IHRoZSBEbWEgKi8KKwlyYyA9IGlwd19md19kbWFfZW5hYmxlKHByaXYpOworCisJaWYgKHByaXYtPnNyYW1fZGVzYy5sYXN0X2NiX2luZGV4ID4gMCkgeworCQkvKiB0aGUgRE1BIGlzIGFscmVhZHkgcmVhZHkgdGhpcyB3b3VsZCBiZSBhIGJ1Zy4gKi8KKwkJQlVHKCk7CisJCWdvdG8gb3V0OworCX0KKworCWRvIHsKKwkJY2h1bmsgPSAoc3RydWN0IGZ3X2NodW5rICopKGRhdGEgKyBvZmZzZXQpOworCQlvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBmd19jaHVuayk7CisJCS8qIGJ1aWxkIERNQSBwYWNrZXQgYW5kIHF1ZXVlIHVwIGZvciBzZW5kaW5nICovCisJCS8qIGRtYSB0byBjaHVuay0+YWRkcmVzcywgdGhlIGNodW5rLT5sZW5ndGggYnl0ZXMgZnJvbSBkYXRhICsKKwkJICogb2ZmZXNldCovCisJCS8qIERtYSBsb2FkaW5nICovCisJCXJjID0gaXB3X2Z3X2RtYV9hZGRfYnVmZmVyKHByaXYsIHNoYXJlZF9waHlzICsgb2Zmc2V0LAorCQkJCQkgICBjaHVuay0+YWRkcmVzcywgY2h1bmstPmxlbmd0aCk7CisJCWlmIChyYykgeworCQkJSVBXX0RFQlVHX0lORk8oImRtYUFkZEJ1ZmZlciBGYWlsZWRcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlvZmZzZXQgKz0gY2h1bmstPmxlbmd0aDsKKwl9IHdoaWxlIChvZmZzZXQgPCBsZW4pOworCisJLyogUnVuIHRoZSBETUEgYW5kIHdhaXQgZm9yIHRoZSBhbnN3ZXIgKi8KKwlyYyA9IGlwd19md19kbWFfa2ljayhwcml2KTsKKwlpZiAocmMpIHsKKwkJSVBXX0VSUk9SKCJkbWFLaWNrIEZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gaXB3X2Z3X2RtYV93YWl0KHByaXYpOworCWlmIChyYykgeworCQlJUFdfRVJST1IoImRtYVdhaXRTeW5jIEZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKyAgICAgIG91dDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBjaV9kZXYsIGxlbiwgc2hhcmVkX3ZpcnQsIHNoYXJlZF9waHlzKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHN0b3AgbmljICovCitzdGF0aWMgaW50IGlwd19zdG9wX25pYyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCit7CisJaW50IHJjID0gMDsKKworCS8qIHN0b3AgKi8KKwlpcHdfd3JpdGUzMihwcml2LCBDWDJfUkVTRVRfUkVHLCBDWDJfUkVTRVRfUkVHX1NUT1BfTUFTVEVSKTsKKworCXJjID0gaXB3X3BvbGxfYml0KHByaXYsIENYMl9SRVNFVF9SRUcsCisJCQkgIENYMl9SRVNFVF9SRUdfTUFTVEVSX0RJU0FCTEVELCA1MDApOworCWlmIChyYyA8IDApIHsKKwkJSVBXX0VSUk9SKCJ3YWl0IGZvciByZWcgbWFzdGVyIGRpc2FibGVkIGZhaWxlZFxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlpcHdfc2V0X2JpdChwcml2LCBDWDJfUkVTRVRfUkVHLCBDQkRfUkVTRVRfUkVHX1BSSU5DRVRPTl9SRVNFVCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGlwd19zdGFydF9uaWMoc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCUlQV19ERUJVR19UUkFDRSgiPj5cbiIpOworCisJLyogcHJ2SHdTdGFydE5pYyAgcmVsZWFzZSBBUkMgKi8KKwlpcHdfY2xlYXJfYml0KHByaXYsIENYMl9SRVNFVF9SRUcsCisJCSAgICAgIENYMl9SRVNFVF9SRUdfTUFTVEVSX0RJU0FCTEVEIHwKKwkJICAgICAgQ1gyX1JFU0VUX1JFR19TVE9QX01BU1RFUiB8CisJCSAgICAgIENCRF9SRVNFVF9SRUdfUFJJTkNFVE9OX1JFU0VUKTsKKworCS8qIGVuYWJsZSBwb3dlciBtYW5hZ2VtZW50ICovCisJaXB3X3NldF9iaXQocHJpdiwgQ1gyX0dQX0NOVFJMX1JXLAorCQkgICAgQ1gyX0dQX0NOVFJMX0JJVF9IT1NUX0FMTE9XU19TVEFOREJZKTsKKworCUlQV19ERUJVR19UUkFDRSgiPDxcbiIpOworfQorCitzdGF0aWMgaW50IGlwd19pbml0X25pYyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCit7CisJaW50IHJjOworCisJSVBXX0RFQlVHX1RSQUNFKCI+PlxuIik7CisJLyogcmVzZXQgKi8KKwkvKnBydkh3SW5pdE5pYyAqLworCS8qIHNldCAiaW5pdGlhbGl6YXRpb24gY29tcGxldGUiIGJpdCB0byBtb3ZlIGFkYXB0ZXIgdG8gRDAgc3RhdGUgKi8KKwlpcHdfc2V0X2JpdChwcml2LCBDWDJfR1BfQ05UUkxfUlcsIENYMl9HUF9DTlRSTF9CSVRfSU5JVF9ET05FKTsKKworCS8qIGxvdy1sZXZlbCBQTEwgYWN0aXZhdGlvbiAqLworCWlwd193cml0ZTMyKHByaXYsIENYMl9SRUFEX0lOVF9SRUdJU1RFUiwKKwkJICAgIENYMl9CSVRfSU5UX0hPU1RfU1JBTV9SRUFEX0lOVF9SRUdJU1RFUik7CisKKwkvKiB3YWl0IGZvciBjbG9jayBzdGFiaWxpemF0aW9uICovCisJcmMgPSBpcHdfcG9sbF9iaXQocHJpdiwgQ1gyX0dQX0NOVFJMX1JXLAorCQkJICBDWDJfR1BfQ05UUkxfQklUX0NMT0NLX1JFQURZLCAyNTApOworCWlmIChyYyA8IDApCisJCUlQV19ERUJVR19JTkZPKCJGQUlMRUQgd2FpdCBmb3IgY2xvY2sgc3RhYmxpemF0aW9uXG4iKTsKKworCS8qIGFzc2VydCBTVyByZXNldCAqLworCWlwd19zZXRfYml0KHByaXYsIENYMl9SRVNFVF9SRUcsIENYMl9SRVNFVF9SRUdfU1dfUkVTRVQpOworCisJdWRlbGF5KDEwKTsKKworCS8qIHNldCAiaW5pdGlhbGl6YXRpb24gY29tcGxldGUiIGJpdCB0byBtb3ZlIGFkYXB0ZXIgdG8gRDAgc3RhdGUgKi8KKwlpcHdfc2V0X2JpdChwcml2LCBDWDJfR1BfQ05UUkxfUlcsIENYMl9HUF9DTlRSTF9CSVRfSU5JVF9ET05FKTsKKworCUlQV19ERUJVR19UUkFDRSgiPj5cbiIpOworCXJldHVybiAwOworfQorCisvKiBDYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBwcm9jZXNzIGNvbnRleHQsIGl0IHdpbGwgc2xlZXAgaW4gcmVxdWVzdF9maXJtd2FyZS4KKyAqIFByb2JlIGlzIGFuIG9rIHBsYWNlIHRvIGNhbGwgdGhpcyBmcm9tLgorICovCitzdGF0aWMgaW50IGlwd19yZXNldF9uaWMoc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCWludCByYyA9IDA7CisKKwlJUFdfREVCVUdfVFJBQ0UoIj4+XG4iKTsKKworCXJjID0gaXB3X2luaXRfbmljKHByaXYpOworCisJLyogQ2xlYXIgdGhlICdob3N0IGNvbW1hbmQgYWN0aXZlJyBiaXQuLi4gKi8KKwlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19IQ01EX0FDVElWRTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7CisKKwlJUFdfREVCVUdfVFJBQ0UoIjw8XG4iKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgaXB3X2dldF9mdyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmd19oZWFkZXIgKmhlYWRlcjsKKwlpbnQgcmM7CisKKwkvKiBhc2sgZmlybXdhcmVfY2xhc3MgbW9kdWxlIHRvIGdldCB0aGUgYm9vdCBmaXJtd2FyZSBvZmYgZGlzayAqLworCXJjID0gcmVxdWVzdF9maXJtd2FyZShmdywgbmFtZSwgJnByaXYtPnBjaV9kZXYtPmRldik7CisJaWYgKHJjIDwgMCkgeworCQlJUFdfRVJST1IoIiVzIGxvYWQgZmFpbGVkOiBSZWFzb24gJWRcbiIsIG5hbWUsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWhlYWRlciA9IChzdHJ1Y3QgZndfaGVhZGVyICopKCpmdyktPmRhdGE7CisJaWYgKElQV19GV19NQUpPUihoZWFkZXItPnZlcnNpb24pICE9IElQV19GV19NQUpPUl9WRVJTSU9OKSB7CisJCUlQV19FUlJPUigiJyVzJyBmaXJtd2FyZSB2ZXJzaW9uIG5vdCBjb21wYXRpYmxlICglZCAhPSAlZClcbiIsCisJCQkgIG5hbWUsCisJCQkgIElQV19GV19NQUpPUihoZWFkZXItPnZlcnNpb24pLCBJUFdfRldfTUFKT1JfVkVSU0lPTik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCUlQV19ERUJVR19JTkZPKCJMb2FkaW5nIGZpcm13YXJlICclcycgZmlsZSB2JWQuJWQgKCV6ZCBieXRlcylcbiIsCisJCSAgICAgICBuYW1lLAorCQkgICAgICAgSVBXX0ZXX01BSk9SKGhlYWRlci0+dmVyc2lvbiksCisJCSAgICAgICBJUFdfRldfTUlOT1IoaGVhZGVyLT52ZXJzaW9uKSwKKwkJICAgICAgICgqZncpLT5zaXplIC0gc2l6ZW9mKHN0cnVjdCBmd19oZWFkZXIpKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBDWDJfUlhfQlVGX1NJWkUgKDMwMDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHdfcnhfcXVldWVfcmVzZXQoc3RydWN0IGlwd19wcml2ICpwcml2LAorCQkJCSAgICAgIHN0cnVjdCBpcHdfcnhfcXVldWUgKnJ4cSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfZnJlZSk7CisJSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfdXNlZCk7CisKKwkvKiBGaWxsIHRoZSByeF91c2VkIHF1ZXVlIHdpdGggX2FsbF8gb2YgdGhlIFJ4IGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfRlJFRV9CVUZGRVJTICsgUlhfUVVFVUVfU0laRTsgaSsrKSB7CisJCS8qIEluIHRoZSByZXNldCBmdW5jdGlvbiwgdGhlc2UgYnVmZmVycyBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZAorCQkgKiB0byBhbiBTS0IsIHNvIHdlIG5lZWQgdG8gdW5tYXAgYW5kIGZyZWUgcG90ZW50aWFsIHN0b3JhZ2UgKi8KKwkJaWYgKHJ4cS0+cG9vbFtpXS5za2IgIT0gTlVMTCkgeworCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LCByeHEtPnBvb2xbaV0uZG1hX2FkZHIsCisJCQkJCSBDWDJfUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHJ4cS0+cG9vbFtpXS5za2IpOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKKwl9CisKKwkvKiBTZXQgdXMgc28gdGhhdCB3ZSBoYXZlIHByb2Nlc3NlZCBhbmQgdXNlZCBhbGwgYnVmZmVycywgYnV0IGhhdmUKKwkgKiBub3QgcmVzdG9ja2VkIHRoZSBSeCBxdWV1ZSB3aXRoIGZyZXNoIGJ1ZmZlcnMgKi8KKwlyeHEtPnJlYWQgPSByeHEtPndyaXRlID0gMDsKKwlyeHEtPnByb2Nlc3NlZCA9IFJYX1FVRVVFX1NJWkUgLSAxOworCXJ4cS0+ZnJlZV9jb3VudCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZndfbG9hZGVkID0gMDsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmJvb3RmdyA9IE5VTEw7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZSA9IE5VTEw7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpcm13YXJlICp1Y29kZSA9IE5VTEw7CisjZW5kaWYKKworc3RhdGljIGludCBpcHdfbG9hZChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCit7CisjaWZuZGVmIENPTkZJR19QTQorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqYm9vdGZ3ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVjb2RlID0gTlVMTDsKKyNlbmRpZgorCWludCByYyA9IDAsIHJldHJpZXMgPSAzOworCisjaWZkZWYgQ09ORklHX1BNCisJaWYgKCFmd19sb2FkZWQpIHsKKyNlbmRpZgorCQlyYyA9IGlwd19nZXRfZncocHJpdiwgJmJvb3RmdywgSVBXX0ZXX05BTUUoImJvb3QiKSk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyb3I7CisKKwkJc3dpdGNoIChwcml2LT5pZWVlLT5pd19tb2RlKSB7CisJCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJCXJjID0gaXB3X2dldF9mdyhwcml2LCAmdWNvZGUsCisJCQkJCUlQV19GV19OQU1FKCJpYnNzX3Vjb2RlIikpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCXJjID0gaXB3X2dldF9mdyhwcml2LCAmZmlybXdhcmUsIElQV19GV19OQU1FKCJpYnNzIikpOworCQkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfSVBXX1BST01JU0MKKwkJY2FzZSBJV19NT0RFX01PTklUT1I6CisJCQlyYyA9IGlwd19nZXRfZncocHJpdiwgJnVjb2RlLAorCQkJCQlJUFdfRldfTkFNRSgiaWJzc191Y29kZSIpKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIGVycm9yOworCisJCQlyYyA9IGlwd19nZXRfZncocHJpdiwgJmZpcm13YXJlLAorCQkJCQlJUFdfRldfTkFNRSgic25pZmZlciIpKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCXJjID0gaXB3X2dldF9mdyhwcml2LCAmdWNvZGUsIElQV19GV19OQU1FKCJic3NfdWNvZGUiKSk7CisJCQlpZiAocmMpCisJCQkJZ290byBlcnJvcjsKKworCQkJcmMgPSBpcHdfZ2V0X2Z3KHByaXYsICZmaXJtd2FyZSwgSVBXX0ZXX05BTUUoImJzcyIpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyYyA9IC1FSU5WQUw7CisJCX0KKworCQlpZiAocmMpCisJCQlnb3RvIGVycm9yOworCisjaWZkZWYgQ09ORklHX1BNCisJCWZ3X2xvYWRlZCA9IDE7CisJfQorI2VuZGlmCisKKwlpZiAoIXByaXYtPnJ4cSkKKwkJcHJpdi0+cnhxID0gaXB3X3J4X3F1ZXVlX2FsbG9jKHByaXYpOworCWVsc2UKKwkJaXB3X3J4X3F1ZXVlX3Jlc2V0KHByaXYsIHByaXYtPnJ4cSk7CisJaWYgKCFwcml2LT5yeHEpIHsKKwkJSVBXX0VSUk9SKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBSeCBxdWV1ZVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisgICAgICByZXRyeToKKwkvKiBFbnN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgKi8KKwlpcHdfd3JpdGUzMihwcml2LCBDWDJfSU5UQV9NQVNLX1IsIH5DWDJfSU5UQV9NQVNLX0FMTCk7CisJcHJpdi0+c3RhdHVzICY9IH5TVEFUVVNfSU5UX0VOQUJMRUQ7CisKKwkvKiBhY2sgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0lOVEFfUlcsIENYMl9JTlRBX01BU0tfQUxMKTsKKworCWlwd19zdG9wX25pYyhwcml2KTsKKworCXJjID0gaXB3X3Jlc2V0X25pYyhwcml2KTsKKwlpZiAocmMpIHsKKwkJSVBXX0VSUk9SKCJVbmFibGUgdG8gcmVzZXQgTklDXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpcHdfemVyb19tZW1vcnkocHJpdiwgQ1gyX05JQ19TUkFNX0xPV0VSX0JPVU5ELAorCQkJQ1gyX05JQ19TUkFNX1VQUEVSX0JPVU5EIC0gQ1gyX05JQ19TUkFNX0xPV0VSX0JPVU5EKTsKKworCS8qIERNQSB0aGUgaW5pdGlhbCBib290IGZpcm13YXJlIGludG8gdGhlIGRldmljZSAqLworCXJjID0gaXB3X2xvYWRfZmlybXdhcmUocHJpdiwgYm9vdGZ3LT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBmd19oZWFkZXIpLAorCQkJICAgICAgIGJvb3Rmdy0+c2l6ZSAtIHNpemVvZihzdHJ1Y3QgZndfaGVhZGVyKSk7CisJaWYgKHJjIDwgMCkgeworCQlJUFdfRVJST1IoIlVuYWJsZSB0byBsb2FkIGJvb3QgZmlybXdhcmVcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIGtpY2sgc3RhcnQgdGhlIGRldmljZSAqLworCWlwd19zdGFydF9uaWMocHJpdik7CisKKwkvKiB3YWl0IGZvciB0aGUgZGV2aWNlIHRvIGZpbmlzaCBpdCdzIGluaXRpYWwgc3RhcnR1cCBzZXF1ZW5jZSAqLworCXJjID0gaXB3X3BvbGxfYml0KHByaXYsIENYMl9JTlRBX1JXLAorCQkJICBDWDJfSU5UQV9CSVRfRldfSU5JVElBTElaQVRJT05fRE9ORSwgNTAwKTsKKwlpZiAocmMgPCAwKSB7CisJCUlQV19FUlJPUigiZGV2aWNlIGZhaWxlZCB0byBib290IGluaXRpYWwgZncgaW1hZ2VcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlJUFdfREVCVUdfSU5GTygiaW5pdGlhbCBkZXZpY2UgcmVzcG9uc2UgYWZ0ZXIgJWRtc1xuIiwgcmMpOworCisJLyogYWNrIGZ3IGluaXQgZG9uZSBpbnRlcnJ1cHQgKi8KKwlpcHdfd3JpdGUzMihwcml2LCBDWDJfSU5UQV9SVywgQ1gyX0lOVEFfQklUX0ZXX0lOSVRJQUxJWkFUSU9OX0RPTkUpOworCisJLyogRE1BIHRoZSB1Y29kZSBpbnRvIHRoZSBkZXZpY2UgKi8KKwlyYyA9IGlwd19sb2FkX3Vjb2RlKHByaXYsIHVjb2RlLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBmd19oZWFkZXIpLAorCQkJICAgIHVjb2RlLT5zaXplIC0gc2l6ZW9mKHN0cnVjdCBmd19oZWFkZXIpKTsKKwlpZiAocmMgPCAwKSB7CisJCUlQV19FUlJPUigiVW5hYmxlIHRvIGxvYWQgdWNvZGVcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIHN0b3AgbmljICovCisJaXB3X3N0b3BfbmljKHByaXYpOworCisJLyogRE1BIGJzcyBmaXJtd2FyZSBpbnRvIHRoZSBkZXZpY2UgKi8KKwlyYyA9IGlwd19sb2FkX2Zpcm13YXJlKHByaXYsIGZpcm13YXJlLT5kYXRhICsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGZ3X2hlYWRlciksCisJCQkgICAgICAgZmlybXdhcmUtPnNpemUgLSBzaXplb2Yoc3RydWN0IGZ3X2hlYWRlcikpOworCWlmIChyYyA8IDApIHsKKwkJSVBXX0VSUk9SKCJVbmFibGUgdG8gbG9hZCBmaXJtd2FyZVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaXB3X3dyaXRlMzIocHJpdiwgSVBXX0VFUFJPTV9MT0FEX0RJU0FCTEUsIDApOworCisJcmMgPSBpcHdfcXVldWVfcmVzZXQocHJpdik7CisJaWYgKHJjKSB7CisJCUlQV19FUlJPUigiVW5hYmxlIHRvIGluaXRpYWxpemUgcXVldWVzXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBFbnN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgKi8KKwlpcHdfd3JpdGUzMihwcml2LCBDWDJfSU5UQV9NQVNLX1IsIH5DWDJfSU5UQV9NQVNLX0FMTCk7CisKKwkvKiBraWNrIHN0YXJ0IHRoZSBkZXZpY2UgKi8KKwlpcHdfc3RhcnRfbmljKHByaXYpOworCisJaWYgKGlwd19yZWFkMzIocHJpdiwgQ1gyX0lOVEFfUlcpICYgQ1gyX0lOVEFfQklUX1BBUklUWV9FUlJPUikgeworCQlpZiAocmV0cmllcyA+IDApIHsKKwkJCUlQV19XQVJOSU5HKCJQYXJpdHkgZXJyb3IuICBSZXRyeWluZyBpbml0LlxuIik7CisJCQlyZXRyaWVzLS07CisJCQlnb3RvIHJldHJ5OworCQl9CisKKwkJSVBXX0VSUk9SKCJUT0RPOiBIYW5kbGUgcGFyaXR5IGVycm9yIC0tIHNjaGVkdWxlIHJlc3RhcnQ/XG4iKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIHdhaXQgZm9yIHRoZSBkZXZpY2UgKi8KKwlyYyA9IGlwd19wb2xsX2JpdChwcml2LCBDWDJfSU5UQV9SVywKKwkJCSAgQ1gyX0lOVEFfQklUX0ZXX0lOSVRJQUxJWkFUSU9OX0RPTkUsIDUwMCk7CisJaWYgKHJjIDwgMCkgeworCQlJUFdfRVJST1IoImRldmljZSBmYWlsZWQgdG8gc3RhcnQgYWZ0ZXIgNTAwbXNcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlJUFdfREVCVUdfSU5GTygiZGV2aWNlIHJlc3BvbnNlIGFmdGVyICVkbXNcbiIsIHJjKTsKKworCS8qIGFjayBmdyBpbml0IGRvbmUgaW50ZXJydXB0ICovCisJaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0lOVEFfUlcsIENYMl9JTlRBX0JJVF9GV19JTklUSUFMSVpBVElPTl9ET05FKTsKKworCS8qIHJlYWQgZWVwcm9tIGRhdGEgYW5kIGluaXRpYWxpemUgdGhlIGVlcHJvbSByZWdpb24gb2Ygc3JhbSAqLworCXByaXYtPmVlcHJvbV9kZWxheSA9IDE7CisJaXB3X2VlcHJvbV9pbml0X3NyYW0ocHJpdik7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCWlwd19lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKKworCS8qIEVuc3VyZSBvdXIgcXVldWUgaGFzIHZhbGlkIHBhY2tldHMgKi8KKwlpcHdfcnhfcXVldWVfcmVwbGVuaXNoKHByaXYpOworCisJaXB3X3dyaXRlMzIocHJpdiwgQ1gyX1JYX1JFQURfSU5ERVgsIHByaXYtPnJ4cS0+cmVhZCk7CisKKwkvKiBhY2sgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0lOVEFfUlcsIENYMl9JTlRBX01BU0tfQUxMKTsKKworI2lmbmRlZiBDT05GSUdfUE0KKwlyZWxlYXNlX2Zpcm13YXJlKGJvb3Rmdyk7CisJcmVsZWFzZV9maXJtd2FyZSh1Y29kZSk7CisJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworICAgICAgZXJyb3I6CisJaWYgKHByaXYtPnJ4cSkgeworCQlpcHdfcnhfcXVldWVfZnJlZShwcml2LCBwcml2LT5yeHEpOworCQlwcml2LT5yeHEgPSBOVUxMOworCX0KKwlpcHdfdHhfcXVldWVfZnJlZShwcml2KTsKKwlpZiAoYm9vdGZ3KQorCQlyZWxlYXNlX2Zpcm13YXJlKGJvb3Rmdyk7CisJaWYgKHVjb2RlKQorCQlyZWxlYXNlX2Zpcm13YXJlKHVjb2RlKTsKKwlpZiAoZmlybXdhcmUpCisJCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOworI2lmZGVmIENPTkZJR19QTQorCWZ3X2xvYWRlZCA9IDA7CisJYm9vdGZ3ID0gdWNvZGUgPSBmaXJtd2FyZSA9IE5VTEw7CisjZW5kaWYKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBETUEgc2VydmljZXMKKyAqCisgKiBUaGVvcnkgb2Ygb3BlcmF0aW9uCisgKgorICogQSBxdWV1ZSBpcyBhIGNpcmN1bGFyIGJ1ZmZlcnMgd2l0aCAnUmVhZCcgYW5kICdXcml0ZScgcG9pbnRlcnMuCisgKiAyIGVtcHR5IGVudHJpZXMgYWx3YXlzIGtlcHQgaW4gdGhlIGJ1ZmZlciB0byBwcm90ZWN0IGZyb20gb3ZlcmZsb3cuCisgKgorICogRm9yIFR4IHF1ZXVlLCB0aGVyZSBhcmUgbG93IG1hcmsgYW5kIGhpZ2ggbWFyayBsaW1pdHMuIElmLCBhZnRlciBxdWV1aW5nCisgKiB0aGUgcGFja2V0IGZvciBUeCwgZnJlZSBzcGFjZSBiZWNvbWUgPCBsb3cgbWFyaywgVHggcXVldWUgc3RvcHBlZC4gV2hlbgorICogcmVjbGFpbWluZyBwYWNrZXRzIChvbiAndHggZG9uZSBJUlEpLCBpZiBmcmVlIHNwYWNlIGJlY29tZSA+IGhpZ2ggbWFyaywKKyAqIFR4IHF1ZXVlIHJlc3VtZWQuCisgKgorICogVGhlIElQVyBvcGVyYXRlcyB3aXRoIHNpeCBxdWV1ZXMsIG9uZSByZWNlaXZlIHF1ZXVlIGluIHRoZSBkZXZpY2UncworICogc3JhbSwgb25lIHRyYW5zbWl0IHF1ZXVlIGZvciBzZW5kaW5nIGNvbW1hbmRzIHRvIHRoZSBkZXZpY2UgZmlybXdhcmUsCisgKiBhbmQgZm91ciB0cmFuc21pdCBxdWV1ZXMgZm9yIGRhdGEuCisgKgorICogVGhlIGZvdXIgdHJhbnNtaXQgcXVldWVzIGFsbG93IGZvciBwZXJmb3JtaW5nIHF1YWxpdHkgb2Ygc2VydmljZSAocW9zKQorICogdHJhbnNtaXNzaW9ucyBhcyBwZXIgdGhlIDgwMi4xMSBwcm90b2NvbC4gIEN1cnJlbnRseSBMaW51eCBkb2VzIG5vdAorICogcHJvdmlkZSBhIG1lY2hhbmlzbSB0byB0aGUgdXNlciBmb3IgdXRpbGl6aW5nIHByaW9yaXRpemVkIHF1ZXVlcywgc28KKyAqIHdlIG9ubHkgdXRpbGl6ZSB0aGUgZmlyc3QgZGF0YSB0cmFuc21pdCBxdWV1ZSAocXVldWUxKS4KKyAqLworCisvKioKKyAqIERyaXZlciBhbGxvY2F0ZXMgYnVmZmVycyBvZiB0aGlzIHNpemUgZm9yIFJ4CisgKi8KKworc3RhdGljIGlubGluZSBpbnQgaXB3X3F1ZXVlX3NwYWNlKGNvbnN0IHN0cnVjdCBjbHgyX3F1ZXVlICpxKQoreworCWludCBzID0gcS0+bGFzdF91c2VkIC0gcS0+Zmlyc3RfZW1wdHk7CisJaWYgKHMgPD0gMCkKKwkJcyArPSBxLT5uX2JkOworCXMgLT0gMjsJCQkvKiBrZWVwIHNvbWUgcmVzZXJ2ZSB0byBub3QgY29uZnVzZSBlbXB0eSBhbmQgZnVsbCBzaXR1YXRpb25zICovCisJaWYgKHMgPCAwKQorCQlzID0gMDsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXB3X3F1ZXVlX2luY193cmFwKGludCBpbmRleCwgaW50IG5fYmQpCit7CisJcmV0dXJuICgrK2luZGV4ID09IG5fYmQpID8gMCA6IGluZGV4OworfQorCisvKioKKyAqIEluaXRpYWxpemUgY29tbW9uIERNQSBxdWV1ZSBzdHJ1Y3R1cmUKKyAqCisgKiBAcGFyYW0gcSAgICAgICAgICAgICAgICBxdWV1ZSB0byBpbml0CisgKiBAcGFyYW0gY291bnQgICAgICAgICAgICBOdW1iZXIgb2YgQkQncyB0byBhbGxvY2F0ZS4gU2hvdWxkIGJlIHBvd2VyIG9mIDIKKyAqIEBwYXJhbSByZWFkX3JlZ2lzdGVyICAgIEFkZHJlc3MgZm9yICdyZWFkJyByZWdpc3RlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCBvZmZzZXQgd2l0aGluIEJBUiwgZnVsbCBhZGRyZXNzKQorICogQHBhcmFtIHdyaXRlX3JlZ2lzdGVyICAgQWRkcmVzcyBmb3IgJ3dyaXRlJyByZWdpc3RlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCBvZmZzZXQgd2l0aGluIEJBUiwgZnVsbCBhZGRyZXNzKQorICogQHBhcmFtIGJhc2VfcmVnaXN0ZXIgICAgQWRkcmVzcyBmb3IgJ2Jhc2UnIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAobm90IG9mZnNldCB3aXRoaW4gQkFSLCBmdWxsIGFkZHJlc3MpCisgKiBAcGFyYW0gc2l6ZSAgICAgICAgICAgICBBZGRyZXNzIGZvciAnc2l6ZScgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIChub3Qgb2Zmc2V0IHdpdGhpbiBCQVIsIGZ1bGwgYWRkcmVzcykKKyAqLworc3RhdGljIHZvaWQgaXB3X3F1ZXVlX2luaXQoc3RydWN0IGlwd19wcml2ICpwcml2LCBzdHJ1Y3QgY2x4Ml9xdWV1ZSAqcSwKKwkJCSAgIGludCBjb3VudCwgdTMyIHJlYWQsIHUzMiB3cml0ZSwgdTMyIGJhc2UsIHUzMiBzaXplKQoreworCXEtPm5fYmQgPSBjb3VudDsKKworCXEtPmxvd19tYXJrID0gcS0+bl9iZCAvIDQ7CisJaWYgKHEtPmxvd19tYXJrIDwgNCkKKwkJcS0+bG93X21hcmsgPSA0OworCisJcS0+aGlnaF9tYXJrID0gcS0+bl9iZCAvIDg7CisJaWYgKHEtPmhpZ2hfbWFyayA8IDIpCisJCXEtPmhpZ2hfbWFyayA9IDI7CisKKwlxLT5maXJzdF9lbXB0eSA9IHEtPmxhc3RfdXNlZCA9IDA7CisJcS0+cmVnX3IgPSByZWFkOworCXEtPnJlZ193ID0gd3JpdGU7CisKKwlpcHdfd3JpdGUzMihwcml2LCBiYXNlLCBxLT5kbWFfYWRkcik7CisJaXB3X3dyaXRlMzIocHJpdiwgc2l6ZSwgY291bnQpOworCWlwd193cml0ZTMyKHByaXYsIHJlYWQsIDApOworCWlwd193cml0ZTMyKHByaXYsIHdyaXRlLCAwKTsKKworCV9pcHdfcmVhZDMyKHByaXYsIDB4OTApOworfQorCitzdGF0aWMgaW50IGlwd19xdWV1ZV90eF9pbml0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKKwkJCSAgICAgc3RydWN0IGNseDJfdHhfcXVldWUgKnEsCisJCQkgICAgIGludCBjb3VudCwgdTMyIHJlYWQsIHUzMiB3cml0ZSwgdTMyIGJhc2UsIHUzMiBzaXplKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBwcml2LT5wY2lfZGV2OworCisJcS0+dHhiID0ga21hbGxvYyhzaXplb2YocS0+dHhiWzBdKSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXEtPnR4YikgeworCQlJUFdfRVJST1IoInZtYWxsb2MgZm9yIGF1eGlsYXJ5IEJEIHN0cnVjdHVyZXMgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcS0+YmQgPQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYsIHNpemVvZihxLT5iZFswXSkgKiBjb3VudCwgJnEtPnEuZG1hX2FkZHIpOworCWlmICghcS0+YmQpIHsKKwkJSVBXX0VSUk9SKCJwY2lfYWxsb2NfY29uc2lzdGVudCglemQpIGZhaWxlZFxuIiwKKwkJCSAgc2l6ZW9mKHEtPmJkWzBdKSAqIGNvdW50KTsKKwkJa2ZyZWUocS0+dHhiKTsKKwkJcS0+dHhiID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaXB3X3F1ZXVlX2luaXQocHJpdiwgJnEtPnEsIGNvdW50LCByZWFkLCB3cml0ZSwgYmFzZSwgc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRnJlZSBvbmUgVEZELCB0aG9zZSBhdCBpbmRleCBbdHhxLT5xLmxhc3RfdXNlZF0uCisgKiBEbyBOT1QgYWR2YW5jZSBhbnkgaW5kZXhlcworICoKKyAqIEBwYXJhbSBkZXYKKyAqIEBwYXJhbSB0eHEKKyAqLworc3RhdGljIHZvaWQgaXB3X3F1ZXVlX3R4X2ZyZWVfdGZkKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKKwkJCQkgIHN0cnVjdCBjbHgyX3R4X3F1ZXVlICp0eHEpCit7CisJc3RydWN0IHRmZF9mcmFtZSAqYmQgPSAmdHhxLT5iZFt0eHEtPnEubGFzdF91c2VkXTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gcHJpdi0+cGNpX2RldjsKKwlpbnQgaTsKKworCS8qIGNsYXNzaWZ5IGJkICovCisJaWYgKGJkLT5jb250cm9sX2ZsYWdzLm1lc3NhZ2VfdHlwZSA9PSBUWF9IT1NUX0NPTU1BTkRfVFlQRSkKKwkJLyogbm90aGluZyB0byBjbGVhbnVwIGFmdGVyIGZvciBob3N0IGNvbW1hbmRzICovCisJCXJldHVybjsKKworCS8qIHNhbml0eSBjaGVjayAqLworCWlmIChiZC0+dS5kYXRhLm51bV9jaHVua3MgPiBOVU1fVEZEX0NIVU5LUykgeworCQlJUFdfRVJST1IoIlRvbyBtYW55IGNodW5rczogJWlcbiIsIGJkLT51LmRhdGEubnVtX2NodW5rcyk7CisJCS8qKiBAdG9kbyBpc3N1ZSBmYXRhbCBlcnJvciwgaXQgaXMgcXVpdGUgc2VyaW91cyBzaXR1YXRpb24gKi8KKwkJcmV0dXJuOworCX0KKworCS8qIHVubWFwIGNodW5rcyBpZiBhbnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYmQtPnUuZGF0YS5udW1fY2h1bmtzOyBpKyspIHsKKwkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGJkLT51LmRhdGEuY2h1bmtfcHRyW2ldLAorCQkJCSBiZC0+dS5kYXRhLmNodW5rX2xlbltpXSwgUENJX0RNQV9UT0RFVklDRSk7CisJCWlmICh0eHEtPnR4Ylt0eHEtPnEubGFzdF91c2VkXSkgeworCQkJaWVlZTgwMjExX3R4Yl9mcmVlKHR4cS0+dHhiW3R4cS0+cS5sYXN0X3VzZWRdKTsKKwkJCXR4cS0+dHhiW3R4cS0+cS5sYXN0X3VzZWRdID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoqCisgKiBEZWFsbG9jYXRlIERNQSBxdWV1ZS4KKyAqCisgKiBFbXB0eSBxdWV1ZSBieSByZW1vdmluZyBhbmQgZGVzdHJveWluZyBhbGwgQkQncy4KKyAqIEZyZWUgYWxsIGJ1ZmZlcnMuCisgKgorICogQHBhcmFtIGRldgorICogQHBhcmFtIHEKKyAqLworc3RhdGljIHZvaWQgaXB3X3F1ZXVlX3R4X2ZyZWUoc3RydWN0IGlwd19wcml2ICpwcml2LCBzdHJ1Y3QgY2x4Ml90eF9xdWV1ZSAqdHhxKQoreworCXN0cnVjdCBjbHgyX3F1ZXVlICpxID0gJnR4cS0+cTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gcHJpdi0+cGNpX2RldjsKKworCWlmIChxLT5uX2JkID09IDApCisJCXJldHVybjsKKworCS8qIGZpcnN0LCBlbXB0eSBhbGwgQkQncyAqLworCWZvciAoOyBxLT5maXJzdF9lbXB0eSAhPSBxLT5sYXN0X3VzZWQ7CisJICAgICBxLT5sYXN0X3VzZWQgPSBpcHdfcXVldWVfaW5jX3dyYXAocS0+bGFzdF91c2VkLCBxLT5uX2JkKSkgeworCQlpcHdfcXVldWVfdHhfZnJlZV90ZmQocHJpdiwgdHhxKTsKKwl9CisKKwkvKiBmcmVlIGJ1ZmZlcnMgYmVsb25naW5nIHRvIHF1ZXVlIGl0c2VsZiAqLworCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LCBzaXplb2YodHhxLT5iZFswXSkgKiBxLT5uX2JkLCB0eHEtPmJkLAorCQkJICAgIHEtPmRtYV9hZGRyKTsKKwlrZnJlZSh0eHEtPnR4Yik7CisKKwkvKiAwIGZpbGwgd2hvbGUgc3RydWN0dXJlICovCisJbWVtc2V0KHR4cSwgMCwgc2l6ZW9mKCp0eHEpKTsKK30KKworLyoqCisgKiBEZXN0cm95IGFsbCBETUEgcXVldWVzIGFuZCBzdHJ1Y3R1cmVzCisgKgorICogQHBhcmFtIHByaXYKKyAqLworc3RhdGljIHZvaWQgaXB3X3R4X3F1ZXVlX2ZyZWUoc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCS8qIFR4IENNRCBxdWV1ZSAqLworCWlwd19xdWV1ZV90eF9mcmVlKHByaXYsICZwcml2LT50eHFfY21kKTsKKworCS8qIFR4IHF1ZXVlcyAqLworCWlwd19xdWV1ZV90eF9mcmVlKHByaXYsICZwcml2LT50eHFbMF0pOworCWlwd19xdWV1ZV90eF9mcmVlKHByaXYsICZwcml2LT50eHFbMV0pOworCWlwd19xdWV1ZV90eF9mcmVlKHByaXYsICZwcml2LT50eHFbMl0pOworCWlwd19xdWV1ZV90eF9mcmVlKHByaXYsICZwcml2LT50eHFbM10pOworfQorCitzdGF0aWMgdm9pZCBpbmxpbmUgX19tYXliZV93YWtlX3R4KHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwlpZiAobmV0aWZfcnVubmluZyhwcml2LT5uZXRfZGV2KSkgeworCQlzd2l0Y2ggKHByaXYtPnBvcnRfdHlwZSkgeworCQljYXNlIERDUl9UWVBFX01VX0JTUzoKKwkJY2FzZSBEQ1JfVFlQRV9NVV9JQlNTOgorCQkJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0FTU09DSUFURUQpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+bmV0X2Rldik7CisJfQorCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHdfY3JlYXRlX2Jzc2lkKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTggKiBic3NpZCkKK3sKKwkvKiBGaXJzdCAzIGJ5dGVzIGFyZSBtYW51ZmFjdHVyZXIgKi8KKwlic3NpZFswXSA9IHByaXYtPm1hY19hZGRyWzBdOworCWJzc2lkWzFdID0gcHJpdi0+bWFjX2FkZHJbMV07CisJYnNzaWRbMl0gPSBwcml2LT5tYWNfYWRkclsyXTsKKworCS8qIExhc3QgYnl0ZXMgYXJlIHJhbmRvbSAqLworCWdldF9yYW5kb21fYnl0ZXMoJmJzc2lkWzNdLCBFVEhfQUxFTiAtIDMpOworCisJYnNzaWRbMF0gJj0gMHhmZTsJLyogY2xlYXIgbXVsdGljYXN0IGJpdCAqLworCWJzc2lkWzBdIHw9IDB4MDI7CS8qIHNldCBsb2NhbCBhc3NpZ25tZW50IGJpdCAoSUVFRTgwMikgKi8KK30KKworc3RhdGljIGlubGluZSB1OCBpcHdfYWRkX3N0YXRpb24oc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqIGJzc2lkKQoreworCXN0cnVjdCBpcHdfc3RhdGlvbl9lbnRyeSBlbnRyeTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5udW1fc3RhdGlvbnM7IGkrKykgeworCQlpZiAoIW1lbWNtcChwcml2LT5zdGF0aW9uc1tpXSwgYnNzaWQsIEVUSF9BTEVOKSkgeworCQkJLyogQW5vdGhlciBub2RlIGlzIGFjdGl2ZSBpbiBuZXR3b3JrICovCisJCQlwcml2LT5taXNzZWRfYWRob2NfYmVhY29ucyA9IDA7CisJCQlpZiAoIShwcml2LT5jb25maWcgJiBDRkdfU1RBVElDX0NIQU5ORUwpKQorCQkJCS8qIHdoZW4gb3RoZXIgbm9kZXMgZHJvcCBvdXQsIHdlIGRyb3Agb3V0ICovCisJCQkJcHJpdi0+Y29uZmlnICY9IH5DRkdfQURIT0NfUEVSU0lTVDsKKworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisKKwlpZiAoaSA9PSBNQVhfU1RBVElPTlMpCisJCXJldHVybiBJUFdfSU5WQUxJRF9TVEFUSU9OOworCisJSVBXX0RFQlVHX1NDQU4oIkFkZGluZyBBZEhvYyBzdGF0aW9uOiAiIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhic3NpZCkpOworCisJZW50cnkucmVzZXJ2ZWQgPSAwOworCWVudHJ5LnN1cHBvcnRfbW9kZSA9IDA7CisJbWVtY3B5KGVudHJ5Lm1hY19hZGRyLCBic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShwcml2LT5zdGF0aW9uc1tpXSwgYnNzaWQsIEVUSF9BTEVOKTsKKwlpcHdfd3JpdGVfZGlyZWN0KHByaXYsIElQV19TVEFUSU9OX1RBQkxFX0xPV0VSICsgaSAqIHNpemVvZihlbnRyeSksCisJCQkgJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKKwlwcml2LT5udW1fc3RhdGlvbnMrKzsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW5saW5lIHU4IGlwd19maW5kX3N0YXRpb24oc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqIGJzc2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHByaXYtPm51bV9zdGF0aW9uczsgaSsrKQorCQlpZiAoIW1lbWNtcChwcml2LT5zdGF0aW9uc1tpXSwgYnNzaWQsIEVUSF9BTEVOKSkKKwkJCXJldHVybiBpOworCisJcmV0dXJuIElQV19JTlZBTElEX1NUQVRJT047Cit9CisKK3N0YXRpYyB2b2lkIGlwd19zZW5kX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIGludCBxdWlldCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCEocHJpdi0+c3RhdHVzICYgKFNUQVRVU19BU1NPQ0lBVElORyB8IFNUQVRVU19BU1NPQ0lBVEVEKSkpIHsKKwkJSVBXX0RFQlVHX0FTU09DKCJEaXNhc3NvY2lhdGluZyB3aGlsZSBub3QgYXNzb2NpYXRlZC5cbiIpOworCQlyZXR1cm47CisJfQorCisJSVBXX0RFQlVHX0FTU09DKCJEaXNhc3NvY2F0aW9uIGF0dGVtcHQgZnJvbSAiIE1BQ19GTVQgIiAiCisJCQkib24gY2hhbm5lbCAlZC5cbiIsCisJCQlNQUNfQVJHKHByaXYtPmFzc29jX3JlcXVlc3QuYnNzaWQpLAorCQkJcHJpdi0+YXNzb2NfcmVxdWVzdC5jaGFubmVsKTsKKworCXByaXYtPnN0YXR1cyAmPSB+KFNUQVRVU19BU1NPQ0lBVElORyB8IFNUQVRVU19BU1NPQ0lBVEVEKTsKKwlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX0RJU0FTU09DSUFUSU5HOworCisJaWYgKHF1aWV0KQorCQlwcml2LT5hc3NvY19yZXF1ZXN0LmFzc29jX3R5cGUgPSBIQ19ESVNBU1NPQ19RVUlFVDsKKwllbHNlCisJCXByaXYtPmFzc29jX3JlcXVlc3QuYXNzb2NfdHlwZSA9IEhDX0RJU0FTU09DSUFURTsKKwllcnIgPSBpcHdfc2VuZF9hc3NvY2lhdGUocHJpdiwgJnByaXYtPmFzc29jX3JlcXVlc3QpOworCWlmIChlcnIpIHsKKwkJSVBXX0RFQlVHX0hDKCJBdHRlbXB0IHRvIHNlbmQgW2Rpc11hc3NvY2lhdGUgY29tbWFuZCAiCisJCQkgICAgICJmYWlsZWQuXG4iKTsKKwkJcmV0dXJuOworCX0KKworfQorCitzdGF0aWMgdm9pZCBpcHdfZGlzYXNzb2NpYXRlKHZvaWQgKmRhdGEpCit7CisJaXB3X3NlbmRfZGlzYXNzb2NpYXRlKGRhdGEsIDApOworfQorCitzdGF0aWMgdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkKKwkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwcml2LT5ic3NpZCwgRVRIX0FMRU4pOworCWVsc2UKKwkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKK30KKworc3RydWN0IGlwd19zdGF0dXNfY29kZSB7CisJdTE2IHN0YXR1czsKKwljb25zdCBjaGFyICpyZWFzb247Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlwd19zdGF0dXNfY29kZSBpcHdfc3RhdHVzX2NvZGVzW10gPSB7CisJezB4MDAsICJTdWNjZXNzZnVsIn0sCisJezB4MDEsICJVbnNwZWNpZmllZCBmYWlsdXJlIn0sCisJezB4MEEsICJDYW5ub3Qgc3VwcG9ydCBhbGwgcmVxdWVzdGVkIGNhcGFiaWxpdGllcyBpbiB0aGUgIgorCSAiQ2FwYWJpbGl0eSBpbmZvcm1hdGlvbiBmaWVsZCJ9LAorCXsweDBCLCAiUmVhc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIGluYWJpbGl0eSB0byBjb25maXJtIHRoYXQgIgorCSAiYXNzb2NpYXRpb24gZXhpc3RzIn0sCisJezB4MEMsICJBc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIHJlYXNvbiBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzICIKKwkgInN0YW5kYXJkIn0sCisJezB4MEQsCisJICJSZXNwb25kaW5nIHN0YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIGF1dGhlbnRpY2F0aW9uICIKKwkgImFsZ29yaXRobSJ9LAorCXsweDBFLAorCSAiUmVjZWl2ZWQgYW4gQXV0aGVudGljYXRpb24gZnJhbWUgd2l0aCBhdXRoZW50aWNhdGlvbiBzZXF1ZW5jZSAiCisJICJ0cmFuc2FjdGlvbiBzZXF1ZW5jZSBudW1iZXIgb3V0IG9mIGV4cGVjdGVkIHNlcXVlbmNlIn0sCisJezB4MEYsICJBdXRoZW50aWNhdGlvbiByZWplY3RlZCBiZWNhdXNlIG9mIGNoYWxsZW5nZSBmYWlsdXJlIn0sCisJezB4MTAsICJBdXRoZW50aWNhdGlvbiByZWplY3RlZCBkdWUgdG8gdGltZW91dCB3YWl0aW5nIGZvciBuZXh0ICIKKwkgImZyYW1lIGluIHNlcXVlbmNlIn0sCisJezB4MTEsICJBc3NvY2lhdGlvbiBkZW5pZWQgYmVjYXVzZSBBUCBpcyB1bmFibGUgdG8gaGFuZGxlIGFkZGl0aW9uYWwgIgorCSAiYXNzb2NpYXRlZCBzdGF0aW9ucyJ9LAorCXsweDEyLAorCSAiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgYWxsICIKKwkgIm9mIHRoZSBkYXRhcmF0ZXMgaW4gdGhlIEJTU0Jhc2ljU2VydmljZVNldCBQYXJhbWV0ZXIifSwKKwl7MHgxMywKKwkgIkFzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gcmVxdWVzdGluZyBzdGF0aW9uIG5vdCBzdXBwb3J0aW5nICIKKwkgInNob3J0IHByZWFtYmxlIG9wZXJhdGlvbiJ9LAorCXsweDE0LAorCSAiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgIgorCSAiUEJDQyBlbmNvZGluZyJ9LAorCXsweDE1LAorCSAiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgIgorCSAiY2hhbm5lbCBhZ2lsaXR5In0sCisJezB4MTksCisJICJBc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIHJlcXVlc3Rpbmcgc3RhdGlvbiBub3Qgc3VwcG9ydGluZyAiCisJICJzaG9ydCBzbG90IG9wZXJhdGlvbiJ9LAorCXsweDFBLAorCSAiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgIgorCSAiRFNTUy1PRkRNIG9wZXJhdGlvbiJ9LAorCXsweDI4LCAiSW52YWxpZCBJbmZvcm1hdGlvbiBFbGVtZW50In0sCisJezB4MjksICJHcm91cCBDaXBoZXIgaXMgbm90IHZhbGlkIn0sCisJezB4MkEsICJQYWlyd2lzZSBDaXBoZXIgaXMgbm90IHZhbGlkIn0sCisJezB4MkIsICJBS01QIGlzIG5vdCB2YWxpZCJ9LAorCXsweDJDLCAiVW5zdXBwb3J0ZWQgUlNOIElFIHZlcnNpb24ifSwKKwl7MHgyRCwgIkludmFsaWQgUlNOIElFIENhcGFiaWxpdGllcyJ9LAorCXsweDJFLCAiQ2lwaGVyIHN1aXRlIGlzIHJlamVjdGVkIHBlciBzZWN1cml0eSBwb2xpY3kifSwKK307CisKKyNpZmRlZiBDT05GSUdfSVBXX0RFQlVHCitzdGF0aWMgY29uc3QgY2hhciAqaXB3X2dldF9zdGF0dXNfY29kZSh1MTYgc3RhdHVzKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlwd19zdGF0dXNfY29kZXMpOyBpKyspCisJCWlmIChpcHdfc3RhdHVzX2NvZGVzW2ldLnN0YXR1cyA9PSBzdGF0dXMpCisJCQlyZXR1cm4gaXB3X3N0YXR1c19jb2Rlc1tpXS5yZWFzb247CisJcmV0dXJuICJVbmtub3duIHN0YXR1cyB2YWx1ZS4iOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGlubGluZSBhdmVyYWdlX2luaXQoc3RydWN0IGF2ZXJhZ2UgKmF2ZykKK3sKKwltZW1zZXQoYXZnLCAwLCBzaXplb2YoKmF2ZykpOworfQorCitzdGF0aWMgdm9pZCBpbmxpbmUgYXZlcmFnZV9hZGQoc3RydWN0IGF2ZXJhZ2UgKmF2ZywgczE2IHZhbCkKK3sKKwlhdmctPnN1bSAtPSBhdmctPmVudHJpZXNbYXZnLT5wb3NdOworCWF2Zy0+c3VtICs9IHZhbDsKKwlhdmctPmVudHJpZXNbYXZnLT5wb3MrK10gPSB2YWw7CisJaWYgKHVubGlrZWx5KGF2Zy0+cG9zID09IEFWR19FTlRSSUVTKSkgeworCQlhdmctPmluaXQgPSAxOworCQlhdmctPnBvcyA9IDA7CisJfQorfQorCitzdGF0aWMgczE2IGlubGluZSBhdmVyYWdlX3ZhbHVlKHN0cnVjdCBhdmVyYWdlICphdmcpCit7CisJaWYgKCF1bmxpa2VseShhdmctPmluaXQpKSB7CisJCWlmIChhdmctPnBvcykKKwkJCXJldHVybiBhdmctPnN1bSAvIGF2Zy0+cG9zOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gYXZnLT5zdW0gLyBBVkdfRU5UUklFUzsKK30KKworc3RhdGljIHZvaWQgaXB3X3Jlc2V0X3N0YXRzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwl1MzIgbGVuID0gc2l6ZW9mKHUzMik7CisKKwlwcml2LT5xdWFsaXR5ID0gMDsKKworCWF2ZXJhZ2VfaW5pdCgmcHJpdi0+YXZlcmFnZV9taXNzZWRfYmVhY29ucyk7CisJYXZlcmFnZV9pbml0KCZwcml2LT5hdmVyYWdlX3Jzc2kpOworCWF2ZXJhZ2VfaW5pdCgmcHJpdi0+YXZlcmFnZV9ub2lzZSk7CisKKwlwcml2LT5sYXN0X3JhdGUgPSAwOworCXByaXYtPmxhc3RfbWlzc2VkX2JlYWNvbnMgPSAwOworCXByaXYtPmxhc3RfcnhfcGFja2V0cyA9IDA7CisJcHJpdi0+bGFzdF90eF9wYWNrZXRzID0gMDsKKwlwcml2LT5sYXN0X3R4X2ZhaWx1cmVzID0gMDsKKworCS8qIEZpcm13YXJlIG1hbmFnZWQsIHJlc2V0IG9ubHkgd2hlbiBOSUMgaXMgcmVzdGFydGVkLCBzbyB3ZSBoYXZlIHRvCisJICogbm9ybWFsaXplIG9uIHRoZSBjdXJyZW50IHZhbHVlICovCisJaXB3X2dldF9vcmRpbmFsKHByaXYsIElQV19PUkRfU1RBVF9SWF9FUlJfQ1JDLAorCQkJJnByaXYtPmxhc3RfcnhfZXJyLCAmbGVuKTsKKwlpcHdfZ2V0X29yZGluYWwocHJpdiwgSVBXX09SRF9TVEFUX1RYX0ZBSUxVUkUsCisJCQkmcHJpdi0+bGFzdF90eF9mYWlsdXJlcywgJmxlbik7CisKKwkvKiBEcml2ZXIgbWFuYWdlZCwgcmVzZXQgd2l0aCBlYWNoIGFzc29jaWF0aW9uICovCisJcHJpdi0+bWlzc2VkX2FkaG9jX2JlYWNvbnMgPSAwOworCXByaXYtPm1pc3NlZF9iZWFjb25zID0gMDsKKwlwcml2LT50eF9wYWNrZXRzID0gMDsKKwlwcml2LT5yeF9wYWNrZXRzID0gMDsKKworfQorCitzdGF0aWMgaW5saW5lIHUzMiBpcHdfZ2V0X21heF9yYXRlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwl1MzIgaSA9IDB4ODAwMDAwMDA7CisJdTMyIG1hc2sgPSBwcml2LT5yYXRlc19tYXNrOworCS8qIElmIGN1cnJlbnRseSBhc3NvY2lhdGVkIGluIEIgbW9kZSwgcmVzdHJpY3QgdGhlIG1heGltdW0KKwkgKiByYXRlIG1hdGNoIHRvIEIgcmF0ZXMgKi8KKwlpZiAocHJpdi0+YXNzb2NfcmVxdWVzdC5pZWVlX21vZGUgPT0gSVBXX0JfTU9ERSkKKwkJbWFzayAmPSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0s7CisKKwkvKiBUT0RPOiBWZXJpZnkgdGhhdCB0aGUgcmF0ZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgcmF0ZXMKKwkgKiBsaXN0LiAqLworCisJd2hpbGUgKGkgJiYgIShtYXNrICYgaSkpCisJCWkgPj49IDE7CisJc3dpdGNoIChpKSB7CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CX01BU0s6CXJldHVybiAxMDAwMDAwOworCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLOglyZXR1cm4gMjAwMDAwMDsKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSzoJcmV0dXJuIDU1MDAwMDA7CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLOglyZXR1cm4gNjAwMDAwMDsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0s6CXJldHVybiA5MDAwMDAwOworCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzExTUJfTUFTSzoJcmV0dXJuIDExMDAwMDAwOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0s6CXJldHVybiAxMjAwMDAwMDsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLOglyZXR1cm4gMTgwMDAwMDA7CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSzoJcmV0dXJuIDI0MDAwMDAwOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0s6CXJldHVybiAzNjAwMDAwMDsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLOglyZXR1cm4gNDgwMDAwMDA7CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSzoJcmV0dXJuIDU0MDAwMDAwOworCX0KKworCWlmIChwcml2LT5pZWVlLT5tb2RlID09IElFRUVfQikKKwkJcmV0dXJuIDExMDAwMDAwOworCWVsc2UKKwkJcmV0dXJuIDU0MDAwMDAwOworfQorCitzdGF0aWMgdTMyIGlwd19nZXRfY3VycmVudF9yYXRlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwl1MzIgcmF0ZSwgbGVuID0gc2l6ZW9mKHJhdGUpOworCWludCBlcnI7CisKKwlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkpCisJCXJldHVybiAwOworCisJaWYgKHByaXYtPnR4X3BhY2tldHMgPiBJUFdfUkVBTF9SQVRFX1JYX1BBQ0tFVF9USFJFU0hPTEQpIHsKKwkJZXJyID0gaXB3X2dldF9vcmRpbmFsKHByaXYsIElQV19PUkRfU1RBVF9UWF9DVVJSX1JBVEUsICZyYXRlLAorCQkJCSAgICAgICZsZW4pOworCQlpZiAoZXJyKSB7CisJCQlJUFdfREVCVUdfSU5GTygiZmFpbGVkIHF1ZXJ5aW5nIG9yZGluYWxzLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gaXB3X2dldF9tYXhfcmF0ZShwcml2KTsKKworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgSVBXX1RYX1JBVEVfMU1COglyZXR1cm4gMTAwMDAwMDsKKwljYXNlIElQV19UWF9SQVRFXzJNQjoJcmV0dXJuIDIwMDAwMDA7CisJY2FzZSBJUFdfVFhfUkFURV81TUI6CXJldHVybiA1NTAwMDAwOworCWNhc2UgSVBXX1RYX1JBVEVfNk1COglyZXR1cm4gNjAwMDAwMDsKKwljYXNlIElQV19UWF9SQVRFXzlNQjoJcmV0dXJuIDkwMDAwMDA7CisJY2FzZSBJUFdfVFhfUkFURV8xMU1COglyZXR1cm4gMTEwMDAwMDA7CisJY2FzZSBJUFdfVFhfUkFURV8xMk1COglyZXR1cm4gMTIwMDAwMDA7CisJY2FzZSBJUFdfVFhfUkFURV8xOE1COglyZXR1cm4gMTgwMDAwMDA7CisJY2FzZSBJUFdfVFhfUkFURV8yNE1COglyZXR1cm4gMjQwMDAwMDA7CisJY2FzZSBJUFdfVFhfUkFURV8zNk1COglyZXR1cm4gMzYwMDAwMDA7CisJY2FzZSBJUFdfVFhfUkFURV80OE1COglyZXR1cm4gNDgwMDAwMDA7CisJY2FzZSBJUFdfVFhfUkFURV81NE1COglyZXR1cm4gNTQwMDAwMDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUEVSRkVDVF9SU1NJICgtNTApCisjZGVmaW5lIFdPUlNUX1JTU0kgICAoLTg1KQorI2RlZmluZSBJUFdfU1RBVFNfSU5URVJWQUwgKDIgKiBIWikKK3N0YXRpYyB2b2lkIGlwd19nYXRoZXJfc3RhdHMoc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCXUzMiByeF9lcnIsIHJ4X2Vycl9kZWx0YSwgcnhfcGFja2V0c19kZWx0YTsKKwl1MzIgdHhfZmFpbHVyZXMsIHR4X2ZhaWx1cmVzX2RlbHRhLCB0eF9wYWNrZXRzX2RlbHRhOworCXUzMiBtaXNzZWRfYmVhY29uc19wZXJjZW50LCBtaXNzZWRfYmVhY29uc19kZWx0YTsKKwl1MzIgcXVhbGl0eSA9IDA7CisJdTMyIGxlbiA9IHNpemVvZih1MzIpOworCXMxNiByc3NpOworCXUzMiBiZWFjb25fcXVhbGl0eSwgc2lnbmFsX3F1YWxpdHksIHR4X3F1YWxpdHksIHJ4X3F1YWxpdHksCisJICAgIHJhdGVfcXVhbGl0eTsKKworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKSkgeworCQlwcml2LT5xdWFsaXR5ID0gMDsKKwkJcmV0dXJuOworCX0KKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyAqLworCWlwd19nZXRfb3JkaW5hbChwcml2LCBJUFdfT1JEX1NUQVRfTUlTU0VEX0JFQUNPTlMsCisJCQkmcHJpdi0+bWlzc2VkX2JlYWNvbnMsICZsZW4pOworCW1pc3NlZF9iZWFjb25zX2RlbHRhID0gcHJpdi0+bWlzc2VkX2JlYWNvbnMgLSBwcml2LT5sYXN0X21pc3NlZF9iZWFjb25zOworCXByaXYtPmxhc3RfbWlzc2VkX2JlYWNvbnMgPSBwcml2LT5taXNzZWRfYmVhY29uczsKKwlpZiAocHJpdi0+YXNzb2NfcmVxdWVzdC5iZWFjb25faW50ZXJ2YWwpIHsKKwkJbWlzc2VkX2JlYWNvbnNfcGVyY2VudCA9IG1pc3NlZF9iZWFjb25zX2RlbHRhICoKKwkJICAgIChIWiAqIHByaXYtPmFzc29jX3JlcXVlc3QuYmVhY29uX2ludGVydmFsKSAvCisJCSAgICAoSVBXX1NUQVRTX0lOVEVSVkFMICogMTApOworCX0gZWxzZSB7CisJCW1pc3NlZF9iZWFjb25zX3BlcmNlbnQgPSAwOworCX0KKwlhdmVyYWdlX2FkZCgmcHJpdi0+YXZlcmFnZV9taXNzZWRfYmVhY29ucywgbWlzc2VkX2JlYWNvbnNfcGVyY2VudCk7CisKKwlpcHdfZ2V0X29yZGluYWwocHJpdiwgSVBXX09SRF9TVEFUX1JYX0VSUl9DUkMsICZyeF9lcnIsICZsZW4pOworCXJ4X2Vycl9kZWx0YSA9IHJ4X2VyciAtIHByaXYtPmxhc3RfcnhfZXJyOworCXByaXYtPmxhc3RfcnhfZXJyID0gcnhfZXJyOworCisJaXB3X2dldF9vcmRpbmFsKHByaXYsIElQV19PUkRfU1RBVF9UWF9GQUlMVVJFLCAmdHhfZmFpbHVyZXMsICZsZW4pOworCXR4X2ZhaWx1cmVzX2RlbHRhID0gdHhfZmFpbHVyZXMgLSBwcml2LT5sYXN0X3R4X2ZhaWx1cmVzOworCXByaXYtPmxhc3RfdHhfZmFpbHVyZXMgPSB0eF9mYWlsdXJlczsKKworCXJ4X3BhY2tldHNfZGVsdGEgPSBwcml2LT5yeF9wYWNrZXRzIC0gcHJpdi0+bGFzdF9yeF9wYWNrZXRzOworCXByaXYtPmxhc3RfcnhfcGFja2V0cyA9IHByaXYtPnJ4X3BhY2tldHM7CisKKwl0eF9wYWNrZXRzX2RlbHRhID0gcHJpdi0+dHhfcGFja2V0cyAtIHByaXYtPmxhc3RfdHhfcGFja2V0czsKKwlwcml2LT5sYXN0X3R4X3BhY2tldHMgPSBwcml2LT50eF9wYWNrZXRzOworCisJLyogQ2FsY3VsYXRlIHF1YWxpdHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIE1pc3NlZCBiZWFjb246IDEwMCUgPSAwLCAwJSA9IDcwJSBtaXNzZWQKKwkgKiBSYXRlOiA2MCUgPSAxTWJzLCAxMDAlID0gTWF4CisJICogUnggYW5kIFR4IGVycm9ycyByZXByZXNlbnQgYSBzdHJhaWdodCAlIG9mIHRvdGFsIFJ4L1R4CisJICogUlNTSTogMTAwJSA9ID4gLTUwLCAgMCUgPSA8IC04MAorCSAqIFJ4IGVycm9yczogMTAwJSA9IDAsIDAlID0gNTAlIG1pc3NlZAorCSAqCisJICogVGhlIGxvd2VzdCBjb21wdXRlZCBxdWFsaXR5IGlzIHVzZWQuCisJICoKKwkgKi8KKyNkZWZpbmUgQkVBQ09OX1RIUkVTSE9MRCA1CisJYmVhY29uX3F1YWxpdHkgPSAxMDAgLSBtaXNzZWRfYmVhY29uc19wZXJjZW50OworCWlmIChiZWFjb25fcXVhbGl0eSA8IEJFQUNPTl9USFJFU0hPTEQpCisJCWJlYWNvbl9xdWFsaXR5ID0gMDsKKwllbHNlCisJCWJlYWNvbl9xdWFsaXR5ID0gKGJlYWNvbl9xdWFsaXR5IC0gQkVBQ09OX1RIUkVTSE9MRCkgKiAxMDAgLworCQkgICAgKDEwMCAtIEJFQUNPTl9USFJFU0hPTEQpOworCUlQV19ERUJVR19TVEFUUygiTWlzc2VkIGJlYWNvbjogJTNkJSUgKCVkJSUpXG4iLAorCQkJYmVhY29uX3F1YWxpdHksIG1pc3NlZF9iZWFjb25zX3BlcmNlbnQpOworCisJcHJpdi0+bGFzdF9yYXRlID0gaXB3X2dldF9jdXJyZW50X3JhdGUocHJpdik7CisJcmF0ZV9xdWFsaXR5ID0gcHJpdi0+bGFzdF9yYXRlICogNDAgLyBwcml2LT5sYXN0X3JhdGUgKyA2MDsKKwlJUFdfREVCVUdfU1RBVFMoIlJhdGUgcXVhbGl0eSA6ICUzZCUlICglZE1icylcbiIsCisJCQlyYXRlX3F1YWxpdHksIHByaXYtPmxhc3RfcmF0ZSAvIDEwMDAwMDApOworCisJaWYgKHJ4X3BhY2tldHNfZGVsdGEgPiAxMDAgJiYgcnhfcGFja2V0c19kZWx0YSArIHJ4X2Vycl9kZWx0YSkKKwkJcnhfcXVhbGl0eSA9IDEwMCAtIChyeF9lcnJfZGVsdGEgKiAxMDApIC8KKwkJICAgIChyeF9wYWNrZXRzX2RlbHRhICsgcnhfZXJyX2RlbHRhKTsKKwllbHNlCisJCXJ4X3F1YWxpdHkgPSAxMDA7CisJSVBXX0RFQlVHX1NUQVRTKCJSeCBxdWFsaXR5ICAgOiAlM2QlJSAoJXUgZXJyb3JzLCAldSBwYWNrZXRzKVxuIiwKKwkJCXJ4X3F1YWxpdHksIHJ4X2Vycl9kZWx0YSwgcnhfcGFja2V0c19kZWx0YSk7CisKKwlpZiAodHhfcGFja2V0c19kZWx0YSA+IDEwMCAmJiB0eF9wYWNrZXRzX2RlbHRhICsgdHhfZmFpbHVyZXNfZGVsdGEpCisJCXR4X3F1YWxpdHkgPSAxMDAgLSAodHhfZmFpbHVyZXNfZGVsdGEgKiAxMDApIC8KKwkJICAgICh0eF9wYWNrZXRzX2RlbHRhICsgdHhfZmFpbHVyZXNfZGVsdGEpOworCWVsc2UKKwkJdHhfcXVhbGl0eSA9IDEwMDsKKwlJUFdfREVCVUdfU1RBVFMoIlR4IHF1YWxpdHkgICA6ICUzZCUlICgldSBlcnJvcnMsICV1IHBhY2tldHMpXG4iLAorCQkJdHhfcXVhbGl0eSwgdHhfZmFpbHVyZXNfZGVsdGEsIHR4X3BhY2tldHNfZGVsdGEpOworCisJcnNzaSA9IGF2ZXJhZ2VfdmFsdWUoJnByaXYtPmF2ZXJhZ2VfcnNzaSk7CisJaWYgKHJzc2kgPiBQRVJGRUNUX1JTU0kpCisJCXNpZ25hbF9xdWFsaXR5ID0gMTAwOworCWVsc2UgaWYgKHJzc2kgPCBXT1JTVF9SU1NJKQorCQlzaWduYWxfcXVhbGl0eSA9IDA7CisJZWxzZQorCQlzaWduYWxfcXVhbGl0eSA9IChyc3NpIC0gV09SU1RfUlNTSSkgKiAxMDAgLworCQkgICAgKFBFUkZFQ1RfUlNTSSAtIFdPUlNUX1JTU0kpOworCUlQV19ERUJVR19TVEFUUygiU2lnbmFsIGxldmVsIDogJTNkJSUgKCVkIGRCbSlcbiIsCisJCQlzaWduYWxfcXVhbGl0eSwgcnNzaSk7CisKKwlxdWFsaXR5ID0gbWluKGJlYWNvbl9xdWFsaXR5LAorCQkgICAgICBtaW4ocmF0ZV9xdWFsaXR5LAorCQkJICBtaW4odHhfcXVhbGl0eSwgbWluKHJ4X3F1YWxpdHksIHNpZ25hbF9xdWFsaXR5KSkpKTsKKwlpZiAocXVhbGl0eSA9PSBiZWFjb25fcXVhbGl0eSkKKwkJSVBXX0RFQlVHX1NUQVRTKCJRdWFsaXR5ICglZCUlKTogQ2xhbXBlZCB0byBtaXNzZWQgYmVhY29ucy5cbiIsCisJCQkJcXVhbGl0eSk7CisJaWYgKHF1YWxpdHkgPT0gcmF0ZV9xdWFsaXR5KQorCQlJUFdfREVCVUdfU1RBVFMoIlF1YWxpdHkgKCVkJSUpOiBDbGFtcGVkIHRvIHJhdGUgcXVhbGl0eS5cbiIsCisJCQkJcXVhbGl0eSk7CisJaWYgKHF1YWxpdHkgPT0gdHhfcXVhbGl0eSkKKwkJSVBXX0RFQlVHX1NUQVRTKCJRdWFsaXR5ICglZCUlKTogQ2xhbXBlZCB0byBUeCBxdWFsaXR5LlxuIiwKKwkJCQlxdWFsaXR5KTsKKwlpZiAocXVhbGl0eSA9PSByeF9xdWFsaXR5KQorCQlJUFdfREVCVUdfU1RBVFMoIlF1YWxpdHkgKCVkJSUpOiBDbGFtcGVkIHRvIFJ4IHF1YWxpdHkuXG4iLAorCQkJCXF1YWxpdHkpOworCWlmIChxdWFsaXR5ID09IHNpZ25hbF9xdWFsaXR5KQorCQlJUFdfREVCVUdfU1RBVFMoIlF1YWxpdHkgKCVkJSUpOiBDbGFtcGVkIHRvIHNpZ25hbCBxdWFsaXR5LlxuIiwKKwkJCQlxdWFsaXR5KTsKKworCXByaXYtPnF1YWxpdHkgPSBxdWFsaXR5OworCisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPmdhdGhlcl9zdGF0cywKKwkJCSAgIElQV19TVEFUU19JTlRFUlZBTCk7Cit9CisKKy8qKgorICogSGFuZGxlIGhvc3Qgbm90aWZpY2F0aW9uIHBhY2tldC4KKyAqIENhbGxlZCBmcm9tIGludGVycnVwdCByb3V0aW5lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHdfcnhfbm90aWZpY2F0aW9uKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGlwd19yeF9ub3RpZmljYXRpb24gKm5vdGlmKQoreworCUlQV19ERUJVR19OT1RJRigidHlwZSA9ICVpICglZCBieXRlcylcbiIsIG5vdGlmLT5zdWJ0eXBlLCBub3RpZi0+c2l6ZSk7CisKKwlzd2l0Y2ggKG5vdGlmLT5zdWJ0eXBlKSB7CisJY2FzZSBIT1NUX05PVElGSUNBVElPTl9TVEFUVVNfQVNTT0NJQVRFRDp7CisJCQlzdHJ1Y3Qgbm90aWZfYXNzb2NpYXRpb24gKmFzc29jID0gJm5vdGlmLT51LmFzc29jOworCisJCQlzd2l0Y2ggKGFzc29jLT5zdGF0ZSkgeworCQkJY2FzZSBDTUFTX0FTU09DSUFURUQ6eworCQkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwKKwkJCQkJCSAgSVBXX0RMX0FTU09DLAorCQkJCQkJICAiYXNzb2NpYXRlZDogJyVzJyAiIE1BQ19GTVQKKwkJCQkJCSAgIiBcbiIsCisJCQkJCQkgIGVzY2FwZV9lc3NpZChwcml2LT5lc3NpZCwKKwkJCQkJCQkgICAgICAgcHJpdi0+ZXNzaWRfbGVuKSwKKwkJCQkJCSAgTUFDX0FSRyhwcml2LT5ic3NpZCkpOworCisJCQkJCXN3aXRjaCAocHJpdi0+aWVlZS0+aXdfbW9kZSkgeworCQkJCQljYXNlIElXX01PREVfSU5GUkE6CisJCQkJCQltZW1jcHkocHJpdi0+aWVlZS0+YnNzaWQsCisJCQkJCQkgICAgICAgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJCQkJCW1lbWNweShwcml2LT5pZWVlLT5ic3NpZCwKKwkJCQkJCSAgICAgICBwcml2LT5ic3NpZCwgRVRIX0FMRU4pOworCisJCQkJCQkvKiBjbGVhciBvdXQgdGhlIHN0YXRpb24gdGFibGUgKi8KKwkJCQkJCXByaXYtPm51bV9zdGF0aW9ucyA9IDA7CisKKwkJCQkJCUlQV19ERUJVR19BU1NPQworCQkJCQkJICAgICgicXVldWVpbmcgYWRob2MgY2hlY2tcbiIpOworCQkJCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPgorCQkJCQkJCQkgICB3b3JrcXVldWUsCisJCQkJCQkJCSAgICZwcml2LT4KKwkJCQkJCQkJICAgYWRob2NfY2hlY2ssCisJCQkJCQkJCSAgIHByaXYtPgorCQkJCQkJCQkgICBhc3NvY19yZXF1ZXN0LgorCQkJCQkJCQkgICBiZWFjb25faW50ZXJ2YWwpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19BU1NPQ0lBVElORzsKKwkJCQkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19BU1NPQ0lBVEVEOworCisJCQkJCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+bmV0X2Rldik7CisJCQkJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHByaXYtPm5ldF9kZXYpKSB7CisJCQkJCQlJUFdfREVCVUdfTk9USUYKKwkJCQkJCSAgICAoIndha2luZyBxdWV1ZVxuIik7CisJCQkJCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPm5ldF9kZXYpOworCQkJCQl9IGVsc2UgeworCQkJCQkJSVBXX0RFQlVHX05PVElGCisJCQkJCQkgICAgKCJzdGFydGluZyBxdWV1ZVxuIik7CisJCQkJCQluZXRpZl9zdGFydF9xdWV1ZShwcml2LT4KKwkJCQkJCQkJICBuZXRfZGV2KTsKKwkJCQkJfQorCisJCQkJCWlwd19yZXNldF9zdGF0cyhwcml2KTsKKwkJCQkJLyogRW5zdXJlIHRoZSByYXRlIGlzIHVwZGF0ZWQgaW1tZWRpYXRlbHkgKi8KKwkJCQkJcHJpdi0+bGFzdF9yYXRlID0KKwkJCQkJICAgIGlwd19nZXRfY3VycmVudF9yYXRlKHByaXYpOworCQkJCQlzY2hlZHVsZV93b3JrKCZwcml2LT5nYXRoZXJfc3RhdHMpOworCQkJCQlub3RpZnlfd3hfYXNzb2NfZXZlbnQocHJpdik7CisKKy8qCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwKKwkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2NhbiwKKwkJCQkJICAgU0NBTl9BU1NPQ0lBVEVEX0lOVEVSVkFMKTsKKyovCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBDTUFTX0FVVEhFTlRJQ0FURUQ6eworCQkJCQlpZiAocHJpdi0+CisJCQkJCSAgICBzdGF0dXMgJiAoU1RBVFVTX0FTU09DSUFURUQgfAorCQkJCQkJICAgICAgU1RBVFVTX0FVVEgpKSB7CisjaWZkZWYgQ09ORklHX0lQV19ERUJVRworCQkJCQkJc3RydWN0IG5vdGlmX2F1dGhlbnRpY2F0ZSAqYXV0aAorCQkJCQkJICAgID0gJm5vdGlmLT51LmF1dGg7CisJCQkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwKKwkJCQkJCQkgIElQV19ETF9TVEFURSB8CisJCQkJCQkJICBJUFdfRExfQVNTT0MsCisJCQkJCQkJICAiZGVhdXRoZW50aWNhdGVkOiAnJXMnICIKKwkJCQkJCQkgIE1BQ19GTVQKKwkJCQkJCQkgICI6ICgweCUwNFgpIC0gJXMgXG4iLAorCQkJCQkJCSAgZXNjYXBlX2Vzc2lkKHByaXYtPgorCQkJCQkJCQkgICAgICAgZXNzaWQsCisJCQkJCQkJCSAgICAgICBwcml2LT4KKwkJCQkJCQkJICAgICAgIGVzc2lkX2xlbiksCisJCQkJCQkJICBNQUNfQVJHKHByaXYtPmJzc2lkKSwKKwkJCQkJCQkgIG50b2hzKGF1dGgtPnN0YXR1cyksCisJCQkJCQkJICBpcHdfZ2V0X3N0YXR1c19jb2RlCisJCQkJCQkJICAobnRvaHMKKwkJCQkJCQkgICAoYXV0aC0+c3RhdHVzKSkpOworI2VuZGlmCisKKwkJCQkJCXByaXYtPnN0YXR1cyAmPQorCQkJCQkJICAgIH4oU1RBVFVTX0FTU09DSUFUSU5HIHwKKwkJCQkJCSAgICAgIFNUQVRVU19BVVRIIHwKKwkJCQkJCSAgICAgIFNUQVRVU19BU1NPQ0lBVEVEKTsKKworCQkJCQkJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+CisJCQkJCQkJCSAgbmV0X2Rldik7CisJCQkJCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldF9kZXYpOworCQkJCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsCisJCQkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2Nhbik7CisJCQkJCQlub3RpZnlfd3hfYXNzb2NfZXZlbnQocHJpdik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfAorCQkJCQkJICBJUFdfRExfQVNTT0MsCisJCQkJCQkgICJhdXRoZW50aWNhdGVkOiAnJXMnICIgTUFDX0ZNVAorCQkJCQkJICAiXG4iLAorCQkJCQkJICBlc2NhcGVfZXNzaWQocHJpdi0+ZXNzaWQsCisJCQkJCQkJICAgICAgIHByaXYtPmVzc2lkX2xlbiksCisJCQkJCQkgIE1BQ19BUkcocHJpdi0+YnNzaWQpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIENNQVNfSU5JVDp7CisJCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfAorCQkJCQkJICBJUFdfRExfQVNTT0MsCisJCQkJCQkgICJkaXNhc3NvY2lhdGVkOiAnJXMnICIgTUFDX0ZNVAorCQkJCQkJICAiIFxuIiwKKwkJCQkJCSAgZXNjYXBlX2Vzc2lkKHByaXYtPmVzc2lkLAorCQkJCQkJCSAgICAgICBwcml2LT5lc3NpZF9sZW4pLAorCQkJCQkJICBNQUNfQVJHKHByaXYtPmJzc2lkKSk7CisKKwkJCQkJcHJpdi0+c3RhdHVzICY9CisJCQkJCSAgICB+KFNUQVRVU19ESVNBU1NPQ0lBVElORyB8CisJCQkJCSAgICAgIFNUQVRVU19BU1NPQ0lBVElORyB8CisJCQkJCSAgICAgIFNUQVRVU19BU1NPQ0lBVEVEIHwgU1RBVFVTX0FVVEgpOworCisJCQkJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0X2Rldik7CisJCQkJCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19ST0FNSU5HKSkgeworCQkJCQkJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+CisJCQkJCQkJCSAgbmV0X2Rldik7CisJCQkJCQlub3RpZnlfd3hfYXNzb2NfZXZlbnQocHJpdik7CisKKwkJCQkJCS8qIENhbmNlbCBhbnkgcXVldWVkIHdvcmsgLi4uICovCisJCQkJCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT4KKwkJCQkJCQkJICAgIHJlcXVlc3Rfc2Nhbik7CisJCQkJCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT4KKwkJCQkJCQkJICAgIGFkaG9jX2NoZWNrKTsKKworCQkJCQkJLyogUXVldWUgdXAgYW5vdGhlciBzY2FuLi4uICovCisJCQkJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwKKwkJCQkJCQkgICAmcHJpdi0+cmVxdWVzdF9zY2FuKTsKKworCQkJCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+CisJCQkJCQkJCSAgICBnYXRoZXJfc3RhdHMpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19ST0FNSU5HOworCQkJCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsCisJCQkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2Nhbik7CisJCQkJCX0KKworCQkJCQlpcHdfcmVzZXRfc3RhdHMocHJpdik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQlJUFdfRVJST1IoImFzc29jOiB1bmtub3duICglZClcbiIsCisJCQkJCSAgYXNzb2MtPnN0YXRlKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgSE9TVF9OT1RJRklDQVRJT05fU1RBVFVTX0FVVEhFTlRJQ0FURTp7CisJCQlzdHJ1Y3Qgbm90aWZfYXV0aGVudGljYXRlICphdXRoID0gJm5vdGlmLT51LmF1dGg7CisJCQlzd2l0Y2ggKGF1dGgtPnN0YXRlKSB7CisJCQljYXNlIENNQVNfQVVUSEVOVElDQVRFRDoKKwkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFLAorCQkJCQkgICJhdXRoZW50aWNhdGVkOiAnJXMnICIgTUFDX0ZNVCAiIFxuIiwKKwkJCQkJICBlc2NhcGVfZXNzaWQocHJpdi0+ZXNzaWQsCisJCQkJCQkgICAgICAgcHJpdi0+ZXNzaWRfbGVuKSwKKwkJCQkJICBNQUNfQVJHKHByaXYtPmJzc2lkKSk7CisJCQkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19BVVRIOworCQkJCWJyZWFrOworCisJCQljYXNlIENNQVNfSU5JVDoKKwkJCQlpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX0FVVEgpIHsKKwkJCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8CisJCQkJCQkgIElQV19ETF9BU1NPQywKKwkJCQkJCSAgImF1dGhlbnRpY2F0aW9uIGZhaWxlZCAoMHglMDRYKTogJXNcbiIsCisJCQkJCQkgIG50b2hzKGF1dGgtPnN0YXR1cyksCisJCQkJCQkgIGlwd19nZXRfc3RhdHVzX2NvZGUobnRvaHMKKwkJCQkJCQkJICAgICAgKGF1dGgtPgorCQkJCQkJCQkgICAgICAgc3RhdHVzKSkpOworCQkJCX0KKwkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwKKwkJCQkJICBJUFdfRExfQVNTT0MsCisJCQkJCSAgImRlYXV0aGVudGljYXRlZDogJyVzJyAiIE1BQ19GTVQgIlxuIiwKKwkJCQkJICBlc2NhcGVfZXNzaWQocHJpdi0+ZXNzaWQsCisJCQkJCQkgICAgICAgcHJpdi0+ZXNzaWRfbGVuKSwKKwkJCQkJICBNQUNfQVJHKHByaXYtPmJzc2lkKSk7CisKKwkJCQlwcml2LT5zdGF0dXMgJj0gfihTVEFUVVNfQVNTT0NJQVRJTkcgfAorCQkJCQkJICBTVEFUVVNfQVVUSCB8CisJCQkJCQkgIFNUQVRVU19BU1NPQ0lBVEVEKTsKKworCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldF9kZXYpOworCQkJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0X2Rldik7CisJCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsCisJCQkJCSAgICZwcml2LT5yZXF1ZXN0X3NjYW4pOworCQkJCW5vdGlmeV93eF9hc3NvY19ldmVudChwcml2KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBDTUFTX1RYX0FVVEhfU0VRXzE6CisJCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8CisJCQkJCSAgSVBXX0RMX0FTU09DLCAiQVVUSF9TRVFfMVxuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIENNQVNfUlhfQVVUSF9TRVFfMjoKKwkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwKKwkJCQkJICBJUFdfRExfQVNTT0MsICJBVVRIX1NFUV8yXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01BU19BVVRIX1NFUV8xX1BBU1M6CisJCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8CisJCQkJCSAgSVBXX0RMX0FTU09DLCAiQVVUSF9TRVFfMV9QQVNTXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01BU19BVVRIX1NFUV8xX0ZBSUw6CisJCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8CisJCQkJCSAgSVBXX0RMX0FTU09DLCAiQVVUSF9TRVFfMV9GQUlMXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01BU19UWF9BVVRIX1NFUV8zOgorCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfAorCQkJCQkgIElQV19ETF9BU1NPQywgIkFVVEhfU0VRXzNcbiIpOworCQkJCWJyZWFrOworCQkJY2FzZSBDTUFTX1JYX0FVVEhfU0VRXzQ6CisJCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8CisJCQkJCSAgSVBXX0RMX0FTU09DLCAiUlhfQVVUSF9TRVFfNFxuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIENNQVNfQVVUSF9TRVFfMl9QQVNTOgorCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfAorCQkJCQkgIElQV19ETF9BU1NPQywgIkFVVEhfU0VRXzJfUEFTU1xuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIENNQVNfQVVUSF9TRVFfMl9GQUlMOgorCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfAorCQkJCQkgIElQV19ETF9BU1NPQywgIkFVVF9TRVFfMl9GQUlMXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01BU19UWF9BU1NPQzoKKwkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwKKwkJCQkJICBJUFdfRExfQVNTT0MsICJUWF9BU1NPQ1xuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIENNQVNfUlhfQVNTT0NfUkVTUDoKKwkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwKKwkJCQkJICBJUFdfRExfQVNTT0MsICJSWF9BU1NPQ19SRVNQXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01BU19BU1NPQ0lBVEVEOgorCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfAorCQkJCQkgIElQV19ETF9BU1NPQywgIkFTU09DSUFURURcbiIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlJUFdfREVCVUdfTk9USUYoImF1dGg6IGZhaWx1cmUgLSAlZFxuIiwKKwkJCQkJCWF1dGgtPnN0YXRlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19TQ0FOX0NIQU5ORUxfUkVTVUxUOnsKKwkJCXN0cnVjdCBub3RpZl9jaGFubmVsX3Jlc3VsdCAqeCA9CisJCQkgICAgJm5vdGlmLT51LmNoYW5uZWxfcmVzdWx0OworCisJCQlpZiAobm90aWYtPnNpemUgPT0gc2l6ZW9mKCp4KSkgeworCQkJCUlQV19ERUJVR19TQ0FOKCJTY2FuIHJlc3VsdCBmb3IgY2hhbm5lbCAlZFxuIiwKKwkJCQkJICAgICAgIHgtPmNoYW5uZWxfbnVtKTsKKwkJCX0gZWxzZSB7CisJCQkJSVBXX0RFQlVHX1NDQU4oIlNjYW4gcmVzdWx0IG9mIHdyb25nIHNpemUgJWQgIgorCQkJCQkgICAgICAgIihzaG91bGQgYmUgJXpkKVxuIiwKKwkJCQkJICAgICAgIG5vdGlmLT5zaXplLCBzaXplb2YoKngpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19TQ0FOX0NPTVBMRVRFRDp7CisJCQlzdHJ1Y3Qgbm90aWZfc2Nhbl9jb21wbGV0ZSAqeCA9ICZub3RpZi0+dS5zY2FuX2NvbXBsZXRlOworCQkJaWYgKG5vdGlmLT5zaXplID09IHNpemVvZigqeCkpIHsKKwkJCQlJUFdfREVCVUdfU0NBTgorCQkJCSAgICAoIlNjYW4gY29tcGxldGVkOiB0eXBlICVkLCAlZCBjaGFubmVscywgIgorCQkJCSAgICAgIiVkIHN0YXR1c1xuIiwgeC0+c2Nhbl90eXBlLAorCQkJCSAgICAgeC0+bnVtX2NoYW5uZWxzLCB4LT5zdGF0dXMpOworCQkJfSBlbHNlIHsKKwkJCQlJUFdfRVJST1IoIlNjYW4gY29tcGxldGVkIG9mIHdyb25nIHNpemUgJWQgIgorCQkJCQkgICIoc2hvdWxkIGJlICV6ZClcbiIsCisJCQkJCSAgbm90aWYtPnNpemUsIHNpemVvZigqeCkpOworCQkJfQorCisJCQlwcml2LT5zdGF0dXMgJj0KKwkJCSAgICB+KFNUQVRVU19TQ0FOTklORyB8IFNUQVRVU19TQ0FOX0FCT1JUSU5HKTsKKworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+c2Nhbl9jaGVjayk7CisKKwkJCWlmICghKHByaXYtPnN0YXR1cyAmIChTVEFUVVNfQVNTT0NJQVRFRCB8CisJCQkJCSAgICAgIFNUQVRVU19BU1NPQ0lBVElORyB8CisJCQkJCSAgICAgIFNUQVRVU19ST0FNSU5HIHwKKwkJCQkJICAgICAgU1RBVFVTX0RJU0FTU09DSUFUSU5HKSkpCisJCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5hc3NvY2lhdGUpOworCQkJZWxzZSBpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JPQU1JTkcpIHsKKwkJCQkvKiBJZiBhIHNjYW4gY29tcGxldGVkIGFuZCB3ZSBhcmUgaW4gcm9hbSBtb2RlLCB0aGVuCisJCQkJICogdGhlIHNjYW4gdGhhdCBjb21wbGV0ZWQgd2FzIHRoZSBvbmUgcmVxdWVzdGVkIGFzIGEKKwkJCQkgKiByZXN1bHQgb2YgZW50ZXJpbmcgcm9hbS4uLiBzbywgc2NoZWR1bGUgdGhlCisJCQkJICogcm9hbSB3b3JrICovCisJCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yb2FtKTsKKwkJCX0gZWxzZSBpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1NDQU5fUEVORElORykKKwkJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwKKwkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2Nhbik7CisKKwkJCXByaXYtPmllZWUtPnNjYW5zKys7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBIT1NUX05PVElGSUNBVElPTl9TVEFUVVNfRlJBR19MRU5HVEg6eworCQkJc3RydWN0IG5vdGlmX2ZyYWdfbGVuZ3RoICp4ID0gJm5vdGlmLT51LmZyYWdfbGVuOworCisJCQlpZiAobm90aWYtPnNpemUgPT0gc2l6ZW9mKCp4KSkgeworCQkJCUlQV19FUlJPUigiRnJhZyBsZW5ndGg6ICVkXG4iLCB4LT5mcmFnX2xlbmd0aCk7CisJCQl9IGVsc2UgeworCQkJCUlQV19FUlJPUigiRnJhZyBsZW5ndGggb2Ygd3Jvbmcgc2l6ZSAlZCAiCisJCQkJCSAgIihzaG91bGQgYmUgJXpkKVxuIiwKKwkJCQkJICBub3RpZi0+c2l6ZSwgc2l6ZW9mKCp4KSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBIT1NUX05PVElGSUNBVElPTl9TVEFUVVNfTElOS19ERVRFUklPUkFUSU9OOnsKKwkJCXN0cnVjdCBub3RpZl9saW5rX2RldGVyaW9yYXRpb24gKnggPQorCQkJICAgICZub3RpZi0+dS5saW5rX2RldGVyaW9yYXRpb247CisJCQlpZiAobm90aWYtPnNpemUgPT0gc2l6ZW9mKCp4KSkgeworCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUsCisJCQkJCSAgImxpbmsgZGV0ZXJpb3JhdGlvbjogJyVzJyAiIE1BQ19GTVQKKwkJCQkJICAiIFxuIiwgZXNjYXBlX2Vzc2lkKHByaXYtPmVzc2lkLAorCQkJCQkJCSAgICAgIHByaXYtPmVzc2lkX2xlbiksCisJCQkJCSAgTUFDX0FSRyhwcml2LT5ic3NpZCkpOworCQkJCW1lbWNweSgmcHJpdi0+bGFzdF9saW5rX2RldGVyaW9yYXRpb24sIHgsCisJCQkJICAgICAgIHNpemVvZigqeCkpOworCQkJfSBlbHNlIHsKKwkJCQlJUFdfRVJST1IoIkxpbmsgRGV0ZXJpb3JhdGlvbiBvZiB3cm9uZyBzaXplICVkICIKKwkJCQkJICAiKHNob3VsZCBiZSAlemQpXG4iLAorCQkJCQkgIG5vdGlmLT5zaXplLCBzaXplb2YoKngpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEhPU1RfTk9USUZJQ0FUSU9OX0RJTk9fQ09ORklHX1JFU1BPTlNFOnsKKwkJCUlQV19FUlJPUigiRGlubyBjb25maWdcbiIpOworCQkJaWYgKHByaXYtPmhjbWQKKwkJCSAgICAmJiBwcml2LT5oY21kLT5jbWQgPT0gSE9TVF9DTURfRElOT19DT05GSUcpIHsKKwkJCQkvKiBUT0RPOiBEbyBhbnl0aGluZyBzcGVjaWFsPyAqLworCQkJfSBlbHNlIHsKKwkJCQlJUFdfRVJST1IoIlVuZXhwZWN0ZWQgRElOT19DT05GSUdfUkVTUE9OU0VcbiIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2UgSE9TVF9OT1RJRklDQVRJT05fU1RBVFVTX0JFQUNPTl9TVEFURTp7CisJCQlzdHJ1Y3Qgbm90aWZfYmVhY29uX3N0YXRlICp4ID0gJm5vdGlmLT51LmJlYWNvbl9zdGF0ZTsKKwkJCWlmIChub3RpZi0+c2l6ZSAhPSBzaXplb2YoKngpKSB7CisJCQkJSVBXX0VSUk9SCisJCQkJICAgICgiQmVhY29uIHN0YXRlIG9mIHdyb25nIHNpemUgJWQgKHNob3VsZCAiCisJCQkJICAgICAiYmUgJXpkKVxuIiwgbm90aWYtPnNpemUsIHNpemVvZigqeCkpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoeC0+c3RhdGUgPT0gSE9TVF9OT1RJRklDQVRJT05fU1RBVFVTX0JFQUNPTl9NSVNTSU5HKSB7CisJCQkJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19TQ0FOTklORykgeworCQkJCQkvKiBTdG9wIHNjYW4gdG8ga2VlcCBmdyBmcm9tIGdldHRpbmcKKwkJCQkJICogc3R1Y2suLi4gKi8KKwkJCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsCisJCQkJCQkgICAmcHJpdi0+YWJvcnRfc2Nhbik7CisJCQkJfQorCisJCQkJaWYgKHgtPm51bWJlciA+IHByaXYtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkICYmCisJCQkJICAgIHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKSB7CisJCQkJCUlQV19ERUJVRyhJUFdfRExfSU5GTyB8IElQV19ETF9OT1RJRiB8CisJCQkJCQkgIElQV19ETF9TVEFURSwKKwkJCQkJCSAgIk1pc3NlZCBiZWFjb246ICVkIC0gZGlzYXNzb2NpYXRlXG4iLAorCQkJCQkJICB4LT5udW1iZXIpOworCQkJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwKKwkJCQkJCSAgICZwcml2LT5kaXNhc3NvY2lhdGUpOworCQkJCX0gZWxzZSBpZiAoeC0+bnVtYmVyID4gcHJpdi0+cm9hbWluZ190aHJlc2hvbGQpIHsKKwkJCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSwKKwkJCQkJCSAgIk1pc3NlZCBiZWFjb246ICVkIC0gaW5pdGlhdGUgIgorCQkJCQkJICAicm9hbWluZ1xuIiwgeC0+bnVtYmVyKTsKKwkJCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsCisJCQkJCQkgICAmcHJpdi0+cm9hbSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJSVBXX0RFQlVHX05PVElGKCJNaXNzZWQgYmVhY29uOiAlZFxuIiwKKwkJCQkJCQl4LT5udW1iZXIpOworCQkJCX0KKworCQkJCXByaXYtPm5vdGlmX21pc3NlZF9iZWFjb25zID0geC0+bnVtYmVyOworCisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19UR0lfVFhfS0VZOnsKKwkJCXN0cnVjdCBub3RpZl90Z2lfdHhfa2V5ICp4ID0gJm5vdGlmLT51LnRnaV90eF9rZXk7CisJCQlpZiAobm90aWYtPnNpemUgPT0gc2l6ZW9mKCp4KSkgeworCQkJCUlQV19FUlJPUigiVEdpIFR4IEtleTogc3RhdGUgMHglMDJ4IHNlYyB0eXBlICIKKwkJCQkJICAiMHglMDJ4IHN0YXRpb24gJWRcbiIsCisJCQkJCSAgeC0+a2V5X3N0YXRlLCB4LT5zZWN1cml0eV90eXBlLAorCQkJCQkgIHgtPnN0YXRpb25faW5kZXgpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlJUFdfRVJST1IKKwkJCSAgICAoIlRHaSBUeCBLZXkgb2Ygd3Jvbmcgc2l6ZSAlZCAoc2hvdWxkIGJlICV6ZClcbiIsCisJCQkgICAgIG5vdGlmLT5zaXplLCBzaXplb2YoKngpKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEhPU1RfTk9USUZJQ0FUSU9OX0NBTElCX0tFRVBfUkVTVUxUUzp7CisJCQlzdHJ1Y3Qgbm90aWZfY2FsaWJyYXRpb24gKnggPSAmbm90aWYtPnUuY2FsaWJyYXRpb247CisKKwkJCWlmIChub3RpZi0+c2l6ZSA9PSBzaXplb2YoKngpKSB7CisJCQkJbWVtY3B5KCZwcml2LT5jYWxpYiwgeCwgc2l6ZW9mKCp4KSk7CisJCQkJSVBXX0RFQlVHX0lORk8oIlRPRE86IENhbGlicmF0aW9uXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJSVBXX0VSUk9SCisJCQkgICAgKCJDYWxpYnJhdGlvbiBvZiB3cm9uZyBzaXplICVkIChzaG91bGQgYmUgJXpkKVxuIiwKKwkJCSAgICAgbm90aWYtPnNpemUsIHNpemVvZigqeCkpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgSE9TVF9OT1RJRklDQVRJT05fTk9JU0VfU1RBVFM6eworCQkJaWYgKG5vdGlmLT5zaXplID09IHNpemVvZih1MzIpKSB7CisJCQkJcHJpdi0+bGFzdF9ub2lzZSA9CisJCQkJICAgICh1OCkgKG5vdGlmLT51Lm5vaXNlLnZhbHVlICYgMHhmZik7CisJCQkJYXZlcmFnZV9hZGQoJnByaXYtPmF2ZXJhZ2Vfbm9pc2UsCisJCQkJCSAgICBwcml2LT5sYXN0X25vaXNlKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJSVBXX0VSUk9SCisJCQkgICAgKCJOb2lzZSBzdGF0IGlzIHdyb25nIHNpemUgJWQgKHNob3VsZCBiZSAlemQpXG4iLAorCQkJICAgICBub3RpZi0+c2l6ZSwgc2l6ZW9mKHUzMikpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCUlQV19FUlJPUigiVW5rbm93biBub3RpZmljYXRpb246ICIKKwkJCSAgInN1YnR5cGU9JWQsZmxhZ3M9MHglMngsc2l6ZT0lZFxuIiwKKwkJCSAgbm90aWYtPnN1YnR5cGUsIG5vdGlmLT5mbGFncywgbm90aWYtPnNpemUpOworCX0KK30KKworLyoqCisgKiBEZXN0cm95cyBhbGwgRE1BIHN0cnVjdHVyZXMgYW5kIGluaXRpYWxpc2UgdGhlbSBhZ2FpbgorICoKKyAqIEBwYXJhbSBwcml2CisgKiBAcmV0dXJuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBpcHdfcXVldWVfcmVzZXQoc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCWludCByYyA9IDA7CisJLyoqIEB0b2RvIGN1c3RvbWl6ZSBxdWV1ZSBzaXplcyAqLworCWludCBuVHggPSA2NCwgblR4Q21kID0gODsKKwlpcHdfdHhfcXVldWVfZnJlZShwcml2KTsKKwkvKiBUeCBDTUQgcXVldWUgKi8KKwlyYyA9IGlwd19xdWV1ZV90eF9pbml0KHByaXYsICZwcml2LT50eHFfY21kLCBuVHhDbWQsCisJCQkgICAgICAgQ1gyX1RYX0NNRF9RVUVVRV9SRUFEX0lOREVYLAorCQkJICAgICAgIENYMl9UWF9DTURfUVVFVUVfV1JJVEVfSU5ERVgsCisJCQkgICAgICAgQ1gyX1RYX0NNRF9RVUVVRV9CRF9CQVNFLAorCQkJICAgICAgIENYMl9UWF9DTURfUVVFVUVfQkRfU0laRSk7CisJaWYgKHJjKSB7CisJCUlQV19FUlJPUigiVHggQ21kIHF1ZXVlIGluaXQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogVHggcXVldWUocykgKi8KKwlyYyA9IGlwd19xdWV1ZV90eF9pbml0KHByaXYsICZwcml2LT50eHFbMF0sIG5UeCwKKwkJCSAgICAgICBDWDJfVFhfUVVFVUVfMF9SRUFEX0lOREVYLAorCQkJICAgICAgIENYMl9UWF9RVUVVRV8wX1dSSVRFX0lOREVYLAorCQkJICAgICAgIENYMl9UWF9RVUVVRV8wX0JEX0JBU0UsIENYMl9UWF9RVUVVRV8wX0JEX1NJWkUpOworCWlmIChyYykgeworCQlJUFdfRVJST1IoIlR4IDAgcXVldWUgaW5pdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlyYyA9IGlwd19xdWV1ZV90eF9pbml0KHByaXYsICZwcml2LT50eHFbMV0sIG5UeCwKKwkJCSAgICAgICBDWDJfVFhfUVVFVUVfMV9SRUFEX0lOREVYLAorCQkJICAgICAgIENYMl9UWF9RVUVVRV8xX1dSSVRFX0lOREVYLAorCQkJICAgICAgIENYMl9UWF9RVUVVRV8xX0JEX0JBU0UsIENYMl9UWF9RVUVVRV8xX0JEX1NJWkUpOworCWlmIChyYykgeworCQlJUFdfRVJST1IoIlR4IDEgcXVldWUgaW5pdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlyYyA9IGlwd19xdWV1ZV90eF9pbml0KHByaXYsICZwcml2LT50eHFbMl0sIG5UeCwKKwkJCSAgICAgICBDWDJfVFhfUVVFVUVfMl9SRUFEX0lOREVYLAorCQkJICAgICAgIENYMl9UWF9RVUVVRV8yX1dSSVRFX0lOREVYLAorCQkJICAgICAgIENYMl9UWF9RVUVVRV8yX0JEX0JBU0UsIENYMl9UWF9RVUVVRV8yX0JEX1NJWkUpOworCWlmIChyYykgeworCQlJUFdfRVJST1IoIlR4IDIgcXVldWUgaW5pdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlyYyA9IGlwd19xdWV1ZV90eF9pbml0KHByaXYsICZwcml2LT50eHFbM10sIG5UeCwKKwkJCSAgICAgICBDWDJfVFhfUVVFVUVfM19SRUFEX0lOREVYLAorCQkJICAgICAgIENYMl9UWF9RVUVVRV8zX1dSSVRFX0lOREVYLAorCQkJICAgICAgIENYMl9UWF9RVUVVRV8zX0JEX0JBU0UsIENYMl9UWF9RVUVVRV8zX0JEX1NJWkUpOworCWlmIChyYykgeworCQlJUFdfRVJST1IoIlR4IDMgcXVldWUgaW5pdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBzdGF0aXN0aWNzICovCisJcHJpdi0+cnhfYnVmc19taW4gPSAwOworCXByaXYtPnJ4X3BlbmRfbWF4ID0gMDsKKwlyZXR1cm4gcmM7CisKKyAgICAgIGVycm9yOgorCWlwd190eF9xdWV1ZV9mcmVlKHByaXYpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBSZWNsYWltIFR4IHF1ZXVlIGVudHJpZXMgbm8gbW9yZSB1c2VkIGJ5IE5JQy4KKyAqCisgKiBXaGVuIEZXIGFkd2FuY2VzICdSJyBpbmRleCwgYWxsIGVudHJpZXMgYmV0d2VlbiBvbGQgYW5kCisgKiBuZXcgJ1InIGluZGV4IG5lZWQgdG8gYmUgcmVjbGFpbWVkLiBBcyByZXN1bHQsIHNvbWUgZnJlZSBzcGFjZQorICogZm9ybXMuIElmIHRoZXJlIGlzIGVub3VnaCBmcmVlIHNwYWNlICg+IGxvdyBtYXJrKSwgd2FrZSBUeCBxdWV1ZS4KKyAqCisgKiBAbm90ZSBOZWVkIHRvIHByb3RlY3QgYWdhaW5zdCBnYXJiYWdlIGluICdSJyBpbmRleAorICogQHBhcmFtIHByaXYKKyAqIEBwYXJhbSB0eHEKKyAqIEBwYXJhbSBxaW5kZXgKKyAqIEByZXR1cm4gTnVtYmVyIG9mIHVzZWQgZW50cmllcyByZW1haW5zIGluIHRoZSBxdWV1ZQorICovCitzdGF0aWMgaW50IGlwd19xdWV1ZV90eF9yZWNsYWltKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKKwkJCQlzdHJ1Y3QgY2x4Ml90eF9xdWV1ZSAqdHhxLCBpbnQgcWluZGV4KQoreworCXUzMiBod190YWlsOworCWludCB1c2VkOworCXN0cnVjdCBjbHgyX3F1ZXVlICpxID0gJnR4cS0+cTsKKworCWh3X3RhaWwgPSBpcHdfcmVhZDMyKHByaXYsIHEtPnJlZ19yKTsKKwlpZiAoaHdfdGFpbCA+PSBxLT5uX2JkKSB7CisJCUlQV19FUlJPUgorCQkgICAgKCJSZWFkIGluZGV4IGZvciBETUEgcXVldWUgKCVkKSBpcyBvdXQgb2YgcmFuZ2UgWzAtJWQpXG4iLAorCQkgICAgIGh3X3RhaWwsIHEtPm5fYmQpOworCQlnb3RvIGRvbmU7CisJfQorCWZvciAoOyBxLT5sYXN0X3VzZWQgIT0gaHdfdGFpbDsKKwkgICAgIHEtPmxhc3RfdXNlZCA9IGlwd19xdWV1ZV9pbmNfd3JhcChxLT5sYXN0X3VzZWQsIHEtPm5fYmQpKSB7CisJCWlwd19xdWV1ZV90eF9mcmVlX3RmZChwcml2LCB0eHEpOworCQlwcml2LT50eF9wYWNrZXRzKys7CisJfQorICAgICAgZG9uZToKKwlpZiAoaXB3X3F1ZXVlX3NwYWNlKHEpID4gcS0+bG93X21hcmsgJiYgcWluZGV4ID49IDApIHsKKwkJX19tYXliZV93YWtlX3R4KHByaXYpOworCX0KKwl1c2VkID0gcS0+Zmlyc3RfZW1wdHkgLSBxLT5sYXN0X3VzZWQ7CisJaWYgKHVzZWQgPCAwKQorCQl1c2VkICs9IHEtPm5fYmQ7CisKKwlyZXR1cm4gdXNlZDsKK30KKworc3RhdGljIGludCBpcHdfcXVldWVfdHhfaGNtZChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIGludCBoY21kLCB2b2lkICpidWYsCisJCQkgICAgIGludCBsZW4sIGludCBzeW5jKQoreworCXN0cnVjdCBjbHgyX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxX2NtZDsKKwlzdHJ1Y3QgY2x4Ml9xdWV1ZSAqcSA9ICZ0eHEtPnE7CisJc3RydWN0IHRmZF9mcmFtZSAqdGZkOworCisJaWYgKGlwd19xdWV1ZV9zcGFjZShxKSA8IChzeW5jID8gMSA6IDIpKSB7CisJCUlQV19FUlJPUigiTm8gc3BhY2UgZm9yIFR4XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwl0ZmQgPSAmdHhxLT5iZFtxLT5maXJzdF9lbXB0eV07CisJdHhxLT50eGJbcS0+Zmlyc3RfZW1wdHldID0gTlVMTDsKKworCW1lbXNldCh0ZmQsIDAsIHNpemVvZigqdGZkKSk7CisJdGZkLT5jb250cm9sX2ZsYWdzLm1lc3NhZ2VfdHlwZSA9IFRYX0hPU1RfQ09NTUFORF9UWVBFOworCXRmZC0+Y29udHJvbF9mbGFncy5jb250cm9sX2JpdHMgPSBURkRfTkVFRF9JUlFfTUFTSzsKKwlwcml2LT5oY21kX3NlcSsrOworCXRmZC0+dS5jbWQuaW5kZXggPSBoY21kOworCXRmZC0+dS5jbWQubGVuZ3RoID0gbGVuOworCW1lbWNweSh0ZmQtPnUuY21kLnBheWxvYWQsIGJ1ZiwgbGVuKTsKKwlxLT5maXJzdF9lbXB0eSA9IGlwd19xdWV1ZV9pbmNfd3JhcChxLT5maXJzdF9lbXB0eSwgcS0+bl9iZCk7CisJaXB3X3dyaXRlMzIocHJpdiwgcS0+cmVnX3csIHEtPmZpcnN0X2VtcHR5KTsKKwlfaXB3X3JlYWQzMihwcml2LCAweDkwKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUnggdGhlb3J5IG9mIG9wZXJhdGlvbgorICoKKyAqIFRoZSBob3N0IGFsbG9jYXRlcyAzMiBETUEgdGFyZ2V0IGFkZHJlc3NlcyBhbmQgcGFzc2VzIHRoZSBob3N0IGFkZHJlc3MKKyAqIHRvIHRoZSBmaXJtd2FyZSBhdCByZWdpc3RlciBDWDJfUkZEU19UQUJMRV9MT1dFUiArIE4gKiBSRkRfU0laRSB3aGVyZSBOIGlzCisgKiAwIHRvIDMxCisgKgorICogUnggUXVldWUgSW5kZXhlcworICogVGhlIGhvc3QvZmlybXdhcmUgc2hhcmUgdHdvIGluZGV4IHJlZ2lzdGVycyBmb3IgbWFuYWdpbmcgdGhlIFJ4IGJ1ZmZlcnMuCisgKgorICogVGhlIFJFQUQgaW5kZXggbWFwcyB0byB0aGUgZmlyc3QgcG9zaXRpb24gdGhhdCB0aGUgZmlybXdhcmUgbWF5IGJlIHdyaXRpbmcKKyAqIHRvIC0tIHRoZSBkcml2ZXIgY2FuIHJlYWQgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGlzIHBvc2l0aW9uIGFuZCBnZXQKKyAqIGdvb2QgZGF0YS4KKyAqIFRoZSBSRUFEIGluZGV4IGlzIG1hbmFnZWQgYnkgdGhlIGZpcm13YXJlIG9uY2UgdGhlIGNhcmQgaXMgZW5hYmxlZC4KKyAqCisgKiBUaGUgV1JJVEUgaW5kZXggbWFwcyB0byB0aGUgbGFzdCBwb3NpdGlvbiB0aGUgZHJpdmVyIGhhcyByZWFkIGZyb20gLS0gdGhlCisgKiBwb3NpdGlvbiBwcmVjZWRpbmcgV1JJVEUgaXMgdGhlIGxhc3Qgc2xvdCB0aGUgZmlybXdhcmUgY2FuIHBsYWNlIGEgcGFja2V0LgorICoKKyAqIFRoZSBxdWV1ZSBpcyBlbXB0eSAobm8gZ29vZCBkYXRhKSBpZiBXUklURSA9IFJFQUQgLSAxLCBhbmQgaXMgZnVsbCBpZgorICogV1JJVEUgPSBSRUFELgorICoKKyAqIER1cmluZyBpbml0aWFsaXphdGlvbiB0aGUgaG9zdCBzZXRzIHVwIHRoZSBSRUFEIHF1ZXVlIHBvc2l0aW9uIHRvIHRoZSBmaXJzdAorICogSU5ERVggcG9zaXRpb24sIGFuZCBXUklURSB0byB0aGUgbGFzdCAoUkVBRCAtIDEgd3JhcHBlZCkKKyAqCisgKiBXaGVuIHRoZSBmaXJtd2FyZSBwbGFjZXMgYSBwYWNrZXQgaW4gYSBidWZmZXIgaXQgd2lsbCBhZHZhbmNlIHRoZSBSRUFEIGluZGV4CisgKiBhbmQgZmlyZSB0aGUgUlggaW50ZXJydXB0LiAgVGhlIGRyaXZlciBjYW4gdGhlbiBxdWVyeSB0aGUgUkVBRCBpbmRleCBhbmQKKyAqIHByb2Nlc3MgYXMgbWFueSBwYWNrZXRzIGFzIHBvc3NpYmxlLCBtb3ZpbmcgdGhlIFdSSVRFIGluZGV4IGZvcndhcmQgYXMgaXQKKyAqIHJlc2V0cyB0aGUgUnggcXVldWUgYnVmZmVycyB3aXRoIG5ldyBtZW1vcnkuCisgKgorICogVGhlIG1hbmFnZW1lbnQgaW4gdGhlIGRyaXZlciBpcyBhcyBmb2xsb3dzOgorICogKyBBIGxpc3Qgb2YgcHJlLWFsbG9jYXRlZCBTS0JzIGlzIHN0b3JlZCBpbiBpcHctPnJ4cS0+cnhfZnJlZS4gIFdoZW4KKyAqICAgaXB3LT5yeHEtPmZyZWVfY291bnQgZHJvcHMgdG8gb3IgYmVsb3cgUlhfTE9XX1dBVEVSTUFSSywgd29yayBpcyBzY2hlZHVsZWQKKyAqICAgdG8gcmVwbGVuc2lzaCB0aGUgaXB3LT5yeHEtPnJ4X2ZyZWUuCisgKiArIEluIGlwd19yeF9xdWV1ZV9yZXBsZW5pc2ggKHNjaGVkdWxlZCkgaWYgJ3Byb2Nlc3NlZCcgIT0gJ3JlYWQnIHRoZW4gdGhlCisgKiAgIGlwdy0+cnhxIGlzIHJlcGxlbmlzaGVkIGFuZCB0aGUgUkVBRCBJTkRFWCBpcyB1cGRhdGVkICh1cGRhdGluZyB0aGUKKyAqICAgJ3Byb2Nlc3NlZCcgYW5kICdyZWFkJyBkcml2ZXIgaW5kZXhlcyBhcyB3ZWxsKQorICogKyBBIHJlY2VpdmVkIHBhY2tldCBpcyBwcm9jZXNzZWQgYW5kIGhhbmRlZCB0byB0aGUga2VybmVsIG5ldHdvcmsgc3RhY2ssCisgKiAgIGRldGFjaGVkIGZyb20gdGhlIGlwdy0+cnhxLiAgVGhlIGRyaXZlciAncHJvY2Vzc2VkJyBpbmRleCBpcyB1cGRhdGVkLgorICogKyBUaGUgSG9zdC9GaXJtd2FyZSBpcHctPnJ4cSBpcyByZXBsZW5pc2hlZCBhdCB0YXNrbGV0IHRpbWUgZnJvbSB0aGUgcnhfZnJlZQorICogICBsaXN0LiBJZiB0aGVyZSBhcmUgbm8gYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gaXB3LT5yeHEtPnJ4X2ZyZWUsIHRoZSBSRUFECisgKiAgIElOREVYIGlzIG5vdCBpbmNyZW1lbnRlZCBhbmQgaXB3LT5zdGF0dXMoUlhfU1RBTExFRCkgaXMgc2V0LiAgSWYgdGhlcmUKKyAqICAgd2VyZSBlbm91Z2ggZnJlZSBidWZmZXJzIGFuZCBSWF9TVEFMTEVEIGlzIHNldCBpdCBpcyBjbGVhcmVkLgorICoKKyAqCisgKiBEcml2ZXIgc2VxdWVuY2U6CisgKgorICogaXB3X3J4X3F1ZXVlX2FsbG9jKCkgICAgICAgQWxsb2NhdGVzIHJ4X2ZyZWUKKyAqIGlwd19yeF9xdWV1ZV9yZXBsZW5pc2goKSAgIFJlcGxlbmlzaGVzIHJ4X2ZyZWUgbGlzdCBmcm9tIHJ4X3VzZWQsIGFuZCBjYWxscworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXB3X3J4X3F1ZXVlX3Jlc3RvY2sKKyAqIGlwd19yeF9xdWV1ZV9yZXN0b2NrKCkgICAgIE1vdmVzIGF2YWlsYWJsZSBidWZmZXJzIGZyb20gcnhfZnJlZSBpbnRvIFJ4CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwgdXBkYXRlcyBmaXJtd2FyZSBwb2ludGVycywgYW5kIHVwZGF0ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBXUklURSBpbmRleC4gIElmIGluc3VmZmljaWVudCByeF9mcmVlIGJ1ZmZlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUsIHNjaGVkdWxlcyBpcHdfcnhfcXVldWVfcmVwbGVuaXNoCisgKgorICogLS0gZW5hYmxlIGludGVycnVwdHMgLS0KKyAqIElTUiAtIGlwd19yeCgpICAgICAgICAgICAgIERldGFjaCBpcHdfcnhfbWVtX2J1ZmZlcnMgZnJvbSBwb29sIHVwIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRCBJTkRFWCwgZGV0YWNoaW5nIHRoZSBTS0IgZnJvbSB0aGUgcG9vbC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmVzIHRoZSBwYWNrZXQgYnVmZmVyIGZyb20gcXVldWUgdG8gcnhfdXNlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxzIGlwd19yeF9xdWV1ZV9yZXN0b2NrIHRvIHJlZmlsbCBhbnkgZW1wdHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzLgorICogLi4uCisgKgorICovCisKKy8qCisgKiBJZiB0aGVyZSBhcmUgc2xvdHMgaW4gdGhlIFJYIHF1ZXVlIHRoYXQgIG5lZWQgdG8gYmUgcmVzdG9ja2VkLAorICogYW5kIHdlIGhhdmUgZnJlZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlcnMsIGZpbGwgdGhlIHJhbmtzIGFzIG11Y2gKKyAqIGFzIHdlIGNhbiBwdWxsaW5nIGZyb20gcnhfZnJlZS4KKyAqCisgKiBUaGlzIG1vdmVzIHRoZSAnd3JpdGUnIGluZGV4IGZvcndhcmQgdG8gY2F0Y2ggdXAgd2l0aCAncHJvY2Vzc2VkJywgYW5kCisgKiBhbHNvIHVwZGF0ZXMgdGhlIG1lbW9yeSBhZGRyZXNzIGluIHRoZSBmaXJtd2FyZSB0byByZWZlcmVuY2UgdGhlIG5ldworICogdGFyZ2V0IGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgaXB3X3J4X3F1ZXVlX3Jlc3RvY2soc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCXN0cnVjdCBpcHdfcnhfcXVldWUgKnJ4cSA9IHByaXYtPnJ4cTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OworCXN0cnVjdCBpcHdfcnhfbWVtX2J1ZmZlciAqcnhiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdyaXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCXdyaXRlID0gcnhxLT53cml0ZTsKKwl3aGlsZSAoKHJ4cS0+d3JpdGUgIT0gcnhxLT5wcm9jZXNzZWQpICYmIChyeHEtPmZyZWVfY291bnQpKSB7CisJCWVsZW1lbnQgPSByeHEtPnJ4X2ZyZWUubmV4dDsKKwkJcnhiID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaXB3X3J4X21lbV9idWZmZXIsIGxpc3QpOworCQlsaXN0X2RlbChlbGVtZW50KTsKKworCQlpcHdfd3JpdGUzMihwcml2LCBDWDJfUkZEU19UQUJMRV9MT1dFUiArIHJ4cS0+d3JpdGUgKiBSRkRfU0laRSwKKwkJCSAgICByeGItPmRtYV9hZGRyKTsKKwkJcnhxLT5xdWV1ZVtyeHEtPndyaXRlXSA9IHJ4YjsKKwkJcnhxLT53cml0ZSA9IChyeHEtPndyaXRlICsgMSkgJSBSWF9RVUVVRV9TSVpFOworCQlyeHEtPmZyZWVfY291bnQtLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB0aGUgcHJlLWFsbG9jYXRlZCBidWZmZXIgcG9vbCBpcyBkcm9wcGluZyBsb3csIHNjaGVkdWxlIHRvCisJICogcmVmaWxsIGl0ICovCisJaWYgKHJ4cS0+ZnJlZV9jb3VudCA8PSBSWF9MT1dfV0FURVJNQVJLKQorCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJ4X3JlcGxlbmlzaCk7CisKKwkvKiBJZiB3ZSd2ZSBhZGRlZCBtb3JlIHNwYWNlIGZvciB0aGUgZmlybXdhcmUgdG8gcGxhY2UgZGF0YSwgdGVsbCBpdCAqLworCWlmICh3cml0ZSAhPSByeHEtPndyaXRlKQorCQlpcHdfd3JpdGUzMihwcml2LCBDWDJfUlhfV1JJVEVfSU5ERVgsIHJ4cS0+d3JpdGUpOworfQorCisvKgorICogTW92ZSBhbGwgdXNlZCBwYWNrZXQgZnJvbSByeF91c2VkIHRvIHJ4X2ZyZWUsIGFsbG9jYXRpbmcgYSBuZXcgU0tCIGZvciBlYWNoLgorICogQWxzbyByZXN0b2NrIHRoZSBSeCBxdWV1ZSB2aWEgaXB3X3J4X3F1ZXVlX3Jlc3RvY2suCisgKgorICogVGhpcyBpcyBjYWxsZWQgYXMgYSBzY2hlZHVsZWQgd29yayBpdGVtIChleGNlcHQgZm9yIGR1cmluZyBpbnRpYWxpemF0aW9uKQorICovCitzdGF0aWMgdm9pZCBpcHdfcnhfcXVldWVfcmVwbGVuaXNoKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gZGF0YTsKKwlzdHJ1Y3QgaXB3X3J4X3F1ZXVlICpyeHEgPSBwcml2LT5yeHE7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKwlzdHJ1Y3QgaXB3X3J4X21lbV9idWZmZXIgKnJ4YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCXdoaWxlICghbGlzdF9lbXB0eSgmcnhxLT5yeF91c2VkKSkgeworCQllbGVtZW50ID0gcnhxLT5yeF91c2VkLm5leHQ7CisJCXJ4YiA9IGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGlwd19yeF9tZW1fYnVmZmVyLCBsaXN0KTsKKwkJcnhiLT5za2IgPSBhbGxvY19za2IoQ1gyX1JYX0JVRl9TSVpFLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFyeGItPnNrYikgeworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IENhbiBub3QgYWxsb2NhdGUgU0tCIGJ1ZmZlcnMuXG4iLAorCQkJICAgICAgIHByaXYtPm5ldF9kZXYtPm5hbWUpOworCQkJLyogV2UgZG9uJ3QgcmVzY2hlZHVsZSByZXBsZW5pc2ggd29yayBoZXJlIC0tIHdlIHdpbGwKKwkJCSAqIGNhbGwgdGhlIHJlc3RvY2sgbWV0aG9kIGFuZCBpZiBpdCBzdGlsbCBuZWVkcworCQkJICogbW9yZSBidWZmZXJzIGl0IHdpbGwgc2NoZWR1bGUgcmVwbGVuaXNoICovCisJCQlicmVhazsKKwkJfQorCQlsaXN0X2RlbChlbGVtZW50KTsKKworCQlyeGItPnJ4YiA9IChzdHJ1Y3QgaXB3X3J4X2J1ZmZlciAqKXJ4Yi0+c2tiLT5kYXRhOworCQlyeGItPmRtYV9hZGRyID0KKwkJICAgIHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsIHJ4Yi0+c2tiLT5kYXRhLAorCQkJCSAgIENYMl9SWF9CVUZfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X2ZyZWUpOworCQlyeHEtPmZyZWVfY291bnQrKzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwlpcHdfcnhfcXVldWVfcmVzdG9jayhwcml2KTsKK30KKworLyogQXNzdW1lcyB0aGF0IHRoZSBza2IgZmllbGQgb2YgdGhlIGJ1ZmZlcnMgaW4gJ3Bvb2wnIGlzIGtlcHQgYWNjdXJhdGUuCisgKiBJZiBhbiBTS0IgaGFzIGJlZW4gZGV0YWNoZWQsIHRoZSBQT09MIG5lZWRzIHRvIGhhdmUgaXQncyBTS0Igc2V0IHRvIE5VTEwKKyAqIFRoaXMgZnJlZSByb3V0aW5lIHdhbGtzIHRoZSBsaXN0IG9mIFBPT0wgZW50cmllcyBhbmQgaWYgU0tCIGlzIHNldCB0bworICogbm9uIE5VTEwgaXQgaXMgdW5tYXBwZWQgYW5kIGZyZWVkCisgKi8KK3N0YXRpYyB2b2lkIGlwd19yeF9xdWV1ZV9mcmVlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgc3RydWN0IGlwd19yeF9xdWV1ZSAqcnhxKQoreworCWludCBpOworCisJaWYgKCFyeHEpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9TSVpFICsgUlhfRlJFRV9CVUZGRVJTOyBpKyspIHsKKwkJaWYgKHJ4cS0+cG9vbFtpXS5za2IgIT0gTlVMTCkgeworCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LCByeHEtPnBvb2xbaV0uZG1hX2FkZHIsCisJCQkJCSBDWDJfUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHJ4cS0+cG9vbFtpXS5za2IpOworCQl9CisJfQorCisJa2ZyZWUocnhxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcHdfcnhfcXVldWUgKmlwd19yeF9xdWV1ZV9hbGxvYyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCit7CisJc3RydWN0IGlwd19yeF9xdWV1ZSAqcnhxOworCWludCBpOworCisJcnhxID0gKHN0cnVjdCBpcHdfcnhfcXVldWUgKilrbWFsbG9jKHNpemVvZigqcnhxKSwgR0ZQX0tFUk5FTCk7CisJbWVtc2V0KHJ4cSwgMCwgc2l6ZW9mKCpyeHEpKTsKKwlzcGluX2xvY2tfaW5pdCgmcnhxLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF9mcmVlKTsKKwlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF91c2VkKTsKKworCS8qIEZpbGwgdGhlIHJ4X3VzZWQgcXVldWUgd2l0aCBfYWxsXyBvZiB0aGUgUnggYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9GUkVFX0JVRkZFUlMgKyBSWF9RVUVVRV9TSVpFOyBpKyspCisJCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKKworCS8qIFNldCB1cyBzbyB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGFuZCB1c2VkIGFsbCBidWZmZXJzLCBidXQgaGF2ZQorCSAqIG5vdCByZXN0b2NrZWQgdGhlIFJ4IHF1ZXVlIHdpdGggZnJlc2ggYnVmZmVycyAqLworCXJ4cS0+cmVhZCA9IHJ4cS0+d3JpdGUgPSAwOworCXJ4cS0+cHJvY2Vzc2VkID0gUlhfUVVFVUVfU0laRSAtIDE7CisJcnhxLT5mcmVlX2NvdW50ID0gMDsKKworCXJldHVybiByeHE7Cit9CisKK3N0YXRpYyBpbnQgaXB3X2lzX3JhdGVfaW5fbWFzayhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIGludCBpZWVlX21vZGUsIHU4IHJhdGUpCit7CisJcmF0ZSAmPSB+SUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSzsKKwlpZiAoaWVlZV9tb2RlID09IElFRUVfQSkgeworCQlzd2l0Y2ggKHJhdGUpIHsKKwkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjoKKwkJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyA/CisJCQkgICAgMSA6IDA7CisJCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6CisJCQlyZXR1cm4gcHJpdi0+cmF0ZXNfbWFzayAmIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgPworCQkJICAgIDEgOiAwOworCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKKwkJCXJldHVybiBwcml2LT4KKwkJCSAgICByYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0sgPyAxIDogMDsKKwkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI6CisJCQlyZXR1cm4gcHJpdi0+CisJCQkgICAgcmF0ZXNfbWFzayAmIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLID8gMSA6IDA7CisJCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COgorCQkJcmV0dXJuIHByaXYtPgorCQkJICAgIHJhdGVzX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSyA/IDEgOiAwOworCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjoKKwkJCXJldHVybiBwcml2LT4KKwkJCSAgICByYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0sgPyAxIDogMDsKKwkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI6CisJCQlyZXR1cm4gcHJpdi0+CisJCQkgICAgcmF0ZXNfbWFzayAmIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLID8gMSA6IDA7CisJCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV81NE1COgorCQkJcmV0dXJuIHByaXYtPgorCQkJICAgIHJhdGVzX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSyA/IDEgOiAwOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBCIGFuZCBHIG1peGVkICovCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COgorCQlyZXR1cm4gcHJpdi0+cmF0ZXNfbWFzayAmIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSyA/IDEgOiAwOworCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzJNQjoKKwkJcmV0dXJuIHByaXYtPnJhdGVzX21hc2sgJiBJRUVFODAyMTFfQ0NLX1JBVEVfMk1CX01BU0sgPyAxIDogMDsKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV81TUI6CisJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLID8gMSA6IDA7CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjoKKwkJcmV0dXJuIHByaXYtPnJhdGVzX21hc2sgJiBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLID8gMSA6IDA7CisJfQorCisJLyogSWYgd2UgYXJlIGxpbWl0ZWQgdG8gQiBtb2R1bGF0aW9ucywgYmFpbCBhdCB0aGlzIHBvaW50ICovCisJaWYgKGllZWVfbW9kZSA9PSBJRUVFX0IpCisJCXJldHVybiAwOworCisJLyogRyAqLworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV82TUI6CisJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyA/IDEgOiAwOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6CisJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSyA/IDEgOiAwOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COgorCQlyZXR1cm4gcHJpdi0+cmF0ZXNfbWFzayAmIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLID8gMSA6IDA7CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI6CisJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sgPyAxIDogMDsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjoKKwkJcmV0dXJuIHByaXYtPnJhdGVzX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSyA/IDEgOiAwOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COgorCQlyZXR1cm4gcHJpdi0+cmF0ZXNfbWFzayAmIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLID8gMSA6IDA7CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI6CisJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sgPyAxIDogMDsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjoKKwkJcmV0dXJuIHByaXYtPnJhdGVzX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSyA/IDEgOiAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd19jb21wYXRpYmxlX3JhdGVzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKKwkJCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCisJCQkJc3RydWN0IGlwd19zdXBwb3J0ZWRfcmF0ZXMgKnJhdGVzKQoreworCWludCBudW1fcmF0ZXMsIGk7CisKKwltZW1zZXQocmF0ZXMsIDAsIHNpemVvZigqcmF0ZXMpKTsKKwludW1fcmF0ZXMgPSBtaW4obmV0d29yay0+cmF0ZXNfbGVuLCAodTgpIElQV19NQVhfUkFURVMpOworCXJhdGVzLT5udW1fcmF0ZXMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fcmF0ZXM7IGkrKykgeworCQlpZiAoIWlwd19pc19yYXRlX2luX21hc2sKKwkJICAgIChwcml2LCBuZXR3b3JrLT5tb2RlLCBuZXR3b3JrLT5yYXRlc1tpXSkpIHsKKwkJCUlQV19ERUJVR19TQ0FOKCJSYXRlICUwMlggbWFza2VkIDogMHglMDhYXG4iLAorCQkJCSAgICAgICBuZXR3b3JrLT5yYXRlc1tpXSwgcHJpdi0+cmF0ZXNfbWFzayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJhdGVzLT5zdXBwb3J0ZWRfcmF0ZXNbcmF0ZXMtPm51bV9yYXRlcysrXSA9IG5ldHdvcmstPnJhdGVzW2ldOworCX0KKworCW51bV9yYXRlcyA9CisJICAgIG1pbihuZXR3b3JrLT5yYXRlc19leF9sZW4sICh1OCkgKElQV19NQVhfUkFURVMgLSBudW1fcmF0ZXMpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3JhdGVzOyBpKyspIHsKKwkJaWYgKCFpcHdfaXNfcmF0ZV9pbl9tYXNrCisJCSAgICAocHJpdiwgbmV0d29yay0+bW9kZSwgbmV0d29yay0+cmF0ZXNfZXhbaV0pKSB7CisJCQlJUFdfREVCVUdfU0NBTigiUmF0ZSAlMDJYIG1hc2tlZCA6IDB4JTA4WFxuIiwKKwkJCQkgICAgICAgbmV0d29yay0+cmF0ZXNfZXhbaV0sIHByaXYtPnJhdGVzX21hc2spOworCQkJY29udGludWU7CisJCX0KKworCQlyYXRlcy0+c3VwcG9ydGVkX3JhdGVzW3JhdGVzLT5udW1fcmF0ZXMrK10gPQorCQkgICAgbmV0d29yay0+cmF0ZXNfZXhbaV07CisJfQorCisJcmV0dXJuIHJhdGVzLT5udW1fcmF0ZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHdfY29weV9yYXRlcyhzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyAqZGVzdCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBpcHdfc3VwcG9ydGVkX3JhdGVzICpzcmMpCit7CisJdTggaTsKKwlmb3IgKGkgPSAwOyBpIDwgc3JjLT5udW1fcmF0ZXM7IGkrKykKKwkJZGVzdC0+c3VwcG9ydGVkX3JhdGVzW2ldID0gc3JjLT5zdXBwb3J0ZWRfcmF0ZXNbaV07CisJZGVzdC0+bnVtX3JhdGVzID0gc3JjLT5udW1fcmF0ZXM7Cit9CisKKy8qIFRPRE86IExvb2sgYXQgc25pZmZlZCBwYWNrZXRzIGluIHRoZSBhaXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBiYXNpYyByYXRlCisgKiBtYXNrIHNob3VsZCBldmVyIGJlIHVzZWQgLS0gcmlnaHQgbm93IGFsbCBjYWxsZXJzIHRvIGFkZCB0aGUgc2NhbiByYXRlcyBhcmUKKyAqIHNldCB3aXRoIHRoZSBtb2R1bGF0aW9uID0gQ0NLLCBzbyBCQVNJQ19SQVRFX01BU0sgaXMgbmV2ZXIgc2V0Li4uICovCitzdGF0aWMgdm9pZCBpcHdfYWRkX2Nja19zY2FuX3JhdGVzKHN0cnVjdCBpcHdfc3VwcG9ydGVkX3JhdGVzICpyYXRlcywKKwkJCQkgICB1OCBtb2R1bGF0aW9uLCB1MzIgcmF0ZV9tYXNrKQoreworCXU4IGJhc2ljX21hc2sgPSAoSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiA9PSBtb2R1bGF0aW9uKSA/CisJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgOiAwOworCisJaWYgKHJhdGVfbWFzayAmIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSykKKwkJcmF0ZXMtPnN1cHBvcnRlZF9yYXRlc1tyYXRlcy0+bnVtX3JhdGVzKytdID0KKwkJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COworCisJaWYgKHJhdGVfbWFzayAmIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSykKKwkJcmF0ZXMtPnN1cHBvcnRlZF9yYXRlc1tyYXRlcy0+bnVtX3JhdGVzKytdID0KKwkJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COworCisJaWYgKHJhdGVfbWFzayAmIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSykKKwkJcmF0ZXMtPnN1cHBvcnRlZF9yYXRlc1tyYXRlcy0+bnVtX3JhdGVzKytdID0gYmFzaWNfbWFzayB8CisJCSAgICBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COworCisJaWYgKHJhdGVfbWFzayAmIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0spCisJCXJhdGVzLT5zdXBwb3J0ZWRfcmF0ZXNbcmF0ZXMtPm51bV9yYXRlcysrXSA9IGJhc2ljX21hc2sgfAorCQkgICAgSUVFRTgwMjExX0NDS19SQVRFXzExTUI7Cit9CisKK3N0YXRpYyB2b2lkIGlwd19hZGRfb2ZkbV9zY2FuX3JhdGVzKHN0cnVjdCBpcHdfc3VwcG9ydGVkX3JhdGVzICpyYXRlcywKKwkJCQkgICAgdTggbW9kdWxhdGlvbiwgdTMyIHJhdGVfbWFzaykKK3sKKwl1OCBiYXNpY19tYXNrID0gKElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04gPT0gbW9kdWxhdGlvbikgPworCSAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIDogMDsKKworCWlmIChyYXRlX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLKQorCQlyYXRlcy0+c3VwcG9ydGVkX3JhdGVzW3JhdGVzLT5udW1fcmF0ZXMrK10gPSBiYXNpY19tYXNrIHwKKwkJICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COworCisJaWYgKHJhdGVfbWFzayAmIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0spCisJCXJhdGVzLT5zdXBwb3J0ZWRfcmF0ZXNbcmF0ZXMtPm51bV9yYXRlcysrXSA9CisJCSAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjsKKworCWlmIChyYXRlX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSykKKwkJcmF0ZXMtPnN1cHBvcnRlZF9yYXRlc1tyYXRlcy0+bnVtX3JhdGVzKytdID0gYmFzaWNfbWFzayB8CisJCSAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7CisKKwlpZiAocmF0ZV9tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0spCisJCXJhdGVzLT5zdXBwb3J0ZWRfcmF0ZXNbcmF0ZXMtPm51bV9yYXRlcysrXSA9CisJCSAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI7CisKKwlpZiAocmF0ZV9tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV8yNE1CX01BU0spCisJCXJhdGVzLT5zdXBwb3J0ZWRfcmF0ZXNbcmF0ZXMtPm51bV9yYXRlcysrXSA9IGJhc2ljX21hc2sgfAorCQkgICAgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COworCisJaWYgKHJhdGVfbWFzayAmIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLKQorCQlyYXRlcy0+c3VwcG9ydGVkX3JhdGVzW3JhdGVzLT5udW1fcmF0ZXMrK10gPQorCQkgICAgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COworCisJaWYgKHJhdGVfbWFzayAmIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLKQorCQlyYXRlcy0+c3VwcG9ydGVkX3JhdGVzW3JhdGVzLT5udW1fcmF0ZXMrK10gPQorCQkgICAgSUVFRTgwMjExX09GRE1fUkFURV80OE1COworCisJaWYgKHJhdGVfbWFzayAmIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQorCQlyYXRlcy0+c3VwcG9ydGVkX3JhdGVzW3JhdGVzLT5udW1fcmF0ZXMrK10gPQorCQkgICAgSUVFRTgwMjExX09GRE1fUkFURV81NE1COworfQorCitzdHJ1Y3QgaXB3X25ldHdvcmtfbWF0Y2ggeworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yazsKKwlzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyByYXRlczsKK307CisKK3N0YXRpYyBpbnQgaXB3X2Jlc3RfbmV0d29yayhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCisJCQkgICAgc3RydWN0IGlwd19uZXR3b3JrX21hdGNoICptYXRjaCwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssIGludCByb2FtaW5nKQoreworCXN0cnVjdCBpcHdfc3VwcG9ydGVkX3JhdGVzIHJhdGVzOworCisJLyogVmVyaWZ5IHRoYXQgdGhpcyBuZXR3b3JrJ3MgY2FwYWJpbGl0eSBpcyBjb21wYXRpYmxlIHdpdGggdGhlCisJICogY3VycmVudCBtb2RlIChBZEhvYyBvciBJbmZyYXN0cnVjdHVyZSkgKi8KKwlpZiAoKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSAmJgorCSAgICAgIShuZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0VTUykpIHx8CisJICAgIChwcml2LT5pZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MgJiYKKwkgICAgICEobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkpIHsKKwkJSVBXX0RFQlVHX0FTU09DKCJOZXR3b3JrICclcyAoIiBNQUNfRk1UICIpJyBleGNsdWRlZCBkdWUgdG8gIgorCQkJCSJjYXBhYmlsaXR5IG1pc21hdGNoLlxuIiwKKwkJCQllc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCU1BQ19BUkcobmV0d29yay0+YnNzaWQpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgd2UgZG8gbm90IGhhdmUgYW4gRVNTSUQgZm9yIHRoaXMgQVAsIHdlIGNhbiBub3QgYXNzb2NpYXRlIHdpdGgKKwkgKiBpdCAqLworCWlmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfRU1QVFlfRVNTSUQpIHsKKwkJSVBXX0RFQlVHX0FTU09DKCJOZXR3b3JrICclcyAoIiBNQUNfRk1UICIpJyBleGNsdWRlZCAiCisJCQkJImJlY2F1c2Ugb2YgaGlkZGVuIEVTU0lELlxuIiwKKwkJCQllc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCU1BQ19BUkcobmV0d29yay0+YnNzaWQpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHVubGlrZWx5KHJvYW1pbmcpKSB7CisJCS8qIElmIHdlIGFyZSByb2FtaW5nLCB0aGVuIGVuc3VyZSBjaGVjayBpZiB0aGlzIGlzIGEgdmFsaWQKKwkJICogbmV0d29yayB0byB0cnkgYW5kIHJvYW0gdG8gKi8KKwkJaWYgKChuZXR3b3JrLT5zc2lkX2xlbiAhPSBtYXRjaC0+bmV0d29yay0+c3NpZF9sZW4pIHx8CisJCSAgICBtZW1jbXAobmV0d29yay0+c3NpZCwgbWF0Y2gtPm5ldHdvcmstPnNzaWQsCisJCQkgICBuZXR3b3JrLT5zc2lkX2xlbikpIHsKKwkJCUlQV19ERUJVR19BU1NPQygiTmV0b3dyayAnJXMgKCIgTUFDX0ZNVCAiKScgZXhjbHVkZWQgIgorCQkJCQkiYmVjYXVzZSBvZiBub24tbmV0d29yayBFU1NJRC5cbiIsCisJCQkJCWVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLAorCQkJCQkJICAgICBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQkJCU1BQ19BUkcobmV0d29yay0+YnNzaWQpKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgYW4gRVNTSUQgaGFzIGJlZW4gY29uZmlndXJlZCB0aGVuIGNvbXBhcmUgdGhlIGJyb2FkY2FzdAorCQkgKiBFU1NJRCB0byBvdXJzICovCisJCWlmICgocHJpdi0+Y29uZmlnICYgQ0ZHX1NUQVRJQ19FU1NJRCkgJiYKKwkJICAgICgobmV0d29yay0+c3NpZF9sZW4gIT0gcHJpdi0+ZXNzaWRfbGVuKSB8fAorCQkgICAgIG1lbWNtcChuZXR3b3JrLT5zc2lkLCBwcml2LT5lc3NpZCwKKwkJCSAgICBtaW4obmV0d29yay0+c3NpZF9sZW4sIHByaXYtPmVzc2lkX2xlbikpKSkgeworCQkJY2hhciBlc2NhcGVkW0lXX0VTU0lEX01BWF9TSVpFICogMiArIDFdOworCQkJc3RybmNweShlc2NhcGVkLAorCQkJCWVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLCBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQkJc2l6ZW9mKGVzY2FwZWQpKTsKKwkJCUlQV19ERUJVR19BU1NPQygiTmV0d29yayAnJXMgKCIgTUFDX0ZNVCAiKScgZXhjbHVkZWQgIgorCQkJCQkiYmVjYXVzZSBvZiBFU1NJRCBtaXNtYXRjaDogJyVzJy5cbiIsCisJCQkJCWVzY2FwZWQsIE1BQ19BUkcobmV0d29yay0+YnNzaWQpLAorCQkJCQllc2NhcGVfZXNzaWQocHJpdi0+ZXNzaWQsCisJCQkJCQkgICAgIHByaXYtPmVzc2lkX2xlbikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBJZiB0aGUgb2xkIG5ldHdvcmsgcmF0ZSBpcyBiZXR0ZXIgdGhhbiB0aGlzIG9uZSwgZG9uJ3QgYm90aGVyCisJICogdGVzdGluZyBldmVyeXRoaW5nIGVsc2UuICovCisJaWYgKG1hdGNoLT5uZXR3b3JrICYmIG1hdGNoLT5uZXR3b3JrLT5zdGF0cy5yc3NpID4gbmV0d29yay0+c3RhdHMucnNzaSkgeworCQljaGFyIGVzY2FwZWRbSVdfRVNTSURfTUFYX1NJWkUgKiAyICsgMV07CisJCXN0cm5jcHkoZXNjYXBlZCwKKwkJCWVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLCBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQlzaXplb2YoZXNjYXBlZCkpOworCQlJUFdfREVCVUdfQVNTT0MoIk5ldHdvcmsgJyVzICgiIE1BQ19GTVQgIiknIGV4Y2x1ZGVkIGJlY2F1c2UgIgorCQkJCSInJXMgKCIgTUFDX0ZNVCAiKScgaGFzIGEgc3Ryb25nZXIgc2lnbmFsLlxuIiwKKwkJCQllc2NhcGVkLCBNQUNfQVJHKG5ldHdvcmstPmJzc2lkKSwKKwkJCQllc2NhcGVfZXNzaWQobWF0Y2gtPm5ldHdvcmstPnNzaWQsCisJCQkJCSAgICAgbWF0Y2gtPm5ldHdvcmstPnNzaWRfbGVuKSwKKwkJCQlNQUNfQVJHKG1hdGNoLT5uZXR3b3JrLT5ic3NpZCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBJZiB0aGlzIG5ldHdvcmsgaGFzIGFscmVhZHkgaGFkIGFuIGFzc29jaWF0aW9uIGF0dGVtcHQgd2l0aGluIHRoZQorCSAqIGxhc3QgMyBzZWNvbmRzLCBkbyBub3QgdHJ5IGFuZCBhc3NvY2lhdGUgYWdhaW4uLi4gKi8KKwlpZiAobmV0d29yay0+bGFzdF9hc3NvY2lhdGUgJiYKKwkgICAgdGltZV9hZnRlcihuZXR3b3JrLT5sYXN0X2Fzc29jaWF0ZSArIChIWiAqIDVVTCksIGppZmZpZXMpKSB7CisJCUlQV19ERUJVR19BU1NPQygiTmV0d29yayAnJXMgKCIgTUFDX0ZNVCAiKScgZXhjbHVkZWQgIgorCQkJCSJiZWNhdXNlIG9mIHN0b3JtaW5nICglbHUgc2luY2UgbGFzdCAiCisJCQkJImFzc29jIGF0dGVtcHQpLlxuIiwKKwkJCQllc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCU1BQ19BUkcobmV0d29yay0+YnNzaWQpLAorCQkJCShqaWZmaWVzIC0gbmV0d29yay0+bGFzdF9hc3NvY2lhdGUpIC8gSFopOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBOb3cgZ28gdGhyb3VnaCBhbmQgc2VlIGlmIHRoZSByZXF1ZXN0ZWQgbmV0d29yayBpcyB2YWxpZC4uLiAqLworCWlmIChwcml2LT5pZWVlLT5zY2FuX2FnZSAhPSAwICYmCisJICAgIGppZmZpZXMgLSBuZXR3b3JrLT5sYXN0X3NjYW5uZWQgPiBwcml2LT5pZWVlLT5zY2FuX2FnZSkgeworCQlJUFdfREVCVUdfQVNTT0MoIk5ldHdvcmsgJyVzICgiIE1BQ19GTVQgIiknIGV4Y2x1ZGVkICIKKwkJCQkiYmVjYXVzZSBvZiBhZ2U6ICVsdW1zLlxuIiwKKwkJCQllc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCU1BQ19BUkcobmV0d29yay0+YnNzaWQpLAorCQkJCShqaWZmaWVzIC0gbmV0d29yay0+bGFzdF9zY2FubmVkKSAvIChIWiAvIDEwMCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKHByaXYtPmNvbmZpZyAmIENGR19TVEFUSUNfQ0hBTk5FTCkgJiYKKwkgICAgKG5ldHdvcmstPmNoYW5uZWwgIT0gcHJpdi0+Y2hhbm5lbCkpIHsKKwkJSVBXX0RFQlVHX0FTU09DKCJOZXR3b3JrICclcyAoIiBNQUNfRk1UICIpJyBleGNsdWRlZCAiCisJCQkJImJlY2F1c2Ugb2YgY2hhbm5lbCBtaXNtYXRjaDogJWQgIT0gJWQuXG4iLAorCQkJCWVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLCBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQkJTUFDX0FSRyhuZXR3b3JrLT5ic3NpZCksCisJCQkJbmV0d29yay0+Y2hhbm5lbCwgcHJpdi0+Y2hhbm5lbCk7CisJCXJldHVybiAwOworCX0KKworCS8qIFZlcmlmeSBwcml2YWN5IGNvbXBhdGFiaWxpdHkgKi8KKwlpZiAoKChwcml2LT5jYXBhYmlsaXR5ICYgQ0FQX1BSSVZBQ1lfT04pID8gMSA6IDApICE9CisJICAgICgobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKSA/IDEgOiAwKSkgeworCQlJUFdfREVCVUdfQVNTT0MoIk5ldHdvcmsgJyVzICgiIE1BQ19GTVQgIiknIGV4Y2x1ZGVkICIKKwkJCQkiYmVjYXVzZSBvZiBwcml2YWN5IG1pc21hdGNoOiAlcyAhPSAlcy5cbiIsCisJCQkJZXNjYXBlX2Vzc2lkKG5ldHdvcmstPnNzaWQsIG5ldHdvcmstPnNzaWRfbGVuKSwKKwkJCQlNQUNfQVJHKG5ldHdvcmstPmJzc2lkKSwKKwkJCQlwcml2LT5jYXBhYmlsaXR5ICYgQ0FQX1BSSVZBQ1lfT04gPyAib24iIDoKKwkJCQkib2ZmIiwKKwkJCQluZXR3b3JrLT5jYXBhYmlsaXR5ICYKKwkJCQlXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSA/ICJvbiIgOiAib2ZmIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgocHJpdi0+Y29uZmlnICYgQ0ZHX1NUQVRJQ19CU1NJRCkgJiYKKwkgICAgbWVtY21wKG5ldHdvcmstPmJzc2lkLCBwcml2LT5ic3NpZCwgRVRIX0FMRU4pKSB7CisJCUlQV19ERUJVR19BU1NPQygiTmV0d29yayAnJXMgKCIgTUFDX0ZNVCAiKScgZXhjbHVkZWQgIgorCQkJCSJiZWNhdXNlIG9mIEJTU0lEIG1pc21hdGNoOiAiIE1BQ19GTVQgIi5cbiIsCisJCQkJZXNjYXBlX2Vzc2lkKG5ldHdvcmstPnNzaWQsIG5ldHdvcmstPnNzaWRfbGVuKSwKKwkJCQlNQUNfQVJHKG5ldHdvcmstPmJzc2lkKSwgTUFDX0FSRyhwcml2LT5ic3NpZCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGaWx0ZXIgb3V0IGFueSBpbmNvbXBhdGlibGUgZnJlcSAvIG1vZGUgY29tYmluYXRpb25zICovCisJaWYgKCFpZWVlODAyMTFfaXNfdmFsaWRfbW9kZShwcml2LT5pZWVlLCBuZXR3b3JrLT5tb2RlKSkgeworCQlJUFdfREVCVUdfQVNTT0MoIk5ldHdvcmsgJyVzICgiIE1BQ19GTVQgIiknIGV4Y2x1ZGVkICIKKwkJCQkiYmVjYXVzZSBvZiBpbnZhbGlkIGZyZXF1ZW5jeS9tb2RlICIKKwkJCQkiY29tYmluYXRpb24uXG4iLAorCQkJCWVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLCBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQkJTUFDX0FSRyhuZXR3b3JrLT5ic3NpZCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpcHdfY29tcGF0aWJsZV9yYXRlcyhwcml2LCBuZXR3b3JrLCAmcmF0ZXMpOworCWlmIChyYXRlcy5udW1fcmF0ZXMgPT0gMCkgeworCQlJUFdfREVCVUdfQVNTT0MoIk5ldHdvcmsgJyVzICgiIE1BQ19GTVQgIiknIGV4Y2x1ZGVkICIKKwkJCQkiYmVjYXVzZSBvZiBubyBjb21wYXRpYmxlIHJhdGVzLlxuIiwKKwkJCQllc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCU1BQ19BUkcobmV0d29yay0+YnNzaWQpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVE9ETzogUGVyZm9ybSBhbnkgZnVydGhlciBtaW5pbWFsIGNvbXBhcml0aXRpdmUgdGVzdHMuICBXZSBkbyBub3QKKwkgKiB3YW50IHRvIHB1dCB0b28gbXVjaCBwb2xpY3kgbG9naWMgaGVyZTsgaW50ZWxsaWdlbnQgc2NhbiBzZWxlY3Rpb24KKwkgKiBzaG91bGQgb2NjdXIgd2l0aGluIGEgZ2VuZXJpYyBJRUVFIDgwMi4xMSB1c2VyIHNwYWNlIHRvb2wuICAqLworCisJLyogU2V0IHVwICduZXcnIEFQIHRvIHRoaXMgbmV0d29yayAqLworCWlwd19jb3B5X3JhdGVzKCZtYXRjaC0+cmF0ZXMsICZyYXRlcyk7CisJbWF0Y2gtPm5ldHdvcmsgPSBuZXR3b3JrOworCisJSVBXX0RFQlVHX0FTU09DKCJOZXR3b3JrICclcyAoIiBNQUNfRk1UICIpJyBpcyBhIHZpYWJsZSBtYXRjaC5cbiIsCisJCQllc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJTUFDX0FSRyhuZXR3b3JrLT5ic3NpZCkpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGlwd19hZGhvY19jcmVhdGUoc3RydWN0IGlwd19wcml2ICpwcml2LAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCit7CisJLyoKKwkgKiBGb3IgdGhlIHB1cnBvc2VzIG9mIHNjYW5uaW5nLCB3ZSBjYW4gc2V0IG91ciB3aXJlbGVzcyBtb2RlCisJICogdG8gdHJpZ2dlciBzY2FucyBhY3Jvc3MgY29tYmluYXRpb25zIG9mIGJhbmRzLCBidXQgd2hlbiBpdAorCSAqIGNvbWVzIHRvIGNyZWF0aW5nIGEgbmV3IGFkLWhvYyBuZXR3b3JrLCB3ZSBoYXZlIHRlbGwgdGhlIEZXCisJICogZXhhY3RseSB3aGljaCBiYW5kIHRvIHVzZS4KKwkgKgorCSAqIFdlIGFsc28gaGF2ZSB0aGUgcG9zc2liaWxpdHkgb2YgYW4gaW52YWxpZCBjaGFubmVsIGZvciB0aGUKKwkgKiBjaG9zc2VuIGJhbmQuICBBdHRlbXB0aW5nIHRvIGNyZWF0ZSBhIG5ldyBhZC1ob2MgbmV0d29yaworCSAqIHdpdGggYW4gaW52YWxpZCBjaGFubmVsIGZvciB3aXJlbGVzcyBtb2RlIHdpbGwgdHJpZ2dlciBhCisJICogRlcgZmF0YWwgZXJyb3IuCisJICovCisJbmV0d29yay0+bW9kZSA9IGlzX3ZhbGlkX2NoYW5uZWwocHJpdi0+aWVlZS0+bW9kZSwgcHJpdi0+Y2hhbm5lbCk7CisJaWYgKG5ldHdvcmstPm1vZGUpIHsKKwkJbmV0d29yay0+Y2hhbm5lbCA9IHByaXYtPmNoYW5uZWw7CisJfSBlbHNlIHsKKwkJSVBXX1dBUk5JTkcoIk92ZXJyaWRpbmcgaW52YWxpZCBjaGFubmVsXG4iKTsKKwkJaWYgKHByaXYtPmllZWUtPm1vZGUgJiBJRUVFX0EpIHsKKwkJCW5ldHdvcmstPm1vZGUgPSBJRUVFX0E7CisJCQlwcml2LT5jaGFubmVsID0gYmFuZF9hX2FjdGl2ZV9jaGFubmVsWzBdOworCQl9IGVsc2UgaWYgKHByaXYtPmllZWUtPm1vZGUgJiBJRUVFX0cpIHsKKwkJCW5ldHdvcmstPm1vZGUgPSBJRUVFX0c7CisJCQlwcml2LT5jaGFubmVsID0gYmFuZF9iX2FjdGl2ZV9jaGFubmVsWzBdOworCQl9IGVsc2UgeworCQkJbmV0d29yay0+bW9kZSA9IElFRUVfQjsKKwkJCXByaXYtPmNoYW5uZWwgPSBiYW5kX2JfYWN0aXZlX2NoYW5uZWxbMF07CisJCX0KKwl9CisKKwluZXR3b3JrLT5jaGFubmVsID0gcHJpdi0+Y2hhbm5lbDsKKwlwcml2LT5jb25maWcgfD0gQ0ZHX0FESE9DX1BFUlNJU1Q7CisJaXB3X2NyZWF0ZV9ic3NpZChwcml2LCBuZXR3b3JrLT5ic3NpZCk7CisJbmV0d29yay0+c3NpZF9sZW4gPSBwcml2LT5lc3NpZF9sZW47CisJbWVtY3B5KG5ldHdvcmstPnNzaWQsIHByaXYtPmVzc2lkLCBwcml2LT5lc3NpZF9sZW4pOworCW1lbXNldCgmbmV0d29yay0+c3RhdHMsIDAsIHNpemVvZihuZXR3b3JrLT5zdGF0cykpOworCW5ldHdvcmstPmNhcGFiaWxpdHkgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKKwlpZiAocHJpdi0+Y2FwYWJpbGl0eSAmIENBUF9QUklWQUNZX09OKQorCQluZXR3b3JrLT5jYXBhYmlsaXR5IHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOworCW5ldHdvcmstPnJhdGVzX2xlbiA9IG1pbihwcml2LT5yYXRlcy5udW1fcmF0ZXMsIE1BWF9SQVRFU19MRU5HVEgpOworCW1lbWNweShuZXR3b3JrLT5yYXRlcywgcHJpdi0+cmF0ZXMuc3VwcG9ydGVkX3JhdGVzLCBuZXR3b3JrLT5yYXRlc19sZW4pOworCW5ldHdvcmstPnJhdGVzX2V4X2xlbiA9IHByaXYtPnJhdGVzLm51bV9yYXRlcyAtIG5ldHdvcmstPnJhdGVzX2xlbjsKKwltZW1jcHkobmV0d29yay0+cmF0ZXNfZXgsCisJICAgICAgICZwcml2LT5yYXRlcy5zdXBwb3J0ZWRfcmF0ZXNbbmV0d29yay0+cmF0ZXNfbGVuXSwKKwkgICAgICAgbmV0d29yay0+cmF0ZXNfZXhfbGVuKTsKKwluZXR3b3JrLT5sYXN0X3NjYW5uZWQgPSAwOworCW5ldHdvcmstPmZsYWdzID0gMDsKKwluZXR3b3JrLT5sYXN0X2Fzc29jaWF0ZSA9IDA7CisJbmV0d29yay0+dGltZV9zdGFtcFswXSA9IDA7CisJbmV0d29yay0+dGltZV9zdGFtcFsxXSA9IDA7CisJbmV0d29yay0+YmVhY29uX2ludGVydmFsID0gMTAwOwkvKiBEZWZhdWx0ICovCisJbmV0d29yay0+bGlzdGVuX2ludGVydmFsID0gMTA7CS8qIERlZmF1bHQgKi8KKwluZXR3b3JrLT5hdGltX3dpbmRvdyA9IDA7CS8qIERlZmF1bHQgKi8KKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX1dQQQorCW5ldHdvcmstPndwYV9pZV9sZW4gPSAwOworCW5ldHdvcmstPnJzbl9pZV9sZW4gPSAwOworI2VuZGlmCQkJCS8qIENPTkZJR19JRUVFODAyMTFfV1BBICovCit9CisKK3N0YXRpYyB2b2lkIGlwd19zZW5kX3dlcF9rZXlzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgaXB3X3dlcF9rZXkgKmtleTsKKwlpbnQgaTsKKwlzdHJ1Y3QgaG9zdF9jbWQgY21kID0geworCQkuY21kID0gSVBXX0NNRF9XRVBfS0VZLAorCQkubGVuID0gc2l6ZW9mKCprZXkpCisJfTsKKworCWtleSA9IChzdHJ1Y3QgaXB3X3dlcF9rZXkgKikmY21kLnBhcmFtOworCWtleS0+Y21kX2lkID0gRElOT19DTURfV0VQX0tFWTsKKwlrZXktPnNlcV9udW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlrZXktPmtleV9pbmRleCA9IGk7CisJCWlmICghKHByaXYtPnNlYy5mbGFncyAmICgxIDw8IGkpKSkgeworCQkJa2V5LT5rZXlfc2l6ZSA9IDA7CisJCX0gZWxzZSB7CisJCQlrZXktPmtleV9zaXplID0gcHJpdi0+c2VjLmtleV9zaXplc1tpXTsKKwkJCW1lbWNweShrZXktPmtleSwgcHJpdi0+c2VjLmtleXNbaV0sIGtleS0+a2V5X3NpemUpOworCQl9CisKKwkJaWYgKGlwd19zZW5kX2NtZChwcml2LCAmY21kKSkgeworCQkJSVBXX0VSUk9SKCJmYWlsZWQgdG8gc2VuZCBXRVBfS0VZIGNvbW1hbmRcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpcHdfYWRob2NfY2hlY2sodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkYXRhOworCisJaWYgKHByaXYtPm1pc3NlZF9hZGhvY19iZWFjb25zKysgPiBwcml2LT5taXNzZWRfYmVhY29uX3RocmVzaG9sZCAmJgorCSAgICAhKHByaXYtPmNvbmZpZyAmIENGR19BREhPQ19QRVJTSVNUKSkgeworCQlJUFdfREVCVUdfU0NBTigiRGlzYXNzb2NpYXRpbmcgZHVlIHRvIG1pc3NlZCBiZWFjb25zXG4iKTsKKwkJaXB3X3JlbW92ZV9jdXJyZW50X25ldHdvcmsocHJpdik7CisJCWlwd19kaXNhc3NvY2lhdGUocHJpdik7CisJCXJldHVybjsKKwl9CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+YWRob2NfY2hlY2ssCisJCQkgICBwcml2LT5hc3NvY19yZXF1ZXN0LmJlYWNvbl9pbnRlcnZhbCk7Cit9CisKKyNpZmRlZiBDT05GSUdfSVBXX0RFQlVHCitzdGF0aWMgdm9pZCBpcHdfZGVidWdfY29uZmlnKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwlJUFdfREVCVUdfSU5GTygiU2NhbiBjb21wbGV0ZWQsIG5vIHZhbGlkIEFQcyBtYXRjaGVkICIKKwkJICAgICAgICJbQ0ZHIDB4JTA4WF1cbiIsIHByaXYtPmNvbmZpZyk7CisJaWYgKHByaXYtPmNvbmZpZyAmIENGR19TVEFUSUNfQ0hBTk5FTCkKKwkJSVBXX0RFQlVHX0lORk8oIkNoYW5uZWwgbG9ja2VkIHRvICVkXG4iLCBwcml2LT5jaGFubmVsKTsKKwllbHNlCisJCUlQV19ERUJVR19JTkZPKCJDaGFubmVsIHVubG9ja2VkLlxuIik7CisJaWYgKHByaXYtPmNvbmZpZyAmIENGR19TVEFUSUNfRVNTSUQpCisJCUlQV19ERUJVR19JTkZPKCJFU1NJRCBsb2NrZWQgdG8gJyVzJ1xuIiwKKwkJCSAgICAgICBlc2NhcGVfZXNzaWQocHJpdi0+ZXNzaWQsIHByaXYtPmVzc2lkX2xlbikpOworCWVsc2UKKwkJSVBXX0RFQlVHX0lORk8oIkVTU0lEIHVubG9ja2VkLlxuIik7CisJaWYgKHByaXYtPmNvbmZpZyAmIENGR19TVEFUSUNfQlNTSUQpCisJCUlQV19ERUJVR19JTkZPKCJCU1NJRCBsb2NrZWQgdG8gJWRcbiIsIHByaXYtPmNoYW5uZWwpOworCWVsc2UKKwkJSVBXX0RFQlVHX0lORk8oIkJTU0lEIHVubG9ja2VkLlxuIik7CisJaWYgKHByaXYtPmNhcGFiaWxpdHkgJiBDQVBfUFJJVkFDWV9PTikKKwkJSVBXX0RFQlVHX0lORk8oIlBSSVZBQ1kgb25cbiIpOworCWVsc2UKKwkJSVBXX0RFQlVHX0lORk8oIlBSSVZBQ1kgb2ZmXG4iKTsKKwlJUFdfREVCVUdfSU5GTygiUkFURSBNQVNLOiAweCUwOFhcbiIsIHByaXYtPnJhdGVzX21hc2spOworfQorI2Vsc2UKKyNkZWZpbmUgaXB3X2RlYnVnX2NvbmZpZyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgaXB3X3NldF9maXhlZF9yYXRlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCit7CisJLyogVE9ETzogVmVyaWZ5IHRoYXQgdGhpcyB3b3Jrcy4uLiAqLworCXN0cnVjdCBpcHdfZml4ZWRfcmF0ZSBmciA9IHsKKwkJLnR4X3JhdGVzID0gcHJpdi0+cmF0ZXNfbWFzaworCX07CisJdTMyIHJlZzsKKwl1MTYgbWFzayA9IDA7CisKKwkvKiBJZGVudGlmeSAnY3VycmVudCBGVyBiYW5kJyBhbmQgbWF0Y2ggaXQgd2l0aCB0aGUgZml4ZWQKKwkgKiBUeCByYXRlcyAqLworCisJc3dpdGNoIChwcml2LT5pZWVlLT5mcmVxX2JhbmQpIHsKKwljYXNlIElFRUU4MDIxMV81MkdIWl9CQU5EOgkvKiBBIG9ubHkgKi8KKwkJLyogSUVFRV9BICovCisJCWlmIChwcml2LT5yYXRlc19tYXNrICYgfklFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0spIHsKKwkJCS8qIEludmFsaWQgZml4ZWQgcmF0ZSBtYXNrICovCisJCQlmci50eF9yYXRlcyA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWZyLnR4X3JhdGVzID4+PSBJRUVFODAyMTFfT0ZETV9TSElGVF9NQVNLX0E7CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8qIDIuNEdoeiBvciBNaXhlZCAqLworCQkvKiBJRUVFX0IgKi8KKwkJaWYgKG5ldHdvcmstPm1vZGUgPT0gSUVFRV9CKSB7CisJCQlpZiAoZnIudHhfcmF0ZXMgJiB+SUVFRTgwMjExX0NDS19SQVRFU19NQVNLKSB7CisJCQkJLyogSW52YWxpZCBmaXhlZCByYXRlIG1hc2sgKi8KKwkJCQlmci50eF9yYXRlcyA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIElFRUVfRyAqLworCQlpZiAoZnIudHhfcmF0ZXMgJiB+KElFRUU4MDIxMV9DQ0tfUkFURVNfTUFTSyB8CisJCQkJICAgIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0spKSB7CisJCQkvKiBJbnZhbGlkIGZpeGVkIHJhdGUgbWFzayAqLworCQkJZnIudHhfcmF0ZXMgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyAmIGZyLnR4X3JhdGVzKSB7CisJCQltYXNrIHw9IChJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLID4+IDEpOworCQkJZnIudHhfcmF0ZXMgJj0gfklFRUU4MDIxMV9PRkRNX1JBVEVfNk1CX01BU0s7CisJCX0KKworCQlpZiAoSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSyAmIGZyLnR4X3JhdGVzKSB7CisJCQltYXNrIHw9IChJRUVFODAyMTFfT0ZETV9SQVRFXzlNQl9NQVNLID4+IDEpOworCQkJZnIudHhfcmF0ZXMgJj0gfklFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0s7CisJCX0KKworCQlpZiAoSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0sgJiBmci50eF9yYXRlcykgeworCQkJbWFzayB8PSAoSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0sgPj4gMSk7CisJCQlmci50eF9yYXRlcyAmPSB+SUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0s7CisJCX0KKworCQlmci50eF9yYXRlcyB8PSBtYXNrOworCQlicmVhazsKKwl9CisKKwlyZWcgPSBpcHdfcmVhZDMyKHByaXYsIElQV19NRU1fRklYRURfT1ZFUlJJREUpOworCWlwd193cml0ZV9yZWczMihwcml2LCByZWcsICoodTMyICopICYgZnIpOworfQorCitzdGF0aWMgaW50IGlwd19hc3NvY2lhdGVfbmV0d29yayhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKKwkJCQkgc3RydWN0IGlwd19zdXBwb3J0ZWRfcmF0ZXMgKnJhdGVzLCBpbnQgcm9hbWluZykKK3sKKwlpbnQgZXJyOworCisJaWYgKHByaXYtPmNvbmZpZyAmIENGR19GSVhFRF9SQVRFKQorCQlpcHdfc2V0X2ZpeGVkX3JhdGUocHJpdiwgbmV0d29yayk7CisKKwlpZiAoIShwcml2LT5jb25maWcgJiBDRkdfU1RBVElDX0VTU0lEKSkgeworCQlwcml2LT5lc3NpZF9sZW4gPSBtaW4obmV0d29yay0+c3NpZF9sZW4sCisJCQkJICAgICAgKHU4KSBJV19FU1NJRF9NQVhfU0laRSk7CisJCW1lbWNweShwcml2LT5lc3NpZCwgbmV0d29yay0+c3NpZCwgcHJpdi0+ZXNzaWRfbGVuKTsKKwl9CisKKwluZXR3b3JrLT5sYXN0X2Fzc29jaWF0ZSA9IGppZmZpZXM7CisKKwltZW1zZXQoJnByaXYtPmFzc29jX3JlcXVlc3QsIDAsIHNpemVvZihwcml2LT5hc3NvY19yZXF1ZXN0KSk7CisJcHJpdi0+YXNzb2NfcmVxdWVzdC5jaGFubmVsID0gbmV0d29yay0+Y2hhbm5lbDsKKwlpZiAoKHByaXYtPmNhcGFiaWxpdHkgJiBDQVBfUFJJVkFDWV9PTikgJiYKKwkgICAgKHByaXYtPmNhcGFiaWxpdHkgJiBDQVBfU0hBUkVEX0tFWSkpIHsKKwkJcHJpdi0+YXNzb2NfcmVxdWVzdC5hdXRoX3R5cGUgPSBBVVRIX1NIQVJFRF9LRVk7CisJCXByaXYtPmFzc29jX3JlcXVlc3QuYXV0aF9rZXkgPSBwcml2LT5zZWMuYWN0aXZlX2tleTsKKwl9IGVsc2UgeworCQlwcml2LT5hc3NvY19yZXF1ZXN0LmF1dGhfdHlwZSA9IEFVVEhfT1BFTjsKKwkJcHJpdi0+YXNzb2NfcmVxdWVzdC5hdXRoX2tleSA9IDA7CisJfQorCisJaWYgKHByaXYtPmNhcGFiaWxpdHkgJiBDQVBfUFJJVkFDWV9PTikKKwkJaXB3X3NlbmRfd2VwX2tleXMocHJpdik7CisKKwkvKgorCSAqIEl0IGlzIHZhbGlkIGZvciBvdXIgaWVlZSBkZXZpY2UgdG8gc3VwcG9ydCBtdWx0aXBsZSBtb2RlcywgYnV0CisJICogd2hlbiBpdCBjb21lcyB0byBhc3NvY2lhdGluZyB0byBhIGdpdmVuIG5ldHdvcmsgd2UgaGF2ZSB0byBjaG9vc2UKKwkgKiBqdXN0IG9uZSBtb2RlLgorCSAqLworCWlmIChuZXR3b3JrLT5tb2RlICYgcHJpdi0+aWVlZS0+bW9kZSAmIElFRUVfQSkKKwkJcHJpdi0+YXNzb2NfcmVxdWVzdC5pZWVlX21vZGUgPSBJUFdfQV9NT0RFOworCWVsc2UgaWYgKG5ldHdvcmstPm1vZGUgJiBwcml2LT5pZWVlLT5tb2RlICYgSUVFRV9HKQorCQlwcml2LT5hc3NvY19yZXF1ZXN0LmllZWVfbW9kZSA9IElQV19HX01PREU7CisJZWxzZSBpZiAobmV0d29yay0+bW9kZSAmIHByaXYtPmllZWUtPm1vZGUgJiBJRUVFX0IpCisJCXByaXYtPmFzc29jX3JlcXVlc3QuaWVlZV9tb2RlID0gSVBXX0JfTU9ERTsKKworCUlQV19ERUJVR19BU1NPQygiJXNzc29jYXRpb24gYXR0ZW1wdDogJyVzJywgY2hhbm5lbCAlZCwgIgorCQkJIjgwMi4xMSVjIFslZF0sIGVuYz0lcyVzJXMlYyVjXG4iLAorCQkJcm9hbWluZyA/ICJSZWEiIDogIkEiLAorCQkJZXNjYXBlX2Vzc2lkKHByaXYtPmVzc2lkLCBwcml2LT5lc3NpZF9sZW4pLAorCQkJbmV0d29yay0+Y2hhbm5lbCwKKwkJCWlwd19tb2Rlc1twcml2LT5hc3NvY19yZXF1ZXN0LmllZWVfbW9kZV0sCisJCQlyYXRlcy0+bnVtX3JhdGVzLAorCQkJcHJpdi0+Y2FwYWJpbGl0eSAmIENBUF9QUklWQUNZX09OID8gIm9uICIgOiAib2ZmIiwKKwkJCXByaXYtPmNhcGFiaWxpdHkgJiBDQVBfUFJJVkFDWV9PTiA/CisJCQkocHJpdi0+Y2FwYWJpbGl0eSAmIENBUF9TSEFSRURfS0VZID8gIihzaGFyZWQpIiA6CisJCQkgIihvcGVuKSIpIDogIiIsCisJCQlwcml2LT5jYXBhYmlsaXR5ICYgQ0FQX1BSSVZBQ1lfT04gPyAiIGtleT0iIDogIiIsCisJCQlwcml2LT5jYXBhYmlsaXR5ICYgQ0FQX1BSSVZBQ1lfT04gPworCQkJJzEnICsgcHJpdi0+c2VjLmFjdGl2ZV9rZXkgOiAnLicsCisJCQlwcml2LT5jYXBhYmlsaXR5ICYgQ0FQX1BSSVZBQ1lfT04gPyAnLicgOiAnICcpOworCisJcHJpdi0+YXNzb2NfcmVxdWVzdC5iZWFjb25faW50ZXJ2YWwgPSBuZXR3b3JrLT5iZWFjb25faW50ZXJ2YWw7CisJaWYgKChwcml2LT5pZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpICYmCisJICAgIChuZXR3b3JrLT50aW1lX3N0YW1wWzBdID09IDApICYmIChuZXR3b3JrLT50aW1lX3N0YW1wWzFdID09IDApKSB7CisJCXByaXYtPmFzc29jX3JlcXVlc3QuYXNzb2NfdHlwZSA9IEhDX0lCU1NfU1RBUlQ7CisJCXByaXYtPmFzc29jX3JlcXVlc3QuYXNzb2NfdHNmX21zdyA9IDA7CisJCXByaXYtPmFzc29jX3JlcXVlc3QuYXNzb2NfdHNmX2xzdyA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHVubGlrZWx5KHJvYW1pbmcpKQorCQkJcHJpdi0+YXNzb2NfcmVxdWVzdC5hc3NvY190eXBlID0gSENfUkVBU1NPQ0lBVEU7CisJCWVsc2UKKwkJCXByaXYtPmFzc29jX3JlcXVlc3QuYXNzb2NfdHlwZSA9IEhDX0FTU09DSUFURTsKKwkJcHJpdi0+YXNzb2NfcmVxdWVzdC5hc3NvY190c2ZfbXN3ID0gbmV0d29yay0+dGltZV9zdGFtcFsxXTsKKwkJcHJpdi0+YXNzb2NfcmVxdWVzdC5hc3NvY190c2ZfbHN3ID0gbmV0d29yay0+dGltZV9zdGFtcFswXTsKKwl9CisKKwltZW1jcHkoJnByaXYtPmFzc29jX3JlcXVlc3QuYnNzaWQsIG5ldHdvcmstPmJzc2lkLCBFVEhfQUxFTik7CisKKwlpZiAocHJpdi0+aWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCW1lbXNldCgmcHJpdi0+YXNzb2NfcmVxdWVzdC5kZXN0LCAweEZGLCBFVEhfQUxFTik7CisJCXByaXYtPmFzc29jX3JlcXVlc3QuYXRpbV93aW5kb3cgPSBuZXR3b3JrLT5hdGltX3dpbmRvdzsKKwl9IGVsc2UgeworCQltZW1jcHkoJnByaXYtPmFzc29jX3JlcXVlc3QuZGVzdCwgbmV0d29yay0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJcHJpdi0+YXNzb2NfcmVxdWVzdC5hdGltX3dpbmRvdyA9IDA7CisJfQorCisJcHJpdi0+YXNzb2NfcmVxdWVzdC5jYXBhYmlsaXR5ID0gbmV0d29yay0+Y2FwYWJpbGl0eTsKKwlwcml2LT5hc3NvY19yZXF1ZXN0Lmxpc3Rlbl9pbnRlcnZhbCA9IG5ldHdvcmstPmxpc3Rlbl9pbnRlcnZhbDsKKworCWVyciA9IGlwd19zZW5kX3NzaWQocHJpdiwgcHJpdi0+ZXNzaWQsIHByaXYtPmVzc2lkX2xlbik7CisJaWYgKGVycikgeworCQlJUFdfREVCVUdfSEMoIkF0dGVtcHQgdG8gc2VuZCBTU0lEIGNvbW1hbmQgZmFpbGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmF0ZXMtPmllZWVfbW9kZSA9IHByaXYtPmFzc29jX3JlcXVlc3QuaWVlZV9tb2RlOworCXJhdGVzLT5wdXJwb3NlID0gSVBXX1JBVEVfQ09OTkVDVDsKKwlpcHdfc2VuZF9zdXBwb3J0ZWRfcmF0ZXMocHJpdiwgcmF0ZXMpOworCisJaWYgKHByaXYtPmFzc29jX3JlcXVlc3QuaWVlZV9tb2RlID09IElQV19HX01PREUpCisJCXByaXYtPnN5c19jb25maWcuZG90MTFnX2F1dG9fZGV0ZWN0aW9uID0gMTsKKwllbHNlCisJCXByaXYtPnN5c19jb25maWcuZG90MTFnX2F1dG9fZGV0ZWN0aW9uID0gMDsKKwllcnIgPSBpcHdfc2VuZF9zeXN0ZW1fY29uZmlnKHByaXYsICZwcml2LT5zeXNfY29uZmlnKTsKKwlpZiAoZXJyKSB7CisJCUlQV19ERUJVR19IQygiQXR0ZW1wdCB0byBzZW5kIHN5cyBjb25maWcgY29tbWFuZCBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlJUFdfREVCVUdfQVNTT0MoIkFzc29jaWF0aW9uIHNlbnNpdGl2aXR5OiAlZFxuIiwgbmV0d29yay0+c3RhdHMucnNzaSk7CisJZXJyID0gaXB3X3NldF9zZW5zaXRpdml0eShwcml2LCBuZXR3b3JrLT5zdGF0cy5yc3NpKTsKKwlpZiAoZXJyKSB7CisJCUlQV19ERUJVR19IQygiQXR0ZW1wdCB0byBzZW5kIGFzc29jaWF0ZSBjb21tYW5kIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogSWYgcHJlZW1wdGlvbiBpcyBlbmFibGVkLCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGFzc29jaWF0aW9uCisJICogdG8gY29tcGxldGUgYmVmb3JlIHdlIHJldHVybiBmcm9tIGlwd19zZW5kX2Fzc29jaWF0ZS4gIFRoZXJlZm9yZQorCSAqIHdlIGhhdmUgdG8gYmUgc3VyZSBhbmQgdXBkYXRlIG91ciBwcml2aWF0ZSBkYXRhIGZpcnN0LgorCSAqLworCXByaXYtPmNoYW5uZWwgPSBuZXR3b3JrLT5jaGFubmVsOworCW1lbWNweShwcml2LT5ic3NpZCwgbmV0d29yay0+YnNzaWQsIEVUSF9BTEVOKTsKKwlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX0FTU09DSUFUSU5HOworCXByaXYtPnN0YXR1cyAmPSB+U1RBVFVTX1NFQ1VSSVRZX1VQREFURUQ7CisKKwlwcml2LT5hc3NvY19uZXR3b3JrID0gbmV0d29yazsKKworCWVyciA9IGlwd19zZW5kX2Fzc29jaWF0ZShwcml2LCAmcHJpdi0+YXNzb2NfcmVxdWVzdCk7CisJaWYgKGVycikgeworCQlJUFdfREVCVUdfSEMoIkF0dGVtcHQgdG8gc2VuZCBhc3NvY2lhdGUgY29tbWFuZCBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlJUFdfREVCVUcoSVBXX0RMX1NUQVRFLCAiYXNzb2NpYXRpbmc6ICclcycgIiBNQUNfRk1UICIgXG4iLAorCQkgIGVzY2FwZV9lc3NpZChwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfbGVuKSwKKwkJICBNQUNfQVJHKHByaXYtPmJzc2lkKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXB3X3JvYW0odm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yayA9IE5VTEw7CisJc3RydWN0IGlwd19uZXR3b3JrX21hdGNoIG1hdGNoID0geworCQkubmV0d29yayA9IHByaXYtPmFzc29jX25ldHdvcmsKKwl9OworCisJLyogVGhlIHJvYW1pbmcgcHJvY2VzcyBpcyBhcyBmb2xsb3dzOgorCSAqCisJICogMS4gIE1pc3NlZCBiZWFjb24gdGhyZXNob2xkIHRyaWdnZXJzIHRoZSByb2FtaW5nIHByb2Nlc3MgYnkKKwkgKiAgICAgc2V0dGluZyB0aGUgc3RhdHVzIFJPQU0gYml0IGFuZCByZXF1ZXN0aW5nIGEgc2Nhbi4KKwkgKiAyLiAgV2hlbiB0aGUgc2NhbiBjb21wbGV0ZXMsIGl0IHNjaGVkdWxlcyB0aGUgUk9BTSB3b3JrCisJICogMy4gIFRoZSBST0FNIHdvcmsgbG9va3MgYXQgYWxsIG9mIHRoZSBrbm93biBuZXR3b3JrcyBmb3Igb25lIHRoYXQKKwkgKiAgICAgaXMgYSBiZXR0ZXIgbmV0d29yayB0aGFuIHRoZSBjdXJyZW50bHkgYXNzb2NpYXRlZC4gIElmIG5vbmUKKwkgKiAgICAgZm91bmQsIHRoZSBST0FNIHByb2Nlc3MgaXMgb3ZlciAoUk9BTSBiaXQgY2xlYXJlZCkKKwkgKiA0LiAgSWYgYSBiZXR0ZXIgbmV0d29yayBpcyBmb3VuZCwgYSBkaXNhc3NvY2lhdGlvbiByZXF1ZXN0IGlzCisJICogICAgIHNlbnQuCisJICogNS4gIFdoZW4gdGhlIGRpc2Fzc29jaWF0aW9uIGNvbXBsZXRlcywgdGhlIHJvYW0gd29yayBpcyBhZ2FpbgorCSAqICAgICBzY2hlZHVsZWQuICBUaGUgc2Vjb25kIHRpbWUgdGhyb3VnaCwgdGhlIGRyaXZlciBpcyBubyBsb25nZXIKKwkgKiAgICAgYXNzb2NpYXRlZCwgYW5kIHRoZSBuZXdseSBzZWxlY3RlZCBuZXR3b3JrIGlzIHNlbnQgYW4KKwkgKiAgICAgYXNzb2NpYXRpb24gcmVxdWVzdC4KKwkgKiA2LiAgQXQgdGhpcyBwb2ludCAsdGhlIHJvYW1pbmcgcHJvY2VzcyBpcyBjb21wbGV0ZSBhbmQgdGhlIFJPQU0KKwkgKiAgICAgc3RhdHVzIGJpdCBpcyBjbGVhcmVkLgorCSAqLworCisJLyogSWYgd2UgYXJlIG5vIGxvbmdlciBhc3NvY2lhdGVkLCBhbmQgdGhlIHJvYW1pbmcgYml0IGlzIG5vIGxvbmdlcgorCSAqIHNldCwgdGhlbiB3ZSBhcmUgbm90IGFjdGl2ZWx5IHJvYW1pbmcsIHNvIGp1c3QgcmV0dXJuICovCisJaWYgKCEocHJpdi0+c3RhdHVzICYgKFNUQVRVU19BU1NPQ0lBVEVEIHwgU1RBVFVTX1JPQU1JTkcpKSkKKwkJcmV0dXJuOworCisJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKSB7CisJCS8qIEZpcnN0IHBhc3MgdGhyb3VnaCBST0FNIHByb2Nlc3MgLS0gbG9vayBmb3IgYSBiZXR0ZXIKKwkJICogbmV0d29yayAqLworCQl1OCByc3NpID0gcHJpdi0+YXNzb2NfbmV0d29yay0+c3RhdHMucnNzaTsKKwkJcHJpdi0+YXNzb2NfbmV0d29yay0+c3RhdHMucnNzaSA9IC0xMjg7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobmV0d29yaywgJnByaXYtPmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCQkJaWYgKG5ldHdvcmsgIT0gcHJpdi0+YXNzb2NfbmV0d29yaykKKwkJCQlpcHdfYmVzdF9uZXR3b3JrKHByaXYsICZtYXRjaCwgbmV0d29yaywgMSk7CisJCX0KKwkJcHJpdi0+YXNzb2NfbmV0d29yay0+c3RhdHMucnNzaSA9IHJzc2k7CisKKwkJaWYgKG1hdGNoLm5ldHdvcmsgPT0gcHJpdi0+YXNzb2NfbmV0d29yaykgeworCQkJSVBXX0RFQlVHX0FTU09DKCJObyBiZXR0ZXIgQVBzIGluIHRoaXMgbmV0d29yayB0byAiCisJCQkJCSJyb2FtIHRvLlxuIik7CisJCQlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19ST0FNSU5HOworCQkJaXB3X2RlYnVnX2NvbmZpZyhwcml2KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlwd19zZW5kX2Rpc2Fzc29jaWF0ZShwcml2LCAxKTsKKwkJcHJpdi0+YXNzb2NfbmV0d29yayA9IG1hdGNoLm5ldHdvcms7CisKKwkJcmV0dXJuOworCX0KKworCS8qIFNlY29uZCBwYXNzIHRocm91Z2ggUk9BTSBwcm9jZXNzIC0tIHJlcXVlc3QgYXNzb2NpYXRpb24gKi8KKwlpcHdfY29tcGF0aWJsZV9yYXRlcyhwcml2LCBwcml2LT5hc3NvY19uZXR3b3JrLCAmbWF0Y2gucmF0ZXMpOworCWlwd19hc3NvY2lhdGVfbmV0d29yayhwcml2LCBwcml2LT5hc3NvY19uZXR3b3JrLCAmbWF0Y2gucmF0ZXMsIDEpOworCXByaXYtPnN0YXR1cyAmPSB+U1RBVFVTX1JPQU1JTkc7Cit9CisKK3N0YXRpYyB2b2lkIGlwd19hc3NvY2lhdGUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkYXRhOworCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrID0gTlVMTDsKKwlzdHJ1Y3QgaXB3X25ldHdvcmtfbWF0Y2ggbWF0Y2ggPSB7CisJCS5uZXR3b3JrID0gTlVMTAorCX07CisJc3RydWN0IGlwd19zdXBwb3J0ZWRfcmF0ZXMgKnJhdGVzOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisKKwlpZiAoIShwcml2LT5jb25maWcgJiBDRkdfQVNTT0NJQVRFKSAmJgorCSAgICAhKHByaXYtPmNvbmZpZyAmIChDRkdfU1RBVElDX0VTU0lEIHwKKwkJCSAgICAgIENGR19TVEFUSUNfQ0hBTk5FTCB8IENGR19TVEFUSUNfQlNTSUQpKSkgeworCQlJUFdfREVCVUdfQVNTT0MoIk5vdCBhdHRlbXB0aW5nIGFzc29jaWF0aW9uIChhc3NvY2lhdGU9MClcbiIpOworCQlyZXR1cm47CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShuZXR3b3JrLCAmcHJpdi0+aWVlZS0+bmV0d29ya19saXN0LCBsaXN0KQorCSAgICBpcHdfYmVzdF9uZXR3b3JrKHByaXYsICZtYXRjaCwgbmV0d29yaywgMCk7CisKKwluZXR3b3JrID0gbWF0Y2gubmV0d29yazsKKwlyYXRlcyA9ICZtYXRjaC5yYXRlczsKKworCWlmIChuZXR3b3JrID09IE5VTEwgJiYKKwkgICAgcHJpdi0+aWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DICYmCisJICAgIHByaXYtPmNvbmZpZyAmIENGR19BREhPQ19DUkVBVEUgJiYKKwkgICAgcHJpdi0+Y29uZmlnICYgQ0ZHX1NUQVRJQ19FU1NJRCAmJgorCSAgICAhbGlzdF9lbXB0eSgmcHJpdi0+aWVlZS0+bmV0d29ya19mcmVlX2xpc3QpKSB7CisJCWVsZW1lbnQgPSBwcml2LT5pZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdC5uZXh0OworCQluZXR3b3JrID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmssIGxpc3QpOworCQlpcHdfYWRob2NfY3JlYXRlKHByaXYsIG5ldHdvcmspOworCQlyYXRlcyA9ICZwcml2LT5yYXRlczsKKwkJbGlzdF9kZWwoZWxlbWVudCk7CisJCWxpc3RfYWRkX3RhaWwoJm5ldHdvcmstPmxpc3QsICZwcml2LT5pZWVlLT5uZXR3b3JrX2xpc3QpOworCX0KKworCS8qIElmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhlbiB3ZSBkb24ndCBoYXZlIGFueSB2YWxpZAorCSAqIG1hdGNoaW5nIEFQcyAqLworCWlmICghbmV0d29yaykgeworCQlpcHdfZGVidWdfY29uZmlnKHByaXYpOworCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZXF1ZXN0X3NjYW4sCisJCQkJICAgU0NBTl9JTlRFUlZBTCk7CisKKwkJcmV0dXJuOworCX0KKworCWlwd19hc3NvY2lhdGVfbmV0d29yayhwcml2LCBuZXR3b3JrLCByYXRlcywgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHdfaGFuZGxlX2RhdGFfcGFja2V0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKKwkJCQkJICBzdHJ1Y3QgaXB3X3J4X21lbV9idWZmZXIgKnJ4YiwKKwkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKwlzdHJ1Y3QgaXB3X3J4X3BhY2tldCAqcGt0ID0gKHN0cnVjdCBpcHdfcnhfcGFja2V0ICopcnhiLT5za2ItPmRhdGE7CisKKwkvKiBXZSByZWNlaXZlZCBkYXRhIGZyb20gdGhlIEhXLCBzbyBzdG9wIHRoZSB3YXRjaGRvZyAqLworCXByaXYtPm5ldF9kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIFdlIG9ubHkgcHJvY2VzcyBkYXRhIHBhY2tldHMgaWYgdGhlCisJICogaW50ZXJmYWNlIGlzIG9wZW4gKi8KKwlpZiAodW5saWtlbHkoKHBrdC0+dS5mcmFtZS5sZW5ndGggKyBJUFdfUlhfRlJBTUVfU0laRSkgPgorCQkgICAgIHNrYl90YWlscm9vbShyeGItPnNrYikpKSB7CisJCXByaXYtPmllZWUtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlwcml2LT53c3RhdHMuZGlzY2FyZC5taXNjKys7CisJCUlQV19ERUJVR19EUk9QKCJDb3JydXB0aW9uIGRldGVjdGVkISBPaCBubyFcbiIpOworCQlyZXR1cm47CisJfSBlbHNlIGlmICh1bmxpa2VseSghbmV0aWZfcnVubmluZyhwcml2LT5uZXRfZGV2KSkpIHsKKwkJcHJpdi0+aWVlZS0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlwcml2LT53c3RhdHMuZGlzY2FyZC5taXNjKys7CisJCUlQV19ERUJVR19EUk9QKCJEcm9wcGluZyBwYWNrZXQgd2hpbGUgaW50ZXJmYWNlIGlzIG5vdCB1cC5cbiIpOworCQlyZXR1cm47CisJfQorCisJLyogQWR2YW5jZSBza2ItPmRhdGEgdG8gdGhlIHN0YXJ0IG9mIHRoZSBhY3R1YWwgcGF5bG9hZCAqLworCXNrYl9yZXNlcnZlKHJ4Yi0+c2tiLCBvZmZzZXRvZihzdHJ1Y3QgaXB3X3J4X3BhY2tldCwgdS5mcmFtZS5kYXRhKSk7CisKKwkvKiBTZXQgdGhlIHNpemUgb2YgdGhlIHNrYiB0byB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgKi8KKwlza2JfcHV0KHJ4Yi0+c2tiLCBwa3QtPnUuZnJhbWUubGVuZ3RoKTsKKworCUlQV19ERUJVR19SWCgiUnggcGFja2V0IG9mICVkIGJ5dGVzLlxuIiwgcnhiLT5za2ItPmxlbik7CisKKwlpZiAoIWllZWU4MDIxMV9yeChwcml2LT5pZWVlLCByeGItPnNrYiwgc3RhdHMpKQorCQlwcml2LT5pZWVlLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwllbHNlCQkJLyogaWVlZTgwMjExX3J4IHN1Y2NlZWRlZCwgc28gaXQgbm93IG93bnMgdGhlIFNLQiAqLworCQlyeGItPnNrYiA9IE5VTEw7Cit9CisKKy8qCisgKiBNYWluIGVudHJ5IGZ1bmN0aW9uIGZvciByZWNpZXZpbmcgYSBwYWNrZXQgd2l0aCA4MDIxMSBoZWFkZXJzLiAgVGhpcworICogc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGV2ZXIgdGhlIEZXIGhhcyBub3RpZmllZCB1cyB0aGF0IHRoZXJlIGlzIGEgbmV3CisgKiBza2IgaW4gdGhlIHJlY2lldmUgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIGlwd19yeChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCit7CisJc3RydWN0IGlwd19yeF9tZW1fYnVmZmVyICpyeGI7CisJc3RydWN0IGlwd19yeF9wYWNrZXQgKnBrdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyOworCXUzMiByLCB3LCBpOworCXU4IG5ldHdvcmtfcGFja2V0OworCisJciA9IGlwd19yZWFkMzIocHJpdiwgQ1gyX1JYX1JFQURfSU5ERVgpOworCXcgPSBpcHdfcmVhZDMyKHByaXYsIENYMl9SWF9XUklURV9JTkRFWCk7CisJaSA9IChwcml2LT5yeHEtPnByb2Nlc3NlZCArIDEpICUgUlhfUVVFVUVfU0laRTsKKworCXdoaWxlIChpICE9IHIpIHsKKwkJcnhiID0gcHJpdi0+cnhxLT5xdWV1ZVtpXTsKKyNpZmRlZiBDT05GSUdfSVBXX0RFQlVHCisJCWlmICh1bmxpa2VseShyeGIgPT0gTlVMTCkpIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgIlF1ZXVlIG5vdCBhbGxvY2F0ZWQhXG4iKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJcHJpdi0+cnhxLT5xdWV1ZVtpXSA9IE5VTEw7CisKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHByaXYtPnBjaV9kZXYsIHJ4Yi0+ZG1hX2FkZHIsCisJCQkJCSAgICBDWDJfUlhfQlVGX1NJWkUsCisJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCXBrdCA9IChzdHJ1Y3QgaXB3X3J4X3BhY2tldCAqKXJ4Yi0+c2tiLT5kYXRhOworCQlJUFdfREVCVUdfUlgoIlBhY2tldDogdHlwZT0lMDJYIHNlcT0lMDJYIGJpdHM9JTAyWFxuIiwKKwkJCSAgICAgcGt0LT5oZWFkZXIubWVzc2FnZV90eXBlLAorCQkJICAgICBwa3QtPmhlYWRlci5yeF9zZXFfbnVtLCBwa3QtPmhlYWRlci5jb250cm9sX2JpdHMpOworCisJCXN3aXRjaCAocGt0LT5oZWFkZXIubWVzc2FnZV90eXBlKSB7CisJCWNhc2UgUlhfRlJBTUVfVFlQRToJLyogODAyLjExIGZyYW1lICovICB7CisJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyBzdGF0cyA9IHsKKwkJCQkJLnJzc2kgPSBwa3QtPnUuZnJhbWUucnNzaV9kYm0gLQorCQkJCQkgICAgSVBXX1JTU0lfVE9fREJNLAorCQkJCQkuc2lnbmFsID0gcGt0LT51LmZyYW1lLnNpZ25hbCwKKwkJCQkJLnJhdGUgPSBwa3QtPnUuZnJhbWUucmF0ZSwKKwkJCQkJLm1hY190aW1lID0gamlmZmllcywKKwkJCQkJLnJlY2VpdmVkX2NoYW5uZWwgPQorCQkJCQkgICAgcGt0LT51LmZyYW1lLnJlY2VpdmVkX2NoYW5uZWwsCisJCQkJCS5mcmVxID0KKwkJCQkJICAgIChwa3QtPnUuZnJhbWUuCisJCQkJCSAgICAgY29udHJvbCAmICgxIDw8IDApKSA/CisJCQkJCSAgICBJRUVFODAyMTFfMjRHSFpfQkFORCA6CisJCQkJCSAgICBJRUVFODAyMTFfNTJHSFpfQkFORCwKKwkJCQkJLmxlbiA9IHBrdC0+dS5mcmFtZS5sZW5ndGgsCisJCQkJfTsKKworCQkJCWlmIChzdGF0cy5yc3NpICE9IDApCisJCQkJCXN0YXRzLm1hc2sgfD0gSUVFRTgwMjExX1NUQVRNQVNLX1JTU0k7CisJCQkJaWYgKHN0YXRzLnNpZ25hbCAhPSAwKQorCQkJCQlzdGF0cy5tYXNrIHw9IElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUw7CisJCQkJaWYgKHN0YXRzLnJhdGUgIT0gMCkKKwkJCQkJc3RhdHMubWFzayB8PSBJRUVFODAyMTFfU1RBVE1BU0tfUkFURTsKKworCQkJCXByaXYtPnJ4X3BhY2tldHMrKzsKKworI2lmZGVmIENPTkZJR19JUFdfUFJPTUlTQworCQkJCWlmIChwcml2LT5pZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgeworCQkJCQlpcHdfaGFuZGxlX2RhdGFfcGFja2V0KHByaXYsIHJ4YiwKKwkJCQkJCQkgICAgICAgJnN0YXRzKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorI2VuZGlmCisKKwkJCQloZWFkZXIgPQorCQkJCSAgICAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikocnhiLT5za2ItPmRhdGEgKworCQkJCQkJCSAgICAgSVBXX1JYX0ZSQU1FX1NJWkUpOworCQkJCS8qIFRPRE86IENoZWNrIEFkLUhvYyBkZXN0L3NvdXJjZSBhbmQgbWFrZSBzdXJlCisJCQkJICogdGhhdCB3ZSBhcmUgYWN0dWFsbHkgcGFyc2luZyB0aGVzZSBwYWNrZXRzCisJCQkJICogY29ycmVjdGx5IC0tIHdlIHNob3VsZCBwcm9iYWJseSB1c2UgdGhlCisJCQkJICogZnJhbWUgY29udHJvbCBvZiB0aGUgcGFja2V0IGFuZCBkaXNyZWdhcmQKKwkJCQkgKiB0aGUgY3VycmVudCBpd19tb2RlICovCisJCQkJc3dpdGNoIChwcml2LT5pZWVlLT5pd19tb2RlKSB7CisJCQkJY2FzZSBJV19NT0RFX0FESE9DOgorCQkJCQluZXR3b3JrX3BhY2tldCA9CisJCQkJCSAgICAhbWVtY21wKGhlYWRlci0+YWRkcjEsCisJCQkJCQkgICAgcHJpdi0+bmV0X2Rldi0+ZGV2X2FkZHIsCisJCQkJCQkgICAgRVRIX0FMRU4pIHx8CisJCQkJCSAgICAhbWVtY21wKGhlYWRlci0+YWRkcjMsCisJCQkJCQkgICAgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKSB8fAorCQkJCQkgICAgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT4KKwkJCQkJCQkJICAgIGFkZHIxKQorCQkJCQkgICAgfHwgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT4KKwkJCQkJCQkJICAgICAgIGFkZHIxKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIElXX01PREVfSU5GUkE6CisJCQkJZGVmYXVsdDoKKwkJCQkJbmV0d29ya19wYWNrZXQgPQorCQkJCQkgICAgIW1lbWNtcChoZWFkZXItPmFkZHIzLAorCQkJCQkJICAgIHByaXYtPmJzc2lkLCBFVEhfQUxFTikgfHwKKwkJCQkJICAgICFtZW1jbXAoaGVhZGVyLT5hZGRyMSwKKwkJCQkJCSAgICBwcml2LT5uZXRfZGV2LT5kZXZfYWRkciwKKwkJCQkJCSAgICBFVEhfQUxFTikgfHwKKwkJCQkJICAgIGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhlYWRlci0+CisJCQkJCQkJCSAgICBhZGRyMSkKKwkJCQkJICAgIHx8IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci0+CisJCQkJCQkJCSAgICAgICBhZGRyMSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChuZXR3b3JrX3BhY2tldCAmJiBwcml2LT5hc3NvY19uZXR3b3JrKSB7CisJCQkJCXByaXYtPmFzc29jX25ldHdvcmstPnN0YXRzLnJzc2kgPQorCQkJCQkgICAgc3RhdHMucnNzaTsKKwkJCQkJYXZlcmFnZV9hZGQoJnByaXYtPmF2ZXJhZ2VfcnNzaSwKKwkJCQkJCSAgICBzdGF0cy5yc3NpKTsKKwkJCQkJcHJpdi0+bGFzdF9yeF9yc3NpID0gc3RhdHMucnNzaTsKKwkJCQl9CisKKwkJCQlJUFdfREVCVUdfUlgoIkZyYW1lOiBsZW49JXVcbiIsCisJCQkJCSAgICAgcGt0LT51LmZyYW1lLmxlbmd0aCk7CisKKwkJCQlpZiAocGt0LT51LmZyYW1lLmxlbmd0aCA8IGZyYW1lX2hkcl9sZW4oaGVhZGVyKSkgeworCQkJCQlJUFdfREVCVUdfRFJPUAorCQkJCQkgICAgKCJSZWNlaXZlZCBwYWNrZXQgaXMgdG9vIHNtYWxsLiAiCisJCQkJCSAgICAgIkRyb3BwaW5nLlxuIik7CisJCQkJCXByaXYtPmllZWUtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlwcml2LT53c3RhdHMuZGlzY2FyZC5taXNjKys7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXN3aXRjaCAoV0xBTl9GQ19HRVRfVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpIHsKKwkJCQljYXNlIElFRUU4MDIxMV9GVFlQRV9NR01UOgorCQkJCQlpZWVlODAyMTFfcnhfbWd0KHByaXYtPmllZWUsIGhlYWRlciwKKwkJCQkJCQkgJnN0YXRzKTsKKwkJCQkJaWYgKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQworCQkJCQkgICAgJiYKKwkJCQkJICAgICgoV0xBTl9GQ19HRVRfU1RZUEUKKwkJCQkJICAgICAgKGhlYWRlci0+ZnJhbWVfY3RsKSA9PQorCQkJCQkgICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCkKKwkJCQkJICAgICB8fAorCQkJCQkgICAgIChXTEFOX0ZDX0dFVF9TVFlQRQorCQkJCQkgICAgICAoaGVhZGVyLT5mcmFtZV9jdGwpID09CisJCQkJCSAgICAgIElFRUU4MDIxMV9TVFlQRV9CRUFDT04pKQorCQkJCQkgICAgJiYgIW1lbWNtcChoZWFkZXItPmFkZHIzLAorCQkJCQkJICAgICAgIHByaXYtPmJzc2lkLCBFVEhfQUxFTikpCisJCQkJCQlpcHdfYWRkX3N0YXRpb24ocHJpdiwKKwkJCQkJCQkJaGVhZGVyLT5hZGRyMik7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgorCQkJCQlicmVhazsKKworCQkJCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6CisJCQkJCWlmIChuZXR3b3JrX3BhY2tldCkKKwkJCQkJCWlwd19oYW5kbGVfZGF0YV9wYWNrZXQocHJpdiwKKwkJCQkJCQkJICAgICAgIHJ4YiwKKwkJCQkJCQkJICAgICAgICZzdGF0cyk7CisJCQkJCWVsc2UKKwkJCQkJCUlQV19ERUJVR19EUk9QKCJEcm9wcGluZzogIgorCQkJCQkJCSAgICAgICBNQUNfRk1UICIsICIKKwkJCQkJCQkgICAgICAgTUFDX0ZNVCAiLCAiCisJCQkJCQkJICAgICAgIE1BQ19GTVQgIlxuIiwKKwkJCQkJCQkgICAgICAgTUFDX0FSRyhoZWFkZXItPgorCQkJCQkJCQkgICAgICAgYWRkcjEpLAorCQkJCQkJCSAgICAgICBNQUNfQVJHKGhlYWRlci0+CisJCQkJCQkJCSAgICAgICBhZGRyMiksCisJCQkJCQkJICAgICAgIE1BQ19BUkcoaGVhZGVyLT4KKwkJCQkJCQkJICAgICAgIGFkZHIzKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIFJYX0hPU1RfTk9USUZJQ0FUSU9OX1RZUEU6eworCQkJCUlQV19ERUJVR19SWAorCQkJCSAgICAoIk5vdGlmaWNhdGlvbjogc3VidHlwZT0lMDJYIGZsYWdzPSUwMlggc2l6ZT0lZFxuIiwKKwkJCQkgICAgIHBrdC0+dS5ub3RpZmljYXRpb24uc3VidHlwZSwKKwkJCQkgICAgIHBrdC0+dS5ub3RpZmljYXRpb24uZmxhZ3MsCisJCQkJICAgICBwa3QtPnUubm90aWZpY2F0aW9uLnNpemUpOworCQkJCWlwd19yeF9ub3RpZmljYXRpb24ocHJpdiwgJnBrdC0+dS5ub3RpZmljYXRpb24pOworCQkJCWJyZWFrOworCQkJfQorCisJCWRlZmF1bHQ6CisJCQlJUFdfREVCVUdfUlgoIkJhZCBSeCBwYWNrZXQgb2YgdHlwZSAlZFxuIiwKKwkJCQkgICAgIHBrdC0+aGVhZGVyLm1lc3NhZ2VfdHlwZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIEZvciBub3cgd2UganVzdCBkb24ndCByZS11c2UgYW55dGhpbmcuICBXZSBjYW4gdHdlYWsgdGhpcworCQkgKiBsYXRlciB0byB0cnkgYW5kIHJlLXVzZSBub3RpZmljYXRpb24gcGFja2V0cyBhbmQgU0tCcyB0aGF0CisJCSAqIGZhaWwgdG8gUnggY29ycmVjdGx5ICovCisJCWlmIChyeGItPnNrYiAhPSBOVUxMKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShyeGItPnNrYik7CisJCQlyeGItPnNrYiA9IE5VTEw7CisJCX0KKworCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsIHJ4Yi0+ZG1hX2FkZHIsCisJCQkJIENYMl9SWF9CVUZfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJbGlzdF9hZGRfdGFpbCgmcnhiLT5saXN0LCAmcHJpdi0+cnhxLT5yeF91c2VkKTsKKworCQlpID0gKGkgKyAxKSAlIFJYX1FVRVVFX1NJWkU7CisJfQorCisJLyogQmFja3RyYWNrIG9uZSBlbnRyeSAqLworCXByaXYtPnJ4cS0+cHJvY2Vzc2VkID0gKGkgPyBpIDogUlhfUVVFVUVfU0laRSkgLSAxOworCisJaXB3X3J4X3F1ZXVlX3Jlc3RvY2socHJpdik7Cit9CisKK3N0YXRpYyB2b2lkIGlwd19hYm9ydF9zY2FuKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwlpbnQgZXJyOworCisJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19TQ0FOX0FCT1JUSU5HKSB7CisJCUlQV19ERUJVR19IQygiSWdub3JpbmcgY29uY3VycmVudCBzY2FuIGFib3J0IHJlcXVlc3QuXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1NDQU5fQUJPUlRJTkc7CisKKwllcnIgPSBpcHdfc2VuZF9zY2FuX2Fib3J0KHByaXYpOworCWlmIChlcnIpCisJCUlQV19ERUJVR19IQygiUmVxdWVzdCB0byBhYm9ydCBzY2FuIGZhaWxlZC5cbiIpOworfQorCitzdGF0aWMgaW50IGlwd19yZXF1ZXN0X3NjYW4oc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCXN0cnVjdCBpcHdfc2Nhbl9yZXF1ZXN0X2V4dCBzY2FuOworCWludCBjaGFubmVsX2luZGV4ID0gMDsKKwlpbnQgaSwgZXJyLCBzY2FuX3R5cGU7CisKKwlpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX0VYSVRfUEVORElORykgeworCQlJUFdfREVCVUdfU0NBTigiQWJvcnRpbmcgc2NhbiBkdWUgdG8gZGV2aWNlIHNodXRkb3duXG4iKTsKKwkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19TQ0FOX1BFTkRJTkc7CisJCXJldHVybiAwOworCX0KKworCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfU0NBTk5JTkcpIHsKKwkJSVBXX0RFQlVHX0hDKCJDb25jdXJyZW50IHNjYW4gcmVxdWVzdGVkLiAgQWJvcnRpbmcgZmlyc3QuXG4iKTsKKwkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19TQ0FOX1BFTkRJTkc7CisJCWlwd19hYm9ydF9zY2FuKHByaXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1NDQU5fQUJPUlRJTkcpIHsKKwkJSVBXX0RFQlVHX0hDKCJTY2FuIHJlcXVlc3Qgd2hpbGUgYWJvcnQgcGVuZGluZy4gIFF1ZXVpbmcuXG4iKTsKKwkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19TQ0FOX1BFTkRJTkc7CisJCXJldHVybiAwOworCX0KKworCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfUkZfS0lMTF9NQVNLKSB7CisJCUlQV19ERUJVR19IQygiQWJvcnRpbmcgc2NhbiBkdWUgdG8gUkYgS2lsbCBhY3RpdmF0aW9uXG4iKTsKKwkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19TQ0FOX1BFTkRJTkc7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldCgmc2NhbiwgMCwgc2l6ZW9mKHNjYW4pKTsKKworCXNjYW4uZHdlbGxfdGltZVtJUFdfU0NBTl9BQ1RJVkVfQlJPQURDQVNUX1NDQU5dID0gMjA7CisJc2Nhbi5kd2VsbF90aW1lW0lQV19TQ0FOX0FDVElWRV9CUk9BRENBU1RfQU5EX0RJUkVDVF9TQ0FOXSA9IDIwOworCXNjYW4uZHdlbGxfdGltZVtJUFdfU0NBTl9QQVNTSVZFX0ZVTExfRFdFTExfU0NBTl0gPSAyMDsKKworCXNjYW4uZnVsbF9zY2FuX2luZGV4ID0gaWVlZTgwMjExX2dldF9zY2Fucyhwcml2LT5pZWVlKTsKKwkvKiBJZiB3ZSBhcmUgcm9hbWluZywgdGhlbiBtYWtlIHRoaXMgYSBkaXJlY3RlZCBzY2FuIGZvciB0aGUgY3VycmVudAorCSAqIG5ldHdvcmsuICBPdGhlcndpc2UsIGVuc3VyZSB0aGF0IGV2ZXJ5IG90aGVyIHNjYW4gaXMgYSBmYXN0CisJICogY2hhbm5lbCBob3Agc2NhbiAqLworCWlmICgocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JPQU1JTkcpCisJICAgIHx8ICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKQorCQkmJiAocHJpdi0+Y29uZmlnICYgQ0ZHX1NUQVRJQ19FU1NJRCkKKwkJJiYgKHNjYW4uZnVsbF9zY2FuX2luZGV4ICUgMikpKSB7CisJCWVyciA9IGlwd19zZW5kX3NzaWQocHJpdiwgcHJpdi0+ZXNzaWQsIHByaXYtPmVzc2lkX2xlbik7CisJCWlmIChlcnIpIHsKKwkJCUlQV19ERUJVR19IQygiQXR0ZW1wdCB0byBzZW5kIFNTSUQgY29tbWFuZCBmYWlsZWQuXG4iKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlzY2FuX3R5cGUgPSBJUFdfU0NBTl9BQ1RJVkVfQlJPQURDQVNUX0FORF9ESVJFQ1RfU0NBTjsKKwl9IGVsc2UgeworCQlzY2FuX3R5cGUgPSBJUFdfU0NBTl9BQ1RJVkVfQlJPQURDQVNUX1NDQU47CisJfQorCisJaWYgKHByaXYtPmllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV81MkdIWl9CQU5EKSB7CisJCWludCBzdGFydCA9IGNoYW5uZWxfaW5kZXg7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQV9DSEFOTkVMUzsgaSsrKSB7CisJCQlpZiAoYmFuZF9hX2FjdGl2ZV9jaGFubmVsW2ldID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoKHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKSAmJgorCQkJICAgIGJhbmRfYV9hY3RpdmVfY2hhbm5lbFtpXSA9PSBwcml2LT5jaGFubmVsKQorCQkJCWNvbnRpbnVlOworCQkJY2hhbm5lbF9pbmRleCsrOworCQkJc2Nhbi5jaGFubmVsc19saXN0W2NoYW5uZWxfaW5kZXhdID0KKwkJCSAgICBiYW5kX2FfYWN0aXZlX2NoYW5uZWxbaV07CisJCQlpcHdfc2V0X3NjYW5fdHlwZSgmc2NhbiwgY2hhbm5lbF9pbmRleCwgc2Nhbl90eXBlKTsKKwkJfQorCisJCWlmIChzdGFydCAhPSBjaGFubmVsX2luZGV4KSB7CisJCQlzY2FuLmNoYW5uZWxzX2xpc3Rbc3RhcnRdID0gKHU4KSAoSVBXX0FfTU9ERSA8PCA2KSB8CisJCQkgICAgKGNoYW5uZWxfaW5kZXggLSBzdGFydCk7CisJCQljaGFubmVsX2luZGV4Kys7CisJCX0KKwl9CisKKwlpZiAocHJpdi0+aWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzI0R0haX0JBTkQpIHsKKwkJaW50IHN0YXJ0ID0gY2hhbm5lbF9pbmRleDsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9CX0NIQU5ORUxTOyBpKyspIHsKKwkJCWlmIChiYW5kX2JfYWN0aXZlX2NoYW5uZWxbaV0gPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmICgocHJpdi0+c3RhdHVzICYgU1RBVFVTX0FTU09DSUFURUQpICYmCisJCQkgICAgYmFuZF9iX2FjdGl2ZV9jaGFubmVsW2ldID09IHByaXYtPmNoYW5uZWwpCisJCQkJY29udGludWU7CisJCQljaGFubmVsX2luZGV4Kys7CisJCQlzY2FuLmNoYW5uZWxzX2xpc3RbY2hhbm5lbF9pbmRleF0gPQorCQkJICAgIGJhbmRfYl9hY3RpdmVfY2hhbm5lbFtpXTsKKwkJCWlwd19zZXRfc2Nhbl90eXBlKCZzY2FuLCBjaGFubmVsX2luZGV4LCBzY2FuX3R5cGUpOworCQl9CisKKwkJaWYgKHN0YXJ0ICE9IGNoYW5uZWxfaW5kZXgpIHsKKwkJCXNjYW4uY2hhbm5lbHNfbGlzdFtzdGFydF0gPSAodTgpIChJUFdfQl9NT0RFIDw8IDYpIHwKKwkJCSAgICAoY2hhbm5lbF9pbmRleCAtIHN0YXJ0KTsKKwkJfQorCX0KKworCWVyciA9IGlwd19zZW5kX3NjYW5fcmVxdWVzdF9leHQocHJpdiwgJnNjYW4pOworCWlmIChlcnIpIHsKKwkJSVBXX0RFQlVHX0hDKCJTZW5kaW5nIHNjYW4gY29tbWFuZCBmYWlsZWQ6ICUwOFhcbiIsIGVycik7CisJCXJldHVybiAtRUlPOworCX0KKworCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfU0NBTk5JTkc7CisJcHJpdi0+c3RhdHVzICY9IH5TVEFUVVNfU0NBTl9QRU5ESU5HOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIGhhbmRsZXJzLiAgSXQgZG9lcyBub3QKKyAqIGRlZmluZSBhbnkgbWV0aG9kcyBvZiBoYXJkd2FyZSBtYW5pcHVsYXRpb24gYW5kIHJlbGllcyBvbiB0aGUKKyAqIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGlwd19tYWluIHRvIHByb3ZpZGUgdGhlIEhXIGludGVyYWN0aW9uLgorICoKKyAqIFRoZSBleGNlcHRpb24gdG8gdGhpcyBpcyB0aGUgdXNlIG9mIHRoZSBpcHdfZ2V0X29yZGluYWwoKQorICogZnVuY3Rpb24gdXNlZCB0byBwb2xsIHRoZSBoYXJkd2FyZSB2cy4gbWFraW5nIHVuZWNlc3NhcnkgY2FsbHMuCisgKgorICovCisKK3N0YXRpYyBpbnQgaXB3X3d4X2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkpCisJCXN0cmNweSh3cnF1LT5uYW1lLCAidW5hc3NvY2lhdGVkIik7CisJZWxzZQorCQlzbnByaW50Zih3cnF1LT5uYW1lLCBJRk5BTVNJWiwgIklFRUUgODAyLjExJWMiLAorCQkJIGlwd19tb2Rlc1twcml2LT5hc3NvY19yZXF1ZXN0LmllZWVfbW9kZV0pOworCUlQV19ERUJVR19XWCgiTmFtZTogJXNcbiIsIHdycXUtPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd19zZXRfY2hhbm5lbChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4IGNoYW5uZWwpCit7CisJaWYgKGNoYW5uZWwgPT0gMCkgeworCQlJUFdfREVCVUdfSU5GTygiU2V0dGluZyBjaGFubmVsIHRvIEFOWSAoMClcbiIpOworCQlwcml2LT5jb25maWcgJj0gfkNGR19TVEFUSUNfQ0hBTk5FTDsKKwkJaWYgKCEocHJpdi0+c3RhdHVzICYgKFNUQVRVU19TQ0FOTklORyB8IFNUQVRVU19BU1NPQ0lBVEVEIHwKKwkJCQkgICAgICBTVEFUVVNfQVNTT0NJQVRJTkcpKSkgeworCQkJSVBXX0RFQlVHX0FTU09DKCJBdHRlbXB0aW5nIHRvIGFzc29jaWF0ZSB3aXRoIG5ldyAiCisJCQkJCSJwYXJhbWV0ZXJzLlxuIik7CisJCQlpcHdfYXNzb2NpYXRlKHByaXYpOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpdi0+Y29uZmlnIHw9IENGR19TVEFUSUNfQ0hBTk5FTDsKKworCWlmIChwcml2LT5jaGFubmVsID09IGNoYW5uZWwpIHsKKwkJSVBXX0RFQlVHX0lORk8oIlJlcXVlc3QgdG8gc2V0IGNoYW5uZWwgdG8gY3VycmVudCB2YWx1ZSAoJWQpXG4iLAorCQkJICAgICAgIGNoYW5uZWwpOworCQlyZXR1cm4gMDsKKwl9CisKKwlJUFdfREVCVUdfSU5GTygiU2V0dGluZyBjaGFubmVsIHRvICVpXG4iLCAoaW50KWNoYW5uZWwpOworCXByaXYtPmNoYW5uZWwgPSBjaGFubmVsOworCisJLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkLCBvciB0cnlpbmcgdG8gYXNzb2NpYXRlCisJICogdGhlbiBzZWUgaWYgdGhpcyBpcyBhIG5ldyBjaGFubmVsIChjYXVzaW5nIHVzIHRvIGRpc2Fzc29jaWF0ZSkgKi8KKwlpZiAocHJpdi0+c3RhdHVzICYgKFNUQVRVU19BU1NPQ0lBVEVEIHwgU1RBVFVTX0FTU09DSUFUSU5HKSkgeworCQlJUFdfREVCVUdfQVNTT0MoIkRpc2Fzc29jaWF0aW5nIGR1ZSB0byBjaGFubmVsIGNoYW5nZS5cbiIpOworCQlpcHdfZGlzYXNzb2NpYXRlKHByaXYpOworCX0gZWxzZSB7CisJCWlwd19hc3NvY2lhdGUocHJpdik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3d4X3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdfZnJlcSAqZndycSA9ICZ3cnF1LT5mcmVxOworCisJLyogaWYgc2V0dGluZyBieSBmcmVxIGNvbnZlcnQgdG8gY2hhbm5lbCAqLworCWlmIChmd3JxLT5lID09IDEpIHsKKwkJaWYgKChmd3JxLT5tID49IChpbnQpMi40MTJlOCAmJiBmd3JxLT5tIDw9IChpbnQpMi40ODdlOCkpIHsKKwkJCWludCBmID0gZndycS0+bSAvIDEwMDAwMDsKKwkJCWludCBjID0gMDsKKworCQkJd2hpbGUgKChjIDwgUkVHX01BWF9DSEFOTkVMKSAmJgorCQkJICAgICAgIChmICE9IGlwd19mcmVxdWVuY2llc1tjXSkpCisJCQkJYysrOworCisJCQkvKiBoYWNrIHRvIGZhbGwgdGhyb3VnaCAqLworCQkJZndycS0+ZSA9IDA7CisJCQlmd3JxLT5tID0gYyArIDE7CisJCX0KKwl9CisKKwlpZiAoZndycS0+ZSA+IDAgfHwgZndycS0+bSA+IDEwMDApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCUlQV19ERUJVR19XWCgiU0VUIEZyZXEvQ2hhbm5lbCAtPiAlZCBcbiIsIGZ3cnEtPm0pOworCXJldHVybiBpcHdfc2V0X2NoYW5uZWwocHJpdiwgKHU4KSBmd3JxLT5tKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd193eF9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwl3cnF1LT5mcmVxLmUgPSAwOworCisJLyogSWYgd2UgYXJlIGFzc29jaWF0ZWQsIHRyeWluZyB0byBhc3NvY2lhdGUsIG9yIGhhdmUgYSBzdGF0aWNhbGx5CisJICogY29uZmlndXJlZCBDSEFOTkVMIHRoZW4gcmV0dXJuIHRoYXQ7IG90aGVyd2lzZSByZXR1cm4gQU5ZICovCisJaWYgKHByaXYtPmNvbmZpZyAmIENGR19TVEFUSUNfQ0hBTk5FTCB8fAorCSAgICBwcml2LT5zdGF0dXMgJiAoU1RBVFVTX0FTU09DSUFUSU5HIHwgU1RBVFVTX0FTU09DSUFURUQpKQorCQl3cnF1LT5mcmVxLm0gPSBwcml2LT5jaGFubmVsOworCWVsc2UKKwkJd3JxdS0+ZnJlcS5tID0gMDsKKworCUlQV19ERUJVR19XWCgiR0VUIEZyZXEvQ2hhbm5lbCAtPiAlZCBcbiIsIHByaXYtPmNoYW5uZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd193eF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisKKwlJUFdfREVCVUdfV1goIlNldCBNT0RFOiAlZFxuIiwgd3JxdS0+bW9kZSk7CisKKwlpZiAod3JxdS0+bW9kZSA9PSBwcml2LT5pZWVlLT5pd19tb2RlKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAod3JxdS0+bW9kZSkgeworI2lmZGVmIENPTkZJR19JUFdfUFJPTUlTQworCWNhc2UgSVdfTU9ERV9NT05JVE9SOgorI2VuZGlmCisJY2FzZSBJV19NT0RFX0FESE9DOgorCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJYnJlYWs7CisJY2FzZSBJV19NT0RFX0FVVE86CisJCXdycXUtPm1vZGUgPSBJV19NT0RFX0lORlJBOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyNpZmRlZiBDT05GSUdfSVBXX1BST01JU0MKKwlpZiAocHJpdi0+aWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXByaXYtPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfRVRIRVI7CisKKwlpZiAod3JxdS0+bW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXByaXYtPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExOworI2VuZGlmCQkJCS8qIENPTkZJR19JUFdfUFJPTUlTQyAqLworCisjaWZkZWYgQ09ORklHX1BNCisJLyogRnJlZSB0aGUgZXhpc3RpbmcgZmlybXdhcmUgYW5kIHJlc2V0IHRoZSBmd19sb2FkZWQKKwkgKiBmbGFnIHNvIGlwd19sb2FkKCkgd2lsbCBicmluZyBpbiB0aGUgbmV3IGZpcm1hd3JlICovCisJaWYgKGZ3X2xvYWRlZCkgeworCQlmd19sb2FkZWQgPSAwOworCX0KKworCXJlbGVhc2VfZmlybXdhcmUoYm9vdGZ3KTsKKwlyZWxlYXNlX2Zpcm13YXJlKHVjb2RlKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZpcm13YXJlKTsKKwlib290ZncgPSB1Y29kZSA9IGZpcm13YXJlID0gTlVMTDsKKyNlbmRpZgorCisJcHJpdi0+aWVlZS0+aXdfbW9kZSA9IHdycXUtPm1vZGU7CisJaXB3X2FkYXB0ZXJfcmVzdGFydChwcml2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3d4X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXdycXUtPm1vZGUgPSBwcml2LT5pZWVlLT5pd19tb2RlOworCUlQV19ERUJVR19XWCgiR2V0IE1PREUgLT4gJWRcbiIsIHdycXUtPm1vZGUpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgREVGQVVMVF9SVFNfVEhSRVNIT0xEICAgICAyMzA0VQorI2RlZmluZSBNSU5fUlRTX1RIUkVTSE9MRCAgICAgICAgIDFVCisjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEICAgICAgICAgMjMwNFUKKyNkZWZpbmUgREVGQVVMVF9CRUFDT05fSU5URVJWQUwgICAxMDBVCisjZGVmaW5lCURFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQgN1UKKyNkZWZpbmUJREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUICA0VQorCisvKiBWYWx1ZXMgYXJlIGluIG1pY3Jvc2Vjb25kICovCitzdGF0aWMgY29uc3QgczMyIHRpbWVvdXRfZHVyYXRpb25bXSA9IHsKKwkzNTAwMDAsCisJMjUwMDAwLAorCTc1MDAwLAorCTM3MDAwLAorCTI1MDAwLAorfTsKKworc3RhdGljIGNvbnN0IHMzMiBwZXJpb2RfZHVyYXRpb25bXSA9IHsKKwk0MDAwMDAsCisJNzAwMDAwLAorCTEwMDAwMDAsCisJMTAwMDAwMCwKKwkxMDAwMDAwCit9OworCitzdGF0aWMgaW50IGlwd193eF9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKilleHRyYTsKKwl1MTYgdmFsOworCWludCBpOworCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2YoKnJhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZigqcmFuZ2UpKTsKKworCS8qIDU0TWJzID09IH4yNyBNYi9zIHJlYWwgKDgwMi4xMWcpICovCisJcmFuZ2UtPnRocm91Z2hwdXQgPSAyNyAqIDEwMDAgKiAxMDAwOworCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7CisJLyogVE9ETzogRmluZCByZWFsIG1heCBSU1NJIGFuZCBzdGljayBoZXJlICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gNzsJLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KKworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gNzA7CisJLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbCB2YWx1ZSBmb3IgUlNTSSAqLworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDA7CS8qIEZJWE1FIHRvIHJlYWwgYXZlcmFnZSBsZXZlbCAqLworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7CisJcmFuZ2UtPmF2Z19xdWFsLnVwZGF0ZWQgPSA3OwkvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLworCisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IG1pbihwcml2LT5yYXRlcy5udW1fcmF0ZXMsICh1OCkgSVdfTUFYX0JJVFJBVEVTKTsKKworCWZvciAoaSA9IDA7IGkgPCByYW5nZS0+bnVtX2JpdHJhdGVzOyBpKyspCisJCXJhbmdlLT5iaXRyYXRlW2ldID0gKHByaXYtPnJhdGVzLnN1cHBvcnRlZF9yYXRlc1tpXSAmIDB4N0YpICoKKwkJICAgIDUwMDAwMDsKKworCXJhbmdlLT5tYXhfcnRzID0gREVGQVVMVF9SVFNfVEhSRVNIT0xEOworCXJhbmdlLT5taW5fZnJhZyA9IE1JTl9GUkFHX1RIUkVTSE9MRDsKKwlyYW5nZS0+bWF4X2ZyYWcgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKKwlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IFdFUF9LRVlTOworCisJLyogU2V0IHRoZSBXaXJlbGVzcyBFeHRlbnNpb24gdmVyc2lvbnMgKi8KKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxNjsKKworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBGUkVRX0NPVU5UOworCisJdmFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgRlJFUV9DT1VOVDsgaSsrKSB7CisJCXJhbmdlLT5mcmVxW3ZhbF0uaSA9IGkgKyAxOworCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBpcHdfZnJlcXVlbmNpZXNbaV0gKiAxMDAwMDA7CisJCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7CisJCXZhbCsrOworCisJCWlmICh2YWwgPT0gSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQkJYnJlYWs7CisJfQorCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOworCisJSVBXX0RFQlVHX1dYKCJHRVQgUmFuZ2VcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd193eF9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhbnlbXSA9IHsKKwkJMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgorCX07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2ZmW10gPSB7CisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCisJaWYgKHdycXUtPmFwX2FkZHIuc2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIW1lbWNtcChhbnksIHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pIHx8CisJICAgICFtZW1jbXAob2ZmLCB3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIEVUSF9BTEVOKSkgeworCQkvKiB3ZSBkaXNhYmxlIG1hbmRhdG9yeSBCU1NJRCBhc3NvY2lhdGlvbiAqLworCQlJUFdfREVCVUdfV1goIlNldHRpbmcgQVAgQlNTSUQgdG8gQU5ZXG4iKTsKKwkJcHJpdi0+Y29uZmlnICY9IH5DRkdfU1RBVElDX0JTU0lEOworCQlpZiAoIShwcml2LT5zdGF0dXMgJiAoU1RBVFVTX1NDQU5OSU5HIHwgU1RBVFVTX0FTU09DSUFURUQgfAorCQkJCSAgICAgIFNUQVRVU19BU1NPQ0lBVElORykpKSB7CisJCQlJUFdfREVCVUdfQVNTT0MoIkF0dGVtcHRpbmcgdG8gYXNzb2NpYXRlIHdpdGggbmV3ICIKKwkJCQkJInBhcmFtZXRlcnMuXG4iKTsKKwkJCWlwd19hc3NvY2lhdGUocHJpdik7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlwcml2LT5jb25maWcgfD0gQ0ZHX1NUQVRJQ19CU1NJRDsKKwlpZiAoIW1lbWNtcChwcml2LT5ic3NpZCwgd3JxdS0+YXBfYWRkci5zYV9kYXRhLCBFVEhfQUxFTikpIHsKKwkJSVBXX0RFQlVHX1dYKCJCU1NJRCBzZXQgdG8gY3VycmVudCBCU1NJRC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlJUFdfREVCVUdfV1goIlNldHRpbmcgbWFuZGF0b3J5IEJTU0lEIHRvICIgTUFDX0ZNVCAiXG4iLAorCQkgICAgIE1BQ19BUkcod3JxdS0+YXBfYWRkci5zYV9kYXRhKSk7CisKKwltZW1jcHkocHJpdi0+YnNzaWQsIHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pOworCisJLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkLCBvciB0cnlpbmcgdG8gYXNzb2NpYXRlCisJICogdGhlbiBzZWUgaWYgdGhpcyBpcyBhIG5ldyBCU1NJRCAoY2F1c2luZyB1cyB0byBkaXNhc3NvY2lhdGUpICovCisJaWYgKHByaXYtPnN0YXR1cyAmIChTVEFUVVNfQVNTT0NJQVRFRCB8IFNUQVRVU19BU1NPQ0lBVElORykpIHsKKwkJSVBXX0RFQlVHX0FTU09DKCJEaXNhc3NvY2lhdGluZyBkdWUgdG8gQlNTSUQgY2hhbmdlLlxuIik7CisJCWlwd19kaXNhc3NvY2lhdGUocHJpdik7CisJfSBlbHNlIHsKKwkJaXB3X2Fzc29jaWF0ZShwcml2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfd3hfZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8qIElmIHdlIGFyZSBhc3NvY2lhdGVkLCB0cnlpbmcgdG8gYXNzb2NpYXRlLCBvciBoYXZlIGEgc3RhdGljYWxseQorCSAqIGNvbmZpZ3VyZWQgQlNTSUQgdGhlbiByZXR1cm4gdGhhdDsgb3RoZXJ3aXNlIHJldHVybiBBTlkgKi8KKwlpZiAocHJpdi0+Y29uZmlnICYgQ0ZHX1NUQVRJQ19CU1NJRCB8fAorCSAgICBwcml2LT5zdGF0dXMgJiAoU1RBVFVTX0FTU09DSUFURUQgfCBTVEFUVVNfQVNTT0NJQVRJTkcpKSB7CisJCXdycXUtPmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLCAmcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKKwl9IGVsc2UKKwkJbWVtc2V0KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCisJSVBXX0RFQlVHX1dYKCJHZXR0aW5nIFdBUCBCU1NJRDogIiBNQUNfRk1UICJcbiIsCisJCSAgICAgTUFDX0FSRyh3cnF1LT5hcF9hZGRyLnNhX2RhdGEpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfd3hfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWNoYXIgKmVzc2lkID0gIiI7CS8qIEFOWSAqLworCWludCBsZW5ndGggPSAwOworCisJaWYgKHdycXUtPmVzc2lkLmZsYWdzICYmIHdycXUtPmVzc2lkLmxlbmd0aCkgeworCQlsZW5ndGggPSB3cnF1LT5lc3NpZC5sZW5ndGggLSAxOworCQllc3NpZCA9IGV4dHJhOworCX0KKwlpZiAobGVuZ3RoID09IDApIHsKKwkJSVBXX0RFQlVHX1dYKCJTZXR0aW5nIEVTU0lEIHRvIEFOWVxuIik7CisJCXByaXYtPmNvbmZpZyAmPSB+Q0ZHX1NUQVRJQ19FU1NJRDsKKwkJaWYgKCEocHJpdi0+c3RhdHVzICYgKFNUQVRVU19TQ0FOTklORyB8IFNUQVRVU19BU1NPQ0lBVEVEIHwKKwkJCQkgICAgICBTVEFUVVNfQVNTT0NJQVRJTkcpKSkgeworCQkJSVBXX0RFQlVHX0FTU09DKCJBdHRlbXB0aW5nIHRvIGFzc29jaWF0ZSB3aXRoIG5ldyAiCisJCQkJCSJwYXJhbWV0ZXJzLlxuIik7CisJCQlpcHdfYXNzb2NpYXRlKHByaXYpOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJbGVuZ3RoID0gbWluKGxlbmd0aCwgSVdfRVNTSURfTUFYX1NJWkUpOworCisJcHJpdi0+Y29uZmlnIHw9IENGR19TVEFUSUNfRVNTSUQ7CisKKwlpZiAocHJpdi0+ZXNzaWRfbGVuID09IGxlbmd0aCAmJiAhbWVtY21wKHByaXYtPmVzc2lkLCBleHRyYSwgbGVuZ3RoKSkgeworCQlJUFdfREVCVUdfV1goIkVTU0lEIHNldCB0byBjdXJyZW50IEVTU0lELlxuIik7CisJCXJldHVybiAwOworCX0KKworCUlQV19ERUJVR19XWCgiU2V0dGluZyBFU1NJRDogJyVzJyAoJWQpXG4iLCBlc2NhcGVfZXNzaWQoZXNzaWQsIGxlbmd0aCksCisJCSAgICAgbGVuZ3RoKTsKKworCXByaXYtPmVzc2lkX2xlbiA9IGxlbmd0aDsKKwltZW1jcHkocHJpdi0+ZXNzaWQsIGVzc2lkLCBwcml2LT5lc3NpZF9sZW4pOworCisJLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkLCBvciB0cnlpbmcgdG8gYXNzb2NpYXRlCisJICogdGhlbiBzZWUgaWYgdGhpcyBpcyBhIG5ldyBFU1NJRCAoY2F1c2luZyB1cyB0byBkaXNhc3NvY2lhdGUpICovCisJaWYgKHByaXYtPnN0YXR1cyAmIChTVEFUVVNfQVNTT0NJQVRFRCB8IFNUQVRVU19BU1NPQ0lBVElORykpIHsKKwkJSVBXX0RFQlVHX0FTU09DKCJEaXNhc3NvY2lhdGluZyBkdWUgdG8gRVNTSUQgY2hhbmdlLlxuIik7CisJCWlwd19kaXNhc3NvY2lhdGUocHJpdik7CisJfSBlbHNlIHsKKwkJaXB3X2Fzc29jaWF0ZShwcml2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJLyogSWYgd2UgYXJlIGFzc29jaWF0ZWQsIHRyeWluZyB0byBhc3NvY2lhdGUsIG9yIGhhdmUgYSBzdGF0aWNhbGx5CisJICogY29uZmlndXJlZCBFU1NJRCB0aGVuIHJldHVybiB0aGF0OyBvdGhlcndpc2UgcmV0dXJuIEFOWSAqLworCWlmIChwcml2LT5jb25maWcgJiBDRkdfU1RBVElDX0VTU0lEIHx8CisJICAgIHByaXYtPnN0YXR1cyAmIChTVEFUVVNfQVNTT0NJQVRFRCB8IFNUQVRVU19BU1NPQ0lBVElORykpIHsKKwkJSVBXX0RFQlVHX1dYKCJHZXR0aW5nIGVzc2lkOiAnJXMnXG4iLAorCQkJICAgICBlc2NhcGVfZXNzaWQocHJpdi0+ZXNzaWQsIHByaXYtPmVzc2lkX2xlbikpOworCQltZW1jcHkoZXh0cmEsIHByaXYtPmVzc2lkLCBwcml2LT5lc3NpZF9sZW4pOworCQl3cnF1LT5lc3NpZC5sZW5ndGggPSBwcml2LT5lc3NpZF9sZW47CisJCXdycXUtPmVzc2lkLmZsYWdzID0gMTsJLyogYWN0aXZlICovCisJfSBlbHNlIHsKKwkJSVBXX0RFQlVHX1dYKCJHZXR0aW5nIGVzc2lkOiBBTllcbiIpOworCQl3cnF1LT5lc3NpZC5sZW5ndGggPSAwOworCQl3cnF1LT5lc3NpZC5mbGFncyA9IDA7CS8qIGFjdGl2ZSAqLworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd193eF9zZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlJUFdfREVCVUdfV1goIlNldHRpbmcgbmljayB0byAnJXMnXG4iLCBleHRyYSk7CisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCisJCXJldHVybiAtRTJCSUc7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IG1pbigoc2l6ZV90KSB3cnF1LT5kYXRhLmxlbmd0aCwgc2l6ZW9mKHByaXYtPm5pY2spKTsKKwltZW1zZXQocHJpdi0+bmljaywgMCwgc2l6ZW9mKHByaXYtPm5pY2spKTsKKwltZW1jcHkocHJpdi0+bmljaywgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKwlJUFdfREVCVUdfVFJBQ0UoIjw8XG4iKTsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGlwd193eF9nZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJSVBXX0RFQlVHX1dYKCJHZXR0aW5nIG5pY2tcbiIpOworCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKHByaXYtPm5pY2spICsgMTsKKwltZW1jcHkoZXh0cmEsIHByaXYtPm5pY2ssIHdycXUtPmRhdGEubGVuZ3RoKTsKKwl3cnF1LT5kYXRhLmZsYWdzID0gMTsJLyogYWN0aXZlICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3d4X3NldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJSVBXX0RFQlVHX1dYKCIweCVwLCAweCVwLCAweCVwXG4iLCBkZXYsIGluZm8sIHdycXUpOworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludCBpcHdfd3hfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXdycXUtPmJpdHJhdGUudmFsdWUgPSBwcml2LT5sYXN0X3JhdGU7CisKKwlJUFdfREVCVUdfV1goIkdFVCBSYXRlIC0+ICVkIFxuIiwgd3JxdS0+Yml0cmF0ZS52YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3d4X3NldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmICh3cnF1LT5ydHMuZGlzYWJsZWQpCisJCXByaXYtPnJ0c190aHJlc2hvbGQgPSBERUZBVUxUX1JUU19USFJFU0hPTEQ7CisJZWxzZSB7CisJCWlmICh3cnF1LT5ydHMudmFsdWUgPCBNSU5fUlRTX1RIUkVTSE9MRCB8fAorCQkgICAgd3JxdS0+cnRzLnZhbHVlID4gTUFYX1JUU19USFJFU0hPTEQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT5ydHNfdGhyZXNob2xkID0gd3JxdS0+cnRzLnZhbHVlOworCX0KKworCWlwd19zZW5kX3J0c190aHJlc2hvbGQocHJpdiwgcHJpdi0+cnRzX3RocmVzaG9sZCk7CisJSVBXX0RFQlVHX1dYKCJTRVQgUlRTIFRocmVzaG9sZCAtPiAlZCBcbiIsIHByaXYtPnJ0c190aHJlc2hvbGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd193eF9nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJd3JxdS0+cnRzLnZhbHVlID0gcHJpdi0+cnRzX3RocmVzaG9sZDsKKwl3cnF1LT5ydHMuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLworCXdycXUtPnJ0cy5kaXNhYmxlZCA9ICh3cnF1LT5ydHMudmFsdWUgPT0gREVGQVVMVF9SVFNfVEhSRVNIT0xEKTsKKworCUlQV19ERUJVR19XWCgiR0VUIFJUUyBUaHJlc2hvbGQgLT4gJWQgXG4iLCB3cnF1LT5ydHMudmFsdWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd193eF9zZXRfdHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGlwd190eF9wb3dlciB0eF9wb3dlcjsKKwlpbnQgaTsKKworCWlmIChpcHdfcmFkaW9fa2lsbF9zdyhwcml2LCB3cnF1LT5wb3dlci5kaXNhYmxlZCkpCisJCXJldHVybiAtRUlOUFJPR1JFU1M7CisKKwlpZiAod3JxdS0+cG93ZXIuZmxhZ3MgIT0gSVdfVFhQT1dfREJNKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgod3JxdS0+cG93ZXIudmFsdWUgPiAyMCkgfHwgKHdycXUtPnBvd2VyLnZhbHVlIDwgLTEyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcml2LT50eF9wb3dlciA9IHdycXUtPnBvd2VyLnZhbHVlOworCisJbWVtc2V0KCZ0eF9wb3dlciwgMCwgc2l6ZW9mKHR4X3Bvd2VyKSk7CisKKwkvKiBjb25maWd1cmUgZGV2aWNlIGZvciAnRycgYmFuZCAqLworCXR4X3Bvd2VyLmllZWVfbW9kZSA9IElQV19HX01PREU7CisJdHhfcG93ZXIubnVtX2NoYW5uZWxzID0gMTE7CisJZm9yIChpID0gMDsgaSA8IDExOyBpKyspIHsKKwkJdHhfcG93ZXIuY2hhbm5lbHNfdHhfcG93ZXJbaV0uY2hhbm5lbF9udW1iZXIgPSBpICsgMTsKKwkJdHhfcG93ZXIuY2hhbm5lbHNfdHhfcG93ZXJbaV0udHhfcG93ZXIgPSBwcml2LT50eF9wb3dlcjsKKwl9CisJaWYgKGlwd19zZW5kX3R4X3Bvd2VyKHByaXYsICZ0eF9wb3dlcikpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjb25maWd1cmUgZGV2aWNlIHRvIGFsc28gaGFuZGxlICdCJyBiYW5kICovCisJdHhfcG93ZXIuaWVlZV9tb2RlID0gSVBXX0JfTU9ERTsKKwlpZiAoaXB3X3NlbmRfdHhfcG93ZXIocHJpdiwgJnR4X3Bvd2VyKSkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCisgICAgICBlcnJvcjoKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBpcHdfd3hfZ2V0X3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJd3JxdS0+cG93ZXIudmFsdWUgPSBwcml2LT50eF9wb3dlcjsKKwl3cnF1LT5wb3dlci5maXhlZCA9IDE7CisJd3JxdS0+cG93ZXIuZmxhZ3MgPSBJV19UWFBPV19EQk07CisJd3JxdS0+cG93ZXIuZGlzYWJsZWQgPSAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JGX0tJTExfTUFTSykgPyAxIDogMDsKKworCUlQV19ERUJVR19XWCgiR0VUIFRYIFBvd2VyIC0+ICVzICVkIFxuIiwKKwkJICAgICB3cnF1LT5wb3dlci5kaXNhYmxlZCA/ICJPTiIgOiAiT0ZGIiwgd3JxdS0+cG93ZXIudmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3d4X3NldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmICh3cnF1LT5mcmFnLmRpc2FibGVkKQorCQlwcml2LT5pZWVlLT5mdHMgPSBERUZBVUxUX0ZUUzsKKwllbHNlIHsKKwkJaWYgKHdycXUtPmZyYWcudmFsdWUgPCBNSU5fRlJBR19USFJFU0hPTEQgfHwKKwkJICAgIHdycXUtPmZyYWcudmFsdWUgPiBNQVhfRlJBR19USFJFU0hPTEQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT5pZWVlLT5mdHMgPSB3cnF1LT5mcmFnLnZhbHVlICYgfjB4MTsKKwl9CisKKwlpcHdfc2VuZF9mcmFnX3RocmVzaG9sZChwcml2LCB3cnF1LT5mcmFnLnZhbHVlKTsKKwlJUFdfREVCVUdfV1goIlNFVCBGcmFnIFRocmVzaG9sZCAtPiAlZCBcbiIsIHdycXUtPmZyYWcudmFsdWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd193eF9nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJd3JxdS0+ZnJhZy52YWx1ZSA9IHByaXYtPmllZWUtPmZ0czsKKwl3cnF1LT5mcmFnLmZpeGVkID0gMDsJLyogbm8gYXV0byBzZWxlY3QgKi8KKwl3cnF1LT5mcmFnLmRpc2FibGVkID0gKHdycXUtPmZyYWcudmFsdWUgPT0gREVGQVVMVF9GVFMpOworCisJSVBXX0RFQlVHX1dYKCJHRVQgRnJhZyBUaHJlc2hvbGQgLT4gJWQgXG4iLCB3cnF1LT5mcmFnLnZhbHVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd193eF9zZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCUlQV19ERUJVR19XWCgiMHglcCwgMHglcCwgMHglcFxuIiwgZGV2LCBpbmZvLCB3cnF1KTsKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3d4X2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJSVBXX0RFQlVHX1dYKCIweCVwLCAweCVwLCAweCVwXG4iLCBkZXYsIGluZm8sIHdycXUpOworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludCBpcHdfd3hfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCUlQV19ERUJVR19XWCgiU3RhcnQgc2NhblxuIik7CisJaWYgKGlwd19yZXF1ZXN0X3NjYW4ocHJpdikpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd193eF9nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfc2Nhbihwcml2LT5pZWVlLCBpbmZvLCB3cnF1LCBleHRyYSk7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3d4X3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcmV0dXJuIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlKHByaXYtPmllZWUsIGluZm8sIHdycXUsIGtleSk7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3d4X2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHByaXYtPmllZWUsIGluZm8sIHdycXUsIGtleSk7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3d4X3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJaWYgKHdycXUtPnBvd2VyLmRpc2FibGVkKSB7CisJCXByaXYtPnBvd2VyX21vZGUgPSBJUFdfUE9XRVJfTEVWRUwocHJpdi0+cG93ZXJfbW9kZSk7CisJCWVyciA9IGlwd19zZW5kX3Bvd2VyX21vZGUocHJpdiwgSVBXX1BPV0VSX01PREVfQ0FNKTsKKwkJaWYgKGVycikgeworCQkJSVBXX0RFQlVHX1dYKCJmYWlsZWQgc2V0dGluZyBwb3dlciBtb2RlLlxuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJSVBXX0RFQlVHX1dYKCJTRVQgUG93ZXIgTWFuYWdlbWVudCBNb2RlIC0+IG9mZlxuIik7CisKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoICh3cnF1LT5wb3dlci5mbGFncyAmIElXX1BPV0VSX01PREUpIHsKKwljYXNlIElXX1BPV0VSX09OOgkvKiBJZiBub3Qgc3BlY2lmaWVkICovCisJY2FzZSBJV19QT1dFUl9NT0RFOgkvKiBJZiBzZXQgYWxsIG1hc2sgKi8KKwljYXNlIElXX1BPV0VSX0FMTF9SOgkvKiBJZiBleHBsaWNpdGVseSBzdGF0ZSBhbGwgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIE90aGVyd2lzZSB3ZSBkb24ndCBzdXBwb3J0IGl0ICovCisJCUlQV19ERUJVR19XWCgiU0VUIFBNIE1vZGU6ICVYIG5vdCBzdXBwb3J0ZWQuXG4iLAorCQkJICAgICB3cnF1LT5wb3dlci5mbGFncyk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBJZiB0aGUgdXNlciBoYXNuJ3Qgc3BlY2lmaWVkIGEgcG93ZXIgbWFuYWdlbWVudCBtb2RlIHlldCwgZGVmYXVsdAorCSAqIHRvIEJBVFRFUlkgKi8KKwlpZiAoSVBXX1BPV0VSX0xFVkVMKHByaXYtPnBvd2VyX21vZGUpID09IElQV19QT1dFUl9BQykKKwkJcHJpdi0+cG93ZXJfbW9kZSA9IElQV19QT1dFUl9FTkFCTEVEIHwgSVBXX1BPV0VSX0JBVFRFUlk7CisJZWxzZQorCQlwcml2LT5wb3dlcl9tb2RlID0gSVBXX1BPV0VSX0VOQUJMRUQgfCBwcml2LT5wb3dlcl9tb2RlOworCWVyciA9IGlwd19zZW5kX3Bvd2VyX21vZGUocHJpdiwgSVBXX1BPV0VSX0xFVkVMKHByaXYtPnBvd2VyX21vZGUpKTsKKwlpZiAoZXJyKSB7CisJCUlQV19ERUJVR19XWCgiZmFpbGVkIHNldHRpbmcgcG93ZXIgbW9kZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCUlQV19ERUJVR19XWCgiU0VUIFBvd2VyIE1hbmFnZW1lbnQgTW9kZSAtPiAweCUwMlhcbiIsIHByaXYtPnBvd2VyX21vZGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3d4X2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmICghKHByaXYtPnBvd2VyX21vZGUgJiBJUFdfUE9XRVJfRU5BQkxFRCkpIHsKKwkJd3JxdS0+cG93ZXIuZGlzYWJsZWQgPSAxOworCX0gZWxzZSB7CisJCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMDsKKwl9CisKKwlJUFdfREVCVUdfV1goIkdFVCBQb3dlciBNYW5hZ2VtZW50IE1vZGUgLT4gJTAyWFxuIiwgcHJpdi0+cG93ZXJfbW9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfd3hfc2V0X3Bvd2VybW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgbW9kZSA9ICooaW50ICopZXh0cmE7CisJaW50IGVycjsKKworCWlmICgobW9kZSA8IDEpIHx8IChtb2RlID4gSVBXX1BPV0VSX0xJTUlUKSkgeworCQltb2RlID0gSVBXX1BPV0VSX0FDOworCQlwcml2LT5wb3dlcl9tb2RlID0gbW9kZTsKKwl9IGVsc2UgeworCQlwcml2LT5wb3dlcl9tb2RlID0gSVBXX1BPV0VSX0VOQUJMRUQgfCBtb2RlOworCX0KKworCWlmIChwcml2LT5wb3dlcl9tb2RlICE9IG1vZGUpIHsKKwkJZXJyID0gaXB3X3NlbmRfcG93ZXJfbW9kZShwcml2LCBtb2RlKTsKKworCQlpZiAoZXJyKSB7CisJCQlJUFdfREVCVUdfV1goImZhaWxlZCBzZXR0aW5nIHBvd2VyIG1vZGUuXG4iKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNQVhfV1hfU1RSSU5HIDgwCitzdGF0aWMgaW50IGlwd193eF9nZXRfcG93ZXJtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBsZXZlbCA9IElQV19QT1dFUl9MRVZFTChwcml2LT5wb3dlcl9tb2RlKTsKKwljaGFyICpwID0gZXh0cmE7CisKKwlwICs9IHNucHJpbnRmKHAsIE1BWF9XWF9TVFJJTkcsICJQb3dlciBzYXZlIGxldmVsOiAlZCAiLCBsZXZlbCk7CisKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBJUFdfUE9XRVJfQUM6CisJCXAgKz0gc25wcmludGYocCwgTUFYX1dYX1NUUklORyAtIChwIC0gZXh0cmEpLCAiKEFDKSIpOworCQlicmVhazsKKwljYXNlIElQV19QT1dFUl9CQVRURVJZOgorCQlwICs9IHNucHJpbnRmKHAsIE1BWF9XWF9TVFJJTkcgLSAocCAtIGV4dHJhKSwgIihCQVRURVJZKSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwICs9IHNucHJpbnRmKHAsIE1BWF9XWF9TVFJJTkcgLSAocCAtIGV4dHJhKSwKKwkJCSAgICAgICIoVGltZW91dCAlZG1zLCBQZXJpb2QgJWRtcykiLAorCQkJICAgICAgdGltZW91dF9kdXJhdGlvbltsZXZlbCAtIDFdIC8gMTAwMCwKKwkJCSAgICAgIHBlcmlvZF9kdXJhdGlvbltsZXZlbCAtIDFdIC8gMTAwMCk7CisJfQorCisJaWYgKCEocHJpdi0+cG93ZXJfbW9kZSAmIElQV19QT1dFUl9FTkFCTEVEKSkKKwkJcCArPSBzbnByaW50ZihwLCBNQVhfV1hfU1RSSU5HIC0gKHAgLSBleHRyYSksICIgT0ZGIik7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHAgLSBleHRyYSArIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfd3hfc2V0X3dpcmVsZXNzX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgbW9kZSA9ICooaW50ICopZXh0cmE7CisJdTggYmFuZCA9IDAsIG1vZHVsYXRpb24gPSAwOworCisJaWYgKG1vZGUgPT0gMCB8fCBtb2RlICYgfklFRUVfTU9ERV9NQVNLKSB7CisJCUlQV19XQVJOSU5HKCJBdHRlbXB0IHRvIHNldCBpbnZhbGlkIHdpcmVsZXNzIG1vZGU6ICVkXG4iLCBtb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHByaXYtPmFkYXB0ZXIgPT0gSVBXXzI5MTVBQkcpIHsKKwkJcHJpdi0+aWVlZS0+YWJnX3R1cmUgPSAxOworCQlpZiAobW9kZSAmIElFRUVfQSkgeworCQkJYmFuZCB8PSBJRUVFODAyMTFfNTJHSFpfQkFORDsKKwkJCW1vZHVsYXRpb24gfD0gSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTjsKKwkJfSBlbHNlCisJCQlwcml2LT5pZWVlLT5hYmdfdHVyZSA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKG1vZGUgJiBJRUVFX0EpIHsKKwkJCUlQV19XQVJOSU5HKCJBdHRlbXB0IHRvIHNldCAyMjAwQkcgaW50byAiCisJCQkJICAgICI4MDIuMTFhIG1vZGVcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlwcml2LT5pZWVlLT5hYmdfdHVyZSA9IDA7CisJfQorCisJaWYgKG1vZGUgJiBJRUVFX0IpIHsKKwkJYmFuZCB8PSBJRUVFODAyMTFfMjRHSFpfQkFORDsKKwkJbW9kdWxhdGlvbiB8PSBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT047CisJfSBlbHNlCisJCXByaXYtPmllZWUtPmFiZ190dXJlID0gMDsKKworCWlmIChtb2RlICYgSUVFRV9HKSB7CisJCWJhbmQgfD0gSUVFRTgwMjExXzI0R0haX0JBTkQ7CisJCW1vZHVsYXRpb24gfD0gSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTjsKKwl9IGVsc2UKKwkJcHJpdi0+aWVlZS0+YWJnX3R1cmUgPSAwOworCisJcHJpdi0+aWVlZS0+bW9kZSA9IG1vZGU7CisJcHJpdi0+aWVlZS0+ZnJlcV9iYW5kID0gYmFuZDsKKwlwcml2LT5pZWVlLT5tb2R1bGF0aW9uID0gbW9kdWxhdGlvbjsKKwlpbml0X3N1cHBvcnRlZF9yYXRlcyhwcml2LCAmcHJpdi0+cmF0ZXMpOworCisJLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkLCBvciB0cnlpbmcgdG8gYXNzb2NpYXRlCisJICogdGhlbiBzZWUgaWYgdGhpcyBpcyBhIG5ldyBjb25maWd1cmF0aW9uIChjYXVzaW5nIHVzIHRvCisJICogZGlzYXNzb2NpYXRlKSAqLworCWlmIChwcml2LT5zdGF0dXMgJiAoU1RBVFVTX0FTU09DSUFURUQgfCBTVEFUVVNfQVNTT0NJQVRJTkcpKSB7CisJCS8qIFRoZSByZXN1bHRpbmcgYXNzb2NpYXRpb24gd2lsbCB0cmlnZ2VyCisJCSAqIHRoZSBuZXcgcmF0ZXMgdG8gYmUgc2VudCB0byB0aGUgZGV2aWNlICovCisJCUlQV19ERUJVR19BU1NPQygiRGlzYXNzb2NpYXRpbmcgZHVlIHRvIG1vZGUgY2hhbmdlLlxuIik7CisJCWlwd19kaXNhc3NvY2lhdGUocHJpdik7CisJfSBlbHNlCisJCWlwd19zZW5kX3N1cHBvcnRlZF9yYXRlcyhwcml2LCAmcHJpdi0+cmF0ZXMpOworCisJSVBXX0RFQlVHX1dYKCJQUklWIFNFVCBNT0RFOiAlYyVjJWNcbiIsCisJCSAgICAgbW9kZSAmIElFRUVfQSA/ICdhJyA6ICcuJywKKwkJICAgICBtb2RlICYgSUVFRV9CID8gJ2InIDogJy4nLCBtb2RlICYgSUVFRV9HID8gJ2cnIDogJy4nKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfd3hfZ2V0X3dpcmVsZXNzX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXN3aXRjaCAocHJpdi0+aWVlZS0+ZnJlcV9iYW5kKSB7CisJY2FzZSBJRUVFODAyMTFfMjRHSFpfQkFORDoKKwkJc3dpdGNoIChwcml2LT5pZWVlLT5tb2R1bGF0aW9uKSB7CisJCWNhc2UgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OOgorCQkJc3RybmNweShleHRyYSwgIjgwMi4xMWIgKDIpIiwgTUFYX1dYX1NUUklORyk7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OOgorCQkJc3RybmNweShleHRyYSwgIjgwMi4xMWcgKDQpIiwgTUFYX1dYX1NUUklORyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0cm5jcHkoZXh0cmEsICI4MDIuMTFiZyAoNikiLCBNQVhfV1hfU1RSSU5HKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJRUVFODAyMTFfNTJHSFpfQkFORDoKKwkJc3RybmNweShleHRyYSwgIjgwMi4xMWEgKDEpIiwgTUFYX1dYX1NUUklORyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8qIE1peGVkIEJhbmQgKi8KKwkJc3dpdGNoIChwcml2LT5pZWVlLT5tb2R1bGF0aW9uKSB7CisJCWNhc2UgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OOgorCQkJc3RybmNweShleHRyYSwgIjgwMi4xMWFiICgzKSIsIE1BWF9XWF9TVFJJTkcpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTjoKKwkJCXN0cm5jcHkoZXh0cmEsICI4MDIuMTFhZyAoNSkiLCBNQVhfV1hfU1RSSU5HKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RybmNweShleHRyYSwgIjgwMi4xMWFiZyAoNykiLCBNQVhfV1hfU1RSSU5HKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCUlQV19ERUJVR19XWCgiUFJJViBHRVQgTU9ERTogJXNcbiIsIGV4dHJhKTsKKworCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19JUFdfUFJPTUlTQworc3RhdGljIGludCBpcHdfd3hfc2V0X3Byb21pc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCAqcGFybXMgPSAoaW50ICopZXh0cmE7CisJaW50IGVuYWJsZSA9IChwYXJtc1swXSA+IDApOworCisJSVBXX0RFQlVHX1dYKCJTRVQgUFJPTUlTQzogJWQgJWRcbiIsIGVuYWJsZSwgcGFybXNbMV0pOworCWlmIChlbmFibGUpIHsKKwkJaWYgKHByaXYtPmllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9NT05JVE9SKSB7CisJCQlwcml2LT5uZXRfZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMTsKKwkJCWlwd19hZGFwdGVyX3Jlc3RhcnQocHJpdik7CisJCX0KKworCQlpcHdfc2V0X2NoYW5uZWwocHJpdiwgcGFybXNbMV0pOworCX0gZWxzZSB7CisJCWlmIChwcml2LT5pZWVlLT5pd19tb2RlICE9IElXX01PREVfTU9OSVRPUikKKwkJCXJldHVybiAwOworCQlwcml2LT5uZXRfZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOworCQlpcHdfYWRhcHRlcl9yZXN0YXJ0KHByaXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfd3hfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCUlQV19ERUJVR19XWCgiUkVTRVRcbiIpOworCWlwd19hZGFwdGVyX3Jlc3RhcnQocHJpdik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYJCQkJLy8gQ09ORklHX0lQV19QUk9NSVNDCisKKy8qIFJlYmFzZSB0aGUgV0UgSU9DVExzIHRvIHplcm8gZm9yIHRoZSBoYW5kbGVyIGFycmF5ICovCisjZGVmaW5lIElXX0lPQ1RMKHgpIFsoeCktU0lPQ1NJV0NPTU1JVF0KK3N0YXRpYyBpd19oYW5kbGVyIGlwd193eF9oYW5kbGVyc1tdID0geworCUlXX0lPQ1RMKFNJT0NHSVdOQU1FKQk9IGlwd193eF9nZXRfbmFtZSwKKwlJV19JT0NUTChTSU9DU0lXRlJFUSkJPSBpcHdfd3hfc2V0X2ZyZXEsCisJSVdfSU9DVEwoU0lPQ0dJV0ZSRVEpCT0gaXB3X3d4X2dldF9mcmVxLAorCUlXX0lPQ1RMKFNJT0NTSVdNT0RFKQk9IGlwd193eF9zZXRfbW9kZSwKKwlJV19JT0NUTChTSU9DR0lXTU9ERSkJPSBpcHdfd3hfZ2V0X21vZGUsCisJSVdfSU9DVEwoU0lPQ0dJV1JBTkdFKQk9IGlwd193eF9nZXRfcmFuZ2UsCisJSVdfSU9DVEwoU0lPQ1NJV0FQKQk9IGlwd193eF9zZXRfd2FwLAorCUlXX0lPQ1RMKFNJT0NHSVdBUCkJPSBpcHdfd3hfZ2V0X3dhcCwKKwlJV19JT0NUTChTSU9DU0lXU0NBTikJPSBpcHdfd3hfc2V0X3NjYW4sCisJSVdfSU9DVEwoU0lPQ0dJV1NDQU4pCT0gaXB3X3d4X2dldF9zY2FuLAorCUlXX0lPQ1RMKFNJT0NTSVdFU1NJRCkJPSBpcHdfd3hfc2V0X2Vzc2lkLAorCUlXX0lPQ1RMKFNJT0NHSVdFU1NJRCkJPSBpcHdfd3hfZ2V0X2Vzc2lkLAorCUlXX0lPQ1RMKFNJT0NTSVdOSUNLTikJPSBpcHdfd3hfc2V0X25pY2ssCisJSVdfSU9DVEwoU0lPQ0dJV05JQ0tOKQk9IGlwd193eF9nZXRfbmljaywKKwlJV19JT0NUTChTSU9DU0lXUkFURSkJPSBpcHdfd3hfc2V0X3JhdGUsCisJSVdfSU9DVEwoU0lPQ0dJV1JBVEUpCT0gaXB3X3d4X2dldF9yYXRlLAorCUlXX0lPQ1RMKFNJT0NTSVdSVFMpCT0gaXB3X3d4X3NldF9ydHMsCisJSVdfSU9DVEwoU0lPQ0dJV1JUUykJPSBpcHdfd3hfZ2V0X3J0cywKKwlJV19JT0NUTChTSU9DU0lXRlJBRykJPSBpcHdfd3hfc2V0X2ZyYWcsCisJSVdfSU9DVEwoU0lPQ0dJV0ZSQUcpCT0gaXB3X3d4X2dldF9mcmFnLAorCUlXX0lPQ1RMKFNJT0NTSVdUWFBPVykJPSBpcHdfd3hfc2V0X3R4cG93LAorCUlXX0lPQ1RMKFNJT0NHSVdUWFBPVykJPSBpcHdfd3hfZ2V0X3R4cG93LAorCUlXX0lPQ1RMKFNJT0NTSVdSRVRSWSkJPSBpcHdfd3hfc2V0X3JldHJ5LAorCUlXX0lPQ1RMKFNJT0NHSVdSRVRSWSkJPSBpcHdfd3hfZ2V0X3JldHJ5LAorCUlXX0lPQ1RMKFNJT0NTSVdFTkNPREUpCT0gaXB3X3d4X3NldF9lbmNvZGUsCisJSVdfSU9DVEwoU0lPQ0dJV0VOQ09ERSkJPSBpcHdfd3hfZ2V0X2VuY29kZSwKKwlJV19JT0NUTChTSU9DU0lXUE9XRVIpCT0gaXB3X3d4X3NldF9wb3dlciwKKwlJV19JT0NUTChTSU9DR0lXUE9XRVIpCT0gaXB3X3d4X2dldF9wb3dlciwKK307CisKKyNkZWZpbmUgSVBXX1BSSVZfU0VUX1BPV0VSCVNJT0NJV0ZJUlNUUFJJVgorI2RlZmluZSBJUFdfUFJJVl9HRVRfUE9XRVIJU0lPQ0lXRklSU1RQUklWKzEKKyNkZWZpbmUgSVBXX1BSSVZfU0VUX01PREUJU0lPQ0lXRklSU1RQUklWKzIKKyNkZWZpbmUgSVBXX1BSSVZfR0VUX01PREUJU0lPQ0lXRklSU1RQUklWKzMKKyNkZWZpbmUgSVBXX1BSSVZfU0VUX1BST01JU0MJU0lPQ0lXRklSU1RQUklWKzQKKyNkZWZpbmUgSVBXX1BSSVZfUkVTRVQJCVNJT0NJV0ZJUlNUUFJJVis1CisKK3N0YXRpYyBzdHJ1Y3QgaXdfcHJpdl9hcmdzIGlwd19wcml2X2FyZ3NbXSA9IHsKKwl7CisJIC5jbWQgPSBJUFdfUFJJVl9TRVRfUE9XRVIsCisJIC5zZXRfYXJncyA9IElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAubmFtZSA9ICJzZXRfcG93ZXIifSwKKwl7CisJIC5jbWQgPSBJUFdfUFJJVl9HRVRfUE9XRVIsCisJIC5nZXRfYXJncyA9IElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgTUFYX1dYX1NUUklORywKKwkgLm5hbWUgPSAiZ2V0X3Bvd2VyIn0sCisJeworCSAuY21kID0gSVBXX1BSSVZfU0VUX01PREUsCisJIC5zZXRfYXJncyA9IElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAubmFtZSA9ICJzZXRfbW9kZSJ9LAorCXsKKwkgLmNtZCA9IElQV19QUklWX0dFVF9NT0RFLAorCSAuZ2V0X2FyZ3MgPSBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IE1BWF9XWF9TVFJJTkcsCisJIC5uYW1lID0gImdldF9tb2RlIn0sCisjaWZkZWYgQ09ORklHX0lQV19QUk9NSVNDCisJeworCSBJUFdfUFJJVl9TRVRfUFJPTUlTQywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDIsIDAsICJtb25pdG9yIn0sCisJeworCSBJUFdfUFJJVl9SRVNFVCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDAsIDAsICJyZXNldCJ9LAorI2VuZGlmCQkJCS8qIENPTkZJR19JUFdfUFJPTUlTQyAqLworfTsKKworc3RhdGljIGl3X2hhbmRsZXIgaXB3X3ByaXZfaGFuZGxlcltdID0geworCWlwd193eF9zZXRfcG93ZXJtb2RlLAorCWlwd193eF9nZXRfcG93ZXJtb2RlLAorCWlwd193eF9zZXRfd2lyZWxlc3NfbW9kZSwKKwlpcHdfd3hfZ2V0X3dpcmVsZXNzX21vZGUsCisjaWZkZWYgQ09ORklHX0lQV19QUk9NSVNDCisJaXB3X3d4X3NldF9wcm9taXNjLAorCWlwd193eF9yZXNldCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBpd19oYW5kbGVyX2RlZiBpcHdfd3hfaGFuZGxlcl9kZWYgPSB7CisJLnN0YW5kYXJkCQk9IGlwd193eF9oYW5kbGVycywKKwkubnVtX3N0YW5kYXJkCQk9IEFSUkFZX1NJWkUoaXB3X3d4X2hhbmRsZXJzKSwKKwkubnVtX3ByaXZhdGUJCT0gQVJSQVlfU0laRShpcHdfcHJpdl9oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncwk9IEFSUkFZX1NJWkUoaXB3X3ByaXZfYXJncyksCisJLnByaXZhdGUJCT0gaXB3X3ByaXZfaGFuZGxlciwKKwkucHJpdmF0ZV9hcmdzCQk9IGlwd19wcml2X2FyZ3MsCit9OworCisvKgorICogR2V0IHdpcmVsZXNzIHN0YXRpc3RpY3MuCisgKiBDYWxsZWQgYnkgL3Byb2MvbmV0L3dpcmVsZXNzCisgKiBBbHNvIGNhbGxlZCBieSBTSU9DR0lXU1RBVFMKKyAqLworc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICppcHdfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd3N0YXRzOworCisJd3N0YXRzID0gJnByaXYtPndzdGF0czsKKworCS8qIGlmIGh3IGlzIGRpc2FibGVkLCB0aGVuIGlwdzIxMDBfZ2V0X29yZGluYWwoKSBjYW4ndCBiZSBjYWxsZWQuCisJICogaXB3MjEwMF93eF93aXJlbGVzc19zdGF0cyBzZWVtcyB0byBiZSBjYWxsZWQgYmVmb3JlIGZ3IGlzCisJICogaW5pdGlhbGl6ZWQuICBTVEFUVVNfQVNTT0NJQVRFRCB3aWxsIG9ubHkgYmUgc2V0IGlmIHRoZSBodyBpcyB1cAorCSAqIGFuZCBhc3NvY2lhdGVkOyBpZiBub3QgYXNzb2NpY2F0ZWQsIHRoZSB2YWx1ZXMgYXJlIGFsbCBtZWFuaW5nbGVzcworCSAqIGFueXdheSwgc28gc2V0IHRoZW0gYWxsIHRvIE5VTEwgYW5kIElOVkFMSUQgKi8KKwlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkpIHsKKwkJd3N0YXRzLT5taXNzLmJlYWNvbiA9IDA7CisJCXdzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzID0gMDsKKwkJd3N0YXRzLT5xdWFsLnF1YWwgPSAwOworCQl3c3RhdHMtPnF1YWwubGV2ZWwgPSAwOworCQl3c3RhdHMtPnF1YWwubm9pc2UgPSAwOworCQl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IDc7CisJCXdzdGF0cy0+cXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTk9JU0VfSU5WQUxJRCB8CisJCSAgICBJV19RVUFMX1FVQUxfSU5WQUxJRCB8IElXX1FVQUxfTEVWRUxfSU5WQUxJRDsKKwkJcmV0dXJuIHdzdGF0czsKKwl9CisKKwl3c3RhdHMtPnF1YWwucXVhbCA9IHByaXYtPnF1YWxpdHk7CisJd3N0YXRzLT5xdWFsLmxldmVsID0gYXZlcmFnZV92YWx1ZSgmcHJpdi0+YXZlcmFnZV9yc3NpKTsKKwl3c3RhdHMtPnF1YWwubm9pc2UgPSBhdmVyYWdlX3ZhbHVlKCZwcml2LT5hdmVyYWdlX25vaXNlKTsKKwl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9VUERBVEVEIHwgSVdfUVVBTF9MRVZFTF9VUERBVEVEIHwKKwkgICAgSVdfUVVBTF9OT0lTRV9VUERBVEVEOworCisJd3N0YXRzLT5taXNzLmJlYWNvbiA9IGF2ZXJhZ2VfdmFsdWUoJnByaXYtPmF2ZXJhZ2VfbWlzc2VkX2JlYWNvbnMpOworCXdzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzID0gcHJpdi0+bGFzdF90eF9mYWlsdXJlczsKKwl3c3RhdHMtPmRpc2NhcmQuY29kZSA9IHByaXYtPmllZWUtPmllZWVfc3RhdHMucnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZTsKKworLyoJaWYgKGlwd19nZXRfb3JkaW5hbChwcml2LCBJUFdfT1JEX1NUQVRfVFhfUkVUUlksICZ0eF9yZXRyeSwgJmxlbikpCisJZ290byBmYWlsX2dldF9vcmRpbmFsOworCXdzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzICs9IHR4X3JldHJ5OyAqLworCisJcmV0dXJuIHdzdGF0czsKK30KKworLyogbmV0IGRldmljZSBzdHVmZiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9zeXNfY29uZmlnKHN0cnVjdCBpcHdfc3lzX2NvbmZpZyAqc3lzX2NvbmZpZykKK3sKKwltZW1zZXQoc3lzX2NvbmZpZywgMCwgc2l6ZW9mKHN0cnVjdCBpcHdfc3lzX2NvbmZpZykpOworCXN5c19jb25maWctPmJ0X2NvZXhpc3RlbmNlID0gMTsJLyogV2UgbWF5IG5lZWQgdG8gbG9vayBpbnRvIHBydlN0YUJ0Q29uZmlnICovCisJc3lzX2NvbmZpZy0+YW5zd2VyX2Jyb2FkY2FzdF9zc2lkX3Byb2JlID0gMDsKKwlzeXNfY29uZmlnLT5hY2NlcHRfYWxsX2RhdGFfZnJhbWVzID0gMDsKKwlzeXNfY29uZmlnLT5hY2NlcHRfbm9uX2RpcmVjdGVkX2ZyYW1lcyA9IDE7CisJc3lzX2NvbmZpZy0+ZXhjbHVkZV91bmljYXN0X3VuZW5jcnlwdGVkID0gMDsKKwlzeXNfY29uZmlnLT5kaXNhYmxlX3VuaWNhc3RfZGVjcnlwdGlvbiA9IDE7CisJc3lzX2NvbmZpZy0+ZXhjbHVkZV9tdWx0aWNhc3RfdW5lbmNyeXB0ZWQgPSAwOworCXN5c19jb25maWctPmRpc2FibGVfbXVsdGljYXN0X2RlY3J5cHRpb24gPSAxOworCXN5c19jb25maWctPmFudGVubmFfZGl2ZXJzaXR5ID0gQ0ZHX1NZU19BTlRFTk5BX0JPVEg7CisJc3lzX2NvbmZpZy0+cGFzc19jcmNfdG9faG9zdCA9IDA7CS8qIFRPRE86IFNlZSBpZiAxIGdpdmVzIHVzIEZDUyAqLworCXN5c19jb25maWctPmRvdDExZ19hdXRvX2RldGVjdGlvbiA9IDA7CisJc3lzX2NvbmZpZy0+ZW5hYmxlX2N0c190b19zZWxmID0gMDsKKwlzeXNfY29uZmlnLT5idF9jb2V4aXN0X2NvbGxpc2lvbl90aHIgPSAwOworCXN5c19jb25maWctPnBhc3Nfbm9pc2Vfc3RhdHNfdG9faG9zdCA9IDE7Cit9CisKK3N0YXRpYyBpbnQgaXB3X25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlJUFdfREVCVUdfSU5GTygiZGV2LT5vcGVuXG4iKTsKKwkvKiB3ZSBzaG91bGQgYmUgdmVyaWZ5aW5nIHRoZSBkZXZpY2UgaXMgcmVhZHkgdG8gYmUgb3BlbmVkICovCisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JGX0tJTExfTUFTSykgJiYKKwkgICAgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKSkKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHdfbmV0X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlJUFdfREVCVUdfSU5GTygiZGV2LT5jbG9zZVxuIik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKgordG9kbzoKKworbW9kaWZ5IHRvIHNlbmQgb25lIHRmZCBwZXIgZnJhZ21lbnQgaW5zdGVhZCBvZiB1c2luZyBjaHVua2luZy4gIG90aGVyd2lzZQord2UgbmVlZCB0byBoZWF2aWx5IG1vZGlmeSB0aGUgaWVlZTgwMjExX3NrYl90b190eGIuCisqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaXB3X3R4X3NrYihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKQorCSAgICB0eGItPmZyYWdtZW50c1swXS0+ZGF0YTsKKwlpbnQgaSA9IDA7CisJc3RydWN0IHRmZF9mcmFtZSAqdGZkOworCXN0cnVjdCBjbHgyX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxWzBdOworCXN0cnVjdCBjbHgyX3F1ZXVlICpxID0gJnR4cS0+cTsKKwl1OCBpZCwgaGRyX2xlbiwgdW5pY2FzdDsKKwl1MTYgcmVtYWluaW5nX2J5dGVzOworCisJc3dpdGNoIChwcml2LT5pZWVlLT5pd19tb2RlKSB7CisJY2FzZSBJV19NT0RFX0FESE9DOgorCQloZHJfbGVuID0gSUVFRTgwMjExXzNBRERSX0xFTjsKKwkJdW5pY2FzdCA9ICFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSAmJgorCQkgICAgIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpOworCQlpZCA9IGlwd19maW5kX3N0YXRpb24ocHJpdiwgaGRyLT5hZGRyMSk7CisJCWlmIChpZCA9PSBJUFdfSU5WQUxJRF9TVEFUSU9OKSB7CisJCQlpZCA9IGlwd19hZGRfc3RhdGlvbihwcml2LCBoZHItPmFkZHIxKTsKKwkJCWlmIChpZCA9PSBJUFdfSU5WQUxJRF9TVEFUSU9OKSB7CisJCQkJSVBXX1dBUk5JTkcoIkF0dGVtcHQgdG8gc2VuZCBkYXRhIHRvICIKKwkJCQkJICAgICJpbnZhbGlkIGNlbGw6ICIgTUFDX0ZNVCAiXG4iLAorCQkJCQkgICAgTUFDX0FSRyhoZHItPmFkZHIxKSk7CisJCQkJZ290byBkcm9wOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBJV19NT0RFX0lORlJBOgorCWRlZmF1bHQ6CisJCXVuaWNhc3QgPSAhaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMykgJiYKKwkJICAgICFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIzKTsKKwkJaGRyX2xlbiA9IElFRUU4MDIxMV8zQUREUl9MRU47CisJCWlkID0gMDsKKwkJYnJlYWs7CisJfQorCisJdGZkID0gJnR4cS0+YmRbcS0+Zmlyc3RfZW1wdHldOworCXR4cS0+dHhiW3EtPmZpcnN0X2VtcHR5XSA9IHR4YjsKKwltZW1zZXQodGZkLCAwLCBzaXplb2YoKnRmZCkpOworCXRmZC0+dS5kYXRhLnN0YXRpb25fbnVtYmVyID0gaWQ7CisKKwl0ZmQtPmNvbnRyb2xfZmxhZ3MubWVzc2FnZV90eXBlID0gVFhfRlJBTUVfVFlQRTsKKwl0ZmQtPmNvbnRyb2xfZmxhZ3MuY29udHJvbF9iaXRzID0gVEZEX05FRURfSVJRX01BU0s7CisKKwl0ZmQtPnUuZGF0YS5jbWRfaWQgPSBESU5PX0NNRF9UWDsKKwl0ZmQtPnUuZGF0YS5sZW4gPSB0eGItPnBheWxvYWRfc2l6ZTsKKwlyZW1haW5pbmdfYnl0ZXMgPSB0eGItPnBheWxvYWRfc2l6ZTsKKwlpZiAodW5saWtlbHkoIXVuaWNhc3QpKQorCQl0ZmQtPnUuZGF0YS50eF9mbGFncyA9IERDVF9GTEFHX05PX1dFUDsKKwllbHNlCisJCXRmZC0+dS5kYXRhLnR4X2ZsYWdzID0gRENUX0ZMQUdfTk9fV0VQIHwgRENUX0ZMQUdfQUNLX1JFUUQ7CisKKwlpZiAocHJpdi0+YXNzb2NfcmVxdWVzdC5pZWVlX21vZGUgPT0gSVBXX0JfTU9ERSkKKwkJdGZkLT51LmRhdGEudHhfZmxhZ3NfZXh0ID0gRENUX0ZMQUdfRVhUX01PREVfQ0NLOworCWVsc2UKKwkJdGZkLT51LmRhdGEudHhfZmxhZ3NfZXh0ID0gRENUX0ZMQUdfRVhUX01PREVfT0ZETTsKKworCWlmIChwcml2LT5jb25maWcgJiBDRkdfUFJFQU1CTEUpCisJCXRmZC0+dS5kYXRhLnR4X2ZsYWdzIHw9IERDVF9GTEFHX1NIT1JUX1BSRU1CTDsKKworCW1lbWNweSgmdGZkLT51LmRhdGEudGZkLnRmZF8yNC5tY2hkciwgaGRyLCBoZHJfbGVuKTsKKworCS8qIHBheWxvYWQgKi8KKwl0ZmQtPnUuZGF0YS5udW1fY2h1bmtzID0gbWluKCh1OCkgKE5VTV9URkRfQ0hVTktTIC0gMiksIHR4Yi0+bnJfZnJhZ3MpOworCWZvciAoaSA9IDA7IGkgPCB0ZmQtPnUuZGF0YS5udW1fY2h1bmtzOyBpKyspIHsKKwkJSVBXX0RFQlVHX1RYKCJEdW1waW5nIFRYIHBhY2tldCBmcmFnICVpIG9mICVpICglZCBieXRlcyk6XG4iLAorCQkJICAgICBpLCB0ZmQtPnUuZGF0YS5udW1fY2h1bmtzLAorCQkJICAgICB0eGItPmZyYWdtZW50c1tpXS0+bGVuIC0gaGRyX2xlbik7CisJCXByaW50a19idWYoSVBXX0RMX1RYLCB0eGItPmZyYWdtZW50c1tpXS0+ZGF0YSArIGhkcl9sZW4sCisJCQkgICB0eGItPmZyYWdtZW50c1tpXS0+bGVuIC0gaGRyX2xlbik7CisKKwkJdGZkLT51LmRhdGEuY2h1bmtfcHRyW2ldID0KKwkJICAgIHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsCisJCQkJICAgdHhiLT5mcmFnbWVudHNbaV0tPmRhdGEgKyBoZHJfbGVuLAorCQkJCSAgIHR4Yi0+ZnJhZ21lbnRzW2ldLT5sZW4gLSBoZHJfbGVuLAorCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl0ZmQtPnUuZGF0YS5jaHVua19sZW5baV0gPSB0eGItPmZyYWdtZW50c1tpXS0+bGVuIC0gaGRyX2xlbjsKKwl9CisKKwlpZiAoaSAhPSB0eGItPm5yX2ZyYWdzKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXUxNiByZW1haW5pbmdfYnl0ZXMgPSAwOworCQlpbnQgajsKKworCQlmb3IgKGogPSBpOyBqIDwgdHhiLT5ucl9mcmFnczsgaisrKQorCQkJcmVtYWluaW5nX2J5dGVzICs9IHR4Yi0+ZnJhZ21lbnRzW2pdLT5sZW4gLSBoZHJfbGVuOworCisJCXByaW50ayhLRVJOX0lORk8gIlRyeWluZyB0byByZWFsbG9jYXRlIGZvciAlZCBieXRlc1xuIiwKKwkJICAgICAgIHJlbWFpbmluZ19ieXRlcyk7CisJCXNrYiA9IGFsbG9jX3NrYihyZW1haW5pbmdfYnl0ZXMsIEdGUF9BVE9NSUMpOworCQlpZiAoc2tiICE9IE5VTEwpIHsKKwkJCXRmZC0+dS5kYXRhLmNodW5rX2xlbltpXSA9IHJlbWFpbmluZ19ieXRlczsKKwkJCWZvciAoaiA9IGk7IGogPCB0eGItPm5yX2ZyYWdzOyBqKyspIHsKKwkJCQlpbnQgc2l6ZSA9IHR4Yi0+ZnJhZ21lbnRzW2pdLT5sZW4gLSBoZHJfbGVuOworCQkJCXByaW50ayhLRVJOX0lORk8gIkFkZGluZyBmcmFnICVkICVkLi4uXG4iLAorCQkJCSAgICAgICBqLCBzaXplKTsKKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIHNpemUpLAorCQkJCSAgICAgICB0eGItPmZyYWdtZW50c1tqXS0+ZGF0YSArIGhkcl9sZW4sIHNpemUpOworCQkJfQorCQkJZGV2X2tmcmVlX3NrYl9hbnkodHhiLT5mcmFnbWVudHNbaV0pOworCQkJdHhiLT5mcmFnbWVudHNbaV0gPSBza2I7CisJCQl0ZmQtPnUuZGF0YS5jaHVua19wdHJbaV0gPQorCQkJICAgIHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgdGZkLT51LmRhdGEuY2h1bmtfbGVuW2ldLAorCQkJCQkgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCXRmZC0+dS5kYXRhLm51bV9jaHVua3MrKzsKKwkJfQorCX0KKworCS8qIGtpY2sgRE1BICovCisJcS0+Zmlyc3RfZW1wdHkgPSBpcHdfcXVldWVfaW5jX3dyYXAocS0+Zmlyc3RfZW1wdHksIHEtPm5fYmQpOworCWlwd193cml0ZTMyKHByaXYsIHEtPnJlZ193LCBxLT5maXJzdF9lbXB0eSk7CisKKwlpZiAoaXB3X3F1ZXVlX3NwYWNlKHEpIDwgcS0+aGlnaF9tYXJrKQorCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldF9kZXYpOworCisJcmV0dXJuOworCisgICAgICBkcm9wOgorCUlQV19ERUJVR19EUk9QKCJTaWxlbnRseSBkcm9wcGluZyBUeCBwYWNrZXQuXG4iKTsKKwlpZWVlODAyMTFfdHhiX2ZyZWUodHhiKTsKK30KKworc3RhdGljIGludCBpcHdfbmV0X2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLAorCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJSVBXX0RFQlVHX1RYKCJkZXYtPnhtaXQoJWQgYnl0ZXMpXG4iLCB0eGItPnBheWxvYWRfc2l6ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0FTU09DSUFURUQpKSB7CisJCUlQV19ERUJVR19JTkZPKCJUeCBhdHRlbXB0IHdoaWxlIG5vdCBhc3NvY2lhdGVkLlxuIik7CisJCXByaXYtPmllZWUtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJZ290byBmYWlsX3VubG9jazsKKwl9CisKKwlpcHdfdHhfc2tiKHByaXYsIHR4Yik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7CisKKyAgICAgIGZhaWxfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppcHdfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlwcml2LT5pZWVlLT5zdGF0cy50eF9wYWNrZXRzID0gcHJpdi0+dHhfcGFja2V0czsKKwlwcml2LT5pZWVlLT5zdGF0cy5yeF9wYWNrZXRzID0gcHJpdi0+cnhfcGFja2V0czsKKwlyZXR1cm4gJnByaXYtPmllZWUtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBpcHdfbmV0X3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCit9CisKK3N0YXRpYyBpbnQgaXB3X25ldF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJcHJpdi0+Y29uZmlnIHw9IENGR19DVVNUT01fTUFDOworCW1lbWNweShwcml2LT5tYWNfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZXR0aW5nIE1BQyB0byAiIE1BQ19GTVQgIlxuIiwKKwkgICAgICAgcHJpdi0+bmV0X2Rldi0+bmFtZSwgTUFDX0FSRyhwcml2LT5tYWNfYWRkcikpOworCWlwd19hZGFwdGVyX3Jlc3RhcnQocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwd19ldGh0b29sX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGlwd19wcml2ICpwID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwljaGFyIHZlcnNbNjRdOworCWNoYXIgZGF0ZVszMl07CisJdTMyIGxlbjsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCisJbGVuID0gc2l6ZW9mKHZlcnMpOworCWlwd19nZXRfb3JkaW5hbChwLCBJUFdfT1JEX1NUQVRfRldfVkVSU0lPTiwgdmVycywgJmxlbik7CisJbGVuID0gc2l6ZW9mKGRhdGUpOworCWlwd19nZXRfb3JkaW5hbChwLCBJUFdfT1JEX1NUQVRfRldfREFURSwgZGF0ZSwgJmxlbik7CisKKwlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksICIlcyAoJXMpIiwKKwkJIHZlcnMsIGRhdGUpOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocC0+cGNpX2RldikpOworCWluZm8tPmVlZHVtcF9sZW4gPSBDWDJfRUVQUk9NX0lNQUdFX1NJWkU7Cit9CisKK3N0YXRpYyB1MzIgaXB3X2V0aHRvb2xfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXJldHVybiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX0FTU09DSUFURUQpICE9IDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X2V0aHRvb2xfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gQ1gyX0VFUFJPTV9JTUFHRV9TSVpFOworfQorCitzdGF0aWMgaW50IGlwd19ldGh0b29sX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqIGJ5dGVzKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcCA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZiAoZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbiA+IENYMl9FRVBST01fSU1BR0VfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkoYnl0ZXMsICYoKHU4ICopIHAtPmVlcHJvbSlbZWVwcm9tLT5vZmZzZXRdLCBlZXByb20tPmxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X2V0aHRvb2xfc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICogYnl0ZXMpCit7CisJc3RydWN0IGlwd19wcml2ICpwID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWlmIChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuID4gQ1gyX0VFUFJPTV9JTUFHRV9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbWNweSgmKCh1OCAqKSBwLT5lZXByb20pW2VlcHJvbS0+b2Zmc2V0XSwgYnl0ZXMsIGVlcHJvbS0+bGVuKTsKKwlmb3IgKGkgPSBJUFdfRUVQUk9NX0RBVEE7CisJICAgICBpIDwgSVBXX0VFUFJPTV9EQVRBICsgQ1gyX0VFUFJPTV9JTUFHRV9TSVpFOyBpKyspCisJCWlwd193cml0ZTgocCwgaSwgcC0+ZWVwcm9tW2ldKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGlwd19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2xpbmsJPSBpcHdfZXRodG9vbF9nZXRfbGluaywKKwkuZ2V0X2RydmluZm8JPSBpcHdfZXRodG9vbF9nZXRfZHJ2aW5mbywKKwkuZ2V0X2VlcHJvbV9sZW4JPSBpcHdfZXRodG9vbF9nZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X2VlcHJvbQk9IGlwd19ldGh0b29sX2dldF9lZXByb20sCisJLnNldF9lZXByb20JPSBpcHdfZXRodG9vbF9zZXRfZWVwcm9tLAorfTsKKworc3RhdGljIGlycXJldHVybl90IGlwd19pc3IoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gZGF0YTsKKwl1MzIgaW50YSwgaW50YV9tYXNrOworCisJaWYgKCFwcml2KQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCisJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0lOVF9FTkFCTEVEKSkgeworCQkvKiBTaGFyZWQgSVJRICovCisJCWdvdG8gbm9uZTsKKwl9CisKKwlpbnRhID0gaXB3X3JlYWQzMihwcml2LCBDWDJfSU5UQV9SVyk7CisJaW50YV9tYXNrID0gaXB3X3JlYWQzMihwcml2LCBDWDJfSU5UQV9NQVNLX1IpOworCisJaWYgKGludGEgPT0gMHhGRkZGRkZGRikgeworCQkvKiBIYXJkd2FyZSBkaXNhcHBlYXJlZCAqLworCQlJUFdfV0FSTklORygiSVJRIElOVEEgPT0gMHhGRkZGRkZGRlxuIik7CisJCWdvdG8gbm9uZTsKKwl9CisKKwlpZiAoIShpbnRhICYgKENYMl9JTlRBX01BU0tfQUxMICYgaW50YV9tYXNrKSkpIHsKKwkJLyogU2hhcmVkIGludGVycnVwdCAqLworCQlnb3RvIG5vbmU7CisJfQorCisJLyogdGVsbCB0aGUgZGV2aWNlIHRvIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzICovCisJaXB3X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKKworCS8qIGFjayBjdXJyZW50IGludGVycnVwdHMgKi8KKwlpbnRhICY9IChDWDJfSU5UQV9NQVNLX0FMTCAmIGludGFfbWFzayk7CisJaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0lOVEFfUlcsIGludGEpOworCisJLyogQ2FjaGUgSU5UQSB2YWx1ZSBmb3Igb3VyIHRhc2tsZXQgKi8KKwlwcml2LT5pc3JfaW50YSA9IGludGE7CisKKwl0YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfdGFza2xldCk7CisKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgICBub25lOgorCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkIGlwd19yZl9raWxsKHZvaWQgKmFkYXB0ZXIpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gYWRhcHRlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChyZl9raWxsX2FjdGl2ZShwcml2KSkgeworCQlJUFdfREVCVUdfUkZfS0lMTCgiUkYgS2lsbCBhY3RpdmUsIHJlc2NoZWR1bGluZyBHUElPIGNoZWNrXG4iKTsKKwkJaWYgKHByaXYtPndvcmtxdWV1ZSkKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsCisJCQkJCSAgICZwcml2LT5yZl9raWxsLCAyICogSFopOworCQlnb3RvIGV4aXRfdW5sb2NrOworCX0KKworCS8qIFJGIEtpbGwgaXMgbm93IGRpc2FibGVkLCBzbyBicmluZyB0aGUgZGV2aWNlIGJhY2sgdXAgKi8KKworCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRl9LSUxMX01BU0spKSB7CisJCUlQV19ERUJVR19SRl9LSUxMKCJIVyBSRiBLaWxsIG5vIGxvbmdlciBhY3RpdmUsIHJlc3RhcnRpbmcgIgorCQkJCSAgImRldmljZVxuIik7CisKKwkJLyogd2UgY2FuIG5vdCBkbyBhbiBhZGFwdGVyIHJlc3RhcnQgd2hpbGUgaW5zaWRlIGFuIGlycSBsb2NrICovCisJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+YWRhcHRlcl9yZXN0YXJ0KTsKKwl9IGVsc2UKKwkJSVBXX0RFQlVHX1JGX0tJTEwoIkhXIFJGIEtpbGwgZGVhY3RpdmF0ZWQuICBTVyBSRiBLaWxsIHN0aWxsICIKKwkJCQkgICJlbmFibGVkXG4iKTsKKworICAgICAgZXhpdF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGlwd19zZXR1cF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByaXYtPndvcmtxdWV1ZSA9IGNyZWF0ZV93b3JrcXVldWUoRFJWX05BTUUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7CisKKwlJTklUX1dPUksoJnByaXYtPmFkaG9jX2NoZWNrLCBpcHdfYWRob2NfY2hlY2ssIHByaXYpOworCUlOSVRfV09SSygmcHJpdi0+YXNzb2NpYXRlLCBpcHdfYXNzb2NpYXRlLCBwcml2KTsKKwlJTklUX1dPUksoJnByaXYtPmRpc2Fzc29jaWF0ZSwgaXB3X2Rpc2Fzc29jaWF0ZSwgcHJpdik7CisJSU5JVF9XT1JLKCZwcml2LT5yeF9yZXBsZW5pc2gsIGlwd19yeF9xdWV1ZV9yZXBsZW5pc2gsIHByaXYpOworCUlOSVRfV09SSygmcHJpdi0+YWRhcHRlcl9yZXN0YXJ0LCBpcHdfYWRhcHRlcl9yZXN0YXJ0LCBwcml2KTsKKwlJTklUX1dPUksoJnByaXYtPnJmX2tpbGwsIGlwd19yZl9raWxsLCBwcml2KTsKKwlJTklUX1dPUksoJnByaXYtPnVwLCAodm9pZCAoKikodm9pZCAqKSlpcHdfdXAsIHByaXYpOworCUlOSVRfV09SSygmcHJpdi0+ZG93biwgKHZvaWQgKCopKHZvaWQgKikpaXB3X2Rvd24sIHByaXYpOworCUlOSVRfV09SSygmcHJpdi0+cmVxdWVzdF9zY2FuLAorCQkgICh2b2lkICgqKSh2b2lkICopKWlwd19yZXF1ZXN0X3NjYW4sIHByaXYpOworCUlOSVRfV09SSygmcHJpdi0+Z2F0aGVyX3N0YXRzLAorCQkgICh2b2lkICgqKSh2b2lkICopKWlwd19nYXRoZXJfc3RhdHMsIHByaXYpOworCUlOSVRfV09SSygmcHJpdi0+YWJvcnRfc2NhbiwgKHZvaWQgKCopKHZvaWQgKikpaXB3X2Fib3J0X3NjYW4sIHByaXYpOworCUlOSVRfV09SSygmcHJpdi0+cm9hbSwgaXB3X3JvYW0sIHByaXYpOworCUlOSVRfV09SSygmcHJpdi0+c2Nhbl9jaGVjaywgaXB3X3NjYW5fY2hlY2ssIHByaXYpOworCisJdGFza2xldF9pbml0KCZwcml2LT5pcnFfdGFza2xldCwgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKQorCQkgICAgIGlwd19pcnFfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcHJpdik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzaGltX19zZXRfc2VjdXJpdHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5ICpzZWMpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHNlYy0+ZmxhZ3MgJiAoMSA8PCBpKSkgeworCQkJcHJpdi0+c2VjLmtleV9zaXplc1tpXSA9IHNlYy0+a2V5X3NpemVzW2ldOworCQkJaWYgKHNlYy0+a2V5X3NpemVzW2ldID09IDApCisJCQkJcHJpdi0+c2VjLmZsYWdzICY9IH4oMSA8PCBpKTsKKwkJCWVsc2UKKwkJCQltZW1jcHkocHJpdi0+c2VjLmtleXNbaV0sIHNlYy0+a2V5c1tpXSwKKwkJCQkgICAgICAgc2VjLT5rZXlfc2l6ZXNbaV0pOworCQkJcHJpdi0+c2VjLmZsYWdzIHw9ICgxIDw8IGkpOworCQkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19TRUNVUklUWV9VUERBVEVEOworCQl9CisJfQorCisJaWYgKChzZWMtPmZsYWdzICYgU0VDX0FDVElWRV9LRVkpICYmCisJICAgIHByaXYtPnNlYy5hY3RpdmVfa2V5ICE9IHNlYy0+YWN0aXZlX2tleSkgeworCQlpZiAoc2VjLT5hY3RpdmVfa2V5IDw9IDMpIHsKKwkJCXByaXYtPnNlYy5hY3RpdmVfa2V5ID0gc2VjLT5hY3RpdmVfa2V5OworCQkJcHJpdi0+c2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworCQl9IGVsc2UKKwkJCXByaXYtPnNlYy5mbGFncyAmPSB+U0VDX0FDVElWRV9LRVk7CisJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfU0VDVVJJVFlfVVBEQVRFRDsKKwl9CisKKwlpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQVVUSF9NT0RFKSAmJgorCSAgICAocHJpdi0+c2VjLmF1dGhfbW9kZSAhPSBzZWMtPmF1dGhfbW9kZSkpIHsKKwkJcHJpdi0+c2VjLmF1dGhfbW9kZSA9IHNlYy0+YXV0aF9tb2RlOworCQlwcml2LT5zZWMuZmxhZ3MgfD0gU0VDX0FVVEhfTU9ERTsKKwkJaWYgKHNlYy0+YXV0aF9tb2RlID09IFdMQU5fQVVUSF9TSEFSRURfS0VZKQorCQkJcHJpdi0+Y2FwYWJpbGl0eSB8PSBDQVBfU0hBUkVEX0tFWTsKKwkJZWxzZQorCQkJcHJpdi0+Y2FwYWJpbGl0eSAmPSB+Q0FQX1NIQVJFRF9LRVk7CisJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfU0VDVVJJVFlfVVBEQVRFRDsKKwl9CisKKwlpZiAoc2VjLT5mbGFncyAmIFNFQ19FTkFCTEVEICYmIHByaXYtPnNlYy5lbmFibGVkICE9IHNlYy0+ZW5hYmxlZCkgeworCQlwcml2LT5zZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CisJCXByaXYtPnNlYy5lbmFibGVkID0gc2VjLT5lbmFibGVkOworCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1NFQ1VSSVRZX1VQREFURUQ7CisJCWlmIChzZWMtPmVuYWJsZWQpCisJCQlwcml2LT5jYXBhYmlsaXR5IHw9IENBUF9QUklWQUNZX09OOworCQllbHNlCisJCQlwcml2LT5jYXBhYmlsaXR5ICY9IH5DQVBfUFJJVkFDWV9PTjsKKwl9CisKKwlpZiAoc2VjLT5mbGFncyAmIFNFQ19MRVZFTCAmJiBwcml2LT5zZWMubGV2ZWwgIT0gc2VjLT5sZXZlbCkgeworCQlwcml2LT5zZWMubGV2ZWwgPSBzZWMtPmxldmVsOworCQlwcml2LT5zZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1NFQ1VSSVRZX1VQREFURUQ7CisJfQorCisJLyogVG8gbWF0Y2ggY3VycmVudCBmdW5jdGlvbmFsaXR5IG9mIGlwdzIxMDAgKHdoaWNoIHdvcmtzIHdlbGwgdy8KKwkgKiB2YXJpb3VzIHN1cHBsaWNhbnRzLCB3ZSBkb24ndCBmb3JjZSBhIGRpc2Fzc29jaWF0ZSBpZiB0aGUKKwkgKiBwcml2YWN5IGNhcGFiaWxpdHkgY2hhbmdlcyAuLi4gKi8KKyNpZiAwCisJaWYgKChwcml2LT5zdGF0dXMgJiAoU1RBVFVTX0FTU09DSUFURUQgfCBTVEFUVVNfQVNTT0NJQVRJTkcpKSAmJgorCSAgICAoKChwcml2LT5hc3NvY19yZXF1ZXN0LmNhcGFiaWxpdHkgJgorCSAgICAgICBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgJiYgIXNlYy0+ZW5hYmxlZCkgfHwKKwkgICAgICghKHByaXYtPmFzc29jX3JlcXVlc3QuY2FwYWJpbGl0eSAmCisJCVdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKSAmJiBzZWMtPmVuYWJsZWQpKSkgeworCQlJUFdfREVCVUdfQVNTT0MoIkRpc2Fzc29jaWF0aW5nIGR1ZSB0byBjYXBhYmlsaXR5ICIKKwkJCQkiY2hhbmdlLlxuIik7CisJCWlwd19kaXNhc3NvY2lhdGUocHJpdik7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgaW5pdF9zdXBwb3J0ZWRfcmF0ZXMoc3RydWN0IGlwd19wcml2ICpwcml2LAorCQkJCXN0cnVjdCBpcHdfc3VwcG9ydGVkX3JhdGVzICpyYXRlcykKK3sKKwkvKiBUT0RPOiBNYXNrIG91dCByYXRlcyBiYXNlZCBvbiBwcml2LT5yYXRlc19tYXNrICovCisKKwltZW1zZXQocmF0ZXMsIDAsIHNpemVvZigqcmF0ZXMpKTsKKwkvKiBjb25maWd1cmUgc3VwcG9ydGVkIHJhdGVzICovCisJc3dpdGNoIChwcml2LT5pZWVlLT5mcmVxX2JhbmQpIHsKKwljYXNlIElFRUU4MDIxMV81MkdIWl9CQU5EOgorCQlyYXRlcy0+aWVlZV9tb2RlID0gSVBXX0FfTU9ERTsKKwkJcmF0ZXMtPnB1cnBvc2UgPSBJUFdfUkFURV9DQVBBQklMSVRJRVM7CisJCWlwd19hZGRfb2ZkbV9zY2FuX3JhdGVzKHJhdGVzLCBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04sCisJCQkJCUlFRUU4MDIxMV9PRkRNX0RFRkFVTFRfUkFURVNfTUFTSyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8qIE1peGVkIG9yIDIuNEdoeiAqLworCQlyYXRlcy0+aWVlZV9tb2RlID0gSVBXX0dfTU9ERTsKKwkJcmF0ZXMtPnB1cnBvc2UgPSBJUFdfUkFURV9DQVBBQklMSVRJRVM7CisJCWlwd19hZGRfY2NrX3NjYW5fcmF0ZXMocmF0ZXMsIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiwKKwkJCQkgICAgICAgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0spOworCQlpZiAocHJpdi0+aWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pIHsKKwkJCWlwd19hZGRfb2ZkbV9zY2FuX3JhdGVzKHJhdGVzLCBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04sCisJCQkJCQlJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0spOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd19jb25maWcoc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCWludCBpOworCXN0cnVjdCBpcHdfdHhfcG93ZXIgdHhfcG93ZXI7CisKKwltZW1zZXQoJnByaXYtPnN5c19jb25maWcsIDAsIHNpemVvZihwcml2LT5zeXNfY29uZmlnKSk7CisJbWVtc2V0KCZ0eF9wb3dlciwgMCwgc2l6ZW9mKHR4X3Bvd2VyKSk7CisKKwkvKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gaXB3X3VwLCB3aGljaCByZXNldHMvcmVsb2FkcyB0aGUgZmlybXdhcmUKKwkgICBzbywgd2UgZG9uJ3QgbmVlZCB0byBmaXJzdCBkaXNhYmxlIHRoZSBjYXJkIGJlZm9yZSB3ZSBjb25maWd1cmUKKwkgICBpdCAqLworCisJLyogY29uZmlndXJlIGRldmljZSBmb3IgJ0cnIGJhbmQgKi8KKwl0eF9wb3dlci5pZWVlX21vZGUgPSBJUFdfR19NT0RFOworCXR4X3Bvd2VyLm51bV9jaGFubmVscyA9IDExOworCWZvciAoaSA9IDA7IGkgPCAxMTsgaSsrKSB7CisJCXR4X3Bvd2VyLmNoYW5uZWxzX3R4X3Bvd2VyW2ldLmNoYW5uZWxfbnVtYmVyID0gaSArIDE7CisJCXR4X3Bvd2VyLmNoYW5uZWxzX3R4X3Bvd2VyW2ldLnR4X3Bvd2VyID0gcHJpdi0+dHhfcG93ZXI7CisJfQorCWlmIChpcHdfc2VuZF90eF9wb3dlcihwcml2LCAmdHhfcG93ZXIpKQorCQlnb3RvIGVycm9yOworCisJLyogY29uZmlndXJlIGRldmljZSB0byBhbHNvIGhhbmRsZSAnQicgYmFuZCAqLworCXR4X3Bvd2VyLmllZWVfbW9kZSA9IElQV19CX01PREU7CisJaWYgKGlwd19zZW5kX3R4X3Bvd2VyKHByaXYsICZ0eF9wb3dlcikpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBpbml0aWFsaXplIGFkYXB0ZXIgYWRkcmVzcyAqLworCWlmIChpcHdfc2VuZF9hZGFwdGVyX2FkZHJlc3MocHJpdiwgcHJpdi0+bmV0X2Rldi0+ZGV2X2FkZHIpKQorCQlnb3RvIGVycm9yOworCisJLyogc2V0IGJhc2ljIHN5c3RlbSBjb25maWcgc2V0dGluZ3MgKi8KKwlpbml0X3N5c19jb25maWcoJnByaXYtPnN5c19jb25maWcpOworCWlmIChpcHdfc2VuZF9zeXN0ZW1fY29uZmlnKHByaXYsICZwcml2LT5zeXNfY29uZmlnKSkKKwkJZ290byBlcnJvcjsKKworCWluaXRfc3VwcG9ydGVkX3JhdGVzKHByaXYsICZwcml2LT5yYXRlcyk7CisJaWYgKGlwd19zZW5kX3N1cHBvcnRlZF9yYXRlcyhwcml2LCAmcHJpdi0+cmF0ZXMpKQorCQlnb3RvIGVycm9yOworCisJLyogU2V0IHJlcXVlc3QtdG8tc2VuZCB0aHJlc2hvbGQgKi8KKwlpZiAocHJpdi0+cnRzX3RocmVzaG9sZCkgeworCQlpZiAoaXB3X3NlbmRfcnRzX3RocmVzaG9sZChwcml2LCBwcml2LT5ydHNfdGhyZXNob2xkKSkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGlwd19zZXRfcmFuZG9tX3NlZWQocHJpdikpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBmaW5hbCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoZSBSVU4gc3RhdGUgKi8KKwlpZiAoaXB3X3NlbmRfaG9zdF9jb21wbGV0ZShwcml2KSkKKwkJZ290byBlcnJvcjsKKworCS8qIElmIGNvbmZpZ3VyZWQgdG8gdHJ5IGFuZCBhdXRvLWFzc29jaWF0ZSwga2ljayBvZmYgYSBzY2FuICovCisJaWYgKChwcml2LT5jb25maWcgJiBDRkdfQVNTT0NJQVRFKSAmJiBpcHdfcmVxdWVzdF9zY2FuKHByaXYpKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CisKKyAgICAgIGVycm9yOgorCXJldHVybiAtRUlPOworfQorCisjZGVmaW5lIE1BWF9IV19SRVNUQVJUUyA1CitzdGF0aWMgaW50IGlwd191cChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCit7CisJaW50IHJjLCBpOworCisJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19FWElUX1BFTkRJTkcpCisJCXJldHVybiAtRUlPOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9IV19SRVNUQVJUUzsgaSsrKSB7CisJCS8qIExvYWQgdGhlIG1pY3JvY29kZSwgZmlybXdhcmUsIGFuZCBlZXByb20uCisJCSAqIEFsc28gc3RhcnQgdGhlIGNsb2Nrcy4gKi8KKwkJcmMgPSBpcHdfbG9hZChwcml2KTsKKwkJaWYgKHJjKSB7CisJCQlJUFdfRVJST1IoIlVuYWJsZSB0byBsb2FkIGZpcm13YXJlOiAweCUwOFhcbiIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCWlwd19pbml0X29yZGluYWxzKHByaXYpOworCQlpZiAoIShwcml2LT5jb25maWcgJiBDRkdfQ1VTVE9NX01BQykpCisJCQllZXByb21fcGFyc2VfbWFjKHByaXYsIHByaXYtPm1hY19hZGRyKTsKKwkJbWVtY3B5KHByaXYtPm5ldF9kZXYtPmRldl9hZGRyLCBwcml2LT5tYWNfYWRkciwgRVRIX0FMRU4pOworCisJCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfUkZfS0lMTF9NQVNLKQorCQkJcmV0dXJuIDA7CisKKwkJcmMgPSBpcHdfY29uZmlnKHByaXYpOworCQlpZiAoIXJjKSB7CisJCQlJUFdfREVCVUdfSU5GTygiQ29uZmlndXJlZCBkZXZpY2Ugb24gY291bnQgJWlcbiIsIGkpOworCQkJcHJpdi0+bm90aWZfbWlzc2VkX2JlYWNvbnMgPSAwOworCQkJbmV0aWZfc3RhcnRfcXVldWUocHJpdi0+bmV0X2Rldik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCUlQV19ERUJVR19JTkZPKCJEZXZpY2UgY29uZmlndXJhdGlvbiBmYWlsZWQ6IDB4JTA4WFxuIiwKKwkJCQkgICAgICAgcmMpOworCQl9CisKKwkJSVBXX0RFQlVHX0lORk8oIkZhaWxlZCB0byBjb25maWcgZGV2aWNlIG9uIHJldHJ5ICVkIG9mICVkXG4iLAorCQkJICAgICAgIGksIE1BWF9IV19SRVNUQVJUUyk7CisKKwkJLyogV2UgaGFkIGFuIGVycm9yIGJyaW5naW5nIHVwIHRoZSBoYXJkd2FyZSwgc28gdGFrZSBpdAorCQkgKiBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLworCQlpcHdfZG93bihwcml2KTsKKwl9CisKKwkvKiB0cmllZCB0byByZXN0YXJ0IGFuZCBjb25maWcgdGhlIGRldmljZSBmb3IgYXMgbG9uZyBhcyBvdXIKKwkgKiBwYXRpZW5jZSBjb3VsZCB3aXRoc3RhbmQgKi8KKwlJUFdfRVJST1IoIlVuYWJsZSB0byBpbml0aWFsaXplIGRldmljZSBhZnRlciAlZCBhdHRlbXB0cy5cbiIsIGkpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgdm9pZCBpcHdfZG93bihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCit7CisJLyogQXR0ZW1wdCB0byBkaXNhYmxlIHRoZSBjYXJkICovCisjaWYgMAorCWlwd19zZW5kX2NhcmRfZGlzYWJsZShwcml2LCAwKTsKKyNlbmRpZgorCisJLyogdGVsbCB0aGUgZGV2aWNlIHRvIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzICovCisJaXB3X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKKworCS8qIENsZWFyIGFsbCBiaXRzIGJ1dCB0aGUgUkYgS2lsbCAqLworCXByaXYtPnN0YXR1cyAmPSBTVEFUVVNfUkZfS0lMTF9NQVNLOworCisJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+bmV0X2Rldik7CisJbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRfZGV2KTsKKworCWlwd19zdG9wX25pYyhwcml2KTsKK30KKworLyogQ2FsbGVkIGJ5IHJlZ2lzdGVyX25ldGRldigpICovCitzdGF0aWMgaW50IGlwd19uZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JGX0tJTExfU1cpIHsKKwkJSVBXX1dBUk5JTkcoIlJhZGlvIGRpc2FibGVkIGJ5IG1vZHVsZSBwYXJhbWV0ZXIuXG4iKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChyZl9raWxsX2FjdGl2ZShwcml2KSkgeworCQlJUFdfV0FSTklORygiUmFkaW8gRnJlcXVlbmN5IEtpbGwgU3dpdGNoIGlzIE9uOlxuIgorCQkJICAgICJLaWxsIHN3aXRjaCBtdXN0IGJlIHR1cm5lZCBvZmYgZm9yICIKKwkJCSAgICAid2lyZWxlc3MgbmV0d29ya2luZyB0byB3b3JrLlxuIik7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLCAyICogSFopOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaXB3X3VwKHByaXYpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisvKiBQQ0kgZHJpdmVyIHN0dWZmICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FyZF9pZHNbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMDQzLCAweDgwODYsIDB4MjcwMSwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIDB4MTA0MywgMHg4MDg2LCAweDI3MDIsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwNDMsIDB4ODA4NiwgMHgyNzExLCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMDQzLCAweDgwODYsIDB4MjcxMiwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIDB4MTA0MywgMHg4MDg2LCAweDI3MjEsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwNDMsIDB4ODA4NiwgMHgyNzIyLCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMDQzLCAweDgwODYsIDB4MjczMSwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIDB4MTA0MywgMHg4MDg2LCAweDI3MzIsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwNDMsIDB4ODA4NiwgMHgyNzQxLCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMDQzLCAweDEwM2MsIDB4Mjc0MSwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIDB4MTA0MywgMHg4MDg2LCAweDI3NDIsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwNDMsIDB4ODA4NiwgMHgyNzUxLCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMDQzLCAweDgwODYsIDB4Mjc1MiwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIDB4MTA0MywgMHg4MDg2LCAweDI3NTMsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwNDMsIDB4ODA4NiwgMHgyNzU0LCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMDQzLCAweDgwODYsIDB4Mjc2MSwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIDB4MTA0MywgMHg4MDg2LCAweDI3NjIsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwNGYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDQyMjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAkvKiBCRyAqLworCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDQyMjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAkvKiAyMjI1QkcgKi8KKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg0MjIzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwJLyogQUJHICovCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIDB4NDIyNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCS8qIEFCRyAqLworCisJLyogcmVxdWlyZWQgbGFzdCBlbnRyeSAqLworCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjYXJkX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppcHdfc3lzZnNfZW50cmllc1tdID0geworCSZkZXZfYXR0cl9yZl9raWxsLmF0dHIsCisJJmRldl9hdHRyX2RpcmVjdF9kd29yZC5hdHRyLAorCSZkZXZfYXR0cl9pbmRpcmVjdF9ieXRlLmF0dHIsCisJJmRldl9hdHRyX2luZGlyZWN0X2R3b3JkLmF0dHIsCisJJmRldl9hdHRyX21lbV9ncGlvX3JlZy5hdHRyLAorCSZkZXZfYXR0cl9jb21tYW5kX2V2ZW50X3JlZy5hdHRyLAorCSZkZXZfYXR0cl9uaWNfdHlwZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKKwkmZGV2X2F0dHJfY2ZnLmF0dHIsCisJJmRldl9hdHRyX2R1bXBfZXJyb3JzLmF0dHIsCisJJmRldl9hdHRyX2R1bXBfZXZlbnRzLmF0dHIsCisJJmRldl9hdHRyX2VlcHJvbV9kZWxheS5hdHRyLAorCSZkZXZfYXR0cl91Y29kZV92ZXJzaW9uLmF0dHIsCisJJmRldl9hdHRyX3J0Yy5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlwd19hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBOVUxMLAkJLyogcHV0IGluIGRldmljZSBkaXJlY3RvcnkgKi8KKwkuYXR0cnMgPSBpcHdfc3lzZnNfZW50cmllcywKK307CisKK3N0YXRpYyBpbnQgaXB3X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdTMyIGxlbmd0aCwgdmFsOworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdjsKKwlpbnQgYmFuZCwgbW9kdWxhdGlvbjsKKworCW5ldF9kZXYgPSBhbGxvY19pZWVlODAyMTEoc2l6ZW9mKHN0cnVjdCBpcHdfcHJpdikpOworCWlmIChuZXRfZGV2ID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJpdiA9IGllZWU4MDIxMV9wcml2KG5ldF9kZXYpOworCXByaXYtPmllZWUgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKKwlwcml2LT5uZXRfZGV2ID0gbmV0X2RldjsKKwlwcml2LT5wY2lfZGV2ID0gcGRldjsKKyNpZmRlZiBDT05GSUdfSVBXX0RFQlVHCisJaXB3X2RlYnVnX2xldmVsID0gZGVidWc7CisjZW5kaWYKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZnJlZV9pZWVlODAyMTE7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwlpZiAoIWVycikKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIpOworCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOworCisJLyogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAorCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg0MCwgJnZhbCk7CisJaWYgKCh2YWwgJiAweDAwMDBmZjAwKSAhPSAwKQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsIHZhbCAmIDB4ZmZmZjAwZmYpOworCisJbGVuZ3RoID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKwlwcml2LT5od19sZW4gPSBsZW5ndGg7CisKKwliYXNlID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgbGVuZ3RoKTsKKwlpZiAoIWJhc2UpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczsKKwl9CisKKwlwcml2LT5od19iYXNlID0gYmFzZTsKKwlJUFdfREVCVUdfSU5GTygicGNpX3Jlc291cmNlX2xlbiA9IDB4JTA4eFxuIiwgbGVuZ3RoKTsKKwlJUFdfREVCVUdfSU5GTygicGNpX3Jlc291cmNlX2Jhc2UgPSAlcFxuIiwgYmFzZSk7CisKKwllcnIgPSBpcHdfc2V0dXBfZGVmZXJyZWRfd29yayhwcml2KTsKKwlpZiAoZXJyKSB7CisJCUlQV19FUlJPUigiVW5hYmxlIHRvIHNldHVwIGRlZmVycmVkIHdvcmtcbiIpOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKworCS8qIEluaXRpYWxpemUgbW9kdWxlIHBhcmFtZXRlciB2YWx1ZXMgaGVyZSAqLworCWlmIChpZm5hbWUpCisJCXN0cm5jcHkobmV0X2Rldi0+bmFtZSwgaWZuYW1lLCBJRk5BTVNJWik7CisKKwlpZiAoYXNzb2NpYXRlKQorCQlwcml2LT5jb25maWcgfD0gQ0ZHX0FTU09DSUFURTsKKwllbHNlCisJCUlQV19ERUJVR19JTkZPKCJBdXRvIGFzc29jaWF0ZSBkaXNhYmxlZC5cbiIpOworCisJaWYgKGF1dG9fY3JlYXRlKQorCQlwcml2LT5jb25maWcgfD0gQ0ZHX0FESE9DX0NSRUFURTsKKwllbHNlCisJCUlQV19ERUJVR19JTkZPKCJBdXRvIGFkaG9jIGNyZWF0aW9uIGRpc2FibGVkLlxuIik7CisKKwlpZiAoZGlzYWJsZSkgeworCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1JGX0tJTExfU1c7CisJCUlQV19ERUJVR19JTkZPKCJSYWRpbyBkaXNhYmxlZC5cbiIpOworCX0KKworCWlmIChjaGFubmVsICE9IDApIHsKKwkJcHJpdi0+Y29uZmlnIHw9IENGR19TVEFUSUNfQ0hBTk5FTDsKKwkJcHJpdi0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJCUlQV19ERUJVR19JTkZPKCJCaW5kIHRvIHN0YXRpYyBjaGFubmVsICVkXG4iLCBjaGFubmVsKTsKKwkJSVBXX0RFQlVHX0lORk8oIkJpbmQgdG8gc3RhdGljIGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOworCQkvKiBUT0RPOiBWYWxpZGF0ZSB0aGF0IHByb3ZpZGVkIGNoYW5uZWwgaXMgaW4gcmFuZ2UgKi8KKwl9CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIDE6CisJCXByaXYtPmllZWUtPml3X21vZGUgPSBJV19NT0RFX0FESE9DOworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfSVBXX1BST01JU0MKKwljYXNlIDI6CisJCXByaXYtPmllZWUtPml3X21vZGUgPSBJV19NT0RFX01PTklUT1I7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwljYXNlIDA6CisJCXByaXYtPmllZWUtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCQlicmVhazsKKwl9CisKKwlpZiAoKHByaXYtPnBjaV9kZXYtPmRldmljZSA9PSAweDQyMjMpIHx8CisJICAgIChwcml2LT5wY2lfZGV2LT5kZXZpY2UgPT0gMHg0MjI0KSkgeworCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCSAgICAgICAiOiBEZXRlY3RlZCBJbnRlbCBQUk8vV2lyZWxlc3MgMjkxNUFCRyBOZXR3b3JrICIKKwkJICAgICAgICJDb25uZWN0aW9uXG4iKTsKKwkJcHJpdi0+aWVlZS0+YWJnX3R1cmUgPSAxOworCQliYW5kID0gSUVFRTgwMjExXzUyR0haX0JBTkQgfCBJRUVFODAyMTFfMjRHSFpfQkFORDsKKwkJbW9kdWxhdGlvbiA9IElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04gfAorCQkgICAgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OOworCQlwcml2LT5hZGFwdGVyID0gSVBXXzI5MTVBQkc7CisJCXByaXYtPmllZWUtPm1vZGUgPSBJRUVFX0EgfCBJRUVFX0cgfCBJRUVFX0I7CisJfSBlbHNlIHsKKwkJaWYgKHByaXYtPnBjaV9kZXYtPmRldmljZSA9PSAweDQyMjEpCisJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkgICAgICAgIjogRGV0ZWN0ZWQgSW50ZWwgUFJPL1dpcmVsZXNzIDIyMjVCRyBOZXR3b3JrICIKKwkJCSAgICAgICAiQ29ubmVjdGlvblxuIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCSAgICAgICAiOiBEZXRlY3RlZCBJbnRlbCBQUk8vV2lyZWxlc3MgMjIwMEJHIE5ldHdvcmsgIgorCQkJICAgICAgICJDb25uZWN0aW9uXG4iKTsKKworCQlwcml2LT5pZWVlLT5hYmdfdHVyZSA9IDA7CisJCWJhbmQgPSBJRUVFODAyMTFfMjRHSFpfQkFORDsKKwkJbW9kdWxhdGlvbiA9IElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04gfAorCQkgICAgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OOworCQlwcml2LT5hZGFwdGVyID0gSVBXXzIyMDBCRzsKKwkJcHJpdi0+aWVlZS0+bW9kZSA9IElFRUVfRyB8IElFRUVfQjsKKwl9CisKKwlwcml2LT5pZWVlLT5mcmVxX2JhbmQgPSBiYW5kOworCXByaXYtPmllZWUtPm1vZHVsYXRpb24gPSBtb2R1bGF0aW9uOworCisJcHJpdi0+cmF0ZXNfbWFzayA9IElFRUU4MDIxMV9ERUZBVUxUX1JBVEVTX01BU0s7CisKKwlwcml2LT5taXNzZWRfYmVhY29uX3RocmVzaG9sZCA9IElQV19NQl9ESVNBU1NPQ0lBVEVfVEhSRVNIT0xEX0RFRkFVTFQ7CisJcHJpdi0+cm9hbWluZ190aHJlc2hvbGQgPSBJUFdfTUJfUk9BTUlOR19USFJFU0hPTERfREVGQVVMVDsKKworCXByaXYtPnJ0c190aHJlc2hvbGQgPSBERUZBVUxUX1JUU19USFJFU0hPTEQ7CisKKwkvKiBJZiBwb3dlciBtYW5hZ2VtZW50IGlzIHR1cm5lZCBvbiwgZGVmYXVsdCB0byBBQyBtb2RlICovCisJcHJpdi0+cG93ZXJfbW9kZSA9IElQV19QT1dFUl9BQzsKKwlwcml2LT50eF9wb3dlciA9IElQV19ERUZBVUxUX1RYX1BPV0VSOworCisJZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpcHdfaXNyLCBTQV9TSElSUSwgRFJWX05BTUUsIHByaXYpOworCWlmIChlcnIpIHsKKwkJSVBXX0VSUk9SKCJFcnJvciBhbGxvY2F0aW5nIElSUSAlZFxuIiwgcGRldi0+aXJxKTsKKwkJZ290byBvdXRfZGVzdHJveV93b3JrcXVldWU7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihuZXRfZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmcGRldi0+ZGV2KTsKKworCXByaXYtPmllZWUtPmhhcmRfc3RhcnRfeG1pdCA9IGlwd19uZXRfaGFyZF9zdGFydF94bWl0OworCXByaXYtPmllZWUtPnNldF9zZWN1cml0eSA9IHNoaW1fX3NldF9zZWN1cml0eTsKKworCW5ldF9kZXYtPm9wZW4gPSBpcHdfbmV0X29wZW47CisJbmV0X2Rldi0+c3RvcCA9IGlwd19uZXRfc3RvcDsKKwluZXRfZGV2LT5pbml0ID0gaXB3X25ldF9pbml0OworCW5ldF9kZXYtPmdldF9zdGF0cyA9IGlwd19uZXRfZ2V0X3N0YXRzOworCW5ldF9kZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGlwd19uZXRfc2V0X211bHRpY2FzdF9saXN0OworCW5ldF9kZXYtPnNldF9tYWNfYWRkcmVzcyA9IGlwd19uZXRfc2V0X21hY19hZGRyZXNzOworCW5ldF9kZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IGlwd19nZXRfd2lyZWxlc3Nfc3RhdHM7CisJbmV0X2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmaXB3X3d4X2hhbmRsZXJfZGVmOworCW5ldF9kZXYtPmV0aHRvb2xfb3BzID0gJmlwd19ldGh0b29sX29wczsKKwluZXRfZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJbmV0X2Rldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpcHJpdi0+aHdfYmFzZTsKKwluZXRfZGV2LT5tZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJbmV0X2Rldi0+bWVtX2VuZCA9IG5ldF9kZXYtPm1lbV9zdGFydCArIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgLSAxOworCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmlwd19hdHRyaWJ1dGVfZ3JvdXApOworCWlmIChlcnIpIHsKKwkJSVBXX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGRldmljZSBhdHRyaWJ1dGVzXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9pcnE7CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworCWlmIChlcnIpIHsKKwkJSVBXX0VSUk9SKCJmYWlsZWQgdG8gcmVnaXN0ZXIgbmV0d29yayBkZXZpY2VcbiIpOworCQlnb3RvIG91dF9yZW1vdmVfZ3JvdXA7CisJfQorCisJcmV0dXJuIDA7CisKKyAgICAgIG91dF9yZW1vdmVfZ3JvdXA6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmlwd19hdHRyaWJ1dGVfZ3JvdXApOworICAgICAgb3V0X3JlbGVhc2VfaXJxOgorCWZyZWVfaXJxKHBkZXYtPmlycSwgcHJpdik7CisgICAgICBvdXRfZGVzdHJveV93b3JrcXVldWU6CisJZGVzdHJveV93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKKwlwcml2LT53b3JrcXVldWUgPSBOVUxMOworICAgICAgb3V0X2lvdW5tYXA6CisJaW91bm1hcChwcml2LT5od19iYXNlKTsKKyAgICAgIG91dF9wY2lfcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisgICAgICBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisgICAgICBvdXRfZnJlZV9pZWVlODAyMTE6CisJZnJlZV9pZWVlODAyMTEocHJpdi0+bmV0X2Rldik7CisgICAgICBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaXB3X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWlmICghcHJpdikKKwkJcmV0dXJuOworCisJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19FWElUX1BFTkRJTkc7CisKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaXB3X2F0dHJpYnV0ZV9ncm91cCk7CisKKwlpcHdfZG93bihwcml2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KHByaXYtPm5ldF9kZXYpOworCisJaWYgKHByaXYtPnJ4cSkgeworCQlpcHdfcnhfcXVldWVfZnJlZShwcml2LCBwcml2LT5yeHEpOworCQlwcml2LT5yeHEgPSBOVUxMOworCX0KKwlpcHdfdHhfcXVldWVfZnJlZShwcml2KTsKKworCS8qIGlwd19kb3duIHdpbGwgZW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gbW9yZSBwZW5kaW5nIHdvcmsKKwkgKiBpbiB0aGUgd29ya3F1ZXVlJ3MsIHNvIHdlIGNhbiBzYWZlbHkgcmVtb3ZlIHRoZW0gbm93LiAqLworCWlmIChwcml2LT53b3JrcXVldWUpIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+YWRob2NfY2hlY2spOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5nYXRoZXJfc3RhdHMpOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZXF1ZXN0X3NjYW4pOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZl9raWxsKTsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+c2Nhbl9jaGVjayk7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7CisJCXByaXYtPndvcmtxdWV1ZSA9IE5VTEw7CisJfQorCisJZnJlZV9pcnEocGRldi0+aXJxLCBwcml2KTsKKwlpb3VubWFwKHByaXYtPmh3X2Jhc2UpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX2llZWU4MDIxMShwcml2LT5uZXRfZGV2KTsKKworI2lmZGVmIENPTkZJR19QTQorCWlmIChmd19sb2FkZWQpIHsKKwkJcmVsZWFzZV9maXJtd2FyZShib290ZncpOworCQlyZWxlYXNlX2Zpcm13YXJlKHVjb2RlKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CisJCWZ3X2xvYWRlZCA9IDA7CisJfQorI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgaXB3X3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5uZXRfZGV2OworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdvaW5nIGludG8gc3VzcGVuZC4uLlxuIiwgZGV2LT5uYW1lKTsKKworCS8qIFRha2UgZG93biB0aGUgZGV2aWNlOyBwb3dlcnMgaXQgb2ZmLCBldGMuICovCisJaXB3X2Rvd24ocHJpdik7CisKKwkvKiBSZW1vdmUgdGhlIFBSRVNFTlQgc3RhdGUgb2YgdGhlIGRldmljZSAqLworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwd19wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+bmV0X2RldjsKKwl1MzIgdmFsOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvbWluZyBvdXQgb2Ygc3VzcGVuZC4uLlxuIiwgZGV2LT5uYW1lKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CisJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQorCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYsIHByaXYtPnBtX3N0YXRlKTsKKyNlbHNlCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisjZW5kaWYKKwkvKgorCSAqIFN1c3BlbmQvUmVzdW1lIHJlc2V0cyB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UsIHNvIHdlIGhhdmUgdG8KKwkgKiByZS1kaXNhYmxlIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyICgweDQxKSB0byBrZWVwIFBDSSBUeCByZXRyaWVzCisJICogZnJvbSBpbnRlcmZlcmluZyB3aXRoIEMzIENQVSBzdGF0ZS4gcGNpX3Jlc3RvcmVfc3RhdGUgd29uJ3QgaGVscAorCSAqIGhlcmUgc2luY2UgaXQgb25seSByZXN0b3JlcyB0aGUgZmlyc3QgNjQgYnl0ZXMgcGNpIGNvbmZpZyBoZWFkZXIuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsICZ2YWwpOworCWlmICgodmFsICYgMHgwMDAwZmYwMCkgIT0gMCkKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDQwLCB2YWwgJiAweGZmZmYwMGZmKTsKKworCS8qIFNldCB0aGUgZGV2aWNlIGJhY2sgaW50byB0aGUgUFJFU0VOVCBzdGF0ZTsgdGhpcyB3aWxsIGFsc28gd2FrZQorCSAqIHRoZSBxdWV1ZSBvZiBuZWVkZWQgKi8KKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwkvKiBCcmluZyB0aGUgZGV2aWNlIGJhY2sgdXAgKi8KKwlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnVwKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qIGRyaXZlciBpbml0aWFsaXphdGlvbiBzdHVmZiAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlwd19kcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSBjYXJkX2lkcywKKwkucHJvYmUgPSBpcHdfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpcHdfcGNpX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBpcHdfcGNpX3N1c3BlbmQsCisJLnJlc3VtZSA9IGlwd19wY2lfcmVzdW1lLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpcHdfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICI6ICIgRFJWX0RFU0NSSVBUSU9OICIsICIgRFJWX1ZFUlNJT04gIlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiAiIERSVl9DT1BZUklHSFQgIlxuIik7CisKKwlyZXQgPSBwY2lfbW9kdWxlX2luaXQoJmlwd19kcml2ZXIpOworCWlmIChyZXQpIHsKKwkJSVBXX0VSUk9SKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBQQ0kgbW9kdWxlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJmlwd19kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfZGVidWdfbGV2ZWwpOworCWlmIChyZXQpIHsKKwkJSVBXX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIGRyaXZlciBzeXNmcyBmaWxlXG4iKTsKKwkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpcHdfZHJpdmVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXB3X2V4aXQodm9pZCkKK3sKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmlwd19kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfZGVidWdfbGV2ZWwpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXB3X2RyaXZlcik7Cit9CisKK21vZHVsZV9wYXJhbShkaXNhYmxlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlLCAibWFudWFsbHkgZGlzYWJsZSB0aGUgcmFkaW8gKGRlZmF1bHQgMCBbcmFkaW8gb25dKSIpOworCittb2R1bGVfcGFyYW0oYXNzb2NpYXRlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhc3NvY2lhdGUsICJhdXRvIGFzc29jaWF0ZSB3aGVuIHNjYW5uaW5nIChkZWZhdWx0IG9uKSIpOworCittb2R1bGVfcGFyYW0oYXV0b19jcmVhdGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1dG9fY3JlYXRlLCAiYXV0byBjcmVhdGUgYWRob2MgbmV0d29yayAoZGVmYXVsdCBvbikiKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIG91dHB1dCBtYXNrIik7CisKK21vZHVsZV9wYXJhbShjaGFubmVsLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhjaGFubmVsLCAiY2hhbm5lbCB0byBsaW1pdCBhc3NvY2lhdGUgdG8gKGRlZmF1bHQgMCBbQU5ZXSkiKTsKKworbW9kdWxlX3BhcmFtKGlmbmFtZSwgY2hhcnAsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZm5hbWUsICJuZXR3b3JrIGRldmljZSBuYW1lIChkZWZhdWx0IGV0aCVkKSIpOworCisjaWZkZWYgQ09ORklHX0lQV19QUk9NSVNDCittb2R1bGVfcGFyYW0obW9kZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZSwgIm5ldHdvcmsgbW9kZSAoMD1CU1MsMT1JQlNTLDI9TW9uaXRvcikiKTsKKyNlbHNlCittb2R1bGVfcGFyYW0obW9kZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZSwgIm5ldHdvcmsgbW9kZSAoMD1CU1MsMT1JQlNTKSIpOworI2VuZGlmCisKK21vZHVsZV9leGl0KGlwd19leGl0KTsKK21vZHVsZV9pbml0KGlwd19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjAwODgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5oCkBAIC0wLDAgKzEsMTY4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDAzIC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19pcHcyMjAwX2hfXworI2RlZmluZSBfX2lwdzIyMDBfaF9fCisKKyNkZWZpbmUgV0VYVF9VU0VDSEFOTkVMUyAxCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KKworI2RlZmluZSBEUlZfTkFNRQkiaXB3MjIwMCIKKworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisvKiBBdXRoZW50aWNhdGlvbiAgYW5kIEFzc29jaWF0aW9uIFN0YXRlcyAqLworZW51bSBjb25uZWN0aW9uX21hbmFnZXJfYXNzb2Nfc3RhdGVzIHsKKwlDTUFTX0lOSVQgPSAwLAorCUNNQVNfVFhfQVVUSF9TRVFfMSwKKwlDTUFTX1JYX0FVVEhfU0VRXzIsCisJQ01BU19BVVRIX1NFUV8xX1BBU1MsCisJQ01BU19BVVRIX1NFUV8xX0ZBSUwsCisJQ01BU19UWF9BVVRIX1NFUV8zLAorCUNNQVNfUlhfQVVUSF9TRVFfNCwKKwlDTUFTX0FVVEhfU0VRXzJfUEFTUywKKwlDTUFTX0FVVEhfU0VRXzJfRkFJTCwKKwlDTUFTX0FVVEhFTlRJQ0FURUQsCisJQ01BU19UWF9BU1NPQywKKwlDTUFTX1JYX0FTU09DX1JFU1AsCisJQ01BU19BU1NPQ0lBVEVELAorCUNNQVNfTEFTVAorfTsKKworI2RlZmluZSBJUFdfV0FJVCAgICAgICAgICAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBJUFdfUVVJRVQgICAgICAgICAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJUFdfUk9BTUlORyAgICAgICAgICAgICAgICAgICgxPDwyKQorCisjZGVmaW5lIElQV19QT1dFUl9NT0RFX0NBTSAgICAgICAgICAgMHgwMAkvLyhhbHdheXMgb24pCisjZGVmaW5lIElQV19QT1dFUl9JTkRFWF8xICAgICAgICAgICAgMHgwMQorI2RlZmluZSBJUFdfUE9XRVJfSU5ERVhfMiAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSVBXX1BPV0VSX0lOREVYXzMgICAgICAgICAgICAweDAzCisjZGVmaW5lIElQV19QT1dFUl9JTkRFWF80ICAgICAgICAgICAgMHgwNAorI2RlZmluZSBJUFdfUE9XRVJfSU5ERVhfNSAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgSVBXX1BPV0VSX0FDICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIElQV19QT1dFUl9CQVRURVJZICAgICAgICAgICAgMHgwNworI2RlZmluZSBJUFdfUE9XRVJfTElNSVQgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgSVBXX1BPV0VSX01BU0sgICAgICAgICAgICAgICAweDBGCisjZGVmaW5lIElQV19QT1dFUl9FTkFCTEVEICAgICAgICAgICAgMHgxMAorI2RlZmluZSBJUFdfUE9XRVJfTEVWRUwoeCkgICAgICAgICAgICgoeCkgJiBJUFdfUE9XRVJfTUFTSykKKworI2RlZmluZSBJUFdfQ01EX0hPU1RfQ09NUExFVEUgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSVBXX0NNRF9QT1dFUl9ET1dOICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElQV19DTURfU1lTVEVNX0NPTkZJRyAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBJUFdfQ01EX01VTFRJQ0FTVF9BRERSRVNTICAgICAgICAgICAgIDcKKyNkZWZpbmUgSVBXX0NNRF9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIElQV19DTURfQURBUFRFUl9BRERSRVNTICAgICAgICAgICAgICAxMQorI2RlZmluZSBJUFdfQ01EX1BPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgSVBXX0NNRF9SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIElQV19DTURfRlJBR19USFJFU0hPTEQgICAgICAgICAgICAgICAxNgorI2RlZmluZSBJUFdfQ01EX1BPV0VSX01PREUgICAgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgSVBXX0NNRF9XRVBfS0VZICAgICAgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIElQV19DTURfVEdJX1RYX0tFWSAgICAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBJUFdfQ01EX1NDQU5fUkVRVUVTVCAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgSVBXX0NNRF9BU1NPQ0lBVEUgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIElQV19DTURfU1VQUE9SVEVEX1JBVEVTICAgICAgICAgICAgICAyMgorI2RlZmluZSBJUFdfQ01EX1NDQU5fQUJPUlQgICAgICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgSVBXX0NNRF9UWF9GTFVTSCAgICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIElQV19DTURfUU9TX1BBUkFNRVRFUlMgICAgICAgICAgICAgICAyNQorI2RlZmluZSBJUFdfQ01EX1NDQU5fUkVRVUVTVF9FWFQgICAgICAgICAgICAgMjYKKyNkZWZpbmUgSVBXX0NNRF9ESU5PX0NPTkZJRyAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIElQV19DTURfUlNOX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAzMQorI2RlZmluZSBJUFdfQ01EX1JYX0tFWSAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgSVBXX0NNRF9DQVJEX0RJU0FCTEUgICAgICAgICAgICAgICAgIDMzCisjZGVmaW5lIElQV19DTURfU0VFRF9OVU1CRVIgICAgICAgICAgICAgICAgICAzNAorI2RlZmluZSBJUFdfQ01EX1RYX1BPV0VSICAgICAgICAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgSVBXX0NNRF9DT1VOVFJZX0lORk8gICAgICAgICAgICAgICAgIDM2CisjZGVmaW5lIElQV19DTURfQUlST05FVF9JTkZPICAgICAgICAgICAgICAgICAzNworI2RlZmluZSBJUFdfQ01EX0FQX1RYX1BPV0VSICAgICAgICAgICAgICAgICAgMzgKKyNkZWZpbmUgSVBXX0NNRF9DQ0tNX0lORk8gICAgICAgICAgICAgICAgICAgIDM5CisjZGVmaW5lIElQV19DTURfQ0NYX1ZFUl9JTkZPICAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBJUFdfQ01EX1NFVF9DQUxJQlJBVElPTiAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgSVBXX0NNRF9TRU5TSVRJVklUWV9DQUxJQiAgICAgICAgICAgIDQyCisjZGVmaW5lIElQV19DTURfUkVUUllfTElNSVQgICAgICAgICAgICAgICAgICA1MQorI2RlZmluZSBJUFdfQ01EX0lQV19QUkVfUE9XRVJfRE9XTiAgICAgICAgICAgNTgKKyNkZWZpbmUgSVBXX0NNRF9WQVBfQkVBQ09OX1RFTVBMQVRFICAgICAgICAgIDYwCisjZGVmaW5lIElQV19DTURfVkFQX0RUSU1fUEVSSU9EICAgICAgICAgICAgICA2MQorI2RlZmluZSBJUFdfQ01EX0VYVF9TVVBQT1JURURfUkFURVMgICAgICAgICAgNjIKKyNkZWZpbmUgSVBXX0NNRF9WQVBfTE9DQUxfVFhfUFdSX0NPTlNUUkFJTlQgIDYzCisjZGVmaW5lIElQV19DTURfVkFQX1FVSUVUX0lOVEVSVkFMUyAgICAgICAgICA2NAorI2RlZmluZSBJUFdfQ01EX1ZBUF9DSEFOTkVMX1NXSVRDSCAgICAgICAgICAgNjUKKyNkZWZpbmUgSVBXX0NNRF9WQVBfTUFOREFUT1JZX0NIQU5ORUxTICAgICAgIDY2CisjZGVmaW5lIElQV19DTURfVkFQX0NFTExfUFdSX0xJTUlUICAgICAgICAgICA2NworI2RlZmluZSBJUFdfQ01EX1ZBUF9DRl9QQVJBTV9TRVQgICAgICAgICAgICAgNjgKKyNkZWZpbmUgSVBXX0NNRF9WQVBfU0VUX0JFQUNPTklOR19TVEFURSAgICAgIDY5CisjZGVmaW5lIElQV19DTURfTUVBU1VSRU1FTlQgICAgICAgICAgICAgICAgICA4MAorI2RlZmluZSBJUFdfQ01EX1BPV0VSX0NBUEFCSUxJVFkgICAgICAgICAgICAgODEKKyNkZWZpbmUgSVBXX0NNRF9TVVBQT1JURURfQ0hBTk5FTFMgICAgICAgICAgIDgyCisjZGVmaW5lIElQV19DTURfVFBDX1JFUE9SVCAgICAgICAgICAgICAgICAgICA4MworI2RlZmluZSBJUFdfQ01EX1dNRV9JTkZPICAgICAgICAgICAgICAgICAgICAgODQKKyNkZWZpbmUgSVBXX0NNRF9QUk9EVUNUSU9OX0NPTU1BTkQJICAgICA4NQorI2RlZmluZSBJUFdfQ01EX0xJTktTWVNfRU9VX0lORk8gICAgICAgICAgICAgOTAKKworI2RlZmluZSBSRkRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlVNX1RGRF9DSFVOS1MgICAgICAgICAgICAgICAgICAgICAgICA2CisKKyNkZWZpbmUgVFhfUVVFVUVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFJYX1FVRVVFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAzMgorCisjZGVmaW5lIERJTk9fQ01EX1dFUF9LRVkgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBESU5PX0NNRF9UWCAgICAgICAgICAgICAgICAgICAgICAgIDB4MEIKKyNkZWZpbmUgRENUX0FOVEVOTkFfQSAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIERDVF9BTlRFTk5BX0IgICAgICAgICAgICAgICAgICAgICAgMHgwMgorCisjZGVmaW5lIElQV19BX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJUFdfQl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSVBXX0dfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKy8qCisgKiBUWCBRdWV1ZSBGbGFnIERlZmluaXRpb25zCisgKi8KKworLyogYWJvcnQgYXR0ZW1wdCBpZiBtZ210IGZyYW1lIGlzIHJ4J2QgKi8KKyNkZWZpbmUgRENUX0ZMQUdfQUJPUlRfTUdNVCAgICAgICAgICAgICAgICAweDAxCisKKy8qIHJlcXVpcmUgQ1RTICovCisjZGVmaW5lIERDVF9GTEFHX0NUU19SRVFVSVJFRCAgICAgICAgICAgICAgMHgwMgorCisvKiB1c2Ugc2hvcnQgcHJlYW1ibGUgKi8KKyNkZWZpbmUgRENUX0ZMQUdfU0hPUlRfUFJFTUJMICAgICAgICAgICAgICAweDA0CisKKy8qIFJUUy9DVFMgZmlyc3QgKi8KKyNkZWZpbmUgRENUX0ZMQUdfUlRTX1JFUUQgICAgICAgICAgICAgICAgICAweDA4CisKKy8qIGRvbnQgY2FsY3VsYXRlIGR1cmF0aW9uIGZpZWxkICovCisjZGVmaW5lIERDVF9GTEFHX0RVUl9TRVQgICAgICAgICAgICAgICAgICAgMHgxMAorCisvKiBldmVuIGlmIE1BQyBXRVAgc2V0IChhbGxvd3MgcHJlLWVuY3J5cHQpICovCisjZGVmaW5lIERDVF9GTEFHX05PX1dFUCAgICAgICAgICAgICAgMHgyMAorCisvKiBvdmVyd3JpdGUgVFNGIGZpZWxkICovCisjZGVmaW5lIERDVF9GTEFHX1RTRl9SRVFEICAgICAgICAgICAgICAgICAgMHg0MAorCisvKiBBQ0sgcnggaXMgZXhwZWN0ZWQgdG8gZm9sbG93ICovCisjZGVmaW5lIERDVF9GTEFHX0FDS19SRVFEICAgICAgICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIERDVF9GTEFHX0VYVF9NT0RFX0NDSyAgMHgwMQorI2RlZmluZSBEQ1RfRkxBR19FWFRfTU9ERV9PRkRNIDB4MDAKKworI2RlZmluZSBUWF9SWF9UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgVFhfRlJBTUVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFRYX0hPU1RfQ09NTUFORF9UWVBFICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSWF9GUkFNRV9UWVBFICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgUlhfSE9TVF9OT1RJRklDQVRJT05fVFlQRSAgICAgICAgICAweDAzCisjZGVmaW5lIFJYX0hPU1RfQ01EX1JFU1BPTlNFX1RZUEUgICAgICAgICAgMHgwNAorI2RlZmluZSBSWF9UWF9GUkFNRV9SRVNQT05TRV9UWVBFICAgICAgICAgIDB4MDUKKyNkZWZpbmUgVEZEX05FRURfSVJRX01BU0sgICAgICAgICAgICAgICAgICAweDA0CisKKyNkZWZpbmUgSE9TVF9DTURfRElOT19DT05GSUcgICAgICAgICAgICAgICAzMAorCisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19BU1NPQ0lBVEVEICAgICAgICAgICAgIDEwCisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19BVVRIRU5USUNBVEUgICAgICAgICAgIDExCisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19TQ0FOX0NIQU5ORUxfUkVTVUxUICAgIDEyCisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19TQ0FOX0NPTVBMRVRFRCAgICAgICAgIDEzCisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19GUkFHX0xFTkdUSCAgICAgICAgICAgIDE0CisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19MSU5LX0RFVEVSSU9SQVRJT04gICAgIDE1CisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX0RJTk9fQ09ORklHX1JFU1BPTlNFICAgICAgICAgIDE2CisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19CRUFDT05fU1RBVEUgICAgICAgICAgIDE3CisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19UR0lfVFhfS0VZICAgICAgICAgICAgIDE4CisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX1RYX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIDE5CisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX0NBTElCX0tFRVBfUkVTVUxUUyAgICAgICAgICAgIDIwCisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX01FQVNVUkVNRU5UX1NUQVJURUQgICAgICAgICAgIDIxCisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX01FQVNVUkVNRU5UX0VOREVEICAgICAgICAgICAgIDIyCisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX0NIQU5ORUxfU1dJVENIRUQgICAgICAgICAgICAgIDIzCisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX1JYX0RVUklOR19RVUlFVF9QRVJJT0QgICAgICAgIDI0CisjZGVmaW5lIEhPU1RfTk9USUZJQ0FUSU9OX05PSVNFX1NUQVRTCQkJMjUKKyNkZWZpbmUgSE9TVF9OT1RJRklDQVRJT05fUzM2X01FQVNVUkVNRU5UX0FDQ0VQVEVEICAgICAgMzAKKyNkZWZpbmUgSE9TVF9OT1RJRklDQVRJT05fUzM2X01FQVNVUkVNRU5UX1JFRlVTRUQgICAgICAgMzEKKworI2RlZmluZSBIT1NUX05PVElGSUNBVElPTl9TVEFUVVNfQkVBQ09OX01JU1NJTkcgICAgICAgICAxCisjZGVmaW5lIElQV19NQl9ESVNBU1NPQ0lBVEVfVEhSRVNIT0xEX0RFRkFVTFQgICAgICAgICAgIDI0CisjZGVmaW5lIElQV19NQl9ST0FNSU5HX1RIUkVTSE9MRF9ERUZBVUxUICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgSVBXX1JFQUxfUkFURV9SWF9QQUNLRVRfVEhSRVNIT0xEICAgICAgICAgICAgICAgMzAwCisKKyNkZWZpbmUgTUFDQURSUl9CWVRFX0xFTiAgICAgICAgICAgICAgICAgICAgIDYKKworI2RlZmluZSBEQ1JfVFlQRV9BUCAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBEQ1JfVFlQRV9XTEFQICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBEQ1JfVFlQRV9NVV9FU1MgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBEQ1JfVFlQRV9NVV9JQlNTICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBEQ1JfVFlQRV9NVV9QSUJTUyAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBEQ1JfVFlQRV9TTklGRkVSICAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBEQ1JfVFlQRV9NVV9CU1MgICAgICAgIERDUl9UWVBFX01VX0VTUworCisvKioKKyAqIEdlbmVyaWMgcXVldWUgc3RydWN0dXJlCisgKgorICogQ29udGFpbnMgY29tbW9uIGRhdGEgZm9yIFJ4IGFuZCBUeCBxdWV1ZXMKKyAqLworc3RydWN0IGNseDJfcXVldWUgeworCWludCBuX2JkOwkJICAgICAgIC8qKjwgbnVtYmVyIG9mIEJEcyBpbiB0aGlzIHF1ZXVlICovCisJaW50IGZpcnN0X2VtcHR5OwkgICAgICAgLyoqPCAxLXN0IGVtcHR5IGVudHJ5IChpbmRleCkgKi8KKwlpbnQgbGFzdF91c2VkOwkJICAgICAgIC8qKjwgbGFzdCB1c2VkIGVudHJ5IChpbmRleCkgKi8KKwl1MzIgcmVnX3c7CQkgICAgIC8qKjwgJ3dyaXRlJyByZWcgKHF1ZXVlIGhlYWQpLCBhZGRyIGluIGRvbWFpbiAxICovCisJdTMyIHJlZ19yOwkJICAgICAvKio8ICdyZWFkJyByZWcgKHF1ZXVlIHRhaWwpLCBhZGRyIGluIGRvbWFpbiAxICovCisJZG1hX2FkZHJfdCBkbWFfYWRkcjsJCS8qKjwgcGh5c2ljYWwgYWRkciBmb3IgQkQncyAqLworCWludCBsb3dfbWFyazsJCSAgICAgICAvKio8IGxvdyB3YXRlcm1hcmssIHJlc3VtZSBxdWV1ZSBpZiBmcmVlIHNwYWNlIG1vcmUgdGhhbiB0aGlzICovCisJaW50IGhpZ2hfbWFyazsJCSAgICAgICAvKio8IGhpZ2ggd2F0ZXJtYXJrLCBzdG9wIHF1ZXVlIGlmIGZyZWUgc3BhY2UgbGVzcyB0aGFuIHRoaXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbWFjaGRyMzIgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uOwkJLy8gd2F0Y2ggb3V0IGZvciBlbmRpYW5zIQorCXU4IGFkZHIxW01BQ0FEUlJfQllURV9MRU5dOworCXU4IGFkZHIyW01BQ0FEUlJfQllURV9MRU5dOworCXU4IGFkZHIzW01BQ0FEUlJfQllURV9MRU5dOworCXUxNiBzZXFfY3RybDsJCS8vIG1vcmUgZW5kaWFucyEKKwl1OCBhZGRyNFtNQUNBRFJSX0JZVEVfTEVOXTsKKwl1MTYgcW9zX2N0cmw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1hY2hkcjMwIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbjsJCS8vIHdhdGNoIG91dCBmb3IgZW5kaWFucyEKKwl1OCBhZGRyMVtNQUNBRFJSX0JZVEVfTEVOXTsKKwl1OCBhZGRyMltNQUNBRFJSX0JZVEVfTEVOXTsKKwl1OCBhZGRyM1tNQUNBRFJSX0JZVEVfTEVOXTsKKwl1MTYgc2VxX2N0cmw7CQkvLyBtb3JlIGVuZGlhbnMhCisJdTggYWRkcjRbTUFDQURSUl9CWVRFX0xFTl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1hY2hkcjI2IHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbjsJCS8vIHdhdGNoIG91dCBmb3IgZW5kaWFucyEKKwl1OCBhZGRyMVtNQUNBRFJSX0JZVEVfTEVOXTsKKwl1OCBhZGRyMltNQUNBRFJSX0JZVEVfTEVOXTsKKwl1OCBhZGRyM1tNQUNBRFJSX0JZVEVfTEVOXTsKKwl1MTYgc2VxX2N0cmw7CQkvLyBtb3JlIGVuZGlhbnMhCisJdTE2IHFvc19jdHJsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtYWNoZHIyNCB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb247CQkvLyB3YXRjaCBvdXQgZm9yIGVuZGlhbnMhCisJdTggYWRkcjFbTUFDQURSUl9CWVRFX0xFTl07CisJdTggYWRkcjJbTUFDQURSUl9CWVRFX0xFTl07CisJdTggYWRkcjNbTUFDQURSUl9CWVRFX0xFTl07CisJdTE2IHNlcV9jdHJsOwkJLy8gbW9yZSBlbmRpYW5zIQorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8vIFRYIFRGRCB3aXRoIDMyIGJ5dGUgTUFDIEhlYWRlcgorc3RydWN0IHR4X3RmZF8zMiB7CisJc3RydWN0IG1hY2hkcjMyIG1jaGRyOwkvLyAzMgorCXUzMiB1aXZwbGFjZWhvbGRlclsyXTsJLy8gOAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8vIFRYIFRGRCB3aXRoIDMwIGJ5dGUgTUFDIEhlYWRlcgorc3RydWN0IHR4X3RmZF8zMCB7CisJc3RydWN0IG1hY2hkcjMwIG1jaGRyOwkvLyAzMAorCXU4IHJlc2VydmVkWzJdOwkJLy8gMgorCXUzMiB1aXZwbGFjZWhvbGRlclsyXTsJLy8gOAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8vIHR4IHRmZCB3aXRoIDI2IGJ5dGUgbWFjIGhlYWRlcgorc3RydWN0IHR4X3RmZF8yNiB7CisJc3RydWN0IG1hY2hkcjI2IG1jaGRyOwkvLyAyNgorCXU4IHJlc2VydmVkMVsyXTsJLy8gMgorCXUzMiB1aXZwbGFjZWhvbGRlclsyXTsJLy8gOAorCXU4IHJlc2VydmVkMls0XTsJLy8gNAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8vIHR4IHRmZCB3aXRoIDI0IGJ5dGUgbWFjIGhlYWRlcgorc3RydWN0IHR4X3RmZF8yNCB7CisJc3RydWN0IG1hY2hkcjI0IG1jaGRyOwkvLyAyNAorCXUzMiB1aXZwbGFjZWhvbGRlclsyXTsJLy8gOAorCXU4IHJlc2VydmVkWzhdOwkJLy8gOAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgRENUX1dFUF9LRVlfRklFTERfTEVOR1RIIDE2CisKK3N0cnVjdCB0ZmRfY29tbWFuZCB7CisJdTggaW5kZXg7CisJdTggbGVuZ3RoOworCXUxNiByZXNlcnZlZDsKKwl1OCBwYXlsb2FkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB0ZmRfZGF0YSB7CisJLyogSGVhZGVyICovCisJdTMyIHdvcmtfYXJlYV9wdHI7CisJdTggc3RhdGlvbl9udW1iZXI7CS8qIDAgZm9yIEJTUyAqLworCXU4IHJlc2VydmVkMTsKKwl1MTYgcmVzZXJ2ZWQyOworCisJLyogVHggUGFyYW1ldGVycyAqLworCXU4IGNtZF9pZDsKKwl1OCBzZXFfbnVtOworCXUxNiBsZW47CisJdTggcHJpb3JpdHk7CisJdTggdHhfZmxhZ3M7CisJdTggdHhfZmxhZ3NfZXh0OworCXU4IGtleV9pbmRleDsKKwl1OCB3ZXBrZXlbRENUX1dFUF9LRVlfRklFTERfTEVOR1RIXTsKKwl1OCByYXRlOworCXU4IGFudGVubmE7CisJdTE2IG5leHRfcGFja2V0X2R1cmF0aW9uOworCXUxNiBuZXh0X2ZyYWdfbGVuOworCXUxNiBiYWNrX29mZl9jb3VudGVyOwkvLy8vLy90eG9wOworCXU4IHJldHJ5bGltaXQ7CisJdTE2IGN3Y3VycmVudDsKKwl1OCByZXNlcnZlZDM7CisKKwkvKiA4MDIuMTEgTUFDIEhlYWRlciAqLworCXVuaW9uIHsKKwkJc3RydWN0IHR4X3RmZF8yNCB0ZmRfMjQ7CisJCXN0cnVjdCB0eF90ZmRfMjYgdGZkXzI2OworCQlzdHJ1Y3QgdHhfdGZkXzMwIHRmZF8zMDsKKwkJc3RydWN0IHR4X3RmZF8zMiB0ZmRfMzI7CisJfSB0ZmQ7CisKKwkvKiBQYXlsb2FkIERNQSBpbmZvICovCisJdTMyIG51bV9jaHVua3M7CisJdTMyIGNodW5rX3B0cltOVU1fVEZEX0NIVU5LU107CisJdTE2IGNodW5rX2xlbltOVU1fVEZEX0NIVU5LU107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHR4cnhfY29udHJvbF9mbGFncyB7CisJdTggbWVzc2FnZV90eXBlOworCXU4IHJ4X3NlcV9udW07CisJdTggY29udHJvbF9iaXRzOworCXU4IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgIFRGRF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lICBURkRfQ01EX0lNTUVESUFURV9QQVlMT0FEX0xFTkdUSCAgIChURkRfU0laRSAtIHNpemVvZihzdHJ1Y3QgdHhyeF9jb250cm9sX2ZsYWdzKSkKKworc3RydWN0IHRmZF9mcmFtZSB7CisJc3RydWN0IHR4cnhfY29udHJvbF9mbGFncyBjb250cm9sX2ZsYWdzOworCXVuaW9uIHsKKwkJc3RydWN0IHRmZF9kYXRhIGRhdGE7CisJCXN0cnVjdCB0ZmRfY29tbWFuZCBjbWQ7CisJCXU4IHJhd1tURkRfQ01EX0lNTUVESUFURV9QQVlMT0FEX0xFTkdUSF07CisJfSB1OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3R5cGVkZWYgdm9pZCBkZXN0cnVjdG9yX2Z1bmMoY29uc3Qgdm9pZCAqKTsKKworLyoqCisgKiBUeCBRdWV1ZSBmb3IgRE1BLiBRdWV1ZSBjb25zaXN0cyBvZiBjaXJjdWxhciBidWZmZXIgb2YKKyAqIEJEJ3MgYW5kIHJlcXVpcmVkIGxvY2tpbmcgc3RydWN0dXJlcy4KKyAqLworc3RydWN0IGNseDJfdHhfcXVldWUgeworCXN0cnVjdCBjbHgyX3F1ZXVlIHE7CisJc3RydWN0IHRmZF9mcmFtZSAqYmQ7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKip0eGI7Cit9OworCisvKgorICogUlggcmVsYXRlZCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMKKyAqLworI2RlZmluZSBSWF9GUkVFX0JVRkZFUlMgMzIKKyNkZWZpbmUgUlhfTE9XX1dBVEVSTUFSSyA4CisKKyNkZWZpbmUgU1VQX1JBVEVfMTFBX01BWF9OVU1fQ0hBTk5FTFMgICg4KQorI2RlZmluZSBTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMUyAgKDQpCisjZGVmaW5lIFNVUF9SQVRFXzExR19NQVhfTlVNX0NIQU5ORUxTICAoMTIpCisKKy8vIFVzZWQgZm9yIHBhc3NpbmcgdG8gZHJpdmVyIG51bWJlciBvZiBzdWNjZXNzZXMgYW5kIGZhaWx1cmVzIHBlciByYXRlCitzdHJ1Y3QgcmF0ZV9oaXN0b2dyYW0geworCXVuaW9uIHsKKwkJdTMyIGFbU1VQX1JBVEVfMTFBX01BWF9OVU1fQ0hBTk5FTFNdOworCQl1MzIgYltTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMU107CisJCXUzMiBnW1NVUF9SQVRFXzExR19NQVhfTlVNX0NIQU5ORUxTXTsKKwl9IHN1Y2Nlc3M7CisJdW5pb24geworCQl1MzIgYVtTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMU107CisJCXUzMiBiW1NVUF9SQVRFXzExQl9NQVhfTlVNX0NIQU5ORUxTXTsKKwkJdTMyIGdbU1VQX1JBVEVfMTFHX01BWF9OVU1fQ0hBTk5FTFNdOworCX0gZmFpbGVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIHN0YXRpc3RpY3MgY29tbWFuZCByZXNwb25zZSAqLworc3RydWN0IGlwd19jbWRfc3RhdHMgeworCXU4IGNtZF9pZDsKKwl1OCBzZXFfbnVtOworCXUxNiBnb29kX3NmZDsKKwl1MTYgYmFkX3BsY3A7CisJdTE2IHdyb25nX2Jzc2lkOworCXUxNiB2YWxpZF9tcGR1OworCXUxNiBiYWRfbWFjX2hlYWRlcjsKKwl1MTYgcmVzZXJ2ZWRfZnJhbWVfdHlwZXM7CisJdTE2IHJ4X2luYTsKKwl1MTYgYmFkX2NyYzMyOworCXUxNiBpbnZhbGlkX2N0czsKKwl1MTYgaW52YWxpZF9hY2tzOworCXUxNiBsb25nX2Rpc3RhbmNlX2luYV9maW5hOworCXUxNiBkc3Bfc2lsZW5jZV91bnJlYWNoYWJsZTsKKwl1MTYgYWNjdW11bGF0ZWRfcnNzaTsKKwl1MTYgcnhfb3ZmbF9mcmFtZV90b3NzZWQ7CisJdTE2IHJzc2lfc2lsZW5jZV90aHJlc2hvbGQ7CisJdTE2IHJ4X292ZmxfZnJhbWVfc3VwcGxpZWQ7CisJdTE2IGxhc3RfcnhfZnJhbWVfc2lnbmFsOworCXUxNiBsYXN0X3J4X2ZyYW1lX25vaXNlOworCXUxNiByeF9hdXRvZGV0ZWNfbm9fb2ZkbTsKKwl1MTYgcnhfYXV0b2RldGVjX25vX2JhcmtlcjsKKwl1MTYgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG5vdGlmX2NoYW5uZWxfcmVzdWx0IHsKKwl1OCBjaGFubmVsX251bTsKKwlzdHJ1Y3QgaXB3X2NtZF9zdGF0cyBzdGF0czsKKwl1OCB1UmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG5vdGlmX3NjYW5fY29tcGxldGUgeworCXU4IHNjYW5fdHlwZTsKKwl1OCBudW1fY2hhbm5lbHM7CisJdTggc3RhdHVzOworCXU4IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBub3RpZl9mcmFnX2xlbmd0aCB7CisJdTE2IGZyYWdfbGVuZ3RoOworCXUxNiByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgbm90aWZfYmVhY29uX3N0YXRlIHsKKwl1MzIgc3RhdGU7CisJdTMyIG51bWJlcjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgbm90aWZfdGdpX3R4X2tleSB7CisJdTgga2V5X3N0YXRlOworCXU4IHNlY3VyaXR5X3R5cGU7CisJdTggc3RhdGlvbl9pbmRleDsKKwl1OCByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgbm90aWZfbGlua19kZXRlcmlvcmF0aW9uIHsKKwlzdHJ1Y3QgaXB3X2NtZF9zdGF0cyBzdGF0czsKKwl1OCByYXRlOworCXU4IG1vZHVsYXRpb247CisJc3RydWN0IHJhdGVfaGlzdG9ncmFtIGhpc3RvZ3JhbTsKKwl1OCByZXNlcnZlZDE7CisJdTE2IHJlc2VydmVkMjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgbm90aWZfYXNzb2NpYXRpb24geworCXU4IHN0YXRlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBub3RpZl9hdXRoZW50aWNhdGUgeworCXU4IHN0YXRlOworCXN0cnVjdCBtYWNoZHIyNCBhZGRyOworCXUxNiBzdGF0dXM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG5vdGlmX2NhbGlicmF0aW9uIHsKKwl1OCBkYXRhWzEwNF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG5vdGlmX25vaXNlIHsKKwl1MzIgdmFsdWU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwd19yeF9ub3RpZmljYXRpb24geworCXU4IHJlc2VydmVkWzhdOworCXU4IHN1YnR5cGU7CisJdTggZmxhZ3M7CisJdTE2IHNpemU7CisJdW5pb24geworCQlzdHJ1Y3Qgbm90aWZfYXNzb2NpYXRpb24gYXNzb2M7CisJCXN0cnVjdCBub3RpZl9hdXRoZW50aWNhdGUgYXV0aDsKKwkJc3RydWN0IG5vdGlmX2NoYW5uZWxfcmVzdWx0IGNoYW5uZWxfcmVzdWx0OworCQlzdHJ1Y3Qgbm90aWZfc2Nhbl9jb21wbGV0ZSBzY2FuX2NvbXBsZXRlOworCQlzdHJ1Y3Qgbm90aWZfZnJhZ19sZW5ndGggZnJhZ19sZW47CisJCXN0cnVjdCBub3RpZl9iZWFjb25fc3RhdGUgYmVhY29uX3N0YXRlOworCQlzdHJ1Y3Qgbm90aWZfdGdpX3R4X2tleSB0Z2lfdHhfa2V5OworCQlzdHJ1Y3Qgbm90aWZfbGlua19kZXRlcmlvcmF0aW9uIGxpbmtfZGV0ZXJpb3JhdGlvbjsKKwkJc3RydWN0IG5vdGlmX2NhbGlicmF0aW9uIGNhbGlicmF0aW9uOworCQlzdHJ1Y3Qgbm90aWZfbm9pc2Ugbm9pc2U7CisJCXU4IHJhd1swXTsKKwl9IHU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwd19yeF9mcmFtZSB7CisJdTMyIHJlc2VydmVkMTsKKwl1OCBwYXJlbnRfdHNmWzRdOwkvLyBmd191c2VbMF0gaXMgYm9vbGVhbiBmb3IgT1VSX1RTRl9JU19HUkVBVEVSCisJdTggcmVjZWl2ZWRfY2hhbm5lbDsJLy8gVGhlIGNoYW5uZWwgdGhhdCB0aGlzIGZyYW1lIHdhcyByZWNlaXZlZCBvbi4KKwkvLyBOb3RlIHRoYXQgZm9yIC4xMWIgdGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlCisJLy8gdGhlIHNhbWUgYXMgdGhlIGNoYW5uZWwgdGhhdCBpdCB3YXMgc2VudC4KKwkvLyBGaWxsZWQgYnkgTE1BQworCXU4IGZyYW1lU3RhdHVzOworCXU4IHJhdGU7CisJdTggcnNzaTsKKwl1OCBhZ2M7CisJdTggcnNzaV9kYm07CisJdTE2IHNpZ25hbDsKKwl1MTYgbm9pc2U7CisJdTggYW50ZW5uYUFuZFBoeTsKKwl1OCBjb250cm9sOwkJLy8gY29udHJvbCBiaXQgc2hvdWxkIGJlIG9uIGluIGJnCisJdTggcnRzY3RzX3JhdGU7CQkvLyByYXRlIG9mIHJ0cyBvciBjdHMgKGluIHJ0cyBjdHMgc2VxdWVuY2UgcmF0ZQorCS8vIGlzIGlkZW50aWNhbCkKKwl1OCBydHNjdHNfc2VlbjsJCS8vIDB4MSBSVFMgc2VlbiA7IDB4MiBDVFMgc2VlbgorCXUxNiBsZW5ndGg7CisJdTggZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXB3X3J4X2hlYWRlciB7CisJdTggbWVzc2FnZV90eXBlOworCXU4IHJ4X3NlcV9udW07CisJdTggY29udHJvbF9iaXRzOworCXU4IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpcHdfcnhfcGFja2V0IHsKKwlzdHJ1Y3QgaXB3X3J4X2hlYWRlciBoZWFkZXI7CisJdW5pb24geworCQlzdHJ1Y3QgaXB3X3J4X2ZyYW1lIGZyYW1lOworCQlzdHJ1Y3QgaXB3X3J4X25vdGlmaWNhdGlvbiBub3RpZmljYXRpb247CisJfSB1OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgSVBXX1JYX05PVElGSUNBVElPTl9TSVpFIHNpemVvZihzdHJ1Y3QgaXB3X3J4X2hlYWRlcikgKyAxMgorI2RlZmluZSBJUFdfUlhfRlJBTUVfU0laRSAgICAgICAgc2l6ZW9mKHN0cnVjdCBpcHdfcnhfaGVhZGVyKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaXB3X3J4X2ZyYW1lKQorCitzdHJ1Y3QgaXB3X3J4X21lbV9idWZmZXIgeworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJc3RydWN0IGlwd19yeF9idWZmZXIgKnJ4YjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CQkJCS8qIE5vdCB0cmFuc2ZlcnJlZCBvdmVyIG5ldHdvcmssIHNvIG5vdCAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICovCisKK3N0cnVjdCBpcHdfcnhfcXVldWUgeworCXN0cnVjdCBpcHdfcnhfbWVtX2J1ZmZlciBwb29sW1JYX1FVRVVFX1NJWkUgKyBSWF9GUkVFX0JVRkZFUlNdOworCXN0cnVjdCBpcHdfcnhfbWVtX2J1ZmZlciAqcXVldWVbUlhfUVVFVUVfU0laRV07CisJdTMyIHByb2Nlc3NlZDsJCS8qIEludGVybmFsIGluZGV4IHRvIGxhc3QgaGFuZGxlZCBSeCBwYWNrZXQgKi8KKwl1MzIgcmVhZDsJCS8qIFNoYXJlZCBpbmRleCB0byBuZXdlc3QgYXZhaWxhYmxlIFJ4IGJ1ZmZlciAqLworCXUzMiB3cml0ZTsJCS8qIFNoYXJlZCBpbmRleCB0byBvbGRlc3Qgd3JpdHRlbiBSeCBwYWNrZXQgKi8KKwl1MzIgZnJlZV9jb3VudDsJCS8qIE51bWJlciBvZiBwcmUtYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gcnhfZnJlZSAqLworCS8qIEVhY2ggb2YgdGhlc2UgbGlzdHMgaXMgdXNlZCBhcyBhIEZJRk8gZm9yIGlwd19yeF9tZW1fYnVmZmVycyAqLworCXN0cnVjdCBsaXN0X2hlYWQgcnhfZnJlZTsJLyogT3duIGFuIFNLQnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X3VzZWQ7CS8qIE5vIFNLQiBhbGxvY2F0ZWQgKi8KKwlzcGlubG9ja190IGxvY2s7Cit9OwkJCQkvKiBOb3QgdHJhbnNmZXJyZWQgb3ZlciBuZXR3b3JrLCBzbyBub3QgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAqLworCitzdHJ1Y3QgYWxpdmVfY29tbWFuZF9yZXNwb25jZSB7CisJdTggYWxpdmVfY29tbWFuZDsKKwl1OCBzZXF1ZW5jZV9udW1iZXI7CisJdTE2IHNvZnR3YXJlX3JldmlzaW9uOworCXU4IGRldmljZV9pZGVudGlmaWVyOworCXU4IHJlc2VydmVkMVs1XTsKKwl1MTYgcmVzZXJ2ZWQyOworCXUxNiByZXNlcnZlZDM7CisJdTE2IGNsb2NrX3NldHRsZV90aW1lOworCXUxNiBwb3dlcnVwX3NldHRsZV90aW1lOworCXUxNiByZXNlcnZlZDQ7CisJdTggdGltZV9zdGFtcFs1XTsJLyogbW9udGgsIGRheSwgeWVhciwgaG91cnMsIG1pbnV0ZXMgKi8KKwl1OCB1Y29kZV92YWxpZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIElQV19NQVhfUkFURVMgMTIKKworc3RydWN0IGlwd19yYXRlcyB7CisJdTggbnVtX3JhdGVzOworCXU4IHJhdGVzW0lQV19NQVhfUkFURVNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBjb21tYW5kX2Jsb2NrIHsKKwl1bnNpZ25lZCBpbnQgY29udHJvbDsKKwl1MzIgc291cmNlX2FkZHI7CisJdTMyIGRlc3RfYWRkcjsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgQ0JfTlVNQkVSX09GX0VMRU1FTlRTX1NNQUxMIDY0CitzdHJ1Y3QgZndfaW1hZ2VfZGVzYyB7CisJdW5zaWduZWQgbG9uZyBsYXN0X2NiX2luZGV4OworCXVuc2lnbmVkIGxvbmcgY3VycmVudF9jYl9pbmRleDsKKwlzdHJ1Y3QgY29tbWFuZF9ibG9jayBjYl9saXN0W0NCX05VTUJFUl9PRl9FTEVNRU5UU19TTUFMTF07CisJdm9pZCAqdl9hZGRyOworCXVuc2lnbmVkIGxvbmcgcF9hZGRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworfTsKKworc3RydWN0IGlwd19zeXNfY29uZmlnIHsKKwl1OCBidF9jb2V4aXN0ZW5jZTsKKwl1OCByZXNlcnZlZDE7CisJdTggYW5zd2VyX2Jyb2FkY2FzdF9zc2lkX3Byb2JlOworCXU4IGFjY2VwdF9hbGxfZGF0YV9mcmFtZXM7CisJdTggYWNjZXB0X25vbl9kaXJlY3RlZF9mcmFtZXM7CisJdTggZXhjbHVkZV91bmljYXN0X3VuZW5jcnlwdGVkOworCXU4IGRpc2FibGVfdW5pY2FzdF9kZWNyeXB0aW9uOworCXU4IGV4Y2x1ZGVfbXVsdGljYXN0X3VuZW5jcnlwdGVkOworCXU4IGRpc2FibGVfbXVsdGljYXN0X2RlY3J5cHRpb247CisJdTggYW50ZW5uYV9kaXZlcnNpdHk7CisJdTggcGFzc19jcmNfdG9faG9zdDsKKwl1OCBkb3QxMWdfYXV0b19kZXRlY3Rpb247CisJdTggZW5hYmxlX2N0c190b19zZWxmOworCXU4IGVuYWJsZV9tdWx0aWNhc3RfZmlsdGVyaW5nOworCXU4IGJ0X2NvZXhpc3RfY29sbGlzaW9uX3RocjsKKwl1OCByZXNlcnZlZDI7CisJdTggYWNjZXB0X2FsbF9tZ210X2JjcHI7CisJdTggYWNjZXB0X2FsbF9tZ3RtX2ZyYW1lczsKKwl1OCBwYXNzX25vaXNlX3N0YXRzX3RvX2hvc3Q7CisJdTggcmVzZXJ2ZWQzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpcHdfbXVsdGljYXN0X2FkZHIgeworCXU4IG51bV9vZl9tdWx0aWNhc3RfYWRkcmVzc2VzOworCXU4IHJlc2VydmVkWzNdOworCXU4IG1hYzFbNl07CisJdTggbWFjMls2XTsKKwl1OCBtYWMzWzZdOworCXU4IG1hYzRbNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwd193ZXBfa2V5IHsKKwl1OCBjbWRfaWQ7CisJdTggc2VxX251bTsKKwl1OCBrZXlfaW5kZXg7CisJdTgga2V5X3NpemU7CisJdTgga2V5WzE2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXB3X3RnaV90eF9rZXkgeworCXU4IGtleV9pZDsKKwl1OCBzZWN1cml0eV90eXBlOworCXU4IHN0YXRpb25faW5kZXg7CisJdTggZmxhZ3M7CisJdTgga2V5WzE2XTsKKwl1MzIgdHhfY291bnRlclsyXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIElQV19TQ0FOX0NIQU5ORUxTIDU0CisKK3N0cnVjdCBpcHdfc2Nhbl9yZXF1ZXN0IHsKKwl1OCBzY2FuX3R5cGU7CisJdTE2IGR3ZWxsX3RpbWU7CisJdTggY2hhbm5lbHNfbGlzdFtJUFdfU0NBTl9DSEFOTkVMU107CisJdTggY2hhbm5lbHNfcmVzZXJ2ZWRbM107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworZW51bSB7CisJSVBXX1NDQU5fUEFTU0lWRV9USUxMX0ZJUlNUX0JFQUNPTl9TQ0FOID0gMCwKKwlJUFdfU0NBTl9QQVNTSVZFX0ZVTExfRFdFTExfU0NBTiwKKwlJUFdfU0NBTl9BQ1RJVkVfRElSRUNUX1NDQU4sCisJSVBXX1NDQU5fQUNUSVZFX0JST0FEQ0FTVF9TQ0FOLAorCUlQV19TQ0FOX0FDVElWRV9CUk9BRENBU1RfQU5EX0RJUkVDVF9TQ0FOLAorCUlQV19TQ0FOX1RZUEVTCit9OworCitzdHJ1Y3QgaXB3X3NjYW5fcmVxdWVzdF9leHQgeworCXUzMiBmdWxsX3NjYW5faW5kZXg7CisJdTggY2hhbm5lbHNfbGlzdFtJUFdfU0NBTl9DSEFOTkVMU107CisJdTggc2Nhbl90eXBlW0lQV19TQ0FOX0NIQU5ORUxTIC8gMl07CisJdTggcmVzZXJ2ZWQ7CisJdTE2IGR3ZWxsX3RpbWVbSVBXX1NDQU5fVFlQRVNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2V4dGVybiBpbmxpbmUgdTggaXB3X2dldF9zY2FuX3R5cGUoc3RydWN0IGlwd19zY2FuX3JlcXVlc3RfZXh0ICpzY2FuLCB1OCBpbmRleCkKK3sKKwlpZiAoaW5kZXggJSAyKQorCQlyZXR1cm4gc2Nhbi0+c2Nhbl90eXBlW2luZGV4IC8gMl0gJiAweDBGOworCWVsc2UKKwkJcmV0dXJuIChzY2FuLT5zY2FuX3R5cGVbaW5kZXggLyAyXSAmIDB4RjApID4+IDQ7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBpcHdfc2V0X3NjYW5fdHlwZShzdHJ1Y3QgaXB3X3NjYW5fcmVxdWVzdF9leHQgKnNjYW4sCisJCQkJICAgICB1OCBpbmRleCwgdTggc2Nhbl90eXBlKQoreworCWlmIChpbmRleCAlIDIpCisJCXNjYW4tPnNjYW5fdHlwZVtpbmRleCAvIDJdID0KKwkJICAgIChzY2FuLT5zY2FuX3R5cGVbaW5kZXggLyAyXSAmIDB4RjApIHwgKHNjYW5fdHlwZSAmIDB4MEYpOworCWVsc2UKKwkJc2Nhbi0+c2Nhbl90eXBlW2luZGV4IC8gMl0gPQorCQkgICAgKHNjYW4tPnNjYW5fdHlwZVtpbmRleCAvIDJdICYgMHgwRikgfAorCQkgICAgKChzY2FuX3R5cGUgJiAweDBGKSA8PCA0KTsKK30KKworc3RydWN0IGlwd19hc3NvY2lhdGUgeworCXU4IGNoYW5uZWw7CisJdTggYXV0aF90eXBlOjQsIGF1dGhfa2V5OjQ7CisJdTggYXNzb2NfdHlwZTsKKwl1OCByZXNlcnZlZDsKKwl1MTYgcG9saWN5X3N1cHBvcnQ7CisJdTggcHJlYW1ibGVfbGVuZ3RoOworCXU4IGllZWVfbW9kZTsKKwl1OCBic3NpZFtFVEhfQUxFTl07CisJdTMyIGFzc29jX3RzZl9tc3c7CisJdTMyIGFzc29jX3RzZl9sc3c7CisJdTE2IGNhcGFiaWxpdHk7CisJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCXU4IGRlc3RbRVRIX0FMRU5dOworCXUxNiBhdGltX3dpbmRvdzsKKwl1OCBzbXI7CisJdTggcmVzZXJ2ZWQxOworCXUxNiByZXNlcnZlZDI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwd19zdXBwb3J0ZWRfcmF0ZXMgeworCXU4IGllZWVfbW9kZTsKKwl1OCBudW1fcmF0ZXM7CisJdTggcHVycG9zZTsKKwl1OCByZXNlcnZlZDsKKwl1OCBzdXBwb3J0ZWRfcmF0ZXNbSVBXX01BWF9SQVRFU107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwd19ydHNfdGhyZXNob2xkIHsKKwl1MTYgcnRzX3RocmVzaG9sZDsKKwl1MTYgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwd19mcmFnX3RocmVzaG9sZCB7CisJdTE2IGZyYWdfdGhyZXNob2xkOworCXUxNiByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXB3X3JldHJ5X2xpbWl0IHsKKwl1OCBzaG9ydF9yZXRyeV9saW1pdDsKKwl1OCBsb25nX3JldHJ5X2xpbWl0OworCXUxNiByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXB3X2Rpbm9fY29uZmlnIHsKKwl1MzIgZGlub19jb25maWdfYWRkcjsKKwl1MTYgZGlub19jb25maWdfc2l6ZTsKKwl1OCBkaW5vX3Jlc3BvbnNlOworCXU4IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpcHdfYWlyb25ldF9pbmZvIHsKKwl1OCBpZDsKKwl1OCBsZW5ndGg7CisJdTE2IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpcHdfcnhfa2V5IHsKKwl1OCBzdGF0aW9uX2luZGV4OworCXU4IGtleV90eXBlOworCXU4IGtleV9pZDsKKwl1OCBrZXlfZmxhZzsKKwl1OCBrZXlbMTZdOworCXU4IHN0YXRpb25fYWRkcmVzc1s2XTsKKwl1OCBrZXlfaW5kZXg7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwd19jb3VudHJ5X2NoYW5uZWxfaW5mbyB7CisJdTggZmlyc3RfY2hhbm5lbDsKKwl1OCBub19jaGFubmVsczsKKwlzOCBtYXhfdHhfcG93ZXI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwd19jb3VudHJ5X2luZm8geworCXU4IGlkOworCXU4IGxlbmd0aDsKKwl1OCBjb3VudHJ5X3N0clszXTsKKwlzdHJ1Y3QgaXB3X2NvdW50cnlfY2hhbm5lbF9pbmZvIGdyb3Vwc1s3XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXB3X2NoYW5uZWxfdHhfcG93ZXIgeworCXU4IGNoYW5uZWxfbnVtYmVyOworCXM4IHR4X3Bvd2VyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgU0NBTl9BU1NPQ0lBVEVEX0lOVEVSVkFMIChIWikKKyNkZWZpbmUgU0NBTl9JTlRFUlZBTCAoSFogLyAxMCkKKyNkZWZpbmUgTUFYX0FfQ0hBTk5FTFMgIDM3CisjZGVmaW5lIE1BWF9CX0NIQU5ORUxTICAxNAorCitzdHJ1Y3QgaXB3X3R4X3Bvd2VyIHsKKwl1OCBudW1fY2hhbm5lbHM7CisJdTggaWVlZV9tb2RlOworCXN0cnVjdCBpcHdfY2hhbm5lbF90eF9wb3dlciBjaGFubmVsc190eF9wb3dlcltNQVhfQV9DSEFOTkVMU107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwd19xb3NfcGFyYW1ldGVycyB7CisJdTE2IGN3X21pbls0XTsKKwl1MTYgY3dfbWF4WzRdOworCXU4IGFpZnNbNF07CisJdTggZmxhZ1s0XTsKKwl1MTYgdHhfb3BfbGltaXRbNF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwd19yc25fY2FwYWJpbGl0aWVzIHsKKwl1OCBpZDsKKwl1OCBsZW5ndGg7CisJdTE2IHZlcnNpb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGlwd19zZW5zaXRpdml0eV9jYWxpYiB7CisJdTE2IGJlYWNvbl9yc3NpX3JhdzsKKwl1MTYgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqCisgKiBIb3N0IGNvbW1hbmQgc3RydWN0dXJlLgorICoKKyAqIE9uIGlucHV0LCB0aGUgZm9sbG93aW5nIGZpZWxkcyBzaG91bGQgYmUgZmlsbGVkOgorICogLSBjbWQKKyAqIC0gbGVuCisgKiAtIHN0YXR1c19sZW4KKyAqIC0gcGFyYW0gKGlmIG5lZWRlZCkKKyAqCisgKiBPbiBvdXRwdXQsCisgKiAtIFxhIHN0YXR1cyBjb250YWlucyBzdGF0dXM7CisgKiAtIFxhIHBhcmFtIGZpbGxlZCB3aXRoIHN0YXR1cyBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgaXB3X2NtZCB7CisJdTMyIGNtZDsgICAvKio8IEhvc3QgY29tbWFuZCAqLworCXUzMiBzdGF0dXM7LyoqPCBTdGF0dXMgKi8KKwl1MzIgc3RhdHVzX2xlbjsKKwkJICAgLyoqPCBIb3cgbWFueSAzMiBiaXQgcGFyYW1ldGVycyBpbiB0aGUgc3RhdHVzICovCisJdTMyIGxlbjsgICAvKio8IGluY29taW5nIHBhcmFtZXRlcnMgbGVuZ3RoLCBieXRlcyAqLworICAvKioKKyAgICogY29tbWFuZCBwYXJhbWV0ZXJzLgorICAgKiBUaGVyZSBzaG91bGQgYmUgZW5vdWdoIHNwYWNlIGZvciBpbmNvbWluZyBhbmQKKyAgICogb3V0Y29taW5nIHBhcmFtZXRlcnMuCisgICAqIEluY29taW5nIHBhcmFtZXRlcnMgbGlzdGVkIDEtc3QsIGZvbGxvd2VkIGJ5IG91dGNvbWluZyBwYXJhbXMuCisgICAqIG5QYXJhbXM9KGxlbiszKS80K3N0YXR1c19sZW4KKyAgICovCisJdTMyIHBhcmFtWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgU1RBVFVTX0hDTURfQUNUSVZFICAgICAgKDE8PDApCS8qKjwgaG9zdCBjb21tYW5kIGluIHByb2dyZXNzICovCisKKyNkZWZpbmUgU1RBVFVTX0lOVF9FTkFCTEVEICAgICAgKDE8PDEpCisjZGVmaW5lIFNUQVRVU19SRl9LSUxMX0hXICAgICAgICgxPDwyKQorI2RlZmluZSBTVEFUVVNfUkZfS0lMTF9TVyAgICAgICAoMTw8MykKKyNkZWZpbmUgU1RBVFVTX1JGX0tJTExfTUFTSyAgICAgKFNUQVRVU19SRl9LSUxMX0hXIHwgU1RBVFVTX1JGX0tJTExfU1cpCisKKyNkZWZpbmUgU1RBVFVTX0lOSVQgICAgICAgICAgICAgKDE8PDUpCisjZGVmaW5lIFNUQVRVU19BVVRIICAgICAgICAgICAgICgxPDw2KQorI2RlZmluZSBTVEFUVVNfQVNTT0NJQVRFRCAgICAgICAoMTw8NykKKyNkZWZpbmUgU1RBVFVTX1NUQVRFX01BU0sgICAgICAgKFNUQVRVU19JTklUIHwgU1RBVFVTX0FVVEggfCBTVEFUVVNfQVNTT0NJQVRFRCkKKworI2RlZmluZSBTVEFUVVNfQVNTT0NJQVRJTkcgICAgICAoMTw8OCkKKyNkZWZpbmUgU1RBVFVTX0RJU0FTU09DSUFUSU5HICAgKDE8PDkpCisjZGVmaW5lIFNUQVRVU19ST0FNSU5HICAgICAgICAgICgxPDwxMCkKKyNkZWZpbmUgU1RBVFVTX0VYSVRfUEVORElORyAgICAgKDE8PDExKQorI2RlZmluZSBTVEFUVVNfRElTQVNTT0NfUEVORElORyAoMTw8MTIpCisjZGVmaW5lIFNUQVRVU19TVEFURV9QRU5ESU5HICAgICgxPDwxMykKKworI2RlZmluZSBTVEFUVVNfU0NBTl9QRU5ESU5HICAgICAoMTw8MjApCisjZGVmaW5lIFNUQVRVU19TQ0FOTklORyAgICAgICAgICgxPDwyMSkKKyNkZWZpbmUgU1RBVFVTX1NDQU5fQUJPUlRJTkcgICAgKDE8PDIyKQorCisjZGVmaW5lIFNUQVRVU19JTkRJUkVDVF9CWVRFICAgICgxPDwyOCkJLyogc3lzZnMgZW50cnkgY29uZmlndXJlZCBmb3IgYWNjZXNzICovCisjZGVmaW5lIFNUQVRVU19JTkRJUkVDVF9EV09SRCAgICgxPDwyOSkJLyogc3lzZnMgZW50cnkgY29uZmlndXJlZCBmb3IgYWNjZXNzICovCisjZGVmaW5lIFNUQVRVU19ESVJFQ1RfRFdPUkQgICAgICgxPDwzMCkJLyogc3lzZnMgZW50cnkgY29uZmlndXJlZCBmb3IgYWNjZXNzICovCisKKyNkZWZpbmUgU1RBVFVTX1NFQ1VSSVRZX1VQREFURUQgKDE8PDMxKQkvKiBTZWN1cml0eSBzeW5jIG5lZWRlZCAqLworCisjZGVmaW5lIENGR19TVEFUSUNfQ0hBTk5FTCAgICAgICgxPDwwKQkvKiBSZXN0cmljdCBhc3NvYy4gdG8gc2luZ2xlIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0ZHX1NUQVRJQ19FU1NJRCAgICAgICAgKDE8PDEpCS8qIFJlc3RyaWN0IGFzc29jLiB0byBzaW5nbGUgU1NJRCAqLworI2RlZmluZSBDRkdfU1RBVElDX0JTU0lEICAgICAgICAoMTw8MikJLyogUmVzdHJpY3QgYXNzb2MuIHRvIHNpbmdsZSBCU1NJRCAqLworI2RlZmluZSBDRkdfQ1VTVE9NX01BQyAgICAgICAgICAoMTw8MykKKyNkZWZpbmUgQ0ZHX1BSRUFNQkxFICAgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIENGR19BREhPQ19QRVJTSVNUICAgICAgICgxPDw1KQorI2RlZmluZSBDRkdfQVNTT0NJQVRFICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgQ0ZHX0ZJWEVEX1JBVEUgICAgICAgICAgKDE8PDcpCisjZGVmaW5lIENGR19BREhPQ19DUkVBVEUgICAgICAgICgxPDw4KQorCisjZGVmaW5lIENBUF9TSEFSRURfS0VZICAgICAgICAgICgxPDwwKQkvKiBPZmYgPSBPUEVOICovCisjZGVmaW5lIENBUF9QUklWQUNZX09OICAgICAgICAgICgxPDwxKQkvKiBPZmYgPSBObyBwcml2YWN5ICovCisKKyNkZWZpbmUgTUFYX1NUQVRJT05TICAgICAgICAgICAgMzIKKyNkZWZpbmUgSVBXX0lOVkFMSURfU1RBVElPTiAgICAgKDB4ZmYpCisKK3N0cnVjdCBpcHdfc3RhdGlvbl9lbnRyeSB7CisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOworCXU4IHJlc2VydmVkOworCXU4IHN1cHBvcnRfbW9kZTsKK307CisKKyNkZWZpbmUgQVZHX0VOVFJJRVMgOAorc3RydWN0IGF2ZXJhZ2UgeworCXMxNiBlbnRyaWVzW0FWR19FTlRSSUVTXTsKKwl1OCBwb3M7CisJdTggaW5pdDsKKwlzMzIgc3VtOworfTsKKworc3RydWN0IGlwd19wcml2IHsKKwkvKiBpZWVlIGRldmljZSB1c2VkIGJ5IGdlbmVyaWMgaWVlZSBwcm9jZXNzaW5nIGNvZGUgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYzsKKworCS8qIHNwaW5sb2NrICovCisJc3BpbmxvY2tfdCBsb2NrOworCisJLyogYmFzaWMgcGNpLW5ldHdvcmsgZHJpdmVyIHN0dWZmICovCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisKKwkvKiBwY2kgaGFyZHdhcmUgYWRkcmVzcyBzdXBwb3J0ICovCisJdm9pZCBfX2lvbWVtICpod19iYXNlOworCXVuc2lnbmVkIGxvbmcgaHdfbGVuOworCisJc3RydWN0IGZ3X2ltYWdlX2Rlc2Mgc3JhbV9kZXNjOworCisJLyogcmVzdWx0IG9mIHVjb2RlIGRvd25sb2FkICovCisJc3RydWN0IGFsaXZlX2NvbW1hbmRfcmVzcG9uY2UgZGlub19hbGl2ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfY29tbWFuZF9xdWV1ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3N0YXRlOworCisJLyogUnggYW5kIFR4IERNQSBwcm9jZXNzaW5nIHF1ZXVlcyAqLworCXN0cnVjdCBpcHdfcnhfcXVldWUgKnJ4cTsKKwlzdHJ1Y3QgY2x4Ml90eF9xdWV1ZSB0eHFfY21kOworCXN0cnVjdCBjbHgyX3R4X3F1ZXVlIHR4cVs0XTsKKwl1MzIgc3RhdHVzOworCXUzMiBjb25maWc7CisJdTMyIGNhcGFiaWxpdHk7CisKKwl1OCBsYXN0X3J4X3Jzc2k7CisJdTggbGFzdF9ub2lzZTsKKwlzdHJ1Y3QgYXZlcmFnZSBhdmVyYWdlX21pc3NlZF9iZWFjb25zOworCXN0cnVjdCBhdmVyYWdlIGF2ZXJhZ2VfcnNzaTsKKwlzdHJ1Y3QgYXZlcmFnZSBhdmVyYWdlX25vaXNlOworCXUzMiBwb3J0X3R5cGU7CisJaW50IHJ4X2J1ZnNfbWluOwkgIC8qKjwgbWluaW11bSBudW1iZXIgb2YgYnVmcyBpbiBSeCBxdWV1ZSAqLworCWludCByeF9wZW5kX21heDsJICAvKio8IG1heGltdW0gcGVuZGluZyBidWZmZXJzIGZvciBvbmUgSVJRICovCisJdTMyIGhjbWRfc2VxOwkJICAvKio8IHNlcXVlbmNlIG51bWJlciBmb3IgaGNtZCAqLworCXUzMiBtaXNzZWRfYmVhY29uX3RocmVzaG9sZDsKKwl1MzIgcm9hbWluZ190aHJlc2hvbGQ7CisKKwlzdHJ1Y3QgaXB3X2Fzc29jaWF0ZSBhc3NvY19yZXF1ZXN0OworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYXNzb2NfbmV0d29yazsKKworCXVuc2lnbmVkIGxvbmcgdHNfc2Nhbl9hYm9ydDsKKwlzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyByYXRlczsKKwlzdHJ1Y3QgaXB3X3JhdGVzIHBoeVszXTsJICAgLyoqPCBQSFkgcmVzdHJpY3Rpb25zLCBwZXIgYmFuZCAqLworCXN0cnVjdCBpcHdfcmF0ZXMgc3VwcDsJCSAgIC8qKjwgc29mdHdhcmUgZGVmaW5lZCAqLworCXN0cnVjdCBpcHdfcmF0ZXMgZXh0ZW5kZWQ7CSAgIC8qKjwgdXNlIGZvciBjb3JyZXNwLiBJRSwgQVAgb25seSAqLworCisJc3RydWN0IG5vdGlmX2xpbmtfZGV0ZXJpb3JhdGlvbiBsYXN0X2xpbmtfZGV0ZXJpb3JhdGlvbjsgLyoqIGZvciBzdGF0aXN0aWNzICovCisJc3RydWN0IGlwd19jbWQgKmhjbWQ7IC8qKjwgaG9zdCBjb21tYW5kIGN1cnJlbnRseSBleGVjdXRlZCAqLworCisJd2FpdF9xdWV1ZV9oZWFkX3QgaGNtZF93cTsgICAgIC8qKjwgaG9zdCBjb21tYW5kIHdhaXRzIGZvciBleGVjdXRpb24gKi8KKwl1MzIgdHNmX2JjblsyXTsJCSAgICAgLyoqPCBUU0YgZnJvbSBsYXRlc3QgYmVhY29uICovCisKKwlzdHJ1Y3Qgbm90aWZfY2FsaWJyYXRpb24gY2FsaWI7CS8qKjwgbGFzdCBjYWxpYnJhdGlvbiAqLworCisJLyogb3JkaW5hbCBpbnRlcmZhY2Ugd2l0aCBmaXJtd2FyZSAqLworCXUzMiB0YWJsZTBfYWRkcjsKKwl1MzIgdGFibGUwX2xlbjsKKwl1MzIgdGFibGUxX2FkZHI7CisJdTMyIHRhYmxlMV9sZW47CisJdTMyIHRhYmxlMl9hZGRyOworCXUzMiB0YWJsZTJfbGVuOworCisJLyogY29udGV4dCBpbmZvcm1hdGlvbiAqLworCXU4IGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFXTsKKwl1OCBlc3NpZF9sZW47CisJdTggbmlja1tJV19FU1NJRF9NQVhfU0laRV07CisJdTE2IHJhdGVzX21hc2s7CisJdTggY2hhbm5lbDsKKwlzdHJ1Y3QgaXB3X3N5c19jb25maWcgc3lzX2NvbmZpZzsKKwl1MzIgcG93ZXJfbW9kZTsKKwl1OCBic3NpZFtFVEhfQUxFTl07CisJdTE2IHJ0c190aHJlc2hvbGQ7CisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOworCXU4IG51bV9zdGF0aW9uczsKKwl1OCBzdGF0aW9uc1tNQVhfU1RBVElPTlNdW0VUSF9BTEVOXTsKKworCXUzMiBub3RpZl9taXNzZWRfYmVhY29uczsKKworCS8qIFN0YXRpc3RpY3MgYW5kIGNvdW50ZXJzIG5vcm1hbGl6ZWQgd2l0aCBlYWNoIGFzc29jaWF0aW9uICovCisJdTMyIGxhc3RfbWlzc2VkX2JlYWNvbnM7CisJdTMyIGxhc3RfdHhfcGFja2V0czsKKwl1MzIgbGFzdF9yeF9wYWNrZXRzOworCXUzMiBsYXN0X3R4X2ZhaWx1cmVzOworCXUzMiBsYXN0X3J4X2VycjsKKwl1MzIgbGFzdF9yYXRlOworCisJdTMyIG1pc3NlZF9hZGhvY19iZWFjb25zOworCXUzMiBtaXNzZWRfYmVhY29uczsKKwl1MzIgcnhfcGFja2V0czsKKwl1MzIgdHhfcGFja2V0czsKKwl1MzIgcXVhbGl0eTsKKworCS8qIGVlcHJvbSAqLworCXU4IGVlcHJvbVsweDEwMF07CS8qIDI1NiBieXRlcyBvZiBlZXByb20gKi8KKwlpbnQgZWVwcm9tX2RlbGF5OworCisJc3RydWN0IGl3X3N0YXRpc3RpY3Mgd3N0YXRzOworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCBhZGhvY19jaGVjazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlOworCXN0cnVjdCB3b3JrX3N0cnVjdCBkaXNhc3NvY2lhdGU7CisJc3RydWN0IHdvcmtfc3RydWN0IHJ4X3JlcGxlbmlzaDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVxdWVzdF9zY2FuOworCXN0cnVjdCB3b3JrX3N0cnVjdCBhZGFwdGVyX3Jlc3RhcnQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHJmX2tpbGw7CisJc3RydWN0IHdvcmtfc3RydWN0IHVwOworCXN0cnVjdCB3b3JrX3N0cnVjdCBkb3duOworCXN0cnVjdCB3b3JrX3N0cnVjdCBnYXRoZXJfc3RhdHM7CisJc3RydWN0IHdvcmtfc3RydWN0IGFib3J0X3NjYW47CisJc3RydWN0IHdvcmtfc3RydWN0IHJvYW07CisJc3RydWN0IHdvcmtfc3RydWN0IHNjYW5fY2hlY2s7CisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXJxX3Rhc2tsZXQ7CisKKyNkZWZpbmUgSVBXXzIyMDBCRyAgMQorI2RlZmluZSBJUFdfMjkxNUFCRyAyCisJdTggYWRhcHRlcjsKKworI2RlZmluZSBJUFdfREVGQVVMVF9UWF9QT1dFUiAweDE0CisJdTggdHhfcG93ZXI7CisKKyNpZmRlZiBDT05GSUdfUE0KKwl1MzIgcG1fc3RhdGVbMTZdOworI2VuZGlmCisKKwkvKiBuZXR3b3JrIHN0YXRlICovCisKKwkvKiBVc2VkIHRvIHBhc3MgdGhlIGN1cnJlbnQgSU5UQSB2YWx1ZSBmcm9tIElTUiB0byBUYXNrbGV0ICovCisJdTMyIGlzcl9pbnRhOworCisJLyogZGVidWdnaW5nIGluZm8gKi8KKwl1MzIgaW5kaXJlY3RfZHdvcmQ7CisJdTMyIGRpcmVjdF9kd29yZDsKKwl1MzIgaW5kaXJlY3RfYnl0ZTsKK307CQkJCS8qaXB3X3ByaXYgKi8KKworLyogZGVidWcgbWFjcm9zICovCisKKyNpZmRlZiBDT05GSUdfSVBXX0RFQlVHCisjZGVmaW5lIElQV19ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCitkbyB7IGlmIChpcHdfZGVidWdfbGV2ZWwgJiAobGV2ZWwpKSBcCisgIHByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FIjogJWMgJXMgIiBmbXQsIFwKKyAgICAgICAgIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIElQV19ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgkJCQkvKiBDT05GSUdfSVBXX0RFQlVHICovCisKKy8qCisgKiBUbyB1c2UgdGhlIGRlYnVnIHN5c3RlbTsKKyAqCisgKiBJZiB5b3UgYXJlIGRlZmluaW5nIGEgbmV3IGRlYnVnIGNsYXNzaWZpY2F0aW9uLCBzaW1wbHkgYWRkIGl0IHRvIHRoZSAjZGVmaW5lCisgKiBsaXN0IGhlcmUgaW4gdGhlIGZvcm0gb2Y6CisgKgorICogI2RlZmluZSBJUFdfRExfeHh4eCBWQUxVRQorICoKKyAqIHNoaWZ0aW5nIHZhbHVlIHRvIHRoZSBsZWZ0IG9uZSBiaXQgZnJvbSB0aGUgcHJldmlvdXMgZW50cnkuICB4eHh4IHNob3VsZCBiZQorICogdGhlIG5hbWUgb2YgdGhlIGNsYXNzaWZpY2F0aW9uIChmb3IgZXhhbXBsZSwgV0VQKQorICoKKyAqIFlvdSB0aGVuIG5lZWQgdG8gZWl0aGVyIGFkZCBhIElQV194eHh4X0RFQlVHKCkgbWFjcm8gZGVmaW5pdGlvbiBmb3IgeW91cgorICogY2xhc3NpZmljYXRpb24sIG9yIHVzZSBJUFdfREVCVUcoSVBXX0RMX3h4eHgsIC4uLikgd2hlbmV2ZXIgeW91IHdhbnQKKyAqIHRvIHNlbmQgb3V0cHV0IHRvIHRoYXQgY2xhc3NpZmljYXRpb24uCisgKgorICogVG8gYWRkIHlvdXIgZGVidWcgbGV2ZWwgdG8gdGhlIGxpc3Qgb2YgbGV2ZWxzIHNlZW4gd2hlbiB5b3UgcGVyZm9ybQorICoKKyAqICUgY2F0IC9wcm9jL25ldC9pcHcvZGVidWdfbGV2ZWwKKyAqCisgKiB5b3Ugc2ltcGx5IG5lZWQgdG8gYWRkIHlvdXIgZW50cnkgdG8gdGhlIGlwd19kZWJ1Z19sZXZlbHMgYXJyYXkuCisgKgorICogSWYgeW91IGRvIG5vdCBzZWUgZGVidWdfbGV2ZWwgaW4gL3Byb2MvbmV0L2lwdyB0aGVuIHlvdSBkbyBub3QgaGF2ZQorICogQ09ORklHX0lQV19ERUJVRyBkZWZpbmVkIGluIHlvdXIga2VybmVsIGNvbmZpZ3VyYXRpb24KKyAqCisgKi8KKworI2RlZmluZSBJUFdfRExfRVJST1IgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSVBXX0RMX1dBUk5JTkcgICAgICAgKDE8PDEpCisjZGVmaW5lIElQV19ETF9JTkZPICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJUFdfRExfV1ggICAgICAgICAgICAoMTw8MykKKyNkZWZpbmUgSVBXX0RMX0hPU1RfQ09NTUFORCAgKDE8PDUpCisjZGVmaW5lIElQV19ETF9TVEFURSAgICAgICAgICgxPDw2KQorCisjZGVmaW5lIElQV19ETF9OT1RJRiAgICAgICAgICgxPDwxMCkKKyNkZWZpbmUgSVBXX0RMX1NDQU4gICAgICAgICAgKDE8PDExKQorI2RlZmluZSBJUFdfRExfQVNTT0MgICAgICAgICAoMTw8MTIpCisjZGVmaW5lIElQV19ETF9EUk9QICAgICAgICAgICgxPDwxMykKKyNkZWZpbmUgSVBXX0RMX0lPQ1RMICAgICAgICAgKDE8PDE0KQorCisjZGVmaW5lIElQV19ETF9NQU5BR0UgICAgICAgICgxPDwxNSkKKyNkZWZpbmUgSVBXX0RMX0ZXICAgICAgICAgICAgKDE8PDE2KQorI2RlZmluZSBJUFdfRExfUkZfS0lMTCAgICAgICAoMTw8MTcpCisjZGVmaW5lIElQV19ETF9GV19FUlJPUlMgICAgICgxPDwxOCkKKworI2RlZmluZSBJUFdfRExfT1JEICAgICAgICAgICAoMTw8MjApCisKKyNkZWZpbmUgSVBXX0RMX0ZSQUcgICAgICAgICAgKDE8PDIxKQorI2RlZmluZSBJUFdfRExfV0VQICAgICAgICAgICAoMTw8MjIpCisjZGVmaW5lIElQV19ETF9UWCAgICAgICAgICAgICgxPDwyMykKKyNkZWZpbmUgSVBXX0RMX1JYICAgICAgICAgICAgKDE8PDI0KQorI2RlZmluZSBJUFdfRExfSVNSICAgICAgICAgICAoMTw8MjUpCisjZGVmaW5lIElQV19ETF9GV19JTkZPICAgICAgICgxPDwyNikKKyNkZWZpbmUgSVBXX0RMX0lPICAgICAgICAgICAgKDE8PDI3KQorI2RlZmluZSBJUFdfRExfVFJBQ0UgICAgICAgICAoMTw8MjgpCisKKyNkZWZpbmUgSVBXX0RMX1NUQVRTICAgICAgICAgKDE8PDI5KQorCisjZGVmaW5lIElQV19FUlJPUihmLCBhLi4uKSBwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogIiBmLCAjIyBhKQorI2RlZmluZSBJUFdfV0FSTklORyhmLCBhLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6ICIgZiwgIyMgYSkKKyNkZWZpbmUgSVBXX0RFQlVHX0lORk8oZiwgYS4uLikgICAgSVBXX0RFQlVHKElQV19ETF9JTkZPLCBmLCAjIyBhKQorCisjZGVmaW5lIElQV19ERUJVR19XWChmLCBhLi4uKSAgICAgSVBXX0RFQlVHKElQV19ETF9XWCwgZiwgIyMgYSkKKyNkZWZpbmUgSVBXX0RFQlVHX1NDQU4oZiwgYS4uLikgICBJUFdfREVCVUcoSVBXX0RMX1NDQU4sIGYsICMjIGEpCisjZGVmaW5lIElQV19ERUJVR19TVEFUVVMoZiwgYS4uLikgSVBXX0RFQlVHKElQV19ETF9TVEFUVVMsIGYsICMjIGEpCisjZGVmaW5lIElQV19ERUJVR19UUkFDRShmLCBhLi4uKSAgSVBXX0RFQlVHKElQV19ETF9UUkFDRSwgZiwgIyMgYSkKKyNkZWZpbmUgSVBXX0RFQlVHX1JYKGYsIGEuLi4pICAgICBJUFdfREVCVUcoSVBXX0RMX1JYLCBmLCAjIyBhKQorI2RlZmluZSBJUFdfREVCVUdfVFgoZiwgYS4uLikgICAgIElQV19ERUJVRyhJUFdfRExfVFgsIGYsICMjIGEpCisjZGVmaW5lIElQV19ERUJVR19JU1IoZiwgYS4uLikgICAgSVBXX0RFQlVHKElQV19ETF9JU1IsIGYsICMjIGEpCisjZGVmaW5lIElQV19ERUJVR19NQU5BR0VNRU5UKGYsIGEuLi4pIElQV19ERUJVRyhJUFdfRExfTUFOQUdFLCBmLCAjIyBhKQorI2RlZmluZSBJUFdfREVCVUdfV0VQKGYsIGEuLi4pICAgIElQV19ERUJVRyhJUFdfRExfV0VQLCBmLCAjIyBhKQorI2RlZmluZSBJUFdfREVCVUdfSEMoZiwgYS4uLikgSVBXX0RFQlVHKElQV19ETF9IT1NUX0NPTU1BTkQsIGYsICMjIGEpCisjZGVmaW5lIElQV19ERUJVR19GUkFHKGYsIGEuLi4pIElQV19ERUJVRyhJUFdfRExfRlJBRywgZiwgIyMgYSkKKyNkZWZpbmUgSVBXX0RFQlVHX0ZXKGYsIGEuLi4pIElQV19ERUJVRyhJUFdfRExfRlcsIGYsICMjIGEpCisjZGVmaW5lIElQV19ERUJVR19SRl9LSUxMKGYsIGEuLi4pIElQV19ERUJVRyhJUFdfRExfUkZfS0lMTCwgZiwgIyMgYSkKKyNkZWZpbmUgSVBXX0RFQlVHX0RST1AoZiwgYS4uLikgSVBXX0RFQlVHKElQV19ETF9EUk9QLCBmLCAjIyBhKQorI2RlZmluZSBJUFdfREVCVUdfSU8oZiwgYS4uLikgSVBXX0RFQlVHKElQV19ETF9JTywgZiwgIyMgYSkKKyNkZWZpbmUgSVBXX0RFQlVHX09SRChmLCBhLi4uKSBJUFdfREVCVUcoSVBXX0RMX09SRCwgZiwgIyMgYSkKKyNkZWZpbmUgSVBXX0RFQlVHX0ZXX0lORk8oZiwgYS4uLikgSVBXX0RFQlVHKElQV19ETF9GV19JTkZPLCBmLCAjIyBhKQorI2RlZmluZSBJUFdfREVCVUdfTk9USUYoZiwgYS4uLikgSVBXX0RFQlVHKElQV19ETF9OT1RJRiwgZiwgIyMgYSkKKyNkZWZpbmUgSVBXX0RFQlVHX1NUQVRFKGYsIGEuLi4pIElQV19ERUJVRyhJUFdfRExfU1RBVEUgfCBJUFdfRExfQVNTT0MgfCBJUFdfRExfSU5GTywgZiwgIyMgYSkKKyNkZWZpbmUgSVBXX0RFQlVHX0FTU09DKGYsIGEuLi4pIElQV19ERUJVRyhJUFdfRExfQVNTT0MgfCBJUFdfRExfSU5GTywgZiwgIyMgYSkKKyNkZWZpbmUgSVBXX0RFQlVHX1NUQVRTKGYsIGEuLi4pIElQV19ERUJVRyhJUFdfRExfU1RBVFMsIGYsICMjIGEpCisKKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisvKgorKiBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKKyovCisKKy8qIERpbm8gY29udHJvbCByZWdpc3RlcnMgYml0cyAqLworCisjZGVmaW5lIERJTk9fRU5BQkxFX1NZU1RFTSAweDgwCisjZGVmaW5lIERJTk9fRU5BQkxFX0NTICAgICAweDQwCisjZGVmaW5lIERJTk9fUlhGSUZPX0RBVEEgICAweDAxCisjZGVmaW5lIERJTk9fQ09OVFJPTF9SRUcgICAweDAwMjAwMDAwCisKKyNkZWZpbmUgQ1gyX0lOVEFfUlcgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBDWDJfSU5UQV9NQVNLX1IgICAweDAwMDAwMDBDCisjZGVmaW5lIENYMl9JTkRJUkVDVF9BRERSIDB4MDAwMDAwMTAKKyNkZWZpbmUgQ1gyX0lORElSRUNUX0RBVEEgMHgwMDAwMDAxNAorI2RlZmluZSBDWDJfQVVUT0lOQ19BRERSICAweDAwMDAwMDE4CisjZGVmaW5lIENYMl9BVVRPSU5DX0RBVEEgIDB4MDAwMDAwMUMKKyNkZWZpbmUgQ1gyX1JFU0VUX1JFRyAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBDWDJfR1BfQ05UUkxfUlcgICAweDAwMDAwMDI0CisKKyNkZWZpbmUgQ1gyX1JFQURfSU5UX1JFR0lTVEVSIDB4RkY0CisKKyNkZWZpbmUgQ1gyX0dQX0NOVFJMX0JJVF9JTklUX0RPTkUJMHgwMDAwMDAwNAorCisjZGVmaW5lIENYMl9SRUdJU1RFUl9ET01BSU4xX0VORCAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBDWDJfU1JBTV9SRUFEX0lOVF9SRUdJU1RFUiAJMHgwMDAwMGZmNAorCisjZGVmaW5lIENYMl9TSEFSRURfTE9XRVJfQk9VTkQgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBDWDJfSU5URVJSVVBUX0FSRUFfTE9XRVJfQk9VTkQgIDB4MDAwMDBmODAKKworI2RlZmluZSBDWDJfTklDX1NSQU1fTE9XRVJfQk9VTkQgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ1gyX05JQ19TUkFNX1VQUEVSX0JPVU5EICAgICAgICAweDAwMDMwMDAwCisKKyNkZWZpbmUgQ1gyX0JJVF9JTlRfSE9TVF9TUkFNX1JFQURfSU5UX1JFR0lTVEVSICgxIDw8IDI5KQorI2RlZmluZSBDWDJfR1BfQ05UUkxfQklUX0NMT0NLX1JFQURZICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ1gyX0dQX0NOVFJMX0JJVF9IT1NUX0FMTE9XU19TVEFOREJZIDB4MDAwMDAwMDIKKworLyoKKyAqIFJFU0VUIFJlZ2lzdGVyIEJpdCBJbmRleGVzCisgKi8KKyNkZWZpbmUgQ0JEX1JFU0VUX1JFR19QUklOQ0VUT05fUkVTRVQgMHgwMDAwMDAwMQkvKiBCaXQgMCAoTFNCKSAqLworI2RlZmluZSBDWDJfUkVTRVRfUkVHX1NXX1JFU0VUICAgICAgICAweDAwMDAwMDgwCS8qIEJpdCA3ICAgICAgICovCisjZGVmaW5lIENYMl9SRVNFVF9SRUdfTUFTVEVSX0RJU0FCTEVEIDB4MDAwMDAxMDAJLyogQml0IDggICAgICAgKi8KKyNkZWZpbmUgQ1gyX1JFU0VUX1JFR19TVE9QX01BU1RFUiAgICAgMHgwMDAwMDIwMAkvKiBCaXQgOSAgICAgICAqLworI2RlZmluZSBDWDJfQVJDX0tFU0hFVF9DT05GSUcgICAgICAgICAweDA4MDAwMDAwCS8qIEJpdCAyNyAgICAgICovCisjZGVmaW5lIENYMl9TVEFSVF9TVEFOREJZICAgICAgICAgICAgIDB4MDAwMDAwMDQJLyogQml0IDIgICAgICAgKi8KKworI2RlZmluZSBDWDJfQ1NSX0NJU19VUFBFUl9CT1VORAkweDAwMDAwMjAwCisjZGVmaW5lIENYMl9ET01BSU5fMF9FTkQgMHgxMDAwCisjZGVmaW5lIENMWF9NRU1fQkFSX1NJWkUgMHgxMDAwCisKKyNkZWZpbmUgQ1gyX0JBU0VCQU5EX0NPTlRST0xfU1RBVFVTCTBYMDAyMDAwMDAKKyNkZWZpbmUgQ1gyX0JBU0VCQU5EX1RYX0ZJRk9fV1JJVEUJMFgwMDIwMDAwNAorI2RlZmluZSBDWDJfQkFTRUJBTkRfUlhfRklGT19SRUFECTBYMDAyMDAwMDQKKyNkZWZpbmUgQ1gyX0JBU0VCQU5EX0NPTlRST0xfU1RPUkUJMFgwMDIwMDAxMAorCisjZGVmaW5lIENYMl9JTlRFUk5BTF9DTURfRVZFTlQgCTBYMDAzMDAwMDQKKyNkZWZpbmUgQ1gyX0JBU0VCQU5EX1BPV0VSX0RPV04gMHgwMDAwMDAwMQorCisjZGVmaW5lIENYMl9NRU1fSEFMVF9BTkRfUkVTRVQgIDB4MDAzMDAwZTAKKworLyogZGVmZ3JvdXAgYml0c19oYWx0X3Jlc2V0IE1FTV9IQUxUX0FORF9SRVNFVCByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIENYMl9CSVRfSEFMVF9SRVNFVF9PTgkweDgwMDAwMDAwCisjZGVmaW5lIENYMl9CSVRfSEFMVF9SRVNFVF9PRkYgCTB4MDAwMDAwMDAKKworI2RlZmluZSBDQl9MQVNUX1ZBTElEICAgICAweDIwMDAwMDAwCisjZGVmaW5lIENCX0lOVF9FTkFCTEVEICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgQ0JfVkFMSUQgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBDQl9TUkNfTEUgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIENCX0RFU1RfTEUgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQ0JfU1JDX0FVVE9JTkMgICAgMHgwMDgwMDAwMAorI2RlZmluZSBDQl9TUkNfSU9fR0FURUQgICAweDAwNDAwMDAwCisjZGVmaW5lIENCX0RFU1RfQVVUT0lOQyAgIDB4MDAwODAwMDAKKyNkZWZpbmUgQ0JfU1JDX1NJWkVfTE9ORyAgMHgwMDIwMDAwMAorI2RlZmluZSBDQl9ERVNUX1NJWkVfTE9ORyAweDAwMDIwMDAwCisKKy8qIERNQSBERUZJTkVTICovCisKKyNkZWZpbmUgRE1BX0NPTlRST0xfU01BTExfQ0JfQ09OU1RfVkFMVUUgMHgwMDU0MDAwMAorI2RlZmluZSBETUFfQ0JfU1RPUF9BTkRfQUJPUlQgICAgICAgICAgICAweDAwMDAwQzAwCisjZGVmaW5lIERNQV9DQl9TVEFSVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKworI2RlZmluZSBDWDJfU0hBUkVEX1NSQU1fU0laRSAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgQ1gyX1NIQVJFRF9TUkFNX0RNQV9DT05UUk9MICAgICAgICAweDAwMDI3MDAwCisjZGVmaW5lIENCX01BWF9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgMHgxRkZGCisKKyNkZWZpbmUgQ1gyX0hPU1RfRUVQUk9NX0RBVEFfU1JBTV9TSVpFIDB4QTE4CisjZGVmaW5lIENYMl9FRVBST01fSU1BR0VfU0laRSAgICAgICAgICAweDEwMAorCisvKiBETUEgZGVmcyAqLworI2RlZmluZSBDWDJfRE1BX0lfQ1VSUkVOVF9DQiAgMHgwMDMwMDBEMAorI2RlZmluZSBDWDJfRE1BX09fQ1VSUkVOVF9DQiAgMHgwMDMwMDBENAorI2RlZmluZSBDWDJfRE1BX0lfRE1BX0NPTlRST0wgMHgwMDMwMDBBNAorI2RlZmluZSBDWDJfRE1BX0lfQ0JfQkFTRSAgICAgMHgwMDMwMDBBMAorCisjZGVmaW5lIENYMl9UWF9DTURfUVVFVUVfQkRfQkFTRSAgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIENYMl9UWF9DTURfUVVFVUVfQkRfU0laRSAgICAgICAgKDB4MDAwMDAyMDQpCisjZGVmaW5lIENYMl9UWF9RVUVVRV8wX0JEX0JBU0UgICAgICAgICAgKDB4MDAwMDAyMDgpCisjZGVmaW5lIENYMl9UWF9RVUVVRV8wX0JEX1NJWkUgICAgICAgICAgKDB4MDAwMDAyMEMpCisjZGVmaW5lIENYMl9UWF9RVUVVRV8xX0JEX0JBU0UgICAgICAgICAgKDB4MDAwMDAyMTApCisjZGVmaW5lIENYMl9UWF9RVUVVRV8xX0JEX1NJWkUgICAgICAgICAgKDB4MDAwMDAyMTQpCisjZGVmaW5lIENYMl9UWF9RVUVVRV8yX0JEX0JBU0UgICAgICAgICAgKDB4MDAwMDAyMTgpCisjZGVmaW5lIENYMl9UWF9RVUVVRV8yX0JEX1NJWkUgICAgICAgICAgKDB4MDAwMDAyMUMpCisjZGVmaW5lIENYMl9UWF9RVUVVRV8zX0JEX0JBU0UgICAgICAgICAgKDB4MDAwMDAyMjApCisjZGVmaW5lIENYMl9UWF9RVUVVRV8zX0JEX1NJWkUgICAgICAgICAgKDB4MDAwMDAyMjQpCisjZGVmaW5lIENYMl9SWF9CRF9CQVNFICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyNDApCisjZGVmaW5lIENYMl9SWF9CRF9TSVpFICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyNDQpCisjZGVmaW5lIENYMl9SRkRTX1RBQkxFX0xPV0VSICAgICAgICAgICAgKDB4MDAwMDA1MDApCisKKyNkZWZpbmUgQ1gyX1RYX0NNRF9RVUVVRV9SRUFEX0lOREVYICAgICAoMHgwMDAwMDI4MCkKKyNkZWZpbmUgQ1gyX1RYX1FVRVVFXzBfUkVBRF9JTkRFWCAgICAgICAoMHgwMDAwMDI4NCkKKyNkZWZpbmUgQ1gyX1RYX1FVRVVFXzFfUkVBRF9JTkRFWCAgICAgICAoMHgwMDAwMDI4OCkKKyNkZWZpbmUgQ1gyX1RYX1FVRVVFXzJfUkVBRF9JTkRFWCAgICAgICAoMHgwMDAwMDI4QykKKyNkZWZpbmUgQ1gyX1RYX1FVRVVFXzNfUkVBRF9JTkRFWCAgICAgICAoMHgwMDAwMDI5MCkKKyNkZWZpbmUgQ1gyX1JYX1JFQURfSU5ERVggICAgICAgICAgICAgICAoMHgwMDAwMDJBMCkKKworI2RlZmluZSBDWDJfVFhfQ01EX1FVRVVFX1dSSVRFX0lOREVYICAgICgweDAwMDAwRjgwKQorI2RlZmluZSBDWDJfVFhfUVVFVUVfMF9XUklURV9JTkRFWCAgICAgICgweDAwMDAwRjg0KQorI2RlZmluZSBDWDJfVFhfUVVFVUVfMV9XUklURV9JTkRFWCAgICAgICgweDAwMDAwRjg4KQorI2RlZmluZSBDWDJfVFhfUVVFVUVfMl9XUklURV9JTkRFWCAgICAgICgweDAwMDAwRjhDKQorI2RlZmluZSBDWDJfVFhfUVVFVUVfM19XUklURV9JTkRFWCAgICAgICgweDAwMDAwRjkwKQorI2RlZmluZSBDWDJfUlhfV1JJVEVfSU5ERVggICAgICAgICAgICAgICgweDAwMDAwRkEwKQorCisvKgorICogRUVQUk9NIFJlbGF0ZWQgRGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIElQV19FRVBST01fREFUQV9TUkFNX0FERFJFU1MgKENYMl9TSEFSRURfTE9XRVJfQk9VTkQgKyAweDgxNCkKKyNkZWZpbmUgSVBXX0VFUFJPTV9EQVRBX1NSQU1fU0laRSAgICAoQ1gyX1NIQVJFRF9MT1dFUl9CT1VORCArIDB4ODE4KQorI2RlZmluZSBJUFdfRUVQUk9NX0xPQURfRElTQUJMRSAgICAgIChDWDJfU0hBUkVEX0xPV0VSX0JPVU5EICsgMHg4MUMpCisjZGVmaW5lIElQV19FRVBST01fREFUQSAgICAgICAgICAgICAgKENYMl9TSEFSRURfTE9XRVJfQk9VTkQgKyAweDgyMCkKKyNkZWZpbmUgSVBXX0VFUFJPTV9VUFBFUl9BRERSRVNTICAgICAoQ1gyX1NIQVJFRF9MT1dFUl9CT1VORCArIDB4OUUwKQorCisjZGVmaW5lIElQV19TVEFUSU9OX1RBQkxFX0xPV0VSICAgICAgKENYMl9TSEFSRURfTE9XRVJfQk9VTkQgKyAweEEwQykKKyNkZWZpbmUgSVBXX1NUQVRJT05fVEFCTEVfVVBQRVIgICAgICAoQ1gyX1NIQVJFRF9MT1dFUl9CT1VORCArIDB4QjBDKQorI2RlZmluZSBJUFdfUkVRVUVTVF9BVElNICAgICAgICAgICAgIChDWDJfU0hBUkVEX0xPV0VSX0JPVU5EICsgMHhCMEMpCisjZGVmaW5lIElQV19BVElNX1NFTlQgICAgICAgICAgICAgICAgKENYMl9TSEFSRURfTE9XRVJfQk9VTkQgKyAweEIxMCkKKyNkZWZpbmUgSVBXX1dIT19JU19BV0FLRSAgICAgICAgICAgICAoQ1gyX1NIQVJFRF9MT1dFUl9CT1VORCArIDB4QjE0KQorI2RlZmluZSBJUFdfRFVSSU5HX0FUSU1fV0lORE9XICAgICAgIChDWDJfU0hBUkVEX0xPV0VSX0JPVU5EICsgMHhCMTgpCisKKyNkZWZpbmUgTVNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXT1JEX1RPX0JZVEUoX3dvcmQpICAgICAgICAgICAgICgoX3dvcmQpICogc2l6ZW9mKHUxNikpCisKKyNkZWZpbmUgR0VUX0VFUFJPTV9BRERSKF93b3Jkb2Zmc2V0LF9ieXRlb2Zmc2V0KSBcCisgICAgKCBXT1JEX1RPX0JZVEUoX3dvcmRvZmZzZXQpICsgKF9ieXRlb2Zmc2V0KSApCisKKy8qIEVFUFJPTSBhY2Nlc3MgYnkgQllURSAqLworI2RlZmluZSBFRVBST01fUE1FX0NBUEFCSUxJVFkgICAoR0VUX0VFUFJPTV9BRERSKDB4MDksTVNCKSkJLyogMSBieXRlICAgKi8KKyNkZWZpbmUgRUVQUk9NX01BQ19BRERSRVNTICAgICAgKEdFVF9FRVBST01fQUREUigweDIxLExTQikpCS8qIDYgYnl0ZSAgICovCisjZGVmaW5lIEVFUFJPTV9WRVJTSU9OICAgICAgICAgIChHRVRfRUVQUk9NX0FERFIoMHgyNCxNU0IpKQkvKiAxIGJ5dGUgICAqLworI2RlZmluZSBFRVBST01fTklDX1RZUEUgICAgICAgICAoR0VUX0VFUFJPTV9BRERSKDB4MjUsTFNCKSkJLyogMSBieXRlICAgKi8KKyNkZWZpbmUgRUVQUk9NX1NLVV9DQVBBQklMSVRZICAgKEdFVF9FRVBST01fQUREUigweDI1LE1TQikpCS8qIDEgYnl0ZSAgICovCisjZGVmaW5lIEVFUFJPTV9DT1VOVFJZX0NPREUgICAgIChHRVRfRUVQUk9NX0FERFIoMHgyNixMU0IpKQkvKiAzIGJ5dGVzICAqLworI2RlZmluZSBFRVBST01fSUJTU19DSEFOTkVMU19CRyAoR0VUX0VFUFJPTV9BRERSKDB4MjgsTFNCKSkJLyogMiBieXRlcyAgKi8KKyNkZWZpbmUgRUVQUk9NX0lCU1NfQ0hBTk5FTFNfQSAgKEdFVF9FRVBST01fQUREUigweDI5LE1TQikpCS8qIDUgYnl0ZXMgICovCisjZGVmaW5lIEVFUFJPTV9CU1NfQ0hBTk5FTFNfQkcgIChHRVRfRUVQUk9NX0FERFIoMHgyYyxMU0IpKQkvKiAyIGJ5dGVzICAqLworI2RlZmluZSBFRVBST01fSFdfVkVSU0lPTiAgICAgICAoR0VUX0VFUFJPTV9BRERSKDB4NzIsTFNCKSkJLyogMiBieXRlcyAgKi8KKworLyogTklDIHR5cGUgYXMgZm91bmQgaW4gdGhlIG9uZSBieXRlIEVFUFJPTV9OSUNfVFlQRSAgb2Zmc2V0Ki8KKyNkZWZpbmUgRUVQUk9NX05JQ19UWVBFX1NUQU5EQVJEICAgICAgICAwCisjZGVmaW5lIEVFUFJPTV9OSUNfVFlQRV9ERUxMICAgICAgICAgICAgMQorI2RlZmluZSBFRVBST01fTklDX1RZUEVfRlVKSVRTVSAgICAgICAgIDIKKyNkZWZpbmUgRUVQUk9NX05JQ19UWVBFX0lCTSAgICAgICAgICAgICAzCisjZGVmaW5lIEVFUFJPTV9OSUNfVFlQRV9IUCAgICAgICAgICAgICAgNAorCisjZGVmaW5lIEZXX01FTV9SRUdfTE9XRVJfQk9VTkQgICAgICAgICAgMHgwMDMwMDAwMAorI2RlZmluZSBGV19NRU1fUkVHX0VFUFJPTV9BQ0NFU1MgICAgICAgIChGV19NRU1fUkVHX0xPV0VSX0JPVU5EICsgMHg0MCkKKworI2RlZmluZSBFRVBST01fQklUX1NLICAgICAgICAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBFRVBST01fQklUX0NTICAgICAgICAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBFRVBST01fQklUX0RJICAgICAgICAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBFRVBST01fQklUX0RPICAgICAgICAgICAgICAgICAgICgxPDw0KQorCisjZGVmaW5lIEVFUFJPTV9DTURfUkVBRCAgICAgICAgICAgICAgICAgMHgyCisKKy8qIEludGVycnVwdHMgbWFza3MgKi8KKyNkZWZpbmUgQ1gyX0lOVEFfTk9ORSAgIDB4MDAwMDAwMDAKKworI2RlZmluZSBDWDJfSU5UQV9CSVRfUlhfVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBDWDJfSU5UQV9CSVRfU1RBVFVTX0NIQU5HRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBDWDJfSU5UQV9CSVRfQkVBQ09OX1BFUklPRF9FWFBJUkVEICAgICAgICAgMHgwMDAwMDAyMAorCisvL0ludGEgQml0cyBmb3IgQ0YKKyNkZWZpbmUgQ1gyX0lOVEFfQklUX1RYX0NNRF9RVUVVRSAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQ1gyX0lOVEFfQklUX1RYX1FVRVVFXzEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQ1gyX0lOVEFfQklUX1RYX1FVRVVFXzIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQ1gyX0lOVEFfQklUX1RYX1FVRVVFXzMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQ1gyX0lOVEFfQklUX1RYX1FVRVVFXzQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKworI2RlZmluZSBDWDJfSU5UQV9CSVRfU0xBVkVfTU9ERV9IT1NUX0NNRF9ET05FICAgICAgMHgwMDAxMDAwMAorCisjZGVmaW5lIENYMl9JTlRBX0JJVF9QUkVQQVJFX0ZPUl9QT1dFUl9ET1dOICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIENYMl9JTlRBX0JJVF9QT1dFUl9ET1dOICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisKKyNkZWZpbmUgQ1gyX0lOVEFfQklUX0ZXX0lOSVRJQUxJWkFUSU9OX0RPTkUgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgQ1gyX0lOVEFfQklUX0ZXX0NBUkRfRElTQUJMRV9QSFlfT0ZGX0RPTkUgIDB4MDIwMDAwMDAKKyNkZWZpbmUgQ1gyX0lOVEFfQklUX1JGX0tJTExfRE9ORSAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQ1gyX0lOVEFfQklUX0ZBVEFMX0VSUk9SICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgQ1gyX0lOVEFfQklUX1BBUklUWV9FUlJPUiAgICAgICAgICAgIDB4ODAwMDAwMDAKKworLyogSW50ZXJydXB0cyBlbmFibGVkIGF0IGluaXQgdGltZS4gKi8KKyNkZWZpbmUgQ1gyX0lOVEFfTUFTS19BTEwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChDWDJfSU5UQV9CSVRfVFhfUVVFVUVfMSAgICAgICAgICAgICAgIHwgXAorCSBDWDJfSU5UQV9CSVRfVFhfUVVFVUVfMiAgICAgICAgICAgICAgIHwgXAorCSBDWDJfSU5UQV9CSVRfVFhfUVVFVUVfMyAgICAgICAgICAgICAgIHwgXAorCSBDWDJfSU5UQV9CSVRfVFhfUVVFVUVfNCAgICAgICAgICAgICAgIHwgXAorCSBDWDJfSU5UQV9CSVRfVFhfQ01EX1FVRVVFICAgICAgICAgICAgIHwgXAorCSBDWDJfSU5UQV9CSVRfUlhfVFJBTlNGRVIgICAgICAgICAgICAgIHwgXAorCSBDWDJfSU5UQV9CSVRfRkFUQUxfRVJST1IgICAgICAgICAgICAgIHwgXAorCSBDWDJfSU5UQV9CSVRfUEFSSVRZX0VSUk9SICAgICAgICAgICAgIHwgXAorCSBDWDJfSU5UQV9CSVRfU1RBVFVTX0NIQU5HRSAgICAgICAgICAgIHwgXAorCSBDWDJfSU5UQV9CSVRfRldfSU5JVElBTElaQVRJT05fRE9ORSAgIHwgXAorCSBDWDJfSU5UQV9CSVRfQkVBQ09OX1BFUklPRF9FWFBJUkVEICAgIHwgXAorCSBDWDJfSU5UQV9CSVRfU0xBVkVfTU9ERV9IT1NUX0NNRF9ET05FIHwgXAorCSBDWDJfSU5UQV9CSVRfUFJFUEFSRV9GT1JfUE9XRVJfRE9XTiAgIHwgXAorCSBDWDJfSU5UQV9CSVRfUE9XRVJfRE9XTiAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgQ1gyX0lOVEFfQklUX1JGX0tJTExfRE9ORSApCisKKyNkZWZpbmUgSVBXU1RBVFVTX0VSUk9SX0xPRyAgICAgKENYMl9TSEFSRURfTE9XRVJfQk9VTkQgKyAweDQxMCkKKyNkZWZpbmUgSVBXX0VWRU5UX0xPRyAgICAgKENYMl9TSEFSRURfTE9XRVJfQk9VTkQgKyAweDQxNCkKKworLyogRlcgZXZlbnQgbG9nIGRlZmluaXRpb25zICovCisjZGVmaW5lIEVWRU5UX0VMRU1fU0laRSAgICAgKDMgKiBzaXplb2YodTMyKSkKKyNkZWZpbmUgRVZFTlRfU1RBUlRfT0ZGU0VUICAoMSAqIHNpemVvZih1MzIpICsgMiAqIHNpemVvZih1MTYpKQorCisvKiBGVyBlcnJvciBsb2cgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRVJST1JfRUxFTV9TSVpFICAgICAoNyAqIHNpemVvZih1MzIpKQorI2RlZmluZSBFUlJPUl9TVEFSVF9PRkZTRVQgICgxICogc2l6ZW9mKHUzMikpCisKK2VudW0geworCUlQV19GV19FUlJPUl9PSyA9IDAsCisJSVBXX0ZXX0VSUk9SX0ZBSUwsCisJSVBXX0ZXX0VSUk9SX01FTU9SWV9VTkRFUkZMT1csCisJSVBXX0ZXX0VSUk9SX01FTU9SWV9PVkVSRkxPVywKKwlJUFdfRldfRVJST1JfQkFEX1BBUkFNLAorCUlQV19GV19FUlJPUl9CQURfQ0hFQ0tTVU0sCisJSVBXX0ZXX0VSUk9SX05NSV9JTlRFUlJVUFQsCisJSVBXX0ZXX0VSUk9SX0JBRF9EQVRBQkFTRSwKKwlJUFdfRldfRVJST1JfQUxMT0NfRkFJTCwKKwlJUFdfRldfRVJST1JfRE1BX1VOREVSUlVOLAorCUlQV19GV19FUlJPUl9ETUFfU1RBVFVTLAorCUlQV19GV19FUlJPUl9ESU5PU1RBVFVTX0VSUk9SLAorCUlQV19GV19FUlJPUl9FRVBST01TVEFUVVNfRVJST1IsCisJSVBXX0ZXX0VSUk9SX1NZU0FTU0VSVCwKKwlJUFdfRldfRVJST1JfRkFUQUxfRVJST1IKK307CisKKyNkZWZpbmUgQVVUSF9PUEVOICAgICAgIDAKKyNkZWZpbmUgQVVUSF9TSEFSRURfS0VZIDEKKyNkZWZpbmUgQVVUSF9JR05PUkUgICAgIDMKKworI2RlZmluZSBIQ19BU1NPQ0lBVEUgICAgICAwCisjZGVmaW5lIEhDX1JFQVNTT0NJQVRFICAgIDEKKyNkZWZpbmUgSENfRElTQVNTT0NJQVRFICAgMgorI2RlZmluZSBIQ19JQlNTX1NUQVJUICAgICAzCisjZGVmaW5lIEhDX0lCU1NfUkVDT05GICAgIDQKKyNkZWZpbmUgSENfRElTQVNTT0NfUVVJRVQgNQorCisjZGVmaW5lIElQV19SQVRFX0NBUEFCSUxJVElFUyAxCisjZGVmaW5lIElQV19SQVRFX0NPTk5FQ1QgICAgICAwCisKKy8qCisgKiBSYXRlIHZhbHVlcyBhbmQgbWFza3MKKyAqLworI2RlZmluZSBJUFdfVFhfUkFURV8xTUIgIDB4MEEKKyNkZWZpbmUgSVBXX1RYX1JBVEVfMk1CICAweDE0CisjZGVmaW5lIElQV19UWF9SQVRFXzVNQiAgMHgzNworI2RlZmluZSBJUFdfVFhfUkFURV82TUIgIDB4MEQKKyNkZWZpbmUgSVBXX1RYX1JBVEVfOU1CICAweDBGCisjZGVmaW5lIElQV19UWF9SQVRFXzExTUIgMHg2RQorI2RlZmluZSBJUFdfVFhfUkFURV8xMk1CIDB4MDUKKyNkZWZpbmUgSVBXX1RYX1JBVEVfMThNQiAweDA3CisjZGVmaW5lIElQV19UWF9SQVRFXzI0TUIgMHgwOQorI2RlZmluZSBJUFdfVFhfUkFURV8zNk1CIDB4MEIKKyNkZWZpbmUgSVBXX1RYX1JBVEVfNDhNQiAweDAxCisjZGVmaW5lIElQV19UWF9SQVRFXzU0TUIgMHgwMworCisjZGVmaW5lIElQV19PUkRfVEFCTEVfSURfTUFTSyAgICAgICAgICAgICAweDAwMDBGRjAwCisjZGVmaW5lIElQV19PUkRfVEFCTEVfVkFMVUVfTUFTSyAgICAgICAgICAweDAwMDAwMEZGCisKKyNkZWZpbmUgSVBXX09SRF9UQUJMRV8wX01BU0sgICAgICAgICAgICAgIDB4MDAwMEYwMDAKKyNkZWZpbmUgSVBXX09SRF9UQUJMRV8xX01BU0sgICAgICAgICAgICAgIDB4MDAwMEYxMDAKKyNkZWZpbmUgSVBXX09SRF9UQUJMRV8yX01BU0sgICAgICAgICAgICAgIDB4MDAwMEYyMDAKKyNkZWZpbmUgSVBXX09SRF9UQUJMRV8zX01BU0sgICAgICAgICAgICAgIDB4MDAwMEYzMDAKKyNkZWZpbmUgSVBXX09SRF9UQUJMRV80X01BU0sgICAgICAgICAgICAgIDB4MDAwMEY0MDAKKyNkZWZpbmUgSVBXX09SRF9UQUJMRV81X01BU0sgICAgICAgICAgICAgIDB4MDAwMEY1MDAKKyNkZWZpbmUgSVBXX09SRF9UQUJMRV82X01BU0sgICAgICAgICAgICAgIDB4MDAwMEY2MDAKKyNkZWZpbmUgSVBXX09SRF9UQUJMRV83X01BU0sgICAgICAgICAgICAgIDB4MDAwMEY3MDAKKworLyoKKyAqIFRhYmxlIDAgRW50cmllcyAoYWxsIGVudHJpZXMgYXJlIDMyIGJpdHMpCisgKi8KK2VudW0geworCUlQV19PUkRfU1RBVF9UWF9DVVJSX1JBVEUgPSBJUFdfT1JEX1RBQkxFXzBfTUFTSyArIDEsCisJSVBXX09SRF9TVEFUX0ZSQUdfVFJFU0hPTEQsCisJSVBXX09SRF9TVEFUX1JUU19USFJFU0hPTEQsCisJSVBXX09SRF9TVEFUX1RYX0hPU1RfUkVRVUVTVFMsCisJSVBXX09SRF9TVEFUX1RYX0hPU1RfQ09NUExFVEUsCisJSVBXX09SRF9TVEFUX1RYX0RJUl9EQVRBLAorCUlQV19PUkRfU1RBVF9UWF9ESVJfREFUQV9CXzEsCisJSVBXX09SRF9TVEFUX1RYX0RJUl9EQVRBX0JfMiwKKwlJUFdfT1JEX1NUQVRfVFhfRElSX0RBVEFfQl81XzUsCisJSVBXX09SRF9TVEFUX1RYX0RJUl9EQVRBX0JfMTEsCisJLyogSG9sZSAqLworCisJSVBXX09SRF9TVEFUX1RYX0RJUl9EQVRBX0dfMSA9IElQV19PUkRfVEFCTEVfMF9NQVNLICsgMTksCisJSVBXX09SRF9TVEFUX1RYX0RJUl9EQVRBX0dfMiwKKwlJUFdfT1JEX1NUQVRfVFhfRElSX0RBVEFfR181XzUsCisJSVBXX09SRF9TVEFUX1RYX0RJUl9EQVRBX0dfNiwKKwlJUFdfT1JEX1NUQVRfVFhfRElSX0RBVEFfR185LAorCUlQV19PUkRfU1RBVF9UWF9ESVJfREFUQV9HXzExLAorCUlQV19PUkRfU1RBVF9UWF9ESVJfREFUQV9HXzEyLAorCUlQV19PUkRfU1RBVF9UWF9ESVJfREFUQV9HXzE4LAorCUlQV19PUkRfU1RBVF9UWF9ESVJfREFUQV9HXzI0LAorCUlQV19PUkRfU1RBVF9UWF9ESVJfREFUQV9HXzM2LAorCUlQV19PUkRfU1RBVF9UWF9ESVJfREFUQV9HXzQ4LAorCUlQV19PUkRfU1RBVF9UWF9ESVJfREFUQV9HXzU0LAorCUlQV19PUkRfU1RBVF9UWF9OT05fRElSX0RBVEEsCisJSVBXX09SRF9TVEFUX1RYX05PTl9ESVJfREFUQV9CXzEsCisJSVBXX09SRF9TVEFUX1RYX05PTl9ESVJfREFUQV9CXzIsCisJSVBXX09SRF9TVEFUX1RYX05PTl9ESVJfREFUQV9CXzVfNSwKKwlJUFdfT1JEX1NUQVRfVFhfTk9OX0RJUl9EQVRBX0JfMTEsCisJLyogSG9sZSAqLworCisJSVBXX09SRF9TVEFUX1RYX05PTl9ESVJfREFUQV9HXzEgPSBJUFdfT1JEX1RBQkxFXzBfTUFTSyArIDQ0LAorCUlQV19PUkRfU1RBVF9UWF9OT05fRElSX0RBVEFfR18yLAorCUlQV19PUkRfU1RBVF9UWF9OT05fRElSX0RBVEFfR181XzUsCisJSVBXX09SRF9TVEFUX1RYX05PTl9ESVJfREFUQV9HXzYsCisJSVBXX09SRF9TVEFUX1RYX05PTl9ESVJfREFUQV9HXzksCisJSVBXX09SRF9TVEFUX1RYX05PTl9ESVJfREFUQV9HXzExLAorCUlQV19PUkRfU1RBVF9UWF9OT05fRElSX0RBVEFfR18xMiwKKwlJUFdfT1JEX1NUQVRfVFhfTk9OX0RJUl9EQVRBX0dfMTgsCisJSVBXX09SRF9TVEFUX1RYX05PTl9ESVJfREFUQV9HXzI0LAorCUlQV19PUkRfU1RBVF9UWF9OT05fRElSX0RBVEFfR18zNiwKKwlJUFdfT1JEX1NUQVRfVFhfTk9OX0RJUl9EQVRBX0dfNDgsCisJSVBXX09SRF9TVEFUX1RYX05PTl9ESVJfREFUQV9HXzU0LAorCUlQV19PUkRfU1RBVF9UWF9SRVRSWSwKKwlJUFdfT1JEX1NUQVRfVFhfRkFJTFVSRSwKKwlJUFdfT1JEX1NUQVRfUlhfRVJSX0NSQywKKwlJUFdfT1JEX1NUQVRfUlhfRVJSX0lDViwKKwlJUFdfT1JEX1NUQVRfUlhfTk9fQlVGRkVSLAorCUlQV19PUkRfU1RBVF9GVUxMX1NDQU5TLAorCUlQV19PUkRfU1RBVF9QQVJUSUFMX1NDQU5TLAorCUlQV19PUkRfU1RBVF9UR0hfQUJPUlRFRF9TQ0FOUywKKwlJUFdfT1JEX1NUQVRfVFhfVE9UQUxfQllURVMsCisJSVBXX09SRF9TVEFUX0NVUlJfUlNTSV9SQVcsCisJSVBXX09SRF9TVEFUX1JYX0JFQUNPTiwKKwlJUFdfT1JEX1NUQVRfTUlTU0VEX0JFQUNPTlMsCisJSVBXX09SRF9UQUJMRV8wX0xBU1QKK307CisKKyNkZWZpbmUgSVBXX1JTU0lfVE9fREJNIDExMgorCisvKiBUYWJsZSAxIEVudHJpZXMKKyAqLworZW51bSB7CisJSVBXX09SRF9UQUJMRV8xX0xBU1QgPSBJUFdfT1JEX1RBQkxFXzFfTUFTSyB8IDEsCit9OworCisvKgorICogVGFibGUgMiBFbnRyaWVzCisgKgorICogRldfVkVSU0lPTjogICAgMTYgYnl0ZSBzdHJpbmcKKyAqIEZXX0RBVEU6ICAgICAgIDE2IGJ5dGUgc3RyaW5nIChvbmx5IDE0IGJ5dGVzIHVzZWQpCisgKiBVQ09ERV9WRVJTSU9OOiA0IGJ5dGUgdmVyc2lvbiBjb2RlCisgKiBVQ09ERV9EQVRFOiAgICA1IGJ5dGVzIGNvZGUgY29kZQorICogQUREQVBURVJfTUFDOiAgNiBieXRlIE1BQyBhZGRyZXNzCisgKiBSVEM6ICAgICAgICAgICA0IGJ5dGUgY2xvY2sKKyAqLworZW51bSB7CisJSVBXX09SRF9TVEFUX0ZXX1ZFUlNJT04gPSBJUFdfT1JEX1RBQkxFXzJfTUFTSyB8IDEsCisJSVBXX09SRF9TVEFUX0ZXX0RBVEUsCisJSVBXX09SRF9TVEFUX1VDT0RFX1ZFUlNJT04sCisJSVBXX09SRF9TVEFUX1VDT0RFX0RBVEUsCisJSVBXX09SRF9TVEFUX0FEQVBURVJfTUFDLAorCUlQV19PUkRfU1RBVF9SVEMsCisJSVBXX09SRF9UQUJMRV8yX0xBU1QKK307CisKKy8qIFRhYmxlIDMgKi8KK2VudW0geworCUlQV19PUkRfU1RBVF9UWF9QQUNLRVQgPSBJUFdfT1JEX1RBQkxFXzNfTUFTSyB8IDAsCisJSVBXX09SRF9TVEFUX1RYX1BBQ0tFVF9GQUlMVVJFLAorCUlQV19PUkRfU1RBVF9UWF9QQUNLRVRfU1VDQ0VTUywKKwlJUFdfT1JEX1NUQVRfVFhfUEFDS0VUX0FCT1JURUQsCisJSVBXX09SRF9UQUJMRV8zX0xBU1QKK307CisKKy8qIFRhYmxlIDQgKi8KK2VudW0geworCUlQV19PUkRfVEFCTEVfNF9MQVNUID0gSVBXX09SRF9UQUJMRV80X01BU0sKK307CisKKy8qIFRhYmxlIDUgKi8KK2VudW0geworCUlQV19PUkRfU1RBVF9BVkFJTEFCTEVfQVBfQ09VTlQgPSBJUFdfT1JEX1RBQkxFXzVfTUFTSywKKwlJUFdfT1JEX1NUQVRfQVBfQVNTTlMsCisJSVBXX09SRF9TVEFUX1JPQU0sCisJSVBXX09SRF9TVEFUX1JPQU1fQ0FVU0VfTUlTU0VEX0JFQUNPTlMsCisJSVBXX09SRF9TVEFUX1JPQU1fQ0FVU0VfVU5BU1NPQywKKwlJUFdfT1JEX1NUQVRfUk9BTV9DQVVTRV9SU1NJLAorCUlQV19PUkRfU1RBVF9ST0FNX0NBVVNFX0xJTktfUVVBTElUWSwKKwlJUFdfT1JEX1NUQVRfUk9BTV9DQVVTRV9BUF9MT0FEX0JBTEFOQ0UsCisJSVBXX09SRF9TVEFUX1JPQU1fQ0FVU0VfQVBfTk9fVFgsCisJSVBXX09SRF9TVEFUX0xJTktfVVAsCisJSVBXX09SRF9TVEFUX0xJTktfRE9XTiwKKwlJUFdfT1JEX0FOVEVOTkFfRElWRVJTSVRZLAorCUlQV19PUkRfQ1VSUl9GUkVRLAorCUlQV19PUkRfVEFCTEVfNV9MQVNUCit9OworCisvKiBUYWJsZSA2ICovCitlbnVtIHsKKwlJUFdfT1JEX0NPVU5UUllfQ09ERSA9IElQV19PUkRfVEFCTEVfNl9NQVNLLAorCUlQV19PUkRfQ1VSUl9CU1NJRCwKKwlJUFdfT1JEX0NVUlJfU1NJRCwKKwlJUFdfT1JEX1RBQkxFXzZfTEFTVAorfTsKKworLyogVGFibGUgNyAqLworZW51bSB7CisJSVBXX09SRF9TVEFUX1BFUkNFTlRfTUlTU0VEX0JFQUNPTlMgPSBJUFdfT1JEX1RBQkxFXzdfTUFTSywKKwlJUFdfT1JEX1NUQVRfUEVSQ0VOVF9UWF9SRVRSSUVTLAorCUlQV19PUkRfU1RBVF9QRVJDRU5UX0xJTktfUVVBTElUWSwKKwlJUFdfT1JEX1NUQVRfQ1VSUl9SU1NJX0RCTSwKKwlJUFdfT1JEX1RBQkxFXzdfTEFTVAorfTsKKworI2RlZmluZSBJUFdfT1JESU5BTFNfVEFCTEVfTE9XRVIgICAgICAgIChDWDJfU0hBUkVEX0xPV0VSX0JPVU5EICsgMHg1MDApCisjZGVmaW5lIElQV19PUkRJTkFMU19UQUJMRV8wICAgICAgICAgICAgKENYMl9TSEFSRURfTE9XRVJfQk9VTkQgKyAweDE4MCkKKyNkZWZpbmUgSVBXX09SRElOQUxTX1RBQkxFXzEgICAgICAgICAgICAoQ1gyX1NIQVJFRF9MT1dFUl9CT1VORCArIDB4MTg0KQorI2RlZmluZSBJUFdfT1JESU5BTFNfVEFCTEVfMiAgICAgICAgICAgIChDWDJfU0hBUkVEX0xPV0VSX0JPVU5EICsgMHgxODgpCisjZGVmaW5lIElQV19NRU1fRklYRURfT1ZFUlJJREUgICAgICAgICAgKENYMl9TSEFSRURfTE9XRVJfQk9VTkQgKyAweDQxQykKKworc3RydWN0IGlwd19maXhlZF9yYXRlIHsKKwl1MTYgdHhfcmF0ZXM7CisJdTE2IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgQ1gyX0lORElSRUNUX0FERFJfTUFTSyAofjB4M3VsKQorCitzdHJ1Y3QgaG9zdF9jbWQgeworCXU4IGNtZDsKKwl1OCBsZW47CisJdTE2IHJlc2VydmVkOworCXUzMiBwYXJhbVtURkRfQ01EX0lNTUVESUFURV9QQVlMT0FEX0xFTkdUSF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBDRkdfQlRfQ09FWElTVEVOQ0VfTUlOICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBDRkdfQlRfQ09FWElTVEVOQ0VfREVGRVIgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBDRkdfQlRfQ09FWElTVEVOQ0VfS0lMTCAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBDRkdfQlRfQ09FWElTVEVOQ0VfV01FX09WRVJfQlQgICAgICAgICAgMHgwOAorI2RlZmluZSBDRkdfQlRfQ09FWElTVEVOQ0VfT09CICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBDRkdfQlRfQ09FWElTVEVOQ0VfTUFYICAgICAgICAgICAgICAgICAgMHhGRgorI2RlZmluZSBDRkdfQlRfQ09FWElTVEVOQ0VfREVGICAgICAgICAgICAgICAgICAgMHg4MAkvKiByZWFkIEJ0IGZyb20gRUVQUk9NICovCisKKyNkZWZpbmUgQ0ZHX0NUU19UT19JVFNFTEZfRU5BQkxFRF9NSU4JMHgwCisjZGVmaW5lIENGR19DVFNfVE9fSVRTRUxGX0VOQUJMRURfTUFYCTB4MQorI2RlZmluZSBDRkdfQ1RTX1RPX0lUU0VMRl9FTkFCTEVEX0RFRglDRkdfQ1RTX1RPX0lUU0VMRl9FTkFCTEVEX01JTgorCisjZGVmaW5lIENGR19TWVNfQU5URU5OQV9CT1RIICAgICAgICAgICAgICAgICAgICAgIDB4MDAwCisjZGVmaW5lIENGR19TWVNfQU5URU5OQV9BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxCisjZGVmaW5lIENGR19TWVNfQU5URU5OQV9CICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzCisKKy8qCisgKiBUaGUgZGVmaW5pdGlvbnMgYmVsb3cgd2VyZSBsaWZ0ZWQgb2ZmIHRoZSBpcHcyMTAwIGRyaXZlciwgd2hpY2ggb25seQorICogc3VwcG9ydHMgJ2InIG1vZGUsIHNvIEknbSBzdXJlIHRoZXNlIGFyZSBub3QgZXhhY3RseSBjb3JyZWN0LgorICoKKyAqIFNvbWVib2R5IGZpeCB0aGVzZSEhCisgKi8KKyNkZWZpbmUgUkVHX01JTl9DSEFOTkVMICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVHX01BWF9DSEFOTkVMICAgICAgICAgICAgIDE0CisKKyNkZWZpbmUgUkVHX0NIQU5ORUxfTUFTSyAgICAgICAgICAgIDB4MDAwMDNGRkYKKyNkZWZpbmUgSVBXX0lCU1NfMTFCX0RFRkFVTFRfTUFTSyAgIDB4ODdmZgorCitzdGF0aWMgY29uc3QgbG9uZyBpcHdfZnJlcXVlbmNpZXNbXSA9IHsKKwkyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LAorCTI0MzIsIDI0MzcsIDI0NDIsIDI0NDcsCisJMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywKKwkyNDcyLCAyNDg0Cit9OworCisjZGVmaW5lIEZSRVFfQ09VTlQgQVJSQVlfU0laRShpcHdfZnJlcXVlbmNpZXMpCisKKyNkZWZpbmUgSVBXX01BWF9DT05GSUdfUkVUUklFUyAxMAorCitzdGF0aWMgaW5saW5lIHUzMiBmcmFtZV9oZHJfbGVuKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJdTMyIHJldHZhbDsKKwl1MTYgZmM7CisKKwlyZXR2YWwgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHIpOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCisJLyoKKwkgKiBGdW5jdGlvbiAgICAgVG9EUyAgICBGcm9tRFMKKwkgKiBJQlNTICAgICAgICAgMCAgICAgICAwCisJICogVG8gQVAgICAgICAgIDEgICAgICAgMAorCSAqIEZyb20gQVAgICAgICAwICAgICAgIDEKKwkgKiBXRFMgKGJyaWRnZSkgMSAgICAgICAxCisJICoKKwkgKiBPbmx5IFdEUyBmcmFtZXMgdXNlIEFkZHJlc3M0IGFtb25nIHRoZW0uIC0tWVoKKwkgKi8KKwlpZiAoIShmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpIHx8ICEoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKQorCQlyZXR2YWwgLT0gRVRIX0FMRU47CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYJCQkJLyogX19pcHcyMjAwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jCmluZGV4IDVmNTA3YzQuLmNhNmMwM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKQEAgLTQ3MSwxMiArNDcxLDEyIEBACiAgICAgZGV2LT5nZXRfc3RhdHMgID0gJm5ldHdhdmVfZ2V0X3N0YXRzOwogICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKICAgICAvKiB3aXJlbGVzcyBleHRlbnNpb25zICovCi0jaWZkZWYgV0lSRUxFU1NfRVhUCisjaWYgV0lSRUxFU1NfRVhUIDw9IDE2CiAgICAgZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSAmbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHM7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUIDw9IDE2ICovCiAjaWYgV0lSRUxFU1NfRVhUID4gMTIKICAgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZuZXR3YXZlX2hhbmRsZXJfZGVmOwogI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEyICovCi0jZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCiAgICAgZGV2LT5kb19pb2N0bCA9ICZuZXR3YXZlX2lvY3RsOwogCiAgICAgZGV2LT50eF90aW1lb3V0ID0gJm5ldHdhdmVfd2F0Y2hkb2c7CkBAIC04MzksNiArODM5LDkgQEAKIAkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBuZXR3YXZlX2hhbmRsZXIsCiAJLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBuZXR3YXZlX3ByaXZhdGVfaGFuZGxlciwKIAkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgbmV0d2F2ZV9wcml2YXRlX2FyZ3MsCisjaWYgV0lSRUxFU1NfRVhUID4gMTYKKwkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHMsCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTYgKi8KIH07CiAjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTIgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jCmluZGV4IDljMmQwN2MuLjhkZTQ5ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMKQEAgLTk0LDYgKzk0LDggQEAKICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KIAorI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KKwogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTAxLDcgKzEwMyw2IEBACiAjaW5jbHVkZSAiaGVybWVzLmgiCiAjaW5jbHVkZSAiaGVybWVzX3JpZC5oIgogI2luY2x1ZGUgIm9yaW5vY28uaCIKLSNpbmNsdWRlICJpZWVlODAyXzExLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIE1vZHVsZSBpbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE1MCw3ICsxNTEsNyBAQAogI2RlZmluZSBFTkNBUFNfT1ZFUkhFQUQJCShzaXplb2YoZW5jYXBzX2hkcikgKyAyKQogCiAjZGVmaW5lIE9SSU5PQ09fTUlOX01UVQkJMjU2Ci0jZGVmaW5lIE9SSU5PQ09fTUFYX01UVQkJKElFRUU4MDJfMTFfREFUQV9MRU4gLSBFTkNBUFNfT1ZFUkhFQUQpCisjZGVmaW5lIE9SSU5PQ09fTUFYX01UVQkJKElFRUU4MDIxMV9EQVRBX0xFTiAtIEVOQ0FQU19PVkVSSEVBRCkKIAogI2RlZmluZSBTWU1CT0xfTUFYX1ZFUl9MRU4JKDE0KQogI2RlZmluZSBVU0VSX0JBUAkJMApAQCAtNDQyLDcgKzQ0Myw3IEBACiAJaWYgKCAobmV3X210dSA8IE9SSU5PQ09fTUlOX01UVSkgfHwgKG5ld19tdHUgPiBPUklOT0NPX01BWF9NVFUpICkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIChuZXdfbXR1ICsgRU5DQVBTX09WRVJIRUFEICsgSUVFRTgwMl8xMV9ITEVOKSA+CisJaWYgKCAobmV3X210dSArIEVOQ0FQU19PVkVSSEVBRCArIElFRUU4MDIxMV9ITEVOKSA+CiAJICAgICAocHJpdi0+bmljYnVmX3NpemUgLSBFVEhfSExFTikgKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtOTE4LDcgKzkxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgZGF0YS4gKi8KIAkJcmV0dXJuOwogCX0KLQlpZiAobGVuZ3RoID4gSUVFRTgwMl8xMV9EQVRBX0xFTikgeworCWlmIChsZW5ndGggPiBJRUVFODAyMTFfREFUQV9MRU4pIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBmcmFtZSByZWNlaXZlZCAoJWQgYnl0ZXMpXG4iLAogCQkgICAgICAgZGV2LT5uYW1lLCBsZW5ndGgpOwogCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOwpAQCAtMTA1Miw4ICsxMDUzLDkgQEAKIAkJdTE2IGNoYW5uZWw7CiAJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcmVxOwogCWNvbnN0IGludCBhdG9tX2xlbiA9IG9mZnNldG9mKHN0cnVjdCBwcmlzbTJfc2Nhbl9hcGluZm8sIGF0aW0pOwotCXN0cnVjdCBwcmlzbTJfc2Nhbl9hcGluZm8gKmF0b207CisJc3RydWN0IHByaXNtMl9zY2FuX2FwaW5mbyAqYXRvbSA9IE5VTEw7CiAJaW50IG9mZnNldCA9IDQ7CisJaW50IGZvdW5kID0gMDsKIAl1OCAqYnVmOwogCXUxNiBsZW47CiAKQEAgLTEwODgsMTUgKzEwOTAsMTggQEAKIAkgKiB3ZSB3ZXJlIHJlcXVlc3RlZCB0byBqb2luICovCiAJZm9yICg7IG9mZnNldCArIGF0b21fbGVuIDw9IGxlbjsgb2Zmc2V0ICs9IGF0b21fbGVuKSB7CiAJCWF0b20gPSAoc3RydWN0IHByaXNtMl9zY2FuX2FwaW5mbyAqKSAoYnVmICsgb2Zmc2V0KTsKLQkJaWYgKG1lbWNtcCgmYXRvbS0+YnNzaWQsIHByaXYtPmRlc2lyZWRfYnNzaWQsIEVUSF9BTEVOKSA9PSAwKQotCQkJZ290byBmb3VuZDsKKwkJaWYgKG1lbWNtcCgmYXRvbS0+YnNzaWQsIHByaXYtPmRlc2lyZWRfYnNzaWQsIEVUSF9BTEVOKSA9PSAwKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQogCX0KIAotCURFQlVHKDEsICIlczogUmVxdWVzdGVkIEFQIG5vdCBmb3VuZCBpbiBzY2FuIHJlc3VsdHNcbiIsCi0JICAgICAgZGV2LT5uYW1lKTsKLQlnb3RvIG91dDsKKwlpZiAoISBmb3VuZCkgeworCQlERUJVRygxLCAiJXM6IFJlcXVlc3RlZCBBUCBub3QgZm91bmQgaW4gc2NhbiByZXN1bHRzXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CiAKLSBmb3VuZDoKIAltZW1jcHkocmVxLmJzc2lkLCBwcml2LT5kZXNpcmVkX2Jzc2lkLCBFVEhfQUxFTik7CiAJcmVxLmNoYW5uZWwgPSBhdG9tLT5jaGFubmVsOwkvKiBib3RoIGFyZSBsaXR0bGUtZW5kaWFuICovCiAJZXJyID0gSEVSTUVTX1dSSVRFX1JFQ09SRChodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GSk9JTlJFUVVFU1QsCkBAIC0xMjgzLDggKzEyODgsMTAgQEAKIAkJLyogUmVhZCBzY2FuIGRhdGEgKi8KIAkJZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgKHZvaWQgKikgYnVmLCBsZW4sCiAJCQkJICAgICAgIGluZm9maWQsIHNpemVvZihpbmZvKSk7Ci0JCWlmIChlcnIpCisJCWlmIChlcnIpIHsKKwkJCWtmcmVlKGJ1Zik7CiAJCQlicmVhazsKKwkJfQogCiAjaWZkZWYgT1JJTk9DT19ERUJVRwogCQl7CkBAIC0yMjcyLDcgKzIyNzksNyBAQAogCiAJLyogTm8gbmVlZCB0byBsb2NrLCB0aGUgaHdfdW5hdmFpbGFibGUgZmxhZyBpcyBhbHJlYWR5IHNldCBpbgogCSAqIGFsbG9jX29yaW5vY29kZXYoKSAqLwotCXByaXYtPm5pY2J1Zl9zaXplID0gSUVFRTgwMl8xMV9GUkFNRV9MRU4gKyBFVEhfSExFTjsKKwlwcml2LT5uaWNidWZfc2l6ZSA9IElFRUU4MDIxMV9GUkFNRV9MRU4gKyBFVEhfSExFTjsKIAogCS8qIEluaXRpYWxpemUgdGhlIGZpcm13YXJlICovCiAJZXJyID0gb3Jpbm9jb19yZWluaXRfZmlybXdhcmUoZGV2KTsKQEAgLTQwMjAsNyArNDAyNyw4IEBACiB9CiAKIC8qIFRyYW5zbGF0ZSBzY2FuIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgY2FyZCB0byBhIGNhcmQgaW5kZXBlbmRhbnQKLSAqIGZvcm1hdCB0aGF0IHRoZSBXaXJlbGVzcyBUb29scyB3aWxsIHVuZGVyc3RhbmQgLSBKZWFuIElJICovCisgKiBmb3JtYXQgdGhhdCB0aGUgV2lyZWxlc3MgVG9vbHMgd2lsbCB1bmRlcnN0YW5kIC0gSmVhbiBJSQorICogUmV0dXJuIG1lc3NhZ2UgbGVuZ3RoIG9yIC1lcnJubyBmb3IgZmF0YWwgZXJyb3JzICovCiBzdGF0aWMgaW5saW5lIGludCBvcmlub2NvX3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSBjaGFyICpidWZmZXIsCiAJCQkJCSBjaGFyICpzY2FuLApAQCAtNDA2MCwxMyArNDA2OCwxOSBAQAogCQlicmVhazsKIAljYXNlIEZJUk1XQVJFX1RZUEVfSU5URVJTSUw6CiAJCW9mZnNldCA9IDQ7Ci0JCWlmIChwcml2LT5oYXNfaG9zdHNjYW4pCi0JCQlhdG9tX2xlbiA9IHNjYW5bMF0gKyAoc2NhblsxXSA8PCA4KTsKLQkJZWxzZQorCQlpZiAocHJpdi0+aGFzX2hvc3RzY2FuKSB7CisJCQlhdG9tX2xlbiA9IGxlMTZfdG9fY3B1cCgodTE2ICopc2Nhbik7CisJCQkvKiBTYW5pdHkgY2hlY2sgZm9yIGF0b21fbGVuICovCisJCQlpZiAoYXRvbV9sZW4gPCBzaXplb2Yoc3RydWN0IHByaXNtMl9zY2FuX2FwaW5mbykpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIGF0b21fbGVuIGluIHNjYW4gZGF0YTogJWRcbiIsCisJCQkJZGV2LT5uYW1lLCBhdG9tX2xlbik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0gZWxzZQogCQkJYXRvbV9sZW4gPSBvZmZzZXRvZihzdHJ1Y3QgcHJpc20yX3NjYW5fYXBpbmZvLCBhdGltKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKIAkvKiBDaGVjayB0aGF0IHdlIGdvdCBhbiB3aG9sZSBudW1iZXIgb2YgYXRvbXMgKi8KQEAgLTQwNzQsNyArNDA4OCw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuZXhwZWN0ZWQgc2NhbiBkYXRhIGxlbmd0aCAlZCwgIgogCQkgICAgICAgImF0b21fbGVuICVkLCBvZmZzZXQgJWRcbiIsIGRldi0+bmFtZSwgc2Nhbl9sZW4sCiAJCSAgICAgICBhdG9tX2xlbiwgb2Zmc2V0KTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUlPOwogCX0KIAogCS8qIFJlYWQgdGhlIGVudHJpZXMgb25lIGJ5IG9uZSAqLwpAQCAtNDIwOSwzMyArNDIyMyw0MSBAQAogCQkvKiBXZSBoYXZlIHNvbWUgcmVzdWx0cyB0byBwdXNoIGJhY2sgdG8gdXNlciBzcGFjZSAqLwogCiAJCS8qIFRyYW5zbGF0ZSB0byBXRSBmb3JtYXQgKi8KLQkJc3JxLT5sZW5ndGggPSBvcmlub2NvX3RyYW5zbGF0ZV9zY2FuKGRldiwgZXh0cmEsCi0JCQkJCQkgICAgIHByaXYtPnNjYW5fcmVzdWx0LAotCQkJCQkJICAgICBwcml2LT5zY2FuX2xlbik7CisJCWludCByZXQgPSBvcmlub2NvX3RyYW5zbGF0ZV9zY2FuKGRldiwgZXh0cmEsCisJCQkJCQkgcHJpdi0+c2Nhbl9yZXN1bHQsCisJCQkJCQkgcHJpdi0+c2Nhbl9sZW4pOwogCi0JCS8qIFJldHVybiBmbGFncyAqLwotCQlzcnEtPmZsYWdzID0gKF9fdTE2KSBwcml2LT5zY2FuX21vZGU7CisJCWlmIChyZXQgPCAwKSB7CisJCQllcnIgPSByZXQ7CisJCQlrZnJlZShwcml2LT5zY2FuX3Jlc3VsdCk7CisJCQlwcml2LT5zY2FuX3Jlc3VsdCA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlzcnEtPmxlbmd0aCA9IHJldDsKIAotCQkvKiBSZXN1bHRzIGFyZSBoZXJlLCBzbyBzY2FuIG5vIGxvbmdlciBpbiBwcm9ncmVzcyAqLwotCQlwcml2LT5zY2FuX2lucHJvZ3Jlc3MgPSAwOworCQkJLyogUmV0dXJuIGZsYWdzICovCisJCQlzcnEtPmZsYWdzID0gKF9fdTE2KSBwcml2LT5zY2FuX21vZGU7CiAKLQkJLyogSW4gYW55IGNhc2UsIFNjYW4gcmVzdWx0cyB3aWxsIGJlIGNsZWFuZWQgdXAgaW4gdGhlCi0JCSAqIHJlc2V0IGZ1bmN0aW9uIGFuZCB3aGVuIGV4aXRpbmcgdGhlIGRyaXZlci4KLQkJICogVGhlIHBlcnNvbiB0cmlnZ2VyaW5nIHRoZSBzY2FubmluZyBtYXkgbmV2ZXIgY29tZSB0bwotCQkgKiBwaWNrIHRoZSByZXN1bHRzLCBzbyB3ZSBuZWVkIHRvIGRvIGl0IGluIHRob3NlIHBsYWNlcy4KLQkJICogSmVhbiBJSSAqLworCQkJLyogSW4gYW55IGNhc2UsIFNjYW4gcmVzdWx0cyB3aWxsIGJlIGNsZWFuZWQgdXAgaW4gdGhlCisJCQkgKiByZXNldCBmdW5jdGlvbiBhbmQgd2hlbiBleGl0aW5nIHRoZSBkcml2ZXIuCisJCQkgKiBUaGUgcGVyc29uIHRyaWdnZXJpbmcgdGhlIHNjYW5uaW5nIG1heSBuZXZlciBjb21lIHRvCisJCQkgKiBwaWNrIHRoZSByZXN1bHRzLCBzbyB3ZSBuZWVkIHRvIGRvIGl0IGluIHRob3NlIHBsYWNlcy4KKwkJCSAqIEplYW4gSUkgKi8KIAogI2lmZGVmIFNDQU5fU0lOR0xFX1JFQUQKLQkJLyogSWYgeW91IGVuYWJsZSB0aGlzIG9wdGlvbiwgb25seSBvbmUgY2xpZW50ICh0aGUgZmlyc3QKLQkJICogb25lKSB3aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgcmVzdWx0IChhbmQgb25seSBvbmUKLQkJICogdGltZSkuIElmIHRoZXJlIGlzIG11bHRpcGxlIGNvbmN1cmVudCBjbGllbnRzIHRoYXQKLQkJICogd2FudCB0byByZWFkIHNjYW4gcmVzdWx0cywgdGhpcyBiZWhhdmlvciBpcyBub3QKLQkJICogYWR2aXNhYmxlIC0gSmVhbiBJSSAqLwotCQlrZnJlZShwcml2LT5zY2FuX3Jlc3VsdCk7Ci0JCXByaXYtPnNjYW5fcmVzdWx0ID0gTlVMTDsKKwkJCS8qIElmIHlvdSBlbmFibGUgdGhpcyBvcHRpb24sIG9ubHkgb25lIGNsaWVudCAodGhlIGZpcnN0CisJCQkgKiBvbmUpIHdpbGwgYmUgYWJsZSB0byByZWFkIHRoZSByZXN1bHQgKGFuZCBvbmx5IG9uZQorCQkJICogdGltZSkuIElmIHRoZXJlIGlzIG11bHRpcGxlIGNvbmN1cmVudCBjbGllbnRzIHRoYXQKKwkJCSAqIHdhbnQgdG8gcmVhZCBzY2FuIHJlc3VsdHMsIHRoaXMgYmVoYXZpb3IgaXMgbm90CisJCQkgKiBhZHZpc2FibGUgLSBKZWFuIElJICovCisJCQlrZnJlZShwcml2LT5zY2FuX3Jlc3VsdCk7CisJCQlwcml2LT5zY2FuX3Jlc3VsdCA9IE5VTEw7CiAjZW5kaWYgLyogU0NBTl9TSU5HTEVfUkVBRCAqLwotCQkvKiBIZXJlLCBpZiB0b28gbXVjaCB0aW1lIGhhcyBlbGFwc2VkIHNpbmNlIGxhc3Qgc2NhbiwKLQkJICogd2UgbWF5IHdhbnQgdG8gY2xlYW4gdXAgc2NhbiByZXN1bHRzLi4uIC0gSmVhbiBJSSAqLworCQkJLyogSGVyZSwgaWYgdG9vIG11Y2ggdGltZSBoYXMgZWxhcHNlZCBzaW5jZSBsYXN0IHNjYW4sCisJCQkgKiB3ZSBtYXkgd2FudCB0byBjbGVhbiB1cCBzY2FuIHJlc3VsdHMuLi4gLSBKZWFuIElJICovCisJCX0KKworCQkvKiBTY2FuIGlzIG5vIGxvbmdlciBpbiBwcm9ncmVzcyAqLworCQlwcml2LT5zY2FuX2lucHJvZ3Jlc3MgPSAwOwogCX0KIAkgIAogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMKaW5kZXggMWNjMTQ5Mi4uZDFmYjFiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYwpAQCAtNjA0LDcgKzYwNCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBvcmlub2NvX2NzX2lkc1tdID0gewogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAwYiwgMHg3MzAwKSwKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwODksIDB4MDAwMSksCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTM4LCAweDAwMDIpLAogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1NiwgMHgwMDAyKSwKIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxZWIsIDB4MDgwYSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX25vcnRlbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19ub3J0ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmZhNThlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19ub3J0ZWwuYwpAQCAtMCwwICsxLDMyNCBAQAorLyogb3Jpbm9jb19ub3J0ZWwuYworICogCisgKiBEcml2ZXIgZm9yIFByaXNtIElJIGRldmljZXMgd2hpY2ggd291bGQgdXN1YWxseSBiZSBkcml2ZW4gYnkgb3Jpbm9jb19jcywKKyAqIGJ1dCBhcmUgY29ubmVjdGVkIHRvIHRoZSBQQ0kgYnVzIGJ5IGEgTm9ydGVsIFBDSS1QQ01DSUEtQWRhcHRlci4gCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFRvYmlhcyBIb2ZmbWFubgorICogICAgICAgICAgIChDKSAyMDAzIENocmlzdG9waCBKdW5nZWdnZXIgPGRpc2Rvc0B0cmF1bTQwNC5kZT4KKyAqCisgKiBTb21lIG9mIHRoaXMgY29kZSBpcyBib3Jyb3dlZCBmcm9tIG9yaW5vY29fcGx4LmMKKyAqCUNvcHlyaWdodCAoQykgMjAwMSBEYW5pZWwgQmFybG93CisgKiBTb21lIG9mIHRoaXMgY29kZSBpcyBib3Jyb3dlZCBmcm9tIG9yaW5vY29fcGNpLmMgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIEplYW4gVG91cnJpbGhlcworICogU29tZSBvZiB0aGlzIGNvZGUgaXMgImluc3BpcmVkIiBieSBsaW51eC13bGFuLW5nLTAuMS4xMCwgYnV0IG5vdGhpbmcKKyAqIGhhcyBiZWVuIGNvcGllZCBmcm9tIGl0LiBsaW51eC13bGFuLW5nLTAuMS4xMCBpcyBvcmlnaW5hbGx5IDoKKyAqCUNvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KKyAqIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCisgKiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlCisgKiB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQorICogYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIKKyAqIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkKKyAqIGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZAorICogb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlCisgKiBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCisgKi8KKworI2RlZmluZSBEUklWRVJfTkFNRSAib3Jpbm9jb19ub3J0ZWwiCisjZGVmaW5lIFBGWCBEUklWRVJfTkFNRSAiOiAiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisKKyNpbmNsdWRlICJoZXJtZXMuaCIKKyNpbmNsdWRlICJvcmlub2NvLmgiCisKKyNkZWZpbmUgQ09SX09GRlNFVCAgICAoMHhlMCkJLyogQ09SIGF0dHJpYnV0ZSBvZmZzZXQgb2YgUHJpc20yIFBDIGNhcmQgKi8KKyNkZWZpbmUgQ09SX1ZBTFVFICAgICAoQ09SX0xFVkVMX1JFUSB8IENPUl9GVU5DX0VOQSkJLyogRW5hYmxlIFBDIGNhcmQgd2l0aCBpbnRlcnJ1cHQgaW4gbGV2ZWwgdHJpZ2dlciAqLworCisKKy8qIE5vcnRlbCBzcGVjaWZpYyBkYXRhICovCitzdHJ1Y3Qgbm9ydGVsX3BjaV9jYXJkIHsKKwl1bnNpZ25lZCBsb25nIGlvYmFzZTE7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2UyOworfTsKKworLyoKKyAqIERvIGEgc29mdCByZXNldCBvZiB0aGUgUENJIGNhcmQgdXNpbmcgdGhlIENvbmZpZ3VyYXRpb24gT3B0aW9uIFJlZ2lzdGVyCisgKiBXZSBuZWVkIHRoaXMgdG8gZ2V0IGdvaW5nLi4uCisgKiBUaGlzIGlzIHRoZSBwYXJ0IG9mIHRoZSBjb2RlIHRoYXQgaXMgc3Ryb25nbHkgaW5zcGlyZWQgZnJvbSB3bGFuLW5nCisgKgorICogTm90ZSBiaXMgOiBEb24ndCB0cnkgdG8gYWNjZXNzIEhFUk1FU19DTUQgZHVyaW5nIHRoZSByZXNldCBwaGFzZS4KKyAqIEl0IGp1c3Qgd29uJ3Qgd29yayAhCisgKi8KK3N0YXRpYyBpbnQgbm9ydGVsX3BjaV9jb3JfcmVzZXQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3Qgbm9ydGVsX3BjaV9jYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKKworCS8qIEFzc2VydCB0aGUgcmVzZXQgdW50aWwgdGhlIGNhcmQgbm90aWNlICovCisJb3V0d19wKDgsIGNhcmQtPmlvYmFzZTEgKyAyKTsKKwlpbncoY2FyZC0+aW9iYXNlMiArIENPUl9PRkZTRVQpOworCW91dHdfcCgweDgwLCBjYXJkLT5pb2Jhc2UyICsgQ09SX09GRlNFVCk7CisJbWRlbGF5KDEpOworCisJLyogR2l2ZSB0aW1lIGZvciB0aGUgY2FyZCB0byByZWNvdmVyIGZyb20gdGhpcyBoYXJkIGVmZm9ydCAqLworCW91dHdfcCgwLCBjYXJkLT5pb2Jhc2UyICsgQ09SX09GRlNFVCk7CisJb3V0d19wKDAsIGNhcmQtPmlvYmFzZTIgKyBDT1JfT0ZGU0VUKTsKKwltZGVsYXkoMSk7CisKKwkvKiBzZXQgQ09SIGFzIHVzdWFsICovCisJb3V0d19wKENPUl9WQUxVRSwgY2FyZC0+aW9iYXNlMiArIENPUl9PRkZTRVQpOworCW91dHdfcChDT1JfVkFMVUUsIGNhcmQtPmlvYmFzZTIgKyBDT1JfT0ZGU0VUKTsKKwltZGVsYXkoMSk7CisKKwlvdXR3X3AoMHgyMjgsIGNhcmQtPmlvYmFzZTEgKyAyKTsKKworCXJldHVybiAwOworfQorCitpbnQgbm9ydGVsX3BjaV9od19pbml0KHN0cnVjdCBub3J0ZWxfcGNpX2NhcmQgKmNhcmQpCit7CisJaW50IGk7CisJdTMyIHJlZzsKKworCS8qIHNldHVwIGJyaWRnZSAqLworCWlmIChpbncoY2FyZC0+aW9iYXNlMSkgJiAxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImJyZzEgYW5zd2VyMSB3cm9uZ1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCW91dHdfcCgweDExOCwgY2FyZC0+aW9iYXNlMSArIDIpOworCW91dHdfcCgweDEwOCwgY2FyZC0+aW9iYXNlMSArIDIpOworCW1kZWxheSgzMCk7CisJb3V0d19wKDB4OCwgY2FyZC0+aW9iYXNlMSArIDIpOworCWZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKSB7CisJCW1kZWxheSgzMCk7CisJCWlmIChpbncoY2FyZC0+aW9iYXNlMSkgJiAweDEwKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSAzMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJicmcxIHRpbWVkIG91dFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChpbncoY2FyZC0+aW9iYXNlMiArIDB4ZTApICYgMSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJicmcyIGFuc3dlcjEgd3JvbmdcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpZiAoaW53KGNhcmQtPmlvYmFzZTIgKyAweGUyKSAmIDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYnJnMiBhbnN3ZXIyIHdyb25nXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKGludyhjYXJkLT5pb2Jhc2UyICsgMHhlNCkgJiAxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImJyZzIgYW5zd2VyMyB3cm9uZ1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogc2V0IHRoZSBQQ01DSUEgQ09SLVJlZ2lzdGVyICovCisJb3V0d19wKENPUl9WQUxVRSwgY2FyZC0+aW9iYXNlMiArIENPUl9PRkZTRVQpOworCW1kZWxheSgxKTsKKwlyZWcgPSBpbncoY2FyZC0+aW9iYXNlMiArIENPUl9PRkZTRVQpOworCWlmIChyZWcgIT0gQ09SX1ZBTFVFKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkVycm9yIHNldHRpbmcgQ09SIHZhbHVlIChyZWc9JXgpXG4iLAorCQkgICAgICAgcmVnKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBzZXQgbGVkcyAqLworCW91dHdfcCgxLCBjYXJkLT5pb2Jhc2UxICsgMTApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5vcnRlbF9wY2lfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXY7CisJc3RydWN0IG5vcnRlbF9wY2lfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqaW9tZW07CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBlbmFibGUgUENJIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUklWRVJfTkFNRSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIik7CisJCWdvdG8gZmFpbF9yZXNvdXJjZXM7CisJfQorCisJaW9tZW0gPSBwY2lfaW9tYXAocGRldiwgMywgMCk7CisJaWYgKCFpb21lbSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfbWFwX2lvOworCX0KKworCS8qIEFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlICovCisJZGV2ID0gYWxsb2Nfb3Jpbm9jb2RldihzaXplb2YoKmNhcmQpLCBub3J0ZWxfcGNpX2Nvcl9yZXNldCk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2FsbG9jOworCX0KKworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNhcmQgPSBwcml2LT5jYXJkOworCWNhcmQtPmlvYmFzZTEgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJY2FyZC0+aW9iYXNlMiA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwlkZXYtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWhlcm1lc19zdHJ1Y3RfaW5pdCgmcHJpdi0+aHcsIGlvbWVtLCBIRVJNRVNfMTZCSVRfUkVHU1BBQ0lORyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIkRldGVjdGVkIE5vcnRlbCBQQ0kgZGV2aWNlIGF0ICVzIGlycTolZCwgIgorCSAgICAgICAiaW8gYWRkcjoweCVseFxuIiwgcGNpX25hbWUocGRldiksIHBkZXYtPmlycSwgZGV2LT5iYXNlX2FkZHIpOworCisJZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBvcmlub2NvX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkgIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBhbGxvY2F0ZSBJUlEgJWRcbiIsIHBkZXYtPmlycSk7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBmYWlsX2lycTsKKwl9CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKKwllcnIgPSBub3J0ZWxfcGNpX2h3X2luaXQoY2FyZCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJIYXJkd2FyZSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJZXJyID0gbm9ydGVsX3BjaV9jb3JfcmVzZXQocHJpdik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbml0aWFsIHJlc2V0IGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IHJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJcmV0dXJuIDA7CisKKyBmYWlsOgorCWZyZWVfaXJxKHBkZXYtPmlycSwgZGV2KTsKKworIGZhaWxfaXJxOgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX29yaW5vY29kZXYoZGV2KTsKKworIGZhaWxfYWxsb2M6CisJcGNpX2lvdW5tYXAocGRldiwgaW9tZW0pOworCisgZmFpbF9tYXBfaW86CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworIGZhaWxfcmVzb3VyY2VzOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBub3J0ZWxfcGNpX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgbm9ydGVsX3BjaV9jYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKKworCS8qIGNsZWFyIGxlZHMgKi8KKwlvdXR3X3AoMCwgY2FyZC0+aW9iYXNlMSArIDEwKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCXBjaV9pb3VubWFwKHBkZXYsIHByaXYtPmh3LmlvYmFzZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5vcnRlbF9wY2lfaWRfdGFibGVbXSA9IHsKKwkvKiBOb3J0ZWwgZW1vYmlsaXR5IFBDSSAqLworCXsweDEyNmMsIDB4ODAzMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCXswLH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbm9ydGVsX3BjaV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBub3J0ZWxfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9IERSSVZFUl9OQU1FLAorCS5pZF90YWJsZSA9IG5vcnRlbF9wY2lfaWRfdGFibGUsCisJLnByb2JlID0gbm9ydGVsX3BjaV9pbml0X29uZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aobm9ydGVsX3BjaV9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gRFJJVkVSX05BTUUgIiAiIERSSVZFUl9WRVJTSU9OCisJIiAoVG9iaWFzIEhvZmZtYW5uICYgQ2hyaXN0b3BoIEp1bmdlZ2dlciA8ZGlzZG9zQHRyYXVtNDA0LmRlPikiOworTU9EVUxFX0FVVEhPUigiQ2hyaXN0b3BoIEp1bmdlZ2dlciA8ZGlzZG9zQHRyYXVtNDA0LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OCisgICAgKCJEcml2ZXIgZm9yIHdpcmVsZXNzIExBTiBjYXJkcyB1c2luZyB0aGUgTm9ydGVsIFBDSSBicmlkZ2UiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgbm9ydGVsX3BjaV9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCB2ZXJzaW9uKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZub3J0ZWxfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBub3J0ZWxfcGNpX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm5vcnRlbF9wY2lfZHJpdmVyKTsKKwlzc2xlZXAoMSk7Cit9CisKK21vZHVsZV9pbml0KG5vcnRlbF9wY2lfaW5pdCk7Cittb2R1bGVfZXhpdChub3J0ZWxfcGNpX2V4aXQpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGNpLmMKaW5kZXggN2E2ZjUyZS4uNDJlMDM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BjaS5jCkBAIC0zMDEsOCArMzAxLDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnI7CiAJCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBPcmlub2NvLVBDSSBlbnRlcmluZyBzbGVlcCBtb2RlIChzdGF0ZT0lZClcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgc3RhdGUpOwogCiAJZXJyID0gb3Jpbm9jb19sb2NrKHByaXYsICZmbGFncyk7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKaW5kZXggMGYyOWE5Yy4uOWE4NzkwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCkBAIC0yNzI3LDYgKzI3MjcsOSBAQAogCS5zdGFuZGFyZCA9IChpd19oYW5kbGVyICopIHByaXNtNTRfaGFuZGxlciwKIAkucHJpdmF0ZSA9IChpd19oYW5kbGVyICopIHByaXNtNTRfcHJpdmF0ZV9oYW5kbGVyLAogCS5wcml2YXRlX2FyZ3MgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcmlzbTU0X3ByaXZhdGVfYXJncywKKyNpZiBXSVJFTEVTU19FWFQgPiAxNgorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBwcmlzbTU0X2dldF93aXJlbGVzc19zdGF0cywKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNiAqLwogI2lmIFdJUkVMRVNTX0VYVCA9PSAxNgogCS5zcHlfb2Zmc2V0ID0gb2Zmc2V0b2YoaXNscGNpX3ByaXZhdGUsIHNweV9kYXRhKSwKICNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPT0gMTYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKaW5kZXggZWZhYjA3ZS4uNmYxM2Q0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKQEAgLTgxNSw3ICs4MTUsNiBAQAogCW5kZXYtPm9wZW4gPSAmaXNscGNpX29wZW47CiAJbmRldi0+c3RvcCA9ICZpc2xwY2lfY2xvc2U7CiAJbmRldi0+Z2V0X3N0YXRzID0gJmlzbHBjaV9zdGF0aXN0aWNzOwotCW5kZXYtPmdldF93aXJlbGVzc19zdGF0cyA9ICZwcmlzbTU0X2dldF93aXJlbGVzc19zdGF0czsKIAluZGV2LT5kb19pb2N0bCA9ICZwcmlzbTU0X2lvY3RsOwogCW5kZXYtPndpcmVsZXNzX2hhbmRsZXJzID0KIAkgICAgKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSAmcHJpc201NF9oYW5kbGVyX2RlZjsKQEAgLTg0NCw2ICs4NDMsOCBAQAogCS8qIEFkZCBwb2ludGVycyB0byBlbmFibGUgaXdzcHkgc3VwcG9ydC4gKi8KIAlwcml2LT53aXJlbGVzc19kYXRhLnNweV9kYXRhID0gJnByaXYtPnNweV9kYXRhOwogCW5kZXYtPndpcmVsZXNzX2RhdGEgPSAmcHJpdi0+d2lyZWxlc3NfZGF0YTsKKyNlbHNlICAvKiBXSVJFTEVTU19FWFQgPiAxNiAqLworCW5kZXYtPmdldF93aXJlbGVzc19zdGF0cyA9ICZwcmlzbTU0X2dldF93aXJlbGVzc19zdGF0czsKICNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNiAqLwogCiAJLyogc2F2ZSB0aGUgc3RhcnQgYW5kIGVuZCBhZGRyZXNzIG9mIHRoZSBQQ0kgbWVtb3J5IGFyZWEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYwppbmRleCBjMTczOTFkLi5kYzA0MGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jCkBAIC0yNjcsOCArMjY3LDYgQEAKIAlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5kZXYgPyBuZXRkZXZfcHJpdihuZGV2KSA6IE5VTEw7CiAJQlVHX09OKCFwcml2KTsKIAotCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGdvdCBzdXNwZW5kIHJlcXVlc3QgKHN0YXRlICVkKVxuIiwKLQkgICAgICAgbmRldi0+bmFtZSwgc3RhdGUpOwogCiAJcGNpX3NhdmVfc3RhdGUocGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKaW5kZXggMGUwYmE2MS4uZTljNWVhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KICNpbmNsdWRlIDxwY21jaWEvbWVtX29wLmg+CiAKKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNjQsNyArNjUsNiBAQAogI2RlZmluZSBXSVJFTEVTU19TUFkJCS8qIEVuYWJsZSBzcHlpbmcgYWRkcmVzc2VzICovCiAvKiBEZWZpbml0aW9ucyB3ZSBuZWVkIGZvciBzcHkgKi8KIHR5cGVkZWYgc3RydWN0IGl3X3N0YXRpc3RpY3MJaXdfc3RhdHM7Ci10eXBlZGVmIHN0cnVjdCBpd19xdWFsaXR5CWl3X3F1YWw7CiB0eXBlZGVmIHVfY2hhcgltYWNfYWRkcltFVEhfQUxFTl07CS8qIEhhcmR3YXJlIGFkZHJlc3MgKi8KIAogI2luY2x1ZGUgInJheWN0bC5oIgpAQCAtMTAxLDcgKzEwMSw2IEBACiBzdGF0aWMgaW50IHJheV9kZXZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcmF5X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgcmF5X2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCByYXlfZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKIAogc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CiAKQEAgLTExNCw5ICsxMTMsOCBAQAogc3RhdGljIHZvaWQgcmF5X2J1aWxkX2hlYWRlcihyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eCwgVUNIQVIgbXNnX3R5cGUsCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSk7CiBzdGF0aWMgdm9pZCB1bnRyYW5zbGF0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKTsKLSNpZiBXSVJFTEVTU19FWFQgPiA3CS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCiBzdGF0aWMgaXdfc3RhdHMgKiByYXlfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KTsKLSNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA3ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCXJheV9oYW5kbGVyX2RlZjsKIAogLyoqKioqIFByb3RvdHlwZXMgZm9yIHJheWxpbmsgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBhc2NfdG9faW50KGNoYXIgYSk7CkBAIC0zNzMsMTEgKzM3MSwxMiBAQAogICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJnJheV9kZXZfc3RhcnRfeG1pdDsKICAgICBkZXYtPnNldF9jb25maWcgPSAmcmF5X2Rldl9jb25maWc7CiAgICAgZGV2LT5nZXRfc3RhdHMgID0gJnJheV9nZXRfc3RhdHM7Ci0gICAgZGV2LT5kb19pb2N0bCA9ICZyYXlfZGV2X2lvY3RsOwogICAgIFNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOwotI2lmIFdJUkVMRVNTX0VYVCA+IDcJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KLSAgICBkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IHJheV9nZXRfd2lyZWxlc3Nfc3RhdHM7Ci0jZW5kaWYKKyAgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnJheV9oYW5kbGVyX2RlZjsKKyNpZmRlZiBXSVJFTEVTU19TUFkKKyAgICBsb2NhbC0+d2lyZWxlc3NfZGF0YS5zcHlfZGF0YSA9ICZsb2NhbC0+c3B5X2RhdGE7CisgICAgZGV2LT53aXJlbGVzc19kYXRhID0gJmxvY2FsLT53aXJlbGVzc19kYXRhOworI2VuZGlmCS8qIFdJUkVMRVNTX1NQWSAqLwogCiAgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OwogCkBAIC0xMjAxLDQzNiArMTIwMCw0MjAgQEAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLXN0YXRpYyBpbnQgcmF5X2Rldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHByb3RvY29sIG5hbWUKKyAqLworc3RhdGljIGludCByYXlfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQljaGFyICpjd3JxLAorCQkJY2hhciAqZXh0cmEpCiB7Ci0gICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7Ci0gICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7Ci0gICAgaW50IGVyciA9IDA7Ci0jaWYgV0lSRUxFU1NfRVhUID4gNwotICAgIHN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBpZnI7Ci0jZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gNyAqLwotI2lmZGVmIFdJUkVMRVNTX1NQWQotICAgIHN0cnVjdCBzb2NrYWRkcglhZGRyZXNzW0lXX01BWF9TUFldOwotI2VuZGlmCS8qIFdJUkVMRVNTX1NQWSAqLworCXN0cmNweShjd3JxLCAiSUVFRSA4MDIuMTEtRkgiKTsKKwlyZXR1cm4gMDsKK30KIAotICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7Ci0gICAgICAgIERFQlVHKDIsInJheV9kZXZfaW9jdGwgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIERFQlVHKDIsInJheV9jcyBJT0NUTCBkZXY9JXAsIGlmcj0lcCwgY21kID0gMHgleFxuIixkZXYsaWZyLGNtZCk7Ci0gICAgLyogVmFsaWRhdGUgdGhlIGNvbW1hbmQgKi8KLSAgICBzd2l0Y2ggKGNtZCkKLSAgICB7Ci0jaWYgV0lSRUxFU1NfRVhUID4gNwotICAgICAgLyogLS0tLS0tLS0tLS0tLS0tIFdJUkVMRVNTIEVYVEVOU0lPTlMgLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAvKiBHZXQgbmFtZSAqLwotICAgIGNhc2UgU0lPQ0dJV05BTUU6Ci0gICAgICBzdHJjcHkod3JxLT51Lm5hbWUsICJJRUVFIDgwMi4xMS1GSCIpOwotICAgICAgYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCByYXlfc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfZnJlcSAqZndycSwKKwkJCWNoYXIgKmV4dHJhKQoreworCXJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworCWludCBlcnIgPSAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCiAKLSAgICAgIC8qIEdldCBmcmVxdWVuY3kvY2hhbm5lbCAqLwotICAgIGNhc2UgU0lPQ0dJV0ZSRVE6Ci0gICAgICB3cnEtPnUuZnJlcS5tID0gbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3BhdHRlcm47Ci0gICAgICB3cnEtPnUuZnJlcS5lID0gMDsKLSAgICAgIGJyZWFrOworCS8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKwlpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwkJcmV0dXJuIC1FQlVTWTsKIAotICAgICAgLyogU2V0IGZyZXF1ZW5jeS9jaGFubmVsICovCi0gICAgY2FzZSBTSU9DU0lXRlJFUToKLSAgICAgIC8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KLSAgICAgIGlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQotCXsKLQkgIGVyciA9IC1FQlVTWTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogU2V0dGluZyBieSBjaGFubmVsIG51bWJlciAqLwotICAgICAgaWYgKCh3cnEtPnUuZnJlcS5tID4gVVNBX0hPUF9NT0QpIHx8ICh3cnEtPnUuZnJlcS5lID4gMCkpCi0JZXJyID0gLUVPUE5PVFNVUFA7Ci0gICAgICBlbHNlCi0JICBsb2NhbC0+c3Bhcm0uYjUuYV9ob3BfcGF0dGVybiA9IHdycS0+dS5mcmVxLm07Ci0gICAgICBicmVhazsKLQotICAgICAgLyogR2V0IGN1cnJlbnQgbmV0d29yayBuYW1lIChFU1NJRCkgKi8KLSAgICBjYXNlIFNJT0NHSVdFU1NJRDoKLSAgICAgIGlmICh3cnEtPnUuZGF0YS5wb2ludGVyKQotCXsKLQkgIGNoYXIgZXNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKLQkgIC8qIEdldCB0aGUgZXNzaWQgdGhhdCB3YXMgc2V0ICovCi0JICBtZW1jcHkoZXNzaWQsIGxvY2FsLT5zcGFybS5iNS5hX2N1cnJlbnRfZXNzX2lkLAotCQkgSVdfRVNTSURfTUFYX1NJWkUpOwotCSAgZXNzaWRbSVdfRVNTSURfTUFYX1NJWkVdID0gJ1wwJzsKLQotCSAgLyogUHVzaCBpdCBvdXQgISAqLwotCSAgd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKGVzc2lkKSArIDE7Ci0JICB3cnEtPnUuZGF0YS5mbGFncyA9IDE7IC8qIGFjdGl2ZSAqLwotCSAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBlc3NpZCwgc2l6ZW9mKGVzc2lkKSkpCi0JCSAgZXJyID0gLUVGQVVMVDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogU2V0IGRlc2lyZWQgbmV0d29yayBuYW1lIChFU1NJRCkgKi8KLSAgICBjYXNlIFNJT0NTSVdFU1NJRDoKLSAgICAgIC8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KLSAgICAgIGlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQotCXsKLQkgIGVyciA9IC1FQlVTWTsKLQkgIGJyZWFrOwotCX0KLQotCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKQotCXsKLQkgICAgY2hhcgljYXJkX2Vzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07Ci0JICAgIAotCSAgICAvKiBDaGVjayBpZiB3ZSBhc2tlZCBmb3IgYGFueScgKi8KLQkgICAgaWYod3JxLT51LmRhdGEuZmxhZ3MgPT0gMCkKLQkgICAgewotCQkvKiBDb3JleSA6IGNhbiB5b3UgZG8gdGhhdCA/ICovCisJLyogU2V0dGluZyBieSBjaGFubmVsIG51bWJlciAqLworCWlmICgoZndycS0+bSA+IFVTQV9IT1BfTU9EKSB8fCAoZndycS0+ZSA+IDApKQogCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKKwllbHNlCisJCWxvY2FsLT5zcGFybS5iNS5hX2hvcF9wYXR0ZXJuID0gZndycS0+bTsKKworCXJldHVybiBlcnI7Cit9CisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCByYXlfZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfZnJlcSAqZndycSwKKwkJCWNoYXIgKmV4dHJhKQoreworCXJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworCisJZndycS0+bSA9IGxvY2FsLT5zcGFybS5iNS5hX2hvcF9wYXR0ZXJuOworCWZ3cnEtPmUgPSAwOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBFU1NJRAorICovCitzdGF0aWMgaW50IHJheV9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlyYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKworCS8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKwlpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIENoZWNrIGlmIHdlIGFza2VkIGZvciBgYW55JyAqLworCWlmKGR3cnEtPmZsYWdzID09IDApIHsKKwkJLyogQ29yZXkgOiBjYW4geW91IGRvIHRoYXQgPyAqLworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfSBlbHNlIHsKIAkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIHN0cmluZyAqLwotCQlpZih3cnEtPnUuZGF0YS5sZW5ndGggPgotCQkgICBJV19FU1NJRF9NQVhfU0laRSArIDEpCi0JCXsKLQkJICAgIGVyciA9IC1FMkJJRzsKLQkJICAgIGJyZWFrOworCQlpZihkd3JxLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSArIDEpIHsKKwkJCXJldHVybiAtRTJCSUc7CiAJCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNhcmRfZXNzaWQsCi0JCQkJICAgd3JxLT51LmRhdGEucG9pbnRlciwKLQkJCQkgICB3cnEtPnUuZGF0YS5sZW5ndGgpKSB7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FyZF9lc3NpZFtJV19FU1NJRF9NQVhfU0laRV0gPSAnXDAnOwogCiAJCS8qIFNldCB0aGUgRVNTSUQgaW4gdGhlIGNhcmQgKi8KLQkJbWVtY3B5KGxvY2FsLT5zcGFybS5iNS5hX2N1cnJlbnRfZXNzX2lkLCBjYXJkX2Vzc2lkLAotCQkgICAgICAgSVdfRVNTSURfTUFYX1NJWkUpOwotCSAgICB9CisJCW1lbXNldChsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyZW50X2Vzc19pZCwgMCwgSVdfRVNTSURfTUFYX1NJWkUpOworCQltZW1jcHkobG9jYWwtPnNwYXJtLmI1LmFfY3VycmVudF9lc3NfaWQsIGV4dHJhLCBkd3JxLT5sZW5ndGgpOwogCX0KLQlicmVhazsKIAotICAgICAgLyogR2V0IGN1cnJlbnQgQWNjZXNzIFBvaW50IChCU1NJRCBpbiBvdXIgY2FzZSkgKi8KLSAgICBjYXNlIFNJT0NHSVdBUDoKLSAgICAgIG1lbWNweSh3cnEtPnUuYXBfYWRkci5zYV9kYXRhLCBsb2NhbC0+YnNzX2lkLCBFVEhfQUxFTik7Ci0gICAgICB3cnEtPnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0gICAgICBicmVhazsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQogCi0gICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgYml0LXJhdGUgKi8KLSAgICBjYXNlIFNJT0NHSVdSQVRFOgotICAgICAgaWYobG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPT0gMykKLQl3cnEtPnUuYml0cmF0ZS52YWx1ZSA9IDIwMDAwMDA7CQkvKiBIdW0uLi4gKi8KLSAgICAgIGVsc2UKLQl3cnEtPnUuYml0cmF0ZS52YWx1ZSA9IGxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlICogNTAwMDAwOwotICAgICAgd3JxLT51LmJpdHJhdGUuZml4ZWQgPSAwOwkJLyogV2UgYXJlIGluIGF1dG8gbW9kZSAqLwotICAgICAgYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBFU1NJRAorICovCitzdGF0aWMgaW50IHJheV9nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlyYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKIAotICAgICAgLyogU2V0IHRoZSBkZXNpcmVkIGJpdC1yYXRlICovCi0gICAgY2FzZSBTSU9DU0lXUkFURToKLSAgICAgIC8qIENoZWNrIGlmIHJhdGUgaXMgaW4gcmFuZ2UgKi8KLSAgICAgIGlmKCh3cnEtPnUuYml0cmF0ZS52YWx1ZSAhPSAxMDAwMDAwKSAmJgotCSAod3JxLT51LmJpdHJhdGUudmFsdWUgIT0gMjAwMDAwMCkpCi0JewotCSAgZXJyID0gLUVJTlZBTDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIEhhY2sgZm9yIDEuNSBNYi9zIGluc3RlYWQgb2YgMiBNYi9zICovCi0gICAgICBpZigobG9jYWwtPmZ3X3ZlciA9PSAweDU1KSAmJgkJLyogUGxlYXNlIGNoZWNrICovCi0JICh3cnEtPnUuYml0cmF0ZS52YWx1ZSA9PSAyMDAwMDAwKSkKLQlsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSA9IDM7Ci0gICAgICBlbHNlCi0JbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPSB3cnEtPnUuYml0cmF0ZS52YWx1ZS81MDAwMDA7Ci0gICAgICBicmVhazsKKwkvKiBHZXQgdGhlIGVzc2lkIHRoYXQgd2FzIHNldCAqLworCW1lbWNweShleHRyYSwgbG9jYWwtPnNwYXJtLmI1LmFfY3VycmVudF9lc3NfaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKKwlleHRyYVtJV19FU1NJRF9NQVhfU0laRV0gPSAnXDAnOwogCi0gICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgUlRTIHRocmVzaG9sZCAqLwotICAgIGNhc2UgU0lPQ0dJV1JUUzoKLSAgICAgIHdycS0+dS5ydHMudmFsdWUgPSAobG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFswXSA8PCA4KQotCSsgbG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFsxXTsKLSNpZiBXSVJFTEVTU19FWFQgPiA4Ci0gICAgICB3cnEtPnUucnRzLmRpc2FibGVkID0gKHdycS0+dS5ydHMudmFsdWUgPT0gMzI3NjcpOwotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KLSAgICAgIHdycS0+dS5ydHMuZml4ZWQgPSAxOwotICAgICAgYnJlYWs7CisJLyogUHVzaCBpdCBvdXQgISAqLworCWR3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOworCWR3cnEtPmZsYWdzID0gMTsgLyogYWN0aXZlICovCiAKLSAgICAgIC8qIFNldCB0aGUgZGVzaXJlZCBSVFMgdGhyZXNob2xkICovCi0gICAgY2FzZSBTSU9DU0lXUlRTOgotICAgIHsKLQlpbnQgcnRociA9IHdycS0+dS5ydHMudmFsdWU7CisJcmV0dXJuIDA7Cit9CiAKLSAgICAgIC8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KLSAgICAgIGlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQotCXsKLQkgIGVyciA9IC1FQlVTWTsKLQkgIGJyZWFrOwotCX0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IEFQIGFkZHJlc3MKKyAqLworc3RhdGljIGludCByYXlfZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBzb2NrYWRkciAqYXdycSwKKwkJCWNoYXIgKmV4dHJhKQoreworCXJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworCisJbWVtY3B5KGF3cnEtPnNhX2RhdGEsIGxvY2FsLT5ic3NfaWQsIEVUSF9BTEVOKTsKKwlhd3JxLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgQml0LVJhdGUKKyAqLworc3RhdGljIGludCByYXlfc2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQljaGFyICpleHRyYSkKK3sKKwlyYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKworCS8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKwlpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIENoZWNrIGlmIHJhdGUgaXMgaW4gcmFuZ2UgKi8KKwlpZigodndycS0+dmFsdWUgIT0gMTAwMDAwMCkgJiYgKHZ3cnEtPnZhbHVlICE9IDIwMDAwMDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEhhY2sgZm9yIDEuNSBNYi9zIGluc3RlYWQgb2YgMiBNYi9zICovCisJaWYoKGxvY2FsLT5md192ZXIgPT0gMHg1NSkgJiYJCS8qIFBsZWFzZSBjaGVjayAqLworCSAgICh2d3JxLT52YWx1ZSA9PSAyMDAwMDAwKSkKKwkJbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPSAzOworCWVsc2UKKwkJbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPSB2d3JxLT52YWx1ZS81MDAwMDA7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgQml0LVJhdGUKKyAqLworc3RhdGljIGludCByYXlfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQljaGFyICpleHRyYSkKK3sKKwlyYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKworCWlmKGxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlID09IDMpCisJCXZ3cnEtPnZhbHVlID0gMjAwMDAwMDsJCS8qIEh1bS4uLiAqLworCWVsc2UKKwkJdndycS0+dmFsdWUgPSBsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSAqIDUwMDAwMDsKKwl2d3JxLT5maXhlZCA9IDA7CQkvKiBXZSBhcmUgaW4gYXV0byBtb2RlICovCisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgUlRTIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHJheV9zZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkgICAgICAgY2hhciAqZXh0cmEpCit7CisJcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisJaW50IHJ0aHIgPSB2d3JxLT52YWx1ZTsKKworCS8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKwlpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwkJcmV0dXJuIC1FQlVTWTsKIAogCS8qIGlmKHdycS0+dS5ydHMuZml4ZWQgPT0gMCkgd2Ugc2hvdWxkIGNvbXBsYWluICovCi0jaWYgV0lSRUxFU1NfRVhUID4gOAotCWlmKHdycS0+dS5ydHMuZGlzYWJsZWQpCi0JICAgIHJ0aHIgPSAzMjc2NzsKLQllbHNlCi0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLwotCSAgICBpZigocnRociA8IDApIHx8IChydGhyID4gMjM0NykpIC8qIFdoYXQncyB0aGUgbWF4IHBhY2tldCBzaXplID8/PyAqLwotCSAgICB7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCSAgICB9CisJaWYodndycS0+ZGlzYWJsZWQpCisJCXJ0aHIgPSAzMjc2NzsKKwllbHNlIHsKKwkJaWYoKHJ0aHIgPCAwKSB8fCAocnRociA+IDIzNDcpKSAvKiBXaGF0J3MgdGhlIG1heCBwYWNrZXQgc2l6ZSA/Pz8gKi8KKwkJCXJldHVybiAtRUlOVkFMOworCX0KIAlsb2NhbC0+c3Bhcm0uYjUuYV9ydHNfdGhyZXNob2xkWzBdID0gKHJ0aHIgPj4gOCkgJiAweEZGOwogCWxvY2FsLT5zcGFybS5iNS5hX3J0c190aHJlc2hvbGRbMV0gPSBydGhyICYgMHhGRjsKLSAgICB9Ci0gICAgYnJlYWs7CiAKLSAgICAgIC8qIEdldCB0aGUgY3VycmVudCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAqLwotICAgIGNhc2UgU0lPQ0dJV0ZSQUc6Ci0gICAgICB3cnEtPnUuZnJhZy52YWx1ZSA9IChsb2NhbC0+c3Bhcm0uYjUuYV9mcmFnX3RocmVzaG9sZFswXSA8PCA4KQotCSsgbG9jYWwtPnNwYXJtLmI1LmFfZnJhZ190aHJlc2hvbGRbMV07Ci0jaWYgV0lSRUxFU1NfRVhUID4gOAotICAgICAgd3JxLT51LmZyYWcuZGlzYWJsZWQgPSAod3JxLT51LmZyYWcudmFsdWUgPT0gMzI3NjcpOwotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KLSAgICAgIHdycS0+dS5mcmFnLmZpeGVkID0gMTsKLSAgICAgIGJyZWFrOworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CiAKLSAgICAgIC8qIFNldCB0aGUgZGVzaXJlZCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAqLwotICAgIGNhc2UgU0lPQ1NJV0ZSQUc6Ci0gICAgewotCWludCBmdGhyID0gd3JxLT51LmZyYWcudmFsdWU7CiAKLSAgICAgIC8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KLSAgICAgIGlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQotCXsKLQkgIGVyciA9IC1FQlVTWTsKLQkgIGJyZWFrOwotCX0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IFJUUyB0aHJlc2hvbGQKKyAqLworc3RhdGljIGludCByYXlfZ2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJICAgICAgIGNoYXIgKmV4dHJhKQoreworCXJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworCisJdndycS0+dmFsdWUgPSAobG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFswXSA8PCA4KQorCQkrIGxvY2FsLT5zcGFybS5iNS5hX3J0c190aHJlc2hvbGRbMV07CisJdndycS0+ZGlzYWJsZWQgPSAodndycS0+dmFsdWUgPT0gMzI3NjcpOworCXZ3cnEtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBGcmFnbWVudGF0aW9uIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHJheV9zZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCWNoYXIgKmV4dHJhKQoreworCXJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworCWludCBmdGhyID0gdndycS0+dmFsdWU7CisKKwkvKiBSZWplY3QgaWYgY2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkICovCisJaWYobG9jYWwtPmNhcmRfc3RhdHVzICE9IENBUkRfQVdBSVRJTkdfUEFSQU0pCisJCXJldHVybiAtRUJVU1k7CiAKIAkvKiBpZih3cnEtPnUuZnJhZy5maXhlZCA9PSAwKSBzaG91bGQgY29tcGxhaW4gKi8KLSNpZiBXSVJFTEVTU19FWFQgPiA4Ci0JaWYod3JxLT51LmZyYWcuZGlzYWJsZWQpCi0JICAgIGZ0aHIgPSAzMjc2NzsKLQllbHNlCi0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLwotCSAgICBpZigoZnRociA8IDI1NikgfHwgKGZ0aHIgPiAyMzQ3KSkgLyogVG8gY2hlY2sgb3V0ICEgKi8KLQkgICAgewotCQllcnIgPSAtRUlOVkFMOwotCQlicmVhazsKLQkgICAgfQorCWlmKHZ3cnEtPmRpc2FibGVkKQorCQlmdGhyID0gMzI3Njc7CisJZWxzZSB7CisJCWlmKChmdGhyIDwgMjU2KSB8fCAoZnRociA+IDIzNDcpKSAvKiBUbyBjaGVjayBvdXQgISAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQogCWxvY2FsLT5zcGFybS5iNS5hX2ZyYWdfdGhyZXNob2xkWzBdID0gKGZ0aHIgPj4gOCkgJiAweEZGOwogCWxvY2FsLT5zcGFybS5iNS5hX2ZyYWdfdGhyZXNob2xkWzFdID0gZnRociAmIDB4RkY7Ci0gICAgfQotICAgIGJyZWFrOwogCi0jZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gNyAqLwotI2lmIFdJUkVMRVNTX0VYVCA+IDgKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQogCi0gICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgbW9kZSBvZiBvcGVyYXRpb24gKi8KLSAgICBjYXNlIFNJT0NHSVdNT0RFOgotICAgICAgaWYobG9jYWwtPnNwYXJtLmI1LmFfbmV0d29ya190eXBlKQotCXdycS0+dS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKLSAgICAgIGVsc2UKLQl3cnEtPnUubW9kZSA9IElXX01PREVfQURIT0M7Ci0gICAgICBicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IEZyYWdtZW50YXRpb24gdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgcmF5X2dldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CiAKLSAgICAgIC8qIFNldCB0aGUgY3VycmVudCBtb2RlIG9mIG9wZXJhdGlvbiAqLwotICAgIGNhc2UgU0lPQ1NJV01PREU6Ci0gICAgeworCXZ3cnEtPnZhbHVlID0gKGxvY2FsLT5zcGFybS5iNS5hX2ZyYWdfdGhyZXNob2xkWzBdIDw8IDgpCisJCSsgbG9jYWwtPnNwYXJtLmI1LmFfZnJhZ190aHJlc2hvbGRbMV07CisJdndycS0+ZGlzYWJsZWQgPSAodndycS0+dmFsdWUgPT0gMzI3NjcpOworCXZ3cnEtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBNb2RlIG9mIE9wZXJhdGlvbgorICovCitzdGF0aWMgaW50IHJheV9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCV9fdTMyICp1d3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisJaW50IGVyciA9IC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KIAljaGFyIGNhcmRfbW9kZSA9IDE7Ci0JCi0gICAgICAvKiBSZWplY3QgaWYgY2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkICovCi0gICAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKLQl7Ci0JICBlcnIgPSAtRUJVU1k7Ci0JICBicmVhazsKLQl9CiAKLQlzd2l0Y2ggKHdycS0+dS5tb2RlKQorCS8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKwlpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAoKnV3cnEpCiAJewogCWNhc2UgSVdfTU9ERV9BREhPQzoKLQkgICAgY2FyZF9tb2RlID0gMDsKLQkgICAgLy8gRmFsbCB0aHJvdWdoCisJCWNhcmRfbW9kZSA9IDA7CisJCS8vIEZhbGwgdGhyb3VnaAogCWNhc2UgSVdfTU9ERV9JTkZSQToKLQkgICAgbG9jYWwtPnNwYXJtLmI1LmFfbmV0d29ya190eXBlID0gY2FyZF9tb2RlOwotCSAgICBicmVhazsKKwkJbG9jYWwtPnNwYXJtLmI1LmFfbmV0d29ya190eXBlID0gY2FyZF9tb2RlOworCQlicmVhazsKIAlkZWZhdWx0OgotCSAgICBlcnIgPSAtRUlOVkFMOworCQllcnIgPSAtRUlOVkFMOwogCX0KLSAgICB9Ci0gICAgYnJlYWs7CiAKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCi0jaWYgV0lSRUxFU1NfRVhUID4gNwotICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tIElXU1BZIFNVUFBPUlQgLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAvKiBEZWZpbmUgdGhlIHJhbmdlICh2YXJpYXRpb25zKSBvZiBhYm92ZSBwYXJhbWV0ZXJzICovCi0gICAgY2FzZSBTSU9DR0lXUkFOR0U6Ci0gICAgICAvKiBCYXNpYyBjaGVja2luZy4uLiAqLwotICAgICAgaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkKLQl7Ci0JICBzdHJ1Y3QgaXdfcmFuZ2UJcmFuZ2U7Ci0JICBtZW1zZXQoKGNoYXIgKikgJnJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisJcmV0dXJuIGVycjsKK30KIAotCSAgLyogU2V0IHRoZSBsZW5ndGggKHZlcnkgaW1wb3J0YW50IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSAqLwotCSAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBNb2RlIG9mIE9wZXJhdGlvbgorICovCitzdGF0aWMgaW50IHJheV9nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCV9fdTMyICp1d3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxMAotCSAgLyogU2V0IHRoZSBXaXJlbGVzcyBFeHRlbnNpb24gdmVyc2lvbnMgKi8KLQkgIHJhbmdlLndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7Ci0JICByYW5nZS53ZV92ZXJzaW9uX3NvdXJjZSA9IDk7Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTAgKi8KKwlpZihsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUpCisJCSp1d3JxID0gSVdfTU9ERV9JTkZSQTsKKwllbHNlCisJCSp1d3JxID0gSVdfTU9ERV9BREhPQzsKIAotCSAgLyogU2V0IGluZm9ybWF0aW9uIGluIHRoZSByYW5nZSBzdHJ1Y3QgKi8KLQkgIHJhbmdlLnRocm91Z2hwdXQgPSAxLjEgKiAxMDAwICogMTAwMDsJLyogUHV0IHRoZSByaWdodCBudW1iZXIgaGVyZSAqLwotCSAgcmFuZ2UubnVtX2NoYW5uZWxzID0gaG9wX3BhdHRlcm5fbGVuZ3RoWyhpbnQpY291bnRyeV07IAotCSAgcmFuZ2UubnVtX2ZyZXF1ZW5jeSA9IDA7Ci0JICByYW5nZS5tYXhfcXVhbC5xdWFsID0gMDsKLQkgIHJhbmdlLm1heF9xdWFsLmxldmVsID0gMjU1OwkvKiBXaGF0J3MgdGhlIGNvcnJlY3QgdmFsdWUgPyAqLwotCSAgcmFuZ2UubWF4X3F1YWwubm9pc2UgPSAyNTU7CS8qIElkZW0gKi8KLQkgIHJhbmdlLm51bV9iaXRyYXRlcyA9IDI7Ci0JICByYW5nZS5iaXRyYXRlWzBdID0gMTAwMDAwMDsJLyogMSBNYi9zICovCi0JICByYW5nZS5iaXRyYXRlWzFdID0gMjAwMDAwMDsJLyogMiBNYi9zICovCisJcmV0dXJuIDA7Cit9CiAKLQkgIC8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLwotCSAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZyYW5nZSwKLQkJCSAgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpKQotCSAgICBlcnIgPSAtRUZBVUxUOwotCX0KLSAgICAgIGJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgcmFuZ2UgaW5mbworICovCitzdGF0aWMgaW50IHJheV9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKIAotI2lmZGVmIFdJUkVMRVNTX1NQWQotICAgICAgLyogU2V0IGFkZHJlc3NlcyB0byBzcHkgKi8KLSAgICBjYXNlIFNJT0NTSVdTUFk6Ci0gICAgICAvKiBDaGVjayB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyAqLwotICAgICAgaWYod3JxLT51LmRhdGEubGVuZ3RoID4gSVdfTUFYX1NQWSkKLQl7Ci0JICBlcnIgPSAtRTJCSUc7Ci0JICBicmVhazsKLQl9Ci0gICAgICBsb2NhbC0+c3B5X251bWJlciA9IHdycS0+dS5kYXRhLmxlbmd0aDsKKwltZW1zZXQoKGNoYXIgKikgcmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKIAotICAgICAgLyogSWYgdGhlcmUgaXMgc29tZSBhZGRyZXNzZXMgdG8gY29weSAqLwotICAgICAgaWYobG9jYWwtPnNweV9udW1iZXIgPiAwKQotCXsKLQkgIGludAkJCWk7CisJLyogU2V0IHRoZSBsZW5ndGggKHZlcnkgaW1wb3J0YW50IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSAqLworCWR3cnEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOwogCi0JICAvKiBDb3B5IGFkZHJlc3NlcyB0byB0aGUgZHJpdmVyICovCi0JICBpZihjb3B5X2Zyb21fdXNlcihhZGRyZXNzLCB3cnEtPnUuZGF0YS5wb2ludGVyLAotCQkJICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogbG9jYWwtPnNweV9udW1iZXIpKQotCSAgICB7Ci0JICAgICAgZXJyID0gLUVGQVVMVDsKLQkgICAgICBicmVhazsKLQkgICAgfQorCS8qIFNldCB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIHZlcnNpb25zICovCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gOTsKIAotCSAgLyogQ29weSBhZGRyZXNzZXMgdG8gdGhlIGxwIHN0cnVjdHVyZSAqLwotCSAgZm9yKGkgPSAwOyBpIDwgbG9jYWwtPnNweV9udW1iZXI7IGkrKykKLQkgICAgbWVtY3B5KGxvY2FsLT5zcHlfYWRkcmVzc1tpXSwgYWRkcmVzc1tpXS5zYV9kYXRhLCBFVEhfQUxFTik7CisJLyogU2V0IGluZm9ybWF0aW9uIGluIHRoZSByYW5nZSBzdHJ1Y3QgKi8KKwlyYW5nZS0+dGhyb3VnaHB1dCA9IDEuMSAqIDEwMDAgKiAxMDAwOwkvKiBQdXQgdGhlIHJpZ2h0IG51bWJlciBoZXJlICovCisJcmFuZ2UtPm51bV9jaGFubmVscyA9IGhvcF9wYXR0ZXJuX2xlbmd0aFsoaW50KWNvdW50cnldOyAKKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IDA7CisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAwOworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDI1NTsJLyogV2hhdCdzIHRoZSBjb3JyZWN0IHZhbHVlID8gKi8KKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAyNTU7CS8qIElkZW0gKi8KKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gMjsKKwlyYW5nZS0+Yml0cmF0ZVswXSA9IDEwMDAwMDA7CS8qIDEgTWIvcyAqLworCXJhbmdlLT5iaXRyYXRlWzFdID0gMjAwMDAwMDsJLyogMiBNYi9zICovCisJcmV0dXJuIDA7Cit9CiAKLQkgIC8qIFJlc2V0IHN0cnVjdHVyZS4uLiAqLwotCSAgbWVtc2V0KGxvY2FsLT5zcHlfc3RhdCwgMHgwMCwgc2l6ZW9mKGl3X3F1YWwpICogSVdfTUFYX1NQWSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogc2V0IGZyYW1pbmcgbW9kZQorICovCitzdGF0aWMgaW50IHJheV9zZXRfZnJhbWluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwl0cmFuc2xhdGUgPSAqKGV4dHJhKTsJLyogU2V0IGZyYW1pbmcgbW9kZSAqLwogCi0jaWZkZWYgREVCVUdfSU9DVExfSU5GTwotCSAgcHJpbnRrKEtFUk5fREVCVUcgIlNldFNweSAtIFNldCBvZiBuZXcgYWRkcmVzc2VzIGlzIDpcbiIpOwotCSAgZm9yKGkgPSAwOyBpIDwgbG9jYWwtPnNweV9udW1iZXI7IGkrKykKLQkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAotCQkgICBsb2NhbC0+c3B5X2FkZHJlc3NbaV1bMF0sCi0JCSAgIGxvY2FsLT5zcHlfYWRkcmVzc1tpXVsxXSwKLQkJICAgbG9jYWwtPnNweV9hZGRyZXNzW2ldWzJdLAotCQkgICBsb2NhbC0+c3B5X2FkZHJlc3NbaV1bM10sCi0JCSAgIGxvY2FsLT5zcHlfYWRkcmVzc1tpXVs0XSwKLQkJICAgbG9jYWwtPnNweV9hZGRyZXNzW2ldWzVdKTsKLSNlbmRpZgkvKiBERUJVR19JT0NUTF9JTkZPICovCi0JfQotICAgICAgYnJlYWs7CisJcmV0dXJuIDA7Cit9CiAKLSAgICAgIC8qIEdldCB0aGUgc3B5IGxpc3QgYW5kIHNweSBzdGF0cyAqLwotICAgIGNhc2UgU0lPQ0dJV1NQWToKLSAgICAgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyAqLwotICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gbG9jYWwtPnNweV9udW1iZXI7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogZ2V0IGZyYW1pbmcgbW9kZQorICovCitzdGF0aWMgaW50IHJheV9nZXRfZnJhbWluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwkqKGV4dHJhKSA9IHRyYW5zbGF0ZTsKIAotICAgICAgLyogSWYgdGhlIHVzZXIgd2FudCB0byBoYXZlIHRoZSBhZGRyZXNzZXMgYmFjay4uLiAqLwotICAgICAgaWYoKGxvY2FsLT5zcHlfbnVtYmVyID4gMCkgJiYgKHdycS0+dS5kYXRhLnBvaW50ZXIgIT0gKGNhZGRyX3QpIDApKQotCXsKLQkgIGludAkJCWk7CisJcmV0dXJuIDA7Cit9CiAKLQkgIC8qIENvcHkgYWRkcmVzc2VzIGZyb20gdGhlIGxwIHN0cnVjdHVyZSAqLwotCSAgZm9yKGkgPSAwOyBpIDwgbG9jYWwtPnNweV9udW1iZXI7IGkrKykKLQkgICAgewotCSAgICAgIG1lbWNweShhZGRyZXNzW2ldLnNhX2RhdGEsIGxvY2FsLT5zcHlfYWRkcmVzc1tpXSwgRVRIX0FMRU4pOwotCSAgICAgIGFkZHJlc3NbaV0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCSAgICB9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogZ2V0IGNvdW50cnkKKyAqLworc3RhdGljIGludCByYXlfZ2V0X2NvdW50cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJKihleHRyYSkgPSBjb3VudHJ5OwogCi0JICAvKiBDb3B5IGFkZHJlc3NlcyB0byB0aGUgdXNlciBidWZmZXIgKi8KLQkgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBhZGRyZXNzLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBsb2NhbC0+c3B5X251bWJlcikpCi0JICAgIHsKLQkgICAgICBlcnIgPSAtRUZBVUxUOwotCSAgICAgIGJyZWFrOwotCSAgICB9CisJcmV0dXJuIDA7Cit9CiAKLQkgIC8qIENvcHkgc3RhdHMgdG8gdGhlIHVzZXIgYnVmZmVyIChqdXN0IGFmdGVyKSAqLwotCSAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIgKwotCQkgICAgICAgKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogbG9jYWwtPnNweV9udW1iZXIpLAotCQkgICAgICAgbG9jYWwtPnNweV9zdGF0LCBzaXplb2YoaXdfcXVhbCkgKiBsb2NhbC0+c3B5X251bWJlcikpCi0JICAgIHsKLQkgICAgICBlcnIgPSAtRUZBVUxUOwotCSAgICAgIGJyZWFrOwotCSAgICB9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29tbWl0IGhhbmRsZXIgOiBjYWxsZWQgYWZ0ZXIgYSBidW5jaCBvZiBTRVQgb3BlcmF0aW9ucworICovCitzdGF0aWMgaW50IHJheV9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywJLyogTlVMTCAqLworCQkgICAgICB2b2lkICp6d3JxLAkJCS8qIE5VTEwgKi8KKwkJICAgICAgY2hhciAqZXh0cmEpCQkJLyogTlVMTCAqLworeworCXJldHVybiAwOworfQogCi0JICAvKiBSZXNldCB1cGRhdGVkIGZsYWdzICovCi0JICBmb3IoaSA9IDA7IGkgPCBsb2NhbC0+c3B5X251bWJlcjsgaSsrKQotCSAgICBsb2NhbC0+c3B5X3N0YXRbaV0udXBkYXRlZCA9IDB4MDsKLQl9CS8qIGlmKHBvaW50ZXIgIT0gTlVMTCkgKi8KLQotICAgICAgYnJlYWs7Ci0jZW5kaWYJLyogV0lSRUxFU1NfU1BZICovCi0KLSAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBQUklWQVRFIElPQ1RMIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwotI2lmbmRlZiBTSU9DSVdGSVJTVFBSSVYKLSNkZWZpbmUgU0lPQ0lXRklSU1RQUklWCVNJT0NERVZQUklWQVRFCi0jZW5kaWYgLyogU0lPQ0lXRklSU1RQUklWICovCi0jZGVmaW5lIFNJT0NTSVBGUkFNSU5HCVNJT0NJV0ZJUlNUUFJJVgkJLyogU2V0IGZyYW1pbmcgbW9kZSAqLwotI2RlZmluZSBTSU9DR0lQRlJBTUlORwlTSU9DSVdGSVJTVFBSSVYgKyAxCS8qIEdldCBmcmFtaW5nIG1vZGUgKi8KLSNkZWZpbmUgU0lPQ0dJUENPVU5UUlkJU0lPQ0lXRklSU1RQUklWICsgMwkvKiBHZXQgY291bnRyeSBjb2RlICovCi0gICAgY2FzZSBTSU9DU0lQRlJBTUlORzoKLSAgICAgIGlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQkvKiBGb3IgcHJpdmF0ZSBJT0NUTHMsIHdlIG5lZWQgdG8gY2hlY2sgcGVybWlzc2lvbnMgKi8KLQl7Ci0JICBlcnIgPSAtRVBFUk07Ci0JICBicmVhazsKLQl9Ci0gICAgICB0cmFuc2xhdGUgPSAqKHdycS0+dS5uYW1lKTsJLyogU2V0IGZyYW1pbmcgbW9kZSAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSU9DR0lQRlJBTUlORzoKLSAgICAgICood3JxLT51Lm5hbWUpID0gdHJhbnNsYXRlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSU9DR0lQQ09VTlRSWToKLSAgICAgICood3JxLT51Lm5hbWUpID0gY291bnRyeTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0lPQ0dJV1BSSVY6Ci0gICAgICAvKiBFeHBvcnQgb3VyICJwcml2YXRlIiBpbnRlcmNhY2UgKi8KLSAgICAgIGlmKHdycS0+dS5kYXRhLnBvaW50ZXIgIT0gKGNhZGRyX3QpIDApCi0JewotCSAgc3RydWN0IGl3X3ByaXZfYXJncwlwcml2W10gPQotCSAgewkvKiBjbWQsCQlzZXRfYXJncywJZ2V0X2FyZ3MsCW5hbWUgKi8KLQkgICAgeyBTSU9DU0lQRlJBTUlORywgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0X2ZyYW1pbmciIH0sCi0JICAgIHsgU0lPQ0dJUEZSQU1JTkcsIDAsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldF9mcmFtaW5nIiB9LAotCSAgICB7IFNJT0NHSVBDT1VOVFJZLCAwLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRfY291bnRyeSIgfSwKLQkgIH07Ci0JICAvKiBTZXQgdGhlIG51bWJlciBvZiBpb2N0bCBhdmFpbGFibGUgKi8KLQkgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDM7Ci0JICAvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIgKi8KLQkgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAodV9jaGFyICopIHByaXYsCi0JCSAgICAgICBzaXplb2YocHJpdikpKQotCSAgICBlcnIgPSAtRUZBVUxUOwotCX0KLSAgICAgIGJyZWFrOwotI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDcgKi8KLQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBERUJVRygwLCJyYXlfZGV2X2lvY3RsIGNtZCA9IDB4JXhcbiIsIGNtZCk7Ci0gICAgICAgICAgICBlcnIgPSAtRU9QTk9UU1VQUDsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0gLyogZW5kIHJheV9kZXZfaW9jdGwgKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNpZiBXSVJFTEVTU19FWFQgPiA3CS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3RhdHMgaGFuZGxlciA6IHJldHVybiBXaXJlbGVzcyBTdGF0cworICovCiBzdGF0aWMgaXdfc3RhdHMgKiByYXlfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQogewogICByYXlfZGV2X3QgKglsb2NhbCA9IChyYXlfZGV2X3QgKikgZGV2LT5wcml2OwpAQCAtMTY0MiwxMyArMTYyNSwxMyBAQAogCiAgIGxvY2FsLT53c3RhdHMuc3RhdHVzID0gbG9jYWwtPmNhcmRfc3RhdHVzOwogI2lmZGVmIFdJUkVMRVNTX1NQWQotICBpZigobG9jYWwtPnNweV9udW1iZXIgPiAwKSAmJiAobG9jYWwtPnNwYXJtLmI1LmFfbmV0d29ya190eXBlID09IDApKQorICBpZigobG9jYWwtPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSAmJiAobG9jYWwtPnNwYXJtLmI1LmFfbmV0d29ya190eXBlID09IDApKQogICAgIHsKICAgICAgIC8qIEdldCBpdCBmcm9tIHRoZSBmaXJzdCBub2RlIGluIHNweSBsaXN0ICovCi0gICAgICBsb2NhbC0+d3N0YXRzLnF1YWwucXVhbCA9IGxvY2FsLT5zcHlfc3RhdFswXS5xdWFsOwotICAgICAgbG9jYWwtPndzdGF0cy5xdWFsLmxldmVsID0gbG9jYWwtPnNweV9zdGF0WzBdLmxldmVsOwotICAgICAgbG9jYWwtPndzdGF0cy5xdWFsLm5vaXNlID0gbG9jYWwtPnNweV9zdGF0WzBdLm5vaXNlOwotICAgICAgbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSBsb2NhbC0+c3B5X3N0YXRbMF0udXBkYXRlZDsKKyAgICAgIGxvY2FsLT53c3RhdHMucXVhbC5xdWFsID0gbG9jYWwtPnNweV9kYXRhLnNweV9zdGF0WzBdLnF1YWw7CisgICAgICBsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSBsb2NhbC0+c3B5X2RhdGEuc3B5X3N0YXRbMF0ubGV2ZWw7CisgICAgICBsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSBsb2NhbC0+c3B5X2RhdGEuc3B5X3N0YXRbMF0ubm9pc2U7CisgICAgICBsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IGxvY2FsLT5zcHlfZGF0YS5zcHlfc3RhdFswXS51cGRhdGVkOwogICAgIH0KICNlbmRpZiAvKiBXSVJFTEVTU19TUFkgKi8KIApAQCAtMTY1OSw3ICsxNjQyLDY1IEBACiAKICAgcmV0dXJuICZsb2NhbC0+d3N0YXRzOwogfSAvKiBlbmQgcmF5X2dldF93aXJlbGVzc19zdGF0cyAqLwotI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDcgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFN0cnVjdHVyZXMgdG8gZXhwb3J0IHRoZSBXaXJlbGVzcyBIYW5kbGVycworICovCisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCXJheV9oYW5kbGVyW10gPSB7CisJW1NJT0NTSVdDT01NSVQtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfY29tbWl0LAorCVtTSU9DR0lXTkFNRSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgcmF5X2dldF9uYW1lLAorCVtTSU9DU0lXRlJFUSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgcmF5X3NldF9mcmVxLAorCVtTSU9DR0lXRlJFUSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgcmF5X2dldF9mcmVxLAorCVtTSU9DU0lXTU9ERSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgcmF5X3NldF9tb2RlLAorCVtTSU9DR0lXTU9ERSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgcmF5X2dldF9tb2RlLAorCVtTSU9DR0lXUkFOR0UgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgcmF5X2dldF9yYW5nZSwKKyNpZmRlZiBXSVJFTEVTU19TUFkKKyAJW1NJT0NTSVdTUFkgICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBpd19oYW5kbGVyX3NldF9zcHksCisJW1NJT0NHSVdTUFkgICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBpd19oYW5kbGVyX2dldF9zcHksCisJW1NJT0NTSVdUSFJTUFktU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBpd19oYW5kbGVyX3NldF90aHJzcHksCisJW1NJT0NHSVdUSFJTUFktU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBpd19oYW5kbGVyX2dldF90aHJzcHksCisjZW5kaWYJLyogV0lSRUxFU1NfU1BZICovCisJW1NJT0NHSVdBUCAgICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfZ2V0X3dhcCwKKwlbU0lPQ1NJV0VTU0lEIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIHJheV9zZXRfZXNzaWQsCisJW1NJT0NHSVdFU1NJRCAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfZ2V0X2Vzc2lkLAorCVtTSU9DU0lXUkFURSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgcmF5X3NldF9yYXRlLAorCVtTSU9DR0lXUkFURSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgcmF5X2dldF9yYXRlLAorCVtTSU9DU0lXUlRTICAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgcmF5X3NldF9ydHMsCisJW1NJT0NHSVdSVFMgICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfZ2V0X3J0cywKKwlbU0lPQ1NJV0ZSQUcgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIHJheV9zZXRfZnJhZywKKwlbU0lPQ0dJV0ZSQUcgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIHJheV9nZXRfZnJhZywKK307CisKKyNkZWZpbmUgU0lPQ1NJUEZSQU1JTkcJU0lPQ0lXRklSU1RQUklWCQkvKiBTZXQgZnJhbWluZyBtb2RlICovCisjZGVmaW5lIFNJT0NHSVBGUkFNSU5HCVNJT0NJV0ZJUlNUUFJJViArIDEJLyogR2V0IGZyYW1pbmcgbW9kZSAqLworI2RlZmluZSBTSU9DR0lQQ09VTlRSWQlTSU9DSVdGSVJTVFBSSVYgKyAzCS8qIEdldCBjb3VudHJ5IGNvZGUgKi8KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJcmF5X3ByaXZhdGVfaGFuZGxlcltdID0geworCVswXSAoaXdfaGFuZGxlcikgcmF5X3NldF9mcmFtaW5nLAorCVsxXSAoaXdfaGFuZGxlcikgcmF5X2dldF9mcmFtaW5nLAorCVszXSAoaXdfaGFuZGxlcikgcmF5X2dldF9jb3VudHJ5LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MJcmF5X3ByaXZhdGVfYXJnc1tdID0geworLyogY21kLAkJc2V0X2FyZ3MsCWdldF9hcmdzLAluYW1lICovCit7IFNJT0NTSVBGUkFNSU5HLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfZnJhbWluZyIgfSwKK3sgU0lPQ0dJUEZSQU1JTkcsIDAsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldF9mcmFtaW5nIiB9LAoreyBTSU9DR0lQQ09VTlRSWSwgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0X2NvdW50cnkiIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCXJheV9oYW5kbGVyX2RlZiA9Cit7CisJLm51bV9zdGFuZGFyZAk9IHNpemVvZihyYXlfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZQk9IHNpemVvZihyYXlfcHJpdmF0ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YocmF5X3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorCS5zdGFuZGFyZAk9IHJheV9oYW5kbGVyLAorCS5wcml2YXRlCT0gcmF5X3ByaXZhdGVfaGFuZGxlciwKKwkucHJpdmF0ZV9hcmdzCT0gcmF5X3ByaXZhdGVfYXJncywKKwkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcmF5X2dldF93aXJlbGVzc19zdGF0cywKK307CisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIHN0YXRpYyBpbnQgcmF5X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTIzOTIsMjAgKzI0MzMsMTUgQEAKIAkvKmxvY2FsLT53c3RhdHMucXVhbC5ub2lzZSA9IG5vbmUgPyAqLwogCWxvY2FsLT53c3RhdHMucXVhbC51cGRhdGVkID0gMHgyOwogICAgICAgfQotICAgIC8qIE5vdywgZm9yIHRoZSBhZGRyZXNzZXMgaW4gdGhlIHNweSBsaXN0ICovCisgICAgLyogTm93LCB1cGRhdGUgdGhlIHNweSBzdHVmZiAqLwogICAgIHsKLSAgICAgIGludAlpOwotICAgICAgLyogTG9vayBhbGwgYWRkcmVzc2VzICovCi0gICAgICBmb3IoaSA9IDA7IGkgPCBsb2NhbC0+c3B5X251bWJlcjsgaSsrKQotCS8qIElmIG1hdGNoICovCi0JaWYoIW1lbWNtcChsaW5rc3JjYWRkciwgbG9jYWwtPnNweV9hZGRyZXNzW2ldLCBFVEhfQUxFTikpCi0JICB7Ci0JICAgIC8qIFVwZGF0ZSBzdGF0aXN0aWNzICovCi0JICAgIC8qbG9jYWwtPnNweV9zdGF0W2ldLnF1YWwgPSBub25lID8gKi8KLQkgICAgbG9jYWwtPnNweV9zdGF0W2ldLmxldmVsID0gc2lnbGV2OwotCSAgICAvKmxvY2FsLT5zcHlfc3RhdFtpXS5ub2lzZSA9IG5vbmUgPyAqLwotCSAgICBsb2NhbC0+c3B5X3N0YXRbaV0udXBkYXRlZCA9IDB4MjsKLQkgIH0KKwlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJd3N0YXRzLmxldmVsID0gc2lnbGV2OworCS8qIHdzdGF0cy5ub2lzZSA9IG5vbmUgPyAqLworCS8qIHdzdGF0cy5xdWFsID0gbm9uZSA/ICovCisJd3N0YXRzLnVwZGF0ZWQgPSAweDI7CisJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJd2lyZWxlc3Nfc3B5X3VwZGF0ZShkZXYsIGxpbmtzcmNhZGRyLCAmd3N0YXRzKTsKICAgICB9CiAjZW5kaWYJLyogV0lSRUxFU1NfU1BZICovCiB9IC8qIGVuZCByeF9kYXRhICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5oCmluZGV4IGM3N2FmYTEuLjQyNjYwZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5oCkBAIC02MywxMyArNjMsMTAgQEAKICAgICBVQ0hBUiBsYXN0X3JzbDsKICAgICBpbnQgYmVhY29uX3J4ZWQ7CiAgICAgc3RydWN0IGJlYWNvbl9yeCBsYXN0X2JjbjsKLSNpZmRlZiBXSVJFTEVTU19FWFQKICAgICBpd19zdGF0cwl3c3RhdHM7CQkvKiBXaXJlbGVzcyBzcGVjaWZpYyBzdGF0cyAqLwotI2VuZGlmCiAjaWZkZWYgV0lSRUxFU1NfU1BZCi0gICAgaW50CQlzcHlfbnVtYmVyOwkJLyogTnVtYmVyIG9mIGFkZHJlc3NlcyB0byBzcHkgKi8KLSAgICBtYWNfYWRkcglzcHlfYWRkcmVzc1tJV19NQVhfU1BZICsgMV07CS8qIFRoZSBhZGRyZXNzZXMgdG8gc3B5ICovCi0gICAgaXdfcXVhbAlzcHlfc3RhdFtJV19NQVhfU1BZICsgMV07CS8qIFN0YXRpc3RpY3MgZ2F0aGVyZWQgKi8KKyAgICBzdHJ1Y3QgaXdfc3B5X2RhdGEJCXNweV9kYXRhOworICAgIHN0cnVjdCBpd19wdWJsaWNfZGF0YQl3aXJlbGVzc19kYXRhOwogI2VuZGlmCS8qIFdJUkVMRVNTX1NQWSAqLwogCiB9IHJheV9kZXZfdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3NwZWN0cnVtX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zcGVjdHJ1bV9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YzZjZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zcGVjdHJ1bV9jcy5jCkBAIC0wLDAgKzEsMTEyMCBAQAorLyoKKyAqIERyaXZlciBmb3IgODAyLjExYiBjYXJkcyB1c2luZyBSQU0tbG9hZGFibGUgU3ltYm9sIGZpcm13YXJlLCBzdWNoIGFzCisgKiBTeW1ib2wgV2lyZWxlc3MgTmV0d29ya2VyIExBNDEwMCwgQ29tcGFjdEZsYXNoIGNhcmRzIGJ5IFNvY2tldAorICogQ29tbXVuaWNhdGlvbnMgYW5kIEludGVsIFBSTy9XaXJlbGVzcyAyMDExQi4KKyAqCisgKiBUaGUgZHJpdmVyIGltcGxlbWVudHMgU3ltYm9sIGZpcm13YXJlIGRvd25sb2FkLiAgVGhlIHJlc3QgaXMgaGFuZGxlZAorICogaW4gaGVybWVzLmMgYW5kIG9yaW5vY28uYy4KKyAqCisgKiBVdGlsaXRpZXMgZm9yIGRvd25sb2FkaW5nIHRoZSBTeW1ib2wgZmlybXdhcmUgYXJlIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9vcmlub2NvLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CisgKiBQb3J0aW9ucyBiYXNlZCBvbiBvcmlub2NvX2NzLmM6CisgKiAJQ29weXJpZ2h0IChDKSBEYXZpZCBHaWJzb24sIExpbnV4Y2FyZSBBdXN0cmFsaWEKKyAqIFBvcnRpb25zIGJhc2VkIG9uIFNwZWN0cnVtMjR0RG5sZC5jIGZyb20gb3JpZ2luYWwgc3BlY3RydW0yNCBkcml2ZXI6CisgKiAJQ29weXJpZ2h0IChDKSBTeW1ib2wgVGVjaG5vbG9naWVzLgorICoKKyAqIFNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGZpbGUgb3Jpbm9jby5jLgorICovCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgInNwZWN0cnVtX2NzIgorI2RlZmluZSBQRlggRFJJVkVSX05BTUUgIjogIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaWZkZWYgIF9fSU5fUENNQ0lBX1BBQ0tBR0VfXworI2luY2x1ZGUgPHBjbWNpYS9rX2NvbXBhdC5oPgorI2VuZGlmIC8qIF9fSU5fUENNQ0lBX1BBQ0tBR0VfXyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIm9yaW5vY28uaCIKKworLyoKKyAqIElmIFNQRUNUUlVNX0ZXX0lOQ0xVREVEIGlzIGRlZmluZWQsIHRoZSBmaXJtd2FyZSBpcyBoYXJkY29kZWQgaW50bworICogdGhlIGRyaXZlci4gIFVzZSBnZXRfc3ltYm9sX2Z3IHNjcmlwdCB0byBnZW5lcmF0ZSBzcGVjdHJ1bV9mdy5oIGFuZAorICogY29weSBpdCB0byB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgc3BlY3RydW1fY3MuYy4KKyAqCisgKiBJZiBTUEVDVFJVTV9GV19JTkNMVURFRCBpcyBub3QgZGVmaW5lZCwgdGhlIGZpcm13YXJlIGlzIGxvYWRlZCBhdCB0aGUKKyAqIHJ1bnRpbWUgdXNpbmcgaG90cGx1Zy4gIFVzZSB0aGUgc2FtZSBnZXRfc3ltYm9sX2Z3IHNjcmlwdCB0byBnZW5lcmF0ZQorICogZmlsZXMgc3ltYm9sX3NwMjR0X3ByaW1fZncgc3ltYm9sX3NwMjR0X3NlY19mdywgY29weSB0aGVtIHRvIHRoZQorICogaG90cGx1ZyBmaXJtd2FyZSBkaXJlY3RvcnkgKHR5cGljYWxseSAvdXNyL2xpYi9ob3RwbHVnL2Zpcm13YXJlKSBhbmQKKyAqIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGhvdHBsdWcgaW5zdGFsbGVkIGFuZCBlbmFibGVkIGluIHRoZSBrZXJuZWwuCisgKi8KKy8qICNkZWZpbmUgU1BFQ1RSVU1fRldfSU5DTFVERUQgMSAqLworCisjaWZkZWYgU1BFQ1RSVU1fRldfSU5DTFVERUQKKy8qIEhlYWRlciB3aXRoIHRoZSBmaXJtd2FyZSAqLworI2luY2x1ZGUgInNwZWN0cnVtX2Z3LmgiCisjZWxzZQkvKiAhU1BFQ1RSVU1fRldfSU5DTFVERUQgKi8KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorc3RhdGljIHVuc2lnbmVkIGNoYXIgKnByaW1zeW07CitzdGF0aWMgdW5zaWduZWQgY2hhciAqc2Vjc3ltOworc3RhdGljIGNvbnN0IGNoYXIgcHJpbWFyeV9md19uYW1lW10gPSAic3ltYm9sX3NwMjR0X3ByaW1fZnciOworc3RhdGljIGNvbnN0IGNoYXIgc2Vjb25kYXJ5X2Z3X25hbWVbXSA9ICJzeW1ib2xfc3AyNHRfc2VjX2Z3IjsKKyNlbmRpZgkvKiAhU1BFQ1RSVU1fRldfSU5DTFVERUQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTW9kdWxlIHN0dWZmCQkJCQkJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitNT0RVTEVfQVVUSE9SKCJQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFN5bWJvbCBTcGVjdHJ1bTI0IFRyaWxvZ3kgY2FyZHMgd2l0aCBmaXJtd2FyZSBkb3dubG9hZGVyIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKKy8qIFNvbWUgRC1MaW5rIGNhcmRzIGhhdmUgYnVnZ3kgQ0lTLiBUaGV5IGRvIHdvcmsgYXQgNXYgcHJvcGVybHksIGJ1dAorICogZG9uJ3QgaGF2ZSBhbnkgQ0lTIGVudHJ5IGZvciBpdC4gVGhpcyB3b3JrYXJvdW5kIGl0Li4uICovCitzdGF0aWMgaW50IGlnbm9yZV9jaXNfdmNjOyAvKiA9IDAgKi8KK21vZHVsZV9wYXJhbShpZ25vcmVfY2lzX3ZjYywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaWdub3JlX2Npc192Y2MsICJBbGxvdyB2b2x0YWdlIG1pc21hdGNoIGJldHdlZW4gY2FyZCBhbmQgc29ja2V0Iik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1hZ2ljIGNvbnN0YW50cwkJCQkJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlIGRldl9pbmZvIHZhcmlhYmxlIGlzIHRoZSAia2V5IiB0aGF0IGlzIHVzZWQgdG8gbWF0Y2ggdXAgdGhpcworICogZGV2aWNlIGRyaXZlciB3aXRoIGFwcHJvcHJpYXRlIGNhcmRzLCB0aHJvdWdoIHRoZSBjYXJkCisgKiBjb25maWd1cmF0aW9uIGRhdGFiYXNlLgorICovCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9IERSSVZFUl9OQU1FOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEYXRhIHN0cnVjdHVyZXMJCQkJCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUENNQ0lBIHNwZWNpZmljIGRldmljZSBpbmZvcm1hdGlvbiAoZ29lcyBpbiB0aGUgY2FyZCBmaWVsZCBvZgorICogc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqLworc3RydWN0IG9yaW5vY29fcGNjYXJkIHsKKwlkZXZfbGlua190IGxpbms7CisJZGV2X25vZGVfdCBub2RlOworfTsKKworLyoKKyAqIEEgbGlua2VkIGxpc3Qgb2YgImluc3RhbmNlcyIgb2YgdGhlIGRldmljZS4gIEVhY2ggYWN0dWFsIFBDTUNJQQorICogY2FyZCBjb3JyZXNwb25kcyB0byBvbmUgZGV2aWNlIGluc3RhbmNlLCBhbmQgaXMgZGVzY3JpYmVkIGJ5IG9uZQorICogZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4gZHMuaCkuCisgKi8KK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsgLyogPSBOVUxMICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMJCQkJCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGV2aWNlIG1ldGhvZHMgKi8KK3N0YXRpYyBpbnQgc3BlY3RydW1fY3NfaGFyZF9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KTsKKworLyogUENNQ0lBIGd1bXBmICovCitzdGF0aWMgdm9pZCBzcGVjdHJ1bV9jc19jb25maWcoZGV2X2xpbmtfdCAqIGxpbmspOworc3RhdGljIHZvaWQgc3BlY3RydW1fY3NfcmVsZWFzZShkZXZfbGlua190ICogbGluayk7CitzdGF0aWMgaW50IHNwZWN0cnVtX2NzX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCSAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKiBhcmdzKTsKKworc3RhdGljIGRldl9saW5rX3QgKnNwZWN0cnVtX2NzX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIHNwZWN0cnVtX2NzX2RldGFjaChkZXZfbGlua190ICopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGaXJtd2FyZSBkb3dubG9hZGVyCQkJCQkJICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFBvc2l0aW9uIG9mIFBEQSBpbiB0aGUgYWRhcHRlciBtZW1vcnkgKi8KKyNkZWZpbmUgRUVQUk9NX0FERFIJMHgzMDAwCisjZGVmaW5lIEVFUFJPTV9MRU4JMHgyMDAKKyNkZWZpbmUgUERBX09GRlNFVAkweDEwMAorCisjZGVmaW5lIFBEQV9BRERSCShFRVBST01fQUREUiArIFBEQV9PRkZTRVQpCisjZGVmaW5lIFBEQV9XT1JEUwkoKEVFUFJPTV9MRU4gLSBQREFfT0ZGU0VUKSAvIDIpCisKKy8qIENvbnN0YW50cyBmb3IgdGhlIENJU1JFR19DQ1NSIHJlZ2lzdGVyICovCisjZGVmaW5lIEhDUl9SVU4JCTB4MDcJLyogcnVuIGZpcm13YXJlIGFmdGVyIHJlc2V0ICovCisjZGVmaW5lIEhDUl9JRExFCTB4MEUJLyogZG9uJ3QgcnVuIGZpcm13YXJlIGFmdGVyIHJlc2V0ICovCisjZGVmaW5lIEhDUl9NRU0xNgkweDEwCS8qIG1lbW9yeSB3aWR0aCBiaXQsIHNob3VsZCBiZSBwcmVzZXJ2ZWQgKi8KKworLyoKKyAqIEFVWCBwb3J0IGFjY2Vzcy4gIFRvIHVubG9jayB0aGUgQVVYIHBvcnQgd3JpdGUgdGhlIGFjY2VzcyBrZXlzIHRvIHRoZQorICogUEFSQU0wLTIgcmVnaXN0ZXJzLCB0aGVuIHdyaXRlIEhFUk1FU19BVVhfRU5BQkxFIHRvIHRoZSBIRVJNRVNfQ09OVFJPTAorICogcmVnaXN0ZXIuICBUaGVuIHJlYWQgaXQgYW5kIG1ha2Ugc3VyZSBpdCdzIEhFUk1FU19BVVhfRU5BQkxFRC4KKyAqLworI2RlZmluZSBIRVJNRVNfQVVYX0VOQUJMRQkweDgwMDAJLyogRW5hYmxlIGF1eGlsaWFyeSBwb3J0IGFjY2VzcyAqLworI2RlZmluZSBIRVJNRVNfQVVYX0RJU0FCTEUJMHg0MDAwCS8qIERpc2FibGUgdG8gYXV4aWxpYXJ5IHBvcnQgYWNjZXNzICovCisjZGVmaW5lIEhFUk1FU19BVVhfRU5BQkxFRAkweEMwMDAJLyogQXV4aWxpYXJ5IHBvcnQgaXMgb3BlbiAqLworCisjZGVmaW5lIEhFUk1FU19BVVhfUFcwCTB4RkUwMQorI2RlZmluZSBIRVJNRVNfQVVYX1BXMQkweERDMjMKKyNkZWZpbmUgSEVSTUVTX0FVWF9QVzIJMHhCQTQ1CisKKy8qIEVuZCBtYXJrZXJzICovCisjZGVmaW5lIFBESV9FTkQJCTB4MDAwMDAwMDAJLyogRW5kIG9mIFBEQSAqLworI2RlZmluZSBCTE9DS19FTkQJMHhGRkZGRkZGRgkvKiBMYXN0IGltYWdlIGJsb2NrICovCisjZGVmaW5lIFRFWFRfRU5ECTB4MUEJCS8qIEVuZCBvZiB0ZXh0IGhlYWRlciAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIGhhdmUgbGl0dGxlLWVuZGlhbiBmaWVsZHMgZGVub3RlZCBieQorICogdGhlIGxlYWRpbmcgdW5kZXJzY29yZS4gIERvbid0IGFjY2VzcyB0aGVtIGRpcmVjdGx5IC0gdXNlIGlubGluZQorICogZnVuY3Rpb25zIGRlZmluZWQgYmVsb3cuCisgKi8KKworLyoKKyAqIFRoZSBiaW5hcnkgaW1hZ2UgdG8gYmUgZG93bmxvYWRlZCBjb25zaXN0cyBvZiBzZXJpZXMgb2YgZGF0YSBibG9ja3MuCisgKiBFYWNoIGJsb2NrIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGRibG9jayB7CisJdTMyIF9hZGRyOwkJLyogYWRhcHRlciBhZGRyZXNzIHdoZXJlIHRvIHdyaXRlIHRoZSBibG9jayAqLworCXUxNiBfbGVuOwkJLyogbGVuZ3RoIG9mIHRoZSBkYXRhIG9ubHksIGluIGJ5dGVzICovCisJY2hhciBkYXRhWzBdOwkJLyogZGF0YSB0byBiZSB3cml0dGVuICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIFBsdWcgRGF0YSBSZWZlcmVuY2VzIGFyZSBsb2NhdGVkIGluIGluIHRoZSBpbWFnZSBhZnRlciB0aGUgbGFzdCBkYXRhCisgKiBibG9jay4gIFRoZXkgcmVmZXIgdG8gYXJlYXMgaW4gdGhlIGFkYXB0ZXIgbWVtb3J5IHdoZXJlIHRoZSBwbHVnIGRhdGEKKyAqIGl0ZW1zIHdpdGggbWF0Y2hpbmcgSUQgc2hvdWxkIGJlIHdyaXR0ZW4uCisgKi8KK3N0cnVjdCBwZHIgeworCXUzMiBfaWQ7CQkvKiByZWNvcmQgSUQgKi8KKwl1MzIgX2FkZHI7CQkvKiBhZGFwdGVyIGFkZHJlc3Mgd2hlcmUgdG8gd3JpdGUgdGhlIGRhdGEgKi8KKwl1MzIgX2xlbjsJCS8qIGV4cGVjdGVkIGxlbmd0aCBvZiB0aGUgZGF0YSwgaW4gYnl0ZXMgKi8KKwljaGFyIG5leHRbMF07CQkvKiBuZXh0IFBEUiBzdGFydHMgaGVyZSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKyAqIFBsdWcgRGF0YSBJdGVtcyBhcmUgbG9jYXRlZCBpbiB0aGUgRUVQUk9NIHJlYWQgZnJvbSB0aGUgYWRhcHRlciBieQorICogcHJpbWFyeSBmaXJtd2FyZS4gIFRoZXkgcmVmZXIgdG8gdGhlIGRldmljZS1zcGVjaWZpYyBkYXRhIHRoYXQgc2hvdWxkCisgKiBiZSBwbHVnZ2VkIGludG8gdGhlIHNlY29uZGFyeSBmaXJtd2FyZS4KKyAqLworc3RydWN0IHBkaSB7CisJdTE2IF9sZW47CQkvKiBsZW5ndGggb2YgSUQgYW5kIGRhdGEsIGluIHdvcmRzICovCisJdTE2IF9pZDsJCS8qIHJlY29yZCBJRCAqLworCWNoYXIgZGF0YVswXTsJCS8qIHBsdWcgZGF0YSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7OworCisKKy8qIEZ1bmN0aW9ucyBmb3IgYWNjZXNzIHRvIGxpdHRsZS1lbmRpYW4gZGF0YSAqLworc3RhdGljIGlubGluZSB1MzIKK2RibG9ja19hZGRyKGNvbnN0IHN0cnVjdCBkYmxvY2sgKmJsaykKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUoYmxrLT5fYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitkYmxvY2tfbGVuKGNvbnN0IHN0cnVjdCBkYmxvY2sgKmJsaykKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoYmxrLT5fbGVuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK3Bkcl9pZChjb25zdCBzdHJ1Y3QgcGRyICpwZHIpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KHBkci0+X2lkKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK3Bkcl9hZGRyKGNvbnN0IHN0cnVjdCBwZHIgKnBkcikKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUocGRyLT5fYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitwZHJfbGVuKGNvbnN0IHN0cnVjdCBwZHIgKnBkcikKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUocGRyLT5fbGVuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK3BkaV9pZChjb25zdCBzdHJ1Y3QgcGRpICpwZGkpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KHBkaS0+X2lkKTsKK30KKworLyogUmV0dXJuIGxlbmd0aCBvZiB0aGUgZGF0YSBvbmx5LCBpbiBieXRlcyAqLworc3RhdGljIGlubGluZSB1MzIKK3BkaV9sZW4oY29uc3Qgc3RydWN0IHBkaSAqcGRpKQoreworCXJldHVybiAyICogKGxlMTZfdG9fY3B1KHBkaS0+X2xlbikgLSAxKTsKK30KKworCisvKiBTZXQgYWRkcmVzcyBvZiB0aGUgYXV4aWxpYXJ5IHBvcnQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc3BlY3RydW1fYXV4X3NldGFkZHIoaGVybWVzX3QgKmh3LCB1MzIgYWRkcikKK3sKKwloZXJtZXNfd3JpdGVfcmVnKGh3LCBIRVJNRVNfQVVYUEFHRSwgKHUxNikgKGFkZHIgPj4gNykpOworCWhlcm1lc193cml0ZV9yZWcoaHcsIEhFUk1FU19BVVhPRkZTRVQsICh1MTYpIChhZGRyICYgMHg3RikpOworfQorCisKKy8qIE9wZW4gYWNjZXNzIHRvIHRoZSBhdXhpbGlhcnkgcG9ydCAqLworc3RhdGljIGludAorc3BlY3RydW1fYXV4X29wZW4oaGVybWVzX3QgKmh3KQoreworCWludCBpOworCisJLyogQWxyZWFkeSBvcGVuPyAqLworCWlmIChoZXJtZXNfcmVhZF9yZWcoaHcsIEhFUk1FU19DT05UUk9MKSA9PSBIRVJNRVNfQVVYX0VOQUJMRUQpCisJCXJldHVybiAwOworCisJaGVybWVzX3dyaXRlX3JlZyhodywgSEVSTUVTX1BBUkFNMCwgSEVSTUVTX0FVWF9QVzApOworCWhlcm1lc193cml0ZV9yZWcoaHcsIEhFUk1FU19QQVJBTTEsIEhFUk1FU19BVVhfUFcxKTsKKwloZXJtZXNfd3JpdGVfcmVnKGh3LCBIRVJNRVNfUEFSQU0yLCBIRVJNRVNfQVVYX1BXMik7CisJaGVybWVzX3dyaXRlX3JlZyhodywgSEVSTUVTX0NPTlRST0wsIEhFUk1FU19BVVhfRU5BQkxFKTsKKworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCXVkZWxheSgxMCk7CisJCWlmIChoZXJtZXNfcmVhZF9yZWcoaHcsIEhFUk1FU19DT05UUk9MKSA9PQorCQkgICAgSEVSTUVTX0FVWF9FTkFCTEVEKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FQlVTWTsKK30KKworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKKyAgZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworLyoKKyAqIFJlc2V0IHRoZSBjYXJkIHVzaW5nIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIENPUiBhbmQgQ0NTUi4KKyAqIElmIElETEUgaXMgMSwgc3RvcCB0aGUgZmlybXdhcmUsIHNvIHRoYXQgaXQgY2FuIGJlIHNhZmVseSByZXdyaXR0ZW4uCisgKi8KK3N0YXRpYyBpbnQKK3NwZWN0cnVtX3Jlc2V0KGRldl9saW5rX3QgKmxpbmssIGludCBpZGxlKQoreworCWludCBsYXN0X3JldCwgbGFzdF9mbjsKKwljb25mX3JlZ190IHJlZzsKKwl1X2ludCBzYXZlX2NvcjsKKworCS8qIERvaW5nIGl0IGlmIGhhcmR3YXJlIGlzIGdvbmUgaXMgZ3VhcmFudGVlZCBjcmFzaCAqLworCWlmICghKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykpCisJCXJldHVybiAtRU5PREVWOworCisJLyogU2F2ZSBvcmlnaW5hbCBDT1IgdmFsdWUgKi8KKwlyZWcuRnVuY3Rpb24gPSAwOworCXJlZy5BY3Rpb24gPSBDU19SRUFEOworCXJlZy5PZmZzZXQgPSBDSVNSRUdfQ09SOworCUNTX0NIRUNLKEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciwKKwkJIHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLT5oYW5kbGUsICZyZWcpKTsKKwlzYXZlX2NvciA9IHJlZy5WYWx1ZTsKKworCS8qIFNvZnQtUmVzZXQgY2FyZCAqLworCXJlZy5BY3Rpb24gPSBDU19XUklURTsKKwlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKKwlyZWcuVmFsdWUgPSAoc2F2ZV9jb3IgfCBDT1JfU09GVF9SRVNFVCk7CisJQ1NfQ0hFQ0soQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyLAorCQkgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmstPmhhbmRsZSwgJnJlZykpOworCXVkZWxheSgxMDAwKTsKKworCS8qIFJlYWQgQ0NTUiAqLworCXJlZy5BY3Rpb24gPSBDU19SRUFEOworCXJlZy5PZmZzZXQgPSBDSVNSRUdfQ0NTUjsKKwlDU19DSEVDSyhBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIsCisJCSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluay0+aGFuZGxlLCAmcmVnKSk7CisKKwkvKgorCSAqIFN0YXJ0IG9yIHN0b3AgdGhlIGZpcm13YXJlLiAgTWVtb3J5IHdpZHRoIGJpdCBzaG91bGQgYmUKKwkgKiBwcmVzZXJ2ZWQgZnJvbSB0aGUgdmFsdWUgd2UndmUganVzdCByZWFkLgorCSAqLworCXJlZy5BY3Rpb24gPSBDU19XUklURTsKKwlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NDU1I7CisJcmVnLlZhbHVlID0gKGlkbGUgPyBIQ1JfSURMRSA6IEhDUl9SVU4pIHwgKHJlZy5WYWx1ZSAmIEhDUl9NRU0xNik7CisJQ1NfQ0hFQ0soQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyLAorCQkgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmstPmhhbmRsZSwgJnJlZykpOworCXVkZWxheSgxMDAwKTsKKworCS8qIFJlc3RvcmUgb3JpZ2luYWwgQ09SIGNvbmZpZ3VyYXRpb24gaW5kZXggKi8KKwlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7CisJcmVnLk9mZnNldCA9IENJU1JFR19DT1I7CisJcmVnLlZhbHVlID0gKHNhdmVfY29yICYgfkNPUl9TT0ZUX1JFU0VUKTsKKwlDU19DSEVDSyhBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIsCisJCSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluay0+aGFuZGxlLCAmcmVnKSk7CisJdWRlbGF5KDEwMDApOworCXJldHVybiAwOworCisgICAgICBjc19mYWlsZWQ6CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworLyoKKyAqIFNjYW4gUERSIGZvciB0aGUgcmVjb3JkIHdpdGggdGhlIHNwZWNpZmllZCBSRUNPUkRfSUQuCisgKiBJZiBpdCdzIG5vdCBmb3VuZCwgcmV0dXJuIE5VTEwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGRyICoKK3NwZWN0cnVtX2ZpbmRfcGRyKHN0cnVjdCBwZHIgKmZpcnN0X3BkciwgdTMyIHJlY29yZF9pZCkKK3sKKwlzdHJ1Y3QgcGRyICpwZHIgPSBmaXJzdF9wZHI7CisKKwl3aGlsZSAocGRyX2lkKHBkcikgIT0gUERJX0VORCkgeworCQkvKgorCQkgKiBQRFIgYXJlYSBpcyBjdXJyZW50bHkgbm90IHRlcm1pbmF0ZWQgYnkgUERJX0VORC4KKwkJICogSXQncyBmb2xsb3dlZCBieSBDUkMgcmVjb3Jkcywgd2hpY2ggaGF2ZSB0aGUgdHlwZQorCQkgKiBmaWVsZCB3aGVyZSBQRFIgaGFzIGxlbmd0aC4gIFRoZSB0eXBlIGNhbiBiZSAwIG9yIDEuCisJCSAqLworCQlpZiAocGRyX2xlbihwZHIpIDwgMikKKwkJCXJldHVybiBOVUxMOworCisJCS8qIElmIHRoZSByZWNvcmQgSUQgbWF0Y2hlcywgd2UgYXJlIGRvbmUgKi8KKwkJaWYgKHBkcl9pZChwZHIpID09IHJlY29yZF9pZCkKKwkJCXJldHVybiBwZHI7CisKKwkJcGRyID0gKHN0cnVjdCBwZHIgKikgcGRyLT5uZXh0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCisvKiBQcm9jZXNzIG9uZSBQbHVnIERhdGEgSXRlbSAtIGZpbmQgY29ycmVzcG9uZGluZyBQRFIgYW5kIHBsdWcgaXQgKi8KK3N0YXRpYyBpbnQKK3NwZWN0cnVtX3BsdWdfcGRpKGhlcm1lc190ICpodywgc3RydWN0IHBkciAqZmlyc3RfcGRyLCBzdHJ1Y3QgcGRpICpwZGkpCit7CisJc3RydWN0IHBkciAqcGRyOworCisJLyogRmluZCB0aGUgUERJIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBQRFIgKi8KKwlwZHIgPSBzcGVjdHJ1bV9maW5kX3BkcihmaXJzdF9wZHIsIHBkaV9pZChwZGkpKTsKKworCS8qIE5vIG1hdGNoIGlzIGZvdW5kLCBzYWZlIHRvIGlnbm9yZSAqLworCWlmICghcGRyKQorCQlyZXR1cm4gMDsKKworCS8qIExlbmd0aHMgb2YgdGhlIGRhdGEgaW4gUERJIGFuZCBQRFIgbXVzdCBtYXRjaCAqLworCWlmIChwZGlfbGVuKHBkaSkgIT0gcGRyX2xlbihwZHIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGRvIHRoZSBhY3R1YWwgcGx1Z2dpbmcgKi8KKwlzcGVjdHJ1bV9hdXhfc2V0YWRkcihodywgcGRyX2FkZHIocGRyKSk7CisJaGVybWVzX3dyaXRlX3dvcmRzKGh3LCBIRVJNRVNfQVVYREFUQSwgcGRpLT5kYXRhLAorCQkJICAgcGRpX2xlbihwZGkpIC8gMik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBSZWFkIFBEQSBmcm9tIHRoZSBhZGFwdGVyICovCitzdGF0aWMgaW50CitzcGVjdHJ1bV9yZWFkX3BkYShoZXJtZXNfdCAqaHcsIHUxNiAqcGRhLCBpbnQgcGRhX2xlbikKK3sKKwlpbnQgcmV0OworCWludCBwZGFfc2l6ZTsKKworCS8qIElzc3VlIGNvbW1hbmQgdG8gcmVhZCBFRVBST00gKi8KKwlyZXQgPSBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9SRUFETUlGLCAwLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogT3BlbiBhdXhpbGlhcnkgcG9ydCAqLworCXJldCA9IHNwZWN0cnVtX2F1eF9vcGVuKGh3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogcmVhZCBQREEgZnJvbSBFRVBST00gKi8KKwlzcGVjdHJ1bV9hdXhfc2V0YWRkcihodywgUERBX0FERFIpOworCWhlcm1lc19yZWFkX3dvcmRzKGh3LCBIRVJNRVNfQVVYREFUQSwgcGRhLCBwZGFfbGVuIC8gMik7CisKKwkvKiBDaGVjayBQREEgbGVuZ3RoICovCisJcGRhX3NpemUgPSBsZTE2X3RvX2NwdShwZGFbMF0pOworCWlmIChwZGFfc2l6ZSA+IHBkYV9sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKworLyogUGFyc2UgUERBIGFuZCB3cml0ZSB0aGUgcmVjb3JkcyBpbnRvIHRoZSBhZGFwdGVyICovCitzdGF0aWMgaW50CitzcGVjdHJ1bV9hcHBseV9wZGEoaGVybWVzX3QgKmh3LCBjb25zdCBzdHJ1Y3QgZGJsb2NrICpmaXJzdF9ibG9jaywKKwkJICAgdTE2ICpwZGEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcGRpICpwZGk7CisJc3RydWN0IHBkciAqZmlyc3RfcGRyOworCWNvbnN0IHN0cnVjdCBkYmxvY2sgKmJsayA9IGZpcnN0X2Jsb2NrOworCisJLyogU2tpcCBhbGwgYmxvY2tzIHRvIGxvY2F0ZSBQbHVnIERhdGEgUmVmZXJlbmNlcyAqLworCXdoaWxlIChkYmxvY2tfYWRkcihibGspICE9IEJMT0NLX0VORCkKKwkJYmxrID0gKHN0cnVjdCBkYmxvY2sgKikgJmJsay0+ZGF0YVtkYmxvY2tfbGVuKGJsayldOworCisJZmlyc3RfcGRyID0gKHN0cnVjdCBwZHIgKikgYmxrOworCisJLyogR28gdGhyb3VnaCBldmVyeSBQREkgYW5kIHBsdWcgdGhlbSBpbnRvIHRoZSBhZGFwdGVyICovCisJcGRpID0gKHN0cnVjdCBwZGkgKikgKHBkYSArIDIpOworCXdoaWxlIChwZGlfaWQocGRpKSAhPSBQRElfRU5EKSB7CisJCXJldCA9IHNwZWN0cnVtX3BsdWdfcGRpKGh3LCBmaXJzdF9wZHIsIHBkaSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCS8qIEluY3JlbWVudCB0byB0aGUgbmV4dCBQREkgKi8KKwkJcGRpID0gKHN0cnVjdCBwZGkgKikgJnBkaS0+ZGF0YVtwZGlfbGVuKHBkaSldOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBMb2FkIGZpcm13YXJlIGJsb2NrcyBpbnRvIHRoZSBhZGFwdGVyICovCitzdGF0aWMgaW50CitzcGVjdHJ1bV9sb2FkX2Jsb2NrcyhoZXJtZXNfdCAqaHcsIGNvbnN0IHN0cnVjdCBkYmxvY2sgKmZpcnN0X2Jsb2NrKQoreworCWNvbnN0IHN0cnVjdCBkYmxvY2sgKmJsazsKKwl1MzIgYmxrYWRkcjsKKwl1MzIgYmxrbGVuOworCisJYmxrID0gZmlyc3RfYmxvY2s7CisJYmxrYWRkciA9IGRibG9ja19hZGRyKGJsayk7CisJYmxrbGVuID0gZGJsb2NrX2xlbihibGspOworCisJd2hpbGUgKGRibG9ja19hZGRyKGJsaykgIT0gQkxPQ0tfRU5EKSB7CisJCXNwZWN0cnVtX2F1eF9zZXRhZGRyKGh3LCBibGthZGRyKTsKKwkJaGVybWVzX3dyaXRlX3dvcmRzKGh3LCBIRVJNRVNfQVVYREFUQSwgYmxrLT5kYXRhLAorCQkJCSAgIGJsa2xlbiAvIDIpOworCisJCWJsayA9IChzdHJ1Y3QgZGJsb2NrICopICZibGstPmRhdGFbYmxrbGVuXTsKKwkJYmxrYWRkciA9IGRibG9ja19hZGRyKGJsayk7CisJCWJsa2xlbiA9IGRibG9ja19sZW4oYmxrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFByb2Nlc3MgYSBmaXJtd2FyZSBpbWFnZSAtIHN0b3AgdGhlIGNhcmQsIGxvYWQgdGhlIGZpcm13YXJlLCByZXNldAorICogdGhlIGNhcmQgYW5kIG1ha2Ugc3VyZSBpdCByZXNwb25kcy4gIEZvciB0aGUgc2Vjb25kYXJ5IGZpcm13YXJlIHRha2UKKyAqIGNhcmUgb2YgdGhlIFBEQSAtIHJlYWQgaXQgYW5kIHRoZW4gd3JpdGUgaXQgb24gdG9wIG9mIHRoZSBmaXJtd2FyZS4KKyAqLworc3RhdGljIGludAorc3BlY3RydW1fZGxfaW1hZ2UoaGVybWVzX3QgKmh3LCBkZXZfbGlua190ICpsaW5rLAorCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmltYWdlKQoreworCWludCByZXQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHRyOworCWNvbnN0IHN0cnVjdCBkYmxvY2sgKmZpcnN0X2Jsb2NrOworCisJLyogUGx1ZyBEYXRhIEFyZWEgKFBEQSkgKi8KKwl1MTYgcGRhW1BEQV9XT1JEU107CisKKwkvKiBCaW5hcnkgYmxvY2sgYmVnaW5zIGFmdGVyIHRoZSAweDFBIG1hcmtlciAqLworCXB0ciA9IGltYWdlOworCXdoaWxlICgqcHRyKysgIT0gVEVYVF9FTkQpOworCWZpcnN0X2Jsb2NrID0gKGNvbnN0IHN0cnVjdCBkYmxvY2sgKikgcHRyOworCisJLyogUmVhZCB0aGUgUERBICovCisJaWYgKGltYWdlICE9IHByaW1zeW0pIHsKKwkJcmV0ID0gc3BlY3RydW1fcmVhZF9wZGEoaHcsIHBkYSwgc2l6ZW9mKHBkYSkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBTdG9wIHRoZSBmaXJtd2FyZSwgc28gdGhhdCBpdCBjYW4gYmUgc2FmZWx5IHJld3JpdHRlbiAqLworCXJldCA9IHNwZWN0cnVtX3Jlc2V0KGxpbmssIDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBQcm9ncmFtIHRoZSBhZGFwdGVyIHdpdGggbmV3IGZpcm13YXJlICovCisJcmV0ID0gc3BlY3RydW1fbG9hZF9ibG9ja3MoaHcsIGZpcnN0X2Jsb2NrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogV3JpdGUgdGhlIFBEQSB0byB0aGUgYWRhcHRlciAqLworCWlmIChpbWFnZSAhPSBwcmltc3ltKSB7CisJCXJldCA9IHNwZWN0cnVtX2FwcGx5X3BkYShodywgZmlyc3RfYmxvY2ssIHBkYSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFJ1biB0aGUgZmlybXdhcmUgKi8KKwlyZXQgPSBzcGVjdHJ1bV9yZXNldChsaW5rLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogUmVzZXQgaGVybWVzIGNoaXAgYW5kIG1ha2Ugc3VyZSBpdCByZXNwb25kcyAqLworCXJldCA9IGhlcm1lc19pbml0KGh3KTsKKworCS8qIGhlcm1lc19yZXNldCgpIHNob3VsZCByZXR1cm4gMCB3aXRoIHRoZSBzZWNvbmRhcnkgZmlybXdhcmUgKi8KKwlpZiAoaW1hZ2UgIT0gcHJpbXN5bSAmJiByZXQgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBBbmQgdGhpcyBzaG91bGQgd29yayB3aXRoIGFueSBmaXJtd2FyZSAqLworCWlmICghaGVybWVzX3ByZXNlbnQoaHcpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBEb3dubG9hZCB0aGUgZmlybXdhcmUgaW50byB0aGUgY2FyZCwgdGhpcyBhbHNvIGRvZXMgYSBQQ01DSUEgc29mdAorICogcmVzZXQgb24gdGhlIGNhcmQsIHRvIG1ha2Ugc3VyZSBpdCdzIGluIGEgc2FuZSBzdGF0ZS4KKyAqLworc3RhdGljIGludAorc3BlY3RydW1fZGxfZmlybXdhcmUoaGVybWVzX3QgKmh3LCBkZXZfbGlua190ICpsaW5rKQoreworCWludCByZXQ7CisJY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKworI2lmbmRlZiBTUEVDVFJVTV9GV19JTkNMVURFRAorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7CisKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksIHByaW1hcnlfZndfbmFtZSwKKwkJCSAgICAgJmhhbmRsZV90b19kZXYoaGFuZGxlKSkgPT0gMCkgeworCQlwcmltc3ltID0gZndfZW50cnktPmRhdGE7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGZpbmQgZmlybXdhcmU6ICVzXG4iLAorCQkgICAgICAgcHJpbWFyeV9md19uYW1lKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBzZWNvbmRhcnlfZndfbmFtZSwKKwkJCSAgICAgJmhhbmRsZV90b19kZXYoaGFuZGxlKSkgPT0gMCkgeworCQlzZWNzeW0gPSBmd19lbnRyeS0+ZGF0YTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgZmluZCBmaXJtd2FyZTogJXNcbiIsCisJCSAgICAgICBzZWNvbmRhcnlfZndfbmFtZSk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKyNlbmRpZgorCisJLyogTG9hZCBwcmltYXJ5IGZpcm13YXJlICovCisJcmV0ID0gc3BlY3RydW1fZGxfaW1hZ2UoaHcsIGxpbmssIHByaW1zeW0pOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUHJpbWFyeSBmaXJtd2FyZSBkb3dubG9hZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIExvYWQgc2Vjb25kYXJ5IGZpcm13YXJlICovCisJcmV0ID0gc3BlY3RydW1fZGxfaW1hZ2UoaHcsIGxpbmssIHNlY3N5bSk7CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlNlY29uZGFyeSBmaXJtd2FyZSBkb3dubG9hZCBmYWlsZWRcbiIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERldmljZSBtZXRob2RzICAgICAJCQkJCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorc3BlY3RydW1fY3NfaGFyZF9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBvcmlub2NvX3BjY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJZGV2X2xpbmtfdCAqbGluayA9ICZjYXJkLT5saW5rOworCWludCBlcnI7CisKKwlpZiAoIWhlcm1lc19wcmVzZW50KCZwcml2LT5odykpIHsKKwkJLyogVGhlIGZpcm13YXJlIG5lZWRzIHRvIGJlIHJlbG9hZGVkICovCisJCWlmIChzcGVjdHJ1bV9kbF9maXJtd2FyZSgmcHJpdi0+aHcsICZjYXJkLT5saW5rKSAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJGaXJtd2FyZSBkb3dubG9hZCBmYWlsZWRcbiIpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNvZnQgcmVzZXQgdXNpbmcgQ09SIGFuZCBIQ1IgKi8KKwkJc3BlY3RydW1fcmVzZXQobGluaywgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBDTUNJQSBzdHVmZiAgICAgCQkJCQkJICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nIGxvY2FsIGRhdGEKKyAqIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCBDYXJkCisgKiBTZXJ2aWNlcy4KKyAqIAorICogVGhlIGRldl9saW5rIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgYnV0IHdlIGRvbid0IGFjdHVhbGx5CisgKiBjb25maWd1cmUgdGhlIGNhcmQgYXQgdGhpcyBwb2ludCAtLSB3ZSB3YWl0IHVudGlsIHdlIHJlY2VpdmUgYSBjYXJkCisgKiBpbnNlcnRpb24gZXZlbnQuICAqLworc3RhdGljIGRldl9saW5rX3QgKgorc3BlY3RydW1fY3NfYXR0YWNoKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2OworCXN0cnVjdCBvcmlub2NvX3BjY2FyZCAqY2FyZDsKKwlkZXZfbGlua190ICpsaW5rOworCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworCWludCByZXQ7CisKKwlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIHNwZWN0cnVtX2NzX2hhcmRfcmVzZXQpOworCWlmICghIGRldikKKwkJcmV0dXJuIE5VTEw7CisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJY2FyZCA9IHByaXYtPmNhcmQ7CisKKwkvKiBMaW5rIGJvdGggc3RydWN0dXJlcyB0b2dldGhlciAqLworCWxpbmsgPSAmY2FyZC0+bGluazsKKwlsaW5rLT5wcml2ID0gZGV2OworCisJLyogSW50ZXJydXB0IHNldHVwICovCisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworCWxpbmstPmlycS5IYW5kbGVyID0gb3Jpbm9jb19pbnRlcnJ1cHQ7CisJbGluay0+aXJxLkluc3RhbmNlID0gZGV2OyAKKworCS8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gZGVmYXVsdHMgY2FuIGdvIGhlcmUuICBJbiB0aGlzCisJICogY2xpZW50LCB3ZSBhc3N1bWUgdmVyeSBsaXR0bGUsIGFuZCByZWx5IG9uIHRoZSBDSVMgZm9yCisJICogYWxtb3N0IGV2ZXJ5dGhpbmcuICBJbiBtb3N0IGNsaWVudHMsIG1hbnkgZGV0YWlscyAoaS5lLiwKKwkgKiBudW1iZXIsIHNpemVzLCBhbmQgYXR0cmlidXRlcyBvZiBJTyB3aW5kb3dzKSBhcmUgZml4ZWQgYnkKKwkgKiB0aGUgbmF0dXJlIG9mIHRoZSBkZXZpY2UsIGFuZCBjYW4gYmUgaGFyZC13aXJlZCBoZXJlLiAqLworCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IDA7CisJbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisKKwkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKwkvKiBGSVhNRTogbmVlZCBhIGxvY2s/ICovCisJbGluay0+bmV4dCA9IGRldl9saXN0OworCWRldl9saXN0ID0gbGluazsKKworCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOyAvKiBGSVhNRTogd2hhdCBkb2VzIHRoaXMgbWVhbj8gKi8KKwljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCisJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJCXNwZWN0cnVtX2NzX2RldGFjaChsaW5rKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGxpbms7Cit9CQkJCS8qIHNwZWN0cnVtX2NzX2F0dGFjaCAqLworCisvKgorICogVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQgd2l0aAorICogQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzCisgKiBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgZGV2aWNlCisgKiBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQgc3BlY3RydW1fY3NfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisJZGV2X2xpbmtfdCAqKmxpbmtwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCisJLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCQlpZiAoKmxpbmtwID09IGxpbmspCisJCQlicmVhazsKKworCUJVR19PTigqbGlua3AgPT0gTlVMTCk7CisKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQlzcGVjdHJ1bV9jc19yZWxlYXNlKGxpbmspOworCisJLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJaWYgKGxpbmstPmhhbmRsZSkKKwkJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisKKwkvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgYW5kIGZyZWUgaXQgKi8KKwkqbGlua3AgPSBsaW5rLT5uZXh0OworCURFQlVHKDAsIFBGWCAiZGV0YWNoOiBsaW5rPSVwIGxpbmstPmRldj0lcFxuIiwgbGluaywgbGluay0+ZGV2KTsKKwlpZiAobGluay0+ZGV2KSB7CisJCURFQlVHKDAsIFBGWCAiQWJvdXQgdG8gdW5yZWdpc3RlciBuZXQgZGV2aWNlICVwXG4iLAorCQkgICAgICBkZXYpOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCX0KKwlmcmVlX29yaW5vY29kZXYoZGV2KTsKK30JCQkJLyogc3BlY3RydW1fY3NfZGV0YWNoICovCisKKy8qCisgKiBzcGVjdHJ1bV9jc19jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04KKyAqIGV2ZW50IGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICogZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorICovCisKK3N0YXRpYyB2b2lkCitzcGVjdHJ1bV9jc19jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwljbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBvcmlub2NvX3BjY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBsYXN0X2ZuLCBsYXN0X3JldDsKKwl1X2NoYXIgYnVmWzY0XTsKKwljb25maWdfaW5mb190IGNvbmY7CisJY2lzaW5mb190IGluZm87CisJdHVwbGVfdCB0dXBsZTsKKwljaXNwYXJzZV90IHBhcnNlOworCXZvaWQgX19pb21lbSAqbWVtOworCisJQ1NfQ0hFQ0soVmFsaWRhdGVDSVMsIHBjbWNpYV92YWxpZGF0ZV9jaXMoaGFuZGxlLCAmaW5mbykpOworCisJLyoKKwkgKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzCisJICogY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisJICovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSBidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisJbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisJbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCisJLyogQ29uZmlndXJlIGNhcmQgKi8KKwlsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisJLyogTG9vayB1cCB0aGUgY3VycmVudCBWY2MgKi8KKwlDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywKKwkJIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGhhbmRsZSwgJmNvbmYpKTsKKwlsaW5rLT5jb25mLlZjYyA9IGNvbmYuVmNjOworCisJLyoKKwkgKiBJbiB0aGlzIGxvb3AsIHdlIHNjYW4gdGhlIENJUyBmb3IgY29uZmlndXJhdGlvbiB0YWJsZQorCSAqIGVudHJpZXMsIGVhY2ggb2Ygd2hpY2ggZGVzY3JpYmVzIGEgdmFsaWQgY2FyZAorCSAqIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyB2b2x0YWdlLCBJTyB3aW5kb3csIG1lbW9yeSB3aW5kb3csCisJICogYW5kIGludGVycnVwdCBzZXR0aW5ncy4KKwkgKgorCSAqIFdlIG1ha2Ugbm8gYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGNhcmQgdG8gYmUgY29uZmlndXJlZDogd2UKKwkgKiB1c2UganVzdCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHRoZSBDSVMuICBJbiBhbiBpZGVhbAorCSAqIHdvcmxkLCB0aGlzIHdvdWxkIHdvcmsgZm9yIGFueSBQQ01DSUEgY2FyZCwgYnV0IGl0IHJlcXVpcmVzCisJICogYSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUgQ0lTLiAgSW4gcHJhY3RpY2UsIGEgZHJpdmVyIHVzdWFsbHkKKwkgKiAia25vd3MiIG1vc3Qgb2YgdGhlc2UgdGhpbmdzIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgQ0lTLAorCSAqIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzIHdpbGwgb25seSB1c2UgdGhlIENJUyB0byBmaWxsIGluCisJICogaW1wbGVtZW50YXRpb24tZGVmaW5lZCBkZXRhaWxzLgorCSAqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl3aGlsZSAoMSkgeworCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOworCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPSB7IC5pbmRleCA9IDAgfTsKKworCQlpZiAoIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDApCisJCSAgICB8fCAocGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IDApKQorCQkJZ290byBuZXh0X2VudHJ5OworCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkKKwkJCWRmbHQgPSAqY2ZnOworCQlpZiAoY2ZnLT5pbmRleCA9PSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKKworCQkvKiBEb2VzIHRoaXMgY2FyZCBuZWVkIGF1ZGlvIG91dHB1dD8gKi8KKwkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9BVURJTykgeworCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisJCQlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworCQl9CisKKwkJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCisJCS8qIE5vdGUgdGhhdCB0aGUgQ0lTIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkICovCisJCWlmIChjZmctPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCQlpZiAoY29uZi5WY2MgIT0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApIHsKKwkJCQlERUJVRygyLCAic3BlY3RydW1fY3NfY29uZmlnOiBWY2MgbWlzbWF0Y2ggKGNvbmYuVmNjID0gJWQsIENJUyA9ICVkKVxuIiwgIGNvbmYuVmNjLCBjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMCk7CisJCQkJaWYgKCFpZ25vcmVfY2lzX3ZjYykKKwkJCQkJZ290byBuZXh0X2VudHJ5OworCQkJfQorCQl9IGVsc2UgaWYgKGRmbHQudmNjLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJCWlmIChjb25mLlZjYyAhPSBkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMCkgeworCQkJCURFQlVHKDIsICJzcGVjdHJ1bV9jc19jb25maWc6IFZjYyBtaXNtYXRjaCAoY29uZi5WY2MgPSAlZCwgQ0lTID0gJWQpXG4iLCAgY29uZi5WY2MsIGRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKTsKKwkJCQlpZighaWdub3JlX2Npc192Y2MpCisJCQkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJCX0KKwkJfQorCisJCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkgICAgY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCQllbHNlIGlmIChkZmx0LnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkgICAgZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCQkKKwkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCisJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisKKwkJLyogSU8gd2luZG93IHNldHRpbmdzICovCisJCWxpbmstPmlvLk51bVBvcnRzMSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7CisJCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7CisJCQljaXN0cGxfaW9fdCAqaW8gPQorCQkJICAgIChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKKwkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCQkJbGluay0+aW8uQXR0cmlidXRlczEgPQorCQkJCSAgICBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0KKwkJCQkgICAgSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9CisJCQkgICAgaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7CisJCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJCWlmIChpby0+bndpbiA+IDEpIHsKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9CisJCQkJICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxOworCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCX0KKworCQkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KKwkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykgIT0gMCkKKwkJCQlnb3RvIG5leHRfZW50cnk7CisJCX0KKworCisJCS8qIElmIHdlIGdvdCB0aGlzIGZhciwgd2UncmUgY29vbCEgKi8KKworCQlicmVhazsKKwkJCisJbmV4dF9lbnRyeToKKwkJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkJCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwkJbGFzdF9yZXQgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpOworCQlpZiAobGFzdF9yZXQgID09IENTX05PX01PUkVfSVRFTVMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkdldE5leHRUdXBsZSgpOiBObyBtYXRjaGluZyAiCisJCQkgICAgICAgIkNJUyBjb25maWd1cmF0aW9uLiAgTWF5YmUgeW91IG5lZWQgdGhlICIKKwkJCSAgICAgICAiaWdub3JlX2Npc192Y2M9MSBwYXJhbWV0ZXIuXG4iKTsKKwkJCWdvdG8gY3NfZmFpbGVkOworCQl9CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFzc2lnbgorCSAqIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LCB1bmxlc3MgdGhlICdIYW5kbGVyJyBtZW1iZXIgb2YKKwkgKiB0aGUgaXJxIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4KKwkgKi8KKwlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKSk7CisKKwkvKiBXZSBpbml0aWFsaXplIHRoZSBoZXJtZXMgc3RydWN0dXJlIGJlZm9yZSBjb21wbGV0aW5nIFBDTUNJQQorCSAqIGNvbmZpZ3VyYXRpb24ganVzdCBpbiBjYXNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBnZXRzCisJICogY2FsbGVkLiAqLworCW1lbSA9IGlvcG9ydF9tYXAobGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pby5OdW1Qb3J0czEpOworCWlmICghbWVtKQorCQlnb3RvIGNzX2ZhaWxlZDsKKworCWhlcm1lc19zdHJ1Y3RfaW5pdChodywgbWVtLCBIRVJNRVNfMTZCSVRfUkVHU1BBQ0lORyk7CisKKwkvKgorCSAqIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisJICogdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcsIGFuZCBwdXR0aW5nIHRoZQorCSAqIGNhcmQgYW5kIGhvc3QgaW50ZXJmYWNlIGludG8gIk1lbW9yeSBhbmQgSU8iIG1vZGUuCisJICovCisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sCisJCSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworCS8qIE9rLCB3ZSBoYXZlIHRoZSBjb25maWd1cmF0aW9uLCBwcmVwYXJlIHRvIHJlZ2lzdGVyIHRoZSBuZXRkZXYgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKwlkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJY2FyZC0+bm9kZS5tYWpvciA9IGNhcmQtPm5vZGUubWlub3IgPSAwOworCisJLyogUmVzZXQgY2FyZCBhbmQgZG93bmxvYWQgZmlybXdhcmUgKi8KKwlpZiAoc3BlY3RydW1fY3NfaGFyZF9yZXNldChwcml2KSAhPSAwKSB7CisJCWdvdG8gZmFpbGVkOworCX0KKworCVNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisJLyogVGVsbCB0aGUgc3RhY2sgd2UgZXhpc3QgKi8KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJyZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBBdCB0aGlzIHBvaW50LCB0aGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmUocykgbmVlZHMgdG8gYmUKKwkgKiBpbml0aWFsaXplZCBhbmQgYXJyYW5nZWQgaW4gYSBsaW5rZWQgbGlzdCBhdCBsaW5rLT5kZXYuICovCisJc3RyY3B5KGNhcmQtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisJbGluay0+ZGV2ID0gJmNhcmQtPm5vZGU7IC8qIGxpbmstPmRldiBiZWluZyBub24tTlVMTCBpcyBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRfZGV2aWNlIGhhcyBiZWVuIHJlZ2lzdGVyZWQgKi8KKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworCisJLyogRmluYWxseSwgcmVwb3J0IHdoYXQgd2UndmUgZG9uZSAqLworCXByaW50ayhLRVJOX0RFQlVHICIlczogaW5kZXggMHglMDJ4OiBWY2MgJWQuJWQiLAorCSAgICAgICBkZXYtPm5hbWUsIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgsCisJICAgICAgIGxpbmstPmNvbmYuVmNjIC8gMTAsIGxpbmstPmNvbmYuVmNjICUgMTApOworCWlmIChsaW5rLT5jb25mLlZwcDEpCisJCXByaW50aygiLCBWcHAgJWQuJWQiLCBsaW5rLT5jb25mLlZwcDEgLyAxMCwKKwkJICAgICAgIGxpbmstPmNvbmYuVnBwMSAlIDEwKTsKKwlwcmludGsoIiwgaXJxICVkIiwgbGluay0+aXJxLkFzc2lnbmVkSVJRKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxKQorCQlwcmludGsoIiwgaW8gMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MSwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MSArIGxpbmstPmlvLk51bVBvcnRzMSAtIDEpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czIpCisJCXByaW50aygiICYgMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MiwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MiArIGxpbmstPmlvLk51bVBvcnRzMiAtIDEpOworCXByaW50aygiXG4iKTsKKworCXJldHVybjsKKworIGNzX2ZhaWxlZDoKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKKworIGZhaWxlZDoKKwlzcGVjdHJ1bV9jc19yZWxlYXNlKGxpbmspOworfQkJCQkvKiBzcGVjdHJ1bV9jc19jb25maWcgKi8KKworLyoKKyAqIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCBzcGVjdHJ1bV9jc19yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZQorICogZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgKiBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKyAqLworc3RhdGljIHZvaWQKK3NwZWN0cnVtX2NzX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogV2UncmUgY29tbWl0dGVkIHRvIHRha2luZyB0aGUgZGV2aWNlIGF3YXkgbm93LCBzbyBtYXJrIHRoZQorCSAqIGhhcmR3YXJlIGFzIHVuYXZhaWxhYmxlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlwcml2LT5od191bmF2YWlsYWJsZSsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIERvbid0IGJvdGhlciBjaGVja2luZyB0byBzZWUgaWYgdGhlc2Ugc3VjY2VlZCBvciBub3QgKi8KKwlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCWlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEpCisJCXBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworCWlmIChwcml2LT5ody5pb2Jhc2UpCisJCWlvcG9ydF91bm1hcChwcml2LT5ody5pb2Jhc2UpOworfQkJCQkvKiBzcGVjdHJ1bV9jc19yZWxlYXNlICovCisKKy8qCisgKiBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIgc3R1ZmYKKyAqIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4KKyAqLworc3RhdGljIGludAorc3BlY3RydW1fY3NfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICogYXJncykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJcHJpdi0+aHdfdW5hdmFpbGFibGUrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCQlzcGVjdHJ1bV9jc19jb25maWcobGluayk7CisJCWJyZWFrOworCisJY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkJLyogTWFyayB0aGUgZGV2aWNlIGFzIHN0b3BwZWQsIHRvIGJsb2NrIElPIHVudGlsIGxhdGVyICovCisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCS8qIFRoaXMgaXMgcHJvYmFibHkgcmFjeSwgYnV0IEkgY2FuJ3QgdGhpbmsgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgYmV0dGVyIHdheSwgc2hvcnQgb2YgcmV3cml0aW5nIHRoZSBQQ01DSUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyIHRvIG5vdCBzdWNrIDotKCAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCQkJZXJyID0gX19vcmlub2NvX2Rvd24oZGV2KTsKKwkJCWlmIChlcnIpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzOiBFcnJvciAlZCBkb3duaW5nIGludGVyZmFjZVxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLAorCQkJCSAgICAgICBldmVudCA9PSBDU19FVkVOVF9QTV9TVVNQRU5EID8gIlNVU1BFTkQiIDogIlJFU0VUX1BIWVNJQ0FMIiwKKwkJCQkgICAgICAgZXJyKTsKKworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJcHJpdi0+aHdfdW5hdmFpbGFibGUrKzsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCS8qIEZJWE1FOiBzaG91bGQgd2UgZG91YmxlIGNoZWNrIHRoYXQgdGhpcyBpcworCQkJICogdGhlIHNhbWUgY2FyZCBhcyB3ZSBoYWQgYmVmb3JlICovCisJCQlwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCQkJcHJpdi0+aHdfdW5hdmFpbGFibGUtLTsKKwkJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dvcmspOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CQkJCS8qIHNwZWN0cnVtX2NzX2V2ZW50ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vZHVsZSBpbml0aWFsaXphdGlvbgkJCQkJICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENhbid0IGJlIGRlY2xhcmVkICJjb25zdCIgb3IgdGhlIHdob2xlIF9faW5pdGRhdGEgc2VjdGlvbiB3aWxsCisgKiBiZWNvbWUgY29uc3QgKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gRFJJVkVSX05BTUUgIiAiIERSSVZFUl9WRVJTSU9OCisJIiAoUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4sIgorCSIgRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiwgZXQgYWwpIjsKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHNwZWN0cnVtX2NzX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI2YywgMHgwMDAxKSwgLyogU3ltYm9sIFNwZWN0cnVtMjQgTEE0MTAwICovCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTA0LCAweDAwMDEpLCAvKiBTb2NrZXQgQ29tbXVuaWNhdGlvbnMgQ0YgKi8KKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwODksIDB4MDAwMSksIC8qIEludGVsIFBSTy9XaXJlbGVzcyAyMDExQiAqLworCVBDTUNJQV9ERVZJQ0VfTlVMTCwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgc3BlY3RydW1fY3NfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIG9yaW5vY29fZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSBEUklWRVJfTkFNRSwKKwl9LAorCS5hdHRhY2gJCT0gc3BlY3RydW1fY3NfYXR0YWNoLAorCS5ldmVudAkJPSBzcGVjdHJ1bV9jc19ldmVudCwKKwkuZGV0YWNoCQk9IHNwZWN0cnVtX2NzX2RldGFjaCwKKwkuaWRfdGFibGUgICAgICAgPSBzcGVjdHJ1bV9jc19pZHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9zcGVjdHJ1bV9jcyh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgdmVyc2lvbik7CisKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmb3Jpbm9jb19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfc3BlY3RydW1fY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJm9yaW5vY29fZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfc3BlY3RydW1fY3MpOworbW9kdWxlX2V4aXQoZXhpdF9zcGVjdHJ1bV9jcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYwppbmRleCA2YzQyYjU3Li40YjBhY2FlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMKQEAgLTIwOSw3ICsyMDksNyBAQAogCU5vU3RydWN0dXJlID0gMCwJLyogUmVhbGx5IG9sZCBmaXJtd2FyZSAqLwogCVN0cnVjdHVyZWRNZXNzYWdlcyA9IDEsCS8qIFBhcnNhYmxlIEFUIHJlc3BvbnNlIG1zZ3MgKi8KIAlDaGVja3N1bW1lZE1lc3NhZ2VzID0gMgkvKiBQYXJzYWJsZSBBVCByZXNwb25zZSBtc2dzIHdpdGggY2hlY2tzdW1zICovCi19IEZpcm13YXJlTGV2ZWw7Cit9OwogCiBzdHJ1Y3Qgc3RyaXAgewogCWludCBtYWdpYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwppbmRleCBmNjEzMGE1Li4xODNjNDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCkBAIC01OSw2ICs1OSwxMiBAQAogLyogRG8gKk5PVCogYWRkIG90aGVyIGhlYWRlcnMgaGVyZSwgeW91IGFyZSBndWFyYW50ZWVkIHRvIGJlIHdyb25nIC0gSmVhbiBJSSAqLwogI2luY2x1ZGUgIndhdmVsYW5fY3MucC5oIgkJLyogUHJpdmF0ZSBoZWFkZXIgKi8KIAorI2lmZGVmIFdBVkVMQU5fUk9BTUlORworc3RhdGljIHZvaWQgd2xfY2VsbF9leHBpcnkodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHdsX2RlbF93YXZlcG9pbnQod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgc3RydWN0IG5ldF9sb2NhbCAqbHApOworc3RhdGljIHZvaWQgd3ZfbndpZF9maWx0ZXIodW5zaWduZWQgY2hhciBtb2RlLCBuZXRfbG9jYWwgKmxwKTsKKyNlbmRpZiAgLyogIFdBVkVMQU5fUk9BTUlORyAgKi8KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKiogTUlTQyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBTdWJyb3V0aW5lcyB3aGljaCB3b24ndCBmaXQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcnkKQEAgLTUwMCw5ICs1MDYsOSBAQAogCiAjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCS8qIENvbmRpdGlvbmFsIGNvbXBpbGUsIHNlZSB3YXZlbGFuX2NzLmggKi8KIAotdW5zaWduZWQgY2hhciBXQVZFTEFOX0JFQUNPTl9BRERSRVNTW109IHsweDA5LDB4MDAsMHgwZSwweDIwLDB4MDMsMHgwMH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBXQVZFTEFOX0JFQUNPTl9BRERSRVNTW10gPSB7MHgwOSwweDAwLDB4MGUsMHgyMCwweDAzLDB4MDB9OwogICAKLXZvaWQgd3Zfcm9hbV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCB3dl9yb2FtX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKICAgbmV0X2xvY2FsICAqbHA9IG5ldGRldl9wcml2KGRldik7CiAKQEAgLTUzMSw3ICs1MzcsNyBAQAogICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTjogUm9hbWluZyBlbmFibGVkIG9uIGRldmljZSAlc1xuIixkZXYtPm5hbWUpOwogfQogIAotdm9pZCB3dl9yb2FtX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHd2X3JvYW1fY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogICB3YXZlcG9pbnRfaGlzdG9yeSAqcHRyLCpvbGRfcHRyOwogICBuZXRfbG9jYWwgKmxwPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtNTUwLDcgKzU1Niw3IEBACiB9CiAKIC8qIEVuYWJsZS9EaXNhYmxlIE5XSUQgcHJvbWlzY3VvdXMgbW9kZSBvbiBhIGdpdmVuIGRldmljZSAqLwotdm9pZCB3dl9ud2lkX2ZpbHRlcih1bnNpZ25lZCBjaGFyIG1vZGUsIG5ldF9sb2NhbCAqbHApCitzdGF0aWMgdm9pZCB3dl9ud2lkX2ZpbHRlcih1bnNpZ25lZCBjaGFyIG1vZGUsIG5ldF9sb2NhbCAqbHApCiB7CiAgIG1tX3QgICAgICAgICAgICAgICAgICBtOwogICB1bnNpZ25lZCBsb25nICAgICAgICAgZmxhZ3M7CkBAIC01NzUsNyArNTgxLDcgQEAKIH0KIAogLyogRmluZCBhIHJlY29yZCBpbiB0aGUgV2F2ZVBvaW50IHRhYmxlIG1hdGNoaW5nIGEgZ2l2ZW4gTldJRCAqLwotd2F2ZXBvaW50X2hpc3RvcnkgKndsX3JvYW1fY2hlY2sodW5zaWduZWQgc2hvcnQgbndpZCwgbmV0X2xvY2FsICpscCkKK3N0YXRpYyB3YXZlcG9pbnRfaGlzdG9yeSAqd2xfcm9hbV9jaGVjayh1bnNpZ25lZCBzaG9ydCBud2lkLCBuZXRfbG9jYWwgKmxwKQogewogICB3YXZlcG9pbnRfaGlzdG9yeQkqcHRyPWxwLT53YXZlcG9pbnRfdGFibGUuaGVhZDsKICAgCkBAIC01ODgsNyArNTk0LDcgQEAKIH0KIAogLyogQ3JlYXRlIGEgbmV3IHdhdmVwb2ludCB0YWJsZSBlbnRyeSAqLwotd2F2ZXBvaW50X2hpc3RvcnkgKndsX25ld193YXZlcG9pbnQodW5zaWduZWQgc2hvcnQgbndpZCwgdW5zaWduZWQgY2hhciBzZXEsIG5ldF9sb2NhbCogbHApCitzdGF0aWMgd2F2ZXBvaW50X2hpc3RvcnkgKndsX25ld193YXZlcG9pbnQodW5zaWduZWQgc2hvcnQgbndpZCwgdW5zaWduZWQgY2hhciBzZXEsIG5ldF9sb2NhbCogbHApCiB7CiAgIHdhdmVwb2ludF9oaXN0b3J5ICpuZXdfd2F2ZXBvaW50OwogCkBAIC02MjQsNyArNjMwLDcgQEAKIH0KIAogLyogUmVtb3ZlIGEgd2F2ZXBvaW50IGVudHJ5IGZyb20gV2F2ZVBvaW50IHRhYmxlICovCi12b2lkIHdsX2RlbF93YXZlcG9pbnQod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgc3RydWN0IG5ldF9sb2NhbCAqbHApCitzdGF0aWMgdm9pZCB3bF9kZWxfd2F2ZXBvaW50KHdhdmVwb2ludF9oaXN0b3J5ICp3YXZlcG9pbnQsIHN0cnVjdCBuZXRfbG9jYWwgKmxwKQogewogICBpZih3YXZlcG9pbnQ9PU5VTEwpCiAgICAgcmV0dXJuOwpAQCAtNjQ2LDcgKzY1Miw3IEBACiB9CiAKIC8qIFRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIC0gY2hlY2tzIFdhdmVQb2ludCB0YWJsZSBmb3Igc3RhbGUgZW50cmllcyAqLyAKLXZvaWQgd2xfY2VsbF9leHBpcnkodW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIHZvaWQgd2xfY2VsbF9leHBpcnkodW5zaWduZWQgbG9uZyBkYXRhKQogewogICBuZXRfbG9jYWwgKmxwPShuZXRfbG9jYWwgKilkYXRhOwogICB3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50PWxwLT53YXZlcG9pbnRfdGFibGUuaGVhZCwqb2xkX3BvaW50OwpAQCAtNjg2LDcgKzY5Miw3IEBACiB9CiAKIC8qIFVwZGF0ZSBTTlIgaGlzdG9yeSBvZiBhIHdhdmVwb2ludCAqLwotdm9pZCB3bF91cGRhdGVfaGlzdG9yeSh3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCB1bnNpZ25lZCBjaGFyIHNpZ3F1YWwsIHVuc2lnbmVkIGNoYXIgc2VxKQkKK3N0YXRpYyB2b2lkIHdsX3VwZGF0ZV9oaXN0b3J5KHdhdmVwb2ludF9oaXN0b3J5ICp3YXZlcG9pbnQsIHVuc2lnbmVkIGNoYXIgc2lncXVhbCwgdW5zaWduZWQgY2hhciBzZXEpCQogewogICBpbnQgaT0wLG51bV9taXNzZWQ9MCxwdHI9MDsKICAgaW50IGF2ZXJhZ2VfZmFzdD0wLGF2ZXJhZ2Vfc2xvdz0wOwpAQCAtNzIzLDcgKzcyOSw3IEBACiB9CiAKIC8qIFBlcmZvcm0gYSBoYW5kb3ZlciB0byBhIG5ldyBXYXZlUG9pbnQgKi8KLXZvaWQgd3Zfcm9hbV9oYW5kb3Zlcih3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCBuZXRfbG9jYWwgKmxwKQorc3RhdGljIHZvaWQgd3Zfcm9hbV9oYW5kb3Zlcih3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCBuZXRfbG9jYWwgKmxwKQogewogICBraW9fYWRkcl90CQliYXNlID0gbHAtPmRldi0+YmFzZV9hZGRyOwogICBtbV90ICAgICAgICAgICAgICAgICAgbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuaAppbmRleCAyOWNmZjZkLi5mYWJjNjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5oCkBAIC02Miw3ICs2Miw3IEBACiAgKiBsaWtlIERFQyBSb2FtQWJvdXQsIG9yIERpZ2l0YWwgT2NlYW4sIEVwc29uLCAuLi4pLCB5b3UgbXVzdCBtb2RpZnkgdGhpcwogICogcGFydCB0byBhY2NvbW1vZGF0ZSB5b3VyIGhhcmR3YXJlLi4uCiAgKi8KLWNvbnN0IHVuc2lnbmVkIGNoYXIJTUFDX0FERFJFU1NFU1tdWzNdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyCU1BQ19BRERSRVNTRVNbXVszXSA9CiB7CiAgIHsgMHgwOCwgMHgwMCwgMHgwRSB9LAkJLyogQVQmVCBXYXZlbGFuIChzdGFuZGFyZCkgJiBERUMgUm9hbUFib3V0ICovCiAgIHsgMHgwOCwgMHgwMCwgMHg2QSB9LAkJLyogQVQmVCBXYXZlbGFuIChhbHRlcm5hdGUpICovCkBAIC03OSwxNCArNzksMTQgQEAKICAqIChhcyByZWFkIGluIHRoZSBvZmZzZXQgcmVnaXN0ZXIgb2YgdGhlIGRhYyBhcmVhKS4KICAqIFVzZWQgdG8gbWFwIGNoYW5uZWwgbnVtYmVycyB1c2VkIGJ5IGB3ZnJlcXNlbCcgdG8gZnJlcXVlbmNpZXMKICAqLwotY29uc3Qgc2hvcnQJY2hhbm5lbF9iYW5kc1tdID0geyAweDMwLCAweDU4LCAweDY0LCAweDdBLCAweDgwLCAweEE4LAorc3RhdGljIGNvbnN0IHNob3J0CWNoYW5uZWxfYmFuZHNbXSA9IHsgMHgzMCwgMHg1OCwgMHg2NCwgMHg3QSwgMHg4MCwgMHhBOCwKIAkJCQkgICAgMHhEMCwgMHhGMCwgMHhGOCwgMHgxNTAgfTsKIAogLyogRnJlcXVlbmNpZXMgb2YgdGhlIDEuMCBtb2RlbSAoZml4ZWQgZnJlcXVlbmNpZXMpLgogICogVXNlIHRvIG1hcCB0aGUgUFNBIGBzdWJiYW5kJyB0byBhIGZyZXF1ZW5jeQogICogTm90ZSA6IGFsbCBmcmVxdWVuY2llcyBhcGFydCBmcm9tIHRoZSBmaXJzdCBvbmUgbmVlZCB0byBiZSBtdWx0aXBsaWVkIGJ5IDEwCiAgKi8KLWNvbnN0IGludAlmaXhlZF9iYW5kc1tdID0geyA5MTVlNiwgMi40MjVlOCwgMi40NmU4LCAyLjQ4NGU4LCAyLjQzMDVlOCB9Oworc3RhdGljIGNvbnN0IGludAlmaXhlZF9iYW5kc1tdID0geyA5MTVlNiwgMi40MjVlOCwgMi40NmU4LCAyLjQ4NGU4LCAyLjQzMDVlOCB9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogUEMgSU5URVJGQUNFICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLnAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MucC5oCmluZGV4IDY3N2ZmNzEuLjAxZDg4MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MucC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MucC5oCkBAIC02NDcsMjMgKzY0Nyw2IEBACiAgIHZvaWQgX19pb21lbSAqbWVtOwogfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFJPVE9UWVBFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgV0FWRUxBTl9ST0FNSU5HCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJPQU1JTkcgU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi13YXZlcG9pbnRfaGlzdG9yeSAqd2xfcm9hbV9jaGVjayh1bnNpZ25lZCBzaG9ydCBud2lkLCBuZXRfbG9jYWwgKmxwKTsKLXdhdmVwb2ludF9oaXN0b3J5ICp3bF9uZXdfd2F2ZXBvaW50KHVuc2lnbmVkIHNob3J0IG53aWQsIHVuc2lnbmVkIGNoYXIgc2VxLCBuZXRfbG9jYWwgKmxwKTsKLXZvaWQgd2xfZGVsX3dhdmVwb2ludCh3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCBuZXRfbG9jYWwgKmxwKTsKLXZvaWQgd2xfY2VsbF9leHBpcnkodW5zaWduZWQgbG9uZyBkYXRhKTsKLXdhdmVwb2ludF9oaXN0b3J5ICp3bF9iZXN0X3NpZ3F1YWwoaW50IGZhc3Rfc2VhcmNoLCBuZXRfbG9jYWwgKmxwKTsKLXZvaWQgd2xfdXBkYXRlX2hpc3Rvcnkod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgdW5zaWduZWQgY2hhciBzaWdxdWFsLCB1bnNpZ25lZCBjaGFyIHNlcSk7Ci12b2lkIHd2X3JvYW1faGFuZG92ZXIod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgbmV0X2xvY2FsICpscCk7Ci12b2lkIHd2X253aWRfZmlsdGVyKHVuc2lnbmVkIGNoYXIgbW9kZSwgbmV0X2xvY2FsICpscCk7Ci12b2lkIHd2X3JvYW1faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgd3Zfcm9hbV9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLSBNT0RFTSBNQU5BR0VNRU5UIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgaW5saW5lIHVfY2hhcgkJLyogZGF0YSAqLwogCWhhc3JfcmVhZCh1X2xvbmcpOwkvKiBSZWFkIHRoZSBob3N0IGludGVyZmFjZSA6IGJhc2UgYWRkcmVzcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDEuaAppbmRleCA4NjM2ZDkzLi43ZmNiZTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDEuaApAQCAtMiw3ICsyLDcgQEAKICNkZWZpbmUgX19XTDM1MDFfSF9fCiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgImllZWU4MDJfMTEuaCIKKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CiAKIC8qIGRlZmluZSBmb3IgV0xBIDIuMCAqLwogI2RlZmluZSBXTDM1MDFfQkxLU1ogMjU2CkBAIC01NDgsNyArNTQ4LDcgQEAKIAogc3RydWN0IHdsMzUwMV84MDIxMV90eF9oZHIgewogCXN0cnVjdCB3bDM1MDFfODAyMTFfdHhfcGxjcF9oZHIJcGNscF9oZHI7Ci0Jc3RydWN0IGllZWU4MDJfMTFfaGRyCQltYWNfaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyCQltYWNfaGRyOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8qCkBAIC02MDksNiArNjA5LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAJc3RhdHM7CiAJc3RydWN0IGl3X3N0YXRpc3RpY3MJCXdzdGF0czsKIAlzdHJ1Y3QgaXdfc3B5X2RhdGEJCXNweV9kYXRhOworCXN0cnVjdCBpd19wdWJsaWNfZGF0YQkJd2lyZWxlc3NfZGF0YTsKIAlzdHJ1Y3QgZGV2X25vZGVfdAkJbm9kZTsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKaW5kZXggZGQ5MDIxMi4uM2Y4YzI3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKQEAgLTI5Niw3ICsyOTYsOCBAQAogICoKICAqIE1vdmUgJ3NpemUnIGJ5dGVzIGZyb20gUEMgdG8gY2FyZC4gKFNob3VsZG4ndCBiZSBpbnRlcnJ1cHRlZCkKICAqLwotdm9pZCB3bDM1MDFfc2V0X3RvX3dsYShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiBkZXN0LCB2b2lkICpzcmMsIGludCBzaXplKQorc3RhdGljIHZvaWQgd2wzNTAxX3NldF90b193bGEoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgZGVzdCwgdm9pZCAqc3JjLAorCQkJICAgICAgaW50IHNpemUpCiB7CiAJLyogc3dpdGNoIHRvIFNSQU0gUGFnZSAwICovCiAJd2wzNTAxX3N3aXRjaF9wYWdlKHRoaXMsIChkZXN0ICYgMHg4MDAwKSA/IFdMMzUwMV9CU1NfU1BBR0UxIDoKQEAgLTMxNyw4ICszMTgsOCBAQAogICoKICAqIE1vdmUgJ3NpemUnIGJ5dGVzIGZyb20gY2FyZCB0byBQQy4gKFNob3VsZG4ndCBiZSBpbnRlcnJ1cHRlZCkKICAqLwotdm9pZCB3bDM1MDFfZ2V0X2Zyb21fd2xhKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdTE2IHNyYywgdm9pZCAqZGVzdCwKLQkJCSBpbnQgc2l6ZSkKK3N0YXRpYyB2b2lkIHdsMzUwMV9nZXRfZnJvbV93bGEoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgc3JjLCB2b2lkICpkZXN0LAorCQkJCWludCBzaXplKQogewogCS8qIHN3aXRjaCB0byBTUkFNIFBhZ2UgMCAqLwogCXdsMzUwMV9zd2l0Y2hfcGFnZSh0aGlzLCAoc3JjICYgMHg4MDAwKSA/IFdMMzUwMV9CU1NfU1BBR0UxIDoKQEAgLTE0MzgsMTQgKzE0MzksMTQgQEAKIAlnb3RvIG91dDsKIH0KIAotc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKndsMzUwMV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqd2wzNTAxX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKIAogCXJldHVybiAmdGhpcy0+c3RhdHM7CiB9CiAKLXN0cnVjdCBpd19zdGF0aXN0aWNzICp3bDM1MDFfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKndsMzUwMV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CiAJc3RydWN0IGl3X3N0YXRpc3RpY3MgKndzdGF0cyA9ICZ0aGlzLT53c3RhdHM7CkBAIC0xOTQzLDcgKzE5NDQsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiB3bDM1MDFfaGFuZGxlcl9kZWYgPSB7CiAJLm51bV9zdGFuZGFyZAk9IHNpemVvZih3bDM1MDFfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCiAJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKil3bDM1MDFfaGFuZGxlciwKLQkuc3B5X29mZnNldAk9IG9mZnNldG9mKHN0cnVjdCB3bDM1MDFfY2FyZCwgc3B5X2RhdGEpLAorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSB3bDM1MDFfZ2V0X3dpcmVsZXNzX3N0YXRzLAogfTsKIAogLyoqCkBAIC0xOTYwLDYgKzE5NjEsNyBAQAogCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOwogCWRldl9saW5rX3QgKmxpbms7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXM7CiAJaW50IHJldDsKIAogCS8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCkBAIC0xOTk0LDcgKzE5OTYsOSBAQAogCWRldi0+dHhfdGltZW91dAkJPSB3bDM1MDFfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvCT0gNSAqIEhaOwogCWRldi0+Z2V0X3N0YXRzCQk9IHdsMzUwMV9nZXRfc3RhdHM7Ci0JZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSB3bDM1MDFfZ2V0X3dpcmVsZXNzX3N0YXRzOworCXRoaXMgPSBkZXYtPnByaXY7CisJdGhpcy0+d2lyZWxlc3NfZGF0YS5zcHlfZGF0YSA9ICZ0aGlzLT5zcHlfZGF0YTsKKwlkZXYtPndpcmVsZXNzX2RhdGEJPSAmdGhpcy0+d2lyZWxlc3NfZGF0YTsKIAlkZXYtPndpcmVsZXNzX2hhbmRsZXJzCT0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZ3bDM1MDFfaGFuZGxlcl9kZWY7CiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJm9wcyk7CiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jIGIvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jCmluZGV4IDkxZGYwYmYuLjdhNTdjMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2lvc2FwaWMuYworKysgYi9kcml2ZXJzL3BhcmlzYy9pb3NhcGljLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogI2RlZmluZSBJT1NBUElDX0lSRFRfSURfRUlEX1NISUZUICAgICAgICAgICAgICAweDEwCiAKIAotc3RhdGljIHNwaW5sb2NrX3QgaW9zYXBpY19sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhpb3NhcGljX2xvY2spOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW9zYXBpY19lb2kodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBpbnQgZGF0YSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2xhc2kuYyBiL2RyaXZlcnMvcGFyaXNjL2xhc2kuYwppbmRleCA3MzE4NTUwLi5jYjg0YTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9sYXNpLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvbGFzaS5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jIGIvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LmMKaW5kZXggNjk0YmFlMS4uNWI4ODdiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LmMKQEAgLTE5Niw3ICsxOTYsNyBAQAogCQlyZXR1cm4gMTsKIAogCS8qIDQwbXMgb2Ygc2xvdyBwb2xsaW5nLiAqLwotCWRlYWRsaW5lID0gamlmZmllcyArIChIWiArIDI0KSAvIDI1OworCWRlYWRsaW5lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNDApOwogCXdoaWxlICh0aW1lX2JlZm9yZSAoamlmZmllcywgZGVhZGxpbmUpKSB7CiAJCWludCByZXQ7CiAKQEAgLTIwNSw3ICsyMDUsNyBAQAogCiAJCS8qIFdhaXQgZm9yIDEwbXMgKG9yIHVudGlsIGFuIGludGVycnVwdCBvY2N1cnMgaWYKIAkJICogdGhlIGhhbmRsZXIgaXMgc2V0KSAqLwotCQlpZiAoKHJldCA9IHBhcnBvcnRfd2FpdF9ldmVudCAocG9ydCwgKEhaICsgOTkpIC8gMTAwKSkgPCAwKQorCQlpZiAoKHJldCA9IHBhcnBvcnRfd2FpdF9ldmVudCAocG9ydCwgbXNlY3NfdG9famlmZmllcygxMCkpKSA8IDApCiAJCQlyZXR1cm4gcmV0OwogCiAJCXN0YXR1cyA9IHBhcnBvcnRfcmVhZF9zdGF0dXMgKHBvcnQpOwpAQCAtMjE2LDggKzIxNiw3IEBACiAJCQkvKiBwYXJwb3J0X3dhaXRfZXZlbnQgZGlkbid0IHRpbWUgb3V0LCBidXQgdGhlCiAJCQkgKiBwZXJpcGhlcmFsIHdhc24ndCBhY3R1YWxseSByZWFkeSBlaXRoZXIuCiAJCQkgKiBXYWl0IGZvciBhbm90aGVyIDEwbXMuICovCi0JCQlfX3NldF9jdXJyZW50X3N0YXRlIChUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dCAoKEhaKyA5OSkgLyAxMDApOworCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0X29wcy5jIGIvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0X29wcy5jCmluZGV4IDY2MjQyNzguLmNlMWUyYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NF9vcHMuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODRfb3BzLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAlwYXJwb3J0X2RhdGFfZm9yd2FyZCAocG9ydCk7CiAJd2hpbGUgKGNvdW50IDwgbGVuKSB7CiAJCXVuc2lnbmVkIGxvbmcgZXhwaXJlID0gamlmZmllcyArIGRldi0+dGltZW91dDsKLQkJbG9uZyB3YWl0ID0gKEhaICsgOTkpIC8gMTAwOworCQlsb25nIHdhaXQgPSBtc2Vjc190b19qaWZmaWVzKDEwKTsKIAkJdW5zaWduZWQgY2hhciBtYXNrID0gKFBBUlBPUlRfU1RBVFVTX0VSUk9SCiAJCQkJICAgICAgfCBQQVJQT1JUX1NUQVRVU19CVVNZKTsKIAkJdW5zaWduZWQgY2hhciB2YWwgPSAoUEFSUE9SVF9TVEFUVVNfRVJST1IKQEAgLTk3LDggKzk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91ciBpbnRlcnJ1cHQgaGFuZGxlciBjYWxsZWQuICovCiAJCQlpZiAoY291bnQgJiYgbm9faXJxKSB7CiAJCQkJcGFycG9ydF9yZWxlYXNlIChkZXYpOwotCQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJc2NoZWR1bGVfdGltZW91dCAod2FpdCk7CisJCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHdhaXQpOwogCQkJCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2sgKGRldik7CiAJCQl9CiAJCQllbHNlCkBAIC01NDIsMTMgKzU0MSwxMiBAQAogCQkJLyogWWllbGQgdGhlIHBvcnQgZm9yIGEgd2hpbGUuICovCiAJCQlpZiAoY291bnQgJiYgZGV2LT5wb3J0LT5pcnEgIT0gUEFSUE9SVF9JUlFfTk9ORSkgewogCQkJCXBhcnBvcnRfcmVsZWFzZSAoZGV2KTsKLQkJCQlfX3NldF9jdXJyZW50X3N0YXRlIChUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCXNjaGVkdWxlX3RpbWVvdXQgKChIWiArIDI0KSAvIDI1KTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyg0MCkpOwogCQkJCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2sgKGRldik7CiAJCQl9CiAJCQllbHNlCiAJCQkJLyogV2UgbXVzdCBoYXZlIHRoZSBkZXZpY2UgY2xhaW1lZCBoZXJlLiAqLwotCQkJCXBhcnBvcnRfd2FpdF9ldmVudCAocG9ydCwgKEhaICsgMjQpIC8gMjUpOworCQkJCXBhcnBvcnRfd2FpdF9ldmVudCAocG9ydCwgbXNlY3NfdG9famlmZmllcyg0MCkpOwogCiAJCQkvKiBJcyB0aGVyZSBhIHNpZ25hbCBwZW5kaW5nPyAqLwogCQkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCmluZGV4IDQ1OThjNmEuLmM2NDkzYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYwpAQCAtMTczLDggKzE3Myw3IEBACiAJCQkJaWYgKHRpbWVfYWZ0ZXJfZXEgKGppZmZpZXMsIGV4cGlyZSkpCiAJCQkJCS8qIFRoZSBGSUZPIGlzIHN0dWNrLiAqLwogCQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJc2NoZWR1bGVfdGltZW91dCAoKEhaICsgOTkpIC8gMTAwKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxMCkpOwogCQkJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpCiAJCQkJCWJyZWFrOwogCQkJfQpAQCAtMjczOSw2ICsyNzM4LDcgQEAKIAlzeWJhXzJwX2VwcCwKIAlzeWJhXzFwX2VjcCwKIAl0aXRhbl8wMTBsLAorCXRpdGFuXzEyODRwMSwKIAl0aXRhbl8xMjg0cDIsCiAJYXZsYWJfMXAsCiAJYXZsYWJfMnAsCkBAIC0yODExLDYgKzI4MTEsNyBAQAogCS8qIHN5YmFfMnBfZXBwIEFQMTM4QiAqLwl7IDIsIHsgeyAwLCAweDA3OCB9LCB7IDAsIDB4MTc4IH0sIH0gfSwKIAkvKiBzeWJhXzFwX2VjcCBXODM3ODcgKi8JeyAxLCB7IHsgMCwgMHgwNzggfSwgfSB9LAogCS8qIHRpdGFuXzAxMGwgKi8JCXsgMSwgeyB7IDMsIC0xIH0sIH0gfSwKKwkvKiB0aXRhbl8xMjg0cDEgKi8gICAgICAgICAgICAgIHsgMSwgeyB7IDAsIDEgfSwgfSB9LAogCS8qIHRpdGFuXzEyODRwMiAqLwkJeyAyLCB7IHsgMCwgMSB9LCB7IDIsIDMgfSwgfSB9LAogCS8qIGF2bGFiXzFwCQkqLwl7IDEsIHsgeyAwLCAxfSwgfSB9LAogCS8qIGF2bGFiXzJwCQkqLwl7IDIsIHsgeyAwLCAxfSwgeyAyLCAzIH0sfSB9LApAQCAtMjg4NCw2ICsyODg1LDcgQEAKIAkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHN5YmFfMXBfZWNwIH0sCiAJeyBQQ0lfVkVORE9SX0lEX1RJVEFOLCBQQ0lfREVWSUNFX0lEX1RJVEFOXzAxMEwsCiAJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCB0aXRhbl8wMTBsIH0sCisJeyAweDk3MTAsIDB4OTgwNSwgMHgxMDAwLCAweDAwMTAsIDAsIDAsIHRpdGFuXzEyODRwMSB9LAogCXsgMHg5NzEwLCAweDk4MTUsIDB4MTAwMCwgMHgwMDIwLCAwLCAwLCB0aXRhbl8xMjg0cDIgfSwKIAkvKiBQQ0lfVkVORE9SX0lEX0FWTEFCL0ludGVrMjEgaGFzIGFub3RoZXIgYnVuY2ggb2YgY2FyZHMgLi4uKi8KIAl7IDB4MTRkYiwgMHgyMTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBhdmxhYl8xcH0sIC8qIEFGQVZMQUJfVEs5OTAyICovCkBAIC0zMDA3LDcgKzMwMDksNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKIAlpbnQgcmV0ID0gMDsKIAotCXdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwZGV2KSkgIT0gTlVMTCkgeworCWZvcl9lYWNoX3BjaV9kZXYocGRldikgewogCQlpZCA9IHBjaV9tYXRjaF9pZChwYXJwb3J0X3BjX3BjaV90YmwsIHBkZXYpOwogCQlpZiAoaWQgPT0gTlVMTCB8fCBpZC0+ZHJpdmVyX2RhdGEgPj0gbGFzdF9zaW8pCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL0tjb25maWcgYi9kcml2ZXJzL3BjaS9LY29uZmlnCmluZGV4IDdmMzE5OTEuLmYxODdmZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvS2NvbmZpZwpAQCAtMzAsMjMgKzMwLDYgQEAKIAogCSAgV2hlbiBpbiBkb3VidCwgc2F5IE4uCiAKLWNvbmZpZyBQQ0lfTkFNRVMKLQlib29sICJQQ0kgZGV2aWNlIG5hbWUgZGF0YWJhc2UiCi0JZGVwZW5kcyBvbiBQQ0kKLQktLS1oZWxwLS0tCi0JICBCeSBkZWZhdWx0LCB0aGUga2VybmVsIGNvbnRhaW5zIGEgZGF0YWJhc2Ugb2YgYWxsIGtub3duIFBDSSBkZXZpY2UKLQkgIG5hbWVzIHRvIG1ha2UgdGhlIGluZm9ybWF0aW9uIGluIC9wcm9jL3BjaSwgL3Byb2MvaW9wb3J0cyBhbmQKLQkgIHNpbWlsYXIgZmlsZXMgY29tcHJlaGVuc2libGUgdG8gdGhlIHVzZXIuIAotCi0JICBUaGlzIGRhdGFiYXNlIGluY3JlYXNlcyBzaXplIG9mIHRoZSBrZXJuZWwgaW1hZ2UgYnkgYWJvdXQgODBLQi4gVGhpcyAKLQkgIG1lbW9yeSBpcyBmcmVlZCBhZnRlciB0aGUgc3lzdGVtIGJvb3RzIHVwIGlmIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQuCi0KLQkgIEFueXdheSwgaWYgeW91IGFyZSBidWlsZGluZyBhbiBpbnN0YWxsYXRpb24gZmxvcHB5IG9yIGtlcm5lbCBmb3IgYW4gCi0JICBlbWJlZGRlZCBzeXN0ZW0gd2hlcmUga2VybmVsIGltYWdlIHNpemUgcmVhbGx5IG1hdHRlcnMsIHlvdSBjYW4gZGlzYWJsZSAKLQkgIHRoaXMgZmVhdHVyZSBhbmQgeW91J2xsIGdldCBkZXZpY2UgSUQgbnVtYmVycyBpbnN0ZWFkIG9mIG5hbWVzLgotCi0JICBXaGVuIGluIGRvdWJ0LCBzYXkgWS4KLQogY29uZmlnIFBDSV9ERUJVRwogCWJvb2wgIlBDSSBEZWJ1Z2dpbmciCiAJZGVwZW5kcyBvbiBQQ0kgJiYgREVCVUdfS0VSTkVMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IDM2NTdmNjEuLjcxNmRmMDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQpAQCAtMywxNCArMyw5IEBACiAjCiAKIG9iai15CQkrPSBhY2Nlc3MubyBidXMubyBwcm9iZS5vIHJlbW92ZS5vIHBjaS5vIHF1aXJrcy5vIFwKLQkJCW5hbWVzLm8gcGNpLWRyaXZlci5vIHNlYXJjaC5vIHBjaS1zeXNmcy5vIFwKLQkJCXJvbS5vCisJCQlwY2ktZHJpdmVyLm8gc2VhcmNoLm8gcGNpLXN5c2ZzLm8gcm9tLm8gc2V0dXAtcmVzLm8KIG9iai0kKENPTkZJR19QUk9DX0ZTKSArPSBwcm9jLm8KIAotaWZuZGVmIENPTkZJR19TUEFSQzY0Ci1vYmoteSArPSBzZXR1cC1yZXMubwotZW5kaWYKLQogb2JqLSQoQ09ORklHX0hPVFBMVUcpICs9IGhvdHBsdWcubwogCiAjIEJ1aWxkIHRoZSBQQ0kgSG90cGx1ZyBkcml2ZXJzIGlmIHdlIHdlcmUgYXNrZWQgdG8KQEAgLTQ2LDIxICs0MSw2IEBACiBFWFRSQV9DRkxBR1MgKz0gLURERUJVRwogZW5kaWYKIAotaG9zdHByb2dzLXkgOj0gZ2VuLWRldmxpc3QKLQotIyBEZXBlbmRlbmNpZXMgb24gZ2VuZXJhdGVkIGZpbGVzIG5lZWQgdG8gYmUgbGlzdGVkIGV4cGxpY2l0bHkKLSQob2JqKS9uYW1lcy5vOiAkKG9iaikvZGV2bGlzdC5oICQob2JqKS9jbGFzc2xpc3QuaAotJChvYmopL2NsYXNzbGlzdC5oOiAkKG9iaikvZGV2bGlzdC5oCi0KLSMgQW5kIHRoYXQncyBob3cgdG8gZ2VuZXJhdGUgdGhlbQotcXVpZXRfY21kX2Rldmxpc3QgPSBERVZMSVNUICRACi0gICAgICBjbWRfZGV2bGlzdCA9ICggY2QgJChvYmopOyAuL2dlbi1kZXZsaXN0ICkgPCAkPAotJChvYmopL2Rldmxpc3QuaDogJChzcmMpL3BjaS5pZHMgJChvYmopL2dlbi1kZXZsaXN0Ci0JJChjYWxsIGNtZCxkZXZsaXN0KQotCi0jIEZpbGVzIGdlbmVyYXRlZCB0aGF0IHNoYWxsIGJlIHJlbW92ZWQgdXBvbiBtYWtlIGNsZWFuCi1jbGVhbi1maWxlcyA6PSBkZXZsaXN0LmggY2xhc3NsaXN0LmgKLQogIyBCdWlsZCBQQ0kgRXhwcmVzcyBzdHVmZiBpZiBuZWVkZWQKIG9iai0kKENPTkZJR19QQ0lFUE9SVEJVUykgKz0gcGNpZS8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYnVzLmMgYi9kcml2ZXJzL3BjaS9idXMuYwppbmRleCBmYjlhMTEyLi5lZWQ2N2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9idXMuYworKysgYi9kcml2ZXJzL3BjaS9idXMuYwpAQCAtMTQwLDE2ICsxNDAsNjUgQEAKIHZvaWQgcGNpX2VuYWJsZV9icmlkZ2VzKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgcmV0dmFsOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCWlmIChkZXYtPnN1Ym9yZGluYXRlKSB7Ci0JCQlwY2lfZW5hYmxlX2RldmljZShkZXYpOworCQkJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKIAkJCXBjaV9zZXRfbWFzdGVyKGRldik7CiAJCQlwY2lfZW5hYmxlX2JyaWRnZXMoZGV2LT5zdWJvcmRpbmF0ZSk7CiAJCX0KIAl9CiB9CiAKKy8qKiBwY2lfd2Fsa19idXMgLSB3YWxrIGRldmljZXMgb24vdW5kZXIgYnVzLCBjYWxsaW5nIGNhbGxiYWNrLgorICogIEB0b3AgICAgICBidXMgd2hvc2UgZGV2aWNlcyBzaG91bGQgYmUgd2Fsa2VkCisgKiAgQGNiICAgICAgIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBkZXZpY2UgZm91bmQKKyAqICBAdXNlcmRhdGEgYXJiaXRyYXJ5IHBvaW50ZXIgdG8gYmUgcGFzc2VkIHRvIGNhbGxiYWNrLgorICoKKyAqICBXYWxrIHRoZSBnaXZlbiBidXMsIGluY2x1ZGluZyBhbnkgYnJpZGdlZCBkZXZpY2VzCisgKiAgb24gYnVzZXMgdW5kZXIgdGhpcyBidXMuICBDYWxsIHRoZSBwcm92aWRlZCBjYWxsYmFjaworICogIG9uIGVhY2ggZGV2aWNlIGZvdW5kLgorICovCit2b2lkIHBjaV93YWxrX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqdG9wLCB2b2lkICgqY2IpKHN0cnVjdCBwY2lfZGV2ICosIHZvaWQgKiksCisJCSAgdm9pZCAqdXNlcmRhdGEpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisKKwlidXMgPSB0b3A7CisJc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOworCW5leHQgPSB0b3AtPmRldmljZXMubmV4dDsKKwlmb3IgKDs7KSB7CisJCWlmIChuZXh0ID09ICZidXMtPmRldmljZXMpIHsKKwkJCS8qIGVuZCBvZiB0aGlzIGJ1cywgZ28gdXAgb3IgZmluaXNoICovCisJCQlpZiAoYnVzID09IHRvcCkKKwkJCQlicmVhazsKKwkJCW5leHQgPSBidXMtPnNlbGYtPmJ1c19saXN0Lm5leHQ7CisJCQlidXMgPSBidXMtPnNlbGYtPmJ1czsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRldiA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHBjaV9kZXYsIGJ1c19saXN0KTsKKwkJcGNpX2Rldl9nZXQoZGV2KTsKKwkJaWYgKGRldi0+c3Vib3JkaW5hdGUpIHsKKwkJCS8qIHRoaXMgaXMgYSBwY2ktcGNpIGJyaWRnZSwgZG8gaXRzIGRldmljZXMgbmV4dCAqLworCQkJbmV4dCA9IGRldi0+c3Vib3JkaW5hdGUtPmRldmljZXMubmV4dDsKKwkJCWJ1cyA9IGRldi0+c3Vib3JkaW5hdGU7CisJCX0gZWxzZQorCQkJbmV4dCA9IGRldi0+YnVzX2xpc3QubmV4dDsKKwkJc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CisKKwkJLyogUnVuIGRldmljZSByb3V0aW5lcyB3aXRoIHRoZSBidXMgdW5sb2NrZWQgKi8KKwkJY2IoZGV2LCB1c2VyZGF0YSk7CisKKwkJc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOworCQlwY2lfZGV2X3B1dChkZXYpOworCX0KKwlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV93YWxrX2J1cyk7CisKIEVYUE9SVF9TWU1CT0wocGNpX2J1c19hbGxvY19yZXNvdXJjZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfYnVzX2FkZF9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTChwY2lfYnVzX2FkZF9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2dlbi1kZXZsaXN0LmMgYi9kcml2ZXJzL3BjaS9nZW4tZGV2bGlzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWJmYzQ5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcGNpL2dlbi1kZXZsaXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqCUdlbmVyYXRlIGRldmxpc3QuaCBhbmQgY2xhc3NsaXN0LmggZnJvbSB0aGUgUENJIElEIGZpbGUuCi0gKgotICoJKGMpIDE5OTktLTIwMDIgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+Ci0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTUFYX05BTUVfU0laRSAyMDAKLQotc3RhdGljIHZvaWQKLXBxKEZJTEUgKmYsIGNvbnN0IGNoYXIgKmMsIGludCBsZW4pCi17Ci0JaW50IGkgPSAxOwotCXdoaWxlICgqYyAmJiBpICE9IGxlbikgewotCQlpZiAoKmMgPT0gJyInKQotCQkJZnByaW50ZihmLCAiXFxcIiIpOwotCQllbHNlIHsKLQkJCWZwdXRjKCpjLCBmKTsKLQkJCWlmICgqYyA9PSAnPycgJiYgY1sxXSA9PSAnPycpIHsKLQkJCQkvKiBBdm9pZCB0cmlncmFwaHMgKi8KLQkJCQlmcHJpbnRmKGYsICJcIiBcIiIpOwotCQkJfQotCQl9Ci0JCWMrKzsKLQkJaSsrOwotCX0KLX0KLQotaW50Ci1tYWluKHZvaWQpCi17Ci0JY2hhciBsaW5lWzEwMjRdLCAqYywgKmJyYSwgdmVuZFs4XTsKLQlpbnQgdmVuZG9ycyA9IDA7Ci0JaW50IG1vZGUgPSAwOwotCWludCBsaW5vID0gMDsKLQlpbnQgdmVuZG9yX2xlbiA9IDA7Ci0JRklMRSAqZGV2ZiwgKmNsc2Y7Ci0KLQlkZXZmID0gZm9wZW4oImRldmxpc3QuaCIsICJ3Iik7Ci0JY2xzZiA9IGZvcGVuKCJjbGFzc2xpc3QuaCIsICJ3Iik7Ci0JaWYgKCFkZXZmIHx8ICFjbHNmKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZSFcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLTEsIHN0ZGluKSkgewotCQlsaW5vKys7Ci0JCWlmICgoYyA9IHN0cmNocihsaW5lLCAnXG4nKSkpCi0JCQkqYyA9IDA7Ci0JCWlmICghbGluZVswXSB8fCBsaW5lWzBdID09ICcjJykKLQkJCWNvbnRpbnVlOwotCQlpZiAobGluZVsxXSA9PSAnICcpIHsKLQkJCWlmIChsaW5lWzBdID09ICdDJyAmJiBzdHJsZW4obGluZSkgPiA0ICYmIGxpbmVbNF0gPT0gJyAnKSB7Ci0JCQkJdmVuZFswXSA9IGxpbmVbMl07Ci0JCQkJdmVuZFsxXSA9IGxpbmVbM107Ci0JCQkJdmVuZFsyXSA9IDA7Ci0JCQkJbW9kZSA9IDI7Ci0JCQl9IGVsc2UgZ290byBlcnI7Ci0JCX0KLQkJZWxzZSBpZiAobGluZVswXSA9PSAnXHQnKSB7Ci0JCQlpZiAobGluZVsxXSA9PSAnXHQnKQotCQkJCWNvbnRpbnVlOwotCQkJc3dpdGNoIChtb2RlKSB7Ci0JCQljYXNlIDE6Ci0JCQkJaWYgKHN0cmxlbihsaW5lKSA+IDUgJiYgbGluZVs1XSA9PSAnICcpIHsKLQkJCQkJYyA9IGxpbmUgKyA1OwotCQkJCQl3aGlsZSAoKmMgPT0gJyAnKQotCQkJCQkJKmMrKyA9IDA7Ci0JCQkJCWlmICh2ZW5kb3JfbGVuICsgc3RybGVuKGMpICsgMSA+IE1BWF9OQU1FX1NJWkUpIHsKLQkJCQkJCS8qIFRvbyBsb25nLCB0cnkgY3V0dGluZyBvZmYgbG9uZyBkZXNjcmlwdGlvbiAqLwotCQkJCQkJYnJhID0gc3RyY2hyKGMsICdbJyk7Ci0JCQkJCQlpZiAoYnJhICYmIGJyYSA+IGMgJiYgYnJhWy0xXSA9PSAnICcpCi0JCQkJCQkJYnJhWy0xXSA9IDA7Ci0JCQkJCQlpZiAodmVuZG9yX2xlbiArIHN0cmxlbihjKSArIDEgPiBNQVhfTkFNRV9TSVpFKSB7Ci0JCQkJCQkJZnByaW50ZihzdGRlcnIsICJMaW5lICVkOiBEZXZpY2UgbmFtZSB0b28gbG9uZy4gTmFtZSB0cnVuY2F0ZWQuXG4iLCBsaW5vKTsKLQkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBjKTsKLQkJCQkJCQkvKnJldHVybiAxOyovCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZnByaW50ZihkZXZmLCAiXHRERVZJQ0UoJXMsJXMsXCIiLCB2ZW5kLCBsaW5lKzEpOwotCQkJCQlwcShkZXZmLCBjLCBNQVhfTkFNRV9TSVpFIC0gdmVuZG9yX2xlbiAtIDEpOwotCQkJCQlmcHV0cygiXCIpXG4iLCBkZXZmKTsKLQkJCQl9IGVsc2UgZ290byBlcnI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJaWYgKHN0cmxlbihsaW5lKSA+IDMgJiYgbGluZVszXSA9PSAnICcpIHsKLQkJCQkJYyA9IGxpbmUgKyAzOwotCQkJCQl3aGlsZSAoKmMgPT0gJyAnKQotCQkJCQkJKmMrKyA9IDA7Ci0JCQkJCWZwcmludGYoY2xzZiwgIkNMQVNTKCVzJXMsIFwiJXNcIilcbiIsIHZlbmQsIGxpbmUrMSwgYyk7Ci0JCQkJfSBlbHNlIGdvdG8gZXJyOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJfSBlbHNlIGlmIChzdHJsZW4obGluZSkgPiA0ICYmIGxpbmVbNF0gPT0gJyAnKSB7Ci0JCQljID0gbGluZSArIDQ7Ci0JCQl3aGlsZSAoKmMgPT0gJyAnKQotCQkJCSpjKysgPSAwOwotCQkJaWYgKHZlbmRvcnMpCi0JCQkJZnB1dHMoIkVORFZFTkRPUigpXG5cbiIsIGRldmYpOwotCQkJdmVuZG9ycysrOwotCQkJc3RyY3B5KHZlbmQsIGxpbmUpOwotCQkJdmVuZG9yX2xlbiA9IHN0cmxlbihjKTsKLQkJCWlmICh2ZW5kb3JfbGVuICsgMjQgPiBNQVhfTkFNRV9TSVpFKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJMaW5lICVkOiBWZW5kb3IgbmFtZSB0b28gbG9uZ1xuIiwgbGlubyk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlmcHJpbnRmKGRldmYsICJWRU5ET1IoJXMsXCIiLCB2ZW5kKTsKLQkJCXBxKGRldmYsIGMsIDApOwotCQkJZnB1dHMoIlwiKVxuIiwgZGV2Zik7Ci0JCQltb2RlID0gMTsKLQkJfSBlbHNlIHsKLQkJZXJyOgotCQkJZnByaW50ZihzdGRlcnIsICJMaW5lICVkOiBTeW50YXggZXJyb3IgaW4gbW9kZSAlZDogJXNcbiIsIGxpbm8sIG1vZGUsIGxpbmUpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JZnB1dHMoIkVORFZFTkRPUigpXG5cCi1cblwKLSN1bmRlZiBWRU5ET1JcblwKLSN1bmRlZiBERVZJQ0VcblwKLSN1bmRlZiBFTkRWRU5ET1JcbiIsIGRldmYpOwotCWZwdXRzKCJcbiN1bmRlZiBDTEFTU1xuIiwgY2xzZik7Ci0KLQlmY2xvc2UoZGV2Zik7Ci0JZmNsb3NlKGNsc2YpOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnLmMKaW5kZXggYjg0NGJjOS4uMTA0NDQ5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcuYwpAQCAtMjAsNDYgKzIwLDM1IEBACiAKIAlzY3JhdGNoID0gYnVmZmVyOwogCi0JLyogc3R1ZmYgd2Ugd2FudCB0byBwYXNzIHRvIC9zYmluL2hvdHBsdWcgKi8KLQllbnZwW2krK10gPSBzY3JhdGNoOwotCWxlbmd0aCArPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplIC0gbGVuZ3RoLCAiUENJX0NMQVNTPSUwNFgiLAotCQkJICAgIHBkZXYtPmNsYXNzKTsKLQlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JKytsZW5ndGg7Ci0Jc2NyYXRjaCArPSBsZW5ndGg7CiAKLQllbnZwW2krK10gPSBzY3JhdGNoOwotCWxlbmd0aCArPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplIC0gbGVuZ3RoLCAiUENJX0lEPSUwNFg6JTA0WCIsCi0JCQkgICAgcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UpOwotCWlmICgoYnVmZmVyX3NpemUgLSBsZW5ndGggPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQotCQlyZXR1cm4gLUVOT01FTTsKLQkrK2xlbmd0aDsKLQlzY3JhdGNoICs9IGxlbmd0aDsKLQotCWVudnBbaSsrXSA9IHNjcmF0Y2g7Ci0JbGVuZ3RoICs9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUgLSBsZW5ndGgsCi0JCQkgICAgIlBDSV9TVUJTWVNfSUQ9JTA0WDolMDRYIiwgcGRldi0+c3Vic3lzdGVtX3ZlbmRvciwKLQkJCSAgICBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKLQlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JKytsZW5ndGg7Ci0Jc2NyYXRjaCArPSBsZW5ndGg7Ci0KLQllbnZwW2krK10gPSBzY3JhdGNoOwotCWxlbmd0aCArPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplIC0gbGVuZ3RoLCAiUENJX1NMT1RfTkFNRT0lcyIsCi0JCQkgICAgcGNpX25hbWUocGRldikpOwotCWlmICgoYnVmZmVyX3NpemUgLSBsZW5ndGggPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQorCWlmIChhZGRfaG90cGx1Z19lbnZfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQlidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJCSJQQ0lfQ0xBU1M9JTA0WCIsIHBkZXYtPmNsYXNzKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQllbnZwW2krK10gPSBzY3JhdGNoOwotCWxlbmd0aCArPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplIC0gbGVuZ3RoLAotCQkJICAgICJNT0RBTElBUz1wY2k6diUwOFhkJTA4WHN2JTA4WHNkJTA4WGJjJTAyWHNjJTAyWGklMDJ4IiwKLQkJCSAgICBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKLQkJCSAgICBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlLAotCQkJICAgICh1OCkocGRldi0+Y2xhc3MgPj4gMTYpLCAodTgpKHBkZXYtPmNsYXNzID4+IDgpLAotCQkJICAgICh1OCkocGRldi0+Y2xhc3MpKTsKLQlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwlpZiAoYWRkX2hvdHBsdWdfZW52X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCisJCQkJYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJCQkiUENJX0lEPSUwNFg6JTA0WCIsIHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYWRkX2hvdHBsdWdfZW52X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCisJCQkJYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJCQkiUENJX1NVQlNZU19JRD0lMDRYOiUwNFgiLCBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLAorCQkJCXBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfaG90cGx1Z19lbnZfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQlidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJCSJQQ0lfU0xPVF9OQU1FPSVzIiwgcGNpX25hbWUocGRldikpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfaG90cGx1Z19lbnZfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQlidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJCSJNT0RBTElBUz1wY2k6diUwOFhkJTA4WHN2JTA4WHNkJTA4WGJjJTAyWHNjJTAyWGklMDJ4IiwKKwkJCQlwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKKwkJCQlwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlLAorCQkJCSh1OCkocGRldi0+Y2xhc3MgPj4gMTYpLCAodTgpKHBkZXYtPmNsYXNzID4+IDgpLAorCQkJCSh1OCkocGRldi0+Y2xhc3MpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAllbnZwW2ldID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvS2NvbmZpZyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvS2NvbmZpZwppbmRleCA5YzRhMzllLi4yZjEyODllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnCkBAIC03OCw3ICs3OCw3IEBACiAKIGNvbmZpZyBIT1RQTFVHX1BDSV9BQ1BJCiAJdHJpc3RhdGUgIkFDUEkgUENJIEhvdHBsdWcgZHJpdmVyIgotCWRlcGVuZHMgb24gQUNQSV9CVVMgJiYgSE9UUExVR19QQ0kKKwlkZXBlbmRzIG9uIEFDUEkgJiYgSE9UUExVR19QQ0kKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgc3lzdGVtIHRoYXQgc3VwcG9ydHMgUENJIEhvdHBsdWcgdXNpbmcKIAkgIEFDUEkuCkBAIC0xNTcsNyArMTU3LDcgQEAKIAogY29uZmlnIEhPVFBMVUdfUENJX1NIUENfUEhQUk1fTEVHQUNZCiAJYm9vbCAiRm9yIEFNRCBTSFBDIG9ubHk6IFVzZSAkSFJUIGZvciByZXNvdXJjZS9jb25maWd1cmF0aW9uIgotCWRlcGVuZHMgb24gSE9UUExVR19QQ0lfU0hQQyAmJiAhQUNQSV9CVVMgCisJZGVwZW5kcyBvbiBIT1RQTFVHX1BDSV9TSFBDICYmICFBQ1BJIAogCWhlbHAKIAkgIFNheSBZIGhlcmUgZm9yIEFNRCBTSFBDLiBZb3UgaGF2ZSB0byBzZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGFyZSAKIAkgIHVzaW5nIHRoaXMgZHJpdmVyIG9uIHBsYXRmb3JtIHdpdGggQU1EIFNIUEMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9NYWtlZmlsZQppbmRleCAzMWEzMDcwLi4zYzcxZTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvTWFrZWZpbGUKQEAgLTQxLDggKzQxLDcgQEAKIAogcnBhcGhwLW9ianMJCTo9CXJwYXBocF9jb3JlLm8JXAogCQkJCXJwYXBocF9wY2kubwlcCi0JCQkJcnBhcGhwX3Nsb3QubwlcCi0JCQkJcnBhcGhwX3Zpby5vCisJCQkJcnBhcGhwX3Nsb3QubwogCiBycGFkbHBhcl9pby1vYmpzCTo9CXJwYWRscGFyX2NvcmUubyBcCiAJCQkJcnBhZGxwYXJfc3lzZnMubwpAQCAtNTEsNyArNTAsNyBAQAogCQkJCXBjaWVocF9jdHJsLm8JXAogCQkJCXBjaWVocF9wY2kubwlcCiAJCQkJcGNpZWhwX2hwYy5vCi1pZmRlZiBDT05GSUdfQUNQSV9CVVMKK2lmZGVmIENPTkZJR19BQ1BJCiAJcGNpZWhwLW9ianMgKz0gcGNpZWhwcm1fYWNwaS5vCiBlbHNlCiAJcGNpZWhwLW9ianMgKz0gcGNpZWhwcm1fbm9uYWNwaS5vCkBAIC02Miw3ICs2MSw3IEBACiAJCQkJc2hwY2hwX3BjaS5vCVwKIAkJCQlzaHBjaHBfc3lzZnMubwlcCiAJCQkJc2hwY2hwX2hwYy5vCi1pZmRlZiBDT05GSUdfQUNQSV9CVVMKK2lmZGVmIENPTkZJR19BQ1BJCiAJc2hwY2hwLW9ianMgKz0gc2hwY2hwcm1fYWNwaS5vCiBlbHNlCiAJaWZkZWYgQ09ORklHX0hPVFBMVUdfUENJX1NIUENfUEhQUk1fTEVHQUNZCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaAppbmRleCAyYjkyYjllLi4wNjFlYWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKQEAgLTMwMiw3ICszMDIsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWFrZV9zbG90X25hbWUoY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUsIHN0cnVjdCBzbG90ICpzbG90KQogewotCXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlZCIsIHNsb3QtPm51bWJlcik7CisJc25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIiUwNGRfJTA0ZCIsIHNsb3QtPmJ1cywgc2xvdC0+bnVtYmVyKTsKIH0KIAogZW51bSBwaHBfY3Rscl90eXBlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwcm1fYWNwaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBybV9hY3BpLmMKaW5kZXggMzA1YjQ3ZS4uMTQwNmRiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBybV9hY3BpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBybV9hY3BpLmMKQEAgLTE2OTYsMTUgKzE2OTYsMTUgQEAKIAlwY2lfYnVzLT5udW1iZXIgPSBmdW5jLT5idXM7CiAJZGV2Zm4gPSBQQ0lfREVWRk4oZnVuYy0+ZGV2aWNlLCBmdW5jLT5mdW5jdGlvbik7CiAKLQlyYyA9IHBjaV9idXNfcmVhZF9jb25maWdfd29yZChwY2lfYnVzLCBkZXZmbiwgUENJX0NPTU1BTkQsICZjb21tYW5kKTsKKwlyYyA9IHBjaV9idXNfcmVhZF9jb25maWdfd29yZChwY2lfYnVzLCBkZXZmbiwgUENJX0NPTU1BTkQsICZjbWQpOwogCiAJaWYgKGNhcmRfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSB7Ci0JCXJjID0gcGNpX2J1c19yZWFkX2NvbmZpZ193b3JkKHBjaV9idXMsIGRldmZuLCBQQ0lfQlJJREdFX0NPTlRST0wsICZiY29tbWFuZCk7CisJCXJjID0gcGNpX2J1c19yZWFkX2NvbmZpZ193b3JkKHBjaV9idXMsIGRldmZuLCBQQ0lfQlJJREdFX0NPTlRST0wsICZiY21kKTsKIAl9CiAKLQljbWQgPSBjb21tYW5kICA9IGNvbW1hbmQgfCBQQ0lfQ09NTUFORF9NQVNURVIgfCBQQ0lfQ09NTUFORF9JTlZBTElEQVRFCisJY29tbWFuZCAgPSBjbWQgfCBQQ0lfQ09NTUFORF9NQVNURVIgfCBQQ0lfQ09NTUFORF9JTlZBTElEQVRFCiAJCXwgUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU1PUlk7Ci0JYmNtZCA9IGJjb21tYW5kICA9IGJjb21tYW5kIHwgUENJX0JSSURHRV9DVExfTk9fSVNBOworCWJjb21tYW5kICA9IGJjbWQgfCBQQ0lfQlJJREdFX0NUTF9OT19JU0E7CiAKIAlhYiA9IGZpbmRfYWNwaV9icmlkZ2VfYnlfYnVzKGFjcGlfYnJpZGdlc19oZWFkLCBjdHJsLT5zZWcsIGN0cmwtPmJ1cyk7CiAJaWYgKGFiKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jCmluZGV4IDg2YjM4NGUuLmFkMTAxN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jCkBAIC0xOSwzMyArMTksMzYgQEAKICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vcnRhcy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KICNpbmNsdWRlICIuLi9wY2kuaCIKICNpbmNsdWRlICJycGFwaHAuaCIKICNpbmNsdWRlICJycGFkbHBhci5oIgogCiBzdGF0aWMgREVDTEFSRV9NVVRFWChycGFkbHBhcl9zZW0pOwogCisjZGVmaW5lIERMUEFSX01PRFVMRV9OQU1FICJycGFkbHBhcl9pbyIKKwogI2RlZmluZSBOT0RFX1RZUEVfVklPICAxCiAjZGVmaW5lIE5PREVfVFlQRV9TTE9UIDIKICNkZWZpbmUgTk9ERV9UWVBFX1BIQiAgMwogCi1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpmaW5kX3BocF9zbG90X3Zpb19ub2RlKGNoYXIgKmRyY19uYW1lKQorc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZmluZF92aW9fc2xvdF9ub2RlKGNoYXIgKmRyY19uYW1lKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7CiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidmRldmljZSIpOwotCWNoYXIgKmxvY19jb2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBOVUxMOworCWNoYXIgKm5hbWU7CisJaW50IHJjOwogCiAJaWYgKCFwYXJlbnQpCiAJCXJldHVybiBOVUxMOwogCi0JZm9yIChjaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKHBhcmVudCwgTlVMTCk7Ci0JCWNoaWxkOyBjaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKHBhcmVudCwgY2hpbGQpKSB7Ci0JCWxvY19jb2RlID0gZ2V0X3Byb3BlcnR5KGNoaWxkLCAiaWJtLGxvYy1jb2RlIiwgTlVMTCk7Ci0JCWlmIChsb2NfY29kZSAmJiAhc3RybmNtcChsb2NfY29kZSwgZHJjX25hbWUsIHN0cmxlbihkcmNfbmFtZSkpKQotCQkJcmV0dXJuIGNoaWxkOworCXdoaWxlICgoZG4gPSBvZl9nZXRfbmV4dF9jaGlsZChwYXJlbnQsIGRuKSkpIHsKKwkJcmMgPSBycGFwaHBfZ2V0X2RyY19wcm9wcyhkbiwgTlVMTCwgJm5hbWUsIE5VTEwsIE5VTEwpOworCQlpZiAoKHJjID09IDApICYmICghc3RyY21wKGRyY19uYW1lLCBuYW1lKSkpCisJCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gZG47CiB9CiAKIC8qIEZpbmQgZGxwYXItY2FwYWJsZSBwY2kgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdHlwZSAqLwpAQCAtNjcsNyArNzAsNyBAQAogCXJldHVybiBucDsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZmluZF9uZXdseV9hZGRlZF9ub2RlKGNoYXIgKmRyY19uYW1lLCBpbnQgKm5vZGVfdHlwZSkKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmZpbmRfZGxwYXJfbm9kZShjaGFyICpkcmNfbmFtZSwgaW50ICpub2RlX3R5cGUpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbjsKIApAQCAtODMsNyArODYsNyBAQAogCQlyZXR1cm4gZG47CiAJfQogCi0JZG4gPSBmaW5kX3BocF9zbG90X3Zpb19ub2RlKGRyY19uYW1lKTsKKwlkbiA9IGZpbmRfdmlvX3Nsb3Rfbm9kZShkcmNfbmFtZSk7CiAJaWYgKGRuKSB7CiAJCSpub2RlX3R5cGUgPSBOT0RFX1RZUEVfVklPOwogCQlyZXR1cm4gZG47CkBAIC05MiwxNCArOTUsMTQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbG90ICpmaW5kX3Nsb3QoY2hhciAqZHJjX25hbWUpCitzdGF0aWMgc3RydWN0IHNsb3QgKmZpbmRfc2xvdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKm47CiAJc3RydWN0IHNsb3QgKnNsb3Q7CiAKICAgICAgICAgbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgbiwgJnJwYXBocF9zbG90X2hlYWQpIHsKICAgICAgICAgICAgICAgICBzbG90ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBzbG90LCBycGFwaHBfc2xvdF9saXN0KTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHNsb3QtPmxvY2F0aW9uLCBkcmNfbmFtZSkgPT0gMCkKKyAgICAgICAgICAgICAgICBpZiAoc2xvdC0+ZG4gPT0gZG4pCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvdDsKICAgICAgICAgfQogCkBAIC0xMzEsNyArMTM0LDggQEAKIHN0YXRpYyBpbnQgcGNpX2FkZF9zZWNvbmRhcnlfYnVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sCiAJCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfZGV2KQogewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGRuLT5waGI7CisJc3RydWN0IHBjaV9kbiAqcGRuID0gZG4tPmRhdGE7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGRuLT5waGI7CiAJc3RydWN0IHBjaV9idXMgKmNoaWxkOwogCXU4IHNlY19idXNubzsKIApAQCAtMTU2LDcgKzE2MCw3IEBACiAJaWYgKGhvc2UtPmxhc3RfYnVzbm8gPCBjaGlsZC0+bnVtYmVyKQogCQlob3NlLT5sYXN0X2J1c25vID0gY2hpbGQtPm51bWJlcjsKIAotCWRuLT5idXNzdWJubyA9IGNoaWxkLT5udW1iZXI7CisJcGRuLT5idXNzdWJubyA9IGNoaWxkLT5udW1iZXI7CiAKIAkvKiBpb3JlbWFwKCkgZm9yIGNoaWxkIGJ1cywgd2hpY2ggbWF5IG9yIG1heSBub3Qgc3VjY2VlZCAqLwogCXJlbWFwX2J1c19yYW5nZShjaGlsZCk7CkBAIC0xNjQsMTMgKzE2OCwyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmRscGFyX2ZpbmRfbmV3X2RldihzdHJ1Y3QgcGNpX2J1cyAqcGFyZW50LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldl9kbikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqdG1wID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkX2RuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZwYXJlbnQtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCWNoaWxkX2RuID0gcGNpX2RldmljZV90b19PRl9ub2RlKHRtcCk7CisJCWlmIChjaGlsZF9kbiA9PSBkZXZfZG4pCisJCQlyZXR1cm4gdG1wOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpkbHBhcl9wY2lfYWRkX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQogewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGRuLT5waGI7CisJc3RydWN0IHBjaV9kbiAqcGRuID0gZG4tPmRhdGE7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGRuLT5waGI7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CiAKIAkvKiBTY2FuIHBoYiBidXMgZm9yIEVBRFMgZGV2aWNlLCBhZGRpbmcgbmV3IG9uZSB0byBidXMtPmRldmljZXMgKi8KLQlpZiAoIXBjaV9zY2FuX3NpbmdsZV9kZXZpY2UoaG9zZS0+YnVzLCBkbi0+ZGV2Zm4pKSB7CisJaWYgKCFwY2lfc2Nhbl9zaW5nbGVfZGV2aWNlKGhvc2UtPmJ1cywgcGRuLT5kZXZmbikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZm91bmQgbm8gZGV2aWNlIG9uIGJ1c1xuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTc5LDQ5ICsxOTgsMjggQEAKIAlwY2lfYnVzX2FkZF9kZXZpY2VzKGhvc2UtPmJ1cyk7CiAKIAkvKiBDb25maXJtIG5ldyBicmlkZ2UgZGV2IHdhcyBjcmVhdGVkICovCi0JZGV2ID0gcnBhcGhwX2ZpbmRfcGNpX2Rldihkbik7Ci0JaWYgKCFkZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFkZCBwY2kgZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9CisJZGV2ID0gZGxwYXJfZmluZF9uZXdfZGV2KGhvc2UtPmJ1cywgZG4pOworCWlmIChkZXYpIHsKKwkJaWYgKGRldi0+aGRyX3R5cGUgIT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5leHBlY3RlZCBoZWFkZXIgdHlwZSAlZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGRldi0+aGRyX3R5cGUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAotCWlmIChkZXYtPmhkcl90eXBlICE9IFBDSV9IRUFERVJfVFlQRV9CUklER0UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5leHBlY3RlZCBoZWFkZXIgdHlwZSAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgZGV2LT5oZHJfdHlwZSk7Ci0JCXJldHVybiBOVUxMOworCQlpZiAocGNpX2FkZF9zZWNvbmRhcnlfYnVzKGRuLCBkZXYpKQorCQkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKHBjaV9hZGRfc2Vjb25kYXJ5X2J1cyhkbiwgZGV2KSkKLQkJcmV0dXJuIE5VTEw7Ci0KIAlyZXR1cm4gZGV2OwogfQogCi1zdGF0aWMgaW50IGRscGFyX3BjaV9yZW1vdmVfYnVzKHN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfZGV2KQotewotCXN0cnVjdCBwY2lfYnVzICpzZWNvbmRhcnlfYnVzOwotCi0JaWYgKCFicmlkZ2VfZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuZXhwZWN0ZWQgbnVsbCBkZXZpY2VcbiIsCi0JCQlfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzZWNvbmRhcnlfYnVzID0gYnJpZGdlX2Rldi0+c3Vib3JkaW5hdGU7Ci0KLQlpZiAodW5tYXBfYnVzX3JhbmdlKHNlY29uZGFyeV9idXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byB1bm1hcCBidXMgcmFuZ2VcbiIsCi0JCQlfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVSQU5HRTsKLQl9Ci0KLQlwY2lfcmVtb3ZlX2J1c19kZXZpY2UoYnJpZGdlX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRscGFyX2FkZF9wY2lfc2xvdChjaGFyICpkcmNfbmFtZSwgc3RydWN0IGRldmljZV9ub2RlICpkbikKK3N0YXRpYyBpbnQgZGxwYXJfYWRkX3BjaV9zbG90KGNoYXIgKmRyY19uYW1lLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJaW50IHJjOworCisJaWYgKHJwYXBocF9maW5kX3BjaV9idXMoZG4pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEFkZCBwY2kgYnVzICovCiAJZGV2ID0gZGxwYXJfcGNpX2FkZF9idXMoZG4pOwpAQCAtMjMxLDYgKzIyOSwyMSBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKKwlpZiAoZG4tPmNoaWxkKSB7CisJCXJjID0gcnBhcGhwX2NvbmZpZ19wY2lfYWRhcHRlcihkZXYtPnN1Ym9yZGluYXRlKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGVuYWJsZSBzbG90ICVzXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZHJjX25hbWUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwkvKiBBZGQgaG90cGx1ZyBzbG90ICovCisJaWYgKHJwYXBocF9hZGRfc2xvdChkbikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGFkZCBob3RwbHVnIHNsb3QgJXNcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGRyY19uYW1lKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXJldHVybiAwOwogfQogCkBAIC0yNTUsNDcgKzI2OCw2OSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRscGFyX3JlbW92ZV9waGIoc3RydWN0IHNsb3QgKnNsb3QpCitzdGF0aWMgaW50IGRscGFyX3JlbW92ZV9waGIoY2hhciAqZHJjX25hbWUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCiB7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwlzdHJ1Y3Qgc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgcGNpX2RuICpwZG47CiAJaW50IHJjID0gMDsKIAotCWRuID0gc2xvdC0+ZG47Ci0JaWYgKCFkbikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmV4cGVjdGVkIE5VTEwgc2xvdCBkZXZpY2Ugbm9kZVxuIiwKLQkJCQlfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVJTzsKKwlpZiAoIXJwYXBocF9maW5kX3BjaV9idXMoZG4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNsb3QgPSBmaW5kX3Nsb3QoZG4pOworCWlmIChzbG90KSB7CisJCS8qIFJlbW92ZSBob3RwbHVnIHNsb3QgKi8KKwkJaWYgKHJwYXBocF9yZW1vdmVfc2xvdChzbG90KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJIiVzOiB1bmFibGUgdG8gcmVtb3ZlIGhvdHBsdWcgc2xvdCAlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGRyY19uYW1lKTsKKwkJCXJldHVybiAtRUlPOworCQl9CiAJfQogCi0JcGhiID0gZG4tPnBoYjsKLQlpZiAoIXBoYikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmV4cGVjdGVkIE5VTEwgcGhiIHBvaW50ZXJcbiIsCi0JCQkJX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKHJwYXBocF9yZW1vdmVfc2xvdChzbG90KSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVtb3ZlIGhvdHBsdWcgc2xvdCAlc1xuIiwKLQkJCV9fRlVOQ1RJT05fXywgc2xvdC0+bG9jYXRpb24pOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyYyA9IGRscGFyX3JlbW92ZV9yb290X2J1cyhwaGIpOworCXBkbiA9IGRuLT5kYXRhOworCUJVR19PTighcGRuIHx8ICFwZG4tPnBoYik7CisJcmMgPSBkbHBhcl9yZW1vdmVfcm9vdF9idXMocGRuLT5waGIpOwogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAorCXBkbi0+cGhiID0gTlVMTDsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRscGFyX2FkZF9waGIoc3RydWN0IGRldmljZV9ub2RlICpkbikKK3N0YXRpYyBpbnQgZGxwYXJfYWRkX3BoYihjaGFyICpkcmNfbmFtZSwgc3RydWN0IGRldmljZV9ub2RlICpkbikKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKIAorCWlmIChQQ0lfRE4oZG4pLT5waGIpIHsKKwkJLyogUEhCIGFscmVhZHkgZXhpc3RzICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXBoYiA9IGluaXRfcGhiX2R5bmFtaWMoZG4pOwogCWlmICghcGhiKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChycGFwaHBfYWRkX3Nsb3QoZG4pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBhZGQgaG90cGx1ZyBzbG90ICVzXG4iLAorCQkJX19GVU5DVElPTl9fLCBkcmNfbmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbHBhcl9hZGRfdmlvX3Nsb3QoY2hhciAqZHJjX25hbWUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCit7CisJaWYgKHZpb19maW5kX25vZGUoZG4pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICghdmlvX3JlZ2lzdGVyX2RldmljZV9ub2RlKGRuKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIHZpbyBub2RlICVzXG4iLAorCQkJX19GVU5DVElPTl9fLCBkcmNfbmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzE2LDE4ICszNTEsMTMgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gTlVMTDsKIAlpbnQgbm9kZV90eXBlOwotCWludCByYyA9IDA7CisJaW50IHJjID0gLUVJTzsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJnJwYWRscGFyX3NlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKLQkvKiBDaGVjayBmb3IgZXhpc3RpbmcgaG90cGx1ZyBzbG90ICovCi0JaWYgKGZpbmRfc2xvdChkcmNfbmFtZSkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JZG4gPSBmaW5kX25ld2x5X2FkZGVkX25vZGUoZHJjX25hbWUsICZub2RlX3R5cGUpOworCS8qIEZpbmQgbmV3bHkgYWRkZWQgbm9kZSAqLworCWRuID0gZmluZF9kbHBhcl9ub2RlKGRyY19uYW1lLCAmbm9kZV90eXBlKTsKIAlpZiAoIWRuKSB7CiAJCXJjID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwpAQCAtMzM1LDI0ICszNjUsMTcgQEAKIAogCXN3aXRjaCAobm9kZV90eXBlKSB7CiAJCWNhc2UgTk9ERV9UWVBFX1ZJTzoKLQkJCS8qIEp1c3QgYWRkIGhvdHBsdWcgc2xvdCAqLworCQkJcmMgPSBkbHBhcl9hZGRfdmlvX3Nsb3QoZHJjX25hbWUsIGRuKTsKIAkJCWJyZWFrOwogCQljYXNlIE5PREVfVFlQRV9TTE9UOgogCQkJcmMgPSBkbHBhcl9hZGRfcGNpX3Nsb3QoZHJjX25hbWUsIGRuKTsKIAkJCWJyZWFrOwogCQljYXNlIE5PREVfVFlQRV9QSEI6Ci0JCQlyYyA9IGRscGFyX2FkZF9waGIoZG4pOworCQkJcmMgPSBkbHBhcl9hZGRfcGhiKGRyY19uYW1lLCBkbik7CiAJCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50aygiJXM6IHVuZXhwZWN0ZWQgbm9kZSB0eXBlXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuIC1FSU87CiAJfQogCi0JaWYgKCFyYyAmJiBycGFwaHBfYWRkX3Nsb3QoZG4pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBhZGQgaG90cGx1ZyBzbG90ICVzXG4iLAotCQkJX19GVU5DVElPTl9fLCBkcmNfbmFtZSk7Ci0JCXJjID0gLUVJTzsKLQl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNsb3QgJXMgYWRkZWRcbiIsIERMUEFSX01PRFVMRV9OQU1FLCBkcmNfbmFtZSk7CiBleGl0OgogCXVwKCZycGFkbHBhcl9zZW0pOwogCXJldHVybiByYzsKQEAgLTM2NiwxNyArMzg5LDE3IEBACiAgKiBvZiBhbiBJL08gU2xvdC4KICAqIFJldHVybiBDb2RlczoKICAqIDAJCQlTdWNjZXNzCi0gKiAtRUlPCQkJSW50ZXJuYWwgIEVycm9yCisgKiAtRUlOVkFMCQlWaW8gZGV2IGRvZXNuJ3QgZXhpc3QKICAqLwotaW50IGRscGFyX3JlbW92ZV92aW9fc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCwgY2hhciAqZHJjX25hbWUpCitzdGF0aWMgaW50IGRscGFyX3JlbW92ZV92aW9fc2xvdChjaGFyICpkcmNfbmFtZSwgc3RydWN0IGRldmljZV9ub2RlICpkbikKIHsKLQkvKiBSZW1vdmUgaG90cGx1ZyBzbG90ICovCisJc3RydWN0IHZpb19kZXYgKnZpb19kZXY7CiAKLQlpZiAocnBhcGhwX3JlbW92ZV9zbG90KHNsb3QpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byByZW1vdmUgaG90cGx1ZyBzbG90ICVzXG4iLAotCQkJX19GVU5DVElPTl9fLCBkcmNfbmFtZSk7Ci0JCXJldHVybiAtRUlPOwotCX0KKwl2aW9fZGV2ID0gdmlvX2ZpbmRfbm9kZShkbik7CisJaWYgKCF2aW9fZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZpb191bnJlZ2lzdGVyX2RldmljZSh2aW9fZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzkxLDMxICs0MTQsMzQgQEAKICAqIC1FTk9ERVYJCU5vdCBhIHZhbGlkIGRyY19uYW1lCiAgKiAtRUlPCQkJSW50ZXJuYWwgUENJIEVycm9yCiAgKi8KLWludCBkbHBhcl9yZW1vdmVfcGNpX3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QsIGNoYXIgKmRyY19uYW1lKQoraW50IGRscGFyX3JlbW92ZV9wY2lfc2xvdChjaGFyICpkcmNfbmFtZSwgc3RydWN0IGRldmljZV9ub2RlICpkbikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlX2RldjsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCXN0cnVjdCBzbG90ICpzbG90OwogCi0JYnJpZGdlX2RldiA9IHNsb3QtPmJyaWRnZTsKLQlpZiAoIWJyaWRnZV9kZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5leHBlY3RlZCBudWxsIGJyaWRnZSBkZXZpY2VcbiIsCisJYnVzID0gcnBhcGhwX2ZpbmRfcGNpX2J1cyhkbik7CisJaWYgKCFidXMpCisJCXJldHVybiAtRUlOVkFMOworCisJc2xvdCA9IGZpbmRfc2xvdChkbik7CisJaWYgKHNsb3QpIHsKKwkJLyogUmVtb3ZlIGhvdHBsdWcgc2xvdCAqLworCQlpZiAocnBhcGhwX3JlbW92ZV9zbG90KHNsb3QpKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiJXM6IHVuYWJsZSB0byByZW1vdmUgaG90cGx1ZyBzbG90ICVzXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZHJjX25hbWUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlpZiAodW5tYXBfYnVzX3JhbmdlKGJ1cykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHVubWFwIGJ1cyByYW5nZVxuIiwKIAkJCV9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gLUVSQU5HRTsKIAl9CiAKLQkvKiBSZW1vdmUgaG90cGx1ZyBzbG90ICovCi0JaWYgKHJwYXBocF9yZW1vdmVfc2xvdChzbG90KSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVtb3ZlIGhvdHBsdWcgc2xvdCAlc1xuIiwKLQkJCV9fRlVOQ1RJT05fXywgZHJjX25hbWUpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBSZW1vdmUgcGNpIGJ1cyAqLwotCi0JaWYgKGRscGFyX3BjaV9yZW1vdmVfYnVzKGJyaWRnZV9kZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byByZW1vdmUgcGNpIGJ1cyAlc1xuIiwKLQkJCV9fRlVOQ1RJT05fXywgZHJjX25hbWUpOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJQlVHX09OKCFidXMtPnNlbGYpOworCXBjaV9yZW1vdmVfYnVzX2RldmljZShidXMtPnNlbGYpOwogCXJldHVybiAwOwogfQogCkBAIC00MzQsMzggKzQ2MCwzMSBAQAogICovCiBpbnQgZGxwYXJfcmVtb3ZlX3Nsb3QoY2hhciAqZHJjX25hbWUpCiB7Ci0Jc3RydWN0IHNsb3QgKnNsb3Q7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwlpbnQgbm9kZV90eXBlOwogCWludCByYyA9IDA7CiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZycGFkbHBhcl9zZW0pKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCi0JaWYgKCFmaW5kX3BocF9zbG90X3Zpb19ub2RlKGRyY19uYW1lKSAmJgotCSAgICAhZmluZF9waHBfc2xvdF9wY2lfbm9kZShkcmNfbmFtZSwgIlNMT1QiKSAmJgotCSAgICAhZmluZF9waHBfc2xvdF9wY2lfbm9kZShkcmNfbmFtZSwgIlBIQiIpKSB7CisJZG4gPSBmaW5kX2RscGFyX25vZGUoZHJjX25hbWUsICZub2RlX3R5cGUpOworCWlmICghZG4pIHsKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0Jc2xvdCA9IGZpbmRfc2xvdChkcmNfbmFtZSk7Ci0JaWYgKCFzbG90KSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBleGl0OworCXN3aXRjaCAobm9kZV90eXBlKSB7CisJCWNhc2UgTk9ERV9UWVBFX1ZJTzoKKwkJCXJjID0gZGxwYXJfcmVtb3ZlX3Zpb19zbG90KGRyY19uYW1lLCBkbik7CisJCQlicmVhazsKKwkJY2FzZSBOT0RFX1RZUEVfUEhCOgorCQkJcmMgPSBkbHBhcl9yZW1vdmVfcGhiKGRyY19uYW1lLCBkbik7CisJCQlicmVhazsKKwkJY2FzZSBOT0RFX1RZUEVfU0xPVDoKKwkJCXJjID0gZGxwYXJfcmVtb3ZlX3BjaV9zbG90KGRyY19uYW1lLCBkbik7CisJCQlicmVhazsKIAl9Ci0JCi0JaWYgKHNsb3QtPnR5cGUgPT0gUEhCKSB7Ci0JCXJjID0gZGxwYXJfcmVtb3ZlX3BoYihzbG90KTsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKHNsb3QtPmRldl90eXBlKSB7Ci0JCQljYXNlIFBDSV9ERVY6Ci0JCQkJcmMgPSBkbHBhcl9yZW1vdmVfcGNpX3Nsb3Qoc2xvdCwgZHJjX25hbWUpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFZJT19ERVY6Ci0JCQkJcmMgPSBkbHBhcl9yZW1vdmVfdmlvX3Nsb3Qoc2xvdCwgZHJjX25hbWUpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBzbG90ICVzIHJlbW92ZWRcbiIsIERMUEFSX01PRFVMRV9OQU1FLCBkcmNfbmFtZSk7CiBleGl0OgogCXVwKCZycGFkbHBhcl9zZW0pOwogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocC5oCmluZGV4IDgxNzQ2ZTYuLjYxZDk0ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHAuaApAQCAtMzAsMTAgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgogCi0jZGVmaW5lCVBIQiAgICAgMgotI2RlZmluZQlIT1RQTFVHCTEKLSNkZWZpbmUJRU1CRURERUQgMAotCiAjZGVmaW5lIERSX0lORElDQVRPUiA5MDAyCiAjZGVmaW5lIERSX0VOVElUWV9TRU5TRSA5MDAzCiAKQEAgLTYxLDEwICs1Nyw2IEBACiAjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gIiVzOiAiIGZvcm1hdCwgTVlfTkFNRSAsICMjIGFyZykKICNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICIgZm9ybWF0LCBNWV9OQU1FICwgIyMgYXJnKQogCi0vKiBzbG90IHR5cGVzICovCi0jZGVmaW5lIFZJT19ERVYJMQotI2RlZmluZSBQQ0lfREVWCTIKLQogLyogc2xvdCBzdGF0ZXMgKi8KIAogI2RlZmluZQlOT1RfVkFMSUQJMwpAQCAtNzIsMTEgKzY0LDYgQEAKICNkZWZpbmUJQ09ORklHVVJFRAkxCiAjZGVmaW5lCUVNUFRZCQkwCiAKLXN0cnVjdCBycGFwaHBfcGNpX2Z1bmMgewotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgc2libGluZzsKLX07Ci0KIC8qCiAgKiBzdHJ1Y3Qgc2xvdCAtIHNsb3QgaW5mb3JtYXRpb24gZm9yIGVhY2ggKnBoeXNpY2FsKiBzbG90CiAgKi8KQEAgLTg4LDE1ICs3NSw5IEBACiAJdTMyIHBvd2VyX2RvbWFpbjsKIAljaGFyICpuYW1lOwogCWNoYXIgKmxvY2F0aW9uOwotCXU4IHJlbW92YWJsZTsKLQl1OCBkZXZfdHlwZTsJCS8qIFZJTyBvciBQQ0kgKi8KLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwkvKiBzbG90J3MgZGV2aWNlX25vZGUgaW4gT0ZEVCAqLwotCQkJCS8qIGRuIGhhcyBwaGIgaW5mbyAqLwotCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7CS8qIHNsb3QncyBwY2lfZGV2IGluIHBjaV9kZXZpY2VzICovCi0JdW5pb24gewotCQlzdHJ1Y3QgbGlzdF9oZWFkICpwY2lfZGV2czsgLyogcGNpX2RldnMgaW4gUENJIHNsb3QgKi8KLQkJc3RydWN0IHZpb19kZXYgKnZpb19kZXY7IC8qIHZpb19kZXYgaW4gVklPIHNsb3QgKi8KLQl9IGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCXN0cnVjdCBwY2lfYnVzICpidXM7CisJc3RydWN0IGxpc3RfaGVhZCAqcGNpX2RldnM7CiAJc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90OwogfTsKIApAQCAtMTA3LDEzICs4OCwxMyBAQAogLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLwogCiAvKiBycGFwaHBfcGNpLmMgKi8KLWV4dGVybiBzdHJ1Y3QgcGNpX2RldiAqcnBhcGhwX2ZpbmRfcGNpX2RldihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKK2V4dGVybiBzdHJ1Y3QgcGNpX2J1cyAqcnBhcGhwX2ZpbmRfcGNpX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKIGV4dGVybiBpbnQgcnBhcGhwX2NsYWltX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCByZXNvdXJjZSk7CiBleHRlcm4gaW50IHJwYXBocF9lbmFibGVfcGNpX3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9wY2lfc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCk7CiBleHRlcm4gaW50IHJwYXBocF91bmNvbmZpZ19wY2lfYWRhcHRlcihzdHJ1Y3Qgc2xvdCAqc2xvdCk7CiBleHRlcm4gaW50IHJwYXBocF9nZXRfcGNpX2FkYXB0ZXJfc3RhdHVzKHN0cnVjdCBzbG90ICpzbG90LCBpbnQgaXNfaW5pdCwgdTggKiB2YWx1ZSk7Ci1leHRlcm4gc3RydWN0IGhvdHBsdWdfc2xvdCAqcnBhcGhwX2ZpbmRfaG90cGx1Z19zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIGludCBycGFwaHBfY29uZmlnX3BjaV9hZGFwdGVyKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCiAvKiBycGFwaHBfY29yZS5jICovCiBleHRlcm4gaW50IHJwYXBocF9hZGRfc2xvdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKQEAgLTEyMSwxMiArMTAyLDYgQEAKIGV4dGVybiBpbnQgcnBhcGhwX2dldF9kcmNfcHJvcHMoc3RydWN0IGRldmljZV9ub2RlICpkbiwgaW50ICpkcmNfaW5kZXgsCiAJCWNoYXIgKipkcmNfbmFtZSwgY2hhciAqKmRyY190eXBlLCBpbnQgKmRyY19wb3dlcl9kb21haW4pOwogCi0vKiBycGFwaHBfdmlvLmMgKi8KLWV4dGVybiBpbnQgcnBhcGhwX2dldF92aW9fYWRhcHRlcl9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIGludCBpc19pbml0LCB1OCAqIHZhbHVlKTsKLWV4dGVybiBpbnQgcnBhcGhwX3VuY29uZmlnX3Zpb19hZGFwdGVyKHN0cnVjdCBzbG90ICpzbG90KTsKLWV4dGVybiBpbnQgcmVnaXN0ZXJfdmlvX3Nsb3Qoc3RydWN0IGRldmljZV9ub2RlICpkbik7Ci1leHRlcm4gaW50IHJwYXBocF9lbmFibGVfdmlvX3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QpOwotCiAvKiBycGFwaHBfc2xvdC5jICovCiBleHRlcm4gdm9pZCBkZWFsbG9jX3Nsb3Rfc3RydWN0KHN0cnVjdCBzbG90ICpzbG90KTsKIGV4dGVybiBzdHJ1Y3Qgc2xvdCAqYWxsb2Nfc2xvdF9zdHJ1Y3Qoc3RydWN0IGRldmljZV9ub2RlICpkbiwgaW50IGRyY19pbmRleCwgY2hhciAqZHJjX25hbWUsIGludCBwb3dlcl9kb21haW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfY29yZS5jCmluZGV4IDI5MTE3YTMuLmM4MzBmZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9jb3JlLmMKQEAgLTE1MiwxNyArMTUyLDcgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAogCWRvd24oJnJwYXBocF9zZW0pOwotCS8qICBoYXZlIHRvIGdvIHRocm91Z2ggdGhpcyAqLwotCXN3aXRjaCAoc2xvdC0+ZGV2X3R5cGUpIHsKLQljYXNlIFBDSV9ERVY6Ci0JCXJldHZhbCA9IHJwYXBocF9nZXRfcGNpX2FkYXB0ZXJfc3RhdHVzKHNsb3QsIDAsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBWSU9fREVWOgotCQlyZXR2YWwgPSBycGFwaHBfZ2V0X3Zpb19hZGFwdGVyX3N0YXR1cyhzbG90LCAwLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JfQorCXJldHZhbCA9IHJwYXBocF9nZXRfcGNpX2FkYXB0ZXJfc3RhdHVzKHNsb3QsIDAsIHZhbHVlKTsKIAl1cCgmcnBhcGhwX3NlbSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTMxNywzNCArMzA3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpc19kcl9kbihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCBpbnQgKippbmRleGVzLCBpbnQgKipuYW1lcywKLQkJaW50ICoqdHlwZXMsIGludCAqKnBvd2VyX2RvbWFpbnMsIGludCAqKm15X2RyY19pbmRleCkKLXsKLQlpbnQgcmM7Ci0KLQkqbXlfZHJjX2luZGV4ID0gKGludCAqKSBnZXRfcHJvcGVydHkoZG4sICJpYm0sbXktZHJjLWluZGV4IiwgTlVMTCk7Ci0JaWYoISpteV9kcmNfaW5kZXgpCi0JCXJldHVybiAoMCk7Ci0KLQlpZiAoIWRuLT5wYXJlbnQpCi0JCXJldHVybiAoMCk7Ci0KLQlyYyA9IGdldF9jaGlsZHJlbl9wcm9wcyhkbi0+cGFyZW50LCBpbmRleGVzLCBuYW1lcywgdHlwZXMsCi0JCQkJcG93ZXJfZG9tYWlucyk7Ci0JcmV0dXJuIChyYyA+PSAwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXNfdmRldmljZV9yb290KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCi17Ci0JcmV0dXJuICFzdHJjbXAoZG4tPm5hbWUsICJ2ZGV2aWNlIik7Ci19Ci0KLWludCBpc19kbHBhcl90eXBlKGNvbnN0IGNoYXIgKnR5cGVfc3RyKQotewotCS8qIE9ubHkgcmVnaXN0ZXIgRExQQVItY2FwYWJsZSBub2RlcyBvZiBkcmMtdHlwZSBQSEIgb3IgU0xPVCAqLwotCXJldHVybiAoIXN0cmNtcCh0eXBlX3N0ciwgIlBIQiIpIHx8ICFzdHJjbXAodHlwZV9zdHIsICJTTE9UIikpOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJcnBhcGhwIG5vdCBvbmx5IHJlZ2lzdGVycyBQQ0kgaG90cGx1ZyBzbG90cyhIT1RQTFVHKSwgCiAgKglidXQgYWxzbyBsb2dpY2FsIERSIHNsb3RzKEVNQkVEREVEKS4KQEAgLTM1Niw1NCArMzE4LDMzIEBACiB7CiAJc3RydWN0IHNsb3QgKnNsb3Q7CiAJaW50IHJldHZhbCA9IDA7Ci0JaW50IGksICpteV9kcmNfaW5kZXgsIHNsb3RfdHlwZTsKKwlpbnQgaTsKIAlpbnQgKmluZGV4ZXMsICpuYW1lcywgKnR5cGVzLCAqcG93ZXJfZG9tYWluczsKIAljaGFyICpuYW1lLCAqdHlwZTsKIAogCWRiZygiRW50cnkgJXM6IGRuLT5mdWxsX25hbWU9JXNcbiIsIF9fRlVOQ1RJT05fXywgZG4tPmZ1bGxfbmFtZSk7CiAKLQlpZiAoZG4tPnBhcmVudCAmJiBpc192ZGV2aWNlX3Jvb3QoZG4tPnBhcmVudCkpIHsKLQkJLyogcmVnaXN0ZXIgYSBWSU8gZGV2aWNlICovCi0JCXJldHZhbCA9IHJlZ2lzdGVyX3Zpb19zbG90KGRuKTsKLQkJZ290byBleGl0OwotCX0KLQogCS8qIHJlZ2lzdGVyIFBDSSBkZXZpY2VzICovCiAJaWYgKGRuLT5uYW1lICE9IDAgJiYgc3RyY21wKGRuLT5uYW1lLCAicGNpIikgPT0gMCkgewotCQlpZiAoaXNfcGhwX2RuKGRuLCAmaW5kZXhlcywgJm5hbWVzLCAmdHlwZXMsICZwb3dlcl9kb21haW5zKSkgIAotCQkJc2xvdF90eXBlID0gSE9UUExVRzsKLQkJZWxzZSBpZiAoaXNfZHJfZG4oZG4sICZpbmRleGVzLCAmbmFtZXMsICZ0eXBlcywgJnBvd2VyX2RvbWFpbnMsICZteV9kcmNfaW5kZXgpKSAKLQkJCXNsb3RfdHlwZSA9IEVNQkVEREVEOwotCQllbHNlIGdvdG8gZXhpdDsKKwkJaWYgKCFpc19waHBfZG4oZG4sICZpbmRleGVzLCAmbmFtZXMsICZ0eXBlcywgJnBvd2VyX2RvbWFpbnMpKQorCQkJZ290byBleGl0OwogCiAJCW5hbWUgPSAoY2hhciAqKSAmbmFtZXNbMV07CiAJCXR5cGUgPSAoY2hhciAqKSAmdHlwZXNbMV07CiAJCWZvciAoaSA9IDA7IGkgPCBpbmRleGVzWzBdOyBpKyssCi0JICAgICAJCW5hbWUgKz0gKHN0cmxlbihuYW1lKSArIDEpLCB0eXBlICs9IChzdHJsZW4odHlwZSkgKyAxKSkgeworCSAgICAgCQluYW1lICs9IChzdHJsZW4obmFtZSkgKyAxKSwgdHlwZSArPSAoc3RybGVuKHR5cGUpICsgMSkpIAkJewogCi0JCQlpZiAoc2xvdF90eXBlID09IEhPVFBMVUcgfHwKLQkJCSAgICAoc2xvdF90eXBlID09IEVNQkVEREVEICYmCi0JCQkgICAgIGluZGV4ZXNbaSArIDFdID09IG15X2RyY19pbmRleFswXSAmJgotCQkJICAgICBpc19kbHBhcl90eXBlKHR5cGUpKSkgewotCQkJCWlmICghKHNsb3QgPSBhbGxvY19zbG90X3N0cnVjdChkbiwgaW5kZXhlc1tpICsgMV0sIG5hbWUsCi0JCQkJCSAgICAgICBwb3dlcl9kb21haW5zW2kgKyAxXSkpKSB7Ci0JCQkJCXJldHZhbCA9IC1FTk9NRU07Ci0JCQkJCWdvdG8gZXhpdDsKLQkJCQl9Ci0JCQkJaWYgKCFzdHJjbXAodHlwZSwgIlBIQiIpKQotCQkJCQlzbG90LT50eXBlID0gUEhCOwotCQkJCWVsc2UgaWYgKHNsb3RfdHlwZSA9PSBFTUJFRERFRCkKLQkJCQkJc2xvdC0+dHlwZSA9IEVNQkVEREVEOwotCQkJCWVsc2UKLQkJCQkJc2xvdC0+dHlwZSA9IHNpbXBsZV9zdHJ0b3VsKHR5cGUsIE5VTEwsIDEwKTsKKwkJCWlmICghKHNsb3QgPSBhbGxvY19zbG90X3N0cnVjdChkbiwgaW5kZXhlc1tpICsgMV0sIG5hbWUsCisJCQkJICAgICAgIHBvd2VyX2RvbWFpbnNbaSArIDFdKSkpIHsKKwkJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJCXNsb3QtPnR5cGUgPSBzaW1wbGVfc3RydG91bCh0eXBlLCBOVUxMLCAxMCk7CiAJCQkJCi0JCQkJZGJnKCIgICAgRm91bmQgZHJjLWluZGV4OjB4JXggZHJjLW5hbWU6JXMgZHJjLXR5cGU6JXNcbiIsCisJCQlkYmcoIkZvdW5kIGRyYy1pbmRleDoweCV4IGRyYy1uYW1lOiVzIGRyYy10eXBlOiVzXG4iLAogCQkJCQlpbmRleGVzW2kgKyAxXSwgbmFtZSwgdHlwZSk7CiAKLQkJCQlyZXR2YWwgPSByZWdpc3Rlcl9wY2lfc2xvdChzbG90KTsKLQkJCQlpZiAoc2xvdF90eXBlID09IEVNQkVEREVEKQotCQkJCQlnb3RvIGV4aXQ7Ci0JCQl9CisJCQlyZXR2YWwgPSByZWdpc3Rlcl9wY2lfc2xvdChzbG90KTsKIAkJfQogCX0KIGV4aXQ6CkBAIC00MTIsMzEgKzM1Myw2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotLyoKLSAqIGluaXRfc2xvdHMgLSBpbml0aWFsaXplICdzdHJ1Y3Qgc2xvdCcgc3RydWN0dXJlcyBmb3IgZWFjaCBzbG90Ci0gKgotICovCi1zdGF0aWMgdm9pZCBpbml0X3Nsb3RzKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkbjsKLQotCWZvciAoZG4gPSBmaW5kX2FsbF9ub2RlcygpOyBkbjsgZG4gPSBkbi0+bmV4dCkKLQkJcnBhcGhwX2FkZF9zbG90KGRuKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9ycGEodm9pZCkKLXsKLQotCWluaXRfTVVURVgoJnJwYXBocF9zZW0pOwotCi0JLyogaW5pdGlhbGl6ZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBldGMuICovCi0JaW5pdF9zbG90cygpOwotCWlmICghbnVtX3Nsb3RzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zbG90cyh2b2lkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKm47CkBAIC00NTgsMTAgKzM3NCwxOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBycGFwaHBfaW5pdCh2b2lkKQogewotCWluZm8oRFJJVkVSX0RFU0MgIiB2ZXJzaW9uOiAiIERSSVZFUl9WRVJTSU9OICJcbiIpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBOVUxMOwogCi0JLyogcmVhZCBhbGwgdGhlIFBSQSBpbmZvIGZyb20gdGhlIHN5c3RlbSAqLwotCXJldHVybiBpbml0X3JwYSgpOworCWluZm8oRFJJVkVSX0RFU0MgIiB2ZXJzaW9uOiAiIERSSVZFUl9WRVJTSU9OICJcbiIpOworCWluaXRfTVVURVgoJnJwYXBocF9zZW0pOworCisJd2hpbGUgKChkbiA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKGRuLCAicGNpIikpKQorCQlycGFwaHBfYWRkX3Nsb3QoZG4pOworCisJaWYgKCFudW1fc2xvdHMpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBycGFwaHBfZXhpdCh2b2lkKQpAQCAtNDgxLDE2ICs0MDUsNyBAQAogCiAJZGJnKCJFTkFCTElORyBTTE9UICVzXG4iLCBzbG90LT5uYW1lKTsKIAlkb3duKCZycGFwaHBfc2VtKTsKLQlzd2l0Y2ggKHNsb3QtPmRldl90eXBlKSB7Ci0JY2FzZSBQQ0lfREVWOgotCQlyZXR2YWwgPSBycGFwaHBfZW5hYmxlX3BjaV9zbG90KHNsb3QpOwotCQlicmVhazsKLQljYXNlIFZJT19ERVY6Ci0JCXJldHZhbCA9IHJwYXBocF9lbmFibGVfdmlvX3Nsb3Qoc2xvdCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JfQorCXJldHZhbCA9IHJwYXBocF9lbmFibGVfcGNpX3Nsb3Qoc2xvdCk7CiAJdXAoJnJwYXBocF9zZW0pOwogZXhpdDoKIAlkYmcoIiVzIC0gRXhpdDogcmNbJWRdXG4iLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CkBAIC01MTEsMTYgKzQyNiw3IEBACiAKIAlkYmcoIkRJU0FCTElORyBTTE9UICVzXG4iLCBzbG90LT5uYW1lKTsKIAlkb3duKCZycGFwaHBfc2VtKTsKLQlzd2l0Y2ggKHNsb3QtPmRldl90eXBlKSB7Ci0JY2FzZSBQQ0lfREVWOgotCQlyZXR2YWwgPSBycGFwaHBfdW5jb25maWdfcGNpX2FkYXB0ZXIoc2xvdCk7Ci0JCWJyZWFrOwotCWNhc2UgVklPX0RFVjoKLQkJcmV0dmFsID0gcnBhcGhwX3VuY29uZmlnX3Zpb19hZGFwdGVyKHNsb3QpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR2YWwgPSAtRU5PREVWOwotCX0KKwlyZXR2YWwgPSBycGFwaHBfdW5jb25maWdfcGNpX2FkYXB0ZXIoc2xvdCk7CiAJdXAoJnJwYXBocF9zZW0pOwogZXhpdDoKIAlkYmcoIiVzIC0gRXhpdDogcmNbJWRdXG4iLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9wY2kuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3BjaS5jCmluZGV4IGQ4MzA1YTkuLjQ5ZTRkMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3BjaS5jCkBAIC0zMCwyMiArMzAsMzUgQEAKIAogI2luY2x1ZGUgInJwYXBocC5oIgogCi1zdHJ1Y3QgcGNpX2RldiAqcnBhcGhwX2ZpbmRfcGNpX2RldihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQorc3RhdGljIHN0cnVjdCBwY2lfYnVzICpmaW5kX2J1c19hbW9uZ19jaGlsZHJlbihzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCWNoYXIgYnVzX2lkW0JVU19JRF9TSVpFXTsKKwlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmJ1c2RuOwogCi0Jc3ByaW50ZihidXNfaWQsICIlMDR4OiUwMng6JTAyeC4lZCIsIGRuLT5waGItPmdsb2JhbF9udW1iZXIsCi0JCWRuLT5idXNubywgUENJX1NMT1QoZG4tPmRldmZuKSwgUENJX0ZVTkMoZG4tPmRldmZuKSk7Ci0JZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKLQkJaWYgKCFzdHJjbXAocGNpX25hbWUoZGV2KSwgYnVzX2lkKSkgeworCWJ1c2RuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cyk7CisJaWYgKGJ1c2RuID09IGRuKQorCQlyZXR1cm4gYnVzOworCisJbGlzdF9mb3JfZWFjaCh0bXAsICZidXMtPmNoaWxkcmVuKSB7CisJCWNoaWxkID0gZmluZF9idXNfYW1vbmdfY2hpbGRyZW4ocGNpX2J1c19iKHRtcCksIGRuKTsKKwkJaWYgKGNoaWxkKQogCQkJYnJlYWs7Ci0JCX0KIAl9Ci0JcmV0dXJuIGRldjsKKwlyZXR1cm4gY2hpbGQ7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKHJwYXBocF9maW5kX3BjaV9kZXYpOworc3RydWN0IHBjaV9idXMgKnJwYXBocF9maW5kX3BjaV9idXMoc3RydWN0IGRldmljZV9ub2RlICpkbikKK3sKKwlzdHJ1Y3QgcGNpX2RuICpwZG4gPSBkbi0+ZGF0YTsKKworCWlmICghcGRuICB8fCAhcGRuLT5waGIgfHwgIXBkbi0+cGhiLT5idXMpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGZpbmRfYnVzX2Ftb25nX2NoaWxkcmVuKHBkbi0+cGhiLT5idXMsIGRuKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJwYXBocF9maW5kX3BjaV9idXMpOwogCiBpbnQgcnBhcGhwX2NsYWltX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCByZXNvdXJjZSkKIHsKQEAgLTY5LDExICs4Miw2IEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKHJwYXBocF9jbGFpbV9yZXNvdXJjZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqcnBhcGhwX2ZpbmRfYnJpZGdlX3BkZXYoc3RydWN0IHNsb3QgKnNsb3QpCi17Ci0JcmV0dXJuIHJwYXBocF9maW5kX3BjaV9kZXYoc2xvdC0+ZG4pOwotfQotCiBzdGF0aWMgaW50IHJwYXBocF9nZXRfc2Vuc29yX3N0YXRlKHN0cnVjdCBzbG90ICpzbG90LCBpbnQgKnN0YXRlKQogewogCWludCByYzsKQEAgLTExNiwzOSArMTI0LDI3IEBACiAgKi8KIGludCBycGFwaHBfZ2V0X3BjaV9hZGFwdGVyX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqc2xvdCwgaW50IGlzX2luaXQsIHU4ICogdmFsdWUpCiB7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKIAlpbnQgc3RhdGUsIHJjOwotIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkX2RuOwotIAlzdHJ1Y3QgcGNpX2RldiAqY2hpbGRfZGV2ID0gTlVMTDsKIAogCSp2YWx1ZSA9IE5PVF9WQUxJRDsKIAlyYyA9IHJwYXBocF9nZXRfc2Vuc29yX3N0YXRlKHNsb3QsICZzdGF0ZSk7CiAJaWYgKHJjKQogCQlnb3RvIGV4aXQ7CiAKLSAJaWYgKChzdGF0ZSA9PSBFTVBUWSkgfHwgKHNsb3QtPnR5cGUgPT0gUEhCKSkgewotIAkJZGJnKCJzbG90IGlzIGVtcHR5XG4iKTsKKyAJaWYgKHN0YXRlID09IEVNUFRZKQogIAkJKnZhbHVlID0gRU1QVFk7Ci0gCX0KICAJZWxzZSBpZiAoc3RhdGUgPT0gUFJFU0VOVCkgewogCQlpZiAoIWlzX2luaXQpIHsKIAkJCS8qIGF0IHJ1bi10aW1lIHNsb3QtPnN0YXRlIGNhbiBiZSBjaGFuZ2VkIGJ5ICovCiAJCQkvKiBjb25maWcvdW5jb25maWcgYWRhcHRlciAqLwogCQkJKnZhbHVlID0gc2xvdC0+c3RhdGU7CiAJCX0gZWxzZSB7Ci0gCQkJY2hpbGRfZG4gPSBzbG90LT5kbi0+Y2hpbGQ7Ci0gCQkJaWYgKGNoaWxkX2RuKQotIAkJCQljaGlsZF9kZXYgPSBycGFwaHBfZmluZF9wY2lfZGV2KGNoaWxkX2RuKTsKLQotIAkJCWlmIChjaGlsZF9kZXYpCi0gCQkJCSp2YWx1ZSA9IENPTkZJR1VSRUQ7Ci0gCQkJZWxzZSBpZiAoIWNoaWxkX2RuKQotCQkJCWRiZygiJXM6ICVzIGlzIG5vdCB2YWxpZCBPRkRUIG5vZGVcbiIsCi0JCQkJICAgIF9fRlVOQ1RJT05fXywgc2xvdC0+ZG4tPmZ1bGxfbmFtZSk7Ci0JCQllbHNlIHsKLQkJCQllcnIoIiVzOiBjYW4ndCBmaW5kIHBkZXYgb2YgYWRhcHRlciBpbiBzbG90WyVzXVxuIiwgCi0JCQkJCV9fRlVOQ1RJT05fXywgc2xvdC0+ZG4tPmZ1bGxfbmFtZSk7CisJCQlidXMgPSBycGFwaHBfZmluZF9wY2lfYnVzKHNsb3QtPmRuKTsKKwkJCWlmIChidXMgJiYgIWxpc3RfZW1wdHkoJmJ1cy0+ZGV2aWNlcykpCisJCQkJKnZhbHVlID0gQ09ORklHVVJFRDsKKwkJCWVsc2UKIAkJCQkqdmFsdWUgPSBOT1RfQ09ORklHVVJFRDsKLQkJCX0KIAkJfQogCX0KIGV4aXQ6CkBAIC0xODYsMzkgKzE4Miw2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHJwYXBocF9wY2lfY29uZmlnX2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gcnBhcGhwX3BjaV9jb25maWdfc2xvdCgpIHdpbGwgIGNvbmZpZ3VyZSBhbGwgZGV2aWNlcyB1bmRlciB0aGUgCi0gZ2l2ZW4gc2xvdC0+ZG4gYW5kIHJldHVybiB0aGUgdGhlIGZpcnN0IHBjaV9kZXYuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKgotcnBhcGhwX3BjaV9jb25maWdfc2xvdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZWFkc19maXJzdF9jaGlsZCA9IGRuLT5jaGlsZDsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlpbnQgbnVtOwotCQotCWRiZygiRW50ZXIgJXM6IGRuPSVzIGJ1cz0lc1xuIiwgX19GVU5DVElPTl9fLCBkbi0+ZnVsbF9uYW1lLCBidXMtPm5hbWUpOwotCi0JaWYgKGVhZHNfZmlyc3RfY2hpbGQpIHsKLQkJLyogcGNpX3NjYW5fc2xvdCBzaG91bGQgZmluZCBhbGwgY2hpbGRyZW4gb2YgRUFEcyAqLwotCQludW0gPSBwY2lfc2Nhbl9zbG90KGJ1cywgUENJX0RFVkZOKFBDSV9TTE9UKGVhZHNfZmlyc3RfY2hpbGQtPmRldmZuKSwgMCkpOwotCQlpZiAobnVtKSB7Ci0JCQlycGFwaHBfZml4dXBfbmV3X3BjaV9kZXZpY2VzKGJ1cywgMSk7IAotCQkJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOwotCQl9Ci0JCWRldiA9IHJwYXBocF9maW5kX3BjaV9kZXYoZWFkc19maXJzdF9jaGlsZCk7Ci0JCWlmICghZGV2KSB7Ci0JCQllcnIoIk5vIG5ldyBkZXZpY2UgZm91bmRcbiIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgCi0JCQlycGFwaHBfcGNpX2NvbmZpZ19icmlkZ2UoZGV2KTsKLQl9Ci0JcmV0dXJuIGRldjsKLX0KLQogc3RhdGljIGludCBycGFwaHBfcGNpX2NvbmZpZ19icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1OCBzZWNfYnVzbm87CkBAIC0yNTIsNiArMjE1LDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIHJwYXBocF9wY2lfY29uZmlnX3Nsb3QoKSB3aWxsICBjb25maWd1cmUgYWxsIGRldmljZXMgdW5kZXIgdGhlCisgZ2l2ZW4gc2xvdC0+ZG4gYW5kIHJldHVybiB0aGUgdGhlIGZpcnN0IHBjaV9kZXYuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKgorcnBhcGhwX3BjaV9jb25maWdfc2xvdChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBwY2lfYnVzX3RvX09GX25vZGUoYnVzKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwlpbnQgc2xvdG5vOworCWludCBudW07CisKKwlkYmcoIkVudGVyICVzOiBkbj0lcyBidXM9JXNcbiIsIF9fRlVOQ1RJT05fXywgZG4tPmZ1bGxfbmFtZSwgYnVzLT5uYW1lKTsKKwlpZiAoIWRuIHx8ICFkbi0+Y2hpbGQpCisJCXJldHVybiBOVUxMOworCisJc2xvdG5vID0gUENJX1NMT1QoUENJX0ROKGRuLT5jaGlsZCktPmRldmZuKTsKKworCS8qIHBjaV9zY2FuX3Nsb3Qgc2hvdWxkIGZpbmQgYWxsIGNoaWxkcmVuICovCisJbnVtID0gcGNpX3NjYW5fc2xvdChidXMsIFBDSV9ERVZGTihzbG90bm8sIDApKTsKKwlpZiAobnVtKSB7CisJCXJwYXBocF9maXh1cF9uZXdfcGNpX2RldmljZXMoYnVzLCAxKTsKKwkJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOworCX0KKwlpZiAobGlzdF9lbXB0eSgmYnVzLT5kZXZpY2VzKSkgeworCQllcnIoIiVzOiBObyBuZXcgZGV2aWNlIGZvdW5kXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCWlmIChkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UpCisJCQlycGFwaHBfcGNpX2NvbmZpZ19icmlkZ2UoZGV2KTsKKwl9CisKKwlyZXR1cm4gZGV2OworfQorCiBzdGF0aWMgdm9pZCBlbmFibGVfZWVoKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpzaWI7CkBAIC0yNjMsNDkgKzI2Miw0NCBAQAogCQogfQogCi1zdGF0aWMgdm9pZCBwcmludF9zbG90X3BjaV9mdW5jcyhzdHJ1Y3Qgc2xvdCAqc2xvdCkKK3N0YXRpYyB2b2lkIHByaW50X3Nsb3RfcGNpX2Z1bmNzKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCi0JaWYgKHNsb3QtPmRldl90eXBlID09IFBDSV9ERVYpIHsKLQkJZGJnKCIlczogcGNpX2RldnMgb2Ygc2xvdFslc11cbiIsIF9fRlVOQ1RJT05fXywgc2xvdC0+bmFtZSk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkgKGRldiwgc2xvdC0+ZGV2LnBjaV9kZXZzLCBidXNfbGlzdCkKLQkJCWRiZygiXHQlc1xuIiwgcGNpX25hbWUoZGV2KSk7Ci0JfQorCWRuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cyk7CisJaWYgKCFkbikKKwkJcmV0dXJuOworCisJZGJnKCIlczogcGNpX2RldnMgb2Ygc2xvdFslc11cbiIsIF9fRlVOQ1RJT05fXywgZG4tPmZ1bGxfbmFtZSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkKKwkJZGJnKCJcdCVzXG4iLCBwY2lfbmFtZShkZXYpKTsKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbnQgcnBhcGhwX2NvbmZpZ19wY2lfYWRhcHRlcihzdHJ1Y3Qgc2xvdCAqc2xvdCkKK2ludCBycGFwaHBfY29uZmlnX3BjaV9hZGFwdGVyKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7Ci0Jc3RydWN0IHBjaV9idXMgKnBjaV9idXM7CisJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IHBjaV9idXNfdG9fT0Zfbm9kZShidXMpOwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJaW50IHJjID0gLUVOT0RFVjsKIAotCWRiZygiRW50cnkgJXM6IHNsb3RbJXNdXG4iLCBfX0ZVTkNUSU9OX18sIHNsb3QtPm5hbWUpOworCWRiZygiRW50cnkgJXM6IHNsb3RbJXNdXG4iLCBfX0ZVTkNUSU9OX18sIGRuLT5mdWxsX25hbWUpOworCWlmICghZG4pCisJCWdvdG8gZXhpdDsKIAotCWlmIChzbG90LT5icmlkZ2UpIHsKLQotCQlwY2lfYnVzID0gc2xvdC0+YnJpZGdlLT5zdWJvcmRpbmF0ZTsKLQkJaWYgKCFwY2lfYnVzKSB7Ci0JCQllcnIoIiVzOiBjYW4ndCBmaW5kIGJ1cyBzdHJ1Y3R1cmVcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJZW5hYmxlX2VlaChzbG90LT5kbik7Ci0JCWRldiA9IHJwYXBocF9wY2lfY29uZmlnX3Nsb3Qoc2xvdC0+ZG4sIHBjaV9idXMpOwotCQlpZiAoIWRldikgewotCQkJZXJyKCIlczogY2FuJ3QgZmluZCBhbnkgZGV2aWNlcy5cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJcHJpbnRfc2xvdF9wY2lfZnVuY3Moc2xvdCk7Ci0JCXJjID0gMDsKLQl9IGVsc2UgewotCQkvKiBzbG90IGlzIG5vdCBlbmFibGVkICovCi0JCWVycigic2xvdCBkb2Vzbid0IGhhdmUgcGNpX2RldiBzdHJ1Y3R1cmVcbiIpOworCWVuYWJsZV9lZWgoZG4pOworCWRldiA9IHJwYXBocF9wY2lfY29uZmlnX3Nsb3QoYnVzKTsKKwlpZiAoIWRldikgeworCQllcnIoIiVzOiBjYW4ndCBmaW5kIGFueSBkZXZpY2VzLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBleGl0OwogCX0KKwlwcmludF9zbG90X3BjaV9mdW5jcyhidXMpOworCXJjID0gMDsKIGV4aXQ6CiAJZGJnKCJFeGl0ICVzOiAgcmM9JWRcbiIsIF9fRlVOQ1RJT05fXywgcmMpOwogCXJldHVybiByYzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJwYXBocF9jb25maWdfcGNpX2FkYXB0ZXIpOwogCiBzdGF0aWMgdm9pZCBycGFwaHBfZWVoX3JlbW92ZV9idXNfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CkBAIC0zMjcsMTMgKzMyMSwxNCBAQAogCiBpbnQgcnBhcGhwX3VuY29uZmlnX3BjaV9hZGFwdGVyKHN0cnVjdCBzbG90ICpzbG90KQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJc3RydWN0IHBjaV9kZXYgKmRldiwgKnRtcDsKIAlpbnQgcmV0dmFsID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCBzbG90LT5kZXYucGNpX2RldnMsIGJ1c19saXN0KQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgc2xvdC0+cGNpX2RldnMsIGJ1c19saXN0KSB7CiAJCXJwYXBocF9lZWhfcmVtb3ZlX2J1c19kZXZpY2UoZGV2KTsKKwkJcGNpX3JlbW92ZV9idXNfZGV2aWNlKGRldik7CisJfQogCi0JcGNpX3JlbW92ZV9iZWhpbmRfYnJpZGdlKHNsb3QtPmJyaWRnZSk7CiAJc2xvdC0+c3RhdGUgPSBOT1RfQ09ORklHVVJFRDsKIAlpbmZvKCIlczogZGV2aWNlcyBpbiBzbG90WyVzXSB1bmNvbmZpZ3VyZWQuXG4iLCBfX0ZVTkNUSU9OX18sCiAJICAgICBzbG90LT5uYW1lKTsKQEAgLTM1Niw2NiArMzUxLDQxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X3BoYl9zbG90X25hbWUoc3RydWN0IHNsb3QgKnNsb3QpCitzdGF0aWMgdm9pZCBzZXRfc2xvdF9uYW1lKHN0cnVjdCBzbG90ICpzbG90KQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1czsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gc2xvdC0+YnVzOworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7CiAKLQlkbiA9IHNsb3QtPmRuOwotCWlmICghZG4pIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBoYiA9IGRuLT5waGI7Ci0JaWYgKCFwaGIpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWJ1cyA9IHBoYi0+YnVzOwotCWlmICghYnVzKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNwcmludGYoc2xvdC0+bmFtZSwgIiUwNHg6JTAyeDolMDJ4LiV4IiwgcGNpX2RvbWFpbl9ucihidXMpLAotCQkJYnVzLT5udW1iZXIsIDAsIDApOwotCXJldHVybiAwOworCWJyaWRnZSA9IGJ1cy0+c2VsZjsKKwlpZiAoYnJpZGdlKQorCQlzdHJjcHkoc2xvdC0+bmFtZSwgcGNpX25hbWUoYnJpZGdlKSk7CisJZWxzZQorCQlzcHJpbnRmKHNsb3QtPm5hbWUsICIlMDR4OiUwMng6MDAuMCIsIHBjaV9kb21haW5fbnIoYnVzKSwKKwkJCWJ1cy0+bnVtYmVyKTsKIH0KIAogc3RhdGljIGludCBzZXR1cF9wY2lfc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCkKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gc2xvdC0+ZG47CiAJc3RydWN0IHBjaV9idXMgKmJ1czsKLQlpbnQgcmM7CiAKLQlpZiAoc2xvdC0+dHlwZSA9PSBQSEIpIHsKLQkJcmMgPSBzZXRfcGhiX3Nsb3RfbmFtZShzbG90KTsKLQkJaWYgKHJjIDwgMCkgewotCQkJZXJyKCIlczogZmFpbGVkIHRvIHNldCBwaGIgc2xvdCBuYW1lXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJZ290byBleGl0X3JjOwotCQl9Ci0JfSBlbHNlIHsKLQkJc2xvdC0+YnJpZGdlID0gcnBhcGhwX2ZpbmRfYnJpZGdlX3BkZXYoc2xvdCk7Ci0JCWlmICghc2xvdC0+YnJpZGdlKSB7Ci0JCQkvKiBzbG90IGJlaW5nIGFkZGVkIGRvZXNuJ3QgaGF2ZSBwY2lfZGV2IHlldCAqLwotCQkJZXJyKCIlczogbm8gcGNpX2RldiBmb3IgYnJpZGdlIGRuICVzXG4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIHNsb3QtPm5hbWUpOwotCQkJZ290byBleGl0X3JjOwotCQl9Ci0KLQkJYnVzID0gc2xvdC0+YnJpZGdlLT5zdWJvcmRpbmF0ZTsKLQkJaWYgKCFidXMpCi0JCQlnb3RvIGV4aXRfcmM7Ci0JCXNsb3QtPmRldi5wY2lfZGV2cyA9ICZidXMtPmRldmljZXM7Ci0KLQkJZGJnKCIlcyBzZXQgc2xvdC0+bmFtZSB0byAlc1xuIiwgIF9fRlVOQ1RJT05fXywKLQkJCQlwY2lfbmFtZShzbG90LT5icmlkZ2UpKTsKLQkJc3RyY3B5KHNsb3QtPm5hbWUsIHBjaV9uYW1lKHNsb3QtPmJyaWRnZSkpOworCUJVR19PTighZG4pOworCWJ1cyA9IHJwYXBocF9maW5kX3BjaV9idXMoZG4pOworCWlmICghYnVzKSB7CisJCWVycigiJXM6IG5vIHBjaV9idXMgZm9yIGRuICVzXG4iLCBfX0ZVTkNUSU9OX18sIGRuLT5mdWxsX25hbWUpOworCQlnb3RvIGV4aXRfcmM7CiAJfQogCisJc2xvdC0+YnVzID0gYnVzOworCXNsb3QtPnBjaV9kZXZzID0gJmJ1cy0+ZGV2aWNlczsKKwlzZXRfc2xvdF9uYW1lKHNsb3QpOworCiAJLyogZmluZCBzbG90J3MgcGNpX2RldiBpZiBpdCdzIG5vdCBlbXB0eSAqLwogCWlmIChzbG90LT5ob3RwbHVnX3Nsb3QtPmluZm8tPmFkYXB0ZXJfc3RhdHVzID09IEVNUFRZKSB7CiAJCXNsb3QtPnN0YXRlID0gRU1QVFk7CS8qIHNsb3QgaXMgZW1wdHkgKi8KIAl9IGVsc2UgewogCQkvKiBzbG90IGlzIG9jY3VwaWVkICovCi0JCWlmICghKHNsb3QtPmRuLT5jaGlsZCkpIHsKKwkJaWYgKCFkbi0+Y2hpbGQpIHsKIAkJCS8qIG5vbi1lbXB0eSBzbG90IGhhcyB0byBoYXZlIGNoaWxkICovCiAJCQllcnIoIiVzOiBzbG90WyVzXSdzIGRldmljZV9ub2RlIGRvZXNuJ3QgaGF2ZSBjaGlsZCBmb3IgYWRhcHRlclxuIiwgCiAJCQkJX19GVU5DVElPTl9fLCBzbG90LT5uYW1lKTsKQEAgLTQyNSw3ICszOTUsNyBAQAogCQlpZiAoc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvLT5hZGFwdGVyX3N0YXR1cyA9PSBOT1RfQ09ORklHVVJFRCkgewogCQkJZGJnKCIlcyBDT05GSUdVUklORyBwY2kgYWRhcHRlciBpbiBzbG90WyVzXVxuIiwgIAogCQkJCV9fRlVOQ1RJT05fXywgc2xvdC0+bmFtZSk7Ci0JCQlpZiAocnBhcGhwX2NvbmZpZ19wY2lfYWRhcHRlcihzbG90KSkgeworCQkJaWYgKHJwYXBocF9jb25maWdfcGNpX2FkYXB0ZXIoc2xvdC0+YnVzKSkgewogCQkJCWVycigiJXM6IENPTkZJRyBwY2kgYWRhcHRlciBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQkJZ290byBleGl0X3JjOwkJCiAJCQl9CkBAIC00MzUsOCArNDA1LDggQEAKIAkJCQlfX0ZVTkNUSU9OX18sIHNsb3QtPm5hbWUpOwogCQkJZ290byBleGl0X3JjOwogCQl9Ci0JCXByaW50X3Nsb3RfcGNpX2Z1bmNzKHNsb3QpOwotCQlpZiAoIWxpc3RfZW1wdHkoc2xvdC0+ZGV2LnBjaV9kZXZzKSkgeworCQlwcmludF9zbG90X3BjaV9mdW5jcyhzbG90LT5idXMpOworCQlpZiAoIWxpc3RfZW1wdHkoc2xvdC0+cGNpX2RldnMpKSB7CiAJCQlzbG90LT5zdGF0ZSA9IENPTkZJR1VSRUQ7CiAJCX0gZWxzZSB7CiAJCQkvKiBETFBBUiBhZGQgYXMgb3Bwb3NlZCB0byAKQEAgLTQ1NCwxMSArNDI0LDYgQEAKIHsKIAlpbnQgcmMgPSAtRUlOVkFMOwogCi0Jc2xvdC0+ZGV2X3R5cGUgPSBQQ0lfREVWOwotCWlmICgoc2xvdC0+dHlwZSA9PSBFTUJFRERFRCkgfHwgKHNsb3QtPnR5cGUgPT0gUEhCKSkKLQkJc2xvdC0+cmVtb3ZhYmxlID0gMDsKLQllbHNlCi0JCXNsb3QtPnJlbW92YWJsZSA9IDE7CiAJaWYgKHNldHVwX3BjaV9ob3RwbHVnX3Nsb3RfaW5mbyhzbG90KSkKIAkJZ290byBleGl0X3JjOwogCWlmIChzZXR1cF9wY2lfc2xvdChzbG90KSkKQEAgLTQ3OSw3ICs0NDQsNyBAQAogCS8qIGlmIHNsb3QgaXMgbm90IGVtcHR5LCBlbmFibGUgdGhlIGFkYXB0ZXIgKi8KIAlpZiAoc3RhdGUgPT0gUFJFU0VOVCkgewogCQlkYmcoIiVzIDogc2xvdFslc10gaXMgb2NjdXBpZWQuXG4iLCBfX0ZVTkNUSU9OX18sIHNsb3QtPm5hbWUpOwotCQlyZXR2YWwgPSBycGFwaHBfY29uZmlnX3BjaV9hZGFwdGVyKHNsb3QpOworCQlyZXR2YWwgPSBycGFwaHBfY29uZmlnX3BjaV9hZGFwdGVyKHNsb3QtPmJ1cyk7CiAJCWlmICghcmV0dmFsKSB7CiAJCQlzbG90LT5zdGF0ZSA9IENPTkZJR1VSRUQ7CiAJCQlkYmcoIiVzOiBQQ0kgZGV2aWNlcyBpbiBzbG90WyVzXSBoYXMgYmVlbiBjb25maWd1cmVkXG4iLCAKQEAgLTUwMiwzNyArNDY3LDMgQEAKIAlkYmcoIiVzIC0gRXhpdDogcmNbJWRdXG4iLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KLQotc3RydWN0IGhvdHBsdWdfc2xvdCAqcnBhcGhwX2ZpbmRfaG90cGx1Z19zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZAkqdG1wLCAqbjsKLQlzdHJ1Y3Qgc2xvdAkJKnNsb3Q7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBuLCAmcnBhcGhwX3Nsb3RfaGVhZCkgewotCQlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwotCQlzdHJ1Y3QgbGlzdF9oZWFkICpsbjsKLQotCQlzbG90ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBzbG90LCBycGFwaHBfc2xvdF9saXN0KTsKLQkJaWYgKHNsb3QtPmJyaWRnZSA9PSBOVUxMKSB7Ci0JCQlpZiAoc2xvdC0+ZGV2X3R5cGUgPT0gUENJX0RFVikgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSSBzbG90IG1pc3NpbmcgYnJpZGdlICVzICVzIFxuIiwgCi0JCQkJICAgICAgICAgICAgICAgICAgICBzbG90LT5uYW1lLCBzbG90LT5sb2NhdGlvbik7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWJ1cyA9IHNsb3QtPmJyaWRnZS0+c3Vib3JkaW5hdGU7Ci0JCWlmICghYnVzKSB7Ci0JCQljb250aW51ZTsgIC8qIHNob3VsZCBuZXZlciBoYXBwZW4/ICovCi0JCX0KLQkJZm9yIChsbiA9IGJ1cy0+ZGV2aWNlcy5uZXh0OyBsbiAhPSAmYnVzLT5kZXZpY2VzOyBsbiA9IGxuLT5uZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGNpX2Rldl9iKGxuKTsKLQkJCQlpZiAocGRldiA9PSBkZXYpCi0JCQkJCXJldHVybiBzbG90LT5ob3RwbHVnX3Nsb3Q7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotRVhQT1JUX1NZTUJPTF9HUEwocnBhcGhwX2ZpbmRfaG90cGx1Z19zbG90KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3Nsb3QuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3Nsb3QuYwppbmRleCBmZjJjYmYwLi4wZTg4MTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9zbG90LmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfc2xvdC5jCkBAIC0zMCwzNSArMzAsNiBAQAogI2luY2x1ZGUgPGFzbS9ydGFzLmg+CiAjaW5jbHVkZSAicnBhcGhwLmgiCiAKLXN0YXRpYyBzc2l6ZV90IHJlbW92YWJsZV9yZWFkX2ZpbGUgKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnBocF9zbG90LCBjaGFyICpidWYpCi17Ci0JdTggdmFsdWU7Ci0JaW50IHJldHZhbCA9IC1FTk9FTlQ7Ci0Jc3RydWN0IHNsb3QgKnNsb3QgPSAoc3RydWN0IHNsb3QgKilwaHBfc2xvdC0+cHJpdmF0ZTsKLQotCWlmICghc2xvdCkKLQkJcmV0dXJuIHJldHZhbDsKLQotCXZhbHVlID0gc2xvdC0+cmVtb3ZhYmxlOwotCXJldHZhbCA9IHNwcmludGYgKGJ1ZiwgIiVkXG4iLCB2YWx1ZSk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHN0cnVjdCBob3RwbHVnX3Nsb3RfYXR0cmlidXRlIGhvdHBsdWdfc2xvdF9hdHRyX3JlbW92YWJsZSA9IHsKLQkuYXR0ciA9IHsubmFtZSA9ICJwaHlfcmVtb3ZhYmxlIiwgLm1vZGUgPSBTX0lGUkVHIHwgU19JUlVHT30sCi0JLnNob3cgPSByZW1vdmFibGVfcmVhZF9maWxlLAotfTsKLQotc3RhdGljIHZvaWQgcnBhcGhwX3N5c2ZzX2FkZF9hdHRyX3JlbW92YWJsZSAoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCkKLXsKLQlzeXNmc19jcmVhdGVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX3JlbW92YWJsZS5hdHRyKTsKLX0KLQotc3RhdGljIHZvaWQgcnBhcGhwX3N5c2ZzX3JlbW92ZV9hdHRyX3JlbW92YWJsZSAoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCkKLXsKLQlzeXNmc19yZW1vdmVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX3JlbW92YWJsZS5hdHRyKTsKLX0KLQogc3RhdGljIHNzaXplX3QgbG9jYXRpb25fcmVhZF9maWxlIChzdHJ1Y3QgaG90cGx1Z19zbG90ICpwaHBfc2xvdCwgY2hhciAqYnVmKQogewogICAgICAgICBjaGFyICp2YWx1ZTsKQEAgLTE3Niw5ICsxNDcsNiBAQAogCS8qIHJlbW92ZSAicGh5X2xvY2F0aW9uIiBmaWxlICovCiAJcnBhcGhwX3N5c2ZzX3JlbW92ZV9hdHRyX2xvY2F0aW9uKHBocF9zbG90KTsKIAotCS8qIHJlbW92ZSAicGh5X3JlbW92YWJsZSIgZmlsZSAqLwotCXJwYXBocF9zeXNmc19yZW1vdmVfYXR0cl9yZW1vdmFibGUocGhwX3Nsb3QpOwotCiAJcmV0dmFsID0gcGNpX2hwX2RlcmVnaXN0ZXIocGhwX3Nsb3QpOwogCWlmIChyZXR2YWwpCiAJCWVycigiUHJvYmxlbSB1bnJlZ2lzdGVyaW5nIGEgc2xvdCAlc1xuIiwgc2xvdC0+bmFtZSk7CkBAIC0yMTIsMjEgKzE4MCwxMyBAQAogCS8qIGNyZWF0ZSAicGh5X2xvY2F0b2luIiBmaWxlICovCiAJcnBhcGhwX3N5c2ZzX2FkZF9hdHRyX2xvY2F0aW9uKHNsb3QtPmhvdHBsdWdfc2xvdCk7CQogCi0JLyogY3JlYXRlICJwaHlfcmVtb3ZhYmxlIiBmaWxlICovCi0JcnBhcGhwX3N5c2ZzX2FkZF9hdHRyX3JlbW92YWJsZShzbG90LT5ob3RwbHVnX3Nsb3QpOwkKLQogCS8qIGFkZCBzbG90IHRvIG91ciBpbnRlcm5hbCBsaXN0ICovCiAJZGJnKCIlcyBhZGRpbmcgc2xvdFslc10gdG8gcnBhcGhwX3Nsb3RfbGlzdFxuIiwKIAkgICAgX19GVU5DVElPTl9fLCBzbG90LT5uYW1lKTsKIAogCWxpc3RfYWRkKCZzbG90LT5ycGFwaHBfc2xvdF9saXN0LCAmcnBhcGhwX3Nsb3RfaGVhZCk7Ci0KLQlpZiAoc2xvdC0+ZGV2X3R5cGUgPT0gVklPX0RFVikKLQkJaW5mbygiU2xvdCBbJXNdKFZJTyBsb2NhdGlvbj0lcykgcmVnaXN0ZXJlZFxuIiwKLQkJICAgICBzbG90LT5uYW1lLCBzbG90LT5sb2NhdGlvbik7Ci0JZWxzZQotCQlpbmZvKCJTbG90IFslc10oUENJIGxvY2F0aW9uPSVzKSByZWdpc3RlcmVkXG4iLAotCQkgICAgIHNsb3QtPm5hbWUsIHNsb3QtPmxvY2F0aW9uKTsKKwlpbmZvKCJTbG90IFslc10oUENJIGxvY2F0aW9uPSVzKSByZWdpc3RlcmVkXG4iLCBzbG90LT5uYW1lLAorCQkJc2xvdC0+bG9jYXRpb24pOwogCW51bV9zbG90cysrOwogCXJldHVybiAwOwogfQpAQCAtMjM1LDIxICsxOTUsMTcgQEAKIHsKIAlpbnQgcmMgPSAwLCBsZXZlbDsKIAkKLQlpZiAoc2xvdC0+dHlwZSA9PSBIT1RQTFVHKSB7Ci0JCXJjID0gcnRhc19nZXRfcG93ZXJfbGV2ZWwoc2xvdC0+cG93ZXJfZG9tYWluLCAmbGV2ZWwpOwotCQlpZiAoIXJjKSB7Ci0JCQlkYmcoIiVzIHRoZSBwb3dlciBsZXZlbCBvZiBzbG90ICVzKHB3ZC1kb21haW46MHgleCkgaXMgJWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBzbG90LT5uYW1lLCBzbG90LT5wb3dlcl9kb21haW4sIGxldmVsKTsKLQkJCSp2YWx1ZSA9IGxldmVsOwotCQl9IGVsc2UKLQkJCWVycigiZmFpbGVkIHRvIGdldCBwb3dlci1sZXZlbCBmb3Igc2xvdCglcyksIHJjPTB4JXhcbiIsCi0JCQkJc2xvdC0+bG9jYXRpb24sIHJjKTsKLQl9IGVsc2UgewotCQlkYmcoIiVzIHJlcG9ydCBQT1dFUl9PTiBmb3IgRU1CRURERUQgb3IgUEhCIHNsb3QgJXNcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHNsb3QtPmxvY2F0aW9uKTsKLQkJKnZhbHVlID0gKHU4KSBQT1dFUl9PTjsKKwlyYyA9IHJ0YXNfZ2V0X3Bvd2VyX2xldmVsKHNsb3QtPnBvd2VyX2RvbWFpbiwgJmxldmVsKTsKKwlpZiAocmMgPCAwKSB7CisJCWVycigiZmFpbGVkIHRvIGdldCBwb3dlci1sZXZlbCBmb3Igc2xvdCglcyksIHJjPTB4JXhcbiIsCisJCQlzbG90LT5sb2NhdGlvbiwgcmMpOworCQlyZXR1cm4gcmM7CiAJfQogCisJZGJnKCIlcyB0aGUgcG93ZXIgbGV2ZWwgb2Ygc2xvdCAlcyhwd2QtZG9tYWluOjB4JXgpIGlzICVkXG4iLAorCQlfX0ZVTkNUSU9OX18sIHNsb3QtPm5hbWUsIHNsb3QtPnBvd2VyX2RvbWFpbiwgbGV2ZWwpOworCSp2YWx1ZSA9IGxldmVsOworCiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF92aW8uYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3Zpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGRmNmEzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3Zpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBSUEEgSG90IFBsdWcgVmlydHVhbCBJL08gZGV2aWNlIGZ1bmN0aW9ucyAKLSAqIENvcHlyaWdodCAoQykgMjAwNCBMaW5kYSBYaWUgPGx4aWVAdXMuaWJtLmNvbT4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqIFNlbmQgZmVlZGJhY2sgdG8gPGx4aWVAdXMuaWJtLmNvbT4KLSAqCi0gKi8KLSNpbmNsdWRlIDxhc20vdmlvLmg+Ci0jaW5jbHVkZSAicnBhcGhwLmgiCi0KLS8qCi0gKiBnZXRfdmlvX2FkYXB0ZXJfc3RhdHVzIC0gZ2V0ICB0aGUgc3RhdHVzIG9mIGEgc2xvdAotICogCi0gKiBzdGF0dXM6Ci0gKiAKLSAqIDEtLSBhZGFwdGVyIGlzIGNvbmZpZ3VyZWQKLSAqIDItLSBhZGFwdGVyIGlzIG5vdCBjb25maWd1cmVkCi0gKiAzLS0gbm90IHZhbGlkCi0gKi8KLWlubGluZSBpbnQgcnBhcGhwX2dldF92aW9fYWRhcHRlcl9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIGludCBpc19pbml0LCB1OCAqdmFsdWUpCi17Ci0JKnZhbHVlID0gc2xvdC0+c3RhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBycGFwaHBfdW5jb25maWdfdmlvX2FkYXB0ZXIoc3RydWN0IHNsb3QgKnNsb3QpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlkYmcoIkVudHJ5ICVzOiBzbG90WyVzXVxuIiwgX19GVU5DVElPTl9fLCBzbG90LT5uYW1lKTsKLQlpZiAoIXNsb3QtPmRldi52aW9fZGV2KSB7Ci0JCWluZm8oIiVzOiBubyBWSU9BIGluIHNsb3RbJXNdXG4iLCBfX0ZVTkNUSU9OX18sIHNsb3QtPm5hbWUpOwotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCS8qIHJlbW92ZSB0aGUgZGV2aWNlIGZyb20gdGhlIHZpbyBjb3JlICovCi0JdmlvX3VucmVnaXN0ZXJfZGV2aWNlKHNsb3QtPmRldi52aW9fZGV2KTsKLQlzbG90LT5zdGF0ZSA9IE5PVF9DT05GSUdVUkVEOwotCWluZm8oIiVzOiBhZGFwdGVyIGluIHNsb3RbJXNdIHVuY29uZmlndXJlZC5cbiIsIF9fRlVOQ1RJT05fXywgc2xvdC0+bmFtZSk7Ci1leGl0OgotCWRiZygiRXhpdCAlcywgcmM9MHgleFxuIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0dXBfdmlvX2hvdHBsdWdfc2xvdF9pbmZvKHN0cnVjdCBzbG90ICpzbG90KQotewotCXNsb3QtPmhvdHBsdWdfc2xvdC0+aW5mby0+cG93ZXJfc3RhdHVzID0gMTsKLQlycGFwaHBfZ2V0X3Zpb19hZGFwdGVyX3N0YXR1cyhzbG90LCAxLAotCQkmc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvLT5hZGFwdGVyX3N0YXR1cyk7IAotCXJldHVybiAwOwotfQotCi1pbnQgcmVnaXN0ZXJfdmlvX3Nsb3Qoc3RydWN0IGRldmljZV9ub2RlICpkbikKLXsKLQl1MzIgKmluZGV4OwotCWNoYXIgKm5hbWU7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IE5VTEw7Ci0JCi0JcmMgPSBycGFwaHBfZ2V0X2RyY19wcm9wcyhkbiwgTlVMTCwgJm5hbWUsIE5VTEwsIE5VTEwpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZXhpdF9yYzsKLQlpbmRleCA9ICh1MzIgKikgZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLG15LWRyYy1pbmRleCIsIE5VTEwpOwotCWlmICghaW5kZXgpCi0JCWdvdG8gZXhpdF9yYzsKLQlpZiAoIShzbG90ID0gYWxsb2Nfc2xvdF9zdHJ1Y3QoZG4sICppbmRleCwgbmFtZSwgMCkpKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBleGl0X3JjOwotCX0KLQlzbG90LT5kZXZfdHlwZSA9IFZJT19ERVY7Ci0Jc2xvdC0+ZGV2LnZpb19kZXYgPSB2aW9fZmluZF9ub2RlKGRuKTsKLQlpZiAoc2xvdC0+ZGV2LnZpb19kZXYpIHsKLQkJLyoKLQkJICogcnBhcGhwIGlzIHRoZSBvbmx5IG93bmVyIG9mIHZpbyBkZXZpY2VzIGFuZAotCQkgKiBkb2VzIG5vdCBuZWVkIGV4dHJhIHJlZmVyZW5jZSB0YWtlbiBieQotCQkgKiB2aW9fZmluZF9ub2RlCi0JCSAqLwotCQlwdXRfZGV2aWNlKCZzbG90LT5kZXYudmlvX2Rldi0+ZGV2KTsKLQl9IGVsc2UKLQkJc2xvdC0+ZGV2LnZpb19kZXYgPSB2aW9fcmVnaXN0ZXJfZGV2aWNlX25vZGUoZG4pOwotCWlmIChzbG90LT5kZXYudmlvX2RldikKLQkJc2xvdC0+c3RhdGUgPSBDT05GSUdVUkVEOwotCWVsc2UKLQkJc2xvdC0+c3RhdGUgPSBOT1RfQ09ORklHVVJFRDsKLQlpZiAoc2V0dXBfdmlvX2hvdHBsdWdfc2xvdF9pbmZvKHNsb3QpKQotCQlnb3RvIGV4aXRfcmM7Ci0Jc3RyY3B5KHNsb3QtPm5hbWUsIHNsb3QtPmRldi52aW9fZGV2LT5kZXYuYnVzX2lkKTsKLQlpbmZvKCIlczogcmVnaXN0ZXJlZCBWSU8gZGV2aWNlW25hbWU9JXMgdmlvX2Rldj0lcF1cbiIsCi0JCV9fRlVOQ1RJT05fXywgc2xvdC0+bmFtZSwgc2xvdC0+ZGV2LnZpb19kZXYpOyAKLQlyYyA9IHJlZ2lzdGVyX3Nsb3Qoc2xvdCk7Ci1leGl0X3JjOgotCWlmIChyYyAmJiBzbG90KQotCQlkZWFsbG9jX3Nsb3Rfc3RydWN0KHNsb3QpOwotCXJldHVybiAocmMpOwotfQotCi1pbnQgcnBhcGhwX2VuYWJsZV92aW9fc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQotCWlmICgoc2xvdC0+ZGV2LnZpb19kZXYgPSB2aW9fcmVnaXN0ZXJfZGV2aWNlX25vZGUoc2xvdC0+ZG4pKSkgewotCQlpbmZvKCIlczogVklPIGFkYXB0ZXIgJXMgaW4gc2xvdFslc10gaGFzIGJlZW4gY29uZmlndXJlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgc2xvdC0+ZG4tPm5hbWUsIHNsb3QtPm5hbWUpOwotCQlzbG90LT5zdGF0ZSA9IENPTkZJR1VSRUQ7Ci0JfSBlbHNlIHsKLQkJaW5mbygiJXM6IG5vIHZpb19kZXYgc3RydWN0IGZvciBhZGFwdGVyIGluIHNsb3RbJXNdXG4iLAotCQkJX19GVU5DVElPTl9fLCBzbG90LT5uYW1lKTsKLQkJc2xvdC0+c3RhdGUgPSBOT1RfQ09ORklHVVJFRDsKLQl9Ci0JCi0JcmV0dXJuIHJldHZhbDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYwppbmRleCAzMjMwNDFmLi5iMTQwOTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NnaV9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jCkBAIC0zMiwxNCArMzIsMTUgQEAKIE1PRFVMRV9BVVRIT1IoIlNHSSAocHJhcml0QHNnaS5jb20sIGRpY2tpZUBzZ2kuY29tLCBoYWJlY2tAc2dpLmNvbSkiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU0dJIEFsdGl4IEhvdCBQbHVnIFBDSSBDb250cm9sbGVyIERyaXZlciIpOwogCi0jZGVmaW5lIFBDSUlPX0FTSUNfVFlQRV9USU9DQSAgICAgNAotI2RlZmluZSBQQ0lfU0xPVF9BTFJFQURZX1VQICAgICAgIDIgICAgIC8qIHNsb3QgYWxyZWFkeSB1cCAqLwotI2RlZmluZSBQQ0lfU0xPVF9BTFJFQURZX0RPV04gICAgIDMgICAgIC8qIHNsb3QgYWxyZWFkeSBkb3duICovCi0jZGVmaW5lIFBDSV9MMV9FUlIgICAgICAgICAgICAgICAgNyAgICAgLyogTDEgY29uc29sZSBjb21tYW5kIGVycm9yICovCi0jZGVmaW5lIFBDSV9FTVBUWV8zM01IWiAgICAgICAgICAxNSAgICAgLyogZW1wdHkgMzMgTUh6IGJ1cyAqLwotI2RlZmluZSBQQ0lfTDFfUVNJWkUgICAgICAgICAgICAxMjggICAgIC8qIG91ciBMMSBtZXNzYWdlIGJ1ZmZlciBzaXplICovCi0jZGVmaW5lIFNOX01BWF9IUF9TTE9UUwkJIDMyCS8qIG1heCBudW1iZXIgb2YgaG90cGx1ZyBzbG90cyAqLwotI2RlZmluZSBTR0lfSE9UUExVR19QUk9NX1JFVgkweDA0MjAgIC8qIE1pbi4gcmVxdWlyZWQgUFJPTSB2ZXJzaW9uICovCisjZGVmaW5lIFBDSUlPX0FTSUNfVFlQRV9USU9DQQkJNAorI2RlZmluZSBQQ0lfU0xPVF9BTFJFQURZX1VQCQkyCS8qIHNsb3QgYWxyZWFkeSB1cCAqLworI2RlZmluZSBQQ0lfU0xPVF9BTFJFQURZX0RPV04JCTMJLyogc2xvdCBhbHJlYWR5IGRvd24gKi8KKyNkZWZpbmUgUENJX0wxX0VSUgkJCTcJLyogTDEgY29uc29sZSBjb21tYW5kIGVycm9yICovCisjZGVmaW5lIFBDSV9FTVBUWV8zM01IWgkJCTE1CS8qIGVtcHR5IDMzIE1IeiBidXMgKi8KKyNkZWZpbmUgUENJX0wxX1FTSVpFCQkJMTI4CS8qIG91ciBMMSBtZXNzYWdlIGJ1ZmZlciBzaXplICovCisjZGVmaW5lIFNOX01BWF9IUF9TTE9UUwkJCTMyCS8qIG1heCBob3RwbHVnIHNsb3RzICovCisjZGVmaW5lIFNHSV9IT1RQTFVHX1BST01fUkVWCQkweDA0MzAJLyogTWluLiByZXF1aXJlZCBQUk9NIHZlcnNpb24gKi8KKyNkZWZpbmUgU05fU0xPVF9OQU1FX1NJWkUJCTMzCS8qIHNpemUgb2YgbmFtZSBzdHJpbmcgKi8KIAogLyogaW50ZXJuYWwgbGlzdCBoZWFkICovCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzbl9ocF9saXN0OwpAQCAtNTEsNiArNTIsNyBAQAogCS8qIHRoaXMgc3RydWN0IGZvciBnbHVlIGludGVybmFsIG9ubHkgKi8KIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBocF9saXN0OworCWNoYXIgcGh5c2ljYWxfcGF0aFtTTl9TTE9UX05BTUVfU0laRV07CiB9OwogCiBzdHJ1Y3QgcGNpYnJfc2xvdF9lbmFibGVfcmVzcCB7CkBAIC03MCw3ICs3Miw3IEBACiAKIHN0YXRpYyBpbnQgZW5hYmxlX3Nsb3Qoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCk7CiBzdGF0aWMgaW50IGRpc2FibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KTsKLXN0YXRpYyBpbnQgZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqdmFsdWUpOworc3RhdGljIGlubGluZSBpbnQgZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqdmFsdWUpOwogCiBzdGF0aWMgc3RydWN0IGhvdHBsdWdfc2xvdF9vcHMgc25faG90cGx1Z19zbG90X29wcyA9IHsKIAkub3duZXIgICAgICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLApAQCAtODEsNiArODMsMjEgQEAKIAogc3RhdGljIERFQ0xBUkVfTVVURVgoc25faG90cGx1Z19zZW0pOwogCitzdGF0aWMgc3NpemVfdCBwYXRoX3Nob3cgKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QsCisJICAgICAgIAkJICBjaGFyICpidWYpCit7CisJaW50IHJldHZhbCA9IC1FTk9FTlQ7CisJc3RydWN0IHNsb3QgKnNsb3QgPSBic3NfaG90cGx1Z19zbG90LT5wcml2YXRlOworCisJaWYgKCFzbG90KQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dmFsID0gc3ByaW50ZiAoYnVmLCAiJXNcbiIsIHNsb3QtPnBoeXNpY2FsX3BhdGgpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaG90cGx1Z19zbG90X2F0dHJpYnV0ZSBzbl9zbG90X3BhdGhfYXR0ciA9IF9fQVRUUl9STyhwYXRoKTsKKwogc3RhdGljIGludCBzbl9wY2lfc2xvdF92YWxpZChzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cywgaW50IGRldmljZSkKIHsKIAlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOwpAQCAtMTIwLDE1ICsxMzcsMTUgQEAKIAkvKiBPbmx5IHJlZ2lzdGVyIHNsb3RzIGluIEkvTyBCcmlja3MgdGhhdCBzdXBwb3J0IGhvdHBsdWcgKi8KIAlicmlja3R5cGUgPSBNT0RVTEVfR0VUX0JUWVBFKHBjaWJ1c19pbmZvLT5wYmlfbW9kdWxlaWQpOwogCXN3aXRjaCAoYnJpY2t0eXBlKSB7Ci0JY2FzZSBMMV9CUklDS1RZUEVfSVg6Ci0JY2FzZSBMMV9CUklDS1RZUEVfUFg6Ci0JY2FzZSBMMV9CUklDS1RZUEVfSUE6Ci0JY2FzZSBMMV9CUklDS1RZUEVfUEE6Ci0JCXJldHVybiAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVQRVJNOwotCQlicmVhazsKKwkJY2FzZSBMMV9CUklDS1RZUEVfSVg6CisJCWNhc2UgTDFfQlJJQ0tUWVBFX1BYOgorCQljYXNlIEwxX0JSSUNLVFlQRV9JQToKKwkJY2FzZSBMMV9CUklDS1RZUEVfUEE6CisJCQlyZXR1cm4gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWJyZWFrOwogCX0KIAogCXJldHVybiAtRUlPOwpAQCAtMTQyLDEzICsxNTksMTIgQEAKIAogCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhwY2lfYnVzKTsKIAotCWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGUgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc2xvdCksCi0JCQkJCSAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGUpCisJc2xvdCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpzbG90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbG90KQogCQlyZXR1cm4gLUVOT01FTTsKLQlzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlic3NfaG90cGx1Z19zbG90LT5wcml2YXRlID0gc2xvdDsKIAotCWJzc19ob3RwbHVnX3Nsb3QtPm5hbWUgPSBrbWFsbG9jKDMzLCBHRlBfS0VSTkVMKTsKKwlic3NfaG90cGx1Z19zbG90LT5uYW1lID0ga21hbGxvYyhTTl9TTE9UX05BTUVfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFic3NfaG90cGx1Z19zbG90LT5uYW1lKSB7CiAJCWtmcmVlKGJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGUpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE1NiwxNiArMTcyLDE2IEBACiAKIAlzbG90LT5kZXZpY2VfbnVtID0gZGV2aWNlOwogCXNsb3QtPnBjaV9idXMgPSBwY2lfYnVzOwotCi0Jc3ByaW50Zihic3NfaG90cGx1Z19zbG90LT5uYW1lLCAibW9kdWxlXyVjJWMlYyVjJS4yZF9iXyVkX3NfJWQiLAorCXNwcmludGYoYnNzX2hvdHBsdWdfc2xvdC0+bmFtZSwgIiUwNHg6JTAyeDolMDJ4IiwKKwkJcGNpX2RvbWFpbl9ucihwY2lfYnVzKSwKKwkJKChpbnQpcGNpYnVzX2luZm8tPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9idXNudW0pICYgMHhmLAorCQlkZXZpY2UgKyAxKTsKKwlzcHJpbnRmKHNsb3QtPnBoeXNpY2FsX3BhdGgsICJtb2R1bGVfJWMlYyVjJWMlLjJkIiwKIAkJJzAnK1JBQ0tfR0VUX0NMQVNTKE1PRFVMRV9HRVRfUkFDSyhwY2lidXNfaW5mby0+cGJpX21vZHVsZWlkKSksCiAJCScwJytSQUNLX0dFVF9HUk9VUChNT0RVTEVfR0VUX1JBQ0socGNpYnVzX2luZm8tPnBiaV9tb2R1bGVpZCkpLAogCQknMCcrUkFDS19HRVRfTlVNKE1PRFVMRV9HRVRfUkFDSyhwY2lidXNfaW5mby0+cGJpX21vZHVsZWlkKSksCiAJCU1PRFVMRV9HRVRfQlRDSEFSKHBjaWJ1c19pbmZvLT5wYmlfbW9kdWxlaWQpLAotCQlNT0RVTEVfR0VUX0JQT1MocGNpYnVzX2luZm8tPnBiaV9tb2R1bGVpZCksCi0JCSgoaW50KXBjaWJ1c19pbmZvLT5wYmlfYnVzY29tbW9uLmJzX3BlcnNpc3RfYnVzbnVtKSAmIDB4ZiwKLQkJZGV2aWNlICsgMSk7Ci0KKwkJTU9EVUxFX0dFVF9CUE9TKHBjaWJ1c19pbmZvLT5wYmlfbW9kdWxlaWQpKTsKIAlzbG90LT5ob3RwbHVnX3Nsb3QgPSBic3NfaG90cGx1Z19zbG90OwogCWxpc3RfYWRkKCZzbG90LT5ocF9saXN0LCAmc25faHBfbGlzdCk7CiAKQEAgLTE3NSwxNCArMTkxLDE0IEBACiBzdGF0aWMgc3RydWN0IGhvdHBsdWdfc2xvdCAqIHNuX2hwX2Rlc3Ryb3kodm9pZCkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QgPSBOVUxMOwogCi0JbGlzdF9mb3JfZWFjaChsaXN0LCAmc25faHBfbGlzdCkgewotCQlzbG90ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc2xvdCwgaHBfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzbG90LCAmc25faHBfbGlzdCwgaHBfbGlzdCkgewogCQlic3NfaG90cGx1Z19zbG90ID0gc2xvdC0+aG90cGx1Z19zbG90OwogCQlsaXN0X2RlbCgmKChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGUpLT4KIAkJCSBocF9saXN0KTsKKwkJc3lzZnNfcmVtb3ZlX2ZpbGUoJmJzc19ob3RwbHVnX3Nsb3QtPmtvYmosCisJCQkJICAmc25fc2xvdF9wYXRoX2F0dHIuYXR0cik7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gYnNzX2hvdHBsdWdfc2xvdDsKQEAgLTE5MCw3ICsyMDYsNiBAQAogCiBzdGF0aWMgdm9pZCBzbl9idXNfYWxsb2NfZGF0YShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7CiAJc3RydWN0IHBjaV9idXMgKnN1Ym9yZGluYXRlX2J1czsKIAlzdHJ1Y3QgcGNpX2RldiAqY2hpbGQ7CiAKQEAgLTE5OSw2NiArMjE0LDI5IEBACiAJLyogUmVjdXJzaXZlbHkgc2V0cyB1cCB0aGUgc25faXJxX2luZm8gc3RydWN0cyAqLwogCWlmIChkZXYtPnN1Ym9yZGluYXRlKSB7CiAJCXN1Ym9yZGluYXRlX2J1cyA9IGRldi0+c3Vib3JkaW5hdGU7Ci0JCWxpc3RfZm9yX2VhY2gobm9kZSwgJnN1Ym9yZGluYXRlX2J1cy0+ZGV2aWNlcykgewotCQkJY2hpbGQgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBwY2lfZGV2LCBidXNfbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZzdWJvcmRpbmF0ZV9idXMtPmRldmljZXMsIGJ1c19saXN0KQogCQkJc25fYnVzX2FsbG9jX2RhdGEoY2hpbGQpOwotCQl9CiAJfQogfQogCiBzdGF0aWMgdm9pZCBzbl9idXNfZnJlZV9kYXRhKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbm9kZTsKIAlzdHJ1Y3QgcGNpX2J1cyAqc3Vib3JkaW5hdGVfYnVzOwogCXN0cnVjdCBwY2lfZGV2ICpjaGlsZDsKIAogCS8qIFJlY3Vyc2l2ZWx5IGNsZWFuIHVwIHNuX2lycV9pbmZvIHN0cnVjdHMgKi8KIAlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkgewogCQlzdWJvcmRpbmF0ZV9idXMgPSBkZXYtPnN1Ym9yZGluYXRlOwotCQlsaXN0X2Zvcl9lYWNoKG5vZGUsICZzdWJvcmRpbmF0ZV9idXMtPmRldmljZXMpIHsKLQkJCWNoaWxkID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgcGNpX2RldiwgYnVzX2xpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmc3Vib3JkaW5hdGVfYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkKIAkJCXNuX2J1c19mcmVlX2RhdGEoY2hpbGQpOwotCQl9CiAJfQogCXNuX3BjaV91bmZpeHVwX3Nsb3QoZGV2KTsKIH0KIAotc3RhdGljIHU4IHNuX3Bvd2VyX3N0YXR1c19nZXQoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCkKLXsKLQlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7Ci0Jc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKLQl1OCByZXR2YWw7Ci0KLQlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7Ci0JcmV0dmFsID0gcGNpYnVzX2luZm8tPnBiaV9lbmFibGVkX2RldmljZXMgJiAoMSA8PCBzbG90LT5kZXZpY2VfbnVtKTsKLQotCXJldHVybiByZXR2YWwgPyAxIDogMDsKLX0KLQotc3RhdGljIHZvaWQgc25fc2xvdF9tYXJrX2VuYWJsZShzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAotCQkJCWludCBkZXZpY2VfbnVtKQotewotCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKLQlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOwotCi0JcGNpYnVzX2luZm8gPSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHNsb3QtPnBjaV9idXMpOwotCXBjaWJ1c19pbmZvLT5wYmlfZW5hYmxlZF9kZXZpY2VzIHw9ICgxIDw8IGRldmljZV9udW0pOwotfQotCi1zdGF0aWMgdm9pZCBzbl9zbG90X21hcmtfZGlzYWJsZShzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAotCQkJCSBpbnQgZGV2aWNlX251bSkKLXsKLQlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7Ci0Jc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKLQotCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhzbG90LT5wY2lfYnVzKTsKLQlwY2lidXNfaW5mby0+cGJpX2VuYWJsZWRfZGV2aWNlcyAmPSB+KDEgPDwgZGV2aWNlX251bSk7Ci19Ci0KIHN0YXRpYyBpbnQgc25fc2xvdF9lbmFibGUoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCwKIAkJCSAgaW50IGRldmljZV9udW0pCiB7Ci0Jc3RydWN0IHNsb3QgKnNsb3QgPSAoc3RydWN0IHNsb3QgKilic3NfaG90cGx1Z19zbG90LT5wcml2YXRlOworCXN0cnVjdCBzbG90ICpzbG90ID0gYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKIAlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOwogCXN0cnVjdCBwY2licl9zbG90X2VuYWJsZV9yZXNwIHJlc3A7CiAJaW50IHJjOwpAQCAtMjczLDcgKzI1MSw3IEBACiAKIAlpZiAocmMgPT0gUENJX1NMT1RfQUxSRUFEWV9VUCkgewogCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsICJpcyBhbHJlYWR5IGFjdGl2ZVxuIik7Ci0JCXJldHVybiAtRVBFUk07CisJCXJldHVybiAxOyAvKiByZXR1cm4gMSB0byB1c2VyICovCiAJfQogCiAJaWYgKHJjID09IFBDSV9MMV9FUlIpIHsKQEAgLTI5MCw3ICsyNjgsOCBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlzbl9zbG90X21hcmtfZW5hYmxlKGJzc19ob3RwbHVnX3Nsb3QsIGRldmljZV9udW0pOworCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhzbG90LT5wY2lfYnVzKTsKKwlwY2lidXNfaW5mby0+cGJpX2VuYWJsZWRfZGV2aWNlcyB8PSAoMSA8PCBkZXZpY2VfbnVtKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjk4LDcgKzI3Nyw3IEBACiBzdGF0aWMgaW50IHNuX3Nsb3RfZGlzYWJsZShzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAogCQkJICAgaW50IGRldmljZV9udW0sIGludCBhY3Rpb24pCiB7Ci0Jc3RydWN0IHNsb3QgKnNsb3QgPSAoc3RydWN0IHNsb3QgKilic3NfaG90cGx1Z19zbG90LT5wcml2YXRlOworCXN0cnVjdCBzbG90ICpzbG90ID0gYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKIAlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOwogCXN0cnVjdCBwY2licl9zbG90X2Rpc2FibGVfcmVzcCByZXNwOwogCWludCByYzsKQEAgLTMwNyw0MyArMjg2LDQ0IEBACiAKIAlyYyA9IHNhbF9wY2licl9zbG90X2Rpc2FibGUocGNpYnVzX2luZm8sIGRldmljZV9udW0sIGFjdGlvbiwgJnJlc3ApOwogCi0JaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUgJiYgcmMgPT0gUENJX1NMT1RfQUxSRUFEWV9ET1dOKSB7CisJaWYgKChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0VMSUdJQkxFKSAmJgorCSAgICAocmMgPT0gUENJX1NMT1RfQUxSRUFEWV9ET1dOKSkgewogCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsICJTbG90ICVzIGFscmVhZHkgaW5hY3RpdmVcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIDE7IC8qIHJldHVybiAxIHRvIHVzZXIgKi8KIAl9CiAKLQlpZiAoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9FTElHSUJMRSAmJiByYyA9PSBQQ0lfRU1QVFlfMzNNSFopIHsKKwlpZiAoKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUpICYmIChyYyA9PSBQQ0lfRU1QVFlfMzNNSFopKSB7CiAJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKIAkJCSJDYW5ub3QgcmVtb3ZlIGxhc3QgMzNNSHogY2FyZFxuIik7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCi0JaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUgJiYgcmMgPT0gUENJX0wxX0VSUikgeworCWlmICgoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9FTElHSUJMRSkgJiYgKHJjID09IFBDSV9MMV9FUlIpKSB7CiAJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKIAkJCSJMMSBmYWlsdXJlICVkIHdpdGggbWVzc2FnZSBcbiVzXG4iLAogCQkJcmVzcC5yZXNwX3N1Yl9lcnJubywgcmVzcC5yZXNwX2wxX21zZyk7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCi0JaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUgJiYgcmMpIHsKKwlpZiAoKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUpICYmIHJjKSB7CiAJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKIAkJCSJyZW1vdmUgZmFpbGVkIHdpdGggZXJyb3IgJWQgc3ViLWVycm9yICVkXG4iLAogCQkJcmMsIHJlc3AucmVzcF9zdWJfZXJybm8pOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlpZiAoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9FTElHSUJMRSAmJiAhcmMpCisJaWYgKChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0VMSUdJQkxFKSAmJiAhcmMpCiAJCXJldHVybiAwOwogCi0JaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRElTQUJMRSAmJiAhcmMpIHsKLQkJc25fc2xvdF9tYXJrX2Rpc2FibGUoYnNzX2hvdHBsdWdfc2xvdCwgZGV2aWNlX251bSk7CisJaWYgKChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0RJU0FCTEUpICYmICFyYykgeworCQlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7CisJCXBjaWJ1c19pbmZvLT5wYmlfZW5hYmxlZF9kZXZpY2VzICY9IH4oMSA8PCBkZXZpY2VfbnVtKTsKIAkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLCAicmVtb3ZlIHN1Y2Nlc3NmdWxcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9ESVNBQkxFICYmIHJjKSB7CisJaWYgKChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0RJU0FCTEUpICYmIHJjKSB7CiAJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwicmVtb3ZlIGZhaWxlZCByYyA9ICVkXG4iLCByYyk7Ci0JCXJldHVybiByYzsKIAl9CiAKIAlyZXR1cm4gcmM7CkBAIC0zNTEsNyArMzMxLDcgQEAKIAogc3RhdGljIGludCBlbmFibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90KQogewotCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CiAJc3RydWN0IHBjaV9idXMgKm5ld19idXMgPSBOVUxMOwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJaW50IGZ1bmMsIG51bV9mdW5jczsKQEAgLTM3MSw4ICszNTEsOCBAQAogCQlyZXR1cm4gcmM7CiAJfQogCi0JbnVtX2Z1bmNzID0gcGNpX3NjYW5fc2xvdChzbG90LT5wY2lfYnVzLCBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlX251bSsxLAotCQkJCQkJCSAgIFBDSV9GVU5DKDApKSk7CisJbnVtX2Z1bmNzID0gcGNpX3NjYW5fc2xvdChzbG90LT5wY2lfYnVzLAorCQkJCSAgUENJX0RFVkZOKHNsb3QtPmRldmljZV9udW0gKyAxLCAwKSk7CiAJaWYgKCFudW1fZnVuY3MpIHsKIAkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLCAibm8gZGV2aWNlIGluIHNsb3RcbiIpOwogCQl1cCgmc25faG90cGx1Z19zZW0pOwpAQCAtMzkxLDggKzM3MSw2IEBACiAJCWRldiA9IHBjaV9nZXRfc2xvdChzbG90LT5wY2lfYnVzLAogCQkJCSAgIFBDSV9ERVZGTihzbG90LT5kZXZpY2VfbnVtICsgMSwKIAkJCQkJICAgICBQQ0lfRlVOQyhmdW5jKSkpOwotCi0KIAkJaWYgKGRldikgewogCQkJaWYgKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgewogCQkJCXVuc2lnbmVkIGNoYXIgc2VjX2J1czsKQEAgLTQzMSw3ICs0MDksNyBAQAogCiBzdGF0aWMgaW50IGRpc2FibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90KQogewotCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKIAlpbnQgZnVuYzsKIAlpbnQgcmM7CkBAIC00NDgsNyArNDI2LDcgQEAKIAkvKiBGcmVlIHRoZSBTTiByZXNvdXJjZXMgYXNzaWduZWQgdG8gdGhlIExpbnV4IGRldmljZS4qLwogCWZvciAoZnVuYyA9IDA7IGZ1bmMgPCA4OyAgZnVuYysrKSB7CiAJCWRldiA9IHBjaV9nZXRfc2xvdChzbG90LT5wY2lfYnVzLAotCQkJCSAgIFBDSV9ERVZGTihzbG90LT5kZXZpY2VfbnVtKzEsCisJCQkJICAgUENJX0RFVkZOKHNsb3QtPmRldmljZV9udW0gKyAxLAogCQkJCSAgIAkgICAgIFBDSV9GVU5DKGZ1bmMpKSk7CiAJCWlmIChkZXYpIHsKIAkJCS8qCkBAIC00NzcsMTAgKzQ1NSwxNSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBnZXRfcG93ZXJfc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QsIHU4ICp2YWx1ZSkKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9wb3dlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCwKKwkJCQkgICB1OCAqdmFsdWUpCiB7CisJc3RydWN0IHNsb3QgKnNsb3QgPSBic3NfaG90cGx1Z19zbG90LT5wcml2YXRlOworCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm87CisKKwlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7CiAJZG93bigmc25faG90cGx1Z19zZW0pOwotCSp2YWx1ZSA9IHNuX3Bvd2VyX3N0YXR1c19nZXQoYnNzX2hvdHBsdWdfc2xvdCk7CisJKnZhbHVlID0gcGNpYnVzX2luZm8tPnBiaV9lbmFibGVkX2RldmljZXMgJiAoMSA8PCBzbG90LT5kZXZpY2VfbnVtKTsKIAl1cCgmc25faG90cGx1Z19zZW0pOwogCXJldHVybiAwOwogfQpAQCAtNTA4LDcgKzQ5MSw3IEBACiAJCWlmIChzbl9wY2lfc2xvdF92YWxpZChwY2lfYnVzLCBkZXZpY2UpICE9IDEpCiAJCQljb250aW51ZTsKIAotCQlic3NfaG90cGx1Z19zbG90ID0ga2NhbGxvYygxLHNpemVvZihzdHJ1Y3QgaG90cGx1Z19zbG90KSwKKwkJYnNzX2hvdHBsdWdfc2xvdCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpic3NfaG90cGx1Z19zbG90KSwKIAkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghYnNzX2hvdHBsdWdfc2xvdCkgewogCQkJcmMgPSAtRU5PTUVNOwpAQCAtNTE2LDcgKzQ5OSw3IEBACiAJCX0KIAogCQlic3NfaG90cGx1Z19zbG90LT5pbmZvID0KLQkJCWtjYWxsb2MoMSxzaXplb2Yoc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvKSwKKwkJCWtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyksCiAJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmICghYnNzX2hvdHBsdWdfc2xvdC0+aW5mbykgewogCQkJcmMgPSAtRU5PTUVNOwpAQCAtNTM1LDYgKzUxOCwxMSBAQAogCQlyYyA9IHBjaV9ocF9yZWdpc3Rlcihic3NfaG90cGx1Z19zbG90KTsKIAkJaWYgKHJjKQogCQkJZ290byByZWdpc3Rlcl9lcnI7CisKKwkJcmMgPSBzeXNmc19jcmVhdGVfZmlsZSgmYnNzX2hvdHBsdWdfc2xvdC0+a29iaiwKKwkJCQkgICAgICAgJnNuX3Nsb3RfcGF0aF9hdHRyLmF0dHIpOworCQlpZiAocmMpCisJCQlnb3RvIHJlZ2lzdGVyX2VycjsKIAl9CiAJZGV2X2RiZyhwY2lfYnVzLT5zZWxmLCAiUmVnaXN0ZXJlZCBidXMgd2l0aCBob3RwbHVnXG4iKTsKIAlyZXR1cm4gcmM7CkBAIC01NjQsMTQgKzU1MiwxNCBAQAogCWludCByYzsKIAlpbnQgcmVnaXN0ZXJlZCA9IDA7CiAKLQlJTklUX0xJU1RfSEVBRCgmc25faHBfbGlzdCk7Ci0KIAlpZiAoc25fc2FsX3JldigpIDwgU0dJX0hPVFBMVUdfUFJPTV9SRVYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogUFJPTSB2ZXJzaW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQuMDVcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBST00gdmVyc2lvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0LjMwXG4iLAogCQkgICAgICAgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKKwlJTklUX0xJU1RfSEVBRCgmc25faHBfbGlzdCk7CisKIAl3aGlsZSAoKHBjaV9idXMgPSBwY2lfZmluZF9uZXh0X2J1cyhwY2lfYnVzKSkpIHsKIAkJaWYgKCFwY2lfYnVzLT5zeXNkYXRhKQogCQkJY29udGludWU7CkBAIC01ODQsOSArNTcyLDkgQEAKIAkJZGV2X2RiZyhwY2lfYnVzLT5zZWxmLCAidmFsaWQgaG90cGx1ZyBidXNcbiIpOwogCiAJCXJjID0gc25faG90cGx1Z19zbG90X3JlZ2lzdGVyKHBjaV9idXMpOwotCQlpZiAoIXJjKQorCQlpZiAoIXJjKSB7CiAJCQlyZWdpc3RlcmVkID0gMTsKLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlyZWdpc3RlcmVkID0gMDsKIAkJCWJyZWFrOwogCQl9CkBAIC01OTksOSArNTg3LDggQEAKIHsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90OwogCi0Jd2hpbGUgKChic3NfaG90cGx1Z19zbG90ID0gc25faHBfZGVzdHJveSgpKSkgeworCXdoaWxlICgoYnNzX2hvdHBsdWdfc2xvdCA9IHNuX2hwX2Rlc3Ryb3koKSkpCiAJCXBjaV9ocF9kZXJlZ2lzdGVyKGJzc19ob3RwbHVnX3Nsb3QpOwotCX0KIAogCWlmICghbGlzdF9lbXB0eSgmc25faHBfbGlzdCkpCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludGVybmFsIGxpc3QgaXMgbm90IGVtcHR5XG4iLCBfX0ZJTEVfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHAuaAppbmRleCBmZTRkNjUzLi5iN2QxYzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwLmgKQEAgLTQxMSw3ICs0MTEsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWFrZV9zbG90X25hbWUoY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUsIHN0cnVjdCBzbG90ICpzbG90KQogewotCXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlZCIsIHNsb3QtPm51bWJlcik7CisJc25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIiUwNGRfJTA0ZCIsIHNsb3QtPmJ1cywgc2xvdC0+bnVtYmVyKTsKIH0KIAogZW51bSBwaHBfY3Rscl90eXBlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL21zaS5jIGIvZHJpdmVycy9wY2kvbXNpLmMKaW5kZXggMmI4NWFhMy4uZWU4Njc3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvbXNpLmMKKysrIGIvZHJpdmVycy9wY2kvbXNpLmMKQEAgLTkxLDYgKzkxLDcgQEAKIHsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OwogCXN0cnVjdCBtc2dfYWRkcmVzcyBhZGRyZXNzOworCXVuc2lnbmVkIGludCBpcnEgPSB2ZWN0b3I7CiAKIAllbnRyeSA9IChzdHJ1Y3QgbXNpX2Rlc2MgKiltc2lfZGVzY1t2ZWN0b3JdOwogCWlmICghZW50cnkgfHwgIWVudHJ5LT5kZXYpCkBAIC0xMTIsNiArMTEzLDcgQEAKIAkJZW50cnktPm1zaV9hdHRyaWIuY3VycmVudF9jcHUgPSBjcHVfbWFza190b19hcGljaWQoY3B1X21hc2spOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGVudHJ5LT5kZXYsIG1zaV9sb3dlcl9hZGRyZXNzX3JlZyhwb3MpLAogCQkJYWRkcmVzcy5sb19hZGRyZXNzLnZhbHVlKTsKKwkJc2V0X25hdGl2ZV9pcnFfaW5mbyhpcnEsIGNwdV9tYXNrKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgUENJX0NBUF9JRF9NU0lYOgpAQCAtMTI1LDIyICsxMjcsMTMgQEAKIAkJCU1TSV9UQVJHRVRfQ1BVX1NISUZUKTsKIAkJZW50cnktPm1zaV9hdHRyaWIuY3VycmVudF9jcHUgPSBjcHVfbWFza190b19hcGljaWQoY3B1X21hc2spOwogCQl3cml0ZWwoYWRkcmVzcy5sb19hZGRyZXNzLnZhbHVlLCBlbnRyeS0+bWFza19iYXNlICsgb2Zmc2V0KTsKKwkJc2V0X25hdGl2ZV9pcnFfaW5mbyhpcnEsIGNwdV9tYXNrKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIH0KLQotI2lmZGVmIENPTkZJR19JUlFCQUxBTkNFCi1zdGF0aWMgaW5saW5lIHZvaWQgbW92ZV9tc2koaW50IHZlY3RvcikKLXsKLQlpZiAoIWNwdXNfZW1wdHkocGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW3ZlY3Rvcl0pKSB7Ci0JCXNldF9tc2lfYWZmaW5pdHkodmVjdG9yLCBwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbdmVjdG9yXSk7Ci0JCWNwdXNfY2xlYXIocGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW3ZlY3Rvcl0pOwotCX0KLX0KLSNlbmRpZiAvKiBDT05GSUdfSVJRQkFMQU5DRSAqLwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogc3RhdGljIHZvaWQgbWFza19NU0lfaXJxKHVuc2lnbmVkIGludCB2ZWN0b3IpCkBAIC0xOTEsMTMgKzE4NCwxMyBAQAogCiBzdGF0aWMgdm9pZCBlbmRfbXNpX2lycV93b19tYXNrYml0KHVuc2lnbmVkIGludCB2ZWN0b3IpCiB7Ci0JbW92ZV9tc2kodmVjdG9yKTsKKwltb3ZlX25hdGl2ZV9pcnEodmVjdG9yKTsKIAlhY2tfQVBJQ19pcnEoKTsKIH0KIAogc3RhdGljIHZvaWQgZW5kX21zaV9pcnFfd19tYXNrYml0KHVuc2lnbmVkIGludCB2ZWN0b3IpCiB7Ci0JbW92ZV9tc2kodmVjdG9yKTsKKwltb3ZlX25hdGl2ZV9pcnEodmVjdG9yKTsKIAl1bm1hc2tfTVNJX2lycSh2ZWN0b3IpOwogCWFja19BUElDX2lycSgpOwogfQpAQCAtNDQ2LDEwICs0MzksNyBAQAogCX0KICAgICAJaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCkpIHsKIAkJLyogUENJIEV4cHJlc3MgRW5kcG9pbnQgZGV2aWNlIGRldGVjdGVkICovCi0JCXUxNiBjbWQ7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCQljbWQgfD0gUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOwotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKKwkJcGNpX2ludHgoZGV2LCAwKTsgIC8qIGRpc2FibGUgaW50eCAqLwogCX0KIH0KIApAQCAtNDY4LDEwICs0NTgsNyBAQAogCX0KICAgICAJaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCkpIHsKIAkJLyogUENJIEV4cHJlc3MgRW5kcG9pbnQgZGV2aWNlIGRldGVjdGVkICovCi0JCXUxNiBjbWQ7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCQljbWQgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisJCXBjaV9pbnR4KGRldiwgMSk7ICAvKiBlbmFibGUgaW50eCAqLwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvbXNpLmggYi9kcml2ZXJzL3BjaS9tc2kuaAppbmRleCAzOTBmMTg1Li40MDIxMzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9tc2kuaAorKysgYi9kcml2ZXJzL3BjaS9tc2kuaApAQCAtMTksNyArMTksNiBAQAogI2RlZmluZSBOUl9IUF9SRVNFUlZFRF9WRUNUT1JTIAkyMAogCiBleHRlcm4gaW50IHZlY3Rvcl9pcnFbTlJfVkVDVE9SU107Ci1leHRlcm4gY3B1bWFza190IHBlbmRpbmdfaXJxX2JhbGFuY2VfY3B1bWFza1tOUl9JUlFTXTsKIGV4dGVybiB2b2lkICgqaW50ZXJydXB0W05SX0lSUVNdKSh2b2lkKTsKIGV4dGVybiBpbnQgcGNpX3ZlY3Rvcl9yZXNvdXJjZXMoaW50IGxhc3QsIGludCBucl9yZWxlYXNlZCk7CiAKQEAgLTI5LDEwICsyOCw2IEBACiAjZGVmaW5lIHNldF9tc2lfaXJxX2FmZmluaXR5CU5VTEwKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19JUlFCQUxBTkNFCi1zdGF0aWMgaW5saW5lIHZvaWQgbW92ZV9tc2koaW50IHZlY3Rvcikge30KLSNlbmRpZgotCiAvKgogICogTVNJLVggQWRkcmVzcyBSZWdpc3RlcgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9uYW1lcy5jIGIvZHJpdmVycy9wY2kvbmFtZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQyMjRhYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3BjaS9uYW1lcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKglQQ0kgQ2xhc3MgYW5kIERldmljZSBOYW1lIFRhYmxlcwotICoKLSAqCUNvcHlyaWdodCAxOTkzLS0xOTk5IERyZXcgRWNraGFyZHQsIEZyZWRlcmljIFBvdHRlciwKLSAqCURhdmlkIE1vc2Jlcmdlci1UYW5nLCBNYXJ0aW4gTWFyZXMKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpZmRlZiBDT05GSUdfUENJX05BTUVTCi0KLXN0cnVjdCBwY2lfZGV2aWNlX2luZm8gewotCXVuc2lnbmVkIHNob3J0IGRldmljZTsKLQl1bnNpZ25lZCBzaG9ydCBzZWVuOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi1zdHJ1Y3QgcGNpX3ZlbmRvcl9pbmZvIHsKLQl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7Ci0JdW5zaWduZWQgc2hvcnQgbnI7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlzdHJ1Y3QgcGNpX2RldmljZV9pbmZvICpkZXZpY2VzOwotfTsKLQotLyoKLSAqIFRoaXMgaXMgcmlkaWN1bG91cywgYnV0IHdlIHdhbnQgdGhlIHN0cmluZ3MgaW4KLSAqIHRoZSAuaW5pdCBzZWN0aW9uIHNvIHRoYXQgdGhleSBkb24ndCB0YWtlIHVwCi0gKiByZWFsIG1lbW9yeS4uIFBhcnNlIHRoZSBzYW1lIGZpbGUgbXVsdGlwbGUgdGltZXMKLSAqIHRvIGdldCBhbGwgdGhlIGluZm8uCi0gKi8KLSNkZWZpbmUgVkVORE9SKCB2ZW5kb3IsIG5hbWUgKQkJc3RhdGljIGNoYXIgX192ZW5kb3JzdHJfIyN2ZW5kb3JbXSBfX2RldmluaXRkYXRhID0gbmFtZTsKLSNkZWZpbmUgRU5EVkVORE9SKCkKLSNkZWZpbmUgREVWSUNFKCB2ZW5kb3IsIGRldmljZSwgbmFtZSApIAlzdGF0aWMgY2hhciBfX2RldmljZXN0cl8jI3ZlbmRvciMjZGV2aWNlW10gX19kZXZpbml0ZGF0YSA9IG5hbWU7Ci0jaW5jbHVkZSAiZGV2bGlzdC5oIgotCi0KLSNkZWZpbmUgVkVORE9SKCB2ZW5kb3IsIG5hbWUgKQkJc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2luZm8gX19kZXZpY2VzXyMjdmVuZG9yW10gX19kZXZpbml0ZGF0YSA9IHsKLSNkZWZpbmUgRU5EVkVORE9SKCkJCQl9OwotI2RlZmluZSBERVZJQ0UoIHZlbmRvciwgZGV2aWNlLCBuYW1lICkJeyAweCMjZGV2aWNlLCAwLCBfX2RldmljZXN0cl8jI3ZlbmRvciMjZGV2aWNlIH0sCi0jaW5jbHVkZSAiZGV2bGlzdC5oIgotCi1zdGF0aWMgc3RydWN0IHBjaV92ZW5kb3JfaW5mbyBfX2RldmluaXRkYXRhIHBjaV92ZW5kb3JfbGlzdFtdID0gewotI2RlZmluZSBWRU5ET1IoIHZlbmRvciwgbmFtZSApCQl7IDB4IyN2ZW5kb3IsIHNpemVvZihfX2RldmljZXNfIyN2ZW5kb3IpIC8gc2l6ZW9mKHN0cnVjdCBwY2lfZGV2aWNlX2luZm8pLCBfX3ZlbmRvcnN0cl8jI3ZlbmRvciwgX19kZXZpY2VzXyMjdmVuZG9yIH0sCi0jZGVmaW5lIEVORFZFTkRPUigpCi0jZGVmaW5lIERFVklDRSggdmVuZG9yLCBkZXZpY2UsIG5hbWUgKQotI2luY2x1ZGUgImRldmxpc3QuaCIKLX07Ci0KLSNkZWZpbmUgVkVORE9SUyAoc2l6ZW9mKHBjaV92ZW5kb3JfbGlzdCkvc2l6ZW9mKHN0cnVjdCBwY2lfdmVuZG9yX2luZm8pKQotCi12b2lkIF9fZGV2aW5pdCBwY2lfbmFtZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQljb25zdCBzdHJ1Y3QgcGNpX3ZlbmRvcl9pbmZvICp2ZW5kb3JfcCA9IHBjaV92ZW5kb3JfbGlzdDsKLQlpbnQgaSA9IFZFTkRPUlM7Ci0JY2hhciAqbmFtZSA9IGRldi0+cHJldHR5X25hbWU7Ci0KLQlkbyB7Ci0JCWlmICh2ZW5kb3JfcC0+dmVuZG9yID09IGRldi0+dmVuZG9yKQotCQkJZ290byBtYXRjaF92ZW5kb3I7Ci0JCXZlbmRvcl9wKys7Ci0JfSB3aGlsZSAoLS1pKTsKLQotCS8qIENvdWxkbid0IGZpbmQgZWl0aGVyIHRoZSB2ZW5kb3Igbm9yIHRoZSBkZXZpY2UgKi8KLQlzcHJpbnRmKG5hbWUsICJQQ0kgZGV2aWNlICUwNHg6JTA0eCIsIGRldi0+dmVuZG9yLCBkZXYtPmRldmljZSk7Ci0JcmV0dXJuOwotCi0JbWF0Y2hfdmVuZG9yOiB7Ci0JCXN0cnVjdCBwY2lfZGV2aWNlX2luZm8gKmRldmljZV9wID0gdmVuZG9yX3AtPmRldmljZXM7Ci0JCWludCBpID0gdmVuZG9yX3AtPm5yOwotCi0JCXdoaWxlIChpID4gMCkgewotCQkJaWYgKGRldmljZV9wLT5kZXZpY2UgPT0gZGV2LT5kZXZpY2UpCi0JCQkJZ290byBtYXRjaF9kZXZpY2U7Ci0JCQlkZXZpY2VfcCsrOwotCQkJaS0tOwotCQl9Ci0KLQkJLyogT2ssIGZvdW5kIHRoZSB2ZW5kb3IsIGJ1dCB1bmtub3duIGRldmljZSAqLwotCQlzcHJpbnRmKG5hbWUsICJQQ0kgZGV2aWNlICUwNHg6JTA0eCAoJS4iIFBDSV9OQU1FX0hBTEYgInMpIiwKLQkJCQlkZXYtPnZlbmRvciwgZGV2LT5kZXZpY2UsIHZlbmRvcl9wLT5uYW1lKTsKLQkJcmV0dXJuOwotCi0JCS8qIEZ1bGwgbWF0Y2ggKi8KLQkJbWF0Y2hfZGV2aWNlOiB7Ci0JCQljaGFyICpuID0gbmFtZSArIHNwcmludGYobmFtZSwgIiVzICVzIiwKLQkJCQkJdmVuZG9yX3AtPm5hbWUsIGRldmljZV9wLT5uYW1lKTsKLQkJCWludCBuciA9IGRldmljZV9wLT5zZWVuICsgMTsKLQkJCWRldmljZV9wLT5zZWVuID0gbnI7Ci0JCQlpZiAobnIgPiAxKQotCQkJCXNwcmludGYobiwgIiAoIyVkKSIsIG5yKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqICBDbGFzcyBuYW1lcy4gTm90IGluIC5pbml0IHNlY3Rpb24gYXMgdGhleSBhcmUgbmVlZGVkIGluIHJ1bnRpbWUuCi0gKi8KLQotc3RhdGljIHUxNiBwY2lfY2xhc3NfbnVtYmVyc1tdID0gewotI2RlZmluZSBDTEFTUyh4LHkpIDB4IyN4LAotI2luY2x1ZGUgImNsYXNzbGlzdC5oIgotfTsKLQotc3RhdGljIGNoYXIgKnBjaV9jbGFzc19uYW1lc1tdID0gewotI2RlZmluZSBDTEFTUyh4LHkpIHksCi0jaW5jbHVkZSAiY2xhc3NsaXN0LmgiCi19OwotCi1jaGFyICoKLXBjaV9jbGFzc19uYW1lKHUzMiBjbGFzcykKLXsKLQlpbnQgaTsKLQotCWZvcihpPTA7IGk8c2l6ZW9mKHBjaV9jbGFzc19udW1iZXJzKS9zaXplb2YocGNpX2NsYXNzX251bWJlcnNbMF0pOyBpKyspCi0JCWlmIChwY2lfY2xhc3NfbnVtYmVyc1tpXSA9PSBjbGFzcykKLQkJCXJldHVybiBwY2lfY2xhc3NfbmFtZXNbaV07Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLSNlbHNlCi0KLXZvaWQgX19kZXZpbml0IHBjaV9uYW1lX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotfQotCi1jaGFyICoKLXBjaV9jbGFzc19uYW1lKHUzMiBjbGFzcykKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19QQ0lfTkFNRVMgKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCmluZGV4IGU0MTE1YTAuLjBkMGQ1MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvbGljeS5oPgogI2luY2x1ZGUgInBjaS5oIgogCiAvKgpAQCAtMTYzLDYgKzE2NCwzNCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IHBjaV9jYWxsX3Byb2JlKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgZXJyb3I7CisjaWZkZWYgQ09ORklHX05VTUEKKwkvKiBFeGVjdXRlIGRyaXZlciBpbml0aWFsaXphdGlvbiBvbiBub2RlIHdoZXJlIHRoZQorCSAgIGRldmljZSdzIGJ1cyBpcyBhdHRhY2hlZCB0by4gIFRoaXMgd2F5IHRoZSBkcml2ZXIgbGlrZWx5CisJICAgYWxsb2NhdGVzIGl0cyBsb2NhbCBtZW1vcnkgb24gdGhlIHJpZ2h0IG5vZGUgd2l0aG91dAorCSAgIGFueSBuZWVkIHRvIGNoYW5nZSBpdC4gKi8KKwlzdHJ1Y3QgbWVtcG9saWN5ICpvbGRwb2w7CisJY3B1bWFza190IG9sZG1hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJaW50IG5vZGUgPSBwY2lidXNfdG9fbm9kZShkZXYtPmJ1cyk7CisJaWYgKG5vZGUgPj0gMCAmJiBub2RlX29ubGluZShub2RlKSkKKwkgICAgc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBub2RlX3RvX2NwdW1hc2sobm9kZSkpOworCS8qIEFuZCBzZXQgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdGlvbiBwb2xpY3kgKi8KKwlvbGRwb2wgPSBjdXJyZW50LT5tZW1wb2xpY3k7CisJY3VycmVudC0+bWVtcG9saWN5ID0gJmRlZmF1bHRfcG9saWN5OworCW1wb2xfZ2V0KGN1cnJlbnQtPm1lbXBvbGljeSk7CisjZW5kaWYKKwllcnJvciA9IGRydi0+cHJvYmUoZGV2LCBpZCk7CisjaWZkZWYgQ09ORklHX05VTUEKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZG1hc2spOworCW1wb2xfZnJlZShjdXJyZW50LT5tZW1wb2xpY3kpOworCWN1cnJlbnQtPm1lbXBvbGljeSA9IG9sZHBvbDsKKyNlbmRpZgorCXJldHVybiBlcnJvcjsKK30KKwogLyoqCiAgKiBfX3BjaV9kZXZpY2VfcHJvYmUoKQogICogCkBAIC0xODAsNyArMjA5LDcgQEAKIAogCQlpZCA9IHBjaV9tYXRjaF9kZXZpY2UoZHJ2LCBwY2lfZGV2KTsKIAkJaWYgKGlkKQotCQkJZXJyb3IgPSBkcnYtPnByb2JlKHBjaV9kZXYsIGlkKTsKKwkJCWVycm9yID0gcGNpX2NhbGxfcHJvYmUoZHJ2LCBwY2lfZGV2LCBpZCk7CiAJCWlmIChlcnJvciA+PSAwKSB7CiAJCQlwY2lfZGV2LT5kcml2ZXIgPSBkcnY7CiAJCQllcnJvciA9IDA7CkBAIC0yNDMsMTcgKzI3MiwxOSBAQAogfQogCiAKLS8qIAorLyoKICAqIERlZmF1bHQgcmVzdW1lIG1ldGhvZCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgbm8gZHJpdmVyIHByb3ZpZGVkIHJlc3VtZSwKICAqIG9yIG5vdCBldmVuIGEgZHJpdmVyIGF0IGFsbC4KICAqLwogc3RhdGljIHZvaWQgcGNpX2RlZmF1bHRfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQogeworCWludCByZXR2YWw7CisKIAkvKiByZXN0b3JlIHRoZSBQQ0kgY29uZmlnIHNwYWNlICovCiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CiAJLyogaWYgdGhlIGRldmljZSB3YXMgZW5hYmxlZCBiZWZvcmUgc3VzcGVuZCwgcmVlbmFibGUgKi8KIAlpZiAocGNpX2Rldi0+aXNfZW5hYmxlZCkKLQkJcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOwogCS8qIGlmIHRoZSBkZXZpY2Ugd2FzIGJ1c21hc3RlciBiZWZvcmUgdGhlIHN1c3BlbmQsIG1ha2UgaXQgYnVzbWFzdGVyIGFnYWluICovCiAJaWYgKHBjaV9kZXYtPmlzX2J1c21hc3RlcikKIAkJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCmluZGV4IGNjOWQ2NTMuLjU2YTNiMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCkBAIC00NCwxMCArNDQsMTQgQEAKIHBjaV9jb25maWdfYXR0cihjbGFzcywgIjB4JTA2eFxuIik7CiBwY2lfY29uZmlnX2F0dHIoaXJxLCAiJXVcbiIpOwogCi1zdGF0aWMgc3NpemVfdCBsb2NhbF9jcHVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgbG9jYWxfY3B1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CQkKLQljcHVtYXNrX3QgbWFzayA9IHBjaWJ1c190b19jcHVtYXNrKHRvX3BjaV9kZXYoZGV2KS0+YnVzKTsKLQlpbnQgbGVuID0gY3B1bWFza19zY25wcmludGYoYnVmLCBQQUdFX1NJWkUtMiwgbWFzayk7CisJY3B1bWFza190IG1hc2s7CisJaW50IGxlbjsKKworCW1hc2sgPSBwY2lidXNfdG9fY3B1bWFzayh0b19wY2lfZGV2KGRldiktPmJ1cyk7CisJbGVuID0gY3B1bWFza19zY25wcmludGYoYnVmLCBQQUdFX1NJWkUtMiwgbWFzayk7CiAJc3RyY2F0KGJ1ZiwiXG4iKTsgCiAJcmV0dXJuIDErbGVuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCAxYjM0ZmM1Li45OTJkYjg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtMjIyLDYgKzIyMiwzNyBAQAogfQogCiAvKioKKyAqIHBjaV9yZXN0b3JlX2JhcnMgLSByZXN0b3JlIGEgZGV2aWNlcyBCQVIgdmFsdWVzIChlLmcuIGFmdGVyIHdha2UtdXApCisgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGhhdmUgaXRzIEJBUnMgcmVzdG9yZWQKKyAqCisgKiBSZXN0b3JlIHRoZSBCQVIgdmFsdWVzIGZvciBhIGdpdmVuIGRldmljZSwgc28gYXMgdG8gbWFrZSBpdAorICogYWNjZXNzaWJsZSBieSBpdHMgZHJpdmVyLgorICovCit2b2lkCitwY2lfcmVzdG9yZV9iYXJzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGksIG51bXJlczsKKworCXN3aXRjaCAoZGV2LT5oZHJfdHlwZSkgeworCWNhc2UgUENJX0hFQURFUl9UWVBFX05PUk1BTDoKKwkJbnVtcmVzID0gNjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFOgorCQludW1yZXMgPSAyOworCQlicmVhazsKKwljYXNlIFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTOgorCQludW1yZXMgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGJ1dCBqdXN0IGluIGNhc2UuLi4gKi8KKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1yZXM7IGkgKyspCisJCXBjaV91cGRhdGVfcmVzb3VyY2UoZGV2LCAmZGV2LT5yZXNvdXJjZVtpXSwgaSk7Cit9CisKKy8qKgogICogcGNpX3NldF9wb3dlcl9zdGF0ZSAtIFNldCB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCiAgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZAogICogQHN0YXRlOiBQQ0kgcG93ZXIgc3RhdGUgKEQwLCBEMSwgRDIsIEQzaG90LCBEM2NvbGQpIHdlJ3JlIGVudGVyaW5nCkBAIC0yMzksNyArMjcwLDcgQEAKIGludAogcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSkKIHsKLQlpbnQgcG07CisJaW50IHBtLCBuZWVkX3Jlc3RvcmUgPSAwOwogCXUxNiBwbWNzciwgcG1jOwogCiAJLyogYm91bmQgdGhlIHN0YXRlIHdlJ3JlIGVudGVyaW5nICovCkBAIC0yNjMsNyArMjk0LDcgQEAKIAkJcmV0dXJuIC1FSU87IAogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LHBtICsgUENJX1BNX1BNQywmcG1jKTsKLQlpZiAoKHBtYyAmIFBDSV9QTV9DQVBfVkVSX01BU0spID4gMikgeworCWlmICgocG1jICYgUENJX1BNX0NBUF9WRVJfTUFTSykgPiAzKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHCiAJCSAgICAgICAiUENJOiAlcyBoYXMgdW5zdXBwb3J0ZWQgUE0gY2FwIHJlZ3MgdmVyc2lvbiAoJXUpXG4iLAogCQkgICAgICAgcGNpX25hbWUoZGV2KSwgcG1jICYgUENJX1BNX0NBUF9WRVJfTUFTSyk7CkBAIC0yNzEsMjEgKzMwMiwyMiBAQAogCX0KIAogCS8qIGNoZWNrIGlmIHRoaXMgZGV2aWNlIHN1cHBvcnRzIHRoZSBkZXNpcmVkIHN0YXRlICovCi0JaWYgKHN0YXRlID09IFBDSV9EMSB8fCBzdGF0ZSA9PSBQQ0lfRDIpIHsKLQkJaWYgKHN0YXRlID09IFBDSV9EMSAmJiAhKHBtYyAmIFBDSV9QTV9DQVBfRDEpKQotCQkJcmV0dXJuIC1FSU87Ci0JCWVsc2UgaWYgKHN0YXRlID09IFBDSV9EMiAmJiAhKHBtYyAmIFBDSV9QTV9DQVBfRDIpKQotCQkJcmV0dXJuIC1FSU87Ci0JfQorCWlmIChzdGF0ZSA9PSBQQ0lfRDEgJiYgIShwbWMgJiBQQ0lfUE1fQ0FQX0QxKSkKKwkJcmV0dXJuIC1FSU87CisJZWxzZSBpZiAoc3RhdGUgPT0gUENJX0QyICYmICEocG1jICYgUENJX1BNX0NBUF9EMikpCisJCXJldHVybiAtRUlPOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwbSArIFBDSV9QTV9DVFJMLCAmcG1jc3IpOwogCiAJLyogSWYgd2UncmUgaW4gRDMsIGZvcmNlIGVudGlyZSB3b3JkIHRvIDAuCiAJICogVGhpcyBkb2Vzbid0IGFmZmVjdCBQTUVfU3RhdHVzLCBkaXNhYmxlcyBQTUVfRW4sIGFuZAogCSAqIHNldHMgUG93ZXJTdGF0ZSB0byAwLgogCSAqLwotCWlmIChkZXYtPmN1cnJlbnRfc3RhdGUgPj0gUENJX0QzaG90KQorCWlmIChkZXYtPmN1cnJlbnRfc3RhdGUgPj0gUENJX0QzaG90KSB7CisJCWlmICghKHBtY3NyICYgUENJX1BNX0NUUkxfTk9fU09GVF9SRVNFVCkpCisJCQluZWVkX3Jlc3RvcmUgPSAxOwogCQlwbWNzciA9IDA7Ci0JZWxzZSB7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG0gKyBQQ0lfUE1fQ1RSTCwgJnBtY3NyKTsKKwl9IGVsc2UgewogCQlwbWNzciAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKIAkJcG1jc3IgfD0gc3RhdGU7CiAJfQpAQCAtMzA4LDYgKzM0MCwyMiBAQAogCQlwbGF0Zm9ybV9wY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgc3RhdGUpOwogCiAJZGV2LT5jdXJyZW50X3N0YXRlID0gc3RhdGU7CisKKwkvKiBBY2NvcmRpbmcgdG8gc2VjdGlvbiA1LjQuMSBvZiB0aGUgIlBDSSBCVVMgUE9XRVIgTUFOQUdFTUVOVAorCSAqIElOVEVSRkFDRSBTUEVDSUZJQ0FUSU9OLCBSRVYuIDEuMiIsIGEgZGV2aWNlIHRyYW5zaXRpb25pbmcKKwkgKiBmcm9tIEQzaG90IHRvIEQwIF9tYXlfIHBlcmZvcm0gYW4gaW50ZXJuYWwgcmVzZXQsIHRoZXJlYnkKKwkgKiBnb2luZyB0byAiRDAgVW5pbml0aWFsaXplZCIgcmF0aGVyIHRoYW4gIkQwIEluaXRpYWxpemVkIi4KKwkgKiBGb3IgZXhhbXBsZSwgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucyBvZiB0aGUgM2M5MDVCIGFuZCB0aGUKKwkgKiAzYzU1NkIgZXhoaWJpdCB0aGlzIGJlaGF2aW91ci4KKwkgKgorCSAqIEF0IGxlYXN0IHNvbWUgbGFwdG9wIEJJT1NlbiAoZS5nLiB0aGUgVGhpbmtwYWQgVDIxKSBsZWF2ZQorCSAqIGRldmljZXMgaW4gYSBEM2hvdCBzdGF0ZSBhdCBib290LiAgQ29uc2VxdWVudGx5LCB3ZSBuZWVkIHRvCisJICogcmVzdG9yZSBhdCBsZWFzdCB0aGUgQkFScyBzbyB0aGF0IHRoZSBkZXZpY2Ugd2lsbCBiZQorCSAqIGFjY2Vzc2libGUgdG8gaXRzIGRyaXZlci4KKwkgKi8KKwlpZiAobmVlZF9yZXN0b3JlKQorCQlwY2lfcmVzdG9yZV9iYXJzKGRldik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzMzLDEzICszODEsMTcgQEAKIAlpZiAocGxhdGZvcm1fcGNpX2Nob29zZV9zdGF0ZSkgewogCQlyZXQgPSBwbGF0Zm9ybV9wY2lfY2hvb3NlX3N0YXRlKGRldiwgc3RhdGUpOwogCQlpZiAocmV0ID49IDApCi0JCQlzdGF0ZSA9IHJldDsKKwkJCXN0YXRlLmV2ZW50ID0gcmV0OwogCX0KLSAJc3dpdGNoIChzdGF0ZSkgewotCWNhc2UgMDogcmV0dXJuIFBDSV9EMDsKLQljYXNlIDM6IHJldHVybiBQQ0lfRDNob3Q7CisKKwlzd2l0Y2ggKHN0YXRlLmV2ZW50KSB7CisJY2FzZSBQTV9FVkVOVF9PTjoKKwkJcmV0dXJuIFBDSV9EMDsKKwljYXNlIFBNX0VWRU5UX0ZSRUVaRToKKwljYXNlIFBNX0VWRU5UX1NVU1BFTkQ6CisJCXJldHVybiBQQ0lfRDNob3Q7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJUaGV5IGFza2VkIG1lIGZvciBzdGF0ZSAlZFxuIiwgc3RhdGUpOworCQlwcmludGsoIlRoZXkgYXNrZWQgbWUgZm9yIHN0YXRlICVkXG4iLCBzdGF0ZS5ldmVudCk7CiAJCUJVRygpOwogCX0KIAlyZXR1cm4gUENJX0QwOwpAQCAtMzkwLDggKzQ0MiwxMSBAQAogewogCWludCBlcnI7CiAKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgUENJX0QwKTsKLQlpZiAoKGVyciA9IHBjaWJpb3NfZW5hYmxlX2RldmljZShkZXYsIGJhcnMpKSA8IDApCisJZXJyID0gcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIFBDSV9EMCk7CisJaWYgKGVyciA8IDAgJiYgZXJyICE9IC1FSU8pCisJCXJldHVybiBlcnI7CisJZXJyID0gcGNpYmlvc19lbmFibGVfZGV2aWNlKGRldiwgYmFycyk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJcmV0dXJuIDA7CiB9CkBAIC03NDMsNiArNzk4LDMxIEBACiAJfQogfQogCisvKioKKyAqIHBjaV9pbnR4IC0gZW5hYmxlcy9kaXNhYmxlcyBQQ0kgSU5UeCBmb3IgZGV2aWNlIGRldgorICogQGRldjogdGhlIFBDSSBkZXZpY2UgdG8gb3BlcmF0ZSBvbgorICogQGVuYWJsZTogYm9vbGVhbgorICoKKyAqIEVuYWJsZXMvZGlzYWJsZXMgUENJIElOVHggZm9yIGRldmljZSBkZXYKKyAqLwordm9pZAorcGNpX2ludHgoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBlbmFibGUpCit7CisJdTE2IHBjaV9jb21tYW5kLCBuZXc7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jb21tYW5kKTsKKworCWlmIChlbmFibGUpIHsKKwkJbmV3ID0gcGNpX2NvbW1hbmQgJiB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOworCX0gZWxzZSB7CisJCW5ldyA9IHBjaV9jb21tYW5kIHwgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOworCX0KKworCWlmIChuZXcgIT0gcGNpX2NvbW1hbmQpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBuZXcpOworCX0KK30KKwogI2lmbmRlZiBIQVZFX0FSQ0hfUENJX1NFVF9ETUFfTUFTSwogLyoKICAqIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGFyY2gtc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zCkBAIC04MDUsNiArODg1LDcgQEAKIEVYUE9SVF9TWU1CT0woaXNhX2JyaWRnZSk7CiAjZW5kaWYKIAorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3Jlc3RvcmVfYmFycyk7CiBFWFBPUlRfU1lNQk9MKHBjaV9lbmFibGVfZGV2aWNlX2JhcnMpOwogRVhQT1JUX1NZTUJPTChwY2lfZW5hYmxlX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9kaXNhYmxlX2RldmljZSk7CkBAIC04MTksNiArOTAwLDcgQEAKIEVYUE9SVF9TWU1CT0wocGNpX3NldF9tYXN0ZXIpOwogRVhQT1JUX1NZTUJPTChwY2lfc2V0X213aSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9jbGVhcl9td2kpOworRVhQT1JUX1NZTUJPTF9HUEwocGNpX2ludHgpOwogRVhQT1JUX1NZTUJPTChwY2lfc2V0X2RtYV9tYXNrKTsKIEVYUE9SVF9TWU1CT0wocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKTsKIEVYUE9SVF9TWU1CT0wocGNpX2Fzc2lnbl9yZXNvdXJjZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuaCBiL2RyaXZlcnMvcGNpL3BjaS5oCmluZGV4IGQwMDE2OGIuLmQzZjNkZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5oCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5oCkBAIC0yOSw3ICsyOSw2IEBACiAjZW5kaWYKIAogLyogRnVuY3Rpb25zIGZvciBQQ0kgSG90cGx1ZyBkcml2ZXJzIHRvIHVzZSAqLwotZXh0ZXJuIHN0cnVjdCBwY2lfYnVzICogcGNpX2FkZF9uZXdfYnVzKHN0cnVjdCBwY2lfYnVzICpwYXJlbnQsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBidXNucik7CiBleHRlcm4gdW5zaWduZWQgaW50IHBjaV9kb19zY2FuX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIGV4dGVybiBpbnQgcGNpX3JlbW92ZV9kZXZpY2Vfc2FmZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB1bnNpZ25lZCBjaGFyIHBjaV9tYXhfYnVzbnIodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuaWRzIGIvZHJpdmVycy9wY2kvcGNpLmlkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyZWYxZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaWRzCisrKyAvZGV2L251bGwKQEAgLTEsMTAxODAgKzAsMCBAQAotIwotIwlMaXN0IG9mIFBDSSBJRCdzCi0jCi0jCU1haW50YWluZWQgYnkgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+IGFuZCBvdGhlciB2b2x1bnRlZXJzIGZyb20gdGhlCi0jCUxpbnV4IFBDSSBJRCdzIFByb2plY3QgYXQgaHR0cDovL3BjaWlkcy5zZi5uZXQvLiBOZXcgZGF0YSBhcmUgYWx3YXlzCi0jCXdlbGNvbWUgKGlmIHRoZXkgYXJlIGFjY3VyYXRlKSwgd2UncmUgZWFnZXJseSBleHBlY3RpbmcgbmV3IGVudHJpZXMsCi0jCXNvIGlmIHlvdSBoYXZlIGFueXRoaW5nIHRvIGNvbnRyaWJ1dGUsIHBsZWFzZSB2aXNpdCB0aGUgaG9tZSBwYWdlIG9yCi0jCXNlbmQgYSBkaWZmIC11IGFnYWluc3QgdGhlIG1vc3QgcmVjZW50IHBjaS5pZHMgdG8gcGNpLWlkc0B1Y3cuY3ouCi0jCi0jCURhaWx5IHNuYXBzaG90IG9uIFR1ZSAyMDA1LTAzLTA4IDEwOjExOjQ4Ci0jCi0KLSMgVmVuZG9ycywgZGV2aWNlcyBhbmQgc3Vic3lzdGVtcy4gUGxlYXNlIGtlZXAgc29ydGVkLgotCi0jIFN5bnRheDoKLSMgdmVuZG9yICB2ZW5kb3JfbmFtZQotIwlkZXZpY2UgIGRldmljZV9uYW1lCQkJCTwtLSBzaW5nbGUgdGFiCi0jCQlzdWJ2ZW5kb3Igc3ViZGV2aWNlICBzdWJzeXN0ZW1fbmFtZQk8LS0gdHdvIHRhYnMKLQotMDAwMCAgR2FtbWFncmFwaHgsIEluYy4KLTAwMWEgIEFzY2VuZCBDb21tdW5pY2F0aW9ucywgSW5jLgotMDAzMyAgUGFyYWR5bmUgY29ycC4KLTAwM2QgIExvY2toZWVkIE1hcnRpbi1NYXJpZXR0YSBDb3JwCi0jIFJlYWwgVEpOIElEIGlzIGUxNTksIGJ1dCB0aGV5IGdvdCBpdCB3cm9uZyBzZXZlcmFsIHRpbWVzIC0tbWoKLTAwNTkgIFRpZ2VyIEpldCBOZXR3b3JrIEluYy4gKFdyb25nIElEKQotMDA3MCAgSGF1cHBhdWdlIGNvbXB1dGVyIHdvcmtzIEluYy4KLQk0MDAwICBXaW5UViBQVlItMzUwCi0JNDAwMSAgV2luVFYgUFZSLTI1MCAodjEpCi0JNDAwOSAgV2luVFYgUFZSLTI1MAotCTQ4MDEgIFdpblRWIFBWUi0yNTAgTUNFCi0wMDcxICBOZWJ1bGEgRWxlY3Ryb25pY3MgTHRkLgotMDA5NSAgU2lsaWNvbiBJbWFnZSwgSW5jLiAoV3JvbmcgSUQpCi0JMDY4MCAgVWx0cmEgQVRBLzEzMyBJREUgUkFJRCBDT05UUk9MTEVSIENBUkQKLTAxMDAgIE5jaXBoZXIgQ29ycCBMdGQKLSMgMDE4YSBpcyBub3QgTGV2ZWxPbmUgYnV0IHRoZXJlIGlzIGEgYm9hcmQgbWlzcHJvZ3JhbW1lZAotMDE4YSAgTGV2ZWxPbmUKLQkwMTA2ICBGUEMtMDEwNlRYIG1pc3Byb2dyYW1tZWQgW1JUTDgxeHhdCi0jIDAyMWIgaXMgbm90IENvbXBhcSBidXQgdGhlcmUgaXMgYSBib2FyZCBtaXNwcm9ncmFtbWVkCi0wMjFiICBDb21wYXEgQ29tcHV0ZXIgQ29ycG9yYXRpb24KLQk4MTM5ICBITkUtMzAwIChSZWFsVGVrIFJUTDgxMzljKSBbaVBhcSBOZXR3b3JraW5nXQotIyBodHRwOi8vd3d3LmRhdmljb20uY29tLnR3LwotMDI5MSAgRGF2aWNvbSBTZW1pY29uZHVjdG9yLCBJbmMuCi0JODIxMiAgRE05MTAyQShETTkxMDJBRSwgU005MTAyQUYpIEV0aGVybmV0IDEwMC8xMCBNQml0KFJldiA0MCkKLSMgU3BlZWRTdHJlYW0gaXMgRWZmaWNpZW50IE5ldHdvcmtzLCBJbmMsIGEgU2llbWVucyBDb21wYW55Ci0wMmFjICBTcGVlZFN0cmVhbQotCTEwMTIgIDEwMTIgUENNQ0lBIDEwLzEwMCBFdGhlcm5ldCBDYXJkIFtSVEw4MXh4XQotMDM1NyAgVFRUZWNoIEFHCi0JMDAwYSAgVFRQLU1vbml0b3JpbmcgQ2FyZCBWMi4wCi0wNDMyICBTQ00gTWljcm9zeXN0ZW1zLCBJbmMuCi0JMDAwMSAgUGx1dG8yIERWQi1UIFJlY2VpdmVyIGZvciBQQ01DSUEgW0Vhc3lXYXRjaCBNb2JpbFNldF0KLTA1ZTMgIEN5YmVyRG9vcgotCTA3MDEgIENCRDUxNgotMDY3NSAgRHluYWxpbmsKLQkxNzAwICBJUzY0UEggSVNETiBBZGFwdGVyCi0JMTcwMiAgSVM2NFBIIElTRE4gQWRhcHRlcgotIyBXcm9uZyBJRCB1c2VkIGluIHN1YnN5c3RlbSBJRCBvZiBWSUEgVVNCIGNvbnRyb2xsZXJzLgotMDkyNSAgVklBIFRlY2hub2xvZ2llcywgSW5jLiAoV3JvbmcgSUQpCi0wOWMxICBBcnJpcwotCTA3MDQgIENNIDIwMEUgQ2FibGUgTW9kZW0KLTBhODkgIEJSRUEgVGVjaG5vbG9naWVzIEluYwotMGI0OSAgQVNDSUkgQ29ycG9yYXRpb24KLSMgc2VlIGh0dHA6Ly9ob21lcGFnZTEubmlmdHkuY29tL21jbi9sYWIvbWFjaGluZXMvdHJhbmNlX3ZpYnJhdG9yL3VzYnZpZXcudmliLnR4dAotCTA2NGYgIFRyYW5jZSBWaWJyYXRvcgotMGUxMSAgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uCi0JMDAwMSAgUENJIHRvIEVJU0EgQnJpZGdlCi0JMDAwMiAgUENJIHRvIElTQSBCcmlkZ2UKLQkwMDQ2ICBTbWFydCBBcnJheSA2NHh4Ci0JCTBlMTEgNDA5YSAgU21hcnQgQXJyYXkgNjQxCi0JCTBlMTEgNDA5YiAgU21hcnQgQXJyYXkgNjQyCi0JCTBlMTEgNDA5YyAgU21hcnQgQXJyYXkgNjQwMAotCQkwZTExIDQwOWQgIFNtYXJ0IEFycmF5IDY0MDAgRU0KLQkwMDQ5ICBOQzcxMzIgR2lnYWJpdCBVcGdyYWRlIE1vZHVsZQotCTAwNGEgIE5DNjEzNiBHaWdhYml0IFNlcnZlciBBZGFwdGVyCi0JMDA3YyAgTkM3NzcwIDEwMDBCYXNlVFgKLQkwMDdkICBOQzY3NzAgMTAwMEJhc2VUWAotCTAwODUgIE5DNzc4MCAxMDAwQmFzZVRYCi0JMDBiYiAgTkM3NzYwCi0JMDBjYSAgTkM3NzcxCi0JMDBjYiAgTkM3NzgxCi0JMDBjZiAgTkM3NzcyCi0JMDBkMCAgTkM3NzgyCi0JMDBkMSAgTkM3NzgzCi0JMDBlMyAgTkM3NzYxCi0JMDUwOCAgTmV0ZWxsaWdlbnQgNC8xNiBUb2tlbiBSaW5nCi0JMTAwMCAgVHJpZmxleC9QZW50aXVtIEJyaWRnZSwgTW9kZWwgMTAwMAotCTIwMDAgIFRyaWZsZXgvUGVudGl1bSBCcmlkZ2UsIE1vZGVsIDIwMDAKLQkzMDMyICBRVmlzaW9uIDEyODAvcAotCTMwMzMgIFFWaXNpb24gMTI4MC9wCi0JMzAzNCAgUVZpc2lvbiAxMjgwL3AKLQk0MDAwICA0MDAwIFtUcmlmbGV4XQotCTQwMzAgIFNNQVJULTIvUAotCTQwMzEgIFNNQVJULTJTTAotCTQwMzIgIFNtYXJ0IEFycmF5IDMyMDAKLQk0MDMzICBTbWFydCBBcnJheSAzMTAwRVMKLQk0MDM0ICBTbWFydCBBcnJheSAyMjEKLQk0MDQwICBJbnRlZ3JhdGVkIEFycmF5Ci0JNDA0OCAgQ29tcGFxIFJhaWQgTEMyCi0JNDA1MCAgU21hcnQgQXJyYXkgNDIwMAotCTQwNTEgIFNtYXJ0IEFycmF5IDQyNTBFUwotCTQwNTggIFNtYXJ0IEFycmF5IDQzMQotCTQwNzAgIFNtYXJ0IEFycmF5IDUzMDAKLQk0MDgwICBTbWFydCBBcnJheSA1aQotCTQwODIgIFNtYXJ0IEFycmF5IDUzMgotCTQwODMgIFNtYXJ0IEFycmF5IDUzMTIKLQk0MDkxICBTbWFydCBBcnJheSA2aQotCTQwOWEgIFNtYXJ0IEFycmF5IDY0MQotCTQwOWIgIFNtYXJ0IEFycmF5IDY0MgotCTQwOWMgIFNtYXJ0IEFycmF5IDY0MDAKLQk0MDlkICBTbWFydCBBcnJheSA2NDAwIEVNCi0JNjAxMCAgSG90UGx1ZyBQQ0kgQnJpZGdlIDYwMTAKLQk3MDIwICBVU0IgQ29udHJvbGxlcgotCWEwZWMgIEZpYnJlIENoYW5uZWwgSG9zdCBDb250cm9sbGVyCi0JYTBmMCAgQWR2YW5jZWQgU3lzdGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlcgotCWEwZjMgIFRyaWZsZXggUENJIHRvIElTQSBCcmlkZ2UKLQlhMGY3ICBQQ0kgSG90cGx1ZyBDb250cm9sbGVyCi0JCTgwODYgMDAyYSAgUENJIEhvdHBsdWcgQ29udHJvbGxlciBBCi0JCTgwODYgMDAyYiAgUENJIEhvdHBsdWcgQ29udHJvbGxlciBCCi0JYTBmOCAgWkZNaWNybyBDaGlwc2V0IFVTQgotCWEwZmMgIEZpYnJlQ2hhbm5lbCBIQkEgVGFjaHlvbgotCWFlMTAgIFNtYXJ0LTIvUCBSQUlEIENvbnRyb2xsZXIKLQkJMGUxMSA0MDMwICBTbWFydC0yL1AgQXJyYXkgQ29udHJvbGxlcgotCQkwZTExIDQwMzEgIFNtYXJ0LTJTTCBBcnJheSBDb250cm9sbGVyCi0JCTBlMTEgNDAzMiAgU21hcnQgQXJyYXkgQ29udHJvbGxlcgotCQkwZTExIDQwMzMgIFNtYXJ0IDMxMDBFUyBBcnJheSBDb250cm9sbGVyCi0JYWUyOSAgTUlTLUwKLQlhZTJhICBNUEMKLQlhZTJiICBNSVMtRQotCWFlMzEgIFN5c3RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIKLQlhZTMyICBOZXRlbGxpZ2VudCAxMC8xMDAgVFggUENJIFVUUAotCWFlMzMgIFRyaWZsZXggRHVhbCBFSURFIENvbnRyb2xsZXIKLQlhZTM0ICBOZXRlbGxpZ2VudCAxMCBUIFBDSSBVVFAKLQlhZTM1ICBJbnRlZ3JhdGVkIE5ldEZsZXgtMy9QCi0JYWU0MCAgTmV0ZWxsaWdlbnQgRHVhbCAxMC8xMDAgVFggUENJIFVUUAotCWFlNDMgIE5ldGVsbGlnZW50IEludGVncmF0ZWQgMTAvMTAwIFRYIFVUUAotCWFlNjkgIENFVFVTLUwKLQlhZTZjICBOb3J0aHN0YXIKLQlhZTZkICBOb3J0aFN0YXIgQ1BVIHRvIFBDSSBCcmlkZ2UKLQliMDExICBOZXRlbGxpZ2VudCAxMC8xMDAgVFggRW1iZWRkZWQgVVRQCi0JYjAxMiAgTmV0ZWxsaWdlbnQgMTAgVC8yIFBDSSBVVFAvQ29heAotCWIwMWUgIE5DMzEyMCBGYXN0IEV0aGVybmV0IE5JQwotCWIwMWYgIE5DMzEyMiBGYXN0IEV0aGVybmV0IE5JQwotCWIwMmYgIE5DMTEyMCBFdGhlcm5ldCBOSUMKLQliMDMwICBOZXRlbGxpZ2VudCAxMC8xMDAgVFggVVRQCi0JYjA0YSAgMTAvMTAwIFRYIFBDSSBJbnRlbCBXT0wgVVRQIENvbnRyb2xsZXIKLQliMDYwICBTbWFydCBBcnJheSA1MzAwIENvbnRyb2xsZXIKLQliMGM2ICBOQzMxNjEgRmFzdCBFdGhlcm5ldCBOSUMKLQliMGM3ICBOQzMxNjAgRmFzdCBFdGhlcm5ldCBOSUMKLQliMGQ3ICBOQzMxMjEgRmFzdCBFdGhlcm5ldCBOSUMKLQliMGRkICBOQzMxMzEgRmFzdCBFdGhlcm5ldCBOSUMKLQliMGRlICBOQzMxMzIgRmFzdCBFdGhlcm5ldCBNb2R1bGUKLQliMGRmICBOQzYxMzIgR2lnYWJpdCBNb2R1bGUKLQliMGUwICBOQzYxMzMgR2lnYWJpdCBNb2R1bGUKLQliMGUxICBOQzMxMzMgRmFzdCBFdGhlcm5ldCBNb2R1bGUKLQliMTIzICBOQzYxMzQgR2lnYWJpdCBOSUMKLQliMTM0ICBOQzMxNjMgRmFzdCBFdGhlcm5ldCBOSUMKLQliMTNjICBOQzMxNjIgRmFzdCBFdGhlcm5ldCBOSUMKLQliMTQ0ICBOQzMxMjMgRmFzdCBFdGhlcm5ldCBOSUMKLQliMTYzICBOQzMxMzQgRmFzdCBFdGhlcm5ldCBOSUMKLQliMTY0ICBOQzMxNjUgRmFzdCBFdGhlcm5ldCBVcGdyYWRlIE1vZHVsZQotCWIxNzggIFNtYXJ0IEFycmF5IDVpLzUzMgotCQkwZTExIDQwODAgIFNtYXJ0IEFycmF5IDVpCi0JCTBlMTEgNDA4MiAgU21hcnQgQXJyYXkgNTMyCi0JCTBlMTEgNDA4MyAgU21hcnQgQXJyYXkgNTMxMgotCWIxYTQgIE5DNzEzMSBHaWdhYml0IFNlcnZlciBBZGFwdGVyCi0jIEhQIE1lbW9yeSBIb3QtUGx1ZyBDb250cm9sbGVyCi0JYjIwMCAgTWVtb3J5IEhvdC1QbHVnIENvbnRyb2xsZXIKLQliMjAzICBJbnRlZ3JhdGVkIExpZ2h0cyBPdXQgQ29udHJvbGxlcgotCWIyMDQgIEludGVncmF0ZWQgTGlnaHRzIE91dCAgUHJvY2Vzc29yCi0JZjEzMCAgTmV0RmxleC0zL1AgVGh1bmRlckxBTiAxLjAKLQlmMTUwICBOZXRGbGV4LTMvUCBUaHVuZGVyTEFOIDIuMwotMGU1NSAgSGFTb1RlYyBHbWJICi0jIEZvcm1lcmx5IE5DUgotMTAwMCAgTFNJIExvZ2ljIC8gU3ltYmlvcyBMb2dpYwotCTAwMDEgIDUzYzgxMAotCQkxMDAwIDEwMDAgIExTSTUzQzgxMEFFIFBDSSB0byBTQ1NJIEkvTyBQcm9jZXNzb3IKLQkwMDAyICA1M2M4MjAKLQkwMDAzICA1M2M4MjUKLQkJMTAwMCAxMDAwICBMU0k1M0M4MjVBRSBQQ0kgdG8gU0NTSSBJL08gUHJvY2Vzc29yIChVbHRyYSBXaWRlKQotCTAwMDQgIDUzYzgxNQotCTAwMDUgIDUzYzgxMEFQCi0JMDAwNiAgNTNjODYwCi0JCTEwMDAgMTAwMCAgTFNJNTNDODYwRSBQQ0kgdG8gVWx0cmEgU0NTSSBJL08gUHJvY2Vzc29yCi0JMDAwYSAgNTNjMTUxMAotCQkxMDAwIDEwMDAgIExTSTUzQzE1MTAgUENJIHRvIER1YWwgQ2hhbm5lbCBXaWRlIFVsdHJhMiBTQ1NJIENvbnRyb2xsZXIgKE5vbmludGVsbGlnZW50IG1vZGUpCi0JMDAwYiAgNTNDODk2Lzg5NwotCQkwZTExIDYwMDQgIEVPQjAwMyBTZXJpZXMgU0NTSSBob3N0IGFkYXB0ZXIKLQkJMTAwMCAxMDAwICBMU0k1M0M4OTYvNyBQQ0kgdG8gRHVhbCBDaGFubmVsIFVsdHJhMiBTQ1NJIE11bHRpZnVuY3Rpb24gQ29udHJvbGxlcgotCQkxMDAwIDEwMTAgIExTSTIyOTEwIFBDSSB0byBEdWFsIENoYW5uZWwgVWx0cmEyIFNDU0kgaG9zdCBhZGFwdGVyCi0JCTEwMDAgMTAyMCAgTFNJMjEwMDIgUENJIHRvIER1YWwgQ2hhbm5lbCBVbHRyYTIgU0NTSSBob3N0IGFkYXB0ZXIKLSMgbXVsdGlmdW5jdGlvbiBQQ0kgY2FyZDogRHVhbCBVMlcgU0NTSSwgZHVhbCAxMC8xMDBUWCwgZ3JhcGhpY3MKLQkJMTNlOSAxMDAwICA2MjIxTC00VQotCTAwMGMgIDUzYzg5NQotCQkxMDAwIDEwMTAgIExTSTg5NTFVIFBDSSB0byBVbHRyYTIgU0NTSSBob3N0IGFkYXB0ZXIKLQkJMTAwMCAxMDIwICBMU0k4OTUyVSBQQ0kgdG8gVWx0cmEyIFNDU0kgaG9zdCBhZGFwdGVyCi0JCTFkZTEgMzkwNiAgREMtMzkwVTJCIFNDU0kgYWRhcHRlcgotCQkxZGUxIDM5MDcgIERDLTM5MFUyVwotCTAwMGQgIDUzYzg4NQotCTAwMGYgIDUzYzg3NQotCQkwZTExIDcwMDQgIEVtYmVkZGVkIFVsdHJhIFdpZGUgU0NTSSBDb250cm9sbGVyCi0JCTEwMDAgMTAwMCAgTFNJNTNDODc2L0UgUENJIHRvIER1YWwgQ2hhbm5lbCBTQ1NJIENvbnRyb2xsZXIKLQkJMTAwMCAxMDEwICBMU0kyMjgwMSBQQ0kgdG8gRHVhbCBDaGFubmVsIFVsdHJhIFNDU0kgaG9zdCBhZGFwdGVyCi0JCTEwMDAgMTAyMCAgTFNJMjI4MDIgUENJIHRvIER1YWwgQ2hhbm5lbCBVbHRyYSBTQ1NJIGhvc3QgYWRhcHRlcgotCQkxMDkyIDg3NjAgIEZpcmVQb3J0IDQwIER1YWwgU0NTSSBDb250cm9sbGVyCi0JCTFkZTEgMzkwNCAgREMzOTBGL1UgVWx0cmEgV2lkZSBTQ1NJIEFkYXB0ZXIKLQkJNGM1MyAxMDAwICBDQzcvQ1I3L0NQNy9WQzcvVlA3L1ZSNyBtYWluYm9hcmQKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JMDAxMCAgNTNDMTUxMAotCQkwZTExIDQwNDAgIEludGVncmF0ZWQgQXJyYXkgQ29udHJvbGxlcgotCQkwZTExIDQwNDggIFJBSUQgTEMyIENvbnRyb2xsZXIKLQkJMTAwMCAxMDAwICA1M0MxNTEwIFBDSSB0byBEdWFsIENoYW5uZWwgV2lkZSBVbHRyYTIgU0NTSSBDb250cm9sbGVyIChJbnRlbGxpZ2VudCBtb2RlKQotCTAwMTIgIDUzYzg5NWEKLQkJMTAwMCAxMDAwICBMU0k1M0M4OTVBIFBDSSB0byBVbHRyYTIgU0NTSSBDb250cm9sbGVyCi0JMDAxMyAgNTNjODc1YQotCQkxMDAwIDEwMDAgIExTSTUzQzg3NUEgUENJIHRvIFVsdHJhIFNDU0kgQ29udHJvbGxlcgotCTAwMjAgIDUzYzEwMTAgVWx0cmEzIFNDU0kgQWRhcHRlcgotCQkxMDAwIDEwMDAgIExTSTUzQzEwMTAtMzMgUENJIHRvIER1YWwgQ2hhbm5lbCBVbHRyYTE2MCBTQ1NJIENvbnRyb2xsZXIKLQkJMWRlMSAxMDIwICBEQy0zOTBVM1cKLQkwMDIxICA1M2MxMDEwIDY2TUh6ICBVbHRyYTMgU0NTSSBBZGFwdGVyCi0JCTEwMDAgMTAwMCAgTFNJNTNDMTAwMC8xMDAwUi8xMDEwUi8xMDEwLTY2IFBDSSB0byBVbHRyYTE2MCBTQ1NJIENvbnRyb2xsZXIKLQkJMTAwMCAxMDEwICBBc3VzIFRSLURMUyBvbmJvYXJkIDUzQzEwMTAtNjYKLQkJMTI0YiAxMDcwICBQTUMtVVNDU0kzCi0JCTRjNTMgMTA4MCAgQ1Q4IG1haW5ib2FyZAotCQk0YzUzIDEzMDAgIFAwMTcgbWV6emFuaW5lICgzMi1iaXQgUE1DKQotCQk0YzUzIDEzMTAgIFAwMTcgbWV6emFuaW5lICg2NC1iaXQgUE1DKQotCTAwMzAgIDUzYzEwMzAgUENJLVggRnVzaW9uLU1QVCBEdWFsIFVsdHJhMzIwIFNDU0kKLQkJMTAyOCAwMTIzICBQb3dlckVkZ2UgMjYwMAotCQkxMDI4IDAxNGEgIFBvd2VyRWRnZSAxNzUwCi0JCTEwMjggMDE2YyAgUG93ZXJFZGdlIDE4NTAgTVBUIEZ1c2lvbiBTQ1NJL1JBSUQgKFBlcmMgNCkKLQkJMTAyOCAwMTgzICBQb3dlckVkZ2UgMTgwMAotCQkxMDI4IDEwMTAgIExTSSBVMzIwIFNDU0kgQ29udHJvbGxlcgotCTAwMzEgIDUzYzEwMzBaQyBQQ0ktWCBGdXNpb24tTVBUIER1YWwgVWx0cmEzMjAgU0NTSQotCTAwMzIgIDUzYzEwMzUgUENJLVggRnVzaW9uLU1QVCBEdWFsIFVsdHJhMzIwIFNDU0kKLQkJMTAwMCAxMDAwICBMU0k1M0MxMDIwLzEwMzAgUENJLVggdG8gVWx0cmEzMjAgU0NTSSBDb250cm9sbGVyCi0JMDAzMyAgMTAzMFpDXzUzYzEwMzUgUENJLVggRnVzaW9uLU1QVCBEdWFsIFVsdHJhMzIwIFNDU0kKLQkwMDQwICA1M2MxMDM1IFBDSS1YIEZ1c2lvbi1NUFQgRHVhbCBVbHRyYTMyMCBTQ1NJCi0JCTEwMDAgMDAzMyAgTWVnYVJBSUQgU0NTSSAzMjAtMlhSCi0JCTEwMDAgMDA2NiAgTWVnYVJBSUQgU0NTSSAzMjAtMlhSV1MKLQkwMDQxICA1M0MxMDM1WkMgUENJLVggRnVzaW9uLU1QVCBEdWFsIFVsdHJhMzIwIFNDU0kKLQkwMDhmICA1M2M4NzVKCi0JCTEwOTIgODAwMCAgRmlyZVBvcnQgNDAgU0NTSSBDb250cm9sbGVyCi0JCTEwOTIgODc2MCAgRmlyZVBvcnQgNDAgRHVhbCBTQ1NJIEhvc3QgQWRhcHRlcgotCTA0MDcgIE1lZ2FSQUlECi0JCTEwMDAgMDUzMCAgTWVnYVJBSUQgNTMwIFNDU0kgMzIwLTBYIFJBSUQgQ29udHJvbGxlcgotCQkxMDAwIDA1MzEgIE1lZ2FSQUlEIDUzMSBTQ1NJIDMyMC00WCBSQUlEIENvbnRyb2xsZXIKLQkJMTAwMCAwNTMyICBNZWdhUkFJRCA1MzIgU0NTSSAzMjAtMlggUkFJRCBDb250cm9sbGVyCi0JCTEwMjggMDUzMSAgUG93ZXJFZGdlIEV4cGFuZGFibGUgUkFJRCBDb250cm9sbGVyIDQvUUMKLQkJMTAyOCAwNTMzICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIENvbnRyb2xsZXIgNC9RQwotCQk4MDg2IDA1MzAgIE1lZ2FSQUlEIEludGVsIFJBSUQgQ29udHJvbGxlciBTUkNaQ1JYCi0JCTgwODYgMDUzMiAgTWVnYVJBSUQgSW50ZWwgUkFJRCBDb250cm9sbGVyIFNSQ1U0MlgKLQkwNDA4ICBNZWdhUkFJRAotCQkxMDAwIDAwMDEgIE1lZ2FSQUlEIFNDU0kgMzIwLTFFIFJBSUQgQ29udHJvbGxlcgotCQkxMDAwIDAwMDIgIE1lZ2FSQUlEIFNDU0kgMzIwLTJFIFJBSUQgQ29udHJvbGxlcgotCQkxMDI1IDAwNGQgIE1lZ2FSQUlEIEFDRVIgUk9NQi0yRSBSQUlEIENvbnRyb2xsZXIKLQkJMTAyOCAwMDAxICBQb3dlckVkZ2UgUkFJRCBDb250cm9sbGVyIFBFUkM0ZS9TQwotCQkxMDI4IDAwMDIgIFBvd2VyRWRnZSBSQUlEIENvbnRyb2xsZXIgUEVSQzRlL0RDCi0JCTE3MzQgMTA2NSAgRlNDIE1lZ2FSQUlEIFBDSSBFeHByZXNzIFJPTUIKLQkJODA4NiAwMDAyICBNZWdhUkFJRCBJbnRlbCBSQUlEIENvbnRyb2xsZXIgU1JDVTQyRQotCTA0MDkgIE1lZ2FSQUlECi0JCTEwMDAgMzAwNCAgTWVnYVJBSUQgU0FUQSAzMDAtNFggUkFJRCBDb250cm9sbGVyCi0JCTEwMDAgMzAwOCAgTWVnYVJBSUQgU0FUQSAzMDAtOFggUkFJRCBDb250cm9sbGVyCi0JCTgwODYgMzAwOCAgTWVnYVJBSUQgUkFJRCBDb250cm9sbGVyIFNSQ1MyOFgKLQkJODA4NiAzNDMxICBNZWdhUkFJRCBSQUlEIENvbnRyb2xsZXIgQWxpZWYgU1JPTUJVNDJFCi0JCTgwODYgMzQ5OSAgTWVnYVJBSUQgUkFJRCBDb250cm9sbGVyIEhhcndpY2ggU1JPTUJVNDJFCi0JMDYyMSAgRkM5MDkgRmlicmUgQ2hhbm5lbCBBZGFwdGVyCi0JMDYyMiAgRkM5MjkgRmlicmUgQ2hhbm5lbCBBZGFwdGVyCi0JCTEwMDAgMTAyMCAgNDQ5MjkgTyBEdWFsIEZpYnJlIENoYW5uZWwgY2FyZAotCTA2MjMgIEZDOTI5IExBTgotCTA2MjQgIEZDOTE5IEZpYnJlIENoYW5uZWwgQWRhcHRlcgotCTA2MjUgIEZDOTE5IExBTgotCTA2MjYgIEZDOTI5WCBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQkJMTAwMCAxMDEwICA3MjAyLVhQLUxDIER1YWwgRmlicmUgQ2hhbm5lbCBjYXJkCi0JMDYyNyAgRkM5MjlYIExBTgotCTA2MjggIEZDOTE5WCBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQkwNjI5ICBGQzkxOVggTEFOCi0JMDcwMSAgODNDODg1IE5UNTAgRGlnaXRhbFNjYXBlIEZhc3QgRXRoZXJuZXQKLQkwNzAyICBZZWxsb3dmaW4gRy1OSUMgZ2lnYWJpdCBldGhlcm5ldAotCQkxMzE4IDAwMDAgIFBFSTEwMFgKLQkwODA0ICBTQTIwMTAKLQkwODA1ICBTQTIwMTBaQwotCTA4MDYgIFNBMjAyMAotCTA4MDcgIFNBMjAyMFpDCi0JMDkwMSAgNjFDMTAyCi0JMTAwMCAgNjNDODE1Ci0JMTk2MCAgTWVnYVJBSUQKLQkJMTAwMCAwNTE4ICBNZWdhUkFJRCA1MTggU0NTSSAzMjAtMiBDb250cm9sbGVyCi0JCTEwMDAgMDUyMCAgTWVnYVJBSUQgNTIwIFNDU0kgMzIwLTEgQ29udHJvbGxlcgotCQkxMDAwIDA1MjIgIE1lZ2FSQUlEIDUyMiBpNCAxMzMgUkFJRCBDb250cm9sbGVyCi0JCTEwMDAgMDUyMyAgTWVnYVJBSUQgU0FUQSAxNTAtNiBSQUlEIENvbnRyb2xsZXIKLQkJMTAwMCA0NTIzICBNZWdhUkFJRCBTQVRBIDE1MC00IFJBSUQgQ29udHJvbGxlcgotCQkxMDAwIGE1MjAgIE1lZ2FSQUlEIFpDUiBTQ1NJIDMyMC0wIENvbnRyb2xsZXIKLQkJMTAyOCAwNTE4ICBNZWdhUkFJRCA1MTggREVMTCBQRVJDIDQvREMgUkFJRCBDb250cm9sbGVyCi0JCTEwMjggMDUyMCAgTWVnYVJBSUQgNTIwIERFTEwgUEVSQyA0L1NDIFJBSUQgQ29udHJvbGxlcgotCQkxMDI4IDA1MzEgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciA0L1FDCi0JCTEwMjggMDUzMyAgUG93ZXJFZGdlIEV4cGFuZGFibGUgUkFJRCBDb250cm9sbGVyIDQvUUMKLQkJODA4NiAwNTIwICBNZWdhUkFJRFJBSUQgQ29udHJvbGxlciBTUkNVNDFMCi0JCTgwODYgMDUyMyAgTWVnYVJBSUQgUkFJRCBDb250cm9sbGVyIFNSQ1MxNgotMTAwMSAgS29sdGVyIEVsZWN0cm9uaWMKLQkwMDEwICBQQ0kgMTYxNiBNZWFzdXJlbWVudCBjYXJkIHdpdGggMzIgZGlnaXRhbCBJL08gbGluZXMKLQkwMDExICBPUFRPLVBDSSBPcHRvLUlzb2xhdGVkIGRpZ2l0YWwgSS9PIGJvYXJkCi0JMDAxMiAgUENJLUFEL0RBIEFuYWxvZ3VlIEkvTyBib2FyZAotCTAwMTMgIFBDSS1PUFRPLVJFTEFJUyBEaWdpdGFsIEkvTyBib2FyZCB3aXRoIHJlbGF5IG91dHB1dHMKLQkwMDE0ICBQQ0ktQ291bnRlci9UaW1lciBDb3VudGVyIFRpbWVyIGJvYXJkCi0JMDAxNSAgUENJLURBQzQxNiBBbmFsb2d1ZSBvdXRwdXQgYm9hcmQKLQkwMDE2ICBQQ0ktTUZCIEFuYWxvZ3VlIEkvTyBib2FyZAotCTAwMTcgIFBST1RPLTMgUENJIFByb3RvdHlwaW5nIGJvYXJkCi0JOTEwMCAgSU5JLTkxMDAvOTEwMFcgU0NTSSBIb3N0Ci0xMDAyICBBVEkgVGVjaG5vbG9naWVzIEluYwotCTMxNTAgIE0yNCAxUCBbUmFkZW9uIE1vYmlsaXR5IFg2MDBdCi0JMzE1NCAgTTI0IDFUIFtGaXJlR0wgTTI0IEdMXQotCTNlNTAgIFJWMzgwIDB4M2U1MCBbUmFkZW9uIFg2MDBdCi0JM2U1NCAgUlYzODAgMHgzZTU0IFtGaXJlR0wgVjMyMDBdCi0JM2U3MCAgUlYzODAgW1JhZGVvbiBYNjAwXSBTZWNvbmRhcnkKLQk0MTM2ICBSYWRlb24gSUdQIDMyMCBNCi0JNDEzNyAgUmFkZW9uIElHUDMzMC8zNDAvMzUwCi0JNDE0NCAgUjMwMCBBRCBbUmFkZW9uIDk1MDAgUHJvXQotIyBOZXcgUENJIElEIHByb3ZpZGVkIGJ5IEFUSSBkZXZlbG9wZXIgcmVsYXRpb25zIChjb3JyZWN0aW9uIHRvIGFib3ZlKQotCTQxNDUgIFIzMDAgQUUgW1JhZGVvbiA5NzAwIFByb10KLSMgTmV3IFBDSSBJRCBwcm92aWRlZCBieSBBVEkgZGV2ZWxvcGVyIHJlbGF0aW9ucyAob29wcywgY29ycmVjdGlvbiB0byBhYm92ZSkKLQk0MTQ2ICBSMzAwIEFGIFtSYWRlb24gOTcwMCBQcm9dCi0JNDE0NyAgUjMwMCBBRyBbRmlyZUdMIFoxL1gxXQotCTQxNDggIFIzNTAgQUggW1JhZGVvbiA5ODAwXQotCTQxNDkgIFIzNTAgQUkgW1JhZGVvbiA5ODAwXQotCTQxNGEgIFIzNTAgQUogW1JhZGVvbiA5ODAwXQotCTQxNGIgIFIzNTAgQUsgW0ZpcmUgR0wgWDJdCi0jIE5ldyBQQ0kgSUQgcHJvdmlkZWQgYnkgQVRJIGRldmVsb3BlciByZWxhdGlvbnMKLQk0MTUwICBSVjM1MCBBUCBbUmFkZW9uIDk2MDBdCi0JCTEwMDIgMDAwMiAgUjk2MDAgUHJvIHByaW1hcnkgKEFzdXMgT0VNIGZvciBIUCkKLQkJMTAwMiAwMDAzICBSOTYwMCBQcm8gc2Vjb25kYXJ5IChBc3VzIE9FTSBmb3IgSFApCi0JCTE0NTggNDAyNCAgR2lnYS1CeXRlIEdWLVI5NjEyOEQgUHJpbWFyeQotCQkxNDhjIDIwNjQgIFBvd2VyQ29sb3IgUjk2QS1DM04KLQkJMTQ4YyAyMDY2ICBQb3dlckNvbG9yIFI5NkEtQzNOCi0JCTE3NGIgN2MxOSAgU2FwcGhpcmUgQXRsYW50aXMgUmFkZW9uIDk2MDAgUHJvCi0JCTE3NGIgN2MyOSAgR0MtUjk2MDBQUk8gUHJpbWFyeSBbU2FwcGhpcmVdCi0JCTE3ZWUgMjAwMiAgUmFkZW9uIDk2MDAgMjU2TWIgUHJpbWFyeQotCQkxOGJjIDAxMDEgIEdDLVI5NjAwUFJPIFByaW1hcnkKLSMgTmV3IFBDSSBJRCBwcm92aWRlZCBieSBBVEkgZGV2ZWxvcGVyIHJlbGF0aW9ucwotCTQxNTEgIFJWMzUwIEFRIFtSYWRlb24gOTYwMF0KLQkJMTA0MyBjMDA0ICBBOTYwMFNFCi0jIE5ldyBQQ0kgSUQgcHJvdmlkZWQgYnkgQVRJIGRldmVsb3BlciByZWxhdGlvbnMKLQk0MTUyICBSVjM1MCBBUiBbUmFkZW9uIDk2MDBdCi0JCTEwMDIgMDAwMiAgUmFkZW9uIDk2MDBYVAotCQkxMDQzIGMwMDIgIFJhZGVvbiA5NjAwIFhUIFRWRAotCQkxNzRiIDdjMjkgIFNhcHBoaXJlIFJhZGVvbiA5NjAwWFQKLQkJMTc4NyA0MDAyICBSYWRlb24gOTYwMCBYVAotCTQxNTMgIFJWMzUwIEFTIFtSYWRlb24gOTYwMCBBU10KLQk0MTU0ICBSVjM1MCBBVCBbRmlyZSBHTCBUMl0KLQk0MTU1ICBSVjM1MCBBVSBbRmlyZSBHTCBUMl0KLQk0MTU2ICBSVjM1MCBBViBbRmlyZSBHTCBUMl0KLQk0MTU3ICBSVjM1MCBBVyBbRmlyZSBHTCBUMl0KLQk0MTU4ICA2ODgwMEFYIFtNYWNoMzJdCi0jIFRoZSBQQ0kgSUQgaXMgdW5yZWxhdGVkIHRvIGFueSBEVkkgb3V0cHV0LgotCTQxNjQgIFIzMDAgQUQgW1JhZGVvbiA5NTAwIFByb10gKFNlY29uZGFyeSkKLSMgTmV3IFBDSSBJRCBpbmZvIHByb3ZpZGVkIGJ5IEFUSSBkZXZlbG9wZXIgcmVsYXRpb25zCi0JNDE2NSAgUjMwMCBBRSBbUmFkZW9uIDk3MDAgUHJvXSAoU2Vjb25kYXJ5KQotIyBOZXcgUENJIElEIGluZm8gcHJvdmlkZWQgYnkgQVRJIGRldmVsb3BlciByZWxhdGlvbnMKLQk0MTY2ICBSMzAwIEFGIFtSYWRlb24gOTcwMCBQcm9dIChTZWNvbmRhcnkpCi0jIE5ldyBQQ0kgSUQgcHJvdmlkZWQgYnkgQVRJIGRldmVsb3BlciByZWxhdGlvbnMKLQk0MTY4ICBSYWRlb24gUjM1MCBbUmFkZW9uIDk4MDBdIChTZWNvbmRhcnkpCi0jIE5ldyBQQ0kgSUQgcHJvdmlkZWQgYnkgQVRJIGRldmVsb3BlciByZWxhdGlvbnMgKGNvcnJlY3Rpb24gdG8gYWJvdmUpCi0JNDE3MCAgUlYzNTAgQVAgW1JhZGVvbiA5NjAwXSAoU2Vjb25kYXJ5KQotCQkxNDU4IDQwMjUgIEdpZ2EtQnl0ZSBHVi1SOTYxMjhEIFNlY29uZGFyeQotCQkxNDhjIDIwNjcgIFBvd2VyQ29sb3IgUjk2QS1DM04gKFNlY29uZGFyeSkKLQkJMTc0YiA3YzI4ICBHQy1SOTYwMFBSTyBTZWNvbmRhcnkgW1NhcHBoaXJlXQotCQkxN2VlIDIwMDMgIFJhZGVvbiA5NjAwIDI1Nk1iIFNlY29uZGFyeQotCQkxOGJjIDAxMDAgIEdDLVI5NjAwUFJPIFNlY29uZGFyeQotIyBOZXcgUENJIElEIHByb3ZpZGVkIGJ5IEFUSSBkZXZlbG9wZXIgcmVsYXRpb25zIChjb3JyZWN0aW9uIHRvIGFib3ZlKQotCTQxNzEgIFJWMzUwIEFRIFtSYWRlb24gOTYwMF0gKFNlY29uZGFyeSkKLQkJMTA0MyBjMDA1ICBBOTYwMFNFIChTZWNvbmRhcnkpCi0jIE5ldyBQQ0kgSUQgcHJvdmlkZWQgYnkgQVRJIGRldmVsb3BlciByZWxhdGlvbnMgKGNvcnJlY3Rpb24gdG8gYWJvdmUpCi0JNDE3MiAgUlYzNTAgQVIgW1JhZGVvbiA5NjAwXSAoU2Vjb25kYXJ5KQotCQkxMDAyIDAwMDMgIFJhZGVvbiA5NjAwWFQgKFNlY29uZGFyeSkKLQkJMTA0MyBjMDAzICBBOTYwMFhUIChTZWNvbmRhcnkpCi0JCTE3NGIgN2MyOCAgU2FwcGhpcmUgUmFkZW9uIDk2MDBYVCAoU2Vjb25kYXJ5KQotCQkxNzg3IDQwMDMgIFJhZGVvbiA5NjAwIFhUIChTZWNvbmRhcnkpCi0JNDE3MyAgUlYzNTAgPz8gW1JhZGVvbiA5NTUwXSAoU2Vjb25kYXJ5KQotCTQyMzcgIFJhZGVvbiA3MDAwIElHUAotCTQyNDIgIFIyMDAgQkIgW1JhZGVvbiBBbGwgaW4gV29uZGVyIDg1MDBEVl0KLQkJMTAwMiAwMmFhICBSYWRlb24gODUwMCBBSVcgRFYgRWRpdGlvbgotCTQyNDMgIFIyMDAgQkMgW1JhZGVvbiBBbGwgaW4gV29uZGVyIDg1MDBdCi0JNDMzNiAgUmFkZW9uIE1vYmlsaXR5IFUxCi0JCTEwM2MgMDAyNCAgUGF2aWxpb24gemU0NDAwIGJ1aWx0aW4gVmlkZW8KLQk0MzM3ICBSYWRlb24gSUdQIDMzME0vMzQwTS8zNTBNCi0JCTEwMTQgMDUzYSAgVGhpbmtQYWQgUjQwZSAoMjY4NC1IVkcpIGJ1aWx0aW4gVkdBIGNvbnRyb2xsZXIKLQkJMTAzYyAwODUwICBSYWRlb24gSUdQIDM0NU0KLQk0MzQxICBJWFAxNTAgQUMnOTcgQXVkaW8gQ29udHJvbGxlcgotCTQzNDUgIEVIQ0kgVVNCIENvbnRyb2xsZXIKLQk0MzQ3ICBPSENJIFVTQiBDb250cm9sbGVyICMxCi0JNDM0OCAgT0hDSSBVU0IgQ29udHJvbGxlciAjMgotCTQzNDkgIEFUSSBEdWFsIENoYW5uZWwgQnVzIE1hc3RlciBQQ0kgSURFIENvbnRyb2xsZXIKLQk0MzRkICBJWFAgQUMnOTcgTW9kZW0KLQk0MzUzICBBVEkgU01CdXMKLQk0MzU0ICAyMTVDVCBbTWFjaDY0IENUXQotCTQzNTggIDIxMDg4OENYIFtNYWNoNjQgQ1hdCi0JNDM2MyAgQVRJIFNNQnVzCi0JNDM2ZSAgQVRJIDQzNkUgU2VyaWFsIEFUQSBDb250cm9sbGVyCi0JNDM3MiAgQVRJIFNNQnVzCi0JNDM3NiAgU3RhbmRhcmQgRHVhbCBDaGFubmVsIFBDSSBJREUgQ29udHJvbGxlciBBVEkKLQk0Mzc5ICBBVEkgNDM3OSBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQk0MzdhICBBVEkgNDM3QSBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQk0NDM3ICBSYWRlb24gTW9iaWxpdHkgNzAwMCBJR1AKLQk0NTU0ICAyMTA4ODhFVCBbTWFjaDY0IEVUXQotCTQ2NTQgIE1hY2g2NCBWVAotCTQ3NDIgIDNEIFJhZ2UgUHJvIEFHUCAxWC8yWAotCQkxMDAyIDAwNDAgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDAyIDAwNDQgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDAyIDAwNjEgIFJhZ2UgUHJvIEFJVyBBR1AgMlgKLQkJMTAwMiAwMDYyICBSYWdlIFBybyBBSVcgQUdQIDJYCi0JCTEwMDIgMDA2MyAgUmFnZSBQcm8gQUlXIEFHUCAyWAotCQkxMDAyIDAwODAgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDAyIDAwODQgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDAyIDQ3NDIgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDAyIDgwMDEgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDI4IDAwODIgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDI4IDQwODIgIE9wdGlwbGV4IEdYMSBPbmJvYXJkIERpc3BsYXkgQWRhcHRlcgotCQkxMDI4IDgwODIgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDI4IGMwODIgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQk4MDg2IDQxNTIgIFhwZXJ0IDk4RCBBR1AgMlgKLQkJODA4NiA0NjRhICBSYWdlIFBybyBUdXJibyBBR1AgMlgKLQk0NzQ0ICAzRCBSYWdlIFBybyBBR1AgMVgKLQkJMTAwMiA0NzQ0ICBSYWdlIFBybyBUdXJibyBBR1AKLQk0NzQ3ICAzRCBSYWdlIFBybwotCTQ3NDkgIDNEIFJhZ2UgUHJvCi0JCTEwMDIgMDA2MSAgUmFnZSBQcm8gQUlXCi0JCTEwMDIgMDA2MiAgUmFnZSBQcm8gQUlXCi0JNDc0YyAgUmFnZSBYQwotCTQ3NGQgIFJhZ2UgWEwgQUdQIDJYCi0JCTEwMDIgMDAwNCAgWHBlcnQgOTggUlhMIEFHUCAyWAotCQkxMDAyIDAwMDggIFhwZXJ0IDk4IFJYTCBBR1AgMlgKLQkJMTAwMiAwMDgwICBSYWdlIFhMIEFHUCAyWAotCQkxMDAyIDAwODQgIFhwZXJ0IDk4IEFHUCAyWAotCQkxMDAyIDQ3NGQgIFJhZ2UgWEwgQUdQCi0JCTEwMzMgODA2YSAgUmFnZSBYTCBBR1AKLQk0NzRlICBSYWdlIFhDIEFHUAotCQkxMDAyIDQ3NGUgIFJhZ2UgWEMgQUdQCi0JNDc0ZiAgUmFnZSBYTAotCQkxMDAyIDAwMDggIFJhZ2UgWEwKLQkJMTAwMiA0NzRmICBSYWdlIFhMCi0JNDc1MCAgM0QgUmFnZSBQcm8gMjE1R1AKLQkJMTAwMiAwMDQwICBSYWdlIFBybyBUdXJibwotCQkxMDAyIDAwNDQgIFJhZ2UgUHJvIFR1cmJvCi0JCTEwMDIgMDA4MCAgUmFnZSBQcm8gVHVyYm8KLQkJMTAwMiAwMDg0ICBSYWdlIFBybyBUdXJibwotCQkxMDAyIDQ3NTAgIFJhZ2UgUHJvIFR1cmJvCi0JNDc1MSAgM0QgUmFnZSBQcm8gMjE1R1EKLQk0NzUyICBSYWdlIFhMCi0JCTEwMDIgMDAwOCAgUmFnZSBYTAotCQkxMDAyIDQ3NTIgIFJhZ2UgWEwKLQkJMTAwMiA4MDA4ICBSYWdlIFhMCi0JCTEwMjggMDBjZSAgUG93ZXJFZGdlIDE0MDAKLQkJMTAyOCAwMGQxICBQb3dlckVkZ2UgMjU1MAotCQkxMDI4IDAwZDkgIFBvd2VyRWRnZSAyNTAwCi0JCTgwODYgMzQxMSAgU0RTMiBNYWluYm9hcmQKLQkJODA4NiAzNDI3ICBTODc1V1AxLUUgbWFpbmJvYXJkCi0JNDc1MyAgUmFnZSBYQwotCQkxMDAyIDQ3NTMgIFJhZ2UgWEMKLQk0NzU0ICAzRCBSYWdlIEkvSUkgMjE1R1QgW01hY2g2NCBHVF0KLQk0NzU1ICAzRCBSYWdlIElJKyAyMTVHVEIgW01hY2g2NCBHVEJdCi0JNDc1NiAgM0QgUmFnZSBJSUMgMjE1SUlDIFtNYWNoNjQgR1QgSUlDXQotCQkxMDAyIDQ3NTYgIFJhZ2UgSUlDCi0JNDc1NyAgM0QgUmFnZSBJSUMgQUdQCi0JCTEwMDIgNDc1NyAgUmFnZSBJSUMgQUdQCi0JCTEwMjggMDA4OSAgUmFnZSAzRCBJSUMKLQkJMTAyOCA0MDgyICBSYWdlIDNEIElJQwotCQkxMDI4IDgwODIgIFJhZ2UgM0QgSUlDCi0JCTEwMjggYzA4MiAgUmFnZSAzRCBJSUMKLQk0NzU4ICAyMTA4ODhHWCBbTWFjaDY0IEdYXQotCTQ3NTkgIDNEIFJhZ2UgSUlDCi0JNDc1YSAgM0QgUmFnZSBJSUMgQUdQCi0JCTEwMDIgMDA4NCAgUmFnZSAzRCBQcm8gQUdQIDJ4IFhQRVJUIDk4Ci0JCTEwMDIgMDA4NyAgUmFnZSAzRCBJSUMKLQkJMTAwMiA0NzVhICBSYWdlIElJQyBBR1AKLQk0OTY0ICBSYWRlb24gUlYyNTAgSWQgW1JhZGVvbiA5MDAwXQotCTQ5NjUgIFJhZGVvbiBSVjI1MCBJZSBbUmFkZW9uIDkwMDBdCi0JNDk2NiAgUmFkZW9uIFJWMjUwIElmIFtSYWRlb24gOTAwMF0KLQkJMTBmMSAwMDAyICBSVjI1MCBJZiBbVGFjaHlvbiBHOTAwMCBQUk9dCi0JCTE0OGMgMjAzOSAgUlYyNTAgSWYgW1JhZGVvbiA5MDAwIFBybyAiRXZpbCBDb21tYW5kbyJdCi0JCTE1MDkgOWEwMCAgUlYyNTAgSWYgW1JhZGVvbiA5MDAwICJBVDAwOSJdCi0jIE5ldyBzdWJkZXZpY2UgLSAzRCBQcm9waGV0IDkwMDAgUENJIGJ5IEhlcmN1bGVzLiBBR1AgdmVyc2lvbiBwcm9iYWJseSB3b3VsZCBoYXZlIHNhbWUgSUQsIHNvIG5vdCBzcGVjaWZpZWQuCi0JCTE2ODEgMDA0MCAgUlYyNTAgSWYgWzNEIHByb3BoZXQgOTAwMF0KLQkJMTc0YiA3MTc2ICBSVjI1MCBJZiBbU2FwcGhpcmUgUmFkZW9uIDkwMDAgUHJvXQotCQkxNzRiIDcxOTIgIFJWMjUwIElmIFtSYWRlb24gOTAwMCAiQXRsYW50aXMiXQotCQkxN2FmIDIwMDUgIFJWMjUwIElmIFtFeGNhbGlidXIgUmFkZW9uIDkwMDAgUHJvXQotCQkxN2FmIDIwMDYgIFJWMjUwIElmIFtFeGNhbGlidXIgUmFkZW9uIDkwMDBdCi0JNDk2NyAgUmFkZW9uIFJWMjUwIElnIFtSYWRlb24gOTAwMF0KLQk0OTZlICBSYWRlb24gUlYyNTAgW1JhZGVvbiA5MDAwXSAoU2Vjb25kYXJ5KQotCTRhNDggIFI0MjAgSkggW1JhZGVvbiBYODAwXQotCTRhNDkgIFI0MjAgSkkgW1JhZGVvbiBYODAwUFJPXQotCTRhNGEgIFI0MjAgSkogW1JhZGVvbiBYODAwU0VdCi0JNGE0YiAgUjQyMCBKSyBbUmFkZW9uIFg4MDBdCi0JNGE0YyAgUjQyMCBKTCBbUmFkZW9uIFg4MDBdCi0JNGE0ZCAgUjQyMCBKTSBbRmlyZUdMIFgzXQotCTRhNGUgIE0xOCBKTiBbUmFkZW9uIE1vYmlsaXR5IDk4MDBdCi0JNGE1MCAgUjQyMCBKUCBbUmFkZW9uIFg4MDBYVF0KLQk0YTcwICBSNDIwIFtYODAwWFQtUEVdIChTZWNvbmRhcnkpCi0JNGM0MiAgM0QgUmFnZSBMVCBQcm8gQUdQLTEzMwotCQkwZTExIGIwZTcgIFJhZ2UgTFQgUHJvIChDb21wYXEgUHJlc2FyaW8gNTI0MCkKLQkJMGUxMSBiMGU4ICBSYWdlIDNEIExUIFBybwotCQkwZTExIGIxMGUgIDNEIFJhZ2UgTFQgUHJvIChDb21wYXEgQXJtYWRhIDE3NTApCi0JCTEwMDIgMDA0MCAgUmFnZSBMVCBQcm8gQUdQIDJYCi0JCTEwMDIgMDA0NCAgUmFnZSBMVCBQcm8gQUdQIDJYCi0JCTEwMDIgNGM0MiAgUmFnZSBMVCBQcm8gQUdQIDJYCi0JCTEwMDIgODAwMSAgUmFnZSBMVCBQcm8gQUdQIDJYCi0JCTEwMjggMDA4NSAgUmFnZSAzRCBMVCBQcm8KLQk0YzQ0ICAzRCBSYWdlIExUIFBybyBBR1AtNjYKLQk0YzQ1ICBSYWdlIE1vYmlsaXR5IE0zIEFHUAotCTRjNDYgIFJhZ2UgTW9iaWxpdHkgTTMgQUdQIDJ4Ci0JCTEwMjggMDBiMSAgTGF0aXR1ZGUgQzYwMAotCTRjNDcgIDNEIFJhZ2UgTFQtRyAyMTVMRwotCTRjNDkgIDNEIFJhZ2UgTFQgUHJvCi0JCTEwMDIgMDAwNCAgUmFnZSBMVCBQcm8KLQkJMTAwMiAwMDQwICBSYWdlIExUIFBybwotCQkxMDAyIDAwNDQgIFJhZ2UgTFQgUHJvCi0JCTEwMDIgNGM0OSAgUmFnZSBMVCBQcm8KLQk0YzRkICBSYWdlIE1vYmlsaXR5IFAvTSBBR1AgMngKLQkJMGUxMSBiMTExICBBcm1hZGEgTTcwMAotCQkwZTExIGIxNjAgIEFybWFkYSBFNTAwCi0JCTEwMDIgMDA4NCAgWHBlcnQgOTggQUdQIDJYIChNb2JpbGl0eSkKLQkJMTAxNCAwMTU0ICBUaGlua1BhZCBBMjBtCi0JCTEwMjggMDBhYSAgTGF0aXR1ZGUgQ1B0Ci0JCTEwMjggMDBiYiAgTGF0aXR1ZGUgQ1B4Ci0JNGM0ZSAgUmFnZSBNb2JpbGl0eSBMIEFHUCAyeAotCTRjNTAgIDNEIFJhZ2UgTFQgUHJvCi0JCTEwMDIgNGM1MCAgUmFnZSBMVCBQcm8KLQk0YzUxICAzRCBSYWdlIExUIFBybwotCTRjNTIgIFJhZ2UgTW9iaWxpdHkgUC9NCi0JCTEwMzMgODExMiAgVmVyc2EgTm90ZSBWWGkKLQk0YzUzICBSYWdlIE1vYmlsaXR5IEwKLQk0YzU0ICAyNjRMVCBbTWFjaDY0IExUXQotCTRjNTcgIFJhZGVvbiBNb2JpbGl0eSBNNyBMVyBbUmFkZW9uIE1vYmlsaXR5IDc1MDBdCi0JCTEwMTQgMDUxNyAgVGhpbmtQYWQgVDMwCi0JCTEwMjggMDBlNiAgUmFkZW9uIE1vYmlsaXR5IE03IExXIChEZWxsIEluc3Bpcm9uIDgxMDApCi0JCTEwMjggMDEyYSAgTGF0aXR1ZGUgQzY0MAotCQkxNDRkIGMwMDYgIFJhZGVvbiBNb2JpbGl0eSBNNyBMVyBpbiB2cHIgTWF0cml4IDE3MEI0Ci0JNGM1OCAgUmFkZW9uIFJWMjAwIExYIFtNb2JpbGl0eSBGaXJlR0wgNzgwMCBNN10KLQk0YzU5ICBSYWRlb24gTW9iaWxpdHkgTTYgTFkKLQkJMTAxNCAwMjM1ICBUaGlua1BhZCBBMzAvQTMwcCAoMjY1Mi8yNjUzKQotCQkxMDE0IDAyMzkgIFRoaW5rUGFkIFgyMi9YMjMvWDI0Ci0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JNGM1YSAgUmFkZW9uIE1vYmlsaXR5IE02IExaCi0JNGM2NCAgUmFkZW9uIFIyNTAgTGQgW1JhZGVvbiBNb2JpbGl0eSA5MDAwIE05XQotCTRjNjUgIFJhZGVvbiBSMjUwIExlIFtSYWRlb24gTW9iaWxpdHkgOTAwMCBNOV0KLQk0YzY2ICBSYWRlb24gUjI1MCBMZiBbRmlyZUdMIDkwMDBdCi0JNGM2NyAgUmFkZW9uIFIyNTAgTGcgW1JhZGVvbiBNb2JpbGl0eSA5MDAwIE05XQotIyBTZWNvbmRhcnkgY2hpcCB0byB0aGUgTGYKLQk0YzZlICBSYWRlb24gUjI1MCBMbiBbUmFkZW9uIE1vYmlsaXR5IDkwMDAgTTldIFtTZWNvbmRhcnldCi0JNGQ0NiAgUmFnZSBNb2JpbGl0eSBNNCBBR1AKLQk0ZDRjICBSYWdlIE1vYmlsaXR5IE00IEFHUAotCTRlNDQgIFJhZGVvbiBSMzAwIE5EIFtSYWRlb24gOTcwMCBQcm9dCi0JNGU0NSAgUmFkZW9uIFIzMDAgTkUgW1JhZGVvbiA5NTAwIFByb10KLQkJMTAwMiAwMDAyICBSYWRlb24gUjMwMCBORSBbUmFkZW9uIDk1MDAgUHJvXQotCQkxNjgxIDAwMDIgIEhlcmN1bGVzIDNEIFByb3BoZXQgOTUwMCBQUk8gW1JhZGVvbiA5NTAwIFByb10KLSMgTmV3IFBDSSBJRCBwcm92aWRlZCBieSBBVEkgZGV2ZWxvcGVyIHJlbGF0aW9ucyAoY29ycmVjdGlvbiB0byBhYm92ZSkKLQk0ZTQ2ICBSVjM1MCBORiBbUmFkZW9uIDk2MDBdCi0JNGU0NyAgUmFkZW9uIFIzMDAgTkcgW0ZpcmVHTCBYMV0KLSMgKGFkZGVkIHBybykKLQk0ZTQ4ICBSYWRlb24gUjM1MCBbUmFkZW9uIDk4MDAgUHJvXQotIyBOZXcgUENJIElEIHByb3ZpZGVkIGJ5IEFUSSBkZXZlbG9wZXIgcmVsYXRpb25zCi0JNGU0OSAgUmFkZW9uIFIzNTAgW1JhZGVvbiA5ODAwXQotCTRlNGEgIFJWMzUwIE5KIFtSYWRlb24gOTgwMCBYVF0KLQk0ZTRiICBSMzUwIE5LIFtGaXJlIEdMIFgyXQotIyBOZXcgUENJIElEIHByb3ZpZGVkIGJ5IEFUSSBkZXZlbG9wZXIgcmVsYXRpb25zCi0JNGU1MCAgUlYzNTAgW01vYmlsaXR5IFJhZGVvbiA5NjAwIE0xMF0KLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDNjIDA4OGMgIG5jODAwMCBsYXB0b3AKLQkJMTAzYyAwODkwICBuYzYwMDAgbGFwdG9wCi0JCTE3MzQgMTA1NSAgQW1pbG8gTTE0MjBXCi0JNGU1MSAgTTEwIE5RIFtSYWRlb24gTW9iaWxpdHkgOTYwMF0KLQk0ZTUyICBSVjM1MCBbTW9iaWxpdHkgUmFkZW9uIDk2MDAgTTEwXQotCTRlNTMgIE0xMCBOUyBbUmFkZW9uIE1vYmlsaXR5IDk2MDBdCi0JNGU1NCAgTTEwIE5UIFtGaXJlR0wgTW9iaWxpdHkgVDJdCi0JNGU1NiAgTTExIE5WIFtGaXJlR0wgTW9iaWxpdHkgVDJlXQotCTRlNjQgIFJhZGVvbiBSMzAwIFtSYWRlb24gOTcwMCBQcm9dIChTZWNvbmRhcnkpCi0JNGU2NSAgUmFkZW9uIFIzMDAgW1JhZGVvbiA5NTAwIFByb10gKFNlY29uZGFyeSkKLQkJMTAwMiAwMDAzICBSYWRlb24gUjMwMCBORSBbUmFkZW9uIDk1MDAgUHJvXQotCQkxNjgxIDAwMDMgIEhlcmN1bGVzIDNEIFByb3BoZXQgOTUwMCBQUk8gW1JhZGVvbiA5NTAwIFByb10gKFNlY29uZGFyeSkKLSMgTmV3IFBDSSBJRCBwcm92aWRlZCBieSBBVEkgZGV2ZWxvcGVyIHJlbGF0aW9ucyAoY29ycmVjdGlvbiB0byBhYm92ZSkKLQk0ZTY2ICBSVjM1MCBORiBbUmFkZW9uIDk2MDBdIChTZWNvbmRhcnkpCi0JNGU2NyAgUmFkZW9uIFIzMDAgW0ZpcmVHTCBYMV0gKFNlY29uZGFyeSkKLSMgKGFkZGVkIHBybykKLQk0ZTY4ICBSYWRlb24gUjM1MCBbUmFkZW9uIDk4MDAgUHJvXSAoU2Vjb25kYXJ5KQotIyBOZXcgUENJIElEIHByb3ZpZGVkIGJ5IEFUSSBkZXZlbG9wZXIgcmVsYXRpb25zCi0JNGU2OSAgUmFkZW9uIFIzNTAgW1JhZGVvbiA5ODAwXSAoU2Vjb25kYXJ5KQotCTRlNmEgIFJWMzUwIE5KIFtSYWRlb24gOTgwMCBYVF0gKFNlY29uZGFyeSkKLQkJMTAwMiA0ZTcxICBBVEkgVGVjaG5vbG9naWVzIEluYyBNMTAgTlEgW1JhZGVvbiBNb2JpbGl0eSA5NjAwXQotCTUwNDEgIFJhZ2UgMTI4IFBBL1BSTwotCTUwNDIgIFJhZ2UgMTI4IFBCL1BSTyBBR1AgMngKLQk1MDQzICBSYWdlIDEyOCBQQy9QUk8gQUdQIDR4Ci0JNTA0NCAgUmFnZSAxMjggUEQvUFJPIFRNRFMKLQkJMTAwMiAwMDI4ICBSYWdlIDEyOCBBSVcKLQkJMTAwMiAwMDI5ICBSYWdlIDEyOCBBSVcKLQk1MDQ1ICBSYWdlIDEyOCBQRS9QUk8gQUdQIDJ4IFRNRFMKLQk1MDQ2ICBSYWdlIDEyOCBQRi9QUk8gQUdQIDR4IFRNRFMKLQkJMTAwMiAwMDA0ICBSYWdlIEZ1cnkgUHJvCi0JCTEwMDIgMDAwOCAgUmFnZSBGdXJ5IFByby9YcGVydCAyMDAwIFBybwotCQkxMDAyIDAwMTQgIFJhZ2UgRnVyeSBQcm8KLQkJMTAwMiAwMDE4ICBSYWdlIEZ1cnkgUHJvL1hwZXJ0IDIwMDAgUHJvCi0JCTEwMDIgMDAyOCAgUmFnZSAxMjggUHJvIEFJVyBBR1AKLQkJMTAwMiAwMDJhICBSYWdlIDEyOCBQcm8gQUlXIEFHUAotCQkxMDAyIDAwNDggIFJhZ2UgRnVyeSBQcm8KLQkJMTAwMiAyMDAwICBSYWdlIEZ1cnkgTUFYWCBBR1AgNHggKFRNRFMpIChWR0EgZGV2aWNlKQotCQkxMDAyIDIwMDEgIFJhZ2UgRnVyeSBNQVhYIEFHUCA0eCAoVE1EUykgKEV4dHJhIGRldmljZT8hKQotCTUwNDcgIFJhZ2UgMTI4IFBHL1BSTwotCTUwNDggIFJhZ2UgMTI4IFBIL1BSTyBBR1AgMngKLQk1MDQ5ICBSYWdlIDEyOCBQSS9QUk8gQUdQIDR4Ci0JNTA0YSAgUmFnZSAxMjggUEovUFJPIFRNRFMKLQk1MDRiICBSYWdlIDEyOCBQSy9QUk8gQUdQIDJ4IFRNRFMKLQk1MDRjICBSYWdlIDEyOCBQTC9QUk8gQUdQIDR4IFRNRFMKLQk1MDRkICBSYWdlIDEyOCBQTS9QUk8KLQk1MDRlICBSYWdlIDEyOCBQTi9QUk8gQUdQIDJ4Ci0JNTA0ZiAgUmFnZSAxMjggUE8vUFJPIEFHUCA0eAotCTUwNTAgIFJhZ2UgMTI4IFBQL1BSTyBUTURTIFtYcGVydCAxMjhdCi0JCTEwMDIgMDAwOCAgWHBlcnQgMTI4Ci0JNTA1MSAgUmFnZSAxMjggUFEvUFJPIEFHUCAyeCBUTURTCi0JNTA1MiAgUmFnZSAxMjggUFIvUFJPIEFHUCA0eCBUTURTCi0JNTA1MyAgUmFnZSAxMjggUFMvUFJPCi0JNTA1NCAgUmFnZSAxMjggUFQvUFJPIEFHUCAyeAotCTUwNTUgIFJhZ2UgMTI4IFBVL1BSTyBBR1AgNHgKLQk1MDU2ICBSYWdlIDEyOCBQVi9QUk8gVE1EUwotCTUwNTcgIFJhZ2UgMTI4IFBXL1BSTyBBR1AgMnggVE1EUwotCTUwNTggIFJhZ2UgMTI4IFBYL1BSTyBBR1AgNHggVE1EUwotCTUxNDQgIFJhZGVvbiBSMTAwIFFEIFtSYWRlb24gNzIwMF0KLQkJMTAwMiAwMDA4ICBSYWRlb24gNzAwMC9SYWRlb24gVkUKLQkJMTAwMiAwMDA5ICBSYWRlb24gNzAwMC9SYWRlb24KLQkJMTAwMiAwMDBhICBSYWRlb24gNzAwMC9SYWRlb24KLQkJMTAwMiAwMDFhICBSYWRlb24gNzAwMC9SYWRlb24KLQkJMTAwMiAwMDI5ICBSYWRlb24gQUlXCi0JCTEwMDIgMDAzOCAgUmFkZW9uIDcwMDAvUmFkZW9uCi0JCTEwMDIgMDAzOSAgUmFkZW9uIDcwMDAvUmFkZW9uCi0JCTEwMDIgMDA4YSAgUmFkZW9uIDcwMDAvUmFkZW9uCi0JCTEwMDIgMDBiYSAgUmFkZW9uIDcwMDAvUmFkZW9uCi0JCTEwMDIgMDEzOSAgUmFkZW9uIDcwMDAvUmFkZW9uCi0JCTEwMDIgMDI4YSAgUmFkZW9uIDcwMDAvUmFkZW9uCi0JCTEwMDIgMDJhYSAgUmFkZW9uIEFJVwotCQkxMDAyIDA1M2EgIFJhZGVvbiA3MDAwL1JhZGVvbgotCTUxNDUgIFJhZGVvbiBSMTAwIFFFCi0JNTE0NiAgUmFkZW9uIFIxMDAgUUYKLQk1MTQ3ICBSYWRlb24gUjEwMCBRRwotCTUxNDggIFJhZGVvbiBSMjAwIFFIIFtSYWRlb24gODUwMF0KLQkJMTAwMiAwMTBhICBGaXJlR0wgODgwMCA2NE1iCi0JCTEwMDIgMDE1MiAgRmlyZUdMIDg4MDAgMTI4TWIKLQkJMTAwMiAwMTYyICBGaXJlR0wgODcwMCAzMk1iCi0JCTEwMDIgMDE3MiAgRmlyZUdMIDg3MDAgNjRNYgotCTUxNDkgIFJhZGVvbiBSMjAwIFFJCi0JNTE0YSAgUmFkZW9uIFIyMDAgUUoKLQk1MTRiICBSYWRlb24gUjIwMCBRSwotCTUxNGMgIFJhZGVvbiBSMjAwIFFMIFtSYWRlb24gODUwMCBMRV0KLQkJMTAwMiAwMDNhICBSYWRlb24gUjIwMCBRTCBbUmFkZW9uIDg1MDAgTEVdCi0JCTEwMDIgMDEzYSAgUmFkZW9uIDg1MDAKLQkJMTQ4YyAyMDI2ICBSMjAwIFFMIFtSYWRlb24gODUwMCBFdmlsIE1hc3RlciBJSSBNdWx0aSBEaXNwbGF5IEVkaXRpb25dCi0JCTE2ODEgMDAxMCAgUmFkZW9uIDg1MDAgWzNEIFByb3BoZXQgODUwMCAxMjhNYl0KLQkJMTc0YiA3MTQ5ICBSYWRlb24gUjIwMCBRTCBbU2FwcGhpcmUgUmFkZW9uIDg1MDAgTEVdCi0JNTE0ZCAgUmFkZW9uIFIyMDAgUU0gW1JhZGVvbiA5MTAwXQotCTUxNGUgIFJhZGVvbiBSMjAwIFFOIFtSYWRlb24gODUwMExFXQotCTUxNGYgIFJhZGVvbiBSMjAwIFFPIFtSYWRlb24gODUwMExFXQotCTUxNTQgIFIyMDAgUVQgW1JhZGVvbiA4NTAwXQotCTUxNTUgIFIyMDAgUVUgW1JhZGVvbiA5MTAwXQotCTUxNTcgIFJhZGVvbiBSVjIwMCBRVyBbUmFkZW9uIDc1MDBdCi0JCTEwMDIgMDEzYSAgUmFkZW9uIDc1MDAKLQkJMTAwMiAxMDNhICBEZWxsIE9wdGlwbGV4IEdYMjYwCi0JCTE0NTggNDAwMCAgUlYyMDAgUVcgW1JBREVPTiA3NTAwIFBSTyBNQVlBIEFSXQotCQkxNDhjIDIwMjQgIFJWMjAwIFFXIFtSYWRlb24gNzUwMExFIER1YWwgRGlzcGxheV0KLQkJMTQ4YyAyMDI1ICBSVjIwMCBRVyBbUmFkZW9uIDc1MDAgRXZpbCBNYXN0ZXIgTXVsdGkgRGlzcGxheSBFZGl0aW9uXQotCQkxNDhjIDIwMzYgIFJWMjAwIFFXIFtSYWRlb24gNzUwMCBQQ0kgRHVhbCBEaXNwbGF5XQotCQkxNzRiIDcxNDYgIFJWMjAwIFFXIFtSYWRlb24gNzUwMCBMRV0KLQkJMTc0YiA3MTQ3ICBSVjIwMCBRVyBbU2FwcGhpcmUgUmFkZW9uIDc1MDBMRV0KLQkJMTc0YiA3MTYxICBSYWRlb24gUlYyMDAgUVcgW1JhZGVvbiA3NTAwIExFXQotCQkxN2FmIDAyMDIgIFJWMjAwIFFXIFtFeGNhbGlidXIgUmFkZW9uIDc1MDBMRV0KLQk1MTU4ICBSYWRlb24gUlYyMDAgUVggW1JhZGVvbiA3NTAwXQotCTUxNTkgIFJhZGVvbiBSVjEwMCBRWSBbUmFkZW9uIDcwMDAvVkVdCi0JCTEwMDIgMDAwYSAgUmFkZW9uIDcwMDAvUmFkZW9uIFZFCi0JCTEwMDIgMDAwYiAgUmFkZW9uIDcwMDAKLQkJMTAwMiAwMDM4ICBSYWRlb24gNzAwMC9SYWRlb24gVkUKLQkJMTAwMiAwMDNhICBSYWRlb24gNzAwMC9SYWRlb24gVkUKLQkJMTAwMiAwMGJhICBSYWRlb24gNzAwMC9SYWRlb24gVkUKLQkJMTAwMiAwMTNhICBSYWRlb24gNzAwMC9SYWRlb24gVkUKLQkJMTQ1OCA0MDAyICBSVjEwMCBRWSBbUkFERU9OIDcwMDAgUFJPIE1BWUEgQVYgU2VyaWVzXQotCQkxNDhjIDIwMDMgIFJWMTAwIFFZIFtSYWRlb24gNzAwMCBNdWx0aS1EaXNwbGF5IEVkaXRpb25dCi0JCTE0OGMgMjAyMyAgUlYxMDAgUVkgW1JhZGVvbiA3MDAwIEV2aWwgTWFzdGVyIE11bHRpLURpc3BsYXldCi0JCTE3NGIgNzExMiAgUlYxMDAgUVkgW1NhcHBoaXJlIFJhZGVvbiBWRSA3MDAwXQotCQkxNzRiIDdjMjggIFNhcHBoaXJlIFJhZGVvbiBWRSA3MDAwIEREUgotCQkxNzg3IDAyMDIgIFJWMTAwIFFZIFtFeGNhbGlidXIgUmFkZW9uIDcwMDBdCi0JNTE1YSAgUmFkZW9uIFJWMTAwIFFaIFtSYWRlb24gNzAwMC9WRV0KLQk1MTY4ICBSYWRlb24gUjIwMCBRaAotCTUxNjkgIFJhZGVvbiBSMjAwIFFpCi0JNTE2YSAgUmFkZW9uIFIyMDAgUWoKLQk1MTZiICBSYWRlb24gUjIwMCBRawotIyBUaGlzIG9uZSBpcyBub3QgaW4gQVRJIGRvY3VtZW50YXRpb24sIGJ1dCBpcyBpbiBYRnJlZTg2IHNvdXJjZSBjb2RlCi0JNTE2YyAgUmFkZW9uIFIyMDAgUWwKLQk1MjQ1ICBSYWdlIDEyOCBSRS9TRwotCQkxMDAyIDAwMDggIFhwZXJ0IDEyOAotCQkxMDAyIDAwMjggIFJhZ2UgMTI4IEFJVwotCQkxMDAyIDAwMjkgIFJhZ2UgMTI4IEFJVwotCQkxMDAyIDAwNjggIFJhZ2UgMTI4IEFJVwotCTUyNDYgIFJhZ2UgMTI4IFJGL1NHIEFHUAotCQkxMDAyIDAwMDQgIE1hZ251bS9YcGVydCAxMjgvWHBlcnQgOTkKLQkJMTAwMiAwMDA4ICBNYWdudW0vWHBlcnQxMjgvWDk5L1hwZXJ0MjAwMAotCQkxMDAyIDAwMjggIFJhZ2UgMTI4IEFJVyBBR1AKLQkJMTAwMiAwMDQ0ICBSYWdlIEZ1cnkvWHBlcnQgMTI4L1hwZXJ0IDIwMDAKLQkJMTAwMiAwMDY4ICBSYWdlIDEyOCBBSVcgQUdQCi0JCTEwMDIgMDQ0OCAgUmFnZSBGdXJ5Ci0JNTI0NyAgUmFnZSAxMjggUkcKLQk1MjRiICBSYWdlIDEyOCBSSy9WUgotCTUyNGMgIFJhZ2UgMTI4IFJML1ZSIEFHUAotCQkxMDAyIDAwMDggIFhwZXJ0IDk5L1hwZXJ0IDIwMDAKLQkJMTAwMiAwMDg4ICBYcGVydCA5OQotCTUzNDUgIFJhZ2UgMTI4IFNFLzR4Ci0JNTM0NiAgUmFnZSAxMjggU0YvNHggQUdQIDJ4Ci0JCTEwMDIgMDA0OCAgUkFHRSAxMjggMTZNQiBWR0EgVFZPVVQgQU1DIFBBTAotCTUzNDcgIFJhZ2UgMTI4IFNHLzR4IEFHUCA0eAotCTUzNDggIFJhZ2UgMTI4IFNICi0JNTM0YiAgUmFnZSAxMjggU0svNHgKLQk1MzRjICBSYWdlIDEyOCBTTC80eCBBR1AgMngKLQk1MzRkICBSYWdlIDEyOCBTTS80eCBBR1AgNHgKLQkJMTAwMiAwMDA4ICBYcGVydCA5OS9YcGVydCAyMDAwCi0JCTEwMDIgMDAxOCAgWHBlcnQgMjAwMAotCTUzNGUgIFJhZ2UgMTI4IDR4Ci0JNTM1NCAgTWFjaCA2NCBWVAotCQkxMDAyIDU2NTQgIE1hY2ggNjQgcmVmZXJlbmNlCi0JNTQ0NiAgUmFnZSAxMjggUHJvIFVsdHJhIFRGCi0JCTEwMDIgMDAwNCAgUmFnZSBGdXJ5IFBybwotCQkxMDAyIDAwMDggIFJhZ2UgRnVyeSBQcm8vWHBlcnQgMjAwMCBQcm8KLQkJMTAwMiAwMDE4ICBSYWdlIEZ1cnkgUHJvL1hwZXJ0IDIwMDAgUHJvCi0JCTEwMDIgMDAyOCAgUmFnZSAxMjggQUlXIFBybyBBR1AKLQkJMTAwMiAwMDI5ICBSYWdlIDEyOCBBSVcKLQkJMTAwMiAwMDJhICBSYWdlIDEyOCBBSVcgUHJvIEFHUAotCQkxMDAyIDAwMmIgIFJhZ2UgMTI4IEFJVwotCQkxMDAyIDAwNDggIFhwZXJ0IDIwMDAgUHJvCi0JNTQ0YyAgUmFnZSAxMjggUHJvIFVsdHJhIFRMCi0JNTQ1MiAgUmFnZSAxMjggUHJvIFVsdHJhIFRSCi0JCTEwMDIgMDAxYyAgUmFnZSAxMjggUHJvIDRYTAotCQkxMDNjIDEyNzkgIFJhZ2UgMTI4IFBybyA0WEwKLQk1NDUzICBSYWdlIDEyOCBQcm8gVWx0cmEgVFMKLQk1NDU0ICBSYWdlIDEyOCBQcm8gVWx0cmEgVFQKLQk1NDU1ICBSYWdlIDEyOCBQcm8gVWx0cmEgVFUKLQk1NDYwICBNMjIgW1JhZGVvbiBNb2JpbGl0eSBNMzAwXQotCTU0NjQgIE0yMiBbRmlyZUdMIEdMXQotCTU1NDggIFI0MjMgVUggW1JhZGVvbiBYODAwIChQQ0lFKV0KLQk1NTQ5ICBSNDIzIFVJIFtSYWRlb24gWDgwMFBSTyAoUENJRSldCi0JNTU0YSAgUjQyMyBVSiBbUmFkZW9uIFg4MDBMRSAoUENJRSldCi0JNTU0YiAgUjQyMyBVSyBbUmFkZW9uIFg4MDBTRSAoUENJRSldCi0JNTU1MSAgUjQyMyBVUSBbRmlyZUdMIFY3MjAwIChQQ0lFKV0KLQk1NTUyICBSNDIzIFVSIFtGaXJlR0wgVjUxMDAgKFBDSUUpXQotCTU1NTQgIFI0MjMgVVQgW0ZpcmVHTCBWNzEwMCAoUENJRSldCi0JNTU2YiAgUmFkZW9uIFI0MjMgVUsgKFBDSUUpIFtYODAwIFNFXSAoU2Vjb25kYXJ5KQotCTU2NTQgIDI2NFZUIFtNYWNoNjQgVlRdCi0JCTEwMDIgNTY1NCAgTWFjaDY0VlQgUmVmZXJlbmNlCi0JNTY1NSAgMjY0VlQzIFtNYWNoNjQgVlQzXQotCTU2NTYgIDI2NFZUNCBbTWFjaDY0IFZUNF0KLQk1ODMwICBSUzMwMCBIb3N0IEJyaWRnZQotCTU4MzEgIFJTMzAwIEhvc3QgQnJpZGdlCi0JNTgzMiAgUlMzMDAgSG9zdCBCcmlkZ2UKLQk1ODMzICBSYWRlb24gOTEwMCBJR1AgSG9zdCBCcmlkZ2UKLQk1ODM0ICBSYWRlb24gOTEwMCBJR1AKLQk1ODM1ICBSUzMwME0gQUdQIFtSYWRlb24gTW9iaWxpdHkgOTEwMElHUF0KLQk1ODM4ICBSYWRlb24gOTEwMCBJR1AgQUdQIEJyaWRnZQotCTU5NDEgIFJWMjgwIFtSYWRlb24gOTIwMF0gKFNlY29uZGFyeSkKLQkJMTQ1OCA0MDE5ICBHaWdhYnl0ZSBSYWRlb24gOTIwMAotCQkxNzRiIDdjMTIgIFNhcHBoaXJlIFJhZGVvbiA5MjAwCi0jIGh0dHA6Ly93d3cuaGlnaHRlY2guY29tLmhrL2h0bWwvOTIwMC5odG0KLQkJMTdhZiAyMDBkICBFeGNhbGlidXIgUmFkZW9uIDkyMDAKLQkJMThiYyAwMDUwICBHZVhjdWJlIEdDLVI5MjAwLUMzIChTZWNvbmRhcnkpCi0JNTk0NCAgUlYyODAgW1JhZGVvbiA5MjAwIFNFIChQQ0kpXQotCTU5NjAgIFJWMjgwIFtSYWRlb24gOTIwMCBQUk9dCi0JNTk2MSAgUlYyODAgW1JhZGVvbiA5MjAwXQotCQkxMDAyIDJmNzIgIEFsbC1pbi1Xb25kZXIgOTIwMCBTZXJpZXMKLQkJMTAxOSA0YzMwICBSYWRlb24gOTIwMCBWSVZPCi0JCTEyYWIgNTk2MSAgWVVBTiBTTUFSVFZHQSBSYWRlb24gOTIwMAotCQkxNDU4IDQwMTggIEdpZ2FieXRlIFJhZGVvbiA5MjAwCi0JCTE3NGIgN2MxMyAgU2FwcGhpcmUgUmFkZW9uIDkyMDAKLSMgaHR0cDovL3d3dy5oaWdodGVjaC5jb20uaGsvaHRtbC85MjAwLmh0bQotCQkxN2FmIDIwMGMgIEV4Y2FsaWJ1ciBSYWRlb24gOTIwMAotCQkxOGJjIDAwNTAgIFJhZGVvbiA5MjAwIEdhbWUgQnVzdGVyCi0JCTE4YmMgMDA1MSAgR2VYY3ViZSBHQy1SOTIwMC1DMwotCQkxOGJjIDAwNTMgIFJhZGVvbiA5MjAwIEdhbWUgQnVzdGVyIFZJVk8KLQk1OTYyICBSVjI4MCBbUmFkZW9uIDkyMDBdCi0JNTk2NCAgUlYyODAgW1JhZGVvbiA5MjAwIFNFXQotCQkxMDQzIGMwMDYgIEFTVVMgUmFkZW9uIDkyMDAgU0UgLyBURCAvIDEyOE0KLQkJMTQ1OCA0MDE4ICBSYWRlb24gOTIwMCBTRQotCQkxNDhjIDIwNzMgIENOLUFHOTJFCi0JCTE3NGIgN2MxMyAgU2FwcGhpcmUgUmFkZW9uIDkyMDAgU0UKLQkJMTc4NyA1OTY0ICBFeGNhbGlidXIgOTIwMFNFIFZJVk8gMTI4TQotCQkxN2FmIDIwMTIgIFJhZGVvbiA5MjAwIFNFIEV4Y2FsaWJ1cgotCQkxOGJjIDAxNzAgIFNhcHBoaXJlIFJhZGVvbiA5MjAwIFNFIDEyOE1CIEdhbWUgQnVzdGVyCi0jIDEyOE1CIEREUiwgRFZJL1ZHQS9UViBvdXQKLQkJMThiYyAwMTczICBHQy1SOTIwMEwoU0UpLUMzSCBbUmFkZW9uIDkyMDAgR2FtZSBCdXN0ZXJdCi0JNWI2MCAgUlYzNzAgNUI2MCBbUmFkZW9uIFgzMDAgKFBDSUUpXQotCQkxMDQzIDAwMmEgIEV4dHJlbWUgQVgzMDBTRS1YCi0JCTEwNDMgMDMyZSAgRXh0cmVtZSBBWDMwMC9URAotCTViNjIgIFJWMzcwIDVCNjIgW1JhZGVvbiBYNjAwIChQQ0lFKV0KLQk1YjY0ICBSVjM3MCA1QjY0IFtGaXJlR0wgVjMxMDAgKFBDSUUpXQotCTViNjUgIFJWMzcwIDVCNjUgW0ZpcmVHTCBEMTEwMCAoUENJRSldCi0JNWM2MSAgTTkrIDVDNjEgW1JhZGVvbiBNb2JpbGl0eSA5MjAwIChBR1ApXQotCTVjNjMgIE05KyA1QzYzIFtSYWRlb24gTW9iaWxpdHkgOTIwMCAoQUdQKV0KLQk1ZDQ0ICBSVjI4MCBbUmFkZW9uIDkyMDAgU0VdIChTZWNvbmRhcnkpCi0JCTE0NTggNDAxOSAgUmFkZW9uIDkyMDAgU0UgKFNlY29uZGFyeSkKLQkJMTc0YiA3YzEyICBTYXBwaGlyZSBSYWRlb24gOTIwMCBTRSAoU2Vjb25kYXJ5KQotCQkxNzg3IDU5NjUgIEV4Y2FsaWJ1ciA5MjAwU0UgVklWTyAxMjhNIChTZWNvbmRhcnkpCi0JCTE3YWYgMjAxMyAgUmFkZW9uIDkyMDAgU0UgRXhjYWxpYnVyIChTZWNvbmRhcnkpCi0JCTE4YmMgMDE3MSAgUmFkZW9uIDkyMDAgU0UgMTI4TUIgR2FtZSBCdXN0ZXIgKFNlY29uZGFyeSkKLQkJMThiYyAwMTcyICBHQy1SOTIwMEwoU0UpLUMzSCBbUmFkZW9uIDkyMDAgR2FtZSBCdXN0ZXJdCi0JNWQ0ZCAgUjQ4MCBbUmFkZW9uIFg4NTBYVCBQbGF0aW51bV0KLQk1ZDU3ICBSNDIzIDVGNTcgW1JhZGVvbiBYODAwWFQgKFBDSUUpXQotCTcwMGYgIFBDSSBCcmlkZ2UgW0lHUCAzMjBNXQotCTcwMTAgIFBDSSBCcmlkZ2UgW0lHUCAzNDBNXQotCTc4MzQgIFJhZGVvbiA5MTAwIFBSTyBJR1AKLQk3ODM1ICBSYWRlb24gTW9iaWxpdHkgOTIwMCBJR1AKLQk3YzM3ICBSVjM1MCBBUSBbUmFkZW9uIDk2MDAgU0VdCi0JY2FiMCAgQUdQIEJyaWRnZSBbSUdQIDMyME1dCi0JY2FiMiAgUlMyMDAvUlMyMDBNIEFHUCBCcmlkZ2UgW0lHUCAzNDBNXQotCWNiYjIgIFJTMjAwL1JTMjAwTSBBR1AgQnJpZGdlIFtJR1AgMzQwTV0KLTEwMDMgIFVMU0kgU3lzdGVtcwotCTAyMDEgIFVTMjAxCi0xMDA0ICBWTFNJIFRlY2hub2xvZ3kgSW5jCi0JMDAwNSAgODJDNTkyLUZDMQotCTAwMDYgIDgyQzU5My1GQzEKLQkwMDA3ICA4MkM1OTQtQUZDMgotCTAwMDggIDgyQzU5Ni83IFtXaWxkY2F0XQotCTAwMDkgIDgyQzU5Ny1BRkMyCi0JMDAwYyAgODJDNTQxIFtMeW54XQotCTAwMGQgIDgyQzU0MyBbTHlueF0KLQkwMTAxICA4MkM1MzIKLQkwMTAyICA4MkM1MzQgW0VhZ2xlXQotCTAxMDMgIDgyQzUzOAotCTAxMDQgIDgyQzUzNQotCTAxMDUgIDgyQzE0NwotCTAyMDAgIDgyQzk3NQotCTAyODAgIDgyQzkyNQotCTAzMDQgIFFTb3VuZCBUaHVuZGVyQmlyZCBQQ0kgQXVkaW8KLQkJMTAwNCAwMzA0ICBRU291bmQgVGh1bmRlckJpcmQgUENJIEF1ZGlvCi0JCTEyMmQgMTIwNiAgRFNQMzY4IEF1ZGlvCi0JCTE0ODMgNTAyMCAgWFdhdmUgVGh1bmRlciAzRCBBdWRpbwotCTAzMDUgIFFTb3VuZCBUaHVuZGVyQmlyZCBQQ0kgQXVkaW8gR2FtZXBvcnQKLQkJMTAwNCAwMzA1ICBRU291bmQgVGh1bmRlckJpcmQgUENJIEF1ZGlvIEdhbWVwb3J0Ci0JCTEyMmQgMTIwNyAgRFNQMzY4IEF1ZGlvIEdhbWVwb3J0Ci0JCTE0ODMgNTAyMSAgWFdhdmUgVGh1bmRlciAzRCBBdWRpbyBHYW1lcG9ydAotCTAzMDYgIFFTb3VuZCBUaHVuZGVyQmlyZCBQQ0kgQXVkaW8gU3VwcG9ydCBSZWdpc3RlcnMKLQkJMTAwNCAwMzA2ICBRU291bmQgVGh1bmRlckJpcmQgUENJIEF1ZGlvIFN1cHBvcnQgUmVnaXN0ZXJzCi0JCTEyMmQgMTIwOCAgRFNQMzY4IEF1ZGlvIFN1cHBvcnQgUmVnaXN0ZXJzCi0JCTE0ODMgNTAyMiAgWFdhdmUgVGh1bmRlciAzRCBBdWRpbyBTdXBwb3J0IFJlZ2lzdGVycwotCTAzMDcgIFRodW5kZXJiaXJkCi0JMDMwOCAgVGh1bmRlcmJpcmQKLQkwNzAyICBWQVM5NjAxMSBbR29sZGVuIEdhdGUgSUldCi0JMDcwMyAgVG9sbGdhdGUKLTEwMDUgIEF2YW5jZSBMb2dpYyBJbmMuIFtBTEldCi0JMjA2NCAgQUxHMjAzMi8yMDY0Ci0JMjEyOCAgQUxHMjM2NEEKLQkyMzAxICBBTEcyMzAxCi0JMjMwMiAgQUxHMjMwMgotCTIzNjQgIEFMRzIzNjQKLQkyNDY0ICBBTEcyMzY0QQotCTI1MDEgIEFMRzI1NjRBLzI1MTI4QQotMTAwNiAgUmVwbHkgR3JvdXAKLTEwMDcgIE5ldEZyYW1lIFN5c3RlbXMgSW5jCi0xMDA4ICBFcHNvbgotMTAwYSAgUGhvZW5peCBUZWNobm9sb2dpZXMKLTEwMGIgIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgQ29ycG9yYXRpb24KLQkwMDAxICBEUDgzODEwCi0JMDAwMiAgODc0MTUvODc1NjAgSURFCi0JMDAwZSAgODc1NjAgTGVnYWN5IEkvTwotCTAwMGYgIEZpcmVXaXJlIENvbnRyb2xsZXIKLQkwMDExICBOUzg3NTYwIE5hdGlvbmFsIFBDSSBTeXN0ZW0gSS9PCi0JMDAxMiAgVVNCIENvbnRyb2xsZXIKLQkwMDIwICBEUDgzODE1IChNYWNQaHl0ZXIpIEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMTAzYyAwMDI0ICBQYXZpbGlvbiB6ZTQ0MDAgYnVpbHRpbiBOZXR3b3JrCi0JCTEzODUgZjMxMSAgRkEzMTEgLyBGQTMxMiAoRkEzMTEgd2l0aCBXb0wgSFcpCi0JMDAyMiAgRFA4MzgyMCAxMC8xMDAvMTAwMCBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDAyOCAgR2VvZGUgR1gyIEhvc3QgQnJpZGdlCi0JMDAyYSAgQ1M1NTM1IFNvdXRoIEJyaWRnZQotCTAwMmIgIENTNTUzNSBJU0EgYnJpZGdlCi0JMDAyZCAgQ1M1NTM1IElERQotCTAwMmUgIENTNTUzNSBBdWRpbwotCTAwMmYgIENTNTUzNSBVU0IKLQkwMDMwICBHZW9kZSBHWDIgR3JhcGhpY3MgUHJvY2Vzc29yCi0JMDAzNSAgRFA4MzA2NSBbU2F0dXJuXSAxMC8xMDAvMTAwMCBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDUwMCAgU0N4MjAwIEJyaWRnZQotCTA1MDEgIFNDeDIwMCBTTUkKLQkwNTAyICBTQ3gyMDAgSURFCi0JMDUwMyAgU0N4MjAwIEF1ZGlvCi0JMDUwNCAgU0N4MjAwIFZpZGVvCi0JMDUwNSAgU0N4MjAwIFhCdXMKLQkwNTEwICBTQzExMDAgQnJpZGdlCi0JMDUxMSAgU0MxMTAwIFNNSQotCTA1MTUgIFNDMTEwMCBYQnVzCi0JZDAwMSAgODc0MTAgSURFCi0xMDBjICBUc2VuZyBMYWJzIEluYwotCTMyMDIgIEVUNDAwMC9XMzJwIHJldiBBCi0JMzIwNSAgRVQ0MDAwL1czMnAgcmV2IEIKLQkzMjA2ICBFVDQwMDAvVzMycCByZXYgQwotCTMyMDcgIEVUNDAwMC9XMzJwIHJldiBECi0JMzIwOCAgRVQ2MDAwCi0JNDcwMiAgRVQ2MzAwCi0xMDBkICBBU1QgUmVzZWFyY2ggSW5jCi0xMDBlICBXZWl0ZWsKLQk5MDAwICBQOTAwMCBWaXBlcgotCTkwMDEgIFA5MDAwIFZpcGVyCi0JOTAwMiAgUDkwMDAgVmlwZXIKLQk5MTAwICBQOTEwMCBWaXBlciBQcm8vU0UKLTEwMTAgIFZpZGVvIExvZ2ljLCBMdGQuCi0xMDExICBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbgotCTAwMDEgIERFQ2NoaXAgMjEwNTAKLQkwMDAyICBERUNjaGlwIDIxMDQwIFtUdWxpcF0KLQkwMDA0ICBERUNjaGlwIDIxMDMwIFtUR0FdCi0JMDAwNyAgTlZSQU0gW1plcGh5ciBOVlJBTV0KLQkwMDA4ICBLWlBTQSBbS1pQU0FdCi0JMDAwOSAgREVDY2hpcCAyMTE0MCBbRmFzdGVyTmV0XQotCQkxMDI1IDAzMTAgIDIxMTQwIEZhc3QgRXRoZXJuZXQKLQkJMTBiOCAyMDAxICBTTUM5MzMyQkRUIEV0aGVyUG93ZXIgMTAvMTAwCi0JCTEwYjggMjAwMiAgU01DOTMzMkJWVCBFdGhlclBvd2VyIFQ0IDEwLzEwMAotCQkxMGI4IDIwMDMgIFNNQzkzMzRCRFQgRXRoZXJQb3dlciAxMC8xMDAgKDEtcG9ydCkKLQkJMTEwOSAyNDAwICBBTkEtNjk0NEEvVFggRmFzdCBFdGhlcm5ldAotCQkxMTEyIDIzMDAgIFJOUzIzMDAgRmFzdCBFdGhlcm5ldAotCQkxMTEyIDIzMjAgIFJOUzIzMjAgRmFzdCBFdGhlcm5ldAotCQkxMTEyIDIzNDAgIFJOUzIzNDAgRmFzdCBFdGhlcm5ldAotCQkxMTEzIDEyMDcgIEVOLTEyMDctVFggRmFzdCBFdGhlcm5ldAotCQkxMTg2IDExMDAgIERGRS01MDBUWCBGYXN0IEV0aGVybmV0Ci0JCTExODYgMTExMiAgREZFLTU3MFRYIEZhc3QgRXRoZXJuZXQKLQkJMTE4NiAxMTQwICBERkUtNjYwIENhcmRidXMgRXRoZXJuZXQgMTAvMTAwCi0JCTExODYgMTE0MiAgREZFLTY2MCBDYXJkYnVzIEV0aGVybmV0IDEwLzEwMAotCQkxMWY2IDA1MDMgIEZyZWVkb21saW5lIEZhc3QgRXRoZXJuZXQKLQkJMTI4MiA5MTAwICBBRUYtMzgwVFhEIEZhc3QgRXRoZXJuZXQKLQkJMTM4NSAxMTAwICBGQTMxMFRYIEZhc3QgRXRoZXJuZXQKLQkJMjY0NiAwMDAxICBLTkUxMDBUWCBGYXN0IEV0aGVybmV0Ci0JMDAwYSAgMjEyMzAgVmlkZW8gQ29kZWMKLQkwMDBkICBQQlhHQiBbVEdBMl0KLQkwMDBmICBERUZQQQotCTAwMTQgIERFQ2NoaXAgMjEwNDEgW1R1bGlwIFBhc3MgM10KLQkJMTE4NiAwMTAwICBERS01MzArCi0JMDAxNiAgREdMUEIgW09QUE9dCi0JMDAxNyAgUFYtUENJIEdyYXBoaWNzIENvbnRyb2xsZXIgKFpMWHAtTCkKLQkwMDE5ICBERUNjaGlwIDIxMTQyLzQzCi0JCTEwMTEgNTAwYSAgREU1MDBBIEZhc3QgRXRoZXJuZXQKLQkJMTAxMSA1MDBiICBERTUwMEIgRmFzdCBFdGhlcm5ldAotCQkxMDE0IDAwMDEgIDEwLzEwMCBFdGhlckpldCBDYXJkYnVzCi0JCTEwMjUgMDMxNSAgQUxOMzE1IEZhc3QgRXRoZXJuZXQKLQkJMTAzMyA4MDBjICBQQy05ODIxLUNTMDEgMTAwQkFTRS1UWCBJbnRlcmZhY2UgQ2FyZAotCQkxMDMzIDgwMGQgIFBDLTk4MjFOUi1CMDYgMTAwQkFTRS1UWCBJbnRlcmZhY2UgQ2FyZAotCQkxMDhkIDAwMTYgIFJhcGlkZmlyZSAyMzI3IDEwLzEwMCBFdGhlcm5ldAotCQkxMDhkIDAwMTcgIEdvQ2FyZCAyMjUwIEV0aGVybmV0IDEwLzEwMCBDYXJkYnVzCi0JCTEwYjggMjAwNSAgU01DODAzMkRUIEV4dHJlbWUgRXRoZXJuZXQgMTAvMTAwCi0JCTEwYjggODAzNCAgU01DODAzNCBFeHRyZW1lIEV0aGVybmV0IDEwLzEwMAotCQkxMGVmIDgxNjkgIENhcmRidXMgRmFzdCBFdGhlcm5ldAotCQkxMTA5IDJhMDAgIEFOQS02OTExQS9UWCBGYXN0IEV0aGVybmV0Ci0JCTExMDkgMmIwMCAgQU5BLTY5MTFBL1RYQyBGYXN0IEV0aGVybmV0Ci0JCTExMDkgMzAwMCAgQU5BLTY5MjIvVFggRmFzdCBFdGhlcm5ldAotCQkxMTEzIDEyMDcgIENoZWV0YWggRmFzdCBFdGhlcm5ldAotCQkxMTEzIDIyMjAgIENhcmRidXMgRmFzdCBFdGhlcm5ldAotCQkxMTVkIDAwMDIgIENhcmRidXMgRXRoZXJuZXQgMTAvMTAwCi0JCTExNzkgMDIwMyAgRmFzdCBFdGhlcm5ldAotCQkxMTc5IDAyMDQgIENhcmRidXMgRmFzdCBFdGhlcm5ldAotCQkxMTg2IDExMDAgIERGRS01MDBUWCBGYXN0IEV0aGVybmV0Ci0JCTExODYgMTEwMSAgREZFLTUwMFRYIEZhc3QgRXRoZXJuZXQKLQkJMTE4NiAxMTAyICBERkUtNTAwVFggRmFzdCBFdGhlcm5ldAotCQkxMTg2IDExMTIgIERGRS01NzBUWCBRdWFkIEZhc3QgRXRoZXJuZXQKLQkJMTI1OSAyODAwICBBVC0yODAwVHggRmFzdCBFdGhlcm5ldAotCQkxMjY2IDAwMDQgIEVhZ2xlIEZhc3QgRXRoZXJNQVgKLQkJMTJhZiAwMDE5ICBOZXRGbHllciBDYXJkYnVzIEZhc3QgRXRoZXJuZXQKLQkJMTM3NCAwMDAxICBDYXJkYnVzIEV0aGVybmV0IENhcmQgMTAvMTAwCi0JCTEzNzQgMDAwMiAgQ2FyZGJ1cyBFdGhlcm5ldCBDYXJkIDEwLzEwMAotCQkxMzc0IDAwMDcgIENhcmRidXMgRXRoZXJuZXQgQ2FyZCAxMC8xMDAKLQkJMTM3NCAwMDA4ICBDYXJkYnVzIEV0aGVybmV0IENhcmQgMTAvMTAwCi0JCTEzODUgMjEwMCAgRkE1MTAKLQkJMTM5NSAwMDAxICAxMC8xMDAgRXRoZXJuZXQgQ2FyZEJ1cyBQQyBDYXJkCi0JCTEzZDEgYWIwMSAgRXRoZXJGYXN0IDEwLzEwMCBDYXJkYnVzIChQQ01QQzIwMCkKLQkJMTRjYiAwMTAwICBMTkRMLTEwME4gMTAwQmFzZS1UWCBFdGhlcm5ldCBQQyBDYXJkCi0JCTgwODYgMDAwMSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgTW9iaWxlIENhcmRCdXMgMzIKLQkwMDFhICBGYXJhbGxvbiBQTjkwMDBTWCBHaWdhYml0IEV0aGVybmV0Ci0JMDAyMSAgREVDY2hpcCAyMTA1MgotCTAwMjIgIERFQ2NoaXAgMjExNTAKLQkwMDIzICBERUNjaGlwIDIxMTUwCi0JMDAyNCAgREVDY2hpcCAyMTE1MgotCTAwMjUgIERFQ2NoaXAgMjExNTMKLQkwMDI2ICBERUNjaGlwIDIxMTU0Ci0JMDAzNCAgNTZrIE1vZGVtIENhcmRidXMKLQkJMTM3NCAwMDAzICA1NmsgTW9kZW0gQ2FyZGJ1cwotCTAwNDUgIERFQ2NoaXAgMjE1NTMKLQkwMDQ2ICBERUNjaGlwIDIxNTU0Ci0JCTBlMTEgNDA1MCAgSW50ZWdyYXRlZCBTbWFydCBBcnJheQotCQkwZTExIDQwNTEgIEludGVncmF0ZWQgU21hcnQgQXJyYXkKLQkJMGUxMSA0MDU4ICBJbnRlZ3JhdGVkIFNtYXJ0IEFycmF5Ci0JCTEwM2MgMTBjMiAgSGV3bGV0dC1QYWNrYXJkIE5ldFJBSUQtNE0KLQkJMTJkOSAwMDBhICBJUCBUZWxlcGhvbnkgY2FyZAotCQk0YzUzIDEwNTAgIENUNyBtYWluYm9hcmQKLQkJNGM1MyAxMDUxICBDRTcgbWFpbmJvYXJkCi0JCTkwMDUgMDM2NCAgNTQwMFMgKE11c3RhbmcpCi0JCTkwMDUgMDM2NSAgNTQwMFMgKE11c3RhbmcpCi0JCTkwMDUgMTM2NCAgRGVsbCBQb3dlckVkZ2UgUkFJRCBDb250cm9sbGVyIDIKLQkJOTAwNSAxMzY1ICBEZWxsIFBvd2VyRWRnZSBSQUlEIENvbnRyb2xsZXIgMgotCQllNGJmIDEwMDAgIENDOC0xLUJMVUVTCi0JMTA2NSAgU3Ryb25nQVJNIERDMjEyODUKLQkJMTA2OSAwMDIwICBEQUM5NjBQIC8gREFDMTE2NFAKLTEwMTIgIE1pY3JvbmljcyBDb21wdXRlcnMgSW5jCi0xMDEzICBDaXJydXMgTG9naWMKLQkwMDM4ICBHRCA3NTQ4Ci0JMDA0MCAgR0QgNzU1NSBGbGF0IFBhbmVsIEdVSSBBY2NlbGVyYXRvcgotCTAwNGMgIEdEIDc1NTYgVmlkZW8vR3JhcGhpY3MgTENEL0NSVCBDdHJscgotCTAwYTAgIEdEIDU0MzAvNDAgW0FscGluZV0KLQkwMGEyICBHRCA1NDMyIFtBbHBpbmVdCi0JMDBhNCAgR0QgNTQzNC00IFtBbHBpbmVdCi0JMDBhOCAgR0QgNTQzNC04IFtBbHBpbmVdCi0JMDBhYyAgR0QgNTQzNiBbQWxwaW5lXQotCTAwYjAgIEdEIDU0NDAKLQkwMGI4ICBHRCA1NDQ2Ci0JMDBiYyAgR0QgNTQ4MAotCQkxMDEzIDAwYmMgIENMLUdENTQ4MAotCTAwZDAgIEdEIDU0NjIKLQkwMGQyICBHRCA1NDYyIFtMYWd1bmEgSV0KLQkwMGQ0ICBHRCA1NDY0IFtMYWd1bmFdCi0JMDBkNSAgR0QgNTQ2NCBCRCBbTGFndW5hXQotCTAwZDYgIEdEIDU0NjUgW0xhZ3VuYV0KLQkJMTNjZSA4MDMxICBCYXJjbyBNZXRoZXVzIDIgTWVnYXBpeGVsLCBEdWFsIEhlYWQKLQkJMTNjZiA4MDMxICBCYXJjbyBNZXRoZXVzIDIgTWVnYXBpeGVsLCBEdWFsIEhlYWQKLQkwMGU4ICBHRCA1NDM2VQotCTExMDAgIENMIDY3MjkKLQkxMTEwICBQRCA2ODMyIFBDTUNJQS9DYXJkQnVzIEN0cmxyCi0JMTExMiAgUEQgNjgzNCBQQ01DSUEvQ2FyZEJ1cyBDdHJscgotCTExMTMgIFBEIDY4MzMgUENNQ0lBL0NhcmRCdXMgQ3RybHIKLQkxMjAwICBHRCA3NTQyIFtOb3JkaWNdCi0JMTIwMiAgR0QgNzU0MyBbVmlraW5nXQotCTEyMDQgIEdEIDc1NDEgW05vcmRpYyBMaWdodF0KLQk0MDAwICBNRCA1NjIwIFtDTE0gRGF0YSBGYXggVm9pY2VdCi0JNDQwMCAgQ0QgNDQwMAotCTYwMDEgIENTIDQ2MTAvMTEgW0NyeXN0YWxDbGVhciBTb3VuZEZ1c2lvbiBBdWRpbyBBY2NlbGVyYXRvcl0KLQkJMTAxNCAxMDEwICBDUzQ2MTAgU291bmRGdXNpb24gQXVkaW8gQWNjZWxlcmF0b3IKLQk2MDAzICBDUyA0NjE0LzIyLzI0IFtDcnlzdGFsQ2xlYXIgU291bmRGdXNpb24gQXVkaW8gQWNjZWxlcmF0b3JdCi0JCTEwMTMgNDI4MCAgQ3J5c3RhbCBTb3VuZEZ1c2lvbiBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTUzYiAxMTM2ICBTaVhQYWNrIDUuMSsKLQkJMTY4MSAwMDUwICBHYW1lIFRoZWF0ZXIgWFAKLQkJMTY4MSBhMDExICBGb3J0aXNzaW1vIElJSSA3LjEKLQk2MDA0ICBDUyA0NjE0LzIyLzI0IFtDcnlzdGFsQ2xlYXIgU291bmRGdXNpb24gQXVkaW8gQWNjZWxlcmF0b3JdCi0JNjAwNSAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwMTMgNDI4MSAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBhOCAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBhOSAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBhYSAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBhYiAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBhYyAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBhZCAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBiNCAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTExNzkgMDAwMSAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTE0YzAgMDAwYyAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0xMDE0ICBJQk0KLQkwMDAyICBQQ0kgdG8gTUNBIEJyaWRnZQotCTAwMDUgIEFsdGEgTGl0ZQotCTAwMDcgIEFsdGEgTVAKLQkwMDBhICBGaXJlIENvcmFsCi0JMDAxNyAgQ1BVIHRvIFBDSSBCcmlkZ2UKLQkwMDE4ICBUUiBBdXRvIExBTnN0cmVhbWVyCi0JMDAxYiAgR1hULTE1MFAKLQkwMDFjICBDYXJyZXJhCi0JMDAxZCAgODJHMjY3NQotCTAwMjAgIEdYVDEwMDAgR3JhcGhpY3MgQWRhcHRlcgotCTAwMjIgIElCTTI3LTgyMzUxCi0JMDAyZCAgUHl0aG9uCi0jIFtvZmZpY2lhbCBuYW1lIGluIEFJWCA1XQotCTAwMmUgIFNDU0kgUkFJRCBBZGFwdGVyIFtTZXJ2ZVJBSURdCi0JCTEwMTQgMDAyZSAgU2VydmVSQUlELTN4Ci0JCTEwMTQgMDIyZSAgU2VydmVSQUlELTRICi0JMDAzMSAgMiBQb3J0IFNlcmlhbCBBZGFwdGVyCi0jIEFTNDAwIGlTZXJpZXMgUENJIHN5bmMgc2VyaWFsIGNhcmQKLQkJMTAxNCAwMDMxICAyNzIxIFdBTiBJT0EgLSAyIFBvcnQgU3luYyBTZXJpYWwgQWRhcHRlcgotCTAwMzYgIE1pYW1pCi0JMDAzNyAgODI2NjAgQ1BVIHRvIFBDSSBCcmlkZ2UKLQkwMDNhICBDUFUgdG8gUENJIEJyaWRnZQotCTAwM2MgIEdYVDI1MFAvR1hUMjU1UCBHcmFwaGljcyBBZGFwdGVyCi0JMDAzZSAgMTYvNCBUb2tlbiByaW5nIFVUUC9TVFAgY29udHJvbGxlcgotCQkxMDE0IDAwM2UgIFRva2VuLVJpbmcgQWRhcHRlcgotCQkxMDE0IDAwY2QgIFRva2VuLVJpbmcgQWRhcHRlciArIFdha2UtT24tTEFOCi0JCTEwMTQgMDBjZSAgMTYvNCBUb2tlbi1SaW5nIEFkYXB0ZXIgMgotCQkxMDE0IDAwY2YgIDE2LzQgVG9rZW4tUmluZyBBZGFwdGVyIFNwZWNpYWwKLQkJMTAxNCAwMGU0ICBIaWdoLVNwZWVkIDEwMC8xNi80IFRva2VuLVJpbmcgQWRhcHRlcgotCQkxMDE0IDAwZTUgIDE2LzQgVG9rZW4tUmluZyBBZGFwdGVyIDIgKyBXYWtlLU9uLUxBTgotCQkxMDE0IDAxNmQgIGlTZXJpZXMgMjc0NCBDYXJkCi0JMDA0NSAgU1NBIEFkYXB0ZXIKLQkwMDQ2ICBNUElDIGludGVycnVwdCBjb250cm9sbGVyCi0JMDA0NyAgUENJIHRvIFBDSSBCcmlkZ2UKLQkwMDQ4ICBQQ0kgdG8gUENJIEJyaWRnZQotCTAwNDkgIFdhcmhlYWQgU0NTSSBDb250cm9sbGVyCi0JMDA0ZSAgQVRNIENvbnRyb2xsZXIgKDE0MTA0ZTAwKQotCTAwNGYgIEFUTSBDb250cm9sbGVyICgxNDEwNGYwMCkKLQkwMDUwICBBVE0gQ29udHJvbGxlciAoMTQxMDUwMDApCi0JMDA1MyAgMjUgTUJpdCBBVE0gQ29udHJvbGxlcgotCTAwNTQgIEdYVDUwMFAvR1hUNTUwUCBHcmFwaGljcyBBZGFwdGVyCi0JMDA1NyAgTVBFRyBQQ0kgQnJpZGdlCi0JMDA1YyAgaTgyNTU3QiAxMC8xMDAKLQkwMDVlICBHWFQ4MDBQIEdyYXBoaWNzIEFkYXB0ZXIKLQkwMDdjICBBVE0gQ29udHJvbGxlciAoMTQxMDdjMDApCi0JMDA3ZCAgMzc4MElEU1AgW01XYXZlXQotCTAwOGIgIEVBRFMgUENJIHRvIFBDSSBCcmlkZ2UKLQkwMDhlICBHWFQzMDAwUCBHcmFwaGljcyBBZGFwdGVyCi0JMDA5MCAgR1hUIDMwMDBQCi0JCTEwMTQgMDA4ZSAgR1hULTMwMDBQCi0JMDA5MSAgU1NBIEFkYXB0ZXIKLQkwMDk1ICAyMEgyOTk5IFBDSSBEb2NraW5nIEJyaWRnZQotCTAwOTYgIENodWthciBjaGlwc2V0IFNDU0kgY29udHJvbGxlcgotCQkxMDE0IDAwOTcgIGlTZXJpZXMgMjc3OCBEQVNEIElPQQotCQkxMDE0IDAwOTggIGlTZXJpZXMgMjc2MyBEQVNEIElPQQotCQkxMDE0IDAwOTkgIGlTZXJpZXMgMjc0OCBEQVNEIElPQQotCTAwOWYgIFBDSSA0NzU4IENyeXB0b2dyYXBoaWMgQWNjZWxlcmF0b3IKLQkwMGE1ICBBVE0gQ29udHJvbGxlciAoMTQxMGE1MDApCi0JMDBhNiAgQVRNIDE1NU1CUFMgTU0gQ29udHJvbGxlciAoMTQxMGE2MDApCi0JMDBiNyAgMjU2LWJpdCBHcmFwaGljcyBSYXN0ZXJpemVyIFtGaXJlIEdMMV0KLQkJMTA5MiAwMGI4ICBGaXJlR0wxIEFHUCAzMk1iCi0JMDBiOCAgR1hUMjAwMFAgR3JhcGhpY3MgQWRhcHRlcgotCTAwYmUgIEFUTSA2MjJNQlBTIENvbnRyb2xsZXIgKDE0MTBiZTAwKQotCTAwZGMgIEFkdmFuY2VkIFN5c3RlbXMgTWFuYWdlbWVudCBBZGFwdGVyIChBU01BKQotCTAwZmMgIENQQzcxMCBEdWFsIEJyaWRnZSBhbmQgTWVtb3J5IENvbnRyb2xsZXIgKFBDSS02NCkKLQkwMTA0ICBHaWdhYml0IEV0aGVybmV0LVNYIEFkYXB0ZXIKLQkwMTA1ICBDUEM3MTAgRHVhbCBCcmlkZ2UgYW5kIE1lbW9yeSBDb250cm9sbGVyIChQQ0ktMzIpCi0JMDEwZiAgUmVtb3RlIFN1cGVydmlzb3IgQWRhcHRlciAoUlNBKQotCTAxNDIgIFlvdHRhIFZpZGVvIENvbXBvc2l0b3IgSW5wdXQKLQkJMTAxNCAwMTQzICBZb3R0YSBJbnB1dCBDb250cm9sbGVyICh5dGluKQotCTAxNDQgIFlvdHRhIFZpZGVvIENvbXBvc2l0b3IgT3V0cHV0Ci0JCTEwMTQgMDE0NSAgWW90dGEgT3V0cHV0IENvbnRyb2xsZXIgKHl0b3V0KQotCTAxNTYgIDQwNUdQIFBMQiB0byBQQ0kgQnJpZGdlCi0JMDE1ZSAgNjIyTWJwcyBBVE0gUENJIEFkYXB0ZXIKLQkwMTYwICA2NGJpdC82Nk1IeiBQQ0kgQVRNIDE1NSBNTUYKLQkwMTZlICBHWFQ0MDAwUCBHcmFwaGljcyBBZGFwdGVyCi0JMDE3MCAgR1hUNjAwMFAgR3JhcGhpY3MgQWRhcHRlcgotCTAxN2QgIEdYVDMwMFAgR3JhcGhpY3MgQWRhcHRlcgotCTAxODAgIFNuaXBlIGNoaXBzZXQgU0NTSSBjb250cm9sbGVyCi0JCTEwMTQgMDI0MSAgaVNlcmllcyAyNzU3IERBU0QgSU9BCi0JCTEwMTQgMDI2NCAgUXVhZCBDaGFubmVsIFBDSS1YIFUzMjAgU0NTSSBSQUlEIEFkYXB0ZXIgKDI3ODApCi0JMDE4OCAgRUFEUy1YIFBDSS1YIHRvIFBDSS1YIEJyaWRnZQotCTAxYTcgIFBDSS1YIHRvIFBDSS1YIEJyaWRnZQotCTAxYmQgIFNlcnZlUkFJRCBDb250cm9sbGVyCi0JCTEwMTQgMDFiZSAgU2VydmVSQUlELTRNCi0JCTEwMTQgMDFiZiAgU2VydmVSQUlELTRMCi0JCTEwMTQgMDIwOCAgU2VydmVSQUlELTRNeAotCQkxMDE0IDAyMGUgIFNlcnZlUkFJRC00THgKLQkJMTAxNCAwMjJlICBTZXJ2ZVJBSUQtNEgKLQkJMTAxNCAwMjU4ICBTZXJ2ZVJBSUQtNWkKLQkJMTAxNCAwMjU5ICBTZXJ2ZVJBSUQtNWkKLQkwMWMxICA2NGJpdC82Nk1IeiBQQ0kgQVRNIDE1NSBVVFAKLQkwMWU2ICBDcnlwdG9ncmFwaGljIEFjY2VsZXJhdG9yCi0JMDFmZiAgMTAvMTAwIE1icHMgRXRoZXJuZXQKLQkwMjE5ICBNdWx0aXBvcnQgU2VyaWFsIEFkYXB0ZXIKLQkJMTAxNCAwMjFhICBEdWFsIFJWWAotCQkxMDE0IDAyNTEgIEludGVybmFsIE1vZGVtL1JWWAotCQkxMDE0IDAyNTIgIFF1YWQgSW50ZXJuYWwgTW9kZW0KLQkwMjFiICBHWFQ2NTAwUCBHcmFwaGljcyBBZGFwdGVyCi0JMDIxYyAgR1hUNDUwMFAgR3JhcGhpY3MgQWRhcHRlcgotCTAyMzMgIEdYVDEzNVAgR3JhcGhpY3MgQWRhcHRlcgotCTAyNjYgIFBDSS1YIER1YWwgQ2hhbm5lbCBTQ1NJCi0JMDI2OCAgR2lnYWJpdCBFdGhlcm5ldC1TWCBBZGFwdGVyIChQQ0ktWCkKLQkwMjY5ICAxMC8xMDAvMTAwMCBCYXNlLVRYIEV0aGVybmV0IEFkYXB0ZXIgKFBDSS1YKQotCTAyOGMgIENpdHJpbmUgY2hpcHNldCBTQ1NJIGNvbnRyb2xsZXIKLQkJMTAxNCAwMjhEICBEdWFsIENoYW5uZWwgUENJLVggRERSIFNBUyBSQUlEIEFkYXB0ZXIgKDU3MkUpCi0JCTEwMTQgMDJCRSAgRHVhbCBDaGFubmVsIFBDSS1YIEREUiBVMzIwIFNDU0kgUkFJRCBBZGFwdGVyICg1NzFCKQotCQkxMDE0IDAyQzAgIER1YWwgQ2hhbm5lbCBQQ0ktWCBERFIgVTMyMCBTQ1NJIEFkYXB0ZXIgKDU3MUEpCi0JMDMwMiAgWC1BcmNoaXRlY3R1cmUgQnJpZGdlIFtTdW1taXRdCi0JMDMxNCAgWklTQyAwMzYgTmV1cmFsIGFjY2VsZXJhdG9yIGNhcmQKLQlmZmZmICBNUElDLTIgaW50ZXJydXB0IGNvbnRyb2xsZXIKLTEwMTUgIExTSSBMb2dpYyBDb3JwIG9mIENhbmFkYQotMTAxNiAgSUNMIFBlcnNvbmFsIFN5c3RlbXMKLTEwMTcgIFNQRUEgU29mdHdhcmUgQUcKLQk1MzQzICBTUEVBIDNEIEFjY2VsZXJhdG9yCi0xMDE4ICBVbmlzeXMgU3lzdGVtcwotMTAxOSAgRWxpdGVncm91cCBDb21wdXRlciBTeXN0ZW1zCi0xMDFhICBBVCZUIEdJUyAoTkNSKQotCTAwMDUgIDEwMFZHIGV0aGVybmV0Ci0xMDFiICBWaXRlc3NlIFNlbWljb25kdWN0b3IKLTEwMWMgIFdlc3Rlcm4gRGlnaXRhbAotCTAxOTMgIDMzQzE5M0EKLQkwMTk2ICAzM0MxOTZBCi0JMDE5NyAgMzNDMTk3QQotCTAyOTYgIDMzQzI5NkEKLQkzMTkzICA3MTkzCi0JMzE5NyAgNzE5NwotCTMyOTYgIDMzQzI5NkEKLQk0Mjk2ICAzNEMyOTYKLQk5NzEwICBQaXBlbGluZSA5NzEwCi0JOTcxMiAgUGlwZWxpbmUgOTcxMgotCWMyNGEgIDkwQwotMTAxZSAgQW1lcmljYW4gTWVnYXRyZW5kcyBJbmMuCi0JMTk2MCAgTWVnYVJBSUQKLQkJMTAxZSAwNDcxICBNZWdhUkFJRCA0NzEgRW50ZXJwcmlzZSAxNjAwIFJBSUQgQ29udHJvbGxlcgotCQkxMDFlIDA0NzUgIE1lZ2FSQUlEIDQ3NSBFeHByZXNzIDUwMC81MDBMQyBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwNDc3ICBNZWdhUkFJRCA0NzcgRWxpdGUgMzEwMCBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwNDkzICBNZWdhUkFJRCA0OTMgRWxpdGUgMTYwMCBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwNDk0ICBNZWdhUkFJRCA0OTQgRWxpdGUgMTY1MCBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwNTAzICBNZWdhUkFJRCA1MDMgRW50ZXJwcmlzZSAxNjUwIFJBSUQgQ29udHJvbGxlcgotCQkxMDFlIDA1MTEgIE1lZ2FSQUlEIDUxMSBpNCBJREUgUkFJRCBDb250cm9sbGVyCi0JCTEwMWUgMDUyMiAgTWVnYVJBSUQgNTIyIGk0MTMzIFJBSUQgQ29udHJvbGxlcgotCQkxMDI4IDA0NzEgIFBvd2VyRWRnZSBSQUlEIENvbnRyb2xsZXIgMy9RQwotCQkxMDI4IDA0NzUgIFBvd2VyRWRnZSBSQUlEIENvbnRyb2xsZXIgMy9TQwotCQkxMDI4IDA0OTMgIFBvd2VyRWRnZSBSQUlEIENvbnRyb2xsZXIgMy9EQwotCQkxMDI4IDA1MTEgIFBvd2VyRWRnZSBDb3N0IEVmZmVjdGl2ZSBSQUlEIENvbnRyb2xsZXIgQVRBMTAwLzRDaAotCTkwMTAgIE1lZ2FSQUlEIDQyOCBVbHRyYSBSQUlEIENvbnRyb2xsZXIKLQk5MDMwICBFSURFIENvbnRyb2xsZXIKLQk5MDMxICBFSURFIENvbnRyb2xsZXIKLQk5MDMyICBFSURFICYgU0NTSSBDb250cm9sbGVyCi0JOTAzMyAgU0NTSSBDb250cm9sbGVyCi0JOTA0MCAgTXVsdGltZWRpYSBjYXJkCi0JOTA2MCAgTWVnYVJBSUQgNDM0IFVsdHJhIEdUIFJBSUQgQ29udHJvbGxlcgotCTkwNjMgIE1lZ2FSQUMKLQkJMTAxZSAwNzY3ICBEZWxsIFJlbW90ZSBBc3Npc3RhbnQgQ2FyZCAyCi0xMDFmICBQaWN0dXJlVGVsCi0xMDIwICBIaXRhY2hpIENvbXB1dGVyIFByb2R1Y3RzCi0xMDIxICBPS0kgRWxlY3RyaWMgSW5kdXN0cnkgQ28uIEx0ZC4KLTEwMjIgIEFkdmFuY2VkIE1pY3JvIERldmljZXMgW0FNRF0KLQkxMTAwICBLOCBbQXRobG9uNjQvT3B0ZXJvbl0gSHlwZXJUcmFuc3BvcnQgVGVjaG5vbG9neSBDb25maWd1cmF0aW9uCi0JMTEwMSAgSzggW0F0aGxvbjY0L09wdGVyb25dIEFkZHJlc3MgTWFwCi0JMTEwMiAgSzggW0F0aGxvbjY0L09wdGVyb25dIERSQU0gQ29udHJvbGxlcgotCTExMDMgIEs4IFtBdGhsb242NC9PcHRlcm9uXSBNaXNjZWxsYW5lb3VzIENvbnRyb2wKLQkyMDAwICA3OWM5NzAgW1BDbmV0MzIgTEFOQ0VdCi0JCTEwMTQgMjAwMCAgTmV0RmluaXR5IDEwLzEwMCBGYXN0IEV0aGVybmV0Ci0JCTEwMjIgMjAwMCAgUENuZXQgLSBGYXN0IDc5Qzk3MQotCQkxMDNjIDEwNGMgIEV0aGVybmV0IHdpdGggTEFOIHJlbW90ZSBwb3dlciBBZGFwdGVyCi0JCTEwM2MgMTA2NCAgRXRoZXJuZXQgd2l0aCBMQU4gcmVtb3RlIHBvd2VyIEFkYXB0ZXIKLQkJMTAzYyAxMDY1ICBFdGhlcm5ldCB3aXRoIExBTiByZW1vdGUgcG93ZXIgQWRhcHRlcgotCQkxMDNjIDEwNmMgIEV0aGVybmV0IHdpdGggTEFOIHJlbW90ZSBwb3dlciBBZGFwdGVyCi0JCTEwM2MgMTA2ZSAgRXRoZXJuZXQgd2l0aCBMQU4gcmVtb3RlIHBvd2VyIEFkYXB0ZXIKLQkJMTAzYyAxMGVhICBFdGhlcm5ldCB3aXRoIExBTiByZW1vdGUgcG93ZXIgQWRhcHRlcgotCQkxMTEzIDEyMjAgIEVOMTIyMCAxMC8xMDAgRmFzdCBFdGhlcm5ldAotCQkxMjU5IDI0NTAgIEFULTI0NTAgMTAvMTAwIEZhc3QgRXRoZXJuZXQKLQkJMTI1OSAyNDU0ICBBVC0yNDUwdjQgMTBNYiBFdGhlcm5ldCBBZGFwdGVyCi0JCTEyNTkgMjcwMCAgQVQtMjcwMFRYIDEwLzEwMCBGYXN0IEV0aGVybmV0Ci0JCTEyNTkgMjcwMSAgQVQtMjcwMEZYIDEwME1iIEV0aGVybmV0Ci0JCTRjNTMgMTAwMCAgQ0M3L0NSNy9DUDcvVkM3L1ZQNy9WUjcgbWFpbmJvYXJkCi0JCTRjNTMgMTAxMCAgQ1A1L0NSNiBtYWluYm9hcmQKLQkJNGM1MyAxMDIwICBWUjYgbWFpbmJvYXJkCi0JCTRjNTMgMTAzMCAgUEM1IG1haW5ib2FyZAotCQk0YzUzIDEwNDAgIENMNyBtYWluYm9hcmQKLQkJNGM1MyAxMDYwICBQQzcgbWFpbmJvYXJkCi0JMjAwMSAgNzljOTc4IFtIb21lUE5BXQotCQkxMDkyIDBhNzggIE11bHRpbWVkaWEgSG9tZSBOZXR3b3JrIEFkYXB0ZXIKLQkJMTY2OCAwMjk5ICBBY3Rpb25MaW5rIEhvbWUgTmV0d29yayBBZGFwdGVyCi0JMjAwMyAgQW0gMTc3MSBNQlcgW0FsY2hlbXldCi0JMjAyMCAgNTNjOTc0IFtQQ3Njc2ldCi0JMjA0MCAgNzljOTc0Ci0JMzAwMCAgRUxhblNDNTIwIE1pY3JvY29udHJvbGxlcgotCTcwMDYgIEFNRC03NTEgW0lyb25nYXRlXSBTeXN0ZW0gQ29udHJvbGxlcgotCTcwMDcgIEFNRC03NTEgW0lyb25nYXRlXSBBR1AgQnJpZGdlCi0JNzAwYSAgQU1ELUlHUjQgQUdQIEhvc3QgdG8gUENJIEJyaWRnZQotCTcwMGIgIEFNRC1JR1I0IFBDSSB0byBQQ0kgQnJpZGdlCi0JNzAwYyAgQU1ELTc2MCBNUCBbSUdENC0yUF0gU3lzdGVtIENvbnRyb2xsZXIKLQk3MDBkICBBTUQtNzYwIE1QIFtJR0Q0LTJQXSBBR1AgQnJpZGdlCi0JNzAwZSAgQU1ELTc2MCBbSUdENC0xUF0gU3lzdGVtIENvbnRyb2xsZXIKLQk3MDBmICBBTUQtNzYwIFtJR0Q0LTFQXSBBR1AgQnJpZGdlCi0JNzQwMCAgQU1ELTc1NSBbQ29icmFdIElTQQotCTc0MDEgIEFNRC03NTUgW0NvYnJhXSBJREUKLQk3NDAzICBBTUQtNzU1IFtDb2JyYV0gQUNQSQotCTc0MDQgIEFNRC03NTUgW0NvYnJhXSBVU0IKLQk3NDA4ICBBTUQtNzU2IFtWaXBlcl0gSVNBCi0JNzQwOSAgQU1ELTc1NiBbVmlwZXJdIElERQotCTc0MGIgIEFNRC03NTYgW1ZpcGVyXSBBQ1BJCi0JNzQwYyAgQU1ELTc1NiBbVmlwZXJdIFVTQgotCTc0MTAgIEFNRC03NjYgW1ZpcGVyUGx1c10gSVNBCi0JNzQxMSAgQU1ELTc2NiBbVmlwZXJQbHVzXSBJREUKLQk3NDEzICBBTUQtNzY2IFtWaXBlclBsdXNdIEFDUEkKLQk3NDE0ICBBTUQtNzY2IFtWaXBlclBsdXNdIFVTQgotCTc0NDAgIEFNRC03NjggW09wdXNdIElTQQotCQkxMDQzIDgwNDQgIEE3TS1EIE1haW5ib2FyZAotCTc0NDEgIEFNRC03NjggW09wdXNdIElERQotCTc0NDMgIEFNRC03NjggW09wdXNdIEFDUEkKLQkJMTA0MyA4MDQ0ICBBN00tRCBNYWluYm9hcmQKLQk3NDQ1ICBBTUQtNzY4IFtPcHVzXSBBdWRpbwotCTc0NDYgIEFNRC03NjggW09wdXNdIE1DOTcgTW9kZW0gKFNtYXJ0IExpbmsgSEFNUjU2MDAgY29tcGF0aWJsZSkKLQk3NDQ4ICBBTUQtNzY4IFtPcHVzXSBQQ0kKLQk3NDQ5ICBBTUQtNzY4IFtPcHVzXSBVU0IKLQk3NDUwICBBTUQtODEzMSBQQ0ktWCBCcmlkZ2UKLQk3NDUxICBBTUQtODEzMSBQQ0ktWCBBUElDCi0JNzQ1NCAgQU1ELTgxNTEgU3lzdGVtIENvbnRyb2xsZXIKLQk3NDU1ICBBTUQtODE1MSBBR1AgQnJpZGdlCi0JNzQ2MCAgQU1ELTgxMTEgUENJCi0JCTE2MWYgMzAxNyAgSERBTUIKLQk3NDYxICBBTUQtODExMSBVU0IKLQk3NDYyICBBTUQtODExMSBFdGhlcm5ldAotCTc0NjQgIEFNRC04MTExIFVTQgotCQkxNjFmIDMwMTcgIEhEQU1CCi0JNzQ2OCAgQU1ELTgxMTEgTFBDCi0JCTE2MWYgMzAxNyAgSERBTUIKLQk3NDY5ICBBTUQtODExMSBJREUKLQkJMTYxZiAzMDE3ICBIREFNQgotCTc0NmEgIEFNRC04MTExIFNNQnVzIDIuMAotCTc0NmIgIEFNRC04MTExIEFDUEkKLQkJMTYxZiAzMDE3ICBIREFNQgotCTc0NmQgIEFNRC04MTExIEFDOTcgQXVkaW8KLQkJMTYxZiAzMDE3ICBIREFNQgotCTc0NmUgIEFNRC04MTExIE1DOTcgTW9kZW0KLQk3NTZiICBBTUQtODExMSBBQ1BJCi0xMDIzICBUcmlkZW50IE1pY3Jvc3lzdGVtcwotCTAxOTQgIDgyQzE5NAotCTIwMDAgIDREV2F2ZSBEWAotCTIwMDEgIDREV2F2ZSBOWAotCQkxMjJkIDE0MDAgIFRyaWRlbnQgUENJMjg4LVEzRElJIChOWCkKLQkyMTAwICBDeWJlckJsYWRlIFhQNG0zMgotCTIyMDAgIFhHSSBWb2xhcmkgWFA1Ci0JODQwMCAgQ3liZXJCbGFkZS9pNwotCQkxMDIzIDg0MDAgIEN5YmVyQmxhZGUgaTcgQUdQCi0JODQyMCAgQ3liZXJCbGFkZS9pN2QKLQkJMGUxMSBiMTVhICBDeWJlckJsYWRlIGk3IEFHUAotCTg1MDAgIEN5YmVyQmxhZGUvaTEKLQk4NTIwICBDeWJlckJsYWRlIGkxCi0JCTBlMTEgYjE2ZSAgQ3liZXJCbGFkZSBpMSBBR1AKLQkJMTAyMyA4NTIwICBDeWJlckJsYWRlIGkxIEFHUAotCTg2MjAgIEN5YmVyQmxhZGUvaTEKLQkJMTAxNCAwNTAyICBUaGlua1BhZCBSMzAvVDMwCi0JODgyMCAgQ3liZXJCbGFkZSBYUEFpMQotCTkzMjAgIFRHVUkgOTMyMAotCTkzNTAgIEdVSSBBY2NlbGVyYXRvcgotCTkzNjAgIEZsYXQgcGFuZWwgR1VJIEFjY2VsZXJhdG9yCi0JOTM4MiAgQ3liZXIgOTM4MiBbUmVmZXJlbmNlIGRlc2lnbl0KLQk5MzgzICBDeWJlciA5MzgzIFtSZWZlcmVuY2UgZGVzaWduXQotCTkzODUgIEN5YmVyIDkzODUgW1JlZmVyZW5jZSBkZXNpZ25dCi0JOTM4NiAgQ3liZXIgOTM4NgotCTkzODggIEN5YmVyIDkzODgKLQk5Mzk3ICBDeWJlciA5Mzk3Ci0JOTM5YSAgQ3liZXIgOTM5N0RWRAotCTk0MjAgIFRHVUkgOTQyMAotCTk0MzAgIFRHVUkgOTQzMAotCTk0NDAgIFRHVUkgOTQ0MAotCTk0NjAgIFRHVUkgOTQ2MAotCTk0NzAgIFRHVUkgOTQ3MAotCTk1MjAgIEN5YmVyIDk1MjAKLQk5NTI1ICBDeWJlciA5NTI1Ci0JCTEwY2YgMTA5NCAgTGlmZWJvb2sgQzYxNTUKLQk5NTQwICBDeWJlciA5NTQwCi0JOTY2MCAgVEdVSSA5NjYwLzkzOHgvOTY4eAotCTk2ODAgIFRHVUkgOTY4MAotCTk2ODIgIFRHVUkgOTY4MgotCTk2ODMgIFRHVUkgOTY4MwotCTk2ODUgIFByb1ZJRElBIDk2ODUKLQk5NzUwICAzREltYWdlIDk3NTAKLQkJMTAxNCA5NzUwICAzREltYWdlIDk3NTAKLQkJMTAyMyA5NzUwICAzREltYWdlIDk3NTAKLQk5NzUzICBUR1VJIDk3NTMKLQk5NzU0ICBUR1VJIDk3NTQKLQk5NzU5ICBUR1VJIDk3NQotCTk3ODMgIFRHVUkgOTc4MwotCTk3ODUgIFRHVUkgOTc4NQotCTk4NTAgIDNESW1hZ2UgOTg1MAotCTk4ODAgIEJsYWRlIDNEIFBDSS9BR1AKLQkJMTAyMyA5ODgwICBCbGFkZSAzRAotCTk5MTAgIEN5YmVyQmxhZGUvWFAKLQk5OTMwICBDeWJlckJsYWRlL1hQbQotMTAyNCAgWmVuaXRoIERhdGEgU3lzdGVtcwotMTAyNSAgQWNlciBJbmNvcnBvcmF0ZWQgW0FMSV0KLQkxNDM1ICBNMTQzNQotCTE0NDUgIE0xNDQ1Ci0JMTQ0OSAgTTE0NDkKLQkxNDUxICBNMTQ1MQotCTE0NjEgIE0xNDYxCi0JMTQ4OSAgTTE0ODkKLQkxNTExICBNMTUxMQotCTE1MTIgIEFMSSBNMTUxMiBBbGFkZGluCi0JMTUxMyAgTTE1MTMKLQkxNTIxICBBTEkgTTE1MjEgQWxhZGRpbiBJSUkgQ1BVIEJyaWRnZQotCQkxMGI5IDE1MjEgIEFMSSBNMTUyMSBBbGFkZGluIElJSSBDUFUgQnJpZGdlCi0JMTUyMyAgQUxJIE0xNTIzIElTQSBCcmlkZ2UKLQkJMTBiOSAxNTIzICBBTEkgTTE1MjMgSVNBIEJyaWRnZQotCTE1MzEgIE0xNTMxIE5vcnRoYnJpZGdlIFtBbGFkZGluIElWL0lWK10KLQkxNTMzICBNMTUzMyBQQ0ktdG8tSVNBIEJyaWRnZQotCQkxMGI5IDE1MzMgIEFMSSBNMTUzMyBBbGFkZGluIElWL1YgSVNBIFNvdXRoIEJyaWRnZQotCTE1MzUgIE0xNTM1IFBDSSBCcmlkZ2UgKyBTdXBlciBJL08gKyBGSVIKLQkxNTQxICBNMTU0MSBOb3J0aGJyaWRnZSBbQWxhZGRpbiBWXQotCQkxMGI5IDE1NDEgIEFMSSBNMTU0MSBBbGFkZGluIFYvVisgQUdQK1BDSSBOb3J0aCBCcmlkZ2UKLQkxNTQyICBNMTU0MiBOb3J0aGJyaWRnZSBbQWxhZGRpbiBWXQotCTE1NDMgIE0xNTQzIFBDSS10by1JU0EgQnJpZGdlICsgU3VwZXIgSS9PICsgRklSCi0JMTU2MSAgTTE1NjEgTm9ydGhicmlkZ2UgW0FsYWRkaW4gN10KLQkxNjIxICBNMTYyMSBOb3J0aGJyaWRnZSBbQWxhZGRpbi1Qcm8gSUldCi0JMTYzMSAgTTE2MzEgTm9ydGhicmlkZ2UrM0QgR3JhcGhpY3MgW0FsYWRkaW4gVE5UMl0KLQkxNjQxICBNMTY0MSBOb3J0aGJyaWRnZSBbQWxhZGRpbi1Qcm8gSVZdCi0JMTY0NyAgTTE2NDcgW01hR2lLMV0gUENJIE5vcnRoIEJyaWRnZQotCTE2NzEgIE0xNjcxIE5vcnRoYnJpZGdlIFtBTEFERGlOLVA0XQotCTE2NzIgIE5vcnRoYnJpZGdlIFtDeWJlckFMQUREaU4tUDRdCi0JMzE0MSAgTTMxNDEKLQkzMTQzICBNMzE0MwotCTMxNDUgIE0zMTQ1Ci0JMzE0NyAgTTMxNDcKLQkzMTQ5ICBNMzE0OQotCTMxNTEgIE0zMTUxCi0JMzMwNyAgTTMzMDcgTVBFRy1JIFZpZGVvIENvbnRyb2xsZXIKLQkzMzA5ICBNMzMwOSBNUEVHLUlJIFZpZGVvIHcvIFNvZnR3YXJlIEF1ZGlvIERlY29kZXIKLQkzMzIxICBNMzMyMSBNUEVHLUlJIEF1ZGlvL1ZpZGVvIERlY29kZXIKLQk1MjEyICBNNDgwMwotCTUyMTUgIEFMSSBQQ0kgRUlERSBDb250cm9sbGVyCi0JNTIxNyAgTTUyMTdICi0JNTIxOSAgTTUyMTkKLQk1MjI1ICBNNTIyNQotCTUyMjkgIE01MjI5Ci0JNTIzNSAgTTUyMzUKLQk1MjM3ICBNNTIzNyBQQ0kgVVNCIEhvc3QgQ29udHJvbGxlcgotCTUyNDAgIEVJREUgQ29udHJvbGxlcgotCTUyNDEgIFBDTUNJQSBCcmlkZ2UKLQk1MjQyICBHZW5lcmFsIFB1cnBvc2UgQ29udHJvbGxlcgotCTUyNDMgIFBDSSB0byBQQ0kgQnJpZGdlIENvbnRyb2xsZXIKLQk1MjQ0ICBGbG9wcHkgRGlzayBDb250cm9sbGVyCi0JNTI0NyAgTTE1NDEgUENJIHRvIFBDSSBCcmlkZ2UKLQk1MjUxICBNNTI1MSBQMTM5NCBDb250cm9sbGVyCi0JNTQyNyAgUENJIHRvIEFHUCBCcmlkZ2UKLQk1NDUxICBNNTQ1MSBQQ0kgQUMtTGluayBDb250cm9sbGVyIEF1ZGlvIERldmljZQotCTU0NTMgIE01NDUzIFBDSSBBQy1MaW5rIENvbnRyb2xsZXIgTW9kZW0gRGV2aWNlCi0JNzEwMSAgTTcxMDEgUENJIFBNVSBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2xsZXIKLQkJMTBiOSA3MTAxICBNNzEwMSBQQ0kgUE1VIFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbGxlcgotMTAyOCAgRGVsbAotCTAwMDEgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciAyL1NpCi0JCTEwMjggMDAwMSAgUG93ZXJFZGdlIDI0MDAKLQkwMDAyICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIENvbnRyb2xsZXIgMy9EaQotCQkxMDI4IDAwMDIgIFBvd2VyRWRnZSA0NDAwCi0JMDAwMyAgUG93ZXJFZGdlIEV4cGFuZGFibGUgUkFJRCBDb250cm9sbGVyIDMvU2kKLQkJMTAyOCAwMDAzICBQb3dlckVkZ2UgMjQ1MAotCTAwMDYgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciAzL0RpCi0JMDAwNyAgUmVtb3RlIEFjY2VzcyBDYXJkIElJSQotCTAwMDggIFJlbW90ZSBBY2Nlc3MgQ2FyZCBJSUkKLQkwMDA5ICBSZW1vdGUgQWNjZXNzIENhcmQgSUlJOiBCTUMvU01JQyBkZXZpY2Ugbm90IHByZXNlbnQKLQkwMDBhICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIENvbnRyb2xsZXIgMy9EaQotCTAwMGMgIEVtYmVkZGVkIFJlbW90ZSBBY2Nlc3Mgb3IgRVJBL08KLQkwMDBkICBFbWJlZGRlZCBSZW1vdGUgQWNjZXNzOiBCTUMvU01JQyBkZXZpY2UKLQkwMDBlICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIGNvbnRyb2xsZXIgNC9EaQotCTAwMGYgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgY29udHJvbGxlciA0L0RpCi0JMDAxMCAgUmVtb3RlIEFjY2VzcyBDYXJkIDQKLQkwMDExICBSZW1vdGUgQWNjZXNzIENhcmQgNCBEYXVnaHRlciBDYXJkCi0JMDAxMiAgUmVtb3RlIEFjY2VzcyBDYXJkIDQgRGF1Z2h0ZXIgQ2FyZCBWaXJ0dWFsIFVBUlQKLQkwMDEzICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIGNvbnRyb2xsZXIgNAotCQkxMDI4IDAxNmMgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciA0ZS9TaQotCQkxMDI4IDAxNmQgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciA0ZS9EaQotCQkxMDI4IDAxNmUgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciA0ZS9EaQotCQkxMDI4IDAxNmYgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciA0ZS9EaQotCQkxMDI4IDAxNzAgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciA0ZS9EaQotCTAwMTQgIFJlbW90ZSBBY2Nlc3MgQ2FyZCA0IERhdWdodGVyIENhcmQgU01JQyBpbnRlcmZhY2UKLTEwMjkgIFNpZW1lbnMgTml4ZG9yZiBJUwotMTAyYSAgTFNJIExvZ2ljCi0JMDAwMCAgSFlEUkEKLQkwMDEwICBBU1BFTgotCTAwMWYgIEFIQS0yOTQwVTIvVTJXIC83ODkwLzc4OTEgU0NTSSBDb250cm9sbGVycwotCQk5MDA1IDAwMGYgIDI5NDBVMlcgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgMDEwNiAgMjk0MFUyVyBTQ1NJIENvbnRyb2xsZXIKLQkJOTAwNSBhMTgwICAyOTQwVTJXIFNDU0kgQ29udHJvbGxlcgotCTAwYzUgIEFJQy03ODk5IFUxNjAvbSBTQ1NJIENvbnRyb2xsZXIKLQkJMTAyOCAwMGM1ICBQb3dlckVkZ2UgMjU1MC8yNjUwLzQ2MDAKLQkwMGNmICBBSUMtNzg5OVAgVTE2MC9tCi0JCTEwMjggMDEwNiAgUG93ZXJFZGdlIDQ2MDAKLQkJMTAyOCAwMTIxICBQb3dlckVkZ2UgMjY1MAotMTAyYiAgTWF0cm94IEdyYXBoaWNzLCBJbmMuCi0jIERKOiBJJ3ZlIGEgc3VzcGljaW9uIHRoYXQgMDAxMCBpcyBhIGR1cGxpY2F0ZSBvZiAwZDEwLgotCTAwMTAgIE1HQS1JIFtJbXByZXNzaW9uP10KLQkwMTAwICBNR0EgMTA2NFNHIFtNeXN0aXF1ZV0KLQkwNTE4ICBNR0EtSUkgW0F0aGVuYV0KLQkwNTE5ICBNR0EgMjA2NFcgW01pbGxlbm5pdW1dCi0JMDUxYSAgTUdBIDEwNjRTRyBbTXlzdGlxdWVdCi0JCTEwMmIgMDEwMCAgTUdBLTEwNjRTRyBNeXN0aXF1ZQotCQkxMDJiIDExMDAgIE1HQS0xMDg0U0cgTXlzdGlxdWUKLQkJMTAyYiAxMjAwICBNR0EtMTA4NFNHIE15c3RpcXVlCi0JCTExMDAgMTAyYiAgTUdBLTEwODRTRyBNeXN0aXF1ZQotCQkxMTBhIDAwMTggIFNjZW5pYyBQcm8gQzUgKEQxMDI1KQotCTA1MWIgIE1HQSAyMTY0VyBbTWlsbGVubml1bSBJSV0KLQkJMTAyYiAwNTFiICBNR0EtMjE2NFcgTWlsbGVubml1bSBJSQotCQkxMDJiIDExMDAgIE1HQS0yMTY0VyBNaWxsZW5uaXVtIElJCi0JCTEwMmIgMTIwMCAgTUdBLTIxNjRXIE1pbGxlbm5pdW0gSUkKLQkwNTFlICBNR0EgMTA2NFNHIFtNeXN0aXF1ZV0gQUdQCi0JMDUxZiAgTUdBIDIxNjRXIFtNaWxsZW5uaXVtIElJXSBBR1AKLQkwNTIwICBNR0EgRzIwMAotCQkxMDJiIGRiYzIgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiYzggIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZTIgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZTggIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGZmMDMgIE1pbGxlbm5pdW0gRzIwMCBTRAotCQkxMDJiIGZmMDQgIE1hcnZlbCBHMjAwCi0JMDUyMSAgTUdBIEcyMDAgQUdQCi0JCTEwMTQgZmYwMyAgTWlsbGVubml1bSBHMjAwIEFHUAotCQkxMDJiIDQ4ZTkgIE15c3RpcXVlIEcyMDAgQUdQCi0JCTEwMmIgNDhmOCAgTWlsbGVubml1bSBHMjAwIFNEIEFHUAotCQkxMDJiIDRhNjAgIE1pbGxlbm5pdW0gRzIwMCBMRSBBR1AKLQkJMTAyYiA0YTY0ICBNaWxsZW5uaXVtIEcyMDAgQUdQCi0JCTEwMmIgYzkzYyAgTWlsbGVubml1bSBHMjAwIEFHUAotCQkxMDJiIGM5YjAgIE1pbGxlbm5pdW0gRzIwMCBBR1AKLQkJMTAyYiBjOWJjICBNaWxsZW5uaXVtIEcyMDAgQUdQCi0JCTEwMmIgY2E2MCAgTWlsbGVubml1bSBHMjUwIExFIEFHUAotCQkxMDJiIGNhNmMgIE1pbGxlbm5pdW0gRzI1MCBBR1AKLQkJMTAyYiBkYmJjICBNaWxsZW5uaXVtIEcyMDAgQUdQCi0JCTEwMmIgZGJjMiAgTWlsbGVubml1bSBHMjAwIE1NUyAoRHVhbCBHMjAwKQotCQkxMDJiIGRiYzMgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiYzggIE1pbGxlbm5pdW0gRzIwMCBNTVMgKER1YWwgRzIwMCkKLQkJMTAyYiBkYmQyICBHMjAwIE11bHRpLU1vbml0b3IKLQkJMTAyYiBkYmQzICBHMjAwIE11bHRpLU1vbml0b3IKLQkJMTAyYiBkYmQ0ICBHMjAwIE11bHRpLU1vbml0b3IKLQkJMTAyYiBkYmQ1ICBHMjAwIE11bHRpLU1vbml0b3IKLQkJMTAyYiBkYmQ4ICBHMjAwIE11bHRpLU1vbml0b3IKLQkJMTAyYiBkYmQ5ICBHMjAwIE11bHRpLU1vbml0b3IKLQkJMTAyYiBkYmUyICBNaWxsZW5uaXVtIEcyMDAgTU1TIChRdWFkIEcyMDApCi0JCTEwMmIgZGJlMyAgRzIwMCBNdWx0aS1Nb25pdG9yCi0JCTEwMmIgZGJlOCAgTWlsbGVubml1bSBHMjAwIE1NUyAoUXVhZCBHMjAwKQotCQkxMDJiIGRiZjIgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZjMgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZjQgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZjUgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZjggIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZjkgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGY4MDYgIE15c3RpcXVlIEcyMDAgVmlkZW8gQUdQCi0JCTEwMmIgZmYwMCAgTUdBLUcyMDAgQUdQCi0JCTEwMmIgZmYwMiAgTXlzdGlxdWUgRzIwMCBBR1AKLQkJMTAyYiBmZjAzICBNaWxsZW5uaXVtIEcyMDAgQUdQCi0JCTEwMmIgZmYwNCAgTWFydmVsIEcyMDAgQUdQCi0JCTExMGEgMDAzMiAgTUdBLUcyMDAgQUdQCi0JMDUyNSAgTUdBIEc0MDAgQUdQCi0JCTBlMTEgYjE2ZiAgTUdBLUc0MDAgQUdQCi0JCTEwMmIgMDMyOCAgTWlsbGVubml1bSBHNDAwIDE2TWIgU0RSQU0KLQkJMTAyYiAwMzM4ICBNaWxsZW5uaXVtIEc0MDAgMTZNYiBTRFJBTQotCQkxMDJiIDAzNzggIE1pbGxlbm5pdW0gRzQwMCAzMk1iIFNEUkFNCi0JCTEwMmIgMDU0MSAgTWlsbGVubml1bSBHNDUwIER1YWwgSGVhZAotCQkxMDJiIDA1NDIgIE1pbGxlbm5pdW0gRzQ1MCBEdWFsIEhlYWQgTFgKLQkJMTAyYiAwNTQzICBNaWxsZW5uaXVtIEc0NTAgU2luZ2xlIEhlYWQgTFgKLQkJMTAyYiAwNjQxICBNaWxsZW5uaXVtIEc0NTAgMzJNYiBTRFJBTSBEdWFsIEhlYWQKLQkJMTAyYiAwNjQyICBNaWxsZW5uaXVtIEc0NTAgMzJNYiBTRFJBTSBEdWFsIEhlYWQgTFgKLQkJMTAyYiAwNjQzICBNaWxsZW5uaXVtIEc0NTAgMzJNYiBTRFJBTSBTaW5nbGUgSGVhZCBMWAotCQkxMDJiIDA3YzAgIE1pbGxlbm5pdW0gRzQ1MCBEdWFsIEhlYWQgTEUKLQkJMTAyYiAwN2MxICBNaWxsZW5uaXVtIEc0NTAgU0RSIER1YWwgSGVhZCBMRQotCQkxMDJiIDBkNDEgIE1pbGxlbm5pdW0gRzQ1MCBEdWFsIEhlYWQgUENJCi0JCTEwMmIgMGQ0MiAgTWlsbGVubml1bSBHNDUwIER1YWwgSGVhZCBMWCBQQ0kKLQkJMTAyYiAwZDQzICBNaWxsZW5uaXVtIEc0NTAgMzJNYiBEdWFsIEhlYWQgUENJCi0JCTEwMmIgMGUwMCAgTWFydmVsIEc0NTAgZVRWCi0JCTEwMmIgMGUwMSAgTWFydmVsIEc0NTAgZVRWCi0JCTEwMmIgMGUwMiAgTWFydmVsIEc0NTAgZVRWCi0JCTEwMmIgMGUwMyAgTWFydmVsIEc0NTAgZVRWCi0JCTEwMmIgMGY4MCAgTWlsbGVubml1bSBHNDUwIExvdyBQcm9maWxlCi0JCTEwMmIgMGY4MSAgTWlsbGVubml1bSBHNDUwIExvdyBQcm9maWxlCi0JCTEwMmIgMGY4MiAgTWlsbGVubml1bSBHNDUwIExvdyBQcm9maWxlIERWSQotCQkxMDJiIDBmODMgIE1pbGxlbm5pdW0gRzQ1MCBMb3cgUHJvZmlsZSBEVkkKLQkJMTAyYiAxOWQ4ICBNaWxsZW5uaXVtIEc0MDAgMTZNYiBTR1JBTQotCQkxMDJiIDE5ZjggIE1pbGxlbm5pdW0gRzQwMCAzMk1iIFNHUkFNCi0JCTEwMmIgMjE1OSAgTWlsbGVubml1bSBHNDAwIER1YWwgSGVhZCAxNk1iCi0JCTEwMmIgMjE3OSAgTWlsbGVubml1bSBHNDAwIE1BWC9EdWFsIEhlYWQgMzJNYgotCQkxMDJiIDIxN2QgIE1pbGxlbm5pdW0gRzQwMCBEdWFsIEhlYWQgTWF4Ci0JCTEwMmIgMjNjMCAgTWlsbGVubml1bSBHNDUwCi0JCTEwMmIgMjNjMSAgTWlsbGVubml1bSBHNDUwCi0JCTEwMmIgMjNjMiAgTWlsbGVubml1bSBHNDUwIERWSQotCQkxMDJiIDIzYzMgIE1pbGxlbm5pdW0gRzQ1MCBEVkkKLQkJMTAyYiAyZjU4ICBNaWxsZW5uaXVtIEc0MDAKLQkJMTAyYiAyZjc4ICBNaWxsZW5uaXVtIEc0MDAKLQkJMTAyYiAzNjkzICBNYXJ2ZWwgRzQwMCBBR1AKLQkJMTAyYiA1ZGQwICA0U2lnaHQgSUkKLQkJMTAyYiA1ZjUwICA0U2lnaHQgSUkKLQkJMTAyYiA1ZjUxICA0U2lnaHQgSUkKLQkJMTAyYiA1ZjUyICA0U2lnaHQgSUkKLQkJMTAyYiA5MDEwICBNaWxsZW5uaXVtIEc0MDAgRHVhbCBIZWFkCi0JCTE0NTggMDQwMCAgR0EtRzQwMAotCQkxNzA1IDAwMDEgIE1pbGxlbm5pdW0gRzQ1MCAzMk1CIFNHUkFNCi0JCTE3MDUgMDAwMiAgTWlsbGVubml1bSBHNDUwIDE2TUIgU0dSQU0KLQkJMTcwNSAwMDAzICBNaWxsZW5uaXVtIEc0NTAgMzJNQgotCQkxNzA1IDAwMDQgIE1pbGxlbm5pdW0gRzQ1MCAxNk1CCi0JMDUyNyAgTUdBIFBhcmhlbGlhIEFHUAotCQkxMDJiIDA4NDAgIFBhcmhlbGlhIDEyOE1iCi0JMGQxMCAgTUdBIFVsdGltYS9JbXByZXNzaW9uCi0JMTAwMCAgTUdBIEcxMDAgW1Byb2R1Y3RpdmFdCi0JCTEwMmIgZmYwMSAgUHJvZHVjdGl2YSBHMTAwCi0JCTEwMmIgZmYwNSAgUHJvZHVjdGl2YSBHMTAwIE11bHRpLU1vbml0b3IKLQkxMDAxICBNR0EgRzEwMCBbUHJvZHVjdGl2YV0gQUdQCi0JCTEwMmIgMTAwMSAgTUdBLUcxMDAgQUdQCi0JCTEwMmIgZmYwMCAgTUdBLUcxMDAgQUdQCi0JCTEwMmIgZmYwMSAgTUdBLUcxMDAgUHJvZHVjdGl2YSBBR1AKLQkJMTAyYiBmZjAzICBNaWxsZW5uaXVtIEcxMDAgQUdQCi0JCTEwMmIgZmYwNCAgTUdBLUcxMDAgQUdQCi0JCTEwMmIgZmYwNSAgTUdBLUcxMDAgUHJvZHVjdGl2YSBBR1AgTXVsdGktTW9uaXRvcgotCQkxMTBhIDAwMWUgIE1HQS1HMTAwIEFHUAotCTIwMDcgIE1HQSBNaXN0cmFsCi0JMjUyNyAgTUdBIEc1NTAgQUdQCi0JCTEwMmIgMGY4MyAgTWlsbGVubml1bSBHNTUwCi0JCTEwMmIgMGY4NCAgTWlsbGVubml1bSBHNTUwIER1YWwgSGVhZCBERFIgMzJNYgotCQkxMDJiIDFlNDEgIE1pbGxlbm5pdW0gRzU1MAotCTI1MzcgIE1HQSBHNjUwIEFHUAotCTQ1MzYgIFZJQSBGcmFtZWdyYWJiZXIKLQk2NTczICBTaGFyayAxMC8xMDAgTXVsdGlwb3J0IFN3aXRjaE5JQwotMTAyYyAgQ2hpcHMgYW5kIFRlY2hub2xvZ2llcwotCTAwYjggIEY2NDMxMAotCTAwYzAgIEY2OTAwMCBIaVFWaWRlbwotCQkxMDJjIDAwYzAgIEY2OTAwMCBIaVFWaWRlbwotCQk0YzUzIDEwMDAgIENDNy9DUjcvQ1A3L1ZDNy9WUDcvVlI3IG1haW5ib2FyZAotCQk0YzUzIDEwMTAgIENQNS9DUjYgbWFpbmJvYXJkCi0JCTRjNTMgMTAyMCAgVlI2IG1haW5ib2FyZAotCQk0YzUzIDEwMzAgIFBDNSBtYWluYm9hcmQKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA1MSAgQ0U3IG1haW5ib2FyZAotCTAwZDAgIEY2NTU0NQotCTAwZDggIEY2NTU0NQotCTAwZGMgIEY2NTU0OAotCTAwZTAgIEY2NTU1MAotCTAwZTQgIEY2NTU1NAotCTAwZTUgIEY2NTU1NSBIaVFWUHJvCi0JCTBlMTEgYjA0OSAgQXJtYWRhIDE3MDAgTGFwdG9wIERpc3BsYXkgQ29udHJvbGxlcgotCTAwZjAgIEY2ODU1NAotCTAwZjQgIEY2ODU1NCBIaVFWaXNpb24KLQkwMGY1ICBGNjg1NTUKLQkwYzMwICBGNjkwMzAKLQkJNGM1MyAxMDAwICBDQzcvQ1I3L0NQNy9WQzcvVlA3L1ZSNyBtYWluYm9hcmQKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA1MSAgQ0U3IG1haW5ib2FyZAotIyBDNUMgcHJvamVjdCBjYW5jZWxsZWQKLQkJNGM1MyAxMDgwICBDVDggbWFpbmJvYXJkCi0xMDJkICBXeXNlIFRlY2hub2xvZ3kgSW5jLgotCTUwZGMgIDMzMjggQXVkaW8KLTEwMmUgIE9saXZldHRpIEFkdmFuY2VkIFRlY2hub2xvZ3kKLTEwMmYgIFRvc2hpYmEgQW1lcmljYQotCTAwMDkgIHI0eDAwCi0JMDAwYSAgVFgzOTI3IE1JUFMgUklTQyBQQ0kgQ29udHJvbGxlcgotCTAwMjAgIEFUTSBNZXRlb3IgMTU1Ci0JCTEwMmYgMDBmOCAgQVRNIE1ldGVvciAxNTUKLQkwMDMwICBUQzM1ODE1Q0YgUENJIDEwLzEwMCBNYml0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkwMDMxICBUQzM1ODE1Q0YgUENJIDEwLzEwMCBNYml0IEV0aGVybmV0IENvbnRyb2xsZXIgd2l0aCBXT0wKLQkwMTA1ICBUQzg2QzAwMSBbZ29rdS1zXSBJREUKLQkwMTA2ICBUQzg2QzAwMSBbZ29rdS1zXSBVU0IgMS4xIEhvc3QKLQkwMTA3ICBUQzg2QzAwMSBbZ29rdS1zXSBVU0IgRGV2aWNlIENvbnRyb2xsZXIKLQkwMTA4ICBUQzg2QzAwMSBbZ29rdS1zXSBJMkMvU0lPL0dQSU8gQ29udHJvbGxlcgotCTAxODAgIFRYNDkyNy8zOCBNSVBTIFJJU0MgUENJIENvbnRyb2xsZXIKLQkwMTgxICBUWDQ5MjUgTUlQUyBSSVNDIFBDSSBDb250cm9sbGVyCi0JMDE4MiAgVFg0OTM3IE1JUFMgUklTQyBQQ0kgQ29udHJvbGxlcgotMTAzMCAgVE1DIFJlc2VhcmNoCi0xMDMxICBNaXJvIENvbXB1dGVyIFByb2R1Y3RzIEFHCi0JNTYwMSAgREMyMCBBU0lDCi0JNTYwNyAgVmlkZW8gSS9PICYgbW90aW9uIEpQRUcgY29tcHJlc3NvcgotCTU2MzEgIE1lZGlhIDNECi0JNjA1NyAgTWlyb1ZpZGVvIERDMTAvREMzMCsKLTEwMzIgIENvbXBhcQotMTAzMyAgTkVDIENvcnBvcmF0aW9uCi0JMDAwMCAgVnI0MTgxQSBVU0IgSG9zdCBvciBGdW5jdGlvbiBDb250cm9sIFVuaXQKLQkwMDAxICBQQ0kgdG8gNDg2LWxpa2UgYnVzIEJyaWRnZQotCTAwMDIgIFBDSSB0byBWTDk4IEJyaWRnZQotCTAwMDMgIEFUTSBDb250cm9sbGVyCi0JMDAwNCAgUjQwMDAgUENJIEJyaWRnZQotCTAwMDUgIFBDSSB0byA0ODYtbGlrZSBidXMgQnJpZGdlCi0JMDAwNiAgUEMtOTgwMCBHcmFwaGljIEFjY2VsZXJhdG9yCi0JMDAwNyAgUENJIHRvIFVYLUJ1cyBCcmlkZ2UKLQkwMDA4ICBQQy05ODAwIEdyYXBoaWMgQWNjZWxlcmF0b3IKLQkwMDA5ICBQQ0kgdG8gUEM5ODAwIENvcmUtR3JhcGggQnJpZGdlCi0JMDAxNiAgUENJIHRvIFZMIEJyaWRnZQotCTAwMWEgIFtOaWxlIElJXQotCTAwMjEgIFZyYzQzNzMgW05pbGUgSV0KLQkwMDI5ICBQb3dlclZSIFBDWDEKLQkwMDJhICBQb3dlclZSIDNECi0JMDAyYyAgU3RhciBBbHBoYSAyCi0JMDAyZCAgUENJIHRvIEMtYnVzIEJyaWRnZQotCTAwMzUgIFVTQgotCQkxMTc5IDAwMDEgIFVTQgotCQkxMmVlIDcwMDAgIFJvb3QgSHViCi0JCTE3OTkgMDAwMSAgUm9vdCBIdWIKLQkJODA3ZCAwMDM1ICBQQ0ktVVNCMiAoT0hDSSBzdWJzeXN0ZW0pCi0JMDAzYiAgUENJIHRvIEMtYnVzIEJyaWRnZQotCTAwM2UgIE5BUENDQVJEIENhcmRidXMgQ29udHJvbGxlcgotCTAwNDYgIFBvd2VyVlIgUENYMiBbbWlkYXNdCi0JMDA1YSAgVnJjNTA3NCBbTmlsZSA0XQotCTAwNjMgIEZpcmV3YXJkZW4KLQkwMDY3ICBQb3dlclZSIE5lb24gMjUwIENoaXBzZXQKLQkJMTAxMCAwMDIwICBQb3dlclZSIE5lb24gMjUwIEFHUCAzMk1iCi0JCTEwMTAgMDA4MCAgUG93ZXJWUiBOZW9uIDI1MCBBR1AgMTZNYgotCQkxMDEwIDAwODggIFBvd2VyVlIgTmVvbiAyNTAgMTZNYgotCQkxMDEwIDAwOTAgIFBvd2VyVlIgTmVvbiAyNTAgQUdQIDE2TWIKLQkJMTAxMCAwMDk4ICBQb3dlclZSIE5lb24gMjUwIDE2TWIKLQkJMTAxMCAwMGEwICBQb3dlclZSIE5lb24gMjUwIEFHUCAzMk1iCi0JCTEwMTAgMDBhOCAgUG93ZXJWUiBOZW9uIDI1MCAzMk1iCi0JCTEwMTAgMDEyMCAgUG93ZXJWUiBOZW9uIDI1MCBBR1AgMzJNYgotCTAwNzIgIHVQRDcyODc0IElFRUUxMzk0IE9IQ0kgMS4xIDMtcG9ydCBQSFktTGluayBDdHJscgotCTAwNzQgIDU2ayBWb2ljZSBNb2RlbQotCQkxMDMzIDgwMTQgIFJDVjU2QUNGIDU2ayBWb2ljZSBNb2RlbQotCTAwOWIgIFZyYzU0NzYKLQkwMGE1ICBWUkM0MTczCi0JMDBhNiAgVlJDNTQ3NyBBQzk3Ci0JMDBjZCAgSUVFRSAxMzk0IFtPcmFuZ2VMaW5rXSBIb3N0IENvbnRyb2xsZXIKLQkJMTJlZSA4MDExICBSb290IGh1YgotCTAwY2UgIElFRUUgMTM5NCBIb3N0IENvbnRyb2xsZXIKLQkwMGRmICBWcjQxMzEKLQkwMGUwICBVU0IgMi4wCi0JCTBlZTQgMzM4MyAgU2l0ZWNvbSBJRUVFIDEzOTQgLyBVU0IyLjAgQ29tYm8gQ2FyZAotCQkxMmVlIDcwMDEgIFJvb3QgaHViCi0JCTE3OTkgMDAwMiAgUm9vdCBIdWIKLQkJODA3ZCAxMDQzICBQQ0ktVVNCMiAoRUhDSSBzdWJzeXN0ZW0pCi0JMDBlNyAgSUVFRSAxMzk0IEhvc3QgQ29udHJvbGxlcgotCTAwZjIgIHVQRDcyODc0IElFRUUxMzk0IE9IQ0kgMS4xIDMtcG9ydCBQSFktTGluayBDdHJscgotCTAwZjMgIHVQRDYxMTN4IE11bHRpbWVkaWEgRGVjb2Rlci9Qcm9jZXNzb3IgW0VNTUEyXQotCTAxMGMgIFZSNzcwMQotMTAzNCAgRnJhbWF0b21lIENvbm5lY3RvcnMgVVNBIEluYy4KLTEwMzUgIENvbXAuICYgQ29tbS4gUmVzZWFyY2ggTGFiCi0xMDM2ICBGdXR1cmUgRG9tYWluIENvcnAuCi0JMDAwMCAgVE1DLTE4QzMwIFszNkM3MF0KLTEwMzcgIEhpdGFjaGkgTWljcm8gU3lzdGVtcwotMTAzOCAgQU1QLCBJbmMKLTEwMzkgIFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIFtTaVNdCi0JMDAwMSAgVmlydHVhbCBQQ0ktdG8tUENJIGJyaWRnZSAoQUdQKQotCTAwMDIgIFNHODZDMjAyCi0JMDAwNiAgODVDNTAxLzIvMwotCTAwMDggIFNpUzg1QzUwMy81NTEzIChMUEMgQnJpZGdlKQotCTAwMDkgIEFDUEkKLSMgc291cmNlOiBodHRwOi8vbWVtYmVycy5kYXRhZmFzdC5uZXQuYXUvZGZ0MDgwMi9kb3dubG9hZHMvcGNpZGV2cy50eHQKLQkwMDE2ICBTaVM5NjEvMiBTTUJ1cyBDb250cm9sbGVyCi0JMDAxOCAgU2lTODVDNTAzLzU1MTMgKExQQyBCcmlkZ2UpCi0jIENvbnRyb2xsZXIgZm9yIDIgUEFUQSBhbmQgMiBTQVRBIGNoYW5uZWxzCi0JMDE4MCAgUkFJRCBidXMgY29udHJvbGxlciAxODAgU0FUQS9QQVRBICBbU2lTXQotCTAxODEgIFNpUyBTQVRBCi0JMDIwMCAgNTU5Ny81NTk4LzYzMjYgVkdBCi0JCTEwMzkgMDAwMCAgU2lTNTU5NyBTVkdBIChTaGFyZWQgUkFNKQotCTAyMDQgIDgyQzIwNAotCTAyMDUgIFNHODZDMjA1Ci0JMDMwMCAgMzAwLzMwNSBQQ0kvQUdQIFZHQSBEaXNwbGF5IEFkYXB0ZXIKLQkJMTA3ZCAyNzIwICBMZWFkdGVrIFdpbkZhc3QgVlIzMDAKLQkwMzEwICAzMTVIIFBDSS9BR1AgVkdBIERpc3BsYXkgQWRhcHRlcgotCTAzMTUgIDMxNSBQQ0kvQUdQIFZHQSBEaXNwbGF5IEFkYXB0ZXIKLQkwMzI1ICAzMTVQUk8gUENJL0FHUCBWR0EgRGlzcGxheSBBZGFwdGVyCi0JMDMzMCAgMzMwIFtYYWJyZV0gUENJL0FHUCBWR0EgRGlzcGxheSBBZGFwdGVyCi0JMDQwNiAgODVDNTAxLzIKLQkwNDk2ICA4NUM0OTYKLQkwNTMwICA1MzAgSG9zdAotCTA1NDAgIDU0MCBIb3N0Ci0JMDU1MCAgNTUwIEhvc3QKLQkwNTk3ICA1NTEzQwotCTA2MDEgIDg1QzYwMQotCTA2MjAgIDYyMCBIb3N0Ci0JMDYzMCAgNjMwIEhvc3QKLQkwNjMzICA2MzMgSG9zdAotCTA2MzUgIDYzNSBIb3N0Ci0JMDY0NSAgU2lTNjQ1IEhvc3QgJiBNZW1vcnkgJiBBR1AgQ29udHJvbGxlcgotCTA2NDYgIFNpUzY0NURYIEhvc3QgJiBNZW1vcnkgJiBBR1AgQ29udHJvbGxlcgotCTA2NDggIFNpUyA2NDV4eAotCTA2NTAgIDY1MC9NNjUwIEhvc3QKLQkwNjUxICA2NTEgSG9zdAotCTA2NTUgIDY1NSBIb3N0Ci0JMDY2MCAgNjYwIEhvc3QKLQkwNjYxICA2NjFGWC9NNjYxRlgvTTY2MU1YIEhvc3QKLQkwNzMwICA3MzAgSG9zdAotCTA3MzMgIDczMyBIb3N0Ci0JMDczNSAgNzM1IEhvc3QKLQkwNzQwICA3NDAgSG9zdAotCTA3NDEgIDc0MS83NDFHWC9NNzQxIEhvc3QKLQkwNzQ1ICA3NDUgSG9zdAotCTA3NDYgIDc0NiBIb3N0Ci0JMDc1NSAgNzU1IEhvc3QKLQkwNzYwICA3NjAvTTc2MCBIb3N0Ci0JMDkwMCAgU2lTOTAwIFBDSSBGYXN0IEV0aGVybmV0Ci0JCTEwMTkgMGExNCAgSzdTNUEgbW90aGVyYm9hcmQKLQkJMTAzOSAwOTAwICBTaVM5MDAgMTAvMTAwIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTA0MyA4MDM1ICBDVVNJLUZYIG1vdGhlcmJvYXJkCi0JMDk2MSAgU2lTOTYxIFtNdVRJT0wgTWVkaWEgSU9dCi0JMDk2MiAgU2lTOTYyIFtNdVRJT0wgTWVkaWEgSU9dCi0JMDk2MyAgU2lTOTYzIFtNdVRJT0wgTWVkaWEgSU9dCi0JMDk2NCAgU2lTOTY0IFtNdVRJT0wgTWVkaWEgSU9dCi0JMDk2NSAgU2lTOTY1IFtNdVRJT0wgTWVkaWEgSU9dCi0JMzYwMiAgODNDNjAyCi0JNTEwNyAgNTEwNwotCTUzMDAgIFNpUzU0MCBQQ0kgRGlzcGxheSBBZGFwdGVyCi0JNTMxNSAgNTUwIFBDSS9BR1AgVkdBIERpc3BsYXkgQWRhcHRlcgotCTU0MDEgIDQ4NiBQQ0kgQ2hpcHNldAotCTU1MTEgIDU1MTEvNTUxMgotCTU1MTMgIDU1MTMgW0lERV0KLQkJMTAxOSAwOTcwICBQNlNUUC1GTCBtb3RoZXJib2FyZAotCQkxMDM5IDU1MTMgIFNpUzU1MTMgRUlERSBDb250cm9sbGVyIChBLEIgc3RlcCkKLQkJMTA0MyA4MDM1ICBDVVNJLUZYIG1vdGhlcmJvYXJkCi0JNTUxNyAgNTUxNwotCTU1NzEgIDU1NzEKLQk1NTgxICA1NTgxIFBlbnRpdW0gQ2hpcHNldAotCTU1ODIgIDU1ODIKLQk1NTkxICA1NTkxLzU1OTIgSG9zdAotCTU1OTYgIDU1OTYgUGVudGl1bSBDaGlwc2V0Ci0JNTU5NyAgNTU5NyBbU2lTNTU4Ml0KLQk1NjAwICA1NjAwIEhvc3QKLQk2MjA0ICBWaWRlbyBkZWNvZGVyICYgTVBFRyBpbnRlcmZhY2UKLQk2MjA1ICBWR0EgQ29udHJvbGxlcgotCTYyMzYgIDYyMzYgM0QtQUdQCi0JNjMwMCAgNjMwLzczMCBQQ0kvQUdQIFZHQSBEaXNwbGF5IEFkYXB0ZXIKLQkJMTAxOSAwOTcwICBQNlNUUC1GTCBtb3RoZXJib2FyZAotCQkxMDQzIDgwMzUgIENVU0ktRlggbW90aGVyYm9hcmQKLQk2MzA2ICA1MzAvNjIwIFBDSS9BR1AgVkdBIERpc3BsYXkgQWRhcHRlcgotCQkxMDM5IDYzMDYgIFNpUzUzMCw2MjAgR1VJIEFjY2VsZXJhdG9yKzNECi0JNjMyNSAgNjV4L002NTAvNzQwIFBDSS9BR1AgVkdBIERpc3BsYXkgQWRhcHRlcgotCTYzMjYgIDg2QzMyNiA1NTk4LzYzMjYKLQkJMTAzOSA2MzI2ICBTaVM2MzI2IEdVSSBBY2NlbGVyYXRvcgotCQkxMDkyIDBhNTAgIFNwZWVkU3RhciBBNTAKLQkJMTA5MiAwYTcwICBTcGVlZFN0YXIgQTcwCi0JCTEwOTIgNDkxMCAgU3BlZWRTdGFyIEE3MAotCQkxMDkyIDQ5MjAgIFNwZWVkU3RhciBBNzAKLQkJMTU2OSA2MzI2ICBTaVM2MzI2IEdVSSBBY2NlbGVyYXRvcgotCTYzMzAgIDY2MS83NDEvNzYwIFBDSS9BR1AgVkdBIERpc3BsYXkgQWRhcHRlcgotCQkxMDM5IDYzMzAgIFtNXTY2MXhYL1tNXTc0MVtHWF0vW01dNzYwIFBDSS9BR1AgVkdBIEFkYXB0ZXIKLQk3MDAxICBVU0IgMS4wIENvbnRyb2xsZXIKLQkJMTAxOSAwYTE0ICBLN1M1QSBtb3RoZXJib2FyZAotCQkxMDM5IDcwMDAgIE9uYm9hcmQgVVNCIENvbnRyb2xsZXIKLQk3MDAyICBVU0IgMi4wIENvbnRyb2xsZXIKLQkJMTUwOSA3MDAyICBPbmJvYXJkIFVTQiBDb250cm9sbGVyCi0JNzAwNyAgRmlyZVdpcmUgQ29udHJvbGxlcgotCTcwMTIgIFNvdW5kIENvbnRyb2xsZXIKLSMgVGhlcmUgYXJlIG1heSBiZSBkaWZmZXJlbnQgbW9kZW0gY29kZWNzIGhlcmUgKEludGVsNTM3IGNvbXBhdGlibGUgYW5kIGluY29tcGF0aWJsZSkKLQk3MDEzICBBQyc5NyBNb2RlbSBDb250cm9sbGVyCi0JNzAxNiAgU2lTNzAxNiBQQ0kgRmFzdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEwMzkgNzAxNiAgU2lTNzAxNiAxMC8xMDAgRXRoZXJuZXQgQWRhcHRlcgotCTcwMTggIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTAxNCAwMWI2ICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTEwMTQgMDFiNyAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxMDE5IDcwMTggIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTAyNSAwMDBlICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTEwMjUgMDAxOCAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxMDM5IDcwMTggIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTA0MyA4MDBiICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTEwNTQgNzAxOCAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxMDdkIDUzMzAgIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTA3ZCA1MzUwICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTExNzAgMzIwOSAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxNDYyIDQwMGEgIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTRhNCAyMDg5ICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTE0Y2QgMjE5NCAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxNGZmIDExMDAgIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTUyZCA4ODA4ICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTE1NTggMTEwMyAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxNTU4IDIyMDAgIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTU2MyA3MDE4ICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTE1YzUgMDExMSAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkyNzBmIGExNzEgIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJYTBhMCAwMDIyICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JNzAxOSAgU2lTNzAxOSBBdWRpbyBBY2NlbGVyYXRvcgotMTAzYSAgU2Vpa28gRXBzb24gQ29ycG9yYXRpb24KLTEwM2IgIFRhdHVuZyBDby4gb2YgQW1lcmljYQotMTAzYyAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLQkxMDA1ICBBNDk3N0EgVmlzdWFsaXplIEVHCi0JMTAwNiAgVmlzdWFsaXplIEZYNgotCTEwMDggIFZpc3VhbGl6ZSBGWDQKLQkxMDBhICBWaXN1YWxpemUgRlgyCi0JMTAyOCAgVGFjaCBUTCBGaWJyZSBDaGFubmVsIEhvc3QgQWRhcHRlcgotCTEwMjkgIFRhY2ggWEwyIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JCTEwN2UgMDAwZiAgSW50ZXJwaGFzZSA1NTYwIEZpYnJlIENoYW5uZWwgQWRhcHRlcgotCQk5MDA0IDkyMTAgIDFHYi8yR2IgRmFtaWx5IEZpYnJlIENoYW5uZWwgQ29udHJvbGxlcgotCQk5MDA0IDkyMTEgIDFHYi8yR2IgRmFtaWx5IEZpYnJlIENoYW5uZWwgQ29udHJvbGxlcgotCTEwMmEgIFRhY2ggVFMgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQkJMTA3ZSAwMDBlICBJbnRlcnBoYXNlIDU1NDAvNTU0MSBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQkJOTAwNCA5MTEwICAxR2IvMkdiIEZhbWlseSBGaWJyZSBDaGFubmVsIENvbnRyb2xsZXIKLQkJOTAwNCA5MTExICAxR2IvMkdiIEZhbWlseSBGaWJyZSBDaGFubmVsIENvbnRyb2xsZXIKLQkxMDMwICBKMjU4NUEgRGVza0RpcmVjdCAxMC8xMDBWRyBOSUMKLQkxMDMxICBKMjU4NUIgSFAgMTAvMTAwVkcgUENJIExBTiBBZGFwdGVyCi0JCTEwM2MgMTA0MCAgSjI5NzNBIERlc2tEaXJlY3QgMTBCYXNlVCBOSUMKLQkJMTAzYyAxMDQxICBKMjU4NUIgRGVza0RpcmVjdCAxMC8xMDBWRyBOSUMKLQkJMTAzYyAxMDQyICBKMjk3MEEgRGVza0RpcmVjdCAxMEJhc2VULzIgTklDCi0JMTA0MCAgSjI5NzNBIERlc2tEaXJlY3QgMTBCYXNlVCBOSUMKLQkxMDQxICBKMjU4NUIgRGVza0RpcmVjdCAxMC8xMDAgTklDCi0JMTA0MiAgSjI5NzBBIERlc2tEaXJlY3QgMTBCYXNlVC8yIE5JQwotCTEwNDggIERpdmEgU2VyaWFsIFtHU1BdIE11bHRpcG9ydCBVQVJUCi0JCTEwM2MgMTA0OSAgVG9zY2EgQ29uc29sZQotCQkxMDNjIDEwNGEgIFRvc2NhIFNlY29uZGFyeQotCQkxMDNjIDEwNGIgIE1hZXN0cm8gU1AyCi0JCTEwM2MgMTIyMyAgU3VwZXJkb21lIENvbnNvbGUKLQkJMTAzYyAxMjI2ICBLZXlzdG9uZSBTUDIKLQkJMTAzYyAxMjI3ICBQb3dlcmJhciBTUDIKLQkJMTAzYyAxMjgyICBFdmVyZXN0IFNQMgotCQkxMDNjIDEzMDEgIERpdmEgUk1QMwotCTEwNTQgIFBDSSBMb2NhbCBCdXMgQWRhcHRlcgotCTEwNjQgIDc5Qzk3MCBQQ25ldCBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTA4YiAgVmlzdWFsaXplIEZYZQotCTEwYzEgIE5ldFNlcnZlciBTbWFydCBJUlEgUm91dGVyCi0JMTBlZCAgVG9wVG9vbHMgUmVtb3RlIENvbnRyb2wKLQkxMGYwICByaW8gU3lzdGVtIEJ1cyBBZGFwdGVyCi0JMTBmMSAgcmlvIEkvTyBDb250cm9sbGVyCi0JMTIwMCAgODI1NTdCIDEwLzEwMCBOSUMKLQkxMjE5ICBOZXRTZXJ2ZXIgUENJIEhvdC1QbHVnIENvbnRyb2xsZXIKLQkxMjFhICBOZXRTZXJ2ZXIgU01JQyBDb250cm9sbGVyCi0JMTIxYiAgTmV0U2VydmVyIExlZ2FjeSBDT00gUG9ydCBEZWNvZGVyCi0JMTIxYyAgTmV0U2VydmVyIFBDSSBDT00gUG9ydCBEZWNvZGVyCi0JMTIyOSAgengxIFN5c3RlbSBCdXMgQWRhcHRlcgotCTEyMmEgIHp4MSBJL08gQ29udHJvbGxlcgotCTEyMmUgIHp4MSBMb2NhbCBCdXMgQWRhcHRlcgotCTEyN2MgIHN4MTAwMCBJL08gQ29udHJvbGxlcgotCTEyOTAgIEF1eGlsaWFyeSBEaXZhIFNlcmlhbCBQb3J0Ci0JMTJiNCAgengxIFF1aWNrU2lsdmVyIEFHUDh4IExvY2FsIEJ1cyBBZGFwdGVyCi0JMjkxMCAgRTI5MTBBIFBDSUJ1cyBFeGVyY2lzZXIKLQkyOTI1ICBFMjkyNUEgMzIgQml0LCAzMyBNSHpQQ0kgRXhlcmNpc2VyICYgQW5hbHl6ZXIKLTEwM2UgIFNvbGxpZGF5IEVuZ2luZWVyaW5nCi0xMDNmICBTeW5vcHN5cy9Mb2dpYyBNb2RlbGluZyBHcm91cAotMTA0MCAgQWNjZWxncmFwaGljcyBJbmMuCi0xMDQxICBDb21wdXRyZW5kCi0xMDQyICBNaWNyb24KLQkxMDAwICBQQyBUZWNoIFJaMTAwMAotCTEwMDEgIFBDIFRlY2ggUloxMDAxCi0JMzAwMCAgU2FtdXJhaV8wCi0JMzAxMCAgU2FtdXJhaV8xCi0JMzAyMCAgU2FtdXJhaV9JREUKLTEwNDMgIEFTVVNUZUsgQ29tcHV0ZXIgSW5jLgotCTA2NzUgIElTRE5MaW5rIFAtSU4xMDAtU1QtRAotCTQwMTUgIHY3MTAwIFNEUkFNIFtHZUZvcmNlMiBNWF0KLQk0MDIxICB2NzEwMCBDb21ibyBEZWx1eGUgW0dlRm9yY2UyIE1YICsgVFYgdHVuZXJdCi0JNDA1NyAgdjgyMDAgR2VGb3JjZSAzCi0JODA0MyAgdjgyNDAgUEFMIDEyOE0gW1A0VF0gTW90aGVyYm9hcmQKLQk4MDdiICB2OTI4MC9URCBbR2Vmb3JjZTQgVEk0MjAwIDhYIFdpdGggVFYtT3V0IGFuZCBEVkldCi0JODBiYiAgdjkxODAgTWFnaWMvVCBbR2VGb3JjZTQgTVg0NDAgQUdQIDh4IDY0TUIgVFYtb3V0XQotCTgwYzUgIG5Gb3JjZTMgY2hpcHNldCBtb3RoZXJib2FyZCBbU0s4Tl0KLQk4MGRmICB2OTUyMCBNYWdpYy9UCi0xMDQ0ICBBZGFwdGVjIChmb3JtZXJseSBEUFQpCi0JMTAxMiAgRG9taW5vIFJBSUQgRW5naW5lCi0JYTQwMCAgU21hcnRDYWNoZS9SYWlkIEktSVYgQ29udHJvbGxlcgotCWE1MDAgIFBDSSBCcmlkZ2UKLQlhNTAxICBTbWFydFJBSUQgViBDb250cm9sbGVyCi0JCTEwNDQgYzAwMSAgUE0xNTU0VTIgVWx0cmEyIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAwMiAgUE0xNjU0VTIgVWx0cmEyIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAwMyAgUE0xNTY0VTMgVWx0cmEzIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAwNCAgUE0xNTY0VTMgVWx0cmEzIER1YWwgQ2hhbm5lbAotCQkxMDQ0IGMwMDUgIFBNMTU1NFUyIFVsdHJhMiBTaW5nbGUgQ2hhbm5lbCAoTk9OIEFDUEkpCi0JCTEwNDQgYzAwYSAgUE0yNTU0VTIgVWx0cmEyIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAwYiAgUE0yNjU0VTIgVWx0cmEyIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAwYyAgUE0yNjY0VTMgVWx0cmEzIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAwZCAgUE0yNjY0VTMgVWx0cmEzIER1YWwgQ2hhbm5lbAotCQkxMDQ0IGMwMGUgIFBNMjU1NFUyIFVsdHJhMiBTaW5nbGUgQ2hhbm5lbCAoTk9OIEFDUEkpCi0JCTEwNDQgYzAwZiAgUE0yNjU0VTIgVWx0cmEyIFNpbmdsZSBDaGFubmVsIChOT04gQUNQSSkKLQkJMTA0NCBjMDE0ICBQTTM3NTRVMiBVbHRyYTIgU2luZ2xlIENoYW5uZWwgKE5PTiBBQ1BJKQotCQkxMDQ0IGMwMTUgIFBNMzc1NVUyQiBVbHRyYTIgU2luZ2xlIENoYW5uZWwgKE5PTiBBQ1BJKQotCQkxMDQ0IGMwMTYgIFBNMzc1NUYgRmlicmUgQ2hhbm5lbCAoTk9OIEFDUEkpCi0JCTEwNDQgYzAxZSAgUE0zNzU3VTIgVWx0cmEyIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAxZiAgUE0zNzU3VTIgVWx0cmEyIER1YWwgQ2hhbm5lbAotCQkxMDQ0IGMwMjAgIFBNMzc2N1UzIFVsdHJhMyBEdWFsIENoYW5uZWwKLQkJMTA0NCBjMDIxICBQTTM3NjdVMyBVbHRyYTMgUXVhZCBDaGFubmVsCi0JCTEwNDQgYzAyOCAgUE0yODY1VTMgVWx0cmEzIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAyOSAgUE0yODY1VTMgVWx0cmEzIER1YWwgQ2hhbm5lbAotCQkxMDQ0IGMwMmEgIFBNMjg2NUYgRmlicmUgQ2hhbm5lbAotCQkxMDQ0IGMwM2MgIDIwMDBTIFVsdHJhMyBTaW5nbGUgQ2hhbm5lbAotCQkxMDQ0IGMwM2QgIDIwMDBTIFVsdHJhMyBEdWFsIENoYW5uZWwKLQkJMTA0NCBjMDNlICAyMDAwRiBGaWJyZSBDaGFubmVsCi0JCTEwNDQgYzA0NiAgMzAwMFMgVWx0cmEzIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzA0NyAgMzAwMFMgVWx0cmEzIER1YWwgQ2hhbm5lbAotCQkxMDQ0IGMwNDggIDMwMDBGIEZpYnJlIENoYW5uZWwKLQkJMTA0NCBjMDUwICA1MDAwUyBVbHRyYTMgU2luZ2xlIENoYW5uZWwKLQkJMTA0NCBjMDUxICA1MDAwUyBVbHRyYTMgRHVhbCBDaGFubmVsCi0JCTEwNDQgYzA1MiAgNTAwMEYgRmlicmUgQ2hhbm5lbAotCQkxMDQ0IGMwNWEgIDI0MDBBIFVETUEgRm91ciBDaGFubmVsCi0JCTEwNDQgYzA1YiAgMjQwMEEgVURNQSBGb3VyIENoYW5uZWwgREFDCi0JCTEwNDQgYzA2NCAgMzAxMFMgVWx0cmEzIER1YWwgQ2hhbm5lbAotCQkxMDQ0IGMwNjUgIDM0MTBTIFVsdHJhMTYwIEZvdXIgQ2hhbm5lbAotCQkxMDQ0IGMwNjYgIDMwMTBTIEZpYnJlIENoYW5uZWwKLQlhNTExICBTbWFydFJBSUQgViBDb250cm9sbGVyCi0JCTEwNDQgYzAzMiAgQVNSLTIwMDVTIEkyTyBaZXJvIENoYW5uZWwKLTEwNDUgIE9QVGkgSW5jLgotCWEwZjggIDgyQzc1MCBbVmVuZGV0dGFdIFVTQiBDb250cm9sbGVyCi0JYzEwMSAgOTJDMjY0Ci0JYzE3OCAgOTJDMTc4Ci0JYzU1NiAgODJYNTU2IFtWaXBlcl0KLQljNTU3ICA4MkM1NTcgW1ZpcGVyLU1dCi0JYzU1OCAgODJDNTU4IFtWaXBlci1NIElTQStJREVdCi0JYzU2NyAgODJDNzUwIFtWZW5kZXR0YV0sIGRldmljZSAwCi0JYzU2OCAgODJDNzUwIFtWZW5kZXR0YV0sIGRldmljZSAxCi0JYzU2OSAgODJDNTc5IFtWaXBlciBYUHJlc3MrIENoaXBzZXRdCi0JYzYyMSAgODJDNjIxIFtWaXBlci1NL04rXQotCWM3MDAgIDgyQzcwMCBbRmlyZVN0YXJdCi0JYzcwMSAgODJDNzAxIFtGaXJlU3RhciBQbHVzXQotCWM4MTQgIDgyQzgxNCBbRmlyZWJyaWRnZSAxXQotCWM4MjIgIDgyQzgyMgotCWM4MjQgIDgyQzgyNAotCWM4MjUgIDgyQzgyNSBbRmlyZWJyaWRnZSAyXQotCWM4MzIgIDgyQzgzMgotCWM4NjEgIDgyQzg2MQotCWM4OTUgIDgyQzg5NQotCWM5MzUgIEVWMTkzNSBFQ1RJVkEgTWFjaE9uZSBQQ0lBdWRpbwotCWQ1NjggIDgyQzgyNSBbRmlyZWJyaWRnZSAyXQotCWQ3MjEgIElERSBbRmlyZVN0YXJdCi0xMDQ2ICBJUEMgQ29ycG9yYXRpb24sIEx0ZC4KLTEwNDcgIEdlbm9hIFN5c3RlbXMgQ29ycAotMTA0OCAgRWxzYSBBRwotCTBjNjAgIEdsYWRpYWMgTVgKLQkwZDIyICBRdWFkcm80IDkwMFhHTCBbRUxTQSBHTG9yaWE0IDkwMFhHTF0KLQkxMDAwICBRdWlja1N0ZXAgMTAwMAotCTMwMDAgIFF1aWNrU3RlcCAzMDAwCi0JODkwMSAgR2xvcmlhIFhMCi0xMDQ5ICBGb3VudGFpbiBUZWNobm9sb2dpZXMsIEluYy4KLSMgIyBuZWUgU0dTIFRob21zb24gTWljcm9lbGVjdHJvbmljcwotMTA0YSAgU1RNaWNyb2VsZWN0cm9uaWNzCi0JMDAwOCAgU1RHIDIwMDBYCi0JMDAwOSAgU1RHIDE3NjRYCi0JMDAxMCAgU1RHNDAwMCBbM0QgUHJvcGhldCBLeXJvIFNlcmllc10KLQkwMjA5ICBTVFBDIENvbnN1bWVyL0luZHVzdHJpYWwgTm9ydGgtIGFuZCBTb3V0aGJyaWRnZQotCTAyMGEgIFNUUEMgQXRsYXMvQ29uc3VtZXJTL0NvbnN1bWVyIElJQSBOb3J0aGJyaWRnZQotIyBGcm9tIDxodHRwOi8vZ2F0ZWtlZXBlci5kZWMuY29tL3B1Yi9CU0QvRnJlZUJTRC9GcmVlQlNELXN0YWJsZS9zcmMvc2hhcmUvbWlzYy9wY2lfdmVuZG9ycz4KLQkwMjEwICBTVFBDIEF0bGFzIElTQSBCcmlkZ2UKLQkwMjFhICBTVFBDIENvbnN1bWVyIFMgU291dGhicmlkZ2UKLQkwMjFiICBTVFBDIENvbnN1bWVyIElJQSBTb3V0aGJyaWRnZQotCTA1MDAgIFNUNzAxMzcgW1VuaWNvcm5dIEFEU0wgRE1UIFRyYW5zY2VpdmVyCi0JMDU2NCAgU1RQQyBDbGllbnQgTm9ydGhicmlkZ2UKLQkwOTgxICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQkxNzQ2ICBTVEcgMTc2NFgKLQkyNzc0ICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQkzNTIwICBNUEVHLUlJIGRlY29kZXIgY2FyZAotCTU1Y2MgIFNUUEMgQ2xpZW50IFNvdXRoYnJpZGdlCi0xMDRiICBCdXNMb2dpYwotCTAxNDAgIEJULTk0NkMgKG9sZCkgW211bHRpbWFzdGVyICAwMV0KLQkxMDQwICBCVC05NDZDIChCQTgwQzMwKSBbTXVsdGlNYXN0ZXIgMTBdCi0JODEzMCAgRmxhc2hwb2ludCBMVAotMTA0YyAgVGV4YXMgSW5zdHJ1bWVudHMKLQkwNTAwICAxMDAgTUJpdCBMQU4gQ29udHJvbGxlcgotCTA1MDggIFRNUzM4MEMyWCBDb21wcmVzc29yIEludGVyZmFjZQotCTEwMDAgIEVhZ2xlIGkvZiBBUwotCTEwNGMgIFBDSTE1MTAgUEMgY2FyZCBDYXJkYnVzIENvbnRyb2xsZXIKLQkzZDA0ICBUVlA0MDEwIFtQZXJtZWRpYV0KLQkzZDA3ICBUVlA0MDIwIFtQZXJtZWRpYSAyXQotCQkxMDExIDRkMTAgIENvbWV0Ci0JCTEwNDAgMDAwZiAgQWNjZWxTdGFyIElJCi0JCTEwNDAgMDAxMSAgQWNjZWxTdGFyIElJCi0JCTEwNDggMGEzMSAgV0lOTkVSIDIwMDAKLQkJMTA0OCAwYTMyICBHTG9yaWEgU3luZXJneQotCQkxMDQ4IDBhMzUgIEdMb3JpYSBTeW5lcmd5Ci0JCTEwN2QgMjYzMyAgV2luRmFzdCAzRCBMMjMwMAotCQkxMDkyIDAxMjcgIEZJUkUgR0wgMTAwMCBQUk8KLQkJMTA5MiAwMTM2ICBGSVJFIEdMIDEwMDAgUFJPCi0JCTEwOTIgMDE0MSAgRklSRSBHTCAxMDAwIFBSTwotCQkxMDkyIDAxNDYgIEZJUkUgR0wgMTAwMCBQUk8KLQkJMTA5MiAwMTQ4ICBGSVJFIEdMIDEwMDAgUFJPCi0JCTEwOTIgMDE0OSAgRklSRSBHTCAxMDAwIFBSTwotCQkxMDkyIDAxNTIgIEZJUkUgR0wgMTAwMCBQUk8KLQkJMTA5MiAwMTU0ICBGSVJFIEdMIDEwMDAgUFJPCi0JCTEwOTIgMDE1NSAgRklSRSBHTCAxMDAwIFBSTwotCQkxMDkyIDAxNTYgIEZJUkUgR0wgMTAwMCBQUk8KLQkJMTA5MiAwMTU3ICBGSVJFIEdMIDEwMDAgUFJPCi0JCTEwOTcgM2QwMSAgSmVyb25pbW8gUHJvCi0JCTExMDIgMTAwZiAgR3JhcGhpY3MgQmxhc3RlciBFeHRyZW1lCi0JCTNkM2QgMDEwMCAgUmVmZXJlbmNlIFBlcm1lZGlhIDIgM0QKLQk4MDAwICBQQ0lMeW54L1BDSUx5bngyIElFRUUgMTM5NCBMaW5rIExheWVyIENvbnRyb2xsZXIKLQkJZTRiZiAxMDEwICBDRjEtMS1TTkFSRQotCQllNGJmIDEwMjAgIENGMS0yLVNOQVJFCi0JODAwOSAgRmlyZVdpcmUgQ29udHJvbGxlcgotCQkxMDRkIDgwMzIgIDgwMzIgT0hDSSBpLkxJTksgKElFRUUgMTM5NCkgQ29udHJvbGxlcgotCTgwMTcgIFBDSTQ0MTAgRmlyZVdpcmUgQ29udHJvbGxlcgotCTgwMTkgIFRTQjEyTFYyMyBJRUVFLTEzOTQgQ29udHJvbGxlcgotCQkxMWJkIDAwMGEgIFN0dWRpbyBEVjUwMC0xMzk0Ci0JCTExYmQgMDAwZSAgU3R1ZGlvIERWCi0JCWU0YmYgMTAxMCAgQ0YyLTEtQ1lNQkFMCi0JODAyMCAgVFNCMTJMVjI2IElFRUUtMTM5NCBDb250cm9sbGVyIChMaW5rKQotCQkxMWJkIDAwMGYgIFN0dWRpbyBEVjUwMC0xMzk0Ci0JODAyMSAgVFNCNDNBQTIyIElFRUUtMTM5NCBDb250cm9sbGVyIChQSFkvTGluayBJbnRlZ3JhdGVkKQotCQkxMDRkIDgwZGYgIFZhaW8gUENHLUZYNDAzCi0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JODAyMiAgVFNCNDNBQjIyIElFRUUtMTM5NGEtMjAwMCBDb250cm9sbGVyIChQSFkvTGluaykKLQk4MDIzICBUU0I0M0FCMjIvQSBJRUVFLTEzOTRhLTIwMDAgQ29udHJvbGxlciAoUEhZL0xpbmspCi0JCTEwM2MgMDg4YyAgbmM4MDAwIGxhcHRvcAotCTgwMjQgIFRTQjQzQUIyMyBJRUVFLTEzOTRhLTIwMDAgQ29udHJvbGxlciAoUEhZL0xpbmspCi0JODAyNSAgVFNCODJBQTIgSUVFRS0xMzk0YiBMaW5rIExheWVyIENvbnRyb2xsZXIKLQkJNTVhYSA1NWFhICBGaXJlV2lyZSA4MDAgUENJIENhcmQKLQk4MDI2ICBUU0I0M0FCMjEgSUVFRS0xMzk0YS0yMDAwIENvbnRyb2xsZXIgKFBIWS9MaW5rKQotCTgwMjcgIFBDSTQ0NTEgSUVFRS0xMzk0IENvbnRyb2xsZXIKLQkJMTAyOCAwMGU2ICBQQ0k0NDUxIElFRUUtMTM5NCBDb250cm9sbGVyIChEZWxsIEluc3Bpcm9uIDgxMDApCi0JODAyOSAgUENJNDUxMCBJRUVFLTEzOTQgQ29udHJvbGxlcgotCQkxMDI4IDAxNjMgIExhdGl0dWRlIEQ1MDUKLQkJMTA3MSA4MTYwICBNSU0yOTAwCi0JODAyYiAgUENJNzQxMCw3NTEwLDc2MTAgT0hDSS1MeW54IENvbnRyb2xsZXIKLQkJMTAyOCAwMTRlICBQQ0k3NDEwLDc1MTAsNzYxMCBPSENJLUx5bnggQ29udHJvbGxlciAoRGVsbCBMYXRpdHVkZSBEODAwKQotCTgwMmUgIFBDSTd4MjAgMTM5NGEtMjAwMCBPSENJIFR3by1Qb3J0IFBIWS9MaW5rLUxheWVyIENvbnRyb2xsZXIKLQk4MDMxICBUZXhhcyBJbnN0cnVtZW50cyBQQ0l4eDIxL3g1MTUgQ2FyZGJ1cyBDb250cm9sbGVyCi0JODAzMiAgVGV4YXMgSW5zdHJ1bWVudHMgT0hDSSBDb21wbGlhbnQgSUVFRSAxMzk0IEhvc3QgQ29udHJvbGxlcgotCTgwMzMgIFRleGFzIEluc3RydW1lbnRzIFBDSXh4MjEgSW50ZWdyYXRlZCBGbGFzaE1lZGlhIENvbnRyb2xsZXIKLQk4MDM0ICBUZXhhcyBJbnN0cnVtZW50cyBQQ0k2NDExLCBQQ0k2NDIxLCBQQ0k2NjExLCBQQ0k2NjIxLCBQQ0k3NDExLCBQQ0k3NDIxLCBQQ0k3NjExLCBQQ0k3NjIxIFNlY3VyZSBEaWdpdGFsIChTRCkgQ29udHJvbGxlcgotCTgwMzUgIFRleGFzIEluc3RydW1lbnRzIFBDSTY0MTEsIFBDSTY0MjEsIFBDSTY2MTEsIFBDSTY2MjEsIFBDSTc0MTEsIFBDSTc0MjEsIFBDSTc2MTEsIFBDSTc2MjEgU21hcnQgQ2FyZCBDb250cm9sbGVyIChTTUMpCi0JODIwMSAgUENJMTYyMCBGaXJtd2FyZSBMb2FkaW5nIEZ1bmN0aW9uCi0JODIwNCAgUENJNzQxMCw3NTEwLDc2MTAgUENJIEZpcm13YXJlIExvYWRpbmcgRnVuY3Rpb24KLQkJMTAyOCAwMTRlICBMYXRpdHVkZSBEODAwCi0JODQwMCAgQUNYIDEwMCAyMk1icHMgV2lyZWxlc3MgSW50ZXJmYWNlCi0JCTAwZmMgMTZlYyAgVS5TLiBSb2JvdGljcyAyMiBNYnBzIFdpcmVsZXNzIFBDIENhcmQgKG1vZGVsIDIyMTApCi0JCTAwZmQgMTZlYyAgVS5TLiBSb2JvdGljcyAyMk1icHMgV2lyZWxlc3MgUENJIEFkYXB0ZXIgKG1vZGVsIDIyMTYpCi0JCTExODYgM2IwMCAgRFdMLTY1MCsgUEMgQ2FyZCBjYXJkYnVzIDIyTWJzIFdpcmVsZXNzIEFkYXB0ZXIgW0FpclBsdXNdCi0JCTExODYgM2IwMSAgRFdMLTUyMCsgMjJNYnBzIFBDSSBXaXJlbGVzcyBBZGFwdGVyCi0JODQwMSAgQUNYIDEwMCAyMk1icHMgV2lyZWxlc3MgSW50ZXJmYWNlCi0jIE9LLCB0aGlzIGluZm8gaXMgYWxtb3N0IHVzZWxlc3MgYXMgaXMsIGJ1dCBhdCBsZWFzdCBpdCdzIGtub3duIHRoYXQgaXQncyBhIHdpcmVsZXNzIGNhcmQuIE1vcmUgaW5mbyByZXF1ZXN0ZWQgZnJvbSByZXBvcnRlciAod2hpCi0JOTAwMCAgV2lyZWxlc3MgSW50ZXJmYWNlIChvZiB1bmtub3duIHR5cGUpCi0JOTA2NiAgQUNYIDExMSA1NE1icHMgV2lyZWxlc3MgSW50ZXJmYWNlCi0JYTAwMSAgVERDMTU3MAotCWExMDAgIFREQzE1NjEKLQlhMTAyICBUTkVUQTE1NzUgSHlwZXJTQVIgUGx1cyB3L1BDSSBIb3N0IGkvZiAmIFVUT1BJQSBpL2YKLQlhMTA2ICBUTVMzMjBDNjIwNSBGaXhlZCBQb2ludCBEU1AKLQkJMTc1YyA1MDAwICBBU0k1MHh4IEF1ZGlvIEFkYXB0ZXIKLQkJMTc1YyA4NzAwICBBU0k4N3h4IFJhZGlvIFR1bmVyIGNhcmQKLQlhYzEwICBQQ0kxMDUwCi0JYWMxMSAgUENJMTA1MwotCWFjMTIgIFBDSTExMzAKLQlhYzEzICBQQ0kxMDMxCi0JYWMxNSAgUENJMTEzMQotCWFjMTYgIFBDSTEyNTAKLQkJMTAxNCAwMDkyICBUaGlua1BhZCA2MDAKLQlhYzE3ICBQQ0kxMjIwCi0JYWMxOCAgUENJMTI2MAotCWFjMTkgIFBDSTEyMjEKLQlhYzFhICBQQ0kxMjEwCi0JYWMxYiAgUENJMTQ1MAotCQkwZTExIGIxMTMgIEFybWFkYSBNNzAwCi0JYWMxYyAgUENJMTIyNQotCQkwZTExIGIxMjEgIEFybWFkYSBFNTAwCi0JCTEwMjggMDA4OCAgRGVsbCAgQ29tcHV0ZXIgQ29ycG9yYXRpb24gIExhdGl0dWRlIENQaSBBNDAwWFQKLQlhYzFkICBQQ0kxMjUxQQotCWFjMWUgIFBDSTEyMTEKLQlhYzFmICBQQ0kxMjUxQgotCWFjMjAgIFRJIDIwMzAKLQlhYzIxICBQQ0kyMDMxCi0JYWMyMiAgUENJMjAzMiBQQ0kgRG9ja2luZyBCcmlkZ2UKLQlhYzIzICBQQ0kyMjUwIFBDSS10by1QQ0kgQnJpZGdlCi0JYWMyOCAgUENJMjA1MCBQQ0ktdG8tUENJIEJyaWRnZQotCWFjMzAgIFBDSTEyNjAgUEMgY2FyZCBDYXJkYnVzIENvbnRyb2xsZXIKLQlhYzQwICBQQ0k0NDUwIFBDIGNhcmQgQ2FyZGJ1cyBDb250cm9sbGVyCi0JYWM0MSAgUENJNDQxMCBQQyBjYXJkIENhcmRidXMgQ29udHJvbGxlcgotCWFjNDIgIFBDSTQ0NTEgUEMgY2FyZCBDYXJkYnVzIENvbnRyb2xsZXIKLQkJMTAyOCAwMGU2ICBQQ0k0NDUxIFBDIGNhcmQgQ2FyZEJ1cyBDb250cm9sbGVyIChEZWxsIEluc3Bpcm9uIDgxMDApCi0JYWM0NCAgUENJNDUxMCBQQyBjYXJkIENhcmRidXMgQ29udHJvbGxlcgotCQkxMDI4IDAxNjMgIExhdGl0dWRlIEQ1MDUKLQkJMTA3MSA4MTYwICBNSU0yMDAwCi0JYWM0NiAgUENJNDUyMCBQQyBjYXJkIENhcmRidXMgQ29udHJvbGxlcgotCWFjNDcgIFBDSTc1MTAgUEMgY2FyZCBDYXJkYnVzIENvbnRyb2xsZXIKLQkJMTAyOCAwMTRlICBMYXRpdHVkZSBEODAwCi0JYWM0YSAgUENJNzUxMCw3NjEwIFBDIGNhcmQgQ2FyZGJ1cyBDb250cm9sbGVyCi0JCTEwMjggMDE0ZSAgTGF0aXR1ZGUgRDgwMAotCWFjNTAgIFBDSTE0MTAgUEMgY2FyZCBDYXJkYnVzIENvbnRyb2xsZXIKLQlhYzUxICBQQ0kxNDIwCi0JCTEwMTQgMDIzYiAgVGhpbmtQYWQgVDIzICgyNjQ3LTRNRykKLQkJMTAyOCAwMGIxICBMYXRpdHVkZSBDNjAwCi0JCTEwMjggMDEyYSAgTGF0aXR1ZGUgQzY0MAotCQkxMDMzIDgwY2QgIFZlcnNhIE5vdGUgVlhpCi0JCTEwY2YgMTA5NSAgTGlmZWJvb2sgQzYxNTUKLQkJZTRiZiAxMDAwICBDUDItMi1ISVBIT1AKLQlhYzUyICBQQ0kxNDUxIFBDIGNhcmQgQ2FyZGJ1cyBDb250cm9sbGVyCi0JYWM1MyAgUENJMTQyMSBQQyBjYXJkIENhcmRidXMgQ29udHJvbGxlcgotCWFjNTQgIFBDSTE2MjAgUEMgQ2FyZCBDb250cm9sbGVyCi0JYWM1NSAgUENJMTUyMCBQQyBjYXJkIENhcmRidXMgQ29udHJvbGxlcgotCQkxMDE0IDA1MTIgIFRoaW5rUGFkIFQzMC9UNDAKLQlhYzU2ICBQQ0kxNTEwIFBDIGNhcmQgQ2FyZGJ1cyBDb250cm9sbGVyCi0JCTEwMTQgMDUyOCAgVGhpbmtQYWQgUjQwZSAoMjY4NC1IVkcpIENhcmRidXMgQ29udHJvbGxlcgotCWFjNjAgIFBDSTIwNDAgUENJIHRvIERTUCBCcmlkZ2UgQ29udHJvbGxlcgotCQkxNzVjIDUxMDAgIEFTSTUxeHggQXVkaW8gQWRhcHRlcgotCQkxNzVjIDYxMDAgIEFTSTYxeHggQXVkaW8gQWRhcHRlcgotCQkxNzVjIDYyMDAgIEFTSTYyeHggQXVkaW8gQWRhcHRlcgotCWFjOGQgIFBDSSA3NjIwCi0JYWM4ZSAgUENJNzQyMCBDYXJkQnVzIENvbnRyb2xsZXIKLQlhYzhmICBQQ0k3NDIwL1BDSTc2MjAgRHVhbCBTb2NrZXQgQ2FyZEJ1cyBhbmQgU21hcnQgQ2FyZCBDb250LiB3LyAxMzk0YS0yMDAwIE9IQ0kgVHdvLVBvcnQgIFBIWS9MaW5rLUxheWVyIENvbnQuIGFuZCBTRC9NUy1Qcm8gU29ja2V0cwotCWZlMDAgIEZpcmVXaXJlIEhvc3QgQ29udHJvbGxlcgotCWZlMDMgIDEyQzAxQSBGaXJlV2lyZSBIb3N0IENvbnRyb2xsZXIKLTEwNGQgIFNvbnkgQ29ycG9yYXRpb24KLQk4MDA0ICBEVEwtSDI1MDAgW1BsYXlzdGF0aW9uIGRldmVsb3BtZW50IGJvYXJkXQotCTgwMDkgIENYRDE5NDdRIGkuTElOSyBDb250cm9sbGVyCi0JODAzOSAgQ1hEMzIyMiBpLkxJTksgQ29udHJvbGxlcgotCTgwNTYgIFJvY2t3ZWxsIEhDRiA1NksgbW9kZW0KLQk4MDhhICBNZW1vcnkgU3RpY2sgQ29udHJvbGxlcgotMTA0ZSAgT2FrIFRlY2hub2xvZ3ksIEluYwotCTAwMTcgIE9USS02NDAxNwotCTAxMDcgIE9USS0xMDcgW1NwaXRmaXJlXQotCTAxMDkgIFZpZGVvIEFkYXB0ZXIKLQkwMTExICBPVEktNjQxMTEgW1NwaXRmaXJlXQotCTAyMTcgIE9USS02NDIxNwotCTAzMTcgIE9USS02NDMxNwotMTA0ZiAgQ28tdGltZSBDb21wdXRlciBMdGQKLTEwNTAgIFdpbmJvbmQgRWxlY3Ryb25pY3MgQ29ycAotCTAwMDAgIE5FMjAwMAotCTAwMDEgIFc4Mzc2OUYKLQkwMTA1ICBXODJDMTA1Ci0JMDg0MCAgVzg5Qzg0MAotCQkxMDUwIDAwMDEgIFc4OUM4NDAgRXRoZXJuZXQgQWRhcHRlcgotCQkxMDUwIDA4NDAgIFc4OUM4NDAgRXRoZXJuZXQgQWRhcHRlcgotCTA5NDAgIFc4OUM5NDAKLQk1YTVhICBXODlDOTQwRgotCTY2OTIgIFc2NjkyCi0JOTkyMSAgVzk5MjAwRiBNUEVHLTEgVmlkZW8gRW5jb2RlcgotCTk5MjIgIFc5OTIwMEYvVzk5MjJQRiBNUEVHLTEvMiBWaWRlbyBFbmNvZGVyCi0JOTk3MCAgVzk5NzBDRgotMTA1MSAgQW5pZ21hLCBJbmMuCi0xMDUyICA/WW91bmcgTWljcm8gU3lzdGVtcwotMTA1MyAgWW91bmcgTWljcm8gU3lzdGVtcwotMTA1NCAgSGl0YWNoaSwgTHRkCi0xMDU1ICBFZmFyIE1pY3Jvc3lzdGVtcwotCTkxMzAgIFNMQzkwRTY2IFtWaWN0b3J5NjZdIElERQotCTk0NjAgIFNMQzkwRTY2IFtWaWN0b3J5NjZdIElTQQotCTk0NjIgIFNMQzkwRTY2IFtWaWN0b3J5NjZdIFVTQgotCTk0NjMgIFNMQzkwRTY2IFtWaWN0b3J5NjZdIEFDUEkKLTEwNTYgIElDTAotIyBNb3Rvcm9sYSBtYWRlIGEgbWlzdGFrZSBhbmQgdXNlZCAxNTA3IGluc3RlYWQgb2YgMTA1NyBpbiBzb21lIGNoaXBzLiBQbGVhc2UgbG9vayBhdCB0aGUgMTUwNyBlbnRyeSBhcyB3ZWxsIHdoZW4gdXBkYXRpbmcgdGhpcy4KLTEwNTcgIE1vdG9yb2xhCi0JMDAwMSAgTVBDMTA1IFtFYWdsZV0KLQkwMDAyICBNUEMxMDYgW0dyYWNrbGVdCi0JMDAwMyAgTVBDODI0MCBbS2FobHVhXQotCTAwMDQgIE1QQzEwNwotCTAwMDYgIE1QQzgyNDUgW1VuaXR5XQotCTAwMDggIE1QQzg1NDAKLQkwMDA5ICBNUEM4NTYwCi0JMDEwMCAgTUMxNDU1NzUgW0hGQy1QQ0ldCi0JMDQzMSAgS1RJODI5YyAxMDBWRwotCTE4MDEgIERTUDU2MzAxIERpZ2l0YWwgU2lnbmFsIFByb2Nlc3NvcgotCQkxNGZiIDAxMDEgIFRyYW5zYXMgUmFkYXIgSW1pdGF0b3IgQm9hcmQgW1JJTV0KLQkJMTRmYiAwMTAyICBUcmFuc2FzIFJhZGFyIEltaXRhdG9yIEJvYXJkIFtSSU0tMl0KLQkJMTRmYiAwMjAyICBUcmFuc2FzIFJhZGFyIEludGVncmF0b3IgQm9hcmQgW1JJQi0yXQotCQkxNGZiIDA2MTEgIDEgY2hhbm5lbCBDQU4gYnVzIENvbnRyb2xsZXIgW0NhblBjaS0xXQotCQkxNGZiIDA2MTIgIDIgY2hhbm5lbHMgQ0FOIGJ1cyBDb250cm9sbGVyIFtDYW5QY2ktMl0KLQkJMTRmYiAwNjEzICAzIGNoYW5uZWxzIENBTiBidXMgQ29udHJvbGxlciBbQ2FuUGNpLTNdCi0JCTE0ZmIgMDYxNCAgNCBjaGFubmVscyBDQU4gYnVzIENvbnRyb2xsZXIgW0NhblBjaS00XQotCQkxNGZiIDA2MjEgIDEgY2hhbm5lbCBDQU4gYnVzIENvbnRyb2xsZXIgW0NhblBjaTItMV0KLQkJMTRmYiAwNjIyICAyIGNoYW5uZWxzIENBTiBidXMgQ29udHJvbGxlciBbQ2FuUGNpMi0yXQotCQkxNGZiIDA4MTAgIFRyYW5zYXMgVlRTIFJhZGFyIEludGVncmF0b3IgQm9hcmQgW1JJQi00XQotCQkxNzVjIDQyMDAgIEFTSTQyMTUgQXVkaW8gQWRhcHRlcgotCQkxNzVjIDQzMDAgIEFTSTQzeHggQXVkaW8gQWRhcHRlcgotCQkxNzVjIDQ0MDAgIEFTSTQ0MDEgQXVkaW8gQWRhcHRlcgotCQllY2MwIDAwMTAgIERhcmxhCi0JCWVjYzAgMDAyMCAgR2luYQotCQllY2MwIDAwMzAgIExheWxhIHJldi4wCi0JCWVjYzAgMDAzMSAgTGF5bGEgcmV2LjEKLQkJZWNjMCAwMDQwICBEYXJsYTI0IHJldi4wCi0JCWVjYzAgMDA0MSAgRGFybGEyNCByZXYuMQotCQllY2MwIDAwNTAgIEdpbmEyNCByZXYuMAotCQllY2MwIDAwNTEgIEdpbmEyNCByZXYuMQotCQllY2MwIDAwNzAgIE1vbmEgcmV2LjAKLQkJZWNjMCAwMDcxICBNb25hIHJldi4xCi0JCWVjYzAgMDA3MiAgTW9uYSByZXYuMgotCTE4YzAgIE1QQzgyNjVBL01QQzgyNjYKLQkxOGMxICBNUEM4MjcxL01QQzgyNzIKLQkzNDEwICBEU1A1NjM2MSBEaWdpdGFsIFNpZ25hbCBQcm9jZXNzb3IKLQkJZWNjMCAwMDUwICBHaW5hMjQgcmV2LjAKLQkJZWNjMCAwMDUxICBHaW5hMjQgcmV2LjEKLQkJZWNjMCAwMDYwICBMYXlsYTI0Ci0JCWVjYzAgMDA3MCAgTW9uYSByZXYuMAotCQllY2MwIDAwNzEgIE1vbmEgcmV2LjEKLQkJZWNjMCAwMDcyICBNb25hIHJldi4yCi0JCWVjYzAgMDA4MCAgTWlhIHJldi4wCi0JCWVjYzAgMDA4MSAgTWlhIHJldi4xCi0JCWVjYzAgMDA5MCAgSW5kaWdvCi0JCWVjYzAgMDBhMCAgSW5kaWdvIElPCi0JCWVjYzAgMDBiMCAgSW5kaWdvIERKCi0JCWVjYzAgMDEwMCAgM0cKLQk0ODAxICBSYXZlbgotCTQ4MDIgIEZhbGNvbgotCTQ4MDMgIEhhd2sKLQk0ODA2ICBDUFg4MjE2Ci0JNGQ2OCAgMjAyNjgKLQk1NjAwICBTTTU2IFBDSSBNb2RlbQotCQkxMDU3IDAzMDAgIFNNNTYgUENJIFNwZWFrZXJwaG9uZSBNb2RlbQotCQkxMDU3IDAzMDEgIFNNNTYgUENJIFZvaWNlIE1vZGVtCi0JCTEwNTcgMDMwMiAgU001NiBQQ0kgRmF4IE1vZGVtCi0JCTEwNTcgNTYwMCAgU001NiBQQ0kgVm9pY2UgbW9kZW0KLQkJMTNkMiAwMzAwICBTTTU2IFBDSSBTcGVha2VycGhvbmUgTW9kZW0KLQkJMTNkMiAwMzAxICBTTTU2IFBDSSBWb2ljZSBtb2RlbQotCQkxM2QyIDAzMDIgIFNNNTYgUENJIEZheCBNb2RlbQotCQkxNDM2IDAzMDAgIFNNNTYgUENJIFNwZWFrZXJwaG9uZSBNb2RlbQotCQkxNDM2IDAzMDEgIFNNNTYgUENJIFZvaWNlIG1vZGVtCi0JCTE0MzYgMDMwMiAgU001NiBQQ0kgRmF4IE1vZGVtCi0JCTE0NGYgMTAwYyAgU001NiBQQ0kgRmF4IE1vZGVtCi0JCTE0OTQgMDMwMCAgU001NiBQQ0kgU3BlYWtlcnBob25lIE1vZGVtCi0JCTE0OTQgMDMwMSAgU001NiBQQ0kgVm9pY2UgbW9kZW0KLQkJMTRjOCAwMzAwICBTTTU2IFBDSSBTcGVha2VycGhvbmUgTW9kZW0KLQkJMTRjOCAwMzAyICBTTTU2IFBDSSBGYXggTW9kZW0KLQkJMTY2OCAwMzAwICBTTTU2IFBDSSBTcGVha2VycGhvbmUgTW9kZW0KLQkJMTY2OCAwMzAyICBTTTU2IFBDSSBGYXggTW9kZW0KLQk1ODAzICBNUEM1MjAwCi0JNjQwMCAgTVBDMTkwIFNlY3VyaXR5IFByb2Nlc3NvciAoUzEgZmFtaWx5LCBlbmNyeXB0aW9uKQotCTY0MDUgIE1QQzE4NCBTZWN1cml0eSBQcm9jZXNzb3IgKFMxIGZhbWlseSkKLTEwNTggIEVsZWN0cm9uaWNzICYgVGVsZWNvbW11bmljYXRpb25zIFJTSAotMTA1OSAgVGVrbm9yIEluZHVzdHJpYWwgQ29tcHV0ZXJzIEluYwotMTA1YSAgUHJvbWlzZSBUZWNobm9sb2d5LCBJbmMuCi0jIG1vcmUgY29ycmVjdCBkZXNjcmlwdGlvbiBmcm9tIHByb21pc2UgbGludXggc291cmNlcwotCTBkMzAgIFBEQzIwMjY1IChGYXN0VHJhazEwMCBMaXRlL1VsdHJhMTAwKQotCQkxMDVhIDRkMzMgIFVsdHJhMTAwCi0JMGQzOCAgMjAyNjMKLQkJMTA1YSA0ZDM5ICBGYXN0dHJhazY2Ci0JMTI3NSAgMjAyNzUKLQkzMzE4ICBQREMyMDMxOCAoU0FUQTE1MCBUWDQpCi0JMzMxOSAgUERDMjAzMTkgKEZhc3RUcmFrIFMxNTAgVFg0KQotCQk4MDg2IDM0MjcgIFM4NzVXUDEtRSBtYWluYm9hcmQKLQkzMzcxICBQREMyMDM3MSAoRmFzdFRyYWsgUzE1MCBUWDJwbHVzKQotCTMzNzMgIFBEQzIwMzc4IChGYXN0VHJhayAzNzgvU0FUQSAzNzgpCi0JCTEwNDMgODBmNSAgSzhWIERlbHV4ZS9QQy1ETCBEZWx1eGUgbW90aGVyYm9hcmQKLQkJMTQ2MiA3MDJlICBLOFQgTkVPIEZJUzJSIG1vdGhlcmJvYXJkCi0JMzM3NSAgUERDMjAzNzUgKFNBVEExNTAgVFgycGx1cykKLQkzMzc2ICBQREMyMDM3NiAoRmFzdFRyYWsgMzc2KQotCQkxMDQzIDgwOWUgIEE3VjhYIG1vdGhlcmJvYXJkCi0JMzU3NCAgUERDMjA1NzkgU0FUQUlJIDE1MCBJREUgQ29udHJvbGxlcgotCTNkMTggIFBEQzIwNTE4L1BEQzQwNTE4IChTQVRBSUkgMTUwIFRYNCkKLQkzZDc1ICBQREMyMDU3NSAoU0FUQUlJMTUwIFRYMnBsdXMpCi0JNGQzMCAgUERDMjAyNjcgKEZhc3RUcmFrMTAwL1VsdHJhMTAwKQotCQkxMDVhIDRkMzMgIFVsdHJhMTAwCi0JCTEwNWEgNGQzOSAgRmFzdFRyYWsxMDAKLQk0ZDMzICAyMDI0NgotCQkxMDVhIDRkMzMgIDIwMjQ2IElERSBDb250cm9sbGVyCi0JNGQzOCAgUERDMjAyNjIgKEZhc3RUcmFrNjYvVWx0cmE2NikKLQkJMTA1YSA0ZDMwICBVbHRyYSBEZXZpY2Ugb24gU3VwZXJUcmFrCi0JCTEwNWEgNGQzMyAgVWx0cmE2NgotCQkxMDVhIDRkMzkgIEZhc3RUcmFrNjYKLQk0ZDY4ICBQREMyMDI2OCAoVWx0cmExMDAgVFgyKQotCQkxMDVhIDRkNjggIFVsdHJhMTAwVFgyCi0JNGQ2OSAgMjAyNjkKLQkJMTA1YSA0ZDY4ICBVbHRyYTEzM1RYMgotCTUyNzUgIFBEQzIwMjc2IChNQkZhc3RUcmFrMTMzIExpdGUpCi0JCTEwNWEgMDI3NSAgU3VwZXJUcmFrIFNYNjAwMCBJREUKLQkJMTA1YSAxMjc1ICBNQkZhc3RUcmFrMTMzIExpdGUgKHRtKSBDb250cm9sbGVyIChSQUlEIG1vZGUpCi0JCTE0NTggYjAwMSAgTUJVbHRyYSAxMzMKLQk1MzAwICBEQzUzMDAKLQk2MjY4ICBQREMyMDI3MCAoRmFzdFRyYWsxMDAgTFAvVFgyL1RYNCkKLQkJMTA1YSA0ZDY4ICBGYXN0VHJhazEwMCBUWDIKLQk2MjY5ICBQREMyMDI3MSAoRmFzdFRyYWsgVFgyMDAwKQotCQkxMDVhIDYyNjkgIEZhc3RUcmFrIFRYMi9UWDIwMDAKLQk2NjIxICBQREMyMDYyMSAoRmFzdFRyYWsgUzE1MCBTWDQvRmFzdFRyYWsgU1g0MDAwIGxpdGUpCi0JNjYyMiAgUERDMjA2MjEgW1NBVEExNTAgU1g0XSA0IENoYW5uZWwgSURFIFJBSUQgQ29udHJvbGxlcgotCTY2MjYgIFBEQzIwNjE4IChVbHRyYSA2MTgpCi0JNjYyOSAgUERDMjA2MTkgKEZhc3RUcmFrIFRYNDAwMCkKLQk3Mjc1ICBQREMyMDI3NyAoU0JGYXN0VHJhazEzMyBMaXRlKQotMTA1YiAgRm94Y29ubiBJbnRlcm5hdGlvbmFsLCBJbmMuCi0xMDVjICBXaXBybyBJbmZvdGVjaCBMaW1pdGVkCi0xMDVkICBOdW1iZXIgOSBDb21wdXRlciBDb21wYW55Ci0JMjMwOSAgSW1hZ2luZSAxMjgKLQkyMzM5ICBJbWFnaW5lIDEyOC1JSQotCQkxMDVkIDAwMDAgIEltYWdpbmUgMTI4IHNlcmllcyAyIDRNYiBWUkFNCi0JCTEwNWQgMDAwMSAgSW1hZ2luZSAxMjggc2VyaWVzIDIgNE1iIFZSQU0KLQkJMTA1ZCAwMDAyICBJbWFnaW5lIDEyOCBzZXJpZXMgMiA0TWIgVlJBTQotCQkxMDVkIDAwMDMgIEltYWdpbmUgMTI4IHNlcmllcyAyIDRNYiBWUkFNCi0JCTEwNWQgMDAwNCAgSW1hZ2luZSAxMjggc2VyaWVzIDIgNE1iIFZSQU0KLQkJMTA1ZCAwMDA1ICBJbWFnaW5lIDEyOCBzZXJpZXMgMiA0TWIgVlJBTQotCQkxMDVkIDAwMDYgIEltYWdpbmUgMTI4IHNlcmllcyAyIDRNYiBWUkFNCi0JCTEwNWQgMDAwNyAgSW1hZ2luZSAxMjggc2VyaWVzIDIgNE1iIFZSQU0KLQkJMTA1ZCAwMDA4ICBJbWFnaW5lIDEyOCBzZXJpZXMgMmUgNE1iIERSQU0KLQkJMTA1ZCAwMDA5ICBJbWFnaW5lIDEyOCBzZXJpZXMgMmUgNE1iIERSQU0KLQkJMTA1ZCAwMDBhICBJbWFnaW5lIDEyOCBzZXJpZXMgMiA4TWIgVlJBTQotCQkxMDVkIDAwMGIgIEltYWdpbmUgMTI4IHNlcmllcyAyIDhNYiBILVZSQU0KLQkJMTFhNCAwMDBhICBCYXJjbyBNZXRoZXVzIDUgTWVnYXBpeGVsCi0JCTEzY2MgMDAwMCAgQmFyY28gTWV0aGV1cyA1IE1lZ2FwaXhlbAotCQkxM2NjIDAwMDQgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwKLQkJMTNjYyAwMDA1ICBCYXJjbyBNZXRoZXVzIDUgTWVnYXBpeGVsCi0JCTEzY2MgMDAwNiAgQmFyY28gTWV0aGV1cyA1IE1lZ2FwaXhlbAotCQkxM2NjIDAwMDggIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwKLQkJMTNjYyAwMDA5ICBCYXJjbyBNZXRoZXVzIDUgTWVnYXBpeGVsCi0JCTEzY2MgMDAwYSAgQmFyY28gTWV0aGV1cyA1IE1lZ2FwaXhlbAotCQkxM2NjIDAwMGMgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwKLQk0OTNkICBJbWFnaW5lIDEyOCBUMlIgW1RpY2tldCB0byBSaWRlXQotCQkxMWE0IDAwMGEgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxMWE0IDAwMGIgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxM2NjIDAwMDIgIEJhcmNvIE1ldGhldXMgNCBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxM2NjIDAwMDMgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxM2NjIDAwMDcgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxM2NjIDAwMDggIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxM2NjIDAwMDkgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxM2NjIDAwMGEgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCTUzNDggIFJldm9sdXRpb24gNAotCQkxMDVkIDAwMzcgIFJldm9sdXRpb24gSVYtRlAgQUdQIChGb3IgU0dJIDE2MDBTVykKLTEwNWUgIFZ0ZWNoIENvbXB1dGVycyBMdGQKLTEwNWYgIEluZm90cm9uaWMgQW1lcmljYSBJbmMKLTEwNjAgIFVuaXRlZCBNaWNyb2VsZWN0cm9uaWNzIFtVTUNdCi0JMDAwMSAgVU04MkM4ODEKLQkwMDAyICBVTTgyQzg4NgotCTAxMDEgIFVNODY3M0YKLQkwODgxICBVTTg4ODEKLQkwODg2ICBVTTg4ODZGCi0JMDg5MSAgVU04ODkxQQotCTEwMDEgIFVNODg2QQotCTY3M2EgIFVNODg4NkJGCi0JNjczYiAgRUlERSBNYXN0ZXIvRE1BCi0JODcxMCAgVU04NzEwCi0JODg2YSAgVU04ODg2QQotCTg4ODEgIFVNODg4MUYKLQk4ODg2ICBVTTg4ODZGCi0JODg4YSAgVU04ODg2QQotCTg4OTEgIFVNODg5MUEKLQk5MDE3ICBVTTkwMTdGCi0JOTAxOCAgVU05MDE4Ci0JOTAyNiAgVU05MDI2Ci0JZTg4MSAgVU04ODgxTgotCWU4ODYgIFVNODg4Nk4KLQllODhhICBVTTg4ODZOCi0JZTg5MSAgVU04ODkxTgotMTA2MSAgSS5JLlQuCi0JMDAwMSAgQUdYMDE2Ci0JMDAwMiAgSUlUMzIwNC8zNTAxCi0xMDYyICBNYXNwYXIgQ29tcHV0ZXIgQ29ycAotMTA2MyAgT2NlYW4gT2ZmaWNlIEF1dG9tYXRpb24KLTEwNjQgIEFsY2F0ZWwKLTEwNjUgIFRleGFzIE1pY3Jvc3lzdGVtcwotMTA2NiAgUGljb1Bvd2VyIFRlY2hub2xvZ3kKLQkwMDAwICBQVDgwQzgyNgotCTAwMDEgIFBUODZDNTIxIFtWZXN1dml1cyB2MV0gSG9zdCBCcmlkZ2UKLQkwMDAyICBQVDg2QzUyMyBbVmVzdXZpdXMgdjNdIFBDSS1JU0EgQnJpZGdlIE1hc3RlcgotCTAwMDMgIFBUODZDNTI0IFtOaWxlXSBQQ0ktdG8tUENJIEJyaWRnZQotCTAwMDQgIFBUODZDNTI1IFtOaWxlLUlJXSBQQ0ktdG8tUENJIEJyaWRnZQotCTAwMDUgIE5hdGlvbmFsIFBDODc1NTAgU3lzdGVtIENvbnRyb2xsZXIKLQk4MDAyICBQVDg2QzUyMyBbVmVzdXZpdXMgdjNdIFBDSS1JU0EgQnJpZGdlIFNsYXZlCi0xMDY3ICBNaXRzdWJpc2hpIEVsZWN0cmljCi0JMDMwMSAgQWNjZWxHcmFwaGljcyBBY2NlbEVDTElQU0UKLQkwMzA0ICBBY2NlbEdBTEFYWSBBMjEwMCBbT0VNIEV2YW5zICYgU3V0aGVybGFuZF0KLQkwMzA4ICBUb3JuYWRvIDMwMDAgW09FTSBFdmFucyAmIFN1dGhlcmxhbmRdCi0JMTAwMiAgVkc1MDAgW1ZvbHVtZVBybyBWb2x1bWUgUmVuZGVyaW5nIEFjY2VsZXJhdG9yXQotMTA2OCAgRGl2ZXJzaWZpZWQgVGVjaG5vbG9neQotMTA2OSAgTXlsZXggQ29ycG9yYXRpb24KLQkwMDAxICBEQUM5NjBQCi0JMDAwMiAgREFDOTYwUEQKLQkwMDEwICBEQUM5NjBQRwotCTAwMjAgIERBQzk2MExBCi0JMDA1MCAgQWNjZWxlUkFJRCAzNTIvMTcwLzE2MCBzdXBwb3J0IERldmljZQotCWIxNjYgIEdlbXN0b25lIGNoaXBzZXQgU0NTSSBjb250cm9sbGVyCi0JCTEwMTQgMDI0MiAgaVNlcmllcyAyODcyIERBU0QgSU9BCi0JCTEwMTQgMDI2NiAgRHVhbCBDaGFubmVsIFBDSS1YIFUzMjAgU0NTSSBBZGFwdGVyCi0JCTEwMTQgMDI3OCAgRHVhbCBDaGFubmVsIFBDSS1YIFUzMjAgU0NTSSBSQUlEIEFkYXB0ZXIKLQkJMTAxNCAwMmQzICBEdWFsIENoYW5uZWwgUENJLVggVTMyMCBTQ1NJIEFkYXB0ZXIKLQkJMTAxNCAwMmQ0ICBEdWFsIENoYW5uZWwgUENJLVggVTMyMCBTQ1NJIFJBSUQgQWRhcHRlcgotCWJhNTUgIGVYdHJlbWVSQUlEIDExMDAgc3VwcG9ydCBEZXZpY2UKLQliYTU2ICBlWHRyZW1lUkFJRCAyMDAwLzMwMDAgc3VwcG9ydCBEZXZpY2UKLTEwNmEgIEF0ZW4gUmVzZWFyY2ggSW5jCi0xMDZiICBBcHBsZSBDb21wdXRlciBJbmMuCi0JMDAwMSAgQmFuZGl0IFBvd2VyUEMgaG9zdCBicmlkZ2UKLQkwMDAyICBHcmFuZCBDZW50cmFsIEkvTwotCTAwMDMgIENvbnRyb2wgVmlkZW8KLQkwMDA0ICBQbGFuQiBWaWRlby1JbgotCTAwMDcgIE8nSGFyZSBJL08KLQkwMDBjICBET1Mgb24gTWFjCi0JMDAwZSAgSHlkcmEgTWFjIEkvTwotCTAwMTAgIEhlYXRocm93IE1hYyBJL08KLQkwMDE3ICBQYWRkaW5ndG9uIE1hYyBJL08KLQkwMDE4ICBVbmlOb3J0aCBGaXJlV2lyZQotCTAwMTkgIEtleUxhcmdvIFVTQgotCTAwMWUgIFVuaU5vcnRoIEludGVybmFsIFBDSQotCTAwMWYgIFVuaU5vcnRoIFBDSQotCTAwMjAgIFVuaU5vcnRoIEFHUAotCTAwMjEgIFVuaU5vcnRoIEdNQUMgKFN1biBHRU0pCi0JMDAyMiAgS2V5TGFyZ28gTWFjIEkvTwotCTAwMjQgIFVuaU5vcnRoL1BhbmdlYSBHTUFDIChTdW4gR0VNKQotCTAwMjUgIEtleUxhcmdvL1BhbmdlYSBNYWMgSS9PCi0JMDAyNiAgS2V5TGFyZ28vUGFuZ2VhIFVTQgotCTAwMjcgIFVuaU5vcnRoL1BhbmdlYSBBR1AKLQkwMDI4ICBVbmlOb3J0aC9QYW5nZWEgUENJCi0JMDAyOSAgVW5pTm9ydGgvUGFuZ2VhIEludGVybmFsIFBDSQotCTAwMmQgIFVuaU5vcnRoIDEuNSBBR1AKLQkwMDJlICBVbmlOb3J0aCAxLjUgUENJCi0JMDAyZiAgVW5pTm9ydGggMS41IEludGVybmFsIFBDSQotCTAwMzAgIFVuaU5vcnRoL1BhbmdlYSBGaXJlV2lyZQotCTAwMzEgIFVuaU5vcnRoIDIgRmlyZVdpcmUKLQkwMDMyICBVbmlOb3J0aCAyIEdNQUMgKFN1biBHRU0pCi0JMDAzMyAgVW5pTm9ydGggMiBBVEEvMTAwCi0JMDAzNCAgVW5pTm9ydGggMiBBR1AKLQkwMDM1ICBVbmlOb3J0aCAyIFBDSQotCTAwMzYgIFVuaU5vcnRoIDIgSW50ZXJuYWwgUENJCi0JMDAzYiAgVW5pTm9ydGgvSW50cmVwaWQgQVRBLzEwMAotCTAwM2UgIEtleUxhcmdvL0ludHJlcGlkIE1hYyBJL08KLQkwMDNmICBLZXlMYXJnby9JbnRyZXBpZCBVU0IKLQkwMDQwICBLMiBLZXlMYXJnbyBVU0IKLQkwMDQxICBLMiBLZXlMYXJnbyBNYWMvSU8KLQkwMDQyICBLMiBGaXJlV2lyZQotCTAwNDMgIEsyIEFUQS8xMDAKLQkwMDQ1ICBLMiBIVC1QQ0kgQnJpZGdlCi0JMDA0NiAgSzIgSFQtUENJIEJyaWRnZQotCTAwNDcgIEsyIEhULVBDSSBCcmlkZ2UKLQkwMDQ4ICBLMiBIVC1QQ0kgQnJpZGdlCi0JMDA0OSAgSzIgSFQtUENJIEJyaWRnZQotCTAwNGIgIFUzIEFHUAotCTAwNGMgIEsyIEdNQUMgKFN1biBHRU0pCi0JMDA0ZiAgU2hhc3RhIE1hYyBJL08KLQkwMDUwICBTaGFzdGEgSURFCi0JMDA1MSAgU2hhc3RhIChTdW4gR0VNKQotCTAwNTIgIFNoYXN0YSBGaXJld2lyZQotCTAwNTMgIFNoYXN0YSBQQ0kgQnJpZGdlCi0JMDA1NCAgU2hhc3RhIFBDSSBCcmlkZ2UKLQkwMDU1ICBTaGFzdGEgUENJIEJyaWRnZQotCTAwNTggIFUzTCBBR1AgQnJpZGdlCi0JMTY0NSAgVGlnb24zIEdpZ2FiaXQgRXRoZXJuZXQgTklDIChCQ001NzAxKQotMTA2YyAgSHluaXggU2VtaWNvbmR1Y3RvcgotCTg4MDEgIER1YWwgUGVudGl1bSBJU0EvUENJIE1vdGhlcmJvYXJkCi0JODgwMiAgUG93ZXJQQyBJU0EvUENJIE1vdGhlcmJvYXJkCi0JODgwMyAgRHVhbCBXaW5kb3cgR3JhcGhpY3MgQWNjZWxlcmF0b3IKLQk4ODA0ICBMQU4gQ29udHJvbGxlcgotCTg4MDUgIDEwMC1CYXNlVCBMQU4KLTEwNmQgIFNlcXVlbnQgQ29tcHV0ZXIgU3lzdGVtcwotMTA2ZSAgREZJLCBJbmMKLTEwNmYgIENpdHkgR2F0ZSBEZXZlbG9wbWVudCBMdGQKLTEwNzAgIERhZXdvbyBUZWxlY29tIEx0ZAotMTA3MSAgTWl0YWMKLQk4MTYwICBNaXRhYyA4MDYwQiBNb2JpbGUgUGxhdGZvcm0KLTEwNzIgIEdJVCBDbyBMdGQKLTEwNzMgIFlhbWFoYSBDb3Jwb3JhdGlvbgotCTAwMDEgIDNEIEdVSSBBY2NlbGVyYXRvcgotCTAwMDIgIFlHVjYxNSBbUlBBMyAzRC1HcmFwaGljcyBDb250cm9sbGVyXQotCTAwMDMgIFlNRi03NDAKLQkwMDA0ICBZTUYtNzI0Ci0JCTEwNzMgMDAwNCAgWU1GNzI0LUJhc2VkIFBDSSBBdWRpbyBBZGFwdGVyCi0JMDAwNSAgRFMxIEF1ZGlvCi0JCTEwNzMgMDAwNSAgRFMtWEcgUENJIEF1ZGlvIENPREVDCi0JMDAwNiAgRFMxIEF1ZGlvCi0JMDAwOCAgRFMxIEF1ZGlvCi0JCTEwNzMgMDAwOCAgRFMtWEcgUENJIEF1ZGlvIENPREVDCi0JMDAwYSAgRFMxTCBBdWRpbwotCQkxMDczIDAwMDQgIERTLVhHIFBDSSBBdWRpbyBDT0RFQwotCQkxMDczIDAwMGEgIERTLVhHIFBDSSBBdWRpbyBDT0RFQwotCTAwMGMgIFlNRi03NDBDIFtEUy0xTCBBdWRpbyBDb250cm9sbGVyXQotCQkxMDdhIDAwMGMgIERTLVhHIFBDSSBBdWRpbyBDT0RFQwotCTAwMGQgIFlNRi03MjRGIFtEUy0xIEF1ZGlvIENvbnRyb2xsZXJdCi0JCTEwNzMgMDAwZCAgRFMtWEcgUENJIEF1ZGlvIENPREVDCi0JMDAxMCAgWU1GLTc0NEIgW0RTLTFTIEF1ZGlvIENvbnRyb2xsZXJdCi0JCTEwNzMgMDAwNiAgRFMtWEcgUENJIEF1ZGlvIENPREVDCi0JCTEwNzMgMDAxMCAgRFMtWEcgUENJIEF1ZGlvIENPREVDCi0JMDAxMiAgWU1GLTc1NCBbRFMtMUUgQXVkaW8gQ29udHJvbGxlcl0KLQkJMTA3MyAwMDEyICBEUy1YRyBQQ0kgQXVkaW8gQ29kZWMKLQkwMDIwICBEUy0xIEF1ZGlvCi0JMjAwMCAgRFMyNDE2IERpZ2l0YWwgTWl4aW5nIENhcmQKLQkJMTA3MyAyMDAwICBEUzI0MTYgRGlnaXRhbCBNaXhpbmcgQ2FyZAotMTA3NCAgTmV4R2VuIE1pY3Jvc3lzdGVtcwotCTRlNzggIDgyYzUwMC8xCi0xMDc1ICBBZHZhbmNlZCBJbnRlZ3JhdGlvbnMgUmVzZWFyY2gKLTEwNzYgIENoYWludGVjaCBDb21wdXRlciBDby4gTHRkCi0xMDc3ICBRTG9naWMgQ29ycC4KLQkxMDE2ICBJU1AxMDE2MCBTaW5nbGUgQ2hhbm5lbCBVbHRyYTMgU0NTSSBQcm9jZXNzb3IKLQkxMDIwICBJU1AxMDIwIEZhc3Qtd2lkZSBTQ1NJCi0JMTAyMiAgSVNQMTAyMiBGYXN0LXdpZGUgU0NTSQotCTEwODAgIElTUDEwODAgU0NTSSBIb3N0IEFkYXB0ZXIKLQkxMjE2ICBJU1AxMjE2MCBEdWFsIENoYW5uZWwgVWx0cmEzIFNDU0kgUHJvY2Vzc29yCi0JCTEwMWUgODQ3MSAgUUxBMTIxNjAgb24gQU1JIE1lZ2FSQUlECi0JCTEwMWUgODQ5MyAgUUxBMTIxNjAgb24gQU1JIE1lZ2FSQUlECi0JMTI0MCAgSVNQMTI0MCBTQ1NJIEhvc3QgQWRhcHRlcgotCTEyODAgIElTUDEyODAgU0NTSSBIb3N0IEFkYXB0ZXIKLQkyMDIwICBJU1AyMDIwQSBGYXN0IVNDU0kgQmFzaWMgQWRhcHRlcgotCTIxMDAgIFFMQTIxMDAgNjQtYml0IEZpYnJlIENoYW5uZWwgQWRhcHRlcgotCQkxMDc3IDAwMDEgIFFMQTIxMDAgNjQtYml0IEZpYnJlIENoYW5uZWwgQWRhcHRlcgotCTIyMDAgIFFMQTIyMDAgNjQtYml0IEZpYnJlIENoYW5uZWwgQWRhcHRlcgotCQkxMDc3IDAwMDIgIFFMQTIyMDAKLQkyMzAwICBRTEEyMzAwIDY0LWJpdCBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQkyMzEyICBRTEEyMzEyIEZpYnJlIENoYW5uZWwgQWRhcHRlcgotMTA3OCAgQ3lyaXggQ29ycG9yYXRpb24KLQkwMDAwICA1NTEwIFtHcmFwcGFdCi0JMDAwMSAgUENJIE1hc3RlcgotCTAwMDIgIDU1MjAgW0NvZ25hY10KLQkwMTAwICA1NTMwIExlZ2FjeSBbS2FobHVhXQotCTAxMDEgIDU1MzAgU01JIFtLYWhsdWFdCi0JMDEwMiAgNTUzMCBJREUgW0thaGx1YV0KLQkwMTAzICA1NTMwIEF1ZGlvIFtLYWhsdWFdCi0JMDEwNCAgNTUzMCBWaWRlbyBbS2FobHVhXQotCTA0MDAgIFpGTWljcm8gUENJIEJyaWRnZQotCTA0MDEgIFpGTWljcm8gQ2hpcHNldCBTTUkKLQkwNDAyICBaRk1pY3JvIENoaXBzZXQgSURFCi0JMDQwMyAgWkZNaWNybyBFeHBhbnNpb24gQnVzCi0xMDc5ICBJLUJ1cwotMTA3YSAgTmV0V29ydGgKLTEwN2IgIEdhdGV3YXkgMjAwMAotMTA3YyAgTEcgRWxlY3Ryb25pY3MgW0x1Y2t5IEdvbGRzdGFyIENvLiBMdGRdCi0xMDdkICBMZWFkVGVrIFJlc2VhcmNoIEluYy4KLQkwMDAwICBQODZDODUwCi0JMjEzNCAgV2luRmFzdCAzRCBTMzIwIElJCi0JMjk3MSAgW0dlRm9yY2UgRlggNTkwMF0gV2luRmFzdCBBMzUwIFRESCBNeVZpVm8KLTEwN2UgIEludGVycGhhc2UgQ29ycG9yYXRpb24KLQkwMDAxICA1NTE1IEFUTSBBZGFwdGVyIFtGbGlwcGVyXQotCTAwMDIgIDEwMCBWRyBBbnlMYW4gQ29udHJvbGxlcgotCTAwMDQgIDU1MjYgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQkwMDA1ICB4NTI2IEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JMDAwOCAgNTUyNS81NTc1IEFUTSBBZGFwdGVyICgxNTUgTWJpdCkgW0F0bGFudGljXQotCTkwMDMgIDU1MzUtNFAtQlJJLVNUCi0JOTAwNyAgNTUzNS00UC1CUkktVQotCTkwMDggIDU1MzUtMVAtU1IKLQk5MDBjICA1NTM1LTFQLVNSLVNUCi0JOTAwZSAgNTUzNS0xUC1TUi1VCi0JOTAxMSAgNTUzNS0xUC1QUkkKLQk5MDEzICA1NTM1LTJQLVBSSQotCTkwMjMgIDU1MzYtNFAtQlJJLVNUCi0JOTAyNyAgNTUzNi00UC1CUkktVQotCTkwMzEgIDU1MzYtMVAtUFJJCi0JOTAzMyAgNTUzNi0yUC1QUkkKLTEwN2YgIERhdGEgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgotCTA4MDIgIFNMODJDMTA1Ci0xMDgwICBDb250YXEgTWljcm9zeXN0ZW1zCi0JMDYwMCAgODJDNTk5Ci0JYzY5MSAgQ3lwcmVzcyBDWTgyQzY5MQotCWM2OTMgIDgyYzY5MwotMTA4MSAgU3VwZXJtYWMgVGVjaG5vbG9neQotCTBkNDcgIFJhZGl1cyBQQ0kgdG8gTnVCVVMgQnJpZGdlCi0xMDgyICBFRkEgQ29ycG9yYXRpb24gb2YgQW1lcmljYQotMTA4MyAgRm9yZXggQ29tcHV0ZXIgQ29ycG9yYXRpb24KLQkwMDAxICBGUjcxMAotMTA4NCAgUGFyYWRvcgotMTA4NSAgVHVsaXAgQ29tcHV0ZXJzIEludC5CLlYuCi0xMDg2ICBKLiBCb25kIENvbXB1dGVyIFN5c3RlbXMKLTEwODcgIENhY2hlIENvbXB1dGVyCi0xMDg4ICBNaWNyb2NvbXB1dGVyIFN5c3RlbXMgKE0pIFNvbgotMTA4OSAgRGF0YSBHZW5lcmFsIENvcnBvcmF0aW9uCi0jIEZvcm1lcmx5IEJpdDMgQ29tcHV0ZXIgQ29ycC4KLTEwOGEgIFNCUyBUZWNobm9sb2dpZXMKLQkwMDAxICBWTUUgQnJpZGdlIE1vZGVsIDYxNwotCTAwMTAgIFZNRSBCcmlkZ2UgTW9kZWwgNjE4Ci0JMDA0MCAgZGF0YUJMSVpaQVJECi0JMzAwMCAgVk1FIEJyaWRnZSBNb2RlbCAyNzA2Ci0xMDhjICBPYWtsZWlnaCBTeXN0ZW1zIEluYy4KLTEwOGQgIE9saWNvbQotCTAwMDEgIFRva2VuLVJpbmcgMTYvNCBQQ0kgQWRhcHRlciAoMzEzNi8zMTM3KQotCTAwMDIgIDE2LzQgVG9rZW4gUmluZwotCTAwMDQgIFJhcGlkRmlyZSAzMTM5IFRva2VuLVJpbmcgMTYvNCBQQ0kgQWRhcHRlcgotCQkxMDhkIDAwMDQgIE9DLTMxMzkvMzE0MCBSYXBpZEZpcmUgVG9rZW4tUmluZyAxNi80IEFkYXB0ZXIKLQkwMDA1ICBHb0NhcmQgMzI1MCBUb2tlbi1SaW5nIDE2LzQgQ2FyZEJ1cyBQQyBDYXJkCi0JMDAwNiAgT0MtMzUzMCBSYXBpZEZpcmUgVG9rZW4tUmluZyAxMDAKLQkwMDA3ICBSYXBpZEZpcmUgMzE0MSBUb2tlbi1SaW5nIDE2LzQgUENJIEZpYmVyIEFkYXB0ZXIKLQkJMTA4ZCAwMDA3ICBPQy0zMTQxIFJhcGlkRmlyZSBUb2tlbi1SaW5nIDE2LzQgQWRhcHRlcgotCTAwMDggIFJhcGlkRmlyZSAzNTQwIEhTVFIgMTAwLzE2LzQgUENJIEFkYXB0ZXIKLQkJMTA4ZCAwMDA4ICBPQy0zNTQwIFJhcGlkRmlyZSBIU1RSIDEwMC8xNi80IEFkYXB0ZXIKLQkwMDExICBPQy0yMzE1Ci0JMDAxMiAgT0MtMjMyNQotCTAwMTMgIE9DLTIxODMvMjE4NQotCTAwMTQgIE9DLTIzMjYKLQkwMDE5ICBPQy0yMzI3LzIyNTAgMTAvMTAwIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTA4ZCAwMDE2ICBPQy0yMzI3IFJhcGlkZmlyZSAxMC8xMDAgRXRoZXJuZXQgQWRhcHRlcgotCQkxMDhkIDAwMTcgIE9DLTIyNTAgR29DYXJkIDEwLzEwMCBFdGhlcm5ldCBBZGFwdGVyCi0JMDAyMSAgT0MtNjE1MS82MTUyIFtSYXBpZEZpcmUgQVRNIDE1NV0KLQkwMDIyICBBVE0gQWRhcHRlcgotMTA4ZSAgU3VuIE1pY3Jvc3lzdGVtcyBDb21wdXRlciBDb3JwLgotCTAwMDEgIEVCVVMKLQkxMDAwICBFQlVTCi0JMTAwMSAgSGFwcHkgTWVhbAotCTExMDAgIFJJTyBFQlVTCi0JMTEwMSAgUklPIEdFTQotCTExMDIgIFJJTyAxMzk0Ci0JMTEwMyAgUklPIFVTQgotCTE2NDggIFtiZ2VdIEdpZ2FiaXQgRXRoZXJuZXQKLQkyYmFkICBHRU0KLQk1MDAwICBTaW1iYSBBZHZhbmNlZCBQQ0kgQnJpZGdlCi0JNTA0MyAgU3VuUENJIENvLXByb2Nlc3NvcgotCTgwMDAgIFBzeWNobyBQQ0kgQnVzIE1vZHVsZQotCTgwMDEgIFNjaGl6byBQQ0kgQnVzIE1vZHVsZQotCTgwMDIgIFNjaGl6bysgUENJIEJ1cyBNb2R1bGUKLQlhMDAwICBVbHRyYSBJSWkKLQlhMDAxICBVbHRyYSBJSWUKLQlhODAxICBUb21hdGlsbG8gUENJIEJ1cyBNb2R1bGUKLQlhYmJhICBDYXNzaW5pIDEwLzEwMC8xMDAwCi0xMDhmICBTeXN0ZW1zb2Z0Ci0xMDkwICBFbmNvcmUgQ29tcHV0ZXIgQ29ycG9yYXRpb24KLTEwOTEgIEludGVyZ3JhcGggQ29ycG9yYXRpb24KLQkwMDIwICAzRCBncmFwaGljcyBwcm9jZXNzb3IKLQkwMDIxICAzRCBncmFwaGljcyBwcm9jZXNzb3Igdy9UZXh0dXJpbmcKLQkwMDQwICAzRCBncmFwaGljcyBmcmFtZSBidWZmZXIKLQkwMDQxICAzRCBncmFwaGljcyBmcmFtZSBidWZmZXIKLQkwMDYwICBQcm9wcmlldGFyeSBidXMgYnJpZGdlCi0JMDBlNCAgUG93ZXJzdG9ybSA0RDUwVAotCTA3MjAgIE1vdGlvbiBKUEVHIGNvZGVjCi0JMDdhMCAgU3VuIEV4cGVydDNELUxpdGUgR3JhcGhpY3MgQWNjZWxlcmF0b3IKLQkxMDkxICBTdW4gRXhwZXJ0M0QgR3JhcGhpY3MgQWNjZWxlcmF0b3IKLTEwOTIgIERpYW1vbmQgTXVsdGltZWRpYSBTeXN0ZW1zCi0JMDBhMCAgU3BlZWRzdGFyIFBybyBTRQotCTAwYTggIFNwZWVkc3RhciA2NAotCTA1NTAgIFZpcGVyIFY1NTAKLQkwOGQ0ICBTdXByYSAyMjYwIE1vZGVtCi0JMDk0YyAgU3VwcmFFeHByZXNzIDU2aSBQcm8KLQkxMDkyICBWaXBlciBWMzMwCi0JNjEyMCAgTWF4aW11bSBEVkQKLQk4ODEwICBTdGVhbHRoIFNFCi0JODgxMSAgU3RlYWx0aCA2NC9TRQotCTg4ODAgIFN0ZWFsdGgKLQk4ODgxICBTdGVhbHRoCi0JODhiMCAgU3RlYWx0aCA2NAotCTg4YjEgIFN0ZWFsdGggNjQKLQk4OGMwICBTdGVhbHRoIDY0Ci0JODhjMSAgU3RlYWx0aCA2NAotCTg4ZDAgIFN0ZWFsdGggNjQKLQk4OGQxICBTdGVhbHRoIDY0Ci0JODhmMCAgU3RlYWx0aCA2NAotCTg4ZjEgIFN0ZWFsdGggNjQKLQk5OTk5ICBETUQtSTA5MjgtMSAiTW9uc3RlciBzb3VuZCIgc291bmQgY2hpcAotMTA5MyAgTmF0aW9uYWwgSW5zdHJ1bWVudHMKLQkwMTYwICBQQ0ktRElPLTk2Ci0JMDE2MiAgUENJLU1JTy0xNlhFLTUwCi0JMTE3MCAgUENJLU1JTy0xNlhFLTEwCi0JMTE4MCAgUENJLU1JTy0xNkUtMQotCTExOTAgIFBDSS1NSU8tMTZFLTQKLQkxMzEwICBQQ0ktNjYwMgotCTEzMzAgIFBDSS02MDMxRQotCTEzNTAgIFBDSS02MDcxRQotCTE0ZTAgIFBDSS02MTEwCi0JMTRmMCAgUENJLTYxMTEKLQkxN2QwICBQQ0ktNjUwMwotCTE4NzAgIFBDSS02NzEzCi0JMTg4MCAgUENJLTY3MTEKLQkxOGIwICBQQ0ktNjA1MkUKLQkyNDEwICBQQ0ktNjczMwotCTI4OTAgIFBDSS02MDM2RQotCTJhNjAgIFBDSS02MDIzRQotCTJhNzAgIFBDSS02MDI0RQotCTJhODAgIFBDSS02MDI1RQotCTJjODAgIFBDSS02MDM1RQotCTJjYTAgIFBDSS02MDM0RQotCTcwYjggIFBDSS02MjUxIFtNIFNlcmllcyAtIEhpZ2ggU3BlZWQgTXVsdGlmdW5jdGlvbiBEQVFdCi0JYjAwMSAgSU1BUS1QQ0ktMTQwOAotCWIwMTEgIElNQVEtUFhJLTE0MDgKLQliMDIxICBJTUFRLVBDSS0xNDI0Ci0JYjAzMSAgSU1BUS1QQ0ktMTQxMwotCWIwNDEgIElNQVEtUENJLTE0MDcKLQliMDUxICBJTUFRLVBYSS0xNDA3Ci0JYjA2MSAgSU1BUS1QQ0ktMTQxMQotCWIwNzEgIElNQVEtUENJLTE0MjIKLQliMDgxICBJTUFRLVBYSS0xNDIyCi0JYjA5MSAgSU1BUS1QWEktMTQxMQotCWM4MDEgIFBDSS1HUElCCi0JYzgzMSAgUENJLUdQSUIgYnJpZGdlCi0xMDk0ICBGaXJzdCBJbnRlcm5hdGlvbmFsIENvbXB1dGVycyBbRklDXQotMTA5NSAgU2lsaWNvbiBJbWFnZSwgSW5jLiAoZm9ybWVybHkgQ01EIFRlY2hub2xvZ3kgSW5jKQotCTAyNDAgIEFkYXB0ZWMgQUFSLTEyMTBTQSBTQVRBIEhvc3RSQUlEIENvbnRyb2xsZXIKLQkwNjQwICBQQ0kwNjQwCi0JMDY0MyAgUENJMDY0MwotCTA2NDYgIFBDSTA2NDYKLQkwNjQ3ICBQQ0kwNjQ3Ci0JMDY0OCAgUENJMDY0OAotCTA2NDkgIFNpSSAwNjQ5IFVsdHJhIEFUQS8xMDAgUENJIHRvIEFUQSBIb3N0IENvbnRyb2xsZXIKLQkJMGUxMSAwMDVkICBJbnRlZ3JhdGVkIFVsdHJhIEFUQS0xMDAgRHVhbCBDaGFubmVsIENvbnRyb2xsZXIKLQkJMGUxMSAwMDdlICBJbnRlZ3JhdGVkIFVsdHJhIEFUQS0xMDAgSURFIFJBSUQgQ29udHJvbGxlcgotCQkxMDFlIDA2NDkgIEFNSSBNZWdhUkFJRCBJREUgMTAwIENvbnRyb2xsZXIKLQkwNjUwICBQQkMwNjUwQQotCTA2NzAgIFVTQjA2NzAKLQkJMTA5NSAwNjcwICBVU0IwNjcwCi0JMDY3MyAgVVNCMDY3MwotCTA2ODAgIFBDSTA2ODAgVWx0cmEgQVRBLTEzMyBIb3N0IENvbnRyb2xsZXIKLQkJMTA5NSAzNjgwICBXaW5pYyBXLTY4MCAoU2lsaWNvbiBJbWFnZSA2ODAgYmFzZWQpCi0JMzExMiAgU2lJIDMxMTIgW1NBVEFMaW5rL1NBVEFSYWlkXSBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkJMTA5NSAzMTEyICBTaUkgMzExMiBTQVRBTGluayBDb250cm9sbGVyCi0JCTEwOTUgNjExMiAgU2lJIDMxMTIgU0FUQVJhaWQgQ29udHJvbGxlcgotCTMxMTQgIFNpSSAzMTE0IFtTQVRBTGluay9TQVRBUmFpZF0gU2VyaWFsIEFUQSBDb250cm9sbGVyCi0JCTEwOTUgMzExNCAgU2lJIDMxMTQgU0FUQUxpbmsgQ29udHJvbGxlcgotCQkxMDk1IDYxMTQgIFNpSSAzMTE0IFNBVEFSYWlkIENvbnRyb2xsZXIKLQkzMTI0ICBTaUkgMzEyNCBQQ0ktWCBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkJMTA5NSAzMTI0ICBTaUkgMzEyNCBQQ0ktWCBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkzNTEyICBTaUkgMzUxMiBbU0FUQUxpbmsvU0FUQVJhaWRdIFNlcmlhbCBBVEEgQ29udHJvbGxlcgotCQkxMDk1IDM1MTIgIFNpSSAzNTEyIFNBVEFMaW5rIENvbnRyb2xsZXIKLQkJMTA5NSA2NTEyICBTaUkgMzUxMiBTQVRBUmFpZCBDb250cm9sbGVyCi0xMDk2ICBBbGFjcm9uCi0xMDk3ICBBcHBpYW4gVGVjaG5vbG9neQotMTA5OCAgUXVhbnR1bSBEZXNpZ25zIChILksuKSBMdGQKLQkwMDAxICBRRC04NTAwCi0JMDAwMiAgUUQtODU4MAotMTA5OSAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZAotMTA5YSAgUGFja2FyZCBCZWxsCi0xMDliICBHZW1saWdodCBDb21wdXRlciBMdGQuCi0xMDljICBNZWdhY2hpcHMgQ29ycG9yYXRpb24KLTEwOWQgIFppZGEgVGVjaG5vbG9naWVzIEx0ZC4KLTEwOWUgIEJyb29rdHJlZSBDb3Jwb3JhdGlvbgotCTAzNTAgIEJ0ODQ4IFZpZGVvIENhcHR1cmUKLQkwMzUxICBCdDg0OUEgVmlkZW8gY2FwdHVyZQotCTAzNjkgIEJ0ODc4IFZpZGVvIENhcHR1cmUKLQkJMTAwMiAwMDAxICBUVi1Xb25kZXIKLQkJMTAwMiAwMDAzICBUVi1Xb25kZXIvVkUKLQkwMzZjICBCdDg3OSg/PykgVmlkZW8gQ2FwdHVyZQotCQkxM2U5IDAwNzAgIFdpbi9UViAoVmlkZW8gU2VjdGlvbikKLQkwMzZlICBCdDg3OCBWaWRlbyBDYXB0dXJlCi0JCTAwNzAgMTNlYiAgV2luVFYgU2VyaWVzCi0JCTAwNzAgZmYwMSAgVmlld2Nhc3QgT3NwcmV5IDIwMAotCQkwMDcxIDAxMDEgIERpZ2lUViBQQ0kKLQkJMTA3ZCA2NjA2ICBXaW5GYXN0IFRWIDIwMDAKLQkJMTFiZCAwMDEyICBQQ1RWIHBybyAoVFYgKyBGTSBzdGVyZW8gcmVjZWl2ZXIpCi0JCTExYmQgMDAxYyAgUENUViBTYXQgKERCQyByZWNlaXZlcikKLQkJMTI3YSAwMDAxICBCdDg3OCBNZWRpYXN0cmVhbSBDb250cm9sbGVyIE5UU0MKLQkJMTI3YSAwMDAyICBCdDg3OCBNZWRpYXN0cmVhbSBDb250cm9sbGVyIFBBTCBCRwotCQkxMjdhIDAwMDMgIEJ0ODc4YSBNZWRpYXN0cmVhbSBDb250cm9sbGVyIFBBTCBCRwotCQkxMjdhIDAwNDggIEJ0ODc4LzgzMiBNZWRpYXN0cmVhbSBDb250cm9sbGVyCi0JCTE0NGYgMzAwMCAgTWFnaWNUVmlldyBDUEgwNjAgLSBWaWRlbwotCQkxNDYxIDAwMDIgIFRWOTggU2VyaWVzIChUVi9ObyBGTS9SZW1vdGUpCi0JCTE0NjEgMDAwMyAgQXZlck1lZGlhIFVsdHJhVFYgUENJIDM1MAotCQkxNDYxIDAwMDQgIEFWZXJUViBXRE0gVmlkZW8gQ2FwdHVyZQotCQkxNDYxIDA3NjEgIEF2ZXJUViBEVkItVAotCQkxNGYxIDAwMDEgIEJ0ODc4IE1lZGlhc3RyZWFtIENvbnRyb2xsZXIgTlRTQwotCQkxNGYxIDAwMDIgIEJ0ODc4IE1lZGlhc3RyZWFtIENvbnRyb2xsZXIgUEFMIEJHCi0JCTE0ZjEgMDAwMyAgQnQ4NzhhIE1lZGlhc3RyZWFtIENvbnRyb2xsZXIgUEFMIEJHCi0JCTE0ZjEgMDA0OCAgQnQ4NzgvODMyIE1lZGlhc3RyZWFtIENvbnRyb2xsZXIKLQkJMTgyMiAwMDAxICBWaXNpb25QbHVzIERWQiBjYXJkCi0JCTE4NTEgMTg1MCAgRmx5VmlkZW8nOTggLSBWaWRlbwotCQkxODUxIDE4NTEgIEZseVZpZGVvIElJCi0JCTE4NTIgMTg1MiAgRmx5VmlkZW8nOTggLSBWaWRlbyAod2l0aCBGTSBUdW5lcikKLQkJMjcwZiBmYzAwICBEaWdpdG9wIERUVC0xMDAwCi0JCWJkMTEgMTIwMCAgUENUViBwcm8gKFRWICsgRk0gc3RlcmVvIHJlY2VpdmVyKQotCTAzNmYgIEJ0ODc5IFZpZGVvIENhcHR1cmUKLQkJMTI3YSAwMDQ0ICBCdDg3OSBWaWRlbyBDYXB0dXJlIE5UU0MKLQkJMTI3YSAwMTIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIFBBTCBJCi0JCTEyN2EgMDE0NCAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTEyN2EgMDIyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBQQUwgQkcKLQkJMTI3YSAwMjQ0ICBCdDg3OWEgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTEyN2EgMDMyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTEyN2EgMDQyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTEyN2EgMTEyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBQQUwgSQotCQkxMjdhIDEyMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgUEFMIEJHCi0JCTEyN2EgMTMyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTEyN2EgMTUyMiAgQnQ4NzlhIFZpZGVvIENhcHR1cmUgUEFMIEkKLQkJMTI3YSAxNjIyICBCdDg3OWEgVmlkZW8gQ2FwdHVyZSBQQUwgQkcKLQkJMTI3YSAxNzIyICBCdDg3OWEgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTE0ZjEgMDA0NCAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTE0ZjEgMDEyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBQQUwgSQotCQkxNGYxIDAxNDQgIEJ0ODc5IFZpZGVvIENhcHR1cmUgTlRTQwotCQkxNGYxIDAyMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgUEFMIEJHCi0JCTE0ZjEgMDI0NCAgQnQ4NzlhIFZpZGVvIENhcHR1cmUgTlRTQwotCQkxNGYxIDAzMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgTlRTQwotCQkxNGYxIDA0MjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgTlRTQwotCQkxNGYxIDExMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgUEFMIEkKLQkJMTRmMSAxMjIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIFBBTCBCRwotCQkxNGYxIDEzMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgTlRTQwotCQkxNGYxIDE1MjIgIEJ0ODc5YSBWaWRlbyBDYXB0dXJlIFBBTCBJCi0JCTE0ZjEgMTYyMiAgQnQ4NzlhIFZpZGVvIENhcHR1cmUgUEFMIEJHCi0JCTE0ZjEgMTcyMiAgQnQ4NzlhIFZpZGVvIENhcHR1cmUgTlRTQwotCQkxODUxIDE4NTAgIEZseVZpZGVvJzk4IC0gVmlkZW8KLQkJMTg1MSAxODUxICBGbHlWaWRlbyBJSQotCQkxODUyIDE4NTIgIEZseVZpZGVvJzk4IC0gVmlkZW8gKHdpdGggRk0gVHVuZXIpCi0JMDM3MCAgQnQ4ODAgVmlkZW8gQ2FwdHVyZQotCQkxODUxIDE4NTAgIEZseVZpZGVvJzk4Ci0JCTE4NTEgMTg1MSAgRmx5VmlkZW8nOTggRVogLSB2aWRlbwotCQkxODUyIDE4NTIgIEZseVZpZGVvJzk4ICh3aXRoIEZNIFR1bmVyKQotCTA4NzggIEJ0ODc4IEF1ZGlvIENhcHR1cmUKLQkJMDA3MCAxM2ViICBXaW5UViBTZXJpZXMKLQkJMDA3MCBmZjAxICBWaWV3Y2FzdCBPc3ByZXkgMjAwCi0JCTAwNzEgMDEwMSAgRGlnaVRWIFBDSQotCQkxMDAyIDAwMDEgIFRWLVdvbmRlcgotCQkxMDAyIDAwMDMgIFRWLVdvbmRlci9WRQotCQkxMWJkIDAwMTIgIFBDVFYgcHJvIChUViArIEZNIHN0ZXJlbyByZWNlaXZlciwgYXVkaW8gc2VjdGlvbikKLQkJMTFiZCAwMDFjICBQQ1RWIFNhdCAoREJDIHJlY2VpdmVyKQotCQkxMjdhIDAwMDEgIEJ0ODc4IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTEyN2EgMDAwMiAgQnQ4NzggVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTI3YSAwMDAzICBCdDg3OCBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxMjdhIDAwNDggIEJ0ODc4IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTEzZTkgMDA3MCAgV2luL1RWIChBdWRpbyBTZWN0aW9uKQotCQkxNDRmIDMwMDAgIE1hZ2ljVFZpZXcgQ1BIMDYwIC0gQXVkaW8KLQkJMTQ2MSAwMDA0ICBBVmVyVFYgV0RNIEF1ZGlvIENhcHR1cmUKLQkJMTQ2MSAwNzYxICBBVmVyVFYgRFZCLVQKLQkJMTRmMSAwMDAxICBCdDg3OCBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxNGYxIDAwMDIgIEJ0ODc4IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTE0ZjEgMDAwMyAgQnQ4NzggVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTRmMSAwMDQ4ICBCdDg3OCBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxODIyIDAwMDEgIFZpc2lvblBsdXMgRFZCIENhcmQKLQkJMjcwZiBmYzAwICBEaWdpdG9wIERUVC0xMDAwCi0JCWJkMTEgMTIwMCAgUENUViBwcm8gKFRWICsgRk0gc3RlcmVvIHJlY2VpdmVyLCBhdWRpbyBzZWN0aW9uKQotCTA4NzkgIEJ0ODc5IEF1ZGlvIENhcHR1cmUKLQkJMTI3YSAwMDQ0ICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxMjdhIDAxMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTEyN2EgMDE0NCAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTI3YSAwMjIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxMjdhIDAyNDQgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTEyN2EgMDMyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTI3YSAwNDIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxMjdhIDExMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTEyN2EgMTIyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTI3YSAxMzIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxMjdhIDE1MjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTEyN2EgMTYyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTI3YSAxNzIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxNGYxIDAwNDQgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTE0ZjEgMDEyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTRmMSAwMTQ0ICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxNGYxIDAyMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTE0ZjEgMDI0NCAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTRmMSAwMzIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxNGYxIDA0MjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTE0ZjEgMTEyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTRmMSAxMjIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxNGYxIDEzMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTE0ZjEgMTUyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTRmMSAxNjIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxNGYxIDE3MjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JMDg4MCAgQnQ4ODAgQXVkaW8gQ2FwdHVyZQotCTIxMTUgIEJ0ViAyMTE1IE1lZGlhc3RyZWFtIGNvbnRyb2xsZXIKLQkyMTI1ICBCdFYgMjEyNSBNZWRpYXN0cmVhbSBjb250cm9sbGVyCi0JMjE2NCAgQnRWIDIxNjQKLQkyMTY1ICBCdFYgMjE2NQotCTgyMzAgIEJ0ODIzMCBBVE0gU2VnbWVudC9SZWFzc2VtYmx5IEN0cmxyIChTUkMpCi0JODQ3MiAgQnQ4NDcyCi0JODQ3NCAgQnQ4NDc0Ci0xMDlmICBUcmlnZW0gQ29tcHV0ZXIgSW5jLgotMTBhMCAgTWVpZGVuc2hhIENvcnBvcmF0aW9uCi0xMGExICBKdWtvIEVsZWN0cm9uaWNzIEluZC4gQ28uIEx0ZAotMTBhMiAgUXVhbnR1bSBDb3Jwb3JhdGlvbgotMTBhMyAgRXZlcmV4IFN5c3RlbXMgSW5jCi0xMGE0ICBHbG9iZSBNYW51ZmFjdHVyaW5nIFNhbGVzCi0xMGE1ICBTbWFydCBMaW5rIEx0ZC4KLQkzMDUyICBTbWFydFBDSTU2MiA1NksgTW9kZW0KLQk1NDQ5ICBTbWFydFBDSTU2MSBtb2RlbQotMTBhNiAgSW5mb3JtdGVjaCBJbmR1c3RyaWFsIEx0ZC4KLTEwYTcgIEJlbmNobWFycSBNaWNyb2VsZWN0cm9uaWNzCi0xMGE4ICBTaWVycmEgU2VtaWNvbmR1Y3RvcgotCTAwMDAgIFNUQiBIb3Jpem9uIDY0Ci0xMGE5ICBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0JMDAwMSAgQ3Jvc3N0YWxrIHRvIFBDSSBCcmlkZ2UKLQkwMDAyICBMaW5jIEkvTyBjb250cm9sbGVyCi0JMDAwMyAgSU9DMyBJL08gY29udHJvbGxlcgotCTAwMDQgIE8yIE1BQ0UKLQkwMDA1ICBSQUQgQXVkaW8KLQkwMDA2ICBIUENFWAotCTAwMDcgIFJQQ0VYCi0JMDAwOCAgRGlWTyBWSVAKLQkwMDA5ICBBY2VOSUMgR2lnYWJpdCBFdGhlcm5ldAotCQkxMGE5IDgwMDIgIEFjZU5JQyBHaWdhYml0IEV0aGVybmV0Ci0JMDAxMCAgQU1QIFZpZGVvIEkvTwotCTAwMTEgIEdSSVAKLQkwMDEyICBTR0ggUFNIQUMgR1NOCi0JMTAwMSAgTWFnaWMgQ2FycGV0Ci0JMTAwMiAgTGl0aGl1bQotCTEwMDMgIER1YWwgSlBFRyAxCi0JMTAwNCAgRHVhbCBKUEVHIDIKLQkxMDA1ICBEdWFsIEpQRUcgMwotCTEwMDYgIER1YWwgSlBFRyA0Ci0JMTAwNyAgRHVhbCBKUEVHIDUKLQkxMDA4ICBDZXNpdW0KLQkxMDBhICBJT0M0IEkvTyBjb250cm9sbGVyCi0JMjAwMSAgRmlicmUgQ2hhbm5lbAotCTIwMDIgIEFTREUKLQk4MDAxICBPMiAxMzk0Ci0JODAwMiAgRy1uZXQgTlQKLTEwYWEgIEFDQyBNaWNyb2VsZWN0cm9uaWNzCi0JMDAwMCAgQUNDTSAyMTg4Ci0xMGFiICBEaWdpY29tCi0xMGFjICBIb25leXdlbGwgSUFDCi0xMGFkICBTeW1waG9ueSBMYWJzCi0JMDAwMSAgVzgzNzY5RgotCTAwMDMgIFNMODJDMTAzCi0JMDAwNSAgU0w4MkMxMDUKLQkwMTAzICBTTDgyYzEwMwotCTAxMDUgIFNMODJjMTA1Ci0JMDU2NSAgVzgzQzU1MwotMTBhZSAgQ29ybmVyc3RvbmUgVGVjaG5vbG9neQotMTBhZiAgTWljcm8gQ29tcHV0ZXIgU3lzdGVtcyBJbmMKLTEwYjAgIENhcmRFeHBlcnQgVGVjaG5vbG9neQotMTBiMSAgQ2FibGV0cm9uIFN5c3RlbXMgSW5jCi0xMGIyICBSYXl0aGVvbiBDb21wYW55Ci0xMGIzICBEYXRhYm9vayBJbmMKLQkzMTA2ICBEQjg3MTQ0Ci0JYjEwNiAgREI4NzE0NAotMTBiNCAgU1RCIFN5c3RlbXMgSW5jCi0JMWIxZCAgVmVsb2NpdHkgMTI4IDNECi0JCTEwYjQgMjM3ZSAgVmVsb2NpdHkgNDQwMAotMTBiNSAgUExYIFRlY2hub2xvZ3ksIEluYy4KLQkwMDAxICBpOTYwIFBDSSBidXMgaW50ZXJmYWNlCi0JMTA3NiAgVlNjb20gODAwIDggcG9ydCBzZXJpYWwgYWRhcHRvcgotCTEwNzcgIFZTY29tIDQwMCA0IHBvcnQgc2VyaWFsIGFkYXB0b3IKLQkxMDc4ICBWU2NvbSAyMTAgMiBwb3J0IHNlcmlhbCBhbmQgMSBwb3J0IHBhcmFsbGVsIGFkYXB0b3IKLQkxMTAzICBWU2NvbSAyMDAgMiBwb3J0IHNlcmlhbCBhZGFwdG9yCi0JMTE0NiAgVlNjb20gMDEwIDEgcG9ydCBwYXJhbGxlbCBhZGFwdG9yCi0JMTE0NyAgVlNjb20gMDIwIDIgcG9ydCBwYXJhbGxlbCBhZGFwdG9yCi0JMjcyNCAgVGhhbGVzIFBDU00gU2VjdXJpdHkgQ2FyZAotCTg1MTYgIFBFWCA4NTE2ICBWZXJzYXRpbGUgUENJIEV4cHJlc3MgU3dpdGNoCi0JODUzMiAgUEVYIDg1MzIgIFZlcnNhdGlsZSBQQ0kgRXhwcmVzcyBTd2l0Y2gKLQk5MDMwICBQQ0kgPC0+IElPQnVzIEJyaWRnZSBIb3QgU3dhcAotCQkxMGI1IDI4NjIgIEFscGVybWFubitWZWx0ZSBQQ0wgUENJIExWICgzVi81Vik6IFRpbWVjb2RlIFJlYWRlciBCb2FyZAotCQkxMGI1IDI5MDYgIEFscGVybWFubitWZWx0ZSBQQ0kgVFMgKDNWLzVWKTogVGltZSBTeW5jaHJvbmlzYXRpb24gQm9hcmQKLQkJMTBiNSAyOTQwICBBbHBlcm1hbm4rVmVsdGUgUENMIFBDSSBEICgzVi81Vik6IFRpbWVjb2RlIFJlYWRlciBCb2FyZAotCQkxMGI1IDMwMjUgIEFscGVybWFubitWZWx0ZSBQQ0wgUENJIEwgKDNWLzVWKTogVGltZWNvZGUgUmVhZGVyIEJvYXJkCi0JCTEwYjUgMzA2OCAgQWxwZXJtYW5uK1ZlbHRlIFBDTCBQQ0kgSEQgKDNWLzVWKTogVGltZWNvZGUgUmVhZGVyIEJvYXJkCi0JCTE1ZWQgMTAwMiAgTUNDUyA4LXBvcnQgU2VyaWFsIEhvdCBTd2FwCi0JCTE1ZWQgMTAwMyAgTUNDUyAxNi1wb3J0IFNlcmlhbCBIb3QgU3dhcAotCTkwMzYgIDkwMzYKLQk5MDUwICBQQ0kgPC0+IElPQnVzIEJyaWRnZQotCQkxMGI1IDEwNjcgIElYWEFUIENBTiBpMTY1Ci0JCTEwYjUgMTE3MiAgSUsyMjAgKEhlaWRlbmhhaW4pCi0JCTEwYjUgMjAzNiAgU2F0UGFrIEdQUwotCQkxMGI1IDIyMjEgIEFscGVybWFubitWZWx0ZSBQQ0wgUENJIExWOiBUaW1lY29kZSBSZWFkZXIgQm9hcmQKLQkJMTBiNSAyMjczICBTSC1BUkMgU29IYXJkIEFSQ25ldCBjYXJkCi0JCTEwYjUgMjQzMSAgQWxwZXJtYW5uK1ZlbHRlIFBDTCBQQ0kgRDogVGltZWNvZGUgUmVhZGVyIEJvYXJkCi0JCTEwYjUgMjkwNSAgQWxwZXJtYW5uK1ZlbHRlIFBDSSBUUzogVGltZSBTeW5jaHJvbmlzYXRpb24gQm9hcmQKLQkJMTBiNSA5MDUwICBNUDkwNTAKLQkJMTQ5OCAwMzYyICBUUE1DODY2IDggQ2hhbm5lbCBTZXJpYWwgQ2FyZAotCQkxNTIyIDAwMDEgIFJvY2tGb3JjZSA0IFBvcnQgVi45MCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDAwMDIgIFJvY2tGb3JjZSAyIFBvcnQgVi45MCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDAwMDMgIFJvY2tGb3JjZSA2IFBvcnQgVi45MCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDAwMDQgIFJvY2tGb3JjZSA4IFBvcnQgVi45MCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDAwMTAgIFJvY2tGb3JjZTIwMDAgNCBQb3J0IFYuOTAgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkJMTUyMiAwMDIwICBSb2NrRm9yY2UyMDAwIDIgUG9ydCBWLjkwIERhdGEvRmF4L1ZvaWNlIE1vZGVtCi0JCTE1ZWQgMTAwMCAgTWFjcm9saW5rIE1DQ1MgOC1wb3J0IFNlcmlhbAotCQkxNWVkIDEwMDEgIE1hY3JvbGluayBNQ0NTIDE2LXBvcnQgU2VyaWFsCi0JCTE1ZWQgMTAwMiAgTWFjcm9saW5rIE1DQ1MgOC1wb3J0IFNlcmlhbCBIb3QgU3dhcAotCQkxNWVkIDEwMDMgIE1hY3JvbGluayBNQ0NTIDE2LXBvcnQgU2VyaWFsIEhvdCBTd2FwCi0jIFNvcnJ5LCB0aGVyZSB3YXMgYSB0eXBvCi0JCTU2NTQgMjAzNiAgT3BlblN3aXRjaCA2IFRlbGVwaG9ueSBjYXJkCi0jIFNvcnJ5LCB0aGVyZSB3YXMgYSB0eXBvCi0JCTU2NTQgMzEzMiAgT3BlblN3aXRjaCAxMiBUZWxlcGhvbnkgY2FyZAotCQk1NjU0IDU2MzQgIE9wZW5MaW5lNCBUZWxlcGhvbnkgQ2FyZAotCQlkNTMxIGMwMDIgIFBDSW50ZWxsaUNBTiAyeFNKQTEwMDAgQ0FOIGJ1cwotCQlkODRkIDQwMDYgIEVYLTQwMDYgMVAKLQkJZDg0ZCA0MDA4ICBFWC00MDA4IDFQIEVQUC9FQ1AKLQkJZDg0ZCA0MDE0ICBFWC00MDE0IDJQCi0JCWQ4NGQgNDAxOCAgRVgtNDAxOCAzUCBFUFAvRUNQCi0JCWQ4NGQgNDAyNSAgRVgtNDAyNSAxUygxNkM1NTApIFJTLTIzMgotCQlkODRkIDQwMjcgIEVYLTQwMjcgMVMoMTZDNjUwKSBSUy0yMzIKLQkJZDg0ZCA0MDI4ICBFWC00MDI4IDFTKDE2Qzg1MCkgUlMtMjMyCi0JCWQ4NGQgNDAzNiAgRVgtNDAzNiAyUygxNkM2NTApIFJTLTIzMgotCQlkODRkIDQwMzcgIEVYLTQwMzcgMlMoMTZDNjUwKSBSUy0yMzIKLQkJZDg0ZCA0MDM4ICBFWC00MDM4IDJTKDE2Qzg1MCkgUlMtMjMyCi0JCWQ4NGQgNDA1MiAgRVgtNDA1MiAxUygxNkM1NTApIFJTLTQyMi80ODUKLQkJZDg0ZCA0MDUzICBFWC00MDUzIDJTKDE2QzU1MCkgUlMtNDIyLzQ4NQotCQlkODRkIDQwNTUgIEVYLTQwNTUgNFMoMTZDNTUwKSBSUy0yMzIKLQkJZDg0ZCA0MDU4ICBFWC00MDU1IDRTKDE2QzY1MCkgUlMtMjMyCi0JCWQ4NGQgNDA2NSAgRVgtNDA2NSA4UygxNkM1NTApIFJTLTIzMgotCQlkODRkIDQwNjggIEVYLTQwNjggOFMoMTZDNjUwKSBSUy0yMzIKLQkJZDg0ZCA0MDc4ICBFWC00MDc4IDJTKDE2QzU1MikgUlMtMjMyKzFQCi0JOTA1NCAgUENJIDwtPiBJT0J1cyBCcmlkZ2UKLQkJMTBiNSAyNDU1ICBXZXNzZXggVGVjaG9sb2d5IFBISUwtUENJCi0JCTEwYjUgMjY5NiAgSW5uZXMgQ29ycCBBTSBSYWRjYXAgY2FyZAotCQkxMGI1IDI3MTcgIElubmVzIENvcnAgQXVyaWNvbiBjYXJkCi0JCTEwYjUgMjg0NCAgSW5uZXMgQ29ycCBUVlMgRW5jb2RlciBjYXJkCi0JCTEyZDkgMDAwMiAgUENJIFByb3NvZHkgQ2FyZCByZXYgMS41Ci0JCTE2ZGYgMDAxMSAgUElLQSBQcmltZU5ldCBNTSBQQ0kKLQkJMTZkZiAwMDEyICBQSUtBIFByaW1lTmV0IE1NIGNQQ0kgOAotCQkxNmRmIDAwMTMgIFBJS0EgUHJpbWVOZXQgTU0gY1BDSSA4ICh3aXRob3V0IENBUyBTaWduYWxpbmcgT3B0aW9uKQotCQkxNmRmIDAwMTQgIFBJS0EgUHJpbWVOZXQgTU0gY1BDSSA0Ci0JCTE2ZGYgMDAxNSAgUElLQSBEYXl0b25hIE1NCi0JCTE2ZGYgMDAxNiAgUElLQSBJbkxpbmUgTU0KLQk5MDU2ICBGcmFuY29pcwotCQkxMGI1IDI5NzkgIENlbGxpbmtCbGFkZSAxMSAtIENQQ0kgYm9hcmQgVm9BVE0gQUFMMQotCTkwNjAgIDkwNjAKLQk5MDZkICA5MDYwU0QKLQkJMTI1YyAwNjQwICBBcmllcyAxNjAwMFAKLQk5MDZlICA5MDYwRVMKLQk5MDgwICA5MDgwCi0JCTEwM2MgMTBlYiAgKEFnaWxlbnQpIEUyNzc3QiA4M0sgU2VyaWVzIFBDSSBiYXNlZCBPcHRpY2FsIENvbW11bmljYXRpb24gSW50ZXJmYWNlCi0JCTEwM2MgMTBlYyAgKEFnaWxlbnQpIEU2OTc4LTY2NDQyIFBDSSBDSUMKLQkJMTBiNSA5MDgwICA5MDgwIFtyZWFsIHN1YnN5c3RlbSBJRCBub3Qgc2V0XQotCQkxMjlkIDAwMDIgIEFjdWxhYiBQQ0kgUHJvc2lkeSBjYXJkCi0JCTEyZDkgMDAwMiAgUENJIFByb3NvZHkgQ2FyZAotCQkxMmRmIDQ0MjIgIDQ0MjJQQ0kgWyJEby1BbGwiIFRlbGVtZXRyeSBEYXRhIEFxdWlzaXRpb24gU3lzdGVtXQotCWJiMDQgIEImQiAzUENJT1NEMUEgSXNvbGF0ZWQgUENJIFNlcmlhbAotMTBiNiAgTWFkZ2UgTmV0d29ya3MKLQkwMDAxICBTbWFydCAxNi80IFBDSSBSaW5nbm9kZQotCTAwMDIgIFNtYXJ0IDE2LzQgUENJIFJpbmdub2RlIE1rMgotCQkxMGI2IDAwMDIgIFNtYXJ0IDE2LzQgUENJIFJpbmdub2RlIE1rMgotCQkxMGI2IDAwMDYgIDE2LzQgQ2FyZEJ1cyBBZGFwdGVyCi0JMDAwMyAgU21hcnQgMTYvNCBQQ0kgUmluZ25vZGUgTWszCi0JCTBlMTEgYjBmZCAgQ29tcGFxIE5DNDYyMSBQQ0ksIDQvMTYsIFdPTAotCQkxMGI2IDAwMDMgIFNtYXJ0IDE2LzQgUENJIFJpbmdub2RlIE1rMwotCQkxMGI2IDAwMDcgIFByZXN0byBQQ0kgUGx1cyBBZGFwdGVyCi0JMDAwNCAgU21hcnQgMTYvNCBQQ0kgUmluZ25vZGUgTWsxCi0JMDAwNiAgMTYvNCBDYXJkYnVzIEFkYXB0ZXIKLQkJMTBiNiAwMDA2ICAxNi80IENhcmRCdXMgQWRhcHRlcgotCTAwMDcgIFByZXN0byBQQ0kgQWRhcHRlcgotCQkxMGI2IDAwMDcgIFByZXN0byBQQ0kKLQkwMDA5ICBTbWFydCAxMDAvMTYvNCBQQ0ktSFMgUmluZ25vZGUKLQkJMTBiNiAwMDA5ICBTbWFydCAxMDAvMTYvNCBQQ0ktSFMgUmluZ25vZGUKLQkwMDBhICBTbWFydCAxMDAvMTYvNCBQQ0kgUmluZ25vZGUKLQkJMTBiNiAwMDBhICBTbWFydCAxMDAvMTYvNCBQQ0kgUmluZ25vZGUKLQkwMDBiICAxNi80IENhcmRCdXMgQWRhcHRlciBNazIKLQkJMTBiNiAwMDA4ICAxNi80IENhcmRCdXMgQWRhcHRlciBNazIKLQkJMTBiNiAwMDBiICAxNi80IENhcmRidXMgQWRhcHRlciBNazIKLQkwMDBjICBSYXBpZEZpcmUgMzE0MFYyIDE2LzQgVFIgQWRhcHRlcgotCQkxMGI2IDAwMGMgIFJhcGlkRmlyZSAzMTQwVjIgMTYvNCBUUiBBZGFwdGVyCi0JMTAwMCAgQ29sbGFnZSAyNS8xNTUgQVRNIENsaWVudCBBZGFwdGVyCi0JMTAwMSAgQ29sbGFnZSAxNTUgQVRNIFNlcnZlciBBZGFwdGVyCi0xMGI3ICAzQ29tIENvcnBvcmF0aW9uCi0JMDAwMSAgM2M5ODUgMTAwMEJhc2VTWCAoU1gvVFgpCi0JMDAxMyAgQVI1MjEyIDgwMi4xMWFiZyBOSUMgKDNDUkRBRzY3NSkKLQkJMTBiNyAyMDMxICAzQ1JEQUc2NzUgMTFhL2IvZyBXaXJlbGVzcyBQQ0kgQWRhcHRlcgotCTA5MTAgIDNDOTEwLUEwMQotCTEwMDYgIE1JTkkgUENJIHR5cGUgM0IgRGF0YSBGYXggTW9kZW0KLQkxMDA3ICBNaW5pIFBDSSA1NmsgV2lubW9kZW0KLQkJMTBiNyA2MTVjICBNaW5pIFBDSSA1NksgTW9kZW0KLQkxMjAxICAzYzk4Mi1UWE0gMTAvMTAwYmFzZVRYIER1YWwgUG9ydCBBIFtIeWRyYV0KLQkxMjAyICAzYzk4Mi1UWE0gMTAvMTAwYmFzZVRYIER1YWwgUG9ydCBCIFtIeWRyYV0KLQkxNzAwICAzYzk0MCAxMC8xMDAvMTAwMEJhc2UtVCBbTWFydmVsbF0KLQkJMTA0MyA4MGViICBQNFA4MDAvSzhWIERlbHV4ZSBtb3RoZXJib2FyZAotCQkxMGI3IDAwMTAgIDNDOTQwIEdpZ2FiaXQgTE9NIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTBiNyAwMDIwICAzQzk0MSBHaWdhYml0IExPTSBFdGhlcm5ldCBBZGFwdGVyCi0JCTE0N2IgMTQwNyAgS1Y4LU1BWDMgbW90aGVyYm9hcmQKLQkzMzkwICAzYzMzOSBUb2tlbkxpbmsgVmVsb2NpdHkKLQkzNTkwICAzYzM1OSBUb2tlbkxpbmsgVmVsb2NpdHkgWEwKLQkJMTBiNyAzNTkwICBUb2tlbkxpbmsgVmVsb2NpdHkgWEwgQWRhcHRlciAoM0MzNTkvMzU5QikKLQk0NTAwICAzYzQ1MCBIb21lUE5BIFtUb3JuYWRvXQotCTUwNTUgIDNjNTU1IExhcHRvcCBIdXJyaWNhbmUKLQk1MDU3ICAzYzU3NSBNZWdhaGVydHogMTAvMTAwIExBTiBDYXJkQnVzIFtCb29tZXJhbmddCi0JCTEwYjcgNWE1NyAgM0M1NzUgTWVnYWhlcnR6IDEwLzEwMCBMQU4gQ2FyZGJ1cyBQQyBDYXJkCi0JNTE1NyAgM2NDRkU1NzVCVCBNZWdhaGVydHogMTAvMTAwIExBTiBDYXJkQnVzIFtDeWNsb25lXQotCQkxMGI3IDViNTcgIDNDNTc1IE1lZ2FoZXJ0eiAxMC8xMDAgTEFOIENhcmRidXMgUEMgQ2FyZAotCTUyNTcgIDNjQ0ZFNTc1Q1QgQ2FyZEJ1cyBbQ3ljbG9uZV0KLQkJMTBiNyA1YzU3ICBGRTU3NUMtM0NvbSAxMC8xMDAgTEFOIENhcmRCdXMtRmFzdCBFdGhlcm5ldAotCTU5MDAgIDNjNTkwIDEwQmFzZVQgW1ZvcnRleF0KLQk1OTIwICAzYzU5MiBFSVNBIDEwbWJwcyBEZW1vbi9Wb3J0ZXgKLQk1OTUwICAzYzU5NSAxMDBCYXNlVFggW1ZvcnRleF0KLQk1OTUxICAzYzU5NSAxMDBCYXNlVDQgW1ZvcnRleF0KLQk1OTUyICAzYzU5NSAxMDBCYXNlLU1JSSBbVm9ydGV4XQotCTU5NzAgIDNjNTk3IEVJU0EgRmFzdCBEZW1vbi9Wb3J0ZXgKLQk1YjU3ICAzYzU5NSBNZWdhaGVydHogMTAvMTAwIExBTiBDYXJkQnVzIFtCb29tZXJhbmddCi0JCTEwYjcgNWI1NyAgM0M1NzUgTWVnYWhlcnR6IDEwLzEwMCBMQU4gQ2FyZGJ1cyBQQyBDYXJkCi0JNjAwMCAgM0NSU0hQVzc5NiBbT2ZmaWNlQ29ubmVjdCBXaXJlbGVzcyBDYXJkQnVzXQotCTYwMDEgIDNjb20gM0NSV0UxNTRHNzIgW09mZmljZSBDb25uZWN0IFdpcmVsZXNzIExBTiBBZGFwdGVyXQotCTYwNTUgIDNjNTU2IEh1cnJpY2FuZSBDYXJkQnVzIFtDeWNsb25lXQotCTYwNTYgIDNjNTU2QiBDYXJkQnVzIFtUb3JuYWRvXQotCQkxMGI3IDY1NTYgIDEwLzEwMCBNaW5pIFBDSSBFdGhlcm5ldCBBZGFwdGVyCi0JNjU2MCAgM2NDRkU2NTYgQ2FyZEJ1cyBbQ3ljbG9uZV0KLQkJMTBiNyA2NTZhICAzQ0NGRU02NTYgMTAvMTAwIExBTis1NksgTW9kZW0gQ2FyZEJ1cwotCTY1NjEgIDNjQ0ZFTTY1NiAxMC8xMDAgTEFOKzU2SyBNb2RlbSBDYXJkQnVzCi0JCTEwYjcgNjU2YiAgM0NDRkVNNjU2IDEwLzEwMCBMQU4rNTZLIE1vZGVtIENhcmRCdXMKLQk2NTYyICAzY0NGRU02NTZCIDEwLzEwMCBMQU4rV2lubW9kZW0gQ2FyZEJ1cyBbQ3ljbG9uZV0KLQkJMTBiNyA2NTZiICAzQ0NGRU02NTZCIDEwLzEwMCBMQU4rNTZLIE1vZGVtIENhcmRCdXMKLQk2NTYzICAzY0NGRU02NTZCIDEwLzEwMCBMQU4rNTZLIE1vZGVtIENhcmRCdXMKLQkJMTBiNyA2NTZiICAzQ0NGRU02NTYgMTAvMTAwIExBTis1NksgTW9kZW0gQ2FyZEJ1cwotCTY1NjQgIDNjWEZFTTY1NkMgMTAvMTAwIExBTitXaW5tb2RlbSBDYXJkQnVzIFtUb3JuYWRvXQotCTc2NDYgIDNjU09ITzEwMC1UWCBIdXJyaWNhbmUKLQk3NzcwICAzQ1JXRTc3NyBQQ0koUExYKSBXaXJlbGVzcyBBZGFwdG9yIFtBaXJjb25uZWN0XQotCTc5NDAgIDNjODAzIEZERElMaW5rIFVUUCBDb250cm9sbGVyCi0JNzk4MCAgM2M4MDQgRkRESUxpbmsgU0FTIENvbnRyb2xsZXIKLQk3OTkwICAzYzgwNSBGRERJTGluayBEQVMgQ29udHJvbGxlcgotCTgwZWIgIDNjOTQwQiAxMC8xMDAvMTAwMEJhc2UtVAotCTg4MTEgIFRva2VuIHJpbmcKLQk5MDAwICAzYzkwMCAxMEJhc2VUIFtCb29tZXJhbmddCi0JOTAwMSAgM2M5MDAgMTBNYnBzIENvbWJvIFtCb29tZXJhbmddCi0JOTAwNCAgM2M5MDBCLVRQTyBFdGhlcmxpbmsgWEwgW0N5Y2xvbmVdCi0JCTEwYjcgOTAwNCAgM0M5MDBCLVRQTyBFdGhlcmxpbmsgWEwgVFBPIDEwTWIKLQk5MDA1ICAzYzkwMEItQ29tYm8gRXRoZXJsaW5rIFhMIFtDeWNsb25lXQotCQkxMGI3IDkwMDUgIDNDOTAwQi1Db21ibyBFdGhlcmxpbmsgWEwgQ29tYm8KLQk5MDA2ICAzYzkwMEItVFBDIEV0aGVybGluayBYTCBbQ3ljbG9uZV0KLQk5MDBhICAzYzkwMEItRkwgMTBiYXNlLUZMIFtDeWNsb25lXQotCTkwNTAgIDNjOTA1IDEwMEJhc2VUWCBbQm9vbWVyYW5nXQotCTkwNTEgIDNjOTA1IDEwMEJhc2VUNCBbQm9vbWVyYW5nXQotCTkwNTUgIDNjOTA1QiAxMDBCYXNlVFggW0N5Y2xvbmVdCi0JCTEwMjggMDA4MCAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwODEgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTAyOCAwMDgyICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JCTEwMjggMDA4MyAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwODQgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTAyOCAwMDg1ICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JCTEwMjggMDA4NiAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwODcgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTAyOCAwMDg4ICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JCTEwMjggMDA4OSAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwOTAgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTAyOCAwMDkxICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JCTEwMjggMDA5MiAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwOTMgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTAyOCAwMDk0ICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JCTEwMjggMDA5NSAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwOTYgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTAyOCAwMDk3ICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JCTEwMjggMDA5OCAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwOTkgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTBiNyA5MDU1ICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JOTA1NiAgM2M5MDVCLVQ0IEZhc3QgRXRoZXJMaW5rIFhMIFtDeWNsb25lXQotCTkwNTggIDNjOTA1QiBEZWx1eGUgRXRoZXJsaW5rIDEwLzEwMC9CTkMgW0N5Y2xvbmVdCi0JOTA1YSAgM2M5MDVCLUZYIEZhc3QgRXRoZXJsaW5rIFhMIEZYIDEwMGJhc2VGeCBbQ3ljbG9uZV0KLQk5MjAwICAzYzkwNUMtVFgvVFgtTSBbVG9ybmFkb10KLQkJMTAyOCAwMDk1ICAzQzkyMCBJbnRlZ3JhdGVkIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlcgotCQkxMDI4IDAwOTcgIDNDOTIwIEludGVncmF0ZWQgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTEwMjggMDBmZSAgT3B0aXBsZXggR1gyNDAKLQkJMTAyOCAwMTJhICAzQzkyMCBJbnRlZ3JhdGVkIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciBbTGF0aXR1ZGUgQzY0MF0KLQkJMTBiNyAxMDAwICAzQzkwNUMtVFggRmFzdCBFdGhlcmxpbmsgZm9yIFBDIE1hbmFnZW1lbnQgTklDCi0JCTEwYjcgNzAwMCAgMTAvMTAwIE1pbmkgUENJIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTBmMSAyNDY2ICBUaWdlciBNUFggUzI0NjYgKDNDOTIwIEludGVncmF0ZWQgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyKQotCTkyMDEgIDNDOTIwQi1FTUIgSW50ZWdyYXRlZCBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgW1Rvcm5hZG9dCi0JCTEwNDMgODBhYiAgQTdOOFggRGVsdXhlIG9uYm9hcmQgM0M5MjBCLUVNQiBJbnRlZ3JhdGVkIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlcgotCTkyMDIgIDNDb20gM0M5MjBCLUVNQi1XTk0gSW50ZWdyYXRlZCBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIKLQk5MjEwICAzQzkyMEItRU1CLVdOTSBJbnRlZ3JhdGVkIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlcgotCTkzMDAgIDNDU09ITzEwMEItVFggOTEwLUEwMSBbdHVsaXBdCi0JOTgwMCAgM2M5ODAtVFggRmFzdCBFdGhlcmxpbmsgWEwgU2VydmVyIEFkYXB0ZXIgW0N5Y2xvbmVdCi0JCTEwYjcgOTgwMCAgM2M5ODAtVFggRmFzdCBFdGhlcmxpbmsgWEwgU2VydmVyIEFkYXB0ZXIKLQk5ODA1ICAzYzk4MC1DIDEwLzEwMGJhc2VUWCBOSUMgW1B5dGhvbi1UXQotCQkxMGI3IDEyMDEgIEV0aGVyTGluayBTZXJ2ZXIgMTAvMTAwIER1YWwgUG9ydCBBCi0JCTEwYjcgMTIwMiAgRXRoZXJMaW5rIFNlcnZlciAxMC8xMDAgRHVhbCBQb3J0IEIKLQkJMTBiNyA5ODA1ICAzYzk4MCAxMC8xMDBiYXNlVFggTklDIFtQeXRob24tVF0KLQkJMTBmMSAyNDYyICBUaHVuZGVyIEs3IFMyNDYyCi0JOTkwMCAgM0M5OTAtVFggW1R5cGhvb25dCi0JOTkwMiAgM0NSOTkwLVRYLTk1IFtUeXBob29uIDU2LWJpdF0KLQk5OTAzICAzQ1I5OTAtVFgtOTcgW1R5cGhvb24gMTY4LWJpdF0KLQk5OTA0ICAzQzk5MEItVFgtTS8zQzk5MEJTVlIgW1R5cGhvb24yXQotCQkxMGI3IDEwMDAgIDNDUjk5MEItVFgtTSBbVHlwaG9vbjJdCi0JCTEwYjcgMjAwMCAgM0NSOTkwQlNWUiBbVHlwaG9vbjIgU2VydmVyXQotCTk5MDUgIDNDUjk5MC1GWC05NS85Ny85NSBbVHlwaG9uIEZpYmVyXQotCQkxMGI3IDExMDEgIDNDUjk5MC1GWC05NSBbVHlwaG9vbiBGaWJlciA1Ni1iaXRdCi0JCTEwYjcgMTEwMiAgM0NSOTkwLUZYLTk3IFtUeXBob29uIEZpYmVyIDE2OC1iaXRdCi0JCTEwYjcgMjEwMSAgM0NSOTkwLUZYLTk1IFNlcnZlciBbVHlwaG9vbiBGaWJlciA1Ni1iaXRdCi0JCTEwYjcgMjEwMiAgM0NSOTkwLUZYLTk3IFNlcnZlciBbVHlwaG9vbiBGaWJlciAxNjgtYml0XQotCTk5MDggIDNDUjk5MFNWUjk1IFtUeXBob29uIFNlcnZlciA1Ni1iaXRdCi0JOTkwOSAgM0NSOTkwU1ZSOTcgW1R5cGhvb24gU2VydmVyIDE2OC1iaXRdCi0JOTkwYSAgM0M5OTBTVlIgW1R5cGhvb24gU2VydmVyXQotCTk5MGIgIDNDOTkwU1ZSIFtUeXBob29uIFNlcnZlcl0KLTEwYjggIFN0YW5kYXJkIE1pY3Jvc3lzdGVtcyBDb3JwIFtTTUNdCi0JMDAwNSAgODNjMTcwIEVQSUMvMTAwIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMDU1IGUwMDAgIExBTkVQSUMgMTAvMTAwIFtFVkIxNzFRLVBDSV0KLQkJMTA1NSBlMDAyICBMQU5FUElDIDEwLzEwMCBbRVZCMTcxRy1QQ0ldCi0JCTEwYjggYTAxMSAgRXRoZXJQb3dlciBJSSAxMC8xMDAKLQkJMTBiOCBhMDE0ICBFdGhlclBvd2VyIElJIDEwLzEwMAotCQkxMGI4IGEwMTUgIEV0aGVyUG93ZXIgSUkgMTAvMTAwCi0JCTEwYjggYTAxNiAgRXRoZXJQb3dlciBJSSAxMC8xMDAKLQkJMTBiOCBhMDE3ICBFdGhlclBvd2VyIElJIDEwLzEwMAotCTAwMDYgIDgzYzE3NSBFUElDLzEwMCBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTA1NSBlMTAwICBMQU5FUElDIENhcmRidXMgRmFzdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEwNTUgZTEwMiAgTEFORVBJQyBDYXJkYnVzIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMDU1IGUzMDAgIExBTkVQSUMgQ2FyZGJ1cyBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTA1NSBlMzAyICBMQU5FUElDIENhcmRidXMgRmFzdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEwYjggYTAxMiAgTEFORVBJQyBDYXJkYnVzIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxM2EyIDgwMDIgIExBTkVQSUMgQ2FyZGJ1cyBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTNhMiA4MDA2ICBMQU5FUElDIENhcmRidXMgRmFzdCBFdGhlcm5ldCBBZGFwdGVyCi0JMTAwMCAgRkRDIDM3YzY2NQotCTEwMDEgIEZEQyAzN0M5MjIKLSMgODAyLjExZyBjYXJkCi0JMjgwMiAgU01DMjgwMlcgW0VaIENvbm5lY3QgZ10KLQlhMDExICA4M0MxNzBRRgotCWIxMDYgIFNNQzM0QzkwCi0xMGI5ICBBTGkgQ29ycG9yYXRpb24KLQkwMTAxICBDTUk4MzM4L0MzRFggUENJIEF1ZGlvIERldmljZQotCTAxMTEgIEMtTWVkaWEgQ01JODczOC9DM0RYIEF1ZGlvIERldmljZSAoT0VNKQotCQkxMGI5IDAxMTEgIEMtTWVkaWEgQ01JODczOC9DM0RYIEF1ZGlvIERldmljZSAoT0VNKQotCTA3ODAgIE11bHRpLUlPIENhcmQKLQkwNzgyICBNdWx0aS1JTyBDYXJkCi0JMTQzNSAgTTE0MzUKLQkxNDQ1ICBNMTQ0NQotCTE0NDkgIE0xNDQ5Ci0JMTQ1MSAgTTE0NTEKLQkxNDYxICBNMTQ2MQotCTE0ODkgIE0xNDg5Ci0JMTUxMSAgTTE1MTEgW0FsYWRkaW5dCi0JMTUxMiAgTTE1MTIgW0FsYWRkaW5dCi0JMTUxMyAgTTE1MTMgW0FsYWRkaW5dCi0JMTUyMSAgTTE1MjEgW0FsYWRkaW4gSUlJXQotCQkxMGI5IDE1MjEgIEFMSSBNMTUyMSBBbGFkZGluIElJSSBDUFUgQnJpZGdlCi0JMTUyMyAgTTE1MjMKLQkJMTBiOSAxNTIzICBBTEkgTTE1MjMgSVNBIEJyaWRnZQotCTE1MzEgIE0xNTMxIFtBbGFkZGluIElWXQotCTE1MzMgIE0xNTMzIFBDSSB0byBJU0EgQnJpZGdlIFtBbGFkZGluIElWXQotCQkxMDE0IDA1M2IgIFRoaW5rUGFkIFI0MGUgKDI2ODQtSFZHKSBQQ0kgdG8gSVNBIEJyaWRnZQotCQkxMGI5IDE1MzMgIEFMSSBNMTUzMyBBbGFkZGluIElWIElTQSBCcmlkZ2UKLQkxNTQxICBNMTU0MQotCQkxMGI5IDE1NDEgIEFMSSBNMTU0MSBBbGFkZGluIFYvVisgQUdQIFN5c3RlbSBDb250cm9sbGVyCi0JMTU0MyAgTTE1NDMKLQkxNTYzICBNMTU2MyBIeXBlclRyYW5zcG9ydCBTb3V0aCBCcmlkZ2UKLQkxNjIxICBNMTYyMQotCTE2MzEgIEFMSSBNMTYzMSBQQ0kgTm9ydGggQnJpZGdlIEFsYWRkaW4gUHJvIElJSQotCTE2MzIgIE0xNjMyTSBOb3J0aGJyaWRnZStUcmlkZW50Ci0JMTY0MSAgQUxJIE0xNjQxIFBDSSBOb3J0aCBCcmlkZ2UgQWxhZGRpbiBQcm8gSVYKLQkxNjQ0ICBNMTY0NC9NMTY0NFQgTm9ydGhicmlkZ2UrVHJpZGVudAotCTE2NDYgIE0xNjQ2IE5vcnRoYnJpZGdlK1RyaWRlbnQKLQkxNjQ3ICBNMTY0NyBOb3J0aGJyaWRnZSBbTUFHaUsgMSAvIE1vYmlsZU1BR2lLIDFdCi0JMTY1MSAgTTE2NTEvTTE2NTFUIE5vcnRoYnJpZGdlIFtBbGFkZGluLVBybyA1LzVNLEFsYWRkaW4tUHJvIDVULzVUTV0KLQkxNjcxICBNMTY3MSBTdXBlciBQNCBOb3J0aGJyaWRnZSBbQUdQNFgsUENJIGFuZCBTRFIvRERSXQotCTE2NzIgIE0xNjcyIE5vcnRoYnJpZGdlIFtDeWJlckFMQUREaU4tUDRdCi0JMTY4MSAgTTE2ODEgUDQgTm9ydGhicmlkZ2UgW0FHUDhYLEh5cGVyVHJhbnNwb3J0IGFuZCBTRFIvRERSXQotCTE2ODcgIE0xNjg3IEs4IE5vcnRoYnJpZGdlIFtBR1A4WCBhbmQgSHlwZXJUcmFuc3BvcnRdCi0JMTY4OSAgTTE2ODkgSzggTm9ydGhicmlkZ2UgW1N1cGVyIEs4IFNpbmdsZSBDaGlwXQotCTMxNDEgIE0zMTQxCi0JMzE0MyAgTTMxNDMKLQkzMTQ1ICBNMzE0NQotCTMxNDcgIE0zMTQ3Ci0JMzE0OSAgTTMxNDkKLQkzMTUxICBNMzE1MQotCTMzMDcgIE0zMzA3Ci0JMzMwOSAgTTMzMDkKLQkzMzIzICBNMzMyNSBWaWRlby9BdWRpbyBEZWNvZGVyCi0JNTIxMiAgTTQ4MDMKLQk1MjE1ICBNUzQ4MDMKLQk1MjE3ICBNNTIxN0gKLQk1MjE5ICBNNTIxOQotCTUyMjUgIE01MjI1Ci0JNTIyOCAgTTUyMjggQUxpIEFUQS9SQUlEIENvbnRyb2xsZXIKLQk1MjI5ICBNNTIyOSBJREUKLQkJMTAxNCAwNTBmICBUaGlua1BhZCBSMzAKLQkJMTAxNCAwNTNkICBUaGlua1BhZCBSNDBlICgyNjg0LUhWRykgYnVpbHRpbiBJREUKLQkJMTAzYyAwMDI0ICBQYXZpbGlvbiB6ZTQ0MDAgYnVpbHRpbiBJREUKLQkJMTA0MyA4MDUzICBBN0EyNjYgTW90aGVyYm9hcmQgSURFCi0JNTIzNSAgTTUyMjUKLQk1MjM3ICBVU0IgMS4xIENvbnRyb2xsZXIKLQkJMTAxNCAwNTQwICBUaGlua1BhZCBSNDBlICgyNjg0LUhWRykgYnVpbHRpbiBVU0IKLQkJMTAzYyAwMDI0ICBQYXZpbGlvbiB6ZTQ0MDAgYnVpbHRpbiBVU0IKLQk1MjM5ICBVU0IgMi4wIENvbnRyb2xsZXIKLQk1MjQzICBNMTU0MSBQQ0kgdG8gQUdQIENvbnRyb2xsZXIKLQk1MjQ2ICBBR1A4WCBDb250cm9sbGVyCi0JNTI0NyAgUENJIHRvIEFHUCBDb250cm9sbGVyCi0JNTI0OSAgTTUyNDkgSFRUIHRvIFBDSSBCcmlkZ2UKLQk1MjUxICBNNTI1MSBQMTM5NCBPSENJIDEuMCBDb250cm9sbGVyCi0JNTI1MyAgTTUyNTMgUDEzOTQgT0hDSSAxLjEgQ29udHJvbGxlcgotCTUyNjEgIE01MjYxIEV0aGVybmV0IENvbnRyb2xsZXIKLQk1MjYzICBNNTI2MyBFdGhlcm5ldCBDb250cm9sbGVyCi0JNTI4MSAgQUxpIE01MjgxIFNlcmlhbCBBVEEgLyBSQUlEIEhvc3QgQ29udHJvbGxlcgotCTUyODcgIFVMaSA1Mjg3IFNBVEEKLQk1Mjg5ICBVTGkgNTI4OSBTQVRBCi0JNTQ1MCAgTHVjZW50IFRlY2hub2xvZ2llcyBTb2Z0IE1vZGVtIEFNUgotCTU0NTEgIE01NDUxIFBDSSBBQy1MaW5rIENvbnRyb2xsZXIgQXVkaW8gRGV2aWNlCi0JCTEwMTQgMDUwNiAgVGhpbmtQYWQgUjMwCi0JCTEwMTQgMDUzZSAgVGhpbmtQYWQgUjQwZSAoMjY4NC1IVkcpIGJ1aWx0aW4gQXVkaW8KLQkJMTAzYyAwMDI0ICBQYXZpbGlvbiB6ZTQ0MDAgYnVpbHRpbiBBdWRpbwotCQkxMGI5IDU0NTEgIEhQIENvbXBhcSBuYzQwMTAgKERZODg1QUEjQUJOKQotCTU0NTMgIE01NDUzIFBDSSBBQy1MaW5rIENvbnRyb2xsZXIgTW9kZW0gRGV2aWNlCi0JNTQ1NSAgTTU0NTUgUENJIEFDLUxpbmsgQ29udHJvbGxlciBBdWRpbyBEZXZpY2UKLQk1NDU3ICBNNTQ1NyBBQyc5NyBNb2RlbSBDb250cm9sbGVyCi0JCTEwMTQgMDUzNSAgVGhpbmtQYWQgUjQwZSAoMjY4NC1IVkcpIGJ1aWx0aW4gbW9kZW0KLQkJMTAzYyAwMDI0ICBQYXZpbGlvbiB6ZTQ0MDAgYnVpbHRpbiBNb2RlbSBEZXZpY2UKLSMgU2FtZSBidXQgbW9yZSB1c2VmdWxsIGZvciBkcml2ZXIncyBsb29rdXAKLQk1NDU5ICBTbWFydExpbmsgU21hcnRQQ0k1NjEgNTZLIE1vZGVtCi0jIFNtYXJ0TGluayBQQ0kgU29mdE1vZGVtCi0JNTQ1YSAgU21hcnRMaW5rIFNtYXJ0UENJNTYzIDU2SyBNb2RlbQotCTU0NzEgIE01NDcxIE1lbW9yeSBTdGljayBDb250cm9sbGVyCi0JNTQ3MyAgTTU0NzMgU0QtTU1DIENvbnRyb2xsZXIKLQk3MTAxICBNNzEwMSBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2xsZXIgW1BNVV0KLQkJMTAxNCAwNTEwICBUaGlua1BhZCBSMzAKLQkJMTAxNCAwNTNjICBUaGlua1BhZCBSNDBlICgyNjg0LUhWRykgUG93ZXIgTWFuYWdlbWVudCBDb250cm9sbGVyCi0JCTEwM2MgMDAyNCAgUGF2aWxpb24gemU0NDAwCi0xMGJhICBNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuCi0JMDMwMSAgQWNjZWxHcmFwaGljcyBBY2NlbEVDTElQU0UKLQkwMzA0ICBBY2NlbEdBTEFYWSBBMjEwMCBbT0VNIEV2YW5zICYgU3V0aGVybGFuZF0KLQkwMzA4ICBUb3JuYWRvIDMwMDAgW09FTSBFdmFucyAmIFN1dGhlcmxhbmRdCi0JMTAwMiAgVkc1MDAgW1ZvbHVtZVBybyBWb2x1bWUgUmVuZGVyaW5nIEFjY2VsZXJhdG9yXQotMTBiYiAgRGFwaGEgRWxlY3Ryb25pY3MgQ29ycG9yYXRpb24KLTEwYmMgIEFkdmFuY2VkIExvZ2ljIFJlc2VhcmNoCi0xMGJkICBTdXJlY29tIFRlY2hub2xvZ3kKLQkwZTM0ICBORS0zNAotMTBiZSAgVHNlbmcgTGFicyBJbnRlcm5hdGlvbmFsIENvLgotMTBiZiAgTW9zdCBJbmMKLTEwYzAgIEJvY2EgUmVzZWFyY2ggSW5jLgotMTBjMSAgSUNNIENvLiwgTHRkLgotMTBjMiAgQXVzcGV4IFN5c3RlbXMgSW5jLgotMTBjMyAgU2Ftc3VuZyBTZW1pY29uZHVjdG9ycywgSW5jLgotCTExMDAgIFNtYXJ0ZXRoZXIxMDAgU0MxMTAwIExBTiBBZGFwdGVyIChpODI1NTdCKQotMTBjNCAgQXdhcmQgU29mdHdhcmUgSW50ZXJuYXRpb25hbCBJbmMuCi0xMGM1ICBYZXJveCBDb3Jwb3JhdGlvbgotMTBjNiAgUmFtYnVzIEluYy4KLTEwYzcgIE1lZGlhIFZpc2lvbgotMTBjOCAgTmVvbWFnaWMgQ29ycG9yYXRpb24KLQkwMDAxICBOTTIwNzAgW01hZ2ljR3JhcGggMTI4XQotCTAwMDIgIE5NMjA5MCBbTWFnaWNHcmFwaCAxMjhWXQotCTAwMDMgIE5NMjA5MyBbTWFnaWNHcmFwaCAxMjhaVl0KLQkwMDA0ICBOTTIxNjAgW01hZ2ljR3JhcGggMTI4WERdCi0JCTEwMTQgMDBiYSAgTWFnaWNHcmFwaCAxMjhYRAotCQkxMDI1IDEwMDcgIE1hZ2ljR3JhcGggMTI4WEQKLQkJMTAyOCAwMDc0ICBNYWdpY0dyYXBoIDEyOFhECi0JCTEwMjggMDA3NSAgTWFnaWNHcmFwaCAxMjhYRAotCQkxMDI4IDAwN2QgIE1hZ2ljR3JhcGggMTI4WEQKLQkJMTAyOCAwMDdlICBNYWdpY0dyYXBoIDEyOFhECi0JCTEwMzMgODAyZiAgTWFnaWNHcmFwaCAxMjhYRAotCQkxMDRkIDgwMWIgIE1hZ2ljR3JhcGggMTI4WEQKLQkJMTA0ZCA4MDJmICBNYWdpY0dyYXBoIDEyOFhECi0JCTEwNGQgODMwYiAgTWFnaWNHcmFwaCAxMjhYRAotCQkxMGJhIDBlMDAgIE1hZ2ljR3JhcGggMTI4WEQKLQkJMTBjOCAwMDA0ICBNYWdpY0dyYXBoIDEyOFhECi0JCTEwY2YgMTAyOSAgTWFnaWNHcmFwaCAxMjhYRAotCQkxMGY3IDgzMDggIE1hZ2ljR3JhcGggMTI4WEQKLQkJMTBmNyA4MzA5ICBNYWdpY0dyYXBoIDEyOFhECi0JCTEwZjcgODMwYiAgTWFnaWNHcmFwaCAxMjhYRAotCQkxMGY3IDgzMGQgIE1hZ2ljR3JhcGggMTI4WEQKLQkJMTBmNyA4MzEyICBNYWdpY0dyYXBoIDEyOFhECi0JMDAwNSAgTk0yMjAwIFtNYWdpY0dyYXBoIDI1NkFWXQotCQkxMDE0IDAwZGQgIFRoaW5rUGFkIDU3MAotCQkxMDI4IDAwODggIExhdGl0dWRlIENQaSBBCi0JMDAwNiAgTk0yMzYwIFtNYWdpY01lZGlhIDI1NlpYXQotCTAwMTYgIE5NMjM4MCBbTWFnaWNNZWRpYSAyNTZYTCtdCi0JCTEwYzggMDAxNiAgTWFnaWNNZWRpYSAyNTZYTCsKLQkwMDI1ICBOTTIyMzAgW01hZ2ljR3JhcGggMjU2QVYrXQotCTAwODMgIE5NMjA5MyBbTWFnaWNHcmFwaCAxMjhaVitdCi0JODAwNSAgTk0yMjAwIFtNYWdpY01lZGlhIDI1NkFWIEF1ZGlvXQotCQkwZTExIGIwZDEgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlIG9uIERpc2NvdmVyeQotCQkwZTExIGIxMjYgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlIG9uIER1cmFuZ28KLQkJMTAxNCAwMGRkICBNYWdpY01lZGlhIDI1NkFWIEF1ZGlvIERldmljZSBvbiBCbGFja1RpcCBUaGlua3BhZAotCQkxMDI1IDEwMDMgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlIG9uIFRyYXZlbE1hdGUgNzIwCi0JCTEwMjggMDA4OCAgTGF0aXR1ZGUgQ1BpIEEKLQkJMTAyOCAwMDhmICBNYWdpY01lZGlhIDI1NkFWIEF1ZGlvIERldmljZSBvbiBDb2xvcmFkbyBJbnNwaXJvbgotCQkxMDNjIDAwMDcgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlIG9uIFZveWFnZXIgSUkKLQkJMTAzYyAwMDA4ICBNYWdpY01lZGlhIDI1NkFWIEF1ZGlvIERldmljZSBvbiBWb3lhZ2VyIElJSQotCQkxMDNjIDAwMGQgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlIG9uIE9tbmlib29rIDkwMAotCQkxMGM4IDgwMDUgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlIG9uIEZpcmVBbnQKLQkJMTEwYSA4MDA1ICBNYWdpY01lZGlhIDI1NkFWIEF1ZGlvIERldmljZQotCQkxNGMwIDAwMDQgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlCi0JODAwNiAgTk0yMzYwIFtNYWdpY01lZGlhIDI1NlpYIEF1ZGlvXQotCTgwMTYgIE5NMjM4MCBbTWFnaWNNZWRpYSAyNTZYTCsgQXVkaW9dCi0xMGM5ICBEYXRhZXhwZXJ0IENvcnBvcmF0aW9uCi0xMGNhICBGdWppdHN1IE1pY3JvZWxlY3RyLiwgSW5jLgotMTBjYiAgT21yb24gQ29ycG9yYXRpb24KLSMgbmVlIE1lbnRvciBBUkMgSW5jCi0xMGNjICBNYWkgTG9naWMgSW5jb3Jwb3JhdGVkCi0JMDY2MCAgQXJ0aWNpYSBTIEhvc3QgQnJpZGdlCi0JMDY2MSAgQXJ0aWNpYSBTIFBDSSBCcmlkZ2UKLTEwY2QgIEFkdmFuY2VkIFN5c3RlbSBQcm9kdWN0cywgSW5jCi0JMTEwMCAgQVNDMTEwMAotCTEyMDAgIEFTQzEyMDAgWyhhYnA5NDApIEZhc3QgU0NTSS1JSV0KLQkxMzAwICBBQlA5NDAtVSAvIEFCUDk2MC1VCi0JCTEwY2QgMTMxMCAgQVNDMTMwMCBTQ1NJIEFkYXB0ZXIKLQkyMzAwICBBQlA5NDAtVVcKLQkyNTAwICBBQlA5NDAtVTJXCi0xMGNlICBSYWRpdXMKLSMgbmVlIENpdGljb3JwIFRUSQotMTBjZiAgRnVqaXRzdSBMaW1pdGVkLgotCTIwMDEgIG1iODY2MDUKLTEwZDEgIEZ1dHVyZVBsdXMgU3lzdGVtcyBDb3JwLgotMTBkMiAgTW9sZXggSW5jb3Jwb3JhdGVkCi0xMGQzICBKYWJpbCBDaXJjdWl0IEluYwotMTBkNCAgSHVhbG9uIE1pY3JvZWxlY3Ryb25pY3MKLTEwZDUgIEF1dG9sb2dpYyBJbmMuCi0xMGQ2ICBDZXRpYQotMTBkNyAgQkNNIEFkdmFuY2VkIFJlc2VhcmNoCi0xMGQ4ICBBZHZhbmNlZCBQZXJpcGhlcmFscyBMYWJzCi0xMGQ5ICBNYWNyb25peCwgSW5jLiBbTVhJQ10KLQkwNDMxICBNWDk4NzE1Ci0JMDUxMiAgTVg5ODcxMwotCTA1MzEgIE1YOTg3eDUKLQkJMTE4NiAxMjAwICBERkUtNTQwVFggUHJvRkFTVCAxMC8xMDAgQWRhcHRlcgotCTg2MjUgIE1YODYyNTAKLQk4ODg4ICBNWDg2MjAwCi0xMGRhICBDb21wYXEgSVBHLUF1c3RpbgotCTA1MDggIFRDNDA0OCBUb2tlbiBSaW5nIDQvMTYKLQkzMzkwICBUbDNjM3g5Ci0xMGRiICBSb2htIExTSSBTeXN0ZW1zLCBJbmMuCi0xMGRjICBDRVJOL0VDUC9FRFUKLQkwMDAxICBTVEFSL1JEMjQgU0NJLVBDSSAoUE1DKQotCTAwMDIgIFRBUi9SRDI0IFNDSS1QQ0kgKFBNQykKLQkwMDIxICBISVBQSSBkZXN0aW5hdGlvbgotCTAwMjIgIEhJUFBJIHNvdXJjZQotCTEwZGMgIEFUVDJDMTUtMyBGUEdBCi0xMGRkICBFdmFucyAmIFN1dGhlcmxhbmQKLTEwZGUgIG5WaWRpYSBDb3Jwb3JhdGlvbgotCTAwMDggIE5WMSBbRURHRSAzRF0KLQkwMDA5ICBOVjEgW0VER0UgM0RdCi0JMDAxMCAgTlYyIFtNdXRhcmEgVjA4XQotCTAwMjAgIE5WNCBbUklWQSBUTlRdCi0JCTEwNDMgMDIwMCAgVjM0MDAgVE5UCi0JCTEwNDggMGMxOCAgRXJhem9yIElJIFNHUkFNCi0JCTEwNDggMGMxYiAgRXJhem9yIElJCi0JCTEwOTIgMDU1MCAgVmlwZXIgVjU1MAotCQkxMDkyIDA1NTIgIFZpcGVyIFY1NTAKLQkJMTA5MiA0ODA0ICBWaXBlciBWNTUwCi0JCTEwOTIgNDgwOCAgVmlwZXIgVjU1MAotCQkxMDkyIDQ4MTAgIFZpcGVyIFY1NTAKLQkJMTA5MiA0ODEyICBWaXBlciBWNTUwCi0JCTEwOTIgNDgxNSAgVmlwZXIgVjU1MAotCQkxMDkyIDQ4MjAgIFZpcGVyIFY1NTAgd2l0aCBUViBvdXQKLQkJMTA5MiA0ODIyICBWaXBlciBWNTUwCi0JCTEwOTIgNDkwNCAgVmlwZXIgVjU1MAotCQkxMDkyIDQ5MTQgIFZpcGVyIFY1NTAKLQkJMTA5MiA4MjI1ICBWaXBlciBWNTUwCi0JCTEwYjQgMjczZCAgVmVsb2NpdHkgNDQwMAotCQkxMGI0IDI3M2UgIFZlbG9jaXR5IDQ0MDAKLQkJMTBiNCAyNzQwICBWZWxvY2l0eSA0NDAwCi0JCTEwZGUgMDAyMCAgUml2YSBUTlQKLQkJMTEwMiAxMDE1ICBHcmFwaGljcyBCbGFzdGVyIENUNjcxMAotCQkxMTAyIDEwMTYgIEdyYXBoaWNzIEJsYXN0ZXIgUklWQSBUTlQKLQkwMDI4ICBOVjUgW1JJVkEgVE5UMi9UTlQyIFByb10KLQkJMTA0MyAwMjAwICBBR1AtVjM4MDAgU0dSQU0KLQkJMTA0MyAwMjAxICBBR1AtVjM4MDAgU0RSQU0KLQkJMTA0MyAwMjA1ICBQQ0ktVjM4MDAKLQkJMTA0MyA0MDAwICBBR1AtVjM4MDBQUk8KLQkJMTA0OCAwYzIxICBTeW5lcmd5IElJCi0JCTEwNDggMGMzMSAgRXJhem9yIElJSQotCQkxMDdkIDIxMzQgIFdpbkZhc3QgM0QgUzMyMCBJSSArIFRWLU91dAotCQkxMDkyIDQ4MDQgIFZpcGVyIFY3NzAKLQkJMTA5MiA0YTAwICBWaXBlciBWNzcwCi0JCTEwOTIgNGEwMiAgVmlwZXIgVjc3MCBVbHRyYQotCQkxMDkyIDVhMDAgIFJJVkEgVE5UMi9UTlQyIFBybwotCQkxMDkyIDZhMDIgIFZpcGVyIFY3NzAgVWx0cmEKLQkJMTA5MiA3YTAyICBWaXBlciBWNzcwIFVsdHJhCi0JCTEwZGUgMDAwNSAgUklWQSBUTlQyIFBybwotCQkxMGRlIDAwMGYgIENvbXBhcSBOVklESUEgVE5UMiBQcm8KLQkJMTEwMiAxMDIwICAzRCBCbGFzdGVyIFJJVkEgVE5UMgotCQkxMTAyIDEwMjYgIDNEIEJsYXN0ZXIgUklWQSBUTlQyIERpZ2l0YWwKLQkJMTRhZiA1ODEwICBNYXhpIEdhbWVyIFhlbnRvcgotCTAwMjkgIE5WNSBbUklWQSBUTlQyIFVsdHJhXQotCQkxMDQzIDAyMDAgIEFHUC1WMzgwMCBEZWx1eGUKLQkJMTA0MyAwMjAxICBBR1AtVjM4MDAgVWx0cmEgU0RSQU0KLQkJMTA0MyAwMjA1ICBQQ0ktVjM4MDAgVWx0cmEKLQkJMTEwMiAxMDIxICAzRCBCbGFzdGVyIFJJVkEgVE5UMiBVbHRyYQotCQkxMTAyIDEwMjkgIDNEIEJsYXN0ZXIgUklWQSBUTlQyIFVsdHJhCi0JCTExMDIgMTAyZiAgM0QgQmxhc3RlciBSSVZBIFROVDIgVWx0cmEKLQkJMTRhZiA1ODIwICBNYXhpIEdhbWVyIFhlbnRvciAzMgotCTAwMmEgIE5WNSBbUml2YSBUblQyXQotCTAwMmIgIE5WNSBbUml2YSBUblQyXQotCTAwMmMgIE5WNiBbVmFudGEvVmFudGEgTFRdCi0JCTEwNDMgMDIwMCAgQUdQLVYzODAwIENvbWJhdCBTRFJBTQotCQkxMDQzIDAyMDEgIEFHUC1WMzgwMCBDb21iYXQKLQkJMTA5MiA2ODIwICBWaXBlciBWNzMwCi0JCTExMDIgMTAzMSAgQ1Q2OTM4IFZBTlRBIDhNQgotCQkxMTAyIDEwMzQgIENUNjg5NCBWQU5UQSAxNk1CCi0JCTE0YWYgNTAwOCAgTWF4aSBHYW1lciBQaG9lbml4IDIKLQkwMDJkICBOVjVNNjQgW1JJVkEgVE5UMiBNb2RlbCA2NC9Nb2RlbCA2NCBQcm9dCi0JCTEwNDMgMDIwMCAgQUdQLVYzODAwTQotCQkxMDQzIDAyMDEgIEFHUC1WMzgwME0KLQkJMTA0OCAwYzNhICBFcmF6b3IgSUlJIExUCi0JCTEwZGUgMDAxZSAgTTY0IEFHUDR4Ci0JCTExMDIgMTAyMyAgQ1Q2ODkyIFJJVkEgVE5UMiBWYWx1ZQotCQkxMTAyIDEwMjQgIENUNjkzMiBSSVZBIFROVDIgVmFsdWUgMzJNYgotCQkxMTAyIDEwMmMgIENUNjkzMSBSSVZBIFROVDIgVmFsdWUgW0p1bXBlcl0KLQkJMTQ2MiA4ODA4ICBNU0ktODgwOAotCQkxNTU0IDEwNDEgIFBpeGVsdmlldyBSSVZBIFROVDIgTTY0Ci0JCTE1NjkgMDAyZCAgUGFsaXQgTWljcm9zeXN0ZW1zIERheXRvbmEgVE5UMiBNNjQKLQkwMDJlICBOVjYgW1ZhbnRhXQotCTAwMmYgIE5WNiBbVmFudGFdCi0JMDAzNCAgTUNQMDQgU01CdXMKLQkwMDM1ICBNQ1AwNCBJREUKLQkwMDM2ICBNQ1AwNCBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkwMDM3ICBNQ1AwNCBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDAzOCAgTUNQMDQgRXRoZXJuZXQgQ29udHJvbGxlcgotCTAwM2EgIE1DUDA0IEFDJzk3IEF1ZGlvIENvbnRyb2xsZXIKLQkwMDNiICBNQ1AwNCBVU0IgQ29udHJvbGxlcgotCTAwM2MgIE1DUDA0IFVTQiBDb250cm9sbGVyCi0JMDAzZCAgTUNQMDQgUENJIEJyaWRnZQotCTAwM2UgIE1DUDA0IFNlcmlhbCBBVEEgQ29udHJvbGxlcgotCTAwNDAgIG52NDAgW0dlRm9yY2UgNjgwMCBVbHRyYV0KLQkwMDQxICBOVjQwIFtHZUZvcmNlIDY4MDBdCi0JMDA0MiAgTlY0MC4yCi0JMDA0MyAgTlY0MC4zCi0JMDA0NSAgTlY0MCBbR2VGb3JjZSA2ODAwIEdUXQotCTAwNDkgIE5WNDBHTAotCTAwNGUgIE5WNDBHTCBbUXVhZHJvIEZYIDQwMDBdCi0JMDA1MSAgQ0s4MDQgSVNBIEJyaWRnZQotCTAwNTIgIENLODA0IFNNQnVzCi0JMDA1MyAgQ0s4MDQgSURFCi0JMDA1NCAgQ0s4MDQgU2VyaWFsIEFUQSBDb250cm9sbGVyCi0JMDA1NSAgQ0s4MDQgU2VyaWFsIEFUQSBDb250cm9sbGVyCi0JMDA1NiAgQ0s4MDQgRXRoZXJuZXQgQ29udHJvbGxlcgotCTAwNTcgIENLODA0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkwMDU5ICBDSzgwNCBBQyc5NyBBdWRpbyBDb250cm9sbGVyCi0JMDA1YSAgQ0s4MDQgVVNCIENvbnRyb2xsZXIKLQkwMDViICBDSzgwNCBVU0IgQ29udHJvbGxlcgotCTAwNWMgIENLODA0IFBDSSBCcmlkZ2UKLQkwMDVkICBDSzgwNCBQQ0lFIEJyaWRnZQotCTAwNWUgIENLODA0IE1lbW9yeSBDb250cm9sbGVyCi0JMDA2MCAgbkZvcmNlMiBJU0EgQnJpZGdlCi0JCTEwNDMgODBhZCAgQTdOOFggTWFpbmJvYXJkCi0JMDA2NCAgbkZvcmNlMiBTTUJ1cyAoTUNQKQotCTAwNjUgIG5Gb3JjZTIgSURFCi0JMDA2NiAgbkZvcmNlMiBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTEwNDMgODBhNyAgQTdOOFggTWFpbmJvYXJkIG9uYm9hcmQgbkZvcmNlMiBFdGhlcm5ldAotCTAwNjcgIG5Gb3JjZTIgVVNCIENvbnRyb2xsZXIKLQkJMTA0MyAwYzExICBBN044WCBNYWluYm9hcmQKLQkwMDY4ICBuRm9yY2UyIFVTQiBDb250cm9sbGVyCi0JCTEwNDMgMGMxMSAgQTdOOFggTWFpbmJvYXJkCi0JMDA2YSAgbkZvcmNlMiBBQzk3IEF1ZGlvIENvbnRyb2xlciAoTUNQKQotCTAwNmIgIG5Gb3JjZSBBdWRpbyBQcm9jZXNzaW5nIFVuaXQKLQkJMTBkZSAwMDZiICBuRm9yY2UyIE1DUCBBdWRpbyBQcm9jZXNzaW5nIFVuaXQKLQkwMDZjICBuRm9yY2UyIEV4dGVybmFsIFBDSSBCcmlkZ2UKLQkwMDZkICBuRm9yY2UyIFBDSSBCcmlkZ2UKLQkwMDZlICBuRm9yY2UyIEZpcmVXaXJlIChJRUVFIDEzOTQpIENvbnRyb2xsZXIKLQkwMDg0ICBNQ1AyQSBTTUJ1cwotCTAwODUgIE1DUDJBIElERQotCTAwODYgIE1DUDJBIEV0aGVybmV0IENvbnRyb2xsZXIKLQkwMDg3ICBNQ1AyQSBVU0IgQ29udHJvbGxlcgotCTAwODggIE1DUDJBIFVTQiBDb250cm9sbGVyCi0JMDA4YSAgTUNQMlMgQUMnOTcgQXVkaW8gQ29udHJvbGxlcgotCTAwOGIgIE1DUDJBIFBDSSBCcmlkZ2UKLQkwMDhjICBNQ1AyQSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDA4ZSAgbkZvcmNlMiBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkwMGEwICBOVjUgW0FsYWRkaW4gVE5UMl0KLQkJMTRhZiA1ODEwICBNYXhpIEdhbWVyIFhlbnRvcgotCTAwYzAgIE5WNDEuMAotCTAwYzEgIE5WNDEuMQotCTAwYzIgIE5WNDEuMgotCTAwYzggIE5WNDEuOAotCTAwY2UgIE5WNDFHTAotCTAwZDAgIG5Gb3JjZTMgTFBDIEJyaWRnZQotCTAwZDEgIG5Gb3JjZTMgSG9zdCBCcmlkZ2UKLQkwMGQyICBuRm9yY2UzIEFHUCBCcmlkZ2UKLQkwMGQzICBDSzgwNCBNZW1vcnkgQ29udHJvbGxlcgotCTAwZDQgIG5Gb3JjZTMgU01CdXMKLQkwMGQ1ICBuRm9yY2UzIElERQotCTAwZDYgIG5Gb3JjZTMgRXRoZXJuZXQKLQkwMGQ3ICBuRm9yY2UzIFVTQiAxLjEKLQkwMGQ4ICBuRm9yY2UzIFVTQiAyLjAKLQkwMGRhICBuRm9yY2UzIEF1ZGlvCi0JMDBkZCAgbkZvcmNlMyBQQ0kgQnJpZGdlCi0JMDBkZiAgQ0s4UyBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDBlMCAgbkZvcmNlMyAyNTBHYiBMUEMgQnJpZGdlCi0JMDBlMSAgbkZvcmNlMyAyNTBHYiBIb3N0IEJyaWRnZQotCTAwZTIgIG5Gb3JjZTMgMjUwR2IgQUdQIEhvc3QgdG8gUENJIEJyaWRnZQotCTAwZTMgIENLOFMgU2VyaWFsIEFUQSBDb250cm9sbGVyICh2Mi41KQotCTAwZTQgIG5Gb3JjZSAyNTBHYiBQQ0kgU3lzdGVtIE1hbmFnZW1lbnQKLQkwMGU1ICBDSzhTIFBhcmFsbGVsIEFUQSBDb250cm9sbGVyICh2Mi41KQotCTAwZTYgIENLOFMgRXRoZXJuZXQgQ29udHJvbGxlcgotCTAwZTcgIENLOFMgVVNCIENvbnRyb2xsZXIKLQkwMGU4ICBuRm9yY2UzIEVIQ0kgVVNCIDIuMCBDb250cm9sbGVyCi0JMDBlYSAgbkZvcmNlMyAyNTBHYiBBQyc5NyBBdWRpbyBDb250cm9sbGVyCi0JMDBlZCAgbkZvcmNlMyAyNTBHYiBQQ0ktdG8tUENJIEJyaWRnZQotCTAwZWUgIENLOFMgU2VyaWFsIEFUQSBDb250cm9sbGVyICh2Mi41KQotCTAwZjAgIE5WNDAgW0dlRm9yY2UgNjgwMC9HZUZvcmNlIDY4MDAgVWx0cmFdCi0JMDBmMSAgTlY0MyBbR2VGb3JjZSA2NjAwL0dlRm9yY2UgNjYwMCBHVF0KLQkwMGYyICBOVjQzIFtHZUZvcmNlIDY2MDAgR1RdCi0JMDBmOCAgTlY0NUdMIFtRdWFkcm8gRlggMzQwMF0KLQkwMGY5ICBOVjQwIFtHZUZvcmNlIDY4MDAgVWx0cmEvR2VGb3JjZSA2ODAwIEdUXQotCQkxNjgyIDIxMjAgIEdFRk9SQ0UgNjgwMCBHVCBQQ0ktRQotCTAwZmEgIE5WMzYgW0dlRm9yY2UgUENYIDU3NTBdCi0JMDBmYiAgTlYzNSBbR2VGb3JjZSBQQ1ggNTkwMF0KLQkwMGZjICBOVjM3R0wgW1F1YWRybyBGWCAzMzAvR2VGb3JjZSBQQ1ggNTMwMF0KLQkwMGZkICBOVjM3R0wgW1F1YWRybyBGWCAzMzBdCi0JMDBmZSAgTlYzOEdMIFtRdWFkcm8gRlggMTMwMF0KLQkwMGZmICBOVjE4IFtHZUZvcmNlIFBDWCA0MzAwXQotCTAxMDAgIE5WMTAgW0dlRm9yY2UgMjU2IFNEUl0KLQkJMTA0MyAwMjAwICBBR1AtVjY2MDAgU0dSQU0KLQkJMTA0MyAwMjAxICBBR1AtVjY2MDAgU0RSQU0KLQkJMTA0MyA0MDA4ICBBR1AtVjY2MDAgU0dSQU0KLQkJMTA0MyA0MDA5ICBBR1AtVjY2MDAgU0RSQU0KLQkJMTEwMiAxMDJkICBDVDY5NDEgR2VGb3JjZSAyNTYKLQkJMTRhZiA1MDIyICAzRCBQcm9waGV0IFNFCi0JMDEwMSAgTlYxMEREUiBbR2VGb3JjZSAyNTYgRERSXQotCQkxMDQzIDAyMDIgIEFHUC1WNjgwMCBERFIKLQkJMTA0MyA0MDBhICBBR1AtVjY4MDAgRERSIFNHUkFNCi0JCTEwNDMgNDAwYiAgQUdQLVY2ODAwIEREUiBTRFJBTQotCQkxMDdkIDI4MjIgIFdpbkZhc3QgR2VGb3JjZSAyNTYKLQkJMTEwMiAxMDJlICBDVDY5NzEgR2VGb3JjZSAyNTYgRERSCi0JCTE0YWYgNTAyMSAgM0QgUHJvcGhldCBERFItRFZJCi0JMDEwMyAgTlYxMEdMIFtRdWFkcm9dCi0JMDExMCAgTlYxMSBbR2VGb3JjZTIgTVgvTVggNDAwXQotCQkxMDQzIDQwMTUgIEFHUC1WNzEwMCBQcm8KLQkJMTA0MyA0MDMxICBWNzEwMCBQcm8gd2l0aCBUViBvdXRwdXQKLQkJMTBkZSAwMDkxICBEZWxsIE9FTSBHZUZvcmNlIDIgTVggNDAwCi0JCTE0NjIgODgxNyAgTVNJIEdlRm9yY2UyIE1YNDAwIFBybzMyUyBbTVMtODgxN10KLQkJMTRhZiA3MTAyICAzRCBQcm9waGV0IElJIE1YCi0JCTE0YWYgNzEwMyAgM0QgUHJvcGhldCBJSSBNWCBEdWFsLURpc3BsYXkKLQkwMTExICBOVjExRERSIFtHZUZvcmNlMiBNWCAxMDAgRERSLzIwMCBERFJdCi0JMDExMiAgTlYxMSBbR2VGb3JjZTIgR29dCi0JMDExMyAgTlYxMUdMIFtRdWFkcm8yIE1YUi9FWF0KLQkwMTQwICBOVjQzIFtNU0kgTlg2NjAwR1QtVEQxMjhFXQotCTAxNGYgIE5WNDMgW0dlRm9yY2UgNjIwMF0KLQkwMTUwICBOVjE1IFtHZUZvcmNlMiBHVFMvUHJvXQotCQkxMDQzIDQwMTYgIFY3NzAwIEFHUCBWaWRlbyBDYXJkCi0JCTEwN2QgMjg0MCAgV2luRmFzdCBHZUZvcmNlMiBHVFMgd2l0aCBUViBvdXRwdXQKLQkJMTA3ZCAyODQyICBXaW5GYXN0IEdlRm9yY2UgMiBQcm8KLQkJMTQ2MiA4ODMxICBDcmVhdGl2ZSBHZUZvcmNlMiBQcm8KLQkwMTUxICBOVjE1RERSIFtHZUZvcmNlMiBUaV0KLQkJMTA0MyA0MDVmICBWNzcwMFRpCi0JCTE0NjIgNTUwNiAgQ3JlYXRpdmUgM0QgQmxhc3RlciBHZWZvcmNlMiBUaXRhbml1bQotCTAxNTIgIE5WMTVCUiBbR2VGb3JjZTIgVWx0cmEsIEJsYWRlcnVubmVyXQotCQkxMDQ4IDBjNTYgIEdMQURJQUMgVWx0cmEKLQkwMTUzICBOVjE1R0wgW1F1YWRybzIgUHJvXQotCTAxNzAgIE5WMTcgW0dlRm9yY2U0IE1YIDQ2MF0KLQkwMTcxICBOVjE3IFtHZUZvcmNlNCBNWCA0NDBdCi0JCTEwYjAgMDAwMiAgR2FpbndhcmQgUHJvLzYwMCBUVgotCQkxNDYyIDg2NjEgIEc0TVg0NDAtVlRQCi0JCTE0NjIgODczMCAgTVg0NDBTRVMtVCAoTVMtODg3MykKLQkJMTQ3YiA4ZjAwICBBYml0IFNpbHVybyBHZUZvcmNlNE1YNDQwCi0JMDE3MiAgTlYxNyBbR2VGb3JjZTQgTVggNDIwXQotCTAxNzMgIE5WMTcgW0dlRm9yY2U0IE1YIDQ0MC1TRV0KLQkwMTc0ICBOVjE3IFtHZUZvcmNlNCA0NDAgR29dCi0JMDE3NSAgTlYxNyBbR2VGb3JjZTQgNDIwIEdvXQotCTAxNzYgIE5WMTcgW0dlRm9yY2U0IDQyMCBHbyAzMk1dCi0JCTRjNTMgMTA5MCAgQ3g5IC8gVng5IG1haW5ib2FyZAotCTAxNzcgIE5WMTcgW0dlRm9yY2U0IDQ2MCBHb10KLQkwMTc4ICBOVjE3R0wgW1F1YWRybzQgNTUwIFhHTF0KLQkwMTc5ICBOVjE3IFtHZUZvcmNlNCA0NDAgR28gNjRNXQotCQkxMGRlIDAxNzkgIEdlRm9yY2U0IE1YIChNYWMpCi0JMDE3YSAgTlYxN0dMIFtRdWFkcm80IDIwMC80MDAgTlZTXQotCTAxN2IgIE5WMTdHTCBbUXVhZHJvNCA1NTAgWEdMXQotCTAxN2MgIE5WMTdHTCBbUXVhZHJvNCA1NTAgR29HTF0KLQkwMTdkICBOVjE3IFtHZUZvcmNlNCA0MTAgR28gMTZNXQotCTAxODEgIE5WMTggW0dlRm9yY2U0IE1YIDQ0MCBBR1AgOHhdCi0JCTEwNDMgODA2ZiAgVjkxODAgTWFnaWMKLQkJMTQ2MiA4ODgwICBNUy1TdGFyRm9yY2UgR2VGb3JjZTQgTVggNDQwIHdpdGggQUdQOFgKLQkJMTQ2MiA4OTAwICBNUy04ODkwIEdlRm9yY2UgNCBNWDQ0MCBBR1A4WAotCQkxNDYyIDkzNTAgIE1TSSBHZWZvcmNlNCBNWCBUOFggd2l0aCBBR1A4WAotCQkxNDdiIDhmMGQgIFNpbHVybyBHRjQgTVgtOFgKLQkwMTgyICBOVjE4IFtHZUZvcmNlNCBNWCA0NDBTRSBBR1AgOHhdCi0JMDE4MyAgTlYxOCBbR2VGb3JjZTQgTVggNDIwIEFHUCA4eF0KLQkwMTg1ICBOVjE4IFtHZUZvcmNlNCBNWCA0MDAwIEFHUCA4eF0KLQkwMTg2ICBOVjE4TSBbR2VGb3JjZTQgNDQ4IEdvXQotCTAxODcgIE5WMThNIFtHZUZvcmNlNCA0ODggR29dCi0JMDE4OCAgTlYxOEdMIFtRdWFkcm80IDU4MCBYR0xdCi0JMDE4YSAgTlYxOEdMIFtRdWFkcm80IE5WUyBBR1AgOHhdCi0JMDE4YiAgTlYxOEdMIFtRdWFkcm80IDM4MCBYR0xdCi0JMDE4ZCAgTlYxOE0gW0dlRm9yY2U0IDQ0OCBHb10KLQkwMWEwICBOVkNydXNoMTEgW0dlRm9yY2UyIE1YIEludGVncmF0ZWQgR3JhcGhpY3NdCi0JMDFhNCAgbkZvcmNlIENQVSBicmlkZ2UKLQkwMWFiICBuRm9yY2UgNDIwIE1lbW9yeSBDb250cm9sbGVyIChERFIpCi0JMDFhYyAgbkZvcmNlIDIyMC80MjAgTWVtb3J5IENvbnRyb2xsZXIKLQkwMWFkICBuRm9yY2UgMjIwLzQyMCBNZW1vcnkgQ29udHJvbGxlcgotCTAxYjAgIG5Gb3JjZSBBdWRpbwotCTAxYjEgIG5Gb3JjZSBBdWRpbwotCTAxYjIgIG5Gb3JjZSBJU0EgQnJpZGdlCi0JMDFiNCAgbkZvcmNlIFBDSSBTeXN0ZW0gTWFuYWdlbWVudAotCTAxYjcgIG5Gb3JjZSBBR1AgdG8gUENJIEJyaWRnZQotCTAxYjggIG5Gb3JjZSBQQ0ktdG8tUENJIGJyaWRnZQotCTAxYmMgIG5Gb3JjZSBJREUKLQkwMWMxICBuRm9yY2UgQUMnOTcgTW9kZW0gQ29udHJvbGxlcgotCTAxYzIgIG5Gb3JjZSBVU0IgQ29udHJvbGxlcgotCTAxYzMgIG5Gb3JjZSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDFlMCAgbkZvcmNlMiBBR1AgKGRpZmZlcmVudCB2ZXJzaW9uPykKLQkwMWU4ICBuRm9yY2UyIEFHUAotCTAxZWEgIG5Gb3JjZTIgTWVtb3J5IENvbnRyb2xsZXIgMAotCTAxZWIgIG5Gb3JjZTIgTWVtb3J5IENvbnRyb2xsZXIgMQotCTAxZWMgIG5Gb3JjZTIgTWVtb3J5IENvbnRyb2xsZXIgMgotCTAxZWQgIG5Gb3JjZTIgTWVtb3J5IENvbnRyb2xsZXIgMwotCTAxZWUgIG5Gb3JjZTIgTWVtb3J5IENvbnRyb2xsZXIgNAotCTAxZWYgIG5Gb3JjZTIgTWVtb3J5IENvbnRyb2xsZXIgNQotCTAxZjAgIE5WMTggW0dlRm9yY2U0IE1YIC0gbkZvcmNlIEdQVV0KLQkwMjAwICBOVjIwIFtHZUZvcmNlM10KLQkJMTA0MyA0MDJmICBBR1AtVjgyMDAgRERSCi0JMDIwMSAgTlYyMCBbR2VGb3JjZTMgVGkgMjAwXQotCTAyMDIgIE5WMjAgW0dlRm9yY2UzIFRpIDUwMF0KLQkJMTA0MyA0MDViICBWODIwMCBUNQotCQkxNTQ1IDAwMmYgIFh0YXN5IDY5NjQKLQkwMjAzICBOVjIwRENDIFtRdWFkcm8gRENDXQotCTAyNDAgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMjQxICBDNTEgUENJIEV4cHJlc3MgQnJpZGdlCi0JMDI0MiAgQzUxIFBDSSBFeHByZXNzIEJyaWRnZQotCTAyNDMgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMjQ0ICBDNTEgUENJIEV4cHJlc3MgQnJpZGdlCi0JMDI0NSAgQzUxIFBDSSBFeHByZXNzIEJyaWRnZQotCTAyNDYgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMjQ3ICBDNTEgUENJIEV4cHJlc3MgQnJpZGdlCi0JMDI0OCAgQzUxIFBDSSBFeHByZXNzIEJyaWRnZQotCTAyNDkgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMjRhICBDNTEgUENJIEV4cHJlc3MgQnJpZGdlCi0JMDI0YiAgQzUxIFBDSSBFeHByZXNzIEJyaWRnZQotCTAyNGMgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMjRkICBDNTEgUENJIEV4cHJlc3MgQnJpZGdlCi0JMDI0ZSAgQzUxIFBDSSBFeHByZXNzIEJyaWRnZQotCTAyNGYgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMjUwICBOVjI1IFtHZUZvcmNlNCBUaSA0NjAwXQotCTAyNTEgIE5WMjUgW0dlRm9yY2U0IFRpIDQ0MDBdCi0JCTEwNDMgODAyMyAgdjg0NDAgR2VGb3JjZSA0IFRpNDQwMAotCTAyNTIgIE5WMjUgW0dlRm9yY2U0IFRpXQotCTAyNTMgIE5WMjUgW0dlRm9yY2U0IFRpIDQyMDBdCi0JCTEwN2QgMjg5NiAgV2luRmFzdCBBMjUwIExFIFREIChEdWFsIFZHQS9UVi1vdXQvRFZJKQotCQkxNDdiIDhmMDkgIFNpbHVybyAoRHVhbCBWR0EvVFYtb3V0L0RWSSkKLQkwMjU4ICBOVjI1R0wgW1F1YWRybzQgOTAwIFhHTF0KLQkwMjU5ICBOVjI1R0wgW1F1YWRybzQgNzUwIFhHTF0KLQkwMjViICBOVjI1R0wgW1F1YWRybzQgNzAwIFhHTF0KLQkwMjYwICBNQ1A1MSBMUEMgQnJpZGdlCi0JMDI2MSAgTUNQNTEgTFBDIEJyaWRnZQotCTAyNjIgIE1DUDUxIExQQyBCcmlkZ2UKLQkwMjYzICBNQ1A1MSBMUEMgQnJpZGdlCi0JMDI2NCAgTUNQNTEgU01CdXMKLQkwMjY1ICBNQ1A1MSBJREUKLQkwMjY2ICBNQ1A1MSBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkwMjY3ICBNQ1A1MSBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkwMjY4ICBNQ1A1MSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDI2OSAgTUNQNTEgRXRoZXJuZXQgQ29udHJvbGxlcgotCTAyNmEgIE1DUDUxIE1DSQotCTAyNmIgIE1DUDUxIEFDOTcgQXVkaW8gQ29udHJvbGxlcgotCTAyNmMgIE1DUDUxIEhpZ2ggRGVmaW5pdGlvbiBBdWRpbwotCTAyNmQgIE1DUDUxIFVTQiBDb250cm9sbGVyCi0JMDI2ZSAgTUNQNTEgVVNCIENvbnRyb2xsZXIKLQkwMjZmICBNQ1A1MSBQQ0kgQnJpZGdlCi0JMDI3MCAgTUNQNTEgSG9zdCBCcmlkZ2UKLQkwMjcxICBNQ1A1MSBQTVUKLQkwMjcyICBNQ1A1MSBNZW1vcnkgQ29udHJvbGxlciAwCi0JMDI3ZSAgQzUxIE1lbW9yeSBDb250cm9sbGVyIDIKLQkwMjdmICBDNTEgTWVtb3J5IENvbnRyb2xsZXIgMwotCTAyODAgIE5WMjggW0dlRm9yY2U0IFRpIDQ4MDBdCi0JMDI4MSAgTlYyOCBbR2VGb3JjZTQgVGkgNDIwMCBBR1AgOHhdCi0JMDI4MiAgTlYyOCBbR2VGb3JjZTQgVGkgNDgwMCBTRV0KLQkwMjg2ICBOVjI4IFtHZUZvcmNlNCBUaSA0MjAwIEdvIEFHUCA4eF0KLQkwMjg4ICBOVjI4R0wgW1F1YWRybzQgOTgwIFhHTF0KLQkwMjg5ICBOVjI4R0wgW1F1YWRybzQgNzgwIFhHTF0KLQkwMjhjICBOVjI4R0xNIFtRdWFkcm80IDcwMCBHb0dMXQotCTAyZjAgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjEgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjIgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjMgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjQgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjUgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjYgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjcgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjggIEM1MSBNZW1vcnkgQ29udHJvbGxlciA1Ci0JMDJmOSAgQzUxIE1lbW9yeSBDb250cm9sbGVyIDQKLQkwMmZhICBDNTEgTWVtb3J5IENvbnRyb2xsZXIgMAotCTAyZmIgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMmZjICBDNTEgUENJIEV4cHJlc3MgQnJpZGdlCi0JMDJmZCAgQzUxIFBDSSBFeHByZXNzIEJyaWRnZQotCTAyZmUgIEM1MSBNZW1vcnkgQ29udHJvbGxlciAxCi0JMDJmZiAgQzUxIEhvc3QgQnJpZGdlCi0JMDMwMCAgTlYzMCBbR2VGb3JjZSBGWF0KLQkwMzAxICBOVjMwIFtHZUZvcmNlIEZYIDU4MDAgVWx0cmFdCi0JMDMwMiAgTlYzMCBbR2VGb3JjZSBGWCA1ODAwXQotCTAzMDggIE5WMzBHTCBbUXVhZHJvIEZYIDIwMDBdCi0JMDMwOSAgTlYzMEdMIFtRdWFkcm8gRlggMTAwMF0KLQkwMzExICBOVjMxIFtHZUZvcmNlIEZYIDU2MDAgVWx0cmFdCi0JMDMxMiAgTlYzMSBbR2VGb3JjZSBGWCA1NjAwXQotCTAzMTMgIE5WMzEKLQkwMzE0ICBOVjMxIFtHZUZvcmNlIEZYIDU2MDBYVF0KLQkJMTA0MyA4MTRhICBWOTU2MFhUL1RECi0JMDMxNiAgTlYzMQotCTAzMTcgIE5WMzEKLQkwMzFhICBOVjMxTSBbR2VGb3JjZSBGWCBHbyA1NjAwXQotCTAzMWIgIE5WMzFNIFtHZUZvcmNlIEZYIEdvNTY1MF0KLQkwMzFjICBOVklESUEgUXVhZHJvIEZYIDcwMCBHbwotCTAzMWQgIE5WMzEKLQkwMzFlICBOVjMxCi0JMDMxZiAgTlYzMQotCTAzMjAgIE5WMzQgW0dlRm9yY2UgRlggNTIwMF0KLQkwMzIxICBOVjM0IFtHZUZvcmNlIEZYIDUyMDAgVWx0cmFdCi0JMDMyMiAgTlYzNCBbR2VGb3JjZSBGWCA1MjAwXQotCQkxNDYyIDkxNzEgIE1TLTg5MTcgKEZYNTIwMC1UMTI4KQotCTAzMjMgIE5WMzQgW0dlRm9yY2UgRlggNTIwMExFXQotCTAzMjQgIE5WMzRNIFtHZUZvcmNlIEZYIEdvIDUyMDBdCi0JCTEwNzEgODE2MCAgTUlNMjAwMAotCTAzMjUgIE5WMzRNIFtHZUZvcmNlIEZYIEdvNTI1MF0KLQkwMzI2ICBOVjM0IFtHZUZvcmNlIEZYIDU1MDBdCi0JMDMyNyAgTlYzNCBbR2VGb3JjZSBGWCA1MTAwXQotCTAzMjggIE5WMzRNIFtHZUZvcmNlIEZYIEdvIDUyMDBdCi0JMDMyOSAgTlYzNE0gW0dlRm9yY2UgRlggR281MjAwXQotCTAzMmEgIE5WMzRHTCBbUXVhZHJvIE5WUyAyODAgUENJXQotCTAzMmIgIE5WMzRHTCBbUXVhZHJvIEZYIDUwMC82MDAgUENJXQotCTAzMmMgIE5WMzRHTE0gW0dlRm9yY2UgRlggR28gNTMwMF0KLQkwMzJkICBOVjM0IFtHZUZvcmNlIEZYIEdvNTEwMF0KLQkwMzJmICBOVjM0Ci0JMDMzMCAgTlYzNSBbR2VGb3JjZSBGWCA1OTAwIFVsdHJhXQotCTAzMzEgIE5WMzUgW0dlRm9yY2UgRlggNTkwMF0KLQkJMTA0MyA4MTQ1ICBWOTk1MEdFCi0JMDMzMiAgTlYzNSBbR2VGb3JjZSBGWCA1OTAwWFRdCi0JMDMzMyAgTlYzOCBbR2VGb3JjZSBGWCA1OTUwIFVsdHJhXQotCTAzMzQgIE5WMzUgW0dlRm9yY2UgRlggNTkwMFpUXQotCTAzMzggIE5WMzVHTCBbUXVhZHJvIEZYIDMwMDBdCi0JMDMzZiAgTlYzNUdMIFtRdWFkcm8gRlggNzAwXQotCTAzNDEgIE5WMzYuMSBbR2VGb3JjZSBGWCA1NzAwIFVsdHJhXQotCTAzNDIgIE5WMzYuMiBbR2VGb3JjZSBGWCA1NzAwXQotCTAzNDMgIE5WMzYgW0dlRm9yY2UgRlggNTcwMExFXQotCTAzNDQgIE5WMzYuNCBbR2VGb3JjZSBGWCA1NzAwVkVdCi0JMDM0NSAgTlYzNi41Ci0JMDM0NyAgTlYzNiBbR2VGb3JjZSBGWCBHbzU3MDBdCi0JMDM0OCAgTlYzNiBbR2VGb3JjZSBGWCBHbzU3MDBdCi0JMDM0OSAgTlYzNgotCTAzNGIgIE5WMzYKLQkwMzRjICBOVjM2IFtRdWFkcm8gRlggR28xMDAwXQotCTAzNGUgIE5WMzZHTCBbUXVhZHJvIEZYIDExMDBdCi0JMDM0ZiAgTlYzNkdMCi0xMGRmICBFbXVsZXggQ29ycG9yYXRpb24KLQkxYWU1ICBMUDYwMDAgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQkxYWU2ICBMUCA4MDAwIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyIEFsdGVybmF0ZSBJRCAoSlgxOjItMywgSlgyOjEtMikKLQkxYWU3ICBMUCA4MDAwIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyIEFsdGVybmF0ZSBJRCAoSlgxOjItMywgSlgyOjItMykKLQlmMDA1ICBMUDExNTBlIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JZjA4NSAgTFA4NTAgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQlmMDk1ICBMUDk1MiBGaWJyZSBDaGFubmVsIEhvc3QgQWRhcHRlcgotCWYwOTggIExQOTgyIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JZjBhNSAgTFAxMDUwIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JZjBkNSAgTFAxMTUwIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JZjEwMCAgTFAxMTAwMGUgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQlmNzAwICBMUDcwMDAgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQlmNzAxICBMUCA3MDAwRUZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyIEFsdGVybmF0ZSBJRCAoSlgxOjItMywgSlgyOjEtMikKLQlmODAwICBMUDgwMDAgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQlmODAxICBMUCA4MDAwIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyIEFsdGVybmF0ZSBJRCAoSlgxOjItMywgSlgyOjEtMikKLQlmOTAwICBMUDkwMDAgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQlmOTAxICBMUCA5MDAwIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyIEFsdGVybmF0ZSBJRCAoSlgxOjItMywgSlgyOjEtMikKLQlmOTgwICBMUDk4MDIgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQlmOTgxICBMUCA5ODAyIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyIEFsdGVybmF0ZSBJRAotCWY5ODIgIExQIDk4MDIgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIgQWx0ZXJuYXRlIElECi0JZmEwMCAgTFAxMDAwMCBGaWJyZSBDaGFubmVsIEhvc3QgQWRhcHRlcgotCWZhMDEgIExQMTAxIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JZmQwMCAgTFAxMTAwMCBGaWJyZSBDaGFubmVsIEhvc3QgQWRhcHRlcgotMTBlMCAgSW50ZWdyYXRlZCBNaWNybyBTb2x1dGlvbnMgSW5jLgotCTUwMjYgIElNUzUwMjYvMjcvMjgKLQk1MDI3ICBJTVM1MDI3Ci0JNTAyOCAgSU1TNTAyOAotCTg4NDkgIElNUzg4NDkKLQk4ODUzICBJTVM4ODUzCi0JOTEyOCAgSU1TOTEyOCBbVHdpbiB0dXJibyAxMjhdCi0xMGUxICBUZWtyYW0gVGVjaG5vbG9neSBDby4sTHRkLgotCTAzOTEgIFRSTS1TMTA0MAotCQkxMGUxIDAzOTEgIERDLTMxNVUgU0NTSS0zIEhvc3QgQWRhcHRlcgotCTY5MGMgIERDLTY5MGMKLQlkYzI5ICBEQy0yOTAKLTEwZTIgIEFwdGl4IENvcnBvcmF0aW9uCi0xMGUzICBUdW5kcmEgU2VtaWNvbmR1Y3RvciBDb3JwLgotCTAwMDAgIENBOTFDMDQyIFtVbml2ZXJzZV0KLQkwODYwICBDQTkxQzg2MCBbUVNwYW5dCi0JMDg2MiAgQ0E5MUM4NjJBIFtRU3Bhbi1JSV0KLQk4MjYwICBDQTkxTDgyMDBCIFtEdWFsIFBDSSBQb3dlclNwYW4gSUldCi0JODI2MSAgQ0E5MUw4MjYwQiBbU2luZ2xlIFBDSSBQb3dlclNwYW4gSUldCi0xMGU0ICBUYW5kZW0gQ29tcHV0ZXJzCi0xMGU1ICBNaWNybyBJbmR1c3RyaWVzIENvcnBvcmF0aW9uCi0xMGU2ICBHYWluYmVyeSBDb21wdXRlciBQcm9kdWN0cyBJbmMuCi0xMGU3ICBWYWRlbQotMTBlOCAgQXBwbGllZCBNaWNybyBDaXJjdWl0cyBDb3JwLgotCTEwNzIgIElORVMgR1BJQi1QQ0kgKEFNQ0M1OTIwIGJhc2VkKQotCTIwMTEgIFEtTW90aW9uIFZpZGVvIENhcHR1cmUvRWRpdCBib2FyZAotCTQ3NTAgIFM1OTMwIFtNYXRjaG1ha2VyXQotCTU5MjAgIFM1OTIwCi0JODA0MyAgTEFOYWk0LnggW015cmluZXQgTEFOYWkgaW50ZXJmYWNlIGNoaXBdCi0JODA2MiAgUzU5MzNfUEFSQVNUQVRJT04KLQk4MDdkICBTNTkzMyBbTWF0Y2htYWtlcl0KLQk4MDg4ICBLb25nc2JlcmcgU3BhY2V0ZWMgRm9ybWF0IFN5bmNocm9uaXplcgotCTgwODkgIEtvbmdzYmVyZyBTcGFjZXRlYyBTZXJpYWwgT3V0cHV0IEJvYXJkCi0JODA5YyAgUzU5MzNfSEVQQzMKLQk4MGQ3ICBQQ0ktOTExMgotCTgwZDkgIFBDSS05MTE4Ci0JODBkYSAgUENJLTk4MTIKLQk4MTFhICBQQ0ktSUVFRTEzNTUtRFMtREUgSW50ZXJmYWNlCi0JODE0YyAgRmFzdGNvbSBFU0NDLVBDSSAoQ29tbXRlY2gsIEluYy4pCi0JODE3MCAgUzU5MzMgW01hdGNobWFrZXJdIChDaGlwc2V0IERldmVsb3BtZW50IFRvb2wpCi0jIHNvbGQgd2l0aCBSb3BlciBTY2llbnRpZmMoUGhvdG9tZXRyaWNzKSBDb29sU25hcCBIUSBjYW1lcmEKLQk4MWU2ICBNdWx0aW1lZGlhIHZpZGVvIGNvbnRyb2xsZXIKLQk4MjkxICBGYXN0Y29tIDIzMi84LVBDSSAoQ29tbXRlY2gsIEluYy4pCi0JODJjNCAgRmFzdGNvbSA0MjIvNC1QQ0kgKENvbW10ZWNoLCBJbmMuKQotCTgyYzUgIEZhc3Rjb20gNDIyLzItUENJIChDb21tdGVjaCwgSW5jLikKLQk4MmM2ICBGYXN0Y29tIElHNDIyLzEtUENJIChDb21tdGVjaCwgSW5jLikKLQk4MmM3ICBGYXN0Y29tIElHMjMyLzItUENJIChDb21tdGVjaCwgSW5jLikKLQk4MmNhICBGYXN0Y29tIDIzMi80LVBDSSAoQ29tbXRlY2gsIEluYy4pCi0JODJkYiAgQUpBIEhETlRWIEhEIFNESSBGcmFtZXN0b3JlCi0JODJlMiAgRmFzdGNvbSBESU8yNEgtUENJIChDb21tdGVjaCwgSW5jLikKLQk4ODUxICBTNTkzMyBvbiBJbm5lcyBDb3JwIEZNIFJhZGlvIENhcHR1cmUgY2FyZAotMTBlOSAgQWxwcyBFbGVjdHJpYyBDby4sIEx0ZC4KLTEwZWEgIEludGVyZ3JhcGhpY3MgU3lzdGVtcwotCTE2ODAgIElHQS0xNjgwCi0JMTY4MiAgSUdBLTE2ODIKLQkxNjgzICBJR0EtMTY4MwotCTIwMDAgIEN5YmVyUHJvIDIwMDAKLQkyMDEwICBDeWJlclBybyAyMDAwQQotCTUwMDAgIEN5YmVyUHJvIDUwMDAKLQk1MDUwICBDeWJlclBybyA1MDUwCi0JNTIwMiAgQ3liZXJQcm8gNTIwMgotIyBDeWJlclBybzUyMDIgQXVkaW8gRnVuY3Rpb24KLQk1MjUyICBDeWJlclBybzUyNTIKLTEwZWIgIEFydGlzdHMgR3JhcGhpY3MKLQkwMTAxICAzR0EKLQk4MTExICBUd2lzdDMgRnJhbWUgR3JhYmJlcgotMTBlYyAgUmVhbHRlayBTZW1pY29uZHVjdG9yIENvLiwgTHRkLgotCTgwMjkgIFJUTC04MDI5KEFTKQotCQkxMGI4IDIwMTEgIEVaLUNhcmQgKFNNQzEyMDgpCi0JCTEwZWMgODAyOSAgUlRMLTgwMjkoQVMpCi0JCTExMTMgMTIwOCAgRU4xMjA4Ci0JCTExODYgMDMwMCAgREUtNTI4Ci0JCTEyNTkgMjQwMCAgQVQtMjQwMAotCTgxMjkgIFJUTC04MTI5Ci0JCTEwZWMgODEyOSAgUlQ4MTI5IEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCTgxMzggIFJUODEzOSAoQi9DKSBDYXJkYnVzIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMGVjIDgxMzggIFJUODEzOSAoQi9DKSBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQk4MTM5ICBSVEwtODEzOS84MTM5Qy84MTM5QysKLQkJMDM1NyAwMDBhICBUVFAtTW9uaXRvcmluZyBDYXJkIFYyLjAKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDI1IDg5MjAgIEFMTi0zMjUKLQkJMTAyNSA4OTIxICBBTE4tMzI1Ci0JCTEwNzEgODE2MCAgTUlNMjAwMAotCQkxMGJkIDAzMjAgIEVQLTMyMFgtUgotCQkxMGVjIDgxMzkgIFJUODEzOQotCQkxMTEzIGVjMDEgIEZOQy0wMTA3VFgKLQkJMTE4NiAxMzAwICBERkUtNTM4VFgKLQkJMTE4NiAxMzIwICBTTjUyMDAKLQkJMTE4NiA4MTM5ICBEUk4tMzJUWAotCQkxMWY2IDgxMzkgIEZOMjItMyhBKSBMaW54UFJPIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTI1OSAyNTAwICBBVC0yNTAwVFgKLQkJMTI1OSAyNTAzICBBVC0yNTAwVFgvQUNQSQotCQkxNDI5IGQwMTAgIE5EMDEwCi0JCTE0MzIgOTEzMCAgRU4tOTEzMFRYCi0JCTE0MzYgODEzOSAgUlQ4MTM5Ci0JCTE0NTggZTAwMCAgR0EtN1ZNNDAwTS83VlQ2MDAgTW90aGVyYm9hcmQKLQkJMTQ2YyAxNDM5ICBGRS0xNDM5VFgKLQkJMTQ4OSA2MDAxICBHRjEwMFRYUklJCi0JCTE0ODkgNjAwMiAgR0YxMDBUWFJBCi0JCTE0OWMgMTM5YSAgTEZFLTgxMzlBVFgKLQkJMTQ5YyA4MTM5ICBMRkUtODEzOVRYCi0JCTE0Y2IgMDIwMCAgTE5SLTEwMCBGYW1pbHkgMTAvMTAwIEJhc2UtVFggRXRoZXJuZXQKLQkJMTc5OSA1MDAwICBGNUQ1MDAwIFBDSSBDYXJkL0Rlc2t0b3AgTmV0d29yayBQQ0kgQ2FyZAotCQkyNjQ2IDAwMDEgIEV0aGVSeAotCQk4ZTJlIDcwMDAgIEtGLTIzMFRYCi0JCThlMmUgNzEwMCAgS0YtMjMwVFgvMgotCQlhMGEwIDAwMDcgIEFMTi0zMjVDCi0JODE2OSAgUlRMLTgxNjkgR2lnYWJpdCBFdGhlcm5ldAotCQkxMjU5IGMxMDcgIENHLUxBUENJR1QKLQkJMTM3MSA0MzRlICBQcm9HLTIwMDBMCi0JCTE0NTggZTAwMCAgR0EtSzhWVDgwMCBQcm8gTW90aGVyYm9hcmQKLQkJMTQ2MiA3MDJjICBLOFQgTkVPIDIgbW90aGVyYm9hcmQKLQk4MTgwICBSVEw4MTgwTCA4MDIuMTFiIE1BQwotCTgxOTcgIFNtYXJ0TEFONTYgNTZLIE1vZGVtCi0xMGVkICBBc2NpaSBDb3Jwb3JhdGlvbgotCTczMTAgIFY3MzEwCi0xMGVlICBYaWxpbnggQ29ycG9yYXRpb24KLQkzZmMwICBSTUUgRGlnaTk2Ci0JM2ZjMSAgUk1FIERpZ2k5Ni84Ci0JM2ZjMiAgUk1FIERpZ2k5Ni84IFBybwotCTNmYzMgIFJNRSBEaWdpOTYvOCBQYWQKLQkzZmM0ICBSTUUgRGlnaTk2NTIgKEhhbW1lcmZhbGwpCi0JM2ZjNSAgUk1FIEhhbW1lcmZhbGwgRFNQCi0JM2ZjNiAgUk1FIEhhbW1lcmZhbGwgRFNQIE1BREkKLQk4MzgxICBFbGxpcHMgU2FudG9zIEZyYW1lIEdyYWJiZXIKLTEwZWYgIFJhY29yZSBDb21wdXRlciBQcm9kdWN0cywgSW5jLgotCTgxNTQgIE04MTV4IFRva2VuIFJpbmcgQWRhcHRlcgotMTBmMCAgUGVyaXRlayBDb3Jwb3JhdGlvbgotMTBmMSAgVHlhbiBDb21wdXRlcgotMTBmMiAgQWNobWUgQ29tcHV0ZXIsIEluYy4KLTEwZjMgIEFsYXJpcywgSW5jLgotMTBmNCAgUy1NT1MgU3lzdGVtcywgSW5jLgotMTBmNSAgTktLIENvcnBvcmF0aW9uCi0JYTAwMSAgTkRSNDAwMCBbTlI0NjAwIEJyaWRnZV0KLTEwZjYgIENyZWF0aXZlIEVsZWN0cm9uaWMgU3lzdGVtcyBTQQotMTBmNyAgTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgotMTBmOCAgQWx0b3MgSW5kaWEgTHRkCi0xMGY5ICBQQyBEaXJlY3QKLTEwZmEgIFRydWV2aXNpb24KLQkwMDBjICBUQVJHQSAxMDAwCi0xMGZiICBUaGVzeXMgR2VzZWxsc2NoYWZ0IGb8ciBNaWtyb2VsZWt0cm9uaWsgbWJICi0JMTg2ZiAgVEggNjI1NQotMTBmYyAgSS1PIERhdGEgRGV2aWNlLCBJbmMuCi0jIFdoYXQncyBpbiB0aGUgY2FyZGJ1cyBlbmQgb2YgYSBTb255IEFDUi1BMDEgY2FyZCwgY29tZXMgd2l0aCBuZXdlciBWYWlvIENELVJXIGRyaXZlcwotCTAwMDMgIENhcmRidXMgSURFIENvbnRyb2xsZXIKLQkwMDA1ICBDYXJkYnVzIFNDU0kgQ0JTQyBJSQotMTBmZCAgU295byBDb21wdXRlciwgSW5jCi0xMGZlICBGYXN0IE11bHRpbWVkaWEgQUcKLTEwZmYgIE5DdWJlCi0xMTAwICBKYXp6IE11bHRpbWVkaWEKLTExMDEgIEluaXRpbyBDb3Jwb3JhdGlvbgotCTEwNjAgIElOSS1BMTAwVTJXCi0JOTEwMCAgSU5JLTkxMDAvOTEwMFcKLQk5NDAwICBJTkktOTQwCi0JOTQwMSAgSU5JLTk1MAotCTk1MDAgIDM2MFAKLQk5NTAyICBJbml0aW8gSU5JLTkxMDBVVyBVbHRyYSBXaWRlIFNDU0kgQ29udHJvbGxlciBJTklDLTk1MFAgY2hpcAotMTEwMiAgQ3JlYXRpdmUgTGFicwotCTAwMDIgIFNCIExpdmUhIEVNVTEwazEKLQkJMTEwMiAwMDIwICBDVDQ4NTAgU0JMaXZlISBWYWx1ZQotCQkxMTAyIDAwMjEgIENUNDYyMCBTQkxpdmUhCi0JCTExMDIgMDAyZiAgU0JMaXZlISBtYWluYm9hcmQgaW1wbGVtZW50YXRpb24KLQkJMTEwMiA0MDAxICBFLW11IEFQUwotCQkxMTAyIDgwMjIgIENUNDc4MCBTQkxpdmUhIFZhbHVlCi0JCTExMDIgODAyMyAgQ1Q0NzkwIFNvdW5kQmxhc3RlciBQQ0k1MTIKLQkJMTEwMiA4MDI0ICBDVDQ3NjAgU0JMaXZlIQotCQkxMTAyIDgwMjUgIFNCTGl2ZSEgTWFpbmJvYXJkIEltcGxlbWVudGF0aW9uCi0JCTExMDIgODAyNiAgQ1Q0ODMwIFNCTGl2ZSEgVmFsdWUKLQkJMTEwMiA4MDI3ICBDVDQ4MzIgU0JMaXZlISBWYWx1ZQotCQkxMTAyIDgwMjggIENUNDc2MCBTQkxpdmUhIE9FTSB2ZXJzaW9uCi0JCTExMDIgODAzMSAgQ1Q0ODMxIFNCTGl2ZSEgVmFsdWUKLQkJMTEwMiA4MDQwICBDVDQ3NjAgU0JMaXZlIQotCQkxMTAyIDgwNTEgIENUNDg1MCBTQkxpdmUhIFZhbHVlCi0JCTExMDIgODA2MSAgU0JMaXZlISBQbGF5ZXIgNS4xCi0JCTExMDIgODA2NCAgU0IgTGl2ZSEgNS4xIE1vZGVsIFNCMDEwMAotCQkxMTAyIDgwNjUgIFNCTGl2ZSEgNS4xIERpZ2l0YWwgTW9kZWwgU0IwMjIwCi0JCTExMDIgODA2NyAgU0JMaXZlISA1LjEgZU1pY3JvIDI4MDI4Ci0JMDAwNCAgU0IgQXVkaWd5Ci0JCTExMDIgMDA1MSAgU0IwMDkwIEF1ZGlneSBQbGF5ZXIKLQkJMTEwMiAwMDUzICBTQjAwOTAgQXVkaWd5IFBsYXllci9PRU0KLQkJMTEwMiAwMDU4ICBTQjAwOTAgQXVkaWd5IFBsYXllci9PRU0KLQkJMTEwMiAxMDA3ICBTQjAyNDAgQXVkaWd5IDIgUGxhdGludW0gNi4xCi0JCTExMDIgMjAwMiAgU0IgQXVkaWd5IDIgWlMgKFNCMDM1MCkKLQkwMDA2ICBbU0IgTGl2ZSEgVmFsdWVdIEVNVTEwazFYCi0JMDAwNyAgU0IgQXVkaWd5IExTCi0JCTExMDIgMTAwMSAgU0IwMzEwIEF1ZGlneSBMUwotCQkxMTAyIDEwMDIgIFNCMDMxMiBBdWRpZ3kgTFMKLQkJMTEwMiAxMDA2ICBTQjA0MTAgU0JMaXZlISAyNC1iaXQKLQkwMDA4ICBTQjA0MDAgQXVkaWd5MiBWYWx1ZQotCTQwMDEgIFNCIEF1ZGlneSBGaXJlV2lyZSBQb3J0Ci0JCTExMDIgMDAxMCAgU0IgQXVkaWd5IEZpcmVXaXJlIFBvcnQKLQk3MDAyICBTQiBMaXZlISBNSURJL0dhbWUgUG9ydAotCQkxMTAyIDAwMjAgIEdhbWVwb3J0IEpveXN0aWNrCi0JNzAwMyAgU0IgQXVkaWd5IE1JREkvR2FtZSBwb3J0Ci0JCTExMDIgMDA0MCAgU0IgQXVkaWd5IE1JREkvR2FtZSBQb3J0Ci0JNzAwNCAgW1NCIExpdmUhIFZhbHVlXSBJbnB1dCBkZXZpY2UgY29udHJvbGxlcgotCTcwMDUgIFNCIEF1ZGlneSBMUyBNSURJL0dhbWUgcG9ydAotCQkxMTAyIDEwMDEgIFNCMDMxMCBBdWRpZ3kgTFMgTUlESS9HYW1lIHBvcnQKLQkJMTEwMiAxMDAyICBTQjAzMTIgQXVkaWd5IExTIE1JREkvR2FtZSBwb3J0Ci0JODA2NCAgU0IwMTAwIFtTQkxpdmUhIDUuMSBPRU1dCi0JODkzOCAgRWN0aXZhIEVWMTkzOAotCQkxMDMzIDgwZTUgIFNsaW1Ub3dlci1KaW0gKE5FQykKLQkJMTA3MSA3MTUwICBNaXRhYyA3MTUwCi0JCTExMGEgNTkzOCAgU2llbWVucyBTY2VuaWMgTW9iaWxlIDUxMFBJSUkKLQkJMTNiZCAxMDBjICBDZXJlcy1DIChTaGFycCwgSW50ZWwgQlgpCi0JCTEzYmQgMTAwZCAgU2hhcnAsIEludGVsIEJhbmlzdGVyCi0JCTEzYmQgMTAwZSAgVHdpbkhlYWQgUDA5Uy9QMDlTMyAoU2hhcnApCi0JCTEzYmQgZjZmMSAgTWFybGluIChTaGFycCkKLQkJMTRmZiAwZTcwICBQODhURSAoVFdJTkhFQUQgSU5URVJOQVRJT05BTCBDb3JwKQotCQkxNGZmIGM0MDEgIE5vdGVib29rIDkxMDAvOTIwMC8yMDAwIChUV0lOSEVBRCBJTlRFUk5BVElPTkFMIENvcnApCi0JCTE1NmQgYjQwMCAgRzQwMCAtIEdlbyAoQWxwaGFUb3AgKFRhaXdhbikpCi0JCTE1NmQgYjU1MCAgRzU2MCAgKEFscGhhVG9wIChUYWl3YW4pKQotCQkxNTZkIGI1NjAgIEc1NjAgIChBbHBoYVRvcCAoVGFpd2FuKSkKLQkJMTU2ZCBiNzAwICBHNzAwL1U3MDAgIChBbHBoYVRvcCAoVGFpd2FuKSkKLQkJMTU2ZCBiNzk1ICBHNzk1ICAoQWxwaGFUb3AgKFRhaXdhbikpCi0JCTE1NmQgYjc5NyAgRzc5NyAgKEFscGhhVG9wIChUYWl3YW4pKQotMTEwMyAgVHJpb25lcyBUZWNobm9sb2dpZXMsIEluYy4KLQkwMDAzICBIUFQzNDMKLQkwMDA0ICBIUFQzNjYvMzY4LzM3MC8zNzBBLzM3Mi8zNzJOCi0JCTExMDMgMDAwMSAgSFBUMzcwQQotCQkxMTAzIDAwMDMgIEhQVDM0MyAvIEhQVDM0NSAvIEhQVDM2MyBVRE1BMzMKLQkJMTEwMyAwMDA0ICBIUFQzNjYgVURNQTY2IChyMSkgLyBIUFQzNjggVURNQTY2IChyMikgLyBIUFQzNzAgVURNQTEwMCAocjMpIC8gSFBUMzcwIFVETUExMDAgUkFJRCAocjQpCi0JCTExMDMgMDAwNSAgSFBUMzcwIFVETUExMDAKLQkJMTEwMyAwMDA2ICBIUFQzMDIKLQkJMTEwMyAwMDA3ICBIUFQzNzEgVURNQTEzMwotCQkxMTAzIDAwMDggIEhQVDM3NCBVRE1BL0FUQTEzMyBSQUlEIENvbnRyb2xsZXIKLQkwMDA1ICBIUFQzNzJBLzM3Mk4KLQkwMDA2ICBIUFQzMDIKLQkwMDA3ICBIUFQzNzEvMzcxTgotCTAwMDggIEhQVDM3NAotCTAwMDkgIEhQVDM3Mk4KLTExMDQgIFJhc3Rlck9wcyBDb3JwLgotMTEwNSAgU2lnbWEgRGVzaWducywgSW5jLgotCTExMDUgIFJFQUxtYWdpYyBYY2FyZCBNUEVHIDEvMi8zLzQgRFZEIERlY29kZXIKLQk4MzAwICBSRUFMbWFnaWMgSG9sbHl3b29kIFBsdXMgRFZEIERlY29kZXIKLQk4NDAwICBFTTg0MHggUkVBTG1hZ2ljIERWRC9NUEVHLTIgQXVkaW8vVmlkZW8gRGVjb2RlcgotCTg0MDEgIEVNODQwMSBSRUFMbWFnaWMgRFZEL01QRUctMiBBL1YgRGVjb2RlcgotCTg0NzAgIEVNODQ3MCBSRUFMbWFnaWMgRFZEL01QRUctNCBBL1YgRGVjb2RlcgotCTg0NzEgIEVNODQ3MSBSRUFMbWFnaWMgRFZEL01QRUctNCBBL1YgRGVjb2RlcgotCTg0NzUgIEVNODQ3NSBSRUFMbWFnaWMgRFZEL01QRUctNCBBL1YgRGVjb2RlcgotCTg0NzYgIEVNODQ3NiBSRUFMbWFnaWMgRFZEL01QRUctNCBBL1YgRGVjb2RlcgotCTg0ODUgIEVNODQ4NSBSRUFMbWFnaWMgRFZEL01QRUctNCBBL1YgRGVjb2RlcgotCTg0ODYgIEVNODQ4NiBSRUFMbWFnaWMgRFZEL01QRUctNCBBL1YgRGVjb2RlcgotMTEwNiAgVklBIFRlY2hub2xvZ2llcywgSW5jLgotCTAxMDIgIEVtYmVkZGVkIFZJQSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDEzMCAgVlQ2MzA1IDEzOTQuQSBDb250cm9sbGVyCi0JMDMwNSAgVlQ4MzYzLzgzNjUgW0tUMTMzL0tNMTMzXQotCQkxMDQzIDgwMzMgIEE3ViBNYWluYm9hcmQKLQkJMTA0MyA4MDNlICBBN1YtRSBNYWluYm9hcmQKLQkJMTA0MyA4MDQyICBBN1YxMzMvQTdWMTMzLUMgTWFpbmJvYXJkCi0JCTE0N2IgYTQwMSAgS1Q3L0tUNy1SQUlEL0tUN0EvS1Q3QS1SQUlEIE1haW5ib2FyZAotCTAzOTEgIFZUODM3MSBbS1gxMzNdCi0JMDUwMSAgVlQ4NTAxIFtBcG9sbG8gTVZQNF0KLQkwNTA1ICBWVDgyQzUwNQotIyBTaGFyZXMgY2hpcCB3aXRoIDowNTc2LiBUaGUgVlQ4MkM1NzZNIGhhcyA6MTU3MSBpbnN0ZWFkIG9mIDowNTYxLgotCTA1NjEgIFZUODJDNTc2TVYKLQkwNTcxICBWVDgyQzU4NkEvQi9WVDgyQzY4Ni9BL0IvVlQ4MjN4L0EvQyBQSVBDIEJ1cyBNYXN0ZXIgSURFCi0JCTEwMTkgMDk4NSAgUDZWWEEgTW90aGVyYm9hcmQKLQkJMTAxOSAwYTgxICBMN1ZUQSB2MS4wIE1vdGhlcmJvYXJkIChLVDQwMC04MjM1KQotCQkxMDQzIDgwNTIgIFZUODIzM0EgQnVzIE1hc3RlciBBVEExMDAvNjYvMzMgSURFCi0JCTEwNDMgODA4YyAgQTdWOFggbW90aGVyYm9hcmQKLQkJMTA0MyA4MGExICBBN1Y4WC1YIG1vdGhlcmJvYXJkIHJldi4gMS4wMQotCQkxMDQzIDgwZWQgIEE3VjYwMCBtb3RoZXJib2FyZAotCQkxMTA2IDA1NzEgIFZUODJDNTg2L0IvVlQ4MkM2ODYvQS9CL1ZUODIzMy9BL0MvVlQ4MjM1IFBJUEMgQnVzIE1hc3RlciBJREUKLQkJMTE3OSAwMDAxICBNYWduaWEgWjMxMAotCQkxMjk3IGY2NDEgIEZYNDEgbW90aGVyYm9hcmQKLQkJMTQ1OCA1MDAyICBHQS03VkFYIE1haW5ib2FyZAotCQkxNDYyIDcwMjAgIEs4VCBORU8gMiBtb3RoZXJib2FyZAotCQkxNDdiIDE0MDcgIEtWOC1NQVgzIG1vdGhlcmJvYXJkCi0JCTE4NDkgMDU3MSAgSzdWVDIgbW90aGVyYm9hcmQKLQkwNTc2ICBWVDgyQzU3NiAzViBbQXBvbGxvIE1hc3Rlcl0KLQkwNTg1ICBWVDgyQzU4NVZQIFtBcG9sbG8gVlAxL1ZQWF0KLQkwNTg2ICBWVDgyQzU4Ni9BL0IgUENJLXRvLUlTQSBbQXBvbGxvIFZQXQotCQkxMTA2IDAwMDAgIE1WUDMgSVNBIEJyaWRnZQotCTA1OTUgIFZUODJDNTk1IFtBcG9sbG8gVlAyXQotCTA1OTYgIFZUODJDNTk2IElTQSBbTW9iaWxlIFNvdXRoXQotCQkxMTA2IDAwMDAgIFZUODJDNTk2L0EvQiBQQ0kgdG8gSVNBIEJyaWRnZQotCQkxNDU4IDA1OTYgIFZUODJDNTk2L0EvQiBQQ0kgdG8gSVNBIEJyaWRnZQotCTA1OTcgIFZUODJDNTk3IFtBcG9sbG8gVlAzXQotCTA1OTggIFZUODJDNTk4IFtBcG9sbG8gTVZQM10KLQkwNjAxICBWVDg2MDEgW0Fwb2xsbyBQcm9NZWRpYV0KLQkwNjA1ICBWVDg2MDUgW1Byb1NhdmFnZSBQTTEzM10KLQkJMTA0MyA4MDJjICBDVVY0WCBtYWluYm9hcmQKLQkwNjgwICBWVDgyQzY4MCBbQXBvbGxvIFA2XQotCTA2ODYgIFZUODJDNjg2IFtBcG9sbG8gU3VwZXIgU291dGhdCi0JCTEwMTkgMDk4NSAgUDZWWEEgTW90aGVyYm9hcmQKLQkJMTA0MyA4MDJjICBDVVY0WCBtYWluYm9hcmQKLQkJMTA0MyA4MDMzICBBN1YgTWFpbmJvYXJkCi0JCTEwNDMgODAzZSAgQTdWLUUgTWFpbmJvYXJkCi0JCTEwNDMgODA0MCAgQTdNMjY2IE1haW5ib2FyZAotCQkxMDQzIDgwNDIgIEE3VjEzMy9BN1YxMzMtQyBNYWluYm9hcmQKLQkJMTEwNiAwMDAwICBWVDgyQzY4Ni9BIFBDSSB0byBJU0EgQnJpZGdlCi0JCTExMDYgMDY4NiAgVlQ4MkM2ODYvQSBQQ0kgdG8gSVNBIEJyaWRnZQotCQkxMTc5IDAwMDEgIE1hZ25pYSBaMzEwCi0JCTE0N2IgYTcwMiAgS0c3LUxpdGUgTWFpbmJvYXJkCi0JMDY5MSAgVlQ4MkM2OTNBLzY5NHggW0Fwb2xsbyBQUk8xMzN4XQotCQkxMDE5IDA5ODUgIFA2VlhBIE1vdGhlcmJvYXJkCi0JCTExNzkgMDAwMSAgTWFnbmlhIFozMTAKLQkJMTQ1OCAwNjkxICBWVDgyQzY5MSBBcG9sbG8gUHJvIFN5c3RlbSBDb250cm9sbGVyCi0JMDY5MyAgVlQ4MkM2OTMgW0Fwb2xsbyBQcm8gUGx1c10KLQkwNjk4ICBWVDgyQzY5M0EgW0Fwb2xsbyBQcm8xMzMgQUdQXQotCTA5MjYgIFZUODJDOTI2IFtBbWF6b25dCi0JMTAwMCAgVlQ4MkM1NzBNVgotCTExMDYgIFZUODJDNTcwTVYKLQkxNTcxICBWVDgyQzU3Nk0vVlQ4MkM1ODYKLQkxNTk1ICBWVDgyQzU5NS85NyBbQXBvbGxvIFZQMi85N10KLQkzMDIyICBDTEUyNjYKLSMgVGhpcyBpcyAqbm90KiBVU0IgMi4wIGFzIHRoZSBleGlzdGluZyBlbnRyeSBzdWdnZXN0cwotCTMwMzggIFZUODJ4eHh4eCBVSENJIFVTQiAxLjEgQ29udHJvbGxlcgotCQkwOTI1IDEyMzQgIFVTQiBDb250cm9sbGVyCi0JCTEwMTkgMDk4NSAgUDZWWEEgTW90aGVyYm9hcmQKLQkJMTAxOSAwYTgxICBMN1ZUQSB2MS4wIE1vdGhlcmJvYXJkIChLVDQwMC04MjM1KQotCQkxMDQzIDgwOGMgIFZUNjIwMiBVU0IyLjAgNCBwb3J0IGNvbnRyb2xsZXIKLQkJMTA0MyA4MGExICBBN1Y4WC1YIG1vdGhlcmJvYXJkCi0JCTEwNDMgODBlZCAgQTdWNjAwIG1vdGhlcmJvYXJkCi0JCTExNzkgMDAwMSAgTWFnbmlhIFozMTAKLQkJMTQ1OCA1MDA0ICBHQS03VkFYIE1haW5ib2FyZAotCQkxNDYyIDcwMjAgIEs4VCBORU8gMiBtb3RoZXJib2FyZAotCQkxNDdiIDE0MDcgIEtWOC1NQVgzIG1vdGhlcmJvYXJkCi0JCTE4MmQgMjAxZCAgQ04tMDI5IFVTQjIuMCA0IHBvcnQgUENJIENhcmQKLQkzMDQwICBWVDgyQzU4NkIgQUNQSQotCTMwNDMgIFZUODZDMTAwQSBbUmhpbmVdCi0JCTEwYmQgMDAwMCAgVlQ4NkMxMDBBIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMTA2IDAxMDAgIFZUODZDMTAwQSBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTE4NiAxNDAwICBERkUtNTMwVFggcmV2IEEKLQkzMDQ0ICBJRUVFIDEzOTQgSG9zdCBDb250cm9sbGVyCi0JCTEwMjUgMDA1YSAgVHJhdmVsTWF0ZSAyOTAKLQkJMTQ1OCAxMDAwICBHQS03VlQ2MDAtMTM5NCBNb3RoZXJib2FyZAotCQkxNDYyIDcwMmQgIEs4VCBORU8gMiBtb3RoZXJib2FyZAotCTMwNTAgIFZUODJDNTk2IFBvd2VyIE1hbmFnZW1lbnQKLQkzMDUxICBWVDgyQzU5NiBQb3dlciBNYW5hZ2VtZW50Ci0JMzA1MyAgVlQ2MTA1TSBbUmhpbmUtSUlJXQotCTMwNTcgIFZUODJDNjg2IFtBcG9sbG8gU3VwZXIgQUNQSV0KLQkJMTAxOSAwOTg1ICBQNlZYQSBNb3RoZXJib2FyZAotCQkxMDQzIDgwMzMgIEE3ViBNYWluYm9hcmQKLQkJMTA0MyA4MDNlICBBN1YtRSBNYWluYm9hcmQKLQkJMTA0MyA4MDQwICBBN00yNjYgTWFpbmJvYXJkCi0JCTEwNDMgODA0MiAgQTdWMTMzL0E3VjEzMy1DIE1haW5ib2FyZAotCQkxMTc5IDAwMDEgIE1hZ25pYSBaMzEwCi0JMzA1OCAgVlQ4MkM2ODYgQUM5NyBBdWRpbyBDb250cm9sbGVyCi0JCTBlMTEgMDA5NyAgU291bmRNYXggRGlnaXRhbCBJbnRlZ3JhdGVkIEF1ZGlvCi0JCTBlMTEgYjE5NCAgU291bmRtYXggaW50ZWdyYXRlZCBkaWdpdGFsIGF1ZGlvCi0JCTEwMTkgMDk4NSAgUDZWWEEgTW90aGVyYm9hcmQKLQkJMTA0MyAxMTA2ICBBN1YxMzMvQTdWMTMzLUMgTWFpbmJvYXJkCi0JCTExMDYgNDUxMSAgT25ib2FyZCBBdWRpbyBvbiBFUDdLWEEKLQkJMTQ1OCA3NjAwICBPbmJvYXJkIEF1ZGlvCi0JCTE0NjIgMzA5MSAgTVMtNjMwOSBPbmJvYXJkIEF1ZGlvCi0JCTE0NjIgMzMwMCAgTVMtNjMzMCBPbmJvYXJkIEF1ZGlvCi0JCTE1ZGQgNzYwOSAgT25ib2FyZCBBdWRpbwotCTMwNTkgIFZUODIzMy9BLzgyMzUvODIzNyBBQzk3IEF1ZGlvIENvbnRyb2xsZXIKLQkJMTAxOSAwYTgxICBMN1ZUQSB2MS4wIE1vdGhlcmJvYXJkIChLVDQwMC04MjM1KQotCQkxMDQzIDgwOTUgIEE3VjhYIE1vdGhlcmJvYXJkIChSZWFsdGVrIEFMQzY1MCBjb2RlYykKLQkJMTA0MyA4MGExICBBN1Y4WC1YIE1vdGhlcmJvYXJkCi0JCTEwNDMgODBiMCAgQTdWNjAwL0s4ViBEZWx1eGUgbW90aGVyYm9hcmQgKEFESSBBRDE5ODAgY29kZWMgW1NvdW5kTUFYXSkKLQkJMTEwNiAzMDU5ICBMN1ZNTTIgTW90aGVyYm9hcmQKLQkJMTEwNiA0MTYxICBLN1ZUMiBtb3RoZXJib2FyZAotCQkxMjk3IGMxNjAgIEZYNDEgbW90aGVyYm9hcmQgKFJlYWx0ZWsgQUxDNjUwIGNvZGVjKQotCQkxNDU4IGEwMDIgIEdBLTdWQVggT25ib2FyZCBBdWRpbyAoUmVhbHRlayBBTEM2NTApCi0JCTE0NjIgMDA4MCAgSzhUIE5FTyAyIG1vdGhlcmJvYXJkCi0JCTE0NjIgMzgwMCAgS1QyNjYgb25ib2FyZCBhdWRpbwotCQkxNDdiIDE0MDcgIEtWOC1NQVgzIG1vdGhlcmJvYXJkCi0JMzA2NSAgVlQ2MTAyIFtSaGluZS1JSV0KLQkJMTA0MyA4MGExICBBN1Y4WC1YIE1vdGhlcmJvYXJkCi0JCTExMDYgMDEwMiAgVlQ2MTAyIFtSaGluZSBJSV0gRW1iZWRlZCBFdGhlcm5ldCBDb250cm9sbGVyIG9uIFZUODIzNQotCQkxMTg2IDE0MDAgIERGRS01MzBUWCByZXYgQQotCQkxMTg2IDE0MDEgIERGRS01MzBUWCByZXYgQgotCQkxM2I5IDE0MjEgIExELTEwLzEwMEFMIFBDSSBGYXN0IEV0aGVybmV0IEFkYXB0ZXIgKHJldi5CKQotIyBUaGlzIGhvc3RzIG1vcmUgdGhhbiBqdXN0IHRoZSBJbnRlbCA1MzcgY29kZWMsIGl0IGFsc28gaG9zdHMgUEN0ZWwgKFNJTDMzKSBhbmQgU21hcnRMaW5rIChTSUwzNCkgY29kZWNzCi0JMzA2OCAgQUMnOTcgTW9kZW0gQ29udHJvbGxlcgotCQkxNDYyIDMwOWUgIE1TLTYzMDkgU2F0dXJuIE1vdGhlcmJvYXJkCi0JMzA3NCAgVlQ4MjMzIFBDSSB0byBJU0EgQnJpZGdlCi0JCTEwNDMgODA1MiAgVlQ4MjMzQQotCTMwOTEgIFZUODYzMyBbQXBvbGxvIFBybzI2Nl0KLQkzMDk5ICBWVDgzNjYvQS83IFtBcG9sbG8gS1QyNjYvQS8zMzNdCi0JCTEwNDMgODA2NCAgQTdWMjY2LUUgTWFpbmJvYXJkCi0JCTEwNDMgODA3ZiAgQTdWMzMzIE1haW5ib2FyZAotCQkxODQ5IDMwOTkgIEs3VlQyIG1vdGhlcmJvYXJkCi0JMzEwMSAgVlQ4NjUzIEhvc3QgQnJpZGdlCi0JMzEwMiAgVlQ4NjYyIEhvc3QgQnJpZGdlCi0JMzEwMyAgVlQ4NjE1IEhvc3QgQnJpZGdlCi0JMzEwNCAgVVNCIDIuMAotCQkxMDE5IDBhODEgIEw3VlRBIHYxLjAgTW90aGVyYm9hcmQgKEtUNDAwLTgyMzUpCi0JCTEwNDMgODA4YyAgQTdWOFggbW90aGVyYm9hcmQKLQkJMTA0MyA4MGExICBBN1Y4WC1YIG1vdGhlcmJvYXJkIHJldiAxLjAxCi0JCTEwNDMgODBlZCAgQTdWNjAwIG1vdGhlcmJvYXJkCi0JCTEyOTcgZjY0MSAgRlg0MSBtb3RoZXJib2FyZAotCQkxNDU4IDUwMDQgIEdBLTdWQVggTWFpbmJvYXJkCi0JCTE0NjIgNzAyMCAgSzhUIE5FTyAyIG1vdGhlcmJvYXJkCi0JCTE0N2IgMTQwNyAgS1Y4LU1BWDMgbW90aGVyYm9hcmQKLQkJMTgyZCAyMDFkICBDTi0wMjkgVVNCIDIuMCA0IHBvcnQgUENJIENhcmQKLQkzMTA2ICBWVDYxMDUgW1JoaW5lLUlJSV0KLQkJMTE4NiAxNDAzICBERkUtNTMwVFggcmV2IEMKLQkzMTA4ICBTMyBVbmljaHJvbWUgUHJvIFZHQSBBZGFwdGVyCi0JMzEwOSAgVlQ4MjMzQyBQQ0kgdG8gSVNBIEJyaWRnZQotCTMxMTIgIFZUODM2MSBbS0xFMTMzXSBIb3N0IEJyaWRnZQotCTMxMTYgIFZUODM3NSBbS00yNjYvS0wyNjZdIEhvc3QgQnJpZGdlCi0JCTEyOTcgZjY0MSAgRlg0MSBtb3RoZXJib2FyZAotCTMxMTggIFMzIFVuaWNocm9tZSBQcm8gVkdBIEFkYXB0ZXIKLQkzMTE5ICBWVDYxMjAvVlQ2MTIxL1ZUNjEyMiBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKLSMgZm91bmQgb24gRVBJQSBNNjAwMC85MDAwIG1haW5ib2FyZAotCTMxMjIgIFZUODYyMyBbQXBvbGxvIENMRTI2Nl0gaW50ZWdyYXRlZCBDYXN0bGVSb2NrIGdyYXBoaWNzCi0jIGZvdW5kIG9uIEVQSUEgTTYwMDAvOTAwMCBtYWluYm9hcmQKLQkzMTIzICBWVDg2MjMgW0Fwb2xsbyBDTEUyNjZdCi0JMzEyOCAgVlQ4NzUzIFtQNFgyNjYgQUdQXQotCTMxMzMgIFZUMzEzMyBIb3N0IEJyaWRnZQotCTMxNDcgIFZUODIzM0EgSVNBIEJyaWRnZQotCTMxNDggIFA0TTI2NiBIb3N0IEJyaWRnZQotCTMxNDkgIFZJQSBWVDY0MjAgU0FUQSBSQUlEIENvbnRyb2xsZXIKLQkJMTA0MyA4MGVkICBBN1Y2MDAvSzhWIERlbHV4ZSBtb3RoZXJib2FyZAotCQkxNDU4IGIwMDMgIEdBLTdWTTQwMEFNKEYpIE1vdGhlcmJvYXJkCi0JCTE0NjIgNzAyMCAgSzhUIE5lbyAyIE1vdGhlcmJvYXJkCi0JCTE0N2IgMTQwNyAgS1Y4LU1BWDMgbW90aGVyYm9hcmQKLQkzMTU2ICBQL0tOMjY2IEhvc3QgQnJpZGdlCi0jIG9uIEFTVVMgUDRQODAwCi0JMzE2NCAgVlQ2NDEwIEFUQTEzMyBSQUlEIGNvbnRyb2xsZXIKLQkzMTY4ICBWVDgzNzQgUDRYNDAwIEhvc3QgQ29udHJvbGxlci9BR1AgQnJpZGdlCi0JMzE3NyAgVlQ4MjM1IElTQSBCcmlkZ2UKLQkJMTAxOSAwYTgxICBMN1ZUQSB2MS4wIE1vdGhlcmJvYXJkIChLVDQwMC04MjM1KQotCQkxMDQzIDgwOGMgIEE3VjhYIG1vdGhlcmJvYXJkCi0JCTEwNDMgODBhMSAgQTdWOFgtWCBtb3RoZXJib2FyZAotCQkxMjk3IGY2NDEgIEZYNDEgbW90aGVyYm9hcmQKLQkJMTQ1OCA1MDAxICBHQS03VkFYIE1haW5ib2FyZAotCQkxODQ5IDMxNzcgIEs3VlQyIG1vdGhlcmJvYXJkCi0JMzE3OCAgUHJvU2F2YWdlRERSIFA0TjMzMyBIb3N0IEJyaWRnZQotCTMxODggIFZUODM4NSBbSzhUODAwIEFHUF0gSG9zdCBCcmlkZ2UKLQkJMTA0MyA4MGEzICBLOFYgRGVsdXhlIG1vdGhlcmJvYXJkCi0JCTE0N2IgMTQwNyAgS1Y4LU1BWDMgbW90aGVyYm9hcmQKLQkzMTg5ICBWVDgzNzcgW0tUNDAwL0tUNjAwIEFHUF0gSG9zdCBCcmlkZ2UKLQkJMTA0MyA4MDdmICBBN1Y4WCBtb3RoZXJib2FyZAotCQkxNDU4IDUwMDAgIEdBLTdWQVggTWFpbmJvYXJkCi0JMzIwNCAgSzhNODAwCi0JMzIwNSAgVlQ4Mzc4IFtLTTQwMC9BXSBDaGlwc2V0IEhvc3QgQnJpZGdlCi0JCTE0NTggNTAwMCAgR0EtN1ZNNDAwTSBNb3RoZXJib2FyZAotCTMyMTggIEs4VDgwME0gSG9zdCBCcmlkZ2UKLQkzMjI3ICBWVDgyMzcgSVNBIGJyaWRnZSBbS1Q2MDAvSzhUODAwIFNvdXRoXQotCQkxMDQzIDgwZWQgIEE3VjYwMCBtb3RoZXJib2FyZAotCQkxMTA2IDMyMjcgIERGSSBLVDYwMC1BTCBNb3RoZXJib2FyZAotCQkxNDU4IDUwMDEgIEdBLTdWVDYwMCBNb3RoZXJib2FyZAotCQkxNDdiIDE0MDcgIEtWOC1NQVgzIG1vdGhlcmJvYXJkCi0JMzI0OSAgVlQ2NDIxIElERSBSQUlEIENvbnRyb2xsZXIKLQk0MTQ5ICBWSUEgVlQ2NDIwIChBVEExMzMpIENvbnRyb2xsZXIKLQk1MDMwICBWVDgyQzU5NiBBQ1BJIFtBcG9sbG8gUFJPXQotCTYxMDAgIFZUODVDMTAwQSBbUmhpbmUgSUldCi0JNzIwNCAgSzhNODAwCi0jIFMzIEdyYXBoaWNzIFVuaUNocm9tZeKEoiAyRC8zRCBHcmFwaGljcyB3aXRoIG1vdGlvbiBjb21wZW5zYXRpb24KLQk3MjA1ICBWVDgzNzggW1MzIFVuaUNocm9tZV0gSW50ZWdyYXRlZCBWaWRlbwotCQkxNDU4IGQwMDAgIEdpZ2FieXRlIEdBLTdWTTQwMChBKU0oRikgTW90aGVyYm9hcmQKLQk4MjMxICBWVDgyMzEgW1BDSS10by1JU0EgQnJpZGdlXQotCTgyMzUgIFZUODIzNSBBQ1BJCi0JODMwNSAgVlQ4MzYzLzgzNjUgW0tUMTMzL0tNMTMzIEFHUF0KLQk4MzkxICBWVDgzNzEgW0tYMTMzIEFHUF0KLQk4NTAxICBWVDg1MDEgW0Fwb2xsbyBNVlA0IEFHUF0KLQk4NTk2ICBWVDgyQzU5NiBbQXBvbGxvIFBSTyBBR1BdCi0JODU5NyAgVlQ4MkM1OTcgW0Fwb2xsbyBWUDMgQUdQXQotCTg1OTggIFZUODJDNTk4LzY5NHggW0Fwb2xsbyBNVlAzL1BybzEzM3ggQUdQXQotCQkxMDE5IDA5ODUgIFA2VlhBIE1vdGhlcmJvYXJkCi0JODYwMSAgVlQ4NjAxIFtBcG9sbG8gUHJvTWVkaWEgQUdQXQotCTg2MDUgIFZUODYwNSBbUE0xMzMgQUdQXQotCTg2OTEgIFZUODJDNjkxIFtBcG9sbG8gUHJvXQotCTg2OTMgIFZUODJDNjkzIFtBcG9sbG8gUHJvIFBsdXNdIFBDSSBCcmlkZ2UKLQliMDkxICBWVDg2MzMgW0Fwb2xsbyBQcm8yNjYgQUdQXQotCWIwOTkgIFZUODM2Ni9BLzcgW0Fwb2xsbyBLVDI2Ni9BLzMzMyBBR1BdCi0JYjEwMSAgVlQ4NjUzIEFHUCBCcmlkZ2UKLQliMTAyICBWVDgzNjIgQUdQIEJyaWRnZQotCWIxMDMgIFZUODYxNSBBR1AgQnJpZGdlCi0JYjExMiAgVlQ4MzYxIFtLTEUxMzNdIEFHUCBCcmlkZ2UKLQliMTY4ICBWVDgyMzUgUENJIEJyaWRnZQotCWIxODggIFZUODIzNyBQQ0kgYnJpZGdlIFtLOFQ4MDAgU291dGhdCi0JCTE0N2IgMTQwNyAgS1Y4LU1BWDMgbW90aGVyYm9hcmQKLQliMTk4ICBWVDgyMzcgUENJIEJyaWRnZQotIyAzMi1CaXQgUENJIGJ1cyBtYXN0ZXIgRXRoZXJuZXQgTUFDIHdpdGggc3RhbmRhcmQgTUlJIGludGVyZmFjZQotCWQxMDQgIFZUODIzNyBJbnRlZ3JhdGVkIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlcgotMTEwNyAgU3RyYXR1cyBDb21wdXRlcnMKLQkwNTc2ICBWSUEgVlQ4MkM1NzBNViBbQXBvbGxvXSAoV3JvbmcgdmVuZG9yIElEISkKLTExMDggIFByb3Rlb24sIEluYy4KLQkwMTAwICBwMTY5MHBsdXNfQUEKLQkwMTAxICBwMTY5MHBsdXNfQUIKLQkwMTA1ICBQMTY5MFBsdXMKLQkwMTA4ICBQMTY5MFBsdXMKLQkwMTM4ICBQMTY5MFBsdXMKLQkwMTM5ICBQMTY5MFBsdXMKLQkwMTNjICBQMTY5MFBsdXMKLQkwMTNkICBQMTY5MFBsdXMKLTExMDkgIENvZ2VudCBEYXRhIFRlY2hub2xvZ2llcywgSW5jLgotCTE0MDAgIEVNMTEwVFggW0VYMTEwVFhdCi0xMTBhICBTaWVtZW5zIE5peGRvcmYgQUcKLQkwMDAyICBQaXJhaG5hIDItcG9ydAotCTAwMDUgIFR1bGlwIGNvbnRyb2xsZXIsIHBvd2VyIG1hbmFnZW1lbnQsIHN3aXRjaCBleHRlbmRlcgotCTAwMDYgIEZTQyBQSU5DIChJL08tQVBJQykKLQkwMDE1ICBGU0MgTXVsdGlwcm9jZXNzb3IgSW50ZXJydXB0IENvbnRyb2xsZXIKLQkwMDFkICBGU0MgQ29wZXJuaWN1cyBNYW5hZ2VtZW50IENvbnRyb2xsZXIKLQkwMDdiICBGU0MgUmVtb3RlIFNlcnZpY2UgQ29udHJvbGxlciwgbWFpbGJveCBkZXZpY2UKLQkwMDdjICBGU0MgUmVtb3RlIFNlcnZpY2UgQ29udHJvbGxlciwgc2hhcmVkIG1lbW9yeSBkZXZpY2UKLQkwMDdkICBGU0MgUmVtb3RlIFNlcnZpY2UgQ29udHJvbGxlciwgU01JQyBkZXZpY2UKLSMgU3VwZXJmYXN0Y29tLVBDSSAoQ29tbXRlY2gsIEluYy4pIG9yIERTQ0M0IFdBTiBBZGFwdGVyCi0JMjEwMiAgRFNDQzQgUEVCL1BFRiAyMDUzNCBETUEgU3VwcG9ydGVkIFNlcmlhbCBDb21tdW5pY2F0aW9uIENvbnRyb2xsZXIgd2l0aCA0IENoYW5uZWxzCi0JMjEwNCAgRWljb24gRGl2YSAyLjAyIGNvbXBhdGlibGUgcGFzc2l2ZSBJU0ROIGNhcmQKLQkzMTQyICBTSU1BVElDIE5FVCBDUCA1NjEzQTEgKFByb2ZpYnVzIEFkYXB0ZXIpCi0JNDAyMSAgU0lNQVRJQyBORVQgQ1AgNTUxMiAoUHJvZmlidXMgYW5kIE1QSSBDYXJkYnVzIEFkYXB0ZXIpCi0JNDAyOSAgU0lNQVRJQyBORVQgQ1AgNTYxM0EyIChQcm9maWJ1cyBBZGFwdGVyKQotCTQ5NDIgIEZQR0EgSS1CdXMgVHJhY2VyIGZvciBNQkQKLQk2MTIwICBTWkI2MTIwCi0xMTBiICBDaHJvbWF0aWMgUmVzZWFyY2ggSW5jLgotCTAwMDEgIE1wYWN0IE1lZGlhIFByb2Nlc3NvcgotCTAwMDQgIE1wYWN0IDIKLTExMGMgIE1pbmktTWF4IFRlY2hub2xvZ3ksIEluYy4KLTExMGQgIFpueXggQWR2YW5jZWQgU3lzdGVtcwotMTEwZSAgQ1BVIFRlY2hub2xvZ3kKLTExMGYgIFJvc3MgVGVjaG5vbG9neQotMTExMCAgUG93ZXJob3VzZSBTeXN0ZW1zCi0JNjAzNyAgRmlyZXBvd2VyIFBvd2VyaXplZCBTTVAgSS9PIEFTSUMKLQk2MDczICBGaXJlcG93ZXIgUG93ZXJpemVkIFNNUCBJL08gQVNJQwotMTExMSAgU2FudGEgQ3J1eiBPcGVyYXRpb24KLSMgQWxzbyBjbGFpbWVkIHRvIGJlIFJOUyBvciBSb2Nrd2VsbCBJbnRlcm5hdGlvbmFsLCBjdXJyZW50IFBDSVNJRyByZWNvcmRzIGxpc3QgT3NpY29tCi0xMTEyICBPc2ljb20gVGVjaG5vbG9naWVzIEluYwotCTIyMDAgIEZEREkgQWRhcHRlcgotCTIzMDAgIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCTIzNDAgIDQgUG9ydCBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQkyNDAwICBBVE0gQWRhcHRlcgotMTExMyAgQWNjdG9uIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KLQkxMjExICBTTUMyLTEyMTFUWAotCQkxMDNjIDEyMDcgIEVOLTEyMDdEIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMTEzIDEyMTEgIEVOLTEyMDdEIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCTEyMTYgIEVOLTEyMTYgRXRoZXJuZXQgQWRhcHRlcgotCQkxMTEzIDIyNDIgIEVOMjI0MiAxMC8xMDAgRXRoZXJuZXQgTWluaS1QQ0kgQ2FyZAotCQkxMTFhIDEwMjAgIFNwZWVkU3RyZWFtIDEwMjAgUENJIDEwLzEwMCBFdGhlcm5ldCBBZGFwdG9yIFtFTi0xMjA3Ri1UWCA/XQotCTEyMTcgIEVOLTEyMTcgRXRoZXJuZXQgQWRhcHRlcgotCTUxMDUgIDEwTWJwcyBOZXR3b3JrIGNhcmQKLQk5MjExICBFTi0xMjA3RCBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTExMyA5MjExICBFTi0xMjA3RCBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQk5NTExICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSBGYXN0IEV0aGVybmV0Ci0JZDMwMSAgQ1BXTkExMDAgKFBoaWxpcHMgd2lyZWxlc3MgUENNQ0lBKQotCWVjMDIgIFNNQyAxMjQ0VFggdjMKLTExMTQgIEF0bWVsIENvcnBvcmF0aW9uCi0JMDUwNiAgODAyLjExYiBXaXJlbGVzcyBOZXR3b3JrIEFkYXB0b3IgKGF0NzZjNTA2KQotMTExNSAgM0QgTGFicwotMTExNiAgRGF0YSBUcmFuc2xhdGlvbgotCTAwMjIgIERUMzAwMQotCTAwMjMgIERUMzAwMgotCTAwMjQgIERUMzAwMwotCTAwMjUgIERUMzAwNAotCTAwMjYgIERUMzAwNQotCTAwMjcgIERUMzAwMS1QR0wKLQkwMDI4ICBEVDMwMDMtUEdMCi0xMTE3ICBEYXRhY3ViZSwgSW5jCi0JOTUwMCAgTWF4LTFDIFNWR0EgY2FyZAotCTk1MDEgIE1heC0xQyBpbWFnZSBwcm9jZXNzaW5nCi0xMTE4ICBCZXJnIEVsZWN0cm9uaWNzCi0xMTE5ICBJQ1AgVm9ydGV4IENvbXB1dGVyc3lzdGVtZSBHbWJICi0JMDAwMCAgR0RUIDYwMDAvNjAyMC82MDUwCi0JMDAwMSAgR0RUIDYwMDBCLzYwMTAKLQkwMDAyICBHRFQgNjExMC82NTEwCi0JMDAwMyAgR0RUIDYxMjAvNjUyMAotCTAwMDQgIEdEVCA2NTMwCi0JMDAwNSAgR0RUIDY1NTAKLQkwMDA2ICBHRFQgNjExNy82NTE3Ci0JMDAwNyAgR0RUIDYxMjcvNjUyNwotCTAwMDggIEdEVCA2NTM3Ci0JMDAwOSAgR0RUIDY1NTcvNjU1Ny1FQ0MKLQkwMDBhICBHRFQgNjExNS82NTE1Ci0JMDAwYiAgR0RUIDYxMjUvNjUyNQotCTAwMGMgIEdEVCA2NTM1Ci0JMDAwZCAgR0RUIDY1NTUKLQkwMDEwICBHRFQgNjExNS82NTE1Ci0JMDAxMSAgR0RUIDYxMjUvNjUyNQotCTAwMTIgIEdEVCA2NTM1Ci0JMDAxMyAgR0RUIDY1NTUvNjU1NS1FQ0MKLQkwMTAwICBHRFQgNjExN1JQLzY1MTdSUAotCTAxMDEgIEdEVCA2MTI3UlAvNjUyN1JQCi0JMDEwMiAgR0RUIDY1MzdSUAotCTAxMDMgIEdEVCA2NTU3UlAKLQkwMTA0ICBHRFQgNjExMVJQLzY1MTFSUAotCTAxMDUgIEdEVCA2MTIxUlAvNjUyMVJQCi0JMDExMCAgR0RUIDYxMTdSRC82NTE3UkQKLQkwMTExICBHRFQgNjEyN1JELzY1MjdSRAotCTAxMTIgIEdEVCA2NTM3UkQKLQkwMTEzICBHRFQgNjU1N1JECi0JMDExNCAgR0RUIDYxMTFSRC82NTExUkQKLQkwMTE1ICBHRFQgNjEyMVJELzY1MjFSRAotCTAxMTggIEdEVCA2MTE4UkQvNjUxOFJELzY2MThSRAotCTAxMTkgIEdEVCA2MTI4UkQvNjUyOFJELzY2MjhSRAotCTAxMWEgIEdEVCA2NTM4UkQvNjYzOFJECi0JMDExYiAgR0RUIDY1NThSRC82NjU4UkQKLQkwMTIwICBHRFQgNjExN1JQMi82NTE3UlAyCi0JMDEyMSAgR0RUIDYxMjdSUDIvNjUyN1JQMgotCTAxMjIgIEdEVCA2NTM3UlAyCi0JMDEyMyAgR0RUIDY1NTdSUDIKLQkwMTI0ICBHRFQgNjExMVJQMi82NTExUlAyCi0JMDEyNSAgR0RUIDYxMjFSUDIvNjUyMVJQMgotCTAxMzYgIEdEVCA2MTEzUlMvNjUxM1JTCi0JMDEzNyAgR0RUIDYxMjNSUy82NTIzUlMKLQkwMTM4ICBHRFQgNjExOFJTLzY1MThSUy82NjE4UlMKLQkwMTM5ICBHRFQgNjEyOFJTLzY1MjhSUy82NjI4UlMKLQkwMTNhICBHRFQgNjUzOFJTLzY2MzhSUwotCTAxM2IgIEdEVCA2NTU4UlMvNjY1OFJTCi0JMDEzYyAgR0RUIDY1MzNSUy82NjMzUlMKLQkwMTNkICBHRFQgNjU0M1JTLzY2NDNSUwotCTAxM2UgIEdEVCA2NTUzUlMvNjY1M1JTCi0JMDEzZiAgR0RUIDY1NjNSUy82NjYzUlMKLQkwMTY2ICBHRFQgNzExM1JOLzc1MTNSTi83NjEzUk4KLQkwMTY3ICBHRFQgNzEyM1JOLzc1MjNSTi83NjIzUk4KLQkwMTY4ICBHRFQgNzExOFJOLzc1MThSTi83NTE4Uk4KLQkwMTY5ICBHRFQgNzEyOFJOLzc1MjhSTi83NjI4Uk4KLQkwMTZhICBHRFQgNzUzOFJOLzc2MzhSTgotCTAxNmIgIEdEVCA3NTU4Uk4vNzY1OFJOCi0JMDE2YyAgR0RUIDc1MzNSTi83NjMzUk4KLQkwMTZkICBHRFQgNzU0M1JOLzc2NDNSTgotCTAxNmUgIEdEVCA3NTUzUk4vNzY1M1JOCi0JMDE2ZiAgR0RUIDc1NjNSTi83NjYzUk4KLQkwMWQ2ICBHRFQgNHgxM1JaCi0JMDFkNyAgR0RUIDR4MjNSWgotCTAxZjYgIEdEVCA4eDEzUloKLQkwMWY3ICBHRFQgOHgyM1JaCi0JMDFmYyAgR0RUIDh4MzNSWgotCTAxZmQgIEdEVCA4eDQzUloKLQkwMWZlICBHRFQgOHg1M1JaCi0JMDFmZiAgR0RUIDh4NjNSWgotCTAyMTAgIEdEVCA2NTE5UkQvNjYxOVJECi0JMDIxMSAgR0RUIDY1MjlSRC82NjI5UkQKLQkwMjYwICBHRFQgNzUxOVJOLzc2MTlSTgotCTAyNjEgIEdEVCA3NTI5Uk4vNzYyOVJOCi0JMDJmZiAgR0RUIE1BWFJQCi0JMDMwMCAgR0RUIE5FV1JYCi0xMTFhICBFZmZpY2llbnQgTmV0d29ya3MsIEluYwotCTAwMDAgIDE1NVAtTUYxIChGUEdBKQotCTAwMDIgIDE1NVAtTUYxIChBU0lDKQotCTAwMDMgIEVOSS0yNVAgQVRNCi0JCTExMWEgMDAwMCAgRU5JLTI1cCBNaW5pcG9ydCBBVE0gQWRhcHRlcgotCTAwMDUgIFNwZWVkU3RyZWFtIChMQU5BSSkKLQkJMTExYSAwMDAxICBFTkktMzAxMCBBVE0KLQkJMTExYSAwMDA5ICBFTkktMzA2MCBBRFNMIChWUEk9MCkKLQkJMTExYSAwMTAxICBFTkktMzAxMCBBVE0KLQkJMTExYSAwMTA5ICBFTkktMzA2MENPIEFEU0wgKFZQST0wKQotCQkxMTFhIDA4MDkgIEVOSS0zMDYwIEFEU0wgKFZQST0wIG9yIDgpCi0JCTExMWEgMDkwOSAgRU5JLTMwNjBDTyBBRFNMIChWUEk9MCBvciA4KQotCQkxMTFhIDBhMDkgIEVOSS0zMDYwIEFEU0wgKFZQST08MC4uMTU+KQotCTAwMDcgIFNwZWVkU3RyZWFtIEFEU0wKLQkJMTExYSAxMDAxICBFTkktMzA2MSBBRFNMIFtBU0lDXQotCTEyMDMgIFNwZWVkU3RyZWFtIDEwMjMgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLTExMWIgIFRlbGVkeW5lIEVsZWN0cm9uaWMgU3lzdGVtcwotMTExYyAgVHJpY29yZCBTeXN0ZW1zIEluYy4KLQkwMDAxICBQb3dlcmJpcyBCcmlkZ2UKLTExMWQgIEludGVncmF0ZWQgRGV2aWNlIFRlY2hub2xvZ3ksIEluYy4KLQkwMDAxICBJRFQ3NzIwMS83NzIxMSAxNTVNYnBzIEFUTSBTQVIgQ29udHJvbGxlciBbTklDU3RBUl0KLQkwMDAzICBJRFQ3NzIyMi83NzI1MiAxNTVNYnBzIEFUTSBNSUNSTyBBQlIgU0FSIENvbnRyb2xsZXIKLQkwMDA0ICBJRFQ3N1YyNTIgMTU1TWJwcyBBVE0gTUlDUk8gQUJSIFNBUiBDb250cm9sbGVyCi0JMDAwNSAgSURUNzdWMjIyIDE1NU1icHMgQVRNIE1JQ1JPIEFCUiBTQVIgQ29udHJvbGxlcgotMTExZSAgRWxkZWMKLTExMWYgIFByZWNpc2lvbiBEaWdpdGFsIEltYWdlcwotCTRhNDcgIFByZWNpc2lvbiBNWCBWaWRlbyBlbmdpbmUgaW50ZXJmYWNlCi0JNTI0MyAgRnJhbWUgY2FwdHVyZSBidXMgaW50ZXJmYWNlCi0xMTIwICBFTUMgQ29ycG9yYXRpb24KLTExMjEgIFppbG9nCi0xMTIyICBNdWx0aS10ZWNoIFN5c3RlbXMsIEluYy4KLTExMjMgIEV4Y2VsbGVudCBEZXNpZ24sIEluYy4KLTExMjQgIExldXRyb24gVmlzaW9uIEFHCi0xMTI1ICBFdXJvY29yZQotMTEyNiAgVmlncmEKLTExMjcgIEZPUkUgU3lzdGVtcyBJbmMKLQkwMjAwICBGb3JlUnVubmVyIFBDQS0yMDAgQVRNCi0JMDIxMCAgUENBLTIwMFBDCi0JMDI1MCAgQVRNCi0JMDMwMCAgRm9yZVJ1bm5lciBQQ0EtMjAwRVBDIEFUTQotCTAzMTAgIEFUTQotCTA0MDAgIEZvcmVSdW5uZXJIRSBBVE0gQWRhcHRlcgotCQkxMTI3IDA0MDAgIEZvcmVSdW5uZXJIRSBBVE0KLTExMjkgIEZpcm13b3JrcwotMTEyYSAgSGVybWVzIEVsZWN0cm9uaWNzIENvbXBhbnksIEx0ZC4KLTExMmIgIExpbm90eXBlIC0gSGVsbCBBRwotMTEyYyAgWmVuaXRoIERhdGEgU3lzdGVtcwotMTEyZCAgUmF2aWNhZAotMTEyZSAgSW5mb21lZGlhIE1pY3JvZWxlY3Ryb25pY3MgSW5jLgotMTEyZiAgSW1hZ2luZyBUZWNobm9sb2d5IEluYwotCTAwMDAgIE1WQyBJQy1QQ0kKLQkwMDAxICBNVkMgSU0tUENJIFZpZGVvIGZyYW1lIGdyYWJiZXIvcHJvY2Vzc29yCi0xMTMwICBDb21wdXRlcnZpc2lvbgotMTEzMSAgUGhpbGlwcyBTZW1pY29uZHVjdG9ycwotCTE1NjEgIFVTQiAxLjEgSG9zdCBDb250cm9sbGVyCi0JMTU2MiAgVVNCIDIuMCBIb3N0IENvbnRyb2xsZXIKLQkzNDAwICBTbWFydFBDSTU2KFVDQjE1MDApIDU2SyBNb2RlbQotCTU0MDAgIFRyaU1lZGlhIFRNMTAwMC8xMTAwCi0JNTQwMiAgVHJpTWVkaWEgVE0tMTMwMAotCQkxMjQ0IDBmMDAgIEZyaXR6IUNhcmQgRFNMCi0JNzEzMCAgU0FBNzEzMCBWaWRlbyBCcm9hZGNhc3QgRGVjb2RlcgotCQk1MTY4IDAxMzggIExpdmVWaWV3IEZseVZpZGVvIDIwMDAKLQk3MTMzICBTQUE3MTNYIEF1ZGlvK3ZpZGVvIGJyb2FkY2FzdCBkZWNvZGVyCi0JCTUxNjggMDEzOCAgTGlmZVZpZXcgRmx5VmlkZW8gMzAwMAotCQk1MTY4IDAyMTIgIExpZmVWaWV3IEZseVRWIFBsYXRpbnVtIG1pbmkKLQkJNTE2OCAwNTAyICBMaWZlVmlldyBGbHlEVkItVCBEdW8gQ2FyZEJ1cwotIyBQQ0kgYXVkaW8gYW5kIHZpZGVvIGJyb2FkY2FzdCBkZWNvZGVyIChodHRwOi8vd3d3LnNlbWljb25kdWN0b3JzLnBoaWxpcHMuY29tL3BpcC9zYWE3MTM0aGwpCi0JNzEzNCAgU0FBNzEzNAotCQkxMDQzIDQ4NDIgIFRWLUZNIENhcmQgNzEzNAotCTcxMzUgIFNBQTcxMzUgQXVkaW8rdmlkZW8gYnJvYWRjYXN0IGRlY29kZXIKLQk3MTQ1ICBTQUE3MTQ1Ci0JNzE0NiAgU0FBNzE0NgotCQkxMTBhIDAwMDAgIEZ1aml0c3UvU2llbWVucyBEVkItQyBjYXJkIHJldjEuNQotCQkxMTBhIGZmZmYgIEZ1aml0c3UvU2llbWVucyBEVkItQyBjYXJkIHJldjEuNQotCQkxMTMxIDRmNTYgIEtOQzEgRFZCLVMgQnVkZ2V0Ci0JCTExMzEgNGY2MSAgRnVqaXRzdS1TaWVtZW5zIEFjdGl2eSBEVkItUyBCdWRnZXQKLQkJMTE0YiAyMDAzICBEVlJhcHRvciBWaWRlbyBFZGl0L0NhcHR1cmUgQ2FyZAotCQkxMWJkIDAwMDYgIERWNTAwIE92ZXJsYXkKLQkJMTFiZCAwMDBhICBEVjUwMCBPdmVybGF5Ci0JCTExYmQgMDAwZiAgRFY1MDAgT3ZlcmxheQotCQkxM2MyIDAwMDAgIFNpZW1lbnMvVGVjaG5vdHJlbmQvSGF1cHBhdWdlIERWQiBjYXJkIHJldjEuMyBvciByZXYxLjUKLQkJMTNjMiAwMDAxICBUZWNobm90cmVuZC9IYXVwcGF1Z2UgRFZCIGNhcmQgcmV2MS4zIG9yIHJldjEuNgotCQkxM2MyIDAwMDIgIFRlY2hub3RyZW5kL0hhdXBwYXVnZSBEVkIgY2FyZCByZXYyLjEKLQkJMTNjMiAwMDAzICBUZWNobm90cmVuZC9IYXVwcGF1Z2UgRFZCIGNhcmQgcmV2Mi4xCi0JCTEzYzIgMDAwNCAgVGVjaG5vdHJlbmQvSGF1cHBhdWdlIERWQiBjYXJkIHJldjIuMQotCQkxM2MyIDAwMDYgIFRlY2hub3RyZW5kL0hhdXBwYXVnZSBEVkIgY2FyZCByZXYxLjMgb3IgcmV2MS42Ci0JCTEzYzIgMDAwOCAgVGVjaG5vdHJlbmQvSGF1cHBhdWdlIERWQi1UCi0JCTEzYzIgMDAwYSAgT2N0YWwvVGVjaG5vdHJlbmQgRFZCLUMgZm9yIGlUVgotCQkxM2MyIDEwMDMgIFRlY2hub3RyZW5kLUJ1ZGdldCAvIEhhdXBwYXVnZSBXaW5UVi1OT1ZBLVMgRFZCIGNhcmQKLQkJMTNjMiAxMDA0ICBUZWNobm90cmVuZC1CdWRnZXQgLyBIYXVwcGF1Z2UgV2luVFYtTk9WQS1DIERWQiBjYXJkCi0JCTEzYzIgMTAwNSAgVGVjaG5vdHJlbmQtQnVkZ2V0IC8gSGF1cHBhdWdlIFdpblRWLU5PVkEtVCBEVkIgY2FyZAotCQkxM2MyIDEwMGMgIFRlY2hub3RyZW5kLUJ1ZGdldCAvIEhhdXBwYXVnZSBXaW5UVi1OT1ZBLUNJIERWQiBjYXJkCi0JCTEzYzIgMTAwZiAgVGVjaG5vdHJlbmQtQnVkZ2V0IC8gSGF1cHBhdWdlIFdpblRWLU5PVkEtQ0kgRFZCIGNhcmQKLQkJMTNjMiAxMDExICBUZWNobm90cmVuZC1CdWRnZXQgLyBIYXVwcGF1Z2UgV2luVFYtTk9WQS1UIERWQiBjYXJkCi0JCTEzYzIgMTAxMyAgU0FURUxDTyBNdWx0aW1lZGlhIERWQgotCQkxM2MyIDExMDIgIFRlY2hub3RyZW5kL0hhdXBwYXVnZSBEVkIgY2FyZCByZXYyLjEKLTExMzIgIE1pdGVsIENvcnAuCi0jIFRoaXMgaXMgdGhlIG5ldyBvZmZpY2lhbCBjb21wYW55IG5hbWUuIFNlZSBkaXNjbGFpbWVyIG9uIHd3dy5laWNvbi5jb20gZm9yIGRldGFpbHMhCi0xMTMzICBFaWNvbiBOZXR3b3JrcyBDb3Jwb3JhdGlvbgotCTc5MDEgIEVpY29uQ2FyZCBTOTAKLQk3OTAyICBFaWNvbkNhcmQgUzkwCi0JNzkxMSAgRWljb25DYXJkIFM5MQotCTc5MTIgIEVpY29uQ2FyZCBTOTEKLQk3OTQxICBFaWNvbkNhcmQgUzk0Ci0JNzk0MiAgRWljb25DYXJkIFM5NAotCTc5NDMgIEVpY29uQ2FyZCBTOTQKLQk3OTQ0ICBFaWNvbkNhcmQgUzk0Ci0JYjkyMSAgRWljb25DYXJkIFA5MgotCWI5MjIgIEVpY29uQ2FyZCBQOTIKLQliOTIzICBFaWNvbkNhcmQgUDkyCi0JZTAwMSAgRGl2YSBQcm8gMi4wIFMvVAotCWUwMDIgIERpdmEgMi4wIFMvVCBQQ0kKLQllMDAzICBEaXZhIFBybyAyLjAgVQotCWUwMDQgIERpdmEgMi4wIFUgUENJCi0JZTAwNSAgRGl2YSAyLjAxIFMvVCBQQ0kKLQllMDA2ICBEaXZhIENUIFMvVCBQQ0kKLQllMDA3ICBEaXZhIENUIFUgUENJCi0JZTAwOCAgRGl2YSBDVCBMaXRlIFMvVCBQQ0kKLQllMDA5ICBEaXZhIENUIExpdGUgVSBQQ0kKLQllMDBhICBEaXZhIElTRE4rVi45MCBQQ0kKLQllMDBiICBEaXZhIDIuMDIgUENJIFMvVAotCWUwMGMgIERpdmEgMi4wMiBQQ0kgVQotCWUwMGQgIERpdmEgSVNETiBQcm8gMy4wIFBDSQotCWUwMGUgIERpdmEgSVNETitDVCBTL1QgUENJIFJldiAyCi0JZTAxMCAgRGl2YSBTZXJ2ZXIgQlJJLTJNIFBDSQotCQkxMTBhIDAwMjEgIEZ1aml0c3UgU2llbWVucyBJU0ROIFMwCi0JCTgwMDEgMDAxNCAgRGl2YSBTZXJ2ZXIgQlJJLTJNIFBDSSBDb3JuZXQgTlEKLQllMDExICBEaXZhIFNlcnZlciBCUkkgUy9UIFJldiAyCi0JZTAxMiAgRGl2YSBTZXJ2ZXIgNEJSSS04TSBQQ0kKLQkJODAwMSAwMDE0ICBEaXZhIFNlcnZlciA0QlJJLThNIFBDSSBDb3JuZXQgTlEKLQllMDEzICBEaXZhIFNlcnZlciA0QlJJIFJldiAyCi0JCTExMzMgMTMwMCAgRGl2YSBTZXJ2ZXIgVi00QlJJLTgKLQkJMTEzMyBlMDEzICBEaXZhIFNlcnZlciA0QlJJLThNIDIuMCBQQ0kKLQkJODAwMSAwMDE0ICBEaXZhIFNlcnZlciA0QlJJLThNIDIuMCBQQ0kgQ29ybmV0IE5RCi0JZTAxNCAgRGl2YSBTZXJ2ZXIgUFJJLTMwTSBQQ0kKLQkJMDAwOCAwMTAwICBEaXZhIFNlcnZlciBQUkktMzBNIFBDSQotCQk4MDAxIDAwMTQgIERpdmEgU2VydmVyIFBSSS0zME0gUENJIENvcm5ldCBOUQotCWUwMTUgIERJVkEgU2VydmVyIFBSSSBSZXYgMgotCQkxMTMzIGUwMTUgIERpdmEgU2VydmVyIFBSSSAyLjAgUENJCi0JCTgwMDEgMDAxNCAgRGl2YSBTZXJ2ZXIgUFJJIDIuMCBQQ0kgQ29ybmV0IE5RCi0JZTAxNiAgRGl2YSBTZXJ2ZXIgVm9pY2UgNEJSSSBQQ0kKLQkJODAwMSAwMDE0ICBEaXZhIFNlcnZlciBQUkkgQ29ybmV0IE5RCi0JZTAxNyAgRGl2YSBTZXJ2ZXIgVm9pY2UgNEJSSSBSZXYgMgotCQkxMTMzIGUwMTcgIERpdmEgU2VydmVyIFZvaWNlIDRCUkktOE0gMi4wIFBDSQotCQk4MDAxIDAwMTQgIERpdmEgU2VydmVyIFZvaWNlIDRCUkktOE0gMi4wIFBDSSBDb3JuZXQgTlEKLQllMDE4ICBEaXZhIFNlcnZlciBCUkktMk0gMi4wIFBDSQotCQkxMTMzIDE4MDAgIERpdmEgU2VydmVyIFYtQlJJLTIKLQkJMTEzMyBlMDE4ICBEaXZhIFNlcnZlciBCUkktMk0gMi4wIFBDSQotCQk4MDAxIDAwMTQgIERpdmEgU2VydmVyIEJSSS0yTSAyLjAgUENJIENvcm5ldCBOUQotCWUwMTkgIERpdmEgU2VydmVyIFZvaWNlIFBSSSBSZXYgMgotCQkxMTMzIGUwMTkgIERpdmEgU2VydmVyIFZvaWNlIFBSSSAyLjAgUENJCi0JCTgwMDEgMDAxNCAgRGl2YSBTZXJ2ZXIgVm9pY2UgUFJJIDIuMCBQQ0kgQ29ybmV0IE5RCi0JZTAxYSAgRGl2YSBTZXJ2ZXIgMkZYCi0JZTAxYiAgRGl2YSBTZXJ2ZXIgVm9pY2UgQlJJLTJNIDIuMCBQQ0kKLQkJMTEzMyBlMDFiICBEaXZhIFNlcnZlciBWb2ljZSBCUkktMk0gMi4wIFBDSQotCQk4MDAxIDAwMTQgIERpdmEgU2VydmVyIFZvaWNlIEJSSS0yTSAyLjAgUENJIENvcm5ldCBOUQotCWUwMWMgIERpdmEgU2VydmVyIFBSSSBSZXYgMwotCQkxMTMzIDFjMDEgIERpdmEgU2VydmVyIFBSSS9FMS9UMS04Ci0JCTExMzMgMWMwMiAgRGl2YSBTZXJ2ZXIgUFJJL1QxLTI0Ci0JCTExMzMgMWMwMyAgRGl2YSBTZXJ2ZXIgUFJJL0UxLTMwCi0JCTExMzMgMWMwNCAgRGl2YSBTZXJ2ZXIgUFJJL0UxL1QxCi0JCTExMzMgMWMwNSAgRGl2YSBTZXJ2ZXIgVi1QUkkvVDEtMjQKLQkJMTEzMyAxYzA2ICBEaXZhIFNlcnZlciBWLVBSSS9FMS0zMAotCQkxMTMzIDFjMDcgIERpdmEgU2VydmVyIFBSSS9FMS9UMS04IENvcm5ldCBOUQotCQkxMTMzIDFjMDggIERpdmEgU2VydmVyIFBSSS9UMS0yNCBDb3JuZXQgTlEKLQkJMTEzMyAxYzA5ICBEaXZhIFNlcnZlciBQUkkvRTEtMzAgQ29ybmV0IE5RCi0JCTExMzMgMWMwYSAgRGl2YSBTZXJ2ZXIgUFJJL0UxL1QxIENvcm5ldCBOUQotCQkxMTMzIDFjMGIgIERpdmEgU2VydmVyIFYtUFJJL1QxLTI0IENvcm5ldCBOUQotCQkxMTMzIDFjMGMgIERpdmEgU2VydmVyIFYtUFJJL0UxLTMwIENvcm5ldCBOUQotCWUwMWUgIERpdmEgU2VydmVyIDJQUkkKLQkJMTEzMyAxZTAwICBEaXZhIFNlcnZlciBWLTJQUkkvRTEtNjAKLQkJMTEzMyAxZTAxICBEaXZhIFNlcnZlciBWLTJQUkkvVDEtNDgKLQkJMTEzMyAxZTAyICBEaXZhIFNlcnZlciAyUFJJL0UxLTYwCi0JCTExMzMgMWUwMyAgRGl2YSBTZXJ2ZXIgMlBSSS9UMS00OAotCWUwMjAgIERpdmEgU2VydmVyIDRQUkkKLQkJMTEzMyAyMDAwICBEaXZhIFNlcnZlciBWLTRQUkkvRTEtMTIwCi0JCTExMzMgMjAwMSAgRGl2YSBTZXJ2ZXIgVi00UFJJL1QxLTk2Ci0JCTExMzMgMjAwMiAgRGl2YSBTZXJ2ZXIgNFBSSS9FMS0xMjAKLQkJMTEzMyAyMDAzICBEaXZhIFNlcnZlciA0UFJJL1QxLTk2Ci0JZTAyNCAgRGl2YSBTZXJ2ZXIgQW5hbG9nLTRQCi0JCTExMzMgMjQwMCAgRGl2YSBTZXJ2ZXIgVi1BbmFsb2ctNFAKLQkJMTEzMyBlMDI0ICBEaXZhIFNlcnZlciBBbmFsb2ctNFAKLQllMDI4ICBEaXZhIFNlcnZlciBBbmFsb2ctOFAKLQkJMTEzMyAyODAwICBEaXZhIFNlcnZlciBWLUFuYWxvZy04UAotCQkxMTMzIGUwMjggIERpdmEgU2VydmVyIEFuYWxvZy04UAotMTEzNCAgTWVyY3VyeSBDb21wdXRlciBTeXN0ZW1zCi0JMDAwMSAgUmFjZXdheSBCcmlkZ2UKLQkwMDAyICBEdWFsIFBDSSB0byBSYXBpZElPIEJyaWRnZQotMTEzNSAgRnVqaSBYZXJveCBDbyBMdGQKLQkwMDAxICBQcmludGVyIGNvbnRyb2xsZXIKLTExMzYgIE1vbWVudHVtIERhdGEgU3lzdGVtcwotMTEzNyAgQ2lzY28gU3lzdGVtcyBJbmMKLTExMzggIFppYXRlY2ggQ29ycG9yYXRpb24KLQk4OTA1ICA4OTA1IFtTVEQgMzIgQnJpZGdlXQotMTEzOSAgRHluYW1pYyBQaWN0dXJlcywgSW5jCi0JMDAwMSAgVkdBIENvbXBhdGFibGUgM0QgR3JhcGhpY3MKLTExM2EgIEZXQiBJbmMKLTExM2IgIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMKLTExM2MgIEN5Y2xvbmUgTWljcm9zeXN0ZW1zLCBJbmMuCi0JMDAwMCAgUENJLTkwNjAgaTk2MCBCcmlkZ2UKLQkwMDAxICBQQ0ktU0RLIFtQQ0kgaTk2MCBFdmFsdWF0aW9uIFBsYXRmb3JtXQotCTA5MTEgIFBDSS05MTEgW2k5NjBKeC1iYXNlZCBJbnRlbGxpZ2VudCBJL08gQ29udHJvbGxlcl0KLQkwOTEyICBQQ0ktOTEyIFtpOTYwQ0YtYmFzZWQgSW50ZWxsaWdlbnQgSS9PIENvbnRyb2xsZXJdCi0JMDkxMyAgUENJLTkxMwotCTA5MTQgIFBDSS05MTQgW0kvTyBDb250cm9sbGVyIHcvIHNlY29uZGFyeSBQQ0kgYnVzXQotMTEzZCAgTGVhZGluZyBFZGdlIFByb2R1Y3RzIEluYwotMTEzZSAgU2FueW8gRWxlY3RyaWMgQ28gLSBDb21wdXRlciBFbmdpbmVlcmluZyBEZXB0Ci0xMTNmICBFcXVpbm94IFN5c3RlbXMsIEluYy4KLQkwODA4ICBTU1QtNjRQIEFkYXB0ZXIKLQkxMDEwICBTU1QtMTI4UCBBZGFwdGVyCi0JODBjMCAgU1NULTE2UCBEQiBBZGFwdGVyCi0JODBjNCAgU1NULTE2UCBSSiBBZGFwdGVyCi0JODBjOCAgU1NULTE2UCBBZGFwdGVyCi0JODg4OCAgU1NULTRQIEFkYXB0ZXIKLQk5MDkwICBTU1QtOFAgQWRhcHRlcgotMTE0MCAgSW50ZXJ2b2ljZSBJbmMKLTExNDEgIENyZXN0IE1pY3Jvc3lzdGVtIEluYwotMTE0MiAgQWxsaWFuY2UgU2VtaWNvbmR1Y3RvciBDb3Jwb3JhdGlvbgotCTMyMTAgIEFQNjQxMAotCTY0MjIgIFByb1ZpZGVvIDY0MjIKLQk2NDI0ICBQcm9WaWRlbyA2NDI0Ci0JNjQyNSAgUHJvTW90aW9uIEFUMjUKLQk2NDNkICBQcm9Nb3Rpb24gQVQzRAotMTE0MyAgTmV0UG93ZXIsIEluYwotMTE0NCAgQ2luY2lubmF0aSBNaWxhY3JvbgotCTAwMDEgIE5vc2Vydm8gY29udHJvbGxlcgotMTE0NSAgV29ya2JpdCBDb3Jwb3JhdGlvbgotCTgwMDcgIE5pbmphU0NTSS0zMiBXb3JrYml0Ci0JZjAwNyAgTmluamFTQ1NJLTMyIEtNRQotCWYwMTAgIE5pbmphU0NTSS0zMiBXb3JrYml0Ci0JZjAxMiAgTmluamFTQ1NJLTMyIExvZ2l0ZWMKLQlmMDEzICBOaW5qYVNDU0ktMzIgTG9naXRlYwotCWYwMTUgIE5pbmphU0NTSS0zMiBNZWxjbwotMTE0NiAgRm9yY2UgQ29tcHV0ZXJzCi0xMTQ3ICBJbnRlcmZhY2UgQ29ycAotIyBGb3JtZXJseSAoU2NobmVpZGVyICYgS29jaCkKLTExNDggIFN5c0tvbm5lY3QKLQk0MDAwICBGRERJIEFkYXB0ZXIKLQkJMGUxMSBiMDNiICBOZXRlbGxpZ2VudCAxMDAgRkRESSBEQVMgRmlicmUgU0MKLQkJMGUxMSBiMDNjICBOZXRlbGxpZ2VudCAxMDAgRkRESSBTQVMgRmlicmUgU0MKLQkJMGUxMSBiMDNkICBOZXRlbGxpZ2VudCAxMDAgRkRESSBEQVMgVVRQCi0JCTBlMTEgYjAzZSAgTmV0ZWxsaWdlbnQgMTAwIEZEREkgU0FTIFVUUAotCQkwZTExIGIwM2YgIE5ldGVsbGlnZW50IDEwMCBGRERJIFNBUyBGaWJyZSBNSUMKLQkJMTE0OCA1NTIxICBGRERJIFNLLTU1MjEgKFNLLU5FVCBGRERJLVVQKQotCQkxMTQ4IDU1MjIgIEZEREkgU0stNTUyMiAoU0stTkVUIEZEREktVVAgREFTKQotCQkxMTQ4IDU1NDEgIEZEREkgU0stNTU0MSAoU0stTkVUIEZEREktRlApCi0JCTExNDggNTU0MyAgRkRESSBTSy01NTQzIChTSy1ORVQgRkRESS1MUCkKLQkJMTE0OCA1NTQ0ICBGRERJIFNLLTU1NDQgKFNLLU5FVCBGRERJLUxQIERBUykKLQkJMTE0OCA1ODIxICBGRERJIFNLLTU4MjEgKFNLLU5FVCBGRERJLVVQNjQpCi0JCTExNDggNTgyMiAgRkRESSBTSy01ODIyIChTSy1ORVQgRkRESS1VUDY0IERBUykKLQkJMTE0OCA1ODQxICBGRERJIFNLLTU4NDEgKFNLLU5FVCBGRERJLUZQNjQpCi0JCTExNDggNTg0MyAgRkRESSBTSy01ODQzIChTSy1ORVQgRkRESS1MUDY0KQotCQkxMTQ4IDU4NDQgIEZEREkgU0stNTg0NCAoU0stTkVUIEZEREktTFA2NCBEQVMpCi0JNDIwMCAgVG9rZW4gUmluZyBhZGFwdGVyCi0JNDMwMCAgU0stOTh4eCBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyCi0JCTExNDggOTgyMSAgU0stOTgyMSBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyIChTSy1ORVQgR0UtVCkKLQkJMTE0OCA5ODIyICBTSy05ODIyIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1UIGR1YWwgbGluaykKLQkJMTE0OCA5ODQxICBTSy05ODQxIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1MWCkKLQkJMTE0OCA5ODQyICBTSy05ODQyIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1MWCBkdWFsIGxpbmspCi0JCTExNDggOTg0MyAgU0stOTg0MyBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyIChTSy1ORVQgR0UtU1gpCi0JCTExNDggOTg0NCAgU0stOTg0NCBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyIChTSy1ORVQgR0UtU1ggZHVhbCBsaW5rKQotCQkxMTQ4IDk4NjEgIFNLLTk4NjEgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLVNYIFZvbGl0aW9uKQotCQkxMTQ4IDk4NjIgIFNLLTk4NjIgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLVNYIFZvbGl0aW9uIGR1YWwgbGluaykKLQkJMTE0OCA5ODcxICBTSy05ODcxIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1aWCkKLQkJMTE0OCA5ODcyICBTSy05ODcyIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1aWCBkdWFsIGxpbmspCi0JCTEyNTkgMjk3MCAgQVQtMjk3MFNYIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgotCQkxMjU5IDI5NzEgIEFULTI5NzBMWCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTI1OSAyOTcyICBBVC0yOTcwVFggR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEyNTkgMjk3MyAgQVQtMjk3MVNYIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgotCQkxMjU5IDI5NzQgIEFULTI5NzFUIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgotCQkxMjU5IDI5NzUgIEFULTI5NzBTWC8yU0MgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEyNTkgMjk3NiAgQVQtMjk3MExYLzJTQyBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTI1OSAyOTc3ICBBVC0yOTcwVFgvMlRYIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgotCTQzMjAgIFNLLTk4eHggVjIuMCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTE0OCAwMTIxICBNYXJ2ZWxsIFJESy04MDAxIEFkYXB0ZXIKLQkJMTE0OCAwMjIxICBNYXJ2ZWxsIFJESy04MDAyIEFkYXB0ZXIKLQkJMTE0OCAwMzIxICBNYXJ2ZWxsIFJESy04MDAzIEFkYXB0ZXIKLQkJMTE0OCAwNDIxICBNYXJ2ZWxsIFJESy04MDA0IEFkYXB0ZXIKLQkJMTE0OCAwNjIxICBNYXJ2ZWxsIFJESy04MDA2IEFkYXB0ZXIKLQkJMTE0OCAwNzIxICBNYXJ2ZWxsIFJESy04MDA3IEFkYXB0ZXIKLQkJMTE0OCAwODIxICBNYXJ2ZWxsIFJESy04MDA4IEFkYXB0ZXIKLQkJMTE0OCAwOTIxICBNYXJ2ZWxsIFJESy04MDA5IEFkYXB0ZXIKLQkJMTE0OCAxMTIxICBNYXJ2ZWxsIFJESy04MDExIEFkYXB0ZXIKLQkJMTE0OCAxMjIxICBNYXJ2ZWxsIFJESy04MDEyIEFkYXB0ZXIKLQkJMTE0OCAzMjIxICBTSy05NTIxIFYyLjAgMTAvMTAwLzEwMDBCYXNlLVQgQWRhcHRlcgotCQkxMTQ4IDUwMjEgIFNLLTk4MjEgVjIuMCBHaWdhYml0IEV0aGVybmV0IDEwLzEwMC8xMDAwQmFzZS1UIEFkYXB0ZXIKLQkJMTE0OCA1MDQxICBTSy05ODQxIFYyLjAgR2lnYWJpdCBFdGhlcm5ldCAxMDAwQmFzZS1MWCBBZGFwdGVyCi0JCTExNDggNTA0MyAgU0stOTg0MyBWMi4wIEdpZ2FiaXQgRXRoZXJuZXQgMTAwMEJhc2UtU1ggQWRhcHRlcgotCQkxMTQ4IDUwNTEgIFNLLTk4NTEgVjIuMCBHaWdhYml0IEV0aGVybmV0IDEwMDBCYXNlLVNYIEFkYXB0ZXIKLQkJMTE0OCA1MDYxICBTSy05ODYxIFYyLjAgR2lnYWJpdCBFdGhlcm5ldCAxMDAwQmFzZS1TWCBBZGFwdGVyCi0JCTExNDggNTA3MSAgU0stOTg3MSBWMi4wIEdpZ2FiaXQgRXRoZXJuZXQgMTAwMEJhc2UtWlggQWRhcHRlcgotCQkxMTQ4IDk1MjEgIFNLLTk1MjEgMTAvMTAwLzEwMDBCYXNlLVQgQWRhcHRlcgotCTQ0MDAgIFNLLTlEeHggR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JNDUwMCAgU0stOU14eCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKLQk5MDAwICBTSy05U3h4IEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgUENJLVgKLQk5ODQzICBbRnVqaXRzdV0gR2lnYWJpdCBFdGhlcm5ldAotCTllMDAgIFNLLTlFeHggMTAvMTAwLzEwMDBCYXNlLVQgQWRhcHRlcgotCQkxMTQ4IDIxMDAgIFNLLTlFMjEgU2VydmVyIEFkYXB0ZXIKLQkJMTE0OCAyMWQwICBTSy05RTIxRCAxMC8xMDAvMTAwMEJhc2UtVCBBZGFwdGVyCi0JCTExNDggMjIwMCAgU0stOUUyMiBTZXJ2ZXIgQWRhcHRlcgotCQkxMTQ4IDgxMDAgIFNLLTlFODEgU2VydmVyIEFkYXB0ZXIKLQkJMTE0OCA4MjAwICBTSy05RTgyIFNlcnZlciBBZGFwdGVyCi0JCTExNDggOTEwMCAgU0stOUU5MSBTZXJ2ZXIgQWRhcHRlcgotCQkxMTQ4IDkyMDAgIFNLLTlFOTIgU2VydmVyIEFkYXB0ZXIKLTExNDkgIFdpbiBTeXN0ZW0gQ29ycG9yYXRpb24KLTExNGEgIFZNSUMKLQk1NTc5ICBWTUlQQ0ktNTU3OSAoUmVmbGVjdGl2ZSBNZW1vcnkgQ2FyZCkKLQk1NTg3ICBWTUlQQ0ktNTU4NyAoUmVmbGVjdGl2ZSBNZW1vcnkgQ2FyZCkKLQk2NTA0ICBWTUlDIFBDSSA3NzU1IEZQR0EKLQk3NTg3ICBWTUlWTUUtNzU4NwotMTE0YiAgQ2Fub3B1cyBDby4sIEx0ZAotMTE0YyAgQW5uYWJvb2tzCi0xMTRkICBJQyBDb3Jwb3JhdGlvbgotMTE0ZSAgTmlrb24gU3lzdGVtcyBJbmMKLTExNGYgIERpZ2kgSW50ZXJuYXRpb25hbAotCTAwMDIgIEFjY2VsZVBvcnQgRVBDCi0JMDAwMyAgUmlnaHRTd2l0Y2ggU0UtNgotCTAwMDQgIEFjY2VsZVBvcnQgWGVtCi0JMDAwNSAgQWNjZWxlUG9ydCBYcgotCTAwMDYgIEFjY2VsZVBvcnQgWHIsQy9YCi0JMDAwOSAgQWNjZWxlUG9ydCBYci9KCi0JMDAwYSAgQWNjZWxlUG9ydCBFUEMvSgotCTAwMGMgIERhdGFGaXJlUFJJbWUgVDEgKDEtcG9ydCkKLQkwMDBkICBTeW5jUG9ydCAyLVBvcnQgKHguMjUvRlIpCi0JMDAxMSAgQWNjZWxlUG9ydCA4ciBFSUEtMjMyIChJQk0pCi0JMDAxMiAgQWNjZWxlUG9ydCA4ciBFSUEtNDIyCi0JMDAxMyAgQWNjZWxlUG9ydCBYcgotCTAwMTQgIEFjY2VsZVBvcnQgOHIgRUlBLTQyMgotCTAwMTUgIEFjY2VsZVBvcnQgWGVtCi0JMDAxNiAgQWNjZWxlUG9ydCBFUEMvWAotCTAwMTcgIEFjY2VsZVBvcnQgQy9YCi0JMDAxYSAgRGF0YUZpcmVQUkltZSBFMSAoMS1wb3J0KQotCTAwMWIgIEFjY2VsZVBvcnQgQy9YIChJQk0pCi0JMDAxZCAgRGF0YUZpcmUgUkFTIFQxL0UxL1BSSQotCQkxMTRmIDAwNTAgIERhdGFGaXJlIFJBUyBFMSBBZGFwdGVyCi0JCTExNGYgMDA1MSAgRGF0YUZpcmUgUkFTIER1YWwgRTEgQWRhcHRlcgotCQkxMTRmIDAwNTIgIERhdGFGaXJlIFJBUyBUMSBBZGFwdGVyCi0JCTExNGYgMDA1MyAgRGF0YUZpcmUgUkFTIER1YWwgVDEgQWRhcHRlcgotCTAwMjMgIEFjY2VsZVBvcnQgUkFTCi0JMDAyNCAgRGF0YUZpcmUgUkFTIEI0IFNUL1UKLQkJMTE0ZiAwMDMwICBEYXRhRmlyZSBSQVMgQlJJIFUgQWRhcHRlcgotCQkxMTRmIDAwMzEgIERhdGFGaXJlIFJBUyBCUkkgUy9UIEFkYXB0ZXIKLQkwMDI2ICBBY2NlbGVQb3J0IDRyIDkyMAotCTAwMjcgIEFjY2VsZVBvcnQgWHIgOTIwCi0JMDAyOCAgQ2xhc3NpY0JvYXJkIDQKLQkwMDI5ICBDbGFzc2ljQm9hcmQgOAotCTAwMzQgIEFjY2VsZVBvcnQgMnIgOTIwCi0JMDAzNSAgRGF0YUZpcmUgRFNQIFQxL0UxL1BSSSBjUENJCi0JMDA0MCAgQWNjZWxlUG9ydCBYcAotCTAwNDIgIEFjY2VsZVBvcnQgMnAKLQkwMDQzICBBY2NlbGVQb3J0IDRwCi0JMDA0NCAgQWNjZWxlUG9ydCA4cAotCTAwNDUgIEFjY2VsZVBvcnQgMTZwCi0JMDA0ZSAgQWNjZWxlUG9ydCAzMnAKLQkwMDcwICBEYXRhZmlyZSBNaWNybyBWIElPTTIgKEV1cm9wZSkKLQkwMDcxICBEYXRhZmlyZSBNaWNybyBWIChFdXJvcGUpCi0JMDA3MiAgRGF0YWZpcmUgTWljcm8gViBJT00yIChOb3J0aCBBbWVyaWNhKQotCTAwNzMgIERhdGFmaXJlIE1pY3JvIFYgKE5vcnRoIEFtZXJpY2EpCi0JMDBiMCAgRGlnaSBOZW8gNAotCTAwYjEgIERpZ2kgTmVvIDgKLQkwMGM4ICBEaWdpIE5lbyAyIERCOQotCTAwYzkgIERpZ2kgTmVvIDIgREI5IFBSSQotCTAwY2EgIERpZ2kgTmVvIDIgUko0NQotCTAwY2IgIERpZ2kgTmVvIDIgUko0NSBQUkkKLQkwMGQwICBDbGFzc2ljQm9hcmQgNCA0MjIKLQkwMGQxICBDbGFzc2ljQm9hcmQgOCA0MjIKLQk2MDAxICBBdmFuc3RhcgotMTE1MCAgVGhpbmtpbmcgTWFjaGluZXMgQ29ycAotMTE1MSAgSkFFIEVsZWN0cm9uaWNzIEluYy4KLTExNTIgIE1lZ2F0ZWsKLTExNTMgIExhbmQgV2luIEVsZWN0cm9uaWMgQ29ycAotMTE1NCAgTWVsY28gSW5jCi0xMTU1ICBQaW5lIFRlY2hub2xvZ3kgTHRkCi0xMTU2ICBQZXJpc2NvcGUgRW5naW5lZXJpbmcKLTExNTcgIEF2c3lzIENvcnBvcmF0aW9uCi0xMTU4ICBWb2FyeCBSICYgRCBJbmMKLQkzMDExICBUb2tlbmV0L3ZnIDEwMDEvMTBtIGFueWxhbgotCTkwNTAgIExhbmZsZWV0L1RydWV2YWx1ZQotCTkwNTEgIExhbmZsZWV0L1RydWV2YWx1ZQotMTE1OSAgTXV0ZWNoIENvcnAKLQkwMDAxICBNVi0xMDAwCi0xMTVhICBIYXJsZXF1aW4gTHRkCi0xMTViICBQYXJhbGxheCBHcmFwaGljcwotMTE1YyAgUGhvdHJvbiBMdGQuCi0xMTVkICBYaXJjb20KLQkwMDAzICBDYXJkYnVzIEV0aGVybmV0IDEwLzEwMAotCQkxMDE0IDAxODEgIDEwLzEwMCBFdGhlckpldCBDYXJkYnVzIEFkYXB0ZXIKLQkJMTAxNCAxMTgxICAxMC8xMDAgRXRoZXJKZXQgQ2FyZGJ1cyBBZGFwdGVyCi0JCTEwMTQgODE4MSAgMTAvMTAwIEV0aGVySmV0IENhcmRidXMgQWRhcHRlcgotCQkxMDE0IDkxODEgIDEwLzEwMCBFdGhlckpldCBDYXJkYnVzIEFkYXB0ZXIKLQkJMTE1ZCAwMTgxICBDYXJkYnVzIEV0aGVybmV0IDEwLzEwMAotCQkxMTVkIDExODEgIENhcmRidXMgRXRoZXJuZXQgMTAvMTAwCi0JCTExNzkgMDE4MSAgQ2FyZGJ1cyBFdGhlcm5ldCAxMC8xMDAKLQkJODA4NiA4MTgxICBFdGhlckV4cHJlc3MgUFJPLzEwMCBNb2JpbGUgQ2FyZEJ1cyAzMiBBZGFwdGVyCi0JCTgwODYgOTE4MSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgTW9iaWxlIENhcmRCdXMgMzIgQWRhcHRlcgotCTAwMDUgIENhcmRidXMgRXRoZXJuZXQgMTAvMTAwCi0JCTEwMTQgMDE4MiAgMTAvMTAwIEV0aGVySmV0IENhcmRidXMgQWRhcHRlcgotCQkxMDE0IDExODIgIDEwLzEwMCBFdGhlckpldCBDYXJkYnVzIEFkYXB0ZXIKLQkJMTE1ZCAwMTgyICBDYXJkYnVzIEV0aGVybmV0IDEwLzEwMAotCQkxMTVkIDExODIgIENhcmRidXMgRXRoZXJuZXQgMTAvMTAwCi0JMDAwNyAgQ2FyZGJ1cyBFdGhlcm5ldCAxMC8xMDAKLQkJMTAxNCAwMTgyICAxMC8xMDAgRXRoZXJKZXQgQ2FyZGJ1cyBBZGFwdGVyCi0JCTEwMTQgMTE4MiAgMTAvMTAwIEV0aGVySmV0IENhcmRidXMgQWRhcHRlcgotCQkxMTVkIDAxODIgIENhcmRidXMgRXRoZXJuZXQgMTAvMTAwCi0JCTExNWQgMTE4MiAgQ2FyZGJ1cyBFdGhlcm5ldCAxMC8xMDAKLQkwMDBiICBDYXJkYnVzIEV0aGVybmV0IDEwLzEwMAotCQkxMDE0IDAxODMgIDEwLzEwMCBFdGhlckpldCBDYXJkYnVzIEFkYXB0ZXIKLQkJMTE1ZCAwMTgzICBDYXJkYnVzIEV0aGVybmV0IDEwLzEwMAotCTAwMGMgIE1pbmktUENJIFYuOTAgNTZrIE1vZGVtCi0JMDAwZiAgQ2FyZGJ1cyBFdGhlcm5ldCAxMC8xMDAKLQkJMTAxNCAwMTgzICAxMC8xMDAgRXRoZXJKZXQgQ2FyZGJ1cyBBZGFwdGVyCi0JCTExNWQgMDE4MyAgQ2FyZGJ1cyBFdGhlcm5ldCAxMC8xMDAKLQkwMGQ0ICBNaW5pLVBDSSBLNTZGbGV4IE1vZGVtCi0JMDEwMSAgQ2FyZGJ1cyA1NmsgbW9kZW0KLQkJMTE1ZCAxMDgxICBDYXJkYnVzIDU2ayBNb2RlbQotCTAxMDMgIENhcmRidXMgRXRoZXJuZXQgKyA1NmsgTW9kZW0KLQkJMTAxNCA5MTgxICBDYXJkYnVzIDU2ayBNb2RlbQotCQkxMTE1IDExODEgIENhcmRidXMgRXRoZXJuZXQgMTAwICsgNTZrIE1vZGVtCi0JCTExNWQgMTE4MSAgQ0JFTTU2Ry0xMDAgRXRoZXJuZXQgKyA1NmsgTW9kZW0KLQkJODA4NiA5MTgxICBQUk8vMTAwIExBTiArIE1vZGVtNTYgQ2FyZEJ1cwotMTE1ZSAgUGVlciBQcm90b2NvbHMgSW5jCi0xMTVmICBNYXh0b3IgQ29ycG9yYXRpb24KLTExNjAgIE1lZ2Fzb2Z0IEluYwotMTE2MSAgUEZVIExpbWl0ZWQKLTExNjIgIE9BIExhYm9yYXRvcnkgQ28gTHRkCi0xMTYzICBSZW5kaXRpb24KLQkwMDAxICBWZXJpdGUgMTAwMAotCTIwMDAgIFZlcml0ZSBWMjAwMC9WMjEwMC9WMjIwMAotCQkxMDkyIDIwMDAgIFN0ZWFsdGggSUkgUzIyMAotMTE2NCAgQWR2YW5jZWQgUGVyaXBoZXJhbHMgVGVjaG5vbG9naWVzCi0xMTY1ICBJbWFncmFwaCBDb3Jwb3JhdGlvbgotCTAwMDEgIE1vdGlvbiBUUEVHIFJlY29yZGVyL1BsYXllciB3aXRoIGF1ZGlvCi0xMTY2ICBTZXJ2ZXJXb3JrcwotCTAwMDAgIENNSUMtTEUKLQkwMDA1ICBDTkIyMC1MRSBIb3N0IEJyaWRnZQotCTAwMDYgIENOQjIwSEUgSG9zdCBCcmlkZ2UKLQkwMDA3ICBDTkIyMC1MRSBIb3N0IEJyaWRnZQotCTAwMDggIENOQjIwSEUgSG9zdCBCcmlkZ2UKLQkwMDA5ICBDTkIyMExFIEhvc3QgQnJpZGdlCi0JMDAxMCAgQ0lPQjMwCi0JMDAxMSAgQ01JQy1IRQotCTAwMTIgIENNSUMtV1MgSG9zdCBCcmlkZ2UgKEdDLUxFIGNoaXBzZXQpCi0JMDAxMyAgQ05CMjAtSEUgSG9zdCBCcmlkZ2UKLQkwMDE0ICBDTUlDLUxFIEhvc3QgQnJpZGdlIChHQy1MRSBjaGlwc2V0KQotCTAwMTUgIENNSUMtR0MgSG9zdCBCcmlkZ2UKLQkwMDE2ICBDTUlDLUdDIEhvc3QgQnJpZGdlCi0JMDAxNyAgR0NOQi1MRSBIb3N0IEJyaWRnZQotCTAxMDEgIENJT0ItWDIgUENJLVggSS9PIEJyaWRnZQotCTAxMTAgIENJT0ItRSBJL08gQnJpZGdlIHdpdGggR2lnYWJpdCBFdGhlcm5ldAotCTAyMDAgIE9TQjQgU291dGggQnJpZGdlCi0JMDIwMSAgQ1NCNSBTb3V0aCBCcmlkZ2UKLQkJNGM1MyAxMDgwICBDVDggbWFpbmJvYXJkCi0JMDIwMyAgQ1NCNiBTb3V0aCBCcmlkZ2UKLQkwMjExICBPU0I0IElERSBDb250cm9sbGVyCi0JMDIxMiAgQ1NCNSBJREUgQ29udHJvbGxlcgotCQk0YzUzIDEwODAgIENUOCBtYWluYm9hcmQKLQkwMjEzICBDU0I2IFJBSUQvSURFIENvbnRyb2xsZXIKLQkwMjE3ICBDU0I2IElERSBDb250cm9sbGVyCi0JMDIyMCAgT1NCNC9DU0I1IE9IQ0kgVVNCIENvbnRyb2xsZXIKLQkJNGM1MyAxMDgwICBDVDggbWFpbmJvYXJkCi0JMDIyMSAgQ1NCNiBPSENJIFVTQiBDb250cm9sbGVyCi0JMDIyNSAgQ1NCNSBMUEMgYnJpZGdlCi0jIGNhbmNlbGxlZAotCQk0YzUzIDEwODAgIENUOCBtYWluYm9hcmQKLQkwMjI3ICBHQ0xFLTIgSG9zdCBCcmlkZ2UKLQkwMjMwICBDU0I1IExQQyBicmlkZ2UKLQkJNGM1MyAxMDgwICBDVDggbWFpbmJvYXJkCi0JMDI0MCAgSzIgU0FUQQotCTAyNDEgIEsyIFNBVEEKLQkwMjQyICBLMiBTQVRBCi0xMTY3ICBNdXRvaCBJbmR1c3RyaWVzIEluYwotMTE2OCAgVGhpbmUgRWxlY3Ryb25pY3MgSW5jCi0xMTY5ICBDZW50cmUgZm9yIERldmVsb3BtZW50IG9mIEFkdmFuY2VkIENvbXB1dGluZwotMTE2YSAgUG9sYXJpcyBDb21tdW5pY2F0aW9ucwotCTYxMDAgIEJ1cy9UYWcgQ2hhbm5lbAotCTY4MDAgIEVzY29uIENoYW5uZWwKLQk3MTAwICBCdXMvVGFnIENoYW5uZWwKLQk3ODAwICBFc2NvbiBDaGFubmVsCi0xMTZiICBDb25uZWN0d2FyZSBJbmMKLTExNmMgIEludGVsbGlnZW50IFJlc291cmNlcyBJbnRlZ3JhdGVkIFN5c3RlbXMKLTExNmQgIE1hcnRpbi1NYXJpZXR0YQotMTE2ZSAgRWxlY3Ryb25pY3MgZm9yIEltYWdpbmcKLTExNmYgIFdvcmtzdGF0aW9uIFRlY2hub2xvZ3kKLTExNzAgIEludmVudGVjIENvcnBvcmF0aW9uCi0xMTcxICBMb3VnaGJvcm91Z2ggU291bmQgSW1hZ2VzIFBsYwotMTE3MiAgQWx0ZXJhIENvcnBvcmF0aW9uCi0xMTczICBBZG9iZSBTeXN0ZW1zLCBJbmMKLTExNzQgIEJyaWRnZXBvcnQgTWFjaGluZXMKLTExNzUgIE1pdHJvbiBDb21wdXRlciBJbmMuCi0xMTc2ICBTQkUgSW5jb3Jwb3JhdGVkCi0xMTc3ICBTaWxpY29uIEVuZ2luZWVyaW5nCi0xMTc4ICBBbGZhLCBJbmMuCi0JYWZhMSAgRmFzdCBFdGhlcm5ldCBBZGFwdGVyCi0xMTc5ICBUb3NoaWJhIEFtZXJpY2EgSW5mbyBTeXN0ZW1zCi0JMDEwMyAgRVgtSURFIFR5cGUtQgotCTA0MDQgIERWRCBEZWNvZGVyIGNhcmQKLQkwNDA2ICBUZWNyYSBWaWRlbyBDYXB0dXJlIGRldmljZQotCTA0MDcgIERWRCBEZWNvZGVyIGNhcmQgKFZlcnNpb24gMikKLQkwNjAxICBDUFUgdG8gUENJIGJyaWRnZQotCTA2MDMgIFRvUElDOTUgUENJIHRvIENhcmRCdXMgQnJpZGdlIGZvciBOb3RlYm9va3MKLQkwNjBhICBUb1BJQzk1Ci0JMDYwZiAgVG9QSUM5NwotCTA2MTcgIFRvUElDMTAwIFBDSSB0byBDYXJkYnVzIEJyaWRnZSB3aXRoIFpWIFN1cHBvcnQKLQkwNjE4ICBDUFUgdG8gUENJIGFuZCBQQ0kgdG8gSVNBIGJyaWRnZQotIyBDbGFpbWVkIHRvIGJlIEx1Y2VudCBEU1AxNjQ1IFtNYXJzXSwgYnV0IHRoYXQncyBhcHBhcmVudGx5IGluY29ycmVjdC4gRG9lcyBhbnlvbmUga25vdyB0aGUgY29ycmVjdCBJRD8KLQkwNzAxICBGSVIgUG9ydAotCTA4MDQgIFRDNjM3MUFGIFNtYXJ0TWVkaWEgQ29udHJvbGxlcgotCTA4MDUgIFNEIFR5cEEgQ29udHJvbGxlcgotCTBkMDEgIEZJUiBQb3J0IFR5cGUtRE8KLQkJMTE3OSAwMDAxICBGSVIgUG9ydCBUeXBlLURPCi0xMTdhICBBLVRyZW5kIFRlY2hub2xvZ3kKLTExN2IgIEwgRyBFbGVjdHJvbmljcywgSW5jLgotMTE3YyAgQXR0byBUZWNobm9sb2d5Ci0xMTdkICBCZWN0b24gJiBEaWNraW5zb24KLTExN2UgIFQvUiBTeXN0ZW1zCi0xMTdmICBJbnRlZ3JhdGVkIENpcmN1aXQgU3lzdGVtcwotMTE4MCAgUmljb2ggQ28gTHRkCi0JMDQ2NSAgUkw1YzQ2NQotCTA0NjYgIFJMNWM0NjYKLQkwNDc1ICBSTDVjNDc1Ci0JCTE0NGQgYzAwNiAgdnByIE1hdHJpeCAxNzBCNCBDYXJkQnVzIGJyaWRnZQotCTA0NzYgIFJMNWM0NzYgSUkKLQkJMTAxNCAwMTg1ICBUaGlua1BhZCBBL1QvWCBTZXJpZXMKLQkJMTA0ZCA4MGRmICBWYWlvIFBDRy1GWDQwMwotCQkxMDRkIDgwZTcgIFZBSU8gUENHLUdSMjE0RVAvR1IyMTRNUC9HUjIxNU1QL0dSMzE0TVAvR1IzMTVNUAotCQkxNGVmIDAyMjAgIFBDRC1SUC0yMjBTCi0JMDQ3NyAgUkw1YzQ3NwotCTA0NzggIFJMNWM0NzgKLQkJMTAxNCAwMTg0ICBUaGlua1BhZCBBMzBwICgyNjUzLTY0RykKLQkwNTIyICBSNUM1MjIgSUVFRSAxMzk0IENvbnRyb2xsZXIKLQkJMTAxNCAwMWNmICBUaGlua1BhZCBBMzBwICgyNjUzLTY0RykKLQkwNTUxICBSNUM1NTEgSUVFRSAxMzk0IENvbnRyb2xsZXIKLQkJMTQ0ZCBjMDA2ICB2cHIgTWF0cml4IDE3MEI0Ci0JMDU1MiAgUjVDNTUyIElFRUUgMTM5NCBDb250cm9sbGVyCi0JCTEwMTQgMDUxMSAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JMDU3NiAgUjVDNTc2IFNEIEJ1cyBIb3N0IEFkYXB0ZXIKLQkwNTkyICBSNUM1OTIgTWVtb3J5IFN0aWNrIEJ1cyBIb3N0IEFkYXB0ZXIKLTExODEgIFRlbG1hdGljcyBJbnRlcm5hdGlvbmFsCi0xMTgzICBGdWppa3VyYSBMdGQKLTExODQgIEZvcmtzIEluYwotMTE4NSAgRGF0YXdvcmxkIEludGVybmF0aW9uYWwgTHRkCi0xMTg2ICBELUxpbmsgU3lzdGVtIEluYwotCTAxMDAgIERDMjEwNDEKLQkxMDAyICBETDEwMDUwIFN1bmRhbmNlIEV0aGVybmV0Ci0JCTExODYgMTAwMiAgREZFLTU1MFRYCi0JCTExODYgMTAxMiAgREZFLTU4MFRYCi0JMTAyNSAgQWlyUGx1cyBYdHJlbWUgRyBEV0wtRzY1MCBBZGFwdGVyCi0JMTAyNiAgQWlyWHBlcnQgRFdMLUFHNjUwIFdpcmVsZXNzIENhcmRidXMgQWRhcHRlcgotCTEwNDMgIEFpclhwZXJ0IERXTC1BRzY1MCBXaXJlbGVzcyBDYXJkYnVzIEFkYXB0ZXIKLQkxMzAwICBSVEw4MTM5IEV0aGVybmV0Ci0JCTExODYgMTMwMCAgREZFLTUzOFRYIDEwLzEwMCBFdGhlcm5ldCBBZGFwdGVyCi0JCTExODYgMTMwMSAgREZFLTUzMFRYKyAxMC8xMDAgRXRoZXJuZXQgQWRhcHRlcgotCTEzNDAgIERGRS02OTBUWEQgQ2FyZEJ1cyBQQyBDYXJkCi0JMTU0MSAgREZFLTY4MFRYRCBDYXJkQnVzIFBDIENhcmQKLQkxNTYxICBEUlAtMzJUWEQgQ2FyZGJ1cyBQQyBDYXJkCi0JMjAyNyAgQWlyUGx1cyBYdHJlbWUgRyBEV0wtRzUyMCBBZGFwdGVyCi0JMzIwMyAgQWlyUGx1cyBYdHJlbWUgRyBEV0wtRzUyMCBBZGFwdGVyCi0JMzMwMCAgRFdMLTUxMCAyLjRHSHogV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQkzYTAzICBBaXJQcm8gRFdMLUE2NTAgV2lyZWxlc3MgQ2FyZGJ1cyBBZGFwdGVyKHJldi5CKQotCTNhMDQgIEFpclBybyBEV0wtQUI2NTAgTXVsdGltb2RlIFdpcmVsZXNzIENhcmRidXMgQWRhcHRlcgotCTNhMDUgIEFpclBybyBEV0wtQUI1MjAgTXVsdGltb2RlIFdpcmVsZXNzIFBDSSBBZGFwdGVyCi0JM2EwNyAgQWlyWHBlcnQgRFdMLUFHNjUwIFdpcmVsZXNzIENhcmRidXMgQWRhcHRlcgotCTNhMDggIEFpclhwZXJ0IERXTC1BRzUyMCBXaXJlbGVzcyBQQ0kgQWRhcHRlcgotCTNhMTAgIEFpclhwZXJ0IERXTC1BRzY1MCBXaXJlbGVzcyBDYXJkYnVzIEFkYXB0ZXIocmV2LkIpCi0JM2ExMSAgQWlyWHBlcnQgRFdMLUFHNTIwIFdpcmVsZXNzIFBDSSBBZGFwdGVyKHJldi5CKQotCTNhMTIgIEFpclBsdXMgRFdMLUc2NTAgV2lyZWxlc3MgQ2FyZGJ1cyBBZGFwdGVyKHJldi5DKQotCTNhMTMgIEFpclBsdXMgRFdMLUc1MjAgV2lyZWxlc3MgUENJIEFkYXB0ZXIocmV2LkIpCi0JM2ExNCAgQWlyUHJlbWllciBEV0wtQUc1MzAgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQkzYTYzICBBaXJYcGVydCBEV0wtQUc2NjAgV2lyZWxlc3MgQ2FyZGJ1cyBBZGFwdGVyCi0JM2IwNSAgRFdMLUc2NTArIENhcmRCdXMgUEMgQ2FyZAotCTQwMDAgIERMMjAwMC1iYXNlZCBHaWdhYml0IEV0aGVybmV0Ci0JNDMwMCAgREdFLTUyOFQgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JNGMwMCAgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTExODYgNGMwMCAgREdFLTUzMFQgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JODQwMCAgRC1MaW5rIERXTC02NTArIENhcmRCdXMgUEMgQ2FyZAotMTE4NyAgQWR2YW5jZWQgVGVjaG5vbG9neSBMYWJvcmF0b3JpZXMsIEluYy4KLTExODggIFNoaW1hIFNlaWtpIE1hbnVmYWN0dXJpbmcgTHRkLgotMTE4OSAgTWF0c3VzaGl0YSBFbGVjdHJvbmljcyBDbyBMdGQKLTExOGEgIEhpbGV2ZWwgVGVjaG5vbG9neQotMTE4YiAgSHlwZXJ0ZWMgUHR5IExpbWl0ZWQKLTExOGMgIENvcm9sbGFyeSwgSW5jCi0JMDAxNCAgUENJQiBbQy1idXMgSUkgdG8gUENJIGJ1cyBob3N0IGJyaWRnZSBjaGlwXQotCTExMTcgIEludGVsIDgtd2F5IFhFT04gUHJvZnVzaW9uIENoaXBzZXQgW0NhY2hlIENvaGVyZW5jeSBGaWx0ZXJdCi0xMThkICBCaXRGbG93IEluYwotCTAwMDEgIFJhcHRvci1QQ0kgZnJhbWVncmFiYmVyCi0JMDAxMiAgTW9kZWwgMTIgUm9hZCBSdW5uZXIgRnJhbWUgR3JhYmJlcgotCTAwMTQgIE1vZGVsIDE0IFJvYWQgUnVubmVyIEZyYW1lIEdyYWJiZXIKLQkwMDI0ICBNb2RlbCAyNCBSb2FkIFJ1bm5lciBGcmFtZSBHcmFiYmVyCi0JMDA0NCAgTW9kZWwgNDQgUm9hZCBSdW5uZXIgRnJhbWUgR3JhYmJlcgotCTAxMTIgIE1vZGVsIDEyIFJvYWQgUnVubmVyIEZyYW1lIEdyYWJiZXIKLQkwMTE0ICBNb2RlbCAxNCBSb2FkIFJ1bm5lciBGcmFtZSBHcmFiYmVyCi0JMDEyNCAgTW9kZWwgMjQgUm9hZCBSdW5uZXIgRnJhbWUgR3JhYmJlcgotCTAxNDQgIE1vZGVsIDQ0IFJvYWQgUnVubmVyIEZyYW1lIEdyYWJiZXIKLQkwMjEyICBNb2RlbCAxMiBSb2FkIFJ1bm5lciBGcmFtZSBHcmFiYmVyCi0JMDIxNCAgTW9kZWwgMTQgUm9hZCBSdW5uZXIgRnJhbWUgR3JhYmJlcgotCTAyMjQgIE1vZGVsIDI0IFJvYWQgUnVubmVyIEZyYW1lIEdyYWJiZXIKLQkwMjQ0ICBNb2RlbCA0NCBSb2FkIFJ1bm5lciBGcmFtZSBHcmFiYmVyCi0JMDMxMiAgTW9kZWwgMTIgUm9hZCBSdW5uZXIgRnJhbWUgR3JhYmJlcgotCTAzMTQgIE1vZGVsIDE0IFJvYWQgUnVubmVyIEZyYW1lIEdyYWJiZXIKLQkwMzI0ICBNb2RlbCAyNCBSb2FkIFJ1bm5lciBGcmFtZSBHcmFiYmVyCi0JMDM0NCAgTW9kZWwgNDQgUm9hZCBSdW5uZXIgRnJhbWUgR3JhYmJlcgotMTE4ZSAgSGVybXN0ZWR0IEdtYkgKLTExOGYgIEdyZWVuIExvZ2ljCi0xMTkwICBUcmlwYWNlCi0JYzczMSAgVFAtOTEwLzkyMC85NDAgUENJIFVsdHJhKFdpZGUpIFNDU0kgQWRhcHRlcgotMTE5MSAgQXJ0b3AgRWxlY3Ryb25pYyBDb3JwCi0JMDAwMyAgU0NTSSBDYWNoZSBIb3N0IEFkYXB0ZXIKLQkwMDA0ICBBVFA4NDAwCi0JMDAwNSAgQVRQODUwVUYKLQkwMDA2ICBBVFA4NjAgTk8tQklPUwotCTAwMDcgIEFUUDg2MAotCTAwMDggIEFUUDg2NSBOTy1ST00KLQkwMDA5ICBBVFA4NjUKLQk4MDAyICBBRUM2NzEwIFNDU0ktMiBIb3N0IEFkYXB0ZXIKLQk4MDEwICBBRUM2NzEyVVcgU0NTSQotCTgwMjAgIEFFQzY3MTJVIFNDU0kKLQk4MDMwICBBRUM2NzEyUyBTQ1NJCi0JODA0MCAgQUVDNjcxMkQgU0NTSQotCTgwNTAgIEFFQzY3MTJTVVcgU0NTSQotCTgwNjAgIEFFQzY3MTIgU0NTSQotCTgwODAgIEFFQzY3MTYwIFNDU0kKLQk4MDgxICBBRUM2NzE2MFMgU0NTSQotCTgwOGEgIEFFQzY3MTYyIDItY2guIExWRCBTQ1NJCi0xMTkyICBEZW5zYW4gQ29tcGFueSBMdGQKLTExOTMgIFplaXRuZXQgSW5jLgotCTAwMDEgIDEyMjEKLQkwMDAyICAxMjI1Ci0xMTk0ICBUb3VjYW4gVGVjaG5vbG9neQotMTE5NSAgUmF0b2MgU3lzdGVtIEluYwotMTE5NiAgSHl0ZWMgRWxlY3Ryb25pY3MgTHRkCi0xMTk3ICBHYWdlIEFwcGxpZWQgU2NpZW5jZXMsIEluYy4KLQkwMTBjICBDb21wdVNjb3BlIDgyRyA4Yml0IDJHUy9zIEFuYWxvZyBJbnB1dCBDYXJkCi0xMTk4ICBMYW1iZGEgU3lzdGVtcyBJbmMKLTExOTkgIEF0dGFjaG1hdGUgQ29ycG9yYXRpb24KLTExOWEgIE1pbmQgU2hhcmUsIEluYy4KLTExOWIgIE9tZWdhIE1pY3JvIEluYy4KLQkxMjIxICA4MkMwOTJHCi0xMTljICBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IEluc3QuCi0xMTlkICBCdWcsIEluYy4gU2FwcG9ybyBKYXBhbgotMTE5ZSAgRnVqaXRzdSBNaWNyb2VsZWN0cm9uaWNzIEx0ZC4KLQkwMDAxICBGaXJlU3RyZWFtIDE1NQotCTAwMDMgIEZpcmVTdHJlYW0gNTAKLTExOWYgIEJ1bGwgSE4gSW5mb3JtYXRpb24gU3lzdGVtcwotMTFhMCAgQ29udmV4IENvbXB1dGVyIENvcnBvcmF0aW9uCi0xMWExICBIYW1hbWF0c3UgUGhvdG9uaWNzIEsuSy4KLTExYTIgIFNpZXJyYSBSZXNlYXJjaCBhbmQgVGVjaG5vbG9neQotMTFhMyAgRGV1cmV0emJhY2hlciBHbWJIICYgQ28uIEVuZy4gS0cKLTExYTQgIEJhcmNvIEdyYXBoaWNzIE5WCi0xMWE1ICBNaWNyb3VuaXR5IFN5c3RlbXMgRW5nLiBJbmMKLTExYTYgIFB1cmUgRGF0YSBMdGQuCi0xMWE3ICBQb3dlciBDb21wdXRpbmcgQ29ycC4KLTExYTggIFN5c3RlY2ggQ29ycC4KLTExYTkgIElubm9TeXMgSW5jLgotCTQyNDAgIEFNQ0MgUzkzM1EgSW50ZWxsaWdlbnQgU2VyaWFsIENhcmQKLTExYWEgIEFjdGVsCi0jIEZvcm1lcmx5IEdhbGlsZW8gVGVjaG5vbG9neSwgSW5jLgotMTFhYiAgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4KLQkwMTQ2ICBHVC02NDAxMC82NDAxMEEgU3lzdGVtIENvbnRyb2xsZXIKLQkxMzhmICBXODMwMCA4MDIuMTEgQWRhcHRlciAocmV2IDA3KQotCTFmYTYgIE1hcnZlbGwgVzgzMDAgODAyLjExIEFkYXB0ZXIKLQkxZmE3ICA4OFc4MzEwIGFuZCA4OFc4MDAwRyBbTGliZXJ0YXNdIDgwMi4xMWcgY2xpZW50IGNoaXBzZXQKLQk0MzIwICBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMTAxOSAwZjM4ICBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChFQ1MpCi0JCTEwMTkgODAwMSAgTWFydmVsbCA4OEU4MDAxIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoRUNTKQotCQkxMDQzIDE3M2MgIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEFzdXMpCi0JCTEwNDMgODExYSAgTWFydmVsbCA4OEU4MDAxIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQXN1cykKLQkJMTA1YiAwYzE5ICBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChGb3hjb25uKQotCQkxMGI4IGI0NTIgIFNNQyBFWiBDYXJkIDEwMDAgKFNNQzk0NTJUWFYuMikKLQkJMTFhYiAwMTIxICBNYXJ2ZWxsIFJESy04MDAxCi0JCTExYWIgMDMyMSAgTWFydmVsbCBSREstODAwMwotCQkxMWFiIDEwMjEgIE1hcnZlbGwgUkRLLTgwMTAKLQkJMTFhYiA1MDIxICBNYXJ2ZWxsIFl1a29uIEdpZ2FiaXQgRXRoZXJuZXQgMTAvMTAwLzEwMDBCYXNlLVQgQ29udHJvbGxlciAoNjQgYml0KQotCQkxMWFiIDk1MjEgIE1hcnZlbGwgWXVrb24gR2lnYWJpdCBFdGhlcm5ldCAxMC8xMDAvMTAwMEJhc2UtVCBDb250cm9sbGVyICgzMiBiaXQpCi0JCTE0NTggZTAwMCAgTWFydmVsbCA4OEU4MDAxIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoR2lnYWJ5dGUpCi0JCTE0N2IgMTQwNiAgTWFydmVsbCA4OEU4MDAxIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQWJpdCkKLQkJMTVkNCAwMDQ3ICBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChJd2lsbCkKLQkJMTY5NSA5MDI1ICBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChFcG94KQotCQkxN2YyIDFjMDMgIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEFsYmF0cm9uKQotCQkyNzBmIDI4MDMgIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKENoYWludGVjaCkKLQk0MzUwICBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMTE3OSAwMDAxICBNYXJ2ZWxsIDg4RTgwMzUgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChUb3NoaWJhKQotCQkxMWFiIDM1MjEgIE1hcnZlbGwgUkRLLTgwMzUKLQkJMTg1NCAwMDBkICBNYXJ2ZWxsIDg4RTgwMzUgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAwZSAgTWFydmVsbCA4OEU4MDM1IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMGYgIE1hcnZlbGwgODhFODAzNSBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDExICBNYXJ2ZWxsIDg4RTgwMzUgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxMiAgTWFydmVsbCA4OEU4MDM1IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMTYgIE1hcnZlbGwgODhFODAzNSBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDE3ICBNYXJ2ZWxsIDg4RTgwMzUgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxOCAgTWFydmVsbCA4OEU4MDM1IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMTkgIE1hcnZlbGwgODhFODAzNSBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDFjICBNYXJ2ZWxsIDg4RTgwMzUgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxZSAgTWFydmVsbCA4OEU4MDM1IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMjAgIE1hcnZlbGwgODhFODAzNSBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQk0MzUxICBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMTA3YiA0MDA5ICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChXaXN0cm9uKQotCQkxMGY3IDgzMzggIE1hcnZlbGwgODhFODAzNiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKFBhbmFzb25pYykKLQkJMTE3OSAwMDAxICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChUb3NoaWJhKQotCQkxMTc5IGZmMDAgIE1hcnZlbGwgODhFODAzNiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKENvbXBhbCkKLQkJMTE3OSBmZjEwICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChJbnZlbnRlYykKLQkJMTFhYiAzNjIxICBNYXJ2ZWxsIFJESy04MDM2Ci0JCTEzZDEgYWMxMiAgQWJvY29tIEVGRTNLIC0gMTAvMTAwIEV0aGVybmV0IEV4cHJlc3NjYXJkCi0JCTE2MWYgMjAzZCAgTWFydmVsbCA4OEU4MDM2IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoQXJpbWEpCi0JCTE4NTQgMDAwZCAgTWFydmVsbCA4OEU4MDM2IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMGUgIE1hcnZlbGwgODhFODAzNiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDBmICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxMSAgTWFydmVsbCA4OEU4MDM2IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMTIgIE1hcnZlbGwgODhFODAzNiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDE2ICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxNyAgTWFydmVsbCA4OEU4MDM2IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMTggIE1hcnZlbGwgODhFODAzNiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDE5ICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxYyAgTWFydmVsbCA4OEU4MDM2IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMWUgIE1hcnZlbGwgODhFODAzNiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDIwICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JNDM2MCAgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTEwNDMgODEzNCAgTWFydmVsbCA4OEU4MDUyIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQXN1cykKLQkJMTA3YiA0MDA5ICBNYXJ2ZWxsIDg4RTgwNTIgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChXaXN0cm9uKQotCQkxMWFiIDUyMjEgIE1hcnZlbGwgUkRLLTgwNTIKLQkJMTQ1OCBlMDAwICBNYXJ2ZWxsIDg4RTgwNTIgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChHaWdhYnl0ZSkKLQkJMTQ2MiAwNTJjICBNYXJ2ZWxsIDg4RTgwNTIgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChNU0kpCi0JCTE4NDkgODA1MiAgTWFydmVsbCA4OEU4MDUyIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQVNSb2NrKQotCQkxOTQwIGUwMDAgIE1hcnZlbGwgODhFODA1MiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEdpZ2FieXRlKQotCQlhMGEwIDA1MDkgIE1hcnZlbGwgODhFODA1MiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEFvcGVuKQotCTQzNjEgIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQkxMDdiIDMwMTUgIE1hcnZlbGwgODhFODA1MCBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEdhdGV3YXkpCi0JCTExYWIgNTAyMSAgTWFydmVsbCA4OEU4MDUwIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoSW50ZWwpCi0JCTgwODYgMzA2MyAgRDkyNVhDVkxLIG1haW5ib2FyZAotCTQzNjIgIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQkxMDNjIDJhMGQgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEFzdXMpCi0JCTEwNDMgODE0MiAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQXN1cykKLQkJMTA5ZiAzMTk3ICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChUcmlnZW0pCi0JCTEwZjcgODMzOCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoUGFuYXNvbmljKQotCQkxMGZkIGE0MzAgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKFNPWU8pCi0JCTExNzkgMDAwMSAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoVG9zaGliYSkKLQkJMTE3OSBmZjAwICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb21wYWwpCi0JCTExNzkgZmYxMCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoSW52ZW50ZWMpCi0JCTExYWIgNTMyMSAgTWFydmVsbCBSREstODA1MwotCQkxMjk3IGMyNDAgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKFNodXR0bGUpCi0JCTEyOTcgYzI0MSAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoU2h1dHRsZSkKLQkJMTI5NyBjMjQyICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChTaHV0dGxlKQotCQkxMjk3IGMyNDMgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKFNodXR0bGUpCi0JCTEyOTcgYzI0NCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoU2h1dHRsZSkKLQkJMTNkMSBhYzExICBBYm9jb20gRUdFNUsgLSBHaWdhIEV0aGVybmV0IEV4cHJlc3NjYXJkCi0JCTE0NTggZTAwMCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoR2lnYWJ5dGUpCi0JCTE0NjIgMDU4YyAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoTVNJKQotCQkxNGMwIDAwMTIgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKENvbXBhbCkKLQkJMTU1OCAwNGEwICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDbGV2bykKLQkJMTViZCAxMDAzICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChERkkpCi0JCTE2MWYgMjAzYyAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQXJpbWEpCi0JCTE2MWYgMjAzZCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQXJpbWEpCi0JCTE2OTUgOTAyOSAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoRXBveCkKLQkJMTdmMiAyYzA4ICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChBbGJhdHJvbikKLQkJMTdmZiAwNTg1ICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChRdWFudGEpCi0JCTE4NDkgODA1MyAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQVNSb2NrKQotCQkxODU0IDAwMGIgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDBjICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxMCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMTMgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDE0ICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxNSAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMWEgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDFiICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxZCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMWYgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDIxICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAyMiAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxOTQwIGUwMDAgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEdpZ2FieXRlKQotCQkyNzBmIDI4MDEgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKENoYWludGVjaCkKLQkJYTBhMCAwNTA2ICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChBb3BlbikKLQk0NjExICBHVC02NDExNSBTeXN0ZW0gQ29udHJvbGxlcgotCTQ2MjAgIEdULTY0MTIwLzY0MTIwQS82NDEyMUEgU3lzdGVtIENvbnRyb2xsZXIKLQk0ODAxICBHVC00ODAwMQotCTUwMDUgIEJlbGtpbiBGNUQ1MDA1IEdpZ2FiaXQgRGVza3RvcCBOZXR3b3JrIFBDSSBDYXJkCi0JNTA0MCAgTVY4OFNYNTA0MCA0LXBvcnQgU0FUQSBJIFBDSS1YIENvbnRyb2xsZXIKLQk1MDQxICBNVjg4U1g1MDQxIDQtcG9ydCBTQVRBIEkgUENJLVggQ29udHJvbGxlcgotCTUwODAgIE1WODhTWDUwODAgOC1wb3J0IFNBVEEgSSBQQ0ktWCBDb250cm9sbGVyCi0JNTA4MSAgTVY4OFNYNTA4MSA4LXBvcnQgU0FUQSBJIFBDSS1YIENvbnRyb2xsZXIKLQk2MDQxICBNVjg4U1g2MDQxIDQtcG9ydCBTQVRBIElJIFBDSS1YIENvbnRyb2xsZXIKLQk2MDgxICBNVjg4U1g2MDgxIDgtcG9ydCBTQVRBIElJIFBDSS1YIENvbnRyb2xsZXIKLQk2NDYwICBNVjY0MzYwLzY0MzYxLzY0MzYyIFN5c3RlbSBDb250cm9sbGVyCi0JZjAwMyAgR1QtNjQwMTAgUHJpbWFyeSBJbWFnZSBQaXJhbmhhIEltYWdlIEdlbmVyYXRvcgotMTFhYyAgQ2Fub24gSW5mb3JtYXRpb24gU3lzdGVtcyBSZXNlYXJjaCBBdXN0LgotMTFhZCAgTGl0ZS1PbiBDb21tdW5pY2F0aW9ucyBJbmMKLQkwMDAyICBMTkUxMDBUWAotCQkxMWFkIDAwMDIgIExORTEwMFRYCi0JCTExYWQgMDAwMyAgTE5FMTAwVFgKLQkJMTFhZCBmMDAzICBMTkUxMDBUWAotCQkxMWFkIGZmZmYgIExORTEwMFRYCi0JCTEzODUgZjAwNCAgRkEzMTBUWAotCWMxMTUgIExORTEwMFRYIFtMaW5rc3lzIEV0aGVyRmFzdCAxMC8xMDBdCi0JCTExYWQgYzAwMSAgTE5FMTAwVFggW3ZlciAyLjBdCi0xMWFlICBBenRlY2ggU3lzdGVtIEx0ZAotMTFhZiAgQXZpZCBUZWNobm9sb2d5IEluYy4KLQkwMDAxICBbQ2luZW1hXQotMTFiMCAgVjMgU2VtaWNvbmR1Y3RvciBJbmMuCi0JMDAwMiAgVjMwMFBTQwotCTAyOTIgIFYyOTJQQkMgW0FtMjkwMzAvNDAgQnJpZGdlXQotCTA5NjAgIFY5NnhQQkMKLQljOTYwICBWOTZEUEMKLTExYjEgIEFwcmljb3QgQ29tcHV0ZXJzCi0xMWIyICBFYXN0bWFuIEtvZGFrCi0xMWIzICBCYXJyIFN5c3RlbXMgSW5jLgotMTFiNCAgTGVpdGNoIFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbAotMTFiNSAgUmFkc3RvbmUgVGVjaG5vbG9neSBQbGMKLTExYjYgIFVuaXRlZCBWaWRlbyBDb3JwCi0xMWI3ICBNb3Rvcm9sYQotMTFiOCAgWFBvaW50IFRlY2hub2xvZ2llcywgSW5jCi0JMDAwMSAgUXVhZCBQZWVyTWFzdGVyCi0xMWI5ICBQYXRobGlnaHQgVGVjaG5vbG9neSBJbmMuCi0JYzBlZCAgU1NBIENvbnRyb2xsZXIKLTExYmEgIFZpZGVvdHJvbiBDb3JwCi0xMWJiICBQeXJhbWlkIFRlY2hub2xvZ3kKLTExYmMgIE5ldHdvcmsgUGVyaXBoZXJhbHMgSW5jCi0JMDAwMSAgTlAtUENJCi0xMWJkICBQaW5uYWNsZSBTeXN0ZW1zIEluYy4KLTExYmUgIEludGVybmF0aW9uYWwgTWljcm9jaXJjdWl0cyBJbmMKLTExYmYgIEFzdHJvZGVzaWduLCBJbmMuCi0xMWMwICBIZXdsZXR0IFBhY2thcmQKLTExYzEgIEFnZXJlIFN5c3RlbXMgKGZvcm1lciBMdWNlbnQgTWljcm9lbGVjdHJvbmljcykKLQkwNDQwICA1NmsgV2luTW9kZW0KLQkJMTAzMyA4MDE1ICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrRHN2ZAotCQkxMDMzIDgwNDcgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStEc3ZkCi0JCTEwMzMgODA0ZiAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4K1ZvaWNlK0RzdmQKLQkJMTBjZiAxMDJjICBMQiBMVCBNb2RlbSBWLjkwIDU2awotCQkxMGNmIDEwNGEgIEJJQkxPIExUIE1vZGVtIDU2awotCQkxMGNmIDEwNWYgIExCMiBMVCBNb2RlbSBWLjkwIDU2awotCQkxMTc5IDAwMDEgIEludGVybmFsIFYuOTAgTW9kZW0KLQkJMTFjMSAwNDQwICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrRHN2ZAotCQkxMjJkIDQxMDEgIE1EUDc4MDAtVSBNb2RlbQotCQkxMjJkIDQxMDIgIE1EUDc4MDBTUC1VIE1vZGVtCi0JCTEzZTAgMDA0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4K1ZvaWNlK0RzdmQKLQkJMTNlMCAwNDQwICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrRHN2ZAotCQkxM2UwIDA0NDEgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStEc3ZkCi0JCTEzZTAgMDQ1MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4K1ZvaWNlK0RzdmQKLQkJMTNlMCBmMTAwICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrRHN2ZAotCQkxM2UwIGYxMDEgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStEc3ZkCi0JCTE0NGQgMjEwMSAgTFQ1NlBWIE1vZGVtCi0JCTE0OWYgMDQ0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4K1ZvaWNlK0RzdmQKLQkwNDQxICA1NmsgV2luTW9kZW0KLQkJMTAzMyA4MDRkICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgKLQkJMTAzMyA4MDY1ICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgKLQkJMTA5MiAwNDQwICBTdXByYSA1NmkKLQkJMTE3OSAwMDAxICBJbnRlcm5hbCBWLjkwIE1vZGVtCi0JCTExYzEgMDQ0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTExYzEgMDQ0MSAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEyMmQgNDEwMCAgTURQNzgwMC1VIE1vZGVtCi0JCTEzZTAgMDA0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEzZTAgMDEwMCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEzZTAgMDQxMCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEzZTAgMDQyMCAgVGVsZVBhdGggSW50ZXJuZXQgNTZrIFdpbk1vZGVtCi0JCTEzZTAgMDQ0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEzZTAgMDQ0MyAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEzZTAgZjEwMiAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTE0MTYgOTgwNCAgQ29tbVdhdmUgNTZrIE1vZGVtCi0JCTE0MWQgMDQ0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTE0NGYgMDQ0MSAgTHVjZW50IDU2ayBWLjkwIERGIE1vZGVtCi0JCTE0NGYgMDQ0OSAgTHVjZW50IDU2ayBWLjkwIERGIE1vZGVtCi0JCTE0NGYgMTEwZCAgTHVjZW50IFdpbiBNb2RlbQotCQkxNDY4IDA0NDEgIFByZXNhcmlvIDU2ayBWLjkwIERGIE1vZGVtCi0JCTE2NjggMDQ0MCAgTHVjZW50IFdpbiBNb2RlbQotCTA0NDIgIDU2ayBXaW5Nb2RlbQotCQkxMWMxIDA0NDAgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxMWMxIDA0NDIgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxM2UwIDA0MTIgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxM2UwIDA0NDIgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxM2ZjIDI0NzEgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxNDRkIDIxMDQgIExUNTZQVCBNb2RlbQotCQkxNDRmIDExMDQgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxNDlmIDA0NDAgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxNjY4IDA0NDAgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCTA0NDMgIExUIFdpbk1vZGVtCi0JMDQ0NCAgTFQgV2luTW9kZW0KLQkwNDQ1ICBMVCBXaW5Nb2RlbQotCQk4MDg2IDIyMDMgIFBSTy8xMDArIE1pbmlQQ0kgKHByb2JhYmx5IGFuIEFtYml0IFU5OC4wMDMuQy4wMCBjb21ibyBjYXJkKQotCQk4MDg2IDIyMDQgIFBSTy8xMDArIE1pbmlQQ0kgb24gQXJtYWRhIEU1MDAKLQkwNDQ2ICBMVCBXaW5Nb2RlbQotCTA0NDcgIExUIFdpbk1vZGVtCi0JMDQ0OCAgV2luTW9kZW0gNTZrCi0JCTEwMTQgMDEzMSAgTHVjZW50IFdpbiBNb2RlbQotCQkxMDMzIDgwNjYgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStEc3ZkCi0JCTEzZTAgMDAzMCAgNTZrIFZvaWNlIE1vZGVtCi0JCTEzZTAgMDA0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4K1ZvaWNlK0RzdmQKLSMgQWN0aW9udGVjaCBldGgrbW9kZW0gY2FyZCBhcyB1c2VkIGJ5IERlbGwgJmMuCi0JCTE2NjggMjQwMCAgTFQgV2luTW9kZW0gNTZrIChNaW5pUENJIEV0aGVybmV0K01vZGVtKQotCTA0NDkgIFdpbk1vZGVtIDU2awotCQkwZTExIGIxNGQgIDU2ayBWLjkwIE1vZGVtCi0JCTEzZTAgMDAyMCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEzZTAgMDA0MSAgVGVsZVBhdGggSW50ZXJuZXQgNTZrIFdpbk1vZGVtCi0JCTE0MzYgMDQ0MCAgTHVjZW50IFdpbiBNb2RlbQotCQkxNDRmIDA0NDkgIEx1Y2VudCA1NmsgVi45MCBERmkgTW9kZW0KLQkJMTQ2OCAwNDEwICBJQk0gVGhpbmtQYWQgVDIzICgyNjQ3LTRNRykKLQkJMTQ2OCAwNDQwICBMdWNlbnQgV2luIE1vZGVtCi0JCTE0NjggMDQ0OSAgUHJlc2FyaW8gNTZrIFYuOTAgREZpIE1vZGVtCi0JMDQ0YSAgRi0xMTU2SVYgV2luTW9kZW0gKFY5MCwgNTZLRmxleCkKLQkJMTBjZiAxMDcyICBMQiBHbG9iYWwgTFQgTW9kZW0KLQkJMTNlMCAwMDEyICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrVm9pY2VWaWV3K0RzdmQKLQkJMTNlMCAwMDQyICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrVm9pY2VWaWV3K0RzdmQKLQkJMTQ0ZiAxMDA1ICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrVm9pY2VWaWV3K0RzdmQKLQkwNDRiICBMVCBXaW5Nb2RlbQotCTA0NGMgIExUIFdpbk1vZGVtCi0JMDQ0ZCAgTFQgV2luTW9kZW0KLQkwNDRlICBMVCBXaW5Nb2RlbQotCTA0NGYgIFY5MCBXaWxkV2lyZSBNb2RlbQotCTA0NTAgIExUIFdpbk1vZGVtCi0JCTEwMzMgODBhOCAgVmVyc2EgTm90ZSBWeGkKLQkJMTQ0ZiA0MDA1ICBNYWduaWEgU0cyMAotCTA0NTEgIExUIFdpbk1vZGVtCi0JMDQ1MiAgTFQgV2luTW9kZW0KLQkwNDUzICBMVCBXaW5Nb2RlbQotCTA0NTQgIExUIFdpbk1vZGVtCi0JMDQ1NSAgTFQgV2luTW9kZW0KLQkwNDU2ICBMVCBXaW5Nb2RlbQotCTA0NTcgIExUIFdpbk1vZGVtCi0JMDQ1OCAgTFQgV2luTW9kZW0KLQkwNDU5ICBMVCBXaW5Nb2RlbQotCTA0NWEgIExUIFdpbk1vZGVtCi0JMDQ1YyAgTFQgV2luTW9kZW0KLQkwNDYxICBWOTAgV2lsZFdpcmUgTW9kZW0KLQkwNDYyICBWOTAgV2lsZFdpcmUgTW9kZW0KLQkwNDgwICBWZW51cyBNb2RlbSAoVjkwLCA1NktGbGV4KQotCTA0OGMgIFYuOTIgNTZLIFdpbk1vZGVtCi0jIEluUG9ydGUgSG9tZSBJbnRlcm5hbCA1NmsgTW9kZW0vZmF4L2Fuc3dlcmluZyBtYWNoaW5lL1NNUyBGZWF0dXJlcwotCTA0OGYgIFYuOTIgNTZrIFdpbk1vZGVtCi0JNTgwMSAgVVNCCi0JNTgwMiAgVVNTLTMxMiBVU0IgQ29udHJvbGxlcgotIyA0IHBvcnQgUENJIFVTQiBDb250cm9sbGVyIG1hZGUgYnkgQWdlcmUgKGZvcm1lbHkgTHVjZW50KQotCTU4MDMgIFVTUy0zNDRTIFVTQiBDb250cm9sbGVyCi0JNTgxMSAgRlczMjMKLQkJODA4NiA1MjRjICBEODY1UEVSTCBtYWluYm9hcmQKLQkJZGVhZCAwODAwICBGaXJlV2lyZSBIb3N0IEJ1cyBBZGFwdGVyCi0JYWIxMCAgV0w2MDAxMCBXaXJlbGVzcyBMQU4gTUFDCi0JYWIxMSAgV0w2MDA0MCBNdWx0aW1vZGUgV2lyZWxlcyBMQU4gTUFDCi0JCTExYzEgYWIxMiAgV2F2ZUxBTiAxMWFiZyBDYXJkYnVzIGNhcmQgKE1vZGVsIDExMDIpCi0JCTExYzEgYWIxMyAgV2F2ZUxBTiAxMWFiZyBNaW5pUENJIGNhcmQgKE1vZGVsIDA1MTIpCi0JCTExYzEgYWIxNSAgV2F2ZUxBTiAxMWFiZyBDYXJkYnVzIGNhcmQgKE1vZGVsIDExMDYpCi0JCTExYzEgYWIxNiAgV2F2ZUxBTiAxMWFiZyBNaW5pUENJIGNhcmQgKE1vZGVsIDA1MTYpCi0JYWIyMCAgT1JpTk9DTyBQQ0kgQWRhcHRlcgotCWFiMjEgIEFnZXJlIFdpcmVsZXNzIFBDSSBBZGFwdGVyCi0JYWIzMCAgSGVybWVzMiBNaW5pLVBDSSBXYXZlTEFOIGEvYi9nCi0JCTE0Y2QgMjAxMiAgSGVybWVzMiBNaW5pLVBDSSBXYXZlTEFOIGEvYi9nCi0xMWMyICBTYW5kIE1pY3JvZWxlY3Ryb25pY3MKLTExYzMgIE5FQyBDb3Jwb3JhdGlvbgotMTFjNCAgRG9jdW1lbnQgVGVjaG5vbG9naWVzLCBJbmMKLTExYzUgIFNoaXZhIENvcnBvcmF0aW9uCi0xMWM2ICBEYWluaXBwb24gU2NyZWVuIE1mZy4gQ28uIEx0ZAotMTFjNyAgRC5DLk0uIERhdGEgU3lzdGVtcwotMTFjOCAgRG9scGhpbiBJbnRlcmNvbm5lY3QgU29sdXRpb25zIEFTCi0JMDY1OCAgUFNCMzIgU0NJLUFkYXB0ZXIgRDMxeAotCWQ2NjUgIFBTQjY0IFNDSS1BZGFwdGVyIEQzMngKLQlkNjY3ICBQU0I2NiBTQ0ktQWRhcHRlciBEMzN4Ci0xMWM5ICBNYWdtYQotCTAwMTAgIDE2LWxpbmUgc2VyaWFsIHBvcnQgdy8tIERNQQotCTAwMTEgIDQtbGluZSBzZXJpYWwgcG9ydCB3Ly0gRE1BCi0xMWNhICBMU0kgU3lzdGVtcywgSW5jCi0xMWNiICBTcGVjaWFsaXggUmVzZWFyY2ggTHRkLgotCTIwMDAgIFBDSV85MDUwCi0JCTExY2IgMDIwMCAgU1gKLQkJMTFjYiBiMDA4ICBJL084KwotCTQwMDAgIFNVUElfMQotCTgwMDAgIFQyMjUKLTExY2MgIE1pY2hlbHMgJiBLbGViZXJob2ZmIENvbXB1dGVyIEdtYkgKLTExY2QgIEhBTCBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0xMWNlICBOZXRhY2Nlc3MKLTExY2YgIFBpb25lZXIgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgotMTFkMCAgTG9ja2hlZWQgTWFydGluIEZlZGVyYWwgU3lzdGVtcy1NYW5hc3NhcwotMTFkMSAgQXVyYXZpc2lvbgotCTAxZjcgIFZ4UDUyNAotMTFkMiAgSW50ZXJjb20gSW5jLgotMTFkMyAgVHJhbmNlbGwgU3lzdGVtcyBJbmMKLTExZDQgIEFuYWxvZyBEZXZpY2VzCi0JMTUzNSAgQmxhY2tmaW4gQkY1MzUgcHJvY2Vzc29yCi0JMTgwNSAgU001NiBQQ0kgbW9kZW0KLQkxODg5ICBBRDE4ODkgc291bmQgY2hpcAotMTFkNSAgSWtvbiBDb3Jwb3JhdGlvbgotCTAxMTUgIDEwMTE1Ci0JMDExNyAgMTAxMTcKLTExZDYgIFRla2VsZWMgVGVsZWNvbQotMTFkNyAgVHJlbnRvbiBUZWNobm9sb2d5LCBJbmMuCi0xMWQ4ICBJbWFnZSBUZWNobm9sb2dpZXMgRGV2ZWxvcG1lbnQKLTExZDkgIFRFQyBDb3Jwb3JhdGlvbgotMTFkYSAgTm92ZWxsCi0xMWRiICBTZWdhIEVudGVycHJpc2VzIEx0ZAotMTFkYyAgUXVlc3RyYSBDb3Jwb3JhdGlvbgotMTFkZCAgQ3Jvc2ZpZWxkIEVsZWN0cm9uaWNzIExpbWl0ZWQKLTExZGUgIFpvcmFuIENvcnBvcmF0aW9uCi0JNjA1NyAgWlIzNjA1N1BRQyBWaWRlbyBjdXR0aW5nIGNoaXBzZXQKLQkJMTAzMSA3ZWZlICBEQzEwIFBsdXMKLQkJMTAzMSBmYzAwICBNaXJvVklERU8gREM1MCwgTW90aW9uIEpQRUcgQ2FwdHVyZS9DT0RFQyBCb2FyZAotCQkxM2NhIDQyMzEgIEpQRUcvVFYgQ2FyZAotCTYxMjAgIFpSMzYxMjAKLQkJMTMyOCBmMDAxICBDaW5lbWFzdGVyIEMgRFZEIERlY29kZXIKLTExZGYgIE5ldyBXYXZlIFBERwotMTFlMCAgQ3JheSBDb21tdW5pY2F0aW9ucyBBL1MKLTExZTEgIEdFQyBQbGVzc2V5IFNlbWkgSW5jLgotMTFlMiAgU2Ftc3VuZyBJbmZvcm1hdGlvbiBTeXN0ZW1zIEFtZXJpY2EKLTExZTMgIFF1aWNrbG9naWMgQ29ycG9yYXRpb24KLQk1MDMwICBQQyBXYXRjaGRvZwotMTFlNCAgU2Vjb25kIFdhdmUgSW5jCi0xMWU1ICBJSVggQ29uc3VsdGluZwotMTFlNiAgTWl0c3VpLVpvc2VuIFN5c3RlbSBSZXNlYXJjaAotMTFlNyAgVG9zaGliYSBBbWVyaWNhLCBFbGVjLiBDb21wYW55Ci0xMWU4ICBEaWdpdGFsIFByb2Nlc3NpbmcgU3lzdGVtcyBJbmMuCi0xMWU5ICBIaWdod2F0ZXIgRGVzaWducyBMdGQuCi0xMWVhICBFbHNhZyBCYWlsZXkKLTExZWIgIEZvcm1hdGlvbiBJbmMuCi0xMWVjICBDb3JlY28gSW5jCi0xMWVkICBNZWRpYW1hdGljcwotMTFlZSAgRG9tZSBJbWFnaW5nIFN5c3RlbXMgSW5jCi0xMWVmICBOaWNvbGV0IFRlY2hub2xvZ2llcyBCLlYuCi0xMWYwICBDb21wdS1TaGFjawotCTQyMzEgIEZEREkKLQk0MjMyICBGQVNUbGluZSBVVFAgUXVhdHRybwotCTQyMzMgIEZBU1RsaW5lIEZPCi0JNDIzNCAgRkFTVGxpbmUgVVRQCi0JNDIzNSAgRkFTVGxpbmUtSUkgVVRQCi0JNDIzNiAgRkFTVGxpbmUtSUkgRk8KLQk0NzMxICBHSUdBbGluZQotMTFmMSAgU3ltYmlvcyBMb2dpYyBJbmMKLTExZjIgIFBpY3R1cmUgVGVsIEphcGFuIEsuSy4KLTExZjMgIEtlaXRobGV5IE1ldHJhYnl0ZQotMTFmNCAgS2luZXRpYyBTeXN0ZW1zIENvcnBvcmF0aW9uCi0JMjkxNSAgQ0FNQUMgY29udHJvbGxlcgotMTFmNSAgQ29tcHV0aW5nIERldmljZXMgSW50ZXJuYXRpb25hbAotMTFmNiAgQ29tcGV4Ci0JMDExMiAgRU5ldDEwMFZHNAotCTAxMTMgIEZyZWVkb21MaW5lIDEwMAotCTE0MDEgIFJlYWR5TGluayAyMDAwCi0JMjAxMSAgUkwxMDAtQVRYIDEwLzEwMAotCQkxMWY2IDIwMTEgIFJMMTAwLUFUWAotCTIyMDEgIFJlYWR5TGluayAxMDBUWCAoV2luYm9uZCBXODlDODQwKQotCQkxMWY2IDIwMTEgIFJlYWR5TGluayAxMDBUWAotCTk4ODEgIFJMMTAwVFggRmFzdCBFdGhlcm5ldAotMTFmNyAgU2NpZW50aWZpYyBBdGxhbnRhCi0xMWY4ICBQTUMtU2llcnJhIEluYy4KLQk3Mzc1ICBQTTczNzUgW0xBU0FSLTE1NSBBVE0gU0FSXQotMTFmOSAgSS1DdWJlIEluYwotMTFmYSAgS2FzYW4gRWxlY3Ryb25pY3MgQ29tcGFueSwgTHRkLgotMTFmYiAgRGF0ZWwgSW5jCi0xMWZjICBTaWxpY29uIE1hZ2ljCi0xMWZkICBIaWdoIFN0cmVldCBDb25zdWx0YW50cwotMTFmZSAgQ29tdHJvbCBDb3Jwb3JhdGlvbgotCTAwMDEgIFJvY2tldFBvcnQgMzIgcG9ydCB3L2V4dGVybmFsIEkvRgotCTAwMDIgIFJvY2tldFBvcnQgOCBwb3J0IHcvZXh0ZXJuYWwgSS9GCi0JMDAwMyAgUm9ja2V0UG9ydCAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GCi0JMDAwNCAgUm9ja2V0UG9ydCA0IHBvcnQgdy9xdWFkIGNhYmxlCi0JMDAwNSAgUm9ja2V0UG9ydCA4IHBvcnQgdy9vY3RhIGNhYmxlCi0JMDAwNiAgUm9ja2V0UG9ydCA4IHBvcnQgdy9SSjExIGNvbm5lY3RvcnMKLQkwMDA3ICBSb2NrZXRQb3J0IDQgcG9ydCB3L1JKMTEgY29ubmVjdG9ycwotCTAwMDggIFJvY2tldFBvcnQgOCBwb3J0IHcvIERCNzggU05JIChTaWVtZW5zKSBjb25uZWN0b3IKLQkwMDA5ICBSb2NrZXRQb3J0IDE2IHBvcnQgdy8gREI3OCBTTkkgKFNpZW1lbnMpIGNvbm5lY3RvcgotCTAwMGEgIFJvY2tldFBvcnQgUGx1cyA0IHBvcnQKLQkwMDBiICBSb2NrZXRQb3J0IFBsdXMgOCBwb3J0Ci0JMDAwYyAgUm9ja2V0TW9kZW0gNiBwb3J0Ci0JMDAwZCAgUm9ja2V0TW9kZW0gNC1wb3J0Ci0JMDAwZSAgUm9ja2V0UG9ydCBQbHVzIDIgcG9ydCBSUzIzMgotCTAwMGYgIFJvY2tldFBvcnQgUGx1cyAyIHBvcnQgUlM0MjIKLQkwODAxICBSb2NrZXRQb3J0IFVQQ0kgMzIgcG9ydCB3L2V4dGVybmFsIEkvRgotCTA4MDIgIFJvY2tldFBvcnQgVVBDSSA4IHBvcnQgdy9leHRlcm5hbCBJL0YKLQkwODAzICBSb2NrZXRQb3J0IFVQQ0kgMTYgcG9ydCB3L2V4dGVybmFsIEkvRgotCTA4MDUgIFJvY2tldFBvcnQgVVBDSSA4IHBvcnQgdy9vY3RhIGNhYmxlCi0JMDgwYyAgUm9ja2V0TW9kZW0gSUlJIDggcG9ydAotCTA4MGQgIFJvY2tldE1vZGVtIElJSSA0IHBvcnQKLQkwOTAzICBSb2NrZXRQb3J0IENvbXBhY3QgUENJIDE2IHBvcnQgdy9leHRlcm5hbCBJL0YKLQk4MDE1ICBSb2NrZXRQb3J0IDQtcG9ydCBVQVJUIDE2OTU0Ci0xMWZmICBTY2lvbiBDb3Jwb3JhdGlvbgotCTAwMDMgIEFHLTUKLTEyMDAgIENTUyBDb3Jwb3JhdGlvbgotMTIwMSAgVmlzdGEgQ29udHJvbHMgQ29ycAotMTIwMiAgTmV0d29yayBHZW5lcmFsIENvcnAuCi0JNDMwMCAgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEyMDIgOTg0MSAgU0stOTg0MSBMWAotCQkxMjAyIDk4NDIgIFNLLTk4NDEgTFggZHVhbCBsaW5rCi0JCTEyMDIgOTg0MyAgU0stOTg0MyBTWAotCQkxMjAyIDk4NDQgIFNLLTk4NDMgU1ggZHVhbCBsaW5rCi0xMjAzICBCYXllciBDb3Jwb3JhdGlvbiwgQWdmYSBEaXZpc2lvbgotMTIwNCAgTGF0dGljZSBTZW1pY29uZHVjdG9yIENvcnBvcmF0aW9uCi0xMjA1ICBBcnJheSBDb3Jwb3JhdGlvbgotMTIwNiAgQW1kYWhsIENvcnBvcmF0aW9uCi0xMjA4ICBQYXJzeXRlYyBHbWJICi0JNDg1MyAgSFMtTGluayBEZXZpY2UKLTEyMDkgIFNDSSBTeXN0ZW1zIEluYwotMTIwYSAgU3luYXB0ZWwKLTEyMGIgIEFkYXB0aXZlIFNvbHV0aW9ucwotMTIwYyAgVGVjaG5pY2FsIENvcnAuCi0xMjBkICBDb21wcmVzc2lvbiBMYWJzLCBJbmMuCi0xMjBlICBDeWNsYWRlcyBDb3Jwb3JhdGlvbgotCTAxMDAgIEN5Y2xvbS1ZIGJlbG93IGZpcnN0IG1lZ2FieXRlCi0JMDEwMSAgQ3ljbG9tLVkgYWJvdmUgZmlyc3QgbWVnYWJ5dGUKLQkwMTAyICBDeWNsb20tNFkgYmVsb3cgZmlyc3QgbWVnYWJ5dGUKLQkwMTAzICBDeWNsb20tNFkgYWJvdmUgZmlyc3QgbWVnYWJ5dGUKLQkwMTA0ICBDeWNsb20tOFkgYmVsb3cgZmlyc3QgbWVnYWJ5dGUKLQkwMTA1ICBDeWNsb20tOFkgYWJvdmUgZmlyc3QgbWVnYWJ5dGUKLQkwMjAwICBDeWNsYWRlcy1aIGJlbG93IGZpcnN0IG1lZ2FieXRlCi0JMDIwMSAgQ3ljbGFkZXMtWiBhYm92ZSBmaXJzdCBtZWdhYnl0ZQotCTAzMDAgIFBDMzAwL1JTViBvciAvWDIxICgyIHBvcnRzKQotCTAzMDEgIFBDMzAwL1JTViBvciAvWDIxICgxIHBvcnQpCi0JMDMxMCAgUEMzMDAvVEUgKDIgcG9ydHMpCi0JMDMxMSAgUEMzMDAvVEUgKDEgcG9ydCkKLQkwMzIwICBQQzMwMC9URS1NICgyIHBvcnRzKQotCTAzMjEgIFBDMzAwL1RFLU0gKDEgcG9ydCkKLQkwNDAwICBQQzQwMAotMTIwZiAgRXNzZW50aWFsIENvbW11bmljYXRpb25zCi0JMDAwMSAgUm9hZHJ1bm5lciBzZXJpYWwgSElQUEkKLTEyMTAgIEh5cGVycGFyYWxsZWwgVGVjaG5vbG9naWVzCi0xMjExICBCcmFpbnRlY2ggSW5jCi0xMjEyICBLaW5nc3RvbiBUZWNobm9sb2d5IENvcnAuCi0xMjEzICBBcHBsaWVkIEludGVsbGlnZW50IFN5c3RlbXMsIEluYy4KLTEyMTQgIFBlcmZvcm1hbmNlIFRlY2hub2xvZ2llcywgSW5jLgotMTIxNSAgSW50ZXJ3YXJlIENvLiwgTHRkCi0xMjE2ICBQdXJ1cCBQcmVwcmVzcyBBL1MKLTEyMTcgIE8yIE1pY3JvLCBJbmMuCi0JNjcyOSAgT1o2NzI5Ci0JNjczYSAgT1o2NzMwCi0JNjgzMiAgT1o2ODMyLzY4MzMgQ2FyZEJ1cyBDb250cm9sbGVyCi0JNjgzNiAgT1o2ODM2LzY4NjAgQ2FyZEJ1cyBDb250cm9sbGVyCi0JNjg3MiAgT1o2ODEyIENhcmRCdXMgQ29udHJvbGxlcgotCTY5MjUgIE9aNjkyMiBDYXJkQnVzIENvbnRyb2xsZXIKLQk2OTMzICBPWjY5MzMvNzExRTEgQ2FyZEJ1cy9TbWFydENhcmRCdXMgQ29udHJvbGxlcgotCQkxMDI1IDEwMTYgIFRyYXZlbG1hdGUgNjEyIFRYCi0JNjk3MiAgT1o2MDEvNjkxMi83MTFFMCBDYXJkQnVzL1NtYXJ0Q2FyZEJ1cyBDb250cm9sbGVyCi0JCTEwMTQgMDIwYyAgVGhpbmtQYWQgUjMwCi0JCTExNzkgMDAwMSAgTWFnbmlhIFozMTAKLQk3MTEwICBPWjcxMU14IDQtaW4tMSBNZW1vcnlDYXJkQnVzIEFjY2VsZXJhdG9yCi0JCTEwM2MgMDg4YyAgbmM4MDAwIGxhcHRvcAotCQkxMDNjIDA4OTAgIG5jNjAwMCBsYXB0b3AKLQk3MTEyICBPWjcxMUVDMS9NMSBTbWFydENhcmRCdXMvTWVtb3J5Q2FyZEJ1cyBDb250cm9sbGVyCi0JNzExMyAgT1o3MTFFQzEgU21hcnRDYXJkQnVzIENvbnRyb2xsZXIKLQk3MTE0ICBPWjcxMU0xL01DMSA0LWluLTEgTWVtb3J5Q2FyZEJ1cyBDb250cm9sbGVyCi0JNzEzNCAgT1o3MTFNUDEvTVMxIE1lbW9yeUNhcmRCdXMgQ29udHJvbGxlcgotCTcxZTIgIE9aNzExRTIgU21hcnRDYXJkQnVzIENvbnRyb2xsZXIKLQk3MjEyICBPWjcxMU0yIDQtaW4tMSBNZW1vcnlDYXJkQnVzIENvbnRyb2xsZXIKLQk3MjEzICBPWjY5MzNFIENhcmRCdXMgQ29udHJvbGxlcgotCTcyMjMgIE9aNzExTTMvTUMzIDQtaW4tMSBNZW1vcnlDYXJkQnVzIENvbnRyb2xsZXIKLQkJMTAzYyAwODhjICBuYzgwMDAgbGFwdG9wCi0JCTEwM2MgMDg5MCAgbmM2MDAwIGxhcHRvcAotCTcyMzMgIE9aNzExTVAzL01TMyA0LWluLTEgTWVtb3J5Q2FyZEJ1cyBDb250cm9sbGVyCi0xMjE4ICBIeWJyaWNvbiBDb3JwLgotMTIxOSAgRmlyc3QgVmlydHVhbCBDb3Jwb3JhdGlvbgotMTIxYSAgM0RmeCBJbnRlcmFjdGl2ZSwgSW5jLgotCTAwMDEgIFZvb2RvbwotCTAwMDIgIFZvb2RvbyAyCi0JMDAwMyAgVm9vZG9vIEJhbnNoZWUKLQkJMTA5MiAwMDAzICBNb25zdGVyIEZ1c2lvbgotCQkxMDkyIDQwMDAgIE1vbnN0ZXIgRnVzaW9uCi0JCTEwOTIgNDAwMiAgTW9uc3RlciBGdXNpb24KLQkJMTA5MiA0ODAxICBNb25zdGVyIEZ1c2lvbiBBR1AKLQkJMTA5MiA0ODAzICBNb25zdGVyIEZ1c2lvbiBBR1AKLQkJMTA5MiA4MDMwICBNb25zdGVyIEZ1c2lvbgotCQkxMDkyIDgwMzUgIE1vbnN0ZXIgRnVzaW9uIEFHUAotCQkxMGIwIDAwMDEgIERyYWdvbiA0MDAwCi0JCTExMDIgMTAxOCAgM0QgQmxhc3RlciBCYW5zaGVlIFZFCi0JCTEyMWEgMDAwMSAgVm9vZG9vIEJhbnNoZWUgQUdQCi0JCTEyMWEgMDAwMyAgVm9vZG9vIEJhbnNoZWUgQUdQIFNHUkFNCi0JCTEyMWEgMDAwNCAgVm9vZG9vIEJhbnNoZWUKLQkJMTM5YyAwMDE2ICBSYXZlbgotCQkxMzljIDAwMTcgIFJhdmVuCi0JCTE0YWYgMDAwMiAgTWF4aSBHYW1lciBQaG9lbml4Ci0JMDAwNCAgVm9vZG9vIEJhbnNoZWUgW1ZlbG9jaXR5IDEwMF0KLQkwMDA1ICBWb29kb28gMwotCQkxMjFhIDAwMDQgIFZvb2RvbzMgQUdQCi0JCTEyMWEgMDAzMCAgVm9vZG9vMyBBR1AKLQkJMTIxYSAwMDMxICBWb29kb28zIEFHUAotCQkxMjFhIDAwMzQgIFZvb2RvbzMgQUdQCi0JCTEyMWEgMDAzNiAgVm9vZG9vMyAyMDAwIFBDSQotCQkxMjFhIDAwMzcgIFZvb2RvbzMgQUdQCi0JCTEyMWEgMDAzOCAgVm9vZG9vMyBBR1AKLQkJMTIxYSAwMDNhICBWb29kb28zIEFHUAotCQkxMjFhIDAwNDQgIFZvb2RvbzMKLQkJMTIxYSAwMDRiICBWZWxvY2l0eSAxMDAKLQkJMTIxYSAwMDRjICBWZWxvY2l0eSAyMDAKLQkJMTIxYSAwMDRkICBWb29kb28zIEFHUAotCQkxMjFhIDAwNGUgIFZvb2RvbzMgQUdQCi0JCTEyMWEgMDA1MSAgVm9vZG9vMyBBR1AKLQkJMTIxYSAwMDUyICBWb29kb28zIEFHUAotCQkxMjFhIDAwNjAgIFZvb2RvbzMgMzUwMCBUViAoTlRTQykKLQkJMTIxYSAwMDYxICBWb29kb28zIDM1MDAgVFYgKFBBTCkKLQkJMTIxYSAwMDYyICBWb29kb28zIDM1MDAgVFYgKFNFQ0FNKQotCTAwMDkgIFZvb2RvbyA0IC8gVm9vZG9vIDUKLQkJMTIxYSAwMDAzICBWb29kb281IFBDSSA1NTAwCi0JCTEyMWEgMDAwOSAgVm9vZG9vNSBBR1AgNTUwMC82MDAwCi0JMDA1NyAgVm9vZG9vIDMvMzAwMCBbQXZlbmdlcl0KLTEyMWIgIEFkdmFuY2VkIFRlbGVjb21tdW5pY2F0aW9ucyBNb2R1bGVzCi0xMjFjICBOaXBwb24gVGV4YWNvLiwgTHRkCi0xMjFkICBMaXBwZXJ0IEF1dG9tYXRpb25zdGVjaG5payBHbWJICi0xMjFlICBDU1BJCi0xMjFmICBBcmN1cyBUZWNobm9sb2d5LCBJbmMuCi0xMjIwICBBcmllbCBDb3Jwb3JhdGlvbgotCTEyMjAgIEFNQ0MgNTkzMyBUTVMzMjBDODAgRFNQL0ltYWdpbmcgYm9hcmQKLTEyMjEgIENvbnRlYyBDby4sIEx0ZAotMTIyMiAgQW5jb3IgQ29tbXVuaWNhdGlvbnMsIEluYy4KLTEyMjMgIEFydGVzeW4gQ29tbXVuaWNhdGlvbiBQcm9kdWN0cwotCTAwMDMgIFBNL0xpbmsKLQkwMDA0ICBQTS9UMQotCTAwMDUgIFBNL0UxCi0JMDAwOCAgUE0vU0xTCi0JMDAwOSAgQmFqYVNwYW4gUmVzb3VyY2UgVGFyZ2V0Ci0JMDAwYSAgQmFqYVNwYW4gU2VjdGlvbiAwCi0JMDAwYiAgQmFqYVNwYW4gU2VjdGlvbiAxCi0JMDAwYyAgQmFqYVNwYW4gU2VjdGlvbiAyCi0JMDAwZCAgQmFqYVNwYW4gU2VjdGlvbiAzCi0JMDAwZSAgUE0vUFBDCi0xMjI0ICBJbnRlcmFjdGl2ZSBJbWFnZXMKLTEyMjUgIFBvd2VyIEkvTywgSW5jLgotMTIyNyAgVGVjaC1Tb3VyY2UKLQkwMDA2ICBSYXB0b3IgR0ZYIDhQCi0xMjI4ICBOb3JzayBFbGVrdHJvIE9wdGlrayBBL1MKLTEyMjkgIERhdGEgS2luZXNpcyBJbmMuCi0xMjJhICBJbnRlZ3JhdGVkIFRlbGVjb20KLTEyMmIgIExHIEluZHVzdHJpYWwgU3lzdGVtcyBDby4sIEx0ZAotMTIyYyAgU2ljYW4gR21iSAotMTIyZCAgQXp0ZWNoIFN5c3RlbSBMdGQKLQkxMjA2ICAzNjhEU1AKLQkxNDAwICBUcmlkZW50IFBDSTI4OC1RM0RJSSAoTlgpCi0JNTBkYyAgMzMyOCBBdWRpbwotCQkxMjJkIDAwMDEgIDMzMjggQXVkaW8KLQk4MGRhICAzMzI4IEF1ZGlvCi0JCTEyMmQgMDAwMSAgMzMyOCBBdWRpbwotMTIyZSAgWHlyYXRleAotMTIyZiAgQW5kcmV3IENvcnBvcmF0aW9uCi0xMjMwICBGaXNoY2FtcCBFbmdpbmVlcmluZwotMTIzMSAgV29vZHdhcmQgTWNDb2FjaCwgSW5jLgotMTIzMiAgR1BUIExpbWl0ZWQKLTEyMzMgIEJ1cy1UZWNoLCBJbmMuCi0xMjM0ICBUZWNobmljYWwgQ29ycC4KLTEyMzUgIFJpc3EgTW9kdWxhciBTeXN0ZW1zLCBJbmMuCi0xMjM2ICBTaWdtYSBEZXNpZ25zIENvcnBvcmF0aW9uCi0JMDAwMCAgUmVhbE1hZ2ljNjQvR1gKLQk2NDAxICBSRUFMbWFnaWMgNjQvR1ggKFNEIDY0MjUpCi0xMjM3ICBBbHRhIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KLTEyMzggIEFkdHJhbgotMTIzOSAgM0RPIENvbXBhbnkKLTEyM2EgIFZpc2ljb20gTGFib3JhdG9yaWVzLCBJbmMuCi0xMjNiICBTZWVxIFRlY2hub2xvZ3ksIEluYy4KLTEyM2MgIENlbnR1cnkgU3lzdGVtcywgSW5jLgotMTIzZCAgRW5naW5lZXJpbmcgRGVzaWduIFRlYW0sIEluYy4KLQkwMDAwICBFYXN5Q29ubmVjdCA4LzMyCi0JMDAwMiAgRWFzeUNvbm5lY3QgOC82NAotCTAwMDMgIEVhc3lJTwotMTIzZSAgU2ltdXRlY2gsIEluYy4KLTEyM2YgIEMtQ3ViZSBNaWNyb3N5c3RlbXMKLQkwMGU0ICBNUEVHCi0JODEyMCAgRTQ/Ci0JCTExYmQgMDAwNiAgRFY1MDAgRTQKLQkJMTFiZCAwMDBhICBEVjUwMCBFNAotCQkxMWJkIDAwMGYgIERWNTAwIEU0Ci0JODg4OCAgQ2luZW1hc3RlciBDIDMuMCBEVkQgRGVjb2RlcgotCQkxMDAyIDAwMDEgIENpbmVtYXN0ZXIgQyAzLjAgRFZEIERlY29kZXIKLQkJMTAwMiAwMDAyICBDaW5lbWFzdGVyIEMgMy4wIERWRCBEZWNvZGVyCi0JCTEzMjggMDAwMSAgQ2luZW1hc3RlciBDIDMuMCBEVkQgRGVjb2RlcgotMTI0MCAgTWFyYXRob24gVGVjaG5vbG9naWVzIENvcnAuCi0xMjQxICBEU0MgQ29tbXVuaWNhdGlvbnMKLSMgRm9ybWVybHkgSmF5Y29yIE5ldHdvcmtzLCBJbmMuCi0xMjQyICBKTkkgQ29ycG9yYXRpb24KLQkxNTYwICBKTklDLTE1NjAgUENJLVggRmlicmUgQ2hhbm5lbCBDb250cm9sbGVyCi0JCTEyNDIgNjU2MiAgRkNYMi02NTYyIER1YWwgQ2hhbm5lbCBQQ0ktWCBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQkJMTI0MiA2NTZhICBGQ1gtNjU2MiBQQ0ktWCBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQk0NjQzICBGQ0ktMTA2MyBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQk2NTYyICBGQ1gyLTY1NjIgRHVhbCBDaGFubmVsIFBDSS1YIEZpYnJlIENoYW5uZWwgQWRhcHRlcgotCTY1NmEgIEZDWC02NTYyIFBDSS1YIEZpYnJlIENoYW5uZWwgQWRhcHRlcgotMTI0MyAgRGVscGhheAotMTI0NCAgQVZNIEF1ZGlvdmlzdWVsbGVzIE1LVEcgJiBDb21wdXRlciBTeXN0ZW0gR21iSAotCTA3MDAgIEIxIElTRE4KLQkwODAwICBDNCBJU0ROCi0JMGEwMCAgQTEgSVNETiBbRnJpdHpdCi0JCTEyNDQgMGEwMCAgRlJJVFohQ2FyZCBJU0ROIENvbnRyb2xsZXIKLQkwZTAwICBGcml0eiFQQ0kgdjIuMCBJU0ROCi0JMTEwMCAgQzIgSVNETgotCTEyMDAgIFQxIElTRE4KLQkyNzAwICBGcml0eiFDYXJkIERTTCBTTAotCTI5MDAgIEZyaXR6IUNhcmQgRFNMIHYyLjAKLTEyNDUgIEEuUC5ELiwgUy5BLgotMTI0NiAgRGlwaXggVGVjaG5vbG9naWVzLCBJbmMuCi0xMjQ3ICBYeWxvbiBSZXNlYXJjaCwgSW5jLgotMTI0OCAgQ2VudHJhbCBEYXRhIENvcnBvcmF0aW9uCi0xMjQ5ICBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotMTI0YSAgQUVHIEVsZWN0cm9jb20gR21iSAotMTI0YiAgU0JTL0dyZWVuc3ByaW5nIE1vZHVsYXIgSS9PCi0JMDA0MCAgUENJLTQwQSBvciBjUENJLTIwMCBRdWFkIEluZHVzdHJ5UGFjayBjYXJyaWVyCi0JCTEyNGIgOTA4MCAgUENJOTA4MCBCcmlkZ2UKLTEyNGMgIFNvbGl0cm9uIFRlY2hub2xvZ2llcywgSW5jLgotMTI0ZCAgU3RhbGxpb24gVGVjaG5vbG9naWVzLCBJbmMuCi0JMDAwMCAgRWFzeUNvbm5lY3Rpb24gOC8zMgotCTAwMDIgIEVhc3lDb25uZWN0aW9uIDgvNjQKLQkwMDAzICBFYXN5SU8KLQkwMDA0ICBFYXN5Q29ubmVjdGlvbi9SQQotMTI0ZSAgQ3lsaW5rCi0xMjRmICBJbmZvcnRyZW5kIFRlY2hub2xvZ3ksIEluYy4KLQkwMDQxICBJRlQtMjAwMCBTZXJpZXMgUkFJRCBDb250cm9sbGVyCi0xMjUwICBIaXRhY2hpIE1pY3JvY29tcHV0ZXIgU3lzdGVtIEx0ZAotMTI1MSAgVkxTSSBTb2x1dGlvbnMgT3kKLTEyNTMgIEd1emlrIFRlY2huaWNhbCBFbnRlcnByaXNlcwotMTI1NCAgTGluZWFyIFN5c3RlbXMgTHRkLgotMTI1NSAgT3B0aWJhc2UgTHRkCi0JMTExMCAgTVBFRyBGb3JnZQotCTEyMTAgIE1QRUcgRnVzaW9uCi0JMjExMCAgVmlkZW9QbGV4Ci0JMjEyMCAgVmlkZW9QbGV4IENDCi0JMjEzMCAgVmlkZW9RdWVzdAotMTI1NiAgUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4KLQk0MjAxICBQQ0ktMjIyMEkKLQk0NDAxICBQQ0ktMjI0MEkKLQk1MjAxICBQQ0ktMjAwMAotMTI1NyAgVmVydGV4IE5ldHdvcmtzLCBJbmMuCi0xMjU4ICBHaWxiYXJjbywgSW5jLgotMTI1OSAgQWxsaWVkIFRlbGVzeW4gSW50ZXJuYXRpb25hbAotCTI1NjAgIEFULTI1NjAgRmFzdCBFdGhlcm5ldCBBZGFwdGVyIChpODI1NTdCKQotCWExMTcgIFJUTDgxeHggRmFzdCBFdGhlcm5ldAotCWExMjAgIDIxeDR4IERFQy1UdWxpcCBjb21wYXRpYmxlIDEwLzEwMCBFdGhlcm5ldAotMTI1YSAgQUJCIFBvd2VyIFN5c3RlbXMKLTEyNWIgIEFzaXggRWxlY3Ryb25pY3MgQ29ycG9yYXRpb24KLQkxNDAwICBBTEZBIEdGQzIyMDQgRmFzdCBFdGhlcm5ldAotMTI1YyAgQXVyb3JhIFRlY2hub2xvZ2llcywgSW5jLgotCTAxMDEgIFNhdHVybiA0NTIwUAotCTA2NDAgIEFyaWVzIDE2MDAwUAotMTI1ZCAgRVNTIFRlY2hub2xvZ3kKLQkwMDAwICBFUzMzNkggRmF4IE1vZGVtIChFYXJseSBNb2RlbCkKLQkxOTQ4ICBTb2xvPwotCTE5NjggIEVTMTk2OCBNYWVzdHJvIDIKLQkJMTAyOCAwMDg1ICBFUzE5NjggTWFlc3Ryby0yIFBDSQotCQkxMDMzIDgwNTEgIEVTMTk2OCBNYWVzdHJvLTIgQXVkaW9kcml2ZQotCTE5NjkgIEVTMTk2OSBTb2xvLTEgQXVkaW9kcml2ZQotCQkxMDE0IDAxNjYgIEVTMTk2OSBTT0xPLTEgQXVkaW9Ecml2ZSBvbiBJQk0gQXB0aXZhIE1haW5ib2FyZAotCQkxMjVkIDg4ODggIFNvbG8tMSBBdWRpbyBBZGFwdGVyCi0JCTE1M2IgMTExYiAgVGVycmF0ZWMgMTI4aSBQQ0kKLQkxOTc4ICBFUzE5NzggTWFlc3RybyAyRQotCQkwZTExIGIxMTIgIEFybWFkYSBNNzAwL0U1MDAKLQkJMTAzMyA4MDNjICBFUzE5NzggTWFlc3Ryby0yRSBBdWRpb2RyaXZlCi0JCTEwMzMgODA1OCAgRVMxOTc4IE1hZXN0cm8tMkUgQXVkaW9kcml2ZQotCQkxMDkyIDQwMDAgIE1vbnN0ZXIgU291bmQgTVg0MDAKLQkJMTE3OSAwMDAxICBFUzE5NzggTWFlc3Ryby0yRSBBdWRpb2RyaXZlCi0JMTk4OCAgRVMxOTg4IEFsbGVncm8tMQotCQkxMDkyIDQxMDAgIFNvbmljIEltcGFjdCBTMTAwCi0JCTEyNWQgMTk4OCAgRVNTIEFsbGVncm8tMSBBdWRpb2RyaXZlCi0JMTk4OSAgRVNTIE1vZGVtCi0JCTEyNWQgMTk4OSAgRVNTIE1vZGVtCi0JMTk5OCAgRVMxOTgzUyBNYWVzdHJvLTNpIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxMDI4IDAwYjEgIExhdGl0dWRlIEM2MDAKLQkJMTAyOCAwMGU2ICBFUzE5ODNTIE1hZXN0cm8tM2kgKERlbGwgSW5zcGlyb24gODEwMCkKLQkxOTk5ICBFUzE5ODNTIE1hZXN0cm8tM2kgUENJIE1vZGVtIEFjY2VsZXJhdG9yCi0JMTk5YSAgRVMxOTgzUyBNYWVzdHJvLTNpIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCTE5OWIgIEVTMTk4M1MgTWFlc3Ryby0zaSBQQ0kgTW9kZW0gQWNjZWxlcmF0b3IKLQkyODA4ICBFUzMzNkggRmF4IE1vZGVtIChMYXRlciBNb2RlbCkKLQkyODM4ICBFUzI4MzgvMjgzOSBTdXBlckxpbmsgTW9kZW0KLQkyODk4ICBFUzI4OTggTW9kZW0KLQkJMTI1ZCAwNDI0ICBFUzU2LVBJIERhdGEgRmF4IE1vZGVtCi0JCTEyNWQgMDQyNSAgRVM1NlQtUEkgRGF0YSBGYXggTW9kZW0KLQkJMTI1ZCAwNDI2ICBFUzU2Vi1QSSBEYXRhIEZheCBNb2RlbQotCQkxMjVkIDA0MjcgIFZXLVBJIERhdGEgRmF4IE1vZGVtCi0JCTEyNWQgMDQyOCAgRVM1NlNULVBJIERhdGEgRmF4IE1vZGVtCi0JCTEyNWQgMDQyOSAgRVM1NlNWLVBJIERhdGEgRmF4IE1vZGVtCi0JCTE0N2EgYzAwMSAgRVM1Ni1QSSBEYXRhIEZheCBNb2RlbQotCQkxNGZlIDA0MjggIEVTNTYtUEkgRGF0YSBGYXggTW9kZW0KLQkJMTRmZSAwNDI5ICBFUzU2LVBJIERhdGEgRmF4IE1vZGVtCi0xMjVlICBTcGVjaWFsdmlkZW8gRW5naW5lZXJpbmcgU1JMCi0xMjVmICBDb25jdXJyZW50IFRlY2hub2xvZ2llcywgSW5jLgotMTI2MCAgSW50ZXJzaWwgQ29ycG9yYXRpb24KLQkzODcyICBQcmlzbSAyLjUgV2F2ZWxhbiBjaGlwc2V0Ci0JCTE0NjggMDIwMiAgTEFOLUV4cHJlc3MgSUVFRSA4MDIuMTFiIFdpcmVsZXNzIExBTgotCTM4NzMgIFByaXNtIDIuNSBXYXZlbGFuIGNoaXBzZXQKLQkJMTE4NiAzNTAxICBEV0wtNTIwIFdpcmVsZXNzIFBDSSBBZGFwdGVyCi0JCTExODYgMzcwMCAgRFdMLTUyMCBXaXJlbGVzcyBQQ0kgQWRhcHRlciwgUmV2IEUxCi0JCTEzODUgNDEwNSAgTUEzMTEgODAyLjExYiB3aXJlbGVzcyBhZGFwdGVyCi0JCTE2NjggMDQxNCAgSFdQMDExNzAtMDEgODAyLjExYiBQQ0kgV2lyZWxlc3MgQWRhcHRlcgotCQkxNmE1IDE2MDEgIEFJUi5tYXRlIFBDLTQwMCBQQ0kgV2lyZWxlc3MgTEFOIEFkYXB0ZXIKLQkJMTczNyAzODc0ICBXTVAxMSBXaXJlbGVzcyA4MDIuMTFiIFBDSSBBZGFwdGVyCi0JCTgwODYgMjUxMyAgV2lyZWxlc3MgODAyLjExYiBNaW5pUENJIEFkYXB0ZXIKLQkzODg2ICBJU0wzODg2IFtQcmlzbSBKYXZlbGluL1ByaXNtIFhib3ddCi0JCTE3Y2YgMDAzNyAgWi1Db20gWEctOTAxIGFuZCBjbG9uZXMgV2lyZWxlc3MgQWRhcHRlcgotCTM4OTAgIEludGVyc2lsIElTTDM4OTAgW1ByaXNtIEdUL1ByaXNtIER1ZXR0ZV0KLQkJMTBiOCAyODAyICBTTUMyODAyVyBXaXJlbGVzcyBQQ0kgQWRhcHRlcgotCQkxMGI4IDI4MzUgIFNNQzI4MzVXIFdpcmVsZXNzIENhcmRidXMgQWRhcHRlcgotCQkxMGI4IGE4MzUgIFNNQzI4MzVXIFYyIFdpcmVsZXNzIENhcmRidXMgQWRhcHRlcgotCQkxMTEzIGVlMDMgIFNNQzI4MDJXIFYyIFdpcmVsZXNzIFBDSSBBZGFwdGVyCi0JCTExMTMgZWUwOCAgU01DMjgzNVcgVjMgRVUgV2lyZWxlc3MgQ2FyZGJ1cyBBZGFwdGVyCi0JCTExODYgMzIwMiAgRFdMLUc2NTAgQTEgV2lyZWxlc3MgQWRhcHRlcgotCQkxMjU5IGMxMDQgIENHLVdMQ0I1NEdUIFdpcmVsZXNzIEFkYXB0ZXIKLQkJMTM4NSA0ODAwICBXRzUxMSBXaXJlbGVzcyBBZGFwdGVyCi0JCTE2YTUgMTYwNSAgQUxMTkVUIEFMTDAyNzEgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQkJMTdjZiAwMDE0ICBaLUNvbSBYRy02MDAgYW5kIGNsb25lcyBXaXJlbGVzcyBBZGFwdGVyCi0JCTE3Y2YgMDAyMCAgWi1Db20gWEctOTAwIGFuZCBjbG9uZXMgV2lyZWxlc3MgQWRhcHRlcgotCTgxMzAgIEhNUDgxMzAgTlRTQy9QQUwgVmlkZW8gRGVjb2RlcgotCTgxMzEgIEhNUDgxMzEgTlRTQy9QQUwgVmlkZW8gRGVjb2RlcgotMTI2MSAgTWF0c3VzaGl0YS1Lb3RvYnVraSBFbGVjdHJvbmljcyBJbmR1c3RyaWVzLCBMdGQuCi0xMjYyICBFUyBDb21wdXRlciBDb21wYW55LCBMdGQuCi0xMjYzICBTb25pYyBTb2x1dGlvbnMKLTEyNjQgIEF2YWwgTmFnYXNha2kgQ29ycG9yYXRpb24KLTEyNjUgIENhc2lvIENvbXB1dGVyIENvLiwgTHRkLgotMTI2NiAgTWljcm9keW5lIENvcnBvcmF0aW9uCi0JMDAwMSAgTkUxMC8xMDAgQWRhcHRlciAoaTgyNTU3QikKLQkxOTEwICBORTIwMDBQbHVzIChSVDgwMjkpIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTI2NiAxOTEwICBORTIwMDBQbHVzIEV0aGVybmV0IEFkYXB0ZXIKLTEyNjcgIFMuIEEuIFRlbGVjb21tdW5pY2F0aW9ucwotCTUzNTIgIFBDUjIxMDEKLQk1YTRiICBUZWxzYXQgVHVyYm8KLTEyNjggIFRla3Ryb25peAotMTI2OSAgVGhvbXNvbi1DU0YvVFRNCi0xMjZhICBMZXhtYXJrIEludGVybmF0aW9uYWwsIEluYy4KLTEyNmIgIEFkYXgsIEluYy4KLTEyNmMgIE5vcnRoZXJuIFRlbGVjb20KLQkxMjExICAxMC8xMDBCYXNlVFggW1JUTDgxeHhdCi0JMTI2YyAgODAyLjExYiBXaXJlbGVzcyBFdGhlcm5ldCBBZGFwdGVyCi0xMjZkICBTcGxhc2ggVGVjaG5vbG9neSwgSW5jLgotMTI2ZSAgU3VtaXRvbW8gTWV0YWwgSW5kdXN0cmllcywgTHRkLgotMTI2ZiAgU2lsaWNvbiBNb3Rpb24sIEluYy4KLQkwNTAxICBTTTUwMSBWb3lhZ2VyR1gKLQkwNzEwICBTTTcxMCBMeW54RU0KLQkwNzEyICBTTTcxMiBMeW54RU0rCi0JMDcyMCAgU003MjAgTHlueDNETQotCTA3MzAgIFNNNzMxIENvdWdhcjNEUgotCTA4MTAgIFNNODEwIEx5bnhFCi0JMDgxMSAgU004MTEgTHlueEUKLQkwODIwICBTTTgyMCBMeW54M0QKLQkwOTEwICBTTTkxMAotMTI3MCAgT2x5bXB1cyBPcHRpY2FsIENvLiwgTHRkLgotMTI3MSAgR1cgSW5zdHJ1bWVudHMKLTEyNzIgIFRlbGVtYXRpY3MgSW50ZXJuYXRpb25hbAotMTI3MyAgSHVnaGVzIE5ldHdvcmsgU3lzdGVtcwotCTAwMDIgIERpcmVjUEMKLTEyNzQgIEVuc29uaXEKLQkxMTcxICBFUzEzNzMgW0F1ZGlvUENJXSAoYWxzbyBDcmVhdGl2ZSBMYWJzIENUNTgwMykKLQkxMzcxICBFUzEzNzEgW0F1ZGlvUENJLTk3XQotCQkwZTExIDAwMjQgIEF1ZGlvUENJIG9uIE1vdGhlcmJvYXJkIENvbXBhcSBEZXNrcHJvCi0JCTBlMTEgYjFhNyAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kKLQkJMTAzMyA4MGFjICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSQotCQkxMDQyIDE4NTQgIFRhemVyCi0JCTEwN2IgODA1NCAgVGFib3IyCi0JCTEyNzQgMTM3MSAgQ3JlYXRpdmUgU291bmQgQmxhc3RlciBBdWRpb1BDSTY0ViwgQXVkaW9QQ0kxMjgKLQkJMTQ2MiA2NDcwICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBNUy02MTQ3IDEuMUEKLQkJMTQ2MiA2NTYwICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBNUy02MTU2IDEuMTAKLQkJMTQ2MiA2NjMwICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBNUy02MTYzQlggMS4wQQotCQkxNDYyIDY2MzEgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1TLTYxNjNWSUEgMS4wQQotCQkxNDYyIDY2MzIgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1TLTYxNjNCWCAyLjBBCi0JCTE0NjIgNjYzMyAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgTVMtNjE2M1ZJQSAyLjBBCi0JCTE0NjIgNjgyMCAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgTVMtNjE4MiAxLjAwCi0JCTE0NjIgNjgyMiAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgTVMtNjE4MiAxLjAwQQotCQkxNDYyIDY4MzAgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1TLTYxODMgMS4wMAotCQkxNDYyIDY4ODAgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1TLTYxODggMS4wMAotCQkxNDYyIDY5MDAgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1TLTYxOTAgMS4wMAotCQkxNDYyIDY5MTAgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1TLTYxOTEKLQkJMTQ2MiA2OTMwICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBNUy02MTkzCi0JCTE0NjIgNjk5MCAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgTVMtNjE5OUJYIDIuMEEKLQkJMTQ2MiA2OTkxICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBNUy02MTk5VklBIDIuMEEKLQkJMTRhNCAyMDc3ICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBLUjYzOQotCQkxNGE0IDIxMDUgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1SODAwCi0JCTE0YTQgMjEwNyAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgTVI4MDEKLQkJMTRhNCAyMTcyICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBEUjczOQotCQkxNTA5IDk5MDIgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIEtXMTEKLQkJMTUwOSA5OTAzICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBLVzMxCi0JCTE1MDkgOTkwNCAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgS0ExMQotCQkxNTA5IDk5MDUgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIEtDMTMKLQkJMTUyZCA4ODAxICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBDUDgxMEUKLQkJMTUyZCA4ODAyICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBDUDgxMAotCQkxNTJkIDg4MDMgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIFAzODEwRQotCQkxNTJkIDg4MDQgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIFAzODEwLVMKLQkJMTUyZCA4ODA1ICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBQMzgyMC1TCi0JCTI3MGYgMjAwMSAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgNkNUUgotCQkyNzBmIDIyMDAgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIDZXVFgKLQkJMjcwZiAzMDAwICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCA2V1NWCi0JCTI3MGYgMzEwMCAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgNldJVjIKLQkJMjcwZiAzMTAyICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCA2V0lWCi0JCTI3MGYgNzA2MCAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgNkFTQTIKLQkJODA4NiA0MjQ5ICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBCSTQ0MFpYCi0JCTgwODYgNDI0YyAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgQkw0NDBaWAotCQk4MDg2IDQyNWEgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIEJaNDQwWlgKLQkJODA4NiA0MzQxICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBDYXltYW4KLQkJODA4NiA0MzQzICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBDYXBlIENvZAotCQk4MDg2IDQ2NDkgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIEZpcmUgSXNsYW5kCi0JCTgwODYgNDY0YSAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgRko0NDBaWAotCQk4MDg2IDRkNGYgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1vbnRyZWFsCi0JCTgwODYgNGY0MyAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgT0M0NDBMWAotCQk4MDg2IDUyNDMgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIFJDNDQwQlgKLQkJODA4NiA1MzUyICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBTdW5SaXZlcgotCQk4MDg2IDU2NDMgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIFZhbmNvdXZlcgotCQk4MDg2IDU3NTMgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIFdTNDQwQlgKLQk1MDAwICBFUzEzNzAgW0F1ZGlvUENJXQotCTU4ODAgIDU4ODAgQXVkaW9QQ0kKLQkJMTI3NCAyMDAwICBDcmVhdGl2ZSBTb3VuZCBCbGFzdGVyIEF1ZGlvUENJMTI4Ci0JCTEyNzQgMjAwMyAgQ3JlYXRpdmUgU291bmRCbGFzdGVyIEF1ZGlvUENJIDEyOAotCQkxMjc0IDU4ODAgIENyZWF0aXZlIFNvdW5kIEJsYXN0ZXIgQXVkaW9QQ0kxMjgKLQkJMTI3NCA4MDAxICBTb3VuZCBCbGFzdGVyIDE2UENJIDQuMWNoCi0JCTE0NTggYTAwMCAgNTg4MCBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCA2T1hFVAotCQkxNDYyIDY4ODAgIDU4ODAgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgTVMtNjE4OCAxLjAwCi0JCTI3MGYgMjAwMSAgNTg4MCBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCA2Q1RSCi0JCTI3MGYgMjIwMCAgNTg4MCBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCA2V1RYCi0JCTI3MGYgNzA0MCAgNTg4MCBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCA2QVRBNAotMTI3NSAgTmV0d29yayBBcHBsaWFuY2UgQ29ycG9yYXRpb24KLTEyNzYgIFN3aXRjaGVkIE5ldHdvcmsgVGVjaG5vbG9naWVzLCBJbmMuCi0xMjc3ICBDb21zdHJlYW0KLTEyNzggIFRyYW5zdGVjaCBQYXJhbGxlbCBTeXN0ZW1zIEx0ZC4KLQkwNzAxICBUUEUzL1RNMyBQb3dlclBDIE5vZGUKLQkwNzEwICBUUEU1IFBvd2VyUEMgUENJIGJvYXJkCi0xMjc5ICBUcmFuc21ldGEgQ29ycG9yYXRpb24KLQkwMjk1ICBOb3J0aGJyaWRnZQotCTAzOTUgIExvbmdSdW4gTm9ydGhicmlkZ2UKLQkwMzk2ICBTRFJBTSBjb250cm9sbGVyCi0JMDM5NyAgQklPUyBzY3JhdGNocGFkCi0xMjdhICBSb2Nrd2VsbCBJbnRlcm5hdGlvbmFsCi0JMTAwMiAgSENGIDU2ayBEYXRhL0ZheCBNb2RlbQotCQkxMDkyIDA5NGMgIFN1cHJhRXhwcmVzcyA1NmkgUFJPIFtEaWFtb25kIFNVUDIzODBdCi0JCTEyMmQgNDAwMiAgSFBHIC8gTURQMzg1OC1VCi0JCTEyMmQgNDAwNSAgTURQMzg1OC1FCi0JCTEyMmQgNDAwNyAgTURQMzg1OC1BLy1OWgotCQkxMjJkIDQwMTIgIE1EUDM4NTgtU0EKLQkJMTIyZCA0MDE3ICBNRFAzODU4LVcKLQkJMTIyZCA0MDE4ICBNRFAzODU4LVcKLQkJMTI3YSAxMDAyICBSb2Nrd2VsbCA1NksgRC9GIEhDRiBNb2RlbQotCTEwMDMgIEhDRiA1NmsgRGF0YS9GYXggTW9kZW0KLQkJMGUxMSBiMGJjICAyMjktREYgWmVwaHlyCi0JCTBlMTEgYjExNCAgMjI5LURGIENoZWV0YWgKLQkJMTAzMyA4MDJiICAyMjktREYKLQkJMTNkZiAxMDAzICBQQ0k1NlJYIE1vZGVtCi0JCTEzZTAgMDExNyAgSUJNCi0JCTEzZTAgMDE0NyAgSUJNIEYtMTE1NklWKy9SMyBTcGFpbiBWLjkwIE1vZGVtCi0JCTEzZTAgMDE5NyAgSUJNCi0JCTEzZTAgMDFjNyAgSUJNIEYtMTE1NklWKy9SMyBXVyBWLjkwIE1vZGVtCi0JCTEzZTAgMDFmNyAgSUJNCi0JCTE0MzYgMTAwMyAgSUJNCi0JCTE0MzYgMTEwMyAgSUJNIDU2MTRQTTNHIFYuOTAgTW9kZW0KLQkJMTQzNiAxNjAyICBDb21wYXEgMjI5LURGIER1Y2F0aQotCTEwMDQgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkJMTA0OCAxNTAwICBNaWNyb0xpbmsgNTZrIE1vZGVtCi0JCTEwY2YgMTA1OSAgRnVqaXRzdSAyMjktREZSVAotCTEwMDUgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UvU3BrcCAody9IYW5kc2V0KSBNb2RlbQotCQkxMDA1IDEyN2EgIEFPcGVuIEZNNTYtUAotCQkxMDMzIDgwMjkgIDIyOS1ERlNWCi0JCTEwMzMgODA1NCAgTW9kZW0KLQkJMTBjZiAxMDNjICBGdWppdHN1Ci0JCTEwY2YgMTA1NSAgRnVqaXRzdSAyMjktREZTVgotCQkxMGNmIDEwNTYgIEZ1aml0c3UgMjI5LURGU1YKLQkJMTIyZCA0MDAzICBNRFAzODU4U1AtVQotCQkxMjJkIDQwMDYgIFBhY2thcmQgQmVsbCBNRFAzODU4Vi1FCi0JCTEyMmQgNDAwOCAgTURQMzg1OFNQLUEvU1AtTloKLQkJMTIyZCA0MDA5ICBNRFAzODU4U1AtRQotCQkxMjJkIDQwMTAgIE1EUDM4NThWLVUKLQkJMTIyZCA0MDExICBNRFAzODU4U1AtU0EKLQkJMTIyZCA0MDEzICBNRFAzODU4Vi1BL1YtTloKLQkJMTIyZCA0MDE1ICBNRFAzODU4U1AtVwotCQkxMjJkIDQwMTYgIE1EUDM4NThWLVcKLQkJMTIyZCA0MDE5ICBNRFAzODU4Vi1TQQotCQkxM2RmIDEwMDUgIFBDSTU2UlZQIE1vZGVtCi0JCTEzZTAgMDE4NyAgSUJNCi0JCTEzZTAgMDFhNyAgSUJNCi0JCTEzZTAgMDFiNyAgSUJNIERGLTExNTZJVisvUjMgU3BhaW4gVi45MCBNb2RlbQotCQkxM2UwIDAxZDcgIElCTSBERi0xMTU2SVYrL1IzIFdXIFYuOTAgTW9kZW0KLQkJMTQzNiAxMDA1ICBJQk0KLQkJMTQzNiAxMTA1ICBJQk0KLQkJMTQzNyAxMTA1ICBJQk0gNTYxNFBTM0cgVi45MCBNb2RlbQotCTEwMjIgIEhDRiA1NmsgTW9kZW0KLQkJMTQzNiAxMzAzICBNMy01NjE0UE0zRyBWLjkwIE1vZGVtCi0JMTAyMyAgSENGIDU2ayBEYXRhL0ZheCBNb2RlbQotCQkxMjJkIDQwMjAgIFBhY2thcmQgQmVsbCBNRFAzODU4LVdFCi0JCTEyMmQgNDAyMyAgTURQMzg1OC1VRQotCQkxM2UwIDAyNDcgIElCTSBGLTExNTZJVisvUjYgU3BhaW4gVi45MCBNb2RlbQotCQkxM2UwIDAyOTcgIElCTQotCQkxM2UwIDAyYzcgIElCTSBGLTExNTZJVisvUjYgV1cgVi45MCBNb2RlbQotCQkxNDM2IDEyMDMgIElCTQotCQkxNDM2IDEzMDMgIElCTQotCTEwMjQgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkxMDI1ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0KLQkJMTBjZiAxMDZhICBGdWppdHN1IDIzNS1ERlNWCi0JCTEyMmQgNDAyMSAgUGFja2FyZCBCZWxsIE1EUDM4NThWLVdFCi0JCTEyMmQgNDAyMiAgTURQMzg1OFNQLVdFCi0JCTEyMmQgNDAyNCAgTURQMzg1OFYtVUUKLQkJMTIyZCA0MDI1ICBNRFAzODU4U1AtVUUKLQkxMDI2ICBIQ0YgNTZrIFBDSSBTcGVha2VycGhvbmUgTW9kZW0KLQkxMDMyICBIQ0YgNTZrIE1vZGVtCi0JMTAzMyAgSENGIDU2ayBNb2RlbQotCTEwMzQgIEhDRiA1NmsgTW9kZW0KLQkxMDM1ICBIQ0YgNTZrIFBDSSBTcGVha2VycGhvbmUgTW9kZW0KLQkxMDM2ICBIQ0YgNTZrIE1vZGVtCi0JMTA4NSAgSENGIDU2ayBWb2xjYW5vIFBDSSBNb2RlbQotCTIwMDUgIEhDRiA1NmsgRGF0YS9GYXggTW9kZW0KLQkJMTA0ZCA4MDQ0ICAyMjktREZTVgotCQkxMDRkIDgwNDUgIDIyOS1ERlNWCi0JCTEwNGQgODA1NSAgUEJFL0F6dGVjaCAyMzVXLURGU1YKLQkJMTA0ZCA4MDU2ICAyMzUtREZTVgotCQkxMDRkIDgwNWEgIE1vZGVtCi0JCTEwNGQgODA1ZiAgTW9kZW0KLQkJMTA0ZCA4MDc0ICBNb2RlbQotCTIwMTMgIEhTRiA1NmsgRGF0YS9GYXggTW9kZW0KLQkJMTE3OSAwMDAxICBNb2RlbQotCQkxMTc5IGZmMDAgIE1vZGVtCi0JMjAxNCAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxMGNmIDEwNTcgIEZ1aml0c3UgQ2l0aWNvcnAgSUlJCi0JCTEyMmQgNDA1MCAgTVNQMzg4MC1VCi0JCTEyMmQgNDA1NSAgTVNQMzg4MC1XCi0JMjAxNSAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwICh3L0hhbmRzZXQpIE1vZGVtCi0JCTEwY2YgMTA2MyAgRnVqaXRzdQotCQkxMGNmIDEwNjQgIEZ1aml0c3UKLQkJMTQ2OCAyMDE1ICBGdWppdHN1Ci0JMjAxNiAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIE1vZGVtCi0JCTEyMmQgNDA1MSAgTVNQMzg4MFYtVwotCQkxMjJkIDQwNTIgIE1TUDM4ODBTUC1XCi0JCTEyMmQgNDA1NCAgTVNQMzg4MFYtVQotCQkxMjJkIDQwNTYgIE1TUDM4ODBTUC1VCi0JCTEyMmQgNDA1NyAgTVNQMzg4MFNQLUEKLQk0MzExICBSaXB0aWRlIEhTRiA1NmsgUENJIE1vZGVtCi0JCTEyN2EgNDMxMSAgUmluZyBNb2R1bGFyPyBSaXB0aWRlIEhTRiBSVCBIUCBEb20KLQkJMTNlMCAwMjEwICBIUC1HVkMKLQk0MzIwICBSaXB0aWRlIFBDSSBBdWRpbyBDb250cm9sbGVyCi0JCTEyMzUgNDMyMCAgUmlwdGlkZSBQQ0kgQXVkaW8gQ29udHJvbGxlcgotCTQzMjEgIFJpcHRpZGUgSENGIDU2ayBQQ0kgTW9kZW0KLQkJMTIzNSA0MzIxICBIZXdsZXR0IFBhY2thcmQgREYKLQkJMTIzNSA0MzI0ICBIZXdsZXR0IFBhY2thcmQgREYKLQkJMTNlMCAwMjEwICBIZXdsZXR0IFBhY2thcmQgREYKLQkJMTQ0ZCAyMzIxICBSaXB0aWRlCi0JNDMyMiAgUmlwdGlkZSBQQ0kgR2FtZSBDb250cm9sbGVyCi0JCTEyMzUgNDMyMiAgUmlwdGlkZSBQQ0kgR2FtZSBDb250cm9sbGVyCi0JODIzNCAgUmFwaWRGaXJlIDYxNlggQVRNMTU1IEFkYXB0ZXIKLQkJMTA4ZCAwMDIyICBSYXBpZEZpcmUgNjE2WCBBVE0xNTUgQWRhcHRlcgotCQkxMDhkIDAwMjcgIFJhcGlkRmlyZSA2MTZYIEFUTTE1NSBBZGFwdGVyCi0xMjdiICBQaXhlcmEgQ29ycG9yYXRpb24KLTEyN2MgIENyb3NzcG9pbnQgU29sdXRpb25zLCBJbmMuCi0xMjdkICBWZWxhIFJlc2VhcmNoCi0xMjdlICBXaW5ub3YsIEwuUC4KLTEyN2YgIEZ1amlmaWxtCi0xMjgwICBQaG90b3NjcmlwdCBHcm91cCBMdGQuCi0xMjgxICBZb2tvZ2F3YSBFbGVjdHJpYyBDb3Jwb3JhdGlvbgotMTI4MiAgRGF2aWNvbSBTZW1pY29uZHVjdG9yLCBJbmMuCi0JOTAwOSAgRXRoZXJuZXQgMTAwLzEwIE1CaXQKLQk5MTAwICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQk5MTAyICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQk5MTMyICBFdGhlcm5ldCAxMDAvMTAgTUJpdAotMTI4MyAgSW50ZWdyYXRlZCBUZWNobm9sb2d5IEV4cHJlc3MsIEluYy4KLQk2NzNhICBJVDgzMzBHCi0JODIxMiAgSVQvSVRFODIxMiBEdWFsIGNoYW5uZWwgQVRBIFJBSUQgY29udHJvbGxlciAoUENJIHZlcnNpb24gc2VlbXMgdG8gYmUgSVQ4MjEyLCBlbWJlZGRlZCBzZWVtcyB0byBiZSBJVEU4MjEyKQotCQkxMjgzIDAwMDEgIElUL0lURTgyMTIgRHVhbCBjaGFubmVsIEFUQSBSQUlEIGNvbnRyb2xsZXIKLQk4MzMwICBJVDgzMzBHCi0JODg3MiAgSVQ4ODc0RiBQQ0kgRHVhbCBTZXJpYWwgUG9ydCBDb250cm9sbGVyCi0JODg4OCAgSVQ4ODg4RiBQQ0kgdG8gSVNBIEJyaWRnZSB3aXRoIFNNQgotCTg4ODkgIElUODg4OUYgUENJIHRvIElTQSBCcmlkZ2UKLQllODg2ICBJVDgzMzBHCi0xMjg0ICBTYWhhcmEgTmV0d29ya3MsIEluYy4KLTEyODUgIFBsYXRmb3JtIFRlY2hub2xvZ2llcywgSW5jLgotCTAxMDAgIEFHT0dPIHNvdW5kIGNoaXAgKGFrYSBFU1MgTWFlc3RybyAxKQotMTI4NiAgTWF6ZXQgR21iSAotMTI4NyAgTS1QYWN0LCBJbmMuCi0JMDAxZSAgTFMyMjBEIERWRCBEZWNvZGVyCi0JMDAxZiAgTFMyMjBDIERWRCBEZWNvZGVyCi0xMjg4ICBUaW1lc3RlcCBDb3Jwb3JhdGlvbgotMTI4OSAgQVZDIFRlY2hub2xvZ3ksIEluYy4KLTEyOGEgIEFzYW50ZSBUZWNobm9sb2dpZXMsIEluYy4KLTEyOGIgIFRyYW5zd2l0Y2ggQ29ycG9yYXRpb24KLTEyOGMgIFJldGl4IENvcnBvcmF0aW9uCi0xMjhkICBHMiBOZXR3b3JrcywgSW5jLgotCTAwMjEgIEFUTTE1NSBBZGFwdGVyCi0xMjhlICBIb29udGVjaCBDb3Jwb3JhdGlvbi9TYW1obyBNdWx0aSBUZWNoIEx0ZC4KLQkwMDA4ICBTVDEyOCBXU1MvU0IKLQkwMDA5ICBTVDEyOCBTQU05NDA3Ci0JMDAwYSAgU1QxMjggR2FtZSBQb3J0Ci0JMDAwYiAgU1QxMjggTVBVIFBvcnQKLQkwMDBjICBTVDEyOCBDdHJsIFBvcnQKLTEyOGYgIFRhdGVubyBEZW5ub3UsIEluYy4KLTEyOTAgIFNvcmQgQ29tcHV0ZXIgQ29ycG9yYXRpb24KLTEyOTEgIE5DUyBDb21wdXRlciBJdGFsaWEKLTEyOTIgIFRyaXRlY2ggTWljcm9lbGVjdHJvbmljcyBJbmMKLTEyOTMgIE1lZGlhIFJlYWxpdHkgVGVjaG5vbG9neQotMTI5NCAgUmhldG9yZXgsIEluYy4KLTEyOTUgIEltYWdlbmF0aW9uIENvcnBvcmF0aW9uCi0xMjk2ICBLb2ZheCBJbWFnZSBQcm9kdWN0cwotMTI5NyAgSG9sY28gRW50ZXJwcmlzZSBDbywgTHRkL1NodXR0bGUgQ29tcHV0ZXIKLTEyOTggIFNwZWxsY2FzdGVyIFRlbGVjb21tdW5pY2F0aW9ucyBJbmMuCi0xMjk5ICBLbm93bGVkZ2UgVGVjaG5vbG9neSBMYWIuCi0xMjlhICBWTWV0cm8sIGluYy4KLQkwNjE1ICBQQlQtNjE1IFBDSS1YIEJ1cyBBbmFseXplcgotMTI5YiAgSW1hZ2UgQWNjZXNzCi0xMjljICBKYXljb3IKLTEyOWQgIENvbXBjb3JlIE11bHRpbWVkaWEsIEluYy4KLTEyOWUgIFZpY3RvciBDb21wYW55IG9mIEphcGFuLCBMdGQuCi0xMjlmICBPRUMgTWVkaWNhbCBTeXN0ZW1zLCBJbmMuCi0xMmEwICBBbGxlbi1CcmFkbGV5IENvbXBhbnkKLTEyYTEgIFNpbXBhY3QgQXNzb2NpYXRlcywgSW5jLgotMTJhMiAgTmV3Z2VuIFN5c3RlbXMgQ29ycG9yYXRpb24KLTEyYTMgIEx1Y2VudCBUZWNobm9sb2dpZXMKLQk4MTA1ICBUODEwNSBIMTAwIERpZ2l0YWwgU3dpdGNoCi0xMmE0ICBOVFQgRWxlY3Ryb25pY3MgVGVjaG5vbG9neSBDb21wYW55Ci0xMmE1ICBWaXNpb24gRHluYW1pY3MgTHRkLgotMTJhNiAgU2NhbGFibGUgTmV0d29ya3MsIEluYy4KLTEyYTcgIEFNTyBHbWJICi0xMmE4ICBOZXdzIERhdGFjb20KLTEyYTkgIFhpb3RlY2ggQ29ycG9yYXRpb24KLTEyYWEgIFNETCBDb21tdW5pY2F0aW9ucywgSW5jLgotMTJhYiAgWXVhbiBZdWFuIEVudGVycHJpc2UgQ28uLCBMdGQuCi0JMDAwMiAgQVU4ODMwIFtWb3J0ZXgyXSBCYXNlZCBTb3VuZCBDYXJkIFdpdGggQTNEIFN1cHBvcnQKLQkzMDAwICBNUEctMjAwQyBQQ0kgRFZEIERlY29kZXIgQ2FyZAotMTJhYyAgTWVhc3VyZXggQ29ycG9yYXRpb24KLTEyYWQgIE11bHRpZGF0YSBHbWJICi0xMmFlICBBbHRlb24gTmV0d29ya3MgSW5jLgotCTAwMDEgIEFjZU5JQyBHaWdhYml0IEV0aGVybmV0Ci0JCTEwMTQgMDEwNCAgR2lnYWJpdCBFdGhlcm5ldC1TWCBQQ0kgQWRhcHRlcgotCQkxMmFlIDAwMDEgIEdpZ2FiaXQgRXRoZXJuZXQtU1ggKFVuaXZlcnNhbCkKLQkJMTQxMCAwMTA0ICBHaWdhYml0IEV0aGVybmV0LVNYIFBDSSBBZGFwdGVyCi0JMDAwMiAgQWNlTklDIEdpZ2FiaXQgRXRoZXJuZXQgKENvcHBlcikKLQkJMTBhOSA4MDAyICBBY2VuaWMgR2lnYWJpdCBFdGhlcm5ldAotCQkxMmFlIDAwMDIgIEdpZ2FiaXQgRXRoZXJuZXQtVCAoM0M5ODYtVCkKLQkwMGZhICBGYXJhbGxvbiBQTjkxMDAtVCBHaWdhYml0IEV0aGVybmV0Ci0xMmFmICBUREsgVVNBIENvcnAKLTEyYjAgIEpvcmdlIFNjaWVudGlmaWMgQ29ycAotMTJiMSAgR2FtbWFMaW5rCi0xMmIyICBHZW5lcmFsIFNpZ25hbCBOZXR3b3JrcwotMTJiMyAgSW50ZXItRmFjZSBDbyBMdGQKLTEyYjQgIEZ1dHVyZVRlbCBJbmMKLTEyYjUgIEdyYW5pdGUgU3lzdGVtcyBJbmMuCi0xMmI2ICBOYXR1cmFsIE1pY3Jvc3lzdGVtcwotMTJiNyAgQ29nbmV4IE1vZHVsYXIgVmlzaW9uIFN5c3RlbXMgRGl2LiAtIEFjdW1lbiBJbmMuCi0xMmI4ICBLb3JnCi0xMmI5ICAzQ29tIENvcnAsIE1vZGVtIERpdmlzaW9uIChmb3JtZXJseSBVUyBSb2JvdGljcykKLQkxMDA2ICBXaW5Nb2RlbQotCQkxMmI5IDAwNWMgIFVTUiA1NmsgSW50ZXJuYWwgVm9pY2UgV2luTW9kZW0gKE1vZGVsIDM0NzIpCi0JCTEyYjkgMDA1ZSAgVVNSIDU2ayBJbnRlcm5hbCBXaW5Nb2RlbSAoTW9kZWxzIDY2Mjk3NSkKLQkJMTJiOSAwMDYyICBVU1IgNTZrIEludGVybmFsIFZvaWNlIFdpbk1vZGVtIChNb2RlbCA2NjI5NzgpCi0JCTEyYjkgMDA2OCAgVVNSIDU2ayBJbnRlcm5hbCBWb2ljZSBXaW5Nb2RlbSAoTW9kZWwgNTY5MCkKLQkJMTJiOSAwMDdhICBVU1IgNTZrIEludGVybmFsIFZvaWNlIFdpbk1vZGVtIChNb2RlbCA2NjI5NzQpCi0JCTEyYjkgMDA3ZiAgVVNSIDU2ayBJbnRlcm5hbCBXaW5Nb2RlbSAoTW9kZWxzIDU2OTgsIDU2OTkpCi0JCTEyYjkgMDA4MCAgVVNSIDU2ayBJbnRlcm5hbCBXaW5Nb2RlbSAoTW9kZWxzIDI5NzUsIDM1MjgpCi0JCTEyYjkgMDA4MSAgVVNSIDU2ayBJbnRlcm5hbCBWb2ljZSBXaW5Nb2RlbSAoTW9kZWxzIDI5NzQsIDM1MjkpCi0JCTEyYjkgMDA5MSAgVVNSIDU2ayBJbnRlcm5hbCBWb2ljZSBXaW5Nb2RlbSAoTW9kZWwgMjk3OCkKLQkxMDA3ICBVU1IgNTZrIEludGVybmFsIFdpbk1vZGVtCi0JCTEyYjkgMDBhMyAgVVNSIDU2ayBJbnRlcm5hbCBXaW5Nb2RlbSAoTW9kZWwgMzU5NSkKLQkxMDA4ICA1NksgRmF4TW9kZW0gTW9kZWwgNTYxMAotCQkxMmI5IDAwYTIgIFVTUiA1NmsgSW50ZXJuYWwgRkFYIE1vZGVtIChNb2RlbCAyOTc3KQotCQkxMmI5IDAwYWEgIFVTUiA1NmsgSW50ZXJuYWwgVm9pY2UgTW9kZW0gKE1vZGVsIDI5NzYpCi0JCTEyYjkgMDBhYiAgVVNSIDU2ayBJbnRlcm5hbCBWb2ljZSBNb2RlbSAoTW9kZWwgNTYwOSkKLQkJMTJiOSAwMGFjICBVU1IgNTZrIEludGVybmFsIFZvaWNlIE1vZGVtIChNb2RlbCAzMjk4KQotCQkxMmI5IDAwYWQgIFVTUiA1NmsgSW50ZXJuYWwgRkFYIE1vZGVtIChNb2RlbCA1NjEwKQotMTJiYSAgQml0dFdhcmUsIEluYy4KLTEyYmIgIE5pcHBvbiBVbmlzb2Z0IENvcnBvcmF0aW9uCi0xMmJjICBBcnJheSBNaWNyb3N5c3RlbXMKLTEyYmQgIENvbXB1dGVybSBDb3JwLgotMTJiZSAgQW5jaG9yIENoaXBzIEluYy4KLQkzMDQxICBBTjMwNDFRIENPLU1FTQotCTMwNDIgIEFOMzA0MlEgQ08tTUVNIExpdGUKLQkJMTJiZSAzMDQyICBBbmNob3IgQ2hpcHMgTGl0ZSBFdmFsdWF0aW9uIEJvYXJkCi0xMmJmICBGdWppZmlsbSBNaWNyb2RldmljZXMKLTEyYzAgIEluZmltZWQKLTEyYzEgIEdNTSBSZXNlYXJjaCBDb3JwCi0xMmMyICBNZW50ZWMgTGltaXRlZAotMTJjMyAgSG9sdGVrIE1pY3JvZWxlY3Ryb25pY3MgSW5jCi0JMDA1OCAgUENJIE5FMksgRXRoZXJuZXQKLQk1NTk4ICBQQ0kgTkUySyBFdGhlcm5ldAotMTJjNCAgQ29ubmVjdCBUZWNoIEluYwotCTAwMDEgIEJsdWUgSEVBVC9QQ0kgOCAoUlMyMzIvQ0wvUkoxMSkKLQkwMDAyICBCbHVlIEhFQVQvUENJIDQgKFJTMjMyKQotCTAwMDMgIEJsdWUgSEVBVC9QQ0kgMiAoUlMyMzIpCi0JMDAwNCAgQmx1ZSBIRUFUL1BDSSA4IChVTklWLCBSUzQ4NSkKLQkwMDA1ICBCbHVlIEhFQVQvUENJIDQrNC82KzIgKFVOSVYsIFJTMjMyLzQ4NSkKLQkwMDA2ICBCbHVlIEhFQVQvUENJIDQgKE9QVE8sIFJTNDg1KQotCTAwMDcgIEJsdWUgSEVBVC9QQ0kgMisyIChSUzIzMi80ODUpCi0JMDAwOCAgQmx1ZSBIRUFUL1BDSSAyIChPUFRPLCBUeCwgUlM0ODUpCi0JMDAwOSAgQmx1ZSBIRUFUL1BDSSAyKzYgKFJTMjMyLzQ4NSkKLQkwMDBhICBCbHVlIEhFQVQvUENJIDggKFR4LCBSUzQ4NSkKLQkwMDBiICBCbHVlIEhFQVQvUENJIDQgKFR4LCBSUzQ4NSkKLQkwMDBjICBCbHVlIEhFQVQvUENJIDIgKDIwIE1IeiwgUlM0ODUpCi0JMDAwZCAgQmx1ZSBIRUFUL1BDSSAyIFBUTQotCTAxMDAgIE5UOTYwL1BDSQotCTAyMDEgIGNQQ0kgVGl0YW4gLSAyIFBvcnQKLQkwMjAyICBjUENJIFRpdGFuIC0gNCBQb3J0Ci0JMDMwMCAgQ1RJIFBDSSBVQVJUIDIgKFJTMjMyKQotCTAzMDEgIENUSSBQQ0kgVUFSVCA0IChSUzIzMikKLQkwMzAyICBDVEkgUENJIFVBUlQgOCAoUlMyMzIpCi0JMDMxMCAgQ1RJIFBDSSBVQVJUIDErMSAoUlMyMzIvNDg1KQotCTAzMTEgIENUSSBQQ0kgVUFSVCAyKzIgKFJTMjMyLzQ4NSkKLQkwMzEyICBDVEkgUENJIFVBUlQgNCs0IChSUzIzMi80ODUpCi0JMDMyMCAgQ1RJIFBDSSBVQVJUIDIKLQkwMzIxICBDVEkgUENJIFVBUlQgNAotCTAzMjIgIENUSSBQQ0kgVUFSVCA4Ci0JMDMzMCAgQ1RJIFBDSSBVQVJUIDIgKFJTNDg1KQotCTAzMzEgIENUSSBQQ0kgVUFSVCA0IChSUzQ4NSkKLQkwMzMyICBDVEkgUENJIFVBUlQgOCAoUlM0ODUpCi0xMmM1ICBQaWN0dXJlIEVsZW1lbnRzIEluY29ycG9yYXRlZAotCTAwN2UgIEltYWdpbmcvU2Nhbm5pbmcgU3Vic3lzdGVtIEVuZ2luZQotCTAwN2YgIEltYWdpbmcvU2Nhbm5pbmcgU3Vic3lzdGVtIEVuZ2luZQotCTAwODEgIFBDSVZTVCBbR3JheXNjYWxlIFRocmVzaG9sZGluZyBFbmdpbmVdCi0JMDA4NSAgVmlkZW8gU2ltdWxhdG9yL1NlbmRlcgotCTAwODYgIFRIUjIgTXVsdGktc2NhbGUgVGhyZXNob2xkZXIKLTEyYzYgIE1pdGFuaSBDb3Jwb3JhdGlvbgotMTJjNyAgRGlhbG9naWMgQ29ycAotMTJjOCAgRyBGb3JjZSBDbywgTHRkCi0xMmM5ICBHaWdpIE9wZXJhdGlvbnMKLTEyY2EgIEludGVncmF0ZWQgQ29tcHV0aW5nIEVuZ2luZXMKLTEyY2IgIEFudGV4IEVsZWN0cm9uaWNzIENvcnBvcmF0aW9uCi0xMmNjICBQbHV0byBUZWNobm9sb2dpZXMgSW50ZXJuYXRpb25hbAotMTJjZCAgQWltcyBMYWIKLTEyY2UgIE5ldHNwZWVkIEluYy4KLTEyY2YgIFByb3BoZXQgU3lzdGVtcywgSW5jLgotMTJkMCAgR0RFIFN5c3RlbXMsIEluYy4KLTEyZDEgIFBTSVRlY2gKLTEyZDIgIE5WaWRpYSAvIFNHUyBUaG9tc29uIChKb2ludCBWZW50dXJlKQotCTAwMDggIE5WMQotCTAwMDkgIERBQzY0Ci0JMDAxOCAgUml2YTEyOAotCQkxMDQ4IDBjMTAgIFZJQ1RPUlkgRXJhem9yCi0JCTEwN2IgODAzMCAgU1RCIFZlbG9jaXR5IDEyOAotCQkxMDkyIDAzNTAgIFZpcGVyIFYzMzAKLQkJMTA5MiAxMDkyICBWaXBlciBWMzMwCi0JCTEwYjQgMWIxYiAgU1RCIFZlbG9jaXR5IDEyOAotCQkxMGI0IDFiMWQgIFNUQiBWZWxvY2l0eSAxMjgKLQkJMTBiNCAxYjFlICBTVEIgVmVsb2NpdHkgMTI4LCBQQUwgVFYtT3V0Ci0JCTEwYjQgMWIyMCAgU1RCIFZlbG9jaXR5IDEyOCBTYXBwaGlyZQotCQkxMGI0IDFiMjEgIFNUQiBWZWxvY2l0eSAxMjgKLQkJMTBiNCAxYjIyICBTVEIgVmVsb2NpdHkgMTI4IEFHUCwgTlRTQyBUVi1PdXQKLQkJMTBiNCAxYjIzICBTVEIgVmVsb2NpdHkgMTI4IEFHUCwgUEFMIFRWLU91dAotCQkxMGI0IDFiMjcgIFNUQiBWZWxvY2l0eSAxMjggRFZECi0JCTEwYjQgMWI4OCAgTVZQIFBybyAxMjgKLQkJMTBiNCAyMjJhICBTVEIgVmVsb2NpdHkgMTI4IEFHUAotCQkxMGI0IDIyMzAgIFNUQiBWZWxvY2l0eSAxMjgKLQkJMTBiNCAyMjMyICBTVEIgVmVsb2NpdHkgMTI4Ci0JCTEwYjQgMjIzNSAgU1RCIFZlbG9jaXR5IDEyOCBBR1AKLQkJMmExNSA1NGEzICAzRFZpc2lvbi1TQUdQIC8gM0RleFBsb3JlciAzMDAwCi0JMDAxOSAgUml2YTEyOFpYCi0JMDAyMCAgVE5UCi0JMDAyOCAgVE5UMgotCTAwMjkgIFVUTlQyCi0JMDAyYyAgVlROVDIKLQkwMGEwICBJVE5UMgotMTJkMyAgVmluZ21lZCBTb3VuZCBBL1MKLTEyZDQgIFVsdGljb20gKEZvcm1lcmx5IERHTSZTKQotCTAyMDAgIFQxIENhcmQKLTEyZDUgIEVxdWF0b3IgVGVjaG5vbG9naWVzIEluYwotCTAwMDMgIEJTUDE2Ci0JMTAwMCAgQlNQMTUKLTEyZDYgIEFuYWxvZ2ljIENvcnAKLTEyZDcgIEJpb3Ryb25pYyBTUkwKLTEyZDggIFBlcmljb20gU2VtaWNvbmR1Y3RvcgotMTJkOSAgQWN1bGFiIFBMQwotCTAwMDIgIFBDSSBQcm9zb2R5Ci0JMDAwNCAgY1BDSSBQcm9zb2R5Ci0JMDAwNSAgQWN1bGFiIEUxL1QxIFBDSSBjYXJkCi0xMmRhICBUcnVlIFRpbWUgSW5jLgotMTJkYiAgQW5uYXBvbGlzIE1pY3JvIFN5c3RlbXMsIEluYwotMTJkYyAgU3ltaWNyb24gQ29tcHV0ZXIgQ29tbXVuaWNhdGlvbiBMdGQuCi0xMmRkICBNYW5hZ2VtZW50IEdyYXBoaWNzCi0xMmRlICBSYWluYm93IFRlY2hub2xvZ2llcwotCTAyMDAgIENyeXB0b1N3aWZ0IENTMjAwCi0xMmRmICBTQlMgVGVjaG5vbG9naWVzIEluYwotMTJlMCAgQ2hhc2UgUmVzZWFyY2gKLQkwMDEwICBTVDE2QzY1NCBRdWFkIFVBUlQKLQkwMDIwICBTVDE2QzY1NCBRdWFkIFVBUlQKLQkwMDMwICBTVDE2QzY1NCBRdWFkIFVBUlQKLTEyZTEgIE5pbnRlbmRvIENvLCBMdGQKLTEyZTIgIERhdHVtIEluYy4gQmFuY29tbS1UaW1pbmcgRGl2aXNpb24KLTEyZTMgIEltYXRpb24gQ29ycCAtIE1lZGljYWwgSW1hZ2luZyBTeXN0ZW1zCi0xMmU0ICBCcm9va3Ryb3V0IFRlY2hub2xvZ3kgSW5jCi0xMmU1ICBBcGV4IFNlbWljb25kdWN0b3IgSW5jCi0xMmU2ICBDaXJlbCBTeXN0ZW1zCi0xMmU3ICBTdW5zZ3JvdXAgQ29ycG9yYXRpb24KLTEyZTggIENyaXNjIENvcnAKLTEyZTkgIEdFIFNwYWNlbmV0Ci0xMmVhICBadWtlbgotMTJlYiAgQXVyZWFsIFNlbWljb25kdWN0b3IKLQkwMDAxICBWb3J0ZXggMQotCQkxMDRkIDgwMzYgIEFVODgyMCBWb3J0ZXggRGlnaXRhbCBBdWRpbyBQcm9jZXNzb3IKLQkJMTA5MiAyMDAwICBTb25pYyBJbXBhY3QgQTNECi0JCTEwOTIgMjEwMCAgU29uaWMgSW1wYWN0IEEzRAotCQkxMDkyIDIxMTAgIFNvbmljIEltcGFjdCBBM0QKLQkJMTA5MiAyMjAwICBTb25pYyBJbXBhY3QgQTNECi0JCTEyMmQgMTAwMiAgQVU4ODIwIFZvcnRleCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQkxMmViIDAwMDEgIEFVODgyMCBWb3J0ZXggRGlnaXRhbCBBdWRpbyBQcm9jZXNzb3IKLQkJNTA1MyAzMzU1ICBNb250ZWdvCi0JMDAwMiAgVm9ydGV4IDIKLQkJMTA0ZCA4MDQ5ICBBVTg4MzAgVm9ydGV4IDNEIERpZ2l0YWwgQXVkaW8gUHJvY2Vzc29yCi0JCTEwNGQgODA3YiAgQVU4ODMwIFZvcnRleCAzRCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQkxMDkyIDMwMDAgIE1vbnN0ZXIgU291bmQgSUkKLQkJMTA5MiAzMDAxICBNb25zdGVyIFNvdW5kIElJCi0JCTEwOTIgMzAwMiAgTW9uc3RlciBTb3VuZCBJSQotCQkxMDkyIDMwMDMgIE1vbnN0ZXIgU291bmQgSUkKLQkJMTA5MiAzMDA0ICBNb25zdGVyIFNvdW5kIElJCi0JCTEyZWIgMDAwMSAgQVU4ODMwIFZvcnRleCAzRCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQkxMmViIDAwMDIgIEFVODgzMCBWb3J0ZXggM0QgRGlnaXRhbCBBdWRpbyBQcm9jZXNzb3IKLQkJMTJlYiAwMDg4ICBBVTg4MzAgVm9ydGV4IDNEIERpZ2l0YWwgQXVkaW8gUHJvY2Vzc29yCi0JCTE0NGQgMzUxMCAgQVU4ODMwIFZvcnRleCAzRCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQk1MDUzIDMzNTYgIE1vbnRlZ28gSUkKLQkwMDAzICBBVTg4MTAgVm9ydGV4IERpZ2l0YWwgQXVkaW8gUHJvY2Vzc29yCi0JCTEwNGQgODA0OSAgQVU4ODEwIFZvcnRleCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQkxMDRkIDgwNzcgIEFVODgxMCBWb3J0ZXggRGlnaXRhbCBBdWRpbyBQcm9jZXNzb3IKLQkJMTA5ZiAxMDAwICBBVTg4MTAgVm9ydGV4IERpZ2l0YWwgQXVkaW8gUHJvY2Vzc29yCi0JCTEyZWIgMDAwMyAgQVU4ODEwIFZvcnRleCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQkxNDYyIDY3ODAgIEFVODgxMCBWb3J0ZXggRGlnaXRhbCBBdWRpbyBQcm9jZXNzb3IKLQkJMTRhNCAyMDczICBBVTg4MTAgVm9ydGV4IERpZ2l0YWwgQXVkaW8gUHJvY2Vzc29yCi0JCTE0YTQgMjA5MSAgQVU4ODEwIFZvcnRleCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQkxNGE0IDIxMDQgIEFVODgxMCBWb3J0ZXggRGlnaXRhbCBBdWRpbyBQcm9jZXNzb3IKLQkJMTRhNCAyMTA2ICBBVTg4MTAgVm9ydGV4IERpZ2l0YWwgQXVkaW8gUHJvY2Vzc29yCi0JODgwMyAgVm9ydGV4IDU2ayBTb2Z0d2FyZSBNb2RlbQotCQkxMmViIDg4MDMgIFZvcnRleCA1NmsgU29mdHdhcmUgTW9kZW0KLTEyZWMgIDNBIEludGVybmF0aW9uYWwsIEluYy4KLTEyZWQgIE9wdGl2aXNpb24gSW5jLgotMTJlZSAgT3JhbmdlIE1pY3JvCi0xMmVmICBWaWVubmEgU3lzdGVtcwotMTJmMCAgUGVudGVrCi0xMmYxICBTb3JlbnNvbiBWaXNpb24gSW5jCi0xMmYyICBHYW1tYWdyYXBoeCwgSW5jLgotMTJmMyAgUmFkc3RvbmUgVGVjaG5vbG9neQotMTJmNCAgTWVnYXRlbAotMTJmNSAgRm9ya3MKLTEyZjYgIERhd3NvbiBGcmFuY2UKLTEyZjcgIENvZ25leAotMTJmOCAgRWxlY3Ryb25pYyBEZXNpZ24gR21iSAotCTAwMDIgIFZpZGVvTWFrZXIKLTEyZjkgIEZvdXIgRm9sZCBMdGQKLTEyZmIgIFNwZWN0cnVtIFNpZ25hbCBQcm9jZXNzaW5nCi0xMmZjICBDYXBpdGFsIEVxdWlwbWVudCBDb3JwCi0xMmZkICBJMlMKLTEyZmUgIEVTRCBFbGVjdHJvbmljIFN5c3RlbSBEZXNpZ24gR21iSAotMTJmZiAgTGV4aWNvbgotMTMwMCAgSGFybWFuIEludGVybmF0aW9uYWwgSW5kdXN0cmllcyBJbmMKLTEzMDIgIENvbXB1dGVyIFNjaWVuY2VzIENvcnAKLTEzMDMgIElubm92YXRpdmUgSW50ZWdyYXRpb24KLTEzMDQgIEp1bmlwZXIgTmV0d29ya3MKLTEzMDUgIE5ldHBob25lLCBJbmMKLTEzMDYgIER1ZXQgVGVjaG5vbG9naWVzCi0jIEZvcm1lcmx5IENvbXB1dGVyQm9hcmRzCi0xMzA3ICBNZWFzdXJlbWVudCBDb21wdXRpbmcKLQkwMDAxICBQQ0ktREFTMTYwMi8xNgotCTAwMGIgIFBDSS1ESU80OEgKLQkwMDBjICBQQ0ktUERJU084Ci0JMDAwZCAgUENJLVBESVNPMTYKLQkwMDBmICBQQ0ktREFTMTIwMAotCTAwMTAgIFBDSS1EQVMxNjAyLzEyCi0JMDAxNCAgUENJLURJTzI0SAotCTAwMTUgIFBDSS1ESU8yNEgvQ1RSMwotCTAwMTYgIFBDSS1ESU80OEgvQ1RSMTUKLQkwMDE3ICBQQ0ktRElPOTZICi0JMDAxOCAgUENJLUNUUjA1Ci0JMDAxOSAgUENJLURBUzEyMDAvSlIKLQkwMDFhICBQQ0ktREFTMTAwMQotCTAwMWIgIFBDSS1EQVMxMDAyCi0JMDAxYyAgUENJLURBUzE2MDJKUi8xNgotCTAwMWQgIFBDSS1EQVM2NDAyLzE2Ci0JMDAxZSAgUENJLURBUzY0MDIvMTIKLQkwMDFmICBQQ0ktREFTMTYvTTEKLQkwMDIwICBQQ0ktRERBMDIvMTIKLQkwMDIxICBQQ0ktRERBMDQvMTIKLQkwMDIyICBQQ0ktRERBMDgvMTIKLQkwMDIzICBQQ0ktRERBMDIvMTYKLQkwMDI0ICBQQ0ktRERBMDQvMTYKLQkwMDI1ICBQQ0ktRERBMDgvMTYKLQkwMDI2ICBQQ0ktREFDMDQvMTItSFMKLQkwMDI3ICBQQ0ktREFDMDQvMTYtSFMKLQkwMDI4ICBQQ0ktRElPMjQKLQkwMDI5ICBQQ0ktREFTMDgKLQkwMDJjICBQQ0ktSU5UMzIKLQkwMDMzICBQQ0ktRFVBTC1BQzUKLQkwMDM0ICBQQ0ktREFTLVRDCi0JMDAzNSAgUENJLURBUzY0L00xLzE2Ci0JMDAzNiAgUENJLURBUzY0L00yLzE2Ci0JMDAzNyAgUENJLURBUzY0L00zLzE2Ci0JMDA0YyAgUENJLURBUzEwMDAKLQkwMDRkICBQQ0ktUVVBRDA0Ci0JMDA1MiAgUENJLURBUzQwMjAvMTIKLQkwMDVlICBQQ0ktREFTNjAyNQotMTMwOCAgSmF0byBUZWNobm9sb2dpZXMgSW5jLgotCTAwMDEgIE5ldENlbGVyYXRvciBBZGFwdGVyCi0JCTEzMDggMDAwMSAgTmV0Q2VsZXJhdG9yIEFkYXB0ZXIKLTEzMDkgIEFCIFNlbWljb25kdWN0b3IgTHRkCi0xMzBhICBNaXRzdWJpc2hpIEVsZWN0cmljIE1pY3JvY29tcHV0ZXIKLTEzMGIgIENvbG9yZ3JhcGhpYyBDb21tdW5pY2F0aW9ucyBDb3JwCi0xMzBjICBBbWJleCBUZWNobm9sb2dpZXMsIEluYwotMTMwZCAgQWNjZWxlcml4IEluYwotMTMwZSAgWWFtYXRha2UtSG9uZXl3ZWxsIENvLiBMdGQKLTEzMGYgIEFkdmFuZXQgSW5jCi0xMzEwICBHZXNwYWMKLTEzMTEgIFZpZGVvc2VydmVyLCBJbmMKLTEzMTIgIEFjdWl0eSBJbWFnaW5nLCBJbmMKLTEzMTMgIFlhc2thd2EgRWxlY3RyaWMgQ28uCi0xMzE2ICBUZXJhZHluZSBJbmMKLTEzMTcgIExpbmtzeXMKLQkwOTgxICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQkwOTg1ICBOQzEwMCBOZXR3b3JrIEV2ZXJ5d2hlcmUgRmFzdCBFdGhlcm5ldCAxMC8xMDAKLQkxOTg1ICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQkyODUwICBIU1AgTWljcm9Nb2RlbSA1NgotCTgyMDEgIEFETXRlayBBRE04MjExIDgwMi4xMWIgV2lyZWxlc3MgSW50ZXJmYWNlCi0JCTEwYjggMjYzNSAgU01DMjYzNVcgODAyLjExYiAoMTFNYnBzKSB3aXJlbGVzcyBsYW4gcGNtY2lhIChjYXJkYnVzKSBjYXJkCi0JCTEzMTcgODIwMSAgU01DMjYzNVcgODAyLjExYiAoMTFtYnBzKSB3aXJlbGVzcyBsYW4gcGNtY2lhIChjYXJkYnVzKSBjYXJkCi0JODIxMSAgQURNdGVrIEFETTgyMTEgODAyLjExYiBXaXJlbGVzcyBJbnRlcmZhY2UKLQk5NTExICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLTEzMTggIFBhY2tldCBFbmdpbmVzIEluYy4KLQkwOTExICBHTklDLUlJIFBDSSBHaWdhYml0IEV0aGVybmV0IFtIYW1hY2hpXQotMTMxOSAgRm9ydGVtZWRpYSwgSW5jCi0JMDgwMSAgWHdhdmUgUVMzMDAwQSBbRk04MDFdCi0JMDgwMiAgWHdhdmUgUVMzMDAwQSBbRk04MDEgZ2FtZSBwb3J0XQotCTEwMDAgIEZNODAxIFBDSSBBdWRpbwotCTEwMDEgIEZNODAxIFBDSSBKb3lzdGljawotMTMxYSAgRmluaXNhciBDb3JwLgotMTMxYyAgTmlwcG9uIEVsZWN0cm8tU2Vuc29yeSBEZXZpY2VzIENvcnAKLTEzMWQgIFN5c21pYywgSW5jLgotMTMxZSAgWGluZXggTmV0d29ya3MgSW5jCi0xMzFmICBTaWlnIEluYwotCTEwMDAgIEN5YmVyU2VyaWFsICgxLXBvcnQpIDE2NTUwCi0JMTAwMSAgQ3liZXJTZXJpYWwgKDEtcG9ydCkgMTY2NTAKLQkxMDAyICBDeWJlclNlcmlhbCAoMS1wb3J0KSAxNjg1MAotCTEwMTAgIER1ZXQgMVMoMTY1NTApKzFQCi0JMTAxMSAgRHVldCAxUygxNjY1MCkrMVAKLQkxMDEyICBEdWV0IDFTKDE2ODUwKSsxUAotCTEwMjAgIEN5YmVyUGFyYWxsZWwgKDEtcG9ydCkKLQkxMDIxICBDeWJlclBhcmFsbGVsICgyLXBvcnQpCi0JMTAzMCAgQ3liZXJTZXJpYWwgKDItcG9ydCkgMTY1NTAKLQkxMDMxICBDeWJlclNlcmlhbCAoMi1wb3J0KSAxNjY1MAotCTEwMzIgIEN5YmVyU2VyaWFsICgyLXBvcnQpIDE2ODUwCi0JMTAzNCAgVHJpbyAyUygxNjU1MCkrMVAKLQkxMDM1ICBUcmlvIDJTKDE2NjUwKSsxUAotCTEwMzYgIFRyaW8gMlMoMTY4NTApKzFQCi0JMTA1MCAgQ3liZXJTZXJpYWwgKDQtcG9ydCkgMTY1NTAKLQkxMDUxICBDeWJlclNlcmlhbCAoNC1wb3J0KSAxNjY1MAotCTEwNTIgIEN5YmVyU2VyaWFsICg0LXBvcnQpIDE2ODUwCi0JMjAwMCAgQ3liZXJTZXJpYWwgKDEtcG9ydCkgMTY1NTAKLQkyMDAxICBDeWJlclNlcmlhbCAoMS1wb3J0KSAxNjY1MAotCTIwMDIgIEN5YmVyU2VyaWFsICgxLXBvcnQpIDE2ODUwCi0JMjAxMCAgRHVldCAxUygxNjU1MCkrMVAKLQkyMDExICBEdWV0IDFTKDE2NjUwKSsxUAotCTIwMTIgIER1ZXQgMVMoMTY4NTApKzFQCi0JMjAyMCAgQ3liZXJQYXJhbGxlbCAoMS1wb3J0KQotCTIwMjEgIEN5YmVyUGFyYWxsZWwgKDItcG9ydCkKLQkyMDMwICBDeWJlclNlcmlhbCAoMi1wb3J0KSAxNjU1MAotCQkxMzFmIDIwMzAgIFBDSSBTZXJpYWwgQ2FyZAotCTIwMzEgIEN5YmVyU2VyaWFsICgyLXBvcnQpIDE2NjUwCi0JMjAzMiAgQ3liZXJTZXJpYWwgKDItcG9ydCkgMTY4NTAKLQkyMDQwICBUcmlvIDFTKDE2NTUwKSsyUAotCTIwNDEgIFRyaW8gMVMoMTY2NTApKzJQCi0JMjA0MiAgVHJpbyAxUygxNjg1MCkrMlAKLQkyMDUwICBDeWJlclNlcmlhbCAoNC1wb3J0KSAxNjU1MAotCTIwNTEgIEN5YmVyU2VyaWFsICg0LXBvcnQpIDE2NjUwCi0JMjA1MiAgQ3liZXJTZXJpYWwgKDQtcG9ydCkgMTY4NTAKLQkyMDYwICBUcmlvIDJTKDE2NTUwKSsxUAotCTIwNjEgIFRyaW8gMlMoMTY2NTApKzFQCi0JMjA2MiAgVHJpbyAyUygxNjg1MCkrMVAKLQkyMDgxICBDeWJlclNlcmlhbCAoOC1wb3J0KSBTVDE2NjU0Ci0xMzIwICBDcnlwdG8gQUcKLTEzMjEgIEFyY29iZWwgR3JhcGhpY3MgQlYKLTEzMjIgIE1UVCBDby4sIEx0ZAotMTMyMyAgRG9tZSBJbmMKLTEzMjQgIFNwaGVyZSBDb21tdW5pY2F0aW9ucwotMTMyNSAgU2FsaXggVGVjaG5vbG9naWVzLCBJbmMKLTEzMjYgIFNlYWNoYW5nZSBpbnRlcm5hdGlvbmFsCi0xMzI3ICBWb3NzIHNjaWVudGlmaWMKLTEzMjggIHF1YWRyYW50IGludGVybmF0aW9uYWwKLTEzMjkgIFByb2R1Y3Rpdml0eSBFbmhhbmNlbWVudAotMTMyYSAgTWljcm9jb20gSW5jLgotMTMyYiAgQnJvYWRiYW5kIFRlY2hub2xvZ2llcwotMTMyYyAgTWljcmVsIEluYwotMTMyZCAgSW50ZWdyYXRlZCBTaWxpY29uIFNvbHV0aW9uLCBJbmMuCi0xMzMwICBNTUMgTmV0d29ya3MKLTEzMzEgIFJhZGlzeXMgQ29ycC4KLQkwMDMwICBFTlAtMjYxMQotCTgyMDAgIDgyNjAwIEhvc3QgQnJpZGdlCi0JODIwMSAgODI2MDAgSURFCi0JODIwMiAgODI2MDAgVVNCCi0JODIxMCAgODI2MDAgUENJIEJyaWRnZQotMTMzMiAgTWljcm8gTWVtb3J5Ci0JNTQxNSAgTU0tNTQxNUNOIFBDSSBNZW1vcnkgTW9kdWxlIHdpdGggQmF0dGVyeSBCYWNrdXAKLQk1NDI1ICBNTS01NDI1Q04gUENJIDY0LzY2IE1lbW9yeSBNb2R1bGUgd2l0aCBCYXR0ZXJ5IEJhY2t1cAotMTMzNCAgUmVkY3JlZWsgQ29tbXVuaWNhdGlvbnMsIEluYwotMTMzNSAgVmlkZW9tYWlsLCBJbmMKLTEzMzcgIFRoaXJkIFBsYW5ldCBQdWJsaXNoaW5nCi0xMzM4ICBCVCBFbGVjdHJvbmljcwotMTMzYSAgVnRlbCBDb3JwCi0xMzNiICBTb2Z0Y29tIE1pY3Jvc3lzdGVtcwotMTMzYyAgSG9sb250ZWNoIENvcnAKLTEzM2QgIFNTIFRlY2hub2xvZ2llcwotMTMzZSAgVmlydHVhbCBDb21wdXRlciBDb3JwCi0xMzNmICBTQ00gTWljcm9zeXN0ZW1zCi0xMzQwICBBdGFsbGEgQ29ycAotMTM0MSAgS3lvdG8gTWljcm9jb21wdXRlciBDbwotMTM0MiAgUHJvbWF4IFN5c3RlbXMgSW5jCi0xMzQzICBQaHlsb24gQ29tbXVuaWNhdGlvbnMgSW5jCi0xMzQ0ICBDcnVjaWFsIFRlY2hub2xvZ3kKLTEzNDUgIEFyZXNjb20gSW5jCi0xMzQ3ICBPZGV0aWNzCi0xMzQ5ICBTdW1pdG9tbyBFbGVjdHJpYyBJbmR1c3RyaWVzLCBMdGQuCi0xMzRhICBEVEMgVGVjaG5vbG9neSBDb3JwLgotCTAwMDEgIERvbWV4IDUzNgotCTAwMDIgIERvbWV4IERNWDMxOTRVUCBTQ1NJIEFkYXB0ZXIKLTEzNGIgIEFSSyBSZXNlYXJjaCBDb3JwLgotMTM0YyAgQ2hvcmkgSm9obyBTeXN0ZW0gQ28uIEx0ZAotMTM0ZCAgUENUZWwgSW5jCi0JMjE4OSAgSFNQNTYgTWljcm9Nb2RlbQotCTI0ODYgIDIzMDRXVCBWLjkyIE1EQyBNb2RlbQotCTc4OTAgIEhTUCBNaWNyb01vZGVtIDU2Ci0JCTEzNGQgMDAwMSAgUENUNzg5IGFkYXB0ZXIKLQk3ODkxICBIU1AgTWljcm9Nb2RlbSA1NgotCQkxMzRkIDAwMDEgIEhTUCBNaWNyb01vZGVtIDU2Ci0JNzg5MiAgSFNQIE1pY3JvTW9kZW0gNTYKLQk3ODkzICBIU1AgTWljcm9Nb2RlbSA1NgotCTc4OTQgIEhTUCBNaWNyb01vZGVtIDU2Ci0JNzg5NSAgSFNQIE1pY3JvTW9kZW0gNTYKLQk3ODk2ICBIU1AgTWljcm9Nb2RlbSA1NgotCTc4OTcgIEhTUCBNaWNyb01vZGVtIDU2Ci0xMzRlICBDU1RJCi0xMzRmICBBbGdvIFN5c3RlbSBDbyBMdGQKLTEzNTAgIFN5c3RlYyBDby4gTHRkCi0xMzUxICBTb25peCBJbmMKLTEzNTMgIFRoYWxlcyBJZGF0eXMKLQkwMDAyICBQcm9zZXJ2ZXIKLQkwMDAzICBQQ0ktRlVUCi0JMDAwNCAgUENJLVMwCi0JMDAwNSAgUENJLUZVVC1TMAotMTM1NCAgRHdhdmUgU3lzdGVtIEluYwotMTM1NSAgS3JhdG9zIEFuYWx5dGljYWwgTHRkCi0xMzU2ICBUaGUgTG9naWNhbCBDbwotMTM1OSAgUHJpc2EgTmV0d29ya3MKLTEzNWEgIEJyYWluIEJveGVzCi0xMzViICBHaWdhbmV0IEluYwotMTM1YyAgUXVhdGVjaCBJbmMKLQkwMDEwICBRU0MtMTAwCi0JMDAyMCAgRFNDLTEwMAotCTAwMzAgIERTQy0yMDAvMzAwCi0JMDA0MCAgUVNDLTIwMC8zMDAKLQkwMDUwICBFU0MtMTAwRAotCTAwNjAgIEVTQy0xMDBNCi0JMDBmMCAgTVBBQy0xMDAgU3luY3Jvbm91cyBTZXJpYWwgQ2FyZCAoWmlsb2cgODUyMzApCi0JMDE3MCAgUVNDTFAtMTAwCi0JMDE4MCAgRFNDTFAtMTAwCi0JMDE5MCAgU1NDTFAtMTAwCi0JMDFhMCAgUVNDTFAtMjAwLzMwMAotCTAxYjAgIERTQ0xQLTIwMC8zMDAKLQkwMWMwICBTU0NMUC0yMDAvMzAwCi0xMzVkICBBQkIgTmV0d29yayBQYXJ0bmVyIEFCCi0xMzVlICBTZWFsZXZlbCBTeXN0ZW1zIEluYwotCTUxMDEgIFJvdXRlIDU2LlBDSSAtIE11bHRpLVByb3RvY29sIFNlcmlhbCBJbnRlcmZhY2UgKFppbG9nIFoxNkMzMikKLQk3MTAxICBTaW5nbGUgUG9ydCBSUy0yMzIvNDIyLzQ4NS81MzAKLQk3MjAxICBEdWFsIFBvcnQgUlMtMjMyLzQyMi80ODUgSW50ZXJmYWNlCi0JNzIwMiAgRHVhbCBQb3J0IFJTLTIzMiBJbnRlcmZhY2UKLQk3NDAxICBGb3VyIFBvcnQgUlMtMjMyIEludGVyZmFjZQotCTc0MDIgIEZvdXIgUG9ydCBSUy00MjIvNDg1IEludGVyZmFjZQotCTc4MDEgIEVpZ2h0IFBvcnQgUlMtMjMyIEludGVyZmFjZQotCTc4MDQgIEVpZ2h0IFBvcnQgUlMtMjMyLzQyMi80ODUgSW50ZXJmYWNlCi0JODAwMSAgODAwMSBEaWdpdGFsIEkvTyBBZGFwdGVyCi0xMzVmICBJLURhdGEgSW50ZXJuYXRpb25hbCBBLVMKLTEzNjAgIE1laW5iZXJnIEZ1bmt1aHJlbgotCTAxMDEgIFBDSTMyIERDRjc3IFJhZGlvIENsb2NrCi0JMDEwMiAgUENJNTA5IERDRjc3IFJhZGlvIENsb2NrCi0JMDEwMyAgUENJNTEwIERDRjc3IFJhZGlvIENsb2NrCi0JMDIwMSAgR1BTMTY3UENJIEdQUyBSZWNlaXZlcgotCTAyMDIgIEdQUzE2OFBDSSBHUFMgUmVjZWl2ZXIKLQkwMjAzICBHUFMxNjlQQ0kgR1BTIFJlY2VpdmVyCi0JMDMwMSAgVENSNTEwUENJIElSSUcgUmVjZWl2ZXIKLTEzNjEgIFNvbGl0b24gU3lzdGVtcyBLLksuCi0xMzYyICBGdWppZmFjb20gQ29ycG9yYXRpb24KLTEzNjMgIFBob2VuaXggVGVjaG5vbG9neSBMdGQKLTEzNjQgIEFUTSBDb21tdW5pY2F0aW9ucyBJbmMKLTEzNjUgIEh5cGVyY29wZSBHbWJICi0xMzY2ICBUZWlqaW4gU2Vpa2kgQ28uIEx0ZAotMTM2NyAgSGl0YWNoaSBab3NlbiBDb3Jwb3JhdGlvbgotMTM2OCAgU2t5d2FyZSBDb3Jwb3JhdGlvbgotMTM2OSAgRGlnaWdyYW0KLTEzNmEgIEhpZ2ggU29mdCBUZWNoCi0xMzZiICBLYXdhc2FraSBTdGVlbCBDb3Jwb3JhdGlvbgotCWZmMDEgIEtMNUE3MjAwMiBNb3Rpb24gSlBFRwotMTM2YyAgQWR0ZWsgU3lzdGVtIFNjaWVuY2UgQ28gTHRkCi0xMzZkICBHaWdhbGFicyBJbmMKLTEzNmYgIEFwcGxpZWQgTWFnaWMgSW5jCi0xMzcwICBBVEwgUHJvZHVjdHMKLTEzNzEgIENOZXQgVGVjaG5vbG9neSBJbmMKLQk0MzRlICBHaWdhQ2FyZCBOZXR3b3JrIEFkYXB0ZXIKLQkJMTM3MSA0MzRlICBOLVdheSBQQ0ktQnVzIEdpZ2EtQ2FyZCAxMDAwLzEwMC8xME1icHMoTCkKLTEzNzMgIFNpbGljb24gVmlzaW9uIEluYwotMTM3NCAgU2lsaWNvbSBMdGQKLTEzNzUgIEFyZ29zeXN0ZW1zIEluYwotMTM3NiAgTE1DCi0xMzc3ICBFbGVjdHJvbmljIEVxdWlwbWVudCBQcm9kdWN0aW9uICYgRGlzdHJpYnV0aW9uIEdtYkgKLTEzNzggIFRlbGVtYW5uIENvLiBMdGQKLTEzNzkgIEFzYWhpIEthc2VpIE1pY3Jvc3lzdGVtcyBDbyBMdGQKLTEzN2EgIE1hcmsgb2YgdGhlIFVuaWNvcm4gSW5jCi0JMDAwMSAgUENJLTMyNCBBdWRpb3dpcmUgSW50ZXJmYWNlCi0xMzdiICBQUFQgVmlzaW9uCi0xMzdjICBJd2F0c3UgRWxlY3RyaWMgQ28gTHRkCi0xMzdkICBEeW5hY2hpcCBDb3Jwb3JhdGlvbgotMTM3ZSAgUGF0cmlvdCBTY2llbnRpZmljIENvcnBvcmF0aW9uCi0xMzdmICBKYXBhbiBTYXRlbGxpdGUgU3lzdGVtcyBJbmMKLTEzODAgIFNhbnJpdHogQXV0b21hdGlvbiBDbyBMdGQKLTEzODEgIEJyYWlucyBDby4gTHRkCi0xMzgyICBNYXJpYW4gLSBFbGVjdHJvbmljICYgU29mdHdhcmUKLQkwMDAxICBBUkM4OCBhdWRpbyByZWNvcmRpbmcgY2FyZAotCTIwMDggIFByb2RpZiA5NiBQcm8gc291bmQgc3lzdGVtCi0JMjA4OCAgTWFyYyA4IE1pZGkgc291bmQgc3lzdGVtCi0JMjBjOCAgTWFyYyBBIHNvdW5kIHN5c3RlbQotCTQwMDggIE1hcmMgMiBzb3VuZCBzeXN0ZW0KLQk0MDEwICBNYXJjIDIgUHJvIHNvdW5kIHN5c3RlbQotCTQwNDggIE1hcmMgNCBNSURJIHNvdW5kIHN5c3RlbQotCTQwODggIE1hcmMgNCBEaWdpIHNvdW5kIHN5c3RlbQotCTQyNDggIE1hcmMgWCBzb3VuZCBzeXN0ZW0KLTEzODMgIENvbnRyb2xuZXQgSW5jCi0xMzg0ICBSZWFsaXR5IFNpbXVsYXRpb24gU3lzdGVtcyBJbmMKLTEzODUgIE5ldGdlYXIKLSMgTm90ZTogVGhpcyBsaXN0cyBhcyBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJbmMuIEFSNTIxMiA4MDIuMTFhYmcgTklDIGJlY2F1c2Ugb2YgTWFkd2lmaQotCTAwMTMgIFdHMzExVAotCTMxMWEgIEdBNTExIEdpZ2FiaXQgRXRoZXJuZXQKLQk0MTAwICA4MDIuMTFiIFdpcmVsZXNzIEFkYXB0ZXIgKE1BMzAxKQotCTQxMDUgIE1BMzExIDgwMi4xMWIgd2lyZWxlc3MgYWRhcHRlcgotCTQ0MDAgIFdBRzUxMSA4MDIuMTFhL2IvZyBEdWFsIEJhbmQgV2lyZWxlc3MgUEMgQ2FyZAotCTQ2MDAgIFdBRzUxMSA4MDIuMTFhL2IvZyBEdWFsIEJhbmQgV2lyZWxlc3MgUEMgQ2FyZAotCTQ2MDEgIFdBRzUxMSA4MDIuMTFhL2IvZyBEdWFsIEJhbmQgV2lyZWxlc3MgUEMgQ2FyZAotCTQ2MTAgIFdBRzUxMSA4MDIuMTFhL2IvZyBEdWFsIEJhbmQgV2lyZWxlc3MgUEMgQ2FyZAotCTRhMDAgIFdBRzMxMSA4MDIuMTFhL2cgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQk0YzAwICBXRzMxMXYyIDU0IE1icHMgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQk2MjBhICBHQTYyMCBHaWdhYml0IEV0aGVybmV0Ci0JNjIyYSAgR0E2MjIKLQk2MzBhICBHQTYzMCBHaWdhYml0IEV0aGVybmV0Ci0JZjAwNCAgRkEzMTBUWAotMTM4NiAgVmlkZW8gRG9tYWluIFRlY2hub2xvZ2llcwotMTM4NyAgU3lzdHJhbiBDb3JwCi0xMzg4ICBIaXRhY2hpIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kgQ28gTHRkCi0xMzg5ICBBcHBsaWNvbSBJbnRlcm5hdGlvbmFsCi0JMDAwMSAgUENJMTUwMFBGQiBbSW50ZWxsaWdlbnQgZmllbGRidXMgYWRhcHRvcl0KLTEzOGEgIEZ1c2lvbiBNaWNyb21lZGlhIENvcnAKLTEzOGIgIFRva2ltZWMgSW5jCi0xMzhjICBTaWxpY29uIFJlYWxpdHkKLTEzOGQgIEZ1dHVyZSBUZWNobm8gRGVzaWducyBwdGUgTHRkCi0xMzhlICBCYXNsZXIgR21iSAotMTM4ZiAgUGF0YXBzY28gRGVzaWducyBJbmMKLTEzOTAgIENvbmNlcHQgRGV2ZWxvcG1lbnQgSW5jCi0xMzkxICBEZXZlbG9wbWVudCBDb25jZXB0cyBJbmMKLTEzOTIgIE1lZGlhbGlnaHQgSW5jCi0xMzkzICBNb3hhIFRlY2hub2xvZ2llcyBDbyBMdGQKLQkxMDQwICBTbWFydGlvIEMxMDRIL1BDSQotCTExNDEgIEluZHVzdHJpbyBDUC0xMTQKLQkxNjgwICBTbWFydGlvIEMxNjhIL1BDSQotCTIwNDAgIEludGVsbGlvIENQLTIwNEoKLQkyMTgwICBJbnRlbGxpbyBDMjE4IFR1cmJvIFBDSQotCTMyMDAgIEludGVsbGlvIEMzMjAgVHVyYm8gUENJCi0xMzk0ICBMZXZlbCBPbmUgQ29tbXVuaWNhdGlvbnMKLQkwMDAxICBMWFQxMDAxIEdpZ2FiaXQgRXRoZXJuZXQKLQkJMTM5NCAwMDAxICBOZXRDZWxlcmF0b3IgQWRhcHRlcgotMTM5NSAgQW1iaWNvbSBJbmMKLTEzOTYgIENpcGhlciBTeXN0ZW1zIEluYwotMTM5NyAgQ29sb2duZSBDaGlwIERlc2lnbnMgR21iSAotCTJiZDAgIElTRE4gbmV0d29yayBjb250cm9sbGVyIFtIRkMtUENJXQotCQkxMzk3IDJiZDAgIElTRE4gQm9hcmQKLQkJZTRiZiAxMDAwICBDSTEtMS1IYXJwCi0xMzk4ICBDbGFyaW9uIGNvLiBMdGQKLTEzOTkgIFJpb3Mgc3lzdGVtcyBDbyBMdGQKLTEzOWEgIEFsYWNyaXRlY2ggSW5jCi0JMDAwMSAgUXVhZCBQb3J0IDEwLzEwMCBTZXJ2ZXIgQWNjZWxlcmF0b3IKLQkwMDAzICBTaW5nbGUgUG9ydCAxMC8xMDAgU2VydmVyIEFjY2VsZXJhdG9yCi0JMDAwNSAgU2luZ2xlIFBvcnQgR2lnYWJpdCBTZXJ2ZXIgQWNjZWxlcmF0b3IKLTEzOWIgIE1lZGlhc29uaWMgTXVsdGltZWRpYSBTeXN0ZW1zIEx0ZAotMTM5YyAgUXVhbnR1bSAzZCBJbmMKLTEzOWQgIEVQTCBsaW1pdGVkCi0xMzllICBNZWRpYTQKLTEzOWYgIEFldGhyYSBzLnIubC4KLTEzYTAgIENyeXN0YWwgR3JvdXAgSW5jCi0xM2ExICBLYXdhc2FraSBIZWF2eSBJbmR1c3RyaWVzIEx0ZAotMTNhMiAgT3NpdGVjaCBDb21tdW5pY2F0aW9ucyBJbmMKLTEzYTMgIEhpZm4gSW5jLgotCTAwMDUgIDc3NTEgU2VjdXJpdHkgUHJvY2Vzc29yCi0JMDAwNiAgNjUwMCBQdWJsaWMgS2V5IFByb2Nlc3NvcgotCTAwMDcgIDc4MTEgU2VjdXJpdHkgUHJvY2Vzc29yCi0JMDAxMiAgNzk1MSBTZWN1cml0eSBQcm9jZXNzb3IKLQkwMDE0ICA3OFhYIFNlY3VyaXR5IFByb2Nlc3NvcgotCTAwMTYgIDgwNjUgU2VjdXJpdHkgUHJvY2Vzc29yCi0JMDAxNyAgODE2NSBTZWN1cml0eSBQcm9jZXNzb3IKLQkwMDE4ICA4MTU0IFNlY3VyaXR5IFByb2Nlc3NvcgotCTAwMWQgIDc5NTYgU2VjdXJpdHkgUHJvY2Vzc29yCi0JMDAyMCAgNzk1NSBTZWN1cml0eSBQcm9jZXNzb3IKLTEzYTQgIFJhc2NvbSBJbmMKLTEzYTUgIEF1ZGlvIERpZ2l0YWwgSW1hZ2luZyBJbmMKLTEzYTYgIFZpZGVvbmljcyBJbmMKLTEzYTcgIFRlbGVzIEFHCi0xM2E4ICBFeGFyIENvcnAuCi0JMDE1NCAgWFIxN0MxNTQgUXVhZCBVQVJUCi0JMDE1OCAgWFIxN0MxNTggT2N0YWwgVUFSVAotMTNhOSAgU2llbWVucyBNZWRpY2FsIFN5c3RlbXMsIFVsdHJhc291bmQgR3JvdXAKLTEzYWEgIEJyb2FkYmFuZCBOZXR3b3JrcyBJbmMKLTEzYWIgIEFyY29tIENvbnRyb2wgU3lzdGVtcyBMdGQKLTEzYWMgIE1vdGlvbiBNZWRpYSBUZWNobm9sb2d5IEx0ZAotMTNhZCAgTmV4dXMgSW5jCi0xM2FlICBBTEQgVGVjaG5vbG9neSBMdGQKLTEzYWYgIFQuU3F3YXJlCi0xM2IwICBNYXhzcGVlZCBDb3JwCi0xM2IxICBUYW11cmEgY29ycG9yYXRpb24KLTEzYjIgIFRlY2hubyBDaGlwcyBDby4gTHRkCi0xM2IzICBMYW5hcnQgQ29ycG9yYXRpb24KLTEzYjQgIFdlbGxiZWFuIENvIEluYwotMTNiNSAgQVJNCi0xM2I2ICBEbG9nIEdtYkgKLTEzYjcgIExvZ2ljIERldmljZXMgSW5jCi0xM2I4ICBOb2tpYSBUZWxlY29tbXVuaWNhdGlvbnMgb3kKLTEzYjkgIEVsZWNvbSBDbyBMdGQKLTEzYmEgIE94Zm9yZCBJbnN0cnVtZW50cwotMTNiYiAgU2FueW8gVGVjaG5vc291bmQgQ28gTHRkCi0xM2JjICBCaXRyYW4gQ29ycG9yYXRpb24KLTEzYmQgIFNoYXJwIGNvcnBvcmF0aW9uCi0xM2JlICBNaXJva3UgSnlvaG8gU2VydmljZSBDby4gTHRkCi0xM2JmICBTaGFyZXdhdmUgSW5jCi0xM2MwICBNaWNyb2dhdGUgQ29ycG9yYXRpb24KLQkwMDEwICBTeW5jTGluayBBZGFwdGVyIHYxCi0JMDAyMCAgU3luY0xpbmsgU0NDIEFkYXB0ZXIKLQkwMDMwICBTeW5jTGluayBNdWx0aXBvcnQgQWRhcHRlcgotCTAyMTAgIFN5bmNMaW5rIEFkYXB0ZXIgdjIKLTEzYzEgIDN3YXJlIEluYwotCTEwMDAgIDN3YXJlIEluYyAzd2FyZSA1eHh4LzZ4eHgtc2VyaWVzIFBBVEEtUkFJRAotCTEwMDEgIDN3YXJlIEluYyAzd2FyZSA3eHh4Lzh4eHgtc2VyaWVzIFBBVEEvU0FUQS1SQUlECi0JCTEzYzEgMTAwMSAgM3dhcmUgSW5jIDN3YXJlIDd4eHgvOHh4eC1zZXJpZXMgUEFUQS9TQVRBLVJBSUQKLQkxMDAyICAzd2FyZSBJbmMgM3dhcmUgOXh4eC1zZXJpZXMgU0FUQS1SQUlECi0xM2MyICBUZWNobm90cmVuZCBTeXN0ZW10ZWNobmlrIEdtYkgKLTEzYzMgIEphbnogQ29tcHV0ZXIgQUcKLTEzYzQgIFBoYXNlIE1ldHJpY3MKLTEzYzUgIEFscGhpIFRlY2hub2xvZ3kgQ29ycAotMTNjNiAgQ29uZG9yIEVuZ2luZWVyaW5nIEluYwotCTA1MjAgIENFSS01MjAgQTQyOSBDYXJkCi0JMDYyMCAgQ0VJLTYyMCBBNDI5IENhcmQKLQkwODIwICBDRUktODIwIEE0MjkgQ2FyZAotMTNjNyAgQmx1ZSBDaGlwIFRlY2hub2xvZ3kgTHRkCi0xM2M4ICBBcHB0ZWNoIEluYwotMTNjOSAgRWF0b24gQ29ycG9yYXRpb24KLTEzY2EgIElvbWVnYSBDb3Jwb3JhdGlvbgotMTNjYiAgWWFubyBFbGVjdHJpYyBDbyBMdGQKLTEzY2MgIE1ldGhldXMgQ29ycG9yYXRpb24KLTEzY2QgIENvbXBhdGlibGUgU3lzdGVtcyBDb3Jwb3JhdGlvbgotMTNjZSAgQ29jb20gQS9TCi0xM2NmICBTdHVkaW8gQXVkaW8gJiBWaWRlbyBMdGQKLTEzZDAgIFRlY2hzYW4gRWxlY3Ryb25pY3MgQ28gTHRkCi0JMjEwMyAgQjJDMiBGbGV4Q29wSUkgRFZCIGNoaXAgLyBUZWNobmlzYXQgU2t5U3RhcjIgRFZCIGNhcmQKLQkyMjAwICBCMkMyIEZsZXhDb3BJSUkgRFZCIGNoaXAgLyBUZWNobmlzYXQgU2t5U3RhcjIgRFZCIGNhcmQKLTEzZDEgIEFib2NvbSBTeXN0ZW1zIEluYwotCWFiMDIgIEFETXRlayBDZW50YXVyLUMgcmV2IDE3IFtELUxpbmsgREZFLTY4MFRYXSBDYXJkQnVzIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCWFiMDMgIDIxeDR4IERFQy1UdWxpcCBjb21wYXRpYmxlIDEwLzEwMCBFdGhlcm5ldAotCWFiMDYgIFJUTDgxMzkgW0ZFMjAwMFZYXSBDYXJkQnVzIEZhc3QgRXRoZXJuZXQgQXR0YWNoZWQgUG9ydCBBZGFwdGVyCi0JYWIwOCAgMjF4NHggREVDLVR1bGlwIGNvbXBhdGlibGUgMTAvMTAwIEV0aGVybmV0Ci0xM2QyICBTaGFyayBNdWx0aW1lZGlhIEluYwotMTNkMyAgSU1DIE5ldHdvcmtzCi0xM2Q0ICBHcmFwaGljcyBNaWNyb3N5c3RlbXMgSW5jCi0xM2Q1ICBNZWRpYSAxMDAgSW5jCi0xM2Q2ICBLLkkuIFRlY2hub2xvZ3kgQ28gTHRkCi0xM2Q3ICBUb3NoaWJhIEVuZ2luZWVyaW5nIENvcnBvcmF0aW9uCi0xM2Q4ICBQaG9ib3MgY29ycG9yYXRpb24KLTEzZDkgIEFwZXggUEMgU29sdXRpb25zIEluYwotMTNkYSAgSW50cmVzb3VyY2UgU3lzdGVtcyBwdGUgTHRkCi0xM2RiICBKYW5pY2ggJiBLbGFzcyBDb21wdXRlcnRlY2huaWsgR21iSAotMTNkYyAgTmV0Ym9vc3QgQ29ycG9yYXRpb24KLTEzZGQgIE11bHRpbWVkaWEgQnVuZGxlIEluYwotMTNkZSAgQUJCIFJvYm90aWNzIFByb2R1Y3RzIEFCCi0xM2RmICBFLVRlY2ggSW5jCi0JMDAwMSAgUENJNTZSVlAgTW9kZW0KLQkJMTNkZiAwMDAxICBQQ0k1NlJWUCBNb2RlbQotMTNlMCAgR1ZDIENvcnBvcmF0aW9uCi0xM2UxICBTaWxpY29tIE11bHRpbWVkaWEgU3lzdGVtcyBJbmMKLTEzZTIgIER5bmFtaWNzIFJlc2VhcmNoIENvcnBvcmF0aW9uCi0xM2UzICBOZXN0IEluYwotMTNlNCAgQ2FsY3VsZXggSW5jCi0xM2U1ICBUZWxlc29mdCBEZXNpZ24gTHRkCi0xM2U2ICBBcmdvc3kgcmVzZWFyY2ggSW5jCi0xM2U3ICBOQUMgSW5jb3Jwb3JhdGVkCi0xM2U4ICBDaGlwIEV4cHJlc3MgQ29ycG9yYXRpb24KLTEzZTkgIEludHJhc2VydmVyIFRlY2hub2xvZ3kgSW5jCi0xM2VhICBEYWxsYXMgU2VtaWNvbmR1Y3RvcgotMTNlYiAgSGF1cHBhdWdlIENvbXB1dGVyIFdvcmtzIEluYwotMTNlYyAgWnlkYWNyb24gSW5jCi0xM2VkICBSYXl0aGVpb24gRS1TeXN0ZW1zCi0xM2VlICBIYXllcyBNaWNyb2NvbXB1dGVyIFByb2R1Y3RzIEluYwotMTNlZiAgQ29wcGVyY29tIEluYwotMTNmMCAgU3VuZGFuY2UgVGVjaG5vbG9neSBJbmMKLQkwMjAxICBTVDIwMSBTdW5kYW5jZSBFdGhlcm5ldAotMTNmMSAgT2NlJyAtIFRlY2hub2xvZ2llcyBCLlYuCi0xM2YyICBGb3JkIE1pY3JvZWxlY3Ryb25pY3MgSW5jCi0xM2YzICBNY2RhdGEgQ29ycG9yYXRpb24KLTEzZjQgIFRyb2lrYSBOZXR3b3JrcywgSW5jLgotCTE0MDEgIFplbnRhaSBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLTEzZjUgIEthbnNhaSBFbGVjdHJpYyBDby4gTHRkCi0xM2Y2ICBDLU1lZGlhIEVsZWN0cm9uaWNzIEluYwotCTAwMTEgIENNSTg3MzgKLQkwMTAwICBDTTgzMzhBCi0JCTEzZjYgZmZmZiAgQ01JODMzOC9DM0RYIFBDSSBBdWRpbyBEZXZpY2UKLQkwMTAxICBDTTgzMzhCCi0JCTEzZjYgMDEwMSAgQ01JODMzOC0wMzEgUENJIEF1ZGlvIERldmljZQotCTAxMTEgIENNODczOAotCQkxMDE5IDA5NzAgIFA2U1RQLUZMIG1vdGhlcmJvYXJkCi0JCTEwNDMgODAzNSAgQ1VTSS1GWCBtb3RoZXJib2FyZAotCQkxMDQzIDgwNzcgIENNSTg3MzggNi1jaGFubmVsIGF1ZGlvIGNvbnRyb2xsZXIKLQkJMTA0MyA4MGUyICBDTUk4NzM4IDZjaC1NWAotCQkxM2Y2IDAxMTEgIENNSTg3MzgvQzNEWCBQQ0kgQXVkaW8gRGV2aWNlCi0JCTE2ODEgYTAwMCAgR2FtZXN1cnJvdW5kIE1VU0UgWEwKLQkwMjExICBDTTg3MzgKLTEzZjcgIFdpbGRmaXJlIENvbW11bmljYXRpb25zCi0xM2Y4ICBBZCBMaWIgTXVsdGltZWRpYSBJbmMKLTEzZjkgIE5UVCBBZHZhbmNlZCBUZWNobm9sb2d5IENvcnAuCi0xM2ZhICBQZW50bGFuZCBTeXN0ZW1zIEx0ZAotMTNmYiAgQXlkaW4gQ29ycAotMTNmYyAgQ29tcHV0ZXIgUGVyaXBoZXJhbHMgSW50ZXJuYXRpb25hbAotMTNmZCAgTWljcm8gU2NpZW5jZSBJbmMKLTEzZmUgIEFkdmFudGVjaCBDby4gTHRkCi0JMTI0MCAgUENJLTEyNDAgNC1jaGFubmVsIHN0ZXBwZXIgbW90b3IgY29udHJvbGxlciBjYXJkIHcuICBOb3ZhIEVsZWN0cm9uaWNzIE1DWDMxNAotCTE2MDAgIFBDSS0xNjEyIDQtcG9ydCBSUy0yMzIvNDIyLzQ4NSBQQ0kgQ29tbXVuaWNhdGlvbiBDYXJkCi0JMTc1MiAgUENJLTE3NTIKLQkxNzU0ICBQQ0ktMTc1NAotCTE3NTYgIFBDSS0xNzU2Ci0xM2ZmICBTaWxpY29uIFNwaWNlIEluYwotMTQwMCAgQXJ0eCBJbmMKLQkxNDAxICA5NDMyIFRYCi0xNDAxICBDUi1TeXN0ZW1zIEEvUwotMTQwMiAgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJICi0xNDAzICBBc2NvciBJbmMKLTE0MDQgIEZ1bmRhbWVudGFsIFNvZnR3YXJlIEluYwotMTQwNSAgRXhjYWxpYnVyIFN5c3RlbXMgSW5jCi0xNDA2ICBPY2UnIFByaW50aW5nIFN5c3RlbXMgR21iSAotMTQwNyAgTGF2YSBDb21wdXRlciBtZmcgSW5jCi0JMDEwMCAgTGF2YSBEdWFsIFNlcmlhbAotCTAxMDEgIExhdmEgUXVhdHJvIEEKLQkwMTAyICBMYXZhIFF1YXRybyBCCi0JMDExMCAgTGF2YSBEU2VyaWFsLVBDSSBQb3J0IEEKLQkwMTExICBMYXZhIERTZXJpYWwtUENJIFBvcnQgQgotCTAxMjAgIFF1YXR0cm8tUENJIEEKLQkwMTIxICBRdWF0dHJvLVBDSSBCCi0JMDE4MCAgTGF2YSBPY3RvIEEKLQkwMTgxICBMYXZhIE9jdG8gQgotCTAyMDAgIExhdmEgUG9ydCBQbHVzCi0JMDIwMSAgTGF2YSBRdWFkIEEKLQkwMjAyICBMYXZhIFF1YWQgQgotCTAyMjAgIExhdmEgUXVhdHRybyBQQ0kgUG9ydHMgQS9CCi0JMDIyMSAgTGF2YSBRdWF0dHJvIFBDSSBQb3J0cyBDL0QKLQkwNTAwICBMYXZhIFNpbmdsZSBTZXJpYWwKLQkwNjAwICBMYXZhIFBvcnQgNjUwCi0JODAwMCAgTGF2YSBQYXJhbGxlbAotCTgwMDEgIER1YWwgcGFyYWxsZWwgcG9ydCBjb250cm9sbGVyIEEKLQk4MDAyICBMYXZhIER1YWwgUGFyYWxsZWwgcG9ydCBBCi0JODAwMyAgTGF2YSBEdWFsIFBhcmFsbGVsIHBvcnQgQgotCTg4MDAgIEJPQ0EgUmVzZWFyY2ggSU9QUEFSCi0xNDA4ICBBbG9rYSBDby4gTHRkCi0xNDA5ICBUaW1lZGlhIFRlY2hub2xvZ3kgQ28gTHRkCi0JNzE2OCAgUENJMlM1NTAgKER1YWwgMTY1NTAgVUFSVCkKLTE0MGEgIERTUCBSZXNlYXJjaCBJbmMKLTE0MGIgIFJhbWl4IEluYwotMTQwYyAgRWxtaWMgU3lzdGVtcyBJbmMKLTE0MGQgIE1hdHN1c2hpdGEgRWxlY3RyaWMgV29ya3MgTHRkCi0xNDBlICBHb2VwZWwgRWxlY3Ryb25pYyBHbWJICi0xNDBmICBTYWxpZW50IFN5c3RlbXMgQ29ycAotMTQxMCAgTWlkYXMgbGFiIEluYwotMTQxMSAgSWtvcyBTeXN0ZW1zIEluYwotIyBmb3JtZXJseSBJQyBFbnNlbWJsZSBJbmMuCi0xNDEyICBWSUEgVGVjaG5vbG9naWVzIEluYy4KLQkxNzEyICBJQ0UxNzEyIFtFbnZ5MjRdIFBDSSBNdWx0aS1DaGFubmVsIEkvTyBDb250cm9sbGVyCi0JCTE0MTIgMTcxMiAgSG9vbnRlY2ggU1QgQXVkaW8gRFNQIDI0Ci0JCTE0MTIgZDYzMCAgTS1BdWRpbyBEZWx0YSAxMDEwCi0JCTE0MTIgZDYzMSAgTS1BdWRpbyBEZWx0YSBEaU8KLQkJMTQxMiBkNjMyICBNLUF1ZGlvIERlbHRhIDY2Ci0JCTE0MTIgZDYzMyAgTS1BdWRpbyBEZWx0YSA0NAotCQkxNDEyIGQ2MzQgIE0tQXVkaW8gRGVsdGEgQXVkaW9waGlsZQotCQkxNDEyIGQ2MzUgIE0tQXVkaW8gRGVsdGEgVERJRgotCQkxNDEyIGQ2MzcgIE0tQXVkaW8gRGVsdGEgUkJVUwotCQkxNDEyIGQ2MzggIE0tQXVkaW8gRGVsdGEgNDEwCi0JCTE0MTIgZDYzYiAgTS1BdWRpbyBEZWx0YSAxMDEwTFQKLQkJMTQxMiBkNjNjICBEaWdpZ3JhbSBWWDQ0MgotCQkxNDE2IDE3MTIgIEhvb250ZWNoIFNUIEF1ZGlvIERTUCAyNCBNZWRpYSA3LjEKLQkJMTUzYiAxMTE1ICBFV1M4OCBNVAotCQkxNTNiIDExMjUgIEVXUzg4IE1UIChNYXN0ZXIpCi0JCTE1M2IgMTEyYiAgRVdTODggRAotCQkxNTNiIDExMmMgIEVXUzg4IEQgKE1hc3RlcikKLQkJMTUzYiAxMTMwICBFV1ggMjQvOTYKLQkJMTUzYiAxMTM4ICBETVggNmZpcmUgMjQvOTYKLQkJMTUzYiAxMTUxICBQSEFTRTg4Ci0JCTE2Y2UgMTA0MCAgRWRpcm9sIERBLTI0OTYKLQkxNzI0ICBWVDE3MjAvMjQgW0VudnkyNFBUL0hUXSBQQ0kgTXVsdGktQ2hhbm5lbCBBdWRpbyBDb250cm9sbGVyCi0JCTE0MTIgMTcyNCAgQU1QIEx0ZCBBVURJTzIwMDAKLQkJMTQxMiAzNjMwICBNLUF1ZGlvIFJldm9sdXRpb24gNy4xCi0JCTE1M2IgMTE0NSAgQXVyZW9uIDcuMSBTcGFjZQotCQkxNTNiIDExNDcgIEF1cmVvbiA1LjEgU2t5Ci0JCTE1M2IgMTE1MyAgQXVyZW9uIDcuMSBVbml2ZXJzZQotCQkyNzBmIGY2NDEgIFpORjMtMTUwCi0JCTI3MGYgZjY0NSAgWk5GMy0yNTAKLTE0MTMgIEFkZG9uaWNzCi0xNDE0ICBNaWNyb3NvZnQgQ29ycG9yYXRpb24KLTE0MTUgIE94Zm9yZCBTZW1pY29uZHVjdG9yIEx0ZAotCTg0MDMgIFZTY29tIDAxMUgtRVAxIDEgcG9ydCBwYXJhbGxlbCBhZGFwdG9yCi0JOTUwMSAgT1gxNlBDSTk1NCAoUXVhZCAxNjk1MCBVQVJUKSBmdW5jdGlvbiAwCi0JCTEzMWYgMjA1MCAgQ3liZXJQcm8gKDQtcG9ydCkKLSMgTW9kZWwgSU8xMDg1LCBQYXJ0IE5vOiBKSi1QNDYwMTIKLQkJMTMxZiAyMDUxICBDeWJlclNlcmlhbCA0UyBQbHVzCi0JCTE1ZWQgMjAwMCAgTUNDUiBTZXJpYWwgcDAtMyBvZiA4Ci0JCTE1ZWQgMjAwMSAgTUNDUiBTZXJpYWwgcDAtMyBvZiAxNgotCTk1MGEgIEVYU1lTIEVYLTQxMDkyIER1YWwgMTY5NTAgU2VyaWFsIGFkYXB0ZXIKLQk5NTBiICBPWENCOTUwIENhcmRidXMgMTY5NTAgVUFSVAotCTk1MTAgIE9YMTZQQ0k5NTQgKFF1YWQgMTY5NTAgVUFSVCkgZnVuY3Rpb24gMSAoRGlzYWJsZWQpCi0JOTUxMSAgT1gxNlBDSTk1NCAoUXVhZCAxNjk1MCBVQVJUKSBmdW5jdGlvbiAxCi0JCTE1ZWQgMjAwMCAgTUNDUiBTZXJpYWwgcDQtNyBvZiA4Ci0JCTE1ZWQgMjAwMSAgTUNDUiBTZXJpYWwgcDQtMTUgb2YgMTYKLQk5NTIxICBPWDE2UENJOTUyIChEdWFsIDE2OTUwIFVBUlQpCi0xNDE2ICBNdWx0aXdhdmUgSW5ub3ZhdGlvbiBwdGUgTHRkCi0xNDE3ICBDb252ZXJnZW5ldCBUZWNobm9sb2dpZXMgSW5jCi0xNDE4ICBLeXVzaHUgZWxlY3Ryb25pY3Mgc3lzdGVtcyBJbmMKLTE0MTkgIEV4Y2VsIFN3aXRjaGluZyBDb3JwCi0xNDFhICBBcGFjaGUgTWljcm8gUGVyaXBoZXJhbHMgSW5jCi0xNDFiICBab29tIFRlbGVwaG9uaWNzIEluYwotMTQxZCAgRGlnaXRhbiBTeXN0ZW1zIEluYwotMTQxZSAgRmFudWMgTHRkCi0xNDFmICBWaXNpb250ZWNoIEx0ZAotMTQyMCAgUHNpb24gRGFjb20gcGxjCi0JODAwMiAgR29sZCBDYXJkIE5ldEdsb2JhbCA1NmsrMTAvMTAwTWIgQ2FyZEJ1cyAoRXRoZXJuZXQgcGFydCkKLQk4MDAzICBHb2xkIENhcmQgTmV0R2xvYmFsIDU2aysxMC8xMDBNYiBDYXJkQnVzIChNb2RlbSBwYXJ0KQotMTQyMSAgQWRzIFRlY2hub2xvZ2llcyBJbmMKLTE0MjIgIFlncmVjIFN5c3RlbXMgQ28gTHRkCi0xNDIzICBDdXN0b20gVGVjaG5vbG9neSBDb3JwLgotMTQyNCAgVmlkZW9zZXJ2ZXIgQ29ubmVjdGlvbnMKLTE0MjUgIENoZWxzaW8gQ29tbXVuaWNhdGlvbnMgSW5jCi0xNDI2ICBTdG9yYWdlIFRlY2hub2xvZ3kgQ29ycC4KLTE0MjcgIEJldHRlciBPbi1MaW5lIFNvbHV0aW9ucwotMTQyOCAgRWRlYyBDbyBMdGQKLTE0MjkgIFVuZXggVGVjaG5vbG9neSBDb3JwLgotMTQyYSAgS2luZ21heCBUZWNobm9sb2d5IEluYwotMTQyYiAgUmFkaW9sYW4KLTE0MmMgIE1pbnRvbiBPcHRpYyBJbmR1c3RyeSBDbyBMdGQKLTE0MmQgIFBpeCBzdHJlYW0gSW5jCi0xNDJlICBWaXRlYyBNdWx0aW1lZGlhCi0JNDAyMCAgVk0yLTIgW1ZpZGVvIE1ha2VyIDJdIE1QRUcxLzIgRW5jb2RlcgotMTQyZiAgUmFkaWNvbSBSZXNlYXJjaCBJbmMKLTE0MzAgIElUVCBBZXJvc3BhY2UvQ29tbXVuaWNhdGlvbnMgRGl2aXNpb24KLTE0MzEgIEdpbGF0IFNhdGVsbGl0ZSBOZXR3b3JrcwotMTQzMiAgRWRpbWF4IENvbXB1dGVyIENvLgotCTkxMzAgIFJUTDgxeHggRmFzdCBFdGhlcm5ldAotMTQzMyAgRWx0ZWMgRWxla3Ryb25payBHbWJICi0xNDM1ICBSZWFsIFRpbWUgRGV2aWNlcyBVUyBJbmMuCi0xNDM2ICBDSVMgVGVjaG5vbG9neSBJbmMKLTE0MzcgIE5pc3NpbiBJbmMgQ28KLTE0MzggIEF0bWVsLWRyZWFtCi0xNDM5ICBPdXRzb3VyY2UgRW5naW5lZXJpbmcgJiBNZmcuIEluYwotMTQzYSAgU3RhcmdhdGUgU29sdXRpb25zIEluYwotMTQzYiAgQ2Fub24gUmVzZWFyY2ggQ2VudGVyLCBBbWVyaWNhCi0xNDNjICBBbWxvZ2ljIEluYwotMTQzZCAgVGFtYXJhY2sgTWljcm9lbGVjdHJvbmljcyBJbmMKLTE0M2UgIEpvbmVzIEZ1dHVyZXggSW5jCi0xNDNmICBMaWdodHdlbGwgQ28gTHRkIC0gWmF4IERpdmlzaW9uCi0xNDQwICBBTEdPTCBDb3JwLgotMTQ0MSAgQUdJRSBMdGQKLTE0NDIgIFBob2VuaXggQ29udGFjdCBHbWJIICYgQ28uCi0xNDQzICBVbmlicmFpbiBTLkEuCi0xNDQ0ICBUUlcKLTE0NDUgIExvZ2ljYWwgRE8gTHRkCi0xNDQ2ICBHcmFwaGluIENvIEx0ZAotMTQ0NyAgQUlNIEdtQkgKLTE0NDggIEFsZXNpcyBTdHVkaW8gRWxlY3Ryb25pY3MKLTE0NDkgIFRVVCBTeXN0ZW1zIEluYwotMTQ0YSAgQWRsaW5rIFRlY2hub2xvZ3kKLQk3Mjk2ICBQQ0ktNzI5NgotCTc0MzIgIFBDSS03NDMyCi0JNzQzMyAgUENJLTc0MzMKLQk3NDM0ICBQQ0ktNzQzNAotCTc4NDEgIFBDSS03ODQxCi0JODEzMyAgUENJLTgxMzMKLQk4MTY0ICBQQ0ktODE2NAotCTg1NTQgIFBDSS04NTU0Ci0JOTExMSAgUENJLTkxMTEKLQk5MTEzICBQQ0ktOTExMwotCTkxMTQgIFBDSS05MTE0Ci0xNDRiICBMb3Jvbml4IEluZm9ybWF0aW9uIFN5c3RlbXMgSW5jCi0xNDRjICBDYXRhbGluYSBSZXNlYXJjaCBJbmMKLTE0NGQgIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28gTHRkCi0xNDRlICBPTElURUMKLTE0NGYgIEFza2V5IENvbXB1dGVyIENvcnAuCi0xNDUwICBPY3RhdmUgQ29tbXVuaWNhdGlvbnMgSW5kLgotMTQ1MSAgU1AzRCBDaGlwIERlc2lnbiBHbUJICi0xNDUzICBNWUNPTSBJbmMKLTE0NTQgIEFsdGlnYSBOZXR3b3JrcwotMTQ1NSAgTG9naWMgUGx1cyBQbHVzIEluYwotMTQ1NiAgQWR2YW5jZWQgSGFyZHdhcmUgQXJjaGl0ZWN0dXJlcwotMTQ1NyAgTnVlcmEgQ29tbXVuaWNhdGlvbnMgSW5jCi0xNDU4ICBHaWdhLWJ5dGUgVGVjaG5vbG9neQotCTBjMTEgIEs4TlMgUHJvIE1haW5ib2FyZAotMTQ1OSAgRE9PSU4gRWxlY3Ryb25pY3MKLTE0NWEgIEVzY2FsYXRlIE5ldHdvcmtzIEluYwotMTQ1YiAgUFJBSU0gU1JMCi0xNDVjICBDcnlwdGVrCi0xNDVkICBHYWxsYW50IENvbXB1dGVyIEluYwotMTQ1ZSAgQWFzaGltYSBUZWNobm9sb2d5IEIuVi4KLTE0NWYgIEJhbGRvciBFbGVjdHJpYyBDb21wYW55Ci0JMDAwMSAgTmV4dE1vdmUgUENJCi0xNDYwICBEWU5BUkMgSU5DCi0xNDYxICBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYwotMTQ2MiAgTWljcm8tU3RhciBJbnRlcm5hdGlvbmFsIENvLiwgTHRkLgotIyBNU0kgQ0I1NEcgV2lyZWxlc3MgUEMgQ2FyZCB0aGF0IHNlZW1zIHRvIHVzZSB0aGUgQnJvYWRjb20gNDMwNiBDaGlwc2V0Ci0JNjgxOSAgQnJvYWRjb20gQ29ycG9yYXRpb24gQkNNNDMwNiA4MDIuMTFiL2cgV2lyZWxlc3MgTEFOIENvbnRyb2xsZXIgW01TSSBDQjU0R10KLQk2ODI1ICBQQ0kgQ2FyZCB3aXJlbGVzcyAxMWcgW1BDNTRHXQotCTg3MjUgIE5WSURJQSBOVjI1IFtHZUZvcmNlNCBUaSA0NjAwXSBWR0EgQWRhcHRlcgotIyBNU0kgRzRUaTQ4MDAsIDEyOE1CIEREUiBTRFJBTSwgVFYtT3V0LCBEVkktSQotCTkwMDAgIE5WSURJQSBOVjI4IFtHZUZvcmNlNCBUaSA0ODAwXSBWR0EgQWRhcHRlcgotCTkxMTAgIEdlRk9SQ0UgRlg1MjAwCi0JOTExOSAgTlZJRElBIE5WMzEgW0dlRm9yY2UgRlggNTYwMFhUXSBWR0EgQWRhcHRlcgotCTk1OTEgIG5WaWRpYSBDb3Jwb3JhdGlvbiBOVjM2IFtHZUZvcmNlIEZYIDU3MDBMRV0KLTE0NjMgIEZhc3QgQ29ycG9yYXRpb24KLTE0NjQgIEludGVyYWN0aXZlIENpcmN1aXRzICYgU3lzdGVtcyBMdGQKLTE0NjUgIEdOIE5FVFRFU1QgVGVsZWNvbSBESVYuCi0xNDY2ICBEZXNpZ25wcm8gSW5jLgotMTQ2NyAgRElHSUNPTSBTUEEKLTE0NjggIEFNQklUIE1pY3Jvc3lzdGVtIENvcnAuCi0xNDY5ICBDbGV2ZWxhbmQgTW90aW9uIENvbnRyb2xzCi0xNDZhICBJRlIKLTE0NmIgIFBhcmFzY2FuIFRlY2hub2xvZ2llcyBMdGQKLTE0NmMgIFJ1YnkgVGVjaCBDb3JwLgotCTE0MzAgIEZFLTE0MzBUWCBGYXN0IEV0aGVybmV0IFBDSSBBZGFwdGVyCi0xNDZkICBUYWNoeW9uLCBJTkMuCi0xNDZlICBXaWxsaWFtcyBFbGVjdHJvbmljcyBHYW1lcywgSW5jLgotMTQ2ZiAgTXVsdGkgRGltZW5zaW9uYWwgQ29uc3VsdGluZyBJbmMKLTE0NzAgIEJheSBOZXR3b3JrcwotMTQ3MSAgSW50ZWdyYXRlZCBUZWxlY29tIEV4cHJlc3MgSW5jCi0xNDcyICBEQUlLSU4gSW5kdXN0cmllcywgTHRkCi0xNDczICBaQVBFWCBUZWNobm9sb2dpZXMgSW5jCi0xNDc0ICBEb3VnIENhcnNvbiAmIEFzc29jaWF0ZXMKLTE0NzUgIFBJQ0FaTyBDb21tdW5pY2F0aW9ucwotMTQ3NiAgTU9SVEFSQSBJbnN0cnVtZW50IEluYwotMTQ3NyAgTmV0IEluc2lnaHQKLTE0NzggIERJQVRSRU5EIENvcnBvcmF0aW9uCi0xNDc5ICBUT1JBWSBJbmR1c3RyaWVzIEluYwotMTQ3YSAgRk9STU9TQSBJbmR1c3RyaWFsIENvbXB1dGluZwotMTQ3YiAgQUJJVCBDb21wdXRlciBDb3JwLgotMTQ3YyAgQVdBUkUsIEluYy4KLTE0N2QgIEludGVyd29ya3MgQ29tcHV0ZXIgUHJvZHVjdHMKLTE0N2UgIE1hdHN1c2hpdGEgR3JhcGhpYyBDb21tdW5pY2F0aW9uIFN5c3RlbXMsIEluYy4KLTE0N2YgIE5JSE9OIFVOSVNZUywgTHRkLgotMTQ4MCAgU0NJSSBUZWxlY29tCi0xNDgxICBCSU9QQUMgU3lzdGVtcyBJbmMKLTE0ODIgIElTWVRFQyAtIEludGVncmllcnRlIFN5c3RlbXRlY2huaWsgR21CSAotMTQ4MyAgTEFCV0FZIENvcnBvcmF0aW9uCi0xNDg0ICBMb2dpYyBDb3Jwb3JhdGlvbgotMTQ4NSAgRVJNQSAtIEVsZWN0cm9uaWMgR21CSAotMTQ4NiAgTDMgQ29tbXVuaWNhdGlvbnMgVGVsZW1ldHJ5ICYgSW5zdHJ1bWVudGF0aW9uCi0xNDg3ICBNQVJRVUVUVEUgTWVkaWNhbCBTeXN0ZW1zCi0xNDg4ICBLT05UUk9OIEVsZWN0cm9uaWsgR21CSAotMTQ4OSAgS1lFIFN5c3RlbXMgQ29ycG9yYXRpb24KLTE0OGEgIE9QVE8KLTE0OGIgIElOTk9NRURJQUxPR0lDIEluYy4KLTE0OGMgIEMuUC4gVGVjaG5vbG9neSBDby4gTHRkCi0xNDhkICBESUdJQ09NIFN5c3RlbXMsIEluYy4KLQkxMDAzICBIQ0YgNTZrIERhdGEvRmF4IE1vZGVtCi0xNDhlICBPU0kgUGx1cyBDb3Jwb3JhdGlvbgotMTQ4ZiAgUGxhbnQgRXF1aXBtZW50LCBJbmMuCi0xNDkwICBTdG9uZSBNaWNyb3N5c3RlbXMgUFRZIEx0ZC4KLTE0OTEgIFpFQUwgQ29ycG9yYXRpb24KLTE0OTIgIFRpbWUgTG9naWMgQ29ycG9yYXRpb24KLTE0OTMgIE1BS0VSIENvbW11bmljYXRpb25zCi0xNDk0ICBXSU5UT1AgVGVjaG5vbG9neSwgSW5jLgotMTQ5NSAgVE9LQUkgQ29tbXVuaWNhdGlvbnMgSW5kdXN0cnkgQ28uIEx0ZAotMTQ5NiAgSk9ZVEVDSCBDb21wdXRlciBDby4sIEx0ZC4KLTE0OTcgIFNNQSBSZWdlbHN5c3RlbWUgR21CSAotMTQ5OCAgVEVXUyBEYXRlbnRlY2huaWsgR21CSAotCTMwYzggIFRQQ0kyMDAKLTE0OTkgIEVNVEVDIENPLiwgTHRkCi0xNDlhICBBTkRPUiBUZWNobm9sb2d5IEx0ZAotMTQ5YiAgU0VJS08gSW5zdHJ1bWVudHMgSW5jCi0xNDljICBPVklTTElOSyBDb3JwLgotMTQ5ZCAgTkVXVEVLIEluYwotCTAwMDEgIFZpZGVvIFRvYXN0ZXIgZm9yIFBDCi0xNDllICBNYXBsZXRyZWUgTmV0d29ya3MgSW5jLgotMTQ5ZiAgTEVDVFJPTiBDbyBMdGQKLTE0YTAgIFNPRlRJTkcgR21CSAotMTRhMSAgU3lzdGVtYmFzZSBDbyBMdGQKLTE0YTIgIE1pbGxlbm5pdW0gRW5naW5lZXJpbmcgSW5jCi0xNGEzICBNYXZlcmljayBOZXR3b3JrcwotMTRhNCAgR1ZDL0JDTSBBZHZhbmNlZCBSZXNlYXJjaAotMTRhNSAgWElPTklDUyBEb2N1bWVudCBUZWNobm9sb2dpZXMgSW5jCi0xNGE2ICBJTk9WQSBDb21wdXRlcnMgR21CSCAmIENvIEtHCi0xNGE3ICBNWVRIT1MgU3lzdGVtcyBJbmMKLTE0YTggIEZFQVRST04gVGVjaG5vbG9naWVzIENvcnBvcmF0aW9uCi0xNGE5ICBISVZFUlRFQyBJbmMKLTE0YWEgIEFkdmFuY2VkIE1PUyBUZWNobm9sb2d5IEluYwotMTRhYiAgTWVudG9yIEdyYXBoaWNzIENvcnAuCi0xNGFjICBOb3Zhd2ViIFRlY2hub2xvZ2llcyBJbmMKLTE0YWQgIFRpbWUgU3BhY2UgUmFkaW8gQUIKLTE0YWUgIENUSSwgSW5jCi0xNGFmICBHdWlsbGVtb3QgQ29ycG9yYXRpb24KLQk3MTAyICAzRCBQcm9waGV0IElJIE1YCi0xNGIwICBCU1QgQ29tbXVuaWNhdGlvbiBUZWNobm9sb2d5IEx0ZAotMTRiMSAgTmV4dGNvbSBLLksuCi0xNGIyICBFTk5PVkFURSBOZXR3b3JrcyBJbmMKLTE0YjMgIFhQRUVEIEluYwotCTAwMDAgIERTTCBOSUMKLTE0YjQgIFBISUxJUFMgQnVzaW5lc3MgRWxlY3Ryb25pY3MgQi5WLgotMTRiNSAgQ3JlYW13YXJlIEdtQkgKLQkwMjAwICBTY29wZQotCTAzMDAgIFB1bHNhcgotCTA0MDAgIFB1bHNhclNSQgotCTA2MDAgIFB1bHNhcjIKLQkwODAwICBEU1AtQm9hcmQKLQkwOTAwICBEU1AtQm9hcmQKLQkwYTAwICBEU1AtQm9hcmQKLQkwYjAwICBEU1AtQm9hcmQKLTE0YjYgIFF1YW50dW0gRGF0YSBDb3JwLgotMTRiNyAgUFJPWElNIEluYwotCTAwMDEgIFN5bXBob255IDQxMTAKLTE0YjggIFRlY2hzb2Z0IFRlY2hub2xvZ3kgQ28gTHRkCi0xNGI5ICBBSVJPTkVUIFdpcmVsZXNzIENvbW11bmljYXRpb25zCi0JMDAwMSAgUEM0ODAwCi0JMDM0MCAgUEM0ODAwCi0JMDM1MCAgUEM0ODAwCi0JNDUwMCAgUEM0NTAwCi0JNDgwMCAgQ2lzY28gQWlyb25ldCAzNDAgODAyLjExYiBXaXJlbGVzcyBMQU4gQWRhcHRlci9BaXJvbmV0IFBDNDgwMAotCWE1MDQgIENpc2NvIEFpcm9uZXQgV2lyZWxlc3MgODAyLjExYgotCWE1MDUgIENpc2NvIEFpcm9uZXQgQ0IyMGEgODAyLjExYSBXaXJlbGVzcyBMQU4gQWRhcHRlcgotCWE1MDYgIENpc2NvIEFpcm9uZXQgTWluaSBQQ0kgYi9nCi0xNGJhICBJTlRFUk5JWCBJbmMuCi0xNGJiICBTRU1URUNIIENvcnBvcmF0aW9uCi0xNGJjICBHbG9iZXNwYW4gU2VtaWNvbmR1Y3RvciBJbmMuCi0xNGJkICBDQVJESU8gQ29udHJvbCBOLlYuCi0xNGJlICBMMyBDb21tdW5pY2F0aW9ucwotMTRiZiAgU1BJREVSIENvbW11bmljYXRpb25zIEluYy4KLTE0YzAgIENPTVBBTCBFbGVjdHJvbmljcyBJbmMKLTE0YzEgIE1ZUklDT00gSW5jLgotCTgwNDMgIE15cmluZXQgMjAwMCBTY2FsYWJsZSBDbHVzdGVyIEludGVyY29ubmVjdAotMTRjMiAgRFRLIENvbXB1dGVyCi0xNGMzICBNRURJQVRFSyBDb3JwLgotMTRjNCAgSVdBU0FLSSBJbmZvcm1hdGlvbiBTeXN0ZW1zIENvIEx0ZAotMTRjNSAgQXV0b21hdGlvbiBQcm9kdWN0cyBBQgotMTRjNiAgRGF0YSBSYWNlIEluYwotMTRjNyAgTW9kdWxhciBUZWNobm9sb2d5IEhvbGRpbmdzIEx0ZAotMTRjOCAgVHVyYm9jb21tIFRlY2guIEluYy4KLTE0YzkgIE9ESU4gVGVsZXN5c3RlbXMgSW5jCi0xNGNhICBQRSBMb2dpYyBDb3JwLgotMTRjYiAgQmlsbGlvbnRvbiBTeXN0ZW1zIEluYwotMTRjYyAgTkFLQVlPIFRlbGVjb21tdW5pY2F0aW9ucyBJbmMKLTE0Y2QgIFVuaXZlcnNhbCBTY2llbnRpZmljIEluZC4KLTE0Y2UgIFdoaXN0bGUgQ29tbXVuaWNhdGlvbnMKLTE0Y2YgIFRFSyBNaWNyb3N5c3RlbXMgSW5jLgotMTRkMCAgRXJpY3Nzb24gQXhlIFIgJiBECi0xNGQxICBDb21wdXRlciBIaS1UZWNoIENvIEx0ZAotMTRkMiAgVGl0YW4gRWxlY3Ryb25pY3MgSW5jCi0JODAwMSAgVlNjb20gMDEwTCAxIHBvcnQgcGFyYWxsZWwgYWRhcHRvcgotCTgwMDIgIFZTY29tIDAyMEwgMiBwb3J0IHBhcmFsbGVsIGFkYXB0b3IKLQk4MDEwICBWU2NvbSAxMDBMIDEgcG9ydCBzZXJpYWwgYWRhcHRvcgotCTgwMTEgIFZTY29tIDExMEwgMSBwb3J0IHNlcmlhbCBhbmQgMSBwb3J0IHBhcmFsbGVsIGFkYXB0b3IKLQk4MDIwICBWU2NvbSAyMDBMIDEgcG9ydCBzZXJpYWwgYWRhcHRvcgotCTgwMjEgIFZTY29tIDIxMEwgMiBwb3J0IHNlcmlhbCBhbmQgMSBwb3J0IHBhcmFsbGVsIGFkYXB0b3IKLQk4MDQwICBWU2NvbSA0MDBMIDQgcG9ydCBzZXJpYWwgYWRhcHRvcgotCTgwODAgIFZTY29tIDgwMEwgOCBwb3J0IHNlcmlhbCBhZGFwdG9yCi0JYTAwMCAgVlNjb20gMDEwSCAxIHBvcnQgcGFyYWxsZWwgYWRhcHRvcgotCWEwMDEgIFZTY29tIDEwMEggMSBwb3J0IHNlcmlhbCBhZGFwdG9yCi0JYTAwMyAgVlNjb20gNDAwSCA0IHBvcnQgc2VyaWFsIGFkYXB0b3IKLQlhMDA0ICBWU2NvbSA0MDBIRjEgNCBwb3J0IHNlcmlhbCBhZGFwdG9yCi0JYTAwNSAgVlNjb20gMjAwSCAyIHBvcnQgc2VyaWFsIGFkYXB0b3IKLQllMDAxICBWU2NvbSAwMTBIVjIgMSBwb3J0IHBhcmFsbGVsIGFkYXB0b3IKLQllMDEwICBWU2NvbSAxMDBIVjIgMSBwb3J0IHNlcmlhbCBhZGFwdG9yCi0JZTAyMCAgVlNjb20gMjAwSFYyIDIgcG9ydCBzZXJpYWwgYWRhcHRvcgotMTRkMyAgQ0lSVEVDSCAoVUspIEx0ZAotMTRkNCAgUGFuYWNvbSBUZWNobm9sb2d5IENvcnAKLTE0ZDUgIE5pdHN1a28gQ29ycG9yYXRpb24KLTE0ZDYgIEFjY3VzeXMgSW5jCi0xNGQ3ICBIaXJha2F3YSBIZXd0ZWNoIENvcnAKLTE0ZDggIEhPUEYgRWxla3Ryb25payBHbUJICi0jIEZvcm1lcmx5IFNpUGFja2V0cywgSW5jLiwgZm9ybWVybHkgQVBJIE5ldFdvcmtzLCBJbmMuLCBmb3JtZXJseSBBbHBoYSBQcm9jZXNzb3IsIEluYy4KLTE0ZDkgIEFsbGlhbmNlIFNlbWljb25kdWN0b3IgQ29ycG9yYXRpb24KLQkwMDEwICBBUDEwMTEvU1AxMDExIEh5cGVyVHJhbnNwb3J0LVBDSSBCcmlkZ2UgW1N0dXJnZW9uXQotCTkwMDAgIEFTOTBMMTAyMDQvMTAyMDggSHlwZXJUcmFuc3BvcnQgdG8gUENJLVggQnJpZGdlCi0xNGRhICBOYXRpb25hbCBBZXJvc3BhY2UgTGFib3JhdG9yaWVzCi0xNGRiICBBRkFWTEFCIFRlY2hub2xvZ3kgSW5jCi0JMjEyMCAgVEs5OTAyCi0xNGRjICBBbXBsaWNvbiBMaXZlbGluZSBMdGQKLQkwMDAwICBQQ0kyMzAKLQkwMDAxICBQQ0kyNDIKLQkwMDAyICBQQ0kyNDQKLQkwMDAzICBQQ0kyNDcKLQkwMDA0ICBQQ0kyNDgKLQkwMDA1ICBQQ0kyNDkKLQkwMDA2ICBQQ0kyNjAKLQkwMDA3ICBQQ0kyMjQKLQkwMDA4ICBQQ0kyMzQKLQkwMDA5ICBQQ0kyMzYKLQkwMDBhICBQQ0kyNzIKLQkwMDBiICBQQ0kyMTUKLTE0ZGQgIEJvdWxkZXIgRGVzaWduIExhYnMgSW5jCi0xNGRlICBBcHBsaWVkIEludGVncmF0aW9uIENvcnBvcmF0aW9uCi0xNGRmICBBU0lDIENvbW11bmljYXRpb25zIENvcnAKLTE0ZTEgIElOVkVSVEVYCi0xNGUyICBJTkZPTElCUklBCi0xNGUzICBBTVRFTENPCi0xNGU0ICBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotCTA4MDAgIFNlbnRyeTUgQ2hpcGNvbW1vbiBJL08gQ29udHJvbGxlcgotCTA4MDQgIFNlbnRyeTUgUENJIEJyaWRnZQotCTA4MDUgIFNlbnRyeTUgTUlQUzMyIENQVQotCTA4MDYgIFNlbnRyeTUgRXRoZXJuZXQgQ29udHJvbGxlcgotCTA4MGIgIFNlbnRyeTUgQ3J5cHRvIEFjY2VsZXJhdG9yCi0JMDgwZiAgU2VudHJ5NSBERFIvU0RSIFJBTSBDb250cm9sbGVyCi0JMDgxMSAgU2VudHJ5NSBFeHRlcm5hbCBJbnRlcmZhY2UgQ29yZQotCTA4MTYgIEJDTTMzMDIgU2VudHJ5NSBNSVBTMzIgQ1BVCi0JMTYwMCAgTmV0WHRyZW1lIEJDTTU3NTIgR2lnYWJpdCBFdGhlcm5ldCBQQ0kgRXhwcmVzcwotCTE2NDQgIE5ldFh0cmVtZSBCQ001NzAwIEdpZ2FiaXQgRXRoZXJuZXQKLQkJMTAxNCAwMjc3ICBCcm9hZGNvbSBWaWdpbCBCNTcwMCAxMDAwQmFzZS1UCi0JCTEwMjggMDBkMSAgQnJvYWRjb20gQkNNNTcwMAotCQkxMDI4IDAxMDYgIEJyb2FkY29tIEJDTTU3MDAKLQkJMTAyOCAwMTA5ICBCcm9hZGNvbSBCQ001NzAwIDEwMDBCYXNlLVQKLQkJMTAyOCAwMTBhICBCcm9hZGNvbSBCQ001NzAwIDEwMDBCYXNlVFgKLQkJMTBiNyAxMDAwICAzQzk5Ni1UIDEwMDBCYXNlLVQKLQkJMTBiNyAxMDAxICAzQzk5NkItVCAxMDAwQmFzZS1UCi0JCTEwYjcgMTAwMiAgM0M5OTZDLVQgMTAwMEJhc2UtVAotCQkxMGI3IDEwMDMgIDNDOTk3LVQgMTAwMEJhc2UtVCBEdWFsIFBvcnQKLQkJMTBiNyAxMDA0ICAzQzk5Ni1TWCAxMDAwQmFzZS1TWAotCQkxMGI3IDEwMDUgIDNDOTk3LVNYIDEwMDBCYXNlLVNYIER1YWwgUG9ydAotCQkxMGI3IDEwMDggIDNDOTQyIEdpZ2FiaXQgTE9NICgzMVgzMSkKLQkJMTRlNCAwMDAyICBOZXRYdHJlbWUgMTAwMEJhc2UtU1gKLQkJMTRlNCAwMDAzICBOZXRYdHJlbWUgMTAwMEJhc2UtU1gKLQkJMTRlNCAwMDA0ICBOZXRYdHJlbWUgMTAwMEJhc2UtVAotCQkxNGU0IDEwMjggIE5ldFh0cmVtZSAxMDAwQmFzZVRYCi0JCTE0ZTQgMTY0NCAgQkNNNTcwMCAxMDAwQmFzZS1UCi0JMTY0NSAgTmV0WHRyZW1lIEJDTTU3MDEgR2lnYWJpdCBFdGhlcm5ldAotCQkwZTExIDAwN2MgIE5DNzc3MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIChQQ0ktWCwgMTAvMTAwLzEwMDAtVCkKLQkJMGUxMSAwMDdkICBOQzY3NzAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciAoUENJLVgsIDEwMDAtU1gpCi0JCTBlMTEgMDA4NSAgTkM3NzgwIEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIgKGVtYmVkZGVkLCBXT0wpCi0JCTBlMTEgMDA5OSAgTkM3NzgwIEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIgKGVtYmVkZGVkLCBXT0wpCi0JCTBlMTEgMDA5YSAgTkM3NzcwIEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIgKFBDSS1YLCAxMC8xMDAvMTAwMC1UKQotCQkwZTExIDAwYzEgIE5DNjc3MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIChQQ0ktWCwgMTAwMC1TWCkKLQkJMTAyOCAwMTIxICBCcm9hZGNvbSBCQ001NzAxIDEwMDBCYXNlLVQKLQkJMTAzYyAxMjhhICBIUCAxMDAwQmFzZS1UIChQQ0kpIFtBNzA2MUFdCi0JCTEwM2MgMTI4YiAgSFAgMTAwMEJhc2UtU1ggKFBDSSkgW0E3MDczQV0KLQkJMTAzYyAxMmE0ICBIUCBDb3JlIExhbiAxMDAwQmFzZS1UCi0JCTEwM2MgMTJjMSAgSFAgSU9YIENvcmUgTGFuIDEwMDBCYXNlLVQgW0E3MTA5QVhdCi0JCTEwYTkgODAxMCAgU0dJIElPOSBHaWdhYml0IEV0aGVybmV0IChDb3BwZXIpCi0JCTEwYTkgODAxMSAgU0dJIEdpZ2FiaXQgRXRoZXJuZXQgKENvcHBlcikKLQkJMTBhOSA4MDEyICBTR0kgR2lnYWJpdCBFdGhlcm5ldCAoRmliZXIpCi0JCTEwYjcgMTAwNCAgM0M5OTYtU1ggMTAwMEJhc2UtU1gKLQkJMTBiNyAxMDA2ICAzQzk5NkItVCAxMDAwQmFzZS1UCi0JCTEwYjcgMTAwNyAgM0MxMDAwLVQgMTAwMEJhc2UtVAotCQkxMGI3IDEwMDggIDNDOTQwLUJSMDEgMTAwMEJhc2UtVAotCQkxNGU0IDAwMDEgIEJDTTU3MDEgMTAwMEJhc2UtVAotCQkxNGU0IDAwMDUgIEJDTTU3MDEgMTAwMEJhc2UtVAotCQkxNGU0IDAwMDYgIEJDTTU3MDEgMTAwMEJhc2UtVAotCQkxNGU0IDAwMDcgIEJDTTU3MDEgMTAwMEJhc2UtU1gKLQkJMTRlNCAwMDA4ICBCQ001NzAxIDEwMDBCYXNlLVQKLQkJMTRlNCA4MDA4ICBCQ001NzAxIDEwMDBCYXNlLVQKLQkxNjQ2ICBOZXRYdHJlbWUgQkNNNTcwMiBHaWdhYml0IEV0aGVybmV0Ci0JCTBlMTEgMDBiYiAgTkM3NzYwIDEwMDBCYXNlVFgKLQkJMTAyOCAwMTI2ICBCcm9hZGNvbSBCQ001NzAyIDEwMDBCYXNlVFgKLQkJMTRlNCA4MDA5ICBCQ001NzAyIDEwMDBCYXNlVFgKLQkxNjQ3ICBOZXRYdHJlbWUgQkNNNTcwMyBHaWdhYml0IEV0aGVybmV0Ci0JCTBlMTEgMDA5OSAgTkM3NzgwIDEwMDBCYXNlVFgKLQkJMGUxMSAwMDlhICBOQzc3NzAgMTAwMEJhc2VUWAotCQkxMGE5IDgwMTAgIFNHSSBJTzkgR2lnYWJpdCBFdGhlcm5ldCAoQ29wcGVyKQotCQkxNGU0IDAwMDkgIEJDTTU3MDMgMTAwMEJhc2VUWAotCQkxNGU0IDAwMGEgIEJDTTU3MDMgMTAwMEJhc2VTWAotCQkxNGU0IDAwMGIgIEJDTTU3MDMgMTAwMEJhc2VUWAotCQkxNGU0IDgwMDkgIEJDTTU3MDMgMTAwMEJhc2VUWAotCQkxNGU0IDgwMGEgIEJDTTU3MDMgMTAwMEJhc2VUWAotCTE2NDggIE5ldFh0cmVtZSBCQ001NzA0IEdpZ2FiaXQgRXRoZXJuZXQKLQkJMGUxMSAwMGNmICBOQzc3NzIgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciAoUENJLVgsIDEwLDEwMCwxMDAwLVQpCi0JCTBlMTEgMDBkMCAgTkM3NzgyIEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIgKFBDSS1YLCAxMCwxMDAsMTAwMC1UKQotCQkwZTExIDAwZDEgIE5DNzc4MyBHaWdhYml0IFNlcnZlciBBZGFwdGVyIChQQ0ktWCwgMTAsMTAwLDEwMDAtVCkKLQkJMTBiNyAyMDAwICAzQzk5OC1UIER1YWwgUG9ydCAxMC8xMDAvMTAwMCBQQ0ktWAotCQkxMGI3IDMwMDAgIDNDOTk5LVQgUXVhZCBQb3J0IDEwLzEwMC8xMDAwIFBDSS1YCi0JCTExNjYgMTY0OCAgTmV0WHRyZW1lIENJT0ItRSAxMDAwQmFzZS1UCi0JMTY0YSAgTmV0WHRyZW1lIElJIEJDTTU3MDYgR2lnYWJpdCBFdGhlcm5ldAotCTE2NGQgIE5ldFh0cmVtZSBCQ001NzAyRkUgR2lnYWJpdCBFdGhlcm5ldAotCTE2NTMgIE5ldFh0cmVtZSBCQ001NzA1IEdpZ2FiaXQgRXRoZXJuZXQKLQkJMGUxMSAwMGUzICBOQzc3NjEgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlcgotCTE2NTQgIE5ldFh0cmVtZSBCQ001NzA1XzIgR2lnYWJpdCBFdGhlcm5ldAotCQkwZTExIDAwZTMgIE5DNzc2MSBHaWdhYml0IFNlcnZlciBBZGFwdGVyCi0JCTEwM2MgMzEwMCAgTkMxMDIwIEhQIFByb0xpYW50IEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIgMzIgUENJCi0JMTY1OSAgTmV0WHRyZW1lIEJDTTU3MjEgR2lnYWJpdCBFdGhlcm5ldCBQQ0kgRXhwcmVzcwotCTE2NWQgIE5ldFh0cmVtZSBCQ001NzA1TSBHaWdhYml0IEV0aGVybmV0Ci0JMTY1ZSAgTmV0WHRyZW1lIEJDTTU3MDVNXzIgR2lnYWJpdCBFdGhlcm5ldAotCQkxMDNjIDA4OGMgIG5jODAwMCBsYXB0b3AKLQkJMTAzYyAwODkwICBuYzYwMDAgbGFwdG9wCi0JMTY2ZSAgNTcweCAxMC8xMDAgSW50ZWdyYXRlZCBDb250cm9sbGVyCi0JMTY3NyAgTmV0WHRyZW1lIEJDTTU3NTEgR2lnYWJpdCBFdGhlcm5ldCBQQ0kgRXhwcmVzcwotCQkxMDI4IDAxNzkgIE9wdGlwbGV4IEdYMjgwCi0JMTY3ZCAgTmV0WHRyZW1lIEJDTTU3NTFNIEdpZ2FiaXQgRXRoZXJuZXQgUENJIEV4cHJlc3MKLQkxNjdlICBOZXRYdHJlbWUgQkNNNTc1MUYgRmFzdCBFdGhlcm5ldCBQQ0kgRXhwcmVzcwotCTE2OTYgIE5ldFh0cmVtZSBCQ001NzgyIEdpZ2FiaXQgRXRoZXJuZXQKLQkJMTAzYyAxMmJjICBIUCBkNTMwIENNVCAoREc3NDZBKQotCQkxNGU0IDAwMGQgIE5ldFh0cmVtZSBCQ001NzgyIDEwMDBCYXNlLVQKLQkxNjljICBOZXRYdHJlbWUgQkNNNTc4OCBHaWdhYml0IEV0aGVybmV0Ci0JMTY5ZCAgTmV0TGluayBCQ001Nzg5IEdpZ2FiaXQgRXRoZXJuZXQgUENJIEV4cHJlc3MKLQkxNmE2ICBOZXRYdHJlbWUgQkNNNTcwMlggR2lnYWJpdCBFdGhlcm5ldAotCQkwZTExIDAwYmIgIE5DNzc2MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIChQQ0ktWCwgMTAvMTAwLzEwMDAtVCkKLQkJMTAyOCAwMTI2ICBCQ001NzAyIDEwMDBCYXNlLVQKLQkJMTRlNCAwMDBjICBCQ001NzAyIDEwMDBCYXNlLVQKLQkJMTRlNCA4MDA5ICBCQ001NzAyIDEwMDBCYXNlLVQKLQkxNmE3ICBOZXRYdHJlbWUgQkNNNTcwM1ggR2lnYWJpdCBFdGhlcm5ldAotCQkwZTExIDAwY2EgIE5DNzc3MSBHaWdhYml0IFNlcnZlciBBZGFwdGVyIChQQ0ktWCwgMTAsMTAwLDEwMDAtVCkKLQkJMGUxMSAwMGNiICBOQzc3ODEgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciAoUENJLVgsIDEwLDEwMCwxMDAwLVQpCi0JCTE0ZTQgMDAwOSAgTmV0WHRyZW1lIEJDTTU3MDMgMTAwMEJhc2UtVAotCQkxNGU0IDAwMGEgIE5ldFh0cmVtZSBCQ001NzAzIDEwMDBCYXNlLVNYCi0JCTE0ZTQgMDAwYiAgTmV0WHRyZW1lIEJDTTU3MDMgMTAwMEJhc2UtVAotCQkxNGU0IDgwMGEgIE5ldFh0cmVtZSBCQ001NzAzIDEwMDBCYXNlLVQKLQkxNmE4ICBOZXRYdHJlbWUgQkNNNTcwNFMgR2lnYWJpdCBFdGhlcm5ldAotCQkxMGI3IDIwMDEgIDNDOTk4LVNYIER1YWwgUG9ydCAxMDAwLVNYIFBDSS1YCi0JMTZhYSAgTmV0WHRyZW1lIElJIEJDTTU3MDZTIEdpZ2FiaXQgRXRoZXJuZXQKLQkxNmM2ICBOZXRYdHJlbWUgQkNNNTcwMkEzIEdpZ2FiaXQgRXRoZXJuZXQKLQkJMTBiNyAxMTAwICAzQzEwMDBCLVQgMTAvMTAwLzEwMDAgUENJCi0JCTE0ZTQgMDAwYyAgQkNNNTcwMiAxMDAwQmFzZS1UCi0JCTE0ZTQgODAwOSAgQkNNNTcwMiAxMDAwQmFzZS1UCi0JMTZjNyAgTmV0WHRyZW1lIEJDTTU3MDMgR2lnYWJpdCBFdGhlcm5ldAotCQkwZTExIDAwY2EgIE5DNzc3MSBHaWdhYml0IFNlcnZlciBBZGFwdGVyIChQQ0ktWCwgMTAsMTAwLDEwMDAtVCkKLQkJMGUxMSAwMGNiICBOQzc3ODEgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciAoUENJLVgsIDEwLDEwMCwxMDAwLVQpCi0JCTEwM2MgMTJjMyAgSFAgQ29tYm8gRkMvR2lnRS1TWCBbQTk3ODJBXQotCQkxMDNjIDEyY2EgIEhQIENvbWJvIEZDL0dpZ0UtVCBbQTk3ODRBXQotCQkxNGU0IDAwMDkgIE5ldFh0cmVtZSBCQ001NzAzIDEwMDBCYXNlLVQKLQkJMTRlNCAwMDBhICBOZXRYdHJlbWUgQkNNNTcwMyAxMDAwQmFzZS1TWAotCTE2ZGQgIE5ldExpbmsgQkNNNTc4MSBHaWdhYml0IEV0aGVybmV0IFBDSSBFeHByZXNzCi0JMTZmNyAgTmV0WHRyZW1lIEJDTTU3NTMgR2lnYWJpdCBFdGhlcm5ldCBQQ0kgRXhwcmVzcwotCTE2ZmQgIE5ldFh0cmVtZSBCQ001NzUzTSBHaWdhYml0IEV0aGVybmV0IFBDSSBFeHByZXNzCi0JMTZmZSAgTmV0WHRyZW1lIEJDTTU3NTNGIEZhc3QgRXRoZXJuZXQgUENJIEV4cHJlc3MKLQkxNzBjICBCQ000NDAxLUIwIDEwMEJhc2UtVFgKLQkxNzBkICBOZXRYdHJlbWUgQkNNNTkwMSAxMDBCYXNlLVRYCi0JCTEwMTQgMDU0NSAgVGhpbmtQYWQgUjQwZSAoMjY4NC1IVkcpIGJ1aWx0aW4gZXRoZXJuZXQgY29udHJvbGxlcgotCTE3MGUgIE5ldFh0cmVtZSBCQ001OTAxIDEwMEJhc2UtVFgKLQkzMzUyICBCQ00zMzUyCi0JMzM2MCAgQkNNMzM2MAotCTQyMTAgIEJDTTQyMTAgaUxpbmUxMCBIb21lUE5BIDIuMAotCTQyMTEgIEJDTTQyMTEgaUxpbmUxMCBIb21lUE5BIDIuMCArIFYuOTAgNTZrIG1vZGVtCi0JNDIxMiAgQkNNNDIxMiB2LjkwIDU2ayBtb2RlbQotCTQzMDEgIEJDTTQzMDMgODAyLjExYiBXaXJlbGVzcyBMQU4gQ29udHJvbGxlcgotCQkxMDI4IDA0MDcgIFRydWVNb2JpbGUgMTE4MCBPbmJvYXJkIFdMQU4KLQkJMTA0MyAwMTIwICBXTC0xMDNiIFdpcmVsZXNzIExBTiBQQyBDYXJkCi0JNDMwNSAgQkNNNDMwNyBWLjkwIDU2ayBNb2RlbQotCTQzMDYgIEJDTTQzMDcgRXRoZXJuZXQgQ29udHJvbGxlcgotCTQzMDcgIEJDTTQzMDcgODAyLjExYiBXaXJlbGVzcyBMQU4gQ29udHJvbGxlcgotCTQzMTAgIEJDTTQzMTAgQ2hpcGNvbW1vbiBJL09Db250cm9sbGVyCi0JNDMxMiAgQkNNNDMxMCBVQVJUCi0JNDMxMyAgQkNNNDMxMCBFdGhlcm5ldCBDb250cm9sbGVyCi0JNDMxNSAgQkNNNDMxMCBVU0IgQ29udHJvbGxlcgotCTQzMjAgIEJDTTQzMDYgODAyLjExYi9nIFdpcmVsZXNzIExBTiBDb250cm9sbGVyCi0JCTEwMjggMDAwMSAgVHJ1ZU1vYmlsZSAxMzAwIFdMQU4gTWluaS1QQ0kgQ2FyZAotCQkxMDI4IDAwMDMgIFdpcmVsZXNzIDEzNTAgV0xBTiBNaW5pLVBDSSBDYXJkCi0JCTEwNDMgMTAwZiAgV0wtMTAwRwotCQkxNGU0IDQzMjAgIExpbmtzeXMgV01QNTRHIFBDSQotCQkxNzM3IDQzMjAgIFdQQzU0RwotCQkxNzk5IDcwMTAgIEJlbGtpbiBGNUQ3MDEwIDU0ZyBXaXJlbGVzcyBOZXR3b3JrIGNhcmQKLQk0MzIxICBCQ000MzA2IDgwMi4xMWEgV2lyZWxlc3MgTEFOIENvbnRyb2xsZXIKLQk0MzIyICBCQ000MzA2IFVBUlQKLQk0MzI0ICBCQ000MzA5IDgwMi4xMWEvYi9nCi0JCTEwMjggMDAwMSAgVHJ1ZW1vYmlsZSAxNDAwCi0JCTEwMjggMDAwMyAgVHJ1ZW1vYmlsZSAxNDUwIE1pbmlQQ0kKLQk0MzI1ICBCQ000M3hHIDgwMi4xMWIvZwotCQkxNDE0IDAwMDMgIFdpcmVsZXNzIE5vdGVib29rIEFkYXB0ZXIgTU4tNzIwCi0JCTE0MTQgMDAwNCAgV2lyZWxlc3MgUENJIEFkYXB0ZXIgTU4tNzMwCi0jIHByb2JhYmx5IHRoaXMgaXMgYSBjb3JyZWN0IElELi4uCi0JNDMyNiAgQkNNNDMwNyBDaGlwY29tbW9uIEkvTyBDb250cm9sbGVyPwotCTQ0MDEgIEJDTTQ0MDEgMTAwQmFzZS1UCi0JCTEwNDMgODBhOCAgQTdWOFggbW90aGVyYm9hcmQKLQk0NDAyICBCQ000NDAyIEludGVncmF0ZWQgMTAvMTAwQmFzZVQKLQk0NDAzICBCQ000NDAyIFYuOTAgNTZrIE1vZGVtCi0JNDQxMCAgQkNNNDQxMyBpTGluZTMyIEhvbWVQTkEgMi4wCi0JNDQxMSAgQkNNNDQxMyBWLjkwIDU2ayBtb2RlbQotCTQ0MTIgIEJDTTQ0MTIgMTAvMTAwQmFzZVQKLQk0NDMwICBCQ000NHh4IENhcmRCdXMgaUxpbmUzMiBIb21lUE5BIDIuMAotCTQ0MzIgIEJDTTQ0MzIgQ2FyZEJ1cyAxMC8xMDBCYXNlVAotCTQ2MTAgIEJDTTQ2MTAgU2VudHJ5NSBQQ0kgdG8gU0IgQnJpZGdlCi0JNDYxMSAgQkNNNDYxMCBTZW50cnk1IGlMaW5lMzIgSG9tZVBOQSAxLjAKLQk0NjEyICBCQ000NjEwIFNlbnRyeTUgVi45MCA1NmsgTW9kZW0KLQk0NjEzICBCQ000NjEwIFNlbnRyeTUgRXRoZXJuZXQgQ29udHJvbGxlcgotCTQ2MTQgIEJDTTQ2MTAgU2VudHJ5NSBFeHRlcm5hbCBJbnRlcmZhY2UKLQk0NjE1ICBCQ000NjEwIFNlbnRyeTUgVVNCIENvbnRyb2xsZXIKLQk0NzA0ICBCQ000NzA0IFBDSSB0byBTQiBCcmlkZ2UKLQk0NzA1ICBCQ000NzA0IFNlbnRyeTUgODAyLjExYiBXaXJlbGVzcyBMQU4gQ29udHJvbGxlcgotCTQ3MDYgIEJDTTQ3MDQgU2VudHJ5NSBFdGhlcm5ldCBDb250cm9sbGVyCi0JNDcwNyAgQkNNNDcwNCBTZW50cnk1IFVTQiBDb250cm9sbGVyCi0JNDcwOCAgQkNNNDcwNCBDcnlwdG8gQWNjZWxlcmF0b3IKLQk0NzEwICBCQ000NzEwIFNlbnRyeTUgUENJIHRvIFNCIEJyaWRnZQotCTQ3MTEgIEJDTTQ3eHggU2VudHJ5NSBpTGluZTMyIEhvbWVQTkEgMi4wCi0JNDcxMiAgQkNNNDd4eCBWLjkyIDU2ayBtb2RlbQotCTQ3MTMgIFNlbnRyeTUgRXRoZXJuZXQgQ29udHJvbGxlcgotCTQ3MTQgIEJDTTQ3eHggU2VudHJ5NSBFeHRlcm5hbCBJbnRlcmZhY2UKLQk0NzE1ICBTZW50cnk1IFVTQiBDb250cm9sbGVyCi0JNDcxNiAgQkNNNDd4eCBTZW50cnk1IFVTQiBIb3N0IENvbnRyb2xsZXIKLQk0NzE3ICBCQ000N3h4IFNlbnRyeTUgVVNCIERldmljZSBDb250cm9sbGVyCi0JNDcxOCAgU2VudHJ5NSBDcnlwdG8gQWNjZWxlcmF0b3IKLQk0NzIwICBCQ000NzEyIE1JUFMgQ1BVCi0JNTM2NSAgQkNNNTM2NVAgU2VudHJ5NSBIb3N0IEJyaWRnZQotCTU2MDAgIEJDTTU2MDAgU3RyYXRhU3dpdGNoIDI0KzIgRXRoZXJuZXQgU3dpdGNoIENvbnRyb2xsZXIKLQk1NjA1ICBCQ001NjA1IFN0cmF0YVN3aXRjaCAyNCsyIEV0aGVybmV0IFN3aXRjaCBDb250cm9sbGVyCi0JNTYxNSAgQkNNNTYxNSBTdHJhdGFTd2l0Y2ggMjQrMiBFdGhlcm5ldCBTd2l0Y2ggQ29udHJvbGxlcgotCTU2MjUgIEJDTTU2MjUgU3RyYXRhU3dpdGNoIDI0KzIgRXRoZXJuZXQgU3dpdGNoIENvbnRyb2xsZXIKLQk1NjQ1ICBCQ001NjQ1IFN0cmF0YVN3aXRjaCAyNCsyIEV0aGVybmV0IFN3aXRjaCBDb250cm9sbGVyCi0JNTY3MCAgQkNNNTY3MCA4LVBvcnQgMTBHRSBFdGhlcm5ldCBTd2l0Y2ggRmFicmljCi0JNTY4MCAgQkNNNTY4MCBHLVN3aXRjaCA4IFBvcnQgR2lnYWJpdCBFdGhlcm5ldCBTd2l0Y2ggQ29udHJvbGxlcgotCTU2OTAgIEJDTTU2OTAgMTItcG9ydCBNdWx0aS1MYXllciBHaWdhYml0IEV0aGVybmV0IFN3aXRjaAotCTU2OTEgIEJDTTU2OTEgR0UvMTBHRSA4KzIgR2lnYWJpdCBFdGhlcm5ldCBTd2l0Y2ggQ29udHJvbGxlcgotCTU4MjAgIEJDTTU4MjAgQ3J5cHRvIEFjY2VsZXJhdG9yCi0JNTgyMSAgQkNNNTgyMSBDcnlwdG8gQWNjZWxlcmF0b3IKLQk1ODIyICBCQ001ODIyIENyeXB0byBBY2NlbGVyYXRvcgotCTU4MjMgIEJDTTU4MjMgQ3J5cHRvIEFjY2VsZXJhdG9yCi0JNTgyNCAgQkNNNTgyNCBDcnlwdG8gQWNjZWxlcmF0b3IKLQk1ODQwICBCQ001ODQwIENyeXB0byBBY2NlbGVyYXRvcgotCTU4NDEgIEJDTTU4NDEgQ3J5cHRvIEFjY2VsZXJhdG9yCi0JNTg1MCAgQkNNNTg1MCBDcnlwdG8gQWNjZWxlcmF0b3IKLTE0ZTUgIFBpeGVsZnVzaW9uIEx0ZAotMTRlNiAgU0hJTklORyBUZWNobm9sb2d5IEluYwotMTRlNyAgM0NYCi0xNGU4ICBSQVlDRVIgSW5jCi0xNGU5ICBHQVJORVRTIFN5c3RlbSBDTyBMdGQKLTE0ZWEgIFBsYW5leCBDb21tdW5pY2F0aW9ucywgSW5jCi0JYWIwNiAgRk5XLTM2MDMtVFggQ2FyZEJ1cyBGYXN0IEV0aGVybmV0Ci0JYWIwNyAgUlRMODF4eCBSZWFsVGVrIEV0aGVybmV0Ci0xNGViICBTRUlLTyBFUFNPTiBDb3JwCi0xNGVjICBBQ1FJUklTCi0xNGVkICBEQVRBS0lORVRJQ1MgTHRkCi0xNGVlICBNQVNQUk8gS0VOS09IIENvcnAKLTE0ZWYgIENBUlJZIENvbXB1dGVyIEVORy4gQ08gTHRkCi0xNGYwICBDQU5PTiBSRVNFQUNIIENFTlRSRSBGUkFOQ0UKLTE0ZjEgIENvbmV4YW50Ci0JMTAwMiAgSENGIDU2ayBNb2RlbQotCTEwMDMgIEhDRiA1NmsgTW9kZW0KLQkxMDA0ICBIQ0YgNTZrIE1vZGVtCi0JMTAwNSAgSENGIDU2ayBNb2RlbQotCTEwMDYgIEhDRiA1NmsgTW9kZW0KLQkxMDIyICBIQ0YgNTZrIE1vZGVtCi0JMTAyMyAgSENGIDU2ayBNb2RlbQotCTEwMjQgIEhDRiA1NmsgTW9kZW0KLQkxMDI1ICBIQ0YgNTZrIE1vZGVtCi0JMTAyNiAgSENGIDU2ayBNb2RlbQotCTEwMzIgIEhDRiA1NmsgTW9kZW0KLQkxMDMzICBIQ0YgNTZrIERhdGEvRmF4IE1vZGVtCi0JCTEwMzMgODA3NyAgTkVDCi0JCTEyMmQgNDAyNyAgRGVsbCBaZXVzIC0gTURQMzg4MC1XKEIpIERhdGEgRmF4IE1vZGVtCi0JCTEyMmQgNDAzMCAgRGVsbCBNZXJjdXJ5IC0gTURQMzg4MC1VKEIpIERhdGEgRmF4IE1vZGVtCi0JCTEyMmQgNDAzNCAgRGVsbCBUaG9yIC0gTURQMzg4MC1XKFUpIERhdGEgRmF4IE1vZGVtCi0JCTEzZTAgMDIwZCAgRGVsbCBDb3BwZXIKLQkJMTNlMCAwMjBlICBEZWxsIFNpbHZlcgotCQkxM2UwIDAyNjEgIElCTQotCQkxM2UwIDAyOTAgIENvbXBhcSBHb2xkd2luZwotCQkxM2UwIDAyYTAgIElCTQotCQkxM2UwIDAyYjAgIElCTQotCQkxM2UwIDAyYzAgIENvbXBhcSBTY29vdGVyCi0JCTEzZTAgMDJkMCAgSUJNCi0JCTE0NGYgMTUwMCAgSUJNIFA4NS1ERiAoMSkKLQkJMTQ0ZiAxNTAxICBJQk0gUDg1LURGICgyKQotCQkxNDRmIDE1MGEgIElCTSBQODUtREYgKDMpCi0JCTE0NGYgMTUwYiAgSUJNIFA4NS1ERiBMb3cgUHJvZmlsZSAoMSkKLQkJMTQ0ZiAxNTEwICBJQk0gUDg1LURGIExvdyBQcm9maWxlICgyKQotCTEwMzQgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkxMDM1ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0KLQkJMTBjZiAxMDk4ICBGdWppdHN1IFA4NS1ERlNWCi0JMTAzNiAgSENGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIE1vZGVtCi0JCTEwNGQgODA2NyAgSENGIDU2ayBNb2RlbQotCQkxMjJkIDQwMjkgIE1EUDM4ODBTUC1XCi0JCTEyMmQgNDAzMSAgTURQMzg4MFNQLVUKLQkJMTNlMCAwMjA5ICBEZWxsIFRpdGFuaXVtCi0JCTEzZTAgMDIwYSAgRGVsbCBHcmFwaGl0ZQotCQkxM2UwIDAyNjAgIEdhdGV3YXkgUmVkIE93bAotCQkxM2UwIDAyNzAgIEdhdGV3YXkgV2hpdGUgSG9yc2UKLQkxMDUyICBIQ0YgNTZrIERhdGEvRmF4IE1vZGVtIChXb3JsZHdpZGUpCi0JMTA1MyAgSENGIDU2ayBEYXRhL0ZheCBNb2RlbSAoV29ybGR3aWRlKQotCTEwNTQgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0gKFdvcmxkd2lkZSkKLQkxMDU1ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0gKFdvcmxkd2lkZSkKLQkxMDU2ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgTW9kZW0gKFdvcmxkd2lkZSkKLQkxMDU3ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgTW9kZW0gKFdvcmxkd2lkZSkKLQkxMDU5ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlIE1vZGVtIChXb3JsZHdpZGUpCi0JMTA2MyAgSENGIDU2ayBEYXRhL0ZheCBNb2RlbQotCTEwNjQgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkxMDY1ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0KLQkxMDY2ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgTW9kZW0KLQkJMTIyZCA0MDMzICBEZWxsIEF0aGVuYSAtIE1EUDM5MDBWLVUKLQkxNDMzICBIQ0YgNTZrIERhdGEvRmF4IE1vZGVtCi0JMTQzNCAgSENGIDU2ayBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCTE0MzUgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UvU3BrcCAody9IYW5kc2V0KSBNb2RlbQotCTE0MzYgIEhDRiA1NmsgRGF0YS9GYXggTW9kZW0KLQkxNDUzICBIQ0YgNTZrIERhdGEvRmF4IE1vZGVtCi0JCTEzZTAgMDI0MCAgSUJNCi0JCTEzZTAgMDI1MCAgSUJNCi0JCTE0NGYgMTUwMiAgSUJNIFA5NS1ERiAoMSkKLQkJMTQ0ZiAxNTAzICBJQk0gUDk1LURGICgyKQotCTE0NTQgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkxNDU1ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0KLQkxNDU2ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgTW9kZW0KLQkJMTIyZCA0MDM1ICBEZWxsIEV1cm9wYSAtIE1EUDM5MDBWLVcKLQkJMTIyZCA0MzAyICBEZWxsIE1QMzkzMFYtVyhDKSBNaW5pUENJCi0JMTYxMCAgQURTTCBBY2Nlc3NSdW5uZXIgUENJIEFyYml0cmF0aW9uIERldmljZQotCTE2MTEgIEFjY2Vzc1J1bm5lciBQQ0kgQURTTCBJbnRlcmZhY2UgRGV2aWNlCi0JMTYyMCAgQURTTCBBY2Nlc3NSdW5uZXIgVjIgUENJIEFyYml0cmF0aW9uIERldmljZQotCTE2MjEgIEFjY2Vzc1J1bm5lciBWMiBQQ0kgQURTTCBJbnRlcmZhY2UgRGV2aWNlCi0JMTYyMiAgQWNjZXNzUnVubmVyIFYyIFBDSSBBRFNMIFl1a29uIFdBTiBBZGFwdGVyCi0JMTgwMyAgSENGIDU2ayBNb2RlbQotCQkwZTExIDAwMjMgIDYyMy1MQU4gR3JpenpseQotCQkwZTExIDAwNDMgIDYyMy1MQU4gWW9naQotCTE4MTUgIEhDRiA1NmsgTW9kZW0KLQkJMGUxMSAwMDIyICBHcml6emx5Ci0JCTBlMTEgMDA0MiAgWW9naQotCTIwMDMgIEhTRiA1NmsgRGF0YS9GYXggTW9kZW0KLQkyMDA0ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlIE1vZGVtCi0JMjAwNSAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwICh3L0hhbmRzZXQpIE1vZGVtCi0JMjAwNiAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIE1vZGVtCi0JMjAxMyAgSFNGIDU2ayBEYXRhL0ZheCBNb2RlbQotCQkwZTExIGIxOTUgIEJlYXIKLQkJMGUxMSBiMTk2ICBTZW1pbm9sZSAxCi0JCTBlMTEgYjFiZSAgU2VtaW5vbGUgMgotCQkxMDI1IDgwMTMgIEFjZXIKLQkJMTAzMyA4MDlkICBORUMKLQkJMTAzMyA4MGJjICBORUMKLQkJMTU1ZCA2NzkzICBIUAotCQkxNTVkIDg4NTAgIEUgTWFjaGluZXMKLQkyMDE0ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlIE1vZGVtCi0JMjAxNSAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwICh3L0hhbmRzZXQpIE1vZGVtCi0JMjAxNiAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIE1vZGVtCi0JMjA0MyAgSFNGIDU2ayBEYXRhL0ZheCBNb2RlbSAoV29ybGRXIFNtYXJ0REFBKQotCTIwNDQgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0gKFdvcmxkVyBTbWFydERBQSkKLQkyMDQ1ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0gKFdvcmxkVyBTbWFydERBQSkKLQkyMDQ2ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgTW9kZW0gKFdvcmxkVyBTbWFydERBQSkKLQkyMDYzICBIU0YgNTZrIERhdGEvRmF4IE1vZGVtIChTbWFydERBQSkKLQkyMDY0ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlIE1vZGVtIChTbWFydERBQSkKLQkyMDY1ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0gKFNtYXJ0REFBKQotCTIwNjYgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UvU3BrcCBNb2RlbSAoU21hcnREQUEpCi0JMjA5MyAgSFNGIDU2ayBNb2RlbQotCQkxNTVkIDJmMDcgIExlZ2VuZAotCTIxNDMgIEhTRiA1NmsgRGF0YS9GYXgvQ2VsbCBNb2RlbSAoTW9iIFdvcmxkVyBTbWFydERBQSkKLQkyMTQ0ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL0NlbGwgTW9kZW0gKE1vYiBXb3JsZFcgU21hcnREQUEpCi0JMjE0NSAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwICh3L0hTKS9DZWxsIE1vZGVtIChNb2IgV29ybGRXIFNtYXJ0REFBKQotCTIxNDYgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UvU3BrcC9DZWxsIE1vZGVtIChNb2IgV29ybGRXIFNtYXJ0REFBKQotCTIxNjMgIEhTRiA1NmsgRGF0YS9GYXgvQ2VsbCBNb2RlbSAoTW9iIFNtYXJ0REFBKQotCTIxNjQgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UvQ2VsbCBNb2RlbSAoTW9iIFNtYXJ0REFBKQotCTIxNjUgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UvU3BrcCAody9IUykvQ2VsbCBNb2RlbSAoTW9iIFNtYXJ0REFBKQotCTIxNjYgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UvU3BrcC9DZWxsIE1vZGVtIChNb2IgU21hcnREQUEpCi0JMjM0MyAgSFNGIDU2ayBEYXRhL0ZheCBDYXJkQnVzIE1vZGVtIChNb2IgV29ybGRXIFNtYXJ0REFBKQotCTIzNDQgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UgQ2FyZEJ1cyBNb2RlbSAoTW9iIFdvcmxkVyBTbWFydERBQSkKLQkyMzQ1ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSFMpIENhcmRCdXMgTW9kZW0gKE1vYiBXb3JsZFcgU21hcnREQUEpCi0JMjM0NiAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIENhcmRCdXMgTW9kZW0gKE1vYiBXb3JsZFcgU21hcnREQUEpCi0JMjM2MyAgSFNGIDU2ayBEYXRhL0ZheCBDYXJkQnVzIE1vZGVtIChNb2IgU21hcnREQUEpCi0JMjM2NCAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZSBDYXJkQnVzIE1vZGVtIChNb2IgU21hcnREQUEpCi0JMjM2NSAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwICh3L0hTKSBDYXJkQnVzIE1vZGVtIChNb2IgU21hcnREQUEpCi0JMjM2NiAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIENhcmRCdXMgTW9kZW0gKE1vYiBTbWFydERBQSkKLQkyNDQzICBIU0YgNTZrIERhdGEvRmF4IE1vZGVtIChNb2IgV29ybGRXIFNtYXJ0REFBKQotCQkxMDRkIDgwNzUgIE1vZGVtCi0JCTEwNGQgODA4MyAgTW9kZW0KLQkJMTA0ZCA4MDk3ICBNb2RlbQotCTI0NDQgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0gKE1vYiBXb3JsZFcgU21hcnREQUEpCi0JMjQ0NSAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwICh3L0hTKSBNb2RlbSAoTW9iIFdvcmxkVyBTbWFydERBQSkKLQkyNDQ2ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgTW9kZW0gKE1vYiBXb3JsZFcgU21hcnREQUEpCi0JMjQ2MyAgSFNGIDU2ayBEYXRhL0ZheCBNb2RlbSAoTW9iIFNtYXJ0REFBKQotCTI0NjQgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0gKE1vYiBTbWFydERBQSkKLQkyNDY1ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSFMpIE1vZGVtIChNb2IgU21hcnREQUEpCi0JMjQ2NiAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIE1vZGVtIChNb2IgU21hcnREQUEpCi0JMmYwMCAgSFNGIDU2ayBIU0ZpIE1vZGVtCi0JCTEzZTAgOGQ4NCAgSUJNIEhTRmkgVi45MAotCQkxM2UwIDhkODUgIENvbXBhcSBTdGluZ2VyCi0JCTE0ZjEgMjAwNCAgRHluYWxpbmsgNTZQTWkKLQkyZjAyICBIU0YgNTZrIEhTRmkgRGF0YS9GYXgKLQkyZjExICBIU0YgNTZrIEhTRmkgTW9kZW0KLQk4MjM0ICBSUzgyMzQgQVRNIFNBUiBDb250cm9sbGVyIFtTZXJ2aWNlU0FSIFBsdXNdCi0JODgwMCAgQ1gyMjcwMiBEVkItVCAyay84awotCQkxN2RlIDA4YTEgIFhQZXJ0IERWQi1UIFBDSSBCREEgRFZCVCAyMzg4MCBWaWRlbyBDYXB0dXJlCi0JODgwMiAgQ1gyMzg4MyBCcm9hZGNhc3QgRGVjb2RlcgotCQkxN2RlIDA4YTEgIFhwZXJ0IERWQi1UIFBDSSAyMzg4eCBUcmFuc3BvcnQgU3RyZWFtIENhcHR1cmUKLTE0ZjIgIE1PQklMSVRZIEVsZWN0cm9uaWNzCi0JMDEyMCAgRVYxMDAwIGJyaWRnZQotCTAxMjEgIEVWMTAwMCBQYXJhbGxlbCBwb3J0Ci0JMDEyMiAgRVYxMDAwIFNlcmlhbCBwb3J0Ci0JMDEyMyAgRVYxMDAwIEtleWJvYXJkIGNvbnRyb2xsZXIKLQkwMTI0ICBFVjEwMDAgTW91c2UgY29udHJvbGxlcgotMTRmMyAgQnJvYWRMb2dpYwotCTIwMzAgIDIwMzAgRFZCLVMgU2F0ZWxsaXRlIFJlY2lldmVyCi0JMjA1MCAgMjA1MCBEVkItVCBUZXJyZXN0cmlhbCAoQ2FibGUpIFJlY2lldmVyCi0JMjA2MCAgMjA2MCBBVFNDIFRlcnJlc3RyaWFsIChDYWJsZSkgUmVjaWV2ZXIKLTE0ZjQgIFRPS1lPIEVsZWN0cm9uaWMgSW5kdXN0cnkgQ08gTHRkCi0xNGY1ICBTT1BBQyBMdGQKLTE0ZjYgIENPWU9URSBUZWNobm9sb2dpZXMgTExDCi0xNGY3ICBXT0xGIFRlY2hub2xvZ3kgSW5jCi0xNGY4ICBBVURJT0NPREVTIEluYwotCTIwNzcgIFRQLTI0MCBkdWFsIHNwYW4gRTEgVm9JUCBQQ0kgY2FyZAotMTRmOSAgQUcgQ09NTVVOSUNBVElPTlMKLTE0ZmEgIFdBTkRFTCAmIEdPQ0hFUk1BTk4KLTE0ZmIgIFRSQU5TQVMgTUFSSU5FIChVSykgTHRkCi0xNGZjICBRdWFkcmljcyBMdGQKLQkwMDAwICBRc05ldCBFbGFuMyBOZXR3b3JrIEFkYXB0ZXIKLQkwMDAxICBRc05ldElJIEVsYW40IE5ldHdvcmsgQWRhcHRlcgotMTRmZCAgSkFQQU4gQ29tcHV0ZXIgSW5kdXN0cnkgSW5jCi0xNGZlICBBUkNIVEVLIFRFTEVDT00gQ29ycAotMTRmZiAgVFdJTkhFQUQgSU5URVJOQVRJT05BTCBDb3JwCi0xNTAwICBERUxUQSBFbGVjdHJvbmljcywgSW5jCi0JMTM2MCAgUlRMODF4eCBSZWFsVGVrIEV0aGVybmV0Ci0xNTAxICBCQU5LU09GVCBDQU5BREEgTHRkCi0xNTAyICBNSVRTVUJJU0hJIEVMRUNUUklDIExPR0lTVElDUyBTVVBQT1JUIENvIEx0ZAotMTUwMyAgS0FXQVNBS0kgTFNJIFVTQSBJbmMKLTE1MDQgIEtBSVNFUiBFbGVjdHJvbmljcwotMTUwNSAgSVRBIElOR0VOSUVVUkJVUk8gRlVSIFRFU1RBVUZHQUJFTiBHbWJICi0xNTA2ICBDSEFNRUxFT04gU3lzdGVtcyBJbmMKLSMgU2hvdWxkIGJlIEhURUMgTHRkLCBidXQgdGhlcmUgYXJlIG5vIGtub3duIEhURUMgY2hpcHMgYW5kIDE1MDcgaXMgYWxyZWFkeSB1c2VkIGJ5IG1pc3Rha2UgYnkgTW90b3JvbGEgKHNlZSB2ZW5kb3IgSUQgMTA1NykuCi0xNTA3ICBNb3Rvcm9sYSA/PyAvIEhURUMKLQkwMDAxICBNUEMxMDUgW0VhZ2xlXQotCTAwMDIgIE1QQzEwNiBbR3JhY2tsZV0KLQkwMDAzICBNUEM4MjQwIFtLYWhsdWFdCi0JMDEwMCAgTUMxNDU1NzUgW0hGQy1QQ0ldCi0JMDQzMSAgS1RJODI5YyAxMDBWRwotCTQ4MDEgIFJhdmVuCi0JNDgwMiAgRmFsY29uCi0JNDgwMyAgSGF3awotCTQ4MDYgIENQWDgyMTYKLTE1MDggIEhPTkRBIENPTk5FQ1RPUlMvTUhPVFJPTklDUyBJbmMKLTE1MDkgIEZJUlNUIElOVEVSTkFUSU9OQUwgQ29tcHV0ZXIgSW5jCi0xNTBhICBGT1JWVVMgUkVTRUFSQ0ggSW5jCi0xNTBiICBZQU1BU0hJVEEgU3lzdGVtcyBDb3JwCi0xNTBjICBLWU9QQUwgQ08gTHRkCi0xNTBkICBXQVJQU1BQRUQgSW5jCi0xNTBlICBDLVBPUlQgQ29ycAotMTUwZiAgSU5URUMgR21iSAotMTUxMCAgQkVIQVZJT1IgVEVDSCBDb21wdXRlciBDb3JwCi0xNTExICBDRU5USUxMSVVNIFRlY2hub2xvZ3kgQ29ycAotMTUxMiAgUk9TVU4gVGVjaG5vbG9naWVzIEluYwotMTUxMyAgUmF5Y2hlbQotMTUxNCAgVEZMIExBTiBJbmMKLTE1MTUgIEFkdmVudCBkZXNpZ24KLTE1MTYgIE1ZU09OIFRlY2hub2xvZ3kgSW5jCi0JMDgwMCAgTVRELTh4eCAxMDAvMTBNIEV0aGVybmV0IFBDSSBBZGFwdGVyCi0JMDgwMyAgU1VSRUNPTSBFUC0zMjBYLVMgMTAwLzEwTSBFdGhlcm5ldCBQQ0kgQWRhcHRlcgotCQkxMzIwIDEwYmQgIFNVUkVDT00gRVAtMzIwWC1TIDEwMC8xME0gRXRoZXJuZXQgUENJIEFkYXB0ZXIKLQkwODkxICBNVEQtOHh4IDEwMC8xME0gRXRoZXJuZXQgUENJIEFkYXB0ZXIKLTE1MTcgIEVDSE9URUsgQ29ycAotMTUxOCAgUEVQIE1PRFVMQVIgQ29tcHV0ZXJzIEdtYkgKLTE1MTkgIFRFTEVGT04gQUtUSUVCT0xBR0VUIExNIEVyaWNzc29uCi0xNTFhICBHbG9iZXRlawotCTEwMDIgIFBDSS0xMDAyCi0JMTAwNCAgUENJLTEwMDQKLQkxMDA4ICBQQ0ktMTAwOAotMTUxYiAgQ09NQk9YIEx0ZAotMTUxYyAgRElHSVRBTCBBVURJTyBMQUJTIEluYwotCTAwMDMgIFByb2RpZiBUIDI0OTYKLQk0MDAwICBQcm9kaWYgODgKLTE1MWQgIEZ1aml0c3UgQ29tcHV0ZXIgUHJvZHVjdHMgT2YgQW1lcmljYQotMTUxZSAgTUFUUklYIENvcnAKLTE1MWYgIFRPUElDIFNFTUlDT05EVUNUT1IgQ29ycAotCTAwMDAgIFRQNTYwIERhdGEvRmF4L1ZvaWNlIDU2ayBtb2RlbQotMTUyMCAgQ0hBUExFVCBTeXN0ZW0gSW5jCi0xNTIxICBCRUxMIENvcnAKLTE1MjIgIE1haW5QaW5lIEx0ZAotCTAxMDAgIFBDSSA8LT4gSU9CdXMgQnJpZGdlCi0JCTE1MjIgMDIwMCAgUm9ja0ZvcmNlRFVPIDIgUG9ydCBWLjkyL1YuNDQgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkJMTUyMiAwMzAwICBSb2NrRm9yY2VRVUFUUk8gNCBQb3J0IFYuOTIvVi40NCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDA0MDAgIFJvY2tGb3JjZURVTysgMiBQb3J0IFYuOTIvVi40NCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDA1MDAgIFJvY2tGb3JjZVFVQVRSTysgNCBQb3J0IFYuOTIvVi40NCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDA2MDAgIFJvY2tGb3JjZSsgMiBQb3J0IFYuOTAgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkJMTUyMiAwNzAwICBSb2NrRm9yY2UrIDQgUG9ydCBWLjkwIERhdGEvRmF4L1ZvaWNlIE1vZGVtCi0JCTE1MjIgMDgwMCAgUm9ja0ZvcmNlT0NUTysgOCBQb3J0IFYuOTIvVi40NCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDBjMDAgIFJvY2tGb3JjZURVTysgMiBQb3J0IFYuOTIvVi40NCBEYXRhLCBWLjM0IFN1cGVyLUczIEZheCwgVm9pY2UgTW9kZW0KLQkJMTUyMiAwZDAwICBSb2NrRm9yY2VRVUFUUk8rIDQgUG9ydCBWLjkyL1YuNDQgRGF0YSwgVi4zNCBTdXBlci1HMyBGYXgsIFZvaWNlIE1vZGVtCi0jIHRoaXMgaXMgYSBjb3JyZWN0aW9uIHRvIGEgcmVjZW50IGVudHJ5LiAxNTIyOjBFMDAgc2hvdWxkIGJlIDE1MjI6MUQwMAotCQkxNTIyIDFkMDAgIFJvY2tGb3JjZU9DVE8rIDggUG9ydCBWLjkyL1YuNDQgRGF0YSwgVi4zNCBTdXBlci1HMyBGYXgsIFZvaWNlIE1vZGVtCi0xNTIzICBNVVNJQyBTZW1pY29uZHVjdG9ycwotMTUyNCAgRU5FIFRlY2hub2xvZ3kgSW5jCi0JMDUxMCAgQ0I3MTAgTWVtb3J5IENhcmQgUmVhZGVyIENvbnRyb2xsZXIKLQkwNjEwICBQQ0kgU21hcnQgQ2FyZCBSZWFkZXIgQ29udHJvbGxlcgotCTEyMTEgIENCMTIxMSBDYXJkYnVzIENvbnRyb2xsZXIKLQkxMjI1ICBDQjEyMjUgQ2FyZGJ1cyBDb250cm9sbGVyCi0JMTQxMCAgQ0IxNDEwIENhcmRidXMgQ29udHJvbGxlcgotCQkxMDI1IDAwNWEgIFRyYXZlbE1hdGUgMjkwCi0JMTQxMSAgQ0ItNzEwLzIvNCBDYXJkYnVzIENvbnRyb2xsZXIKLQkxNDEyICBDQi03MTIvNCBDYXJkYnVzIENvbnRyb2xsZXIKLQkxNDIwICBDQjE0MjAgQ2FyZGJ1cyBDb250cm9sbGVyCi0JMTQyMSAgQ0ItNzIwLzIvNCBDYXJkYnVzIENvbnRyb2xsZXIKLQkxNDIyICBDQi03MjIvNCBDYXJkYnVzIENvbnRyb2xsZXIKLTE1MjUgIElNUEFDVCBUZWNobm9sb2dpZXMKLTE1MjYgIElTUywgSW5jCi0xNTI3ICBTT0xFQ1RST04KLTE1MjggIEFDS1NZUwotMTUyOSAgQU1FUklDQU4gTUlDUk9TeXN0ZW1zIEluYwotMTUyYSAgUVVJQ0tUVVJOIERFU0lHTiBTeXN0ZW1zCi0xNTJiICBGTFlURUNIIFRlY2hub2xvZ3kgQ08gTHRkCi0xNTJjICBNQUNSQUlHT1IgU3lzdGVtcyBMTEMKLTE1MmQgIFFVQU5UQSBDb21wdXRlciBJbmMKLTE1MmUgIE1FTEVDIEluYwotMTUyZiAgUEhJTElQUyAtIENSWVBUTwotMTUzMCAgQUNRSVMgVGVjaG5vbG9neSBJbmMKLTE1MzEgIENIUllPTiBDb3JwCi0xNTMyICBFQ0hFTE9OIENvcnAKLTE1MzMgIEJBTFRJTU9SRQotMTUzNCAgUk9BRCBDb3JwCi0xNTM1ICBFVkVSR1JFRU4gVGVjaG5vbG9naWVzIEluYwotMTUzNyAgREFUQUxFWCBDT01NVU5DQVRJT05TCi0xNTM4ICBBUkFMSU9OIEluYwotCTAzMDMgIEFSUzEwNlMgVWx0cmEgQVRBIDEzMy8xMDAvNjYgSG9zdCBDb250cm9sbGVyCi0xNTM5ICBBVEVMSUVSIElORk9STUFUSVFVRVMgZXQgRUxFQ1RST05JUVVFIEVUVURFUyBTLkEuCi0xNTNhICBPTk8gU09LS0kKLTE1M2IgIFRFUlJBVEVDIEVsZWN0cm9uaWMgR21iSAotCTExNDQgIEF1cmVvbiA1LjEKLSMgVGVycmF0ZWMgc2VlbXMgdG8gdXNlIHNldmVyYWwgSURzIGZvciB0aGUgc2FtZSBjYXJkLgotCTExNDcgIEF1cmVvbiA1LjEgU2t5Ci0JMTE1OCAgUGhpbGlwcyBTZW1pY29uZHVjdG9ycyBTQUE3MTM0IChyZXYgMDEpIFtUZXJyYXRlYyBDaW5lcmd5IDYwMCBUVl0KLTE1M2MgIEFOVEFMIEVsZWN0cm9uaWMKLTE1M2QgIEZJTEFORVQgQ29ycAotMTUzZSAgVEVDSFdFTEwgSW5jCi0xNTNmICBNSVBTIERFTk1BUksKLTE1NDAgIFBST1ZJREVPIE1VTFRJTUVESUEgQ28gTHRkCi0xNTQxICBNQUNIT05FIENvbW11bmljYXRpb25zCi0xNTQyICBWSVZJRCBUZWNobm9sb2d5IEluYwotMTU0MyAgU0lMSUNPTiBMYWJvcmF0b3JpZXMKLQkzMDUyICBJbnRlbCA1MzcgW1dpbm1vZGVtXQotCTRjMjIgIFNpMzAzNiBNQyc5NyBEQUEKLTE1NDQgIERDTSBEQVRBIFN5c3RlbXMKLTE1NDUgIFZJU0lPTlRFSwotMTU0NiAgSU9JIFRlY2hub2xvZ3kgQ29ycAotMTU0NyAgTUlUVVRPWU8gQ29ycAotMTU0OCAgSkVUIFBST1BVTFNJT04gTGFib3JhdG9yeQotMTU0OSAgSU5URVJDT05ORUNUIFN5c3RlbXMgU29sdXRpb25zCi0xNTRhICBNQVggVGVjaG5vbG9naWVzIEluYwotMTU0YiAgQ09NUFVURVggQ28gTHRkCi0xNTRjICBWSVNVQUwgVGVjaG5vbG9neSBJbmMKLTE1NGQgIFBBTiBJTlRFUk5BVElPTkFMIEluZHVzdHJpYWwgQ29ycAotMTU0ZSAgU0VSVk9URVNUIEx0ZAotMTU0ZiAgU1RSQVRBQkVBTSBUZWNobm9sb2d5Ci0xNTUwICBPUEVOIE5FVFdPUksgQ28gTHRkCi0xNTUxICBTTUFSVCBFbGVjdHJvbmljIERFVkVMT1BNRU5UIEdtQkgKLTE1NTIgIFJBQ0FMIEFJUlRFQ0ggTHRkCi0xNTUzICBDSElDT05ZIEVsZWN0cm9uaWNzIENvIEx0ZAotMTU1NCAgUFJPTElOSyBNaWNyb3N5c3RlbXMgQ29ycAotMTU1NSAgR0VTWVRFQyBHbUJICi0xNTU2ICBQTEQgQVBQTElDQVRJT05TCi0xNTU3ICBNRURJQVNUQVIgQ28gTHRkCi0xNTU4ICBDTEVWTy9LQVBPSyBDb21wdXRlcgotMTU1OSAgU0kgTE9HSUMgTHRkCi0xNTVhICBJTk5PTUVESUEgSW5jCi0xNTViICBQUk9UQUMgSU5URVJOQVRJT05BTCBDb3JwCi0xNTVjICBDZW1heC1JY29uIEluYwotMTU1ZCAgTWFjIFN5c3RlbSBDbyBMdGQKLTE1NWUgIExQIEVsZWt0cm9uaWsgR21iSAotMTU1ZiAgUGVybGUgU3lzdGVtcyBMdGQKLTE1NjAgIFRlcmF5b24gQ29tbXVuaWNhdGlvbnMgU3lzdGVtcwotMTU2MSAgVmlld2dyYXBoaWNzIEluYwotMTU2MiAgU3ltYm9sIFRlY2hub2xvZ2llcwotMTU2MyAgQS1UcmVuZCBUZWNobm9sb2d5IENvIEx0ZAotMTU2NCAgWWFtYWthdHN1IEVsZWN0cm9uaWNzIEluZHVzdHJ5IENvIEx0ZAotMTU2NSAgQmlvc3RhciBNaWNyb3RlY2ggSW50J2wgQ29ycAotMTU2NiAgQXJkZW50IFRlY2hub2xvZ2llcyBJbmMKLTE1NjcgIEp1bmdzb2Z0Ci0xNTY4ICBEREsgRWxlY3Ryb25pY3MgSW5jCi0xNTY5ICBQYWxpdCBNaWNyb3N5c3RlbXMgSW5jLgotMTU2YSAgQXZ0ZWMgU3lzdGVtcwotMTU2YiAgMndpcmUgSW5jCi0xNTZjICBWaWRhYyBFbGVjdHJvbmljcyBHbWJICi0xNTZkICBBbHBoYS1Ub3AgQ29ycAotMTU2ZSAgQWxmYSBJbmMKLTE1NmYgIE0tU3lzdGVtcyBGbGFzaCBEaXNrIFBpb25lZXJzIEx0ZAotMTU3MCAgTGVjcm95IENvcnAKLTE1NzEgIENvbnRlbXBvcmFyeSBDb250cm9scwotCWEwMDEgIENDU0kgUENJMjAtNDg1IEFSQ25ldAotCWEwMDIgIENDU0kgUENJMjAtNDg1RCBBUkNuZXQKLQlhMDAzICBDQ1NJIFBDSTIwLTQ4NVggQVJDbmV0Ci0JYTAwNCAgQ0NTSSBQQ0kyMC1DWEIgQVJDbmV0Ci0JYTAwNSAgQ0NTSSBQQ0kyMC1DWFMgQVJDbmV0Ci0JYTAwNiAgQ0NTSSBQQ0kyMC1GT0ctU01BIEFSQ25ldAotCWEwMDcgIENDU0kgUENJMjAtRk9HLVNUIEFSQ25ldAotCWEwMDggIENDU0kgUENJMjAtVEI1IEFSQ25ldAotCWEwMDkgIENDU0kgUENJMjAtNS00ODUgNU1iaXQgQVJDbmV0Ci0JYTAwYSAgQ0NTSSBQQ0kyMC01LTQ4NUQgNU1iaXQgQVJDbmV0Ci0JYTAwYiAgQ0NTSSBQQ0kyMC01LTQ4NVggNU1iaXQgQVJDbmV0Ci0JYTAwYyAgQ0NTSSBQQ0kyMC01LUZPRy1TVCA1TWJpdCBBUkNuZXQKLQlhMDBkICBDQ1NJIFBDSTIwLTUtRk9HLVNNQSA1TWJpdCBBUkNuZXQKLQlhMjAxICBDQ1NJIFBDSTIyLTQ4NSAxME1iaXQgQVJDbmV0Ci0JYTIwMiAgQ0NTSSBQQ0kyMi00ODVEIDEwTWJpdCBBUkNuZXQKLQlhMjAzICBDQ1NJIFBDSTIyLTQ4NVggMTBNYml0IEFSQ25ldAotCWEyMDQgIENDU0kgUENJMjItQ0hCIDEwTWJpdCBBUkNuZXQKLQlhMjA1ICBDQ1NJIFBDSTIyLUZPR19TVCAxME1iaXQgQVJDbmV0Ci0JYTIwNiAgQ0NTSSBQQ0kyMi1USEIgMTBNYml0IEFSQ25ldAotMTU3MiAgT3RpcyBFbGV2YXRvciBDb21wYW55Ci0xNTczICBMYXR0aWNlIC0gVmFudGlzCi0xNTc0ICBGYWlyY2hpbGQgU2VtaWNvbmR1Y3RvcgotMTU3NSAgVm9sdGFpcmUgQWR2YW5jZWQgRGF0YSBTZWN1cml0eSBMdGQKLTE1NzYgIFZpZXdjYXN0IENPTQotMTU3OCAgSElUVAotCTU2MTUgIFZQTUszIFtWaWRlbyBQcm9jZXNzb3IgTWsgSUlJXQotMTU3OSAgRHVhbCBUZWNobm9sb2d5IENvcnAKLTE1N2EgIEphcGFuIEVsZWNyb25pY3MgSW5kIEluYwotMTU3YiAgU3RhciBNdWx0aW1lZGlhIENvcnAKLTE1N2MgIEV1cm9zb2Z0IChVSykKLQk4MDAxICBGaXgyMDAwIFBDSSBZMksgQ29tcGxpYW5jZSBDYXJkCi0xNTdkICBHZW1mbGV4IE5ldHdvcmtzCi0xNTdlICBUcmFuc2l0aW9uIE5ldHdvcmtzCi0xNTdmICBQWCBJbnN0cnVtZW50cyBUZWNobm9sb2d5IEx0ZAotMTU4MCAgUHJpbWV4IEFlcm9zcGFjZSBDbwotMTU4MSAgU0VIIENvbXB1dGVydGVjaG5payBHbWJICi0xNTgyICBDeXRlYyBDb3JwCi0xNTgzICBJbmV0IFRlY2hub2xvZ2llcyBJbmMKLTE1ODQgIFVuaXdpbGwgQ29tcHV0ZXIgQ29ycAotMTU4NSAgTG9naXRyb24KLTE1ODYgIExhbmNhc3QgSW5jCi0xNTg3ICBLb25pY2EgQ29ycAotMTU4OCAgU29saWR1bSBTeXN0ZW1zIENvcnAKLTE1ODkgIEF0bGFudGVrIE1pY3Jvc3lzdGVtcyBQdHkgTHRkCi0xNThhICBEaWdhbG9nIFN5c3RlbXMgSW5jCi0xNThiICBBbGxpZWQgRGF0YSBUZWNobm9sb2dpZXMKLTE1OGMgIEhpdGFjaGkgU2VtaWNvbmR1Y3RvciAmIERldmljZXMgU2FsZXMgQ28gTHRkCi0xNThkICBQb2ludCBNdWx0aW1lZGlhIFN5c3RlbXMKLTE1OGUgIExhcmEgVGVjaG5vbG9neSBJbmMKLTE1OGYgIERpdGVjdCBDb29wCi0xNTkwICAzcGFyZGF0YSBJbmMKLTE1OTEgIEFSTgotMTU5MiAgU3liYSBUZWNoIEx0ZAotCTA3ODEgIE11bHRpLUlPIENhcmQKLQkwNzgyICBQYXJhbGxlbCBQb3J0IENhcmQgMnhFUFAKLQkwNzgzICBNdWx0aS1JTyBDYXJkCi0JMDc4NSAgTXVsdGktSU8gQ2FyZAotCTA3ODYgIE11bHRpLUlPIENhcmQKLQkwNzg3ICBNdWx0aS1JTyBDYXJkCi0JMDc4OCAgTXVsdGktSU8gQ2FyZAotCTA3OGEgIE11bHRpLUlPIENhcmQKLTE1OTMgIEJvcHMgSW5jCi0xNTk0ICBOZXRnYW1lIEx0ZAotMTU5NSAgRGl2YSBTeXN0ZW1zIENvcnAKLTE1OTYgIEZvbHNvbSBSZXNlYXJjaCBJbmMKLTE1OTcgIE1lbWVjIERlc2lnbiBTZXJ2aWNlcwotMTU5OCAgR3Jhbml0ZSBNaWNyb3N5c3RlbXMKLTE1OTkgIERlbHRhIEVsZWN0cm9uaWNzIEluYwotMTU5YSAgR2VuZXJhbCBJbnN0cnVtZW50Ci0xNTliICBGYXJhZGF5IFRlY2hub2xvZ3kgQ29ycAotMTU5YyAgU3RyYXR1cyBDb21wdXRlciBTeXN0ZW1zCi0xNTlkICBOaW5nYm8gSGFycmlzb24gRWxlY3Ryb25pY3MgQ28gTHRkCi0xNTllICBBLU1heCBUZWNobm9sb2d5IENvIEx0ZAotMTU5ZiAgR2FsZWEgTmV0d29yayBTZWN1cml0eQotMTVhMCAgQ29tcHVtYXN0ZXIgU1JMCi0xNWExICBHZW9jYXN0IE5ldHdvcmsgU3lzdGVtcwotMTVhMiAgQ2F0YWx5c3QgRW50ZXJwcmlzZXMgSW5jCi0JMDAwMSAgVEE3MDAgUENJIEJ1cyBBbmFseXplci9FeGVyY2lzZXIKLTE1YTMgIEl0YWx0ZWwKLTE1YTQgIFgtTmV0IE9ZCi0xNWE1ICBUb3lvdGEgTWFjcyBJbmMKLTE1YTYgIFN1bmxpZ2h0IFVsdHJhc291bmQgVGVjaG5vbG9naWVzIEx0ZAotMTVhNyAgU1NFIFRlbGVjb20gSW5jCi0xNWE4ICBTaGFuZ2hhaSBDb21tdW5pY2F0aW9ucyBUZWNobm9sb2dpZXMgQ2VudGVyCi0xNWFhICBNb3JldG9uIEJheQotMTVhYiAgQmx1ZXN0ZWVsIE5ldHdvcmtzIEluYwotMTVhYyAgTm9ydGggQXRsYW50aWMgSW5zdHJ1bWVudHMKLTE1YWQgIFZNd2FyZSBJbmMKLQkwNDA1ICBbVk13YXJlIFNWR0EgSUldIFBDSSBEaXNwbGF5IEFkYXB0ZXIKLQkwNzEwICBWaXJ0dWFsIFNWR0EKLQkwNzIwICBWTXdhcmUgSGlnaC1TcGVlZCBWaXJ0dWFsIE5JQyBbdm14bmV0XQotMTVhZSAgQW1lcnNoYW0gUGhhcm1hY2lhIEJpb3RlY2gKLTE1YjAgIFpvbHRyaXggSW50ZXJuYXRpb25hbCBMdGQKLTE1YjEgIFNvdXJjZSBUZWNobm9sb2d5IEluYwotMTViMiAgTW9zYWlkIFRlY2hub2xvZ2llcyBJbmMKLTE1YjMgIE1lbGxhbm94IFRlY2hub2xvZ2llcwotCTUyNzQgIE1UMjExMDggSW5maW5pQnJpZGdlCi0JNWE0NCAgTVQyMzEwOCBJbmZpbmlIb3N0Ci0JNWE0NSAgTVQyMzEwOCBbSW5maW5paG9zdCBIQ0EgRmxhc2ggUmVjb3ZlcnldCi0JNWE0NiAgTVQyMzEwOCBQQ0kgQnJpZGdlCi0JNWU4YyAgTVQyNDIwNCBbSW5maW5pSG9zdCBJSUkgTHggSENBXQotCTVlOGQgIE1UMjQyMDQgW0luZmluaUhvc3QgSUlJIEx4IEhDQSBGbGFzaCBSZWNvdmVyeV0KLQk2Mjc4ICBNVDI1MjA4IEluZmluaUhvc3QgSUlJIEV4IChUYXZvciBjb21wYXRpYmlsaXR5IG1vZGUpCi0JNjI3OSAgTVQyNTIwOCBbSW5maW5pSG9zdCBJSUkgRXggSENBIEZsYXNoIFJlY292ZXJ5XQotCTYyODIgIE1UMjUyMDggSW5maW5pSG9zdCBJSUkgRXgKLTE1YjQgIENDSS9UUklBRAotMTViNSAgQ2ltZXRyaWNzIEluYwotMTViNiAgVGV4YXMgTWVtb3J5IFN5c3RlbXMgSW5jCi0xNWI3ICBTYW5kaXNrIENvcnAKLTE1YjggIEFEREktREFUQSBHbWJICi0xNWI5ICBNYWVzdHJvIERpZ2l0YWwgQ29tbXVuaWNhdGlvbnMKLTE1YmEgIEltcGFjY3QgVGVjaG5vbG9neSBDb3JwCi0xNWJiICBQb3J0d2VsbCBJbmMKLTE1YmMgIEFnaWxlbnQgVGVjaG5vbG9naWVzCi0JMjkyMiAgNjQgQml0LCAxMzNNSHogUENJLVggRXhlcmNpc2VyICYgUHJvdG9jb2wgQ2hlY2tlcgotCTI5MjggIDY0IEJpdCwgNjZNSHogUENJIEV4ZXJjaXNlciAmIEFuYWx5emVyCi0JMjkyOSAgNjQgQml0LCAxMzNNSHogUENJLVggQW5hbHl6ZXIgJiBFeGVyY2lzZXIKLTE1YmQgIERGSSBJbmMKLTE1YmUgIFNvbGEgRWxlY3Ryb25pY3MKLTE1YmYgIEhpZ2ggVGVjaCBDb21wdXRlciBDb3JwIChIVEMpCi0xNWMwICBCVk0gTHRkCi0xNWMxICBRdWFudGVsCi0xNWMyICBOZXdlciBUZWNobm9sb2d5IEluYwotMTVjMyAgVGFpd2FuIE15Y29tcCBDbyBMdGQKLTE1YzQgIEVWU1ggSW5jCi0xNWM1ICBQcm9jb21wIEluZm9ybWF0aWNzIEx0ZAotCTgwMTAgIDEzOTRiIC0gMTM5NCBGaXJld2lyZSAzLVBvcnQgSG9zdCBBZGFwdGVyIENhcmQKLTE1YzYgIFRlY2huaWNhbCBVbml2ZXJzaXR5IG9mIEJ1ZGFwZXN0Ci0xNWM3ICBUYXRleWFtYSBTeXN0ZW0gTGFib3JhdG9yeSBDbyBMdGQKLQkwMzQ5ICBUYXRleWFtYSBDLVBDSSBQTEMvTkMgY2FyZCBSZXYuMDFBCi0xNWM4ICBQZW50YSBNZWRpYSBDbyBMdGQKLTE1YzkgIFNlcm9tZSBUZWNobm9sb2d5IEluYwotMTVjYSAgQml0Ym95cyBPWQotMTVjYiAgQUcgRWxlY3Ryb25pY3MgTHRkCi0xNWNjICBIb3RyYWlsIEluYwotMTVjZCAgRHJlYW10ZWNoIENvIEx0ZAotMTVjZSAgR2VucmFkIEluYwotMTVjZiAgSGlsc2NoZXIgR21iSAotMTVkMSAgSW5maW5lb24gVGVjaG5vbG9naWVzIEFHCi0xNWQyICBGSUMgKEZpcnN0IEludGVybmF0aW9uYWwgQ29tcHV0ZXIgSW5jKQotMTVkMyAgTkRTIFRlY2hub2xvZ2llcyBJc3JhZWwgTHRkCi0xNWQ0ICBJd2lsbCBDb3JwCi0xNWQ1ICBUYXR1bmcgQ28KLTE1ZDYgIEVudHJpZGlhIENvcnAKLTE1ZDcgIFJvY2t3ZWxsLUNvbGxpbnMgSW5jCi0xNWQ4ICBDeWJlcm5ldGljcyBUZWNobm9sb2d5IENvIEx0ZAotMTVkOSAgU3VwZXIgTWljcm8gQ29tcHV0ZXIgSW5jCi0xNWRhICBDeWJlcmZpcm0gSW5jCi0xNWRiICBBcHBsaWVkIENvbXB1dGluZyBTeXN0ZW1zIEluYwotMTVkYyAgTGl0cm9uaWMgSW5jCi0JMDAwMSAgQXJndXMgMzAwIFBDSSBDcnlwdG9ncmFwaHkgTW9kdWxlCi0xNWRkICBTaWdtYXRlbCBJbmMKLTE1ZGUgIE1hbGxlYWJsZSBUZWNobm9sb2dpZXMgSW5jCi0xNWRmICBJbmZpbmlsaW5rIENvcnAKLTE1ZTAgIENhY2hlZmxvdyBJbmMKLTE1ZTEgIFZvaWNlIFRlY2hub2xvZ2llcyBHcm91cCBJbmMKLTE1ZTIgIFF1aWNrbmV0IFRlY2hub2xvZ2llcyBJbmMKLTE1ZTMgIE5ldHdvcnRoIFRlY2hub2xvZ2llcyBJbmMKLTE1ZTQgIFZTTiBTeXN0ZW1lbiBCVgotMTVlNSAgVmFsbGV5IHRlY2hub2xvZ2llcyBJbmMKLTE1ZTYgIEFnZXJlIEluYwotMTVlNyAgR2V0IEVuZ2luZWVyaW5nIENvcnAKLTE1ZTggIE5hdGlvbmFsIERhdGFjb21tIENvcnAKLQkwMTMwICBXaXJlbGVzcyBQQ0kgQ2FyZAotMTVlOSAgUGFjaWZpYyBEaWdpdGFsIENvcnAKLQkxODQxICBBRE1BLTEwMCBEaXNjU3RhUSBBVEEgQ29udHJvbGxlcgotMTVlYSAgVG9reW8gRGVuc2hpIFNla2VpIEsuSy4KLTE1ZWIgIERyc2VhcmNoIEdtYkgKLTE1ZWMgIEJlY2tob2ZmIEdtYkgKLQkzMTAxICBGQzMxMDEgUHJvZmlidXMgRFAgMSBDaGFubmVsIFBDSQotCTUxMDIgIEZDNTEwMgotMTVlZCAgTWFjcm9saW5rIEluYwotMTVlZSAgSW4gV2luIERldmVsb3BtZW50IEluYwotMTVlZiAgSW50ZWxsaWdlbnQgUGFyYWRpZ20gSW5jCi0xNWYwICBCLVRyZWUgU3lzdGVtcyBJbmMKLTE1ZjEgIFRpbWVzIE4gU3lzdGVtcyBJbmMKLTE1ZjIgIERpYWdub3N0aWMgSW5zdHJ1bWVudHMgSW5jCi0xNWYzICBEaWdpdG1lZGlhIENvcnAKLTE1ZjQgIFZhbHVlc29mdAotMTVmNSAgUG93ZXIgTWljcm8gUmVzZWFyY2gKLTE1ZjYgIEV4dHJlbWUgUGFja2V0IERldmljZSBJbmMKLTE1ZjcgIEJhbmN0ZWMKLTE1ZjggIEtvZ2EgRWxlY3Ryb25pY3MgQ28KLTE1ZjkgIFplbml0aCBFbGVjdHJvbmljcyBDb3JwCi0xNWZhICBKLlAuIEF4emFtIENvcnAKLTE1ZmIgIFppbG9nIEluYwotMTVmYyAgVGVjaHNhbiBFbGVjdHJvbmljcyBDbyBMdGQKLTE1ZmQgIE4tQ1VCRUQuTkVUCi0xNWZlICBLaW5wbyBFbGVjdHJvbmljcyBJbmMKLTE1ZmYgIEZhc3Rwb2ludCBUZWNobm9sb2dpZXMgSW5jCi0xNjAwICBOb3J0aHJvcCBHcnVtbWFuIC0gQ2FuYWRhIEx0ZAotMTYwMSAgVGVudGEgVGVjaG5vbG9neQotMTYwMiAgUHJvc3lzLXRlYyBJbmMKLTE2MDMgIE5va2lhIFdpcmVsZXNzIENvbW11bmljYXRpb25zCi0xNjA0ICBDZW50cmFsIFN5c3RlbSBSZXNlYXJjaCBDbyBMdGQKLTE2MDUgIFBhaXJnYWluIFRlY2hub2xvZ2llcwotMTYwNiAgRXVyb3BvcCBBRwotMTYwNyAgTGF2YSBTZW1pY29uZHVjdG9yIE1hbnVmYWN0dXJpbmcgSW5jCi0xNjA4ICBBdXRvbWF0ZWQgV2FnZXJpbmcgSW50ZXJuYXRpb25hbAotMTYwOSAgU2NpbWV0cmljIEluc3RydW1lbnRzIEluYwotMTYxMiAgVGVsZXN5bmVyZ3kgUmVzZWFyY2ggSW5jLgotMTYxOSAgRmFyU2l0ZSBDb21tdW5pY2F0aW9ucyBMdGQKLQkwNDAwICBGYXJTeW5jIFQyUCAoMiBwb3J0IFguMjEvVi4zNS9WLjI0KQotCTA0NDAgIEZhclN5bmMgVDRQICg0IHBvcnQgWC4yMS9WLjM1L1YuMjQpCi0jIHd3dy5yaW93b3Jrcy5jb20KLTE2MWYgIFJpb3dvcmtzCi0xNjI2ICBUREsgU2VtaWNvbmR1Y3RvciBDb3JwLgotCTg0MTAgIFJUTDgxeHggRmFzdCBFdGhlcm5ldAotMTYyOSAgS29uZ3NiZXJnIFNwYWNldGVjIEFTCi0JMTAwMyAgRm9ybWF0IHN5bmNocm9uaXplciB2My4wCi0JMjAwMiAgRmFzdCBVbml2ZXJzYWwgRGF0YSBPdXRwdXQKLSMgVGhpcyBzZWVtcyB0byBvY2N1ciBvbiB0aGVpciA4MDIuMTFiIFdpcmVsZXNzIGNhcmQgV01QLTExCi0xNjM3ICBMaW5rc3lzCi0JMzg3NCAgTGlua3N5cyA4MDIuMTFiIFdNUDExIFBDSSBXaXJlbGVzcyBjYXJkCi0xNjM4ICBTdGFuZGFyZCBNaWNyb3N5c3RlbXMgQ29ycCBbU01DXQotCTExMDAgIFNNQzI2MDJXIEVaQ29ubmVjdCAvIEFkZHRyb24gQVdBLTEwMCAvIEV1bWl0Y29tIFBDSSBXTDExMDAwCi0xNjNjICBTbWFydCBMaW5rIEx0ZC4KLQkzMDUyICBTbWFydExpbmsgU21hcnRQQ0k1NjIgNTZLIE1vZGVtCi0JNTQ0OSAgU21hcnRQQ0k1NjEgTW9kZW0KLTE2NTcgIEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgotMTY1YSAgRXBpeCBJbmMKLQljMTAwICBQSVhDSShSKSBDTDEgQ2FtZXJhIExpbmsgVmlkZW8gQ2FwdHVyZSBCb2FyZCBbY3VzdG9tIFFMNTIzMl0KLQlkMjAwICBQSVhDSShSKSBEMlggRGlnaXRhbCBWaWRlbyBDYXB0dXJlIEJvYXJkIFtjdXN0b20gUUw1MjMyXQotCWQzMDAgIFBJWENJKFIpIEQzWCBEaWdpdGFsIFZpZGVvIENhcHR1cmUgQm9hcmQgW2N1c3RvbSBRTDUyMzJdCi0xNjVkICBIc2luZyBUZWNoLiBFbnRlcnByaXNlIENvLiwgTHRkLgotMTY2MSAgV29ybGRzcGFjZSBDb3JwLgotMTY2OCAgQWN0aW9udGVjIEVsZWN0cm9uaWNzIEluYwotCTAxMDAgIE1pbmktUENJIGJyaWRnZQotIyBGb3JtZXJseSBTaUJ5dGUsIEluYy4KLTE2NmQgIEJyb2FkY29tIENvcnBvcmF0aW9uCi0JMDAwMSAgU2lCeXRlIEJDTTExMjUvMTEyNUgvMTI1MCBTeXN0ZW0tb24tYS1DaGlwIFBDSQotCTAwMDIgIFNpQnl0ZSBCQ00xMTI1SC8xMjUwIFN5c3RlbS1vbi1hLUNoaXAgSHlwZXJUcmFuc3BvcnQKLTE2NzcgIEJlcm5lY2tlciArIFJhaW5lcgotCTEwNGUgIDVMUzE3Mi42IEImUiBEdWFsIENBTiBJbnRlcmZhY2UgQ2FyZAotCTEyZDcgIDVMUzE3Mi42MSBCJlIgRHVhbCBDQU4gSW50ZXJmYWNlIENhcmQKLTE2N2IgIFp5REFTIFRlY2hub2xvZ3kgQ29ycC4KLQkyMTAyICBaeURBUyBaRDEyMDIKLQkJMTg3ZSAzNDA2ICBaeUFJUiBCLTEyMiBDYXJkQnVzIDExTWJzIFdpcmVsZXNzIExBTiBDYXJkCi0xNjgxICBIZXJjdWxlcwotIyBNb3JlIHNwZWNzLCBtb3JlIGFjY3VyYXRlIGRlc2MuCi0JMDAxMCAgSGVyY3VsZXMgM2QgUHJvcGhldCBJSSBVbHRyYSA2NE1CIFsgMzUwIE1IeiBOVjE1QlIgY29yZSwgMTI4LWJpdCBERFIgQCA0NjAgTUh6LCAxLjV2IEFHUDR4ICBdCi0xNjgyICBYRlggUGluZSBHcm91cCBJbmMuCi0xNjg4ICBDYXN0bGVOZXQgVGVjaG5vbG9neSBJbmMuCi0JMTE3MCAgV0xBTiA4MDIuMTFiIGNhcmQKLTE2OGMgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIEluYy4KLQkwMDA3ICBBUjUwMDAgODAyLjExYSBXaXJlbGVzcyBBZGFwdGVyCi0JMDAxMSAgQVI1MjEwIDgwMi4xMWEgTklDCi0JMDAxMiAgQVI1MjExIDgwMi4xMWFiIE5JQwotCTAwMTMgIEFSNTIxMiA4MDIuMTFhYmcgTklDCi0JCTExMTMgZDMwMSAgUGhpbGlwcyBDUFdOQTEwMCBXaXJlbGVzcyBDYXJkQnVzIGFkYXB0ZXIKLQkJMTE4NiAzMjAyICBELWxpbmsgRFdMLUc2NTAgQjMgV2lyZWxlc3MgY2FyZGJ1cyBhZGFwdGVyCi0JCTExODYgMzIwMyAgRFdMLUc1MjAgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQkJMTE4NiAzYTEzICBEV0wtRzUyMCBXaXJlbGVzcyBQQ0kgQWRhcHRlciByZXYuIEIKLQkJMTE4NiAzYTk0ICBDNTRDIFdpcmVsZXNzIDgwMS4xMWcgY2FyZGJ1cwotCQkxMzg1IDRkMDAgIE5ldGdlYXIgV0czMTFUIFdpcmVsZXNzIFBDSSBBZGFwdGVyCi0JCTE0YjcgMGE2MCAgODQ4Mi1XRCBPUmlOT0NPIDExYS9iL2cgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQkJMTY4YyAwMDEzICBXRzUxMVQgV2lyZWxlc3MgQ2FyZEJ1cyBBZGFwdGVyCi0JCTE2OGMgMTAyNSAgRFdMLUc2NTBCMiBXaXJlbGVzcyBDYXJkQnVzIEFkYXB0ZXIKLQkJMTY4YyAxMDI3ICBOZXRnYXRlIE5MLTMwNTRDQiBBUklFUyBiL2cgQ2FyZEJ1cyBBZGFwdGVyCi0JCTE2OGMgMjAyNiAgTmV0Z2F0ZSA1MzU0TVAgQVJJRVMgYSgxMDhNYiB0dXJibykvYi9nIE1pbmlQQ0kgQWRhcHRlcgotCQkxNjhjIDIwNDEgIE5ldGdhdGUgNTM1NE1QIFBsdXMgQVJJRVMyIGIvZyBNaW5pUENJIEFkYXB0ZXIKLQkJMTY4YyAyMDQyICBOZXRnYXRlIDUzNTRNUCBQbHVzIEFSSUVTMiBhL2IvZyBNaW5pUENJIEFkYXB0ZXIKLQkxMDE0ICBBUjUyMTIgODAyLjExYWJnIE5JQwotMTY5YyAgTmV0Y2VsbCBDb3Jwb3JhdGlvbgotCTAwNDQgIFN5bmNSQUlEIFNSMzAwMC81MDAwIFNlcmllcyBTQVRBIFJBSUQgQ29udHJvbGxlcnMKLTE2YTUgIFRla3JhbSBUZWNobm9sb2d5IENvLixMdGQuCi0xNmFiICBHbG9iYWwgU3VuIFRlY2hub2xvZ3kgSW5jCi0JMTEwMCAgR0wyNDExMFAKLQkxMTAxICBQTFg5MDUyIFBDTUNJQS10by1QQ0kgV2lyZWxlc3MgTEFOCi0JMTEwMiAgUENNQ0lBLXRvLVBDSSBXaXJlbGVzcyBOZXR3b3JrIEJyaWRnZQotCTg1MDEgIFdMLTgzMDUgV2lyZWxlc3MgTEFOIFBDSSBBZGFwdGVyCi0xNmFlICBTYWZlbmV0IEluYwotCTExNDEgIFNhZmVYY2VsLTExNDEKLTE2YjQgIEFzcGV4IFNlbWljb25kdWN0b3IgTHRkCi0xNmJlICBDcmVhdGl4IFBvbHltZWRpYSBHbWJICi0xNmNhICBDRU5BVEVLIEluYwotCTAwMDEgIFJvY2tldCBEcml2ZSBETAotMTZjZCAgRGVuc2l0cm9uIFRlY2hub2xvZ2llcwotMTZjZSAgUm9sYW5kIENvcnAuCi0jIHd3dy5waWthdGVjaG5vbG9naWVzLmNvbQotMTZkZiAgUElLQSBUZWNobm9sb2dpZXMgSW5jLgotMTZlMyAgRXVyb3BlYW4gU3BhY2UgQWdlbmN5Ci0JMWUwZiAgTEVPTjJGVCBQcm9jZXNzb3IKLTE2ZWMgIFUuUy4gUm9ib3RpY3MKLQkwMGZmICBVU1I5OTc5MDAgMTAvMTAwIE1icHMgUENJIE5ldHdvcmsgQ2FyZAotCTAxMTYgIFVTUjk5NzkwMiAxMC8xMDAvMTAwMCBNYnBzIFBDSSBOZXR3b3JrIENhcmQKLQkzNjg1ICBXaXJlbGVzcyBBY2Nlc3MgUENJIEFkYXB0ZXIgTW9kZWwgMDIyNDE1Ci0xNmVkICBTeWNyb24gTi4gVi4KLQkxMDAxICBVTUlPIGNvbW11bmljYXRpb24gY2FyZAotMTZmMyAgSmV0d2F5IEluZm9ybWF0aW9uIENvLiwgTHRkLgotMTZmNCAgVndlYiBDb3JwCi0JODAwMCAgVlcyMDEwCi0xNmY2ICBWaWRlb1RlbGUuY29tLCBJbmMuCi0jIHd3dy5pbnRlcm5ldG1hY2hpbmVzLmNvbQotMTcwMiAgSW50ZXJuZXQgTWFjaGluZXMgQ29ycG9yYXRpb24gKElNQykKLTE3MDUgIERpZ2l0YWwgRmlyc3QsIEluYy4KLTE3MGIgIE5ldE9jdGF2ZQotCTAxMDAgIE5TUDIwMDAtU1NMIGNyeXB0byBhY2NlbGVyYXRvcgotMTcwYyAgWW90dGFZb3R0YSBJbmMuCi0jIFNlZW1zIHRvIGJlIGEgMm5kIElEIGZvciBWaXRlc3NlIFNlbWljb25kdWN0b3IKLTE3MjUgIFZpdGVzc2UgU2VtaWNvbmR1Y3RvcgotCTcxNzQgIFZTQzcxNzQgUENJL1BDSS1YIFNlcmlhbCBBVEEgSG9zdCBCdXMgQ29udHJvbGxlcgotMTcyYSAgQWNjZWxlcmF0ZWQgRW5jcnlwdGlvbgotMTczNCAgRnVqaXRzdSBTaWVtZW5zIENvbXB1dGVyIEdtYkgKLTE3MzcgIExpbmtzeXMKLQkwMDEzICBXTVA1NEcgV2lyZWxlc3MgUGNpIENhcmQKLQkwMDE1ICBXTVA1NEdTIFdpcmVsZXNzIFBjaSBDYXJkCi0JMTAzMiAgR2lnYWJpdCBOZXR3b3JrIEFkYXB0ZXIKLQkJMTczNyAwMDE1ICBFRzEwMzIgdjIgSW5zdGFudCBHaWdhYml0IE5ldHdvcmsgQWRhcHRlcgotCTEwNjQgIEdpZ2FiaXQgTmV0d29yayBBZGFwdGVyCi0JCTE3MzcgMDAxNiAgRUcxMDY0IHYyIEluc3RhbnQgR2lnYWJpdCBOZXR3b3JrIEFkYXB0ZXIKLQlhYjA4ICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQlhYjA5ICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLTE3M2IgIEFsdGltYSAobmVlIEJyb2FkY29tKQotCTAzZTggIEFDMTAwMCBHaWdhYml0IEV0aGVybmV0Ci0JMDNlOSAgQUMxMDAxIEdpZ2FiaXQgRXRoZXJuZXQKLQkwM2VhICBBQzkxMDAgR2lnYWJpdCBFdGhlcm5ldAotCQkxNzNiIDAwMDEgIEFDMTAwMgotCTAzZWIgIEFDMTAwMyBHaWdhYml0IEV0aGVybmV0Ci0xNzQzICBQZXBwZXJjb24gQUcKLQk4MTM5ICBST0wvRi0xMDAgRmFzdCBFdGhlcm5ldCBBZGFwdGVyIHdpdGggUk9MCi0xNzQ5ICBSTFggVGVjaG5vbG9naWVzCi0xNzRiICBQQyBQYXJ0bmVyIExpbWl0ZWQKLTE3NGQgIFdlbGxYIFRlbGVjb20gU0EKLTE3NWMgIEF1ZGlvU2NpZW5jZSBJbmMKLTE3NWUgIFNhbmVyYSBTeXN0ZW1zLCBJbmMuCi0xNzg3ICBIaWdodGVjaCBJbmZvcm1hdGlvbiBTeXN0ZW0gTHRkLgotIyBhbHNvIHVzZWQgYnkgU3RydWNrIElubm92YXRpdmUgU3lzdGVtZSBmb3Igam9pbnQgZGV2ZWxvcG1lbnRzCi0xNzk2ICBSZXNlYXJjaCBDZW50cmUgSnVlbGljaAotCTAwMDEgIFNJUzExMDAgW0dpZ2FiaXQgbGlua10KLQkwMDAyICBIT1RsaW5rCi0JMDAwMyAgQ291bnRlciBUaW1lcgotCTAwMDQgIENBTUFDIENvbnRyb2xsZXIKLQkwMDA1ICBQUk9GSUJVUwotCTAwMDYgIEFNQ0MgSE9UbGluawotMTc5NyAgSnVtcFRlYyBoLCBHTUJICi0xNzk5ICBCZWxraW4KLQk2MDAxICBXaXJlbGVzcyBQQ0kgQ2FyZCAtIEY1RDYwMDEKLQk2MDIwICBXaXJlbGVzcyBQQ01DSUEgQ2FyZCAtIEY1RDYwMjAKLQk2MDYwICBXaXJlbGVzcyBQREEgQ2FyZCAtIEY1RDYwNjAKLQk3MDAwICBXaXJlbGVzcyBQQ0kgQ2FyZCAtIEY1RDcwMDAKLTE3YTAgIEdlbmVzeXMgTG9naWMsIEluYwotCTgwMzMgIEdMODgwUyBVU0IgMS4xIGNvbnRyb2xsZXIKLQk4MDM0ICBHTDg4MFMgVVNCIDIuMCBjb250cm9sbGVyCi0xN2FmICBIaWdodGVjaCBJbmZvcm1hdGlvbiBTeXN0ZW0gTHRkLgotMTdiMyAgSGF3a2luZyBUZWNobm9sb2dpZXMKLQlhYjA4ICBQTjY3MlRYIDEwLzEwMCBFdGhlcm5ldAotMTdiNCAgSW5kcmEgTmV0d29ya3MsIEluYy4KLQkwMDExICBXZWJFbmhhbmNlIDEwMCBHWklQIENvbXByZXNzaW9uIENhcmQKLTE3YzAgIFdpc3Ryb24gQ29ycC4KLTE3YzIgIE5ld2lzeXMsIEluYy4KLTE3Y2MgIE5ldENoaXAgVGVjaG5vbG9neSwgSW5jCi0JMjI4MCAgVVNCIDIuMAotMTdkMyAgQXJlY2EgVGVjaG5vbG9neSBDb3JwLgotCTExMTAgIEFSQy0xMTEwIDQtUG9ydCBQQ0ktWCB0byBTQVRBIFJBSUQgQ29udHJvbGxlcgotCTExMjAgIEFSQy0xMTIwIDgtUG9ydCBQQ0ktWCB0byBTQVRBIFJBSUQgQ29udHJvbGxlcgotCTExMzAgIEFSQy0xMTMwIDEyLVBvcnQgUENJLVggdG8gU0FUQSBSQUlEIENvbnRyb2xsZXIKLQkxMTYwICBBUkMtMTE2MCAxNi1Qb3J0IFBDSS1YIHRvIFNBVEEgUkFJRCBDb250cm9sbGVyCi0JMTIxMCAgQVJDLTEyMTAgNC1Qb3J0IFBDSS1FeHByZXNzIHRvIFNBVEEgUkFJRCBDb250cm9sbGVyCi0JMTIyMCAgQVJDLTEyMjAgOC1Qb3J0IFBDSS1FeHByZXNzIHRvIFNBVEEgUkFJRCBDb250cm9sbGVyCi0JMTIzMCAgQVJDLTEyMzAgMTItUG9ydCBQQ0ktRXhwcmVzcyB0byBTQVRBIFJBSUQgQ29udHJvbGxlcgotCTEyNjAgIEFSQy0xMjYwIDE2LVBvcnQgUENJLUV4cHJlc3MgdG8gU0FUQSBSQUlEIENvbnRyb2xsZXIKLSMgUzJpbyBzaGlwcyAxMEdiIFBDSS1YIEV0aGVybmV0IGFkYXB0ZXJzIHd3dy5zMmlvLmNvbQotMTdkNSAgUzJpbyBJbmMuCi0JNTgzMSAgWGZyYW1lIDEwIEdpZ2FiaXQgRXRoZXJuZXQgUENJLVgKLQkJMTAzYyAxMmQ1ICBIUCBQQ0ktWCAxMzNNSHogMTBHYkUgU1IgRmliZXIgW0FCMjg3QV0KLTE3ZGUgIEtXb3JsZCBDb21wdXRlciBDby4gTHRkLgotIyBodHRwOi8vd3d3LmNvbm5lY3QzZC5jb20KLTE3ZWUgIENvbm5lY3QgQ29tcG9uZW50cyBMdGQKLTE3ZmUgIExpbmtzeXMsIEEgRGl2aXNpb24gb2YgQ2lzY28gU3lzdGVtcwotCTIxMjAgIFdNUDExdjQgODAyLjExYiBQQ0kgY2FyZAotCTIyMjAgIFtBaXJDb25uXSBJTlBST0NPTU0gSVBOIDIyMjAgV2lyZWxlc3MgTEFOIEFkYXB0ZXIgKHJldiAwMSkKLTE4MTMgIEFtYmllbnQgVGVjaG5vbG9naWVzIEluYwotCTQwMDAgIEhhTSBjb250cm9sbGVybGVzcyBtb2RlbQotCQkxNmJlIDAwMDEgIFY5eCBIQU0gRGF0YSBGYXggTW9kZW0KLQk0MTAwICBIYU0gcGx1cyBEYXRhIEZheCBNb2RlbQotCQkxNmJlIDAwMDIgIFY5eCBIQU0gMTM5NAotMTgxNCAgUmFMaW5rCi0JMDEwMSAgV2lyZWxlc3MgUENJIEFkcGF0b3IgUlQyNDAwIC8gUlQyNDYwCi0JCTMzMDYgMTExMyAgUXVpZHdheSBXTDEwME0KLQkwMjAxICBSYWxpbmsgUlQyNTAwIDgwMi4xMSBDYXJkYnVzIFJlZmVyZW5jZSBDYXJkCi0JCTEzNzEgMDAxZSAgQ1dDLTg1NCBXaXJlbGVzcy1HIENhcmRCdXMgQWRhcHRlcgotCQkxMzcxIDAwMWYgIENXTS04NTQgV2lyZWxlc3MtRyBNaW5pIFBDSSBBZGFwdGVyCi0JCTEzNzEgMDAyMCAgQ1dQLTg1NCBXaXJlbGVzcy1HIFBDSSBBZGFwdGVyCi0JCTE0NTggZTM4MSAgR04tV01LRyA4MDIuMTFiL2cgV2lyZWxlc3MgQ2FyZEJ1cyBBZGFwdGVyCi0xODIwICBJbmZpbmlDb24gU3lzdGVtcyBJbmMuCi0xODIyICBUd2luaGFuIFRlY2hub2xvZ3kgQ28uIEx0ZAotMTgyZCAgU2l0ZUNvbSBFdXJvcGUgQlYKLSMgSEZDLWJhc2VkIElTRE4gY2FyZAotCTMwNjkgIElTRE4gUENJIERDLTEwNVYyCi0JOTc5MCAgV0wtMTIxIFdpcmVsZXNzIE5ldHdvcmsgQWRhcHRlciAxMDBnKyBbVmVyLjNdCi0xODMwICBDcmVkZW5jZSBTeXN0ZW1zIENvcnBvcmF0aW9uCi0xODNiICBNaWtyb00gR21iSAotCTA4YTcgIE1WQzEwMCBEVkkKLQkwOGE4ICBNVkMxMDEgU0RJCi0JMDhhOSAgTVZDMTAyIERWSStBdWRpbwotMTg0OSAgQVNSb2NrIEluY29ycG9yYXRpb24KLTE4NTEgIE1pY3JvdHVuZSwgSW5jLgotMTg1MiAgQW5yaXRzdSBDb3JwLgotMTg1ZiAgV2lzdHJvbiBOZVdlYiBDb3JwLgotMTg2NyAgVG9wc3BpbiBDb21tdW5pY2F0aW9ucwotCTVhNDQgIE1UMjMxMDggUENJLVggSENBCi0JNWE0NSAgTVQyMzEwOCBQQ0ktWCBIQ0EgZmxhc2ggcmVjb3ZlcnkKLQk1YTQ2ICBNVDIzMTA4IFBDSS1YIEhDQSBicmlkZ2UKLQk2Mjc4ICBNVDI1MjA4IEluZmluaUhvc3QgSUlJIEV4IChUYXZvciBjb21wYXRpYmlsaXR5IG1vZGUpCi0JNjI4MiAgTVQyNTIwOCBJbmZpbmlIb3N0IElJSSBFeAotMTg3ZSAgWnlYRUwgQ29tbXVuaWNhdGlvbiBDb3Jwb3JhdGlvbgotMTg4OCAgVmFyaXN5cyBMdGQKLQkwMzAxICBWTUZYMSBGUEdBIFBNQyBtb2R1bGUKLQkwNjAxICBWU00yIGR1YWwgUE1DIGNhcnJpZXIKLQkwNzEwICBWUzE0eCBzZXJpZXMgUG93ZXJQQyBQQ0kgYm9hcmQKLQkwNzIwICBWUzI0eCBzZXJpZXMgUG93ZXJQQyBQQ0kgYm9hcmQKLSMgZm91bmQgZS5nLiBvbiBLTkMgRFZCLVMgY2FyZAotMTg5NCAgS05DIE9uZQotMTg5NiAgQiZCIEVsZWN0cm9uaWNzIE1hbnVmYWN0dXJpbmcgQ29tcGFueSwgSW5jLgotMThhMSAgQXN0dXRlIE5ldHdvcmtzIEluYy4KLTE4YWMgIERWaUNPIENvcnBvcmF0aW9uCi0JZDgxMCAgRnVzaW9uSERUViAzIEdvbGQKLTE4YjggIEFtbWFzc28KLQliMDAxICBBTVNPIDExMDAgaVdBUlAvUkRNQSBHaWdhYml0IEV0aGVybmV0IENvcHJvY2Vzc29yCi0xOGJjICBJbmZvLVRlayBDb3JwLgotIyBhc3NpZ25lZCB0byBPY3RpZ2FiYXkgU3lzdGVtLCB3aGljaCBoYXMgYmVlbiBhY3F1aXJlZCBieSBDcmF5Ci0xOGM4ICBDcmF5IEluYwotMThjOSAgQVJWT08gRW5naW5lZXJpbmcgQlYKLTE4Y2EgIFhHSSAtIFhhYnJlIEdyYXBoaWNzIEluYwotCTAwNDAgIFZvbGFyaSBWOAotMThlNiAgTVBMIEFHCi0JMDAwMSAgT1NDSSBbT2N0YWwgU2VyaWFsIENvbW11bmljYXRpb24gSW50ZXJmYWNlXQotMThmNyAgQ29tbXRlY2gsIEluYy4KLQkwMDAxICBGYXN0Y29tIEVTQ0MtUENJLTMzNQotCTAwMDIgIEZhc3Rjb20gNDIyLzQtUENJLTMzNQotCTAwMDQgIEZhc3Rjb20gNDIyLzItUENJLTMzNQotCTAwMDUgIEZhc3Rjb20gSUdFU0NDLVBDSS1JU08vMQotCTAwMGEgIEZhc3Rjb20gMjMyLzQtUENJLTMzNQotMThmYiAgUmVzaWxpZW5jZSBDb3Jwb3JhdGlvbgotMTkyNCAgTGV2ZWwgNSBOZXR3b3JrcyBJbmMuCi0xOTY2ICBPcmFkIEhpLVRlYyBTeXN0ZW1zCi0JMTk3NSAgRFZHNjQgZmFtaWx5Ci0xOTkzICBJbm5vbWluYXRlIFNlY3VyaXR5IFRlY2hub2xvZ2llcyBBRwotIyBodHRwOi8vd3d3LnByb2dlbnkubmV0Ci0xOWFlICBQcm9nZW55IFN5c3RlbXMgQ29ycG9yYXRpb24KLTFhMDggIFNpZXJyYSBzZW1pY29uZHVjdG9yCi0JMDAwMCAgU0MxNTA2NAotMWIxMyAgSmF0b24gQ29ycAotMWMxYyAgU3ltcGhvbnkKLQkwMDAxICA4MkMxMDEKLTFkNDQgIERQVAotCWE0MDAgIFBNMngyNC9QTTMyMjQKLTFkZTEgIFRla3JhbSBUZWNobm9sb2d5IENvLixMdGQuCi0JMDM5MSAgVFJNLVMxMDQwCi0JMjAyMCAgREMtMzkwCi0JNjkwYyAgNjkwYwotCWRjMjkgIERDMjkwCi0xZmMwICBUdW1zYW4gT3kKLQkwMzAwICBFMjIwMCBEdWFsIEUxL1Jhd3BpcGUgQ2FyZAotMjAwMCAgU21hcnQgTGluayBMdGQuCi0yMDAxICBUZW1wb3JhbCBSZXNlYXJjaCBMdGQKLTIwMDMgIFNtYXJ0IExpbmsgTHRkLgotMjAwNCAgU21hcnQgTGluayBMdGQuCi0yMWMzICAyMXN0IENlbnR1cnkgQ29tcHV0ZXIgQ29ycC4KLTIzNDggIFJhY29yZQotCTIwMTAgIDgxNDIgMTAwVkcvQW55TEFOCi0yNjQ2ICBLaW5nc3RvbiBUZWNobm9sb2dpZXMKLTI3MGIgIFhhbnRlbCBDb3Jwb3JhdGlvbgotMjcwZiAgQ2hhaW50ZWNoIENvbXB1dGVyIENvLiBMdGQKLTI3MTEgIEFWSUQgVGVjaG5vbG9neSBJbmMuCi0yYTE1ICAzRCBWaXNpb24oPz8/KQotMzAwMCAgSGFuc29sIEVsZWN0cm9uaWNzIEluYy4KLTMxNDIgIFBvc3QgSW1wcmVzc2lvbiBTeXN0ZW1zLgotMzM4OCAgSGludCBDb3JwCi0JMDAxMyAgSGlOVCBIQzQgUENJIHRvIElTRE4gYnJpZGdlLCBNdWx0aW1lZGlhIGF1ZGlvIGNvbnRyb2xsZXIKLQkwMDE0ICBIaU5UIEhDNCBQQ0kgdG8gSVNETiBicmlkZ2UsIE5ldHdvcmsgY29udHJvbGxlcgotCTAwMjAgIEhCNiBVbml2ZXJzYWwgUENJLVBDSSBicmlkZ2UgKHRyYW5zcGFyZW50IG1vZGUpCi0JMDAyMSAgSEI2IFVuaXZlcnNhbCBQQ0ktUENJIGJyaWRnZSAobm9uLXRyYW5zcGFyZW50IG1vZGUpCi0JCTRjNTMgMTA1MCAgQ1Q3IG1haW5ib2FyZAotCQk0YzUzIDEwODAgIENUOCBtYWluYm9hcmQKLQkJNGM1MyAxMGEwICBDQTMvQ1IzIG1haW5ib2FyZAotCQk0YzUzIDMwMTAgIFBQQ0kgbWV6emFuaW5lICgzMi1iaXQgUE1DKQotCQk0YzUzIDMwMTEgIFBQQ0kgbWV6emFuaW5lICg2NC1iaXQgUE1DKQotCTAwMjIgIEhpTlQgSEI0IFBDSS1QQ0kgQnJpZGdlIChQQ0k2MTUwKQotCTAwMjYgIEhCMiBQQ0ktUENJIEJyaWRnZQotCTEwMWEgIEUuQmFuZCBbQXVkaW9UcmFrIEluY2E4OF0KLQkxMDFiICBFLkJhbmQgW0F1ZGlvVHJhayBJbmNhODhdCi0JODAxMSAgVlhQcm8gSUkgQ2hpcHNldAotCQkzMzg4IDgwMTEgIFZYUHJvIElJIENoaXBzZXQgQ1BVIHRvIFBDSSBCcmlkZ2UKLQk4MDEyICBWWFBybyBJSSBDaGlwc2V0Ci0JCTMzODggODAxMiAgVlhQcm8gSUkgQ2hpcHNldCBQQ0kgdG8gSVNBIEJyaWRnZQotCTgwMTMgIFZYUHJvIElJIElERQotCQkzMzg4IDgwMTMgIFZYUHJvIElJIENoaXBzZXQgRUlERSBDb250cm9sbGVyCi0zNDExICBRdWFudHVtIERlc2lnbnMgKEguSy4pIEluYwotMzUxMyAgQVJDT00gQ29udHJvbCBTeXN0ZW1zIEx0ZAotMzg0MiAgZVZnYS5jb20uIENvcnAuCi0zOGVmICA0TGlua3MKLTNkM2QgIDNETGFicwotCTAwMDEgIEdMSU5UIDMwMFNYCi0JMDAwMiAgR0xJTlQgNTAwVFgKLQkwMDAzICBHTElOVCBEZWx0YQotCTAwMDQgIFBlcm1lZGlhCi0JMDAwNSAgUGVybWVkaWEKLQkwMDA2ICBHTElOVCBNWAotCTAwMDcgIDNEIEV4dHJlbWUKLQkwMDA4ICBHTElOVCBHYW1tYSBHMQotCTAwMDkgIFBlcm1lZGlhIElJIDJEKzNECi0JCTEwNDAgMDAxMSAgQWNjZWxTdGFyIElJCi0JCTEzZTkgMTAwMCAgNjIyMUwtNFUKLQkJM2QzZCAwMTAwICBBY2NlbFN0YXIgSUkgM0QgQWNjZWxlcmF0b3IKLQkJM2QzZCAwMTExICBQZXJtZWRpYSAzOjE2Ci0JCTNkM2QgMDExNCAgU2FudGEgQW5hCi0JCTNkM2QgMDExNiAgT3h5Z2VuIEdWWDEKLQkJM2QzZCAwMTE5ICBTY2lyb2NjbwotCQkzZDNkIDAxMjAgIFNhbnRhIEFuYSBQQ0wKLQkJM2QzZCAwMTI1ICBPeHlnZW4gVlgxCi0JCTNkM2QgMDEyNyAgUGVybWVkaWEzIENyZWF0ZSEKLQkwMDBhICBHTElOVCBSMwotCQkzZDNkIDAxMjEgIE94eWdlbiBWWDEKLQkwMDBjICBHTElOVCBSMyBbT3h5Z2VuIFZYMV0KLQkJM2QzZCAwMTQ0ICBPeHlnZW4gVlgxLTRYIEFHUCBbUGVybWVkaWEgNF0KLQkwMDBkICBHTGludCBSNCByZXYgQQotCTAwMTEgIEdMaW50IFI0IHJldiBCCi0JMDAxMiAgR0xpbnQgUjUgcmV2IEEKLQkwMDEzICBHTGludCBSNSByZXYgQgotCTAwMjAgIFZQMTAgdmlzdWFsIHByb2Nlc3NvcgotIyBQMTAgZ2VuZXJpYyBJSQotCTAwMjIgIFZQMTAgdmlzdWFsIHByb2Nlc3NvcgotCTAwMjQgIFZQOSB2aXN1YWwgcHJvY2Vzc29yCi0JMDEwMCAgUGVybWVkaWEgSUkgMkQrM0QKLQkwN2ExICBXaWxkY2F0IElJSSA2MjEwCi0JMDdhMiAgU3VuIFhWUi01MDAgR3JhcGhpY3MgQWNjZWxlcmF0b3IKLQkwN2EzICBXaWxkY2F0IElWIDcyMTAKLQkxMDA0ICBQZXJtZWRpYQotCTNkMDQgIFBlcm1lZGlhCi0JZmZmZiAgR2xpbnQgVkdBCi00MDA1ICBBdmFuY2UgTG9naWMgSW5jLgotCTAzMDAgIEFMUzMwMCBQQ0kgQXVkaW8gRGV2aWNlCi0JMDMwOCAgQUxTMzAwKyBQQ0kgQXVkaW8gRGV2aWNlCi0JMDMwOSAgUENJIElucHV0IENvbnRyb2xsZXIKLQkxMDY0ICBBTEctMjA2NAotCTIwNjQgIEFMRy0yMDY0aQotCTIxMjggIEFMRy0yMzY0QSBHVUkgQWNjZWxlcmF0b3IKLQkyMzAxICBBTEctMjMwMQotCTIzMDIgIEFMRy0yMzAyCi0JMjMwMyAgQVZHLTIzMDIgR1VJIEFjY2VsZXJhdG9yCi0JMjM2NCAgQUxHLTIzNjRBCi0JMjQ2NCAgQUxHLTI0NjQKLQkyNTAxICBBTEctMjU2NEEvMjUxMjhBCi0JNDAwMCAgQUxTNDAwMCBBdWRpbyBDaGlwc2V0Ci0JCTQwMDUgNDAwMCAgQUxTNDAwMCBBdWRpbyBDaGlwc2V0Ci0JNDcxMCAgQUxDMjAwLzIwMFAKLTQwMzMgIEFkZHRyb24gVGVjaG5vbG9neSBDbywgSW5jLgotCTEzNjAgIFJUTDgxMzkgRXRoZXJuZXQKLTQxNDMgIERpZ2l0YWwgRXF1aXBtZW50IENvcnAKLTQxNDQgIEFscGhhIERhdGEKLQkwMDQ0ICBBRE0tWFJDSUlQcm8KLTQxNmMgIEFsYWRkaW4gS25vd2xlZGdlIFN5c3RlbXMKLQkwMTAwICBBbGFkZGluQ0FSRAotCTAyMDAgIENQQwotNDQ0NCAgSW50ZXJuZXh0IENvbXByZXNzaW9uIEluYwotCTAwMTYgIGlUVkMxNiAoQ1gyMzQxNikgTVBFRy0yIEVuY29kZXIKLQkJMDA3MCA0MDA5ICBXaW5UViBQVlIgMjUwCi0JCTAwNzAgODAwMyAgV2luVFYgUFZSIDE1MAotCTA4MDMgIGlUVkMxNSBNUEVHLTIgRW5jb2RlcgotCQkwMDcwIDQwMDAgIFdpblRWIFBWUi0zNTAKLQkJMDA3MCA0MDAxICBXaW5UViBQVlItMjUwCi0jIHZpZGVvIGNhcHR1cmUgY2FyZAotCQkxNDYxIGEzY2YgIE0xNzkKLTQ0NjggIEJyaWRnZXBvcnQgbWFjaGluZXMKLTQ1OTQgIENvZ2V0ZWMgSW5mb3JtYXRpcXVlIEluYwotNDVmYiAgQmFsZG9yIEVsZWN0cmljIENvbXBhbnkKLTQ2ODAgIFVtYXggQ29tcHV0ZXIgQ29ycAotNDg0MyAgSGVyY3VsZXMgQ29tcHV0ZXIgVGVjaG5vbG9neSBJbmMKLTQ5MTYgIFJlZENyZWVrIENvbW11bmljYXRpb25zIEluYwotCTE5NjAgIFJlZENyZWVrIFBDSSBhZGFwdGVyCi00OTQzICBHcm93dGggTmV0d29ya3MKLTQ5NGYgIEFDQ0VTIEkvTyBQcm9kdWN0cywgSW5jLgotCTEwZTggIExQQ0ktQ09NLThTTQotNDk3OCAgQXhpbCBDb21wdXRlciBJbmMKLTRhMTQgIE5ldFZpbgotCTUwMDAgIE5WNTAwMFNDCi0JCTRhMTQgNTAwMCAgUlQ4MDI5LUJhc2VkIEV0aGVybmV0IEFkYXB0ZXIKLTRiMTAgIEJ1c2xvZ2ljIEluYy4KLTRjNDggIExVTkcgSFdBIEVsZWN0cm9uaWNzCi00YzUzICBTQlMgVGVjaG5vbG9naWVzCi0JMDAwMCAgUExVU1RFU1QgZGV2aWNlCi0JCTRjNTMgMzAwMCAgUExVU1RFU1QgY2FyZCAoUEMxMDQrKQotCQk0YzUzIDMwMDEgIFBMVVNURVNUIGNhcmQgKFBNQykKLQkwMDAxICBQTFVTVEVTVC1NTSBkZXZpY2UKLQkJNGM1MyAzMDAyICBQTFVTVEVTVC1NTSBjYXJkIChQTUMpCi00Y2ExICBTZWFuaXggVGVjaG5vbG9neSBJbmMKLTRkNTEgIE1lZGlhUSBJbmMuCi0JMDIwMCAgTVEtMjAwCi00ZDU0ICBNaWNyb3RlY2huaWNhIENvIEx0ZAotNGRkYyAgSUxDIERhdGEgRGV2aWNlIENvcnAKLQkwMTAwICBERC00MjkyNEk1LTMwMCAoQVJJTkMgNDI5IERhdGEgQnVzKQotCTA4MDEgIEJVLTY1NTcwSTEgTUlMLVNURC0xNTUzIFRlc3QgYW5kIFNpbXVsYXRpb24KLQkwODAyICBCVS02NTU3MEkyIE1JTC1TVEQtMTU1MyBUZXN0IGFuZCBTaW11bGF0aW9uCi0JMDgxMSAgQlUtNjU1NzJJMSBNSUwtU1RELTE1NTMgVGVzdCBhbmQgU2ltdWxhdGlvbgotCTA4MTIgIEJVLTY1NTcySTIgTUlMLVNURC0xNTUzIFRlc3QgYW5kIFNpbXVsYXRpb24KLQkwODgxICBCVS02NTU3MFQxIE1JTC1TVEQtMTU1MyBUZXN0IGFuZCBTaW11bGF0aW9uCi0JMDg4MiAgQlUtNjU1NzBUMiBNSUwtU1RELTE1NTMgVGVzdCBhbmQgU2ltdWxhdGlvbgotCTA4OTEgIEJVLTY1NTcyVDEgTUlMLVNURC0xNTUzIFRlc3QgYW5kIFNpbXVsYXRpb24KLQkwODkyICBCVS02NTU3MlQyIE1JTC1TVEQtMTU1MyBUZXN0IGFuZCBTaW11bGF0aW9uCi0JMDkwMSAgQlUtNjU1NjVDMSBNSUwtU1RELTE1NTMgRGF0YSBCdXMKLQkwOTAyICBCVS02NTU2NUMyIE1JTC1TVEQtMTU1MyBEYXRhIEJ1cwotCTA5MDMgIEJVLTY1NTY1QzMgTUlMLVNURC0xNTUzIERhdGEgQnVzCi0JMDkwNCAgQlUtNjU1NjVDNCBNSUwtU1RELTE1NTMgRGF0YSBCdXMKLQkwYjAxICBCVS02NTU2OUkxIE1JTC1TVEQtMTU1MyBEYXRhIEJ1cwotCTBiMDIgIEJVLTY1NTY5STIgTUlMLVNURC0xNTUzIERhdGEgQnVzCi0JMGIwMyAgQlUtNjU1NjlJMyBNSUwtU1RELTE1NTMgRGF0YSBCdXMKLQkwYjA0ICBCVS02NTU2OUk0IE1JTC1TVEQtMTU1MyBEYXRhIEJ1cwotNTA0NiAgR2VtVGVrIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KLQkxMDAxICBQQ0kgUmFkaW8KLTUwNTMgIFZveWV0cmEgVGVjaG5vbG9naWVzCi0JMjAxMCAgRGF5dG9uYSBBdWRpbyBBZGFwdGVyCi01MTM2ICBTIFMgVGVjaG5vbG9naWVzCi01MTQzICBRdWFsY29tbSBJbmMKLTUxNDUgIEVuc29uaXEgKE9sZCkKLQkzMDMxICBDb25jZXJ0IEF1ZGlvUENJCi01MTY4ICBBbmltYXRpb24gVGVjaG5vbG9naWVzIEluYy4KLTUzMDEgIEFsbGlhbmNlIFNlbWljb25kdWN0b3IgQ29ycC4KLQkwMDAxICBQcm9Nb3Rpb24gYVQzRAotNTMzMyAgUzMgSW5jLgotCTA1NTEgIFBsYXRvL1BYIChzeXN0ZW0pCi0JNTYzMSAgODZjMzI1IFtWaVJHRV0KLQk4ODAwICA4NmM4NjYgW1Zpc2lvbiA4NjZdCi0JODgwMSAgODZjOTY0IFtWaXNpb24gOTY0XQotCTg4MTAgIDg2Yzc2NF8wIFtUcmlvIDMyIHZlcnMgMF0KLQk4ODExICA4NmM3NjQvNzY1IFtUcmlvMzIvNjQvNjRWK10KLQk4ODEyICA4NmNNNjUgW0F1cm9yYTY0VitdCi0JODgxMyAgODZjNzY0XzMgW1RyaW8gMzIvNjQgdmVycyAzXQotCTg4MTQgIDg2Yzc2NyBbVHJpbyA2NFVWK10KLQk4ODE1ICA4NmNNNjUgW0F1cm9yYSAxMjhdCi0JODgzZCAgODZjOTg4IFtWaVJHRS9WWF0KLQk4ODcwICBGaXJlR0wKLQk4ODgwICA4NmM4NjggW1Zpc2lvbiA4NjggVlJBTV0gdmVycyAwCi0JODg4MSAgODZjODY4IFtWaXNpb24gODY4IFZSQU1dIHZlcnMgMQotCTg4ODIgIDg2Yzg2OCBbVmlzaW9uIDg2OCBWUkFNXSB2ZXJzIDIKLQk4ODgzICA4NmM4NjggW1Zpc2lvbiA4NjggVlJBTV0gdmVycyAzCi0JODhiMCAgODZjOTI4IFtWaXNpb24gOTI4IFZSQU1dIHZlcnMgMAotCTg4YjEgIDg2YzkyOCBbVmlzaW9uIDkyOCBWUkFNXSB2ZXJzIDEKLQk4OGIyICA4NmM5MjggW1Zpc2lvbiA5MjggVlJBTV0gdmVycyAyCi0JODhiMyAgODZjOTI4IFtWaXNpb24gOTI4IFZSQU1dIHZlcnMgMwotCTg4YzAgIDg2Yzg2NCBbVmlzaW9uIDg2NCBEUkFNXSB2ZXJzIDAKLQk4OGMxICA4NmM4NjQgW1Zpc2lvbiA4NjQgRFJBTV0gdmVycyAxCi0JODhjMiAgODZjODY0IFtWaXNpb24gODY0LVAgRFJBTV0gdmVycyAyCi0JODhjMyAgODZjODY0IFtWaXNpb24gODY0LVAgRFJBTV0gdmVycyAzCi0JODhkMCAgODZjOTY0IFtWaXNpb24gOTY0IFZSQU1dIHZlcnMgMAotCTg4ZDEgIDg2Yzk2NCBbVmlzaW9uIDk2NCBWUkFNXSB2ZXJzIDEKLQk4OGQyICA4NmM5NjQgW1Zpc2lvbiA5NjQtUCBWUkFNXSB2ZXJzIDIKLQk4OGQzICA4NmM5NjQgW1Zpc2lvbiA5NjQtUCBWUkFNXSB2ZXJzIDMKLQk4OGYwICA4NmM5NjggW1Zpc2lvbiA5NjggVlJBTV0gcmV2IDAKLQk4OGYxICA4NmM5NjggW1Zpc2lvbiA5NjggVlJBTV0gcmV2IDEKLQk4OGYyICA4NmM5NjggW1Zpc2lvbiA5NjggVlJBTV0gcmV2IDIKLQk4OGYzICA4NmM5NjggW1Zpc2lvbiA5NjggVlJBTV0gcmV2IDMKLQk4OTAwICA4NmM3NTUgW1RyaW8gNjRWMi9EWF0KLQkJNTMzMyA4OTAwICA4NkM3NzUgVHJpbzY0VjIvRFgKLQk4OTAxICA4NmM3NzUvODZjNzg1IFtUcmlvIDY0VjIvRFggb3IgL0dYXQotCQk1MzMzIDg5MDEgIDg2Qzc3NSBUcmlvNjRWMi9EWCwgODZDNzg1IFRyaW82NFYyL0dYCi0JODkwMiAgUGxhdG8vUFgKLQk4OTAzICBUcmlvIDNEIGJ1c2luZXNzIG11bHRpbWVkaWEKLQk4OTA0ICBUcmlvIDY0IDNECi0JCTEwMTQgMDBkYiAgSW50ZWdyYXRlZCBUcmlvM0QKLQkJNTMzMyA4OTA0ICA4NkMzNjUgVHJpbzNEIEFHUAotCTg5MDUgIFRyaW8gNjRWKyBmYW1pbHkKLQk4OTA2ICBUcmlvIDY0VisgZmFtaWx5Ci0JODkwNyAgVHJpbyA2NFYrIGZhbWlseQotCTg5MDggIFRyaW8gNjRWKyBmYW1pbHkKLQk4OTA5ICBUcmlvIDY0VisgZmFtaWx5Ci0JODkwYSAgVHJpbyA2NFYrIGZhbWlseQotCTg5MGIgIFRyaW8gNjRWKyBmYW1pbHkKLQk4OTBjICBUcmlvIDY0VisgZmFtaWx5Ci0JODkwZCAgVHJpbyA2NFYrIGZhbWlseQotCTg5MGUgIFRyaW8gNjRWKyBmYW1pbHkKLQk4OTBmICBUcmlvIDY0VisgZmFtaWx5Ci0JOGEwMSAgVmlSR0UvRFggb3IgL0dYCi0JCTBlMTEgYjAzMiAgVmlSR0UvR1gKLQkJMTBiNCAxNjE3ICBOaXRybyAzRAotCQkxMGI0IDE3MTcgIE5pdHJvIDNECi0JCTUzMzMgOGEwMSAgVmlSR0UvRFgKLQk4YTEwICBWaVJHRS9HWDIKLQkJMTA5MiA4YTEwICBTdGVhbHRoIDNEIDQwMDAKLQk4YTEzICA4NmMzNjggW1RyaW8gM0QvMlhdCi0JCTUzMzMgOGExMyAgVHJpbzNELzJYCi0JOGEyMCAgODZjNzk0IFtTYXZhZ2UgM0RdCi0JCTUzMzMgOGEyMCAgODZDMzkxIFNhdmFnZTNECi0JOGEyMSAgODZjMzkwIFtTYXZhZ2UgM0QvTVZdCi0JCTUzMzMgOGEyMSAgODZDMzkwIFNhdmFnZTNEL01WCi0JOGEyMiAgU2F2YWdlIDQKLQkJMTAzMyA4MDY4ICBTYXZhZ2UgNAotCQkxMDMzIDgwNjkgIFNhdmFnZSA0Ci0JCTEwMzMgODExMCAgU2F2YWdlNCBMVAotCQkxMDVkIDAwMTggIFNSOSA4TWIgU0RSQU0KLQkJMTA1ZCAwMDJhICBTUjkgUHJvIDE2TWIgU0RSQU0KLQkJMTA1ZCAwMDNhICBTUjkgUHJvIDMyTWIgU0RSQU0KLQkJMTA1ZCAwOTJmICBTUjkgUHJvKyAxNk1iIFNHUkFNCi0JCTEwOTIgNDIwNyAgU3RlYWx0aCBJSUkgUzU0MAotCQkxMDkyIDQ4MDAgIFN0ZWFsdGggSUlJIFM1NDAKLQkJMTA5MiA0ODA3ICBTcGVlZFN0YXIgQTkwCi0JCTEwOTIgNDgwOCAgU3RlYWx0aCBJSUkgUzU0MAotCQkxMDkyIDQ4MDkgIFN0ZWFsdGggSUlJIFM1NDAKLQkJMTA5MiA0ODBlICBTdGVhbHRoIElJSSBTNTQwCi0JCTEwOTIgNDkwNCAgU3RlYWx0aCBJSUkgUzUyMAotCQkxMDkyIDQ5MDUgIFNwZWVkU3RhciBBMjAwCi0JCTEwOTIgNGEwOSAgU3RlYWx0aCBJSUkgUzU0MAotCQkxMDkyIDRhMGIgIFN0ZWFsdGggSUlJIFM1NDAgWHRyZW1lCi0JCTEwOTIgNGEwZiAgU3RlYWx0aCBJSUkgUzU0MAotCQkxMDkyIDRlMDEgIFN0ZWFsdGggSUlJIFM1NDAKLQkJMTEwMiAxMDFkICAzZCBCbGFzdGVyIFNhdmFnZSA0Ci0JCTExMDIgMTAxZSAgM2QgQmxhc3RlciBTYXZhZ2UgNAotCQk1MzMzIDgxMDAgIDg2QzM5NC0zOTcgU2F2YWdlNCBTRFJBTSAxMDAKLQkJNTMzMyA4MTEwICA4NkMzOTQtMzk3IFNhdmFnZTQgU0RSQU0gMTEwCi0JCTUzMzMgODEyNSAgODZDMzk0LTM5NyBTYXZhZ2U0IFNEUkFNIDEyNQotCQk1MzMzIDgxNDMgIDg2QzM5NC0zOTcgU2F2YWdlNCBTRFJBTSAxNDMKLQkJNTMzMyA4YTIyICA4NkMzOTQtMzk3IFNhdmFnZTQKLQkJNTMzMyA4YTJlICA4NkMzOTQtMzk3IFNhdmFnZTQgMzJiaXQKLQkJNTMzMyA5MTI1ICA4NkMzOTQtMzk3IFNhdmFnZTQgU0dSQU0gMTI1Ci0JCTUzMzMgOTE0MyAgODZDMzk0LTM5NyBTYXZhZ2U0IFNHUkFNIDE0MwotCThhMjMgIFNhdmFnZSA0Ci0JOGEyNSAgUHJvU2F2YWdlIFBNMTMzCi0JOGEyNiAgUHJvU2F2YWdlIEtNMTMzCi0JOGMwMCAgVmlSR0UvTTMKLQk4YzAxICBWaVJHRS9NWAotCQkxMTc5IDAwMDEgIFZpUkdFL01YCi0JOGMwMiAgVmlSR0UvTVgrCi0JOGMwMyAgVmlSR0UvTVgrTVYKLQk4YzEwICA4NkMyNzAtMjk0IFNhdmFnZS9NWC1NVgotCThjMTEgIDgyQzI3MC0yOTQgU2F2YWdlL01YCi0JOGMxMiAgODZDMjcwLTI5NCBTYXZhZ2UvSVgtTVYKLQkJMTAxNCAwMTdmICBUaGlua1BhZCBUMjAKLQkJMTE3OSAwMDAxICA4NkM1ODQgU3VwZXJTYXZhZ2UvSVhDIFRvc2hpYmEKLQk4YzEzICA4NkMyNzAtMjk0IFNhdmFnZS9JWAotCQkxMTc5IDAwMDEgIE1hZ25pYSBaMzEwCi0JOGMyMiAgU3VwZXJTYXZhZ2UgTVgvMTI4Ci0JOGMyNCAgU3VwZXJTYXZhZ2UgTVgvNjQKLQk4YzI2ICBTdXBlclNhdmFnZSBNWC82NEMKLQk4YzJhICBTdXBlclNhdmFnZSBJWC8xMjggU0RSCi0JOGMyYiAgU3VwZXJTYXZhZ2UgSVgvMTI4IEREUgotCThjMmMgIFN1cGVyU2F2YWdlIElYLzY0IFNEUgotCThjMmQgIFN1cGVyU2F2YWdlIElYLzY0IEREUgotCThjMmUgIFN1cGVyU2F2YWdlIElYL0MgU0RSCi0JCTEwMTQgMDFmYyAgVGhpbmtQYWQgVDIzICgyNjQ3LTRNRykKLQk4YzJmICBTdXBlclNhdmFnZSBJWC9DIEREUgotCThkMDEgIDg2QzM4MCBbUHJvU2F2YWdlRERSIEs0TTI2Nl0KLQk4ZDAyICBWVDg2MzZBIFtQcm9TYXZhZ2UgS04xMzNdIEFHUDRYIFZHQSBDb250cm9sbGVyIChUd2lzdGVySykKLQk4ZDAzICBWVDg3NTEgW1Byb1NhdmFnZUREUiBQNE0yNjZdCi0JOGQwNCAgVlQ4Mzc1IFtQcm9TYXZhZ2U4IEtNMjY2L0tMMjY2XQotCTkxMDIgIDg2QzQxMCBTYXZhZ2UgMjAwMAotCQkxMDkyIDU5MzIgIFZpcGVyIElJIFoyMDAKLQkJMTA5MiA1OTM0ICBWaXBlciBJSSBaMjAwCi0JCTEwOTIgNTk1MiAgVmlwZXIgSUkgWjIwMAotCQkxMDkyIDU5NTQgIFZpcGVyIElJIFoyMDAKLQkJMTA5MiA1YTM1ICBWaXBlciBJSSBaMjAwCi0JCTEwOTIgNWEzNyAgVmlwZXIgSUkgWjIwMAotCQkxMDkyIDVhNTUgIFZpcGVyIElJIFoyMDAKLQkJMTA5MiA1YTU3ICBWaXBlciBJSSBaMjAwCi0JY2EwMCAgU29uaWNWaWJlcwotNTQ0YyAgVGVyYWxvZ2ljIEluYwotCTAzNTAgIFRMODgwLWJhc2VkIEhEVFYvQVRTQyB0dW5lcgotNTQ1NSAgVGVjaG5pc2NoZSBVbml2ZXJzaXR5IEJlcmxpbgotCTQ0NTggIFM1OTMzCi01NTE5ICBDbmV0IFRlY2hub2xvZ2llcywgSW5jLgotNTU0NCAgRHVub3JkIFRlY2hub2xvZ2llcwotCTAwMDEgIEktMzB4eCBTY2FubmVyIEludGVyZmFjZQotNTU1NSAgR2Vucm9jbywgSW5jCi0JMDAwMyAgVFVSQk9zdG9yIEhGUC04MzIgW0hpUFBJIE5JQ10KLTU2NTQgIFZvaWNlVHJvbml4IFB0eSBMdGQKLQkzMTMyICBPcGVuU3dpdGNoMTIKLTU3MDAgIE5ldHBvd2VyCi01ODUxICBFeGFjcSBUZWNobm9sb2dpZXMKLTYzNTYgIFVsdHJhU3RvcgotNjM3NCAgYyd0IE1hZ2F6aW4gZvxyIENvbXB1dGVydGVjaG5pawotCTY3NzMgIEdQUENJCi02NDA5ICBMb2dpdGVjIENvcnAuCi02NjY2ICBEZWNpc2lvbiBDb21wdXRlciBJbnRlcm5hdGlvbmFsIENvLgotCTAwMDEgIFBDQ09NNAotCTAwMDIgIFBDQ09NOAotNzYwNCAgTy5OLiBFbGVjdHJvbmljIENvIEx0ZC4KLTdiZGUgIE1JREFDIENvcnBvcmF0aW9uCi03ZmVkICBQb3dlclRWCi04MDA4ICBRdWFuY29tIEVsZWN0cm9uaWMgR21iSAotCTAwMTAgIFdET0cxIFtQQ0ktV2F0Y2hkb2cgMV0KLQkwMDExICBQV0RPRzIgW1BDSS1XYXRjaGRvZyAyXQotIyBXcm9uZyBJRCB1c2VkIGluIHN1YnN5c3RlbSBJRCBvZiBBc3VzVGVrIFBDSS1VU0IyIFBDSSBjYXJkLgotODA3ZCAgQXN1c3RlayBDb21wdXRlciwgSW5jLgotODA4NiAgSW50ZWwgQ29ycG9yYXRpb24KLQkwMDA3ICA4MjM3OUFCCi0JMDAwOCAgRXh0ZW5kZWQgRXhwcmVzcyBTeXN0ZW0gU3VwcG9ydCBDb250cm9sbGVyCi0JCTAwMDggMTAwMCAgV29ybGRNYXJrIDQzMDAgSU5DQSBBU0lDCi0JMDAzOSAgMjExNDUgRmFzdCBFdGhlcm5ldAotCTAxMjIgIDgyNDM3RlgKLQkwMzA5ICA4MDMwMyBJL08gUHJvY2Vzc29yIFBDSS10by1QQ0kgQnJpZGdlCi0JMDMwZCAgODAzMTIgSS9PIENvbXBhbmlvbiBDaGlwIFBDSS10by1QQ0kgQnJpZGdlCi0JMDMyNiAgNjcwMC82NzAyUFhIIEkvT3hBUElDIEludGVycnVwdCBDb250cm9sbGVyIEEKLQkwMzI3ICA2NzAwUFhIIEkvT3hBUElDIEludGVycnVwdCBDb250cm9sbGVyIEIKLQkwMzI5ICA2NzAwUFhIIFBDSSBFeHByZXNzLXRvLVBDSSBCcmlkZ2UgQQotCTAzMmEgIDY3MDBQWEggUENJIEV4cHJlc3MtdG8tUENJIEJyaWRnZSBCCi0JMDMyYyAgNjcwMlBYSCBQQ0kgRXhwcmVzcy10by1QQ0kgQnJpZGdlIEEKLSMgQS1zZWdtZW50IGJyaWRnZQotCTAzMzAgIDgwMzMyIFtEb2Jzb25dIEkvTyBwcm9jZXNzb3IKLSMgQS1zZWdtZW50IElPQVBJQwotCTAzMzEgIDgwMzMyIFtEb2Jzb25dIEkvTyBwcm9jZXNzb3IKLSMgQi1zZWdtZW50IGJyaWRnZQotCTAzMzIgIDgwMzMyIFtEb2Jzb25dIEkvTyBwcm9jZXNzb3IKLSMgQi1zZWdtZW50IElPQVBJQwotCTAzMzMgIDgwMzMyIFtEb2Jzb25dIEkvTyBwcm9jZXNzb3IKLSMgQWRkcmVzcyBUcmFuc2xhdGlvbiBVbml0IChBVFUpCi0JMDMzNCAgODAzMzIgW0RvYnNvbl0gSS9PIHByb2Nlc3NvcgotIyBQQ0ktWCBicmlkZ2UKLQkwMzM1ICA4MDMzMSBbTGluZHNheV0gSS9PIHByb2Nlc3NvcgotIyBBZGRyZXNzIFRyYW5zbGF0aW9uIFVuaXQgKEFUVSkKLQkwMzM2ICA4MDMzMSBbTGluZHNheV0gSS9PIHByb2Nlc3NvcgotIyBBLXNlZ21lbnQgYnJpZGdlCi0JMDM0MCAgNDEyMTAgW0xhbmFpXSBTZXJpYWwgdG8gUGFyYWxsZWwgUENJIEJyaWRnZQotIyBCLXNlZ21lbnQgYnJpZGdlCi0JMDM0MSAgNDEyMTAgW0xhbmFpXSBTZXJpYWwgdG8gUGFyYWxsZWwgUENJIEJyaWRnZQotCTA0ODIgIDgyMzc1RUIvU0IgUENJIHRvIEVJU0EgQnJpZGdlCi0JMDQ4MyAgODI0MjRUWC9aWCBbU2F0dXJuXSBDUFUgdG8gUENJIGJyaWRnZQotCTA0ODQgIDgyMzc4WkIvSUIsIDgyMzc5QUIgKFNJTywgU0lPLkEpIFBDSSB0byBJU0EgQnJpZGdlCi0JMDQ4NiAgODI0MjVFWC9aWCBbQXJpZXNdIFBDSXNldCB3aXRoIElTQSBicmlkZ2UKLQkwNGEzICA4MjQzNExYL05YIFtNZXJjdXJ5L05lcHR1bmVdIFByb2Nlc3NvciB0byBQQ0kgYnJpZGdlCi0JMDRkMCAgODI0MzdGWCBbVHJpdG9uIEZYXQotCTA1MDAgIEU4ODcwIFByb2Nlc3NvciBidXMgY29udHJvbAotCTA1MDEgIEU4ODcwIE1lbW9yeSBjb250cm9sbGVyCi0jIGFuZCByZWdpc3RlcnMgY29tbW9uIHRvIGJvdGggU1BzCi0JMDUwMiAgRTg4NzAgU2NhbGFiaWxpdHkgUG9ydCAwCi0jIGFuZCBnbG9iYWwgcGVyZm9ybWFuY2UgbW9uaXRvcmluZwotCTA1MDMgIEU4ODcwIFNjYWxhYmlsaXR5IFBvcnQgMQotCTA1MTAgIEU4ODcwSU8gSHViIEludGVyZmFjZSBQb3J0IDAgcmVnaXN0ZXJzICg4LWJpdCBjb21wYXRpYmlsaXR5IHBvcnQpCi0JMDUxMSAgRTg4NzBJTyBIdWIgSW50ZXJmYWNlIFBvcnQgMSByZWdpc3RlcnMKLQkwNTEyICBFODg3MElPIEh1YiBJbnRlcmZhY2UgUG9ydCAyIHJlZ2lzdGVycwotCTA1MTMgIEU4ODcwSU8gSHViIEludGVyZmFjZSBQb3J0IDMgcmVnaXN0ZXJzCi0JMDUxNCAgRTg4NzBJTyBIdWIgSW50ZXJmYWNlIFBvcnQgNCByZWdpc3RlcnMKLQkwNTE1ICBFODg3MElPIEdlbmVyYWwgU0lPSCByZWdpc3RlcnMKLQkwNTE2ICBFODg3MElPIFJBUyByZWdpc3RlcnMKLQkwNTMwICBFODg3MFNQIFNjYWxhYmlsaXR5IFBvcnQgMCByZWdpc3RlcnMKLQkwNTMxICBFODg3MFNQIFNjYWxhYmlsaXR5IFBvcnQgMSByZWdpc3RlcnMKLQkwNTMyICBFODg3MFNQIFNjYWxhYmlsaXR5IFBvcnQgMiByZWdpc3RlcnMKLQkwNTMzICBFODg3MFNQIFNjYWxhYmlsaXR5IFBvcnQgMyByZWdpc3RlcnMKLQkwNTM0ICBFODg3MFNQIFNjYWxhYmlsaXR5IFBvcnQgNCByZWdpc3RlcnMKLQkwNTM1ICBFODg3MFNQIFNjYWxhYmlsaXR5IFBvcnQgNSByZWdpc3RlcnMKLSMgKGJpLWludGVybGVhdmUgMCkgYW5kIGdsb2JhbCByZWdpc3RlcnMgdGhhdCBhcmUgbmVpdGhlciBwZXItcG9ydCBub3IgcGVyLWludGVybGVhdmUKLQkwNTM2ICBFODg3MFNQIEludGVybGVhdmUgcmVnaXN0ZXJzIDAgYW5kIDEKLSMgKGJpLWludGVybGVhdmUgMSkKLQkwNTM3ICBFODg3MFNQIEludGVybGVhdmUgcmVnaXN0ZXJzIDIgYW5kIDMKLQkwNjAwICBSQUlEIENvbnRyb2xsZXIKLQkJODA4NiAwMWMxICBJQ1AgVm9ydGV4IEdEVDg1NDZSWgotCQk4MDg2IDAxZjcgIFNDUlUzMgotIyB1bmluaXRpYWxpemVkIFNSQ1UzMiBSQUlEIENvbnRyb2xsZXIKLQkwNjFmICA4MDMwMyBJL08gUHJvY2Vzc29yCi0JMDk2MCAgODA5NjBSUCBbaTk2MCBSUCBNaWNyb3Byb2Nlc3Nvci9CcmlkZ2VdCi0JMDk2MiAgODA5NjBSTSBbaTk2MFJNIEJyaWRnZV0KLQkwOTY0ICA4MDk2MFJQIFtpOTYwIFJQIE1pY3JvcHJvY2Vzc29yL0JyaWRnZV0KLQkxMDAwICA4MjU0MiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMGUxMSBiMGRmICBOQzE2MzIgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyICgxMDAwLVNYKQotCQkwZTExIGIwZTAgIE5DMTYzMyBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIgKDEwMDAtTFgpCi0JCTBlMTEgYjEyMyAgTkMxNjM0IEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlciAoMTAwMC1TWCkKLQkJMTAxNCAwMTE5ICBOZXRmaW5pdHkgR2lnYWJpdCBFdGhlcm5ldCBTWCBBZGFwdGVyCi0JCTgwODYgMTAwMCAgUFJPLzEwMDAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlcgotCTEwMDEgIDgyNTQzR0MgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChGaWJlcikKLQkJMGUxMSAwMDRhICBOQzYxMzYgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlcgotCQkxMDE0IDAxZWEgIE5ldGZpbml0eSBHaWdhYml0IEV0aGVybmV0IFNYIEFkYXB0ZXIKLQkJODA4NiAxMDAyICBQUk8vMTAwMCBGIFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMTAwMyAgUFJPLzEwMDAgRiBTZXJ2ZXIgQWRhcHRlcgotCTEwMDIgIFBybyAxMDAgTEFOK01vZGVtIDU2IENhcmRidXMgSUkKLQkJODA4NiAyMDBlICBQcm8gMTAwIExBTitNb2RlbSA1NiBDYXJkYnVzIElJCi0JCTgwODYgMjAxMyAgUHJvIDEwMCBTUiBNb2JpbGUgQ29tYm8gQWRhcHRlcgotCQk4MDg2IDIwMTcgIFBybyAxMDAgUyBDb21ibyBNb2JpbGUgQWRhcHRlcgotCTEwMDQgIDgyNTQzR0MgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb3BwZXIpCi0JCTBlMTEgMDA0OSAgTkM3MTMyIEdpZ2FiaXQgVXBncmFkZSBNb2R1bGUKLQkJMGUxMSBiMWE0ICBOQzcxMzEgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlcgotCQkxMDE0IDEwZjIgIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMDA0ICBQUk8vMTAwMCBUIFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMjAwNCAgUFJPLzEwMDAgVCBTZXJ2ZXIgQWRhcHRlcgotCTEwMDggIDgyNTQ0RUkgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb3BwZXIpCi0JCTEwMTQgMDI2OSAgaVNlcmllcyAxMDAwLzEwMC8xMCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEwMjggMDExYyAgUFJPLzEwMDAgWFQgTmV0d29yayBDb25uZWN0aW9uCi0JCTgwODYgMTEwNyAgUFJPLzEwMDAgWFQgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAyMTA3ICBQUk8vMTAwMCBYVCBTZXJ2ZXIgQWRhcHRlcgotCQk4MDg2IDIxMTAgIFBSTy8xMDAwIFhUIFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMzEwOCAgUFJPLzEwMDAgWFQgTmV0d29yayBDb25uZWN0aW9uCi0JMTAwOSAgODI1NDRFSSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEZpYmVyKQotCQkxMDE0IDAyNjggIGlTZXJpZXMgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTgwODYgMTEwOSAgUFJPLzEwMDAgWEYgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAyMTA5ICBQUk8vMTAwMCBYRiBTZXJ2ZXIgQWRhcHRlcgotCTEwMGMgIDgyNTQ0R0MgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb3BwZXIpCi0JCTgwODYgMTExMiAgUFJPLzEwMDAgVCBEZXNrdG9wIEFkYXB0ZXIKLQkJODA4NiAyMTEyICBQUk8vMTAwMCBUIERlc2t0b3AgQWRhcHRlcgotCTEwMGQgIDgyNTQ0R0MgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMT00pCi0JCTEwMjggMDEyMyAgUFJPLzEwMDAgWFQgTmV0d29yayBDb25uZWN0aW9uCi0JCTEwNzkgODkxZiAgODI1NDRHQyBCYXNlZCBOZXR3b3JrIENvbm5lY3Rpb24KLQkJNGM1MyAxMDgwICBDVDggbWFpbmJvYXJkCi0JCTgwODYgMTEwZCAgODI1NDRHQyBCYXNlZCBOZXR3b3JrIENvbm5lY3Rpb24KLQkxMDBlICA4MjU0MEVNIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQkxMDE0IDAyNjUgIFBSTy8xMDAwIE1UIE5ldHdvcmsgQ29ubmVjdGlvbgotCQkxMDE0IDAyNjcgIFBSTy8xMDAwIE1UIE5ldHdvcmsgQ29ubmVjdGlvbgotCQkxMDE0IDAyNmEgIFBSTy8xMDAwIE1UIE5ldHdvcmsgQ29ubmVjdGlvbgotCQkxMDI4IDAwMmUgIE9wdGlwbGV4IEdYMjYwCi0JCTEwMjggMDE1MSAgUFJPLzEwMDAgTVQgTmV0d29yayBDb25uZWN0aW9uCi0JCTEwN2IgODkyMCAgUFJPLzEwMDAgTVQgRGVza3RvcCBBZGFwdGVyCi0JCTgwODYgMDAxZSAgUFJPLzEwMDAgTVQgRGVza3RvcCBBZGFwdGVyCi0JCTgwODYgMDAyZSAgUFJPLzEwMDAgTVQgRGVza3RvcCBBZGFwdGVyCi0JMTAwZiAgODI1NDVFTSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKENvcHBlcikKLQkJMTAxNCAwMjY5ICBpU2VyaWVzIDEwMDAvMTAwLzEwIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTAxNCAwMjhlICBQUk8vMTAwMCBNVCBOZXR3b3JrIENvbm5lY3Rpb24KLQkJODA4NiAxMDAwICBQUk8vMTAwMCBNVCBOZXR3b3JrIENvbm5lY3Rpb24KLQkJODA4NiAxMDAxICBQUk8vMTAwMCBNVCBTZXJ2ZXIgQWRhcHRlcgotCTEwMTAgIDgyNTQ2RUIgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb3BwZXIpCi0JCTEwMTQgMDI3YyAgUFJPLzEwMDAgTVQgRHVhbCBQb3J0IE5ldHdvcmsgQWRhcHRlcgotCQkxOGZiIDc4NzIgIFJFU2xpbmstWAotCQk0YzUzIDEwODAgIENUOCBtYWluYm9hcmQKLQkJNGM1MyAxMGEwICBDQTMvQ1IzIG1haW5ib2FyZAotCQk4MDg2IDEwMTEgIFBSTy8xMDAwIE1UIER1YWwgUG9ydCBTZXJ2ZXIgQWRhcHRlcgotCQk4MDg2IDEwMWEgIFBSTy8xMDAwIE1UIER1YWwgUG9ydCBOZXR3b3JrIEFkYXB0ZXIKLQkJODA4NiAzNDI0ICBTRTc1MDFIRzIgTWFpbmJvYXJkCi0JMTAxMSAgODI1NDVFTSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEZpYmVyKQotCQkxMDE0IDAyNjggIGlTZXJpZXMgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTgwODYgMTAwMiAgUFJPLzEwMDAgTUYgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMDAzICBQUk8vMTAwMCBNRiBTZXJ2ZXIgQWRhcHRlciAoTFgpCi0JMTAxMiAgODI1NDZFQiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEZpYmVyKQotCQk4MDg2IDEwMTIgIFBSTy8xMDAwIE1GIER1YWwgUG9ydCBTZXJ2ZXIgQWRhcHRlcgotCTEwMTMgIDgyNTQxRUkgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb3BwZXIpCi0JCTgwODYgMDAxMyAgUFJPLzEwMDAgTVQgTmV0d29yayBDb25uZWN0aW9uCi0JCTgwODYgMTAxMyAgSUJNIFRoaW5rQ2VudHJlIE5ldHdvcmsgQ2FyZAotCQk4MDg2IDExMTMgIFBSTy8xMDAwIE1UIERlc2t0b3AgQWRhcHRlcgotCTEwMTQgIDgyNTQxRVIgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTAxNSAgODI1NDBFTSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKExPTSkKLQkxMDE2ICA4MjU0MEVQIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoTE9NKQotCQkxMDE0IDA1MmMgIFBSTy8xMDAwIE1UIE1vYmlsZSBDb25uZWN0aW9uCi0JCTExNzkgMDAwMSAgUFJPLzEwMDAgTVQgTW9iaWxlIENvbm5lY3Rpb24KLQkJODA4NiAxMDE2ICBQUk8vMTAwMCBNVCBNb2JpbGUgQ29ubmVjdGlvbgotCTEwMTcgIDgyNTQwRVAgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMT00pCi0JCTgwODYgMTAxNyAgUFIwLzEwMDAgTVQgRGVza3RvcCBDb25uZWN0aW9uCi0jIFVwZGF0ZSBjb250cm9sbGVyIG5hbWUgZnJvbSA4MjU0MUVQIHRvIDgyNTQxRUkKLQkxMDE4ICA4MjU0MUVJIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQk4MDg2IDEwMTggIFBSTy8xMDAwIE1UIERlc2t0b3AgQWRhcHRlcgotCTEwMTkgIDgyNTQ3RUkgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMT00pCi0JCTE0NTggMTAxOSAgR0EtOElQRTEwMDAgUHJvMiBtb3RoZXJib2FyZCAoODY1UEUpCi0JCTE0NTggZTAwMCAgSW50ZWwgR2lnYWJpdCBFdGhlcm5ldCAoS2VuYWkgSUkpCi0JCTgwODYgMTAxOSAgUFJPLzEwMDAgQ1QgRGVza3RvcCBDb25uZWN0aW9uCi0JCTgwODYgMzAxZiAgRDg2NVBFUkwgbWFpbmJvYXJkCi0JCTgwODYgMzQyNyAgUzg3NVdQMS1FIG1haW5ib2FyZAotCTEwMWQgIDgyNTQ2RUIgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTgwODYgMTAwMCAgUFJPLzEwMDAgTVQgUXVhZCBQb3J0IFNlcnZlciBBZGFwdGVyCi0JMTAxZSAgODI1NDBFUCBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKE1vYmlsZSkKLQkJMTAxNCAwNTQ5ICBQUk8vMTAwMCBNVCBNb2JpbGUgQ29ubmVjdGlvbgotCQkxMTc5IDAwMDEgIFBSTy8xMDAwIE1UIE1vYmlsZSBDb25uZWN0aW9uCi0JCTgwODYgMTAxZSAgUFJPLzEwMDAgTVQgTW9iaWxlIENvbm5lY3Rpb24KLQkxMDI2ICA4MjU0NUdNIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQk4MDg2IDEwMDAgIFBSTy8xMDAwIE1UIFNlcnZlciBDb25uZWN0aW9uCi0JCTgwODYgMTAwMSAgUFJPLzEwMDAgTVQgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMDAyICBQUk8vMTAwMCBNVCBTZXJ2ZXIgQWRhcHRlcgotCQk4MDg2IDEwMjYgIFBSTy8xMDAwIE1UIFNlcnZlciBDb25uZWN0aW9uCi0JMTAyNyAgODI1NDVHTSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJODA4NiAxMDAxICBQUk8vMTAwMCBNRiBTZXJ2ZXIgQWRhcHRlcihMWCkKLQkJODA4NiAxMDAyICBQUk8vMTAwMCBNRiBTZXJ2ZXIgQWRhcHRlcihMWCkKLQkJODA4NiAxMDAzICBQUk8vMTAwMCBNRiBTZXJ2ZXIgQWRhcHRlcihMWCkKLQkJODA4NiAxMDI3ICBQUk8vMTAwMCBNRiBTZXJ2ZXIgQWRhcHRlcgotCTEwMjggIDgyNTQ1R00gR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTgwODYgMTAyOCAgUFJPLzEwMDAgTUIgU2VydmVyIEFkYXB0ZXIKLQkxMDI5ICA4MjU1OSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTAzMCAgODI1NTkgSW5CdXNpbmVzcyAxMC8xMDAKLQkxMDMxICA4MjgwMUNBTSAoSUNIMykgUFJPLzEwMCBWRSAoTE9NKSBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTEwMTQgMDIwOSAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JCTEwNGQgODBlNyAgVmFpbyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JCTEwN2IgNTM1MCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTE3OSAwMDAxICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQkxNDRkIGMwMDAgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTE0NGQgYzAwMSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTQ0ZCBjMDAzICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQkxNDRkIGMwMDYgIHZwciBNYXRyaXggMTcwQjQKLQkxMDMyICA4MjgwMUNBTSAoSUNIMykgUFJPLzEwMCBWRSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTAzMyAgODI4MDFDQU0gKElDSDMpIFBSTy8xMDAgVk0gKExPTSkgRXRoZXJuZXQgQ29udHJvbGxlcgotCTEwMzQgIDgyODAxQ0FNIChJQ0gzKSBQUk8vMTAwIFZNIEV0aGVybmV0IENvbnRyb2xsZXIKLQkxMDM1ICA4MjgwMUNBTSAoSUNIMykvODI1NjJFSCAoTE9NKSAgRXRoZXJuZXQgQ29udHJvbGxlcgotCTEwMzYgIDgyODAxQ0FNIChJQ0gzKSA4MjU2MkVIIEV0aGVybmV0IENvbnRyb2xsZXIKLQkxMDM3ICA4MjgwMUNBTSAoSUNIMykgQ2hpcHNldCBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTAzOCAgODI4MDFDQU0gKElDSDMpIFBSTy8xMDAgVk0gKEtNKSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTAzOSAgODI4MDFEQiBQUk8vMTAwIFZFIChMT00pIEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMTAxNCAwMjY3ICBOZXRWaXN0YSBBMzBwCi0JMTAzYSAgODI4MDFEQiBQUk8vMTAwIFZFIChDTlIpIEV0aGVybmV0IENvbnRyb2xsZXIKLQkxMDNiICA4MjgwMURCIFBSTy8xMDAgVk0gKExPTSkgRXRoZXJuZXQgQ29udHJvbGxlcgotCTEwM2MgIDgyODAxREIgUFJPLzEwMCBWTSAoQ05SKSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTAzZCAgODI4MDFEQiBQUk8vMTAwIFZFIChNT0IpIEV0aGVybmV0IENvbnRyb2xsZXIKLQkxMDNlICA4MjgwMURCIFBSTy8xMDAgVk0gKE1PQikgRXRoZXJuZXQgQ29udHJvbGxlcgotCTEwNDAgIDUzNkVQIERhdGEgRmF4IE1vZGVtCi0JCTE2YmUgMTA0MCAgVi45WCBEU1AgRGF0YSBGYXggTW9kZW0KLQkxMDQzICBQUk8vV2lyZWxlc3MgTEFOIDIxMDAgM0IgTWluaSBQQ0kgQWRhcHRlcgotCQk4MDg2IDI1MjcgIE1JTTIwMDAvQ2VudHJpbm8KLQkxMDQ4ICBQUk8vMTBHYkUgTFIgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiBhMDFmICBQUk8vMTBHYkUgTFIgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiBhMTFmICBQUk8vMTBHYkUgTFIgU2VydmVyIEFkYXB0ZXIKLQkxMDUwICA4MjU2MkVaIDEwLzEwMCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTE0NjIgNzI4YyAgODY1UEUgTmVvMiAoTVMtNjcyOCkKLQkJMTQ2MiA3NThjICBNUy02NzU4ICg4NzVQIE5lbykKLQkJODA4NiAzMDIwICBEODY1UEVSTCBtYWluYm9hcmQKLQkJODA4NiAzNDI3ICBTODc1V1AxLUUgbWFpbmJvYXJkCi0JMTA1MSAgODI4MDFFQi9FUiAoSUNINS9JQ0g1UikgaW50ZWdyYXRlZCBMQU4gQ29udHJvbGxlcgotCTEwNTkgIDgyNTUxUU0gRXRoZXJuZXQgQ29udHJvbGxlcgotIyBJQ0gtNiBDb21wb25lbnQKLQkxMDY0ICA4MjU2MkVUL0VaL0dUL0daIC0gUFJPLzEwMCBWRSAoTE9NKSBFdGhlcm5ldCBDb250cm9sbGVyCi0jIElDSC02IENvbXBvbmVudAotCTEwNjUgIDgyNTYyRVQvRVovR1QvR1ogLSBQUk8vMTAwIFZFIEV0aGVybmV0IENvbnRyb2xsZXIKLSMgSUNILTYgQ29tcG9uZW50Ci0JMTA2NiAgODI1NjIgRU0vRVgvR1ggLSBQUk8vMTAwIFZNIChMT00pIEV0aGVybmV0IENvbnRyb2xsZXIKLSMgSUNILTYgQ29tcG9uZW50Ci0JMTA2NyAgODI1NjIgRU0vRVgvR1ggLSBQUk8vMTAwIFZNIEV0aGVybmV0IENvbnRyb2xsZXIKLSMgSUNILTYgQ29tcG9uZW50Ci0JMTA2OCAgODI1NjJFVC9FWi9HVC9HWiAtIFBSTy8xMDAgVkUgKExPTSkgRXRoZXJuZXQgQ29udHJvbGxlciBNb2JpbGUKLSMgSUNILTYgQ29tcG9uZW50Ci0JMTA2OSAgODI1NjIgRU0vRVgvR1ggLSBQUk8vMTAwIFZNIChMT00pIEV0aGVybmV0IENvbnRyb2xsZXIgTW9iaWxlCi0jIElDSC02IENvbXBvbmVudAotCTEwNmEgIDgyNTYyRyBcdC0gUFJPLzEwMCBWRSAoTE9NKSBFdGhlcm5ldCBDb250cm9sbGVyCi0jIElDSC02IENvbXBvbmVudAotCTEwNmIgIDgyNTYyRyBcdC0gUFJPLzEwMCBWRSBFdGhlcm5ldCBDb250cm9sbGVyIE1vYmlsZQotCTEwNzUgIDgyNTQ3R0kgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTEwMjggMDE2NSAgUG93ZXJFZGdlIDc1MAotCQk4MDg2IDAwNzUgIFBSTy8xMDAwIENUIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDEwNzUgIFBSTy8xMDAwIENUIE5ldHdvcmsgQ29ubmVjdGlvbgotCTEwNzYgIDgyNTQxR0kvUEkgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTEwMjggMDE2NSAgUG93ZXJFZGdlIDc1MAotCQk4MDg2IDAwNzYgIFBSTy8xMDAwIE1UIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDEwNzYgIFBSTy8xMDAwIE1UIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDExNzYgIFBSTy8xMDAwIE1UIERlc2t0b3AgQWRhcHRlcgotCQk4MDg2IDEyNzYgIFBSTy8xMDAwIE1UIERlc2t0b3AgQWRhcHRlcgotCTEwNzcgIDgyNTQxR0kgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTExNzkgMDAwMSAgUFJPLzEwMDAgTVQgTW9iaWxlIENvbm5lY3Rpb24KLQkJODA4NiAwMDc3ICBQUk8vMTAwMCBNVCBNb2JpbGUgQ29ubmVjdGlvbgotCQk4MDg2IDEwNzcgIFBSTy8xMDAwIE1UIE1vYmlsZSBDb25uZWN0aW9uCi0JMTA3OCAgODI1NDFFSSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJODA4NiAxMDc4ICBQUk8vMTAwMCBNVCBOZXR3b3JrIENvbm5lY3Rpb24KLQkxMDc5ICA4MjU0NkdCIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQkxMDNjIDEyYTYgIEhQIER1YWwgUG9ydCAxMDAwQmFzZS1UIFtBOTkwMEFdCi0JCTEwM2MgMTJjZiAgSFAgQ29yZSBEdWFsIFBvcnQgMTAwMEJhc2UtVCBbQUIzNTJBXQotCQk0YzUzIDEwOTAgIEN4OSAvIFZ4OSBtYWluYm9hcmQKLQkJNGM1MyAxMGIwICBDTDkgbWFpbmJvYXJkCi0JCTgwODYgMDA3OSAgUFJPLzEwMDAgTVQgRHVhbCBQb3J0IE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDEwNzkgIFBSTy8xMDAwIE1UIER1YWwgUG9ydCBOZXR3b3JrIENvbm5lY3Rpb24KLQkJODA4NiAxMTc5ICBQUk8vMTAwMCBNVCBEdWFsIFBvcnQgTmV0d29yayBDb25uZWN0aW9uCi0JCTgwODYgMTE3YSAgUFJPLzEwMDAgTVQgRHVhbCBQb3J0IFNlcnZlciBBZGFwdGVyCi0JMTA3YSAgODI1NDZHQiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMTAzYyAxMmE4ICBIUCBEdWFsIFBvcnQgMTAwMGJhc2UtU1ggW0E5ODk5QV0KLQkJODA4NiAxMDdhICBQUk8vMTAwMCBNRiBEdWFsIFBvcnQgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMjdhICBQUk8vMTAwMCBNRiBEdWFsIFBvcnQgU2VydmVyIEFkYXB0ZXIKLQkxMDdiICA4MjU0NkdCIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQk4MDg2IDAwN2IgIFBSTy8xMDAwIE1CIER1YWwgUG9ydCBTZXJ2ZXIgQ29ubmVjdGlvbgotCQk4MDg2IDEwN2IgIFBSTy8xMDAwIE1CIER1YWwgUG9ydCBTZXJ2ZXIgQ29ubmVjdGlvbgotCTExMDcgIFBSTy8xMDAwIE1GIFNlcnZlciBBZGFwdGVyIChMWCkKLQkxMTMwICA4MjgxNSA4MTUgQ2hpcHNldCBIb3N0IEJyaWRnZSBhbmQgTWVtb3J5IENvbnRyb2xsZXIgSHViCi0JCTEwMjUgMTAxNiAgVHJhdmVsbWF0ZSA2MTIgVFgKLQkJMTA0MyA4MDI3ICBUVVNMMi1DIE1haW5ib2FyZAotCQkxMDRkIDgwZGYgIFZhaW8gUENHLUZYNDAzCi0JCTgwODYgNDUzMiAgRDgxNUVFQTIgbWFpbmJvYXJkCi0JCTgwODYgNDU1NyAgRDgxNUVHRVcgTWFpbmJvYXJkCi0JMTEzMSAgODI4MTUgODE1IENoaXBzZXQgQUdQIEJyaWRnZQotCTExMzIgIDgyODE1IENHQyBbQ2hpcHNldCBHcmFwaGljcyBDb250cm9sbGVyXQotCQkxMDI1IDEwMTYgIFRyYXZlbG1hdGUgNjEyIFRYCi0JCTEwNGQgODBkZiAgVmFpbyBQQ0ctRlg0MDMKLQkJODA4NiA0NTMyICBEODE1RUVBMiBNYWluYm9hcmQKLQkJODA4NiA0NTU3ICBEODE1RUdFVyBNYWluYm9hcmQKLQkxMTYxICA4MjgwNkFBIFBDSTY0IEh1YiBBZHZhbmNlZCBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIKLQkJODA4NiAxMTYxICA4MjgwNkFBIFBDSTY0IEh1YiBBUElDCi0JMTE2MiAgWHNjYWxlIDgwMjAwIEJpZyBFbmRpYW4gQ29tcGFuaW9uIENoaXAKLQkxMjAwICBJbnRlbCBJWFAxMjAwIE5ldHdvcmsgUHJvY2Vzc29yCi0JCTE3MmEgMDAwMCAgQUVQIFNTTCBBY2NlbGVyYXRvcgotCTEyMDkgIDgyNTV4RVIvODI1NTFJVCBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA1MSAgQ0U3IG1haW5ib2FyZAotCQk0YzUzIDEwNzAgIFBDNiBtYWluYm9hcmQKLQkxMjIxICA4MjA5MkFBIFBDSSB0byBQQ01DSUEgQnJpZGdlCi0JMTIyMiAgODIwOTJBQSBJREUgQ29udHJvbGxlcgotCTEyMjMgIFNBQTcxMTYKLQkxMjI1ICA4MjQ1MktYL0dYIFtPcmlvbl0KLQkxMjI2ICA4MjU5NiBQUk8vMTAgUENJCi0JMTIyNyAgODI4NjUgRXRoZXJFeHByZXNzIFBSTy8xMDBBCi0JMTIyOCAgODI1NTYgRXRoZXJFeHByZXNzIFBSTy8xMDAgU21hcnQKLSMgdGhlIHJldmlzaW9uIGZpZWxkIGRpZmZlcmVudGlhdGVzIGJldHdlZW4gdGhlbSAoMS0zIGlzIDgyNTU3LCA0LTUgaXMgODI1NTgsIDYtOCBpcyA4MjU1OSwgOSBpcyA4MjU1OUVSKQotCTEyMjkgIDgyNTU3LzgvOSBbRXRoZXJuZXQgUHJvIDEwMF0KLQkJMGUxMSAzMDAxICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSAzMDAyICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSAzMDAzICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSAzMDA0ICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSAzMDA1ICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSAzMDA2ICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSAzMDA3ICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSBiMDFlICBOQzMxMjAgRmFzdCBFdGhlcm5ldCBOSUMKLQkJMGUxMSBiMDFmICBOQzMxMjIgRmFzdCBFdGhlcm5ldCBOSUMgKGR1YWwgcG9ydCkKLQkJMGUxMSBiMDJmICBOQzExMjAgRXRoZXJuZXQgTklDCi0JCTBlMTEgYjA0YSAgTmV0ZWxsaWdlbnQgMTAvMTAwVFggTklDIHdpdGggV2FrZSBvbiBMQU4KLQkJMGUxMSBiMGM2ICBOQzMxNjEgRmFzdCBFdGhlcm5ldCBOSUMgKGVtYmVkZGVkLCBXT0wpCi0JCTBlMTEgYjBjNyAgTkMzMTYwIEZhc3QgRXRoZXJuZXQgTklDIChlbWJlZGRlZCkKLQkJMGUxMSBiMGQ3ICBOQzMxMjEgRmFzdCBFdGhlcm5ldCBOSUMgKFdPTCkKLQkJMGUxMSBiMGRkICBOQzMxMzEgRmFzdCBFdGhlcm5ldCBOSUMgKGR1YWwgcG9ydCkKLQkJMGUxMSBiMGRlICBOQzMxMzIgRmFzdCBFdGhlcm5ldCBNb2R1bGUgKGR1YWwgcG9ydCkKLQkJMGUxMSBiMGUxICBOQzMxMzMgRmFzdCBFdGhlcm5ldCBNb2R1bGUgKDEwMC1GWCkKLQkJMGUxMSBiMTM0ICBOQzMxNjMgRmFzdCBFdGhlcm5ldCBOSUMgKGVtYmVkZGVkLCBXT0wpCi0JCTBlMTEgYjEzYyAgTkMzMTYyIEZhc3QgRXRoZXJuZXQgTklDIChlbWJlZGRlZCkKLQkJMGUxMSBiMTQ0ICBOQzMxMjMgRmFzdCBFdGhlcm5ldCBOSUMgKFdPTCkKLQkJMGUxMSBiMTYzICBOQzMxMzQgRmFzdCBFdGhlcm5ldCBOSUMgKGR1YWwgcG9ydCkKLQkJMGUxMSBiMTY0ICBOQzMxMzUgRmFzdCBFdGhlcm5ldCBVcGdyYWRlIE1vZHVsZSAoZHVhbCBwb3J0KQotCQkwZTExIGIxYTQgIE5DNzEzMSBHaWdhYml0IFNlcnZlciBBZGFwdGVyCi0JCTEwMTQgMDA1YyAgODI1NThCIEV0aGVybmV0IFBybyAxMC8xMDAKLQkJMTAxNCAwMWJjICA4MjU1OSBGYXN0IEV0aGVybmV0IExBTiBPbiBNb3RoZXJib2FyZAotCQkxMDE0IDAxZjEgIDEwLzEwMCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlcgotCQkxMDE0IDAxZjIgIDEwLzEwMCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlcgotCQkxMDE0IDAyMDcgIEV0aGVybmV0IFByby8xMDAgUwotCQkxMDE0IDAyMzIgIDEwLzEwMCBEdWFsIFBvcnQgU2VydmVyIEFkYXB0ZXIKLQkJMTAxNCAwMjNhICBUaGlua1BhZCBSMzAKLQkJMTAxNCAxMDVjICBOZXRmaW5pdHkgMTAvMTAwCi0JCTEwMTQgMjIwNSAgVGhpbmtQYWQgQTIycAotCQkxMDE0IDMwNWMgIDEwLzEwMCBFdGhlckpldCBNYW5hZ2VtZW50IEFkYXB0ZXIKLQkJMTAxNCA0MDVjICAxMC8xMDAgRXRoZXJKZXQgQWRhcHRlciB3aXRoIEFsZXJ0IG9uIExBTgotCQkxMDE0IDUwNWMgIDEwLzEwMCBFdGhlckpldCBTZWN1cmUgTWFuYWdlbWVudCBBZGFwdGVyCi0JCTEwMTQgNjA1YyAgMTAvMTAwIEV0aGVySmV0IFNlY3VyZSBNYW5hZ2VtZW50IEFkYXB0ZXIKLQkJMTAxNCA3MDVjICAxMC8xMDAgTmV0ZmluaXR5IDEwLzEwMCBFdGhlcm5ldCBTZWN1cml0eSBBZGFwdGVyCi0JCTEwMTQgODA1YyAgMTAvMTAwIE5ldGZpbml0eSAxMC8xMDAgRXRoZXJuZXQgU2VjdXJpdHkgQWRhcHRlcgotCQkxMDI4IDAwOWIgIFBvd2VyRWRnZSAyNTAwLzI1NTAKLQkJMTAyOCAwMGNlICBQb3dlckVkZ2UgMTQwMAotCQkxMDMzIDgwMDAgIFBDLTk4MjFYLUIwNgotCQkxMDMzIDgwMTYgIFBLLVVHLVgwMDYKLQkJMTAzMyA4MDFmICBQSy1VRy1YMDA2Ci0JCTEwMzMgODAyNiAgUEstVUctWDAwNgotCQkxMDMzIDgwNjMgIDgyNTU5LWJhc2VkIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMDMzIDgwNjQgIDgyNTU5LWJhc2VkIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMDNjIDEwYzAgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMDNjIDEwYzMgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMDNjIDEwY2EgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMDNjIDEwY2IgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMDNjIDEwZTMgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMDNjIDEwZTQgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMDNjIDEyMDAgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMGMzIDExMDAgIFNtYXJ0RXRoZXIxMDAgU0MxMTAwCi0JCTEwY2YgMTExNSAgODI1NXgtYmFzZWQgRXRoZXJuZXQgQWRhcHRlciAoMTAvMTAwKQotCQkxMGNmIDExNDMgIDgyNTV4LWJhc2VkIEV0aGVybmV0IEFkYXB0ZXIgKDEwLzEwMCkKLQkJMTE3OSAwMDAxICA4MjU1eC1iYXNlZCBFdGhlcm5ldCBBZGFwdGVyICgxMC8xMDApCi0JCTExNzkgMDAwMiAgUENJIEZhc3RFdGhlciBMQU4gb24gRG9ja2VyCi0JCTExNzkgMDAwMyAgODI1NXgtYmFzZWQgRmFzdCBFdGhlcm5ldAotCQkxMjU5IDI1NjAgIEFULTI1NjAgMTAwCi0JCTEyNTkgMjU2MSAgQVQtMjU2MCAxMDAgRlggRXRoZXJuZXQgQWRhcHRlcgotCQkxMjY2IDAwMDEgIE5FMTAvMTAwIEFkYXB0ZXIKLQkJMTNlOSAxMDAwICA2MjIxTC00VQotCQkxNDRkIDI1MDEgIFNFTS0yMDAwIE1pbmlQQ0kgTEFOIEFkYXB0ZXIKLQkJMTQ0ZCAyNTAyICBTRU0tMjEwMElMIE1pbmlQQ0kgTEFOIEFkYXB0ZXIKLQkJMTY2OCAxMTAwICBFdGhlckV4cHJlc3MgUFJPLzEwMEIgKFRYKSAoTWluaVBDSSBFdGhlcm5ldCtNb2RlbSkKLQkJNGM1MyAxMDgwICBDVDggbWFpbmJvYXJkCi0JCTgwODYgMDAwMSAgRXRoZXJFeHByZXNzIFBSTy8xMDBCIChUWCkKLQkJODA4NiAwMDAyICBFdGhlckV4cHJlc3MgUFJPLzEwMEIgKFQ0KQotCQk4MDg2IDAwMDMgIEV0aGVyRXhwcmVzcyBQUk8vMTArCi0JCTgwODYgMDAwNCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgV2ZNCi0JCTgwODYgMDAwNSAgODI1NTcgMTAvMTAwCi0JCTgwODYgMDAwNiAgODI1NTcgMTAvMTAwIHdpdGggV2FrZSBvbiBMQU4KLQkJODA4NiAwMDA3ICA4MjU1OCAxMC8xMDAgQWRhcHRlcgotCQk4MDg2IDAwMDggIDgyNTU4IDEwLzEwMCB3aXRoIFdha2Ugb24gTEFOCi0JCTgwODYgMDAwOSAgRXRoZXJFeHByZXNzIFBSTy8xMDArCi0JCTgwODYgMDAwYSAgRXRoZXJFeHByZXNzIFBSTy8xMDArIE1hbmFnZW1lbnQgQWRhcHRlcgotCQk4MDg2IDAwMGIgIEV0aGVyRXhwcmVzcyBQUk8vMTAwKwotCQk4MDg2IDAwMGMgIEV0aGVyRXhwcmVzcyBQUk8vMTAwKyBNYW5hZ2VtZW50IEFkYXB0ZXIKLQkJODA4NiAwMDBkICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgQWxlcnQgT24gTEFOIElJKiBBZGFwdGVyCi0JCTgwODYgMDAwZSAgRXRoZXJFeHByZXNzIFBSTy8xMDArIE1hbmFnZW1lbnQgQWRhcHRlciB3aXRoIEFsZXJ0IE9uIExBTioKLQkJODA4NiAwMDBmICBFdGhlckV4cHJlc3MgUFJPLzEwMCBEZXNrdG9wIEFkYXB0ZXIKLQkJODA4NiAwMDEwICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTIE1hbmFnZW1lbnQgQWRhcHRlcgotCQk4MDg2IDAwMTEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFMgTWFuYWdlbWVudCBBZGFwdGVyCi0JCTgwODYgMDAxMiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBBZHZhbmNlZCBNYW5hZ2VtZW50IEFkYXB0ZXIgKEQpCi0JCTgwODYgMDAxMyAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBBZHZhbmNlZCBNYW5hZ2VtZW50IEFkYXB0ZXIgKEUpCi0JCTgwODYgMDAzMCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgIE1hbmFnZW1lbnQgQWRhcHRlciB3aXRoIEFsZXJ0IE9uIExBTiogR0MKLQkJODA4NiAwMDMxICBFdGhlckV4cHJlc3MgUFJPLzEwMCBEZXNrdG9wIEFkYXB0ZXIKLQkJODA4NiAwMDQwICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTIERlc2t0b3AgQWRhcHRlcgotCQk4MDg2IDAwNDEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFMgRGVza3RvcCBBZGFwdGVyCi0JCTgwODYgMDA0MiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgRGVza3RvcCBBZGFwdGVyCi0JCTgwODYgMDA1MCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBEZXNrdG9wIEFkYXB0ZXIKLQkJODA4NiAxMDA5ICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMDBjICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgU2VydmVyIEFkYXB0ZXIgKFBJTEE4NDcwQikKLQkJODA4NiAxMDEyICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTIFNlcnZlciBBZGFwdGVyIChEKQotCQk4MDg2IDEwMTMgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFMgU2VydmVyIEFkYXB0ZXIgKEUpCi0JCTgwODYgMTAxNSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBEdWFsIFBvcnQgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMDE3ICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgRHVhbCBQb3J0IFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMTAzMCAgRXRoZXJFeHByZXNzIFBSTy8xMDArIE1hbmFnZW1lbnQgQWRhcHRlciB3aXRoIEFsZXJ0IE9uIExBTiogRyBTZXJ2ZXIKLQkJODA4NiAxMDQwICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTIFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMTA0MSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBTZXJ2ZXIgQWRhcHRlcgotCQk4MDg2IDEwNDIgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMTA1MCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBTZXJ2ZXIgQWRhcHRlcgotCQk4MDg2IDEwNTEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMTA1MiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMGYwICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgRHVhbCBQb3J0IEFkYXB0ZXIKLQkJODA4NiAyMDA5ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTIE1vYmlsZSBBZGFwdGVyCi0JCTgwODYgMjAwZCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgQ2FyZGJ1cwotCQk4MDg2IDIwMGUgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIExBTitWOTAgQ2FyZGJ1cyBNb2RlbQotCQk4MDg2IDIwMGYgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNSIE1vYmlsZSBBZGFwdGVyCi0JCTgwODYgMjAxMCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBNb2JpbGUgQ29tYm8gQWRhcHRlcgotCQk4MDg2IDIwMTMgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNSIE1vYmlsZSBDb21ibyBBZGFwdGVyCi0JCTgwODYgMjAxNiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBNb2JpbGUgQWRhcHRlcgotCQk4MDg2IDIwMTcgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFMgQ29tYm8gTW9iaWxlIEFkYXB0ZXIKLQkJODA4NiAyMDE4ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTUiBNb2JpbGUgQWRhcHRlcgotCQk4MDg2IDIwMTkgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNSIENvbWJvIE1vYmlsZSBBZGFwdGVyCi0JCTgwODYgMjEwMSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUCBNb2JpbGUgQWRhcHRlcgotCQk4MDg2IDIxMDIgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNQIE1vYmlsZSBBZGFwdGVyCi0JCTgwODYgMjEwMyAgRXRoZXJFeHByZXNzIFBSTy8xMDAgU1AgTW9iaWxlIEFkYXB0ZXIKLQkJODA4NiAyMTA0ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTUCBNb2JpbGUgQWRhcHRlcgotCQk4MDg2IDIxMDUgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNQIE1vYmlsZSBBZGFwdGVyCi0JCTgwODYgMjEwNiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUCBNb2JpbGUgQWRhcHRlcgotCQk4MDg2IDIxMDcgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDIxMDggIEV0aGVyRXhwcmVzcyBQUk8vMTAwIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDIyMDAgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFAgTW9iaWxlIENvbWJvIEFkYXB0ZXIKLQkJODA4NiAyMjAxICBFdGhlckV4cHJlc3MgUFJPLzEwMCBQIE1vYmlsZSBDb21ibyBBZGFwdGVyCi0JCTgwODYgMjIwMiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgU1AgTW9iaWxlIENvbWJvIEFkYXB0ZXIKLQkJODA4NiAyMjAzICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgTWluaVBDSQotCQk4MDg2IDIyMDQgIEV0aGVyRXhwcmVzcyBQUk8vMTAwKyBNaW5pUENJCi0JCTgwODYgMjIwNSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgU1AgTW9iaWxlIENvbWJvIEFkYXB0ZXIKLQkJODA4NiAyMjA2ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTUCBNb2JpbGUgQ29tYm8gQWRhcHRlcgotCQk4MDg2IDIyMDcgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNQIE1vYmlsZSBDb21ibyBBZGFwdGVyCi0JCTgwODYgMjIwOCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUCBNb2JpbGUgQ29tYm8gQWRhcHRlcgotCQk4MDg2IDI0MDIgIEV0aGVyRXhwcmVzcyBQUk8vMTAwKyBNaW5pUENJCi0JCTgwODYgMjQwNyAgRXRoZXJFeHByZXNzIFBSTy8xMDArIE1pbmlQQ0kKLQkJODA4NiAyNDA4ICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgTWluaVBDSQotCQk4MDg2IDI0MDkgIEV0aGVyRXhwcmVzcyBQUk8vMTAwKyBNaW5pUENJCi0JCTgwODYgMjQwZiAgRXRoZXJFeHByZXNzIFBSTy8xMDArIE1pbmlQQ0kKLQkJODA4NiAyNDEwICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgTWluaVBDSQotCQk4MDg2IDI0MTEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwKyBNaW5pUENJCi0JCTgwODYgMjQxMiAgRXRoZXJFeHByZXNzIFBSTy8xMDArIE1pbmlQQ0kKLQkJODA4NiAyNDEzICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgTWluaVBDSQotCQk4MDg2IDMwMDAgIDgyNTU5IEZhc3QgRXRoZXJuZXQgTEFOIG9uIE1vdGhlcmJvYXJkCi0JCTgwODYgMzAwMSAgODI1NTkgRmFzdCBFdGhlcm5ldCBMT00gd2l0aCBCYXNpYyBBbGVydCBvbiBMQU4qCi0JCTgwODYgMzAwMiAgODI1NTkgRmFzdCBFdGhlcm5ldCBMT00gd2l0aCBBbGVydCBvbiBMQU4gSUkqCi0JCTgwODYgMzAwNiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBOZXR3b3JrIENvbm5lY3Rpb24KLQkJODA4NiAzMDA3ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDMwMDggIEV0aGVyRXhwcmVzcyBQUk8vMTAwIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDMwMTAgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFMgTmV0d29yayBDb25uZWN0aW9uCi0JCTgwODYgMzAxMSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBOZXR3b3JrIENvbm5lY3Rpb24KLQkJODA4NiAzMDEyICBFdGhlckV4cHJlc3MgUFJPLzEwMCBOZXR3b3JrIENvbm5lY3Rpb24KLQkJODA4NiAzNDExICBTRFMyIE1haW5ib2FyZAotCTEyMmQgIDQzMEZYIC0gODI0MzdGWCBUU0MgW1RyaXRvbiBJXQotCTEyMmUgIDgyMzcxRkIgUElJWCBJU0EgW1RyaXRvbiBJXQotCTEyMzAgIDgyMzcxRkIgUElJWCBJREUgW1RyaXRvbiBJXQotCTEyMzEgIERTVkQgTW9kZW0KLQkxMjM0ICA0MzBNWCAtIDgyMzcxTVggTW9iaWxlIFBDSSBJL08gSURFIFhjZWxlcmF0b3IgKE1QSUlYKQotCTEyMzUgIDQzME1YIC0gODI0MzdNWCBNb2IuIFN5c3RlbSBDdHJsciAoTVRTQykgJiA4MjQzOE1YIERhdGEgUGF0aCAoTVREUCkKLQkxMjM3ICA0NDBGWCAtIDgyNDQxRlggUE1DIFtOYXRvbWFdCi0JMTIzOSAgODIzNzFGQiBQSUlYIElERSBJbnRlcmZhY2UKLQkxMjNiICA4MjM4MFBCIFBDSSB0byBQQ0kgRG9ja2luZyBCcmlkZ2UKLQkxMjNjICA4MjM4MEFCIChNSVNBKSBNb2JpbGUgUENJLXRvLUlTQSBCcmlkZ2UKLQkxMjNkICA2ODMwNTMgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBEZXZpY2UKLSMgaW4iIGhpZGRlbiIgbW9kZQotCTEyM2UgIDgyNDY2R1ggKElIUEMpIEludGVncmF0ZWQgSG90LVBsdWcgQ29udHJvbGxlcgotCTEyM2YgIDgyNDY2R1ggSW50ZWdyYXRlZCBIb3QtUGx1ZyBDb250cm9sbGVyIChJSFBDKQotCTEyNDAgIDgyNzUyICg3NTIpIEFHUCBHcmFwaGljcyBBY2NlbGVyYXRvcgotCTEyNGIgIDgyMzgwRkIgKE1QQ0kyKSBNb2JpbGUgRG9ja2luZyBDb250cm9sbGVyCi0JMTI1MCAgNDMwSFggLSA4MjQzOUhYIFRYQyBbVHJpdG9uIElJXQotCTEzNjAgIDgyODA2QUEgUENJNjQgSHViIFBDSSBCcmlkZ2UKLQkxMzYxICA4MjgwNkFBIFBDSTY0IEh1YiBDb250cm9sbGVyIChIUmVzKQotCQk4MDg2IDEzNjEgIDgyODA2QUEgUENJNjQgSHViIENvbnRyb2xsZXIgKEhSZXMpCi0JCTgwODYgODAwMCAgODI4MDZBQSBQQ0k2NCBIdWIgQ29udHJvbGxlciAoSFJlcykKLQkxNDYwICA4Mjg3MFAyIFA2NEgyIEh1YiBQQ0kgQnJpZGdlCi0JMTQ2MSAgODI4NzBQMiBQNjRIMiBJL094QVBJQwotCQkxNWQ5IDM0ODAgIFA0RFA2Ci0JCTRjNTMgMTA5MCAgQ3g5IC8gVng5IG1haW5ib2FyZAotCTE0NjIgIDgyODcwUDIgUDY0SDIgSG90IFBsdWcgQ29udHJvbGxlcgotCTE5NjAgIDgwOTYwUlAgW2k5NjBSUCBNaWNyb3Byb2Nlc3Nvcl0KLQkJMTAxZSAwNDMxICBNZWdhUkFJRCA0MzEgUkFJRCBDb250cm9sbGVyCi0JCTEwMWUgMDQzOCAgTWVnYVJBSUQgNDM4IFVsdHJhMiBMVkQgUkFJRCBDb250cm9sbGVyCi0JCTEwMWUgMDQ2NiAgTWVnYVJBSUQgNDY2IEV4cHJlc3MgUGx1cyBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwNDY3ICBNZWdhUkFJRCA0NjcgRW50ZXJwcmlzZSAxNTAwIFJBSUQgQ29udHJvbGxlcgotCQkxMDFlIDA0OTAgIE1lZ2FSQUlEIDQ5MCBFeHByZXNzIDMwMCBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwNzYyICBNZWdhUkFJRCA3NjIgRXhwcmVzcyBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwOWEwICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIENvbnRyb2xsZXIgMi9TQwotCQkxMDI4IDA0NjcgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciAyL0RDCi0JCTEwMjggMTExMSAgUG93ZXJFZGdlIEV4cGFuZGFibGUgUkFJRCBDb250cm9sbGVyIDIvU0MKLQkJMTAzYyAwM2EyICBNZWdhUkFJRAotCQkxMDNjIDEwYzYgIE1lZ2FSQUlEIDQzOCwgSFAgTmV0UkFJRC0zU2kKLQkJMTAzYyAxMGM3ICBNZWdhUkFJRCBUNSwgSW50ZWdyYXRlZCBIUCBOZXRSQUlECi0JCTEwM2MgMTBjYyAgTWVnYVJBSUQsIEludGVncmF0ZWQgSFAgTmV0UkFJRAotCQkxMDNjIDEwY2QgIEhQIE5ldFJBSUQtMVNpCi0JCTEwNWEgMDAwMCAgU3VwZXJUcmFrCi0JCTEwNWEgMjE2OCAgU3VwZXJUcmFrIFBybwotCQkxMDVhIDUxNjggIFN1cGVyVHJhazY2LzEwMAotCQkxMTExIDExMTEgIE1lZ2FSQUlEIDQ2NiwgUG93ZXJFZGdlIEV4cGFuZGFibGUgUkFJRCBDb250cm9sbGVyIDIvU0MKLQkJMTExMSAxMTEyICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIENvbnRyb2xsZXIgMi9TQwotCQkxMTNjIDAzYTIgIE1lZ2FSQUlECi0JCWU0YmYgMTAxMCAgQ0cxLVJBRElPCi0JCWU0YmYgMTAyMCAgQ1UyLVFVQVJURVQKLQkJZTRiZiAxMDQwICBDVTEtQ0hPUlVTCi0JCWU0YmYgMzEwMCAgQ1gxLUJBTkQKLQkxOTYyICA4MDk2MFJNIFtpOTYwUk0gTWljcm9wcm9jZXNzb3JdCi0JCTEwNWEgMDAwMCAgU3VwZXJUcmFrIFNYNjAwMCBJMk8gQ1BVCi0JMWEyMSAgODI4NDAgODQwIChDYXJtZWwpIENoaXBzZXQgSG9zdCBCcmlkZ2UgKEh1YiBBKQotCTFhMjMgIDgyODQwIDg0MCAoQ2FybWVsKSBDaGlwc2V0IEFHUCBCcmlkZ2UKLQkxYTI0ICA4Mjg0MCA4NDAgKENhcm1lbCkgQ2hpcHNldCBQQ0kgQnJpZGdlIChIdWIgQikKLQkxYTMwICA4Mjg0NSA4NDUgKEJyb29rZGFsZSkgQ2hpcHNldCBIb3N0IEJyaWRnZQotCQkxMDI4IDAxMGUgIE9wdGlwbGV4IEdYMjQwCi0JMWEzMSAgODI4NDUgODQ1IChCcm9va2RhbGUpIENoaXBzZXQgQUdQIEJyaWRnZQotCTI0MTAgIDgyODAxQUEgSVNBIEJyaWRnZSAoTFBDKQotCTI0MTEgIDgyODAxQUEgSURFCi0JMjQxMiAgODI4MDFBQSBVU0IKLQkyNDEzICA4MjgwMUFBIFNNQnVzCi0JMjQxNSAgODI4MDFBQSBBQyc5NyBBdWRpbwotCQkxMDI4IDAwOTUgIFByZWNpc2lvbiBXb3Jrc3RhdGlvbiAyMjAgSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvCi0JCTExZDQgMDA0MCAgU291bmRNQVggSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvCi0JCTExZDQgMDA0OCAgU291bmRNQVggSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvCi0JCTExZDQgNTM0MCAgU291bmRNQVggSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvCi0JMjQxNiAgODI4MDFBQSBBQyc5NyBNb2RlbQotCTI0MTggIDgyODAxQUEgUENJIEJyaWRnZQotCTI0MjAgIDgyODAxQUIgSVNBIEJyaWRnZSAoTFBDKQotCTI0MjEgIDgyODAxQUIgSURFCi0JMjQyMiAgODI4MDFBQiBVU0IKLQkyNDIzICA4MjgwMUFCIFNNQnVzCi0JMjQyNSAgODI4MDFBQiBBQyc5NyBBdWRpbwotCQkxMWQ0IDAwNDAgIFNvdW5kTUFYIEludGVncmF0ZWQgRGlnaXRhbCBBdWRpbwotCQkxMWQ0IDAwNDggIFNvdW5kTUFYIEludGVncmF0ZWQgRGlnaXRhbCBBdWRpbwotCTI0MjYgIDgyODAxQUIgQUMnOTcgTW9kZW0KLQkyNDI4ICA4MjgwMUFCIFBDSSBCcmlkZ2UKLQkyNDQwICA4MjgwMUJBIElTQSBCcmlkZ2UgKExQQykKLQkyNDQyICA4MjgwMUJBL0JBTSBVU0IgKEh1YiAjMSkKLQkJMTAxNCAwMWM2ICBOZXR2aXN0YSBBNDAvQTQwcAotCQkxMDI1IDEwMTYgIFRyYXZlbG1hdGUgNjEyIFRYCi0JCTEwMjggMDEwZSAgT3B0aXBsZXggR1gyNDAKLQkJMTA0MyA4MDI3ICBUVVNMMi1DIE1haW5ib2FyZAotCQkxMDRkIDgwZGYgIFZhaW8gUENHLUZYNDAzCi0JCTE0N2IgMDUwNyAgVEg3SUktUkFJRAotCQk4MDg2IDQ1MzIgIEQ4MTVFRUEyIG1haW5ib2FyZAotCQk4MDg2IDQ1NTcgIEQ4MTVFR0VXIE1haW5ib2FyZAotCTI0NDMgIDgyODAxQkEvQkFNIFNNQnVzCi0JCTEwMTQgMDFjNiAgTmV0dmlzdGEgQTQwL0E0MHAKLQkJMTAyNSAxMDE2ICBUcmF2ZWxtYXRlIDYxMiBUWAotCQkxMDI4IDAxMGUgIE9wdGlwbGV4IEdYMjQwCi0JCTEwNDMgODAyNyAgVFVTTDItQyBNYWluYm9hcmQKLQkJMTA0ZCA4MGRmICBWYWlvIFBDRy1GWDQwMwotCQkxNDdiIDA1MDcgIFRIN0lJLVJBSUQKLQkJODA4NiA0NTMyICBEODE1RUVBMiBtYWluYm9hcmQKLQkJODA4NiA0NTU3ICBEODE1RUdFVyBNYWluYm9hcmQKLQkyNDQ0ICA4MjgwMUJBL0JBTSBVU0IgKEh1YiAjMikKLQkJMTAyNSAxMDE2ICBUcmF2ZWxtYXRlIDYxMiBUWAotCQkxMDI4IDAxMGUgIE9wdGlwbGV4IEdYMjQwCi0JCTEwNDMgODAyNyAgVFVTTDItQyBNYWluYm9hcmQKLQkJMTA0ZCA4MGRmICBWYWlvIFBDRy1GWDQwMwotCQkxNDdiIDA1MDcgIFRIN0lJLVJBSUQKLQkJODA4NiA0NTMyICBEODE1RUVBMiBtYWluYm9hcmQKLQkyNDQ1ICA4MjgwMUJBL0JBTSBBQyc5NyBBdWRpbwotCQkxMDE0IDAxYzYgIE5ldHZpc3RhIEE0MC9BNDBwCi0JCTEwMjUgMTAxNiAgVHJhdmVsbWF0ZSA2MTIgVFgKLQkJMTA0ZCA4MGRmICBWYWlvIFBDRy1GWDQwMwotCQkxNDYyIDMzNzAgIFNUQUM5NzIxIEFDCi0JCTE0N2IgMDUwNyAgVEg3SUktUkFJRAotCQk4MDg2IDQ1NTcgIEQ4MTVFR0VXIE1haW5ib2FyZAotCTI0NDYgIDgyODAxQkEvQkFNIEFDJzk3IE1vZGVtCi0JCTEwMjUgMTAxNiAgVHJhdmVsbWF0ZSA2MTIgVFgKLQkJMTA0ZCA4MGRmICBWYWlvIFBDRy1GWDQwMwotCTI0NDggIDgyODAxIE1vYmlsZSBQQ0kgQnJpZGdlCi0JMjQ0OSAgODI4MDFCQS9CQU0vQ0EvQ0FNIEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMGUxMSAwMDEyICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWTQotCQkwZTExIDAwOTEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTEwMTQgMDFjZSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTAxNCAwMWRjICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQkxMDE0IDAxZWIgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTEwMTQgMDFlYyAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTAxNCAwMjAyICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQkxMDE0IDAyMDUgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTEwMTQgMDIxNyAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTAxNCAwMjM0ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQkxMDE0IDAyM2QgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTEwMTQgMDI0NCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTAxNCAwMjQ1ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQkxMDE0IDAyNjUgIFBSTy8xMDAgVkUgRGVza3RvcCBDb25uZWN0aW9uCi0JCTEwMTQgMDI2NyAgUFJPLzEwMCBWRSBEZXNrdG9wIENvbm5lY3Rpb24KLQkJMTAxNCAwMjZhICBQUk8vMTAwIFZFIERlc2t0b3AgQ29ubmVjdGlvbgotCQkxMDlmIDMxNWQgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTEwOWYgMzE4MSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTE3OSBmZjAxICBQUk8vMTAwIFZFIE5ldHdvcmsgQ29ubmVjdGlvbgotCQkxMTg2IDc4MDEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTE0NGQgMjYwMiAgSG9tZVBOQSAxTSBDTlIKLQkJODA4NiAzMDEwICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQk4MDg2IDMwMTEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZNCi0JCTgwODYgMzAxMiAgODI1NjJFSCBiYXNlZCBQaG9uZWxpbmUKLQkJODA4NiAzMDEzICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQk4MDg2IDMwMTQgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZNCi0JCTgwODYgMzAxNSAgODI1NjJFSCBiYXNlZCBQaG9uZWxpbmUKLQkJODA4NiAzMDE2ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBQIE1vYmlsZSBDb21ibwotCQk4MDg2IDMwMTcgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFAgTW9iaWxlCi0JCTgwODYgMzAxOCAgRXRoZXJFeHByZXNzIFBSTy8xMDAKLQkyNDRhICA4MjgwMUJBTSBJREUgVTEwMAotCQkxMDI1IDEwMTYgIFRyYXZlbG1hdGUgNjEyVFgKLQkJMTA0ZCA4MGRmICBWYWlvIFBDRy1GWDQwMwotCTI0NGIgIDgyODAxQkEgSURFIFUxMDAKLQkJMTAxNCAwMWM2ICBOZXR2aXN0YSBBNDAvQTQwcAotCQkxMDI4IDAxMGUgIE9wdGlwbGV4IEdYMjQwCi0JCTEwNDMgODAyNyAgVFVTTDItQyBNYWluYm9hcmQKLQkJMTQ3YiAwNTA3ICBUSDdJSS1SQUlECi0JCTgwODYgNDUzMiAgRDgxNUVFQTIgbWFpbmJvYXJkCi0JCTgwODYgNDU1NyAgRDgxNUVHRVcgTWFpbmJvYXJkCi0JMjQ0YyAgODI4MDFCQU0gSVNBIEJyaWRnZSAoTFBDKQotCTI0NGUgIDgyODAxIFBDSSBCcmlkZ2UKLQkJMTAxNCAwMjY3ICBOZXRWaXN0YSBBMzBwCi0JMjQ1MCAgODI4MDFFIElTQSBCcmlkZ2UgKExQQykKLQkyNDUyICA4MjgwMUUgVVNCCi0JMjQ1MyAgODI4MDFFIFNNQnVzCi0JMjQ1OSAgODI4MDFFIEV0aGVybmV0IENvbnRyb2xsZXIgMAotCTI0NWIgIDgyODAxRSBJREUgVTEwMAotCTI0NWQgIDgyODAxRSBFdGhlcm5ldCBDb250cm9sbGVyIDEKLQkyNDVlICA4MjgwMUUgUENJIEJyaWRnZQotCTI0ODAgIDgyODAxQ0EgTFBDIEludGVyZmFjZSBDb250cm9sbGVyCi0JMjQ4MiAgODI4MDFDQS9DQU0gVVNCIChIdWIgIzEpCi0JCTEwMTQgMDIyMCAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JCTE1ZDkgMzQ4MCAgUDREUDYKLQkJODA4NiAxOTU4ICB2cHIgTWF0cml4IDE3MEI0Ci0JCTgwODYgMzQyNCAgU0U3NTAxSEcyIE1haW5ib2FyZAotCQk4MDg2IDQ1NDEgIExhdGl0dWRlIEM2NDAKLQkyNDgzICA4MjgwMUNBL0NBTSBTTUJ1cyBDb250cm9sbGVyCi0JCTEwMTQgMDIyMCAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JCTE1ZDkgMzQ4MCAgUDREUDYKLQkJODA4NiAxOTU4ICB2cHIgTWF0cml4IDE3MEI0Ci0JMjQ4NCAgODI4MDFDQS9DQU0gVVNCIChIdWIgIzIpCi0JCTEwMTQgMDIyMCAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JCTE1ZDkgMzQ4MCAgUDREUDYKLQkJODA4NiAxOTU4ICB2cHIgTWF0cml4IDE3MEI0Ci0JMjQ4NSAgODI4MDFDQS9DQU0gQUMnOTcgQXVkaW8gQ29udHJvbGxlcgotCQkxMDEzIDU5NTkgIENyeXN0YWwgV01EIEF1ZGlvIENvZGVjCi0JCTEwMTQgMDIyMiAgVGhpbmtQYWQgVDIzICgyNjQ3LTRNRykgb3IgQTMwL0EzMHAgKDI2NTIvMjY1MykKLQkJMTAxNCAwNTA4ICBUaGlua1BhZCBUMzAKLQkJMTAxNCAwNTFjICBUaGlua1BhZCBBL1QvWCBTZXJpZXMKLQkJMTA0ZCA4MGU3ICBWQUlPIFBDRy1HUjIxNEVQL0dSMjE0TVAvR1IyMTVNUC9HUjMxNE1QL0dSMzE1TVAKLQkJMTQ0ZCBjMDA2ICB2cHIgTWF0cml4IDE3MEI0Ci0JMjQ4NiAgODI4MDFDQS9DQU0gQUMnOTcgTW9kZW0gQ29udHJvbGxlcgotCQkxMDE0IDAyMjMgIFRoaW5rUGFkIEEvVC9YIFNlcmllcwotCQkxMDE0IDA1MDMgIFRoaW5rUGFkIFIzMSAyNjU2QkJHCi0JCTEwMTQgMDUxYSAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JCTEwMWYgMTAyNSAgQWNlciA2MjAgU2VyaWVzCi0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JCTExNzkgMDAwMSAgVG9zaGliYSBTYXRlbGxpdGUgMTExMCBaMTUgaW50ZXJuYWwgTW9kZW0KLQkJMTM0ZCA0YzIxICBEZWxsIEluc3Bpcm9uIDIxMDAgaW50ZXJuYWwgbW9kZW0KLQkJMTQ0ZCAyMTE1ICB2cHIgTWF0cml4IDE3MEI0IGludGVybmFsIG1vZGVtCi0JCTE0ZjEgNTQyMSAgTUQ1Nk9SRCBWLjkyIE1EQyBNb2RlbQotCTI0ODcgIDgyODAxQ0EvQ0FNIFVTQiAoSHViICMzKQotCQkxMDE0IDAyMjAgIFRoaW5rUGFkIEEvVC9YIFNlcmllcwotCQkxMDRkIDgwZTcgIFZBSU8gUENHLUdSMjE0RVAvR1IyMTRNUC9HUjIxNU1QL0dSMzE0TVAvR1IzMTVNUAotCQkxNWQ5IDM0ODAgIFA0RFA2Ci0JCTgwODYgMTk1OCAgdnByIE1hdHJpeCAxNzBCNAotCTI0OGEgIDgyODAxQ0FNIElERSBVMTAwCi0JCTEwMTQgMDIyMCAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JCTgwODYgMTk1OCAgdnByIE1hdHJpeCAxNzBCNAotCQk4MDg2IDQ1NDEgIExhdGl0dWRlIEM2NDAKLQkyNDhiICA4MjgwMUNBIFVsdHJhIEFUQSBTdG9yYWdlIENvbnRyb2xsZXIKLQkJMTVkOSAzNDgwICBQNERQNgotCTI0OGMgIDgyODAxQ0FNIElTQSBCcmlkZ2UgKExQQykKLQkyNGMwICA4MjgwMURCL0RCTCAoSUNINC9JQ0g0LUwpIExQQyBJbnRlcmZhY2UgQnJpZGdlCi0JCTEwMTQgMDI2NyAgTmV0VmlzdGEgQTMwcAotCQkxNDYyIDU4MDAgIDg0NVBFIE1heCAoTVMtNjU4MCkKLQkyNGMxICA4MjgwMURCTCAoSUNINC1MKSBJREUgQ29udHJvbGxlcgotCTI0YzIgIDgyODAxREIvREJML0RCTSAoSUNINC9JQ0g0LUwvSUNINC1NKSBVU0IgVUhDSSBDb250cm9sbGVyICMxCi0JCTEwMTQgMDI2NyAgTmV0VmlzdGEgQTMwcAotCQkxMDI1IDAwNWEgIFRyYXZlbE1hdGUgMjkwCi0JCTEwMjggMDEyNiAgT3B0aXBsZXggR1gyNjAKLQkJMTAyOCAwMTYzICBMYXRpdHVkZSBENTA1Ci0JCTEwM2MgMDg4YyAgbmM4MDAwIGxhcHRvcAotCQkxMDNjIDA4OTAgIG5jNjAwMCBsYXB0b3AKLQkJMTA3MSA4MTYwICBNSU0yMDAwCi0JCTE0NjIgNTgwMCAgODQ1UEUgTWF4IChNUy02NTgwKQotCQkxNTA5IDI5OTAgIEF2ZXJhdGVjIDUxMTBIIGxhcHRvcAotCQk0YzUzIDEwOTAgIEN4OSAvIFZ4OSBtYWluYm9hcmQKLQkyNGMzICA4MjgwMURCL0RCTC9EQk0gKElDSDQvSUNINC1ML0lDSDQtTSkgU01CdXMgQ29udHJvbGxlcgotCQkxMDE0IDAyNjcgIE5ldFZpc3RhIEEzMHAKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDI4IDAxMjYgIE9wdGlwbGV4IEdYMjYwCi0JCTEwM2MgMDg4YyAgbmM4MDAwIGxhcHRvcAotCQkxMDNjIDA4OTAgIG5jNjAwMCBsYXB0b3AKLQkJMTA3MSA4MTYwICBNSU0yMDAwCi0JCTE0NTggMjRjMiAgR0EtOFBFNjY3IFVsdHJhCi0JCTE0NjIgNTgwMCAgODQ1UEUgTWF4IChNUy02NTgwKQotCQk0YzUzIDEwOTAgIEN4OSAvIFZ4OSBtYWluYm9hcmQKLQkyNGM0ICA4MjgwMURCL0RCTC9EQk0gKElDSDQvSUNINC1ML0lDSDQtTSkgVVNCIFVIQ0kgQ29udHJvbGxlciAjMgotCQkxMDE0IDAyNjcgIE5ldFZpc3RhIEEzMHAKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDI4IDAxMjYgIE9wdGlwbGV4IEdYMjYwCi0JCTEwMjggMDE2MyAgTGF0aXR1ZGUgRDUwNQotCQkxMDNjIDA4OGMgIG5jODAwMCBsYXB0b3AKLQkJMTAzYyAwODkwICBuYzYwMDAgbGFwdG9wCi0JCTEwNzEgODE2MCAgTUlNMjAwMAotCQkxNDYyIDU4MDAgIDg0NVBFIE1heCAoTVMtNjU4MCkKLQkJMTUwOSAyOTkwICBBdmVyYXRlYyA1MTEwSAotCQk0YzUzIDEwOTAgIEN4OSAvIFZ4OSBtYWluYm9hcmQKLQkyNGM1ICA4MjgwMURCL0RCTC9EQk0gKElDSDQvSUNINC1ML0lDSDQtTSkgQUMnOTcgQXVkaW8gQ29udHJvbGxlcgotCQkwZTExIDAwYjggIEFuYWxvZyBEZXZpY2VzIEluYy4gY29kZWMgW1NvdW5kTUFYXQotCQkxMDE0IDAyNjcgIE5ldFZpc3RhIEEzMHAKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDI4IDAxNjMgIExhdGl0dWRlIEQ1MDUKLQkJMTAzYyAwODhjICBuYzgwMDAgbGFwdG9wCi0JCTEwM2MgMDg5MCAgbmM2MDAwIGxhcHRvcAotCQkxMDcxIDgxNjAgIE1JTTIwMDAKLQkJMTQ1OCBhMDAyICBHQS04UEU2NjcgVWx0cmEKLQkJMTQ2MiA1ODAwICA4NDVQRSBNYXggKE1TLTY1ODApCi0JMjRjNiAgODI4MDFEQi9EQkwvREJNIChJQ0g0L0lDSDQtTC9JQ0g0LU0pIEFDJzk3IE1vZGVtIENvbnRyb2xsZXIKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDNjIDA4OGMgIG5jODAwMCBsYXB0b3AKLQkJMTAzYyAwODkwICBuYzYwMDAgbGFwdG9wCi0JCTEwNzEgODE2MCAgTUlNMjAwMAotCTI0YzcgIDgyODAxREIvREJML0RCTSAoSUNINC9JQ0g0LUwvSUNINC1NKSBVU0IgVUhDSSBDb250cm9sbGVyICMzCi0JCTEwMTQgMDI2NyAgTmV0VmlzdGEgQTMwcAotCQkxMDI1IDAwNWEgIFRyYXZlbE1hdGUgMjkwCi0JCTEwMjggMDEyNiAgT3B0aXBsZXggR1gyNjAKLQkJMTAyOCAwMTYzICBMYXRpdHVkZSBENTA1Ci0JCTEwM2MgMDg4YyAgbmM4MDAwIGxhcHRvcAotCQkxMDNjIDA4OTAgIG5jNjAwMCBsYXB0b3AKLQkJMTA3MSA4MTYwICBNSU0yMDAwCi0JCTE0NjIgNTgwMCAgODQ1UEUgTWF4IChNUy02NTgwKQotCQkxNTA5IDI5OTAgIEF2ZXJhdGVjIDUxMTBICi0JCTRjNTMgMTA5MCAgQ3g5IC8gVng5IG1haW5ib2FyZAotCTI0Y2EgIDgyODAxREJNIChJQ0g0LU0pIElERSBDb250cm9sbGVyCi0JCTEwMjUgMDA1YSAgVHJhdmVsTWF0ZSAyOTAKLQkJMTAyOCAwMTYzICBMYXRpdHVkZSBENTA1Ci0JCTEwM2MgMDg4YyAgbmM4MDAwIGxhcHRvcAotCQkxMDNjIDA4OTAgIG5jNjAwMCBsYXB0b3AKLQkJMTA3MSA4MTYwICBNSU0yMDAwCi0JMjRjYiAgODI4MDFEQiAoSUNINCkgSURFIENvbnRyb2xsZXIKLQkJMTAxNCAwMjY3ICBOZXRWaXN0YSBBMzBwCi0JCTEwMjggMDEyNiAgT3B0aXBsZXggR1gyNjAKLQkJMTQ1OCAyNGMyICBHQS04UEU2NjcgVWx0cmEKLQkJMTQ2MiA1ODAwICA4NDVQRSBNYXggKE1TLTY1ODApCi0JCTRjNTMgMTA5MCAgQ3g5IC8gVng5IG1haW5ib2FyZAotCTI0Y2MgIDgyODAxREJNIChJQ0g0LU0pIExQQyBJbnRlcmZhY2UgQnJpZGdlCi0JMjRjZCAgODI4MDFEQi9EQk0gKElDSDQvSUNINC1NKSBVU0IyIEVIQ0kgQ29udHJvbGxlcgotCQkxMDE0IDAyNjcgIE5ldFZpc3RhIEEzMHAKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDI4IDAxMjYgIE9wdGlwbGV4IEdYMjYwCi0JCTEwMjggMDE2MyAgTGF0aXR1ZGUgRDUwNQotCQkxMDNjIDA4OGMgIG5jODAwMCBsYXB0b3AKLQkJMTAzYyAwODkwICBuYzYwMDAgbGFwdG9wCi0JCTEwNzEgODE2MCAgTUlNMjAwMAotCQkxNDYyIDM5ODEgIDg0NVBFIE1heCAoTVMtNjU4MCkKLQkJMTUwOSAxOTY4ICBBdmVyYXRlYyA1MTEwSAotCQk0YzUzIDEwOTAgIEN4OSAvIFZ4OSBtYWluYm9hcmQKLQkyNGQwICA4MjgwMUVCL0VSIChJQ0g1L0lDSDVSKSBMUEMgSW50ZXJmYWNlIEJyaWRnZQotCTI0ZDEgIDgyODAxRUIgKElDSDUpIFNBVEEgQ29udHJvbGxlcgotCQkxMDNjIDEyYmMgIGQ1MzAgQ01UIChERzc0NkEpCi0JCTE0NTggMjRkMSAgR0EtOElQRTEwMDAgUHJvMiBtb3RoZXJib2FyZCAoODY1UEUpCi0JCTE0NjIgNzI4MCAgODY1UEUgTmVvMiAoTVMtNjcyOCkKLQkJODA4NiAzNDI3ICBTODc1V1AxLUUgbWFpbmJvYXJkCi0JCTgwODYgNTI0YyAgRDg2NVBFUkwgbWFpbmJvYXJkCi0JMjRkMiAgODI4MDFFQi9FUiAoSUNINS9JQ0g1UikgVVNCIFVIQ0kgQ29udHJvbGxlciAjMQotCQkxMDI4IDAxODMgIFBvd2VyRWRnZSAxODAwCi0JCTEwM2MgMTJiYyAgZDUzMCBDTVQgKERHNzQ2QSkKLQkJMTA0MyA4MGE2ICBQNFA4MDAgTWFpbmJvYXJkCi0JCTE0NTggMjRkMiAgR0EtOElQRTEwMDAvOEtOWFAgbW90aGVyYm9hcmQKLQkJMTQ2MiA3MjgwICA4NjVQRSBOZW8yIChNUy02NzI4KQotCQk4MDg2IDM0MjcgIFM4NzVXUDEtRSBtYWluYm9hcmQKLQkJODA4NiA1MjRjICBEODY1UEVSTCBtYWluYm9hcmQKLQkyNGQzICA4MjgwMUVCL0VSIChJQ0g1L0lDSDVSKSBTTUJ1cyBDb250cm9sbGVyCi0JCTEwNDMgODBhNiAgUDRQODAwIE1haW5ib2FyZAotCQkxNDU4IDI0ZDIgIEdBLThJUEUxMDAwIFBybzIgbW90aGVyYm9hcmQgKDg2NVBFKQotCQkxNDYyIDcyODAgIDg2NVBFIE5lbzIgKE1TLTY3MjgpCi0JCTgwODYgMzQyNyAgUzg3NVdQMS1FIG1haW5ib2FyZAotCQk4MDg2IDUyNGMgIEQ4NjVQRVJMIG1haW5ib2FyZAotCTI0ZDQgIDgyODAxRUIvRVIgKElDSDUvSUNINVIpIFVTQiBVSENJIENvbnRyb2xsZXIgIzIKLQkJMTAyOCAwMTgzICBQb3dlckVkZ2UgMTgwMAotCQkxMDNjIDEyYmMgIGQ1MzAgQ01UIChERzc0NkEpCi0JCTEwNDMgODBhNiAgUDRQODAwIE1haW5ib2FyZAotCQkxNDU4IDI0ZDIgIEdBLThJUEUxMDAwIFBybzIgbW90aGVyYm9hcmQgKDg2NVBFKQotCQkxNDYyIDcyODAgIDg2NVBFIE5lbzIgKE1TLTY3MjgpCi0JCTgwODYgMzQyNyAgUzg3NVdQMS1FIG1haW5ib2FyZAotCQk4MDg2IDUyNGMgIEQ4NjVQRVJMIG1haW5ib2FyZAotCTI0ZDUgIDgyODAxRUIvRVIgKElDSDUvSUNINVIpIEFDJzk3IEF1ZGlvIENvbnRyb2xsZXIKLQkJMTAzYyAxMmJjICBBbmFsb2cgRGV2aWNlcyBjb2RlYyBbU291bmRNQVggSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvXQotCQkxMDQzIDgwZjMgIFA0UDgwMCBNYWluYm9hcmQKLSMgQWdhaW4sIEkgc3VwcG9zZSB0aGV5IHVzZSB0aGUgc2FtZSBpbiBkaWZmZXJlbnQgc3Vic3lzdGVtcwotCQkxNDU4IGEwMDIgIEdBLThJUEUxMDAwLzhLTlhQIG1vdGhlcmJvYXJkCi0JCTE0NjIgNzI4MCAgODY1UEUgTmVvMiAoTVMtNjcyOCkKLQkJODA4NiBhMDAwICBEODY1UEVSTCBtYWluYm9hcmQKLQkJODA4NiBlMDAwICBEODY1UEVSTCBtYWluYm9hcmQKLQkyNGQ2ICA4MjgwMUVCL0VSIChJQ0g1L0lDSDVSKSBBQyc5NyBNb2RlbSBDb250cm9sbGVyCi0JMjRkNyAgODI4MDFFQi9FUiAoSUNINS9JQ0g1UikgVVNCIFVIQ0kgIzMKLQkJMTAyOCAwMTgzICBQb3dlckVkZ2UgMTgwMAotCQkxMDNjIDEyYmMgIGQ1MzAgQ01UIChERzc0NkEpCi0JCTEwNDMgODBhNiAgUDRQODAwIE1haW5ib2FyZAotCQkxNDU4IDI0ZDIgIEdBLThJUEUxMDAwIFBybzIgbW90aGVyYm9hcmQgKDg2NVBFKQotCQkxNDYyIDcyODAgIDg2NVBFIE5lbzIgKE1TLTY3MjgpCi0JCTgwODYgMzQyNyAgUzg3NVdQMS1FIG1haW5ib2FyZAotCQk4MDg2IDUyNGMgIEQ4NjVQRVJMIG1haW5ib2FyZAotCTI0ZGIgIDgyODAxRUIvRVIgKElDSDUvSUNINVIpIElERSBDb250cm9sbGVyCi0JCTEwM2MgMTJiYyAgZDUzMCBDTVQgKERHNzQ2QSkKLQkJMTA0MyA4MGE2ICBQNFA4MDAgTWFpbmJvYXJkCi0JCTE0NTggMjRkMiAgR0EtOElQRTEwMDAgUHJvMiBtb3RoZXJib2FyZCAoODY1UEUpCi0JCTE0NjIgNzI4MCAgODY1UEUgTmVvMiAoTVMtNjcyOCkKLQkJMTQ2MiA3NTgwICBNU0kgODc1UAotCQk4MDg2IDI0ZGIgIFA0QzgwMCBNYWluYm9hcmQKLQkJODA4NiAzNDI3ICBTODc1V1AxLUUgbWFpbmJvYXJkCi0JCTgwODYgNTI0YyAgRDg2NVBFUkwgbWFpbmJvYXJkCi0JMjRkYyAgODI4MDFFQiAoSUNINSkgTFBDIEludGVyZmFjZSBCcmlkZ2UKLQkyNGRkICA4MjgwMUVCL0VSIChJQ0g1L0lDSDVSKSBVU0IyIEVIQ0kgQ29udHJvbGxlcgotCQkxMDI4IDAxODMgIFBvd2VyRWRnZSAxODAwCi0JCTEwM2MgMTJiYyAgZDUzMCBDTVQgKERHNzQ2QSkKLQkJMTA0MyA4MGE2ICBQNFA4MDAgTWFpbmJvYXJkCi0JCTE0NTggNTAwNiAgR0EtOElQRTEwMDAgUHJvMiBtb3RoZXJib2FyZCAoODY1UEUpCi0JCTE0NjIgNzI4MCAgODY1UEUgTmVvMiAoTVMtNjcyOCkKLQkJODA4NiAzNDI3ICBTODc1V1AxLUUgbWFpbmJvYXJkCi0JCTgwODYgNTI0YyAgRDg2NVBFUkwgbWFpbmJvYXJkCi0JMjRkZSAgODI4MDFFQi9FUiAoSUNINS9JQ0g1UikgVVNCIFVIQ0kgQ29udHJvbGxlciAjNAotCQkxMDQzIDgwYTYgIFA0UDgwMCBNYWluYm9hcmQKLQkJMTQ1OCAyNGQyICBHQS04SVBFMTAwMCBQcm8yIG1vdGhlcmJvYXJkICg4NjVQRSkKLQkJMTQ2MiA3MjgwICA4NjVQRSBOZW8yIChNUy02NzI4KQotCQk4MDg2IDM0MjcgIFM4NzVXUDEtRSBtYWluYm9hcmQKLQkJODA4NiA1MjRjICBEODY1UEVSTCBtYWluYm9hcmQKLQkyNGRmICA4MjgwMUVSIChJQ0g1UikgU0FUQSBDb250cm9sbGVyCi0JMjUwMCAgODI4MjAgODIwIChDYW1pbm8pIENoaXBzZXQgSG9zdCBCcmlkZ2UgKE1DSCkKLQkJMTAyOCAwMDk1ICBQcmVjaXNpb24gV29ya3N0YXRpb24gMjIwIENoaXBzZXQKLQkJMTA0MyA4MDFjICBQM0MtMjAwMCBzeXN0ZW0gY2hpcHNldAotCTI1MDEgIDgyODIwIDgyMCAoQ2FtaW5vKSBDaGlwc2V0IEhvc3QgQnJpZGdlIChNQ0gpCi0JCTEwNDMgODAxYyAgUDNDLTIwMDAgc3lzdGVtIGNoaXBzZXQKLQkyNTBiICA4MjgyMCA4MjAgKENhbWlubykgQ2hpcHNldCBIb3N0IEJyaWRnZQotCTI1MGYgIDgyODIwIDgyMCAoQ2FtaW5vKSBDaGlwc2V0IEFHUCBCcmlkZ2UKLQkyNTIwICA4MjgwNUFBIE1USCBNZW1vcnkgVHJhbnNsYXRvciBIdWIKLQkyNTIxICA4MjgwNEFBIE1SSC1TIE1lbW9yeSBSZXBlYXRlciBIdWIgZm9yIFNEUkFNCi0JMjUzMCAgODI4NTAgODUwIChUZWhhbWEpIENoaXBzZXQgSG9zdCBCcmlkZ2UgKE1DSCkKLQkJMTQ3YiAwNTA3ICBUSDdJSS1SQUlECi0JMjUzMSAgODI4NjAgODYwIChXb21iYXQpIENoaXBzZXQgSG9zdCBCcmlkZ2UgKE1DSCkKLQkyNTMyICA4Mjg1MCA4NTAgKFRlaGFtYSkgQ2hpcHNldCBBR1AgQnJpZGdlCi0JMjUzMyAgODI4NjAgODYwIChXb21iYXQpIENoaXBzZXQgQUdQIEJyaWRnZQotCTI1MzQgIDgyODYwIDg2MCAoV29tYmF0KSBDaGlwc2V0IFBDSSBCcmlkZ2UKLQkyNTQwICBFNzUwMCBNZW1vcnkgQ29udHJvbGxlciBIdWIKLQkJMTVkOSAzNDgwICBQNERQNgotCTI1NDEgIEU3NTAwL0U3NTAxIEhvc3QgUkFTVU0gQ29udHJvbGxlcgotCQkxNWQ5IDM0ODAgIFA0RFA2Ci0JCTRjNTMgMTA5MCAgQ3g5IC8gVng5IG1haW5ib2FyZAotCQk4MDg2IDM0MjQgIFNFNzUwMUhHMiBNYWluYm9hcmQKLQkyNTQzICBFNzUwMC9FNzUwMSBIdWIgSW50ZXJmYWNlIEIgUENJLXRvLVBDSSBCcmlkZ2UKLQkyNTQ0ICBFNzUwMC9FNzUwMSBIdWIgSW50ZXJmYWNlIEIgUkFTVU0gQ29udHJvbGxlcgotCQk0YzUzIDEwOTAgIEN4OSAvIFZ4OSBtYWluYm9hcmQKLQkyNTQ1ICBFNzUwMC9FNzUwMSBIdWIgSW50ZXJmYWNlIEMgUENJLXRvLVBDSSBCcmlkZ2UKLQkyNTQ2ICBFNzUwMC9FNzUwMSBIdWIgSW50ZXJmYWNlIEMgUkFTVU0gQ29udHJvbGxlcgotCTI1NDcgIEU3NTAwL0U3NTAxIEh1YiBJbnRlcmZhY2UgRCBQQ0ktdG8tUENJIEJyaWRnZQotCTI1NDggIEU3NTAwL0U3NTAxIEh1YiBJbnRlcmZhY2UgRCBSQVNVTSBDb250cm9sbGVyCi0JMjU0YyAgRTc1MDEgTWVtb3J5IENvbnRyb2xsZXIgSHViCi0JCTRjNTMgMTA5MCAgQ3g5IC8gVng5IG1haW5ib2FyZAotCQk4MDg2IDM0MjQgIFNFNzUwMUhHMiBNYWluYm9hcmQKLQkyNTUwICBFNzUwNSBNZW1vcnkgQ29udHJvbGxlciBIdWIKLQkyNTUxICBFNzUwNS9FNzIwNSBTZXJpZXMgUkFTIENvbnRyb2xsZXIKLQkyNTUyICBFNzUwNS9FNzIwNSBQQ0ktdG8tQUdQIEJyaWRnZQotCTI1NTMgIEU3NTA1IEh1YiBJbnRlcmZhY2UgQiBQQ0ktdG8tUENJIEJyaWRnZQotCTI1NTQgIEU3NTA1IEh1YiBJbnRlcmZhY2UgQiBQQ0ktdG8tUENJIEJyaWRnZSBSQVMgQ29udHJvbGxlcgotCTI1NWQgIEU3MjA1IE1lbW9yeSBDb250cm9sbGVyIEh1YgotCTI1NjAgIDgyODQ1Ry9HTFtCcm9va2RhbGUtR10vR0UvUEUgRFJBTSBDb250cm9sbGVyL0hvc3QtSHViIEludGVyZmFjZQotCQkxMDI4IDAxMjYgIE9wdGlwbGV4IEdYMjYwCi0JCTE0NTggMjU2MCAgR0EtOFBFNjY3IFVsdHJhCi0JCTE0NjIgNTgwMCAgODQ1UEUgTWF4IChNUy02NTgwKQotCTI1NjEgIDgyODQ1Ry9HTFtCcm9va2RhbGUtR10vR0UvUEUgSG9zdC10by1BR1AgQnJpZGdlCi0JMjU2MiAgODI4NDVHL0dMW0Jyb29rZGFsZS1HXS9HRSBDaGlwc2V0IEludGVncmF0ZWQgR3JhcGhpY3MgRGV2aWNlCi0JCTEwMTQgMDI2NyAgTmV0VmlzdGEgQTMwcAotCTI1NzAgIDgyODY1Ry9QRS9QIERSQU0gQ29udHJvbGxlci9Ib3N0LUh1YiBJbnRlcmZhY2UKLQkJMTA0MyA4MGYyICBQNFA4MDAgTWFpbmJvYXJkCi0JCTE0NTggMjU3MCAgR0EtOElQRTEwMDAgUHJvMiBtb3RoZXJib2FyZCAoODY1UEUpCi0JMjU3MSAgODI4NjVHL1BFL1AgUENJIHRvIEFHUCBDb250cm9sbGVyCi0JMjU3MiAgODI4NjVHIEludGVncmF0ZWQgR3JhcGhpY3MgQ29udHJvbGxlcgotCTI1NzMgIDgyODY1Ry9QRS9QIFBDSSB0byBDU0EgQnJpZGdlCi0JMjU3NiAgODI4NjVHL1BFL1AgUHJvY2Vzc29yIHRvIEkvTyBNZW1vcnkgSW50ZXJmYWNlCi0JMjU3OCAgODI4NzVQL0U3MjEwIE1lbW9yeSBDb250cm9sbGVyIEh1YgotCQkxNDU4IDI1NzggIEdBLThLTlhQIG1vdGhlcmJvYXJkICg4NzVQKQotCQkxNDYyIDc1ODAgIE1TLTY3NTggKDg3NVAgTmVvKQotIyBNb3RoZXJib2FyZCBQNFNDRQotCQkxNWQ5IDQ1ODAgIFN1cGVyIE1pY3JvIENvbXB1dGVyIEluYy4gUDRTQ0UKLQkyNTc5ICA4Mjg3NVAgUHJvY2Vzc29yIHRvIEFHUCBDb250cm9sbGVyCi0JMjU3YiAgODI4NzVQL0U3MjEwIFByb2Nlc3NvciB0byBQQ0kgdG8gQ1NBIEJyaWRnZQotCTI1N2UgIDgyODc1UC9FNzIxMCBQcm9jZXNzb3IgdG8gSS9PIE1lbW9yeSBJbnRlcmZhY2UKLQkyNTgwICA5MTVHL1AvR1YvR0wvUEwvOTEwR0wgUHJvY2Vzc29yIHRvIEkvTyBDb250cm9sbGVyCi0JMjU4MSAgOTE1Ry9QL0dWL0dML1BMLzkxMEdMIFBDSSBFeHByZXNzIFJvb3QgUG9ydAotCTI1ODIgIDgyOTE1Ry9HVi85MTBHTCBFeHByZXNzIENoaXBzZXQgRmFtaWx5IEdyYXBoaWNzIENvbnRyb2xsZXIKLQkJMTAyOCAxMDc5ICBPcHRpcGxleCBHWDI4MAotCTI1ODQgIDkyNVgvWEUgTWVtb3J5IENvbnRyb2xsZXIgSHViCi0JMjU4NSAgOTI1WC9YRSBQQ0kgRXhwcmVzcyBSb290IFBvcnQKLQkyNTg4ICBFNzIyMC9FNzIyMSBNZW1vcnkgQ29udHJvbGxlciBIdWIKLQkyNTg5ICBFNzIyMC9FNzIyMSBQQ0kgRXhwcmVzcyBSb290IFBvcnQKLQkyNThhICBFNzIyMSBJbnRlZ3JhdGVkIEdyYXBoaWNzIENvbnRyb2xsZXIKLQkyNTkwICBNb2JpbGUgOTE1R00vUE0vR01TLzkxMEdNTCBFeHByZXNzIFByb2Nlc3NvciB0byBEUkFNIENvbnRyb2xsZXIKLQkyNTkxICBNb2JpbGUgOTE1R00vUE0gRXhwcmVzcyBQQ0kgRXhwcmVzcyBSb290IFBvcnQKLQkyNTkyICBNb2JpbGUgOTE1R00vR01TLzkxMEdNTCBFeHByZXNzIEdyYXBoaWNzIENvbnRyb2xsZXIKLQkyNWExICA2MzAwRVNCIExQQyBJbnRlcmZhY2UgQ29udHJvbGxlcgotCTI1YTIgIDYzMDBFU0IgUEFUQSBTdG9yYWdlIENvbnRyb2xsZXIKLQkJNGM1MyAxMGIwICBDTDkgbWFpbmJvYXJkCi0JMjVhMyAgNjMwMEVTQiBTQVRBIFN0b3JhZ2UgQ29udHJvbGxlcgotCQk0YzUzIDEwYjAgIENMOSBtYWluYm9hcmQKLQkyNWE0ICA2MzAwRVNCIFNNQnVzIENvbnRyb2xsZXIKLQkJNGM1MyAxMGIwICBDTDkgbWFpbmJvYXJkCi0JMjVhNiAgNjMwMEVTQiBBQyc5NyBBdWRpbyBDb250cm9sbGVyCi0JCTRjNTMgMTBiMCAgQ0w5IG1haW5ib2FyZAotCTI1YTcgIDYzMDBFU0IgQUMnOTcgTW9kZW0gQ29udHJvbGxlcgotCTI1YTkgIDYzMDBFU0IgVVNCIFVuaXZlcnNhbCBIb3N0IENvbnRyb2xsZXIKLQkJNGM1MyAxMGIwICBDTDkgbWFpbmJvYXJkCi0JMjVhYSAgNjMwMEVTQiBVU0IgVW5pdmVyc2FsIEhvc3QgQ29udHJvbGxlcgotCQk0YzUzIDEwYjAgIENMOSBtYWluYm9hcmQKLQkyNWFiICA2MzAwRVNCIFdhdGNoZG9nIFRpbWVyCi0JCTRjNTMgMTBiMCAgQ0w5IG1haW5ib2FyZAotCTI1YWMgIDYzMDBFU0IgSS9PIEFkdmFuY2VkIFByb2dyYW1tYWJsZSBJbnRlcnJ1cHQgQ29udHJvbGxlcgotCQk0YzUzIDEwYjAgIENMOSBtYWluYm9hcmQKLQkyNWFkICA2MzAwRVNCIFVTQjIgRW5oYW5jZWQgSG9zdCBDb250cm9sbGVyCi0JMjVhZSAgNjMwMEVTQiA2NC1iaXQgUENJLVggQnJpZGdlCi0JMjViMCAgNjMwMEVTQiBTQVRBIFJBSUQgQ29udHJvbGxlcgotCTI2MDAgIEU4NTAwIEh1YiBJbnRlcmZhY2UKLQkyNjAxICBFODUwMCBQQ0kgRXhwcmVzcyB4NCBQb3J0IEQKLQkyNjAyICBFODUwMCBQQ0kgRXhwcmVzcyB4NCBQb3J0IEMwCi0JMjYwMyAgRTg1MDAgUENJIEV4cHJlc3MgeDQgUG9ydCBDMQotCTI2MDQgIEU4NTAwIFBDSSBFeHByZXNzIHg0IFBvcnQgQjAKLQkyNjA1ICBFODUwMCBQQ0kgRXhwcmVzcyB4NCBQb3J0IEIxCi0JMjYwNiAgRTg1MDAgUENJIEV4cHJlc3MgeDQgUG9ydCBBMAotCTI2MDcgIEU4NTAwIFBDSSBFeHByZXNzIHg0IFBvcnQgQTEKLQkyNjA4ICBFODUwMCBQQ0kgRXhwcmVzcyB4OCBQb3J0IEMKLQkyNjA5ICBFODUwMCBQQ0kgRXhwcmVzcyB4OCBQb3J0IEIKLQkyNjBhICBFODUwMCBQQ0kgRXhwcmVzcyB4OCBQb3J0IEEKLQkyNjBjICBFODUwMCBJTUkgUmVnaXN0ZXJzCi0JMjYxMCAgRTg1MDAgU3lzdGVtIEJ1cywgQm9vdCwgYW5kIEludGVycnVwdCBSZWdpc3RlcnMKLQkyNjExICBFODUwMCBBZGRyZXNzIE1hcHBpbmcgUmVnaXN0ZXJzCi0JMjYxMiAgRTg1MDAgUkFTIFJlZ2lzdGVycwotCTI2MTMgIEU4NTAwIFJlc2VydmVkIFJlZ2lzdGVycwotCTI2MTQgIEU4NTAwIFJlc2VydmVkIFJlZ2lzdGVycwotCTI2MTUgIEU4NTAwIE1pc2NlbGxhbmVvdXMgUmVnaXN0ZXJzCi0JMjYxNyAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxOCAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxOSAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxYSAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxYiAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxYyAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxZCAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxZSAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYyMCAgRTg1MDAgZVh0ZXJuYWwgTWVtb3J5IEJyaWRnZQotCTI2MjEgIEU4NTAwIFhNQiBNaXNjZWxsYW5lb3VzIFJlZ2lzdGVycwotCTI2MjIgIEU4NTAwIFhNQiBNZW1vcnkgSW50ZXJsZWF2aW5nIFJlZ2lzdGVycwotCTI2MjMgIEU4NTAwIFhNQiBERFIgSW5pdGlhbGl6YXRpb24gYW5kIENhbGlicmF0aW9uCi0JMjYyNCAgRTg1MDAgWE1CIFJlc2VydmVkIFJlZ2lzdGVycwotCTI2MjUgIEU4NTAwIFhNQiBSZXNlcnZlZCBSZWdpc3RlcnMKLQkyNjI2ICBFODUwMCBYTUIgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYyNyAgRTg1MDAgWE1CIFJlc2VydmVkIFJlZ2lzdGVycwotCTI2NDAgIDgyODAxRkIvRlIgKElDSDYvSUNINlIpIExQQyBJbnRlcmZhY2UgQnJpZGdlCi0JMjY0MSAgODI4MDFGQk0gKElDSDZNKSBMUEMgSW50ZXJmYWNlIEJyaWRnZQotCTI2NDIgIDgyODAxRlcvRlJXIChJQ0g2Vy9JQ0g2UlcpIExQQyBJbnRlcmZhY2UgQnJpZGdlCi0JMjY1MSAgODI4MDFGQi9GVyAoSUNINi9JQ0g2VykgU0FUQSBDb250cm9sbGVyCi0JCTEwMjggMDE3OSAgT3B0aXBsZXggR1gyODAKLQkyNjUyICA4MjgwMUZSL0ZSVyAoSUNINlIvSUNINlJXKSBTQVRBIENvbnRyb2xsZXIKLQkyNjUzICA4MjgwMUZCTSAoSUNINk0pIFNBVEEgQ29udHJvbGxlcgotCTI2NTggIDgyODAxRkIvRkJNL0ZSL0ZXL0ZSVyAoSUNINiBGYW1pbHkpIFVTQiBVSENJICMxCi0JCTEwMjggMDE3OSAgT3B0aXBsZXggR1gyODAKLQkyNjU5ICA4MjgwMUZCL0ZCTS9GUi9GVy9GUlcgKElDSDYgRmFtaWx5KSBVU0IgVUhDSSAjMgotCQkxMDI4IDAxNzkgIE9wdGlwbGV4IEdYMjgwCi0JMjY1YSAgODI4MDFGQi9GQk0vRlIvRlcvRlJXIChJQ0g2IEZhbWlseSkgVVNCIFVIQ0kgIzMKLQkJMTAyOCAwMTc5ICBPcHRpcGxleCBHWDI4MAotCTI2NWIgIDgyODAxRkIvRkJNL0ZSL0ZXL0ZSVyAoSUNINiBGYW1pbHkpIFVTQiBVSENJICM0Ci0JCTEwMjggMDE3OSAgT3B0aXBsZXggR1gyODAKLQkyNjVjICA4MjgwMUZCL0ZCTS9GUi9GVy9GUlcgKElDSDYgRmFtaWx5KSBVU0IyIEVIQ0kgQ29udHJvbGxlcgotCQkxMDI4IDAxNzkgIE9wdGlwbGV4IEdYMjgwCi0JMjY2MCAgODI4MDFGQi9GQk0vRlIvRlcvRlJXIChJQ0g2IEZhbWlseSkgUENJIEV4cHJlc3MgUG9ydCAxCi0JMjY2MiAgODI4MDFGQi9GQk0vRlIvRlcvRlJXIChJQ0g2IEZhbWlseSkgUENJIEV4cHJlc3MgUG9ydCAyCi0JMjY2NCAgODI4MDFGQi9GQk0vRlIvRlcvRlJXIChJQ0g2IEZhbWlseSkgUENJIEV4cHJlc3MgUG9ydCAzCi0JMjY2NiAgODI4MDFGQi9GQk0vRlIvRlcvRlJXIChJQ0g2IEZhbWlseSkgUENJIEV4cHJlc3MgUG9ydCA0Ci0JMjY2OCAgODI4MDFGQi9GQk0vRlIvRlcvRlJXIChJQ0g2IEZhbWlseSkgSGlnaCBEZWZpbml0aW9uIEF1ZGlvIENvbnRyb2xsZXIKLQkyNjZhICA4MjgwMUZCL0ZCTS9GUi9GVy9GUlcgKElDSDYgRmFtaWx5KSBTTUJ1cyBDb250cm9sbGVyCi0JCTEwMjggMDE3OSAgT3B0aXBsZXggR1gyODAKLQkyNjZjICA4MjgwMUZCL0ZCTS9GUi9GVy9GUlcgKElDSDYgRmFtaWx5KSBMQU4gQ29udHJvbGxlcgotCTI2NmQgIDgyODAxRkIvRkJNL0ZSL0ZXL0ZSVyAoSUNINiBGYW1pbHkpIEFDJzk3IE1vZGVtIENvbnRyb2xsZXIKLQkyNjZlICA4MjgwMUZCL0ZCTS9GUi9GVy9GUlcgKElDSDYgRmFtaWx5KSBBQyc5NyBBdWRpbyBDb250cm9sbGVyCi0JCTEwMjggMDE3OSAgT3B0aXBsZXggR1gyODAKLQkyNjZmICA4MjgwMUZCL0ZCTS9GUi9GVy9GUlcgKElDSDYgRmFtaWx5KSBJREUgQ29udHJvbGxlcgotCTI3NzAgIE1lbW9yeSBDb250cm9sbGVyIEh1YgotCTI3NzEgIFBDSSBFeHByZXNzIEdyYXBoaWNzIFBvcnQKLQkyNzcyICBJbnRlZ3JhdGVkIEdyYXBoaWNzIENvbnRyb2xsZXIKLQkyNzc0ICBXb3Jrc3RhdGlvbiBNZW1vcnkgQ29udHJvbGxlciBIdWIKLQkyNzc1ICBQQ0kgRXhwcmVzcyBHcmFwaGljcyBQb3J0Ci0JMjc3NiAgSW50ZWdyYXRlZCBHcmFwaGljcyBDb250cm9sbGVyCi0JMjc3OCAgU2VydmVyIE1lbW9yeSBDb250cm9sbGVyIEh1YgotCTI3NzkgIFBDSSBFeHByZXNzIFJvb3QgUG9ydAotCTI3ODIgIDgyOTE1RyBFeHByZXNzIENoaXBzZXQgRmFtaWx5IEdyYXBoaWNzIENvbnRyb2xsZXIKLQkyNzkyICBNb2JpbGUgOTE1R00vR01TLzkxMEdNTCBFeHByZXNzIEdyYXBoaWNzIENvbnRyb2xsZXIKLQkyN2I4ICBJL08gQ29udHJvbGxlciBIdWIgTFBDCi0JMjdiOSAgTW9iaWxlIEkvTyBDb250cm9sbGVyIEh1YiBMUEMKLQkyN2MwICBJL08gQ29udHJvbGxlciBIdWIgU0FUQSBjYz1JREUKLQkyN2MxICBJL08gQ29udHJvbGxlciBIdWIgU0FUQSBjYz1BSENJCi0JMjdjMyAgSS9PIENvbnRyb2xsZXIgSHViIFNBVEEgY2M9UkFJRAotCTI3YzQgIE1vYmlsZSBJL08gQ29udHJvbGxlciBIdWIgU0FUQSBjYz1JREUKLQkyN2M1ICBNb2JpbGUgSS9PIENvbnRyb2xsZXIgSHViIFNBVEEgY2M9QUhDSQotCTI3YzggIEkvTyBDb250cm9sbGVyIEh1YiBVSENJIFVTQiAjMQotCTI3YzkgIEkvTyBDb250cm9sbGVyIEh1YiBVSENJIFVTQiAjMgotCTI3Y2EgIEkvTyBDb250cm9sbGVyIEh1YiBVSENJIFVTQiAjMwotCTI3Y2IgIEkvTyBDb250cm9sbGVyIEh1YiBVSENJIFVTQiAjNAotCTI3Y2MgIEkvTyBDb250cm9sbGVyIEh1YiBFSENJIFVTQgotCTI3ZDAgIEkvTyBDb250cm9sbGVyIEh1YiBQQ0kgRXhwcmVzcyBQb3J0IDEKLQkyN2QyICBJL08gQ29udHJvbGxlciBIdWIgUENJIEV4cHJlc3MgUG9ydCAyCi0JMjdkNCAgSS9PIENvbnRyb2xsZXIgSHViIFBDSSBFeHByZXNzIFBvcnQgMwotCTI3ZDYgIEkvTyBDb250cm9sbGVyIEh1YiBQQ0kgRXhwcmVzcyBQb3J0IDQKLQkyN2Q4ICBJL08gQ29udHJvbGxlciBIdWIgSGlnaCBEZWZpbml0aW9uIEF1ZGlvCi0JMjdkYSAgSS9PIENvbnRyb2xsZXIgSHViIFNNQnVzCi0JMjdkYyAgSS9PIENvbnRyb2xsZXIgSHViIExBTgotCTI3ZGQgIEkvTyBDb250cm9sbGVyIEh1YiBBQyc5NyBNb2RlbQotCTI3ZGUgIEkvTyBDb250cm9sbGVyIEh1YiBBQyc5NyBBdWRpbwotCTI3ZGYgIEkvTyBDb250cm9sbGVyIEh1YiBQQVRBCi0JMjdlMCAgSS9PIENvbnRyb2xsZXIgSHViIFBDSSBFeHByZXNzIFBvcnQgNQotCTI3ZTIgIEkvTyBDb250cm9sbGVyIEh1YiBQQ0kgRXhwcmVzcyBQb3J0IDYKLQkzMDkyICBJbnRlZ3JhdGVkIFJBSUQKLQkzMjAwICBHRDMxMjQ0IFBDSS1YIFNBVEEgSEJBCi0JMzM0MCAgODI4NTVQTSBQcm9jZXNzb3IgdG8gSS9PIENvbnRyb2xsZXIKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDNjIDA4OGMgIG5jODAwMCBsYXB0b3AKLQkJMTAzYyAwODkwICBuYzYwMDAgbGFwdG9wCi0JMzM0MSAgODI4NTVQTSBQcm9jZXNzb3IgdG8gQUdQIENvbnRyb2xsZXIKLQkzNTc1ICA4MjgzMCA4MzAgQ2hpcHNldCBIb3N0IEJyaWRnZQotCQkxMDE0IDAyMWQgIFRoaW5rUGFkIEEvVC9YIFNlcmllcwotCQkxMDRkIDgwZTcgIFZBSU8gUENHLUdSMjE0RVAvR1IyMTRNUC9HUjIxNU1QL0dSMzE0TVAvR1IzMTVNUAotCTM1NzYgIDgyODMwIDgzMCBDaGlwc2V0IEFHUCBCcmlkZ2UKLQkzNTc3ICA4MjgzMCBDR0MgW0NoaXBzZXQgR3JhcGhpY3MgQ29udHJvbGxlcl0KLQkJMTAxNCAwNTEzICBUaGlua1BhZCBBL1QvWCBTZXJpZXMKLQkzNTc4ICA4MjgzMCA4MzAgQ2hpcHNldCBIb3N0IEJyaWRnZQotCTM1ODAgIDgyODUyLzgyODU1IEdNL0dNRS9QTS9HTVYgUHJvY2Vzc29yIHRvIEkvTyBDb250cm9sbGVyCi0JCTEwMjggMDE2MyAgTGF0aXR1ZGUgRDUwNQotCQk0YzUzIDEwYjAgIENMOSBtYWluYm9hcmQKLQkzNTgxICA4Mjg1Mi84Mjg1NSBHTS9HTUUvUE0vR01WIFByb2Nlc3NvciB0byBBR1AgQ29udHJvbGxlcgotCTM1ODIgIDgyODUyLzg1NUdNIEludGVncmF0ZWQgR3JhcGhpY3MgRGV2aWNlCi0JCTEwMjggMDE2MyAgTGF0aXR1ZGUgRDUwNQotCQk0YzUzIDEwYjAgIENMOSBtYWluYm9hcmQKLQkzNTg0ICA4Mjg1Mi84Mjg1NSBHTS9HTUUvUE0vR01WIFByb2Nlc3NvciB0byBJL08gQ29udHJvbGxlcgotCQkxMDI4IDAxNjMgIExhdGl0dWRlIEQ1MDUKLQkJNGM1MyAxMGIwICBDTDkgbWFpbmJvYXJkCi0JMzU4NSAgODI4NTIvODI4NTUgR00vR01FL1BNL0dNViBQcm9jZXNzb3IgdG8gSS9PIENvbnRyb2xsZXIKLQkJMTAyOCAwMTYzICBMYXRpdHVkZSBENTA1Ci0JCTRjNTMgMTBiMCAgQ0w5IG1haW5ib2FyZAotCTM1OTAgIEU3NTIwIE1lbW9yeSBDb250cm9sbGVyIEh1YgotCTM1OTEgIEU3NTI1L0U3NTIwIEVycm9yIFJlcG9ydGluZyBSZWdpc3RlcnMKLQkzNTkyICBFNzMyMCBNZW1vcnkgQ29udHJvbGxlciBIdWIKLQkzNTkzICBFNzMyMCBFcnJvciBSZXBvcnRpbmcgUmVnaXN0ZXJzCi0JMzU5NCAgRTc1MjAgRE1BIENvbnRyb2xsZXIKLQkzNTk1ICBFNzUyNS9FNzUyMC9FNzMyMCBQQ0kgRXhwcmVzcyBQb3J0IEEKLQkzNTk2ICBFNzUyNS9FNzUyMC9FNzMyMCBQQ0kgRXhwcmVzcyBQb3J0IEExCi0JMzU5NyAgRTc1MjUvRTc1MjAgUENJIEV4cHJlc3MgUG9ydCBCCi0JMzU5OCAgRTc1MjAgUENJIEV4cHJlc3MgUG9ydCBCMQotCTM1OTkgIEU3NTIwIFBDSSBFeHByZXNzIFBvcnQgQwotCTM1OWEgIEU3NTIwIFBDSSBFeHByZXNzIFBvcnQgQzEKLQkzNTliICBFNzUyNS9FNzUyMC9FNzMyMCBFeHRlbmRlZCBDb25maWd1cmF0aW9uIFJlZ2lzdGVycwotCTM1OWUgIEU3NTI1IE1lbW9yeSBDb250cm9sbGVyIEh1YgotCTQyMjAgIFBSTy9XaXJlbGVzcyAyMjAwQkcKLQk0MjIzICBQUk8vV2lyZWxlc3MgMjkxNUFCRyBNaW5pUENJIEFkYXB0ZXIKLQk1MjAwICBFdGhlckV4cHJlc3MgUFJPLzEwMCBJbnRlbGxpZ2VudCBTZXJ2ZXIKLQk1MjAxICBFdGhlckV4cHJlc3MgUFJPLzEwMCBJbnRlbGxpZ2VudCBTZXJ2ZXIKLQkJODA4NiAwMDAxICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTZXJ2ZXIgRXRoZXJuZXQgQWRhcHRlcgotCTUzMGQgIDgwMzEwIElPUCBbSU8gUHJvY2Vzc29yXQotCTcwMDAgIDgyMzcxU0IgUElJWDMgSVNBIFtOYXRvbWEvVHJpdG9uIElJXQotCTcwMTAgIDgyMzcxU0IgUElJWDMgSURFIFtOYXRvbWEvVHJpdG9uIElJXQotCTcwMjAgIDgyMzcxU0IgUElJWDMgVVNCIFtOYXRvbWEvVHJpdG9uIElJXQotCTcwMzAgIDQzMFZYIC0gODI0MzdWWCBUVlggW1RyaXRvbiBWWF0KLQk3MDUwICBJbnRlbCBJbnRlcmNhc3QgVmlkZW8gQ2FwdHVyZSBDYXJkCi0JNzEwMCAgNDMwVFggLSA4MjQzOVRYIE1UWEMKLQk3MTEwICA4MjM3MUFCL0VCL01CIFBJSVg0IElTQQotCQkxNWFkIDE5NzYgIHZpcnR1YWxIVyB2MwotCTcxMTEgIDgyMzcxQUIvRUIvTUIgUElJWDQgSURFCi0JCTE1YWQgMTk3NiAgdmlydHVhbEhXIHYzCi0JNzExMiAgODIzNzFBQi9FQi9NQiBQSUlYNCBVU0IKLQkJMTVhZCAxOTc2ICB2aXJ0dWFsSFcgdjMKLQk3MTEzICA4MjM3MUFCL0VCL01CIFBJSVg0IEFDUEkKLQkJMTVhZCAxOTc2ICB2aXJ0dWFsSFcgdjMKLQk3MTIwICA4MjgxMCBHTUNIIFtHcmFwaGljcyBNZW1vcnkgQ29udHJvbGxlciBIdWJdCi0JCTRjNTMgMTA0MCAgQ0w3IG1haW5ib2FyZAotCQk0YzUzIDEwNjAgIFBDNyBtYWluYm9hcmQKLQk3MTIxICA4MjgxMCBDR0MgW0NoaXBzZXQgR3JhcGhpY3MgQ29udHJvbGxlcl0KLQkJNGM1MyAxMDQwICBDTDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA2MCAgUEM3IG1haW5ib2FyZAotCQk4MDg2IDQzNDEgIENheW1hbiAoQ0E4MTApIE1haW5ib2FyZAotCTcxMjIgIDgyODEwIERDLTEwMCBHTUNIIFtHcmFwaGljcyBNZW1vcnkgQ29udHJvbGxlciBIdWJdCi0JNzEyMyAgODI4MTAgREMtMTAwIENHQyBbQ2hpcHNldCBHcmFwaGljcyBDb250cm9sbGVyXQotCTcxMjQgIDgyODEwRSBEQy0xMzMgR01DSCBbR3JhcGhpY3MgTWVtb3J5IENvbnRyb2xsZXIgSHViXQotCTcxMjUgIDgyODEwRSBEQy0xMzMgQ0dDIFtDaGlwc2V0IEdyYXBoaWNzIENvbnRyb2xsZXJdCi0JNzEyNiAgODI4MTAgREMtMTMzIFN5c3RlbSBhbmQgR3JhcGhpY3MgQ29udHJvbGxlcgotCTcxMjggIDgyODEwLU0gREMtMTAwIFN5c3RlbSBhbmQgR3JhcGhpY3MgQ29udHJvbGxlcgotCTcxMmEgIDgyODEwLU0gREMtMTMzIFN5c3RlbSBhbmQgR3JhcGhpY3MgQ29udHJvbGxlcgotCTcxODAgIDQ0MExYL0VYIC0gODI0NDNMWC9FWCBIb3N0IGJyaWRnZQotCTcxODEgIDQ0MExYL0VYIC0gODI0NDNMWC9FWCBBR1AgYnJpZGdlCi0JNzE5MCAgNDQwQlgvWlgvRFggLSA4MjQ0M0JYL1pYL0RYIEhvc3QgYnJpZGdlCi0JCTBlMTEgMDUwMCAgQXJtYWRhIDE3NTAgTGFwdG9wIFN5c3RlbSBDaGlwc2V0Ci0JCTBlMTEgYjExMCAgQXJtYWRhIE03MDAvRTUwMAotCQkxMTc5IDAwMDEgIFRvc2hpYmEgVGVjcmEgODEwMCBMYXB0b3AgU3lzdGVtIENoaXBzZXQKLQkJMTVhZCAxOTc2ICB2aXJ0dWFsSFcgdjMKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA1MSAgQ0U3IG1haW5ib2FyZAotCTcxOTEgIDQ0MEJYL1pYL0RYIC0gODI0NDNCWC9aWC9EWCBBR1AgYnJpZGdlCi0JNzE5MiAgNDQwQlgvWlgvRFggLSA4MjQ0M0JYL1pYL0RYIEhvc3QgYnJpZGdlIChBR1AgZGlzYWJsZWQpCi0JCTBlMTEgMDQ2MCAgQXJtYWRhIDE3MDAgTGFwdG9wIFN5c3RlbSBDaGlwc2V0Ci0JCTRjNTMgMTAwMCAgQ0M3L0NSNy9DUDcvVkM3L1ZQNy9WUjcgbWFpbmJvYXJkCi0JNzE5NCAgODI0NDBNWCBIb3N0IEJyaWRnZQotCQkxMDMzIDAwMDAgIFZlcnNhIE5vdGUgVnhpCi0JCTRjNTMgMTBhMCAgQ0EzL0NSMyBtYWluYm9hcmQKLQk3MTk1ICA4MjQ0ME1YIEFDJzk3IEF1ZGlvIENvbnRyb2xsZXIKLQkJMTAzMyA4MGNjICBWZXJzYSBOb3RlIFZYaQotCQkxMGNmIDEwOTkgIFFTb3VuZF9TaWdtYVRlbCBTdGFjOTcgUENJIEF1ZGlvCi0JCTExZDQgMDA0MCAgU291bmRNQVggSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvCi0JCTExZDQgMDA0OCAgU291bmRNQVggSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvCi0JNzE5NiAgODI0NDBNWCBBQyc5NyBNb2RlbSBDb250cm9sbGVyCi0JNzE5OCAgODI0NDBNWCBJU0EgQnJpZGdlCi0JNzE5OSAgODI0NDBNWCBFSURFIENvbnRyb2xsZXIKLQk3MTlhICA4MjQ0ME1YIFVTQiBVbml2ZXJzYWwgSG9zdCBDb250cm9sbGVyCi0JNzE5YiAgODI0NDBNWCBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2xsZXIKLQk3MWEwICA0NDBHWCAtIDgyNDQzR1ggSG9zdCBicmlkZ2UKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA1MSAgQ0U3IG1haW5ib2FyZAotCTcxYTEgIDQ0MEdYIC0gODI0NDNHWCBBR1AgYnJpZGdlCi0JNzFhMiAgNDQwR1ggLSA4MjQ0M0dYIEhvc3QgYnJpZGdlIChBR1AgZGlzYWJsZWQpCi0JCTRjNTMgMTAwMCAgQ0M3L0NSNy9DUDcvVkM3L1ZQNy9WUjcgbWFpbmJvYXJkCi0JNzYwMCAgODIzNzJGQiBQSUlYNSBJU0EKLQk3NjAxICA4MjM3MkZCIFBJSVg1IElERQotCTc2MDIgIDgyMzcyRkIgUElJWDUgVVNCCi0JNzYwMyAgODIzNzJGQiBQSUlYNSBTTUJ1cwotCTc4MDAgIDgyNzQwIChpNzQwKSBBR1AgR3JhcGhpY3MgQWNjZWxlcmF0b3IKLQkJMDAzZCAwMDA4ICBTdGFyZmlnaHRlciBBR1AKLQkJMDAzZCAwMDBiICBTdGFyZmlnaHRlciBBR1AKLQkJMTA5MiAwMTAwICBTdGVhbHRoIElJIEc0NjAKLQkJMTBiNCAyMDFhICBMaWdodHNwZWVkIDc0MAotCQkxMGI0IDIwMmYgIExpZ2h0c3BlZWQgNzQwCi0JCTgwODYgMDAwMCAgVGVybWluYXRvciAyeC9pCi0JCTgwODYgMDEwMCAgSW50ZWw3NDAgR3JhcGhpY3MgQWNjZWxlcmF0b3IKLQk4NGM0ICA0NTBLWC9HWCBbT3Jpb25dIC0gODI0NTRLWC9HWCBQQ0kgYnJpZGdlCi0JODRjNSAgNDUwS1gvR1ggW09yaW9uXSAtIDgyNDUzS1gvR1ggTWVtb3J5IGNvbnRyb2xsZXIKLQk4NGNhICA0NTBOWCAtIDgyNDUxTlggTWVtb3J5ICYgSS9PIENvbnRyb2xsZXIKLQk4NGNiICA0NTBOWCAtIDgyNDU0TlgvODQ0NjBHWCBQQ0kgRXhwYW5kZXIgQnJpZGdlCi0JODRlMCAgNDYwR1ggLSA4NDQ2MEdYIFN5c3RlbSBBZGRyZXNzIENvbnRyb2xsZXIgKFNBQykKLQk4NGUxICA0NjBHWCAtIDg0NDYwR1ggU3lzdGVtIERhdGEgQ29udHJvbGxlciAoU0RDKQotCTg0ZTIgIDQ2MEdYIC0gODQ0NjBHWCBBR1AgQnJpZGdlIChHWEIgZnVuY3Rpb24gMikKLQk4NGUzICA0NjBHWCAtIDg0NDYwR1ggTWVtb3J5IEFkZHJlc3MgQ29udHJvbGxlciAoTUFDKQotCTg0ZTQgIDQ2MEdYIC0gODQ0NjBHWCBNZW1vcnkgRGF0YSBDb250cm9sbGVyIChNREMpCi0JODRlNiAgNDYwR1ggLSA4MjQ2NkdYIFdpZGUgYW5kIGZhc3QgUENJIGVYcGFuZGVyIEJyaWRnZSAoV1hCKQotCTg0ZWEgIDQ2MEdYIC0gODQ0NjBHWCBBR1AgQnJpZGdlIChHWEIgZnVuY3Rpb24gMSkKLQk4NTAwICBJWFA0WFggLSBJbnRlbCBOZXR3b3JrIFByb2Nlc3NvciBmYW1pbHkuIElYUDQyMCwgSVhQNDIxLCBJWFA0MjIsIElYUDQyNSBhbmQgSVhDMTEwMAotCQkxOTkzIDBkZWUgIG1HdWFyZC1QQ0kgQVYjMQotCQkxOTkzIDBkZWYgIG1HdWFyZC1QQ0kgQVYjMAotCTkwMDAgIElYUDIwMDAgRmFtaWx5IE5ldHdvcmsgUHJvY2Vzc29yCi0JOTAwMSAgSVhQMjQwMCBOZXR3b3JrIFByb2Nlc3NvcgotCTkwMDQgIElYUDI4MDAgTmV0d29yayBQcm9jZXNzb3IKLQk5NjIxICBJbnRlZ3JhdGVkIFJBSUQKLQk5NjIyICBJbnRlZ3JhdGVkIFJBSUQKLQk5NjQxICBJbnRlZ3JhdGVkIFJBSUQKLQk5NmExICBJbnRlZ3JhdGVkIFJBSUQKLSMgcmV0YWlsIHZlcnNvbgotCWEwMWYgIFBSTy8xMEdiRSBMUiBTZXJ2ZXIgQWRhcHRlcgotIyBPRU0gdmVyc2lvbgotCWExMWYgIFBSTy8xMEdiRSBMUiBTZXJ2ZXIgQWRhcHRlcgotCWIxNTIgIDIxMTUyIFBDSS10by1QQ0kgQnJpZGdlCi0jIG9ic2VydmVkLCBhbmQgZG9jdW1lbnRlZCBpbiBJbnRlbCByZXZpc2lvbiBub3RlOyBuZXcgbWFzayBvZiAxMDExOjAwMjYKLQliMTU0ICAyMTE1NCBQQ0ktdG8tUENJIEJyaWRnZQotCWI1NTUgIDIxNTU1IE5vbiB0cmFuc3BhcmVudCBQQ0ktdG8tUENJIEJyaWRnZQotCQkxMmQ5IDAwMGEgIFBDSSBWb0lQIEdhdGV3YXkKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA1MSAgQ0U3IG1haW5ib2FyZAotCQllNGJmIDEwMDAgIENDOC0xLUJMVUVTCi0JZmZmZiAgNDUwTlgvR1ggW09yaW9uXSAtIDgyNDUzS1gvR1ggTWVtb3J5IGNvbnRyb2xsZXIgW0JVR10KLTg0MDEgIFRSRU5Ed2FyZSBJbnRlcm5hdGlvbmFsIEluYy4KLTg4MDAgIFRyaWdlbSBDb21wdXRlciBJbmMuCi0JMjAwOCAgVmlkZW8gYXNzaXN0ZW50IGNvbXBvbmVudAotODg2NiAgVC1TcXVhcmUgRGVzaWduIEluYy4KLTg4ODggIFNpbGljb24gTWFnaWMKLSMgOGM0YSBpcyBub3QgV2luYm9uZCBidXQgdGhlcmUgaXMgYSBib2FyZCBtaXNwcm9ncmFtbWVkCi04YzRhICBXaW5ib25kCi0JMTk4MCAgVzg5Qzk0MCBtaXNwcm9ncmFtbWVkIFtuZTJrXQotOGUwZSAgQ29tcHV0b25lIENvcnBvcmF0aW9uCi04ZTJlICBLVEkKLQkzMDAwICBFVDMyUDIKLTkwMDQgIEFkYXB0ZWMKLQkwMDc4ICBBSEEtMjk0MFVfQ04KLQkxMDc4ICBBSUMtNzgxMAotCTExNjAgIEFJQy0xMTYwIFtGYW1pbHkgRmlicmUgQ2hhbm5lbCBBZGFwdGVyXQotCTIxNzggIEFJQy03ODIxCi0JMzg2MCAgQUhBLTI5MzBDVQotCTNiNzggIEFIQS00ODQ0Vy80ODQ0VVcKLQk1MDc1ICBBSUMtNzU1eAotCTUwNzggIEFIQS03ODUwCi0JCTkwMDQgNzg1MCAgQUhBLTI5MDQvSW50ZWdyYXRlZCBBSUMtNzg1MAotCTUxNzUgIEFJQy03NTV4Ci0JNTE3OCAgQUlDLTc4NTEKLQk1Mjc1ICBBSUMtNzU1eAotCTUyNzggIEFJQy03ODUyCi0JNTM3NSAgQUlDLTc1NXgKLQk1Mzc4ICBBSUMtNzg1MAotCTU0NzUgIEFJQy03NTV4Ci0JNTQ3OCAgQUlDLTc4NTAKLQk1NTc1ICBBVkEtMjkzMAotCTU1NzggIEFJQy03ODU1Ci0JNTY0NyAgQU5BLTc3MTEgVENQIE9mZmxvYWQgRW5naW5lCi0JCTkwMDQgNzcxMCAgQU5BLTc3MTFGIFRDUCBPZmZsb2FkIEVuZ2luZSAtIE9wdGljYWwKLQkJOTAwNCA3NzExICBBTkEtNzcxMUxQIFRDUCBPZmZsb2FkIEVuZ2luZSAtIENvcHBlcgotCTU2NzUgIEFJQy03NTV4Ci0JNTY3OCAgQUlDLTc4NTYKLQk1Nzc1ICBBSUMtNzU1eAotCTU3NzggIEFJQy03ODUwCi0JNTgwMCAgQUlDLTU4MDAKLQk1OTAwICBBTkEtNTkxMC81OTMwLzU5NDAgQVRNMTU1ICYgMjUgTEFOIEFkYXB0ZXIKLQk1OTA1ICBBTkEtNTkxMEEvNTkzMEEvNTk0MEEgQVRNIEFkYXB0ZXIKLQk2MDM4ICBBSUMtMzg2MAotCTYwNzUgIEFJQy0xNDgwIC8gQVBBLTE0ODAKLQkJOTAwNCA3NTYwICBBSUMtMTQ4MCAvIEFQQS0xNDgwIENhcmRidXMKLQk2MDc4ICBBSUMtNzg2MAotCTYxNzggIEFJQy03ODYxCi0JCTkwMDQgNzg2MSAgQUhBLTI5NDBBVSBTaW5nbGUKLQk2Mjc4ICBBSUMtNzg2MAotCTYzNzggIEFJQy03ODYwCi0JNjQ3OCAgQUlDLTc4NngKLQk2NTc4ICBBSUMtNzg2eAotCTY2NzggIEFJQy03ODZ4Ci0JNjc3OCAgQUlDLTc4NngKLQk2OTE1ICBBTkE2MjB4eC9BTkE2OTAxMUEKLQkJOTAwNCAwMDA4ICBBTkE2OTAxMUEvVFggMTAvMTAwCi0JCTkwMDQgMDAwOSAgQU5BNjkwMTFBL1RYIDEwLzEwMAotCQk5MDA0IDAwMTAgIEFOQTYyMDIyIDItcG9ydCAxMC8xMDAKLQkJOTAwNCAwMDE4ICBBTkE2MjA0NCA0LXBvcnQgMTAvMTAwCi0JCTkwMDQgMDAxOSAgQU5BNjIwNDQgNC1wb3J0IDEwLzEwMAotCQk5MDA0IDAwMjAgIEFOQTYyMDIyIDItcG9ydCAxMC8xMDAKLQkJOTAwNCAwMDI4ICBBTkE2OTAxMUEvVFggMTAvMTAwCi0JCTkwMDQgODAwOCAgQU5BNjkwMTFBL1RYIDY0IGJpdCAxMC8xMDAKLQkJOTAwNCA4MDA5ICBBTkE2OTAxMUEvVFggNjQgYml0IDEwLzEwMAotCQk5MDA0IDgwMTAgIEFOQTYyMDIyIDItcG9ydCA2NCBiaXQgMTAvMTAwCi0JCTkwMDQgODAxOCAgQU5BNjIwNDQgNC1wb3J0IDY0IGJpdCAxMC8xMDAKLQkJOTAwNCA4MDE5ICBBTkE2MjA0NCA0LXBvcnQgNjQgYml0IDEwLzEwMAotCQk5MDA0IDgwMjAgIEFOQTYyMDIyIDItcG9ydCA2NCBiaXQgMTAvMTAwCi0JCTkwMDQgODAyOCAgQU5BNjkwMTFBL1RYIDY0IGJpdCAxMC8xMDAKLQk3MDc4ICBBSEEtMjk0eCAvIEFJQy03ODcwCi0JNzE3OCAgQUhBLTI5NDAvMjk0MFcgLyBBSUMtNzg3MQotCTcyNzggIEFIQS0zOTQwLzM5NDBXIC8gQUlDLTc4NzIKLQk3Mzc4ICBBSEEtMzk4NSAvIEFJQy03ODczCi0JNzQ3OCAgQUhBLTI5NDQvMjk0NFcgLyBBSUMtNzg3NAotCTc1NzggIEFIQS0zOTQ0LzM5NDRXIC8gQUlDLTc4NzUKLQk3Njc4ICBBSEEtNDk0NFcvVVcgLyBBSUMtNzg3NgotCTc3MTAgIEFOQS03NzExRiBOZXR3b3JrIEFjY2VsZXJhdG9yIENhcmQgKE5BQykgLSBPcHRpY2FsCi0JNzcxMSAgQU5BLTc3MTFDIE5ldHdvcmsgQWNjZWxlcmF0b3IgQ2FyZCAoTkFDKSAtIENvcHBlcgotCTc3NzggIEFJQy03ODd4Ci0JNzgxMCAgQUlDLTc4MTAKLQk3ODE1ICBBSUMtNzgxNSBSQUlEK01lbW9yeSBDb250cm9sbGVyIElDCi0JCTkwMDQgNzgxNSAgQVJPLTExMzBVMiBSQUlEIENvbnRyb2xsZXIKLQkJOTAwNCA3ODQwICBBSUMtNzgxNSBSQUlEK01lbW9yeSBDb250cm9sbGVyIElDCi0JNzg1MCAgQUlDLTc4NTAKLQk3ODU1ICBBSEEtMjkzMAotCTc4NjAgIEFJQy03ODYwCi0JNzg3MCAgQUlDLTc4NzAKLQk3ODcxICBBSEEtMjk0MAotCTc4NzIgIEFIQS0zOTQwCi0JNzg3MyAgQUhBLTM5ODAKLQk3ODc0ICBBSEEtMjk0NAotCTc4ODAgIEFJQy03ODgwUAotCTc4OTAgIEFJQy03ODkwCi0JNzg5MSAgQUlDLTc4OXgKLQk3ODkyICBBSUMtNzg5eAotCTc4OTMgIEFJQy03ODl4Ci0JNzg5NCAgQUlDLTc4OXgKLQk3ODk1ICBBSEEtMjk0MFUvVVcgLyBBSEEtMzl4eCAvIEFJQy03ODk1Ci0JCTkwMDQgNzg5MCAgQUhBLTI5NDBVLzI5NDBVVyBEdWFsIEFIQS0zOTR4QVUvQVVXL0FVV0QgQUlDLTc4OTVCCi0JCTkwMDQgNzg5MSAgQUhBLTI5NDBVLzI5NDBVVyBEdWFsCi0JCTkwMDQgNzg5MiAgQUhBLTM5NDBBVS9BVVcvQVVXRC9VV0QKLQkJOTAwNCA3ODk0ICBBSEEtMzk0NEFVV0QKLQkJOTAwNCA3ODk1ICBBSEEtMjk0MFUvMjk0MFVXIER1YWwgQUhBLTM5NHhBVS9BVVcvQVVXRCBBSUMtNzg5NUIKLQkJOTAwNCA3ODk2ICBBSEEtMjk0MFUvMjk0MFVXIER1YWwgQUhBLTM5NHhBVS9BVVcvQVVXRCBBSUMtNzg5NUIKLQkJOTAwNCA3ODk3ICBBSEEtMjk0MFUvMjk0MFVXIER1YWwgQUhBLTM5NHhBVS9BVVcvQVVXRCBBSUMtNzg5NUIKLQk3ODk2ICBBSUMtNzg5eAotCTc4OTcgIEFJQy03ODl4Ci0JODA3OCAgQUlDLTc4ODBVCi0JCTkwMDQgNzg4MCAgQUlDLTc4ODBQIFVsdHJhL1VsdHJhIFdpZGUgU0NTSSBDaGlwc2V0Ci0JODE3OCAgQUhBLTI5NDBVL1VXL0QgLyBBSUMtNzg4MVUKLQkJOTAwNCA3ODgxICBBSEEtMjk0MFVXIFNDU0kgSG9zdCBBZGFwdGVyCi0JODI3OCAgQUhBLTM5NDBVL1VXL1VXRCAvIEFJQy03ODgyVQotCTgzNzggIEFIQS0zOTQwVS9VVyAvIEFJQy03ODgzVQotCTg0NzggIEFIQS0yOTQ0VVcgLyBBSUMtNzg4NFUKLQk4NTc4ICBBSEEtMzk0NFUvVVdEIC8gQUlDLTc4ODUKLQk4Njc4ICBBSEEtNDk0NFVXIC8gQUlDLTc4ODYKLQk4Nzc4ICBBSEEtMjk0MFVXIFBybyAvIEFJQy03ODh4Ci0JCTkwMDQgNzg4NyAgMjk0MFVXIFBybyBVbHRyYS1XaWRlIFNDU0kgQ29udHJvbGxlcgotCTg4NzggIEFIQS0yOTMwVVcgLyBBSUMtNzg4OAotCQk5MDA0IDc4ODggIEFIQS0yOTMwVVcgU0NTSSBDb250cm9sbGVyCi0JOGI3OCAgQUJBLTEwMzAKLQllYzc4ICBBSEEtNDk0NFcvVVcKLTkwMDUgIEFkYXB0ZWMKLQkwMDEwICBBSEEtMjk0MFUyL1UyVwotCQk5MDA1IDIxODAgIEFIQS0yOTQwVTIgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgODEwMCAgQUhBLTI5NDBVMkIgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgYTEwMCAgQUhBLTI5NDBVMkIgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgYTE4MCAgQUhBLTI5NDBVMlcgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgZTEwMCAgQUhBLTI5NTBVMkIgU0NTSSBDb250cm9sbGVyCi0JMDAxMSAgQUhBLTI5MzBVMgotCTAwMTMgIDc4OTAyCi0JCTkwMDUgMDAwMyAgQUFBLTEzMVUyIEFycmF5MTAwMCAxIENoYW5uZWwgUkFJRCBDb250cm9sbGVyCi0JCTkwMDUgMDAwZiAgQUlDNzg5MF9BUk8KLQkwMDFmICBBSEEtMjk0MFUyL1UyVyAvIDc4OTAvNzg5MQotCQk5MDA1IDAwMGYgIDI5NDBVMlcgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgYTE4MCAgMjk0MFUyVyBTQ1NJIENvbnRyb2xsZXIKLQkwMDIwICBBSUMtNzg5MAotCTAwMmYgIEFJQy03ODkwCi0JMDAzMCAgQUlDLTc4OTAKLQkwMDNmICBBSUMtNzg5MAotCTAwNTAgIEFIQS0zOTQwVTJ4LzM5NVUyeAotCQk5MDA1IGY1MDAgIEFIQS0zOTUwVTJCCi0JCTkwMDUgZmZmZiAgQUhBLTM5NTBVMkIKLQkwMDUxICBBSEEtMzk1MFUyRAotCQk5MDA1IGI1MDAgIEFIQS0zOTUwVTJECi0JMDA1MyAgQUlDLTc4OTYgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgZmZmZiAgQUlDLTc4OTYgU0NTSSBDb250cm9sbGVyIG1haW5ib2FyZCBpbXBsZW1lbnRhdGlvbgotCTAwNWYgIEFJQy03ODk2VTIvNzg5N1UyCi0JMDA4MCAgQUlDLTc4OTJBIFUxNjAvbQotCQkwZTExIGUyYTAgIENvbXBhcSA2NC1CaXQvNjZNSHogV2lkZSBVbHRyYTMgU0NTSSBBZGFwdGVyCi0JCTkwMDUgNjIyMCAgQUhBLTI5MTYwQwotCQk5MDA1IDYyYTAgIDI5MTYwTiBVbHRyYTE2MCBTQ1NJIENvbnRyb2xsZXIKLQkJOTAwNSBlMjIwICAyOTE2MExQIExvdyBQcm9maWxlIFVsdHJhMTYwIFNDU0kgQ29udHJvbGxlcgotCQk5MDA1IGUyYTAgIDI5MTYwIFVsdHJhMTYwIFNDU0kgQ29udHJvbGxlcgotCTAwODEgIEFJQy03ODkyQiBVMTYwL20KLQkJOTAwNSA2MmExICAxOTE2MCBVbHRyYTE2MCBTQ1NJIENvbnRyb2xsZXIKLQkwMDgzICBBSUMtNzg5MkQgVTE2MC9tCi0JMDA4ZiAgQUlDLTc4OTJQIFUxNjAvbQotCQkxMTc5IDAwMDEgIE1hZ25pYSBaMzEwCi0JCTE1ZDkgOTAwNSAgT25ib2FyZCBTQ1NJIEhvc3QgQWRhcHRlcgotCTAwYzAgIEFIQS0zOTYwRCAvIEFJQy03ODk5QSBVMTYwL20KLQkJMGUxMSBmNjIwICBDb21wYXEgNjQtQml0LzY2TUh6IER1YWwgQ2hhbm5lbCBXaWRlIFVsdHJhMyBTQ1NJIEFkYXB0ZXIKLQkJOTAwNSBmNjIwICBBSEEtMzk2MEQgVTE2MC9tCi0JMDBjMSAgQUlDLTc4OTlCIFUxNjAvbQotCTAwYzMgIEFJQy03ODk5RCBVMTYwL20KLQkwMGM1ICBSQUlEIHN1YnN5c3RlbSBIQkEKLQkJMTAyOCAwMGM1ICBQb3dlckVkZ2UgMjQwMCwyNTAwLDI1NTAsNDQwMAotCTAwY2YgIEFJQy03ODk5UCBVMTYwL20KLQkJMTAyOCAwMGNlICBQb3dlckVkZ2UgMTQwMAotCQkxMDI4IDAwZDEgIFBvd2VyRWRnZSAyNTUwCi0JCTEwMjggMDBkOSAgUG93ZXJFZGdlIDI1MDAKLQkJMTBmMSAyNDYyICBUaHVuZGVyIEs3IFMyNDYyCi0JCTE1ZDkgOTAwNSAgT25ib2FyZCBTQ1NJIEhvc3QgQWRhcHRlcgotCQk4MDg2IDM0MTEgIFNEUzIgTWFpbmJvYXJkCi0JMDI1MCAgU2VydmVSQUlEIENvbnRyb2xsZXIKLQkJMTAxNCAwMjc5ICBTZXJ2ZVJBSUQteHgKLQkJMTAxNCAwMjhjICBTZXJ2ZVJBSUQteHgKLSMgZnJvbSBrZXJuZWwgc291cmNlcwotCTAyNzkgIFNlcnZlUkFJRCA2TQotCTAyODMgIEFBQy1SQUlECi0JCTkwMDUgMDI4MyAgQ2F0YXB1bHQKLQkwMjg0ICBBQUMtUkFJRAotCQk5MDA1IDAyODQgIFRvbWNhdAotCTAyODUgIEFBQy1SQUlECi0JCTBlMTEgMDI5NSAgU0FUQSA2Q2ggKEJlYXJjYXQpCi0JCTEwMTQgMDJmMiAgU2VydmVSQUlEIDhpCi0JCTEwMjggMDI4NyAgUG93ZXJFZGdlIEV4cGFuZGFibGUgUkFJRCBDb250cm9sbGVyIDMyMC9EQwotCQkxMDI4IDAyOTEgIENFUkMgU0FUQSBSQUlEIDIgUENJIFNBVEEgNmNoIChEZWxsQ29yc2FpcikKLQkJMTAzYyAzMjI3ICBBQVItMjYxMFNBCi0JCTE3YWEgMDI4NiAgTGVnZW5kIFMyMjAgKExlZ2VuZCBDcnVzYWRlcikKLQkJMTdhYSAwMjg3ICBMZWdlbmQgUzIzMCAoTGVnZW5kIFZ1bGNhbikKLQkJOTAwNSAwMjg1ICAyMjAwUyAoVnVsY2FuKQotCQk5MDA1IDAyODYgIDIxMjBTIChDcnVzYWRlcikKLQkJOTAwNSAwMjg3ICAyMjAwUyAoVnVsY2FuLTJtKQotCQk5MDA1IDAyODggIDMyMzBTIChIYXJyaWVyKQotCQk5MDA1IDAyODkgIDMyNDBTIChUb3JuYWRvKQotCQk5MDA1IDAyOGEgIEFTUi0yMDIwUyBQQ0ktWCBaQ1IgKFNreWhhd2spCi0JCTkwMDUgMDI4YiAgQVNSLTIwMjBTIFNPLURJTU0gUENJLVggWkNSIChUZXJtaW5hdG9yKQotCQk5MDA1IDAyOTAgIEFBUi0yNDEwU0EgUENJIFNBVEEgNGNoIChKYWd1YXIgSUkpCi0JCTkwMDUgMDI5MiAgQUFSLTI4MTBTQSBQQ0kgU0FUQSA4Y2ggKENvcnNhaXItOCkKLQkJOTAwNSAwMjkzICBBQVItMjE2MTBTQSBQQ0kgU0FUQSAxNmNoIChDb3JzYWlyLTE2KQotCQk5MDA1IDAyOTQgIEVTRCBTTy1ESU1NIFBDSS1YIFNBVEEgWkNSIChQcm93bGVyKQotCTAyODYgIEFBQy1SQUlEIChSb2NrZXQpCi0JCTkwMDUgMDI4YyAgQVNSLTIyMzBTICsgQVNSLTIyMzBTTFAgUENJLVggKExhbmNlcikKLQkwNTAzICBTY2FtcCBjaGlwc2V0IFNDU0kgY29udHJvbGxlcgotCQkxMDE0IDAyQkYgIFF1YWQgQ2hhbm5lbCBQQ0ktWCBERFIgVTMyMCBTQ1NJIFJBSUQgQWRhcHRlciAoNTcxRSkKLQk4MDAwICBBU0MtMjkzMjBBIFUzMjAKLQk4MDBmICBBSUMtNzkwMSBVMzIwCi0JODAxMCAgQVNDLTM5MzIwIFUzMjAKLQk4MDExICBBU0MtMzIzMjBEIFUzMjAKLQkJMGUxMSAwMGFjICBBU0MtMzkzMjBEIFUzMjAKLQkJOTAwNSAwMDQxICBBU0MtMzkzMjBEIFUzMjAKLQk4MDEyICBBU0MtMjkzMjAgVTMyMAotCTgwMTMgIEFTQy0yOTMyMEIgVTMyMAotCTgwMTQgIEFTQy0yOTMyMExQIFUzMjAKLQk4MDE1ICBBU0MtMzkzMjBCIFUzMjAKLQk4MDE2ICBBU0MtMzkzMjBBIFUzMjAKLQk4MDE3ICBBU0MtMjkzMjBBTFAgVTMyMAotCTgwMWMgIEFTQy0zOTMyMEQgVTMyMAotCTgwMWQgIEFJQy03OTAyQiBVMzIwCi0JODAxZSAgQUlDLTc5MDFBIFUzMjAKLQk4MDFmICBBSUMtNzkwMiBVMzIwCi0JODA4MCAgQVNDLTI5MzIwQSBVMzIwIHcvSG9zdFJBSUQKLQk4MDhmICBBSUMtNzkwMSBVMzIwIHcvSG9zdFJBSUQKLQk4MDkwICBBU0MtMzkzMjAgVTMyMCB3L0hvc3RSQUlECi0JODA5MSAgQVNDLTM5MzIwRCBVMzIwIHcvSG9zdFJBSUQKLQk4MDkyICBBU0MtMjkzMjAgVTMyMCB3L0hvc3RSQUlECi0JODA5MyAgQVNDLTI5MzIwQiBVMzIwIHcvSG9zdFJBSUQKLQk4MDk0ICBBU0MtMjkzMjBMUCBVMzIwIHcvSG9zdFJBSUQKLQk4MDk1ICBBU0MtMzkzMjAoQikgVTMyMCB3L0hvc3RSQUlECi0JODA5NiAgQVNDLTM5MzIwQSBVMzIwIHcvSG9zdFJBSUQKLQk4MDk3ICBBU0MtMjkzMjBBTFAgVTMyMCB3L0hvc3RSQUlECi0JODA5YyAgQVNDLTM5MzIwRChCKSBVMzIwIHcvSG9zdFJBSUQKLQk4MDlkICBBSUMtNzkwMihCKSBVMzIwIHcvSG9zdFJBSUQKLQk4MDllICBBSUMtNzkwMUEgVTMyMCB3L0hvc3RSQUlECi0JODA5ZiAgQUlDLTc5MDIgVTMyMCB3L0hvc3RSQUlECi05MDdmICBBdHJvbmljcwotCTIwMTUgIElERS0yMDE1UEwKLTkxOWEgIEdpZ2FwaXhlbCBDb3JwCi05NDEyICBIb2x0ZWsKLQk2NTY1ICA2NTY1Ci05Njk5ICBPbW5pIE1lZGlhIFRlY2hub2xvZ3kgSW5jCi0JNjU2NSAgNjU2NQotOTcxMCAgTmV0TW9zIFRlY2hub2xvZ3kKLQk3NzgwICBVU0IgSVJEQS1wb3J0Ci0JOTcwNSAgUENJIDk3MDUgUGFyYWxsZWwgUG9ydAotCTk3MTUgIFBDSSA5NzE1IER1YWwgUGFyYWxsZWwgUG9ydAotCTk3MzUgIFBDSSA5NzM1IE11bHRpLUkvTyBDb250cm9sbGVyCi0JCTEwMDAgMDAwMiAgMFAyUyAoMiBzZXJpYWwpCi0JCTEwMDAgMDAxMiAgMVAyUyAoMSBwYXJhbGxlbCArIDIgc2VyaWFsKQotCTk3NDUgIFBDSSA5NzQ1IE11bHRpLUkvTyBDb250cm9sbGVyCi0JCTEwMDAgMDAwMiAgMFAyUyAoMiBzZXJpYWwpCi0JCTEwMDAgMDAxMiAgMVAyUyAoMSBwYXJhbGxlbCArIDIgc2VyaWFsKQotCTk3NTUgIFBDSSA5NzU1IFBhcmFsbGVsIFBvcnQgYW5kIElTQSBCcmlkZ2UKLQk5ODA1ICBQQ0kgOTgwNSBQYXJhbGxlbCBQb3J0Ci0JOTgxNSAgUENJIDk4MTUgRHVhbCBQYXJhbGxlbCBQb3J0Ci0JCTEwMDAgMDAyMCAgMlAwUyAoMiBwb3J0IHBhcmFsbGVsIGFkYXB0b3IpCi0JOTgzNSAgUENJIDk4MzUgTXVsdGktSS9PIENvbnRyb2xsZXIKLQkJMTAwMCAwMDAyICAwUDJTICgxNkM1NTAgVUFSVCkKLQkJMTAwMCAwMDEyICAxUDJTCi0JOTg0NSAgUENJIDk4NDUgTXVsdGktSS9PIENvbnRyb2xsZXIKLQkJMTAwMCAwMDA0ICAwUDRTICg0IHBvcnQgMTY1NTBBIHNlcmlhbCBjYXJkKQotCQkxMDAwIDAwMDYgIDBQNlMgKDYgcG9ydCAxNjU1MEEgc2VyaWFsIGNhcmQpCi0JCTEwMDAgMDAxNCAgMVA0UyAoNCBwb3J0IDE2NTUwQSBzZXJpYWwgY2FyZCArIHBhcmFsbGVsKQotCTk4NTUgIFBDSSA5ODU1IE11bHRpLUkvTyBDb250cm9sbGVyCi0JCTEwMDAgMDAxNCAgMVA0UwotOTkwMiAgU3RhcmdlbiBJbmMuCi0JMDAwMSAgU0cyMDEwIFBDSSBvdmVyIFN0YXJmYWJyaWMgQnJpZGdlCi0JMDAwMiAgU0cyMDEwIFBDSSB0byBTdGFyZmFicmljIEdhdGV3YXkKLQkwMDAzICBTRzEwMTAgU3RhcmZhYnJpYyBTd2l0Y2ggYW5kIFBDSSBCcmlkZ2UKLWEwYTAgIEFPUEVOIEluYy4KLWEwZjEgIFVOSVNZUyBDb3Jwb3JhdGlvbgotYTIwMCAgTkVDIENvcnBvcmF0aW9uCi1hMjU5ICBIZXdsZXR0IFBhY2thcmQKLWEyNWIgIEhld2xldHQgUGFja2FyZCBHbWJIIFBMMjQtTUtUCi1hMzA0ICBTb255Ci1hNzI3ICAzQ29tIENvcnBvcmF0aW9uCi0JMDAxMyAgM0NSUEFHMTc1IFdpcmVsZXNzIFBDIENhcmQKLWFhNDIgIFNjaXRleCBEaWdpdGFsIFZpZGVvCi1hYzFlICBEaWdpdGFsIFJlY2VpdmVyIFRlY2hub2xvZ3kgSW5jCi1hYzNkICBBY3R1YWxpdHkgU3lzdGVtcwotYWVjYiAgQWRyaWVubmUgRWxlY3Ryb25pY3MgQ29ycG9yYXRpb24KLWIxYjMgIFNoaXZhIEV1cm9wZSBMaW1pdGVkCi0jIFBpbm5hY2xlIHNob3VsZCBiZSAxMWJkLCBidXQgdGhleSBnb3QgaXQgd3Jvbmcgc2V2ZXJhbCB0aW1lcyAtLW1qCi1iZDExICBQaW5uYWNsZSBTeXN0ZW1zLCBJbmMuIChXcm9uZyBJRCkKLWMwMDEgIFRTSSBUZWxzeXMKLWMwYTkgIE1pY3Jvbi9DcnVjaWFsIFRlY2hub2xvZ3kKLWMwZGUgIE1vdG9yb2xhCi1jMGZlICBNb3Rpb24gRW5naW5lZXJpbmcsIEluYy4KLWNhNTAgIFZhcmlhbiBBdXN0cmFsaWEgUHR5IEx0ZAotY2FmZSAgQ2hyeXNhbGlzLUlUUwotY2NjYyAgQ2F0YXB1bHQgQ29tbXVuaWNhdGlvbnMKLWNkZGQgIFR5engsIEluYy4KLQkwMTAxICBEZWVwU2VhIDEgSGlnaCBTcGVlZCBTdGVyZW8gVmlzaW9uIEZyYW1lIEdyYWJiZXIKLQkwMjAwICBEZWVwU2VhIDIgSGlnaCBTcGVlZCBTdGVyZW8gVmlzaW9uIEZyYW1lIEdyYWJiZXIKLWQ0ZDQgIER5NCBTeXN0ZW1zIEluYwotCTA2MDEgIFBDSSBNZXp6YW5pbmUgQ2FyZAotZDUzMSAgSStNRSBBQ1RJQSBHbWJICi1kODRkICBFeHN5cwotZGVhZCAgSW5kaWdpdGEgQ29ycG9yYXRpb24KLWRlYWYgIE1pZGRsZSBEaWdpdGFsIEluYy4KLQk5MDUwICBQQyBXZWFzZWwgVmlydHVhbCBWR0EKLQk5MDUxICBQQyBXZWFzZWwgU2VyaWFsIFBvcnQKLQk5MDUyICBQQyBXZWFzZWwgV2F0Y2hkb2cgVGltZXIKLWUwMDAgIFdpbmJvbmQKLQllMDAwICBXODlDOTQwCi0jIHNlZSBhbHNvIDogaHR0cDovL3d3dy5zY2hvZW5mZWxkLmRlL2luc2lkZS9JbnNpZGVfQ1dNSzMudHh0IG1heWJlIGEgbWlzdXNlIG9mIFRKTiBpZCBvciBpdCB1c2UgdGhlIFRKTiAzWFggY2hpcCBmb3Igb3RoZXIgYXBwbGljCi1lMTU5ICBUaWdlciBKZXQgTmV0d29yayBJbmMuCi0JMDAwMSAgVGlnZXIzWFggTW9kZW0vSVNETiBpbnRlcmZhY2UKLQkJMDA1OSAwMDAxICAxMjhrIElTRE4tUy9UIEFkYXB0ZXIKLQkJMDA1OSAwMDAzICAxMjhrIElTRE4tVSBBZGFwdGVyCi0JMDAwMiAgVGlnZXIxMDBBUEMgSVNETiBjaGlwc2V0Ci1lNGJmICBFS0YgRWxla3Ryb25payBHbWJICi0jIElubm92YXRpdmUgYW5kIHNjYWxhYmxlIG5ldHdvcmsgSUMgdmVuZG9yCi1lNTVlICBFc3NlbmNlIFRlY2hub2xvZ3ksIEluYy4KLWVhMDEgIEVhZ2xlIFRlY2hub2xvZ3kKLSMgVGhlIG1haW4gY2hpcCBvZiBhbGwgdGhlc2UgZGV2aWNlcyBpcyBieSBYaWxpbnggLT4gSXQgY291bGQgYWxzbyBiZSBhIFhpbGlueCBJRC4KLWVhNjAgIFJNRQotCTk4OTYgIERpZ2kzMgotCTk4OTcgIERpZ2kzMiBQcm8KLQk5ODk4ICBEaWdpMzIvOAotZWFiYiAgQWFzaGltYSBUZWNobm9sb2d5IEIuVi4KLWVhY2UgIEVuZGFjZSBNZWFzdXJlbWVudCBTeXN0ZW1zLCBMdGQKLQkzMTAwICBEQUcgMy4xMCBPQy0zL09DLTEyCi0JMzIwMCAgREFHIDMuMnggT0MtMy9PQy0xMgotCTMyMGUgIERBRyAzLjJFIEZhc3QgRXRoZXJuZXQKLQkzNDBlICBEQUcgMy40RSBGYXN0IEV0aGVybmV0Ci0JMzQxZSAgREFHIDMuNDFFIEZhc3QgRXRoZXJuZXQKLQkzNTAwICBEQUcgMy41IE9DLTMvT0MtMTIKLQkzNTFjICBEQUcgMy41RUNNIEZhc3QgRXRoZXJuZXQKLQk0MTAwICBEQUcgNC4xMCBPQy00OAotCTQxMTAgIERBRyA0LjExIE9DLTQ4Ci0JNDIyMCAgREFHIDQuMiBPQy00OAotCTQyMmUgIERBRyA0LjJFIER1YWwgR2lnYWJpdCBFdGhlcm5ldAotZWM4MCAgQmVsa2luIENvcnBvcmF0aW9uCi0JZWMwMCAgRjVENjAwMAotZWNjMCAgRWNobyBEaWdpdGFsIEF1ZGlvIENvcnBvcmF0aW9uCi1lZGQ4ICBBUksgTG9naWMgSW5jCi0JYTA5MSAgMTAwMFBWIFtTdGluZ3JheV0KLQlhMDk5ICAyMDAwUFYgW1N0aW5ncmF5XQotCWEwYTEgIDIwMDBNVAotCWEwYTkgIDIwMDBNSQotZjFkMCAgQUpBIFZpZGVvCi0jIEFsbCBib2FyZHMgSSBoYXZlIHNlZW4gaGF2ZSB0aGlzIElEIG5vdCBlZmFjLCB0aG91Z2ggYWxsIGRvY3Mgc2F5IGVmYWMuLi4KLQljYWZlICBLT05BIFNEIFNNUFRFIDI1OU0gSS9PCi0JZWZhYyAgS09OQSBTRCBTTVBURSAyNTlNIEkvTwotCWZhY2QgIEtPTkEgSEQgU01QVEUgMjkyTSBJL08KLWZhNTcgIEludGVyYWdvbiBBUwotCTAwMDEgIFBNQyBbUGF0dGVybiBNYXRjaGluZyBDaGlwXQotZmViZCAgVWx0cmF2aWV3IENvcnAuCi1mZWRhICBCcm9hZGNvbSBJbmMgKG5lZSBFcGlncmFtKQotCWEwZmEgIEJDTTQyMTAgaUxpbmUxMCBIb21lUE5BIDIuMAotCWExMGUgIEJDTTQyMzAgaUxpbmUxMCBIb21lUE5BIDIuMAotIyBJVCAmIFRlbGVjb20gY29tcGFueSwgZGV2ZWxvcHMgUENJIFRydW5rIGNhcmRzIDx3d3cuZmVkZXRlYy5lcz4KLWZlZGUgIEZlZGV0ZWMgSW5jLgotCTAwMDMgIFRBQklDIFBDSSB2MwotZmZmZSAgVk1XYXJlIEluYwotCTA0MDUgIFZpcnR1YWwgU1ZHQSA0LjAKLQkwNzEwICBWaXJ0dWFsIFNWR0EKLWZmZmYgIElsbGVnYWwgVmVuZG9yIElECi0KLQotIyBMaXN0IG9mIGtub3duIGRldmljZSBjbGFzc2VzLCBzdWJjbGFzc2VzIGFuZCBwcm9ncmFtbWluZyBpbnRlcmZhY2VzCi0KLSMgU3ludGF4OgotIyBDIGNsYXNzCWNsYXNzX25hbWUKLSMJc3ViY2xhc3MJc3ViY2xhc3NfbmFtZSAgCQk8LS0gc2luZ2xlIHRhYgotIwkJcHJvZy1pZiAgcHJvZy1pZl9uYW1lICAJPC0tIHR3byB0YWJzCi0KLUMgMDAgIFVuY2xhc3NpZmllZCBkZXZpY2UKLQkwMCAgTm9uLVZHQSB1bmNsYXNzaWZpZWQgZGV2aWNlCi0JMDEgIFZHQSBjb21wYXRpYmxlIHVuY2xhc3NpZmllZCBkZXZpY2UKLUMgMDEgIE1hc3Mgc3RvcmFnZSBjb250cm9sbGVyCi0JMDAgIFNDU0kgc3RvcmFnZSBjb250cm9sbGVyCi0JMDEgIElERSBpbnRlcmZhY2UKLQkwMiAgRmxvcHB5IGRpc2sgY29udHJvbGxlcgotCTAzICBJUEkgYnVzIGNvbnRyb2xsZXIKLQkwNCAgUkFJRCBidXMgY29udHJvbGxlcgotCTgwICBVbmtub3duIG1hc3Mgc3RvcmFnZSBjb250cm9sbGVyCi1DIDAyICBOZXR3b3JrIGNvbnRyb2xsZXIKLQkwMCAgRXRoZXJuZXQgY29udHJvbGxlcgotCTAxICBUb2tlbiByaW5nIG5ldHdvcmsgY29udHJvbGxlcgotCTAyICBGRERJIG5ldHdvcmsgY29udHJvbGxlcgotCTAzICBBVE0gbmV0d29yayBjb250cm9sbGVyCi0JMDQgIElTRE4gY29udHJvbGxlcgotCTgwICBOZXR3b3JrIGNvbnRyb2xsZXIKLUMgMDMgIERpc3BsYXkgY29udHJvbGxlcgotCTAwICBWR0EgY29tcGF0aWJsZSBjb250cm9sbGVyCi0JCTAwICBWR0EKLQkJMDEgIDg1MTQKLQkwMSAgWEdBIGNvbXBhdGlibGUgY29udHJvbGxlcgotCTAyICAzRCBjb250cm9sbGVyCi0JODAgIERpc3BsYXkgY29udHJvbGxlcgotQyAwNCAgTXVsdGltZWRpYSBjb250cm9sbGVyCi0JMDAgIE11bHRpbWVkaWEgdmlkZW8gY29udHJvbGxlcgotCTAxICBNdWx0aW1lZGlhIGF1ZGlvIGNvbnRyb2xsZXIKLQkwMiAgQ29tcHV0ZXIgdGVsZXBob255IGRldmljZQotCTgwICBNdWx0aW1lZGlhIGNvbnRyb2xsZXIKLUMgMDUgIE1lbW9yeSBjb250cm9sbGVyCi0JMDAgIFJBTSBtZW1vcnkKLQkwMSAgRkxBU0ggbWVtb3J5Ci0JODAgIE1lbW9yeSBjb250cm9sbGVyCi1DIDA2ICBCcmlkZ2UKLQkwMCAgSG9zdCBicmlkZ2UKLQkwMSAgSVNBIGJyaWRnZQotCTAyICBFSVNBIGJyaWRnZQotCTAzICBNaWNyb0NoYW5uZWwgYnJpZGdlCi0JMDQgIFBDSSBicmlkZ2UKLQkJMDAgIE5vcm1hbCBkZWNvZGUKLQkJMDEgIFN1YnRyYWN0aXZlIGRlY29kZQotCTA1ICBQQ01DSUEgYnJpZGdlCi0JMDYgIE51QnVzIGJyaWRnZQotCTA3ICBDYXJkQnVzIGJyaWRnZQotCTA4ICBSQUNFd2F5IGJyaWRnZQotCQkwMCAgVHJhbnNwYXJlbnQgbW9kZQotCQkwMSAgRW5kcG9pbnQgbW9kZQotCTA5ICBTZW1pLXRyYW5zcGFyZW50IFBDSS10by1QQ0kgYnJpZGdlCi0JCTQwICBQcmltYXJ5IGJ1cyB0b3dhcmRzIGhvc3QgQ1BVCi0JCTgwICBTZWNvbmRhcnkgYnVzIHRvd2FyZHMgaG9zdCBDUFUKLQkwYSAgSW5maW5pQmFuZCB0byBQQ0kgaG9zdCBicmlkZ2UKLQk4MCAgQnJpZGdlCi1DIDA3ICBDb21tdW5pY2F0aW9uIGNvbnRyb2xsZXIKLQkwMCAgU2VyaWFsIGNvbnRyb2xsZXIKLQkJMDAgIDgyNTAKLQkJMDEgIDE2NDUwCi0JCTAyICAxNjU1MAotCQkwMyAgMTY2NTAKLQkJMDQgIDE2NzUwCi0JCTA1ICAxNjg1MAotCQkwNiAgMTY5NTAKLQkwMSAgUGFyYWxsZWwgY29udHJvbGxlcgotCQkwMCAgU1BQCi0JCTAxICBCaURpcgotCQkwMiAgRUNQCi0JCTAzICBJRUVFMTI4NAotCQlmZSAgSUVFRTEyODQgVGFyZ2V0Ci0JMDIgIE11bHRpcG9ydCBzZXJpYWwgY29udHJvbGxlcgotCTAzICBNb2RlbQotCQkwMCAgR2VuZXJpYwotCQkwMSAgSGF5ZXMvMTY0NTAKLQkJMDIgIEhheWVzLzE2NTUwCi0JCTAzICBIYXllcy8xNjY1MAotCQkwNCAgSGF5ZXMvMTY3NTAKLQk4MCAgQ29tbXVuaWNhdGlvbiBjb250cm9sbGVyCi1DIDA4ICBHZW5lcmljIHN5c3RlbSBwZXJpcGhlcmFsCi0JMDAgIFBJQwotCQkwMCAgODI1OQotCQkwMSAgSVNBIFBJQwotCQkwMiAgRUlTQSBQSUMKLQkJMTAgIElPLUFQSUMKLQkJMjAgIElPKFgpLUFQSUMKLQkwMSAgRE1BIGNvbnRyb2xsZXIKLQkJMDAgIDgyMzcKLQkJMDEgIElTQSBETUEKLQkJMDIgIEVJU0EgRE1BCi0JMDIgIFRpbWVyCi0JCTAwICA4MjU0Ci0JCTAxICBJU0EgVGltZXIKLQkJMDIgIEVJU0EgVGltZXJzCi0JMDMgIFJUQwotCQkwMCAgR2VuZXJpYwotCQkwMSAgSVNBIFJUQwotCTA0ICBQQ0kgSG90LXBsdWcgY29udHJvbGxlcgotCTgwICBTeXN0ZW0gcGVyaXBoZXJhbAotQyAwOSAgSW5wdXQgZGV2aWNlIGNvbnRyb2xsZXIKLQkwMCAgS2V5Ym9hcmQgY29udHJvbGxlcgotCTAxICBEaWdpdGl6ZXIgUGVuCi0JMDIgIE1vdXNlIGNvbnRyb2xsZXIKLQkwMyAgU2Nhbm5lciBjb250cm9sbGVyCi0JMDQgIEdhbWVwb3J0IGNvbnRyb2xsZXIKLQkJMDAgIEdlbmVyaWMKLQkJMTAgIEV4dGVuZGVkCi0JODAgIElucHV0IGRldmljZSBjb250cm9sbGVyCi1DIDBhICBEb2NraW5nIHN0YXRpb24KLQkwMCAgR2VuZXJpYyBEb2NraW5nIFN0YXRpb24KLQk4MCAgRG9ja2luZyBTdGF0aW9uCi1DIDBiICBQcm9jZXNzb3IKLQkwMCAgMzg2Ci0JMDEgIDQ4NgotCTAyICBQZW50aXVtCi0JMTAgIEFscGhhCi0JMjAgIFBvd2VyIFBDCi0JMzAgIE1JUFMKLQk0MCAgQ28tcHJvY2Vzc29yCi1DIDBjICBTZXJpYWwgYnVzIGNvbnRyb2xsZXIKLQkwMCAgRmlyZVdpcmUgKElFRUUgMTM5NCkKLQkJMDAgIEdlbmVyaWMKLQkJMTAgIE9IQ0kKLQkwMSAgQUNDRVNTIEJ1cwotCTAyICBTU0EKLQkwMyAgVVNCIENvbnRyb2xsZXIKLQkJMDAgIFVIQ0kKLQkJMTAgIE9IQ0kKLQkJMjAgIEVIQ0kKLQkJODAgIFVuc3BlY2lmaWVkCi0JCWZlICBVU0IgRGV2aWNlCi0JMDQgIEZpYnJlIENoYW5uZWwKLQkwNSAgU01CdXMKLQkwNiAgSW5maW5pQmFuZAotQyAwZCAgV2lyZWxlc3MgY29udHJvbGxlcgotCTAwICBJUkRBIGNvbnRyb2xsZXIKLQkwMSAgQ29uc3VtZXIgSVIgY29udHJvbGxlcgotCTEwICBSRiBjb250cm9sbGVyCi0JODAgIFdpcmVsZXNzIGNvbnRyb2xsZXIKLUMgMGUgIEludGVsbGlnZW50IGNvbnRyb2xsZXIKLQkwMCAgSTJPCi1DIDBmICBTYXRlbGxpdGUgY29tbXVuaWNhdGlvbnMgY29udHJvbGxlcgotCTAwICBTYXRlbGxpdGUgVFYgY29udHJvbGxlcgotCTAxICBTYXRlbGxpdGUgYXVkaW8gY29tbXVuaWNhdGlvbiBjb250cm9sbGVyCi0JMDMgIFNhdGVsbGl0ZSB2b2ljZSBjb21tdW5pY2F0aW9uIGNvbnRyb2xsZXIKLQkwNCAgU2F0ZWxsaXRlIGRhdGEgY29tbXVuaWNhdGlvbiBjb250cm9sbGVyCi1DIDEwICBFbmNyeXB0aW9uIGNvbnRyb2xsZXIKLQkwMCAgTmV0d29yayBhbmQgY29tcHV0aW5nIGVuY3J5cHRpb24gZGV2aWNlCi0JMTAgIEVudGVydGFpbm1lbnQgZW5jcnlwdGlvbiBkZXZpY2UKLQk4MCAgRW5jcnlwdGlvbiBjb250cm9sbGVyCi1DIDExICBTaWduYWwgcHJvY2Vzc2luZyBjb250cm9sbGVyCi0JMDAgIERQSU8gbW9kdWxlCi0JMDEgIFBlcmZvcm1hbmNlIGNvdW50ZXJzCi0JMTAgIENvbW11bmljYXRpb24gc3luY2hyb25pemVyCi0JODAgIFNpZ25hbCBwcm9jZXNzaW5nIGNvbnRyb2xsZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwppbmRleCAzMGJhYzdlLi4zYzU2NWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCkBAIC05MCwxNSArOTAsMTkgQEAKIAkJcGNpX3NhdmVfbXNpX3N0YXRlKGRldik7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaWVfcG9ydGRydl9yZXN0b3JlX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIGludCBwY2llX3BvcnRkcnZfcmVzdG9yZV9jb25maWcoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcGNpZV9wb3J0X2RldmljZV9leHQgKnBfZXh0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldHZhbDsKIAogCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CiAJaWYgKHBfZXh0LT5pbnRlcnJ1cHRfbW9kZSA9PSBQQ0lFX1BPUlRfTVNJX01PREUpCiAJCXBjaV9yZXN0b3JlX21zaV9zdGF0ZShkZXYpOwotCXBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOwogCXBjaV9zZXRfbWFzdGVyKGRldik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9iZS5jIGIvZHJpdmVycy9wY2kvcHJvYmUuYwppbmRleCA5M2U4YTg3Li4yNmE1NWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9iZS5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKQEAgLTcyLDExICs3MiwxMyBAQAogLyoKICAqIFBDSSBCdXMgQ2xhc3MgRGV2aWNlcwogICovCi1zdGF0aWMgc3NpemVfdCBwY2lfYnVzX3Nob3dfY3B1YWZmaW5pdHkoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwY2lfYnVzX3Nob3dfY3B1YWZmaW5pdHkoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LAorCQkJCQljaGFyICpidWYpCiB7Ci0JY3B1bWFza190IGNwdW1hc2sgPSBwY2lidXNfdG9fY3B1bWFzayh0b19wY2lfYnVzKGNsYXNzX2RldikpOwogCWludCByZXQ7CisJY3B1bWFza190IGNwdW1hc2s7CiAKKwljcHVtYXNrID0gcGNpYnVzX3RvX2NwdW1hc2sodG9fcGNpX2J1cyhjbGFzc19kZXYpKTsKIAlyZXQgPSBjcHVtYXNrX3NjbnByaW50ZihidWYsIFBBR0VfU0laRSwgY3B1bWFzayk7CiAJaWYgKHJldCA8IFBBR0VfU0laRSkKIAkJYnVmW3JldCsrXSA9ICdcbic7CkBAIC01ODQsNyArNTg2LDcgQEAKIAkJIGRldi0+dmVuZG9yLCBkZXYtPmRldmljZSwgY2xhc3MsIGRldi0+aGRyX3R5cGUpOwogCiAJLyogIlVua25vd24gcG93ZXIgc3RhdGUiICovCi0JZGV2LT5jdXJyZW50X3N0YXRlID0gNDsKKwlkZXYtPmN1cnJlbnRfc3RhdGUgPSBQQ0lfVU5LTk9XTjsKIAogCS8qIEVhcmx5IGZpeHVwcywgYmVmb3JlIHByb2JpbmcgdGhlIEJBUnMgKi8KIAlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9lYXJseSwgZGV2KTsKQEAgLTc1MywyOSArNzU1LDE5IEBACiAJCWtmcmVlKGRldik7CiAJCXJldHVybiBOVUxMOwogCX0KLQlkZXZpY2VfaW5pdGlhbGl6ZSgmZGV2LT5kZXYpOwotCWRldi0+ZGV2LnJlbGVhc2UgPSBwY2lfcmVsZWFzZV9kZXY7Ci0JcGNpX2Rldl9nZXQoZGV2KTsKLQotCXBjaV9uYW1lX2RldmljZShkZXYpOwotCi0JZGV2LT5kZXYuZG1hX21hc2sgPSAmZGV2LT5kbWFfbWFzazsKLQlkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZ1bGw7CiAKIAlyZXR1cm4gZGV2OwogfQogCi1zdHJ1Y3QgcGNpX2RldiAqIF9fZGV2aW5pdAotcGNpX3NjYW5fc2luZ2xlX2RldmljZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgZGV2Zm4pCit2b2lkIF9fZGV2aW5pdCBwY2lfZGV2aWNlX2FkZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJZGV2aWNlX2luaXRpYWxpemUoJmRldi0+ZGV2KTsKKwlkZXYtPmRldi5yZWxlYXNlID0gcGNpX3JlbGVhc2VfZGV2OworCXBjaV9kZXZfZ2V0KGRldik7CiAKLQlkZXYgPSBwY2lfc2Nhbl9kZXZpY2UoYnVzLCBkZXZmbik7Ci0JcGNpX3NjYW5fbXNpX2RldmljZShkZXYpOworCWRldi0+ZGV2LmRtYV9tYXNrID0gJmRldi0+ZG1hX21hc2s7CisJZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmdWxsOwogCi0JaWYgKCFkZXYpCi0JCXJldHVybiBOVUxMOwotCQogCS8qIEZpeCB1cCBicm9rZW4gaGVhZGVycyAqLwogCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX2hlYWRlciwgZGV2KTsKIApAQCAtNzg3LDYgKzc3OSwxOSBAQAogCXNwaW5fbG9jaygmcGNpX2J1c19sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZkZXYtPmJ1c19saXN0LCAmYnVzLT5kZXZpY2VzKTsKIAlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKK30KKworc3RydWN0IHBjaV9kZXYgKiBfX2RldmluaXQKK3BjaV9zY2FuX3NpbmdsZV9kZXZpY2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGRldmZuKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwlkZXYgPSBwY2lfc2Nhbl9kZXZpY2UoYnVzLCBkZXZmbik7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJcGNpX2RldmljZV9hZGQoZGV2LCBidXMpOworCXBjaV9zY2FuX21zaV9kZXZpY2UoZGV2KTsKIAogCXJldHVybiBkZXY7CiB9CkBAIC04ODMsNyArODg4LDggQEAKIAlyZXR1cm4gbWF4OwogfQogCi1zdHJ1Y3QgcGNpX2J1cyAqIF9fZGV2aW5pdCBwY2lfc2Nhbl9idXNfcGFyZW50ZWQoc3RydWN0IGRldmljZSAqcGFyZW50LCBpbnQgYnVzLCBzdHJ1Y3QgcGNpX29wcyAqb3BzLCB2b2lkICpzeXNkYXRhKQorc3RydWN0IHBjaV9idXMgKiBfX2RldmluaXQgcGNpX2NyZWF0ZV9idXMoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQlpbnQgYnVzLCBzdHJ1Y3QgcGNpX29wcyAqb3BzLCB2b2lkICpzeXNkYXRhKQogewogCWludCBlcnJvcjsKIAlzdHJ1Y3QgcGNpX2J1cyAqYjsKQEAgLTk0MCw4ICs5NDYsNiBAQAogCWItPnJlc291cmNlWzBdID0gJmlvcG9ydF9yZXNvdXJjZTsKIAliLT5yZXNvdXJjZVsxXSA9ICZpb21lbV9yZXNvdXJjZTsKIAotCWItPnN1Ym9yZGluYXRlID0gcGNpX3NjYW5fY2hpbGRfYnVzKGIpOwotCiAJcmV0dXJuIGI7CiAKIHN5c19jcmVhdGVfbGlua19lcnI6CkBAIC05NTksNiArOTYzLDE4IEBACiAJa2ZyZWUoYik7CiAJcmV0dXJuIE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfY3JlYXRlX2J1cyk7CisKK3N0cnVjdCBwY2lfYnVzICogX19kZXZpbml0IHBjaV9zY2FuX2J1c19wYXJlbnRlZChzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCWludCBidXMsIHN0cnVjdCBwY2lfb3BzICpvcHMsIHZvaWQgKnN5c2RhdGEpCit7CisJc3RydWN0IHBjaV9idXMgKmI7CisKKwliID0gcGNpX2NyZWF0ZV9idXMocGFyZW50LCBidXMsIG9wcywgc3lzZGF0YSk7CisJaWYgKGIpCisJCWItPnN1Ym9yZGluYXRlID0gcGNpX3NjYW5fY2hpbGRfYnVzKGIpOworCXJldHVybiBiOworfQogRVhQT1JUX1NZTUJPTChwY2lfc2Nhbl9idXNfcGFyZW50ZWQpOwogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2MuYyBiL2RyaXZlcnMvcGNpL3Byb2MuYwppbmRleCA3OTg4ZmM4Li45NjEzZjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9jLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYy5jCkBAIC00NzQsNyArNDc0LDcgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqZmlyc3RfZGV2OwogCXN0cnVjdCBwY2lfZHJpdmVyICpkcnY7CiAJdTMyIGNsYXNzX3JldjsKLQl1bnNpZ25lZCBjaGFyIGxhdGVuY3ksIG1pbl9nbnQsIG1heF9sYXQsICpjbGFzczsKKwl1bnNpZ25lZCBjaGFyIGxhdGVuY3ksIG1pbl9nbnQsIG1heF9sYXQ7CiAJaW50IHJlZzsKIAogCWZpcnN0X2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOwpAQCAtNDkwLDE2ICs0OTAsOCBAQAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChkZXYsIFBDSV9NQVhfTEFULCAmbWF4X2xhdCk7CiAJc2VxX3ByaW50ZihtLCAiICBCdXMgJTJkLCBkZXZpY2UgJTNkLCBmdW5jdGlvbiAlMmQ6XG4iLAogCSAgICAgICBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChkZXYtPmRldmZuKSwgUENJX0ZVTkMoZGV2LT5kZXZmbikpOwotCWNsYXNzID0gcGNpX2NsYXNzX25hbWUoY2xhc3NfcmV2ID4+IDE2KTsKLQlpZiAoY2xhc3MpCi0JCXNlcV9wcmludGYobSwgIiAgICAlcyIsIGNsYXNzKTsKLQllbHNlCi0JCXNlcV9wcmludGYobSwgIiAgICBDbGFzcyAlMDR4IiwgY2xhc3NfcmV2ID4+IDE2KTsKLSNpZmRlZiBDT05GSUdfUENJX05BTUVTCi0Jc2VxX3ByaW50ZihtLCAiOiAlcyIsIGRldi0+cHJldHR5X25hbWUpOwotI2Vsc2UKKwlzZXFfcHJpbnRmKG0sICIgICAgQ2xhc3MgJTA0eCIsIGNsYXNzX3JldiA+PiAxNik7CiAJc2VxX3ByaW50ZihtLCAiOiBQQ0kgZGV2aWNlICUwNHg6JTA0eCIsIGRldi0+dmVuZG9yLCBkZXYtPmRldmljZSk7Ci0jZW5kaWYKIAlzZXFfcHJpbnRmKG0sICIgKHJldiAlZCkuXG4iLCBjbGFzc19yZXYgJiAweGZmKTsKIAogCWlmIChkZXYtPmlycSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggYmIzNmJiNi4uMTFjYTQ0MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCkBAIC0yNDUsMTIgKzI0NSwxOSBAQAogewogCXJlZ2lvbiAmPSB+KHNpemUtMSk7CiAJaWYgKHJlZ2lvbikgeworCQlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gYnVzX3JlZ2lvbjsKIAkJc3RydWN0IHJlc291cmNlICpyZXMgPSBkZXYtPnJlc291cmNlICsgbnI7CiAKIAkJcmVzLT5uYW1lID0gcGNpX25hbWUoZGV2KTsKIAkJcmVzLT5zdGFydCA9IHJlZ2lvbjsKIAkJcmVzLT5lbmQgPSByZWdpb24gKyBzaXplIC0gMTsKIAkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisKKwkJLyogQ29udmVydCBmcm9tIFBDSSBidXMgdG8gcmVzb3VyY2Ugc3BhY2UuICAqLworCQlidXNfcmVnaW9uLnN0YXJ0ID0gcmVzLT5zdGFydDsKKwkJYnVzX3JlZ2lvbi5lbmQgPSByZXMtPmVuZDsKKwkJcGNpYmlvc19idXNfdG9fcmVzb3VyY2UoZGV2LCByZXMsICZidXNfcmVnaW9uKTsKKwogCQlwY2lfY2xhaW1fcmVzb3VyY2UoZGV2LCBucik7CiAJfQogfQkKQEAgLTQyMiw2ICs0MjksMjUgQEAKIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfVklBLAlQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODYsCXF1aXJrX3ZpYV9pb2FwaWMgKTsKIAogLyoKKyAqIFZJQSA4MjM3OiBTb21lIEJJT1NzIGRvbid0IHNldCB0aGUgJ0J5cGFzcyBBUElDIERlLUFzc2VydCBNZXNzYWdlJyBCaXQuCisgKiBUaGlzIGxlYWRzIHRvIGRvdWJsZWQgbGV2ZWwgaW50ZXJydXB0IHJhdGVzLgorICogU2V0IHRoaXMgYml0IHRvIGdldCByaWQgb2YgY3ljbGUgd2FzdGFnZS4KKyAqIE90aGVyd2lzZSB1bmNyaXRpY2FsLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfdmlhX3Z0ODIzN19ieXBhc3NfYXBpY19kZWFzc2VydChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXU4IG1pc2NfY29udHJvbDI7CisjZGVmaW5lIEJZUEFTU19BUElDX0RFQVNTRVJUIDgKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1QiwgJm1pc2NfY29udHJvbDIpOworCWlmICghKG1pc2NfY29udHJvbDIgJiBCWVBBU1NfQVBJQ19ERUFTU0VSVCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBCeXBhc3NpbmcgVklBIDgyMzcgQVBJQyBEZS1Bc3NlcnQgTWVzc2FnZVxuIik7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NUIsIG1pc2NfY29udHJvbDJ8QllQQVNTX0FQSUNfREVBU1NFUlQpOworCX0KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfVklBLAlQQ0lfREVWSUNFX0lEX1ZJQV84MjM3LAkJcXVpcmtfdmlhX3Z0ODIzN19ieXBhc3NfYXBpY19kZWFzc2VydCk7CisKKy8qCiAgKiBUaGUgQU1EIGlvIGFwaWMgY2FuIGhhbmcgdGhlIGJveCB3aGVuIGFuIGFwaWMgaXJxIGlzIG1hc2tlZC4KICAqIFdlIGNoZWNrIGFsbCByZXZzID49IEIwICh5ZXQgbm90IGluIHRoZSBwcmUgcHJvZHVjdGlvbiEpIGFzIHRoZSBidWcKICAqIGlzIGN1cnJlbnRseSBtYXJrZWQgTm9GaXgKQEAgLTg1MCw2ICs4NzYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweEMwMEM6IC8qIFNhbXN1bmcgUDM1IG5vdGVib29rICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN1c19oaWRlc19zbWJ1cyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KKwl9IGVsc2UgaWYgKHVubGlrZWx5KGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NPTVBBUSkpIHsKKwkJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVQTV9IQikKKwkJCXN3aXRjaChkZXYtPnN1YnN5c3RlbV9kZXZpY2UpIHsKKwkJCWNhc2UgMHgwMDU4OiAvKiBDb21wYXEgRXZvIE42MjBjICovCisJCQkJYXN1c19oaWRlc19zbWJ1cyA9IDE7CisJCQl9CiAJfQogfQogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVfSEIsCWFzdXNfaGlkZXNfc21idXNfaG9zdGJyaWRnZSApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcm9tLmMgYi9kcml2ZXJzL3BjaS9yb20uYwppbmRleCA3MTNjNzhmLi40OWJkMjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9yb20uYworKysgYi9kcml2ZXJzL3BjaS9yb20uYwpAQCAtMjEsMTMgKzIxLDIxIEBACiAgKiBiZXR3ZWVuIHRoZSBST00gYW5kIG90aGVyIHJlc291cmNlcywgc28gZW5hYmxpbmcgaXQgbWF5IGRpc2FibGUgYWNjZXNzCiAgKiB0byBNTUlPIHJlZ2lzdGVycyBvciBvdGhlciBjYXJkIG1lbW9yeS4KICAqLwotc3RhdGljIHZvaWQgcGNpX2VuYWJsZV9yb20oc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgaW50IHBjaV9lbmFibGVfcm9tKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogeworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gcGRldi0+cmVzb3VyY2UgKyBQQ0lfUk9NX1JFU09VUkNFOworCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiByZWdpb247CiAJdTMyIHJvbV9hZGRyOwogCisJaWYgKCFyZXMtPmZsYWdzKQorCQlyZXR1cm4gLTE7CisKKwlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhwZGV2LCAmcmVnaW9uLCByZXMpOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwZGV2LT5yb21fYmFzZV9yZWcsICZyb21fYWRkcik7Ci0Jcm9tX2FkZHIgfD0gUENJX1JPTV9BRERSRVNTX0VOQUJMRTsKKwlyb21fYWRkciAmPSB+UENJX1JPTV9BRERSRVNTX01BU0s7CisJcm9tX2FkZHIgfD0gcmVnaW9uLnN0YXJ0IHwgUENJX1JPTV9BRERSRVNTX0VOQUJMRTsKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywgcm9tX2FkZHIpOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTcxLDE5ICs3OSwyMSBAQAogCX0gZWxzZSB7CiAJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ST01fQ09QWSkgewogCQkJKnNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIFBDSV9ST01fUkVTT1VSQ0UpOwotCQkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgUENJX1JPTV9SRVNPVVJDRSk7CisJCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LAorCQkJCQkJCSAgICAgUENJX1JPTV9SRVNPVVJDRSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBhc3NpZ24gdGhlIFJPTSBhbiBhZGRyZXNzIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUgKi8KLQkJCWlmIChyZXMtPnBhcmVudCA9PSBOVUxMKQotCQkJCXBjaV9hc3NpZ25fcmVzb3VyY2UocGRldiwgUENJX1JPTV9SRVNPVVJDRSk7Ci0KKwkJCWlmIChyZXMtPnBhcmVudCA9PSBOVUxMICYmCisJCQkgICAgcGNpX2Fzc2lnbl9yZXNvdXJjZShwZGV2LFBDSV9ST01fUkVTT1VSQ0UpKQorCQkJCXJldHVybiBOVUxMOwogCQkJc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgUENJX1JPTV9SRVNPVVJDRSk7CiAJCQkqc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgUENJX1JPTV9SRVNPVVJDRSk7CiAJCQlpZiAoKnNpemUgPT0gMCkKIAkJCQlyZXR1cm4gTlVMTDsKIAogCQkJLyogRW5hYmxlIFJPTSBzcGFjZSBkZWNvZGVzICovCi0JCQlwY2lfZW5hYmxlX3JvbShwZGV2KTsKKwkJCWlmIChwY2lfZW5hYmxlX3JvbShwZGV2KSkKKwkJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCA2ZDg2NGM1Li42NTdiZTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtNDAsNyArNDAsNyBAQAogICogRklYTUU6IElPIHNob3VsZCBiZSBtYXggMjU2IGJ5dGVzLiAgSG93ZXZlciwgc2luY2Ugd2UgbWF5CiAgKiBoYXZlIGEgUDJQIGJyaWRnZSBiZWxvdyBhIGNhcmRidXMgYnJpZGdlLCB3ZSBuZWVkIDRLLgogICovCi0jZGVmaW5lIENBUkRCVVNfSU9fU0laRQkJKDI1NikKKyNkZWZpbmUgQ0FSREJVU19JT19TSVpFCQkoNCoxMDI0KQogI2RlZmluZSBDQVJEQlVTX01FTV9TSVpFCSgzMioxMDI0KjEwMjQpCiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdApAQCAtNzcsOCArNzcsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX19kZXZpbml0Ci1wY2lfc2V0dXBfY2FyZGJ1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQordm9pZCBwY2lfc2V0dXBfY2FyZGJ1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBidXMtPnNlbGY7CiAJc3RydWN0IHBjaV9idXNfcmVnaW9uIHJlZ2lvbjsKQEAgLTEzMCw2ICsxMjksNyBAQAogCQkJCQlyZWdpb24uZW5kKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9zZXR1cF9jYXJkYnVzKTsKIAogLyogSW5pdGlhbGl6ZSBicmlkZ2VzIHdpdGggYmFzZS9saW1pdCB2YWx1ZXMgd2UgaGF2ZSBjb2xsZWN0ZWQuCiAgICBQQ0ktdG8tUENJIEJyaWRnZSBBcmNoaXRlY3R1cmUgU3BlY2lmaWNhdGlvbiByZXYuIDEuMSAoMTk5OCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKaW5kZXggNTU5OGI0Ny4uNTBkNjY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlICJwY2kuaCIKIAogCi1zdGF0aWMgdm9pZAordm9pZAogcGNpX3VwZGF0ZV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IHJlc25vKQogewogCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiByZWdpb247CkBAIC05NywxMCArOTcsNyBAQAogCWNoYXIgKmR0eXBlID0gcmVzb3VyY2UgPCBQQ0lfQlJJREdFX1JFU09VUkNFUyA/ICJkZXZpY2UiIDogImJyaWRnZSI7CiAJaW50IGVycjsKIAotCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJcm9vdCA9ICZpb3BvcnRfcmVzb3VyY2U7Ci0JaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKLQkJcm9vdCA9ICZpb21lbV9yZXNvdXJjZTsKKwlyb290ID0gcGNpYmlvc19zZWxlY3Rfcm9vdChkZXYsIHJlcyk7CiAKIAllcnIgPSAtRUlOVkFMOwogCWlmIChyb290ICE9IE5VTEwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwppbmRleCA2NDg1Zjc1Li5kZGM3NDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKQEAgLTIyMSw2ICsyMjEsMTMgQEAKIAl0cmlzdGF0ZSAiTkVDIFZSQzQxNzMgQ0FSRFUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIENQVV9WUjQxWFggJiYgUENJICYmIFBDTUNJQQogCitjb25maWcgT01BUF9DRgorCXRyaXN0YXRlICJPTUFQIENvbXBhY3RGbGFzaCBDb250cm9sbGVyIgorCWRlcGVuZHMgb24gUENNQ0lBICYmIEFSQ0hfT01BUDE2WFgKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIENvbXBhY3RGbGFzaCBjb250cm9sbGVyIG9uIE9NQVAuCisJICBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHN1cHBvcnQgIlRydWUgSURFIiBtb2RlLgorCiBjb25maWcgUENDQVJEX05PTlNUQVRJQwogCXRyaXN0YXRlCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL01ha2VmaWxlIGIvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKaW5kZXggZWY2OTRjNy4uYTQxZmJiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKQEAgLTM0LDYgKzM0LDcgQEAKIG9iai0kKENPTkZJR19QQ01DSUFfQVUxWDAwKQkJCSs9IGF1MXgwMF9zcy5vCiBvYmotJChDT05GSUdfUENNQ0lBX1ZSQzQxNzEpCQkJKz0gdnJjNDE3MV9jYXJkLm8KIG9iai0kKENPTkZJR19QQ01DSUFfVlJDNDE3MykJCQkrPSB2cmM0MTczX2NhcmR1Lm8KK29iai0kKENPTkZJR19PTUFQX0NGKQkJCQkrPSBvbWFwX2NmLm8KIAogc2ExMXh4X2NvcmUteQkJCQkJKz0gc29jX2NvbW1vbi5vIHNhMTF4eF9iYXNlLm8KIHB4YTJ4eF9jb3JlLXkJCQkJCSs9IHNvY19jb21tb24ubyBweGEyeHhfYmFzZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9jcy5jIGIvZHJpdmVycy9wY21jaWEvY3MuYwppbmRleCBlMzkxNzhmLi5mYWJkMzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2NzLmMKQEAgLTY1NCw5ICs2NTQsMTAgQEAKIAkJc2t0LT50aHJlYWQgPSBOVUxMOwogCQljb21wbGV0ZV9hbmRfZXhpdCgmc2t0LT50aHJlYWRfZG9uZSwgMCk7CiAJfQotCWNvbXBsZXRlKCZza3QtPnRocmVhZF9kb25lKTsKIAogCWFkZF93YWl0X3F1ZXVlKCZza3QtPnRocmVhZF93YWl0LCAmd2FpdCk7CisJY29tcGxldGUoJnNrdC0+dGhyZWFkX2RvbmUpOworCiAJZm9yICg7OykgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQl1bnNpZ25lZCBpbnQgZXZlbnRzOwpAQCAtNjgyLDExICs2ODMsMTEgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJc2NoZWR1bGUoKTsKLQkJdHJ5X3RvX2ZyZWV6ZSgpOwotCiAJCWlmICghc2t0LT50aHJlYWQpCiAJCQlicmVhazsKKworCQlzY2hlZHVsZSgpOworCQl0cnlfdG9fZnJlZXplKCk7CiAJfQogCXJlbW92ZV93YWl0X3F1ZXVlKCZza3QtPnRocmVhZF93YWl0LCAmd2FpdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmggYi9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oCmluZGV4IDZiYmZiZDAuLjU1ODY3YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9wY21jaWEvY3NfaW50ZXJuYWwuaApAQCAtMTcsOSArMTcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKLSNkZWZpbmUgQ0xJRU5UX01BR0lDIAkweDUxRTYKLXR5cGVkZWYgc3RydWN0IGNsaWVudF90IGNsaWVudF90OwotCiAvKiBGbGFncyBpbiBjbGllbnQgc3RhdGUgKi8KICNkZWZpbmUgQ0xJRU5UX0NPTkZJR19MT0NLRUQJMHgwMDAxCiAjZGVmaW5lIENMSUVOVF9JUlFfUkVRCQkweDAwMDIKQEAgLTQ1LDcgKzQyLDYgQEAKIHR5cGVkZWYgc3RydWN0IGNvbmZpZ190IHsKICAgICB1X2ludAkJc3RhdGU7CiAgICAgdV9pbnQJCUF0dHJpYnV0ZXM7Ci0gICAgdV9pbnQJCVZjYywgVnBwMSwgVnBwMjsKICAgICB1X2ludAkJSW50VHlwZTsKICAgICB1X2ludAkJQ29uZmlnQmFzZTsKICAgICB1X2NoYXIJCVN0YXR1cywgUGluLCBDb3B5LCBPcHRpb24sIEV4dFN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2RzLmMgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCmluZGV4IDQzZGEyZTkuLjA4MDYwOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2RzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvZHMuYwpAQCAtMzU0LDYgKzM1NCw3IEBACiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOwogCWRzX2RiZygxLCAicmVsZWFzaW5nIGRldiAlcFxuIiwgcF9kZXYpOwogCXBjbWNpYV9wdXRfc29ja2V0KHBfZGV2LT5zb2NrZXQpOworCWtmcmVlKHBfZGV2LT5kZXZuYW1lKTsKIAlrZnJlZShwX2Rldik7CiB9CiAKQEAgLTQyNCw5ICs0MjUsMTMgQEAKIHsKIAljaXN0cGxfbWFuZmlkX3QgbWFuZl9pZDsKIAljaXN0cGxfZnVuY2lkX3QgZnVuY19pZDsKLQljaXN0cGxfdmVyc18xX3QJdmVyczE7CisJY2lzdHBsX3ZlcnNfMV90CSp2ZXJzMTsKIAl1bnNpZ25lZCBpbnQgaTsKIAorCXZlcnMxID0ga21hbGxvYyhzaXplb2YoKnZlcnMxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2ZXJzMSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlpZiAoIXBjY2FyZF9yZWFkX3R1cGxlKHBfZGV2LT5zb2NrZXQsIHBfZGV2LT5mdW5jLAogCQkJICAgICAgIENJU1RQTF9NQU5GSUQsICZtYW5mX2lkKSkgewogCQlwX2Rldi0+bWFuZl9pZCA9IG1hbmZfaWQubWFuZjsKQEAgLTQ0MywyMyArNDQ4LDMwIEBACiAJCS8qIHJ1bGUgb2YgdGh1bWI6IGNhcmRzIHdpdGggbm8gRlVOQ0lELCBidXQgd2l0aAogCQkgKiBjb21tb24gbWVtb3J5IGRldmljZSBnZW9tZXRyeSBpbmZvcm1hdGlvbiwgYXJlCiAJCSAqIHByb2JhYmx5IG1lbW9yeSBjYXJkcyAoZnJvbSBwY21jaWEtY3MpICovCi0JCWNpc3RwbF9kZXZpY2VfZ2VvX3QgZGV2Z2VvOworCQljaXN0cGxfZGV2aWNlX2dlb190ICpkZXZnZW87CisKKwkJZGV2Z2VvID0ga21hbGxvYyhzaXplb2YoKmRldmdlbyksIEdGUF9LRVJORUwpOworCQlpZiAoIWRldmdlbykgeworCQkJa2ZyZWUodmVyczEpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAkJaWYgKCFwY2NhcmRfcmVhZF90dXBsZShwX2Rldi0+c29ja2V0LCBwX2Rldi0+ZnVuYywKLQkJCQkgICAgICBDSVNUUExfREVWSUNFX0dFTywgJmRldmdlbykpIHsKKwkJCQkgICAgICBDSVNUUExfREVWSUNFX0dFTywgZGV2Z2VvKSkgewogCQkJZHNfZGJnKDAsICJtZW0gZGV2aWNlIGdlb21ldHJ5IHByb2JhYmx5IG1lYW5zICIKIAkJCSAgICAgICAiRlVOQ0lEX01FTU9SWVxuIik7CiAJCQlwX2Rldi0+ZnVuY19pZCA9IENJU1RQTF9GVU5DSURfTUVNT1JZOwogCQkJcF9kZXYtPmhhc19mdW5jX2lkID0gMTsKIAkJfQorCQlrZnJlZShkZXZnZW8pOwogCX0KIAogCWlmICghcGNjYXJkX3JlYWRfdHVwbGUocF9kZXYtPnNvY2tldCwgcF9kZXYtPmZ1bmMsIENJU1RQTF9WRVJTXzEsCi0JCQkgICAgICAgJnZlcnMxKSkgewotCQlmb3IgKGk9MDsgaSA8IHZlcnMxLm5zOyBpKyspIHsKKwkJCSAgICAgICB2ZXJzMSkpIHsKKwkJZm9yIChpPTA7IGkgPCB2ZXJzMS0+bnM7IGkrKykgewogCQkJY2hhciAqdG1wOwogCQkJdW5zaWduZWQgaW50IGxlbmd0aDsKIAotCQkJdG1wID0gdmVyczEuc3RyICsgdmVyczEub2ZzW2ldOworCQkJdG1wID0gdmVyczEtPnN0ciArIHZlcnMxLT5vZnNbaV07CiAKIAkJCWxlbmd0aCA9IHN0cmxlbih0bXApICsgMTsKIAkJCWlmICgobGVuZ3RoIDwgMykgfHwgKGxlbmd0aCA+IDI1NSkpCkBAIC00NzUsNiArNDg3LDcgQEAKIAkJfQogCX0KIAorCWtmcmVlKHZlcnMxKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDkyLDYgKzUwNSw3IEBACiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGJ1c19pZF9sZW47CiAKIAlzID0gcGNtY2lhX2dldF9zb2NrZXQocyk7CiAJaWYgKCFzKQpAQCAtNTE1LDcgKzUyOSwxMiBAQAogCXBfZGV2LT5kZXYuYnVzID0gJnBjbWNpYV9idXNfdHlwZTsKIAlwX2Rldi0+ZGV2LnBhcmVudCA9IHMtPmRldi5kZXY7CiAJcF9kZXYtPmRldi5yZWxlYXNlID0gcGNtY2lhX3JlbGVhc2VfZGV2OwotCXNwcmludGYgKHBfZGV2LT5kZXYuYnVzX2lkLCAiJWQuJWQiLCBwX2Rldi0+c29ja2V0LT5zb2NrLCBwX2Rldi0+ZGV2aWNlX25vKTsKKwlidXNfaWRfbGVuID0gc3ByaW50ZiAocF9kZXYtPmRldi5idXNfaWQsICIlZC4lZCIsIHBfZGV2LT5zb2NrZXQtPnNvY2ssIHBfZGV2LT5kZXZpY2Vfbm8pOworCisJcF9kZXYtPmRldm5hbWUgPSBrbWFsbG9jKDYgKyBidXNfaWRfbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwX2Rldi0+ZGV2bmFtZSkKKwkJZ290byBlcnJfZnJlZTsKKwlzcHJpbnRmIChwX2Rldi0+ZGV2bmFtZSwgInBjbWNpYSVzIiwgcF9kZXYtPmRldi5idXNfaWQpOwogCiAJLyogY29tcGF0ICovCiAJcF9kZXYtPnN0YXRlID0gQ0xJRU5UX1VOQk9VTkQ7CkBAIC01NDAsNiArNTU5LDcgQEAKIAlyZXR1cm4gcF9kZXY7CiAKICBlcnJfZnJlZToKKwlrZnJlZShwX2Rldi0+ZGV2bmFtZSk7CiAJa2ZyZWUocF9kZXYpOwogCXMtPmRldmljZV9jb3VudC0tOwogIGVycl9wdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9vbWFwX2NmLmMgYi9kcml2ZXJzL3BjbWNpYS9vbWFwX2NmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkMWM5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNtY2lhL29tYXBfY2YuYwpAQCAtMCwwICsxLDM3MyBAQAorLyoKKyAqIG9tYXBfY2YuYyAtLSBPTUFQIDE2eHggQ29tcGFjdEZsYXNoIGNvbnRyb2xsZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KKworCisvKiBOT1RFOiAgZG9uJ3QgZXhwZWN0IHRoaXMgdG8gc3VwcG9ydCBtYW55IEkvTyBjYXJkcy4gIFRoZSAxNnh4IGNoaXBzIGhhdmUKKyAqIGhhcmQtd2lyZWQgdGltaW5ncyB0byBzdXBwb3J0IENvbXBhY3QgRmxhc2ggbWVtb3J5IGNhcmRzOyB0aGV5IHdvbid0IHdvcmsKKyAqIHdpdGggdmFyaW91cyBvdGhlciBkZXZpY2VzIChsaWtlIFdMQU4gYWRhcHRlcnMpIHdpdGhvdXQgc29tZSBleHRlcm5hbAorICogbG9naWMgdG8gaGVscCBvdXQuCisgKgorICogTk9URTogIENGIGNvbnRyb2xsZXIgZG9jcyBkaXNhZ3JlZSB3aXRoIGFkZHJlc3Mgc3BhY2UgZG9jcyBhcyB0byB3aGVyZQorICogQ0ZfQkFTRSByZWFsbHkgbGl2ZXM7IHRoaXMgaXMgYSBkb2MgZXJyYXR1bS4KKyAqLworI2RlZmluZQlDRl9CQVNFCTB4ZmZmZTI4MDAKKworLyogc3RhdHVzOyByZWFkIGFmdGVyIElSUSAqLworI2RlZmluZSBDRl9TVEFUVVNfUkVHCQlfX1JFRzE2KENGX0JBU0UgKyAweDAwKQorIwlkZWZpbmUJQ0ZfU1RBVFVTX0JBRF9SRUFECSgxIDw8IDIpCisjCWRlZmluZQlDRl9TVEFUVVNfQkFEX1dSSVRFCSgxIDw8IDEpCisjCWRlZmluZQlDRl9TVEFUVVNfQ0FSRF9ERVRFQ1QJKDEgPDwgMCkKKworLyogd2hpY2ggY2hpcHNlbGVjdCAoQ1MwLi5DUzMpIGlzIHVzZWQgZm9yIENGIChhY3RpdmUgbG93KSAqLworI2RlZmluZSBDRl9DRkdfUkVHCQlfX1JFRzE2KENGX0JBU0UgKyAweDAyKQorCisvKiBjYXJkIHJlc2V0ICovCisjZGVmaW5lIENGX0NPTlRST0xfUkVHCQlfX1JFRzE2KENGX0JBU0UgKyAweDA0KQorIwlkZWZpbmUJQ0ZfQ09OVFJPTF9SRVNFVAkoMSA8PCAwKQorCisjZGVmaW5lIG9tYXBfY2ZfcHJlc2VudCgpICghKENGX1NUQVRVU19SRUcgJiBDRl9TVEFUVVNfQ0FSRF9ERVRFQ1QpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVbXSA9ICJvbWFwX2NmIjsKKworc3RydWN0IG9tYXBfY2Zfc29ja2V0IHsKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldAlzb2NrZXQ7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwl1bnNpZ25lZAkJcHJlc2VudDoxOworCXVuc2lnbmVkCQlhY3RpdmU6MTsKKworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJdW5zaWduZWQgbG9uZwkJcGh5c19jZjsKKwl1X2ludAkJCWlycTsKK307CisKKyNkZWZpbmUJUE9MTF9JTlRFUlZBTAkJKDIgKiBIWikKKworI2RlZmluZQlTWl8ySwkJCSgyICogU1pfMUspCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IG9tYXBfY2Zfc3NfaW5pdChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKK3sKKwlyZXR1cm4gMDsKK30KKworLyogdGhlIHRpbWVyIGlzIHByaW1hcmlseSB0byBraWNrIHRoaXMgc29ja2V0J3MgcGNjYXJkZCAqLworc3RhdGljIHZvaWQgb21hcF9jZl90aW1lcih1bnNpZ25lZCBsb25nIF9jZikKK3sKKwlzdHJ1Y3Qgb21hcF9jZl9zb2NrZXQJKmNmID0gKHZvaWQgKikgX2NmOworCXVuc2lnbmVkCQlwcmVzZW50ID0gb21hcF9jZl9wcmVzZW50KCk7CisKKwlpZiAocHJlc2VudCAhPSBjZi0+cHJlc2VudCkgeworCQljZi0+cHJlc2VudCA9IHByZXNlbnQ7CisJCXByX2RlYnVnKCIlczogY2FyZCAlc1xuIiwgZHJpdmVyX25hbWUsCisJCQlwcmVzZW50ID8gInByZXNlbnQiIDogImdvbmUiKTsKKwkJcGNtY2lhX3BhcnNlX2V2ZW50cygmY2YtPnNvY2tldCwgU1NfREVURUNUKTsKKwl9CisKKwlpZiAoY2YtPmFjdGl2ZSkKKwkJbW9kX3RpbWVyKCZjZi0+dGltZXIsIGppZmZpZXMgKyBQT0xMX0lOVEVSVkFMKTsKK30KKworLyogVGhpcyBpcnEgaGFuZGxlciBwcmV2ZW50cyAiaXJxTk5OOiBub2JvZHkgY2FyZWQiIG1lc3NhZ2VzIGFzIGRyaXZlcnMKKyAqIGNsYWltIHRoZSBjYXJkJ3MgSVJRLiAgSXQgbWF5IGFsc28gZGV0ZWN0IHNvbWUgY2FyZCBpbnNlcnRpb25zLCBidXQKKyAqIG5vdCByZW1vdmFsczsgaXQgY2FuJ3QgYWx3YXlzIGVsaW1pbmF0ZSB0aW1lciBpcnFzLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9jZl9pcnEoaW50IGlycSwgdm9pZCAqX2NmLCBzdHJ1Y3QgcHRfcmVncyAqcikKK3sKKwlvbWFwX2NmX3RpbWVyKCh1bnNpZ25lZCBsb25nKV9jZik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IG9tYXBfY2ZfZ2V0X3N0YXR1cyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdV9pbnQgKnNwKQoreworCWlmICghc3ApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRklYTUUgcG93ZXIgbWFuYWdlbWVudCBzaG91bGQgcHJvYmFibHkgYmUgYm9hcmQtc3BlY2lmaWM6CisJICogIC0gM1ZDQVJEIHZzIFhWQ0FSRCAoT1NLIG9ubHkgaGFuZGxlcyAzVkNBUkQpCisJICogIC0gUE9XRVJPTiAoc3dpdGNoZWQgb24vb2ZmIGJ5IHNldF9zb2NrZXQpCisJICovCisJaWYgKG9tYXBfY2ZfcHJlc2VudCgpKSB7CisJCXN0cnVjdCBvbWFwX2NmX3NvY2tldAkqY2Y7CisKKwkJKnNwID0gU1NfUkVBRFkgfCBTU19ERVRFQ1QgfCBTU19QT1dFUk9OIHwgU1NfM1ZDQVJEOworCQljZiA9IGNvbnRhaW5lcl9vZihzLCBzdHJ1Y3Qgb21hcF9jZl9zb2NrZXQsIHNvY2tldCk7CisJCXMtPmlycS5Bc3NpZ25lZElSUSA9IGNmLT5pcnE7CisJfSBlbHNlCisJCSpzcCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK29tYXBfY2Zfc2V0X3NvY2tldChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywgc3RydWN0IHNvY2tldF9zdGF0ZV90ICpzKQoreworCXUxNgkJY29udHJvbDsKKworCS8qIEZJWE1FIHNvbWUgbm9uLU9TSyBib2FyZHMgd2lsbCBzdXBwb3J0IHBvd2VyIHN3aXRjaGluZyAqLworCXN3aXRjaCAocy0+VmNjKSB7CisJY2FzZSAwOgorCWNhc2UgMzM6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvbnRyb2wgPSBDRl9DT05UUk9MX1JFRzsKKwlpZiAocy0+ZmxhZ3MgJiBTU19SRVNFVCkKKwkJQ0ZfQ09OVFJPTF9SRUcgPSBDRl9DT05UUk9MX1JFU0VUOworCWVsc2UKKwkJQ0ZfQ09OVFJPTF9SRUcgPSAwOworCisJcHJfZGVidWcoIiVzOiBWY2MgJWQsIGlvX2lycSAlZCwgZmxhZ3MgJTA0eCBjc2MgJTA0eFxuIiwKKwkJZHJpdmVyX25hbWUsIHMtPlZjYywgcy0+aW9faXJxLCBzLT5mbGFncywgcy0+Y3NjX21hc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9jZl9zc19zdXNwZW5kKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQoreworCXByX2RlYnVnKCIlczogJXNcbiIsIGRyaXZlcl9uYW1lLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBvbWFwX2NmX3NldF9zb2NrZXQocywgJmRlYWRfc29ja2V0KTsKK30KKworLyogcmVnaW9ucyBhcmUgMksgZWFjaDogIG1lbSwgYXR0cmliLCBpbyAoYW5kIHJlc2VydmVkLWZvci1pZGUpICovCisKK3N0YXRpYyBpbnQKK29tYXBfY2Zfc2V0X2lvX21hcChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgc3RydWN0IHBjY2FyZF9pb19tYXAgKmlvKQoreworCXN0cnVjdCBvbWFwX2NmX3NvY2tldAkqY2Y7CisKKwljZiA9IGNvbnRhaW5lcl9vZihzLCBzdHJ1Y3Qgb21hcF9jZl9zb2NrZXQsIHNvY2tldCk7CisJaW8tPmZsYWdzICY9IE1BUF9BQ1RJVkV8TUFQX0FUVFJJQnxNQVBfMTZCSVQ7CisJaW8tPnN0YXJ0ID0gY2YtPnBoeXNfY2YgKyBTWl80SzsKKwlpby0+c3RvcCA9IGlvLT5zdGFydCArIFNaXzJLIC0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorb21hcF9jZl9zZXRfbWVtX21hcChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgc3RydWN0IHBjY2FyZF9tZW1fbWFwICptYXApCit7CisJc3RydWN0IG9tYXBfY2Zfc29ja2V0CSpjZjsKKworCWlmIChtYXAtPmNhcmRfc3RhcnQpCisJCXJldHVybiAtRUlOVkFMOworCWNmID0gY29udGFpbmVyX29mKHMsIHN0cnVjdCBvbWFwX2NmX3NvY2tldCwgc29ja2V0KTsKKwltYXAtPnN0YXRpY19zdGFydCA9IGNmLT5waHlzX2NmOworCW1hcC0+ZmxhZ3MgJj0gTUFQX0FDVElWRXxNQVBfQVRUUklCfE1BUF8xNkJJVDsKKwlpZiAobWFwLT5mbGFncyAmIE1BUF9BVFRSSUIpCisJCW1hcC0+c3RhdGljX3N0YXJ0ICs9IFNaXzJLOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjY2FyZF9vcGVyYXRpb25zIG9tYXBfY2Zfb3BzID0geworCS5pbml0CQkJPSBvbWFwX2NmX3NzX2luaXQsCisJLnN1c3BlbmQJCT0gb21hcF9jZl9zc19zdXNwZW5kLAorCS5nZXRfc3RhdHVzCQk9IG9tYXBfY2ZfZ2V0X3N0YXR1cywKKwkuc2V0X3NvY2tldAkJPSBvbWFwX2NmX3NldF9zb2NrZXQsCisJLnNldF9pb19tYXAJCT0gb21hcF9jZl9zZXRfaW9fbWFwLAorCS5zZXRfbWVtX21hcAkJPSBvbWFwX2NmX3NldF9tZW1fbWFwLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBOT1RFOiAgcmlnaHQgbm93IHRoZSBvbmx5IGJvYXJkLXNwZWNpZmljIHBsYXRmb3JtX2RhdGEgaXMKKyAqICJ3aGF0IGNoaXBzZWxlY3QgaXMgdXNlZCIuICBCb2FyZHMgY291bGQgd2FudCBtb3JlLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfY2ZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXVuc2lnbmVkCQlzZWc7CisJc3RydWN0IG9tYXBfY2Zfc29ja2V0CSpjZjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJaW50CQkJaXJxOworCWludAkJCXN0YXR1czsKKworCXNlZyA9IChpbnQpIGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpZiAoc2VnID09IDAgfHwgc2VnID4gMykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBlaXRoZXIgQ0ZMQVNILklSRVEgKElOVF8xNjEwX0NGKSBvciBzb21lIEdQSU8gKi8KKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmICghaXJxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNmID0ga2NhbGxvYygxLCBzaXplb2YgKmNmLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpbml0X3RpbWVyKCZjZi0+dGltZXIpOworCWNmLT50aW1lci5mdW5jdGlvbiA9IG9tYXBfY2ZfdGltZXI7CisJY2YtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY2Y7CisKKwljZi0+cGRldiA9IHBkZXY7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgY2YpOworCisJLyogdGhpcyBwcmltYXJpbHkganVzdCBzaHV0cyB1cCBpcnEgaGFuZGxpbmcgbm9pc2UgKi8KKwlzdGF0dXMgPSByZXF1ZXN0X2lycShpcnEsIG9tYXBfY2ZfaXJxLCBTQV9TSElSUSwKKwkJCWRyaXZlcl9uYW1lLCBjZik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDA7CisJY2YtPmlycSA9IGlycTsKKwljZi0+c29ja2V0LnBjaV9pcnEgPSBpcnE7CisKKwlzd2l0Y2ggKHNlZykgeworCS8qIE5PVEU6IENTMCBjb3VsZCBiZSBjb25maWd1cmVkIHRvbyAuLi4gKi8KKwljYXNlIDE6CisJCWNmLT5waHlzX2NmID0gT01BUF9DUzFfUEhZUzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQljZi0+cGh5c19jZiA9IE9NQVBfQ1MyX1BIWVM7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJY2YtPnBoeXNfY2YgPSBvbWFwX2NzM19waHlzKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gIGZhaWwxOworCX0KKworCS8qIHBjbWNpYSBsYXllciBvbmx5IHJlbWFwcyAicmVhbCIgbWVtb3J5ICovCisJY2YtPnNvY2tldC5pb19vZmZzZXQgPSAodW5zaWduZWQgbG9uZykKKwkJCWlvcmVtYXAoY2YtPnBoeXNfY2YgKyBTWl80SywgU1pfMkspOworCWlmICghY2YtPnNvY2tldC5pb19vZmZzZXQpCisJCWdvdG8gZmFpbDE7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihjZi0+cGh5c19jZiwgU1pfOEssIGRyaXZlcl9uYW1lKSkKKwkJZ290byBmYWlsMTsKKworCS8qIE5PVEU6ICBDRiBjb25mbGljdHMgd2l0aCBNTUMxICovCisJb21hcF9jZmdfcmVnKFcxMV8xNjEwX0NGX0NEMSk7CisJb21hcF9jZmdfcmVnKFAxMV8xNjEwX0NGX0NEMik7CisJb21hcF9jZmdfcmVnKFIxMV8xNjEwX0NGX0lPSVMxNik7CisJb21hcF9jZmdfcmVnKFYxMF8xNjEwX0NGX0lSRVEpOworCW9tYXBfY2ZnX3JlZyhXMTBfMTYxMF9DRl9SRVNFVCk7CisKKwlDRl9DRkdfUkVHID0gfigxIDw8IHNlZyk7CisKKwlwcl9pbmZvKCIlczogY3MlZCBvbiBpcnEgJWRcbiIsIGRyaXZlcl9uYW1lLCBzZWcsIGlycSk7CisKKwkvKiBOT1RFOiAgYmV0dGVyIEVNSUZTIHNldHVwIG1pZ2h0IHN1cHBvcnQgbW9yZSBjYXJkczsgYnV0IHRoZQorCSAqIFRSTSBvbmx5IHNob3dzIGhvdyB0byBhZmZlY3QgcmVndWxhciBmbGFzaCBzaWduYWxzLCBub3QgdGhlaXIKKwkgKiBDRi9QQ01DSUEgdmFyaWFudHMuLi4KKwkgKi8KKwlwcl9kZWJ1ZygiJXM6IGNzJWQsIHByZXZpb3VzIGNjcyAlMDh4IGFjcyAlMDh4XG4iLCBkcml2ZXJfbmFtZSwKKwkJCXNlZywgRU1JRlNfQ0NTKHNlZyksIEVNSUZTX0FDUyhzZWcpKTsKKwlFTUlGU19DQ1Moc2VnKSA9IDB4MDAwNGExYjM7CS8qIHN5bmNoIG1vZGUgNCBldGMgKi8KKwlFTUlGU19BQ1Moc2VnKSA9IDB4MDAwMDAwMDA7CS8qIE9FIGhvbGQvc2V0dXAgKi8KKworCS8qIENGIHVzZXMgYXJteG9yX2NrLCB3aGljaCBpcyAiYWx3YXlzIiBhdmFpbGFibGUgKi8KKworCXByX2RlYnVnKCIlczogc3RzICUwNHggY2ZnICUwNHggY29udHJvbCAlMDR4ICVzXG4iLCBkcml2ZXJfbmFtZSwKKwkJQ0ZfU1RBVFVTX1JFRywgQ0ZfQ0ZHX1JFRywgQ0ZfQ09OVFJPTF9SRUcsCisJCW9tYXBfY2ZfcHJlc2VudCgpID8gInByZXNlbnQiIDogIihub3QgcHJlc2VudCkiKTsKKworCWNmLT5zb2NrZXQub3duZXIgPSBUSElTX01PRFVMRTsKKwljZi0+c29ja2V0LmRldi5kZXYgPSBkZXY7CisJY2YtPnNvY2tldC5vcHMgPSAmb21hcF9jZl9vcHM7CisJY2YtPnNvY2tldC5yZXNvdXJjZV9vcHMgPSAmcGNjYXJkX3N0YXRpY19vcHM7CisJY2YtPnNvY2tldC5mZWF0dXJlcyA9IFNTX0NBUF9QQ0NBUkQgfCBTU19DQVBfU1RBVElDX01BUAorCQkJCXwgU1NfQ0FQX01FTV9BTElHTjsKKwljZi0+c29ja2V0Lm1hcF9zaXplID0gU1pfMks7CisKKwlzdGF0dXMgPSBwY21jaWFfcmVnaXN0ZXJfc29ja2V0KCZjZi0+c29ja2V0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsMjsKKworCWNmLT5hY3RpdmUgPSAxOworCW1vZF90aW1lcigmY2YtPnRpbWVyLCBqaWZmaWVzICsgUE9MTF9JTlRFUlZBTCk7CisJcmV0dXJuIDA7CisKK2ZhaWwyOgorCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBjZi0+c29ja2V0LmlvX29mZnNldCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGNmLT5waHlzX2NmLCBTWl84Syk7CitmYWlsMToKKwlmcmVlX2lycShpcnEsIGNmKTsKK2ZhaWwwOgorCWtmcmVlKGNmKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBvbWFwX2NmX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9tYXBfY2Zfc29ja2V0ICpjZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJY2YtPmFjdGl2ZSA9IDA7CisJcGNtY2lhX3VucmVnaXN0ZXJfc29ja2V0KCZjZi0+c29ja2V0KTsKKwlkZWxfdGltZXJfc3luYygmY2YtPnRpbWVyKTsKKwlpb3VubWFwKCh2b2lkIF9faW9tZW0gKikgY2YtPnNvY2tldC5pb19vZmZzZXQpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihjZi0+cGh5c19jZiwgU1pfOEspOworCWZyZWVfaXJxKGNmLT5pcnEsIGNmKTsKKwlrZnJlZShjZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9jZl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc2csIHUzMiBsZXZlbCkKK3sKKwlpZiAobGV2ZWwgIT0gU1VTUEVORF9TQVZFX1NUQVRFKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZChkZXYsIG1lc2cpOworfQorCitzdGF0aWMgaW50IG9tYXBfY2ZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCWlmIChsZXZlbCAhPSBSRVNVTUVfUkVTVE9SRV9TVEFURSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZShkZXYpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgb21hcF9jZl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gKGNoYXIgKikgZHJpdmVyX25hbWUsCisJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCQk9IG9tYXBfY2ZfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvbWFwX2NmX3JlbW92ZSksCisJLnN1c3BlbmQgCT0gb21hcF9jZl9zdXNwZW5kLAorCS5yZXN1bWUgCT0gb21hcF9jZl9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2NmX2luaXQodm9pZCkKK3sKKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkpCisJCWRyaXZlcl9yZWdpc3Rlcigmb21hcF9jZl9kcml2ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb21hcF9jZl9leGl0KHZvaWQpCit7CisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKQorCQlkcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9jZl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvbWFwX2NmX2luaXQpOworbW9kdWxlX2V4aXQob21hcF9jZl9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQIENGIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMgYi9kcml2ZXJzL3BjbWNpYS9wY21jaWFfcmVzb3VyY2UuYwppbmRleCA1OTliMTE2Li44OTAyMmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfcmVzb3VyY2UuYworKysgYi9kcml2ZXJzL3BjbWNpYS9wY21jaWFfcmVzb3VyY2UuYwpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAJICAgIChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX1ZQUDJfQ0hBTkdFX1ZBTElEKSkgewogCQlpZiAobW9kLT5WcHAxICE9IG1vZC0+VnBwMikKIAkJCXJldHVybiBDU19CQURfVlBQOwotCQljLT5WcHAxID0gYy0+VnBwMiA9IHMtPnNvY2tldC5WcHAgPSBtb2QtPlZwcDE7CisJCXMtPnNvY2tldC5WcHAgPSBtb2QtPlZwcDE7CiAJCWlmIChzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCkpCiAJCQlyZXR1cm4gQ1NfQkFEX1ZQUDsKIAl9IGVsc2UgaWYgKChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX1ZQUDFfQ0hBTkdFX1ZBTElEKSB8fApAQCAtNjIzLDggKzYyMyw2IEBACiAJaWYgKHMtPm9wcy0+c2V0X3NvY2tldChzLCAmcy0+c29ja2V0KSkKIAkJcmV0dXJuIENTX0JBRF9WUFA7CiAKLQljLT5WY2MgPSByZXEtPlZjYzsgYy0+VnBwMSA9IGMtPlZwcDIgPSByZXEtPlZwcDE7Ci0KIAkvKiBQaWNrIG1lbW9yeSBvciBJL08gY2FyZCwgRE1BIG1vZGUsIGludGVycnVwdCAqLwogCWMtPkludFR5cGUgPSByZXEtPkludFR5cGU7CiAJYy0+QXR0cmlidXRlcyA9IHJlcS0+QXR0cmlidXRlczsKQEAgLTgyMiw3ICs4MjAsNyBAQAogCQkJCQkgICgocmVxLT5BdHRyaWJ1dGVzICYgSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HKSB8fAogCQkJCQkgICAocy0+ZnVuY3Rpb25zID4gMSkgfHwKIAkJCQkJICAgKGlycSA9PSBzLT5wY2lfaXJxKSkgPyBTQV9TSElSUSA6IDAsCi0JCQkJCSAgcF9kZXYtPmRldi5idXNfaWQsCisJCQkJCSAgcF9kZXYtPmRldm5hbWUsCiAJCQkJCSAgKHJlcS0+QXR0cmlidXRlcyAmIElSUV9IQU5ETEVfUFJFU0VOVCkgPyByZXEtPkluc3RhbmNlIDogZGF0YSk7CiAJCQlpZiAoIXJldCkgewogCQkJCWlmICghKHJlcS0+QXR0cmlidXRlcyAmIElSUV9IQU5ETEVfUFJFU0VOVCkpCkBAIC04MzIsNyArODMwLDggQEAKIAkJfQogCX0KICNlbmRpZgotCWlmIChyZXQpIHsKKwkvKiBvbmx5IGFzc2lnbiBQQ0kgaXJxIGlmIG5vIElSUSBhbHJlYWR5IGFzc2lnbmVkICovCisJaWYgKHJldCAmJiAhcy0+aXJxLkFzc2lnbmVkSVJRKSB7CiAJCWlmICghcy0+cGNpX2lycSkKIAkJCXJldHVybiByZXQ7CiAJCWlycSA9IHMtPnBjaV9pcnE7CkBAIC04NDMsNyArODQyLDcgQEAKIAkJCQkoKHJlcS0+QXR0cmlidXRlcyAmIElSUV9UWVBFX0RZTkFNSUNfU0hBUklORykgfHwKIAkJCQkgKHMtPmZ1bmN0aW9ucyA+IDEpIHx8CiAJCQkJIChpcnEgPT0gcy0+cGNpX2lycSkpID8gU0FfU0hJUlEgOiAwLAotCQkJCXBfZGV2LT5kZXYuYnVzX2lkLCByZXEtPkluc3RhbmNlKSkKKwkJCQlwX2Rldi0+ZGV2bmFtZSwgcmVxLT5JbnN0YW5jZSkpCiAJCQlyZXR1cm4gQ1NfSU5fVVNFOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKaW5kZXggM2UyM2NkNC4uMzI1Yzk5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5jCkBAIC0yNDYsNyArMjQ2LDcgQEAKIAlkcml2ZXJfdW5yZWdpc3RlcigmcHhhMnh4X3BjbWNpYV9kcml2ZXIpOwogfQogCi1tb2R1bGVfaW5pdChweGEyeHhfcGNtY2lhX2luaXQpOworZnNfaW5pdGNhbGwocHhhMnh4X3BjbWNpYV9pbml0KTsKIG1vZHVsZV9leGl0KHB4YTJ4eF9wY21jaWFfZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIlN0ZWZhbiBFbGV0emhvZmVyIDxzdGVmYW4uZWxldHpob2ZlckBpbnF1YW50LmRlPiBhbmQgSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9tYWluc3RvbmUuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9tYWluc3RvbmUuYwppbmRleCA1MzA5NzM0Li5iYmU2OWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfbWFpbnN0b25lLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X21haW5zdG9uZS5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihtc3RfcGNtY2lhX2RldmljZSk7CiB9CiAKLW1vZHVsZV9pbml0KG1zdF9wY21jaWFfaW5pdCk7Citmc19pbml0Y2FsbChtc3RfcGNtY2lhX2luaXQpOwogbW9kdWxlX2V4aXQobXN0X3BjbWNpYV9leGl0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3NoYXJwc2wuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9zaGFycHNsLmMKaW5kZXggNDJlZmUyMS4uYTExNzhhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3NoYXJwc2wuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfc2hhcnBzbC5jCkBAIC0yMCwyNyArMjAsMTggQEAKIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zY29vcC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2NvcmdpLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KIAogI2luY2x1ZGUgInNvY19jb21tb24uaCIKIAogI2RlZmluZQlOT19LRUVQX1ZTIDB4MDAwMQogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBrZWVwX3ZzOwotc3RhdGljIHVuc2lnbmVkIGNoYXIga2VlcF9yZDsKLQotc3RhdGljIHN0cnVjdCBwY21jaWFfaXJxcyBpcnFzW10gPSB7Ci0JeyAwLCBDT1JHSV9JUlFfR1BJT19DRl9DRCwgIlBDTUNJQTAgQ0QifSwKLX07Ci0KLXN0YXRpYyB2b2lkIHNoYXJwc2xfcGNtY2lhX2luaXRfcmVzZXQodm9pZCkKK3N0YXRpYyB2b2lkIHNoYXJwc2xfcGNtY2lhX2luaXRfcmVzZXQoc3RydWN0IHNjb29wX3BjbWNpYV9kZXYgKnNjb29wZGV2KQogewotCXJlc2V0X3Njb29wKCZjb3JnaXNjb29wX2RldmljZS5kZXYpOwotCWtlZXBfdnMgPSBOT19LRUVQX1ZTOwotCWtlZXBfcmQgPSAwOworCXJlc2V0X3Njb29wKHNjb29wZGV2LT5kZXYpOworCXNjb29wZGV2LT5rZWVwX3ZzID0gTk9fS0VFUF9WUzsKKwlzY29vcGRldi0+a2VlcF9yZCA9IDA7CiB9CiAKIHN0YXRpYyBpbnQgc2hhcnBzbF9wY21jaWFfaHdfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKQEAgLTcxLDI5ICs2MiwzNSBAQAogCXB4YV9ncGlvX21vZGUoR1BJTzU3X25JT0lTMTZfTUQpOwogCiAJLyogUmVnaXN0ZXIgaW50ZXJydXB0cyAqLwotCXJldCA9IHNvY19wY21jaWFfcmVxdWVzdF9pcnFzKHNrdCwgaXJxcywgQVJSQVlfU0laRShpcnFzKSk7CisJaWYgKHNjb29wX2RldnNbc2t0LT5ucl0uY2RfaXJxID49IDApIHsKKwkJc3RydWN0IHBjbWNpYV9pcnFzIGNkX2lycTsKIAotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0IGZvciBDb21wYWN0IEZsYXNoIElSUSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OworCQljZF9pcnEuc29jayA9IHNrdC0+bnI7CisJCWNkX2lycS5pcnEgID0gc2Nvb3BfZGV2c1tza3QtPm5yXS5jZF9pcnE7CisJCWNkX2lycS5zdHIgID0gc2Nvb3BfZGV2c1tza3QtPm5yXS5jZF9pcnFfc3RyOworCQlyZXQgPSBzb2NfcGNtY2lhX3JlcXVlc3RfaXJxcyhza3QsICZjZF9pcnEsIDEpOworCisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUmVxdWVzdCBmb3IgQ29tcGFjdCBGbGFzaCBJUlEgZmFpbGVkXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAKLQkvKiBFbmFibGUgaW50ZXJydXB0ICovCi0Jd3JpdGVfc2Nvb3BfcmVnKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIFNDT09QX0lNUiwgMHgwMEMwKTsKLQl3cml0ZV9zY29vcF9yZWcoJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfTUNSLCAweDAxMDEpOwotCWtlZXBfdnMgPSBOT19LRUVQX1ZTOwotCi0Jc2t0LT5pcnEgPSBDT1JHSV9JUlFfR1BJT19DRl9JUlE7CisJc2t0LT5pcnEgPSBzY29vcF9kZXZzW3NrdC0+bnJdLmlycTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzaGFycHNsX3BjbWNpYV9od19zaHV0ZG93bihzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKIHsKLQlzb2NfcGNtY2lhX2ZyZWVfaXJxcyhza3QsIGlycXMsIEFSUkFZX1NJWkUoaXJxcykpOworCWlmIChzY29vcF9kZXZzW3NrdC0+bnJdLmNkX2lycSA+PSAwKSB7CisJCXN0cnVjdCBwY21jaWFfaXJxcyBjZF9pcnE7CiAKLQkvKiBDRl9CVVNfT0ZGICovCi0Jc2hhcnBzbF9wY21jaWFfaW5pdF9yZXNldCgpOworCQljZF9pcnEuc29jayA9IHNrdC0+bnI7CisJCWNkX2lycS5pcnEgID0gc2Nvb3BfZGV2c1tza3QtPm5yXS5jZF9pcnE7CisJCWNkX2lycS5zdHIgID0gc2Nvb3BfZGV2c1tza3QtPm5yXS5jZF9pcnFfc3RyOworCQlzb2NfcGNtY2lhX2ZyZWVfaXJxcyhza3QsICZjZF9pcnEsIDEpOworCX0KIH0KIAogCkBAIC0xMDEsMzEgKzk4LDMyIEBACiAJCQkJICAgIHN0cnVjdCBwY21jaWFfc3RhdGUgKnN0YXRlKQogewogCXVuc2lnbmVkIHNob3J0IGNwciwgY3NyOworCXN0cnVjdCBkZXZpY2UgKnNjb29wID0gc2Nvb3BfZGV2c1tza3QtPm5yXS5kZXY7CiAKLQljcHIgPSByZWFkX3Njb29wX3JlZygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBTQ09PUF9DUFIpOworCWNwciA9IHJlYWRfc2Nvb3BfcmVnKHNjb29wX2RldnNbc2t0LT5ucl0uZGV2LCBTQ09PUF9DUFIpOwogCi0Jd3JpdGVfc2Nvb3BfcmVnKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIFNDT09QX0lSTSwgMHgwMEZGKTsKLQl3cml0ZV9zY29vcF9yZWcoJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfSVNSLCAweDAwMDApOwotCXdyaXRlX3Njb29wX3JlZygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBTQ09PUF9JUk0sIDB4MDAwMCk7Ci0JY3NyID0gcmVhZF9zY29vcF9yZWcoJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfQ1NSKTsKKwl3cml0ZV9zY29vcF9yZWcoc2Nvb3AsIFNDT09QX0lSTSwgMHgwMEZGKTsKKwl3cml0ZV9zY29vcF9yZWcoc2Nvb3AsIFNDT09QX0lTUiwgMHgwMDAwKTsKKwl3cml0ZV9zY29vcF9yZWcoc2Nvb3AsIFNDT09QX0lSTSwgMHgwMDAwKTsKKwljc3IgPSByZWFkX3Njb29wX3JlZyhzY29vcCwgU0NPT1BfQ1NSKTsKIAlpZiAoY3NyICYgMHgwMDA0KSB7CiAJCS8qIGNhcmQgZWplY3QgKi8KLQkJd3JpdGVfc2Nvb3BfcmVnKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIFNDT09QX0NEUiwgMHgwMDAwKTsKLQkJa2VlcF92cyA9IE5PX0tFRVBfVlM7CisJCXdyaXRlX3Njb29wX3JlZyhzY29vcCwgU0NPT1BfQ0RSLCAweDAwMDApOworCQlzY29vcF9kZXZzW3NrdC0+bnJdLmtlZXBfdnMgPSBOT19LRUVQX1ZTOwogCX0KLQllbHNlIGlmICghKGtlZXBfdnMgJiBOT19LRUVQX1ZTKSkgeworCWVsc2UgaWYgKCEoc2Nvb3BfZGV2c1tza3QtPm5yXS5rZWVwX3ZzICYgTk9fS0VFUF9WUykpIHsKIAkJLyoga2VlcCB2czEsdnMyICovCi0JCXdyaXRlX3Njb29wX3JlZygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBTQ09PUF9DRFIsIDB4MDAwMCk7Ci0JCWNzciB8PSBrZWVwX3ZzOworCQl3cml0ZV9zY29vcF9yZWcoc2Nvb3AsIFNDT09QX0NEUiwgMHgwMDAwKTsKKwkJY3NyIHw9IHNjb29wX2RldnNbc2t0LT5ucl0ua2VlcF92czsKIAl9CiAJZWxzZSBpZiAoY3ByICYgMHgwMDAzKSB7CiAJCS8qIHBvd2VyIG9uICovCi0JCXdyaXRlX3Njb29wX3JlZygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBTQ09PUF9DRFIsIDB4MDAwMCk7Ci0JCWtlZXBfdnMgPSAoY3NyICYgMHgwMEMwKTsKKwkJd3JpdGVfc2Nvb3BfcmVnKHNjb29wLCBTQ09PUF9DRFIsIDB4MDAwMCk7CisJCXNjb29wX2RldnNbc2t0LT5ucl0ua2VlcF92cyA9IChjc3IgJiAweDAwQzApOwogCX0KIAllbHNlIHsKIAkJLyogY2FyZCBkZXRlY3QgKi8KLQkJd3JpdGVfc2Nvb3BfcmVnKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIFNDT09QX0NEUiwgMHgwMDAyKTsKKwkJd3JpdGVfc2Nvb3BfcmVnKHNjb29wLCBTQ09PUF9DRFIsIDB4MDAwMik7CiAJfQogCiAJc3RhdGUtPmRldGVjdCA9IChjc3IgJiAweDAwMDQpID8gMCA6IDE7CkBAIC0xNDcsNiArMTQ1LDcgQEAKIAkJCQkgICAgICAgY29uc3Qgc29ja2V0X3N0YXRlX3QgKnN0YXRlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGRldmljZSAqc2Nvb3AgPSBzY29vcF9kZXZzW3NrdC0+bnJdLmRldjsKIAogCXVuc2lnbmVkIHNob3J0IGNwciwgbmNwciwgY2NyLCBuY2NyLCBtY3IsIG5tY3IsIGltciwgbmltcjsKIApAQCAtMTY2LDEwICsxNjUsMTAgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAotCW5tY3IgPSAobWNyID0gcmVhZF9zY29vcF9yZWcoJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfTUNSKSkgJiB+MHgwMDEwOwotCW5jcHIgPSAoY3ByID0gcmVhZF9zY29vcF9yZWcoJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfQ1BSKSkgJiB+MHgwMDgzOwotCW5jY3IgPSAoY2NyID0gcmVhZF9zY29vcF9yZWcoJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfQ0NSKSkgJiB+MHgwMDgwOwotCW5pbXIgPSAoaW1yID0gcmVhZF9zY29vcF9yZWcoJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfSU1SKSkgJiB+MHgwMDNFOworCW5tY3IgPSAobWNyID0gcmVhZF9zY29vcF9yZWcoc2Nvb3AsIFNDT09QX01DUikpICYgfjB4MDAxMDsKKwluY3ByID0gKGNwciA9IHJlYWRfc2Nvb3BfcmVnKHNjb29wLCBTQ09PUF9DUFIpKSAmIH4weDAwODM7CisJbmNjciA9IChjY3IgPSByZWFkX3Njb29wX3JlZyhzY29vcCwgU0NPT1BfQ0NSKSkgJiB+MHgwMDgwOworCW5pbXIgPSAoaW1yID0gcmVhZF9zY29vcF9yZWcoc2Nvb3AsIFNDT09QX0lNUikpICYgfjB4MDAzRTsKIAogCW5jcHIgfD0gKHN0YXRlLT5WY2MgPT0gMzMpID8gMHgwMDAxIDoKIAkJCQkoc3RhdGUtPlZjYyA9PSA1MCkgPyAweDAwMDIgOiAwOwpAQCAtMTg0LDIyICsxODMsMjIgQEAKIAkJCSgoc2t0LT5zdGF0dXMmU1NfV1JQUk9UKSA/IDB4MDAwOCA6IDApOwogCiAJaWYgKCEobmNwciAmIDB4MDAwMykpIHsKLQkJa2VlcF9yZCA9IDA7Ci0JfSBlbHNlIGlmICgha2VlcF9yZCkgeworCQlzY29vcF9kZXZzW3NrdC0+bnJdLmtlZXBfcmQgPSAwOworCX0gZWxzZSBpZiAoIXNjb29wX2RldnNbc2t0LT5ucl0ua2VlcF9yZCkgewogCQlpZiAobmNjciAmIDB4MDA4MCkKLQkJCWtlZXBfcmQgPSAxOworCQkJc2Nvb3BfZGV2c1tza3QtPm5yXS5rZWVwX3JkID0gMTsKIAkJZWxzZQogCQkJbmNjciB8PSAweDAwODA7CiAJfQogCiAJaWYgKG1jciAhPSBubWNyKQotCQl3cml0ZV9zY29vcF9yZWcoJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfTUNSLCBubWNyKTsKKwkJd3JpdGVfc2Nvb3BfcmVnKHNjb29wLCBTQ09PUF9NQ1IsIG5tY3IpOwogCWlmIChjcHIgIT0gbmNwcikKLQkJd3JpdGVfc2Nvb3BfcmVnKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIFNDT09QX0NQUiwgbmNwcik7CisJCXdyaXRlX3Njb29wX3JlZyhzY29vcCwgU0NPT1BfQ1BSLCBuY3ByKTsKIAlpZiAoY2NyICE9IG5jY3IpCi0JCXdyaXRlX3Njb29wX3JlZygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBTQ09PUF9DQ1IsIG5jY3IpOworCQl3cml0ZV9zY29vcF9yZWcoc2Nvb3AsIFNDT09QX0NDUiwgbmNjcik7CiAJaWYgKGltciAhPSBuaW1yKQotCQl3cml0ZV9zY29vcF9yZWcoJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfSU1SLCBuaW1yKTsKKwkJd3JpdGVfc2Nvb3BfcmVnKHNjb29wLCBTQ09PUF9JTVIsIG5pbXIpOwogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCkBAIC0yMDgsMTAgKzIwNywxOCBAQAogCiBzdGF0aWMgdm9pZCBzaGFycHNsX3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKIHsKKwlzaGFycHNsX3BjbWNpYV9pbml0X3Jlc2V0KCZzY29vcF9kZXZzW3NrdC0+bnJdKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KKwl3cml0ZV9zY29vcF9yZWcoc2Nvb3BfZGV2c1tza3QtPm5yXS5kZXYsIFNDT09QX0lNUiwgMHgwMEMwKTsKKwl3cml0ZV9zY29vcF9yZWcoc2Nvb3BfZGV2c1tza3QtPm5yXS5kZXYsIFNDT09QX01DUiwgMHgwMTAxKTsKKwlzY29vcF9kZXZzW3NrdC0+bnJdLmtlZXBfdnMgPSBOT19LRUVQX1ZTOwogfQogCiBzdGF0aWMgdm9pZCBzaGFycHNsX3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKIHsKKwkvKiBDRl9CVVNfT0ZGICovCisJc2hhcnBzbF9wY21jaWFfaW5pdF9yZXNldCgmc2Nvb3BfZGV2c1tza3QtPm5yXSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCBzaGFycHNsX3BjbWNpYV9vcHMgPSB7CkBAIC0yMjMsNyArMjMwLDcgQEAKIAkuc29ja2V0X2luaXQJCT0gc2hhcnBzbF9wY21jaWFfc29ja2V0X2luaXQsCiAJLnNvY2tldF9zdXNwZW5kCQk9IHNoYXJwc2xfcGNtY2lhX3NvY2tldF9zdXNwZW5kLAogCS5maXJzdAkJCQk9IDAsCi0JLm5yCQkJCQk9IDEsCisJLm5yCQkJCQk9IDAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2hhcnBzbF9wY21jaWFfZGV2aWNlOwpAQCAtMjMyLDEyICsyMzksMTUgQEAKIHsKIAlpbnQgcmV0OwogCisJc2hhcnBzbF9wY21jaWFfb3BzLm5yPXNjb29wX251bTsKIAlzaGFycHNsX3BjbWNpYV9kZXZpY2UgPSBrbWFsbG9jKHNpemVvZigqc2hhcnBzbF9wY21jaWFfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzaGFycHNsX3BjbWNpYV9kZXZpY2UpCiAJCXJldHVybiAtRU5PTUVNOworCiAJbWVtc2V0KHNoYXJwc2xfcGNtY2lhX2RldmljZSwgMCwgc2l6ZW9mKCpzaGFycHNsX3BjbWNpYV9kZXZpY2UpKTsKIAlzaGFycHNsX3BjbWNpYV9kZXZpY2UtPm5hbWUgPSAicHhhMnh4LXBjbWNpYSI7CiAJc2hhcnBzbF9wY21jaWFfZGV2aWNlLT5kZXYucGxhdGZvcm1fZGF0YSA9ICZzaGFycHNsX3BjbWNpYV9vcHM7CisJc2hhcnBzbF9wY21jaWFfZGV2aWNlLT5kZXYucGFyZW50PXNjb29wX2RldnNbMF0uZGV2OwogCiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHNoYXJwc2xfcGNtY2lhX2RldmljZSk7CiAJaWYgKHJldCkKQEAgLTI1Nyw3ICsyNjcsNyBAQAogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNoYXJwc2xfcGNtY2lhX2RldmljZSk7CiB9CiAKLW1vZHVsZV9pbml0KHNoYXJwc2xfcGNtY2lhX2luaXQpOworZnNfaW5pdGNhbGwoc2hhcnBzbF9wY21jaWFfaW5pdCk7CiBtb2R1bGVfZXhpdChzaGFycHNsX3BjbWNpYV9leGl0KTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTaGFycCBTTCBTZXJpZXMgUENNQ0lBIFN1cHBvcnQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NhMTEwMF9nZW5lcmljLmMgYi9kcml2ZXJzL3BjbWNpYS9zYTExMDBfZ2VuZXJpYy5jCmluZGV4IGU5OGJiM2QuLmQ0ZWQ1MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NhMTEwMF9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc2ExMTAwX2dlbmVyaWMuYwpAQCAtMTI2LDUgKzEyNiw1IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkxpbnV4IFBDTUNJQSBDYXJkIFNlcnZpY2VzOiBTQS0xMXgwIFNvY2tldCBDb250cm9sbGVyIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CiAKLW1vZHVsZV9pbml0KHNhMTF4MF9wY21jaWFfaW5pdCk7Citmc19pbml0Y2FsbChzYTExeDBfcGNtY2lhX2luaXQpOwogbW9kdWxlX2V4aXQoc2ExMXgwX3BjbWNpYV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9nZW5lcmljLmMgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfZ2VuZXJpYy5jCmluZGV4IGI0NDFmNDMuLmJiOTBhMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX2dlbmVyaWMuYwpAQCAtMTg5LDcgKzE4OSw3IEBACiAJc2ExMTExX2RyaXZlcl91bnJlZ2lzdGVyKCZwY21jaWFfZHJpdmVyKTsKIH0KIAotbW9kdWxlX2luaXQoc2ExMTExX2Rydl9wY21jaWFfaW5pdCk7Citmc19pbml0Y2FsbChzYTExMTFfZHJ2X3BjbWNpYV9pbml0KTsKIG1vZHVsZV9leGl0KHNhMTExMV9kcnZfcGNtY2lhX2V4aXQpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNBMTExMSBQQ01DSUEgY2FyZCBzb2NrZXQgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zYTExeHhfYmFzZS5jIGIvZHJpdmVycy9wY21jaWEvc2ExMXh4X2Jhc2UuYwppbmRleCBkYjA0ZmZiLi41OWM1ZDk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zYTExeHhfYmFzZS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NhMTF4eF9iYXNlLmMKQEAgLTE4OSw3ICsxODksNyBAQAogewogCXJldHVybiAwOwogfQotbW9kdWxlX2luaXQoc2ExMXh4X3BjbWNpYV9pbml0KTsKK2ZzX2luaXRjYWxsKHNhMTF4eF9wY21jaWFfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzYTExeHhfcGNtY2lhX2V4aXQodm9pZCkge30KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvdG9waWMuaCBiL2RyaXZlcnMvcGNtY2lhL3RvcGljLmgKaW5kZXggYmU0MjBiYi4uZWRjY2ZhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvdG9waWMuaAorKysgYi9kcml2ZXJzL3BjbWNpYS90b3BpYy5oCkBAIC0xMDEsNiArMTAxLDggQEAKICNkZWZpbmUgIFRPUElDOTdfQVZTX0FVRElPX0NPTlRST0wJMHgwMgogI2RlZmluZSAgVE9QSUM5N19BVlNfVklERU9fQ09OVFJPTAkweDAxCiAKKyNkZWZpbmUgVE9QSUNfRVhDQV9JRl9DT05UUk9MCQkweDNlCS8qIDggYml0ICovCisjZGVmaW5lIFRPUElDX0VYQ0FfSUZDXzMzVl9FTkEJCTB4MDEKIAogc3RhdGljIHZvaWQgdG9waWM5N196b29tX3ZpZGVvKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrLCBpbnQgb25vZmYpCiB7CkBAIC0xMzcsNCArMTM5LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKKworc3RhdGljIGludCB0b3BpYzk1X292ZXJyaWRlKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCkKK3sKKwl1OCBmY3RybDsKKworCS8qIGVuYWJsZSAzLjNWIHN1cHBvcnQgZm9yIDE2Yml0IGNhcmRzICovCisJZmN0cmwgPSBleGNhX3JlYWRiKHNvY2tldCwgVE9QSUNfRVhDQV9JRl9DT05UUk9MKTsKKwlleGNhX3dyaXRlYihzb2NrZXQsIFRPUElDX0VYQ0FfSUZfQ09OVFJPTCwgZmN0cmwgfCBUT1BJQ19FWENBX0lGQ18zM1ZfRU5BKTsKKworCS8qIHRlbGwgeWVudGEgdG8gdXNlIGV4Y2EgcmVnaXN0ZXJzIHRvIHBvd2VyIDE2Yml0IGNhcmRzICovCisJc29ja2V0LT5mbGFncyB8PSBZRU5UQV8xNkJJVF9QT1dFUl9FWENBIHwgWUVOVEFfMTZCSVRfUE9XRVJfREY7CisKKwlyZXR1cm4gMDsKK30KKwogI2VuZGlmIC8qIF9MSU5VWF9UT1BJQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCmluZGV4IDYyZmQ3MDUuLmYwOTk3YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCkBAIC03Miw2ICs3Miw3IEBACiB7CiAJZGVidWcoIiVwICUwNHggJTA4eFxuIiwgc29ja2V0LCByZWcsIHZhbCk7CiAJd3JpdGVsKHZhbCwgc29ja2V0LT5iYXNlICsgcmVnKTsKKwlyZWFkbChzb2NrZXQtPmJhc2UgKyByZWcpOyAvKiBhdm9pZCBwcm9ibGVtcyB3aXRoIFBDSSB3cml0ZSBwb3N0aW5nICovCiB9CiAKIHN0YXRpYyBpbmxpbmUgdTggY29uZmlnX3JlYWRiKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCwgdW5zaWduZWQgb2Zmc2V0KQpAQCAtMTM2LDYgKzEzNyw3IEBACiB7CiAJZGVidWcoIiVwICUwNHggJTAyeFxuIiwgc29ja2V0LCByZWcsIHZhbCk7CiAJd3JpdGViKHZhbCwgc29ja2V0LT5iYXNlICsgMHg4MDAgKyByZWcpOworCXJlYWRiKHNvY2tldC0+YmFzZSArIDB4ODAwICsgcmVnKTsgLyogUENJIHdyaXRlIHBvc3RpbmcuLi4gKi8KIH0KIAogc3RhdGljIHZvaWQgZXhjYV93cml0ZXcoc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0LCB1bnNpZ25lZCByZWcsIHUxNiB2YWwpCkBAIC0xNDMsNiArMTQ1LDEwIEBACiAJZGVidWcoIiVwICUwNHggJTA0eFxuIiwgc29ja2V0LCByZWcsIHZhbCk7CiAJd3JpdGViKHZhbCwgc29ja2V0LT5iYXNlICsgMHg4MDAgKyByZWcpOwogCXdyaXRlYih2YWwgPj4gOCwgc29ja2V0LT5iYXNlICsgMHg4MDAgKyByZWcgKyAxKTsKKworCS8qIFBDSSB3cml0ZSBwb3N0aW5nLi4uICovCisJcmVhZGIoc29ja2V0LT5iYXNlICsgMHg4MDAgKyByZWcpOworCXJlYWRiKHNvY2tldC0+YmFzZSArIDB4ODAwICsgcmVnICsgMSk7CiB9CiAKIC8qCkBAIC0xODQsMjIgKzE5MCw1MiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHllbnRhX1ZjY19wb3dlcih1MzIgY29udHJvbCkKK3N0YXRpYyB2b2lkIHllbnRhX2dldF9wb3dlcihzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQsIHNvY2tldF9zdGF0ZV90ICpzdGF0ZSkKIHsKLQlzd2l0Y2ggKGNvbnRyb2wgJiBDQl9TQ19WQ0NfTUFTSykgewotCWNhc2UgQ0JfU0NfVkNDXzVWOiByZXR1cm4gNTA7Ci0JY2FzZSBDQl9TQ19WQ0NfM1Y6IHJldHVybiAzMzsKLQlkZWZhdWx0OiByZXR1cm4gMDsKLQl9Ci19CisJaWYgKCEoY2JfcmVhZGwoc29ja2V0LCBDQl9TT0NLRVRfU1RBVEUpICYgQ0JfQ0JDQVJEKSAmJgorCSAgICAoc29ja2V0LT5mbGFncyAmIFlFTlRBXzE2QklUX1BPV0VSX0VYQ0EpKSB7CisJCXU4IHJlZywgdmNjLCB2cHA7CiAKLXN0YXRpYyBpbnQgeWVudGFfVnBwX3Bvd2VyKHUzMiBjb250cm9sKQotewotCXN3aXRjaCAoY29udHJvbCAmIENCX1NDX1ZQUF9NQVNLKSB7Ci0JY2FzZSBDQl9TQ19WUFBfMTJWOiByZXR1cm4gMTIwOwotCWNhc2UgQ0JfU0NfVlBQXzVWOiByZXR1cm4gNTA7Ci0JY2FzZSBDQl9TQ19WUFBfM1Y6IHJldHVybiAzMzsKLQlkZWZhdWx0OiByZXR1cm4gMDsKKwkJcmVnID0gZXhjYV9yZWFkYihzb2NrZXQsIEkzNjVfUE9XRVIpOworCQl2Y2MgPSByZWcgJiBJMzY1X1ZDQ19NQVNLOworCQl2cHAgPSByZWcgJiBJMzY1X1ZQUDFfTUFTSzsKKwkJc3RhdGUtPlZjYyA9IHN0YXRlLT5WcHAgPSAwOworCisJCWlmIChzb2NrZXQtPmZsYWdzICYgWUVOVEFfMTZCSVRfUE9XRVJfREYpIHsKKwkJCWlmICh2Y2MgPT0gSTM2NV9WQ0NfM1YpCisJCQkJc3RhdGUtPlZjYyA9IDMzOworCQkJaWYgKHZjYyA9PSBJMzY1X1ZDQ181VikKKwkJCQlzdGF0ZS0+VmNjID0gNTA7CisJCQlpZiAodnBwID09IEkzNjVfVlBQMV81VikKKwkJCQlzdGF0ZS0+VnBwID0gc3RhdGUtPlZjYzsKKwkJCWlmICh2cHAgPT0gSTM2NV9WUFAxXzEyVikKKwkJCQlzdGF0ZS0+VnBwID0gMTIwOworCQl9IGVsc2UgeworCQkJaWYgKHJlZyAmIEkzNjVfVkNDXzVWKSB7CisJCQkJc3RhdGUtPlZjYyA9IDUwOworCQkJCWlmICh2cHAgPT0gSTM2NV9WUFAxXzVWKQorCQkJCQlzdGF0ZS0+VnBwID0gNTA7CisJCQkJaWYgKHZwcCA9PSBJMzY1X1ZQUDFfMTJWKQorCQkJCQlzdGF0ZS0+VnBwID0gMTIwOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJdTMyIGNvbnRyb2w7CisKKwkJY29udHJvbCA9IGNiX3JlYWRsKHNvY2tldCwgQ0JfU09DS0VUX0NPTlRST0wpOworCisJCXN3aXRjaCAoY29udHJvbCAmIENCX1NDX1ZDQ19NQVNLKSB7CisJCWNhc2UgQ0JfU0NfVkNDXzVWOiBzdGF0ZS0+VmNjID0gNTA7IGJyZWFrOworCQljYXNlIENCX1NDX1ZDQ18zVjogc3RhdGUtPlZjYyA9IDMzOyBicmVhazsKKwkJZGVmYXVsdDogc3RhdGUtPlZjYyA9IDA7CisJCX0KKworCQlzd2l0Y2ggKGNvbnRyb2wgJiBDQl9TQ19WUFBfTUFTSykgeworCQljYXNlIENCX1NDX1ZQUF8xMlY6IHN0YXRlLT5WcHAgPSAxMjA7IGJyZWFrOworCQljYXNlIENCX1NDX1ZQUF81Vjogc3RhdGUtPlZwcCA9IDUwOyBicmVhazsKKwkJY2FzZSBDQl9TQ19WUFBfM1Y6IHN0YXRlLT5WcHAgPSAzMzsgYnJlYWs7CisJCWRlZmF1bHQ6IHN0YXRlLT5WcHAgPSAwOworCQl9CiAJfQogfQogCkBAIC0yMTEsOCArMjQ3LDcgQEAKIAogCWNvbnRyb2wgPSBjYl9yZWFkbChzb2NrZXQsIENCX1NPQ0tFVF9DT05UUk9MKTsKIAotCXN0YXRlLT5WY2MgPSB5ZW50YV9WY2NfcG93ZXIoY29udHJvbCk7Ci0Jc3RhdGUtPlZwcCA9IHllbnRhX1ZwcF9wb3dlcihjb250cm9sKTsKKwl5ZW50YV9nZXRfcG93ZXIoc29ja2V0LCBzdGF0ZSk7CiAJc3RhdGUtPmlvX2lycSA9IHNvY2tldC0+aW9faXJxOwogCiAJaWYgKGNiX3JlYWRsKHNvY2tldCwgQ0JfU09DS0VUX1NUQVRFKSAmIENCX0NCQ0FSRCkgewpAQCAtMjQ2LDE5ICsyODEsNTQgQEAKIAogc3RhdGljIHZvaWQgeWVudGFfc2V0X3Bvd2VyKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCwgc29ja2V0X3N0YXRlX3QgKnN0YXRlKQogewotCXUzMiByZWcgPSAwOwkvKiBDQl9TQ19TVFBDTEs/ICovCi0Jc3dpdGNoIChzdGF0ZS0+VmNjKSB7Ci0JY2FzZSAzMzogcmVnID0gQ0JfU0NfVkNDXzNWOyBicmVhazsKLQljYXNlIDUwOiByZWcgPSBDQl9TQ19WQ0NfNVY7IGJyZWFrOwotCWRlZmF1bHQ6IHJlZyA9IDA7IGJyZWFrOworCS8qIHNvbWUgYmlyZGdlcyByZXF1aXJlIHRvIHVzZSB0aGUgRXhDQSByZWdpc3RlcnMgdG8gcG93ZXIgMTZiaXQgY2FyZHMgKi8KKwlpZiAoIShjYl9yZWFkbChzb2NrZXQsIENCX1NPQ0tFVF9TVEFURSkgJiBDQl9DQkNBUkQpICYmCisJICAgIChzb2NrZXQtPmZsYWdzICYgWUVOVEFfMTZCSVRfUE9XRVJfRVhDQSkpIHsKKwkJdTggcmVnLCBvbGQ7CisJCXJlZyA9IG9sZCA9IGV4Y2FfcmVhZGIoc29ja2V0LCBJMzY1X1BPV0VSKTsKKwkJcmVnICY9IH4oSTM2NV9WQ0NfTUFTSyB8IEkzNjVfVlBQMV9NQVNLIHwgSTM2NV9WUFAyX01BU0spOworCisJCS8qIGk4MjM2NVNMLURGIHN0eWxlICovCisJCWlmIChzb2NrZXQtPmZsYWdzICYgWUVOVEFfMTZCSVRfUE9XRVJfREYpIHsKKwkJCXN3aXRjaCAoc3RhdGUtPlZjYykgeworCQkJY2FzZSAzMzogcmVnIHw9IEkzNjVfVkNDXzNWOyBicmVhazsKKwkJCWNhc2UgNTA6IHJlZyB8PSBJMzY1X1ZDQ181VjsgYnJlYWs7CisJCQlkZWZhdWx0OiByZWcgPSAwOyBicmVhazsKKwkJCX0KKwkJCXN3aXRjaCAoc3RhdGUtPlZwcCkgeworCQkJY2FzZSAzMzoKKwkJCWNhc2UgNTA6IHJlZyB8PSBJMzY1X1ZQUDFfNVY7IGJyZWFrOworCQkJY2FzZSAxMjA6IHJlZyB8PSBJMzY1X1ZQUDFfMTJWOyBicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGk4MjM2NVNMLUIgc3R5bGUgKi8KKwkJCXN3aXRjaCAoc3RhdGUtPlZjYykgeworCQkJY2FzZSA1MDogcmVnIHw9IEkzNjVfVkNDXzVWOyBicmVhazsKKwkJCWRlZmF1bHQ6IHJlZyA9IDA7IGJyZWFrOworCQkJfQorCQkJc3dpdGNoIChzdGF0ZS0+VnBwKSB7CisJCQljYXNlIDUwOiByZWcgfD0gSTM2NV9WUFAxXzVWIHwgSTM2NV9WUFAyXzVWOyBicmVhazsKKwkJCWNhc2UgMTIwOiByZWcgfD0gSTM2NV9WUFAxXzEyViB8IEkzNjVfVlBQMl8xMlY7IGJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHJlZyAhPSBvbGQpCisJCQlleGNhX3dyaXRlYihzb2NrZXQsIEkzNjVfUE9XRVIsIHJlZyk7CisJfSBlbHNlIHsKKwkJdTMyIHJlZyA9IDA7CS8qIENCX1NDX1NUUENMSz8gKi8KKwkJc3dpdGNoIChzdGF0ZS0+VmNjKSB7CisJCWNhc2UgMzM6IHJlZyA9IENCX1NDX1ZDQ18zVjsgYnJlYWs7CisJCWNhc2UgNTA6IHJlZyA9IENCX1NDX1ZDQ181VjsgYnJlYWs7CisJCWRlZmF1bHQ6IHJlZyA9IDA7IGJyZWFrOworCQl9CisJCXN3aXRjaCAoc3RhdGUtPlZwcCkgeworCQljYXNlIDMzOiAgcmVnIHw9IENCX1NDX1ZQUF8zVjsgYnJlYWs7CisJCWNhc2UgNTA6ICByZWcgfD0gQ0JfU0NfVlBQXzVWOyBicmVhazsKKwkJY2FzZSAxMjA6IHJlZyB8PSBDQl9TQ19WUFBfMTJWOyBicmVhazsKKwkJfQorCQlpZiAocmVnICE9IGNiX3JlYWRsKHNvY2tldCwgQ0JfU09DS0VUX0NPTlRST0wpKQorCQkJY2Jfd3JpdGVsKHNvY2tldCwgQ0JfU09DS0VUX0NPTlRST0wsIHJlZyk7CiAJfQotCXN3aXRjaCAoc3RhdGUtPlZwcCkgewotCWNhc2UgMzM6ICByZWcgfD0gQ0JfU0NfVlBQXzNWOyBicmVhazsKLQljYXNlIDUwOiAgcmVnIHw9IENCX1NDX1ZQUF81VjsgYnJlYWs7Ci0JY2FzZSAxMjA6IHJlZyB8PSBDQl9TQ19WUFBfMTJWOyBicmVhazsKLQl9Ci0JaWYgKHJlZyAhPSBjYl9yZWFkbChzb2NrZXQsIENCX1NPQ0tFVF9DT05UUk9MKSkKLQkJY2Jfd3JpdGVsKHNvY2tldCwgQ0JfU09DS0VUX0NPTlRST0wsIHJlZyk7CiB9CiAKIHN0YXRpYyBpbnQgeWVudGFfc2V0X3NvY2tldChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywgc29ja2V0X3N0YXRlX3QgKnN0YXRlKQpAQCAtNjAzLDcgKzY3Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHllbnRhX2FsbG9jYXRlX3JlcyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQsIGludCBuciwgdW5zaWduZWQgdHlwZSwgaW50IGFkZHJfc3RhcnQsIGludCBhZGRyX2VuZCkKK3N0YXRpYyBpbnQgeWVudGFfYWxsb2NhdGVfcmVzKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCwgaW50IG5yLCB1bnNpZ25lZCB0eXBlLCBpbnQgYWRkcl9zdGFydCwgaW50IGFkZHJfZW5kKQogewogCXN0cnVjdCByZXNvdXJjZSAqcm9vdCwgKnJlczsKIAlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gcmVnaW9uOwpAQCAtNjEyLDcgKzY4Miw3IEBACiAJcmVzID0gc29ja2V0LT5kZXYtPnJlc291cmNlICsgUENJX0JSSURHRV9SRVNPVVJDRVMgKyBucjsKIAkvKiBBbHJlYWR5IGFsbG9jYXRlZD8gKi8KIAlpZiAocmVzLT5wYXJlbnQpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAkvKiBUaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIG1lbW9yeSBsaW1pdCBpcyA0a0IsIG9uIElPIGl0J3MgNCBieXRlcyAqLwogCW1hc2sgPSB+MHhmZmY7CkBAIC02MjgsNyArNjk4LDcgQEAKIAkJcGNpYmlvc19idXNfdG9fcmVzb3VyY2Uoc29ja2V0LT5kZXYsIHJlcywgJnJlZ2lvbik7CiAJCXJvb3QgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2Uoc29ja2V0LT5kZXYsIHJlcyk7CiAJCWlmIChyb290ICYmIChyZXF1ZXN0X3Jlc291cmNlKHJvb3QsIHJlcykgPT0gMCkpCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAkJcHJpbnRrKEtFUk5fSU5GTyAieWVudGEgJXM6IFByZWFzc2lnbmVkIHJlc291cmNlICVkIGJ1c3kgb3Igbm90IGF2YWlsYWJsZSwgcmVjb25maWd1cmluZy4uLlxuIiwKIAkJCQlwY2lfbmFtZShzb2NrZXQtPmRldiksIG5yKTsKIAl9CkBAIC02MzYsMzUgKzcwNiwyNyBAQAogCWlmICh0eXBlICYgSU9SRVNPVVJDRV9JTykgewogCQlpZiAoKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9JT19NQVgpKSB8fAogCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9JT19BQ0MpKSB8fAotCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9JT19NSU4pKSkgewotCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfc3RhcnQsIHJlcy0+c3RhcnQpOwotCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfZW5kLCByZXMtPmVuZCk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJICAgICh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfSU9fTUlOKSkpCisJCQlyZXR1cm4gMTsKIAl9IGVsc2UgewogCQlpZiAodHlwZSAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpIHsKIAkJCWlmICgoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX01FTV9NQVgpKSB8fAogCQkJICAgICh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfTUVNX0FDQykpIHx8Ci0JCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9NRU1fTUlOKSkpIHsKLQkJCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9zdGFydCwgcmVzLT5zdGFydCk7Ci0JCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfZW5kLCByZXMtPmVuZCk7Ci0JCQkJcmV0dXJuOwotCQkJfQorCQkJICAgICh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfTUVNX01JTikpKQorCQkJCXJldHVybiAxOwogCQkJLyogQXBwcm94aW1hdGluZyBwcmVmZXRjaGFibGUgYnkgbm9uLXByZWZldGNoYWJsZSAqLwogCQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwogCQl9CiAJCWlmICgoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX01FTV9NQVgpKSB8fAogCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9NRU1fQUNDKSkgfHwKLQkJICAgICh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfTUVNX01JTikpKSB7Ci0JCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9zdGFydCwgcmVzLT5zdGFydCk7Ci0JCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9lbmQsIHJlcy0+ZW5kKTsKLQkJCXJldHVybjsKLQkJfQorCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9NRU1fTUlOKSkpCisJCQlyZXR1cm4gMTsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJ5ZW50YSAlczogbm8gcmVzb3VyY2Ugb2YgdHlwZSAleCBhdmFpbGFibGUsIHRyeWluZyB0byBjb250aW51ZS4uLlxuIiwKIAkgICAgICAgcGNpX25hbWUoc29ja2V0LT5kZXYpLCB0eXBlKTsKIAlyZXMtPnN0YXJ0ID0gcmVzLT5lbmQgPSByZXMtPmZsYWdzID0gMDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTY3MiwxNCArNzM0LDE3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHllbnRhX2FsbG9jYXRlX3Jlc291cmNlcyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQpCiB7Ci0JeWVudGFfYWxsb2NhdGVfcmVzKHNvY2tldCwgMCwgSU9SRVNPVVJDRV9JTywKKwlpbnQgcHJvZ3JhbSA9IDA7CisJcHJvZ3JhbSArPSB5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAwLCBJT1JFU09VUkNFX0lPLAogCQkJICAgUENJX0NCX0lPX0JBU0VfMCwgUENJX0NCX0lPX0xJTUlUXzApOwotCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDEsIElPUkVTT1VSQ0VfSU8sCisJcHJvZ3JhbSArPSB5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAxLCBJT1JFU09VUkNFX0lPLAogCQkJICAgUENJX0NCX0lPX0JBU0VfMSwgUENJX0NCX0lPX0xJTUlUXzEpOwotCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDIsIElPUkVTT1VSQ0VfTUVNfElPUkVTT1VSQ0VfUFJFRkVUQ0gsCisJcHJvZ3JhbSArPSB5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAyLCBJT1JFU09VUkNFX01FTXxJT1JFU09VUkNFX1BSRUZFVENILAogCQkJICAgUENJX0NCX01FTU9SWV9CQVNFXzAsIFBDSV9DQl9NRU1PUllfTElNSVRfMCk7Ci0JeWVudGFfYWxsb2NhdGVfcmVzKHNvY2tldCwgMywgSU9SRVNPVVJDRV9NRU0sCisJcHJvZ3JhbSArPSB5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAzLCBJT1JFU09VUkNFX01FTSwKIAkJCSAgIFBDSV9DQl9NRU1PUllfQkFTRV8xLCBQQ0lfQ0JfTUVNT1JZX0xJTUlUXzEpOworCWlmIChwcm9ncmFtKQorCQlwY2lfc2V0dXBfY2FyZGJ1cyhzb2NrZXQtPmRldi0+c3Vib3JkaW5hdGUpOwogfQogCiAKQEAgLTY5NCw3ICs3NTksNyBAQAogCQlyZXMgPSBzb2NrZXQtPmRldi0+cmVzb3VyY2UgKyBQQ0lfQlJJREdFX1JFU09VUkNFUyArIGk7CiAJCWlmIChyZXMtPnN0YXJ0ICE9IDAgJiYgcmVzLT5lbmQgIT0gMCkKIAkJCXJlbGVhc2VfcmVzb3VyY2UocmVzKTsKLQkJcmVzLT5zdGFydCA9IHJlcy0+ZW5kID0gMDsKKwkJcmVzLT5zdGFydCA9IHJlcy0+ZW5kID0gcmVzLT5mbGFncyA9IDA7CiAJfQogfQogCkBAIC03NTEsNiArODE2LDcgQEAKIAlDQVJEQlVTX1RZUEVfVEkxMlhYLAogCUNBUkRCVVNfVFlQRV9USTEyNTAsCiAJQ0FSREJVU19UWVBFX1JJQ09ILAorCUNBUkRCVVNfVFlQRV9UT1BJQzk1LAogCUNBUkRCVVNfVFlQRV9UT1BJQzk3LAogCUNBUkRCVVNfVFlQRV9PMk1JQ1JPLAogfTsKQEAgLTc4OSw2ICs4NTUsOSBAQAogCQkuc2F2ZV9zdGF0ZQk9IHJpY29oX3NhdmVfc3RhdGUsCiAJCS5yZXN0b3JlX3N0YXRlCT0gcmljb2hfcmVzdG9yZV9zdGF0ZSwKIAl9LAorCVtDQVJEQlVTX1RZUEVfVE9QSUM5NV0JPSB7CisJCS5vdmVycmlkZQk9IHRvcGljOTVfb3ZlcnJpZGUsCisJfSwKIAlbQ0FSREJVU19UWVBFX1RPUElDOTddCT0gewogCQkub3ZlcnJpZGUJPSB0b3BpYzk3X292ZXJyaWRlLAogCX0sCkBAIC0xMTk2LDYgKzEyNjUsNyBAQAogCUNCX0lEKFBDSV9WRU5ET1JfSURfUklDT0gsIFBDSV9ERVZJQ0VfSURfUklDT0hfUkw1QzQ3NiwgUklDT0gpLAogCUNCX0lEKFBDSV9WRU5ET1JfSURfUklDT0gsIFBDSV9ERVZJQ0VfSURfUklDT0hfUkw1QzQ3OCwgUklDT0gpLAogCisJQ0JfSUQoUENJX1ZFTkRPUl9JRF9UT1NISUJBLCBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfVE9QSUM5NSwgVE9QSUM5NSksCiAJQ0JfSUQoUENJX1ZFTkRPUl9JRF9UT1NISUJBLCBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfVE9QSUM5NywgVE9QSUM5NyksCiAJQ0JfSUQoUENJX1ZFTkRPUl9JRF9UT1NISUJBLCBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfVE9QSUMxMDAsIFRPUElDOTcpLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuaCBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5oCmluZGV4IDRlNjM3ZWUuLjRlNzVlOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5oCkBAIC05NSw2ICs5NSwxMiBAQAogICovCiAjZGVmaW5lIENCX01FTV9QQUdFKG1hcCkJKDB4NDAgKyAobWFwKSkKIAorCisvKiBjb250cm9sIGhvdyAxNmJpdCBjYXJkcyBhcmUgcG93ZXJlZCAqLworI2RlZmluZSBZRU5UQV8xNkJJVF9QT1dFUl9FWENBCTB4MDAwMDAwMDEKKyNkZWZpbmUgWUVOVEFfMTZCSVRfUE9XRVJfREYJMHgwMDAwMDAwMgorCisKIHN0cnVjdCB5ZW50YV9zb2NrZXQ7CiAKIHN0cnVjdCBjYXJkYnVzX3R5cGUgewpAQCAtMTEzLDYgKzExOSw4IEBACiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgc29ja2V0OwogCXN0cnVjdCBjYXJkYnVzX3R5cGUgKnR5cGU7CiAKKwl1MzIgZmxhZ3M7CisKIAkvKiBmb3IgUENJIGludGVycnVwdCBwcm9iaW5nICovCiAJdW5zaWduZWQgaW50IHByb2JlX3N0YXR1czsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvS2NvbmZpZyBiL2RyaXZlcnMvcG5wL0tjb25maWcKaW5kZXggNjc3NjMwOC4uYzUxNDMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvS2NvbmZpZworKysgYi9kcml2ZXJzL3BucC9LY29uZmlnCkBAIC02LDcgKzYsNyBAQAogCiBjb25maWcgUE5QCiAJYm9vbCAiUGx1ZyBhbmQgUGxheSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNBIHx8IEFDUElfQlVTCisJZGVwZW5kcyBvbiBJU0EgfHwgQUNQSQogCS0tLWhlbHAtLS0KIAkgIFBsdWcgYW5kIFBsYXkgKFBuUCkgaXMgYSBzdGFuZGFyZCBmb3IgcGVyaXBoZXJhbHMgd2hpY2ggYWxsb3dzIHRob3NlCiAJICBwZXJpcGhlcmFscyB0byBiZSBjb25maWd1cmVkIGJ5IHNvZnR3YXJlLCBlLmcuIGFzc2lnbiBJUlEncyBvciBvdGhlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvY2FyZC5jIGIvZHJpdmVycy9wbnAvY2FyZC5jCmluZGV4IDZlNTIyOWUuLmU5NWVkNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2NhcmQuYworKysgYi9kcml2ZXJzL3BucC9jYXJkLmMKQEAgLTgsMTMgKzgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2lmZGVmIENPTkZJR19QTlBfREVCVUcKLQkjZGVmaW5lIERFQlVHCi0jZWxzZQotCSN1bmRlZiBERUJVRwotI2VuZGlmCi0KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlICJiYXNlLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2RyaXZlci5jIGIvZHJpdmVycy9wbnAvZHJpdmVyLmMKaW5kZXggMWQwMzdjMi4uMzNkYTI1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9wbnAvZHJpdmVyLmMKQEAgLTExLDEzICsxMSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpZmRlZiBDT05GSUdfUE5QX0RFQlVHCi0JI2RlZmluZSBERUJVRwotI2Vsc2UKLQkjdW5kZWYgREVCVUcKLSNlbmRpZgotCiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSAiYmFzZS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jIGIvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYwppbmRleCA4MmM1ZWRkLi5iZWVkZDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMKQEAgLTE0MiwxNyArMTQyLDYgQEAKIAlpc2FwbnBfd3JpdGVfYnl0ZShpZHgrMSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgKmlzYXBucF9hbGxvYyhsb25nIHNpemUpCi17Ci0Jdm9pZCAqcmVzdWx0OwotCi0JcmVzdWx0ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJlc3VsdCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KHJlc3VsdCwgMCwgc2l6ZSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQogc3RhdGljIHZvaWQgaXNhcG5wX2tleSh2b2lkKQogewogCXVuc2lnbmVkIGNoYXIgY29kZSA9IDB4NmEsIG1zYjsKQEAgLTQwNiw3ICszOTUsNyBAQAogCXN0cnVjdCBwbnBfaWQgKiBpZDsKIAlpZiAoIWRldikKIAkJcmV0dXJuOwotCWlkID0gaXNhcG5wX2FsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2lkKSk7CisJaWQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2lkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpZCkKIAkJcmV0dXJuOwogCXNwcmludGYoaWQtPmlkLCAiJWMlYyVjJXgleCV4JXgiLApAQCAtNDMwLDcgKzQxOSw3IEBACiAJc3RydWN0IHBucF9kZXYgKmRldjsKIAogCWlzYXBucF9wZWVrKHRtcCwgc2l6ZSk7Ci0JZGV2ID0gaXNhcG5wX2FsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2RldikpOworCWRldiA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXYpCiAJCXJldHVybiBOVUxMOwogCWRldi0+bnVtYmVyID0gbnVtYmVyOwpAQCAtNDYxLDcgKzQ1MCw3IEBACiAJdW5zaWduZWQgbG9uZyBiaXRzOwogCiAJaXNhcG5wX3BlZWsodG1wLCBzaXplKTsKLQlpcnEgPSBpc2FwbnBfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfaXJxKSk7CisJaXJxID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9pcnEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlycSkKIAkJcmV0dXJuOwogCWJpdHMgPSAodG1wWzFdIDw8IDgpIHwgdG1wWzBdOwpAQCAtNDg1LDcgKzQ3NCw3IEBACiAJc3RydWN0IHBucF9kbWEgKmRtYTsKIAogCWlzYXBucF9wZWVrKHRtcCwgc2l6ZSk7Ci0JZG1hID0gaXNhcG5wX2FsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2RtYSkpOworCWRtYSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfZG1hKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkbWEpCiAJCXJldHVybjsKIAlkbWEtPm1hcCA9IHRtcFswXTsKQEAgLTUwNSw3ICs0OTQsNyBAQAogCXN0cnVjdCBwbnBfcG9ydCAqcG9ydDsKIAogCWlzYXBucF9wZWVrKHRtcCwgc2l6ZSk7Ci0JcG9ydCA9IGlzYXBucF9hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9wb3J0KSk7CisJcG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKIAkJcmV0dXJuOwogCXBvcnQtPm1pbiA9ICh0bXBbMl0gPDwgOCkgfCB0bXBbMV07CkBAIC01MjgsNyArNTE3LDcgQEAKIAlzdHJ1Y3QgcG5wX3BvcnQgKnBvcnQ7CiAKIAlpc2FwbnBfcGVlayh0bXAsIHNpemUpOwotCXBvcnQgPSBpc2FwbnBfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCkpOworCXBvcnQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBvcnQpCiAJCXJldHVybjsKIAlwb3J0LT5taW4gPSBwb3J0LT5tYXggPSAodG1wWzFdIDw8IDgpIHwgdG1wWzBdOwpAQCAtNTUwLDcgKzUzOSw3IEBACiAJc3RydWN0IHBucF9tZW0gKm1lbTsKIAogCWlzYXBucF9wZWVrKHRtcCwgc2l6ZSk7Ci0JbWVtID0gaXNhcG5wX2FsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX21lbSkpOworCW1lbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZW0pCiAJCXJldHVybjsKIAltZW0tPm1pbiA9ICgodG1wWzJdIDw8IDgpIHwgdG1wWzFdKSA8PCA4OwpAQCAtNTczLDcgKzU2Miw3IEBACiAJc3RydWN0IHBucF9tZW0gKm1lbTsKIAogCWlzYXBucF9wZWVrKHRtcCwgc2l6ZSk7Ci0JbWVtID0gaXNhcG5wX2FsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX21lbSkpOworCW1lbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZW0pCiAJCXJldHVybjsKIAltZW0tPm1pbiA9ICh0bXBbNF0gPDwgMjQpIHwgKHRtcFszXSA8PCAxNikgfCAodG1wWzJdIDw8IDgpIHwgdG1wWzFdOwpAQCAtNTk1LDcgKzU4NCw3IEBACiAJc3RydWN0IHBucF9tZW0gKm1lbTsKIAogCWlzYXBucF9wZWVrKHRtcCwgc2l6ZSk7Ci0JbWVtID0gaXNhcG5wX2FsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX21lbSkpOworCW1lbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZW0pCiAJCXJldHVybjsKIAltZW0tPm1pbiA9IG1lbS0+bWF4ID0gKHRtcFs0XSA8PCAyNCkgfCAodG1wWzNdIDw8IDE2KSB8ICh0bXBbMl0gPDwgOCkgfCB0bXBbMV07CkBAIC04MzgsNyArODI3LDcgQEAKIAogc3RhdGljIHZvaWQgaXNhcG5wX3BhcnNlX2NhcmRfaWQoc3RydWN0IHBucF9jYXJkICogY2FyZCwgdW5zaWduZWQgc2hvcnQgdmVuZG9yLCB1bnNpZ25lZCBzaG9ydCBkZXZpY2UpCiB7Ci0Jc3RydWN0IHBucF9pZCAqIGlkID0gaXNhcG5wX2FsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2lkKSk7CisJc3RydWN0IHBucF9pZCAqIGlkID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOwogCWlmICghaWQpCiAJCXJldHVybjsKIAlzcHJpbnRmKGlkLT5pZCwgIiVjJWMlYyV4JXgleCV4IiwKQEAgLTg3NCw3ICs4NjMsNyBAQAogCQkJaGVhZGVyWzRdLCBoZWFkZXJbNV0sIGhlYWRlcls2XSwgaGVhZGVyWzddLCBoZWFkZXJbOF0pOwogCQlwcmludGsoS0VSTl9ERUJVRyAiY2hlY2tzdW0gPSAweCV4XG4iLCBjaGVja3N1bSk7CiAjZW5kaWYKLQkJaWYgKChjYXJkID0gaXNhcG5wX2FsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2NhcmQpKSkgPT0gTlVMTCkKKwkJaWYgKChjYXJkID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9jYXJkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCQljb250aW51ZTsKIAogCQljYXJkLT5udW1iZXIgPSBjc247CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9tYW5hZ2VyLmMgYi9kcml2ZXJzL3BucC9tYW5hZ2VyLmMKaW5kZXggNmM1MTBjMS4uOTQ0NDJmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvbWFuYWdlci5jCisrKyBiL2RyaXZlcnMvcG5wL21hbmFnZXIuYwpAQCAtMTEsMTMgKzExLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpZmRlZiBDT05GSUdfUE5QX0RFQlVHCi0JI2RlZmluZSBERUJVRwotI2Vsc2UKLQkjdW5kZWYgREVCVUcKLSNlbmRpZgotCiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSAiYmFzZS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL0tjb25maWcgYi9kcml2ZXJzL3BucC9wbnBhY3BpL0tjb25maWcKaW5kZXggMDc4MmNkYy4uYjE4NTQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvS2NvbmZpZwpAQCAtMyw3ICszLDcgQEAKICMKIGNvbmZpZyBQTlBBQ1BJCiAJYm9vbCAiUGx1ZyBhbmQgUGxheSBBQ1BJIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBQTlAgJiYgQUNQSV9CVVMgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBQTlAgJiYgQUNQSSAmJiBFWFBFUklNRU5UQUwKIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBMaW51eCB1c2VzIHRoZSBQTlBBQ1BJIHRvIGF1dG9kZXRlY3QgYnVpbHQtaW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMKaW5kZXggODY1NWRkMi4uMWE4OTE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CkBAIC00MSwxNCArNDIsNiBAQAogCXJldHVybiAoIWFjcGlfbWF0Y2hfaWRzKGRldiwgZXhjbHVkZWRfaWRfbGlzdCkpOwogfQogCi12b2lkICpwbnBhY3BpX2ttYWxsb2Moc2l6ZV90IHNpemUsIGludCBmKQotewotCXZvaWQgKnAgPSBrbWFsbG9jKHNpemUsIGYpOwotCWlmIChwKQotCQltZW1zZXQocCwgMCwgc2l6ZSk7Ci0JcmV0dXJuIHA7Ci19Ci0KIC8qCiAgKiBDb21wYXRpYmxlIERldmljZSBJRHMKICAqLwpAQCAtMTQzLDcgKzEzNiw3IEBACiAJCXJldHVybiAwOwogCiAJcG5wX2RiZygiQUNQSSBkZXZpY2UgOiBoaWQgJXMiLCBhY3BpX2RldmljZV9oaWQoZGV2aWNlKSk7Ci0JZGV2ID0gIHBucGFjcGlfa21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9kZXYpLCBHRlBfS0VSTkVMKTsKKwlkZXYgPSAga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikgewogCQlwbnBfZXJyKCJPdXQgb2YgbWVtb3J5Iik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTczLDcgKzE2Niw3IEBACiAJZGV2LT5udW1iZXIgPSBudW07CiAJCiAJLyogc2V0IHRoZSBpbml0aWFsIHZhbHVlcyBmb3IgdGhlIFBuUCBkZXZpY2UgKi8KLQlkZXZfaWQgPSBwbnBhY3BpX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfaWQpLCBHRlBfS0VSTkVMKTsKKwlkZXZfaWQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2lkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXZfaWQpCiAJCWdvdG8gZXJyOwogCXBucGlkYWNwaV90b19wbnBpZChhY3BpX2RldmljZV9oaWQoZGV2aWNlKSwgZGV2X2lkLT5pZCk7CkBAIC0yMDUsOCArMTk4LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IGNpZF9saXN0LT5jb3VudDsgaSsrKSB7CiAJCQlpZiAoIWlzcG5waWRhY3BpKGNpZF9saXN0LT5pZFtpXS52YWx1ZSkpCiAJCQkJY29udGludWU7Ci0JCQlkZXZfaWQgPSBwbnBhY3BpX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfaWQpLCAKLQkJCQlHRlBfS0VSTkVMKTsKKwkJCWRldl9pZCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfaWQpLCBHRlBfS0VSTkVMKTsKIAkJCWlmICghZGV2X2lkKQogCQkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL3BucGFjcGkuaCBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcG5wYWNwaS5oCmluZGV4IDc2ZjkwN2UuLmYyOGUyZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGFjcGkvcG5wYWNwaS5oCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcG5wYWNwaS5oCkBAIC01LDcgKzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KIAotdm9pZCAqcG5wYWNwaV9rbWFsbG9jKHNpemVfdCBzaXplLCBpbnQgZik7CiBhY3BpX3N0YXR1cyBwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9yZXNvdXJjZShhY3BpX2hhbmRsZSwgc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSopOwogYWNwaV9zdGF0dXMgcG5wYWNwaV9wYXJzZV9yZXNvdXJjZV9vcHRpb25fZGF0YShhY3BpX2hhbmRsZSwgc3RydWN0IHBucF9kZXYqKTsKIGludCBwbnBhY3BpX2VuY29kZV9yZXNvdXJjZXMoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMgYi9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKaW5kZXggNzU1NzVmNi4uNDE2ZDMwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYwpAQCAtNzMsMjUgKzczLDM1IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1wbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pcnFyZXNvdXJjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogcmVzLCBpbnQgaXJxKQorcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfaXJxcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcywgdTMyIGdzaSwKKwlpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdykKIHsKIAlpbnQgaSA9IDA7CisJaW50IGlycTsKKworCWlmICghdmFsaWRfSVJRKGdzaSkpCisJCXJldHVybjsKKwogCXdoaWxlICghKHJlcy0+aXJxX3Jlc291cmNlW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCkgJiYKIAkJCWkgPCBQTlBfTUFYX0lSUSkKIAkJaSsrOwotCWlmIChpIDwgUE5QX01BWF9JUlEpIHsKLQkJcmVzLT5pcnFfcmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsgIC8vQWxzbyBjbGVhcnMgX1VOU0VUIGZsYWcKLQkJaWYgKGlycSA9PSAtMSkgewotCQkJcmVzLT5pcnFfcmVzb3VyY2VbaV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKLQkJCXJldHVybjsKLQkJfQotCQlyZXMtPmlycV9yZXNvdXJjZVtpXS5zdGFydCA9KHVuc2lnbmVkIGxvbmcpIGlycTsKLQkJcmVzLT5pcnFfcmVzb3VyY2VbaV0uZW5kID0gKHVuc2lnbmVkIGxvbmcpIGlycTsKKwlpZiAoaSA+PSBQTlBfTUFYX0lSUSkKKwkJcmV0dXJuOworCisJcmVzLT5pcnFfcmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsgIC8vIEFsc28gY2xlYXJzIF9VTlNFVCBmbGFnCisJaXJxID0gYWNwaV9yZWdpc3Rlcl9nc2koZ3NpLCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3cpOworCWlmIChpcnEgPCAwKSB7CisJCXJlcy0+aXJxX3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CisJCXJldHVybjsKIAl9CisKKwlyZXMtPmlycV9yZXNvdXJjZVtpXS5zdGFydCA9IGlycTsKKwlyZXMtPmlycV9yZXNvdXJjZVtpXS5lbmQgPSBpcnE7CisJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGlycSwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1wbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9kbWFyZXNvdXJjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogcmVzLCBpbnQgZG1hKQorcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfZG1hcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcywgdTMyIGRtYSkKIHsKIAlpbnQgaSA9IDA7CiAJd2hpbGUgKGkgPCBQTlBfTUFYX0RNQSAmJgpAQCAtMTAzLDE0ICsxMTMsMTQgQEAKIAkJCXJlcy0+ZG1hX3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQlyZXR1cm47CiAJCX0KLQkJcmVzLT5kbWFfcmVzb3VyY2VbaV0uc3RhcnQgPSh1bnNpZ25lZCBsb25nKSBkbWE7Ci0JCXJlcy0+ZG1hX3Jlc291cmNlW2ldLmVuZCA9ICh1bnNpZ25lZCBsb25nKSBkbWE7CisJCXJlcy0+ZG1hX3Jlc291cmNlW2ldLnN0YXJ0ID0gZG1hOworCQlyZXMtPmRtYV9yZXNvdXJjZVtpXS5lbmQgPSBkbWE7CiAJfQogfQogCiBzdGF0aWMgdm9pZAogcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfaW9yZXNvdXJjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogcmVzLAotCWludCBpbywgaW50IGxlbikKKwl1MzIgaW8sIHUzMiBsZW4pCiB7CiAJaW50IGkgPSAwOwogCXdoaWxlICghKHJlcy0+cG9ydF9yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpICYmCkBAIC0xMjIsMTQgKzEzMiwxNCBAQAogCQkJcmVzLT5wb3J0X3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQlyZXR1cm47CiAJCX0KLQkJcmVzLT5wb3J0X3Jlc291cmNlW2ldLnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIGlvOwotCQlyZXMtPnBvcnRfcmVzb3VyY2VbaV0uZW5kID0gKHVuc2lnbmVkIGxvbmcpKGlvICsgbGVuIC0gMSk7CisJCXJlcy0+cG9ydF9yZXNvdXJjZVtpXS5zdGFydCA9IGlvOworCQlyZXMtPnBvcnRfcmVzb3VyY2VbaV0uZW5kID0gaW8gKyBsZW4gLSAxOwogCX0KIH0KIAogc3RhdGljIHZvaWQKIHBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX21lbXJlc291cmNlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiByZXMsCi0JaW50IG1lbSwgaW50IGxlbikKKwl1NjQgbWVtLCB1NjQgbGVuKQogewogCWludCBpID0gMDsKIAl3aGlsZSAoIShyZXMtPm1lbV9yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpICYmCkBAIC0xNDEsOCArMTUxLDggQEAKIAkJCXJlcy0+bWVtX3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQlyZXR1cm47CiAJCX0KLQkJcmVzLT5tZW1fcmVzb3VyY2VbaV0uc3RhcnQgPSAodW5zaWduZWQgbG9uZykgbWVtOwotCQlyZXMtPm1lbV9yZXNvdXJjZVtpXS5lbmQgPSAodW5zaWduZWQgbG9uZykobWVtICsgbGVuIC0gMSk7CisJCXJlcy0+bWVtX3Jlc291cmNlW2ldLnN0YXJ0ID0gbWVtOworCQlyZXMtPm1lbV9yZXNvdXJjZVtpXS5lbmQgPSBtZW0gKyBsZW4gLSAxOwogCX0KIH0KIApAQCAtMTUxLDI3ICsxNjEsMjggQEAKIAl2b2lkICpkYXRhKQogewogCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiByZXNfdGFibGUgPSAoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqKWRhdGE7CisJaW50IGk7CiAKIAlzd2l0Y2ggKHJlcy0+aWQpIHsKIAljYXNlIEFDUElfUlNUWVBFX0lSUToKLQkJaWYgKChyZXMtPmRhdGEuaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzID4gMCkgJiYKLQkJCXZhbGlkX0lSUShyZXMtPmRhdGEuaXJxLmludGVycnVwdHNbMF0pKSB7Ci0JCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pcnFyZXNvdXJjZShyZXNfdGFibGUsIAotCQkJCWFjcGlfcmVnaXN0ZXJfZ3NpKHJlcy0+ZGF0YS5pcnEuaW50ZXJydXB0c1swXSwKLQkJCQkJcmVzLT5kYXRhLmlycS5lZGdlX2xldmVsLAotCQkJCQlyZXMtPmRhdGEuaXJxLmFjdGl2ZV9oaWdoX2xvdykpOwotCQkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKHJlcy0+ZGF0YS5pcnEuaW50ZXJydXB0c1swXSwgMSk7CisJCS8qCisJCSAqIFBlciBzcGVjLCBvbmx5IG9uZSBpbnRlcnJ1cHQgcGVyIGRlc2NyaXB0b3IgaXMgYWxsb3dlZCBpbgorCQkgKiBfQ1JTLCBidXQgc29tZSBmaXJtd2FyZSB2aW9sYXRlcyB0aGlzLCBzbyBwYXJzZSB0aGVtIGFsbC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCByZXMtPmRhdGEuaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzOyBpKyspIHsKKwkJCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2lycXJlc291cmNlKHJlc190YWJsZSwKKwkJCQlyZXMtPmRhdGEuaXJxLmludGVycnVwdHNbaV0sCisJCQkJcmVzLT5kYXRhLmlycS5lZGdlX2xldmVsLAorCQkJCXJlcy0+ZGF0YS5pcnEuYWN0aXZlX2hpZ2hfbG93KTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQUNQSV9SU1RZUEVfRVhUX0lSUToKLQkJaWYgKChyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzID4gMCkgJiYKLQkJCXZhbGlkX0lSUShyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbMF0pKSB7Ci0JCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pcnFyZXNvdXJjZShyZXNfdGFibGUsIAotCQkJCWFjcGlfcmVnaXN0ZXJfZ3NpKHJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSwKLQkJCQkJcmVzLT5kYXRhLmV4dGVuZGVkX2lycS5lZGdlX2xldmVsLAotCQkJCQlyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLmFjdGl2ZV9oaWdoX2xvdykpOwotCQkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKHJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSwgMSk7CisJCWZvciAoaSA9IDA7IGkgPCByZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzOyBpKyspIHsKKwkJCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2lycXJlc291cmNlKHJlc190YWJsZSwKKwkJCQlyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbaV0sCisJCQkJcmVzLT5kYXRhLmV4dGVuZGVkX2lycS5lZGdlX2xldmVsLAorCQkJCXJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuYWN0aXZlX2hpZ2hfbG93KTsKIAkJfQogCQlicmVhazsKIAljYXNlIEFDUElfUlNUWVBFX0RNQToKQEAgLTI0NCw3ICsyNTUsNyBAQAogCiAJaWYgKHAtPm51bWJlcl9vZl9jaGFubmVscyA9PSAwKQogCQlyZXR1cm47Ci0JZG1hID0gcG5wYWNwaV9rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2RtYSksIEdGUF9LRVJORUwpOworCWRtYSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfZG1hKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkbWEpCiAJCXJldHVybjsKIApAQCAtMzAwLDcgKzMxMSw3IEBACiAJCiAJaWYgKHAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzID09IDApCiAJCXJldHVybjsKLQlpcnEgPSBwbnBhY3BpX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfaXJxKSwgR0ZQX0tFUk5FTCk7CisJaXJxID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9pcnEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlycSkKIAkJcmV0dXJuOwogCkBAIC0zMjEsNyArMzMyLDcgQEAKIAogCWlmIChwLT5udW1iZXJfb2ZfaW50ZXJydXB0cyA9PSAwKQogCQlyZXR1cm47Ci0JaXJxID0gcG5wYWNwaV9rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2lycSksIEdGUF9LRVJORUwpOworCWlycSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfaXJxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpcnEpCiAJCXJldHVybjsKIApAQCAtMzQyLDcgKzM1Myw3IEBACiAKIAlpZiAoaW8tPnJhbmdlX2xlbmd0aCA9PSAwKQogCQlyZXR1cm47Ci0JcG9ydCA9IHBucGFjcGlfa21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJcG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKIAkJcmV0dXJuOwogCXBvcnQtPm1pbiA9IGlvLT5taW5fYmFzZV9hZGRyZXNzOwpAQCAtMzYzLDcgKzM3NCw3IEBACiAKIAlpZiAoaW8tPnJhbmdlX2xlbmd0aCA9PSAwKQogCQlyZXR1cm47Ci0JcG9ydCA9IHBucGFjcGlfa21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJcG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKIAkJcmV0dXJuOwogCXBvcnQtPm1pbiA9IHBvcnQtPm1heCA9IGlvLT5iYXNlX2FkZHJlc3M7CkBAIC0zODIsNyArMzkzLDcgQEAKIAogCWlmIChwLT5yYW5nZV9sZW5ndGggPT0gMCkKIAkJcmV0dXJuOwotCW1lbSA9IHBucGFjcGlfa21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKKwltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47CiAJbWVtLT5taW4gPSBwLT5taW5fYmFzZV9hZGRyZXNzOwpAQCAtNDA1LDcgKzQxNiw3IEBACiAKIAlpZiAocC0+cmFuZ2VfbGVuZ3RoID09IDApCiAJCXJldHVybjsKLQltZW0gPSBwbnBhY3BpX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CisJbWVtID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbSkKIAkJcmV0dXJuOwogCW1lbS0+bWluID0gcC0+bWluX2Jhc2VfYWRkcmVzczsKQEAgLTQyOCw3ICs0MzksNyBAQAogCiAJaWYgKHAtPnJhbmdlX2xlbmd0aCA9PSAwKQogCQlyZXR1cm47Ci0JbWVtID0gcG5wYWNwaV9rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOworCW1lbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZW0pCiAJCXJldHVybjsKIAltZW0tPm1pbiA9IG1lbS0+bWF4ID0gcC0+cmFuZ2VfYmFzZV9hZGRyZXNzOwpAQCAtNjEyLDcgKzYyMyw3IEBACiAJaWYgKCFyZXNfY250KQogCQlyZXR1cm4gLUVJTlZBTDsKIAlidWZmZXItPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSkgKiAocmVzX2NudCArIDEpICsgMTsKLQlidWZmZXItPnBvaW50ZXIgPSBwbnBhY3BpX2ttYWxsb2MoYnVmZmVyLT5sZW5ndGggLSAxLCBHRlBfS0VSTkVMKTsKKwlidWZmZXItPnBvaW50ZXIgPSBrY2FsbG9jKDEsIGJ1ZmZlci0+bGVuZ3RoIC0gMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWZmZXItPnBvaW50ZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCXBucF9kYmcoIlJlcyBjbnQgJWQiLCByZXNfY250KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKaW5kZXggNzc4YTMyNC4uZjQ5Njc0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKQEAgLTg2LDE2ICs4Niw2IEBACiAKIHN0cnVjdCBwbnBfZGV2X25vZGVfaW5mbyBub2RlX2luZm87CiAKLXZvaWQgKnBucGJpb3Nfa21hbGxvYyhzaXplX3Qgc2l6ZSwgaW50IGYpCi17Ci0Jdm9pZCAqcCA9IGttYWxsb2MoIHNpemUsIGYgKTsKLQlpZiAoIHAgPT0gTlVMTCApCi0JCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzoga21hbGxvYygpIGZhaWxlZFxuIik7Ci0JZWxzZQotCQltZW1zZXQocCwgMCwgc2l6ZSk7Ci0JcmV0dXJuIHA7Ci19Ci0KIC8qCiAgKgogICogRE9DS0lORyBGVU5DVElPTlMKQEAgLTEyMSwxMCArMTExLDEwIEBACiAJaWYgKCFjdXJyZW50LT5mcy0+cm9vdCkgewogCQlyZXR1cm4gLUVBR0FJTjsKIAl9Ci0JaWYgKCEoZW52cCA9IChjaGFyICoqKSBwbnBiaW9zX2ttYWxsb2MgKDIwICogc2l6ZW9mIChjaGFyICopLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShlbnZwID0gKGNoYXIgKiopIGtjYWxsb2MgKDIwLCBzaXplb2YgKGNoYXIgKiksIEdGUF9LRVJORUwpKSkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JaWYgKCEoYnVmID0gcG5wYmlvc19rbWFsbG9jICgyNTYsIEdGUF9LRVJORUwpKSkgeworCWlmICghKGJ1ZiA9IGtjYWxsb2MgKDEsIDI1NiwgR0ZQX0tFUk5FTCkpKSB7CiAJCWtmcmVlIChlbnZwKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjMxLDcgKzIyMSw3IEBACiAJaWYoIXBucGJpb3NfaXNfZHluYW1pYyhkZXYpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jbm9kZSA9IHBucGJpb3Nfa21hbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJbm9kZSA9IGtjYWxsb2MoMSwgbm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghbm9kZSkKIAkJcmV0dXJuIC0xOwogCWlmIChwbnBfYmlvc19nZXRfZGV2X25vZGUoJm5vZGVudW0sIChjaGFyIClQTlBNT0RFX0RZTkFNSUMsIG5vZGUpKSB7CkBAIC0yNTQsNyArMjQ0LDcgQEAKIAlpZiAoIXBucGJpb3NfaXNfZHluYW1pYyhkZXYpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jbm9kZSA9IHBucGJpb3Nfa21hbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJbm9kZSA9IGtjYWxsb2MoMSwgbm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghbm9kZSkKIAkJcmV0dXJuIC0xOwogCWlmIChwbnBfYmlvc19nZXRfZGV2X25vZGUoJm5vZGVudW0sIChjaGFyIClQTlBNT0RFX0RZTkFNSUMsIG5vZGUpKSB7CkBAIC0zMDUsNyArMjk1LDcgQEAKIAlpZihkZXYtPmZsYWdzICYgUE5QQklPU19OT19ESVNBQkxFIHx8ICFwbnBiaW9zX2lzX2R5bmFtaWMoZGV2KSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCW5vZGUgPSBwbnBiaW9zX2ttYWxsb2Mobm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOworCW5vZGUgPSBrY2FsbG9jKDEsIG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5vZGUpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zNDcsNyArMzM3LDcgQEAKIAl9CiAKIAkvKiBzZXQgdGhlIGluaXRpYWwgdmFsdWVzIGZvciB0aGUgUG5QIGRldmljZSAqLwotCWRldl9pZCA9IHBucGJpb3Nfa21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOworCWRldl9pZCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfaWQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldl9pZCkKIAkJcmV0dXJuIC0xOwogCXBucGlkMzJfdG9fcG5waWQobm9kZS0+ZWlzYV9pZCxpZCk7CkBAIC0zODUsNyArMzc1LDcgQEAKIAlzdHJ1Y3QgcG5wX2Jpb3Nfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgcG5wX2RldiAqZGV2OwogCi0Jbm9kZSA9IHBucGJpb3Nfa21hbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJbm9kZSA9IGtjYWxsb2MoMSwgbm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghbm9kZSkKIAkJcmV0dXJuOwogCkBAIC00MDIsNyArMzkyLDcgQEAKIAkJCQlicmVhazsKIAkJfQogCQlub2Rlc19nb3QrKzsKLQkJZGV2ID0gIHBucGJpb3Nfa21hbGxvYyhzaXplb2YgKHN0cnVjdCBwbnBfZGV2KSwgR0ZQX0tFUk5FTCk7CisJCWRldiA9ICBrY2FsbG9jKDEsIHNpemVvZiAoc3RydWN0IHBucF9kZXYpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFkZXYpCiAJCQlicmVhazsKIAkJaWYoaW5zZXJ0X2RldmljZShkZXYsbm9kZSk8MCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcG5wYmlvcy5oIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9wbnBiaW9zLmgKaW5kZXggMDE4OTZlNy4uZDhjYjJmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9wbnBiaW9zLmgKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9wbnBiaW9zLmgKQEAgLTI2LDcgKzI2LDYgQEAKIAogZXh0ZXJuIGludCBwbnBfYmlvc19wcmVzZW50KHZvaWQpOwogZXh0ZXJuIGludCAgcG5wYmlvc19kb250X3VzZV9jdXJyZW50X2NvbmZpZzsKLWV4dGVybiB2b2lkICpwbnBiaW9zX2ttYWxsb2Moc2l6ZV90IHNpemUsIGludCBmKTsKIAogZXh0ZXJuIGludCBwbnBiaW9zX3BhcnNlX2RhdGFfc3RyZWFtKHN0cnVjdCBwbnBfZGV2ICpkZXYsIHN0cnVjdCBwbnBfYmlvc19ub2RlICogbm9kZSk7CiBleHRlcm4gaW50IHBucGJpb3NfcmVhZF9yZXNvdXJjZXNfZnJvbV9ub2RlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcywgc3RydWN0IHBucF9iaW9zX25vZGUgKiBub2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcHJvYy5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9wcm9jLmMKaW5kZXggNmJiOGUxOS4uNWEzZGZjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9wcm9jLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9wcm9jLmMKQEAgLTg3LDcgKzg3LDcgQEAKIAkJcmV0dXJuIC1FRkJJRzsKIAl9CiAKLQl0bXBidWYgPSBwbnBiaW9zX2ttYWxsb2MoZXNjZC5lc2NkX3NpemUsIEdGUF9LRVJORUwpOworCXRtcGJ1ZiA9IGtjYWxsb2MoMSwgZXNjZC5lc2NkX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghdG1wYnVmKSByZXR1cm4gLUVOT01FTTsKIAogCWlmIChwbnBfYmlvc19yZWFkX2VzY2QodG1wYnVmLCBlc2NkLm52X3N0b3JhZ2VfYmFzZSkpIHsKQEAgLTEzMyw3ICsxMzMsNyBAQAogCWlmIChwb3MgPj0gMHhmZikKIAkJcmV0dXJuIDA7CiAKLQlub2RlID0gcG5wYmlvc19rbWFsbG9jKG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlub2RlID0ga2NhbGxvYygxLCBub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFub2RlKSByZXR1cm4gLUVOT01FTTsKIAogCWZvciAobm9kZW51bT1wb3M7IG5vZGVudW08MHhmZjsgKSB7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAl1OCBub2RlbnVtID0gKGxvbmcpZGF0YTsKIAlpbnQgbGVuOwogCi0Jbm9kZSA9IHBucGJpb3Nfa21hbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJbm9kZSA9IGtjYWxsb2MoMSwgbm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghbm9kZSkgcmV0dXJuIC1FTk9NRU07CiAJaWYgKHBucF9iaW9zX2dldF9kZXZfbm9kZSgmbm9kZW51bSwgYm9vdCwgbm9kZSkpIHsKIAkJa2ZyZWUobm9kZSk7CkBAIC0xODgsNyArMTg4LDcgQEAKIAl1OCBub2RlbnVtID0gKGxvbmcpZGF0YTsKIAlpbnQgcmV0ID0gY291bnQ7CiAKLQlub2RlID0gcG5wYmlvc19rbWFsbG9jKG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlub2RlID0ga2NhbGxvYygxLCBub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFub2RlKQogCQlyZXR1cm4gLUVOT01FTTsKIAlpZiAocG5wX2Jpb3NfZ2V0X2Rldl9ub2RlKCZub2RlbnVtLCBib290LCBub2RlKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jCmluZGV4IGUzMDViYjEuLmIwY2E2NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYworKysgYi9kcml2ZXJzL3BucC9wbnBiaW9zL3JzcGFyc2VyLmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogcG5wYmlvc19wYXJzZV9tZW1fb3B0aW9uKHVuc2lnbmVkIGNoYXIgKnAsIGludCBzaXplLCBzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uKQogewogCXN0cnVjdCBwbnBfbWVtICogbWVtOwotCW1lbSA9IHBucGJpb3Nfa21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKKwltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47CiAJbWVtLT5taW4gPSAoKHBbNV0gPDwgOCkgfCBwWzRdKSA8PCA4OwpAQCAtMjYzLDcgKzI2Myw3IEBACiBwbnBiaW9zX3BhcnNlX21lbTMyX29wdGlvbih1bnNpZ25lZCBjaGFyICpwLCBpbnQgc2l6ZSwgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKIAlzdHJ1Y3QgcG5wX21lbSAqIG1lbTsKLQltZW0gPSBwbnBiaW9zX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CisJbWVtID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbSkKIAkJcmV0dXJuOwogCW1lbS0+bWluID0gKHBbN10gPDwgMjQpIHwgKHBbNl0gPDwgMTYpIHwgKHBbNV0gPDwgOCkgfCBwWzRdOwpAQCAtMjc5LDcgKzI3OSw3IEBACiBwbnBiaW9zX3BhcnNlX2ZpeGVkX21lbTMyX29wdGlvbih1bnNpZ25lZCBjaGFyICpwLCBpbnQgc2l6ZSwgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKIAlzdHJ1Y3QgcG5wX21lbSAqIG1lbTsKLQltZW0gPSBwbnBiaW9zX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CisJbWVtID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbSkKIAkJcmV0dXJuOwogCW1lbS0+bWluID0gbWVtLT5tYXggPSAocFs3XSA8PCAyNCkgfCAocFs2XSA8PCAxNikgfCAocFs1XSA8PCA4KSB8IHBbNF07CkBAIC0yOTYsNyArMjk2LDcgQEAKIAlzdHJ1Y3QgcG5wX2lycSAqIGlycTsKIAl1bnNpZ25lZCBsb25nIGJpdHM7CiAKLQlpcnEgPSBwbnBiaW9zX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfaXJxKSwgR0ZQX0tFUk5FTCk7CisJaXJxID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9pcnEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlycSkKIAkJcmV0dXJuOwogCWJpdHMgPSAocFsyXSA8PCA4KSB8IHBbMV07CkBAIC0zMTMsNyArMzEzLDcgQEAKIHBucGJpb3NfcGFyc2VfZG1hX29wdGlvbih1bnNpZ25lZCBjaGFyICpwLCBpbnQgc2l6ZSwgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKIAlzdHJ1Y3QgcG5wX2RtYSAqIGRtYTsKLQlkbWEgPSBwbnBiaW9zX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfZG1hKSwgR0ZQX0tFUk5FTCk7CisJZG1hID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9kbWEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRtYSkKIAkJcmV0dXJuOwogCWRtYS0+bWFwID0gcFsxXTsKQEAgLTMyNiw3ICszMjYsNyBAQAogcG5wYmlvc19wYXJzZV9wb3J0X29wdGlvbih1bnNpZ25lZCBjaGFyICpwLCBpbnQgc2l6ZSwgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKIAlzdHJ1Y3QgcG5wX3BvcnQgKiBwb3J0OwotCXBvcnQgPSBwbnBiaW9zX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOworCXBvcnQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBvcnQpCiAJCXJldHVybjsKIAlwb3J0LT5taW4gPSAocFszXSA8PCA4KSB8IHBbMl07CkBAIC0zNDIsNyArMzQyLDcgQEAKIHBucGJpb3NfcGFyc2VfZml4ZWRfcG9ydF9vcHRpb24odW5zaWduZWQgY2hhciAqcCwgaW50IHNpemUsIHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24pCiB7CiAJc3RydWN0IHBucF9wb3J0ICogcG9ydDsKLQlwb3J0ID0gcG5wYmlvc19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwlwb3J0ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAJcG9ydC0+bWluID0gcG9ydC0+bWF4ID0gKHBbMl0gPDwgOCkgfCBwWzFdOwpAQCAtNTMwLDcgKzUzMCw3IEBACiAJCWNhc2UgU01BTExfVEFHX0NPTVBBVERFVklEOiAvKiBjb21wYXRpYmxlIElEICovCiAJCQlpZiAobGVuICE9IDQpCiAJCQkJZ290byBsZW5fZXJyOwotCQkJZGV2X2lkID0gIHBucGJpb3Nfa21hbGxvYyhzaXplb2YgKHN0cnVjdCBwbnBfaWQpLCBHRlBfS0VSTkVMKTsKKwkJCWRldl9pZCA9ICBrY2FsbG9jKDEsIHNpemVvZiAoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFkZXZfaWQpCiAJCQkJcmV0dXJuIE5VTEw7CiAJCQltZW1zZXQoZGV2X2lkLCAwLCBzaXplb2Yoc3RydWN0IHBucF9pZCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcXVpcmtzLmMgYi9kcml2ZXJzL3BucC9xdWlya3MuYwppbmRleCA1OTZhMDJkLi44OTM2YjBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9xdWlya3MuYworKysgYi9kcml2ZXJzL3BucC9xdWlya3MuYwpAQCAtMTYsMTMgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpZmRlZiBDT05GSUdfUE5QX0RFQlVHCi0JI2RlZmluZSBERUJVRwotI2Vsc2UKLQkjdW5kZWYgREVCVUcKLSNlbmRpZgotCiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSAiYmFzZS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9zdXBwb3J0LmMgYi9kcml2ZXJzL3BucC9zdXBwb3J0LmMKaW5kZXggYjk1MmFlYy4uNjFmZTk5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvc3VwcG9ydC5jCisrKyBiL2RyaXZlcnMvcG5wL3N1cHBvcnQuYwpAQCAtOCwxMyArOCw2IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLQotI2lmZGVmIENPTkZJR19QTlBfREVCVUcKLQkjZGVmaW5lIERFQlVHCi0jZWxzZQotCSN1bmRlZiBERUJVRwotI2VuZGlmCi0KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlICJiYXNlLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9LY29uZmlnIGIvZHJpdmVycy9zMzkwL2Jsb2NrL0tjb25maWcKaW5kZXggZGMxYzg5ZC4uNmU3ZDdiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL0tjb25maWcKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL0tjb25maWcKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogY29uZmlnIERBU0RfRElBRwogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBESUFHIGFjY2VzcyB0byBEaXNrcyIKLQlkZXBlbmRzIG9uIERBU0QgJiYgQVJDSF9TMzkwWCA9ICduJworCWRlcGVuZHMgb24gREFTRCAmJiAoIEFSQ0hfUzM5MFggPSAnbicgfHwgRVhQRVJJTUVOVEFMKQogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgRGlhZ25vc2UyNTAgY29tbWFuZCB0byBhY2Nlc3MKIAkgIERpc2tzIHVuZGVyIFZNLiAgSWYgeW91IGFyZSBub3QgcnVubmluZyB1bmRlciBWTSBvciB1bnN1cmUgd2hhdCBpdCBpcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCmluZGV4IGQ1ZjUzOTguLjhmYzg5MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwpAQCAtNyw3ICs3LDcgQEAKICAqIEJ1Z3JlcG9ydHMudG8uLjogPExpbnV4MzkwQGRlLmlibS5jb20+CiAgKiAoQykgSUJNIENvcnBvcmF0aW9uLCBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgMTk5OS0yMDAxCiAgKgotICogJFJldmlzaW9uOiAxLjE2NSAkCisgKiAkUmV2aXNpb246IDEuMTY3ICQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC0xMTMxLDE3ICsxMTMxLDEzIEBACiAJcmVxdWVzdF9xdWV1ZV90ICpxdWV1ZTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwogCXN0cnVjdCBkYXNkX2Njd19yZXEgKmNxcjsKLQlpbnQgbnJfcXVldWVkLCBmZWF0dXJlX3JvOworCWludCBucl9xdWV1ZWQ7CiAKIAlxdWV1ZSA9IGRldmljZS0+cmVxdWVzdF9xdWV1ZTsKIAkvKiBObyBxdWV1ZSA/IFRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkby4gKi8KIAlpZiAocXVldWUgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JZmVhdHVyZV9ybyA9IGRhc2RfZ2V0X2ZlYXR1cmUoZGV2aWNlLT5jZGV2LCBEQVNEX0ZFQVRVUkVfUkVBRE9OTFkpOwotCWlmIChmZWF0dXJlX3JvIDwgMCkgCS8qIG5vIGRldm1hcCAqLwotCQlyZXR1cm47Ci0KIAkvKgogCSAqIFdlIHJlcXVldWUgcmVxdWVzdCBmcm9tIHRoZSBibG9jayBkZXZpY2UgcXVldWUgdG8gdGhlIGNjdwogCSAqIHF1ZXVlIG9ubHkgaW4gdHdvIHN0YXRlcy4gSW4gc3RhdGUgREFTRF9TVEFURV9SRUFEWSB0aGUKQEAgLTExNjIsNyArMTE1OCw4IEBACiAJCW5yX3F1ZXVlZCA8IERBU0RfQ0hBTlFfTUFYX1NJWkUpIHsKIAkJcmVxID0gZWx2X25leHRfcmVxdWVzdChxdWV1ZSk7CiAKLQkJaWYgKGZlYXR1cmVfcm8gJiYgcnFfZGF0YV9kaXIocmVxKSA9PSBXUklURSkgeworCQlpZiAoZGV2aWNlLT5mZWF0dXJlcyAmIERBU0RfRkVBVFVSRV9SRUFET05MWSAmJgorCQkgICAgcnFfZGF0YV9kaXIocmVxKSA9PSBXUklURSkgewogCQkJREJGX0RFVl9FVkVOVChEQkZfRVJSLCBkZXZpY2UsCiAJCQkJICAgICAgIlJlamVjdGluZyB3cml0ZSByZXF1ZXN0ICVwIiwKIAkJCQkgICAgICByZXEpOwpAQCAtMTgxNCwxNyArMTgxMSwxMyBAQAogCiB7CiAJc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2U7Ci0JaW50IGZlYXR1cmVfZGlhZywgcmM7CisJaW50IHJjOwogCiAJZGV2aWNlID0gZGFzZF9jcmVhdGVfZGV2aWNlKGNkZXYpOwogCWlmIChJU19FUlIoZGV2aWNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoZGV2aWNlKTsKIAotCWZlYXR1cmVfZGlhZyA9IGRhc2RfZ2V0X2ZlYXR1cmUoY2RldiwgREFTRF9GRUFUVVJFX1VTRURJQUcpOwotCWlmIChmZWF0dXJlX2RpYWcgPCAwKQotCQlyZXR1cm4gZmVhdHVyZV9kaWFnOwotCi0JaWYgKGZlYXR1cmVfZGlhZykgeworCWlmIChkZXZpY2UtPmZlYXR1cmVzICYgREFTRF9GRUFUVVJFX1VTRURJQUcpIHsKIAkgIAlpZiAoIWRhc2RfZGlhZ19kaXNjaXBsaW5lX3BvaW50ZXIpIHsKIAkJICAgICAgICBwcmludGsgKEtFUk5fV0FSTklORwogCQkJCSJkYXNkX2dlbmVyaWMgY291bGRuJ3Qgb25saW5lIGRldmljZSAlcyAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jCmluZGV4IGQ5NDg1NjYuLmJkYTg5NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKiBmdW5jdGlvbnMgbWF5IG5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4gSW4gcGFydGljdWxhcgogICogZGFzZF9nZXRfZGV2aWNlIGlzIGEgbm8tbm8gZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KICAqCi0gKiAkUmV2aXNpb246IDEuNDAgJAorICogJFJldmlzaW9uOiAxLjQzICQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC01MTMsNiArNTEzLDcgQEAKIAlpZiAoIWRldm1hcC0+ZGV2aWNlKSB7CiAJCWRldm1hcC0+ZGV2aWNlID0gZGV2aWNlOwogCQlkZXZpY2UtPmRldmluZGV4ID0gZGV2bWFwLT5kZXZpbmRleDsKKwkJZGV2aWNlLT5mZWF0dXJlcyA9IGRldm1hcC0+ZmVhdHVyZXM7CiAJCWdldF9kZXZpY2UoJmNkZXYtPmRldik7CiAJCWRldmljZS0+Y2RldiA9IGNkZXY7CiAJCXJjID0gMDsKQEAgLTY0Myw2ICs2NDQsOCBAQAogCQlkZXZtYXAtPmZlYXR1cmVzIHw9IERBU0RfRkVBVFVSRV9SRUFET05MWTsKIAllbHNlCiAJCWRldm1hcC0+ZmVhdHVyZXMgJj0gfkRBU0RfRkVBVFVSRV9SRUFET05MWTsKKwlpZiAoZGV2bWFwLT5kZXZpY2UpCisJCWRldm1hcC0+ZGV2aWNlLT5mZWF0dXJlcyA9IGRldm1hcC0+ZmVhdHVyZXM7CiAJaWYgKGRldm1hcC0+ZGV2aWNlICYmIGRldm1hcC0+ZGV2aWNlLT5nZHApCiAJCXNldF9kaXNrX3JvKGRldm1hcC0+ZGV2aWNlLT5nZHAsIHJvX2ZsYWcpOwogCXNwaW5fdW5sb2NrKCZkYXNkX2Rldm1hcF9sb2NrKTsKQEAgLTc1OCw3ICs3NjEsOCBAQAogCQlkZXZtYXAtPmZlYXR1cmVzIHw9IGZlYXR1cmU7CiAJZWxzZQogCQlkZXZtYXAtPmZlYXR1cmVzICY9IH5mZWF0dXJlOwotCisJaWYgKGRldm1hcC0+ZGV2aWNlKQorCQlkZXZtYXAtPmRldmljZS0+ZmVhdHVyZXMgPSBkZXZtYXAtPmZlYXR1cmVzOwogCXNwaW5fdW5sb2NrKCZkYXNkX2Rldm1hcF9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2RpYWcuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2RpYWcuYwppbmRleCAxMjc2OTk4Li43NDc4NDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kaWFnLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGlhZy5jCkBAIC02LDE3ICs2LDE4IEBACiAgKiBCdWdyZXBvcnRzLnRvLi46IDxMaW51eDM5MEBkZS5pYm0uY29tPgogICogKEMpIElCTSBDb3Jwb3JhdGlvbiwgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIDE5OTksMjAwMAogICoKLSAqICRSZXZpc2lvbjogMS40MiAkCisgKiAkUmV2aXNpb246IDEuNDkgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4JLyogSERJT19HRVRHRU8JCQkgICAgKi8KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAKICNpbmNsdWRlIDxhc20vZGFzZC5oPgogI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgpAQCAtMjgsNTggKzI5LDg5IEBACiAjaW5jbHVkZSAiZGFzZF9pbnQuaCIKICNpbmNsdWRlICJkYXNkX2RpYWcuaCIKIAotI2lmZGVmIFBSSU5US19IRUFERVIKLSN1bmRlZiBQUklOVEtfSEVBREVSCi0jZW5kaWYJCQkJLyogUFJJTlRLX0hFQURFUiAqLwogI2RlZmluZSBQUklOVEtfSEVBREVSICJkYXNkKGRpYWcpOiIKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIHBlciByZXF1ZXN0IChtYXhfYmxvY2tzKSBpcyBkZXBlbmRlbnQgb24gdGhlCisgKiBhbW91bnQgb2Ygc3RvcmFnZSB0aGF0IGlzIGF2YWlsYWJsZSBpbiB0aGUgc3RhdGljIEkvTyBidWZmZXIgZm9yIGVhY2gKKyAqIGRldmljZS4gQ3VycmVudGx5IGVhY2ggZGV2aWNlIGdldHMgMiBwYWdlcy4gV2Ugd2FudCB0byBmaXQgdHdvIHJlcXVlc3RzCisgKiBpbnRvIHRoZSBhdmFpbGFibGUgbWVtb3J5IHNvIHRoYXQgd2UgY2FuIGltbWVkaWF0ZWx5IHN0YXJ0IHRoZSBuZXh0IGlmIG9uZQorICogZmluaXNoZXMuICovCisjZGVmaW5lIERJQUdfTUFYX0JMT0NLUwkoKCgyICogUEFHRV9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBkYXNkX2Njd19yZXEpIC0gXAorCQkJICAgc2l6ZW9mKHN0cnVjdCBkYXNkX2RpYWdfcmVxKSkgLyBcCisJCSAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBkYXNkX2RpYWdfYmlvKSkgLyAyKQorI2RlZmluZSBESUFHX01BWF9SRVRSSUVTCTMyCisjZGVmaW5lIERJQUdfVElNRU9VVAkJNTAgKiBIWgorCiBzdHJ1Y3QgZGFzZF9kaXNjaXBsaW5lIGRhc2RfZGlhZ19kaXNjaXBsaW5lOwogCiBzdHJ1Y3QgZGFzZF9kaWFnX3ByaXZhdGUgewogCXN0cnVjdCBkYXNkX2RpYWdfY2hhcmFjdGVyaXN0aWNzIHJkY19kYXRhOwogCXN0cnVjdCBkYXNkX2RpYWdfcndfaW8gaW9iOwogCXN0cnVjdCBkYXNkX2RpYWdfaW5pdF9pbyBpaWI7Ci0JdW5zaWduZWQgaW50IHB0X2Jsb2NrOworCWJsb2NrbnVtX3QgcHRfYmxvY2s7CiB9OwogCiBzdHJ1Y3QgZGFzZF9kaWFnX3JlcSB7Ci0JaW50IGJsb2NrX2NvdW50OworCXVuc2lnbmVkIGludCBibG9ja19jb3VudDsKIAlzdHJ1Y3QgZGFzZF9kaWFnX2JpbyBiaW9bMF07CiB9OwogCitzdGF0aWMgY29uc3QgdTggREFTRF9ESUFHX0NNUzFbXSA9IHsgMHhjMywgMHhkNCwgMHhlMiwgMHhmMSB9Oy8qIEVCQ0RJQyBDTVMxICovCisKKy8qIFBlcmZvcm0gRElBRzI1MCBjYWxsIHdpdGggYmxvY2sgSS9PIHBhcmFtZXRlciBsaXN0IGlvYiAoaW5wdXQgYW5kIG91dHB1dCkKKyAqIGFuZCBmdW5jdGlvbiBjb2RlIGNtZC4KKyAqIEluIGNhc2Ugb2YgYW4gZXhjZXB0aW9uIHJldHVybiAzLiBPdGhlcndpc2UgcmV0dXJuIHJlc3VsdCBvZiBiaXR3aXNlIE9SIG9mCisgKiByZXN1bHRpbmcgY29uZGl0aW9uIGNvZGUgYW5kIERJQUcgcmV0dXJuIGNvZGUuICovCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQKIGRpYTI1MCh2b2lkICppb2IsIGludCBjbWQpCiB7CisJdHlwZWRlZiBzdHJ1Y3QgeworCQljaGFyIF9bbWF4KHNpemVvZiAoc3RydWN0IGRhc2RfZGlhZ19pbml0X2lvKSwKKwkJCSAgIHNpemVvZiAoc3RydWN0IGRhc2RfZGlhZ19yd19pbykpXTsKKwl9IGFkZHJfdHlwZTsKIAlpbnQgcmM7CiAKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiICAgIGxoaSAgICUwLDNcbiIKLQkJCSAgICAgIgkgIGxyCTAsJTJcbiIKLQkJCSAgICAgIgkgIGRpYWcJMCwlMSwweDI1MFxuIgotCQkJICAgICAiMDogIGlwbQklMFxuIgotCQkJICAgICAiCSAgc3JsCSUwLDI4XG4iCi0JCQkgICAgICIJICBvcgklMCwxXG4iCi0JCQkgICAgICIxOlxuIgotI2lmbmRlZiBDT05GSUdfQVJDSF9TMzkwWAotCQkJICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCQkJICAgICAiCSAgLmFsaWduIDRcbiIKLQkJCSAgICAgIgkgIC5sb25nIDBiLDFiXG4iCi0JCQkgICAgICIucHJldmlvdXNcbiIKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKyNpZmRlZiBDT05GSUdfQVJDSF9TMzkwWAorCQkiCWxnaGkJJTAsM1xuIgorCQkiCWxncgkwLCUzXG4iCisJCSIJZGlhZwkwLCUyLDB4MjUwXG4iCisJCSIwOglpcG0JJTBcbiIKKwkJIglzcmwJJTAsMjhcbiIKKwkJIglvcgklMCwxXG4iCisJCSIxOlxuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbiA4XG4iCisJCSIJLnF1YWQgIDBiLDFiXG4iCisJCSIucHJldmlvdXNcbiIKICNlbHNlCi0JCQkgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JCQkgICAgICIJICAuYWxpZ24gOFxuIgotCQkJICAgICAiCSAgLnF1YWQgIDBiLDFiXG4iCi0JCQkgICAgICIucHJldmlvdXNcbiIKKwkJIglsaGkJJTAsM1xuIgorCQkiCWxyCTAsJTNcbiIKKwkJIglkaWFnCTAsJTIsMHgyNTBcbiIKKwkJIjA6CWlwbQklMFxuIgorCQkiCXNybAklMCwyOFxuIgorCQkiCW9yCSUwLDFcbiIKKwkJIjE6XG4iCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCisJCSIJLmFsaWduIDRcbiIKKwkJIgkubG9uZyAwYiwxYlxuIgorCQkiLnByZXZpb3VzXG4iCiAjZW5kaWYKLQkJCSAgICAgOiAiPSZkIiAocmMpCi0JCQkgICAgIDogImQiIChjbWQpLCAiZCIgKCh2b2lkICopIF9fcGEoaW9iKSkKLQkJCSAgICAgOiAiMCIsICIxIiwgImNjIik7CisJCTogIj0mZCIgKHJjKSwgIj1tIiAoKihhZGRyX3R5cGUgKikgaW9iKQorCQk6ICJkIiAoY21kKSwgImQiIChpb2IpLCAibSIgKCooYWRkcl90eXBlICopIGlvYikKKwkJOiAiMCIsICIxIiwgImNjIik7CiAJcmV0dXJuIHJjOwogfQogCisvKiBJbml0aWFsaXplIGJsb2NrIEkvTyB0byBESUFHIGRldmljZSB1c2luZyB0aGUgc3BlY2lmaWVkIGJsb2Nrc2l6ZSBhbmQKKyAqIGJsb2NrIG9mZnNldC4gT24gc3VjY2VzcywgcmV0dXJuIHplcm8gYW5kIHNldCBlbmRfYmxvY2sgdG8gY29udGFpbiB0aGUKKyAqIG51bWJlciBvZiBibG9ja3Mgb24gdGhlIGRldmljZSBtaW51cyB0aGUgc3BlY2lmaWVkIG9mZnNldC4gUmV0dXJuIG5vbi16ZXJvCisgKiBvdGhlcndpc2UuICovCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQKLW1kc2tfaW5pdF9pbyhzdHJ1Y3QgZGFzZF9kZXZpY2UgKiBkZXZpY2UsIGludCBibG9ja3NpemUsIGludCBvZmZzZXQsIGludCBzaXplKQorbWRza19pbml0X2lvKHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgYmxvY2tzaXplLAorCSAgICAgYmxvY2tudW1fdCBvZmZzZXQsIGJsb2NrbnVtX3QgKmVuZF9ibG9jaykKIHsKIAlzdHJ1Y3QgZGFzZF9kaWFnX3ByaXZhdGUgKnByaXZhdGU7CiAJc3RydWN0IGRhc2RfZGlhZ19pbml0X2lvICppaWI7CkBAIC05MiwxNCArMTI0LDE4IEBACiAJaWliLT5kZXZfbnIgPSBfY2N3X2RldmljZV9nZXRfZGV2aWNlX251bWJlcihkZXZpY2UtPmNkZXYpOwogCWlpYi0+YmxvY2tfc2l6ZSA9IGJsb2Nrc2l6ZTsKIAlpaWItPm9mZnNldCA9IG9mZnNldDsKLQlpaWItPnN0YXJ0X2Jsb2NrID0gMDsKLQlpaWItPmVuZF9ibG9jayA9IHNpemU7CisJaWliLT5mbGFnYSA9IERBU0RfRElBR19GTEFHQV9ERUZBVUxUOwogCiAJcmMgPSBkaWEyNTAoaWliLCBJTklUX0JJTyk7CiAKLQlyZXR1cm4gcmMgJiAzOworCWlmICgocmMgJiAzKSA9PSAwICYmIGVuZF9ibG9jaykKKwkJKmVuZF9ibG9jayA9IGlpYi0+ZW5kX2Jsb2NrOworCisJcmV0dXJuIHJjOwogfQogCisvKiBSZW1vdmUgYmxvY2sgSS9PIGVudmlyb25tZW50IGZvciBkZXZpY2UuIFJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvCisgKiBvdGhlcndpc2UuICovCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQKIG1kc2tfdGVybV9pbyhzdHJ1Y3QgZGFzZF9kZXZpY2UgKiBkZXZpY2UpCiB7CkBAIC0xMTIsOSArMTQ4LDI1IEBACiAJbWVtc2V0KGlpYiwgMCwgc2l6ZW9mIChzdHJ1Y3QgZGFzZF9kaWFnX2luaXRfaW8pKTsKIAlpaWItPmRldl9uciA9IF9jY3dfZGV2aWNlX2dldF9kZXZpY2VfbnVtYmVyKGRldmljZS0+Y2Rldik7CiAJcmMgPSBkaWEyNTAoaWliLCBURVJNX0JJTyk7Ci0JcmV0dXJuIHJjICYgMzsKKwlyZXR1cm4gcmM7CiB9CiAKKy8qIEVycm9yIHJlY292ZXJ5IGZvciBmYWlsZWQgRElBRyByZXF1ZXN0cyAtIHRyeSB0byByZWVzdGFibGlzaCB0aGUgRElBRworICogZW52aXJvbm1lbnQuICovCitzdGF0aWMgdm9pZAorZGFzZF9kaWFnX2VycChzdHJ1Y3QgZGFzZF9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgcmM7CisKKwltZHNrX3Rlcm1faW8oZGV2aWNlKTsKKwlyYyA9IG1kc2tfaW5pdF9pbyhkZXZpY2UsIGRldmljZS0+YnBfYmxvY2ssIDAsIE5VTEwpOworCWlmIChyYykKKwkJREVWX01FU1NBR0UoS0VSTl9XQVJOSU5HLCBkZXZpY2UsICJESUFHIEVSUCB1bnN1Y2Nlc3NmdWwsICIKKwkJCSAgICAicmM9JWQiLCByYyk7Cit9CisKKy8qIFN0YXJ0IGEgZ2l2ZW4gcmVxdWVzdCBhdCB0aGUgZGV2aWNlLiBSZXR1cm4gemVybyBvbiBzdWNjZXNzLCBub24temVybworICogb3RoZXJ3aXNlLiAqLwogc3RhdGljIGludAogZGFzZF9zdGFydF9kaWFnKHN0cnVjdCBkYXNkX2Njd19yZXEgKiBjcXIpCiB7CkBAIC0xMjQsMzIgKzE3Niw2NiBAQAogCWludCByYzsKIAogCWRldmljZSA9IGNxci0+ZGV2aWNlOworCWlmIChjcXItPnJldHJpZXMgPCAwKSB7CisJCURFVl9NRVNTQUdFKEtFUk5fV0FSTklORywgZGV2aWNlLCAiRElBRyBzdGFydF9JTzogcmVxdWVzdCAlcCAiCisJCQkgICAgIi0gbm8gcmV0cnkgbGVmdCkiLCBjcXIpOworCQljcXItPnN0YXR1cyA9IERBU0RfQ1FSX0ZBSUxFRDsKKwkJcmV0dXJuIC1FSU87CisJfQogCXByaXZhdGUgPSAoc3RydWN0IGRhc2RfZGlhZ19wcml2YXRlICopIGRldmljZS0+cHJpdmF0ZTsKIAlkcmVxID0gKHN0cnVjdCBkYXNkX2RpYWdfcmVxICopIGNxci0+ZGF0YTsKIAogCXByaXZhdGUtPmlvYi5kZXZfbnIgPSBfY2N3X2RldmljZV9nZXRfZGV2aWNlX251bWJlcihkZXZpY2UtPmNkZXYpOwogCXByaXZhdGUtPmlvYi5rZXkgPSAwOwotCXByaXZhdGUtPmlvYi5mbGFncyA9IDI7CS8qIGRvIGFzeW5jaHJvbm91cyBpbyAqLworCXByaXZhdGUtPmlvYi5mbGFncyA9IERBU0RfRElBR19SV0ZMQUdfQVNZTkM7CiAJcHJpdmF0ZS0+aW9iLmJsb2NrX2NvdW50ID0gZHJlcS0+YmxvY2tfY291bnQ7Ci0JcHJpdmF0ZS0+aW9iLmludGVycnVwdF9wYXJhbXMgPSAodTMyKShhZGRyX3QpIGNxcjsKKwlwcml2YXRlLT5pb2IuaW50ZXJydXB0X3BhcmFtcyA9IChhZGRyX3QpIGNxcjsKIAlwcml2YXRlLT5pb2IuYmlvX2xpc3QgPSBfX3BhKGRyZXEtPmJpbyk7CisJcHJpdmF0ZS0+aW9iLmZsYWdhID0gREFTRF9ESUFHX0ZMQUdBX0RFRkFVTFQ7CiAKIAljcXItPnN0YXJ0Y2xrID0gZ2V0X2Nsb2NrKCk7CisJY3FyLT5zdGFydHRpbWUgPSBqaWZmaWVzOworCWNxci0+cmV0cmllcy0tOwogCiAJcmMgPSBkaWEyNTAoJnByaXZhdGUtPmlvYiwgUldfQklPKTsKLQlpZiAocmMgPiA4KSB7Ci0JCURFVl9NRVNTQUdFKEtFUk5fV0FSTklORywgZGV2aWNlLCAiZGlhMjUwIHJldHVybmVkIENDICVkIiwgcmMpOwotCQljcXItPnN0YXR1cyA9IERBU0RfQ1FSX0VSUk9SOwotCX0gZWxzZSBpZiAocmMgPT0gMCkgeworCXN3aXRjaCAocmMpIHsKKwljYXNlIDA6IC8qIFN5bmNocm9ub3VzIEkvTyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkgKi8KKwkJY3FyLT5zdG9wY2xrID0gZ2V0X2Nsb2NrKCk7CiAJCWNxci0+c3RhdHVzID0gREFTRF9DUVJfRE9ORTsKLQkJZGFzZF9zY2hlZHVsZV9iaChkZXZpY2UpOwotCX0gZWxzZSB7CisJCS8qIEluZGljYXRlIHRvIGNhbGxpbmcgZnVuY3Rpb24gdGhhdCBvbmx5IGEgZGFzZF9zY2hlZHVsZV9iaCgpCisJCSAgIGFuZCBubyB0aW1lciBpcyBuZWVkZWQgKi8KKyAgICAgICAgICAgICAgICByYyA9IC1FQUNDRVM7CisJCWJyZWFrOworCWNhc2UgODogLyogQXN5bmNocm9ub3VzIEkvTyB3YXMgc3RhcnRlZCAqLwogCQljcXItPnN0YXR1cyA9IERBU0RfQ1FSX0lOX0lPOwogCQlyYyA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIEVycm9yIGNvbmRpdGlvbiAqLworCQljcXItPnN0YXR1cyA9IERBU0RfQ1FSX1FVRVVFRDsKKwkJREVWX01FU1NBR0UoS0VSTl9XQVJOSU5HLCBkZXZpY2UsICJkaWEyNTAgcmV0dXJuZWQgcmM9JWQiLCByYyk7CisJCWRhc2RfZGlhZ19lcnAoZGV2aWNlKTsKKwkJcmMgPSAtRUlPOworCQlicmVhazsKIAl9CiAJcmV0dXJuIHJjOwogfQogCisvKiBUZXJtaW5hdGUgZ2l2ZW4gcmVxdWVzdCBhdCB0aGUgZGV2aWNlLiAqLworc3RhdGljIGludAorZGFzZF9kaWFnX3Rlcm1fSU8oc3RydWN0IGRhc2RfY2N3X3JlcSAqIGNxcikKK3sKKwlzdHJ1Y3QgZGFzZF9kZXZpY2UgKmRldmljZTsKKworCWRldmljZSA9IGNxci0+ZGV2aWNlOworCW1kc2tfdGVybV9pbyhkZXZpY2UpOworCW1kc2tfaW5pdF9pbyhkZXZpY2UsIGRldmljZS0+YnBfYmxvY2ssIDAsIE5VTEwpOworCWNxci0+c3RhdHVzID0gREFTRF9DUVJfQ0xFQVI7CisJY3FyLT5zdG9wY2xrID0gZ2V0X2Nsb2NrKCk7CisJZGFzZF9zY2hlZHVsZV9iaChkZXZpY2UpOworCXJldHVybiAwOworfQorCisvKiBIYW5kbGUgZXh0ZXJuYWwgaW50ZXJydXB0aW9uLiAqLwogc3RhdGljIHZvaWQKIGRhc2RfZXh0X2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIF9fdTE2IGNvZGUpCiB7CkBAIC0xNTcsMjUgKzI0MywyNyBAQAogCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBleHBpcmVzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY2hhciBzdGF0dXM7Ci0JaW50IGlwOworCXU4IGludF9jb2RlLCBzdGF0dXM7CisJYWRkcl90IGlwOworCWludCByYzsKIAotCS8qCi0JICogR2V0IHRoZSBleHRlcm5hbCBpbnRlcnJ1cHRpb24gc3ViY29kZS4gVk0gc3RvcmVzCi0JICogdGhpcyBpbiB0aGUgJ2NwdSBhZGRyZXNzJyBmaWVsZCBhc3NvY2lhdGVkIHdpdGgKLQkgKiB0aGUgZXh0ZXJuYWwgaW50ZXJydXB0LiBGb3IgZGlhZyAyNTAgdGhlIHN1YmNvZGUKLQkgKiBuZWVkcyB0byBiZSAzLgotCSAqLwotCWlmICgoUzM5MF9sb3djb3JlLmNwdV9hZGRyICYgMHhmZjAwKSAhPSAweDAzMDApCisJaW50X2NvZGUgPSAqKCh1OCAqKSBEQVNEX0RJQUdfTENfSU5UX0NPREUpOworCXN0YXR1cyA9ICooKHU4ICopIERBU0RfRElBR19MQ19JTlRfU1RBVFVTKTsKKwlzd2l0Y2ggKGludF9jb2RlKSB7CisJY2FzZSBEQVNEX0RJQUdfQ09ERV8zMUJJVDoKKwkJaXAgPSAoYWRkcl90KSAqKCh1MzIgKikgREFTRF9ESUFHX0xDX0lOVF9QQVJNXzMxQklUKTsKKwkJYnJlYWs7CisJY2FzZSBEQVNEX0RJQUdfQ09ERV82NEJJVDoKKwkJaXAgPSAoYWRkcl90KSAqKCh1NjQgKikgREFTRF9ESUFHX0xDX0lOVF9QQVJNXzY0QklUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcmV0dXJuOwotCXN0YXR1cyA9ICooKGNoYXIgKikgJlMzOTBfbG93Y29yZS5leHRfcGFyYW1zICsgNSk7Ci0JaXAgPSBTMzkwX2xvd2NvcmUuZXh0X3BhcmFtczsKLQorCX0KIAlpZiAoIWlwKSB7CQkvKiBubyBpbnRwYXJtOiB1bnNvbGljaXRlZCBpbnRlcnJ1cHQgKi8KIAkJTUVTU0FHRShLRVJOX0RFQlVHLCAiJXMiLCAiY2F1Z2h0IHVuc29saWNpdGVkIGludGVycnVwdCIpOwogCQlyZXR1cm47CiAJfQotCWNxciA9IChzdHJ1Y3QgZGFzZF9jY3dfcmVxICopKGFkZHJfdCkgaXA7CisJY3FyID0gKHN0cnVjdCBkYXNkX2Njd19yZXEgKikgaXA7CiAJZGV2aWNlID0gKHN0cnVjdCBkYXNkX2RldmljZSAqKSBjcXItPmRldmljZTsKIAlpZiAoc3RybmNtcChkZXZpY2UtPmRpc2NpcGxpbmUtPmViY25hbWUsIChjaGFyICopICZjcXItPm1hZ2ljLCA0KSkgewogCQlERVZfTUVTU0FHRShLRVJOX1dBUk5JTkcsIGRldmljZSwKQEAgLTE4OCw2ICsyNzYsMTUgQEAKIAkvKiBnZXQgaXJxIGxvY2sgdG8gbW9kaWZ5IHJlcXVlc3QgcXVldWUgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soZGV2aWNlLT5jZGV2KSwgZmxhZ3MpOwogCisJLyogQ2hlY2sgZm9yIGEgcGVuZGluZyBjbGVhciBvcGVyYXRpb24gKi8KKwlpZiAoY3FyLT5zdGF0dXMgPT0gREFTRF9DUVJfQ0xFQVIpIHsKKwkJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9RVUVVRUQ7CisJCWRhc2RfY2xlYXJfdGltZXIoZGV2aWNlKTsKKwkJZGFzZF9zY2hlZHVsZV9iaChkZXZpY2UpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhkZXZpY2UtPmNkZXYpLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKIAljcXItPnN0b3BjbGsgPSBnZXRfY2xvY2soKTsKIAogCWV4cGlyZXMgPSAwOwpAQCAtMTk4LDE2ICsyOTUsMjIgQEAKIAkJCW5leHQgPSBsaXN0X2VudHJ5KGRldmljZS0+Y2N3X3F1ZXVlLm5leHQsCiAJCQkJCSAgc3RydWN0IGRhc2RfY2N3X3JlcSwgbGlzdCk7CiAJCQlpZiAobmV4dC0+c3RhdHVzID09IERBU0RfQ1FSX1FVRVVFRCkgewotCQkJCWlmIChkYXNkX3N0YXJ0X2RpYWcobmV4dCkgPT0gMCkKKwkJCQlyYyA9IGRhc2Rfc3RhcnRfZGlhZyhuZXh0KTsKKwkJCQlpZiAocmMgPT0gMCkKIAkJCQkJZXhwaXJlcyA9IG5leHQtPmV4cGlyZXM7Ci0JCQkJZWxzZQorCQkJCWVsc2UgaWYgKHJjICE9IC1FQUNDRVMpCiAJCQkJCURFVl9NRVNTQUdFKEtFUk5fV0FSTklORywgZGV2aWNlLCAiJXMiLAogCQkJCQkJICAgICJJbnRlcnJ1cHQgZmFzdHBhdGggIgogCQkJCQkJICAgICJmYWlsZWQhIik7CiAJCQl9CiAJCX0KLQl9IGVsc2UgCi0JCWNxci0+c3RhdHVzID0gREFTRF9DUVJfRkFJTEVEOworCX0gZWxzZSB7CisJCWNxci0+c3RhdHVzID0gREFTRF9DUVJfUVVFVUVEOworCQlERVZfTUVTU0FHRShLRVJOX1dBUk5JTkcsIGRldmljZSwgImludGVycnVwdCBzdGF0dXMgZm9yICIKKwkJCSAgICAicmVxdWVzdCAlcCB3YXMgJWQgKCVkIHJldHJpZXMgbGVmdCkiLCBjcXIsIHN0YXR1cywKKwkJCSAgICBjcXItPnJldHJpZXMpOworCQlkYXNkX2RpYWdfZXJwKGRldmljZSk7CisJfQogCiAJaWYgKGV4cGlyZXMgIT0gMCkKIAkJZGFzZF9zZXRfdGltZXIoZGV2aWNlLCBleHBpcmVzKTsKQEAgLTIxOCwxNCArMzIxLDE3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2soZGV2aWNlLT5jZGV2KSwgZmxhZ3MpOwogfQogCisvKiBDaGVjayB3aGV0aGVyIGRldmljZSBjYW4gYmUgY29udHJvbGxlZCBieSBESUFHIGRpc2NpcGxpbmUuIFJldHVybiB6ZXJvIG9uCisgKiBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuICovCiBzdGF0aWMgaW50CiBkYXNkX2RpYWdfY2hlY2tfZGV2aWNlKHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBkYXNkX2RpYWdfcHJpdmF0ZSAqcHJpdmF0ZTsKIAlzdHJ1Y3QgZGFzZF9kaWFnX2NoYXJhY3RlcmlzdGljcyAqcmRjX2RhdGE7CiAJc3RydWN0IGRhc2RfZGlhZ19iaW8gYmlvOwotCWxvbmcgKmxhYmVsOwotCWludCBzYiwgYnNpemU7CisJc3RydWN0IGRhc2RfZGlhZ19jbXNfbGFiZWwgKmxhYmVsOworCWJsb2NrbnVtX3QgZW5kX2Jsb2NrOworCXVuc2lnbmVkIGludCBzYiwgYnNpemU7CiAJaW50IHJjOwogCiAJcHJpdmF0ZSA9IChzdHJ1Y3QgZGFzZF9kaWFnX3ByaXZhdGUgKikgZGV2aWNlLT5wcml2YXRlOwpAQCAtMjQ0LDggKzM1MCwxMSBAQAogCXJkY19kYXRhLT5yZGNfbGVuID0gc2l6ZW9mIChzdHJ1Y3QgZGFzZF9kaWFnX2NoYXJhY3RlcmlzdGljcyk7CiAKIAlyYyA9IGRpYWcyMTAoKHN0cnVjdCBkaWFnMjEwICopIHJkY19kYXRhKTsKLQlpZiAocmMpCisJaWYgKHJjKSB7CisJCURFVl9NRVNTQUdFKEtFUk5fV0FSTklORywgZGV2aWNlLCAiZmFpbGVkIHRvIHJldHJpZXZlIGRldmljZSAiCisJCQkgICAgImluZm9ybWF0aW9uIChyYz0lZCkiLCByYyk7CiAJCXJldHVybiAtRU5PVFNVUFA7CisJfQogCiAJLyogRmlndXJlIG91dCBwb3NpdGlvbiBvZiBsYWJlbCBibG9jayAqLwogCXN3aXRjaCAocHJpdmF0ZS0+cmRjX2RhdGEudmRldl9jbGFzcykgewpAQCAtMjU2LDYgKzM2NSw4IEBACiAJCXByaXZhdGUtPnB0X2Jsb2NrID0gMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKKwkJREVWX01FU1NBR0UoS0VSTl9XQVJOSU5HLCBkZXZpY2UsICJ1bnN1cHBvcnRlZCBkZXZpY2UgY2xhc3MgIgorCQkJICAgICIoY2xhc3M9JWQpIiwgcHJpdmF0ZS0+cmRjX2RhdGEudmRldl9jbGFzcyk7CiAJCXJldHVybiAtRU5PVFNVUFA7CiAJfQogCkBAIC0yNjksMTUgKzM4MCwxNyBAQAogCW1kc2tfdGVybV9pbyhkZXZpY2UpOwogCiAJLyogZmlndXJlIG91dCBibG9ja3NpemUgb2YgZGV2aWNlICovCi0JbGFiZWwgPSAobG9uZyAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJbGFiZWwgPSAoc3RydWN0IGRhc2RfZGlhZ19jbXNfbGFiZWwgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmIChsYWJlbCA9PSBOVUxMKSAgewogCQlERVZfTUVTU0FHRShLRVJOX1dBUk5JTkcsIGRldmljZSwgIiVzIiwKIAkJCSAgICAiTm8gbWVtb3J5IHRvIGFsbG9jYXRlIGluaXRpYWxpemF0aW9uIHJlcXVlc3QiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCXJjID0gMDsKKwllbmRfYmxvY2sgPSAwOwogCS8qIHRyeSBhbGwgc2l6ZXMgLSBuZWVkZWQgZm9yIEVDS0QgZGV2aWNlcyAqLwogCWZvciAoYnNpemUgPSA1MTI7IGJzaXplIDw9IFBBR0VfU0laRTsgYnNpemUgPDw9IDEpIHsKLQkJbWRza19pbml0X2lvKGRldmljZSwgYnNpemUsIDAsIDY0KTsKKwkJbWRza19pbml0X2lvKGRldmljZSwgYnNpemUsIDAsICZlbmRfYmxvY2spOwogCQltZW1zZXQoJmJpbywgMCwgc2l6ZW9mIChzdHJ1Y3QgZGFzZF9kaWFnX2JpbykpOwogCQliaW8udHlwZSA9IE1EU0tfUkVBRF9SRVE7CiAJCWJpby5ibG9ja19udW1iZXIgPSBwcml2YXRlLT5wdF9ibG9jayArIDE7CkBAIC0yODksMzcgKzQwMiw0NSBAQAogCQlwcml2YXRlLT5pb2IuYmxvY2tfY291bnQgPSAxOwogCQlwcml2YXRlLT5pb2IuaW50ZXJydXB0X3BhcmFtcyA9IDA7CiAJCXByaXZhdGUtPmlvYi5iaW9fbGlzdCA9IF9fcGEoJmJpbyk7Ci0JCWlmIChkaWEyNTAoJnByaXZhdGUtPmlvYiwgUldfQklPKSA9PSAwKQorCQlwcml2YXRlLT5pb2IuZmxhZ2EgPSBEQVNEX0RJQUdfRkxBR0FfREVGQVVMVDsKKwkJcmMgPSBkaWEyNTAoJnByaXZhdGUtPmlvYiwgUldfQklPKTsKKwkJaWYgKHJjID09IDAgfHwgcmMgPT0gMykKIAkJCWJyZWFrOwogCQltZHNrX3Rlcm1faW8oZGV2aWNlKTsKIAl9Ci0JaWYgKGJzaXplIDw9IFBBR0VfU0laRSAmJiBsYWJlbFswXSA9PSAweGMzZDRlMmYxKSB7Ci0JCS8qIGdldCBmb3JtYXR0ZWQgYmxvY2tzaXplIGZyb20gbGFiZWwgYmxvY2sgKi8KLQkJYnNpemUgPSAoaW50KSBsYWJlbFszXTsKLQkJZGV2aWNlLT5ibG9ja3MgPSBsYWJlbFs3XTsKKwlpZiAocmMgPT0gMykgeworCQlERVZfTUVTU0FHRShLRVJOX1dBUk5JTkcsIGRldmljZSwgIiVzIiwgIkRJQUcgY2FsbCBmYWlsZWQiKTsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwl9IGVsc2UgaWYgKHJjICE9IDApIHsKKwkJREVWX01FU1NBR0UoS0VSTl9XQVJOSU5HLCBkZXZpY2UsICJkZXZpY2UgYWNjZXNzIGZhaWxlZCAiCisJCQkgICAgIihyYz0lZCkiLCByYyk7CisJCXJjID0gLUVJTzsKKwl9IGVsc2UgeworCQlpZiAobWVtY21wKGxhYmVsLT5sYWJlbF9pZCwgREFTRF9ESUFHX0NNUzEsCisJCQkgIHNpemVvZihEQVNEX0RJQUdfQ01TMSkpID09IDApIHsKKwkJCS8qIGdldCBmb3JtYXR0ZWQgYmxvY2tzaXplIGZyb20gbGFiZWwgYmxvY2sgKi8KKwkJCWJzaXplID0gKHVuc2lnbmVkIGludCkgbGFiZWwtPmJsb2NrX3NpemU7CisJCQlkZXZpY2UtPmJsb2NrcyA9ICh1bnNpZ25lZCBsb25nKSBsYWJlbC0+YmxvY2tfY291bnQ7CisJCX0gZWxzZQorCQkJZGV2aWNlLT5ibG9ja3MgPSBlbmRfYmxvY2s7CiAJCWRldmljZS0+YnBfYmxvY2sgPSBic2l6ZTsKIAkJZGV2aWNlLT5zMmJfc2hpZnQgPSAwOwkvKiBiaXRzIHRvIHNoaWZ0IDUxMiB0byBnZXQgYSBibG9jayAqLwogCQlmb3IgKHNiID0gNTEyOyBzYiA8IGJzaXplOyBzYiA9IHNiIDw8IDEpCiAJCQlkZXZpY2UtPnMyYl9zaGlmdCsrOwogCQkKIAkJREVWX01FU1NBR0UoS0VSTl9JTkZPLCBkZXZpY2UsCi0JCQkgICAgImNhcGFjaXR5ICglZGtCIGJsa3MpOiAlbGRrQiIsCi0JCQkgICAgKGRldmljZS0+YnBfYmxvY2sgPj4gMTApLAotCQkJICAgIChkZXZpY2UtPmJsb2NrcyA8PCBkZXZpY2UtPnMyYl9zaGlmdCkgPj4gMSk7CisJCQkgICAgIiglbGQgQi9ibGspOiAlbGRrQiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIGRldmljZS0+YnBfYmxvY2ssCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIChkZXZpY2UtPmJsb2NrcyA8PAorCQkJCWRldmljZS0+czJiX3NoaWZ0KSA+PiAxKTsKIAkJcmMgPSAwOwotCX0gZWxzZSB7Ci0JCWlmIChic2l6ZSA+IFBBR0VfU0laRSkKLQkJCURFVl9NRVNTQUdFKEtFUk5fV0FSTklORywgZGV2aWNlLCAiJXMiLAotCQkJCSAgICAiRElBRyBhY2Nlc3MgZmFpbGVkIik7Ci0JCWVsc2UKLQkJCURFVl9NRVNTQUdFKEtFUk5fV0FSTklORywgZGV2aWNlLCAiJXMiLAotCQkJCSAgICAidm9sdW1lIGlzIG5vdCBDTVMgZm9ybWF0dGVkIik7Ci0JCXJjID0gLUVNRURJVU1UWVBFOwogCX0KIAlmcmVlX3BhZ2UoKGxvbmcpIGxhYmVsKTsKIAlyZXR1cm4gcmM7CiB9CiAKKy8qIEZpbGwgaW4gdmlydHVhbCBkaXNrIGdlb21ldHJ5IGZvciBkZXZpY2UuIFJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvCisgKiBvdGhlcndpc2UuICovCiBzdGF0aWMgaW50CiBkYXNkX2RpYWdfZmlsbF9nZW9tZXRyeShzdHJ1Y3QgZGFzZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCiB7CkBAIC0zNDksNiArNDcwLDggQEAKIAlyZXR1cm4gZGFzZF9kZWZhdWx0X2VycF9wb3N0YWN0aW9uOwogfQogCisvKiBDcmVhdGUgREFTRCByZXF1ZXN0IGZyb20gYmxvY2sgZGV2aWNlIHJlcXVlc3QuIFJldHVybiBwb2ludGVyIHRvIG5ldworICogcmVxdWVzdCBvbiBzdWNjZXNzLCBFUlJfUFRSIG90aGVyd2lzZS4gKi8KIHN0YXRpYyBzdHJ1Y3QgZGFzZF9jY3dfcmVxICoKIGRhc2RfZGlhZ19idWlsZF9jcChzdHJ1Y3QgZGFzZF9kZXZpY2UgKiBkZXZpY2UsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7CkBAIC0zNTgsOSArNDgxLDkgQEAKIAlzdHJ1Y3QgYmlvICpiaW87CiAJc3RydWN0IGJpb192ZWMgKmJ2OwogCWNoYXIgKmRzdDsKLQlpbnQgY291bnQsIGRhdGFzaXplOworCXVuc2lnbmVkIGludCBjb3VudCwgZGF0YXNpemU7CiAJc2VjdG9yX3QgcmVjaWQsIGZpcnN0X3JlYywgbGFzdF9yZWM7Ci0JdW5zaWduZWQgYmxrc2l6ZSwgb2ZmOworCXVuc2lnbmVkIGludCBibGtzaXplLCBvZmY7CiAJdW5zaWduZWQgY2hhciByd19jbWQ7CiAJaW50IGk7CiAKQEAgLTQxMywxMyArNTM2LDE2IEBACiAJCQl9CiAJCX0KIAl9CisJY3FyLT5yZXRyaWVzID0gRElBR19NQVhfUkVUUklFUzsKIAljcXItPmJ1aWxkY2xrID0gZ2V0X2Nsb2NrKCk7CiAJY3FyLT5kZXZpY2UgPSBkZXZpY2U7Ci0JY3FyLT5leHBpcmVzID0gNTAgKiBIWjsJLyogNTAgc2Vjb25kcyAqLworCWNxci0+ZXhwaXJlcyA9IERJQUdfVElNRU9VVDsKIAljcXItPnN0YXR1cyA9IERBU0RfQ1FSX0ZJTExFRDsKIAlyZXR1cm4gY3FyOwogfQogCisvKiBSZWxlYXNlIERBU0QgcmVxdWVzdC4gUmV0dXJuIG5vbi16ZXJvIGlmIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwsIHplcm8KKyAqIG90aGVyd2lzZS4gKi8KIHN0YXRpYyBpbnQKIGRhc2RfZGlhZ19mcmVlX2NwKHN0cnVjdCBkYXNkX2Njd19yZXEgKmNxciwgc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKQEAgLTQzMCw2ICs1NTYsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKKy8qIEZpbGwgaW4gSU9DVEwgZGF0YSBmb3IgZGV2aWNlLiAqLwogc3RhdGljIGludAogZGFzZF9kaWFnX2ZpbGxfaW5mbyhzdHJ1Y3QgZGFzZF9kZXZpY2UgKiBkZXZpY2UsCiAJCSAgICBzdHJ1Y3QgZGFzZF9pbmZvcm1hdGlvbjJfdCAqIGluZm8pCkBAIC00MzcsNyArNTY0LDcgQEAKIAlzdHJ1Y3QgZGFzZF9kaWFnX3ByaXZhdGUgKnByaXZhdGU7CiAKIAlwcml2YXRlID0gKHN0cnVjdCBkYXNkX2RpYWdfcHJpdmF0ZSAqKSBkZXZpY2UtPnByaXZhdGU7Ci0JaW5mby0+bGFiZWxfYmxvY2sgPSBwcml2YXRlLT5wdF9ibG9jazsKKwlpbmZvLT5sYWJlbF9ibG9jayA9ICh1bnNpZ25lZCBpbnQpIHByaXZhdGUtPnB0X2Jsb2NrOwogCWluZm8tPkZCQV9sYXlvdXQgPSAxOwogCWluZm8tPmZvcm1hdCA9IERBU0RfRk9STUFUX0xETDsKIAlpbmZvLT5jaGFyYWN0ZXJpc3RpY3Nfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGRhc2RfZGlhZ19jaGFyYWN0ZXJpc3RpY3MpOwpAQCAtNDU2LDI2ICs1ODMsMTUgQEAKIAkJICAgICJkdW1wIHNlbnNlIG5vdCBhdmFpbGFibGUgZm9yIERJQUcgZGF0YSIpOwogfQogCi0vKgotICogbWF4X2Jsb2NrcyBpcyBkZXBlbmRlbnQgb24gdGhlIGFtb3VudCBvZiBzdG9yYWdlIHRoYXQgaXMgYXZhaWxhYmxlCi0gKiBpbiB0aGUgc3RhdGljIGlvIGJ1ZmZlciBmb3IgZWFjaCBkZXZpY2UuIEN1cnJlbnRseSBlYWNoIGRldmljZSBoYXMKLSAqIDgxOTIgYnl0ZXMgKD0yIHBhZ2VzKS4gZGFzZCBkaWFnIGlzIG9ubHkgcmVsZXZhbnQgZm9yIDMxIGJpdC4KLSAqIFRoZSBzdHJ1Y3QgZGFzZF9jY3dfcmVxIGhhcyA5NiBieXRlcywgdGhlIHN0cnVjdCBkYXNkX2RpYWdfcmVxIGhhcwotICogOCBieXRlcyBhbmQgdGhlIHN0cnVjdCBkYXNkX2RpYWdfYmlvIGZvciBlYWNoIGJsb2NrIGhhcyAxNiBieXRlcy4gCi0gKiBUaGF0IG1ha2VzOgotICogKDgxOTIgLSA5NiAtIDgpIC8gMTYgPSA1MDUuNSBibG9ja3MgYXQgbWF4aW11bS4KLSAqIFdlIHdhbnQgdG8gZml0IHR3byBpbnRvIHRoZSBhdmFpbGFibGUgbWVtb3J5IHNvIHRoYXQgd2UgY2FuIGltbWVkaWF0ZWx5Ci0gKiBzdGFydCB0aGUgbmV4dCByZXF1ZXN0IGlmIG9uZSBmaW5pc2hlcyBvZmYuIFRoYXQgbWFrZXMgMjUyLjc1IGJsb2NrcwotICogZm9yIG9uZSByZXF1ZXN0LiBHaXZlIGEgbGl0dGxlIHNhZmV0eSBhbmQgdGhlIHJlc3VsdCBpcyAyNDAuCi0gKi8KIHN0cnVjdCBkYXNkX2Rpc2NpcGxpbmUgZGFzZF9kaWFnX2Rpc2NpcGxpbmUgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLm5hbWUgPSAiRElBRyIsCiAJLmViY25hbWUgPSAiRElBRyIsCi0JLm1heF9ibG9ja3MgPSAyNDAsCisJLm1heF9ibG9ja3MgPSBESUFHX01BWF9CTE9DS1MsCiAJLmNoZWNrX2RldmljZSA9IGRhc2RfZGlhZ19jaGVja19kZXZpY2UsCiAJLmZpbGxfZ2VvbWV0cnkgPSBkYXNkX2RpYWdfZmlsbF9nZW9tZXRyeSwKIAkuc3RhcnRfSU8gPSBkYXNkX3N0YXJ0X2RpYWcsCisJLnRlcm1fSU8gPSBkYXNkX2RpYWdfdGVybV9JTywKIAkuZXhhbWluZV9lcnJvciA9IGRhc2RfZGlhZ19leGFtaW5lX2Vycm9yLAogCS5lcnBfYWN0aW9uID0gZGFzZF9kaWFnX2VycF9hY3Rpb24sCiAJLmVycF9wb3N0YWN0aW9uID0gZGFzZF9kaWFnX2VycF9wb3N0YWN0aW9uLApAQCAtNDkzLDcgKzYwOSw3IEBACiAJCQkgICAgIk1hY2hpbmUgaXMgbm90IFZNOiAlcyAiCiAJCQkgICAgImRpc2NpcGxpbmUgbm90IGluaXRpYWxpemluZyIsCiAJCQkgICAgZGFzZF9kaWFnX2Rpc2NpcGxpbmUubmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJQVNDRUJDKGRhc2RfZGlhZ19kaXNjaXBsaW5lLmViY25hbWUsIDQpOwogCkBAIC01MDYsMTMgKzYyMiw2IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQKIGRhc2RfZGlhZ19jbGVhbnVwKHZvaWQpCiB7Ci0JaWYgKCFNQUNISU5FX0lTX1ZNKSB7Ci0JCU1FU1NBR0VfTE9HKEtFUk5fSU5GTywKLQkJCSAgICAiTWFjaGluZSBpcyBub3QgVk06ICVzICIKLQkJCSAgICAiZGlzY2lwbGluZSBub3QgY2xlYW5lZCIsCi0JCQkgICAgZGFzZF9kaWFnX2Rpc2NpcGxpbmUubmFtZSk7Ci0JCXJldHVybjsKLQl9CiAJdW5yZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQoMHgyNjAzLCBkYXNkX2V4dF9oYW5kbGVyKTsKIAljdGxfY2xlYXJfYml0KDAsIDkpOwogCWRhc2RfZGlhZ19kaXNjaXBsaW5lX3BvaW50ZXIgPSBOVUxMOwpAQCAtNTIwLDIyICs2MjksMyBAQAogCiBtb2R1bGVfaW5pdChkYXNkX2RpYWdfaW5pdCk7CiBtb2R1bGVfZXhpdChkYXNkX2RpYWdfY2xlYW51cCk7Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtaW5kZW50LWxldmVsOiA0IAotICogYy1icmFjZS1pbWFnaW5hcnktb2Zmc2V0OiAwCi0gKiBjLWJyYWNlLW9mZnNldDogLTQKLSAqIGMtYXJnZGVjbC1pbmRlbnQ6IDQKLSAqIGMtbGFiZWwtb2Zmc2V0OiAtNAotICogYy1jb250aW51ZWQtc3RhdGVtZW50LW9mZnNldDogNAotICogYy1jb250aW51ZWQtYnJhY2Utb2Zmc2V0OiAwCi0gKiBpbmRlbnQtdGFicy1tb2RlOiAxCi0gKiB0YWItd2lkdGg6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGlhZy5oIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGlhZy5oCmluZGV4IGEwYzM4ZTMuLmIyNmViMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2RpYWcuaAorKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kaWFnLmgKQEAgLTYsNyArNiw3IEBACiAgKiBCdWdyZXBvcnRzLnRvLi46IDxMaW51eDM5MEBkZS5pYm0uY29tPgogICogKEMpIElCTSBDb3Jwb3JhdGlvbiwgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIDE5OTksMjAwMAogICoKLSAqICRSZXZpc2lvbjogMS42ICQKKyAqICRSZXZpc2lvbjogMS43ICQKICAqLwogCiAjZGVmaW5lIE1EU0tfV1JJVEVfUkVRIDB4MDEKQEAgLTE5LDYgKzE5LDE4IEBACiAjZGVmaW5lIERFVl9DTEFTU19GQkEJMHgwMQogI2RlZmluZSBERVZfQ0xBU1NfRUNLRAkweDA0CiAKKyNkZWZpbmUgREFTRF9ESUFHX0xDX0lOVF9DT0RFCQkxMzIKKyNkZWZpbmUgREFTRF9ESUFHX0xDX0lOVF9TVEFUVVMJCTEzMworI2RlZmluZSBEQVNEX0RJQUdfTENfSU5UX1BBUk1fMzFCSVQJMTI4CisjZGVmaW5lIERBU0RfRElBR19MQ19JTlRfUEFSTV82NEJJVAk0NTM2CisjZGVmaW5lIERBU0RfRElBR19DT0RFXzMxQklUCQkweDAzCisjZGVmaW5lIERBU0RfRElBR19DT0RFXzY0QklUCQkweDA3CisKKyNkZWZpbmUgREFTRF9ESUFHX1JXRkxBR19BU1lOQwkJMHgwMgorI2RlZmluZSBEQVNEX0RJQUdfUldGTEFHX05PQ0FDSEUJMHgwMQorCisjZGVmaW5lIERBU0RfRElBR19GTEFHQV9GT1JNQVRfNjRCSVQJMHg4MAorCiBzdHJ1Y3QgZGFzZF9kaWFnX2NoYXJhY3RlcmlzdGljcyB7CiAJdTE2IGRldl9ucjsKIAl1MTYgcmRjX2xlbjsKQEAgLTMyLDM1ICs0NCwxMDYgQEAKIAl1OCByZGV2X2ZlYXR1cmVzOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLCBhbGlnbmVkKDQpKSk7CiAKK3N0cnVjdCBkYXNkX2RpYWdfY21zX2xhYmVsIHsKKwl1OCBsYWJlbF9pZFs0XTsKKwl1OCB2b2xfaWRbNl07CisJdTE2IHZlcnNpb25faWQ7CisJdTMyIGJsb2NrX3NpemU7CisJdTMyIG9yaWdpbl9wdHI7CisJdTMyIHVzYWJsZV9jb3VudDsKKwl1MzIgZm9ybWF0dGVkX2NvdW50OworCXUzMiBibG9ja19jb3VudDsKKwl1MzIgdXNlZF9jb3VudDsKKwl1MzIgZnN0X3NpemU7CisJdTMyIGZzdF9jb3VudDsKKwl1OCBmb3JtYXRfZGF0ZVs2XTsKKwl1OCByZXNlcnZlZDFbMl07CisJdTMyIGRpc2tfb2Zmc2V0OworCXUzMiBtYXBfYmxvY2s7CisJdTMyIGhibGtfZGlzcDsKKwl1MzIgdXNlcl9kaXNwOworCXU4IHJlc2VydmVkMls0XTsKKwl1OCBzZWdtZW50X25hbWVbOF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2lmZGVmIENPTkZJR19BUkNIX1MzOTBYCisjZGVmaW5lIERBU0RfRElBR19GTEFHQV9ERUZBVUxUCQlEQVNEX0RJQUdfRkxBR0FfRk9STUFUXzY0QklUCisKK3R5cGVkZWYgdTY0IGJsb2NrbnVtX3Q7Cit0eXBlZGVmIHM2NCBzYmxvY2tudW1fdDsKKworc3RydWN0IGRhc2RfZGlhZ19iaW8geworCXU4IHR5cGU7CisJdTggc3RhdHVzOworCXU4IHNwYXJlMVsyXTsKKwl1MzIgYWxldDsKKwlibG9ja251bV90IGJsb2NrX251bWJlcjsKKwl1NjQgYnVmZmVyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLCBhbGlnbmVkKDgpKSk7CisKK3N0cnVjdCBkYXNkX2RpYWdfaW5pdF9pbyB7CisJdTE2IGRldl9ucjsKKwl1OCBmbGFnYTsKKwl1OCBzcGFyZTFbMjFdOworCXUzMiBibG9ja19zaXplOworCXU4IHNwYXJlMls0XTsKKwlibG9ja251bV90IG9mZnNldDsKKwlzYmxvY2tudW1fdCBzdGFydF9ibG9jazsKKwlibG9ja251bV90IGVuZF9ibG9jazsKKwl1OCAgc3BhcmUzWzhdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLCBhbGlnbmVkKDgpKSk7CisKK3N0cnVjdCBkYXNkX2RpYWdfcndfaW8geworCXUxNiBkZXZfbnI7CisJdTggIGZsYWdhOworCXU4ICBzcGFyZTFbMjFdOworCXU4ICBrZXk7CisJdTggIGZsYWdzOworCXU4ICBzcGFyZTJbMl07CisJdTMyIGJsb2NrX2NvdW50OworCXUzMiBhbGV0OworCXU4ICBzcGFyZTNbNF07CisJdTY0IGludGVycnVwdF9wYXJhbXM7CisJdTY0IGJpb19saXN0OworCXU4ICBzcGFyZTRbOF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQoOCkpKTsKKyNlbHNlIC8qIENPTkZJR19BUkNIX1MzOTBYICovCisjZGVmaW5lIERBU0RfRElBR19GTEFHQV9ERUZBVUxUCQkweDAKKwordHlwZWRlZiB1MzIgYmxvY2tudW1fdDsKK3R5cGVkZWYgczMyIHNibG9ja251bV90OworCiBzdHJ1Y3QgZGFzZF9kaWFnX2JpbyB7CiAJdTggdHlwZTsKIAl1OCBzdGF0dXM7CiAJdTE2IHNwYXJlMTsKLQl1MzIgYmxvY2tfbnVtYmVyOworCWJsb2NrbnVtX3QgYmxvY2tfbnVtYmVyOwogCXUzMiBhbGV0OwogCXUzMiBidWZmZXI7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQoOCkpKTsKIAogc3RydWN0IGRhc2RfZGlhZ19pbml0X2lvIHsKIAl1MTYgZGV2X25yOwotCXUxNiBzcGFyZTFbMTFdOworCXU4IGZsYWdhOworCXU4IHNwYXJlMVsyMV07CiAJdTMyIGJsb2NrX3NpemU7Ci0JdTMyIG9mZnNldDsKLQl1MzIgc3RhcnRfYmxvY2s7Ci0JdTMyIGVuZF9ibG9jazsKLQl1MzIgc3BhcmUyWzZdOworCWJsb2NrbnVtX3Qgb2Zmc2V0OworCXNibG9ja251bV90IHN0YXJ0X2Jsb2NrOworCWJsb2NrbnVtX3QgZW5kX2Jsb2NrOworCXU4IHNwYXJlMlsyNF07CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQoOCkpKTsKIAogc3RydWN0IGRhc2RfZGlhZ19yd19pbyB7CiAJdTE2IGRldl9ucjsKLQl1MTYgc3BhcmUxWzExXTsKKwl1OCBmbGFnYTsKKwl1OCBzcGFyZTFbMjFdOwogCXU4IGtleTsKIAl1OCBmbGFnczsKLQl1MTYgc3BhcmUyOworCXU4IHNwYXJlMlsyXTsKIAl1MzIgYmxvY2tfY291bnQ7CiAJdTMyIGFsZXQ7CiAJdTMyIGJpb19saXN0OwogCXUzMiBpbnRlcnJ1cHRfcGFyYW1zOwotCXUzMiBzcGFyZTNbNV07CisJdTggc3BhcmUzWzIwXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCwgYWxpZ25lZCg4KSkpOwotCisjZW5kaWYgLyogQ09ORklHX0FSQ0hfUzM5MFggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2dlbmhkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9nZW5oZC5jCmluZGV4IDk2YzQ5MzQuLmE2MDFjOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2dlbmhkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZ2VuaGQuYwpAQCAtOSw3ICs5LDcgQEAKICAqCiAgKiBnZW5kaXNrIHJlbGF0ZWQgZnVuY3Rpb25zIGZvciB0aGUgZGFzZCBkcml2ZXIuCiAgKgotICogJFJldmlzaW9uOiAxLjUwICQKKyAqICRSZXZpc2lvbjogMS41MSAkCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgpAQCAtMzEsMTYgKzMxLDEyIEBACiBkYXNkX2dlbmRpc2tfYWxsb2Moc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IGdlbmRpc2sgKmdkcDsKLQlpbnQgbGVuLCBmZWF0dXJlX3JvOworCWludCBsZW47CiAKIAkvKiBNYWtlIHN1cmUgdGhlIG1pbm9yIGZvciB0aGlzIGRldmljZSBleGlzdHMuICovCiAJaWYgKGRldmljZS0+ZGV2aW5kZXggPj0gREFTRF9QRVJfTUFKT1IpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlmZWF0dXJlX3JvID0gZGFzZF9nZXRfZmVhdHVyZShkZXZpY2UtPmNkZXYsIERBU0RfRkVBVFVSRV9SRUFET05MWSk7Ci0JaWYgKGZlYXR1cmVfcm8gPCAwKQotCQlyZXR1cm4gZmVhdHVyZV9ybzsKLQogCWdkcCA9IGFsbG9jX2Rpc2soMSA8PCBEQVNEX1BBUlROX0JJVFMpOwogCWlmICghZ2RwKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTc1LDcgKzcxLDcgQEAKIAogIAlzcHJpbnRmKGdkcC0+ZGV2ZnNfbmFtZSwgImRhc2QvJXMiLCBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOwogCi0JaWYgKGZlYXR1cmVfcm8pCisJaWYgKGRldmljZS0+ZmVhdHVyZXMgJiBEQVNEX0ZFQVRVUkVfUkVBRE9OTFkpCiAJCXNldF9kaXNrX3JvKGdkcCwgMSk7CiAJZ2RwLT5wcml2YXRlX2RhdGEgPSBkZXZpY2U7CiAJZ2RwLT5xdWV1ZSA9IGRldmljZS0+cmVxdWVzdF9xdWV1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKaW5kZXggYTlmMzhiMi4uOWZhYjA0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKQEAgLTYsNyArNiw3IEBACiAgKiBCdWdyZXBvcnRzLnRvLi46IDxMaW51eDM5MEBkZS5pYm0uY29tPgogICogKEMpIElCTSBDb3Jwb3JhdGlvbiwgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIDE5OTksMjAwMAogICoKLSAqICRSZXZpc2lvbjogMS42NCAkCisgKiAkUmV2aXNpb246IDEuNjUgJAogICovCiAKICNpZm5kZWYgREFTRF9JTlRfSApAQCAtMjg2LDYgKzI4Niw3IEBACiAJdW5zaWduZWQgaW50IGJwX2Jsb2NrOwkJLyogYnl0ZXMgcGVyIGJsb2NrICovCiAJdW5zaWduZWQgaW50IHMyYl9zaGlmdDsJCS8qIGxvZzIgKGJwX2Jsb2NrLzUxMikgKi8KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogcGVyIGRldmljZSBmbGFncyAqLworCXVuc2lnbmVkIHNob3J0IGZlYXR1cmVzOyAgICAgICAgLyogY29weSBvZiBkZXZtYXAtZmVhdHVyZXMgKHJlYWQtb25seSEpICovCiAKIAkvKiBEZXZpY2UgZGlzY2lwbGluZSBzdHVmZi4gKi8KIAlzdHJ1Y3QgZGFzZF9kaXNjaXBsaW5lICpkaXNjaXBsaW5lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW9jdGwuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2lvY3RsLmMKaW5kZXggOTgwYzU1NS4uNzg5NTk1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW9jdGwuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pb2N0bC5jCkBAIC03LDcgKzcsNyBAQAogICogQnVncmVwb3J0cy50by4uOiA8TGludXgzOTBAZGUuaWJtLmNvbT4KICAqIChDKSBJQk0gQ29ycG9yYXRpb24sIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCAxOTk5LTIwMDEKICAqCi0gKiAkUmV2aXNpb246IDEuNDUgJAorICogJFJldmlzaW9uOiAxLjQ3ICQKICAqCiAgKiBpL28gY29udHJvbHMgZm9yIHRoZSBkYXNkIGRyaXZlci4KICAqLwpAQCAtMjk2LDcgKzI5Niw2IEBACiB7CiAJc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IGZvcm1hdF9kYXRhX3QgZmRhdGE7Ci0JaW50IGZlYXR1cmVfcm87CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRUFDQ0VTOwpAQCAtMzA4LDEwICszMDcsNyBAQAogCWlmIChkZXZpY2UgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlmZWF0dXJlX3JvID0gZGFzZF9nZXRfZmVhdHVyZShkZXZpY2UtPmNkZXYsIERBU0RfRkVBVFVSRV9SRUFET05MWSk7Ci0JaWYgKGZlYXR1cmVfcm8gPCAwKQotCQlyZXR1cm4gZmVhdHVyZV9ybzsKLQlpZiAoZmVhdHVyZV9ybykKKwlpZiAoZGV2aWNlLT5mZWF0dXJlcyAmIERBU0RfRkVBVFVSRV9SRUFET05MWSkKIAkJcmV0dXJuIC1FUk9GUzsKIAlpZiAoY29weV9mcm9tX3VzZXIoJmZkYXRhLCAodm9pZCBfX3VzZXIgKikgYXJncywKIAkJCSAgIHNpemVvZiAoc3RydWN0IGZvcm1hdF9kYXRhX3QpKSkKQEAgLTM4NCw3ICszODAsNyBAQAogCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBkYXNkX2luZm9ybWF0aW9uMl90ICpkYXNkX2luZm87CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmMsIGZlYXR1cmVfcm87CisJaW50IHJjOwogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCiAJZGV2aWNlID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwpAQCAtMzk0LDEwICszOTAsNiBAQAogCWlmICghZGV2aWNlLT5kaXNjaXBsaW5lLT5maWxsX2luZm8pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZmVhdHVyZV9ybyA9IGRhc2RfZ2V0X2ZlYXR1cmUoZGV2aWNlLT5jZGV2LCBEQVNEX0ZFQVRVUkVfUkVBRE9OTFkpOwotCWlmIChmZWF0dXJlX3JvIDwgMCkKLQkJcmV0dXJuIGZlYXR1cmVfcm87Ci0KIAlkYXNkX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGFzZF9pbmZvcm1hdGlvbjJfdCksIEdGUF9LRVJORUwpOwogCWlmIChkYXNkX2luZm8gPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC00MjcsNyArNDE5LDggQEAKIAkgICAgKGRhc2RfY2hlY2tfYmxvY2tzaXplKGRldmljZS0+YnBfYmxvY2spKSkKIAkJZGFzZF9pbmZvLT5mb3JtYXQgPSBEQVNEX0ZPUk1BVF9OT05FOwogCi0JZGFzZF9pbmZvLT5mZWF0dXJlcyB8PSBmZWF0dXJlX3JvOworCWRhc2RfaW5mby0+ZmVhdHVyZXMgfD0KKwkJKChkZXZpY2UtPmZlYXR1cmVzICYgREFTRF9GRUFUVVJFX1JFQURPTkxZKSAhPSAwKTsKIAogCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUpCiAJCW1lbWNweShkYXNkX2luZm8tPnR5cGUsIGRldmljZS0+ZGlzY2lwbGluZS0+bmFtZSwgNCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMKaW5kZXggNDNjMzRmOC4uZmZmOTAyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfcHJvYy5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX3Byb2MuYwpAQCAtOSw3ICs5LDcgQEAKICAqCiAgKiAvcHJvYyBpbnRlcmZhY2UgZm9yIHRoZSBkYXNkIGRyaXZlci4KICAqCi0gKiAkUmV2aXNpb246IDEuMzIgJAorICogJFJldmlzaW9uOiAxLjMzICQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC01NSw3ICs1NSw2IEBACiB7CiAJc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2U7CiAJY2hhciAqc3Vic3RyOwotCWludCBmZWF0dXJlOwogCiAJZGV2aWNlID0gZGFzZF9kZXZpY2VfZnJvbV9kZXZpbmRleCgodW5zaWduZWQgbG9uZykgdiAtIDEpOwogCWlmIChJU19FUlIoZGV2aWNlKSkKQEAgLTc5LDEwICs3OCw3IEBACiAJZWxzZQogCQlzZXFfcHJpbnRmKG0sICIgaXMgPz8/Pz8/Pz8iKTsKIAkvKiBQcmludCBkZXZpY2VzIGZlYXR1cmVzLiAqLwotCWZlYXR1cmUgPSBkYXNkX2dldF9mZWF0dXJlKGRldmljZS0+Y2RldiwgREFTRF9GRUFUVVJFX1JFQURPTkxZKTsKLQlpZiAoZmVhdHVyZSA8IDApCi0JCXJldHVybiAwOwotCXN1YnN0ciA9IGZlYXR1cmUgPyAiKHJvKSIgOiAiICI7CisJc3Vic3RyID0gKGRldmljZS0+ZmVhdHVyZXMgJiBEQVNEX0ZFQVRVUkVfUkVBRE9OTFkpID8gIihybykiIDogIiAiOwogCXNlcV9wcmludGYobSwgIiU0czogIiwgc3Vic3RyKTsKIAkvKiBQcmludCBkZXZpY2Ugc3RhdHVzIGluZm9ybWF0aW9uLiAqLwogCXN3aXRjaCAoKGRldmljZSAhPSBOVUxMKSA/IGRldmljZS0+c3RhdGUgOiAtMSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5jCmluZGV4IGQ1ZWVmZWEuLjMyOGQ5Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3JhdzMyNzAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmMKQEAgLTYzMiwxMiArNjMyLDkgQEAKIAlyYXczMjcwX2luaXRfcmVxdWVzdC5jY3cuY2RhID0gKF9fdTMyKSBfX3BhKHJhdzMyNzBfaW5pdF9kYXRhKTsKIAogCXJjID0gcmF3MzI3MF9zdGFydF9pbml0KHJwLCAmcmF3MzI3MF9pbml0X3ZpZXcsICZyYXczMjcwX2luaXRfcmVxdWVzdCk7Ci0JaWYgKHJjKSB7CisJaWYgKHJjKQogCQkvKiBDaGVjayBlcnJvciBjYXNlczogLUVSRVNUQVJUU1lTLCAtRUlPIGFuZCAtRU9QTk9UU1VQUCAqLwotCQlpZiAocmMgPT0gLUVPUE5PVFNVUFAgJiYgTUFDSElORV9JU19WTSkKLQkJCXJldHVybiBfX3JhdzMyNzBfc2l6ZV9kZXZpY2Vfdm0ocnApOwogCQlyZXR1cm4gcmM7Ci0JfQogCiAJLyogV2FpdCBmb3IgYXR0ZW50aW9uIGludGVycnVwdC4gKi8KICNpZmRlZiBDT05GSUdfVE4zMjcwX0NPTlNPTEUKQEAgLTY5NSw3ICs2OTIsMTAgQEAKIAlkb3duKCZyYXczMjcwX2luaXRfc2VtKTsKIAlycC0+dmlldyA9ICZyYXczMjcwX2luaXRfdmlldzsKIAlyYXczMjcwX2luaXRfdmlldy5kZXYgPSBycDsKLQlyYyA9IF9fcmF3MzI3MF9zaXplX2RldmljZShycCk7CisJaWYgKE1BQ0hJTkVfSVNfVk0pCisJCXJjID0gX19yYXczMjcwX3NpemVfZGV2aWNlX3ZtKHJwKTsKKwllbHNlCisJCXJjID0gX19yYXczMjcwX3NpemVfZGV2aWNlKHJwKTsKIAlyYXczMjcwX2luaXRfdmlldy5kZXYgPSAwOwogCXJwLT52aWV3ID0gMDsKIAl1cCgmcmF3MzI3MF9pbml0X3NlbSk7CkBAIC03MTAsNiArNzEwLDEyIEBACiAJCQlycC0+bW9kZWwgPSA0OwogCQlpZiAocnAtPnJvd3MgPT0gMjcgJiYgcnAtPmNvbHMgPT0gMTMyKQogCQkJcnAtPm1vZGVsID0gNTsKKwl9IGVsc2UgeworCQkvKiBDb3VsZG4ndCBkZXRlY3Qgc2l6ZS4gVXNlIGRlZmF1bHQgbW9kZWwgMi4gKi8KKwkJcnAtPm1vZGVsID0gMjsKKwkJcnAtPnJvd3MgPSAyNDsKKwkJcnAtPmNvbHMgPSA4MDsKKwkJcmV0dXJuIDA7CiAJfQogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCmluZGV4IGVhODEzYmQuLjE4NWJjNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgZHJpdmVycy9zMzkwL2Npby9jaW8uYwogICogICBTLzM5MCBjb21tb24gSS9PIHJvdXRpbmVzIC0tIGxvdyBsZXZlbCBpL28gY2FsbHMKLSAqICAgJFJldmlzaW9uOiAxLjEzNCAkCisgKiAgICRSZXZpc2lvbjogMS4xMzUgJAogICoKICAqICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgICAgICBJQk0gQ29ycG9yYXRpb24KQEAgLTgxNSw4ICs4MTUsOSBAQAogCQlzdHJ1Y3QgdHBpX2luZm8gdGk7CiAKIAkJaWYgKHRwaSgmdGkpKSB7Ci0JCQl0c2NoKHNjaGlkLCAoc3RydWN0IGlyYiAqKV9fTENfSVJCKTsKLQkJCXJldHVybiAwOworCQkJdHNjaCh0aS5pcnEsIChzdHJ1Y3QgaXJiICopX19MQ19JUkIpOworCQkJaWYgKHRpLmlycSA9PSBzY2hpZCkKKwkJCQlyZXR1cm4gMDsKIAkJfQogCQl1ZGVsYXkoMTAwKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9mc20uYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCmluZGV4IGVlN2EwNWUuLmZiZTQyMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgotI2luY2x1ZGUgPGFzbS9xZGlvLmg+CisjaW5jbHVkZSA8YXNtL2Npby5oPgogCiAjaW5jbHVkZSAiY2lvLmgiCiAjaW5jbHVkZSAiY2lvX2RlYnVnLmgiCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiZGV2aWNlLmgiCiAjaW5jbHVkZSAiY2hzYy5oIgogI2luY2x1ZGUgImlvYXNtLmgiCi0jaW5jbHVkZSAicWRpby5oIgogCiBpbnQKIGRldmljZV9pc19vbmxpbmUoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX29wcy5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKaW5kZXggMDJkMDFhMC4uYWQzZmU1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogIGRyaXZlcnMvczM5MC9jaW8vZGV2aWNlX29wcy5jCiAgKgotICogICAkUmV2aXNpb246IDEuNTYgJAorICogICAkUmV2aXNpb246IDEuNTcgJAogICoKICAqICAgIENvcHlyaWdodCAoQykgMjAwMiBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKICAqCQkJIElCTSBDb3Jwb3JhdGlvbgpAQCAtMTksMTQgKzE5LDEyIEBACiAKICNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2lkYWxzLmg+Ci0jaW5jbHVkZSA8YXNtL3FkaW8uaD4KIAogI2luY2x1ZGUgImNpby5oIgogI2luY2x1ZGUgImNpb19kZWJ1Zy5oIgogI2luY2x1ZGUgImNzcy5oIgogI2luY2x1ZGUgImNoc2MuaCIKICNpbmNsdWRlICJkZXZpY2UuaCIKLSNpbmNsdWRlICJxZGlvLmgiCiAKIGludAogY2N3X2RldmljZV9zZXRfb3B0aW9ucyhzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgdW5zaWduZWQgbG9uZyBmbGFncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vaW9hc20uaCBiL2RyaXZlcnMvczM5MC9jaW8vaW9hc20uaAppbmRleCBjODc0NjA3Li40NTQ4MGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2lvYXNtLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9pb2FzbS5oCkBAIC0yMSw3ICsyMSw3IEBACiAgKiBTb21lIFMzOTAgc3BlY2lmaWMgSU8gaW5zdHJ1Y3Rpb25zIGFzIGlubGluZQogICovCiAKLWV4dGVybiBfX2lubGluZV9fIGludCBzdHNjaChpbnQgaXJxLCB2b2xhdGlsZSBzdHJ1Y3Qgc2NoaWIgKmFkZHIpCitzdGF0aWMgaW5saW5lIGludCBzdHNjaChpbnQgaXJxLCB2b2xhdGlsZSBzdHJ1Y3Qgc2NoaWIgKmFkZHIpCiB7CiAJaW50IGNjb2RlOwogCkBAIC0zNiw3ICszNiw3IEBACiAJcmV0dXJuIGNjb2RlOwogfQogCi1leHRlcm4gX19pbmxpbmVfXyBpbnQgbXNjaChpbnQgaXJxLCB2b2xhdGlsZSBzdHJ1Y3Qgc2NoaWIgKmFkZHIpCitzdGF0aWMgaW5saW5lIGludCBtc2NoKGludCBpcnEsIHZvbGF0aWxlIHN0cnVjdCBzY2hpYiAqYWRkcikKIHsKIAlpbnQgY2NvZGU7CiAKQEAgLTUxLDcgKzUxLDcgQEAKIAlyZXR1cm4gY2NvZGU7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIGludCBtc2NoX2VycihpbnQgaXJxLCB2b2xhdGlsZSBzdHJ1Y3Qgc2NoaWIgKmFkZHIpCitzdGF0aWMgaW5saW5lIGludCBtc2NoX2VycihpbnQgaXJxLCB2b2xhdGlsZSBzdHJ1Y3Qgc2NoaWIgKmFkZHIpCiB7CiAJaW50IGNjb2RlOwogCkBAIC03OSw3ICs3OSw3IEBACiAJcmV0dXJuIGNjb2RlOwogfQogCi1leHRlcm4gX19pbmxpbmVfXyBpbnQgdHNjaChpbnQgaXJxLCB2b2xhdGlsZSBzdHJ1Y3QgaXJiICphZGRyKQorc3RhdGljIGlubGluZSBpbnQgdHNjaChpbnQgaXJxLCB2b2xhdGlsZSBzdHJ1Y3QgaXJiICphZGRyKQogewogCWludCBjY29kZTsKIApAQCAtOTQsNyArOTQsNyBAQAogCXJldHVybiBjY29kZTsKIH0KIAotZXh0ZXJuIF9faW5saW5lX18gaW50IHRwaSggdm9sYXRpbGUgc3RydWN0IHRwaV9pbmZvICphZGRyKQorc3RhdGljIGlubGluZSBpbnQgdHBpKCB2b2xhdGlsZSBzdHJ1Y3QgdHBpX2luZm8gKmFkZHIpCiB7CiAJaW50IGNjb2RlOwogCkBAIC0xMDgsNyArMTA4LDcgQEAKIAlyZXR1cm4gY2NvZGU7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIGludCBzc2NoKGludCBpcnEsIHZvbGF0aWxlIHN0cnVjdCBvcmIgKmFkZHIpCitzdGF0aWMgaW5saW5lIGludCBzc2NoKGludCBpcnEsIHZvbGF0aWxlIHN0cnVjdCBvcmIgKmFkZHIpCiB7CiAJaW50IGNjb2RlOwogCkBAIC0xMjMsNyArMTIzLDcgQEAKIAlyZXR1cm4gY2NvZGU7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIGludCByc2NoKGludCBpcnEpCitzdGF0aWMgaW5saW5lIGludCByc2NoKGludCBpcnEpCiB7CiAJaW50IGNjb2RlOwogCkBAIC0xMzgsNyArMTM4LDcgQEAKIAlyZXR1cm4gY2NvZGU7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIGludCBjc2NoKGludCBpcnEpCitzdGF0aWMgaW5saW5lIGludCBjc2NoKGludCBpcnEpCiB7CiAJaW50IGNjb2RlOwogCkBAIC0xNTMsNyArMTUzLDcgQEAKIAlyZXR1cm4gY2NvZGU7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIGludCBoc2NoKGludCBpcnEpCitzdGF0aWMgaW5saW5lIGludCBoc2NoKGludCBpcnEpCiB7CiAJaW50IGNjb2RlOwogCkBAIC0xNjgsNyArMTY4LDcgQEAKIAlyZXR1cm4gY2NvZGU7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIGludCB4c2NoKGludCBpcnEpCitzdGF0aWMgaW5saW5lIGludCB4c2NoKGludCBpcnEpCiB7CiAJaW50IGNjb2RlOwogCkBAIC0xODMsNyArMTgzLDcgQEAKIAlyZXR1cm4gY2NvZGU7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIGludCBjaHNjKHZvaWQgKmNoc2NfYXJlYSkKK3N0YXRpYyBpbmxpbmUgaW50IGNoc2Modm9pZCAqY2hzY19hcmVhKQogewogCWludCBjYzsKIApAQCAtMTk4LDcgKzE5OCw3IEBACiAJcmV0dXJuIGNjOwogfQogCi1leHRlcm4gX19pbmxpbmVfXyBpbnQgaWFjKCB2b2lkKQorc3RhdGljIGlubGluZSBpbnQgaWFjKCB2b2lkKQogewogCWludCBjY29kZTsKIApAQCAtMjEwLDcgKzIxMCw3IEBACiAJcmV0dXJuIGNjb2RlOwogfQogCi1leHRlcm4gX19pbmxpbmVfXyBpbnQgcmNocChpbnQgY2hwaWQpCitzdGF0aWMgaW5saW5lIGludCByY2hwKGludCBjaHBpZCkKIHsKIAlpbnQgY2NvZGU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jcnlwdG8vejkwY29tbW9uLmggYi9kcml2ZXJzL3MzOTAvY3J5cHRvL3o5MGNvbW1vbi5oCmluZGV4IGJjYWJhYzcuLmUzMTllNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jcnlwdG8vejkwY29tbW9uLmgKKysrIGIvZHJpdmVycy9zMzkwL2NyeXB0by96OTBjb21tb24uaApAQCAtMjcsNyArMjcsNyBAQAogI2lmbmRlZiBfWjkwQ09NTU9OX0hfCiAjZGVmaW5lIF9aOTBDT01NT05fSF8KIAotI2RlZmluZSBWRVJTSU9OX1o5MENPTU1PTl9IICIkUmV2aXNpb246IDEuMTYgJCIKKyNkZWZpbmUgVkVSU0lPTl9aOTBDT01NT05fSCAiJFJldmlzaW9uOiAxLjE3ICQiCiAKIAogI2RlZmluZSBSRVNQQlVGRlNJWkUgMjU2CkBAIC0xNjQsNSArMTY0LDQgQEAKICNkZWZpbmUgVU1JTihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCiAjZGVmaW5lIElTX0VWRU4oeCkgKCh4KSA9PSAoMiAqICgoeCkgLyAyKSkpCiAKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL3o5MGhhcmR3YXJlLmMgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL3o5MGhhcmR3YXJlLmMKaW5kZXggYmViNmE1ZS4uYzIxNWUwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by96OTBoYXJkd2FyZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vejkwaGFyZHdhcmUuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgIno5MGNyeXB0LmgiCiAjaW5jbHVkZSAiejkwY29tbW9uLmgiCiAKLSNkZWZpbmUgVkVSU0lPTl9aOTBIQVJEV0FSRV9DICIkUmV2aXNpb246IDEuMzMgJCIKKyNkZWZpbmUgVkVSU0lPTl9aOTBIQVJEV0FSRV9DICIkUmV2aXNpb246IDEuMzQgJCIKIAogY2hhciB6OTBoYXJkd2FyZV92ZXJzaW9uW10gX19pbml0ZGF0YSA9CiAJIno5MGhhcmR3YXJlLm8gKCIgVkVSU0lPTl9aOTBIQVJEV0FSRV9DICIvIgpAQCAtMjgzLDQ4ICsyODMsNiBAQAogCXN0cnVjdCBDUFJCCSBDUFJCOwogfTsKIAotdW5pb24gcmVxdWVzdF9tc2cgewotCXVuaW9uICB0eXBlNF9tc2cgdDRtc2c7Ci0Jc3RydWN0IHR5cGU2X21zZyB0Nm1zZzsKLX07Ci0KLXN0cnVjdCByZXF1ZXN0X21zZ19leHQgewotCWludAkJICBxX25yOwotCXVuc2lnbmVkIGNoYXIJICAqcHNtaWQ7Ci0JdW5pb24gcmVxdWVzdF9tc2cgcmVxTXNnOwotfTsKLQotc3RydWN0IHR5cGU4Ml9oZHIgewotCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQxOwotCXVuc2lnbmVkIGNoYXIgdHlwZTsKLQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkMlsyXTsKLQl1bnNpZ25lZCBjaGFyIHJlcGx5X2NvZGU7Ci0JdW5zaWduZWQgY2hhciByZXNlcnZlZDNbM107Ci19OwotCi0jZGVmaW5lIFRZUEU4Ml9SU1BfQ09ERSAweDgyCi0KLSNkZWZpbmUgUkVQTFlfRVJST1JfTUFDSElORV9GQUlMVVJFICAweDEwCi0jZGVmaW5lIFJFUExZX0VSUk9SX1BSRUVNUFRfRkFJTFVSRSAgMHgxMgotI2RlZmluZSBSRVBMWV9FUlJPUl9DSEVDS1BUX0ZBSUxVUkUgIDB4MTQKLSNkZWZpbmUgUkVQTFlfRVJST1JfTUVTU0FHRV9UWVBFICAgICAweDIwCi0jZGVmaW5lIFJFUExZX0VSUk9SX0lOVkFMSURfQ09NTV9DRCAgMHgyMQotI2RlZmluZSBSRVBMWV9FUlJPUl9JTlZBTElEX01TR19MRU4gIDB4MjMKLSNkZWZpbmUgUkVQTFlfRVJST1JfUkVTRVJWRF9GSUVMRCAgICAweDI0Ci0jZGVmaW5lIFJFUExZX0VSUk9SX0ZPUk1BVF9GSUVMRCAgICAgMHgyOQotI2RlZmluZSBSRVBMWV9FUlJPUl9JTlZBTElEX0NPTU1BTkQgIDB4MzAKLSNkZWZpbmUgUkVQTFlfRVJST1JfTUFMRk9STUVEX01TRyAgICAweDQwCi0jZGVmaW5lIFJFUExZX0VSUk9SX1JFU0VSVkVEX0ZJRUxETyAgMHg1MAotI2RlZmluZSBSRVBMWV9FUlJPUl9XT1JEX0FMSUdOTUVOVCAgIDB4NjAKLSNkZWZpbmUgUkVQTFlfRVJST1JfTUVTU0FHRV9MRU5HVEggICAweDgwCi0jZGVmaW5lIFJFUExZX0VSUk9SX09QRVJBTkRfSU5WQUxJRCAgMHg4MgotI2RlZmluZSBSRVBMWV9FUlJPUl9PUEVSQU5EX1NJWkUgICAgIDB4ODQKLSNkZWZpbmUgUkVQTFlfRVJST1JfRVZFTl9NT0RfSU5fT1BORCAweDg1Ci0jZGVmaW5lIFJFUExZX0VSUk9SX1JFU0VSVkVEX0ZJRUxEICAgMHg4OAotI2RlZmluZSBSRVBMWV9FUlJPUl9UUkFOU1BPUlRfRkFJTCAgIDB4OTAKLSNkZWZpbmUgUkVQTFlfRVJST1JfUEFDS0VUX1RSVU5DQVRFRCAweEEwCi0jZGVmaW5lIFJFUExZX0VSUk9SX1pFUk9fQlVGRkVSX0xFTiAgMHhCMAotCiBzdHJ1Y3QgdHlwZTg2X2hkciB7CiAJdW5zaWduZWQgY2hhciByZXNlcnZlZDE7CiAJdW5zaWduZWQgY2hhciB0eXBlOwpAQCAtMzM4LDcgKzI5Niw3IEBACiAjZGVmaW5lIFRZUEU4Nl9GTVQyCTB4MDIKIAogc3RydWN0IHR5cGU4Nl9mbXQyX21zZyB7Ci0Jc3RydWN0IHR5cGU4Nl9oZHIgaGRyOworCXN0cnVjdCB0eXBlODZfaGRyIGhlYWRlcjsKIAl1bnNpZ25lZCBjaGFyCSAgcmVzZXJ2ZWRbNF07CiAJdW5zaWduZWQgY2hhcgkgIGFwZnNbNF07CiAJdW5zaWduZWQgaW50CSAgY291bnQxOwpAQCAtNTM4LDYgKzQ5Niw4IEBACiAJeydNJywnUicsJ1AnLCcgJywnICcsJyAnLCcgJywnICd9CiB9OwogCitzdGF0aWMgdW5zaWduZWQgY2hhciBzdGF0aWNfUEtFX2Z1bmN0aW9uX2NvZGVbMl0gPSB7MHg1MCwgMHg0Qn07CisKIHN0cnVjdCBUNl9rZXlCbG9ja19oZHJYIHsKIAl1bnNpZ25lZCBzaG9ydCBibGVuOwogCXVuc2lnbmVkIHNob3J0IHVsZW47CkBAIC02ODgsOSArNjQ4LDM4IEBACiAjZGVmaW5lIFJFU1BPTlNFX0NQUkJfU0laRSAgMHgwMDAwMDZCOAogI2RlZmluZSBSRVNQT05TRV9DUFJCWF9TSVpFIDB4MDAwMDA3MjQKIAotI2RlZmluZSBDQUxMRVJfSEVBREVSIDEyCitzdHJ1Y3QgZXJyb3JfaGRyIHsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkMTsKKwl1bnNpZ25lZCBjaGFyIHR5cGU7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZDJbMl07CisJdW5zaWduZWQgY2hhciByZXBseV9jb2RlOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQzWzNdOworfTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgc3RhdGljX1BLRV9mdW5jdGlvbl9jb2RlWzJdID0gezB4NTAsIDB4NEJ9OworI2RlZmluZSBUWVBFODJfUlNQX0NPREUgMHg4MgorCisjZGVmaW5lIFJFUDgyX0VSUk9SX01BQ0hJTkVfRkFJTFVSRSAgMHgxMAorI2RlZmluZSBSRVA4Ml9FUlJPUl9QUkVFTVBUX0ZBSUxVUkUgIDB4MTIKKyNkZWZpbmUgUkVQODJfRVJST1JfQ0hFQ0tQVF9GQUlMVVJFICAweDE0CisjZGVmaW5lIFJFUDgyX0VSUk9SX01FU1NBR0VfVFlQRSAgICAgMHgyMAorI2RlZmluZSBSRVA4Ml9FUlJPUl9JTlZBTElEX0NPTU1fQ0QgIDB4MjEKKyNkZWZpbmUgUkVQODJfRVJST1JfSU5WQUxJRF9NU0dfTEVOICAweDIzCisjZGVmaW5lIFJFUDgyX0VSUk9SX1JFU0VSVkRfRklFTEQgICAgMHgyNAorI2RlZmluZSBSRVA4Ml9FUlJPUl9GT1JNQVRfRklFTEQgICAgIDB4MjkKKyNkZWZpbmUgUkVQODJfRVJST1JfSU5WQUxJRF9DT01NQU5EICAweDMwCisjZGVmaW5lIFJFUDgyX0VSUk9SX01BTEZPUk1FRF9NU0cgICAgMHg0MAorI2RlZmluZSBSRVA4Ml9FUlJPUl9SRVNFUlZFRF9GSUVMRE8gIDB4NTAKKyNkZWZpbmUgUkVQODJfRVJST1JfV09SRF9BTElHTk1FTlQgICAweDYwCisjZGVmaW5lIFJFUDgyX0VSUk9SX01FU1NBR0VfTEVOR1RIICAgMHg4MAorI2RlZmluZSBSRVA4Ml9FUlJPUl9PUEVSQU5EX0lOVkFMSUQgIDB4ODIKKyNkZWZpbmUgUkVQODJfRVJST1JfT1BFUkFORF9TSVpFICAgICAweDg0CisjZGVmaW5lIFJFUDgyX0VSUk9SX0VWRU5fTU9EX0lOX09QTkQgMHg4NQorI2RlZmluZSBSRVA4Ml9FUlJPUl9SRVNFUlZFRF9GSUVMRCAgIDB4ODgKKyNkZWZpbmUgUkVQODJfRVJST1JfVFJBTlNQT1JUX0ZBSUwgICAweDkwCisjZGVmaW5lIFJFUDgyX0VSUk9SX1BBQ0tFVF9UUlVOQ0FURUQgMHhBMAorI2RlZmluZSBSRVA4Ml9FUlJPUl9aRVJPX0JVRkZFUl9MRU4gIDB4QjAKKworI2RlZmluZSBDQUxMRVJfSEVBREVSIDEyCiAKIHN0YXRpYyBpbmxpbmUgaW50CiB0ZXN0cShpbnQgcV9uciwgaW50ICpxX2RlcHRoLCBpbnQgKmRldl90eXBlLCBzdHJ1Y3QgYXBfc3RhdHVzX3dvcmQgKnN0YXQpCkBAIC0xMjEyLDkgKzEyMDEsOSBAQAogCXN0cnVjdCBhcF9zdGF0dXNfd29yZCBzdGF0X3dvcmQ7CiAJZW51bSBkZXZzdGF0IHN0YXQ7CiAJaW50IGNjb2RlOworCXUzMiAqcV9ucl9wID0gKHUzMiAqKW1zZ19leHQ7CiAKLQkoKHN0cnVjdCByZXF1ZXN0X21zZ19leHQgKikgbXNnX2V4dCktPnFfbnIgPQotCQkoZGV2X25yIDw8IFNLSVBfQklUTCkgKyBjZHg7CisJKnFfbnJfcCA9IChkZXZfbnIgPDwgU0tJUF9CSVRMKSArIGNkeDsKIAlQREVCVUcoIm1zZ19sZW4gcGFzc2VkIHRvIHNlbjogJWRcbiIsIG1zZ19sZW4pOwogCVBERUJVRygicSBudW1iZXIgcGFzc2VkIHRvIHNlbjogJTAyeCUwMnglMDJ4JTAyeFxuIiwKIAkgICAgICAgbXNnX2V4dFswXSwgbXNnX2V4dFsxXSwgbXNnX2V4dFsyXSwgbXNnX2V4dFszXSk7CkBAIC0yMTA0LDcgKzIwOTMsNyBAQAogCQkgaW50ICpyZXNwYnVmZmxlbl9wLCB1bnNpZ25lZCBjaGFyICpyZXNwX2J1ZmYpCiB7CiAJc3RydWN0IGljYV9yc2FfbW9kZXhwbyAqaWNhTXNnX3AgPSAoc3RydWN0IGljYV9yc2FfbW9kZXhwbyAqKSBidWZmZXI7Ci0Jc3RydWN0IHR5cGU4Ml9oZHIgKnQ4MmhfcCA9IChzdHJ1Y3QgdHlwZTgyX2hkciAqKSByZXNwb25zZTsKKwlzdHJ1Y3QgZXJyb3JfaGRyICplcnJoX3AgPSAoc3RydWN0IGVycm9yX2hkciAqKSByZXNwb25zZTsKIAlzdHJ1Y3QgdHlwZTg0X2hkciAqdDg0aF9wID0gKHN0cnVjdCB0eXBlODRfaGRyICopIHJlc3BvbnNlOwogCXN0cnVjdCB0eXBlODZfZm10Ml9tc2cgKnQ4Nm1fcCA9ICAoc3RydWN0IHR5cGU4Nl9mbXQyX21zZyAqKSByZXNwb25zZTsKIAlpbnQgcmVwbHlfY29kZSwgc2VydmljZV9yYywgc2VydmljZV9ycywgc3JjX2w7CkBAIC0yMTE3LDEyICsyMTA2LDEzIEBACiAJc2VydmljZV9yYyA9IDA7CiAJc2VydmljZV9ycyA9IDA7CiAJc3JjX2wgPSAwOwotCXN3aXRjaCAodDgyaF9wLT50eXBlKSB7CisJc3dpdGNoIChlcnJoX3AtPnR5cGUpIHsKIAljYXNlIFRZUEU4Ml9SU1BfQ09ERToKLQkJcmVwbHlfY29kZSA9IHQ4MmhfcC0+cmVwbHlfY29kZTsKLQkJc3JjX3AgPSAodW5zaWduZWQgY2hhciAqKXQ4MmhfcDsKLQkJUFJJTlRLKCJIYXJkd2FyZSBlcnJvcjogVHlwZSA4MiBNZXNzYWdlIEhlYWRlcjogIgorCQlyZXBseV9jb2RlID0gZXJyaF9wLT5yZXBseV9jb2RlOworCQlzcmNfcCA9ICh1bnNpZ25lZCBjaGFyICopZXJyaF9wOworCQlQUklOVEsoIkhhcmR3YXJlIGVycm9yOiBUeXBlICUwMlggTWVzc2FnZSBIZWFkZXI6ICIKIAkJICAgICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJICAgICAgIGVycmhfcC0+dHlwZSwKIAkJICAgICAgIHNyY19wWzBdLCBzcmNfcFsxXSwgc3JjX3BbMl0sIHNyY19wWzNdLAogCQkgICAgICAgc3JjX3BbNF0sIHNyY19wWzVdLCBzcmNfcFs2XSwgc3JjX3BbN10pOwogCQlicmVhazsKQEAgLTIxMzEsNyArMjEyMSw3IEBACiAJCXNyY19wID0gcmVzcG9uc2UgKyAoaW50KXQ4NGhfcC0+bGVuIC0gc3JjX2w7CiAJCWJyZWFrOwogCWNhc2UgVFlQRTg2X1JTUF9DT0RFOgotCQlyZXBseV9jb2RlID0gdDg2bV9wLT5oZHIucmVwbHlfY29kZTsKKwkJcmVwbHlfY29kZSA9IHQ4Nm1fcC0+aGVhZGVyLnJlcGx5X2NvZGU7CiAJCWlmIChyZXBseV9jb2RlICE9IDApCiAJCQlicmVhazsKIAkJY3ByYl9wID0gKHN0cnVjdCBDUFJCICopCkBAIC0yMTQzLDYgKzIxMzMsOSBAQAogCQkJCWxlMnRvSShjcHJiX3AtPmNjcF9yc2NvZGUsICZzZXJ2aWNlX3JzKTsKIAkJCQlpZiAoKHNlcnZpY2VfcmMgPT0gOCkgJiYgKHNlcnZpY2VfcnMgPT0gNjYpKQogCQkJCQlQREVCVUcoIkJhZCBibG9jayBmb3JtYXQgb24gUENJQ0NcbiIpOworCQkJCWVsc2UgaWYgKChzZXJ2aWNlX3JjID09IDgpICYmIChzZXJ2aWNlX3JzID09IDY1KSkKKwkJCQkJUERFQlVHKCJQcm9iYWJseSBhbiBldmVuIG1vZHVsdXMgb24gIgorCQkJCQkgICAgICAgIlBDSUNDXG4iKTsKIAkJCQllbHNlIGlmICgoc2VydmljZV9yYyA9PSA4KSAmJiAoc2VydmljZV9ycyA9PSA3NzApKSB7CiAJCQkJCVBERUJVRygiSW52YWxpZCBrZXkgbGVuZ3RoIG9uIFBDSUNDXG4iKTsKIAkJCQkJdW5zZXRfZXh0X2JpdGxlbnMoKTsKQEAgLTIxNTUsNyArMjE0OCw3IEBACiAJCQkJCXJldHVybiBSRUNfVVNFX1BDSUNBOwogCQkJCX0KIAkJCQllbHNlCi0JCQkJCVBSSU5USygic2VydmljZSByYy9yczogJWQvJWRcbiIsCisJCQkJCVBSSU5USygic2VydmljZSByYy9ycyAoUENJQ0MpOiAlZC8lZFxuIiwKIAkJCQkJICAgICAgIHNlcnZpY2VfcmMsIHNlcnZpY2VfcnMpOwogCQkJCXJldHVybiBSRUNfT1BFUkFORF9JTlY7CiAJCQl9CkBAIC0yMTY5LDcgKzIxNjIsMTAgQEAKIAkJCWlmIChzZXJ2aWNlX3JjICE9IDApIHsKIAkJCQlzZXJ2aWNlX3JzID0gKGludCkgY3ByYnhfcC0+Y2NwX3JzY29kZTsKIAkJCQlpZiAoKHNlcnZpY2VfcmMgPT0gOCkgJiYgKHNlcnZpY2VfcnMgPT0gNjYpKQotCQkJCQlQREVCVUcoIkJhZCBibG9jayBmb3JtYXQgb24gUENYSUNDXG4iKTsKKwkJCQkJUERFQlVHKCJCYWQgYmxvY2sgZm9ybWF0IG9uIFBDSVhDQ1xuIik7CisJCQkJZWxzZSBpZiAoKHNlcnZpY2VfcmMgPT0gOCkgJiYgKHNlcnZpY2VfcnMgPT0gNjUpKQorCQkJCQlQREVCVUcoIlByb2JhYmx5IGFuIGV2ZW4gbW9kdWx1cyBvbiAiCisJCQkJCSAgICAgICAiUENJWENDXG4iKTsKIAkJCQllbHNlIGlmICgoc2VydmljZV9yYyA9PSA4KSAmJiAoc2VydmljZV9ycyA9PSA3NzApKSB7CiAJCQkJCVBERUJVRygiSW52YWxpZCBrZXkgbGVuZ3RoIG9uIFBDSVhDQ1xuIik7CiAJCQkJCXVuc2V0X2V4dF9iaXRsZW5zKCk7CkBAIC0yMTgyLDcgKzIxNzgsNyBAQAogCQkJCQlyZXR1cm4gUkVDX1VTRV9QQ0lDQTsKIAkJCQl9CiAJCQkJZWxzZQotCQkJCQlQUklOVEsoInNlcnZpY2UgcmMvcnM6ICVkLyVkXG4iLAorCQkJCQlQUklOVEsoInNlcnZpY2UgcmMvcnMgKFBDSVhDQyk6ICVkLyVkXG4iLAogCQkJCQkgICAgICAgc2VydmljZV9yYywgc2VydmljZV9ycyk7CiAJCQkJcmV0dXJuIFJFQ19PUEVSQU5EX0lOVjsKIAkJCX0KQEAgLTIxOTUsMjAgKzIxOTEsMjUgQEAKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgorCQlzcmNfcCA9ICh1bnNpZ25lZCBjaGFyICopZXJyaF9wOworCQlQUklOVEsoIlVucmVjb2duaXplZCBNZXNzYWdlIEhlYWRlcjogIgorCQkgICAgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkgICAgICAgc3JjX3BbMF0sIHNyY19wWzFdLCBzcmNfcFsyXSwgc3JjX3BbM10sCisJCSAgICAgICBzcmNfcFs0XSwgc3JjX3BbNV0sIHNyY19wWzZdLCBzcmNfcFs3XSk7CiAJCXJldHVybiBSRUNfQkFEX01FU1NBR0U7CiAJfQogCiAJaWYgKHJlcGx5X2NvZGUpCiAJCXN3aXRjaCAocmVwbHlfY29kZSkgewotCQljYXNlIFJFUExZX0VSUk9SX09QRVJBTkRfSU5WQUxJRDoKKwkJY2FzZSBSRVA4Ml9FUlJPUl9PUEVSQU5EX0lOVkFMSUQ6CiAJCQlyZXR1cm4gUkVDX09QRVJBTkRfSU5WOwotCQljYXNlIFJFUExZX0VSUk9SX09QRVJBTkRfU0laRToKKwkJY2FzZSBSRVA4Ml9FUlJPUl9PUEVSQU5EX1NJWkU6CiAJCQlyZXR1cm4gUkVDX09QRVJBTkRfU0laRTsKLQkJY2FzZSBSRVBMWV9FUlJPUl9FVkVOX01PRF9JTl9PUE5EOgorCQljYXNlIFJFUDgyX0VSUk9SX0VWRU5fTU9EX0lOX09QTkQ6CiAJCQlyZXR1cm4gUkVDX0VWRU5fTU9EOwotCQljYXNlIFJFUExZX0VSUk9SX01FU1NBR0VfVFlQRToKKwkJY2FzZSBSRVA4Ml9FUlJPUl9NRVNTQUdFX1RZUEU6CiAJCQlyZXR1cm4gV1JPTkdfREVWSUNFX1RZUEU7Ci0JCWNhc2UgUkVQTFlfRVJST1JfVFJBTlNQT1JUX0ZBSUw6CisJCWNhc2UgUkVQODJfRVJST1JfVFJBTlNQT1JUX0ZBSUw6CiAJCQlQUklOVEtXKCJUcmFuc3BvcnQgZmFpbGVkIChBUEZTID0gJTAyWCUwMlglMDJYJTAyWClcbiIsCiAJCQkJdDg2bV9wLT5hcGZzWzBdLCB0ODZtX3AtPmFwZnNbMV0sCiAJCQkJdDg2bV9wLT5hcGZzWzJdLCB0ODZtX3AtPmFwZnNbM10pOwpAQCAtMjIyOSw3ICsyMjMwLDcgQEAKIAlQREVCVUcoIkxlbmd0aCByZXR1cm5lZCA9ICVkXG4iLCBzcmNfbCk7CiAJdGd0X3AgPSByZXNwX2J1ZmYgKyBpY2FNc2dfcC0+b3V0cHV0ZGF0YWxlbmd0aCAtIHNyY19sOwogCW1lbWNweSh0Z3RfcCwgc3JjX3AsIHNyY19sKTsKLQlpZiAoKHQ4MmhfcC0+dHlwZSA9PSBUWVBFODZfUlNQX0NPREUpICYmIChyZXNwX2J1ZmYgPCB0Z3RfcCkpIHsKKwlpZiAoKGVycmhfcC0+dHlwZSA9PSBUWVBFODZfUlNQX0NPREUpICYmIChyZXNwX2J1ZmYgPCB0Z3RfcCkpIHsKIAkJbWVtc2V0KHJlc3BfYnVmZiwgMCwgaWNhTXNnX3AtPm91dHB1dGRhdGFsZW5ndGggLSBzcmNfbCk7CiAJCWlmIChwYWRfbXNnKHJlc3BfYnVmZiwgaWNhTXNnX3AtPm91dHB1dGRhdGFsZW5ndGgsIHNyY19sKSkKIAkJCXJldHVybiBSRUNfSU5WQUxJRF9QQUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL3o5MG1haW4uYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vejkwbWFpbi5jCmluZGV4IDllYzI5YmIuLjZhZWVmM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jcnlwdG8vejkwbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vejkwbWFpbi5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPiAgIC8vIGZvciB0YXNrbGV0cwogI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0X3VldmVudC5oPgpAQCAtMzksMTkgKzQwLDggQEAKICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSAiejkwY3J5cHQuaCIKICNpbmNsdWRlICJ6OTBjb21tb24uaCIKLSNpZm5kZWYgWjkwQ1JZUFRfVVNFX0hPVFBMVUcKLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jZW5kaWYKIAotI2RlZmluZSBWRVJTSU9OX0NPREUodmVycywgcmVsLCBzZXEpICgoKHZlcnMpPDwxNikgfCAoKHJlbCk8PDgpIHwgKHNlcSkpCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgVkVSU0lPTl9DT0RFKDIsNCwwKSAvKiB2ZXJzaW9uIDwgMi40ICovCi0jICBlcnJvciAiVGhpcyBrZXJuZWwgaXMgdG9vIG9sZDogbm90IHN1cHBvcnRlZCIKLSNlbmRpZgotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IFZFUlNJT05fQ09ERSgyLDcsMCkgLyogdmVyc2lvbiA+IDIuNiAqLwotIyAgZXJyb3IgIlRoaXMga2VybmVsIGlzIHRvbyByZWNlbnQ6IG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlIgotI2VuZGlmCi0KLSNkZWZpbmUgVkVSU0lPTl9aOTBNQUlOX0MgIiRSZXZpc2lvbjogMS41NyAkIgorI2RlZmluZSBWRVJTSU9OX1o5ME1BSU5fQyAiJFJldmlzaW9uOiAxLjYyICQiCiAKIHN0YXRpYyBjaGFyIHo5MG1haW5fdmVyc2lvbltdIF9faW5pdGRhdGEgPQogCSJ6OTBtYWluLm8gKCIgVkVSU0lPTl9aOTBNQUlOX0MgIi8iCkBAIC02MywyMSArNTMsMTIgQEAKICAqIERlZmF1bHRzIHRoYXQgbWF5IGJlIG1vZGlmaWVkLgogICovCiAKLSNpZm5kZWYgWjkwQ1JZUFRfVVNFX0hPVFBMVUcKIC8qKgogICogWW91IGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50IG1pbm9yIGF0IGNvbXBpbGUgdGltZS4KICAqLwogI2lmbmRlZiBaOTBDUllQVF9NSU5PUgogI2RlZmluZSBaOTBDUllQVF9NSU5PUglNSVNDX0RZTkFNSUNfTUlOT1IKICNlbmRpZgotI2Vsc2UKLS8qKgotICogWW91IGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50IG1ham9yIGF0IGNvbXBpbGUgdGltZS4KLSAqLwotI2lmbmRlZiBaOTBDUllQVF9NQUpPUgotI2RlZmluZSBaOTBDUllQVF9NQUpPUgkwCi0jZW5kaWYKLSNlbmRpZgogCiAvKioKICAqIFlvdSBjYW4gc3BlY2lmeSBhIGRpZmZlcmVudCBkb21haW4gYXQgY29tcGlsZSB0aW1lIG9yIG9uIHRoZSBpbnNtb2QKQEAgLTk3LDcgKzc4LDcgQEAKICAqIG9sZGVyIHRoYW4gQ0xFQU5VUFRJTUUgc2Vjb25kcyBpbiB0aGUgcGFzdC4KICAqLwogI2lmbmRlZiBDTEVBTlVQVElNRQotI2RlZmluZSBDTEVBTlVQVElNRSAyMAorI2RlZmluZSBDTEVBTlVQVElNRSAxNQogI2VuZGlmCiAKIC8qKgpAQCAtMjk4LDYgKzI3OSwxMCBAQAogICogaXQgY29udGFpbnMgdGhlIHJlcXVlc3Q7IGF0IFJFQUQsIHRoZSByZXNwb25zZS4gVGhlIGZ1bmN0aW9uCiAgKiBzZW5kX3RvX2NyeXB0b19kZXZpY2UgY29udmVydHMgdGhlIHJlcXVlc3QgdG8gZGV2aWNlLWRlcGVuZGVudAogICogZm9ybSBhbmQgdXNlIHRoZSBjYWxsZXIncyBPUEVOLWFsbG9jYXRlZCBidWZmZXIgZm9yIHRoZSByZXNwb25zZS4KKyAqCisgKiBGb3IgdGhlIGNvbnRlbnRzIG9mIGNhbGxlcl9kZXZfZGVwX3JlcSBhbmQgY2FsbGVyX2Rldl9kZXBfcmVxX3AKKyAqIGJlY2F1c2UgdGhhdCBwb2ludHMgdG8gaXQsIHNlZSB0aGUgZGlzY3Vzc2lvbiBpbiB6OTBoYXJkd2FyZS5jLgorICogU2VhcmNoIGZvciAiZXh0ZW5kZWQgcmVxdWVzdCBtZXNzYWdlIGJsb2NrIi4KICAqLwogc3RydWN0IGNhbGxlciB7CiAJaW50CQkgY2FsbGVyX2J1Zl9sOwkJIC8vIGxlbmd0aCBvZiBvcmlnaW5hbCByZXF1ZXN0CkBAIC0zOTgsMjQgKzM4Myw5IEBACiAJCQkJIHVuc2lnbmVkIGxvbmcsIHZvaWQgKik7CiAKIC8qKgotICogSG90cGx1ZyBzdXBwb3J0Ci0gKi8KLQotI2lmZGVmIFo5MENSWVBUX1VTRV9IT1RQTFVHCi0jZGVmaW5lIFo5MENSWVBUX0hPVFBMVUdfQURECSAxCi0jZGVmaW5lIFo5MENSWVBUX0hPVFBMVUdfUkVNT1ZFCSAyCi0KLXN0YXRpYyB2b2lkIHo5MGNyeXB0X2hvdHBsdWdfZXZlbnQoaW50LCBpbnQsIGludCk7Ci0jZW5kaWYKLQotLyoqCiAgKiBTdG9yYWdlIGFsbG9jYXRlZCBhdCBpbml0aWFsaXphdGlvbiBhbmQgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWZlIG9mCiAgKiB0aGlzIGluc21vZAogICovCi0jaWZkZWYgWjkwQ1JZUFRfVVNFX0hPVFBMVUcKLXN0YXRpYyBpbnQgejkwY3J5cHRfbWFqb3IgPSBaOTBDUllQVF9NQUpPUjsKLSNlbmRpZgotCiBzdGF0aWMgaW50IGRvbWFpbiA9IERPTUFJTl9JTkRFWDsKIHN0YXRpYyBzdHJ1Y3QgejkwY3J5cHQgejkwY3J5cHQ7CiBzdGF0aWMgaW50IHF1aWVzY2VfejkwY3J5cHQ7CkBAIC00NDQsMTQgKzQxNCwxMiBAQAogCS5yZWxlYXNlCT0gejkwY3J5cHRfcmVsZWFzZQogfTsKIAotI2lmbmRlZiBaOTBDUllQVF9VU0VfSE9UUExVRwogc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHo5MGNyeXB0X21pc2NfZGV2aWNlID0gewogCS5taW5vcgkgICAgPSBaOTBDUllQVF9NSU5PUiwKIAkubmFtZQkgICAgPSBERVZfTkFNRSwKIAkuZm9wcwkgICAgPSAmejkwY3J5cHRfZm9wcywKIAkuZGV2ZnNfbmFtZSA9IERFVl9OQU1FCiB9OwotI2VuZGlmCiAKIC8qKgogICogRG9jdW1lbnRhdGlvbiB2YWx1ZXMuCkBAIC02MDMsNyArNTcxLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0jaWZuZGVmIFo5MENSWVBUX1VTRV9IT1RQTFVHCiAJLyogUmVnaXN0ZXIgYXMgbWlzYyBkZXZpY2Ugd2l0aCBnaXZlbiBtaW5vciAob3IgZ2V0IGEgZHluYW1pYyBvbmUpLiAqLwogCXJlc3VsdCA9IG1pc2NfcmVnaXN0ZXIoJno5MGNyeXB0X21pc2NfZGV2aWNlKTsKIAlpZiAocmVzdWx0IDwgMCkgewpAQCAtNjExLDE4ICs1NzgsNiBAQAogCQkJejkwY3J5cHRfbWlzY19kZXZpY2UubWlub3IsIHJlc3VsdCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQotI2Vsc2UKLQkvKiBSZWdpc3RlciB0aGUgbWFqb3IgKG9yIGdldCBhIGR5bmFtaWMgb25lKS4gKi8KLQlyZXN1bHQgPSByZWdpc3Rlcl9jaHJkZXYoejkwY3J5cHRfbWFqb3IsIFJFR19OQU1FLCAmejkwY3J5cHRfZm9wcyk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJUFJJTlRLVygicmVnaXN0ZXJfY2hyZGV2IChtYWpvciAlZCkgZmFpbGVkIHdpdGggJWQuXG4iLAotCQkJejkwY3J5cHRfbWFqb3IsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JaWYgKHo5MGNyeXB0X21ham9yID09IDApCi0JCXo5MGNyeXB0X21ham9yID0gcmVzdWx0OwotI2VuZGlmCiAKIAlQREVCVUcoIlJlZ2lzdGVyZWQgIiBERVZfTkFNRSAiIHdpdGggcmVzdWx0ICVkXG4iLCByZXN1bHQpOwogCkBAIC02NDUsMTEgKzYwMCw2IEBACiAJfSBlbHNlCiAJCVBSSU5USygiTm8gZGV2aWNlcyBhdCBzdGFydHVwXG4iKTsKIAotI2lmZGVmIFo5MENSWVBUX1VTRV9IT1RQTFVHCi0JLyogZ2VuZXJhdGUgaG90cGx1ZyBldmVudCBmb3IgZGV2aWNlIG5vZGUgZ2VuZXJhdGlvbiAqLwotCXo5MGNyeXB0X2hvdHBsdWdfZXZlbnQoejkwY3J5cHRfbWFqb3IsIDAsIFo5MENSWVBUX0hPVFBMVUdfQUREKTsKLSNlbmRpZgotCiAJLyogSW5pdGlhbGl6ZSBnbG9iYWxzLiAqLwogCXNwaW5fbG9ja19pbml0KCZxdWV1ZXNwaW5sb2NrKTsKIApAQCAtNzAxLDE3ICs2NTEsMTAgQEAKIAlyZXR1cm4gMDsgLy8gc3VjY2VzcwogCiBpbml0X21vZHVsZV9jbGVhbnVwOgotI2lmbmRlZiBaOTBDUllQVF9VU0VfSE9UUExVRwogCWlmICgobnJlc3VsdCA9IG1pc2NfZGVyZWdpc3RlcigmejkwY3J5cHRfbWlzY19kZXZpY2UpKSkKIAkJUFJJTlRLKCJtaXNjX2RlcmVnaXN0ZXIgZmFpbGVkIHdpdGggJWQuXG4iLCBucmVzdWx0KTsKIAllbHNlCiAJCVBERUJVRygibWlzY19kZXJlZ2lzdGVyIHN1Y2Nlc3NmdWwuXG4iKTsKLSNlbHNlCi0JaWYgKChucmVzdWx0ID0gdW5yZWdpc3Rlcl9jaHJkZXYoejkwY3J5cHRfbWFqb3IsIFJFR19OQU1FKSkpCi0JCVBSSU5USygidW5yZWdpc3Rlcl9jaHJkZXYgZmFpbGVkIHdpdGggJWQuXG4iLCBucmVzdWx0KTsKLQllbHNlCi0JCVBERUJVRygidW5yZWdpc3Rlcl9jaHJkZXYgc3VjY2Vzc2Z1bC5cbiIpOwotI2VuZGlmCiAKIAlyZXR1cm4gcmVzdWx0OyAvLyBmYWlsdXJlCiB9CkBAIC03MjgsMTkgKzY3MSwxMCBAQAogCiAJcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci96OTBjcnlwdCIsIDApOwogCi0jaWZuZGVmIFo5MENSWVBUX1VTRV9IT1RQTFVHCiAJaWYgKChucmVzdWx0ID0gbWlzY19kZXJlZ2lzdGVyKCZ6OTBjcnlwdF9taXNjX2RldmljZSkpKQogCQlQUklOVEsoIm1pc2NfZGVyZWdpc3RlciBmYWlsZWQgd2l0aCAlZC5cbiIsIG5yZXN1bHQpOwogCWVsc2UKIAkJUERFQlVHKCJtaXNjX2RlcmVnaXN0ZXIgc3VjY2Vzc2Z1bC5cbiIpOwotI2Vsc2UKLQl6OTBjcnlwdF9ob3RwbHVnX2V2ZW50KHo5MGNyeXB0X21ham9yLCAwLCBaOTBDUllQVF9IT1RQTFVHX1JFTU9WRSk7Ci0KLQlpZiAoKG5yZXN1bHQgPSB1bnJlZ2lzdGVyX2NocmRldih6OTBjcnlwdF9tYWpvciwgUkVHX05BTUUpKSkKLQkJUFJJTlRLKCJ1bnJlZ2lzdGVyX2NocmRldiBmYWlsZWQgd2l0aCAlZC5cbiIsIG5yZXN1bHQpOwotCWVsc2UKLQkJUERFQlVHKCJ1bnJlZ2lzdGVyX2NocmRldiBzdWNjZXNzZnVsLlxuIik7Ci0jZW5kaWYKIAogCS8qIFJlbW92ZSB0aGUgdGFza3MgKi8KIAl0YXNrbGV0X2tpbGwoJnJlYWRlcl90YXNrbGV0KTsKQEAgLTc0OCw2ICs2ODIsOSBAQAogCWRlbF90aW1lcigmY29uZmlnX3RpbWVyKTsKIAlkZWxfdGltZXIoJmNsZWFudXBfdGltZXIpOwogCisJaWYgKHo5MF9kZXZpY2Vfd29yaykKKwkJZGVzdHJveV93b3JrcXVldWUoejkwX2RldmljZV93b3JrKTsKKwogCWRlc3Ryb3lfejkwY3J5cHQoKTsKIAogCVBSSU5US04oIlVubG9hZGVkLlxuIik7CkBAIC03NjYsOCArNzAzLDYgQEAKICAqICAgICB6OTBjcnlwdF9zdGF0dXNfd3JpdGUKICAqCSBkaXNhYmxlX2NhcmQKICAqCSBlbmFibGVfY2FyZAotICoJIHNjYW5fY2hhcgotICoJIHNjYW5fc3RyaW5nCiAgKgogICogSGVscGVyIGZ1bmN0aW9uczoKICAqICAgICB6OTBjcnlwdF9yc2EKQEAgLTEwNTcsOSArOTkyLDEwIEBACiAgKiBUaGUgTUNMIG11c3QgYmUgYXBwbGllZCBhbmQgdGhlIG5ld2VyIGJpdGxlbmd0aHMgZW5hYmxlZCBmb3IgdGhlc2UgdG8gd29yay4KICAqCiAgKiBDYXJkIFR5cGUgICAgT2xkIGxpbWl0ICAgIE5ldyBsaW1pdAorICogUENJQ0EgICAgICAgICAgPz8tMjA0OCAgICAgc2FtZSAodGhlIGxvd2VyIGxpbWl0IGlzIGxlc3MgdGhhbiAxMjggYml0Li4uKQogICogUENJQ0MgICAgICAgICA1MTItMTAyNCAgICAgNTEyLTIwNDgKLSAqIFBDSVhDQ19NQ0wyICAgNTEyLTIwNDggICAgIG5vIGNoYW5nZSAoYXBwbHlpbmcgdGhpcyBNQ0wgPT0gY2FyZCBpcyBNQ0wzKykKLSAqIFBDSVhDQ19NQ0wzICAgNTEyLTIwNDggICAgIDEyOC0yMDQ4CisgKiBQQ0lYQ0NfTUNMMiAgIDUxMi0yMDQ4ICAgICAtLS0tLSAoYXBwbHlpbmcgYW55IEdBIExJQyB3aWxsIG1ha2UgYW4gTUNMMyBjYXJkKQorICogUENJWENDX01DTDMgICAtLS0tLSAgICAgICAgMTI4LTIwNDgKICAqIENFWDJDICAgICAgICAgNTEyLTIwNDggICAgIDEyOC0yMDQ4CiAgKgogICogZXh0X2JpdGxlbnMgKGV4dGVuZGVkIGJpdGxlbmd0aHMpIGlzIGEgZ2xvYmFsLCBzaW5jZSB5b3Ugc2hvdWxkIG5vdCBhcHBseSBhbgpAQCAtMTEwNCw3ICsxMDQwLDcgQEAKIAlpZiAoUENJQ0FfYXZhaWwgfHwgUENJWENDX01DTDNfYXZhaWwgfHwgQ0VYMkNfYXZhaWwpIHsKIAkJLyoqCiAJCSAqIGJpdGxlbmd0aCBpcyBhIGZhY3RvciwgUENJQ0EgaXMgdGhlIG1vc3QgY2FwYWJsZSwgZXZlbiB3aXRoCi0JCSAqIHRoZSBuZXcgTUNMLgorCQkgKiB0aGUgbmV3IE1DTCBmb3IgUENJWENDLgogCQkgKi8KIAkJaWYgKChieXRlbGVuZ3RoIDwgUENJWENDX01JTl9NT0RfU0laRSkgfHwKIAkJICAgICghZXh0X2JpdGxlbnMgJiYgKGJ5dGVsZW5ndGggPCBPTERfUENJWENDX01JTl9NT0RfU0laRSkpKSB7CkBAIC0yMTQ0LDczICsyMDgwLDE1IEBACiAJejkwY3J5cHQuaGR3YXJlX2luZm8tPnR5cGVfbWFza1tkZXZwLT5kZXZfdHlwZV0udXNlcl9kaXNhYmxlZF9jb3VudC0tOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotc2Nhbl9jaGFyKHVuc2lnbmVkIGNoYXIgKmJmLCB1bnNpZ25lZCBpbnQgbGVuLAotCSAgdW5zaWduZWQgaW50ICpvZmZzLCB1bnNpZ25lZCBpbnQgKnBfZW9mLCB1bnNpZ25lZCBjaGFyIGMpCi17Ci0JdW5zaWduZWQgaW50IGksIGZvdW5kOwotCi0JZm91bmQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlpZiAoYmZbaV0gPT0gYykgewotCQkJZm91bmQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGJmW2ldID09ICdcMCcpIHsKLQkJCSpwX2VvZiA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYmZbaV0gPT0gJ1xuJykgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JKm9mZnMgPSBpKzE7Ci0JcmV0dXJuIGZvdW5kOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotc2Nhbl9zdHJpbmcodW5zaWduZWQgY2hhciAqYmYsIHVuc2lnbmVkIGludCBsZW4sCi0JICAgIHVuc2lnbmVkIGludCAqb2ZmcywgdW5zaWduZWQgaW50ICpwX2VvZiwgdW5zaWduZWQgY2hhciAqcykKLXsKLQl1bnNpZ25lZCBpbnQgdGVtcF9sZW4sIHRlbXBfb2ZmcywgZm91bmQsIGVvZjsKLQotCXRlbXBfbGVuID0gdGVtcF9vZmZzID0gZm91bmQgPSBlb2YgPSAwOwotCXdoaWxlICghZW9mICYmICFmb3VuZCkgewotCQlmb3VuZCA9IHNjYW5fY2hhcihiZit0ZW1wX2xlbiwgbGVuLXRlbXBfbGVuLAotCQkJCSAgJnRlbXBfb2ZmcywgJmVvZiwgKnMpOwotCi0JCXRlbXBfbGVuICs9IHRlbXBfb2ZmczsKLQkJaWYgKGVvZikgewotCQkJZm91bmQgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoZm91bmQpIHsKLQkJCWlmIChsZW4gPj0gdGVtcF9vZmZzK3N0cmxlbihzKSkgewotCQkJCWZvdW5kID0gIXN0cm5jbXAoYmYrdGVtcF9sZW4tMSwgcywgc3RybGVuKHMpKTsKLQkJCQlpZiAoZm91bmQpIHsKLQkJCQkJKm9mZnMgPSB0ZW1wX2xlbitzdHJsZW4ocyktMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3VuZCA9IDA7Ci0JCQkJKnBfZW9mID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gZm91bmQ7Ci19Ci0KIHN0YXRpYyBpbnQKIHo5MGNyeXB0X3N0YXR1c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKIHsKLQlpbnQgaSwgaiwgbGVuLCBvZmZzLCBmb3VuZCwgZW9mOwotCXVuc2lnbmVkIGNoYXIgKmxidWY7CisJaW50IGosIGVvbDsKKwl1bnNpZ25lZCBjaGFyICpsYnVmLCAqcHRyOwogCXVuc2lnbmVkIGludCBsb2NhbF9jb3VudDsKIAotI2RlZmluZSBMQlVGU0laRSA2MDAKKyNkZWZpbmUgTEJVRlNJWkUgMTIwMAogCWxidWYgPSBrbWFsbG9jKExCVUZTSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxidWYpIHsKIAkJUFJJTlRLKCJrbWFsbG9jIGZhaWxlZCFcbiIpOwpAQCAtMjIyNyw0OSArMjEwNSw0NiBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlsYnVmW2xvY2FsX2NvdW50LTFdID0gJ1wwJzsKKwlsYnVmW2xvY2FsX2NvdW50XSA9ICdcMCc7CiAKLQlsZW4gPSAwOwotCWVvZiA9IDA7Ci0JZm91bmQgPSAwOwotCXdoaWxlICghZW9mKSB7Ci0JCWZvdW5kID0gc2Nhbl9zdHJpbmcobGJ1ZitsZW4sIGxvY2FsX2NvdW50LWxlbiwgJm9mZnMsICZlb2YsCi0JCQkJICAgICJPbmxpbmUgZGV2aWNlcyIpOwotCQlsZW4gKz0gb2ZmczsKLQkJaWYgKGZvdW5kID09IDEpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoZW9mKSB7CisJcHRyID0gc3Ryc3RyKGxidWYsICJPbmxpbmUgZGV2aWNlcyIpOworCWlmIChwdHIgPT0gMCkgeworCQlQUklOVEsoIlVuYWJsZSB0byBwYXJzZSBkYXRhIChtaXNzaW5nIFwiT25saW5lIGRldmljZXNcIilcbiIpOwogCQlrZnJlZShsYnVmKTsKIAkJcmV0dXJuIGNvdW50OwogCX0KIAotCWlmIChmb3VuZCkKLQkJZm91bmQgPSBzY2FuX2NoYXIobGJ1ZitsZW4sIGxvY2FsX2NvdW50LWxlbiwgJm9mZnMsICZlb2YsICdcbicpOworCXB0ciA9IHN0cnN0cihwdHIsICJcbiIpOworCWlmIChwdHIgPT0gMCkgeworCQlQUklOVEsoIlVuYWJsZSB0byBwYXJzZSBkYXRhIChtaXNzaW5nIG5ld2xpbmUgYWZ0ZXIgXCJPbmxpbmUgZGV2aWNlc1wiKVxuIik7CisJCWtmcmVlKGxidWYpOworCQlyZXR1cm4gY291bnQ7CisJfQorCXB0cisrOwogCi0JaWYgKCFmb3VuZCB8fCBlb2YpIHsKKwlpZiAoc3Ryc3RyKHB0ciwgIldhaXRpbmcgd29yayBlbGVtZW50IGNvdW50cyIpID09IE5VTEwpIHsKKwkJUFJJTlRLKCJVbmFibGUgdG8gcGFyc2UgZGF0YSAobWlzc2luZyBcIldhaXRpbmcgd29yayBlbGVtZW50IGNvdW50c1wiKVxuIik7CiAJCWtmcmVlKGxidWYpOwogCQlyZXR1cm4gY291bnQ7CiAJfQogCi0JbGVuICs9IG9mZnM7CiAJaiA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IDgwOyBpKyspIHsKLQkJc3dpdGNoICgqKGxidWYrbGVuK2kpKSB7CisJZW9sID0gMDsKKwl3aGlsZSAoKGogPCA2NCkgJiYgKCpwdHIgIT0gJ1wwJykpIHsKKwkJc3dpdGNoICgqcHRyKSB7CiAJCWNhc2UgJ1x0JzoKIAkJY2FzZSAnICc6CiAJCQlicmVhazsKIAkJY2FzZSAnXG4nOgogCQlkZWZhdWx0OgotCQkJZW9mID0gMTsKKwkJCWVvbCA9IDE7CiAJCQlicmVhazsKLQkJY2FzZSAnMCc6Ci0JCWNhc2UgJzEnOgotCQljYXNlICcyJzoKLQkJY2FzZSAnMyc6Ci0JCWNhc2UgJzQnOgotCQljYXNlICc1JzoKKwkJY2FzZSAnMCc6CS8vIG5vIGRldmljZQorCQljYXNlICcxJzoJLy8gUENJQ0EKKwkJY2FzZSAnMic6CS8vIFBDSUNDCisJCWNhc2UgJzMnOgkvLyBQQ0lYQ0NfTUNMMgorCQljYXNlICc0JzoJLy8gUENJWENDX01DTDMKKwkJY2FzZSAnNSc6CS8vIENFWDJDCiAJCQlqKys7CiAJCQlicmVhazsKIAkJY2FzZSAnZCc6CkBAIC0yMjgzLDggKzIxNTgsOSBAQAogCQkJaisrOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKGVvZikKKwkJaWYgKGVvbCkKIAkJCWJyZWFrOworCQlwdHIrKzsKIAl9CiAKIAlrZnJlZShsYnVmKTsKQEAgLTM0NzksNDUgKzMzNTUsNSBAQAogCXJldHVybiBydjsKIH0KIAotI2lmZGVmIFo5MENSWVBUX1VTRV9IT1RQTFVHCi1zdGF0aWMgdm9pZAotejkwY3J5cHRfaG90cGx1Z19ldmVudChpbnQgZGV2X21ham9yLCBpbnQgZGV2X21pbm9yLCBpbnQgYWN0aW9uKQotewotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0JY2hhciAqYXJndlszXTsKLQljaGFyICplbnZwWzZdOwotCWNoYXIgIG1ham9yWzIwXTsKLQljaGFyICBtaW5vclsyMF07Ci0KLQlzcHJpbnRmKG1ham9yLCAiTUFKT1I9JWQiLCBkZXZfbWFqb3IpOwotCXNwcmludGYobWlub3IsICJNSU5PUj0lZCIsIGRldl9taW5vcik7Ci0KLQlhcmd2WzBdID0gaG90cGx1Z19wYXRoOwotCWFyZ3ZbMV0gPSAiejkwY3J5cHQiOwotCWFyZ3ZbMl0gPSAwOwotCi0JZW52cFswXSA9ICJIT01FPS8iOwotCWVudnBbMV0gPSAiUEFUSD0vc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbiI7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgWjkwQ1JZUFRfSE9UUExVR19BREQ6Ci0JCWVudnBbMl0gPSAiQUNUSU9OPWFkZCI7Ci0JCWJyZWFrOwotCWNhc2UgWjkwQ1JZUFRfSE9UUExVR19SRU1PVkU6Ci0JCWVudnBbMl0gPSAiQUNUSU9OPXJlbW92ZSI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlicmVhazsKLQl9Ci0JZW52cFszXSA9IG1ham9yOwotCWVudnBbNF0gPSBtaW5vcjsKLQllbnZwWzVdID0gMDsKLQotCWNhbGxfdXNlcm1vZGVoZWxwZXIoYXJndlswXSwgYXJndiwgZW52cCwgMCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCiBtb2R1bGVfaW5pdCh6OTBjcnlwdF9pbml0X21vZHVsZSk7CiBtb2R1bGVfZXhpdCh6OTBjcnlwdF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYyBiL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jCmluZGV4IDI0YzBhZjQuLjMwOTI0NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jCkBAIC0yLDkgKzIsOSBAQAogICogIGRyaXZlcnMvczM5MC9uZXQvY2xhdy5jCiAgKiAgICBFU0NPTiBDTEFXIG5ldHdvcmsgZHJpdmVyCiAgKgotICogICAgJFJldmlzaW9uOiAxLjM1ICQgJERhdGU6IDIwMDUvMDMvMjQgMTI6MjU6MzggJAorICogICAgJFJldmlzaW9uOiAxLjM4ICQgJERhdGU6IDIwMDUvMDgvMjkgMDk6NDc6MDQgJAogICoKLSAqICBMaW51eCBmbyB6U2VyaWVzIHZlcnNpb24KKyAqICBMaW51eCBmb3IgelNlcmllcyB2ZXJzaW9uCiAgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNSBJQk0gQ29ycG9yYXRpb24KICAqICBBdXRob3IocykgT3JpZ2luYWwgY29kZSB3cml0dGVuIGJ5OgogICogICAgICAgICAgICAgIEthenVvIElpbXVyYSAoaWltdXJhQGpwLmlibS5jb20pCkBAIC00MzEsMTIgKzQzMSwxMiBAQAogCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZwX2NoLT5jb2xsZWN0X3F1ZXVlKSkgewogCS8qIHNvbWUgZGF0YSAqLwogCQloZWxkX3NrYiA9IHNrYl9kZXF1ZXVlKCZwX2NoLT5jb2xsZWN0X3F1ZXVlKTsKLQkJaWYgKHBfZW52LT5wYWNraW5nICE9IERPX1BBQ0tFRCkKLQkJCXJldHVybiBoZWxkX3NrYjsKIAkJaWYgKGhlbGRfc2tiKQotCQkJYXRvbWljX2RlYygmaGVsZF9za2ItPnVzZXJzKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KGhlbGRfc2tiKTsKIAkJZWxzZQogCQkJcmV0dXJuIE5VTEw7CisJCWlmIChwX2Vudi0+cGFja2luZyAhPSBET19QQUNLRUQpCisJCQlyZXR1cm4gaGVsZF9za2I7CiAJCS8qIGdldCBhIG5ldyBTS0Igd2Ugd2lsbCBwYWNrIGF0IGxlYXN0IG9uZSAqLwogCQluZXdfc2tiID0gZGV2X2FsbG9jX3NrYihwX2Vudi0+d3JpdGVfc2l6ZSk7CiAJCWlmIChuZXdfc2tiID09IE5VTEwpIHsKQEAgLTQ1NSw3ICs0NTUsNyBAQAogCQkJCXByaXZwdHItPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJCQlzb19mYXIgKz0gaGVsZF9za2ItPmxlbjsKIAkJCQlwa3RfY250Kys7Ci0JCQkJZGV2X2tmcmVlX3NrYl9pcnEoaGVsZF9za2IpOworCQkJCWRldl9rZnJlZV9za2JfYW55KGhlbGRfc2tiKTsKIAkJCQloZWxkX3NrYiA9IHNrYl9kZXF1ZXVlKCZwX2NoLT5jb2xsZWN0X3F1ZXVlKTsKIAkJCQlpZiAoaGVsZF9za2IpCiAJCQkJCWF0b21pY19kZWMoJmhlbGRfc2tiLT51c2Vycyk7CkBAIC0xMDkyLDcgKzEwOTIsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQogCWlmIChwcml2cHRyLT5wa19za2IgIT0gTlVMTCkgewotCQlkZXZfa2ZyZWVfc2tiKHByaXZwdHItPnBrX3NrYik7CisJCWRldl9rZnJlZV9za2JfYW55KHByaXZwdHItPnBrX3NrYik7CiAJCXByaXZwdHItPnBrX3NrYiA9IE5VTEw7CiAJfQogCWlmKHByaXZwdHItPmJ1ZmZzX2FsbG9jICE9IDEpIHsKQEAgLTIwMTYsNyArMjAxNiw3IEBACiAgICAgICAgIHBfYnVmPShzdHJ1Y3QgY2N3YmsqKXByaXZwdHItPnBfZW5kX2NjdzsKICAgICAgICAgZHVtcGl0KChjaGFyICopcF9idWYsIHNpemVvZihzdHJ1Y3QgZW5kY2N3KSk7CiAjZW5kaWYKLSAgICAgICAgZGV2X2tmcmVlX3NrYihza2IpOworICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCWlmIChsaW5raWQ9PTApIHsKICAgICAgICAgCWxvY2s9TE9DS19OTzsKICAgICAgICAgfQpAQCAtNDA2MSw3ICs0MDYxLDcgQEAKIAogICAgICAgICB3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKHEpKSkgewogICAgICAgICAgICAgICAgIGF0b21pY19kZWMoJnNrYi0+dXNlcnMpOwotICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfaXJxKHNrYik7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKICAgICAgICAgfQogfQogCkBAIC00NDEwLDcgKzQ0MTAsNyBAQAogI2Vsc2UKICAgICAgICAgICAgICAgICAiY29tcGlsZWQgaW50byBrZXJuZWwgIgogI2VuZGlmCi0gICAgICAgICAgICAgICAgIiAkUmV2aXNpb246IDEuMzUgJCAkRGF0ZTogMjAwNS8wMy8yNCAxMjoyNTozOCAkIFxuIik7CisgICAgICAgICAgICAgICAgIiAkUmV2aXNpb246IDEuMzggJCAkRGF0ZTogMjAwNS8wOC8yOSAwOTo0NzowNCAkIFxuIik7CiAKIAogI2lmZGVmIEZVTkNUUkFDRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3MzOTBtYWNoLmMgYi9kcml2ZXJzL3MzOTAvczM5MG1hY2guYwppbmRleCA1YmIyNTVlLi40MTkxZmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvczM5MG1hY2guYworKysgYi9kcml2ZXJzL3MzOTAvczM5MG1hY2guYwpAQCAtMjQwLDcgKzI0MCw3IEBACiAJCQkgKiBGbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVyIGNhbid0IGJlIHJlc3RvcmVkLgogCQkJICogVGFzayB3aWxsIGJlIHRlcm1pbmF0ZWQuCiAJCQkgKi8KLQkJCWFzbSB2b2xhdGlsZSAoImxmcGMgMCglMCkiIDogOiAiYSIgKCZ6ZXJvKSk7CisJCQlhc20gdm9sYXRpbGUgKCJsZnBjIDAoJTApIiA6IDogImEiICgmemVybyksICJtIiAoemVybykpOwogCQkJa2lsbF90YXNrID0gMTsKIAogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9zYnVzL2NoYXIvS2NvbmZpZwppbmRleCBhNDE3NzhhLi4zYTgxNTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL0tjb25maWcKQEAgLTY5LDExICs2OSw0MCBAQAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gYm9vdCBmcm9tIHlvdXIgSmF2YVN0YXRpb24ncwogCSAgRmxhc2ggbWVtb3J5LgogCi0jIFhYWCBXaHkgZG9uJ3Qgd2UgZG8gInNvdXJjZSBkcml2ZXJzL2NoYXIvQ29uZmlnLmluIiBzb21ld2hlcmU/Ci0jIG5vIHNoaXQKLWNvbmZpZyBSVEMKLQl0cmlzdGF0ZSAiUEMtc3R5bGUgUmVhbCBUaW1lIENsb2NrIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgRVhQRVJJTUVOVEFMICYmIFNQQVJDMzIKK2NvbmZpZyBCQkNfSTJDCisJdHJpc3RhdGUgIlVsdHJhU1BBUkMtSUlJIGJvb3RidXMgaTJjIGNvbnRyb2xsZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gUENJICYmIFNQQVJDNjQKKwloZWxwCisJICBUaGUgQkJDIGRldmljZXMgb24gdGhlIFVsdHJhU1BBUkMgSUlJIGhhdmUgdHdvIEkyQyBjb250cm9sbGVycy4gIFRoZQorCSAgZmlyc3QgSTJDIGNvbnRyb2xsZXIgY29ubmVjdHMgbWFpbmx5IHRvIGNvbmZpZ3VyYXRpb24gUFJPTXMgKE5WUkFNLAorCSAgQ1BVIGNvbmZpZ3VyYXRpb24sIERJTU0gdHlwZXMsIGV0Yy4pLiAgVGhlIHNlY29uZCBJMkMgY29udHJvbGxlcgorCSAgY29ubmVjdHMgdG8gZW52aXJvbm1lbnRhbCBjb250cm9sIGRldmljZXMgc3VjaCBhcyBmYW5zIGFuZAorCSAgdGVtcGVyYXR1cmUgc2Vuc29ycy4gIFRoZSBzZWNvbmQgY29udHJvbGxlciBhbHNvIGNvbm5lY3RzIHRvIHRoZQorCSAgc21hcnRjYXJkIHJlYWRlciwgaWYgcHJlc2VudC4gIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGVzZS4KKworY29uZmlnIEVOVkNUUkwKKwl0cmlzdGF0ZSAiU1VOVywgZW52Y3RybCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNQQVJDNjQKKwloZWxwCisJICBLZXJuZWwgc3VwcG9ydCBmb3IgdGVtcGVyYXR1cmUgYW5kIGZhbiBtb25pdG9yaW5nIG9uIFN1biBTTUUKKwkgIG1hY2hpbmVzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlbnZjdHJsLgorCitjb25maWcgRElTUExBWTdTRUcKKwl0cmlzdGF0ZSAiNy1TZWdtZW50IERpc3BsYXkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTUEFSQzY0CisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgNy1zZWdtZW50IGRpc3BsYXkgYW5kIExFRCBwcmVzZW50IG9uCisJICBTdW4gTWljcm9zeXN0ZW1zIENvbXBhY3RQQ0kgbW9kZWxzIENQMTQwMCBhbmQgQ1AxNTAwLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkaXNwbGF5N3NlZy4KKworCSAgSWYgeW91IGRvIG5vdCBoYXZlIGEgQ29tcGFjdFBDSSBtb2RlbCBDUDE0MDAgb3IgQ1AxNTAwLCBvcgorCSAgYW5vdGhlciBVbHRyYVNQQVJDLUlJaS1jRW5naW5lIGJvYXJkc2V0IHdpdGggYSA3LXNlZ21lbnQgZGlzcGxheSwKKwkgIHlvdSBzaG91bGQgc2F5IE4gdG8gdGhpcyBvcHRpb24uCiAKIGVuZG1lbnUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvYXVyb3JhLmMgYi9kcml2ZXJzL3NidXMvY2hhci9hdXJvcmEuYwppbmRleCBkOTZjYzQ3Li42NzJmOWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9hdXJvcmEuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9hdXJvcmEuYwpAQCAtODcxLDggKzg3MSw3IEBACiAjaWZkZWYgQVVST1JBX0lOVF9ERUJVRwogc3RhdGljIHZvaWQgYXVyb3JhX3RpbWVyICh1bnNpZ25lZCBsb25nIGlnbm9yZWQpOwogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgYXVyb3JhX3BvbGxfdGltZXIgPQotCQkJVElNRVJfSU5JVElBTElaRVIoYXVyb3JhX3RpbWVyLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoYXVyb3JhX3BvbGxfdGltZXIsIGF1cm9yYV90aW1lciwgMCwgMCk7CiAKIHN0YXRpYyB2b2lkCiBhdXJvcmFfdGltZXIgKHVuc2lnbmVkIGxvbmcgaWdub3JlZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19lbnZjdHJsLmMgYi9kcml2ZXJzL3NidXMvY2hhci9iYmNfZW52Y3RybC5jCmluZGV4IGQ0NDIwNWQuLmQ4OWY4M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19lbnZjdHJsLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2VudmN0cmwuYwpAQCAtNSw2ICs1LDcgQEAKICAqLwogCiAjZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KK3N0YXRpYyBpbnQgZXJybm87CiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CkBAIC0xMyw4ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vZWJ1cy5oPgotc3RhdGljIGludCBlcnJubzsKLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKICNpbmNsdWRlICJiYmNfaTJjLmgiCiAjaW5jbHVkZSAibWF4MTYxNy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCmluZGV4IGQ3NjVjYzEuLmIwY2MzYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KK3N0YXRpYyBpbnQgZXJybm87CiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTM4LDkgKzM5LDYgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9lbnZjdHJsLmg+CiAKLXN0YXRpYyBpbnQgZXJybm87Ci0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotCiAjZGVmaW5lIEVOVkNUUkxfTUlOT1IJMTYyCiAKICNkZWZpbmUgUENGODU4NF9BRERSRVNTCTB4NTUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS8zdy14eHh4LmMgYi9kcml2ZXJzL3Njc2kvM3cteHh4eC5jCmluZGV4IDk3M2M1MWYuLmFlOWUwMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS8zdy14eHh4LmMKKysrIGIvZHJpdmVycy9zY3NpLzN3LXh4eHguYwpAQCAtMTQ5OSwyMiArMTQ5OSw0MyBAQAogCXJldHVybiAwOwogfSAvKiBFbmQgdHdfc2NzaW9wX2lucXVpcnkoKSAqLwogCitzdGF0aWMgdm9pZCB0d190cmFuc2Zlcl9pbnRlcm5hbChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkLAorCQkJCSB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdOworCXZvaWQgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgdHJhbnNmZXJfbGVuOworCisJaWYgKGNtZC0+dXNlX3NnKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPQorCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+cmVxdWVzdF9idWZmZXI7CisJCWJ1ZiA9IGttYXBfYXRvbWljKHNnLT5wYWdlLCBLTV9JUlEwKSArIHNnLT5vZmZzZXQ7CisJCXRyYW5zZmVyX2xlbiA9IG1pbihzZy0+bGVuZ3RoLCBsZW4pOworCX0gZWxzZSB7CisJCWJ1ZiA9IGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCXRyYW5zZmVyX2xlbiA9IG1pbihjbWQtPnJlcXVlc3RfYnVmZmxlbiwgbGVuKTsKKwl9CisKKwltZW1jcHkoYnVmLCBkYXRhLCB0cmFuc2Zlcl9sZW4pOworCQorCWlmIChjbWQtPnVzZV9zZykgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCisJCXNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+cmVxdWVzdF9idWZmZXI7CisJCWt1bm1hcF9hdG9taWMoYnVmIC0gc2ctPm9mZnNldCwgS01fSVJRMCk7CisJfQorfQorCiAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgaXNyIHRvIGNvbXBsZXRlIGFuIGlucXVpcnkgY29tbWFuZCAqLwogc3RhdGljIGludCB0d19zY3Npb3BfaW5xdWlyeV9jb21wbGV0ZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKQogewogCXVuc2lnbmVkIGNoYXIgKmlzX3VuaXRfcHJlc2VudDsKLQl1bnNpZ25lZCBjaGFyICpyZXF1ZXN0X2J1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyIHJlcXVlc3RfYnVmZmVyWzM2XTsKIAlUV19QYXJhbSAqcGFyYW07CiAKIAlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfaW5xdWlyeV9jb21wbGV0ZSgpXG4iKTsKIAotCS8qIEZpbGwgcmVxdWVzdCBidWZmZXIgKi8KLQlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmVyID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfc2NzaW9wX2lucXVpcnlfY29tcGxldGUoKTogUmVxdWVzdCBidWZmZXIgTlVMTC5cbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmVxdWVzdF9idWZmZXIgPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmZXI7Ci0JbWVtc2V0KHJlcXVlc3RfYnVmZmVyLCAwLCB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmbGVuKTsKKwltZW1zZXQocmVxdWVzdF9idWZmZXIsIDAsIHNpemVvZihyZXF1ZXN0X2J1ZmZlcikpOwogCXJlcXVlc3RfYnVmZmVyWzBdID0gVFlQRV9ESVNLOyAvKiBQZXJpcGhlcmFsIGRldmljZSB0eXBlICovCiAJcmVxdWVzdF9idWZmZXJbMV0gPSAwOwkgICAgICAgLyogRGV2aWNlIHR5cGUgbW9kaWZpZXIgKi8KIAlyZXF1ZXN0X2J1ZmZlclsyXSA9IDA7CSAgICAgICAvKiBObyBhbnNpL2lzbyBjb21wbGlhbmNlICovCkBAIC0xNTIyLDYgKzE1NDMsOCBAQAogCW1lbWNweSgmcmVxdWVzdF9idWZmZXJbOF0sICIzd2FyZSAgICIsIDgpOwkgLyogVmVuZG9yIElEICovCiAJc3ByaW50ZigmcmVxdWVzdF9idWZmZXJbMTZdLCAiTG9naWNhbCBEaXNrICUtMmQgIiwgdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmRldmljZS0+aWQpOwogCW1lbWNweSgmcmVxdWVzdF9idWZmZXJbMzJdLCBUV19EUklWRVJfVkVSU0lPTiwgMyk7CisJdHdfdHJhbnNmZXJfaW50ZXJuYWwodHdfZGV2LCByZXF1ZXN0X2lkLCByZXF1ZXN0X2J1ZmZlciwKKwkJCSAgICAgc2l6ZW9mKHJlcXVlc3RfYnVmZmVyKSk7CiAKIAlwYXJhbSA9IChUV19QYXJhbSAqKXR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKIAlpZiAocGFyYW0gPT0gTlVMTCkgewpAQCAtMTYxMiw3ICsxNjM1LDcgQEAKIHsKIAlUV19QYXJhbSAqcGFyYW07CiAJdW5zaWduZWQgY2hhciAqZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciAqcmVxdWVzdF9idWZmZXI7CisJdW5zaWduZWQgY2hhciByZXF1ZXN0X2J1ZmZlcls4XTsKIAogCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9tb2RlX3NlbnNlX2NvbXBsZXRlKClcbiIpOwogCkBAIC0xNjIyLDggKzE2NDUsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAJZmxhZ3MgPSAoY2hhciAqKSYocGFyYW0tPmRhdGFbMF0pOwotCXJlcXVlc3RfYnVmZmVyID0gdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmJ1ZmZlcjsKLQltZW1zZXQocmVxdWVzdF9idWZmZXIsIDAsIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZsZW4pOworCW1lbXNldChyZXF1ZXN0X2J1ZmZlciwgMCwgc2l6ZW9mKHJlcXVlc3RfYnVmZmVyKSk7CiAKIAlyZXF1ZXN0X2J1ZmZlclswXSA9IDB4ZjsgICAgICAgIC8qIG1vZGUgZGF0YSBsZW5ndGggKi8KIAlyZXF1ZXN0X2J1ZmZlclsxXSA9IDA7ICAgICAgICAgIC8qIGRlZmF1bHQgbWVkaXVtIHR5cGUgKi8KQEAgLTE2MzUsNiArMTY1Nyw4IEBACiAJCXJlcXVlc3RfYnVmZmVyWzZdID0gMHg0OyAgICAgICAgLyogV0NFIG9uICovCiAJZWxzZQogCQlyZXF1ZXN0X2J1ZmZlcls2XSA9IDB4MDsgICAgICAgIC8qIFdDRSBvZmYgKi8KKwl0d190cmFuc2Zlcl9pbnRlcm5hbCh0d19kZXYsIHJlcXVlc3RfaWQsIHJlcXVlc3RfYnVmZmVyLAorCQkJICAgICBzaXplb2YocmVxdWVzdF9idWZmZXIpKTsKIAogCXJldHVybiAwOwogfSAvKiBFbmQgdHdfc2NzaW9wX21vZGVfc2Vuc2VfY29tcGxldGUoKSAqLwpAQCAtMTcwMSwxNyArMTcyNSwxMiBAQAogewogCXVuc2lnbmVkIGNoYXIgKnBhcmFtX2RhdGE7CiAJdTMyIGNhcGFjaXR5OwotCWNoYXIgKmJ1ZmY7CisJY2hhciBidWZmWzhdOwogCVRXX1BhcmFtICpwYXJhbTsKIAogCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9yZWFkX2NhcGFjaXR5X2NvbXBsZXRlKClcbiIpOwogCi0JYnVmZiA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZlcjsKLQlpZiAoYnVmZiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF9yZWFkX2NhcGFjaXR5X2NvbXBsZXRlKCk6IFJlcXVlc3QgYnVmZmVyIE5VTEwuXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCW1lbXNldChidWZmLCAwLCB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmbGVuKTsKKwltZW1zZXQoYnVmZiwgMCwgc2l6ZW9mKGJ1ZmYpKTsKIAlwYXJhbSA9IChUV19QYXJhbSAqKXR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKIAlpZiAocGFyYW0gPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eV9jb21wbGV0ZSgpOiBCYWQgYWxpZ25tZW50IHZpcnR1YWwgYWRkcmVzcy5cbiIpOwpAQCAtMTczOSw2ICsxNzU4LDggQEAKIAlidWZmWzZdID0gKFRXX0JMT0NLX1NJWkUgPj4gOCkgJiAweGZmOwogCWJ1ZmZbN10gPSBUV19CTE9DS19TSVpFICYgMHhmZjsKIAorCXR3X3RyYW5zZmVyX2ludGVybmFsKHR3X2RldiwgcmVxdWVzdF9pZCwgYnVmZiwgc2l6ZW9mKGJ1ZmYpKTsKKwogCXJldHVybiAwOwogfSAvKiBFbmQgdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHlfY29tcGxldGUoKSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvNTNjN3h4LmMgYi9kcml2ZXJzL3Njc2kvNTNjN3h4LmMKaW5kZXggMjM0MWQyNy4uN2EzM2M3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpLzUzYzd4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS81M2M3eHguYwpAQCAtNjA5MCw4ICs2MDkwLDggQEAKICAgICBpZiAoaG9zdGRhdGEtPm51bV9jbWRzKQogCXByaW50ayAoInNjc2klZCA6IGxlYWtlZCAlZCBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZXNcbiIsCiAJICAgIGhvc3QtPmhvc3Rfbm8sIGhvc3RkYXRhLT5udW1fY21kcyk7Ci0gICAgaWYgKGhvc3RkYXRhLT5ldmVudHMpIAotCXZmcmVlICgodm9pZCAqKWhvc3RkYXRhLT5ldmVudHMpOworCisgICAgdmZyZWUoaG9zdGRhdGEtPmV2ZW50cyk7CiAKICAgICAvKiBYWFggVGhpcyBhc3N1bWVzIGRlZmF1bHQgY2FjaGUgbW9kZSB0byBiZSBJT01BUF9GVUxMX0NBQ0hJTkcsIHdoaWNoCiAgICAgICogWFhYIG1heSBiZSBpbnZhbGlkIChDT05GSUdfMDYwX1dSSVRFVEhST1VHSCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9LY29uZmlnIGIvZHJpdmVycy9zY3NpL0tjb25maWcKaW5kZXggMTJjMjA4Zi4uMmQyMTI2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL0tjb25maWcKKysrIGIvZHJpdmVycy9zY3NpL0tjb25maWcKQEAgLTEsNSArMSwxMSBAQAogbWVudSAiU0NTSSBkZXZpY2Ugc3VwcG9ydCIKIAorY29uZmlnIFJBSURfQVRUUlMKKwl0cmlzdGF0ZSAiUkFJRCBUcmFuc3BvcnQgQ2xhc3MiCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgUHJvdmlkZXMgUkFJRAorCiBjb25maWcgU0NTSQogCXRyaXN0YXRlICJTQ1NJIGRldmljZSBzdXBwb3J0IgogCS0tLWhlbHAtLS0KQEAgLTI1MCw3ICsyNTYsNyBAQAogCiBjb25maWcgU0NTSV9ERUNTSUkKIAl0cmlzdGF0ZSAiREVDIFNJSSBTY3NpIERyaXZlciIKLQlkZXBlbmRzIG9uIE1BQ0hfREVDU1RBVElPTiAmJiBTQ1NJICYmIE1JUFMzMgorCWRlcGVuZHMgb24gTUFDSF9ERUNTVEFUSU9OICYmIFNDU0kgJiYgMzJCSVQKIAogY29uZmlnIEJMS19ERVZfM1dfWFhYWF9SQUlECiAJdHJpc3RhdGUgIjN3YXJlIDUvNi83Lzh4eHggQVRBLVJBSUQgc3VwcG9ydCIKQEAgLTQ1OSw2ICs0NjUsMTUgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFNDU0lfU0FUQV9NVgorCXRyaXN0YXRlICJNYXJ2ZWxsIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfU0FUQSAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTWFydmVsbCBTZXJpYWwgQVRBIGZhbWlseS4KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyA4OFNYWzU2XTBbNDhdWzAxXSBjaGlwcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIFNDU0lfU0FUQV9OVgogCXRyaXN0YXRlICJOVklESUEgU0FUQSBzdXBwb3J0IgogCWRlcGVuZHMgb24gU0NTSV9TQVRBICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZSBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQppbmRleCAzNzQ2ZmI5Li40YjRmZDk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCkBAIC0yMiw2ICsyMiw4IEBACiAKIG9iai0kKENPTkZJR19TQ1NJKQkJKz0gc2NzaV9tb2QubwogCitvYmotJChDT05GSUdfUkFJRF9BVFRSUykJKz0gcmFpZF9jbGFzcy5vCisKICMgLS0tIE5PVEUgT1JERVJJTkcgSEVSRSAtLS0KICMgRm9yIGtlcm5lbCBub24tbW9kdWxhciBsaW5rLCB0cmFuc3BvcnQgYXR0cmlidXRlcyBuZWVkIHRvCiAjIGJlIGluaXRpYWxpc2VkIGJlZm9yZSBkcml2ZXJzCkBAIC0xMzIsNiArMTM0LDcgQEAKIG9iai0kKENPTkZJR19TQ1NJX1NBVEFfU1g0KQkrPSBsaWJhdGEubyBzYXRhX3N4NC5vCiBvYmotJChDT05GSUdfU0NTSV9TQVRBX05WKQkrPSBsaWJhdGEubyBzYXRhX252Lm8KIG9iai0kKENPTkZJR19TQ1NJX1NBVEFfVUxJKQkrPSBsaWJhdGEubyBzYXRhX3VsaS5vCitvYmotJChDT05GSUdfU0NTSV9TQVRBX01WKQkrPSBsaWJhdGEubyBzYXRhX212Lm8KIAogb2JqLSQoQ09ORklHX0FSTSkJCSs9IGFybS8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzODAuYyBiL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmMKaW5kZXggZjhlYzZmZS4uZDQwYmEwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL05DUjUzODAuYworKysgYi9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCkBAIC04OCw2ICs4OCwxMyBAQAogICovCiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgogCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBOREVCVUcgMAorI2VuZGlmCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBOREVCVUdfQUJPUlQgMAorI2VuZGlmCisKICNpZiAoTkRFQlVHICYgTkRFQlVHX0xJU1RTKQogI2RlZmluZSBMSVNUKHgseSkge3ByaW50aygiTElORTolZCAgIEFkZGluZyAlcCB0byAlcFxuIiwgX19MSU5FX18sICh2b2lkKikoeCksICh2b2lkKikoeSkpOyBpZiAoKHgpPT0oeSkpIHVkZWxheSg1KTsgfQogI2RlZmluZSBSRU1PVkUodyx4LHkseikge3ByaW50aygiTElORTolZCAgIFJlbW92aW5nOiAlcC0+JXAgICVwLT4lcCBcbiIsIF9fTElORV9fLCAodm9pZCopKHcpLCAodm9pZCopKHgpLCAodm9pZCopKHkpLCAodm9pZCopKHopKTsgaWYgKCh4KT09KHkpKSB1ZGVsYXkoNSk7IH0KQEAgLTM1OSw3ICszNjYsNyBAQAogCXtQSEFTRV9VTktOT1dOLCAiVU5LTk9XTiJ9CiB9OwogCi0jaWZkZWYgTkRFQlVHCisjaWYgTkRFQlVHCiBzdGF0aWMgc3RydWN0IHsKIAl1bnNpZ25lZCBjaGFyIG1hc2s7CiAJY29uc3QgY2hhciAqbmFtZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9OQ1I1M2M0MDZhLmMgYi9kcml2ZXJzL3Njc2kvTkNSNTNjNDA2YS5jCmluZGV4IDc5YWU3M2IuLmUxZjIyNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9OQ1I1M2M0MDZhLmMKKysrIGIvZHJpdmVycy9zY3NpL05DUjUzYzQwNmEuYwpAQCAtNjIsNyArNjIsNyBAQAogCiAjZGVmaW5lIFNZTkNfTU9ERSAwCQkvKiBTeW5jaHJvbm91cyB0cmFuc2ZlciBtb2RlICovCiAKLSNpZiBERUJVRworI2lmZGVmIERFQlVHCiAjdW5kZWYgTkNSNTNDNDA2QV9ERUJVRwogI2RlZmluZSBOQ1I1M0M0MDZBX0RFQlVHIDEKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjaGJhLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYwppbmRleCBjY2RmNDQwLi5hOGUzZGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYwpAQCAtMTMzLDYgKzEzMyw3IEBACiAgCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBhYWNfYnVpbGRfc2coc3RydWN0IHNjc2lfY21uZCogc2NzaWNtZCwgc3RydWN0IHNnbWFwKiBzZ21hcCk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBhYWNfYnVpbGRfc2c2NChzdHJ1Y3Qgc2NzaV9jbW5kKiBzY3NpY21kLCBzdHJ1Y3Qgc2dtYXA2NCogcHNnKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFhY19idWlsZF9zZ3JhdyhzdHJ1Y3Qgc2NzaV9jbW5kKiBzY3NpY21kLCBzdHJ1Y3Qgc2dtYXByYXcqIHBzZyk7CiBzdGF0aWMgaW50IGFhY19zZW5kX3NyYl9maWIoc3RydWN0IHNjc2lfY21uZCogc2NzaWNtZCk7CiAjaWZkZWYgQUFDX0RFVEFJTEVEX1NUQVRVU19JTkZPCiBzdGF0aWMgY2hhciAqYWFjX2dldF9zdGF0dXNfc3RyaW5nKHUzMiBzdGF0dXMpOwpAQCAtMzQ4LDYgKzM0OSwyNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBjcHVfZmxhZ3MpOwogfQogCitzdGF0aWMgdm9pZCBhYWNfaW50ZXJuYWxfdHJhbnNmZXIoc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl2b2lkICpidWY7CisJdW5zaWduZWQgaW50IHRyYW5zZmVyX2xlbjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gc2NzaWNtZC0+cmVxdWVzdF9idWZmZXI7CisKKwlpZiAoc2NzaWNtZC0+dXNlX3NnKSB7CisJCWJ1ZiA9IGttYXBfYXRvbWljKHNnLT5wYWdlLCBLTV9JUlEwKSArIHNnLT5vZmZzZXQ7CisJCXRyYW5zZmVyX2xlbiA9IG1pbihzZy0+bGVuZ3RoLCBsZW4gKyBvZmZzZXQpOworCX0gZWxzZSB7CisJCWJ1ZiA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOworCQl0cmFuc2Zlcl9sZW4gPSBtaW4oc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuLCBsZW4gKyBvZmZzZXQpOworCX0KKworCW1lbWNweShidWYgKyBvZmZzZXQsIGRhdGEsIHRyYW5zZmVyX2xlbiAtIG9mZnNldCk7CisKKwlpZiAoc2NzaWNtZC0+dXNlX3NnKSAKKwkJa3VubWFwX2F0b21pYyhidWYgLSBzZy0+b2Zmc2V0LCBLTV9JUlEwKTsKKworfQorCiBzdGF0aWMgdm9pZCBnZXRfY29udGFpbmVyX25hbWVfY2FsbGJhY2sodm9pZCAqY29udGV4dCwgc3RydWN0IGZpYiAqIGZpYnB0cikKIHsKIAlzdHJ1Y3QgYWFjX2dldF9uYW1lX3Jlc3AgKiBnZXRfbmFtZV9yZXBseTsKQEAgLTM2MywxOCArMzg1LDIyIEBACiAJLyogRmFpbHVyZSBpcyBpcnJlbGV2YW50LCB1c2luZyBkZWZhdWx0IHZhbHVlIGluc3RlYWQgKi8KIAlpZiAoKGxlMzJfdG9fY3B1KGdldF9uYW1lX3JlcGx5LT5zdGF0dXMpID09IENUX09LKQogCSAmJiAoZ2V0X25hbWVfcmVwbHktPmRhdGFbMF0gIT0gJ1wwJykpIHsKLQkJaW50ICAgIGNvdW50OwotCQljaGFyICogZHA7Ci0JCWNoYXIgKiBzcCA9IGdldF9uYW1lX3JlcGx5LT5kYXRhOworCQljaGFyICpzcCA9IGdldF9uYW1lX3JlcGx5LT5kYXRhOwogCQlzcFtzaXplb2YoKChzdHJ1Y3QgYWFjX2dldF9uYW1lX3Jlc3AgKilOVUxMKS0+ZGF0YSktMV0gPSAnXDAnOwogCQl3aGlsZSAoKnNwID09ICcgJykKIAkJCSsrc3A7Ci0JCWNvdW50ID0gc2l6ZW9mKCgoc3RydWN0IGlucXVpcnlfZGF0YSAqKU5VTEwpLT5pbnFkX3BpZCk7Ci0JCWRwID0gKChzdHJ1Y3QgaW5xdWlyeV9kYXRhICopc2NzaWNtZC0+cmVxdWVzdF9idWZmZXIpLT5pbnFkX3BpZDsKLQkJaWYgKCpzcCkgZG8gewotCQkJKmRwKysgPSAoKnNwKSA/ICpzcCsrIDogJyAnOwotCQl9IHdoaWxlICgtLWNvdW50ID4gMCk7CisJCWlmICgqc3ApIHsKKwkJCWNoYXIgZFtzaXplb2YoKChzdHJ1Y3QgaW5xdWlyeV9kYXRhICopTlVMTCktPmlucWRfcGlkKV07CisJCQlpbnQgY291bnQgPSBzaXplb2YoZCk7CisJCQljaGFyICpkcCA9IGQ7CisJCQlkbyB7CisJCQkJKmRwKysgPSAoKnNwKSA/ICpzcCsrIDogJyAnOworCQkJfSB3aGlsZSAoLS1jb3VudCA+IDApOworCQkJYWFjX2ludGVybmFsX3RyYW5zZmVyKHNjc2ljbWQsIGQsIAorCQkJICBvZmZzZXRvZihzdHJ1Y3QgaW5xdWlyeV9kYXRhLCBpbnFkX3BpZCksIHNpemVvZihkKSk7CisJCX0KIAl9CisKIAlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9HT09EOwogCiAJZmliX2NvbXBsZXRlKGZpYnB0cik7CkBAIC03NzcsMzQgKzgwMywzNiBAQAogCS8qIAogCSAqIDU3IHNjYXR0ZXIgZ2F0aGVyIGVsZW1lbnRzIAogCSAqLwotCWRldi0+c2NzaV9ob3N0X3B0ci0+c2dfdGFibGVzaXplID0gKGRldi0+bWF4X2ZpYl9zaXplIC0KLQkJc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSAtCi0JCXNpemVvZihzdHJ1Y3QgYWFjX3dyaXRlKSArIHNpemVvZihzdHJ1Y3Qgc2dtYXApKSAvCi0JCQlzaXplb2Yoc3RydWN0IHNnbWFwKTsKLQlpZiAoZGV2LT5kYWNfc3VwcG9ydCkgewotCQkvKiAKLQkJICogMzggc2NhdHRlciBnYXRoZXIgZWxlbWVudHMgCi0JCSAqLwotCQlkZXYtPnNjc2lfaG9zdF9wdHItPnNnX3RhYmxlc2l6ZSA9Ci0JCQkoZGV2LT5tYXhfZmliX3NpemUgLQorCWlmICghKGRldi0+cmF3X2lvX2ludGVyZmFjZSkpIHsKKwkJZGV2LT5zY3NpX2hvc3RfcHRyLT5zZ190YWJsZXNpemUgPSAoZGV2LT5tYXhfZmliX3NpemUgLQogCQkJc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSAtCi0JCQlzaXplb2Yoc3RydWN0IGFhY193cml0ZTY0KSArCi0JCQlzaXplb2Yoc3RydWN0IHNnbWFwNjQpKSAvCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZ21hcDY0KTsKLQl9Ci0JZGV2LT5zY3NpX2hvc3RfcHRyLT5tYXhfc2VjdG9ycyA9IEFBQ19NQVhfMzJCSVRfU0dCQ09VTlQ7Ci0JaWYoIShkZXYtPmFkYXB0ZXJfaW5mby5vcHRpb25zICYgQUFDX09QVF9ORVdfQ09NTSkpIHsKLQkJLyoKLQkJICogV29yc3QgY2FzZSBzaXplIHRoYXQgY291bGQgY2F1c2Ugc2cgb3ZlcmZsb3cgd2hlbgotCQkgKiB3ZSBicmVhayB1cCBTRyBlbGVtZW50cyB0aGF0IGFyZSBsYXJnZXIgdGhhbiA2NEtCLgotCQkgKiBXb3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHRlbGwgdGhlIFNDU0kgbGF5ZXIgd2hhdAotCQkgKiB0aGUgbWF4aW11bSBTRyBlbGVtZW50IHNpemUgY2FuIGJlLiBXb3JzdCBjYXNlIGlzCi0JCSAqIChzZ190YWJsZXNpemUtMSkgNEtCIGVsZW1lbnRzIHdpdGggb25lIDY0S0IKLQkJICogZWxlbWVudC4KLQkJICoJMzJiaXQgLT4gNDY4IG9yIDIzOEtCCTY0Yml0IC0+IDQyNCBvciAyMTJLQgotCQkgKi8KLQkJZGV2LT5zY3NpX2hvc3RfcHRyLT5tYXhfc2VjdG9ycyA9Ci0JCSAgKGRldi0+c2NzaV9ob3N0X3B0ci0+c2dfdGFibGVzaXplICogOCkgKyAxMTI7CisJCQlzaXplb2Yoc3RydWN0IGFhY193cml0ZSkgKyBzaXplb2Yoc3RydWN0IHNnbWFwKSkgLworCQkJCXNpemVvZihzdHJ1Y3Qgc2dtYXApOworCQlpZiAoZGV2LT5kYWNfc3VwcG9ydCkgeworCQkJLyogCisJCQkgKiAzOCBzY2F0dGVyIGdhdGhlciBlbGVtZW50cyAKKwkJCSAqLworCQkJZGV2LT5zY3NpX2hvc3RfcHRyLT5zZ190YWJsZXNpemUgPQorCQkJCShkZXYtPm1heF9maWJfc2l6ZSAtCisJCQkJc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSAtCisJCQkJc2l6ZW9mKHN0cnVjdCBhYWNfd3JpdGU2NCkgKworCQkJCXNpemVvZihzdHJ1Y3Qgc2dtYXA2NCkpIC8KKwkJCQkJc2l6ZW9mKHN0cnVjdCBzZ21hcDY0KTsKKwkJfQorCQlkZXYtPnNjc2lfaG9zdF9wdHItPm1heF9zZWN0b3JzID0gQUFDX01BWF8zMkJJVF9TR0JDT1VOVDsKKwkJaWYoIShkZXYtPmFkYXB0ZXJfaW5mby5vcHRpb25zICYgQUFDX09QVF9ORVdfQ09NTSkpIHsKKwkJCS8qCisJCQkgKiBXb3JzdCBjYXNlIHNpemUgdGhhdCBjb3VsZCBjYXVzZSBzZyBvdmVyZmxvdyB3aGVuCisJCQkgKiB3ZSBicmVhayB1cCBTRyBlbGVtZW50cyB0aGF0IGFyZSBsYXJnZXIgdGhhbiA2NEtCLgorCQkJICogV291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCB0ZWxsIHRoZSBTQ1NJIGxheWVyIHdoYXQKKwkJCSAqIHRoZSBtYXhpbXVtIFNHIGVsZW1lbnQgc2l6ZSBjYW4gYmUuIFdvcnN0IGNhc2UgaXMKKwkJCSAqIChzZ190YWJsZXNpemUtMSkgNEtCIGVsZW1lbnRzIHdpdGggb25lIDY0S0IKKwkJCSAqIGVsZW1lbnQuCisJCQkgKgkzMmJpdCAtPiA0Njggb3IgMjM4S0IJNjRiaXQgLT4gNDI0IG9yIDIxMktCCisJCQkgKi8KKwkJCWRldi0+c2NzaV9ob3N0X3B0ci0+bWF4X3NlY3RvcnMgPQorCQkJICAoZGV2LT5zY3NpX2hvc3RfcHRyLT5zZ190YWJsZXNpemUgKiA4KSArIDExMjsKKwkJfQogCX0KIAogCWZpYl9jb21wbGV0ZShmaWJwdHIpOwpAQCAtODE0LDEyICs4NDIsMTEgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCByZWFkX2NhbGxiYWNrKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBmaWIgKiBmaWJwdHIpCitzdGF0aWMgdm9pZCBpb19jYWxsYmFjayh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZmliICogZmlicHRyKQogewogCXN0cnVjdCBhYWNfZGV2ICpkZXY7CiAJc3RydWN0IGFhY19yZWFkX3JlcGx5ICpyZWFkcmVwbHk7CiAJc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZDsKLQl1MzIgbGJhOwogCXUzMiBjaWQ7CiAKIAlzY3NpY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY29udGV4dDsKQEAgLTgyNyw4ICs4NTQsNyBAQAogCWRldiA9IChzdHJ1Y3QgYWFjX2RldiAqKXNjc2ljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CiAJY2lkID0gSURfTFVOX1RPX0NPTlRBSU5FUihzY3NpY21kLT5kZXZpY2UtPmlkLCBzY3NpY21kLT5kZXZpY2UtPmx1bik7CiAKLQlsYmEgPSAoKHNjc2ljbWQtPmNtbmRbMV0gJiAweDFGKSA8PCAxNikgfCAoc2NzaWNtZC0+Y21uZFsyXSA8PCA4KSB8IHNjc2ljbWQtPmNtbmRbM107Ci0JZHByaW50aygoS0VSTl9ERUJVRyAicmVhZF9jYWxsYmFja1tjcHUgJWRdOiBsYmEgPSAldSwgdCA9ICVsZC5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgbGJhLCBqaWZmaWVzKSk7CisJZHByaW50aygoS0VSTl9ERUJVRyAiaW9fY2FsbGJhY2tbY3B1ICVkXTogbGJhID0gJXUsIHQgPSAlbGQuXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksICgoc2NzaWNtZC0+Y21uZFsxXSAmIDB4MUYpIDw8IDE2KSB8IChzY3NpY21kLT5jbW5kWzJdIDw8IDgpIHwgc2NzaWNtZC0+Y21uZFszXSwgamlmZmllcykpOwogCiAJaWYgKGZpYnB0ciA9PSBOVUxMKQogCQlCVUcoKTsKQEAgLTg0Nyw3ICs4NzMsNyBAQAogCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9HT09EOwogCWVsc2UgewogI2lmZGVmIEFBQ19ERVRBSUxFRF9TVEFUVVNfSU5GTwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZWFkX2NhbGxiYWNrOiBpbyBmYWlsZWQsIHN0YXR1cyA9ICVkXG4iLAorCQlwcmludGsoS0VSTl9XQVJOSU5HICJpb19jYWxsYmFjazogaW8gZmFpbGVkLCBzdGF0dXMgPSAlZFxuIiwKIAkJICBsZTMyX3RvX2NwdShyZWFkcmVwbHktPnN0YXR1cykpOwogI2VuZGlmCiAJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKQEAgLTg2Nyw1MyArODkzLDYgQEAKIAlhYWNfaW9fZG9uZShzY3NpY21kKTsKIH0KIAotc3RhdGljIHZvaWQgd3JpdGVfY2FsbGJhY2sodm9pZCAqY29udGV4dCwgc3RydWN0IGZpYiAqIGZpYnB0cikKLXsKLQlzdHJ1Y3QgYWFjX2RldiAqZGV2OwotCXN0cnVjdCBhYWNfd3JpdGVfcmVwbHkgKndyaXRlcmVwbHk7Ci0Jc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZDsKLQl1MzIgbGJhOwotCXUzMiBjaWQ7Ci0KLQlzY3NpY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY29udGV4dDsKLQlkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzY3NpY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwotCWNpZCA9IElEX0xVTl9UT19DT05UQUlORVIoc2NzaWNtZC0+ZGV2aWNlLT5pZCwgc2NzaWNtZC0+ZGV2aWNlLT5sdW4pOwotCi0JbGJhID0gKChzY3NpY21kLT5jbW5kWzFdICYgMHgxRikgPDwgMTYpIHwgKHNjc2ljbWQtPmNtbmRbMl0gPDwgOCkgfCBzY3NpY21kLT5jbW5kWzNdOwotCWRwcmludGsoKEtFUk5fREVCVUcgIndyaXRlX2NhbGxiYWNrW2NwdSAlZF06IGxiYSA9ICV1LCB0ID0gJWxkLlxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBsYmEsIGppZmZpZXMpKTsKLQlpZiAoZmlicHRyID09IE5VTEwpCi0JCUJVRygpOwotCi0JaWYoc2NzaWNtZC0+dXNlX3NnKQotCQlwY2lfdW5tYXBfc2coZGV2LT5wZGV2LCAKLQkJCShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3NpY21kLT5idWZmZXIsCi0JCQlzY3NpY21kLT51c2Vfc2csCi0JCQlzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7Ci0JZWxzZSBpZihzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4pCi0JCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBzY3NpY21kLT5TQ3AuZG1hX2hhbmRsZSwKLQkJCQkgc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuLAotCQkJCSBzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7Ci0KLQl3cml0ZXJlcGx5ID0gKHN0cnVjdCBhYWNfd3JpdGVfcmVwbHkgKikgZmliX2RhdGEoZmlicHRyKTsKLQlpZiAobGUzMl90b19jcHUod3JpdGVyZXBseS0+c3RhdHVzKSA9PSBTVF9PSykKLQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfR09PRDsKLQllbHNlIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAid3JpdGVfY2FsbGJhY2s6IHdyaXRlIGZhaWxlZCwgc3RhdHVzID0gJWRcbiIsIHdyaXRlcmVwbHktPnN0YXR1cyk7Ci0JCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKLQkJc2V0X3NlbnNlKCh1OCAqKSAmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwKLQkJCQkgICAgSEFSRFdBUkVfRVJST1IsCi0JCQkJICAgIFNFTkNPREVfSU5URVJOQUxfVEFSR0VUX0ZBSUxVUkUsCi0JCQkJICAgIEFTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFLCAwLCAwLAotCQkJCSAgICAwLCAwKTsKLQkJbWVtY3B5KHNjc2ljbWQtPnNlbnNlX2J1ZmZlciwgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsIAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc2VfZGF0YSkpOwotCX0KLQotCWZpYl9jb21wbGV0ZShmaWJwdHIpOwotCWZpYl9mcmVlKGZpYnB0cik7Ci0JYWFjX2lvX2RvbmUoc2NzaWNtZCk7Ci19Ci0KIHN0YXRpYyBpbnQgYWFjX3JlYWQoc3RydWN0IHNjc2lfY21uZCAqIHNjc2ljbWQsIGludCBjaWQpCiB7CiAJdTMyIGxiYTsKQEAgLTk1NCw3ICs5MzMsMzIgQEAKIAogCWZpYl9pbml0KGNtZF9maWJjb250ZXh0KTsKIAotCWlmIChkZXYtPmRhY19zdXBwb3J0ID09IDEpIHsKKwlpZiAoZGV2LT5yYXdfaW9faW50ZXJmYWNlKSB7CisJCXN0cnVjdCBhYWNfcmF3X2lvICpyZWFkY21kOworCQlyZWFkY21kID0gKHN0cnVjdCBhYWNfcmF3X2lvICopIGZpYl9kYXRhKGNtZF9maWJjb250ZXh0KTsKKwkJcmVhZGNtZC0+YmxvY2tbMF0gPSBjcHVfdG9fbGUzMihsYmEpOworCQlyZWFkY21kLT5ibG9ja1sxXSA9IDA7CisJCXJlYWRjbWQtPmNvdW50ID0gY3B1X3RvX2xlMzIoY291bnQ8PDkpOworCQlyZWFkY21kLT5jaWQgPSBjcHVfdG9fbGUxNihjaWQpOworCQlyZWFkY21kLT5mbGFncyA9IGNwdV90b19sZTE2KDEpOworCQlyZWFkY21kLT5icFRvdGFsID0gMDsKKwkJcmVhZGNtZC0+YnBDb21wbGV0ZSA9IDA7CisJCQorCQlhYWNfYnVpbGRfc2dyYXcoc2NzaWNtZCwgJnJlYWRjbWQtPnNnKTsKKwkJZmlic2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWFjX3Jhd19pbykgKyAoKGxlMzJfdG9fY3B1KHJlYWRjbWQtPnNnLmNvdW50KSAtIDEpICogc2l6ZW9mIChzdHJ1Y3Qgc2dlbnRyeXJhdykpOworCQlpZiAoZmlic2l6ZSA+IChkZXYtPm1heF9maWJfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcikpKQorCQkJQlVHKCk7CisJCS8qCisJCSAqCU5vdyBzZW5kIHRoZSBGaWIgdG8gdGhlIGFkYXB0ZXIKKwkJICovCisJCXN0YXR1cyA9IGZpYl9zZW5kKENvbnRhaW5lclJhd0lvLAorCQkJICBjbWRfZmliY29udGV4dCwgCisJCQkgIGZpYnNpemUsIAorCQkJICBGc2FOb3JtYWwsIAorCQkJICAwLCAxLCAKKwkJCSAgKGZpYl9jYWxsYmFjaykgaW9fY2FsbGJhY2ssIAorCQkJICAodm9pZCAqKSBzY3NpY21kKTsKKwl9IGVsc2UgaWYgKGRldi0+ZGFjX3N1cHBvcnQgPT0gMSkgewogCQlzdHJ1Y3QgYWFjX3JlYWQ2NCAqcmVhZGNtZDsKIAkJcmVhZGNtZCA9IChzdHJ1Y3QgYWFjX3JlYWQ2NCAqKSBmaWJfZGF0YShjbWRfZmliY29udGV4dCk7CiAJCXJlYWRjbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUzMihWTV9DdEhvc3RSZWFkNjQpOwpAQCAtOTY4LDcgKzk3Miw3IEBACiAJCWZpYnNpemUgPSBzaXplb2Yoc3RydWN0IGFhY19yZWFkNjQpICsgCiAJCQkoKGxlMzJfdG9fY3B1KHJlYWRjbWQtPnNnLmNvdW50KSAtIDEpICogCiAJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2dlbnRyeTY0KSk7Ci0JCUJVR19PTiAoZmlic2l6ZSA+IChzaXplb2Yoc3RydWN0IGh3X2ZpYikgLSAKKwkJQlVHX09OIChmaWJzaXplID4gKGRldi0+bWF4X2ZpYl9zaXplIC0gCiAJCQkJCXNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcikpKTsKIAkJLyoKIAkJICoJTm93IHNlbmQgdGhlIEZpYiB0byB0aGUgYWRhcHRlcgpAQCAtOTc4LDcgKzk4Miw3IEBACiAJCQkgIGZpYnNpemUsIAogCQkJICBGc2FOb3JtYWwsIAogCQkJICAwLCAxLCAKLQkJCSAgKGZpYl9jYWxsYmFjaykgcmVhZF9jYWxsYmFjaywgCisJCQkgIChmaWJfY2FsbGJhY2spIGlvX2NhbGxiYWNrLCAKIAkJCSAgKHZvaWQgKikgc2NzaWNtZCk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IGFhY19yZWFkICpyZWFkY21kOwpAQCAtMTAwMiw3ICsxMDA2LDcgQEAKIAkJCSAgZmlic2l6ZSwgCiAJCQkgIEZzYU5vcm1hbCwgCiAJCQkgIDAsIDEsIAotCQkJICAoZmliX2NhbGxiYWNrKSByZWFkX2NhbGxiYWNrLCAKKwkJCSAgKGZpYl9jYWxsYmFjaykgaW9fY2FsbGJhY2ssIAogCQkJICAodm9pZCAqKSBzY3NpY21kKTsKIAl9CiAKQEAgLTEwNjEsNyArMTA2NSwzMiBAQAogCX0KIAlmaWJfaW5pdChjbWRfZmliY29udGV4dCk7CiAKLQlpZihkZXYtPmRhY19zdXBwb3J0ID09IDEpIHsKKwlpZiAoZGV2LT5yYXdfaW9faW50ZXJmYWNlKSB7CisJCXN0cnVjdCBhYWNfcmF3X2lvICp3cml0ZWNtZDsKKwkJd3JpdGVjbWQgPSAoc3RydWN0IGFhY19yYXdfaW8gKikgZmliX2RhdGEoY21kX2ZpYmNvbnRleHQpOworCQl3cml0ZWNtZC0+YmxvY2tbMF0gPSBjcHVfdG9fbGUzMihsYmEpOworCQl3cml0ZWNtZC0+YmxvY2tbMV0gPSAwOworCQl3cml0ZWNtZC0+Y291bnQgPSBjcHVfdG9fbGUzMihjb3VudDw8OSk7CisJCXdyaXRlY21kLT5jaWQgPSBjcHVfdG9fbGUxNihjaWQpOworCQl3cml0ZWNtZC0+ZmxhZ3MgPSAwOyAKKwkJd3JpdGVjbWQtPmJwVG90YWwgPSAwOworCQl3cml0ZWNtZC0+YnBDb21wbGV0ZSA9IDA7CisJCQorCQlhYWNfYnVpbGRfc2dyYXcoc2NzaWNtZCwgJndyaXRlY21kLT5zZyk7CisJCWZpYnNpemUgPSBzaXplb2Yoc3RydWN0IGFhY19yYXdfaW8pICsgKChsZTMyX3RvX2NwdSh3cml0ZWNtZC0+c2cuY291bnQpIC0gMSkgKiBzaXplb2YgKHN0cnVjdCBzZ2VudHJ5cmF3KSk7CisJCWlmIChmaWJzaXplID4gKGRldi0+bWF4X2ZpYl9zaXplIC0gc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSkpCisJCQlCVUcoKTsKKwkJLyoKKwkJICoJTm93IHNlbmQgdGhlIEZpYiB0byB0aGUgYWRhcHRlcgorCQkgKi8KKwkJc3RhdHVzID0gZmliX3NlbmQoQ29udGFpbmVyUmF3SW8sCisJCQkgIGNtZF9maWJjb250ZXh0LCAKKwkJCSAgZmlic2l6ZSwgCisJCQkgIEZzYU5vcm1hbCwgCisJCQkgIDAsIDEsIAorCQkJICAoZmliX2NhbGxiYWNrKSBpb19jYWxsYmFjaywgCisJCQkgICh2b2lkICopIHNjc2ljbWQpOworCX0gZWxzZSBpZiAoZGV2LT5kYWNfc3VwcG9ydCA9PSAxKSB7CiAJCXN0cnVjdCBhYWNfd3JpdGU2NCAqd3JpdGVjbWQ7CiAJCXdyaXRlY21kID0gKHN0cnVjdCBhYWNfd3JpdGU2NCAqKSBmaWJfZGF0YShjbWRfZmliY29udGV4dCk7CiAJCXdyaXRlY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fQ3RIb3N0V3JpdGU2NCk7CkBAIC0xMDg1LDcgKzExMTQsNyBAQAogCQkJICBmaWJzaXplLCAKIAkJCSAgRnNhTm9ybWFsLCAKIAkJCSAgMCwgMSwgCi0JCQkgIChmaWJfY2FsbGJhY2spIHdyaXRlX2NhbGxiYWNrLCAKKwkJCSAgKGZpYl9jYWxsYmFjaykgaW9fY2FsbGJhY2ssIAogCQkJICAodm9pZCAqKSBzY3NpY21kKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgYWFjX3dyaXRlICp3cml0ZWNtZDsKQEAgLTExMTEsNyArMTE0MCw3IEBACiAJCQkgIGZpYnNpemUsIAogCQkJICBGc2FOb3JtYWwsIAogCQkJICAwLCAxLCAKLQkJCSAgKGZpYl9jYWxsYmFjaykgd3JpdGVfY2FsbGJhY2ssIAorCQkJICAoZmliX2NhbGxiYWNrKSBpb19jYWxsYmFjaywgCiAJCQkgICh2b2lkICopIHNjc2ljbWQpOwogCX0KIApAQCAtMTM0MCw0NCArMTM2OSw0NSBAQAogCXN3aXRjaCAoc2NzaWNtZC0+Y21uZFswXSkgewogCWNhc2UgSU5RVUlSWToKIAl7Ci0JCXN0cnVjdCBpbnF1aXJ5X2RhdGEgKmlucV9kYXRhX3B0cjsKKwkJc3RydWN0IGlucXVpcnlfZGF0YSBpbnFfZGF0YTsKIAogCQlkcHJpbnRrKChLRVJOX0RFQlVHICJJTlFVSVJZIGNvbW1hbmQsIElEOiAlZC5cbiIsIHNjc2ljbWQtPmRldmljZS0+aWQpKTsKLQkJaW5xX2RhdGFfcHRyID0gKHN0cnVjdCBpbnF1aXJ5X2RhdGEgKilzY3NpY21kLT5yZXF1ZXN0X2J1ZmZlcjsKLQkJbWVtc2V0KGlucV9kYXRhX3B0ciwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW5xdWlyeV9kYXRhKSk7CisJCW1lbXNldCgmaW5xX2RhdGEsIDAsIHNpemVvZiAoc3RydWN0IGlucXVpcnlfZGF0YSkpOwogCi0JCWlucV9kYXRhX3B0ci0+aW5xZF92ZXIgPSAyOwkvKiBjbGFpbSBjb21wbGlhbmNlIHRvIFNDU0ktMiAqLwotCQlpbnFfZGF0YV9wdHItPmlucWRfZHRxID0gMHg4MDsJLyogc2V0IFJNQiBiaXQgdG8gb25lIGluZGljYXRpbmcgdGhhdCB0aGUgbWVkaXVtIGlzIHJlbW92YWJsZSAqLwotCQlpbnFfZGF0YV9wdHItPmlucWRfcmRmID0gMjsJLyogQSByZXNwb25zZSBkYXRhIGZvcm1hdCB2YWx1ZSBvZiB0d28gaW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgc2hhbGwgYmUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgaW4gU0NTSS0yICovCi0JCWlucV9kYXRhX3B0ci0+aW5xZF9sZW4gPSAzMTsKKwkJaW5xX2RhdGEuaW5xZF92ZXIgPSAyOwkvKiBjbGFpbSBjb21wbGlhbmNlIHRvIFNDU0ktMiAqLworCQlpbnFfZGF0YS5pbnFkX2R0cSA9IDB4ODA7CS8qIHNldCBSTUIgYml0IHRvIG9uZSBpbmRpY2F0aW5nIHRoYXQgdGhlIG1lZGl1bSBpcyByZW1vdmFibGUgKi8KKwkJaW5xX2RhdGEuaW5xZF9yZGYgPSAyOwkvKiBBIHJlc3BvbnNlIGRhdGEgZm9ybWF0IHZhbHVlIG9mIHR3byBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBzaGFsbCBiZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBpbiBTQ1NJLTIgKi8KKwkJaW5xX2RhdGEuaW5xZF9sZW4gPSAzMTsKIAkJLypGb3JtYXQgZm9yICJwYWQyIiBpcyAgUmVsQWRyIHwgV0J1czMyIHwgV0J1czE2IHwgIFN5bmMgIHwgTGlua2VkIHxSZXNlcnZlZHwgQ21kUXVlIHwgU2Z0UmUgKi8KLQkJaW5xX2RhdGFfcHRyLT5pbnFkX3BhZDI9IDB4MzIgOwkgLypXQnVzMTZ8U3luY3xDbWRRdWUgKi8KKwkJaW5xX2RhdGEuaW5xZF9wYWQyPSAweDMyIDsJIC8qV0J1czE2fFN5bmN8Q21kUXVlICovCiAJCS8qCiAJCSAqCVNldCB0aGUgVmVuZG9yLCBQcm9kdWN0LCBhbmQgUmV2aXNpb24gTGV2ZWwKIAkJICoJc2VlOiA8dmVuZG9yPi5jIGkuZS4gYWFjLmMKIAkJICovCiAJCWlmIChzY3NpY21kLT5kZXZpY2UtPmlkID09IGhvc3QtPnRoaXNfaWQpIHsKLQkJCXNldGlucXN0cihjYXJkdHlwZSwgKHZvaWQgKikgKGlucV9kYXRhX3B0ci0+aW5xZF92aWQpLCAoc2l6ZW9mKGNvbnRhaW5lcl90eXBlcykvc2l6ZW9mKGNoYXIgKikpKTsKLQkJCWlucV9kYXRhX3B0ci0+aW5xZF9wZHQgPSBJTlFEX1BEVF9QUk9DOwkvKiBQcm9jZXNzb3IgZGV2aWNlICovCisJCQlzZXRpbnFzdHIoY2FyZHR5cGUsICh2b2lkICopIChpbnFfZGF0YS5pbnFkX3ZpZCksIChzaXplb2YoY29udGFpbmVyX3R5cGVzKS9zaXplb2YoY2hhciAqKSkpOworCQkJaW5xX2RhdGEuaW5xZF9wZHQgPSBJTlFEX1BEVF9QUk9DOwkvKiBQcm9jZXNzb3IgZGV2aWNlICovCisJCQlhYWNfaW50ZXJuYWxfdHJhbnNmZXIoc2NzaWNtZCwgJmlucV9kYXRhLCAwLCBzaXplb2YoaW5xX2RhdGEpKTsKIAkJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CiAJCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlzZXRpbnFzdHIoY2FyZHR5cGUsICh2b2lkICopIChpbnFfZGF0YV9wdHItPmlucWRfdmlkKSwgZnNhX2Rldl9wdHJbY2lkXS50eXBlKTsKLQkJaW5xX2RhdGFfcHRyLT5pbnFkX3BkdCA9IElOUURfUERUX0RBOwkvKiBEaXJlY3QvcmFuZG9tIGFjY2VzcyBkZXZpY2UgKi8KKwkJc2V0aW5xc3RyKGNhcmR0eXBlLCAodm9pZCAqKSAoaW5xX2RhdGEuaW5xZF92aWQpLCBmc2FfZGV2X3B0cltjaWRdLnR5cGUpOworCQlpbnFfZGF0YS5pbnFkX3BkdCA9IElOUURfUERUX0RBOwkvKiBEaXJlY3QvcmFuZG9tIGFjY2VzcyBkZXZpY2UgKi8KKwkJYWFjX2ludGVybmFsX3RyYW5zZmVyKHNjc2ljbWQsICZpbnFfZGF0YSwgMCwgc2l6ZW9mKGlucV9kYXRhKSk7CiAJCXJldHVybiBhYWNfZ2V0X2NvbnRhaW5lcl9uYW1lKHNjc2ljbWQsIGNpZCk7CiAJfQogCWNhc2UgUkVBRF9DQVBBQ0lUWToKIAl7CiAJCXUzMiBjYXBhY2l0eTsKLQkJY2hhciAqY3A7CisJCWNoYXIgY3BbOF07CiAKIAkJZHByaW50aygoS0VSTl9ERUJVRyAiUkVBRCBDQVBBQ0lUWSBjb21tYW5kLlxuIikpOwogCQlpZiAoZnNhX2Rldl9wdHJbY2lkXS5zaXplIDw9IDB4MTAwMDAwMDAwTEwpCiAJCQljYXBhY2l0eSA9IGZzYV9kZXZfcHRyW2NpZF0uc2l6ZSAtIDE7CiAJCWVsc2UKIAkJCWNhcGFjaXR5ID0gKHUzMiktMTsKLQkJY3AgPSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwogCQljcFswXSA9IChjYXBhY2l0eSA+PiAyNCkgJiAweGZmOwogCQljcFsxXSA9IChjYXBhY2l0eSA+PiAxNikgJiAweGZmOwogCQljcFsyXSA9IChjYXBhY2l0eSA+PiA4KSAmIDB4ZmY7CkBAIC0xMzg2LDYgKzE0MTYsNyBAQAogCQljcFs1XSA9IDA7CiAJCWNwWzZdID0gMjsKIAkJY3BbN10gPSAwOworCQlhYWNfaW50ZXJuYWxfdHJhbnNmZXIoc2NzaWNtZCwgY3AsIDAsIHNpemVvZihjcCkpOwogCiAJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CiAJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKQEAgLTEzOTUsMTUgKzE0MjYsMTUgQEAKIAogCWNhc2UgTU9ERV9TRU5TRToKIAl7Ci0JCWNoYXIgKm1vZGVfYnVmOworCQljaGFyIG1vZGVfYnVmWzRdOwogCiAJCWRwcmludGsoKEtFUk5fREVCVUcgIk1PREUgU0VOU0UgY29tbWFuZC5cbiIpKTsKLQkJbW9kZV9idWYgPSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZlcjsKIAkJbW9kZV9idWZbMF0gPSAzOwkvKiBNb2RlIGRhdGEgbGVuZ3RoICovCiAJCW1vZGVfYnVmWzFdID0gMDsJLyogTWVkaXVtIHR5cGUgLSBkZWZhdWx0ICovCiAJCW1vZGVfYnVmWzJdID0gMDsJLyogRGV2aWNlLXNwZWNpZmljIHBhcmFtLCBiaXQgODogMC8xID0gd3JpdGUgZW5hYmxlZC9wcm90ZWN0ZWQgKi8KIAkJbW9kZV9idWZbM10gPSAwOwkvKiBCbG9jayBkZXNjcmlwdG9yIGxlbmd0aCAqLwogCisJCWFhY19pbnRlcm5hbF90cmFuc2ZlcihzY3NpY21kLCBtb2RlX2J1ZiwgMCwgc2l6ZW9mKG1vZGVfYnVmKSk7CiAJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CiAJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKIApAQCAtMTQxMSwxMCArMTQ0Miw5IEBACiAJfQogCWNhc2UgTU9ERV9TRU5TRV8xMDoKIAl7Ci0JCWNoYXIgKm1vZGVfYnVmOworCQljaGFyIG1vZGVfYnVmWzhdOwogCiAJCWRwcmludGsoKEtFUk5fREVCVUcgIk1PREUgU0VOU0UgMTAgYnl0ZSBjb21tYW5kLlxuIikpOwotCQltb2RlX2J1ZiA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOwogCQltb2RlX2J1ZlswXSA9IDA7CS8qIE1vZGUgZGF0YSBsZW5ndGggKE1TQikgKi8KIAkJbW9kZV9idWZbMV0gPSA2OwkvKiBNb2RlIGRhdGEgbGVuZ3RoIChMU0IpICovCiAJCW1vZGVfYnVmWzJdID0gMDsJLyogTWVkaXVtIHR5cGUgLSBkZWZhdWx0ICovCkBAIC0xNDIzLDYgKzE0NTMsNyBAQAogCQltb2RlX2J1Zls1XSA9IDA7CS8qIHJlc2VydmVkICovCiAJCW1vZGVfYnVmWzZdID0gMDsJLyogQmxvY2sgZGVzY3JpcHRvciBsZW5ndGggKE1TQikgKi8KIAkJbW9kZV9idWZbN10gPSAwOwkvKiBCbG9jayBkZXNjcmlwdG9yIGxlbmd0aCAoTFNCKSAqLworCQlhYWNfaW50ZXJuYWxfdHJhbnNmZXIoc2NzaWNtZCwgbW9kZV9idWYsIDAsIHNpemVvZihtb2RlX2J1ZikpOwogCiAJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CiAJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKQEAgLTE4OTQsNyArMTkyNSw3IEBACiAJc3JiY21kLT5pZCAgID0gY3B1X3RvX2xlMzIoc2NzaWNtZC0+ZGV2aWNlLT5pZCk7CiAJc3JiY21kLT5sdW4gICAgICA9IGNwdV90b19sZTMyKHNjc2ljbWQtPmRldmljZS0+bHVuKTsKIAlzcmJjbWQtPmZsYWdzICAgID0gY3B1X3RvX2xlMzIoZmxhZyk7Ci0JdGltZW91dCA9IChzY3NpY21kLT50aW1lb3V0LWppZmZpZXMpL0haOworCXRpbWVvdXQgPSBzY3NpY21kLT50aW1lb3V0X3Blcl9jb21tYW5kL0haOwogCWlmKHRpbWVvdXQgPT0gMCl7CiAJCXRpbWVvdXQgPSAxOwogCX0KQEAgLTIwNzcsNiArMjEwOCw3NiBAQAogCXJldHVybiBieXRlX2NvdW50OwogfQogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhYWNfYnVpbGRfc2dyYXcoc3RydWN0IHNjc2lfY21uZCogc2NzaWNtZCwgc3RydWN0IHNnbWFwcmF3KiBwc2cpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHNjc2ljbWQtPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgYWFjX2RldiAqZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBieXRlX2NvdW50ID0gMDsKKworCS8vIEdldCByaWQgb2Ygb2xkIGRhdGEKKwlwc2ctPmNvdW50ID0gMDsKKwlwc2ctPnNnWzBdLm5leHQgPSAwOworCXBzZy0+c2dbMF0ucHJldiA9IDA7CisJcHNnLT5zZ1swXS5hZGRyWzBdID0gMDsKKwlwc2ctPnNnWzBdLmFkZHJbMV0gPSAwOworCXBzZy0+c2dbMF0uY291bnQgPSAwOworCXBzZy0+c2dbMF0uZmxhZ3MgPSAwOworCWlmIChzY3NpY21kLT51c2Vfc2cpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwkJaW50IGk7CisJCWludCBzZ19jb3VudDsKKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOworCisJCXNnX2NvdW50ID0gcGNpX21hcF9zZyhkZXYtPnBkZXYsIHNnLCBzY3NpY21kLT51c2Vfc2csCisJCQlzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisKKwkJZm9yIChpID0gMDsgaSA8IHNnX2NvdW50OyBpKyspIHsKKwkJCWludCBjb3VudCA9IHNnX2RtYV9sZW4oc2cpOworCQkJdTY0IGFkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQlwc2ctPnNnW2ldLm5leHQgPSAwOworCQkJcHNnLT5zZ1tpXS5wcmV2ID0gMDsKKwkJCXBzZy0+c2dbaV0uYWRkclsxXSA9IGNwdV90b19sZTMyKCh1MzIpKGFkZHI+PjMyKSk7CisJCQlwc2ctPnNnW2ldLmFkZHJbMF0gPSBjcHVfdG9fbGUzMigodTMyKShhZGRyICYgMHhmZmZmZmZmZikpOworCQkJcHNnLT5zZ1tpXS5jb3VudCA9IGNwdV90b19sZTMyKGNvdW50KTsKKwkJCXBzZy0+c2dbaV0uZmxhZ3MgPSAwOworCQkJYnl0ZV9jb3VudCArPSBjb3VudDsKKwkJCXNnKys7CisJCX0KKwkJcHNnLT5jb3VudCA9IGNwdV90b19sZTMyKHNnX2NvdW50KTsKKwkJLyogaGJhIHdhbnRzIHRoZSBzaXplIHRvIGJlIGV4YWN0ICovCisJCWlmKGJ5dGVfY291bnQgPiBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4peworCQkJdTMyIHRlbXAgPSBsZTMyX3RvX2NwdShwc2ctPnNnW2ktMV0uY291bnQpIC0gCisJCQkJKGJ5dGVfY291bnQgLSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQkJcHNnLT5zZ1tpLTFdLmNvdW50ID0gY3B1X3RvX2xlMzIodGVtcCk7CisJCQlieXRlX2NvdW50ID0gc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuOworCQl9CisJCS8qIENoZWNrIGZvciBjb21tYW5kIHVuZGVyZmxvdyAqLworCQlpZihzY3NpY21kLT51bmRlcmZsb3cgJiYgKGJ5dGVfY291bnQgPCBzY3NpY21kLT51bmRlcmZsb3cpKXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciYWFjcmFpZDogY21kIGxlbiAlMDhsWCBjbWQgdW5kZXJmbG93ICUwOFhcbiIsCisJCQkJCWJ5dGVfY291bnQsIHNjc2ljbWQtPnVuZGVyZmxvdyk7CisJCX0KKwl9CisJZWxzZSBpZihzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJaW50IGNvdW50OworCQl1NjQgYWRkcjsKKwkJc2NzaWNtZC0+U0NwLmRtYV9oYW5kbGUgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsCisJCQkJc2NzaWNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCXNjc2ljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJYWRkciA9IHNjc2ljbWQtPlNDcC5kbWFfaGFuZGxlOworCQljb3VudCA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJcHNnLT5jb3VudCA9IGNwdV90b19sZTMyKDEpOworCQlwc2ctPnNnWzBdLm5leHQgPSAwOworCQlwc2ctPnNnWzBdLnByZXYgPSAwOworCQlwc2ctPnNnWzBdLmFkZHJbMV0gPSBjcHVfdG9fbGUzMigodTMyKShhZGRyPj4zMikpOworCQlwc2ctPnNnWzBdLmFkZHJbMF0gPSBjcHVfdG9fbGUzMigodTMyKShhZGRyICYgMHhmZmZmZmZmZikpOworCQlwc2ctPnNnWzBdLmNvdW50ID0gY3B1X3RvX2xlMzIoY291bnQpOworCQlwc2ctPnNnWzBdLmZsYWdzID0gMDsKKwkJYnl0ZV9jb3VudCA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwl9CisJcmV0dXJuIGJ5dGVfY291bnQ7Cit9CisKICNpZmRlZiBBQUNfREVUQUlMRURfU1RBVFVTX0lORk8KIAogc3RydWN0IGFhY19zcmJfc3RhdHVzX2luZm8gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oCmluZGV4IDRhYjA3ODYuLmU0MDUyODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmgKQEAgLTExMCw2ICsxMTAsMjIgQEAKIAl1MzIJY291bnQ7CS8qIExlbmd0aC4gKi8KIH07CiAKK3N0cnVjdCBzZ2VudHJ5cmF3IHsKKwlfX2xlMzIJCW5leHQ7CS8qIHJlc2VydmVkIGZvciBGL1cgdXNlICovCisJX19sZTMyCQlwcmV2OwkvKiByZXNlcnZlZCBmb3IgRi9XIHVzZSAqLworCV9fbGUzMgkJYWRkclsyXTsKKwlfX2xlMzIJCWNvdW50OworCV9fbGUzMgkJZmxhZ3M7CS8qIHJlc2VydmVkIGZvciBGL1cgdXNlICovCit9OworCitzdHJ1Y3QgdXNlcl9zZ2VudHJ5cmF3IHsKKwl1MzIJCW5leHQ7CS8qIHJlc2VydmVkIGZvciBGL1cgdXNlICovCisJdTMyCQlwcmV2OwkvKiByZXNlcnZlZCBmb3IgRi9XIHVzZSAqLworCXUzMgkJYWRkclsyXTsKKwl1MzIJCWNvdW50OworCXUzMgkJZmxhZ3M7CS8qIHJlc2VydmVkIGZvciBGL1cgdXNlICovCit9OworCiAvKgogICoJU0dNQVAKICAqCkBAIC0xMzcsNiArMTUzLDE2IEBACiAJc3RydWN0IHVzZXJfc2dlbnRyeTY0IHNnWzFdOwogfTsKIAorc3RydWN0IHNnbWFwcmF3IHsKKwlfX2xlMzIJCSAgY291bnQ7CisJc3RydWN0IHNnZW50cnlyYXcgc2dbMV07Cit9OworCitzdHJ1Y3QgdXNlcl9zZ21hcHJhdyB7CisJdTMyCQkgIGNvdW50OworCXN0cnVjdCB1c2VyX3NnZW50cnlyYXcgc2dbMV07Cit9OworCiBzdHJ1Y3QgY3JlYXRpb25faW5mbwogewogCXU4IAkJYnVpbGRudW07CQkvKiBlLmcuLCA1ODggKi8KQEAgLTM1MSw2ICszNzcsNyBAQAogICovCiAjZGVmaW5lCQlDb250YWluZXJDb21tYW5kCQk1MDAKICNkZWZpbmUJCUNvbnRhaW5lckNvbW1hbmQ2NAkJNTAxCisjZGVmaW5lCQlDb250YWluZXJSYXdJbwkJCTUwMgogLyoKICAqCUNsdXN0ZXIgQ29tbWFuZHMKICAqLwpAQCAtNDU2LDYgKzQ4Myw3IEBACiB7CiAJdm9pZCAoKmFkYXB0ZXJfaW50ZXJydXB0KShzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKIAl2b2lkICgqYWRhcHRlcl9ub3RpZnkpKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHUzMiBldmVudCk7CisJdm9pZCAoKmFkYXB0ZXJfZGlzYWJsZV9pbnQpKHN0cnVjdCBhYWNfZGV2ICpkZXYpOwogCWludCAgKCphZGFwdGVyX3N5bmNfY21kKShzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgY29tbWFuZCwgdTMyIHAxLCB1MzIgcDIsIHUzMiBwMywgdTMyIHA0LCB1MzIgcDUsIHUzMiBwNiwgdTMyICpzdGF0dXMsIHUzMiAqcjEsIHUzMiAqcjIsIHUzMiAqcjMsIHUzMiAqcjQpOwogCWludCAgKCphZGFwdGVyX2NoZWNrX2hlYWx0aCkoc3RydWN0IGFhY19kZXYgKmRldik7CiB9OwpAQCAtOTgxLDYgKzEwMDksOSBAQAogCXU4CQkJbm9uZGFzZF9zdXBwb3J0OyAKIAl1OAkJCWRhY19zdXBwb3J0OwogCXU4CQkJcmFpZF9zY3NpX21vZGU7CisJLyogbWFjcm8gc2lkZS1lZmZlY3RzIEJFV0FSRSAqLworIwlkZWZpbmUJCQlyYXdfaW9faW50ZXJmYWNlIFwKKwkgIGluaXQtPkluaXRTdHJ1Y3RSZXZpc2lvbj09Y3B1X3RvX2xlMzIoQURBUFRFUl9JTklUX1NUUlVDVF9SRVZJU0lPTl80KQogCXU4CQkJcHJpbnRmX2VuYWJsZWQ7CiB9OwogCkBAIC05OTAsNiArMTAyMSw5IEBACiAjZGVmaW5lIGFhY19hZGFwdGVyX25vdGlmeShkZXYsIGV2ZW50KSBcCiAJKGRldiktPmFfb3BzLmFkYXB0ZXJfbm90aWZ5KGRldiwgZXZlbnQpCiAKKyNkZWZpbmUgYWFjX2FkYXB0ZXJfZGlzYWJsZV9pbnQoZGV2KSBcCisJKGRldiktPmFfb3BzLmFkYXB0ZXJfZGlzYWJsZV9pbnQoZGV2KQorCiAjZGVmaW5lIGFhY19hZGFwdGVyX3N5bmNfY21kKGRldiwgY29tbWFuZCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgc3RhdHVzLCByMSwgcjIsIHIzLCByNCkgXAogCShkZXYpLT5hX29wcy5hZGFwdGVyX3N5bmNfY21kKGRldiwgY29tbWFuZCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgc3RhdHVzLCByMSwgcjIsIHIzLCByNCkKIApAQCAtMTE1Niw2ICsxMTkwLDE3IEBACiAJX19sZTMyCQljb21taXR0ZWQ7CiB9OwogCitzdHJ1Y3QgYWFjX3Jhd19pbworeworCV9fbGUzMgkJYmxvY2tbMl07CisJX19sZTMyCQljb3VudDsKKwlfX2xlMTYJCWNpZDsKKwlfX2xlMTYJCWZsYWdzOwkJLyogMDAgVywgMDEgUiAqLworCV9fbGUxNgkJYnBUb3RhbDsJLyogcmVzZXJ2ZWQgZm9yIEYvVyB1c2UgKi8KKwlfX2xlMTYJCWJwQ29tcGxldGU7CS8qIHJlc2VydmVkIGZvciBGL1cgdXNlICovCisJc3RydWN0IHNnbWFwcmF3CXNnOworfTsKKwogI2RlZmluZSBDVF9GTFVTSF9DQUNIRSAxMjkKIHN0cnVjdCBhYWNfc3luY2hyb25pemUgewogCV9fbGUzMgkJY29tbWFuZDsJLyogVk1fQ29udGFpbmVyQ29uZmlnICovCkBAIC0xMTk2LDcgKzEyNDEsNyBAQAogfTsKIAogLyoKLSAqIFRoaXMgYW5kIGFzc29jYXRlZCBkYXRhIHN0cnVjdHMgYXJlIHVzZWQgYnkgdGhlIAorICogVGhpcyBhbmQgYXNzb2NpYXRlZCBkYXRhIHN0cnVjdHMgYXJlIHVzZWQgYnkgdGhlCiAgKiBpb2N0bCBjYWxsZXIgYW5kIGFyZSBpbiBjcHUgb3JkZXIuCiAgKi8KIHN0cnVjdCB1c2VyX2FhY19zcmIKQEAgLTE1MDgsMTEgKzE1NTMsMTIgQEAKIAogc3RydWN0IHJldmlzaW9uCiB7Ci0JdTMyIGNvbXBhdDsKLQl1MzIgdmVyc2lvbjsKLQl1MzIgYnVpbGQ7CisJX19sZTMyIGNvbXBhdDsKKwlfX2xlMzIgdmVyc2lvbjsKKwlfX2xlMzIgYnVpbGQ7CiB9OwogCQorCiAvKgogICogCVVnbHkgLSBub24gTGludXggbGlrZSBpb2N0bCBjb2RpbmcgZm9yIGJhY2sgY29tcGF0LgogICovCkBAIC0xNzMzLDMgKzE3NzksNCBAQAogaW50IGFhY19zZW5kX3NodXRkb3duKHN0cnVjdCBhYWNfZGV2ICpkZXYpOwogZXh0ZXJuIGludCBudW1hY2I7CiBleHRlcm4gaW50IGFjYnNpemU7CitleHRlcm4gY2hhciBhYWNfZHJpdmVyX3ZlcnNpb25bXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCmluZGV4IDg1Mzg3MDkuLjcxZjFjYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWN0cmwuYwpAQCAtMjg3LDcgKzI4Nyw2IEBACiAJCWtmcmVlKGZpYi0+aHdfZmliKTsKIAkJa2ZyZWUoZmliKTsKIAkJc3RhdHVzID0gMDsKLQkJZmliY3R4LT5qaWZmaWVzID0gamlmZmllcy9IWjsKIAl9IGVsc2UgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CiAJCWlmIChmLndhaXQpIHsKQEAgLTMwMiw2ICszMDEsNyBAQAogCQkJc3RhdHVzID0gLUVBR0FJTjsKIAkJfQkKIAl9CisJZmliY3R4LT5qaWZmaWVzID0gamlmZmllcy9IWjsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC00MDUsMTAgKzQwNSwyMCBAQAogc3RhdGljIGludCBjaGVja19yZXZpc2lvbihzdHJ1Y3QgYWFjX2RldiAqZGV2LCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCByZXZpc2lvbiByZXNwb25zZTsKKwljaGFyICpkcml2ZXJfdmVyc2lvbiA9IGFhY19kcml2ZXJfdmVyc2lvbjsKKwl1MzIgdmVyc2lvbjsKIAotCXJlc3BvbnNlLmNvbXBhdCA9IDE7Ci0JcmVzcG9uc2UudmVyc2lvbiA9IGxlMzJfdG9fY3B1KGRldi0+YWRhcHRlcl9pbmZvLmtlcm5lbHJldik7Ci0JcmVzcG9uc2UuYnVpbGQgPSBsZTMyX3RvX2NwdShkZXYtPmFkYXB0ZXJfaW5mby5rZXJuZWxidWlsZCk7CisJcmVzcG9uc2UuY29tcGF0ID0gY3B1X3RvX2xlMzIoMSk7CisJdmVyc2lvbiA9IChzaW1wbGVfc3RydG9sKGRyaXZlcl92ZXJzaW9uLCAKKwkJCQkmZHJpdmVyX3ZlcnNpb24sIDEwKSA8PCAyNCkgfCAweDAwMDAwNDAwOworCXZlcnNpb24gKz0gc2ltcGxlX3N0cnRvbChkcml2ZXJfdmVyc2lvbiArIDEsICZkcml2ZXJfdmVyc2lvbiwgMTApIDw8IDE2OworCXZlcnNpb24gKz0gc2ltcGxlX3N0cnRvbChkcml2ZXJfdmVyc2lvbiArIDEsIE5VTEwsIDEwKTsKKwlyZXNwb25zZS52ZXJzaW9uID0gY3B1X3RvX2xlMzIodmVyc2lvbik7CisjCWlmIChkZWZpbmVkKEFBQ19EUklWRVJfQlVJTEQpKQorCQlyZXNwb25zZS5idWlsZCA9IGNwdV90b19sZTMyKEFBQ19EUklWRVJfQlVJTEQpOworIwllbHNlCisJCXJlc3BvbnNlLmJ1aWxkID0gY3B1X3RvX2xlMzIoOTk5OSk7CisjCWVuZGlmCiAKIAlpZiAoY29weV90b191c2VyKGFyZywgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21taW5pdC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYwppbmRleCA0MzU1N2JmLi43NWFiZDA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21taW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1pbml0LmMKQEAgLTQ0LDcgKzQ0LDkgQEAKIAogI2luY2x1ZGUgImFhY3JhaWQuaCIKIAotc3RydWN0IGFhY19jb21tb24gYWFjX2NvbmZpZzsKK3N0cnVjdCBhYWNfY29tbW9uIGFhY19jb25maWcgPSB7CisJLmlycV9tb2QgPSAxCit9OwogCiBzdGF0aWMgaW50IGFhY19hbGxvY19jb21tKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHZvaWQgKipjb21tYWRkciwgdW5zaWduZWQgbG9uZyBjb21tc2l6ZSwgdW5zaWduZWQgbG9uZyBjb21tYWxpZ24pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tc3VwLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tc3VwLmMKaW5kZXggNTMyMjg2NS4uYTFkMzAzZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1zdXAuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tc3VwLmMKQEAgLTI1NCw2ICsyNTQsNyBAQAogc3RhdGljIGludCBhYWNfZ2V0X2VudHJ5IChzdHJ1Y3QgYWFjX2RldiAqIGRldiwgdTMyIHFpZCwgc3RydWN0IGFhY19lbnRyeSAqKmVudHJ5LCB1MzIgKiBpbmRleCwgdW5zaWduZWQgbG9uZyAqbm9ub3RpZnkpCiB7CiAJc3RydWN0IGFhY19xdWV1ZSAqIHE7CisJdW5zaWduZWQgbG9uZyBpZHg7CiAKIAkvKgogCSAqCUFsbCBvZiB0aGUgcXVldWVzIHdyYXAgd2hlbiB0aGV5IHJlYWNoIHRoZSBlbmQsIHNvIHdlIGNoZWNrCkBAIC0yNjMsMTAgKzI2NCwyMyBAQAogCSAqLwogCiAJcSA9ICZkZXYtPnF1ZXVlcy0+cXVldWVbcWlkXTsKLQkKLQkqaW5kZXggPSBsZTMyX3RvX2NwdSgqKHEtPmhlYWRlcnMucHJvZHVjZXIpKTsKLQlpZiAoKCppbmRleCAtIDIpID09IGxlMzJfdG9fY3B1KCoocS0+aGVhZGVycy5jb25zdW1lcikpKQorCisJaWR4ID0gKmluZGV4ID0gbGUzMl90b19jcHUoKihxLT5oZWFkZXJzLnByb2R1Y2VyKSk7CisJLyogSW50ZXJydXB0IE1vZGVyYXRpb24sIG9ubHkgaW50ZXJydXB0IGZvciBmaXJzdCB0d28gZW50cmllcyAqLworCWlmIChpZHggIT0gbGUzMl90b19jcHUoKihxLT5oZWFkZXJzLmNvbnN1bWVyKSkpIHsKKwkJaWYgKC0taWR4ID09IDApIHsKKwkJCWlmIChxaWQgPT0gQWRhcEhpZ2hDbWRRdWV1ZSkKKwkJCQlpZHggPSBBREFQX0hJR0hfQ01EX0VOVFJJRVM7CisJCQllbHNlIGlmIChxaWQgPT0gQWRhcE5vcm1DbWRRdWV1ZSkKKwkJCQlpZHggPSBBREFQX05PUk1fQ01EX0VOVFJJRVM7CisJCQllbHNlIGlmIChxaWQgPT0gQWRhcEhpZ2hSZXNwUXVldWUpIAorCSAgICAgICAgCQlpZHggPSBBREFQX0hJR0hfUkVTUF9FTlRSSUVTOworCQkJZWxzZSBpZiAocWlkID09IEFkYXBOb3JtUmVzcFF1ZXVlKSAKKwkJCQlpZHggPSBBREFQX05PUk1fUkVTUF9FTlRSSUVTOworCQl9CisJCWlmIChpZHggIT0gbGUzMl90b19jcHUoKihxLT5oZWFkZXJzLmNvbnN1bWVyKSkpCiAJCQkqbm9ub3RpZnkgPSAxOyAKKwl9CiAKIAlpZiAocWlkID09IEFkYXBIaWdoQ21kUXVldWUpIHsKIAkgICAgICAgIGlmICgqaW5kZXggPj0gQURBUF9ISUdIX0NNRF9FTlRSSUVTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMKaW5kZXggNTYyZGE5MC4uNGZmMjlkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCkBAIC0yNyw4ICsyNywxMSBAQAogICogQWJzdHJhY3Q6IExpbnV4IERyaXZlciBlbnRyeSBtb2R1bGUgZm9yIEFkYXB0ZWMgUkFJRCBBcnJheSBDb250cm9sbGVyCiAgKi8KIAotI2RlZmluZSBBQUNfRFJJVkVSX1ZFUlNJT04JCSIxLjEuMi1sazIiCi0jZGVmaW5lIEFBQ19EUklWRVJfQlVJTERfREFURQkJX19EQVRFX18KKyNkZWZpbmUgQUFDX0RSSVZFUl9WRVJTSU9OCQkiMS4xLTQiCisjaWZuZGVmIEFBQ19EUklWRVJfQlJBTkNICisjZGVmaW5lIEFBQ19EUklWRVJfQlJBTkNICQkiIgorI2VuZGlmCisjZGVmaW5lIEFBQ19EUklWRVJfQlVJTERfREFURQkJX19EQVRFX18gIiAiIF9fVElNRV9fCiAjZGVmaW5lIEFBQ19EUklWRVJOQU1FCQkJImFhY3JhaWQiCiAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KQEAgLTU4LDE2ICs2MSwyNCBAQAogCiAjaW5jbHVkZSAiYWFjcmFpZC5oIgogCisjaWZkZWYgQUFDX0RSSVZFUl9CVUlMRAorI2RlZmluZSBfc3RyKHgpICN4CisjZGVmaW5lIHN0cih4KSBfc3RyKHgpCisjZGVmaW5lIEFBQ19EUklWRVJfRlVMTF9WRVJTSU9OCUFBQ19EUklWRVJfVkVSU0lPTiAiWyIgc3RyKEFBQ19EUklWRVJfQlVJTEQpICJdIiBBQUNfRFJJVkVSX0JSQU5DSAorI2Vsc2UKKyNkZWZpbmUgQUFDX0RSSVZFUl9GVUxMX1ZFUlNJT04JQUFDX0RSSVZFUl9WRVJTSU9OIEFBQ19EUklWRVJfQlJBTkNIICIgIiBBQUNfRFJJVkVSX0JVSUxEX0RBVEUKKyNlbmRpZgogCiBNT0RVTEVfQVVUSE9SKCJSZWQgSGF0IEluYyBhbmQgQWRhcHRlYyIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEZWxsIFBFUkMyLCAyL1NpLCAzL1NpLCAzL0RpLCAiCiAJCSAgICJBZGFwdGVjIEFkdmFuY2VkIFJhaWQgUHJvZHVjdHMsICIKIAkJICAgImFuZCBIUCBOZXRSQUlELTRNIFNDU0kgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfVkVSU0lPTihBQUNfRFJJVkVSX1ZFUlNJT04pOworTU9EVUxFX1ZFUlNJT04oQUFDX0RSSVZFUl9GVUxMX1ZFUlNJT04pOwogCiBzdGF0aWMgTElTVF9IRUFEKGFhY19kZXZpY2VzKTsKIHN0YXRpYyBpbnQgYWFjX2NmZ19tYWpvciA9IC0xOworY2hhciBhYWNfZHJpdmVyX3ZlcnNpb25bXSA9IEFBQ19EUklWRVJfRlVMTF9WRVJTSU9OOwogCiAvKgogICogQmVjYXVzZSBvZiB0aGUgd2F5IExpbnV4IG5hbWVzIHNjc2kgZGV2aWNlcywgdGhlIG9yZGVyIGluIHRoaXMgdGFibGUgaGFzCkBAIC0xMDksMzYgKzEyMCwzOSBAQAogCXsgMHg5MDA1LCAweDAyODYsIDB4OTAwNSwgMHgwMmEzLCAwLCAwLCAyOSB9LCAvKiBJQ1A1MDg1QVUgKEh1cnJpY2FuZSkgKi8KIAl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDJhNCwgMCwgMCwgMzAgfSwgLyogSUNQOTA4NUxJIChNYXJhdWRlci1YKSAqLwogCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMmE1LCAwLCAwLCAzMSB9LCAvKiBJQ1A1MDg1QlIgKE1hcmF1ZGVyLUUpICovCi0JeyAweDkwMDUsIDB4MDI4NywgMHg5MDA1LCAweDA4MDAsIDAsIDAsIDMyIH0sIC8qIFRoZW1pc3RvIEp1cGl0ZXIgUGxhdGZvcm0gKi8KLQl7IDB4OTAwNSwgMHgwMjAwLCAweDkwMDUsIDB4MDIwMCwgMCwgMCwgMzIgfSwgLyogVGhlbWlzdG8gSnVwaXRlciBQbGF0Zm9ybSAqLwotCXsgMHg5MDA1LCAweDAyODYsIDB4OTAwNSwgMHgwODAwLCAwLCAwLCAzMyB9LCAvKiBDYWxsaXN0byBKdXBpdGVyIFBsYXRmb3JtICovCi0JeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOGUsIDAsIDAsIDM0IH0sIC8qIEFTUi0yMDIwU0EgU0FUQSBQQ0ktWCBaQ1IgKFNreWhhd2spICovCi0JeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOGYsIDAsIDAsIDM1IH0sIC8qIEFTUi0yMDI1U0EgU0FUQSBTTy1ESU1NIFBDSS1YIFpDUiAoVGVybWluYXRvcikgKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5MCwgMCwgMCwgMzYgfSwgLyogQUFSLTI0MTBTQSBQQ0kgU0FUQSA0Y2ggKEphZ3VhciBJSSkgKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDEwMjgsIDB4MDI5MSwgMCwgMCwgMzcgfSwgLyogQ0VSQyBTQVRBIFJBSUQgMiBQQ0kgU0FUQSA2Y2ggKERlbGxDb3JzYWlyKSAqLwotCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjkyLCAwLCAwLCAzOCB9LCAvKiBBQVItMjgxMFNBIFBDSSBTQVRBIDhjaCAoQ29yc2Fpci04KSAqLwotCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjkzLCAwLCAwLCAzOSB9LCAvKiBBQVItMjE2MTBTQSBQQ0kgU0FUQSAxNmNoIChDb3JzYWlyLTE2KSAqLwotCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjk0LCAwLCAwLCA0MCB9LCAvKiBFU0QgU08tRElNTSBQQ0ktWCBTQVRBIFpDUiAoUHJvd2xlcikgKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDEwM0MsIDB4MzIyNywgMCwgMCwgNDEgfSwgLyogQUFSLTI2MTBTQSBQQ0kgU0FUQSA2Y2ggKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5NiwgMCwgMCwgNDIgfSwgLyogQVNSLTIyNDBTIChTYWJyZUV4cHJlc3MpICovCi0JeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTcsIDAsIDAsIDQzIH0sIC8qIEFTUi00MDA1U0FTICovCi0JeyAweDkwMDUsIDB4MDI4NSwgMHgxMDE0LCAweDAyRjIsIDAsIDAsIDQ0IH0sIC8qIElCTSA4aSAoQXZvblBhcmspICovCi0JeyAweDkwMDUsIDB4MDI4NSwgMHgxMDE0LCAweDAzMTIsIDAsIDAsIDQ0IH0sIC8qIElCTSA4aSAoQXZvblBhcmsgTGl0ZSkgKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5OCwgMCwgMCwgNDUgfSwgLyogQVNSLTQwMDBTQVMgKEJsYWNrQmlyZCkgKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5OSwgMCwgMCwgNDYgfSwgLyogQVNSLTQ4MDBTQVMgKE1hcmF1ZGVyLVgpICovCi0JeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOWEsIDAsIDAsIDQ3IH0sIC8qIEFTUi00ODA1U0FTIChNYXJhdWRlci1FKSAqLwotCXsgMHg5MDA1LCAweDAyODYsIDB4OTAwNSwgMHgwMmEyLCAwLCAwLCA0OCB9LCAvKiBBU1ItNDgxMFNBUyAoSHVycmljYW5lICovCisJeyAweDkwMDUsIDB4MDI4NiwgMHg5MDA1LCAweDAyYTYsIDAsIDAsIDMyIH0sIC8qIElDUDkwNjdNQSAoSW50cnVkZXItNikgKi8KKwl7IDB4OTAwNSwgMHgwMjg3LCAweDkwMDUsIDB4MDgwMCwgMCwgMCwgMzMgfSwgLyogVGhlbWlzdG8gSnVwaXRlciBQbGF0Zm9ybSAqLworCXsgMHg5MDA1LCAweDAyMDAsIDB4OTAwNSwgMHgwMjAwLCAwLCAwLCAzMyB9LCAvKiBUaGVtaXN0byBKdXBpdGVyIFBsYXRmb3JtICovCisJeyAweDkwMDUsIDB4MDI4NiwgMHg5MDA1LCAweDA4MDAsIDAsIDAsIDM0IH0sIC8qIENhbGxpc3RvIEp1cGl0ZXIgUGxhdGZvcm0gKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4ZSwgMCwgMCwgMzUgfSwgLyogQVNSLTIwMjBTQSBTQVRBIFBDSS1YIFpDUiAoU2t5aGF3aykgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4ZiwgMCwgMCwgMzYgfSwgLyogQVNSLTIwMjVTQSBTQVRBIFNPLURJTU0gUENJLVggWkNSIChUZXJtaW5hdG9yKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjkwLCAwLCAwLCAzNyB9LCAvKiBBQVItMjQxMFNBIFBDSSBTQVRBIDRjaCAoSmFndWFyIElJKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTAyOCwgMHgwMjkxLCAwLCAwLCAzOCB9LCAvKiBDRVJDIFNBVEEgUkFJRCAyIFBDSSBTQVRBIDZjaCAoRGVsbENvcnNhaXIpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTIsIDAsIDAsIDM5IH0sIC8qIEFBUi0yODEwU0EgUENJIFNBVEEgOGNoIChDb3JzYWlyLTgpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTMsIDAsIDAsIDQwIH0sIC8qIEFBUi0yMTYxMFNBIFBDSSBTQVRBIDE2Y2ggKENvcnNhaXItMTYpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTQsIDAsIDAsIDQxIH0sIC8qIEVTRCBTTy1ESU1NIFBDSS1YIFNBVEEgWkNSIChQcm93bGVyKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTAzQywgMHgzMjI3LCAwLCAwLCA0MiB9LCAvKiBBQVItMjYxMFNBIFBDSSBTQVRBIDZjaCAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjk2LCAwLCAwLCA0MyB9LCAvKiBBU1ItMjI0MFMgKFNhYnJlRXhwcmVzcykgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5NywgMCwgMCwgNDQgfSwgLyogQVNSLTQwMDVTQVMgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDEwMTQsIDB4MDJGMiwgMCwgMCwgNDUgfSwgLyogSUJNIDhpIChBdm9uUGFyaykgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDEwMTQsIDB4MDMxMiwgMCwgMCwgNDUgfSwgLyogSUJNIDhpIChBdm9uUGFyayBMaXRlKSAqLworCXsgMHg5MDA1LCAweDAyODYsIDB4MTAxNCwgMHg5NTgwLCAwLCAwLCA0NiB9LCAvKiBJQk0gOGsvOGstbDggKEF1cm9yYSkgKi8KKwl7IDB4OTAwNSwgMHgwMjg2LCAweDEwMTQsIDB4OTU0MCwgMCwgMCwgNDcgfSwgLyogSUJNIDhrLzhrLWw0IChBdXJvcmEgTGl0ZSkgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5OCwgMCwgMCwgNDggfSwgLyogQVNSLTQwMDBTQVMgKEJsYWNrQmlyZCkgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5OSwgMCwgMCwgNDkgfSwgLyogQVNSLTQ4MDBTQVMgKE1hcmF1ZGVyLVgpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOWEsIDAsIDAsIDUwIH0sIC8qIEFTUi00ODA1U0FTIChNYXJhdWRlci1FKSAqLworCXsgMHg5MDA1LCAweDAyODYsIDB4OTAwNSwgMHgwMmEyLCAwLCAwLCA1MSB9LCAvKiBBU1ItNDgxMFNBUyAoSHVycmljYW5lICovCiAKLQl7IDB4OTAwNSwgMHgwMjg1LCAweDEwMjgsIDB4MDI4NywgMCwgMCwgNDkgfSwgLyogUGVyYyAzMjAvREMqLwotCXsgMHgxMDExLCAweDAwNDYsIDB4OTAwNSwgMHgwMzY1LCAwLCAwLCA1MCB9LCAvKiBBZGFwdGVjIDU0MDBTIChNdXN0YW5nKSovCi0JeyAweDEwMTEsIDB4MDA0NiwgMHg5MDA1LCAweDAzNjQsIDAsIDAsIDUxIH0sIC8qIEFkYXB0ZWMgNTQwMFMgKE11c3RhbmcpKi8KLQl7IDB4MTAxMSwgMHgwMDQ2LCAweDkwMDUsIDB4MTM2NCwgMCwgMCwgNTIgfSwgLyogRGVsbCBQRVJDMi9RQyAqLwotCXsgMHgxMDExLCAweDAwNDYsIDB4MTAzYywgMHgxMGMyLCAwLCAwLCA1MyB9LCAvKiBIUCBOZXRSQUlELTRNICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHgxMDI4LCAweDAyODcsIDAsIDAsIDUyIH0sIC8qIFBlcmMgMzIwL0RDKi8KKwl7IDB4MTAxMSwgMHgwMDQ2LCAweDkwMDUsIDB4MDM2NSwgMCwgMCwgNTMgfSwgLyogQWRhcHRlYyA1NDAwUyAoTXVzdGFuZykqLworCXsgMHgxMDExLCAweDAwNDYsIDB4OTAwNSwgMHgwMzY0LCAwLCAwLCA1NCB9LCAvKiBBZGFwdGVjIDU0MDBTIChNdXN0YW5nKSovCisJeyAweDEwMTEsIDB4MDA0NiwgMHg5MDA1LCAweDEzNjQsIDAsIDAsIDU1IH0sIC8qIERlbGwgUEVSQzIvUUMgKi8KKwl7IDB4MTAxMSwgMHgwMDQ2LCAweDEwM2MsIDB4MTBjMiwgMCwgMCwgNTYgfSwgLyogSFAgTmV0UkFJRC00TSAqLwogCi0JeyAweDkwMDUsIDB4MDI4NSwgMHgxMDI4LCBQQ0lfQU5ZX0lELCAwLCAwLCA1NCB9LCAvKiBEZWxsIENhdGNoYWxsICovCi0JeyAweDkwMDUsIDB4MDI4NSwgMHgxN2FhLCBQQ0lfQU5ZX0lELCAwLCAwLCA1NSB9LCAvKiBMZWdlbmQgQ2F0Y2hhbGwgKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA1NiB9LCAvKiBBZGFwdGVjIENhdGNoIEFsbCAqLwotCXsgMHg5MDA1LCAweDAyODYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDU3IH0sIC8qIEFkYXB0ZWMgUm9ja2V0IENhdGNoIEFsbCAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTAyOCwgUENJX0FOWV9JRCwgMCwgMCwgNTcgfSwgLyogRGVsbCBDYXRjaGFsbCAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTdhYSwgUENJX0FOWV9JRCwgMCwgMCwgNTggfSwgLyogTGVnZW5kIENhdGNoYWxsICovCisJeyAweDkwMDUsIDB4MDI4NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNTkgfSwgLyogQWRhcHRlYyBDYXRjaCBBbGwgKi8KKwl7IDB4OTAwNSwgMHgwMjg2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA2MCB9LCAvKiBBZGFwdGVjIFJvY2tldCBDYXRjaCBBbGwgKi8KIAl7IDAsfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhYWNfcGNpX3RibCk7CkBAIC0xODAsOCArMTk0LDkgQEAKIAl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIklDUCAgICAgIiwgIklDUDkwNDdNQSAgICAgICAiLCAxIH0sIC8qIElDUDkwNDdNQSAoTGFuY2VyKSAqLwogCXsgYWFjX3JrdF9pbml0LCAiYWFjcmFpZCIsICAiSUNQICAgICAiLCAiSUNQOTA4N01BICAgICAgICIsIDEgfSwgLyogSUNQOTA4N01BIChMYW5jZXIpICovCiAJeyBhYWNfcmt0X2luaXQsICJhYWNyYWlkIiwgICJJQ1AgICAgICIsICJJQ1A1MDg1QVUgICAgICAgIiwgMSB9LCAvKiBJQ1A1MDg1QVUgKEh1cnJpY2FuZSkgKi8KLQl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIklDUCAgICAgIiwgIklDUDkwODVMSSAgICAgICAiLCAxIH0sIC8qIElDUDkwODVMSSAoTWFyYXVkZXItWCkgKi8KLQl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIklDUCAgICAgIiwgIklDUDUwODVCUiAgICAgICAiLCAxIH0sIC8qIElDUDUwODVCUiAoTWFyYXVkZXItRSkgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiSUNQICAgICAiLCAiSUNQOTA4NUxJICAgICAgICIsIDEgfSwgLyogSUNQOTA4NUxJIChNYXJhdWRlci1YKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJJQ1AgICAgICIsICJJQ1A1MDg1QlIgICAgICAgIiwgMSB9LCAvKiBJQ1A1MDg1QlIgKE1hcmF1ZGVyLUUpICovCisJeyBhYWNfcmt0X2luaXQsICJhYWNyYWlkIiwgICJJQ1AgICAgICIsICJJQ1A5MDY3TUEgICAgICAgIiwgMSB9LCAvKiBJQ1A5MDY3TUEgKEludHJ1ZGVyLTYpICovCiAJeyBOVUxMICAgICAgICAsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJUaGVtaXN0byAgICAgICAgIiwgMCwgQUFDX1FVSVJLX1NMQVZFIH0sIC8qIEp1cGl0ZXIgUGxhdGZvcm0gKi8KIAl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkNhbGxpc3RvICAgICAgICAiLCAyLCBBQUNfUVVJUktfTUFTVEVSIH0sIC8qIEp1cGl0ZXIgUGxhdGZvcm0gKi8KIAl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTIwMjBTQSAgICAgICAiLCAxIH0sIC8qIEFTUi0yMDIwU0EgU0FUQSBQQ0ktWCBaQ1IgKFNreWhhd2spICovCkBAIC0xOTUsMTAgKzIxMCwxMiBAQAogCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItMjI0MFMgICAgICAgIiwgMSB9LCAvKiBBU1ItMjI0MFMgKFNhYnJlRXhwcmVzcykgKi8KIAl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTQwMDVTQVMgICAgICIsIDEgfSwgLyogQVNSLTQwMDVTQVMgKi8KIAl7IGFhY19yeF9pbml0LCAiU2VydmVSQUlEIiwiSUJNICAgICAiLCAiU2VydmVSQUlEIDhpICAgICIsIDEgfSwgLyogSUJNIDhpIChBdm9uUGFyaykgKi8KKwl7IGFhY19ya3RfaW5pdCwgIlNlcnZlUkFJRCIsIklCTSAgICAgIiwgIlNlcnZlUkFJRCA4ay1sOCAiLCAxIH0sIC8qIElCTSA4ay84ay1sOCAoQXVyb3JhKSAqLworCXsgYWFjX3JrdF9pbml0LCAiU2VydmVSQUlEIiwiSUJNICAgICAiLCAiU2VydmVSQUlEIDhrLWw0ICIsIDEgfSwgLyogSUJNIDhrLzhrLWw0IChBdXJvcmEgTGl0ZSkgKi8KIAl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTQwMDBTQVMgICAgICIsIDEgfSwgLyogQVNSLTQwMDBTQVMgKEJsYWNrQmlyZCAmIEF2b25QYXJrKSAqLwogCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItNDgwMFNBUyAgICAgIiwgMSB9LCAvKiBBU1ItNDgwMFNBUyAoTWFyYXVkZXItWCkgKi8KIAl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTQ4MDVTQVMgICAgICIsIDEgfSwgLyogQVNSLTQ4MDVTQVMgKE1hcmF1ZGVyLUUpICovCi0JeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi00ODEwU0FTICAgICAiLCAxIH0sIC8qIEFTUi00ODEwU0FTIChIdXJyaWNhbmUpICovCisJeyBhYWNfcmt0X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItNDgxMFNBUyAgICAgIiwgMSB9LCAvKiBBU1ItNDgxMFNBUyAoSHVycmljYW5lKSAqLwogCiAJeyBhYWNfcnhfaW5pdCwgInBlcmNyYWlkIiwgIkRFTEwgICAgIiwgIlBFUkMgMzIwL0RDICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiBQZXJjIDMyMC9EQyovCiAJeyBhYWNfc2FfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFkYXB0ZWMgNTQwMFMgICAiLCA0LCBBQUNfUVVJUktfMzRTRyB9LCAvKiBBZGFwdGVjIDU0MDBTIChNdXN0YW5nKSovCkBAIC04MzksMTEgKzg1NiwxMiBAQAogCiAJcmV0dXJuIDA7CiAKLW91dF9kZWluaXQ6Cisgb3V0X2RlaW5pdDoKIAlraWxsX3Byb2MoYWFjLT50aHJlYWRfcGlkLCBTSUdLSUxMLCAwKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhYWMtPmFpZl9jb21wbGV0aW9uKTsKIAogCWFhY19zZW5kX3NodXRkb3duKGFhYyk7CisJYWFjX2FkYXB0ZXJfZGlzYWJsZV9pbnQoYWFjKTsKIAlmaWJfbWFwX2ZyZWUoYWFjKTsKIAlwY2lfZnJlZV9jb25zaXN0ZW50KGFhYy0+cGRldiwgYWFjLT5jb21tX3NpemUsIGFhYy0+Y29tbV9hZGRyLCBhYWMtPmNvbW1fcGh5cyk7CiAJa2ZyZWUoYWFjLT5xdWV1ZXMpOwpAQCAtODYwLDYgKzg3OCwxMyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorc3RhdGljIHZvaWQgYWFjX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWFjX2RldiAqYWFjID0gKHN0cnVjdCBhYWNfZGV2ICopc2hvc3QtPmhvc3RkYXRhOworCWFhY19zZW5kX3NodXRkb3duKGFhYyk7Cit9CisKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhYWNfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTg3MSw2ICs4OTYsNyBAQAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFhYy0+YWlmX2NvbXBsZXRpb24pOwogCiAJYWFjX3NlbmRfc2h1dGRvd24oYWFjKTsKKwlhYWNfYWRhcHRlcl9kaXNhYmxlX2ludChhYWMpOwogCWZpYl9tYXBfZnJlZShhYWMpOwogCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWFjLT5wZGV2LCBhYWMtPmNvbW1fc2l6ZSwgYWFjLT5jb21tX2FkZHIsCiAJCQlhYWMtPmNvbW1fcGh5cyk7CkBAIC04OTEsMTQgKzkxNywxNSBAQAogCS5pZF90YWJsZQk9IGFhY19wY2lfdGJsLAogCS5wcm9iZQkJPSBhYWNfcHJvYmVfb25lLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWFjX3JlbW92ZV9vbmUpLAorCS5zaHV0ZG93biAJPSBhYWNfc2h1dGRvd24sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhYWNfaW5pdCh2b2lkKQogewogCWludCBlcnJvcjsKIAkKLQlwcmludGsoS0VSTl9JTkZPICJSZWQgSGF0L0FkYXB0ZWMgYWFjcmFpZCBkcml2ZXIgKCVzICVzKVxuIiwKLQkJCUFBQ19EUklWRVJfVkVSU0lPTiwgQUFDX0RSSVZFUl9CVUlMRF9EQVRFKTsKKwlwcmludGsoS0VSTl9JTkZPICJBZGFwdGVjICVzIGRyaXZlciAoJXMpXG4iLAorCSAgQUFDX0RSSVZFUk5BTUUsIGFhY19kcml2ZXJfdmVyc2lvbik7CiAKIAllcnJvciA9IHBjaV9tb2R1bGVfaW5pdCgmYWFjX3BjaV9kcml2ZXIpOwogCWlmIChlcnJvcikKQEAgLTkwOSw2ICs5MzYsNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiYWFjcmFpZDogdW5hYmxlIHRvIHJlZ2lzdGVyIFwiYWFjXCIgZGV2aWNlLlxuIik7CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3JrdC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvcmt0LmMKaW5kZXggN2Q2OGI3OC4uNTU3Mjg3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvcmt0LmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvcmt0LmMKQEAgLTg4LDYgKzg4LDE2IEBACiB9CiAKIC8qKgorICoJYWFjX3JrdF9kaXNhYmxlX2ludGVycnVwdAktCURpc2FibGUgaW50ZXJydXB0cworICoJQGRldjogQWRhcHRlcgorICovCisKK3N0YXRpYyB2b2lkIGFhY19ya3RfZGlzYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwlya3Rfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgZGV2LT5PSU1SID0gMHhmZik7Cit9CisKKy8qKgogICoJcmt0X3N5bmNfY21kCS0Jc2VuZCBhIGNvbW1hbmQgYW5kIHdhaXQKICAqCUBkZXY6IEFkYXB0ZXIKICAqCUBjb21tYW5kOiBDb21tYW5kIHRvIGV4ZWN1dGUKQEAgLTQxMiwxMCArNDIyLDE5IEBACiAJICoJRmlsbCBpbiB0aGUgZnVuY3Rpb24gZGlzcGF0Y2ggdGFibGUuCiAJICovCiAJZGV2LT5hX29wcy5hZGFwdGVyX2ludGVycnVwdCA9IGFhY19ya3RfaW50ZXJydXB0X2FkYXB0ZXI7CisJZGV2LT5hX29wcy5hZGFwdGVyX2Rpc2FibGVfaW50ID0gYWFjX3JrdF9kaXNhYmxlX2ludGVycnVwdDsKIAlkZXYtPmFfb3BzLmFkYXB0ZXJfbm90aWZ5ID0gYWFjX3JrdF9ub3RpZnlfYWRhcHRlcjsKIAlkZXYtPmFfb3BzLmFkYXB0ZXJfc3luY19jbWQgPSBya3Rfc3luY19jbWQ7CiAJZGV2LT5hX29wcy5hZGFwdGVyX2NoZWNrX2hlYWx0aCA9IGFhY19ya3RfY2hlY2tfaGVhbHRoOwogCisJLyoKKwkgKglGaXJzdCBjbGVhciBvdXQgYWxsIGludGVycnVwdHMuICBUaGVuIGVuYWJsZSB0aGUgb25lJ3MgdGhhdCB3ZQorCSAqCWNhbiBoYW5kbGUuCisJICovCisJcmt0X3dyaXRlYihkZXYsIE1Vbml0Lk9JTVIsIDB4ZmYpOworCXJrdF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsIDB4ZmZmZmZmZmYpOworCXJrdF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCBkZXYtPk9JTVIgPSAweGZiKTsKKwogCWlmIChhYWNfaW5pdF9hZGFwdGVyKGRldikgPT0gTlVMTCkKIAkJZ290byBlcnJvcl9pcnE7CiAJLyoKQEAgLTQzOCw2ICs0NTcsNyBAQAogCWtmcmVlKGRldi0+cXVldWVzKTsKIAogZXJyb3JfaXJxOgorCXJrdF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCBkZXYtPk9JTVIgPSAweGZmKTsKIAlmcmVlX2lycShkZXYtPnNjc2lfaG9zdF9wdHItPmlycSwgKHZvaWQgKilkZXYpOwogCiBlcnJvcl9pb3VubWFwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvcnguYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3J4LmMKaW5kZXggMWZmMjVmNC4uYTg0NTlmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvcnguYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jCkBAIC04OCw2ICs4OCwxNiBAQAogfQogCiAvKioKKyAqCWFhY19yeF9kaXNhYmxlX2ludGVycnVwdAktCURpc2FibGUgaW50ZXJydXB0cworICoJQGRldjogQWRhcHRlcgorICovCisKK3N0YXRpYyB2b2lkIGFhY19yeF9kaXNhYmxlX2ludGVycnVwdChzdHJ1Y3QgYWFjX2RldiAqZGV2KQoreworCXJ4X3dyaXRlYihkZXYsIE1Vbml0Lk9JTVIsIGRldi0+T0lNUiA9IDB4ZmYpOworfQorCisvKioKICAqCXJ4X3N5bmNfY21kCS0Jc2VuZCBhIGNvbW1hbmQgYW5kIHdhaXQKICAqCUBkZXY6IEFkYXB0ZXIKICAqCUBjb21tYW5kOiBDb21tYW5kIHRvIGV4ZWN1dGUKQEAgLTQxMiwxMCArNDIyLDE5IEBACiAJICoJRmlsbCBpbiB0aGUgZnVuY3Rpb24gZGlzcGF0Y2ggdGFibGUuCiAJICovCiAJZGV2LT5hX29wcy5hZGFwdGVyX2ludGVycnVwdCA9IGFhY19yeF9pbnRlcnJ1cHRfYWRhcHRlcjsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfZGlzYWJsZV9pbnQgPSBhYWNfcnhfZGlzYWJsZV9pbnRlcnJ1cHQ7CiAJZGV2LT5hX29wcy5hZGFwdGVyX25vdGlmeSA9IGFhY19yeF9ub3RpZnlfYWRhcHRlcjsKIAlkZXYtPmFfb3BzLmFkYXB0ZXJfc3luY19jbWQgPSByeF9zeW5jX2NtZDsKIAlkZXYtPmFfb3BzLmFkYXB0ZXJfY2hlY2tfaGVhbHRoID0gYWFjX3J4X2NoZWNrX2hlYWx0aDsKIAorCS8qCisJICoJRmlyc3QgY2xlYXIgb3V0IGFsbCBpbnRlcnJ1cHRzLiAgVGhlbiBlbmFibGUgdGhlIG9uZSdzIHRoYXQgd2UKKwkgKgljYW4gaGFuZGxlLgorCSAqLworCXJ4X3dyaXRlYihkZXYsIE1Vbml0Lk9JTVIsIDB4ZmYpOworCXJ4X3dyaXRlbChkZXYsIE1Vbml0Lk9EUiwgMHhmZmZmZmZmZik7CisJcnhfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgZGV2LT5PSU1SID0gMHhmYik7CisKIAlpZiAoYWFjX2luaXRfYWRhcHRlcihkZXYpID09IE5VTEwpCiAJCWdvdG8gZXJyb3JfaXJxOwogCS8qCkBAIC00MzgsNiArNDU3LDcgQEAKIAlrZnJlZShkZXYtPnF1ZXVlcyk7CiAKIGVycm9yX2lycToKKwlyeF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCBkZXYtPk9JTVIgPSAweGZmKTsKIAlmcmVlX2lycShkZXYtPnNjc2lfaG9zdF9wdHItPmlycSwgKHZvaWQgKilkZXYpOwogCiBlcnJvcl9pb3VubWFwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc2EuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3NhLmMKaW5kZXggMDY4MDI0OS4uMzkwMGFiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc2EuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zYS5jCkBAIC04Miw2ICs4MiwxNiBAQAogfQogCiAvKioKKyAqCWFhY19zYV9kaXNhYmxlX2ludGVycnVwdAktCWRpc2FibGUgaW50ZXJydXB0CisgKglAZGV2OiBXaGljaCBhZGFwdGVyIHRvIGVuYWJsZS4KKyAqLworCitzdGF0aWMgdm9pZCBhYWNfc2FfZGlzYWJsZV9pbnRlcnJ1cHQgKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJc2Ffd3JpdGV3KGRldiwgU2FEYkNTUi5QUklTRVRJUlFNQVNLLCAweGZmZmYpOworfQorCisvKioKICAqCWFhY19zYV9ub3RpZnlfYWRhcHRlcgkJLQloYW5kbGUgYWRhcHRlciBub3RpZmljYXRpb24KICAqCUBkZXY6CUFkYXB0ZXIgdGhhdCBub3RpZmljYXRpb24gaXMgZm9yCiAgKglAZXZlbnQ6CUV2ZW50IHRvIG5vdGlkeQpAQCAtMjE0LDkgKzIyNCw4IEBACiAgCiBzdGF0aWMgdm9pZCBhYWNfc2FfaW50ZXJydXB0X2FkYXB0ZXIgKHN0cnVjdCBhYWNfZGV2ICpkZXYpCiB7Ci0JdTMyIHJldDsKIAlzYV9zeW5jX2NtZChkZXYsIEJSRUFLUE9JTlRfUkVRVUVTVCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkJCSZyZXQsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCQkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiB9CiAKIC8qKgpAQCAtMzUyLDEwICszNjEsMTggQEAKIAkgKi8KIAogCWRldi0+YV9vcHMuYWRhcHRlcl9pbnRlcnJ1cHQgPSBhYWNfc2FfaW50ZXJydXB0X2FkYXB0ZXI7CisJZGV2LT5hX29wcy5hZGFwdGVyX2Rpc2FibGVfaW50ID0gYWFjX3NhX2Rpc2FibGVfaW50ZXJydXB0OwogCWRldi0+YV9vcHMuYWRhcHRlcl9ub3RpZnkgPSBhYWNfc2Ffbm90aWZ5X2FkYXB0ZXI7CiAJZGV2LT5hX29wcy5hZGFwdGVyX3N5bmNfY21kID0gc2Ffc3luY19jbWQ7CiAJZGV2LT5hX29wcy5hZGFwdGVyX2NoZWNrX2hlYWx0aCA9IGFhY19zYV9jaGVja19oZWFsdGg7CiAKKwkvKgorCSAqCUZpcnN0IGNsZWFyIG91dCBhbGwgaW50ZXJydXB0cy4gIFRoZW4gZW5hYmxlIHRoZSBvbmUncyB0aGF0IAorCSAqCXdlIGNhbiBoYW5kbGUuCisJICovCisJc2Ffd3JpdGV3KGRldiwgU2FEYkNTUi5QUklTRVRJUlFNQVNLLCAweGZmZmYpOworCXNhX3dyaXRldyhkZXYsIFNhRGJDU1IuUFJJQ0xFQVJJUlFNQVNLLCAoUHJpbnRmUmVhZHkgfCBET09SQkVMTF8xIHwgCisJCQkJRE9PUkJFTExfMiB8IERPT1JCRUxMXzMgfCBET09SQkVMTF80KSk7CiAKIAlpZihhYWNfaW5pdF9hZGFwdGVyKGRldikgPT0gTlVMTCkKIAkJZ290byBlcnJvcl9pcnE7CkBAIC0zODEsNiArMzk4LDcgQEAKIAlrZnJlZShkZXYtPnF1ZXVlcyk7CiAKIGVycm9yX2lycToKKwlzYV93cml0ZXcoZGV2LCBTYURiQ1NSLlBSSVNFVElSUU1BU0ssIDB4ZmZmZik7CiAJZnJlZV9pcnEoZGV2LT5zY3NpX2hvc3RfcHRyLT5pcnEsICh2b2lkICopZGV2KTsKIAogZXJyb3JfaW91bm1hcDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jIGIvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMKaW5kZXggMGZiOTMzNi4uMzdlYzU0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMKKysrIGIvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMKQEAgLTkyMDAsOCArOTIwMCw4IEBACiAgICAgICAgICh1bnNpZ25lZCkgcy0+c2VyaWFsX251bWJlciwgcy0+cmV0cmllcywgcy0+YWxsb3dlZCk7CiAKICAgICBwcmludGsoCi0iIHRpbWVvdXRfcGVyX2NvbW1hbmQgJWQsIHRpbWVvdXRfdG90YWwgJWQsIHRpbWVvdXQgJWRcbiIsCi0gICAgICAgIHMtPnRpbWVvdXRfcGVyX2NvbW1hbmQsIHMtPnRpbWVvdXRfdG90YWwsIHMtPnRpbWVvdXQpOworIiB0aW1lb3V0X3Blcl9jb21tYW5kICVkXG4iLAorICAgICAgICBzLT50aW1lb3V0X3Blcl9jb21tYW5kKTsKIAogICAgIHByaW50aygKICIgc2NzaV9kb25lIDB4JWx4LCBkb25lIDB4JWx4LCBob3N0X3NjcmliYmxlIDB4JWx4LCByZXN1bHQgMHgleFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haGNpLmMgYi9kcml2ZXJzL3Njc2kvYWhjaS5jCmluZGV4IDE3OWM5NWMuLmMyYzhmYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haGNpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FoY2kuYwpAQCAtMTg5LDcgKzE4OSw2IEBACiBzdGF0aWMgdm9pZCBhaGNpX2VuZ190aW1lb3V0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIGludCBhaGNpX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBhaGNpX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKLXN0YXRpYyB2b2lkIGFoY2lfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKIHN0YXRpYyB2b2lkIGFoY2lfdGZfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Zik7CiBzdGF0aWMgdm9pZCBhaGNpX3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBzdGF0aWMgdTggYWhjaV9jaGVja19zdGF0dXMoc3RydWN0IGF0YV9wb3J0ICphcCk7CkBAIC0yNDIsNyArMjQxLDYgQEAKIAogCS5wb3J0X3N0YXJ0CQk9IGFoY2lfcG9ydF9zdGFydCwKIAkucG9ydF9zdG9wCQk9IGFoY2lfcG9ydF9zdG9wLAotCS5ob3N0X3N0b3AJCT0gYWhjaV9ob3N0X3N0b3AsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gYWhjaV9wb3J0X2luZm9bXSA9IHsKQEAgLTI1Miw3ICsyNTAsNyBAQAogCQkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAogCQkJCSAgQVRBX0ZMQUdfU0FUQV9SRVNFVCB8IEFUQV9GTEFHX01NSU8gfAogCQkJCSAgQVRBX0ZMQUdfUElPX0RNQSwKLQkJLnBpb19tYXNrCT0gMHgwMywgLyogcGlvMy00ICovCisJCS5waW9fbWFzawk9IDB4MWYsIC8qIHBpbzAtNCAqLwogCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCiAJCS5wb3J0X29wcwk9ICZhaGNpX29wcywKIAl9LApAQCAtMjk2LDE3ICsyOTQsOSBAQAogCXJldHVybiBiYXNlICsgMHgxMDAgKyAocG9ydCAqIDB4ODApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKmFoY2lfcG9ydF9iYXNlICh2b2lkICpiYXNlLCB1bnNpZ25lZCBpbnQgcG9ydCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICphaGNpX3BvcnRfYmFzZSAodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBpbnQgcG9ydCkKIHsKLQlyZXR1cm4gKHZvaWQgKikgYWhjaV9wb3J0X2Jhc2VfdWwoKHVuc2lnbmVkIGxvbmcpYmFzZSwgcG9ydCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFoY2lfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQotewotCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0X3NldC0+cHJpdmF0ZV9kYXRhOwotCWtmcmVlKGhwcml2KTsKLQotCWF0YV9ob3N0X3N0b3AoaG9zdF9zZXQpOworCXJldHVybiAodm9pZCBfX2lvbWVtICopIGFoY2lfcG9ydF9iYXNlX3VsKCh1bnNpZ25lZCBsb25nKWJhc2UsIHBvcnQpOwogfQogCiBzdGF0aWMgaW50IGFoY2lfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQpAQCAtMzE0LDggKzMwNCw5IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gYXAtPmhvc3Rfc2V0LT5kZXY7CiAJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0X3NldC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHA7Ci0Jdm9pZCAqbWVtLCAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOwotCXZvaWQgKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKKwl2b2lkICptZW07CiAJZG1hX2FkZHJfdCBtZW1fZG1hOwogCiAJcHAgPSBrbWFsbG9jKHNpemVvZigqcHApLCBHRlBfS0VSTkVMKTsKQEAgLTM4Myw4ICszNzQsOCBAQAogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0X3NldC0+ZGV2OwogCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKLQl2b2lkICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CisJdm9pZCBfX2lvbWVtICptbWlvID0gYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CiAJdTMyIHRtcDsKIAogCXRtcCA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKQEAgLTU0Niw4ICs1MzcsOCBAQAogCiBzdGF0aWMgdm9pZCBhaGNpX2ludHJfZXJyb3Ioc3RydWN0IGF0YV9wb3J0ICphcCwgdTMyIGlycV9zdGF0KQogewotCXZvaWQgKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKLQl2b2lkICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CisJdm9pZCBfX2lvbWVtICptbWlvID0gYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CiAJdTMyIHRtcDsKIAlpbnQgd29yazsKIApAQCAtNTk1LDggKzU4Niw4IEBACiBzdGF0aWMgdm9pZCBhaGNpX2VuZ190aW1lb3V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBhcC0+aG9zdF9zZXQ7Ci0Jdm9pZCAqbW1pbyA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7Ci0Jdm9pZCAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CiAJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC02MjYsOCArNjE3LDggQEAKIAogc3RhdGljIGlubGluZSBpbnQgYWhjaV9ob3N0X2ludHIoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKLQl2b2lkICptbWlvID0gYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2U7Ci0Jdm9pZCAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOwogCXUzMiBzdGF0dXMsIHNlcnIsIGNpOwogCiAJc2VyciA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfU0NSX0VSUik7CkBAIC02NjMsNyArNjU0LDcgQEAKIAlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCA9IGRldl9pbnN0YW5jZTsKIAlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2OwogCXVuc2lnbmVkIGludCBpLCBoYW5kbGVkID0gMDsKLQl2b2lkICptbWlvOworCXZvaWQgX19pb21lbSAqbW1pbzsKIAl1MzIgaXJxX3N0YXQsIGlycV9hY2sgPSAwOwogCiAJVlBSSU5USygiRU5URVJcbiIpOwpAQCAtNzA5LDcgKzcwMCw3IEBACiBzdGF0aWMgaW50IGFoY2lfcWNfaXNzdWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwotCXZvaWQgKnBvcnRfbW1pbyA9ICh2b2lkICopIGFwLT5pb2FkZHIuY21kX2FkZHI7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSAodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuY21kX2FkZHI7CiAKIAl3cml0ZWwoMSwgcG9ydF9tbWlvICsgUE9SVF9DTURfSVNTVUUpOwogCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EX0lTU1VFKTsJLyogZmx1c2ggKi8KQEAgLTg3NCwyNyArODY1LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIG1vdmUgdG8gUENJIGxheWVyLCBpbnRlZ3JhdGUgdy8gTVNJIHN0dWZmICovCi1zdGF0aWMgdm9pZCBwY2lfaW50eChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGVuYWJsZSkKLXsKLQl1MTYgcGNpX2NvbW1hbmQsIG5ldzsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NvbW1hbmQpOwotCi0JaWYgKGVuYWJsZSkKLQkJbmV3ID0gcGNpX2NvbW1hbmQgJiB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOwotCWVsc2UKLQkJbmV3ID0gcGNpX2NvbW1hbmQgfCBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7Ci0KLQlpZiAobmV3ICE9IHBjaV9jb21tYW5kKQotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHBjaV9jb21tYW5kKTsKLX0KLQogc3RhdGljIHZvaWQgYWhjaV9wcmludF9pbmZvKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpCiB7CiAJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IHByb2JlX2VudC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihwcm9iZV9lbnQtPmRldik7Ci0Jdm9pZCAqbW1pbyA9IHByb2JlX2VudC0+bW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqbW1pbyA9IHByb2JlX2VudC0+bW1pb19iYXNlOwogCXUzMiB2ZXJzLCBjYXAsIGltcGwsIHNwZWVkOwogCWNvbnN0IGNoYXIgKnNwZWVkX3M7CiAJdTE2IGNjOwpAQCAtOTY3LDcgKzk0Miw3IEBACiAJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CiAJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKIAl1bnNpZ25lZCBsb25nIGJhc2U7Ci0Jdm9pZCAqbW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqbW1pb19iYXNlOwogCXVuc2lnbmVkIGludCBib2FyZF9pZHggPSAodW5zaWduZWQgaW50KSBlbnQtPmRyaXZlcl9kYXRhOwogCWludCBoYXZlX21zaSwgcGNpX2Rldl9idXN5ID0gMDsKIAlpbnQgcmM7CkBAIC0xMDA0LDggKzk3OSw3IEBACiAJcHJvYmVfZW50LT5kZXYgPSBwY2lfZGV2X3RvX2RldihwZGV2KTsKIAlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKIAotCW1taW9fYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIEFIQ0lfUENJX0JBUiksCi0JCSAgICAgICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgQUhDSV9QQ0lfQkFSKSk7CisJbW1pb19iYXNlID0gcGNpX2lvbWFwKHBkZXYsIEFIQ0lfUENJX0JBUiwgMCk7CiAJaWYgKG1taW9fYmFzZSA9PSBOVUxMKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfZW50OwpAQCAtMTA0OSw3ICsxMDIzLDcgQEAKIGVycl9vdXRfaHByaXY6CiAJa2ZyZWUoaHByaXYpOwogZXJyX291dF9pb3VubWFwOgotCWlvdW5tYXAobW1pb19iYXNlKTsKKwlwY2lfaW91bm1hcChwZGV2LCBtbWlvX2Jhc2UpOwogZXJyX291dF9mcmVlX2VudDoKIAlrZnJlZShwcm9iZV9lbnQpOwogZXJyX291dF9tc2k6CkBAIC0xMDg5LDcgKzEwNjMsOCBAQAogCQlzY3NpX2hvc3RfcHV0KGFwLT5ob3N0KTsKIAl9CiAKLQlob3N0X3NldC0+b3BzLT5ob3N0X3N0b3AoaG9zdF9zZXQpOworCWtmcmVlKGhwcml2KTsKKwlwY2lfaW91bm1hcChwZGV2LCBob3N0X3NldC0+bW1pb19iYXNlKTsKIAlrZnJlZShob3N0X3NldCk7CiAKIAlpZiAoaGF2ZV9tc2kpCkBAIC0xMTA2LDcgKzEwODEsNiBAQAogCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmFoY2lfcGNpX2RyaXZlcik7CiB9CiAKLQogc3RhdGljIHZvaWQgX19leGl0IGFoY2lfZXhpdCh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWhjaV9wY2lfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljNzl4eCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljNzl4eAppbmRleCBjMjUyM2EzLi42OWVkNzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzc5eHgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvS2NvbmZpZy5haWM3OXh4CkBAIC01LDYgKzUsNyBAQAogY29uZmlnIFNDU0lfQUlDNzlYWAogCXRyaXN0YXRlICJBZGFwdGVjIEFJQzc5eHggVTMyMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwlzZWxlY3QgU0NTSV9TUElfQVRUUlMKIAloZWxwCiAJVGhpcyBkcml2ZXIgc3VwcG9ydHMgYWxsIG9mIEFkYXB0ZWMncyBVbHRyYSAzMjAgUENJLVgKIAliYXNlZCBTQ1NJIGNvbnRyb2xsZXJzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MC5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MC5jCmluZGV4IDAwZjNiZDEuLjUyN2VmZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc3NzAuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3NzcwLmMKQEAgLTEyNiw3ICsxMjYsNiBAQAogaW50CiBhaWM3NzcwX2NvbmZpZyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaWM3NzcwX2lkZW50aXR5ICplbnRyeSwgdV9pbnQgaW8pCiB7Ci0JdV9sb25nCWw7CiAJaW50CWVycm9yOwogCWludAloYXZlX3NlZXByb207CiAJdV9pbnQJaG9zdGNvbmY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LmgKaW5kZXggZmQ0YjJmMy4uNjUzZmIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaApAQCAtMTI0Nyw5ICsxMjQ3LDYgQEAKIAl1aW50MTZfdAkJICB1c2VyX3RhZ2VuYWJsZTsvKiBUYWdnZWQgUXVldWluZyBhbGxvd2VkICovCiB9OwogCi1UQUlMUV9IRUFEKGFoZF9zb2Z0Y190YWlscSwgYWhkX3NvZnRjKTsKLWV4dGVybiBzdHJ1Y3QgYWhkX3NvZnRjX3RhaWxxIGFoZF90YWlscTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTyBDZWxsIENvbmZpZ3VyYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUJQUhEX1BSRUNPTVBfU0xFV19JTkRFWAkJCQkJCVwKICAgICAoQUhEX0FOTkVYQ09MX1BSRUNPTVBfU0xFVyAtIEFIRF9BTk5FWENPTF9QRVJfREVWMCkKQEAgLTEzNzQsOCArMTM3MSw2IEBACiB2b2lkCQkJIGFoZF9wYXVzZV9hbmRfZmx1c2h3b3JrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CiBpbnQJCQkgYWhkX3N1c3BlbmQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsgCiBpbnQJCQkgYWhkX3Jlc3VtZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotdm9pZAkJCSBhaGRfc29mdGNfaW5zZXJ0KHN0cnVjdCBhaGRfc29mdGMgKik7Ci1zdHJ1Y3QgYWhkX3NvZnRjCSphaGRfZmluZF9zb2Z0YyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwogdm9pZAkJCSBhaGRfc2V0X3VuaXQoc3RydWN0IGFoZF9zb2Z0YyAqLCBpbnQpOwogdm9pZAkJCSBhaGRfc2V0X25hbWUoc3RydWN0IGFoZF9zb2Z0YyAqLCBjaGFyICopOwogc3RydWN0IHNjYgkJKmFoZF9nZXRfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgY29sX2lkeCk7CkBAIC0xNTI0LDcgKzE1MTksNiBAQAogdm9pZAkJCWFoZF9wcmludF9kZXZpbmZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKIAkJCQkJICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOwogdm9pZAkJCWFoZF9kdW1wX3NnbGlzdChzdHJ1Y3Qgc2NiICpzY2IpOwotdm9pZAkJCWFoZF9kdW1wX2FsbF9jYXJkc19zdGF0ZSh2b2lkKTsKIHZvaWQJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CiBpbnQJCQlhaGRfcHJpbnRfcmVnaXN0ZXIoYWhkX3JlZ19wYXJzZV9lbnRyeV90ICp0YWJsZSwKIAkJCQkJICAgdV9pbnQgbnVtX2VudHJpZXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfY29yZS5jCmluZGV4IDEzN2ZiMWEuLjRlOGYwMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfY29yZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfY29yZS5jCkBAIC01Miw4ICs1Miw2IEBACiAjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljYXNtL2FpY2FzbV9pbnNmb3JtYXQuaD4KICNlbmRpZgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogR2xvYmFscyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGFoZF9zb2Z0Y190YWlscSBhaGRfdGFpbHEgPSBUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGFoZF90YWlscSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb29rdXAgVGFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBjaGFyICphaGRfY2hpcF9uYW1lc1tdID0KQEAgLTUxODAsNzQgKzUxNzgsNiBAQAogfQogCiB2b2lkCi1haGRfc29mdGNfaW5zZXJ0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQlzdHJ1Y3QgYWhkX3NvZnRjICpsaXN0X2FoZDsKLQotI2lmIEFIRF9QQ0lfQ09ORklHID4gMAotCS8qCi0JICogU2Vjb25kIEZ1bmN0aW9uIFBDSSBkZXZpY2VzIG5lZWQgdG8gaW5oZXJpdCBzb21lCi0JICogc2V0dGluZ3MgZnJvbSBmdW5jdGlvbiAwLgotCSAqLwotCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9NVUxUSV9GVU5DKSAhPSAwKSB7Ci0JCVRBSUxRX0ZPUkVBQ0gobGlzdF9haGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7Ci0JCQlhaGRfZGV2X3NvZnRjX3QgbGlzdF9wY2k7Ci0JCQlhaGRfZGV2X3NvZnRjX3QgcGNpOwotCi0JCQlsaXN0X3BjaSA9IGxpc3RfYWhkLT5kZXZfc29mdGM7Ci0JCQlwY2kgPSBhaGQtPmRldl9zb2Z0YzsKLQkJCWlmIChhaGRfZ2V0X3BjaV9zbG90KGxpc3RfcGNpKSA9PSBhaGRfZ2V0X3BjaV9zbG90KHBjaSkKLQkJCSAmJiBhaGRfZ2V0X3BjaV9idXMobGlzdF9wY2kpID09IGFoZF9nZXRfcGNpX2J1cyhwY2kpKSB7Ci0JCQkJc3RydWN0IGFoZF9zb2Z0YyAqbWFzdGVyOwotCQkJCXN0cnVjdCBhaGRfc29mdGMgKnNsYXZlOwotCi0JCQkJaWYgKGFoZF9nZXRfcGNpX2Z1bmN0aW9uKGxpc3RfcGNpKSA9PSAwKSB7Ci0JCQkJCW1hc3RlciA9IGxpc3RfYWhkOwotCQkJCQlzbGF2ZSA9IGFoZDsKLQkJCQl9IGVsc2UgewotCQkJCQltYXN0ZXIgPSBhaGQ7Ci0JCQkJCXNsYXZlID0gbGlzdF9haGQ7Ci0JCQkJfQotCQkJCXNsYXZlLT5mbGFncyAmPSB+QUhEX0JJT1NfRU5BQkxFRDsgCi0JCQkJc2xhdmUtPmZsYWdzIHw9Ci0JCQkJICAgIG1hc3Rlci0+ZmxhZ3MgJiBBSERfQklPU19FTkFCTEVEOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmCi0KLQkvKgotCSAqIEluc2VydGlvbiBzb3J0IGludG8gb3VyIGxpc3Qgb2Ygc29mdGNzLgotCSAqLwotCWxpc3RfYWhkID0gVEFJTFFfRklSU1QoJmFoZF90YWlscSk7Ci0Jd2hpbGUgKGxpc3RfYWhkICE9IE5VTEwKLQkgICAgJiYgYWhkX3NvZnRjX2NvbXAoYWhkLCBsaXN0X2FoZCkgPD0gMCkKLQkJbGlzdF9haGQgPSBUQUlMUV9ORVhUKGxpc3RfYWhkLCBsaW5rcyk7Ci0JaWYgKGxpc3RfYWhkICE9IE5VTEwpCi0JCVRBSUxRX0lOU0VSVF9CRUZPUkUobGlzdF9haGQsIGFoZCwgbGlua3MpOwotCWVsc2UKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJmFoZF90YWlscSwgYWhkLCBsaW5rcyk7Ci0JYWhkLT5pbml0X2xldmVsKys7Ci19Ci0KLS8qCi0gKiBWZXJpZnkgdGhhdCB0aGUgcGFzc2VkIGluIHNvZnRjIHBvaW50ZXIgaXMgZm9yIGEKLSAqIGNvbnRyb2xsZXIgdGhhdCBpcyBzdGlsbCBjb25maWd1cmVkLgotICovCi1zdHJ1Y3QgYWhkX3NvZnRjICoKLWFoZF9maW5kX3NvZnRjKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQlzdHJ1Y3QgYWhkX3NvZnRjICpsaXN0X2FoZDsKLQotCVRBSUxRX0ZPUkVBQ0gobGlzdF9haGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7Ci0JCWlmIChsaXN0X2FoZCA9PSBhaGQpCi0JCQlyZXR1cm4gKGFoZCk7Ci0JfQotCXJldHVybiAoTlVMTCk7Ci19Ci0KLXZvaWQKIGFoZF9zZXRfdW5pdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCB1bml0KQogewogCWFoZC0+dW5pdCA9IHVuaXQ7CkBAIC03OTAyLDE4ICs3ODMyLDEwIEBACiBzdGF0aWMgdm9pZAogYWhkX3Jlc2V0X3BvbGwodm9pZCAqYXJnKQogewotCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQgPSBhcmc7CiAJdV9pbnQJc2NzaXNlcTE7Ci0JdV9sb25nCWw7CiAJdV9sb25nCXM7CiAJCi0JYWhkX2xpc3RfbG9jaygmbCk7Ci0JYWhkID0gYWhkX2ZpbmRfc29mdGMoKHN0cnVjdCBhaGRfc29mdGMgKilhcmcpOwotCWlmIChhaGQgPT0gTlVMTCkgewotCQlwcmludGYoImFoZF9yZXNldF9wb2xsOiBJbnN0YW5jZSAlcCBubyBsb25nZXIgZXhpc3RzXG4iLCBhcmcpOwotCQlhaGRfbGlzdF91bmxvY2soJmwpOwotCQlyZXR1cm47Ci0JfQogCWFoZF9sb2NrKGFoZCwgJnMpOwogCWFoZF9wYXVzZShhaGQpOwogCWFoZF91cGRhdGVfbW9kZXMoYWhkKTsKQEAgLTc5MjQsNyArNzg0Niw2IEBACiAJCQkJYWhkX3Jlc2V0X3BvbGwsIGFoZCk7CiAJCWFoZF91bnBhdXNlKGFoZCk7CiAJCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0JCWFoZF9saXN0X3VubG9jaygmbCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTc5MzYsMjUgKzc4NTcsMTYgQEAKIAlhaGQtPmZsYWdzICY9IH5BSERfUkVTRVRfUE9MTF9BQ1RJVkU7CiAJYWhkX3VubG9jayhhaGQsICZzKTsKIAlhaGRfcmVsZWFzZV9zaW1xKGFoZCk7Ci0JYWhkX2xpc3RfdW5sb2NrKCZsKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU3RhdGlzdGljcyBQcm9jZXNzaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkCiBhaGRfc3RhdF90aW1lcih2b2lkICphcmcpCiB7Ci0Jc3RydWN0CWFoZF9zb2Z0YyAqYWhkOwotCXVfbG9uZwlsOworCXN0cnVjdAlhaGRfc29mdGMgKmFoZCA9IGFyZzsKIAl1X2xvbmcJczsKIAlpbnQJZW5pbnRfY29hbDsKIAkKLQlhaGRfbGlzdF9sb2NrKCZsKTsKLQlhaGQgPSBhaGRfZmluZF9zb2Z0Yygoc3RydWN0IGFoZF9zb2Z0YyAqKWFyZyk7Ci0JaWYgKGFoZCA9PSBOVUxMKSB7Ci0JCXByaW50ZigiYWhkX3N0YXRfdGltZXI6IEluc3RhbmNlICVwIG5vIGxvbmdlciBleGlzdHNcbiIsIGFyZyk7Ci0JCWFoZF9saXN0X3VubG9jaygmbCk7Ci0JCXJldHVybjsKLQl9CiAJYWhkX2xvY2soYWhkLCAmcyk7CiAKIAllbmludF9jb2FsID0gYWhkLT5oc19tYWlsYm94ICYgRU5JTlRfQ09BTEVTQ0U7CkBAIC03OTgxLDcgKzc4OTMsNiBAQAogCWFoZF90aW1lcl9yZXNldCgmYWhkLT5zdGF0X3RpbWVyLCBBSERfU1RBVF9VUERBVEVfVVMsCiAJCQlhaGRfc3RhdF90aW1lciwgYWhkKTsKIAlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCWFoZF9saXN0X3VubG9jaygmbCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU3RhdHVzIFByb2Nlc3NpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04NzQ1LDE2ICs4NjU2LDYgQEAKIAlyZXR1cm4gKGxhc3RfcHJvYmUpOwogfQogCi12b2lkCi1haGRfZHVtcF9hbGxfY2FyZHNfc3RhdGUodm9pZCkKLXsKLQlzdHJ1Y3QgYWhkX3NvZnRjICpsaXN0X2FoZDsKLQotCVRBSUxRX0ZPUkVBQ0gobGlzdF9haGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7Ci0JCWFoZF9kdW1wX2NhcmRfc3RhdGUobGlzdF9haGQpOwotCX0KLX0KLQogaW50CiBhaGRfcHJpbnRfcmVnaXN0ZXIoYWhkX3JlZ19wYXJzZV9lbnRyeV90ICp0YWJsZSwgdV9pbnQgbnVtX2VudHJpZXMsCiAJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHVfaW50IGFkZHJlc3MsIHVfaW50IHZhbHVlLApAQCAtOTAzOSw3ICs4OTQwLDYgQEAKIAkJYWhkX291dGIoYWhkLCBTVEFDSywgKGFoZC0+c2F2ZWRfc3RhY2tbaV0gPj4gOCkgJiAweEZGKTsKIAl9CiAJcHJpbnRmKCJcbjw8PDw8PDw8PDw8PDw8PDw8IER1bXAgQ2FyZCBTdGF0ZSBFbmRzID4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIik7Ci0JYWhkX3BsYXRmb3JtX2R1bXBfY2FyZF9zdGF0ZShhaGQpOwogCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOwogCWlmIChwYXVzZWQgPT0gMCkKIAkJYWhkX3VucGF1c2UoYWhkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jCmluZGV4IDMyOWNiMjMuLjZiNmQ0ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYwpAQCAtNDYsMzIgKzQ2LDE0IEBACiAjaW5jbHVkZSAiYWljNzl4eF9pbmxpbmUuaCIKICNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KIAotLyoKLSAqIEluY2x1ZGUgYWljbGliLmMgYXMgcGFydCBvZiBvdXIKLSAqICJtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBoYXJkIiB3b3JrIGFyb3VuZC4KLSAqLwotI2luY2x1ZGUgImFpY2xpYi5jIgorc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqYWhkX2xpbnV4X3RyYW5zcG9ydF90ZW1wbGF0ZSA9IE5VTEw7CiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkvKiBfX3NldHVwICovCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSNpbmNsdWRlICJzZC5oIgkJCS8qIEZvciBnZW9tZXRyeSBkZXRlY3Rpb24gKi8KLSNlbmRpZgotCiAjaW5jbHVkZSA8bGludXgvbW0uaD4JCS8qIEZvciBmZXRjaGluZyBzeXN0ZW0gbWVtb3J5IHNpemUgKi8KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4JCS8qIEZvciBibG9ja19zaXplKCkgKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBGb3Igc3NsZWVwL21zbGVlcCAqLwogCiAvKgotICogTG9jayBwcm90ZWN0aW5nIG1hbmlwdWxhdGlvbiBvZiB0aGUgYWhkIHNvZnRjIGxpc3QuCi0gKi8KLXNwaW5sb2NrX3QgYWhkX2xpc3Rfc3BpbmxvY2s7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLS8qIEZvciBkeW5hbWljIHNnbGlzdCBzaXplIGNhbGN1bGF0aW9uLiAqLwotdV9pbnQgYWhkX2xpbnV4X25zZWc7Ci0jZW5kaWYKLQotLyoKICAqIEJ1Y2tldCBzaXplIGZvciBjb3VudGluZyBnb29kIGNvbW1hbmRzIGluIGJldHdlZW4gYmFkIG9uZXMuCiAgKi8KICNkZWZpbmUgQUhEX0xJTlVYX0VSUl9USFJFU0gJMTAwMApAQCAtMTg4LDcxICsxNzAsNiBAQAogfTsKIAogLyoKLSAqIEJ5IGRlZmF1bHQsIHJlYWQgc3RyZWFtaW5nIGlzIGRpc2FibGVkLiAgSW4gdGhlb3J5LAotICogcmVhZCBzdHJlYW1pbmcgc2hvdWxkIGVuaGFuY2UgcGVyZm9ybWFuY2UsIGJ1dCBlYXJseQotICogVTMyMCBkcml2ZSBmaXJtd2FyZSBhY3R1YWxseSBwZXJmb3JtcyBzbG93ZXIgd2l0aAotICogcmVhZCBzdHJlYW1pbmcgZW5hYmxlZC4KLSAqLwotI2lmZGVmIENPTkZJR19BSUM3OVhYX0VOQUJMRV9SRF9TVFJNCi0jZGVmaW5lIEFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSAweEZGRkYKLSNlbHNlCi0jZGVmaW5lIEFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSAwCi0jZW5kaWYKLQotc3RhdGljIHVpbnQxNl90IGFpYzc5eHhfcmRfc3RybV9pbmZvW10gPQotewotCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKLQlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCi0JQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAotCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKLQlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCi0JQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAotCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKLQlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCi0JQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAotCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKLQlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCi0JQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAotCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKLQlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCi0JQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAotCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTQotfTsKLQotLyoKLSAqIERWIG9wdGlvbjoKLSAqCi0gKiBwb3NpdGl2ZSB2YWx1ZSA9IERWIEVuYWJsZWQKLSAqIHplcm8JCSAgPSBEViBEaXNhYmxlZAotICogbmVnYXRpdmUgdmFsdWUgPSBEViBEZWZhdWx0IGZvciBhZGFwdGVyIHR5cGUvc2VlcHJvbQotICovCi0jaWZkZWYgQ09ORklHX0FJQzc5WFhfRFZfU0VUVElORwotI2RlZmluZSBBSUM3OVhYX0NPTkZJR0VEX0RWIENPTkZJR19BSUM3OVhYX0RWX1NFVFRJTkcKLSNlbHNlCi0jZGVmaW5lIEFJQzc5WFhfQ09ORklHRURfRFYgLTEKLSNlbmRpZgotCi1zdGF0aWMgaW50OF90IGFpYzc5eHhfZHZfc2V0dGluZ3NbXSA9Ci17Ci0JQUlDNzlYWF9DT05GSUdFRF9EViwKLQlBSUM3OVhYX0NPTkZJR0VEX0RWLAotCUFJQzc5WFhfQ09ORklHRURfRFYsCi0JQUlDNzlYWF9DT05GSUdFRF9EViwKLQlBSUM3OVhYX0NPTkZJR0VEX0RWLAotCUFJQzc5WFhfQ09ORklHRURfRFYsCi0JQUlDNzlYWF9DT05GSUdFRF9EViwKLQlBSUM3OVhYX0NPTkZJR0VEX0RWLAotCUFJQzc5WFhfQ09ORklHRURfRFYsCi0JQUlDNzlYWF9DT05GSUdFRF9EViwKLQlBSUM3OVhYX0NPTkZJR0VEX0RWLAotCUFJQzc5WFhfQ09ORklHRURfRFYsCi0JQUlDNzlYWF9DT05GSUdFRF9EViwKLQlBSUM3OVhYX0NPTkZJR0VEX0RWLAotCUFJQzc5WFhfQ09ORklHRURfRFYsCi0JQUlDNzlYWF9DT05GSUdFRF9EVgotfTsKLQotLyoKICAqIFRoZSBJL08gY2VsbCBvbiB0aGUgY2hpcCBpcyB2ZXJ5IGNvbmZpZ3VyYWJsZSBpbiByZXNwZWN0IHRvIGl0cyBhbmFsb2cKICAqIGNoYXJhY3RlcmlzdGljcy4gIFNldCB0aGUgZGVmYXVsdHMgaGVyZTsgdGhleSBjYW4gYmUgb3ZlcnJpZGVuIHdpdGgKICAqIHRoZSBwcm9wZXIgaW5zbW9kIHBhcmFtZXRlcnMuCkBAIC0zNzUsMTMgKzI5Miw2IEBACiB1aW50MzJfdCBhaWM3OXh4X2FsbG93X21lbWlvID0gfjA7CiAKIC8qCi0gKiBhaWM3OXh4X2RldGVjdCgpIGhhcyBiZWVuIHJ1biwgc28gcmVnaXN0ZXIgYWxsIGRldmljZSBhcnJpdmFscwotICogaW1tZWRpYXRlbHkgd2l0aCB0aGUgc3lzdGVtIHJhdGhlciB0aGFuIGRlZmVycmluZyB0byB0aGUgc29ydGVkCi0gKiBhdHRhY2htZW50IHBlcmZvcm1lZCBieSBhaWM3OXh4X2RldGVjdCgpLgotICovCi1pbnQgYWljNzl4eF9kZXRlY3RfY29tcGxldGU7Ci0KLS8qCiAgKiBTbyB0aGF0IHdlIGNhbiBzZXQgaG93IGxvbmcgZWFjaCBkZXZpY2UgaXMgZ2l2ZW4gYXMgYSBzZWxlY3Rpb24gdGltZW91dC4KICAqIFRoZSB0YWJsZSBvZiB2YWx1ZXMgZ29lcyBsaWtlIHRoaXM6CiAgKiAgIDAgLSAyNTZtcwpAQCAtNDEyLDcgKzMyMiw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkFkYXB0ZWMgQWljNzkwWCBVMzIwIFNDU0kgSG9zdCBCdXMgQWRhcHRlciBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKIE1PRFVMRV9WRVJTSU9OKEFJQzc5WFhfRFJJVkVSX1ZFUlNJT04pOwotbW9kdWxlX3BhcmFtKGFpYzc5eHgsIGNoYXJwLCAwKTsKK21vZHVsZV9wYXJhbShhaWM3OXh4LCBjaGFycCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFpYzc5eHgsCiAicGVyaW9kIGRlbGltaXRlZCwgb3B0aW9ucyBzdHJpbmcuXG4iCiAiCXZlcmJvc2UJCQlFbmFibGUgdmVyYm9zZS9kaWFnbm9zdGljIGxvZ2dpbmdcbiIKQEAgLTQyNyw4ICszMzcsNiBAQAogIglyZXZlcnNlX3NjYW4JCVNvcnQgUENJIGRldmljZXMgaGlnaGVzdCBCdXMvU2xvdCB0byBsb3dlc3RcbiIKICIJdGFnX2luZm86PHRhZ19zdHI+CVNldCBwZXItdGFyZ2V0IHRhZyBkZXB0aFxuIgogIglnbG9iYWxfdGFnX2RlcHRoOjxpbnQ+CUdsb2JhbCB0YWcgZGVwdGggZm9yIGFsbCB0YXJnZXRzIG9uIGFsbCBidXNlc1xuIgotIglyZF9zdHJtOjxyZF9zdHJtX21hc2tzPiBTZXQgcGVyLXRhcmdldCByZWFkIHN0cmVhbWluZyBzZXR0aW5nLlxuIgotIglkdjo8ZHZfc2V0dGluZ3M+CVNldCBwZXItY29udHJvbGxlciBEb21haW4gVmFsaWRhdGlvbiBTZXR0aW5nLlxuIgogIglzbGV3cmF0ZTo8c2xld3JhdGVfbGlzdD5TZXQgdGhlIHNpZ25hbCBzbGV3IHJhdGUgKDAtMTUpLlxuIgogIglwcmVjb21wOjxwY29tcF9saXN0PglTZXQgdGhlIHNpZ25hbCBwcmVjb21wZW5zYXRpb24gKDAtNykuXG4iCiAiCWFtcGxpdHVkZTo8aW50PgkJU2V0IHRoZSBzaWduYWwgYW1wbGl0dWRlICgwLTcpLlxuIgpAQCAtNDQxLDI0OSArMzQ5LDM1IEBACiAiCQlTaG9ydGVuIHRoZSBzZWxlY3Rpb24gdGltZW91dCB0byAxMjhtc1xuIgogIlxuIgogIglvcHRpb25zIGFpYzc5eHggJ2FpYzc5eHg9dmVyYm9zZS50YWdfaW5mbzp7e30ue30uey4uMTB9fS5zZWx0aW1lOjEnXG4iCi0iXG4iCi0iCVNhbXBsZSAvZXRjL21vZHByb2JlLmNvbmYgbGluZTpcbiIKLSIJCUNoYW5nZSBSZWFkIFN0cmVhbWluZyBmb3IgQ29udHJvbGxlcidzIDIgYW5kIDNcbiIKLSJcbiIKLSIJb3B0aW9ucyBhaWM3OXh4ICdhaWM3OXh4PXJkX3N0cm06ey4uMHhGRkYwLjB4QzBGMH0nIik7CisiXG4iKTsKIAogc3RhdGljIHZvaWQgYWhkX2xpbnV4X2hhbmRsZV9zY3NpX3N0YXR1cyhzdHJ1Y3QgYWhkX3NvZnRjICosCi0JCQkJCSBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqLAorCQkJCQkgc3RydWN0IHNjc2lfZGV2aWNlICosCiAJCQkJCSBzdHJ1Y3Qgc2NiICopOwogc3RhdGljIHZvaWQgYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJCSBTY3NpX0NtbmQgKmNtZCk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZmlsdGVyX2lucXVpcnkoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCSAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKTsKLXN0YXRpYyB2b2lkIGFoZF9saW51eF9kZXZfdGltZWRfdW5mcmVlemUodV9sb25nIGFyZyk7CisJCQkJCSBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogc3RhdGljIHZvaWQgYWhkX2xpbnV4X3NlbV90aW1lb3V0KHVfbG9uZyBhcmcpOworc3RhdGljIGludCAgYWhkX2xpbnV4X3F1ZXVlX3JlY292ZXJ5X2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHNjYl9mbGFnIGZsYWcpOwogc3RhdGljIHZvaWQgYWhkX2xpbnV4X2luaXRpYWxpemVfc2NzaV9idXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXN0YXRpYyB2b2lkIGFoZF9saW51eF9zaXplX25zZWcodm9pZCk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfdGhyZWFkX3J1bl9jb21wbGV0ZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X3N0YXJ0X2R2KHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfdGltZW91dChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwotc3RhdGljIGludCAgYWhkX2xpbnV4X2R2X3RocmVhZCh2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkIGFoZF9saW51eF9raWxsX2R2X3RocmVhZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3RhcmdldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRhcmdldCk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfdHJhbnNpdGlvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJCQkgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAotCQkJCSAgICBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZyk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfZmlsbF9jbWQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCSAgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJCSAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKTsKLXN0YXRpYyB2b2lkIGFoZF9saW51eF9kdl9pbnEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCQkgICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKLQkJCSAgICAgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcsCi0JCQkgICAgIHVfaW50IHJlcXVlc3RfbGVuZ3RoKTsKLXN0YXRpYyB2b2lkIGFoZF9saW51eF9kdl90dXIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCQkgICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfcmViZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCQkgICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCi0JCQkgICAgICBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZyk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfd2ViKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCi0JCQkgICAgIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKTsKLXN0YXRpYyB2b2lkIGFoZF9saW51eF9kdl9yZWIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCQkgICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKLQkJCSAgICAgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3N1KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCQkgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAotCQkJICAgIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKTsKLXN0YXRpYyBpbnQgYWhkX2xpbnV4X2ZhbGxiYWNrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCSAgICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7Ci1zdGF0aWMgX19pbmxpbmUgaW50IGFoZF9saW51eF9kdl9mYWxsYmFjayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJCSAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKTsKLXN0YXRpYyB2b2lkIGFoZF9saW51eF9kdl9jb21wbGV0ZShTY3NpX0NtbmQgKmNtZCk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZ2VuZXJhdGVfZHZfcGF0dGVybihzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZyk7CiBzdGF0aWMgdV9pbnQgYWhkX2xpbnV4X3VzZXJfdGFnZGVwdGgoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAogCQkJCSAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKTsKLXN0YXRpYyB1X2ludCBhaGRfbGludXhfdXNlcl9kdl9zZXR0aW5nKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfc2V0dXBfdXNlcl9yZF9zdHJtX3NldHRpbmdzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZGV2aWNlX3F1ZXVlX2RlcHRoKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkJIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpOwotc3RhdGljIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0KglhaGRfbGludXhfYWxsb2NfdGFyZ2V0KHN0cnVjdCBhaGRfc29mdGMqLAotCQkJCQkJICAgICAgIHVfaW50LCB1X2ludCk7Ci1zdGF0aWMgdm9pZAkJCWFoZF9saW51eF9mcmVlX3RhcmdldChzdHJ1Y3QgYWhkX3NvZnRjKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0Kik7Ci1zdGF0aWMgc3RydWN0IGFoZF9saW51eF9kZXZpY2UqCWFoZF9saW51eF9hbGxvY19kZXZpY2Uoc3RydWN0IGFoZF9zb2Z0YyosCi0JCQkJCQkgICAgICAgc3RydWN0IGFoZF9saW51eF90YXJnZXQqLAotCQkJCQkJICAgICAgIHVfaW50KTsKLXN0YXRpYyB2b2lkCQkJYWhkX2xpbnV4X2ZyZWVfZGV2aWNlKHN0cnVjdCBhaGRfc29mdGMqLAotCQkJCQkJICAgICAgc3RydWN0IGFoZF9saW51eF9kZXZpY2UqKTsKLXN0YXRpYyB2b2lkIGFoZF9saW51eF9ydW5fZGV2aWNlX3F1ZXVlKHN0cnVjdCBhaGRfc29mdGMqLAotCQkJCSAgICAgICBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSopOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitzdGF0aWMgaW50IGFoZF9saW51eF9ydW5fY29tbWFuZChzdHJ1Y3QgYWhkX3NvZnRjKiwKKwkJCQkgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKiwKKwkJCQkgc3RydWN0IHNjc2lfY21uZCAqKTsKIHN0YXRpYyB2b2lkIGFoZF9saW51eF9zZXR1cF90YWdfaW5mb19nbG9iYWwoY2hhciAqcCk7Ci1zdGF0aWMgYWljX29wdGlvbl9jYWxsYmFja190IGFoZF9saW51eF9zZXR1cF90YWdfaW5mbzsKLXN0YXRpYyBhaWNfb3B0aW9uX2NhbGxiYWNrX3QgYWhkX2xpbnV4X3NldHVwX3JkX3N0cm1faW5mbzsKLXN0YXRpYyBhaWNfb3B0aW9uX2NhbGxiYWNrX3QgYWhkX2xpbnV4X3NldHVwX2R2Owotc3RhdGljIGFpY19vcHRpb25fY2FsbGJhY2tfdCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm87Ci1zdGF0aWMgaW50IGFoZF9saW51eF9uZXh0X3VuaXQodm9pZCk7Ci1zdGF0aWMgdm9pZCBhaGRfcnVucV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgaW50IGFpYzc5eHhfc2V0dXAoY2hhciAqYyk7CitzdGF0aWMgaW50ICBhaWM3OXh4X3NldHVwKGNoYXIgKmMpOworCitzdGF0aWMgaW50IGFoZF9saW51eF91bml0OworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5saW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2NoZWR1bGVfY29tcGxldGVxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2NoZWR1bGVfcnVucShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3NldHVwX3J1bnFfdGFza2xldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3RlYXJkb3duX3J1bnFfdGFza2xldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKgotCQkgICAgIGFoZF9saW51eF9nZXRfZGV2aWNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgY2hhbm5lbCwKLQkJCQkJICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgaW50IGFsbG9jKTsKLXN0YXRpYyBzdHJ1Y3QgYWhkX2NtZCAqYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2xpbnV4X2NoZWNrX2RldmljZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJCQkgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpOwotc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICoKLQkJICAgICBhaGRfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbGludXhfcnVuX2RldmljZV9xdWV1ZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIHN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9saW51eF91bm1hcF9zY2Ioc3RydWN0IGFoZF9zb2Z0YyosIHN0cnVjdCBzY2IqKTsKIAogc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9zY2hlZHVsZV9jb21wbGV0ZXEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewotCWlmICgoYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9SVU5fQ01QTFRfUV9USU1FUikgPT0gMCkgewotCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIRF9SVU5fQ01QTFRfUV9USU1FUjsKLQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIuZXhwaXJlcyA9IGppZmZpZXM7Ci0JCWFkZF90aW1lcigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIpOwotCX0KLX0KLQotLyoKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggb3VyIGxvY2sgaGVsZC4KLSAqLwotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9zY2hlZHVsZV9ydW5xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQl0YXNrbGV0X3NjaGVkdWxlKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJ1bnFfdGFza2xldCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZQotdm9pZCBhaGRfc2V0dXBfcnVucV90YXNrbGV0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQl0YXNrbGV0X2luaXQoJmFoZC0+cGxhdGZvcm1fZGF0YS0+cnVucV90YXNrbGV0LCBhaGRfcnVucV90YXNrbGV0LAotCQkgICAgICh1bnNpZ25lZCBsb25nKWFoZCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfdGVhcmRvd25fcnVucV90YXNrbGV0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQl0YXNrbGV0X2tpbGwoJmFoZC0+cGxhdGZvcm1fZGF0YS0+cnVucV90YXNrbGV0KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKgotYWhkX2xpbnV4X2dldF9kZXZpY2Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBjaGFubmVsLCB1X2ludCB0YXJnZXQsCi0JCSAgICAgdV9pbnQgbHVuLCBpbnQgYWxsb2MpCi17Ci0Jc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmc7Ci0Jc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKLQl1X2ludCB0YXJnZXRfb2Zmc2V0OwotCi0JdGFyZ2V0X29mZnNldCA9IHRhcmdldDsKLQlpZiAoY2hhbm5lbCAhPSAwKQotCQl0YXJnZXRfb2Zmc2V0ICs9IDg7Ci0JdGFyZyA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1t0YXJnZXRfb2Zmc2V0XTsKLQlpZiAodGFyZyA9PSBOVUxMKSB7Ci0JCWlmIChhbGxvYyAhPSAwKSB7Ci0JCQl0YXJnID0gYWhkX2xpbnV4X2FsbG9jX3RhcmdldChhaGQsIGNoYW5uZWwsIHRhcmdldCk7Ci0JCQlpZiAodGFyZyA9PSBOVUxMKQotCQkJCXJldHVybiAoTlVMTCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JZGV2ID0gdGFyZy0+ZGV2aWNlc1tsdW5dOwotCWlmIChkZXYgPT0gTlVMTCAmJiBhbGxvYyAhPSAwKQotCQlkZXYgPSBhaGRfbGludXhfYWxsb2NfZGV2aWNlKGFoZCwgdGFyZywgbHVuKTsKLQlyZXR1cm4gKGRldik7Ci19Ci0KLSNkZWZpbmUgQUhEX0xJTlVYX01BWF9SRVRVUk5FRF9FUlJPUlMgNAotc3RhdGljIHN0cnVjdCBhaGRfY21kICoKLWFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewkKLQlzdHJ1Y3QJYWhkX2NtZCAqYWNtZDsKLQl1X2xvbmcJZG9uZV9mbGFnczsKLQlpbnQJd2l0aF9lcnJvcnM7Ci0KLQl3aXRoX2Vycm9ycyA9IDA7Ci0JYWhkX2RvbmVfbG9jayhhaGQsICZkb25lX2ZsYWdzKTsKLQl3aGlsZSAoKGFjbWQgPSBUQUlMUV9GSVJTVCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXEpKSAhPSBOVUxMKSB7Ci0JCVNjc2lfQ21uZCAqY21kOwotCi0JCWlmICh3aXRoX2Vycm9ycyA+IEFIRF9MSU5VWF9NQVhfUkVUVVJORURfRVJST1JTKSB7Ci0JCQkvKgotCQkJICogTGludXggdXNlcyBzdGFjayByZWN1cnNpb24gdG8gcmVxdWV1ZQotCQkJICogY29tbWFuZHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZWQuICBBdm9pZAotCQkJICogYmxvd2luZyBvdXQgdGhlIHN0YWNrIGJ5ICJzcG9vbiBmZWVkaW5nIgotCQkJICogY29tbWFuZHMgdGhhdCBjb21wbGV0ZWQgd2l0aCBlcnJvciBiYWNrCi0JCQkgKiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpbiBjYXNlIHRoZXkgYXJlIGdvaW5nCi0JCQkgKiB0byBiZSByZXRyaWVkLiAiaWNrIgotCQkJICovCi0JCQlhaGRfc2NoZWR1bGVfY29tcGxldGVxKGFoZCk7Ci0JCQlicmVhazsKLQkJfQotCQlUQUlMUV9SRU1PVkUoJmFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxLAotCQkJICAgICBhY21kLCBhY21kX2xpbmtzLnRxZSk7Ci0JCWNtZCA9ICZhY21kX3Njc2lfY21kKGFjbWQpOwotCQljbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOwotCQlpZiAoYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkgIT0gRElEX09LCi0JCSB8fCAoY21kLT5yZXN1bHQgJiAweEZGKSAhPSBTQ1NJX1NUQVRVU19PSykKLQkJCXdpdGhfZXJyb3JzKys7Ci0KLQkJY21kLT5zY3NpX2RvbmUoY21kKTsKLQl9Ci0JYWhkX2RvbmVfdW5sb2NrKGFoZCwgJmRvbmVfZmxhZ3MpOwotCXJldHVybiAoYWNtZCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfbGludXhfY2hlY2tfZGV2aWNlX3F1ZXVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCSAgICAgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldikKLXsKLQlpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX0ZSRUVaRV9USUxfRU1QVFkpICE9IDAKLQkgJiYgZGV2LT5hY3RpdmUgPT0gMCkgewotCQlkZXYtPmZsYWdzICY9IH5BSERfREVWX0ZSRUVaRV9USUxfRU1QVFk7Ci0JCWRldi0+cWZyb3plbi0tOwotCX0KLQotCWlmIChUQUlMUV9GSVJTVCgmZGV2LT5idXN5cSkgPT0gTlVMTAotCSB8fCBkZXYtPm9wZW5pbmdzID09IDAgfHwgZGV2LT5xZnJvemVuICE9IDApCi0JCXJldHVybjsKLQotCWFoZF9saW51eF9ydW5fZGV2aWNlX3F1ZXVlKGFoZCwgZGV2KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICoKLWFoZF9saW51eF9uZXh0X2RldmljZV90b19ydW4oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewotCQotCWlmICgoYWhkLT5mbGFncyAmIEFIRF9SRVNPVVJDRV9TSE9SVEFHRSkgIT0gMAotCSB8fCAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuICE9IDAKLQkgICYmIEFIRF9EVl9TSU1RX0ZST1pFTihhaGQpID09IDApKQotCQlyZXR1cm4gKE5VTEwpOwotCXJldHVybiAoVEFJTFFfRklSU1QoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEpKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9saW51eF9ydW5fZGV2aWNlX3F1ZXVlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0Jc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKLQotCXdoaWxlICgoZGV2ID0gYWhkX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihhaGQpKSAhPSBOVUxMKSB7Ci0JCVRBSUxRX1JFTU9WRSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwgZGV2LCBsaW5rcyk7Ci0JCWRldi0+ZmxhZ3MgJj0gfkFIRF9ERVZfT05fUlVOX0xJU1Q7Ci0JCWFoZF9saW51eF9jaGVja19kZXZpY2VfcXVldWUoYWhkLCBkZXYpOwotCX0KLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKIGFoZF9saW51eF91bm1hcF9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCiB7Ci0JU2NzaV9DbW5kICpjbWQ7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOwogCWludCBkaXJlY3Rpb247CiAKIAljbWQgPSBzY2ItPmlvX2N0eDsKQEAgLTcwNSwxOTcgKzM5OSw2IEBACiAjZGVmaW5lIEJVSUxEX1NDU0lJRChhaGQsIGNtZCkJCQkJCQlcCiAJKCgoKGNtZCktPmRldmljZS0+aWQgPDwgVElEX1NISUZUKSAmIFRJRCkgfCAoYWhkKS0+b3VyX2lkKQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqICBIb3N0IHRlbXBsYXRlIGVudHJ5IHBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAkgICBhaGRfbGludXhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKLXN0YXRpYyBjb25zdCBjaGFyICphaGRfbGludXhfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOwotc3RhdGljIGludAkgICBhaGRfbGludXhfcXVldWUoU2NzaV9DbW5kICosIHZvaWQgKCopKFNjc2lfQ21uZCAqKSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotc3RhdGljIGludAkgICBhaGRfbGludXhfc2xhdmVfYWxsb2MoU2NzaV9EZXZpY2UgKik7Ci1zdGF0aWMgaW50CSAgIGFoZF9saW51eF9zbGF2ZV9jb25maWd1cmUoU2NzaV9EZXZpY2UgKik7Ci1zdGF0aWMgdm9pZAkgICBhaGRfbGludXhfc2xhdmVfZGVzdHJveShTY3NpX0RldmljZSAqKTsKLSNpZiBkZWZpbmVkKF9faTM4Nl9fKQotc3RhdGljIGludAkgICBhaGRfbGludXhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSosCi0JCQkJICAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UqLCBzZWN0b3JfdCwgaW50W10pOwotI2VuZGlmCi0jZWxzZQotc3RhdGljIGludAkgICBhaGRfbGludXhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICopOwotc3RhdGljIHZvaWQJICAgYWhkX2xpbnV4X3NlbGVjdF9xdWV1ZV9kZXB0aChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LAotCQkJCQkJU2NzaV9EZXZpY2UgKnNjc2lfZGV2cyk7Ci0jaWYgZGVmaW5lZChfX2kzODZfXykKLXN0YXRpYyBpbnQJICAgYWhkX2xpbnV4X2Jpb3NwYXJhbShEaXNrICosIGtkZXZfdCwgaW50W10pOwotI2VuZGlmCi0jZW5kaWYKLXN0YXRpYyBpbnQJICAgYWhkX2xpbnV4X2J1c19yZXNldChTY3NpX0NtbmQgKik7Ci1zdGF0aWMgaW50CSAgIGFoZF9saW51eF9kZXZfcmVzZXQoU2NzaV9DbW5kICopOwotc3RhdGljIGludAkgICBhaGRfbGludXhfYWJvcnQoU2NzaV9DbW5kICopOwotCi0vKgotICogQ2FsY3VsYXRlIGEgc2FmZSB2YWx1ZSBmb3IgQUhEX05TRUcgKGFzIGV4cHJlc3NlZCB0aHJvdWdoIGFoZF9saW51eF9uc2VnKS4KLSAqCi0gKiBJbiBwcmUtMi41LlguLi4KLSAqIFRoZSBtaWRsYXllciBhbGxvY2F0ZXMgYW4gUy9HIGFycmF5IGR5bmFtaWNhbGx5IHdoZW4gYSBjb21tYW5kIGlzIGlzc3VlZAotICogdXNpbmcgU0NTSSBtYWxsb2MuICBUaGlzIGFycmF5LCB3aGljaCBpcyBpbiBhbiBPUyBkZXBlbmRlbnQgZm9ybWF0IHRoYXQKLSAqIG11c3QgbGF0ZXIgYmUgY29waWVkIHRvIG91ciBwcml2YXRlIFMvRyBsaXN0LCBpcyBzaXplZCB0byBob3VzZSBqdXN0IHRoZQotICogbnVtYmVyIG9mIHNlZ21lbnRzIG5lZWRlZCBmb3IgdGhlIGN1cnJlbnQgdHJhbnNmZXIuICBTaW5jZSB0aGUgY29kZSB0aGF0Ci0gKiBzaXplcyB0aGUgU0NTSSBtYWxsb2MgcG9vbCBkb2VzIG5vdCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiBmcmFnbWVudGF0aW9uCi0gKiBvZiB0aGUgcG9vbCwgZXhlY3V0aW5nIHRyYW5zYWN0aW9ucyBudW1iZXJpbmcganVzdCBhIGZyYWN0aW9uIG9mIG91cgotICogY29uY3VycmVudCB0cmFuc2FjdGlvbiBsaW1pdCB3aXRoIFNHIGxpc3QgbGVuZ3RocyBhcHJvYWNoaW5nIEFIQ19OU0VHIHdpbGwKLSAqIHF1aWNrbHkgZGVwbGVhdCB0aGUgU0NTSSBtYWxsb2MgcG9vbCBvZiB1c2FibGUgc3BhY2UuICBVbmZvcnR1bmF0ZWx5LCB0aGUKLSAqIG1pZC1sYXllciBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgdGhpcyBzY3NpIG1hbGxvYyBmYWlsdXJlcyBmb3IgdGhlIFMvRwotICogYXJyYXkgYW5kIHRoZSByZXN1bHQgY2FuIGJlIGEgbG9ja3VwIG9mIHRoZSBJL08gc3Vic3lzdGVtLiAgV2UgdHJ5IHRvIHNpemUKLSAqIG91ciBTL0cgbGlzdCBzbyB0aGF0IGl0IHNhdGlzZmllcyBvdXIgZHJpdmVycyBhbGxvY2F0aW9uIHJlcXVpcmVtZW50cyBpbgotICogYWRkaXRpb24gdG8gYXZvaWRpbmcgZnJhZ21lbnRhdGlvbiBvZiB0aGUgU0NTSSBtYWxsb2MgcG9vbC4KLSAqLwotc3RhdGljIHZvaWQKLWFoZF9saW51eF9zaXplX25zZWcodm9pZCkKLXsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQl1X2ludCBjdXJfc2l6ZTsKLQl1X2ludCBiZXN0X3NpemU7Ci0KLQkvKgotCSAqIFRoZSBTQ1NJIGFsbG9jYXRvciByb3VuZHMgdG8gdGhlIG5lYXJlc3QgNTEyIGJ5dGVzCi0JICogYW4gY2Fubm90IGFsbG9jYXRlIGFjcm9zcyBhIHBhZ2UgYm91bmRhcnkuICBPdXIgYWxnb3JpdGhtCi0JICogaXMgdG8gc3RhcnQgYXQgMUsgb2Ygc2NzaSBtYWxsb2Mgc3BhY2UgcGVyLWNvbW1hbmQgYW5kCi0JICogbG9vcCB0aHJvdWdoIGFsbCBmYWN0b3JzIG9mIHRoZSBQQUdFX1NJWkUgYW5kIHBpY2sgdGhlIGJlc3QuCi0JICovCi0JYmVzdF9zaXplID0gMDsKLQlmb3IgKGN1cl9zaXplID0gMTAyNDsgY3VyX3NpemUgPD0gUEFHRV9TSVpFOyBjdXJfc2l6ZSAqPSAyKSB7Ci0JCXVfaW50IG5zZWc7Ci0KLQkJbnNlZyA9IGN1cl9zaXplIC8gc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7Ci0JCWlmIChuc2VnIDwgQUhEX0xJTlVYX01JTl9OU0VHKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGJlc3Rfc2l6ZSA9PSAwKSB7Ci0JCQliZXN0X3NpemUgPSBjdXJfc2l6ZTsKLQkJCWFoZF9saW51eF9uc2VnID0gbnNlZzsKLQkJfSBlbHNlIHsKLQkJCXVfaW50IGJlc3RfcmVtOwotCQkJdV9pbnQgY3VyX3JlbTsKLQotCQkJLyoKLQkJCSAqIENvbXBhcmUgdGhlIHRyYWl0cyBvZiB0aGUgY3VycmVudCAiYmVzdF9zaXplIgotCQkJICogd2l0aCB0aGUgY3VycmVudCBzaXplIHRvIGRldGVybWluZSBpZiB0aGUKLQkJCSAqIGN1cnJlbnQgc2l6ZSBpcyBhIGJldHRlciBzaXplLgotCQkJICovCi0JCQliZXN0X3JlbSA9IGJlc3Rfc2l6ZSAlIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpOwotCQkJY3VyX3JlbSA9IGN1cl9zaXplICUgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7Ci0JCQlpZiAoY3VyX3JlbSA8IGJlc3RfcmVtKSB7Ci0JCQkJYmVzdF9zaXplID0gY3VyX3NpemU7Ci0JCQkJYWhkX2xpbnV4X25zZWcgPSBuc2VnOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmCi19Ci0KLS8qCi0gKiBUcnkgdG8gZGV0ZWN0IGFuIEFkYXB0ZWMgNzlYWCBjb250cm9sbGVyLgotICovCi1zdGF0aWMgaW50Ci1haGRfbGludXhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdGVtcGxhdGUpCi17Ci0Jc3RydWN0CWFoZF9zb2Z0YyAqYWhkOwotCWludCAgICAgZm91bmQ7Ci0JaW50CWVycm9yID0gMDsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCS8qCi0JICogSXQgaXMgYSBidWcgdGhhdCB0aGUgdXBwZXIgbGF5ZXIgdGFrZXMKLQkgKiB0aGlzIGxvY2sganVzdCBwcmlvciB0byBjYWxsaW5nIHVzLgotCSAqLwotCXNwaW5fdW5sb2NrX2lycSgmaW9fcmVxdWVzdF9sb2NrKTsKLSNlbmRpZgotCi0JLyoKLQkgKiBTYW5pdHkgY2hlY2tpbmcgb2YgTGludXggU0NTSSBkYXRhIHN0cnVjdHVyZXMgc28KLQkgKiB0aGF0IHNvbWUgb2Ygb3VyIGhhY2tzXkheSF5IXkheSGFzc3VtcHRpb25zIGFyZW4ndAotCSAqIHZpb2xhdGVkLgotCSAqLwotCWlmIChvZmZzZXRvZihzdHJ1Y3QgYWhkX2NtZF9pbnRlcm5hbCwgZW5kKQotCSAgPiBvZmZzZXRvZihzdHJ1Y3Qgc2NzaV9jbW5kLCBob3N0X3NjcmliYmxlKSkgewotCQlwcmludGYoImFoZF9saW51eF9kZXRlY3Q6IFNDU0kgZGF0YSBzdHJ1Y3R1cmVzIGNoYW5nZWQuXG4iKTsKLQkJcHJpbnRmKCJhaGRfbGludXhfZGV0ZWN0OiBVbmFibGUgdG8gYXR0YWNoXG4iKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JLyoKLQkgKiBEZXRlcm1pbmUgYW4gYXBwcm9wcmlhdGUgc2l6ZSBmb3Igb3VyIFNjYXR0ZXIgR2F0dGhlciBsaXN0cy4KLQkgKi8KLQlhaGRfbGludXhfc2l6ZV9uc2VnKCk7Ci0jaWZkZWYgTU9EVUxFCi0JLyoKLQkgKiBJZiB3ZSd2ZSBiZWVuIHBhc3NlZCBhbnkgcGFyYW1ldGVycywgcHJvY2VzcyB0aGVtIG5vdy4KLQkgKi8KLQlpZiAoYWljNzl4eCkKLQkJYWljNzl4eF9zZXR1cChhaWM3OXh4KTsKLSNlbmRpZgotCi0JdGVtcGxhdGUtPnByb2NfbmFtZSA9ICJhaWM3OXh4IjsKLQotCS8qCi0JICogSW5pdGlhbGl6ZSBvdXIgc29mdGMgbGlzdCBsb2NrIHByaW9yIHRvCi0JICogcHJvYmluZyBmb3IgYW55IGFkYXB0ZXJzLgotCSAqLwotCWFoZF9saXN0X2xvY2tpbml0KCk7Ci0KLSNpZmRlZiBDT05GSUdfUENJCi0JZXJyb3IgPSBhaGRfbGludXhfcGNpX2luaXQoKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLSNlbmRpZgotCi0JLyoKLQkgKiBSZWdpc3RlciB3aXRoIHRoZSBTQ1NJIGxheWVyIGFsbAotCSAqIGNvbnRyb2xsZXJzIHdlJ3ZlIGZvdW5kLgotCSAqLwotCWZvdW5kID0gMDsKLQlUQUlMUV9GT1JFQUNIKGFoZCwgJmFoZF90YWlscSwgbGlua3MpIHsKLQotCQlpZiAoYWhkX2xpbnV4X3JlZ2lzdGVyX2hvc3QoYWhkLCB0ZW1wbGF0ZSkgPT0gMCkKLQkJCWZvdW5kKys7Ci0JfQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXNwaW5fbG9ja19pcnEoJmlvX3JlcXVlc3RfbG9jayk7Ci0jZW5kaWYKLQlhaWM3OXh4X2RldGVjdF9jb21wbGV0ZSsrOwotCXJldHVybiAwOwotfQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0vKgotICogRnJlZSB0aGUgcGFzc2VkIGluIFNjc2lfSG9zdCBtZW1vcnkgc3RydWN0dXJlcyBwcmlvciB0byB1bmxvYWRpbmcgdGhlCi0gKiBtb2R1bGUuCi0gKi8KLXN0YXRpYyBpbnQKLWFoZF9saW51eF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKiBob3N0KQotewotCXN0cnVjdCBhaGRfc29mdGMgKmFoZDsKLQl1X2xvbmcgbDsKLQotCWFoZF9saXN0X2xvY2soJmwpOwotCWlmIChob3N0ICE9IE5VTEwpIHsKLQotCQkvKgotCQkgKiBXZSBzaG91bGQgYmUgYWJsZSB0byBqdXN0IHBlcmZvcm0KLQkJICogdGhlIGZyZWUgZGlyZWN0bHksIGJ1dCBjaGVjayBvdXIKLQkJICogbGlzdCBmb3IgZXh0cmEgc2FuaXR5LgotCQkgKi8KLQkJYWhkID0gYWhkX2ZpbmRfc29mdGMoKihzdHJ1Y3QgYWhkX3NvZnRjICoqKWhvc3QtPmhvc3RkYXRhKTsKLQkJaWYgKGFoZCAhPSBOVUxMKSB7Ci0JCQl1X2xvbmcgczsKLQotCQkJYWhkX2xvY2soYWhkLCAmcyk7Ci0JCQlhaGRfaW50cl9lbmFibGUoYWhkLCBGQUxTRSk7Ci0JCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCQkJYWhkX2ZyZWUoYWhkKTsKLQkJfQotCX0KLQlhaGRfbGlzdF91bmxvY2soJmwpOwotCXJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLQogLyoKICAqIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBkcml2ZXIuCiAgKi8KQEAgLTkyOCwyMjAgKzQzMSwxNzcgQEAKICAqIFF1ZXVlIGFuIFNDQiB0byB0aGUgY29udHJvbGxlci4KICAqLwogc3RhdGljIGludAotYWhkX2xpbnV4X3F1ZXVlKFNjc2lfQ21uZCAqIGNtZCwgdm9pZCAoKnNjc2lfZG9uZSkgKFNjc2lfQ21uZCAqKSkKK2FoZF9saW51eF9xdWV1ZShzdHJ1Y3Qgc2NzaV9jbW5kICogY21kLCB2b2lkICgqc2NzaV9kb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKIHsKIAlzdHJ1Y3QJIGFoZF9zb2Z0YyAqYWhkOwotCXN0cnVjdAkgYWhkX2xpbnV4X2RldmljZSAqZGV2OwotCXVfbG9uZwkgZmxhZ3M7CisJc3RydWN0CSBhaGRfbGludXhfZGV2aWNlICpkZXYgPSBzY3NpX3RyYW5zcG9ydF9kZXZpY2VfZGF0YShjbWQtPmRldmljZSk7CiAKIAlhaGQgPSAqKHN0cnVjdCBhaGRfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwogCiAJLyoKLQkgKiBTYXZlIHRoZSBjYWxsYmFjayBvbiBjb21wbGV0aW9uIGZ1bmN0aW9uLgotCSAqLwotCWNtZC0+c2NzaV9kb25lID0gc2NzaV9kb25lOwotCi0JYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGQsICZmbGFncyk7Ci0KLQkvKgogCSAqIENsb3NlIHRoZSByYWNlIG9mIGEgY29tbWFuZCB0aGF0IHdhcyBpbiB0aGUgcHJvY2VzcyBvZgogCSAqIGJlaW5nIHF1ZXVlZCB0byB1cyBqdXN0IGFzIG91ciBzaW1xIHdhcyBmcm96ZW4uICBMZXQKIAkgKiBEViBjb21tYW5kcyB0aHJvdWdoIHNvIGxvbmcgYXMgd2UgYXJlIG9ubHkgZnJvemVuIHRvCiAJICogcGVyZm9ybSBEVi4KIAkgKi8KLQlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuICE9IDAKLQkgJiYgQUhEX0RWX0NNRChjbWQpID09IDApIHsKKwlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuICE9IDApIHsKKwkJcHJpbnRmKCIlczogcXVldWUgZnJvemVuXG4iLCBhaGRfbmFtZShhaGQpKTsKIAotCQlhaGRfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kLCBDQU1fUkVRVUVVRV9SRVEpOwotCQlhaGRfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKGFoZCwgY21kKTsKLQkJYWhkX3NjaGVkdWxlX2NvbXBsZXRlcShhaGQpOwotCQlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhkLCAmZmxhZ3MpOwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKIAl9Ci0JZGV2ID0gYWhkX2xpbnV4X2dldF9kZXZpY2UoYWhkLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwKLQkJCQkgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sCi0JCQkJICAgLyphbGxvYyovVFJVRSk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWFoZF9jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQsIENBTV9SRVNSQ19VTkFWQUlMKTsKLQkJYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGQsIGNtZCk7Ci0JCWFoZF9zY2hlZHVsZV9jb21wbGV0ZXEoYWhkKTsKLQkJYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKLQkJcHJpbnRmKCIlczogYWljNzl4eF9saW51eF9xdWV1ZSAtIFVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UhXG4iLAotCQkgICAgICAgYWhkX25hbWUoYWhkKSk7Ci0JCXJldHVybiAoMCk7Ci0JfQotCWlmIChjbWQtPmNtZF9sZW4gPiBNQVhfQ0RCX0xFTikKLQkJcmV0dXJuICgtRUlOVkFMKTsKKworCS8qCisJICogU2F2ZSB0aGUgY2FsbGJhY2sgb24gY29tcGxldGlvbiBmdW5jdGlvbi4KKwkgKi8KKwljbWQtPnNjc2lfZG9uZSA9IHNjc2lfZG9uZTsKKwogCWNtZC0+cmVzdWx0ID0gQ0FNX1JFUV9JTlBST0cgPDwgMTY7Ci0JVEFJTFFfSU5TRVJUX1RBSUwoJmRldi0+YnVzeXEsIChzdHJ1Y3QgYWhkX2NtZCAqKWNtZCwgYWNtZF9saW5rcy50cWUpOwotCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfT05fUlVOX0xJU1QpID09IDApIHsKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEsIGRldiwgbGlua3MpOwotCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfT05fUlVOX0xJU1Q7Ci0JCWFoZF9saW51eF9ydW5fZGV2aWNlX3F1ZXVlcyhhaGQpOwotCX0KLQlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhkLCAmZmxhZ3MpOwotCXJldHVybiAoMCk7CisKKwlyZXR1cm4gYWhkX2xpbnV4X3J1bl9jb21tYW5kKGFoZCwgZGV2LCBjbWQpOwogfQogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotc3RhdGljIGludAotYWhkX2xpbnV4X3NsYXZlX2FsbG9jKFNjc2lfRGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzY3NpX3RhcmdldCAqKgorYWhkX2xpbnV4X3RhcmdldF9pbl9zb2Z0YyhzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCiB7Ci0Jc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCXN0cnVjdAlhaGRfc29mdGMgKmFoZCA9CisJCSooKHN0cnVjdCBhaGRfc29mdGMgKiopZGV2X3RvX3Nob3N0KCZzdGFyZ2V0LT5kZXYpLT5ob3N0ZGF0YSk7CisJdW5zaWduZWQgaW50IHRhcmdldF9vZmZzZXQ7CiAKLQlhaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWRldmljZS0+aG9zdC0+aG9zdGRhdGEpOwotCWlmIChib290dmVyYm9zZSkKLQkJcHJpbnRmKCIlczogU2xhdmUgQWxsb2MgJWRcbiIsIGFoZF9uYW1lKGFoZCksIGRldmljZS0+aWQpOwotCXJldHVybiAoMCk7CisJdGFyZ2V0X29mZnNldCA9IHN0YXJnZXQtPmlkOworCWlmIChzdGFyZ2V0LT5jaGFubmVsICE9IDApCisJCXRhcmdldF9vZmZzZXQgKz0gODsKKworCXJldHVybiAmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zdGFyZ2V0W3RhcmdldF9vZmZzZXRdOwogfQogCiBzdGF0aWMgaW50Ci1haGRfbGludXhfc2xhdmVfY29uZmlndXJlKFNjc2lfRGV2aWNlICpkZXZpY2UpCithaGRfbGludXhfdGFyZ2V0X2FsbG9jKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKIHsKLQlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7Ci0Jc3RydWN0CWFoZF9saW51eF9kZXZpY2UgKmRldjsKLQl1X2xvbmcJZmxhZ3M7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkID0KKwkJKigoc3RydWN0IGFoZF9zb2Z0YyAqKilkZXZfdG9fc2hvc3QoJnN0YXJnZXQtPmRldiktPmhvc3RkYXRhKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzY3NpX3RhcmdldCAqKmFoZF90YXJncCA9IGFoZF9saW51eF90YXJnZXRfaW5fc29mdGMoc3RhcmdldCk7CisJc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcgPSBzY3NpX3RyYW5zcG9ydF90YXJnZXRfZGF0YShzdGFyZ2V0KTsKKwlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKwlzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwljaGFyIGNoYW5uZWwgPSBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnOwogCi0JYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilkZXZpY2UtPmhvc3QtPmhvc3RkYXRhKTsKLQlpZiAoYm9vdHZlcmJvc2UpCi0JCXByaW50ZigiJXM6IFNsYXZlIENvbmZpZ3VyZSAlZFxuIiwgYWhkX25hbWUoYWhkKSwgZGV2aWNlLT5pZCk7Ci0JYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGQsICZmbGFncyk7Ci0JLyoKLQkgKiBTaW5jZSBMaW51eCBoYXMgYXR0YWNoZWQgdG8gdGhlIGRldmljZSwgY29uZmlndXJlCi0JICogaXQgc28gd2UgZG9uJ3QgZnJlZSBhbmQgYWxsb2NhdGUgdGhlIGRldmljZQotCSAqIHN0cnVjdHVyZSBvbiBldmVyeSBjb21tYW5kLgotCSAqLwotCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgZGV2aWNlLT5jaGFubmVsLAotCQkJCSAgIGRldmljZS0+aWQsIGRldmljZS0+bHVuLAotCQkJCSAgIC8qYWxsb2MqL1RSVUUpOwotCWlmIChkZXYgIT0gTlVMTCkgewotCQlkZXYtPmZsYWdzICY9IH5BSERfREVWX1VOQ09ORklHVVJFRDsKLQkJZGV2LT5mbGFncyB8PSBBSERfREVWX1NMQVZFX0NPTkZJR1VSRUQ7Ci0JCWRldi0+c2NzaV9kZXZpY2UgPSBkZXZpY2U7Ci0JCWFoZF9saW51eF9kZXZpY2VfcXVldWVfZGVwdGgoYWhkLCBkZXYpOwotCX0KLQlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhkLCAmZmxhZ3MpOwotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfc2xhdmVfZGVzdHJveShTY3NpX0RldmljZSAqZGV2aWNlKQotewotCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKLQlzdHJ1Y3QJYWhkX2xpbnV4X2RldmljZSAqZGV2OwotCXVfbG9uZwlmbGFnczsKLQotCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7Ci0JaWYgKGJvb3R2ZXJib3NlKQotCQlwcmludGYoIiVzOiBTbGF2ZSBEZXN0cm95ICVkXG4iLCBhaGRfbmFtZShhaGQpLCBkZXZpY2UtPmlkKTsKLQlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKGFoZCwgJmZsYWdzKTsKLQlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIGRldmljZS0+Y2hhbm5lbCwKLQkJCQkgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1biwKLQkJCQkJICAgLyphbGxvYyovRkFMU0UpOwotCi0JLyoKLQkgKiBGaWx0ZXIgb3V0ICJzaWxseSIgZGVsZXRpb25zIG9mIHJlYWwgZGV2aWNlcyBieSBvbmx5Ci0JICogZGVsZXRpbmcgZGV2aWNlcyB0aGF0IGhhdmUgaGFkIHNsYXZlX2NvbmZpZ3VyZSgpCi0JICogY2FsbGVkIG9uIHRoZW0uICBBbGwgb3RoZXIgZGV2aWNlcyB0aGF0IGhhdmUgbm90Ci0JICogYmVlbiBjb25maWd1cmVkIHdpbGwgYXV0b21hdGljYWxseSBiZSBkZWxldGVkIGJ5Ci0JICogdGhlIHJlZmNvdW50aW5nIHByb2Nlc3MuCi0JICovCi0JaWYgKGRldiAhPSBOVUxMCi0JICYmIChkZXYtPmZsYWdzICYgQUhEX0RFVl9TTEFWRV9DT05GSUdVUkVEKSAhPSAwKSB7Ci0JCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9VTkNPTkZJR1VSRUQ7Ci0JCWlmIChUQUlMUV9FTVBUWSgmZGV2LT5idXN5cSkKLQkJICYmIGRldi0+YWN0aXZlID09IDAKLQkJICYmIChkZXYtPmZsYWdzICYgQUhEX0RFVl9USU1FUl9BQ1RJVkUpID09IDApCi0JCQlhaGRfbGludXhfZnJlZV9kZXZpY2UoYWhkLCBkZXYpOwotCX0KLQlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhkLCAmZmxhZ3MpOwotfQotI2Vsc2UKLS8qCi0gKiBTZXRzIHRoZSBxdWV1ZSBkZXB0aCBmb3IgZWFjaCBTQ1NJIGRldmljZSBoYW5naW5nCi0gKiBvZmYgdGhlIGlucHV0IGhvc3QgYWRhcHRlci4KLSAqLwotc3RhdGljIHZvaWQKLWFoZF9saW51eF9zZWxlY3RfcXVldWVfZGVwdGgoc3RydWN0IFNjc2lfSG9zdCAqIGhvc3QsCi0JCQkgICAgIFNjc2lfRGV2aWNlICogc2NzaV9kZXZzKQotewotCVNjc2lfRGV2aWNlICpkZXZpY2U7Ci0JU2NzaV9EZXZpY2UgKmxkZXY7Ci0Jc3RydWN0CWFoZF9zb2Z0YyAqYWhkOwotCXVfbG9uZwlmbGFnczsKLQotCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopaG9zdC0+aG9zdGRhdGEpOwogCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKLQlmb3IgKGRldmljZSA9IHNjc2lfZGV2czsgZGV2aWNlICE9IE5VTEw7IGRldmljZSA9IGRldmljZS0+bmV4dCkgewogCi0JCS8qCi0JCSAqIFdhdGNoIG91dCBmb3IgZHVwbGljYXRlIGRldmljZXMuICBUaGlzIHdvcmtzIGFyb3VuZAotCQkgKiBzb21lIHF1aXJrcyBpbiBob3cgdGhlIFNDU0kgc2Nhbm5pbmcgY29kZSBkb2VzIGl0cwotCQkgKiBkZXZpY2UgbWFuYWdlbWVudC4KLQkJICovCi0JCWZvciAobGRldiA9IHNjc2lfZGV2czsgbGRldiAhPSBkZXZpY2U7IGxkZXYgPSBsZGV2LT5uZXh0KSB7Ci0JCQlpZiAobGRldi0+aG9zdCA9PSBkZXZpY2UtPmhvc3QKLQkJCSAmJiBsZGV2LT5jaGFubmVsID09IGRldmljZS0+Y2hhbm5lbAotCQkJICYmIGxkZXYtPmlkID09IGRldmljZS0+aWQKLQkJCSAmJiBsZGV2LT5sdW4gPT0gZGV2aWNlLT5sdW4pCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLyogU2tpcCBkdXBsaWNhdGUuICovCi0JCWlmIChsZGV2ICE9IGRldmljZSkKLQkJCWNvbnRpbnVlOworCUJVR19PTigqYWhkX3RhcmdwICE9IE5VTEwpOwogCi0JCWlmIChkZXZpY2UtPmhvc3QgPT0gaG9zdCkgewotCQkJc3RydWN0CSBhaGRfbGludXhfZGV2aWNlICpkZXY7CisJKmFoZF90YXJncCA9IHN0YXJnZXQ7CisJbWVtc2V0KHRhcmcsIDAsIHNpemVvZigqdGFyZykpOwogCi0JCQkvKgotCQkJICogU2luY2UgTGludXggaGFzIGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UsIGNvbmZpZ3VyZQotCQkJICogaXQgc28gd2UgZG9uJ3QgZnJlZSBhbmQgYWxsb2NhdGUgdGhlIGRldmljZQotCQkJICogc3RydWN0dXJlIG9uIGV2ZXJ5IGNvbW1hbmQuCi0JCQkgKi8KLQkJCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgZGV2aWNlLT5jaGFubmVsLAotCQkJCQkJICAgZGV2aWNlLT5pZCwgZGV2aWNlLT5sdW4sCi0JCQkJCQkgICAvKmFsbG9jKi9UUlVFKTsKLQkJCWlmIChkZXYgIT0gTlVMTCkgewotCQkJCWRldi0+ZmxhZ3MgJj0gfkFIRF9ERVZfVU5DT05GSUdVUkVEOwotCQkJCWRldi0+c2NzaV9kZXZpY2UgPSBkZXZpY2U7Ci0JCQkJYWhkX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChhaGQsIGRldik7Ci0JCQkJZGV2aWNlLT5xdWV1ZV9kZXB0aCA9IGRldi0+b3BlbmluZ3MKLQkJCQkJCSAgICArIGRldi0+YWN0aXZlOwotCQkJCWlmICgoZGV2LT5mbGFncyAmIChBSERfREVWX1FfQkFTSUMKLQkJCQkJCXwgQUhEX0RFVl9RX1RBR0dFRCkpID09IDApIHsKLQkJCQkJLyoKLQkJCQkJICogV2UgYWxsb3cgdGhlIE9TIHRvIHF1ZXVlIDIgdW50YWdnZWQKLQkJCQkJICogdHJhbnNhY3Rpb25zIHRvIHVzIGF0IGFueSB0aW1lIGV2ZW4KLQkJCQkJICogdGhvdWdoIHdlIGNhbiBvbmx5IGV4ZWN1dGUgdGhlbQotCQkJCQkgKiBzZXJpYWxseSBvbiB0aGUgY29udHJvbGxlci9kZXZpY2UuCi0JCQkJCSAqIFRoaXMgc2hvdWxkIHJlbW92ZSBzb21lIGxhdGVuY3kuCi0JCQkJCSAqLwotCQkJCQlkZXZpY2UtPnF1ZXVlX2RlcHRoID0gMjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgY2hhbm5lbCwgYWhkLT5vdXJfaWQsCisJCQkJICAgIHN0YXJnZXQtPmlkLCAmdHN0YXRlKTsKKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBhaGQtPm91cl9pZCwgc3RhcmdldC0+aWQsCisJCQkgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgY2hhbm5lbCwKKwkJCSAgICBST0xFX0lOSVRJQVRPUik7CisJc3BpX21pbl9wZXJpb2Qoc3RhcmdldCkgPSBBSERfU1lOQ1JBVEVfTUFYOyAvKiBXZSBjYW4gZG8gVTMyMCAqLworCWlmICgoYWhkLT5idWdzICYgQUhEX1BBQ0VEX05FR1RBQkxFX0JVRykgIT0gMCkKKwkJc3BpX21heF9vZmZzZXQoc3RhcmdldCkgPSBNQVhfT0ZGU0VUX1BBQ0VEX0JVRzsKKwllbHNlCisJCXNwaV9tYXhfb2Zmc2V0KHN0YXJnZXQpID0gTUFYX09GRlNFVF9QQUNFRDsKKwlzcGlfbWF4X3dpZHRoKHN0YXJnZXQpID0gYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFOworCisJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCAwLCAwLCAwLAorCQkJIEFIRF9UUkFOU19HT0FMLCAvKnBhdXNlZCovRkFMU0UpOworCWFoZF9zZXRfd2lkdGgoYWhkLCAmZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKKwkJICAgICAgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7CiAJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CisKKwlyZXR1cm4gMDsKIH0KLSNlbmRpZgorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3RhcmdldF9kZXN0cm95KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKiphaGRfdGFyZ3AgPSBhaGRfbGludXhfdGFyZ2V0X2luX3NvZnRjKHN0YXJnZXQpOworCisJKmFoZF90YXJncCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9saW51eF9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkID0KKwkJKigoc3RydWN0IGFoZF9zb2Z0YyAqKilzZGV2LT5ob3N0LT5ob3N0ZGF0YSk7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2Rldi0+c2Rldl90YXJnZXQ7CisJc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcgPSBzY3NpX3RyYW5zcG9ydF90YXJnZXRfZGF0YShzdGFyZ2V0KTsKKwlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OworCisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTbGF2ZSBBbGxvYyAlZFxuIiwgYWhkX25hbWUoYWhkKSwgc2Rldi0+aWQpOworCisJQlVHX09OKHRhcmctPnNkZXZbc2Rldi0+bHVuXSAhPSBOVUxMKTsKKworCWRldiA9IHNjc2lfdHJhbnNwb3J0X2RldmljZV9kYXRhKHNkZXYpOworCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisKKwkvKgorCSAqIFdlIHN0YXJ0IG91dCBsaWZlIHVzaW5nIHVudGFnZ2VkCisJICogdHJhbnNhY3Rpb25zIG9mIHdoaWNoIHdlIGFsbG93IG9uZS4KKwkgKi8KKwlkZXYtPm9wZW5pbmdzID0gMTsKKworCS8qCisJICogU2V0IG1heHRhZ3MgdG8gMC4gIFRoaXMgd2lsbCBiZSBjaGFuZ2VkIGlmIHdlCisJICogbGF0ZXIgZGV0ZXJtaW5lIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aAorCSAqIGEgdGFnZ2VkIHF1ZXVpbmcgY2FwYWJsZSBkZXZpY2UuCisJICovCisJZGV2LT5tYXh0YWdzID0gMDsKKwkKKwl0YXJnLT5zZGV2W3NkZXYtPmx1bl0gPSBzZGV2OworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhkX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCisJYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilzZGV2LT5ob3N0LT5ob3N0ZGF0YSk7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTbGF2ZSBDb25maWd1cmUgJWRcbiIsIGFoZF9uYW1lKGFoZCksIHNkZXYtPmlkKTsKKworCWFoZF9saW51eF9kZXZpY2VfcXVldWVfZGVwdGgoc2Rldik7CisKKwkvKiBJbml0aWFsIERvbWFpbiBWYWxpZGF0aW9uICovCisJaWYgKCFzcGlfaW5pdGlhbF9kdihzZGV2LT5zZGV2X3RhcmdldCkpCisJCXNwaV9kdl9kZXZpY2Uoc2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CisJc3RydWN0CWFoZF9saW51eF9kZXZpY2UgKmRldiA9IHNjc2lfdHJhbnNwb3J0X2RldmljZV9kYXRhKHNkZXYpOworCXN0cnVjdCAgYWhkX2xpbnV4X3RhcmdldCAqdGFyZyA9IHNjc2lfdHJhbnNwb3J0X3RhcmdldF9kYXRhKHNkZXYtPnNkZXZfdGFyZ2V0KTsKKworCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopc2Rldi0+aG9zdC0+aG9zdGRhdGEpOworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCIlczogU2xhdmUgRGVzdHJveSAlZFxuIiwgYWhkX25hbWUoYWhkKSwgc2Rldi0+aWQpOworCisJQlVHX09OKGRldi0+YWN0aXZlKTsKKworCXRhcmctPnNkZXZbc2Rldi0+bHVuXSA9IE5VTEw7CisKK30KIAogI2lmIGRlZmluZWQoX19pMzg2X18pCiAvKgogICogUmV0dXJuIHRoZSBkaXNrIGdlb21ldHJ5IGZvciB0aGUgZ2l2ZW4gU0NTSSBkZXZpY2UuCiAgKi8KIHN0YXRpYyBpbnQKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiBhaGRfbGludXhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJICAgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQogewogCXVpbnQ4X3QgKmJoOwotI2Vsc2UKLWFoZF9saW51eF9iaW9zcGFyYW0oRGlzayAqZGlzaywga2Rldl90IGRldiwgaW50IGdlb21bXSkKLXsKLQlzdHJ1Y3QJc2NzaV9kZXZpY2UgKnNkZXYgPSBkaXNrLT5kZXZpY2U7Ci0JdV9sb25nCWNhcGFjaXR5ID0gZGlzay0+Y2FwYWNpdHk7Ci0Jc3RydWN0CWJ1ZmZlcl9oZWFkICpiaDsKLSNlbmRpZgogCWludAkgaGVhZHM7CiAJaW50CSBzZWN0b3JzOwogCWludAkgY3lsaW5kZXJzOwpAQCAtMTE1MSwyMiArNjExLDExIEBACiAKIAlhaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKXNkZXYtPmhvc3QtPmhvc3RkYXRhKTsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKIAliaCA9IHNjc2lfYmlvc19wdGFibGUoYmRldik7Ci0jZWxpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDE3KQotCWJoID0gYnJlYWQoTUtERVYoTUFKT1IoZGV2KSwgTUlOT1IoZGV2KSAmIH4weGYpLCAwLCBibG9ja19zaXplKGRldikpOwotI2Vsc2UKLQliaCA9IGJyZWFkKE1LREVWKE1BSk9SKGRldiksIE1JTk9SKGRldikgJiB+MHhmKSwgMCwgMTAyNCk7Ci0jZW5kaWYKLQogCWlmIChiaCkgewogCQlyZXQgPSBzY3NpX3BhcnRzaXplKGJoLCBjYXBhY2l0eSwKIAkJCQkgICAgJmdlb21bMl0sICZnZW9tWzBdLCAmZ2VvbVsxXSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCQlrZnJlZShiaCk7Ci0jZWxzZQotCQlicmVsc2UoYmgpOwotI2VuZGlmCiAJCWlmIChyZXQgIT0gLTEpCiAJCQlyZXR1cm4gKHJldCk7CiAJfQpAQCAtMTE5NCwxNyArNjQzLDE0MTkgQEAKICAqIEFib3J0IHRoZSBjdXJyZW50IFNDU0kgY29tbWFuZChzKS4KICAqLwogc3RhdGljIGludAotYWhkX2xpbnV4X2Fib3J0KFNjc2lfQ21uZCAqY21kKQorYWhkX2xpbnV4X2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGFoZF9saW51eF9xdWV1ZV9yZWNvdmVyeV9jbWQoY21kLCBTQ0JfQUJPUlQpOworCWlmIChlcnJvciAhPSAwKQorCQlwcmludGYoImFpYzc5eHhfYWJvcnQgcmV0dXJucyAweCV4XG4iLCBlcnJvcik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQXR0ZW1wdCB0byBzZW5kIGEgdGFyZ2V0IHJlc2V0IG1lc3NhZ2UgdG8gdGhlIGRldmljZSB0aGF0IHRpbWVkIG91dC4KKyAqLworc3RhdGljIGludAorYWhkX2xpbnV4X2Rldl9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGRfbGludXhfcXVldWVfcmVjb3ZlcnlfY21kKGNtZCwgU0NCX0RFVklDRV9SRVNFVCk7CisJaWYgKGVycm9yICE9IDApCisJCXByaW50ZigiYWljNzl4eF9kZXZfcmVzZXQgcmV0dXJucyAweCV4XG4iLCBlcnJvcik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogUmVzZXQgdGhlIFNDU0kgYnVzLgorICovCitzdGF0aWMgaW50CithaGRfbGludXhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7Ci0Jc3RydWN0IGFoZF9jbWQgKmFjbWQ7Ci0Jc3RydWN0IGFoZF9jbWQgKmxpc3RfYWNtZDsKKwl1X2xvbmcgczsKKwlpbnQgICAgZm91bmQ7CisKKwlhaGQgPSAqKHN0cnVjdCBhaGRfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApCisJCXByaW50ZigiJXM6IEJ1cyByZXNldCBjYWxsZWQgZm9yIGNtZCAlcFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZCk7CisjZW5kaWYKKwlhaGRfbG9jayhhaGQsICZzKTsKKwlmb3VuZCA9IGFoZF9yZXNldF9jaGFubmVsKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsCisJCQkJICAvKmluaXRpYXRlIHJlc2V0Ki9UUlVFKTsKKwlhaGRfdW5sb2NrKGFoZCwgJnMpOworCisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTQ1NJIGJ1cyByZXNldCBkZWxpdmVyZWQuICIKKwkJICAgICAgICIlZCBTQ0JzIGFib3J0ZWQuXG4iLCBhaGRfbmFtZShhaGQpLCBmb3VuZCk7CisKKwlyZXR1cm4gKFNVQ0NFU1MpOworfQorCitzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGFpYzc5eHhfZHJpdmVyX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAiYWljNzl4eCIsCisJLnByb2NfbmFtZQkJPSAiYWljNzl4eCIsCisJLnByb2NfaW5mbwkJPSBhaGRfbGludXhfcHJvY19pbmZvLAorCS5pbmZvCQkJPSBhaGRfbGludXhfaW5mbywKKwkucXVldWVjb21tYW5kCQk9IGFoZF9saW51eF9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGFoZF9saW51eF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBhaGRfbGludXhfZGV2X3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGFoZF9saW51eF9idXNfcmVzZXQsCisjaWYgZGVmaW5lZChfX2kzODZfXykKKwkuYmlvc19wYXJhbQkJPSBhaGRfbGludXhfYmlvc3BhcmFtLAorI2VuZGlmCisJLmNhbl9xdWV1ZQkJPSBBSERfTUFYX1FVRVVFLAorCS50aGlzX2lkCQk9IC0xLAorCS5jbWRfcGVyX2x1bgkJPSAyLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuc2xhdmVfYWxsb2MJCT0gYWhkX2xpbnV4X3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhaGRfbGludXhfc2xhdmVfY29uZmlndXJlLAorCS5zbGF2ZV9kZXN0cm95CQk9IGFoZF9saW51eF9zbGF2ZV9kZXN0cm95LAorCS50YXJnZXRfYWxsb2MJCT0gYWhkX2xpbnV4X3RhcmdldF9hbGxvYywKKwkudGFyZ2V0X2Rlc3Ryb3kJCT0gYWhkX2xpbnV4X3RhcmdldF9kZXN0cm95LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEJ1cyBETUEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorYWhkX2RtYV90YWdfY3JlYXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCBwYXJlbnQsCisJCSAgIGJ1c19zaXplX3QgYWxpZ25tZW50LCBidXNfc2l6ZV90IGJvdW5kYXJ5LAorCQkgICBkbWFfYWRkcl90IGxvd2FkZHIsIGRtYV9hZGRyX3QgaGlnaGFkZHIsCisJCSAgIGJ1c19kbWFfZmlsdGVyX3QgKmZpbHRlciwgdm9pZCAqZmlsdGVyYXJnLAorCQkgICBidXNfc2l6ZV90IG1heHNpemUsIGludCBuc2VnbWVudHMsCisJCSAgIGJ1c19zaXplX3QgbWF4c2Vnc3osIGludCBmbGFncywgYnVzX2RtYV90YWdfdCAqcmV0X3RhZykKK3sKKwlidXNfZG1hX3RhZ190IGRtYXQ7CisKKwlkbWF0ID0gbWFsbG9jKHNpemVvZigqZG1hdCksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKGRtYXQgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCisJLyoKKwkgKiBMaW51eCBpcyB2ZXJ5IHNpbXBsaXN0aWMgYWJvdXQgRE1BIG1lbW9yeS4gIEZvciBub3cgZG9uJ3QKKwkgKiBtYWludGFpbiBhbGwgc3BlY2lmaWNhdGlvbiBpbmZvcm1hdGlvbi4gIE9uY2UgTGludXggc3VwcGxpZXMKKwkgKiBiZXR0ZXIgZmFjaWxpdGllcyBmb3IgZG9pbmcgdGhlc2Ugb3BlcmF0aW9ucywgb3IgdGhlCisJICogbmVlZHMgb2YgdGhpcyBwYXJ0aWN1bGFyIGRyaXZlciBjaGFuZ2UsIHdlIG1pZ2h0IG5lZWQgdG8gZG8KKwkgKiBtb3JlIGhlcmUuCisJICovCisJZG1hdC0+YWxpZ25tZW50ID0gYWxpZ25tZW50OworCWRtYXQtPmJvdW5kYXJ5ID0gYm91bmRhcnk7CisJZG1hdC0+bWF4c2l6ZSA9IG1heHNpemU7CisJKnJldF90YWcgPSBkbWF0OworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoZF9kbWFfdGFnX2Rlc3Ryb3koc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQpCit7CisJZnJlZShkbWF0LCBNX0RFVkJVRik7Cit9CisKK2ludAorYWhkX2RtYW1lbV9hbGxvYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgdm9pZCoqIHZhZGRyLAorCQkgaW50IGZsYWdzLCBidXNfZG1hbWFwX3QgKm1hcHApCit7CisJKnZhZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWhkLT5kZXZfc29mdGMsCisJCQkJICAgICAgZG1hdC0+bWF4c2l6ZSwgbWFwcCk7CisJaWYgKCp2YWRkciA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisJcmV0dXJuKDApOworfQorCit2b2lkCithaGRfZG1hbWVtX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQsCisJCXZvaWQqIHZhZGRyLCBidXNfZG1hbWFwX3QgbWFwKQoreworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWhkLT5kZXZfc29mdGMsIGRtYXQtPm1heHNpemUsCisJCQkgICAgdmFkZHIsIG1hcCk7Cit9CisKK2ludAorYWhkX2RtYW1hcF9sb2FkKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAorCQl2b2lkICpidWYsIGJ1c19zaXplX3QgYnVmbGVuLCBidXNfZG1hbWFwX2NhbGxiYWNrX3QgKmNiLAorCQl2b2lkICpjYl9hcmcsIGludCBmbGFncykKK3sKKwkvKgorCSAqIEFzc3VtZSBmb3Igbm93IHRoYXQgdGhpcyB3aWxsIG9ubHkgYmUgdXNlZCBkdXJpbmcKKwkgKiBpbml0aWFsaXphdGlvbiBhbmQgbm90IGZvciBwZXItdHJhbnNhY3Rpb24gYnVmZmVyIG1hcHBpbmcuCisJICovCisJYnVzX2RtYV9zZWdtZW50X3Qgc3RhY2tfc2c7CisKKwlzdGFja19zZy5kc19hZGRyID0gbWFwOworCXN0YWNrX3NnLmRzX2xlbiA9IGRtYXQtPm1heHNpemU7CisJY2IoY2JfYXJnLCAmc3RhY2tfc2csIC8qbnNlZyovMSwgLyplcnJvciovMCk7CisJcmV0dXJuICgwKTsKK30KKwordm9pZAorYWhkX2RtYW1hcF9kZXN0cm95KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwKQoreworfQorCitpbnQKK2FoZF9kbWFtYXBfdW5sb2FkKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwKQoreworCS8qIE5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqIFBsYXRmb3JtIERlcGVuZGVudCBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENvbXBhcmUgImxlZnQgaGFuZCIgc29mdGMgd2l0aCAicmlnaHQgaGFuZCIgc29mdGMsIHJldHVybmluZzoKKyAqIDwgMCAtIGxhaGQgaGFzIGEgbG93ZXIgcHJpb3JpdHkgdGhhbiByYWhkCisgKiAgIDAgLSBTb2Z0Y3MgYXJlIGVxdWFsCisgKiA+IDAgLSBsYWhkIGhhcyBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIHJhaGQKKyAqLworaW50CithaGRfc29mdGNfY29tcChzdHJ1Y3QgYWhkX3NvZnRjICpsYWhkLCBzdHJ1Y3QgYWhkX3NvZnRjICpyYWhkKQoreworCWludAl2YWx1ZTsKKworCS8qCisJICogVW5kZXIgTGludXgsIGNhcmRzIGFyZSBvcmRlcmVkIGFzIGZvbGxvd3M6CisJICoJMSkgUENJIGRldmljZXMgdGhhdCBhcmUgbWFya2VkIGFzIHRoZSBib290IGNvbnRyb2xsZXIuCisJICoJMikgUENJIGRldmljZXMgd2l0aCBCSU9TIGVuYWJsZWQgc29ydGVkIGJ5IGJ1cy9zbG90L2Z1bmMuCisJICoJMykgQWxsIHJlbWFpbmluZyBQQ0kgZGV2aWNlcyBzb3J0ZWQgYnkgYnVzL3Nsb3QvZnVuYy4KKwkgKi8KKyNpZiAwCisJdmFsdWUgPSAobGFoZC0+ZmxhZ3MgJiBBSERfQk9PVF9DSEFOTkVMKQorCSAgICAgIC0gKHJhaGQtPmZsYWdzICYgQUhEX0JPT1RfQ0hBTk5FTCk7CisJaWYgKHZhbHVlICE9IDApCisJCS8qIENvbnRyb2xsZXJzIHNldCBmb3IgYm9vdCBoYXZlIGEgKmhpZ2hlciogcHJpb3JpdHkgKi8KKwkJcmV0dXJuICh2YWx1ZSk7CisjZW5kaWYKKworCXZhbHVlID0gKGxhaGQtPmZsYWdzICYgQUhEX0JJT1NfRU5BQkxFRCkKKwkgICAgICAtIChyYWhkLT5mbGFncyAmIEFIRF9CSU9TX0VOQUJMRUQpOworCWlmICh2YWx1ZSAhPSAwKQorCQkvKiBDb250cm9sbGVycyB3aXRoIEJJT1MgZW5hYmxlZCBoYXZlIGEgKmhpZ2hlciogcHJpb3JpdHkgKi8KKwkJcmV0dXJuICh2YWx1ZSk7CisKKwkvKiBTdGlsbCBlcXVhbC4gIFNvcnQgYnkgYnVzL3Nsb3QvZnVuYy4gKi8KKwlpZiAoYWljNzl4eF9yZXZlcnNlX3NjYW4gIT0gMCkKKwkJdmFsdWUgPSBhaGRfZ2V0X3BjaV9idXMobGFoZC0+ZGV2X3NvZnRjKQorCQkgICAgICAtIGFoZF9nZXRfcGNpX2J1cyhyYWhkLT5kZXZfc29mdGMpOworCWVsc2UKKwkJdmFsdWUgPSBhaGRfZ2V0X3BjaV9idXMocmFoZC0+ZGV2X3NvZnRjKQorCQkgICAgICAtIGFoZF9nZXRfcGNpX2J1cyhsYWhkLT5kZXZfc29mdGMpOworCWlmICh2YWx1ZSAhPSAwKQorCQlyZXR1cm4gKHZhbHVlKTsKKwlpZiAoYWljNzl4eF9yZXZlcnNlX3NjYW4gIT0gMCkKKwkJdmFsdWUgPSBhaGRfZ2V0X3BjaV9zbG90KGxhaGQtPmRldl9zb2Z0YykKKwkJICAgICAgLSBhaGRfZ2V0X3BjaV9zbG90KHJhaGQtPmRldl9zb2Z0Yyk7CisJZWxzZQorCQl2YWx1ZSA9IGFoZF9nZXRfcGNpX3Nsb3QocmFoZC0+ZGV2X3NvZnRjKQorCQkgICAgICAtIGFoZF9nZXRfcGNpX3Nsb3QobGFoZC0+ZGV2X3NvZnRjKTsKKwlpZiAodmFsdWUgIT0gMCkKKwkJcmV0dXJuICh2YWx1ZSk7CisKKwl2YWx1ZSA9IHJhaGQtPmNoYW5uZWwgLSBsYWhkLT5jaGFubmVsOworCXJldHVybiAodmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3NldHVwX2lvY2VsbF9pbmZvKHVfbG9uZyBpbmRleCwgaW50IGluc3RhbmNlLCBpbnQgdGFyZywgaW50MzJfdCB2YWx1ZSkKK3sKKworCWlmICgoaW5zdGFuY2UgPj0gMCkKKwkgJiYgKGluc3RhbmNlIDwgTlVNX0VMRU1FTlRTKGFpYzc5eHhfaW9jZWxsX2luZm8pKSkgeworCQl1aW50OF90ICppb2NlbGxfaW5mbzsKKworCQlpb2NlbGxfaW5mbyA9ICh1aW50OF90KikmYWljNzl4eF9pb2NlbGxfaW5mb1tpbnN0YW5jZV07CisJCWlvY2VsbF9pbmZvW2luZGV4XSA9IHZhbHVlICYgMHhGRkZGOworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoImlvY2VsbFslZDolbGRdID0gJWRcbiIsIGluc3RhbmNlLCBpbmRleCwgdmFsdWUpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zZXR1cF90YWdfaW5mb19nbG9iYWwoY2hhciAqcCkKK3sKKwlpbnQgdGFncywgaSwgajsKKworCXRhZ3MgPSBzaW1wbGVfc3RydG91bChwICsgMSwgTlVMTCwgMCkgJiAweGZmOworCXByaW50ZigiU2V0dGluZyBHbG9iYWwgVGFncz0gJWRcbiIsIHRhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X3RhZ19pbmZvKTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBBSERfTlVNX1RBUkdFVFM7IGorKykgeworCQkJYWljNzl4eF90YWdfaW5mb1tpXS50YWdfY29tbWFuZHNbal0gPSB0YWdzOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3NldHVwX3RhZ19pbmZvKHVfbG9uZyBhcmcsIGludCBpbnN0YW5jZSwgaW50IHRhcmcsIGludDMyX3QgdmFsdWUpCit7CisKKwlpZiAoKGluc3RhbmNlID49IDApICYmICh0YXJnID49IDApCisJICYmIChpbnN0YW5jZSA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X3RhZ19pbmZvKSkKKwkgJiYgKHRhcmcgPCBBSERfTlVNX1RBUkdFVFMpKSB7CisJCWFpYzc5eHhfdGFnX2luZm9baW5zdGFuY2VdLnRhZ19jb21tYW5kc1t0YXJnXSA9IHZhbHVlICYgMHgxRkY7CisJCWlmIChib290dmVyYm9zZSkKKwkJCXByaW50ZigidGFnX2luZm9bJWQ6JWRdID0gJWRcbiIsIGluc3RhbmNlLCB0YXJnLCB2YWx1ZSk7CisJfQorfQorCitzdGF0aWMgY2hhciAqCithaGRfcGFyc2VfYnJhY2Vfb3B0aW9uKGNoYXIgKm9wdF9uYW1lLCBjaGFyICpvcHRfYXJnLCBjaGFyICplbmQsIGludCBkZXB0aCwKKwkJICAgICAgIHZvaWQgKCpjYWxsYmFjaykodV9sb25nLCBpbnQsIGludCwgaW50MzJfdCksCisJCSAgICAgICB1X2xvbmcgY2FsbGJhY2tfYXJnKQoreworCWNoYXIJKnRva19lbmQ7CisJY2hhcgkqdG9rX2VuZDI7CisJaW50ICAgICAgaTsKKwlpbnQgICAgICBpbnN0YW5jZTsKKwlpbnQJIHRhcmc7CisJaW50CSBkb25lOworCWNoYXIJIHRva19saXN0W10gPSB7Jy4nLCAnLCcsICd7JywgJ30nLCAnXDAnfTsKKworCS8qIEFsbCBvcHRpb25zIHVzZSBhICc6JyBuYW1lL2FyZyBzZXBhcmF0b3IgKi8KKwlpZiAoKm9wdF9hcmcgIT0gJzonKQorCQlyZXR1cm4gKG9wdF9hcmcpOworCW9wdF9hcmcrKzsKKwlpbnN0YW5jZSA9IC0xOworCXRhcmcgPSAtMTsKKwlkb25lID0gRkFMU0U7CisJLyoKKwkgKiBSZXN0b3JlIHNlcGFyYXRvciB0aGF0IG1heSBiZSBpbgorCSAqIHRoZSBtaWRkbGUgb2Ygb3VyIG9wdGlvbiBhcmd1bWVudC4KKwkgKi8KKwl0b2tfZW5kID0gc3RyY2hyKG9wdF9hcmcsICdcMCcpOworCWlmICh0b2tfZW5kIDwgZW5kKQorCQkqdG9rX2VuZCA9ICcsJzsKKwl3aGlsZSAoIWRvbmUpIHsKKwkJc3dpdGNoICgqb3B0X2FyZykgeworCQljYXNlICd7JzoKKwkJCWlmIChpbnN0YW5jZSA9PSAtMSkgeworCQkJCWluc3RhbmNlID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRlcHRoID4gMSkgeworCQkJCQlpZiAodGFyZyA9PSAtMSkKKwkJCQkJCXRhcmcgPSAwOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ZigiTWFsZm9ybWVkIE9wdGlvbiAlc1xuIiwKKwkJCQkJICAgICAgIG9wdF9uYW1lKTsKKwkJCQkJZG9uZSA9IFRSVUU7CisJCQkJfQorCQkJfQorCQkJb3B0X2FyZysrOworCQkJYnJlYWs7CisJCWNhc2UgJ30nOgorCQkJaWYgKHRhcmcgIT0gLTEpCisJCQkJdGFyZyA9IC0xOworCQkJZWxzZSBpZiAoaW5zdGFuY2UgIT0gLTEpCisJCQkJaW5zdGFuY2UgPSAtMTsKKwkJCW9wdF9hcmcrKzsKKwkJCWJyZWFrOworCQljYXNlICcsJzoKKwkJY2FzZSAnLic6CisJCQlpZiAoaW5zdGFuY2UgPT0gLTEpCisJCQkJZG9uZSA9IFRSVUU7CisJCQllbHNlIGlmICh0YXJnID49IDApCisJCQkJdGFyZysrOworCQkJZWxzZSBpZiAoaW5zdGFuY2UgPj0gMCkKKwkJCQlpbnN0YW5jZSsrOworCQkJb3B0X2FyZysrOworCQkJYnJlYWs7CisJCWNhc2UgJ1wwJzoKKwkJCWRvbmUgPSBUUlVFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0b2tfZW5kID0gZW5kOworCQkJZm9yIChpID0gMDsgdG9rX2xpc3RbaV07IGkrKykgeworCQkJCXRva19lbmQyID0gc3RyY2hyKG9wdF9hcmcsIHRva19saXN0W2ldKTsKKwkJCQlpZiAoKHRva19lbmQyKSAmJiAodG9rX2VuZDIgPCB0b2tfZW5kKSkKKwkJCQkJdG9rX2VuZCA9IHRva19lbmQyOworCQkJfQorCQkJY2FsbGJhY2soY2FsbGJhY2tfYXJnLCBpbnN0YW5jZSwgdGFyZywKKwkJCQkgc2ltcGxlX3N0cnRvbChvcHRfYXJnLCBOVUxMLCAwKSk7CisJCQlvcHRfYXJnID0gdG9rX2VuZDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAob3B0X2FyZyk7Cit9CisKKy8qCisgKiBIYW5kbGUgTGludXggYm9vdCBwYXJhbWV0ZXJzLiBUaGlzIHJvdXRpbmUgYWxsb3dzIGZvciBhc3NpZ25pbmcgYSB2YWx1ZQorICogdG8gYSBwYXJhbWV0ZXIgd2l0aCBhICc6JyBiZXR3ZWVuIHRoZSBwYXJhbWV0ZXIgYW5kIHRoZSB2YWx1ZS4KKyAqIGllLiBhaWM3OXh4PXN0cHdsZXY6MSxleHRlbmRlZAorICovCitzdGF0aWMgaW50CithaWM3OXh4X3NldHVwKGNoYXIgKnMpCit7CisJaW50CWksIG47CisJY2hhciAgICpwOworCWNoYXIgICAqZW5kOworCisJc3RhdGljIHN0cnVjdCB7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCXVpbnQzMl90ICpmbGFnOworCX0gb3B0aW9uc1tdID0geworCQl7ICJleHRlbmRlZCIsICZhaWM3OXh4X2V4dGVuZGVkIH0sCisJCXsgIm5vX3Jlc2V0IiwgJmFpYzc5eHhfbm9fcmVzZXQgfSwKKwkJeyAidmVyYm9zZSIsICZhaWM3OXh4X3ZlcmJvc2UgfSwKKwkJeyAiYWxsb3dfbWVtaW8iLCAmYWljNzl4eF9hbGxvd19tZW1pb30sCisjaWZkZWYgQUhEX0RFQlVHCisJCXsgImRlYnVnIiwgJmFoZF9kZWJ1ZyB9LAorI2VuZGlmCisJCXsgInJldmVyc2Vfc2NhbiIsICZhaWM3OXh4X3JldmVyc2Vfc2NhbiB9LAorCQl7ICJwZXJpb2RpY19vdGFnIiwgJmFpYzc5eHhfcGVyaW9kaWNfb3RhZyB9LAorCQl7ICJwY2lfcGFyaXR5IiwgJmFpYzc5eHhfcGNpX3Bhcml0eSB9LAorCQl7ICJzZWx0aW1lIiwgJmFpYzc5eHhfc2VsdGltZSB9LAorCQl7ICJ0YWdfaW5mbyIsIE5VTEwgfSwKKwkJeyAiZ2xvYmFsX3RhZ19kZXB0aCIsIE5VTEx9LAorCQl7ICJzbGV3cmF0ZSIsIE5VTEwgfSwKKwkJeyAicHJlY29tcCIsIE5VTEwgfSwKKwkJeyAiYW1wbGl0dWRlIiwgTlVMTCB9LAorCX07CisKKwllbmQgPSBzdHJjaHIocywgJ1wwJyk7CisKKwkvKgorCSAqIFhYWCBpYTY0IGdjYyBpc24ndCBzbWFydCBlbm91Z2ggdG8ga25vdyB0aGF0IE5VTV9FTEVNRU5UUworCSAqIHdpbGwgbmV2ZXIgYmUgMCBpbiB0aGlzIGNhc2UuCisJICovICAgICAgCisJbiA9IDA7ICAKKworCXdoaWxlICgocCA9IHN0cnNlcCgmcywgIiwuIikpICE9IE5VTEwpIHsKKwkJaWYgKCpwID09ICdcMCcpCisJCQljb250aW51ZTsKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9FTEVNRU5UUyhvcHRpb25zKTsgaSsrKSB7CisKKwkJCW4gPSBzdHJsZW4ob3B0aW9uc1tpXS5uYW1lKTsKKwkJCWlmIChzdHJuY21wKG9wdGlvbnNbaV0ubmFtZSwgcCwgbikgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSBOVU1fRUxFTUVOVFMob3B0aW9ucykpCisJCQljb250aW51ZTsKKworCQlpZiAoc3RybmNtcChwLCAiZ2xvYmFsX3RhZ19kZXB0aCIsIG4pID09IDApIHsKKwkJCWFoZF9saW51eF9zZXR1cF90YWdfaW5mb19nbG9iYWwocCArIG4pOworCQl9IGVsc2UgaWYgKHN0cm5jbXAocCwgInRhZ19pbmZvIiwgbikgPT0gMCkgeworCQkJcyA9IGFoZF9wYXJzZV9icmFjZV9vcHRpb24oInRhZ19pbmZvIiwgcCArIG4sIGVuZCwKKwkJCSAgICAyLCBhaGRfbGludXhfc2V0dXBfdGFnX2luZm8sIDApOworCQl9IGVsc2UgaWYgKHN0cm5jbXAocCwgInNsZXdyYXRlIiwgbikgPT0gMCkgeworCQkJcyA9IGFoZF9wYXJzZV9icmFjZV9vcHRpb24oInNsZXdyYXRlIiwKKwkJCSAgICBwICsgbiwgZW5kLCAxLCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8sCisJCQkgICAgQUlDNzlYWF9TTEVXUkFURV9JTkRFWCk7CisJCX0gZWxzZSBpZiAoc3RybmNtcChwLCAicHJlY29tcCIsIG4pID09IDApIHsKKwkJCXMgPSBhaGRfcGFyc2VfYnJhY2Vfb3B0aW9uKCJwcmVjb21wIiwKKwkJCSAgICBwICsgbiwgZW5kLCAxLCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8sCisJCQkgICAgQUlDNzlYWF9QUkVDT01QX0lOREVYKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJhbXBsaXR1ZGUiLCBuKSA9PSAwKSB7CisJCQlzID0gYWhkX3BhcnNlX2JyYWNlX29wdGlvbigiYW1wbGl0dWRlIiwKKwkJCSAgICBwICsgbiwgZW5kLCAxLCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8sCisJCQkgICAgQUlDNzlYWF9BTVBMSVRVREVfSU5ERVgpOworCQl9IGVsc2UgaWYgKHBbbl0gPT0gJzonKSB7CisJCQkqKG9wdGlvbnNbaV0uZmxhZykgPSBzaW1wbGVfc3RydG91bChwICsgbiArIDEsIE5VTEwsIDApOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHAsICJ2ZXJib3NlIiwgbikpIHsKKwkJCSoob3B0aW9uc1tpXS5mbGFnKSA9IDE7CisJCX0gZWxzZSB7CisJCQkqKG9wdGlvbnNbaV0uZmxhZykgXj0gMHhGRkZGRkZGRjsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYWljNzl4eD0iLCBhaWM3OXh4X3NldHVwKTsKKwordWludDMyX3QgYWljNzl4eF92ZXJib3NlOworCitpbnQKK2FoZF9saW51eF9yZWdpc3Rlcl9ob3N0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdGVtcGxhdGUpCit7CisJY2hhcglidWZbODBdOworCXN0cnVjdAlTY3NpX0hvc3QgKmhvc3Q7CisJY2hhcgkqbmV3X25hbWU7CisJdV9sb25nCXM7CisKKwl0ZW1wbGF0ZS0+bmFtZSA9IGFoZC0+ZGVzY3JpcHRpb247CisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYyh0ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBhaGRfc29mdGMgKikpOworCWlmIChob3N0ID09IE5VTEwpCisJCXJldHVybiAoRU5PTUVNKTsKKworCSooKHN0cnVjdCBhaGRfc29mdGMgKiopaG9zdC0+aG9zdGRhdGEpID0gYWhkOworCWFoZF9sb2NrKGFoZCwgJnMpOworCXNjc2lfYXNzaWduX2xvY2soaG9zdCwgJmFoZC0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKKwlhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QgPSBob3N0OworCWhvc3QtPmNhbl9xdWV1ZSA9IEFIRF9NQVhfUVVFVUU7CisJaG9zdC0+Y21kX3Blcl9sdW4gPSAyOworCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IEFIRF9OU0VHOworCWhvc3QtPnRoaXNfaWQgPSBhaGQtPm91cl9pZDsKKwlob3N0LT5pcnEgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPmlycTsKKwlob3N0LT5tYXhfaWQgPSAoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSA/IDE2IDogODsKKwlob3N0LT5tYXhfbHVuID0gQUhEX05VTV9MVU5TOworCWhvc3QtPm1heF9jaGFubmVsID0gMDsKKwlob3N0LT5zZ190YWJsZXNpemUgPSBBSERfTlNFRzsKKwlhaGRfc2V0X3VuaXQoYWhkLCBhaGRfbGludXhfdW5pdCsrKTsKKwlzcHJpbnRmKGJ1ZiwgInNjc2klZCIsIGhvc3QtPmhvc3Rfbm8pOworCW5ld19uYW1lID0gbWFsbG9jKHN0cmxlbihidWYpICsgMSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAobmV3X25hbWUgIT0gTlVMTCkgeworCQlzdHJjcHkobmV3X25hbWUsIGJ1Zik7CisJCWFoZF9zZXRfbmFtZShhaGQsIG5ld19uYW1lKTsKKwl9CisJaG9zdC0+dW5pcXVlX2lkID0gYWhkLT51bml0OworCWFoZF9saW51eF9pbml0aWFsaXplX3Njc2lfYnVzKGFoZCk7CisJYWhkX2ludHJfZW5hYmxlKGFoZCwgVFJVRSk7CisJYWhkX3VubG9jayhhaGQsICZzKTsKKworCWhvc3QtPnRyYW5zcG9ydHQgPSBhaGRfbGludXhfdHJhbnNwb3J0X3RlbXBsYXRlOworCisJc2NzaV9hZGRfaG9zdChob3N0LCAmYWhkLT5kZXZfc29mdGMtPmRldik7IC8qIFhYWCBoYW5kbGUgZmFpbHVyZSAqLworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCXJldHVybiAoMCk7Cit9CisKK3VpbnQ2NF90CithaGRfbGludXhfZ2V0X21lbXNpemUodm9pZCkKK3sKKwlzdHJ1Y3Qgc3lzaW5mbyBzaTsKKworCXNpX21lbWluZm8oJnNpKTsKKwlyZXR1cm4gKCh1aW50NjRfdClzaS50b3RhbHJhbSA8PCBQQUdFX1NISUZUKTsKK30KKworLyoKKyAqIFBsYWNlIHRoZSBTQ1NJIGJ1cyBpbnRvIGEga25vd24gc3RhdGUgYnkgZWl0aGVyIHJlc2V0dGluZyBpdCwKKyAqIG9yIGZvcmNpbmcgdHJhbnNmZXIgbmVnb3RpYXRpb25zIG9uIHRoZSBuZXh0IGNvbW1hbmQgdG8gYW55CisgKiB0YXJnZXQuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfbGludXhfaW5pdGlhbGl6ZV9zY3NpX2J1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdV9pbnQgdGFyZ2V0X2lkOworCXVfaW50IG51bXRhcmc7CisKKwl0YXJnZXRfaWQgPSAwOworCW51bXRhcmcgPSAwOworCisJaWYgKGFpYzc5eHhfbm9fcmVzZXQgIT0gMCkKKwkJYWhkLT5mbGFncyAmPSB+QUhEX1JFU0VUX0JVU19BOworCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1JFU0VUX0JVU19BKSAhPSAwKQorCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLyppbml0aWF0ZV9yZXNldCovVFJVRSk7CisJZWxzZQorCQludW10YXJnID0gKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgPyAxNiA6IDg7CisKKwkvKgorCSAqIEZvcmNlIG5lZ290aWF0aW9uIHRvIGFzeW5jIGZvciBhbGwgdGFyZ2V0cyB0aGF0CisJICogd2lsbCBub3Qgc2VlIGFuIGluaXRpYWwgYnVzIHJlc2V0LgorCSAqLworCWZvciAoOyB0YXJnZXRfaWQgPCBudW10YXJnOyB0YXJnZXRfaWQrKykgeworCQlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKwkJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCisJCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsICdBJywgYWhkLT5vdXJfaWQsCisJCQkJCSAgICB0YXJnZXRfaWQsICZ0c3RhdGUpOworCQlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBhaGQtPm91cl9pZCwgdGFyZ2V0X2lkLAorCQkJCSAgICBDQU1fTFVOX1dJTERDQVJELCAnQScsIFJPTEVfSU5JVElBVE9SKTsKKwkJYWhkX3VwZGF0ZV9uZWdfcmVxdWVzdChhaGQsICZkZXZpbmZvLCB0c3RhdGUsCisJCQkJICAgICAgIHRpbmZvLCBBSERfTkVHX0FMV0FZUyk7CisJfQorCS8qIEdpdmUgdGhlIGJ1cyBzb21lIHRpbWUgdG8gcmVjb3ZlciAqLworCWlmICgoYWhkLT5mbGFncyAmIEFIRF9SRVNFVF9CVVNfQSkgIT0gMCkgeworCQlhaGRfZnJlZXplX3NpbXEoYWhkKTsKKwkJaW5pdF90aW1lcigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lcik7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZGF0YSA9ICh1X2xvbmcpYWhkOworCQlhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyLmV4cGlyZXMgPQorCQkgICAgamlmZmllcyArIChBSUM3OVhYX1JFU0VUX0RFTEFZICogSFopLzEwMDA7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZnVuY3Rpb24gPQorCQkgICAgKGFoZF9saW51eF9jYWxsYmFja190ICopYWhkX3JlbGVhc2Vfc2ltcTsKKwkJYWRkX3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKKwl9Cit9CisKK2ludAorYWhkX3BsYXRmb3JtX2FsbG9jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdm9pZCAqcGxhdGZvcm1fYXJnKQoreworCWFoZC0+cGxhdGZvcm1fZGF0YSA9CisJICAgIG1hbGxvYyhzaXplb2Yoc3RydWN0IGFoZF9wbGF0Zm9ybV9kYXRhKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhID09IE5VTEwpCisJCXJldHVybiAoRU5PTUVNKTsKKwltZW1zZXQoYWhkLT5wbGF0Zm9ybV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IGFoZF9wbGF0Zm9ybV9kYXRhKSk7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5pcnEgPSBBSERfTElOVVhfTk9JUlE7CisJYWhkX2xvY2tpbml0KGFoZCk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKKwlhaGQtPnNlbHRpbWUgPSAoYWljNzl4eF9zZWx0aW1lICYgMHgzKSA8PCA0OworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9mcmVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQ7CisJaW50IGksIGo7CisKKwlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhICE9IE5VTEwpIHsKKwkJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCAhPSBOVUxMKSB7CisJCQlzY3NpX3JlbW92ZV9ob3N0KGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7CisJCQlzY3NpX2hvc3RfcHV0KGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7CisJCX0KKworCQkvKiBkZXN0cm95IGFsbCBvZiB0aGUgZGV2aWNlIGFuZCB0YXJnZXQgb2JqZWN0cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgQUhEX05VTV9UQVJHRVRTOyBpKyspIHsKKwkJCXN0YXJnZXQgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPnN0YXJnZXRbaV07CisJCQlpZiAoc3RhcmdldCAhPSBOVUxMKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IEFIRF9OVU1fTFVOUzsgaisrKSB7CisJCQkJCXN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnID0KKwkJCQkJCXNjc2lfdHJhbnNwb3J0X3RhcmdldF9kYXRhKHN0YXJnZXQpOworCQkJCQlpZiAodGFyZy0+c2RldltqXSA9PSBOVUxMKQorCQkJCQkJY29udGludWU7CisJCQkJCXRhcmctPnNkZXZbal0gPSBOVUxMOworCQkJCX0KKwkJCQlhaGQtPnBsYXRmb3JtX2RhdGEtPnN0YXJnZXRbaV0gPSBOVUxMOworCQkJfQorCQl9CisKKwkJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxICE9IEFIRF9MSU5VWF9OT0lSUSkKKwkJCWZyZWVfaXJxKGFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxLCBhaGQpOworCQlpZiAoYWhkLT50YWdzWzBdID09IEJVU19TUEFDRV9QSU8KKwkJICYmIGFoZC0+YnNoc1swXS5pb3BvcnQgIT0gMCkKKwkJCXJlbGVhc2VfcmVnaW9uKGFoZC0+YnNoc1swXS5pb3BvcnQsIDI1Nik7CisJCWlmIChhaGQtPnRhZ3NbMV0gPT0gQlVTX1NQQUNFX1BJTworCQkgJiYgYWhkLT5ic2hzWzFdLmlvcG9ydCAhPSAwKQorCQkJcmVsZWFzZV9yZWdpb24oYWhkLT5ic2hzWzFdLmlvcG9ydCwgMjU2KTsKKwkJaWYgKGFoZC0+dGFnc1swXSA9PSBCVVNfU1BBQ0VfTUVNSU8KKwkJICYmIGFoZC0+YnNoc1swXS5tYWRkciAhPSBOVUxMKSB7CisJCQlpb3VubWFwKGFoZC0+YnNoc1swXS5tYWRkcik7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oYWhkLT5wbGF0Zm9ybV9kYXRhLT5tZW1fYnVzYWRkciwKKwkJCQkJICAgMHgxMDAwKTsKKwkJfQorCQlmcmVlKGFoZC0+cGxhdGZvcm1fZGF0YSwgTV9ERVZCVUYpOworCX0KK30KKwordm9pZAorYWhkX3BsYXRmb3JtX2luaXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCS8qCisJICogTG9va3VwIGFuZCBjb21taXQgYW55IG1vZGlmaWVkIElPIENlbGwgb3B0aW9ucy4KKwkgKi8KKwlpZiAoYWhkLT51bml0IDwgTlVNX0VMRU1FTlRTKGFpYzc5eHhfaW9jZWxsX2luZm8pKSB7CisJCXN0cnVjdCBhaGRfbGludXhfaW9jZWxsX29wdHMgKmlvY2VsbF9vcHRzOworCisJCWlvY2VsbF9vcHRzID0gJmFpYzc5eHhfaW9jZWxsX2luZm9bYWhkLT51bml0XTsKKwkJaWYgKGlvY2VsbF9vcHRzLT5wcmVjb21wICE9IEFJQzc5WFhfREVGQVVMVF9QUkVDT01QKQorCQkJQUhEX1NFVF9QUkVDT01QKGFoZCwgaW9jZWxsX29wdHMtPnByZWNvbXApOworCQlpZiAoaW9jZWxsX29wdHMtPnNsZXdyYXRlICE9IEFJQzc5WFhfREVGQVVMVF9TTEVXUkFURSkKKwkJCUFIRF9TRVRfU0xFV1JBVEUoYWhkLCBpb2NlbGxfb3B0cy0+c2xld3JhdGUpOworCQlpZiAoaW9jZWxsX29wdHMtPmFtcGxpdHVkZSAhPSBBSUM3OVhYX0RFRkFVTFRfQU1QTElUVURFKQorCQkJQUhEX1NFVF9BTVBMSVRVREUoYWhkLCBpb2NlbGxfb3B0cy0+YW1wbGl0dWRlKTsKKwl9CisKK30KKwordm9pZAorYWhkX3BsYXRmb3JtX2ZyZWV6ZV9kZXZxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCWFoZF9wbGF0Zm9ybV9hYm9ydF9zY2JzKGFoZCwgU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpLAorCQkJCVNDQl9HRVRfQ0hBTk5FTChhaGQsIHNjYiksCisJCQkJU0NCX0dFVF9MVU4oc2NiKSwgU0NCX0xJU1RfTlVMTCwKKwkJCQlST0xFX1VOS05PV04sIENBTV9SRVFVRVVFX1JFUSk7Cit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9zZXRfdGFncyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJICAgICAgYWhkX3F1ZXVlX2FsZyBhbGcpCit7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OworCXN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnOworCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCWludCB3YXNfcXVldWluZzsKKwlpbnQgbm93X3F1ZXVpbmc7CisKKwlzdGFyZ2V0ID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT5zdGFyZ2V0W2RldmluZm8tPnRhcmdldF07CisJdGFyZyA9IHNjc2lfdHJhbnNwb3J0X3RhcmdldF9kYXRhKHN0YXJnZXQpOworCUJVR19PTih0YXJnID09IE5VTEwpOworCXNkZXYgPSB0YXJnLT5zZGV2W2RldmluZm8tPmx1bl07CisJaWYgKHNkZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZGV2ID0gc2NzaV90cmFuc3BvcnRfZGV2aWNlX2RhdGEoc2Rldik7CisKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybjsKKwl3YXNfcXVldWluZyA9IGRldi0+ZmxhZ3MgJiAoQUhEX0RFVl9RX0JBU0lDfEFIRF9ERVZfUV9UQUdHRUQpOworCXN3aXRjaCAoYWxnKSB7CisJZGVmYXVsdDoKKwljYXNlIEFIRF9RVUVVRV9OT05FOgorCQlub3dfcXVldWluZyA9IDA7CisJCWJyZWFrOyAKKwljYXNlIEFIRF9RVUVVRV9CQVNJQzoKKwkJbm93X3F1ZXVpbmcgPSBBSERfREVWX1FfQkFTSUM7CisJCWJyZWFrOworCWNhc2UgQUhEX1FVRVVFX1RBR0dFRDoKKwkJbm93X3F1ZXVpbmcgPSBBSERfREVWX1FfVEFHR0VEOworCQlicmVhazsKKwl9CisJaWYgKChkZXYtPmZsYWdzICYgQUhEX0RFVl9GUkVFWkVfVElMX0VNUFRZKSA9PSAwCisJICYmICh3YXNfcXVldWluZyAhPSBub3dfcXVldWluZykKKwkgJiYgKGRldi0+YWN0aXZlICE9IDApKSB7CisJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9GUkVFWkVfVElMX0VNUFRZOworCQlkZXYtPnFmcm96ZW4rKzsKKwl9CisKKwlkZXYtPmZsYWdzICY9IH4oQUhEX0RFVl9RX0JBU0lDfEFIRF9ERVZfUV9UQUdHRUR8QUhEX0RFVl9QRVJJT0RJQ19PVEFHKTsKKwlpZiAobm93X3F1ZXVpbmcpIHsKKwkJdV9pbnQgdXNlcnRhZ3M7CisKKwkJdXNlcnRhZ3MgPSBhaGRfbGludXhfdXNlcl90YWdkZXB0aChhaGQsIGRldmluZm8pOworCQlpZiAoIXdhc19xdWV1aW5nKSB7CisJCQkvKgorCQkJICogU3RhcnQgb3V0IGFncmVzc2l2ZWx5IGFuZCBhbGxvdyBvdXIKKwkJCSAqIGR5bmFtaWMgcXVldWUgZGVwdGggYWxnb3JpdGhtIHRvIHRha2UKKwkJCSAqIGNhcmUgb2YgdGhlIHJlc3QuCisJCQkgKi8KKwkJCWRldi0+bWF4dGFncyA9IHVzZXJ0YWdzOworCQkJZGV2LT5vcGVuaW5ncyA9IGRldi0+bWF4dGFncyAtIGRldi0+YWN0aXZlOworCQl9CisJCWlmIChkZXYtPm1heHRhZ3MgPT0gMCkgeworCQkJLyoKKwkJCSAqIFF1ZXVlaW5nIGlzIGRpc2FibGVkIGJ5IHRoZSB1c2VyLgorCQkJICovCisJCQlkZXYtPm9wZW5pbmdzID0gMTsKKwkJfSBlbHNlIGlmIChhbGcgPT0gQUhEX1FVRVVFX1RBR0dFRCkgeworCQkJZGV2LT5mbGFncyB8PSBBSERfREVWX1FfVEFHR0VEOworCQkJaWYgKGFpYzc5eHhfcGVyaW9kaWNfb3RhZyAhPSAwKQorCQkJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9QRVJJT0RJQ19PVEFHOworCQl9IGVsc2UKKwkJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9RX0JBU0lDOworCX0gZWxzZSB7CisJCS8qIFdlIGNhbiBvbmx5IGhhdmUgb25lIG9wZW5pbmcuICovCisJCWRldi0+bWF4dGFncyA9IDA7CisJCWRldi0+b3BlbmluZ3MgPSAgMSAtIGRldi0+YWN0aXZlOworCX0KKworCXN3aXRjaCAoKGRldi0+ZmxhZ3MgJiAoQUhEX0RFVl9RX0JBU0lDfEFIRF9ERVZfUV9UQUdHRUQpKSkgeworCWNhc2UgQUhEX0RFVl9RX0JBU0lDOgorCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LAorCQkJCQlNU0dfU0lNUExFX1RBU0ssCisJCQkJCWRldi0+b3BlbmluZ3MgKyBkZXYtPmFjdGl2ZSk7CisJCWJyZWFrOworCWNhc2UgQUhEX0RFVl9RX1RBR0dFRDoKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwKKwkJCQkJTVNHX09SREVSRURfVEFTSywKKwkJCQkJZGV2LT5vcGVuaW5ncyArIGRldi0+YWN0aXZlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyoKKwkJICogV2UgYWxsb3cgdGhlIE9TIHRvIHF1ZXVlIDIgdW50YWdnZWQgdHJhbnNhY3Rpb25zIHRvCisJCSAqIHVzIGF0IGFueSB0aW1lIGV2ZW4gdGhvdWdoIHdlIGNhbiBvbmx5IGV4ZWN1dGUgdGhlbQorCQkgKiBzZXJpYWxseSBvbiB0aGUgY29udHJvbGxlci9kZXZpY2UuICBUaGlzIHNob3VsZAorCQkgKiByZW1vdmUgc29tZSBsYXRlbmN5LgorCQkgKi8KKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwKKwkJCQkJLypOT04tVEFHR0VEKi8wLAorCQkJCQkvKnF1ZXVlIGRlcHRoKi8yKTsKKwkJYnJlYWs7CisJfQorfQorCitpbnQKK2FoZF9wbGF0Zm9ybV9hYm9ydF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHRhcmdldCwgY2hhciBjaGFubmVsLAorCQkJaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdV9pbnQKK2FoZF9saW51eF91c2VyX3RhZ2RlcHRoKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCXN0YXRpYyBpbnQgd2FybmVkX3VzZXI7CisJdV9pbnQgdGFnczsKKworCXRhZ3MgPSAwOworCWlmICgoYWhkLT51c2VyX2Rpc2NlbmFibGUgJiBkZXZpbmZvLT50YXJnZXRfbWFzaykgIT0gMCkgeworCQlpZiAoYWhkLT51bml0ID49IE5VTV9FTEVNRU5UUyhhaWM3OXh4X3RhZ19pbmZvKSkgeworCisJCQlpZiAod2FybmVkX3VzZXIgPT0gMCkgeworCQkJCXByaW50ZihLRVJOX1dBUk5JTkcKKyJhaWM3OXh4OiBXQVJOSU5HOiBJbnN1ZmZpY2llbnQgdGFnX2luZm8gaW5zdGFuY2VzXG4iCisiYWljNzl4eDogZm9yIGluc3RhbGxlZCBjb250cm9sbGVycy4gIFVzaW5nIGRlZmF1bHRzXG4iCisiYWljNzl4eDogUGxlYXNlIHVwZGF0ZSB0aGUgYWljNzl4eF90YWdfaW5mbyBhcnJheSBpblxuIgorImFpYzc5eHg6IHRoZSBhaWM3OXh4X29zbS5jIHNvdXJjZSBmaWxlLlxuIik7CisJCQkJd2FybmVkX3VzZXIrKzsKKwkJCX0KKwkJCXRhZ3MgPSBBSERfTUFYX1FVRVVFOworCQl9IGVsc2UgeworCQkJYWRhcHRlcl90YWdfaW5mb190ICp0YWdfaW5mbzsKKworCQkJdGFnX2luZm8gPSAmYWljNzl4eF90YWdfaW5mb1thaGQtPnVuaXRdOworCQkJdGFncyA9IHRhZ19pbmZvLT50YWdfY29tbWFuZHNbZGV2aW5mby0+dGFyZ2V0X29mZnNldF07CisJCQlpZiAodGFncyA+IEFIRF9NQVhfUVVFVUUpCisJCQkJdGFncyA9IEFIRF9NQVhfUVVFVUU7CisJCX0KKwl9CisJcmV0dXJuICh0YWdzKTsKK30KKworLyoKKyAqIERldGVybWluZXMgdGhlIHF1ZXVlIGRlcHRoIGZvciBhIGdpdmVuIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9saW51eF9kZXZpY2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdAlhaGRfZGV2aW5mbyBkZXZpbmZvOworCXVfaW50CXRhZ3M7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilzZGV2LT5ob3N0LT5ob3N0ZGF0YSk7CisKKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLAorCQkJICAgIGFoZC0+b3VyX2lkLAorCQkJICAgIHNkZXYtPnNkZXZfdGFyZ2V0LT5pZCwgc2Rldi0+bHVuLAorCQkJICAgIHNkZXYtPnNkZXZfdGFyZ2V0LT5jaGFubmVsID09IDAgPyAnQScgOiAnQicsCisJCQkgICAgUk9MRV9JTklUSUFUT1IpOworCXRhZ3MgPSBhaGRfbGludXhfdXNlcl90YWdkZXB0aChhaGQsICZkZXZpbmZvKTsKKwlpZiAodGFncyAhPSAwICYmIHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQgIT0gMCkgeworCisJCWFoZF9zZXRfdGFncyhhaGQsICZkZXZpbmZvLCBBSERfUVVFVUVfVEFHR0VEKTsKKwkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCXByaW50ZigiVGFnZ2VkIFF1ZXVpbmcgZW5hYmxlZC4gIERlcHRoICVkXG4iLCB0YWdzKTsKKwl9IGVsc2UgeworCQlhaGRfc2V0X3RhZ3MoYWhkLCAmZGV2aW5mbywgQUhEX1FVRVVFX05PTkUpOworCX0KK30KKworc3RhdGljIGludAorYWhkX2xpbnV4X3J1bl9jb21tYW5kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdAkgc2NiICpzY2I7CisJc3RydWN0CSBoYXJkd2FyZV9zY2IgKmhzY2I7CisJc3RydWN0CSBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJIGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1X2ludAkgY29sX2lkeDsKKwl1aW50MTZfdCBtYXNrOworCisJLyoKKwkgKiBHZXQgYW4gc2NiIHRvIHVzZS4KKwkgKi8KKwl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAorCQkJCSAgICBjbWQtPmRldmljZS0+aWQsICZ0c3RhdGUpOworCWlmICgoZGV2LT5mbGFncyAmIChBSERfREVWX1FfVEFHR0VEfEFIRF9ERVZfUV9CQVNJQykpID09IDAKKwkgfHwgKHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSAhPSAwKSB7CisJCWNvbF9pZHggPSBBSERfTkVWRVJfQ09MX0lEWDsKKwl9IGVsc2UgeworCQljb2xfaWR4ID0gQUhEX0JVSUxEX0NPTF9JRFgoY21kLT5kZXZpY2UtPmlkLAorCQkJCQkgICAgY21kLT5kZXZpY2UtPmx1bik7CisJfQorCWlmICgoc2NiID0gYWhkX2dldF9zY2IoYWhkLCBjb2xfaWR4KSkgPT0gTlVMTCkgeworCQlhaGQtPmZsYWdzIHw9IEFIRF9SRVNPVVJDRV9TSE9SVEFHRTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJfQorCisJc2NiLT5pb19jdHggPSBjbWQ7CisJc2NiLT5wbGF0Zm9ybV9kYXRhLT5kZXYgPSBkZXY7CisJaHNjYiA9IHNjYi0+aHNjYjsKKwljbWQtPmhvc3Rfc2NyaWJibGUgPSAoY2hhciAqKXNjYjsKKworCS8qCisJICogRmlsbCBvdXQgYmFzaWNzIG9mIHRoZSBIU0NCLgorCSAqLworCWhzY2ItPmNvbnRyb2wgPSAwOworCWhzY2ItPnNjc2lpZCA9IEJVSUxEX1NDU0lJRChhaGQsIGNtZCk7CisJaHNjYi0+bHVuID0gY21kLT5kZXZpY2UtPmx1bjsKKwlzY2ItPmhzY2ItPnRhc2tfbWFuYWdlbWVudCA9IDA7CisJbWFzayA9IFNDQl9HRVRfVEFSR0VUX01BU0soYWhkLCBzY2IpOworCisJaWYgKChhaGQtPnVzZXJfZGlzY2VuYWJsZSAmIG1hc2spICE9IDApCisJCWhzY2ItPmNvbnRyb2wgfD0gRElTQ0VOQjsKKworCWlmICgodGluZm8tPmN1cnIucHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApCisJCXNjYi0+ZmxhZ3MgfD0gU0NCX1BBQ0tFVElaRUQ7CisKKwlpZiAoKHRzdGF0ZS0+YXV0b19uZWdvdGlhdGUgJiBtYXNrKSAhPSAwKSB7CisJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FVVE9fTkVHT1RJQVRFOworCQlzY2ItPmhzY2ItPmNvbnRyb2wgfD0gTUtfTUVTU0FHRTsKKwl9CisKKwlpZiAoKGRldi0+ZmxhZ3MgJiAoQUhEX0RFVl9RX1RBR0dFRHxBSERfREVWX1FfQkFTSUMpKSAhPSAwKSB7CisJCWludAltc2dfYnl0ZXM7CisJCXVpbnQ4X3QgdGFnX21zZ3NbMl07CisKKwkJbXNnX2J5dGVzID0gc2NzaV9wb3B1bGF0ZV90YWdfbXNnKGNtZCwgdGFnX21zZ3MpOworCQlpZiAobXNnX2J5dGVzICYmIHRhZ19tc2dzWzBdICE9IE1TR19TSU1QTEVfVEFTSykgeworCQkJaHNjYi0+Y29udHJvbCB8PSB0YWdfbXNnc1swXTsKKwkJCWlmICh0YWdfbXNnc1swXSA9PSBNU0dfT1JERVJFRF9UQVNLKQorCQkJCWRldi0+Y29tbWFuZHNfc2luY2VfaWRsZV9vcl9vdGFnID0gMDsKKwkJfSBlbHNlCisJCWlmIChkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9PSBBSERfT1RBR19USFJFU0gKKwkJICYmIChkZXYtPmZsYWdzICYgQUhEX0RFVl9RX1RBR0dFRCkgIT0gMCkgeworCQkJaHNjYi0+Y29udHJvbCB8PSBNU0dfT1JERVJFRF9UQVNLOworCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOworCQl9IGVsc2UgeworCQkJaHNjYi0+Y29udHJvbCB8PSBNU0dfU0lNUExFX1RBU0s7CisJCX0KKwl9CisKKwloc2NiLT5jZGJfbGVuID0gY21kLT5jbWRfbGVuOworCW1lbWNweShoc2NiLT5zaGFyZWRfZGF0YS5pZGF0YS5jZGIsIGNtZC0+Y21uZCwgaHNjYi0+Y2RiX2xlbik7CisKKwlzY2ItPnBsYXRmb3JtX2RhdGEtPnhmZXJfbGVuID0gMDsKKwlhaGRfc2V0X3Jlc2lkdWFsKHNjYiwgMCk7CisJYWhkX3NldF9zZW5zZV9yZXNpZHVhbChzY2IsIDApOworCXNjYi0+c2dfY291bnQgPSAwOworCWlmIChjbWQtPnVzZV9zZyAhPSAwKSB7CisJCXZvaWQJKnNnOworCQlzdHJ1Y3QJIHNjYXR0ZXJsaXN0ICpjdXJfc2VnOworCQl1X2ludAkgbnNlZzsKKwkJaW50CSBkaXI7CisKKwkJY3VyX3NlZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOworCQlkaXIgPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCQluc2VnID0gcGNpX21hcF9zZyhhaGQtPmRldl9zb2Z0YywgY3VyX3NlZywKKwkJCQkgIGNtZC0+dXNlX3NnLCBkaXIpOworCQlzY2ItPnBsYXRmb3JtX2RhdGEtPnhmZXJfbGVuID0gMDsKKwkJZm9yIChzZyA9IHNjYi0+c2dfbGlzdDsgbnNlZyA+IDA7IG5zZWctLSwgY3VyX3NlZysrKSB7CisJCQlkbWFfYWRkcl90IGFkZHI7CisJCQlidXNfc2l6ZV90IGxlbjsKKworCQkJYWRkciA9IHNnX2RtYV9hZGRyZXNzKGN1cl9zZWcpOworCQkJbGVuID0gc2dfZG1hX2xlbihjdXJfc2VnKTsKKwkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+eGZlcl9sZW4gKz0gbGVuOworCQkJc2cgPSBhaGRfc2dfc2V0dXAoYWhkLCBzY2IsIHNnLCBhZGRyLCBsZW4sCisJCQkJCSAgLypsYXN0Ki9uc2VnID09IDEpOworCQl9CisJfSBlbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiAhPSAwKSB7CisJCXZvaWQgKnNnOworCQlkbWFfYWRkcl90IGFkZHI7CisJCWludCBkaXI7CisKKwkJc2cgPSBzY2ItPnNnX2xpc3Q7CisJCWRpciA9IGNtZC0+c2NfZGF0YV9kaXJlY3Rpb247CisJCWFkZHIgPSBwY2lfbWFwX3NpbmdsZShhaGQtPmRldl9zb2Z0YywKKwkJCQkgICAgICBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCSAgICAgIGNtZC0+cmVxdWVzdF9idWZmbGVuLCBkaXIpOworCQlzY2ItPnBsYXRmb3JtX2RhdGEtPnhmZXJfbGVuID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCXNjYi0+cGxhdGZvcm1fZGF0YS0+YnVmX2J1c2FkZHIgPSBhZGRyOworCQlzZyA9IGFoZF9zZ19zZXR1cChhaGQsIHNjYiwgc2csIGFkZHIsCisJCQkJICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgLypsYXN0Ki9UUlVFKTsKKwl9CisKKwlMSVNUX0lOU0VSVF9IRUFEKCZhaGQtPnBlbmRpbmdfc2Nicywgc2NiLCBwZW5kaW5nX2xpbmtzKTsKKwlkZXYtPm9wZW5pbmdzLS07CisJZGV2LT5hY3RpdmUrKzsKKwlkZXYtPmNvbW1hbmRzX2lzc3VlZCsrOworCisJaWYgKChkZXYtPmZsYWdzICYgQUhEX0RFVl9QRVJJT0RJQ19PVEFHKSAhPSAwKQorCQlkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZysrOworCXNjYi0+ZmxhZ3MgfD0gU0NCX0FDVElWRTsKKwlhaGRfcXVldWVfc2NiKGFoZCwgc2NiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU0NTSSBjb250cm9sbGVyIGludGVycnVwdCBoYW5kbGVyLgorICovCitpcnFyZXR1cm5fdAorYWhkX2xpbnV4X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CisJdV9sb25nCWZsYWdzOworCWludAlvdXJzOworCisJYWhkID0gKHN0cnVjdCBhaGRfc29mdGMgKikgZGV2X2lkOworCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsgCisJb3VycyA9IGFoZF9pbnRyKGFoZCk7CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CisJcmV0dXJuIElSUV9SRVRWQUwob3Vycyk7Cit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9mbHVzaHdvcmsoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCit9CisKK3ZvaWQKK2FoZF9zZW5kX2FzeW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgY2hhciBjaGFubmVsLAorCSAgICAgICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgYWNfY29kZSBjb2RlLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBBQ19UUkFOU0ZFUl9ORUc6CisJeworCQljaGFyCWJ1Zls4MF07CisJCXN0cnVjdCAgc2NzaV90YXJnZXQgKnN0YXJnZXQ7CisJCXN0cnVjdAlhaGRfbGludXhfdGFyZ2V0ICp0YXJnOworCQlzdHJ1Y3QJaW5mb19zdHIgaW5mbzsKKwkJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QJYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCQl1bnNpZ25lZCBpbnQgdGFyZ2V0X3Bwcl9vcHRpb25zOworCisJCUJVR19PTih0YXJnZXQgPT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRCk7CisKKwkJaW5mby5idWZmZXIgPSBidWY7CisJCWluZm8ubGVuZ3RoID0gc2l6ZW9mKGJ1Zik7CisJCWluZm8ub2Zmc2V0ID0gMDsKKwkJaW5mby5wb3MgPSAwOworCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBjaGFubmVsLCBhaGQtPm91cl9pZCwKKwkJCQkJICAgIHRhcmdldCwgJnRzdGF0ZSk7CisKKwkJLyoKKwkJICogRG9uJ3QgYm90aGVyIHJlcG9ydGluZyByZXN1bHRzIHdoaWxlCisJCSAqIG5lZ290aWF0aW9ucyBhcmUgc3RpbGwgcGVuZGluZy4KKwkJICovCisJCWlmICh0aW5mby0+Y3Vyci5wZXJpb2QgIT0gdGluZm8tPmdvYWwucGVyaW9kCisJCSB8fCB0aW5mby0+Y3Vyci53aWR0aCAhPSB0aW5mby0+Z29hbC53aWR0aAorCQkgfHwgdGluZm8tPmN1cnIub2Zmc2V0ICE9IHRpbmZvLT5nb2FsLm9mZnNldAorCQkgfHwgdGluZm8tPmN1cnIucHByX29wdGlvbnMgIT0gdGluZm8tPmdvYWwucHByX29wdGlvbnMpCisJCQlpZiAoYm9vdHZlcmJvc2UgPT0gMCkKKwkJCQlicmVhazsKKworCQkvKgorCQkgKiBEb24ndCBib3RoZXIgcmVwb3J0aW5nIHJlc3VsdHMgdGhhdAorCQkgKiBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIGxhc3QgcmVwb3J0ZWQuCisJCSAqLworCQlzdGFyZ2V0ID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT5zdGFyZ2V0W3RhcmdldF07CisJCWlmIChzdGFyZ2V0ID09IE5VTEwpCisJCQlicmVhazsKKwkJdGFyZyA9IHNjc2lfdHJhbnNwb3J0X3RhcmdldF9kYXRhKHN0YXJnZXQpOworCisJCXRhcmdldF9wcHJfb3B0aW9ucyA9CisJCQkoc3BpX2R0KHN0YXJnZXQpID8gTVNHX0VYVF9QUFJfRFRfUkVRIDogMCkKKwkJCSsgKHNwaV9xYXMoc3RhcmdldCkgPyBNU0dfRVhUX1BQUl9RQVNfUkVRIDogMCkKKwkJCSsgKHNwaV9pdShzdGFyZ2V0KSA/ICBNU0dfRVhUX1BQUl9JVV9SRVEgOiAwKQorCQkJKyAoc3BpX3JkX3N0cm0oc3RhcmdldCkgPyBNU0dfRVhUX1BQUl9SRF9TVFJNIDogMCkKKwkJCSsgKHNwaV9wY29tcF9lbihzdGFyZ2V0KSA/IE1TR19FWFRfUFBSX1BDT01QX0VOIDogMCkKKwkJCSsgKHNwaV9ydGkoc3RhcmdldCkgPyBNU0dfRVhUX1BQUl9SVEkgOiAwKQorCQkJKyAoc3BpX3dyX2Zsb3coc3RhcmdldCkgPyBNU0dfRVhUX1BQUl9XUl9GTE9XIDogMCkKKwkJCSsgKHNwaV9ob2xkX21jcyhzdGFyZ2V0KSA/IE1TR19FWFRfUFBSX0hPTERfTUNTIDogMCk7CisKKwkJaWYgKHRpbmZvLT5jdXJyLnBlcmlvZCA9PSBzcGlfcGVyaW9kKHN0YXJnZXQpCisJCSAgICAmJiB0aW5mby0+Y3Vyci53aWR0aCA9PSBzcGlfd2lkdGgoc3RhcmdldCkKKwkJICAgICYmIHRpbmZvLT5jdXJyLm9mZnNldCA9PSBzcGlfb2Zmc2V0KHN0YXJnZXQpCisJCSAmJiB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyA9PSB0YXJnZXRfcHByX29wdGlvbnMpCisJCQlpZiAoYm9vdHZlcmJvc2UgPT0gMCkKKwkJCQlicmVhazsKKworCQlzcGlfcGVyaW9kKHN0YXJnZXQpID0gdGluZm8tPmN1cnIucGVyaW9kOworCQlzcGlfd2lkdGgoc3RhcmdldCkgPSB0aW5mby0+Y3Vyci53aWR0aDsKKwkJc3BpX29mZnNldChzdGFyZ2V0KSA9IHRpbmZvLT5jdXJyLm9mZnNldDsKKwkJc3BpX2R0KHN0YXJnZXQpID0gdGluZm8tPmN1cnIucHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVEgPyAxIDogMDsKKwkJc3BpX3FhcyhzdGFyZ2V0KSA9IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUUFTX1JFUSA/IDEgOiAwOworCQlzcGlfaXUoc3RhcmdldCkgPSB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSA/IDEgOiAwOworCQlzcGlfcmRfc3RybShzdGFyZ2V0KSA9IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUkRfU1RSTSA/IDEgOiAwOworCQlzcGlfcGNvbXBfZW4oc3RhcmdldCkgPSAgdGluZm8tPmN1cnIucHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9QQ09NUF9FTiA/IDEgOiAwOworCQlzcGlfcnRpKHN0YXJnZXQpID0gIHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgIE1TR19FWFRfUFBSX1JUSSA/IDEgOiAwOworCQlzcGlfd3JfZmxvdyhzdGFyZ2V0KSA9IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfV1JfRkxPVyA/IDEgOiAwOworCQlzcGlfaG9sZF9tY3Moc3RhcmdldCkgPSB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0hPTERfTUNTID8gMSA6IDA7CisJCXNwaV9kaXNwbGF5X3hmZXJfYWdyZWVtZW50KHN0YXJnZXQpOworCQlicmVhazsKKwl9CisgICAgICAgIGNhc2UgQUNfU0VOVF9CRFI6CisJeworCQlXQVJOX09OKGx1biAhPSBDQU1fTFVOX1dJTERDQVJEKTsKKwkJc2NzaV9yZXBvcnRfZGV2aWNlX3Jlc2V0KGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCwKKwkJCQkJIGNoYW5uZWwgLSAnQScsIHRhcmdldCk7CisJCWJyZWFrOworCX0KKyAgICAgICAgY2FzZSBBQ19CVVNfUkVTRVQ6CisJCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QgIT0gTlVMTCkgeworCQkJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCwKKwkJCQkJICAgICAgY2hhbm5lbCAtICdBJyk7CisJCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwYW5pYygiYWhkX3NlbmRfYXN5bmM6IFVuZXhwZWN0ZWQgYXN5bmMgZXZlbnQiKTsKKyAgICAgICAgfQorfQorCisvKgorICogQ2FsbHMgdGhlIGhpZ2hlciBsZXZlbCBzY3NpIGRvbmUgZnVuY3Rpb24gYW5kIGZyZWVzIHRoZSBzY2IuCisgKi8KK3ZvaWQKK2FoZF9kb25lKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlzdHJ1Y3QJICBhaGRfbGludXhfZGV2aWNlICpkZXY7CisKKwlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfQUNUSVZFKSA9PSAwKSB7CisJCXByaW50ZigiU0NCICVkIGRvbmUnZCB0d2ljZVxuIiwgU0NCX0dFVF9UQUcoc2NiKSk7CisJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwkJcGFuaWMoIlN0b3BwaW5nIGZvciBzYWZldHkiKTsKKwl9CisJTElTVF9SRU1PVkUoc2NiLCBwZW5kaW5nX2xpbmtzKTsKKwljbWQgPSBzY2ItPmlvX2N0eDsKKwlkZXYgPSBzY2ItPnBsYXRmb3JtX2RhdGEtPmRldjsKKwlkZXYtPmFjdGl2ZS0tOworCWRldi0+b3BlbmluZ3MrKzsKKwlpZiAoKGNtZC0+cmVzdWx0ICYgKENBTV9ERVZfUUZSWk4gPDwgMTYpKSAhPSAwKSB7CisJCWNtZC0+cmVzdWx0ICY9IH4oQ0FNX0RFVl9RRlJaTiA8PCAxNik7CisJCWRldi0+cWZyb3plbi0tOworCX0KKwlhaGRfbGludXhfdW5tYXBfc2NiKGFoZCwgc2NiKTsKKworCS8qCisJICogR3VhcmQgYWdhaW5zdCBzdGFsZSBzZW5zZSBkYXRhLgorCSAqIFRoZSBMaW51eCBtaWQtbGF5ZXIgYXNzdW1lcyB0aGF0IHNlbnNlCisJICogd2FzIHJldHJpZXZlZCBhbnl0aW1lIHRoZSBmaXJzdCBieXRlIG9mCisJICogdGhlIHNlbnNlIGJ1ZmZlciBsb29rcyAic2FuZSIuCisJICovCisJY21kLT5zZW5zZV9idWZmZXJbMF0gPSAwOworCWlmIChhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9SRVFfSU5QUk9HKSB7CisJCXVpbnQzMl90IGFtb3VudF94ZmVycmVkOworCisJCWFtb3VudF94ZmVycmVkID0KKwkJICAgIGFoZF9nZXRfdHJhbnNmZXJfbGVuZ3RoKHNjYikgLSBhaGRfZ2V0X3Jlc2lkdWFsKHNjYik7CisJCWlmICgoc2NiLT5mbGFncyAmIFNDQl9UUkFOU01JU1NJT05fRVJST1IpICE9IDApIHsKKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUlTQykgIT0gMCkgeworCQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCQlwcmludGYoIlNldCBDQU1fVU5DT1JfUEFSSVRZXG4iKTsKKwkJCX0KKyNlbmRpZgorCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fVU5DT1JfUEFSSVRZKTsKKyNpZmRlZiBBSERfUkVQT1JUX1VOREVSRkxPV1MKKwkJLyoKKwkJICogVGhpcyBjb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYXMgc29tZQorCQkgKiBjbGllbnRzIG9mIHRoZSBTQ1NJIHN5c3RlbSBkbyBub3QgcHJvcGVybHkKKwkJICogaW5pdGlhbGl6ZSB0aGUgdW5kZXJmbG93IHBhcmFtZXRlci4gIFRoaXMKKwkJICogcmVzdWx0cyBpbiBzcHVyaW91cyB0ZXJtaW5hdGlvbiBvZiBjb21tYW5kcworCQkgKiB0aGF0IGNvbXBsZXRlIGFzIGV4cGVjdGVkIChlLmcuIHVuZGVyZmxvdyBpcworCQkgKiBhbGxvd2VkIGFzIGNvbW1hbmQgY2FuIHJldHVybiB2YXJpYWJsZSBhbW91bnRzCisJCSAqIG9mIGRhdGEuCisJCSAqLworCQl9IGVsc2UgaWYgKGFtb3VudF94ZmVycmVkIDwgc2NiLT5pb19jdHgtPnVuZGVyZmxvdykgeworCQkJdV9pbnQgaTsKKworCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJcHJpbnRmKCJDREI6Iik7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5pb19jdHgtPmNtZF9sZW47IGkrKykKKwkJCQlwcmludGYoIiAweCV4Iiwgc2NiLT5pb19jdHgtPmNtbmRbaV0pOworCQkJcHJpbnRmKCJcbiIpOworCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJcHJpbnRmKCJTYXcgdW5kZXJmbG93ICglbGQgb2YgJWxkIGJ5dGVzKS4gIgorCQkJICAgICAgICJUcmVhdGVkIGFzIGVycm9yXG4iLAorCQkJCWFoZF9nZXRfcmVzaWR1YWwoc2NiKSwKKwkJCQlhaGRfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpKTsKKwkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX0RBVEFfUlVOX0VSUik7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1JFUV9DTVApOworCQl9CisJfSBlbHNlIGlmIChhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9TQ1NJX1NUQVRVU19FUlJPUikgeworCQlhaGRfbGludXhfaGFuZGxlX3Njc2lfc3RhdHVzKGFoZCwgY21kLT5kZXZpY2UsIHNjYik7CisJfQorCisJaWYgKGRldi0+b3BlbmluZ3MgPT0gMQorCSAmJiBhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9SRVFfQ01QCisJICYmIGFoZF9nZXRfc2NzaV9zdGF0dXMoc2NiKSAhPSBTQ1NJX1NUQVRVU19RVUVVRV9GVUxMKQorCQlkZXYtPnRhZ19zdWNjZXNzX2NvdW50Kys7CisJLyoKKwkgKiBTb21lIGRldmljZXMgZGVhbCB3aXRoIHRlbXBvcmFyeSBpbnRlcm5hbCByZXNvdXJjZQorCSAqIHNob3J0YWdlcyBieSByZXR1cm5pbmcgcXVldWUgZnVsbC4gIFdoZW4gdGhlIHF1ZXVlCisJICogZnVsbCBvY2N1cnJzLCB3ZSB0aHJvdHRsZSBiYWNrLiAgU2xvd2x5IHRyeSB0byBnZXQKKwkgKiBiYWNrIHRvIG91ciBwcmV2aW91cyBxdWV1ZSBkZXB0aC4KKwkgKi8KKwlpZiAoKGRldi0+b3BlbmluZ3MgKyBkZXYtPmFjdGl2ZSkgPCBkZXYtPm1heHRhZ3MKKwkgJiYgZGV2LT50YWdfc3VjY2Vzc19jb3VudCA+IEFIRF9UQUdfU1VDQ0VTU19JTlRFUlZBTCkgeworCQlkZXYtPnRhZ19zdWNjZXNzX2NvdW50ID0gMDsKKwkJZGV2LT5vcGVuaW5ncysrOworCX0KKworCWlmIChkZXYtPmFjdGl2ZSA9PSAwKQorCQlkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9IDA7CisKKwlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfUkVDT1ZFUllfU0NCKSAhPSAwKSB7CisJCXByaW50ZigiUmVjb3ZlcnkgU0NCIGNvbXBsZXRlc1xuIik7CisJCWlmIChhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9CRFJfU0VOVAorCQkgfHwgYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fUkVRX0FCT1JURUQpCisJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9DTURfVElNRU9VVCk7CisJCWlmICgoYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9TQ0JfVVBfRUhfU0VNKSAhPSAwKSB7CisJCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICY9IH5BSERfU0NCX1VQX0VIX1NFTTsKKwkJCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7CisJCX0KKwl9CisKKwlhaGRfZnJlZV9zY2IoYWhkLCBzY2IpOworCWFoZF9saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhkLCBjbWQpOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2hhbmRsZV9zY3NpX3N0YXR1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgIHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IHNjYiAqc2NiKQoreworCXN0cnVjdAlhaGRfZGV2aW5mbyBkZXZpbmZvOworCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYgPSBzY3NpX3RyYW5zcG9ydF9kZXZpY2VfZGF0YShzZGV2KTsKKworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sCisJCQkgICAgYWhkLT5vdXJfaWQsCisJCQkgICAgc2Rldi0+c2Rldl90YXJnZXQtPmlkLCBzZGV2LT5sdW4sCisJCQkgICAgc2Rldi0+c2Rldl90YXJnZXQtPmNoYW5uZWwgPT0gMCA/ICdBJyA6ICdCJywKKwkJCSAgICBST0xFX0lOSVRJQVRPUik7CisJCisJLyoKKwkgKiBXZSBkb24ndCBjdXJyZW50bHkgdHJ1c3QgdGhlIG1pZC1sYXllciB0bworCSAqIHByb3Blcmx5IGRlYWwgd2l0aCBxdWV1ZSBmdWxsIG9yIGJ1c3kuICBTbywKKwkgKiB3aGVuIG9uZSBvY2N1cnMsIHdlIHRlbGwgdGhlIG1pZC1sYXllciB0bworCSAqIHVuY29uZGl0aW9uYWxseSByZXF1ZXVlIHRoZSBjb21tYW5kIHRvIHVzCisJICogc28gdGhhdCB3ZSBjYW4gcmV0cnkgaXQgb3Vyc2VsdmVzLiAgV2UgYWxzbworCSAqIGltcGxlbWVudCBvdXIgb3duIHRocm90dGxpbmcgbWVjaGFuaXNtIHNvCisJICogd2UgZG9uJ3QgY2xvYmJlciB0aGUgZGV2aWNlIHdpdGggdG9vIG1hbnkKKwkgKiBjb21tYW5kcy4KKwkgKi8KKwlzd2l0Y2ggKGFoZF9nZXRfc2NzaV9zdGF0dXMoc2NiKSkgeworCWRlZmF1bHQ6CisJCWJyZWFrOworCWNhc2UgU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORDoKKwljYXNlIFNDU0lfU1RBVFVTX0NNRF9URVJNSU5BVEVEOgorCXsKKwkJc3RydWN0IHNjc2lfY21uZCAqY21kOworCisJCS8qCisJCSAqIENvcHkgc2Vuc2UgaW5mb3JtYXRpb24gdG8gdGhlIE9TJ3MgY21kCisJCSAqIHN0cnVjdHVyZSBpZiBpdCBpcyBhdmFpbGFibGUuCisJCSAqLworCQljbWQgPSBzY2ItPmlvX2N0eDsKKwkJaWYgKChzY2ItPmZsYWdzICYgKFNDQl9TRU5TRXxTQ0JfUEtUX1NFTlNFKSkgIT0gMCkgeworCQkJc3RydWN0IHNjc2lfc3RhdHVzX2l1X2hlYWRlciAqc2l1OworCQkJdV9pbnQgc2Vuc2Vfc2l6ZTsKKwkJCXVfaW50IHNlbnNlX29mZnNldDsKKworCQkJaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpIHsKKwkJCQlzZW5zZV9zaXplID0gTUlOKHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKQorCQkJCQkgICAgICAgLSBhaGRfZ2V0X3NlbnNlX3Jlc2lkdWFsKHNjYiksCisJCQkJCQkgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCQkJc2Vuc2Vfb2Zmc2V0ID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBDb3B5IG9ubHkgdGhlIHNlbnNlIGRhdGEgaW50byB0aGUgcHJvdmlkZWQKKwkJCQkgKiBidWZmZXIuCisJCQkJICovCisJCQkJc2l1ID0gKHN0cnVjdCBzY3NpX3N0YXR1c19pdV9oZWFkZXIgKikKKwkJCQkgICAgc2NiLT5zZW5zZV9kYXRhOworCQkJCXNlbnNlX3NpemUgPSBNSU4oc2NzaV80YnRvdWwoc2l1LT5zZW5zZV9sZW5ndGgpLAorCQkJCQkJc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCQkJc2Vuc2Vfb2Zmc2V0ID0gU0lVX1NFTlNFX09GRlNFVChzaXUpOworCQkJfQorCisJCQltZW1zZXQoY21kLT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOworCQkJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLAorCQkJICAgICAgIGFoZF9nZXRfc2Vuc2VfYnVmKGFoZCwgc2NiKQorCQkJICAgICAgICsgc2Vuc2Vfb2Zmc2V0LCBzZW5zZV9zaXplKTsKKwkJCWNtZC0+cmVzdWx0IHw9IChEUklWRVJfU0VOU0UgPDwgMjQpOworCisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfU0VOU0UpIHsKKwkJCQlpbnQgaTsKKworCQkJCXByaW50ZigiQ29waWVkICVkIGJ5dGVzIG9mIHNlbnNlIGRhdGEgYXQgJWQ6IiwKKwkJCQkgICAgICAgc2Vuc2Vfc2l6ZSwgc2Vuc2Vfb2Zmc2V0KTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgc2Vuc2Vfc2l6ZTsgaSsrKSB7CisJCQkJCWlmICgoaSAmIDB4RikgPT0gMCkKKwkJCQkJCXByaW50ZigiXG4iKTsKKwkJCQkJcHJpbnRmKCIweCV4ICIsIGNtZC0+c2Vuc2VfYnVmZmVyW2ldKTsKKwkJCQl9CisJCQkJcHJpbnRmKCJcbiIpOworCQkJfQorI2VuZGlmCisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgU0NTSV9TVEFUVVNfUVVFVUVfRlVMTDoKKwkJLyoKKwkJICogQnkgdGhlIHRpbWUgdGhlIGNvcmUgZHJpdmVyIGhhcyByZXR1cm5lZCB0aGlzCisJCSAqIGNvbW1hbmQsIGFsbCBvdGhlciBjb21tYW5kcyB0aGF0IHdlcmUgcXVldWVkCisJCSAqIHRvIHVzIGJ1dCBub3QgdGhlIGRldmljZSBoYXZlIGJlZW4gcmV0dXJuZWQuCisJCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGRldi0+YWN0aXZlIGlzIGVxdWFsIHRvCisJCSAqIHRoZSBudW1iZXIgb2YgY29tbWFuZHMgYWN0dWFsbHkgcXVldWVkIHRvCisJCSAqIHRoZSBkZXZpY2UuCisJCSAqLworCQlkZXYtPnRhZ19zdWNjZXNzX2NvdW50ID0gMDsKKwkJaWYgKGRldi0+YWN0aXZlICE9IDApIHsKKwkJCS8qCisJCQkgKiBEcm9wIG91ciBvcGVuaW5nIGNvdW50IHRvIHRoZSBudW1iZXIKKwkJCSAqIG9mIGNvbW1hbmRzIGN1cnJlbnRseSBvdXRzdGFuZGluZy4KKwkJCSAqLworCQkJZGV2LT5vcGVuaW5ncyA9IDA7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1FGVUxMKSAhPSAwKSB7CisJCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJCXByaW50ZigiRHJvcHBpbmcgdGFnIGNvdW50IHRvICVkXG4iLAorCQkJCSAgICAgICBkZXYtPmFjdGl2ZSk7CisJCQl9CisjZW5kaWYKKwkJCWlmIChkZXYtPmFjdGl2ZSA9PSBkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwpIHsKKworCQkJCWRldi0+bGFzdF9xdWV1ZWZ1bGxfc2FtZV9jb3VudCsrOworCQkJCS8qCisJCQkJICogSWYgd2UgcmVwZWF0ZWRseSBzZWUgYSBxdWV1ZSBmdWxsCisJCQkJICogYXQgdGhlIHNhbWUgcXVldWUgZGVwdGgsIHRoaXMKKwkJCQkgKiBkZXZpY2UgaGFzIGEgZml4ZWQgbnVtYmVyIG9mIHRhZworCQkJCSAqIHNsb3RzLiAgTG9jayBpbiB0aGlzIHRhZyBkZXB0aAorCQkJCSAqIHNvIHdlIHN0b3Agc2VlaW5nIHF1ZXVlIGZ1bGxzIGZyb20KKwkJCQkgKiB0aGlzIGRldmljZS4KKwkJCQkgKi8KKwkJCQlpZiAoZGV2LT5sYXN0X3F1ZXVlZnVsbF9zYW1lX2NvdW50CisJCQkJID09IEFIRF9MT0NLX1RBR1NfQ09VTlQpIHsKKwkJCQkJZGV2LT5tYXh0YWdzID0gZGV2LT5hY3RpdmU7CisJCQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCQkJcHJpbnRmKCJMb2NraW5nIG1heCB0YWcgY291bnQgYXQgJWRcbiIsCisJCQkJCSAgICAgICBkZXYtPmFjdGl2ZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwgPSBkZXYtPmFjdGl2ZTsKKwkJCQlkZXYtPmxhc3RfcXVldWVmdWxsX3NhbWVfY291bnQgPSAwOworCQkJfQorCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fUkVRVUVVRV9SRVEpOworCQkJYWhkX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX09LKTsKKwkJCWFoZF9wbGF0Zm9ybV9zZXRfdGFncyhhaGQsICZkZXZpbmZvLAorCQkJCSAgICAgKGRldi0+ZmxhZ3MgJiBBSERfREVWX1FfQkFTSUMpCisJCQkJICAgPyBBSERfUVVFVUVfQkFTSUMgOiBBSERfUVVFVUVfVEFHR0VEKTsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIERyb3AgZG93biB0byBhIHNpbmdsZSBvcGVuaW5nLCBhbmQgdHJlYXQgdGhpcworCQkgKiBhcyBpZiB0aGUgdGFyZ2V0IHJldHVybmVkIEJVU1kgU0NTSSBzdGF0dXMuCisJCSAqLworCQlkZXYtPm9wZW5pbmdzID0gMTsKKwkJYWhkX3BsYXRmb3JtX3NldF90YWdzKGFoZCwgJmRldmluZm8sCisJCQkgICAgIChkZXYtPmZsYWdzICYgQUhEX0RFVl9RX0JBU0lDKQorCQkJICAgPyBBSERfUVVFVUVfQkFTSUMgOiBBSERfUVVFVUVfVEFHR0VEKTsKKwkJYWhkX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX0JVU1kpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJLyoKKwkgKiBNYXAgQ0FNIGVycm9yIGNvZGVzIGludG8gTGludXggRXJyb3IgY29kZXMuICBXZQorCSAqIGF2b2lkIHRoZSBjb252ZXJzaW9uIHNvIHRoYXQgdGhlIERWIGNvZGUgaGFzIHRoZQorCSAqIGZ1bGwgZXJyb3IgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHdoZW4gbWFraW5nCisJICogc3RhdGUgY2hhbmdlIGRlY2lzaW9ucy4KKwkgKi8KKwl7CisJCXVpbnQzMl90IHN0YXR1czsKKwkJdV9pbnQgbmV3X3N0YXR1czsKKworCQlzdGF0dXMgPSBhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKTsKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBDQU1fUkVRX0lOUFJPRzoKKwkJY2FzZSBDQU1fUkVRX0NNUDoKKwkJY2FzZSBDQU1fU0NTSV9TVEFUVVNfRVJST1I6CisJCQluZXdfc3RhdHVzID0gRElEX09LOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1JFUV9BQk9SVEVEOgorCQkJbmV3X3N0YXR1cyA9IERJRF9BQk9SVDsKKwkJCWJyZWFrOworCQljYXNlIENBTV9CVVNZOgorCQkJbmV3X3N0YXR1cyA9IERJRF9CVVNfQlVTWTsKKwkJCWJyZWFrOworCQljYXNlIENBTV9SRVFfSU5WQUxJRDoKKwkJY2FzZSBDQU1fUEFUSF9JTlZBTElEOgorCQkJbmV3X3N0YXR1cyA9IERJRF9CQURfVEFSR0VUOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1NFTF9USU1FT1VUOgorCQkJbmV3X3N0YXR1cyA9IERJRF9OT19DT05ORUNUOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1NDU0lfQlVTX1JFU0VUOgorCQljYXNlIENBTV9CRFJfU0VOVDoKKwkJCW5ld19zdGF0dXMgPSBESURfUkVTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fVU5DT1JfUEFSSVRZOgorCQkJbmV3X3N0YXR1cyA9IERJRF9QQVJJVFk7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fQ01EX1RJTUVPVVQ6CisJCQluZXdfc3RhdHVzID0gRElEX1RJTUVfT1VUOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1VBX0FCT1JUOgorCQljYXNlIENBTV9SRVFfQ01QX0VSUjoKKwkJY2FzZSBDQU1fQVVUT1NFTlNFX0ZBSUw6CisJCWNhc2UgQ0FNX05PX0hCQToKKwkJY2FzZSBDQU1fREFUQV9SVU5fRVJSOgorCQljYXNlIENBTV9VTkVYUF9CVVNGUkVFOgorCQljYXNlIENBTV9TRVFVRU5DRV9GQUlMOgorCQljYXNlIENBTV9DQ0JfTEVOX0VSUjoKKwkJY2FzZSBDQU1fUFJPVklERV9GQUlMOgorCQljYXNlIENBTV9SRVFfVEVSTUlPOgorCQljYXNlIENBTV9VTlJFQ19IQkFfRVJST1I6CisJCWNhc2UgQ0FNX1JFUV9UT09fQklHOgorCQkJbmV3X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJCWJyZWFrOworCQljYXNlIENBTV9SRVFVRVVFX1JFUToKKwkJCW5ld19zdGF0dXMgPSBESURfUkVRVUVVRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlICovCisJCQluZXdfc3RhdHVzID0gRElEX0VSUk9SOworCQkJYnJlYWs7CisJCX0KKworCQlhaGRfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kLCBuZXdfc3RhdHVzKTsKKwl9CisKKwljbWQtPnNjc2lfZG9uZShjbWQpOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3NlbV90aW1lb3V0KHVfbG9uZyBhcmcpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCXVfbG9uZwlzOworCisJYWhkID0gKHN0cnVjdCBhaGRfc29mdGMgKilhcmc7CisKKwlhaGRfbG9jayhhaGQsICZzKTsKKwlpZiAoKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfU0NCX1VQX0VIX1NFTSkgIT0gMCkgeworCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICY9IH5BSERfU0NCX1VQX0VIX1NFTTsKKwkJdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKKwl9CisJYWhkX3VubG9jayhhaGQsICZzKTsKK30KKwordm9pZAorYWhkX2ZyZWV6ZV9zaW1xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGQtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4rKzsKKwlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID09IDEpIHsKKwkJc2NzaV9ibG9ja19yZXF1ZXN0cyhhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOworCQlhaGRfcGxhdGZvcm1fYWJvcnRfc2NicyhhaGQsIENBTV9UQVJHRVRfV0lMRENBUkQsIEFMTF9DSEFOTkVMUywKKwkJCQkJQ0FNX0xVTl9XSUxEQ0FSRCwgU0NCX0xJU1RfTlVMTCwKKwkJCQkJUk9MRV9JTklUSUFUT1IsIENBTV9SRVFVRVVFX1JFUSk7CisJfQorfQorCit2b2lkCithaGRfcmVsZWFzZV9zaW1xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1X2xvbmcgczsKKwlpbnQgICAgdW5ibG9ja19yZXFzOworCisJdW5ibG9ja19yZXFzID0gMDsKKwlhaGRfbG9jayhhaGQsICZzKTsKKwlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID4gMCkKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuLS07CisJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA9PSAwKSB7CisJCXVuYmxvY2tfcmVxcyA9IDE7CisJfQorCWFoZF91bmxvY2soYWhkLCAmcyk7CisJLyoKKwkgKiBUaGVyZSBpcyBzdGlsbCBhIHJhY2UgaGVyZS4gIFRoZSBtaWQtbGF5ZXIKKwkgKiBzaG91bGQga2VlcCBpdHMgb3duIGZyZWV6ZSBjb3VudCBhbmQgdXNlCisJICogYSBib3R0b20gaGFsZiBoYW5kbGVyIHRvIHJ1biB0aGUgcXVldWVzCisJICogc28gd2UgY2FuIHVuYmxvY2sgd2l0aCBvdXIgb3duIGxvY2sgaGVsZC4KKwkgKi8KKwlpZiAodW5ibG9ja19yZXFzKQorCQlzY3NpX3VuYmxvY2tfcmVxdWVzdHMoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0KTsKK30KKworc3RhdGljIGludAorYWhkX2xpbnV4X3F1ZXVlX3JlY292ZXJ5X2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHNjYl9mbGFnIGZsYWcpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOwogCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7CiAJc3RydWN0IHNjYiAqcGVuZGluZ19zY2I7Ci0JdV9sb25nIHM7CiAJdV9pbnQgIHNhdmVkX3NjYnB0cjsKIAl1X2ludCAgYWN0aXZlX3NjYnB0cjsKIAl1X2ludCAgbGFzdF9waGFzZTsKKwl1X2ludCAgc2F2ZWRfc2NzaWlkOwogCXVfaW50ICBjZGJfYnl0ZTsKIAlpbnQgICAgcmV0dmFsOwogCWludCAgICB3YXNfcGF1c2VkOwpAQCAtMTIxNywzMCArMjA2OCwxOCBAQAogCXBhdXNlZCA9IEZBTFNFOwogCXdhaXQgPSBGQUxTRTsKIAlhaGQgPSAqKHN0cnVjdCBhaGRfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwotCWFjbWQgPSAoc3RydWN0IGFoZF9jbWQgKiljbWQ7CiAKLQlwcmludGYoIiVzOiVkOiVkOiVkOiBBdHRlbXB0aW5nIHRvIGFib3J0IGNtZCAlcDoiLAotCSAgICAgICBhaGRfbmFtZShhaGQpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgY21kLT5kZXZpY2UtPmlkLAotCSAgICAgICBjbWQtPmRldmljZS0+bHVuLCBjbWQpOworCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IEF0dGVtcHRpbmcgdG8gcXVldWUgYSVzIG1lc3NhZ2U6IiwKKwkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJICAgICAgIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwKKwkgICAgICAgZmxhZyA9PSBTQ0JfQUJPUlQgPyAibiBBQk9SVCIgOiAiIFRBUkdFVCBSRVNFVCIpOworCisJcHJpbnRmKCJDREI6Iik7CiAJZm9yIChjZGJfYnl0ZSA9IDA7IGNkYl9ieXRlIDwgY21kLT5jbWRfbGVuOyBjZGJfYnl0ZSsrKQogCQlwcmludGYoIiAweCV4IiwgY21kLT5jbW5kW2NkYl9ieXRlXSk7CiAJcHJpbnRmKCJcbiIpOwogCi0JLyoKLQkgKiBJbiBhbGwgdmVyc2lvbnMgb2YgTGludXgsIHdlIGhhdmUgdG8gd29yayBhcm91bmQKLQkgKiBhIG1ham9yIGZsYXcgaW4gaG93IHRoZSBtaWQtbGF5ZXIgaXMgbG9ja2VkIGRvd24KLQkgKiBpZiB3ZSBhcmUgdG8gc2xlZXAgc3VjY2Vzc2Z1bGx5IGluIG91ciBlcnJvciBoYW5kbGVyCi0JICogd2hpbGUgYWxsb3dpbmcgb3VyIGludGVycnVwdCBoYW5kbGVyIHRvIHJ1bi4gIFNpbmNlCi0JICogdGhlIG1pZGxheWVyIGFjcXVpcmVzIGVpdGhlciB0aGUgaW9fcmVxdWVzdF9sb2NrIG9yCi0JICogb3VyIGxvY2sgcHJpb3IgdG8gY2FsbGluZyB1cywgd2UgbXVzdCB1c2UgdGhlCi0JICogc3Bpbl91bmxvY2tfaXJxKCkgbWV0aG9kIGZvciB1bmxvY2tpbmcgb3VyIGxvY2suCi0JICogVGhpcyB3aWxsIGZvcmNlIGludGVycnVwdHMgdG8gYmUgZW5hYmxlZCBvbiB0aGUKLQkgKiBjdXJyZW50IENQVS4gIFNpbmNlIHRoZSBFSCB0aHJlYWQgc2hvdWxkIG5vdCBoYXZlCi0JICogYmVlbiBydW5uaW5nIHdpdGggQ1BVIGludGVycnVwdHMgZGlzYWJsZWQgb3RoZXIgdGhhbgotCSAqIGJ5IGFjcXVpcmluZyBlaXRoZXIgdGhlIGlvX3JlcXVlc3RfbG9jayBvciBvdXIgb3duCi0JICogbG9jaywgdGhpcyAqc2hvdWxkKiBiZSBzYWZlLgotCSAqLwotCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X2xvY2soYWhkLCAmcyk7CisJc3Bpbl9sb2NrX2lycSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOwogCiAJLyoKIAkgKiBGaXJzdCBkZXRlcm1pbmUgaWYgd2UgY3VycmVudGx5IG93biB0aGlzIGNvbW1hbmQuCkBAIC0xMjQ5LDkgKzIwODgsNyBAQAogCSAqIGF0IGFsbCwgYW5kIHRoZSBzeXN0ZW0gd2FudGVkIHVzIHRvIGp1c3QgYWJvcnQgdGhlCiAJICogY29tbWFuZCwgcmV0dXJuIHN1Y2Nlc3MuCiAJICovCi0JZGV2ID0gYWhkX2xpbnV4X2dldF9kZXZpY2UoYWhkLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwKLQkJCQkgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sCi0JCQkJICAgLyphbGxvYyovRkFMU0UpOworCWRldiA9IHNjc2lfdHJhbnNwb3J0X2RldmljZV9kYXRhKGNtZC0+ZGV2aWNlKTsKIAogCWlmIChkZXYgPT0gTlVMTCkgewogCQkvKgpAQCAtMTI2NSwyMiArMjEwMiw2IEBACiAJCWdvdG8gbm9fY21kOwogCX0KIAotCVRBSUxRX0ZPUkVBQ0gobGlzdF9hY21kLCAmZGV2LT5idXN5cSwgYWNtZF9saW5rcy50cWUpIHsKLQkJaWYgKGxpc3RfYWNtZCA9PSBhY21kKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGxpc3RfYWNtZCAhPSBOVUxMKSB7Ci0JCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENvbW1hbmQgZm91bmQgb24gZGV2aWNlIHF1ZXVlXG4iLAotCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKLQkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOwotCQlUQUlMUV9SRU1PVkUoJmRldi0+YnVzeXEsIGxpc3RfYWNtZCwgYWNtZF9saW5rcy50cWUpOwotCQljbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKLQkJYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGQsIGNtZCk7Ci0JCXJldHZhbCA9IFNVQ0NFU1M7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KIAkvKgogCSAqIFNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoaW5nIGNtZCBpbiB0aGUgcGVuZGluZyBsaXN0LgogCSAqLwpAQCAtMTI4OSw2ICsyMTEwLDE4IEBACiAJCQlicmVhazsKIAl9CiAKKwlpZiAocGVuZGluZ19zY2IgPT0gTlVMTCAmJiBmbGFnID09IFNDQl9ERVZJQ0VfUkVTRVQpIHsKKworCQkvKiBBbnkgU0NCIGZvciB0aGlzIGRldmljZSB3aWxsIGRvIGZvciBhIHRhcmdldCByZXNldCAqLworCQlMSVNUX0ZPUkVBQ0gocGVuZGluZ19zY2IsICZhaGQtPnBlbmRpbmdfc2NicywgcGVuZGluZ19saW5rcykgeworCQkgIAlpZiAoYWhkX21hdGNoX3NjYihhaGQsIHBlbmRpbmdfc2NiLCBjbWQtPmRldmljZS0+aWQsCisJCQkJCSAgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsCisJCQkJCSAgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCQkJICBTQ0JfTElTVF9OVUxMLCBST0xFX0lOSVRJQVRPUikgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKwogCWlmIChwZW5kaW5nX3NjYiA9PSBOVUxMKSB7CiAJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENvbW1hbmQgbm90IGZvdW5kXG4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKQEAgLTEzMjYsMTUgKzIxNTksMjUgQEAKIAlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CiAKIAlkaXNjb25uZWN0ZWQgPSBUUlVFOwotCWlmIChhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLAotCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4sIFNDQl9HRVRfVEFHKHBlbmRpbmdfc2NiKSwKLQkJCSAgICAgICBST0xFX0lOSVRJQVRPUiwgQ0FNX1JFUV9BQk9SVEVELAotCQkJICAgICAgIFNFQVJDSF9DT01QTEVURSkgPiAwKSB7Ci0JCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENtZCBhYm9ydGVkIGZyb20gUUlORklGT1xuIiwKLQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCi0JCQkJY21kLT5kZXZpY2UtPmx1bik7Ci0JCXJldHZhbCA9IFNVQ0NFU1M7Ci0JCWdvdG8gZG9uZTsKKwlpZiAoZmxhZyA9PSBTQ0JfQUJPUlQpIHsKKwkJaWYgKGFoZF9zZWFyY2hfcWluZmlmbyhhaGQsIGNtZC0+ZGV2aWNlLT5pZCwgCisJCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLAorCQkJCSAgICAgICBjbWQtPmRldmljZS0+bHVuLCAKKwkJCQkgICAgICAgcGVuZGluZ19zY2ItPmhzY2ItPnRhZywKKwkJCQkgICAgICAgUk9MRV9JTklUSUFUT1IsIENBTV9SRVFfQUJPUlRFRCwKKwkJCQkgICAgICAgU0VBUkNIX0NPTVBMRVRFKSA+IDApIHsKKwkJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENtZCBhYm9ydGVkIGZyb20gUUlORklGT1xuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgCisJCQkgICAgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCXJldHZhbCA9IFNVQ0NFU1M7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9IGVsc2UgaWYgKGFoZF9zZWFyY2hfcWluZmlmbyhhaGQsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJCQkgICAgICBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgICBjbWQtPmRldmljZS0+bHVuLCBwZW5kaW5nX3NjYi0+aHNjYi0+dGFnLAorCQkJCSAgICAgIFJPTEVfSU5JVElBVE9SLCAvKnN0YXR1cyovMCwKKwkJCQkgICAgICBTRUFSQ0hfQ09VTlQpID4gMCkgeworCQlkaXNjb25uZWN0ZWQgPSBGQUxTRTsKIAl9CiAKIAlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CkBAIC0xMzQ4LDYgKzIxOTEsMTAgQEAKIAkJYnVzX3NjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgYWN0aXZlX3NjYnB0cik7CiAJCWlmIChidXNfc2NiID09IHBlbmRpbmdfc2NiKQogCQkJZGlzY29ubmVjdGVkID0gRkFMU0U7CisJCWVsc2UgaWYgKGZsYWcgIT0gU0NCX0FCT1JUCisJCQkgJiYgYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCkgPT0gcGVuZGluZ19zY2ItPmhzY2ItPnNjc2lpZAorCQkJICYmIGFoZF9pbmIoYWhkLCBTQVZFRF9MVU4pID09IFNDQl9HRVRfTFVOKHBlbmRpbmdfc2NiKSkKKwkJCWRpc2Nvbm5lY3RlZCA9IEZBTFNFOwogCX0KIAogCS8qCkBAIC0xMzU1LDE1ICsyMjAyLDE4IEBACiAJICogcGFzc2VkIGluIGNvbW1hbmQuICBUaGF0IGNvbW1hbmQgaXMgY3VycmVudGx5IGFjdGl2ZSBvbiB0aGUKIAkgKiBidXMgb3IgaXMgaW4gdGhlIGRpc2Nvbm5lY3RlZCBzdGF0ZS4KIAkgKi8KKwlzYXZlZF9zY3NpaWQgPSBhaGRfaW5iKGFoZCwgU0FWRURfU0NTSUlEKTsKIAlpZiAobGFzdF9waGFzZSAhPSBQX0JVU0ZSRUUKLQkgJiYgU0NCX0dFVF9UQUcocGVuZGluZ19zY2IpID09IGFjdGl2ZV9zY2JwdHIpIHsKKwkgJiYgKFNDQl9HRVRfVEFHKHBlbmRpbmdfc2NiKSA9PSBhY3RpdmVfc2NicHRyCisJICAgICB8fCAoZmxhZyA9PSBTQ0JfREVWSUNFX1JFU0VUCisJCSAmJiBTQ1NJSURfVEFSR0VUKGFoZCwgc2F2ZWRfc2NzaWlkKSA9PSBjbWQtPmRldmljZS0+aWQpKSkgewogCiAJCS8qCiAJCSAqIFdlJ3JlIGFjdGl2ZSBvbiB0aGUgYnVzLCBzbyBhc3NlcnQgQVROCiAJCSAqIGFuZCBob3BlIHRoYXQgdGhlIHRhcmdldCByZXNwb25kcy4KIAkJICovCiAJCXBlbmRpbmdfc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBhY3RpdmVfc2NicHRyKTsKLQkJcGVuZGluZ19zY2ItPmZsYWdzIHw9IFNDQl9SRUNPVkVSWV9TQ0J8U0NCX0FCT1JUOworCQlwZW5kaW5nX3NjYi0+ZmxhZ3MgfD0gU0NCX1JFQ09WRVJZX1NDQnxmbGFnOwogCQlhaGRfb3V0YihhaGQsIE1TR19PVVQsIEhPU1RfTVNHKTsKIAkJYWhkX291dGIoYWhkLCBTQ1NJU0lHTywgbGFzdF9waGFzZXxBVE5PKTsKIAkJcHJpbnRmKCIlczolZDolZDolZDogRGV2aWNlIGlzIGFjdGl2ZSwgYXNzZXJ0aW5nIEFUTlxuIiwKQEAgLTE0NTEsMTAgKzIzMDEsMTAgQEAKIAkJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiAJCWludCByZXQ7CiAKLQkJcGVuZGluZ19zY2ItPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIRF9TQ0JfVVBfRUhfU0VNOworCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIRF9TQ0JfVVBfRUhfU0VNOwogCQlzcGluX3VubG9ja19pcnEoJmFoZC0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKIAkJaW5pdF90aW1lcigmdGltZXIpOwotCQl0aW1lci5kYXRhID0gKHVfbG9uZylwZW5kaW5nX3NjYjsKKwkJdGltZXIuZGF0YSA9ICh1X2xvbmcpYWhkOwogCQl0aW1lci5leHBpcmVzID0gamlmZmllcyArICg1ICogSFopOwogCQl0aW1lci5mdW5jdGlvbiA9IGFoZF9saW51eF9zZW1fdGltZW91dDsKIAkJYWRkX3RpbWVyKCZ0aW1lcik7CkBAIC0xNDY4LDM1NDkgKzIzMTgsNDcxIEBACiAJCX0KIAkJc3Bpbl9sb2NrX2lycSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOwogCX0KLQlhaGRfc2NoZWR1bGVfcnVucShhaGQpOwotCWFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKTsKLQlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhkLCAmcyk7CisJc3Bpbl91bmxvY2tfaXJxKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CiAJcmV0dXJuIChyZXR2YWwpOwogfQogCi0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZGV2X3Jlc2V0X2NvbXBsZXRlKFNjc2lfQ21uZCAqY21kKQorc3RhdGljIHZvaWQgYWhkX2xpbnV4X3NldF93aWR0aChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCB3aWR0aCkKIHsKLQlmcmVlKGNtZCwgTV9ERVZCVUYpOwotfQotCi0vKgotICogQXR0ZW1wdCB0byBzZW5kIGEgdGFyZ2V0IHJlc2V0IG1lc3NhZ2UgdG8gdGhlIGRldmljZSB0aGF0IHRpbWVkIG91dC4KLSAqLwotc3RhdGljIGludAotYWhkX2xpbnV4X2Rldl9yZXNldChTY3NpX0NtbmQgKmNtZCkKLXsKLQlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7Ci0Jc3RydWN0CXNjc2lfY21uZCAqcmVjb3ZlcnlfY21kOwotCXN0cnVjdAlhaGRfbGludXhfZGV2aWNlICpkZXY7Ci0Jc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOwotCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7Ci0Jc3RydWN0CXNjYiAqc2NiOwotCXN0cnVjdAloYXJkd2FyZV9zY2IgKmhzY2I7Ci0JdV9sb25nCXM7Ci0Jc3RydWN0CXRpbWVyX2xpc3QgdGltZXI7Ci0JaW50CXJldHZhbDsKLQotCWFoZCA9ICooc3RydWN0IGFoZF9zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7Ci0JcmVjb3ZlcnlfY21kID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NzaV9jbW5kKSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKLQlpZiAoIXJlY292ZXJ5X2NtZCkKLQkJcmV0dXJuIChGQUlMRUQpOwotCW1lbXNldChyZWNvdmVyeV9jbWQsIDAsIHNpemVvZihzdHJ1Y3Qgc2NzaV9jbW5kKSk7Ci0JcmVjb3ZlcnlfY21kLT5kZXZpY2UgPSBjbWQtPmRldmljZTsKLQlyZWNvdmVyeV9jbWQtPnNjc2lfZG9uZSA9IGFoZF9saW51eF9kZXZfcmVzZXRfY29tcGxldGU7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19SRUNPVkVSWSkgIT0gMCkKLQkJcHJpbnRmKCIlczolZDolZDolZDogRGV2aWNlIHJlc2V0IGNhbGxlZCBmb3IgY21kICVwXG4iLAotCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKLQkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZCk7Ci0jZW5kaWYKLQlhaGRfbG9jayhhaGQsICZzKTsKLQotCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKLQkJCQkgICBjbWQtPmRldmljZS0+bHVuLCAvKmFsbG9jKi9GQUxTRSk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0JCWtmcmVlKHJlY292ZXJ5X2NtZCk7Ci0JCXJldHVybiAoRkFJTEVEKTsKLQl9Ci0JaWYgKChzY2IgPSBhaGRfZ2V0X3NjYihhaGQsIEFIRF9ORVZFUl9DT0xfSURYKSkgPT0gTlVMTCkgewotCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCQlrZnJlZShyZWNvdmVyeV9jbWQpOwotCQlyZXR1cm4gKEZBSUxFRCk7Ci0JfQotCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsICdBJywgYWhkLT5vdXJfaWQsCi0JCQkJICAgIGNtZC0+ZGV2aWNlLT5pZCwgJnRzdGF0ZSk7Ci0JcmVjb3ZlcnlfY21kLT5yZXN1bHQgPSBDQU1fUkVRX0lOUFJPRyA8PCAxNjsKLQlyZWNvdmVyeV9jbWQtPmhvc3Rfc2NyaWJibGUgPSAoY2hhciAqKXNjYjsKLQlzY2ItPmlvX2N0eCA9IHJlY292ZXJ5X2NtZDsKLQlzY2ItPnBsYXRmb3JtX2RhdGEtPmRldiA9IGRldjsKLQlzY2ItPnNnX2NvdW50ID0gMDsKLQlhaGRfc2V0X3Jlc2lkdWFsKHNjYiwgMCk7Ci0JYWhkX3NldF9zZW5zZV9yZXNpZHVhbChzY2IsIDApOwotCWhzY2IgPSBzY2ItPmhzY2I7Ci0JaHNjYi0+Y29udHJvbCA9IDA7Ci0JaHNjYi0+c2NzaWlkID0gQlVJTERfU0NTSUlEKGFoZCwgY21kKTsKLQloc2NiLT5sdW4gPSBjbWQtPmRldmljZS0+bHVuOwotCWhzY2ItPmNkYl9sZW4gPSAwOwotCWhzY2ItPnRhc2tfbWFuYWdlbWVudCA9IFNJVV9UQVNLTUdNVF9MVU5fUkVTRVQ7Ci0Jc2NiLT5mbGFncyB8PSBTQ0JfREVWSUNFX1JFU0VUfFNDQl9SRUNPVkVSWV9TQ0J8U0NCX0FDVElWRTsKLQlpZiAoKHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSAhPSAwKSB7Ci0JCXNjYi0+ZmxhZ3MgfD0gU0NCX1BBQ0tFVElaRUQ7Ci0JfSBlbHNlIHsKLQkJaHNjYi0+Y29udHJvbCB8PSBNS19NRVNTQUdFOwotCX0KLQlkZXYtPm9wZW5pbmdzLS07Ci0JZGV2LT5hY3RpdmUrKzsKLQlkZXYtPmNvbW1hbmRzX2lzc3VlZCsrOwotCUxJU1RfSU5TRVJUX0hFQUQoJmFoZC0+cGVuZGluZ19zY2JzLCBzY2IsIHBlbmRpbmdfbGlua3MpOwotCWFoZF9xdWV1ZV9zY2IoYWhkLCBzY2IpOwotCi0Jc2NiLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfU0NCX1VQX0VIX1NFTTsKLQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCWluaXRfdGltZXIoJnRpbWVyKTsKLQl0aW1lci5kYXRhID0gKHVfbG9uZylzY2I7Ci0JdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoNSAqIEhaKTsKLQl0aW1lci5mdW5jdGlvbiA9IGFoZF9saW51eF9zZW1fdGltZW91dDsKLQlhZGRfdGltZXIoJnRpbWVyKTsKLQlwcmludGYoIlJlY292ZXJ5IGNvZGUgc2xlZXBpbmdcbiIpOwotCWRvd24oJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKLQlwcmludGYoIlJlY292ZXJ5IGNvZGUgYXdha2VcbiIpOwotCXJldHZhbCA9IFNVQ0NFU1M7Ci0JaWYgKGRlbF90aW1lcl9zeW5jKCZ0aW1lcikgPT0gMCkgewotCQlwcmludGYoIlRpbWVyIEV4cGlyZWRcbiIpOwotCQlyZXR2YWwgPSBGQUlMRUQ7Ci0JfQotCWFoZF9sb2NrKGFoZCwgJnMpOwotCWFoZF9zY2hlZHVsZV9ydW5xKGFoZCk7Ci0JYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGQpOwotCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0JcHJpbnRmKCIlczogRGV2aWNlIHJlc2V0IHJldHVybmluZyAweCV4XG4iLCBhaGRfbmFtZShhaGQpLCByZXR2YWwpOwotCXJldHVybiAocmV0dmFsKTsKLX0KLQotLyoKLSAqIFJlc2V0IHRoZSBTQ1NJIGJ1cy4KLSAqLwotc3RhdGljIGludAotYWhkX2xpbnV4X2J1c19yZXNldChTY3NpX0NtbmQgKmNtZCkKLXsKLQlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7Ci0JdV9sb25nIHM7Ci0JaW50ICAgIGZvdW5kOwotCi0JYWhkID0gKihzdHJ1Y3QgYWhkX3NvZnRjICoqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKLSNpZmRlZiBBSERfREVCVUcKLQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1JFQ09WRVJZKSAhPSAwKQotCQlwcmludGYoIiVzOiBCdXMgcmVzZXQgY2FsbGVkIGZvciBjbWQgJXBcbiIsCi0JCSAgICAgICBhaGRfbmFtZShhaGQpLCBjbWQpOwotI2VuZGlmCi0JYWhkX2xvY2soYWhkLCAmcyk7Ci0JZm91bmQgPSBhaGRfcmVzZXRfY2hhbm5lbChhaGQsIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLAotCQkJCSAgLyppbml0aWF0ZSByZXNldCovVFJVRSk7Ci0JYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGQpOwotCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0KLQlpZiAoYm9vdHZlcmJvc2UpCi0JCXByaW50ZigiJXM6IFNDU0kgYnVzIHJlc2V0IGRlbGl2ZXJlZC4gIgotCQkgICAgICAgIiVkIFNDQnMgYWJvcnRlZC5cbiIsIGFoZF9uYW1lKGFoZCksIGZvdW5kKTsKLQotCXJldHVybiAoU1VDQ0VTUyk7Ci19Ci0KLVNjc2lfSG9zdF9UZW1wbGF0ZSBhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZSA9IHsKLQkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJCT0gImFpYzc5eHgiLAotCS5wcm9jX2luZm8JCT0gYWhkX2xpbnV4X3Byb2NfaW5mbywKLQkuaW5mbwkJCT0gYWhkX2xpbnV4X2luZm8sCi0JLnF1ZXVlY29tbWFuZAkJPSBhaGRfbGludXhfcXVldWUsCi0JLmVoX2Fib3J0X2hhbmRsZXIJPSBhaGRfbGludXhfYWJvcnQsCi0JLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gYWhkX2xpbnV4X2Rldl9yZXNldCwKLQkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBhaGRfbGludXhfYnVzX3Jlc2V0LAotI2lmIGRlZmluZWQoX19pMzg2X18pCi0JLmJpb3NfcGFyYW0JCT0gYWhkX2xpbnV4X2Jpb3NwYXJhbSwKLSNlbmRpZgotCS5jYW5fcXVldWUJCT0gQUhEX01BWF9RVUVVRSwKLQkudGhpc19pZAkJPSAtMSwKLQkuY21kX3Blcl9sdW4JCT0gMiwKLQkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCi0JLnNsYXZlX2FsbG9jCQk9IGFoZF9saW51eF9zbGF2ZV9hbGxvYywKLQkuc2xhdmVfY29uZmlndXJlCT0gYWhkX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZSwKLQkuc2xhdmVfZGVzdHJveQkJPSBhaGRfbGludXhfc2xhdmVfZGVzdHJveSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRhc2tsZXQgSGFuZGxlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBJbiAyLjQuWCBhbmQgYWJvdmUsIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBhIHRhc2tsZXQsCi0gKiBzbyB3ZSBtdXN0IHJlLWFjcXVpcmUgb3VyIGxvY2sgcHJpb3IgdG8gZXhlY3V0aW5nIHRoaXMgY29kZS4KLSAqIEluIGFsbCBwcmlvciBrZXJuZWxzLCBhaGRfc2NoZWR1bGVfcnVucSgpIGNhbGxzIHRoaXMgcm91dGluZQotICogZGlyZWN0bHkgYW5kIGFoZF9zY2hlZHVsZV9ydW5xKCkgaXMgY2FsbGVkIHdpdGggb3VyIGxvY2sgaGVsZC4KLSAqLwotc3RhdGljIHZvaWQKLWFoZF9ydW5xX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBhaGRfc29mdGMqIGFoZDsKLQlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OwotCXVfbG9uZyBmbGFnczsKLQotCWFoZCA9IChzdHJ1Y3QgYWhkX3NvZnRjICopZGF0YTsKLQlhaGRfbG9jayhhaGQsICZmbGFncyk7Ci0Jd2hpbGUgKChkZXYgPSBhaGRfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKGFoZCkpICE9IE5VTEwpIHsKLQkKLQkJVEFJTFFfUkVNT1ZFKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLCBkZXYsIGxpbmtzKTsKLQkJZGV2LT5mbGFncyAmPSB+QUhEX0RFVl9PTl9SVU5fTElTVDsKLQkJYWhkX2xpbnV4X2NoZWNrX2RldmljZV9xdWV1ZShhaGQsIGRldik7Ci0JCS8qIFllaWxkIHRvIG91ciBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCQlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKLQkJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOwotCX0KLQlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEJ1cyBETUEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotYWhkX2RtYV90YWdfY3JlYXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCBwYXJlbnQsCi0JCSAgIGJ1c19zaXplX3QgYWxpZ25tZW50LCBidXNfc2l6ZV90IGJvdW5kYXJ5LAotCQkgICBkbWFfYWRkcl90IGxvd2FkZHIsIGRtYV9hZGRyX3QgaGlnaGFkZHIsCi0JCSAgIGJ1c19kbWFfZmlsdGVyX3QgKmZpbHRlciwgdm9pZCAqZmlsdGVyYXJnLAotCQkgICBidXNfc2l6ZV90IG1heHNpemUsIGludCBuc2VnbWVudHMsCi0JCSAgIGJ1c19zaXplX3QgbWF4c2Vnc3osIGludCBmbGFncywgYnVzX2RtYV90YWdfdCAqcmV0X3RhZykKLXsKLQlidXNfZG1hX3RhZ190IGRtYXQ7Ci0KLQlkbWF0ID0gbWFsbG9jKHNpemVvZigqZG1hdCksIE1fREVWQlVGLCBNX05PV0FJVCk7Ci0JaWYgKGRtYXQgPT0gTlVMTCkKLQkJcmV0dXJuIChFTk9NRU0pOwotCi0JLyoKLQkgKiBMaW51eCBpcyB2ZXJ5IHNpbXBsaXN0aWMgYWJvdXQgRE1BIG1lbW9yeS4gIEZvciBub3cgZG9uJ3QKLQkgKiBtYWludGFpbiBhbGwgc3BlY2lmaWNhdGlvbiBpbmZvcm1hdGlvbi4gIE9uY2UgTGludXggc3VwcGxpZXMKLQkgKiBiZXR0ZXIgZmFjaWxpdGllcyBmb3IgZG9pbmcgdGhlc2Ugb3BlcmF0aW9ucywgb3IgdGhlCi0JICogbmVlZHMgb2YgdGhpcyBwYXJ0aWN1bGFyIGRyaXZlciBjaGFuZ2UsIHdlIG1pZ2h0IG5lZWQgdG8gZG8KLQkgKiBtb3JlIGhlcmUuCi0JICovCi0JZG1hdC0+YWxpZ25tZW50ID0gYWxpZ25tZW50OwotCWRtYXQtPmJvdW5kYXJ5ID0gYm91bmRhcnk7Ci0JZG1hdC0+bWF4c2l6ZSA9IG1heHNpemU7Ci0JKnJldF90YWcgPSBkbWF0OwotCXJldHVybiAoMCk7Ci19Ci0KLXZvaWQKLWFoZF9kbWFfdGFnX2Rlc3Ryb3koc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQpCi17Ci0JZnJlZShkbWF0LCBNX0RFVkJVRik7Ci19Ci0KLWludAotYWhkX2RtYW1lbV9hbGxvYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgdm9pZCoqIHZhZGRyLAotCQkgaW50IGZsYWdzLCBidXNfZG1hbWFwX3QgKm1hcHApCi17Ci0JYnVzX2RtYW1hcF90IG1hcDsKLQotCW1hcCA9IG1hbGxvYyhzaXplb2YoKm1hcCksIE1fREVWQlVGLCBNX05PV0FJVCk7Ci0JaWYgKG1hcCA9PSBOVUxMKQotCQlyZXR1cm4gKEVOT01FTSk7Ci0JLyoKLQkgKiBBbHRob3VnaCB3ZSBjYW4gZG1hIGRhdGEgYWJvdmUgNEdCLCBvdXIKLQkgKiAiY29uc2lzdGVudCIgbWVtb3J5IGlzIGJlbG93IDRHQiBmb3IKLQkgKiBzcGFjZSBlZmZpY2llbmN5IHJlYXNvbnMgKG9ubHkgbmVlZCBhIDRieXRlCi0JICogYWRkcmVzcykuICBGb3IgdGhpcyByZWFzb24sIHdlIGhhdmUgdG8gcmVzZXQKLQkgKiBvdXIgZG1hIG1hc2sgd2hlbiBkb2luZyBhbGxvY2F0aW9ucy4KLQkgKi8KLQlpZiAoYWhkLT5kZXZfc29mdGMgIT0gTlVMTCkKLQkJaWYgKHBjaV9zZXRfZG1hX21hc2soYWhkLT5kZXZfc29mdGMsIDB4RkZGRkZGRkYpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaWM3OXh4OiBObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7Ci0JCQlrZnJlZShtYXApOwotCQkJcmV0dXJuIChFTk9ERVYpOwotCQl9Ci0JKnZhZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWhkLT5kZXZfc29mdGMsCi0JCQkJICAgICAgZG1hdC0+bWF4c2l6ZSwgJm1hcC0+YnVzX2FkZHIpOwotCWlmIChhaGQtPmRldl9zb2Z0YyAhPSBOVUxMKQotCQlpZiAocGNpX3NldF9kbWFfbWFzayhhaGQtPmRldl9zb2Z0YywKLQkJCQkgICAgIGFoZC0+cGxhdGZvcm1fZGF0YS0+aHdfZG1hX21hc2spKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaWM3OXh4OiBObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7Ci0JCQlrZnJlZShtYXApOwotCQkJcmV0dXJuIChFTk9ERVYpOwotCQl9Ci0JaWYgKCp2YWRkciA9PSBOVUxMKQotCQlyZXR1cm4gKEVOT01FTSk7Ci0JKm1hcHAgPSBtYXA7Ci0JcmV0dXJuKDApOwotfQotCi12b2lkCi1haGRfZG1hbWVtX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQsCi0JCXZvaWQqIHZhZGRyLCBidXNfZG1hbWFwX3QgbWFwKQotewotCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWhkLT5kZXZfc29mdGMsIGRtYXQtPm1heHNpemUsCi0JCQkgICAgdmFkZHIsIG1hcC0+YnVzX2FkZHIpOwotfQotCi1pbnQKLWFoZF9kbWFtYXBfbG9hZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKLQkJdm9pZCAqYnVmLCBidXNfc2l6ZV90IGJ1ZmxlbiwgYnVzX2RtYW1hcF9jYWxsYmFja190ICpjYiwKLQkJdm9pZCAqY2JfYXJnLCBpbnQgZmxhZ3MpCi17Ci0JLyoKLQkgKiBBc3N1bWUgZm9yIG5vdyB0aGF0IHRoaXMgd2lsbCBvbmx5IGJlIHVzZWQgZHVyaW5nCi0JICogaW5pdGlhbGl6YXRpb24gYW5kIG5vdCBmb3IgcGVyLXRyYW5zYWN0aW9uIGJ1ZmZlciBtYXBwaW5nLgotCSAqLwotCWJ1c19kbWFfc2VnbWVudF90IHN0YWNrX3NnOwotCi0Jc3RhY2tfc2cuZHNfYWRkciA9IG1hcC0+YnVzX2FkZHI7Ci0Jc3RhY2tfc2cuZHNfbGVuID0gZG1hdC0+bWF4c2l6ZTsKLQljYihjYl9hcmcsICZzdGFja19zZywgLypuc2VnKi8xLCAvKmVycm9yKi8wKTsKLQlyZXR1cm4gKDApOwotfQotCi12b2lkCi1haGRfZG1hbWFwX2Rlc3Ryb3koc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXApCi17Ci0JLyoKLQkgKiBUaGUgbWFwIG1heSBpcyBOVUxMIGluIG91ciA8IDIuMy5YIGltcGxlbWVudGF0aW9uLgotCSAqLwotCWlmIChtYXAgIT0gTlVMTCkKLQkJZnJlZShtYXAsIE1fREVWQlVGKTsKLX0KLQotaW50Ci1haGRfZG1hbWFwX3VubG9hZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCkKLXsKLQkvKiBOb3RoaW5nIHRvIGRvICovCi0JcmV0dXJuICgwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKiBQbGF0Zm9ybSBEZXBlbmRlbnQgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDb21wYXJlICJsZWZ0IGhhbmQiIHNvZnRjIHdpdGggInJpZ2h0IGhhbmQiIHNvZnRjLCByZXR1cm5pbmc6Ci0gKiA8IDAgLSBsYWhkIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gcmFoZAotICogICAwIC0gU29mdGNzIGFyZSBlcXVhbAotICogPiAwIC0gbGFoZCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiByYWhkCi0gKi8KLWludAotYWhkX3NvZnRjX2NvbXAoc3RydWN0IGFoZF9zb2Z0YyAqbGFoZCwgc3RydWN0IGFoZF9zb2Z0YyAqcmFoZCkKLXsKLQlpbnQJdmFsdWU7Ci0KLQkvKgotCSAqIFVuZGVyIExpbnV4LCBjYXJkcyBhcmUgb3JkZXJlZCBhcyBmb2xsb3dzOgotCSAqCTEpIFBDSSBkZXZpY2VzIHRoYXQgYXJlIG1hcmtlZCBhcyB0aGUgYm9vdCBjb250cm9sbGVyLgotCSAqCTIpIFBDSSBkZXZpY2VzIHdpdGggQklPUyBlbmFibGVkIHNvcnRlZCBieSBidXMvc2xvdC9mdW5jLgotCSAqCTMpIEFsbCByZW1haW5pbmcgUENJIGRldmljZXMgc29ydGVkIGJ5IGJ1cy9zbG90L2Z1bmMuCi0JICovCi0jaWYgMAotCXZhbHVlID0gKGxhaGQtPmZsYWdzICYgQUhEX0JPT1RfQ0hBTk5FTCkKLQkgICAgICAtIChyYWhkLT5mbGFncyAmIEFIRF9CT09UX0NIQU5ORUwpOwotCWlmICh2YWx1ZSAhPSAwKQotCQkvKiBDb250cm9sbGVycyBzZXQgZm9yIGJvb3QgaGF2ZSBhICpoaWdoZXIqIHByaW9yaXR5ICovCi0JCXJldHVybiAodmFsdWUpOwotI2VuZGlmCi0KLQl2YWx1ZSA9IChsYWhkLT5mbGFncyAmIEFIRF9CSU9TX0VOQUJMRUQpCi0JICAgICAgLSAocmFoZC0+ZmxhZ3MgJiBBSERfQklPU19FTkFCTEVEKTsKLQlpZiAodmFsdWUgIT0gMCkKLQkJLyogQ29udHJvbGxlcnMgd2l0aCBCSU9TIGVuYWJsZWQgaGF2ZSBhICpoaWdoZXIqIHByaW9yaXR5ICovCi0JCXJldHVybiAodmFsdWUpOwotCi0JLyogU3RpbGwgZXF1YWwuICBTb3J0IGJ5IGJ1cy9zbG90L2Z1bmMuICovCi0JaWYgKGFpYzc5eHhfcmV2ZXJzZV9zY2FuICE9IDApCi0JCXZhbHVlID0gYWhkX2dldF9wY2lfYnVzKGxhaGQtPmRldl9zb2Z0YykKLQkJICAgICAgLSBhaGRfZ2V0X3BjaV9idXMocmFoZC0+ZGV2X3NvZnRjKTsKLQllbHNlCi0JCXZhbHVlID0gYWhkX2dldF9wY2lfYnVzKHJhaGQtPmRldl9zb2Z0YykKLQkJICAgICAgLSBhaGRfZ2V0X3BjaV9idXMobGFoZC0+ZGV2X3NvZnRjKTsKLQlpZiAodmFsdWUgIT0gMCkKLQkJcmV0dXJuICh2YWx1ZSk7Ci0JaWYgKGFpYzc5eHhfcmV2ZXJzZV9zY2FuICE9IDApCi0JCXZhbHVlID0gYWhkX2dldF9wY2lfc2xvdChsYWhkLT5kZXZfc29mdGMpCi0JCSAgICAgIC0gYWhkX2dldF9wY2lfc2xvdChyYWhkLT5kZXZfc29mdGMpOwotCWVsc2UKLQkJdmFsdWUgPSBhaGRfZ2V0X3BjaV9zbG90KHJhaGQtPmRldl9zb2Z0YykKLQkJICAgICAgLSBhaGRfZ2V0X3BjaV9zbG90KGxhaGQtPmRldl9zb2Z0Yyk7Ci0JaWYgKHZhbHVlICE9IDApCi0JCXJldHVybiAodmFsdWUpOwotCi0JdmFsdWUgPSByYWhkLT5jaGFubmVsIC0gbGFoZC0+Y2hhbm5lbDsKLQlyZXR1cm4gKHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9zZXR1cF90YWdfaW5mbyh1X2xvbmcgYXJnLCBpbnQgaW5zdGFuY2UsIGludCB0YXJnLCBpbnQzMl90IHZhbHVlKQotewotCi0JaWYgKChpbnN0YW5jZSA+PSAwKSAmJiAodGFyZyA+PSAwKQotCSAmJiAoaW5zdGFuY2UgPCBOVU1fRUxFTUVOVFMoYWljNzl4eF90YWdfaW5mbykpCi0JICYmICh0YXJnIDwgQUhEX05VTV9UQVJHRVRTKSkgewotCQlhaWM3OXh4X3RhZ19pbmZvW2luc3RhbmNlXS50YWdfY29tbWFuZHNbdGFyZ10gPSB2YWx1ZSAmIDB4MUZGOwotCQlpZiAoYm9vdHZlcmJvc2UpCi0JCQlwcmludGYoInRhZ19pbmZvWyVkOiVkXSA9ICVkXG4iLCBpbnN0YW5jZSwgdGFyZywgdmFsdWUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9zZXR1cF9yZF9zdHJtX2luZm8odV9sb25nIGFyZywgaW50IGluc3RhbmNlLCBpbnQgdGFyZywgaW50MzJfdCB2YWx1ZSkKLXsKLQlpZiAoKGluc3RhbmNlID49IDApCi0JICYmIChpbnN0YW5jZSA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X3JkX3N0cm1faW5mbykpKSB7Ci0JCWFpYzc5eHhfcmRfc3RybV9pbmZvW2luc3RhbmNlXSA9IHZhbHVlICYgMHhGRkZGOwotCQlpZiAoYm9vdHZlcmJvc2UpCi0JCQlwcmludGYoInJkX3N0cm1bJWRdID0gMHgleFxuIiwgaW5zdGFuY2UsIHZhbHVlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfc2V0dXBfZHYodV9sb25nIGFyZywgaW50IGluc3RhbmNlLCBpbnQgdGFyZywgaW50MzJfdCB2YWx1ZSkKLXsKLQlpZiAoKGluc3RhbmNlID49IDApCi0JICYmIChpbnN0YW5jZSA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X2R2X3NldHRpbmdzKSkpIHsKLQkJYWljNzl4eF9kdl9zZXR0aW5nc1tpbnN0YW5jZV0gPSB2YWx1ZTsKLQkJaWYgKGJvb3R2ZXJib3NlKQotCQkJcHJpbnRmKCJkdlslZF0gPSAlZFxuIiwgaW5zdGFuY2UsIHZhbHVlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8odV9sb25nIGluZGV4LCBpbnQgaW5zdGFuY2UsIGludCB0YXJnLCBpbnQzMl90IHZhbHVlKQotewotCi0JaWYgKChpbnN0YW5jZSA+PSAwKQotCSAmJiAoaW5zdGFuY2UgPCBOVU1fRUxFTUVOVFMoYWljNzl4eF9pb2NlbGxfaW5mbykpKSB7Ci0JCXVpbnQ4X3QgKmlvY2VsbF9pbmZvOwotCi0JCWlvY2VsbF9pbmZvID0gKHVpbnQ4X3QqKSZhaWM3OXh4X2lvY2VsbF9pbmZvW2luc3RhbmNlXTsKLQkJaW9jZWxsX2luZm9baW5kZXhdID0gdmFsdWUgJiAweEZGRkY7Ci0JCWlmIChib290dmVyYm9zZSkKLQkJCXByaW50ZigiaW9jZWxsWyVkOiVsZF0gPSAlZFxuIiwgaW5zdGFuY2UsIGluZGV4LCB2YWx1ZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X3NldHVwX3RhZ19pbmZvX2dsb2JhbChjaGFyICpwKQotewotCWludCB0YWdzLCBpLCBqOwotCi0JdGFncyA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCBOVUxMLCAwKSAmIDB4ZmY7Ci0JcHJpbnRmKCJTZXR0aW5nIEdsb2JhbCBUYWdzPSAlZFxuIiwgdGFncyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0VMRU1FTlRTKGFpYzc5eHhfdGFnX2luZm8pOyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IEFIRF9OVU1fVEFSR0VUUzsgaisrKSB7Ci0JCQlhaWM3OXh4X3RhZ19pbmZvW2ldLnRhZ19jb21tYW5kc1tqXSA9IHRhZ3M7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBIYW5kbGUgTGludXggYm9vdCBwYXJhbWV0ZXJzLiBUaGlzIHJvdXRpbmUgYWxsb3dzIGZvciBhc3NpZ25pbmcgYSB2YWx1ZQotICogdG8gYSBwYXJhbWV0ZXIgd2l0aCBhICc6JyBiZXR3ZWVuIHRoZSBwYXJhbWV0ZXIgYW5kIHRoZSB2YWx1ZS4KLSAqIGllLiBhaWM3OXh4PXN0cHdsZXY6MSxleHRlbmRlZAotICovCi1zdGF0aWMgaW50Ci1haWM3OXh4X3NldHVwKGNoYXIgKnMpCi17Ci0JaW50CWksIG47Ci0JY2hhciAgICpwOwotCWNoYXIgICAqZW5kOwotCi0Jc3RhdGljIHN0cnVjdCB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0JCXVpbnQzMl90ICpmbGFnOwotCX0gb3B0aW9uc1tdID0gewotCQl7ICJleHRlbmRlZCIsICZhaWM3OXh4X2V4dGVuZGVkIH0sCi0JCXsgIm5vX3Jlc2V0IiwgJmFpYzc5eHhfbm9fcmVzZXQgfSwKLQkJeyAidmVyYm9zZSIsICZhaWM3OXh4X3ZlcmJvc2UgfSwKLQkJeyAiYWxsb3dfbWVtaW8iLCAmYWljNzl4eF9hbGxvd19tZW1pb30sCi0jaWZkZWYgQUhEX0RFQlVHCi0JCXsgImRlYnVnIiwgJmFoZF9kZWJ1ZyB9LAotI2VuZGlmCi0JCXsgInJldmVyc2Vfc2NhbiIsICZhaWM3OXh4X3JldmVyc2Vfc2NhbiB9LAotCQl7ICJwZXJpb2RpY19vdGFnIiwgJmFpYzc5eHhfcGVyaW9kaWNfb3RhZyB9LAotCQl7ICJwY2lfcGFyaXR5IiwgJmFpYzc5eHhfcGNpX3Bhcml0eSB9LAotCQl7ICJzZWx0aW1lIiwgJmFpYzc5eHhfc2VsdGltZSB9LAotCQl7ICJ0YWdfaW5mbyIsIE5VTEwgfSwKLQkJeyAiZ2xvYmFsX3RhZ19kZXB0aCIsIE5VTEx9LAotCQl7ICJyZF9zdHJtIiwgTlVMTCB9LAotCQl7ICJkdiIsIE5VTEwgfSwKLQkJeyAic2xld3JhdGUiLCBOVUxMIH0sCi0JCXsgInByZWNvbXAiLCBOVUxMIH0sCi0JCXsgImFtcGxpdHVkZSIsIE5VTEwgfSwKLQl9OwotCi0JZW5kID0gc3RyY2hyKHMsICdcMCcpOwotCi0JLyoKLQkgKiBYWFggaWE2NCBnY2MgaXNuJ3Qgc21hcnQgZW5vdWdoIHRvIGtub3cgdGhhdCBOVU1fRUxFTUVOVFMKLQkgKiB3aWxsIG5ldmVyIGJlIDAgaW4gdGhpcyBjYXNlLgotCSAqLyAgICAgIAotCW4gPSAwOyAgCi0KLQl3aGlsZSAoKHAgPSBzdHJzZXAoJnMsICIsLiIpKSAhPSBOVUxMKSB7Ci0JCWlmICgqcCA9PSAnXDAnKQotCQkJY29udGludWU7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTUVOVFMob3B0aW9ucyk7IGkrKykgewotCi0JCQluID0gc3RybGVuKG9wdGlvbnNbaV0ubmFtZSk7Ci0JCQlpZiAoc3RybmNtcChvcHRpb25zW2ldLm5hbWUsIHAsIG4pID09IDApCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPT0gTlVNX0VMRU1FTlRTKG9wdGlvbnMpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHN0cm5jbXAocCwgImdsb2JhbF90YWdfZGVwdGgiLCBuKSA9PSAwKSB7Ci0JCQlhaGRfbGludXhfc2V0dXBfdGFnX2luZm9fZ2xvYmFsKHAgKyBuKTsKLQkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJ0YWdfaW5mbyIsIG4pID09IDApIHsKLQkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJ0YWdfaW5mbyIsIHAgKyBuLCBlbmQsCi0JCQkgICAgMiwgYWhkX2xpbnV4X3NldHVwX3RhZ19pbmZvLCAwKTsKLQkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJyZF9zdHJtIiwgbikgPT0gMCkgewotCQkJcyA9IGFpY19wYXJzZV9icmFjZV9vcHRpb24oInJkX3N0cm0iLCBwICsgbiwgZW5kLAotCQkJICAgIDEsIGFoZF9saW51eF9zZXR1cF9yZF9zdHJtX2luZm8sIDApOwotCQl9IGVsc2UgaWYgKHN0cm5jbXAocCwgImR2IiwgbikgPT0gMCkgewotCQkJcyA9IGFpY19wYXJzZV9icmFjZV9vcHRpb24oImR2IiwgcCArIG4sIGVuZCwgMSwKLQkJCSAgICBhaGRfbGludXhfc2V0dXBfZHYsIDApOwotCQl9IGVsc2UgaWYgKHN0cm5jbXAocCwgInNsZXdyYXRlIiwgbikgPT0gMCkgewotCQkJcyA9IGFpY19wYXJzZV9icmFjZV9vcHRpb24oInNsZXdyYXRlIiwKLQkJCSAgICBwICsgbiwgZW5kLCAxLCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8sCi0JCQkgICAgQUlDNzlYWF9TTEVXUkFURV9JTkRFWCk7Ci0JCX0gZWxzZSBpZiAoc3RybmNtcChwLCAicHJlY29tcCIsIG4pID09IDApIHsKLQkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJwcmVjb21wIiwKLQkJCSAgICBwICsgbiwgZW5kLCAxLCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8sCi0JCQkgICAgQUlDNzlYWF9QUkVDT01QX0lOREVYKTsKLQkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJhbXBsaXR1ZGUiLCBuKSA9PSAwKSB7Ci0JCQlzID0gYWljX3BhcnNlX2JyYWNlX29wdGlvbigiYW1wbGl0dWRlIiwKLQkJCSAgICBwICsgbiwgZW5kLCAxLCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8sCi0JCQkgICAgQUlDNzlYWF9BTVBMSVRVREVfSU5ERVgpOwotCQl9IGVsc2UgaWYgKHBbbl0gPT0gJzonKSB7Ci0JCQkqKG9wdGlvbnNbaV0uZmxhZykgPSBzaW1wbGVfc3RydG91bChwICsgbiArIDEsIE5VTEwsIDApOwotCQl9IGVsc2UgaWYgKCFzdHJuY21wKHAsICJ2ZXJib3NlIiwgbikpIHsKLQkJCSoob3B0aW9uc1tpXS5mbGFnKSA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQkqKG9wdGlvbnNbaV0uZmxhZykgXj0gMHhGRkZGRkZGRjsKLQkJfQotCX0KLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgiYWljNzl4eD0iLCBhaWM3OXh4X3NldHVwKTsKLQotdWludDMyX3QgYWljNzl4eF92ZXJib3NlOwotCi1pbnQKLWFoZF9saW51eF9yZWdpc3Rlcl9ob3N0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgU2NzaV9Ib3N0X1RlbXBsYXRlICp0ZW1wbGF0ZSkKLXsKLQljaGFyCWJ1Zls4MF07Ci0Jc3RydWN0CVNjc2lfSG9zdCAqaG9zdDsKLQljaGFyCSpuZXdfbmFtZTsKLQl1X2xvbmcJczsKLQl1X2xvbmcJdGFyZ2V0OwotCi0JdGVtcGxhdGUtPm5hbWUgPSBhaGQtPmRlc2NyaXB0aW9uOwotCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2ModGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgYWhkX3NvZnRjICopKTsKLQlpZiAoaG9zdCA9PSBOVUxMKQotCQlyZXR1cm4gKEVOT01FTSk7Ci0KLQkqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWhvc3QtPmhvc3RkYXRhKSA9IGFoZDsKLQlhaGRfbG9jayhhaGQsICZzKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0Jc2NzaV9hc3NpZ25fbG9jayhob3N0LCAmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOwotI2VsaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyAhPSAwCi0JaG9zdC0+bG9jayA9ICZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jazsKLSNlbmRpZgotCWFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCA9IGhvc3Q7Ci0JaG9zdC0+Y2FuX3F1ZXVlID0gQUhEX01BWF9RVUVVRTsKLQlob3N0LT5jbWRfcGVyX2x1biA9IDI7Ci0JaG9zdC0+c2dfdGFibGVzaXplID0gQUhEX05TRUc7Ci0JaG9zdC0+dGhpc19pZCA9IGFoZC0+b3VyX2lkOwotCWhvc3QtPmlycSA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxOwotCWhvc3QtPm1heF9pZCA9IChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpID8gMTYgOiA4OwotCWhvc3QtPm1heF9sdW4gPSBBSERfTlVNX0xVTlM7Ci0JaG9zdC0+bWF4X2NoYW5uZWwgPSAwOwotCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IEFIRF9OU0VHOwotCWFoZF9zZXRfdW5pdChhaGQsIGFoZF9saW51eF9uZXh0X3VuaXQoKSk7Ci0Jc3ByaW50ZihidWYsICJzY3NpJWQiLCBob3N0LT5ob3N0X25vKTsKLQluZXdfbmFtZSA9IG1hbGxvYyhzdHJsZW4oYnVmKSArIDEsIE1fREVWQlVGLCBNX05PV0FJVCk7Ci0JaWYgKG5ld19uYW1lICE9IE5VTEwpIHsKLQkJc3RyY3B5KG5ld19uYW1lLCBidWYpOwotCQlhaGRfc2V0X25hbWUoYWhkLCBuZXdfbmFtZSk7Ci0JfQotCWhvc3QtPnVuaXF1ZV9pZCA9IGFoZC0+dW5pdDsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQlzY3NpX3NldF9wY2lfZGV2aWNlKGhvc3QsIGFoZC0+ZGV2X3NvZnRjKTsKLSNlbmRpZgotCWFoZF9saW51eF9zZXR1cF91c2VyX3JkX3N0cm1fc2V0dGluZ3MoYWhkKTsKLQlhaGRfbGludXhfaW5pdGlhbGl6ZV9zY3NpX2J1cyhhaGQpOwotCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0JYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQgPSBrZXJuZWxfdGhyZWFkKGFoZF9saW51eF9kdl90aHJlYWQsIGFoZCwgMCk7Ci0JYWhkX2xvY2soYWhkLCAmcyk7Ci0JaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfcGlkIDwgMCkgewotCQlwcmludGYoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIERWIHRocmVhZCwgZXJyb3I9ICVkXG4iLAotCQkgICAgICAgYWhkX25hbWUoYWhkKSwgYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQpOwotCQlyZXR1cm4gKC1haGQtPnBsYXRmb3JtX2RhdGEtPmR2X3BpZCk7Ci0JfQotCS8qCi0JICogSW5pdGlhbGx5IGFsbG9jYXRlICphbGwqIG9mIG91ciBsaW51eCB0YXJnZXQgb2JqZWN0cwotCSAqIHNvIHRoYXQgdGhlIERWIHRocmVhZCB3aWxsIHNjYW4gdGhlbSBhbGwgaW4gcGFyYWxsZWwKLQkgKiBqdXN0IGFmdGVyIGRyaXZlciBpbml0aWFsaXphdGlvbi4gIEFueSBkZXZpY2UgdGhhdAotCSAqIGRvZXMgbm90IGV4aXN0IHdpbGwgaGF2ZSBpdHMgdGFyZ2V0IG9iamVjdCBkZXN0cm95ZWQKLQkgKiBieSB0aGUgc2VsZWN0aW9uIHRpbWVvdXQgaGFuZGxlci4gIEluIHRoZSBjYXNlIG9mIGEKLQkgKiBkZXZpY2UgdGhhdCBhcHBlYXJzIGFmdGVyIHRoZSBpbml0aWFsIERWIHNjYW4sIGFzeW5jCi0JICogbmVnb3RpYXRpb24gd2lsbCBvY2N1ciBmb3IgdGhlIGZpcnN0IGNvbW1hbmQsIGFuZCBEVgotCSAqIHdpbGwgY29tZW5jZSBzaG91bGQgdGhhdCBmaXJzdCBjb21tYW5kIGJlIHN1Y2Nlc3NmdWwuCi0JICovCi0JZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCBob3N0LT5tYXhfaWQ7IHRhcmdldCsrKSB7Ci0KLQkJLyoKLQkJICogU2tpcCBvdXIgb3duIElELiAgU29tZSBDb21wYXEvSFAgc3RvcmFnZSBkZXZpY2VzCi0JCSAqIGhhdmUgZW5jbG9zdXJlIG1hbmFnZW1lbnQgZGV2aWNlcyB0aGF0IHJlc3BvbmQgdG8KLQkJICogc2luZ2xlIGJpdCBzZWxlY3Rpb24gKGkuZS4gc2VsZWN0aW5nIG91cnNlbHZlcykuCi0JCSAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgZWl0aGVyIGFuIGV4dGVybmFsIGFwcGxpY2F0aW9uCi0JCSAqIG9yIGEgbW9kaWZpZWQga2VybmVsIHdpbGwgYmUgdXNlZCB0byBwcm9iZSB0aGlzCi0JCSAqIElEIGlmIGl0IGlzIGFwcHJvcHJpYXRlLiAgVG8gYWNjb21tb2RhdGUgdGhlc2UKLQkJICogaW5zdGFsbGF0aW9ucywgYWhjX2xpbnV4X2FsbG9jX3RhcmdldCgpIHdpbGwgYWxsb2NhdGUKLQkJICogZm9yIG91ciBJRCBpZiBhc2tlZCB0byBkbyBzby4KLQkJICovCi0JCWlmICh0YXJnZXQgPT0gYWhkLT5vdXJfaWQpIAotCQkJY29udGludWU7Ci0KLQkJYWhkX2xpbnV4X2FsbG9jX3RhcmdldChhaGQsIDAsIHRhcmdldCk7Ci0JfQotCWFoZF9pbnRyX2VuYWJsZShhaGQsIFRSVUUpOwotCWFoZF9saW51eF9zdGFydF9kdihhaGQpOwotCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0Jc2NzaV9hZGRfaG9zdChob3N0LCAmYWhkLT5kZXZfc29mdGMtPmRldik7IC8qIFhYWCBoYW5kbGUgZmFpbHVyZSAqLwotCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOwotI2VuZGlmCi0JcmV0dXJuICgwKTsKLX0KLQotdWludDY0X3QKLWFoZF9saW51eF9nZXRfbWVtc2l6ZSh2b2lkKQotewotCXN0cnVjdCBzeXNpbmZvIHNpOwotCi0Jc2lfbWVtaW5mbygmc2kpOwotCXJldHVybiAoKHVpbnQ2NF90KXNpLnRvdGFscmFtIDw8IFBBR0VfU0hJRlQpOwotfQotCi0vKgotICogRmluZCB0aGUgc21hbGxlc3QgYXZhaWxhYmxlIHVuaXQgbnVtYmVyIHRvIHVzZQotICogZm9yIGEgbmV3IGRldmljZS4gIFdlIGRvbid0IGp1c3QgdXNlIGEgc3RhdGljCi0gKiBjb3VudCB0byBoYW5kbGUgdGhlICJyZXBlYXRlZCBob3QtKHVuKXBsdWciCi0gKiBzY2VuYXJpby4KLSAqLwotc3RhdGljIGludAotYWhkX2xpbnV4X25leHRfdW5pdCh2b2lkKQotewotCXN0cnVjdCBhaGRfc29mdGMgKmFoZDsKLQlpbnQgdW5pdDsKLQotCXVuaXQgPSAwOwotcmV0cnk6Ci0JVEFJTFFfRk9SRUFDSChhaGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7Ci0JCWlmIChhaGQtPnVuaXQgPT0gdW5pdCkgewotCQkJdW5pdCsrOwotCQkJZ290byByZXRyeTsKLQkJfQotCX0KLQlyZXR1cm4gKHVuaXQpOwotfQotCi0vKgotICogUGxhY2UgdGhlIFNDU0kgYnVzIGludG8gYSBrbm93biBzdGF0ZSBieSBlaXRoZXIgcmVzZXR0aW5nIGl0LAotICogb3IgZm9yY2luZyB0cmFuc2ZlciBuZWdvdGlhdGlvbnMgb24gdGhlIG5leHQgY29tbWFuZCB0byBhbnkKLSAqIHRhcmdldC4KLSAqLwotc3RhdGljIHZvaWQKLWFoZF9saW51eF9pbml0aWFsaXplX3Njc2lfYnVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQl1X2ludCB0YXJnZXRfaWQ7Ci0JdV9pbnQgbnVtdGFyZzsKLQotCXRhcmdldF9pZCA9IDA7Ci0JbnVtdGFyZyA9IDA7Ci0KLQlpZiAoYWljNzl4eF9ub19yZXNldCAhPSAwKQotCQlhaGQtPmZsYWdzICY9IH5BSERfUkVTRVRfQlVTX0E7Ci0KLQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfUkVTRVRfQlVTX0EpICE9IDApCi0JCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKmluaXRpYXRlX3Jlc2V0Ki9UUlVFKTsKLQllbHNlCi0JCW51bXRhcmcgPSAoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSA/IDE2IDogODsKLQotCS8qCi0JICogRm9yY2UgbmVnb3RpYXRpb24gdG8gYXN5bmMgZm9yIGFsbCB0YXJnZXRzIHRoYXQKLQkgKiB3aWxsIG5vdCBzZWUgYW4gaW5pdGlhbCBidXMgcmVzZXQuCi0JICovCi0JZm9yICg7IHRhcmdldF9pZCA8IG51bXRhcmc7IHRhcmdldF9pZCsrKSB7Ci0JCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOwotCQlzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87Ci0JCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7Ci0KLQkJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgJ0EnLCBhaGQtPm91cl9pZCwKLQkJCQkJICAgIHRhcmdldF9pZCwgJnRzdGF0ZSk7Ci0JCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIGFoZC0+b3VyX2lkLCB0YXJnZXRfaWQsCi0JCQkJICAgIENBTV9MVU5fV0lMRENBUkQsICdBJywgUk9MRV9JTklUSUFUT1IpOwotCQlhaGRfdXBkYXRlX25lZ19yZXF1ZXN0KGFoZCwgJmRldmluZm8sIHRzdGF0ZSwKLQkJCQkgICAgICAgdGluZm8sIEFIRF9ORUdfQUxXQVlTKTsKLQl9Ci0JLyogR2l2ZSB0aGUgYnVzIHNvbWUgdGltZSB0byByZWNvdmVyICovCi0JaWYgKChhaGQtPmZsYWdzICYgQUhEX1JFU0VUX0JVU19BKSAhPSAwKSB7Ci0JCWFoZF9mcmVlemVfc2ltcShhaGQpOwotCQlpbml0X3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKLQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5kYXRhID0gKHVfbG9uZylhaGQ7Ci0JCWFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZXhwaXJlcyA9Ci0JCSAgICBqaWZmaWVzICsgKEFJQzc5WFhfUkVTRVRfREVMQVkgKiBIWikvMTAwMDsKLQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5mdW5jdGlvbiA9Ci0JCSAgICAoYWhkX2xpbnV4X2NhbGxiYWNrX3QgKilhaGRfcmVsZWFzZV9zaW1xOwotCQlhZGRfdGltZXIoJmFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIpOwotCX0KLX0KLQotaW50Ci1haGRfcGxhdGZvcm1fYWxsb2Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB2b2lkICpwbGF0Zm9ybV9hcmcpCi17Ci0JYWhkLT5wbGF0Zm9ybV9kYXRhID0KLQkgICAgbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWhkX3BsYXRmb3JtX2RhdGEpLCBNX0RFVkJVRiwgTV9OT1dBSVQpOwotCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEgPT0gTlVMTCkKLQkJcmV0dXJuIChFTk9NRU0pOwotCW1lbXNldChhaGQtPnBsYXRmb3JtX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYWhkX3BsYXRmb3JtX2RhdGEpKTsKLQlUQUlMUV9JTklUKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcSk7Ci0JVEFJTFFfSU5JVCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSk7Ci0JYWhkLT5wbGF0Zm9ybV9kYXRhLT5pcnEgPSBBSERfTElOVVhfTk9JUlE7Ci0JYWhkLT5wbGF0Zm9ybV9kYXRhLT5od19kbWFfbWFzayA9IDB4RkZGRkZGRkY7Ci0JYWhkX2xvY2tpbml0KGFoZCk7Ci0JYWhkX2RvbmVfbG9ja2luaXQoYWhkKTsKLQlpbml0X3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lcik7Ci0JYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIuZGF0YSA9ICh1X2xvbmcpYWhkOwotCWFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyLmZ1bmN0aW9uID0KLQkgICAgKGFoZF9saW51eF9jYWxsYmFja190ICopYWhkX2xpbnV4X3RocmVhZF9ydW5fY29tcGxldGVfcXVldWU7Ci0JaW5pdF9NVVRFWF9MT0NLRUQoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKLQlpbml0X01VVEVYX0xPQ0tFRCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOwotCWluaXRfTVVURVhfTE9DS0VEKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X2NtZF9zZW0pOwotCWFoZF9zZXR1cF9ydW5xX3Rhc2tsZXQoYWhkKTsKLQlhaGQtPnNlbHRpbWUgPSAoYWljNzl4eF9zZWx0aW1lICYgMHgzKSA8PCA0OwotCXJldHVybiAoMCk7Ci19Ci0KLXZvaWQKLWFoZF9wbGF0Zm9ybV9mcmVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQlzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZzsKLQlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OwotCWludCBpLCBqOwotCi0JaWYgKGFoZC0+cGxhdGZvcm1fZGF0YSAhPSBOVUxMKSB7Ci0JCWRlbF90aW1lcl9zeW5jKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lcik7Ci0JCWFoZF9saW51eF9raWxsX2R2X3RocmVhZChhaGQpOwotCQlhaGRfdGVhcmRvd25fcnVucV90YXNrbGV0KGFoZCk7Ci0JCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QgIT0gTlVMTCkgewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQkJCXNjc2lfcmVtb3ZlX2hvc3QoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0KTsKLSNlbmRpZgotCQkJc2NzaV9ob3N0X3B1dChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOwotCQl9Ci0KLQkJLyogZGVzdHJveSBhbGwgb2YgdGhlIGRldmljZSBhbmQgdGFyZ2V0IG9iamVjdHMgKi8KLQkJZm9yIChpID0gMDsgaSA8IEFIRF9OVU1fVEFSR0VUUzsgaSsrKSB7Ci0JCQl0YXJnID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW2ldOwotCQkJaWYgKHRhcmcgIT0gTlVMTCkgewotCQkJCS8qIEtlZXAgdGFyZ2V0IGFyb3VuZCB0aHJvdWdoIHRoZSBsb29wLiAqLwotCQkJCXRhcmctPnJlZmNvdW50Kys7Ci0JCQkJZm9yIChqID0gMDsgaiA8IEFIRF9OVU1fTFVOUzsgaisrKSB7Ci0KLQkJCQkJaWYgKHRhcmctPmRldmljZXNbal0gPT0gTlVMTCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlkZXYgPSB0YXJnLT5kZXZpY2VzW2pdOwotCQkJCQlhaGRfbGludXhfZnJlZV9kZXZpY2UoYWhkLCBkZXYpOwotCQkJCX0KLQkJCQkvKgotCQkJCSAqIEZvcmNpYmx5IGZyZWUgdGhlIHRhcmdldCBub3cgdGhhdAotCQkJCSAqIGFsbCBkZXZpY2VzIGFyZSBnb25lLgotCQkJCSAqLwotCQkJCWFoZF9saW51eF9mcmVlX3RhcmdldChhaGQsIHRhcmcpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxICE9IEFIRF9MSU5VWF9OT0lSUSkKLQkJCWZyZWVfaXJxKGFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxLCBhaGQpOwotCQlpZiAoYWhkLT50YWdzWzBdID09IEJVU19TUEFDRV9QSU8KLQkJICYmIGFoZC0+YnNoc1swXS5pb3BvcnQgIT0gMCkKLQkJCXJlbGVhc2VfcmVnaW9uKGFoZC0+YnNoc1swXS5pb3BvcnQsIDI1Nik7Ci0JCWlmIChhaGQtPnRhZ3NbMV0gPT0gQlVTX1NQQUNFX1BJTwotCQkgJiYgYWhkLT5ic2hzWzFdLmlvcG9ydCAhPSAwKQotCQkJcmVsZWFzZV9yZWdpb24oYWhkLT5ic2hzWzFdLmlvcG9ydCwgMjU2KTsKLQkJaWYgKGFoZC0+dGFnc1swXSA9PSBCVVNfU1BBQ0VfTUVNSU8KLQkJICYmIGFoZC0+YnNoc1swXS5tYWRkciAhPSBOVUxMKSB7Ci0JCQlpb3VubWFwKGFoZC0+YnNoc1swXS5tYWRkcik7Ci0JCQlyZWxlYXNlX21lbV9yZWdpb24oYWhkLT5wbGF0Zm9ybV9kYXRhLT5tZW1fYnVzYWRkciwKLQkJCQkJICAgMHgxMDAwKTsKLQkJfQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotICAgIAkJLyoKLQkJICogSW4gMi40IHdlIGRldGFjaCBmcm9tIHRoZSBzY3NpIG1pZGxheWVyIGJlZm9yZSB0aGUgUENJCi0JCSAqIGxheWVyIGludm9rZXMgb3VyIHJlbW92ZSBjYWxsYmFjay4gIE5vIHBlci1pbnN0YW5jZQotCQkgKiBkZXRhY2ggaXMgcHJvdmlkZWQsIHNvIHdlIG11c3QgcmVhY2ggaW5zaWRlIHRoZSBQQ0kKLQkJICogc3Vic3lzdGVtJ3MgaW50ZXJuYWxzIGFuZCBkZXRhY2ggb3VyIGRyaXZlciBtYW51YWxseS4KLQkJICovCi0JCWlmIChhaGQtPmRldl9zb2Z0YyAhPSBOVUxMKQotCQkJYWhkLT5kZXZfc29mdGMtPmRyaXZlciA9IE5VTEw7Ci0jZW5kaWYKLQkJZnJlZShhaGQtPnBsYXRmb3JtX2RhdGEsIE1fREVWQlVGKTsKLQl9Ci19Ci0KLXZvaWQKLWFoZF9wbGF0Zm9ybV9pbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQkvKgotCSAqIExvb2t1cCBhbmQgY29tbWl0IGFueSBtb2RpZmllZCBJTyBDZWxsIG9wdGlvbnMuCi0JICovCi0JaWYgKGFoZC0+dW5pdCA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X2lvY2VsbF9pbmZvKSkgewotCQlzdHJ1Y3QgYWhkX2xpbnV4X2lvY2VsbF9vcHRzICppb2NlbGxfb3B0czsKLQotCQlpb2NlbGxfb3B0cyA9ICZhaWM3OXh4X2lvY2VsbF9pbmZvW2FoZC0+dW5pdF07Ci0JCWlmIChpb2NlbGxfb3B0cy0+cHJlY29tcCAhPSBBSUM3OVhYX0RFRkFVTFRfUFJFQ09NUCkKLQkJCUFIRF9TRVRfUFJFQ09NUChhaGQsIGlvY2VsbF9vcHRzLT5wcmVjb21wKTsKLQkJaWYgKGlvY2VsbF9vcHRzLT5zbGV3cmF0ZSAhPSBBSUM3OVhYX0RFRkFVTFRfU0xFV1JBVEUpCi0JCQlBSERfU0VUX1NMRVdSQVRFKGFoZCwgaW9jZWxsX29wdHMtPnNsZXdyYXRlKTsKLQkJaWYgKGlvY2VsbF9vcHRzLT5hbXBsaXR1ZGUgIT0gQUlDNzlYWF9ERUZBVUxUX0FNUExJVFVERSkKLQkJCUFIRF9TRVRfQU1QTElUVURFKGFoZCwgaW9jZWxsX29wdHMtPmFtcGxpdHVkZSk7Ci0JfQotCi19Ci0KLXZvaWQKLWFoZF9wbGF0Zm9ybV9mcmVlemVfZGV2cShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKLXsKLQlhaGRfcGxhdGZvcm1fYWJvcnRfc2NicyhhaGQsIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwKLQkJCQlTQ0JfR0VUX0NIQU5ORUwoYWhkLCBzY2IpLAotCQkJCVNDQl9HRVRfTFVOKHNjYiksIFNDQl9MSVNUX05VTEwsCi0JCQkJUk9MRV9VTktOT1dOLCBDQU1fUkVRVUVVRV9SRVEpOwotfQotCi12b2lkCi1haGRfcGxhdGZvcm1fc2V0X3RhZ3Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCi0JCSAgICAgIGFoZF9xdWV1ZV9hbGcgYWxnKQotewotCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7Ci0JaW50IHdhc19xdWV1aW5nOwotCWludCBub3dfcXVldWluZzsKLQotCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCAtICdBJywKLQkJCQkgICBkZXZpbmZvLT50YXJnZXQsCi0JCQkJICAgZGV2aW5mby0+bHVuLCAvKmFsbG9jKi9GQUxTRSk7Ci0JaWYgKGRldiA9PSBOVUxMKQotCQlyZXR1cm47Ci0Jd2FzX3F1ZXVpbmcgPSBkZXYtPmZsYWdzICYgKEFIRF9ERVZfUV9CQVNJQ3xBSERfREVWX1FfVEFHR0VEKTsKLQlzd2l0Y2ggKGFsZykgewotCWRlZmF1bHQ6Ci0JY2FzZSBBSERfUVVFVUVfTk9ORToKLQkJbm93X3F1ZXVpbmcgPSAwOwotCQlicmVhazsgCi0JY2FzZSBBSERfUVVFVUVfQkFTSUM6Ci0JCW5vd19xdWV1aW5nID0gQUhEX0RFVl9RX0JBU0lDOwotCQlicmVhazsKLQljYXNlIEFIRF9RVUVVRV9UQUdHRUQ6Ci0JCW5vd19xdWV1aW5nID0gQUhEX0RFVl9RX1RBR0dFRDsKLQkJYnJlYWs7Ci0JfQotCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfRlJFRVpFX1RJTF9FTVBUWSkgPT0gMAotCSAmJiAod2FzX3F1ZXVpbmcgIT0gbm93X3F1ZXVpbmcpCi0JICYmIChkZXYtPmFjdGl2ZSAhPSAwKSkgewotCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfRlJFRVpFX1RJTF9FTVBUWTsKLQkJZGV2LT5xZnJvemVuKys7Ci0JfQotCi0JZGV2LT5mbGFncyAmPSB+KEFIRF9ERVZfUV9CQVNJQ3xBSERfREVWX1FfVEFHR0VEfEFIRF9ERVZfUEVSSU9ESUNfT1RBRyk7Ci0JaWYgKG5vd19xdWV1aW5nKSB7Ci0JCXVfaW50IHVzZXJ0YWdzOwotCi0JCXVzZXJ0YWdzID0gYWhkX2xpbnV4X3VzZXJfdGFnZGVwdGgoYWhkLCBkZXZpbmZvKTsKLQkJaWYgKCF3YXNfcXVldWluZykgewotCQkJLyoKLQkJCSAqIFN0YXJ0IG91dCBhZ3Jlc3NpdmVseSBhbmQgYWxsb3cgb3VyCi0JCQkgKiBkeW5hbWljIHF1ZXVlIGRlcHRoIGFsZ29yaXRobSB0byB0YWtlCi0JCQkgKiBjYXJlIG9mIHRoZSByZXN0LgotCQkJICovCi0JCQlkZXYtPm1heHRhZ3MgPSB1c2VydGFnczsKLQkJCWRldi0+b3BlbmluZ3MgPSBkZXYtPm1heHRhZ3MgLSBkZXYtPmFjdGl2ZTsKLQkJfQotCQlpZiAoZGV2LT5tYXh0YWdzID09IDApIHsKLQkJCS8qCi0JCQkgKiBRdWV1ZWluZyBpcyBkaXNhYmxlZCBieSB0aGUgdXNlci4KLQkJCSAqLwotCQkJZGV2LT5vcGVuaW5ncyA9IDE7Ci0JCX0gZWxzZSBpZiAoYWxnID09IEFIRF9RVUVVRV9UQUdHRUQpIHsKLQkJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9RX1RBR0dFRDsKLQkJCWlmIChhaWM3OXh4X3BlcmlvZGljX290YWcgIT0gMCkKLQkJCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfUEVSSU9ESUNfT1RBRzsKLQkJfSBlbHNlCi0JCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfUV9CQVNJQzsKLQl9IGVsc2UgewotCQkvKiBXZSBjYW4gb25seSBoYXZlIG9uZSBvcGVuaW5nLiAqLwotCQlkZXYtPm1heHRhZ3MgPSAwOwotCQlkZXYtPm9wZW5pbmdzID0gIDEgLSBkZXYtPmFjdGl2ZTsKLQl9Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCWlmIChkZXYtPnNjc2lfZGV2aWNlICE9IE5VTEwpIHsKLQkJc3dpdGNoICgoZGV2LT5mbGFncyAmIChBSERfREVWX1FfQkFTSUN8QUhEX0RFVl9RX1RBR0dFRCkpKSB7Ci0JCWNhc2UgQUhEX0RFVl9RX0JBU0lDOgotCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LT5zY3NpX2RldmljZSwKLQkJCQkJCU1TR19TSU1QTEVfVEFTSywKLQkJCQkJCWRldi0+b3BlbmluZ3MgKyBkZXYtPmFjdGl2ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBBSERfREVWX1FfVEFHR0VEOgotCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LT5zY3NpX2RldmljZSwKLQkJCQkJCU1TR19PUkRFUkVEX1RBU0ssCi0JCQkJCQlkZXYtPm9wZW5pbmdzICsgZGV2LT5hY3RpdmUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvKgotCQkJICogV2UgYWxsb3cgdGhlIE9TIHRvIHF1ZXVlIDIgdW50YWdnZWQgdHJhbnNhY3Rpb25zIHRvCi0JCQkgKiB1cyBhdCBhbnkgdGltZSBldmVuIHRob3VnaCB3ZSBjYW4gb25seSBleGVjdXRlIHRoZW0KLQkJCSAqIHNlcmlhbGx5IG9uIHRoZSBjb250cm9sbGVyL2RldmljZS4gIFRoaXMgc2hvdWxkCi0JCQkgKiByZW1vdmUgc29tZSBsYXRlbmN5LgotCQkJICovCi0JCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXYtPnNjc2lfZGV2aWNlLAotCQkJCQkJLypOT04tVEFHR0VEKi8wLAotCQkJCQkJLypxdWV1ZSBkZXB0aCovMik7Ci0JCQlicmVhazsKLQkJfQotCX0KLSNlbmRpZgotfQotCi1pbnQKLWFoZF9wbGF0Zm9ybV9hYm9ydF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHRhcmdldCwgY2hhciBjaGFubmVsLAotCQkJaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzKQotewotCWludCB0YXJnOwotCWludCBtYXh0YXJnOwotCWludCBtYXhsdW47Ci0JaW50IGNsdW47Ci0JaW50IGNvdW50OwotCi0JaWYgKHRhZyAhPSBTQ0JfTElTVF9OVUxMKQotCQlyZXR1cm4gKDApOwotCi0JdGFyZyA9IDA7Ci0JaWYgKHRhcmdldCAhPSBDQU1fVEFSR0VUX1dJTERDQVJEKSB7Ci0JCXRhcmcgPSB0YXJnZXQ7Ci0JCW1heHRhcmcgPSB0YXJnICsgMTsKLQl9IGVsc2UgewotCQltYXh0YXJnID0gKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgPyAxNiA6IDg7Ci0JfQotCWNsdW4gPSAwOwotCWlmIChsdW4gIT0gQ0FNX0xVTl9XSUxEQ0FSRCkgewotCQljbHVuID0gbHVuOwotCQltYXhsdW4gPSBjbHVuICsgMTsKLQl9IGVsc2UgewotCQltYXhsdW4gPSBBSERfTlVNX0xVTlM7Ci0JfQotCi0JY291bnQgPSAwOwotCWZvciAoOyB0YXJnIDwgbWF4dGFyZzsgdGFyZysrKSB7Ci0KLQkJZm9yICg7IGNsdW4gPCBtYXhsdW47IGNsdW4rKykgewotCQkJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKLQkJCXN0cnVjdCBhaGRfYnVzeXEgKmJ1c3lxOwotCQkJc3RydWN0IGFoZF9jbWQgKmFjbWQ7Ci0KLQkJCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgLypjaGFuKi8wLCB0YXJnLAotCQkJCQkJICAgY2x1biwgLyphbGxvYyovRkFMU0UpOwotCQkJaWYgKGRldiA9PSBOVUxMKQotCQkJCWNvbnRpbnVlOwotCi0JCQlidXN5cSA9ICZkZXYtPmJ1c3lxOwotCQkJd2hpbGUgKChhY21kID0gVEFJTFFfRklSU1QoYnVzeXEpKSAhPSBOVUxMKSB7Ci0JCQkJU2NzaV9DbW5kICpjbWQ7Ci0KLQkJCQljbWQgPSAmYWNtZF9zY3NpX2NtZChhY21kKTsKLQkJCQlUQUlMUV9SRU1PVkUoYnVzeXEsIGFjbWQsCi0JCQkJCSAgICAgYWNtZF9saW5rcy50cWUpOwotCQkJCWNvdW50Kys7Ci0JCQkJY21kLT5yZXN1bHQgPSBzdGF0dXMgPDwgMTY7Ci0JCQkJYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGQsIGNtZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKGNvdW50KTsKLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF90aHJlYWRfcnVuX2NvbXBsZXRlX3F1ZXVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQl1X2xvbmcgZmxhZ3M7Ci0KLQlhaGRfbG9jayhhaGQsICZmbGFncyk7Ci0JZGVsX3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lcik7Ci0JYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX1JVTl9DTVBMVF9RX1RJTUVSOwotCWFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKTsKLQlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9zdGFydF9kdihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0KLQkvKgotCSAqIEZyZWV6ZSB0aGUgc2ltcSBhbmQgc2lnbmFsIGFoZF9saW51eF9xdWV1ZSB0byBub3QgbGV0IGFueQotCSAqIG1vcmUgY29tbWFuZHMgdGhyb3VnaAotCSAqLwotCWlmICgoYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9EVl9BQ1RJVkUpID09IDApIHsKLSNpZmRlZiBBSERfREVCVUcKLQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKQotCQkJcHJpbnRmKCIlczogU3RhcnRpbmcgRFZcbiIsIGFoZF9uYW1lKGFoZCkpOwotI2VuZGlmCi0KLQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfRFZfQUNUSVZFOwotCQlhaGRfZnJlZXplX3NpbXEoYWhkKTsKLQotCQkvKiBXYWtlIHVwIHRoZSBEViBrdGhyZWFkICovCi0JCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7Ci0JfQotfQotCi1zdGF0aWMgaW50Ci1haGRfbGludXhfZHZfdGhyZWFkKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0CWFoZF9zb2Z0YyAqYWhkOwotCWludAl0YXJnZXQ7Ci0JdV9sb25nCXM7Ci0KLQlhaGQgPSAoc3RydWN0IGFoZF9zb2Z0YyAqKWRhdGE7Ci0KLSNpZmRlZiBBSERfREVCVUcKLQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpCi0JCXByaW50ZigiSW4gRFYgVGhyZWFkXG4iKTsKLSNlbmRpZgotCi0JLyoKLQkgKiBDb21wbGV0ZSB0aHJlYWQgY3JlYXRpb24uCi0JICovCi0JbG9ja19rZXJuZWwoKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNjApCi0JLyoKLQkgKiBEb24ndCBjYXJlIGFib3V0IGFueSBzaWduYWxzLgotCSAqLwotCXNpZ2luaXRzZXRpbnYoJmN1cnJlbnQtPmJsb2NrZWQsIDApOwotCi0JZGFlbW9uaXplKCk7Ci0Jc3ByaW50ZihjdXJyZW50LT5jb21tLCAiYWhkX2R2XyVkIiwgYWhkLT51bml0KTsKLSNlbHNlCi0JZGFlbW9uaXplKCJhaGRfZHZfJWQiLCBhaGQtPnVuaXQpOwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwotI2VuZGlmCi0JdW5sb2NrX2tlcm5lbCgpOwotCi0Jd2hpbGUgKDEpIHsKLQkJLyoKLQkJICogVXNlIGRvd25faW50ZXJydXB0aWJsZSgpIHJhdGhlciB0aGFuIGRvd24oKSB0bwotCQkgKiBhdm9pZCBpbmNsdXNpb24gaW4gdGhlIGxvYWQgYXZlcmFnZS4KLQkJICovCi0JCWRvd25faW50ZXJydXB0aWJsZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOwotCi0JCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBiZWVuIHNpZ25hbGVkIHRvIGV4aXQgKi8KLQkJYWhkX2xvY2soYWhkLCAmcyk7Ci0JCWlmICgoYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9EVl9TSFVURE9XTikgIT0gMCkgewotCQkJYWhkX3VubG9jayhhaGQsICZzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0KLSNpZmRlZiBBSERfREVCVUcKLQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKQotCQkJcHJpbnRmKCIlczogQmVnaW5uaW5nIERvbWFpbiBWYWxpZGF0aW9uXG4iLAotCQkJICAgICAgIGFoZF9uYW1lKGFoZCkpOwotI2VuZGlmCi0KLQkJLyoKLQkJICogV2FpdCBmb3IgYW55IHBlbmRpbmcgY29tbWFuZHMgdG8gZHJhaW4gYmVmb3JlIHByb2NlZWRpbmcuCi0JCSAqLwotCQlhaGRfbG9jayhhaGQsICZzKTsKLQkJd2hpbGUgKExJU1RfRklSU1QoJmFoZC0+cGVuZGluZ19zY2JzKSAhPSBOVUxMKSB7Ci0JCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIRF9EVl9XQUlUX1NJTVFfRU1QVFk7Ci0JCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCQkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7Ci0JCQlhaGRfbG9jayhhaGQsICZzKTsKLQkJfQotCi0JCS8qCi0JCSAqIFdhaXQgZm9yIHRoZSBTSU1RIHRvIGJlIHJlbGVhc2VkIHNvIHRoYXQgRFYgaXMgdGhlCi0JCSAqIG9ubHkgcmVhc29uIHRoZSBxdWV1ZSBpcyBmcm96ZW4uCi0JCSAqLwotCQl3aGlsZSAoQUhEX0RWX1NJTVFfRlJPWkVOKGFoZCkgPT0gMCkgewotCQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfRFZfV0FJVF9TSU1RX1JFTEVBU0U7Ci0JCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCQkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7Ci0JCQlhaGRfbG9jayhhaGQsICZzKTsKLQkJfQotCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCi0JCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDwgQUhEX05VTV9UQVJHRVRTOyB0YXJnZXQrKykKLQkJCWFoZF9saW51eF9kdl90YXJnZXQoYWhkLCB0YXJnZXQpOwotCi0JCWFoZF9sb2NrKGFoZCwgJnMpOwotCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICY9IH5BSERfRFZfQUNUSVZFOwotCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCi0JCS8qCi0JCSAqIFJlbGVhc2UgdGhlIFNJTVEgc28gdGhhdCBub3JtYWwgY29tbWFuZHMgYXJlCi0JCSAqIGFsbG93ZWQgdG8gY29udGludWUgb24gdGhlIGJ1cy4KLQkJICovCi0JCWFoZF9yZWxlYXNlX3NpbXEoYWhkKTsKLQl9Ci0JdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X2tpbGxfZHZfdGhyZWFkKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQl1X2xvbmcgczsKLQotCWFoZF9sb2NrKGFoZCwgJnMpOwotCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3BpZCAhPSAwKSB7Ci0JCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgfD0gQUhEX0RWX1NIVVRET1dOOwotCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCQl1cCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOwotCi0JCS8qCi0JCSAqIFVzZSB0aGUgZWhfc2VtIGFzIGFuIGluZGljYXRvciB0aGF0IHRoZQotCQkgKiBkdiB0aHJlYWQgaXMgZXhpdGluZy4gIE5vdGUgdGhhdCB0aGUgZHYKLQkJICogdGhyZWFkIG11c3Qgc3RpbGwgcmV0dXJuIGFmdGVyIHBlcmZvcm1pbmcKLQkJICogdGhlIHVwIG9uIG91ciBzZW1hcGhvcmUgYmVmb3JlIGl0IGhhcwotCQkgKiBjb21wbGV0ZWx5IGV4aXRlZCB0aGlzIG1vZHVsZS4gIFVuZm9ydHVuYXRlbHksCi0JCSAqIHRoZXJlIHNlZW1zIHRvIGJlIG5vIGVhc3kgd2F5IHRvIHdhaXQgZm9yIHRoZQotCQkgKiBleGl0IG9mIGEgdGhyZWFkIGZvciB3aGljaCB5b3UgYXJlIG5vdCB0aGUKLQkJICogcGFyZW50IChkdiB0aHJlYWRzIGFyZSBwYXJlbnRlZCBieSBpbml0KS4KLQkJICogQ3Jvc3MgeW91ciBmaW5nZXJzLi4uCi0JCSAqLwotCQlkb3duKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7Ci0KLQkJLyoKLQkJICogTWFyayB0aGUgZHYgdGhyZWFkIGFzIGFscmVhZHkgZGVhZC4gIFRoaXMKLQkJICogYXZvaWRzIGF0dGVtcHRpbmcgdG8ga2lsbCBpdCBhIHNlY29uZCB0aW1lLgotCQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIG11c3Qga2lsbCB0aGUKLQkJICogRFYgdGhyZWFkIGJlZm9yZSBjYWxsaW5nIGFoZF9mcmVlKCkgaW4gdGhlCi0JCSAqIG1vZHVsZSBzaHV0ZG93biBjYXNlIHRvIGF2b2lkIGJvZ3VzIGxvY2tpbmcKLQkJICogaW4gdGhlIFNDU0kgbWlkLWxheWVyLCBidXQgd2UgYWhkX2ZyZWUoKSBpcwotCQkgKiBjYWxsZWQgd2l0aG91dCBraWxsaW5nIHRoZSBEViB0aHJlYWQgaW4gdGhlCi0JCSAqIGluc3RhbmNlIGRldGFjaCBjYXNlLCBzbyBhaGRfcGxhdGZvcm1fZnJlZSgpCi0JCSAqIGNhbGxzIHVzIGFnYWluIHRvIHZlcmlmeSB0aGF0IHRoZSBEViB0aHJlYWQKLQkJICogaXMgZGVhZC4KLQkJICovCi0JCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfcGlkID0gMDsKLQl9IGVsc2UgewotCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCX0KLX0KLQotI2RlZmluZSBBSERfTElOVVhfRFZfSU5RX1NIT1JUX0xFTgkzNgotI2RlZmluZSBBSERfTElOVVhfRFZfSU5RX0xFTgkJMjU2Ci0jZGVmaW5lIEFIRF9MSU5VWF9EVl9USU1FT1VUCQkoSFogLyA0KQotCi0jZGVmaW5lIEFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBuZXdzdGF0ZSkgXAotCWFoZF9zZXRfZHZfc3RhdGUoYWhkLCB0YXJnLCBuZXdzdGF0ZSwgX19MSU5FX18pCi0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfc2V0X2R2X3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcsCi0JCSBhaGRfZHZfc3RhdGUgbmV3c3RhdGUsIHVfaW50IGxpbmUpCi17Ci0JYWhkX2R2X3N0YXRlIG9sZHN0YXRlOwotCi0Jb2xkc3RhdGUgPSB0YXJnLT5kdl9zdGF0ZTsKLSNpZmRlZiBBSERfREVCVUcKLQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpCi0JCXByaW50ZigiJXM6JWQ6IEdvaW5nIGZyb20gc3RhdGUgJWQgdG8gc3RhdGUgJWRcbiIsCi0JCSAgICAgICBhaGRfbmFtZShhaGQpLCBsaW5lLCBvbGRzdGF0ZSwgbmV3c3RhdGUpOwotI2VuZGlmCi0KLQlpZiAob2xkc3RhdGUgPT0gbmV3c3RhdGUpCi0JCXRhcmctPmR2X3N0YXRlX3JldHJ5Kys7Ci0JZWxzZQotCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSA9IDA7Ci0JdGFyZy0+ZHZfc3RhdGUgPSBuZXdzdGF0ZTsKLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9kdl90YXJnZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0YXJnZXRfb2Zmc2V0KQotewotCXN0cnVjdAkgYWhkX2RldmluZm8gZGV2aW5mbzsKLQlzdHJ1Y3QJIGFoZF9saW51eF90YXJnZXQgKnRhcmc7Ci0Jc3RydWN0CSBzY3NpX2NtbmQgKmNtZDsKLQlzdHJ1Y3QJIHNjc2lfZGV2aWNlICpzY3NpX2RldjsKLQlzdHJ1Y3QJIHNjc2lfc2Vuc2VfZGF0YSAqc2Vuc2U7Ci0JdWludDhfdCAqYnVmZmVyOwotCXVfbG9uZwkgczsKLQl1X2ludAkgdGltZW91dDsKLQlpbnQJIGVjaG9fc2l6ZTsKLQotCXNlbnNlID0gTlVMTDsKLQlidWZmZXIgPSBOVUxMOwotCWVjaG9fc2l6ZSA9IDA7Ci0JYWhkX2xvY2soYWhkLCAmcyk7Ci0JdGFyZyA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1t0YXJnZXRfb2Zmc2V0XTsKLQlpZiAodGFyZyA9PSBOVUxMIHx8ICh0YXJnLT5mbGFncyAmIEFIRF9EVl9SRVFVSVJFRCkgPT0gMCkgewotCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCQlyZXR1cm47Ci0JfQotCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIGFoZC0+b3VyX2lkLCB0YXJnLT50YXJnZXQsIC8qbHVuKi8wLAotCQkJICAgIHRhcmctPmNoYW5uZWwgKyAnQScsIFJPTEVfSU5JVElBVE9SKTsKLSNpZmRlZiBBSERfREVCVUcKLQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7Ci0JCXByaW50ZigiUGVyZm9ybWluZyBEVlxuIik7Ci0JfQotI2VuZGlmCi0KLQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCi0JY21kID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NzaV9jbW5kKSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKLQlzY3NpX2RldiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNjc2lfZGV2aWNlKSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKLQlzY3NpX2Rldi0+aG9zdCA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdDsKLQlzY3NpX2Rldi0+aWQgPSBkZXZpbmZvLnRhcmdldDsKLQlzY3NpX2Rldi0+bHVuID0gZGV2aW5mby5sdW47Ci0Jc2NzaV9kZXYtPmNoYW5uZWwgPSBkZXZpbmZvLmNoYW5uZWwgLSAnQSc7Ci0JYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zY3NpX2RldiA9IHNjc2lfZGV2OwotCi0JQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOwotCi0Jd2hpbGUgKHRhcmctPmR2X3N0YXRlICE9IEFIRF9EVl9TVEFURV9FWElUKSB7Ci0JCXRpbWVvdXQgPSBBSERfTElOVVhfRFZfVElNRU9VVDsKLQkJc3dpdGNoICh0YXJnLT5kdl9zdGF0ZSkgewotCQljYXNlIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkM6Ci0JCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9BU1lOQzoKLQkJY2FzZSBBSERfRFZfU1RBVEVfSU5RX0FTWU5DX1ZFUklGWToKLQkJCS8qCi0JCQkgKiBTZXQgdGhpbmdzIHRvIGFzeW5jIG5hcnJvdyB0byByZWR1Y2UgdGhlCi0JCQkgKiBjaGFuY2UgdGhhdCB0aGUgSU5RIHdpbGwgZmFpbC4KLQkJCSAqLwotCQkJYWhkX2xvY2soYWhkLCAmcyk7Ci0JCQlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgJmRldmluZm8sIDAsIDAsIDAsCi0JCQkJCSBBSERfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKLQkJCWFoZF9zZXRfd2lkdGgoYWhkLCAmZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKLQkJCQkgICAgICBBSERfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKLQkJCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0JCQl0aW1lb3V0ID0gMTAgKiBIWjsKLQkJCXRhcmctPmZsYWdzICY9IH5BSERfSU5RX1ZBTElEOwotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJY2FzZSBBSERfRFZfU1RBVEVfSU5RX1ZFUklGWToKLQkJewotCQkJdV9pbnQgaW5xX2xlbjsKLQotCQkJaWYgKHRhcmctPmR2X3N0YXRlID09IEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpCi0JCQkJaW5xX2xlbiA9IEFIRF9MSU5VWF9EVl9JTlFfU0hPUlRfTEVOOwotCQkJZWxzZQotCQkJCWlucV9sZW4gPSB0YXJnLT5pbnFfZGF0YS0+YWRkaXRpb25hbF9sZW5ndGggKyA1OwotCQkJYWhkX2xpbnV4X2R2X2lucShhaGQsIGNtZCwgJmRldmluZm8sIHRhcmcsIGlucV9sZW4pOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBBSERfRFZfU1RBVEVfVFVSOgotCQljYXNlIEFIRF9EVl9TVEFURV9CVVNZOgotCQkJdGltZW91dCA9IDUgKiBIWjsKLQkJCWFoZF9saW51eF9kdl90dXIoYWhkLCBjbWQsICZkZXZpbmZvKTsKLQkJCWJyZWFrOwotCQljYXNlIEFIRF9EVl9TVEFURV9SRUJEOgotCQkJYWhkX2xpbnV4X2R2X3JlYmQoYWhkLCBjbWQsICZkZXZpbmZvLCB0YXJnKTsKLQkJCWJyZWFrOwotCQljYXNlIEFIRF9EVl9TVEFURV9XRUI6Ci0JCQlhaGRfbGludXhfZHZfd2ViKGFoZCwgY21kLCAmZGV2aW5mbywgdGFyZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFIRF9EVl9TVEFURV9SRUI6Ci0JCQlhaGRfbGludXhfZHZfcmViKGFoZCwgY21kLCAmZGV2aW5mbywgdGFyZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFIRF9EVl9TVEFURV9TVToKLQkJCWFoZF9saW51eF9kdl9zdShhaGQsIGNtZCwgJmRldmluZm8sIHRhcmcpOwotCQkJdGltZW91dCA9IDUwICogSFo7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7Ci0JCQlwcmludGYoIlVua25vd24gRFYgc3RhdGUgJWRcbiIsIHRhcmctPmR2X3N0YXRlKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJLyogUXVldWUgdGhlIGNvbW1hbmQgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlICovCi0JCS8qIEFidXNlIGVoX3RpbWVvdXQgaW4gdGhlIHNjc2lfY21uZCBzdHJ1Y3QgZm9yIG91ciBwdXJwb3NlcyAqLwotCQlpbml0X3RpbWVyKCZjbWQtPmVoX3RpbWVvdXQpOwotI2lmZGVmIEFIRF9ERUJVRwotCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKQotCQkJLyoKLQkJCSAqIEFsbCBvZiB0aGUgcHJpbnRmcyBkdXJpbmcgbmVnb3RpYXRpb24KLQkJCSAqIHJlYWxseSBzbG93IGRvd24gdGhlIG5lZ290aWF0aW9uLgotCQkJICogQWRkIGEgYml0IG9mIHRpbWUganVzdCB0byBiZSBzYWZlLgotCQkJICovCi0JCQl0aW1lb3V0ICs9IEhaOwotI2VuZGlmCi0JCXNjc2lfYWRkX3RpbWVyKGNtZCwgdGltZW91dCwgYWhkX2xpbnV4X2R2X3RpbWVvdXQpOwotCQkvKgotCQkgKiBJbiAyLjUuWCwgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBjYWxscyBmcm9tIHRoZQotCQkgKiAibWlkbGF5ZXIiICh3aGljaCB3ZSBhcmUgZW11bGF0aW5nKSB3aWxsIGhhdmUgdGhlCi0JCSAqIGFoZCBob3N0IGxvY2sgaGVsZC4gIEZvciBvdGhlciBrZXJuZWxzLCB0aGUKLQkJICogaW9fcmVxdWVzdF9sb2NrIG11c3QgYmUgaGVsZC4KLQkJICovCi0jaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyAhPSAwCi0JCWFoZF9sb2NrKGFoZCwgJnMpOwotI2Vsc2UKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvX3JlcXVlc3RfbG9jaywgcyk7Ci0jZW5kaWYKLQkJYWhkX2xpbnV4X3F1ZXVlKGNtZCwgYWhkX2xpbnV4X2R2X2NvbXBsZXRlKTsKLSNpZiBBSERfU0NTSV9IQVNfSE9TVF9MT0NLICE9IDAKLQkJYWhkX3VubG9jayhhaGQsICZzKTsKLSNlbHNlCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvX3JlcXVlc3RfbG9jaywgcyk7Ci0jZW5kaWYKLQkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X2NtZF9zZW0pOwotCQkvKgotCQkgKiBXYWl0IGZvciB0aGUgU0lNUSB0byBiZSByZWxlYXNlZCBzbyB0aGF0IERWIGlzIHRoZQotCQkgKiBvbmx5IHJlYXNvbiB0aGUgcXVldWUgaXMgZnJvemVuLgotCQkgKi8KLQkJYWhkX2xvY2soYWhkLCAmcyk7Ci0JCXdoaWxlIChBSERfRFZfU0lNUV9GUk9aRU4oYWhkKSA9PSAwKSB7Ci0JCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIRF9EVl9XQUlUX1NJTVFfUkVMRUFTRTsKLQkJCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0JCQlkb3duX2ludGVycnVwdGlibGUoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKLQkJCWFoZF9sb2NrKGFoZCwgJnMpOwotCQl9Ci0JCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0KLQkJYWhkX2xpbnV4X2R2X3RyYW5zaXRpb24oYWhkLCBjbWQsICZkZXZpbmZvLCB0YXJnKTsKLQl9Ci0KLW91dDoKLQlpZiAoKHRhcmctPmZsYWdzICYgQUhEX0lOUV9WQUxJRCkgIT0gMAotCSAmJiBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIGRldmluZm8uY2hhbm5lbCAtICdBJywKLQkJCQkgZGV2aW5mby50YXJnZXQsIGRldmluZm8ubHVuLAotCQkJCSAvKmFsbG9jKi9GQUxTRSkgPT0gTlVMTCkgewotCQkvKgotCQkgKiBUaGUgRFYgc3RhdGUgbWFjaGluZSBmYWlsZWQgdG8gY29uZmlndXJlIHRoaXMgZGV2aWNlLiAgCi0JCSAqIFRoaXMgaXMgbm9ybWFsIGlmIERWIGlzIGRpc2FibGVkLiAgU2luY2Ugd2UgaGF2ZSBpbnF1aXJ5Ci0JCSAqIGRhdGEsIGZpbHRlciBpdCBhbmQgdXNlIHRoZSAib3B0aW1pc3RpYyIgbmVnb3RpYXRpb24KLQkJICogcGFyYW1ldGVycyBmb3VuZCBpbiB0aGUgaW5xdWlyeSBzdHJpbmcuCi0JCSAqLwotCQlhaGRfbGludXhfZmlsdGVyX2lucXVpcnkoYWhkLCAmZGV2aW5mbyk7Ci0JCWlmICgodGFyZy0+ZmxhZ3MgJiAoQUhEX0JBU0lDX0RWfEFIRF9FTkhBTkNFRF9EVikpICE9IDApIHsKLQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOwotCQkJcHJpbnRmKCJEViBmYWlsZWQgdG8gY29uZmlndXJlIGRldmljZS4gICIKLQkJCSAgICAgICAiUGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0IGFnYWluc3QgIgotCQkJICAgICAgICJ0aGlzIGRyaXZlci5cbiIpOwotCQl9Ci0JfQotCi0JaWYgKGNtZCAhPSBOVUxMKQotCQlmcmVlKGNtZCwgTV9ERVZCVUYpOwotCi0JaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXYgIT0gTlVMTCkgewotCQlmcmVlKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXYsIE1fREVWQlVGKTsKLQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zY3NpX2RldiA9IE5VTEw7Ci0JfQotCi0JYWhkX2xvY2soYWhkLCAmcyk7Ci0JaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKSB7Ci0JCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7Ci0JCXRhcmctPmR2X2J1ZmZlciA9IE5VTEw7Ci0JfQotCWlmICh0YXJnLT5kdl9idWZmZXIxICE9IE5VTEwpIHsKLQkJZnJlZSh0YXJnLT5kdl9idWZmZXIxLCBNX0RFVkJVRik7Ci0JCXRhcmctPmR2X2J1ZmZlcjEgPSBOVUxMOwotCX0KLQl0YXJnLT5mbGFncyAmPSB+QUhEX0RWX1JFUVVJUkVEOwotCWlmICh0YXJnLT5yZWZjb3VudCA9PSAwKQotCQlhaGRfbGludXhfZnJlZV90YXJnZXQoYWhkLCB0YXJnKTsKLQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgaW50Ci1haGRfbGludXhfZHZfZmFsbGJhY2soc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pCi17Ci0JdV9sb25nIHM7Ci0JaW50IHJldHZhbDsKLQotCWFoZF9sb2NrKGFoZCwgJnMpOwotCXJldHZhbCA9IGFoZF9saW51eF9mYWxsYmFjayhhaGQsIGRldmluZm8pOwotCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0KLQlyZXR1cm4gKHJldHZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZHZfdHJhbnNpdGlvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJCXN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKLQkJCXN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKQotewotCXVfaW50MzJfdCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBhaWNfZXJyb3JfYWN0aW9uKGNtZCwgdGFyZy0+aW5xX2RhdGEsCi0JCQkJICBhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKSwKLQkJCQkgIGFoZF9jbWRfZ2V0X3Njc2lfc3RhdHVzKGNtZCkpOwotCi0JCi0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7Ci0JCXByaW50ZigiRW50ZXJpbmcgYWhkX2xpbnV4X2R2X3RyYW5zaXRpb24sIHN0YXRlPSAlZCwgIgotCQkgICAgICAgInN0YXR1cz0gMHgleCwgY21kLT5yZXN1bHQ9IDB4JXhcbiIsIHRhcmctPmR2X3N0YXRlLAotCQkgICAgICAgc3RhdHVzLCBjbWQtPnJlc3VsdCk7Ci0JfQotI2VuZGlmCi0KLQlzd2l0Y2ggKHRhcmctPmR2X3N0YXRlKSB7Ci0JY2FzZSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DOgotCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9BU1lOQzoKLQkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7Ci0JCWNhc2UgU1NfTk9QOgotCQl7Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUrMSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNTX0lOUV9SRUZSRVNIOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKLQkJCWJyZWFrOwotCQljYXNlIFNTX1RVUjoKLQkJY2FzZSBTU19SRVRSWToKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSk7Ci0JCQlpZiAoYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkKLQkJCSA9PSBDQU1fUkVRVUVVRV9SRVEpCi0JCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnktLTsKLQkJCWlmICgoc3RhdHVzICYgU1NfRVJSTUFTSykgPT0gRUJVU1kpCi0JCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9CVVNZKTsKLQkJCWlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8IDEwKQotCQkJCWJyZWFrOwotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJZGVmYXVsdDoKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JCQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQkJCXByaW50ZigiRmFpbGVkIERWIGlucXVpcnksIHNraXBwaW5nXG4iKTsKLQkJCX0KLSNlbmRpZgotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBSERfRFZfU1RBVEVfSU5RX0FTWU5DX1ZFUklGWToKLQkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7Ci0JCWNhc2UgU1NfTk9QOgotCQl7Ci0JCQl1X2ludCB4cG9ydGZsYWdzOwotCQkJdV9pbnQgc3BpM2RhdGE7Ci0KLQkJCWlmIChtZW1jbXAodGFyZy0+aW5xX2RhdGEsIHRhcmctPmR2X2J1ZmZlciwKLQkJCQkgICBBSERfTElOVVhfRFZfSU5RX0xFTikgIT0gMCkgewotCQkJCS8qCi0JCQkJICogSW5xdWlyeSBkYXRhIG11c3QgaGF2ZSBjaGFuZ2VkLgotCQkJCSAqIFRyeSBmcm9tIHRoZSB0b3AgYWdhaW4uCi0JCQkJICovCi0JCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSsxKTsKLQkJCXRhcmctPmZsYWdzIHw9IEFIRF9JTlFfVkFMSUQ7Ci0JCQlpZiAoYWhkX2xpbnV4X3VzZXJfZHZfc2V0dGluZyhhaGQpID09IDApCi0JCQkJYnJlYWs7Ci0KLQkJCXhwb3J0ZmxhZ3MgPSB0YXJnLT5pbnFfZGF0YS0+ZmxhZ3M7Ci0JCQlpZiAoKHhwb3J0ZmxhZ3MgJiAoU0lEX1N5bmN8U0lEX1dCdXMxNikpID09IDApCi0JCQkJYnJlYWs7Ci0KLQkJCXNwaTNkYXRhID0gdGFyZy0+aW5xX2RhdGEtPnNwaTNkYXRhOwotCQkJc3dpdGNoIChzcGkzZGF0YSAmIFNJRF9TUElfQ0xPQ0tfRFRfU1QpIHsKLQkJCWRlZmF1bHQ6Ci0JCQljYXNlIFNJRF9TUElfQ0xPQ0tfU1Q6Ci0JCQkJLyogQXNzdW1lIG9ubHkgYmFzaWMgRFYgaXMgc3VwcG9ydGVkLiAqLwotCQkJCXRhcmctPmZsYWdzIHw9IEFIRF9CQVNJQ19EVjsKLQkJCQlicmVhazsKLQkJCWNhc2UgU0lEX1NQSV9DTE9DS19EVDoKLQkJCWNhc2UgU0lEX1NQSV9DTE9DS19EVF9TVDoKLQkJCQl0YXJnLT5mbGFncyB8PSBBSERfRU5IQU5DRURfRFY7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNTX0lOUV9SRUZSRVNIOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKLQkJCWJyZWFrOwotCQljYXNlIFNTX1RVUjoKLQkJY2FzZSBTU19SRVRSWToKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSk7Ci0JCQlpZiAoYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkKLQkJCSA9PSBDQU1fUkVRVUVVRV9SRVEpCi0JCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnktLTsKLQotCQkJaWYgKChzdGF0dXMgJiBTU19FUlJNQVNLKSA9PSBFQlVTWSkKLQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0JVU1kpOwotCQkJaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5IDwgMTApCi0JCQkJYnJlYWs7Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQlkZWZhdWx0OgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKLSNpZmRlZiBBSERfREVCVUcKLQkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgewotCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7Ci0JCQkJcHJpbnRmKCJGYWlsZWQgRFYgaW5xdWlyeSwgc2tpcHBpbmdcbiIpOwotCQkJfQotI2VuZGlmCi0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIEFIRF9EVl9TVEFURV9JTlFfVkVSSUZZOgotCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKLQkJY2FzZSBTU19OT1A6Ci0JCXsKLQotCQkJaWYgKG1lbWNtcCh0YXJnLT5pbnFfZGF0YSwgdGFyZy0+ZHZfYnVmZmVyLAotCQkJCSAgIEFIRF9MSU5VWF9EVl9JTlFfTEVOKSA9PSAwKSB7Ci0JCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKLQkJCQlicmVhazsKLQkJCX0KLQotI2lmZGVmIEFIRF9ERUJVRwotCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCQkJaW50IGk7Ci0KLQkJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQkJCXByaW50ZigiSW5xdWlyeSBidWZmZXIgbWlzbWF0Y2g6Iik7Ci0JCQkJZm9yIChpID0gMDsgaSA8IEFIRF9MSU5VWF9EVl9JTlFfTEVOOyBpKyspIHsKLQkJCQkJaWYgKChpICYgMHhGKSA9PSAwKQotCQkJCQkJcHJpbnRmKCJcbiAgICAgICAgIik7Ci0JCQkJCXByaW50ZigiMHgleDoweDAleCAiLAotCQkJCQkgICAgICAgKCh1aW50OF90ICopdGFyZy0+aW5xX2RhdGEpW2ldLCAKLQkJCQkJICAgICAgIHRhcmctPmR2X2J1ZmZlcltpXSk7Ci0JCQkJfQotCQkJCXByaW50ZigiXG4iKTsKLQkJCX0KLSNlbmRpZgotCi0JCQlpZiAoYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKGFoZCwgZGV2aW5mbykgIT0gMCkgewotCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKgotCQkJICogRG8gbm90IGNvdW50ICJmYWxsaW5nIGJhY2siCi0JCQkgKiBhZ2FpbnN0IG91ciByZXRyaWVzLgotCQkJICovCi0JCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSA9IDA7Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTU19JTlFfUkVGUkVTSDoKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAotCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7Ci0JCQlicmVhazsKLQkJY2FzZSBTU19UVVI6Ci0JCWNhc2UgU1NfUkVUUlk6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOwotCQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCi0JCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKSB7Ci0JCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnktLTsKLQkJCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNTUV9GQUxMQkFDSykgIT0gMCkgewotCQkJCWlmIChhaGRfbGludXhfZHZfZmFsbGJhY2soYWhkLCBkZXZpbmZvKSAhPSAwKSB7Ci0JCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAotCQkJCQkJCSBBSERfRFZfU1RBVEVfRVhJVCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKgotCQkJCSAqIERvIG5vdCBjb3VudCAiZmFsbGluZyBiYWNrIgotCQkJCSAqIGFnYWluc3Qgb3VyIHJldHJpZXMuCi0JCQkJICovCi0JCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOwotCQkJfSBlbHNlIGlmICgoc3RhdHVzICYgU1NfRVJSTUFTSykgPT0gRUJVU1kpCi0JCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9CVVNZKTsKLQkJCWlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8IDEwKQotCQkJCWJyZWFrOwotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJZGVmYXVsdDoKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JCQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQkJCXByaW50ZigiRmFpbGVkIERWIGlucXVpcnksIHNraXBwaW5nXG4iKTsKLQkJCX0KLSNlbmRpZgotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFIRF9EVl9TVEFURV9UVVI6Ci0JCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgewotCQljYXNlIFNTX05PUDoKLQkJCWlmICgodGFyZy0+ZmxhZ3MgJiBBSERfQkFTSUNfRFYpICE9IDApIHsKLQkJCQlhaGRfbGludXhfZmlsdGVyX2lucXVpcnkoYWhkLCBkZXZpbmZvKTsKLQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKLQkJCQkJCSBBSERfRFZfU1RBVEVfSU5RX1ZFUklGWSk7Ci0JCQl9IGVsc2UgaWYgKCh0YXJnLT5mbGFncyAmIEFIRF9FTkhBTkNFRF9EVikgIT0gMCkgewotCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfUkVCRCk7Ci0JCQl9IGVsc2UgewotCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTU19SRVRSWToKLQkJY2FzZSBTU19UVVI6Ci0JCQlpZiAoKHN0YXR1cyAmIFNTX0VSUk1BU0spID09IEVCVVNZKSB7Ci0JCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9CVVNZKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSk7Ci0JCQlpZiAoYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkKLQkJCSA9PSBDQU1fUkVRVUVVRV9SRVEpIHsKLQkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOwotCQkJfSBlbHNlIGlmICgoc3RhdHVzICYgU1NRX0ZBTExCQUNLKSAhPSAwKSB7Ci0JCQkJaWYgKGFoZF9saW51eF9kdl9mYWxsYmFjayhhaGQsIGRldmluZm8pICE9IDApIHsKLQkJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCQkJIEFIRF9EVl9TVEFURV9FWElUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogRG8gbm90IGNvdW50ICJmYWxsaW5nIGJhY2siCi0JCQkJICogYWdhaW5zdCBvdXIgcmV0cmllcy4KLQkJCQkgKi8KLQkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSA9IDA7Ci0JCQl9Ci0JCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPj0gMTApIHsKLSNpZmRlZiBBSERfREVCVUcKLQkJCQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJCQkJcHJpbnRmKCJEViBUVVIgcmV0aWVzIGV4aGF1c3RlZFxuIik7Ci0JCQkJfQotI2VuZGlmCi0JCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzdGF0dXMgJiBTU1FfREVMQVkpCi0JCQkJc3NsZWVwKDEpOwotCi0JCQlicmVhazsKLQkJY2FzZSBTU19TVEFSVDoKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfU1UpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NfSU5RX1JFRlJFU0g6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKLQkJCQkJIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFIRF9EVl9TVEFURV9SRUJEOgotCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKLQkJY2FzZSBTU19OT1A6Ci0JCXsKLQkJCXVpbnQzMl90IGVjaG9fc2l6ZTsKLQotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9XRUIpOwotCQkJZWNob19zaXplID0gc2NzaV8zYnRvdWwoJnRhcmctPmR2X2J1ZmZlclsxXSk7Ci0JCQllY2hvX3NpemUgJj0gMHgxRkZGOwotI2lmZGVmIEFIRF9ERUJVRwotCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJCQlwcmludGYoIkVjaG8gYnVmZmVyIHNpemU9ICVkXG4iLCBlY2hvX3NpemUpOwotCQkJfQotI2VuZGlmCi0JCQlpZiAoZWNob19zaXplID09IDApIHsKLQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBHZW5lcmF0ZSB0aGUgYnVmZmVyIHBhdHRlcm4gKi8KLQkJCXRhcmctPmR2X2VjaG9fc2l6ZSA9IGVjaG9fc2l6ZTsKLQkJCWFoZF9saW51eF9nZW5lcmF0ZV9kdl9wYXR0ZXJuKHRhcmcpOwotCQkJLyoKLQkJCSAqIFNldHVwIGluaXRpYWwgbmVnb3RpYXRpb24gdmFsdWVzLgotCQkJICovCi0JCQlhaGRfbGludXhfZmlsdGVyX2lucXVpcnkoYWhkLCBkZXZpbmZvKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU1NfSU5RX1JFRlJFU0g6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKLQkJCQkJIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NfUkVUUlk6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOwotCQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCi0JCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKQotCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07Ci0JCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPD0gMTApCi0JCQkJYnJlYWs7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JCQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQkJCXByaW50ZigiRFYgUkVCRCByZXRpZXMgZXhoYXVzdGVkXG4iKTsKLQkJCX0KLSNlbmRpZgotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJY2FzZSBTU19GQVRBTDoKLQkJZGVmYXVsdDoKLQkJCS8qCi0JCQkgKiBTZXR1cCBpbml0aWFsIG5lZ290aWF0aW9uIHZhbHVlcwotCQkJICogYW5kIHRyeSBsZXZlbCAxIERWLgotCQkJICovCi0JCQlhaGRfbGludXhfZmlsdGVyX2lucXVpcnkoYWhkLCBkZXZpbmZvKTsKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfSU5RX1ZFUklGWSk7Ci0JCQl0YXJnLT5kdl9lY2hvX3NpemUgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFIRF9EVl9TVEFURV9XRUI6Ci0JCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgewotCQljYXNlIFNTX05PUDoKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfUkVCKTsKLQkJCWJyZWFrOwotCQljYXNlIFNTX0lOUV9SRUZSRVNIOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKLQkJCWJyZWFrOwotCQljYXNlIFNTX1JFVFJZOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKLQkJCWlmIChhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQotCQkJID09IENBTV9SRVFVRVVFX1JFUSkgewotCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07Ci0JCQl9IGVsc2UgaWYgKChzdGF0dXMgJiBTU1FfRkFMTEJBQ0spICE9IDApIHsKLQkJCQlpZiAoYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKGFoZCwgZGV2aW5mbykgIT0gMCkgewotCQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKLQkJCQkJCQkgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBEbyBub3QgY291bnQgImZhbGxpbmcgYmFjayIKLQkJCQkgKiBhZ2FpbnN0IG91ciByZXRyaWVzLgotCQkJCSAqLwotCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5ID0gMDsKLQkJCX0KLQkJCWlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8PSAxMCkKLQkJCQlicmVhazsKLQkJCS8qIEZBTExUSFJPVUdIICovCi0jaWZkZWYgQUhEX0RFQlVHCi0JCQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQkJCXByaW50ZigiRFYgV0VCIHJldGllcyBleGhhdXN0ZWRcbiIpOwotCQkJfQotI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFIRF9EVl9TVEFURV9SRUI6Ci0JCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgewotCQljYXNlIFNTX05PUDoKLQkJCWlmIChtZW1jbXAodGFyZy0+ZHZfYnVmZmVyLCB0YXJnLT5kdl9idWZmZXIxLAotCQkJCSAgIHRhcmctPmR2X2VjaG9fc2l6ZSkgIT0gMCkgewotCQkJCWlmIChhaGRfbGludXhfZHZfZmFsbGJhY2soYWhkLCBkZXZpbmZvKSAhPSAwKQotCQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKLQkJCQkJCQkgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJCWVsc2UKLQkJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCQkJIEFIRF9EVl9TVEFURV9XRUIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQlpZiAodGFyZy0+ZHZfYnVmZmVyICE9IE5VTEwpIHsKLQkJCQlmcmVlKHRhcmctPmR2X2J1ZmZlciwgTV9ERVZCVUYpOwotCQkJCXRhcmctPmR2X2J1ZmZlciA9IE5VTEw7Ci0JCQl9Ci0JCQlpZiAodGFyZy0+ZHZfYnVmZmVyMSAhPSBOVUxMKSB7Ci0JCQkJZnJlZSh0YXJnLT5kdl9idWZmZXIxLCBNX0RFVkJVRik7Ci0JCQkJdGFyZy0+ZHZfYnVmZmVyMSA9IE5VTEw7Ci0JCQl9Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NfSU5RX1JFRlJFU0g6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKLQkJCQkJIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NfUkVUUlk6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOwotCQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCi0JCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKSB7Ci0JCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnktLTsKLQkJCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNTUV9GQUxMQkFDSykgIT0gMCkgewotCQkJCWlmIChhaGRfbGludXhfZHZfZmFsbGJhY2soYWhkLCBkZXZpbmZvKSAhPSAwKSB7Ci0JCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAotCQkJCQkJCSBBSERfRFZfU1RBVEVfRVhJVCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX1dFQik7Ci0JCQl9Ci0JCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPD0gMTApIHsKLQkJCQlpZiAoKHN0YXR1cyAmIChTU1FfREVMQVlfUkFORE9NfFNTUV9ERUxBWSkpIT0gMCkKLQkJCQkJbXNsZWVwKGFoZC0+b3VyX2lkKjEwMDAvMTApOwotCQkJCWJyZWFrOwotCQkJfQotI2lmZGVmIEFIRF9ERUJVRwotCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJCQlwcmludGYoIkRWIFJFQiByZXRpZXMgZXhoYXVzdGVkXG4iKTsKLQkJCX0KLSNlbmRpZgotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJZGVmYXVsdDoKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUhEX0RWX1NUQVRFX1NVOgotCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKLQkJY2FzZSBTU19OT1A6Ci0JCWNhc2UgU1NfSU5RX1JFRlJFU0g6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKLQkJCQkJIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFIRF9EVl9TVEFURV9CVVNZOgotCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKLQkJY2FzZSBTU19OT1A6Ci0JCWNhc2UgU1NfSU5RX1JFRlJFU0g6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKLQkJCQkJIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NfVFVSOgotCQljYXNlIFNTX1JFVFJZOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKLQkJCWlmIChhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQotCQkJID09IENBTV9SRVFVRVVFX1JFUSkgewotCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07Ci0JCQl9IGVsc2UgaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5IDwgNjApIHsKLQkJCQlpZiAoKHN0YXR1cyAmIFNTUV9ERUxBWSkgIT0gMCkKLQkJCQkJc3NsZWVwKDEpOwotCQkJfSBlbHNlIHsKLSNpZmRlZiBBSERfREVCVUcKLQkJCQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJCQkJcHJpbnRmKCJEViBCVVNZIHJldGllcyBleGhhdXN0ZWRcbiIpOwotCQkJCX0KLSNlbmRpZgotCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50ZigiJXM6IEludmFsaWQgRFYgY29tcGxldGlvbiBzdGF0ZSAlZFxuIiwgYWhkX25hbWUoYWhkKSwKLQkJICAgICAgIHRhcmctPmR2X3N0YXRlKTsKLQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X2R2X2ZpbGxfY21kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkgICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pCi17Ci0JbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBzY3NpX2NtbmQpKTsKLQljbWQtPmRldmljZSA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXY7Ci0JY21kLT5zY3NpX2RvbmUgPSBhaGRfbGludXhfZHZfY29tcGxldGU7Ci19Ci0KLS8qCi0gKiBTeW50aGVzaXplIGFuIGlucXVpcnkgY29tbWFuZC4gIE9uIHRoZSByZXR1cm4gdHJpcCwgaXQnbGwgYmUKLSAqIHNuaWZmZWQgYW5kIHRoZSBkZXZpY2UgdHJhbnNmZXIgc2V0dGluZ3Mgc2V0IGZvciB1cy4KLSAqLwotc3RhdGljIHZvaWQKLWFoZF9saW51eF9kdl9pbnEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCSBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnLAotCQkgdV9pbnQgcmVxdWVzdF9sZW5ndGgpCi17Ci0KLSNpZmRlZiBBSERfREVCVUcKLQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJcHJpbnRmKCJTZW5kaW5nIElOUVxuIik7Ci0JfQotI2VuZGlmCi0JaWYgKHRhcmctPmlucV9kYXRhID09IE5VTEwpCi0JCXRhcmctPmlucV9kYXRhID0gbWFsbG9jKEFIRF9MSU5VWF9EVl9JTlFfTEVOLAotCQkJCQlNX0RFVkJVRiwgTV9XQUlUT0spOwotCWlmICh0YXJnLT5kdl9zdGF0ZSA+IEFIRF9EVl9TVEFURV9JTlFfQVNZTkMpIHsKLQkJaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKQotCQkJZnJlZSh0YXJnLT5kdl9idWZmZXIsIE1fREVWQlVGKTsKLQkJdGFyZy0+ZHZfYnVmZmVyID0gbWFsbG9jKEFIRF9MSU5VWF9EVl9JTlFfTEVOLAotCQkJCQkgTV9ERVZCVUYsIE1fV0FJVE9LKTsKLQl9Ci0KLQlhaGRfbGludXhfZHZfZmlsbF9jbWQoYWhkLCBjbWQsIGRldmluZm8pOwotCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7Ci0JY21kLT5jbWRfbGVuID0gNjsKLQljbWQtPmNtbmRbMF0gPSBJTlFVSVJZOwotCWNtZC0+Y21uZFs0XSA9IHJlcXVlc3RfbGVuZ3RoOwotCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gcmVxdWVzdF9sZW5ndGg7Ci0JaWYgKHRhcmctPmR2X3N0YXRlID4gQUhEX0RWX1NUQVRFX0lOUV9BU1lOQykKLQkJY21kLT5yZXF1ZXN0X2J1ZmZlciA9IHRhcmctPmR2X2J1ZmZlcjsKLQllbHNlCi0JCWNtZC0+cmVxdWVzdF9idWZmZXIgPSB0YXJnLT5pbnFfZGF0YTsKLQltZW1zZXQoY21kLT5yZXF1ZXN0X2J1ZmZlciwgMCwgQUhEX0xJTlVYX0RWX0lOUV9MRU4pOwotfQotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X2R2X3R1cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKLXsKLQotI2lmZGVmIEFIRF9ERUJVRwotCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgewotCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQlwcmludGYoIlNlbmRpbmcgVFVSXG4iKTsKLQl9Ci0jZW5kaWYKLQkvKiBEbyBhIFRVUiB0byBjbGVhciBvdXQgYW55IG5vbi1mYXRhbCB0cmFuc2l0aW9uYWwgc3RhdGUgKi8KLQlhaGRfbGludXhfZHZfZmlsbF9jbWQoYWhkLCBjbWQsIGRldmluZm8pOwotCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKLQljbWQtPmNtZF9sZW4gPSA2OwotCWNtZC0+Y21uZFswXSA9IFRFU1RfVU5JVF9SRUFEWTsKLX0KLQotI2RlZmluZSBBSERfUkVCRF9MRU4gNAotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X2R2X3JlYmQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCSBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKQotewotCi0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7Ci0JCXByaW50ZigiU2VuZGluZyBSRUJEXG4iKTsKLQl9Ci0jZW5kaWYKLQlpZiAodGFyZy0+ZHZfYnVmZmVyICE9IE5VTEwpCi0JCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7Ci0JdGFyZy0+ZHZfYnVmZmVyID0gbWFsbG9jKEFIRF9SRUJEX0xFTiwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKLQlhaGRfbGludXhfZHZfZmlsbF9jbWQoYWhkLCBjbWQsIGRldmluZm8pOwotCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7Ci0JY21kLT5jbWRfbGVuID0gMTA7Ci0JY21kLT5jbW5kWzBdID0gUkVBRF9CVUZGRVI7Ci0JY21kLT5jbW5kWzFdID0gMHgwYjsKLQlzY3NpX3VsdG8zYihBSERfUkVCRF9MRU4sICZjbWQtPmNtbmRbNl0pOwotCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gQUhEX1JFQkRfTEVOOwotCWNtZC0+dW5kZXJmbG93ID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47Ci0JY21kLT5yZXF1ZXN0X2J1ZmZlciA9IHRhcmctPmR2X2J1ZmZlcjsKLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9kdl93ZWIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCSBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKQotewotCi0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7Ci0JCXByaW50ZigiU2VuZGluZyBXRUJcbiIpOwotCX0KLSNlbmRpZgotCWFoZF9saW51eF9kdl9maWxsX2NtZChhaGQsIGNtZCwgZGV2aW5mbyk7Ci0JY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7Ci0JY21kLT5jbWRfbGVuID0gMTA7Ci0JY21kLT5jbW5kWzBdID0gV1JJVEVfQlVGRkVSOwotCWNtZC0+Y21uZFsxXSA9IDB4MGE7Ci0Jc2NzaV91bHRvM2IodGFyZy0+ZHZfZWNob19zaXplLCAmY21kLT5jbW5kWzZdKTsKLQljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHRhcmctPmR2X2VjaG9fc2l6ZTsKLQljbWQtPnVuZGVyZmxvdyA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOwotCWNtZC0+cmVxdWVzdF9idWZmZXIgPSB0YXJnLT5kdl9idWZmZXI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZHZfcmViKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLCBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZykKLXsKLQotI2lmZGVmIEFIRF9ERUJVRwotCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgewotCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQlwcmludGYoIlNlbmRpbmcgUkVCXG4iKTsKLQl9Ci0jZW5kaWYKLQlhaGRfbGludXhfZHZfZmlsbF9jbWQoYWhkLCBjbWQsIGRldmluZm8pOwotCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7Ci0JY21kLT5jbWRfbGVuID0gMTA7Ci0JY21kLT5jbW5kWzBdID0gUkVBRF9CVUZGRVI7Ci0JY21kLT5jbW5kWzFdID0gMHgwYTsKLQlzY3NpX3VsdG8zYih0YXJnLT5kdl9lY2hvX3NpemUsICZjbWQtPmNtbmRbNl0pOwotCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gdGFyZy0+ZHZfZWNob19zaXplOwotCWNtZC0+dW5kZXJmbG93ID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47Ci0JY21kLT5yZXF1ZXN0X2J1ZmZlciA9IHRhcmctPmR2X2J1ZmZlcjE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZHZfc3Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCXN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKLQkJc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpCi17Ci0JdV9pbnQgbGU7Ci0KLQlsZSA9IFNJRF9JU19SRU1PVkFCTEUodGFyZy0+aW5xX2RhdGEpID8gU1NTX0xPRUogOiAwOwotCi0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7Ci0JCXByaW50ZigiU2VuZGluZyBTVVxuIik7Ci0JfQotI2VuZGlmCi0JYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKLQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7Ci0JY21kLT5jbWRfbGVuID0gNjsKLQljbWQtPmNtbmRbMF0gPSBTVEFSVF9TVE9QX1VOSVQ7Ci0JY21kLT5jbW5kWzRdID0gbGUgfCBTU1NfU1RBUlQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWFoZF9saW51eF9mYWxsYmFjayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKLXsKLQlzdHJ1Y3QJYWhkX2xpbnV4X3RhcmdldCAqdGFyZzsKLQlzdHJ1Y3QJYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87Ci0Jc3RydWN0CWFoZF90cmFuc2luZm8gKmdvYWw7Ci0Jc3RydWN0CWFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKLQl1X2ludAl3aWR0aDsKLQl1X2ludAlwZXJpb2Q7Ci0JdV9pbnQJb2Zmc2V0OwotCXVfaW50CXBwcl9vcHRpb25zOwotCXVfaW50CWN1cl9zcGVlZDsKLQl1X2ludAl3aWRlX3NwZWVkOwotCXVfaW50CW5hcnJvd19zcGVlZDsKLQl1X2ludAlmYWxsYmFja19zcGVlZDsKLQotI2lmZGVmIEFIRF9ERUJVRwotCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgewotCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQlwcmludGYoIlRyeWluZyB0byBmYWxsYmFja1xuIik7Ci0JfQotI2VuZGlmCi0JdGFyZyA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1tkZXZpbmZvLT50YXJnZXRfb2Zmc2V0XTsKLQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBkZXZpbmZvLT5jaGFubmVsLAotCQkJCSAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAotCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOwotCWdvYWwgPSAmdGluZm8tPmdvYWw7Ci0Jd2lkdGggPSBnb2FsLT53aWR0aDsKLQlwZXJpb2QgPSBnb2FsLT5wZXJpb2Q7Ci0Jb2Zmc2V0ID0gZ29hbC0+b2Zmc2V0OwotCXBwcl9vcHRpb25zID0gZ29hbC0+cHByX29wdGlvbnM7Ci0JaWYgKG9mZnNldCA9PSAwKQotCQlwZXJpb2QgPSBBSERfQVNZTkNfWEZFUl9QRVJJT0Q7Ci0JaWYgKHRhcmctPmR2X25leHRfbmFycm93X3BlcmlvZCA9PSAwKQotCQl0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2QgPSBNQVgocGVyaW9kLCBBSERfU1lOQ1JBVEVfVUxUUkEyKTsKLQlpZiAodGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZCA9PSAwKQotCQl0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kID0gcGVyaW9kOwotCWlmICh0YXJnLT5kdl9tYXhfd2lkdGggPT0gMCkKLQkJdGFyZy0+ZHZfbWF4X3dpZHRoID0gd2lkdGg7Ci0JaWYgKHRhcmctPmR2X21heF9wcHJfb3B0aW9ucyA9PSAwKQotCQl0YXJnLT5kdl9tYXhfcHByX29wdGlvbnMgPSBwcHJfb3B0aW9uczsKLQlpZiAodGFyZy0+ZHZfbGFzdF9wcHJfb3B0aW9ucyA9PSAwKQotCQl0YXJnLT5kdl9sYXN0X3Bwcl9vcHRpb25zID0gcHByX29wdGlvbnM7Ci0KLQljdXJfc3BlZWQgPSBhaWNfY2FsY19zcGVlZCh3aWR0aCwgcGVyaW9kLCBvZmZzZXQsIEFIRF9TWU5DUkFURV9NSU4pOwotCXdpZGVfc3BlZWQgPSBhaWNfY2FsY19zcGVlZChNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVCwKLQkJCQkJICB0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kLAotCQkJCQkgIE1BWF9PRkZTRVQsIEFIRF9TWU5DUkFURV9NSU4pOwotCW5hcnJvd19zcGVlZCA9IGFpY19jYWxjX3NwZWVkKE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCi0JCQkJCSAgICB0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2QsCi0JCQkJCSAgICBNQVhfT0ZGU0VULCBBSERfU1lOQ1JBVEVfTUlOKTsKLQlmYWxsYmFja19zcGVlZCA9IGFpY19jYWxjX3NwZWVkKHdpZHRoLCBwZXJpb2QrMSwgb2Zmc2V0LAotCQkJCQkgICAgICBBSERfU1lOQ1JBVEVfTUlOKTsKLSNpZmRlZiBBSERfREVCVUcKLQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJcHJpbnRmKCJjdXJfc3BlZWQ9ICVkLCB3aWRlX3NwZWVkPSAlZCwgbmFycm93X3NwZWVkPSAlZCwgIgotCQkgICAgICAgImZhbGxiYWNrX3NwZWVkPSAlZFxuIiwgY3VyX3NwZWVkLCB3aWRlX3NwZWVkLAotCQkgICAgICAgbmFycm93X3NwZWVkLCBmYWxsYmFja19zcGVlZCk7Ci0JfQotI2VuZGlmCi0KLQlpZiAoY3VyX3NwZWVkID4gMTYwMDAwKSB7Ci0JCS8qCi0JCSAqIFBhY2VkL0RUL0lVX1JFUSBvbmx5IHRyYW5zZmVyIHNwZWVkcy4gIEFsbCB3ZQotCQkgKiBjYW4gZG8gaXMgZmFsbGJhY2sgaW4gdGVybXMgb2Ygc3luY3JhdGUuCi0JCSAqLwotCQlwZXJpb2QrKzsKLQl9IGVsc2UgaWYgKGN1cl9zcGVlZCA+IDgwMDAwKSB7Ci0JCWlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApIHsKLQkJCS8qCi0JCQkgKiBUcnkgd2l0aG91dCBJVV9SRVEgYXMgaXQgbWF5IGJlIGNvbmZ1c2luZwotCQkJICogYW4gZXhwYW5kZXIuCi0JCQkgKi8KLQkJCXBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9JVV9SRVE7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogUGFjZWQvRFQgb25seSB0cmFuc2ZlciBzcGVlZHMuICBBbGwgd2UKLQkJCSAqIGNhbiBkbyBpcyBmYWxsYmFjayBpbiB0ZXJtcyBvZiBzeW5jcmF0ZS4KLQkJCSAqLwotCQkJcGVyaW9kKys7Ci0JCQlwcHJfb3B0aW9ucyA9IHRhcmctPmR2X21heF9wcHJfb3B0aW9uczsKLQkJfQotCX0gZWxzZSBpZiAoY3VyX3NwZWVkID4gMzMwMCkgewotCi0JCS8qCi0JCSAqIEluIHRoaXMgcmFuZ2Ugd2UgdGhlIGZvbGxvd2luZwotCQkgKiBvcHRpb25zIG9yZGVyZWQgZnJvbSBoaWdoZXN0IHRvCi0JCSAqIGxvd2VzdCBkZXNpcmVhYmlsaXR5OgotCQkgKgotCQkgKiBvIFdpZGUvRFQKLQkJICogbyBXaWRlL25vbi1EVAotCQkgKiBvIE5hcnJvdyBhdCBhIHBvdGVudGFsbHkgaGlnaGVyIHN5bmMgcmF0ZS4KLQkJICoKLQkJICogQWxsIG1vZGVzIGFyZSB0ZXN0ZWQgd2l0aCBhbmQgd2l0aG91dCBJVV9SRVEKLQkJICogc2V0IHNpbmNlIHVzaW5nIElVcyBtYXkgY29uZnVzZSBhbiBleHBhbmRlci4KLQkJICovCi0JCWlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApIHsKLQotCQkJcHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX0lVX1JFUTsKLQkJfSBlbHNlIGlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVEpICE9IDApIHsKLQkJCS8qCi0JCQkgKiBUcnkgZ29pbmcgbm9uLURULgotCQkJICovCi0JCQlwcHJfb3B0aW9ucyA9IHRhcmctPmR2X21heF9wcHJfb3B0aW9uczsKLQkJCXBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9EVF9SRVE7Ci0JCX0gZWxzZSBpZiAodGFyZy0+ZHZfbGFzdF9wcHJfb3B0aW9ucyAhPSAwKSB7Ci0JCQkvKgotCQkJICogVHJ5IHdpdGhvdXQgUUFTIG9yIGFueSBvdGhlciBQUFIgb3B0aW9ucy4KLQkJCSAqIFdlIG1heSBuZWVkIGEgbm9uLVBQUiBtZXNzYWdlIHRvIHdvcmsgd2l0aAotCQkJICogYW4gZXhwYW5kZXIuICBXZSBsb29rIGF0IHRoZSAibGFzdCBQUFIgb3B0aW9ucyIKLQkJCSAqIHNvIHdlIHdpbGwgcGVyZm9ybSB0aGlzIGZhbGxiYWNrIGV2ZW4gaWYgdGhlCi0JCQkgKiB0YXJnZXQgcmVzcG9uZGVkIHRvIG91ciBQUFIgbmVnb3RpYXRpb24gd2l0aAotCQkJICogbm8gb3B0aW9uIGJpdHMgc2V0LgotCQkJICovCi0JCQlwcHJfb3B0aW9ucyA9IDA7Ci0JCX0gZWxzZSBpZiAod2lkdGggPT0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQpIHsKLQkJCS8qCi0JCQkgKiBJZiB0aGUgbmV4dCBuYXJyb3cgc3BlZWQgaXMgZ3JlYXRlciB0aGFuCi0JCQkgKiB0aGUgbmV4dCB3aWRlIHNwZWVkLCBmYWxsYmFjayB0byBuYXJyb3cuCi0JCQkgKiBPdGhlcndpc2UgZmFsbGJhY2sgdG8gdGhlIG5leHQgRFQvV2lkZSBzZXR0aW5nLgotCQkJICogVGhlIG5hcnJvdyBhc3luYyBzcGVlZCB3aWxsIGFsd2F5cyBiZSBzbWFsbGVyCi0JCQkgKiB0aGFuIHRoZSB3aWRlIGFzeW5jIHNwZWVkLCBzbyBoYW5kbGUgdGhpcyBjYXNlCi0JCQkgKiBzcGVjaWZpY2FsbHkuCi0JCQkgKi8KLQkJCXBwcl9vcHRpb25zID0gdGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zOwotCQkJaWYgKG5hcnJvd19zcGVlZCA+IGZhbGxiYWNrX3NwZWVkCi0JCQkgfHwgcGVyaW9kID49IEFIRF9BU1lOQ19YRkVSX1BFUklPRCkgewotCQkJCXRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QgPSBwZXJpb2QrMTsKLQkJCQl3aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ7Ci0JCQkJcGVyaW9kID0gdGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kOwotCQkJfSBlbHNlIHsKLQkJCQlwZXJpb2QrKzsKLQkJCX0KLQkJfSBlbHNlIGlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSAhPSAwCi0JCQkmJiB0YXJnLT5kdl9tYXhfd2lkdGggIT0gMAotCQkJJiYgd2lkZV9zcGVlZCA+PSBmYWxsYmFja19zcGVlZAotCQkJJiYgKHRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QgPD0gQUhEX0FTWU5DX1hGRVJfUEVSSU9ECi0JCQkgfHwgcGVyaW9kID49IEFIRF9BU1lOQ19YRkVSX1BFUklPRCkpIHsKLQotCQkJLyoKLQkJCSAqIFdlIGFyZSBuYXJyb3cuICBUcnkgZmFsbGluZyBiYWNrCi0JCQkgKiB0byB0aGUgbmV4dCB3aWRlIHNwZWVkIHdpdGggCi0JCQkgKiBhbGwgc3VwcG9ydGVkIHBwciBvcHRpb25zIHNldC4KLQkJCSAqLwotCQkJdGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kID0gcGVyaW9kKzE7Ci0JCQl3aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUOwotCQkJcGVyaW9kID0gdGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZDsKLQkJCXBwcl9vcHRpb25zID0gdGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zOwotCQl9IGVsc2UgewotCQkJLyogT25seSBuYXJyb3cgZmFsbGJhY2sgaXMgYWxsb3dlZC4gKi8KLQkJCXBlcmlvZCsrOwotCQkJcHByX29wdGlvbnMgPSB0YXJnLT5kdl9tYXhfcHByX29wdGlvbnM7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXR1cm4gKC0xKTsKLQl9Ci0Jb2Zmc2V0ID0gTUFYX09GRlNFVDsKLQlhaGRfZmluZF9zeW5jcmF0ZShhaGQsICZwZXJpb2QsICZwcHJfb3B0aW9ucywgQUhEX1NZTkNSQVRFX1BBQ0VEKTsKLQlhaGRfc2V0X3dpZHRoKGFoZCwgZGV2aW5mbywgd2lkdGgsIEFIRF9UUkFOU19HT0FMLCBGQUxTRSk7Ci0JaWYgKHBlcmlvZCA9PSAwKSB7Ci0JCXBlcmlvZCA9IDA7Ci0JCW9mZnNldCA9IDA7Ci0JCXBwcl9vcHRpb25zID0gMDsKLQkJaWYgKHdpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQpCi0JCQl0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2QgPSBBSERfQVNZTkNfWEZFUl9QRVJJT0Q7Ci0JCWVsc2UKLQkJCXRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QgPSBBSERfQVNZTkNfWEZFUl9QRVJJT0Q7Ci0JfQotCWFoZF9zZXRfc3luY3JhdGUoYWhkLCBkZXZpbmZvLCBwZXJpb2QsIG9mZnNldCwKLQkJCSBwcHJfb3B0aW9ucywgQUhEX1RSQU5TX0dPQUwsIEZBTFNFKTsKLQl0YXJnLT5kdl9sYXN0X3Bwcl9vcHRpb25zID0gcHByX29wdGlvbnM7Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9kdl90aW1lb3V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKLXsKLQlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7Ci0Jc3RydWN0CXNjYiAqc2NiOwotCXVfbG9uZwlmbGFnczsKLQotCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKTsKLQlhaGRfbG9jayhhaGQsICZmbGFncyk7Ci0KLSNpZmRlZiBBSERfREVCVUcKLQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJcHJpbnRmKCIlczogVGltZW91dCB3aGlsZSBkb2luZyBEViBjb21tYW5kICV4LlxuIiwKLQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+Y21uZFswXSk7Ci0JCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKLQl9Ci0jZW5kaWYKLQkKLQkvKgotCSAqIEd1YXJkIGFnYWluc3QgImRvbmUgcmFjZSIuICBObyBhY3Rpb24gaXMKLQkgKiByZXF1aXJlZCBpZiB3ZSBqdXN0IGNvbXBsZXRlZC4KLQkgKi8KLQlpZiAoKHNjYiA9IChzdHJ1Y3Qgc2NiICopY21kLT5ob3N0X3NjcmliYmxlKSA9PSBOVUxMKSB7Ci0JCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBDb21tYW5kIGhhcyBub3QgY29tcGxldGVkLiAgTWFyayB0aGlzCi0JICogU0NCIGFzIGhhdmluZyBmYWlsaW5nIHN0YXR1cyBwcmlvciB0bwotCSAqIHJlc2V0dGluZyB0aGUgYnVzLCBzbyB3ZSBnZXQgdGhlIGNvcnJlY3QKLQkgKiBlcnJvciBjb2RlLgotCSAqLwotCWlmICgoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkgIT0gMCkKLQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fQVVUT1NFTlNFX0ZBSUwpOwotCWVsc2UKLQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fQ01EX1RJTUVPVVQpOwotCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsIC8qaW5pdGlhdGUqL1RSVUUpOwotCi0JLyoKLQkgKiBBZGQgYSBtaW5pbWFsIGJ1cyBzZXR0bGUgZGVsYXkgZm9yIGRldmljZXMgdGhhdCBhcmUgc2xvdyB0bwotCSAqIHJlc3BvbmQgYWZ0ZXIgYnVzIHJlc2V0cy4KLQkgKi8KLQlhaGRfZnJlZXplX3NpbXEoYWhkKTsKLQlpbml0X3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKLQlhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyLmRhdGEgPSAodV9sb25nKWFoZDsKLQlhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAyOwotCWFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZnVuY3Rpb24gPQotCSAgICAoYWhkX2xpbnV4X2NhbGxiYWNrX3QgKilhaGRfcmVsZWFzZV9zaW1xOwotCWFkZF90aW1lcigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lcik7Ci0JaWYgKGFoZF9saW51eF9uZXh0X2RldmljZV90b19ydW4oYWhkKSAhPSBOVUxMKQotCQlhaGRfc2NoZWR1bGVfcnVucShhaGQpOwotCWFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKTsKLQlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9kdl9jb21wbGV0ZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCi17Ci0Jc3RydWN0IGFoZF9zb2Z0YyAqYWhkOwotCi0JYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpOwotCi0JLyogRGVsZXRlIHRoZSBEViB0aW1lciBiZWZvcmUgaXQgZ29lcyBvZmYhICovCi0Jc2NzaV9kZWxldGVfdGltZXIoY21kKTsKLQotI2lmZGVmIEFIRF9ERUJVRwotCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikKLQkJcHJpbnRmKCIlczolYzolZDogQ29tbWFuZCBjb21wbGV0ZWQsIHN0YXR1cz0gMHgleFxuIiwKLQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCi0JCSAgICAgICBjbWQtPnJlc3VsdCk7Ci0jZW5kaWYKLQotCS8qIFdha2UgdXAgdGhlIHN0YXRlIG1hY2hpbmUgKi8KLQl1cCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9jbWRfc2VtKTsKLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9nZW5lcmF0ZV9kdl9wYXR0ZXJuKHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKQotewotCXVpbnQxNl90IGI7Ci0JdV9pbnQJIGk7Ci0JdV9pbnQJIGo7Ci0KLQlpZiAodGFyZy0+ZHZfYnVmZmVyICE9IE5VTEwpCi0JCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7Ci0JdGFyZy0+ZHZfYnVmZmVyID0gbWFsbG9jKHRhcmctPmR2X2VjaG9fc2l6ZSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKLQlpZiAodGFyZy0+ZHZfYnVmZmVyMSAhPSBOVUxMKQotCQlmcmVlKHRhcmctPmR2X2J1ZmZlcjEsIE1fREVWQlVGKTsKLQl0YXJnLT5kdl9idWZmZXIxID0gbWFsbG9jKHRhcmctPmR2X2VjaG9fc2l6ZSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKLQotCWkgPSAwOwotCi0JYiA9IDB4MDAwMTsKLQlmb3IgKGogPSAwIDsgaSA8IHRhcmctPmR2X2VjaG9fc2l6ZTsgaisrKSB7Ci0JCWlmIChqIDwgMzIpIHsKLQkJCS8qCi0JCQkgKiAzMmJ5dGVzIG9mIHNlcXVlbnRpYWwgbnVtYmVycy4KLQkJCSAqLwotCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSBqICYgMHhmZjsKLQkJfSBlbHNlIGlmIChqIDwgNDgpIHsKLQkJCS8qCi0JCQkgKiAzMmJ5dGVzIG9mIHJlcGVhdGluZyAweDAwMDAsIDB4ZmZmZi4KLQkJCSAqLwotCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSAoaiAmIDB4MDIpID8gMHhmZiA6IDB4MDA7Ci0JCX0gZWxzZSBpZiAoaiA8IDY0KSB7Ci0JCQkvKgotCQkJICogMzJieXRlcyBvZiByZXBlYXRpbmcgMHg1NTU1LCAweGFhYWEuCi0JCQkgKi8KLQkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gKGogJiAweDAyKSA/IDB4YWEgOiAweDU1OwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIFJlbWFpbmluZyBidWZmZXIgaXMgZmlsbGVkIHdpdGggYSByZXBlYXRpbmcKLQkJCSAqIHBhdHRlciBvZjoKLQkJCSAqCi0JCQkgKgkgMHhmZmZmCi0JCQkgKgl+MHgwMDAxIDw8IHNoaWZ0ZWQgb25jZSBpbiBlYWNoIGxvb3AuCi0JCQkgKi8KLQkJCWlmIChqICYgMHgwMikgewotCQkJCWlmIChqICYgMHgwMSkgewotCQkJCQl0YXJnLT5kdl9idWZmZXJbaSsrXSA9IH4oYiA+PiA4KSAmIDB4ZmY7Ci0JCQkJCWIgPDw9IDE7Ci0JCQkJCWlmIChiID09IDB4MDAwMCkKLQkJCQkJCWIgPSAweDAwMDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSAofmIgJiAweGZmKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gMHhmZjsKLQkJCX0KLQkJfQotCX0KLX0KLQotc3RhdGljIHVfaW50Ci1haGRfbGludXhfdXNlcl90YWdkZXB0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKLXsKLQlzdGF0aWMgaW50IHdhcm5lZF91c2VyOwotCXVfaW50IHRhZ3M7Ci0KLQl0YWdzID0gMDsKLQlpZiAoKGFoZC0+dXNlcl9kaXNjZW5hYmxlICYgZGV2aW5mby0+dGFyZ2V0X21hc2spICE9IDApIHsKLQkJaWYgKGFoZC0+dW5pdCA+PSBOVU1fRUxFTUVOVFMoYWljNzl4eF90YWdfaW5mbykpIHsKLQotCQkJaWYgKHdhcm5lZF91c2VyID09IDApIHsKLQkJCQlwcmludGYoS0VSTl9XQVJOSU5HCi0iYWljNzl4eDogV0FSTklORzogSW5zdWZmaWNpZW50IHRhZ19pbmZvIGluc3RhbmNlc1xuIgotImFpYzc5eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuICBVc2luZyBkZWZhdWx0c1xuIgotImFpYzc5eHg6IFBsZWFzZSB1cGRhdGUgdGhlIGFpYzc5eHhfdGFnX2luZm8gYXJyYXkgaW5cbiIKLSJhaWM3OXh4OiB0aGUgYWljNzl4eF9vc20uYyBzb3VyY2UgZmlsZS5cbiIpOwotCQkJCXdhcm5lZF91c2VyKys7Ci0JCQl9Ci0JCQl0YWdzID0gQUhEX01BWF9RVUVVRTsKLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXJfdGFnX2luZm9fdCAqdGFnX2luZm87Ci0KLQkJCXRhZ19pbmZvID0gJmFpYzc5eHhfdGFnX2luZm9bYWhkLT51bml0XTsKLQkJCXRhZ3MgPSB0YWdfaW5mby0+dGFnX2NvbW1hbmRzW2RldmluZm8tPnRhcmdldF9vZmZzZXRdOwotCQkJaWYgKHRhZ3MgPiBBSERfTUFYX1FVRVVFKQotCQkJCXRhZ3MgPSBBSERfTUFYX1FVRVVFOwotCQl9Ci0JfQotCXJldHVybiAodGFncyk7Ci19Ci0KLXN0YXRpYyB1X2ludAotYWhkX2xpbnV4X3VzZXJfZHZfc2V0dGluZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0Jc3RhdGljIGludCB3YXJuZWRfdXNlcjsKLQlpbnQgZHY7Ci0KLQlpZiAoYWhkLT51bml0ID49IE5VTV9FTEVNRU5UUyhhaWM3OXh4X2R2X3NldHRpbmdzKSkgewotCi0JCWlmICh3YXJuZWRfdXNlciA9PSAwKSB7Ci0JCQlwcmludGYoS0VSTl9XQVJOSU5HCi0iYWljNzl4eDogV0FSTklORzogSW5zdWZmaWNpZW50IGR2IHNldHRpbmdzIGluc3RhbmNlc1xuIgotImFpYzc5eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuIFVzaW5nIGRlZmF1bHRzXG4iCi0iYWljNzl4eDogUGxlYXNlIHVwZGF0ZSB0aGUgYWljNzl4eF9kdl9zZXR0aW5ncyBhcnJheSBpbiIKLSJhaWM3OXh4OiB0aGUgYWljNzl4eF9vc20uYyBzb3VyY2UgZmlsZS5cbiIpOwotCQkJd2FybmVkX3VzZXIrKzsKLQkJfQotCQlkdiA9IC0xOwotCX0gZWxzZSB7Ci0KLQkJZHYgPSBhaWM3OXh4X2R2X3NldHRpbmdzW2FoZC0+dW5pdF07Ci0JfQotCi0JaWYgKGR2IDwgMCkgewotCQkvKgotCQkgKiBBcHBseSB0aGUgZGVmYXVsdC4KLQkJICovCi0JCWR2ID0gMTsKLQkJaWYgKGFoZC0+c2VlcF9jb25maWcgIT0gMCkKLQkJCWR2ID0gKGFoZC0+c2VlcF9jb25maWctPmJpb3NfY29udHJvbCAmIENGRU5BQkxFRFYpOwotCX0KLQlyZXR1cm4gKGR2KTsKLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9zZXR1cF91c2VyX3JkX3N0cm1fc2V0dGluZ3Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewotCXN0YXRpYwlpbnQgd2FybmVkX3VzZXI7Ci0JdV9pbnQJcmRfc3RybV9tYXNrOwotCXVfaW50CXRhcmdldF9pZDsKLQotCS8qCi0JICogSWYgd2UgaGF2ZSBzcGVjaWZpYyByZWFkIHN0cmVhbWluZyBpbmZvIGZvciB0aGlzIGNvbnRyb2xsZXIsCi0JICogYXBwbHkgaXQuICBPdGhlcndpc2UgdXNlIHRoZSBkZWZhdWx0cy4KLQkgKi8KLQkgaWYgKGFoZC0+dW5pdCA+PSBOVU1fRUxFTUVOVFMoYWljNzl4eF9yZF9zdHJtX2luZm8pKSB7Ci0KLQkJaWYgKHdhcm5lZF91c2VyID09IDApIHsKLQotCQkJcHJpbnRmKEtFUk5fV0FSTklORwotImFpYzc5eHg6IFdBUk5JTkc6IEluc3VmZmljaWVudCByZF9zdHJtIGluc3RhbmNlc1xuIgotImFpYzc5eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuIFVzaW5nIGRlZmF1bHRzXG4iCi0iYWljNzl4eDogUGxlYXNlIHVwZGF0ZSB0aGUgYWljNzl4eF9yZF9zdHJtX2luZm8gYXJyYXlcbiIKLSJhaWM3OXh4OiBpbiB0aGUgYWljNzl4eF9vc20uYyBzb3VyY2UgZmlsZS5cbiIpOwotCQkJd2FybmVkX3VzZXIrKzsKLQkJfQotCQlyZF9zdHJtX21hc2sgPSBBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk07Ci0JfSBlbHNlIHsKLQotCQlyZF9zdHJtX21hc2sgPSBhaWM3OXh4X3JkX3N0cm1faW5mb1thaGQtPnVuaXRdOwotCX0KLQlmb3IgKHRhcmdldF9pZCA9IDA7IHRhcmdldF9pZCA8IDE2OyB0YXJnZXRfaWQrKykgewotCQlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKLQkJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOwotCQlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOwotCi0JCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsICdBJywgYWhkLT5vdXJfaWQsCi0JCQkJCSAgICB0YXJnZXRfaWQsICZ0c3RhdGUpOwotCQlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBhaGQtPm91cl9pZCwgdGFyZ2V0X2lkLAotCQkJCSAgICBDQU1fTFVOX1dJTERDQVJELCAnQScsIFJPTEVfSU5JVElBVE9SKTsKLQkJdGluZm8tPnVzZXIucHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX1JEX1NUUk07Ci0JCWlmICgocmRfc3RybV9tYXNrICYgZGV2aW5mby50YXJnZXRfbWFzaykgIT0gMCkKLQkJCXRpbmZvLT51c2VyLnBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1JEX1NUUk07Ci0JfQotfQotCi0vKgotICogRGV0ZXJtaW5lcyB0aGUgcXVldWUgZGVwdGggZm9yIGEgZ2l2ZW4gZGV2aWNlLgotICovCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkgICAgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0CWFoZF9kZXZpbmZvIGRldmluZm87Ci0JdV9pbnQJdGFnczsKLQotCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sCi0JCQkgICAgYWhkLT5vdXJfaWQsCi0JCQkgICAgZGV2LT50YXJnZXQtPnRhcmdldCwgZGV2LT5sdW4sCi0JCQkgICAgZGV2LT50YXJnZXQtPmNoYW5uZWwgPT0gMCA/ICdBJyA6ICdCJywKLQkJCSAgICBST0xFX0lOSVRJQVRPUik7Ci0JdGFncyA9IGFoZF9saW51eF91c2VyX3RhZ2RlcHRoKGFoZCwgJmRldmluZm8pOwotCWlmICh0YWdzICE9IDAKLQkgJiYgZGV2LT5zY3NpX2RldmljZSAhPSBOVUxMCi0JICYmIGRldi0+c2NzaV9kZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQgIT0gMCkgewotCi0JCWFoZF9zZXRfdGFncyhhaGQsICZkZXZpbmZvLCBBSERfUVVFVUVfVEFHR0VEKTsKLQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7Ci0JCXByaW50ZigiVGFnZ2VkIFF1ZXVpbmcgZW5hYmxlZC4gIERlcHRoICVkXG4iLCB0YWdzKTsKLQl9IGVsc2UgewotCQlhaGRfc2V0X3RhZ3MoYWhkLCAmZGV2aW5mbywgQUhEX1FVRVVFX05PTkUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9ydW5fZGV2aWNlX3F1ZXVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QJIGFoZF9jbWQgKmFjbWQ7Ci0Jc3RydWN0CSBzY3NpX2NtbmQgKmNtZDsKLQlzdHJ1Y3QJIHNjYiAqc2NiOwotCXN0cnVjdAkgaGFyZHdhcmVfc2NiICpoc2NiOwotCXN0cnVjdAkgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87Ci0Jc3RydWN0CSBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7Ci0JdV9pbnQJIGNvbF9pZHg7Ci0JdWludDE2X3QgbWFzazsKLQotCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfT05fUlVOX0xJU1QpICE9IDApCi0JCXBhbmljKCJydW5uaW5nIGRldmljZSBvbiBydW4gbGlzdCIpOwotCi0Jd2hpbGUgKChhY21kID0gVEFJTFFfRklSU1QoJmRldi0+YnVzeXEpKSAhPSBOVUxMCi0JICAgICYmIGRldi0+b3BlbmluZ3MgPiAwICYmIGRldi0+cWZyb3plbiA9PSAwKSB7Ci0KLQkJLyoKLQkJICogU2NoZWR1bGUgdXMgdG8gcnVuIGxhdGVyLiAgVGhlIG9ubHkgcmVhc29uIHdlIGFyZSBub3QKLQkJICogcnVubmluZyBpcyBiZWNhdXNlIHRoZSB3aG9sZSBjb250cm9sbGVyIFEgaXMgZnJvemVuLgotCQkgKi8KLQkJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiAhPSAwCi0JCSAmJiBBSERfRFZfU0lNUV9GUk9aRU4oYWhkKSA9PSAwKSB7Ci0KLQkJCVRBSUxRX0lOU0VSVF9UQUlMKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLAotCQkJCQkgIGRldiwgbGlua3MpOwotCQkJZGV2LT5mbGFncyB8PSBBSERfREVWX09OX1JVTl9MSVNUOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY21kID0gJmFjbWRfc2NzaV9jbWQoYWNtZCk7Ci0KLQkJLyoKLQkJICogR2V0IGFuIHNjYiB0byB1c2UuCi0JCSAqLwotCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAotCQkJCQkgICAgY21kLT5kZXZpY2UtPmlkLCAmdHN0YXRlKTsKLQkJaWYgKChkZXYtPmZsYWdzICYgKEFIRF9ERVZfUV9UQUdHRUR8QUhEX0RFVl9RX0JBU0lDKSkgPT0gMAotCQkgfHwgKHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSAhPSAwKSB7Ci0JCQljb2xfaWR4ID0gQUhEX05FVkVSX0NPTF9JRFg7Ci0JCX0gZWxzZSB7Ci0JCQljb2xfaWR4ID0gQUhEX0JVSUxEX0NPTF9JRFgoY21kLT5kZXZpY2UtPmlkLAotCQkJCQkJICAgIGNtZC0+ZGV2aWNlLT5sdW4pOwotCQl9Ci0JCWlmICgoc2NiID0gYWhkX2dldF9zY2IoYWhkLCBjb2xfaWR4KSkgPT0gTlVMTCkgewotCQkJVEFJTFFfSU5TRVJUX1RBSUwoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEsCi0JCQkJCSBkZXYsIGxpbmtzKTsKLQkJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9PTl9SVU5fTElTVDsKLQkJCWFoZC0+ZmxhZ3MgfD0gQUhEX1JFU09VUkNFX1NIT1JUQUdFOwotCQkJcmV0dXJuOwotCQl9Ci0JCVRBSUxRX1JFTU9WRSgmZGV2LT5idXN5cSwgYWNtZCwgYWNtZF9saW5rcy50cWUpOwotCQlzY2ItPmlvX2N0eCA9IGNtZDsKLQkJc2NiLT5wbGF0Zm9ybV9kYXRhLT5kZXYgPSBkZXY7Ci0JCWhzY2IgPSBzY2ItPmhzY2I7Ci0JCWNtZC0+aG9zdF9zY3JpYmJsZSA9IChjaGFyICopc2NiOwotCi0JCS8qCi0JCSAqIEZpbGwgb3V0IGJhc2ljcyBvZiB0aGUgSFNDQi4KLQkJICovCi0JCWhzY2ItPmNvbnRyb2wgPSAwOwotCQloc2NiLT5zY3NpaWQgPSBCVUlMRF9TQ1NJSUQoYWhkLCBjbWQpOwotCQloc2NiLT5sdW4gPSBjbWQtPmRldmljZS0+bHVuOwotCQlzY2ItPmhzY2ItPnRhc2tfbWFuYWdlbWVudCA9IDA7Ci0JCW1hc2sgPSBTQ0JfR0VUX1RBUkdFVF9NQVNLKGFoZCwgc2NiKTsKLQotCQlpZiAoKGFoZC0+dXNlcl9kaXNjZW5hYmxlICYgbWFzaykgIT0gMCkKLQkJCWhzY2ItPmNvbnRyb2wgfD0gRElTQ0VOQjsKLQotCSAJaWYgKEFIRF9EVl9DTUQoY21kKSAhPSAwKQotCQkJc2NiLT5mbGFncyB8PSBTQ0JfU0lMRU5UOwotCi0JCWlmICgodGluZm8tPmN1cnIucHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApCi0JCQlzY2ItPmZsYWdzIHw9IFNDQl9QQUNLRVRJWkVEOwotCi0JCWlmICgodHN0YXRlLT5hdXRvX25lZ290aWF0ZSAmIG1hc2spICE9IDApIHsKLQkJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FVVE9fTkVHT1RJQVRFOwotCQkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7Ci0JCX0KLQotCQlpZiAoKGRldi0+ZmxhZ3MgJiAoQUhEX0RFVl9RX1RBR0dFRHxBSERfREVWX1FfQkFTSUMpKSAhPSAwKSB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCQkJaW50CW1zZ19ieXRlczsKLQkJCXVpbnQ4X3QgdGFnX21zZ3NbMl07Ci0KLQkJCW1zZ19ieXRlcyA9IHNjc2lfcG9wdWxhdGVfdGFnX21zZyhjbWQsIHRhZ19tc2dzKTsKLQkJCWlmIChtc2dfYnl0ZXMgJiYgdGFnX21zZ3NbMF0gIT0gTVNHX1NJTVBMRV9UQVNLKSB7Ci0JCQkJaHNjYi0+Y29udHJvbCB8PSB0YWdfbXNnc1swXTsKLQkJCQlpZiAodGFnX21zZ3NbMF0gPT0gTVNHX09SREVSRURfVEFTSykKLQkJCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOwotCQkJfSBlbHNlCi0jZW5kaWYKLQkJCWlmIChkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9PSBBSERfT1RBR19USFJFU0gKLQkJCSAmJiAoZGV2LT5mbGFncyAmIEFIRF9ERVZfUV9UQUdHRUQpICE9IDApIHsKLQkJCQloc2NiLT5jb250cm9sIHw9IE1TR19PUkRFUkVEX1RBU0s7Ci0JCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQloc2NiLT5jb250cm9sIHw9IE1TR19TSU1QTEVfVEFTSzsKLQkJCX0KLQkJfQotCi0JCWhzY2ItPmNkYl9sZW4gPSBjbWQtPmNtZF9sZW47Ci0JCW1lbWNweShoc2NiLT5zaGFyZWRfZGF0YS5pZGF0YS5jZGIsIGNtZC0+Y21uZCwgaHNjYi0+Y2RiX2xlbik7Ci0KLQkJc2NiLT5zZ19jb3VudCA9IDA7Ci0JCWFoZF9zZXRfcmVzaWR1YWwoc2NiLCAwKTsKLQkJYWhkX3NldF9zZW5zZV9yZXNpZHVhbChzY2IsIDApOwotCQlpZiAoY21kLT51c2Vfc2cgIT0gMCkgewotCQkJdm9pZAkqc2c7Ci0JCQlzdHJ1Y3QJIHNjYXR0ZXJsaXN0ICpjdXJfc2VnOwotCQkJdV9pbnQJIG5zZWc7Ci0JCQlpbnQJIGRpcjsKLQotCQkJY3VyX3NlZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOwotCQkJZGlyID0gY21kLT5zY19kYXRhX2RpcmVjdGlvbjsKLQkJCW5zZWcgPSBwY2lfbWFwX3NnKGFoZC0+ZGV2X3NvZnRjLCBjdXJfc2VnLAotCQkJCQkgIGNtZC0+dXNlX3NnLCBkaXIpOwotCQkJc2NiLT5wbGF0Zm9ybV9kYXRhLT54ZmVyX2xlbiA9IDA7Ci0JCQlmb3IgKHNnID0gc2NiLT5zZ19saXN0OyBuc2VnID4gMDsgbnNlZy0tLCBjdXJfc2VnKyspIHsKLQkJCQlkbWFfYWRkcl90IGFkZHI7Ci0JCQkJYnVzX3NpemVfdCBsZW47Ci0KLQkJCQlhZGRyID0gc2dfZG1hX2FkZHJlc3MoY3VyX3NlZyk7Ci0JCQkJbGVuID0gc2dfZG1hX2xlbihjdXJfc2VnKTsKLQkJCQlzY2ItPnBsYXRmb3JtX2RhdGEtPnhmZXJfbGVuICs9IGxlbjsKLQkJCQlzZyA9IGFoZF9zZ19zZXR1cChhaGQsIHNjYiwgc2csIGFkZHIsIGxlbiwKLQkJCQkJCSAgLypsYXN0Ki9uc2VnID09IDEpOwotCQkJfQotCQl9IGVsc2UgaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuICE9IDApIHsKLQkJCXZvaWQgKnNnOwotCQkJZG1hX2FkZHJfdCBhZGRyOwotCQkJaW50IGRpcjsKLQotCQkJc2cgPSBzY2ItPnNnX2xpc3Q7Ci0JCQlkaXIgPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOwotCQkJYWRkciA9IHBjaV9tYXBfc2luZ2xlKGFoZC0+ZGV2X3NvZnRjLAotCQkJCQkgICAgICBjbWQtPnJlcXVlc3RfYnVmZmVyLAotCQkJCQkgICAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgZGlyKTsKLQkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+eGZlcl9sZW4gPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKLQkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+YnVmX2J1c2FkZHIgPSBhZGRyOwotCQkJc2cgPSBhaGRfc2dfc2V0dXAoYWhkLCBzY2IsIHNnLCBhZGRyLAotCQkJCQkgIGNtZC0+cmVxdWVzdF9idWZmbGVuLCAvKmxhc3QqL1RSVUUpOwotCQl9Ci0KLQkJTElTVF9JTlNFUlRfSEVBRCgmYWhkLT5wZW5kaW5nX3NjYnMsIHNjYiwgcGVuZGluZ19saW5rcyk7Ci0JCWRldi0+b3BlbmluZ3MtLTsKLQkJZGV2LT5hY3RpdmUrKzsKLQkJZGV2LT5jb21tYW5kc19pc3N1ZWQrKzsKLQotCQkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50aW5nIGJ1Y2tldCBhbmQgZHVtcCBpZiBuZWVkZWQgKi8KLQkJaWYgKGRldi0+dGFyZ2V0LT5jbWRzX3NpbmNlX2Vycm9yKSB7Ci0JCQlkZXYtPnRhcmdldC0+Y21kc19zaW5jZV9lcnJvcisrOwotCQkJaWYgKGRldi0+dGFyZ2V0LT5jbWRzX3NpbmNlX2Vycm9yID4KLQkJCSAgICBBSERfTElOVVhfRVJSX1RIUkVTSCkKLQkJCQlkZXYtPnRhcmdldC0+Y21kc19zaW5jZV9lcnJvciA9IDA7Ci0JCX0KLQotCQlpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX1BFUklPRElDX09UQUcpICE9IDApCi0JCQlkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZysrOwotCQlzY2ItPmZsYWdzIHw9IFNDQl9BQ1RJVkU7Ci0JCWFoZF9xdWV1ZV9zY2IoYWhkLCBzY2IpOwotCX0KLX0KLQotLyoKLSAqIFNDU0kgY29udHJvbGxlciBpbnRlcnJ1cHQgaGFuZGxlci4KLSAqLwotaXJxcmV0dXJuX3QKLWFoZF9saW51eF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCi17Ci0Jc3RydWN0CWFoZF9zb2Z0YyAqYWhkOwotCXVfbG9uZwlmbGFnczsKLQlpbnQJb3VyczsKLQotCWFoZCA9IChzdHJ1Y3QgYWhkX3NvZnRjICopIGRldl9pZDsKLQlhaGRfbG9jayhhaGQsICZmbGFncyk7IAotCW91cnMgPSBhaGRfaW50cihhaGQpOwotCWlmIChhaGRfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKGFoZCkgIT0gTlVMTCkKLQkJYWhkX3NjaGVkdWxlX3J1bnEoYWhkKTsKLQlhaGRfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoZCk7Ci0JYWhkX3VubG9jayhhaGQsICZmbGFncyk7Ci0JcmV0dXJuIElSUV9SRVRWQUwob3Vycyk7Ci19Ci0KLXZvaWQKLWFoZF9wbGF0Zm9ybV9mbHVzaHdvcmsoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewotCi0Jd2hpbGUgKGFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKSAhPSBOVUxMKQotCQk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCoKLWFoZF9saW51eF9hbGxvY190YXJnZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBjaGFubmVsLCB1X2ludCB0YXJnZXQpCi17Ci0Jc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmc7Ci0KLQl0YXJnID0gbWFsbG9jKHNpemVvZigqdGFyZyksIE1fREVWQlVGLCBNX05PV0FJVCk7Ci0JaWYgKHRhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIChOVUxMKTsKLQltZW1zZXQodGFyZywgMCwgc2l6ZW9mKCp0YXJnKSk7Ci0JdGFyZy0+Y2hhbm5lbCA9IGNoYW5uZWw7Ci0JdGFyZy0+dGFyZ2V0ID0gdGFyZ2V0OwotCXRhcmctPmFoZCA9IGFoZDsKLQl0YXJnLT5mbGFncyA9IEFIRF9EVl9SRVFVSVJFRDsKLQlhaGQtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0XSA9IHRhcmc7Ci0JcmV0dXJuICh0YXJnKTsKLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9mcmVlX3RhcmdldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKQoteworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBhaGRfc29mdGMgKmFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopc2hvc3QtPmhvc3RkYXRhKTsKIAlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKLQlzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKKwkJCSAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOworCWFoZF9zZXRfd2lkdGgoYWhkLCAmZGV2aW5mbywgd2lkdGgsIEFIRF9UUkFOU19HT0FMLCBGQUxTRSk7CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zZXRfcGVyaW9kKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IHBlcmlvZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKXNob3N0LT5ob3N0ZGF0YSk7CiAJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKLQl1X2ludCBvdXJfaWQ7Ci0JdV9pbnQgdGFyZ2V0X29mZnNldDsKLQljaGFyIGNoYW5uZWw7Ci0KLQkvKgotCSAqIEZvcmNlIGEgbmVnb3RpYXRpb24gdG8gYXN5bmMvbmFycm93IG9uIGFueQotCSAqIGZ1dHVyZSBjb21tYW5kIHRvIHRoaXMgZGV2aWNlIHVubGVzcyBhIGJ1cwotCSAqIHJlc2V0IG9jY3VycyBiZXR3ZWVuIG5vdyBhbmQgdGhhdCBjb21tYW5kLgotCSAqLwotCWNoYW5uZWwgPSAnQScgKyB0YXJnLT5jaGFubmVsOwotCW91cl9pZCA9IGFoZC0+b3VyX2lkOwotCXRhcmdldF9vZmZzZXQgPSB0YXJnLT50YXJnZXQ7Ci0JdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgY2hhbm5lbCwgb3VyX2lkLAotCQkJCSAgICB0YXJnLT50YXJnZXQsICZ0c3RhdGUpOwotCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIG91cl9pZCwgdGFyZy0+dGFyZ2V0LCBDQU1fTFVOX1dJTERDQVJELAotCQkJICAgIGNoYW5uZWwsIFJPTEVfSU5JVElBVE9SKTsKLQlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgJmRldmluZm8sIDAsIDAsIDAsCi0JCQkgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7Ci0JYWhkX3NldF93aWR0aChhaGQsICZkZXZpbmZvLCBNU0dfRVhUX1dEVFJfQlVTXzhfQklULAotCQkgICAgICBBSERfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKLQlhaGRfdXBkYXRlX25lZ19yZXF1ZXN0KGFoZCwgJmRldmluZm8sIHRzdGF0ZSwgdGluZm8sIEFIRF9ORUdfQUxXQVlTKTsKLSAJYWhkLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW3RhcmdldF9vZmZzZXRdID0gTlVMTDsKLQlpZiAodGFyZy0+aW5xX2RhdGEgIT0gTlVMTCkKLQkJZnJlZSh0YXJnLT5pbnFfZGF0YSwgTV9ERVZCVUYpOwotCWlmICh0YXJnLT5kdl9idWZmZXIgIT0gTlVMTCkKLQkJZnJlZSh0YXJnLT5kdl9idWZmZXIsIE1fREVWQlVGKTsKLQlpZiAodGFyZy0+ZHZfYnVmZmVyMSAhPSBOVUxMKQotCQlmcmVlKHRhcmctPmR2X2J1ZmZlcjEsIE1fREVWQlVGKTsKLQlmcmVlKHRhcmcsIE1fREVWQlVGKTsKLX0KLQotc3RhdGljIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKgotYWhkX2xpbnV4X2FsbG9jX2RldmljZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCSBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZywgdV9pbnQgbHVuKQotewotCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7Ci0KLQlkZXYgPSBtYWxsb2Moc2l6ZW9mKCpkZXYpLCBNX0RFVkJVRywgTV9OT1dBSVQpOwotCWlmIChkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIChOVUxMKTsKLQltZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOwotCWluaXRfdGltZXIoJmRldi0+dGltZXIpOwotCVRBSUxRX0lOSVQoJmRldi0+YnVzeXEpOwotCWRldi0+ZmxhZ3MgPSBBSERfREVWX1VOQ09ORklHVVJFRDsKLQlkZXYtPmx1biA9IGx1bjsKLQlkZXYtPnRhcmdldCA9IHRhcmc7Ci0KLQkvKgotCSAqIFdlIHN0YXJ0IG91dCBsaWZlIHVzaW5nIHVudGFnZ2VkCi0JICogdHJhbnNhY3Rpb25zIG9mIHdoaWNoIHdlIGFsbG93IG9uZS4KLQkgKi8KLQlkZXYtPm9wZW5pbmdzID0gMTsKLQotCS8qCi0JICogU2V0IG1heHRhZ3MgdG8gMC4gIFRoaXMgd2lsbCBiZSBjaGFuZ2VkIGlmIHdlCi0JICogbGF0ZXIgZGV0ZXJtaW5lIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aAotCSAqIGEgdGFnZ2VkIHF1ZXVpbmcgY2FwYWJsZSBkZXZpY2UuCi0JICovCi0JZGV2LT5tYXh0YWdzID0gMDsKLQkKLQl0YXJnLT5yZWZjb3VudCsrOwotCXRhcmctPmRldmljZXNbbHVuXSA9IGRldjsKLQlyZXR1cm4gKGRldik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZnJlZV9kZXZpY2Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnOwotCi0JZGVsX3RpbWVyKCZkZXYtPnRpbWVyKTsKLQl0YXJnID0gZGV2LT50YXJnZXQ7Ci0JdGFyZy0+ZGV2aWNlc1tkZXYtPmx1bl0gPSBOVUxMOwotCWZyZWUoZGV2LCBNX0RFVkJVRik7Ci0JdGFyZy0+cmVmY291bnQtLTsKLQlpZiAodGFyZy0+cmVmY291bnQgPT0gMAotCSAmJiAodGFyZy0+ZmxhZ3MgJiBBSERfRFZfUkVRVUlSRUQpID09IDApCi0JCWFoZF9saW51eF9mcmVlX3RhcmdldChhaGQsIHRhcmcpOwotfQotCi12b2lkCi1haGRfc2VuZF9hc3luYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGNoYXIgY2hhbm5lbCwKLQkgICAgICAgdV9pbnQgdGFyZ2V0LCB1X2ludCBsdW4sIGFjX2NvZGUgY29kZSwgdm9pZCAqYXJnKQotewotCXN3aXRjaCAoY29kZSkgewotCWNhc2UgQUNfVFJBTlNGRVJfTkVHOgotCXsKLQkJY2hhcglidWZbODBdOwotCQlzdHJ1Y3QJYWhkX2xpbnV4X3RhcmdldCAqdGFyZzsKLQkJc3RydWN0CWluZm9fc3RyIGluZm87Ci0JCXN0cnVjdAlhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKLQkJc3RydWN0CWFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKLQotCQlpbmZvLmJ1ZmZlciA9IGJ1ZjsKLQkJaW5mby5sZW5ndGggPSBzaXplb2YoYnVmKTsKLQkJaW5mby5vZmZzZXQgPSAwOwotCQlpbmZvLnBvcyA9IDA7Ci0JCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsIGNoYW5uZWwsIGFoZC0+b3VyX2lkLAotCQkJCQkgICAgdGFyZ2V0LCAmdHN0YXRlKTsKLQotCQkvKgotCQkgKiBEb24ndCBib3RoZXIgcmVwb3J0aW5nIHJlc3VsdHMgd2hpbGUKLQkJICogbmVnb3RpYXRpb25zIGFyZSBzdGlsbCBwZW5kaW5nLgotCQkgKi8KLQkJaWYgKHRpbmZvLT5jdXJyLnBlcmlvZCAhPSB0aW5mby0+Z29hbC5wZXJpb2QKLQkJIHx8IHRpbmZvLT5jdXJyLndpZHRoICE9IHRpbmZvLT5nb2FsLndpZHRoCi0JCSB8fCB0aW5mby0+Y3Vyci5vZmZzZXQgIT0gdGluZm8tPmdvYWwub2Zmc2V0Ci0JCSB8fCB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAhPSB0aW5mby0+Z29hbC5wcHJfb3B0aW9ucykKLQkJCWlmIChib290dmVyYm9zZSA9PSAwKQotCQkJCWJyZWFrOwotCi0JCS8qCi0JCSAqIERvbid0IGJvdGhlciByZXBvcnRpbmcgcmVzdWx0cyB0aGF0Ci0JCSAqIGFyZSBpZGVudGljYWwgdG8gdGhvc2UgbGFzdCByZXBvcnRlZC4KLQkJICovCi0JCXRhcmcgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0XTsKLQkJaWYgKHRhcmcgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQlpZiAodGluZm8tPmN1cnIucGVyaW9kID09IHRhcmctPmxhc3RfdGluZm8ucGVyaW9kCi0JCSAmJiB0aW5mby0+Y3Vyci53aWR0aCA9PSB0YXJnLT5sYXN0X3RpbmZvLndpZHRoCi0JCSAmJiB0aW5mby0+Y3Vyci5vZmZzZXQgPT0gdGFyZy0+bGFzdF90aW5mby5vZmZzZXQKLQkJICYmIHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zID09IHRhcmctPmxhc3RfdGluZm8ucHByX29wdGlvbnMpCi0JCQlpZiAoYm9vdHZlcmJvc2UgPT0gMCkKLQkJCQlicmVhazsKLQotCQl0YXJnLT5sYXN0X3RpbmZvLnBlcmlvZCA9IHRpbmZvLT5jdXJyLnBlcmlvZDsKLQkJdGFyZy0+bGFzdF90aW5mby53aWR0aCA9IHRpbmZvLT5jdXJyLndpZHRoOwotCQl0YXJnLT5sYXN0X3RpbmZvLm9mZnNldCA9IHRpbmZvLT5jdXJyLm9mZnNldDsKLQkJdGFyZy0+bGFzdF90aW5mby5wcHJfb3B0aW9ucyA9IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zOwotCi0JCXByaW50ZigiKCVzOiVjOiIsIGFoZF9uYW1lKGFoZCksIGNoYW5uZWwpOwotCQlpZiAodGFyZ2V0ID09IENBTV9UQVJHRVRfV0lMRENBUkQpCi0JCQlwcmludGYoIiopOiAiKTsKLQkJZWxzZQotCQkJcHJpbnRmKCIlZCk6ICIsIHRhcmdldCk7Ci0JCWFoZF9mb3JtYXRfdHJhbnNpbmZvKCZpbmZvLCAmdGluZm8tPmN1cnIpOwotCQlpZiAoaW5mby5wb3MgPCBpbmZvLmxlbmd0aCkKLQkJCSppbmZvLmJ1ZmZlciA9ICdcMCc7Ci0JCWVsc2UKLQkJCWJ1ZltpbmZvLmxlbmd0aCAtIDFdID0gJ1wwJzsKLQkJcHJpbnRmKCIlcyIsIGJ1Zik7Ci0JCWJyZWFrOwotCX0KLSAgICAgICAgY2FzZSBBQ19TRU5UX0JEUjoKLQl7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCQlXQVJOX09OKGx1biAhPSBDQU1fTFVOX1dJTERDQVJEKTsKLQkJc2NzaV9yZXBvcnRfZGV2aWNlX3Jlc2V0KGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCwKLQkJCQkJIGNoYW5uZWwgLSAnQScsIHRhcmdldCk7Ci0jZWxzZQotCQlTY3NpX0RldmljZSAqc2NzaV9kZXY7Ci0KLQkJLyoKLQkJICogRmluZCB0aGUgU0NTSSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLQkJICogcmVxdWVzdCBhbmQgaW5kaWNhdGUgdGhhdCBhIFVBIGlzIGV4cGVjdGVkLgotCQkgKi8KLQkJZm9yIChzY3NpX2RldiA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdC0+aG9zdF9xdWV1ZTsKLQkJICAgICBzY3NpX2RldiAhPSBOVUxMOyBzY3NpX2RldiA9IHNjc2lfZGV2LT5uZXh0KSB7Ci0JCQlpZiAoY2hhbm5lbCAtICdBJyA9PSBzY3NpX2Rldi0+Y2hhbm5lbAotCQkJICYmIHRhcmdldCA9PSBzY3NpX2Rldi0+aWQKLQkJCSAmJiAobHVuID09IENBTV9MVU5fV0lMRENBUkQKLQkJCSAgfHwgbHVuID09IHNjc2lfZGV2LT5sdW4pKSB7Ci0JCQkJc2NzaV9kZXYtPndhc19yZXNldCA9IDE7Ci0JCQkJc2NzaV9kZXYtPmV4cGVjdGluZ19jY191YSA9IDE7Ci0JCQl9Ci0JCX0KLSNlbmRpZgotCQlicmVhazsKLQl9Ci0gICAgICAgIGNhc2UgQUNfQlVTX1JFU0VUOgotCQlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0ICE9IE5VTEwpIHsKLQkJCXNjc2lfcmVwb3J0X2J1c19yZXNldChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QsCi0JCQkJCSAgICAgIGNoYW5uZWwgLSAnQScpOwotCQl9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcGFuaWMoImFoZF9zZW5kX2FzeW5jOiBVbmV4cGVjdGVkIGFzeW5jIGV2ZW50Iik7Ci0gICAgICAgIH0KLX0KLQotLyoKLSAqIENhbGxzIHRoZSBoaWdoZXIgbGV2ZWwgc2NzaSBkb25lIGZ1bmN0aW9uIGFuZCBmcmVlcyB0aGUgc2NiLgotICovCi12b2lkCi1haGRfZG9uZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKLXsKLQlTY3NpX0NtbmQgKmNtZDsKLQlzdHJ1Y3QJICBhaGRfbGludXhfZGV2aWNlICpkZXY7Ci0KLQlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfQUNUSVZFKSA9PSAwKSB7Ci0JCXByaW50ZigiU0NCICVkIGRvbmUnZCB0d2ljZVxuIiwgU0NCX0dFVF9UQUcoc2NiKSk7Ci0JCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKLQkJcGFuaWMoIlN0b3BwaW5nIGZvciBzYWZldHkiKTsKLQl9Ci0JTElTVF9SRU1PVkUoc2NiLCBwZW5kaW5nX2xpbmtzKTsKLQljbWQgPSBzY2ItPmlvX2N0eDsKLQlkZXYgPSBzY2ItPnBsYXRmb3JtX2RhdGEtPmRldjsKLQlkZXYtPmFjdGl2ZS0tOwotCWRldi0+b3BlbmluZ3MrKzsKLQlpZiAoKGNtZC0+cmVzdWx0ICYgKENBTV9ERVZfUUZSWk4gPDwgMTYpKSAhPSAwKSB7Ci0JCWNtZC0+cmVzdWx0ICY9IH4oQ0FNX0RFVl9RRlJaTiA8PCAxNik7Ci0JCWRldi0+cWZyb3plbi0tOwotCX0KLQlhaGRfbGludXhfdW5tYXBfc2NiKGFoZCwgc2NiKTsKLQotCS8qCi0JICogR3VhcmQgYWdhaW5zdCBzdGFsZSBzZW5zZSBkYXRhLgotCSAqIFRoZSBMaW51eCBtaWQtbGF5ZXIgYXNzdW1lcyB0aGF0IHNlbnNlCi0JICogd2FzIHJldHJpZXZlZCBhbnl0aW1lIHRoZSBmaXJzdCBieXRlIG9mCi0JICogdGhlIHNlbnNlIGJ1ZmZlciBsb29rcyAic2FuZSIuCi0JICovCi0JY21kLT5zZW5zZV9idWZmZXJbMF0gPSAwOwotCWlmIChhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9SRVFfSU5QUk9HKSB7Ci0JCXVpbnQzMl90IGFtb3VudF94ZmVycmVkOwotCi0JCWFtb3VudF94ZmVycmVkID0KLQkJICAgIGFoZF9nZXRfdHJhbnNmZXJfbGVuZ3RoKHNjYikgLSBhaGRfZ2V0X3Jlc2lkdWFsKHNjYik7Ci0JCWlmICgoc2NiLT5mbGFncyAmIFNDQl9UUkFOU01JU1NJT05fRVJST1IpICE9IDApIHsKLSNpZmRlZiBBSERfREVCVUcKLQkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUlTQykgIT0gMCkgewotCQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJCQlwcmludGYoIlNldCBDQU1fVU5DT1JfUEFSSVRZXG4iKTsKLQkJCX0KLSNlbmRpZgotCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fVU5DT1JfUEFSSVRZKTsKLSNpZmRlZiBBSERfUkVQT1JUX1VOREVSRkxPV1MKLQkJLyoKLQkJICogVGhpcyBjb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYXMgc29tZQotCQkgKiBjbGllbnRzIG9mIHRoZSBTQ1NJIHN5c3RlbSBkbyBub3QgcHJvcGVybHkKLQkJICogaW5pdGlhbGl6ZSB0aGUgdW5kZXJmbG93IHBhcmFtZXRlci4gIFRoaXMKLQkJICogcmVzdWx0cyBpbiBzcHVyaW91cyB0ZXJtaW5hdGlvbiBvZiBjb21tYW5kcwotCQkgKiB0aGF0IGNvbXBsZXRlIGFzIGV4cGVjdGVkIChlLmcuIHVuZGVyZmxvdyBpcwotCQkgKiBhbGxvd2VkIGFzIGNvbW1hbmQgY2FuIHJldHVybiB2YXJpYWJsZSBhbW91bnRzCi0JCSAqIG9mIGRhdGEuCi0JCSAqLwotCQl9IGVsc2UgaWYgKGFtb3VudF94ZmVycmVkIDwgc2NiLT5pb19jdHgtPnVuZGVyZmxvdykgewotCQkJdV9pbnQgaTsKLQotCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOwotCQkJcHJpbnRmKCJDREI6Iik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5pb19jdHgtPmNtZF9sZW47IGkrKykKLQkJCQlwcmludGYoIiAweCV4Iiwgc2NiLT5pb19jdHgtPmNtbmRbaV0pOwotCQkJcHJpbnRmKCJcbiIpOwotCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOwotCQkJcHJpbnRmKCJTYXcgdW5kZXJmbG93ICglbGQgb2YgJWxkIGJ5dGVzKS4gIgotCQkJICAgICAgICJUcmVhdGVkIGFzIGVycm9yXG4iLAotCQkJCWFoZF9nZXRfcmVzaWR1YWwoc2NiKSwKLQkJCQlhaGRfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpKTsKLQkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX0RBVEFfUlVOX0VSUik7Ci0jZW5kaWYKLQkJfSBlbHNlIHsKLQkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1JFUV9DTVApOwotCQl9Ci0JfSBlbHNlIGlmIChhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9TQ1NJX1NUQVRVU19FUlJPUikgewotCQlhaGRfbGludXhfaGFuZGxlX3Njc2lfc3RhdHVzKGFoZCwgZGV2LCBzY2IpOwotCX0gZWxzZSBpZiAoYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fU0VMX1RJTUVPVVQpIHsKLQkJZGV2LT5mbGFncyB8PSBBSERfREVWX1VOQ09ORklHVVJFRDsKLQkJaWYgKEFIRF9EVl9DTUQoY21kKSA9PSBGQUxTRSkKLQkJCWRldi0+dGFyZ2V0LT5mbGFncyAmPSB+QUhEX0RWX1JFUVVJUkVEOwotCX0KLQkvKgotCSAqIFN0YXJ0IERWIGZvciBkZXZpY2VzIHRoYXQgcmVxdWlyZSBpdCBhc3N1bWluZyB0aGUgZmlyc3QgY29tbWFuZAotCSAqIHNlbnQgZG9lcyBub3QgcmVzdWx0IGluIGEgc2VsZWN0aW9uIHRpbWVvdXQuCi0JICovCi0JaWYgKGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgIT0gQ0FNX1NFTF9USU1FT1VUCi0JICYmIChkZXYtPnRhcmdldC0+ZmxhZ3MgJiBBSERfRFZfUkVRVUlSRUQpICE9IDApCi0JCWFoZF9saW51eF9zdGFydF9kdihhaGQpOwotCi0JaWYgKGRldi0+b3BlbmluZ3MgPT0gMQotCSAmJiBhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9SRVFfQ01QCi0JICYmIGFoZF9nZXRfc2NzaV9zdGF0dXMoc2NiKSAhPSBTQ1NJX1NUQVRVU19RVUVVRV9GVUxMKQotCQlkZXYtPnRhZ19zdWNjZXNzX2NvdW50Kys7Ci0JLyoKLQkgKiBTb21lIGRldmljZXMgZGVhbCB3aXRoIHRlbXBvcmFyeSBpbnRlcm5hbCByZXNvdXJjZQotCSAqIHNob3J0YWdlcyBieSByZXR1cm5pbmcgcXVldWUgZnVsbC4gIFdoZW4gdGhlIHF1ZXVlCi0JICogZnVsbCBvY2N1cnJzLCB3ZSB0aHJvdHRsZSBiYWNrLiAgU2xvd2x5IHRyeSB0byBnZXQKLQkgKiBiYWNrIHRvIG91ciBwcmV2aW91cyBxdWV1ZSBkZXB0aC4KLQkgKi8KLQlpZiAoKGRldi0+b3BlbmluZ3MgKyBkZXYtPmFjdGl2ZSkgPCBkZXYtPm1heHRhZ3MKLQkgJiYgZGV2LT50YWdfc3VjY2Vzc19jb3VudCA+IEFIRF9UQUdfU1VDQ0VTU19JTlRFUlZBTCkgewotCQlkZXYtPnRhZ19zdWNjZXNzX2NvdW50ID0gMDsKLQkJZGV2LT5vcGVuaW5ncysrOwotCX0KLQotCWlmIChkZXYtPmFjdGl2ZSA9PSAwKQotCQlkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9IDA7Ci0KLQlpZiAoVEFJTFFfRU1QVFkoJmRldi0+YnVzeXEpKSB7Ci0JCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfVU5DT05GSUdVUkVEKSAhPSAwCi0JCSAmJiBkZXYtPmFjdGl2ZSA9PSAwCi0JCSAmJiAoZGV2LT5mbGFncyAmIEFIRF9ERVZfVElNRVJfQUNUSVZFKSA9PSAwKQotCQkJYWhkX2xpbnV4X2ZyZWVfZGV2aWNlKGFoZCwgZGV2KTsKLQl9IGVsc2UgaWYgKChkZXYtPmZsYWdzICYgQUhEX0RFVl9PTl9SVU5fTElTVCkgPT0gMCkgewotCQlUQUlMUV9JTlNFUlRfVEFJTCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwgZGV2LCBsaW5rcyk7Ci0JCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9PTl9SVU5fTElTVDsKLQl9Ci0KLQlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfUkVDT1ZFUllfU0NCKSAhPSAwKSB7Ci0JCXByaW50ZigiUmVjb3ZlcnkgU0NCIGNvbXBsZXRlc1xuIik7Ci0JCWlmIChhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9CRFJfU0VOVAotCQkgfHwgYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fUkVRX0FCT1JURUQpCi0JCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9DTURfVElNRU9VVCk7Ci0JCWlmICgoc2NiLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9TQ0JfVVBfRUhfU0VNKSAhPSAwKSB7Ci0JCQlzY2ItPnBsYXRmb3JtX2RhdGEtPmZsYWdzICY9IH5BSERfU0NCX1VQX0VIX1NFTTsKLQkJCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7Ci0JCX0KLQl9Ci0KLQlhaGRfZnJlZV9zY2IoYWhkLCBzY2IpOwotCWFoZF9saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhkLCBjbWQpOwotCi0JaWYgKChhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICYgQUhEX0RWX1dBSVRfU0lNUV9FTVBUWSkgIT0gMAotCSAmJiBMSVNUX0ZJUlNUKCZhaGQtPnBlbmRpbmdfc2NicykgPT0gTlVMTCkgewotCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICY9IH5BSERfRFZfV0FJVF9TSU1RX0VNUFRZOwotCQl1cCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9oYW5kbGVfc2NzaV9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJICAgICBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2NiICpzY2IpCi17Ci0Jc3RydWN0CWFoZF9kZXZpbmZvIGRldmluZm87Ci0KLQlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLAotCQkJICAgIGFoZC0+b3VyX2lkLAotCQkJICAgIGRldi0+dGFyZ2V0LT50YXJnZXQsIGRldi0+bHVuLAotCQkJICAgIGRldi0+dGFyZ2V0LT5jaGFubmVsID09IDAgPyAnQScgOiAnQicsCi0JCQkgICAgUk9MRV9JTklUSUFUT1IpOwotCQotCS8qCi0JICogV2UgZG9uJ3QgY3VycmVudGx5IHRydXN0IHRoZSBtaWQtbGF5ZXIgdG8KLQkgKiBwcm9wZXJseSBkZWFsIHdpdGggcXVldWUgZnVsbCBvciBidXN5LiAgU28sCi0JICogd2hlbiBvbmUgb2NjdXJzLCB3ZSB0ZWxsIHRoZSBtaWQtbGF5ZXIgdG8KLQkgKiB1bmNvbmRpdGlvbmFsbHkgcmVxdWV1ZSB0aGUgY29tbWFuZCB0byB1cwotCSAqIHNvIHRoYXQgd2UgY2FuIHJldHJ5IGl0IG91cnNlbHZlcy4gIFdlIGFsc28KLQkgKiBpbXBsZW1lbnQgb3VyIG93biB0aHJvdHRsaW5nIG1lY2hhbmlzbSBzbwotCSAqIHdlIGRvbid0IGNsb2JiZXIgdGhlIGRldmljZSB3aXRoIHRvbyBtYW55Ci0JICogY29tbWFuZHMuCi0JICovCi0Jc3dpdGNoIChhaGRfZ2V0X3Njc2lfc3RhdHVzKHNjYikpIHsKLQlkZWZhdWx0OgotCQlicmVhazsKLQljYXNlIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkQ6Ci0JY2FzZSBTQ1NJX1NUQVRVU19DTURfVEVSTUlOQVRFRDoKLQl7Ci0JCVNjc2lfQ21uZCAqY21kOwotCi0JCS8qCi0JCSAqIENvcHkgc2Vuc2UgaW5mb3JtYXRpb24gdG8gdGhlIE9TJ3MgY21kCi0JCSAqIHN0cnVjdHVyZSBpZiBpdCBpcyBhdmFpbGFibGUuCi0JCSAqLwotCQljbWQgPSBzY2ItPmlvX2N0eDsKLQkJaWYgKChzY2ItPmZsYWdzICYgKFNDQl9TRU5TRXxTQ0JfUEtUX1NFTlNFKSkgIT0gMCkgewotCQkJc3RydWN0IHNjc2lfc3RhdHVzX2l1X2hlYWRlciAqc2l1OwotCQkJdV9pbnQgc2Vuc2Vfc2l6ZTsKLQkJCXVfaW50IHNlbnNlX29mZnNldDsKLQotCQkJaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpIHsKLQkJCQlzZW5zZV9zaXplID0gTUlOKHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKQotCQkJCQkgICAgICAgLSBhaGRfZ2V0X3NlbnNlX3Jlc2lkdWFsKHNjYiksCi0JCQkJCQkgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7Ci0JCQkJc2Vuc2Vfb2Zmc2V0ID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBDb3B5IG9ubHkgdGhlIHNlbnNlIGRhdGEgaW50byB0aGUgcHJvdmlkZWQKLQkJCQkgKiBidWZmZXIuCi0JCQkJICovCi0JCQkJc2l1ID0gKHN0cnVjdCBzY3NpX3N0YXR1c19pdV9oZWFkZXIgKikKLQkJCQkgICAgc2NiLT5zZW5zZV9kYXRhOwotCQkJCXNlbnNlX3NpemUgPSBNSU4oc2NzaV80YnRvdWwoc2l1LT5zZW5zZV9sZW5ndGgpLAotCQkJCQkJc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7Ci0JCQkJc2Vuc2Vfb2Zmc2V0ID0gU0lVX1NFTlNFX09GRlNFVChzaXUpOwotCQkJfQotCi0JCQltZW1zZXQoY21kLT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOwotCQkJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLAotCQkJICAgICAgIGFoZF9nZXRfc2Vuc2VfYnVmKGFoZCwgc2NiKQotCQkJICAgICAgICsgc2Vuc2Vfb2Zmc2V0LCBzZW5zZV9zaXplKTsKLQkJCWNtZC0+cmVzdWx0IHw9IChEUklWRVJfU0VOU0UgPDwgMjQpOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbyAKKwkJPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwKKwkJCQkgICAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLAorCQkJCSAgICAgIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgJnRzdGF0ZSk7CisJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisJdW5zaWduZWQgaW50IHBwcl9vcHRpb25zID0gdGluZm8tPmdvYWwucHByX29wdGlvbnM7CisJdW5zaWduZWQgaW50IGR0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSB0aW5mby0+Z29hbC5vZmZzZXQ7CiAKICNpZmRlZiBBSERfREVCVUcKLQkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19TRU5TRSkgewotCQkJCWludCBpOwotCi0JCQkJcHJpbnRmKCJDb3BpZWQgJWQgYnl0ZXMgb2Ygc2Vuc2UgZGF0YSBhdCAlZDoiLAotCQkJCSAgICAgICBzZW5zZV9zaXplLCBzZW5zZV9vZmZzZXQpOwotCQkJCWZvciAoaSA9IDA7IGkgPCBzZW5zZV9zaXplOyBpKyspIHsKLQkJCQkJaWYgKChpICYgMHhGKSA9PSAwKQotCQkJCQkJcHJpbnRmKCJcbiIpOwotCQkJCQlwcmludGYoIjB4JXggIiwgY21kLT5zZW5zZV9idWZmZXJbaV0pOwotCQkJCX0KLQkJCQlwcmludGYoIlxuIik7Ci0JCQl9CisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgIT0gMCkKKwkJcHJpbnRmKCIlczogc2V0IHBlcmlvZCB0byAlZFxuIiwgYWhkX25hbWUoYWhkKSwgcGVyaW9kKTsKICNlbmRpZgotCQl9Ci0JCWJyZWFrOworCWlmIChvZmZzZXQgPT0gMCkKKwkJb2Zmc2V0ID0gTUFYX09GRlNFVDsKKworCWlmIChwZXJpb2QgPCA4KQorCQlwZXJpb2QgPSA4OworCWlmIChwZXJpb2QgPCAxMCkgeworCQlwcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9EVF9SRVE7CisJCWlmIChwZXJpb2QgPT0gOCkKKwkJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX0lVX1JFUTsKIAl9Ci0JY2FzZSBTQ1NJX1NUQVRVU19RVUVVRV9GVUxMOgotCXsKLQkJLyoKLQkJICogQnkgdGhlIHRpbWUgdGhlIGNvcmUgZHJpdmVyIGhhcyByZXR1cm5lZCB0aGlzCi0JCSAqIGNvbW1hbmQsIGFsbCBvdGhlciBjb21tYW5kcyB0aGF0IHdlcmUgcXVldWVkCi0JCSAqIHRvIHVzIGJ1dCBub3QgdGhlIGRldmljZSBoYXZlIGJlZW4gcmV0dXJuZWQuCi0JCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGRldi0+YWN0aXZlIGlzIGVxdWFsIHRvCi0JCSAqIHRoZSBudW1iZXIgb2YgY29tbWFuZHMgYWN0dWFsbHkgcXVldWVkIHRvCi0JCSAqIHRoZSBkZXZpY2UuCi0JCSAqLwotCQlkZXYtPnRhZ19zdWNjZXNzX2NvdW50ID0gMDsKLQkJaWYgKGRldi0+YWN0aXZlICE9IDApIHsKLQkJCS8qCi0JCQkgKiBEcm9wIG91ciBvcGVuaW5nIGNvdW50IHRvIHRoZSBudW1iZXIKLQkJCSAqIG9mIGNvbW1hbmRzIGN1cnJlbnRseSBvdXRzdGFuZGluZy4KLQkJCSAqLwotCQkJZGV2LT5vcGVuaW5ncyA9IDA7CisKKwlkdCA9IHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVROworCisJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAwLAorCQkJICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsIFJPTEVfSU5JVElBVE9SKTsKKworCS8qIGFsbCBQUFIgcmVxdWVzdHMgYXBhcnQgZnJvbSBRQVMgcmVxdWlyZSB3aWRlIHRyYW5zZmVycyAqLworCWlmIChwcHJfb3B0aW9ucyAmIH5NU0dfRVhUX1BQUl9RQVNfUkVRKSB7CisJCWlmIChzcGlfd2lkdGgoc3RhcmdldCkgPT0gMCkKKwkJCXBwcl9vcHRpb25zICY9IE1TR19FWFRfUFBSX1FBU19SRVE7CisJfQorCisJYWhkX2ZpbmRfc3luY3JhdGUoYWhkLCAmcGVyaW9kLCAmcHByX29wdGlvbnMsCisJCQkgIGR0ID8gQUhEX1NZTkNSQVRFX01BWCA6IEFIRF9TWU5DUkFURV9VTFRSQTIpOworCisJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOworCWFoZF9zZXRfc3luY3JhdGUoYWhkLCAmZGV2aW5mbywgcGVyaW9kLCBvZmZzZXQsCisJCQkgcHByX29wdGlvbnMsIEFIRF9UUkFOU19HT0FMLCBGQUxTRSk7CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zZXRfb2Zmc2V0KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKXNob3N0LT5ob3N0ZGF0YSk7CisJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwlzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm8gCisJCT0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsCisJCQkJICAgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgICBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsICZ0c3RhdGUpOworCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCXVuc2lnbmVkIGludCBwcHJfb3B0aW9ucyA9IDA7CisJdW5zaWduZWQgaW50IHBlcmlvZCA9IDA7CisJdW5zaWduZWQgaW50IGR0ID0gcHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwogI2lmZGVmIEFIRF9ERUJVRwotCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19RRlVMTCkgIT0gMCkgewotCQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJCQlwcmludGYoIkRyb3BwaW5nIHRhZyBjb3VudCB0byAlZFxuIiwKLQkJCQkgICAgICAgZGV2LT5hY3RpdmUpOwotCQkJfQorCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpICE9IDApCisJCXByaW50ZigiJXM6IHNldCBvZmZzZXQgdG8gJWRcbiIsIGFoZF9uYW1lKGFoZCksIG9mZnNldCk7CiAjZW5kaWYKLQkJCWlmIChkZXYtPmFjdGl2ZSA9PSBkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwpIHsKIAotCQkJCWRldi0+bGFzdF9xdWV1ZWZ1bGxfc2FtZV9jb3VudCsrOwotCQkJCS8qCi0JCQkJICogSWYgd2UgcmVwZWF0ZWRseSBzZWUgYSBxdWV1ZSBmdWxsCi0JCQkJICogYXQgdGhlIHNhbWUgcXVldWUgZGVwdGgsIHRoaXMKLQkJCQkgKiBkZXZpY2UgaGFzIGEgZml4ZWQgbnVtYmVyIG9mIHRhZwotCQkJCSAqIHNsb3RzLiAgTG9jayBpbiB0aGlzIHRhZyBkZXB0aAotCQkJCSAqIHNvIHdlIHN0b3Agc2VlaW5nIHF1ZXVlIGZ1bGxzIGZyb20KLQkJCQkgKiB0aGlzIGRldmljZS4KLQkJCQkgKi8KLQkJCQlpZiAoZGV2LT5sYXN0X3F1ZXVlZnVsbF9zYW1lX2NvdW50Ci0JCQkJID09IEFIRF9MT0NLX1RBR1NfQ09VTlQpIHsKLQkJCQkJZGV2LT5tYXh0YWdzID0gZGV2LT5hY3RpdmU7Ci0JCQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJCQkJcHJpbnRmKCJMb2NraW5nIG1heCB0YWcgY291bnQgYXQgJWRcbiIsCi0JCQkJCSAgICAgICBkZXYtPmFjdGl2ZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwgPSBkZXYtPmFjdGl2ZTsKLQkJCQlkZXYtPmxhc3RfcXVldWVmdWxsX3NhbWVfY291bnQgPSAwOwotCQkJfQotCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fUkVRVUVVRV9SRVEpOwotCQkJYWhkX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX09LKTsKLQkJCWFoZF9wbGF0Zm9ybV9zZXRfdGFncyhhaGQsICZkZXZpbmZvLAotCQkJCSAgICAgKGRldi0+ZmxhZ3MgJiBBSERfREVWX1FfQkFTSUMpCi0JCQkJICAgPyBBSERfUVVFVUVfQkFTSUMgOiBBSERfUVVFVUVfVEFHR0VEKTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qCi0JCSAqIERyb3AgZG93biB0byBhIHNpbmdsZSBvcGVuaW5nLCBhbmQgdHJlYXQgdGhpcwotCQkgKiBhcyBpZiB0aGUgdGFyZ2V0IHJldHVybmVkIEJVU1kgU0NTSSBzdGF0dXMuCi0JCSAqLwotCQlkZXYtPm9wZW5pbmdzID0gMTsKLQkJYWhkX3BsYXRmb3JtX3NldF90YWdzKGFoZCwgJmRldmluZm8sCi0JCQkgICAgIChkZXYtPmZsYWdzICYgQUhEX0RFVl9RX0JBU0lDKQotCQkJICAgPyBBSERfUVVFVUVfQkFTSUMgOiBBSERfUVVFVUVfVEFHR0VEKTsKLQkJYWhkX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX0JVU1kpOwotCQkvKiBGQUxMVEhST1VHSCAqLworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKKwkJCSAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisJaWYgKG9mZnNldCAhPSAwKSB7CisJCXBlcmlvZCA9IHRpbmZvLT5nb2FsLnBlcmlvZDsKKwkJcHByX29wdGlvbnMgPSB0aW5mby0+Z29hbC5wcHJfb3B0aW9uczsKKwkJYWhkX2ZpbmRfc3luY3JhdGUoYWhkLCAmcGVyaW9kLCAmcHByX29wdGlvbnMsIAorCQkJCSAgZHQgPyBBSERfU1lOQ1JBVEVfTUFYIDogQUhEX1NZTkNSQVRFX1VMVFJBMik7CiAJfQotCWNhc2UgU0NTSV9TVEFUVVNfQlVTWToKLQkJLyoKLQkJICogU2V0IGEgc2hvcnQgdGltZXIgdG8gZGVmZXIgc2VuZGluZyBjb21tYW5kcyBmb3IKLQkJICogYSBiaXQgc2luY2UgTGludXggd2lsbCBub3QgZGVsYXkgaW4gdGhpcyBjYXNlLgotCQkgKi8KLQkJaWYgKChkZXYtPmZsYWdzICYgQUhEX0RFVl9USU1FUl9BQ1RJVkUpICE9IDApIHsKLQkJCXByaW50ZigiJXM6JWM6JWQ6IERldmljZSBUaW1lciBzdGlsbCBhY3RpdmUgZHVyaW5nICIKLQkJCSAgICAgICAiYnVzeSBwcm9jZXNzaW5nXG4iLCBhaGRfbmFtZShhaGQpLAotCQkJCWRldi0+dGFyZ2V0LT5jaGFubmVsLCBkZXYtPnRhcmdldC0+dGFyZ2V0KTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9USU1FUl9BQ1RJVkU7Ci0JCWRldi0+cWZyb3plbisrOwotCQlpbml0X3RpbWVyKCZkZXYtPnRpbWVyKTsKLQkJZGV2LT50aW1lci5kYXRhID0gKHVfbG9uZylkZXY7Ci0JCWRldi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFovMik7Ci0JCWRldi0+dGltZXIuZnVuY3Rpb24gPSBhaGRfbGludXhfZGV2X3RpbWVkX3VuZnJlZXplOwotCQlhZGRfdGltZXIoJmRldi0+dGltZXIpOwotCQlicmVhazsKLQl9CisKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCBwZXJpb2QsIG9mZnNldCwgcHByX29wdGlvbnMsCisJCQkgQUhEX1RSQU5TX0dPQUwsIEZBTFNFKTsKKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQKLWFoZF9saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBTY3NpX0NtbmQgKmNtZCkKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zZXRfZHQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgZHQpCiB7Ci0JLyoKLQkgKiBUeXBpY2FsbHksIHRoZSBjb21wbGV0ZSBxdWV1ZSBoYXMgdmVyeSBmZXcgZW50cmllcwotCSAqIHF1ZXVlZCB0byBpdCBiZWZvcmUgdGhlIHF1ZXVlIGlzIGVtcHRpZWQgYnkKLQkgKiBhaGRfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlLCBzbyBzb3J0aW5nIHRoZSBlbnRyaWVzCi0JICogYnkgZ2VuZXJhdGlvbiBudW1iZXIgc2hvdWxkIGJlIGluZXhwZW5zaXZlLgotCSAqIFdlIHBlcmZvcm0gdGhlIHNvcnQgc28gdGhhdCBjb21tYW5kcyB0aGF0IGNvbXBsZXRlCi0JICogd2l0aCBhbiBlcnJvciBhcmUgcmV0dW5lZCBpbiB0aGUgb3JkZXIgb3JpZ2lvbmFsbHkKLQkgKiBxdWV1ZWQgdG8gdGhlIGNvbnRyb2xsZXIgc28gdGhhdCBhbnkgc3Vic2VxdWVudCByZXRyaWVzCi0JICogYXJlIHBlcmZvcm1lZCBpbiBvcmRlci4gIFRoZSB1bmRlcmx5aW5nIGFoZCByb3V0aW5lcyBkbwotCSAqIG5vdCBndWFyYW50ZWUgdGhlIG9yZGVyIHRoYXQgYWJvcnRlZCBjb21tYW5kcyB3aWxsIGJlCi0JICogcmV0dXJuZWQgdG8gdXMuCi0JICovCi0Jc3RydWN0IGFoZF9jb21wbGV0ZXEgKmNvbXBsZXRlcTsKLQlzdHJ1Y3QgYWhkX2NtZCAqbGlzdF9jbWQ7Ci0Jc3RydWN0IGFoZF9jbWQgKmFjbWQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvIAorCQk9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLAorCQkJCSAgICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsCisJCQkJICAgICAgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAmdHN0YXRlKTsKKwlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKwl1bnNpZ25lZCBpbnQgcHByX29wdGlvbnMgPSB0aW5mby0+Z29hbC5wcHJfb3B0aW9ucworCQkmIH5NU0dfRVhUX1BQUl9EVF9SRVE7CisJdW5zaWduZWQgaW50IHBlcmlvZCA9IHRpbmZvLT5nb2FsLnBlcmlvZDsKKwl1bnNpZ25lZCBpbnQgd2lkdGggPSB0aW5mby0+Z29hbC53aWR0aDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyoKLQkgKiBNYXAgQ0FNIGVycm9yIGNvZGVzIGludG8gTGludXggRXJyb3IgY29kZXMuICBXZQotCSAqIGF2b2lkIHRoZSBjb252ZXJzaW9uIHNvIHRoYXQgdGhlIERWIGNvZGUgaGFzIHRoZQotCSAqIGZ1bGwgZXJyb3IgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHdoZW4gbWFraW5nCi0JICogc3RhdGUgY2hhbmdlIGRlY2lzaW9ucy4KLQkgKi8KLQlpZiAoQUhEX0RWX0NNRChjbWQpID09IEZBTFNFKSB7Ci0JCXVpbnQzMl90IHN0YXR1czsKLQkJdV9pbnQgbmV3X3N0YXR1czsKLQotCQlzdGF0dXMgPSBhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKTsKLQkJaWYgKHN0YXR1cyAhPSBDQU1fUkVRX0NNUCkgewotCQkJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKLQkJCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOwotCQkJY2FtX3N0YXR1cyBjYW1fc3RhdHVzOwotCQkJdWludDMyX3QgYWN0aW9uOwotCQkJdV9pbnQgc2NzaV9zdGF0dXM7Ci0KLQkJCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCi0JCQkJCQkgICBjbWQtPmRldmljZS0+aWQsCi0JCQkJCQkgICBjbWQtPmRldmljZS0+bHVuLAotCQkJCQkJICAgLyphbGxvYyovRkFMU0UpOwotCi0JCQlpZiAoZGV2ID09IE5VTEwpCi0JCQkJZ290byBub19mYWxsYmFjazsKLQotCQkJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywKLQkJCQkJICAgIGFoZC0+b3VyX2lkLAotCQkJCQkgICAgZGV2LT50YXJnZXQtPnRhcmdldCwgZGV2LT5sdW4sCi0JCQkJCSAgICBkZXYtPnRhcmdldC0+Y2hhbm5lbCA9PSAwID8gJ0EnOidCJywKLQkJCQkJICAgIFJPTEVfSU5JVElBVE9SKTsKLQotCQkJc2NzaV9zdGF0dXMgPSBhaGRfY21kX2dldF9zY3NpX3N0YXR1cyhjbWQpOwotCQkJY2FtX3N0YXR1cyA9IGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpOwotCQkJYWN0aW9uID0gYWljX2Vycm9yX2FjdGlvbihjbWQsIGRldi0+dGFyZ2V0LT5pbnFfZGF0YSwKLQkJCQkJCSAgY2FtX3N0YXR1cywgc2NzaV9zdGF0dXMpOwotCQkJaWYgKChhY3Rpb24gJiBTU1FfRkFMTEJBQ0spICE9IDApIHsKLQotCQkJCS8qIFVwZGF0ZSBzdGF0cyAqLwotCQkJCWRldi0+dGFyZ2V0LT5lcnJvcnNfZGV0ZWN0ZWQrKzsKLQkJCQlpZiAoZGV2LT50YXJnZXQtPmNtZHNfc2luY2VfZXJyb3IgPT0gMCkKLQkJCQkJZGV2LT50YXJnZXQtPmNtZHNfc2luY2VfZXJyb3IrKzsKLQkJCQllbHNlIHsKLQkJCQkJZGV2LT50YXJnZXQtPmNtZHNfc2luY2VfZXJyb3IgPSAwOwotCQkJCQlhaGRfbGludXhfZmFsbGJhY2soYWhkLCAmZGV2aW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci1ub19mYWxsYmFjazoKLQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJY2FzZSBDQU1fUkVRX0lOUFJPRzoKLQkJY2FzZSBDQU1fUkVRX0NNUDoKLQkJY2FzZSBDQU1fU0NTSV9TVEFUVVNfRVJST1I6Ci0JCQluZXdfc3RhdHVzID0gRElEX09LOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNX1JFUV9BQk9SVEVEOgotCQkJbmV3X3N0YXR1cyA9IERJRF9BQk9SVDsKLQkJCWJyZWFrOwotCQljYXNlIENBTV9CVVNZOgotCQkJbmV3X3N0YXR1cyA9IERJRF9CVVNfQlVTWTsKLQkJCWJyZWFrOwotCQljYXNlIENBTV9SRVFfSU5WQUxJRDoKLQkJY2FzZSBDQU1fUEFUSF9JTlZBTElEOgotCQkJbmV3X3N0YXR1cyA9IERJRF9CQURfVEFSR0VUOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNX1NFTF9USU1FT1VUOgotCQkJbmV3X3N0YXR1cyA9IERJRF9OT19DT05ORUNUOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNX1NDU0lfQlVTX1JFU0VUOgotCQljYXNlIENBTV9CRFJfU0VOVDoKLQkJCW5ld19zdGF0dXMgPSBESURfUkVTRVQ7Ci0JCQlicmVhazsKLQkJY2FzZSBDQU1fVU5DT1JfUEFSSVRZOgotCQkJbmV3X3N0YXR1cyA9IERJRF9QQVJJVFk7Ci0JCQlicmVhazsKLQkJY2FzZSBDQU1fQ01EX1RJTUVPVVQ6Ci0JCQluZXdfc3RhdHVzID0gRElEX1RJTUVfT1VUOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNX1VBX0FCT1JUOgotCQljYXNlIENBTV9SRVFfQ01QX0VSUjoKLQkJY2FzZSBDQU1fQVVUT1NFTlNFX0ZBSUw6Ci0JCWNhc2UgQ0FNX05PX0hCQToKLQkJY2FzZSBDQU1fREFUQV9SVU5fRVJSOgotCQljYXNlIENBTV9VTkVYUF9CVVNGUkVFOgotCQljYXNlIENBTV9TRVFVRU5DRV9GQUlMOgotCQljYXNlIENBTV9DQ0JfTEVOX0VSUjoKLQkJY2FzZSBDQU1fUFJPVklERV9GQUlMOgotCQljYXNlIENBTV9SRVFfVEVSTUlPOgotCQljYXNlIENBTV9VTlJFQ19IQkFfRVJST1I6Ci0JCWNhc2UgQ0FNX1JFUV9UT09fQklHOgotCQkJbmV3X3N0YXR1cyA9IERJRF9FUlJPUjsKLQkJCWJyZWFrOwotCQljYXNlIENBTV9SRVFVRVVFX1JFUToKLQkJCS8qCi0JCQkgKiBJZiB3ZSB3YW50IHRoZSByZXF1ZXN0IHJlcXVldWVkLCBtYWtlIHN1cmUgdGhlcmUKLQkJCSAqIGFyZSBzdWZmaWNlbnQgcmV0cmllcy4gIEluIHRoZSBvbGQgc2NzaSBlcnJvciBjb2RlLAotCQkJICogd2UgdXNlZCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgYSByZXN1bHQgY29kZSB0aGF0Ci0JCQkgKiBieXBhc3NlZCB0aGUgcmV0cnkgY291bnQuICBOb3cgd2UgbXVzdCB1c2UgdGhpcwotCQkJICogaGFjay4gIFdlIGFsc28gImZha2UiIGEgY2hlY2sgY29uZGl0aW9uIHdpdGgKLQkJCSAqIGEgc2Vuc2UgY29kZSBvZiBBQk9SVEVEIENPTU1BTkQuICBUaGlzIHNlZW1zIHRvCi0JCQkgKiBldm9rZSBhIHJldHJ5IGV2ZW4gaWYgdGhpcyBjb21tYW5kIGlzIGJlaW5nIHNlbnQKLQkJCSAqIHZpYSB0aGUgZWggdGhyZWFkLiAgSWNrISAgSWNrISAgSWNrIQotCQkJICovCi0JCQlpZiAoY21kLT5yZXRyaWVzID4gMCkKLQkJCQljbWQtPnJldHJpZXMtLTsKLQkJCW5ld19zdGF0dXMgPSBESURfT0s7Ci0JCQlhaGRfY21kX3NldF9zY3NpX3N0YXR1cyhjbWQsIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkQpOwotCQkJY21kLT5yZXN1bHQgfD0gKERSSVZFUl9TRU5TRSA8PCAyNCk7Ci0JCQltZW1zZXQoY21kLT5zZW5zZV9idWZmZXIsIDAsCi0JCQkgICAgICAgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7Ci0JCQljbWQtPnNlbnNlX2J1ZmZlclswXSA9IFNTRF9FUlJDT0RFX1ZBTElECi0JCQkJCSAgICAgfCBTU0RfQ1VSUkVOVF9FUlJPUjsKLQkJCWNtZC0+c2Vuc2VfYnVmZmVyWzJdID0gU1NEX0tFWV9BQk9SVEVEX0NPTU1BTkQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLwotCQkJbmV3X3N0YXR1cyA9IERJRF9FUlJPUjsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYWhkX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCwgbmV3X3N0YXR1cyk7Ci0JfQotCi0JY29tcGxldGVxID0gJmFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxOwotCWxpc3RfY21kID0gVEFJTFFfRklSU1QoY29tcGxldGVxKTsKLQlhY21kID0gKHN0cnVjdCBhaGRfY21kICopY21kOwotCXdoaWxlIChsaXN0X2NtZCAhPSBOVUxMCi0JICAgICYmIGFjbWRfc2NzaV9jbWQobGlzdF9jbWQpLnNlcmlhbF9udW1iZXIKLQkgICAgIDwgYWNtZF9zY3NpX2NtZChhY21kKS5zZXJpYWxfbnVtYmVyKQotCQlsaXN0X2NtZCA9IFRBSUxRX05FWFQobGlzdF9jbWQsIGFjbWRfbGlua3MudHFlKTsKLQlpZiAobGlzdF9jbWQgIT0gTlVMTCkKLQkJVEFJTFFfSU5TRVJUX0JFRk9SRShsaXN0X2NtZCwgYWNtZCwgYWNtZF9saW5rcy50cWUpOwotCWVsc2UKLQkJVEFJTFFfSU5TRVJUX1RBSUwoY29tcGxldGVxLCBhY21kLCBhY21kX2xpbmtzLnRxZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZmlsdGVyX2lucXVpcnkoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pCi17Ci0Jc3RydWN0CXNjc2lfaW5xdWlyeV9kYXRhICpzaWQ7Ci0Jc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOwotCXN0cnVjdAlhaGRfdHJhbnNpbmZvICp1c2VyOwotCXN0cnVjdAlhaGRfdHJhbnNpbmZvICpnb2FsOwotCXN0cnVjdAlhaGRfdHJhbnNpbmZvICpjdXJyOwotCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7Ci0Jc3RydWN0CWFoZF9saW51eF9kZXZpY2UgKmRldjsKLQl1X2ludAl3aWR0aDsKLQl1X2ludAlwZXJpb2Q7Ci0JdV9pbnQJb2Zmc2V0OwotCXVfaW50CXBwcl9vcHRpb25zOwotCXVfaW50CXRyYW5zX3ZlcnNpb247Ci0JdV9pbnQJcHJvdF92ZXJzaW9uOwotCi0JLyoKLQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBsdW4gYWN0dWFsbHkgZXhpc3RzLiAgSWYgc28sCi0JICogaG9sZCBvbiB0byBpdHMgY29ycmVzcG9uZGluZyBkZXZpY2Ugc3RydWN0dXJlLgotCSAqIElmIG5vdCwgbWFrZSBzdXJlIHdlIHJlbGVhc2UgdGhlIGRldmljZSBhbmQKLQkgKiBkb24ndCBib3RoZXIgcHJvY2Vzc2luZyB0aGUgcmVzdCBvZiB0aGlzIGlucXVpcnkKLQkgKiBjb21tYW5kLgotCSAqLwotCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCAtICdBJywKLQkJCQkgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKLQkJCQkgICAvKmFsbG9jKi9UUlVFKTsKLQotCXNpZCA9IChzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKilkZXYtPnRhcmdldC0+aW5xX2RhdGE7Ci0JaWYgKFNJRF9RVUFMKHNpZCkgPT0gU0lEX1FVQUxfTFVfQ09OTkVDVEVEKSB7Ci0KLQkJZGV2LT5mbGFncyAmPSB+QUhEX0RFVl9VTkNPTkZJR1VSRUQ7CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgIT0gMCkKKwkJcHJpbnRmKCIlczogJXMgRFRcbiIsIGFoZF9uYW1lKGFoZCksIAorCQkgICAgICAgZHQgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOworI2VuZGlmCisJaWYgKGR0KSB7CisJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX0RUX1JFUTsKKwkJaWYgKCF3aWR0aCkKKwkJCWFoZF9saW51eF9zZXRfd2lkdGgoc3RhcmdldCwgMSk7CiAJfSBlbHNlIHsKLQkJZGV2LT5mbGFncyB8PSBBSERfREVWX1VOQ09ORklHVVJFRDsKKwkJaWYgKHBlcmlvZCA8PSA5KQorCQkJcGVyaW9kID0gMTA7IC8qIElmIHJlc2V0dGluZyBEVCwgcGVyaW9kIG11c3QgYmUgPj0gMjVucyAqLworCQkvKiBJVSBpcyBpbnZhbGlkIHdpdGhvdXQgRFQgc2V0ICovCisJCXBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9JVV9SRVE7CisJfQorCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKKwkJCSAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisJYWhkX2ZpbmRfc3luY3JhdGUoYWhkLCAmcGVyaW9kLCAmcHByX29wdGlvbnMsCisJCQkgIGR0ID8gQUhEX1NZTkNSQVRFX01BWCA6IEFIRF9TWU5DUkFURV9VTFRSQTIpOworCisJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOworCWFoZF9zZXRfc3luY3JhdGUoYWhkLCAmZGV2aW5mbywgcGVyaW9kLCB0aW5mby0+Z29hbC5vZmZzZXQsCisJCQkgcHByX29wdGlvbnMsIEFIRF9UUkFOU19HT0FMLCBGQUxTRSk7CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zZXRfcWFzKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IHFhcykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKXNob3N0LT5ob3N0ZGF0YSk7CisJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwlzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm8gCisJCT0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsCisJCQkJICAgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgICBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsICZ0c3RhdGUpOworCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCXVuc2lnbmVkIGludCBwcHJfb3B0aW9ucyA9IHRpbmZvLT5nb2FsLnBwcl9vcHRpb25zCisJCSYgfk1TR19FWFRfUFBSX1FBU19SRVE7CisJdW5zaWduZWQgaW50IHBlcmlvZCA9IHRpbmZvLT5nb2FsLnBlcmlvZDsKKwl1bnNpZ25lZCBpbnQgZHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpICE9IDApCisJCXByaW50ZigiJXM6ICVzIFFBU1xuIiwgYWhkX25hbWUoYWhkKSwgCisJCSAgICAgICBxYXMgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOworI2VuZGlmCisKKwlpZiAocWFzKSB7CisJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1FBU19SRVE7IAorCX0KKworCWR0ID0gcHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVE7CisKKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCisJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOworCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLAorCQkJICBkdCA/IEFIRF9TWU5DUkFURV9NQVggOiBBSERfU1lOQ1JBVEVfVUxUUkEyKTsKKworCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKKwlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgJmRldmluZm8sIHBlcmlvZCwgdGluZm8tPmdvYWwub2Zmc2V0LAorCQkJIHBwcl9vcHRpb25zLCBBSERfVFJBTlNfR09BTCwgRkFMU0UpOworCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhaGRfbGludXhfc2V0X2l1KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IGl1KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBhaGRfc29mdGMgKmFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopc2hvc3QtPmhvc3RkYXRhKTsKKwlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbyAKKwkJPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwKKwkJCQkgICAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLAorCQkJCSAgICAgIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgJnRzdGF0ZSk7CisJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisJdW5zaWduZWQgaW50IHBwcl9vcHRpb25zID0gdGluZm8tPmdvYWwucHByX29wdGlvbnMKKwkJJiB+TVNHX0VYVF9QUFJfSVVfUkVROworCXVuc2lnbmVkIGludCBwZXJpb2QgPSB0aW5mby0+Z29hbC5wZXJpb2Q7CisJdW5zaWduZWQgaW50IGR0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSAhPSAwKQorCQlwcmludGYoIiVzOiAlcyBJVVxuIiwgYWhkX25hbWUoYWhkKSwKKwkJICAgICAgIGl1ID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKKyNlbmRpZgorCisJaWYgKGl1KSB7CisJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX0lVX1JFUTsKKwkJcHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfRFRfUkVROyAvKiBJVSByZXF1aXJlcyBEVCAqLworCX0KKworCWR0ID0gcHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVE7CisKKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCisJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOworCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLAorCQkJICBkdCA/IEFIRF9TWU5DUkFURV9NQVggOiBBSERfU1lOQ1JBVEVfVUxUUkEyKTsKKworCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKKwlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgJmRldmluZm8sIHBlcmlvZCwgdGluZm8tPmdvYWwub2Zmc2V0LAorCQkJIHBwcl9vcHRpb25zLCBBSERfVFJBTlNfR09BTCwgRkFMU0UpOworCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhaGRfbGludXhfc2V0X3JkX3N0cm0oc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgcmRzdHJtKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBhaGRfc29mdGMgKmFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopc2hvc3QtPmhvc3RkYXRhKTsKKwlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbyAKKwkJPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwKKwkJCQkgICAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLAorCQkJCSAgICAgIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgJnRzdGF0ZSk7CisJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisJdW5zaWduZWQgaW50IHBwcl9vcHRpb25zID0gdGluZm8tPmdvYWwucHByX29wdGlvbnMKKwkJJiB+TVNHX0VYVF9QUFJfUkRfU1RSTTsKKwl1bnNpZ25lZCBpbnQgcGVyaW9kID0gdGluZm8tPmdvYWwucGVyaW9kOworCXVuc2lnbmVkIGludCBkdCA9IHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVROworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSAhPSAwKQorCQlwcmludGYoIiVzOiAlcyBSZWFkIFN0cmVhbWluZ1xuIiwgYWhkX25hbWUoYWhkKSwgCisJCSAgICAgICByZHN0cm0gID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKKyNlbmRpZgorCisJaWYgKHJkc3RybSkKKwkJcHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfUkRfU1RSTTsKKworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKKwkJCSAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisJYWhkX2ZpbmRfc3luY3JhdGUoYWhkLCAmcGVyaW9kLCAmcHByX29wdGlvbnMsCisJCQkgIGR0ID8gQUhEX1NZTkNSQVRFX01BWCA6IEFIRF9TWU5DUkFURV9VTFRSQTIpOworCisJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOworCWFoZF9zZXRfc3luY3JhdGUoYWhkLCAmZGV2aW5mbywgcGVyaW9kLCB0aW5mby0+Z29hbC5vZmZzZXQsCisJCQkgcHByX29wdGlvbnMsIEFIRF9UUkFOU19HT0FMLCBGQUxTRSk7CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zZXRfd3JfZmxvdyhzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCB3cmZsb3cpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvIAorCQk9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLAorCQkJCSAgICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsCisJCQkJICAgICAgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAmdHN0YXRlKTsKKwlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKwl1bnNpZ25lZCBpbnQgcHByX29wdGlvbnMgPSB0aW5mby0+Z29hbC5wcHJfb3B0aW9ucworCQkmIH5NU0dfRVhUX1BQUl9XUl9GTE9XOworCXVuc2lnbmVkIGludCBwZXJpb2QgPSB0aW5mby0+Z29hbC5wZXJpb2Q7CisJdW5zaWduZWQgaW50IGR0ID0gcHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpICE9IDApCisJCXByaW50ZigiJXM6ICVzIFdyaXRlIEZsb3cgQ29udHJvbFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJICAgICAgIHdyZmxvdyA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CisjZW5kaWYKKworCWlmICh3cmZsb3cpCisJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1dSX0ZMT1c7CisKKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCisJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOworCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLAorCQkJICBkdCA/IEFIRF9TWU5DUkFURV9NQVggOiBBSERfU1lOQ1JBVEVfVUxUUkEyKTsKKworCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKKwlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgJmRldmluZm8sIHBlcmlvZCwgdGluZm8tPmdvYWwub2Zmc2V0LAorCQkJIHBwcl9vcHRpb25zLCBBSERfVFJBTlNfR09BTCwgRkFMU0UpOworCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhaGRfbGludXhfc2V0X3J0aShzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCBydGkpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvIAorCQk9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLAorCQkJCSAgICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsCisJCQkJICAgICAgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAmdHN0YXRlKTsKKwlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKwl1bnNpZ25lZCBpbnQgcHByX29wdGlvbnMgPSB0aW5mby0+Z29hbC5wcHJfb3B0aW9ucworCQkmIH5NU0dfRVhUX1BQUl9SVEk7CisJdW5zaWduZWQgaW50IHBlcmlvZCA9IHRpbmZvLT5nb2FsLnBlcmlvZDsKKwl1bnNpZ25lZCBpbnQgZHQgPSBwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1JUSSkgPT0gMCkgeworI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSAhPSAwKQorCQkJcHJpbnRmKCIlczogUlRJIG5vdCBhdmFpbGFibGVcbiIsIGFoZF9uYW1lKGFoZCkpOworI2VuZGlmCiAJCXJldHVybjsKIAl9CiAKLQkvKgotCSAqIFVwZGF0ZSBvdXIgbm90aW9uIG9mIHRoaXMgZGV2aWNlJ3MgdHJhbnNmZXIKLQkgKiBuZWdvdGlhdGlvbiBjYXBhYmlsaXRpZXMuCi0JICovCi0JdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCwKLQkJCQkgICAgZGV2aW5mby0+b3VyX3Njc2lpZCwKLQkJCQkgICAgZGV2aW5mby0+dGFyZ2V0LCAmdHN0YXRlKTsKLQl1c2VyID0gJnRpbmZvLT51c2VyOwotCWdvYWwgPSAmdGluZm8tPmdvYWw7Ci0JY3VyciA9ICZ0aW5mby0+Y3VycjsKLQl3aWR0aCA9IHVzZXItPndpZHRoOwotCXBlcmlvZCA9IHVzZXItPnBlcmlvZDsKLQlvZmZzZXQgPSB1c2VyLT5vZmZzZXQ7Ci0JcHByX29wdGlvbnMgPSB1c2VyLT5wcHJfb3B0aW9uczsKLQl0cmFuc192ZXJzaW9uID0gdXNlci0+dHJhbnNwb3J0X3ZlcnNpb247Ci0JcHJvdF92ZXJzaW9uID0gTUlOKHVzZXItPnByb3RvY29sX3ZlcnNpb24sIFNJRF9BTlNJX1JFVihzaWQpKTsKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSAhPSAwKQorCQlwcmludGYoIiVzOiAlcyBSVElcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBydGkgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOworI2VuZGlmCiAKLQkvKgotCSAqIE9ubHkgYXR0ZW1wdCBTUEkzLzQgb25jZSB3ZSd2ZSB2ZXJpZmllZCB0aGF0Ci0JICogdGhlIGRldmljZSBjbGFpbXMgdG8gc3VwcG9ydCBTUEkzLzQgZmVhdHVyZXMuCi0JICovCi0JaWYgKHByb3RfdmVyc2lvbiA8IFNDU0lfUkVWXzIpCi0JCXRyYW5zX3ZlcnNpb24gPSBTSURfQU5TSV9SRVYoc2lkKTsKLQllbHNlCi0JCXRyYW5zX3ZlcnNpb24gPSBTQ1NJX1JFVl8yOworCWlmIChydGkpCisJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1JUSTsKIAotCWlmICgoc2lkLT5mbGFncyAmIFNJRF9XQnVzMTYpID09IDApCi0JCXdpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKLQlpZiAoKHNpZC0+ZmxhZ3MgJiBTSURfU3luYykgPT0gMCkgewotCQlwZXJpb2QgPSAwOwotCQlvZmZzZXQgPSAwOwotCQlwcHJfb3B0aW9ucyA9IDA7Ci0JfQotCWlmICgoc2lkLT5zcGkzZGF0YSAmIFNJRF9TUElfUUFTKSA9PSAwKQotCQlwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfUUFTX1JFUTsKLQlpZiAoKHNpZC0+c3BpM2RhdGEgJiBTSURfU1BJX0NMT0NLX0RUKSA9PSAwKQotCQlwcHJfb3B0aW9ucyAmPSBNU0dfRVhUX1BQUl9RQVNfUkVROwotCWlmICgoc2lkLT5zcGkzZGF0YSAmIFNJRF9TUElfSVVTKSA9PSAwKQotCQlwcHJfb3B0aW9ucyAmPSAoTVNHX0VYVF9QUFJfRFRfUkVRCi0JCQkgICAgICB8IE1TR19FWFRfUFBSX1FBU19SRVEpOworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKKwkJCSAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisJYWhkX2ZpbmRfc3luY3JhdGUoYWhkLCAmcGVyaW9kLCAmcHByX29wdGlvbnMsCisJCQkgIGR0ID8gQUhEX1NZTkNSQVRFX01BWCA6IEFIRF9TWU5DUkFURV9VTFRSQTIpOwogCi0JaWYgKHByb3RfdmVyc2lvbiA+IFNDU0lfUkVWXzIKLQkgJiYgcHByX29wdGlvbnMgIT0gMCkKLQkJdHJhbnNfdmVyc2lvbiA9IHVzZXItPnRyYW5zcG9ydF92ZXJzaW9uOwotCi0JYWhkX3ZhbGlkYXRlX3dpZHRoKGFoZCwgLyp0aW5mbyBsaW1pdCovTlVMTCwgJndpZHRoLCBST0xFX1VOS05PV04pOwotCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLCBBSERfU1lOQ1JBVEVfTUFYKTsKLQlhaGRfdmFsaWRhdGVfb2Zmc2V0KGFoZCwgLyp0aW5mbyBsaW1pdCovTlVMTCwgcGVyaW9kLAotCQkJICAgICZvZmZzZXQsIHdpZHRoLCBST0xFX1VOS05PV04pOwotCWlmIChvZmZzZXQgPT0gMCB8fCBwZXJpb2QgPT0gMCkgewotCQlwZXJpb2QgPSAwOwotCQlvZmZzZXQgPSAwOwotCQlwcHJfb3B0aW9ucyA9IDA7Ci0JfQotCS8qIEFwcGx5IG91ciBmaWx0ZXJlZCB1c2VyIHNldHRpbmdzLiAqLwotCWN1cnItPnRyYW5zcG9ydF92ZXJzaW9uID0gdHJhbnNfdmVyc2lvbjsKLQljdXJyLT5wcm90b2NvbF92ZXJzaW9uID0gcHJvdF92ZXJzaW9uOwotCWFoZF9zZXRfd2lkdGgoYWhkLCBkZXZpbmZvLCB3aWR0aCwgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7Ci0JYWhkX3NldF9zeW5jcmF0ZShhaGQsIGRldmluZm8sIHBlcmlvZCwgb2Zmc2V0LCBwcHJfb3B0aW9ucywKLQkJCSBBSERfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCBwZXJpb2QsIHRpbmZvLT5nb2FsLm9mZnNldCwKKwkJCSBwcHJfb3B0aW9ucywgQUhEX1RSQU5TX0dPQUwsIEZBTFNFKTsKKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKIH0KIAotdm9pZAotYWhkX2ZyZWV6ZV9zaW1xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zZXRfcGNvbXBfZW4oc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgcGNvbXApCiB7Ci0JYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuKys7Ci0JaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA9PSAxKSB7Ci0JCXNjc2lfYmxvY2tfcmVxdWVzdHMoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0KTsKLQkJYWhkX3BsYXRmb3JtX2Fib3J0X3NjYnMoYWhkLCBDQU1fVEFSR0VUX1dJTERDQVJELCBBTExfQ0hBTk5FTFMsCi0JCQkJCUNBTV9MVU5fV0lMRENBUkQsIFNDQl9MSVNUX05VTEwsCi0JCQkJCVJPTEVfSU5JVElBVE9SLCBDQU1fUkVRVUVVRV9SRVEpOwotCX0KKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKXNob3N0LT5ob3N0ZGF0YSk7CisJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwlzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm8gCisJCT0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsCisJCQkJICAgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgICBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsICZ0c3RhdGUpOworCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCXVuc2lnbmVkIGludCBwcHJfb3B0aW9ucyA9IHRpbmZvLT5nb2FsLnBwcl9vcHRpb25zCisJCSYgfk1TR19FWFRfUFBSX1BDT01QX0VOOworCXVuc2lnbmVkIGludCBwZXJpb2QgPSB0aW5mby0+Z29hbC5wZXJpb2Q7CisJdW5zaWduZWQgaW50IGR0ID0gcHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpICE9IDApCisJCXByaW50ZigiJXM6ICVzIFByZWNvbXBlbnNhdGlvblxuIiwgYWhkX25hbWUoYWhkKSwgCisJCSAgICAgICBwY29tcCA/ICJFbmFibGUiIDogIkRpc2FibGUiKTsKKyNlbmRpZgorCisJaWYgKHBjb21wKQorCQlwcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9QQ09NUF9FTjsKKworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKKwkJCSAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisJYWhkX2ZpbmRfc3luY3JhdGUoYWhkLCAmcGVyaW9kLCAmcHByX29wdGlvbnMsCisJCQkgIGR0ID8gQUhEX1NZTkNSQVRFX01BWCA6IEFIRF9TWU5DUkFURV9VTFRSQTIpOworCisJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOworCWFoZF9zZXRfc3luY3JhdGUoYWhkLCAmZGV2aW5mbywgcGVyaW9kLCB0aW5mby0+Z29hbC5vZmZzZXQsCisJCQkgcHByX29wdGlvbnMsIEFIRF9UUkFOU19HT0FMLCBGQUxTRSk7CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CiB9CiAKLXZvaWQKLWFoZF9yZWxlYXNlX3NpbXEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQorc3RhdGljIHZvaWQgYWhkX2xpbnV4X3NldF9ob2xkX21jcyhzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCBob2xkKQogewotCXVfbG9uZyBzOwotCWludCAgICB1bmJsb2NrX3JlcXM7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvIAorCQk9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLAorCQkJCSAgICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsCisJCQkJICAgICAgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAmdHN0YXRlKTsKKwlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKwl1bnNpZ25lZCBpbnQgcHByX29wdGlvbnMgPSB0aW5mby0+Z29hbC5wcHJfb3B0aW9ucworCQkmIH5NU0dfRVhUX1BQUl9IT0xEX01DUzsKKwl1bnNpZ25lZCBpbnQgcGVyaW9kID0gdGluZm8tPmdvYWwucGVyaW9kOworCXVuc2lnbmVkIGludCBkdCA9IHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVROworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQl1bmJsb2NrX3JlcXMgPSAwOwotCWFoZF9sb2NrKGFoZCwgJnMpOwotCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gPiAwKQotCQlhaGQtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4tLTsKLQlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID09IDApIHsKLQkJdW5ibG9ja19yZXFzID0gMTsKLQl9Ci0JaWYgKEFIRF9EVl9TSU1RX0ZST1pFTihhaGQpCi0JICYmICgoYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9EVl9XQUlUX1NJTVFfUkVMRUFTRSkgIT0gMCkpIHsKLQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX0RWX1dBSVRfU0lNUV9SRUxFQVNFOwotCQl1cCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOwotCX0KLQlhaGRfc2NoZWR1bGVfcnVucShhaGQpOwotCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0JLyoKLQkgKiBUaGVyZSBpcyBzdGlsbCBhIHJhY2UgaGVyZS4gIFRoZSBtaWQtbGF5ZXIKLQkgKiBzaG91bGQga2VlcCBpdHMgb3duIGZyZWV6ZSBjb3VudCBhbmQgdXNlCi0JICogYSBib3R0b20gaGFsZiBoYW5kbGVyIHRvIHJ1biB0aGUgcXVldWVzCi0JICogc28gd2UgY2FuIHVuYmxvY2sgd2l0aCBvdXIgb3duIGxvY2sgaGVsZC4KLQkgKi8KLQlpZiAodW5ibG9ja19yZXFzKQotCQlzY3NpX3VuYmxvY2tfcmVxdWVzdHMoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0KTsKKwlpZiAoaG9sZCkKKwkJcHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfSE9MRF9NQ1M7CisKKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCisJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOworCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLAorCQkJICBkdCA/IEFIRF9TWU5DUkFURV9NQVggOiBBSERfU1lOQ1JBVEVfVUxUUkEyKTsKKworCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKKwlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgJmRldmluZm8sIHBlcmlvZCwgdGluZm8tPmdvYWwub2Zmc2V0LAorCQkJIHBwcl9vcHRpb25zLCBBSERfVFJBTlNfR09BTCwgRkFMU0UpOworCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X3NlbV90aW1lb3V0KHVfbG9uZyBhcmcpCi17Ci0Jc3RydWN0CXNjYiAqc2NiOwotCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKLQl1X2xvbmcJczsKIAotCXNjYiA9IChzdHJ1Y3Qgc2NiICopYXJnOwotCWFoZCA9IHNjYi0+YWhkX3NvZnRjOwotCWFoZF9sb2NrKGFoZCwgJnMpOwotCWlmICgoc2NiLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9TQ0JfVVBfRUhfU0VNKSAhPSAwKSB7Ci0JCXNjYi0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIRF9TQ0JfVVBfRUhfU0VNOwotCQl1cCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOwotCX0KLQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotfQogCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X2Rldl90aW1lZF91bmZyZWV6ZSh1X2xvbmcgYXJnKQotewotCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGFoZF9zb2Z0YyAqYWhkOwotCXVfbG9uZyBzOwotCi0JZGV2ID0gKHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICopYXJnOwotCWFoZCA9IGRldi0+dGFyZ2V0LT5haGQ7Ci0JYWhkX2xvY2soYWhkLCAmcyk7Ci0JZGV2LT5mbGFncyAmPSB+QUhEX0RFVl9USU1FUl9BQ1RJVkU7Ci0JaWYgKGRldi0+cWZyb3plbiA+IDApCi0JCWRldi0+cWZyb3plbi0tOwotCWlmIChkZXYtPnFmcm96ZW4gPT0gMAotCSAmJiAoZGV2LT5mbGFncyAmIEFIRF9ERVZfT05fUlVOX0xJU1QpID09IDApCi0JCWFoZF9saW51eF9ydW5fZGV2aWNlX3F1ZXVlKGFoZCwgZGV2KTsKLQlpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX1VOQ09ORklHVVJFRCkgIT0gMAotCSAmJiBkZXYtPmFjdGl2ZSA9PSAwKQotCQlhaGRfbGludXhfZnJlZV9kZXZpY2UoYWhkLCBkZXYpOwotCWFoZF91bmxvY2soYWhkLCAmcyk7Ci19Ci0KLXZvaWQKLWFoZF9wbGF0Zm9ybV9kdW1wX2NhcmRfc3RhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewotCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7Ci0JaW50IHRhcmdldDsKLQlpbnQgbWF4dGFyZ2V0OwotCWludCBsdW47Ci0JaW50IGk7Ci0KLQltYXh0YXJnZXQgPSAoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSA/IDE1IDogNzsKLQlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8PW1heHRhcmdldDsgdGFyZ2V0KyspIHsKLQotCQlmb3IgKGx1biA9IDA7IGx1biA8IEFIRF9OVU1fTFVOUzsgbHVuKyspIHsKLQkJCXN0cnVjdCBhaGRfY21kICphY21kOwotCi0JCQlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIDAsIHRhcmdldCwKLQkJCQkJCSAgIGx1biwgLyphbGxvYyovRkFMU0UpOwotCQkJaWYgKGRldiA9PSBOVUxMKQotCQkJCWNvbnRpbnVlOwotCi0JCQlwcmludGYoIkRldlEoJWQ6JWQ6JWQpOiAiLCAwLCB0YXJnZXQsIGx1bik7Ci0JCQlpID0gMDsKLQkJCVRBSUxRX0ZPUkVBQ0goYWNtZCwgJmRldi0+YnVzeXEsIGFjbWRfbGlua3MudHFlKSB7Ci0JCQkJaWYgKGkrKyA+IEFIRF9TQ0JfTUFYKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXByaW50ZigiJWQgd2FpdGluZ1xuIiwgaSk7Ci0JCX0KLQl9Ci19CitzdGF0aWMgc3RydWN0IHNwaV9mdW5jdGlvbl90ZW1wbGF0ZSBhaGRfbGludXhfdHJhbnNwb3J0X2Z1bmN0aW9ucyA9IHsKKwkuc2V0X29mZnNldAk9IGFoZF9saW51eF9zZXRfb2Zmc2V0LAorCS5zaG93X29mZnNldAk9IDEsCisJLnNldF9wZXJpb2QJPSBhaGRfbGludXhfc2V0X3BlcmlvZCwKKwkuc2hvd19wZXJpb2QJPSAxLAorCS5zZXRfd2lkdGgJPSBhaGRfbGludXhfc2V0X3dpZHRoLAorCS5zaG93X3dpZHRoCT0gMSwKKwkuc2V0X2R0CQk9IGFoZF9saW51eF9zZXRfZHQsCisJLnNob3dfZHQJPSAxLAorCS5zZXRfaXUJCT0gYWhkX2xpbnV4X3NldF9pdSwKKwkuc2hvd19pdQk9IDEsCisJLnNldF9xYXMJPSBhaGRfbGludXhfc2V0X3FhcywKKwkuc2hvd19xYXMJPSAxLAorCS5zZXRfcmRfc3RybQk9IGFoZF9saW51eF9zZXRfcmRfc3RybSwKKwkuc2hvd19yZF9zdHJtCT0gMSwKKwkuc2V0X3dyX2Zsb3cJPSBhaGRfbGludXhfc2V0X3dyX2Zsb3csCisJLnNob3dfd3JfZmxvdwk9IDEsCisJLnNldF9ydGkJPSBhaGRfbGludXhfc2V0X3J0aSwKKwkuc2hvd19ydGkJPSAxLAorCS5zZXRfcGNvbXBfZW4JPSBhaGRfbGludXhfc2V0X3Bjb21wX2VuLAorCS5zaG93X3Bjb21wX2VuCT0gMSwKKwkuc2V0X2hvbGRfbWNzCT0gYWhkX2xpbnV4X3NldF9ob2xkX21jcywKKwkuc2hvd19ob2xkX21jcwk9IDEsCit9OwogCiBzdGF0aWMgaW50IF9faW5pdAogYWhkX2xpbnV4X2luaXQodm9pZCkKIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0JcmV0dXJuIGFoZF9saW51eF9kZXRlY3QoJmFpYzc5eHhfZHJpdmVyX3RlbXBsYXRlKTsKLSNlbHNlCi0Jc2NzaV9yZWdpc3Rlcl9tb2R1bGUoTU9EVUxFX1NDU0lfSEEsICZhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZSk7Ci0JaWYgKGFpYzc5eHhfZHJpdmVyX3RlbXBsYXRlLnByZXNlbnQgPT0gMCkgewotCQlzY3NpX3VucmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLAotCQkJCSAgICAgICAmYWljNzl4eF9kcml2ZXJfdGVtcGxhdGUpOwotCQlyZXR1cm4gKC1FTk9ERVYpOwotCX0KKwlpbnQJZXJyb3IgPSAwOwogCi0JcmV0dXJuICgwKTsKLSNlbmRpZgorCS8qCisJICogSWYgd2UndmUgYmVlbiBwYXNzZWQgYW55IHBhcmFtZXRlcnMsIHByb2Nlc3MgdGhlbSBub3cuCisJICovCisJaWYgKGFpYzc5eHgpCisJCWFpYzc5eHhfc2V0dXAoYWljNzl4eCk7CisKKwlhaGRfbGludXhfdHJhbnNwb3J0X3RlbXBsYXRlID0KKwkJc3BpX2F0dGFjaF90cmFuc3BvcnQoJmFoZF9saW51eF90cmFuc3BvcnRfZnVuY3Rpb25zKTsKKwlpZiAoIWFoZF9saW51eF90cmFuc3BvcnRfdGVtcGxhdGUpCisJCXJldHVybiAtRU5PREVWOworCisJc2NzaV90cmFuc3BvcnRfcmVzZXJ2ZV90YXJnZXQoYWhkX2xpbnV4X3RyYW5zcG9ydF90ZW1wbGF0ZSwKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IGFoZF9saW51eF90YXJnZXQpKTsKKwlzY3NpX3RyYW5zcG9ydF9yZXNlcnZlX2RldmljZShhaGRfbGludXhfdHJhbnNwb3J0X3RlbXBsYXRlLAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSkpOworCisJZXJyb3IgPSBhaGRfbGludXhfcGNpX2luaXQoKTsKKwlpZiAoZXJyb3IpCisJCXNwaV9yZWxlYXNlX3RyYW5zcG9ydChhaGRfbGludXhfdHJhbnNwb3J0X3RlbXBsYXRlKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdAogYWhkX2xpbnV4X2V4aXQodm9pZCkKIHsKLQlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7Ci0KLQkvKgotCSAqIFNodXRkb3duIERWIHRocmVhZHMgYmVmb3JlIGdvaW5nIGludG8gdGhlIFNDU0kgbWlkLWxheWVyLgotCSAqIFRoaXMgYXZvaWRzIHNpdHVhdGlvbnMgd2hlcmUgdGhlIG1pZC1sYXllciBsb2NrcyB0aGUgZW50aXJlCi0JICoga2VybmVsIHNvIHRoYXQgd2FpdGluZyBmb3Igb3VyIERWIHRocmVhZHMgdG8gZXhpdCBsZWFkcwotCSAqIHRvIGRlYWRsb2NrLgotCSAqLwotCVRBSUxRX0ZPUkVBQ0goYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgewotCi0JCWFoZF9saW51eF9raWxsX2R2X3RocmVhZChhaGQpOwotCX0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCS8qCi0JICogSW4gMi40IHdlIGhhdmUgdG8gdW5yZWdpc3RlciBmcm9tIHRoZSBQQ0kgY29yZSBfYWZ0ZXJfCi0JICogdW5yZWdpc3RlcmluZyBmcm9tIHRoZSBzY3NpIG1pZGxheWVyIHRvIGF2b2lkIGRhbmdsaW5nCi0JICogcmVmZXJlbmNlcy4KLQkgKi8KLQlzY3NpX3VucmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLCAmYWljNzl4eF9kcml2ZXJfdGVtcGxhdGUpOwotI2VuZGlmCiAJYWhkX2xpbnV4X3BjaV9leGl0KCk7CisJc3BpX3JlbGVhc2VfdHJhbnNwb3J0KGFoZF9saW51eF90cmFuc3BvcnRfdGVtcGxhdGUpOwogfQogCiBtb2R1bGVfaW5pdChhaGRfbGludXhfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uaAppbmRleCA3ODIzZTUyLi4wNTJjNjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmgKQEAgLTQyLDYgKzQyLDcgQEAKICNpZm5kZWYgX0FJQzc5WFhfTElOVVhfSF8KICNkZWZpbmUgX0FJQzc5WFhfTElOVVhfSF8KIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTQ5LDE4ICs1MCwyMyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4gLyogRm9yIHRhc2tsZXQgc3VwcG9ydC4gKi8KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfc3BpLmg+CiAKIC8qIENvcmUgU0NTSSBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBBSUNfTElCX1BSRUZJWCBhaGQKLSNpbmNsdWRlICJzY3NpLmgiCi0jaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KIAogLyogTmFtZSBzcGFjZSBjb25mbGljdCB3aXRoIEJTRCBxdWV1ZSBtYWNyb3MgKi8KICNpZmRlZiBMSVNUX0hFQUQKQEAgLTk1LDcgKzEwMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBGb3J3YXJkIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IGFoZF9zb2Z0YzsKIHR5cGVkZWYgc3RydWN0IHBjaV9kZXYgKmFoZF9kZXZfc29mdGNfdDsKLXR5cGVkZWYgU2NzaV9DbW5kICAgICAgKmFoZF9pb19jdHhfdDsKK3R5cGVkZWYgc3RydWN0IHNjc2lfY21uZCAgICAgICphaGRfaW9fY3R4X3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEJ5dGUgT3JkZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIGFoZF9odG9iZTE2KHgpCWNwdV90b19iZTE2KHgpCkBAIC0xMTQsOCArMTIwLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ29uZmlndXJhdGlvbiBEYXRhICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiB1aW50MzJfdCBhaWM3OXh4X2FsbG93X21lbWlvOwotZXh0ZXJuIGludCBhaWM3OXh4X2RldGVjdF9jb21wbGV0ZTsKLWV4dGVybiBTY3NpX0hvc3RfVGVtcGxhdGUgYWljNzl4eF9kcml2ZXJfdGVtcGxhdGU7CitleHRlcm4gc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEJ1cyBTcGFjZS9ETUEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTQ1LDExICsxNTAsNyBAQAogfTsKIHR5cGVkZWYgc3RydWN0IGFoZF9saW51eF9kbWFfdGFnKiBidXNfZG1hX3RhZ190OwogCi1zdHJ1Y3QgYWhkX2xpbnV4X2RtYW1hcAotewotCWRtYV9hZGRyX3QJYnVzX2FkZHI7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgYWhkX2xpbnV4X2RtYW1hcCogYnVzX2RtYW1hcF90OwordHlwZWRlZiBkbWFfYWRkcl90IGJ1c19kbWFtYXBfdDsKIAogdHlwZWRlZiBpbnQgYnVzX2RtYV9maWx0ZXJfdCh2b2lkKiwgZG1hX2FkZHJfdCk7CiB0eXBlZGVmIHZvaWQgYnVzX2RtYW1hcF9jYWxsYmFja190KHZvaWQgKiwgYnVzX2RtYV9zZWdtZW50X3QgKiwgaW50LCBpbnQpOwpAQCAtMjI2LDEyICsyMjcsMTIgQEAKICNkZWZpbmUgYWhkX3RpbWVyX2luaXQgaW5pdF90aW1lcgogI2RlZmluZSBhaGRfdGltZXJfc3RvcCBkZWxfdGltZXJfc3luYwogdHlwZWRlZiB2b2lkIGFoZF9saW51eF9jYWxsYmFja190ICh1X2xvbmcpOyAgCi1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfdGltZXJfcmVzZXQoYWhkX3RpbWVyX3QgKnRpbWVyLCB1X2ludCB1c2VjLAorc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3RpbWVyX3Jlc2V0KGFoZF90aW1lcl90ICp0aW1lciwgaW50IHVzZWMsCiAJCQkJICAgICBhaGRfY2FsbGJhY2tfdCAqZnVuYywgdm9pZCAqYXJnKTsKIHN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9zY2JfdGltZXJfcmVzZXQoc3RydWN0IHNjYiAqc2NiLCB1X2ludCB1c2VjKTsKIAogc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF90aW1lcl9yZXNldChhaGRfdGltZXJfdCAqdGltZXIsIHVfaW50IHVzZWMsIGFoZF9jYWxsYmFja190ICpmdW5jLCB2b2lkICphcmcpCithaGRfdGltZXJfcmVzZXQoYWhkX3RpbWVyX3QgKnRpbWVyLCBpbnQgdXNlYywgYWhkX2NhbGxiYWNrX3QgKmZ1bmMsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7CiAKQEAgLTI1Miw0MyArMjUzLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTTVAgc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApIHx8IGRlZmluZWQoU0NTSV9IQVNfSE9TVF9MT0NLKSkKLSNkZWZpbmUgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyAxCi0jZWxzZQotI2RlZmluZSBBSERfU0NTSV9IQVNfSE9TVF9MT0NLIDAKLSNlbmRpZgotCiAjZGVmaW5lIEFJQzc5WFhfRFJJVkVSX1ZFUlNJT04gIjEuMy4xMSIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogRnJvbnQgRW5kIFF1ZXVlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGNhc3QgdGhlIExpbnV4IHN0cnVjdCBzY3NpX2NtbmQgdG8gc29tZXRoaW5nCi0gKiB0aGF0IGFsbG93cyB1cyB0byB1c2UgdGhlIHF1ZXVlIG1hY3Jvcy4gIFRoZSBsaW51eCBzdHJ1Y3R1cmUgaGFzCi0gKiBwbGVudHkgb2Ygc3BhY2UgdG8gaG9sZCB0aGUgbGlua3MgZmllbGRzIGFzIHJlcXVpcmVkIGJ5IHRoZSBxdWV1ZQotICogbWFjcm9zLCBidXQgdGhlIHF1ZXVlIG1hY29ycyByZXF1aXJlIHRoZW0gdG8gaGF2ZSB0aGUgY29ycmVjdCB0eXBlLgotICovCi1zdHJ1Y3QgYWhkX2NtZF9pbnRlcm5hbCB7Ci0JLyogQXJlYSBvd25lZCBieSB0aGUgTGludXggc2NzaSBsYXllci4gKi8KLQl1aW50OF90CXByaXZhdGVbb2Zmc2V0b2Yoc3RydWN0IHNjc2lfY21uZCwgU0NwLlN0YXR1cyldOwotCXVuaW9uIHsKLQkJU1RBSUxRX0VOVFJZKGFoZF9jbWQpCXN0ZTsKLQkJTElTVF9FTlRSWShhaGRfY21kKQlsZTsKLQkJVEFJTFFfRU5UUlkoYWhkX2NtZCkJdHFlOwotCX0gbGlua3M7Ci0JdWludDMyX3QJCQllbmQ7Ci19OwotCi1zdHJ1Y3QgYWhkX2NtZCB7Ci0JdW5pb24gewotCQlzdHJ1Y3QgYWhkX2NtZF9pbnRlcm5hbAlpY21kOwotCQlzdHJ1Y3Qgc2NzaV9jbW5kCXNjc2lfY21kOwotCX0gdW47Ci19OwotCi0jZGVmaW5lIGFjbWRfaWNtZChjbWQpICgoY21kKS0+dW4uaWNtZCkKLSNkZWZpbmUgYWNtZF9zY3NpX2NtZChjbWQpICgoY21kKS0+dW4uc2NzaV9jbWQpCi0jZGVmaW5lIGFjbWRfbGlua3MgdW4uaWNtZC5saW5rcwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldmljZSBEYXRhIFN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIEEgcGVyIHByb2JlZCBkZXZpY2Ugc3RydWN0dXJlIHVzZWQgdG8gZGVhbCB3aXRoIHNvbWUgZXJyb3IgcmVjb3ZlcnkKQEAgLTI5NywyMiArMjYzLDE3IEBACiAgKiBhZnRlciBhIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgaW5xdWlyeSBjb21tYW5kIHRvIHRoZSB0YXJnZXQgd2hlbgogICogdGhhdCBpbnF1aXJ5IGRhdGEgaW5kaWNhdGVzIGEgbHVuIGlzIHByZXNlbnQuCiAgKi8KLVRBSUxRX0hFQUQoYWhkX2J1c3lxLCBhaGRfY21kKTsKKwogdHlwZWRlZiBlbnVtIHsKLQlBSERfREVWX1VOQ09ORklHVVJFRAkgPSAweDAxLAogCUFIRF9ERVZfRlJFRVpFX1RJTF9FTVBUWSA9IDB4MDIsIC8qIEZyZWV6ZSBxdWV1ZSB1bnRpbCBhY3RpdmUgPT0gMCAqLwotCUFIRF9ERVZfVElNRVJfQUNUSVZFCSA9IDB4MDQsIC8qIE91ciB0aW1lciBpcyBhY3RpdmUgKi8KLQlBSERfREVWX09OX1JVTl9MSVNUCSA9IDB4MDgsIC8qIFF1ZXVlZCB0byBiZSBydW4gbGF0ZXIgKi8KIAlBSERfREVWX1FfQkFTSUMJCSA9IDB4MTAsIC8qIEFsbG93IGJhc2ljIGRldmljZSBxdWV1aW5nICovCiAJQUhEX0RFVl9RX1RBR0dFRAkgPSAweDIwLCAvKiBBbGxvdyBmdWxsIFNDU0kyIGNvbW1hbmQgcXVldWVpbmcgKi8KIAlBSERfREVWX1BFUklPRElDX09UQUcJID0gMHg0MCwgLyogU2VuZCBPVEFHIHRvIHByZXZlbnQgc3RhcnZhdGlvbiAqLwotCUFIRF9ERVZfU0xBVkVfQ09ORklHVVJFRCA9IDB4ODAJIC8qIHNsYXZlX2NvbmZpZ3VyZSgpIGhhcyBiZWVuIGNhbGxlZCAqLwogfSBhaGRfbGludXhfZGV2X2ZsYWdzOwogCiBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldDsKIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlIHsKIAlUQUlMUV9FTlRSWShhaGRfbGludXhfZGV2aWNlKSBsaW5rczsKLQlzdHJ1Y3QJCQlhaGRfYnVzeXEgYnVzeXE7CiAKIAkvKgogCSAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGN1cnJlbnRseQpAQCAtMzg4LDYyICszNDksMTIgQEAKIAkgKi8KIAl1X2ludAkJCWNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZzsKICNkZWZpbmUgQUhEX09UQUdfVEhSRVNICTUwMAotCi0JaW50CQkJbHVuOwotCVNjc2lfRGV2aWNlCSAgICAgICAqc2NzaV9kZXZpY2U7Ci0Jc3RydWN0CQkJYWhkX2xpbnV4X3RhcmdldCAqdGFyZ2V0OwogfTsKIAotdHlwZWRlZiBlbnVtIHsKLQlBSERfRFZfUkVRVUlSRUQJCSA9IDB4MDEsCi0JQUhEX0lOUV9WQUxJRAkJID0gMHgwMiwKLQlBSERfQkFTSUNfRFYJCSA9IDB4MDQsCi0JQUhEX0VOSEFOQ0VEX0RWCQkgPSAweDA4Ci19IGFoZF9saW51eF90YXJnX2ZsYWdzOwotCi0vKiBEViBTdGF0ZXMgKi8KLXR5cGVkZWYgZW51bSB7Ci0JQUhEX0RWX1NUQVRFX0VYSVQgPSAwLAotCUFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMsCi0JQUhEX0RWX1NUQVRFX0lOUV9BU1lOQywKLQlBSERfRFZfU1RBVEVfSU5RX0FTWU5DX1ZFUklGWSwKLQlBSERfRFZfU1RBVEVfVFVSLAotCUFIRF9EVl9TVEFURV9SRUJELAotCUFIRF9EVl9TVEFURV9JTlFfVkVSSUZZLAotCUFIRF9EVl9TVEFURV9XRUIsCi0JQUhEX0RWX1NUQVRFX1JFQiwKLQlBSERfRFZfU1RBVEVfU1UsCi0JQUhEX0RWX1NUQVRFX0JVU1kKLX0gYWhkX2R2X3N0YXRlOwotCiBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCB7Ci0Jc3RydWN0IGFoZF9saW51eF9kZXZpY2UJICpkZXZpY2VzW0FIRF9OVU1fTFVOU107Ci0JaW50CQkJICBjaGFubmVsOwotCWludAkJCSAgdGFyZ2V0OwotCWludAkJCSAgcmVmY291bnQ7CisJc3RydWN0IHNjc2lfZGV2aWNlCSAqc2RldltBSERfTlVNX0xVTlNdOwogCXN0cnVjdCBhaGRfdHJhbnNpbmZvCSAgbGFzdF90aW5mbzsKIAlzdHJ1Y3QgYWhkX3NvZnRjCSAqYWhkOwotCWFoZF9saW51eF90YXJnX2ZsYWdzCSAgZmxhZ3M7Ci0Jc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICppbnFfZGF0YTsKLQkvKgotCSAqIFRoZSBuZXh0ICJmYWxsYmFjayIgcGVyaW9kIHRvIHVzZSBmb3IgbmFycm93L3dpZGUgdHJhbnNmZXJzLgotCSAqLwotCXVpbnQ4X3QJCQkgIGR2X25leHRfbmFycm93X3BlcmlvZDsKLQl1aW50OF90CQkJICBkdl9uZXh0X3dpZGVfcGVyaW9kOwotCXVpbnQ4X3QJCQkgIGR2X21heF93aWR0aDsKLQl1aW50OF90CQkJICBkdl9tYXhfcHByX29wdGlvbnM7Ci0JdWludDhfdAkJCSAgZHZfbGFzdF9wcHJfb3B0aW9uczsKLQl1X2ludAkJCSAgZHZfZWNob19zaXplOwotCWFoZF9kdl9zdGF0ZQkJICBkdl9zdGF0ZTsKLQl1X2ludAkJCSAgZHZfc3RhdGVfcmV0cnk7Ci0JdWludDhfdAkJCSAqZHZfYnVmZmVyOwotCXVpbnQ4X3QJCQkgKmR2X2J1ZmZlcjE7Ci0KLQkvKgotCSAqIEN1bXVsYXRpdmUgY291bnRlciBvZiBlcnJvcnMuCi0JICovCi0JdV9sb25nCQkJZXJyb3JzX2RldGVjdGVkOwotCXVfbG9uZwkJCWNtZHNfc2luY2VfZXJyb3I7CiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqIERlZmluaXRpb25zIFJlcXVpcmVkIGJ5IHRoZSBDb3JlICoqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDUzLDMyICszNjQsMTYgQEAKICAqIG1hbm5lciBhbmQgYXJlIGFsbG9jYXRlZCBiZWxvdyA0R0IsIHRoZSBudW1iZXIgb2YgUy9HIHNlZ21lbnRzIGlzCiAgKiB1bnJlc3RyaWN0ZWQuCiAgKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLS8qCi0gKiBXZSBkeW5hbWljYWxseSBhZGp1c3QgdGhlIG51bWJlciBvZiBzZWdtZW50cyBpbiBwcmUtMi41IGtlcm5lbHMgdG8KLSAqIGF2b2lkIGZyYWdtZW50YXRpb24gaXNzdWVzIGluIHRoZSBTQ1NJIG1pZC1sYXllcidzIHByaXZhdGUgbWVtb3J5Ci0gKiBhbGxvY2F0b3IuICBTZWUgYWljNzl4eF9vc20uYyBhaGRfbGludXhfc2l6ZV9uc2VnKCkgZm9yIGRldGFpbHMuCi0gKi8KLWV4dGVybiB1X2ludCBhaGRfbGludXhfbnNlZzsKLSNkZWZpbmUJQUhEX05TRUcgYWhkX2xpbnV4X25zZWcKLSNkZWZpbmUJQUhEX0xJTlVYX01JTl9OU0VHIDY0Ci0jZWxzZQogI2RlZmluZQlBSERfTlNFRyAxMjgKLSNlbmRpZgogCiAvKgogICogUGVyLVNDQiBPU00gc3RvcmFnZS4KICAqLwotdHlwZWRlZiBlbnVtIHsKLQlBSERfU0NCX1VQX0VIX1NFTSA9IDB4MQotfSBhaGRfbGludXhfc2NiX2ZsYWdzOwotCiBzdHJ1Y3Qgc2NiX3BsYXRmb3JtX2RhdGEgewogCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlCSpkZXY7CiAJZG1hX2FkZHJfdAkJIGJ1Zl9idXNhZGRyOwogCXVpbnQzMl90CQkgeGZlcl9sZW47CiAJdWludDMyX3QJCSBzZW5zZV9yZXNpZDsJLyogQXV0by1TZW5zZSByZXNpZHVhbCAqLwotCWFoZF9saW51eF9zY2JfZmxhZ3MJIGZsYWdzOwogfTsKIAogLyoKQEAgLTQ4Nyw0NCArMzgyLDIzIEBACiAgKiBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIG9mIHRoZSB2YXJpb3VzIHBsYXRmb3JtcyBzdXBwb3J0ZWQgYnkKICAqIHRoaXMgZHJpdmVyLgogICovCi10eXBlZGVmIGVudW0gewotCUFIRF9EVl9XQUlUX1NJTVFfRU1QVFkJID0gMHgwMSwKLQlBSERfRFZfV0FJVF9TSU1RX1JFTEVBU0UgPSAweDAyLAotCUFIRF9EVl9BQ1RJVkUJCSA9IDB4MDQsCi0JQUhEX0RWX1NIVVRET1dOCQkgPSAweDA4LAotCUFIRF9SVU5fQ01QTFRfUV9USU1FUgkgPSAweDEwCi19IGFoZF9saW51eF9zb2Z0Y19mbGFnczsKLQotVEFJTFFfSEVBRChhaGRfY29tcGxldGVxLCBhaGRfY21kKTsKLQogc3RydWN0IGFoZF9wbGF0Zm9ybV9kYXRhIHsKIAkvKgogCSAqIEZpZWxkcyBhY2Nlc3NlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgogCSAqLwotCXN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnZXRzW0FIRF9OVU1fVEFSR0VUU107IAotCVRBSUxRX0hFQUQoLCBhaGRfbGludXhfZGV2aWNlKSBkZXZpY2VfcnVucTsKLQlzdHJ1Y3QgYWhkX2NvbXBsZXRlcQkgY29tcGxldGVxOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldFtBSERfTlVNX1RBUkdFVFNdOyAKIAogCXNwaW5sb2NrX3QJCSBzcGluX2xvY2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CSBydW5xX3Rhc2tsZXQ7CiAJdV9pbnQJCQkgcWZyb3plbjsKLQlwaWRfdAkJCSBkdl9waWQ7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJIGNvbXBsZXRlcV90aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdAkgcmVzZXRfdGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJIHN0YXRzX3RpbWVyOwogCXN0cnVjdCBzZW1hcGhvcmUJIGVoX3NlbTsKLQlzdHJ1Y3Qgc2VtYXBob3JlCSBkdl9zZW07Ci0Jc3RydWN0IHNlbWFwaG9yZQkgZHZfY21kX3NlbTsJLyogWFhYIFRoaXMgbmVlZHMgdG8gYmUgaW4KLQkJCQkJCSAqIHRoZSB0YXJnZXQgc3RydWN0Ci0JCQkJCQkgKi8KLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UJKmR2X3Njc2lfZGV2OwogCXN0cnVjdCBTY3NpX0hvc3QgICAgICAgICpob3N0OwkJLyogcG9pbnRlciB0byBzY3NpIGhvc3QgKi8KICNkZWZpbmUgQUhEX0xJTlVYX05PSVJRCSgodWludDMyX3QpfjApCiAJdWludDMyX3QJCSBpcnE7CQkvKiBJUlEgZm9yIHRoaXMgYWRhcHRlciAqLwogCXVpbnQzMl90CQkgYmlvc19hZGRyZXNzOwogCXVpbnQzMl90CQkgbWVtX2J1c2FkZHI7CS8qIE1lbSBCYXNlIEFkZHIgKi8KLQl1aW50NjRfdAkJIGh3X2RtYV9tYXNrOwotCWFoZF9saW51eF9zb2Z0Y19mbGFncwkgZmxhZ3M7CisjZGVmaW5lCUFIRF9TQ0JfVVBfRUhfU0VNIDB4MQorCXVpbnQzMl90CQkgZmxhZ3M7CiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogT1MgVXRpbGl0eSBXcmFwcGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjQxLDcgKzUxNSw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXRpYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQJCWFoZF9saW51eF9yZWdpc3Rlcl9ob3N0KHN0cnVjdCBhaGRfc29mdGMgKiwKLQkJCQkJU2NzaV9Ib3N0X1RlbXBsYXRlICopOworCQkJCQlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICopOwogCiB1aW50NjRfdAlhaGRfbGludXhfZ2V0X21lbXNpemUodm9pZCk7CiAKQEAgLTY1NywyOCArNTMxLDYgQEAKIAkJCSAgICAgc3RydWN0IGFoZF90cmFuc2luZm8gKnRpbmZvKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExvY2tpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIExvY2sgcHJvdGVjdGluZyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9sb2NraW5pdChzdHJ1Y3QgYWhkX3NvZnRjICopOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2xvY2soc3RydWN0IGFoZF9zb2Z0YyAqLCB1bnNpZ25lZCBsb25nICpmbGFncyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfdW5sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOwotCi0vKiBMb2NrIGFjcXVpc2l0aW9uIGFuZCByZWxlYXNlIG9mIHRoZSBhYm92ZSBsb2NrIGluIG1pZGxheWVyIGVudHJ5IHBvaW50cy4gKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9taWRsYXllcl9lbnRyeXBvaW50X2xvY2soc3RydWN0IGFoZF9zb2Z0YyAqLAotCQkJCQkJICB1bnNpZ25lZCBsb25nICpmbGFncyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soc3RydWN0IGFoZF9zb2Z0YyAqLAotCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKTsKLQotLyogTG9jayBoZWxkIGR1cmluZyBjb21tYW5kIGNvbXBlbGV0aW9uIHRvIHRoZSB1cHBlciBsYXllciAqLwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2RvbmVfbG9ja2luaXQoc3RydWN0IGFoZF9zb2Z0YyAqKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9kb25lX2xvY2soc3RydWN0IGFoZF9zb2Z0YyAqLCB1bnNpZ25lZCBsb25nICpmbGFncyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfZG9uZV91bmxvY2soc3RydWN0IGFoZF9zb2Z0YyAqLCB1bnNpZ25lZCBsb25nICpmbGFncyk7Ci0KLS8qIExvY2sgaGVsZCBkdXJpbmcgYWhkX2xpc3QgbWFuaXB1bGF0aW9uIGFuZCBhaGQgc29mdGMgZnJlZXMgKi8KLWV4dGVybiBzcGlubG9ja190IGFoZF9saXN0X3NwaW5sb2NrOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2xpc3RfbG9ja2luaXQodm9pZCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbGlzdF9sb2NrKHVuc2lnbmVkIGxvbmcgKmZsYWdzKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9saXN0X3VubG9jayh1bnNpZ25lZCBsb25nICpmbGFncyk7Ci0KIHN0YXRpYyBfX2lubGluZSB2b2lkCiBhaGRfbG9ja2luaXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewpAQCAtNjk3LDc1ICs1NDksNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoZC0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrLCAqZmxhZ3MpOwogfQogCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQotewotCS8qCi0JICogSW4gMi41LlggYW5kIHNvbWUgMi40LlggdmVyc2lvbnMsIHRoZSBtaWRsYXllciB0YWtlcyBvdXIKLQkgKiBsb2NrIGp1c3QgYmVmb3JlIGNhbGxpbmcgdXMsIHNvIHdlIGF2b2lkIGxvY2tpbmcgYWdhaW4uCi0JICogRm9yIG90aGVyIGtlcm5lbCB2ZXJzaW9ucywgdGhlIGlvX3JlcXVlc3RfbG9jayBpcyB0YWtlbgotCSAqIGp1c3QgYmVmb3JlIG91ciBlbnRyeSBwb2ludCBpcyBjYWxsZWQuICBJbiB0aGlzIGNhc2UsIHdlCi0JICogdHJhZGUgdGhlIGlvX3JlcXVlc3RfbG9jayBmb3Igb3VyIHBlci1zb2Z0YyBsb2NrLgotCSAqLwotI2lmIEFIRF9TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAotCXNwaW5fdW5sb2NrKCZpb19yZXF1ZXN0X2xvY2spOwotCXNwaW5fbG9jaygmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLSNpZiBBSERfU0NTSV9IQVNfSE9TVF9MT0NLID09IDAKLQlzcGluX3VubG9jaygmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOwotCXNwaW5fbG9jaygmaW9fcmVxdWVzdF9sb2NrKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX2RvbmVfbG9ja2luaXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewotCS8qCi0JICogSW4gMi41LlgsIG91ciBvd24gbG9jayBpcyBoZWxkIGR1cmluZyBjb21wbGV0aW9ucy4KLQkgKiBJbiBwcmV2aW91cyB2ZXJzaW9ucywgdGhlIGlvX3JlcXVlc3RfbG9jayBpcyB1c2VkLgotCSAqIEluIGVpdGhlciBjYXNlLCB3ZSBjYW4ndCBpbml0aWFsaXplIHRoaXMgbG9jayBhZ2Fpbi4KLQkgKi8KLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9kb25lX2xvY2soc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLSNpZiBBSERfU0NTSV9IQVNfSE9TVF9MT0NLID09IDAKLQlzcGluX2xvY2soJmlvX3JlcXVlc3RfbG9jayk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9kb25lX3VubG9jayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQotewotI2lmIEFIRF9TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAotCXNwaW5fdW5sb2NrKCZpb19yZXF1ZXN0X2xvY2spOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfbGlzdF9sb2NraW5pdCh2b2lkKQotewotCXNwaW5fbG9ja19pbml0KCZhaGRfbGlzdF9zcGlubG9jayk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfbGlzdF9sb2NrKHVuc2lnbmVkIGxvbmcgKmZsYWdzKQotewotCXNwaW5fbG9ja19pcnFzYXZlKCZhaGRfbGlzdF9zcGlubG9jaywgKmZsYWdzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9saXN0X3VubG9jayh1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGRfbGlzdF9zcGlubG9jaywgKmZsYWdzKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUENJIERlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBQQ0lNX3h4eDogbWFzayB0byBsb2NhdGUgc3ViZmllbGQgaW4gcmVnaXN0ZXIKQEAgLTkyNSwyNyArNzA4LDE3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFByb2MgRlMgU3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi1pbnQJYWhkX2xpbnV4X3Byb2NfaW5mbyhjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCwgaW50KTsKLSNlbHNlCiBpbnQJYWhkX2xpbnV4X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgY2hhciAqKiwKIAkJCSAgICBvZmZfdCwgaW50LCBpbnQpOwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogRG9tYWluIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEFIRF9EVl9DTUQoY21kKSAoKGNtZCktPnNjc2lfZG9uZSA9PSBhaGRfbGludXhfZHZfY29tcGxldGUpCi0jZGVmaW5lIEFIRF9EVl9TSU1RX0ZST1pFTihhaGQpCQkJCQlcCi0JKCgoKGFoZCktPnBsYXRmb3JtX2RhdGEtPmZsYWdzICYgQUhEX0RWX0FDVElWRSkgIT0gMCkJXAotCSAmJiAoYWhkKS0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA9PSAxKQogCiAvKioqKioqKioqKioqKioqKioqKioqKiogVHJhbnNhY3Rpb24gQWNjZXNzIFdyYXBwZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKFNjc2lfQ21uZCAqLCB1aW50MzJfdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqLCB1aW50MzJfdCk7CiBzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzdHJ1Y3Qgc2NiICosIHVpbnQzMl90KTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9jbWRfc2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqLCB1aW50MzJfdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfY21kX3NldF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc2NzaV9jbW5kICosIHVpbnQzMl90KTsKIHN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9zZXRfc2NzaV9zdGF0dXMoc3RydWN0IHNjYiAqLCB1aW50MzJfdCk7Ci1zdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKFNjc2lfQ21uZCAqY21kKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIHN0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzdHJ1Y3Qgc2NiICopOwotc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoZF9jbWRfZ2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqY21kKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGRfY21kX2dldF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoZF9nZXRfc2NzaV9zdGF0dXMoc3RydWN0IHNjYiAqKTsKIHN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9zZXRfdHJhbnNhY3Rpb25fdGFnKHN0cnVjdCBzY2IgKiwgaW50LCB1X2ludCk7CiBzdGF0aWMgX19pbmxpbmUgdV9sb25nIGFoZF9nZXRfdHJhbnNmZXJfbGVuZ3RoKHN0cnVjdCBzY2IgKik7CkBAIC05NjQsNyArNzM3LDcgQEAKIHN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9mcmVlemVfc2NiKHN0cnVjdCBzY2IgKnNjYik7CiAKIHN0YXRpYyBfX2lubGluZQotdm9pZCBhaGRfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoU2NzaV9DbW5kICpjbWQsIHVpbnQzMl90IHN0YXR1cykKK3ZvaWQgYWhkX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdWludDMyX3Qgc3RhdHVzKQogewogCWNtZC0+cmVzdWx0ICY9IH4oQ0FNX1NUQVRVU19NQVNLIDw8IDE2KTsKIAljbWQtPnJlc3VsdCB8PSBzdGF0dXMgPDwgMTY7CkBAIC05NzcsNyArNzUwLDcgQEAKIH0KIAogc3RhdGljIF9faW5saW5lCi12b2lkIGFoZF9jbWRfc2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqY21kLCB1aW50MzJfdCBzdGF0dXMpCit2b2lkIGFoZF9jbWRfc2V0X3Njc2lfc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdWludDMyX3Qgc3RhdHVzKQogewogCWNtZC0+cmVzdWx0ICY9IH4weEZGRkY7CiAJY21kLT5yZXN1bHQgfD0gc3RhdHVzOwpAQCAtOTkwLDcgKzc2Myw3IEBACiB9CiAKIHN0YXRpYyBfX2lubGluZQotdWludDMyX3QgYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKFNjc2lfQ21uZCAqY21kKQordWludDMyX3QgYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlyZXR1cm4gKChjbWQtPnJlc3VsdCA+PiAxNikgJiBDQU1fU1RBVFVTX01BU0spOwogfQpAQCAtMTAwMiw3ICs3NzUsNyBAQAogfQogCiBzdGF0aWMgX19pbmxpbmUKLXVpbnQzMl90IGFoZF9jbWRfZ2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqY21kKQordWludDMyX3QgYWhkX2NtZF9nZXRfc2NzaV9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCXJldHVybiAoY21kLT5yZXN1bHQgJiAweEZGRkYpOwogfQpAQCAtMTExNyw3ICs4OTAsNiBAQAogdm9pZAlhaGRfc2VuZF9hc3luYyhzdHJ1Y3QgYWhkX3NvZnRjICosIGNoYXIgY2hhbm5lbCwKIAkJICAgICAgIHVfaW50IHRhcmdldCwgdV9pbnQgbHVuLCBhY19jb2RlLCB2b2lkICopOwogdm9pZAlhaGRfcHJpbnRfcGF0aChzdHJ1Y3QgYWhkX3NvZnRjICosIHN0cnVjdCBzY2IgKik7Ci12b2lkCWFoZF9wbGF0Zm9ybV9kdW1wX2NhcmRfc3RhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIAogI2lmZGVmIENPTkZJR19QQ0kKICNkZWZpbmUgQUhEX1BDSV9DT05GSUcgMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc21fcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbV9wY2kuYwppbmRleCA5MWRhZjBjLi4zOTBiNTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbV9wY2kuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbV9wY2kuYwpAQCAtOTIsMjcgKzkyLDMxIEBACiBzdGF0aWMgdm9pZAogYWhkX2xpbnV4X3BjaV9kZXZfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXN0cnVjdCBhaGRfc29mdGMgKmFoZDsKLQl1X2xvbmcgbDsKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdV9sb25nIHM7CiAKLQkvKgotCSAqIFdlIHNob3VsZCBiZSBhYmxlIHRvIGp1c3QgcGVyZm9ybQotCSAqIHRoZSBmcmVlIGRpcmVjdGx5LCBidXQgY2hlY2sgb3VyCi0JICogbGlzdCBmb3IgZXh0cmEgc2FuaXR5LgotCSAqLwotCWFoZF9saXN0X2xvY2soJmwpOwotCWFoZCA9IGFoZF9maW5kX3NvZnRjKChzdHJ1Y3QgYWhkX3NvZnRjICopcGNpX2dldF9kcnZkYXRhKHBkZXYpKTsKLQlpZiAoYWhkICE9IE5VTEwpIHsKLQkJdV9sb25nIHM7CisJYWhkX2xvY2soYWhkLCAmcyk7CisJYWhkX2ludHJfZW5hYmxlKGFoZCwgRkFMU0UpOworCWFoZF91bmxvY2soYWhkLCAmcyk7CisJYWhkX2ZyZWUoYWhkKTsKK30KIAotCQlUQUlMUV9SRU1PVkUoJmFoZF90YWlscSwgYWhkLCBsaW5rcyk7Ci0JCWFoZF9saXN0X3VubG9jaygmbCk7Ci0JCWFoZF9sb2NrKGFoZCwgJnMpOwotCQlhaGRfaW50cl9lbmFibGUoYWhkLCBGQUxTRSk7Ci0JCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0JCWFoZF9mcmVlKGFoZCk7Ci0JfSBlbHNlCi0JCWFoZF9saXN0X3VubG9jaygmbCk7CitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3BjaV9pbmhlcml0X2ZsYWdzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFoZC0+ZGV2X3NvZnRjLCAqbWFzdGVyX3BkZXY7CisJdW5zaWduZWQgaW50IG1hc3Rlcl9kZXZmbiA9IFBDSV9ERVZGTihQQ0lfU0xPVChwZGV2LT5kZXZmbiksIDApOworCisJbWFzdGVyX3BkZXYgPSBwY2lfZ2V0X3Nsb3QocGRldi0+YnVzLCBtYXN0ZXJfZGV2Zm4pOworCWlmIChtYXN0ZXJfcGRldikgeworCQlzdHJ1Y3QgYWhkX3NvZnRjICptYXN0ZXIgPSBwY2lfZ2V0X2RydmRhdGEobWFzdGVyX3BkZXYpOworCQlpZiAobWFzdGVyKSB7CisJCQlhaGQtPmZsYWdzICY9IH5BSERfQklPU19FTkFCTEVEOworCQkJYWhkLT5mbGFncyB8PSBtYXN0ZXItPmZsYWdzICYgQUhEX0JJT1NfRU5BQkxFRDsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9FUlIgImFpYzc5eHg6IG5vIG11bHRpY2hhbm5lbCBwZWVyIGZvdW5kIVxuIik7CisJCXBjaV9kZXZfcHV0KG1hc3Rlcl9wZGV2KTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTEyNSwyMiArMTI5LDYgQEAKIAljaGFyCQkqbmFtZTsKIAlpbnQJCSBlcnJvcjsKIAotCS8qCi0JICogU29tZSBCSU9TZW4gcmVwb3J0IHRoZSBzYW1lIGRldmljZSBtdWx0aXBsZSB0aW1lcy4KLQkgKi8KLQlUQUlMUV9GT1JFQUNIKGFoZCwgJmFoZF90YWlscSwgbGlua3MpIHsKLQkJc3RydWN0IHBjaV9kZXYgKnByb2JlZF9wZGV2OwotCi0JCXByb2JlZF9wZGV2ID0gYWhkLT5kZXZfc29mdGM7Ci0JCWlmIChwcm9iZWRfcGRldi0+YnVzLT5udW1iZXIgPT0gcGRldi0+YnVzLT5udW1iZXIKLQkJICYmIHByb2JlZF9wZGV2LT5kZXZmbiA9PSBwZGV2LT5kZXZmbikKLQkJCWJyZWFrOwotCX0KLQlpZiAoYWhkICE9IE5VTEwpIHsKLQkJLyogU2tpcCBkdXBsaWNhdGUuICovCi0JCXJldHVybiAoLUVOT0RFVik7Ci0JfQotCiAJcGNpID0gcGRldjsKIAllbnRyeSA9IGFoZF9maW5kX3BjaV9kZXZpY2UocGNpKTsKIAlpZiAoZW50cnkgPT0gTlVMTCkKQEAgLTE3NywxNSArMTY1LDEyIEBACiAJCWlmIChtZW1zaXplID49IDB4ODAwMDAwMDAwMFVMTAogCSAJICYmIHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spID09IDApIHsKIAkJCWFoZC0+ZmxhZ3MgfD0gQUhEXzY0QklUX0FERFJFU1NJTkc7Ci0JCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrID0gRE1BXzY0QklUX01BU0s7CiAJCX0gZWxzZSBpZiAobWVtc2l6ZSA+IDB4ODAwMDAwMDAKIAkJCSYmIHBjaV9zZXRfZG1hX21hc2socGRldiwgbWFza18zOWJpdCkgPT0gMCkgewogCQkJYWhkLT5mbGFncyB8PSBBSERfMzlCSVRfQUREUkVTU0lORzsKLQkJCWFoZC0+cGxhdGZvcm1fZGF0YS0+aHdfZG1hX21hc2sgPSBtYXNrXzM5Yml0OwogCQl9CiAJfSBlbHNlIHsKIAkJcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7Ci0JCWFoZC0+cGxhdGZvcm1fZGF0YS0+aHdfZG1hX21hc2sgPSBETUFfMzJCSVRfTUFTSzsKIAl9CiAJYWhkLT5kZXZfc29mdGMgPSBwY2k7CiAJZXJyb3IgPSBhaGRfcGNpX2NvbmZpZyhhaGQsIGVudHJ5KTsKQEAgLTE5MywxNiArMTc4LDE3IEBACiAJCWFoZF9mcmVlKGFoZCk7CiAJCXJldHVybiAoLWVycm9yKTsKIAl9CisKKwkvKgorCSAqIFNlY29uZCBGdW5jdGlvbiBQQ0kgZGV2aWNlcyBuZWVkIHRvIGluaGVyaXQgc29tZQorCSAqICogc2V0dGluZ3MgZnJvbSBmdW5jdGlvbiAwLgorCSAqLworCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9NVUxUSV9GVU5DKSAmJiBQQ0lfRlVOQyhwZGV2LT5kZXZmbikgIT0gMCkKKwkJYWhkX2xpbnV4X3BjaV9pbmhlcml0X2ZsYWdzKGFoZCk7CisKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgYWhkKTsKLQlpZiAoYWljNzl4eF9kZXRlY3RfY29tcGxldGUpIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0JCWFoZF9saW51eF9yZWdpc3Rlcl9ob3N0KGFoZCwgJmFpYzc5eHhfZHJpdmVyX3RlbXBsYXRlKTsKLSNlbHNlCi0JCXByaW50ZigiYWljNzl4eDogaWdub3JpbmcgUENJIGRldmljZSBmb3VuZCBhZnRlciAiCi0JCSAgICAgICAiaW5pdGlhbGl6YXRpb25cbiIpOwotCQlyZXR1cm4gKC1FTk9ERVYpOwotI2VuZGlmCi0JfQorCisJYWhkX2xpbnV4X3JlZ2lzdGVyX2hvc3QoYWhkLCAmYWljNzl4eF9kcml2ZXJfdGVtcGxhdGUpOwogCXJldHVybiAoMCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jCmluZGV4IDcwM2Y2ZTQuLjIxMzFkYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wY2kuYwpAQCAtMjgzLDcgKzI4Myw2IEBACiBhaGRfcGNpX2NvbmZpZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfcGNpX2lkZW50aXR5ICplbnRyeSkKIHsKIAlzdHJ1Y3Qgc2NiX2RhdGEgKnNoYXJlZF9zY2JfZGF0YTsKLQl1X2xvbmcJCSBsOwogCXVfaW50CQkgY29tbWFuZDsKIAl1aW50MzJfdAkgZGV2Y29uZmlnOwogCXVpbnQxNl90CSBzdWJ2ZW5kb3I7IApAQCAtMzczLDE2ICszNzIsOSBAQAogCSAqIEFsbG93IGludGVycnVwdHMgbm93IHRoYXQgd2UgYXJlIGNvbXBsZXRlbHkgc2V0dXAuCiAJICovCiAJZXJyb3IgPSBhaGRfcGNpX21hcF9pbnQoYWhkKTsKLQlpZiAoZXJyb3IgIT0gMCkKLQkJcmV0dXJuIChlcnJvcik7Ci0KLQlhaGRfbGlzdF9sb2NrKCZsKTsKLQkvKgotCSAqIExpbmsgdGhpcyBzb2Z0YyBpbiB3aXRoIGFsbCBvdGhlciBhaGQgaW5zdGFuY2VzLgotCSAqLwotCWFoZF9zb2Z0Y19pbnNlcnQoYWhkKTsKLQlhaGRfbGlzdF91bmxvY2soJmwpOwotCXJldHVybiAoMCk7CisJaWYgKCFlcnJvcikKKwkJYWhkLT5pbml0X2xldmVsKys7CisJcmV0dXJuIGVycm9yOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wcm9jLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3Byb2MuYwppbmRleCBlMDFjZDYxLi4zOWEyNzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3Byb2MuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3Byb2MuYwpAQCAtNDksMTAgKzQ5LDUzIEBACiAJCQkJICAgICAgdV9pbnQgb3VyX2lkLCBjaGFyIGNoYW5uZWwsCiAJCQkJICAgICAgdV9pbnQgdGFyZ2V0X2lkLCB1X2ludCB0YXJnZXRfb2Zmc2V0KTsKIHN0YXRpYyB2b2lkCWFoZF9kdW1wX2RldmljZV9zdGF0ZShzdHJ1Y3QgaW5mb19zdHIgKmluZm8sCi0JCQkJICAgICAgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldik7CisJCQkJICAgICAgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKIHN0YXRpYyBpbnQJYWhkX3Byb2Nfd3JpdGVfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCiAJCQkJICAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCk7CiAKKy8qCisgKiBUYWJsZSBvZiBzeW5jcmF0ZXMgdGhhdCBkb24ndCBmb2xsb3cgdGhlICJkaXZpc2libGUgYnkgNCIKKyAqIHJ1bGUuIFRoaXMgdGFibGUgd2lsbCBiZSBleHBhbmRlZCBpbiBmdXR1cmUgU0NTSSBzcGVjcy4KKyAqLworc3RhdGljIHN0cnVjdCB7CisJdV9pbnQgcGVyaW9kX2ZhY3RvcjsKKwl1X2ludCBwZXJpb2Q7CS8qIGluIDEwMHRocyBvZiBucyAqLworfSBzY3NpX3N5bmNyYXRlc1tdID0geworCXsgMHgwOCwgNjI1IH0sCS8qIEZBU1QtMTYwICovCisJeyAweDA5LCAxMjUwIH0sCS8qIEZBU1QtODAgKi8KKwl7IDB4MGEsIDI1MDAgfSwJLyogRkFTVC00MCA0ME1IeiAqLworCXsgMHgwYiwgMzAzMCB9LAkvKiBGQVNULTQwIDMzTUh6ICovCisJeyAweDBjLCA1MDAwIH0JLyogRkFTVC0yMCAqLworfTsKKworLyoKKyAqIFJldHVybiB0aGUgZnJlcXVlbmN5IGluIGtIeiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgorICogc3luYyBwZXJpb2QgZmFjdG9yLgorICovCitzdGF0aWMgdV9pbnQKK2FoZF9jYWxjX3N5bmNzcmF0ZSh1X2ludCBwZXJpb2RfZmFjdG9yKQoreworCWludCBpOworCWludCBudW1fc3luY3JhdGVzOworCisJbnVtX3N5bmNyYXRlcyA9IHNpemVvZihzY3NpX3N5bmNyYXRlcykgLyBzaXplb2Yoc2NzaV9zeW5jcmF0ZXNbMF0pOworCS8qIFNlZSBpZiB0aGUgcGVyaW9kIGlzIGluIHRoZSAiZXhjZXB0aW9uIiB0YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fc3luY3JhdGVzOyBpKyspIHsKKworCQlpZiAocGVyaW9kX2ZhY3RvciA9PSBzY3NpX3N5bmNyYXRlc1tpXS5wZXJpb2RfZmFjdG9yKSB7CisJCQkvKiBQZXJpb2QgaW4ga0h6ICovCisJCQlyZXR1cm4gKDEwMDAwMDAwMCAvIHNjc2lfc3luY3JhdGVzW2ldLnBlcmlvZCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFdhc24ndCBpbiB0aGUgdGFibGUsIHNvIHVzZSB0aGUgc3RhbmRhcmQKKwkgKiA0IHRpbWVzIGNvbnZlcnNpb24uCisJICovCisJcmV0dXJuICgxMDAwMDAwMCAvIChwZXJpb2RfZmFjdG9yICogNCAqIDEwKSk7Cit9CisKKwogc3RhdGljIHZvaWQKIGNvcHlfbWVtX2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpkYXRhLCBpbnQgbGVuKQogewpAQCAtMTA5LDcgKzE1Miw3IEBACiAgICAgICAgIHNwZWVkID0gMzMwMDsKICAgICAgICAgZnJlcSA9IDA7CiAJaWYgKHRpbmZvLT5vZmZzZXQgIT0gMCkgewotCQlmcmVxID0gYWljX2NhbGNfc3luY3NyYXRlKHRpbmZvLT5wZXJpb2QpOworCQlmcmVxID0gYWhkX2NhbGNfc3luY3NyYXRlKHRpbmZvLT5wZXJpb2QpOwogCQlzcGVlZCA9IGZyZXE7CiAJfQogCXNwZWVkICo9ICgweDAxIDw8IHRpbmZvLT53aWR0aCk7CkBAIC0xNjcsNiArMjEwLDcgQEAKIAkJICAgICAgdV9pbnQgdGFyZ2V0X29mZnNldCkKIHsKIAlzdHJ1Y3QJYWhkX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3QgIHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OwogCXN0cnVjdAlhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKIAlzdHJ1Y3QJYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOwogCWludAlsdW47CkBAIC0xNzYsMjAgKzIyMCwyMCBAQAogCWNvcHlfaW5mbyhpbmZvLCAiVGFyZ2V0ICVkIE5lZ290aWF0aW9uIFNldHRpbmdzXG4iLCB0YXJnZXRfaWQpOwogCWNvcHlfaW5mbyhpbmZvLCAiXHRVc2VyOiAiKTsKIAlhaGRfZm9ybWF0X3RyYW5zaW5mbyhpbmZvLCAmdGluZm8tPnVzZXIpOwotCXRhcmcgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF07Ci0JaWYgKHRhcmcgPT0gTlVMTCkKKwlzdGFyZ2V0ID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT5zdGFyZ2V0W3RhcmdldF9vZmZzZXRdOworCWlmIChzdGFyZ2V0ID09IE5VTEwpCiAJCXJldHVybjsKKwl0YXJnID0gc2NzaV90cmFuc3BvcnRfdGFyZ2V0X2RhdGEoc3RhcmdldCk7CiAKIAljb3B5X2luZm8oaW5mbywgIlx0R29hbDogIik7CiAJYWhkX2Zvcm1hdF90cmFuc2luZm8oaW5mbywgJnRpbmZvLT5nb2FsKTsKIAljb3B5X2luZm8oaW5mbywgIlx0Q3VycjogIik7CiAJYWhkX2Zvcm1hdF90cmFuc2luZm8oaW5mbywgJnRpbmZvLT5jdXJyKTsKLQljb3B5X2luZm8oaW5mbywgIlx0VHJhbnNtaXNzaW9uIEVycm9ycyAlbGRcbiIsIHRhcmctPmVycm9yc19kZXRlY3RlZCk7CiAKIAlmb3IgKGx1biA9IDA7IGx1biA8IEFIRF9OVU1fTFVOUzsgbHVuKyspIHsKLQkJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwkJc3RydWN0IHNjc2lfZGV2aWNlICpkZXY7CiAKLQkJZGV2ID0gdGFyZy0+ZGV2aWNlc1tsdW5dOworCQlkZXYgPSB0YXJnLT5zZGV2W2x1bl07CiAKIAkJaWYgKGRldiA9PSBOVUxMKQogCQkJY29udGludWU7CkBAIC0xOTksMTAgKzI0MywxMyBAQAogfQogCiBzdGF0aWMgdm9pZAotYWhkX2R1bXBfZGV2aWNlX3N0YXRlKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldikKK2FoZF9kdW1wX2RldmljZV9zdGF0ZShzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKKwlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2ID0gc2NzaV90cmFuc3BvcnRfZGV2aWNlX2RhdGEoc2Rldik7CisKIAljb3B5X2luZm8oaW5mbywgIlx0Q2hhbm5lbCAlYyBUYXJnZXQgJWQgTHVuICVkIFNldHRpbmdzXG4iLAotCQkgIGRldi0+dGFyZ2V0LT5jaGFubmVsICsgJ0EnLCBkZXYtPnRhcmdldC0+dGFyZ2V0LCBkZXYtPmx1bik7CisJCSAgc2Rldi0+c2Rldl90YXJnZXQtPmNoYW5uZWwgKyAnQScsCisJCSAgc2Rldi0+c2Rldl90YXJnZXQtPmlkLCBzZGV2LT5sdW4pOwogCiAJY29weV9pbmZvKGluZm8sICJcdFx0Q29tbWFuZHMgUXVldWVkICVsZFxuIiwgZGV2LT5jb21tYW5kc19pc3N1ZWQpOwogCWNvcHlfaW5mbyhpbmZvLCAiXHRcdENvbW1hbmRzIEFjdGl2ZSAlZFxuIiwgZGV2LT5hY3RpdmUpOwpAQCAtMjc4LDM2ICszMjUsMTYgQEAKICAqIFJldHVybiBpbmZvcm1hdGlvbiB0byBoYW5kbGUgL3Byb2Mgc3VwcG9ydCBmb3IgdGhlIGRyaXZlci4KICAqLwogaW50Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi1haGRfbGludXhfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCi0JCSAgICBpbnQgbGVuZ3RoLCBpbnQgaG9zdG5vLCBpbnQgaW5vdXQpCi0jZWxzZQogYWhkX2xpbnV4X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsCiAJCSAgICBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbm91dCkKLSNlbmRpZgogewotCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQgPSAqKHN0cnVjdCBhaGRfc29mdGMgKiopc2hvc3QtPmhvc3RkYXRhOwogCXN0cnVjdAlpbmZvX3N0ciBpbmZvOwogCWNoYXIJYWhkX2luZm9bMjU2XTsKLQl1X2xvbmcJbDsKIAl1X2ludAltYXhfdGFyZzsKIAl1X2ludAlpOwogCWludAlyZXR2YWw7CiAKLQlyZXR2YWwgPSAtRUlOVkFMOwotCWFoZF9saXN0X2xvY2soJmwpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCVRBSUxRX0ZPUkVBQ0goYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgewotCQlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LT5ob3N0X25vID09IGhvc3RubykKLQkJCWJyZWFrOwotCX0KLSNlbHNlCi0JYWhkID0gYWhkX2ZpbmRfc29mdGMoKihzdHJ1Y3QgYWhkX3NvZnRjICoqKXNob3N0LT5ob3N0ZGF0YSk7Ci0jZW5kaWYKLQotCWlmIChhaGQgPT0gTlVMTCkKLQkJZ290byBkb25lOwotCiAJIC8qIEhhcyBkYXRhIGJlZW4gd3JpdHRlbiB0byB0aGUgZmlsZT8gKi8gCiAJaWYgKGlub3V0ID09IFRSVUUpIHsKIAkJcmV0dmFsID0gYWhkX3Byb2Nfd3JpdGVfc2VlcHJvbShhaGQsIGJ1ZmZlciwgbGVuZ3RoKTsKQEAgLTM1Nyw2ICszODQsNSBAQAogCX0KIAlyZXR2YWwgPSBpbmZvLnBvcyA+IGluZm8ub2Zmc2V0ID8gaW5mby5wb3MgLSBpbmZvLm9mZnNldCA6IDA7CiBkb25lOgotCWFoZF9saXN0X3VubG9jaygmbCk7CiAJcmV0dXJuIChyZXR2YWwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5oCmluZGV4IDA4OGNiYzIuLjkxZDI5NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LmgKQEAgLTM3LDcgKzM3LDcgQEAKICAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICoKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5oIzc5ICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5oIzg1ICQKICAqCiAgKiAkRnJlZUJTRCQKICAqLwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJICovCiAJQUhDX0FJQzc4NTBfRkUJPSBBSENfU1BJT0NBUHxBSENfQVVUT1BBVVNFfEFIQ19UQVJHRVRNT0RFfEFIQ19VTFRSQSwKIAlBSENfQUlDNzg2MF9GRQk9IEFIQ19BSUM3ODUwX0ZFLAotCUFIQ19BSUM3ODcwX0ZFCT0gQUhDX1RBUkdFVE1PREUsCisJQUhDX0FJQzc4NzBfRkUJPSBBSENfVEFSR0VUTU9ERXxBSENfQVVUT1BBVVNFLAogCUFIQ19BSUM3ODgwX0ZFCT0gQUhDX0FJQzc4NzBfRkV8QUhDX1VMVFJBLAogCS8qCiAJICogQWx0aG91Z2ggd2UgaGF2ZSBzcGFjZSBmb3IgYm90aCB0aGUgaW5pdGlhdG9yIGFuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5yZWcgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LnJlZwppbmRleCA4MTBlYzcwLi5lMTk2ZDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LnJlZworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LnJlZwpAQCAtMzksNyArMzksNyBAQAogICoKICAqICRGcmVlQlNEJAogICovCi1WRVJTSU9OID0gIiRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5yZWcjMzkgJCIKK1ZFUlNJT04gPSAiJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnJlZyM0MCAkIgogCiAvKgogICogVGhpcyBmaWxlIGlzIHByb2Nlc3NlZCBieSB0aGUgYWljN3h4eF9hc20gdXRpbGl0eSBmb3IgdXNlIGluIGFzc2VtYmxpbmcKQEAgLTEzMDYsNyArMTMwNiw2IEBACiAJICovCiAJTVdJX1JFU0lEVUFMIHsKIAkJc2l6ZQkJMQotCQlhbGlhcwlUQVJHX0lNTUVESUFURV9TQ0IKIAl9CiAJLyoKIAkgKiBTQ0JJRCBvZiB0aGUgbmV4dCBTQ0IgdG8gYmUgc3RhcnRlZCBieSB0aGUgY29udHJvbGxlci4KQEAgLTE0NjEsNiArMTQ2MCw3IEBACiAJICovCiAJTEFTVF9NU0cgewogCQlzaXplCQkxCisJCWFsaWFzCVRBUkdfSU1NRURJQVRFX1NDQgogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LnNlcSBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguc2VxCmluZGV4IGQ4NGI3NDEuLjE1MTk2MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguc2VxCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguc2VxCkBAIC00MCw3ICs0MCw3IEBACiAgKiAkRnJlZUJTRCQKICAqLwogCi1WRVJTSU9OID0gIiRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5zZXEjNTYgJCIKK1ZFUlNJT04gPSAiJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnNlcSM1OCAkIgogUEFUQ0hfQVJHX0xJU1QgPSAic3RydWN0IGFoY19zb2Z0YyAqYWhjIgogUFJFRklYID0gImFoY18iCiAKQEAgLTY3OSw2ICs2NzksNyBAQAogCQljbHIJU0NTSUJVU0w7CS8qIFByZXZlbnQgYml0IGxlYWthZ2UgZHVyaW50IFNFTFRPICovCiAJfQogCWFuZAlTWEZSQ1RMMCwgflNQSU9FTjsKKwltdmkJU0VRX0ZMQUdTLCBOT1RfSURFTlRJRklFRHxOT19DREJfU0VOVDsKIAl0ZXN0CVNTVEFUMSxSRVFJTklUfEJVU0ZSRUUJanogLjsKIAl0ZXN0CVNTVEFUMSwgQlVTRlJFRSBqbnogcG9sbF9mb3Jfd29yazsKIAltdmkJTUlTU0VEX0JVU0ZSRUUgY2FsbCBzZXRfc2VxaW50OwpAQCAtMTA5Nyw3ICsxMDk4LDcgQEAKIAkJdGVzdAlTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0dfTEFTVF9TRUcganogZG1hX21pZF9zZzsKIAkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApIHsKIAkJCXRlc3QJU1NUQVQwLCBUQVJHRVQganogZG1hX2xhc3Rfc2c7Ci0JCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVE1PREVfV0lERU9ERF9CVUcpICE9IDApIHsKKwkJCWlmICgoYWhjLT5idWdzICYgQUhDX1RNT0RFX1dJREVPRERfQlVHKSAhPSAwKSB7CiAJCQkJdGVzdAlETUFQQVJBTVMsIERJUkVDVElPTiBqeiBkbWFfbWlkX3NnOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4XzkzY3g2LmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4XzkzY3g2LmMKaW5kZXggNDY4ZDYxMi4uM2NiMDdlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF85M2N4Ni5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfOTNjeDYuYwpAQCAtMjgsOSArMjgsNyBAQAogICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogICogU1VDSCBEQU1BR0UuCiAgKgotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4XzkzY3g2LmMjMTcgJAotICoKLSAqICRGcmVlQlNEJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4XzkzY3g2LmMjMTkgJAogICovCiAKIC8qCkBAIC02NCw3ICs2Miw2IEBACiAgKiAgIGlzIHByZWNlZGVkIGJ5IGFuIGluaXRpYWwgemVybyAobGVhZGluZyAwLCBmb2xsb3dlZCBieSAxNi1iaXRzLCBNU0IKICAqICAgZmlyc3QpLiAgVGhlIGNsb2NrIGN5Y2xpbmcgZnJvbSBsb3cgdG8gaGlnaCBpbml0aWF0ZXMgdGhlIG5leHQgZGF0YQogICogICBiaXQgdG8gYmUgc2VudCBmcm9tIHRoZSBjaGlwLgotICoKICAqLwogCiAjaWZkZWYgX19saW51eF9fCkBAIC04MSwxNCArNzgsMjIgQEAKICAqIFJpZ2h0IG5vdywgd2Ugb25seSBoYXZlIHRvIHJlYWQgdGhlIFNFRVBST00uICBCdXQgd2UgbWFrZSBpdCBlYXNpZXIgdG8KICAqIGFkZCBvdGhlciA5M0N4NiBmdW5jdGlvbnMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2VlcHJvbV9jbWQgeworc3RydWN0IHNlZXByb21fY21kIHsKICAgCXVpbnQ4X3QgbGVuOwotIAl1aW50OF90IGJpdHNbOV07Ci19IHNlZXByb21fcmVhZCA9IHszLCB7MSwgMSwgMH19OworIAl1aW50OF90IGJpdHNbMTFdOworfTsKIAorLyogU2hvcnQgb3Bjb2RlcyBmb3IgdGhlIGM0NiAqLwogc3RhdGljIHN0cnVjdCBzZWVwcm9tX2NtZCBzZWVwcm9tX2V3ZW4gPSB7OSwgezEsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDB9fTsKIHN0YXRpYyBzdHJ1Y3Qgc2VlcHJvbV9jbWQgc2VlcHJvbV9ld2RzID0gezksIHsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfX07CisKKy8qIExvbmcgb3Bjb2RlcyBmb3IgdGhlIEM1Ni9DNjYgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VlcHJvbV9jbWQgc2VlcHJvbV9sb25nX2V3ZW4gPSB7MTEsIHsxLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwfX07CitzdGF0aWMgc3RydWN0IHNlZXByb21fY21kIHNlZXByb21fbG9uZ19ld2RzID0gezExLCB7MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH19OworCisvKiBDb21tb24gb3Bjb2RlcyAqLwogc3RhdGljIHN0cnVjdCBzZWVwcm9tX2NtZCBzZWVwcm9tX3dyaXRlID0gezMsIHsxLCAwLCAxfX07CitzdGF0aWMgc3RydWN0IHNlZXByb21fY21kIHNlZXByb21fcmVhZCAgPSB7MywgezEsIDEsIDB9fTsKIAogLyoKICAqIFdhaXQgZm9yIHRoZSBTRUVSRFkgdG8gZ28gaGlnaDsgYWJvdXQgODAwIG5zLgpAQCAtMjIyLDEyICsyMjcsMjUgQEAKIGFoY193cml0ZV9zZWVwcm9tKHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkLCB1aW50MTZfdCAqYnVmLAogCQkgIHVfaW50IHN0YXJ0X2FkZHIsIHVfaW50IGNvdW50KQogeworCXN0cnVjdCBzZWVwcm9tX2NtZCAqZXdlbiwgKmV3ZHM7CiAJdWludDE2X3QgdjsKIAl1aW50OF90IHRlbXA7CiAJaW50IGksIGs7CiAKIAkvKiBQbGFjZSB0aGUgY2hpcCBpbnRvIHdyaXRlLWVuYWJsZSBtb2RlICovCi0Jc2VuZF9zZWVwcm9tX2NtZChzZCwgJnNlZXByb21fZXdlbik7CisJaWYgKHNkLT5zZF9jaGlwID09IEM0NikgeworCQlld2VuID0gJnNlZXByb21fZXdlbjsKKwkJZXdkcyA9ICZzZWVwcm9tX2V3ZHM7CisJfSBlbHNlIGlmIChzZC0+c2RfY2hpcCA9PSBDNTZfNjYpIHsKKwkJZXdlbiA9ICZzZWVwcm9tX2xvbmdfZXdlbjsKKwkJZXdkcyA9ICZzZWVwcm9tX2xvbmdfZXdkczsKKwl9IGVsc2UgeworCQlwcmludGYoImFoY193cml0ZV9zZWVwcm9tOiB1bnN1cHBvcnRlZCBzZWVwcm9tIHR5cGUgJWRcbiIsCisJCSAgICAgICBzZC0+c2RfY2hpcCk7CisJCXJldHVybiAoMCk7CisJfQorCisJc2VuZF9zZWVwcm9tX2NtZChzZCwgZXdlbik7CiAJcmVzZXRfc2VlcHJvbShzZCk7CiAKIAkvKiBXcml0ZSBhbGwgcmVxdWVzdGVkIGRhdGEgb3V0IHRvIHRoZSBzZWVwcm9tLiAqLwpAQCAtMjc3LDcgKzI5NSw3IEBACiAJfQogCiAJLyogUHV0IHRoZSBjaGlwIGJhY2sgaW50byB3cml0ZS1wcm90ZWN0IG1vZGUgKi8KLQlzZW5kX3NlZXByb21fY21kKHNkLCAmc2VlcHJvbV9ld2RzKTsKKwlzZW5kX3NlZXByb21fY21kKHNkLCBld2RzKTsKIAlyZXNldF9zZWVwcm9tKHNkKTsKIAogCXJldHVybiAoMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfY29yZS5jCmluZGV4IDdiYzAxZTQuLjU4YWM0NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfY29yZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfY29yZS5jCkBAIC0zNyw5ICszNyw3IEBACiAgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqCi0gKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHguYyMxMzQgJAotICoKLSAqICRGcmVlQlNEJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LmMjMTU1ICQKICAqLwogCiAjaWZkZWYgX19saW51eF9fCkBAIC0yODcsMTAgKzI4NSwxOSBAQAogCQlhaGNfb3V0YihhaGMsIFNFUV9GTEFHUzIsCiAJCQkgYWhjX2luYihhaGMsIFNFUV9GTEFHUzIpICYgflNDQl9ETUEpOwogCX0KKworCS8qCisJICogQ2xlYXIgYW55IHBlbmRpbmcgc2VxdWVuY2VyIGludGVycnVwdC4gIEl0IGlzIG5vCisJICogbG9uZ2VyIHJlbGV2YW50IHNpbmNlIHdlJ3JlIHJlc2V0dGluZyB0aGUgUHJvZ3JhbQorCSAqIENvdW50ZXIuCisJICovCisJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlNFUUlOVCk7CisKIAlhaGNfb3V0YihhaGMsIE1XSV9SRVNJRFVBTCwgMCk7CiAJYWhjX291dGIoYWhjLCBTRVFDVEwsIGFoYy0+c2VxY3RsKTsKIAlhaGNfb3V0YihhaGMsIFNFUUFERFIwLCAwKTsKIAlhaGNfb3V0YihhaGMsIFNFUUFERFIxLCAwKTsKKwogCWFoY191bnBhdXNlKGFoYyk7CiB9CiAKQEAgLTExNzQsMTkgKzExODEsMjAgQEAKIAkJCQkgICAgICAgc2NiX2luZGV4KTsKIAkJCX0KICNlbmRpZgotCQkJLyoKLQkJCSAqIEZvcmNlIGEgcmVuZWdvdGlhdGlvbiB3aXRoIHRoaXMgdGFyZ2V0IGp1c3QgaW4KLQkJCSAqIGNhc2UgdGhlIGNhYmxlIHdhcyBwdWxsZWQgYW5kIHdpbGwgbGF0ZXIgYmUKLQkJCSAqIHJlLWF0dGFjaGVkLiAgVGhlIHRhcmdldCBtYXkgZm9yZ2V0IGl0cyBuZWdvdGlhdGlvbgotCQkJICogc2V0dGluZ3Mgd2l0aCB1cyBzaG91bGQgaXQgYXR0ZW1wdCB0byByZXNlbGVjdAotCQkJICogZHVyaW5nIHRoZSBpbnRlcnJ1cHRpb24uICBUaGUgdGFyZ2V0IHdpbGwgbm90IGlzc3VlCi0JCQkgKiBhIHVuaXQgYXR0ZW50aW9uIGluIHRoaXMgY2FzZSwgc28gd2UgbXVzdCBhbHdheXMKLQkJCSAqIHJlbmVnb3RpYXRlLgotCQkJICovCiAJCQlhaGNfc2NiX2RldmluZm8oYWhjLCAmZGV2aW5mbywgc2NiKTsKLQkJCWFoY19mb3JjZV9yZW5lZ290aWF0aW9uKGFoYywgJmRldmluZm8pOwogCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fU0VMX1RJTUVPVVQpOwogCQkJYWhjX2ZyZWV6ZV9kZXZxKGFoYywgc2NiKTsKKworCQkJLyoKKwkJCSAqIENhbmNlbCBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMgb24gdGhlIGRldmljZQorCQkJICogbm93IHRoYXQgaXQgc2VlbXMgdG8gYmUgbWlzc2luZy4gIFRoaXMgd2lsbAorCQkJICogYWxzbyByZXZlcnQgdXMgdG8gYXN5bmMvbmFycm93IHRyYW5zZmVycyB1bnRpbAorCQkJICogd2UgY2FuIHJlbmVnb3RpYXRlIHdpdGggdGhlIGRldmljZS4KKwkJCSAqLworCQkJYWhjX2hhbmRsZV9kZXZyZXNldChhaGMsICZkZXZpbmZvLAorCQkJCQkgICAgQ0FNX1NFTF9USU1FT1VULAorCQkJCQkgICAgIlNlbGVjdGlvbiBUaW1lb3V0IiwKKwkJCQkJICAgIC8qdmVyYm9zZV9sZXZlbCovMSk7CiAJCX0KIAkJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlNDU0lJTlQpOwogCQlhaGNfcmVzdGFydChhaGMpOwpAQCAtMzc2Myw4ICszNzcxLDkgQEAKIAkJCSAvKnBlcmlvZCovMCwgLypvZmZzZXQqLzAsIC8qcHByX29wdGlvbnMqLzAsCiAJCQkgQUhDX1RSQU5TX0NVUiwgLypwYXVzZWQqL1RSVUUpOwogCQotCWFoY19zZW5kX2FzeW5jKGFoYywgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAotCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgQUNfU0VOVF9CRFIsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gQ0FNX1NFTF9USU1FT1VUKQorCQlhaGNfc2VuZF9hc3luYyhhaGMsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19TRU5UX0JEUiwgTlVMTCk7CiAKIAlpZiAobWVzc2FnZSAhPSBOVUxMCiAJICYmICh2ZXJib3NlX2xldmVsIDw9IGJvb3R2ZXJib3NlKSkKQEAgLTQwMDMsMTQgKzQwMTIsNiBAQAogCSAqIHRvIGRpc3R1cmIgdGhlIGludGVncml0eSBvZiB0aGUgYnVzLgogCSAqLwogCWFoY19wYXVzZShhaGMpOwotCWlmICgoYWhjX2luYihhaGMsIEhDTlRSTCkgJiBDSElQUlNUKSAhPSAwKSB7Ci0JCS8qCi0JCSAqIFRoZSBjaGlwIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCBzaW5jZQotCQkgKiBQQ0kvRUlTQS9WTEIgYnVzIHJlc2V0LiAgRG9uJ3QgdHJ1c3QKLQkJICogImxlZnQgb3ZlciBCSU9TIGRhdGEiLgotCQkgKi8KLQkJYWhjLT5mbGFncyB8PSBBSENfTk9fQklPU19JTklUOwotCX0KIAlzeGZyY3RsMV9iID0gMDsKIAlpZiAoKGFoYy0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc3NzApIHsKIAkJdV9pbnQgc2Jsa2N0bDsKQEAgLTUwMzYsMTQgKzUwMzcsMjMgQEAKIAlhaGMtPmZsYWdzIHw9IEFIQ19BTExfSU5URVJSVVBUUzsKIAlwYXVzZWQgPSBGQUxTRTsKIAlkbyB7Ci0JCWlmIChwYXVzZWQpCisJCWlmIChwYXVzZWQpIHsKIAkJCWFoY191bnBhdXNlKGFoYyk7CisJCQkvKgorCQkJICogR2l2ZSB0aGUgc2VxdWVuY2VyIHNvbWUgdGltZSB0byBzZXJ2aWNlCisJCQkgKiBhbnkgYWN0aXZlIHNlbGVjdGlvbnMuCisJCQkgKi8KKwkJCWFoY19kZWxheSg1MDApOworCQl9CiAJCWFoY19pbnRyKGFoYyk7CiAJCWFoY19wYXVzZShhaGMpOwogCQlwYXVzZWQgPSBUUlVFOwogCQlhaGNfb3V0YihhaGMsIFNDU0lTRVEsIGFoY19pbmIoYWhjLCBTQ1NJU0VRKSAmIH5FTlNFTE8pOwotCQlhaGNfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihhaGMpOwogCQlpbnRzdGF0ID0gYWhjX2luYihhaGMsIElOVFNUQVQpOworCQlpZiAoKGludHN0YXQgJiBJTlRfUEVORCkgPT0gMCkgeworCQkJYWhjX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oYWhjKTsKKwkJCWludHN0YXQgPSBhaGNfaW5iKGFoYywgSU5UU1RBVCk7CisJCX0KIAl9IHdoaWxlICgtLW1heGxvb3BzCiAJICAgICAgJiYgKGludHN0YXQgIT0gMHhGRiB8fCAoYWhjLT5mZWF0dXJlcyAmIEFIQ19SRU1PVkFCTEUpID09IDApCiAJICAgICAgJiYgKChpbnRzdGF0ICYgSU5UX1BFTkQpICE9IDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jCmluZGV4IDY4N2YxOWUuLmM5MzJiM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYwpAQCAtMTI1LDEyICsxMjUsNiBAQAogCiBzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICphaGNfbGludXhfdHJhbnNwb3J0X3RlbXBsYXRlID0gTlVMTDsKIAotLyoKLSAqIEluY2x1ZGUgYWljbGliLmMgYXMgcGFydCBvZiBvdXIKLSAqICJtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBoYXJkIiB3b3JrIGFyb3VuZC4KLSAqLwotI2luY2x1ZGUgImFpY2xpYi5jIgotCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogX19zZXR1cCAqLwogI2luY2x1ZGUgPGxpbnV4L21tLmg+CQkvKiBGb3IgZmV0Y2hpbmcgc3lzdGVtIG1lbW9yeSBzaXplICovCiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CQkvKiBGb3IgYmxvY2tfc2l6ZSgpICovCkBAIC0zOTEsNyArMzg1LDYgQEAKIAkJCQkgc3RydWN0IGFoY19saW51eF9kZXZpY2UgKiwKIAkJCQkgc3RydWN0IHNjc2lfY21uZCAqKTsKIHN0YXRpYyB2b2lkIGFoY19saW51eF9zZXR1cF90YWdfaW5mb19nbG9iYWwoY2hhciAqcCk7Ci1zdGF0aWMgYWljX29wdGlvbl9jYWxsYmFja190IGFoY19saW51eF9zZXR1cF90YWdfaW5mbzsKIHN0YXRpYyBpbnQgIGFpYzd4eHhfc2V0dXAoY2hhciAqcyk7CiAKIHN0YXRpYyBpbnQgYWhjX2xpbnV4X3VuaXQ7CkBAIC02MzUsNiArNjI4LDggQEAKIAkKIAl0YXJnLT5zZGV2W3NkZXYtPmx1bl0gPSBzZGV2OwogCisJc3BpX3BlcmlvZChzdGFyZ2V0KSA9IDA7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTE4LDYgKzkxMyw4NiBAQAogCX0KIH0KIAorc3RhdGljIGNoYXIgKgorYWhjX3BhcnNlX2JyYWNlX29wdGlvbihjaGFyICpvcHRfbmFtZSwgY2hhciAqb3B0X2FyZywgY2hhciAqZW5kLCBpbnQgZGVwdGgsCisJCSAgICAgICB2b2lkICgqY2FsbGJhY2spKHVfbG9uZywgaW50LCBpbnQsIGludDMyX3QpLAorCQkgICAgICAgdV9sb25nIGNhbGxiYWNrX2FyZykKK3sKKwljaGFyCSp0b2tfZW5kOworCWNoYXIJKnRva19lbmQyOworCWludCAgICAgIGk7CisJaW50ICAgICAgaW5zdGFuY2U7CisJaW50CSB0YXJnOworCWludAkgZG9uZTsKKwljaGFyCSB0b2tfbGlzdFtdID0geycuJywgJywnLCAneycsICd9JywgJ1wwJ307CisKKwkvKiBBbGwgb3B0aW9ucyB1c2UgYSAnOicgbmFtZS9hcmcgc2VwYXJhdG9yICovCisJaWYgKCpvcHRfYXJnICE9ICc6JykKKwkJcmV0dXJuIChvcHRfYXJnKTsKKwlvcHRfYXJnKys7CisJaW5zdGFuY2UgPSAtMTsKKwl0YXJnID0gLTE7CisJZG9uZSA9IEZBTFNFOworCS8qCisJICogUmVzdG9yZSBzZXBhcmF0b3IgdGhhdCBtYXkgYmUgaW4KKwkgKiB0aGUgbWlkZGxlIG9mIG91ciBvcHRpb24gYXJndW1lbnQuCisJICovCisJdG9rX2VuZCA9IHN0cmNocihvcHRfYXJnLCAnXDAnKTsKKwlpZiAodG9rX2VuZCA8IGVuZCkKKwkJKnRva19lbmQgPSAnLCc7CisJd2hpbGUgKCFkb25lKSB7CisJCXN3aXRjaCAoKm9wdF9hcmcpIHsKKwkJY2FzZSAneyc6CisJCQlpZiAoaW5zdGFuY2UgPT0gLTEpIHsKKwkJCQlpbnN0YW5jZSA9IDA7CisJCQl9IGVsc2UgeworCQkJCWlmIChkZXB0aCA+IDEpIHsKKwkJCQkJaWYgKHRhcmcgPT0gLTEpCisJCQkJCQl0YXJnID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGYoIk1hbGZvcm1lZCBPcHRpb24gJXNcbiIsCisJCQkJCSAgICAgICBvcHRfbmFtZSk7CisJCQkJCWRvbmUgPSBUUlVFOworCQkJCX0KKwkJCX0KKwkJCW9wdF9hcmcrKzsKKwkJCWJyZWFrOworCQljYXNlICd9JzoKKwkJCWlmICh0YXJnICE9IC0xKQorCQkJCXRhcmcgPSAtMTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlICE9IC0xKQorCQkJCWluc3RhbmNlID0gLTE7CisJCQlvcHRfYXJnKys7CisJCQlicmVhazsKKwkJY2FzZSAnLCc6CisJCWNhc2UgJy4nOgorCQkJaWYgKGluc3RhbmNlID09IC0xKQorCQkJCWRvbmUgPSBUUlVFOworCQkJZWxzZSBpZiAodGFyZyA+PSAwKQorCQkJCXRhcmcrKzsKKwkJCWVsc2UgaWYgKGluc3RhbmNlID49IDApCisJCQkJaW5zdGFuY2UrKzsKKwkJCW9wdF9hcmcrKzsKKwkJCWJyZWFrOworCQljYXNlICdcMCc6CisJCQlkb25lID0gVFJVRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdG9rX2VuZCA9IGVuZDsKKwkJCWZvciAoaSA9IDA7IHRva19saXN0W2ldOyBpKyspIHsKKwkJCQl0b2tfZW5kMiA9IHN0cmNocihvcHRfYXJnLCB0b2tfbGlzdFtpXSk7CisJCQkJaWYgKCh0b2tfZW5kMikgJiYgKHRva19lbmQyIDwgdG9rX2VuZCkpCisJCQkJCXRva19lbmQgPSB0b2tfZW5kMjsKKwkJCX0KKwkJCWNhbGxiYWNrKGNhbGxiYWNrX2FyZywgaW5zdGFuY2UsIHRhcmcsCisJCQkJIHNpbXBsZV9zdHJ0b2wob3B0X2FyZywgTlVMTCwgMCkpOworCQkJb3B0X2FyZyA9IHRva19lbmQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKG9wdF9hcmcpOworfQorCiAvKgogICogSGFuZGxlIExpbnV4IGJvb3QgcGFyYW1ldGVycy4gVGhpcyByb3V0aW5lIGFsbG93cyBmb3IgYXNzaWduaW5nIGEgdmFsdWUKICAqIHRvIGEgcGFyYW1ldGVyIHdpdGggYSAnOicgYmV0d2VlbiB0aGUgcGFyYW1ldGVyIGFuZCB0aGUgdmFsdWUuCkBAIC05NzIsNyArMTA0Nyw3IEBACiAJCWlmIChzdHJuY21wKHAsICJnbG9iYWxfdGFnX2RlcHRoIiwgbikgPT0gMCkgewogCQkJYWhjX2xpbnV4X3NldHVwX3RhZ19pbmZvX2dsb2JhbChwICsgbik7CiAJCX0gZWxzZSBpZiAoc3RybmNtcChwLCAidGFnX2luZm8iLCBuKSA9PSAwKSB7Ci0JCQlzID0gYWljX3BhcnNlX2JyYWNlX29wdGlvbigidGFnX2luZm8iLCBwICsgbiwgZW5kLAorCQkJcyA9IGFoY19wYXJzZV9icmFjZV9vcHRpb24oInRhZ19pbmZvIiwgcCArIG4sIGVuZCwKIAkJCSAgICAyLCBhaGNfbGludXhfc2V0dXBfdGFnX2luZm8sIDApOwogCQl9IGVsc2UgaWYgKHBbbl0gPT0gJzonKSB7CiAJCQkqKG9wdGlvbnNbaV0uZmxhZykgPSBzaW1wbGVfc3RydG91bChwICsgbiArIDEsIE5VTEwsIDApOwpAQCAtMTYxMiw5ICsxNjg3LDkgQEAKIAkJaWYgKGNoYW5uZWwgPT0gJ0InKQogCQkJdGFyZ2V0X29mZnNldCArPSA4OwogCQlzdGFyZ2V0ID0gYWhjLT5wbGF0Zm9ybV9kYXRhLT5zdGFyZ2V0W3RhcmdldF9vZmZzZXRdOwotCQl0YXJnID0gc2NzaV90cmFuc3BvcnRfdGFyZ2V0X2RhdGEoc3RhcmdldCk7Ci0JCWlmICh0YXJnID09IE5VTEwpCisJCWlmIChzdGFyZ2V0ID09IE5VTEwpCiAJCQlicmVhazsKKwkJdGFyZyA9IHNjc2lfdHJhbnNwb3J0X3RhcmdldF9kYXRhKHN0YXJnZXQpOwogCiAJCXRhcmdldF9wcHJfb3B0aW9ucyA9CiAJCQkoc3BpX2R0KHN0YXJnZXQpID8gTVNHX0VYVF9QUFJfRFRfUkVRIDogMCkKQEAgLTIzMjksOCArMjQwNCw2IEBACiB7CiB9CiAKLXN0YXRpYyB2b2lkIGFoY19saW51eF9leGl0KHZvaWQpOwotCiBzdGF0aWMgdm9pZCBhaGNfbGludXhfc2V0X3dpZHRoKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IHdpZHRoKQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgKaW5kZXggMGU0N2FjMi4uYzUyOTk2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5oCkBAIC0yNjUsNyArMjY1LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTTVAgc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAotI2RlZmluZSBBSUM3WFhYX0RSSVZFUl9WRVJTSU9OICI2LjIuMzYiCisjZGVmaW5lIEFJQzdYWFhfRFJJVkVSX1ZFUlNJT04gIjcuMCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXZpY2UgRGF0YSBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbV9wY2kuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtX3BjaS5jCmluZGV4IDlkMzE4Y2UuLjBkNDRhNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtX3BjaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtX3BjaS5jCkBAIC0xNDksNiArMTQ5LDI3IEBACiAJYWhjX2ZyZWUoYWhjKTsKIH0KIAorc3RhdGljIHZvaWQKK2FoY19saW51eF9wY2lfaW5oZXJpdF9mbGFncyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhaGMtPmRldl9zb2Z0YywgKm1hc3Rlcl9wZGV2OworCXVuc2lnbmVkIGludCBtYXN0ZXJfZGV2Zm4gPSBQQ0lfREVWRk4oUENJX1NMT1QocGRldi0+ZGV2Zm4pLCAwKTsKKworCW1hc3Rlcl9wZGV2ID0gcGNpX2dldF9zbG90KHBkZXYtPmJ1cywgbWFzdGVyX2RldmZuKTsKKwlpZiAobWFzdGVyX3BkZXYpIHsKKwkJc3RydWN0IGFoY19zb2Z0YyAqbWFzdGVyID0gcGNpX2dldF9kcnZkYXRhKG1hc3Rlcl9wZGV2KTsKKwkJaWYgKG1hc3RlcikgeworCQkJYWhjLT5mbGFncyAmPSB+QUhDX0JJT1NfRU5BQkxFRDsgCisJCQlhaGMtPmZsYWdzIHw9IG1hc3Rlci0+ZmxhZ3MgJiBBSENfQklPU19FTkFCTEVEOworCisJCQlhaGMtPmZsYWdzICY9IH5BSENfUFJJTUFSWV9DSEFOTkVMOyAKKwkJCWFoYy0+ZmxhZ3MgfD0gbWFzdGVyLT5mbGFncyAmIEFIQ19QUklNQVJZX0NIQU5ORUw7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICJhaWM3eHh4OiBubyBtdWx0aWNoYW5uZWwgcGVlciBmb3VuZCFcbiIpOworCQlwY2lfZGV2X3B1dChtYXN0ZXJfcGRldik7CisJfSAKK30KKwogc3RhdGljIGludAogYWhjX2xpbnV4X3BjaV9kZXZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC0yMDMsNiArMjI0LDE0IEBACiAJCWFoY19mcmVlKGFoYyk7CiAJCXJldHVybiAoLWVycm9yKTsKIAl9CisKKwkvKgorCSAqIFNlY29uZCBGdW5jdGlvbiBQQ0kgZGV2aWNlcyBuZWVkIHRvIGluaGVyaXQgc29tZQorCSAqIHNldHRpbmdzIGZyb20gZnVuY3Rpb24gMC4KKwkgKi8KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTVVMVElfRlVOQykgJiYgUENJX0ZVTkMocGRldi0+ZGV2Zm4pICE9IDApCisJCWFoY19saW51eF9wY2lfaW5oZXJpdF9mbGFncyhhaGMpOworCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFoYyk7CiAJYWhjX2xpbnV4X3JlZ2lzdGVyX2hvc3QoYWhjLCAmYWljN3h4eF9kcml2ZXJfdGVtcGxhdGUpOwogCXJldHVybiAoMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3Byb2MuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcHJvYy5jCmluZGV4IDM4MDJjOTEuLjA0YTM1MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcHJvYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcHJvYy5jCkBAIC01NCw2ICs1NCw0OSBAQAogc3RhdGljIGludAlhaGNfcHJvY193cml0ZV9zZWVwcm9tKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKIAkJCQkgICAgICAgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKTsKIAorLyoKKyAqIFRhYmxlIG9mIHN5bmNyYXRlcyB0aGF0IGRvbid0IGZvbGxvdyB0aGUgImRpdmlzaWJsZSBieSA0IgorICogcnVsZS4gVGhpcyB0YWJsZSB3aWxsIGJlIGV4cGFuZGVkIGluIGZ1dHVyZSBTQ1NJIHNwZWNzLgorICovCitzdGF0aWMgc3RydWN0IHsKKwl1X2ludCBwZXJpb2RfZmFjdG9yOworCXVfaW50IHBlcmlvZDsJLyogaW4gMTAwdGhzIG9mIG5zICovCit9IHNjc2lfc3luY3JhdGVzW10gPSB7CisJeyAweDA4LCA2MjUgfSwJLyogRkFTVC0xNjAgKi8KKwl7IDB4MDksIDEyNTAgfSwJLyogRkFTVC04MCAqLworCXsgMHgwYSwgMjUwMCB9LAkvKiBGQVNULTQwIDQwTUh6ICovCisJeyAweDBiLCAzMDMwIH0sCS8qIEZBU1QtNDAgMzNNSHogKi8KKwl7IDB4MGMsIDUwMDAgfQkvKiBGQVNULTIwICovCit9OworCisvKgorICogUmV0dXJuIHRoZSBmcmVxdWVuY3kgaW4ga0h6IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCisgKiBzeW5jIHBlcmlvZCBmYWN0b3IuCisgKi8KK3N0YXRpYyB1X2ludAorYWhjX2NhbGNfc3luY3NyYXRlKHVfaW50IHBlcmlvZF9mYWN0b3IpCit7CisJaW50IGk7CisJaW50IG51bV9zeW5jcmF0ZXM7CisKKwludW1fc3luY3JhdGVzID0gc2l6ZW9mKHNjc2lfc3luY3JhdGVzKSAvIHNpemVvZihzY3NpX3N5bmNyYXRlc1swXSk7CisJLyogU2VlIGlmIHRoZSBwZXJpb2QgaXMgaW4gdGhlICJleGNlcHRpb24iIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IG51bV9zeW5jcmF0ZXM7IGkrKykgeworCisJCWlmIChwZXJpb2RfZmFjdG9yID09IHNjc2lfc3luY3JhdGVzW2ldLnBlcmlvZF9mYWN0b3IpIHsKKwkJCS8qIFBlcmlvZCBpbiBrSHogKi8KKwkJCXJldHVybiAoMTAwMDAwMDAwIC8gc2NzaV9zeW5jcmF0ZXNbaV0ucGVyaW9kKTsKKwkJfQorCX0KKworCS8qCisJICogV2Fzbid0IGluIHRoZSB0YWJsZSwgc28gdXNlIHRoZSBzdGFuZGFyZAorCSAqIDQgdGltZXMgY29udmVyc2lvbi4KKwkgKi8KKwlyZXR1cm4gKDEwMDAwMDAwIC8gKHBlcmlvZF9mYWN0b3IgKiA0ICogMTApKTsKK30KKworCiBzdGF0aWMgdm9pZAogY29weV9tZW1faW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmRhdGEsIGludCBsZW4pCiB7CkBAIC0xMDYsNyArMTQ5LDcgQEAKICAgICAgICAgc3BlZWQgPSAzMzAwOwogICAgICAgICBmcmVxID0gMDsKIAlpZiAodGluZm8tPm9mZnNldCAhPSAwKSB7Ci0JCWZyZXEgPSBhaWNfY2FsY19zeW5jc3JhdGUodGluZm8tPnBlcmlvZCk7CisJCWZyZXEgPSBhaGNfY2FsY19zeW5jc3JhdGUodGluZm8tPnBlcmlvZCk7CiAJCXNwZWVkID0gZnJlcTsKIAl9CiAJc3BlZWQgKj0gKDB4MDEgPDwgdGluZm8tPndpZHRoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcmVnLmhfc2hpcHBlZCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcmVnLmhfc2hpcHBlZAppbmRleCA3YzEzOTBlLi4yY2UxZmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3JlZy5oX3NoaXBwZWQKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9yZWcuaF9zaGlwcGVkCkBAIC0yLDggKzIsOCBAQAogICogRE8gTk9UIEVESVQgLSBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKICAqCQkgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZSBmaWxlczoKICAqCi0gKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHguc2VxIzU2ICQKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5yZWcjMzkgJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnNlcSM1OCAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHgucmVnIzQwICQKICAqLwogdHlwZWRlZiBpbnQgKGFoY19yZWdfcHJpbnRfdCkodV9pbnQsIHVfaW50ICosIHVfaW50KTsKIHR5cGVkZWYgc3RydWN0IGFoY19yZWdfcGFyc2VfZW50cnkgewpAQCAtMTI5OCw3ICsxMjk4LDYgQEAKICNkZWZpbmUJQ01EU0laRV9UQUJMRV9UQUlMCQkweDM0CiAKICNkZWZpbmUJTVdJX1JFU0lEVUFMICAgIAkJMHgzOAotI2RlZmluZQlUQVJHX0lNTUVESUFURV9TQ0IJCTB4MzgKIAogI2RlZmluZQlORVhUX1FVRVVFRF9TQ0IgCQkweDM5CiAKQEAgLTEzODAsNiArMTM3OSw3IEBACiAjZGVmaW5lCVJFVFVSTl8yICAgICAgICAJCTB4NTIKIAogI2RlZmluZQlMQVNUX01TRyAgICAgICAgCQkweDUzCisjZGVmaW5lCVRBUkdfSU1NRURJQVRFX1NDQgkJMHg1MwogCiAjZGVmaW5lCVNDU0lTRVFfVEVNUExBVEUJCTB4NTQKICNkZWZpbmUJCUVOU0VMTyAgICAgICAgICAJMHg0MApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9yZWdfcHJpbnQuY19zaGlwcGVkIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9yZWdfcHJpbnQuY19zaGlwcGVkCmluZGV4IDljNzEzNzcuLjg4YmZkNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcmVnX3ByaW50LmNfc2hpcHBlZAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3JlZ19wcmludC5jX3NoaXBwZWQKQEAgLTIsOCArMiw4IEBACiAgKiBETyBOT1QgRURJVCAtIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAogICoJCSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlIGZpbGVzOgogICoKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5zZXEjNTYgJAotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnJlZyMzOSAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHguc2VxIzU4ICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5yZWcjNDAgJAogICovCiAKICNpbmNsdWRlICJhaWM3eHh4X29zbS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9zZXEuaF9zaGlwcGVkIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9zZXEuaF9zaGlwcGVkCmluZGV4IGNmNDExMzYuLjRjZWUwODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfc2VxLmhfc2hpcHBlZAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3NlcS5oX3NoaXBwZWQKQEAgLTIsMTMgKzIsMTMgQEAKICAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCiAgKgkJIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2UgZmlsZXM6CiAgKgotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnNlcSM1NiAkCi0gKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHgucmVnIzM5ICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5zZXEjNTggJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnJlZyM0MCAkCiAgKi8KIHN0YXRpYyB1aW50OF90IHNlcXByb2dbXSA9IHsKIAkweGIyLCAweDAwLCAweDAwLCAweDA4LAogCTB4ZjcsIDB4MTEsIDB4MjIsIDB4MDgsCi0JMHgwMCwgMHg2NSwgMHhlYywgMHg1OSwKKwkweDAwLCAweDY1LCAweGVlLCAweDU5LAogCTB4ZjcsIDB4MDEsIDB4MDIsIDB4MDgsCiAJMHhmZiwgMHg2YSwgMHgyNCwgMHgwOCwKIAkweDQwLCAweDAwLCAweDQwLCAweDY4LApAQCAtMjEsMTUgKzIxLDE1IEBACiAJMHgwMSwgMHg0ZCwgMHhjOCwgMHgzMCwKIAkweDAwLCAweDRjLCAweDEyLCAweDcwLAogCTB4MDEsIDB4MzksIDB4YTIsIDB4MzAsCi0JMHgwMCwgMHg2YSwgMHhjMCwgMHg1ZSwKKwkweDAwLCAweDZhLCAweGMyLCAweDVlLAogCTB4MDEsIDB4NTEsIDB4MjAsIDB4MzEsCiAJMHgwMSwgMHg1NywgMHhhZSwgMHgwMCwKIAkweDBkLCAweDZhLCAweDc2LCAweDAwLAotCTB4MDAsIDB4NTEsIDB4MTIsIDB4NWUsCisJMHgwMCwgMHg1MSwgMHgxNCwgMHg1ZSwKIAkweDAxLCAweDUxLCAweGM4LCAweDMwLAogCTB4MDAsIDB4MzksIDB4YzgsIDB4NjAsCiAJMHgwMCwgMHhiYiwgMHgzMCwgMHg3MCwKLQkweGMxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4YzEsIDB4NmEsIDB4ZGEsIDB4NWUsCiAJMHgwMSwgMHhiZiwgMHg3MiwgMHgzMCwKIAkweDAxLCAweDQwLCAweDdlLCAweDMxLAogCTB4MDEsIDB4OTAsIDB4ODAsIDB4MzAsCkBAIC00OSwxMCArNDksMTAgQEAKIAkweDA4LCAweDZhLCAweDc4LCAweDAwLAogCTB4MDEsIDB4NTAsIDB4YzgsIDB4MzAsCiAJMHhlMCwgMHg2YSwgMHhjYywgMHgwMCwKLQkweDQ4LCAweDZhLCAweGZjLCAweDVkLAorCTB4NDgsIDB4NmEsIDB4ZmUsIDB4NWQsCiAJMHgwMSwgMHg2YSwgMHhkYywgMHgwMSwKIAkweDg4LCAweDZhLCAweGNjLCAweDAwLAotCTB4NDgsIDB4NmEsIDB4ZmMsIDB4NWQsCisJMHg0OCwgMHg2YSwgMHhmZSwgMHg1ZCwKIAkweDAxLCAweDZhLCAweDI2LCAweDAxLAogCTB4ZjAsIDB4MTksIDB4N2EsIDB4MDgsCiAJMHgwZiwgMHgxOCwgMHhjOCwgMHgwOCwKQEAgLTkzLDcgKzkzLDcgQEAKIAkweDAwLCAweDY1LCAweDIwLCAweDQxLAogCTB4MDIsIDB4NTcsIDB4YWUsIDB4MDAsCiAJMHgwMCwgMHg2NSwgMHg5ZSwgMHg0MCwKLQkweDYxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4NjEsIDB4NmEsIDB4ZGEsIDB4NWUsCiAJMHgwOCwgMHg1MSwgMHgyMCwgMHg3MSwKIAkweDAyLCAweDBiLCAweGIyLCAweDc4LAogCTB4MDAsIDB4NjUsIDB4YWUsIDB4NDAsCkBAIC0xMDYsNyArMTA2LDcgQEAKIAkweDgwLCAweDNkLCAweDdhLCAweDAwLAogCTB4MjAsIDB4NmEsIDB4MTYsIDB4MDAsCiAJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKLQkweDAwLCAweDY1LCAweGIyLCAweDVlLAorCTB4MDAsIDB4NjUsIDB4YjQsIDB4NWUsCiAJMHgwMCwgMHg2NSwgMHgxMiwgMHg0MCwKIAkweDIwLCAweDExLCAweGQyLCAweDY4LAogCTB4MjAsIDB4NmEsIDB4MTgsIDB4MDAsCkBAIC0xNDAsMjcgKzE0MCwyNyBAQAogCTB4ODAsIDB4MGIsIDB4YzQsIDB4NzksCiAJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKIAkweDAxLCAweGFiLCAweGFjLCAweDMwLAotCTB4ZTQsIDB4NmEsIDB4NmUsIDB4NWQsCisJMHhlNCwgMHg2YSwgMHg3MCwgMHg1ZCwKIAkweDQwLCAweDZhLCAweDE2LCAweDAwLAotCTB4ODAsIDB4M2UsIDB4ODQsIDB4NWQsCisJMHg4MCwgMHgzZSwgMHg4NiwgMHg1ZCwKIAkweDIwLCAweGI4LCAweDE4LCAweDc5LAotCTB4MjAsIDB4NmEsIDB4ODQsIDB4NWQsCi0JMHgwMCwgMHhhYiwgMHg4NCwgMHg1ZCwKKwkweDIwLCAweDZhLCAweDg2LCAweDVkLAorCTB4MDAsIDB4YWIsIDB4ODYsIDB4NWQsCiAJMHgwMSwgMHhhOSwgMHg3OCwgMHgzMCwKIAkweDEwLCAweGI4LCAweDIwLCAweDc5LAotCTB4ZTQsIDB4NmEsIDB4NmUsIDB4NWQsCisJMHhlNCwgMHg2YSwgMHg3MCwgMHg1ZCwKIAkweDAwLCAweDY1LCAweGFlLCAweDQwLAogCTB4MTAsIDB4MDMsIDB4M2MsIDB4NjksCiAJMHgwOCwgMHgzYywgMHg1YSwgMHg2OSwKIAkweDA0LCAweDNjLCAweDkyLCAweDY5LAogCTB4MDIsIDB4M2MsIDB4OTgsIDB4NjksCiAJMHgwMSwgMHgzYywgMHg0NCwgMHg3OSwKLQkweGZmLCAweDZhLCAweDcwLCAweDAwLAorCTB4ZmYsIDB4NmEsIDB4YTYsIDB4MDAsCiAJMHgwMCwgMHg2NSwgMHhhNCwgMHg1OSwKLQkweDAwLCAweDZhLCAweGMwLCAweDVlLAotCTB4ZmYsIDB4MzgsIDB4MzAsIDB4NzEsCisJMHgwMCwgMHg2YSwgMHhjMiwgMHg1ZSwKKwkweGZmLCAweDUzLCAweDMwLCAweDcxLAogCTB4MGQsIDB4NmEsIDB4NzYsIDB4MDAsCi0JMHgwMCwgMHgzOCwgMHgxMiwgMHg1ZSwKKwkweDAwLCAweDUzLCAweDE0LCAweDVlLAogCTB4MDAsIDB4NjUsIDB4ZWEsIDB4NTgsCiAJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKIAkweDAwLCAweDY1LCAweDE4LCAweDQxLApAQCAtMTY4LDEwICsxNjgsMTAgQEAKIAkweDAwLCAweDY1LCAweGYyLCAweDU4LAogCTB4ZmQsIDB4NTcsIDB4YWUsIDB4MDgsCiAJMHgwMCwgMHg2NSwgMHhhZSwgMHg0MCwKLQkweGU0LCAweDZhLCAweDZlLCAweDVkLAorCTB4ZTQsIDB4NmEsIDB4NzAsIDB4NWQsCiAJMHgyMCwgMHgzYywgMHg0YSwgMHg3OSwKLQkweDAyLCAweDZhLCAweDg0LCAweDVkLAotCTB4MDQsIDB4NmEsIDB4ODQsIDB4NWQsCisJMHgwMiwgMHg2YSwgMHg4NiwgMHg1ZCwKKwkweDA0LCAweDZhLCAweDg2LCAweDVkLAogCTB4MDEsIDB4MDMsIDB4NGMsIDB4NjksCiAJMHhmNywgMHgxMSwgMHgyMiwgMHgwOCwKIAkweGZmLCAweDZhLCAweDI0LCAweDA4LApAQCAtMTgyLDEzICsxODIsMTMgQEAKIAkweDgwLCAweDg2LCAweGM4LCAweDA4LAogCTB4MDEsIDB4NGYsIDB4YzgsIDB4MzAsCiAJMHgwMCwgMHg1MCwgMHg2YywgMHg2MSwKLQkweGM0LCAweDZhLCAweDZlLCAweDVkLAorCTB4YzQsIDB4NmEsIDB4NzAsIDB4NWQsCiAJMHg0MCwgMHgzYywgMHg2OCwgMHg3OSwKLQkweDI4LCAweDZhLCAweDg0LCAweDVkLAorCTB4MjgsIDB4NmEsIDB4ODYsIDB4NWQsCiAJMHgwMCwgMHg2NSwgMHg0YywgMHg0MSwKLQkweDA4LCAweDZhLCAweDg0LCAweDVkLAorCTB4MDgsIDB4NmEsIDB4ODYsIDB4NWQsCiAJMHgwMCwgMHg2NSwgMHg0YywgMHg0MSwKLQkweDg0LCAweDZhLCAweDZlLCAweDVkLAorCTB4ODQsIDB4NmEsIDB4NzAsIDB4NWQsCiAJMHgwMCwgMHg2NSwgMHhmMiwgMHg1OCwKIAkweDAxLCAweDY2LCAweGM4LCAweDMwLAogCTB4MDEsIDB4NjQsIDB4ZDgsIDB4MzEsCkBAIC0yMDgsMTYgKzIwOCwxNiBAQAogCTB4ZjcsIDB4M2MsIDB4NzgsIDB4MDgsCiAJMHgwMCwgMHg2NSwgMHgyMCwgMHg0MSwKIAkweDQwLCAweGFhLCAweDdlLCAweDEwLAotCTB4MDQsIDB4YWEsIDB4NmUsIDB4NWQsCi0JMHgwMCwgMHg2NSwgMHg1NiwgMHg0MiwKLQkweGM0LCAweDZhLCAweDZlLCAweDVkLAorCTB4MDQsIDB4YWEsIDB4NzAsIDB4NWQsCisJMHgwMCwgMHg2NSwgMHg1OCwgMHg0MiwKKwkweGM0LCAweDZhLCAweDcwLCAweDVkLAogCTB4YzAsIDB4NmEsIDB4N2UsIDB4MDAsCi0JMHgwMCwgMHhhOCwgMHg4NCwgMHg1ZCwKKwkweDAwLCAweGE4LCAweDg2LCAweDVkLAogCTB4ZTQsIDB4NmEsIDB4MDYsIDB4MDAsCi0JMHgwMCwgMHg2YSwgMHg4NCwgMHg1ZCwKKwkweDAwLCAweDZhLCAweDg2LCAweDVkLAogCTB4MDAsIDB4NjUsIDB4NGMsIDB4NDEsCiAJMHgxMCwgMHgzYywgMHhhOCwgMHg2OSwKLQkweDAwLCAweGJiLCAweDhhLCAweDQ0LAorCTB4MDAsIDB4YmIsIDB4OGMsIDB4NDQsCiAJMHgxOCwgMHg2YSwgMHhkYSwgMHgwMSwKIAkweDAxLCAweDY5LCAweGQ4LCAweDMxLAogCTB4MWMsIDB4NmEsIDB4ZDAsIDB4MDEsCkBAIC0yMjcsMzEgKzIyNywzMiBAQAogCTB4MDEsIDB4OTMsIDB4MjYsIDB4MDEsCiAJMHgwMywgMHg2YSwgMHgyYSwgMHgwMSwKIAkweDAxLCAweDY5LCAweDMyLCAweDMxLAotCTB4MWMsIDB4NmEsIDB4ZTAsIDB4NWQsCisJMHgxYywgMHg2YSwgMHhlMiwgMHg1ZCwKIAkweDBhLCAweDkzLCAweDI2LCAweDAxLAotCTB4MDAsIDB4NjUsIDB4YTgsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHhhYSwgMHg1ZSwKIAkweDAxLCAweDUwLCAweGEwLCAweDE4LAogCTB4MDIsIDB4NmEsIDB4MjIsIDB4MDUsCiAJMHgxYSwgMHgwMSwgMHgwMiwgMHgwMCwKIAkweDgwLCAweDZhLCAweDc0LCAweDAwLAogCTB4NDAsIDB4NmEsIDB4NzgsIDB4MDAsCiAJMHg0MCwgMHg2YSwgMHgxNiwgMHgwMCwKLQkweDAwLCAweDY1LCAweGQ4LCAweDVkLAorCTB4MDAsIDB4NjUsIDB4ZGEsIDB4NWQsCiAJMHgwMSwgMHgzZiwgMHhjOCwgMHgzMCwKLQkweGJmLCAweDY0LCAweDU2LCAweDdhLAotCTB4ODAsIDB4NjQsIDB4OWUsIDB4NzMsCi0JMHhhMCwgMHg2NCwgMHgwMCwgMHg3NCwKLQkweGMwLCAweDY0LCAweGY0LCAweDczLAotCTB4ZTAsIDB4NjQsIDB4MzAsIDB4NzQsCi0JMHgwMSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweGJmLCAweDY0LCAweDU4LCAweDdhLAorCTB4ODAsIDB4NjQsIDB4YTAsIDB4NzMsCisJMHhhMCwgMHg2NCwgMHgwMiwgMHg3NCwKKwkweGMwLCAweDY0LCAweGY2LCAweDczLAorCTB4ZTAsIDB4NjQsIDB4MzIsIDB4NzQsCisJMHgwMSwgMHg2YSwgMHhkYSwgMHg1ZSwKIAkweDAwLCAweDY1LCAweGNjLCAweDQxLAogCTB4ZjcsIDB4MTEsIDB4MjIsIDB4MDgsCiAJMHgwMSwgMHgwNiwgMHhkNCwgMHgzMCwKIAkweGZmLCAweDZhLCAweDI0LCAweDA4LAogCTB4ZjcsIDB4MDEsIDB4MDIsIDB4MDgsCi0JMHgwOSwgMHgwYywgMHhlNiwgMHg3OSwKKwkweGMwLCAweDZhLCAweDc4LCAweDAwLAorCTB4MDksIDB4MGMsIDB4ZTgsIDB4NzksCiAJMHgwOCwgMHgwYywgMHgwNCwgMHg2OCwKLQkweGIxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4YjEsIDB4NmEsIDB4ZGEsIDB4NWUsCiAJMHhmZiwgMHg2YSwgMHgyNiwgMHgwOSwKIAkweDEyLCAweDAxLCAweDAyLCAweDAwLAogCTB4MDIsIDB4NmEsIDB4MDgsIDB4MzAsCkBAIC0yNjQsMjkgKzI2NSwyOSBAQAogCTB4MDAsIDB4YTUsIDB4NGEsIDB4MjEsCiAJMHgwMCwgMHhhNiwgMHg0YywgMHgyMSwKIAkweDAwLCAweGE3LCAweDRlLCAweDI1LAotCTB4MDgsIDB4ZWIsIDB4ZGMsIDB4N2UsCi0JMHg4MCwgMHhlYiwgMHgwNiwgMHg3YSwKKwkweDA4LCAweGViLCAweGRlLCAweDdlLAorCTB4ODAsIDB4ZWIsIDB4MDgsIDB4N2EsCiAJMHhmZiwgMHg2YSwgMHhkNiwgMHgwOSwKLQkweDA4LCAweGViLCAweDBhLCAweDZhLAorCTB4MDgsIDB4ZWIsIDB4MGMsIDB4NmEsCiAJMHhmZiwgMHg2YSwgMHhkNCwgMHgwYywKLQkweDgwLCAweGEzLCAweGRjLCAweDZlLAotCTB4ODgsIDB4ZWIsIDB4MjAsIDB4NzIsCi0JMHgwOCwgMHhlYiwgMHhkYywgMHg2ZSwKLQkweDA0LCAweGVhLCAweDI0LCAweGUyLAotCTB4MDgsIDB4ZWUsIDB4ZGMsIDB4NmUsCisJMHg4MCwgMHhhMywgMHhkZSwgMHg2ZSwKKwkweDg4LCAweGViLCAweDIyLCAweDcyLAorCTB4MDgsIDB4ZWIsIDB4ZGUsIDB4NmUsCisJMHgwNCwgMHhlYSwgMHgyNiwgMHhlMiwKKwkweDA4LCAweGVlLCAweGRlLCAweDZlLAogCTB4MDQsIDB4NmEsIDB4ZDAsIDB4ODEsCiAJMHgwNSwgMHhhNCwgMHhjMCwgMHg4OSwKIAkweDAzLCAweGE1LCAweGMyLCAweDMxLAogCTB4MDksIDB4NmEsIDB4ZDYsIDB4MDUsCi0JMHgwMCwgMHg2NSwgMHgwOCwgMHg1YSwKKwkweDAwLCAweDY1LCAweDBhLCAweDVhLAogCTB4MDYsIDB4YTQsIDB4ZDQsIDB4ODksCi0JMHg4MCwgMHg5NCwgMHhkYywgMHg3ZSwKKwkweDgwLCAweDk0LCAweGRlLCAweDdlLAogCTB4MDcsIDB4ZTksIDB4MTAsIDB4MzEsCiAJMHgwMSwgMHhlOSwgMHg0NiwgMHgzMSwKLQkweDAwLCAweGEzLCAweGJhLCAweDVlLAotCTB4MDAsIDB4NjUsIDB4ZmEsIDB4NTksCisJMHgwMCwgMHhhMywgMHhiYywgMHg1ZSwKKwkweDAwLCAweDY1LCAweGZjLCAweDU5LAogCTB4MDEsIDB4YTQsIDB4Y2EsIDB4MzAsCi0JMHg4MCwgMHhhMywgMHgzNCwgMHg3YSwKKwkweDgwLCAweGEzLCAweDM2LCAweDdhLAogCTB4MDIsIDB4NjUsIDB4Y2EsIDB4MDAsCiAJMHgwMSwgMHg2NSwgMHhmOCwgMHgzMSwKIAkweDgwLCAweDkzLCAweDI2LCAweDAxLApAQCAtMjk0LDE2MiArMjk1LDE2MiBAQAogCTB4MDEsIDB4OGMsIDB4YzgsIDB4MzAsCiAJMHgwMCwgMHg4OCwgMHhjOCwgMHgxOCwKIAkweDAyLCAweDY0LCAweGM4LCAweDg4LAotCTB4ZmYsIDB4NjQsIDB4ZGMsIDB4N2UsCi0JMHhmZiwgMHg4ZCwgMHg0YSwgMHg2YSwKLQkweGZmLCAweDhlLCAweDRhLCAweDZhLAorCTB4ZmYsIDB4NjQsIDB4ZGUsIDB4N2UsCisJMHhmZiwgMHg4ZCwgMHg0YywgMHg2YSwKKwkweGZmLCAweDhlLCAweDRjLCAweDZhLAogCTB4MDMsIDB4OGMsIDB4ZDQsIDB4OTgsCi0JMHgwMCwgMHg2NSwgMHhkYywgMHg1NiwKKwkweDAwLCAweDY1LCAweGRlLCAweDU2LAogCTB4MDEsIDB4NjQsIDB4NzAsIDB4MzAsCiAJMHhmZiwgMHg2NCwgMHhjOCwgMHgxMCwKIAkweDAxLCAweDY0LCAweGM4LCAweDE4LAogCTB4MDAsIDB4OGMsIDB4MTgsIDB4MTksCiAJMHhmZiwgMHg4ZCwgMHgxYSwgMHgyMSwKIAkweGZmLCAweDhlLCAweDFjLCAweDI1LAotCTB4YzAsIDB4M2MsIDB4NWEsIDB4N2EsCi0JMHgyMSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweGMwLCAweDNjLCAweDVjLCAweDdhLAorCTB4MjEsIDB4NmEsIDB4ZGEsIDB4NWUsCiAJMHhhOCwgMHg2YSwgMHg3NiwgMHgwMCwKIAkweDc5LCAweDZhLCAweDc2LCAweDAwLAotCTB4NDAsIDB4M2YsIDB4NjIsIDB4NmEsCisJMHg0MCwgMHgzZiwgMHg2NCwgMHg2YSwKIAkweDA0LCAweDNiLCAweDc2LCAweDAwLAogCTB4MDQsIDB4NmEsIDB4ZDQsIDB4ODEsCi0JMHgyMCwgMHgzYywgMHg2YSwgMHg3YSwKLQkweDUxLCAweDZhLCAweGQ4LCAweDVlLAotCTB4MDAsIDB4NjUsIDB4ODIsIDB4NDIsCisJMHgyMCwgMHgzYywgMHg2YywgMHg3YSwKKwkweDUxLCAweDZhLCAweGRhLCAweDVlLAorCTB4MDAsIDB4NjUsIDB4ODQsIDB4NDIsCiAJMHgyMCwgMHgzYywgMHg3OCwgMHgwMCwKLQkweDAwLCAweGIzLCAweGJhLCAweDVlLAorCTB4MDAsIDB4YjMsIDB4YmMsIDB4NWUsCiAJMHgwNywgMHhhYywgMHgxMCwgMHgzMSwKIAkweDA1LCAweGIzLCAweDQ2LCAweDMxLAogCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCi0JMHhhYywgMHg2YSwgMHhlZSwgMHg1ZCwKKwkweGFjLCAweDZhLCAweGYwLCAweDVkLAogCTB4YTMsIDB4NmEsIDB4Y2MsIDB4MDAsCi0JMHhiMywgMHg2YSwgMHhmMiwgMHg1ZCwKLQkweDAwLCAweDY1LCAweDNhLCAweDVhLAorCTB4YjMsIDB4NmEsIDB4ZjQsIDB4NWQsCisJMHgwMCwgMHg2NSwgMHgzYywgMHg1YSwKIAkweGZkLCAweGE0LCAweDQ4LCAweDA5LAogCTB4MDMsIDB4OGMsIDB4MTAsIDB4MzAsCi0JMHgwMCwgMHg2NSwgMHhlNiwgMHg1ZCwKLQkweDAxLCAweGE0LCAweDk0LCAweDdhLAorCTB4MDAsIDB4NjUsIDB4ZTgsIDB4NWQsCisJMHgwMSwgMHhhNCwgMHg5NiwgMHg3YSwKIAkweDA0LCAweDNiLCAweDc2LCAweDA4LAogCTB4MDEsIDB4M2IsIDB4MjYsIDB4MzEsCiAJMHg4MCwgMHgwMiwgMHgwNCwgMHgwMCwKLQkweDEwLCAweDBjLCAweDhhLCAweDdhLAotCTB4MDMsIDB4OWUsIDB4OGMsIDB4NmEsCisJMHgxMCwgMHgwYywgMHg4YywgMHg3YSwKKwkweDAzLCAweDllLCAweDhlLCAweDZhLAogCTB4N2YsIDB4MDIsIDB4MDQsIDB4MDgsCi0JMHg5MSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDkxLCAweDZhLCAweGRhLCAweDVlLAogCTB4MDAsIDB4NjUsIDB4Y2MsIDB4NDEsCiAJMHgwMSwgMHhhNCwgMHhjYSwgMHgzMCwKLQkweDgwLCAweGEzLCAweDlhLCAweDdhLAorCTB4ODAsIDB4YTMsIDB4OWMsIDB4N2EsCiAJMHgwMiwgMHg2NSwgMHhjYSwgMHgwMCwKIAkweDAxLCAweDY1LCAweGY4LCAweDMxLAogCTB4MDEsIDB4M2IsIDB4MjYsIDB4MzEsCi0JMHgwMCwgMHg2NSwgMHgwZSwgMHg1YSwKLQkweDAxLCAweGZjLCAweGE4LCAweDZhLAotCTB4ODAsIDB4MGIsIDB4OWUsIDB4NmEsCi0JMHgxMCwgMHgwYywgMHg5ZSwgMHg3YSwKLQkweDIwLCAweDkzLCAweDllLCAweDZhLAorCTB4MDAsIDB4NjUsIDB4MTAsIDB4NWEsCisJMHgwMSwgMHhmYywgMHhhYSwgMHg2YSwKKwkweDgwLCAweDBiLCAweGEwLCAweDZhLAorCTB4MTAsIDB4MGMsIDB4YTAsIDB4N2EsCisJMHgyMCwgMHg5MywgMHhhMCwgMHg2YSwKIAkweDAyLCAweDkzLCAweDI2LCAweDAxLAotCTB4MDIsIDB4ZmMsIDB4YjIsIDB4N2EsCi0JMHg0MCwgMHgwZCwgMHhjNiwgMHg2YSwKKwkweDAyLCAweGZjLCAweGI0LCAweDdhLAorCTB4NDAsIDB4MGQsIDB4YzgsIDB4NmEsCiAJMHgwMSwgMHhhNCwgMHg0OCwgMHgwMSwKLQkweDAwLCAweDY1LCAweGM2LCAweDQyLAotCTB4NDAsIDB4MGQsIDB4YjgsIDB4NmEsCi0JMHgwMCwgMHg2NSwgMHgwZSwgMHg1YSwKLQkweDAwLCAweDY1LCAweGFhLCAweDQyLAotCTB4ODAsIDB4ZmMsIDB4YzIsIDB4N2EsCi0JMHg4MCwgMHhhNCwgMHhjMiwgMHg2YSwKKwkweDAwLCAweDY1LCAweGM4LCAweDQyLAorCTB4NDAsIDB4MGQsIDB4YmEsIDB4NmEsCisJMHgwMCwgMHg2NSwgMHgxMCwgMHg1YSwKKwkweDAwLCAweDY1LCAweGFjLCAweDQyLAorCTB4ODAsIDB4ZmMsIDB4YzQsIDB4N2EsCisJMHg4MCwgMHhhNCwgMHhjNCwgMHg2YSwKIAkweGZmLCAweGE1LCAweDRhLCAweDE5LAogCTB4ZmYsIDB4YTYsIDB4NGMsIDB4MjEsCiAJMHhmZiwgMHhhNywgMHg0ZSwgMHgyMSwKIAkweGY4LCAweGZjLCAweDQ4LCAweDA5LAogCTB4N2YsIDB4YTMsIDB4NDYsIDB4MDksCi0JMHgwNCwgMHgzYiwgMHhlMiwgMHg2YSwKKwkweDA0LCAweDNiLCAweGU0LCAweDZhLAogCTB4MDIsIDB4OTMsIDB4MjYsIDB4MDEsCi0JMHgwMSwgMHg5NCwgMHhjOCwgMHg3YSwKLQkweDAxLCAweDk0LCAweGM4LCAweDdhLAotCTB4MDEsIDB4OTQsIDB4YzgsIDB4N2EsCi0JMHgwMSwgMHg5NCwgMHhjOCwgMHg3YSwKLQkweDAxLCAweDk0LCAweGM4LCAweDdhLAotCTB4MDEsIDB4YTQsIDB4ZTAsIDB4N2EsCi0JMHgwMSwgMHhmYywgMHhkNiwgMHg3YSwKLQkweDAxLCAweDk0LCAweGUyLCAweDZhLAotCTB4MDEsIDB4OTQsIDB4ZTIsIDB4NmEsCi0JMHgwMSwgMHg5NCwgMHhlMiwgMHg2YSwKLQkweDAwLCAweDY1LCAweDgyLCAweDQyLAotCTB4MDEsIDB4OTQsIDB4ZTAsIDB4N2EsCi0JMHgxMCwgMHg5NCwgMHhlMiwgMHg2YSwKKwkweDAxLCAweDk0LCAweGNhLCAweDdhLAorCTB4MDEsIDB4OTQsIDB4Y2EsIDB4N2EsCisJMHgwMSwgMHg5NCwgMHhjYSwgMHg3YSwKKwkweDAxLCAweDk0LCAweGNhLCAweDdhLAorCTB4MDEsIDB4OTQsIDB4Y2EsIDB4N2EsCisJMHgwMSwgMHhhNCwgMHhlMiwgMHg3YSwKKwkweDAxLCAweGZjLCAweGQ4LCAweDdhLAorCTB4MDEsIDB4OTQsIDB4ZTQsIDB4NmEsCisJMHgwMSwgMHg5NCwgMHhlNCwgMHg2YSwKKwkweDAxLCAweDk0LCAweGU0LCAweDZhLAorCTB4MDAsIDB4NjUsIDB4ODQsIDB4NDIsCisJMHgwMSwgMHg5NCwgMHhlMiwgMHg3YSwKKwkweDEwLCAweDk0LCAweGU0LCAweDZhLAogCTB4ZDcsIDB4OTMsIDB4MjYsIDB4MDksCi0JMHgyOCwgMHg5MywgMHhlNiwgMHg2YSwKKwkweDI4LCAweDkzLCAweGU4LCAweDZhLAogCTB4MDEsIDB4ODUsIDB4MGEsIDB4MDEsCi0JMHgwMiwgMHhmYywgMHhlZSwgMHg2YSwKKwkweDAyLCAweGZjLCAweGYwLCAweDZhLAogCTB4MDEsIDB4MTQsIDB4NDYsIDB4MzEsCiAJMHhmZiwgMHg2YSwgMHgxMCwgMHgwOSwKIAkweGZlLCAweDg1LCAweDBhLCAweDA5LAotCTB4ZmYsIDB4MzgsIDB4ZmMsIDB4NmEsCi0JMHg4MCwgMHhhMywgMHhmYywgMHg3YSwKLQkweDgwLCAweDBiLCAweGZhLCAweDdhLAotCTB4MDQsIDB4M2IsIDB4ZmMsIDB4N2EsCisJMHhmZiwgMHgzOCwgMHhmZSwgMHg2YSwKKwkweDgwLCAweGEzLCAweGZlLCAweDdhLAorCTB4ODAsIDB4MGIsIDB4ZmMsIDB4N2EsCisJMHgwNCwgMHgzYiwgMHhmZSwgMHg3YSwKIAkweGJmLCAweDNiLCAweDc2LCAweDA4LAogCTB4MDEsIDB4M2IsIDB4MjYsIDB4MzEsCi0JMHgwMCwgMHg2NSwgMHgwZSwgMHg1YSwKLQkweDAxLCAweDBiLCAweDBhLCAweDZiLAotCTB4MTAsIDB4MGMsIDB4ZmUsIDB4N2EsCi0JMHgwNCwgMHg5MywgMHgwOCwgMHg2YiwKLQkweDAxLCAweDk0LCAweDA2LCAweDdiLAotCTB4MTAsIDB4OTQsIDB4MDgsIDB4NmIsCisJMHgwMCwgMHg2NSwgMHgxMCwgMHg1YSwKKwkweDAxLCAweDBiLCAweDBjLCAweDZiLAorCTB4MTAsIDB4MGMsIDB4MDAsIDB4N2IsCisJMHgwNCwgMHg5MywgMHgwYSwgMHg2YiwKKwkweDAxLCAweDk0LCAweDA4LCAweDdiLAorCTB4MTAsIDB4OTQsIDB4MGEsIDB4NmIsCiAJMHhjNywgMHg5MywgMHgyNiwgMHgwOSwKIAkweDAxLCAweDk5LCAweGQ0LCAweDMwLAotCTB4MzgsIDB4OTMsIDB4MGMsIDB4NmIsCi0JMHhmZiwgMHgwOCwgMHg1YSwgMHg2YiwKLQkweGZmLCAweDA5LCAweDVhLCAweDZiLAotCTB4ZmYsIDB4MGEsIDB4NWEsIDB4NmIsCi0JMHhmZiwgMHgzOCwgMHgyOCwgMHg3YiwKKwkweDM4LCAweDkzLCAweDBlLCAweDZiLAorCTB4ZmYsIDB4MDgsIDB4NWMsIDB4NmIsCisJMHhmZiwgMHgwOSwgMHg1YywgMHg2YiwKKwkweGZmLCAweDBhLCAweDVjLCAweDZiLAorCTB4ZmYsIDB4MzgsIDB4MmEsIDB4N2IsCiAJMHgwNCwgMHgxNCwgMHgxMCwgMHgzMSwKIAkweDAxLCAweDM4LCAweDE4LCAweDMxLAogCTB4MDIsIDB4NmEsIDB4MWEsIDB4MzEsCiAJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKLQkweDE0LCAweDZhLCAweGY0LCAweDVkLAotCTB4MDAsIDB4MzgsIDB4ZTAsIDB4NWQsCisJMHgxNCwgMHg2YSwgMHhmNiwgMHg1ZCwKKwkweDAwLCAweDM4LCAweGUyLCAweDVkLAogCTB4ZmYsIDB4NmEsIDB4NzAsIDB4MDgsCi0JMHgwMCwgMHg2NSwgMHg1NCwgMHg0MywKLQkweDgwLCAweGEzLCAweDJlLCAweDdiLAorCTB4MDAsIDB4NjUsIDB4NTYsIDB4NDMsCisJMHg4MCwgMHhhMywgMHgzMCwgMHg3YiwKIAkweDAxLCAweGE0LCAweDQ4LCAweDAxLAotCTB4MDAsIDB4NjUsIDB4NWEsIDB4NDMsCi0JMHgwOCwgMHhlYiwgMHgzNCwgMHg3YiwKLQkweDAwLCAweDY1LCAweDBlLCAweDVhLAotCTB4MDgsIDB4ZWIsIDB4MzAsIDB4NmIsCisJMHgwMCwgMHg2NSwgMHg1YywgMHg0MywKKwkweDA4LCAweGViLCAweDM2LCAweDdiLAorCTB4MDAsIDB4NjUsIDB4MTAsIDB4NWEsCisJMHgwOCwgMHhlYiwgMHgzMiwgMHg2YiwKIAkweDA3LCAweGU5LCAweDEwLCAweDMxLAogCTB4MDEsIDB4ZTksIDB4Y2EsIDB4MzAsCiAJMHgwMSwgMHg2NSwgMHg0NiwgMHgzMSwKLQkweDAwLCAweDZhLCAweGJhLCAweDVlLAorCTB4MDAsIDB4NmEsIDB4YmMsIDB4NWUsCiAJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKLQkweGE0LCAweDZhLCAweGY0LCAweDVkLAotCTB4MDgsIDB4NmEsIDB4ZTAsIDB4NWQsCisJMHhhNCwgMHg2YSwgMHhmNiwgMHg1ZCwKKwkweDA4LCAweDZhLCAweGUyLCAweDVkLAogCTB4MGQsIDB4OTMsIDB4MjYsIDB4MDEsCi0JMHgwMCwgMHg2NSwgMHhhOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGFhLCAweDVlLAogCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCi0JMHgwMCwgMHg2NSwgMHg4YSwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDhjLCAweDVlLAogCTB4MDEsIDB4OTksIDB4NDYsIDB4MzEsCi0JMHgwMCwgMHhhMywgMHhiYSwgMHg1ZSwKKwkweDAwLCAweGEzLCAweGJjLCAweDVlLAogCTB4MDEsIDB4ODgsIDB4MTAsIDB4MzEsCi0JMHgwMCwgMHg2NSwgMHgzYSwgMHg1YSwKLQkweDAwLCAweDY1LCAweGZhLCAweDU5LAorCTB4MDAsIDB4NjUsIDB4M2MsIDB4NWEsCisJMHgwMCwgMHg2NSwgMHhmYywgMHg1OSwKIAkweDAzLCAweDhjLCAweDEwLCAweDMwLAotCTB4MDAsIDB4NjUsIDB4ZTYsIDB4NWQsCi0JMHg4MCwgMHgwYiwgMHg4MiwgMHg2YSwKLQkweDgwLCAweDBiLCAweDYyLCAweDZiLAotCTB4MDEsIDB4MGMsIDB4NWMsIDB4N2IsCi0JMHgxMCwgMHgwYywgMHg4MiwgMHg3YSwKLQkweDAzLCAweDllLCAweDgyLCAweDZhLAotCTB4MDAsIDB4NjUsIDB4MDQsIDB4NWEsCi0JMHgwMCwgMHg2YSwgMHhiYSwgMHg1ZSwKLQkweDAxLCAweGE0LCAweDgyLCAweDZiLAotCTB4ZmYsIDB4MzgsIDB4NzgsIDB4N2IsCisJMHgwMCwgMHg2NSwgMHhlOCwgMHg1ZCwKKwkweDgwLCAweDBiLCAweDg0LCAweDZhLAorCTB4ODAsIDB4MGIsIDB4NjQsIDB4NmIsCisJMHgwMSwgMHgwYywgMHg1ZSwgMHg3YiwKKwkweDEwLCAweDBjLCAweDg0LCAweDdhLAorCTB4MDMsIDB4OWUsIDB4ODQsIDB4NmEsCisJMHgwMCwgMHg2NSwgMHgwNiwgMHg1YSwKKwkweDAwLCAweDZhLCAweGJjLCAweDVlLAorCTB4MDEsIDB4YTQsIDB4ODQsIDB4NmIsCisJMHhmZiwgMHgzOCwgMHg3YSwgMHg3YiwKIAkweDAxLCAweDM4LCAweGM4LCAweDMwLAogCTB4MDAsIDB4MDgsIDB4NDAsIDB4MTksCiAJMHhmZiwgMHg2YSwgMHhjOCwgMHgwOCwKIAkweDAwLCAweDA5LCAweDQyLCAweDIxLAogCTB4MDAsIDB4MGEsIDB4NDQsIDB4MjEsCiAJMHhmZiwgMHg2YSwgMHg3MCwgMHgwOCwKLQkweDAwLCAweDY1LCAweDdhLCAweDQzLAorCTB4MDAsIDB4NjUsIDB4N2MsIDB4NDMsCiAJMHgwMywgMHgwOCwgMHg0MCwgMHgzMSwKIAkweDAzLCAweDA4LCAweDQwLCAweDMxLAogCTB4MDEsIDB4MDgsIDB4NDAsIDB4MzEsCkBAIC00NjEsMTYgKzQ2MiwxNiBAQAogCTB4MDQsIDB4M2MsIDB4Y2MsIDB4NzksCiAJMHhmYiwgMHgzYywgMHg3OCwgMHgwOCwKIAkweDA0LCAweDkzLCAweDIwLCAweDc5LAotCTB4MDEsIDB4MGMsIDB4OGUsIDB4NmIsCisJMHgwMSwgMHgwYywgMHg5MCwgMHg2YiwKIAkweDgwLCAweGJhLCAweDIwLCAweDc5LAogCTB4ODAsIDB4MDQsIDB4MjAsIDB4NzksCi0JMHhlNCwgMHg2YSwgMHg2ZSwgMHg1ZCwKLQkweDIzLCAweDZhLCAweDg0LCAweDVkLAotCTB4MDEsIDB4NmEsIDB4ODQsIDB4NWQsCisJMHhlNCwgMHg2YSwgMHg3MCwgMHg1ZCwKKwkweDIzLCAweDZhLCAweDg2LCAweDVkLAorCTB4MDEsIDB4NmEsIDB4ODYsIDB4NWQsCiAJMHgwMCwgMHg2NSwgMHgyMCwgMHg0MSwKIAkweDAwLCAweDY1LCAweGNjLCAweDQxLAotCTB4ODAsIDB4M2MsIDB4YTIsIDB4N2IsCi0JMHgyMSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDgwLCAweDNjLCAweGE0LCAweDdiLAorCTB4MjEsIDB4NmEsIDB4ZGEsIDB4NWUsCiAJMHgwMSwgMHhiYywgMHgxOCwgMHgzMSwKIAkweDAyLCAweDZhLCAweDFhLCAweDMxLAogCTB4MDIsIDB4NmEsIDB4ZjgsIDB4MDEsCkBAIC00ODAsMTYgKzQ4MSwxNiBAQAogCTB4ZmYsIDB4NmEsIDB4MTIsIDB4MDgsCiAJMHhmZiwgMHg2YSwgMHgxNCwgMHgwOCwKIAkweGYzLCAweGJjLCAweGQ0LCAweDE4LAotCTB4YTAsIDB4NmEsIDB4YzgsIDB4NTMsCisJMHhhMCwgMHg2YSwgMHhjYSwgMHg1MywKIAkweDA0LCAweGEwLCAweDEwLCAweDMxLAogCTB4YWMsIDB4NmEsIDB4MjYsIDB4MDEsCiAJMHgwNCwgMHhhMCwgMHgxMCwgMHgzMSwKIAkweDAzLCAweDA4LCAweDE4LCAweDMxLAogCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCi0JMHhhMCwgMHg2YSwgMHhmNCwgMHg1ZCwKLQkweDAwLCAweGJjLCAweGUwLCAweDVkLAorCTB4YTAsIDB4NmEsIDB4ZjYsIDB4NWQsCisJMHgwMCwgMHhiYywgMHhlMiwgMHg1ZCwKIAkweDNkLCAweDZhLCAweDI2LCAweDAxLAotCTB4MDAsIDB4NjUsIDB4ZTAsIDB4NDMsCisJMHgwMCwgMHg2NSwgMHhlMiwgMHg0MywKIAkweGZmLCAweDZhLCAweDEwLCAweDA5LAogCTB4YTQsIDB4NmEsIDB4MjYsIDB4MDEsCiAJMHgwYywgMHhhMCwgMHgzMiwgMHgzMSwKQEAgLTQ5OSwxMjggKzUwMCwxMjggQEAKIAkweDM2LCAweDZhLCAweDI2LCAweDAxLAogCTB4MDIsIDB4OTMsIDB4MjYsIDB4MDEsCiAJMHgzNSwgMHg2YSwgMHgyNiwgMHgwMSwKLQkweDAwLCAweDY1LCAweDljLCAweDVlLAotCTB4MDAsIDB4NjUsIDB4OWMsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHg5ZSwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDllLCAweDVlLAogCTB4MDIsIDB4OTMsIDB4MjYsIDB4MDEsCiAJMHhiZiwgMHgzYywgMHg3OCwgMHgwOCwKLQkweDA0LCAweDBiLCAweGU2LCAweDZiLAotCTB4MTAsIDB4MGMsIDB4ZTIsIDB4N2IsCi0JMHgwMSwgMHgwMywgMHhlNiwgMHg2YiwKLQkweDIwLCAweDkzLCAweGU4LCAweDZiLAotCTB4MDQsIDB4MGIsIDB4ZWUsIDB4NmIsCisJMHgwNCwgMHgwYiwgMHhlOCwgMHg2YiwKKwkweDEwLCAweDBjLCAweGU0LCAweDdiLAorCTB4MDEsIDB4MDMsIDB4ZTgsIDB4NmIsCisJMHgyMCwgMHg5MywgMHhlYSwgMHg2YiwKKwkweDA0LCAweDBiLCAweGYwLCAweDZiLAogCTB4NDAsIDB4M2MsIDB4NzgsIDB4MDAsCiAJMHhjNywgMHg5MywgMHgyNiwgMHgwOSwKLQkweDM4LCAweDkzLCAweGYwLCAweDZiLAorCTB4MzgsIDB4OTMsIDB4ZjIsIDB4NmIsCiAJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKLQkweDgwLCAweDNjLCAweDU2LCAweDZjLAorCTB4ODAsIDB4M2MsIDB4NTgsIDB4NmMsCiAJMHgwMSwgMHgwNiwgMHg1MCwgMHgzMSwKIAkweDgwLCAweGI4LCAweDcwLCAweDAxLAogCTB4MDAsIDB4NjUsIDB4Y2MsIDB4NDEsCiAJMHgxMCwgMHgzZiwgMHgwNiwgMHgwMCwKIAkweDEwLCAweDZhLCAweDA2LCAweDAwLAogCTB4MDEsIDB4M2EsIDB4Y2EsIDB4MzAsCi0JMHg4MCwgMHg2NSwgMHgxYywgMHg2NCwKLQkweDEwLCAweGI4LCAweDQwLCAweDZjLAorCTB4ODAsIDB4NjUsIDB4MWUsIDB4NjQsCisJMHgxMCwgMHhiOCwgMHg0MiwgMHg2YywKIAkweGMwLCAweDNlLCAweGNhLCAweDAwLAotCTB4NDAsIDB4YjgsIDB4MGMsIDB4NmMsCisJMHg0MCwgMHhiOCwgMHgwZSwgMHg2YywKIAkweGJmLCAweDY1LCAweGNhLCAweDA4LAotCTB4MjAsIDB4YjgsIDB4MjAsIDB4N2MsCisJMHgyMCwgMHhiOCwgMHgyMiwgMHg3YywKIAkweDAxLCAweDY1LCAweDBjLCAweDMwLAotCTB4MDAsIDB4NjUsIDB4ZDgsIDB4NWQsCi0JMHhhMCwgMHgzZiwgMHgyOCwgMHg2NCwKKwkweDAwLCAweDY1LCAweGRhLCAweDVkLAorCTB4YTAsIDB4M2YsIDB4MmEsIDB4NjQsCiAJMHgyMywgMHhiOCwgMHgwYywgMHgwOCwKLQkweDAwLCAweDY1LCAweGQ4LCAweDVkLAotCTB4YTAsIDB4M2YsIDB4MjgsIDB4NjQsCi0JMHgwMCwgMHhiYiwgMHgyMCwgMHg0NCwKLQkweGZmLCAweDY1LCAweDIwLCAweDY0LAotCTB4MDAsIDB4NjUsIDB4NDAsIDB4NDQsCisJMHgwMCwgMHg2NSwgMHhkYSwgMHg1ZCwKKwkweGEwLCAweDNmLCAweDJhLCAweDY0LAorCTB4MDAsIDB4YmIsIDB4MjIsIDB4NDQsCisJMHhmZiwgMHg2NSwgMHgyMiwgMHg2NCwKKwkweDAwLCAweDY1LCAweDQyLCAweDQ0LAogCTB4NDAsIDB4NmEsIDB4MTgsIDB4MDAsCiAJMHgwMSwgMHg2NSwgMHgwYywgMHgzMCwKLQkweDAwLCAweDY1LCAweGQ4LCAweDVkLAotCTB4YTAsIDB4M2YsIDB4ZmMsIDB4NzMsCisJMHgwMCwgMHg2NSwgMHhkYSwgMHg1ZCwKKwkweGEwLCAweDNmLCAweGZlLCAweDczLAogCTB4NDAsIDB4NmEsIDB4MTgsIDB4MDAsCiAJMHgwMSwgMHgzYSwgMHhhNiwgMHgzMCwKIAkweDA4LCAweDZhLCAweDc0LCAweDAwLAogCTB4MDAsIDB4NjUsIDB4Y2MsIDB4NDEsCi0JMHg2NCwgMHg2YSwgMHg2OCwgMHg1ZCwKLQkweDgwLCAweDY0LCAweGQ4LCAweDZjLAotCTB4MDQsIDB4NjQsIDB4OWEsIDB4NzQsCi0JMHgwMiwgMHg2NCwgMHhhYSwgMHg3NCwKLQkweDAwLCAweDZhLCAweDYwLCAweDc0LAotCTB4MDMsIDB4NjQsIDB4YzgsIDB4NzQsCi0JMHgyMywgMHg2NCwgMHg0OCwgMHg3NCwKLQkweDA4LCAweDY0LCAweDVjLCAweDc0LAotCTB4NjEsIDB4NmEsIDB4ZDgsIDB4NWUsCi0JMHgwMCwgMHg2NSwgMHhkOCwgMHg1ZCwKKwkweDY0LCAweDZhLCAweDZhLCAweDVkLAorCTB4ODAsIDB4NjQsIDB4ZGEsIDB4NmMsCisJMHgwNCwgMHg2NCwgMHg5YywgMHg3NCwKKwkweDAyLCAweDY0LCAweGFjLCAweDc0LAorCTB4MDAsIDB4NmEsIDB4NjIsIDB4NzQsCisJMHgwMywgMHg2NCwgMHhjYSwgMHg3NCwKKwkweDIzLCAweDY0LCAweDRhLCAweDc0LAorCTB4MDgsIDB4NjQsIDB4NWUsIDB4NzQsCisJMHg2MSwgMHg2YSwgMHhkYSwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGRhLCAweDVkLAogCTB4MDgsIDB4NTEsIDB4Y2UsIDB4NzEsCi0JMHgwMCwgMHg2NSwgMHg0MCwgMHg0NCwKLQkweDgwLCAweDA0LCAweDVhLCAweDdjLAotCTB4NTEsIDB4NmEsIDB4NWUsIDB4NWQsCi0JMHgwMSwgMHg1MSwgMHg1YSwgMHg2NCwKLQkweDAxLCAweGE0LCAweDUyLCAweDdjLAotCTB4ODAsIDB4YmEsIDB4NWMsIDB4NmMsCi0JMHg0MSwgMHg2YSwgMHhkOCwgMHg1ZSwKLQkweDAwLCAweDY1LCAweDVjLCAweDQ0LAotCTB4MjEsIDB4NmEsIDB4ZDgsIDB4NWUsCi0JMHgwMCwgMHg2NSwgMHg1YywgMHg0NCwKLQkweDA3LCAweDZhLCAweDU0LCAweDVkLAorCTB4MDAsIDB4NjUsIDB4NDIsIDB4NDQsCisJMHg4MCwgMHgwNCwgMHg1YywgMHg3YywKKwkweDUxLCAweDZhLCAweDYwLCAweDVkLAorCTB4MDEsIDB4NTEsIDB4NWMsIDB4NjQsCisJMHgwMSwgMHhhNCwgMHg1NCwgMHg3YywKKwkweDgwLCAweGJhLCAweDVlLCAweDZjLAorCTB4NDEsIDB4NmEsIDB4ZGEsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHg1ZSwgMHg0NCwKKwkweDIxLCAweDZhLCAweGRhLCAweDVlLAorCTB4MDAsIDB4NjUsIDB4NWUsIDB4NDQsCisJMHgwNywgMHg2YSwgMHg1NiwgMHg1ZCwKIAkweDAxLCAweDA2LCAweGQ0LCAweDMwLAogCTB4MDAsIDB4NjUsIDB4Y2MsIDB4NDEsCi0JMHg4MCwgMHhiOCwgMHg1NiwgMHg3YywKLQkweGMwLCAweDNjLCAweDZhLCAweDdjLAotCTB4ODAsIDB4M2MsIDB4NTYsIDB4NmMsCi0JMHhmZiwgMHhhOCwgMHg2YSwgMHg2YywKLQkweDQwLCAweDNjLCAweDU2LCAweDZjLAotCTB4MTAsIDB4YjgsIDB4NmUsIDB4N2MsCi0JMHhhMSwgMHg2YSwgMHhkOCwgMHg1ZSwKLQkweDAxLCAweGI0LCAweDc0LCAweDZjLAotCTB4MDIsIDB4YjQsIDB4NzYsIDB4NmMsCi0JMHgwMSwgMHhhNCwgMHg3NiwgMHg3YywKLQkweGZmLCAweGE4LCAweDg2LCAweDdjLAorCTB4ODAsIDB4YjgsIDB4NTgsIDB4N2MsCisJMHhjMCwgMHgzYywgMHg2YywgMHg3YywKKwkweDgwLCAweDNjLCAweDU4LCAweDZjLAorCTB4ZmYsIDB4YTgsIDB4NmMsIDB4NmMsCisJMHg0MCwgMHgzYywgMHg1OCwgMHg2YywKKwkweDEwLCAweGI4LCAweDcwLCAweDdjLAorCTB4YTEsIDB4NmEsIDB4ZGEsIDB4NWUsCisJMHgwMSwgMHhiNCwgMHg3NiwgMHg2YywKKwkweDAyLCAweGI0LCAweDc4LCAweDZjLAorCTB4MDEsIDB4YTQsIDB4NzgsIDB4N2MsCisJMHhmZiwgMHhhOCwgMHg4OCwgMHg3YywKIAkweDA0LCAweGI0LCAweDY4LCAweDAxLAogCTB4MDEsIDB4NmEsIDB4NzYsIDB4MDAsCi0JMHgwMCwgMHhiYiwgMHgxMiwgMHg1ZSwKLQkweGZmLCAweGE4LCAweDg2LCAweDdjLAotCTB4NzEsIDB4NmEsIDB4ZDgsIDB4NWUsCi0JMHg0MCwgMHg1MSwgMHg4NiwgMHg2NCwKLQkweDAwLCAweDY1LCAweGIyLCAweDVlLAorCTB4MDAsIDB4YmIsIDB4MTQsIDB4NWUsCisJMHhmZiwgMHhhOCwgMHg4OCwgMHg3YywKKwkweDcxLCAweDZhLCAweGRhLCAweDVlLAorCTB4NDAsIDB4NTEsIDB4ODgsIDB4NjQsCisJMHgwMCwgMHg2NSwgMHhiNCwgMHg1ZSwKIAkweDAwLCAweDY1LCAweGRlLCAweDQxLAotCTB4MDAsIDB4YmIsIDB4OGEsIDB4NWMsCisJMHgwMCwgMHhiYiwgMHg4YywgMHg1YywKIAkweDAwLCAweDY1LCAweGRlLCAweDQxLAotCTB4MDAsIDB4NjUsIDB4YjIsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHhiNCwgMHg1ZSwKIAkweDAxLCAweDY1LCAweGEyLCAweDMwLAogCTB4MDEsIDB4ZjgsIDB4YzgsIDB4MzAsCiAJMHgwMSwgMHg0ZSwgMHhjOCwgMHgzMCwKLQkweDAwLCAweDZhLCAweGI2LCAweGRkLAotCTB4MDAsIDB4NTEsIDB4YzgsIDB4NWQsCisJMHgwMCwgMHg2YSwgMHhiOCwgMHhkZCwKKwkweDAwLCAweDUxLCAweGNhLCAweDVkLAogCTB4MDEsIDB4NGUsIDB4OWMsIDB4MTgsCiAJMHgwMiwgMHg2YSwgMHgyMiwgMHgwNSwKLQkweGMwLCAweDNjLCAweDU2LCAweDZjLAorCTB4YzAsIDB4M2MsIDB4NTgsIDB4NmMsCiAJMHgwNCwgMHhiOCwgMHg3MCwgMHgwMSwKLQkweDAwLCAweDY1LCAweGQ0LCAweDVlLAorCTB4MDAsIDB4NjUsIDB4ZDYsIDB4NWUsCiAJMHgyMCwgMHhiOCwgMHhkZSwgMHg2OSwKIAkweDAxLCAweGJiLCAweGEyLCAweDMwLAogCTB4M2YsIDB4YmEsIDB4N2MsIDB4MDgsCi0JMHgwMCwgMHhiOSwgMHhjZSwgMHg1YywKKwkweDAwLCAweGI5LCAweGQwLCAweDVjLAogCTB4MDAsIDB4NjUsIDB4ZGUsIDB4NDEsCiAJMHgwMSwgMHgwNiwgMHhkNCwgMHgzMCwKIAkweDIwLCAweDNjLCAweGNjLCAweDc5LAotCTB4MjAsIDB4M2MsIDB4NWMsIDB4N2MsCi0JMHgwMSwgMHhhNCwgMHhiOCwgMHg3YywKKwkweDIwLCAweDNjLCAweDVlLCAweDdjLAorCTB4MDEsIDB4YTQsIDB4YmEsIDB4N2MsCiAJMHgwMSwgMHhiNCwgMHg2OCwgMHgwMSwKIAkweDAwLCAweDY1LCAweGNjLCAweDQxLAotCTB4MDAsIDB4NjUsIDB4NWMsIDB4NDQsCisJMHgwMCwgMHg2NSwgMHg1ZSwgMHg0NCwKIAkweDA0LCAweDE0LCAweDU4LCAweDMxLAogCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCiAJMHgwOCwgMHhhMCwgMHg2MCwgMHgzMSwKIAkweGFjLCAweDZhLCAweGNjLCAweDAwLAotCTB4MTQsIDB4NmEsIDB4ZjQsIDB4NWQsCisJMHgxNCwgMHg2YSwgMHhmNiwgMHg1ZCwKIAkweDAxLCAweDA2LCAweGQ0LCAweDMwLAotCTB4YTAsIDB4NmEsIDB4ZWMsIDB4NWQsCisJMHhhMCwgMHg2YSwgMHhlZSwgMHg1ZCwKIAkweDAwLCAweDY1LCAweGNjLCAweDQxLAogCTB4ZGYsIDB4M2MsIDB4NzgsIDB4MDgsCiAJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKLQkweDAwLCAweDY1LCAweDVjLCAweDQ0LAorCTB4MDAsIDB4NjUsIDB4NWUsIDB4NDQsCiAJMHg0YywgMHg2NSwgMHhjYywgMHgyOCwKIAkweDAxLCAweDNlLCAweDIwLCAweDMxLAogCTB4ZDAsIDB4NjYsIDB4Y2MsIDB4MTgsCkBAIC02MzEsMTAyICs2MzIsMTAyIEBACiAJMHhkMCwgMHg2NSwgMHhjYSwgMHgxOCwKIAkweDAxLCAweDNlLCAweDIwLCAweDMxLAogCTB4MzAsIDB4NjUsIDB4ZDQsIDB4MTgsCi0JMHgwMCwgMHg2NSwgMHhlNiwgMHg0YywKKwkweDAwLCAweDY1LCAweGU4LCAweDRjLAogCTB4ZTEsIDB4NmEsIDB4MjIsIDB4MDEsCiAJMHhmZiwgMHg2YSwgMHhkNCwgMHgwOCwKIAkweDIwLCAweDY1LCAweGQ0LCAweDE4LAotCTB4MDAsIDB4NjUsIDB4ZWUsIDB4NTQsCisJMHgwMCwgMHg2NSwgMHhmMCwgMHg1NCwKIAkweGUxLCAweDZhLCAweDIyLCAweDAxLAogCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCiAJMHgyMCwgMHg2NSwgMHhjYSwgMHgxOCwKIAkweGUwLCAweDY1LCAweGQ0LCAweDE4LAotCTB4MDAsIDB4NjUsIDB4ZjgsIDB4NGMsCisJMHgwMCwgMHg2NSwgMHhmYSwgMHg0YywKIAkweGUxLCAweDZhLCAweDIyLCAweDAxLAogCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCiAJMHhkMCwgMHg2NSwgMHhkNCwgMHgxOCwKLQkweDAwLCAweDY1LCAweDAwLCAweDU1LAorCTB4MDAsIDB4NjUsIDB4MDIsIDB4NTUsCiAJMHhlMSwgMHg2YSwgMHgyMiwgMHgwMSwKIAkweGZmLCAweDZhLCAweGQ0LCAweDA4LAogCTB4MDEsIDB4NmMsIDB4YTIsIDB4MzAsCi0JMHhmZiwgMHg1MSwgMHgxMiwgMHg3NSwKLQkweDAwLCAweDUxLCAweDhlLCAweDVkLAorCTB4ZmYsIDB4NTEsIDB4MTQsIDB4NzUsCisJMHgwMCwgMHg1MSwgMHg5MCwgMHg1ZCwKIAkweDAxLCAweDUxLCAweDIwLCAweDMxLAotCTB4MDAsIDB4NjUsIDB4MzQsIDB4NDUsCisJMHgwMCwgMHg2NSwgMHgzNiwgMHg0NSwKIAkweDNmLCAweGJhLCAweGM4LCAweDA4LAotCTB4MDAsIDB4M2UsIDB4MzQsIDB4NzUsCi0JMHgwMCwgMHg2NSwgMHhiMCwgMHg1ZSwKKwkweDAwLCAweDNlLCAweDM2LCAweDc1LAorCTB4MDAsIDB4NjUsIDB4YjIsIDB4NWUsCiAJMHg4MCwgMHgzYywgMHg3OCwgMHgwMCwKIAkweDAxLCAweDA2LCAweGQ0LCAweDMwLAotCTB4MDAsIDB4NjUsIDB4ZDgsIDB4NWQsCisJMHgwMCwgMHg2NSwgMHhkYSwgMHg1ZCwKIAkweDAxLCAweDNjLCAweDc4LCAweDAwLAotCTB4ZTAsIDB4M2YsIDB4NTAsIDB4NjUsCisJMHhlMCwgMHgzZiwgMHg1MiwgMHg2NSwKIAkweDAyLCAweDNjLCAweDc4LCAweDAwLAotCTB4MjAsIDB4MTIsIDB4NTAsIDB4NjUsCi0JMHg1MSwgMHg2YSwgMHg1ZSwgMHg1ZCwKLQkweDAwLCAweDUxLCAweDhlLCAweDVkLAotCTB4NTEsIDB4NmEsIDB4NWUsIDB4NWQsCisJMHgyMCwgMHgxMiwgMHg1MiwgMHg2NSwKKwkweDUxLCAweDZhLCAweDYwLCAweDVkLAorCTB4MDAsIDB4NTEsIDB4OTAsIDB4NWQsCisJMHg1MSwgMHg2YSwgMHg2MCwgMHg1ZCwKIAkweDAxLCAweDUxLCAweDIwLCAweDMxLAogCTB4MDQsIDB4M2MsIDB4NzgsIDB4MDAsCiAJMHgwMSwgMHhiOSwgMHhjOCwgMHgzMCwKLQkweDAwLCAweDNkLCAweDRlLCAweDY1LAorCTB4MDAsIDB4M2QsIDB4NTAsIDB4NjUsCiAJMHgwOCwgMHgzYywgMHg3OCwgMHgwMCwKIAkweDNmLCAweGJhLCAweGM4LCAweDA4LAotCTB4MDAsIDB4M2UsIDB4NGUsIDB4NjUsCisJMHgwMCwgMHgzZSwgMHg1MCwgMHg2NSwKIAkweDEwLCAweDNjLCAweDc4LCAweDAwLAotCTB4MDQsIDB4YjgsIDB4NGUsIDB4N2QsCisJMHgwNCwgMHhiOCwgMHg1MCwgMHg3ZCwKIAkweGZiLCAweGI4LCAweDcwLCAweDA5LAotCTB4MjAsIDB4YjgsIDB4NDQsIDB4NmQsCisJMHgyMCwgMHhiOCwgMHg0NiwgMHg2ZCwKIAkweDAxLCAweDkwLCAweGM4LCAweDMwLAogCTB4ZmYsIDB4NmEsIDB4YTIsIDB4MDAsCi0JMHgwMCwgMHgzZCwgMHhjZSwgMHg1YywKKwkweDAwLCAweDNkLCAweGQwLCAweDVjLAogCTB4MDEsIDB4NjQsIDB4MjAsIDB4MzEsCiAJMHhmZiwgMHg2YSwgMHg3OCwgMHgwOCwKIAkweDAwLCAweDY1LCAweGVhLCAweDU4LAotCTB4MTAsIDB4YjgsIDB4NWMsIDB4N2MsCi0JMHhmZiwgMHg2YSwgMHg1NCwgMHg1ZCwKLQkweDAwLCAweDY1LCAweDVjLCAweDQ0LAotCTB4MDAsIDB4NjUsIDB4YjAsIDB4NWUsCi0JMHgzMSwgMHg2YSwgMHhkOCwgMHg1ZSwKLQkweDAwLCAweDY1LCAweDVjLCAweDQ0LAorCTB4MTAsIDB4YjgsIDB4NWUsIDB4N2MsCisJMHhmZiwgMHg2YSwgMHg1NiwgMHg1ZCwKKwkweDAwLCAweDY1LCAweDVlLCAweDQ0LAorCTB4MDAsIDB4NjUsIDB4YjIsIDB4NWUsCisJMHgzMSwgMHg2YSwgMHhkYSwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDVlLCAweDQ0LAogCTB4MTAsIDB4M2YsIDB4MDYsIDB4MDAsCiAJMHgxMCwgMHg2YSwgMHgwNiwgMHgwMCwKIAkweDAxLCAweDY1LCAweDc0LCAweDM0LAotCTB4ODEsIDB4NmEsIDB4ZDgsIDB4NWUsCi0JMHgwMCwgMHg2NSwgMHg2MCwgMHg0NSwKKwkweDgxLCAweDZhLCAweGRhLCAweDVlLAorCTB4MDAsIDB4NjUsIDB4NjIsIDB4NDUsCiAJMHgwMSwgMHgwNiwgMHhkNCwgMHgzMCwKLQkweDAxLCAweDBjLCAweDYwLCAweDdkLAotCTB4MDQsIDB4MGMsIDB4NWEsIDB4NmQsCisJMHgwMSwgMHgwYywgMHg2MiwgMHg3ZCwKKwkweDA0LCAweDBjLCAweDVjLCAweDZkLAogCTB4ZTAsIDB4MDMsIDB4N2UsIDB4MDgsCiAJMHhlMCwgMHgzZiwgMHhjYywgMHg2MSwKIAkweDAxLCAweDY1LCAweGNjLCAweDMwLAogCTB4MDEsIDB4MTIsIDB4ZGEsIDB4MzQsCiAJMHgwMSwgMHgwNiwgMHhkNCwgMHgzNCwKLQkweDAxLCAweDAzLCAweDZlLCAweDZkLAorCTB4MDEsIDB4MDMsIDB4NzAsIDB4NmQsCiAJMHg0MCwgMHgwMywgMHhjYywgMHgwOCwKIAkweDAxLCAweDY1LCAweDA2LCAweDMwLAogCTB4NDAsIDB4NjUsIDB4YzgsIDB4MDgsCi0JMHgwMCwgMHg2NiwgMHg3YywgMHg3NSwKLQkweDQwLCAweDY1LCAweDdjLCAweDdkLAotCTB4MDAsIDB4NjUsIDB4N2MsIDB4NWQsCisJMHgwMCwgMHg2NiwgMHg3ZSwgMHg3NSwKKwkweDQwLCAweDY1LCAweDdlLCAweDdkLAorCTB4MDAsIDB4NjUsIDB4N2UsIDB4NWQsCiAJMHhmZiwgMHg2YSwgMHhkNCwgMHgwOCwKIAkweGZmLCAweDZhLCAweGQ0LCAweDA4LAogCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCiAJMHhmZiwgMHg2YSwgMHhkNCwgMHgwYywKIAkweDA4LCAweDAxLCAweDAyLCAweDAwLAotCTB4MDIsIDB4MGIsIDB4ODYsIDB4N2QsCisJMHgwMiwgMHgwYiwgMHg4OCwgMHg3ZCwKIAkweDAxLCAweDY1LCAweDBjLCAweDMwLAotCTB4MDIsIDB4MGIsIDB4OGEsIDB4N2QsCisJMHgwMiwgMHgwYiwgMHg4YywgMHg3ZCwKIAkweGY3LCAweDAxLCAweDAyLCAweDBjLAogCTB4MDEsIDB4NjUsIDB4YzgsIDB4MzAsCi0JMHhmZiwgMHg0MSwgMHhhZSwgMHg3NSwKKwkweGZmLCAweDQxLCAweGIwLCAweDc1LAogCTB4MDEsIDB4NDEsIDB4MjAsIDB4MzEsCiAJMHhmZiwgMHg2YSwgMHhhNCwgMHgwMCwKLQkweDAwLCAweDY1LCAweDllLCAweDQ1LAotCTB4ZmYsIDB4YmYsIDB4YWUsIDB4NzUsCisJMHgwMCwgMHg2NSwgMHhhMCwgMHg0NSwKKwkweGZmLCAweGJmLCAweGIwLCAweDc1LAogCTB4MDEsIDB4OTAsIDB4YTQsIDB4MzAsCiAJMHgwMSwgMHhiZiwgMHgyMCwgMHgzMSwKLQkweDAwLCAweGJiLCAweDk4LCAweDY1LAotCTB4ZmYsIDB4NTIsIDB4YWMsIDB4NzUsCisJMHgwMCwgMHhiYiwgMHg5YSwgMHg2NSwKKwkweGZmLCAweDUyLCAweGFlLCAweDc1LAogCTB4MDEsIDB4YmYsIDB4Y2MsIDB4MzAsCiAJMHgwMSwgMHg5MCwgMHhjYSwgMHgzMCwKIAkweDAxLCAweDUyLCAweDIwLCAweDMxLApAQCAtNzM0LDI4ICs3MzUsMjggQEAKIAkweDAxLCAweDY1LCAweDIwLCAweDM1LAogCTB4MDEsIDB4YmYsIDB4ODIsIDB4MzQsCiAJMHgwMSwgMHg2NCwgMHhhMiwgMHgzMCwKLQkweDAwLCAweDZhLCAweGMwLCAweDVlLAorCTB4MDAsIDB4NmEsIDB4YzIsIDB4NWUsCiAJMHgwZCwgMHg2YSwgMHg3NiwgMHgwMCwKLQkweDAwLCAweDUxLCAweDEyLCAweDQ2LAorCTB4MDAsIDB4NTEsIDB4MTQsIDB4NDYsCiAJMHgwMSwgMHg2NSwgMHhhNCwgMHgzMCwKIAkweGUwLCAweDZhLCAweGNjLCAweDAwLAotCTB4NDgsIDB4NmEsIDB4MDYsIDB4NWUsCisJMHg0OCwgMHg2YSwgMHgwOCwgMHg1ZSwKIAkweDAxLCAweDZhLCAweGQwLCAweDAxLAogCTB4MDEsIDB4NmEsIDB4ZGMsIDB4MDUsCiAJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKLQkweDQ4LCAweDZhLCAweDA2LCAweDVlLAotCTB4MDEsIDB4NmEsIDB4ZTAsIDB4NWQsCisJMHg0OCwgMHg2YSwgMHgwOCwgMHg1ZSwKKwkweDAxLCAweDZhLCAweGUyLCAweDVkLAogCTB4MDEsIDB4NmEsIDB4MjYsIDB4MDUsCiAJMHgwMSwgMHg2NSwgMHhkOCwgMHgzMSwKIAkweDA5LCAweGVlLCAweGRjLCAweDAxLAotCTB4ODAsIDB4ZWUsIDB4Y2MsIDB4N2QsCisJMHg4MCwgMHhlZSwgMHhjZSwgMHg3ZCwKIAkweGZmLCAweDZhLCAweGRjLCAweDBkLAogCTB4MDEsIDB4NjUsIDB4MzIsIDB4MzEsCiAJMHgwYSwgMHg5MywgMHgyNiwgMHgwMSwKLQkweDAwLCAweDY1LCAweGE4LCAweDQ2LAotCTB4ODEsIDB4NmEsIDB4ZDgsIDB4NWUsCi0JMHgwMSwgMHgwYywgMHhkOCwgMHg3ZCwKLQkweDA0LCAweDBjLCAweGQ2LCAweDZkLAorCTB4MDAsIDB4NjUsIDB4YWEsIDB4NDYsCisJMHg4MSwgMHg2YSwgMHhkYSwgMHg1ZSwKKwkweDAxLCAweDBjLCAweGRhLCAweDdkLAorCTB4MDQsIDB4MGMsIDB4ZDgsIDB4NmQsCiAJMHhlMCwgMHgwMywgMHgwNiwgMHgwOCwKIAkweGUwLCAweDAzLCAweDdlLCAweDBjLAogCTB4MDEsIDB4NjUsIDB4MTgsIDB4MzEsCkBAIC03NzQsNyArNzc1LDcgQEAKIAkweDAxLCAweDZjLCAweGRhLCAweDM0LAogCTB4M2QsIDB4NjQsIDB4YTQsIDB4MjgsCiAJMHg1NSwgMHg2NCwgMHhjOCwgMHgyOCwKLQkweDAwLCAweDY1LCAweDA2LCAweDQ2LAorCTB4MDAsIDB4NjUsIDB4MDgsIDB4NDYsCiAJMHgyZSwgMHg2NCwgMHhhNCwgMHgyOCwKIAkweDY2LCAweDY0LCAweGM4LCAweDI4LAogCTB4MDAsIDB4NmMsIDB4ZGEsIDB4MTgsCkBAIC03ODUsNjMgKzc4Niw2MyBAQAogCTB4MDAsIDB4NmMsIDB4ZGEsIDB4MjQsCiAJMHgwMSwgMHg2NSwgMHhjOCwgMHgzMCwKIAkweGUwLCAweDZhLCAweGNjLCAweDAwLAotCTB4NDQsIDB4NmEsIDB4MDIsIDB4NWUsCisJMHg0NCwgMHg2YSwgMHgwNCwgMHg1ZSwKIAkweDAxLCAweDkwLCAweGUyLCAweDMxLAotCTB4MDQsIDB4M2IsIDB4MjYsIDB4N2UsCisJMHgwNCwgMHgzYiwgMHgyOCwgMHg3ZSwKIAkweDMwLCAweDZhLCAweGQwLCAweDAxLAogCTB4MjAsIDB4NmEsIDB4ZDAsIDB4MDEsCiAJMHgxZCwgMHg2YSwgMHhkYywgMHgwMSwKLQkweGRjLCAweGVlLCAweDIyLCAweDY2LAotCTB4MDAsIDB4NjUsIDB4M2UsIDB4NDYsCisJMHhkYywgMHhlZSwgMHgyNCwgMHg2NiwKKwkweDAwLCAweDY1LCAweDQwLCAweDQ2LAogCTB4MjAsIDB4NmEsIDB4ZDAsIDB4MDEsCiAJMHgwMSwgMHg2YSwgMHhkYywgMHgwMSwKIAkweDIwLCAweGEwLCAweGQ4LCAweDMxLAogCTB4MDksIDB4ZWUsIDB4ZGMsIDB4MDEsCi0JMHg4MCwgMHhlZSwgMHgyZSwgMHg3ZSwKKwkweDgwLCAweGVlLCAweDMwLCAweDdlLAogCTB4MTEsIDB4NmEsIDB4ZGMsIDB4MDEsCi0JMHg1MCwgMHhlZSwgMHgzMiwgMHg2NiwKKwkweDUwLCAweGVlLCAweDM0LCAweDY2LAogCTB4MjAsIDB4NmEsIDB4ZDAsIDB4MDEsCiAJMHgwOSwgMHg2YSwgMHhkYywgMHgwMSwKLQkweDg4LCAweGVlLCAweDM4LCAweDY2LAorCTB4ODgsIDB4ZWUsIDB4M2EsIDB4NjYsCiAJMHgxOSwgMHg2YSwgMHhkYywgMHgwMSwKLQkweGQ4LCAweGVlLCAweDNjLCAweDY2LAorCTB4ZDgsIDB4ZWUsIDB4M2UsIDB4NjYsCiAJMHhmZiwgMHg2YSwgMHhkYywgMHgwOSwKLQkweDE4LCAweGVlLCAweDQwLCAweDZlLAorCTB4MTgsIDB4ZWUsIDB4NDIsIDB4NmUsCiAJMHhmZiwgMHg2YSwgMHhkNCwgMHgwYywKIAkweDg4LCAweDZhLCAweGNjLCAweDAwLAotCTB4NDQsIDB4NmEsIDB4MDIsIDB4NWUsCi0JMHgyMCwgMHg2YSwgMHhlMCwgMHg1ZCwKKwkweDQ0LCAweDZhLCAweDA0LCAweDVlLAorCTB4MjAsIDB4NmEsIDB4ZTIsIDB4NWQsCiAJMHgwMSwgMHgzYiwgMHgyNiwgMHgzMSwKLQkweDA0LCAweDNiLCAweDVhLCAweDZlLAorCTB4MDQsIDB4M2IsIDB4NWMsIDB4NmUsCiAJMHhhMCwgMHg2YSwgMHhjYSwgMHgwMCwKIAkweDIwLCAweDY1LCAweGM4LCAweDE4LAotCTB4MDAsIDB4NjUsIDB4OTgsIDB4NWUsCi0JMHgwMCwgMHg2NSwgMHg1MiwgMHg2NiwKKwkweDAwLCAweDY1LCAweDlhLCAweDVlLAorCTB4MDAsIDB4NjUsIDB4NTQsIDB4NjYsCiAJMHgwYSwgMHg5MywgMHgyNiwgMHgwMSwKLQkweDAwLCAweDY1LCAweGE4LCAweDQ2LAorCTB4MDAsIDB4NjUsIDB4YWEsIDB4NDYsCiAJMHhhMCwgMHg2YSwgMHhjYywgMHgwMCwKIAkweGZmLCAweDZhLCAweGM4LCAweDA4LAotCTB4MjAsIDB4OTQsIDB4NWUsIDB4NmUsCi0JMHgxMCwgMHg5NCwgMHg2MCwgMHg2ZSwKLQkweDA4LCAweDk0LCAweDdhLCAweDZlLAotCTB4MDgsIDB4OTQsIDB4N2EsIDB4NmUsCi0JMHgwOCwgMHg5NCwgMHg3YSwgMHg2ZSwKKwkweDIwLCAweDk0LCAweDYwLCAweDZlLAorCTB4MTAsIDB4OTQsIDB4NjIsIDB4NmUsCisJMHgwOCwgMHg5NCwgMHg3YywgMHg2ZSwKKwkweDA4LCAweDk0LCAweDdjLCAweDZlLAorCTB4MDgsIDB4OTQsIDB4N2MsIDB4NmUsCiAJMHhmZiwgMHg4YywgMHhjOCwgMHgxMCwKIAkweGMxLCAweDY0LCAweGM4LCAweDE4LAogCTB4ZjgsIDB4NjQsIDB4YzgsIDB4MDgsCiAJMHgwMSwgMHg5OSwgMHhkYSwgMHgzMCwKLQkweDAwLCAweDY2LCAweDZlLCAweDY2LAotCTB4YzAsIDB4NjYsIDB4YWEsIDB4NzYsCisJMHgwMCwgMHg2NiwgMHg3MCwgMHg2NiwKKwkweGMwLCAweDY2LCAweGFjLCAweDc2LAogCTB4NjAsIDB4NjYsIDB4YzgsIDB4MTgsCiAJMHgzZCwgMHg2NCwgMHhjOCwgMHgyOCwKLQkweDAwLCAweDY1LCAweDVlLCAweDQ2LAorCTB4MDAsIDB4NjUsIDB4NjAsIDB4NDYsCiAJMHhmNywgMHg5MywgMHgyNiwgMHgwOSwKLQkweDA4LCAweDkzLCAweDdjLCAweDZlLAorCTB4MDgsIDB4OTMsIDB4N2UsIDB4NmUsCiAJMHgwMCwgMHg2MiwgMHhjNCwgMHgxOCwKLQkweDAwLCAweDY1LCAweGE4LCAweDVlLAotCTB4MDAsIDB4NjUsIDB4ODgsIDB4NWUsCi0JMHgwMCwgMHg2NSwgMHg4OCwgMHg1ZSwKLQkweDAwLCAweDY1LCAweDg4LCAweDVlLAorCTB4MDAsIDB4NjUsIDB4YWEsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHg4YSwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDhhLCAweDVlLAorCTB4MDAsIDB4NjUsIDB4OGEsIDB4NWUsCiAJMHgwMSwgMHg5OSwgMHhkYSwgMHgzMCwKIAkweDAxLCAweDk5LCAweGRhLCAweDMwLAogCTB4MDEsIDB4OTksIDB4ZGEsIDB4MzAsCkBAIC04NTgsMTEgKzg1OSwxMSBAQAogCTB4MDEsIDB4NmMsIDB4MzIsIDB4MzEsCiAJMHgwMSwgMHg2YywgMHgzMiwgMHgzMSwKIAkweDAxLCAweDZjLCAweDMyLCAweDM1LAotCTB4MDgsIDB4OTQsIDB4YTgsIDB4N2UsCisJMHgwOCwgMHg5NCwgMHhhYSwgMHg3ZSwKIAkweGY3LCAweDkzLCAweDI2LCAweDA5LAotCTB4MDgsIDB4OTMsIDB4YWMsIDB4NmUsCisJMHgwOCwgMHg5MywgMHhhZSwgMHg2ZSwKIAkweGZmLCAweDZhLCAweGQ0LCAweDBjLAotCTB4MDQsIDB4YjgsIDB4ZDQsIDB4NmUsCisJMHgwNCwgMHhiOCwgMHhkNiwgMHg2ZSwKIAkweDAxLCAweDQyLCAweDdlLCAweDMxLAogCTB4ZmYsIDB4NmEsIDB4NzYsIDB4MDEsCiAJMHgwMSwgMHg5MCwgMHg4NCwgMHgzNCwKQEAgLTg3MCwxNCArODcxLDE0IEBACiAJMHgwMSwgMHg4NSwgMHgwYSwgMHgwMSwKIAkweDdmLCAweDY1LCAweDEwLCAweDA5LAogCTB4ZmUsIDB4ODUsIDB4MGEsIDB4MGQsCi0JMHhmZiwgMHg0MiwgMHhkMCwgMHg2NiwKLQkweGZmLCAweDQxLCAweGM4LCAweDY2LAotCTB4ZDEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHhmZiwgMHg0MiwgMHhkMiwgMHg2NiwKKwkweGZmLCAweDQxLCAweGNhLCAweDY2LAorCTB4ZDEsIDB4NmEsIDB4ZGEsIDB4NWUsCiAJMHhmZiwgMHg2YSwgMHhjYSwgMHgwNCwKIAkweDAxLCAweDQxLCAweDIwLCAweDMxLAogCTB4MDEsIDB4YmYsIDB4ODIsIDB4MzAsCiAJMHgwMSwgMHg2YSwgMHg3NiwgMHgwMCwKLQkweDAwLCAweGJiLCAweDEyLCAweDQ2LAorCTB4MDAsIDB4YmIsIDB4MTQsIDB4NDYsCiAJMHgwMSwgMHg0MiwgMHgyMCwgMHgzMSwKIAkweDAxLCAweGJmLCAweDg0LCAweDM0LAogCTB4MDEsIDB4NDEsIDB4N2UsIDB4MzEsCkBAIC05NDEsNyArOTQyLDcgQEAKIHN0YXRpYyBpbnQKIGFoY19wYXRjaDE3X2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQogewotCXJldHVybiAoKGFoYy0+ZmxhZ3MgJiBBSENfVE1PREVfV0lERU9ERF9CVUcpICE9IDApOworCXJldHVybiAoKGFoYy0+YnVncyAmIEFIQ19UTU9ERV9XSURFT0REX0JVRykgIT0gMCk7CiB9CiAKIHN0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDE2X2Z1bmM7CkBAIC0xMTQyLDE1MiArMTE0MywxNTIgQEAKIAl7IGFoY19wYXRjaDBfZnVuYywgMTk2LCAxLCAxIH0sCiAJeyBhaGNfcGF0Y2g5X2Z1bmMsIDIxMiwgNiwgMiB9LAogCXsgYWhjX3BhdGNoMF9mdW5jLCAyMTgsIDYsIDEgfSwKLQl7IGFoY19wYXRjaDhfZnVuYywgMjI2LCAyMCwgMiB9LAorCXsgYWhjX3BhdGNoOF9mdW5jLCAyMjYsIDIxLCAyIH0sCiAJeyBhaGNfcGF0Y2gxX2Z1bmMsIDI0MSwgMSwgMSB9LAotCXsgYWhjX3BhdGNoMV9mdW5jLCAyNDgsIDEsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgMjQ5LCAyLCAyIH0sCi0JeyBhaGNfcGF0Y2gxMV9mdW5jLCAyNTAsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgMjU4LCAyNywgMyB9LAotCXsgYWhjX3BhdGNoMV9mdW5jLCAyNzQsIDEwLCAyIH0sCi0JeyBhaGNfcGF0Y2gxM19mdW5jLCAyNzcsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDE0X2Z1bmMsIDI4NSwgMTQsIDEgfSwKLQl7IGFoY19wYXRjaDFfZnVuYywgMzAxLCAxLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDMwMiwgMSwgMSB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCAzMDUsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDEzX2Z1bmMsIDMxMCwgMSwgMSB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCAzMTEsIDIsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgMzEzLCA0LCAxIH0sCi0JeyBhaGNfcGF0Y2gxNF9mdW5jLCAzMTcsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDE1X2Z1bmMsIDMxOSwgMiwgMyB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCAzMTksIDEsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgMzIwLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g2X2Z1bmMsIDMyNSwgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCAzMjYsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDFfZnVuYywgMzMwLCA0NywgMTEgfSwKLQl7IGFoY19wYXRjaDZfZnVuYywgMzM3LCAyLCA0IH0sCi0JeyBhaGNfcGF0Y2g3X2Z1bmMsIDMzNywgMSwgMSB9LAotCXsgYWhjX3BhdGNoOF9mdW5jLCAzMzgsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgMzM5LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxNl9mdW5jLCAzNDAsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDZfZnVuYywgMzU2LCA2LCAzIH0sCi0JeyBhaGNfcGF0Y2gxNl9mdW5jLCAzNTYsIDUsIDEgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgMzYyLCA3LCAxIH0sCi0JeyBhaGNfcGF0Y2gxM19mdW5jLCAzNzIsIDUsIDEgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgMzc3LCA1MiwgMTcgfSwKLQl7IGFoY19wYXRjaDE0X2Z1bmMsIDM3NywgMSwgMSB9LAotCXsgYWhjX3BhdGNoN19mdW5jLCAzNzksIDIsIDIgfSwKLQl7IGFoY19wYXRjaDE3X2Z1bmMsIDM4MCwgMSwgMSB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCAzODMsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDE4X2Z1bmMsIDM5MCwgMSwgMSB9LAotCXsgYWhjX3BhdGNoMTRfZnVuYywgMzk1LCA5LCAzIH0sCi0JeyBhaGNfcGF0Y2g5X2Z1bmMsIDM5NiwgMywgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCAzOTksIDMsIDEgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgNDA3LCA2LCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDQxMywgOSwgMiB9LAotCXsgYWhjX3BhdGNoMTNfZnVuYywgNDEzLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxM19mdW5jLCA0MjIsIDIsIDEgfSwKLQl7IGFoY19wYXRjaDE0X2Z1bmMsIDQyNCwgMSwgMSB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCA0MjYsIDEsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNDI3LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g3X2Z1bmMsIDQyOCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCAyNDksIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMjUwLCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gxMV9mdW5jLCAyNTEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgMjU5LCAyNywgMyB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCAyNzUsIDEwLCAyIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCAyNzgsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE0X2Z1bmMsIDI4NiwgMTQsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgMzAyLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDMwMywgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzMDYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDEzX2Z1bmMsIDMxMSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzMTIsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzE0LCA0LCAxIH0sCisJeyBhaGNfcGF0Y2gxNF9mdW5jLCAzMTgsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE1X2Z1bmMsIDMyMCwgMiwgMyB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzMjAsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzIxLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g2X2Z1bmMsIDMyNiwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCAzMjcsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgMzMxLCA0NywgMTEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgMzM4LCAyLCA0IH0sCisJeyBhaGNfcGF0Y2g3X2Z1bmMsIDMzOCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOF9mdW5jLCAzMzksIDEsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzQwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxNl9mdW5jLCAzNDEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgMzU3LCA2LCAzIH0sCisJeyBhaGNfcGF0Y2gxNl9mdW5jLCAzNTcsIDUsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzYzLCA3LCAxIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCAzNzMsIDUsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzc4LCA1MiwgMTcgfSwKKwl7IGFoY19wYXRjaDE0X2Z1bmMsIDM3OCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCAzODAsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDE3X2Z1bmMsIDM4MSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzODQsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE4X2Z1bmMsIDM5MSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTRfZnVuYywgMzk2LCA5LCAzIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDM5NywgMywgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0MDAsIDMsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDA4LCA2LCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQxNCwgOSwgMiB9LAorCXsgYWhjX3BhdGNoMTNfZnVuYywgNDE0LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCA0MjMsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDE0X2Z1bmMsIDQyNSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0MjcsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDI4LCAxLCAxIH0sCiAJeyBhaGNfcGF0Y2g3X2Z1bmMsIDQyOSwgMSwgMSB9LAotCXsgYWhjX3BhdGNoOF9mdW5jLCA0MzAsIDMsIDMgfSwKLQl7IGFoY19wYXRjaDZfZnVuYywgNDMxLCAxLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDQzMiwgMSwgMSB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCA0MzMsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDE1X2Z1bmMsIDQzNCwgMSwgMiB9LAotCXsgYWhjX3BhdGNoMTNfZnVuYywgNDM0LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxNF9mdW5jLCA0MzYsIDksIDQgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgNDM2LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g5X2Z1bmMsIDQ0MywgMiwgMSB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA0NDUsIDQsIDMgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgNDQ1LCAxLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ0NiwgMywgMSB9LAotCXsgYWhjX3BhdGNoMV9mdW5jLCA0NTAsIDIsIDEgfSwKLQl7IGFoY19wYXRjaDdfZnVuYywgNDUyLCAxMCwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA0NjIsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDhfZnVuYywgNDYzLCAxMTgsIDIyIH0sCi0JeyBhaGNfcGF0Y2gxX2Z1bmMsIDQ2NSwgMywgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA0NjgsIDUsIDMgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgNDY4LCAyLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ3MCwgMywgMSB9LAotCXsgYWhjX3BhdGNoMV9mdW5jLCA0NzUsIDIsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNDc3LCA2LCAzIH0sCi0JeyBhaGNfcGF0Y2g5X2Z1bmMsIDQ3NywgMiwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA0NzksIDMsIDEgfSwKLQl7IGFoY19wYXRjaDFfZnVuYywgNDg1LCAyLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ4NywgOSwgNyB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCA0ODcsIDUsIDYgfSwKLQl7IGFoY19wYXRjaDE5X2Z1bmMsIDQ4NywgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA0ODgsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDE5X2Z1bmMsIDQ5MCwgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA0OTEsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNDkyLCA0LCAxIH0sCi0JeyBhaGNfcGF0Y2g2X2Z1bmMsIDQ5NywgMywgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA1MDAsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDZfZnVuYywgNTEwLCAxLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDUxMSwgMSwgMSB9LAotCXsgYWhjX3BhdGNoMjBfZnVuYywgNTQ4LCA3LCAxIH0sCi0JeyBhaGNfcGF0Y2gzX2Z1bmMsIDU4MywgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA1ODQsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDIxX2Z1bmMsIDU4NywgMSwgMSB9LAotCXsgYWhjX3BhdGNoOF9mdW5jLCA1ODksIDEwNiwgMzMgfSwKLQl7IGFoY19wYXRjaDRfZnVuYywgNTkxLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxX2Z1bmMsIDU5NywgMiwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA1OTksIDEsIDEgfSwKLQl7IGFoY19wYXRjaDFfZnVuYywgNjAyLCAxLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDYwMywgMSwgMSB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCA2MDQsIDMsIDMgfSwKLQl7IGFoY19wYXRjaDE1X2Z1bmMsIDYwNSwgMSwgMSB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA2MDcsIDQsIDEgfSwKLQl7IGFoY19wYXRjaDE5X2Z1bmMsIDYxNiwgMiwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA2MTgsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDE5X2Z1bmMsIDYyMiwgMTAsIDMgfSwKLQl7IGFoY19wYXRjaDVfZnVuYywgNjI0LCA4LCAxIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDYzMiwgOSwgMiB9LAotCXsgYWhjX3BhdGNoNV9mdW5jLCA2MzMsIDgsIDEgfSwKLQl7IGFoY19wYXRjaDRfZnVuYywgNjQzLCAxLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDY0NCwgMSwgMSB9LAotCXsgYWhjX3BhdGNoMTlfZnVuYywgNjQ1LCAxLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDY0NiwgMywgMiB9LAotCXsgYWhjX3BhdGNoNF9mdW5jLCA2NDgsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDVfZnVuYywgNjQ5LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g1X2Z1bmMsIDY1MiwgMSwgMSB9LAotCXsgYWhjX3BhdGNoNV9mdW5jLCA2NTQsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDRfZnVuYywgNjU2LCAyLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDY1OCwgMiwgMSB9LAotCXsgYWhjX3BhdGNoNV9mdW5jLCA2NjAsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDVfZnVuYywgNjYzLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g1X2Z1bmMsIDY2NiwgMSwgMSB9LAotCXsgYWhjX3BhdGNoMTlfZnVuYywgNjcwLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxOV9mdW5jLCA2NzMsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDRfZnVuYywgNjc5LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g2X2Z1bmMsIDY4MiwgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA2ODMsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDdfZnVuYywgNjk1LCAxNiwgMSB9LAotCXsgYWhjX3BhdGNoNF9mdW5jLCA3MTEsIDIwLCAxIH0sCi0JeyBhaGNfcGF0Y2g5X2Z1bmMsIDczMiwgNCwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA3MzYsIDQsIDEgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgNzQwLCA0LCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDc0NCwgMywgMSB9LAotCXsgYWhjX3BhdGNoNl9mdW5jLCA3NTAsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDIyX2Z1bmMsIDc1MiwgMTQsIDEgfSwKLQl7IGFoY19wYXRjaDdfZnVuYywgNzY2LCAzLCAxIH0sCi0JeyBhaGNfcGF0Y2g5X2Z1bmMsIDc3OCwgMjQsIDggfSwKLQl7IGFoY19wYXRjaDE5X2Z1bmMsIDc4MiwgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA3ODMsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDE1X2Z1bmMsIDc4OCwgNCwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA3OTIsIDcsIDMgfSwKLQl7IGFoY19wYXRjaDIzX2Z1bmMsIDc5MiwgNSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA3OTcsIDIsIDEgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgODAyLCA0MiwgMyB9LAotCXsgYWhjX3BhdGNoMThfZnVuYywgODE0LCAxOCwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA4MzIsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDRfZnVuYywgODU2LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g0X2Z1bmMsIDg1NywgMywgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA4NjAsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDEzX2Z1bmMsIDg2MSwgMywgMSB9LAotCXsgYWhjX3BhdGNoNF9mdW5jLCA4NjQsIDEyLCAxIH0KKwl7IGFoY19wYXRjaDdfZnVuYywgNDMwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g4X2Z1bmMsIDQzMSwgMywgMyB9LAorCXsgYWhjX3BhdGNoNl9mdW5jLCA0MzIsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDMzLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDQzNCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTVfZnVuYywgNDM1LCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCA0MzUsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE0X2Z1bmMsIDQzNywgOSwgNCB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0MzcsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDQ0LCAyLCAxIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ0NiwgNCwgMyB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0NDYsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDQ3LCAzLCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDQ1MSwgMiwgMSB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCA0NTMsIDEwLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ2MywgMSwgMSB9LAorCXsgYWhjX3BhdGNoOF9mdW5jLCA0NjQsIDExOCwgMjIgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgNDY2LCAzLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ2OSwgNSwgMyB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0NjksIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDcxLCAzLCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDQ3NiwgMiwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0NzgsIDYsIDMgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDc4LCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ4MCwgMywgMSB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCA0ODYsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDg4LCA5LCA3IH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDQ4OCwgNSwgNiB9LAorCXsgYWhjX3BhdGNoMTlfZnVuYywgNDg4LCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ4OSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTlfZnVuYywgNDkxLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ5MiwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0OTMsIDQsIDEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgNDk4LCAzLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDUwMSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoNl9mdW5jLCA1MTEsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTEyLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gyMF9mdW5jLCA1NDksIDcsIDEgfSwKKwl7IGFoY19wYXRjaDNfZnVuYywgNTg0LCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDU4NSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMjFfZnVuYywgNTg4LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g4X2Z1bmMsIDU5MCwgMTA2LCAzMyB9LAorCXsgYWhjX3BhdGNoNF9mdW5jLCA1OTIsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgNTk4LCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDYwMCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCA2MDMsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjA0LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDYwNSwgMywgMyB9LAorCXsgYWhjX3BhdGNoMTVfZnVuYywgNjA2LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDYwOCwgNCwgMSB9LAorCXsgYWhjX3BhdGNoMTlfZnVuYywgNjE3LCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDYxOSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTlfZnVuYywgNjIzLCAxMCwgMyB9LAorCXsgYWhjX3BhdGNoNV9mdW5jLCA2MjUsIDgsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjMzLCA5LCAyIH0sCisJeyBhaGNfcGF0Y2g1X2Z1bmMsIDYzNCwgOCwgMSB9LAorCXsgYWhjX3BhdGNoNF9mdW5jLCA2NDQsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjQ1LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA2NDYsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjQ3LCAzLCAyIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDY0OSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoNV9mdW5jLCA2NTAsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgNjUzLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g1X2Z1bmMsIDY1NSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoNF9mdW5jLCA2NTcsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjU5LCAyLCAxIH0sCisJeyBhaGNfcGF0Y2g1X2Z1bmMsIDY2MSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoNV9mdW5jLCA2NjQsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgNjY3LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA2NzEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE5X2Z1bmMsIDY3NCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoNF9mdW5jLCA2ODAsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgNjgzLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDY4NCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCA2OTYsIDE2LCAxIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDcxMiwgMjAsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNzMzLCA0LCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDczNywgNCwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA3NDEsIDQsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzQ1LCAzLCAxIH0sCisJeyBhaGNfcGF0Y2g2X2Z1bmMsIDc1MSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMjJfZnVuYywgNzUzLCAxNCwgMSB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCA3NjcsIDMsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNzc5LCAyNCwgOCB9LAorCXsgYWhjX3BhdGNoMTlfZnVuYywgNzgzLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDc4NCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTVfZnVuYywgNzg5LCA0LCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDc5MywgNywgMyB9LAorCXsgYWhjX3BhdGNoMjNfZnVuYywgNzkzLCA1LCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDc5OCwgMiwgMSB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA4MDMsIDQyLCAzIH0sCisJeyBhaGNfcGF0Y2gxOF9mdW5jLCA4MTUsIDE4LCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDgzMywgMSwgMSB9LAorCXsgYWhjX3BhdGNoNF9mdW5jLCA4NTcsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgODU4LCAzLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDg2MSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTNfZnVuYywgODYyLCAzLCAxIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDg2NSwgMTIsIDEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBjcyB7CkBAIC0xMjk2LDExICsxMjk3LDExIEBACiB9IGNyaXRpY2FsX3NlY3Rpb25zW10gPSB7CiAJeyAxMSwgMTggfSwKIAl7IDIxLCAzMCB9LAotCXsgNzExLCA3MjcgfSwKLQl7IDg1NywgODYwIH0sCi0JeyA4NjQsIDg3MCB9LAotCXsgODcyLCA4NzQgfSwKLQl7IDg3NCwgODc2IH0KKwl7IDcxMiwgNzI4IH0sCisJeyA4NTgsIDg2MSB9LAorCXsgODY1LCA4NzEgfSwKKwl7IDg3MywgODc1IH0sCisJeyA4NzUsIDg3NyB9CiB9OwogCiBzdGF0aWMgY29uc3QgaW50IG51bV9jcml0aWNhbF9zZWN0aW9ucyA9IHNpemVvZihjcml0aWNhbF9zZWN0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljbGliLmMKaW5kZXggN2M1YTZkYi4uODI4YWUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljbGliLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljbGliLmMKQEAgLTMwLDEzODIgKzMwLDUgQEAKICAqICRJZCQKICAqLwogCi0jaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KLS8qIENvcmUgU0NTSSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSAiYWljbGliLmgiCi0jaW5jbHVkZSAiY2FtLmgiCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAwCi0jZW5kaWYgLyogRkFMU0UgKi8KLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICAgIDEKLSNlbmRpZiAvKiBUUlVFICovCi0jaWZuZGVmIEVSRVNUQVJUCi0jZGVmaW5lIEVSRVNUQVJUICAgICAgICAtMSAgICAgICAgICAgICAgLyogcmVzdGFydCBzeXNjYWxsICovCi0jZW5kaWYKLSNpZm5kZWYgRUpVU1RSRVRVUk4KLSNkZWZpbmUgRUpVU1RSRVRVUk4gICAgIC0yICAgICAgICAgICAgICAvKiBkb24ndCBtb2RpZnkgcmVncywganVzdCByZXR1cm4gKi8KLSNlbmRpZgotCi1zdGF0aWMgaW50CWFzY2VudHJ5Y29tcChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKm1lbWJlcik7Ci1zdGF0aWMgaW50CXNlbnNlZW50cnljb21wKGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqbWVtYmVyKTsKLXN0YXRpYyB2b2lkCWZldGNodGFibGVlbnRyaWVzKGludCBzZW5zZV9rZXksIGludCBhc2MsIGludCBhc2NxLAotCQkJCSAgc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICosCi0JCQkJICBjb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICoqLAotCQkJCSAgY29uc3Qgc3RydWN0IGFzY190YWJsZV9lbnRyeSAqKik7Ci1zdGF0aWMgdm9pZCAqCXNjc2lic2VhcmNoKGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqYmFzZSwgc2l6ZV90IG5tZW1iLAotCQkJICAgIHNpemVfdCBzaXplLAotCQkJICAgIGludCAoKmNvbXBhcikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXR5cGVkZWYgaW50IChjYW1fcXVpcmttYXRjaF90KShjYWRkcl90LCBjYWRkcl90KTsKLXN0YXRpYyBpbnQJY2FtX3N0cm1hdGNoKGNvbnN0IHVfaW50OF90ICpzdHIsIGNvbnN0IHVfaW50OF90ICpwYXR0ZXJuLAotCQkJICAgICBpbnQgc3RyX2xlbik7Ci1zdGF0aWMgY2FkZHJfdAljYW1fcXVpcmttYXRjaChjYWRkcl90IHRhcmdldCwgY2FkZHJfdCBxdWlya190YWJsZSwKLQkJCSAgICAgICBpbnQgbnVtX2VudHJpZXMsIGludCBlbnRyeV9zaXplLAotCQkJICAgICAgIGNhbV9xdWlya21hdGNoX3QgKmNvbXBfZnVuYyk7Ci0KLSNkZWZpbmUgU0NTSV9OT19TRU5TRV9TVFJJTkdTIDEKLSNpZiAhZGVmaW5lZChTQ1NJX05PX1NFTlNFX1NUUklOR1MpCi0jZGVmaW5lIFNTVChhc2MsIGFzY3EsIGFjdGlvbiwgZGVzYykgXAotCWFzYywgYXNjcSwgYWN0aW9uLCBkZXNjCi0jZWxzZSAKLXN0YXRpYyBjb25zdCBjaGFyIGVtcHR5X3N0cmluZ1tdID0gIiI7Ci0KLSNkZWZpbmUgU1NUKGFzYywgYXNjcSwgYWN0aW9uLCBkZXNjKSBcCi0JYXNjLCBhc2NxLCBhY3Rpb24sIGVtcHR5X3N0cmluZwotI2VuZGlmIAotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSBzZW5zZV9rZXlfdGFibGVbXSA9IAotewotCXsgU1NEX0tFWV9OT19TRU5TRSwgU1NfTk9QLCAiTk8gU0VOU0UiIH0sCi0JeyBTU0RfS0VZX1JFQ09WRVJFRF9FUlJPUiwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwgIlJFQ09WRVJFRCBFUlJPUiIgfSwKLQl7Ci0JICBTU0RfS0VZX05PVF9SRUFEWSwgU1NfVFVSfFNTUV9NQU5ZfFNTUV9ERUNSRU1FTlRfQ09VTlR8RUJVU1ksCi0JICAiTk9UIFJFQURZIgotCX0sCi0JeyBTU0RfS0VZX01FRElVTV9FUlJPUiwgU1NfUkRFRiwgIk1FRElVTSBFUlJPUiIgfSwKLQl7IFNTRF9LRVlfSEFSRFdBUkVfRVJST1IsIFNTX1JERUYsICJIQVJEV0FSRSBGQUlMVVJFIiB9LAotCXsgU1NEX0tFWV9JTExFR0FMX1JFUVVFU1QsIFNTX0ZBVEFMfEVJTlZBTCwgIklMTEVHQUwgUkVRVUVTVCIgfSwKLQl7IFNTRF9LRVlfVU5JVF9BVFRFTlRJT04sIFNTX0ZBVEFMfEVOWElPLCAiVU5JVCBBVFRFTlRJT04iIH0sCi0JeyBTU0RfS0VZX0RBVEFfUFJPVEVDVCwgU1NfRkFUQUx8RUFDQ0VTLCAiREFUQSBQUk9URUNUIiB9LAotCXsgU1NEX0tFWV9CTEFOS19DSEVDSywgU1NfRkFUQUx8RU5PU1BDLCAiQkxBTksgQ0hFQ0siIH0sCi0JeyBTU0RfS0VZX1ZlbmRvcl9TcGVjaWZpYywgU1NfRkFUQUx8RUlPLCAiVmVuZG9yIFNwZWNpZmljIiB9LAotCXsgU1NEX0tFWV9DT1BZX0FCT1JURUQsIFNTX0ZBVEFMfEVJTywgIkNPUFkgQUJPUlRFRCIgfSwKLQl7IFNTRF9LRVlfQUJPUlRFRF9DT01NQU5ELCBTU19SREVGLCAiQUJPUlRFRCBDT01NQU5EIiB9LAotCXsgU1NEX0tFWV9FUVVBTCwgU1NfTk9QLCAiRVFVQUwiIH0sCi0JeyBTU0RfS0VZX1ZPTFVNRV9PVkVSRkxPVywgU1NfRkFUQUx8RUlPLCAiVk9MVU1FIE9WRVJGTE9XIiB9LAotCXsgU1NEX0tFWV9NSVNDT01QQVJFLCBTU19OT1AsICJNSVNDT01QQVJFIiB9LAotCXsgU1NEX0tFWV9SRVNFUlZFRCwgU1NfRkFUQUx8RUlPLCAiUkVTRVJWRUQiIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgc2Vuc2Vfa2V5X3RhYmxlX3NpemUgPQotICAgIHNpemVvZihzZW5zZV9rZXlfdGFibGUpL3NpemVvZihzZW5zZV9rZXlfdGFibGVbMF0pOwotCi1zdGF0aWMgc3RydWN0IGFzY190YWJsZV9lbnRyeSBxdWFudHVtX2ZpcmViYWxsX2VudHJpZXNbXSA9IHsKLQl7U1NUKDB4MDQsIDB4MGIsIFNTX1NUQVJUfFNTUV9ERUNSRU1FTlRfQ09VTlR8RU5YSU8sIAotCSAgICAgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIGluaXRpYWxpemluZyBjbWQuIHJlcXVpcmVkIil9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFzY190YWJsZV9lbnRyeSBzb255X21vX2VudHJpZXNbXSA9IHsKLQl7U1NUKDB4MDQsIDB4MDAsIFNTX1NUQVJUfFNTUV9ERUNSRU1FTlRfQ09VTlR8RU5YSU8sCi0JICAgICAiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgY2F1c2Ugbm90IHJlcG9ydGFibGUiKX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9zZW5zZV9xdWlya19lbnRyeSBzZW5zZV9xdWlya190YWJsZVtdID0gewotCXsKLQkJLyoKLQkJICogVGhlIFF1YW50dW0gRmlyZWJhbGwgU1QgYW5kIFNFIGxpa2UgdG8gcmV0dXJuIDB4MDQgMHgwYiB3aGVuCi0JCSAqIHRoZXkgcmVhbGx5IHNob3VsZCByZXR1cm4gMHgwNCAweDAyLiAgMHgwNCwweDBiIGlzbid0Ci0JCSAqIGRlZmluZWQgaW4gYW55IFNDU0kgc3BlYywgYW5kIGl0IGlzbid0IG1lbnRpb25lZCBpbiB0aGUKLQkJICogaGFyZHdhcmUgbWFudWFsIGZvciB0aGVzZSBkcml2ZXMuCi0JCSAqLwotCQl7VF9ESVJFQ1QsIFNJUF9NRURJQV9GSVhFRCwgIlFVQU5UVU0iLCAiRklSRUJBTEwgUyoiLCAiKiJ9LAotCQkvKm51bV9zZW5zZV9rZXlzKi8wLAotCQlzaXplb2YocXVhbnR1bV9maXJlYmFsbF9lbnRyaWVzKS9zaXplb2Yoc3RydWN0IGFzY190YWJsZV9lbnRyeSksCi0JCS8qc2Vuc2Uga2V5IGVudHJpZXMqL05VTEwsCi0JCXF1YW50dW1fZmlyZWJhbGxfZW50cmllcwotCX0sCi0JewotCQkvKgotCQkgKiBUaGlzIFNvbnkgTU8gZHJpdmUgbGlrZXMgdG8gcmV0dXJuIDB4MDQsIDB4MDAgd2hlbiBpdAotCQkgKiBpc24ndCBzcHVuIHVwLgotCQkgKi8KLQkJe1RfRElSRUNULCBTSVBfTUVESUFfUkVNT1ZBQkxFLCAiU09OWSIsICJTTU8tKiIsICIqIn0sCi0JCS8qbnVtX3NlbnNlX2tleXMqLzAsCi0JCXNpemVvZihzb255X21vX2VudHJpZXMpL3NpemVvZihzdHJ1Y3QgYXNjX3RhYmxlX2VudHJ5KSwKLQkJLypzZW5zZSBrZXkgZW50cmllcyovTlVMTCwKLQkJc29ueV9tb19lbnRyaWVzCi0JfQotfTsKLQotc3RhdGljIGNvbnN0IGludCBzZW5zZV9xdWlya190YWJsZV9zaXplID0KLSAgICBzaXplb2Yoc2Vuc2VfcXVpcmtfdGFibGUpL3NpemVvZihzZW5zZV9xdWlya190YWJsZVswXSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXNjX3RhYmxlX2VudHJ5IGFzY190YWJsZVtdID0gewotLyoKLSAqIEZyb20gRmlsZTogQVNDLU5VTS5UWFQKLSAqIFNDU0kgQVNDL0FTQ1EgQXNzaWdubWVudHMKLSAqIE51bWVyaWMgU29ydGVkIExpc3RpbmcKLSAqIGFzIG9mICA1LzEyLzk3Ci0gKgotICogRCAtIERJUkVDVCBBQ0NFU1MgREVWSUNFIChTQkMpICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIGNvbHVtbiBrZXkKLSAqIC5UIC0gU0VRVUVOVElBTCBBQ0NFU1MgREVWSUNFIChTU0MpICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQotICogLiBMIC0gUFJJTlRFUiBERVZJQ0UgKFNTQykgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFuayA9IHJlc2VydmVkCi0gKiAuICBQIC0gUFJPQ0VTU09SIERFVklDRSAoU1BDKSAgICAgICAgICAgICAgICAgICAgIG5vdCBibGFuayA9IGFsbG93ZWQKLSAqIC4gIC5XIC0gV1JJVEUgT05DRSBSRUFEIE1VTFRJUExFIERFVklDRSAoU0JDKQotICogLiAgLiBSIC0gQ0QgREVWSUNFIChNTUMpCi0gKiAuICAuICBTIC0gU0NBTk5FUiBERVZJQ0UgKFNHQykKLSAqIC4gIC4gIC5PIC0gT1BUSUNBTCBNRU1PUlkgREVWSUNFIChTQkMpCi0gKiAuICAuICAuIE0gLSBNRURJQSBDSEFOR0VSIERFVklDRSAoU01DKQotICogLiAgLiAgLiAgQyAtIENPTU1VTklDQVRJT04gREVWSUNFIChTU0MpCi0gKiAuICAuICAuICAuQSAtIFNUT1JBR0UgQVJSQVkgREVWSUNFIChTQ0MpCi0gKiAuICAuICAuICAuIEUgLSBFTkNMT1NVUkUgU0VSVklDRVMgREVWSUNFIChTRVMpCi0gKiBEVExQV1JTT01DQUUgICAgICAgIEFTQyAgIEFTQ1EgIEFjdGlvbiAgRGVzY3JpcHRpb24KLSAqIC0tLS0tLS0tLS0tLSAgICAgICAgLS0tLSAgLS0tLSAgLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MDAsIDB4MDAsIFNTX05PUCwKLQkJCSJObyBhZGRpdGlvbmFsIHNlbnNlIGluZm9ybWF0aW9uIikgfSwKLS8qICBUICAgIFMgICAgICAqL3tTU1QoMHgwMCwgMHgwMSwgU1NfUkRFRiwKLQkJCSJGaWxlbWFyayBkZXRlY3RlZCIpIH0sCi0vKiAgVCAgICBTICAgICAgKi97U1NUKDB4MDAsIDB4MDIsIFNTX1JERUYsCi0JCQkiRW5kLW9mLXBhcnRpdGlvbi9tZWRpdW0gZGV0ZWN0ZWQiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDAwLCAweDAzLCBTU19SREVGLAotCQkJIlNldG1hcmsgZGV0ZWN0ZWQiKSB9LAotLyogIFQgICAgUyAgICAgICove1NTVCgweDAwLCAweDA0LCBTU19SREVGLAotCQkJIkJlZ2lubmluZy1vZi1wYXJ0aXRpb24vbWVkaXVtIGRldGVjdGVkIikgfSwKLS8qICBUICAgIFMgICAgICAqL3tTU1QoMHgwMCwgMHgwNSwgU1NfUkRFRiwKLQkJCSJFbmQtb2YtZGF0YSBkZXRlY3RlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MDAsIDB4MDYsIFNTX1JERUYsCi0JCQkiSS9PIHByb2Nlc3MgdGVybWluYXRlZCIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MDAsIDB4MTEsIFNTX0ZBVEFMfEVCVVNZLAotCQkJIkF1ZGlvIHBsYXkgb3BlcmF0aW9uIGluIHByb2dyZXNzIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgwMCwgMHgxMiwgU1NfTk9QLAotCQkJIkF1ZGlvIHBsYXkgb3BlcmF0aW9uIHBhdXNlZCIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MDAsIDB4MTMsIFNTX05PUCwKLQkJCSJBdWRpbyBwbGF5IG9wZXJhdGlvbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgwMCwgMHgxNCwgU1NfUkRFRiwKLQkJCSJBdWRpbyBwbGF5IG9wZXJhdGlvbiBzdG9wcGVkIGR1ZSB0byBlcnJvciIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MDAsIDB4MTUsIFNTX05PUCwKLQkJCSJObyBjdXJyZW50IGF1ZGlvIHN0YXR1cyB0byByZXR1cm4iKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDAwLCAweDE2LCBTU19GQVRBTHxFQlVTWSwKLQkJCSJPcGVyYXRpb24gaW4gcHJvZ3Jlc3MiKSB9LAotLyogRFRMIFdSU09NIEFFICove1NTVCgweDAwLCAweDE3LCBTU19SREVGLAotCQkJIkNsZWFuaW5nIHJlcXVlc3RlZCIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MDEsIDB4MDAsIFNTX1JERUYsCi0JCQkiTm8gaW5kZXgvc2VjdG9yIHNpZ25hbCIpIH0sCi0vKiBEICAgV1IgT00gICAgKi97U1NUKDB4MDIsIDB4MDAsIFNTX1JERUYsCi0JCQkiTm8gc2VlayBjb21wbGV0ZSIpIH0sCi0vKiBEVEwgVyBTTyAgICAgKi97U1NUKDB4MDMsIDB4MDAsIFNTX1JERUYsCi0JCQkiUGVyaXBoZXJhbCBkZXZpY2Ugd3JpdGUgZmF1bHQiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDAzLCAweDAxLCBTU19SREVGLAotCQkJIk5vIHdyaXRlIGN1cnJlbnQiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDAzLCAweDAyLCBTU19SREVGLAotCQkJIkV4Y2Vzc2l2ZSB3cml0ZSBlcnJvcnMiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDA0LCAweDAwLAotCQkJU1NfVFVSfFNTUV9ERUxBWXxTU1FfTUFOWXxTU1FfREVDUkVNRU5UX0NPVU5UfEVJTywKLQkJCSJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBjYXVzZSBub3QgcmVwb3J0YWJsZSIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MDQsIDB4MDEsCi0JCQlTU19UVVJ8U1NRX0RFTEFZfFNTUV9NQU5ZfFNTUV9ERUNSRU1FTlRfQ09VTlR8RUJVU1ksCi0JCQkiTG9naWNhbCB1bml0IGlzIGluIHByb2Nlc3Mgb2YgYmVjb21pbmcgcmVhZHkiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDA0LCAweDAyLCBTU19TVEFSVHxTU1FfREVDUkVNRU5UX0NPVU5UfEVOWElPLAotCQkJIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIGluaXRpYWxpemluZyBjbWQuIHJlcXVpcmVkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwNCwgMHgwMywgU1NfRkFUQUx8RU5YSU8sCi0JCQkiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgbWFudWFsIGludGVydmVudGlvbiByZXF1aXJlZCIpfSwKLS8qIERUTCAgICBPICAgICAqL3tTU1QoMHgwNCwgMHgwNCwgU1NfRkFUQUx8RUJVU1ksCi0JCQkiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgZm9ybWF0IGluIHByb2dyZXNzIikgfSwKLS8qIERUICBXICBPTUNBICAqL3tTU1QoMHgwNCwgMHgwNSwgU1NfRkFUQUx8RUJVU1ksCi0JCQkiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgcmVidWlsZCBpbiBwcm9ncmVzcyIpIH0sCi0vKiBEVCAgVyAgT01DQSAgKi97U1NUKDB4MDQsIDB4MDYsIFNTX0ZBVEFMfEVCVVNZLAotCQkJIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIHJlY2FsY3VsYXRpb24gaW4gcHJvZ3Jlc3MiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDA0LCAweDA3LCBTU19GQVRBTHxFQlVTWSwKLQkJCSJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDA0LCAweDA4LCBTU19GQVRBTHxFQlVTWSwKLQkJCSJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBsb25nIHdyaXRlIGluIHByb2dyZXNzIikgfSwKLS8qIERUTCBXUlNPTUNBRSAqL3tTU1QoMHgwNSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJMb2dpY2FsIHVuaXQgZG9lcyBub3QgcmVzcG9uZCB0byBzZWxlY3Rpb24iKSB9LAotLyogRCAgIFdSIE9NICAgICove1NTVCgweDA2LCAweDAwLCBTU19SREVGLAotCQkJIk5vIHJlZmVyZW5jZSBwb3NpdGlvbiBmb3VuZCIpIH0sCi0vKiBEVEwgV1JTT00gICAgKi97U1NUKDB4MDcsIDB4MDAsIFNTX1JERUYsCi0JCQkiTXVsdGlwbGUgcGVyaXBoZXJhbCBkZXZpY2VzIHNlbGVjdGVkIikgfSwKLS8qIERUTCBXUlNPTUNBRSAqL3tTU1QoMHgwOCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJMb2dpY2FsIHVuaXQgY29tbXVuaWNhdGlvbiBmYWlsdXJlIikgfSwKLS8qIERUTCBXUlNPTUNBRSAqL3tTU1QoMHgwOCwgMHgwMSwgU1NfUkRFRiwKLQkJCSJMb2dpY2FsIHVuaXQgY29tbXVuaWNhdGlvbiB0aW1lLW91dCIpIH0sCi0vKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MDgsIDB4MDIsIFNTX1JERUYsCi0JCQkiTG9naWNhbCB1bml0IGNvbW11bmljYXRpb24gcGFyaXR5IGVycm9yIikgfSwKLS8qIERUICAgUiBPTSAgICAqL3tTU1QoMHgwOCwgMHgwMywgU1NfUkRFRiwKLQkJCSJMb2dpY2FsIHVuaXQgY29tbXVuaWNhdGlvbiBjcmMgZXJyb3IgKHVsdHJhLWRtYS8zMikiKX0sCi0vKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MDksIDB4MDAsIFNTX1JERUYsCi0JCQkiVHJhY2sgZm9sbG93aW5nIGVycm9yIikgfSwKLS8qICAgICBXUiBPICAgICAqL3tTU1QoMHgwOSwgMHgwMSwgU1NfUkRFRiwKLQkJCSJUcmFja2luZyBzZXJ2byBmYWlsdXJlIikgfSwKLS8qICAgICBXUiBPICAgICAqL3tTU1QoMHgwOSwgMHgwMiwgU1NfUkRFRiwKLQkJCSJGb2N1cyBzZXJ2byBmYWlsdXJlIikgfSwKLS8qICAgICBXUiBPICAgICAqL3tTU1QoMHgwOSwgMHgwMywgU1NfUkRFRiwKLQkJCSJTcGluZGxlIHNlcnZvIGZhaWx1cmUiKSB9LAotLyogRFQgIFdSIE8gICAgICove1NTVCgweDA5LCAweDA0LCBTU19SREVGLAotCQkJIkhlYWQgc2VsZWN0IGZhdWx0IikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwQSwgMHgwMCwgU1NfRkFUQUx8RU5PU1BDLAotCQkJIkVycm9yIGxvZyBvdmVyZmxvdyIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MEIsIDB4MDAsIFNTX1JERUYsCi0JCQkiV2FybmluZyIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MEIsIDB4MDEsIFNTX1JERUYsCi0JCQkiU3BlY2lmaWVkIHRlbXBlcmF0dXJlIGV4Y2VlZGVkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwQiwgMHgwMiwgU1NfUkRFRiwKLQkJCSJFbmNsb3N1cmUgZGVncmFkZWQiKSB9LAotLyogIFQgICBSUyAgICAgICove1NTVCgweDBDLCAweDAwLCBTU19SREVGLAotCQkJIldyaXRlIGVycm9yIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgwQywgMHgwMSwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJXcml0ZSBlcnJvciAtIHJlY292ZXJlZCB3aXRoIGF1dG8gcmVhbGxvY2F0aW9uIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgwQywgMHgwMiwgU1NfUkRFRiwKLQkJCSJXcml0ZSBlcnJvciAtIGF1dG8gcmVhbGxvY2F0aW9uIGZhaWxlZCIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDMsIFNTX1JERUYsCi0JCQkiV3JpdGUgZXJyb3IgLSByZWNvbW1lbmQgcmVhc3NpZ25tZW50IikgfSwKLS8qIERUICBXICBPICAgICAqL3tTU1QoMHgwQywgMHgwNCwgU1NfUkRFRiwKLQkJCSJDb21wcmVzc2lvbiBjaGVjayBtaXNjb21wYXJlIGVycm9yIikgfSwKLS8qIERUICBXICBPICAgICAqL3tTU1QoMHgwQywgMHgwNSwgU1NfUkRFRiwKLQkJCSJEYXRhIGV4cGFuc2lvbiBvY2N1cnJlZCBkdXJpbmcgY29tcHJlc3Npb24iKSB9LAotLyogRFQgIFcgIE8gICAgICove1NTVCgweDBDLCAweDA2LCBTU19SREVGLAotCQkJIkJsb2NrIG5vdCBjb21wcmVzc2libGUiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDBDLCAweDA3LCBTU19SREVGLAotCQkJIldyaXRlIGVycm9yIC0gcmVjb3ZlcnkgbmVlZGVkIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgwQywgMHgwOCwgU1NfUkRFRiwKLQkJCSJXcml0ZSBlcnJvciAtIHJlY292ZXJ5IGZhaWxlZCIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MEMsIDB4MDksIFNTX1JERUYsCi0JCQkiV3JpdGUgZXJyb3IgLSBsb3NzIG9mIHN0cmVhbWluZyIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MEMsIDB4MEEsIFNTX1JERUYsCi0JCQkiV3JpdGUgZXJyb3IgLSBwYWRkaW5nIGJsb2NrcyBhZGRlZCIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTAsIDB4MDAsIFNTX1JERUYsCi0JCQkiSUQgQ1JDIG9yIEVDQyBlcnJvciIpIH0sCi0vKiBEVCAgV1JTTyAgICAgKi97U1NUKDB4MTEsIDB4MDAsIFNTX1JERUYsCi0JCQkiVW5yZWNvdmVyZWQgcmVhZCBlcnJvciIpIH0sCi0vKiBEVCAgVyBTTyAgICAgKi97U1NUKDB4MTEsIDB4MDEsIFNTX1JERUYsCi0JCQkiUmVhZCByZXRyaWVzIGV4aGF1c3RlZCIpIH0sCi0vKiBEVCAgVyBTTyAgICAgKi97U1NUKDB4MTEsIDB4MDIsIFNTX1JERUYsCi0JCQkiRXJyb3IgdG9vIGxvbmcgdG8gY29ycmVjdCIpIH0sCi0vKiBEVCAgVyBTTyAgICAgKi97U1NUKDB4MTEsIDB4MDMsIFNTX1JERUYsCi0JCQkiTXVsdGlwbGUgcmVhZCBlcnJvcnMiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDExLCAweDA0LCBTU19SREVGLAotCQkJIlVucmVjb3ZlcmVkIHJlYWQgZXJyb3IgLSBhdXRvIHJlYWxsb2NhdGUgZmFpbGVkIikgfSwKLS8qICAgICBXUiBPICAgICAqL3tTU1QoMHgxMSwgMHgwNSwgU1NfUkRFRiwKLQkJCSJMLUVDIHVuY29ycmVjdGFibGUgZXJyb3IiKSB9LAotLyogICAgIFdSIE8gICAgICove1NTVCgweDExLCAweDA2LCBTU19SREVGLAotCQkJIkNJUkMgdW5yZWNvdmVyZWQgZXJyb3IiKSB9LAotLyogICAgIFcgIE8gICAgICove1NTVCgweDExLCAweDA3LCBTU19SREVGLAotCQkJIkRhdGEgcmUtc3luY2hyb25pemF0aW9uIGVycm9yIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgxMSwgMHgwOCwgU1NfUkRFRiwKLQkJCSJJbmNvbXBsZXRlIGJsb2NrIHJlYWQiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDExLCAweDA5LCBTU19SREVGLAotCQkJIk5vIGdhcCBmb3VuZCIpIH0sCi0vKiBEVCAgICAgTyAgICAgKi97U1NUKDB4MTEsIDB4MEEsIFNTX1JERUYsCi0JCQkiTWlzY29ycmVjdGVkIGVycm9yIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxMSwgMHgwQiwgU1NfUkRFRiwKLQkJCSJVbnJlY292ZXJlZCByZWFkIGVycm9yIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTEsIDB4MEMsIFNTX1JERUYsCi0JCQkiVW5yZWNvdmVyZWQgcmVhZCBlcnJvciAtIHJlY29tbWVuZCByZXdyaXRlIHRoZSBkYXRhIil9LAotLyogRFQgIFdSIE8gICAgICove1NTVCgweDExLCAweDBELCBTU19SREVGLAotCQkJIkRlLWNvbXByZXNzaW9uIENSQyBlcnJvciIpIH0sCi0vKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MTEsIDB4MEUsIFNTX1JERUYsCi0JCQkiQ2Fubm90IGRlY29tcHJlc3MgdXNpbmcgZGVjbGFyZWQgYWxnb3JpdGhtIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgxMSwgMHgwRiwgU1NfUkRFRiwKLQkJCSJFcnJvciByZWFkaW5nIFVQQy9FQU4gbnVtYmVyIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgxMSwgMHgxMCwgU1NfUkRFRiwKLQkJCSJFcnJvciByZWFkaW5nIElTUkMgbnVtYmVyIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgxMSwgMHgxMSwgU1NfUkRFRiwKLQkJCSJSZWFkIGVycm9yIC0gbG9zcyBvZiBzdHJlYW1pbmciKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDEyLCAweDAwLCBTU19SREVGLAotCQkJIkFkZHJlc3MgbWFyayBub3QgZm91bmQgZm9yIGlkIGZpZWxkIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxMywgMHgwMCwgU1NfUkRFRiwKLQkJCSJBZGRyZXNzIG1hcmsgbm90IGZvdW5kIGZvciBkYXRhIGZpZWxkIikgfSwKLS8qIERUTCBXUlNPICAgICAqL3tTU1QoMHgxNCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJSZWNvcmRlZCBlbnRpdHkgbm90IGZvdW5kIikgfSwKLS8qIERUICBXUiBPICAgICAqL3tTU1QoMHgxNCwgMHgwMSwgU1NfUkRFRiwKLQkJCSJSZWNvcmQgbm90IGZvdW5kIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgxNCwgMHgwMiwgU1NfUkRFRiwKLQkJCSJGaWxlbWFyayBvciBzZXRtYXJrIG5vdCBmb3VuZCIpIH0sCi0vKiAgVCAgICAgICAgICAgKi97U1NUKDB4MTQsIDB4MDMsIFNTX1JERUYsCi0JCQkiRW5kLW9mLWRhdGEgbm90IGZvdW5kIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgxNCwgMHgwNCwgU1NfUkRFRiwKLQkJCSJCbG9jayBzZXF1ZW5jZSBlcnJvciIpIH0sCi0vKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4MTQsIDB4MDUsIFNTX1JERUYsCi0JCQkiUmVjb3JkIG5vdCBmb3VuZCAtIHJlY29tbWVuZCByZWFzc2lnbm1lbnQiKSB9LAotLyogRFQgIFcgIE8gICAgICove1NTVCgweDE0LCAweDA2LCBTU19SREVGLAotCQkJIlJlY29yZCBub3QgZm91bmQgLSBkYXRhIGF1dG8tcmVhbGxvY2F0ZWQiKSB9LAotLyogRFRMIFdSU09NICAgICove1NTVCgweDE1LCAweDAwLCBTU19SREVGLAotCQkJIlJhbmRvbSBwb3NpdGlvbmluZyBlcnJvciIpIH0sCi0vKiBEVEwgV1JTT00gICAgKi97U1NUKDB4MTUsIDB4MDEsIFNTX1JERUYsCi0JCQkiTWVjaGFuaWNhbCBwb3NpdGlvbmluZyBlcnJvciIpIH0sCi0vKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MTUsIDB4MDIsIFNTX1JERUYsCi0JCQkiUG9zaXRpb25pbmcgZXJyb3IgZGV0ZWN0ZWQgYnkgcmVhZCBvZiBtZWRpdW0iKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDE2LCAweDAwLCBTU19SREVGLAotCQkJIkRhdGEgc3luY2hyb25pemF0aW9uIG1hcmsgZXJyb3IiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDE2LCAweDAxLCBTU19SREVGLAotCQkJIkRhdGEgc3luYyBlcnJvciAtIGRhdGEgcmV3cml0dGVuIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNiwgMHgwMiwgU1NfUkRFRiwKLQkJCSJEYXRhIHN5bmMgZXJyb3IgLSByZWNvbW1lbmQgcmV3cml0ZSIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTYsIDB4MDMsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiRGF0YSBzeW5jIGVycm9yIC0gZGF0YSBhdXRvLXJlYWxsb2NhdGVkIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNiwgMHgwNCwgU1NfUkRFRiwKLQkJCSJEYXRhIHN5bmMgZXJyb3IgLSByZWNvbW1lbmQgcmVhc3NpZ25tZW50IikgfSwKLS8qIERUICBXUlNPICAgICAqL3tTU1QoMHgxNywgMHgwMCwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgZGF0YSB3aXRoIG5vIGVycm9yIGNvcnJlY3Rpb24gYXBwbGllZCIpIH0sCi0vKiBEVCAgV1JTTyAgICAgKi97U1NUKDB4MTcsIDB4MDEsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCByZXRyaWVzIikgfSwKLS8qIERUICBXUiBPICAgICAqL3tTU1QoMHgxNywgMHgwMiwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgZGF0YSB3aXRoIHBvc2l0aXZlIGhlYWQgb2Zmc2V0IikgfSwKLS8qIERUICBXUiBPICAgICAqL3tTU1QoMHgxNywgMHgwMywgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgZGF0YSB3aXRoIG5lZ2F0aXZlIGhlYWQgb2Zmc2V0IikgfSwKLS8qICAgICBXUiBPICAgICAqL3tTU1QoMHgxNywgMHgwNCwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgZGF0YSB3aXRoIHJldHJpZXMgYW5kL29yIENJUkMgYXBwbGllZCIpIH0sCi0vKiBEICAgV1IgTyAgICAgKi97U1NUKDB4MTcsIDB4MDUsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgdXNpbmcgcHJldmlvdXMgc2VjdG9yIGlkIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNywgMHgwNiwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgZGF0YSB3aXRob3V0IEVDQyAtIGRhdGEgYXV0by1yZWFsbG9jYXRlZCIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTcsIDB4MDcsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aG91dCBFQ0MgLSByZWNvbW1lbmQgcmVhc3NpZ25tZW50Iil9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDE3LCAweDA4LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAotCQkJIlJlY292ZXJlZCBkYXRhIHdpdGhvdXQgRUNDIC0gcmVjb21tZW5kIHJld3JpdGUiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDE3LCAweDA5LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAotCQkJIlJlY292ZXJlZCBkYXRhIHdpdGhvdXQgRUNDIC0gZGF0YSByZXdyaXR0ZW4iKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDE4LCAweDAwLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAotCQkJIlJlY292ZXJlZCBkYXRhIHdpdGggZXJyb3IgY29ycmVjdGlvbiBhcHBsaWVkIikgfSwKLS8qIEQgICBXUiBPICAgICAqL3tTU1QoMHgxOCwgMHgwMSwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgZGF0YSB3aXRoIGVycm9yIGNvcnIuICYgcmV0cmllcyBhcHBsaWVkIikgfSwKLS8qIEQgICBXUiBPICAgICAqL3tTU1QoMHgxOCwgMHgwMiwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgZGF0YSAtIGRhdGEgYXV0by1yZWFsbG9jYXRlZCIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTgsIDB4MDMsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBDSVJDIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgxOCwgMHgwNCwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgZGF0YSB3aXRoIEwtRUMiKSB9LAotLyogRCAgIFdSIE8gICAgICove1NTVCgweDE4LCAweDA1LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAotCQkJIlJlY292ZXJlZCBkYXRhIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCIpIH0sCi0vKiBEICAgV1IgTyAgICAgKi97U1NUKDB4MTgsIDB4MDYsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgLSByZWNvbW1lbmQgcmV3cml0ZSIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTgsIDB4MDcsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBFQ0MgLSBkYXRhIHJld3JpdHRlbiIpIH0sCi0vKiBEICAgICAgTyAgICAgKi97U1NUKDB4MTksIDB4MDAsIFNTX1JERUYsCi0JCQkiRGVmZWN0IGxpc3QgZXJyb3IiKSB9LAotLyogRCAgICAgIE8gICAgICove1NTVCgweDE5LCAweDAxLCBTU19SREVGLAotCQkJIkRlZmVjdCBsaXN0IG5vdCBhdmFpbGFibGUiKSB9LAotLyogRCAgICAgIE8gICAgICove1NTVCgweDE5LCAweDAyLCBTU19SREVGLAotCQkJIkRlZmVjdCBsaXN0IGVycm9yIGluIHByaW1hcnkgbGlzdCIpIH0sCi0vKiBEICAgICAgTyAgICAgKi97U1NUKDB4MTksIDB4MDMsIFNTX1JERUYsCi0JCQkiRGVmZWN0IGxpc3QgZXJyb3IgaW4gZ3Jvd24gbGlzdCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MUEsIDB4MDAsIFNTX1JERUYsCi0JCQkiUGFyYW1ldGVyIGxpc3QgbGVuZ3RoIGVycm9yIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgxQiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJTeW5jaHJvbm91cyBkYXRhIHRyYW5zZmVyIGVycm9yIikgfSwKLS8qIEQgICAgICBPICAgICAqL3tTU1QoMHgxQywgMHgwMCwgU1NfUkRFRiwKLQkJCSJEZWZlY3QgbGlzdCBub3QgZm91bmQiKSB9LAotLyogRCAgICAgIE8gICAgICove1NTVCgweDFDLCAweDAxLCBTU19SREVGLAotCQkJIlByaW1hcnkgZGVmZWN0IGxpc3Qgbm90IGZvdW5kIikgfSwKLS8qIEQgICAgICBPICAgICAqL3tTU1QoMHgxQywgMHgwMiwgU1NfUkRFRiwKLQkJCSJHcm93biBkZWZlY3QgbGlzdCBub3QgZm91bmQiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDFELCAweDAwLCBTU19GQVRBTCwKLQkJCSJNaXNjb21wYXJlIGR1cmluZyB2ZXJpZnkgb3BlcmF0aW9uIiApfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxRSwgMHgwMCwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgaWQgd2l0aCBlY2MgY29ycmVjdGlvbiIpIH0sCi0vKiBEICAgICAgTyAgICAgKi97U1NUKDB4MUYsIDB4MDAsIFNTX1JERUYsCi0JCQkiUGFydGlhbCBkZWZlY3QgbGlzdCB0cmFuc2ZlciIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjAsIDB4MDAsIFNTX0ZBVEFMfEVJTlZBTCwKLQkJCSJJbnZhbGlkIGNvbW1hbmQgb3BlcmF0aW9uIGNvZGUiKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDIxLCAweDAwLCBTU19GQVRBTHxFSU5WQUwsCi0JCQkiTG9naWNhbCBibG9jayBhZGRyZXNzIG91dCBvZiByYW5nZSIgKX0sCi0vKiBEVCAgV1IgT00gICAgKi97U1NUKDB4MjEsIDB4MDEsIFNTX0ZBVEFMfEVJTlZBTCwKLQkJCSJJbnZhbGlkIGVsZW1lbnQgYWRkcmVzcyIpIH0sCi0vKiBEICAgICAgICAgICAgKi97U1NUKDB4MjIsIDB4MDAsIFNTX0ZBVEFMfEVJTlZBTCwKLQkJCSJJbGxlZ2FsIGZ1bmN0aW9uIikgfSwgLyogRGVwcmVjYXRlZC4gVXNlIDIwIDAwLCAyNCAwMCwgb3IgMjYgMDAgaW5zdGVhZCAqLwotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI0LCAweDAwLCBTU19GQVRBTHxFSU5WQUwsCi0JCQkiSW52YWxpZCBmaWVsZCBpbiBDREIiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI1LCAweDAwLCBTU19GQVRBTHxFTlhJTywKLQkJCSJMb2dpY2FsIHVuaXQgbm90IHN1cHBvcnRlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjYsIDB4MDAsIFNTX0ZBVEFMfEVJTlZBTCwKLQkJCSJJbnZhbGlkIGZpZWxkIGluIHBhcmFtZXRlciBsaXN0IikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyNiwgMHgwMSwgU1NfRkFUQUx8RUlOVkFMLAotCQkJIlBhcmFtZXRlciBub3Qgc3VwcG9ydGVkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyNiwgMHgwMiwgU1NfRkFUQUx8RUlOVkFMLAotCQkJIlBhcmFtZXRlciB2YWx1ZSBpbnZhbGlkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyNiwgMHgwMywgU1NfRkFUQUx8RUlOVkFMLAotCQkJIlRocmVzaG9sZCBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI2LCAweDA0LCBTU19GQVRBTHxFSU5WQUwsCi0JCQkiSW52YWxpZCByZWxlYXNlIG9mIGFjdGl2ZSBwZXJzaXN0ZW50IHJlc2VydmF0aW9uIikgfSwKLS8qIERUICBXICBPICAgICAqL3tTU1QoMHgyNywgMHgwMCwgU1NfRkFUQUx8RUFDQ0VTLAotCQkJIldyaXRlIHByb3RlY3RlZCIpIH0sCi0vKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4MjcsIDB4MDEsIFNTX0ZBVEFMfEVBQ0NFUywKLQkJCSJIYXJkd2FyZSB3cml0ZSBwcm90ZWN0ZWQiKSB9LAotLyogRFQgIFcgIE8gICAgICove1NTVCgweDI3LCAweDAyLCBTU19GQVRBTHxFQUNDRVMsCi0JCQkiTG9naWNhbCB1bml0IHNvZnR3YXJlIHdyaXRlIHByb3RlY3RlZCIpIH0sCi0vKiAgVCAgICAgICAgICAgKi97U1NUKDB4MjcsIDB4MDMsIFNTX0ZBVEFMfEVBQ0NFUywKLQkJCSJBc3NvY2lhdGVkIHdyaXRlIHByb3RlY3QiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDI3LCAweDA0LCBTU19GQVRBTHxFQUNDRVMsCi0JCQkiUGVyc2lzdGVudCB3cml0ZSBwcm90ZWN0IikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgyNywgMHgwNSwgU1NfRkFUQUx8RUFDQ0VTLAotCQkJIlBlcm1hbmVudCB3cml0ZSBwcm90ZWN0IikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJOb3QgcmVhZHkgdG8gcmVhZHkgY2hhbmdlLCBtZWRpdW0gbWF5IGhhdmUgY2hhbmdlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjgsIDB4MDEsIFNTX0ZBVEFMfEVOWElPLAotCQkJIkltcG9ydCBvciBleHBvcnQgZWxlbWVudCBhY2Nlc3NlZCIpIH0sCi0vKgotICogWFhYIEpHaWJicyAtIEFsbCBvZiB0aGVzZSBzaG91bGQgdXNlIHRoZSBzYW1lIGVycm5vLCBidXQgSSBkb24ndCB0aGluawotICogRU5YSU8gaXMgdGhlIGNvcnJlY3QgY2hvaWNlLiAgU2hvdWxkIHdlIGJvcnJvdyBmcm9tIHRoZSBuZXR3b3JraW5nCi0gKiBlcnJub3M/ICBFQ09OTlJFU0VUIGFueW9uZT8KLSAqLwotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI5LCAweDAwLCBTU19SREVGLAotCQkJIlBvd2VyIG9uLCByZXNldCwgb3IgYnVzIGRldmljZSByZXNldCBvY2N1cnJlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjksIDB4MDEsIFNTX1JERUYsCi0JCQkiUG93ZXIgb24gb2NjdXJyZWQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI5LCAweDAyLCBTU19SREVGLAotCQkJIlNjc2kgYnVzIHJlc2V0IG9jY3VycmVkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwMywgU1NfUkRFRiwKLQkJCSJCdXMgZGV2aWNlIHJlc2V0IGZ1bmN0aW9uIG9jY3VycmVkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwNCwgU1NfUkRFRiwKLQkJCSJEZXZpY2UgaW50ZXJuYWwgcmVzZXQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI5LCAweDA1LCBTU19SREVGLAotCQkJIlRyYW5zY2VpdmVyIG1vZGUgY2hhbmdlZCB0byBzaW5nbGUtZW5kZWQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI5LCAweDA2LCBTU19SREVGLAotCQkJIlRyYW5zY2VpdmVyIG1vZGUgY2hhbmdlZCB0byBMVkQiKSB9LAotLyogRFRMIFdSU09NQ0FFICove1NTVCgweDJBLCAweDAwLCBTU19SREVGLAotCQkJIlBhcmFtZXRlcnMgY2hhbmdlZCIpIH0sCi0vKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MkEsIDB4MDEsIFNTX1JERUYsCi0JCQkiTW9kZSBwYXJhbWV0ZXJzIGNoYW5nZWQiKSB9LAotLyogRFRMIFdSU09NQ0FFICove1NTVCgweDJBLCAweDAyLCBTU19SREVGLAotCQkJIkxvZyBwYXJhbWV0ZXJzIGNoYW5nZWQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDJBLCAweDAzLCBTU19SREVGLAotCQkJIlJlc2VydmF0aW9ucyBwcmVlbXB0ZWQiKSB9LAotLyogRFRMUFdSU08gQyAgICove1NTVCgweDJCLCAweDAwLCBTU19SREVGLAotCQkJIkNvcHkgY2Fubm90IGV4ZWN1dGUgc2luY2UgaG9zdCBjYW5ub3QgZGlzY29ubmVjdCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MkMsIDB4MDAsIFNTX1JERUYsCi0JCQkiQ29tbWFuZCBzZXF1ZW5jZSBlcnJvciIpIH0sCi0vKiAgICAgICBTICAgICAgKi97U1NUKDB4MkMsIDB4MDEsIFNTX1JERUYsCi0JCQkiVG9vIG1hbnkgd2luZG93cyBzcGVjaWZpZWQiKSB9LAotLyogICAgICAgUyAgICAgICove1NTVCgweDJDLCAweDAyLCBTU19SREVGLAotCQkJIkludmFsaWQgY29tYmluYXRpb24gb2Ygd2luZG93cyBzcGVjaWZpZWQiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDJDLCAweDAzLCBTU19SREVGLAotCQkJIkN1cnJlbnQgcHJvZ3JhbSBhcmVhIGlzIG5vdCBlbXB0eSIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MkMsIDB4MDQsIFNTX1JERUYsCi0JCQkiQ3VycmVudCBwcm9ncmFtIGFyZWEgaXMgZW1wdHkiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDJELCAweDAwLCBTU19SREVGLAotCQkJIk92ZXJ3cml0ZSBlcnJvciBvbiB1cGRhdGUgaW4gcGxhY2UiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDJGLCAweDAwLCBTU19SREVGLAotCQkJIkNvbW1hbmRzIGNsZWFyZWQgYnkgYW5vdGhlciBpbml0aWF0b3IiKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDMwLCAweDAwLCBTU19SREVGLAotCQkJIkluY29tcGF0aWJsZSBtZWRpdW0gaW5zdGFsbGVkIikgfSwKLS8qIERUICBXUiBPICAgICAqL3tTU1QoMHgzMCwgMHgwMSwgU1NfUkRFRiwKLQkJCSJDYW5ub3QgcmVhZCBtZWRpdW0gLSB1bmtub3duIGZvcm1hdCIpIH0sCi0vKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MzAsIDB4MDIsIFNTX1JERUYsCi0JCQkiQ2Fubm90IHJlYWQgbWVkaXVtIC0gaW5jb21wYXRpYmxlIGZvcm1hdCIpIH0sCi0vKiBEVCAgICAgICAgICAgKi97U1NUKDB4MzAsIDB4MDMsIFNTX1JERUYsCi0JCQkiQ2xlYW5pbmcgY2FydHJpZGdlIGluc3RhbGxlZCIpIH0sCi0vKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MzAsIDB4MDQsIFNTX1JERUYsCi0JCQkiQ2Fubm90IHdyaXRlIG1lZGl1bSAtIHVua25vd24gZm9ybWF0IikgfSwKLS8qIERUICBXUiBPICAgICAqL3tTU1QoMHgzMCwgMHgwNSwgU1NfUkRFRiwKLQkJCSJDYW5ub3Qgd3JpdGUgbWVkaXVtIC0gaW5jb21wYXRpYmxlIGZvcm1hdCIpIH0sCi0vKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4MzAsIDB4MDYsIFNTX1JERUYsCi0JCQkiQ2Fubm90IGZvcm1hdCBtZWRpdW0gLSBpbmNvbXBhdGlibGUgbWVkaXVtIikgfSwKLS8qIERUTCBXUlNPTSBBRSAqL3tTU1QoMHgzMCwgMHgwNywgU1NfUkRFRiwKLQkJCSJDbGVhbmluZyBmYWlsdXJlIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgzMCwgMHgwOCwgU1NfUkRFRiwKLQkJCSJDYW5ub3Qgd3JpdGUgLSBhcHBsaWNhdGlvbiBjb2RlIG1pc21hdGNoIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgzMCwgMHgwOSwgU1NfUkRFRiwKLQkJCSJDdXJyZW50IHNlc3Npb24gbm90IGZpeGF0ZWQgZm9yIGFwcGVuZCIpIH0sCi0vKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MzEsIDB4MDAsIFNTX1JERUYsCi0JCQkiTWVkaXVtIGZvcm1hdCBjb3JydXB0ZWQiKSB9LAotLyogRCBMICBSIE8gICAgICove1NTVCgweDMxLCAweDAxLCBTU19SREVGLAotCQkJIkZvcm1hdCBjb21tYW5kIGZhaWxlZCIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MzIsIDB4MDAsIFNTX1JERUYsCi0JCQkiTm8gZGVmZWN0IHNwYXJlIGxvY2F0aW9uIGF2YWlsYWJsZSIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MzIsIDB4MDEsIFNTX1JERUYsCi0JCQkiRGVmZWN0IGxpc3QgdXBkYXRlIGZhaWx1cmUiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDMzLCAweDAwLCBTU19SREVGLAotCQkJIlRhcGUgbGVuZ3RoIGVycm9yIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzNCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJFbmNsb3N1cmUgZmFpbHVyZSIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MzUsIDB4MDAsIFNTX1JERUYsCi0JCQkiRW5jbG9zdXJlIHNlcnZpY2VzIGZhaWx1cmUiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDM1LCAweDAxLCBTU19SREVGLAotCQkJIlVuc3VwcG9ydGVkIGVuY2xvc3VyZSBmdW5jdGlvbiIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MzUsIDB4MDIsIFNTX1JERUYsCi0JCQkiRW5jbG9zdXJlIHNlcnZpY2VzIHVuYXZhaWxhYmxlIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzNSwgMHgwMywgU1NfUkRFRiwKLQkJCSJFbmNsb3N1cmUgc2VydmljZXMgdHJhbnNmZXIgZmFpbHVyZSIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MzUsIDB4MDQsIFNTX1JERUYsCi0JCQkiRW5jbG9zdXJlIHNlcnZpY2VzIHRyYW5zZmVyIHJlZnVzZWQiKSB9LAotLyogICBMICAgICAgICAgICove1NTVCgweDM2LCAweDAwLCBTU19SREVGLAotCQkJIlJpYmJvbiwgaW5rLCBvciB0b25lciBmYWlsdXJlIikgfSwKLS8qIERUTCBXUlNPTUNBRSAqL3tTU1QoMHgzNywgMHgwMCwgU1NfUkRFRiwKLQkJCSJSb3VuZGVkIHBhcmFtZXRlciIpIH0sCi0vKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MzksIDB4MDAsIFNTX1JERUYsCi0JCQkiU2F2aW5nIHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZCIpIH0sCi0vKiBEVEwgV1JTT00gICAgKi97U1NUKDB4M0EsIDB4MDAsIFNTX05PUCwKLQkJCSJNZWRpdW0gbm90IHByZXNlbnQiKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDNBLCAweDAxLCBTU19OT1AsCi0JCQkiTWVkaXVtIG5vdCBwcmVzZW50IC0gdHJheSBjbG9zZWQiKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDNBLCAweDAxLCBTU19OT1AsCi0JCQkiTWVkaXVtIG5vdCBwcmVzZW50IC0gdHJheSBvcGVuIikgfSwKLS8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQSwgMHgwMywgU1NfTk9QLAotCQkJIk1lZGl1bSBub3QgcHJlc2VudCAtIExvYWRhYmxlIikgfSwKLS8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQSwgMHgwNCwgU1NfTk9QLAotCQkJIk1lZGl1bSBub3QgcHJlc2VudCAtIG1lZGl1bSBhdXhpbGlhcnkgIgotCQkJIm1lbW9yeSBhY2Nlc3NpYmxlIikgfSwKLS8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQSwgMHhGRiwgU1NfTk9QLCBOVUxMKSB9LC8qIFJhbmdlIDB4MDUtPjB4RkYgKi8KLS8qICBUTCAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJTZXF1ZW50aWFsIHBvc2l0aW9uaW5nIGVycm9yIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwMSwgU1NfUkRFRiwKLQkJCSJUYXBlIHBvc2l0aW9uIGVycm9yIGF0IGJlZ2lubmluZy1vZi1tZWRpdW0iKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDNCLCAweDAyLCBTU19SREVGLAotCQkJIlRhcGUgcG9zaXRpb24gZXJyb3IgYXQgZW5kLW9mLW1lZGl1bSIpIH0sCi0vKiAgIEwgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDMsIFNTX1JERUYsCi0JCQkiVGFwZSBvciBlbGVjdHJvbmljIHZlcnRpY2FsIGZvcm1zIHVuaXQgbm90IHJlYWR5IikgfSwKLS8qICAgTCAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwNCwgU1NfUkRFRiwKLQkJCSJTbGV3IGZhaWx1cmUiKSB9LAotLyogICBMICAgICAgICAgICove1NTVCgweDNCLCAweDA1LCBTU19SREVGLAotCQkJIlBhcGVyIGphbSIpIH0sCi0vKiAgIEwgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDYsIFNTX1JERUYsCi0JCQkiRmFpbGVkIHRvIHNlbnNlIHRvcC1vZi1mb3JtIikgfSwKLS8qICAgTCAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwNywgU1NfUkRFRiwKLQkJCSJGYWlsZWQgdG8gc2Vuc2UgYm90dG9tLW9mLWZvcm0iKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDNCLCAweDA4LCBTU19SREVGLAotCQkJIlJlcG9zaXRpb24gZXJyb3IiKSB9LAotLyogICAgICAgUyAgICAgICove1NTVCgweDNCLCAweDA5LCBTU19SREVGLAotCQkJIlJlYWQgcGFzdCBlbmQgb2YgbWVkaXVtIikgfSwKLS8qICAgICAgIFMgICAgICAqL3tTU1QoMHgzQiwgMHgwQSwgU1NfUkRFRiwKLQkJCSJSZWFkIHBhc3QgYmVnaW5uaW5nIG9mIG1lZGl1bSIpIH0sCi0vKiAgICAgICBTICAgICAgKi97U1NUKDB4M0IsIDB4MEIsIFNTX1JERUYsCi0JCQkiUG9zaXRpb24gcGFzdCBlbmQgb2YgbWVkaXVtIikgfSwKLS8qICBUICAgIFMgICAgICAqL3tTU1QoMHgzQiwgMHgwQywgU1NfUkRFRiwKLQkJCSJQb3NpdGlvbiBwYXN0IGJlZ2lubmluZyBvZiBtZWRpdW0iKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDBELCBTU19GQVRBTHxFTk9TUEMsCi0JCQkiTWVkaXVtIGRlc3RpbmF0aW9uIGVsZW1lbnQgZnVsbCIpIH0sCi0vKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0IsIDB4MEUsIFNTX1JERUYsCi0JCQkiTWVkaXVtIHNvdXJjZSBlbGVtZW50IGVtcHR5IikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgzQiwgMHgwRiwgU1NfUkRFRiwKLQkJCSJFbmQgb2YgbWVkaXVtIHJlYWNoZWQiKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDExLCBTU19SREVGLAotCQkJIk1lZGl1bSBtYWdhemluZSBub3QgYWNjZXNzaWJsZSIpIH0sCi0vKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0IsIDB4MTIsIFNTX1JERUYsCi0JCQkiTWVkaXVtIG1hZ2F6aW5lIHJlbW92ZWQiKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDEzLCBTU19SREVGLAotCQkJIk1lZGl1bSBtYWdhemluZSBpbnNlcnRlZCIpIH0sCi0vKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0IsIDB4MTQsIFNTX1JERUYsCi0JCQkiTWVkaXVtIG1hZ2F6aW5lIGxvY2tlZCIpIH0sCi0vKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0IsIDB4MTUsIFNTX1JERUYsCi0JCQkiTWVkaXVtIG1hZ2F6aW5lIHVubG9ja2VkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzRCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJJbnZhbGlkIGJpdHMgaW4gaWRlbnRpZnkgbWVzc2FnZSIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0UsIDB4MDAsIFNTX1JERUYsCi0JCQkiTG9naWNhbCB1bml0IGhhcyBub3Qgc2VsZi1jb25maWd1cmVkIHlldCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0UsIDB4MDEsIFNTX1JERUYsCi0JCQkiTG9naWNhbCB1bml0IGZhaWx1cmUiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDNFLCAweDAyLCBTU19SREVGLAotCQkJIlRpbWVvdXQgb24gbG9naWNhbCB1bml0IikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzRiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJUYXJnZXQgb3BlcmF0aW5nIGNvbmRpdGlvbnMgaGF2ZSBjaGFuZ2VkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzRiwgMHgwMSwgU1NfUkRFRiwKLQkJCSJNaWNyb2NvZGUgaGFzIGJlZW4gY2hhbmdlZCIpIH0sCi0vKiBEVExQV1JTT01DICAgKi97U1NUKDB4M0YsIDB4MDIsIFNTX1JERUYsCi0JCQkiQ2hhbmdlZCBvcGVyYXRpbmcgZGVmaW5pdGlvbiIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0YsIDB4MDMsIFNTX0lOUV9SRUZSRVNIfFNTUV9ERUNSRU1FTlRfQ09VTlQsCi0JCQkiSW5xdWlyeSBkYXRhIGhhcyBjaGFuZ2VkIikgfSwKLS8qIERUICBXUiBPTUNBRSAqL3tTU1QoMHgzRiwgMHgwNCwgU1NfUkRFRiwKLQkJCSJDb21wb25lbnQgZGV2aWNlIGF0dGFjaGVkIikgfSwKLS8qIERUICBXUiBPTUNBRSAqL3tTU1QoMHgzRiwgMHgwNSwgU1NfUkRFRiwKLQkJCSJEZXZpY2UgaWRlbnRpZmllciBjaGFuZ2VkIikgfSwKLS8qIERUICBXUiBPTUNBRSAqL3tTU1QoMHgzRiwgMHgwNiwgU1NfUkRFRiwKLQkJCSJSZWR1bmRhbmN5IGdyb3VwIGNyZWF0ZWQgb3IgbW9kaWZpZWQiKSB9LAotLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDA3LCBTU19SREVGLAotCQkJIlJlZHVuZGFuY3kgZ3JvdXAgZGVsZXRlZCIpIH0sCi0vKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MDgsIFNTX1JERUYsCi0JCQkiU3BhcmUgY3JlYXRlZCBvciBtb2RpZmllZCIpIH0sCi0vKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MDksIFNTX1JERUYsCi0JCQkiU3BhcmUgZGVsZXRlZCIpIH0sCi0vKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MEEsIFNTX1JERUYsCi0JCQkiVm9sdW1lIHNldCBjcmVhdGVkIG9yIG1vZGlmaWVkIikgfSwKLS8qIERUICBXUiBPTUNBRSAqL3tTU1QoMHgzRiwgMHgwQiwgU1NfUkRFRiwKLQkJCSJWb2x1bWUgc2V0IGRlbGV0ZWQiKSB9LAotLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDBDLCBTU19SREVGLAotCQkJIlZvbHVtZSBzZXQgZGVhc3NpZ25lZCIpIH0sCi0vKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MEQsIFNTX1JERUYsCi0JCQkiVm9sdW1lIHNldCByZWFzc2lnbmVkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzRiwgMHgwRSwgU1NfUkRFRiwKLQkJCSJSZXBvcnRlZCBsdW5zIGRhdGEgaGFzIGNoYW5nZWQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDNGLCAweDBGLCBTU19SRVRSWXxTU1FfREVDUkVNRU5UX0NPVU5UCi0JCQkJIHwgU1NRX0RFTEFZX1JBTkRPTXxFQlVTWSwKLQkJCSJFY2hvIGJ1ZmZlciBvdmVyd3JpdHRlbiIpIH0sCi0vKiBEVCAgV1IgT00gICBCKi97U1NUKDB4M0YsIDB4MEYsIFNTX1JERUYsICJNZWRpdW0gTG9hZGFibGUiKSB9LAotLyogRFQgIFdSIE9NICAgQiove1NTVCgweDNGLCAweDBGLCBTU19SREVGLAotCQkJIk1lZGl1bSBhdXhpbGlhcnkgbWVtb3J5IGFjY2Vzc2libGUiKSB9LAotLyogRCAgICAgICAgICAgICove1NTVCgweDQwLCAweDAwLCBTU19SREVGLAotCQkJIlJhbSBmYWlsdXJlIikgfSwgLyogZGVwcmVjYXRlZCAtIHVzZSA0MCBOTiBpbnN0ZWFkICovCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDAsIDB4ODAsIFNTX1JERUYsCi0JCQkiRGlhZ25vc3RpYyBmYWlsdXJlOiBBU0NRID0gQ29tcG9uZW50IElEIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0MCwgMHhGRiwgU1NfUkRFRnxTU1FfUkFOR0UsCi0JCQlOVUxMKSB9LC8qIFJhbmdlIDB4ODAtPjB4RkYgKi8KLS8qIEQgICAgICAgICAgICAqL3tTU1QoMHg0MSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJEYXRhIHBhdGggZmFpbHVyZSIpIH0sIC8qIGRlcHJlY2F0ZWQgLSB1c2UgNDAgTk4gaW5zdGVhZCAqLwotLyogRCAgICAgICAgICAgICove1NTVCgweDQyLCAweDAwLCBTU19SREVGLAotCQkJIlBvd2VyLW9uIG9yIHNlbGYtdGVzdCBmYWlsdXJlIikgfSwgLyogZGVwcmVjYXRlZCAtIHVzZSA0MCBOTiBpbnN0ZWFkICovCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDMsIDB4MDAsIFNTX1JERUYsCi0JCQkiTWVzc2FnZSBlcnJvciIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDQsIDB4MDAsIFNTX1JERUYsCi0JCQkiSW50ZXJuYWwgdGFyZ2V0IGZhaWx1cmUiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ1LCAweDAwLCBTU19SREVGLAotCQkJIlNlbGVjdCBvciByZXNlbGVjdCBmYWlsdXJlIikgfSwKLS8qIERUTFBXUlNPTUMgICAqL3tTU1QoMHg0NiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJVbnN1Y2Nlc3NmdWwgc29mdCByZXNldCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDcsIDB4MDAsIFNTX1JERUZ8U1NRX0ZBTExCQUNLLAotCQkJIlNDU0kgcGFyaXR5IGVycm9yIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0NywgMHgwMSwgU1NfUkRFRnxTU1FfRkFMTEJBQ0ssCi0JCQkiRGF0YSBQaGFzZSBDUkMgZXJyb3IgZGV0ZWN0ZWQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ3LCAweDAyLCBTU19SREVGfFNTUV9GQUxMQkFDSywKLQkJCSJTQ1NJIHBhcml0eSBlcnJvciBkZXRlY3RlZCBkdXJpbmcgU1QgZGF0YSBwaGFzZSIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDcsIDB4MDMsIFNTX1JERUZ8U1NRX0ZBTExCQUNLLAotCQkJIkluZm9ybWF0aW9uIFVuaXQgaXVDUkMgZXJyb3IiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ3LCAweDA0LCBTU19SREVGfFNTUV9GQUxMQkFDSywKLQkJCSJBc3luY2hyb25vdXMgaW5mb3JtYXRpb24gcHJvdGVjdGlvbiBlcnJvciBkZXRlY3RlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDcsIDB4MDUsIFNTX1JERUZ8U1NRX0ZBTExCQUNLLAotCQkJIlByb3RvY29sIHNlcnZlciBDUkMgZXJyb3IiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ4LCAweDAwLCBTU19SREVGfFNTUV9GQUxMQkFDSywKLQkJCSJJbml0aWF0b3IgZGV0ZWN0ZWQgZXJyb3IgbWVzc2FnZSByZWNlaXZlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDksIDB4MDAsIFNTX1JERUYsCi0JCQkiSW52YWxpZCBtZXNzYWdlIGVycm9yIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0QSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJDb21tYW5kIHBoYXNlIGVycm9yIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0QiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJEYXRhIHBoYXNlIGVycm9yIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0QywgMHgwMCwgU1NfUkRFRiwKLQkJCSJMb2dpY2FsIHVuaXQgZmFpbGVkIHNlbGYtY29uZmlndXJhdGlvbiIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NEQsIDB4MDAsIFNTX1JERUYsCi0JCQkiVGFnZ2VkIG92ZXJsYXBwZWQgY29tbWFuZHM6IEFTQ1EgPSBRdWV1ZSB0YWcgSUQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDRELCAweEZGLCBTU19SREVGfFNTUV9SQU5HRSwKLQkJCU5VTEwpfSwgLyogUmFuZ2UgMHgwMC0+MHhGRiAqLwotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDRFLCAweDAwLCBTU19SREVGLAotCQkJIk92ZXJsYXBwZWQgY29tbWFuZHMgYXR0ZW1wdGVkIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHg1MCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJXcml0ZSBhcHBlbmQgZXJyb3IiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDUwLCAweDAxLCBTU19SREVGLAotCQkJIldyaXRlIGFwcGVuZCBwb3NpdGlvbiBlcnJvciIpIH0sCi0vKiAgVCAgICAgICAgICAgKi97U1NUKDB4NTAsIDB4MDIsIFNTX1JERUYsCi0JCQkiUG9zaXRpb24gZXJyb3IgcmVsYXRlZCB0byB0aW1pbmciKSB9LAotLyogIFQgICAgIE8gICAgICove1NTVCgweDUxLCAweDAwLCBTU19SREVGLAotCQkJIkVyYXNlIGZhaWx1cmUiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDUyLCAweDAwLCBTU19SREVGLAotCQkJIkNhcnRyaWRnZSBmYXVsdCIpIH0sCi0vKiBEVEwgV1JTT00gICAgKi97U1NUKDB4NTMsIDB4MDAsIFNTX1JERUYsCi0JCQkiTWVkaWEgbG9hZCBvciBlamVjdCBmYWlsZWQiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDUzLCAweDAxLCBTU19SREVGLAotCQkJIlVubG9hZCB0YXBlIGZhaWx1cmUiKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDUzLCAweDAyLCBTU19SREVGLAotCQkJIk1lZGl1bSByZW1vdmFsIHByZXZlbnRlZCIpIH0sCi0vKiAgICBQICAgICAgICAgKi97U1NUKDB4NTQsIDB4MDAsIFNTX1JERUYsCi0JCQkiU2NzaSB0byBob3N0IHN5c3RlbSBpbnRlcmZhY2UgZmFpbHVyZSIpIH0sCi0vKiAgICBQICAgICAgICAgKi97U1NUKDB4NTUsIDB4MDAsIFNTX1JERUYsCi0JCQkiU3lzdGVtIHJlc291cmNlIGZhaWx1cmUiKSB9LAotLyogRCAgICAgIE8gICAgICove1NTVCgweDU1LCAweDAxLCBTU19GQVRBTHxFTk9TUEMsCi0JCQkiU3lzdGVtIGJ1ZmZlciBmdWxsIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHg1NywgMHgwMCwgU1NfUkRFRiwKLQkJCSJVbmFibGUgdG8gcmVjb3ZlciB0YWJsZS1vZi1jb250ZW50cyIpIH0sCi0vKiAgICAgICAgTyAgICAgKi97U1NUKDB4NTgsIDB4MDAsIFNTX1JERUYsCi0JCQkiR2VuZXJhdGlvbiBkb2VzIG5vdCBleGlzdCIpIH0sCi0vKiAgICAgICAgTyAgICAgKi97U1NUKDB4NTksIDB4MDAsIFNTX1JERUYsCi0JCQkiVXBkYXRlZCBibG9jayByZWFkIikgfSwKLS8qIERUTFBXUlNPTSAgICAqL3tTU1QoMHg1QSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJPcGVyYXRvciByZXF1ZXN0IG9yIHN0YXRlIGNoYW5nZSBpbnB1dCIpIH0sCi0vKiBEVCAgV1IgT00gICAgKi97U1NUKDB4NUEsIDB4MDEsIFNTX1JERUYsCi0JCQkiT3BlcmF0b3IgbWVkaXVtIHJlbW92YWwgcmVxdWVzdCIpIH0sCi0vKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4NUEsIDB4MDIsIFNTX1JERUYsCi0JCQkiT3BlcmF0b3Igc2VsZWN0ZWQgd3JpdGUgcHJvdGVjdCIpIH0sCi0vKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4NUEsIDB4MDMsIFNTX1JERUYsCi0JCQkiT3BlcmF0b3Igc2VsZWN0ZWQgd3JpdGUgcGVybWl0IikgfSwKLS8qIERUTFBXUlNPTSAgICAqL3tTU1QoMHg1QiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJMb2cgZXhjZXB0aW9uIikgfSwKLS8qIERUTFBXUlNPTSAgICAqL3tTU1QoMHg1QiwgMHgwMSwgU1NfUkRFRiwKLQkJCSJUaHJlc2hvbGQgY29uZGl0aW9uIG1ldCIpIH0sCi0vKiBEVExQV1JTT00gICAgKi97U1NUKDB4NUIsIDB4MDIsIFNTX1JERUYsCi0JCQkiTG9nIGNvdW50ZXIgYXQgbWF4aW11bSIpIH0sCi0vKiBEVExQV1JTT00gICAgKi97U1NUKDB4NUIsIDB4MDMsIFNTX1JERUYsCi0JCQkiTG9nIGxpc3QgY29kZXMgZXhoYXVzdGVkIikgfSwKLS8qIEQgICAgICBPICAgICAqL3tTU1QoMHg1QywgMHgwMCwgU1NfUkRFRiwKLQkJCSJSUEwgc3RhdHVzIGNoYW5nZSIpIH0sCi0vKiBEICAgICAgTyAgICAgKi97U1NUKDB4NUMsIDB4MDEsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiU3BpbmRsZXMgc3luY2hyb25pemVkIikgfSwKLS8qIEQgICAgICBPICAgICAqL3tTU1QoMHg1QywgMHgwMiwgU1NfUkRFRiwKLQkJCSJTcGluZGxlcyBub3Qgc3luY2hyb25pemVkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg1RCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJGYWlsdXJlIHByZWRpY3Rpb24gdGhyZXNob2xkIGV4Y2VlZGVkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg1RCwgMHhGRiwgU1NfUkRFRiwKLQkJCSJGYWlsdXJlIHByZWRpY3Rpb24gdGhyZXNob2xkIGV4Y2VlZGVkIChmYWxzZSkiKSB9LAotLyogRFRMUFdSU08gQ0EgICove1NTVCgweDVFLCAweDAwLCBTU19SREVGLAotCQkJIkxvdyBwb3dlciBjb25kaXRpb24gb24iKSB9LAotLyogRFRMUFdSU08gQ0EgICove1NTVCgweDVFLCAweDAxLCBTU19SREVGLAotCQkJIklkbGUgY29uZGl0aW9uIGFjdGl2YXRlZCBieSB0aW1lciIpIH0sCi0vKiBEVExQV1JTTyBDQSAgKi97U1NUKDB4NUUsIDB4MDIsIFNTX1JERUYsCi0JCQkiU3RhbmRieSBjb25kaXRpb24gYWN0aXZhdGVkIGJ5IHRpbWVyIikgfSwKLS8qIERUTFBXUlNPIENBICAqL3tTU1QoMHg1RSwgMHgwMywgU1NfUkRFRiwKLQkJCSJJZGxlIGNvbmRpdGlvbiBhY3RpdmF0ZWQgYnkgY29tbWFuZCIpIH0sCi0vKiBEVExQV1JTTyBDQSAgKi97U1NUKDB4NUUsIDB4MDQsIFNTX1JERUYsCi0JCQkiU3RhbmRieSBjb25kaXRpb24gYWN0aXZhdGVkIGJ5IGNvbW1hbmQiKSB9LAotLyogICAgICAgUyAgICAgICove1NTVCgweDYwLCAweDAwLCBTU19SREVGLAotCQkJIkxhbXAgZmFpbHVyZSIpIH0sCi0vKiAgICAgICBTICAgICAgKi97U1NUKDB4NjEsIDB4MDAsIFNTX1JERUYsCi0JCQkiVmlkZW8gYWNxdWlzaXRpb24gZXJyb3IiKSB9LAotLyogICAgICAgUyAgICAgICove1NTVCgweDYxLCAweDAxLCBTU19SREVGLAotCQkJIlVuYWJsZSB0byBhY3F1aXJlIHZpZGVvIikgfSwKLS8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2MSwgMHgwMiwgU1NfUkRFRiwKLQkJCSJPdXQgb2YgZm9jdXMiKSB9LAotLyogICAgICAgUyAgICAgICove1NTVCgweDYyLCAweDAwLCBTU19SREVGLAotCQkJIlNjYW4gaGVhZCBwb3NpdGlvbmluZyBlcnJvciIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4NjMsIDB4MDAsIFNTX1JERUYsCi0JCQkiRW5kIG9mIHVzZXIgYXJlYSBlbmNvdW50ZXJlZCBvbiB0aGlzIHRyYWNrIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHg2MywgMHgwMSwgU1NfRkFUQUx8RU5PU1BDLAotCQkJIlBhY2tldCBkb2VzIG5vdCBmaXQgaW4gYXZhaWxhYmxlIHNwYWNlIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHg2NCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJJbGxlZ2FsIG1vZGUgZm9yIHRoaXMgdHJhY2siKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDY0LCAweDAxLCBTU19SREVGLAotCQkJIkludmFsaWQgcGFja2V0IHNpemUiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDY1LCAweDAwLCBTU19SREVGLAotCQkJIlZvbHRhZ2UgZmF1bHQiKSB9LAotLyogICAgICAgUyAgICAgICove1NTVCgweDY2LCAweDAwLCBTU19SREVGLAotCQkJIkF1dG9tYXRpYyBkb2N1bWVudCBmZWVkZXIgY292ZXIgdXAiKSB9LAotLyogICAgICAgUyAgICAgICove1NTVCgweDY2LCAweDAxLCBTU19SREVGLAotCQkJIkF1dG9tYXRpYyBkb2N1bWVudCBmZWVkZXIgbGlmdCB1cCIpIH0sCi0vKiAgICAgICBTICAgICAgKi97U1NUKDB4NjYsIDB4MDIsIFNTX1JERUYsCi0JCQkiRG9jdW1lbnQgamFtIGluIGF1dG9tYXRpYyBkb2N1bWVudCBmZWVkZXIiKSB9LAotLyogICAgICAgUyAgICAgICove1NTVCgweDY2LCAweDAzLCBTU19SREVGLAotCQkJIkRvY3VtZW50IG1pc3MgZmVlZCBhdXRvbWF0aWMgaW4gZG9jdW1lbnQgZmVlZGVyIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwMCwgU1NfUkRFRiwKLQkJCSJDb25maWd1cmF0aW9uIGZhaWx1cmUiKSB9LAotLyogICAgICAgICAgIEEgICove1NTVCgweDY3LCAweDAxLCBTU19SREVGLAotCQkJIkNvbmZpZ3VyYXRpb24gb2YgaW5jYXBhYmxlIGxvZ2ljYWwgdW5pdHMgZmFpbGVkIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwMiwgU1NfUkRFRiwKLQkJCSJBZGQgbG9naWNhbCB1bml0IGZhaWxlZCIpIH0sCi0vKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjcsIDB4MDMsIFNTX1JERUYsCi0JCQkiTW9kaWZpY2F0aW9uIG9mIGxvZ2ljYWwgdW5pdCBmYWlsZWQiKSB9LAotLyogICAgICAgICAgIEEgICove1NTVCgweDY3LCAweDA0LCBTU19SREVGLAotCQkJIkV4Y2hhbmdlIG9mIGxvZ2ljYWwgdW5pdCBmYWlsZWQiKSB9LAotLyogICAgICAgICAgIEEgICove1NTVCgweDY3LCAweDA1LCBTU19SREVGLAotCQkJIlJlbW92ZSBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwNiwgU1NfUkRFRiwKLQkJCSJBdHRhY2htZW50IG9mIGxvZ2ljYWwgdW5pdCBmYWlsZWQiKSB9LAotLyogICAgICAgICAgIEEgICove1NTVCgweDY3LCAweDA3LCBTU19SREVGLAotCQkJIkNyZWF0aW9uIG9mIGxvZ2ljYWwgdW5pdCBmYWlsZWQiKSB9LAotLyogICAgICAgICAgIEEgICove1NTVCgweDY4LCAweDAwLCBTU19SREVGLAotCQkJIkxvZ2ljYWwgdW5pdCBub3QgY29uZmlndXJlZCIpIH0sCi0vKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjksIDB4MDAsIFNTX1JERUYsCi0JCQkiRGF0YSBsb3NzIG9uIGxvZ2ljYWwgdW5pdCIpIH0sCi0vKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjksIDB4MDEsIFNTX1JERUYsCi0JCQkiTXVsdGlwbGUgbG9naWNhbCB1bml0IGZhaWx1cmVzIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2OSwgMHgwMiwgU1NfUkRFRiwKLQkJCSJQYXJpdHkvZGF0YSBtaXNtYXRjaCIpIH0sCi0vKiAgICAgICAgICAgQSAgKi97U1NUKDB4NkEsIDB4MDAsIFNTX1JERUYsCi0JCQkiSW5mb3JtYXRpb25hbCwgcmVmZXIgdG8gbG9nIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2QiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJTdGF0ZSBjaGFuZ2UgaGFzIG9jY3VycmVkIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2QiwgMHgwMSwgU1NfUkRFRiwKLQkJCSJSZWR1bmRhbmN5IGxldmVsIGdvdCBiZXR0ZXIiKSB9LAotLyogICAgICAgICAgIEEgICove1NTVCgweDZCLCAweDAyLCBTU19SREVGLAotCQkJIlJlZHVuZGFuY3kgbGV2ZWwgZ290IHdvcnNlIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2QywgMHgwMCwgU1NfUkRFRiwKLQkJCSJSZWJ1aWxkIGZhaWx1cmUgb2NjdXJyZWQiKSB9LAotLyogICAgICAgICAgIEEgICove1NTVCgweDZELCAweDAwLCBTU19SREVGLAotCQkJIlJlY2FsY3VsYXRlIGZhaWx1cmUgb2NjdXJyZWQiKSB9LAotLyogICAgICAgICAgIEEgICove1NTVCgweDZFLCAweDAwLCBTU19SREVGLAotCQkJIkNvbW1hbmQgdG8gbG9naWNhbCB1bml0IGZhaWxlZCIpIH0sCi0vKiAgVCAgICAgICAgICAgKi97U1NUKDB4NzAsIDB4MDAsIFNTX1JERUYsCi0JCQkiRGVjb21wcmVzc2lvbiBleGNlcHRpb24gc2hvcnQ6IEFTQ1EgPSBBbGdvcml0aG0gSUQiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDcwLCAweEZGLCBTU19SREVGfFNTUV9SQU5HRSwKLQkJCU5VTEwpIH0sIC8qIFJhbmdlIDB4MDAgLT4gMHhGRiAqLwotLyogIFQgICAgICAgICAgICove1NTVCgweDcxLCAweDAwLCBTU19SREVGLAotCQkJIkRlY29tcHJlc3Npb24gZXhjZXB0aW9uIGxvbmc6IEFTQ1EgPSBBbGdvcml0aG0gSUQiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDcxLCAweEZGLCBTU19SREVGfFNTUV9SQU5HRSwKLQkJCU5VTEwpIH0sIC8qIFJhbmdlIDB4MDAgLT4gMHhGRiAqLwkKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJTZXNzaW9uIGZpeGF0aW9uIGVycm9yIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MiwgMHgwMSwgU1NfUkRFRiwKLQkJCSJTZXNzaW9uIGZpeGF0aW9uIGVycm9yIHdyaXRpbmcgbGVhZC1pbiIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDIsIFNTX1JERUYsCi0JCQkiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciB3cml0aW5nIGxlYWQtb3V0IikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MiwgMHgwMywgU1NfUkRFRiwKLQkJCSJTZXNzaW9uIGZpeGF0aW9uIGVycm9yIC0gaW5jb21wbGV0ZSB0cmFjayBpbiBzZXNzaW9uIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MiwgMHgwNCwgU1NfUkRFRiwKLQkJCSJFbXB0eSBvciBwYXJ0aWFsbHkgd3JpdHRlbiByZXNlcnZlZCB0cmFjayIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzMsIDB4MDAsIFNTX1JERUYsCi0JCQkiQ0QgY29udHJvbCBlcnJvciIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzMsIDB4MDEsIFNTX1JERUYsCi0JCQkiUG93ZXIgY2FsaWJyYXRpb24gYXJlYSBhbG1vc3QgZnVsbCIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzMsIDB4MDIsIFNTX0ZBVEFMfEVOT1NQQywKLQkJCSJQb3dlciBjYWxpYnJhdGlvbiBhcmVhIGlzIGZ1bGwiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDczLCAweDAzLCBTU19SREVGLAotCQkJIlBvd2VyIGNhbGlicmF0aW9uIGFyZWEgZXJyb3IiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDczLCAweDA0LCBTU19SREVGLAotCQkJIlByb2dyYW0gbWVtb3J5IGFyZWEgdXBkYXRlIGZhaWx1cmUiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDczLCAweDA1LCBTU19SREVGLAotCQkJInByb2dyYW0gbWVtb3J5IGFyZWEgaXMgZnVsbCIpIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgYXNjX3RhYmxlX3NpemUgPSBzaXplb2YoYXNjX3RhYmxlKS9zaXplb2YoYXNjX3RhYmxlWzBdKTsKLQotc3RydWN0IGFzY19rZXkKLXsKLQlpbnQgYXNjOwotCWludCBhc2NxOwotfTsKLQotc3RhdGljIGludAotYXNjZW50cnljb21wKGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqbWVtYmVyKQotewotCWludCBhc2M7Ci0JaW50IGFzY3E7Ci0JY29uc3Qgc3RydWN0IGFzY190YWJsZV9lbnRyeSAqdGFibGVfZW50cnk7Ci0KLQlhc2MgPSAoKGNvbnN0IHN0cnVjdCBhc2Nfa2V5ICopa2V5KS0+YXNjOwotCWFzY3EgPSAoKGNvbnN0IHN0cnVjdCBhc2Nfa2V5ICopa2V5KS0+YXNjcTsKLQl0YWJsZV9lbnRyeSA9IChjb25zdCBzdHJ1Y3QgYXNjX3RhYmxlX2VudHJ5ICopbWVtYmVyOwotCi0JaWYgKGFzYyA+PSB0YWJsZV9lbnRyeS0+YXNjKSB7Ci0KLQkJaWYgKGFzYyA+IHRhYmxlX2VudHJ5LT5hc2MpCi0JCQlyZXR1cm4gKDEpOwotCi0JCWlmIChhc2NxIDw9IHRhYmxlX2VudHJ5LT5hc2NxKSB7Ci0JCQkvKiBDaGVjayBmb3IgcmFuZ2VzICovCi0JCQlpZiAoYXNjcSA9PSB0YWJsZV9lbnRyeS0+YXNjcQotCQkgCSB8fCAoKHRhYmxlX2VudHJ5LT5hY3Rpb24gJiBTU1FfUkFOR0UpICE9IDAKLQkJICAJICAgJiYgYXNjcSA+PSAodGFibGVfZW50cnkgLSAxKS0+YXNjcSkpCi0JCQkJcmV0dXJuICgwKTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JCXJldHVybiAoMSk7Ci0JfQotCXJldHVybiAoLTEpOwotfQotCi1zdGF0aWMgaW50Ci1zZW5zZWVudHJ5Y29tcChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKm1lbWJlcikKLXsKLQlpbnQgc2Vuc2Vfa2V5OwotCWNvbnN0IHN0cnVjdCBzZW5zZV9rZXlfdGFibGVfZW50cnkgKnRhYmxlX2VudHJ5OwotCi0Jc2Vuc2Vfa2V5ID0gKigoY29uc3QgaW50ICopa2V5KTsKLQl0YWJsZV9lbnRyeSA9IChjb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICopbWVtYmVyOwotCi0JaWYgKHNlbnNlX2tleSA+PSB0YWJsZV9lbnRyeS0+c2Vuc2Vfa2V5KSB7Ci0JCWlmIChzZW5zZV9rZXkgPT0gdGFibGVfZW50cnktPnNlbnNlX2tleSkKLQkJCXJldHVybiAoMCk7Ci0JCXJldHVybiAoMSk7Ci0JfQotCXJldHVybiAoLTEpOwotfQotCi1zdGF0aWMgdm9pZAotZmV0Y2h0YWJsZWVudHJpZXMoaW50IHNlbnNlX2tleSwgaW50IGFzYywgaW50IGFzY3EsCi0JCSAgc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICppbnFfZGF0YSwKLQkJICBjb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICoqc2Vuc2VfZW50cnksCi0JCSAgY29uc3Qgc3RydWN0IGFzY190YWJsZV9lbnRyeSAqKmFzY19lbnRyeSkKLXsKLQl2b2lkICptYXRjaDsKLQljb25zdCBzdHJ1Y3QgYXNjX3RhYmxlX2VudHJ5ICphc2NfdGFibGVzWzJdOwotCWNvbnN0IHN0cnVjdCBzZW5zZV9rZXlfdGFibGVfZW50cnkgKnNlbnNlX3RhYmxlc1syXTsKLQlzdHJ1Y3QgYXNjX2tleSBhc2NfYXNjcTsKLQlzaXplX3QgYXNjX3RhYmxlc19zaXplWzJdOwotCXNpemVfdCBzZW5zZV90YWJsZXNfc2l6ZVsyXTsKLQlpbnQgbnVtX2FzY190YWJsZXM7Ci0JaW50IG51bV9zZW5zZV90YWJsZXM7Ci0JaW50IGk7Ci0KLQkvKiBEZWZhdWx0IHRvIGZhaWx1cmUgKi8KLQkqc2Vuc2VfZW50cnkgPSBOVUxMOwotCSphc2NfZW50cnkgPSBOVUxMOwotCW1hdGNoID0gTlVMTDsKLQlpZiAoaW5xX2RhdGEgIT0gTlVMTCkKLQkJbWF0Y2ggPSBjYW1fcXVpcmttYXRjaCgodm9pZCAqKWlucV9kYXRhLAotCQkJCSAgICAgICAodm9pZCAqKXNlbnNlX3F1aXJrX3RhYmxlLAotCQkJCSAgICAgICBzZW5zZV9xdWlya190YWJsZV9zaXplLAotCQkJCSAgICAgICBzaXplb2YoKnNlbnNlX3F1aXJrX3RhYmxlKSwKLQkJCQkgICAgICAgYWljX2lucXVpcnlfbWF0Y2gpOwotCi0JaWYgKG1hdGNoICE9IE5VTEwpIHsKLQkJc3RydWN0IHNjc2lfc2Vuc2VfcXVpcmtfZW50cnkgKnF1aXJrOwotCi0JCXF1aXJrID0gKHN0cnVjdCBzY3NpX3NlbnNlX3F1aXJrX2VudHJ5ICopbWF0Y2g7Ci0JCWFzY190YWJsZXNbMF0gPSBxdWlyay0+YXNjX2luZm87Ci0JCWFzY190YWJsZXNfc2l6ZVswXSA9IHF1aXJrLT5udW1fYXNjczsKLQkJYXNjX3RhYmxlc1sxXSA9IGFzY190YWJsZTsKLQkJYXNjX3RhYmxlc19zaXplWzFdID0gYXNjX3RhYmxlX3NpemU7Ci0JCW51bV9hc2NfdGFibGVzID0gMjsKLQkJc2Vuc2VfdGFibGVzWzBdID0gcXVpcmstPnNlbnNlX2tleV9pbmZvOwotCQlzZW5zZV90YWJsZXNfc2l6ZVswXSA9IHF1aXJrLT5udW1fc2Vuc2Vfa2V5czsKLQkJc2Vuc2VfdGFibGVzWzFdID0gc2Vuc2Vfa2V5X3RhYmxlOwotCQlzZW5zZV90YWJsZXNfc2l6ZVsxXSA9IHNlbnNlX2tleV90YWJsZV9zaXplOwotCQludW1fc2Vuc2VfdGFibGVzID0gMjsKLQl9IGVsc2UgewotCQlhc2NfdGFibGVzWzBdID0gYXNjX3RhYmxlOwotCQlhc2NfdGFibGVzX3NpemVbMF0gPSBhc2NfdGFibGVfc2l6ZTsKLQkJbnVtX2FzY190YWJsZXMgPSAxOwotCQlzZW5zZV90YWJsZXNbMF0gPSBzZW5zZV9rZXlfdGFibGU7Ci0JCXNlbnNlX3RhYmxlc19zaXplWzBdID0gc2Vuc2Vfa2V5X3RhYmxlX3NpemU7Ci0JCW51bV9zZW5zZV90YWJsZXMgPSAxOwotCX0KLQotCWFzY19hc2NxLmFzYyA9IGFzYzsKLQlhc2NfYXNjcS5hc2NxID0gYXNjcTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2FzY190YWJsZXM7IGkrKykgewotCQl2b2lkICpmb3VuZF9lbnRyeTsKLQotCQlmb3VuZF9lbnRyeSA9IHNjc2lic2VhcmNoKCZhc2NfYXNjcSwgYXNjX3RhYmxlc1tpXSwKLQkJCQkJICBhc2NfdGFibGVzX3NpemVbaV0sCi0JCQkJCSAgc2l6ZW9mKCoqYXNjX3RhYmxlcyksCi0JCQkJCSAgYXNjZW50cnljb21wKTsKLQotCQlpZiAoZm91bmRfZW50cnkpIHsKLQkJCSphc2NfZW50cnkgPSAoc3RydWN0IGFzY190YWJsZV9lbnRyeSAqKWZvdW5kX2VudHJ5OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3NlbnNlX3RhYmxlczsgaSsrKSB7Ci0JCXZvaWQgKmZvdW5kX2VudHJ5OwotCi0JCWZvdW5kX2VudHJ5ID0gc2NzaWJzZWFyY2goJnNlbnNlX2tleSwgc2Vuc2VfdGFibGVzW2ldLAotCQkJCQkgIHNlbnNlX3RhYmxlc19zaXplW2ldLAotCQkJCQkgIHNpemVvZigqKnNlbnNlX3RhYmxlcyksCi0JCQkJCSAgc2Vuc2VlbnRyeWNvbXApOwotCi0JCWlmIChmb3VuZF9lbnRyeSkgewotCQkJKnNlbnNlX2VudHJ5ID0KLQkJCSAgICAoc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqKWZvdW5kX2VudHJ5OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkICoKLXNjc2lic2VhcmNoKGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqYmFzZSwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwKLQkJIGludCAoKmNvbXBhcikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKQotewotCWNvbnN0IHZvaWQgKmVudHJ5OwotCXVfaW50IGw7Ci0JdV9pbnQgdTsKLQl1X2ludCBtOwotCi0JbCA9IC0xOwotCXUgPSBubWVtYjsKLQl3aGlsZSAobCArIDEgIT0gdSkgewotCQltID0gKGwgKyB1KSAvIDI7Ci0JCWVudHJ5ID0gYmFzZSArIG0gKiBzaXplOwotCQlpZiAoY29tcGFyKGtleSwgZW50cnkpID4gMCkKLQkJCWwgPSBtOwotCQllbHNlCi0JCQl1ID0gbTsKLQl9Ci0KLQllbnRyeSA9IGJhc2UgKyB1ICogc2l6ZTsKLQlpZiAodSA9PSBubWVtYgotCSB8fCBjb21wYXIoa2V5LCBlbnRyeSkgIT0gMCkKLQkJcmV0dXJuIChOVUxMKTsKLQotCXJldHVybiAoKHZvaWQgKillbnRyeSk7Ci19Ci0KLS8qCi0gKiBDb21wYXJlIHN0cmluZyB3aXRoIHBhdHRlcm4sIHJldHVybmluZyAwIG9uIG1hdGNoLgotICogU2hvcnQgcGF0dGVybiBtYXRjaGVzIHRyYWlsaW5nIGJsYW5rcyBpbiBuYW1lLAotICogd2lsZGNhcmQgJyonIGluIHBhdHRlcm4gbWF0Y2hlcyByZXN0IG9mIG5hbWUsCi0gKiB3aWxkY2FyZCAnPycgbWF0Y2hlcyBhIHNpbmdsZSBub24tc3BhY2UgY2hhcmFjdGVyLgotICovCi1zdGF0aWMgaW50Ci1jYW1fc3RybWF0Y2goY29uc3QgdWludDhfdCAqc3RyLCBjb25zdCB1aW50OF90ICpwYXR0ZXJuLCBpbnQgc3RyX2xlbikKLXsKLQotCXdoaWxlICgqcGF0dGVybiAhPSAnXDAnJiYgc3RyX2xlbiA+IDApIHsgIAotCi0JCWlmICgqcGF0dGVybiA9PSAnKicpIHsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQkJaWYgKCgqcGF0dGVybiAhPSAqc3RyKQotCQkgJiYgKCpwYXR0ZXJuICE9ICc/JyB8fCAqc3RyID09ICcgJykpIHsKLQkJCXJldHVybiAoMSk7Ci0JCX0KLQkJcGF0dGVybisrOwotCQlzdHIrKzsKLQkJc3RyX2xlbi0tOwotCX0KLQl3aGlsZSAoc3RyX2xlbiA+IDAgJiYgKnN0cisrID09ICcgJykKLQkJc3RyX2xlbi0tOwotCi0JcmV0dXJuIChzdHJfbGVuKTsKLX0KLQotc3RhdGljIGNhZGRyX3QKLWNhbV9xdWlya21hdGNoKGNhZGRyX3QgdGFyZ2V0LCBjYWRkcl90IHF1aXJrX3RhYmxlLCBpbnQgbnVtX2VudHJpZXMsCi0JICAgICAgIGludCBlbnRyeV9zaXplLCBjYW1fcXVpcmttYXRjaF90ICpjb21wX2Z1bmMpCi17Ci0JZm9yICg7IG51bV9lbnRyaWVzID4gMDsgbnVtX2VudHJpZXMtLSwgcXVpcmtfdGFibGUgKz0gZW50cnlfc2l6ZSkgewotCQlpZiAoKCpjb21wX2Z1bmMpKHRhcmdldCwgcXVpcmtfdGFibGUpID09IDApCi0JCQlyZXR1cm4gKHF1aXJrX3RhYmxlKTsKLQl9Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotdm9pZAotYWljX3NlbnNlX2Rlc2MoaW50IHNlbnNlX2tleSwgaW50IGFzYywgaW50IGFzY3EsCi0JICAgICAgIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqaW5xX2RhdGEsCi0JICAgICAgIGNvbnN0IGNoYXIgKipzZW5zZV9rZXlfZGVzYywgY29uc3QgY2hhciAqKmFzY19kZXNjKQotewotCWNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKmFzY19lbnRyeTsKLQljb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICpzZW5zZV9lbnRyeTsKLQotCWZldGNodGFibGVlbnRyaWVzKHNlbnNlX2tleSwgYXNjLCBhc2NxLAotCQkJICBpbnFfZGF0YSwKLQkJCSAgJnNlbnNlX2VudHJ5LAotCQkJICAmYXNjX2VudHJ5KTsKLQotCSpzZW5zZV9rZXlfZGVzYyA9IHNlbnNlX2VudHJ5LT5kZXNjOwotCi0JaWYgKGFzY19lbnRyeSAhPSBOVUxMKQotCQkqYXNjX2Rlc2MgPSBhc2NfZW50cnktPmRlc2M7Ci0JZWxzZSBpZiAoYXNjID49IDB4ODAgJiYgYXNjIDw9IDB4ZmYpCi0JCSphc2NfZGVzYyA9ICJWZW5kb3IgU3BlY2lmaWMgQVNDIjsKLQllbHNlIGlmIChhc2NxID49IDB4ODAgJiYgYXNjcSA8PSAweGZmKQotCQkqYXNjX2Rlc2MgPSAiVmVuZG9yIFNwZWNpZmljIEFTQ1EiOwotCWVsc2UKLQkJKmFzY19kZXNjID0gIlJlc2VydmVkIEFTQy9BU0NRIHBhaXIiOwotfQotCi0vKgotICogR2l2ZW4gc2Vuc2UgYW5kIGRldmljZSB0eXBlIGluZm9ybWF0aW9uLCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGFjdGlvbi4KLSAqIElmIHdlIGRvIG5vdCB1bmRlcnN0YW5kIHRoZSBzcGVjaWZpYyBlcnJvciBhcyBpZGVudGlmaWVkIGJ5IHRoZSBBU0MvQVNDUQotICogcGFpciwgZmFsbCBiYWNrIG9uIHRoZSBtb3JlIGdlbmVyaWMgYWN0aW9ucyBkZXJpdmVkIGZyb20gdGhlIHNlbnNlIGtleS4KLSAqLwotYWljX3NlbnNlX2FjdGlvbgotYWljX3NlbnNlX2Vycm9yX2FjdGlvbihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhICpzZW5zZV9kYXRhLAotCQkgICAgICAgc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICppbnFfZGF0YSwgdWludDMyX3Qgc2Vuc2VfZmxhZ3MpCi17Ci0JY29uc3Qgc3RydWN0IGFzY190YWJsZV9lbnRyeSAqYXNjX2VudHJ5OwotCWNvbnN0IHN0cnVjdCBzZW5zZV9rZXlfdGFibGVfZW50cnkgKnNlbnNlX2VudHJ5OwotCWludCBlcnJvcl9jb2RlLCBzZW5zZV9rZXksIGFzYywgYXNjcTsKLQlhaWNfc2Vuc2VfYWN0aW9uIGFjdGlvbjsKLQotCXNjc2lfZXh0cmFjdF9zZW5zZShzZW5zZV9kYXRhLCAmZXJyb3JfY29kZSwgJnNlbnNlX2tleSwgJmFzYywgJmFzY3EpOwotCi0JaWYgKGVycm9yX2NvZGUgPT0gU1NEX0RFRkVSUkVEX0VSUk9SKSB7Ci0JCS8qCi0JCSAqIFhYWCBkdWZhdWx0QEZyZWVCU0Qub3JnCi0JCSAqIFRoaXMgZXJyb3IgZG9lc24ndCByZWxhdGUgdG8gdGhlIGNvbW1hbmQgYXNzb2NpYXRlZAotCQkgKiB3aXRoIHRoaXMgcmVxdWVzdCBzZW5zZS4gIEEgZGVmZXJyZWQgZXJyb3IgaXMgYW4gZXJyb3IKLQkJICogZm9yIGEgY29tbWFuZCB0aGF0IGhhcyBhbHJlYWR5IHJldHVybmVkIEdPT0Qgc3RhdHVzCi0JCSAqIChzZWUgU0NTSTIgOC4yLjE0LjIpLgotCQkgKgotCQkgKiBCeSBteSByZWFkaW5nIG9mIHRoYXQgc2VjdGlvbiwgaXQgbG9va3MgbGlrZSB0aGUgY3VycmVudAotCQkgKiBjb21tYW5kIGhhcyBiZWVuIGNhbmNlbGxlZCwgd2Ugc2hvdWxkIG5vdyBjbGVhbiB0aGluZ3MgdXAKLQkJICogKGhvcGVmdWxseSByZWNvdmVyaW5nIGFueSBsb3N0IGRhdGEpIGFuZCB0aGVuIHJldHJ5IHRoZQotCQkgKiBjdXJyZW50IGNvbW1hbmQuICBUaGVyZSBhcmUgdHdvIGVhc3kgY2hvaWNlcywgYm90aCB3cm9uZzoKLQkJICoKLQkJICogMS4gRHJvcCB0aHJvdWdoIChsaWtlIHdlIGhhZCBiZWVuIGRvaW5nKSwgdGh1cyB0cmVhdGluZwotCQkgKiAgICB0aGlzIGFzIGlmIHRoZSBlcnJvciB3ZXJlIGZvciB0aGUgY3VycmVudCBjb21tYW5kIGFuZAotCQkgKiAgICByZXR1cm4gYW5kIHN0b3AgdGhlIGN1cnJlbnQgY29tbWFuZC4KLQkJICogCi0JCSAqIDIuIElzc3VlIGEgcmV0cnkgKGxpa2UgSSBtYWRlIGl0IGRvKSB0aHVzIGhvcGVmdWxseQotCQkgKiAgICByZWNvdmVyaW5nIHRoZSBjdXJyZW50IHRyYW5zZmVyLCBhbmQgaWdub3JpbmcgdGhlCi0JCSAqICAgIGZhY3QgdGhhdCB3ZSd2ZSBkcm9wcGVkIGEgY29tbWFuZC4KLQkJICoKLQkJICogVGhlc2Ugc2hvdWxkIHByb2JhYmx5IGJlIGhhbmRsZWQgaW4gYSBkZXZpY2Ugc3BlY2lmaWMKLQkJICogc2Vuc2UgaGFuZGxlciBvciBwdW50ZWQgYmFjayB1cCB0byBhIHVzZXIgbW9kZSBkYWVtb24KLQkJICovCi0JCWFjdGlvbiA9IFNTX1JFVFJZfFNTUV9ERUNSRU1FTlRfQ09VTlR8U1NRX1BSSU5UX1NFTlNFOwotCX0gZWxzZSB7Ci0JCWZldGNodGFibGVlbnRyaWVzKHNlbnNlX2tleSwgYXNjLCBhc2NxLAotCQkJCSAgaW5xX2RhdGEsCi0JCQkJICAmc2Vuc2VfZW50cnksCi0JCQkJICAmYXNjX2VudHJ5KTsKLQotCQkvKgotCQkgKiBPdmVycmlkZSB0aGUgJ05vIGFkZGl0aW9uYWwgU2Vuc2UnIGVudHJ5ICgwLDApCi0JCSAqIHdpdGggdGhlIGVycm9yIGFjdGlvbiBvZiB0aGUgc2Vuc2Uga2V5LgotCQkgKi8KLQkJaWYgKGFzY19lbnRyeSAhPSBOVUxMCi0JCSAmJiAoYXNjICE9IDAgfHwgYXNjcSAhPSAwKSkKLQkJCWFjdGlvbiA9IGFzY19lbnRyeS0+YWN0aW9uOwotCQllbHNlCi0JCQlhY3Rpb24gPSBzZW5zZV9lbnRyeS0+YWN0aW9uOwotCi0JCWlmIChzZW5zZV9rZXkgPT0gU1NEX0tFWV9SRUNPVkVSRURfRVJST1IpIHsKLQkJCS8qCi0JCQkgKiBUaGUgYWN0aW9uIHN1Y2NlZWRlZCBidXQgdGhlIGRldmljZSB3YW50cwotCQkJICogdGhlIHVzZXIgdG8ga25vdyB0aGF0IHNvbWUgcmVjb3ZlcnkgYWN0aW9uCi0JCQkgKiB3YXMgcmVxdWlyZWQuCi0JCQkgKi8KLQkJCWFjdGlvbiAmPSB+KFNTX01BU0t8U1NRX01BU0t8U1NfRVJSTUFTSyk7Ci0JCQlhY3Rpb24gfD0gU1NfTk9QfFNTUV9QUklOVF9TRU5TRTsKLQkJfSBlbHNlIGlmIChzZW5zZV9rZXkgPT0gU1NEX0tFWV9JTExFR0FMX1JFUVVFU1QpIHsKLQkJCWlmICgoc2Vuc2VfZmxhZ3MgJiBTRl9RVUlFVF9JUikgIT0gMCkKLQkJCQlhY3Rpb24gJj0gflNTUV9QUklOVF9TRU5TRTsKLQkJfSBlbHNlIGlmIChzZW5zZV9rZXkgPT0gU1NEX0tFWV9VTklUX0FUVEVOVElPTikgewotCQkJaWYgKChzZW5zZV9mbGFncyAmIFNGX1JFVFJZX1VBKSAhPSAwCi0JCQkgJiYgKGFjdGlvbiAmIFNTX01BU0spID09IFNTX0ZBSUwpIHsKLQkJCQlhY3Rpb24gJj0gfihTU19NQVNLfFNTUV9NQVNLKTsKLQkJCQlhY3Rpb24gfD0gU1NfUkVUUll8U1NRX0RFQ1JFTUVOVF9DT1VOVHwKLQkJCQkJICBTU1FfUFJJTlRfU0VOU0U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoKHNlbnNlX2ZsYWdzICYgU0ZfUFJJTlRfQUxXQVlTKSAhPSAwKQotCQlhY3Rpb24gfD0gU1NRX1BSSU5UX1NFTlNFOwotCWVsc2UgaWYgKChzZW5zZV9mbGFncyAmIFNGX05PX1BSSU5UKSAhPSAwKQotCQlhY3Rpb24gJj0gflNTUV9QUklOVF9TRU5TRTsKLQotCXJldHVybiAoYWN0aW9uKTsKLX0KLQotLyogICAgICAKLSAqIFRyeSBtYWtlIGFzIGdvb2QgYSBtYXRjaCBhcyBwb3NzaWJsZSB3aXRoCi0gKiBhdmFpbGFibGUgc3ViIGRyaXZlcnMKLSAqLwotaW50Ci1haWNfaW5xdWlyeV9tYXRjaChjYWRkcl90IGlucWJ1ZmZlciwgY2FkZHJfdCB0YWJsZV9lbnRyeSkKLXsKLQlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3BhdHRlcm4gKmVudHJ5OwotCXN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqaW5xOwotIAotCWVudHJ5ID0gKHN0cnVjdCBzY3NpX2lucXVpcnlfcGF0dGVybiAqKXRhYmxlX2VudHJ5OwotCWlucSA9IChzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKilpbnFidWZmZXI7Ci0KLQlpZiAoKChTSURfVFlQRShpbnEpID09IGVudHJ5LT50eXBlKQotCSAgfHwgKGVudHJ5LT50eXBlID09IFRfQU5ZKSkKLQkgJiYgKFNJRF9JU19SRU1PVkFCTEUoaW5xKSA/IGVudHJ5LT5tZWRpYV90eXBlICYgU0lQX01FRElBX1JFTU9WQUJMRQotCQkJCSAgIDogZW50cnktPm1lZGlhX3R5cGUgJiBTSVBfTUVESUFfRklYRUQpCi0JICYmIChjYW1fc3RybWF0Y2goaW5xLT52ZW5kb3IsIGVudHJ5LT52ZW5kb3IsIHNpemVvZihpbnEtPnZlbmRvcikpID09IDApCi0JICYmIChjYW1fc3RybWF0Y2goaW5xLT5wcm9kdWN0LCBlbnRyeS0+cHJvZHVjdCwKLQkJCSAgc2l6ZW9mKGlucS0+cHJvZHVjdCkpID09IDApCi0JICYmIChjYW1fc3RybWF0Y2goaW5xLT5yZXZpc2lvbiwgZW50cnktPnJldmlzaW9uLAotCQkJICBzaXplb2YoaW5xLT5yZXZpc2lvbikpID09IDApKSB7Ci0JCXJldHVybiAoMCk7Ci0JfQotICAgICAgICByZXR1cm4gKC0xKTsKLX0KLQotLyoKLSAqIFRhYmxlIG9mIHN5bmNyYXRlcyB0aGF0IGRvbid0IGZvbGxvdyB0aGUgImRpdmlzaWJsZSBieSA0IgotICogcnVsZS4gVGhpcyB0YWJsZSB3aWxsIGJlIGV4cGFuZGVkIGluIGZ1dHVyZSBTQ1NJIHNwZWNzLgotICovCi1zdGF0aWMgc3RydWN0IHsKLQl1X2ludCBwZXJpb2RfZmFjdG9yOwotCXVfaW50IHBlcmlvZDsJLyogaW4gMTAwdGhzIG9mIG5zICovCi19IHNjc2lfc3luY3JhdGVzW10gPSB7Ci0JeyAweDA4LCA2MjUgfSwJLyogRkFTVC0xNjAgKi8KLQl7IDB4MDksIDEyNTAgfSwJLyogRkFTVC04MCAqLwotCXsgMHgwYSwgMjUwMCB9LAkvKiBGQVNULTQwIDQwTUh6ICovCi0JeyAweDBiLCAzMDMwIH0sCS8qIEZBU1QtNDAgMzNNSHogKi8KLQl7IDB4MGMsIDUwMDAgfQkvKiBGQVNULTIwICovCi19OwotCi0vKgotICogUmV0dXJuIHRoZSBmcmVxdWVuY3kgaW4ga0h6IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCi0gKiBzeW5jIHBlcmlvZCBmYWN0b3IuCi0gKi8KLXVfaW50Ci1haWNfY2FsY19zeW5jc3JhdGUodV9pbnQgcGVyaW9kX2ZhY3RvcikKLXsKLQlpbnQgaTsKLQlpbnQgbnVtX3N5bmNyYXRlczsKLQotCW51bV9zeW5jcmF0ZXMgPSBzaXplb2Yoc2NzaV9zeW5jcmF0ZXMpIC8gc2l6ZW9mKHNjc2lfc3luY3JhdGVzWzBdKTsKLQkvKiBTZWUgaWYgdGhlIHBlcmlvZCBpcyBpbiB0aGUgImV4Y2VwdGlvbiIgdGFibGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bmNyYXRlczsgaSsrKSB7Ci0KLQkJaWYgKHBlcmlvZF9mYWN0b3IgPT0gc2NzaV9zeW5jcmF0ZXNbaV0ucGVyaW9kX2ZhY3RvcikgewotCQkJLyogUGVyaW9kIGluIGtIeiAqLwotCQkJcmV0dXJuICgxMDAwMDAwMDAgLyBzY3NpX3N5bmNyYXRlc1tpXS5wZXJpb2QpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBXYXNuJ3QgaW4gdGhlIHRhYmxlLCBzbyB1c2UgdGhlIHN0YW5kYXJkCi0JICogNCB0aW1lcyBjb252ZXJzaW9uLgotCSAqLwotCXJldHVybiAoMTAwMDAwMDAgLyAocGVyaW9kX2ZhY3RvciAqIDQgKiAxMCkpOwotfQotCi0vKgotICogUmV0dXJuIHNwZWVkIGluIEtCL3MuCi0gKi8KLXVfaW50Ci1haWNfY2FsY19zcGVlZCh1X2ludCB3aWR0aCwgdV9pbnQgcGVyaW9kLCB1X2ludCBvZmZzZXQsIHVfaW50IG1pbl9yYXRlKQotewotCXVfaW50IGZyZXE7Ci0KLQlpZiAob2Zmc2V0ICE9IDAgJiYgcGVyaW9kIDwgbWluX3JhdGUpCi0JCWZyZXEgID0gYWljX2NhbGNfc3luY3NyYXRlKHBlcmlvZCk7Ci0JZWxzZQotCQkvKiBSb3VnaGx5IDMuM01CL3MgZm9yIGFzeW5jICovCi0JCWZyZXEgID0gMzMwMDsKLQlmcmVxIDw8PSB3aWR0aDsKLQlyZXR1cm4gKGZyZXEpOwotfQotCi11aW50MzJfdAotYWljX2Vycm9yX2FjdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqaW5xX2RhdGEsCi0JCSBjYW1fc3RhdHVzIHN0YXR1cywgdV9pbnQgc2NzaV9zdGF0dXMpCi17Ci0JYWljX3NlbnNlX2FjdGlvbiAgZXJyX2FjdGlvbjsKLQlpbnQJCSAgc2Vuc2U7Ci0KLQlzZW5zZSAgPSAoY21kLT5yZXN1bHQgPj4gMjQpID09IERSSVZFUl9TRU5TRTsKLQotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JY2FzZSBDQU1fUkVRX0NNUDoKLQkJZXJyX2FjdGlvbiA9IFNTX05PUDsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1fQVVUT1NFTlNFX0ZBSUw6Ci0JY2FzZSBDQU1fU0NTSV9TVEFUVVNfRVJST1I6Ci0KLQkJc3dpdGNoIChzY3NpX3N0YXR1cykgewotCQljYXNlIFNDU0lfU1RBVFVTX09LOgotCQljYXNlIFNDU0lfU1RBVFVTX0NPTkRfTUVUOgotCQljYXNlIFNDU0lfU1RBVFVTX0lOVEVSTUVEOgotCQljYXNlIFNDU0lfU1RBVFVTX0lOVEVSTUVEX0NPTkRfTUVUOgotCQkJZXJyX2FjdGlvbiA9IFNTX05PUDsKLQkJCWJyZWFrOwotCQljYXNlIFNDU0lfU1RBVFVTX0NNRF9URVJNSU5BVEVEOgotCQljYXNlIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkQ6Ci0JCQlpZiAoc2Vuc2UgIT0gMCkgewotCQkJCXN0cnVjdCBzY3NpX3NlbnNlX2RhdGEgKnNlbnNlOwotCi0JCQkJc2Vuc2UgPSAoc3RydWN0IHNjc2lfc2Vuc2VfZGF0YSAqKQotCQkJCSAgICAmY21kLT5zZW5zZV9idWZmZXI7Ci0JCQkJZXJyX2FjdGlvbiA9Ci0JCQkJICAgIGFpY19zZW5zZV9lcnJvcl9hY3Rpb24oc2Vuc2UsIGlucV9kYXRhLCAwKTsKLQotCQkJfSBlbHNlIHsKLQkJCQllcnJfYWN0aW9uID0gU1NfUkVUUll8U1NRX0ZBTExCQUNLCi0JCQkJCSAgIHwgU1NRX0RFQ1JFTUVOVF9DT1VOVHxFSU87Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTQ1NJX1NUQVRVU19RVUVVRV9GVUxMOgotCQljYXNlIFNDU0lfU1RBVFVTX0JVU1k6Ci0JCQllcnJfYWN0aW9uID0gU1NfUkVUUll8U1NRX0RFTEFZfFNTUV9NQU5ZCi0JCQkJICAgfCBTU1FfREVDUkVNRU5UX0NPVU5UfEVCVVNZOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0NTSV9TVEFUVVNfUkVTRVJWX0NPTkZMSUNUOgotCQlkZWZhdWx0OgotCQkJZXJyX2FjdGlvbiA9IFNTX0ZBSUx8RUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIENBTV9DTURfVElNRU9VVDoKLQljYXNlIENBTV9SRVFfQ01QX0VSUjoKLQljYXNlIENBTV9VTkVYUF9CVVNGUkVFOgotCWNhc2UgQ0FNX1VOQ09SX1BBUklUWToKLQljYXNlIENBTV9EQVRBX1JVTl9FUlI6Ci0JCWVycl9hY3Rpb24gPSBTU19SRVRSWXxTU1FfRkFMTEJBQ0t8RUlPOwotCQlicmVhazsKLQljYXNlIENBTV9VQV9BQk9SVDoKLQljYXNlIENBTV9VQV9URVJNSU86Ci0JY2FzZSBDQU1fTVNHX1JFSkVDVF9SRUM6Ci0JY2FzZSBDQU1fU0VMX1RJTUVPVVQ6Ci0JCWVycl9hY3Rpb24gPSBTU19GQUlMfEVJTzsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1fUkVRX0lOVkFMSUQ6Ci0JY2FzZSBDQU1fUEFUSF9JTlZBTElEOgotCWNhc2UgQ0FNX0RFVl9OT1RfVEhFUkU6Ci0JY2FzZSBDQU1fTk9fSEJBOgotCWNhc2UgQ0FNX1BST1ZJREVfRkFJTDoKLQljYXNlIENBTV9SRVFfVE9PX0JJRzoJCQotCWNhc2UgQ0FNX1JFU1JDX1VOQVZBSUw6Ci0JY2FzZSBDQU1fQlVTWToKLQlkZWZhdWx0OgotCQkvKiBwYW5pYz8/ICBUaGVzZSBzaG91bGQgbmV2ZXIgb2NjdXIgaW4gb3VyIGFwcGxpY2F0aW9uLiAqLwotCQllcnJfYWN0aW9uID0gU1NfRkFJTHxFSU87Ci0JCWJyZWFrOwotCWNhc2UgQ0FNX1NDU0lfQlVTX1JFU0VUOgotCWNhc2UgQ0FNX0JEUl9TRU5UOgkJCi0JY2FzZSBDQU1fUkVRVUVVRV9SRVE6Ci0JCS8qIFVuY29uZGl0aW9uYWwgcmVxdWV1ZSAqLwotCQllcnJfYWN0aW9uID0gU1NfUkVUUlk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAoZXJyX2FjdGlvbik7Ci19Ci0KLWNoYXIgKgotYWljX3BhcnNlX2JyYWNlX29wdGlvbihjaGFyICpvcHRfbmFtZSwgY2hhciAqb3B0X2FyZywgY2hhciAqZW5kLCBpbnQgZGVwdGgsCi0JCSAgICAgICBhaWNfb3B0aW9uX2NhbGxiYWNrX3QgKmNhbGxiYWNrLCB1X2xvbmcgY2FsbGJhY2tfYXJnKQotewotCWNoYXIJKnRva19lbmQ7Ci0JY2hhcgkqdG9rX2VuZDI7Ci0JaW50ICAgICAgaTsKLQlpbnQgICAgICBpbnN0YW5jZTsKLQlpbnQJIHRhcmc7Ci0JaW50CSBkb25lOwotCWNoYXIJIHRva19saXN0W10gPSB7Jy4nLCAnLCcsICd7JywgJ30nLCAnXDAnfTsKIAotCS8qIEFsbCBvcHRpb25zIHVzZSBhICc6JyBuYW1lL2FyZyBzZXBhcmF0b3IgKi8KLQlpZiAoKm9wdF9hcmcgIT0gJzonKQotCQlyZXR1cm4gKG9wdF9hcmcpOwotCW9wdF9hcmcrKzsKLQlpbnN0YW5jZSA9IC0xOwotCXRhcmcgPSAtMTsKLQlkb25lID0gRkFMU0U7Ci0JLyoKLQkgKiBSZXN0b3JlIHNlcGFyYXRvciB0aGF0IG1heSBiZSBpbgotCSAqIHRoZSBtaWRkbGUgb2Ygb3VyIG9wdGlvbiBhcmd1bWVudC4KLQkgKi8KLQl0b2tfZW5kID0gc3RyY2hyKG9wdF9hcmcsICdcMCcpOwotCWlmICh0b2tfZW5kIDwgZW5kKQotCQkqdG9rX2VuZCA9ICcsJzsKLQl3aGlsZSAoIWRvbmUpIHsKLQkJc3dpdGNoICgqb3B0X2FyZykgewotCQljYXNlICd7JzoKLQkJCWlmIChpbnN0YW5jZSA9PSAtMSkgewotCQkJCWluc3RhbmNlID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGRlcHRoID4gMSkgewotCQkJCQlpZiAodGFyZyA9PSAtMSkKLQkJCQkJCXRhcmcgPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByaW50ZigiTWFsZm9ybWVkIE9wdGlvbiAlc1xuIiwKLQkJCQkJICAgICAgIG9wdF9uYW1lKTsKLQkJCQkJZG9uZSA9IFRSVUU7Ci0JCQkJfQotCQkJfQotCQkJb3B0X2FyZysrOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ30nOgotCQkJaWYgKHRhcmcgIT0gLTEpCi0JCQkJdGFyZyA9IC0xOwotCQkJZWxzZSBpZiAoaW5zdGFuY2UgIT0gLTEpCi0JCQkJaW5zdGFuY2UgPSAtMTsKLQkJCW9wdF9hcmcrKzsKLQkJCWJyZWFrOwotCQljYXNlICcsJzoKLQkJY2FzZSAnLic6Ci0JCQlpZiAoaW5zdGFuY2UgPT0gLTEpCi0JCQkJZG9uZSA9IFRSVUU7Ci0JCQllbHNlIGlmICh0YXJnID49IDApCi0JCQkJdGFyZysrOwotCQkJZWxzZSBpZiAoaW5zdGFuY2UgPj0gMCkKLQkJCQlpbnN0YW5jZSsrOwotCQkJb3B0X2FyZysrOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1wwJzoKLQkJCWRvbmUgPSBUUlVFOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl0b2tfZW5kID0gZW5kOwotCQkJZm9yIChpID0gMDsgdG9rX2xpc3RbaV07IGkrKykgewotCQkJCXRva19lbmQyID0gc3RyY2hyKG9wdF9hcmcsIHRva19saXN0W2ldKTsKLQkJCQlpZiAoKHRva19lbmQyKSAmJiAodG9rX2VuZDIgPCB0b2tfZW5kKSkKLQkJCQkJdG9rX2VuZCA9IHRva19lbmQyOwotCQkJfQotCQkJY2FsbGJhY2soY2FsbGJhY2tfYXJnLCBpbnN0YW5jZSwgdGFyZywKLQkJCQkgc2ltcGxlX3N0cnRvbChvcHRfYXJnLCBOVUxMLCAwKSk7Ci0JCQlvcHRfYXJnID0gdG9rX2VuZDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiAob3B0X2FyZyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNsaWIuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5oCmluZGV4IGJmZTZmOTUuLjNiZmJmMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5oCkBAIC01NywxMjEgKzU3LDYgQEAKICNpZm5kZWYJX0FJQ0xJQl9ICiAjZGVmaW5lIF9BSUNMSUJfSAogCi0vKgotICogTGludXggSW50ZXJydXB0IFN1cHBvcnQuCi0gKi8KLSNpZm5kZWYgSVJRX1JFVFZBTAotdHlwZWRlZiB2b2lkIGlycXJldHVybl90OwotI2RlZmluZQlJUlFfUkVUVkFMKHgpCi0jZW5kaWYKLQotLyoKLSAqIFNDU0kgY29tbWFuZCBmb3JtYXQKLSAqLwotCi0vKgotICogRGVmaW5lIGRvbWUgYml0cyB0aGF0IGFyZSBpbiBBTEwgKG9yIGEgbG90IG9mKSBzY3NpIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgU0NTSV9DVExfTElOSwkJMHgwMQotI2RlZmluZSBTQ1NJX0NUTF9GTEFHCQkweDAyCi0jZGVmaW5lIFNDU0lfQ1RMX1ZFTkRPUgkJMHhDMAotI2RlZmluZQlTQ1NJX0NNRF9MVU4JCTB4QTAJLyogdGhlc2UgdHdvIHNob3VsZCBub3QgYmUgbmVlZGVkICovCi0jZGVmaW5lCVNDU0lfQ01EX0xVTl9TSElGVAk1CS8qIExVTiBpbiB0aGUgY21kIGlzIG5vIGxvbmdlciBTQ1NJICovCi0KLSNkZWZpbmUgU0NTSV9NQVhfQ0RCTEVOCQkxNgkvKiAKLQkJCQkJICogMTYgYnl0ZSBjb21tYW5kcyBhcmUgaW4gdGhlIAotCQkJCQkgKiBTQ1NJLTMgc3BlYyAKLQkJCQkJICovCi0vKiA2Ynl0ZSBDREJzIHNwZWNpYWwgY2FzZSAwIGxlbmd0aCB0byBiZSAyNTYgKi8KLSNkZWZpbmUgU0NTSV9DREI2X0xFTihsZW4pCSgobGVuKSA9PSAwID8gMjU2IDogbGVuKQotCi0vKgotICogVGhpcyB0eXBlIGRlZmluZXMgYWN0aW9ucyB0byBiZSB0YWtlbiB3aGVuIGEgcGFydGljdWxhciBzZW5zZSBjb2RlIGlzCi0gKiByZWNlaXZlZC4gIFJpZ2h0IG5vdywgdGhlc2UgZmxhZ3MgYXJlIG9ubHkgZGVmaW5lZCB0byB0YWtlIHVwIDE2IGJpdHMsCi0gKiBidXQgY2FuIGJlIGV4cGFuZGVkIGluIHRoZSBmdXR1cmUgaWYgbmVjZXNzYXJ5LgotICovCi10eXBlZGVmIGVudW0gewotCVNTX05PUAkJPSAweDAwMDAwMCwgLyogRG8gbm90aGluZyAqLwotCVNTX1JFVFJZCT0gMHgwMTAwMDAsIC8qIFJldHJ5IHRoZSBjb21tYW5kICovCi0JU1NfRkFJTAkJPSAweDAyMDAwMCwgLyogQmFpbCBvdXQgKi8KLQlTU19TVEFSVAk9IDB4MDMwMDAwLCAvKiBTZW5kIGEgU3RhcnQgVW5pdCBjb21tYW5kIHRvIHRoZSBkZXZpY2UsCi0JCQkJICAgICAqIHRoZW4gcmV0cnkgdGhlIG9yaWdpbmFsIGNvbW1hbmQuCi0JCQkJICAgICAqLwotCVNTX1RVUgkJPSAweDA0MDAwMCwgLyogU2VuZCBhIFRlc3QgVW5pdCBSZWFkeSBjb21tYW5kIHRvIHRoZQotCQkJCSAgICAgKiBkZXZpY2UsIHRoZW4gcmV0cnkgdGhlIG9yaWdpbmFsIGNvbW1hbmQuCi0JCQkJICAgICAqLwotCVNTX1JFUVNFTlNFCT0gMHgwNTAwMDAsIC8qIFNlbmQgYSBSZXF1ZXN0U2Vuc2UgY29tbWFuZCB0byB0aGUKLQkJCQkgICAgICogZGV2aWNlLCB0aGVuIHJldHJ5IHRoZSBvcmlnaW5hbCBjb21tYW5kLgotCQkJCSAgICAgKi8KLQlTU19JTlFfUkVGUkVTSAk9IDB4MDYwMDAwLAotCVNTX01BU0sJCT0gMHhmZjAwMDAKLX0gYWljX3NlbnNlX2FjdGlvbjsKLQotdHlwZWRlZiBlbnVtIHsKLQlTU1FfTk9ORQkJPSAweDAwMDAsCi0JU1NRX0RFQ1JFTUVOVF9DT1VOVAk9IDB4MDEwMCwgIC8qIERlY3JlbWVudCB0aGUgcmV0cnkgY291bnQgKi8KLQlTU1FfTUFOWQkJPSAweDAyMDAsICAvKiBzZW5kIGxvdHMgb2YgcmVjb3ZlcnkgY29tbWFuZHMgKi8KLQlTU1FfUkFOR0UJCT0gMHgwNDAwLCAgLyoKLQkJCQkJICAgICogVGhpcyB0YWJsZSBlbnRyeSByZXByZXNlbnRzIHRoZQotCQkJCQkgICAgKiBlbmQgb2YgYSByYW5nZSBvZiBBU0NRcyB0aGF0Ci0JCQkJCSAgICAqIGhhdmUgaWRlbnRpY2FsIGVycm9yIGFjdGlvbnMKLQkJCQkJICAgICogYW5kIHRleHQuCi0JCQkJCSAgICAqLwotCVNTUV9QUklOVF9TRU5TRQkJPSAweDA4MDAsCi0JU1NRX0RFTEFZCQk9IDB4MTAwMCwgIC8qIERlbGF5IGJlZm9yZSByZXRyeS4gKi8KLQlTU1FfREVMQVlfUkFORE9NCT0gMHgyMDAwLCAgLyogUmFuZG9taXplZCBkZWxheSBiZWZvcmUgcmV0cnkuICovCi0JU1NRX0ZBTExCQUNLCQk9IDB4NDAwMCwgIC8qIERvIGEgc3BlZWQgZmFsbGJhY2sgdG8gcmVjb3ZlciAqLwotCVNTUV9NQVNLCQk9IDB4ZmYwMAotfSBhaWNfc2Vuc2VfYWN0aW9uX3F1YWxpZmllcjsKLQotLyogTWFzayBmb3IgZXJyb3Igc3RhdHVzIHZhbHVlcyAqLwotI2RlZmluZSBTU19FUlJNQVNLCTB4ZmYKLQotLyogVGhlIGRlZmF1bHQsIHJldHlhYmxlLCBlcnJvciBhY3Rpb24gKi8KLSNkZWZpbmUgU1NfUkRFRgkJU1NfUkVUUll8U1NRX0RFQ1JFTUVOVF9DT1VOVHxTU1FfUFJJTlRfU0VOU0V8RUlPCi0KLS8qIFRoZSByZXR5YWJsZSwgZXJyb3IgYWN0aW9uLCB3aXRoIHRhYmxlIHNwZWNpZmllZCBlcnJvciBjb2RlICovCi0jZGVmaW5lIFNTX1JFVAkJU1NfUkVUUll8U1NRX0RFQ1JFTUVOVF9DT1VOVHxTU1FfUFJJTlRfU0VOU0UKLQotLyogRmF0YWwgZXJyb3IgYWN0aW9uLCB3aXRoIHRhYmxlIHNwZWNpZmllZCBlcnJvciBjb2RlICovCi0jZGVmaW5lIFNTX0ZBVEFMCVNTX0ZBSUx8U1NRX1BSSU5UX1NFTlNFCi0KLXN0cnVjdCBzY3NpX2dlbmVyaWMKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGVzWzExXTsKLX07Ci0KLXN0cnVjdCBzY3NpX3JlcXVlc3Rfc2Vuc2UKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwotCXVpbnQ4X3QgdW51c2VkWzJdOwotCXVpbnQ4X3QgbGVuZ3RoOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX3Rlc3RfdW5pdF9yZWFkeQotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0JdWludDhfdCB1bnVzZWRbM107Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfc2VuZF9kaWFnCi17Ci0JdWludDhfdCBvcGNvZGU7Ci0JdWludDhfdCBieXRlMjsKLSNkZWZpbmUJU1NEX1VPTAkJMHgwMQotI2RlZmluZQlTU0RfRE9MCQkweDAyCi0jZGVmaW5lCVNTRF9TRUxGVEVTVAkweDA0Ci0jZGVmaW5lCVNTRF9QRgkJMHgxMAotCXVpbnQ4X3QgdW51c2VkWzFdOwotCXVpbnQ4X3QgcGFyYW1sZW5bMl07Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQogc3RydWN0IHNjc2lfc2Vuc2UKIHsKIAl1aW50OF90IG9wY29kZTsKQEAgLTE4MSw1MzcgKzY2LDEyIEBACiAJdWludDhfdCBjb250cm9sOwogfTsKIAotc3RydWN0IHNjc2lfaW5xdWlyeQotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0jZGVmaW5lCVNJX0VWUEQgMHgwMQotCXVpbnQ4X3QgcGFnZV9jb2RlOwotCXVpbnQ4X3QgcmVzZXJ2ZWQ7Ci0JdWludDhfdCBsZW5ndGg7Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfbW9kZV9zZW5zZV82Ci17Ci0JdWludDhfdCBvcGNvZGU7Ci0JdWludDhfdCBieXRlMjsKLSNkZWZpbmUJU01TX0RCRAkJCQkweDA4Ci0JdWludDhfdCBwYWdlOwotI2RlZmluZQlTTVNfUEFHRV9DT0RFIAkJCTB4M0YKLSNkZWZpbmUgU01TX1ZFTkRPUl9TUEVDSUZJQ19QQUdFCTB4MDAKLSNkZWZpbmUgU01TX0RJU0NPTk5FQ1RfUkVDT05ORUNUX1BBR0UJMHgwMgotI2RlZmluZSBTTVNfUEVSSVBIRVJBTF9ERVZJQ0VfUEFHRQkweDA5Ci0jZGVmaW5lIFNNU19DT05UUk9MX01PREVfUEFHRQkJMHgwQQotI2RlZmluZSBTTVNfQUxMX1BBR0VTX1BBR0UJCTB4M0YKLSNkZWZpbmUJU01TX1BBR0VfQ1RSTF9NQVNLCQkweEMwCi0jZGVmaW5lCVNNU19QQUdFX0NUUkxfQ1VSUkVOVCAJCTB4MDAKLSNkZWZpbmUJU01TX1BBR0VfQ1RSTF9DSEFOR0VBQkxFIAkweDQwCi0jZGVmaW5lCVNNU19QQUdFX0NUUkxfREVGQVVMVCAJCTB4ODAKLSNkZWZpbmUJU01TX1BBR0VfQ1RSTF9TQVZFRCAJCTB4QzAKLQl1aW50OF90IHVudXNlZDsKLQl1aW50OF90IGxlbmd0aDsKLQl1aW50OF90IGNvbnRyb2w7Ci19OwotCi1zdHJ1Y3Qgc2NzaV9tb2RlX3NlbnNlXzEwCi17Ci0JdWludDhfdCBvcGNvZGU7Ci0JdWludDhfdCBieXRlMjsJCS8qIHNhbWUgYml0cyBhcyBzbWFsbCB2ZXJzaW9uICovCi0JdWludDhfdCBwYWdlOyAJCS8qIHNhbWUgYml0cyBhcyBzbWFsbCB2ZXJzaW9uICovCi0JdWludDhfdCB1bnVzZWRbNF07Ci0JdWludDhfdCBsZW5ndGhbMl07Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfbW9kZV9zZWxlY3RfNgotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0jZGVmaW5lCVNNU19TUAkweDAxCi0jZGVmaW5lCVNNU19QRgkweDEwCi0JdWludDhfdCB1bnVzZWRbMl07Ci0JdWludDhfdCBsZW5ndGg7Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfbW9kZV9zZWxlY3RfMTAKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwkJLyogc2FtZSBiaXRzIGFzIHNtYWxsIHZlcnNpb24gKi8KLQl1aW50OF90IHVudXNlZFs1XTsKLQl1aW50OF90IGxlbmd0aFsyXTsKLQl1aW50OF90IGNvbnRyb2w7Ci19OwotCi0vKgotICogV2hlbiBzZW5kaW5nIGEgbW9kZSBzZWxlY3QgdG8gYSB0YXBlIGRyaXZlLCB0aGUgbWVkaXVtIHR5cGUgbXVzdCBiZSAwLgotICovCi1zdHJ1Y3Qgc2NzaV9tb2RlX2hkcl82Ci17Ci0JdWludDhfdCBkYXRhbGVuOwotCXVpbnQ4X3QgbWVkaXVtX3R5cGU7Ci0JdWludDhfdCBkZXZfc3BlY2lmaWM7Ci0JdWludDhfdCBibG9ja19kZXNjcl9sZW47Ci19OwotCi1zdHJ1Y3Qgc2NzaV9tb2RlX2hkcl8xMAotewotCXVpbnQ4X3QgZGF0YWxlblsyXTsKLQl1aW50OF90IG1lZGl1bV90eXBlOwotCXVpbnQ4X3QgZGV2X3NwZWNpZmljOwotCXVpbnQ4X3QgcmVzZXJ2ZWRbMl07Ci0JdWludDhfdCBibG9ja19kZXNjcl9sZW5bMl07Ci19OwotCi1zdHJ1Y3Qgc2NzaV9tb2RlX2Jsb2NrX2Rlc2NyCi17Ci0JdWludDhfdCBkZW5zaXR5X2NvZGU7Ci0JdWludDhfdCBudW1fYmxvY2tzWzNdOwotCXVpbnQ4X3QgcmVzZXJ2ZWQ7Ci0JdWludDhfdCBibG9ja19sZW5bM107Ci19OwotCi1zdHJ1Y3Qgc2NzaV9sb2dfc2Vuc2UKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwotI2RlZmluZQlTTFNfU1AJCQkJMHgwMQotI2RlZmluZQlTTFNfUFBDCQkJCTB4MDIKLQl1aW50OF90IHBhZ2U7Ci0jZGVmaW5lCVNMU19QQUdFX0NPREUgCQkJMHgzRgotI2RlZmluZQlTTFNfQUxMX1BBR0VTX1BBR0UJCTB4MDAKLSNkZWZpbmUJU0xTX09WRVJSVU5fUEFHRQkJMHgwMQotI2RlZmluZQlTTFNfRVJST1JfV1JJVEVfUEFHRQkJMHgwMgotI2RlZmluZQlTTFNfRVJST1JfUkVBRF9QQUdFCQkweDAzCi0jZGVmaW5lCVNMU19FUlJPUl9SRUFEUkVWRVJTRV9QQUdFCTB4MDQKLSNkZWZpbmUJU0xTX0VSUk9SX1ZFUklGWV9QQUdFCQkweDA1Ci0jZGVmaW5lCVNMU19FUlJPUl9OT05NRURJVU1fUEFHRQkweDA2Ci0jZGVmaW5lCVNMU19FUlJPUl9MQVNUTl9QQUdFCQkweDA3Ci0jZGVmaW5lCVNMU19QQUdFX0NUUkxfTUFTSwkJMHhDMAotI2RlZmluZQlTTFNfUEFHRV9DVFJMX1RIUkVTSE9MRAkJMHgwMAotI2RlZmluZQlTTFNfUEFHRV9DVFJMX0NVTVVMQVRJVkUJMHg0MAotI2RlZmluZQlTTFNfUEFHRV9DVFJMX1RIUkVTSF9ERUZBVUxUCTB4ODAKLSNkZWZpbmUJU0xTX1BBR0VfQ1RSTF9DVU1VTF9ERUZBVUxUCTB4QzAKLQl1aW50OF90IHJlc2VydmVkWzJdOwotCXVpbnQ4X3QgcGFyYW1wdHJbMl07Ci0JdWludDhfdCBsZW5ndGhbMl07Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfbG9nX3NlbGVjdAotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0vKglTTFNfU1AJCQkJMHgwMSAqLwotI2RlZmluZQlTTFNfUENSCQkJCTB4MDIKLQl1aW50OF90IHBhZ2U7Ci0vKglTTFNfUEFHRV9DVFJMX01BU0sJCTB4QzAgKi8KLS8qCVNMU19QQUdFX0NUUkxfVEhSRVNIT0xECQkweDAwICovCi0vKglTTFNfUEFHRV9DVFJMX0NVTVVMQVRJVkUJMHg0MCAqLwotLyoJU0xTX1BBR0VfQ1RSTF9USFJFU0hfREVGQVVMVAkweDgwICovCi0vKglTTFNfUEFHRV9DVFJMX0NVTVVMX0RFRkFVTFQJMHhDMCAqLwotCXVpbnQ4X3QgcmVzZXJ2ZWRbNF07Ci0JdWludDhfdCBsZW5ndGhbMl07Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfbG9nX2hlYWRlcgotewotCXVpbnQ4X3QgcGFnZTsKLQl1aW50OF90IHJlc2VydmVkOwotCXVpbnQ4X3QgZGF0YWxlblsyXTsKLX07Ci0KLXN0cnVjdCBzY3NpX2xvZ19wYXJhbV9oZWFkZXIgewotCXVpbnQ4X3QgcGFyYW1fY29kZVsyXTsKLQl1aW50OF90IHBhcmFtX2NvbnRyb2w7Ci0jZGVmaW5lCVNMUF9MUAkJCQkweDAxCi0jZGVmaW5lCVNMUF9MQklOCQkJMHgwMgotI2RlZmluZQlTTFBfVE1DX01BU0sJCQkweDBDCi0jZGVmaW5lCVNMUF9UTUNfQUxXQVlTCQkJMHgwMAotI2RlZmluZQlTTFBfVE1DX0VRVUFMCQkJMHgwNAotI2RlZmluZQlTTFBfVE1DX05PVEVRVUFMCQkweDA4Ci0jZGVmaW5lCVNMUF9UTUNfR1JFQVRFUgkJCTB4MEMKLSNkZWZpbmUJU0xQX0VUQwkJCQkweDEwCi0jZGVmaW5lCVNMUF9UU0QJCQkJMHgyMAotI2RlZmluZQlTTFBfRFMJCQkJMHg0MAotI2RlZmluZQlTTFBfRFUJCQkJMHg4MAotCXVpbnQ4X3QgcGFyYW1fbGVuOwotfTsKLQotc3RydWN0IHNjc2lfY29udHJvbF9wYWdlIHsKLQl1aW50OF90IHBhZ2VfY29kZTsKLQl1aW50OF90IHBhZ2VfbGVuZ3RoOwotCXVpbnQ4X3QgcmxlYzsKLSNkZWZpbmUgU0NCX1JMRUMJCQkweDAxCS8qUmVwb3J0IExvZyBFeGNlcHRpb24gQ29uZCovCi0JdWludDhfdCBxdWV1ZV9mbGFnczsKLSNkZWZpbmUgU0NQX1FVRVVFX0FMR19NQVNLCQkweEYwCi0jZGVmaW5lIFNDUF9RVUVVRV9BTEdfUkVTVFJJQ1RFRAkweDAwCi0jZGVmaW5lIFNDUF9RVUVVRV9BTEdfVU5SRVNUUklDVEVECTB4MTAKLSNkZWZpbmUgU0NQX1FVRVVFX0VSUgkJCTB4MDIJLypRdWV1ZWQgSS9PIGFib3J0ZWQgZm9yIENBQ3MqLwotI2RlZmluZSBTQ1BfUVVFVUVfRFFVRQkJCTB4MDEJLypRdWV1ZWQgSS9PIGRpc2FibGVkKi8KLQl1aW50OF90IGVjYV9hbmRfYWVuOwotI2RlZmluZSBTQ1BfRUVDQQkJCTB4ODAJLypFbmFibGUgRXh0ZW5kZWQgQ0EqLwotI2RlZmluZSBTQ1BfUkFFTlAJCQkweDA0CS8qUmVhZHkgQUVOIFBlcm1pc3Npb24qLwotI2RlZmluZSBTQ1BfVUFBRU5QCQkJMHgwMgkvKlVBIEFFTiBQZXJtaXNzaW9uKi8KLSNkZWZpbmUgU0NQX0VBRU5QCQkJMHgwMQkvKkVycm9yIEFFTiBQZXJtaXNzaW9uKi8KLQl1aW50OF90IHJlc2VydmVkOwotCXVpbnQ4X3QgYWVuX2hvbGRvZmZfcGVyaW9kWzJdOwotfTsKLQotc3RydWN0IHNjc2lfcmVzZXJ2ZQotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0JdWludDhfdCB1bnVzZWRbMl07Ci0JdWludDhfdCBsZW5ndGg7Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfcmVsZWFzZQotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0JdWludDhfdCB1bnVzZWRbMl07Ci0JdWludDhfdCBsZW5ndGg7Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfcHJldmVudAotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0JdWludDhfdCB1bnVzZWRbMl07Ci0JdWludDhfdCBob3c7Ci0JdWludDhfdCBjb250cm9sOwotfTsKLSNkZWZpbmUJUFJfUFJFVkVOVCAweDAxCi0jZGVmaW5lIFBSX0FMTE9XICAgMHgwMAotCi1zdHJ1Y3Qgc2NzaV9zeW5jX2NhY2hlCi17Ci0JdWludDhfdCBvcGNvZGU7Ci0JdWludDhfdCBieXRlMjsKLQl1aW50OF90IGJlZ2luX2xiYVs0XTsKLQl1aW50OF90IHJlc2VydmVkOwotCXVpbnQ4X3QgbGJfY291bnRbMl07Ci0JdWludDhfdCBjb250cm9sOwkKLX07Ci0KLQotc3RydWN0IHNjc2lfY2hhbmdlZGVmCi17Ci0JdWludDhfdCBvcGNvZGU7Ci0JdWludDhfdCBieXRlMjsKLQl1aW50OF90IHVudXNlZDE7Ci0JdWludDhfdCBob3c7Ci0JdWludDhfdCB1bnVzZWRbNF07Ci0JdWludDhfdCBkYXRhbGVuOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX3JlYWRfYnVmZmVyCi17Ci0JdWludDhfdCBvcGNvZGU7Ci0JdWludDhfdCBieXRlMjsKLSNkZWZpbmUJUldCX01PREUJCTB4MDcKLSNkZWZpbmUJUldCX01PREVfSERSX0RBVEEJMHgwMAotI2RlZmluZQlSV0JfTU9ERV9EQVRBCQkweDAyCi0jZGVmaW5lCVJXQl9NT0RFX0RPV05MT0FECTB4MDQKLSNkZWZpbmUJUldCX01PREVfRE9XTkxPQURfU0FWRQkweDA1Ci0gICAgICAgIHVpbnQ4X3QgYnVmZmVyX2lkOwotICAgICAgICB1aW50OF90IG9mZnNldFszXTsKLSAgICAgICAgdWludDhfdCBsZW5ndGhbM107Ci0gICAgICAgIHVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX3dyaXRlX2J1ZmZlcgotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0JdWludDhfdCBidWZmZXJfaWQ7Ci0JdWludDhfdCBvZmZzZXRbM107Ci0JdWludDhfdCBsZW5ndGhbM107Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfcndfNgotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYWRkclszXTsKLS8qIG9ubHkgNSBiaXRzIGFyZSB2YWxpZCBpbiB0aGUgTVNCIGFkZHJlc3MgYnl0ZSAqLwotI2RlZmluZQlTUldfVE9QQUREUgkweDFGCi0JdWludDhfdCBsZW5ndGg7Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfcndfMTAKLXsKLQl1aW50OF90IG9wY29kZTsKLSNkZWZpbmUJU1JXMTBfUkVMQUREUgkweDAxCi0jZGVmaW5lIFNSVzEwX0ZVQQkweDA4Ci0jZGVmaW5lCVNSVzEwX0RQTwkweDEwCi0JdWludDhfdCBieXRlMjsKLQl1aW50OF90IGFkZHJbNF07Ci0JdWludDhfdCByZXNlcnZlZDsKLQl1aW50OF90IGxlbmd0aFsyXTsKLQl1aW50OF90IGNvbnRyb2w7Ci19OwotCi1zdHJ1Y3Qgc2NzaV9yd18xMgotewotCXVpbnQ4X3Qgb3Bjb2RlOwotI2RlZmluZQlTUlcxMl9SRUxBRERSCTB4MDEKLSNkZWZpbmUgU1JXMTJfRlVBCTB4MDgKLSNkZWZpbmUJU1JXMTJfRFBPCTB4MTAKLQl1aW50OF90IGJ5dGUyOwotCXVpbnQ4X3QgYWRkcls0XTsKLQl1aW50OF90IGxlbmd0aFs0XTsKLQl1aW50OF90IHJlc2VydmVkOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX3N0YXJ0X3N0b3BfdW5pdAotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0jZGVmaW5lCVNTU19JTU1FRAkJMHgwMQotCXVpbnQ4X3QgcmVzZXJ2ZWRbMl07Ci0JdWludDhfdCBob3c7Ci0jZGVmaW5lCVNTU19TVEFSVAkJMHgwMQotI2RlZmluZQlTU1NfTE9FSgkJMHgwMgotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLSNkZWZpbmUgU0NfU0NTSV8xIDB4MDEKLSNkZWZpbmUgU0NfU0NTSV8yIDB4MDMKLQotLyoKLSAqIE9wY29kZXMKLSAqLwotCi0jZGVmaW5lCVRFU1RfVU5JVF9SRUFEWQkJMHgwMAotI2RlZmluZSBSRVFVRVNUX1NFTlNFCQkweDAzCi0jZGVmaW5lCVJFQURfNgkJCTB4MDgKLSNkZWZpbmUgV1JJVEVfNgkJCTB4MGEKLSNkZWZpbmUgSU5RVUlSWQkJCTB4MTIKLSNkZWZpbmUgTU9ERV9TRUxFQ1RfNgkJMHgxNQotI2RlZmluZSBNT0RFX1NFTlNFXzYJCTB4MWEKLSNkZWZpbmUgU1RBUlRfU1RPUF9VTklUCQkweDFiCi0jZGVmaW5lIFNUQVJUX1NUT1AJCTB4MWIKLSNkZWZpbmUgUkVTRVJWRSAgICAgIAkJMHgxNgotI2RlZmluZSBSRUxFQVNFICAgICAgCQkweDE3Ci0jZGVmaW5lCVJFQ0VJVkVfRElBR05PU1RJQwkweDFjCi0jZGVmaW5lCVNFTkRfRElBR05PU1RJQwkJMHgxZAotI2RlZmluZSBQUkVWRU5UX0FMTE9XCQkweDFlCi0jZGVmaW5lCVJFQURfQ0FQQUNJVFkJCTB4MjUKLSNkZWZpbmUJUkVBRF8xMAkJCTB4MjgKLSNkZWZpbmUgV1JJVEVfMTAJCTB4MmEKLSNkZWZpbmUgUE9TSVRJT05fVE9fRUxFTUVOVAkweDJiCi0jZGVmaW5lCVNZTkNIUk9OSVpFX0NBQ0hFCTB4MzUKLSNkZWZpbmUJV1JJVEVfQlVGRkVSICAgICAgICAgICAgMHgzYgotI2RlZmluZQlSRUFEX0JVRkZFUiAgICAgICAgICAgICAweDNjCi0jZGVmaW5lCUNIQU5HRV9ERUZJTklUSU9OCTB4NDAKLSNkZWZpbmUJTE9HX1NFTEVDVAkJMHg0YwotI2RlZmluZQlMT0dfU0VOU0UJCTB4NGQKLSNpZmRlZiBYWFhDQU0KLSNkZWZpbmUJTU9ERV9TRU5TRV8xMAkJMHg1QQotI2VuZGlmCi0jZGVmaW5lCU1PREVfU0VMRUNUXzEwCQkweDU1Ci0jZGVmaW5lIE1PVkVfTUVESVVNICAgICAJMHhhNQotI2RlZmluZSBSRUFEXzEyCQkJMHhhOAotI2RlZmluZSBXUklURV8xMgkJMHhhYQotI2RlZmluZSBSRUFEX0VMRU1FTlRfU1RBVFVTCTB4YjgKLQotCi0vKgotICogRGV2aWNlIFR5cGVzCi0gKi8KLSNkZWZpbmUgVF9ESVJFQ1QJMHgwMAotI2RlZmluZSBUX1NFUVVFTlRJQUwJMHgwMQotI2RlZmluZSBUX1BSSU5URVIJMHgwMgotI2RlZmluZSBUX1BST0NFU1NPUgkweDAzCi0jZGVmaW5lIFRfV09STQkJMHgwNAotI2RlZmluZSBUX0NEUk9NCQkweDA1Ci0jZGVmaW5lIFRfU0NBTk5FUiAJMHgwNgotI2RlZmluZSBUX09QVElDQUwgCTB4MDcKLSNkZWZpbmUgVF9DSEFOR0VSCTB4MDgKLSNkZWZpbmUgVF9DT01NCQkweDA5Ci0jZGVmaW5lIFRfQVNDMAkJMHgwYQotI2RlZmluZSBUX0FTQzEJCTB4MGIKLSNkZWZpbmUJVF9TVE9SQVJSQVkJMHgwYwotI2RlZmluZQlUX0VOQ0xPU1VSRQkweDBkCi0jZGVmaW5lCVRfUkJDCQkweDBlCi0jZGVmaW5lCVRfT0NSVwkJMHgwZgotI2RlZmluZSBUX05PREVWSUNFCTB4MUYKLSNkZWZpbmUJVF9BTlkJCTB4RkYJLyogVXNlZCBpbiBRdWlyayB0YWJsZSBtYXRjaGVzICovCi0KLSNkZWZpbmUgVF9SRU1PVgkJMQotI2RlZmluZQlUX0ZJWEVECQkwCi0KLS8qCi0gKiBUaGlzIGxlbmd0aCBpcyB0aGUgaW5pdGlhbCBpbnF1aXJ5IGxlbmd0aCB1c2VkIGJ5IHRoZSBwcm9iZSBjb2RlLCBhcyAgICAKLSAqIHdlbGwgYXMgdGhlIGxlZ250aCBuZWNlc3NhcnkgZm9yIGFpY19wcmludF9pbnF1aXJ5KCkgdG8gZnVuY3Rpb24gCi0gKiBjb3JyZWN0bHkuICBJZiBlaXRoZXIgdXNlIHJlcXVpcmVzIGEgZGlmZmVyZW50IGxlbmd0aCBpbiB0aGUgZnV0dXJlLCAKLSAqIHRoZSB0d28gdmFsdWVzIHNob3VsZCBiZSBkZS1jb3VwbGVkLgotICovCi0jZGVmaW5lCVNIT1JUX0lOUVVJUllfTEVOR1RICTM2Ci0KLXN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YQotewotCXVpbnQ4X3QgZGV2aWNlOwotI2RlZmluZQlTSURfVFlQRShpbnFfZGF0YSkgKChpbnFfZGF0YSktPmRldmljZSAmIDB4MWYpCi0jZGVmaW5lCVNJRF9RVUFMKGlucV9kYXRhKSAoKChpbnFfZGF0YSktPmRldmljZSAmIDB4RTApID4+IDUpCi0jZGVmaW5lCVNJRF9RVUFMX0xVX0NPTk5FQ1RFRAkweDAwCS8qCi0JCQkJCSAqIFRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBkZXZpY2UKLQkJCQkJICogdHlwZSBpcyBjdXJyZW50bHkgY29ubmVjdGVkIHRvCi0JCQkJCSAqIGxvZ2ljYWwgdW5pdC4gIElmIHRoZSB0YXJnZXQgY2Fubm90Ci0JCQkJCSAqIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBhIHBoeXNpY2FsCi0JCQkJCSAqIGRldmljZSBpcyBjdXJyZW50bHkgY29ubmVjdGVkLCBpdAotCQkJCQkgKiBzaGFsbCBhbHNvIHVzZSB0aGlzIHBlcmlwaGVyYWwKLQkJCQkJICogcXVhbGlmaWVyIHdoZW4gcmV0dXJuaW5nIHRoZSBJTlFVSVJZCi0JCQkJCSAqIGRhdGEuICBUaGlzIHBlcmlwaGVyYWwgcXVhbGlmaWVyCi0JCQkJCSAqIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgZGV2aWNlIGlzCi0JCQkJCSAqIHJlYWR5IGZvciBhY2Nlc3MgYnkgdGhlIGluaXRpYXRvci4KLQkJCQkJICovCi0jZGVmaW5lCVNJRF9RVUFMX0xVX09GRkxJTkUJMHgwMQkvKgotCQkJCQkgKiBUaGUgdGFyZ2V0IGlzIGNhcGFibGUgb2Ygc3VwcG9ydGluZwotCQkJCQkgKiB0aGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwgZGV2aWNlIHR5cGUKLQkJCQkJICogb24gdGhpcyBsb2dpY2FsIHVuaXQ7IGhvd2V2ZXIsIHRoZQotCQkJCQkgKiBwaHlzaWNhbCBkZXZpY2UgaXMgbm90IGN1cnJlbnRseQotCQkJCQkgKiBjb25uZWN0ZWQgdG8gdGhpcyBsb2dpY2FsIHVuaXQuCi0JCQkJCSAqLwotI2RlZmluZSBTSURfUVVBTF9SU1ZECQkweDAyCi0jZGVmaW5lCVNJRF9RVUFMX0JBRF9MVQkJMHgwMwkvKgotCQkJCQkgKiBUaGUgdGFyZ2V0IGlzIG5vdCBjYXBhYmxlIG9mCi0JCQkJCSAqIHN1cHBvcnRpbmcgYSBwaHlzaWNhbCBkZXZpY2Ugb24KLQkJCQkJICogdGhpcyBsb2dpY2FsIHVuaXQuIEZvciB0aGlzCi0JCQkJCSAqIHBlcmlwaGVyYWwgcXVhbGlmaWVyIHRoZSBwZXJpcGhlcmFsCi0JCQkJCSAqIGRldmljZSB0eXBlIHNoYWxsIGJlIHNldCB0byAxRmggdG8KLQkJCQkJICogcHJvdmlkZSBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMKLQkJCQkJICogdmVyc2lvbnMgb2YgU0NTSS4gQWxsIG90aGVyCi0JCQkJCSAqIHBlcmlwaGVyYWwgZGV2aWNlIHR5cGUgdmFsdWVzIGFyZQotCQkJCQkgKiByZXNlcnZlZCBmb3IgdGhpcyBwZXJpcGhlcmFsCi0JCQkJCSAqIHF1YWxpZmllci4KLQkJCQkJICovCi0jZGVmaW5lCVNJRF9RVUFMX0lTX1ZFTkRPUl9VTklRVUUoaW5xX2RhdGEpICgoU0lEX1FVQUwoaW5xX2RhdGEpICYgMHgwOCkgIT0gMCkKLQl1aW50OF90IGRldl9xdWFsMjsKLSNkZWZpbmUJU0lEX1FVQUwyCTB4N0YKLSNkZWZpbmUJU0lEX0lTX1JFTU9WQUJMRShpbnFfZGF0YSkgKCgoaW5xX2RhdGEpLT5kZXZfcXVhbDIgJiAweDgwKSAhPSAwKQotCXVpbnQ4X3QgdmVyc2lvbjsKLSNkZWZpbmUgU0lEX0FOU0lfUkVWKGlucV9kYXRhKSAoKGlucV9kYXRhKS0+dmVyc2lvbiAmIDB4MDcpCiAjZGVmaW5lCQlTQ1NJX1JFVl8wCQkwCiAjZGVmaW5lCQlTQ1NJX1JFVl9DQ1MJCTEKICNkZWZpbmUJCVNDU0lfUkVWXzIJCTIKICNkZWZpbmUJCVNDU0lfUkVWX1NQQwkJMwogI2RlZmluZQkJU0NTSV9SRVZfU1BDMgkJNAogCi0jZGVmaW5lIFNJRF9FQ01BCTB4MzgKLSNkZWZpbmUgU0lEX0lTTwkJMHhDMAotCXVpbnQ4X3QgcmVzcG9uc2VfZm9ybWF0OwotI2RlZmluZSBTSURfQUVOQwkweDgwCi0jZGVmaW5lIFNJRF9Ucm1JT1AJMHg0MAotCXVpbnQ4X3QgYWRkaXRpb25hbF9sZW5ndGg7Ci0JdWludDhfdCByZXNlcnZlZFsyXTsKLQl1aW50OF90IGZsYWdzOwotI2RlZmluZQlTSURfU2Z0UmUJMHgwMQotI2RlZmluZQlTSURfQ21kUXVlCTB4MDIKLSNkZWZpbmUJU0lEX0xpbmtlZAkweDA4Ci0jZGVmaW5lCVNJRF9TeW5jCTB4MTAKLSNkZWZpbmUJU0lEX1dCdXMxNgkweDIwCi0jZGVmaW5lCVNJRF9XQnVzMzIJMHg0MAotI2RlZmluZQlTSURfUmVsQWRyCTB4ODAKLSNkZWZpbmUgU0lEX1ZFTkRPUl9TSVpFICAgOAotCWNoYXIJIHZlbmRvcltTSURfVkVORE9SX1NJWkVdOwotI2RlZmluZSBTSURfUFJPRFVDVF9TSVpFICAxNgotCWNoYXIJIHByb2R1Y3RbU0lEX1BST0RVQ1RfU0laRV07Ci0jZGVmaW5lIFNJRF9SRVZJU0lPTl9TSVpFIDQKLQljaGFyCSByZXZpc2lvbltTSURfUkVWSVNJT05fU0laRV07Ci0JLyoKLQkgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyB3ZXJlIHRha2VuIGZyb20gU0NTSSBQcmltYXJ5IENvbW1hbmRzIC0gMgotCSAqIChTUEMtMikgUmV2aXNpb24gMTQsIERhdGVkIDExIE5vdmVtYmVyIDE5OTkKLQkgKi8KLSNkZWZpbmUJU0lEX1ZFTkRPUl9TUEVDSUZJQ18wX1NJWkUJMjAKLQl1aW50OF90IHZlbmRvcl9zcGVjaWZpYzBbU0lEX1ZFTkRPUl9TUEVDSUZJQ18wX1NJWkVdOwotCS8qCi0JICogQW4gZXh0ZW5zaW9uIG9mIFNDU0kgUGFyYWxsZWwgU3BlY2lmaWMgVmFsdWVzCi0JICovCi0jZGVmaW5lCVNJRF9TUElfSVVTCQkweDAxCi0jZGVmaW5lCVNJRF9TUElfUUFTCQkweDAyCi0jZGVmaW5lCVNJRF9TUElfQ0xPQ0tfU1QJMHgwMAotI2RlZmluZQlTSURfU1BJX0NMT0NLX0RUCTB4MDQKLSNkZWZpbmUJU0lEX1NQSV9DTE9DS19EVF9TVAkweDBDCi0jZGVmaW5lCVNJRF9TUElfTUFTSwkJMHgwRgotCXVpbnQ4X3Qgc3BpM2RhdGE7Ci0JdWludDhfdCByZXNlcnZlZDI7Ci0JLyoKLQkgKiBWZXJzaW9uIERlc2NyaXB0b3JzLCBzdG9yZWQgMiBieXRlIHZhbHVlcy4KLQkgKi8KLQl1aW50OF90IHZlcnNpb24xWzJdOwotCXVpbnQ4X3QgdmVyc2lvbjJbMl07Ci0JdWludDhfdCB2ZXJzaW9uM1syXTsKLQl1aW50OF90IHZlcnNpb240WzJdOwotCXVpbnQ4X3QgdmVyc2lvbjVbMl07Ci0JdWludDhfdCB2ZXJzaW9uNlsyXTsKLQl1aW50OF90IHZlcnNpb243WzJdOwotCXVpbnQ4X3QgdmVyc2lvbjhbMl07Ci0KLQl1aW50OF90IHJlc2VydmVkM1syMl07Ci0KLSNkZWZpbmUJU0lEX1ZFTkRPUl9TUEVDSUZJQ18xX1NJWkUJMTYwCi0JdWludDhfdCB2ZW5kb3Jfc3BlY2lmaWMxW1NJRF9WRU5ET1JfU1BFQ0lGSUNfMV9TSVpFXTsKLX07Ci0KLXN0cnVjdCBzY3NpX3ZwZF91bml0X3NlcmlhbF9udW1iZXIKLXsKLQl1aW50OF90IGRldmljZTsKLQl1aW50OF90IHBhZ2VfY29kZTsKLSNkZWZpbmUgU1ZQRF9VTklUX1NFUklBTF9OVU1CRVIJMHg4MAotCXVpbnQ4X3QgcmVzZXJ2ZWQ7Ci0JdWludDhfdCBsZW5ndGg7IC8qIHNlcmlhbCBudW1iZXIgbGVuZ3RoICovCi0jZGVmaW5lIFNWUERfU0VSSUFMX05VTV9TSVpFIDI1MQotCXVpbnQ4X3Qgc2VyaWFsX251bVtTVlBEX1NFUklBTF9OVU1fU0laRV07Ci19OwotCi1zdHJ1Y3Qgc2NzaV9yZWFkX2NhcGFjaXR5Ci17Ci0JdWludDhfdCBvcGNvZGU7Ci0JdWludDhfdCBieXRlMjsKLQl1aW50OF90IGFkZHJbNF07Ci0JdWludDhfdCB1bnVzZWRbM107Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfcmVhZF9jYXBhY2l0eV9kYXRhCi17Ci0JdWludDhfdCBhZGRyWzRdOwotCXVpbnQ4X3QgbGVuZ3RoWzRdOwotfTsKLQotc3RydWN0IHNjc2lfcmVwb3J0X2x1bnMKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwotCXVpbnQ4X3QgdW51c2VkWzNdOwotCXVpbnQ4X3QgYWRkcls0XTsKLQl1aW50OF90IGNvbnRyb2w7Ci19OwotCi1zdHJ1Y3Qgc2NzaV9yZXBvcnRfbHVuc19kYXRhIHsKLQl1aW50OF90IGxlbmd0aFs0XTsJLyogbGVuZ3RoIG9mIExVTiBpbnZlbnRvcnksIGluIGJ5dGVzICovCi0JdWludDhfdCByZXNlcnZlZFs0XTsJLyogdW51c2VkICovCi0JLyoKLQkgKiBMVU4gaW52ZW50b3J5LSB3ZSBvbmx5IHN1cHBvcnQgdGhlIHR5cGUgemVybyBmb3JtIGZvciBub3cuCi0JICovCi0Jc3RydWN0IHsKLQkJdWludDhfdCBsdW5kYXRhWzhdOwotCX0gbHVuc1sxXTsKLX07Ci0jZGVmaW5lCVJQTF9MVU5EQVRBX0FUWVBfTUFTSwkweGMwCS8qIE1CWiBmb3IgdHlwZSAwIGx1biAqLwotI2RlZmluZQlSUExfTFVOREFUQV9UMExVTgkxCS8qIEAgbHVuZGF0YVsxXSAqLwotCi0KIHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEKIHsKIAl1aW50OF90IGVycm9yX2NvZGU7CkBAIC03NTcsNDEgKzExNyw2IEBACiAjZGVmaW5lIFNTRF9GVUxMX1NJWkUgc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEpCiB9OwogCi1zdHJ1Y3Qgc2NzaV9tb2RlX2hlYWRlcl82Ci17Ci0JdWludDhfdCBkYXRhX2xlbmd0aDsJLyogU2Vuc2UgZGF0YSBsZW5ndGggKi8KLQl1aW50OF90IG1lZGl1bV90eXBlOwotCXVpbnQ4X3QgZGV2X3NwZWM7Ci0JdWludDhfdCBibGtfZGVzY19sZW47Ci19OwotCi1zdHJ1Y3Qgc2NzaV9tb2RlX2hlYWRlcl8xMAotewotCXVpbnQ4X3QgZGF0YV9sZW5ndGhbMl07LyogU2Vuc2UgZGF0YSBsZW5ndGggKi8KLQl1aW50OF90IG1lZGl1bV90eXBlOwotCXVpbnQ4X3QgZGV2X3NwZWM7Ci0JdWludDhfdCB1bnVzZWRbMl07Ci0JdWludDhfdCBibGtfZGVzY19sZW5bMl07Ci19OwotCi1zdHJ1Y3Qgc2NzaV9tb2RlX3BhZ2VfaGVhZGVyCi17Ci0JdWludDhfdCBwYWdlX2NvZGU7Ci0JdWludDhfdCBwYWdlX2xlbmd0aDsKLX07Ci0KLXN0cnVjdCBzY3NpX21vZGVfYmxrX2Rlc2MKLXsKLQl1aW50OF90IGRlbnNpdHk7Ci0JdWludDhfdCBuYmxvY2tzWzNdOwotCXVpbnQ4X3QgcmVzZXJ2ZWQ7Ci0JdWludDhfdCBibGtsZW5bM107Ci19OwotCi0jZGVmaW5lCVNDU0lfREVGQVVMVF9ERU5TSVRZCTB4MDAJLyogdXNlICdkZWZhdWx0JyBkZW5zaXR5ICovCi0jZGVmaW5lCVNDU0lfU0FNRV9ERU5TSVRZCTB4N2YJLyogdXNlICdzYW1lJyBkZW5zaXR5LSA+PSBTQ1NJLTIgb25seSAqLwotCi0KIC8qCiAgKiBTdGF0dXMgQnl0ZQogICovCkBAIC04MDcsNzYgKzEzMiw3IEBACiAjZGVmaW5lIFNDU0lfU1RBVFVTX0FDQV9BQ1RJVkUJCTB4MzAKICNkZWZpbmUgU0NTSV9TVEFUVVNfVEFTS19BQk9SVEVECTB4NDAKIAotc3RydWN0IHNjc2lfaW5xdWlyeV9wYXR0ZXJuIHsKLQl1aW50OF90ICAgdHlwZTsKLQl1aW50OF90ICAgbWVkaWFfdHlwZTsKLSNkZWZpbmUJU0lQX01FRElBX1JFTU9WQUJMRQkweDAxCi0jZGVmaW5lCVNJUF9NRURJQV9GSVhFRAkJMHgwMgotCWNvbnN0IGNoYXIgKnZlbmRvcjsKLQljb25zdCBjaGFyICpwcm9kdWN0OwotCWNvbnN0IGNoYXIgKnJldmlzaW9uOwotfTsgCi0KLXN0cnVjdCBzY3NpX3N0YXRpY19pbnF1aXJ5X3BhdHRlcm4gewotCXVpbnQ4X3QgICB0eXBlOwotCXVpbnQ4X3QgICBtZWRpYV90eXBlOwotCWNoYXIgICAgICAgdmVuZG9yW1NJRF9WRU5ET1JfU0laRSsxXTsKLQljaGFyICAgICAgIHByb2R1Y3RbU0lEX1BST0RVQ1RfU0laRSsxXTsKLQljaGFyICAgICAgIHJldmlzaW9uW1NJRF9SRVZJU0lPTl9TSVpFKzFdOwotfTsKLQotc3RydWN0IHNjc2lfc2Vuc2VfcXVpcmtfZW50cnkgewotCXN0cnVjdCBzY3NpX2lucXVpcnlfcGF0dGVybglpbnFfcGF0OwotCWludAkJCQludW1fc2Vuc2Vfa2V5czsKLQlpbnQJCQkJbnVtX2FzY3M7Ci0Jc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeQkqc2Vuc2Vfa2V5X2luZm87Ci0Jc3RydWN0IGFzY190YWJsZV9lbnRyeQkJKmFzY19pbmZvOwotfTsKLQotc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSB7Ci0JdWludDhfdCAgICBzZW5zZV9rZXk7Ci0JdWludDMyX3QgICBhY3Rpb247Ci0JY29uc3QgY2hhciAqZGVzYzsKLX07Ci0KLXN0cnVjdCBhc2NfdGFibGVfZW50cnkgewotCXVpbnQ4X3QgICAgYXNjOwotCXVpbnQ4X3QgICAgYXNjcTsKLQl1aW50MzJfdCAgIGFjdGlvbjsKLQljb25zdCBjaGFyICpkZXNjOwotfTsKLQotc3RydWN0IG9wX3RhYmxlX2VudHJ5IHsKLQl1aW50OF90ICAgIG9wY29kZTsKLQl1aW50MTZfdCAgIG9wbWFzazsKLQljb25zdCBjaGFyICAqZGVzYzsKLX07Ci0KLXN0cnVjdCBzY3NpX29wX3F1aXJrX2VudHJ5IHsKLQlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3BhdHRlcm4JaW5xX3BhdDsKLQlpbnQJCQkJbnVtX29wczsKLQlzdHJ1Y3Qgb3BfdGFibGVfZW50cnkJCSpvcF90YWJsZTsKLX07Ci0KLXR5cGVkZWYgZW51bSB7Ci0JU1NTX0ZMQUdfTk9ORQkJPSAweDAwLAotCVNTU19GTEFHX1BSSU5UX0NPTU1BTkQJPSAweDAxCi19IHNjc2lfc2Vuc2Vfc3RyaW5nX2ZsYWdzOwotCi1leHRlcm4gY29uc3QgY2hhciAqc2NzaV9zZW5zZV9rZXlfdGV4dFtdOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBMYXJnZSBEaXNrIEhhbmRsaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotc3RhdGljIF9faW5saW5lIGludCBhaWNfc2VjdG9yX2Rpdih1X2xvbmcgY2FwYWNpdHksIGludCBoZWFkcywgaW50IHNlY3RvcnMpOwotCi1zdGF0aWMgX19pbmxpbmUgaW50Ci1haWNfc2VjdG9yX2Rpdih1X2xvbmcgY2FwYWNpdHksIGludCBoZWFkcywgaW50IHNlY3RvcnMpCi17Ci0JcmV0dXJuIChjYXBhY2l0eSAvIChoZWFkcyAqIHNlY3RvcnMpKTsKLX0KLSNlbHNlCi1zdGF0aWMgX19pbmxpbmUgaW50IGFpY19zZWN0b3JfZGl2KHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaGVhZHMsIGludCBzZWN0b3JzKTsKLQogc3RhdGljIF9faW5saW5lIGludAogYWljX3NlY3Rvcl9kaXYoc2VjdG9yX3QgY2FwYWNpdHksIGludCBoZWFkcywgaW50IHNlY3RvcnMpCiB7CkBAIC04ODQsMTUyICsxNDAsNiBAQAogCXNlY3Rvcl9kaXYoY2FwYWNpdHksIChoZWFkcyAqIHNlY3RvcnMpKTsKIAlyZXR1cm4gKGludCljYXBhY2l0eTsKIH0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNb2R1bGUgTGlicmFyeSBIYWNrICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFdoYXQgd2UnZCBsaWtlIHRvIGRvIGlzIGhhdmUgYSBzaW5nbGUgInNjc2kgbGlicmFyeSIgbW9kdWxlIHRoYXQgYm90aCB0aGUKLSAqIGFpYzd4eHggYW5kIGFpYzc5eHggZHJpdmVycyBjb3VsZCBsb2FkIGFuZCBkZXBlbmQgb24uICBBIGN1cnNvcnkgZXhhbWluYXRpb24KLSAqIG9mIGltcGxlbWVudGluZyBtb2R1bGUgZGVwZW5kZW5jaWVzIGluIExpbnV4IChoYW5kbGluZyB0aGUgaW5zdGFsbCBhbmQKLSAqIGluaXRyZCBjYXNlcykgZG9lcyBub3QgbG9vayBwcm9taXNzaW5nLiAgRm9yIG5vdywgd2UganVzdCBkdXBsaWNhdGUgdGhpcwotICogY29kZSBpbiBib3RoIGRyaXZlcnMgdXNpbmcgYSBzaW1wbGUgc3ltYm9sIHJlbmFtaW5nIHNjaGVtZSB0aGF0IGhpZGVzIHRoaXMKLSAqIGhhY2sgZnJvbSB0aGUgZHJpdmVycy4KLSAqLwotI2RlZmluZSBBSUNfTElCX0VOVFJZX0NPTkNBVCh4LCBwcmVmaXgpCXByZWZpeCAjIyB4Ci0jZGVmaW5lCUFJQ19MSUJfRU5UUllfRVhQQU5EKHgsIHByZWZpeCkgQUlDX0xJQl9FTlRSWV9DT05DQVQoeCwgcHJlZml4KQotI2RlZmluZSBBSUNfTElCX0VOVFJZKHgpCQlBSUNfTElCX0VOVFJZX0VYUEFORCh4LCBBSUNfTElCX1BSRUZJWCkKLQotI2RlZmluZQlhaWNfc2Vuc2VfZGVzYwkJCUFJQ19MSUJfRU5UUlkoX3NlbnNlX2Rlc2MpCi0jZGVmaW5lCWFpY19zZW5zZV9lcnJvcl9hY3Rpb24JCUFJQ19MSUJfRU5UUlkoX3NlbnNlX2Vycm9yX2FjdGlvbikKLSNkZWZpbmUJYWljX2Vycm9yX2FjdGlvbgkJQUlDX0xJQl9FTlRSWShfZXJyb3JfYWN0aW9uKQotI2RlZmluZQlhaWNfb3BfZGVzYwkJCUFJQ19MSUJfRU5UUlkoX29wX2Rlc2MpCi0jZGVmaW5lCWFpY19jZGJfc3RyaW5nCQkJQUlDX0xJQl9FTlRSWShfY2RiX3N0cmluZykKLSNkZWZpbmUgYWljX3ByaW50X2lucXVpcnkJCUFJQ19MSUJfRU5UUlkoX3ByaW50X2lucXVpcnkpCi0jZGVmaW5lIGFpY19jYWxjX3N5bmNzcmF0ZQkJQUlDX0xJQl9FTlRSWShfY2FsY19zeW5jcmF0ZSkKLSNkZWZpbmUJYWljX2NhbGNfc3luY3BhcmFtCQlBSUNfTElCX0VOVFJZKF9jYWxjX3N5bmNwYXJhbSkKLSNkZWZpbmUJYWljX2NhbGNfc3BlZWQJCQlBSUNfTElCX0VOVFJZKF9jYWxjX3NwZWVkKQotI2RlZmluZQlhaWNfaW5xdWlyeV9tYXRjaAkJQUlDX0xJQl9FTlRSWShfaW5xdWlyeV9tYXRjaCkKLSNkZWZpbmUJYWljX3N0YXRpY19pbnF1aXJ5X21hdGNoCUFJQ19MSUJfRU5UUlkoX3N0YXRpY19pbnF1aXJ5X21hdGNoKQotI2RlZmluZQlhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uCQlBSUNfTElCX0VOVFJZKF9wYXJzZV9icmFjZV9vcHRpb24pCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQJCQlhaWNfc2Vuc2VfZGVzYyhpbnQgLypzZW5zZV9rZXkqLywgaW50IC8qYXNjKi8sCi0JCQkJICAgICAgIGludCAvKmFzY3EqLywgc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhKiwKLQkJCQkgICAgICAgY29uc3QgY2hhcioqIC8qc2Vuc2Vfa2V5X2Rlc2MqLywKLQkJCQkgICAgICAgY29uc3QgY2hhcioqIC8qYXNjX2Rlc2MqLyk7Ci1haWNfc2Vuc2VfYWN0aW9uCWFpY19zZW5zZV9lcnJvcl9hY3Rpb24oc3RydWN0IHNjc2lfc2Vuc2VfZGF0YSosCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEqLAotCQkJCQkgICAgICAgdWludDMyX3QgLypzZW5zZV9mbGFncyovKTsKLXVpbnQzMl90CQlhaWNfZXJyb3JfYWN0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKiwKLQkJCQkJIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqLAotCQkJCQkgY2FtX3N0YXR1cywgdV9pbnQpOwotCi0jZGVmaW5lCVNGX1JFVFJZX1VBCTB4MDEKLSNkZWZpbmUgU0ZfTk9fUFJJTlQJMHgwMgotI2RlZmluZSBTRl9RVUlFVF9JUgkweDA0CS8qIEJlIHF1aWV0IGFib3V0IElsbGVnYWwgUmVxdWVzdCByZXBvbnNlcyAqLwotI2RlZmluZSBTRl9QUklOVF9BTFdBWVMJMHgwOAotCi0KLWNvbnN0IGNoYXIgKglhaWNfb3BfZGVzYyh1aW50MTZfdCAvKm9wY29kZSovLCBzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEqKTsKLWNoYXIgKgkJYWljX2NkYl9zdHJpbmcodWludDhfdCogLypjZGJfcHRyKi8sIGNoYXIqIC8qY2RiX3N0cmluZyovLAotCQkJICAgICAgIHNpemVfdCAvKmxlbiovKTsKLXZvaWQJCWFpY19wcmludF9pbnF1aXJ5KHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSopOwotCi11X2ludAkJYWljX2NhbGNfc3luY3NyYXRlKHVfaW50IC8qcGVyaW9kX2ZhY3RvciovKTsKLXVfaW50CQlhaWNfY2FsY19zeW5jcGFyYW0odV9pbnQgLypwZXJpb2QqLyk7Ci11X2ludAkJYWljX2NhbGNfc3BlZWQodV9pbnQgd2lkdGgsIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0LAotCQkJICAgICAgIHVfaW50IG1pbl9yYXRlKTsKLQkKLWludAkJYWljX2lucXVpcnlfbWF0Y2goY2FkZHJfdCAvKmlucWJ1ZmZlciovLAotCQkJCSAgY2FkZHJfdCAvKnRhYmxlX2VudHJ5Ki8pOwotaW50CQlhaWNfc3RhdGljX2lucXVpcnlfbWF0Y2goY2FkZHJfdCAvKmlucWJ1ZmZlciovLAotCQkJCQkgY2FkZHJfdCAvKnRhYmxlX2VudHJ5Ki8pOwotCi10eXBlZGVmIHZvaWQgYWljX29wdGlvbl9jYWxsYmFja190KHVfbG9uZywgaW50LCBpbnQsIGludDMyX3QpOwotY2hhciAqCQlhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKGNoYXIgKm9wdF9uYW1lLCBjaGFyICpvcHRfYXJnLAotCQkJCSAgICAgICBjaGFyICplbmQsIGludCBkZXB0aCwKLQkJCQkgICAgICAgYWljX29wdGlvbl9jYWxsYmFja190ICosIHVfbG9uZyk7Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCSBzY3NpX2V4dHJhY3Rfc2Vuc2Uoc3RydWN0IHNjc2lfc2Vuc2VfZGF0YSAqc2Vuc2UsCi0JCQkJCSAgICBpbnQgKmVycm9yX2NvZGUsIGludCAqc2Vuc2Vfa2V5LAotCQkJCQkgICAgaW50ICphc2MsIGludCAqYXNjcSk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAkgc2NzaV91bHRvMmIodWludDMyX3QgdmFsLCB1aW50OF90ICpieXRlcyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAkgc2NzaV91bHRvM2IodWludDMyX3QgdmFsLCB1aW50OF90ICpieXRlcyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAkgc2NzaV91bHRvNGIodWludDMyX3QgdmFsLCB1aW50OF90ICpieXRlcyk7Ci1zdGF0aWMgX19pbmxpbmUgdWludDMyX3Qgc2NzaV8yYnRvdWwodWludDhfdCAqYnl0ZXMpOwotc3RhdGljIF9faW5saW5lIHVpbnQzMl90IHNjc2lfM2J0b3VsKHVpbnQ4X3QgKmJ5dGVzKTsKLXN0YXRpYyBfX2lubGluZSBpbnQzMl90CSBzY3NpXzNidG9sKHVpbnQ4X3QgKmJ5dGVzKTsKLXN0YXRpYyBfX2lubGluZSB1aW50MzJfdCBzY3NpXzRidG91bCh1aW50OF90ICpieXRlcyk7Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkIHNjc2lfZXh0cmFjdF9zZW5zZShzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhICpzZW5zZSwKLQkJCQkgICAgICAgaW50ICplcnJvcl9jb2RlLCBpbnQgKnNlbnNlX2tleSwKLQkJCQkgICAgICAgaW50ICphc2MsIGludCAqYXNjcSkKLXsKLQkqZXJyb3JfY29kZSA9IHNlbnNlLT5lcnJvcl9jb2RlICYgU1NEX0VSUkNPREU7Ci0JKnNlbnNlX2tleSA9IHNlbnNlLT5mbGFncyAmIFNTRF9LRVk7Ci0JKmFzYyA9IChzZW5zZS0+ZXh0cmFfbGVuID49IDUpID8gc2Vuc2UtPmFkZF9zZW5zZV9jb2RlIDogMDsKLQkqYXNjcSA9IChzZW5zZS0+ZXh0cmFfbGVuID49IDYpID8gc2Vuc2UtPmFkZF9zZW5zZV9jb2RlX3F1YWwgOiAwOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotc2NzaV91bHRvMmIodWludDMyX3QgdmFsLCB1aW50OF90ICpieXRlcykKLXsKLQotCWJ5dGVzWzBdID0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0JYnl0ZXNbMV0gPSB2YWwgJiAweGZmOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotc2NzaV91bHRvM2IodWludDMyX3QgdmFsLCB1aW50OF90ICpieXRlcykKLXsKLQotCWJ5dGVzWzBdID0gKHZhbCA+PiAxNikgJiAweGZmOwotCWJ5dGVzWzFdID0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0JYnl0ZXNbMl0gPSB2YWwgJiAweGZmOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotc2NzaV91bHRvNGIodWludDMyX3QgdmFsLCB1aW50OF90ICpieXRlcykKLXsKLQotCWJ5dGVzWzBdID0gKHZhbCA+PiAyNCkgJiAweGZmOwotCWJ5dGVzWzFdID0gKHZhbCA+PiAxNikgJiAweGZmOwotCWJ5dGVzWzJdID0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0JYnl0ZXNbM10gPSB2YWwgJiAweGZmOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdWludDMyX3QKLXNjc2lfMmJ0b3VsKHVpbnQ4X3QgKmJ5dGVzKQotewotCXVpbnQzMl90IHJ2OwotCi0JcnYgPSAoYnl0ZXNbMF0gPDwgOCkgfAotCSAgICAgYnl0ZXNbMV07Ci0JcmV0dXJuIChydik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1aW50MzJfdAotc2NzaV8zYnRvdWwodWludDhfdCAqYnl0ZXMpCi17Ci0JdWludDMyX3QgcnY7Ci0KLQlydiA9IChieXRlc1swXSA8PCAxNikgfAotCSAgICAgKGJ5dGVzWzFdIDw8IDgpIHwKLQkgICAgIGJ5dGVzWzJdOwotCXJldHVybiAocnYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgaW50MzJfdCAKLXNjc2lfM2J0b2wodWludDhfdCAqYnl0ZXMpCi17Ci0JdWludDMyX3QgcmMgPSBzY3NpXzNidG91bChieXRlcyk7Ci0gCi0JaWYgKHJjICYgMHgwMDgwMDAwMCkKLQkJcmMgfD0gMHhmZjAwMDAwMDsKLQotCXJldHVybiAoaW50MzJfdCkgcmM7Ci19CiAKIHN0YXRpYyBfX2lubGluZSB1aW50MzJfdAogc2NzaV80YnRvdWwodWludDhfdCAqYnl0ZXMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXRhX3BpaXguYyBiL2RyaXZlcnMvc2NzaS9hdGFfcGlpeC5jCmluZGV4IGZiMjhjMTIuLjg3ZTBjMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hdGFfcGlpeC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hdGFfcGlpeC5jCkBAIC02OCw4ICs2OCw4IEBACiAJUElJWF9DT01CX1BBVEFfUDAJPSAoMSA8PCAxKSwKIAlQSUlYX0NPTUIJCT0gKDEgPDwgMiksIC8qIGNvbWJpbmVkIG1vZGUgZW5hYmxlZD8gKi8KIAotCVBJSVhfUE9SVF9QUkVTRU5UCT0gKDEgPDwgMCksCi0JUElJWF9QT1JUX0VOQUJMRUQJPSAoMSA8PCA0KSwKKwlQSUlYX1BPUlRfRU5BQkxFRAk9ICgxIDw8IDApLAorCVBJSVhfUE9SVF9QUkVTRU5UCT0gKDEgPDwgNCksCiAKIAlQSUlYXzgwQ19QUkkJCT0gKDEgPDwgNSkgfCAoMSA8PCA0KSwKIAlQSUlYXzgwQ19TRUMJCT0gKDEgPDwgNykgfCAoMSA8PCA2KSwKQEAgLTM3Nyw3ICszNzcsOSBAQAogICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KICAqCiAgKglSRVRVUk5TOgotICoJTm9uLXplcm8gaWYgZGV2aWNlIGRldGVjdGVkLCB6ZXJvIG90aGVyd2lzZS4KKyAqCU5vbi16ZXJvIGlmIHBvcnQgaXMgZW5hYmxlZCwgaXQgbWF5IG9yIG1heSBub3QgaGF2ZSBhIGRldmljZQorICoJYXR0YWNoZWQgaW4gdGhhdCBjYXNlIChQUkVTRU5UIGJpdCB3b3VsZCBvbmx5IGJlIHNldCBpZiBCSU9TIHByb2JlCisgKgl3YXMgZG9uZSkuIFplcm8gaXMgcmV0dXJuZWQgaWYgcG9ydCBpcyBkaXNhYmxlZC4KICAqLwogc3RhdGljIGludCBwaWl4X3NhdGFfcHJvYmUgKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CkBAIC00MDEsNyArNDAzLDcgQEAKIAkgKi8KIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJbWFzayA9IChQSUlYX1BPUlRfUFJFU0VOVCA8PCBpKSB8IChQSUlYX1BPUlRfRU5BQkxFRCA8PCBpKTsKKwkJbWFzayA9IChQSUlYX1BPUlRfRU5BQkxFRCA8PCBpKTsKIAogCQlpZiAoKG9yaWdfbWFzayAmIG1hc2spID09IG1hc2spCiAJCQlpZiAoY29tYmluZWQgfHwgKGkgPT0gYXAtPmhhcmRfcG9ydF9ubykpCkBAIC01NjYsMjUgKzU2OCwxMiBAQAogCX0KIH0KIAotLyogbW92ZSB0byBQQ0kgbGF5ZXIsIGludGVncmF0ZSB3LyBNU0kgc3R1ZmYgKi8KLXN0YXRpYyB2b2lkIHBjaV9lbmFibGVfaW50eChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQl1MTYgcGNpX2NvbW1hbmQ7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jb21tYW5kKTsKLQlpZiAocGNpX2NvbW1hbmQgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpIHsKLQkJcGNpX2NvbW1hbmQgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBwY2lfY29tbWFuZCk7Ci0JfQotfQotCiAjZGVmaW5lIEFIQ0lfUENJX0JBUiA1CiAjZGVmaW5lIEFIQ0lfR0xPQkFMX0NUTCAweDA0CiAjZGVmaW5lIEFIQ0lfRU5BQkxFICgxIDw8IDMxKQogc3RhdGljIGludCBwaWl4X2Rpc2FibGVfYWhjaShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQl2b2lkICptbWlvOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl2b2lkIF9faW9tZW0gKm1taW87CiAJdTMyIHRtcDsKIAlpbnQgcmMgPSAwOwogCkBAIC01OTIsMTEgKzU4MSwxMSBAQAogCSAqIHdvcmtzIGJlY2F1c2UgdGhpcyBkZXZpY2UgaXMgdXN1YWxseSBzZXQgdXAgYnkgQklPUy4KIAkgKi8KIAotCWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgQUhDSV9QQ0lfQkFSKTsKLQlpZiAoIWFkZHIgfHwgIXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgQUhDSV9QQ0lfQkFSKSkKKwlpZiAoIXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBBSENJX1BDSV9CQVIpIHx8CisJICAgICFwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIEFIQ0lfUENJX0JBUikpCiAJCXJldHVybiAwOwogCi0JbW1pbyA9IGlvcmVtYXAoYWRkciwgNjQpOworCW1taW8gPSBwY2lfaW9tYXAocGRldiwgQUhDSV9QQ0lfQkFSLCA2NCk7CiAJaWYgKCFtbWlvKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNjEwLDcgKzU5OSw3IEBACiAJCQlyYyA9IC1FSU87CiAJfQogCi0JaW91bm1hcChtbWlvKTsKKwlwY2lfaW91bm1hcChwZGV2LCBtbWlvKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTY3Niw3ICs2NjUsNyBAQAogCSAqIG1lc3NhZ2Utc2lnbmFsbGVkIGludGVycnVwdHMgY3VycmVudGx5KS4KIAkgKi8KIAlpZiAocG9ydF9pbmZvWzBdLT5ob3N0X2ZsYWdzICYgUElJWF9GTEFHX0NIRUNLSU5UUikKLQkJcGNpX2VuYWJsZV9pbnR4KHBkZXYpOworCQlwY2lfaW50eChwZGV2LCAxKTsKIAogCWlmIChjb21iaW5lZCkgewogCQlwb3J0X2luZm9bc2F0YV9jaGFuXSA9ICZwaWl4X3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jaC5jIGIvZHJpdmVycy9zY3NpL2NoLmMKaW5kZXggMzkwMGUyOC4uZGE2ZTUxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2NoLmMKKysrIGIvZHJpdmVycy9zY3NpL2NoLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NoaW8uaD4JCQkvKiBoZXJlIGFyZSBhbGwgdGhlIGlvY3RscyAqLwpAQCAtMzEsNyArMzAsNyBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgotI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgogCiAjZGVmaW5lIENIX0RUX01BWCAgICAgICAxNgpAQCAtMTE3LDcgKzExNiw3IEBACiB9IHNjc2lfY2hhbmdlcjsKIAogc3RhdGljIExJU1RfSEVBRChjaF9kZXZsaXN0KTsKLXN0YXRpYyBzcGlubG9ja190IGNoX2Rldmxpc3RfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2hfZGV2bGlzdF9sb2NrKTsKIHN0YXRpYyBpbnQgY2hfZGV2Y291bnQ7CiAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9kcml2ZXIgY2hfdGVtcGxhdGUgPQpAQCAtMTgxLDE3ICsxODAsMTcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IGNoX2ZpbmRfZXJybm8odW5zaWduZWQgY2hhciAqc2Vuc2VfYnVmZmVyKQorc3RhdGljIGludCBjaF9maW5kX2Vycm5vKHN0cnVjdCBzY3NpX3NlbnNlX2hkciAqc3NoZHIpCiB7CiAJaW50IGksZXJybm8gPSAwOwogCiAJLyogQ2hlY2sgdG8gc2VlIGlmIGFkZGl0aW9uYWwgc2Vuc2UgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlICovCi0JaWYgKHNlbnNlX2J1ZmZlcls3XSAgPiA1ICYmCi0JICAgIHNlbnNlX2J1ZmZlclsxMl0gIT0gMCkgeworCWlmIChzY3NpX3NlbnNlX3ZhbGlkKHNzaGRyKSAmJgorCSAgICBzc2hkci0+YXNjICE9IDApIHsKIAkJZm9yIChpID0gMDsgZXJyW2ldLmVycm5vICE9IDA7IGkrKykgewotCQkJaWYgKGVycltpXS5zZW5zZSA9PSBzZW5zZV9idWZmZXJbIDJdICYmCi0JCQkgICAgZXJyW2ldLmFzYyAgID09IHNlbnNlX2J1ZmZlclsxMl0gJiYKLQkJCSAgICBlcnJbaV0uYXNjcSAgPT0gc2Vuc2VfYnVmZmVyWzEzXSkgeworCQkJaWYgKGVycltpXS5zZW5zZSA9PSBzc2hkci0+c2Vuc2Vfa2V5ICYmCisJCQkgICAgZXJyW2ldLmFzYyAgID09IHNzaGRyLT5hc2MgJiYKKwkJCSAgICBlcnJbaV0uYXNjcSAgPT0gc3NoZHItPmFzY3EpIHsKIAkJCQllcnJubyA9IC1lcnJbaV0uZXJybm87CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0yMDcsMTMgKzIwNiw5IEBACiAJICAgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBidWZsZW5ndGgsCiAJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCWludCBlcnJubywgcmV0cmllcyA9IDAsIHRpbWVvdXQ7Ci0Jc3RydWN0IHNjc2lfcmVxdWVzdCAqc3I7CisJaW50IGVycm5vLCByZXRyaWVzID0gMCwgdGltZW91dCwgcmVzdWx0OworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKIAkKLQlzciA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChjaC0+ZGV2aWNlLCBHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBzcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAl0aW1lb3V0ID0gKGNtZFswXSA9PSBJTklUSUFMSVpFX0VMRU1FTlRfU1RBVFVTKQogCQk/IHRpbWVvdXRfaW5pdCA6IHRpbWVvdXRfbW92ZTsKIApAQCAtMjI0LDE2ICsyMTksMTcgQEAKIAkJX19zY3NpX3ByaW50X2NvbW1hbmQoY21kKTsKIAl9CiAKLSAgICAgICAgc2NzaV93YWl0X3JlcShzciwgY21kLCBidWZmZXIsIGJ1Zmxlbmd0aCwKLQkJICAgICAgdGltZW91dCAqIEhaLCBNQVhfUkVUUklFUyk7CisgICAgICAgIHJlc3VsdCA9IHNjc2lfZXhlY3V0ZV9yZXEoY2gtPmRldmljZSwgY21kLCBkaXJlY3Rpb24sIGJ1ZmZlciwKKwkJCQkgIGJ1Zmxlbmd0aCwgJnNzaGRyLCB0aW1lb3V0ICogSFosCisJCQkJICBNQVhfUkVUUklFUyk7CiAKLQlkcHJpbnRrKCJyZXN1bHQ6IDB4JXhcbiIsc3ItPnNyX3Jlc3VsdCk7Ci0JaWYgKGRyaXZlcl9ieXRlKHNyLT5zcl9yZXN1bHQpICYgRFJJVkVSX1NFTlNFKSB7CisJZHByaW50aygicmVzdWx0OiAweCV4XG4iLHJlc3VsdCk7CisJaWYgKGRyaXZlcl9ieXRlKHJlc3VsdCkgJiBEUklWRVJfU0VOU0UpIHsKIAkJaWYgKGRlYnVnKQotCQkJc2NzaV9wcmludF9yZXFfc2Vuc2UoY2gtPm5hbWUsIHNyKTsKLQkJZXJybm8gPSBjaF9maW5kX2Vycm5vKHNyLT5zcl9zZW5zZV9idWZmZXIpOworCQkJc2NzaV9wcmludF9zZW5zZV9oZHIoY2gtPm5hbWUsICZzc2hkcik7CisJCWVycm5vID0gY2hfZmluZF9lcnJubygmc3NoZHIpOwogCi0JCXN3aXRjaChzci0+c3Jfc2Vuc2VfYnVmZmVyWzJdICYgMHhmKSB7CisJCXN3aXRjaChzc2hkci5zZW5zZV9rZXkpIHsKIAkJY2FzZSBVTklUX0FUVEVOVElPTjoKIAkJCWNoLT51bml0X2F0dGVudGlvbiA9IDE7CiAJCQlpZiAocmV0cmllcysrIDwgMykKQEAgLTI0MSw3ICsyMzcsNiBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0Jc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3IpOwogCXJldHVybiBlcnJubzsKIH0KIApAQCAtNTY1LDcgKzU2MCw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBjaF9nc3RhdHVzKHNjc2lfY2hhbmdlciAqY2gsIGludCB0eXBlLCB1bnNpZ25lZCBjaGFyICpkZXN0KQorc3RhdGljIGludCBjaF9nc3RhdHVzKHNjc2lfY2hhbmdlciAqY2gsIGludCB0eXBlLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqZGVzdCkKIHsKIAlpbnQgcmV0dmFsID0gMDsKIAl1X2NoYXIgZGF0YVsxNl07CkBAIC02MzksNiArNjM0LDcgQEAKIHsKIAlzY3NpX2NoYW5nZXIgKmNoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWludCByZXR2YWw7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIENISU9HUEFSQU1TOgpAQCAtNjUxLDcgKzY0Nyw3IEBACiAJCXBhcmFtcy5jcF9ucG9ydGFscyAgPSBjaC0+Y291bnRzW0NIRVRfSUVdOwogCQlwYXJhbXMuY3BfbmRyaXZlcyAgID0gY2gtPmNvdW50c1tDSEVUX0RUXTsKIAkJCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkpCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJldHVybiAwOwogCX0KQEAgLTY3Niw3ICs2NzIsNyBAQAogCQkJdnBhcmFtcy5jdnBfbjQgID0gY2gtPmNvdW50c1tDSEVUX1Y0XTsKIAkJCXN0cm5jcHkodnBhcmFtcy5jdnBfbGFiZWw0LHZlbmRvcl9sYWJlbHNbM10sMTYpOwogCQl9Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmdnBhcmFtcywgc2l6ZW9mKHZwYXJhbXMpKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdnBhcmFtcywgc2l6ZW9mKHZwYXJhbXMpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gMDsKIAl9CkBAIC02ODUsNyArNjgxLDcgQEAKIAl7CiAJCXN0cnVjdCBjaGFuZ2VyX3Bvc2l0aW9uIHBvczsKIAkJCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmcG9zLCAodm9pZCopYXJnLCBzaXplb2YgKHBvcykpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJnBvcywgYXJncCwgc2l6ZW9mIChwb3MpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCWlmICgwICE9IGNoX2NoZWNrcmFuZ2UoY2gsIHBvcy5jcF90eXBlLCBwb3MuY3BfdW5pdCkpIHsKQEAgLTcwNCw3ICs3MDAsNyBAQAogCXsKIAkJc3RydWN0IGNoYW5nZXJfbW92ZSBtdjsKIAotCQlpZiAoY29weV9mcm9tX3VzZXIoJm12LCAodm9pZCopYXJnLCBzaXplb2YgKG12KSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbXYsIGFyZ3AsIHNpemVvZiAobXYpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCWlmICgwICE9IGNoX2NoZWNrcmFuZ2UoY2gsIG12LmNtX2Zyb210eXBlLCBtdi5jbV9mcm9tdW5pdCkgfHwKQEAgLTcyNiw3ICs3MjIsNyBAQAogCXsKIAkJc3RydWN0IGNoYW5nZXJfZXhjaGFuZ2UgbXY7CiAJCQotCQlpZiAoY29weV9mcm9tX3VzZXIoJm12LCAodm9pZCopYXJnLCBzaXplb2YgKG12KSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbXYsIGFyZ3AsIHNpemVvZiAobXYpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCWlmICgwICE9IGNoX2NoZWNrcmFuZ2UoY2gsIG12LmNlX3NyY3R5cGUsICBtdi5jZV9zcmN1bml0ICkgfHwKQEAgLTc1MSw3ICs3NDcsNyBAQAogCXsKIAkJc3RydWN0IGNoYW5nZXJfZWxlbWVudF9zdGF0dXMgY2VzOwogCQkKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZXMsICh2b2lkKilhcmcsIHNpemVvZiAoY2VzKSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2VzLCBhcmdwLCBzaXplb2YgKGNlcykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWlmIChjZXMuY2VzX3R5cGUgPCAwIHx8IGNlcy5jZXNfdHlwZSA+PSBDSF9UWVBFUykKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtNzY3LDcgKzc2Myw3IEBACiAJCXVuc2lnbmVkIGludCBlbGVtOwogCQlpbnQgICAgIHJlc3VsdCxpOwogCQkKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZ2UsICh2b2lkKilhcmcsIHNpemVvZiAoY2dlKSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2dlLCBhcmdwLCBzaXplb2YgKGNnZSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJaWYgKDAgIT0gY2hfY2hlY2tyYW5nZShjaCwgY2dlLmNnZV90eXBlLCBjZ2UuY2dlX3VuaXQpKQpAQCAtODMwLDcgKzgyNiw3IEBACiAJCWtmcmVlKGJ1ZmZlcik7CiAJCXVwKCZjaC0+bG9jayk7CiAJCQotCQlpZiAoY29weV90b191c2VyKCh2b2lkKilhcmcsICZjZ2UsIHNpemVvZiAoY2dlKSkpCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNnZSwgc2l6ZW9mIChjZ2UpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTg0OCw3ICs4NDQsNyBAQAogCQlzdHJ1Y3QgY2hhbmdlcl9zZXRfdm9sdGFnIGNzdjsKIAkJaW50IGVsZW07CiAKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjc3YsICh2b2lkKilhcmcsIHNpemVvZihjc3YpKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjc3YsIGFyZ3AsIHNpemVvZihjc3YpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCWlmICgwICE9IGNoX2NoZWNrcmFuZ2UoY2gsIGNzdi5jc3ZfdHlwZSwgY3N2LmNzdl91bml0KSkgewpAQCAtODY2LDcgKzg2Miw3IEBACiAJfQogCiAJZGVmYXVsdDoKLQkJcmV0dXJuIHNjc2lfaW9jdGwoY2gtPmRldmljZSwgY21kLCAodm9pZCopYXJnKTsKKwkJcmV0dXJuIHNjc2lfaW9jdGwoY2gtPmRldmljZSwgY21kLCBhcmdwKTsKIAogCX0KIH0KQEAgLTg5OSw5ICs4OTUsOSBAQAogCWNhc2UgQ0hJT0dTVEFUVVMzMjoKIAl7CiAJCXN0cnVjdCBjaGFuZ2VyX2VsZW1lbnRfc3RhdHVzMzIgY2VzMzI7Ci0JCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJCXVuc2lnbmVkIGNoYXIgX191c2VyICpkYXRhOwogCQkKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZXMzMiwgKHZvaWQqKWFyZywgc2l6ZW9mIChjZXMzMikpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmNlczMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZiAoY2VzMzIpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlpZiAoY2VzMzIuY2VzX3R5cGUgPCAwIHx8IGNlczMyLmNlc190eXBlID49IENIX1RZUEVTKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC05NDAsOCArOTM2LDYgQEAKIAlpZiAoaW5pdCkKIAkJY2hfaW5pdF9lbGVtKGNoKTsKIAotCWRldmZzX21rX2NkZXYoTUtERVYoU0NTSV9DSEFOR0VSX01BSk9SLGNoLT5taW5vciksCi0JCSAgICAgIFNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTywgY2gtPm5hbWUpOwogCWNsYXNzX2RldmljZV9jcmVhdGUoY2hfc3lzZnNfY2xhc3MsCiAJCQkgICAgTUtERVYoU0NTSV9DSEFOR0VSX01BSk9SLGNoLT5taW5vciksCiAJCQkgICAgZGV2LCAicyVzIiwgY2gtPm5hbWUpOwpAQCAtOTc0LDcgKzk2OCw2IEBACiAKIAljbGFzc19kZXZpY2VfZGVzdHJveShjaF9zeXNmc19jbGFzcywKIAkJCSAgICAgTUtERVYoU0NTSV9DSEFOR0VSX01BSk9SLGNoLT5taW5vcikpOwotCWRldmZzX3JlbW92ZShjaC0+bmFtZSk7CiAJa2ZyZWUoY2gtPmR0KTsKIAlrZnJlZShjaCk7CiAJY2hfZGV2Y291bnQtLTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jb25zdGFudHMuYyBiL2RyaXZlcnMvc2NzaS9jb25zdGFudHMuYwppbmRleCBlYzE2MTczLi5mNmJlMmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY29uc3RhbnRzLmMKKysrIGIvZHJpdmVycy9zY3NpL2NvbnN0YW50cy5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KIAogCiAKQEAgLTExNTUsNiArMTE1NiwzMSBAQAogCX0KIH0KIAordm9pZAorc2NzaV9wcmludF9zZW5zZV9oZHIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkcikKK3sKKwljb25zdCBjaGFyICpzZW5zZV90eHQ7CisJLyogQW4gZXhhbXBsZSBvZiBkZWZlcnJlZCBpcyB3aGVuIGFuIGVhcmxpZXIgd3JpdGUgdG8gZGlzayBjYWNoZQorCSAqIHN1Y2NlZWRlZCwgYnV0IG5vdyB0aGUgZGlzayBkaXNjb3ZlcnMgdGhhdCBpdCBjYW5ub3Qgd3JpdGUgdGhlCisJICogZGF0YSB0byB0aGUgbWFnbmV0aWMgbWVkaWEuCisJICovCisJY29uc3QgY2hhciAqZXJyb3IgPSBzY3NpX3NlbnNlX2lzX2RlZmVycmVkKHNzaGRyKSA/IAorCQkiPDxERUZFUlJFRD4+IiA6ICJDdXJyZW50IjsKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMiLCBuYW1lLCBlcnJvcik7CisJaWYgKHNzaGRyLT5yZXNwb25zZV9jb2RlID49IDB4NzIpCisJCXByaW50aygiIFtkZXNjcmlwdG9yXSIpOworCisJc2Vuc2VfdHh0ID0gc2NzaV9zZW5zZV9rZXlfc3RyaW5nKHNzaGRyLT5zZW5zZV9rZXkpOworCWlmIChzZW5zZV90eHQpCisJCXByaW50aygiOiBzZW5zZSBrZXk6ICVzXG4iLCBzZW5zZV90eHQpOworCWVsc2UKKwkJcHJpbnRrKCI6IHNlbnNlIGtleT0weCV4XG4iLCBzc2hkci0+c2Vuc2Vfa2V5KTsKKwlwcmludGsoS0VSTl9JTkZPICIgICAgIik7CisJc2NzaV9zaG93X2V4dGRfc2Vuc2Uoc3NoZHItPmFzYywgc3NoZHItPmFzY3EpOworCXByaW50aygiXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9wcmludF9zZW5zZV9oZHIpOworCiAvKiBQcmludCBzZW5zZSBpbmZvcm1hdGlvbiAqLwogdm9pZAogX19zY3NpX3ByaW50X3NlbnNlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlbnNlX2J1ZmZlciwKQEAgLTExNjIsOCArMTE4OCw2IEBACiB7CiAJaW50IGssIG51bSwgcmVzOwogCXVuc2lnbmVkIGludCBpbmZvOwotCWNvbnN0IGNoYXIgKmVycm9yOwotCWNvbnN0IGNoYXIgKnNlbnNlX3R4dDsKIAlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoOwogICAgIAogCXJlcyA9IHNjc2lfbm9ybWFsaXplX3NlbnNlKHNlbnNlX2J1ZmZlciwgc2Vuc2VfbGVuLCAmc3NoKTsKQEAgLTExODEsMjYgKzEyMDUsNyBAQAogCQlwcmludGsoIlxuIik7CiAJCXJldHVybjsKIAl9Ci0KLQkvKiBBbiBleGFtcGxlIG9mIGRlZmVycmVkIGlzIHdoZW4gYW4gZWFybGllciB3cml0ZSB0byBkaXNrIGNhY2hlCi0JICogc3VjY2VlZGVkLCBidXQgbm93IHRoZSBkaXNrIGRpc2NvdmVycyB0aGF0IGl0IGNhbm5vdCB3cml0ZSB0aGUKLQkgKiBkYXRhIHRvIHRoZSBtYWduZXRpYyBtZWRpYS4KLQkgKi8KLQllcnJvciA9IHNjc2lfc2Vuc2VfaXNfZGVmZXJyZWQoJnNzaCkgPyAKLQkJCSI8PERFRkVSUkVEPj4iIDogIkN1cnJlbnQiOwotCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyIsIG5hbWUsIGVycm9yKTsKLQlpZiAoc3NoLnJlc3BvbnNlX2NvZGUgPj0gMHg3MikKLQkJcHJpbnRrKCIgW2Rlc2NyaXB0b3JdIik7Ci0KLQlzZW5zZV90eHQgPSBzY3NpX3NlbnNlX2tleV9zdHJpbmcoc3NoLnNlbnNlX2tleSk7Ci0JaWYgKHNlbnNlX3R4dCkKLQkJcHJpbnRrKCI6IHNlbnNlIGtleTogJXNcbiIsIHNlbnNlX3R4dCk7Ci0JZWxzZQotCQlwcmludGsoIjogc2Vuc2Uga2V5PTB4JXhcbiIsIHNzaC5zZW5zZV9rZXkpOwotCXByaW50ayhLRVJOX0lORk8gIiAgICAiKTsKLQlzY3NpX3Nob3dfZXh0ZF9zZW5zZShzc2guYXNjLCBzc2guYXNjcSk7Ci0JcHJpbnRrKCJcbiIpOwotCisJc2NzaV9wcmludF9zZW5zZV9oZHIobmFtZSwgJnNzaCk7CiAJaWYgKHNzaC5yZXNwb25zZV9jb2RlIDwgMHg3MikgewogCQkvKiBvbmx5IGRlY29kZSBleHRyYXMgZm9yICJmaXhlZCIgZm9ybWF0IG5vdyAqLwogCQljaGFyIGJ1ZmZbODBdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2NwcWZjVFNpbml0LmMgYi9kcml2ZXJzL3Njc2kvY3BxZmNUU2luaXQuYwppbmRleCBkNzJiZTBjLi4zZmRhOGQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY3BxZmNUU2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvY3BxZmNUU2luaXQuYwpAQCAtNjkxLDggKzY5MSw3IEBACiAgICAgICAgIGlmKCAgY29weV90b191c2VyKCB2ZW5kb3JfY21kLT5idWZwLCBidWYsIHZlbmRvcl9jbWQtPmxlbikpCiAJCXJlc3VsdCA9IC1FRkFVTFQ7CiAKLSAgICAgICAgaWYoIGJ1ZikgCi0JICBrZnJlZSggYnVmKTsKKwlrZnJlZShidWYpOwogCiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaG9zdHMuYyBiL2RyaXZlcnMvc2NzaS9ob3N0cy5jCmluZGV4IDVmZWI4ODYuLjg1NTAzZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ob3N0cy5jCisrKyBiL2RyaXZlcnMvc2NzaS9ob3N0cy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNTIsMjEgKzUzLDgwIEBACiB9OwogCiAvKioKLSAqIHNjc2lfaG9zdF9jYW5jZWwgLSBjYW5jZWwgb3V0c3RhbmRpbmcgSU8gdG8gdGhpcyBob3N0Ci0gKiBAc2hvc3Q6CXBvaW50ZXIgdG8gc3RydWN0IFNjc2lfSG9zdAotICogcmVjb3Zlcnk6CXJlY292ZXJ5IHJlcXVlc3RlZCB0byBydW4uCisgKglzY3NpX2hvc3Rfc2V0X3N0YXRlIC0gVGFrZSB0aGUgZ2l2ZW4gaG9zdCB0aHJvdWdoIHRoZSBob3N0CisgKgkJc3RhdGUgbW9kZWwuCisgKglAc2hvc3Q6CXNjc2kgaG9zdCB0byBjaGFuZ2UgdGhlIHN0YXRlIG9mLgorICoJQHN0YXRlOglzdGF0ZSB0byBjaGFuZ2UgdG8uCisgKgorICoJUmV0dXJucyB6ZXJvIGlmIHVuc3VjY2Vzc2Z1bCBvciBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdGVkCisgKgl0cmFuc2l0aW9uIGlzIGlsbGVnYWwuCiAgKiovCi1zdGF0aWMgdm9pZCBzY3NpX2hvc3RfY2FuY2VsKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgcmVjb3ZlcnkpCitpbnQgc2NzaV9ob3N0X3NldF9zdGF0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgZW51bSBzY3NpX2hvc3Rfc3RhdGUgc3RhdGUpCiB7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCWVudW0gc2NzaV9ob3N0X3N0YXRlIG9sZHN0YXRlID0gc2hvc3QtPnNob3N0X3N0YXRlOwogCi0Jc2V0X2JpdChTSE9TVF9DQU5DRUwsICZzaG9zdC0+c2hvc3Rfc3RhdGUpOwotCXNob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBzaG9zdCkgewotCQlzY3NpX2RldmljZV9jYW5jZWwoc2RldiwgcmVjb3ZlcnkpOworCWlmIChzdGF0ZSA9PSBvbGRzdGF0ZSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTSE9TVF9DUkVBVEVEOgorCQkvKiBUaGVyZSBhcmUgbm8gbGVnYWwgc3RhdGVzIHRoYXQgY29tZSBiYWNrIHRvCisJCSAqIGNyZWF0ZWQuICBUaGlzIGlzIHRoZSBtYW51YWxseSBpbml0aWFsaXNlZCBzdGFydAorCQkgKiBzdGF0ZSAqLworCQlnb3RvIGlsbGVnYWw7CisKKwljYXNlIFNIT1NUX1JVTk5JTkc6CisJCXN3aXRjaCAob2xkc3RhdGUpIHsKKwkJY2FzZSBTSE9TVF9DUkVBVEVEOgorCQljYXNlIFNIT1NUX1JFQ09WRVJZOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGlsbGVnYWw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNIT1NUX1JFQ09WRVJZOgorCQlzd2l0Y2ggKG9sZHN0YXRlKSB7CisJCWNhc2UgU0hPU1RfUlVOTklORzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBpbGxlZ2FsOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTSE9TVF9DQU5DRUw6CisJCXN3aXRjaCAob2xkc3RhdGUpIHsKKwkJY2FzZSBTSE9TVF9DUkVBVEVEOgorCQljYXNlIFNIT1NUX1JVTk5JTkc6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gaWxsZWdhbDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0hPU1RfREVMOgorCQlzd2l0Y2ggKG9sZHN0YXRlKSB7CisJCWNhc2UgU0hPU1RfQ0FOQ0VMOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGlsbGVnYWw7CisJCX0KKwkJYnJlYWs7CisKIAl9Ci0Jd2FpdF9ldmVudChzaG9zdC0+aG9zdF93YWl0LCAoIXRlc3RfYml0KFNIT1NUX1JFQ09WRVJZLAotCQkJCQkJJnNob3N0LT5zaG9zdF9zdGF0ZSkpKTsKKwlzaG9zdC0+c2hvc3Rfc3RhdGUgPSBzdGF0ZTsKKwlyZXR1cm4gMDsKKworIGlsbGVnYWw6CisJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMSwKKwkJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmc2hvc3QtPnNob3N0X2dlbmRldiwKKwkJCQkJICAgIklsbGVnYWwgaG9zdCBzdGF0ZSB0cmFuc2l0aW9uIgorCQkJCQkgICAiJXMtPiVzXG4iLAorCQkJCQkgICBzY3NpX2hvc3Rfc3RhdGVfbmFtZShvbGRzdGF0ZSksCisJCQkJCSAgIHNjc2lfaG9zdF9zdGF0ZV9uYW1lKHN0YXRlKSkpOworCXJldHVybiAtRUlOVkFMOwogfQorRVhQT1JUX1NZTUJPTChzY3NpX2hvc3Rfc2V0X3N0YXRlKTsKIAogLyoqCiAgKiBzY3NpX3JlbW92ZV9ob3N0IC0gcmVtb3ZlIGEgc2NzaSBob3N0CkBAIC03NCwxMSArMTM0LDEzIEBACiAgKiovCiB2b2lkIHNjc2lfcmVtb3ZlX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7CisJZG93bigmc2hvc3QtPnNjYW5fbXV0ZXgpOworCXNjc2lfaG9zdF9zZXRfc3RhdGUoc2hvc3QsIFNIT1NUX0NBTkNFTCk7CisJdXAoJnNob3N0LT5zY2FuX211dGV4KTsKIAlzY3NpX2ZvcmdldF9ob3N0KHNob3N0KTsKLQlzY3NpX2hvc3RfY2FuY2VsKHNob3N0LCAwKTsKIAlzY3NpX3Byb2NfaG9zdF9ybShzaG9zdCk7CiAKLQlzZXRfYml0KFNIT1NUX0RFTCwgJnNob3N0LT5zaG9zdF9zdGF0ZSk7CisJc2NzaV9ob3N0X3NldF9zdGF0ZShzaG9zdCwgU0hPU1RfREVMKTsKIAogCXRyYW5zcG9ydF91bnJlZ2lzdGVyX2RldmljZSgmc2hvc3QtPnNob3N0X2dlbmRldik7CiAJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJnNob3N0LT5zaG9zdF9jbGFzc2Rldik7CkBAIC0xMTUsNyArMTc3LDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCi0Jc2V0X2JpdChTSE9TVF9BREQsICZzaG9zdC0+c2hvc3Rfc3RhdGUpOworCXNjc2lfaG9zdF9zZXRfc3RhdGUoc2hvc3QsIFNIT1NUX1JVTk5JTkcpOwogCWdldF9kZXZpY2Uoc2hvc3QtPnNob3N0X2dlbmRldi5wYXJlbnQpOwogCiAJZXJyb3IgPSBjbGFzc19kZXZpY2VfYWRkKCZzaG9zdC0+c2hvc3RfY2xhc3NkZXYpOwpAQCAtMTY0LDE1ICsyMjYsOCBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KGRldik7CiAJc3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LT5wYXJlbnQ7CiAKLQlpZiAoc2hvc3QtPmVoYW5kbGVyKSB7Ci0JCURFQ0xBUkVfQ09NUExFVElPTihzZW0pOwotCQlzaG9zdC0+ZWhfbm90aWZ5ID0gJnNlbTsKLQkJc2hvc3QtPmVoX2tpbGwgPSAxOwotCQl1cChzaG9zdC0+ZWhfd2FpdCk7Ci0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJnNlbSk7Ci0JCXNob3N0LT5laF9ub3RpZnkgPSBOVUxMOwotCX0KLQorCWlmIChzaG9zdC0+ZWhhbmRsZXIpCisJCWt0aHJlYWRfc3RvcChzaG9zdC0+ZWhhbmRsZXIpOwogCWlmIChzaG9zdC0+d29ya19xKQogCQlkZXN0cm95X3dvcmtxdWV1ZShzaG9zdC0+d29ya19xKTsKIApAQCAtMjAyLDcgKzI1Nyw2IEBACiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CiAJaW50IGdmcF9tYXNrID0gR0ZQX0tFUk5FTCwgcnZhbDsKLQlERUNMQVJFX0NPTVBMRVRJT04oY29tcGxldGUpOwogCiAJaWYgKHNodC0+dW5jaGVja2VkX2lzYV9kbWEgJiYgcHJpdnNpemUpCiAJCWdmcF9tYXNrIHw9IF9fR0ZQX0RNQTsKQEAgLTIyNiw2ICsyODAsNyBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJnNob3N0LT5kZWZhdWx0X2xvY2spOwogCXNjc2lfYXNzaWduX2xvY2soc2hvc3QsICZzaG9zdC0+ZGVmYXVsdF9sb2NrKTsKKwlzaG9zdC0+c2hvc3Rfc3RhdGUgPSBTSE9TVF9DUkVBVEVEOwogCUlOSVRfTElTVF9IRUFEKCZzaG9zdC0+X19kZXZpY2VzKTsKIAlJTklUX0xJU1RfSEVBRCgmc2hvc3QtPl9fdGFyZ2V0cyk7CiAJSU5JVF9MSVNUX0hFQUQoJnNob3N0LT5laF9jbWRfcSk7CkBAIC0zMDcsMTIgKzM2MiwxMiBAQAogCXNucHJpbnRmKHNob3N0LT5zaG9zdF9jbGFzc2Rldi5jbGFzc19pZCwgQlVTX0lEX1NJWkUsICJob3N0JWQiLAogCQkgIHNob3N0LT5ob3N0X25vKTsKIAotCXNob3N0LT5laF9ub3RpZnkgPSAmY29tcGxldGU7Ci0JcnZhbCA9IGtlcm5lbF90aHJlYWQoc2NzaV9lcnJvcl9oYW5kbGVyLCBzaG9zdCwgMCk7Ci0JaWYgKHJ2YWwgPCAwKQorCXNob3N0LT5laGFuZGxlciA9IGt0aHJlYWRfcnVuKHNjc2lfZXJyb3JfaGFuZGxlciwgc2hvc3QsCisJCQkic2NzaV9laF8lZCIsIHNob3N0LT5ob3N0X25vKTsKKwlpZiAoSVNfRVJSKHNob3N0LT5laGFuZGxlcikpIHsKKwkJcnZhbCA9IFBUUl9FUlIoc2hvc3QtPmVoYW5kbGVyKTsKIAkJZ290byBmYWlsX2Rlc3Ryb3lfZnJlZWxpc3Q7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmY29tcGxldGUpOwotCXNob3N0LT5laF9ub3RpZnkgPSBOVUxMOworCX0KIAogCXNjc2lfcHJvY19ob3N0ZGlyX2FkZChzaG9zdC0+aG9zdHQpOwogCXJldHVybiBzaG9zdDsKQEAgLTM4Miw3ICs0MzcsNyBAQAogICoqLwogc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0X2dldChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKLQlpZiAodGVzdF9iaXQoU0hPU1RfREVMLCAmc2hvc3QtPnNob3N0X3N0YXRlKSB8fAorCWlmICgoc2hvc3QtPnNob3N0X3N0YXRlID09IFNIT1NUX0RFTCkgfHwKIAkJIWdldF9kZXZpY2UoJnNob3N0LT5zaG9zdF9nZW5kZXYpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gc2hvc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtbWNhLmMgYi9kcml2ZXJzL3Njc2kvaWJtbWNhLmMKaW5kZXggYjVkYzM1My4uNmU1NGM3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libW1jYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pYm1tY2EuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWNhLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWNhLWxlZ2FjeS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYwppbmRleCAyY2IzYzgzLi41YjE0OTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYwpAQCAtODcsNyArODcsNyBAQAogc3RhdGljIGludCBpbml0X3RpbWVvdXQgPSA1Owogc3RhdGljIGludCBtYXhfcmVxdWVzdHMgPSA1MDsKIAotI2RlZmluZSBJQk1WU0NTSV9WRVJTSU9OICIxLjUuNiIKKyNkZWZpbmUgSUJNVlNDU0lfVkVSU0lPTiAiMS41LjciCiAKIE1PRFVMRV9ERVNDUklQVElPTigiSUJNIFZpcnR1YWwgU0NTSSIpOwogTU9EVUxFX0FVVEhPUigiRGF2ZSBCb3V0Y2hlciIpOwpAQCAtMTQ1LDYgKzE0NSw4IEBACiAJCQlzaXplb2YoKmV2dC0+eGZlcl9pdSkgKiBpOwogCQlldnQtPnhmZXJfaXUgPSBwb29sLT5pdV9zdG9yYWdlICsgaTsKIAkJZXZ0LT5ob3N0ZGF0YSA9IGhvc3RkYXRhOworCQlldnQtPmV4dF9saXN0ID0gTlVMTDsKKwkJZXZ0LT5leHRfbGlzdF90b2tlbiA9IDA7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNjEsOSArMTYzLDE2IEBACiAJCQkgICAgICAgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEpCiB7CiAJaW50IGksIGluX3VzZSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IHBvb2wtPnNpemU7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgcG9vbC0+c2l6ZTsgKytpKSB7CiAJCWlmIChhdG9taWNfcmVhZCgmcG9vbC0+ZXZlbnRzW2ldLmZyZWUpICE9IDEpCiAJCQkrK2luX3VzZTsKKwkJaWYgKHBvb2wtPmV2ZW50c1tpXS5leHRfbGlzdCkgeworCQkJZG1hX2ZyZWVfY29oZXJlbnQoaG9zdGRhdGEtPmRldiwKKwkJCQkgIFNHX0FMTCAqIHNpemVvZihzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IpLAorCQkJCSAgcG9vbC0+ZXZlbnRzW2ldLmV4dF9saXN0LAorCQkJCSAgcG9vbC0+ZXZlbnRzW2ldLmV4dF9saXN0X3Rva2VuKTsKKwkJfQorCX0KIAlpZiAoaW5fdXNlKQogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiaWJtdnNjc2k6IHJlbGVhc2luZyBldmVudCBwb29sIHdpdGggJWQgIgpAQCAtMjg2LDI0ICsyOTUsNDEgQEAKIAl9IGVsc2UgewogCQlpZiAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CiAJCQlzcnBfY21kLT5kYXRhX291dF9mb3JtYXQgPSBTUlBfSU5ESVJFQ1RfQlVGRkVSOwotCQkJc3JwX2NtZC0+ZGF0YV9vdXRfY291bnQgPSBudW1idWY7CisJCQlzcnBfY21kLT5kYXRhX291dF9jb3VudCA9CisJCQkJbnVtYnVmIDwgTUFYX0lORElSRUNUX0JVRlMgPworCQkJCQludW1idWY6IE1BWF9JTkRJUkVDVF9CVUZTOwogCQl9IGVsc2UgewogCQkJc3JwX2NtZC0+ZGF0YV9pbl9mb3JtYXQgPSBTUlBfSU5ESVJFQ1RfQlVGRkVSOwotCQkJc3JwX2NtZC0+ZGF0YV9pbl9jb3VudCA9IG51bWJ1ZjsKKwkJCXNycF9jbWQtPmRhdGFfaW5fY291bnQgPQorCQkJCW51bWJ1ZiA8IE1BWF9JTkRJUkVDVF9CVUZTID8KKwkJCQkJbnVtYnVmOiBNQVhfSU5ESVJFQ1RfQlVGUzsKIAkJfQogCX0KIH0KIAorc3RhdGljIHZvaWQgdW5tYXBfc2dfbGlzdChpbnQgbnVtX2VudHJpZXMsIAorCQlzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBtZW1vcnlfZGVzY3JpcHRvciAqbWQpCit7IAorCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyArK2kpIHsKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYsCisJCQltZFtpXS52aXJ0dWFsX2FkZHJlc3MsCisJCQltZFtpXS5sZW5ndGgsIERNQV9CSURJUkVDVElPTkFMKTsKKwl9Cit9CisKIC8qKgogICogdW5tYXBfY21kX2RhdGE6IC0gVW5tYXAgZGF0YSBwb2ludGVkIGluIHNycF9jbWQgYmFzZWQgb24gdGhlIGZvcm1hdAogICogQGNtZDoJc3JwX2NtZCB3aG9zZSBhZGRpdGlvbmFsX2RhdGEgbWVtYmVyIHdpbGwgYmUgdW5tYXBwZWQKICAqIEBkZXY6CWRldmljZSBmb3Igd2hpY2ggdGhlIG1lbW9yeSBpcyBtYXBwZWQKICAqCiAqLwotc3RhdGljIHZvaWQgdW5tYXBfY21kX2RhdGEoc3RydWN0IHNycF9jbWQgKmNtZCwgc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgdW5tYXBfY21kX2RhdGEoc3RydWN0IHNycF9jbWQgKmNtZCwKKwkJCSAgIHN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnRfc3RydWN0LAorCQkJICAgc3RydWN0IGRldmljZSAqZGV2KQogewotCWludCBpOwotCiAJaWYgKChjbWQtPmRhdGFfb3V0X2Zvcm1hdCA9PSBTUlBfTk9fQlVGRkVSKSAmJgogCSAgICAoY21kLT5kYXRhX2luX2Zvcm1hdCA9PSBTUlBfTk9fQlVGRkVSKSkKIAkJcmV0dXJuOwpAQCAtMzE4LDE1ICszNDQsMzQgQEAKIAkJCShzdHJ1Y3QgaW5kaXJlY3RfZGVzY3JpcHRvciAqKWNtZC0+YWRkaXRpb25hbF9kYXRhOwogCQlpbnQgbnVtX21hcHBlZCA9IGluZGlyZWN0LT5oZWFkLmxlbmd0aCAvIAogCQkJc2l6ZW9mKGluZGlyZWN0LT5saXN0WzBdKTsKLQkJZm9yIChpID0gMDsgaSA8IG51bV9tYXBwZWQ7ICsraSkgewotCQkJc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICpkYXRhID0gJmluZGlyZWN0LT5saXN0W2ldOwotCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsCi0JCQkJCSBkYXRhLT52aXJ0dWFsX2FkZHJlc3MsCi0JCQkJCSBkYXRhLT5sZW5ndGgsIERNQV9CSURJUkVDVElPTkFMKTsKKworCQlpZiAobnVtX21hcHBlZCA8PSBNQVhfSU5ESVJFQ1RfQlVGUykgeworCQkJdW5tYXBfc2dfbGlzdChudW1fbWFwcGVkLCBkZXYsICZpbmRpcmVjdC0+bGlzdFswXSk7CisJCQlyZXR1cm47CiAJCX0KKworCQl1bm1hcF9zZ19saXN0KG51bV9tYXBwZWQsIGRldiwgZXZ0X3N0cnVjdC0+ZXh0X2xpc3QpOwogCX0KIH0KIAorc3RhdGljIGludCBtYXBfc2dfbGlzdChpbnQgbnVtX2VudHJpZXMsIAorCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJICAgICAgIHN0cnVjdCBtZW1vcnlfZGVzY3JpcHRvciAqbWQpCit7CisJaW50IGk7CisJdTY0IHRvdGFsX2xlbmd0aCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7ICsraSkgeworCQlzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IgKmRlc2NyID0gbWQgKyBpOworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2VudHJ5ID0gJnNnW2ldOworCQlkZXNjci0+dmlydHVhbF9hZGRyZXNzID0gc2dfZG1hX2FkZHJlc3Moc2dfZW50cnkpOworCQlkZXNjci0+bGVuZ3RoID0gc2dfZG1hX2xlbihzZ19lbnRyeSk7CisJCWRlc2NyLT5tZW1vcnlfaGFuZGxlID0gMDsKKwkJdG90YWxfbGVuZ3RoICs9IHNnX2RtYV9sZW4oc2dfZW50cnkpOworIAl9CisJcmV0dXJuIHRvdGFsX2xlbmd0aDsKK30KKwogLyoqCiAgKiBtYXBfc2dfZGF0YTogLSBNYXBzIGRtYSBmb3IgYSBzY2F0dGVybGlzdCBhbmQgaW5pdGlhbGl6ZXMgZGVjcmlwdG9yIGZpZWxkcwogICogQGNtZDoJU2NzaV9DbW5kIHdpdGggdGhlIHNjYXR0ZXJsaXN0CkBAIC0zMzcsMTAgKzM4MiwxMSBAQAogICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MuCiAqLwogc3RhdGljIGludCBtYXBfc2dfZGF0YShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCSAgICAgICBzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0X3N0cnVjdCwKIAkJICAgICAgIHN0cnVjdCBzcnBfY21kICpzcnBfY21kLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAKLQlpbnQgaSwgc2dfbWFwcGVkOworCWludCBzZ19tYXBwZWQ7CiAJdTY0IHRvdGFsX2xlbmd0aCA9IDA7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IGNtZC0+cmVxdWVzdF9idWZmZXI7CiAJc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICpkYXRhID0KQEAgLTM2MywyNyArNDA5LDQ2IEBACiAJCXJldHVybiAxOwogCX0KIAotCWlmIChzZ19tYXBwZWQgPiBNQVhfSU5ESVJFQ1RfQlVGUykgeworCWlmIChzZ19tYXBwZWQgPiBTR19BTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAiaWJtdnNjc2k6IE1vcmUgdGhhbiAlZCBtYXBwZWQgc2cgZW50cmllcywgZ290ICVkXG4iLAotCQkgICAgICAgTUFYX0lORElSRUNUX0JVRlMsIHNnX21hcHBlZCk7CisJCSAgICAgICBTR19BTEwsIHNnX21hcHBlZCk7CiAJCXJldHVybiAwOwogCX0KIAogCWluZGlyZWN0LT5oZWFkLnZpcnR1YWxfYWRkcmVzcyA9IDA7CiAJaW5kaXJlY3QtPmhlYWQubGVuZ3RoID0gc2dfbWFwcGVkICogc2l6ZW9mKGluZGlyZWN0LT5saXN0WzBdKTsKIAlpbmRpcmVjdC0+aGVhZC5tZW1vcnlfaGFuZGxlID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgc2dfbWFwcGVkOyArK2kpIHsKLQkJc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICpkZXNjciA9ICZpbmRpcmVjdC0+bGlzdFtpXTsKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19lbnRyeSA9ICZzZ1tpXTsKLQkJZGVzY3ItPnZpcnR1YWxfYWRkcmVzcyA9IHNnX2RtYV9hZGRyZXNzKHNnX2VudHJ5KTsKLQkJZGVzY3ItPmxlbmd0aCA9IHNnX2RtYV9sZW4oc2dfZW50cnkpOwotCQlkZXNjci0+bWVtb3J5X2hhbmRsZSA9IDA7Ci0JCXRvdGFsX2xlbmd0aCArPSBzZ19kbWFfbGVuKHNnX2VudHJ5KTsKLQl9Ci0JaW5kaXJlY3QtPnRvdGFsX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKIAotCXJldHVybiAxOworCWlmIChzZ19tYXBwZWQgPD0gTUFYX0lORElSRUNUX0JVRlMpIHsKKwkJdG90YWxfbGVuZ3RoID0gbWFwX3NnX2xpc3Qoc2dfbWFwcGVkLCBzZywgJmluZGlyZWN0LT5saXN0WzBdKTsKKwkJaW5kaXJlY3QtPnRvdGFsX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogZ2V0IGluZGlyZWN0IHRhYmxlICovCisJaWYgKCFldnRfc3RydWN0LT5leHRfbGlzdCkgeworCQlldnRfc3RydWN0LT5leHRfbGlzdCA9KHN0cnVjdCBtZW1vcnlfZGVzY3JpcHRvciopCisJCQlkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCAKKwkJCQlTR19BTEwgKiBzaXplb2Yoc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yKSwKKwkJCQkmZXZ0X3N0cnVjdC0+ZXh0X2xpc3RfdG9rZW4sIDApOworCQlpZiAoIWV2dF9zdHJ1Y3QtPmV4dF9saXN0KSB7CisJCSAgICBwcmludGsoS0VSTl9FUlIKKwkJICAgCSJpYm12c2NzaTogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBpbmRpcmVjdCB0YWJsZVxuIik7CisJCQlyZXR1cm4gMDsKKwkJCQorCQl9CisJfQorCisJdG90YWxfbGVuZ3RoID0gbWFwX3NnX2xpc3Qoc2dfbWFwcGVkLCBzZywgZXZ0X3N0cnVjdC0+ZXh0X2xpc3QpOwkKKworCWluZGlyZWN0LT50b3RhbF9sZW5ndGggPSB0b3RhbF9sZW5ndGg7CisJaW5kaXJlY3QtPmhlYWQudmlydHVhbF9hZGRyZXNzID0gZXZ0X3N0cnVjdC0+ZXh0X2xpc3RfdG9rZW47CisJaW5kaXJlY3QtPmhlYWQubGVuZ3RoID0gc2dfbWFwcGVkICogc2l6ZW9mKGluZGlyZWN0LT5saXN0WzBdKTsKKwltZW1jcHkoaW5kaXJlY3QtPmxpc3QsIGV2dF9zdHJ1Y3QtPmV4dF9saXN0LAorCQlNQVhfSU5ESVJFQ1RfQlVGUyAqIHNpemVvZihzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IpKTsKKwkKKyAJcmV0dXJuIDE7CiB9CiAKIC8qKgpAQCAtNDI4LDYgKzQ5Myw3IEBACiAgKiBSZXR1cm5zIDEgb24gc3VjY2Vzcy4KICovCiBzdGF0aWMgaW50IG1hcF9kYXRhX2Zvcl9zcnBfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCQlzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0X3N0cnVjdCwKIAkJCQlzdHJ1Y3Qgc3JwX2NtZCAqc3JwX2NtZCwgc3RydWN0IGRldmljZSAqZGV2KQogewogCXN3aXRjaCAoY21kLT5zY19kYXRhX2RpcmVjdGlvbikgewpAQCAtNDUwLDcgKzUxNiw3IEBACiAJaWYgKCFjbWQtPnJlcXVlc3RfYnVmZmVyKQogCQlyZXR1cm4gMTsKIAlpZiAoY21kLT51c2Vfc2cpCi0JCXJldHVybiBtYXBfc2dfZGF0YShjbWQsIHNycF9jbWQsIGRldik7CisJCXJldHVybiBtYXBfc2dfZGF0YShjbWQsIGV2dF9zdHJ1Y3QsIHNycF9jbWQsIGRldik7CiAJcmV0dXJuIG1hcF9zaW5nbGVfZGF0YShjbWQsIHNycF9jbWQsIGRldik7CiB9CiAKQEAgLTQ4Niw2ICs1NTIsNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HIAogCQkgICAgICAgImlibXZzY3NpOiBXYXJuaW5nLCByZXF1ZXN0X2xpbWl0IGV4Y2VlZGVkXG4iKTsKIAkJdW5tYXBfY21kX2RhdGEoJmV2dF9zdHJ1Y3QtPml1LnNycC5jbWQsCisJCQkgICAgICAgZXZ0X3N0cnVjdCwKIAkJCSAgICAgICBob3N0ZGF0YS0+ZGV2KTsKIAkJZnJlZV9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sLCBldnRfc3RydWN0KTsKIAkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CkBAIC01MTMsNyArNTgwLDcgQEAKIAlyZXR1cm4gMDsKIAogIHNlbmRfZXJyb3I6Ci0JdW5tYXBfY21kX2RhdGEoJmV2dF9zdHJ1Y3QtPml1LnNycC5jbWQsIGhvc3RkYXRhLT5kZXYpOworCXVubWFwX2NtZF9kYXRhKCZldnRfc3RydWN0LT5pdS5zcnAuY21kLCBldnRfc3RydWN0LCBob3N0ZGF0YS0+ZGV2KTsKIAogCWlmICgoY21uZCA9IGV2dF9zdHJ1Y3QtPmNtbmQpICE9IE5VTEwpIHsKIAkJY21uZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwpAQCAtNTUxLDYgKzYxOCw3IEBACiAJCQkgICAgICAgcnNwLT5zZW5zZV9hbmRfcmVzcG9uc2VfZGF0YSwKIAkJCSAgICAgICByc3AtPnNlbnNlX2RhdGFfbGlzdF9sZW5ndGgpOwogCQl1bm1hcF9jbWRfZGF0YSgmZXZ0X3N0cnVjdC0+aXUuc3JwLmNtZCwgCisJCQkgICAgICAgZXZ0X3N0cnVjdCwgCiAJCQkgICAgICAgZXZ0X3N0cnVjdC0+aG9zdGRhdGEtPmRldik7CiAKIAkJaWYgKHJzcC0+ZG9vdmVyKQpAQCAtNTgzLDYgKzY1MSw3IEBACiB7CiAJc3RydWN0IHNycF9jbWQgKnNycF9jbWQ7CiAJc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2dF9zdHJ1Y3Q7CisJc3RydWN0IGluZGlyZWN0X2Rlc2NyaXB0b3IgKmluZGlyZWN0OwogCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0KIAkJKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKikmY21uZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKIAl1MTYgbHVuID0gbHVuX2Zyb21fZGV2KGNtbmQtPmRldmljZSk7CkBAIC01OTEsMTQgKzY2MCw2IEBACiAJaWYgKCFldnRfc3RydWN0KQogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKIAotCWluaXRfZXZlbnRfc3RydWN0KGV2dF9zdHJ1Y3QsCi0JCQkgIGhhbmRsZV9jbWRfcnNwLAotCQkJICBWSU9TUlBfU1JQX0ZPUk1BVCwKLQkJCSAgY21uZC0+dGltZW91dCk7Ci0KLQlldnRfc3RydWN0LT5jbW5kID0gY21uZDsKLQlldnRfc3RydWN0LT5jbW5kX2RvbmUgPSBkb25lOwotCiAJLyogU2V0IHVwIHRoZSBhY3R1YWwgU1JQIElVICovCiAJc3JwX2NtZCA9ICZldnRfc3RydWN0LT5pdS5zcnAuY21kOwogCW1lbXNldChzcnBfY21kLCAweDAwLCBzaXplb2YoKnNycF9jbWQpKTsKQEAgLTYwNiwxNyArNjY3LDI1IEBACiAJbWVtY3B5KHNycF9jbWQtPmNkYiwgY21uZC0+Y21uZCwgc2l6ZW9mKGNtbmQtPmNtbmQpKTsKIAlzcnBfY21kLT5sdW4gPSAoKHU2NCkgbHVuKSA8PCA0ODsKIAotCWlmICghbWFwX2RhdGFfZm9yX3NycF9jbWQoY21uZCwgc3JwX2NtZCwgaG9zdGRhdGEtPmRldikpIHsKKwlpZiAoIW1hcF9kYXRhX2Zvcl9zcnBfY21kKGNtbmQsIGV2dF9zdHJ1Y3QsIHNycF9jbWQsIGhvc3RkYXRhLT5kZXYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IGNvdWxkbid0IGNvbnZlcnQgY21kIHRvIHNycF9jbWRcbiIpOwogCQlmcmVlX2V2ZW50X3N0cnVjdCgmaG9zdGRhdGEtPnBvb2wsIGV2dF9zdHJ1Y3QpOwogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKIAl9CiAKKwlpbml0X2V2ZW50X3N0cnVjdChldnRfc3RydWN0LAorCQkJICBoYW5kbGVfY21kX3JzcCwKKwkJCSAgVklPU1JQX1NSUF9GT1JNQVQsCisJCQkgIGNtbmQtPnRpbWVvdXRfcGVyX2NvbW1hbmQvSFopOworCisJZXZ0X3N0cnVjdC0+Y21uZCA9IGNtbmQ7CisJZXZ0X3N0cnVjdC0+Y21uZF9kb25lID0gZG9uZTsKKwogCS8qIEZpeCB1cCBkbWEgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGl0c2VsZiAqLwotCWlmICgoc3JwX2NtZC0+ZGF0YV9vdXRfZm9ybWF0ID09IFNSUF9JTkRJUkVDVF9CVUZGRVIpIHx8Ci0JICAgIChzcnBfY21kLT5kYXRhX2luX2Zvcm1hdCA9PSBTUlBfSU5ESVJFQ1RfQlVGRkVSKSkgewotCQlzdHJ1Y3QgaW5kaXJlY3RfZGVzY3JpcHRvciAqaW5kaXJlY3QgPQotCQkgICAgKHN0cnVjdCBpbmRpcmVjdF9kZXNjcmlwdG9yICopc3JwX2NtZC0+YWRkaXRpb25hbF9kYXRhOworCWluZGlyZWN0ID0gKHN0cnVjdCBpbmRpcmVjdF9kZXNjcmlwdG9yICopc3JwX2NtZC0+YWRkaXRpb25hbF9kYXRhOworCWlmICgoKHNycF9jbWQtPmRhdGFfb3V0X2Zvcm1hdCA9PSBTUlBfSU5ESVJFQ1RfQlVGRkVSKSB8fAorCSAgICAoc3JwX2NtZC0+ZGF0YV9pbl9mb3JtYXQgPT0gU1JQX0lORElSRUNUX0JVRkZFUikpICYmCisJICAgIChpbmRpcmVjdC0+aGVhZC52aXJ0dWFsX2FkZHJlc3MgPT0gMCkpIHsKIAkJaW5kaXJlY3QtPmhlYWQudmlydHVhbF9hZGRyZXNzID0gZXZ0X3N0cnVjdC0+Y3JxLklVX2RhdGFfcHRyICsKIAkJICAgIG9mZnNldG9mKHN0cnVjdCBzcnBfY21kLCBhZGRpdGlvbmFsX2RhdGEpICsKIAkJICAgIG9mZnNldG9mKHN0cnVjdCBpbmRpcmVjdF9kZXNjcmlwdG9yLCBsaXN0KTsKQEAgLTgyNiwxMSArODk1LDEzIEBACiAJc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKnRtcF9ldnQsICpmb3VuZF9ldnQ7CiAJdW5pb24gdmlvc3JwX2l1IHNycF9yc3A7CiAJaW50IHJzcF9yYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiBsdW4gPSBsdW5fZnJvbV9kZXYoY21kLT5kZXZpY2UpOwogCiAJLyogRmlyc3QsIGZpbmQgdGhpcyBjb21tYW5kIGluIG91ciBzZW50IGxpc3Qgc28gd2UgY2FuIGZpZ3VyZQogCSAqIG91dCB0aGUgY29ycmVjdCB0YWcKIAkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJZm91bmRfZXZ0ID0gTlVMTDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9ldnQsICZob3N0ZGF0YS0+c2VudCwgbGlzdCkgewogCQlpZiAodG1wX2V2dC0+Y21uZCA9PSBjbWQpIHsKQEAgLTgzOSwxMSArOTEwLDE0IEBACiAJCX0KIAl9CiAKLQlpZiAoIWZvdW5kX2V2dCkgCisJaWYgKCFmb3VuZF9ldnQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJCXJldHVybiBGQUlMRUQ7CisJfQogCiAJZXZ0ID0gZ2V0X2V2ZW50X3N0cnVjdCgmaG9zdGRhdGEtPnBvb2wpOwogCWlmIChldnQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogZmFpbGVkIHRvIGFsbG9jYXRlIGFib3J0IGV2ZW50XG4iKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CkBAIC04NjcsNyArOTQxLDkgQEAKIAogCWV2dC0+c3luY19zcnAgPSAmc3JwX3JzcDsKIAlpbml0X2NvbXBsZXRpb24oJmV2dC0+Y29tcCk7Ci0JaWYgKGlibXZzY3NpX3NlbmRfc3JwX2V2ZW50KGV2dCwgaG9zdGRhdGEpICE9IDApIHsKKwlyc3BfcmMgPSBpYm12c2NzaV9zZW5kX3NycF9ldmVudChldnQsIGhvc3RkYXRhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlpZiAocnNwX3JjICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogZmFpbGVkIHRvIHNlbmQgYWJvcnQoKSBldmVudFxuIik7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQpAQCAtOTAxLDYgKzk3Nyw3IEBACiAJICogVGhlIGV2ZW50IGlzIG5vIGxvbmdlciBpbiBvdXIgbGlzdC4gIE1ha2Ugc3VyZSBpdCBkaWRuJ3QKIAkgKiBjb21wbGV0ZSB3aGlsZSB3ZSB3ZXJlIGFib3J0aW5nCiAJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCWZvdW5kX2V2dCA9IE5VTEw7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfZXZ0LCAmaG9zdGRhdGEtPnNlbnQsIGxpc3QpIHsKIAkJaWYgKHRtcF9ldnQtPmNtbmQgPT0gY21kKSB7CkBAIC05MTAsNiArOTg3LDcgQEAKIAl9CiAKIAlpZiAoZm91bmRfZXZ0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJCXByaW50ayhLRVJOX0lORk8KIAkJICAgICAgICJpYm12c2NzaTogYWJvcnRlZCB0YXNrIHRhZyAweCVseCBjb21wbGV0ZWRcbiIsCiAJCSAgICAgICB0c2tfbWdtdC0+bWFuYWdlZF90YXNrX3RhZyk7CkBAIC05MjIsOCArMTAwMCwxMCBAQAogCiAJY21kLT5yZXN1bHQgPSAoRElEX0FCT1JUIDw8IDE2KTsKIAlsaXN0X2RlbCgmZm91bmRfZXZ0LT5saXN0KTsKLQl1bm1hcF9jbWRfZGF0YSgmZm91bmRfZXZ0LT5pdS5zcnAuY21kLCBmb3VuZF9ldnQtPmhvc3RkYXRhLT5kZXYpOworCXVubWFwX2NtZF9kYXRhKCZmb3VuZF9ldnQtPml1LnNycC5jbWQsIGZvdW5kX2V2dCwKKwkJICAgICAgIGZvdW5kX2V2dC0+aG9zdGRhdGEtPmRldik7CiAJZnJlZV9ldmVudF9zdHJ1Y3QoJmZvdW5kX2V2dC0+aG9zdGRhdGEtPnBvb2wsIGZvdW5kX2V2dCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJYXRvbWljX2luYygmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQpOwogCXJldHVybiBTVUNDRVNTOwogfQpAQCAtOTQzLDEwICsxMDIzLDEzIEBACiAJc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKnRtcF9ldnQsICpwb3M7CiAJdW5pb24gdmlvc3JwX2l1IHNycF9yc3A7CiAJaW50IHJzcF9yYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiBsdW4gPSBsdW5fZnJvbV9kZXYoY21kLT5kZXZpY2UpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCWV2dCA9IGdldF9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sKTsKIAlpZiAoZXZ0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IGZhaWxlZCB0byBhbGxvY2F0ZSByZXNldCBldmVudFxuIik7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQpAQCAtOTY5LDcgKzEwNTIsOSBAQAogCiAJZXZ0LT5zeW5jX3NycCA9ICZzcnBfcnNwOwogCWluaXRfY29tcGxldGlvbigmZXZ0LT5jb21wKTsKLQlpZiAoaWJtdnNjc2lfc2VuZF9zcnBfZXZlbnQoZXZ0LCBob3N0ZGF0YSkgIT0gMCkgeworCXJzcF9yYyA9IGlibXZzY3NpX3NlbmRfc3JwX2V2ZW50KGV2dCwgaG9zdGRhdGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmIChyc3BfcmMgIT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBmYWlsZWQgdG8gc2VuZCByZXNldCBldmVudFxuIik7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQpAQCAtMTAwMiwxMiArMTA4NywxNCBAQAogCS8qIFdlIG5lZWQgdG8gZmluZCBhbGwgY29tbWFuZHMgZm9yIHRoaXMgTFVOIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4KIAkgKiByZXNwb25kZWQgdG8sIGFuZCBmYWlsIHRoZW0gd2l0aCBESURfUkVTRVQKIAkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRtcF9ldnQsIHBvcywgJmhvc3RkYXRhLT5zZW50LCBsaXN0KSB7CiAJCWlmICgodG1wX2V2dC0+Y21uZCkgJiYgKHRtcF9ldnQtPmNtbmQtPmRldmljZSA9PSBjbWQtPmRldmljZSkpIHsKIAkJCWlmICh0bXBfZXZ0LT5jbW5kKQogCQkJCXRtcF9ldnQtPmNtbmQtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOwogCQkJbGlzdF9kZWwoJnRtcF9ldnQtPmxpc3QpOwotCQkJdW5tYXBfY21kX2RhdGEoJnRtcF9ldnQtPml1LnNycC5jbWQsIHRtcF9ldnQtPmhvc3RkYXRhLT5kZXYpOworCQkJdW5tYXBfY21kX2RhdGEoJnRtcF9ldnQtPml1LnNycC5jbWQsIHRtcF9ldnQsCisJCQkJICAgICAgIHRtcF9ldnQtPmhvc3RkYXRhLT5kZXYpOwogCQkJZnJlZV9ldmVudF9zdHJ1Y3QoJnRtcF9ldnQtPmhvc3RkYXRhLT5wb29sLAogCQkJCQkJICAgdG1wX2V2dCk7CiAJCQlhdG9taWNfaW5jKCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCk7CkBAIC0xMDE3LDYgKzExMDQsNyBAQAogCQkJCXRtcF9ldnQtPmRvbmUodG1wX2V2dCk7CiAJCX0KIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIFNVQ0NFU1M7CiB9CiAKQEAgLTEwMzUsNiArMTEyMyw3IEBACiAJCWlmICh0bXBfZXZ0LT5jbW5kKSB7CiAJCQl0bXBfZXZ0LT5jbW5kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKIAkJCXVubWFwX2NtZF9kYXRhKCZ0bXBfZXZ0LT5pdS5zcnAuY21kLCAKKwkJCQkgICAgICAgdG1wX2V2dCwJCiAJCQkJICAgICAgIHRtcF9ldnQtPmhvc3RkYXRhLT5kZXYpOwogCQkJaWYgKHRtcF9ldnQtPmNtbmRfZG9uZSkKIAkJCQl0bXBfZXZ0LT5jbW5kX2RvbmUodG1wX2V2dC0+Y21uZCk7CkBAIC0xMzM5LDcgKzE0MjgsNyBAQAogCS5jbWRfcGVyX2x1biA9IDE2LAogCS5jYW5fcXVldWUgPSAxLAkJLyogVXBkYXRlZCBhZnRlciBTUlBfTE9HSU4gKi8KIAkudGhpc19pZCA9IC0xLAotCS5zZ190YWJsZXNpemUgPSBNQVhfSU5ESVJFQ1RfQlVGUywKKwkuc2dfdGFibGVzaXplID0gU0dfQUxMLAogCS51c2VfY2x1c3RlcmluZyA9IEVOQUJMRV9DTFVTVEVSSU5HLAogCS5zaG9zdF9hdHRycyA9IGlibXZzY3NpX2F0dHJzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5oIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmgKaW5kZXggMTAzMGI3MC4uOGJlYzA0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmgKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmgKQEAgLTY4LDYgKzY4LDggQEAKIAl2b2lkICgqY21uZF9kb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKTsKIAlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOwogCXVuaW9uIHZpb3NycF9pdSAqc3luY19zcnA7CisJc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICpleHRfbGlzdDsKKwlkbWFfYWRkcl90IGV4dF9saXN0X3Rva2VuOwogfTsKIAogLyogYSBwb29sIG9mIGV2ZW50IHN0cnVjdHMgZm9yIHVzZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMgYi9kcml2ZXJzL3Njc2kvbGliYXRhLWNvcmUuYwppbmRleCBkZWU0YjEyLi41Y2M1M2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL3Njc2kvbGliYXRhLWNvcmUuYwpAQCAtNzUsNiArNzUsMTAgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX3VuaXF1ZV9pZCA9IDE7CiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmF0YV93cTsKIAoraW50IGF0YXBpX2VuYWJsZWQgPSAwOworbW9kdWxlX3BhcmFtKGF0YXBpX2VuYWJsZWQsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF0YXBpX2VuYWJsZWQsICJFbmFibGUgZGlzY292ZXJ5IG9mIEFUQVBJIGRldmljZXMgKDA9b2ZmLCAxPW9uKSIpOworCiBNT0RVTEVfQVVUSE9SKCJKZWZmIEdhcnppayIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJMaWJyYXJ5IG1vZHVsZSBmb3IgQVRBIGRldmljZXMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTI1MjcsNyArMjUzMSw3IEBACiAgKglAYXA6IHBvcnQgdG8gcmVhZC93cml0ZQogICoJQGJ1ZjogZGF0YSBidWZmZXIKICAqCUBidWZsZW46IGJ1ZmZlciBsZW5ndGgKLSAqCUBkb193cml0ZTogcmVhZC93cml0ZQorICoJQHdyaXRlX2RhdGE6IHJlYWQvd3JpdGUKICAqCiAgKglUcmFuc2ZlciBkYXRhIGZyb20vdG8gdGhlIGRldmljZSBkYXRhIHJlZ2lzdGVyIGJ5IE1NSU8uCiAgKgpAQCAtMjU3Myw3ICsyNTc3LDcgQEAKICAqCUBhcDogcG9ydCB0byByZWFkL3dyaXRlCiAgKglAYnVmOiBkYXRhIGJ1ZmZlcgogICoJQGJ1ZmxlbjogYnVmZmVyIGxlbmd0aAotICoJQGRvX3dyaXRlOiByZWFkL3dyaXRlCisgKglAd3JpdGVfZGF0YTogcmVhZC93cml0ZQogICoKICAqCVRyYW5zZmVyIGRhdGEgZnJvbS90byB0aGUgZGV2aWNlIGRhdGEgcmVnaXN0ZXIgYnkgUElPLgogICoKQEAgLTQyMDAsNiArNDIwNCwxNSBAQAogCiAKIAorI2lmZGVmIENPTkZJR19QQ0kKKwordm9pZCBhdGFfcGNpX2hvc3Rfc3RvcCAoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGhvc3Rfc2V0LT5kZXYpOworCisJcGNpX2lvdW5tYXAocGRldiwgaG9zdF9zZXQtPm1taW9fYmFzZSk7Cit9CisKIC8qKgogICoJYXRhX3BjaV9pbml0X25hdGl2ZV9tb2RlIC0gSW5pdGlhbGl6ZSBuYXRpdmUtbW9kZSBkcml2ZXIKICAqCUBwZGV2OiAgcGNpIGRldmljZSB0byBiZSBpbml0aWFsaXplZApAQCAtNDIxMiw3ICs0MjI1LDYgQEAKICAqCWF0YV9wcm9iZV9lbnQgc3RydWN0dXJlIHNob3VsZCB0aGVuIGJlIGZyZWVkIHdpdGgga2ZyZWUoKS4KICAqLwogCi0jaWZkZWYgQ09ORklHX1BDSQogc3RydWN0IGF0YV9wcm9iZV9lbnQgKgogYXRhX3BjaV9pbml0X25hdGl2ZV9tb2RlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqKnBvcnQpCiB7CkBAIC00NTk1LDYgKzQ2MDcsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogRVhQT1JUX1NZTUJPTF9HUEwocGNpX3Rlc3RfY29uZmlnX2JpdHMpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9ob3N0X3N0b3ApOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9pbml0X25hdGl2ZV9tb2RlKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfaW5pdF9vbmUpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9yZW1vdmVfb25lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJhdGEtc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1zY3NpLmMKaW5kZXggMzQ2ZWIzNi4uMTA0ZmQ5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1zY3NpLmMKQEAgLTE0NzAsMTAgKzE0NzAsMTAgQEAKIAlpZiAodW5saWtlbHkoIWF0YV9kZXZfcHJlc2VudChkZXYpKSkKIAkJcmV0dXJuIE5VTEw7CiAKLSNpZm5kZWYgQVRBX0VOQUJMRV9BVEFQSQotCWlmICh1bmxpa2VseShkZXYtPmNsYXNzID09IEFUQV9ERVZfQVRBUEkpKQotCQlyZXR1cm4gTlVMTDsKLSNlbmRpZgorCWlmICghYXRhcGlfZW5hYmxlZCkgeworCQlpZiAodW5saWtlbHkoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQVBJKSkKKwkJCXJldHVybiBOVUxMOworCX0KIAogCXJldHVybiBkZXY7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliYXRhLmggYi9kcml2ZXJzL3Njc2kvbGliYXRhLmgKaW5kZXggODA5YzYzNGEuLmQ2MDhiM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJhdGEuaAorKysgYi9kcml2ZXJzL3Njc2kvbGliYXRhLmgKQEAgLTM4LDYgKzM4LDcgQEAKIH07CiAKIC8qIGxpYmF0YS1jb3JlLmMgKi8KK2V4dGVybiBpbnQgYXRhcGlfZW5hYmxlZDsKIGV4dGVybiBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKmF0YV9xY19uZXdfaW5pdChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAogCQkJCSAgICAgIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgYXRhX3FjX2ZyZWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKaW5kZXggM2JiODJhYS4uYWRiOTU2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaApAQCAtMzQyLDkgKzM0Miw2IEBACiAjZGVmaW5lIFZQRF9NQVNLICAgICAgICAgICAgMHhmICAgICAgICAgLyogbWFzayBmb3IgYW55IHZwZCBkYXRhICovCiAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBlbHNfdG1vZnVuYzsKLQotCXZvaWQgKmxpbmtfc3RhdHM7Ci0KIAkvKgogCSAqIHN0YXQgIGNvdW50ZXJzCiAJICovCkBAIC0zNzAsNiArMzY3LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVidWZMaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgY3Ryc3BidWZsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgcm5pZHJzcGJ1Zmxpc3Q7CisKKwlzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzIGxpbmtfc3RhdHM7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYXR0ci5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKaW5kZXggM2NlYTkyOC4uMGUwODlhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KQEAgLTk4OCw4ICs5ODksNyBAQAogewogCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IChzdHJ1Y3QgbHBmY19oYmEgKilzaG9zdC0+aG9zdGRhdGFbMF07CiAJc3RydWN0IGxwZmNfc2xpICpwc2xpID0gJnBoYmEtPnNsaTsKLQlzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICpocyA9Ci0JCQkoc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqKXBoYmEtPmxpbmtfc3RhdHM7CisJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqaHMgPSAmcGhiYS0+bGlua19zdGF0czsKIAlMUEZDX01CT1hRX3QgKnBtYm94cTsKIAlNQUlMQk9YX3QgKnBtYjsKIAlpbnQgcmM9MDsKQEAgLTEwMjAsNiArMTAyMCw4IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAorCW1lbXNldChocywgMCwgc2l6ZW9mIChzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzKSk7CisKIAlocy0+dHhfZnJhbWVzID0gcG1iLT51bi52YXJSZFN0YXR1cy54bWl0RnJhbWVDbnQ7CiAJaHMtPnR4X3dvcmRzID0gKHBtYi0+dW4udmFyUmRTdGF0dXMueG1pdEJ5dGVDbnQgKiAyNTYpOwogCWhzLT5yeF9mcmFtZXMgPSBwbWItPnVuLnZhclJkU3RhdHVzLnJjdkZyYW1lQ250OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jdC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jdC5jCmluZGV4IDc4YWRlZTQuLjEyODBmMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3QuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMKQEAgLTI3LDggKzI3LDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oPgogCiAjaW5jbHVkZSAibHBmY19ody5oIgogI2luY2x1ZGUgImxwZmNfc2xpLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYwppbmRleCAyYjFjOTU3Li42M2NhZjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKaW5kZXggMjMzOTAxZS4uMGE4MjY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CkBAIC0xMTM1LDYgKzExMzYsOCBAQAogCXN3aXRjaChsaXN0KSB7CiAJY2FzZSBOTFBfTk9fTElTVDogLyogTm8gbGlzdCwganVzdCByZW1vdmUgaXQgKi8KIAkJbHBmY19ubHBfcmVtb3ZlKHBoYmEsIG5scCk7CisJCS8qIGFzIG5vZGUgcmVtb3ZlZCAtIHN0b3AgZnVydGhlciB0cmFuc3BvcnQgY2FsbHMgKi8KKwkJcnBvcnRfZGVsID0gbm9uZTsKIAkJYnJlYWs7CiAJY2FzZSBOTFBfVU5VU0VEX0xJU1Q6CiAJCXNwaW5fbG9ja19pcnEocGhiYS0+aG9zdC0+aG9zdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKaW5kZXggMzRkNDE2ZC4uNmYzY2I1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oPgpAQCAtMTMzOSwxNCArMTM0MCwxMiBAQAogCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIExQRkNfRFJJVkVSX05BTUUpKQogCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKIAotCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmxwZmNfdGVtcGxhdGUsCi0JCQlzaXplb2YgKHN0cnVjdCBscGZjX2hiYSkgKyBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKTsKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZscGZjX3RlbXBsYXRlLCBzaXplb2YgKHN0cnVjdCBscGZjX2hiYSkpOwogCWlmICghaG9zdCkKIAkJZ290byBvdXRfcmVsZWFzZV9yZWdpb25zOwogCiAJcGhiYSA9IChzdHJ1Y3QgbHBmY19oYmEqKWhvc3QtPmhvc3RkYXRhOwogCW1lbXNldChwaGJhLCAwLCBzaXplb2YgKHN0cnVjdCBscGZjX2hiYSkpOwotCXBoYmEtPmxpbmtfc3RhdHMgPSAodm9pZCAqKSZwaGJhWzFdOwogCXBoYmEtPmhvc3QgPSBob3N0OwogCiAJcGhiYS0+ZmNfZmxhZyB8PSBGQ19MT0FESU5HOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYwppbmRleCBjMjdjZjk0Li43M2ViODlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYwpAQCAtMjMsNiArMjMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKwogI2luY2x1ZGUgImxwZmNfaHcuaCIKICNpbmNsdWRlICJscGZjX3NsaS5oIgogI2luY2x1ZGUgImxwZmNfZGlzYy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tZW0uYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWVtLmMKaW5kZXggYTVjZmI2NC4uMGFiYTEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tZW0uYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21lbS5jCkBAIC0yMyw2ICsyMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorCiAjaW5jbHVkZSAibHBmY19ody5oIgogI2luY2x1ZGUgImxwZmNfc2xpLmgiCiAjaW5jbHVkZSAibHBmY19kaXNjLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25wb3J0ZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ucG9ydGRpc2MuYwppbmRleCA0NWRjMDIxLi45YjM1ZWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25wb3J0ZGlzYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKaW5kZXggMTdlNDk3NC4uYjVhZDE4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKQEAgLTQwLDExICs0MCw2IEBACiAjZGVmaW5lIExQRkNfUkVTRVRfV0FJVCAgMgogI2RlZmluZSBMUEZDX0FCT1JUX1dBSVQgIDIKIAotc3RhdGljIGlubGluZSB2b2lkIGxwZmNfcHV0X2x1bihzdHJ1Y3QgZmNwX2NtbmQgKmZjbWQsIHVuc2lnbmVkIGludCBsdW4pCi17Ci0JZmNtZC0+ZmNwTHVuTHNsID0gMDsKLQlmY21kLT5mY3BMdW5Nc2wgPSBzd2FiMTYoKHVpbnQxNl90KWx1bik7Ci19CiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIGEgc2NzaSBidWZmZXIsIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgbmVjZXNzYXJ5CkBAIC0yMzgsNiArMjMzLDggQEAKIAkJYnBsLT50dXMuZi5iZGVTaXplID0gc2NzaV9jbW5kLT5yZXF1ZXN0X2J1ZmZsZW47CiAJCWlmIChkYXRhZGlyID09IERNQV9UT19ERVZJQ0UpCiAJCQlicGwtPnR1cy5mLmJkZUZsYWdzID0gMDsKKwkJZWxzZQorCQkJYnBsLT50dXMuZi5iZGVGbGFncyA9IEJVRkZfVVNFX1JDVjsKIAkJYnBsLT50dXMudyA9IGxlMzJfdG9fY3B1KGJwbC0+dHVzLncpOwogCQludW1fYmRlID0gMTsKIAkJYnBsKys7CkBAIC0yNDUsOCArMjQyLDExIEBACiAKIAkvKgogCSAqIEZpbmlzaCBpbml0aWFsaXppbmcgdGhvc2UgSU9DQiBmaWVsZHMgdGhhdCBhcmUgZGVwZW5kZW50IG9uIHRoZQotCSAqIHNjc2lfY21uZCByZXF1ZXN0X2J1ZmZlcgorCSAqIHNjc2lfY21uZCByZXF1ZXN0X2J1ZmZlci4gIE5vdGUgdGhhdCB0aGUgYmRlU2l6ZSBpcyBleHBsaWNpdGx5CisJICogcmVpbml0aWFsaXplZCBzaW5jZSBhbGwgaW9jYiBtZW1vcnkgcmVzb3VyY2VzIGFyZSB1c2VkIG1hbnkgdGltZXMKKwkgKiBmb3IgdHJhbnNtaXQsIHJlY2VpdmUsIGFuZCBjb250aW51YXRpb24gYnBsJ3MuCiAJICovCisJaW9jYl9jbWQtPnVuLmZjcGk2NC5iZGwuYmRlU2l6ZSA9ICgyICogc2l6ZW9mIChzdHJ1Y3QgdWxwX2JkZTY0KSk7CiAJaW9jYl9jbWQtPnVuLmZjcGk2NC5iZGwuYmRlU2l6ZSArPQogCQkobnVtX2JkZSAqIHNpemVvZiAoc3RydWN0IHVscF9iZGU2NCkpOwogCWlvY2JfY21kLT51bHBCZGVDb3VudCA9IDE7CkBAIC00NDUsOCArNDQ1LDExIEBACiAJaW50IGRhdGFkaXIgPSBzY3NpX2NtbmQtPnNjX2RhdGFfZGlyZWN0aW9uOwogCiAJbHBmY19jbWQtPmZjcF9yc3AtPnJzcFNuc0xlbiA9IDA7CisJLyogY2xlYXIgdGFzayBtYW5hZ2VtZW50IGJpdHMgKi8KKwlscGZjX2NtZC0+ZmNwX2NtbmQtPmZjcENudGwyID0gMDsKIAotCWxwZmNfcHV0X2x1bihscGZjX2NtZC0+ZmNwX2NtbmQsIGxwZmNfY21kLT5wQ21kLT5kZXZpY2UtPmx1bik7CisJaW50X3RvX3Njc2lsdW4obHBmY19jbWQtPnBDbWQtPmRldmljZS0+bHVuLAorCQkJJmxwZmNfY21kLT5mY3BfY21uZC0+ZmNwX2x1bik7CiAKIAltZW1jcHkoJmZjcF9jbW5kLT5mY3BDZGJbMF0sIHNjc2lfY21uZC0+Y21uZCwgMTYpOwogCkBAIC01NDUsNyArNTQ4LDggQEAKIAlwaW9jYiA9ICZwaW9jYnEtPmlvY2I7CiAKIAlmY3BfY21uZCA9IGxwZmNfY21kLT5mY3BfY21uZDsKLQlscGZjX3B1dF9sdW4obHBmY19jbWQtPmZjcF9jbW5kLCBscGZjX2NtZC0+cENtZC0+ZGV2aWNlLT5sdW4pOworCWludF90b19zY3NpbHVuKGxwZmNfY21kLT5wQ21kLT5kZXZpY2UtPmx1biwKKwkJCSZscGZjX2NtZC0+ZmNwX2NtbmQtPmZjcF9sdW4pOwogCWZjcF9jbW5kLT5mY3BDbnRsMiA9IHRhc2tfbWdtdF9jbWQ7CiAKIAlwaW9jYi0+dWxwQ29tbWFuZCA9IENNRF9GQ1BfSUNNTkQ2NF9DUjsKQEAgLTc0Niw2ICs3NTAsMTAgQEAKIAkJCWNtbmQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX05PX0NPTk5FQ1QsIDApOwogCQkJZ290byBvdXRfZmFpbF9jb21tYW5kOwogCQl9CisJCWVsc2UgaWYgKG5kbHAtPm5scF9zdGF0ZSA9PSBOTFBfU1RFX05QUl9OT0RFKSB7CisJCQljbW5kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9CVVNfQlVTWSwgMCk7CisJCQlnb3RvIG91dF9mYWlsX2NvbW1hbmQ7CisJCX0KIAkJLyoKIAkJICogVGhlIGRldmljZSBpcyBtb3N0IGxpa2VseSByZWNvdmVyZWQgYW5kIHRoZSBkcml2ZXIKIAkJICogbmVlZHMgYSBiaXQgbW9yZSB0aW1lIHRvIGZpbmlzaC4gIEFzayB0aGUgbWlkbGF5ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmgKaW5kZXggMGZkOWJhMS4uYWNkNjRjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmgKQEAgLTc4LDE4ICs3OCw3IEBACiB9OwogCiBzdHJ1Y3QgZmNwX2NtbmQgewotCXVpbnQzMl90IGZjcEx1bk1zbDsJLyogbW9zdCAgc2lnbmlmaWNhbnQgbHVuIHdvcmQgKDMyIGJpdHMpICovCi0JdWludDMyX3QgZmNwTHVuTHNsOwkvKiBsZWFzdCBzaWduaWZpY2FudCBsdW4gd29yZCAoMzIgYml0cykgKi8KLQkvKiAjIG9mIGJpdHMgdG8gc2hpZnQgbHVuIGlkIHRvIGVuZCB1cCBpbiByaWdodAotCSAqIHBheWxvYWQgd29yZCwgbGl0dGxlIGVuZGlhbiA9IDgsIGJpZyA9IDE2LgotCSAqLwotI2lmZGVmIF9fQklHX0VORElBTgotI2RlZmluZSBGQ19MVU5fU0hJRlQgICAgICAgICAxNgotI2RlZmluZSBGQ19BRERSX01PREVfU0hJRlQgICAyNAotI2Vsc2UJLyogIF9fTElUVExFX0VORElBTiAqLwotI2RlZmluZSBGQ19MVU5fU0hJRlQgICAgICAgICA4Ci0jZGVmaW5lIEZDX0FERFJfTU9ERV9TSElGVCAgIDAKLSNlbmRpZgorCXN0cnVjdCBzY3NpX2x1biAgZmNwX2x1bjsKIAogCXVpbnQ4X3QgZmNwQ250bDA7CS8qIEZDUF9DTlRMIGJ5dGUgMCAocmVzZXJ2ZWQpICovCiAJdWludDhfdCBmY3BDbnRsMTsJLyogRkNQX0NOVEwgYnl0ZSAxIHRhc2sgY29kZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCmluZGV4IDE3NzU1MDguLmU3NGUyMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwpAQCAtMjQsOSArMjQsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CiAKICNpbmNsdWRlICJscGZjX2h3LmgiCiAjaW5jbHVkZSAibHBmY19zbGkuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKaW5kZXggNDdkZWE0OC4uN2U2NzQ3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqIGluY2x1ZGVkIHdpdGggdGhpcyBwYWNrYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMUEZDX0RSSVZFUl9WRVJTSU9OICI4LjAuMjkiCisjZGVmaW5lIExQRkNfRFJJVkVSX1ZFUlNJT04gIjguMC4zMCIKIAogI2RlZmluZSBMUEZDX0RSSVZFUl9OQU1FICJscGZjIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVzaC5jIGIvZHJpdmVycy9zY3NpL21lc2guYwppbmRleCBmZjE5MzMyLi5hNDg1N2RiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVzaC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZXNoLmMKQEAgLTE3NjYsNyArMTc2Niw3IEBACiAJc3RydWN0IG1lc2hfc3RhdGUgKm1zID0gKHN0cnVjdCBtZXNoX3N0YXRlICopbWFjaW9fZ2V0X2RydmRhdGEobWRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChzdGF0ZSA9PSBtZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUgfHwgc3RhdGUgPCAyKQorCWlmIChzdGF0ZS5ldmVudCA9PSBtZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgfHwgc3RhdGUuZXZlbnQgPCAyKQogCQlyZXR1cm4gMDsKIAogCXNjc2lfYmxvY2tfcmVxdWVzdHMobXMtPmhvc3QpOwpAQCAtMTc5MSw3ICsxNzkxLDcgQEAKIAlzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMgPSAoc3RydWN0IG1lc2hfc3RhdGUgKiltYWNpb19nZXRfZHJ2ZGF0YShtZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKG1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9PSAwKQorCWlmIChtZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pCiAJCXJldHVybiAwOwogCiAJc2V0X21lc2hfcG93ZXIobXMsIDEpOwpAQCAtMTgwMiw3ICsxODAyLDcgQEAKIAllbmFibGVfaXJxKG1zLT5tZXNoaW50cik7CiAJc2NzaV91bmJsb2NrX3JlcXVlc3RzKG1zLT5ob3N0KTsKIAotCW1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IDA7CisJbWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID0gUE1fRVZFTlRfT047CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9vc3N0LmMgYi9kcml2ZXJzL3Njc2kvb3NzdC5jCmluZGV4IDg5YTRhMDYuLjNmMmYyNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9vc3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL29zc3QuYwpAQCAtMTM3Nyw3ICsxMzc3LDcgQEAKIAkKIAkJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0IHx8ICFTUnBudCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBGYWlsZWQgdG8gcmVhZCBmcmFtZSBiYWNrIGZyb20gT25TdHJlYW0gYnVmZmVyXG4iLCBuYW1lKTsKLQkJCXZmcmVlKCh2b2lkICopYnVmZmVyKTsKKwkJCXZmcmVlKGJ1ZmZlcik7CiAJCQkqYVNScG50ID0gU1JwbnQ7CiAJCQlyZXR1cm4gKC1FSU8pOwogCQl9CkBAIC0xNDE5LDcgKzE0MTksNyBAQAogCiAJCQlpZiAobmV3X2ZyYW1lID4gZnJhbWUgKyAxMDAwKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBGYWlsZWQgdG8gZmluZCB3cml0YWJsZSB0YXBlIG1lZGlhXG4iLCBuYW1lKTsKLQkJCQl2ZnJlZSgodm9pZCAqKWJ1ZmZlcik7CisJCQkJdmZyZWUoYnVmZmVyKTsKIAkJCQlyZXR1cm4gKC1FSU8pOwogCQkJfQogCQkJaWYgKCBpID49IG5mcmFtZXMgKyBwZW5kaW5nICkgYnJlYWs7CkBAIC0xNTAwLDcgKzE1MDAsNyBAQAogCQkJICAgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSAgICAgICAgID09ICAwICYmCiAJCQkgICAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTNdICAgICAgICAgPT0gIDIpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOkU6IFZvbHVtZSBvdmVyZmxvdyBpbiB3cml0ZSBlcnJvciByZWNvdmVyeVxuIiwgbmFtZSk7Ci0JCQkJdmZyZWUoKHZvaWQgKilidWZmZXIpOworCQkJCXZmcmVlKGJ1ZmZlcik7CiAJCQkJcmV0dXJuICgtRUlPKTsJCQkvKiBoaXQgZW5kIG9mIHRhcGUgPSBmYWlsICovCiAJCQl9CiAJCQlpID0gKChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzNdIDw8IDI0KSB8CkBAIC0xNTI1LDcgKzE1MjUsNyBAQAogCX0KIAlpZiAoIXBlbmRpbmcpCiAJCW9zc3RfY29weV90b19idWZmZXIoU1RwLT5idWZmZXIsIHApOwkvKiBzbyBidWZmZXIgY29udGVudCA9PSBhdCBlbnRyeSBpbiBhbGwgY2FzZXMgKi8KLQl2ZnJlZSgodm9pZCAqKWJ1ZmZlcik7CisJdmZyZWUoYnVmZmVyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTg1Miw3ICs1ODUyLDcgQEAKIAkJCW9zX3Njc2lfdGFwZXNbaV0gPSBOVUxMOwogCQkJb3NzdF9ucl9kZXYtLTsKIAkJCXdyaXRlX3VubG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKLQkJCWlmICh0cG50LT5oZWFkZXJfY2FjaGUgIT0gTlVMTCkgdmZyZWUodHBudC0+aGVhZGVyX2NhY2hlKTsKKwkJCXZmcmVlKHRwbnQtPmhlYWRlcl9jYWNoZSk7CiAJCQlpZiAodHBudC0+YnVmZmVyKSB7CiAJCQkJbm9ybWFsaXplX2J1ZmZlcih0cG50LT5idWZmZXIpOwogCQkJCWtmcmVlKHRwbnQtPmJ1ZmZlcik7CkBAIC01ODk2LDggKzU4OTYsNyBAQAogCQlmb3IgKGk9MDsgaSA8IG9zc3RfbWF4X2RldjsgKytpKSB7CiAJCQlpZiAoIShTVHAgPSBvc19zY3NpX3RhcGVzW2ldKSkgY29udGludWU7CiAJCQkvKiBUaGlzIGlzIGRlZmVuc2l2ZSwgc3VwcG9zZWQgdG8gaGFwcGVuIGR1cmluZyBkZXRhY2ggKi8KLQkJCWlmIChTVHAtPmhlYWRlcl9jYWNoZSkKLQkJCQl2ZnJlZShTVHAtPmhlYWRlcl9jYWNoZSk7CisJCQl2ZnJlZShTVHAtPmhlYWRlcl9jYWNoZSk7CiAJCQlpZiAoU1RwLT5idWZmZXIpIHsKIAkJCQlub3JtYWxpemVfYnVmZmVyKFNUcC0+YnVmZmVyKTsKIAkJCQlrZnJlZShTVHAtPmJ1ZmZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGx1dG8uYyBiL2RyaXZlcnMvc2NzaS9wbHV0by5jCmluZGV4IDYyMzA4MmQuLmM4OWRhN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbHV0by5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbHV0by5jCkBAIC05NSw4ICs5NSw3IEBACiAJaW50IGksIHJldHJ5LCBucGx1dG9zOwogCWZjX2NoYW5uZWwgKmZjOwogCVNjc2lfRGV2aWNlIGRldjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBmY190aW1lciA9Ci0JCVRJTUVSX0lOSVRJQUxJWkVSKHBsdXRvX2RldGVjdF90aW1lb3V0LCAwLCAwKTsKKwlERUZJTkVfVElNRVIoZmNfdGltZXIsIHBsdXRvX2RldGVjdF90aW1lb3V0LCAwLCAwKTsKIAogCXRwbnQtPnByb2NfbmFtZSA9ICJwbHV0byI7CiAJZmNzY291bnQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTEyODAuYyBiL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKaW5kZXggYjk5MzY1Mi4uNjM3ZmI2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTEyODAuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCkBAIC05OTYsNyArOTk2LDYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEFCT1JUX0RFVklDRToKLQkJaGEtPmZsYWdzLmluX3Jlc2V0ID0gMTsKIAkJaWYgKHFsYTEyODBfdmVyYm9zZSkKIAkJCXByaW50ayhLRVJOX0lORk8KIAkJCSAgICAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBRdWV1ZWluZyBhYm9ydCBkZXZpY2UgIgpAQCAtMTAxMCw3ICsxMDA5LDYgQEAKIAkJCXByaW50ayhLRVJOX0lORk8KIAkJCSAgICAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBRdWV1ZWluZyBkZXZpY2UgcmVzZXQgIgogCQkJICAgICAgICJjb21tYW5kLlxuIiwgaGEtPmhvc3Rfbm8sIGJ1cywgdGFyZ2V0LCBsdW4pOwotCQloYS0+ZmxhZ3MuaW5fcmVzZXQgPSAxOwogCQlpZiAocWxhMTI4MF9kZXZpY2VfcmVzZXQoaGEsIGJ1cywgdGFyZ2V0KSA9PSAwKQogCQkJcmVzdWx0ID0gU1VDQ0VTUzsKIAkJYnJlYWs7CkBAIC0xMDE5LDcgKzEwMTcsNiBAQAogCQlpZiAocWxhMTI4MF92ZXJib3NlKQogCQkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MCglbGQ6JWQpOiBJc3N1aW5nIEJVUyAiCiAJCQkgICAgICAgIkRFVklDRSBSRVNFVFxuIiwgaGEtPmhvc3Rfbm8sIGJ1cyk7Ci0JCWhhLT5mbGFncy5pbl9yZXNldCA9IDE7CiAJCWlmIChxbGExMjgwX2J1c19yZXNldChoYSwgYnVzID09IDApKQogCQkJcmVzdWx0ID0gU1VDQ0VTUzsKIApAQCAtMTA0Nyw3ICsxMDQ0LDYgQEAKIAogCWlmICghbGlzdF9lbXB0eSgmaGEtPmRvbmVfcSkpCiAJCXFsYTEyODBfZG9uZShoYSk7Ci0JaGEtPmZsYWdzLmluX3Jlc2V0ID0gMDsKIAogCS8qIElmIHdlIGRpZG4ndCBtYW5hZ2UgdG8gaXNzdWUgdGhlIGFjdGlvbiwgb3Igd2UgaGF2ZSBubwogCSAqIGNvbW1hbmQgdG8gd2FpdCBmb3IsIGV4aXQgaGVyZSAqLwpAQCAtMTI2OSw2ICsxMjY1LDIyIEBACiAJcmV0dXJuIHFsYTEyODBfYmlvc3BhcmFtKGRpc2stPmRldmljZSwgTlVMTCwgZGlzay0+Y2FwYWNpdHksIGdlb20pOwogfQogI2VuZGlmCisgCisvKiBkaXNhYmxlIHJpc2MgYW5kIGhvc3QgaW50ZXJydXB0cyAqLworc3RhdGljIGlubGluZSB2b2lkCitxbGExMjgwX2Rpc2FibGVfaW50cnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCVdSVF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+aWN0cmwsIDApOworCVJEX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5pY3RybCk7CS8qIFBDSSBQb3N0ZWQgV3JpdGUgZmx1c2ggKi8KK30KKworLyogZW5hYmxlIHJpc2MgYW5kIGhvc3QgaW50ZXJydXB0cyAqLworc3RhdGljIGlubGluZSB2b2lkCitxbGExMjgwX2VuYWJsZV9pbnRycyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJV1JUX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5pY3RybCwgKElTUF9FTl9JTlQgfCBJU1BfRU5fUklTQykpOworCVJEX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5pY3RybCk7CS8qIFBDSSBQb3N0ZWQgV3JpdGUgZmx1c2ggKi8KK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBxbGExMjgwX2ludHJfaGFuZGxlcgpAQCAtMTI5MCw3ICsxMzAyLDcgQEAKIAloYS0+aXNyX2NvdW50Kys7CiAJcmVnID0gaGEtPmlvYmFzZTsKIAotCVdSVF9SRUdfV09SRCgmcmVnLT5pY3RybCwgMCk7CS8qIGRpc2FibGUgb3VyIGludGVycnVwdC4gKi8KKwlxbGExMjgwX2Rpc2FibGVfaW50cnMoaGEpOwogCiAJZGF0YSA9IHFsYTEyODBfZGVib3VuY2VfcmVnaXN0ZXIoJnJlZy0+aXN0YXR1cyk7CiAJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KQEAgLTEzMDMsOCArMTMxNSw3IEBACiAKIAlzcGluX3VubG9jayhIT1NUX0xPQ0spOwogCi0JLyogZW5hYmxlIG91ciBpbnRlcnJ1cHQuICovCi0JV1JUX1JFR19XT1JEKCZyZWctPmljdHJsLCAoSVNQX0VOX0lOVCB8IElTUF9FTl9SSVNDKSk7CisJcWxhMTI4MF9lbmFibGVfaW50cnMoaGEpOwogCiAJTEVBVkVfSU5UUigicWxhMTI4MF9pbnRyX2hhbmRsZXIiKTsKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKQEAgLTEzMTcsNyArMTMyOCw3IEBACiAJdWludDhfdCBtcjsKIAl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKIAlzdHJ1Y3QgbnZyYW0gKm52OwotCWludCBzdGF0dXM7CisJaW50IHN0YXR1cywgbHVuOwogCiAJbnYgPSAmaGEtPm52cmFtOwogCkBAIC0xMzI1LDI0ICsxMzM2LDM4IEBACiAKIAkvKiBTZXQgVGFyZ2V0IFBhcmFtZXRlcnMuICovCiAJbWJbMF0gPSBNQkNfU0VUX1RBUkdFVF9QQVJBTUVURVJTOwotCW1iWzFdID0gKHVpbnQxNl90KSAoYnVzID8gdGFyZ2V0IHwgQklUXzcgOiB0YXJnZXQpOwotCW1iWzFdIDw8PSA4OwotCi0JbWJbMl0gPSAobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5jIDw8IDgpOworCW1iWzFdID0gKHVpbnQxNl90KSgoYnVzID8gdGFyZ2V0IHwgQklUXzcgOiB0YXJnZXQpIDw8IDgpOworCW1iWzJdID0gbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5yZW5lZ290aWF0ZV9vbl9lcnJvciA8PCA4OworCW1iWzJdIHw9IG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuc3RvcF9xdWV1ZV9vbl9jaGVjayA8PCA5OworCW1iWzJdIHw9IG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuYXV0b19yZXF1ZXN0X3NlbnNlIDw8IDEwOworCW1iWzJdIHw9IG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIudGFnX3F1ZXVpbmcgPDwgMTE7CisJbWJbMl0gfD0gbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5lbmFibGVfc3luYyA8PCAxMjsKKwltYlsyXSB8PSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmVuYWJsZV93aWRlIDw8IDEzOworCW1iWzJdIHw9IG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIucGFyaXR5X2NoZWNraW5nIDw8IDE0OworCW1iWzJdIHw9IG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZGlzY29ubmVjdF9hbGxvd2VkIDw8IDE1OwogCiAJaWYgKElTX0lTUDF4MTYwKGhhKSkgewogCQltYlsyXSB8PSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLmVuYWJsZV9wcHIgPDwgNTsKLQkJbWJbM10gPQkobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmZsYWdzLmZsYWdzMXgxNjAuc3luY19vZmZzZXQgPDwgOCkgfAotCQkJIG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5zeW5jX3BlcmlvZDsKKwkJbWJbM10gPQkobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmZsYWdzLmZsYWdzMXgxNjAuc3luY19vZmZzZXQgPDwgOCk7CiAJCW1iWzZdID0JKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MucHByX29wdGlvbnMgPDwgOCkgfAogCQkJIG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MucHByX2J1c193aWR0aDsKIAkJbXIgfD0gQklUXzY7CiAJfSBlbHNlIHsKLQkJbWJbM10gPQkobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmZsYWdzLmZsYWdzMXg4MC5zeW5jX29mZnNldCA8PCA4KSB8Ci0JCQkgbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnN5bmNfcGVyaW9kOworCQltYlszXSA9CShudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDgwLnN5bmNfb2Zmc2V0IDw8IDgpOwogCX0KKwltYlszXSB8PSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uc3luY19wZXJpb2Q7CiAKLQlzdGF0dXMgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgbXIsICZtYlswXSk7CisJc3RhdHVzID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIG1yLCBtYik7CisKKwkvKiBTZXQgRGV2aWNlIFF1ZXVlIFBhcmFtZXRlcnMuICovCisJZm9yIChsdW4gPSAwOyBsdW4gPCBNQVhfTFVOUzsgbHVuKyspIHsKKwkJbWJbMF0gPSBNQkNfU0VUX0RFVklDRV9RVUVVRTsKKwkJbWJbMV0gPSAodWludDE2X3QpKChidXMgPyB0YXJnZXQgfCBCSVRfNyA6IHRhcmdldCkgPDwgOCk7CisJCW1iWzFdIHw9IGx1bjsKKwkJbWJbMl0gPSBudi0+YnVzW2J1c10ubWF4X3F1ZXVlX2RlcHRoOworCQltYlszXSA9IG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5leGVjdXRpb25fdGhyb3R0bGU7CisJCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgMHgwZiwgbWIpOworCX0KIAogCWlmIChzdGF0dXMpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2koJWxkOiVpOiVpKTogIgpAQCAtMTM4OSwxOSArMTQxNCwxOSBAQAogCX0KIAogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IDB4MDIwNTAwCi0JbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jID0gZGV2aWNlLT5zZHRyOwotCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfd2lkZSA9IGRldmljZS0+d2R0cjsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmVuYWJsZV9zeW5jID0gZGV2aWNlLT5zZHRyOworCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZW5hYmxlX3dpZGUgPSBkZXZpY2UtPndkdHI7CiAJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBwcl8xeDE2MC5mbGFncy5lbmFibGVfcHByID0gZGV2aWNlLT5wcHI7CiAjZW5kaWYKIAogCWlmIChkcml2ZXJfc2V0dXAubm9fc3luYyB8fAogCSAgICAoZHJpdmVyX3NldHVwLnN5bmNfbWFzayAmJgogCSAgICAgKH5kcml2ZXJfc2V0dXAuc3luY19tYXNrICYgKDEgPDwgdGFyZ2V0KSkpKQotCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3N5bmMgPSAwOworCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmVuYWJsZV9zeW5jID0gMDsKIAlpZiAoZHJpdmVyX3NldHVwLm5vX3dpZGUgfHwKIAkgICAgKGRyaXZlcl9zZXR1cC53aWRlX21hc2sgJiYKIAkgICAgICh+ZHJpdmVyX3NldHVwLndpZGVfbWFzayAmICgxIDw8IHRhcmdldCkpKSkKLQkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV93aWRlID0gMDsKKwkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5lbmFibGVfd2lkZSA9IDA7CiAJaWYgKElTX0lTUDF4MTYwKGhhKSkgewogCQlpZiAoZHJpdmVyX3NldHVwLm5vX3BwciB8fAogCQkgICAgKGRyaXZlcl9zZXR1cC5wcHJfbWFzayAmJgpAQCAtMTQxMCw3ICsxNDM1LDcgQEAKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShIT1NUX0xPQ0ssIGZsYWdzKTsKLQlpZiAobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jKQorCWlmIChudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmVuYWJsZV9zeW5jKQogCQlzdGF0dXMgPSBxbGExMjgwX3NldF90YXJnZXRfcGFyYW1ldGVycyhoYSwgYnVzLCB0YXJnZXQpOwogCXFsYTEyODBfZ2V0X3RhcmdldF9wYXJhbWV0ZXJzKGhhLCBkZXZpY2UpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoSE9TVF9MT0NLLCBmbGFncyk7CkBAIC0xNDQ4LDcgKzE0NzMsNiBAQAogICoKICAqIElucHV0OgogICogICAgICBoYSAgICAgICAgICAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCi0gKiAgICAgIGRvbmVfcSAgICAgICA9IGRvbmUgcXVldWUuCiAgKi8KIHN0YXRpYyB2b2lkCiBxbGExMjgwX2RvbmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQpAQCAtMTUyMiw3ICsxNTQ2LDcgQEAKIAlpbnQgaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CiAJdWludDE2X3QgY29tcF9zdGF0dXMgPSBsZTE2X3RvX2NwdShzdHMtPmNvbXBfc3RhdHVzKTsKIAl1aW50MTZfdCBzdGF0ZV9mbGFncyA9IGxlMTZfdG9fY3B1KHN0cy0+c3RhdGVfZmxhZ3MpOwotCXVpbnQxNl90IHJlc2lkdWFsX2xlbmd0aCA9IGxlMTZfdG9fY3B1KHN0cy0+cmVzaWR1YWxfbGVuZ3RoKTsKKwl1aW50MTZfdCByZXNpZHVhbF9sZW5ndGggPSBsZTMyX3RvX2NwdShzdHMtPnJlc2lkdWFsX2xlbmd0aCk7CiAJdWludDE2X3Qgc2NzaV9zdGF0dXMgPSBsZTE2X3RvX2NwdShzdHMtPnNjc2lfc3RhdHVzKTsKICNpZiBERUJVR19RTEExMjgwX0lOVFIKIAlzdGF0aWMgY2hhciAqcmVhc29uW10gPSB7CkBAIC0xNTgyLDcgKzE2MDYsNyBAQAogCiAJY2FzZSBDU19EQVRBX09WRVJSVU46CiAJCWRwcmludGsoMiwgIkRhdGEgb3ZlcnJ1biAweCV4XG4iLCByZXNpZHVhbF9sZW5ndGgpOwotCQlkcHJpbnRrKDIsICJxbGExMjgwX2lzcjogcmVzcG9uc2UgcGFja2V0IGRhdGFcbiIpOworCQlkcHJpbnRrKDIsICJxbGExMjgwX3JldHVybl9zdGF0dXM6IHJlc3BvbnNlIHBhY2tldCBkYXRhXG4iKTsKIAkJcWxhMTI4MF9kdW1wX2J1ZmZlcigyLCAoY2hhciAqKXN0cywgUkVTUE9OU0VfRU5UUllfU0laRSk7CiAJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOwogCQlicmVhazsKQEAgLTE2MTcsNDAgKzE2NDEsNiBAQAogLyogICAgICAgICAgICAgICAgUUxvZ2ljIElTUDEyODAgSGFyZHdhcmUgU3VwcG9ydCBGdW5jdGlvbnMuICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotIC8qCi0gICogcWxhMjEwMF9lbmFibGVfaW50cnMKLSAgKiBxbGEyMTAwX2Rpc2FibGVfaW50cnMKLSAgKgotICAqIElucHV0OgotICAqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCi0gICoKLSAgKiBSZXR1cm5zOgotICAqICAgICAgTm9uZQotICAqLwotc3RhdGljIGlubGluZSB2b2lkCi1xbGExMjgwX2VuYWJsZV9pbnRycyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCi17Ci0Jc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqcmVnOwotCi0JcmVnID0gaGEtPmlvYmFzZTsKLQkvKiBlbmFibGUgcmlzYyBhbmQgaG9zdCBpbnRlcnJ1cHRzICovCi0JV1JUX1JFR19XT1JEKCZyZWctPmljdHJsLCAoSVNQX0VOX0lOVCB8IElTUF9FTl9SSVNDKSk7Ci0JUkRfUkVHX1dPUkQoJnJlZy0+aWN0cmwpOwkvKiBQQ0kgUG9zdGVkIFdyaXRlIGZsdXNoICovCi0JaGEtPmZsYWdzLmludHNfZW5hYmxlZCA9IDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotcWxhMTI4MF9kaXNhYmxlX2ludHJzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWc7Ci0KLQlyZWcgPSBoYS0+aW9iYXNlOwotCS8qIGRpc2FibGUgcmlzYyBhbmQgaG9zdCBpbnRlcnJ1cHRzICovCi0JV1JUX1JFR19XT1JEKCZyZWctPmljdHJsLCAwKTsKLQlSRF9SRUdfV09SRCgmcmVnLT5pY3RybCk7CS8qIFBDSSBQb3N0ZWQgV3JpdGUgZmx1c2ggKi8KLQloYS0+ZmxhZ3MuaW50c19lbmFibGVkID0gMDsKLX0KLQogLyoKICAqIHFsYTEyODBfaW5pdGlhbGl6ZV9hZGFwdGVyCiAgKiAgICAgIEluaXRpYWxpemUgYm9hcmQuCkBAIC0xNjc5LDcgKzE2NjksNiBAQAogCWhhLT5mbGFncy5yZXNldF9hY3RpdmUgPSAwOwogCWhhLT5mbGFncy5hYm9ydF9pc3BfYWN0aXZlID0gMDsKIAotCWhhLT5mbGFncy5pbnRzX2VuYWJsZWQgPSAwOwogI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfSUE2NF9TR0lfU04yKQogCWlmIChpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJzY3NpKCVsaSk6IEVuYWJsaW5nIFNOMiBQQ0kgRE1BICIKQEAgLTE3NTgsNjkgKzE3NDcsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLQotLyoKLSAqIElTUCBGaXJtd2FyZSBUZXN0Ci0gKiAgICAgIENoZWNrcyBpZiBwcmVzZW50IHZlcnNpb24gb2YgUklTQyBmaXJtd2FyZSBpcyBvbGRlciB0aGFuCi0gKiAgICAgIGRyaXZlciBmaXJtd2FyZS4KLSAqCi0gKiBJbnB1dDoKLSAqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCi0gKgotICogUmV0dXJuczoKLSAqICAgICAgMCA9IGZpcm13YXJlIGRvZXMgbm90IG5lZWQgdG8gYmUgbG9hZGVkLgotICovCi1zdGF0aWMgaW50Ci1xbGExMjgwX2lzcF9maXJtd2FyZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCi17Ci0Jc3RydWN0IG52cmFtICpudiA9IChzdHJ1Y3QgbnZyYW0gKikgaGEtPnJlc3BvbnNlX3Jpbmc7Ci0JaW50IHN0YXR1cyA9IDA7CQkvKiBkZyAyLzI3IGFsd2F5cyBsb2FkcyBSSVNDICovCi0JdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07Ci0KLQlFTlRFUigicWxhMTI4MF9pc3BfZmlybXdhcmUiKTsKLQotCWRwcmludGsoMSwgInNjc2koJWxpKTogRGV0ZXJtaW5pbmcgaWYgUklTQyBpcyBsb2FkZWRcbiIsIGhhLT5ob3N0X25vKTsKLQotCS8qIEJhZCBOVlJBTSBkYXRhLCBsb2FkIFJJU0MgY29kZS4gKi8KLQlpZiAoIWhhLT5udnJhbV92YWxpZCkgewotCQloYS0+ZmxhZ3MuZGlzYWJsZV9yaXNjX2NvZGVfbG9hZCA9IDA7Ci0JfSBlbHNlCi0JCWhhLT5mbGFncy5kaXNhYmxlX3Jpc2NfY29kZV9sb2FkID0KLQkJCW52LT5jbnRyX2ZsYWdzXzEuZGlzYWJsZV9sb2FkaW5nX3Jpc2NfY29kZTsKLQotCWlmIChoYS0+ZmxhZ3MuZGlzYWJsZV9yaXNjX2NvZGVfbG9hZCkgewotCQlkcHJpbnRrKDMsICJxbGExMjgwX2lzcF9maXJtd2FyZTogVGVsbGluZyBSSVNDIHRvIHZlcmlmeSAiCi0JCQkiY2hlY2tzdW0gb2YgbG9hZGVkIEJJT1MgY29kZS5cbiIpOwotCi0JCS8qIFZlcmlmeSBjaGVja3N1bSBvZiBsb2FkZWQgUklTQyBjb2RlLiAqLwotCQltYlswXSA9IE1CQ19WRVJJRllfQ0hFQ0tTVU07Ci0JCS8qIG1iWzFdID0gcWwxMl9yaXNjX2NvZGVfYWRkcjAxOyAqLwotCQltYlsxXSA9ICpxbDEyODBfYm9hcmRfdGJsW2hhLT5kZXZudW1dLmZ3c3RhcnQ7Ci0KLQkJaWYgKCEoc3RhdHVzID0KLQkJICAgICAgcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8xIHwgQklUXzAsICZtYlswXSkpKSB7Ci0JCQkvKiBTdGFydCBmaXJtd2FyZSBleGVjdXRpb24uICovCi0JCQlkcHJpbnRrKDMsICJxbGExMjgwX2lzcF9maXJtd2FyZTogU3RhcnRuZyBGL1cgIgotCQkJCSJleGVjdXRpb24uXG4iKTsKLQotCQkJbWJbMF0gPSBNQkNfRVhFQ1VURV9GSVJNV0FSRTsKLQkJCS8qIG1iWzFdID0gcWwxMl9yaXNjX2NvZGVfYWRkcjAxOyAqLwotCQkJbWJbMV0gPSAqcWwxMjgwX2JvYXJkX3RibFtoYS0+ZGV2bnVtXS5md3N0YXJ0OwotCQkJcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8xIHwgQklUXzAsICZtYlswXSk7Ci0JCX0gZWxzZQotCQkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MDogUklTQyBjaGVja3N1bSBmYWlsZWQuXG4iKTsKLQl9IGVsc2UgewotCQlkcHJpbnRrKDEsICJxbGExMjgwOiBOVlJBTSBjb25maWd1cmVkIHRvIGxvYWQgUklTQyBsb2FkLlxuIik7Ci0JCXN0YXR1cyA9IDE7Ci0JfQotCi0JaWYgKHN0YXR1cykKLQkJZHByaW50aygyLCAicWxhMTI4MF9pc3BfZmlybXdhcmU6ICoqKiogTG9hZCBSSVNDIGNvZGUgKioqKlxuIik7Ci0KLQlMRUFWRSgicWxhMTI4MF9pc3BfZmlybXdhcmUiKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCiAvKgogICogQ2hpcCBkaWFnbm9zdGljcwogICogICAgICBUZXN0IGNoaXAgZm9yIHByb3BlciBvcGVyYXRpb24uCkBAIC0yMDA2LDcgKzE5MzIsNyBAQAogCQkJIiVkLCVkKDB4JXgpXG4iLAogCQkJcmlzY19jb2RlX2FkZHJlc3MsIGNudCwgbnVtLCByaXNjX2FkZHJlc3MpOwogCQlmb3IoaSA9IDA7IGkgPCBjbnQ7IGkrKykKLQkJCSgodWludDE2X3QgKiloYS0+cmVxdWVzdF9yaW5nKVtpXSA9CisJCQkoKF9fbGUxNiAqKWhhLT5yZXF1ZXN0X3JpbmcpW2ldID0KIAkJCQljcHVfdG9fbGUxNihyaXNjX2NvZGVfYWRkcmVzc1tpXSk7CiAKIAkJbWJbMF0gPSBNQkNfTE9BRF9SQU07CkBAIC0yMDg1LDcgKzIwMTEsNyBAQAogCW1iWzFdID0gKnFsMTI4MF9ib2FyZF90YmxbaGEtPmRldm51bV0uZndzdGFydDsKIAllcnIgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgbWIpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpKCVsaSk6IEZhaWxlZCBjaGVja3N1bVxuIiwgaGEtPmhvc3Rfbm8pOworCQlwcmludGsoS0VSTl9FUlIgInNjc2koJWxpKTogUklTQyBjaGVja3N1bSBmYWlsZWQuXG4iLCBoYS0+aG9zdF9ubyk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0yMTA1LDE0ICsyMDMxLDcgQEAKIHN0YXRpYyBpbnQKIHFsYTEyODBfbG9hZF9maXJtd2FyZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7Ci0JaW50IGVyciA9IC1FTk9ERVY7Ci0KLQkvKiBJZiBmaXJtd2FyZSBuZWVkcyB0byBiZSBsb2FkZWQgKi8KLQlpZiAoIXFsYTEyODBfaXNwX2Zpcm13YXJlKGhhKSkgewotCQlwcmludGsoS0VSTl9FUlIgInNjc2koJWxpKTogaXNwX2Zpcm13YXJlKCkgZmFpbGVkIVxuIiwKLQkJCQloYS0+aG9zdF9ubyk7Ci0JCWdvdG8gb3V0OwotCX0KKwlpbnQgZXJyOwogCiAJZXJyID0gcWxhMTI4MF9jaGlwX2RpYWcoaGEpOwogCWlmIChlcnIpCkBAIC0yMjQ2LDE3ICsyMTY1LDE3IEBACiB7CiAJc3RydWN0IG52cmFtICpudiA9ICZoYS0+bnZyYW07CiAKLQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYucmVuZWdvdGlhdGVfb25fZXJyb3IgPSAxOwotCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5hdXRvX3JlcXVlc3Rfc2Vuc2UgPSAxOwotCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi50YWdfcXVldWluZyA9IDE7Ci0JbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jID0gMTsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLnJlbmVnb3RpYXRlX29uX2Vycm9yID0gMTsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmF1dG9fcmVxdWVzdF9zZW5zZSA9IDE7CisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci50YWdfcXVldWluZyA9IDE7CisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5lbmFibGVfc3luYyA9IDE7CiAjaWYgMQkvKiBTb21lIFNDU0kgUHJvY2Vzc29ycyBkbyBub3Qgc2VlbSB0byBsaWtlIHRoaXMgKi8KLQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3dpZGUgPSAxOworCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZW5hYmxlX3dpZGUgPSAxOwogI2VuZGlmCi0JbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLnBhcml0eV9jaGVja2luZyA9IDE7Ci0JbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmRpc2Nvbm5lY3RfYWxsb3dlZCA9IDE7CiAJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmV4ZWN1dGlvbl90aHJvdHRsZSA9CiAJCW52LT5idXNbYnVzXS5tYXhfcXVldWVfZGVwdGggLSAxOworCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIucGFyaXR5X2NoZWNraW5nID0gMTsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmRpc2Nvbm5lY3RfYWxsb3dlZCA9IDE7CiAKIAlpZiAoSVNfSVNQMXgxNjAoaGEpKSB7CiAJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4MTYwLmRldmljZV9lbmFibGUgPSAxOwpAQCAtMjI4NCw5ICsyMjAzLDkgQEAKIAkvKiBudi0+Y250cl9mbGFnc18xLmRpc2FibGVfbG9hZGluZ19yaXNjX2NvZGUgPSAxOyAqLwogCW52LT5maXJtd2FyZV9mZWF0dXJlLmYuZW5hYmxlX2Zhc3RfcG9zdGluZyA9IDE7CiAJbnYtPmZpcm13YXJlX2ZlYXR1cmUuZi5kaXNhYmxlX3N5bmNocm9ub3VzX2JhY2tvZmYgPSAxOwotCW52LT50ZXJtaW5hdGlvbi5mLnNjc2lfYnVzXzBfY29udHJvbCA9IDM7Ci0JbnYtPnRlcm1pbmF0aW9uLmYuc2NzaV9idXNfMV9jb250cm9sID0gMzsKLQludi0+dGVybWluYXRpb24uZi5hdXRvX3Rlcm1fc3VwcG9ydCA9IDE7CisJbnYtPnRlcm1pbmF0aW9uLnNjc2lfYnVzXzBfY29udHJvbCA9IDM7CisJbnYtPnRlcm1pbmF0aW9uLnNjc2lfYnVzXzFfY29udHJvbCA9IDM7CisJbnYtPnRlcm1pbmF0aW9uLmF1dG9fdGVybV9zdXBwb3J0ID0gMTsKIAogCS8qCiAJICogU2V0IGRlZmF1bHQgRklGTyBtYWdpYyAtIFdoYXQgYXBwcm9wcmlhdGUgdmFsdWVzIHdvdWxkIGJlIGhlcmUKQEAgLTIyOTYsNyArMjIxNSwxMiBAQAogCSAqIGhlYWRlciBmaWxlIHByb3ZpZGVkIGJ5IFFMb2dpYyBzZWVtcyB0byBiZSBib2d1cyBvciBpbmNvbXBsZXRlCiAJICogYXQgYmVzdC4KIAkgKi8KLQludi0+aXNwX2NvbmZpZy5jID0gSVNQX0NGRzFfQkVOQUJ8SVNQX0NGRzFfRjEyODsKKwludi0+aXNwX2NvbmZpZy5idXJzdF9lbmFibGUgPSAxOworCWlmIChJU19JU1AxMDQwKGhhKSkKKwkJbnYtPmlzcF9jb25maWcuZmlmb190aHJlc2hvbGQgfD0gMzsKKwllbHNlCisJCW52LT5pc3BfY29uZmlnLmZpZm9fdGhyZXNob2xkIHw9IDQ7CisKIAlpZiAoSVNfSVNQMXgxNjAoaGEpKQogCQludi0+aXNwX3BhcmFtZXRlciA9IDB4MDE7IC8qIGZhc3QgbWVtb3J5IGVuYWJsZSAqLwogCkBAIC0yMzI3LDY2ICsyMjUxLDUzIEBACiAJc3RydWN0IG52cmFtICpudiA9ICZoYS0+bnZyYW07CiAJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CiAJaW50IHN0YXR1cywgbHVuOworCXVpbnQxNl90IGZsYWc7CiAKIAkvKiBTZXQgVGFyZ2V0IFBhcmFtZXRlcnMuICovCiAJbWJbMF0gPSBNQkNfU0VUX1RBUkdFVF9QQVJBTUVURVJTOwotCW1iWzFdID0gKHVpbnQxNl90KSAoYnVzID8gdGFyZ2V0IHwgQklUXzcgOiB0YXJnZXQpOwotCW1iWzFdIDw8PSA4OworCW1iWzFdID0gKHVpbnQxNl90KSgoYnVzID8gdGFyZ2V0IHwgQklUXzcgOiB0YXJnZXQpIDw8IDgpOwogCiAJLyoKLQkgKiBEbyBub3QgZW5hYmxlIHdpZGUsIHN5bmMsIGFuZCBwcHIgZm9yIHRoZSBpbml0aWFsCi0JICogSU5RVUlSWSBydW4uIFdlIGVuYWJsZSB0aGlzIGxhdGVyIGlmIHdlIGRldGVybWluZQotCSAqIHRoZSB0YXJnZXQgYWN0dWFsbHkgc3VwcG9ydHMgaXQuCisJICogRG8gbm90IGVuYWJsZSBzeW5jIGFuZCBwcHIgZm9yIHRoZSBpbml0aWFsIElOUVVJUlkgcnVuLiBXZQorCSAqIGVuYWJsZSB0aGlzIGxhdGVyIGlmIHdlIGRldGVybWluZSB0aGUgdGFyZ2V0IGFjdHVhbGx5CisJICogc3VwcG9ydHMgaXQuCiAJICovCi0JbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLgotCQlhdXRvX3JlcXVlc3Rfc2Vuc2UgPSAxOwotCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi4KLQkJc3RvcF9xdWV1ZV9vbl9jaGVjayA9IDA7Ci0KLQlpZiAoSVNfSVNQMXgxNjAoaGEpKQotCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLgotCQkJZmxhZ3MuZW5hYmxlX3BwciA9IDA7Ci0KLQkvKgotCSAqIE5vIHN5bmMsIHdpZGUsIGV0Yy4gd2hpbGUgcHJvYmluZwotCSAqLwotCW1iWzJdID0gKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuYyA8PCA4KSAmCi0JCX4oVFBfU1lOQyAvKnwgVFBfV0lERSB8IFRQX1BQUiovKTsKKwltYlsyXSA9IChUUF9SRU5FR09USUFURSB8IFRQX0FVVE9fUkVRVUVTVF9TRU5TRSB8IFRQX1RBR0dFRF9RVUVVRQorCQkgfCBUUF9XSURFIHwgVFBfUEFSSVRZIHwgVFBfRElTQ09OTkVDVCk7CiAKIAlpZiAoSVNfSVNQMXgxNjAoaGEpKQogCQltYlszXSA9CW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4MTYwLnN5bmNfb2Zmc2V0IDw8IDg7CiAJZWxzZQogCQltYlszXSA9CW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4ODAuc3luY19vZmZzZXQgPDwgODsKIAltYlszXSB8PSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uc3luY19wZXJpb2Q7Ci0KLQlzdGF0dXMgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisJc3RhdHVzID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIDB4MGYsIG1iKTsKIAogCS8qIFNhdmUgVGFnIHF1ZXVpbmcgZW5hYmxlIGZsYWcuICovCi0JbWJbMF0gPSBCSVRfMCA8PCB0YXJnZXQ7Ci0JaWYgKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi50YWdfcXVldWluZykKLQkJaGEtPmJ1c19zZXR0aW5nc1tidXNdLnF0YWdfZW5hYmxlcyB8PSBtYlswXTsKKwlmbGFnID0gKEJJVF8wIDw8IHRhcmdldCkgJiBtYlswXTsKKwlpZiAobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci50YWdfcXVldWluZykKKwkJaGEtPmJ1c19zZXR0aW5nc1tidXNdLnF0YWdfZW5hYmxlcyB8PSBmbGFnOwogCiAJLyogU2F2ZSBEZXZpY2UgZW5hYmxlIGZsYWcuICovCiAJaWYgKElTX0lTUDF4MTYwKGhhKSkgewogCQlpZiAobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmZsYWdzLmZsYWdzMXgxNjAuZGV2aWNlX2VuYWJsZSkKLQkJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5kZXZpY2VfZW5hYmxlcyB8PSBtYlswXTsKKwkJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5kZXZpY2VfZW5hYmxlcyB8PSBmbGFnOwogCQloYS0+YnVzX3NldHRpbmdzW2J1c10ubHVuX2Rpc2FibGVzIHw9IDA7CiAJfSBlbHNlIHsKIAkJaWYgKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4ODAuZGV2aWNlX2VuYWJsZSkKLQkJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5kZXZpY2VfZW5hYmxlcyB8PSBtYlswXTsKKwkJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5kZXZpY2VfZW5hYmxlcyB8PSBmbGFnOwogCQkvKiBTYXZlIExVTiBkaXNhYmxlIGZsYWcuICovCiAJCWlmIChudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDgwLmx1bl9kaXNhYmxlKQotCQkJaGEtPmJ1c19zZXR0aW5nc1tidXNdLmx1bl9kaXNhYmxlcyB8PSBtYlswXTsKKwkJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5sdW5fZGlzYWJsZXMgfD0gZmxhZzsKIAl9CiAKIAkvKiBTZXQgRGV2aWNlIFF1ZXVlIFBhcmFtZXRlcnMuICovCiAJZm9yIChsdW4gPSAwOyBsdW4gPCBNQVhfTFVOUzsgbHVuKyspIHsKIAkJbWJbMF0gPSBNQkNfU0VUX0RFVklDRV9RVUVVRTsKLQkJbWJbMV0gPSAodWludDE2X3QpKGJ1cyA/IHRhcmdldCB8IEJJVF83IDogdGFyZ2V0KTsKLQkJbWJbMV0gPSBtYlsxXSA8PCA4IHwgbHVuOworCQltYlsxXSA9ICh1aW50MTZfdCkoKGJ1cyA/IHRhcmdldCB8IEJJVF83IDogdGFyZ2V0KSA8PCA4KTsKKwkJbWJbMV0gfD0gbHVuOwogCQltYlsyXSA9IG52LT5idXNbYnVzXS5tYXhfcXVldWVfZGVwdGg7CiAJCW1iWzNdID0gbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmV4ZWN1dGlvbl90aHJvdHRsZTsKLQkJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCAweDBmLCAmbWJbMF0pOworCQlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIDB4MGYsIG1iKTsKIAl9CiAKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMjQzMSw3ICsyMzQyLDYgQEAKIAlzdHJ1Y3QgbnZyYW0gKm52ID0gJmhhLT5udnJhbTsKIAlpbnQgYnVzLCB0YXJnZXQsIHN0YXR1cyA9IDA7CiAJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07Ci0JdWludDE2X3QgbWFzazsKIAogCUVOVEVSKCJxbGExMjgwX252cmFtX2NvbmZpZyIpOwogCkBAIC0yNDM5LDcgKzIzNDksNyBAQAogCQkvKiBBbHdheXMgZm9yY2UgQVVUTyBzZW5zZSBmb3IgTElOVVggU0NTSSAqLwogCQlmb3IgKGJ1cyA9IDA7IGJ1cyA8IE1BWF9CVVNFUzsgYnVzKyspCiAJCQlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IE1BWF9UQVJHRVRTOyB0YXJnZXQrKykgewotCQkJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi4KKwkJCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLgogCQkJCQlhdXRvX3JlcXVlc3Rfc2Vuc2UgPSAxOwogCQkJfQogCX0gZWxzZSB7CkBAIC0yNDU3LDMxICsyMzY3LDQwIEBACiAKIAkJaHdyZXYgPSBSRF9SRUdfV09SRCgmcmVnLT5jZmdfMCkgJiBJU1BfQ0ZHMF9IV01TSzsKIAotCQljZmcxID0gUkRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzEpOworCQljZmcxID0gUkRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzEpICYgfihCSVRfNCB8IEJJVF81IHwgQklUXzYpOwogCQljZG1hX2NvbmYgPSBSRF9SRUdfV09SRCgmcmVnLT5jZG1hX2NmZyk7CiAJCWRkbWFfY29uZiA9IFJEX1JFR19XT1JEKCZyZWctPmRkbWFfY2ZnKTsKIAogCQkvKiBCdXN0ZWQgZmlmbywgc2F5cyBtamFjb2IuICovCi0JCWlmIChod3JldiA9PSBJU1BfQ0ZHMF8xMDQwQSkKLQkJCVdSVF9SRUdfV09SRCgmcmVnLT5jZmdfMSwgY2ZnMSB8IElTUF9DRkcxX0Y2NCk7Ci0JCWVsc2UKLQkJCVdSVF9SRUdfV09SRCgmcmVnLT5jZmdfMSwgY2ZnMSB8IElTUF9DRkcxX0Y2NCB8IElTUF9DRkcxX0JFTkFCKTsKKwkJaWYgKGh3cmV2ICE9IElTUF9DRkcwXzEwNDBBKQorCQkJY2ZnMSB8PSBudi0+aXNwX2NvbmZpZy5maWZvX3RocmVzaG9sZCA8PCA0OworCisJCWNmZzEgfD0gbnYtPmlzcF9jb25maWcuYnVyc3RfZW5hYmxlIDw8IDI7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5jZmdfMSwgY2ZnMSk7CiAKIAkJV1JUX1JFR19XT1JEKCZyZWctPmNkbWFfY2ZnLCBjZG1hX2NvbmYgfCBDRE1BX0NPTkZfQkVOQUIpOwogCQlXUlRfUkVHX1dPUkQoJnJlZy0+ZGRtYV9jZmcsIGNkbWFfY29uZiB8IERETUFfQ09ORl9CRU5BQik7CiAJfSBlbHNlIHsKKwkJdWludDE2X3QgY2ZnMSwgdGVybTsKKwogCQkvKiBTZXQgSVNQIGhhcmR3YXJlIERNQSBidXJzdCAqLwotCQltYlswXSA9IG52LT5pc3BfY29uZmlnLmM7CisJCWNmZzEgPSBudi0+aXNwX2NvbmZpZy5maWZvX3RocmVzaG9sZCA8PCA0OworCQljZmcxIHw9IG52LT5pc3BfY29uZmlnLmJ1cnN0X2VuYWJsZSA8PCAyOwogCQkvKiBFbmFibGUgRE1BIGFyYml0cmF0aW9uIG9uIGR1YWwgY2hhbm5lbCBjb250cm9sbGVycyAqLwogCQlpZiAoaGEtPnBvcnRzID4gMSkKLQkJCW1iWzBdIHw9IEJJVF8xMzsKLQkJV1JUX1JFR19XT1JEKCZyZWctPmNmZ18xLCBtYlswXSk7CisJCQljZmcxIHw9IEJJVF8xMzsKKwkJV1JUX1JFR19XT1JEKCZyZWctPmNmZ18xLCBjZmcxKTsKIAogCQkvKiBTZXQgU0NTSSB0ZXJtaW5hdGlvbi4gKi8KLQkJV1JUX1JFR19XT1JEKCZyZWctPmdwaW9fZW5hYmxlLCAoQklUXzMgKyBCSVRfMiArIEJJVF8xICsgQklUXzApKTsKLQkJbWJbMF0gPSBudi0+dGVybWluYXRpb24uYyAmIChCSVRfMyArIEJJVF8yICsgQklUXzEgKyBCSVRfMCk7Ci0JCVdSVF9SRUdfV09SRCgmcmVnLT5ncGlvX2RhdGEsIG1iWzBdKTsKKwkJV1JUX1JFR19XT1JEKCZyZWctPmdwaW9fZW5hYmxlLAorCQkJICAgICBCSVRfNyB8IEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wKTsKKwkJdGVybSA9IG52LT50ZXJtaW5hdGlvbi5zY3NpX2J1c18xX2NvbnRyb2w7CisJCXRlcm0gfD0gbnYtPnRlcm1pbmF0aW9uLnNjc2lfYnVzXzBfY29udHJvbCA8PCAyOworCQl0ZXJtIHw9IG52LT50ZXJtaW5hdGlvbi5hdXRvX3Rlcm1fc3VwcG9ydCA8PCA3OworCQlSRF9SRUdfV09SRCgmcmVnLT5pZF9sKTsJLyogRmx1c2ggUENJIHdyaXRlICovCisJCVdSVF9SRUdfV09SRCgmcmVnLT5ncGlvX2RhdGEsIHRlcm0pOwogCX0KKwlSRF9SRUdfV09SRCgmcmVnLT5pZF9sKTsJLyogRmx1c2ggUENJIHdyaXRlICovCiAKIAkvKiBJU1AgcGFyYW1ldGVyIHdvcmQuICovCiAJbWJbMF0gPSBNQkNfU0VUX1NZU1RFTV9QQVJBTUVURVI7CkBAIC0yNDk3LDE2ICsyNDE2LDE3IEBACiAKIAkvKiBGaXJtd2FyZSBmZWF0dXJlIHdvcmQuICovCiAJbWJbMF0gPSBNQkNfU0VUX0ZJUk1XQVJFX0ZFQVRVUkVTOwotCW1hc2sgPSBCSVRfNSB8IEJJVF8xIHwgQklUXzA7Ci0JbWJbMV0gPSBsZTE2X3RvX2NwdShudi0+ZmlybXdhcmVfZmVhdHVyZS53KSAmIChtYXNrKTsKKwltYlsxXSA9IG52LT5maXJtd2FyZV9mZWF0dXJlLmYuZW5hYmxlX2Zhc3RfcG9zdGluZzsKKwltYlsxXSB8PSBudi0+ZmlybXdhcmVfZmVhdHVyZS5mLnJlcG9ydF9sdmRfYnVzX3RyYW5zaXRpb24gPDwgMTsKKwltYlsxXSB8PSBudi0+ZmlybXdhcmVfZmVhdHVyZS5mLmRpc2FibGVfc3luY2hyb25vdXNfYmFja29mZiA8PCA1OwogI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykgfHwgZGVmaW5lZCAoQ09ORklHX0lBNjRfU0dJX1NOMikKIAlpZiAoaWE2NF9wbGF0Zm9ybV9pcygic24yIikpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSglbGkpOiBFbmFibGluZyBTTjIgUENJIERNQSAiCiAJCSAgICAgICAid29ya2Fyb3VuZFxuIiwgaGEtPmhvc3Rfbm8pOwotCQltYlsxXSB8PSBCSVRfOTsKKwkJbWJbMV0gfD0gbnYtPmZpcm13YXJlX2ZlYXR1cmUuZi51bnVzZWRfOSA8PCA5OyAvKiBYWFggKi8KIAl9CiAjZW5kaWYKLQlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIG1hc2ssICZtYlswXSk7CisJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMSB8IEJJVF8wLCBtYik7CiAKIAkvKiBSZXRyeSBjb3VudCBhbmQgZGVsYXkuICovCiAJbWJbMF0gPSBNQkNfU0VUX1JFVFJZX0NPVU5UOwpAQCAtMjUzNSwyNyArMjQ1NSwyNyBAQAogCQltYlsyXSB8PSBCSVRfNTsKIAlpZiAobnYtPmJ1c1sxXS5jb25maWdfMi5kYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uKQogCQltYlsyXSB8PSBCSVRfNDsKLQlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8yIHwgQklUXzEgfCBCSVRfMCwgJm1iWzBdKTsKKwlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8yIHwgQklUXzEgfCBCSVRfMCwgbWIpOwogCiAJbWJbMF0gPSBNQkNfU0VUX0RBVEFfT1ZFUlJVTl9SRUNPVkVSWTsKIAltYlsxXSA9IDI7CS8qIFJlc2V0IFNDU0kgYnVzIGFuZCByZXR1cm4gYWxsIG91dHN0YW5kaW5nIElPICovCi0Jc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgbWIpOwogCiAJLyogdGhpbmd5ICovCiAJbWJbMF0gPSBNQkNfU0VUX1BDSV9DT05UUk9MOwotCW1iWzFdID0gMjsJLyogRGF0YSBETUEgQ2hhbm5lbCBCdXJzdCBFbmFibGUgKi8KLQltYlsyXSA9IDI7CS8qIENvbW1hbmQgRE1BIENoYW5uZWwgQnVyc3QgRW5hYmxlICovCi0Jc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisJbWJbMV0gPSBCSVRfMTsJLyogRGF0YSBETUEgQ2hhbm5lbCBCdXJzdCBFbmFibGUgKi8KKwltYlsyXSA9IEJJVF8xOwkvKiBDb21tYW5kIERNQSBDaGFubmVsIEJ1cnN0IEVuYWJsZSAqLworCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLCBtYik7CiAKIAltYlswXSA9IE1CQ19TRVRfVEFHX0FHRV9MSU1JVDsKIAltYlsxXSA9IDg7Ci0Jc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgbWIpOwogCiAJLyogU2VsZWN0aW9uIHRpbWVvdXQuICovCiAJbWJbMF0gPSBNQkNfU0VUX1NFTEVDVElPTl9USU1FT1VUOwogCW1iWzFdID0gbnYtPmJ1c1swXS5zZWxlY3Rpb25fdGltZW91dDsKIAltYlsyXSA9IG52LT5idXNbMV0uc2VsZWN0aW9uX3RpbWVvdXQ7Ci0Jc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsIG1iKTsKIAogCWZvciAoYnVzID0gMDsgYnVzIDwgaGEtPnBvcnRzOyBidXMrKykKIAkJc3RhdHVzIHw9IHFsYTEyODBfY29uZmlnX2J1cyhoYSwgYnVzKTsKQEAgLTMwNjYsNyArMjk4Niw3IEBACiAJc3RydWN0IHNjc2lfY21uZCAqY21kID0gc3AtPmNtZDsKIAljbWRfYTY0X2VudHJ5X3QgKnBrdDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gTlVMTDsKLQl1MzIgKmR3b3JkX3B0cjsKKwlfX2xlMzIgKmR3b3JkX3B0cjsKIAlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CiAJaW50IHN0YXR1cyA9IDA7CiAJaW50IGNudDsKQEAgLTMxMDQsMTAgKzMwMjQsMTMgQEAKIAkJCQlSRVFVRVNUX0VOVFJZX0NOVCAtIChoYS0+cmVxX3JpbmdfaW5kZXggLSBjbnQpOwogCX0KIAorCWRwcmludGsoMywgIk51bWJlciBvZiBmcmVlIGVudHJpZXM9KCVkKSBzZWdfY250PTB4JXhcbiIsCisJCWhhLT5yZXFfcV9jbnQsIHNlZ19jbnQpOworCiAJLyogSWYgcm9vbSBmb3IgcmVxdWVzdCBpbiByZXF1ZXN0IHJpbmcuICovCiAJaWYgKChyZXFfY250ICsgMikgPj0gaGEtPnJlcV9xX2NudCkgewogCQlzdGF0dXMgPSAxOwotCQlkcHJpbnRrKDIsICJxbGExMjgwXzY0Yml0X3N0YXJ0X3Njc2k6IGluLXB0cj0weCV4ICByZXFfcV9jbnQ9IgorCQlkcHJpbnRrKDIsICJxbGExMjgwX3N0YXJ0X3Njc2k6IGluLXB0cj0weCV4ICByZXFfcV9jbnQ9IgogCQkJIjB4JXhyZXFfY250PTB4JXgiLCBoYS0+cmVxX3JpbmdfaW5kZXgsIGhhLT5yZXFfcV9jbnQsCiAJCQlyZXFfY250KTsKIAkJZ290byBvdXQ7CkBAIC0zMTE5LDcgKzMwNDIsNyBAQAogCiAJaWYgKGNudCA+PSBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpIHsKIAkJc3RhdHVzID0gMTsKLQkJZHByaW50aygyLCAicWxhMTI4MF82NGJpdF9zdGFydF9zY3NpOiBOTyBST09NIElOICIKKwkJZHByaW50aygyLCAicWxhMTI4MF9zdGFydF9zY3NpOiBOTyBST09NIElOICIKIAkJCSJPVVRTVEFORElORyBBUlJBWSwgcmVxX3FfY250PTB4JXgiLCBoYS0+cmVxX3FfY250KTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzEyOCw3ICszMDUxLDcgQEAKIAloYS0+cmVxX3FfY250IC09IHJlcV9jbnQ7CiAJQ01EX0hBTkRMRShzcC0+Y21kKSA9ICh1bnNpZ25lZCBjaGFyICopKHVuc2lnbmVkIGxvbmcpKGNudCArIDEpOwogCi0JZHByaW50aygyLCAiNjRiaXRfc3RhcnQ6IGNtZD0lcCBzcD0lcCBDREI9JXhtLCBoYW5kbGUgJWx4XG4iLCBjbWQsIHNwLAorCWRwcmludGsoMiwgInN0YXJ0OiBjbWQ9JXAgc3A9JXAgQ0RCPSV4bSwgaGFuZGxlICVseFxuIiwgY21kLCBzcCwKIAkJY21kLT5jbW5kWzBdLCAobG9uZylDTURfSEFORExFKHNwLT5jbWQpKTsKIAlkcHJpbnRrKDIsICIgICAgICAgICAgICAgYnVzICVpLCB0YXJnZXQgJWksIGx1biAlaVxuIiwKIAkJU0NTSV9CVVNfMzIoY21kKSwgU0NTSV9UQ05fMzIoY21kKSwgU0NTSV9MVU5fMzIoY21kKSk7CkBAIC0zMzUwLDcgKzMyNzMsNyBAQAogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHNwLT5jbWQ7CiAJc3RydWN0IGNtZF9lbnRyeSAqcGt0OwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBOVUxMOwotCXVpbnQzMl90ICpkd29yZF9wdHI7CisJX19sZTMyICpkd29yZF9wdHI7CiAJaW50IHN0YXR1cyA9IDA7CiAJaW50IGNudDsKIAlpbnQgcmVxX2NudDsKQEAgLTM5OTMsMjEgKzM5MTYsMjEgQEAKIAlyZXN1bHQgPSBjbWQtPnJlcXVlc3RfYnVmZmVyOwogCW4gPSAmaGEtPm52cmFtOwogCi0Jbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3dpZGUgPSAwOwotCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jID0gMDsKKwluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZW5hYmxlX3dpZGUgPSAwOworCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5lbmFibGVfc3luYyA9IDA7CiAJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLmVuYWJsZV9wcHIgPSAwOwogCiAgICAgICAgIGlmIChyZXN1bHRbN10gJiAweDYwKQotCQluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfd2lkZSA9IDE7CisJCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5lbmFibGVfd2lkZSA9IDE7CiAgICAgICAgIGlmIChyZXN1bHRbN10gJiAweDEwKQotCQluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfc3luYyA9IDE7CisJCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5lbmFibGVfc3luYyA9IDE7CiAJaWYgKChyZXN1bHRbMl0gPj0gMykgJiYgKHJlc3VsdFs0XSArIDUgPiA1NikgJiYKIAkgICAgKHJlc3VsdFs1Nl0gJiAweDQpKQogCQluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MuZW5hYmxlX3BwciA9IDE7CiAKIAlkcHJpbnRrKDIsICJnZXRfdGFyZ2V0X29wdGlvbnMoKTogd2lkZSAlaSwgc3luYyAlaSwgcHByICVpXG4iLAotCQluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfd2lkZSwKLQkJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3N5bmMsCisJCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5lbmFibGVfd2lkZSwKKwkJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmVuYWJsZV9zeW5jLAogCQluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MuZW5hYmxlX3Bwcik7CiB9CiAjZW5kaWYKQEAgLTQwNzEsNyArMzk5NCw3IEBACiAJCS8qIFNhdmUgSVNQIGNvbXBsZXRpb24gc3RhdHVzICovCiAJCUNNRF9SRVNVTFQoY21kKSA9IHFsYTEyODBfcmV0dXJuX3N0YXR1cyhwa3QsIGNtZCk7CiAKLQkJaWYgKHNjc2lfc3RhdHVzICYgU1NfQ0hFQ0tfQ09ORElUSU9OKSB7CisJCWlmIChzY3NpX3N0YXR1cyAmIFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTikgewogCQkJaWYgKGNvbXBfc3RhdHVzICE9IENTX0FSU19GQUlMRUQpIHsKIAkJCQl1aW50MTZfdCByZXFfc2Vuc2VfbGVuZ3RoID0KIAkJCQkJbGUxNl90b19jcHUocGt0LT5yZXFfc2Vuc2VfbGVuZ3RoKTsKQEAgLTQ2NTAsNyArNDU3Myw3IEBACiAJaWYgKHBjaV9zZXRfZG1hX21hc2soaGEtPnBkZXYsIChkbWFfYWRkcl90KSB+IDBVTEwpKSB7CiAJCWlmIChwY2lfc2V0X2RtYV9tYXNrKGhhLT5wZGV2LCAweGZmZmZmZmZmKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSglbGkpOiBVbmFibGUgdG8gc2V0IGEgIgotCQkJICAgICAgICIgc3VpdGFibGUgRE1BIG1hc2sgLSBhYm9yaW5nXG4iLCBoYS0+aG9zdF9ubyk7CisJCQkgICAgICAgInN1aXRhYmxlIERNQSBtYXNrIC0gYWJvcnRpbmdcbiIsIGhhLT5ob3N0X25vKTsKIAkJCWVycm9yID0gLUVOT0RFVjsKIAkJCWdvdG8gZXJyb3JfZnJlZV9pcnE7CiAJCX0KQEAgLTQ2NjAsMTQgKzQ1ODMsMTQgQEAKICNlbHNlCiAJaWYgKHBjaV9zZXRfZG1hX21hc2soaGEtPnBkZXYsIDB4ZmZmZmZmZmYpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2koJWxpKTogVW5hYmxlIHRvIHNldCBhICIKLQkJICAgICAgICIgc3VpdGFibGUgRE1BIG1hc2sgLSBhYm9yaW5nXG4iLCBoYS0+aG9zdF9ubyk7CisJCSAgICAgICAic3VpdGFibGUgRE1BIG1hc2sgLSBhYm9ydGluZ1xuIiwgaGEtPmhvc3Rfbm8pOwogCQllcnJvciA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyb3JfZnJlZV9pcnE7CiAJfQogI2VuZGlmCiAKIAloYS0+cmVxdWVzdF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsCi0JCQkoKFJFUVVFU1RfRU5UUllfQ05UICsgMSkgKiAoc2l6ZW9mKHJlcXVlc3RfdCkpKSwKKwkJCSgoUkVRVUVTVF9FTlRSWV9DTlQgKyAxKSAqIHNpemVvZihyZXF1ZXN0X3QpKSwKIAkJCSZoYS0+cmVxdWVzdF9kbWEpOwogCWlmICghaGEtPnJlcXVlc3RfcmluZykgewogCQlwcmludGsoS0VSTl9JTkZPICJxbGExMjgwOiBGYWlsZWQgdG8gZ2V0IHJlcXVlc3QgbWVtb3J5XG4iKTsKQEAgLTQ2NzUsNyArNDU5OCw3IEBACiAJfQogCiAJaGEtPnJlc3BvbnNlX3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGRldiwKLQkJCSgoUkVTUE9OU0VfRU5UUllfQ05UICsgMSkgKiAoc2l6ZW9mKHN0cnVjdCByZXNwb25zZSkpKSwKKwkJCSgoUkVTUE9OU0VfRU5UUllfQ05UICsgMSkgKiBzaXplb2Yoc3RydWN0IHJlc3BvbnNlKSksCiAJCQkmaGEtPnJlc3BvbnNlX2RtYSk7CiAJaWYgKCFoYS0+cmVzcG9uc2VfcmluZykgewogCQlwcmludGsoS0VSTl9JTkZPICJxbGExMjgwOiBGYWlsZWQgdG8gZ2V0IHJlc3BvbnNlIG1lbW9yeVxuIik7CkBAIC00NzU4LDcgKzQ2ODEsNyBAQAogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MDIwNjAwCiAgZXJyb3JfZGlzYWJsZV9hZGFwdGVyOgotCVdSVF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+aWN0cmwsIDApOworCXFsYTEyODBfZGlzYWJsZV9pbnRycyhoYSk7CiAjZW5kaWYKICBlcnJvcl9mcmVlX2lycToKIAlmcmVlX2lycShwZGV2LT5pcnEsIGhhKTsKQEAgLTQ3NzAsMTEgKzQ2OTMsMTEgQEAKICNlbmRpZgogIGVycm9yX2ZyZWVfcmVzcG9uc2VfcmluZzoKIAlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LAotCQkJKChSRVNQT05TRV9FTlRSWV9DTlQgKyAxKSAqIChzaXplb2Yoc3RydWN0IHJlc3BvbnNlKSkpLAorCQkJKChSRVNQT05TRV9FTlRSWV9DTlQgKyAxKSAqIHNpemVvZihzdHJ1Y3QgcmVzcG9uc2UpKSwKIAkJCWhhLT5yZXNwb25zZV9yaW5nLCBoYS0+cmVzcG9uc2VfZG1hKTsKICBlcnJvcl9mcmVlX3JlcXVlc3RfcmluZzoKIAlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LAotCQkJKChSRVFVRVNUX0VOVFJZX0NOVCArIDEpICogKHNpemVvZihyZXF1ZXN0X3QpKSksCisJCQkoKFJFUVVFU1RfRU5UUllfQ05UICsgMSkgKiBzaXplb2YocmVxdWVzdF90KSksCiAJCQloYS0+cmVxdWVzdF9yaW5nLCBoYS0+cmVxdWVzdF9kbWEpOwogIGVycm9yX3B1dF9ob3N0OgogCXNjc2lfaG9zdF9wdXQoaG9zdCk7CkBAIC00Nzk1LDcgKzQ3MTgsNyBAQAogCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CiAjZW5kaWYKIAotCVdSVF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+aWN0cmwsIDApOworCXFsYTEyODBfZGlzYWJsZV9pbnRycyhoYSk7CiAKIAlmcmVlX2lycShwZGV2LT5pcnEsIGhhKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTEyODAuaCBiL2RyaXZlcnMvc2NzaS9xbGExMjgwLmgKaW5kZXggZDI0NWFlMC4uNTk5MTVmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTEyODAuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5oCkBAIC05NCw5ICs5NCw2IEBACiAjZGVmaW5lIFJFUVVFU1RfRU5UUllfQ05UCQkyNTYgLyogTnVtYmVyIG9mIHJlcXVlc3QgZW50cmllcy4gKi8KICNkZWZpbmUgUkVTUE9OU0VfRU5UUllfQ05UCQkxNiAgLyogTnVtYmVyIG9mIHJlc3BvbnNlIGVudHJpZXMuICovCiAKLS8qIE51bWJlciBvZiBzZWdtZW50cyAxIC0gNjU1MzUgKi8KLSNkZWZpbmUgU0dfU0VHTUVOVFMJCQkzMiAgLyogQ21kIGVudHJ5ICsgNiBjb250aW51YXRpb25zICovCi0KIC8qCiAgKiBTQ1NJIFJlcXVlc3QgQmxvY2sgc3RydWN0dXJlICAoc3ApICB0aGF0IGlzIHBsYWNlZAogICogb24gY21kLT5TQ3AgbG9jYXRpb24gb2YgZXZlcnkgSS9PCkBAIC0zNzgsMjkgKzM3NSwyMyBAQAogCXVpbnQxNl90IHVudXNlZF8xMjsJLyogMTIsIDEzICovCiAJdWludDE2X3QgdW51c2VkXzE0OwkvKiAxNCwgMTUgKi8KIAotCXVuaW9uIHsKLQkJdWludDhfdCBjOwotCQlzdHJ1Y3QgewotCQkJdWludDhfdCByZXNlcnZlZDoyOwotCQkJdWludDhfdCBidXJzdF9lbmFibGU6MTsKLQkJCXVpbnQ4X3QgcmVzZXJ2ZWRfMToxOwotCQkJdWludDhfdCBmaWZvX3RocmVzaG9sZDo0OwotCQl9IGY7CisJc3RydWN0IHsKKwkJdWludDhfdCByZXNlcnZlZDoyOworCQl1aW50OF90IGJ1cnN0X2VuYWJsZToxOworCQl1aW50OF90IHJlc2VydmVkXzE6MTsKKwkJdWludDhfdCBmaWZvX3RocmVzaG9sZDo0OwogCX0gaXNwX2NvbmZpZzsJCS8qIDE2ICovCiAKIAkvKiBUZXJtaW5hdGlvbgogCSAqIDAgPSBEaXNhYmxlLCAxID0gaGlnaCBvbmx5LCAzID0gQXV0byB0ZXJtCiAJICovCi0JdW5pb24gewotCQl1aW50OF90IGM7Ci0JCXN0cnVjdCB7Ci0JCQl1aW50OF90IHNjc2lfYnVzXzFfY29udHJvbDoyOwotCQkJdWludDhfdCBzY3NpX2J1c18wX2NvbnRyb2w6MjsKLQkJCXVpbnQ4X3QgdW51c2VkXzA6MTsKLQkJCXVpbnQ4X3QgdW51c2VkXzE6MTsKLQkJCXVpbnQ4X3QgdW51c2VkXzI6MTsKLQkJCXVpbnQ4X3QgYXV0b190ZXJtX3N1cHBvcnQ6MTsKLQkJfSBmOworCXN0cnVjdCB7CisJCXVpbnQ4X3Qgc2NzaV9idXNfMV9jb250cm9sOjI7CisJCXVpbnQ4X3Qgc2NzaV9idXNfMF9jb250cm9sOjI7CisJCXVpbnQ4X3QgdW51c2VkXzA6MTsKKwkJdWludDhfdCB1bnVzZWRfMToxOworCQl1aW50OF90IHVudXNlZF8yOjE7CisJCXVpbnQ4X3QgYXV0b190ZXJtX3N1cHBvcnQ6MTsKIAl9IHRlcm1pbmF0aW9uOwkJLyogMTcgKi8KIAogCXVpbnQxNl90IGlzcF9wYXJhbWV0ZXI7CS8qIDE4LCAxOSAqLwpAQCAtNDYwLDE4ICs0NTEsMTUgQEAKIAkJdWludDE2X3QgdW51c2VkXzM4OwkvKiAzOCwgMzkgKi8KIAogCQlzdHJ1Y3QgewotCQkJdW5pb24gewotCQkJCXVpbnQ4X3QgYzsKLQkJCQlzdHJ1Y3QgewotCQkJCQl1aW50OF90IHJlbmVnb3RpYXRlX29uX2Vycm9yOjE7Ci0JCQkJCXVpbnQ4X3Qgc3RvcF9xdWV1ZV9vbl9jaGVjazoxOwotCQkJCQl1aW50OF90IGF1dG9fcmVxdWVzdF9zZW5zZToxOwotCQkJCQl1aW50OF90IHRhZ19xdWV1aW5nOjE7Ci0JCQkJCXVpbnQ4X3QgZW5hYmxlX3N5bmM6MTsKLQkJCQkJdWludDhfdCBlbmFibGVfd2lkZToxOwotCQkJCQl1aW50OF90IHBhcml0eV9jaGVja2luZzoxOwotCQkJCQl1aW50OF90IGRpc2Nvbm5lY3RfYWxsb3dlZDoxOwotCQkJCX0gZjsKKwkJCXN0cnVjdCB7CisJCQkJdWludDhfdCByZW5lZ290aWF0ZV9vbl9lcnJvcjoxOworCQkJCXVpbnQ4X3Qgc3RvcF9xdWV1ZV9vbl9jaGVjazoxOworCQkJCXVpbnQ4X3QgYXV0b19yZXF1ZXN0X3NlbnNlOjE7CisJCQkJdWludDhfdCB0YWdfcXVldWluZzoxOworCQkJCXVpbnQ4X3QgZW5hYmxlX3N5bmM6MTsKKwkJCQl1aW50OF90IGVuYWJsZV93aWRlOjE7CisJCQkJdWludDhfdCBwYXJpdHlfY2hlY2tpbmc6MTsKKwkJCQl1aW50OF90IGRpc2Nvbm5lY3RfYWxsb3dlZDoxOwogCQkJfSBwYXJhbWV0ZXI7CS8qIDQwICovCiAKIAkJCXVpbnQ4X3QgZXhlY3V0aW9uX3Rocm90dGxlOwkvKiA0MSAqLwpAQCAtNTI4LDIzICs1MTYsMjMgQEAKIAl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCiAJdWludDhfdCBzeXNfZGVmaW5lOwkJLyogU3lzdGVtIGRlZmluZWQuICovCiAJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCi0JdWludDMyX3QgaGFuZGxlOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwlfX2xlMzIgaGFuZGxlOwkJCS8qIFN5c3RlbSBoYW5kbGUuICovCiAJdWludDhfdCBsdW47CQkJLyogU0NTSSBMVU4gKi8KIAl1aW50OF90IHRhcmdldDsJCQkvKiBTQ1NJIElEICovCi0JdWludDE2X3QgY2RiX2xlbjsJCS8qIFNDU0kgY29tbWFuZCBsZW5ndGguICovCi0JdWludDE2X3QgY29udHJvbF9mbGFnczsJCS8qIENvbnRyb2wgZmxhZ3MuICovCi0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci0JdWludDE2X3QgdGltZW91dDsJCS8qIENvbW1hbmQgdGltZW91dC4gKi8KLQl1aW50MTZfdCBkc2VnX2NvdW50OwkJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCV9fbGUxNiBjZGJfbGVuOwkJCS8qIFNDU0kgY29tbWFuZCBsZW5ndGguICovCisJX19sZTE2IGNvbnRyb2xfZmxhZ3M7CQkvKiBDb250cm9sIGZsYWdzLiAqLworCV9fbGUxNiByZXNlcnZlZDsKKwlfX2xlMTYgdGltZW91dDsJCQkvKiBDb21tYW5kIHRpbWVvdXQuICovCisJX19sZTE2IGRzZWdfY291bnQ7CQkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCiAJdWludDhfdCBzY3NpX2NkYltNQVhfQ01EU1pdOwkvKiBTQ1NJIGNvbW1hbmQgd29yZHMuICovCi0JdWludDMyX3QgZHNlZ18wX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzFfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLwotCXVpbnQzMl90IGRzZWdfMl9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMiBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfMl9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCi0JdWludDMyX3QgZHNlZ18zX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAzIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18zX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAzIGxlbmd0aC4gKi8KKwlfX2xlMzIgZHNlZ18wX2FkZHJlc3M7CQkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzBfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzFfYWRkcmVzczsJCS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCisJX19sZTMyIGRzZWdfMV9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCisJX19sZTMyIGRzZWdfMl9hZGRyZXNzOwkJLyogRGF0YSBzZWdtZW50IDIgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18yX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAyIGxlbmd0aC4gKi8KKwlfX2xlMzIgZHNlZ18zX2FkZHJlc3M7CQkvKiBEYXRhIHNlZ21lbnQgMyBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzNfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDMgbGVuZ3RoLiAqLwogfTsKIAogLyoKQEAgLTU1NiwyMSArNTQ0LDIxIEBACiAJdWludDhfdCBlbnRyeV9jb3VudDsJCS8qIEVudHJ5IGNvdW50LiAqLwogCXVpbnQ4X3Qgc3lzX2RlZmluZTsJCS8qIFN5c3RlbSBkZWZpbmVkLiAqLwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkJLyogRW50cnkgU3RhdHVzLiAqLwotCXVpbnQzMl90IHJlc2VydmVkOwkJLyogUmVzZXJ2ZWQgKi8KLQl1aW50MzJfdCBkc2VnXzBfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzBfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLwotCXVpbnQzMl90IGRzZWdfMV9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfMV9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCi0JdWludDMyX3QgZHNlZ18yX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAyIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18yX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAyIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzNfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDMgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzNfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDMgbGVuZ3RoLiAqLwotCXVpbnQzMl90IGRzZWdfNF9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgNCBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfNF9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgNCBsZW5ndGguICovCi0JdWludDMyX3QgZHNlZ181X2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCA1IGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ181X2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCA1IGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzZfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDYgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzZfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDYgbGVuZ3RoLiAqLworCV9fbGUzMiByZXNlcnZlZDsJCS8qIFJlc2VydmVkICovCisJX19sZTMyIGRzZWdfMF9hZGRyZXNzOwkJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18wX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwlfX2xlMzIgZHNlZ18xX2FkZHJlc3M7CQkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzFfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzJfYWRkcmVzczsJCS8qIERhdGEgc2VnbWVudCAyIGFkZHJlc3MuICovCisJX19sZTMyIGRzZWdfMl9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCisJX19sZTMyIGRzZWdfM19hZGRyZXNzOwkJLyogRGF0YSBzZWdtZW50IDMgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18zX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAzIGxlbmd0aC4gKi8KKwlfX2xlMzIgZHNlZ180X2FkZHJlc3M7CQkvKiBEYXRhIHNlZ21lbnQgNCBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzRfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDQgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzVfYWRkcmVzczsJCS8qIERhdGEgc2VnbWVudCA1IGFkZHJlc3MuICovCisJX19sZTMyIGRzZWdfNV9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgNSBsZW5ndGguICovCisJX19sZTMyIGRzZWdfNl9hZGRyZXNzOwkJLyogRGF0YSBzZWdtZW50IDYgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ182X2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCA2IGxlbmd0aC4gKi8KIH07CiAKIC8qCkBAIC01ODYsMjIgKzU3NCwyMiBAQAogI2RlZmluZSBSRl9GVUxMICAgICAgICAgQklUXzEJLyogRnVsbCAqLwogI2RlZmluZSBSRl9CQURfSEVBREVSICAgQklUXzIJLyogQmFkIGhlYWRlci4gKi8KICNkZWZpbmUgUkZfQkFEX1BBWUxPQUQgIEJJVF8zCS8qIEJhZCBwYXlsb2FkLiAqLwotCXVpbnQzMl90IGhhbmRsZTsJLyogU3lzdGVtIGhhbmRsZS4gKi8KLQl1aW50MTZfdCBzY3NpX3N0YXR1czsJLyogU0NTSSBzdGF0dXMuICovCi0JdWludDE2X3QgY29tcF9zdGF0dXM7CS8qIENvbXBsZXRpb24gc3RhdHVzLiAqLwotCXVpbnQxNl90IHN0YXRlX2ZsYWdzOwkvKiBTdGF0ZSBmbGFncy4gKi8KLSNkZWZpbmUgU0ZfVFJBTlNGRVJfQ01QTCBCSVRfMTQJLyogVHJhbnNmZXIgQ29tcGxldGUuICovCi0jZGVmaW5lIFNGX0dPVF9TRU5TRSAgICBCSVRfMTMJLyogR290IFNlbnNlICovCi0jZGVmaW5lIFNGX0dPVF9TVEFUVVMgICAgQklUXzEyCS8qIEdvdCBTdGF0dXMgKi8KLSNkZWZpbmUgU0ZfVFJBTlNGRVJSRURfREFUQSBCSVRfMTEJLyogVHJhbnNmZXJyZWQgZGF0YSAqLwotI2RlZmluZSBTRl9TRU5UX0NEQiAgIEJJVF8xMAkvKiBTZW5kIENEQiAqLwotI2RlZmluZSBTRl9HT1RfVEFSR0VUICBCSVRfOQkvKiAgKi8KLSNkZWZpbmUgU0ZfR09UX0JVUyAgICAgQklUXzgJLyogICovCi0JdWludDE2X3Qgc3RhdHVzX2ZsYWdzOwkvKiBTdGF0dXMgZmxhZ3MuICovCi0JdWludDE2X3QgdGltZTsJCS8qIFRpbWUuICovCi0JdWludDE2X3QgcmVxX3NlbnNlX2xlbmd0aDsJLyogUmVxdWVzdCBzZW5zZSBkYXRhIGxlbmd0aC4gKi8KLQl1aW50MzJfdCByZXNpZHVhbF9sZW5ndGg7CS8qIFJlc2lkdWFsIHRyYW5zZmVyIGxlbmd0aC4gKi8KLQl1aW50MTZfdCByZXNlcnZlZFs0XTsKKwlfX2xlMzIgaGFuZGxlOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwlfX2xlMTYgc2NzaV9zdGF0dXM7CS8qIFNDU0kgc3RhdHVzLiAqLworCV9fbGUxNiBjb21wX3N0YXR1czsJLyogQ29tcGxldGlvbiBzdGF0dXMuICovCisJX19sZTE2IHN0YXRlX2ZsYWdzOwkvKiBTdGF0ZSBmbGFncy4gKi8KKyNkZWZpbmUgU0ZfVFJBTlNGRVJfQ01QTAlCSVRfMTQJLyogVHJhbnNmZXIgQ29tcGxldGUuICovCisjZGVmaW5lIFNGX0dPVF9TRU5TRQkgCUJJVF8xMwkvKiBHb3QgU2Vuc2UgKi8KKyNkZWZpbmUgU0ZfR09UX1NUQVRVUwkgCUJJVF8xMgkvKiBHb3QgU3RhdHVzICovCisjZGVmaW5lIFNGX1RSQU5TRkVSUkVEX0RBVEEJQklUXzExCS8qIFRyYW5zZmVycmVkIGRhdGEgKi8KKyNkZWZpbmUgU0ZfU0VOVF9DREIJIAlCSVRfMTAJLyogU2VuZCBDREIgKi8KKyNkZWZpbmUgU0ZfR09UX1RBUkdFVAkgCUJJVF85CS8qICAqLworI2RlZmluZSBTRl9HT1RfQlVTCSAJQklUXzgJLyogICovCisJX19sZTE2IHN0YXR1c19mbGFnczsJLyogU3RhdHVzIGZsYWdzLiAqLworCV9fbGUxNiB0aW1lOwkJLyogVGltZS4gKi8KKwlfX2xlMTYgcmVxX3NlbnNlX2xlbmd0aDsvKiBSZXF1ZXN0IHNlbnNlIGRhdGEgbGVuZ3RoLiAqLworCV9fbGUzMiByZXNpZHVhbF9sZW5ndGg7CS8qIFJlc2lkdWFsIHRyYW5zZmVyIGxlbmd0aC4gKi8KKwlfX2xlMTYgcmVzZXJ2ZWRbNF07CiAJdWludDhfdCByZXFfc2Vuc2VfZGF0YVszMl07CS8qIFJlcXVlc3Qgc2Vuc2UgZGF0YS4gKi8KIH07CiAKQEAgLTYxNCw3ICs2MDIsNyBAQAogCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLwogCXVpbnQ4X3Qgc3lzX2RlZmluZTsJLyogU3lzdGVtIGRlZmluZWQuICovCiAJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KLQl1aW50MzJfdCByZXNlcnZlZDsKKwlfX2xlMzIgcmVzZXJ2ZWQ7CiAJdWludDhfdCBsdW47CQkvKiBTQ1NJIExVTiAqLwogCXVpbnQ4X3QgdGFyZ2V0OwkJLyogU0NTSSBJRCAqLwogCXVpbnQ4X3QgbW9kaWZpZXI7CS8qIE1vZGlmaWVyICg3LTApLiAqLwpAQCAtNjM4LDExICs2MjYsMTEgQEAKIAl1aW50MzJfdCBoYW5kbGU7CS8qIFN5c3RlbSBoYW5kbGUuICovCiAJdWludDhfdCBsdW47CQkvKiBTQ1NJIExVTiAqLwogCXVpbnQ4X3QgdGFyZ2V0OwkJLyogU0NTSSBJRCAqLwotCXVpbnQxNl90IGNkYl9sZW47CS8qIFNDU0kgY29tbWFuZCBsZW5ndGguICovCi0JdWludDE2X3QgY29udHJvbF9mbGFnczsJLyogQ29udHJvbCBmbGFncy4gKi8KLQl1aW50MTZfdCByZXNlcnZlZDsKLQl1aW50MTZfdCB0aW1lb3V0OwkvKiBDb21tYW5kIHRpbWVvdXQuICovCi0JdWludDE2X3QgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCV9fbGUxNiBjZGJfbGVuOwkJLyogU0NTSSBjb21tYW5kIGxlbmd0aC4gKi8KKwlfX2xlMTYgY29udHJvbF9mbGFnczsJLyogQ29udHJvbCBmbGFncy4gKi8KKwlfX2xlMTYgcmVzZXJ2ZWQ7CisJX19sZTE2IHRpbWVvdXQ7CQkvKiBDb21tYW5kIHRpbWVvdXQuICovCisJX19sZTE2IGRzZWdfY291bnQ7CS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KIAl1aW50OF90IHNjc2lfY2RiWzg4XTsJLyogU0NTSSBjb21tYW5kIHdvcmRzLiAqLwogfTsKIApAQCAtNjU1LDIwICs2NDMsMjAgQEAKIAl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KIAl1aW50OF90IHN5c19kZWZpbmU7CS8qIFN5c3RlbSBkZWZpbmVkLiAqLwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCi0JdWludDMyX3QgaGFuZGxlOwkvKiBTeXN0ZW0gaGFuZGxlLiAqLworCV9fbGUzMiBoYW5kbGU7CS8qIFN5c3RlbSBoYW5kbGUuICovCiAJdWludDhfdCBsdW47CQkvKiBTQ1NJIExVTiAqLwogCXVpbnQ4X3QgdGFyZ2V0OwkJLyogU0NTSSBJRCAqLwotCXVpbnQxNl90IGNkYl9sZW47CS8qIFNDU0kgY29tbWFuZCBsZW5ndGguICovCi0JdWludDE2X3QgY29udHJvbF9mbGFnczsJLyogQ29udHJvbCBmbGFncy4gKi8KLQl1aW50MTZfdCByZXNlcnZlZDsKLQl1aW50MTZfdCB0aW1lb3V0OwkvKiBDb21tYW5kIHRpbWVvdXQuICovCi0JdWludDE2X3QgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCV9fbGUxNiBjZGJfbGVuOwkvKiBTQ1NJIGNvbW1hbmQgbGVuZ3RoLiAqLworCV9fbGUxNiBjb250cm9sX2ZsYWdzOwkvKiBDb250cm9sIGZsYWdzLiAqLworCV9fbGUxNiByZXNlcnZlZDsKKwlfX2xlMTYgdGltZW91dDsJLyogQ29tbWFuZCB0aW1lb3V0LiAqLworCV9fbGUxNiBkc2VnX2NvdW50OwkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCiAJdWludDhfdCBzY3NpX2NkYltNQVhfQ01EU1pdOwkvKiBTQ1NJIGNvbW1hbmQgd29yZHMuICovCi0JdWludDMyX3QgcmVzZXJ2ZWRfMVsyXTsJLyogdW51c2VkICovCi0JdWludDMyX3QgZHNlZ18wX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLwotCXVpbnQzMl90IGRzZWdfMV9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfMV9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KKwlfX2xlMzIgcmVzZXJ2ZWRfMVsyXTsJLyogdW51c2VkICovCisJX19sZTMyIGRzZWdfMF9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzBfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJX19sZTMyIGRzZWdfMV9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzFfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCiB9IGNtZF9hNjRfZW50cnlfdCwgcmVxdWVzdF90OwogCiAvKgpAQCAtNjgwLDE2ICs2NjgsMTYgQEAKIAl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KIAl1aW50OF90IHN5c19kZWZpbmU7CS8qIFN5c3RlbSBkZWZpbmVkLiAqLwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCi0JdWludDMyX3QgZHNlZ18wX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLwotCXVpbnQzMl90IGRzZWdfMV9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfMV9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzJfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDIgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzJfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCi0JdWludDMyX3QgZHNlZ18zX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAzIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18zX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDMgbGVuZ3RoLiAqLwotCXVpbnQzMl90IGRzZWdfNF9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgNCBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfNF9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCA0IGxlbmd0aC4gKi8KKwlfX2xlMzIgZHNlZ18wX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJX19sZTMyIGRzZWdfMF9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJX19sZTMyIGRzZWdfMV9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzFfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzJfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDIgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18yX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAyIGxlbmd0aC4gKi8KKwlfX2xlMzIgZHNlZ18zX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAzIGFkZHJlc3MuICovCisJX19sZTMyIGRzZWdfM19sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMyBsZW5ndGguICovCisJX19sZTMyIGRzZWdfNF9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgNCBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzRfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDQgbGVuZ3RoLiAqLwogfTsKIAogLyoKQEAgLTcwMSwxMCArNjg5LDEwIEBACiAJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCiAJdWludDhfdCByZXNlcnZlZF8xOwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMgbm90IHVzZWQuICovCi0JdWludDMyX3QgcmVzZXJ2ZWRfMjsKLQl1aW50MTZfdCBsdW47CQkvKiBCaXQgMTUgaXMgYnVzIG51bWJlci4gKi8KLQl1aW50MTZfdCByZXNlcnZlZF80OwotCXVpbnQzMl90IG9wdGlvbl9mbGFnczsKKwlfX2xlMzIgcmVzZXJ2ZWRfMjsKKwlfX2xlMTYgbHVuOwkJLyogQml0IDE1IGlzIGJ1cyBudW1iZXIuICovCisJX19sZTE2IHJlc2VydmVkXzQ7CisJX19sZTMyIG9wdGlvbl9mbGFnczsKIAl1aW50OF90IHN0YXR1czsKIAl1aW50OF90IHJlc2VydmVkXzU7CiAJdWludDhfdCBjb21tYW5kX2NvdW50OwkvKiBOdW1iZXIgb2YgQVRJT3MgYWxsb2NhdGVkLiAqLwpAQCAtNzE0LDggKzcwMiw4IEBACiAJLyogY29tbWFuZHMgKDItMjYpLiAqLwogCXVpbnQ4X3QgZ3JvdXBfN19sZW5ndGg7CS8qIFNDU0kgQ0RCIGxlbmd0aCBmb3IgZ3JvdXAgNyAqLwogCS8qIGNvbW1hbmRzICgyLTI2KS4gKi8KLQl1aW50MTZfdCB0aW1lb3V0OwkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLwotCXVpbnQxNl90IHJlc2VydmVkXzZbMjBdOworCV9fbGUxNiB0aW1lb3V0OwkJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KKwlfX2xlMTYgcmVzZXJ2ZWRfNlsyMF07CiB9OwogCiAvKgpAQCAtNzI5LDIwICs3MTcsMjAgQEAKIAl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KIAl1aW50OF90IHJlc2VydmVkXzE7CiAJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KLQl1aW50MzJfdCByZXNlcnZlZF8yOworCV9fbGUzMiByZXNlcnZlZF8yOwogCXVpbnQ4X3QgbHVuOwkJLyogU0NTSSBMVU4gKi8KIAl1aW50OF90IHJlc2VydmVkXzM7CiAJdWludDhfdCBvcGVyYXRvcnM7CiAJdWludDhfdCByZXNlcnZlZF80OwotCXVpbnQzMl90IG9wdGlvbl9mbGFnczsKKwlfX2xlMzIgb3B0aW9uX2ZsYWdzOwogCXVpbnQ4X3Qgc3RhdHVzOwogCXVpbnQ4X3QgcmVzZXJ2ZWRfNTsKIAl1aW50OF90IGNvbW1hbmRfY291bnQ7CS8qIE51bWJlciBvZiBBVElPcyBhbGxvY2F0ZWQuICovCiAJdWludDhfdCBpbW1lZF9ub3RpZnlfY291bnQ7CS8qIE51bWJlciBvZiBJbW1lZGlhdGUgTm90aWZ5ICovCiAJLyogZW50cmllcyBhbGxvY2F0ZWQuICovCi0JdWludDE2X3QgcmVzZXJ2ZWRfNjsKLQl1aW50MTZfdCB0aW1lb3V0OwkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLwotCXVpbnQxNl90IHJlc2VydmVkXzdbMjBdOworCV9fbGUxNiByZXNlcnZlZF82OworCV9fbGUxNiB0aW1lb3V0OwkJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KKwlfX2xlMTYgcmVzZXJ2ZWRfN1syMF07CiB9OwogCiAvKgpAQCAtNzU0LDIwICs3NDIsMjAgQEAKIAl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KIAl1aW50OF90IHJlc2VydmVkXzE7CiAJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KLQl1aW50MzJfdCByZXNlcnZlZF8yOworCV9fbGUzMiByZXNlcnZlZF8yOwogCXVpbnQ4X3QgbHVuOwogCXVpbnQ4X3QgaW5pdGlhdG9yX2lkOwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMzsKIAl1aW50OF90IHRhcmdldF9pZDsKLQl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJX19sZTMyIG9wdGlvbl9mbGFnczsKIAl1aW50OF90IHN0YXR1czsKIAl1aW50OF90IHJlc2VydmVkXzQ7CiAJdWludDhfdCB0YWdfdmFsdWU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHZhbHVlICovCiAJdWludDhfdCB0YWdfdHlwZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdHlwZSAqLwogCS8qIGVudHJpZXMgYWxsb2NhdGVkLiAqLwotCXVpbnQxNl90IHNlcV9pZDsKKwlfX2xlMTYgc2VxX2lkOwogCXVpbnQ4X3Qgc2NzaV9tc2dbOF07CS8qIFNDU0kgbWVzc2FnZSBub3QgaGFuZGxlZCBieSBJU1AgKi8KLQl1aW50MTZfdCByZXNlcnZlZF81WzhdOworCV9fbGUxNiByZXNlcnZlZF81WzhdOwogCXVpbnQ4X3Qgc2Vuc2VfZGF0YVsxOF07CiB9OwogCkBAIC03ODAsMTYgKzc2OCwxNiBAQAogCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKIAl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLwotCXVpbnQzMl90IHJlc2VydmVkXzI7CisJX19sZTMyIHJlc2VydmVkXzI7CiAJdWludDhfdCBsdW47CiAJdWludDhfdCBpbml0aWF0b3JfaWQ7CiAJdWludDhfdCByZXNlcnZlZF8zOwogCXVpbnQ4X3QgdGFyZ2V0X2lkOwotCXVpbnQzMl90IG9wdGlvbl9mbGFnczsKKwlfX2xlMzIgb3B0aW9uX2ZsYWdzOwogCXVpbnQ4X3Qgc3RhdHVzOwogCXVpbnQ4X3QgZXZlbnQ7Ci0JdWludDE2X3Qgc2VxX2lkOwotCXVpbnQxNl90IHJlc2VydmVkXzRbMjJdOworCV9fbGUxNiBzZXFfaWQ7CisJX19sZTE2IHJlc2VydmVkXzRbMjJdOwogfTsKIAogLyoKQEAgLTgwMSwxMiArNzg5LDEyIEBACiAJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCiAJdWludDhfdCByZXNlcnZlZF8xOwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCi0JdWludDMyX3QgcmVzZXJ2ZWRfMjsKKwlfX2xlMzIgcmVzZXJ2ZWRfMjsKIAl1aW50OF90IGx1bjsKIAl1aW50OF90IGluaXRpYXRvcl9pZDsKIAl1aW50OF90IGNkYl9sZW47CiAJdWludDhfdCB0YXJnZXRfaWQ7Ci0JdWludDMyX3Qgb3B0aW9uX2ZsYWdzOworCV9fbGUzMiBvcHRpb25fZmxhZ3M7CiAJdWludDhfdCBzdGF0dXM7CiAJdWludDhfdCBzY3NpX3N0YXR1czsKIAl1aW50OF90IHRhZ192YWx1ZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdmFsdWUgKi8KQEAgLTgyNCwyOCArODEyLDI4IEBACiAJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCiAJdWludDhfdCByZXNlcnZlZF8xOwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCi0JdWludDMyX3QgcmVzZXJ2ZWRfMjsKKwlfX2xlMzIgcmVzZXJ2ZWRfMjsKIAl1aW50OF90IGx1bjsJCS8qIFNDU0kgTFVOICovCiAJdWludDhfdCBpbml0aWF0b3JfaWQ7CiAJdWludDhfdCByZXNlcnZlZF8zOwogCXVpbnQ4X3QgdGFyZ2V0X2lkOwotCXVpbnQzMl90IG9wdGlvbl9mbGFnczsKKwlfX2xlMzIgb3B0aW9uX2ZsYWdzOwogCXVpbnQ4X3Qgc3RhdHVzOwogCXVpbnQ4X3Qgc2NzaV9zdGF0dXM7CiAJdWludDhfdCB0YWdfdmFsdWU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHZhbHVlICovCiAJdWludDhfdCB0YWdfdHlwZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdHlwZSAqLwotCXVpbnQzMl90IHRyYW5zZmVyX2xlbmd0aDsKLQl1aW50MzJfdCByZXNpZHVhbDsKLQl1aW50MTZfdCB0aW1lb3V0OwkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLwotCXVpbnQxNl90IGRzZWdfY291bnQ7CS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KLQl1aW50MzJfdCBkc2VnXzBfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzBfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCi0JdWludDMyX3QgZHNlZ18xX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18xX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLwotCXVpbnQzMl90IGRzZWdfMl9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMiBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfMl9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAyIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzNfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDMgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzNfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMyBsZW5ndGguICovCisJX19sZTMyIHRyYW5zZmVyX2xlbmd0aDsKKwlfX2xlMzIgcmVzaWR1YWw7CisJX19sZTE2IHRpbWVvdXQ7CQkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLworCV9fbGUxNiBkc2VnX2NvdW50OwkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCisJX19sZTMyIGRzZWdfMF9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzBfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJX19sZTMyIGRzZWdfMV9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzFfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCisJX19sZTMyIGRzZWdfMl9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMiBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzJfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCisJX19sZTMyIGRzZWdfM19hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMyBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzNfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMyBsZW5ndGguICovCiB9OwogCiAvKgpAQCAtODU3LDI0ICs4NDUsMjQgQEAKIAl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KIAl1aW50OF90IHJlc2VydmVkXzE7CiAJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KLQl1aW50MzJfdCByZXNlcnZlZF8yOworCV9fbGUzMiByZXNlcnZlZF8yOwogCXVpbnQ4X3QgbHVuOwkJLyogU0NTSSBMVU4gKi8KIAl1aW50OF90IGluaXRpYXRvcl9pZDsKIAl1aW50OF90IHJlc2VydmVkXzM7CiAJdWludDhfdCB0YXJnZXRfaWQ7Ci0JdWludDMyX3Qgb3B0aW9uX2ZsYWdzOworCV9fbGUzMiBvcHRpb25fZmxhZ3M7CiAJdWludDhfdCBzdGF0dXM7CiAJdWludDhfdCBzY3NpX3N0YXR1czsKIAl1aW50OF90IHRhZ192YWx1ZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdmFsdWUgKi8KIAl1aW50OF90IHRhZ190eXBlOwkvKiBSZWNlaXZlZCBxdWV1ZSB0YWcgbWVzc2FnZSB0eXBlICovCi0JdWludDMyX3QgdHJhbnNmZXJfbGVuZ3RoOwotCXVpbnQzMl90IHJlc2lkdWFsOwotCXVpbnQxNl90IHRpbWVvdXQ7CS8qIDAgPSAzMCBzZWNvbmRzLCAweEZGRkYgPSBkaXNhYmxlICovCi0JdWludDE2X3QgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLwotCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzFfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KLQl1aW50MTZfdCBkc2VnXzFfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCisJX19sZTMyIHRyYW5zZmVyX2xlbmd0aDsKKwlfX2xlMzIgcmVzaWR1YWw7CisJX19sZTE2IHRpbWVvdXQ7CQkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLworCV9fbGUxNiBkc2VnX2NvdW50OwkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCisJX19sZTMyIGRzZWdfMF9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzBfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJX19sZTMyIGRzZWdfMV9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLworCV9fbGUxNiBkc2VnXzFfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCiAJdWludDhfdCBzZW5zZV9kYXRhWzE4XTsKIH07CiAKQEAgLTg4NywyNSArODc1LDI1IEBACiAJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCiAJdWludDhfdCByZXNlcnZlZF8xOwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCi0JdWludDMyX3QgcmVzZXJ2ZWRfMjsKKwlfX2xlMzIgcmVzZXJ2ZWRfMjsKIAl1aW50OF90IGx1bjsJCS8qIFNDU0kgTFVOICovCiAJdWludDhfdCBpbml0aWF0b3JfaWQ7CiAJdWludDhfdCByZXNlcnZlZF8zOwogCXVpbnQ4X3QgdGFyZ2V0X2lkOwotCXVpbnQzMl90IG9wdGlvbl9mbGFnczsKKwlfX2xlMzIgb3B0aW9uX2ZsYWdzOwogCXVpbnQ4X3Qgc3RhdHVzOwogCXVpbnQ4X3Qgc2NzaV9zdGF0dXM7CiAJdWludDhfdCB0YWdfdmFsdWU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHZhbHVlICovCiAJdWludDhfdCB0YWdfdHlwZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdHlwZSAqLwotCXVpbnQzMl90IHRyYW5zZmVyX2xlbmd0aDsKLQl1aW50MzJfdCByZXNpZHVhbDsKLQl1aW50MTZfdCB0aW1lb3V0OwkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLwotCXVpbnQxNl90IGRzZWdfY291bnQ7CS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KLQl1aW50MzJfdCByZXNlcnZlZF80WzJdOwotCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzFfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCisJX19sZTMyIHRyYW5zZmVyX2xlbmd0aDsKKwlfX2xlMzIgcmVzaWR1YWw7CisJX19sZTE2IHRpbWVvdXQ7CQkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLworCV9fbGUxNiBkc2VnX2NvdW50OwkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCisJX19sZTMyIHJlc2VydmVkXzRbMl07CisJX19sZTMyIGRzZWdfMF9hZGRyZXNzWzJdOy8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJX19sZTMyIGRzZWdfMF9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwlfX2xlMzIgZHNlZ18xX2FkZHJlc3NbMl07LyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18xX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLwogfTsKIAogLyoKQEAgLTkxNywyMSArOTA1LDIxIEBACiAJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCiAJdWludDhfdCByZXNlcnZlZF8xOwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCi0JdWludDMyX3QgcmVzZXJ2ZWRfMjsKKwlfX2xlMzIgcmVzZXJ2ZWRfMjsKIAl1aW50OF90IGx1bjsJCS8qIFNDU0kgTFVOICovCiAJdWludDhfdCBpbml0aWF0b3JfaWQ7CiAJdWludDhfdCByZXNlcnZlZF8zOwogCXVpbnQ4X3QgdGFyZ2V0X2lkOwotCXVpbnQzMl90IG9wdGlvbl9mbGFnczsKKwlfX2xlMzIgb3B0aW9uX2ZsYWdzOwogCXVpbnQ4X3Qgc3RhdHVzOwogCXVpbnQ4X3Qgc2NzaV9zdGF0dXM7CiAJdWludDhfdCB0YWdfdmFsdWU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHZhbHVlICovCiAJdWludDhfdCB0YWdfdHlwZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdHlwZSAqLwotCXVpbnQzMl90IHRyYW5zZmVyX2xlbmd0aDsKLQl1aW50MzJfdCByZXNpZHVhbDsKLQl1aW50MTZfdCB0aW1lb3V0OwkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLwotCXVpbnQxNl90IGRzZWdfY291bnQ7CS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KLQl1aW50MTZfdCByZXNlcnZlZF80WzddOworCV9fbGUzMiB0cmFuc2Zlcl9sZW5ndGg7CisJX19sZTMyIHJlc2lkdWFsOworCV9fbGUxNiB0aW1lb3V0OwkJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KKwlfX2xlMTYgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCV9fbGUxNiByZXNlcnZlZF80WzddOwogCXVpbnQ4X3Qgc2Vuc2VfZGF0YVsxOF07CiB9OwogCkBAIC05NzksMTQgKzk2Nyw2IEBACiAjZGVmaW5lIENTX1JFVFJZICAgICAgICAgICAgMHg4MgkvKiBEcml2ZXIgZGVmaW5lZCAqLwogCiAvKgotICogSVNQIHN0YXR1cyBlbnRyeSAtIFNDU0kgc3RhdHVzIGJ5dGUgYml0IGRlZmluaXRpb25zLgotICovCi0jZGVmaW5lIFNTX0NIRUNLX0NPTkRJVElPTiAgQklUXzEKLSNkZWZpbmUgU1NfQ09ORElUSU9OX01FVCAgICBCSVRfMgotI2RlZmluZSBTU19CVVNZX0NPTkRJVElPTiAgIEJJVF8zCi0jZGVmaW5lIFNTX1JFU0VSVkVfQ09ORkxJQ1QgKEJJVF80IHwgQklUXzMpCi0KLS8qCiAgKiBJU1AgdGFyZ2V0IGVudHJpZXMgLSBPcHRpb24gZmxhZ3MgYml0IGRlZmluaXRpb25zLgogICovCiAjZGVmaW5lIE9GX0VOQUJMRV9UQUcgICAgICAgQklUXzEJLyogVGFnZ2VkIHF1ZXVlIGFjdGlvbiBlbmFibGUgKi8KQEAgLTEwODIsMTAgKzEwNjIsNiBAQAogCQl1aW50MzJfdCByZXNldF9hY3RpdmU6MTsJCS8qIDMgKi8KIAkJdWludDMyX3QgYWJvcnRfaXNwX2FjdGl2ZToxOwkJLyogNCAqLwogCQl1aW50MzJfdCBkaXNhYmxlX3Jpc2NfY29kZV9sb2FkOjE7CS8qIDUgKi8KLQkJdWludDMyX3QgZW5hYmxlXzY0Yml0X2FkZHJlc3Npbmc6MTsJLyogNiAqLwotCQl1aW50MzJfdCBpbl9yZXNldDoxOwkJCS8qIDcgKi8KLQkJdWludDMyX3QgaW50c19lbmFibGVkOjE7Ci0JCXVpbnQzMl90IGlnbm9yZV9udnJhbToxOwogI2lmZGVmIF9faWE2NF9fCiAJCXVpbnQzMl90IHVzZV9wY2lfdmNoYW5uZWw6MTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKaW5kZXggNjU5YTVkNi4uZmUwZmNlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCkBAIC0yMTEsNiArMjExLDEzOCBAQAogCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosICZzeXNmc19udnJhbV9hdHRyKTsKIH0KIAorLyogU2NzaV9Ib3N0IGF0dHJpYnV0ZXMuICovCisKK3N0YXRpYyBzc2l6ZV90CitxbGEyeDAwX2RydnJfdmVyc2lvbl9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgcWxhMngwMF92ZXJzaW9uX3N0cik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxbGEyeDAwX2Z3X3ZlcnNpb25fc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc2NzaV9xbGFfaG9zdF90ICpoYSA9IHRvX3FsYV9ob3N0KGNsYXNzX3RvX3Nob3N0KGNkZXYpKTsKKwljaGFyIGZ3X3N0clszMF07CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwKKwkgICAgaGEtPmlzcF9vcHMuZndfdmVyc2lvbl9zdHIoaGEsIGZ3X3N0cikpOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhMngwMF9zZXJpYWxfbnVtX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfaG9zdChjbGFzc190b19zaG9zdChjZGV2KSk7CisJdWludDMyX3Qgc247CisKKwlzbiA9ICgoaGEtPnNlcmlhbDAgJiAweDFmKSA8PCAxNikgfCAoaGEtPnNlcmlhbDIgPDwgOCkgfCBoYS0+c2VyaWFsMTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlYyUwNWRcbiIsICdBJyArIHNuIC8gMTAwMDAwLAorCSAgICBzbiAlIDEwMDAwMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxbGEyeDAwX2lzcF9uYW1lX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfaG9zdChjbGFzc190b19zaG9zdChjZGV2KSk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGhhLT5icmRfaW5mby0+aXNwX25hbWUpOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhMngwMF9pc3BfaWRfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc2NzaV9xbGFfaG9zdF90ICpoYSA9IHRvX3FsYV9ob3N0KGNsYXNzX3RvX3Nob3N0KGNkZXYpKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlMDR4ICUwNHggJTA0eCAlMDR4XG4iLAorCSAgICBoYS0+cHJvZHVjdF9pZFswXSwgaGEtPnByb2R1Y3RfaWRbMV0sIGhhLT5wcm9kdWN0X2lkWzJdLAorCSAgICBoYS0+cHJvZHVjdF9pZFszXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxbGEyeDAwX21vZGVsX25hbWVfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc2NzaV9xbGFfaG9zdF90ICpoYSA9IHRvX3FsYV9ob3N0KGNsYXNzX3RvX3Nob3N0KGNkZXYpKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgaGEtPm1vZGVsX251bWJlcik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxbGEyeDAwX21vZGVsX2Rlc2Nfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc2NzaV9xbGFfaG9zdF90ICpoYSA9IHRvX3FsYV9ob3N0KGNsYXNzX3RvX3Nob3N0KGNkZXYpKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwKKwkgICAgaGEtPm1vZGVsX2Rlc2MgPyBoYS0+bW9kZWxfZGVzYzogIiIpOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhMngwMF9wY2lfaW5mb19zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdG9fcWxhX2hvc3QoY2xhc3NfdG9fc2hvc3QoY2RldikpOworCWNoYXIgcGNpX2luZm9bMzBdOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCisJICAgIGhhLT5pc3Bfb3BzLnBjaV9pbmZvX3N0cihoYSwgcGNpX2luZm8pKTsKK30KKworc3RhdGljIHNzaXplX3QKK3FsYTJ4MDBfc3RhdGVfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc2NzaV9xbGFfaG9zdF90ICpoYSA9IHRvX3FsYV9ob3N0KGNsYXNzX3RvX3Nob3N0KGNkZXYpKTsKKwlpbnQgbGVuID0gMDsKKworCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfRE9XTiB8fAorCSAgICBhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfREVBRCkKKwkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJMaW5rIERvd25cbiIpOworCWVsc2UgaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9SRUFEWSB8fAorCSAgICB0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKQorCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIlVua25vd24gTGluayBTdGF0ZVxuIik7CisJZWxzZSB7CisJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiTGluayBVcCAtICIpOworCisJCXN3aXRjaCAoaGEtPmN1cnJlbnRfdG9wb2xvZ3kpIHsKKwkJY2FzZSBJU1BfQ0ZHX05MOgorCQkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFLWxlbiwgIkxvb3BcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSVNQX0NGR19GTDoKKwkJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRS1sZW4sICJGTF9Qb3J0XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElTUF9DRkdfTjoKKwkJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRS1sZW4sCisJCQkgICAgIk5fUG9ydCB0byBOX1BvcnRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSVNQX0NGR19GOgorCQkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFLWxlbiwgIkZfUG9ydFxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRS1sZW4sICJMb29wXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihkcml2ZXJfdmVyc2lvbiwgU19JUlVHTywgcWxhMngwMF9kcnZyX3ZlcnNpb25fc2hvdywKKwlOVUxMKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihmd192ZXJzaW9uLCBTX0lSVUdPLCBxbGEyeDAwX2Z3X3ZlcnNpb25fc2hvdywgTlVMTCk7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoc2VyaWFsX251bSwgU19JUlVHTywgcWxhMngwMF9zZXJpYWxfbnVtX3Nob3csIE5VTEwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGlzcF9uYW1lLCBTX0lSVUdPLCBxbGEyeDAwX2lzcF9uYW1lX3Nob3csIE5VTEwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGlzcF9pZCwgU19JUlVHTywgcWxhMngwMF9pc3BfaWRfc2hvdywgTlVMTCk7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobW9kZWxfbmFtZSwgU19JUlVHTywgcWxhMngwMF9tb2RlbF9uYW1lX3Nob3csIE5VTEwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG1vZGVsX2Rlc2MsIFNfSVJVR08sIHFsYTJ4MDBfbW9kZWxfZGVzY19zaG93LCBOVUxMKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihwY2lfaW5mbywgU19JUlVHTywgcWxhMngwMF9wY2lfaW5mb19zaG93LCBOVUxMKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihzdGF0ZSwgU19JUlVHTywgcWxhMngwMF9zdGF0ZV9zaG93LCBOVUxMKTsKKworc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKnFsYTJ4MDBfaG9zdF9hdHRyc1tdID0geworCSZjbGFzc19kZXZpY2VfYXR0cl9kcml2ZXJfdmVyc2lvbiwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfZndfdmVyc2lvbiwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfc2VyaWFsX251bSwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaXNwX25hbWUsCisJJmNsYXNzX2RldmljZV9hdHRyX2lzcF9pZCwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfbW9kZWxfbmFtZSwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfbW9kZWxfZGVzYywKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcGNpX2luZm8sCisJJmNsYXNzX2RldmljZV9hdHRyX3N0YXRlLAorCU5VTEwsCit9OworCiAvKiBIb3N0IGF0dHJpYnV0ZXMuICovCiAKIHN0YXRpYyB2b2lkCkBAIC0zMDQsMTAgKzQzNiwxMyBAQAogCiAJLnNob3dfaG9zdF9ub2RlX25hbWUgPSAxLAogCS5zaG93X2hvc3RfcG9ydF9uYW1lID0gMSwKKwkuc2hvd19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzID0gMSwKKwogCS5nZXRfaG9zdF9wb3J0X2lkID0gcWxhMngwMF9nZXRfaG9zdF9wb3J0X2lkLAogCS5zaG93X2hvc3RfcG9ydF9pZCA9IDEsCiAKIAkuZGRfZmNycG9ydF9zaXplID0gc2l6ZW9mKHN0cnVjdCBmY19wb3J0ICopLAorCS5zaG93X3Jwb3J0X3N1cHBvcnRlZF9jbGFzc2VzID0gMSwKIAogCS5nZXRfc3RhcmdldF9ub2RlX25hbWUgPSBxbGEyeDAwX2dldF9zdGFyZ2V0X25vZGVfbmFtZSwKIAkuc2hvd19zdGFyZ2V0X25vZGVfbmFtZSA9IDEsCkBAIC0zMjksNCArNDY0LDUgQEAKIAkgICAgYmU2NF90b19jcHUoKih1aW50NjRfdCAqKWhhLT5pbml0X2NiLT5ub2RlX25hbWUpOwogCWZjX2hvc3RfcG9ydF9uYW1lKGhhLT5ob3N0KSA9CiAJICAgIGJlNjRfdG9fY3B1KCoodWludDY0X3QgKiloYS0+aW5pdF9jYi0+cG9ydF9uYW1lKTsKKwlmY19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzKGhhLT5ob3N0KSA9IEZDX0NPU19DTEFTUzM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKaW5kZXggNzJiYmFhOS4uOTc5MTQ5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwpAQCAtMTMzNCw3ICsxMzM0LDcgQEAKIAogCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOwogCQlXUlRfUkVHX0RXT1JEKGRtcF9yZWcsIDB4QjAyMDAwMDApOwotCQlkbXBfcmVnID0gKHVpbnQzMl90ICopKCh1aW50OF90ICopcmVnICsgMHhGQyk7CisJCWRtcF9yZWcgPSAodWludDMyX3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHhGQyk7CiAJCWZ3LT5zaGFkb3dfcmVnWzJdID0gUkRfUkVHX0RXT1JEKGRtcF9yZWcpOwogCiAJCWRtcF9yZWcgPSAodWludDMyX3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHhGMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKaW5kZXggYjhkOTBlOS4uOTY4NGU3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaApAQCAtODEsNiArODEsNyBAQAogI2RlZmluZSBERUJVRzJfM18xMSh4KSAgZG8ge3g7fSB3aGlsZSAoMCk7CiAjZGVmaW5lIERFQlVHMl85XzEwKHgpICAgIGRvIHt4O30gd2hpbGUgKDApOwogI2RlZmluZSBERUJVRzJfMTEoeCkgICAgZG8ge3g7fSB3aGlsZSAoMCk7CisjZGVmaW5lIERFQlVHMl8xMyh4KSAgICBkbyB7eDt9IHdoaWxlICgwKTsKICNlbHNlCiAjZGVmaW5lIERFQlVHMih4KQlkbyB7fSB3aGlsZSAoMCk7CiAjZW5kaWYKQEAgLTE2OSw4ICsxNzAsMTQgQEAKIAogI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTMpCiAjZGVmaW5lIERFQlVHMTMoeCkgICAgICBkbyB7eDt9IHdoaWxlICgwKQorI2lmICFkZWZpbmVkKERFQlVHMl8xMykKKyNkZWZpbmUgREVCVUcyXzEzKHgpICAgIGRvIHt4O30gd2hpbGUoMCkKKyNlbmRpZgogI2Vsc2UKICNkZWZpbmUgREVCVUcxMyh4KQlkbyB7fSB3aGlsZSAoMCkKKyNpZiAhZGVmaW5lZChRTF9ERUJVR19MRVZFTF8yKQorI2RlZmluZSBERUJVRzJfMTMoeCkJZG8ge30gd2hpbGUoMCkKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzE0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCmluZGV4IDFjNmQzNjYuLmI0NTVjMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKQEAgLTIxNCw2ICsyMTQsNyBAQAogICogdmFsaWQgcmFuZ2Ugb2YgYW4gTi1QT1JUIGlkIGlzIDAgdGhyb3VnaCAweDdlZi4KICAqLwogI2RlZmluZSBOUEhfTEFTVF9IQU5ETEUJCTB4N2VmCisjZGVmaW5lIE5QSF9NR01UX1NFUlZFUgkJMHg3ZmEJCS8qICBGRkZGRkEgKi8KICNkZWZpbmUgTlBIX1NOUwkJCTB4N2ZjCQkvKiAgRkZGRkZDICovCiAjZGVmaW5lIE5QSF9GQUJSSUNfQ09OVFJPTExFUgkweDdmZAkJLyogIEZGRkZGRCAqLwogI2RlZmluZSBOUEhfRl9QT1JUCQkweDdmZQkJLyogIEZGRkZGRSAqLwpAQCAtNjMwLDYgKzYzMSw3IEBACiAjZGVmaW5lIE1CQ19XUklURV9SQU1fV09SRF9FWFRFTkRFRAkweGQJLyogV3JpdGUgUkFNIHdvcmQgZXh0ZW5kZWQgKi8KICNkZWZpbmUgTUJDX1JFQURfUkFNX0VYVEVOREVECQkweGYJLyogUmVhZCBSQU0gZXh0ZW5kZWQuICovCiAjZGVmaW5lIE1CQ19JT0NCX0NPTU1BTkQJCTB4MTIJLyogRXhlY3V0ZSBJT0NCIGNvbW1hbmQuICovCisjZGVmaW5lIE1CQ19TVE9QX0ZJUk1XQVJFCQkweDE0CS8qIFN0b3AgZmlybXdhcmUuICovCiAjZGVmaW5lIE1CQ19BQk9SVF9DT01NQU5ECQkweDE1CS8qIEFib3J0IElPQ0IgY29tbWFuZC4gKi8KICNkZWZpbmUgTUJDX0FCT1JUX0RFVklDRQkJMHgxNgkvKiBBYm9ydCBkZXZpY2UgKElEL0xVTikuICovCiAjZGVmaW5lIE1CQ19BQk9SVF9UQVJHRVQJCTB4MTcJLyogQWJvcnQgdGFyZ2V0IChJRCkuICovCkBAIC05MTMsNyArOTE1LDcgQEAKIAkgKiBNU0IgQklUIDEgPQogCSAqIE1TQiBCSVQgMiA9CiAJICogTVNCIEJJVCAzID0KLQkgKiBNU0IgQklUIDQgPQorCSAqIE1TQiBCSVQgNCA9IExFRCBtb2RlCiAJICogTVNCIEJJVCA1ID0gZW5hYmxlIDUwIG9obSB0ZXJtaW5hdGlvbgogCSAqIE1TQiBCSVQgNiA9IERhdGEgUmF0ZSAoMjMwMCBvbmx5KQogCSAqIE1TQiBCSVQgNyA9IERhdGEgUmF0ZSAoMjMwMCBvbmx5KQpAQCAtMTAzNSw3ICsxMDM3LDcgQEAKIAkgKiBNU0IgQklUIDEgPQogCSAqIE1TQiBCSVQgMiA9CiAJICogTVNCIEJJVCAzID0KLQkgKiBNU0IgQklUIDQgPQorCSAqIE1TQiBCSVQgNCA9IExFRCBtb2RlCiAJICogTVNCIEJJVCA1ID0gZW5hYmxlIDUwIG9obSB0ZXJtaW5hdGlvbgogCSAqIE1TQiBCSVQgNiA9IERhdGEgUmF0ZSAoMjMwMCBvbmx5KQogCSAqIE1TQiBCSVQgNyA9IERhdGEgUmF0ZSAoMjMwMCBvbmx5KQpAQCAtMTEzMSwxMCArMTEzMyw3IEBACiAKIAl1aW50OF90IGxpbmtfZG93bl90aW1lb3V0OwogCi0JdWludDhfdCBhZGFwdGVyX2lkXzBbNF07Ci0JdWludDhfdCBhZGFwdGVyX2lkXzFbNF07Ci0JdWludDhfdCBhZGFwdGVyX2lkXzJbNF07Ci0JdWludDhfdCBhZGFwdGVyX2lkXzNbNF07CisJdWludDhfdCBhZGFwdGVyX2lkWzE2XTsKIAogCXVpbnQ4X3QgYWx0MV9ib290X25vZGVfbmFtZVtXV05fU0laRV07CiAJdWludDE2X3QgYWx0MV9ib290X2x1bl9udW1iZXI7CkBAIC0xNjczLDYgKzE2NzIsNyBAQAogICAgIAl1aW50OF90IGN1cl9wYXRoOwkJLyogY3VycmVudCBwYXRoIGlkICovCiAKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OworCXUzMiBzdXBwb3J0ZWRfY2xhc3NlczsKIH0gZmNfcG9ydF90OwogCiAvKgpAQCAtMTcyNyw2ICsxNzI3LDggQEAKIAogI2RlZmluZSBDVF9SRUpFQ1RfUkVTUE9OU0UJMHg4MDAxCiAjZGVmaW5lIENUX0FDQ0VQVF9SRVNQT05TRQkweDgwMDIKKyNkZWZpbmUgQ1RfUkVBU09OX0NBTk5PVF9QRVJGT1JNCTB4MDkKKyNkZWZpbmUgQ1RfRVhQTF9BTFJFQURZX1JFR0lTVEVSRUQJMHgxMAogCiAjZGVmaW5lIE5TX05fUE9SVF9UWVBFCTB4MDEKICNkZWZpbmUgTlNfTkxfUE9SVF9UWVBFCTB4MDIKQEAgLTE3NjgsNiArMTc3MCwxMDAgQEAKICNkZWZpbmUJUlNOTl9OTl9SRVFfU0laRSAoMTYgKyA4ICsgMSArIDI1NSkKICNkZWZpbmUJUlNOTl9OTl9SU1BfU0laRSAxNgogCisvKgorICogSEJBIGF0dHJpYnV0ZSB0eXBlcy4KKyAqLworI2RlZmluZSBGRE1JX0hCQV9BVFRSX0NPVU5UCQkJOQorI2RlZmluZSBGRE1JX0hCQV9OT0RFX05BTUUJCQkxCisjZGVmaW5lIEZETUlfSEJBX01BTlVGQUNUVVJFUgkJCTIKKyNkZWZpbmUgRkRNSV9IQkFfU0VSSUFMX05VTUJFUgkJCTMKKyNkZWZpbmUgRkRNSV9IQkFfTU9ERUwJCQkJNAorI2RlZmluZSBGRE1JX0hCQV9NT0RFTF9ERVNDUklQVElPTgkJNQorI2RlZmluZSBGRE1JX0hCQV9IQVJEV0FSRV9WRVJTSU9OCQk2CisjZGVmaW5lIEZETUlfSEJBX0RSSVZFUl9WRVJTSU9OCQkJNworI2RlZmluZSBGRE1JX0hCQV9PUFRJT05fUk9NX1ZFUlNJT04JCTgKKyNkZWZpbmUgRkRNSV9IQkFfRklSTVdBUkVfVkVSU0lPTgkJOQorI2RlZmluZSBGRE1JX0hCQV9PU19OQU1FX0FORF9WRVJTSU9OCQkweGEKKyNkZWZpbmUgRkRNSV9IQkFfTUFYSU1VTV9DVF9QQVlMT0FEX0xFTkdUSAkweGIKKworc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgeworCXVpbnQxNl90IHR5cGU7CisJdWludDE2X3QgbGVuOworCXVuaW9uIHsKKwkJdWludDhfdCBub2RlX25hbWVbV1dOX1NJWkVdOworCQl1aW50OF90IG1hbnVmYWN0dXJlclszMl07CisJCXVpbnQ4X3Qgc2VyaWFsX251bVs4XTsKKwkJdWludDhfdCBtb2RlbFsxNl07CisJCXVpbnQ4X3QgbW9kZWxfZGVzY1s4MF07CisJCXVpbnQ4X3QgaHdfdmVyc2lvblsxNl07CisJCXVpbnQ4X3QgZHJpdmVyX3ZlcnNpb25bMzJdOworCQl1aW50OF90IG9yb21fdmVyc2lvblsxNl07CisJCXVpbnQ4X3QgZndfdmVyc2lvblsxNl07CisJCXVpbnQ4X3Qgb3NfdmVyc2lvblsxMjhdOworCQl1aW50OF90IG1heF9jdF9sZW5bNF07CisJfSBhOworfTsKKworc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHJpYnV0ZXMgeworCXVpbnQzMl90IGNvdW50OworCXN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyIGVudHJ5W0ZETUlfSEJBX0FUVFJfQ09VTlRdOworfTsKKworLyoKKyAqIFBvcnQgYXR0cmlidXRlIHR5cGVzLgorICovCisjZGVmaW5lIEZETUlfUE9SVF9BVFRSX0NPVU5UCQk1CisjZGVmaW5lIEZETUlfUE9SVF9GQzRfVFlQRVMJCTEKKyNkZWZpbmUgRkRNSV9QT1JUX1NVUFBPUlRfU1BFRUQJCTIKKyNkZWZpbmUgRkRNSV9QT1JUX0NVUlJFTlRfU1BFRUQJCTMKKyNkZWZpbmUgRkRNSV9QT1JUX01BWF9GUkFNRV9TSVpFCTQKKyNkZWZpbmUgRkRNSV9QT1JUX09TX0RFVklDRV9OQU1FCTUKKyNkZWZpbmUgRkRNSV9QT1JUX0hPU1RfTkFNRQkJNgorCitzdHJ1Y3QgY3RfZmRtaV9wb3J0X2F0dHIgeworCXVpbnQxNl90IHR5cGU7CisJdWludDE2X3QgbGVuOworCXVuaW9uIHsKKwkJdWludDhfdCBmYzRfdHlwZXNbMzJdOworCQl1aW50MzJfdCBzdXBfc3BlZWQ7CisJCXVpbnQzMl90IGN1cl9zcGVlZDsKKwkJdWludDMyX3QgbWF4X2ZyYW1lX3NpemU7CisJCXVpbnQ4X3Qgb3NfZGV2X25hbWVbMzJdOworCQl1aW50OF90IGhvc3RfbmFtZVszMl07CisJfSBhOworfTsKKworLyoKKyAqIFBvcnQgQXR0cmlidXRlIEJsb2NrLgorICovCitzdHJ1Y3QgY3RfZmRtaV9wb3J0X2F0dHJpYnV0ZXMgeworCXVpbnQzMl90IGNvdW50OworCXN0cnVjdCBjdF9mZG1pX3BvcnRfYXR0ciBlbnRyeVtGRE1JX1BPUlRfQVRUUl9DT1VOVF07Cit9OworCisvKiBGRE1JIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBHUkhMX0NNRAkweDEwMAorI2RlZmluZSBHSEFUX0NNRAkweDEwMQorI2RlZmluZSBHUlBMX0NNRAkweDEwMgorI2RlZmluZSBHUEFUX0NNRAkweDExMAorCisjZGVmaW5lIFJIQkFfQ01ECTB4MjAwCisjZGVmaW5lIFJIQkFfUlNQX1NJWkUJMTYKKworI2RlZmluZSBSSEFUX0NNRAkweDIwMQorI2RlZmluZSBSUFJUX0NNRAkweDIxMAorCisjZGVmaW5lIFJQQV9DTUQJCTB4MjExCisjZGVmaW5lIFJQQV9SU1BfU0laRQkxNgorCisjZGVmaW5lIERIQkFfQ01ECTB4MzAwCisjZGVmaW5lIERIQkFfUkVRX1NJWkUJKDE2ICsgOCkKKyNkZWZpbmUgREhCQV9SU1BfU0laRQkxNgorCisjZGVmaW5lIERIQVRfQ01ECTB4MzAxCisjZGVmaW5lIERQUlRfQ01ECTB4MzEwCisjZGVmaW5lIERQQV9DTUQJCTB4MzExCisKIC8qIENUIGNvbW1hbmQgaGVhZGVyIC0tIHJlcXVlc3QvcmVzcG9uc2UgY29tbW9uIGZpZWxkcyAqLwogc3RydWN0IGN0X2NtZF9oZHIgewogCXVpbnQ4X3QgcmV2aXNpb247CkBAIC0xODI1LDYgKzE5MjEsNDMgQEAKIAkJCXVpbnQ4X3QgbmFtZV9sZW47CiAJCQl1aW50OF90IHN5bV9ub2RlX25hbWVbMjU1XTsKIAkJfSByc25uX25uOworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IGhiYV9pbmRlbnRpZmllcls4XTsKKwkJfSBnaGF0OworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IGhiYV9pZGVudGlmaWVyWzhdOworCQkJdWludDMyX3QgZW50cnlfY291bnQ7CisJCQl1aW50OF90IHBvcnRfbmFtZVs4XTsKKwkJCXN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyaWJ1dGVzIGF0dHJzOworCQl9IHJoYmE7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgaGJhX2lkZW50aWZpZXJbOF07CisJCQlzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0cmlidXRlcyBhdHRyczsKKwkJfSByaGF0OworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IHBvcnRfbmFtZVs4XTsKKwkJCXN0cnVjdCBjdF9mZG1pX3BvcnRfYXR0cmlidXRlcyBhdHRyczsKKwkJfSBycGE7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgcG9ydF9uYW1lWzhdOworCQl9IGRoYmE7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgcG9ydF9uYW1lWzhdOworCQl9IGRoYXQ7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgcG9ydF9uYW1lWzhdOworCQl9IGRwcnQ7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgcG9ydF9uYW1lWzhdOworCQl9IGRwYTsKIAl9IHJlcTsKIH07CiAKQEAgLTE4ODIsNiArMjAxNSwxMiBAQAogCQlzdHJ1Y3QgewogCQkJdWludDhfdCBmYzRfdHlwZXNbMzJdOwogCQl9IGdmdF9pZDsKKworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgZW50cnlfY291bnQ7CisJCQl1aW50OF90IHBvcnRfbmFtZVs4XTsKKwkJCXN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyaWJ1dGVzIGF0dHJzOworCQl9IGdoYXQ7CiAJfSByc3A7CiB9OwogCkBAIC0yMDMyLDYgKzIxNzEsOCBAQAogCXVpbnQxNl90ICgqY2FsY19yZXFfZW50cmllcykgKHVpbnQxNl90KTsKIAl2b2lkICgqYnVpbGRfaW9jYnMpIChzcmJfdCAqLCBjbWRfZW50cnlfdCAqLCB1aW50MTZfdCk7CiAJdm9pZCAqICgqcHJlcF9tc19pb2NiKSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgdWludDMyX3QsIHVpbnQzMl90KTsKKwl2b2lkICogKCpwcmVwX21zX2ZkbWlfaW9jYikgKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHVpbnQzMl90LAorCSAgICB1aW50MzJfdCk7CiAKIAl1aW50OF90ICogKCpyZWFkX252cmFtKSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgdWludDhfdCAqLAogCQl1aW50MzJfdCwgdWludDMyX3QpOwpAQCAtMjExMSw2ICsyMjUyLDcgQEAKICNkZWZpbmUgSU9DVExfRVJST1JfUkVDT1ZFUlkJMjMKICNkZWZpbmUgTE9PUF9SRVNFVF9ORUVERUQJMjQKICNkZWZpbmUgQkVBQ09OX0JMSU5LX05FRURFRAkyNQorI2RlZmluZSBSRUdJU1RFUl9GRE1JX05FRURFRAkyNgogCiAJdWludDMyX3QJZGV2aWNlX2ZsYWdzOwogI2RlZmluZSBERkxHX0xPQ0FMX0RFVklDRVMJCUJJVF8wCkBAIC0yMjA0LDYgKzIzNDYsNyBAQAogCWludAkJcG9ydF9kb3duX3JldHJ5X2NvdW50OwogCXVpbnQ4X3QJCW1ieF9jb3VudDsKIAl1aW50MTZfdAlsYXN0X2xvb3BfaWQ7CisJdWludDE2X3QJbWdtdF9zdnJfbG9vcF9pZDsKIAogICAgICAgICB1aW50MzJfdAlsb2dpbl9yZXRyeV9jb3VudDsKIApAQCAtMjMxOCw2ICsyNDYxLDcgQEAKIAl1aW50OF90CQltb2RlbF9udW1iZXJbMTYrMV07CiAjZGVmaW5lIEJJTlpFUk8JCSJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIKIAljaGFyCQkqbW9kZWxfZGVzYzsKKwl1aW50OF90CQlhZGFwdGVyX2lkWzE2KzFdOwogCiAJdWludDhfdAkJKm5vZGVfbmFtZTsKIAl1aW50OF90CQkqcG9ydF9uYW1lOwpAQCAtMjM3Nyw2ICsyNTIxLDcgQEAKICNkZWZpbmUgUUxBX1NVU1BFTkRFRAkJCTB4MTA2CiAjZGVmaW5lIFFMQV9CVVNZCQkJMHgxMDcKICNkZWZpbmUgUUxBX1JTQ05TX0hBTkRMRUQJCTB4MTA4CisjZGVmaW5lIFFMQV9BTFJFQURZX1JFR0lTVEVSRUQJCTB4MTA5CiAKIC8qCiAqIFN0YXQgaW5mbyBmb3IgYWxsIGFkcGF0ZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKaW5kZXggNjY1YzIwMy4uMWVkMzJlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtNzksNiArNzksNyBAQAogZXh0ZXJuIGludCBxbDJ4ZW5hYmxlemlvOwogZXh0ZXJuIGludCBxbDJ4aW50cmRlbGF5dGltZXI7CiBleHRlcm4gaW50IHFsMnhsb2dpbnJldHJ5Y291bnQ7CitleHRlcm4gaW50IHFsMnhmZG1pZW5hYmxlOwogCiBleHRlcm4gdm9pZCBxbGEyeDAwX3NwX2NvbXBsKHNjc2lfcWxhX2hvc3RfdCAqLCBzcmJfdCAqKTsKIApAQCAtMTQ3LDkgKzE0OCw2IEBACiAjZW5kaWYKIAogZXh0ZXJuIGludAotcWxhMngwMF90YXJnZXRfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICosIHN0cnVjdCBmY19wb3J0ICopOwotCi1leHRlcm4gaW50CiBxbGEyeDAwX2dldF9hZGFwdGVyX2lkKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCAqLCB1aW50OF90ICosIHVpbnQ4X3QgKiwKICAgICB1aW50OF90ICosIHVpbnQxNl90ICopOwogCkBAIC0yMTUsNiArMjEzLDkgQEAKIGV4dGVybiBpbnQKIHFsYTJ4MDBfc2V0X3NlcmRlc19wYXJhbXMoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90LCB1aW50MTZfdCwgdWludDE2X3QpOwogCitleHRlcm4gaW50CitxbGEyeDAwX3N0b3BfZmlybXdhcmUoc2NzaV9xbGFfaG9zdF90ICopOworCiAvKgogICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX2lzci5jIHNvdXJjZSBmaWxlLgogICovCkBAIC0yNjksNiArMjcwLDkgQEAKIGV4dGVybiBpbnQgcWxhMngwMF9yZmZfaWQoc2NzaV9xbGFfaG9zdF90ICopOwogZXh0ZXJuIGludCBxbGEyeDAwX3Jubl9pZChzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gaW50IHFsYTJ4MDBfcnNubl9ubihzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gdm9pZCAqcWxhMngwMF9wcmVwX21zX2ZkbWlfaW9jYihzY3NpX3FsYV9ob3N0X3QgKiwgdWludDMyX3QsIHVpbnQzMl90KTsKK2V4dGVybiB2b2lkICpxbGEyNHh4X3ByZXBfbXNfZmRtaV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MzJfdCwgdWludDMyX3QpOworZXh0ZXJuIGludCBxbGEyeDAwX2ZkbWlfcmVnaXN0ZXIoc2NzaV9xbGFfaG9zdF90ICopOwogCiAvKgogICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX3JzY24uYyBzb3VyY2UgZmlsZS4KQEAgLTI4OSw2ICsyOTMsOCBAQAogLyoKICAqIEdsb2JhbCBGdW5jdGlvbiBQcm90b3R5cGVzIGluIHFsYV9hdHRyLmMgc291cmNlIGZpbGUuCiAgKi8KK3N0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlOworZXh0ZXJuIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICpxbGEyeDAwX2hvc3RfYXR0cnNbXTsKIHN0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZTsKIGV4dGVybiBzdHJ1Y3QgZmNfZnVuY3Rpb25fdGVtcGxhdGUgcWxhMnh4eF90cmFuc3BvcnRfZnVuY3Rpb25zOwogZXh0ZXJuIHZvaWQgcWxhMngwMF9hbGxvY19zeXNmc19hdHRyKHNjc2lfcWxhX2hvc3RfdCAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKaW5kZXggMzFjZTRmNi4uZTdiMTM4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKQEAgLTEwOTksMyArMTA5OSw1NjcgQEAKIAogCXJldHVybiAocnZhbCk7CiB9CisKKy8qKgorICogcWxhMngwMF9tZ210X3N2cl9sb2dpbigpIC0gTG9naW4gdG8gZmFicmljIE1hbmFnbWVudCBTZXJ2aWNlLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfbWdtdF9zdnJfbG9naW4oc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgcmV0OworCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCisJcmV0ID0gUUxBX1NVQ0NFU1M7CisJaWYgKGhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4pCisJCXJldHVybiByZXQ7CisKKwloYS0+aXNwX29wcy5mYWJyaWNfbG9naW4oaGEsIGhhLT5tZ210X3N2cl9sb29wX2lkLCAweGZmLCAweGZmLCAweGZhLAorCSAgICBtYiwgQklUXzEpOworCWlmIChtYlswXSAhPSBNQlNfQ09NTUFORF9DT01QTEVURSkgeworCQlERUJVRzJfMTMocHJpbnRrKCIlcyglbGQpOiBGYWlsZWQgTUFOQUdFTUVOVF9TRVJWRVIgbG9naW46ICIKKwkJICAgICJsb29wX2lkPSV4IG1iWzBdPSV4IG1iWzFdPSV4IG1iWzJdPSV4IG1iWzZdPSV4IG1iWzddPSV4XG4iLAorCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vLCBoYS0+bWdtdF9zdnJfbG9vcF9pZCwgbWJbMF0sIG1iWzFdLAorCQkgICAgbWJbMl0sIG1iWzZdLCBtYls3XSkpOworCQlyZXQgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZQorCQloYS0+ZmxhZ3MubWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luID0gMTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogcWxhMngwMF9wcmVwX21zX2ZkbWlfaW9jYigpIC0gUHJlcGFyZSBjb21tb24gTVMgSU9DQiBmaWVsZHMgZm9yIEZETUkgcXVlcnkuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEByZXFfc2l6ZTogcmVxdWVzdCBzaXplIGluIGJ5dGVzCisgKiBAcnNwX3NpemU6IHJlc3BvbnNlIHNpemUgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgQGhhJ3MgbXNfaW9jYi4KKyAqLwordm9pZCAqCitxbGEyeDAwX3ByZXBfbXNfZmRtaV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IHJlcV9zaXplLAorICAgIHVpbnQzMl90IHJzcF9zaXplKQoreworCW1zX2lvY2JfZW50cnlfdCAqbXNfcGt0OworCisJbXNfcGt0ID0gaGEtPm1zX2lvY2I7CisJbWVtc2V0KG1zX3BrdCwgMCwgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOworCisJbXNfcGt0LT5lbnRyeV90eXBlID0gTVNfSU9DQl9UWVBFOworCW1zX3BrdC0+ZW50cnlfY291bnQgPSAxOworCVNFVF9UQVJHRVRfSUQoaGEsIG1zX3BrdC0+bG9vcF9pZCwgaGEtPm1nbXRfc3ZyX2xvb3BfaWQpOworCW1zX3BrdC0+Y29udHJvbF9mbGFncyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ0ZfUkVBRCB8IENGX0hFQURfVEFHKTsKKwltc19wa3QtPnRpbWVvdXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDU5KTsKKwltc19wa3QtPmNtZF9kc2RfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEpOworCW1zX3BrdC0+dG90YWxfZHNkX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigyKTsKKwltc19wa3QtPnJzcF9ieXRlY291bnQgPSBjcHVfdG9fbGUzMihyc3Bfc2l6ZSk7CisJbXNfcGt0LT5yZXFfYnl0ZWNvdW50ID0gY3B1X3RvX2xlMzIocmVxX3NpemUpOworCisJbXNfcGt0LT5kc2VnX3JlcV9hZGRyZXNzWzBdID0gY3B1X3RvX2xlMzIoTFNEKGhhLT5jdF9zbnNfZG1hKSk7CisJbXNfcGt0LT5kc2VnX3JlcV9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKGhhLT5jdF9zbnNfZG1hKSk7CisJbXNfcGt0LT5kc2VnX3JlcV9sZW5ndGggPSBtc19wa3QtPnJlcV9ieXRlY291bnQ7CisKKwltc19wa3QtPmRzZWdfcnNwX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QoaGEtPmN0X3Nuc19kbWEpKTsKKwltc19wa3QtPmRzZWdfcnNwX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QoaGEtPmN0X3Nuc19kbWEpKTsKKwltc19wa3QtPmRzZWdfcnNwX2xlbmd0aCA9IG1zX3BrdC0+cnNwX2J5dGVjb3VudDsKKworCXJldHVybiBtc19wa3Q7Cit9CisKKy8qKgorICogcWxhMjR4eF9wcmVwX21zX2ZkbWlfaW9jYigpIC0gUHJlcGFyZSBjb21tb24gTVMgSU9DQiBmaWVsZHMgZm9yIEZETUkgcXVlcnkuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEByZXFfc2l6ZTogcmVxdWVzdCBzaXplIGluIGJ5dGVzCisgKiBAcnNwX3NpemU6IHJlc3BvbnNlIHNpemUgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgQGhhJ3MgbXNfaW9jYi4KKyAqLwordm9pZCAqCitxbGEyNHh4X3ByZXBfbXNfZmRtaV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IHJlcV9zaXplLAorICAgIHVpbnQzMl90IHJzcF9zaXplKQoreworCXN0cnVjdCBjdF9lbnRyeV8yNHh4ICpjdF9wa3Q7CisKKwljdF9wa3QgPSAoc3RydWN0IGN0X2VudHJ5XzI0eHggKiloYS0+bXNfaW9jYjsKKwltZW1zZXQoY3RfcGt0LCAwLCBzaXplb2Yoc3RydWN0IGN0X2VudHJ5XzI0eHgpKTsKKworCWN0X3BrdC0+ZW50cnlfdHlwZSA9IENUX0lPQ0JfVFlQRTsKKwljdF9wa3QtPmVudHJ5X2NvdW50ID0gMTsKKwljdF9wa3QtPm5wb3J0X2hhbmRsZSA9IGNwdV90b19sZTE2KGhhLT5tZ210X3N2cl9sb29wX2lkKTsKKwljdF9wa3QtPnRpbWVvdXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDU5KTsKKwljdF9wa3QtPmNtZF9kc2RfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEpOworCWN0X3BrdC0+cnNwX2RzZF9jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMSk7CisJY3RfcGt0LT5yc3BfYnl0ZV9jb3VudCA9IGNwdV90b19sZTMyKHJzcF9zaXplKTsKKwljdF9wa3QtPmNtZF9ieXRlX2NvdW50ID0gY3B1X3RvX2xlMzIocmVxX3NpemUpOworCisJY3RfcGt0LT5kc2VnXzBfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChoYS0+Y3Rfc25zX2RtYSkpOworCWN0X3BrdC0+ZHNlZ18wX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QoaGEtPmN0X3Nuc19kbWEpKTsKKwljdF9wa3QtPmRzZWdfMF9sZW4gPSBjdF9wa3QtPmNtZF9ieXRlX2NvdW50OworCisJY3RfcGt0LT5kc2VnXzFfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChoYS0+Y3Rfc25zX2RtYSkpOworCWN0X3BrdC0+ZHNlZ18xX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QoaGEtPmN0X3Nuc19kbWEpKTsKKwljdF9wa3QtPmRzZWdfMV9sZW4gPSBjdF9wa3QtPnJzcF9ieXRlX2NvdW50OworCisJcmV0dXJuIGN0X3BrdDsKK30KKworc3RhdGljIGlubGluZSBtc19pb2NiX2VudHJ5X3QgKgorcWxhMngwMF91cGRhdGVfbXNfZmRtaV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IHJlcV9zaXplKQoreworCW1zX2lvY2JfZW50cnlfdCAqbXNfcGt0ID0gaGEtPm1zX2lvY2I7CisJc3RydWN0IGN0X2VudHJ5XzI0eHggKmN0X3BrdCA9IChzdHJ1Y3QgY3RfZW50cnlfMjR4eCAqKWhhLT5tc19pb2NiOworCisJaWYgKElTX1FMQTI0WFgoaGEpIHx8IElTX1FMQTI1WFgoaGEpKSB7CisJCWN0X3BrdC0+Y21kX2J5dGVfY291bnQgPSBjcHVfdG9fbGUzMihyZXFfc2l6ZSk7CisJCWN0X3BrdC0+ZHNlZ18wX2xlbiA9IGN0X3BrdC0+Y21kX2J5dGVfY291bnQ7CisJfSBlbHNlIHsKKwkJbXNfcGt0LT5yZXFfYnl0ZWNvdW50ID0gY3B1X3RvX2xlMzIocmVxX3NpemUpOworCQltc19wa3QtPmRzZWdfcmVxX2xlbmd0aCA9IG1zX3BrdC0+cmVxX2J5dGVjb3VudDsKKwl9CisKKwlyZXR1cm4gbXNfcGt0OworfQorCisvKioKKyAqIHFsYTJ4MDBfcHJlcF9jdF9yZXEoKSAtIFByZXBhcmUgY29tbW9uIENUIHJlcXVlc3QgZmllbGRzIGZvciBTTlMgcXVlcnkuCisgKiBAY3RfcmVxOiBDVCByZXF1ZXN0IGJ1ZmZlcgorICogQGNtZDogR1MgY29tbWFuZAorICogQHJzcF9zaXplOiByZXNwb25zZSBzaXplIGluIGJ5dGVzCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGl0aWFsaXplZCBAY3RfcmVxLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjdF9zbnNfcmVxICoKK3FsYTJ4MDBfcHJlcF9jdF9mZG1pX3JlcShzdHJ1Y3QgY3Rfc25zX3JlcSAqY3RfcmVxLCB1aW50MTZfdCBjbWQsCisgICAgdWludDE2X3QgcnNwX3NpemUpCit7CisJbWVtc2V0KGN0X3JlcSwgMCwgc2l6ZW9mKHN0cnVjdCBjdF9zbnNfcGt0KSk7CisKKwljdF9yZXEtPmhlYWRlci5yZXZpc2lvbiA9IDB4MDE7CisJY3RfcmVxLT5oZWFkZXIuZ3NfdHlwZSA9IDB4RkE7CisJY3RfcmVxLT5oZWFkZXIuZ3Nfc3VidHlwZSA9IDB4MTA7CisJY3RfcmVxLT5jb21tYW5kID0gY3B1X3RvX2JlMTYoY21kKTsKKwljdF9yZXEtPm1heF9yc3Bfc2l6ZSA9IGNwdV90b19iZTE2KChyc3Bfc2l6ZSAtIDE2KSAvIDQpOworCisJcmV0dXJuIGN0X3JlcTsKK30KKworLyoqCisgKiBxbGEyeDAwX2ZkbWlfcmhiYSgpIC0KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX2ZkbWlfcmhiYShzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludCBydmFsLCBhbGVuOworCXVpbnQzMl90IHNpemUsIHNuOworCisJbXNfaW9jYl9lbnRyeV90ICptc19wa3Q7CisJc3RydWN0IGN0X3Nuc19yZXEgKmN0X3JlcTsKKwlzdHJ1Y3QgY3Rfc25zX3JzcCAqY3RfcnNwOworCXVpbnQ4X3QgKmVudHJpZXM7CisJc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKmVpdGVyOworCisJLyogSXNzdWUgUkhCQSAqLworCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KKwkvKiAgIFJlcXVlc3Qgc2l6ZSBhZGp1c3RlZCBhZnRlciBDVCBwcmVwYXJhdGlvbiAqLworCW1zX3BrdCA9IGhhLT5pc3Bfb3BzLnByZXBfbXNfZmRtaV9pb2NiKGhhLCAwLCBSSEJBX1JTUF9TSVpFKTsKKworCS8qIFByZXBhcmUgQ1QgcmVxdWVzdCAqLworCWN0X3JlcSA9IHFsYTJ4MDBfcHJlcF9jdF9mZG1pX3JlcSgmaGEtPmN0X3Nucy0+cC5yZXEsIFJIQkFfQ01ELAorCSAgICBSSEJBX1JTUF9TSVpFKTsKKwljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CisKKwkvKiBQcmVwYXJlIEZETUkgY29tbWFuZCBhcmd1bWVudHMgLS0gYXR0cmlidXRlIGJsb2NrLCBhdHRyaWJ1dGVzLiAqLworCW1lbWNweShjdF9yZXEtPnJlcS5yaGJhLmhiYV9pZGVudGlmaWVyLCBoYS0+cG9ydF9uYW1lLCBXV05fU0laRSk7CisJY3RfcmVxLT5yZXEucmhiYS5lbnRyeV9jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMSk7CisJbWVtY3B5KGN0X3JlcS0+cmVxLnJoYmEucG9ydF9uYW1lLCBoYS0+cG9ydF9uYW1lLCBXV05fU0laRSk7CisJc2l6ZSA9IDIgKiBXV05fU0laRSArIDQgKyA0OworCisJLyogQXR0cmlidXRlcyAqLworCWN0X3JlcS0+cmVxLnJoYmEuYXR0cnMuY291bnQgPQorCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTMyKEZETUlfSEJBX0FUVFJfQ09VTlQpOworCWVudHJpZXMgPSBjdF9yZXEtPnJlcS5yaGJhLmhiYV9pZGVudGlmaWVyOworCisJLyogTm9kZW5hbWUuICovCisJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKKwllaXRlci0+dHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRkRNSV9IQkFfTk9ERV9OQU1FKTsKKwllaXRlci0+bGVuID0gX19jb25zdGFudF9jcHVfdG9fYmUxNig0ICsgV1dOX1NJWkUpOworCW1lbWNweShlaXRlci0+YS5ub2RlX25hbWUsIGhhLT5ub2RlX25hbWUsIFdXTl9TSVpFKTsKKwlzaXplICs9IDQgKyBXV05fU0laRTsKKworCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBOT0RFTkFNRT0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeC5cbiIsCisJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkgICAgZWl0ZXItPmEubm9kZV9uYW1lWzBdLCBlaXRlci0+YS5ub2RlX25hbWVbMV0sIGVpdGVyLT5hLm5vZGVfbmFtZVsyXSwKKwkgICAgZWl0ZXItPmEubm9kZV9uYW1lWzNdLCBlaXRlci0+YS5ub2RlX25hbWVbNF0sIGVpdGVyLT5hLm5vZGVfbmFtZVs1XSwKKwkgICAgZWl0ZXItPmEubm9kZV9uYW1lWzZdLCBlaXRlci0+YS5ub2RlX25hbWVbN10pKTsKKworCS8qIE1hbnVmYWN0dXJlci4gKi8KKwllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOworCWVpdGVyLT50eXBlID0gX19jb25zdGFudF9jcHVfdG9fYmUxNihGRE1JX0hCQV9NQU5VRkFDVFVSRVIpOworCXN0cmNweShlaXRlci0+YS5tYW51ZmFjdHVyZXIsICJRTG9naWMgQ29ycG9yYXRpb24iKTsKKwlhbGVuID0gc3RybGVuKGVpdGVyLT5hLm1hbnVmYWN0dXJlcik7CisJYWxlbiArPSAoYWxlbiAmIDMpID8gKDQgLSAoYWxlbiAmIDMpKSA6IDQ7CisJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKKwlzaXplICs9IDQgKyBhbGVuOworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE1BTlVGQUNUVVJFUj0lcy5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkgICAgZWl0ZXItPmEubWFudWZhY3R1cmVyKSk7CisKKwkvKiBTZXJpYWwgbnVtYmVyLiAqLworCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CisJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfSEJBX1NFUklBTF9OVU1CRVIpOworCXNuID0gKChoYS0+c2VyaWFsMCAmIDB4MWYpIDw8IDE2KSB8IChoYS0+c2VyaWFsMiA8PCA4KSB8IGhhLT5zZXJpYWwxOworCXNwcmludGYoZWl0ZXItPmEuc2VyaWFsX251bSwgIiVjJTA1ZCIsICdBJyArIHNuIC8gMTAwMDAwLCBzbiAlIDEwMDAwMCk7CisJYWxlbiA9IHN0cmxlbihlaXRlci0+YS5zZXJpYWxfbnVtKTsKKwlhbGVuICs9IChhbGVuICYgMykgPyAoNCAtIChhbGVuICYgMykpIDogNDsKKwllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOworCXNpemUgKz0gNCArIGFsZW47CisKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogU0VSSUFMTk89JXMuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJICAgIGVpdGVyLT5hLnNlcmlhbF9udW0pKTsKKworCS8qIE1vZGVsIG5hbWUuICovCisJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKKwllaXRlci0+dHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRkRNSV9IQkFfTU9ERUwpOworCXN0cmNweShlaXRlci0+YS5tb2RlbCwgaGEtPm1vZGVsX251bWJlcik7CisJYWxlbiA9IHN0cmxlbihlaXRlci0+YS5tb2RlbCk7CisJYWxlbiArPSAoYWxlbiAmIDMpID8gKDQgLSAoYWxlbiAmIDMpKSA6IDQ7CisJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKKwlzaXplICs9IDQgKyBhbGVuOworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE1PREVMX05BTUU9JXMuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJICAgIGVpdGVyLT5hLm1vZGVsKSk7CisKKwkvKiBNb2RlbCBkZXNjcmlwdGlvbi4gKi8KKwllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOworCWVpdGVyLT50eXBlID0gX19jb25zdGFudF9jcHVfdG9fYmUxNihGRE1JX0hCQV9NT0RFTF9ERVNDUklQVElPTik7CisJaWYgKGhhLT5tb2RlbF9kZXNjKQorCQlzdHJuY3B5KGVpdGVyLT5hLm1vZGVsX2Rlc2MsIGhhLT5tb2RlbF9kZXNjLCA4MCk7CisJYWxlbiA9IHN0cmxlbihlaXRlci0+YS5tb2RlbF9kZXNjKTsKKwlhbGVuICs9IChhbGVuICYgMykgPyAoNCAtIChhbGVuICYgMykpIDogNDsKKwllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOworCXNpemUgKz0gNCArIGFsZW47CisKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogTU9ERUxfREVTQz0lcy5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkgICAgZWl0ZXItPmEubW9kZWxfZGVzYykpOworCisJLyogSGFyZHdhcmUgdmVyc2lvbi4gKi8KKwllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOworCWVpdGVyLT50eXBlID0gX19jb25zdGFudF9jcHVfdG9fYmUxNihGRE1JX0hCQV9IQVJEV0FSRV9WRVJTSU9OKTsKKwlzdHJjcHkoZWl0ZXItPmEuaHdfdmVyc2lvbiwgaGEtPmFkYXB0ZXJfaWQpOworCWFsZW4gPSBzdHJsZW4oZWl0ZXItPmEuaHdfdmVyc2lvbik7CisJYWxlbiArPSAoYWxlbiAmIDMpID8gKDQgLSAoYWxlbiAmIDMpKSA6IDQ7CisJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKKwlzaXplICs9IDQgKyBhbGVuOworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IEhBUkRXQVJFVkVSPSVzLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCSAgICBlaXRlci0+YS5od192ZXJzaW9uKSk7CisKKwkvKiBEcml2ZXIgdmVyc2lvbi4gKi8KKwllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOworCWVpdGVyLT50eXBlID0gX19jb25zdGFudF9jcHVfdG9fYmUxNihGRE1JX0hCQV9EUklWRVJfVkVSU0lPTik7CisJc3RyY3B5KGVpdGVyLT5hLmRyaXZlcl92ZXJzaW9uLCBxbGEyeDAwX3ZlcnNpb25fc3RyKTsKKwlhbGVuID0gc3RybGVuKGVpdGVyLT5hLmRyaXZlcl92ZXJzaW9uKTsKKwlhbGVuICs9IChhbGVuICYgMykgPyAoNCAtIChhbGVuICYgMykpIDogNDsKKwllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOworCXNpemUgKz0gNCArIGFsZW47CisKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogRFJJVkVSVkVSPSVzLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCSAgICBlaXRlci0+YS5kcml2ZXJfdmVyc2lvbikpOworCisJLyogT3B0aW9uIFJPTSB2ZXJzaW9uLiAqLworCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CisJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfSEJBX09QVElPTl9ST01fVkVSU0lPTik7CisJc3RyY3B5KGVpdGVyLT5hLm9yb21fdmVyc2lvbiwgIjAuMDAiKTsKKwlhbGVuID0gc3RybGVuKGVpdGVyLT5hLm9yb21fdmVyc2lvbik7CisJYWxlbiArPSAoYWxlbiAmIDMpID8gKDQgLSAoYWxlbiAmIDMpKSA6IDQ7CisJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKKwlzaXplICs9IDQgKyBhbGVuOworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE9QVFJPTVZFUj0lcy5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkgICAgZWl0ZXItPmEub3JvbV92ZXJzaW9uKSk7CisKKwkvKiBGaXJtd2FyZSB2ZXJzaW9uICovCisJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKKwllaXRlci0+dHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRkRNSV9IQkFfRklSTVdBUkVfVkVSU0lPTik7CisJaGEtPmlzcF9vcHMuZndfdmVyc2lvbl9zdHIoaGEsIGVpdGVyLT5hLmZ3X3ZlcnNpb24pOworCWFsZW4gPSBzdHJsZW4oZWl0ZXItPmEuZndfdmVyc2lvbik7CisJYWxlbiArPSAoYWxlbiAmIDMpID8gKDQgLSAoYWxlbiAmIDMpKSA6IDQ7CisJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKKwlzaXplICs9IDQgKyBhbGVuOworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IEZJUk1XQVJFVkVSPSVzLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCSAgICBlaXRlci0+YS5md192ZXJzaW9uKSk7CisKKwkvKiBVcGRhdGUgTVMgcmVxdWVzdCBzaXplLiAqLworCXFsYTJ4MDBfdXBkYXRlX21zX2ZkbWlfaW9jYihoYSwgc2l6ZSArIDE2KTsKKworCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBSSEJBIGlkZW50aWZpZXI9IgorCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggc2l6ZT0lZC5cbiIsIF9fZnVuY19fLAorCSAgICBoYS0+aG9zdF9ubywgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllclswXSwKKwkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllclsxXSwKKwkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllclsyXSwKKwkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllclszXSwKKwkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllcls0XSwKKwkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllcls1XSwKKwkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllcls2XSwKKwkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllcls3XSwgc2l6ZSkpOworCURFQlVHMTMocWxhMngwMF9kdW1wX2J1ZmZlcihlbnRyaWVzLCBzaXplKSk7CisKKwkvKiBFeGVjdXRlIE1TIElPQ0IgKi8KKwlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAorCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSSEJBIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyhoYSwgbXNfcGt0LCBjdF9yc3AsICJSSEJBIikgIT0KKwkgICAgUUxBX1NVQ0NFU1MpIHsKKwkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCWlmIChjdF9yc3AtPmhlYWRlci5yZWFzb25fY29kZSA9PSBDVF9SRUFTT05fQ0FOTk9UX1BFUkZPUk0gJiYKKwkJICAgIGN0X3JzcC0+aGVhZGVyLmV4cGxhbmF0aW9uX2NvZGUgPT0KKwkJICAgIENUX0VYUExfQUxSRUFEWV9SRUdJU1RFUkVEKSB7CisJCQlERUJVRzJfMTMocHJpbnRrKCIlcyglbGQpOiBIQkEgYWxyZWFkeSByZWdpc3RlcmVkLlxuIiwKKwkJCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJCXJ2YWwgPSBRTEFfQUxSRUFEWV9SRUdJU1RFUkVEOworCQl9CisJfSBlbHNlIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSSEJBIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoqCisgKiBxbGEyeDAwX2ZkbWlfZGhiYSgpIC0KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX2ZkbWlfZGhiYShzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludCBydmFsOworCisJbXNfaW9jYl9lbnRyeV90ICptc19wa3Q7CisJc3RydWN0IGN0X3Nuc19yZXEgKmN0X3JlcTsKKwlzdHJ1Y3QgY3Rfc25zX3JzcCAqY3RfcnNwOworCisJLyogSXNzdWUgUlBBICovCisJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLworCW1zX3BrdCA9IGhhLT5pc3Bfb3BzLnByZXBfbXNfZmRtaV9pb2NiKGhhLCBESEJBX1JFUV9TSVpFLAorCSAgICBESEJBX1JTUF9TSVpFKTsKKworCS8qIFByZXBhcmUgQ1QgcmVxdWVzdCAqLworCWN0X3JlcSA9IHFsYTJ4MDBfcHJlcF9jdF9mZG1pX3JlcSgmaGEtPmN0X3Nucy0+cC5yZXEsIERIQkFfQ01ELAorCSAgICBESEJBX1JTUF9TSVpFKTsKKwljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CisKKwkvKiBQcmVwYXJlIEZETUkgY29tbWFuZCBhcmd1bWVudHMgLS0gcG9ydG5hbWUuICovCisJbWVtY3B5KGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lLCBoYS0+cG9ydF9uYW1lLCBXV05fU0laRSk7CisKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogREhCQSBwb3J0bmFtZT0iCisJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkgICAgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbMF0sIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzFdLAorCSAgICBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVsyXSwgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbM10sCisJICAgIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzRdLCBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVs1XSwKKwkgICAgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbNl0sIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzddKSk7CisKKwkvKiBFeGVjdXRlIE1TIElPQ0IgKi8KKwlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAorCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBESEJBIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyhoYSwgbXNfcGt0LCBjdF9yc3AsICJESEJBIikgIT0KKwkgICAgUUxBX1NVQ0NFU1MpIHsKKwkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfSBlbHNlIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBESEJBIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoqCisgKiBxbGEyeDAwX2ZkbWlfcnBhKCkgLQorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfZmRtaV9ycGEoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgcnZhbCwgYWxlbjsKKwl1aW50MzJfdCBzaXplLCBtYXhfZnJhbWVfc2l6ZTsKKworCW1zX2lvY2JfZW50cnlfdCAqbXNfcGt0OworCXN0cnVjdCBjdF9zbnNfcmVxICpjdF9yZXE7CisJc3RydWN0IGN0X3Nuc19yc3AgKmN0X3JzcDsKKwl1aW50OF90ICplbnRyaWVzOworCXN0cnVjdCBjdF9mZG1pX3BvcnRfYXR0ciAqZWl0ZXI7CisJc3RydWN0IGluaXRfY2JfMjR4eCAqaWNiMjQgPSAoc3RydWN0IGluaXRfY2JfMjR4eCAqKWhhLT5pbml0X2NiOworCisJLyogSXNzdWUgUlBBICovCisJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLworCS8qICAgUmVxdWVzdCBzaXplIGFkanVzdGVkIGFmdGVyIENUIHByZXBhcmF0aW9uICovCisJbXNfcGt0ID0gaGEtPmlzcF9vcHMucHJlcF9tc19mZG1pX2lvY2IoaGEsIDAsIFJQQV9SU1BfU0laRSk7CisKKwkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KKwljdF9yZXEgPSBxbGEyeDAwX3ByZXBfY3RfZmRtaV9yZXEoJmhhLT5jdF9zbnMtPnAucmVxLCBSUEFfQ01ELAorCSAgICBSUEFfUlNQX1NJWkUpOworCWN0X3JzcCA9ICZoYS0+Y3Rfc25zLT5wLnJzcDsKKworCS8qIFByZXBhcmUgRkRNSSBjb21tYW5kIGFyZ3VtZW50cyAtLSBhdHRyaWJ1dGUgYmxvY2ssIGF0dHJpYnV0ZXMuICovCisJbWVtY3B5KGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWUsIGhhLT5wb3J0X25hbWUsIFdXTl9TSVpFKTsKKwlzaXplID0gV1dOX1NJWkUgKyA0OworCisJLyogQXR0cmlidXRlcyAqLworCWN0X3JlcS0+cmVxLnJwYS5hdHRycy5jb3VudCA9CisJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoRkRNSV9QT1JUX0FUVFJfQ09VTlQpOworCWVudHJpZXMgPSBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lOworCisJLyogRkM0IHR5cGVzLiAqLworCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX3BvcnRfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOworCWVpdGVyLT50eXBlID0gX19jb25zdGFudF9jcHVfdG9fYmUxNihGRE1JX1BPUlRfRkM0X1RZUEVTKTsKKwllaXRlci0+bGVuID0gX19jb25zdGFudF9jcHVfdG9fYmUxNig0ICsgMzIpOworCWVpdGVyLT5hLmZjNF90eXBlc1syXSA9IDB4MDE7CisJc2l6ZSArPSA0ICsgMzI7CisKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogRkM0X1RZUEVTPSUwMnggJTAyeC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkgICAgZWl0ZXItPmEuZmM0X3R5cGVzWzJdLCBlaXRlci0+YS5mYzRfdHlwZXNbMV0pKTsKKworCS8qIFN1cHBvcnRlZCBzcGVlZC4gKi8KKwllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9wb3J0X2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKKwllaXRlci0+dHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRkRNSV9QT1JUX1NVUFBPUlRfU1BFRUQpOworCWVpdGVyLT5sZW4gPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KDQgKyA0KTsKKwlpZiAoSVNfUUxBMjVYWChoYSkpCisJCWVpdGVyLT5hLnN1cF9zcGVlZCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoNCk7CisJZWxzZSBpZiAoSVNfUUxBMjRYWChoYSkpCisJCWVpdGVyLT5hLnN1cF9zcGVlZCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoOCk7CisJZWxzZSBpZiAoSVNfUUxBMjNYWChoYSkpCisJCWVpdGVyLT5hLnN1cF9zcGVlZCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMik7CisJZWxzZQorCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDEpOworCXNpemUgKz0gNCArIDQ7CisKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogU1VQUE9SVEVEX1NQRUVEPSV4LlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCSAgICBlaXRlci0+YS5zdXBfc3BlZWQpKTsKKworCS8qIEN1cnJlbnQgc3BlZWQuICovCisJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CisJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfUE9SVF9DVVJSRU5UX1NQRUVEKTsKKwllaXRlci0+bGVuID0gX19jb25zdGFudF9jcHVfdG9fYmUxNig0ICsgNCk7CisJc3dpdGNoIChoYS0+bGlua19kYXRhX3JhdGUpIHsKKwljYXNlIDA6CisJCWVpdGVyLT5hLmN1cl9zcGVlZCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZWl0ZXItPmEuY3VyX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQllaXRlci0+YS5jdXJfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDgpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWVpdGVyLT5hLmN1cl9zcGVlZCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoNCk7CisJCWJyZWFrOworCX0KKwlzaXplICs9IDQgKyA0OworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IENVUlJFTlRfU1BFRUQ9JXguXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJICAgIGVpdGVyLT5hLmN1cl9zcGVlZCkpOworCisJLyogTWF4IGZyYW1lIHNpemUuICovCisJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CisJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfUE9SVF9NQVhfRlJBTUVfU0laRSk7CisJZWl0ZXItPmxlbiA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoNCArIDQpOworCW1heF9mcmFtZV9zaXplID0gSVNfUUxBMjRYWChoYSkgfHwgSVNfUUxBMjVYWChoYSkgPworCQkodWludDMyX3QpIGljYjI0LT5mcmFtZV9wYXlsb2FkX3NpemU6CisJCSh1aW50MzJfdCkgaGEtPmluaXRfY2ItPmZyYW1lX3BheWxvYWRfc2l6ZTsKKwllaXRlci0+YS5tYXhfZnJhbWVfc2l6ZSA9IGNwdV90b19iZTMyKG1heF9mcmFtZV9zaXplKTsKKwlzaXplICs9IDQgKyA0OworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE1BWF9GUkFNRV9TSVpFPSV4LlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCSAgICBlaXRlci0+YS5tYXhfZnJhbWVfc2l6ZSkpOworCisJLyogT1MgZGV2aWNlIG5hbWUuICovCisJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CisJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfUE9SVF9PU19ERVZJQ0VfTkFNRSk7CisJc3ByaW50ZihlaXRlci0+YS5vc19kZXZfbmFtZSwgIi9wcm9jL3Njc2kvcWxhMnh4eC8lbGQiLCBoYS0+aG9zdF9ubyk7CisJYWxlbiA9IHN0cmxlbihlaXRlci0+YS5vc19kZXZfbmFtZSk7CisJYWxlbiArPSAoYWxlbiAmIDMpID8gKDQgLSAoYWxlbiAmIDMpKSA6IDQ7CisJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKKwlzaXplICs9IDQgKyBhbGVuOworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE9TX0RFVklDRV9OQU1FPSVzLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCSAgICBlaXRlci0+YS5vc19kZXZfbmFtZSkpOworCisJLyogVXBkYXRlIE1TIHJlcXVlc3Qgc2l6ZS4gKi8KKwlxbGEyeDAwX3VwZGF0ZV9tc19mZG1pX2lvY2IoaGEsIHNpemUgKyAxNik7CisKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogUlBBIHBvcnRuYW1lPSIKKwkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IHNpemU9JWQuXG4iLCBfX2Z1bmNfXywKKwkgICAgaGEtPmhvc3Rfbm8sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbMF0sCisJICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbMV0sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbMl0sCisJICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbM10sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbNF0sCisJICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbNV0sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbNl0sCisJICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbN10sIHNpemUpKTsKKwlERUJVRzEzKHFsYTJ4MDBfZHVtcF9idWZmZXIoZW50cmllcywgc2l6ZSkpOworCisJLyogRXhlY3V0ZSBNUyBJT0NCICovCisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKKwkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUlBBIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyhoYSwgbXNfcGt0LCBjdF9yc3AsICJSUEEiKSAhPQorCSAgICBRTEFfU1VDQ0VTUykgeworCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9IGVsc2UgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJQQSBleGl0aW5nIG5vcm1hbGx5LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qKgorICogcWxhMngwMF9mZG1pX3JlZ2lzdGVyKCkgLQorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludAorcWxhMngwMF9mZG1pX3JlZ2lzdGVyKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IHJ2YWw7CisKKwlydmFsID0gcWxhMngwMF9tZ210X3N2cl9sb2dpbihoYSk7CisJaWYgKHJ2YWwpCisJCXJldHVybiBydmFsOworCisJcnZhbCA9IHFsYTJ4MDBfZmRtaV9yaGJhKGhhKTsKKwlpZiAocnZhbCkgeworCQlpZiAocnZhbCAhPSBRTEFfQUxSRUFEWV9SRUdJU1RFUkVEKQorCQkJcmV0dXJuIHJ2YWw7CisKKwkJcnZhbCA9IHFsYTJ4MDBfZmRtaV9kaGJhKGhhKTsKKwkJaWYgKHJ2YWwpCisJCQlyZXR1cm4gcnZhbDsKKworCQlydmFsID0gcWxhMngwMF9mZG1pX3JoYmEoaGEpOworCQlpZiAocnZhbCkKKwkJCXJldHVybiBydmFsOworCX0KKwlydmFsID0gcWxhMngwMF9mZG1pX3JwYShoYSk7CisKKwlyZXR1cm4gcnZhbDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCmluZGV4IGE2ZDI1NTkuLmM2MTk1ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwpAQCAtODgsNiArODgsNyBAQAogCWhhLT5tYnhfZmxhZ3MgPSAwOwogCWhhLT5pc3BfYWJvcnRfY250ID0gMDsKIAloYS0+YmVhY29uX2JsaW5rX2xlZCA9IDA7CisJc2V0X2JpdChSRUdJU1RFUl9GRE1JX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOwogCiAJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQ29uZmlndXJpbmcgUENJIHNwYWNlLi4uXG4iKTsKIAlydmFsID0gaGEtPmlzcF9vcHMucGNpX2NvbmZpZyhoYSk7CkBAIC0xNTYzLDcgKzE1NjQsNyBAQAogCWhhLT5mbGFncy5lbmFibGVfbGlwX3Jlc2V0ID0gKChudi0+aG9zdF9wWzFdICYgQklUXzEpID8gMSA6IDApOwogCWhhLT5mbGFncy5lbmFibGVfbGlwX2Z1bGxfbG9naW4gPSAoKG52LT5ob3N0X3BbMV0gJiBCSVRfMikgPyAxIDogMCk7CiAJaGEtPmZsYWdzLmVuYWJsZV90YXJnZXRfcmVzZXQgPSAoKG52LT5ob3N0X3BbMV0gJiBCSVRfMykgPyAxIDogMCk7Ci0JaGEtPmZsYWdzLmVuYWJsZV9sZWRfc2NoZW1lID0gKChudi0+ZWZpX3BhcmFtZXRlcnMgJiBCSVRfMykgPyAxIDogMCk7CisJaGEtPmZsYWdzLmVuYWJsZV9sZWRfc2NoZW1lID0gKG52LT5zcGVjaWFsX29wdGlvbnNbMV0gJiBCSVRfNCkgPyAxIDogMDsKIAogCWhhLT5vcGVyYXRpbmdfbW9kZSA9CiAJICAgIChpY2ItPmFkZF9maXJtd2FyZV9vcHRpb25zWzBdICYgKEJJVF82IHwgQklUXzUgfCBCSVRfNCkpID4+IDQ7CkBAIC0xNjk3LDYgKzE2OTgsNyBAQAogCWZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0gSU9ERVNDX0lOVkFMSURfSU5ERVg7CiAJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX1VOQ09ORklHVVJFRCk7CiAJZmNwb3J0LT5mbGFncyA9IEZDRl9STENfU1VQUE9SVDsKKwlmY3BvcnQtPnN1cHBvcnRlZF9jbGFzc2VzID0gRkNfQ09TX1VOU1BFQ0lGSUVEOwogCiAJcmV0dXJuIChmY3BvcnQpOwogfQpAQCAtMTg5OCw3ICsxOTAwLDggQEAKIAkJCWNvbnRpbnVlOwogCiAJCS8qIEJ5cGFzcyBpZiBub3Qgc2FtZSBkb21haW4gYW5kIGFyZWEgb2YgYWRhcHRlci4gKi8KLQkJaWYgKGFyZWEgIT0gaGEtPmRfaWQuYi5hcmVhIHx8IGRvbWFpbiAhPSBoYS0+ZF9pZC5iLmRvbWFpbikKKwkJaWYgKGFyZWEgJiYgZG9tYWluICYmCisJCSAgICAoYXJlYSAhPSBoYS0+ZF9pZC5iLmFyZWEgfHwgZG9tYWluICE9IGhhLT5kX2lkLmIuZG9tYWluKSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qIEJ5cGFzcyBpbnZhbGlkIGxvY2FsIGxvb3AgSUQuICovCkBAIC0yMDc1LDYgKzIwNzgsNyBAQAogCQlyZXR1cm47CiAJfQogCXJwb3J0LT5kZF9kYXRhID0gZmNwb3J0OworCXJwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyA9IGZjcG9ydC0+c3VwcG9ydGVkX2NsYXNzZXM7CiAKIAlycG9ydF9pZHMucm9sZXMgPSBGQ19SUE9SVF9ST0xFX1VOS05PV047CiAJaWYgKGZjcG9ydC0+cG9ydF90eXBlID09IEZDVF9JTklUSUFUT1IpCkBAIC0yMTMwLDYgKzIxMzQsMTEgQEAKIAkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CiAJfQogCWRvIHsKKwkJLyogRkRNSSBzdXBwb3J0LiAqLworCQlpZiAocWwyeGZkbWllbmFibGUgJiYKKwkJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChSRUdJU1RFUl9GRE1JX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKQorCQkJcWxhMngwMF9mZG1pX3JlZ2lzdGVyKGhhKTsKKwogCQkvKiBFbnN1cmUgd2UgYXJlIGxvZ2dlZCBpbnRvIHRoZSBTTlMuICovCiAJCWlmIChJU19RTEEyNFhYKGhhKSB8fCBJU19RTEEyNVhYKGhhKSkKIAkJCWxvb3BfaWQgPSBOUEhfU05TOwpAQCAtMjM5Miw2ICsyNDAxLDEyIEBACiAJCWlmIChuZXdfZmNwb3J0LT5kX2lkLmIyNCA9PSBoYS0+ZF9pZC5iMjQpCiAJCQljb250aW51ZTsKIAorCQkvKiBCeXBhc3MgaWYgc2FtZSBkb21haW4gYW5kIGFyZWEgb2YgYWRhcHRlci4gKi8KKwkJaWYgKCgobmV3X2ZjcG9ydC0+ZF9pZC5iMjQgJiAweGZmZmYwMCkgPT0KKwkJICAgIChoYS0+ZF9pZC5iMjQgJiAweGZmZmYwMCkpICYmIGhhLT5jdXJyZW50X3RvcG9sb2d5ID09CisJCQlJU1BfQ0ZHX0ZMKQorCQkJICAgIGNvbnRpbnVlOworCiAJCS8qIEJ5cGFzcyByZXNlcnZlZCBkb21haW4gZmllbGRzLiAqLwogCQlpZiAoKG5ld19mY3BvcnQtPmRfaWQuYi5kb21haW4gJiAweGYwKSA9PSAweGYwKQogCQkJY29udGludWU7CkBAIC0yNzk0LDYgKzI4MDksMTEgQEAKIAkJCQl9CiAJCQl9CiAKKwkJCWlmIChtYlsxMF0gJiBCSVRfMCkKKwkJCQlmY3BvcnQtPnN1cHBvcnRlZF9jbGFzc2VzIHw9IEZDX0NPU19DTEFTUzI7CisJCQlpZiAobWJbMTBdICYgQklUXzEpCisJCQkJZmNwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyB8PSBGQ19DT1NfQ0xBU1MzOworCiAJCQlydmFsID0gUUxBX1NVQ0NFU1M7CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmIChtYlswXSA9PSBNQlNfTE9PUF9JRF9VU0VEKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYwppbmRleCBlYmRjM2M1Li4zN2Y4MmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKQEAgLTgxMCwxMiArODEwLDggQEAKIAkJCWhhLT5yZXFfcV9jbnQgPSBoYS0+cmVxdWVzdF9xX2xlbmd0aCAtCiAJCQkJKGhhLT5yZXFfcmluZ19pbmRleCAtIGNudCk7CiAJfQotCWlmIChoYS0+cmVxX3FfY250IDwgKHJlcV9jbnQgKyAyKSkgewotCQlpZiAgKGNtZC0+dXNlX3NnKQotCQkJcGNpX3VubWFwX3NnKGhhLT5wZGV2LCBzZywgY21kLT51c2Vfc2csCi0JCQkJCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCWlmIChoYS0+cmVxX3FfY250IDwgKHJlcV9jbnQgKyAyKSkKIAkJZ290byBxdWV1aW5nX2Vycm9yOwotCX0KIAogCS8qIEJ1aWxkIGNvbW1hbmQgcGFja2V0LiAqLwogCWhhLT5jdXJyZW50X291dHN0YW5kaW5nX2NtZCA9IGhhbmRsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwppbmRleCBmOTEwZGU2Li5jMjU1YmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCkBAIC00NTEsNiArNDUxLDggQEAKIAogCQloYS0+ZmxhZ3MubWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luID0gMDsKIAkJaGEtPmxpbmtfZGF0YV9yYXRlID0gMDsKKwkJaWYgKHFsMnhmZG1pZW5hYmxlKQorCQkJc2V0X2JpdChSRUdJU1RFUl9GRE1JX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOwogCiAJCS8qIFVwZGF0ZSBBRU4gcXVldWUuICovCiAJCXFsYTJ4MDBfZW5xdWV1ZV9hZW4oaGEsIE1CQV9MT09QX0RPV04sIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCmluZGV4IDQwOWVhMGEuLjEzZTFjOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJxbGFfZGVmLmgiCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KIAogc3RhdGljIHZvaWQKIHFsYTJ4MDBfbWJ4X3NlbV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKQEAgLTI1MSw3ICsyNTIsNyBAQAogCQkJbWIwID0gUkRfUkVHX1dPUkQoJnJlZy0+aXNwMjQubWFpbGJveDApOwogCQkJaWN0cmwgPSBSRF9SRUdfRFdPUkQoJnJlZy0+aXNwMjQuaWN0cmwpOwogCQl9IGVsc2UgewotCQkJbWIwID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZy0+aXNwLCAwKTsKKwkJCW1iMCA9IFJEX01BSUxCT1hfUkVHKGhhLCAmcmVnLT5pc3AsIDApOwogCQkJaWN0cmwgPSBSRF9SRUdfV09SRCgmcmVnLT5pc3AuaWN0cmwpOwogCQl9CiAJCXByaW50aygiJXMoJWxkKTogKioqKiBNQiBDb21tYW5kIFRpbWVvdXQgZm9yIGNtZCAleCAqKioqXG4iLApAQCAtOTgzLDU4ICs5ODQsNiBAQAogI2VuZGlmCiAKIC8qCi0gKiBxbGEyeDAwX3RhcmdldF9yZXNldAotICoJSXNzdWUgdGFyZ2V0IHJlc2V0IG1haWxib3ggY29tbWFuZC4KLSAqCi0gKiBJbnB1dDoKLSAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgotICoJVEFSR0VUX1FVRVVFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KLSAqCUFEQVBURVJfU1RBVEVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgotICoKLSAqIFJldHVybnM6Ci0gKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KLSAqCi0gKiBDb250ZXh0OgotICoJS2VybmVsIGNvbnRleHQuCi0gKi8KLWludAotcWxhMngwMF90YXJnZXRfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICpoYSwgc3RydWN0IGZjX3BvcnQgKmZjcG9ydCkKLXsKLQlpbnQgcnZhbDsKLQltYnhfY21kX3QgbWM7Ci0JbWJ4X2NtZF90ICptY3AgPSAmbWM7Ci0KLQlERUJVRzExKHByaW50aygicWxhMngwMF90YXJnZXRfcmVzZXQoJWxkKTogZW50ZXJlZC5cbiIsIGhhLT5ob3N0X25vKTspCi0KLQlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpICE9IEZDU19PTkxJTkUpCi0JCXJldHVybiAwOwotCi0JbWNwLT5tYlswXSA9IE1CQ19UQVJHRVRfUkVTRVQ7Ci0JaWYgKEhBU19FWFRFTkRFRF9JRFMoaGEpKQotCQltY3AtPm1iWzFdID0gZmNwb3J0LT5sb29wX2lkOwotCWVsc2UKLQkJbWNwLT5tYlsxXSA9IGZjcG9ydC0+bG9vcF9pZCA8PCA4OwotCW1jcC0+bWJbMl0gPSBoYS0+bG9vcF9yZXNldF9kZWxheTsKLQltY3AtPm91dF9tYiA9IE1CWF8yfE1CWF8xfE1CWF8wOwotCW1jcC0+aW5fbWIgPSBNQlhfMDsKLQltY3AtPnRvdiA9IDMwOwotCW1jcC0+ZmxhZ3MgPSAwOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKLQotCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCS8qRU1QVFkqLwotCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfdGFyZ2V0X3Jlc2V0KCVsZCk6IGZhaWxlZD0leC5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCk7KQotCX0gZWxzZSB7Ci0JCS8qRU1QVFkqLwotCQlERUJVRzExKHByaW50aygicWxhMngwMF90YXJnZXRfcmVzZXQoJWxkKTogZG9uZS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubyk7KQotCX0KLQotCXJldHVybiBydmFsOwotfQotCi0vKgogICogcWxhMngwMF9nZXRfYWRhcHRlcl9pZAogICoJR2V0IGFkYXB0ZXIgSUQgYW5kIHRvcG9sb2d5LgogICoKQEAgLTEzMjYsNiArMTI3NSwxMCBAQAogCQkJZmNwb3J0LT5wb3J0X3R5cGUgPSBGQ1RfSU5JVElBVE9SOwogCQllbHNlCiAJCQlmY3BvcnQtPnBvcnRfdHlwZSA9IEZDVF9UQVJHRVQ7CisKKwkJLyogUGFzc2JhY2sgQ09TIGluZm9ybWF0aW9uLiAqLworCQlmY3BvcnQtPnN1cHBvcnRlZF9jbGFzc2VzID0gKHBkLT5vcHRpb25zICYgQklUXzQpID8KKwkJICAgIEZDX0NPU19DTEFTUzI6IEZDX0NPU19DTEFTUzM7CiAJfQogCiBncGRfZXJyb3Jfb3V0OgpAQCAtMTY2MSw2ICsxNjE0LDEzIEBACiAJCQkJbWJbMV0gfD0gQklUXzE7CiAJCX0gZWxzZQogCQkJbWJbMV0gPSBCSVRfMDsKKworCQkvKiBQYXNzYmFjayBDT1MgaW5mb3JtYXRpb24uICovCisJCW1iWzEwXSA9IDA7CisJCWlmIChsZy0+aW9fcGFyYW1ldGVyWzddIHx8IGxnLT5pb19wYXJhbWV0ZXJbOF0pCisJCQltYlsxMF0gfD0gQklUXzA7CS8qIENsYXNzIDIuICovCisJCWlmIChsZy0+aW9fcGFyYW1ldGVyWzldIHx8IGxnLT5pb19wYXJhbWV0ZXJbMTBdKQorCQkJbWJbMTBdIHw9IEJJVF8xOwkvKiBDbGFzcyAzLiAqLwogCX0KIAogCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIGxnLCBsZ19kbWEpOwpAQCAtMTcyMyw2ICsxNjgzLDggQEAKIAkJbWJbMl0gPSBtY3AtPm1iWzJdOwogCQltYls2XSA9IG1jcC0+bWJbNl07CiAJCW1iWzddID0gbWNwLT5tYls3XTsKKwkJLyogQ09TIHJldHJpZXZlZCBmcm9tIEdldC1Qb3J0LURhdGFiYXNlIG1haWxib3ggY29tbWFuZC4gKi8KKwkJbWJbMTBdID0gMDsKIAl9CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewpAQCAtMjQ2NSwzICsyNDI3LDMyIEBACiAKIAlyZXR1cm4gcnZhbDsKIH0KKworaW50CitxbGEyeDAwX3N0b3BfZmlybXdhcmUoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgcnZhbDsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisKKwlpZiAoIUlTX1FMQTI0WFgoaGEpICYmICFJU19RTEEyNVhYKGhhKSkKKwkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CisKKwlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCisJbWNwLT5tYlswXSA9IE1CQ19TVE9QX0ZJUk1XQVJFOworCW1jcC0+b3V0X21iID0gTUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF8wOworCW1jcC0+dG92ID0gNTsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgeworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCX0KKworCXJldHVybiBydmFsOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCA5MDAwNjU5Li44OTgyOTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtNzksNyArNzksNyBAQAogTU9EVUxFX1BBUk1fREVTQyhxbDJ4bG9naW5yZXRyeWNvdW50LAogCQkiU3BlY2lmeSBhbiBhbHRlcm5hdGUgdmFsdWUgZm9yIHRoZSBOVlJBTSBsb2dpbiByZXRyeSBjb3VudC4iKTsKIAotaW50IHFsMnhmd2xvYWRiaW47CitpbnQgcWwyeGZ3bG9hZGJpbj0xOwogbW9kdWxlX3BhcmFtKHFsMnhmd2xvYWRiaW4sIGludCwgU19JUlVHT3xTX0lSVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MocWwyeGZ3bG9hZGJpbiwKIAkJIkxvYWQgSVNQMnh4eCBmaXJtd2FyZSBpbWFnZSB2aWEgaG90cGx1Zy4iKTsKQEAgLTg4LDYgKzg4LDEyIEBACiAKIHN0YXRpYyB2b2lkIHFsYTJ4MDBfY29uZmlnX2RtYV9hZGRyZXNzaW5nKHNjc2lfcWxhX2hvc3RfdCAqaGEpOwogCitpbnQgcWwyeGZkbWllbmFibGU7Cittb2R1bGVfcGFyYW0ocWwyeGZkbWllbmFibGUsIGludCwgU19JUlVHT3xTX0lSVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocWwyeGZkbWllbmFibGUsCisJCSJFbmFibGVzIEZETUkgcmVnaXN0cmF0b25zICIKKwkJIkRlZmF1bHQgaXMgMCAtIG5vIEZETUkuIDEgLSBwZXJmb20gRkRNSS4iKTsKKwogLyoKICAqIFNDU0kgaG9zdCB0ZW1wbGF0ZSBlbnRyeSBwb2ludHMKICAqLwpAQCAtMTA1LDYgKzExMSw5IEBACiBzdGF0aWMgaW50IHFsYTJ4MDBfbG9vcF9yZXNldChzY3NpX3FsYV9ob3N0X3QgKmhhKTsKIHN0YXRpYyBpbnQgcWxhMngwMF9kZXZpY2VfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqKTsKIAorc3RhdGljIGludCBxbGEyeDAwX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgaW50KTsKK3N0YXRpYyBpbnQgcWxhMngwMF9jaGFuZ2VfcXVldWVfdHlwZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgaW50KTsKKwogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgcWxhMngwMF9kcml2ZXJfdGVtcGxhdGUgPSB7CiAJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCQk9ICJxbGEyeHh4IiwKQEAgLTExOSw2ICsxMjgsOCBAQAogCiAJLnNsYXZlX2FsbG9jCQk9IHFsYTJ4eHhfc2xhdmVfYWxsb2MsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gcWxhMnh4eF9zbGF2ZV9kZXN0cm95LAorCS5jaGFuZ2VfcXVldWVfZGVwdGgJPSBxbGEyeDAwX2NoYW5nZV9xdWV1ZV9kZXB0aCwKKwkuY2hhbmdlX3F1ZXVlX3R5cGUJPSBxbGEyeDAwX2NoYW5nZV9xdWV1ZV90eXBlLAogCS50aGlzX2lkCQk9IC0xLAogCS5jbWRfcGVyX2x1bgkJPSAzLAogCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKQEAgLTEyOSw2ICsxNDAsNyBAQAogCSAqIHdoaWNoIGVxdWF0ZXMgdG8gMHg4MDAwMDAgc2VjdG9ycy4KIAkgKi8KIAkubWF4X3NlY3RvcnMJCT0gMHhGRkZGLAorCS5zaG9zdF9hdHRycwkJPSBxbGEyeDAwX2hvc3RfYXR0cnMsCiB9OwogCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBxbGEyNHh4X2RyaXZlcl90ZW1wbGF0ZSA9IHsKQEAgLTE0NSwxMiArMTU3LDE1IEBACiAKIAkuc2xhdmVfYWxsb2MJCT0gcWxhMnh4eF9zbGF2ZV9hbGxvYywKIAkuc2xhdmVfZGVzdHJveQkJPSBxbGEyeHh4X3NsYXZlX2Rlc3Ryb3ksCisJLmNoYW5nZV9xdWV1ZV9kZXB0aAk9IHFsYTJ4MDBfY2hhbmdlX3F1ZXVlX2RlcHRoLAorCS5jaGFuZ2VfcXVldWVfdHlwZQk9IHFsYTJ4MDBfY2hhbmdlX3F1ZXVlX3R5cGUsCiAJLnRoaXNfaWQJCT0gLTEsCiAJLmNtZF9wZXJfbHVuCQk9IDMsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAogCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAogCiAJLm1heF9zZWN0b3JzCQk9IDB4RkZGRiwKKwkuc2hvc3RfYXR0cnMJCT0gcWxhMngwMF9ob3N0X2F0dHJzLAogfTsKIAogc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqcWxhMnh4eF90cmFuc3BvcnRfdGVtcGxhdGUgPSBOVUxMOwpAQCAtNDg3LDE0ICs1MDIsMTMgQEAKIHN0YXRpYyBpbnQKIHFsYTJ4MDBfZWhfd2FpdF9vbl9jb21tYW5kKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKLSNkZWZpbmUgQUJPUlRfUE9MTElOR19QRVJJT0QJSFoKLSNkZWZpbmUgQUJPUlRfV0FJVF9JVEVSCQkoKDEwICogSFopIC8gKEFCT1JUX1BPTExJTkdfUEVSSU9EKSkKKyNkZWZpbmUgQUJPUlRfUE9MTElOR19QRVJJT0QJMTAwMAorI2RlZmluZSBBQk9SVF9XQUlUX0lURVIJCSgoMTAgKiAxMDAwKSAvIChBQk9SVF9QT0xMSU5HX1BFUklPRCkpCiAJdW5zaWduZWQgbG9uZyB3YWl0X2l0ZXIgPSBBQk9SVF9XQUlUX0lURVI7CiAJaW50IHJldCA9IFFMQV9TVUNDRVNTOwogCiAJd2hpbGUgKENNRF9TUChjbWQpKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dChBQk9SVF9QT0xMSU5HX1BFUklPRCk7CisJCW1zbGVlcChBQk9SVF9QT0xMSU5HX1BFUklPRCk7CiAKIAkJaWYgKC0td2FpdF9pdGVyKQogCQkJYnJlYWs7CkBAIC0xMDE2LDcgKzEwMzAsNyBAQAogCQkJaWYgKGZjcG9ydC0+cG9ydF90eXBlICE9IEZDVF9UQVJHRVQpCiAJCQkJY29udGludWU7CiAKLQkJCXN0YXR1cyA9IHFsYTJ4MDBfdGFyZ2V0X3Jlc2V0KGhhLCBmY3BvcnQpOworCQkJc3RhdHVzID0gcWxhMngwMF9kZXZpY2VfcmVzZXQoaGEsIGZjcG9ydCk7CiAJCQlpZiAoc3RhdHVzICE9IFFMQV9TVUNDRVNTKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xMTAzLDYgKzExMTcsMjggQEAKIAlzZGV2LT5ob3N0ZGF0YSA9IE5VTEw7CiB9CiAKK3N0YXRpYyBpbnQKK3FsYTJ4MDBfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHFkZXB0aCkKK3sKKwlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBzY3NpX2dldF90YWdfdHlwZShzZGV2KSwgcWRlcHRoKTsKKwlyZXR1cm4gc2Rldi0+cXVldWVfZGVwdGg7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTJ4MDBfY2hhbmdlX3F1ZXVlX3R5cGUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgdGFnX3R5cGUpCit7CisJaWYgKHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpIHsKKwkJc2NzaV9zZXRfdGFnX3R5cGUoc2RldiwgdGFnX3R5cGUpOworCQlpZiAodGFnX3R5cGUpCisJCQlzY3NpX2FjdGl2YXRlX3RjcShzZGV2LCBzZGV2LT5xdWV1ZV9kZXB0aCk7CisJCWVsc2UKKwkJCXNjc2lfZGVhY3RpdmF0ZV90Y3Eoc2Rldiwgc2Rldi0+cXVldWVfZGVwdGgpOworCX0gZWxzZQorCQl0YWdfdHlwZSA9IDA7CisKKwlyZXR1cm4gdGFnX3R5cGU7Cit9CisKIC8qKgogICogcWxhMngwMF9jb25maWdfZG1hX2FkZHJlc3NpbmcoKSAtIENvbmZpZ3VyZSBPUyBETUEgYWRkcmVzc2luZyBtZXRob2QuCiAgKiBAaGE6IEhBIGNvbnRleHQKQEAgLTExMTMsMzYgKzExNDksMjMgQEAKIHN0YXRpYyB2b2lkCiBxbGEyeDAwX2NvbmZpZ19kbWFfYWRkcmVzc2luZyhzY3NpX3FsYV9ob3N0X3QgKmhhKQogewotCS8qIEFzc3VtZSAzMmJpdCBETUEgYWRkcmVzcyAqLworCS8qIEFzc3VtZSBhIDMyYml0IERNQSBtYXNrLiAqLwogCWhhLT5mbGFncy5lbmFibGVfNjRiaXRfYWRkcmVzc2luZyA9IDA7CiAKLQkvKgotCSAqIEdpdmVuIHRoZSB0d28gdmFyaWFudHMgcGNpX3NldF9kbWFfbWFzaygpLCBhbGxvdyB0aGUgY29tcGlsZXIgdG8KLQkgKiBhc3Npc3QgaW4gc2V0dGluZyB0aGUgcHJvcGVyIGRtYSBtYXNrLgotCSAqLwotCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSB7Ci0JCWlmIChwY2lfc2V0X2RtYV9tYXNrKGhhLT5wZGV2LCBETUFfNjRCSVRfTUFTSykgPT0gMCkgeworCWlmICghZG1hX3NldF9tYXNrKCZoYS0+cGRldi0+ZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKKwkJLyogQW55IHVwcGVyLWR3b3JkIGJpdHMgc2V0PyAqLworCQlpZiAoTVNEKGRtYV9nZXRfcmVxdWlyZWRfbWFzaygmaGEtPnBkZXYtPmRldikpICYmCisJCSAgICAhcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGhhLT5wZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKKwkJCS8qIE9rLCBhIDY0Yml0IERNQSBtYXNrIGlzIGFwcGxpY2FibGUuICovCiAJCQloYS0+ZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcgPSAxOwogCQkJaGEtPmlzcF9vcHMuY2FsY19yZXFfZW50cmllcyA9IHFsYTJ4MDBfY2FsY19pb2Nic182NDsKIAkJCWhhLT5pc3Bfb3BzLmJ1aWxkX2lvY2JzID0gcWxhMngwMF9idWlsZF9zY3NpX2lvY2JzXzY0OwotCi0JCQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGhhLT5wZGV2LAotCQkJICAgIERNQV82NEJJVF9NQVNLKSkgewotCQkJCXFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsCi0JCQkJICAgICJGYWlsZWQgdG8gc2V0IDY0IGJpdCBQQ0kgY29uc2lzdGVudCBtYXNrOyAiCi0JCQkJICAgICJ1c2luZyAzMiBiaXQuXG4iKTsKLQkJCQlwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2soaGEtPnBkZXYsCi0JCQkJICAgIERNQV8zMkJJVF9NQVNLKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsCi0JCQkgICAgIkZhaWxlZCB0byBzZXQgNjQgYml0IFBDSSBETUEgbWFzaywgZmFsbGluZyBiYWNrICIKLQkJCSAgICAidG8gMzIgYml0IE1BU0suXG4iKTsKLQkJCXBjaV9zZXRfZG1hX21hc2soaGEtPnBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJCXJldHVybjsKIAkJfQotCX0gZWxzZSB7Ci0JCXBjaV9zZXRfZG1hX21hc2soaGEtPnBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAl9CisKKwlkbWFfc2V0X21hc2soJmhhLT5wZGV2LT5kZXYsIERNQV8zMkJJVF9NQVNLKTsKKwlwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2soaGEtPnBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIH0KIAogc3RhdGljIGludApAQCAtMTMxNiw2ICsxMzM5LDcgQEAKIAloYS0+cHJldl90b3BvbG9neSA9IDA7CiAJaGEtPnBvcnRzID0gTUFYX0JVU0VTOwogCWhhLT5pbml0X2NiX3NpemUgPSBzaXplb2YoaW5pdF9jYl90KTsKKwloYS0+bWdtdF9zdnJfbG9vcF9pZCA9IE1BTkFHRU1FTlRfU0VSVkVSOwogCiAJLyogQXNzaWduIElTUCBzcGVjaWZpYyBvcGVyYXRpb25zLiAqLwogCWhhLT5pc3Bfb3BzLnBjaV9jb25maWcJCT0gcWxhMjEwMF9wY2lfY29uZmlnOwpAQCAtMTMzOCw2ICsxMzYyLDcgQEAKIAloYS0+aXNwX29wcy5jYWxjX3JlcV9lbnRyaWVzCT0gcWxhMngwMF9jYWxjX2lvY2JzXzMyOwogCWhhLT5pc3Bfb3BzLmJ1aWxkX2lvY2JzCQk9IHFsYTJ4MDBfYnVpbGRfc2NzaV9pb2Nic18zMjsKIAloYS0+aXNwX29wcy5wcmVwX21zX2lvY2IJPSBxbGEyeDAwX3ByZXBfbXNfaW9jYjsKKwloYS0+aXNwX29wcy5wcmVwX21zX2ZkbWlfaW9jYgk9IHFsYTJ4MDBfcHJlcF9tc19mZG1pX2lvY2I7CiAJaGEtPmlzcF9vcHMucmVhZF9udnJhbQkJPSBxbGEyeDAwX3JlYWRfbnZyYW1fZGF0YTsKIAloYS0+aXNwX29wcy53cml0ZV9udnJhbQkJPSBxbGEyeDAwX3dyaXRlX252cmFtX2RhdGE7CiAJaGEtPmlzcF9vcHMuZndfZHVtcAkJPSBxbGEyMTAwX2Z3X2R1bXA7CkBAIC0xMzc1LDYgKzE0MDAsNyBAQAogCQloYS0+cmVzcG9uc2VfcV9sZW5ndGggPSBSRVNQT05TRV9FTlRSWV9DTlRfMjMwMDsKIAkJaGEtPmxhc3RfbG9vcF9pZCA9IFNOU19MQVNUX0xPT1BfSURfMjMwMDsKIAkJaGEtPmluaXRfY2Jfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW5pdF9jYl8yNHh4KTsKKwkJaGEtPm1nbXRfc3ZyX2xvb3BfaWQgPSAxMDsKIAkJaGEtPmlzcF9vcHMucGNpX2NvbmZpZyA9IHFsYTI0eHhfcGNpX2NvbmZpZzsKIAkJaGEtPmlzcF9vcHMucmVzZXRfY2hpcCA9IHFsYTI0eHhfcmVzZXRfY2hpcDsKIAkJaGEtPmlzcF9vcHMuY2hpcF9kaWFnID0gcWxhMjR4eF9jaGlwX2RpYWc7CkBAIC0xMzk1LDYgKzE0MjEsNyBAQAogCQloYS0+aXNwX29wcy5mYWJyaWNfbG9naW4gPSBxbGEyNHh4X2xvZ2luX2ZhYnJpYzsKIAkJaGEtPmlzcF9vcHMuZmFicmljX2xvZ291dCA9IHFsYTI0eHhfZmFicmljX2xvZ291dDsKIAkJaGEtPmlzcF9vcHMucHJlcF9tc19pb2NiID0gcWxhMjR4eF9wcmVwX21zX2lvY2I7CisJCWhhLT5pc3Bfb3BzLnByZXBfbXNfZmRtaV9pb2NiID0gcWxhMjR4eF9wcmVwX21zX2ZkbWlfaW9jYjsKIAkJaGEtPmlzcF9vcHMucmVhZF9udnJhbSA9IHFsYTI0eHhfcmVhZF9udnJhbV9kYXRhOwogCQloYS0+aXNwX29wcy53cml0ZV9udnJhbSA9IHFsYTI0eHhfd3JpdGVfbnZyYW1fZGF0YTsKIAkJaGEtPmlzcF9vcHMuZndfZHVtcCA9IHFsYTI0eHhfZndfZHVtcDsKQEAgLTE1NTgsOCArMTU4NSw2IEBACiAJcmV0dXJuIDA7CiAKIHByb2JlX2ZhaWxlZDoKLQlmY19yZW1vdmVfaG9zdChoYS0+aG9zdCk7Ci0KIAlxbGEyeDAwX2ZyZWVfZGV2aWNlKGhhKTsKIAogCXNjc2lfaG9zdF9wdXQoaG9zdCk7CkBAIC0xNjAxLDEwICsxNjI2LDYgQEAKIAlpZiAoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSkKIAkJcWxhMngwMF9jYW5jZWxfaW9fZGVzY3JpcHRvcnMoaGEpOwogCi0JLyogdHVybi1vZmYgaW50ZXJydXB0cyBvbiB0aGUgY2FyZCAqLwotCWlmIChoYS0+aW50ZXJydXB0c19vbikKLQkJaGEtPmlzcF9vcHMuZGlzYWJsZV9pbnRycyhoYSk7Ci0KIAkvKiBEaXNhYmxlIHRpbWVyICovCiAJaWYgKGhhLT50aW1lcl9hY3RpdmUpCiAJCXFsYTJ4MDBfc3RvcF90aW1lcihoYSk7CkBAIC0xNjI0LDggKzE2NDUsMTQgQEAKIAkJfQogCX0KIAotCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOworCS8qIFN0b3AgY3VycmVudGx5IGV4ZWN1dGluZyBmaXJtd2FyZS4gKi8KKwlxbGEyeDAwX3N0b3BfZmlybXdhcmUoaGEpOwogCisJLyogdHVybi1vZmYgaW50ZXJydXB0cyBvbiB0aGUgY2FyZCAqLworCWlmIChoYS0+aW50ZXJydXB0c19vbikKKwkJaGEtPmlzcF9vcHMuZGlzYWJsZV9pbnRycyhoYSk7CisKKwlxbGEyeDAwX21lbV9mcmVlKGhhKTsKIAogCWhhLT5mbGFncy5vbmxpbmUgPSAwOwogCkBAIC0xOTM0LDcgKzE5NjEsNyBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQJKmZjcGwsICpmY3B0ZW1wOwogCWZjX3BvcnRfdAkqZmNwb3J0OwotCXVuc2lnbmVkIGxvbmcJd3RpbWU7LyogbWF4IHdhaXQgdGltZSBpZiBtYnggY21kIGlzIGJ1c3kuICovCisJdW5zaWduZWQgaW50CXd0aW1lOy8qIG1heCB3YWl0IHRpbWUgaWYgbWJ4IGNtZCBpcyBidXN5LiAqLwogCiAJaWYgKGhhID09IE5VTEwpIHsKIAkJLyogZXJyb3IgKi8KQEAgLTE5NDMsMTEgKzE5NzAsOSBAQAogCX0KIAogCS8qIE1ha2Ugc3VyZSBhbGwgb3RoZXIgdGhyZWFkcyBhcmUgc3RvcHBlZC4gKi8KLQl3dGltZSA9IDYwICogSFo7Ci0Jd2hpbGUgKGhhLT5kcGNfd2FpdCAmJiB3dGltZSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQl3dGltZSA9IHNjaGVkdWxlX3RpbWVvdXQod3RpbWUpOwotCX0KKwl3dGltZSA9IDYwICogMTAwMDsKKwl3aGlsZSAoaGEtPmRwY193YWl0ICYmIHd0aW1lKQorCQl3dGltZSA9IG1zbGVlcF9pbnRlcnJ1cHRpYmxlKHd0aW1lKTsKIAogCS8qIGZyZWUgaW9jdGwgbWVtb3J5ICovCiAJcWxhMngwMF9mcmVlX2lvY3RsX21lbShoYSk7CkBAIC0yNDc4LDE1ICsyNTAzLDE1IEBACiBpbnQKIHFsYTJ4MDBfZG93bl90aW1lb3V0KHN0cnVjdCBzZW1hcGhvcmUgKnNlbWEsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKLQljb25zdCB1bnNpZ25lZCBpbnQgc3RlcCA9IEhaLzEwOworCWNvbnN0IHVuc2lnbmVkIGludCBzdGVwID0gMTAwOyAvKiBtc2VjcyAqLworCXVuc2lnbmVkIGludCBpdGVyYXRpb25zID0gamlmZmllc190b19tc2Vjcyh0aW1lb3V0KS8xMDA7CiAKIAlkbyB7CiAJCWlmICghZG93bl90cnlsb2NrKHNlbWEpKQogCQkJcmV0dXJuIDA7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWlmIChzY2hlZHVsZV90aW1lb3V0KHN0ZXApKQorCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoc3RlcCkpCiAJCQlicmVhazsKLQl9IHdoaWxlICgodGltZW91dCAtPSBzdGVwKSA+IDApOworCX0gd2hpbGUgKC0taXRlcmF0aW9ucyA+PSAwKTsKIAogCXJldHVybiAtRVRJTUVET1VUOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCmluZGV4IGQ3ZjVjNjAuLmMxNGFiZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKQEAgLTQ2OCwyMSArNDY4LDEyIEBACiAgICAgdWludDMyX3QgZHdvcmRzKQogewogCXVpbnQzMl90IGk7Ci0Jc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7Ci0KLQkvKiBQYXVzZSBSSVNDLiAqLwotCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfU0VUX1JJU0NfUEFVU0UpOwotCVJEX1JFR19EV09SRCgmcmVnLT5oY2NyKTsJCS8qIFBDSSBQb3N0aW5nLiAqLwogCiAJLyogRHdvcmQgcmVhZHMgdG8gZmxhc2guICovCiAJZm9yIChpID0gMDsgaSA8IGR3b3JkczsgaSsrLCBmYWRkcisrKQogCQlkd3B0cltpXSA9IGNwdV90b19sZTMyKHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwKIAkJICAgIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoZmFkZHIpKSk7CiAKLQkvKiBSZWxlYXNlIFJJU0MgcGF1c2UuICovCi0JV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9SRUxfUklTQ19QQVVTRSk7Ci0JUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOwkJLyogUENJIFBvc3RpbmcuICovCi0KIAlyZXR1cm4gZHdwdHI7CiB9CiAKQEAgLTUzMiwxMCArNTIzLDYgQEAKIAogCXJldCA9IFFMQV9TVUNDRVNTOwogCi0JLyogUGF1c2UgUklTQy4gKi8KLQlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX1NFVF9SSVNDX1BBVVNFKTsKLQlSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CQkvKiBQQ0kgUG9zdGluZy4gKi8KLQogCXFsYTI0eHhfZ2V0X2ZsYXNoX21hbnVmYWN0dXJlcihoYSwgJm1hbl9pZCwgJmZsYXNoX2lkKTsKIAlERUJVRzkocHJpbnRrKCIlcyglbGQpOiBGbGFzaCBtYW5faWQ9JWQgZmxhc2hfaWQ9JWRcbiIsIF9fZnVuY19fLAogCSAgICBoYS0+aG9zdF9ubywgbWFuX2lkLCBmbGFzaF9pZCkpOwpAQCAtNTk5LDEwICs1ODYsNiBAQAogCSAgICBSRF9SRUdfRFdPUkQoJnJlZy0+Y3RybF9zdGF0dXMpICYgfkNTUlhfRkxBU0hfRU5BQkxFKTsKIAlSRF9SRUdfRFdPUkQoJnJlZy0+Y3RybF9zdGF0dXMpOwkvKiBQQ0kgUG9zdGluZy4gKi8KIAotCS8qIFJlbGVhc2UgUklTQyBwYXVzZS4gKi8KLQlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX1JFTF9SSVNDX1BBVVNFKTsKLQlSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CQkvKiBQQ0kgUG9zdGluZy4gKi8KLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTYzMCwxMSArNjEzLDYgQEAKIHsKIAl1aW50MzJfdCBpOwogCXVpbnQzMl90ICpkd3B0cjsKLQlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKLQotCS8qIFBhdXNlIFJJU0MuICovCi0JV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9TRVRfUklTQ19QQVVTRSk7Ci0JUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOwkvKiBQQ0kgUG9zdGluZy4gKi8KIAogCS8qIER3b3JkIHJlYWRzIHRvIGZsYXNoLiAqLwogCWR3cHRyID0gKHVpbnQzMl90ICopYnVmOwpAQCAtNjQyLDEwICs2MjAsNiBAQAogCQlkd3B0cltpXSA9IGNwdV90b19sZTMyKHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwKIAkJICAgIG52cmFtX2RhdGFfdG9fYWNjZXNzX2FkZHIobmFkZHIpKSk7CiAKLQkvKiBSZWxlYXNlIFJJU0MgcGF1c2UuICovCi0JV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9SRUxfUklTQ19QQVVTRSk7Ci0JUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOwkvKiBQQ0kgUG9zdGluZy4gKi8KLQogCXJldHVybiBidWY7CiB9CiAKQEAgLTY5MCwxMCArNjY0LDYgQEAKIAogCXJldCA9IFFMQV9TVUNDRVNTOwogCi0JLyogUGF1c2UgUklTQy4gKi8KLQlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX1NFVF9SSVNDX1BBVVNFKTsKLQlSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CQkvKiBQQ0kgUG9zdGluZy4gKi8KLQogCS8qIEVuYWJsZSBmbGFzaCB3cml0ZS4gKi8KIAlXUlRfUkVHX0RXT1JEKCZyZWctPmN0cmxfc3RhdHVzLAogCSAgICBSRF9SRUdfRFdPUkQoJnJlZy0+Y3RybF9zdGF0dXMpIHwgQ1NSWF9GTEFTSF9FTkFCTEUpOwpAQCAtNzI4LDkgKzY5OCw1IEBACiAJICAgIFJEX1JFR19EV09SRCgmcmVnLT5jdHJsX3N0YXR1cykgJiB+Q1NSWF9GTEFTSF9FTkFCTEUpOwogCVJEX1JFR19EV09SRCgmcmVnLT5jdHJsX3N0YXR1cyk7CS8qIFBDSSBQb3N0aW5nLiAqLwogCi0JLyogUmVsZWFzZSBSSVNDIHBhdXNlLiAqLwotCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfUkVMX1JJU0NfUEFVU0UpOwotCVJEX1JFR19EV09SRCgmcmVnLT5oY2NyKTsJCS8qIFBDSSBQb3N0aW5nLiAqLwotCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCmluZGV4IGUzY2QzNjEuLmVhZTdkNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaApAQCAtMTksOSArMTksOSBAQAogLyoKICAqIERyaXZlciB2ZXJzaW9uCiAgKi8KLSNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDEuMDBiNS1rIgorI2RlZmluZSBRTEEyWFhYX1ZFUlNJT04gICAgICAiOC4wMS4wMC1rIgogCiAjZGVmaW5lIFFMQV9EUklWRVJfTUFKT1JfVkVSCTgKICNkZWZpbmUgUUxBX0RSSVZFUl9NSU5PUl9WRVIJMQogI2RlZmluZSBRTEFfRFJJVkVSX1BBVENIX1ZFUgkwCi0jZGVmaW5lIFFMQV9EUklWRVJfQkVUQV9WRVIJNQorI2RlZmluZSBRTEFfRFJJVkVSX0JFVEFfVkVSCTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9yYWlkX2NsYXNzLmMgYi9kcml2ZXJzL3Njc2kvcmFpZF9jbGFzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZWE1MDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcmFpZF9jbGFzcy5jCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogUkFJRCBBdHRyaWJ1dGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhaWRfY2xhc3MuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2RlZmluZSBSQUlEX05VTV9BVFRSUwkzCisKK3N0cnVjdCByYWlkX2ludGVybmFsIHsKKwlzdHJ1Y3QgcmFpZF90ZW1wbGF0ZSByOworCXN0cnVjdCByYWlkX2Z1bmN0aW9uX3RlbXBsYXRlICpmOworCS8qIFRoZSBhY3R1YWwgYXR0cmlidXRlcyAqLworCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIHByaXZhdGVfYXR0cnNbUkFJRF9OVU1fQVRUUlNdOworCS8qIFRoZSBhcnJheSBvZiBudWxsIHRlcm1pbmF0ZWQgcG9pbnRlcnMgdG8gYXR0cmlidXRlcyAKKwkgKiBuZWVkZWQgYnkgc2NzaV9zeXNmcy5jICovCisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmF0dHJzW1JBSURfTlVNX0FUVFJTICsgMV07Cit9OworCitzdHJ1Y3QgcmFpZF9jb21wb25lbnQgeworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IG51bTsKK307CisKKyNkZWZpbmUgdG9fcmFpZF9pbnRlcm5hbCh0bXBsKQljb250YWluZXJfb2YodG1wbCwgc3RydWN0IHJhaWRfaW50ZXJuYWwsIHIpCisKKyNkZWZpbmUgdGNfdG9fcmFpZF9pbnRlcm5hbCh0Y29udCkgKHsJCQkJCVwKKwlzdHJ1Y3QgcmFpZF90ZW1wbGF0ZSAqciA9CQkJCQlcCisJCWNvbnRhaW5lcl9vZih0Y29udCwgc3RydWN0IHJhaWRfdGVtcGxhdGUsIHJhaWRfYXR0cnMpOwlcCisJdG9fcmFpZF9pbnRlcm5hbChyKTsJCQkJCQlcCit9KQorCisjZGVmaW5lIGFjX3RvX3JhaWRfaW50ZXJuYWwoYWNvbnQpICh7CQkJCQlcCisJc3RydWN0IHRyYW5zcG9ydF9jb250YWluZXIgKnRjID0JCQkJXAorCQljb250YWluZXJfb2YoYWNvbnQsIHN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyLCBhYyk7CVwKKwl0Y190b19yYWlkX2ludGVybmFsKHRjKTsJCQkJCVwKK30pCisKKyNkZWZpbmUgY2xhc3NfZGV2aWNlX3RvX3JhaWRfaW50ZXJuYWwoY2RldikgKHsJCQkJXAorCXN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICphYyA9CQkJCVwKKwkJYXR0cmlidXRlX2NvbnRhaW5lcl9jbGFzc2Rldl90b19jb250YWluZXIoY2Rldik7CVwKKwlhY190b19yYWlkX2ludGVybmFsKGFjKTsJCQkJCVwKK30pCisJCisKK3N0YXRpYyBpbnQgcmFpZF9tYXRjaChzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqY29udCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qIFdlIGhhdmUgdG8gbG9vayBmb3IgZXZlcnkgc3Vic3lzdGVtIHRoYXQgY291bGQgaG91c2UKKwkgKiBlbXVsYXRlZCBSQUlEIGRldmljZXMsIHNvIHN0YXJ0IHdpdGggU0NTSSAqLworCXN0cnVjdCByYWlkX2ludGVybmFsICppID0gYWNfdG9fcmFpZF9pbnRlcm5hbChjb250KTsKKworCWlmIChzY3NpX2lzX3NkZXZfZGV2aWNlKGRldikpIHsKKwkJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKworCQlpZiAoaS0+Zi0+Y29va2llICE9IHNkZXYtPmhvc3QtPmhvc3R0KQorCQkJcmV0dXJuIDA7CisKKwkJcmV0dXJuIGktPmYtPmlzX3JhaWQoZGV2KTsKKwl9CisJLyogRklYTUU6IGxvb2sgYXQgb3RoZXIgc3Vic3lzdGVtcyB0b28gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWlkX3NldHVwKHN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyICp0Yywgc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGNsYXNzX2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3QgcmFpZF9kYXRhICpyZDsKKworCUJVR19PTihjbGFzc19nZXRfZGV2ZGF0YShjZGV2KSk7CisKKwlyZCA9IGttYWxsb2Moc2l6ZW9mKCpyZCksIEdGUF9LRVJORUwpOworCWlmICghcmQpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHJkLCAwLCBzaXplb2YoKnJkKSk7CisJSU5JVF9MSVNUX0hFQUQoJnJkLT5jb21wb25lbnRfbGlzdCk7CisJY2xhc3Nfc2V0X2RldmRhdGEoY2RldiwgcmQpOworCQkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWlkX3JlbW92ZShzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqdGMsIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IHJhaWRfZGF0YSAqcmQgPSBjbGFzc19nZXRfZGV2ZGF0YShjZGV2KTsKKwlzdHJ1Y3QgcmFpZF9jb21wb25lbnQgKnJjLCAqbmV4dDsKKwljbGFzc19zZXRfZGV2ZGF0YShjZGV2LCBOVUxMKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmMsIG5leHQsICZyZC0+Y29tcG9uZW50X2xpc3QsIG5vZGUpIHsKKwkJY2hhciBidWZbNDBdOworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiY29tcG9uZW50LSVkIiwgcmMtPm51bSk7CisJCWxpc3RfZGVsKCZyYy0+bm9kZSk7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZjZGV2LT5rb2JqLCBidWYpOworCQlrZnJlZShyYyk7CisJfQorCWtmcmVlKGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIERFQ0xBUkVfVFJBTlNQT1JUX0NMQVNTKHJhaWRfY2xhc3MsCisJCQkgICAgICAgInJhaWRfZGV2aWNlcyIsCisJCQkgICAgICAgcmFpZF9zZXR1cCwKKwkJCSAgICAgICByYWlkX3JlbW92ZSwKKwkJCSAgICAgICBOVUxMKTsKKworc3RhdGljIHN0cnVjdCB7CisJZW51bSByYWlkX3N0YXRlCXZhbHVlOworCWNoYXIJCSpuYW1lOworfSByYWlkX3N0YXRlc1tdID0geworCXsgUkFJRF9BQ1RJVkUsICJhY3RpdmUiIH0sCisJeyBSQUlEX0RFR1JBREVELCAiZGVncmFkZWQiIH0sCisJeyBSQUlEX1JFU1lOQ0lORywgInJlc3luY2luZyIgfSwKKwl7IFJBSURfT0ZGTElORSwgIm9mZmxpbmUiIH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqcmFpZF9zdGF0ZV9uYW1lKGVudW0gcmFpZF9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQgaTsKKwljaGFyICpuYW1lID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmFpZF9zdGF0ZXMpL3NpemVvZihyYWlkX3N0YXRlc1swXSk7IGkrKykgeworCQlpZiAocmFpZF9zdGF0ZXNbaV0udmFsdWUgPT0gc3RhdGUpIHsKKwkJCW5hbWUgPSByYWlkX3N0YXRlc1tpXS5uYW1lOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKKworI2RlZmluZSByYWlkX2F0dHJfc2hvd19pbnRlcm5hbChhdHRyLCBmbXQsIHZhciwgY29kZSkJCQlcCitzdGF0aWMgc3NpemVfdCByYWlkX3Nob3dfIyNhdHRyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgcmFpZF9kYXRhICpyZCA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOwkJCVwKKwljb2RlCQkJCQkJCQlcCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICNmbXQgIlxuIiwgdmFyKTsJCQlcCit9CisKKyNkZWZpbmUgcmFpZF9hdHRyX3JvX3N0YXRlcyhhdHRyLCBzdGF0ZXMsIGNvZGUpCQkJCVwKK3JhaWRfYXR0cl9zaG93X2ludGVybmFsKGF0dHIsICVzLCBuYW1lLAkJCQkJXAorCWNvbnN0IGNoYXIgKm5hbWU7CQkJCQkJXAorCWNvZGUJCQkJCQkJCVwKKwluYW1lID0gcmFpZF8jI3N0YXRlcyMjX25hbWUocmQtPmF0dHIpOwkJCQlcCispCQkJCQkJCQkJXAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGF0dHIsIFNfSVJVR08sIHJhaWRfc2hvd18jI2F0dHIsIE5VTEwpCisKKworI2RlZmluZSByYWlkX2F0dHJfcm9faW50ZXJuYWwoYXR0ciwgY29kZSkJCQkJXAorcmFpZF9hdHRyX3Nob3dfaW50ZXJuYWwoYXR0ciwgJWQsIHJkLT5hdHRyLCBjb2RlKQkJCVwKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihhdHRyLCBTX0lSVUdPLCByYWlkX3Nob3dfIyNhdHRyLCBOVUxMKQorCisjZGVmaW5lIEFUVFJfQ09ERShhdHRyKQkJCQkJCQlcCisJc3RydWN0IHJhaWRfaW50ZXJuYWwgKmkgPSBjbGFzc19kZXZpY2VfdG9fcmFpZF9pbnRlcm5hbChjZGV2KTsJXAorCWlmIChpLT5mLT5nZXRfIyNhdHRyKQkJCQkJCVwKKwkJaS0+Zi0+Z2V0XyMjYXR0cihjZGV2LT5kZXYpOworCisjZGVmaW5lIHJhaWRfYXR0cl9ybyhhdHRyKQlyYWlkX2F0dHJfcm9faW50ZXJuYWwoYXR0ciwgKQorI2RlZmluZSByYWlkX2F0dHJfcm9fZm4oYXR0cikJcmFpZF9hdHRyX3JvX2ludGVybmFsKGF0dHIsIEFUVFJfQ09ERShhdHRyKSkKKyNkZWZpbmUgcmFpZF9hdHRyX3JvX3N0YXRlKGF0dHIpCXJhaWRfYXR0cl9yb19zdGF0ZXMoYXR0ciwgYXR0ciwgQVRUUl9DT0RFKGF0dHIpKQorCityYWlkX2F0dHJfcm8obGV2ZWwpOworcmFpZF9hdHRyX3JvX2ZuKHJlc3luYyk7CityYWlkX2F0dHJfcm9fc3RhdGUoc3RhdGUpOworCit2b2lkIHJhaWRfY29tcG9uZW50X2FkZChzdHJ1Y3QgcmFpZF90ZW1wbGF0ZSAqcixzdHJ1Y3QgZGV2aWNlICpyYWlkX2RldiwKKwkJCXN0cnVjdCBkZXZpY2UgKmNvbXBvbmVudF9kZXYpCit7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiA9CisJCWF0dHJpYnV0ZV9jb250YWluZXJfZmluZF9jbGFzc19kZXZpY2UoJnItPnJhaWRfYXR0cnMuYWMsCisJCQkJCQkgICAgICByYWlkX2Rldik7CisJc3RydWN0IHJhaWRfY29tcG9uZW50ICpyYzsKKwlzdHJ1Y3QgcmFpZF9kYXRhICpyZCA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOworCWNoYXIgYnVmWzQwXTsKKworCXJjID0ga21hbGxvYyhzaXplb2YoKnJjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyYykKKwkJcmV0dXJuOworCisJSU5JVF9MSVNUX0hFQUQoJnJjLT5ub2RlKTsKKwlyYy0+ZGV2ID0gY29tcG9uZW50X2RldjsKKwlyYy0+bnVtID0gcmQtPmNvbXBvbmVudF9jb3VudCsrOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImNvbXBvbmVudC0lZCIsIHJjLT5udW0pOworCWxpc3RfYWRkX3RhaWwoJnJjLT5ub2RlLCAmcmQtPmNvbXBvbmVudF9saXN0KTsKKwlzeXNmc19jcmVhdGVfbGluaygmY2Rldi0+a29iaiwgJmNvbXBvbmVudF9kZXYtPmtvYmosIGJ1Zik7Cit9CitFWFBPUlRfU1lNQk9MKHJhaWRfY29tcG9uZW50X2FkZCk7CisKK3N0cnVjdCByYWlkX3RlbXBsYXRlICoKK3JhaWRfY2xhc3NfYXR0YWNoKHN0cnVjdCByYWlkX2Z1bmN0aW9uX3RlbXBsYXRlICpmdCkKK3sKKwlzdHJ1Y3QgcmFpZF9pbnRlcm5hbCAqaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByYWlkX2ludGVybmFsKSwKKwkJCQkJICBHRlBfS0VSTkVMKTsKKwlpbnQgY291bnQgPSAwOworCisJaWYgKHVubGlrZWx5KCFpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoaSwgMCwgc2l6ZW9mKCppKSk7CisKKwlpLT5mID0gZnQ7CisKKwlpLT5yLnJhaWRfYXR0cnMuYWMuY2xhc3MgPSAmcmFpZF9jbGFzcy5jbGFzczsKKwlpLT5yLnJhaWRfYXR0cnMuYWMubWF0Y2ggPSByYWlkX21hdGNoOworCWktPnIucmFpZF9hdHRycy5hYy5hdHRycyA9ICZpLT5hdHRyc1swXTsKKworCWF0dHJpYnV0ZV9jb250YWluZXJfcmVnaXN0ZXIoJmktPnIucmFpZF9hdHRycy5hYyk7CisKKwlpLT5hdHRyc1tjb3VudCsrXSA9ICZjbGFzc19kZXZpY2VfYXR0cl9sZXZlbDsKKwlpLT5hdHRyc1tjb3VudCsrXSA9ICZjbGFzc19kZXZpY2VfYXR0cl9yZXN5bmM7CisJaS0+YXR0cnNbY291bnQrK10gPSAmY2xhc3NfZGV2aWNlX2F0dHJfc3RhdGU7CisKKwlpLT5hdHRyc1tjb3VudF0gPSBOVUxMOworCUJVR19PTihjb3VudCA+IFJBSURfTlVNX0FUVFJTKTsKKworCXJldHVybiAmaS0+cjsKK30KK0VYUE9SVF9TWU1CT0wocmFpZF9jbGFzc19hdHRhY2gpOworCit2b2lkCityYWlkX2NsYXNzX3JlbGVhc2Uoc3RydWN0IHJhaWRfdGVtcGxhdGUgKnIpCit7CisJc3RydWN0IHJhaWRfaW50ZXJuYWwgKmkgPSB0b19yYWlkX2ludGVybmFsKHIpOworCisJYXR0cmlidXRlX2NvbnRhaW5lcl91bnJlZ2lzdGVyKCZpLT5yLnJhaWRfYXR0cnMuYWMpOworCisJa2ZyZWUoaSk7Cit9CitFWFBPUlRfU1lNQk9MKHJhaWRfY2xhc3NfcmVsZWFzZSk7CisKK3N0YXRpYyBfX2luaXQgaW50IHJhaWRfaW5pdCh2b2lkKQoreworCXJldHVybiB0cmFuc3BvcnRfY2xhc3NfcmVnaXN0ZXIoJnJhaWRfY2xhc3MpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgcmFpZF9leGl0KHZvaWQpCit7CisJdHJhbnNwb3J0X2NsYXNzX3VucmVnaXN0ZXIoJnJhaWRfY2xhc3MpOworfQorCitNT0RVTEVfQVVUSE9SKCJKYW1lcyBCb3R0b21sZXkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUkFJRCBkZXZpY2UgY2xhc3MiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQocmFpZF9pbml0KTsKK21vZHVsZV9leGl0KHJhaWRfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX212LmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9tdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNzZmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9tdi5jCkBAIC0wLDAgKzEsODI3IEBACisvKgorICogc2F0YV9tdi5jIC0gTWFydmVsbCBTQVRBIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgMjAwNTogRU1DIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAqCisgKiBQbGVhc2UgQUxXQVlTIGNvcHkgbGludXgtaWRlQHZnZXIua2VybmVsLm9yZyBvbiBlbWFpbHMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBEUlZfTkFNRQkic2F0YV9tdiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMTIiCisKK2VudW0geworCS8qIEJBUidzIGFyZSBlbnVtZXJhdGVkIGluIHRlcm1zIG9mIHBjaV9yZXNvdXJjZV9zdGFydCgpIHRlcm1zICovCisJTVZfUFJJTUFSWV9CQVIJCT0gMCwJLyogb2Zmc2V0IDB4MTA6IG1lbW9yeSBzcGFjZSAqLworCU1WX0lPX0JBUgkJPSAyLAkvKiBvZmZzZXQgMHgxODogSU8gc3BhY2UgKi8KKwlNVl9NSVNDX0JBUgkJPSAzLAkvKiBvZmZzZXQgMHgxYzogRkxBU0gsIE5WUkFNLCBTUkFNICovCisKKwlNVl9NQUpPUl9SRUdfQVJFQV9TWgk9IDB4MTAwMDAsCS8qIDY0S0IgKi8KKwlNVl9NSU5PUl9SRUdfQVJFQV9TWgk9IDB4MjAwMCwJLyogOEtCICovCisKKwlNVl9QQ0lfUkVHX0JBU0UJCT0gMCwKKwlNVl9JUlFfQ09BTF9SRUdfQkFTRQk9IDB4MTgwMDAsCS8qIDZ4eHggcGFydCBvbmx5ICovCisJTVZfU0FUQUhDMF9SRUdfQkFTRQk9IDB4MjAwMDAsCisKKwlNVl9QQ0lfUkVHX1NaCQk9IE1WX01BSk9SX1JFR19BUkVBX1NaLAorCU1WX1NBVEFIQ19SRUdfU1oJPSBNVl9NQUpPUl9SRUdfQVJFQV9TWiwKKwlNVl9TQVRBSENfQVJCVFJfUkVHX1NaCT0gTVZfTUlOT1JfUkVHX0FSRUFfU1osCQkvKiBhcmJpdGVyICovCisJTVZfUE9SVF9SRUdfU1oJCT0gTVZfTUlOT1JfUkVHX0FSRUFfU1osCisKKwlNVl9RX0NUCQkJPSAzMiwKKwlNVl9DUlFCX1NaCQk9IDMyLAorCU1WX0NSUEJfU1oJCT0gOCwKKworCU1WX0RNQV9CT1VOREFSWQkJPSAweGZmZmZmZmZmVSwKKwlTQVRBSENfTUFTSwkJPSAofihNVl9TQVRBSENfUkVHX1NaIC0gMSkpLAorCisJTVZfUE9SVFNfUEVSX0hDCQk9IDQsCisJLyogPT0gKHBvcnQgLyBNVl9QT1JUU19QRVJfSEMpIHRvIGRldGVybWluZSBIQyBmcm9tIDAtNyBwb3J0ICovCisJTVZfUE9SVF9IQ19TSElGVAk9IDIsCisJLyogPT0gKHBvcnQgJSBNVl9QT1JUU19QRVJfSEMpIHRvIGRldGVybWluZSBwb3J0IGZyb20gMC03IHBvcnQgKi8KKwlNVl9QT1JUX01BU0sJCT0gMywKKworCS8qIEhvc3QgRmxhZ3MgKi8KKwlNVl9GTEFHX0RVQUxfSEMJCT0gKDEgPDwgMzApLCAgLyogdHdvIFNBVEEgSG9zdCBDb250cm9sbGVycyAqLworCU1WX0ZMQUdfSVJRX0NPQUxFU0NFCT0gKDEgPDwgMjkpLCAgLyogSVJRIGNvYWxlc2NpbmcgY2FwYWJpbGl0eSAqLworCU1WX0ZMQUdfQkRNQQkJPSAoMSA8PCAyOCksICAvKiBCYXNpYyBETUEgKi8KKworCWNoaXBfNTA0eAkJPSAwLAorCWNoaXBfNTA4eAkJPSAxLAorCWNoaXBfNjA0eAkJPSAyLAorCWNoaXBfNjA4eAkJPSAzLAorCisJLyogUENJIGludGVyZmFjZSByZWdpc3RlcnMgKi8KKworCVBDSV9NQUlOX0NNRF9TVFNfT0ZTCT0gMHhkMzAsCisJU1RPUF9QQ0lfTUFTVEVSCQk9ICgxIDw8IDIpLAorCVBDSV9NQVNURVJfRU1QVFkJPSAoMSA8PCAzKSwKKwlHTE9CX1NGVF9SU1QJCT0gKDEgPDwgNCksCisKKwlQQ0lfSVJRX0NBVVNFX09GUwk9IDB4MWQ1OCwKKwlQQ0lfSVJRX01BU0tfT0ZTCT0gMHgxZDVjLAorCVBDSV9VTk1BU0tfQUxMX0lSUVMJPSAweDdmZmZmZiwJLyogYml0cyAyMi0wICovCisKKwlIQ19NQUlOX0lSUV9DQVVTRV9PRlMJPSAweDFkNjAsCisJSENfTUFJTl9JUlFfTUFTS19PRlMJPSAweDFkNjQsCisJUE9SVDBfRVJSCQk9ICgxIDw8IDApLAkvKiBzaGlmdCBieSBwb3J0ICMgKi8KKwlQT1JUMF9ET05FCQk9ICgxIDw8IDEpLAkvKiBzaGlmdCBieSBwb3J0ICMgKi8KKwlIQzBfSVJRX1BFTkQJCT0gMHgxZmYsCS8qIGJpdHMgMC04ID0gSEMwJ3MgcG9ydHMgKi8KKwlIQ19TSElGVAkJPSA5LAkJLyogYml0cyA5LTE3ID0gSEMxJ3MgcG9ydHMgKi8KKwlQQ0lfRVJSCQkJPSAoMSA8PCAxOCksCisJVFJBTl9MT19ET05FCQk9ICgxIDw8IDE5KSwJLyogNnh4eDogSVJRIGNvYWxlc2NpbmcgKi8KKwlUUkFOX0hJX0RPTkUJCT0gKDEgPDwgMjApLAkvKiA2eHh4OiBJUlEgY29hbGVzY2luZyAqLworCVBPUlRTXzBfN19DT0FMX0RPTkUJPSAoMSA8PCAyMSksCS8qIDZ4eHg6IElSUSBjb2FsZXNjaW5nICovCisJR1BJT19JTlQJCT0gKDEgPDwgMjIpLAorCVNFTEZfSU5UCQk9ICgxIDw8IDIzKSwKKwlUV1NJX0lOVAkJPSAoMSA8PCAyNCksCisJSENfTUFJTl9SU1ZECQk9ICgweDdmIDw8IDI1KSwJLyogYml0cyAzMS0yNSAqLworCUhDX01BSU5fTUFTS0VEX0lSUVMJPSAoVFJBTl9MT19ET05FIHwgVFJBTl9ISV9ET05FIHwgCisJCQkJICAgUE9SVFNfMF83X0NPQUxfRE9ORSB8IEdQSU9fSU5UIHwgVFdTSV9JTlQgfAorCQkJCSAgIEhDX01BSU5fUlNWRCksCisKKwkvKiBTQVRBSEMgcmVnaXN0ZXJzICovCisJSENfQ0ZHX09GUwkJPSAwLAorCisJSENfSVJRX0NBVVNFX09GUwk9IDB4MTQsCisJQ1JCUF9ETUFfRE9ORQkJPSAoMSA8PCAwKSwJLyogc2hpZnQgYnkgcG9ydCAjICovCisJSENfSVJRX0NPQUwJCT0gKDEgPDwgNCksCS8qIElSUSBjb2FsZXNjaW5nICovCisJREVWX0lSUQkJCT0gKDEgPDwgOCksCS8qIHNoaWZ0IGJ5IHBvcnQgIyAqLworCisJLyogU2hhZG93IGJsb2NrIHJlZ2lzdGVycyAqLworCVNIRF9QSU9fREFUQV9PRlMJPSAweDEwMCwKKwlTSERfRkVBX0VSUl9PRlMJCT0gMHgxMDQsCisJU0hEX1NFQ1RfQ05UX09GUwk9IDB4MTA4LAorCVNIRF9MQkFfTF9PRlMJCT0gMHgxMEMsCisJU0hEX0xCQV9NX09GUwkJPSAweDExMCwKKwlTSERfTEJBX0hfT0ZTCQk9IDB4MTE0LAorCVNIRF9ERVZfSERfT0ZTCQk9IDB4MTE4LAorCVNIRF9DTURfU1RBX09GUwkJPSAweDExQywKKwlTSERfQ1RMX0FTVF9PRlMJCT0gMHgxMjAsCisKKwkvKiBTQVRBIHJlZ2lzdGVycyAqLworCVNBVEFfU1RBVFVTX09GUwkJPSAweDMwMCwgIC8qIGN0cmwsIGVyciByZWdzIGZvbGxvdyBzdGF0dXMgKi8KKwlTQVRBX0FDVElWRV9PRlMJCT0gMHgzNTAsCisKKwkvKiBQb3J0IHJlZ2lzdGVycyAqLworCUVETUFfQ0ZHX09GUwkJPSAwLAorCisJRURNQV9FUlJfSVJRX0NBVVNFX09GUwk9IDB4OCwKKwlFRE1BX0VSUl9JUlFfTUFTS19PRlMJPSAweGMsCisJRURNQV9FUlJfRF9QQVIJCT0gKDEgPDwgMCksCisJRURNQV9FUlJfUFJEX1BBUgk9ICgxIDw8IDEpLAorCUVETUFfRVJSX0RFVgkJPSAoMSA8PCAyKSwKKwlFRE1BX0VSUl9ERVZfRENPTgk9ICgxIDw8IDMpLAorCUVETUFfRVJSX0RFVl9DT04JPSAoMSA8PCA0KSwKKwlFRE1BX0VSUl9TRVJSCQk9ICgxIDw8IDUpLAorCUVETUFfRVJSX1NFTEZfRElTCT0gKDEgPDwgNyksCisJRURNQV9FUlJfQklTVF9BU1lOQwk9ICgxIDw8IDgpLAorCUVETUFfRVJSX0NSQlFfUEFSCT0gKDEgPDwgOSksCisJRURNQV9FUlJfQ1JQQl9QQVIJPSAoMSA8PCAxMCksCisJRURNQV9FUlJfSU5UUkxfUEFSCT0gKDEgPDwgMTEpLAorCUVETUFfRVJSX0lPUkRZCQk9ICgxIDw8IDEyKSwKKwlFRE1BX0VSUl9MTktfQ1RSTF9SWAk9ICgweGYgPDwgMTMpLAorCUVETUFfRVJSX0xOS19DVFJMX1JYXzIJPSAoMSA8PCAxNSksCisJRURNQV9FUlJfTE5LX0RBVEFfUlgJPSAoMHhmIDw8IDE3KSwKKwlFRE1BX0VSUl9MTktfQ1RSTF9UWAk9ICgweDFmIDw8IDIxKSwKKwlFRE1BX0VSUl9MTktfREFUQV9UWAk9ICgweDFmIDw8IDI2KSwKKwlFRE1BX0VSUl9UUkFOU19QUk9UTwk9ICgxIDw8IDMxKSwKKwlFRE1BX0VSUl9GQVRBTAkJPSAoRURNQV9FUlJfRF9QQVIgfCBFRE1BX0VSUl9QUkRfUEFSIHwgCisJCQkJICAgRURNQV9FUlJfREVWX0RDT04gfCBFRE1BX0VSUl9DUkJRX1BBUiB8CisJCQkJICAgRURNQV9FUlJfQ1JQQl9QQVIgfCBFRE1BX0VSUl9JTlRSTF9QQVIgfAorCQkJCSAgIEVETUFfRVJSX0lPUkRZIHwgRURNQV9FUlJfTE5LX0NUUkxfUlhfMiB8IAorCQkJCSAgIEVETUFfRVJSX0xOS19EQVRBX1JYIHwKKwkJCQkgICBFRE1BX0VSUl9MTktfREFUQV9UWCB8IAorCQkJCSAgIEVETUFfRVJSX1RSQU5TX1BST1RPKSwKKworCUVETUFfQ01EX09GUwkJPSAweDI4LAorCUVETUFfRU4JCQk9ICgxIDw8IDApLAorCUVETUFfRFMJCQk9ICgxIDw8IDEpLAorCUFUQV9SU1QJCQk9ICgxIDw8IDIpLAorCisJLyogQkRNQSBpcyA2eHh4IHBhcnQgb25seSAqLworCUJETUFfQ01EX09GUwkJPSAweDIyNCwKKwlCRE1BX1NUQVJUCQk9ICgxIDw8IDApLAorCisJTVZfVU5ERUYJCT0gMCwKK307CisKK3N0cnVjdCBtdl9wb3J0X3ByaXYgeworCit9OworCitzdHJ1Y3QgbXZfaG9zdF9wcml2IHsKKworfTsKKworc3RhdGljIHZvaWQgbXZfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHUzMiBtdl9zY3JfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnX2luKTsKK3N0YXRpYyB2b2lkIG12X3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnX2luLCB1MzIgdmFsKTsKK3N0YXRpYyB2b2lkIG12X3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyBpbnQgbXZfbWFzdGVyX3Jlc2V0KHZvaWQgX19pb21lbSAqbW1pb19iYXNlKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBtdl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLAorCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgbXZfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIG12X3NodCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlvY3RsCQkJPSBhdGFfc2NzaV9pb2N0bCwKKwkucXVldWVjb21tYW5kCQk9IGF0YV9zY3NpX3F1ZXVlY21kLAorCS5laF9zdHJhdGVneV9oYW5kbGVyCT0gYXRhX3Njc2lfZXJyb3IsCisJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAorCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKKwkuc2dfdGFibGVzaXplCQk9IE1WX1VOREVGLAorCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCisJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCisJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCisJLnVzZV9jbHVzdGVyaW5nCQk9IE1WX1VOREVGLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBNVl9ETUFfQk9VTkRBUlksCisJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLm9yZGVyZWRfZmx1c2gJCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBtdl9vcHMgPSB7CisJLnBvcnRfZGlzYWJsZQkJPSBhdGFfcG9ydF9kaXNhYmxlLAorCisJLnRmX2xvYWQJCT0gYXRhX3RmX2xvYWQsCisJLnRmX3JlYWQJCT0gYXRhX3RmX3JlYWQsCisJLmNoZWNrX3N0YXR1cwkJPSBhdGFfY2hlY2tfc3RhdHVzLAorCS5leGVjX2NvbW1hbmQJCT0gYXRhX2V4ZWNfY29tbWFuZCwKKwkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisKKwkucGh5X3Jlc2V0CQk9IG12X3BoeV9yZXNldCwKKworCS5xY19wcmVwCQk9IGF0YV9xY19wcmVwLAorCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKKworCS5lbmdfdGltZW91dAkJPSBhdGFfZW5nX3RpbWVvdXQsCisKKwkuaXJxX2hhbmRsZXIJCT0gbXZfaW50ZXJydXB0LAorCS5pcnFfY2xlYXIJCT0gbXZfaXJxX2NsZWFyLAorCisJLnNjcl9yZWFkCQk9IG12X3Njcl9yZWFkLAorCS5zY3Jfd3JpdGUJCT0gbXZfc2NyX3dyaXRlLAorCisJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBhdGFfcG9ydF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gYXRhX2hvc3Rfc3RvcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBtdl9wb3J0X2luZm9bXSA9IHsKKwl7ICAvKiBjaGlwXzUwNHggKi8KKwkJLnNodAkJPSAmbXZfc2h0LAorCQkuaG9zdF9mbGFncwk9IChBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgICBBVEFfRkxBR19TQVRBX1JFU0VUIHwgQVRBX0ZMQUdfTU1JTyksCisJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzQtMCAqLworCQkudWRtYV9tYXNrCT0gMCwJLyogMHg3ZiAodWRtYTYtMCBkaXNhYmxlZCBmb3Igbm93KSAqLworCQkucG9ydF9vcHMJPSAmbXZfb3BzLAorCX0sCisJeyAgLyogY2hpcF81MDh4ICovCisJCS5zaHQJCT0gJm12X3NodCwKKwkJLmhvc3RfZmxhZ3MJPSAoQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICAgQVRBX0ZMQUdfU0FUQV9SRVNFVCB8IEFUQV9GTEFHX01NSU8gfCAKKwkJCQkgICBNVl9GTEFHX0RVQUxfSEMpLAorCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW80LTAgKi8KKwkJLnVkbWFfbWFzawk9IDAsCS8qIDB4N2YgKHVkbWE2LTAgZGlzYWJsZWQgZm9yIG5vdykgKi8KKwkJLnBvcnRfb3BzCT0gJm12X29wcywKKwl9LAorCXsgIC8qIGNoaXBfNjA0eCAqLworCQkuc2h0CQk9ICZtdl9zaHQsCisJCS5ob3N0X2ZsYWdzCT0gKEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAorCQkJCSAgIEFUQV9GTEFHX1NBVEFfUkVTRVQgfCBBVEFfRkxBR19NTUlPIHwgCisJCQkJICAgTVZfRkxBR19JUlFfQ09BTEVTQ0UgfCBNVl9GTEFHX0JETUEpLAorCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW80LTAgKi8KKwkJLnVkbWFfbWFzawk9IDAsCS8qIDB4N2YgKHVkbWE2LTAgZGlzYWJsZWQgZm9yIG5vdykgKi8KKwkJLnBvcnRfb3BzCT0gJm12X29wcywKKwl9LAorCXsgIC8qIGNoaXBfNjA4eCAqLworCQkuc2h0CQk9ICZtdl9zaHQsCisJCS5ob3N0X2ZsYWdzCT0gKEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAorCQkJCSAgIEFUQV9GTEFHX1NBVEFfUkVTRVQgfCBBVEFfRkxBR19NTUlPIHwKKwkJCQkgICBNVl9GTEFHX0lSUV9DT0FMRVNDRSB8IE1WX0ZMQUdfRFVBTF9IQyB8CisJCQkJICAgTVZfRkxBR19CRE1BKSwKKwkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvNC0wICovCisJCS51ZG1hX21hc2sJPSAwLAkvKiAweDdmICh1ZG1hNi0wIGRpc2FibGVkIGZvciBub3cpICovCisJCS5wb3J0X29wcwk9ICZtdl9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtdl9wY2lfdGJsW10gPSB7CisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDUwNDApLCAwLCAwLCBjaGlwXzUwNHh9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg1MDQxKSwgMCwgMCwgY2hpcF81MDR4fSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NTA4MCksIDAsIDAsIGNoaXBfNTA4eH0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDUwODEpLCAwLCAwLCBjaGlwXzUwOHh9LAorCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDYwNDApLCAwLCAwLCBjaGlwXzYwNHh9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg2MDQxKSwgMCwgMCwgY2hpcF82MDR4fSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NjA4MCksIDAsIDAsIGNoaXBfNjA4eH0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDYwODEpLCAwLCAwLCBjaGlwXzYwOHh9LAorCXt9CQkJLyogdGVybWluYXRlIGxpc3QgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtdl9wY2lfZHJpdmVyID0geworCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJCT0gbXZfcGNpX3RibCwKKwkucHJvYmUJCQk9IG12X2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVsZmwodW5zaWduZWQgbG9uZyBkYXRhLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJd3JpdGVsKGRhdGEsIGFkZHIpOworCSh2b2lkKSByZWFkbChhZGRyKTsJLyogZmx1c2ggdG8gYXZvaWQgUENJIHBvc3RlZCB3cml0ZSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqbXZfcG9ydF9hZGRyX3RvX2hjX2Jhc2Uodm9pZCBfX2lvbWVtICpwb3J0X21taW8pCit7CisJcmV0dXJuICgodm9pZCBfX2lvbWVtICopKCh1bnNpZ25lZCBsb25nKXBvcnRfbW1pbyAmIAorCQkJCSAodW5zaWduZWQgbG9uZylTQVRBSENfTUFTSykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqbXZfaGNfYmFzZSh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGludCBoYykKK3sKKwlyZXR1cm4gKGJhc2UgKyBNVl9TQVRBSEMwX1JFR19CQVNFICsgKGhjICogTVZfU0FUQUhDX1JFR19TWikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqbXZfcG9ydF9iYXNlKHZvaWQgX19pb21lbSAqYmFzZSwgdW5zaWduZWQgaW50IHBvcnQpCit7CisJcmV0dXJuIChtdl9oY19iYXNlKGJhc2UsIHBvcnQgPj4gTVZfUE9SVF9IQ19TSElGVCkgKworCQlNVl9TQVRBSENfQVJCVFJfUkVHX1NaICsgCisJCSgocG9ydCAmIE1WX1BPUlRfTUFTSykgKiBNVl9QT1JUX1JFR19TWikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqbXZfYXBfYmFzZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXJldHVybiBtdl9wb3J0X2Jhc2UoYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2UsIGFwLT5wb3J0X25vKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXZfZ2V0X2hjX2NvdW50KHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuICgoZmxhZ3MgJiBNVl9GTEFHX0RVQUxfSEMpID8gMiA6IDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdl9pc19lZG1hX2FjdGl2ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gbXZfYXBfYmFzZShhcCk7CisJcmV0dXJuIChFRE1BX0VOICYgcmVhZGwocG9ydF9tbWlvICsgRURNQV9DTURfT0ZTKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12X3BvcnRfYmRtYV9jYXBhYmxlKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJcmV0dXJuIChhcC0+ZmxhZ3MgJiBNVl9GTEFHX0JETUEpOworfQorCitzdGF0aWMgdm9pZCBtdl9pcnFfY2xlYXIoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBtdl9zY3Jfb2Zmc2V0KHVuc2lnbmVkIGludCBzY19yZWdfaW4pCit7CisJdW5zaWduZWQgaW50IG9mczsKKworCXN3aXRjaCAoc2NfcmVnX2luKSB7CisJY2FzZSBTQ1JfU1RBVFVTOgorCWNhc2UgU0NSX0NPTlRST0w6CisJY2FzZSBTQ1JfRVJST1I6CisJCW9mcyA9IFNBVEFfU1RBVFVTX09GUyArIChzY19yZWdfaW4gKiBzaXplb2YodTMyKSk7CisJCWJyZWFrOworCWNhc2UgU0NSX0FDVElWRToKKwkJb2ZzID0gU0FUQV9BQ1RJVkVfT0ZTOyAgIC8qIGFjdGl2ZSBpcyBub3Qgd2l0aCB0aGUgb3RoZXJzICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW9mcyA9IDB4ZmZmZmZmZmZVOworCQlicmVhazsKKwl9CisJcmV0dXJuIG9mczsKK30KKworc3RhdGljIHUzMiBtdl9zY3JfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnX2luKQoreworCXVuc2lnbmVkIGludCBvZnMgPSBtdl9zY3Jfb2Zmc2V0KHNjX3JlZ19pbik7CisKKwlpZiAoMHhmZmZmZmZmZlUgIT0gb2ZzKSB7CisJCXJldHVybiByZWFkbChtdl9hcF9iYXNlKGFwKSArIG9mcyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuICh1MzIpIG9mczsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG12X3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnX2luLCB1MzIgdmFsKQoreworCXVuc2lnbmVkIGludCBvZnMgPSBtdl9zY3Jfb2Zmc2V0KHNjX3JlZ19pbik7CisKKwlpZiAoMHhmZmZmZmZmZlUgIT0gb2ZzKSB7CisJCXdyaXRlbGZsKHZhbCwgbXZfYXBfYmFzZShhcCkgKyBvZnMpOworCX0KK30KKworc3RhdGljIGludCBtdl9tYXN0ZXJfcmVzZXQodm9pZCBfX2lvbWVtICptbWlvX2Jhc2UpCit7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBtbWlvX2Jhc2UgKyBQQ0lfTUFJTl9DTURfU1RTX09GUzsKKwlpbnQgaSwgcmMgPSAwOworCXUzMiB0OworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJLyogRm9sbG93aW5nIHByb2NlZHVyZSBkZWZpbmVkIGluIFBDSSAibWFpbiBjb21tYW5kIGFuZCBzdGF0dXMKKwkgKiByZWdpc3RlciIgdGFibGUuCisJICovCisJdCA9IHJlYWRsKHJlZyk7CisJd3JpdGVsKHQgfCBTVE9QX1BDSV9NQVNURVIsIHJlZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJbXNsZWVwKDEwKTsKKwkJdCA9IHJlYWRsKHJlZyk7CisJCWlmIChQQ0lfTUFTVEVSX0VNUFRZICYgdCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCEoUENJX01BU1RFUl9FTVBUWSAmIHQpKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiUENJIG1hc3RlciB3b24ndCBmbHVzaFxuIik7CisJCXJjID0gMTsJCS8qIGJyb2tlbiBIVz8gKi8KKwkJZ290byBkb25lOworCX0KKworCS8qIHNldCByZXNldCAqLworCWkgPSA1OworCWRvIHsKKwkJd3JpdGVsKHQgfCBHTE9CX1NGVF9SU1QsIHJlZyk7CisJCXQgPSByZWFkbChyZWcpOworCQl1ZGVsYXkoMSk7CisJfSB3aGlsZSAoIShHTE9CX1NGVF9SU1QgJiB0KSAmJiAoaS0tID4gMCkpOworCisJaWYgKCEoR0xPQl9TRlRfUlNUICYgdCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICJjYW4ndCBzZXQgZ2xvYmFsIHJlc2V0XG4iKTsKKwkJcmMgPSAxOwkJLyogYnJva2VuIEhXPyAqLworCQlnb3RvIGRvbmU7CisJfQorCisJLyogY2xlYXIgcmVzZXQgKi8KKwlpID0gNTsKKwlkbyB7CisJCXdyaXRlbCh0ICYgfkdMT0JfU0ZUX1JTVCwgcmVnKTsKKwkJdCA9IHJlYWRsKHJlZyk7CisJCXVkZWxheSgxKTsKKwl9IHdoaWxlICgoR0xPQl9TRlRfUlNUICYgdCkgJiYgKGktLSA+IDApKTsKKworCWlmIChHTE9CX1NGVF9SU1QgJiB0KSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiY2FuJ3QgY2xlYXIgZ2xvYmFsIHJlc2V0XG4iKTsKKwkJcmMgPSAxOwkJLyogYnJva2VuIEhXPyAqLworCX0KKworIGRvbmU6CisJVlBSSU5USygiRVhJVCwgcmMgPSAlaVxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbXZfZXJyX2ludHIoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbzsKKwl1MzIgZWRtYV9lcnJfY2F1c2UsIHNlcnIgPSAwOworCisJLyogYnVnIGhlcmUgYi9jIHdlIGdvdCBhbiBlcnIgaW50IG9uIGEgcG9ydCB3ZSBkb24ndCBrbm93IGFib3V0LAorCSAqIHNvIHRoZXJlJ3Mgbm8gd2F5IHRvIGNsZWFyIGl0CisJICovCisJQlVHX09OKE5VTEwgPT0gYXApOworCXBvcnRfbW1pbyA9IG12X2FwX2Jhc2UoYXApOworCisJZWRtYV9lcnJfY2F1c2UgPSByZWFkbChwb3J0X21taW8gKyBFRE1BX0VSUl9JUlFfQ0FVU0VfT0ZTKTsKKworCWlmIChFRE1BX0VSUl9TRVJSICYgZWRtYV9lcnJfY2F1c2UpIHsKKwkJc2VyciA9IHNjcl9yZWFkKGFwLCBTQ1JfRVJST1IpOworCQlzY3Jfd3JpdGVfZmx1c2goYXAsIFNDUl9FUlJPUiwgc2Vycik7CisJfQorCURQUklOVEsoInBvcnQgJXUgZXJyb3I7IEVETUEgZXJyIGNhdXNlOiAweCUwOHggU0VSUjogMHglMDh4XG4iLCAKKwkJYXAtPnBvcnRfbm8sIGVkbWFfZXJyX2NhdXNlLCBzZXJyKTsKKworCS8qIENsZWFyIEVETUEgbm93IHRoYXQgU0VSUiBjbGVhbnVwIGRvbmUgKi8KKwl3cml0ZWxmbCgwLCBwb3J0X21taW8gKyBFRE1BX0VSUl9JUlFfQ0FVU0VfT0ZTKTsKKworCS8qIGNoZWNrIGZvciBmYXRhbCBoZXJlIGFuZCByZWNvdmVyIGlmIG5lZWRlZCAqLworCWlmIChFRE1BX0VSUl9GQVRBTCAmIGVkbWFfZXJyX2NhdXNlKSB7CisJCW12X3BoeV9yZXNldChhcCk7CisJfQorfQorCisvKiBIYW5kbGUgYW55IG91dHN0YW5kaW5nIGludGVycnVwdHMgaW4gYSBzaW5nbGUgU0FUQUhDIAorICovCitzdGF0aWMgdm9pZCBtdl9ob3N0X2ludHIoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQsIHUzMiByZWxldmFudCwKKwkJCSB1bnNpZ25lZCBpbnQgaGMpCit7CisJdm9pZCBfX2lvbWVtICptbWlvID0gaG9zdF9zZXQtPm1taW9fYmFzZTsKKwl2b2lkIF9faW9tZW0gKmhjX21taW8gPSBtdl9oY19iYXNlKG1taW8sIGhjKTsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJdTMyIGhjX2lycV9jYXVzZTsKKwlpbnQgc2hpZnQsIHBvcnQsIHBvcnQwLCBoYXJkX3BvcnQ7CisJdTggYXRhX3N0YXR1czsKKworCWlmIChoYyA9PSAwKSB7CisJCXBvcnQwID0gMDsKKwl9IGVsc2UgeworCQlwb3J0MCA9IE1WX1BPUlRTX1BFUl9IQzsKKwl9CisKKwkvKiB3ZSdsbCBuZWVkIHRoZSBIQyBzdWNjZXNzIGludCByZWdpc3RlciBpbiBtb3N0IGNhc2VzICovCisJaGNfaXJxX2NhdXNlID0gcmVhZGwoaGNfbW1pbyArIEhDX0lSUV9DQVVTRV9PRlMpOworCWlmIChoY19pcnFfY2F1c2UpIHsKKwkJd3JpdGVsZmwoMCwgaGNfbW1pbyArIEhDX0lSUV9DQVVTRV9PRlMpOworCX0KKworCVZQUklOVEsoIkVOVEVSLCBoYyV1IHJlbGV2YW50PTB4JTA4eCBIQyBJUlEgY2F1c2U9MHglMDh4XG4iLAorCQloYyxyZWxldmFudCxoY19pcnFfY2F1c2UpOworCisJZm9yIChwb3J0ID0gcG9ydDA7IHBvcnQgPCBwb3J0MCArIE1WX1BPUlRTX1BFUl9IQzsgcG9ydCsrKSB7CisJCWFwID0gaG9zdF9zZXQtPnBvcnRzW3BvcnRdOworCQloYXJkX3BvcnQgPSBwb3J0ICYgTVZfUE9SVF9NQVNLOwkvKiByYW5nZSAwLTMgKi8KKwkJYXRhX3N0YXR1cyA9IDB4ZmZVOworCisJCWlmICgoKENSQlBfRE1BX0RPTkUgfCBERVZfSVJRKSA8PCBoYXJkX3BvcnQpICYgaGNfaXJxX2NhdXNlKSB7CisJCQlCVUdfT04oTlVMTCA9PSBhcCk7CisJCQkvKiByY3YnZCBuZXcgcmVzcCwgYmFzaWMgRE1BIGNvbXBsZXRlLCBvciBBVEEgSVJRICovCisJCQkvKiBUaGlzIGlzIG5lZWRlZCB0byBjbGVhciB0aGUgQVRBIElOVFJRLgorCQkJICogRklYTUU6IGRvbid0IHJlYWQgdGhlIHN0YXR1cyByZWcgaW4gRURNQSBtb2RlIQorCQkJICovCisJCQlhdGFfc3RhdHVzID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKQorCQkJCQkgICBhcC0+aW9hZGRyLnN0YXR1c19hZGRyKTsKKwkJfQorCisJCXNoaWZ0ID0gcG9ydCAqIDI7CisJCWlmIChwb3J0ID49IE1WX1BPUlRTX1BFUl9IQykgeworCQkJc2hpZnQrKzsJLyogc2tpcCBiaXQgOCBpbiB0aGUgSEMgTWFpbiBJUlEgcmVnICovCisJCX0KKwkJaWYgKChQT1JUMF9FUlIgPDwgc2hpZnQpICYgcmVsZXZhbnQpIHsKKwkJCW12X2Vycl9pbnRyKGFwKTsKKwkJCS8qIEZJWE1FOiBzbWFydCB0byBPUiBpbiBBVEFfRVJSPyAqLworCQkJYXRhX3N0YXR1cyA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKikKKwkJCQkJICAgYXAtPmlvYWRkci5zdGF0dXNfYWRkcikgfCBBVEFfRVJSOworCQl9CisJCQorCQlpZiAoYXApIHsKKwkJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7CisJCQlpZiAoTlVMTCAhPSBxYykgeworCQkJCVZQUklOVEsoInBvcnQgJXUgSVJRIGZvdW5kIGZvciBxYywgIgorCQkJCQkiYXRhX3N0YXR1cyAweCV4XG4iLCBwb3J0LGF0YV9zdGF0dXMpOworCQkJCUJVR19PTigweGZmVSA9PSBhdGFfc3RhdHVzKTsKKwkJCQkvKiBtYXJrIHFjIHN0YXR1cyBhcHByb3ByaWF0ZWx5ICovCisJCQkJYXRhX3FjX2NvbXBsZXRlKHFjLCBhdGFfc3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKwlWUFJJTlRLKCJFWElUXG4iKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG12X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBkZXZfaW5zdGFuY2U7CisJdW5zaWduZWQgaW50IGhjLCBoYW5kbGVkID0gMCwgbl9oY3M7CisJdm9pZCBfX2lvbWVtICptbWlvOworCXUzMiBpcnFfc3RhdDsKKworCW1taW8gPSBob3N0X3NldC0+bW1pb19iYXNlOworCWlycV9zdGF0ID0gcmVhZGwobW1pbyArIEhDX01BSU5fSVJRX0NBVVNFX09GUyk7CisJbl9oY3MgPSBtdl9nZXRfaGNfY291bnQoaG9zdF9zZXQtPnBvcnRzWzBdLT5mbGFncyk7CisKKwkvKiBjaGVjayB0aGUgY2FzZXMgd2hlcmUgd2UgZWl0aGVyIGhhdmUgbm90aGluZyBwZW5kaW5nIG9yIGhhdmUgcmVhZAorCSAqIGEgYm9ndXMgcmVnaXN0ZXIgdmFsdWUgd2hpY2ggY2FuIGluZGljYXRlIEhXIHJlbW92YWwgb3IgUENJIGZhdWx0CisJICovCisJaWYgKCFpcnFfc3RhdCB8fCAoMHhmZmZmZmZmZlUgPT0gaXJxX3N0YXQpKSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlzcGluX2xvY2soJmhvc3Rfc2V0LT5sb2NrKTsKKworCWZvciAoaGMgPSAwOyBoYyA8IG5faGNzOyBoYysrKSB7CisJCXUzMiByZWxldmFudCA9IGlycV9zdGF0ICYgKEhDMF9JUlFfUEVORCA8PCAoaGMgKiBIQ19TSElGVCkpOworCQlpZiAocmVsZXZhbnQpIHsKKwkJCW12X2hvc3RfaW50cihob3N0X3NldCwgcmVsZXZhbnQsIGhjKTsKKwkJCWhhbmRsZWQgPSAxOworCQl9CisJfQorCWlmIChQQ0lfRVJSICYgaXJxX3N0YXQpIHsKKwkJLyogRklYTUU6IHRoZXNlIGFyZSBhbGwgbWFza2VkIGJ5IGRlZmF1bHQsIGJ1dCBzdGlsbCBuZWVkCisJCSAqIHRvIHJlY292ZXIgZnJvbSB0aGVtIHByb3Blcmx5LgorCQkgKi8KKwl9CisKKwlzcGluX3VubG9jaygmaG9zdF9zZXQtPmxvY2spOworCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIG12X3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gbXZfYXBfYmFzZShhcCk7CisJc3RydWN0IGF0YV90YXNrZmlsZSB0ZjsKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gJmFwLT5kZXZpY2VbMF07CisJdTMyIGVkbWEgPSAwLCBiZG1hOworCisJVlBSSU5USygiRU5URVIsIHBvcnQgJXUsIG1taW8gMHglcFxuIiwgYXAtPnBvcnRfbm8sIHBvcnRfbW1pbyk7CisKKwllZG1hID0gcmVhZGwocG9ydF9tbWlvICsgRURNQV9DTURfT0ZTKTsKKwlpZiAoRURNQV9FTiAmIGVkbWEpIHsKKwkJLyogZGlzYWJsZSBFRE1BIGlmIGFjdGl2ZSAqLworCQllZG1hICY9IH5FRE1BX0VOOworCQl3cml0ZWxmbChlZG1hIHwgRURNQV9EUywgcG9ydF9tbWlvICsgRURNQV9DTURfT0ZTKTsKKwkJdWRlbGF5KDEpOworCX0gZWxzZSBpZiAobXZfcG9ydF9iZG1hX2NhcGFibGUoYXApICYmCisJCSAgIChiZG1hID0gcmVhZGwocG9ydF9tbWlvICsgQkRNQV9DTURfT0ZTKSkgJiBCRE1BX1NUQVJUKSB7CisJCS8qIGRpc2FibGUgQkRNQSBpZiBhY3RpdmUgKi8KKwkJd3JpdGVsZmwoYmRtYSAmIH5CRE1BX1NUQVJULCBwb3J0X21taW8gKyBCRE1BX0NNRF9PRlMpOworCX0KKworCXdyaXRlbGZsKGVkbWEgfCBBVEFfUlNULCBwb3J0X21taW8gKyBFRE1BX0NNRF9PRlMpOworCXVkZWxheSgyNSk7CQkvKiBhbGxvdyByZXNldCBwcm9wYWdhdGlvbiAqLworCisJLyogU3BlYyBuZXZlciBtZW50aW9ucyBjbGVhcmluZyB0aGUgYml0LiAgTWFydmVsbCdzIGRyaXZlciBkb2VzCisJICogY2xlYXIgdGhlIGJpdCwgaG93ZXZlci4KKwkgKi8KKwl3cml0ZWxmbChlZG1hICYgfkFUQV9SU1QsIHBvcnRfbW1pbyArIEVETUFfQ01EX09GUyk7CisKKwlWUFJJTlRLKCJEb25lLiAgTm93IGNhbGxpbmcgX19zYXRhX3BoeV9yZXNldCgpXG4iKTsKKworCS8qIHByb2NlZWQgdG8gaW5pdCBjb21tdW5pY2F0aW9ucyB2aWEgdGhlIHNjcl9jb250cm9sIHJlZyAqLworCV9fc2F0YV9waHlfcmVzZXQoYXApOworCisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpIHsKKwkJVlBSSU5USygiUG9ydCBkaXNhYmxlZCBwcmUtc2lnLiAgRXhpdGluZy5cbiIpOworCQlyZXR1cm47CisJfQorCisJdGYubGJhaCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5sYmFoX2FkZHIpOworCXRmLmxiYW0gPSByZWFkYigodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIubGJhbV9hZGRyKTsKKwl0Zi5sYmFsID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLmxiYWxfYWRkcik7CisJdGYubnNlY3QgPSByZWFkYigodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIubnNlY3RfYWRkcik7CisKKwlkZXYtPmNsYXNzID0gYXRhX2Rldl9jbGFzc2lmeSgmdGYpOworCWlmICghYXRhX2Rldl9wcmVzZW50KGRldikpIHsKKwkJVlBSSU5USygiUG9ydCBkaXNhYmxlZCBwb3N0LXNpZzogTm8gZGV2aWNlIHByZXNlbnQuXG4iKTsKKwkJYXRhX3BvcnRfZGlzYWJsZShhcCk7CisJfQorCVZQUklOVEsoIkVYSVRcbiIpOworfQorCitzdGF0aWMgdm9pZCBtdl9wb3J0X2luaXQoc3RydWN0IGF0YV9pb3BvcnRzICpwb3J0LCB1bnNpZ25lZCBsb25nIGJhc2UpCit7CisJLyogUElPIHJlbGF0ZWQgc2V0dXAgKi8KKwlwb3J0LT5kYXRhX2FkZHIgPSBiYXNlICsgU0hEX1BJT19EQVRBX09GUzsKKwlwb3J0LT5lcnJvcl9hZGRyID0gcG9ydC0+ZmVhdHVyZV9hZGRyID0gYmFzZSArIFNIRF9GRUFfRVJSX09GUzsKKwlwb3J0LT5uc2VjdF9hZGRyID0gYmFzZSArIFNIRF9TRUNUX0NOVF9PRlM7CisJcG9ydC0+bGJhbF9hZGRyID0gYmFzZSArIFNIRF9MQkFfTF9PRlM7CisJcG9ydC0+bGJhbV9hZGRyID0gYmFzZSArIFNIRF9MQkFfTV9PRlM7CisJcG9ydC0+bGJhaF9hZGRyID0gYmFzZSArIFNIRF9MQkFfSF9PRlM7CisJcG9ydC0+ZGV2aWNlX2FkZHIgPSBiYXNlICsgU0hEX0RFVl9IRF9PRlM7CisJcG9ydC0+c3RhdHVzX2FkZHIgPSBwb3J0LT5jb21tYW5kX2FkZHIgPSBiYXNlICsgU0hEX0NNRF9TVEFfT0ZTOworCXBvcnQtPmFsdHN0YXR1c19hZGRyID0gcG9ydC0+Y3RsX2FkZHIgPSBiYXNlICsgU0hEX0NUTF9BU1RfT0ZTOworCS8qIHVudXNlZCAqLworCXBvcnQtPmNtZF9hZGRyID0gcG9ydC0+Ym1kbWFfYWRkciA9IHBvcnQtPnNjcl9hZGRyID0gMDsKKworCS8qIHVubWFzayBhbGwgRURNQSBlcnJvciBpbnRlcnJ1cHRzICovCisJd3JpdGVsKH4wLCAodm9pZCBfX2lvbWVtICopYmFzZSArIEVETUFfRVJSX0lSUV9NQVNLX09GUyk7CisKKwlWUFJJTlRLKCJFRE1BIGNmZz0weCUwOHggRURNQSBJUlEgZXJyIGNhdXNlL21hc2s9MHglMDh4LzB4JTA4eFxuIiwgCisJCXJlYWRsKCh2b2lkIF9faW9tZW0gKiliYXNlICsgRURNQV9DRkdfT0ZTKSwKKwkJcmVhZGwoKHZvaWQgX19pb21lbSAqKWJhc2UgKyBFRE1BX0VSUl9JUlFfQ0FVU0VfT0ZTKSwKKwkJcmVhZGwoKHZvaWQgX19pb21lbSAqKWJhc2UgKyBFRE1BX0VSUl9JUlFfTUFTS19PRlMpKTsKK30KKworc3RhdGljIGludCBtdl9ob3N0X2luaXQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCkKK3sKKwlpbnQgcmMgPSAwLCBuX2hjLCBwb3J0LCBoYzsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBwcm9iZV9lbnQtPm1taW9fYmFzZTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbzsKKworCWlmIChtdl9tYXN0ZXJfcmVzZXQocHJvYmVfZW50LT5tbWlvX2Jhc2UpKSB7CisJCXJjID0gMTsKKwkJZ290byBkb25lOworCX0KKworCW5faGMgPSBtdl9nZXRfaGNfY291bnQocHJvYmVfZW50LT5ob3N0X2ZsYWdzKTsKKwlwcm9iZV9lbnQtPm5fcG9ydHMgPSBNVl9QT1JUU19QRVJfSEMgKiBuX2hjOworCisJZm9yIChwb3J0ID0gMDsgcG9ydCA8IHByb2JlX2VudC0+bl9wb3J0czsgcG9ydCsrKSB7CisJCXBvcnRfbW1pbyA9IG12X3BvcnRfYmFzZShtbWlvLCBwb3J0KTsKKwkJbXZfcG9ydF9pbml0KCZwcm9iZV9lbnQtPnBvcnRbcG9ydF0sICh1bnNpZ25lZCBsb25nKXBvcnRfbW1pbyk7CisJfQorCisJZm9yIChoYyA9IDA7IGhjIDwgbl9oYzsgaGMrKykgeworCQlWUFJJTlRLKCJIQyVpOiBIQyBjb25maWc9MHglMDh4IEhDIElSUSBjYXVzZT0weCUwOHhcbiIsIGhjLAorCQkJcmVhZGwobXZfaGNfYmFzZShtbWlvLCBoYykgKyBIQ19DRkdfT0ZTKSwKKwkJCXJlYWRsKG12X2hjX2Jhc2UobW1pbywgaGMpICsgSENfSVJRX0NBVVNFX09GUykpOworCX0KKworCXdyaXRlbCh+SENfTUFJTl9NQVNLRURfSVJRUywgbW1pbyArIEhDX01BSU5fSVJRX01BU0tfT0ZTKTsKKwl3cml0ZWwoUENJX1VOTUFTS19BTExfSVJRUywgbW1pbyArIFBDSV9JUlFfTUFTS19PRlMpOworCisJVlBSSU5USygiSEMgTUFJTiBJUlEgY2F1c2UvbWFzaz0weCUwOHgvMHglMDh4ICIKKwkJIlBDSSBpbnQgY2F1c2UvbWFzaz0weCUwOHgvMHglMDh4XG4iLCAKKwkJcmVhZGwobW1pbyArIEhDX01BSU5fSVJRX0NBVVNFX09GUyksCisJCXJlYWRsKG1taW8gKyBIQ19NQUlOX0lSUV9NQVNLX09GUyksCisJCXJlYWRsKG1taW8gKyBQQ0lfSVJRX0NBVVNFX09GUyksCisJCXJlYWRsKG1taW8gKyBQQ0lfSVJRX01BU0tfT0ZTKSk7CisKKyBkb25lOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtdl9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbiA9IDA7CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CisJc3RydWN0IG12X2hvc3RfcHJpdiAqaHByaXY7CisJdW5zaWduZWQgaW50IGJvYXJkX2lkeCA9ICh1bnNpZ25lZCBpbnQpZW50LT5kcml2ZXJfZGF0YTsKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZTsKKwlpbnQgcGNpX2Rldl9idXN5ID0gMDsKKwlpbnQgcmM7CisKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKSB7CisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCX0KKworCVZQUklOVEsoIkVOVEVSIGZvciBQQ0kgQnVzOlNsb3QuRnVuYz0ldToldS4ldVxuIiwgcGRldi0+YnVzLT5udW1iZXIsCisJCVBDSV9TTE9UKHBkZXYtPmRldmZuKSwgUENJX0ZVTkMocGRldi0+ZGV2Zm4pKTsKKworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKSB7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyYykgeworCQlwY2lfZGV2X2J1c3kgPSAxOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcGNpX2ludHgocGRldiwgMSk7CisKKwlwcm9iZV9lbnQgPSBrbWFsbG9jKHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByb2JlX2VudCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCisJbWVtc2V0KHByb2JlX2VudCwgMCwgc2l6ZW9mKCpwcm9iZV9lbnQpKTsKKwlwcm9iZV9lbnQtPmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOworCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOworCisJbW1pb19iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBNVl9QUklNQVJZX0JBUiksCisJCQkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgTVZfUFJJTUFSWV9CQVIpKTsKKwlpZiAobW1pb19iYXNlID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9lbnQ7CisJfQorCisJaHByaXYgPSBrbWFsbG9jKHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhwcml2KSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCW1lbXNldChocHJpdiwgMCwgc2l6ZW9mKCpocHJpdikpOworCisJcHJvYmVfZW50LT5zaHQgPSBtdl9wb3J0X2luZm9bYm9hcmRfaWR4XS5zaHQ7CisJcHJvYmVfZW50LT5ob3N0X2ZsYWdzID0gbXZfcG9ydF9pbmZvW2JvYXJkX2lkeF0uaG9zdF9mbGFnczsKKwlwcm9iZV9lbnQtPnBpb19tYXNrID0gbXZfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucGlvX21hc2s7CisJcHJvYmVfZW50LT51ZG1hX21hc2sgPSBtdl9wb3J0X2luZm9bYm9hcmRfaWR4XS51ZG1hX21hc2s7CisJcHJvYmVfZW50LT5wb3J0X29wcyA9IG12X3BvcnRfaW5mb1tib2FyZF9pZHhdLnBvcnRfb3BzOworCisJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7CisJcHJvYmVfZW50LT5pcnFfZmxhZ3MgPSBTQV9TSElSUTsKKwlwcm9iZV9lbnQtPm1taW9fYmFzZSA9IG1taW9fYmFzZTsKKwlwcm9iZV9lbnQtPnByaXZhdGVfZGF0YSA9IGhwcml2OworCisJLyogaW5pdGlhbGl6ZSBhZGFwdGVyICovCisJcmMgPSBtdl9ob3N0X2luaXQocHJvYmVfZW50KTsKKwlpZiAocmMpIHsKKwkJZ290byBlcnJfb3V0X2hwcml2OworCX0KKy8qIAltdl9wcmludF9pbmZvKHByb2JlX2VudCk7ICovCisKKwl7CisJCWludCBiLCB3OworCQl1MzIgZHdbNF07CS8qIGhvbGQgYSBsaW5lIG9mIDE2YiAqLworCQlWUFJJTlRLKCJQQ0kgY29uZmlnIHNwYWNlOlxuIik7CisJCWZvciAoYiA9IDA7IGIgPCAweDQwOyApIHsKKwkJCWZvciAodyA9IDA7IHcgPCA0OyB3KyspIHsKKwkJCQkodm9pZCkgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsYiwmZHdbd10pOworCQkJCWIgKz0gc2l6ZW9mKCpkdyk7CisJCQl9CisJCQlWUFJJTlRLKCIlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAorCQkJCWR3WzBdLGR3WzFdLGR3WzJdLGR3WzNdKTsKKwkJfQorCX0KKworCS8qIEZJWE1FOiBjaGVjayBhdGFfZGV2aWNlX2FkZCByZXR1cm4gdmFsdWUgKi8KKwlhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpOworCWtmcmVlKHByb2JlX2VudCk7CisKKwlyZXR1cm4gMDsKKworIGVycl9vdXRfaHByaXY6CisJa2ZyZWUoaHByaXYpOworIGVycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKG1taW9fYmFzZSk7CisgZXJyX291dF9mcmVlX2VudDoKKwlrZnJlZShwcm9iZV9lbnQpOworIGVycl9vdXRfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworIGVycl9vdXQ6CisJaWYgKCFwY2lfZGV2X2J1c3kpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2luaXQgbXZfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJm12X3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbXZfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbXZfcGNpX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkJyZXR0IFJ1c3MiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0NTSSBsb3ctbGV2ZWwgZHJpdmVyIGZvciBNYXJ2ZWxsIFNBVEEgY29udHJvbGxlcnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtdl9wY2lfdGJsKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX2luaXQobXZfaW5pdCk7Cittb2R1bGVfZXhpdChtdl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX252LmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9udi5jCmluZGV4IDAzZDliYzYuLmExZDYyZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zYXRhX252LmMKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfbnYuYwpAQCAtMzUxLDYgKzM1MSw3IEBACiBzdGF0aWMgdm9pZCBudl9ob3N0X3N0b3AgKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQogewogCXN0cnVjdCBudl9ob3N0ICpob3N0ID0gaG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaG9zdF9zZXQtPmRldik7CiAKIAkvLyBEaXNhYmxlIGhvdHBsdWcgZXZlbnQgaW50ZXJydXB0cy4KIAlpZiAoaG9zdC0+aG9zdF9kZXNjLT5kaXNhYmxlX2hvdHBsdWcpCkBAIC0zNTgsNyArMzU5LDggQEAKIAogCWtmcmVlKGhvc3QpOwogCi0JYXRhX2hvc3Rfc3RvcChob3N0X3NldCk7CisJaWYgKGhvc3Rfc2V0LT5tbWlvX2Jhc2UpCisJCXBjaV9pb3VubWFwKHBkZXYsIGhvc3Rfc2V0LT5tbWlvX2Jhc2UpOwogfQogCiBzdGF0aWMgaW50IG52X2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKQEAgLTQyMCw4ICs0MjIsNyBAQAogCWlmIChob3N0LT5ob3N0X2ZsYWdzICYgTlZfSE9TVF9GTEFHU19TQ1JfTU1JTykgewogCQl1bnNpZ25lZCBsb25nIGJhc2U7CiAKLQkJcHJvYmVfZW50LT5tbWlvX2Jhc2UgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA1KSwKLQkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDUpKTsKKwkJcHJvYmVfZW50LT5tbWlvX2Jhc2UgPSBwY2lfaW9tYXAocGRldiwgNSwgMCk7CiAJCWlmIChwcm9iZV9lbnQtPm1taW9fYmFzZSA9PSBOVUxMKSB7CiAJCQlyYyA9IC1FSU87CiAJCQlnb3RvIGVycl9vdXRfZnJlZV9ob3N0OwpAQCAtNDU3LDcgKzQ1OCw3IEBACiAKIGVycl9vdXRfaW91bm1hcDoKIAlpZiAoaG9zdC0+aG9zdF9mbGFncyAmIE5WX0hPU1RfRkxBR1NfU0NSX01NSU8pCi0JCWlvdW5tYXAocHJvYmVfZW50LT5tbWlvX2Jhc2UpOworCQlwY2lfaW91bm1hcChwZGV2LCBwcm9iZV9lbnQtPm1taW9fYmFzZSk7CiBlcnJfb3V0X2ZyZWVfaG9zdDoKIAlrZnJlZShob3N0KTsKIGVycl9vdXRfZnJlZV9lbnQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9wcm9taXNlLmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9wcm9taXNlLmMKaW5kZXggN2M0ZjZlYy4uNTM4YWQ3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NhdGFfcHJvbWlzZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3Byb21pc2UuYwpAQCAtOTIsNiArOTIsNyBAQAogc3RhdGljIHZvaWQgcGRjX2lycV9jbGVhcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyBpbnQgcGRjX3FjX2lzc3VlX3Byb3Qoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiAKKwogc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBwZGNfYXRhX3NodCA9IHsKIAkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJCT0gRFJWX05BTUUsCkBAIC0xMzIsNyArMTMzLDcgQEAKIAkuc2NyX3dyaXRlCQk9IHBkY19zYXRhX3Njcl93cml0ZSwKIAkucG9ydF9zdGFydAkJPSBwZGNfcG9ydF9zdGFydCwKIAkucG9ydF9zdG9wCQk9IHBkY19wb3J0X3N0b3AsCi0JLmhvc3Rfc3RvcAkJPSBhdGFfaG9zdF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gYXRhX3BjaV9ob3N0X3N0b3AsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGRjX3BhdGFfb3BzID0gewpAQCAtMTUzLDcgKzE1NCw3IEBACiAKIAkucG9ydF9zdGFydAkJPSBwZGNfcG9ydF9zdGFydCwKIAkucG9ydF9zdG9wCQk9IHBkY19wb3J0X3N0b3AsCi0JLmhvc3Rfc3RvcAkJPSBhdGFfaG9zdF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gYXRhX3BjaV9ob3N0X3N0b3AsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gcGRjX3BvcnRfaW5mb1tdID0gewpAQCAtMjgyLDcgKzI4Myw3IEBACiAKIHN0YXRpYyB2b2lkIHBkY19yZXNldF9wb3J0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0Jdm9pZCAqbW1pbyA9ICh2b2lkICopIGFwLT5pb2FkZHIuY21kX2FkZHIgKyBQRENfQ1RMU1RBVDsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSAodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuY21kX2FkZHIgKyBQRENfQ1RMU1RBVDsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgdG1wOwogCkBAIC00MTgsNyArNDE5LDcgQEAKIAl1OCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwLCBoYXZlX2VyciA9IDA7CiAJdTMyIHRtcDsKLQl2b2lkICptbWlvID0gKHZvaWQgKikgYXAtPmlvYWRkci5jbWRfYWRkciArIFBEQ19HTE9CQUxfQ1RMOworCXZvaWQgX19pb21lbSAqbW1pbyA9ICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5jbWRfYWRkciArIFBEQ19HTE9CQUxfQ1RMOwogCiAJdG1wID0gcmVhZGwobW1pbyk7CiAJaWYgKHRtcCAmIFBEQ19FUlJfTUFTSykgewpAQCAtNDQ3LDcgKzQ0OCw3IEBACiBzdGF0aWMgdm9pZCBwZGNfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBhcC0+aG9zdF9zZXQ7Ci0Jdm9pZCAqbW1pbyA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtICptbWlvID0gaG9zdF9zZXQtPm1taW9fYmFzZTsKIAogCXJlYWRsKG1taW8gKyBQRENfSU5UX1NFUU1BU0spOwogfQpAQCAtNDU5LDcgKzQ2MCw3IEBACiAJdTMyIG1hc2sgPSAwOwogCXVuc2lnbmVkIGludCBpLCB0bXA7CiAJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwOwotCXZvaWQgKm1taW9fYmFzZTsKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZTsKIAogCVZQUklOVEsoIkVOVEVSXG4iKTsKIApAQCAtNTgxLDcgKzU4Miw3IEBACiAKIHN0YXRpYyB2b2lkIHBkY19ob3N0X2luaXQodW5zaWduZWQgaW50IGNoaXBfaWQsIHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSkKIHsKLQl2b2lkICptbWlvID0gcGUtPm1taW9fYmFzZTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBwZS0+bW1pb19iYXNlOwogCXUzMiB0bXA7CiAKIAkvKgpAQCAtNjI0LDcgKzYyNSw3IEBACiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBiYXNlOwotCXZvaWQgKm1taW9fYmFzZTsKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZTsKIAl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4ID0gKHVuc2lnbmVkIGludCkgZW50LT5kcml2ZXJfZGF0YTsKIAlpbnQgcGNpX2Rldl9idXN5ID0gMDsKIAlpbnQgcmM7CkBAIC02NjMsOCArNjY0LDcgQEAKIAlwcm9iZV9lbnQtPmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOwogCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOwogCi0JbW1pb19iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyksCi0JCSAgICAgICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMykpOworCW1taW9fYmFzZSA9IHBjaV9pb21hcChwZGV2LCAzLCAwKTsKIAlpZiAobW1pb19iYXNlID09IE5VTEwpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9vdXRfZnJlZV9lbnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9xc3Rvci5jIGIvZHJpdmVycy9zY3NpL3NhdGFfcXN0b3IuYwppbmRleCA5Yzk5YWI0Li5mZmNkZWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2F0YV9xc3Rvci5jCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3FzdG9yLmMKQEAgLTQ5NCw3ICs0OTQsNyBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCXFzX2VudGVyX3JlZ19tb2RlKGFwKTsKLQlwcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpwcCksIEdGUF9LRVJORUwpOworCXBwID0ga3phbGxvYyhzaXplb2YoKnBwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcCkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dDsKQEAgLTUzOCwxMSArNTM4LDEyIEBACiBzdGF0aWMgdm9pZCBxc19ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpCiB7CiAJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UgPSBob3N0X3NldC0+bW1pb19iYXNlOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihob3N0X3NldC0+ZGV2KTsKIAogCXdyaXRlYigwLCBtbWlvX2Jhc2UgKyBRU19IQ1RfQ1RSTCk7IC8qIGRpc2FibGUgaG9zdCBpbnRlcnJ1cHRzICovCiAJd3JpdGViKFFTX0NORkczX0dTUlNULCBtbWlvX2Jhc2UgKyBRU19IQ0ZfQ05GRzMpOyAvKiBnbG9iYWwgcmVzZXQgKi8KIAotCWF0YV9ob3N0X3N0b3AoaG9zdF9zZXQpOworCXBjaV9pb3VubWFwKHBkZXYsIG1taW9fYmFzZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHFzX2hvc3RfaW5pdCh1bnNpZ25lZCBpbnQgY2hpcF9pZCwgc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQpAQCAtNjQ2LDggKzY0Nyw3IEBACiAJCWdvdG8gZXJyX291dF9yZWdpb25zOwogCX0KIAotCW1taW9fYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpLAotCQkgICAgICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDQpKTsKKwltbWlvX2Jhc2UgPSBwY2lfaW9tYXAocGRldiwgNCwgMCk7CiAJaWYgKG1taW9fYmFzZSA9PSBOVUxMKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CkBAIC02OTcsNyArNjk3LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyX291dF9pb3VubWFwOgotCWlvdW5tYXAobW1pb19iYXNlKTsKKwlwY2lfaW91bm1hcChwZGV2LCBtbWlvX2Jhc2UpOwogZXJyX291dF9yZWdpb25zOgogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiBlcnJfb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfc2lsLmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9zaWwuYwppbmRleCA3MWQ0OTU0Li5iYTk4YTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2F0YV9zaWwuYworKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9zaWwuYwpAQCAtODYsNiArODYsNyBAQAogc3RhdGljIHZvaWQgc2lsX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CiBzdGF0aWMgdm9pZCBzaWxfcG9zdF9zZXRfbW9kZSAoc3RydWN0IGF0YV9wb3J0ICphcCk7CiAKKwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNpbF9wY2lfdGJsW10gPSB7CiAJeyAweDEwOTUsIDB4MzExMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgc2lsXzMxMTJfbTE1dyB9LAogCXsgMHgxMDk1LCAweDAyNDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHNpbF8zMTEyX20xNXcgfSwKQEAgLTE3Miw3ICsxNzMsNyBAQAogCS5zY3Jfd3JpdGUJCT0gc2lsX3Njcl93cml0ZSwKIAkucG9ydF9zdGFydAkJPSBhdGFfcG9ydF9zdGFydCwKIAkucG9ydF9zdG9wCQk9IGF0YV9wb3J0X3N0b3AsCi0JLmhvc3Rfc3RvcAkJPSBhdGFfaG9zdF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gYXRhX3BjaV9ob3N0X3N0b3AsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lsX3BvcnRfaW5mb1tdID0gewpAQCAtMjMxLDYgKzIzMiw3IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2lsX3BjaV90YmwpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwogCisKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHNpbF9nZXRfZGV2aWNlX2NhY2hlX2xpbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJdTggY2FjaGVfbGluZSA9IDA7CkBAIC0yNDIsNyArMjQ0LDggQEAKIHsKIAlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCA9IGFwLT5ob3N0X3NldDsKIAlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwotCXZvaWQgKmFkZHIgPSBob3N0X3NldC0+bW1pb19iYXNlICsgc2lsX3BvcnRbYXAtPnBvcnRfbm9dLnhmZXJfbW9kZTsKKwl2b2lkIF9faW9tZW0gKmFkZHIgPQorCQlob3N0X3NldC0+bW1pb19iYXNlICsgc2lsX3BvcnRbYXAtPnBvcnRfbm9dLnhmZXJfbW9kZTsKIAl1MzIgdG1wLCBkZXZfbW9kZVsyXTsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtMzc1LDcgKzM3OCw3IEBACiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBiYXNlOwotCXZvaWQgKm1taW9fYmFzZTsKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZTsKIAlpbnQgcmM7CiAJdW5zaWduZWQgaW50IGk7CiAJaW50IHBjaV9kZXZfYnVzeSA9IDA7CkBAIC00MjUsOCArNDI4LDcgQEAKICAgICAgICAJcHJvYmVfZW50LT5pcnFfZmxhZ3MgPSBTQV9TSElSUTsKIAlwcm9iZV9lbnQtPmhvc3RfZmxhZ3MgPSBzaWxfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLmhvc3RfZmxhZ3M7CiAKLQltbWlvX2Jhc2UgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA1KSwKLQkJICAgICAgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCA1KSk7CisJbW1pb19iYXNlID0gcGNpX2lvbWFwKHBkZXYsIDUsIDApOwogCWlmIChtbWlvX2Jhc2UgPT0gTlVMTCkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dF9mcmVlX2VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3Npcy5jIGIvZHJpdmVycy9zY3NpL3NhdGFfc2lzLmMKaW5kZXggNDNhZjQ0NS4uYTYzZjkzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NhdGFfc2lzLmMKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfc2lzLmMKQEAgLTUyLDcgKzUyLDEwIEBACiAJLyogUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCiAJU0lTX0dFTkNUTAkJPSAweDU0LCAvKiBJREUgR2VuZXJhbCBDb250cm9sIHJlZ2lzdGVyICovCiAJU0lTX1NDUl9CQVNFCQk9IDB4YzAsIC8qIHNhdGEwIHBoeSBTQ1IgcmVnaXN0ZXJzICovCi0JU0lTX1NBVEExX09GUwkJPSAweDEwLCAvKiBvZmZzZXQgZnJvbSBzYXRhMC0+c2F0YTEgcGh5IHJlZ3MgKi8KKwlTSVMxODBfU0FUQTFfT0ZTCT0gMHgxMCwgLyogb2Zmc2V0IGZyb20gc2F0YTAtPnNhdGExIHBoeSByZWdzICovCisJU0lTMTgyX1NBVEExX09GUwk9IDB4MjAsIC8qIG9mZnNldCBmcm9tIHNhdGEwLT5zYXRhMSBwaHkgcmVncyAqLworCVNJU19QTVIJCQk9IDB4OTAsIC8qIHBvcnQgbWFwcGluZyByZWdpc3RlciAqLworCVNJU19QTVJfQ09NQklORUQJPSAweDMwLAogCiAJLyogcmFuZG9tIGJpdHMgKi8KIAlTSVNfRkxBR19DRkdTQ1IJCT0gKDEgPDwgMzApLCAvKiBob3N0IGZsYWc6IFNDUnMgdmlhIFBDSSBjZmcgKi8KQEAgLTY3LDYgKzcwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzaXNfcGNpX3RibFtdID0gewogCXsgUENJX1ZFTkRPUl9JRF9TSSwgMHgxODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHNpc18xODAgfSwKIAl7IFBDSV9WRU5ET1JfSURfU0ksIDB4MTgxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBzaXNfMTgwIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NJLCAweDE4MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgc2lzXzE4MCB9LAogCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogfTsKIApAQCAtMTM5LDY3ICsxNDMsOTUgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzaXNfcGNpX3RibCk7CiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3Njcl9jZmdfYWRkcih1bnNpZ25lZCBpbnQgcG9ydF9ubywgdW5zaWduZWQgaW50IHNjX3JlZykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3Njcl9jZmdfYWRkcih1bnNpZ25lZCBpbnQgcG9ydF9ubywgdW5zaWduZWQgaW50IHNjX3JlZywgaW50IGRldmljZSkKIHsKIAl1bnNpZ25lZCBpbnQgYWRkciA9IFNJU19TQ1JfQkFTRSArICg0ICogc2NfcmVnKTsKIAotCWlmIChwb3J0X25vKQotCQlhZGRyICs9IFNJU19TQVRBMV9PRlM7CisJaWYgKHBvcnRfbm8pICB7CisJCWlmIChkZXZpY2UgPT0gMHgxODIpCisJCQlhZGRyICs9IFNJUzE4Ml9TQVRBMV9PRlM7CisJCWVsc2UKKwkJCWFkZHIgKz0gU0lTMTgwX1NBVEExX09GUzsKKwl9CisKIAlyZXR1cm4gYWRkcjsKIH0KIAogc3RhdGljIHUzMiBzaXNfc2NyX2NmZ19yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7Ci0JdW5zaWduZWQgaW50IGNmZ19hZGRyID0gZ2V0X3Njcl9jZmdfYWRkcihhcC0+cG9ydF9ubywgc2NfcmVnKTsKLQl1MzIgdmFsOworCXVuc2lnbmVkIGludCBjZmdfYWRkciA9IGdldF9zY3JfY2ZnX2FkZHIoYXAtPnBvcnRfbm8sIHNjX3JlZywgcGRldi0+ZGV2aWNlKTsKKwl1MzIgdmFsLCB2YWwyOworCXU4IHBtcjsKIAogCWlmIChzY19yZWcgPT0gU0NSX0VSUk9SKSAvKiBkb2Vzbid0IGV4aXN0IGluIFBDSSBjZmcgc3BhY2UgKi8KIAkJcmV0dXJuIDB4ZmZmZmZmZmY7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTSVNfUE1SLCAmcG1yKTsKKwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBjZmdfYWRkciwgJnZhbCk7Ci0JcmV0dXJuIHZhbDsKKworCWlmICgocGRldi0+ZGV2aWNlID09IDB4MTgyKSB8fCAocG1yICYgU0lTX1BNUl9DT01CSU5FRCkpCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBjZmdfYWRkcisweDEwLCAmdmFsMik7CisKKwlyZXR1cm4gdmFsfHZhbDI7CiB9CiAKIHN0YXRpYyB2b2lkIHNpc19zY3JfY2ZnX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NyLCB1MzIgdmFsKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7Ci0JdW5zaWduZWQgaW50IGNmZ19hZGRyID0gZ2V0X3Njcl9jZmdfYWRkcihhcC0+cG9ydF9ubywgc2NyKTsKKwl1bnNpZ25lZCBpbnQgY2ZnX2FkZHIgPSBnZXRfc2NyX2NmZ19hZGRyKGFwLT5wb3J0X25vLCBzY3IsIHBkZXYtPmRldmljZSk7CisJdTggcG1yOwogCiAJaWYgKHNjciA9PSBTQ1JfRVJST1IpIC8qIGRvZXNuJ3QgZXhpc3QgaW4gUENJIGNmZyBzcGFjZSAqLwogCQlyZXR1cm47CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTSVNfUE1SLCAmcG1yKTsKKwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgY2ZnX2FkZHIsIHZhbCk7CisKKwlpZiAoKHBkZXYtPmRldmljZSA9PSAweDE4MikgfHwgKHBtciAmIFNJU19QTVJfQ09NQklORUQpKQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIGNmZ19hZGRyKzB4MTAsIHZhbCk7CiB9CiAKIHN0YXRpYyB1MzIgc2lzX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQogeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7CisJdTMyIHZhbCwgdmFsMiA9IDA7CisJdTggcG1yOworCiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQogCQlyZXR1cm4gMHhmZmZmZmZmZlU7CiAKIAlpZiAoYXAtPmZsYWdzICYgU0lTX0ZMQUdfQ0ZHU0NSKQogCQlyZXR1cm4gc2lzX3Njcl9jZmdfcmVhZChhcCwgc2NfcmVnKTsKLQlyZXR1cm4gaW5sKGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgU0lTX1BNUiwgJnBtcik7CisKKwl2YWwgPSBpbmwoYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7CisKKwlpZiAoKHBkZXYtPmRldmljZSA9PSAweDE4MikgfHwgKHBtciAmIFNJU19QTVJfQ09NQklORUQpKQorCQl2YWwyID0gaW5sKGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkgKyAweDEwKTsKKworCXJldHVybiB2YWwgfCB2YWwyOwogfQogCiBzdGF0aWMgdm9pZCBzaXNfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQogeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7CisJdTggcG1yOworCiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQogCQlyZXR1cm47CiAKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTSVNfUE1SLCAmcG1yKTsKKwogCWlmIChhcC0+ZmxhZ3MgJiBTSVNfRkxBR19DRkdTQ1IpCiAJCXNpc19zY3JfY2ZnX3dyaXRlKGFwLCBzY19yZWcsIHZhbCk7Ci0JZWxzZQorCWVsc2UgewogCQlvdXRsKHZhbCwgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7Ci19Ci0KLS8qIG1vdmUgdG8gUENJIGxheWVyLCBpbnRlZ3JhdGUgdy8gTVNJIHN0dWZmICovCi1zdGF0aWMgdm9pZCBwY2lfZW5hYmxlX2ludHgoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JdTE2IHBjaV9jb21tYW5kOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7Ci0JaWYgKHBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSB7Ci0JCXBjaV9jb21tYW5kICY9IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOworCQlpZiAoKHBkZXYtPmRldmljZSA9PSAweDE4MikgfHwgKHBtciAmIFNJU19QTVJfQ09NQklORUQpKQorCQkJb3V0bCh2YWwsIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkrMHgxMCk7CiAJfQogfQogCkBAIC0yMTAsNiArMjQyLDggQEAKIAl1MzIgZ2VuY3RsOwogCXN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGk7CiAJaW50IHBjaV9kZXZfYnVzeSA9IDA7CisJdTggcG1yOworCXU4IHBvcnQyX3N0YXJ0OwogCiAJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCkBAIC0yNTEsMTUgKzI4NSwzMSBAQAogCQlwcm9iZV9lbnQtPmhvc3RfZmxhZ3MgfD0gU0lTX0ZMQUdfQ0ZHU0NSOwogCX0KIAorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFNJU19QTVIsICZwbXIpOworCWlmIChlbnQtPmRldmljZSAhPSAweDE4MikgeworCQlpZiAoKHBtciAmIFNJU19QTVJfQ09NQklORUQpID09IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInNhdGFfc2lzOiBEZXRlY3RlZCBTaVMgMTgwLzE4MSBjaGlwc2V0IGluIFNBVEEgbW9kZVxuIik7CisJCQlwb3J0Ml9zdGFydD0weDY0OworCQl9CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAic2F0YV9zaXM6IERldGVjdGVkIFNpUyAxODAvMTgxIGNoaXBzZXQgaW4gY29tYmluZWQgbW9kZVxuIik7CisJCQlwb3J0Ml9zdGFydD0wOworCQl9CisJfQorCWVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJzYXRhX3NpczogRGV0ZWN0ZWQgU2lTIDE4MiBjaGlwc2V0XG4iKTsKKwkJcG9ydDJfc3RhcnQgPSAweDIwOworCX0KKwogCWlmICghKHByb2JlX2VudC0+aG9zdF9mbGFncyAmIFNJU19GTEFHX0NGR1NDUikpIHsKIAkJcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyID0KIAkJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBTSVNfU0NSX1BDSV9CQVIpOwogCQlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPQotCQkJcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFNJU19TQ1JfUENJX0JBUikgKyA2NDsKKwkJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBTSVNfU0NSX1BDSV9CQVIpICsgcG9ydDJfc3RhcnQ7CiAJfQogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JcGNpX2VuYWJsZV9pbnR4KHBkZXYpOworCXBjaV9pbnR4KHBkZXYsIDEpOwogCiAJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLwogCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9zdncuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3N2dy5jCmluZGV4IDE5ZDNiYjMuLmQ4OWQ5NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zYXRhX3N2dy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3N2dy5jCkBAIC0zMTgsNyArMzE4LDcgQEAKIAkuc2NyX3dyaXRlCQk9IGsyX3NhdGFfc2NyX3dyaXRlLAogCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAogCS5wb3J0X3N0b3AJCT0gYXRhX3BvcnRfc3RvcCwKLQkuaG9zdF9zdG9wCQk9IGF0YV9ob3N0X3N0b3AsCisJLmhvc3Rfc3RvcAkJPSBhdGFfcGNpX2hvc3Rfc3RvcCwKIH07CiAKIHN0YXRpYyB2b2lkIGsyX3NhdGFfc2V0dXBfcG9ydChzdHJ1Y3QgYXRhX2lvcG9ydHMgKnBvcnQsIHVuc2lnbmVkIGxvbmcgYmFzZSkKQEAgLTM0Niw3ICszNDYsNyBAQAogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgYmFzZTsKLQl2b2lkICptbWlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2U7CiAJaW50IHBjaV9kZXZfYnVzeSA9IDA7CiAJaW50IHJjOwogCWludCBpOwpAQCAtMzkyLDggKzM5Miw3IEBACiAJcHJvYmVfZW50LT5kZXYgPSBwY2lfZGV2X3RvX2RldihwZGV2KTsKIAlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKIAotCW1taW9fYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDUpLAotCQkgICAgICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDUpKTsKKwltbWlvX2Jhc2UgPSBwY2lfaW9tYXAocGRldiwgNSwgMCk7CiAJaWYgKG1taW9fYmFzZSA9PSBOVUxMKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfZW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfc3g0LmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9zeDQuYwppbmRleCBjNzJmY2M0Li41NDBhODUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2F0YV9zeDQuYworKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9zeDQuYwpAQCAtMjQ1LDEzICsyNDUsMTQgQEAKIAogc3RhdGljIHZvaWQgcGRjMjA2MjFfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQogeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihob3N0X3NldC0+ZGV2KTsKIAlzdHJ1Y3QgcGRjX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0X3NldC0+cHJpdmF0ZV9kYXRhOwogCXZvaWQgKmRpbW1fbW1pbyA9IGhwcml2LT5kaW1tX21taW87CiAKLQlpb3VubWFwKGRpbW1fbW1pbyk7CisJcGNpX2lvdW5tYXAocGRldiwgZGltbV9tbWlvKTsKIAlrZnJlZShocHJpdik7CiAKLQlhdGFfaG9zdF9zdG9wKGhvc3Rfc2V0KTsKKwlwY2lfaW91bm1hcChwZGV2LCBob3N0X3NldC0+bW1pb19iYXNlKTsKIH0KIAogc3RhdGljIGludCBwZGNfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQpAQCAtNDUxLDkgKzQ1Miw5IEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHFjLT5zZzsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwogCXN0cnVjdCBwZGNfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7Ci0Jdm9pZCAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOwogCXN0cnVjdCBwZGNfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0X3NldC0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgKmRpbW1fbW1pbyA9IGhwcml2LT5kaW1tX21taW87CisJdm9pZCBfX2lvbWVtICpkaW1tX21taW8gPSBocHJpdi0+ZGltbV9tbWlvOwogCXVuc2lnbmVkIGludCBwb3J0bm8gPSBhcC0+cG9ydF9ubzsKIAl1bnNpZ25lZCBpbnQgaSwgbGFzdCwgaWR4LCB0b3RhbF9sZW4gPSAwLCBzZ3RfbGVuOwogCXUzMiAqYnVmID0gKHUzMiAqKSAmcHAtPmRpbW1fYnVmW1BEQ19ESU1NX0hFQURFUl9TWl07CkBAIC01MTMsOSArNTE0LDkgQEAKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwogCXN0cnVjdCBwZGNfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7Ci0Jdm9pZCAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOwogCXN0cnVjdCBwZGNfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0X3NldC0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgKmRpbW1fbW1pbyA9IGhwcml2LT5kaW1tX21taW87CisJdm9pZCBfX2lvbWVtICpkaW1tX21taW8gPSBocHJpdi0+ZGltbV9tbWlvOwogCXVuc2lnbmVkIGludCBwb3J0bm8gPSBhcC0+cG9ydF9ubzsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtNTY1LDcgKzU2Niw3IEBACiB7CiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKIAlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCA9IGFwLT5ob3N0X3NldDsKLQl2b2lkICptbWlvID0gaG9zdF9zZXQtPm1taW9fYmFzZTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBob3N0X3NldC0+bW1pb19iYXNlOwogCiAJLyogaGFyZC1jb2RlIGNoaXAgIzAgKi8KIAltbWlvICs9IFBEQ19DSElQMF9PRlM7CkBAIC02MzksNyArNjQwLDcgQEAKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwogCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gYXAtPmhvc3Rfc2V0OwogCXVuc2lnbmVkIGludCBwb3J0X25vID0gYXAtPnBvcnRfbm87Ci0Jdm9pZCAqbW1pbyA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtICptbWlvID0gaG9zdF9zZXQtPm1taW9fYmFzZTsKIAl1bnNpZ25lZCBpbnQgcncgPSAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKTsKIAl1OCBzZXEgPSAodTgpIChwb3J0X25vICsgMSk7CiAJdW5zaWduZWQgaW50IHBvcnRfb2ZzOwpAQCAtNjk5LDcgKzcwMCw3IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwZGMyMDYyMV9ob3N0X2ludHIoIHN0cnVjdCBhdGFfcG9ydCAqYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLAogCQkJCQkgIHVuc2lnbmVkIGludCBkb2luZ19oZG1hLAotCQkJCQkgIHZvaWQgKm1taW8pCisJCQkJCSAgdm9pZCBfX2lvbWVtICptbWlvKQogewogCXVuc2lnbmVkIGludCBwb3J0X25vID0gYXAtPnBvcnRfbm87CiAJdW5zaWduZWQgaW50IHBvcnRfb2ZzID0KQEAgLTc3OCw3ICs3NzksNyBAQAogc3RhdGljIHZvaWQgcGRjMjA2MjFfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBhcC0+aG9zdF9zZXQ7Ci0Jdm9pZCAqbW1pbyA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtICptbWlvID0gaG9zdF9zZXQtPm1taW9fYmFzZTsKIAogCW1taW8gKz0gUERDX0NISVAwX09GUzsKIApAQCAtNzkyLDcgKzc5Myw3IEBACiAJdTMyIG1hc2sgPSAwOwogCXVuc2lnbmVkIGludCBpLCB0bXAsIHBvcnRfbm87CiAJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwOwotCXZvaWQgKm1taW9fYmFzZTsKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZTsKIAogCVZQUklOVEsoIkVOVEVSXG4iKTsKIApAQCAtOTQwLDkgKzk0MSw5IEBACiAJdTE2IGlkeDsKIAl1OCBwYWdlX21hc2s7CiAJbG9uZyBkaXN0OwotCXZvaWQgKm1taW8gPSBwZS0+bW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqbW1pbyA9IHBlLT5tbWlvX2Jhc2U7CiAJc3RydWN0IHBkY19ob3N0X3ByaXYgKmhwcml2ID0gcGUtPnByaXZhdGVfZGF0YTsKLQl2b2lkICpkaW1tX21taW8gPSBocHJpdi0+ZGltbV9tbWlvOworCXZvaWQgX19pb21lbSAqZGltbV9tbWlvID0gaHByaXYtPmRpbW1fbW1pbzsKIAogCS8qIGhhcmQtY29kZSBjaGlwICMwICovCiAJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOwpAQCAtOTk2LDkgKzk5Nyw5IEBACiAJdTE2IGlkeDsKIAl1OCBwYWdlX21hc2s7CiAJbG9uZyBkaXN0OwotCXZvaWQgKm1taW8gPSBwZS0+bW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqbW1pbyA9IHBlLT5tbWlvX2Jhc2U7CiAJc3RydWN0IHBkY19ob3N0X3ByaXYgKmhwcml2ID0gcGUtPnByaXZhdGVfZGF0YTsKLQl2b2lkICpkaW1tX21taW8gPSBocHJpdi0+ZGltbV9tbWlvOworCXZvaWQgX19pb21lbSAqZGltbV9tbWlvID0gaHByaXYtPmRpbW1fbW1pbzsKIAogCS8qIGhhcmQtY29kZSBjaGlwICMwICovCiAJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOwpAQCAtMTA0NCw3ICsxMDQ1LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcGRjMjA2MjFfaTJjX3JlYWQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlLCB1MzIgZGV2aWNlLAogCQkJCSAgICAgIHUzMiBzdWJhZGRyLCB1MzIgKnBkYXRhKQogewotCXZvaWQgKm1taW8gPSBwZS0+bW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqbW1pbyA9IHBlLT5tbWlvX2Jhc2U7CiAJdTMyIGkyY3JlZyAgPSAwOwogCXUzMiBzdGF0dXM7CiAJdTMyIGNvdW50ID0wOwpAQCAtMTEwMyw3ICsxMTA0LDcgQEAKIAl1MzIgZGF0YSA9IDA7CiAgICAJaW50IHNpemUsIGk7CiAgICAJdTggYmRpbW1zaXplOwotICAgCXZvaWQgKm1taW8gPSBwZS0+bW1pb19iYXNlOworICAgCXZvaWQgX19pb21lbSAqbW1pbyA9IHBlLT5tbWlvX2Jhc2U7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJCXVuc2lnbmVkIGludCByZWc7CiAJCXVuc2lnbmVkIGludCBvZnM7CkBAIC0xMTY2LDcgKzExNjcsNyBAQAogewogCXUzMiBkYXRhLCBzcGQwOwogICAgCWludCBlcnJvciwgaTsKLSAgIAl2b2lkICptbWlvID0gcGUtPm1taW9fYmFzZTsKKyAgIAl2b2lkIF9faW9tZW0gKm1taW8gPSBwZS0+bW1pb19iYXNlOwogCiAJLyogaGFyZC1jb2RlIGNoaXAgIzAgKi8KICAgIAltbWlvICs9IFBEQ19DSElQMF9PRlM7CkBAIC0xMjIwLDcgKzEyMjEsNyBAQAogCXUzMiB0aWNrcz0wOwogCXUzMiBjbG9jaz0wOwogCXUzMiBmcGFyYW09MDsKLSAgIAl2b2lkICptbWlvID0gcGUtPm1taW9fYmFzZTsKKyAgIAl2b2lkIF9faW9tZW0gKm1taW8gPSBwZS0+bW1pb19iYXNlOwogCiAJLyogaGFyZC1jb2RlIGNoaXAgIzAgKi8KICAgIAltbWlvICs9IFBEQ19DSElQMF9PRlM7CkBAIC0xMzQ0LDcgKzEzNDUsNyBAQAogc3RhdGljIHZvaWQgcGRjXzIwNjIxX2luaXQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQogewogCXUzMiB0bXA7Ci0Jdm9pZCAqbW1pbyA9IHBlLT5tbWlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtICptbWlvID0gcGUtPm1taW9fYmFzZTsKIAogCS8qIGhhcmQtY29kZSBjaGlwICMwICovCiAJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOwpAQCAtMTM3Nyw3ICsxMzc4LDggQEAKIAlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGJhc2U7Ci0Jdm9pZCAqbW1pb19iYXNlLCAqZGltbV9tbWlvID0gTlVMTDsKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZTsKKwl2b2lkIF9faW9tZW0gKmRpbW1fbW1pbyA9IE5VTEw7CiAJc3RydWN0IHBkY19ob3N0X3ByaXYgKmhwcml2ID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4ID0gKHVuc2lnbmVkIGludCkgZW50LT5kcml2ZXJfZGF0YTsKIAlpbnQgcGNpX2Rldl9idXN5ID0gMDsKQEAgLTE0MTcsOCArMTQxOSw3IEBACiAJcHJvYmVfZW50LT5kZXYgPSBwY2lfZGV2X3RvX2RldihwZGV2KTsKIAlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKIAotCW1taW9fYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpLAotCQkgICAgICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpKTsKKwltbWlvX2Jhc2UgPSBwY2lfaW9tYXAocGRldiwgMywgMCk7CiAJaWYgKG1taW9fYmFzZSA9PSBOVUxMKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfZW50OwpAQCAtMTQzMiw4ICsxNDMzLDcgQEAKIAl9CiAJbWVtc2V0KGhwcml2LCAwLCBzaXplb2YoKmhwcml2KSk7CiAKLQlkaW1tX21taW8gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KSwKLQkJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDQpKTsKKwlkaW1tX21taW8gPSBwY2lfaW9tYXAocGRldiwgNCwgMCk7CiAJaWYgKCFkaW1tX21taW8pIHsKIAkJa2ZyZWUoaHByaXYpOwogCQlyYyA9IC1FTk9NRU07CkBAIC0xNDgwLDkgKzE0ODAsOSBAQAogCiBlcnJfb3V0X2lvdW5tYXBfZGltbToJCS8qIG9ubHkgZ2V0IHRvIHRoaXMgbGFiZWwgaWYgMjA2MjEgKi8KIAlrZnJlZShocHJpdik7Ci0JaW91bm1hcChkaW1tX21taW8pOworCXBjaV9pb3VubWFwKHBkZXYsIGRpbW1fbW1pbyk7CiBlcnJfb3V0X2lvdW5tYXA6Ci0JaW91bm1hcChtbWlvX2Jhc2UpOworCXBjaV9pb3VubWFwKHBkZXYsIG1taW9fYmFzZSk7CiBlcnJfb3V0X2ZyZWVfZW50OgogCWtmcmVlKHByb2JlX2VudCk7CiBlcnJfb3V0X3JlZ2lvbnM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV91bGkuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3VsaS5jCmluZGV4IDE1NjY4ODYuLjRjOWZiOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zYXRhX3VsaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3VsaS5jCkBAIC0xMjUsOCArMTI1LDggQEAKIAkuc2h0ICAgICAgICAgICAgPSAmdWxpX3NodCwKIAkuaG9zdF9mbGFncyAgICAgPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfU0FUQV9SRVNFVCB8CiAJCQkgIEFUQV9GTEFHX05PX0xFR0FDWSwKLQkucGlvX21hc2sgICAgICAgPSAweDAzLAkJLy9zdXBwb3J0IHBpbyBtb2RlIDQgKEZJWE1FKQotCS51ZG1hX21hc2sgICAgICA9IDB4N2YsCQkvL3N1cHBvcnQgdWRtYSBtb2RlIDYKKwkucGlvX21hc2sgICAgICAgPSAweDFmLAkJLyogcGlvMC00ICovCisJLnVkbWFfbWFzayAgICAgID0gMHg3ZiwJCS8qIHVkbWEwLTYgKi8KIAkucG9ydF9vcHMgICAgICAgPSAmdWxpX29wcywKIH07CiAKQEAgLTE3NiwxOCArMTc2LDYgQEAKIAl1bGlfc2NyX2NmZ193cml0ZShhcCwgc2NfcmVnLCB2YWwpOwogfQogCi0vKiBtb3ZlIHRvIFBDSSBsYXllciwgaW50ZWdyYXRlIHcvIE1TSSBzdHVmZiAqLwotc3RhdGljIHZvaWQgcGNpX2VuYWJsZV9pbnR4KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXUxNiBwY2lfY29tbWFuZDsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NvbW1hbmQpOwotCWlmIChwY2lfY29tbWFuZCAmIFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRSkgewotCQlwY2lfY29tbWFuZCAmPSB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOwotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHBjaV9jb21tYW5kKTsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQgdWxpX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OwpAQCAtMjYwLDcgKzI0OCw3IEBACiAJfQogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JcGNpX2VuYWJsZV9pbnR4KHBkZXYpOworCXBjaV9pbnR4KHBkZXYsIDEpOwogCiAJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLwogCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV92c2MuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3ZzYy5jCmluZGV4IDM5ODVmMzQuLmNmOTRlMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zYXRhX3ZzYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3ZzYy5jCkBAIC0yNTIsNyArMjUyLDcgQEAKIAkuc2NyX3dyaXRlCQk9IHZzY19zYXRhX3Njcl93cml0ZSwKIAkucG9ydF9zdGFydAkJPSBhdGFfcG9ydF9zdGFydCwKIAkucG9ydF9zdG9wCQk9IGF0YV9wb3J0X3N0b3AsCi0JLmhvc3Rfc3RvcAkJPSBhdGFfaG9zdF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gYXRhX3BjaV9ob3N0X3N0b3AsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgdnNjX3NhdGFfc2V0dXBfcG9ydChzdHJ1Y3QgYXRhX2lvcG9ydHMgKnBvcnQsIHVuc2lnbmVkIGxvbmcgYmFzZSkKQEAgLTMyNiw4ICszMjYsNyBAQAogCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7CiAJSU5JVF9MSVNUX0hFQUQoJnByb2JlX2VudC0+bm9kZSk7CiAKLQltbWlvX2Jhc2UgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKLQkJICAgICAgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJbW1pb19iYXNlID0gcGNpX2lvbWFwKHBkZXYsIDAsIDApOwogCWlmIChtbWlvX2Jhc2UgPT0gTlVMTCkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dF9mcmVlX2VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCmluZGV4IGQxNDUyM2QuLmE3ODA1NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2kuYwpAQCAtMjY4LDYgKzI2OCw3IEBACiAJfSBlbHNlCiAJCXB1dF9kZXZpY2UoJmRldi0+c2Rldl9nZW5kZXYpOwogCisJY21kLT5qaWZmaWVzX2F0X2FsbG9jID0gamlmZmllczsKIAlyZXR1cm4gY21kOwogfQkJCQkKIEVYUE9SVF9TWU1CT0woc2NzaV9nZXRfY29tbWFuZCk7CkBAIC02MjcsNyArNjI4LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlzY3NpX2NtZF9nZXRfc2VyaWFsKGhvc3QsIGNtZCk7IAogCi0JaWYgKHVubGlrZWx5KHRlc3RfYml0KFNIT1NUX0NBTkNFTCwgJmhvc3QtPnNob3N0X3N0YXRlKSkpIHsKKwlpZiAodW5saWtlbHkoaG9zdC0+c2hvc3Rfc3RhdGUgPT0gU0hPU1RfREVMKSkgewogCQljbWQtPnJlc3VsdCA9IChESURfTk9fQ09OTkVDVCA8PCAxNik7CiAJCXNjc2lfZG9uZShjbWQpOwogCX0gZWxzZSB7CkBAIC03OTgsOSArNzk5LDIzIEBACiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZsb2NhbF9xKSkgewogCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBsaXN0X2VudHJ5KGxvY2FsX3EubmV4dCwKIAkJCQkJCSAgIHN0cnVjdCBzY3NpX2NtbmQsIGVoX2VudHJ5KTsKKwkJLyogVGhlIGxvbmdlc3QgdGltZSBhbnkgY29tbWFuZCBzaG91bGQgYmUgb3V0c3RhbmRpbmcgaXMgdGhlCisJCSAqIHBlciBjb21tYW5kIHRpbWVvdXQgbXVsdGlwbGllZCBieSB0aGUgbnVtYmVyIG9mIHJldHJpZXMuCisJCSAqCisJCSAqIEZvciBhIHR5cGljYWwgY29tbWFuZCwgdGhpcyBpcyAyLjUgbWludXRlcyAqLworCQl1bnNpZ25lZCBsb25nIHdhaXRfZm9yIAorCQkJPSBjbWQtPmFsbG93ZWQgKiBjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQ7CiAJCWxpc3RfZGVsX2luaXQoJmNtZC0+ZWhfZW50cnkpOwogCiAJCWRpc3Bvc2l0aW9uID0gc2NzaV9kZWNpZGVfZGlzcG9zaXRpb24oY21kKTsKKwkJaWYgKGRpc3Bvc2l0aW9uICE9IFNVQ0NFU1MgJiYKKwkJICAgIHRpbWVfYmVmb3JlKGNtZC0+amlmZmllc19hdF9hbGxvYyArIHdhaXRfZm9yLCBqaWZmaWVzKSkgeworCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmNtZC0+ZGV2aWNlLT5zZGV2X2dlbmRldiwgCisJCQkJICAgInRpbWluZyBvdXQgY29tbWFuZCwgd2FpdGVkICVsdXNcbiIsCisJCQkJICAgd2FpdF9mb3IvSFopOworCQkJZGlzcG9zaXRpb24gPSBTVUNDRVNTOworCQl9CisJCQkKIAkJc2NzaV9sb2dfY29tcGxldGlvbihjbWQsIGRpc3Bvc2l0aW9uKTsKIAkJc3dpdGNoIChkaXNwb3NpdGlvbikgewogCQljYXNlIFNVQ0NFU1M6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMKaW5kZXggNjEyMWRjMS4uMDdiNTU0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYwpAQCAtMTE0LDYgKzExNCw3IEBACiAJeyJZQU1BSEEiLCAiQ0RSMTAyIiwgIjEuMDAiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCiAJeyJZQU1BSEEiLCAiQ1JXODQyNFMiLCAiMS4wIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLwogCXsiWUFNQUhBIiwgIkNSVzY0MTZTIiwgIjEuMGMiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJeyIiLCAiU2Nhbm5lciIsICIxLjgwIiwgQkxJU1RfTk9MVU59LAkvKiByZXNwb25kcyB0byBhbGwgbHVuICovCiAKIAkvKgogCSAqIE90aGVyIHR5cGVzIG9mIGRldmljZXMgdGhhdCBoYXZlIHNwZWNpYWwgZmxhZ3MuCkBAIC0xMzUsNyArMTM2LDcgQEAKIAl7IkNPTVBBUSIsICJNU0ExMDAwIFZPTFVNRSIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX05PU1RBUlRPTkFERH0sCiAJeyJDT01QQVEiLCAiSFNWMTEwIiwgTlVMTCwgQkxJU1RfUkVQT1JUTFVOMiB8IEJMSVNUX05PU1RBUlRPTkFERH0sCiAJeyJERE4iLCAiU0FOIERhdGFEaXJlY3RvciIsICIqIiwgQkxJU1RfU1BBUlNFTFVOfSwKLQl7IkRFQyIsICJIU0c4MCIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX05PU1RBUlRPTkFERH0sCisJeyJERUMiLCAiSFNHODAiLCBOVUxMLCBCTElTVF9SRVBPUlRMVU4yIHwgQkxJU1RfTk9TVEFSVE9OQUREfSwKIAl7IkRFTEwiLCAiUFY2NjBGIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOfSwKIAl7IkRFTEwiLCAiUFY2NjBGICAgUFNFVURPIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOfSwKIAl7IkRFTEwiLCAiUFNFVURPIERFVklDRSAuIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOfSwJLyogRGVsbCBQViA1MzBGICovCkBAIC0xOTEsNiArMTkyLDcgQEAKIAl7IlNHSSIsICJSQUlENSIsICIqIiwgQkxJU1RfU1BBUlNFTFVOfSwKIAl7IlNHSSIsICJUUDkxMDAiLCAiKiIsIEJMSVNUX1JFUE9SVExVTjJ9LAogCXsiU0dJIiwgIlVuaXZlcnNhbCBYcG9ydCIsICIqIiwgQkxJU1RfTk9fVUxEX0FUVEFDSH0sCisJeyJJQk0iLCAiVW5pdmVyc2FsIFhwb3J0IiwgIioiLCBCTElTVF9OT19VTERfQVRUQUNIfSwKIAl7IlNNU0MiLCAiVVNCIDIgSFMtQ0YiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9JTlFVSVJZXzM2fSwKIAl7IlNPTlkiLCAiQ0QtUk9NIENEVS04MDAxIiwgTlVMTCwgQkxJU1RfQk9SS0VOfSwKIAl7IlNPTlkiLCAiVFNMIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU59LAkJLyogRERTMyAmIEREUzQgYXV0b2xvYWRlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCmluZGV4IDBmYzhiNDguLjg5NWM5NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTc1LDcgKzc2LDcgQEAKIAogCXNjbWQtPmVoX2VmbGFncyB8PSBlaF9mbGFnOwogCWxpc3RfYWRkX3RhaWwoJnNjbWQtPmVoX2VudHJ5LCAmc2hvc3QtPmVoX2NtZF9xKTsKLQlzZXRfYml0KFNIT1NUX1JFQ09WRVJZLCAmc2hvc3QtPnNob3N0X3N0YXRlKTsKKwlzY3NpX2hvc3Rfc2V0X3N0YXRlKHNob3N0LCBTSE9TVF9SRUNPVkVSWSk7CiAJc2hvc3QtPmhvc3RfZmFpbGVkKys7CiAJc2NzaV9laF93YWtldXAoc2hvc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwpAQCAtMTE1LDcgKzExNiw2IEBACiAKIAlhZGRfdGltZXIoJnNjbWQtPmVoX3RpbWVvdXQpOwogfQotRVhQT1JUX1NZTUJPTChzY3NpX2FkZF90aW1lcik7CiAKIC8qKgogICogc2NzaV9kZWxldGVfdGltZXIgLSBEZWxldGUvY2FuY2VsIHRpbWVyIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgpAQCAtMTQzLDcgKzE0Myw2IEBACiAKIAlyZXR1cm4gcnRuOwogfQotRVhQT1JUX1NZTUJPTChzY3NpX2RlbGV0ZV90aW1lcik7CiAKIC8qKgogICogc2NzaV90aW1lc19vdXQgLSBUaW1lb3V0IGZ1bmN0aW9uIGZvciBub3JtYWwgc2NzaSBjb21tYW5kcy4KQEAgLTE5Nyw3ICsxOTYsOCBAQAogewogCWludCBvbmxpbmU7CiAKLQl3YWl0X2V2ZW50KHNkZXYtPmhvc3QtPmhvc3Rfd2FpdCwgKCF0ZXN0X2JpdChTSE9TVF9SRUNPVkVSWSwgJnNkZXYtPmhvc3QtPnNob3N0X3N0YXRlKSkpOworCXdhaXRfZXZlbnQoc2Rldi0+aG9zdC0+aG9zdF93YWl0LCAoc2Rldi0+aG9zdC0+c2hvc3Rfc3RhdGUgIT0KKwkJCQkJICAgU0hPU1RfUkVDT1ZFUlkpKTsKIAogCW9ubGluZSA9IHNjc2lfZGV2aWNlX29ubGluZShzZGV2KTsKIApAQCAtNzc1LDkgKzc3NSwxMSBAQAogCQlfX0ZVTkNUSU9OX18sIHNjbWQsIHJ0bikpOwogCWlmIChydG4gPT0gU1VDQ0VTUykKIAkJcmV0dXJuIDA7Ci0JZWxzZSBpZiAocnRuID09IE5FRURTX1JFVFJZKQorCWVsc2UgaWYgKHJ0biA9PSBORUVEU19SRVRSWSkgewogCQlpZiAocmV0cnlfY250LS0pCiAJCQlnb3RvIHJldHJ5X3R1cjsKKwkJcmV0dXJuIDA7CisJfQogCXJldHVybiAxOwogfQogCkBAIC0xNDU4LDcgKzE0NjAsNyBAQAogCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IHdha2luZyB1cCBob3N0IHRvIHJlc3RhcnRcbiIsCiAJCQkJCSAgX19GVU5DVElPTl9fKSk7CiAKLQljbGVhcl9iaXQoU0hPU1RfUkVDT1ZFUlksICZzaG9zdC0+c2hvc3Rfc3RhdGUpOworCXNjc2lfaG9zdF9zZXRfc3RhdGUoc2hvc3QsIFNIT1NUX1JVTk5JTkcpOwogCiAJd2FrZV91cCgmc2hvc3QtPmhvc3Rfd2FpdCk7CiAKQEAgLTE1ODIsMTYgKzE1ODQsOCBAQAogCWludCBydG47CiAJREVDTEFSRV9NVVRFWF9MT0NLRUQoc2VtKTsKIAotCS8qCi0JICogICAgRmx1c2ggcmVzb3VyY2VzCi0JICovCi0KLQlkYWVtb25pemUoInNjc2lfZWhfJWQiLCBzaG9zdC0+aG9zdF9ubyk7Ci0KIAljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQogCXNob3N0LT5laF93YWl0ID0gJnNlbTsKLQlzaG9zdC0+ZWhhbmRsZXIgPSBjdXJyZW50OwogCiAJLyoKIAkgKiBXYWtlIHVwIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHVzLgpAQCAtMTU5OSw4ICsxNTkzLDYgQEAKIAlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIldha2UgdXAgcGFyZW50IG9mIgogCQkJCQkgICIgc2NzaV9laF8lZFxuIixzaG9zdC0+aG9zdF9ubykpOwogCi0JY29tcGxldGUoc2hvc3QtPmVoX25vdGlmeSk7Ci0KIAl3aGlsZSAoMSkgewogCQkvKgogCQkgKiBJZiB3ZSBnZXQgYSBzaWduYWwsIGl0IG1lYW5zIHdlIGFyZSBzdXBwb3NlZCB0byBnbwpAQCAtMTYyMSw3ICsxNjEzLDcgQEAKIAkJICogc2VtYXBob3JlcyBpc24ndCB1bnJlYXNvbmFibGUuCiAJCSAqLwogCQlkb3duX2ludGVycnVwdGlibGUoJnNlbSk7Ci0JCWlmIChzaG9zdC0+ZWhfa2lsbCkKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKIAkJCWJyZWFrOwogCiAJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDEsIHByaW50aygiRXJyb3IgaGFuZGxlciIKQEAgLTE2NjAsMjIgKzE2NTIsNiBAQAogCSAqIE1ha2Ugc3VyZSB0aGF0IG5vYm9keSB0cmllcyB0byB3YWtlIHVzIHVwIGFnYWluLgogCSAqLwogCXNob3N0LT5laF93YWl0ID0gTlVMTDsKLQotCS8qCi0JICogS25vY2sgdGhpcyBkb3duIHRvby4gIEZyb20gdGhpcyBwb2ludCBvbiwgdGhlIGhvc3QgaXMgZmx5aW5nCi0JICogd2l0aG91dCBhIHBpbG90LiAgSWYgdGhpcyBpcyBiZWNhdXNlIHRoZSBtb2R1bGUgaXMgYmVpbmcgdW5sb2FkZWQsCi0JICogdGhhdCdzIGZpbmUuICBJZiB0aGUgdXNlciBzZW50IGEgc2lnbmFsIHRvIHRoaXMgdGhpbmcsIHdlIGFyZQotCSAqIHBvdGVudGlhbGx5IGluIHJlYWwgZGFuZ2VyLgotCSAqLwotCXNob3N0LT5laF9hY3RpdmUgPSAwOwotCXNob3N0LT5laGFuZGxlciA9IE5VTEw7Ci0KLQkvKgotCSAqIElmIGFueW9uZSBpcyB3YWl0aW5nIGZvciB1cyB0byBleGl0IChpLmUuIHNvbWVvbmUgdHJ5aW5nIHRvIHVubG9hZAotCSAqIGEgZHJpdmVyKSwgdGhlbiB3YWtlIHVwIHRoYXQgcHJvY2VzcyB0byBsZXQgdGhlbSBrbm93IHdlIGFyZSBvbgotCSAqIHRoZSB3YXkgb3V0IHRoZSBkb29yLgotCSAqLwotCWNvbXBsZXRlX2FuZF9leGl0KHNob3N0LT5laF9ub3RpZnksIDApOwogCXJldHVybiAwOwogfQogCkBAIC0xODQ2LDEyICsxODIyLDE2IEBACiBpbnQgc2NzaV9ub3JtYWxpemVfc2Vuc2UoY29uc3QgdTggKnNlbnNlX2J1ZmZlciwgaW50IHNiX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKnNzaGRyKQogewotCWlmICghc2Vuc2VfYnVmZmVyIHx8ICFzYl9sZW4gfHwgKHNlbnNlX2J1ZmZlclswXSAmIDB4NzApICE9IDB4NzApCisJaWYgKCFzZW5zZV9idWZmZXIgfHwgIXNiX2xlbikKIAkJcmV0dXJuIDA7CiAKIAltZW1zZXQoc3NoZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIpKTsKIAogCXNzaGRyLT5yZXNwb25zZV9jb2RlID0gKHNlbnNlX2J1ZmZlclswXSAmIDB4N2YpOworCisJaWYgKCFzY3NpX3NlbnNlX3ZhbGlkKHNzaGRyKSkKKwkJcmV0dXJuIDA7CisKIAlpZiAoc3NoZHItPnJlc3BvbnNlX2NvZGUgPj0gMHg3MikgewogCQkvKgogCQkgKiBkZXNjcmlwdG9yIGZvcm1hdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfaW9jdGwuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2lvY3RsLmMKaW5kZXggN2E2YjUzMC4uYjdmZGRhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfaW9jdGwuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9pb2N0bC5jCkBAIC0zMCwyMCArMzAsMjAgQEAKIAogI2RlZmluZSBNQVhfQlVGIFBBR0VfU0laRQogCi0vKgotICogSWYgd2UgYXJlIHRvbGQgdG8gcHJvYmUgYSBob3N0LCB3ZSB3aWxsIHJldHVybiAwIGlmICB0aGUgaG9zdCBpcyBub3QKLSAqIHByZXNlbnQsIDEgaWYgdGhlIGhvc3QgaXMgcHJlc2VudCwgYW5kIHdpbGwgcmV0dXJuIGFuIGlkZW50aWZ5aW5nCi0gKiBzdHJpbmcgYXQgKmFyZywgaWYgYXJnIGlzIG5vbiBudWxsLCBmaWxsaW5nIHRvIHRoZSBsZW5ndGggc3RvcmVkIGF0Ci0gKiAoaW50ICopIGFyZworLyoqCisgKiBpb2N0bF9wcm9iZSAgLS0gIHJldHVybiBob3N0IGlkZW50aWZpY2F0aW9uCisgKiBAaG9zdDoJaG9zdCB0byBpZGVudGlmeQorICogQGJ1ZmZlcjoJdXNlcnNwYWNlIGJ1ZmZlciBmb3IgaWRlbnRpZmljYXRpb24KKyAqCisgKiBSZXR1cm4gYW4gaWRlbnRpZnlpbmcgc3RyaW5nIGF0IEBidWZmZXIsIGlmIEBidWZmZXIgaXMgbm9uLU5VTEwsIGZpbGxpbmcKKyAqIHRvIHRoZSBsZW5ndGggc3RvcmVkIGF0ICogKGludCAqKSBAYnVmZmVyLgogICovCi0KIHN0YXRpYyBpbnQgaW9jdGxfcHJvYmUoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgdm9pZCBfX3VzZXIgKmJ1ZmZlcikKIHsKIAl1bnNpZ25lZCBpbnQgbGVuLCBzbGVuOwogCWNvbnN0IGNoYXIgKnN0cmluZzsKLQlpbnQgdGVtcCA9IGhvc3QtPmhvc3R0LT5wcmVzZW50OwogCi0JaWYgKHRlbXAgJiYgYnVmZmVyKSB7CisJaWYgKGJ1ZmZlcikgewogCQlpZiAoZ2V0X3VzZXIobGVuLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBidWZmZXIpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTU5LDcgKzU5LDcgQEAKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCX0KLQlyZXR1cm4gdGVtcDsKKwlyZXR1cm4gMTsKIH0KIAogLyoKQEAgLTg4LDI1ICs4OCwxOCBAQAogc3RhdGljIGludCBpb2N0bF9pbnRlcm5hbF9jb21tYW5kKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgY2hhciAqY21kLAogCQkJCSAgaW50IHRpbWVvdXQsIGludCByZXRyaWVzKQogewotCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXE7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CiAKIAlTQ1NJX0xPR19JT0NUTCgxLCBwcmludGsoIlRyeWluZyBpb2N0bCB3aXRoIHNjc2kgY29tbWFuZCAlZFxuIiwgKmNtZCkpOwogCi0Jc3JlcSA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZGV2LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNyZXEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU0NTSSBpbnRlcm5hbCBpb2N0bCBmYWlsZWQsIG5vIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlyZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkZXYsIGNtZCwgRE1BX05PTkUsIE5VTEwsIDAsCisJCQkJICAmc3NoZHIsIHRpbWVvdXQsIHJldHJpZXMpOwogCi0Jc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKLSAgICAgICAgc2NzaV93YWl0X3JlcShzcmVxLCBjbWQsIE5VTEwsIDAsIHRpbWVvdXQsIHJldHJpZXMpOworCVNDU0lfTE9HX0lPQ1RMKDIsIHByaW50aygiSW9jdGwgcmV0dXJuZWQgIDB4JXhcbiIsIHJlc3VsdCkpOwogCi0JU0NTSV9MT0dfSU9DVEwoMiwgcHJpbnRrKCJJb2N0bCByZXR1cm5lZCAgMHgleFxuIiwgc3JlcS0+c3JfcmVzdWx0KSk7Ci0KLQlpZiAoKGRyaXZlcl9ieXRlKHNyZXEtPnNyX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpICYmCi0JICAgIChzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKHNyZXEsICZzc2hkcikpKSB7CisJaWYgKChkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX1NFTlNFKSAmJgorCSAgICAoc2NzaV9zZW5zZV92YWxpZCgmc3NoZHIpKSkgewogCQlzd2l0Y2ggKHNzaGRyLnNlbnNlX2tleSkgewogCQljYXNlIElMTEVHQUxfUkVRVUVTVDoKIAkJCWlmIChjbWRbMF0gPT0gQUxMT1dfTUVESVVNX1JFTU9WQUwpCkBAIC0xMjUsNyArMTE4LDcgQEAKIAkJY2FzZSBVTklUX0FUVEVOVElPTjoKIAkJCWlmIChzZGV2LT5yZW1vdmFibGUpIHsKIAkJCQlzZGV2LT5jaGFuZ2VkID0gMTsKLQkJCQlzcmVxLT5zcl9yZXN1bHQgPSAwOwkvKiBUaGlzIGlzIG5vIGxvbmdlciBjb25zaWRlcmVkIGFuIGVycm9yICovCisJCQkJcmVzdWx0ID0gMDsJLyogVGhpcyBpcyBubyBsb25nZXIgY29uc2lkZXJlZCBhbiBlcnJvciAqLwogCQkJCWJyZWFrOwogCQkJfQogCQlkZWZhdWx0OgkvKiBGYWxsIHRocm91Z2ggZm9yIG5vbi1yZW1vdmFibGUgbWVkaWEgKi8KQEAgLTEzNSwxNSArMTI4LDEzIEBACiAJCQkgICAgICAgc2Rldi0+Y2hhbm5lbCwKIAkJCSAgICAgICBzZGV2LT5pZCwKIAkJCSAgICAgICBzZGV2LT5sdW4sCi0JCQkgICAgICAgc3JlcS0+c3JfcmVzdWx0KTsKLQkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCIgICAiLCBzcmVxKTsKKwkJCSAgICAgICByZXN1bHQpOworCQkJc2NzaV9wcmludF9zZW5zZV9oZHIoIiAgICIsICZzc2hkcik7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCXJlc3VsdCA9IHNyZXEtPnNyX3Jlc3VsdDsKIAlTQ1NJX0xPR19JT0NUTCgyLCBwcmludGsoIklPQ1RMIFJlbGVhc2luZyBjb21tYW5kXG4iKSk7Ci0Jc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjA4LDggKzE5OSw4IEBACiB7CiAJY2hhciAqYnVmOwogCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgc2Vuc2VbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKIAljaGFyIF9fdXNlciAqY21kX2luOwotCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXE7CiAJdW5zaWduZWQgY2hhciBvcGNvZGU7CiAJdW5zaWduZWQgaW50IGlubGVuLCBvdXRsZW4sIGNtZGxlbjsKIAl1bnNpZ25lZCBpbnQgbmVlZGVkLCBidWZfbmVlZGVkOwpAQCAtMzIxLDMxICszMTIsMjMgQEAKIAkJYnJlYWs7CiAJfQogCi0Jc3JlcSA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZGV2LCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKCFzcmVxKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gLUVJTlRSOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLQotCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gZGF0YV9kaXJlY3Rpb247Ci0gICAgICAgIHNjc2lfd2FpdF9yZXEoc3JlcSwgY21kLCBidWYsIG5lZWRlZCwgdGltZW91dCwgcmV0cmllcyk7CisJcmVzdWx0ID0gc2NzaV9leGVjdXRlKHNkZXYsIGNtZCwgZGF0YV9kaXJlY3Rpb24sIGJ1ZiwgbmVlZGVkLAorCQkJICAgICAgc2Vuc2UsIHRpbWVvdXQsIHJldHJpZXMsIDApOwogCiAJLyogCiAJICogSWYgdGhlcmUgd2FzIGFuIGVycm9yIGNvbmRpdGlvbiwgcGFzcyB0aGUgaW5mbyBiYWNrIHRvIHRoZSB1c2VyLiAKIAkgKi8KLQlyZXN1bHQgPSBzcmVxLT5zcl9yZXN1bHQ7CiAJaWYgKHJlc3VsdCkgewotCQlpbnQgc2JfbGVuID0gc2l6ZW9mKHNyZXEtPnNyX3NlbnNlX2J1ZmZlcik7CisJCWludCBzYl9sZW4gPSBzaXplb2YoKnNlbnNlKTsKIAogCQlzYl9sZW4gPSAoc2JfbGVuID4gT01BWF9TQl9MRU4pID8gT01BWF9TQl9MRU4gOiBzYl9sZW47Ci0JCWlmIChjb3B5X3RvX3VzZXIoY21kX2luLCBzcmVxLT5zcl9zZW5zZV9idWZmZXIsIHNiX2xlbikpCisJCWlmIChjb3B5X3RvX3VzZXIoY21kX2luLCBzZW5zZSwgc2JfbGVuKSkKIAkJCXJlc3VsdCA9IC1FRkFVTFQ7CiAJfSBlbHNlIHsKIAkJaWYgKGNvcHlfdG9fdXNlcihjbWRfaW4sIGJ1Ziwgb3V0bGVuKSkKIAkJCXJlc3VsdCA9IC1FRkFVTFQ7CiAJfQkKIAotCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOwogZXJyb3I6CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmVzdWx0OwpAQCAtNDc1LDggKzQ1OCw3IEBACiAJICogZXJyb3IgcHJvY2Vzc2luZywgYXMgbG9uZyBhcyB0aGUgZGV2aWNlIHdhcyBvcGVuZWQKIAkgKiBub24tYmxvY2tpbmcgKi8KIAlpZiAoZmlscCAmJiBmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQlpZiAodGVzdF9iaXQoU0hPU1RfUkVDT1ZFUlksCi0JCQkgICAgICZzZGV2LT5ob3N0LT5zaG9zdF9zdGF0ZSkpCisJCWlmIChzZGV2LT5ob3N0LT5zaG9zdF9zdGF0ZSA9PSBTSE9TVF9SRUNPVkVSWSkKIAkJCXJldHVybiAtRU5PREVWOwogCX0gZWxzZSBpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzZGV2KSkKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCmluZGV4IDdhOTFjYTMuLjc3ZjJkNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC0yMzIsMjMgKzIzMiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfZG9fcmVxKTsKIAotc3RhdGljIHZvaWQgc2NzaV93YWl0X2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kKQotewotCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBjbWQtPnJlcXVlc3Q7Ci0Jc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBjbWQtPmRldmljZS0+cmVxdWVzdF9xdWV1ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcmVxLT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0RPTkU7CS8qIEJ1c3ksIGJ1dCBpbmRpY2F0ZSByZXF1ZXN0IGRvbmUgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQlpZiAoYmxrX3JxX3RhZ2dlZChyZXEpKQotCQlibGtfcXVldWVfZW5kX3RhZyhxLCByZXEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKHJlcS0+d2FpdGluZykKLQkJY29tcGxldGUocmVxLT53YWl0aW5nKTsKLX0KLQogLyogVGhpcyBpcyB0aGUgZW5kIHJvdXRpbmUgd2UgZ2V0IHRvIGlmIGEgY29tbWFuZCB3YXMgbmV2ZXIgYXR0YWNoZWQKICAqIHRvIHRoZSByZXF1ZXN0LiAgU2ltcGx5IGNvbXBsZXRlIHRoZSByZXF1ZXN0IHdpdGhvdXQgY2hhbmdpbmcKICAqIHJxX3N0YXR1czsgdGhpcyB3aWxsIGNhdXNlIGEgRFJJVkVSX0VSUk9SLiAqLwpAQCAtMjYzLDIxICsyNDYsMTE0IEBACiAJCSAgIHVuc2lnbmVkIGJ1ZmZsZW4sIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcykKIHsKIAlERUNMQVJFX0NPTVBMRVRJT04od2FpdCk7Ci0JCi0Jc3JlcS0+c3JfcmVxdWVzdC0+d2FpdGluZyA9ICZ3YWl0OwotCXNyZXEtPnNyX3JlcXVlc3QtPnJxX3N0YXR1cyA9IFJRX1NDU0lfQlVTWTsKLQlzcmVxLT5zcl9yZXF1ZXN0LT5lbmRfaW8gPSBzY3NpX3dhaXRfcmVxX2VuZF9pbzsKLQlzY3NpX2RvX3JlcShzcmVxLCBjbW5kLCBidWZmZXIsIGJ1ZmZsZW4sIHNjc2lfd2FpdF9kb25lLAotCQkJdGltZW91dCwgcmV0cmllcyk7CisJaW50IHdyaXRlID0gKHNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpOworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisKKwlyZXEgPSBibGtfZ2V0X3JlcXVlc3Qoc3JlcS0+c3JfZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLCB3cml0ZSwKKwkJCSAgICAgIF9fR0ZQX1dBSVQpOworCWlmIChidWZmbGVuICYmIGJsa19ycV9tYXBfa2VybihzcmVxLT5zcl9kZXZpY2UtPnJlcXVlc3RfcXVldWUsIHJlcSwKKwkJCQkgICAgICAgYnVmZmVyLCBidWZmbGVuLCBfX0dGUF9XQUlUKSkgeworCQlzcmVxLT5zcl9yZXN1bHQgPSBEUklWRVJfRVJST1IgPDwgMjQ7CisJCWJsa19wdXRfcmVxdWVzdChyZXEpOworCQlyZXR1cm47CisJfQorCisJcmVxLT5mbGFncyB8PSBSRVFfTk9NRVJHRTsKKwlyZXEtPndhaXRpbmcgPSAmd2FpdDsKKwlyZXEtPmVuZF9pbyA9IHNjc2lfd2FpdF9yZXFfZW5kX2lvOworCXJlcS0+Y21kX2xlbiA9IENPTU1BTkRfU0laRSgoKHU4ICopY21uZClbMF0pOworCXJlcS0+c2Vuc2UgPSBzcmVxLT5zcl9zZW5zZV9idWZmZXI7CisJcmVxLT5zZW5zZV9sZW4gPSAwOworCW1lbWNweShyZXEtPmNtZCwgY21uZCwgcmVxLT5jbWRfbGVuKTsKKwlyZXEtPnRpbWVvdXQgPSB0aW1lb3V0OworCXJlcS0+ZmxhZ3MgfD0gUkVRX0JMT0NLX1BDOworCXJlcS0+cnFfZGlzayA9IE5VTEw7CisJYmxrX2luc2VydF9yZXF1ZXN0KHNyZXEtPnNyX2RldmljZS0+cmVxdWVzdF9xdWV1ZSwgcmVxLAorCQkJICAgc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSwgTlVMTCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7CiAJc3JlcS0+c3JfcmVxdWVzdC0+d2FpdGluZyA9IE5VTEw7Ci0JaWYgKHNyZXEtPnNyX3JlcXVlc3QtPnJxX3N0YXR1cyAhPSBSUV9TQ1NJX0RPTkUpCisJc3JlcS0+c3JfcmVzdWx0ID0gcmVxLT5lcnJvcnM7CisJaWYgKHJlcS0+ZXJyb3JzKQogCQlzcmVxLT5zcl9yZXN1bHQgfD0gKERSSVZFUl9FUlJPUiA8PCAyNCk7CiAKLQlfX3Njc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOworCWJsa19wdXRfcmVxdWVzdChyZXEpOwogfQorCiBFWFBPUlRfU1lNQk9MKHNjc2lfd2FpdF9yZXEpOwogCisvKioKKyAqIHNjc2lfZXhlY3V0ZSAtIGluc2VydCByZXF1ZXN0IGFuZCB3YWl0IGZvciB0aGUgcmVzdWx0CisgKiBAc2RldjoJc2NzaSBkZXZpY2UKKyAqIEBjbWQ6CXNjc2kgY29tbWFuZAorICogQGRhdGFfZGlyZWN0aW9uOiBkYXRhIGRpcmVjdGlvbgorICogQGJ1ZmZlcjoJZGF0YSBidWZmZXIKKyAqIEBidWZmbGVuOglsZW4gb2YgYnVmZmVyCisgKiBAc2Vuc2U6CW9wdGlvbmFsIHNlbnNlIGJ1ZmZlcgorICogQHRpbWVvdXQ6CXJlcXVlc3QgdGltZW91dCBpbiBzZWNvbmRzCisgKiBAcmV0cmllczoJbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IHJlcXVlc3QKKyAqIEBmbGFnczoJb3IgaW50byByZXF1ZXN0IGZsYWdzOworICoKKyAqIHJldHVybnMgdGhlIHJlcS0+ZXJyb3JzIHZhbHVlIHdoaWNoIGlzIHRoZSB0aGUgc2NzaV9jbW5kIHJlc3VsdAorICogZmllbGQuCisgKiovCitpbnQgc2NzaV9leGVjdXRlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgY29uc3QgdW5zaWduZWQgY2hhciAqY21kLAorCQkgaW50IGRhdGFfZGlyZWN0aW9uLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1ZmZsZW4sCisJCSB1bnNpZ25lZCBjaGFyICpzZW5zZSwgaW50IHRpbWVvdXQsIGludCByZXRyaWVzLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKwlpbnQgd3JpdGUgPSAoZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSk7CisJaW50IHJldCA9IERSSVZFUl9FUlJPUiA8PCAyNDsKKworCXJlcSA9IGJsa19nZXRfcmVxdWVzdChzZGV2LT5yZXF1ZXN0X3F1ZXVlLCB3cml0ZSwgX19HRlBfV0FJVCk7CisKKwlpZiAoYnVmZmxlbiAmJglibGtfcnFfbWFwX2tlcm4oc2Rldi0+cmVxdWVzdF9xdWV1ZSwgcmVxLAorCQkJCQlidWZmZXIsIGJ1ZmZsZW4sIF9fR0ZQX1dBSVQpKQorCQlnb3RvIG91dDsKKworCXJlcS0+Y21kX2xlbiA9IENPTU1BTkRfU0laRShjbWRbMF0pOworCW1lbWNweShyZXEtPmNtZCwgY21kLCByZXEtPmNtZF9sZW4pOworCXJlcS0+c2Vuc2UgPSBzZW5zZTsKKwlyZXEtPnNlbnNlX2xlbiA9IDA7CisJcmVxLT50aW1lb3V0ID0gdGltZW91dDsKKwlyZXEtPmZsYWdzIHw9IGZsYWdzIHwgUkVRX0JMT0NLX1BDIHwgUkVRX1NQRUNJQUwgfCBSRVFfUVVJRVQ7CisKKwkvKgorCSAqIGhlYWQgaW5qZWN0aW9uICpyZXF1aXJlZCogaGVyZSBvdGhlcndpc2UgcXVpZXNjZSB3b24ndCB3b3JrCisJICovCisJYmxrX2V4ZWN1dGVfcnEocmVxLT5xLCBOVUxMLCByZXEsIDEpOworCisJcmV0ID0gcmVxLT5lcnJvcnM7Cisgb3V0OgorCWJsa19wdXRfcmVxdWVzdChyZXEpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9leGVjdXRlKTsKKworCitpbnQgc2NzaV9leGVjdXRlX3JlcShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtZCwKKwkJICAgICBpbnQgZGF0YV9kaXJlY3Rpb24sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgYnVmZmxlbiwKKwkJICAgICBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKnNzaGRyLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMpCit7CisJY2hhciAqc2Vuc2UgPSBOVUxMOworCWludCByZXN1bHQ7CisJCisJaWYgKHNzaGRyKSB7CisJCXNlbnNlID0ga21hbGxvYyhTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoIXNlbnNlKQorCQkJcmV0dXJuIERSSVZFUl9FUlJPUiA8PCAyNDsKKwkJbWVtc2V0KHNlbnNlLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCX0KKwlyZXN1bHQgPSBzY3NpX2V4ZWN1dGUoc2RldiwgY21kLCBkYXRhX2RpcmVjdGlvbiwgYnVmZmVyLCBidWZmbGVuLAorCQkJCSAgc2Vuc2UsIHRpbWVvdXQsIHJldHJpZXMsIDApOworCWlmIChzc2hkcikKKwkJc2NzaV9ub3JtYWxpemVfc2Vuc2Uoc2Vuc2UsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwgc3NoZHIpOworCisJa2ZyZWUoc2Vuc2UpOworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZXhlY3V0ZV9yZXEpOworCiAvKgogICogRnVuY3Rpb246ICAgIHNjc2lfaW5pdF9jbWRfZXJyaCgpCiAgKgpAQCAtMzQ4LDcgKzQyNCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJc2hvc3QtPmhvc3RfYnVzeS0tOwotCWlmICh1bmxpa2VseSh0ZXN0X2JpdChTSE9TVF9SRUNPVkVSWSwgJnNob3N0LT5zaG9zdF9zdGF0ZSkgJiYKKwlpZiAodW5saWtlbHkoKHNob3N0LT5zaG9zdF9zdGF0ZSA9PSBTSE9TVF9SRUNPVkVSWSkgJiYKIAkJICAgICBzaG9zdC0+aG9zdF9mYWlsZWQpKQogCQlzY3NpX2VoX3dha2V1cChzaG9zdCk7CiAJc3Bpbl91bmxvY2soc2hvc3QtPmhvc3RfbG9jayk7CkBAIC04NTEsMTcgKzkyNywyMCBAQAogCQkJCXNjc2lfcmVxdWV1ZV9jb21tYW5kKHEsIGNtZCk7CiAJCQkJcmV0dXJuOwogCQkJfQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRGV2aWNlICVzIG5vdCByZWFkeS5cbiIsCi0JCQkgICAgICAgcmVxLT5ycV9kaXNrID8gcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUgOiAiIik7CisJCQlpZiAoIShyZXEtPmZsYWdzICYgUkVRX1FVSUVUKSkKKwkJCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywKKwkJCQkJICAgJmNtZC0+ZGV2aWNlLT5zZGV2X2dlbmRldiwKKwkJCQkJICAgIkRldmljZSBub3QgcmVhZHkuXG4iKTsKIAkJCWNtZCA9IHNjc2lfZW5kX3JlcXVlc3QoY21kLCAwLCB0aGlzX2NvdW50LCAxKTsKIAkJCXJldHVybjsKIAkJY2FzZSBWT0xVTUVfT1ZFUkZMT1c6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJWb2x1bWUgb3ZlcmZsb3cgPCVkICVkICVkICVkPiBDREI6ICIsCi0JCQkgICAgICAgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sCi0JCQkgICAgICAgKGludCljbWQtPmRldmljZS0+Y2hhbm5lbCwKLQkJCSAgICAgICAoaW50KWNtZC0+ZGV2aWNlLT5pZCwgKGludCljbWQtPmRldmljZS0+bHVuKTsKLQkJCV9fc2NzaV9wcmludF9jb21tYW5kKGNtZC0+ZGF0YV9jbW5kKTsKLQkJCXNjc2lfcHJpbnRfc2Vuc2UoIiIsIGNtZCk7CisJCQlpZiAoIShyZXEtPmZsYWdzICYgUkVRX1FVSUVUKSkgeworCQkJCWRldl9wcmludGsoS0VSTl9JTkZPLAorCQkJCQkgICAmY21kLT5kZXZpY2UtPnNkZXZfZ2VuZGV2LAorCQkJCQkgICAiVm9sdW1lIG92ZXJmbG93LCBDREI6ICIpOworCQkJCV9fc2NzaV9wcmludF9jb21tYW5kKGNtZC0+ZGF0YV9jbW5kKTsKKwkJCQlzY3NpX3ByaW50X3NlbnNlKCIiLCBjbWQpOworCQkJfQogCQkJY21kID0gc2NzaV9lbmRfcmVxdWVzdChjbWQsIDAsIGJsb2NrX2J5dGVzLCAxKTsKIAkJCXJldHVybjsKIAkJZGVmYXVsdDoKQEAgLTg3OCwxNCArOTU3LDEzIEBACiAJCXJldHVybjsKIAl9CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9JTkZPICJTQ1NJIGVycm9yIDogPCVkICVkICVkICVkPiByZXR1cm4gY29kZSAiCi0JCSAgICAgICAiPSAweCV4XG4iLCBjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9ubywKLQkJICAgICAgIGNtZC0+ZGV2aWNlLT5jaGFubmVsLAotCQkgICAgICAgY21kLT5kZXZpY2UtPmlkLAotCQkgICAgICAgY21kLT5kZXZpY2UtPmx1biwgcmVzdWx0KTsKKwkJaWYgKCEocmVxLT5mbGFncyAmIFJFUV9RVUlFVCkpIHsKKwkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmY21kLT5kZXZpY2UtPnNkZXZfZ2VuZGV2LAorCQkJCSAgICJTQ1NJIGVycm9yOiByZXR1cm4gY29kZSA9IDB4JXhcbiIsIHJlc3VsdCk7CiAKLQkJaWYgKGRyaXZlcl9ieXRlKHJlc3VsdCkgJiBEUklWRVJfU0VOU0UpCi0JCQlzY3NpX3ByaW50X3NlbnNlKCIiLCBjbWQpOworCQkJaWYgKGRyaXZlcl9ieXRlKHJlc3VsdCkgJiBEUklWRVJfU0VOU0UpCisJCQkJc2NzaV9wcmludF9zZW5zZSgiIiwgY21kKTsKKwkJfQogCQkvKgogCQkgKiBNYXJrIGEgc2luZ2xlIGJ1ZmZlciBhcyBub3QgdXB0b2RhdGUuICBRdWV1ZSB0aGUgcmVtYWluZGVyLgogCQkgKiBXZSBzb21ldGltZXMgZ2V0IHRoaXMgY3J1ZnQgaW4gdGhlIGV2ZW50IHRoYXQgYSBtZWRpdW0gZXJyb3IKQEAgLTEwMjAsNiArMTA5OCwxMiBAQAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAorc3RhdGljIHZvaWQgc2NzaV9nZW5lcmljX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCUJVR19PTighYmxrX3BjX3JlcXVlc3QoY21kLT5yZXF1ZXN0KSk7CisJc2NzaV9pb19jb21wbGV0aW9uKGNtZCwgY21kLT5yZXN1bHQgPT0gMCA/IGNtZC0+YnVmZmxlbiA6IDAsIDApOworfQorCiBzdGF0aWMgaW50IHNjc2lfcHJlcF9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBxLT5xdWV1ZWRhdGE7CkBAIC0xMDYxLDcgKzExNDUsNyBAQAogCSAqIHRoZXNlIHR3byBjYXNlcyBkaWZmZXJlbnRseS4gIFdlIGRpZmZlcmVudGlhdGUgYnkgbG9va2luZwogCSAqIGF0IHJlcXVlc3QtPmNtZCwgYXMgdGhpcyB0ZWxscyB1cyB0aGUgcmVhbCBzdG9yeS4KIAkgKi8KLQlpZiAocmVxLT5mbGFncyAmIFJFUV9TUEVDSUFMKSB7CisJaWYgKHJlcS0+ZmxhZ3MgJiBSRVFfU1BFQ0lBTCAmJiByZXEtPnNwZWNpYWwpIHsKIAkJc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSA9IHJlcS0+c3BlY2lhbDsKIAogCQlpZiAoc3JlcS0+c3JfbWFnaWMgPT0gU0NTSV9SRVFfTUFHSUMpIHsKQEAgLTEwNzMsNyArMTE1Nyw3IEBACiAJCQljbWQgPSByZXEtPnNwZWNpYWw7CiAJfSBlbHNlIGlmIChyZXEtPmZsYWdzICYgKFJFUV9DTUQgfCBSRVFfQkxPQ0tfUEMpKSB7CiAKLQkJaWYodW5saWtlbHkoc3BlY2lhbHNfb25seSkpIHsKKwkJaWYodW5saWtlbHkoc3BlY2lhbHNfb25seSkgJiYgIShyZXEtPmZsYWdzICYgUkVRX1NQRUNJQUwpKSB7CiAJCQlpZihzcGVjaWFsc19vbmx5ID09IFNERVZfUVVJRVNDRSB8fAogCQkJCQlzcGVjaWFsc19vbmx5ID09IFNERVZfQkxPQ0spCiAJCQkJcmV0dXJuIEJMS1BSRVBfREVGRVI7CkBAIC0xMTQyLDExICsxMjI2LDI2IEBACiAJCS8qCiAJCSAqIEluaXRpYWxpemUgdGhlIGFjdHVhbCBTQ1NJIGNvbW1hbmQgZm9yIHRoaXMgcmVxdWVzdC4KIAkJICovCi0JCWRydiA9ICooc3RydWN0IHNjc2lfZHJpdmVyICoqKXJlcS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOwotCQlpZiAodW5saWtlbHkoIWRydi0+aW5pdF9jb21tYW5kKGNtZCkpKSB7Ci0JCQlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOwotCQkJc2NzaV9wdXRfY29tbWFuZChjbWQpOwotCQkJcmV0dXJuIEJMS1BSRVBfS0lMTDsKKwkJaWYgKHJlcS0+cnFfZGlzaykgeworCQkJZHJ2ID0gKihzdHJ1Y3Qgc2NzaV9kcml2ZXIgKiopcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJCQlpZiAodW5saWtlbHkoIWRydi0+aW5pdF9jb21tYW5kKGNtZCkpKSB7CisJCQkJc2NzaV9yZWxlYXNlX2J1ZmZlcnMoY21kKTsKKwkJCQlzY3NpX3B1dF9jb21tYW5kKGNtZCk7CisJCQkJcmV0dXJuIEJMS1BSRVBfS0lMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW1lbWNweShjbWQtPmNtbmQsIHJlcS0+Y21kLCBzaXplb2YoY21kLT5jbW5kKSk7CisJCQlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBXUklURSkKKwkJCQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKwkJCWVsc2UgaWYgKHJlcS0+ZGF0YV9sZW4pCisJCQkJY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwkJCWVsc2UKKwkJCQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisJCQkKKwkJCWNtZC0+dHJhbnNmZXJzaXplID0gcmVxLT5kYXRhX2xlbjsKKwkJCWNtZC0+YWxsb3dlZCA9IDM7CisJCQljbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgPSByZXEtPnRpbWVvdXQ7CisJCQljbWQtPmRvbmUgPSBzY3NpX2dlbmVyaWNfZG9uZTsKIAkJfQogCX0KIApAQCAtMTIwNyw3ICsxMzA2LDcgQEAKIAkJCQkgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKIAkJCQkgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7Ci0JaWYgKHRlc3RfYml0KFNIT1NUX1JFQ09WRVJZLCAmc2hvc3QtPnNob3N0X3N0YXRlKSkKKwlpZiAoc2hvc3QtPnNob3N0X3N0YXRlID09IFNIT1NUX1JFQ09WRVJZKQogCQlyZXR1cm4gMDsKIAlpZiAoc2hvc3QtPmhvc3RfYnVzeSA9PSAwICYmIHNob3N0LT5ob3N0X2Jsb2NrZWQpIHsKIAkJLyoKQEAgLTE1MzksOSArMTYzOCw5IEBACiAJfQogfQogLyoqCi0gKglfX3Njc2lfbW9kZV9zZW5zZSAtIGlzc3VlIGEgbW9kZSBzZW5zZSwgZmFsbGluZyBiYWNrIGZyb20gMTAgdG8gCisgKglzY3NpX21vZGVfc2Vuc2UgLSBpc3N1ZSBhIG1vZGUgc2Vuc2UsIGZhbGxpbmcgYmFjayBmcm9tIDEwIHRvIAogICoJCXNpeCBieXRlcyBpZiBuZWNlc3NhcnkuCi0gKglAc3JlcToJU0NTSSByZXF1ZXN0IHRvIGZpbGwgaW4gd2l0aCB0aGUgTU9ERV9TRU5TRQorICoJQHNkZXY6CVNDU0kgZGV2aWNlIHRvIGJlIHF1ZXJpZWQKICAqCUBkYmQ6CXNldCBpZiBtb2RlIHNlbnNlIHdpbGwgYWxsb3cgYmxvY2sgZGVzY3JpcHRvcnMgdG8gYmUgcmV0dXJuZWQKICAqCUBtb2RlcGFnZTogbW9kZSBwYWdlIGJlaW5nIHJlcXVlc3RlZAogICoJQGJ1ZmZlcjogcmVxdWVzdCBidWZmZXIgKG1heSBub3QgYmUgc21hbGxlciB0aGFuIGVpZ2h0IGJ5dGVzKQpAQCAtMTU0OSwyNiArMTY0OCwzNCBAQAogICoJQHRpbWVvdXQ6IGNvbW1hbmQgdGltZW91dAogICoJQHJldHJpZXM6IG51bWJlciBvZiByZXRyaWVzIGJlZm9yZSBmYWlsaW5nCiAgKglAZGF0YTogcmV0dXJucyBhIHN0cnVjdHVyZSBhYnN0cmFjdGluZyB0aGUgbW9kZSBoZWFkZXIgZGF0YQorICoJQHNlbnNlOiBwbGFjZSB0byBwdXQgc2Vuc2UgZGF0YSAob3IgTlVMTCBpZiBubyBzZW5zZSB0byBiZSBjb2xsZWN0ZWQpLgorICoJCW11c3QgYmUgU0NTSV9TRU5TRV9CVUZGRVJTSVpFIGJpZy4KICAqCiAgKglSZXR1cm5zIHplcm8gaWYgdW5zdWNjZXNzZnVsLCBvciB0aGUgaGVhZGVyIG9mZnNldCAoZWl0aGVyIDQKICAqCW9yIDggZGVwZW5kaW5nIG9uIHdoZXRoZXIgYSBzaXggb3IgdGVuIGJ5dGUgY29tbWFuZCB3YXMKICAqCWlzc3VlZCkgaWYgc3VjY2Vzc2Z1bC4KICAqKi8KIGludAotX19zY3NpX21vZGVfc2Vuc2Uoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgaW50IGRiZCwgaW50IG1vZGVwYWdlLAorc2NzaV9tb2RlX3NlbnNlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IGRiZCwgaW50IG1vZGVwYWdlLAogCQkgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwgaW50IHRpbWVvdXQsIGludCByZXRyaWVzLAotCQkgIHN0cnVjdCBzY3NpX21vZGVfZGF0YSAqZGF0YSkgeworCQkgIHN0cnVjdCBzY3NpX21vZGVfZGF0YSAqZGF0YSwgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkcikgewogCXVuc2lnbmVkIGNoYXIgY21kWzEyXTsKIAlpbnQgdXNlXzEwX2Zvcl9tczsKIAlpbnQgaGVhZGVyX2xlbmd0aDsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBteV9zc2hkcjsKIAogCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKIAltZW1zZXQoJmNtZFswXSwgMCwgMTIpOwogCWNtZFsxXSA9IGRiZCAmIDB4MTg7CS8qIGFsbG93cyBEQkQgYW5kIExMQkEgYml0cyAqLwogCWNtZFsyXSA9IG1vZGVwYWdlOwogCisJLyogY2FsbGVyIG1pZ2h0IG5vdCBiZSBpbnRlcmVzdGVkIGluIHNlbnNlLCBidXQgd2UgbmVlZCBpdCAqLworCWlmICghc3NoZHIpCisJCXNzaGRyID0gJm15X3NzaGRyOworCiAgcmV0cnk6Ci0JdXNlXzEwX2Zvcl9tcyA9IHNyZXEtPnNyX2RldmljZS0+dXNlXzEwX2Zvcl9tczsKKwl1c2VfMTBfZm9yX21zID0gc2Rldi0+dXNlXzEwX2Zvcl9tczsKIAogCWlmICh1c2VfMTBfZm9yX21zKSB7CiAJCWlmIChsZW4gPCA4KQpAQCAtMTU4NiwzNiArMTY5MywzMSBAQAogCQloZWFkZXJfbGVuZ3RoID0gNDsKIAl9CiAKLQlzcmVxLT5zcl9jbWRfbGVuID0gMDsKLQltZW1zZXQoc3JlcS0+c3Jfc2Vuc2VfYnVmZmVyLCAwLCBzaXplb2Yoc3JlcS0+c3Jfc2Vuc2VfYnVmZmVyKSk7Ci0Jc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7Ci0KIAltZW1zZXQoYnVmZmVyLCAwLCBsZW4pOwogCi0Jc2NzaV93YWl0X3JlcShzcmVxLCBjbWQsIGJ1ZmZlciwgbGVuLCB0aW1lb3V0LCByZXRyaWVzKTsKKwlyZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkZXYsIGNtZCwgRE1BX0ZST01fREVWSUNFLCBidWZmZXIsIGxlbiwKKwkJCQkgIHNzaGRyLCB0aW1lb3V0LCByZXRyaWVzKTsKIAogCS8qIFRoaXMgY29kZSBsb29rcyBhd2Z1bDogd2hhdCBpdCdzIGRvaW5nIGlzIG1ha2luZyBzdXJlIGFuCiAJICogSUxMRUdBTCBSRVFVRVNUIHNlbnNlIHJldHVybiBpZGVudGlmaWVzIHRoZSBhY3R1YWwgY29tbWFuZAogCSAqIGJ5dGUgYXMgdGhlIHByb2JsZW0uICBNT0RFX1NFTlNFIGNvbW1hbmRzIGNhbiByZXR1cm4KIAkgKiBJTExFR0FMIFJFUVVFU1QgaWYgdGhlIGNvZGUgcGFnZSBpc24ndCBzdXBwb3J0ZWQgKi8KIAotCWlmICh1c2VfMTBfZm9yX21zICYmICFzY3NpX3N0YXR1c19pc19nb29kKHNyZXEtPnNyX3Jlc3VsdCkgJiYKLQkgICAgKGRyaXZlcl9ieXRlKHNyZXEtPnNyX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpKSB7Ci0JCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKLQotCQlpZiAoc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShzcmVxLCAmc3NoZHIpKSB7Ci0JCQlpZiAoKHNzaGRyLnNlbnNlX2tleSA9PSBJTExFR0FMX1JFUVVFU1QpICYmCi0JCQkgICAgKHNzaGRyLmFzYyA9PSAweDIwKSAmJiAoc3NoZHIuYXNjcSA9PSAwKSkgeworCWlmICh1c2VfMTBfZm9yX21zICYmICFzY3NpX3N0YXR1c19pc19nb29kKHJlc3VsdCkgJiYKKwkgICAgKGRyaXZlcl9ieXRlKHJlc3VsdCkgJiBEUklWRVJfU0VOU0UpKSB7CisJCWlmIChzY3NpX3NlbnNlX3ZhbGlkKHNzaGRyKSkgeworCQkJaWYgKChzc2hkci0+c2Vuc2Vfa2V5ID09IElMTEVHQUxfUkVRVUVTVCkgJiYKKwkJCSAgICAoc3NoZHItPmFzYyA9PSAweDIwKSAmJiAoc3NoZHItPmFzY3EgPT0gMCkpIHsKIAkJCQkvKiAKIAkJCQkgKiBJbnZhbGlkIGNvbW1hbmQgb3BlcmF0aW9uIGNvZGUKIAkJCQkgKi8KLQkJCQlzcmVxLT5zcl9kZXZpY2UtPnVzZV8xMF9mb3JfbXMgPSAwOworCQkJCXNkZXYtPnVzZV8xMF9mb3JfbXMgPSAwOwogCQkJCWdvdG8gcmV0cnk7CiAJCQl9CiAJCX0KIAl9CiAKLQlpZihzY3NpX3N0YXR1c19pc19nb29kKHNyZXEtPnNyX3Jlc3VsdCkpIHsKKwlpZihzY3NpX3N0YXR1c19pc19nb29kKHJlc3VsdCkpIHsKIAkJZGF0YS0+aGVhZGVyX2xlbmd0aCA9IGhlYWRlcl9sZW5ndGg7CiAJCWlmKHVzZV8xMF9mb3JfbXMpIHsKIAkJCWRhdGEtPmxlbmd0aCA9IGJ1ZmZlclswXSoyNTYgKyBidWZmZXJbMV0gKyAyOwpAQCAtMTYzMiw3MyArMTczNCwzMSBAQAogCQl9CiAJfQogCi0JcmV0dXJuIHNyZXEtPnNyX3Jlc3VsdDsKLX0KLUVYUE9SVF9TWU1CT0woX19zY3NpX21vZGVfc2Vuc2UpOwotCi0vKioKLSAqCXNjc2lfbW9kZV9zZW5zZSAtIGlzc3VlIGEgbW9kZSBzZW5zZSwgZmFsbGluZyBiYWNrIGZyb20gMTAgdG8gCi0gKgkJc2l4IGJ5dGVzIGlmIG5lY2Vzc2FyeS4KLSAqCUBzZGV2OglzY3NpIGRldmljZSB0byBzZW5kIGNvbW1hbmQgdG8uCi0gKglAZGJkOglzZXQgaWYgbW9kZSBzZW5zZSB3aWxsIGRpc2FibGUgYmxvY2sgZGVzY3JpcHRvcnMgaW4gdGhlIHJldHVybgotICoJQG1vZGVwYWdlOiBtb2RlIHBhZ2UgYmVpbmcgcmVxdWVzdGVkCi0gKglAYnVmZmVyOiByZXF1ZXN0IGJ1ZmZlciAobWF5IG5vdCBiZSBzbWFsbGVyIHRoYW4gZWlnaHQgYnl0ZXMpCi0gKglAbGVuOglsZW5ndGggb2YgcmVxdWVzdCBidWZmZXIuCi0gKglAdGltZW91dDogY29tbWFuZCB0aW1lb3V0Ci0gKglAcmV0cmllczogbnVtYmVyIG9mIHJldHJpZXMgYmVmb3JlIGZhaWxpbmcKLSAqCi0gKglSZXR1cm5zIHplcm8gaWYgdW5zdWNjZXNzZnVsLCBvciB0aGUgaGVhZGVyIG9mZnNldCAoZWl0aGVyIDQKLSAqCW9yIDggZGVwZW5kaW5nIG9uIHdoZXRoZXIgYSBzaXggb3IgdGVuIGJ5dGUgY29tbWFuZCB3YXMKLSAqCWlzc3VlZCkgaWYgc3VjY2Vzc2Z1bC4KLSAqKi8KLWludAotc2NzaV9tb2RlX3NlbnNlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IGRiZCwgaW50IG1vZGVwYWdlLAotCQl1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW4sIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcywKLQkJc3RydWN0IHNjc2lfbW9kZV9kYXRhICpkYXRhKQotewotCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0tFUk5FTCk7Ci0JaW50IHJldDsKLQotCWlmICghc3JlcSkKLQkJcmV0dXJuIC0xOwotCi0JcmV0ID0gX19zY3NpX21vZGVfc2Vuc2Uoc3JlcSwgZGJkLCBtb2RlcGFnZSwgYnVmZmVyLCBsZW4sCi0JCQkJdGltZW91dCwgcmV0cmllcywgZGF0YSk7Ci0KLQlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHJlc3VsdDsKIH0KIEVYUE9SVF9TWU1CT0woc2NzaV9tb2RlX3NlbnNlKTsKIAogaW50CiBzY3NpX3Rlc3RfdW5pdF9yZWFkeShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcykKIHsKLQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOwogCWNoYXIgY21kW10gPSB7CiAJCVRFU1RfVU5JVF9SRUFEWSwgMCwgMCwgMCwgMCwgMCwKIAl9OworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKIAlpbnQgcmVzdWx0OwogCQotCXNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcmVxKQotCQlyZXR1cm4gLUVOT01FTTsKKwlyZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkZXYsIGNtZCwgRE1BX05PTkUsIE5VTEwsIDAsICZzc2hkciwKKwkJCQkgIHRpbWVvdXQsIHJldHJpZXMpOwogCi0Jc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKLQlzY3NpX3dhaXRfcmVxKHNyZXEsIGNtZCwgTlVMTCwgMCwgdGltZW91dCwgcmV0cmllcyk7CisJaWYgKChkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX1NFTlNFKSAmJiBzZGV2LT5yZW1vdmFibGUpIHsKIAotCWlmICgoZHJpdmVyX2J5dGUoc3JlcS0+c3JfcmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgJiYgc2Rldi0+cmVtb3ZhYmxlKSB7Ci0JCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKLQotCQlpZiAoKHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2Uoc3JlcSwgJnNzaGRyKSkgJiYKKwkJaWYgKChzY3NpX3NlbnNlX3ZhbGlkKCZzc2hkcikpICYmCiAJCSAgICAoKHNzaGRyLnNlbnNlX2tleSA9PSBVTklUX0FUVEVOVElPTikgfHwKIAkJICAgICAoc3NoZHIuc2Vuc2Vfa2V5ID09IE5PVF9SRUFEWSkpKSB7CiAJCQlzZGV2LT5jaGFuZ2VkID0gMTsKLQkJCXNyZXEtPnNyX3Jlc3VsdCA9IDA7CisJCQlyZXN1bHQgPSAwOwogCQl9CiAJfQotCXJlc3VsdCA9IHNyZXEtPnNyX3Jlc3VsdDsKLQlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogRVhQT1JUX1NZTUJPTChzY3NpX3Rlc3RfdW5pdF9yZWFkeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmggYi9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKaW5kZXggZDMwZDdmNC4uZWU2ZGUxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaApAQCAtNjMsNiArNjMsOSBAQAogZXh0ZXJuIHZvaWQgc2NzaV9leGl0X2RldmluZm8odm9pZCk7CiAKIC8qIHNjc2lfZXJyb3IuYyAqLworZXh0ZXJuIHZvaWQgc2NzaV9hZGRfdGltZXIoc3RydWN0IHNjc2lfY21uZCAqLCBpbnQsCisJCXZvaWQgKCopKHN0cnVjdCBzY3NpX2NtbmQgKikpOworZXh0ZXJuIGludCBzY3NpX2RlbGV0ZV90aW1lcihzdHJ1Y3Qgc2NzaV9jbW5kICopOwogZXh0ZXJuIHZvaWQgc2NzaV90aW1lc19vdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIGV4dGVybiBpbnQgc2NzaV9lcnJvcl9oYW5kbGVyKHZvaWQgKmhvc3QpOwogZXh0ZXJuIGludCBzY3NpX2RlY2lkZV9kaXNwb3NpdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCmluZGV4IDQ4ZWRkNjcuLjE5YzlhMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKQEAgLTExMSwxNSArMTExLDE0IEBACiAKIC8qKgogICogc2NzaV91bmxvY2tfZmxvcHRpY2FsIC0gdW5sb2NrIGRldmljZSB2aWEgYSBzcGVjaWFsIE1PREUgU0VOU0UgY29tbWFuZAotICogQHNyZXE6CXVzZWQgdG8gc2VuZCB0aGUgY29tbWFuZAorICogQHNkZXY6CXNjc2kgZGV2aWNlIHRvIHNlbmQgY29tbWFuZCB0bwogICogQHJlc3VsdDoJYXJlYSB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIHRoZSBNT0RFIFNFTlNFCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiAgICAgU2VuZCBhIHZlbmRvciBzcGVjaWZpYyBNT0RFIFNFTlNFIChub3QgYSBNT0RFIFNFTEVDVCkgY29tbWFuZCB1c2luZwotICogICAgIEBzcmVxIHRvIHVubG9jayBhIGRldmljZSwgc3RvcmluZyB0aGUgKHVudXNlZCkgcmVzdWx0cyBpbnRvIHJlc3VsdC4KKyAqICAgICBTZW5kIGEgdmVuZG9yIHNwZWNpZmljIE1PREUgU0VOU0UgKG5vdCBhIE1PREUgU0VMRUNUKSBjb21tYW5kLgogICogICAgIENhbGxlZCBmb3IgQkxJU1RfS0VZIGRldmljZXMuCiAgKiovCi1zdGF0aWMgdm9pZCBzY3NpX3VubG9ja19mbG9wdGljYWwoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwKK3N0YXRpYyB2b2lkIHNjc2lfdW5sb2NrX2Zsb3B0aWNhbChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCiAJCQkJICB1bnNpZ25lZCBjaGFyICpyZXN1bHQpCiB7CiAJdW5zaWduZWQgY2hhciBzY3NpX2NtZFtNQVhfQ09NTUFORF9TSVpFXTsKQEAgLTEyOSwxMSArMTI4LDEwIEBACiAJc2NzaV9jbWRbMV0gPSAwOwogCXNjc2lfY21kWzJdID0gMHgyZTsKIAlzY3NpX2NtZFszXSA9IDA7Ci0Jc2NzaV9jbWRbNF0gPSAweDJhOwkvKiBzaXplICovCisJc2NzaV9jbWRbNF0gPSAweDJhOyAgICAgLyogc2l6ZSAqLwogCXNjc2lfY21kWzVdID0gMDsKLQlzcmVxLT5zcl9jbWRfbGVuID0gMDsKLQlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKLQlzY3NpX3dhaXRfcmVxKHNyZXEsIHNjc2lfY21kLCByZXN1bHQsIDB4MmEgLyogc2l6ZSAqLywgU0NTSV9USU1FT1VULCAzKTsKKwlzY3NpX2V4ZWN1dGVfcmVxKHNkZXYsIHNjc2lfY21kLCBETUFfRlJPTV9ERVZJQ0UsIHJlc3VsdCwgMHgyYSwgTlVMTCwKKwkJCSBTQ1NJX1RJTUVPVVQsIDMpOwogfQogCiAvKioKQEAgLTQzMywyNiArNDMxLDI1IEBACiAKIC8qKgogICogc2NzaV9wcm9iZV9sdW4gLSBwcm9iZSBhIHNpbmdsZSBMVU4gdXNpbmcgYSBTQ1NJIElOUVVJUlkKLSAqIEBzcmVxOgl1c2VkIHRvIHNlbmQgdGhlIElOUVVJUlkKKyAqIEBzZGV2OglzY3NpX2RldmljZSB0byBwcm9iZQogICogQGlucV9yZXN1bHQ6CWFyZWEgdG8gc3RvcmUgdGhlIElOUVVJUlkgcmVzdWx0CisgKiBAcmVzdWx0X2xlbjogbGVuIG9mIGlucV9yZXN1bHQKICAqIEBiZmxhZ3M6CXN0b3JlIGFueSBiZmxhZ3MgZm91bmQgaGVyZQogICoKICAqIERlc2NyaXB0aW9uOgotICogICAgIFByb2JlIHRoZSBsdW4gYXNzb2NpYXRlZCB3aXRoIEBzcmVxIHVzaW5nIGEgc3RhbmRhcmQgU0NTSSBJTlFVSVJZOworICogICAgIFByb2JlIHRoZSBsdW4gYXNzb2NpYXRlZCB3aXRoIEByZXEgdXNpbmcgYSBzdGFuZGFyZCBTQ1NJIElOUVVJUlk7CiAgKgotICogICAgIElmIHRoZSBJTlFVSVJZIGlzIHN1Y2Nlc3NmdWwsIHNyZXEtPnNyX3Jlc3VsdCBpcyB6ZXJvIGFuZDogdGhlCisgKiAgICAgSWYgdGhlIElOUVVJUlkgaXMgc3VjY2Vzc2Z1bCwgemVybyBpcyByZXR1cm5lZCBhbmQgdGhlCiAgKiAgICAgSU5RVUlSWSBkYXRhIGlzIGluIEBpbnFfcmVzdWx0OyB0aGUgc2NzaV9sZXZlbCBhbmQgSU5RVUlSWSBsZW5ndGgKLSAqICAgICBhcmUgY29waWVkIHRvIHRoZSBTY3NpX0RldmljZSBhdCBAc3JlcS0+c3JfZGV2aWNlIChzZGV2KTsKLSAqICAgICBhbnkgZmxhZ3MgdmFsdWUgaXMgc3RvcmVkIGluICpAYmZsYWdzLgorICogICAgIGFyZSBjb3BpZWQgdG8gdGhlIFNjc2lfRGV2aWNlIGFueSBmbGFncyB2YWx1ZSBpcyBzdG9yZWQgaW4gKkBiZmxhZ3MuCiAgKiovCi1zdGF0aWMgdm9pZCBzY3NpX3Byb2JlX2x1bihzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxLCBjaGFyICppbnFfcmVzdWx0LAotCQkJICAgaW50ICpiZmxhZ3MpCitzdGF0aWMgaW50IHNjc2lfcHJvYmVfbHVuKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgY2hhciAqaW5xX3Jlc3VsdCwKKwkJCSAgaW50IHJlc3VsdF9sZW4sIGludCAqYmZsYWdzKQogewotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNyZXEtPnNyX2RldmljZTsJLyogYSBiaXQgdWdseSAqLwogCXVuc2lnbmVkIGNoYXIgc2NzaV9jbWRbTUFYX0NPTU1BTkRfU0laRV07CiAJaW50IGZpcnN0X2lucXVpcnlfbGVuLCB0cnlfaW5xdWlyeV9sZW4sIG5leHRfaW5xdWlyeV9sZW47CiAJaW50IHJlc3BvbnNlX2xlbiA9IDA7Ci0JaW50IHBhc3MsIGNvdW50OworCWludCBwYXNzLCBjb3VudCwgcmVzdWx0OwogCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKIAogCSpiZmxhZ3MgPSAwOwpAQCAtNDc1LDI4ICs0NzIsMjYgQEAKIAkJbWVtc2V0KHNjc2lfY21kLCAwLCA2KTsKIAkJc2NzaV9jbWRbMF0gPSBJTlFVSVJZOwogCQlzY3NpX2NtZFs0XSA9ICh1bnNpZ25lZCBjaGFyKSB0cnlfaW5xdWlyeV9sZW47Ci0JCXNyZXEtPnNyX2NtZF9sZW4gPSAwOwotCQlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKIAogCQltZW1zZXQoaW5xX3Jlc3VsdCwgMCwgdHJ5X2lucXVpcnlfbGVuKTsKLQkJc2NzaV93YWl0X3JlcShzcmVxLCAodm9pZCAqKSBzY3NpX2NtZCwgKHZvaWQgKikgaW5xX3Jlc3VsdCwKLQkJCQl0cnlfaW5xdWlyeV9sZW4sCi0JCQkJSFovMiArIEhaKnNjc2lfaW5xX3RpbWVvdXQsIDMpOworCisJCXJlc3VsdCA9IHNjc2lfZXhlY3V0ZV9yZXEoc2RldiwgIHNjc2lfY21kLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkJCSAgaW5xX3Jlc3VsdCwgdHJ5X2lucXVpcnlfbGVuLCAmc3NoZHIsCisJCQkJCSAgSFogLyAyICsgSFogKiBzY3NpX2lucV90aW1lb3V0LCAzKTsKIAogCQlTQ1NJX0xPR19TQ0FOX0JVUygzLCBwcmludGsoS0VSTl9JTkZPICJzY3NpIHNjYW46IElOUVVJUlkgJXMgIgogCQkJCSJ3aXRoIGNvZGUgMHgleFxuIiwKLQkJCQlzcmVxLT5zcl9yZXN1bHQgPyAiZmFpbGVkIiA6ICJzdWNjZXNzZnVsIiwKLQkJCQlzcmVxLT5zcl9yZXN1bHQpKTsKKwkJCQlyZXN1bHQgPyAiZmFpbGVkIiA6ICJzdWNjZXNzZnVsIiwgcmVzdWx0KSk7CiAKLQkJaWYgKHNyZXEtPnNyX3Jlc3VsdCkgeworCQlpZiAocmVzdWx0KSB7CiAJCQkvKgogCQkJICogbm90LXJlYWR5IHRvIHJlYWR5IHRyYW5zaXRpb24gW2FzYy9hc2NxPTB4MjgvMHgwXQogCQkJICogb3IgcG93ZXItb24sIHJlc2V0IFthc2MvYXNjcT0weDI5LzB4MF0sIGNvbnRpbnVlLgogCQkJICogSU5RVUlSWSBzaG91bGQgbm90IHlpZWxkIFVOSVRfQVRURU5USU9OCiAJCQkgKiBidXQgbWFueSBidWdneSBkZXZpY2VzIGRvIHNvIGFueXdheS4gCiAJCQkgKi8KLQkJCWlmICgoZHJpdmVyX2J5dGUoc3JlcS0+c3JfcmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgJiYKLQkJCSAgICBzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKHNyZXEsICZzc2hkcikpIHsKKwkJCWlmICgoZHJpdmVyX2J5dGUocmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgJiYKKwkJCSAgICBzY3NpX3NlbnNlX3ZhbGlkKCZzc2hkcikpIHsKIAkJCQlpZiAoKHNzaGRyLnNlbnNlX2tleSA9PSBVTklUX0FUVEVOVElPTikgJiYKIAkJCQkgICAgKChzc2hkci5hc2MgPT0gMHgyOCkgfHwKIAkJCQkgICAgIChzc2hkci5hc2MgPT0gMHgyOSkpICYmCkBAIC01MDcsNyArNTAyLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKHNyZXEtPnNyX3Jlc3VsdCA9PSAwKSB7CisJaWYgKHJlc3VsdCA9PSAwKSB7CiAJCXJlc3BvbnNlX2xlbiA9ICh1bnNpZ25lZCBjaGFyKSBpbnFfcmVzdWx0WzRdICsgNTsKIAkJaWYgKHJlc3BvbnNlX2xlbiA+IDI1NSkKIAkJCXJlc3BvbnNlX2xlbiA9IGZpcnN0X2lucXVpcnlfbGVuOwkvKiBzYW5pdHkgKi8KQEAgLTU1Niw4ICs1NTEsOCBAQAogCiAJLyogSWYgdGhlIGxhc3QgdHJhbnNmZXIgYXR0ZW1wdCBnb3QgYW4gZXJyb3IsIGFzc3VtZSB0aGUKIAkgKiBwZXJpcGhlcmFsIGRvZXNuJ3QgZXhpc3Qgb3IgaXMgZGVhZC4gKi8KLQlpZiAoc3JlcS0+c3JfcmVzdWx0KQotCQlyZXR1cm47CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CiAKIAkvKiBEb24ndCByZXBvcnQgYW55IG1vcmUgZGF0YSB0aGFuIHRoZSBkZXZpY2Ugc2F5cyBpcyB2YWxpZCAqLwogCXNkZXYtPmlucXVpcnlfbGVuID0gbWluKHRyeV9pbnF1aXJ5X2xlbiwgcmVzcG9uc2VfbGVuKTsKQEAgLTU5Myw3ICs1ODgsNyBAQAogCSAgICAoc2Rldi0+c2NzaV9sZXZlbCA9PSAxICYmIChpbnFfcmVzdWx0WzNdICYgMHgwZikgPT0gMSkpCiAJCXNkZXYtPnNjc2lfbGV2ZWwrKzsKIAotCXJldHVybjsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC04MDAsOSArNzk1LDggQEAKIAkJCQkgIHZvaWQgKmhvc3RkYXRhKQogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKLQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOwogCXVuc2lnbmVkIGNoYXIgKnJlc3VsdDsKLQlpbnQgYmZsYWdzLCByZXMgPSBTQ1NJX1NDQU5fTk9fUkVTUE9OU0U7CisJaW50IGJmbGFncywgcmVzID0gU0NTSV9TQ0FOX05PX1JFU1BPTlNFLCByZXN1bHRfbGVuID0gMjU2OwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwogCiAJLyoKQEAgLTgzMSwxNiArODI1LDEzIEBACiAJc2RldiA9IHNjc2lfYWxsb2Nfc2RldihzdGFyZ2V0LCBsdW4sIGhvc3RkYXRhKTsKIAlpZiAoIXNkZXYpCiAJCWdvdG8gb3V0OwotCXNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFzcmVxKQotCQlnb3RvIG91dF9mcmVlX3NkZXY7Ci0JcmVzdWx0ID0ga21hbGxvYygyNTYsIEdGUF9BVE9NSUMgfAorCisJcmVzdWx0ID0ga21hbGxvYyhyZXN1bHRfbGVuLCBHRlBfQVRPTUlDIHwKIAkJCSgoc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hKSA/IF9fR0ZQX0RNQSA6IDApKTsKIAlpZiAoIXJlc3VsdCkKLQkJZ290byBvdXRfZnJlZV9zcmVxOworCQlnb3RvIG91dF9mcmVlX3NkZXY7CiAKLQlzY3NpX3Byb2JlX2x1bihzcmVxLCByZXN1bHQsICZiZmxhZ3MpOwotCWlmIChzcmVxLT5zcl9yZXN1bHQpCisJaWYgKHNjc2lfcHJvYmVfbHVuKHNkZXYsIHJlc3VsdCwgcmVzdWx0X2xlbiwgJmJmbGFncykpCiAJCWdvdG8gb3V0X2ZyZWVfcmVzdWx0OwogCiAJLyoKQEAgLTg2OCw3ICs4NTksNyBAQAogCWlmIChyZXMgPT0gU0NTSV9TQ0FOX0xVTl9QUkVTRU5UKSB7CiAJCWlmIChiZmxhZ3MgJiBCTElTVF9LRVkpIHsKIAkJCXNkZXYtPmxvY2thYmxlID0gMDsKLQkJCXNjc2lfdW5sb2NrX2Zsb3B0aWNhbChzcmVxLCByZXN1bHQpOworCQkJc2NzaV91bmxvY2tfZmxvcHRpY2FsKHNkZXYsIHJlc3VsdCk7CiAJCX0KIAkJaWYgKGJmbGFnc3ApCiAJCQkqYmZsYWdzcCA9IGJmbGFnczsKQEAgLTg3Niw4ICs4NjcsNiBAQAogCiAgb3V0X2ZyZWVfcmVzdWx0OgogCWtmcmVlKHJlc3VsdCk7Ci0gb3V0X2ZyZWVfc3JlcToKLQlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKICBvdXRfZnJlZV9zZGV2OgogCWlmIChyZXMgPT0gU0NTSV9TQ0FOX0xVTl9QUkVTRU5UKSB7CiAJCWlmIChzZGV2cCkgewpAQCAtMTA3MCw4ICsxMDU5LDggQEAKIAl1bnNpZ25lZCBpbnQgbHVuOwogCXVuc2lnbmVkIGludCBudW1fbHVuczsKIAl1bnNpZ25lZCBpbnQgcmV0cmllczsKKwlpbnQgcmVzdWx0OwogCXN0cnVjdCBzY3NpX2x1biAqbHVucCwgKmx1bl9kYXRhOwotCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXE7CiAJdTggKmRhdGE7CiAJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOwogCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHNjc2lfdGFyZ2V0KHNkZXYpOwpAQCAtMTA4OSwxMCArMTA3OCw2IEBACiAJaWYgKGJmbGFncyAmIEJMSVNUX05PTFVOKQogCQlyZXR1cm4gMDsKIAotCXNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFzcmVxKQotCQlnb3RvIG91dDsKLQogCXNwcmludGYoZGV2bmFtZSwgImhvc3QgJWQgY2hhbm5lbCAlZCBpZCAlZCIsCiAJCXNkZXYtPmhvc3QtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkKTsKIApAQCAtMTExMCw3ICsxMDk1LDcgQEAKIAlsdW5fZGF0YSA9IGttYWxsb2MobGVuZ3RoLCBHRlBfQVRPTUlDIHwKIAkJCSAgIChzZGV2LT5ob3N0LT51bmNoZWNrZWRfaXNhX2RtYSA/IF9fR0ZQX0RNQSA6IDApKTsKIAlpZiAoIWx1bl9kYXRhKQotCQlnb3RvIG91dF9yZWxlYXNlX3JlcXVlc3Q7CisJCWdvdG8gb3V0OwogCiAJc2NzaV9jbWRbMF0gPSBSRVBPUlRfTFVOUzsKIApAQCAtMTEyOSw4ICsxMTE0LDYgQEAKIAogCXNjc2lfY21kWzEwXSA9IDA7CS8qIHJlc2VydmVkICovCiAJc2NzaV9jbWRbMTFdID0gMDsJLyogY29udHJvbCAqLwotCXNyZXEtPnNyX2NtZF9sZW4gPSAwOwotCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwogCiAJLyoKIAkgKiBXZSBjYW4gZ2V0IGEgVU5JVCBBVFRFTlRJT04sIGZvciBleGFtcGxlIGEgcG93ZXIgb24vcmVzZXQsIHNvCkBAIC0xMTQ2LDI5ICsxMTI5LDI5IEBACiAJCVNDU0lfTE9HX1NDQU5fQlVTKDMsIHByaW50ayAoS0VSTl9JTkZPICJzY3NpIHNjYW46IFNlbmRpbmciCiAJCQkJIiBSRVBPUlQgTFVOUyB0byAlcyAodHJ5ICVkKVxuIiwgZGV2bmFtZSwKIAkJCQlyZXRyaWVzKSk7Ci0JCXNjc2lfd2FpdF9yZXEoc3JlcSwgc2NzaV9jbWQsIGx1bl9kYXRhLCBsZW5ndGgsCi0JCQkJU0NTSV9USU1FT1VUICsgNCpIWiwgMyk7CisKKwkJcmVzdWx0ID0gc2NzaV9leGVjdXRlX3JlcShzZGV2LCBzY3NpX2NtZCwgRE1BX0ZST01fREVWSUNFLAorCQkJCQkgIGx1bl9kYXRhLCBsZW5ndGgsICZzc2hkciwKKwkJCQkJICBTQ1NJX1RJTUVPVVQgKyA0ICogSFosIDMpOworCiAJCVNDU0lfTE9HX1NDQU5fQlVTKDMsIHByaW50ayAoS0VSTl9JTkZPICJzY3NpIHNjYW46IFJFUE9SVCBMVU5TIgotCQkJCSIgJXMgKHRyeSAlZCkgcmVzdWx0IDB4JXhcbiIsIHNyZXEtPnNyX3Jlc3VsdAotCQkJCT8gICJmYWlsZWQiIDogInN1Y2Nlc3NmdWwiLCByZXRyaWVzLAotCQkJCXNyZXEtPnNyX3Jlc3VsdCkpOwotCQlpZiAoc3JlcS0+c3JfcmVzdWx0ID09IDApCisJCQkJIiAlcyAodHJ5ICVkKSByZXN1bHQgMHgleFxuIiwgcmVzdWx0CisJCQkJPyAgImZhaWxlZCIgOiAic3VjY2Vzc2Z1bCIsIHJldHJpZXMsIHJlc3VsdCkpOworCQlpZiAocmVzdWx0ID09IDApCiAJCQlicmVhazsKLQkJZWxzZSBpZiAoc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShzcmVxLCAmc3NoZHIpKSB7CisJCWVsc2UgaWYgKHNjc2lfc2Vuc2VfdmFsaWQoJnNzaGRyKSkgewogCQkJaWYgKHNzaGRyLnNlbnNlX2tleSAhPSBVTklUX0FUVEVOVElPTikKIAkJCQlicmVhazsKIAkJfQogCX0KIAotCWlmIChzcmVxLT5zcl9yZXN1bHQpIHsKKwlpZiAocmVzdWx0KSB7CiAJCS8qCiAJCSAqIFRoZSBkZXZpY2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBhIFJFUE9SVCBMVU4gY29tbWFuZAogCQkgKi8KIAkJa2ZyZWUobHVuX2RhdGEpOwotCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKIAkJcmV0dXJuIDE7CiAJfQotCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOwogCiAJLyoKIAkgKiBHZXQgdGhlIGxlbmd0aCBmcm9tIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIGx1bl9kYXRhLgpAQCAtMTI0Miw4ICsxMjI1LDYgQEAKIAlrZnJlZShsdW5fZGF0YSk7CiAJcmV0dXJuIDA7CiAKLSBvdXRfcmVsZWFzZV9yZXF1ZXN0OgotCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOwogIG91dDoKIAkvKgogCSAqIFdlIGFyZSBvdXQgb2YgbWVtb3J5LCBkb24ndCB0cnkgc2Nhbm5pbmcgYW55IGZ1cnRoZXIuCkBAIC0xMjY1LDkgKzEyNDYsMTIgQEAKIAogCWdldF9kZXZpY2UoJnN0YXJnZXQtPmRldik7CiAJZG93bigmc2hvc3QtPnNjYW5fbXV0ZXgpOwotCXJlcyA9IHNjc2lfcHJvYmVfYW5kX2FkZF9sdW4oc3RhcmdldCwgbHVuLCBOVUxMLCAmc2RldiwgMSwgaG9zdGRhdGEpOwotCWlmIChyZXMgIT0gU0NTSV9TQ0FOX0xVTl9QUkVTRU5UKQotCQlzZGV2ID0gRVJSX1BUUigtRU5PREVWKTsKKwlpZiAoc2NzaV9ob3N0X3NjYW5fYWxsb3dlZChzaG9zdCkpIHsKKwkJcmVzID0gc2NzaV9wcm9iZV9hbmRfYWRkX2x1bihzdGFyZ2V0LCBsdW4sIE5VTEwsICZzZGV2LCAxLAorCQkJCQkgICAgIGhvc3RkYXRhKTsKKwkJaWYgKHJlcyAhPSBTQ1NJX1NDQU5fTFVOX1BSRVNFTlQpCisJCQlzZGV2ID0gRVJSX1BUUigtRU5PREVWKTsKKwl9CiAJdXAoJnNob3N0LT5zY2FuX211dGV4KTsKIAlzY3NpX3RhcmdldF9yZWFwKHN0YXJnZXQpOwogCXB1dF9kZXZpY2UoJnN0YXJnZXQtPmRldik7CkBAIC0xNDE3LDExICsxNDAxLDE1IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJZG93bigmc2hvc3QtPnNjYW5fbXV0ZXgpOwotCWlmIChjaGFubmVsID09IFNDQU5fV0lMRF9DQVJEKSAKLQkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8PSBzaG9zdC0+bWF4X2NoYW5uZWw7IGNoYW5uZWwrKykKKwlpZiAoc2NzaV9ob3N0X3NjYW5fYWxsb3dlZChzaG9zdCkpIHsKKwkJaWYgKGNoYW5uZWwgPT0gU0NBTl9XSUxEX0NBUkQpCisJCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDw9IHNob3N0LT5tYXhfY2hhbm5lbDsKKwkJCSAgICAgY2hhbm5lbCsrKQorCQkJCXNjc2lfc2Nhbl9jaGFubmVsKHNob3N0LCBjaGFubmVsLCBpZCwgbHVuLAorCQkJCQkJICByZXNjYW4pOworCQllbHNlCiAJCQlzY3NpX3NjYW5fY2hhbm5lbChzaG9zdCwgY2hhbm5lbCwgaWQsIGx1biwgcmVzY2FuKTsKLQllbHNlCi0JCXNjc2lfc2Nhbl9jaGFubmVsKHNob3N0LCBjaGFubmVsLCBpZCwgbHVuLCByZXNjYW4pOworCX0KIAl1cCgmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwppbmRleCBiZWVkN2ZiLi5kYWU1OWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKQEAgLTQ4LDYgKzQ4LDMwIEBACiAJcmV0dXJuIG5hbWU7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgeworCWVudW0gc2NzaV9ob3N0X3N0YXRlCXZhbHVlOworCWNoYXIJCQkqbmFtZTsKK30gc2hvc3Rfc3RhdGVzW10gPSB7CisJeyBTSE9TVF9DUkVBVEVELCAiY3JlYXRlZCIgfSwKKwl7IFNIT1NUX1JVTk5JTkcsICJydW5uaW5nIiB9LAorCXsgU0hPU1RfQ0FOQ0VMLCAiY2FuY2VsIiB9LAorCXsgU0hPU1RfREVMLCAiZGVsZXRlZCIgfSwKKwl7IFNIT1NUX1JFQ09WRVJZLCAicmVjb3ZlcnkiIH0sCit9OworY29uc3QgY2hhciAqc2NzaV9ob3N0X3N0YXRlX25hbWUoZW51bSBzY3NpX2hvc3Rfc3RhdGUgc3RhdGUpCit7CisJaW50IGk7CisJY2hhciAqbmFtZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNob3N0X3N0YXRlcykvc2l6ZW9mKHNob3N0X3N0YXRlc1swXSk7IGkrKykgeworCQlpZiAoc2hvc3Rfc3RhdGVzW2ldLnZhbHVlID09IHN0YXRlKSB7CisJCQluYW1lID0gc2hvc3Rfc3RhdGVzW2ldLm5hbWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gbmFtZTsKK30KKwogc3RhdGljIGludCBjaGVja19zZXQodW5zaWduZWQgaW50ICp2YWwsIGNoYXIgKnNyYykKIHsKIAljaGFyICpsYXN0OwpAQCAtMTI0LDYgKzE0OCw0MyBAQAogfTsKIHN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihzY2FuLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9zY2FuKTsKIAorc3RhdGljIHNzaXplX3QKK3N0b3JlX3Nob3N0X3N0YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IGk7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCWVudW0gc2NzaV9ob3N0X3N0YXRlIHN0YXRlID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2hvc3Rfc3RhdGVzKS9zaXplb2Yoc2hvc3Rfc3RhdGVzWzBdKTsgaSsrKSB7CisJCWNvbnN0IGludCBsZW4gPSBzdHJsZW4oc2hvc3Rfc3RhdGVzW2ldLm5hbWUpOworCQlpZiAoc3RybmNtcChzaG9zdF9zdGF0ZXNbaV0ubmFtZSwgYnVmLCBsZW4pID09IDAgJiYKKwkJICAgYnVmW2xlbl0gPT0gJ1xuJykgeworCQkJc3RhdGUgPSBzaG9zdF9zdGF0ZXNbaV0udmFsdWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzY3NpX2hvc3Rfc2V0X3N0YXRlKHNob3N0LCBzdGF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3Nob3dfc2hvc3Rfc3RhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCWNvbnN0IGNoYXIgKm5hbWUgPSBzY3NpX2hvc3Rfc3RhdGVfbmFtZShzaG9zdC0+c2hvc3Rfc3RhdGUpOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiJXNcbiIsIG5hbWUpOworfQorCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoc3RhdGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3Nob3N0X3N0YXRlLCBzdG9yZV9zaG9zdF9zdGF0ZSk7CisKIHNob3N0X3JkX2F0dHIodW5pcXVlX2lkLCAiJXVcbiIpOwogc2hvc3RfcmRfYXR0cihob3N0X2J1c3ksICIlaHVcbiIpOwogc2hvc3RfcmRfYXR0cihjbWRfcGVyX2x1biwgIiVoZFxuIik7CkBAIC0xMzksNiArMjAwLDcgQEAKIAkmY2xhc3NfZGV2aWNlX2F0dHJfdW5jaGVja2VkX2lzYV9kbWEsCiAJJmNsYXNzX2RldmljZV9hdHRyX3Byb2NfbmFtZSwKIAkmY2xhc3NfZGV2aWNlX2F0dHJfc2NhbiwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfc3RhdGUsCiAJTlVMTAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwppbmRleCBlNjQxMmZjLi4yY2FiNTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwpAQCAtMjUyLDcgKzI1Miw4IEBACiAKICNkZWZpbmUgdG9fZmNfaW50ZXJuYWwodG1wbCkJY29udGFpbmVyX29mKHRtcGwsIHN0cnVjdCBmY19pbnRlcm5hbCwgdCkKIAotc3RhdGljIGludCBmY190YXJnZXRfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBmY190YXJnZXRfc2V0dXAoc3RydWN0IHRyYW5zcG9ydF9jb250YWluZXIgKnRjLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2KQogewogCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRvX3Njc2lfdGFyZ2V0KGRldik7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc3RhcmdldCk7CkBAIC0yODEsNyArMjgyLDggQEAKIAkJCSAgICAgICBOVUxMLAogCQkJICAgICAgIE5VTEwpOwogCi1zdGF0aWMgaW50IGZjX2hvc3Rfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBmY19ob3N0X3NldHVwKHN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyICp0Yywgc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3QoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jCmluZGV4IDc2NzA5MTkuLmVmNTc3YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMKQEAgLTI4LDE0ICsyOCwxNCBAQAogI2luY2x1ZGUgInNjc2lfcHJpdi5oIgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgotI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaD4KIAogI2RlZmluZSBTUElfUFJJTlRLKHgsIGwsIGYsIGEuLi4pCWRldl9wcmludGsobCwgJih4KS0+ZGV2LCBmICwgIyNhKQogCi0jZGVmaW5lIFNQSV9OVU1fQVRUUlMgMTMJLyogaW5jcmVhc2UgdGhpcyBpZiB5b3UgYWRkIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgU1BJX05VTV9BVFRSUyAxNAkvKiBpbmNyZWFzZSB0aGlzIGlmIHlvdSBhZGQgYXR0cmlidXRlcyAqLwogI2RlZmluZSBTUElfT1RIRVJfQVRUUlMgMQkvKiBJbmNyZWFzZSB0aGlzIGlmIHlvdSBhZGQgImFsd2F5cwogCQkJCSAqIG9uIiBhdHRyaWJ1dGVzICovCiAjZGVmaW5lIFNQSV9IT1NUX0FUVFJTCTEKQEAgLTEwNiwyNyArMTA2LDMxIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotLyogTW9kaWZpY2F0aW9uIG9mIHNjc2lfd2FpdF9yZXEgdGhhdCB3aWxsIGNsZWFyIFVOSVQgQVRURU5USU9OIGNvbmRpdGlvbnMKLSAqIHJlc3VsdGluZyBmcm9tIChsaWtlbHkpIGJ1cyBhbmQgZGV2aWNlIHJlc2V0cyAqLwotc3RhdGljIHZvaWQgc3BpX3dhaXRfcmVxKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIGNvbnN0IHZvaWQgKmNtZCwKLQkJCSB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1ZmZsZW4pCitzdGF0aWMgaW50IHNwaV9leGVjdXRlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgY29uc3Qgdm9pZCAqY21kLAorCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkgICAgICAgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBidWZmbGVuLAorCQkgICAgICAgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkcikKIHsKLQlpbnQgaTsKKwlpbnQgaSwgcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgc2Vuc2VbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKIAogCWZvcihpID0gMDsgaSA8IERWX1JFVFJJRVM7IGkrKykgewotCQlzcmVxLT5zcl9yZXF1ZXN0LT5mbGFncyB8PSBSRVFfRkFJTEZBU1Q7CisJCXJlc3VsdCA9IHNjc2lfZXhlY3V0ZShzZGV2LCBjbWQsIGRpciwgYnVmZmVyLCBidWZmbGVuLAorCQkJCSAgICAgIHNlbnNlLCBEVl9USU1FT1VULCAvKiByZXRyaWVzICovIDEsCisJCQkJICAgICAgUkVRX0ZBSUxGQVNUKTsKKwkJaWYgKHJlc3VsdCAmIERSSVZFUl9TRU5TRSkgeworCQkJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyX3RtcDsKKwkJCWlmICghc3NoZHIpCisJCQkJc3NoZHIgPSAmc3NoZHJfdG1wOwogCi0JCXNjc2lfd2FpdF9yZXEoc3JlcSwgY21kLCBidWZmZXIsIGJ1ZmZsZW4sCi0JCQkgICAgICBEVl9USU1FT1VULCAvKiByZXRyaWVzICovIDEpOwotCQlpZiAoc3JlcS0+c3JfcmVzdWx0ICYgRFJJVkVSX1NFTlNFKSB7Ci0JCQlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7Ci0KLQkJCWlmIChzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKHNyZXEsICZzc2hkcikKLQkJCSAgICAmJiBzc2hkci5zZW5zZV9rZXkgPT0gVU5JVF9BVFRFTlRJT04pCisJCQlpZiAoc2NzaV9ub3JtYWxpemVfc2Vuc2Uoc2Vuc2UsIHNpemVvZigqc2Vuc2UpLAorCQkJCQkJIHNzaGRyKQorCQkJICAgICYmIHNzaGRyLT5zZW5zZV9rZXkgPT0gVU5JVF9BVFRFTlRJT04pCiAJCQkJY29udGludWU7CiAJCX0KIAkJYnJlYWs7CiAJfQorCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgewpAQCAtMTYyLDcgKzE2Niw4IEBACiAJcmV0dXJuIFNQSV9TSUdOQUxfVU5LTk9XTjsKIH0KIAotc3RhdGljIGludCBzcGlfaG9zdF9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNwaV9ob3N0X3NldHVwKHN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyICp0Yywgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2KQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KGRldik7CiAKQEAgLTE5Niw3ICsyMDEsOSBAQAogCXJldHVybiAmaS0+dC5ob3N0X2F0dHJzLmFjID09IGNvbnQ7CiB9CiAKLXN0YXRpYyBpbnQgc3BpX2RldmljZV9jb25maWd1cmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBzcGlfZGV2aWNlX2NvbmZpZ3VyZShzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqdGMsCisJCQkJc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYpCiB7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzZGV2LT5zZGV2X3RhcmdldDsKQEAgLTIxNCw3ICsyMjEsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNwaV9zZXR1cF90cmFuc3BvcnRfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBzcGlfc2V0dXBfdHJhbnNwb3J0X2F0dHJzKHN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyICp0YywKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYpCiB7CiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdG9fc2NzaV90YXJnZXQoZGV2KTsKIApAQCAtMjMxLDYgKzI0MCw3IEBACiAJc3BpX3JkX3N0cm0oc3RhcmdldCkgPSAwOwogCXNwaV9ydGkoc3RhcmdldCkgPSAwOwogCXNwaV9wY29tcF9lbihzdGFyZ2V0KSA9IDA7CisJc3BpX2hvbGRfbWNzKHN0YXJnZXQpID0gMDsKIAlzcGlfZHZfcGVuZGluZyhzdGFyZ2V0KSA9IDA7CiAJc3BpX2luaXRpYWxfZHYoc3RhcmdldCkgPSAwOwogCWluaXRfTVVURVgoJnNwaV9kdl9zZW0oc3RhcmdldCkpOwpAQCAtMzQ3LDYgKzM1Nyw3IEBACiBzcGlfdHJhbnNwb3J0X3JkX2F0dHIocmRfc3RybSwgIiVkXG4iKTsKIHNwaV90cmFuc3BvcnRfcmRfYXR0cihydGksICIlZFxuIik7CiBzcGlfdHJhbnNwb3J0X3JkX2F0dHIocGNvbXBfZW4sICIlZFxuIik7CitzcGlfdHJhbnNwb3J0X3JkX2F0dHIoaG9sZF9tY3MsICIlZFxuIik7CiAKIC8qIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3QgY2hpbGQgZGV2aWNlIHNvIHdlIHJldHVybiAxICovCiBzdGF0aWMgaW50IGNoaWxkX2l0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQpAQCAtNTM5LDEzICs1NTAsMTMgQEAKIC8qIFRoaXMgaXMgZm9yIHJlYWQvd3JpdGUgRG9tYWluIFZhbGlkYXRpb246ICBJZiB0aGUgZGV2aWNlIHN1cHBvcnRzCiAgKiBhbiBlY2hvIGJ1ZmZlciwgd2UgZG8gcmVhZC93cml0ZSB0ZXN0cyB0byBpdCAqLwogc3RhdGljIGVudW0gc3BpX2NvbXBhcmVfcmV0dXJucwotc3BpX2R2X2RldmljZV9lY2hvX2J1ZmZlcihzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxLCB1OCAqYnVmZmVyLAorc3BpX2R2X2RldmljZV9lY2hvX2J1ZmZlcihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHU4ICpidWZmZXIsCiAJCQkgIHU4ICpwdHIsIGNvbnN0IGludCByZXRyaWVzKQogewotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNyZXEtPnNyX2RldmljZTsKIAlpbnQgbGVuID0gcHRyIC0gYnVmZmVyOwotCWludCBqLCBrLCByOworCWludCBqLCBrLCByLCByZXN1bHQ7CiAJdW5zaWduZWQgaW50IHBhdHRlcm4gPSAweDAwMDBmZmZmOworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKIAogCWNvbnN0IGNoYXIgc3BpX3dyaXRlX2J1ZmZlcltdID0gewogCQlXUklURV9CVUZGRVIsIDB4MGEsIDAsIDAsIDAsIDAsIDAsIGxlbiA+PiA4LCBsZW4gJiAweGZmLCAwCkBAIC01OTAsMTQgKzYwMSwxMiBAQAogCX0KIAogCWZvciAociA9IDA7IHIgPCByZXRyaWVzOyByKyspIHsKLQkJc3JlcS0+c3JfY21kX2xlbiA9IDA7CS8qIHdhaXRfcmVxIHRvIGZpbGwgaW4gKi8KLQkJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOwotCQlzcGlfd2FpdF9yZXEoc3JlcSwgc3BpX3dyaXRlX2J1ZmZlciwgYnVmZmVyLCBsZW4pOwotCQlpZihzcmVxLT5zcl9yZXN1bHQgfHwgIXNjc2lfZGV2aWNlX29ubGluZShzZGV2KSkgewotCQkJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOworCQlyZXN1bHQgPSBzcGlfZXhlY3V0ZShzZGV2LCBzcGlfd3JpdGVfYnVmZmVyLCBETUFfVE9fREVWSUNFLAorCQkJCSAgICAgYnVmZmVyLCBsZW4sICZzc2hkcik7CisJCWlmKHJlc3VsdCB8fCAhc2NzaV9kZXZpY2Vfb25saW5lKHNkZXYpKSB7CiAKIAkJCXNjc2lfZGV2aWNlX3NldF9zdGF0ZShzZGV2LCBTREVWX1FVSUVTQ0UpOwotCQkJaWYgKHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2Uoc3JlcSwgJnNzaGRyKQorCQkJaWYgKHNjc2lfc2Vuc2VfdmFsaWQoJnNzaGRyKQogCQkJICAgICYmIHNzaGRyLnNlbnNlX2tleSA9PSBJTExFR0FMX1JFUVVFU1QKIAkJCSAgICAvKiBJTlZBTElEIEZJRUxEIElOIENEQiAqLwogCQkJICAgICYmIHNzaGRyLmFzYyA9PSAweDI0ICYmIHNzaGRyLmFzY3EgPT0gMHgwMCkKQEAgLTYwOSwxNCArNjE4LDEzIEBACiAJCQkJcmV0dXJuIFNQSV9DT01QQVJFX1NLSVBfVEVTVDsKIAogCi0JCQlTUElfUFJJTlRLKHNkZXYtPnNkZXZfdGFyZ2V0LCBLRVJOX0VSUiwgIldyaXRlIEJ1ZmZlciBmYWlsdXJlICV4XG4iLCBzcmVxLT5zcl9yZXN1bHQpOworCQkJU1BJX1BSSU5USyhzZGV2LT5zZGV2X3RhcmdldCwgS0VSTl9FUlIsICJXcml0ZSBCdWZmZXIgZmFpbHVyZSAleFxuIiwgcmVzdWx0KTsKIAkJCXJldHVybiBTUElfQ09NUEFSRV9GQUlMVVJFOwogCQl9CiAKIAkJbWVtc2V0KHB0ciwgMCwgbGVuKTsKLQkJc3JlcS0+c3JfY21kX2xlbiA9IDA7CS8qIHdhaXRfcmVxIHRvIGZpbGwgaW4gKi8KLQkJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7Ci0JCXNwaV93YWl0X3JlcShzcmVxLCBzcGlfcmVhZF9idWZmZXIsIHB0ciwgbGVuKTsKKwkJc3BpX2V4ZWN1dGUoc2Rldiwgc3BpX3JlYWRfYnVmZmVyLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkgICAgcHRyLCBsZW4sIE5VTEwpOwogCQlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9RVUlFU0NFKTsKIAogCQlpZiAobWVtY21wKGJ1ZmZlciwgcHRyLCBsZW4pICE9IDApCkBAIC02MjgsMjUgKzYzNiwyMiBAQAogLyogVGhpcyBpcyBmb3IgdGhlIHNpbXBsZXN0IGZvcm0gb2YgRG9tYWluIFZhbGlkYXRpb246IGEgcmVhZCB0ZXN0CiAgKiBvbiB0aGUgaW5xdWlyeSBkYXRhIGZyb20gdGhlIGRldmljZSAqLwogc3RhdGljIGVudW0gc3BpX2NvbXBhcmVfcmV0dXJucwotc3BpX2R2X2RldmljZV9jb21wYXJlX2lucXVpcnkoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgdTggKmJ1ZmZlciwKK3NwaV9kdl9kZXZpY2VfY29tcGFyZV9pbnF1aXJ5KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgdTggKmJ1ZmZlciwKIAkJCSAgICAgIHU4ICpwdHIsIGNvbnN0IGludCByZXRyaWVzKQogewotCWludCByOwotCWNvbnN0IGludCBsZW4gPSBzcmVxLT5zcl9kZXZpY2UtPmlucXVpcnlfbGVuOwotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNyZXEtPnNyX2RldmljZTsKKwlpbnQgciwgcmVzdWx0OworCWNvbnN0IGludCBsZW4gPSBzZGV2LT5pbnF1aXJ5X2xlbjsKIAljb25zdCBjaGFyIHNwaV9pbnF1aXJ5W10gPSB7CiAJCUlOUVVJUlksIDAsIDAsIDAsIGxlbiwgMAogCX07CiAKIAlmb3IgKHIgPSAwOyByIDwgcmV0cmllczsgcisrKSB7Ci0JCXNyZXEtPnNyX2NtZF9sZW4gPSAwOwkvKiB3YWl0X3JlcSB0byBmaWxsIGluICovCi0JCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwotCiAJCW1lbXNldChwdHIsIDAsIGxlbik7CiAKLQkJc3BpX3dhaXRfcmVxKHNyZXEsIHNwaV9pbnF1aXJ5LCBwdHIsIGxlbik7CisJCXJlc3VsdCA9IHNwaV9leGVjdXRlKHNkZXYsIHNwaV9pbnF1aXJ5LCBETUFfRlJPTV9ERVZJQ0UsCisJCQkJICAgICBwdHIsIGxlbiwgTlVMTCk7CiAJCQotCQlpZihzcmVxLT5zcl9yZXN1bHQgfHwgIXNjc2lfZGV2aWNlX29ubGluZShzZGV2KSkgeworCQlpZihyZXN1bHQgfHwgIXNjc2lfZGV2aWNlX29ubGluZShzZGV2KSkgewogCQkJc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfUVVJRVNDRSk7CiAJCQlyZXR1cm4gU1BJX0NPTVBBUkVfRkFJTFVSRTsKIAkJfQpAQCAtNjY3LDEyICs2NzIsMTEgQEAKIH0KIAogc3RhdGljIGVudW0gc3BpX2NvbXBhcmVfcmV0dXJucwotc3BpX2R2X3JldHJhaW4oc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgdTggKmJ1ZmZlciwgdTggKnB0ciwKK3NwaV9kdl9yZXRyYWluKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgdTggKmJ1ZmZlciwgdTggKnB0ciwKIAkgICAgICAgZW51bSBzcGlfY29tcGFyZV9yZXR1cm5zIAotCSAgICAgICAoKmNvbXBhcmVfZm4pKHN0cnVjdCBzY3NpX3JlcXVlc3QgKiwgdTggKiwgdTggKiwgaW50KSkKKwkgICAgICAgKCpjb21wYXJlX2ZuKShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgdTggKiwgdTggKiwgaW50KSkKIHsKLQlzdHJ1Y3Qgc3BpX2ludGVybmFsICppID0gdG9fc3BpX2ludGVybmFsKHNyZXEtPnNyX2hvc3QtPnRyYW5zcG9ydHQpOwotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNyZXEtPnNyX2RldmljZTsKKwlzdHJ1Y3Qgc3BpX2ludGVybmFsICppID0gdG9fc3BpX2ludGVybmFsKHNkZXYtPmhvc3QtPnRyYW5zcG9ydHQpOwogCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHNkZXYtPnNkZXZfdGFyZ2V0OwogCWludCBwZXJpb2QgPSAwLCBwcmV2cGVyaW9kID0gMDsgCiAJZW51bSBzcGlfY29tcGFyZV9yZXR1cm5zIHJldHZhbDsKQEAgLTY4MCw3ICs2ODQsNyBAQAogCiAJZm9yICg7OykgewogCQlpbnQgbmV3cGVyaW9kOwotCQlyZXR2YWwgPSBjb21wYXJlX2ZuKHNyZXEsIGJ1ZmZlciwgcHRyLCBEVl9MT09QUyk7CisJCXJldHZhbCA9IGNvbXBhcmVfZm4oc2RldiwgYnVmZmVyLCBwdHIsIERWX0xPT1BTKTsKIAogCQlpZiAocmV0dmFsID09IFNQSV9DT01QQVJFX1NVQ0NFU1MKIAkJICAgIHx8IHJldHZhbCA9PSBTUElfQ09NUEFSRV9TS0lQX1RFU1QpCkBAIC03MjYsOSArNzMwLDkgQEAKIH0KIAogc3RhdGljIGludAotc3BpX2R2X2RldmljZV9nZXRfZWNob19idWZmZXIoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgdTggKmJ1ZmZlcikKK3NwaV9kdl9kZXZpY2VfZ2V0X2VjaG9fYnVmZmVyKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgdTggKmJ1ZmZlcikKIHsKLQlpbnQgbDsKKwlpbnQgbCwgcmVzdWx0OwogCiAJLyogZmlyc3Qgb2ZmIGRvIGEgdGVzdCB1bml0IHJlYWR5LiAgVGhpcyBjYW4gZXJyb3Igb3V0IAogCSAqIGJlY2F1c2Ugb2YgcmVzZXJ2YXRpb25zIG9yIHNvbWUgb3RoZXIgcmVhc29uLiAgSWYgaXQKQEAgLTc0NCwxOCArNzQ4LDE2IEBACiAJfTsKIAogCQotCXNyZXEtPnNyX2NtZF9sZW4gPSAwOwotCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7Ci0KIAkvKiBXZSBzZW5kIGEgc2V0IG9mIHRocmVlIFRVUnMgdG8gY2xlYXIgYW55IG91dHN0YW5kaW5nIAogCSAqIHVuaXQgYXR0ZW50aW9uIGNvbmRpdGlvbnMgaWYgdGhleSBleGlzdCAoT3RoZXJ3aXNlIHRoZQogCSAqIGJ1ZmZlciB0ZXN0cyB3b24ndCBiZSBoYXBweSkuICBJZiB0aGUgVFVSIHN0aWxsIGZhaWxzCiAJICogKHJlc2VydmF0aW9uIGNvbmZsaWN0LCBkZXZpY2Ugbm90IHJlYWR5LCBldGMpIGp1c3QKIAkgKiBza2lwIHRoZSB3cml0ZSB0ZXN0cyAqLwogCWZvciAobCA9IDA7IDsgbCsrKSB7Ci0JCXNwaV93YWl0X3JlcShzcmVxLCBzcGlfdGVzdF91bml0X3JlYWR5LCBOVUxMLCAwKTsKKwkJcmVzdWx0ID0gc3BpX2V4ZWN1dGUoc2Rldiwgc3BpX3Rlc3RfdW5pdF9yZWFkeSwgRE1BX05PTkUsIAorCQkJCSAgICAgTlVMTCwgMCwgTlVMTCk7CiAKLQkJaWYoc3JlcS0+c3JfcmVzdWx0KSB7CisJCWlmKHJlc3VsdCkgewogCQkJaWYobCA+PSAzKQogCQkJCXJldHVybiAwOwogCQl9IGVsc2UgewpAQCAtNzY0LDEyICs3NjYsMTAgQEAKIAkJfQogCX0KIAotCXNyZXEtPnNyX2NtZF9sZW4gPSAwOwotCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCXJlc3VsdCA9IHNwaV9leGVjdXRlKHNkZXYsIHNwaV9yZWFkX2J1ZmZlcl9kZXNjcmlwdG9yLCAKKwkJCSAgICAgRE1BX0ZST01fREVWSUNFLCBidWZmZXIsIDQsIE5VTEwpOwogCi0Jc3BpX3dhaXRfcmVxKHNyZXEsIHNwaV9yZWFkX2J1ZmZlcl9kZXNjcmlwdG9yLCBidWZmZXIsIDQpOwotCi0JaWYgKHNyZXEtPnNyX3Jlc3VsdCkKKwlpZiAocmVzdWx0KQogCQkvKiBEZXZpY2UgaGFzIG5vIGVjaG8gYnVmZmVyICovCiAJCXJldHVybiAwOwogCkBAIC03NzcsMTcgKzc3NywxNiBAQAogfQogCiBzdGF0aWMgdm9pZAotc3BpX2R2X2RldmljZV9pbnRlcm5hbChzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxLCB1OCAqYnVmZmVyKQorc3BpX2R2X2RldmljZV9pbnRlcm5hbChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHU4ICpidWZmZXIpCiB7Ci0Jc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbChzcmVxLT5zcl9ob3N0LT50cmFuc3BvcnR0KTsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzcmVxLT5zcl9kZXZpY2U7CisJc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbChzZGV2LT5ob3N0LT50cmFuc3BvcnR0KTsKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzZGV2LT5zZGV2X3RhcmdldDsKIAlpbnQgbGVuID0gc2Rldi0+aW5xdWlyeV9sZW47CiAJLyogZmlyc3Qgc2V0IHVzIHVwIGZvciBuYXJyb3cgYXN5bmMgKi8KIAlEVl9TRVQob2Zmc2V0LCAwKTsKIAlEVl9TRVQod2lkdGgsIDApOwogCQotCWlmIChzcGlfZHZfZGV2aWNlX2NvbXBhcmVfaW5xdWlyeShzcmVxLCBidWZmZXIsIGJ1ZmZlciwgRFZfTE9PUFMpCisJaWYgKHNwaV9kdl9kZXZpY2VfY29tcGFyZV9pbnF1aXJ5KHNkZXYsIGJ1ZmZlciwgYnVmZmVyLCBEVl9MT09QUykKIAkgICAgIT0gU1BJX0NPTVBBUkVfU1VDQ0VTUykgewogCQlTUElfUFJJTlRLKHN0YXJnZXQsIEtFUk5fRVJSLCAiRG9tYWluIFZhbGlkYXRpb24gSW5pdGlhbCBJbnF1aXJ5IEZhaWxlZFxuIik7CiAJCS8qIEZJWE1FOiBzaG91bGQgcHJvYmFibHkgb2ZmbGluZSB0aGUgZGV2aWNlIGhlcmU/ICovCkBAIC03OTksNyArNzk4LDcgQEAKIAkgICAgc2NzaV9kZXZpY2Vfd2lkZShzZGV2KSkgewogCQlpLT5mLT5zZXRfd2lkdGgoc3RhcmdldCwgMSk7CiAKLQkJaWYgKHNwaV9kdl9kZXZpY2VfY29tcGFyZV9pbnF1aXJ5KHNyZXEsIGJ1ZmZlciwKKwkJaWYgKHNwaV9kdl9kZXZpY2VfY29tcGFyZV9pbnF1aXJ5KHNkZXYsIGJ1ZmZlciwKIAkJCQkJCSAgIGJ1ZmZlciArIGxlbiwKIAkJCQkJCSAgIERWX0xPT1BTKQogCQkgICAgIT0gU1BJX0NPTVBBUkVfU1VDQ0VTUykgewpAQCAtODIwLDcgKzgxOSw3IEBACiAKIAlsZW4gPSAwOwogCWlmIChzY3NpX2RldmljZV9kdChzZGV2KSkKLQkJbGVuID0gc3BpX2R2X2RldmljZV9nZXRfZWNob19idWZmZXIoc3JlcSwgYnVmZmVyKTsKKwkJbGVuID0gc3BpX2R2X2RldmljZV9nZXRfZWNob19idWZmZXIoc2RldiwgYnVmZmVyKTsKIAogIHJldHJ5OgogCkBAIC04NDYsNyArODQ1LDcgQEAKIAogCWlmIChsZW4gPT0gMCkgewogCQlTUElfUFJJTlRLKHN0YXJnZXQsIEtFUk5fSU5GTywgIkRvbWFpbiBWYWxpZGF0aW9uIHNraXBwaW5nIHdyaXRlIHRlc3RzXG4iKTsKLQkJc3BpX2R2X3JldHJhaW4oc3JlcSwgYnVmZmVyLCBidWZmZXIgKyBsZW4sCisJCXNwaV9kdl9yZXRyYWluKHNkZXYsIGJ1ZmZlciwgYnVmZmVyICsgbGVuLAogCQkJICAgICAgIHNwaV9kdl9kZXZpY2VfY29tcGFyZV9pbnF1aXJ5KTsKIAkJcmV0dXJuOwogCX0KQEAgLTg1Niw3ICs4NTUsNyBAQAogCQlsZW4gPSBTUElfTUFYX0VDSE9fQlVGRkVSX1NJWkU7CiAJfQogCi0JaWYgKHNwaV9kdl9yZXRyYWluKHNyZXEsIGJ1ZmZlciwgYnVmZmVyICsgbGVuLAorCWlmIChzcGlfZHZfcmV0cmFpbihzZGV2LCBidWZmZXIsIGJ1ZmZlciArIGxlbiwKIAkJCSAgIHNwaV9kdl9kZXZpY2VfZWNob19idWZmZXIpCiAJICAgID09IFNQSV9DT01QQVJFX1NLSVBfVEVTVCkgewogCQkvKiBPSywgdGhlIHN0dXBpZCBkcml2ZSBjYW4ndCBkbyBhIHdyaXRlIGVjaG8gYnVmZmVyCkBAIC04NzksMTYgKzg3OCwxMiBAQAogdm9pZAogc3BpX2R2X2RldmljZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7Ci0Jc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZGV2LCBHRlBfS0VSTkVMKTsKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzZGV2LT5zZGV2X3RhcmdldDsKIAl1OCAqYnVmZmVyOwogCWNvbnN0IGludCBsZW4gPSBTUElfTUFYX0VDSE9fQlVGRkVSX1NJWkUqMjsKIAotCWlmICh1bmxpa2VseSghc3JlcSkpCi0JCXJldHVybjsKLQogCWlmICh1bmxpa2VseShzY3NpX2RldmljZV9nZXQoc2RldikpKQotCQlnb3RvIG91dF9mcmVlX3JlcTsKKwkJcmV0dXJuOwogCiAJYnVmZmVyID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwogCkBAIC05MDksNyArOTA0LDcgQEAKIAogCVNQSV9QUklOVEsoc3RhcmdldCwgS0VSTl9JTkZPLCAiQmVnaW5uaW5nIERvbWFpbiBWYWxpZGF0aW9uXG4iKTsKIAotCXNwaV9kdl9kZXZpY2VfaW50ZXJuYWwoc3JlcSwgYnVmZmVyKTsKKwlzcGlfZHZfZGV2aWNlX2ludGVybmFsKHNkZXYsIGJ1ZmZlcik7CiAKIAlTUElfUFJJTlRLKHN0YXJnZXQsIEtFUk5fSU5GTywgIkVuZGluZyBEb21haW4gVmFsaWRhdGlvblxuIik7CiAKQEAgLTkyNCw4ICs5MTksNiBAQAogCWtmcmVlKGJ1ZmZlcik7CiAgb3V0X3B1dDoKIAlzY3NpX2RldmljZV9wdXQoc2Rldik7Ci0gb3V0X2ZyZWVfcmVxOgotCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOwogfQogRVhQT1JUX1NZTUJPTChzcGlfZHZfZGV2aWNlKTsKIApAQCAtMTAyOCwxMCArMTAyMSwxNyBAQAogCQlzcHJpbnRfZnJhYyh0bXAsIHBpY29zZWMsIDEwMDApOwogCiAJCWRldl9pbmZvKCZzdGFyZ2V0LT5kZXYsCi0JCQkiJXMgJXNTQ1NJICVkLiVkIE1CL3MgJXMlcyVzICglcyBucywgb2Zmc2V0ICVkKVxuIiwKLQkJCXNjc2ksIHRwLT53aWR0aCA/ICJXSURFICIgOiAiIiwga2IxMDAvMTAsIGtiMTAwICUgMTAsCi0JCQl0cC0+ZHQgPyAiRFQiIDogIlNUIiwgdHAtPml1ID8gIiBJVSIgOiAiIiwKLQkJCXRwLT5xYXMgID8gIiBRQVMiIDogIiIsIHRtcCwgdHAtPm9mZnNldCk7CisJCQkgIiVzICVzU0NTSSAlZC4lZCBNQi9zICVzJXMlcyVzJXMlcyVzJXMgKCVzIG5zLCBvZmZzZXQgJWQpXG4iLAorCQkJIHNjc2ksIHRwLT53aWR0aCA/ICJXSURFICIgOiAiIiwga2IxMDAvMTAsIGtiMTAwICUgMTAsCisJCQkgdHAtPmR0ID8gIkRUIiA6ICJTVCIsCisJCQkgdHAtPml1ID8gIiBJVSIgOiAiIiwKKwkJCSB0cC0+cWFzICA/ICIgUUFTIiA6ICIiLAorCQkJIHRwLT5yZF9zdHJtID8gIiBSRFNUUk0iIDogIiIsCisJCQkgdHAtPnJ0aSA/ICIgUlRJIiA6ICIiLAorCQkJIHRwLT53cl9mbG93ID8gIiBXUkZMT1ciIDogIiIsCisJCQkgdHAtPnBjb21wX2VuID8gIiBQQ09NUCIgOiAiIiwKKwkJCSB0cC0+aG9sZF9tY3MgPyAiIEhNQ1MiIDogIiIsCisJCQkgdG1wLCB0cC0+b2Zmc2V0KTsKIAl9IGVsc2UgewogCQlkZXZfaW5mbygmc3RhcmdldC0+ZGV2LCAiJXNhc3luY2hyb25vdXMuXG4iLAogCQkJCXRwLT53aWR0aCA/ICJ3aWRlICIgOiAiIik7CkBAIC0xMDczLDYgKzEwNzMsNyBAQAogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3Qgc3BpX2ludGVybmFsICppOwogCiAJaWYgKCFzY3NpX2lzX3NkZXZfZGV2aWNlKGRldikpCiAJCXJldHVybiAwOwpAQCAtMTA4NSw2ICsxMDg2LDkgQEAKIAkvKiBOb3RlOiB0aGlzIGNsYXNzIGhhcyBubyBkZXZpY2UgYXR0cmlidXRlcywgc28gaXQgaGFzCiAJICogbm8gcGVyLUhCQSBhbGxvY2F0aW9uIGFuZCB0aHVzIHdlIGRvbid0IG5lZWQgdG8gZGlzdGluZ3Vpc2gKIAkgKiB0aGUgYXR0cmlidXRlIGNvbnRhaW5lcnMgZm9yIHRoZSBkZXZpY2UgKi8KKwlpID0gdG9fc3BpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKwlpZiAoaS0+Zi0+ZGVueV9iaW5kaW5nICYmIGktPmYtPmRlbnlfYmluZGluZyhzZGV2LT5zZGV2X3RhcmdldCkpCisJCXJldHVybiAwOwogCXJldHVybiAxOwogfQogCkBAIC0xMDkyLDYgKzEwOTYsNyBAQAogCQkJICAgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQ7CiAJc3RydWN0IHNwaV9pbnRlcm5hbCAqaTsKIAogCWlmICghc2NzaV9pc190YXJnZXRfZGV2aWNlKGRldikpCkBAIC0xMTAzLDcgKzExMDgsMTEgQEAKIAkJcmV0dXJuIDA7CiAKIAlpID0gdG9fc3BpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKLQkKKwlzdGFyZ2V0ID0gdG9fc2NzaV90YXJnZXQoZGV2KTsKKworCWlmIChpLT5mLT5kZW55X2JpbmRpbmcgJiYgaS0+Zi0+ZGVueV9iaW5kaW5nKHN0YXJnZXQpKQorCQlyZXR1cm4gMDsKKwogCXJldHVybiAmaS0+dC50YXJnZXRfYXR0cnMuYWMgPT0gY29udDsKIH0KIApAQCAtMTE1NCw2ICsxMTYzLDcgQEAKIAlTRVRVUF9BVFRSSUJVVEUocmRfc3RybSk7CiAJU0VUVVBfQVRUUklCVVRFKHJ0aSk7CiAJU0VUVVBfQVRUUklCVVRFKHBjb21wX2VuKTsKKwlTRVRVUF9BVFRSSUJVVEUoaG9sZF9tY3MpOwogCiAJLyogaWYgeW91IGFkZCBhbiBhdHRyaWJ1dGUgYnV0IGZvcmdldCB0byBpbmNyZWFzZSBTUElfTlVNX0FUVFJTCiAJICogdGhpcyBidWcgd2lsbCB0cmlnZ2VyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2QuYyBiL2RyaXZlcnMvc2NzaS9zZC5jCmluZGV4IDA0MTBlMWIuLmRlNTY0YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZC5jCkBAIC01OSw3ICs1OSw2IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgogCiAjaW5jbHVkZSAic2NzaV9sb2dnaW5nLmgiCkBAIC0xMjUsNyArMTI0LDcgQEAKIHN0YXRpYyB2b2lkIHNkX2VuZF9mbHVzaChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CiBzdGF0aWMgaW50IHNkX3ByZXBhcmVfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwogc3RhdGljIHZvaWQgc2RfcmVhZF9jYXBhY2l0eShzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwLCBjaGFyICpkaXNrbmFtZSwKLQkJIHN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpOworCQkJICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXIpOwogCiBzdGF0aWMgc3RydWN0IHNjc2lfZHJpdmVyIHNkX3RlbXBsYXRlID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCkBAIC02ODIsMTkgKzY4MSwxMyBAQAogCiBzdGF0aWMgaW50IHNkX3N5bmNfY2FjaGUoc3RydWN0IHNjc2lfZGV2aWNlICpzZHApCiB7Ci0Jc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcTsKIAlpbnQgcmV0cmllcywgcmVzOworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKIAogCWlmICghc2NzaV9kZXZpY2Vfb25saW5lKHNkcCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3JlcSA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZHAsIEdGUF9LRVJORUwpOwotCWlmICghc3JlcSkgewotCQlwcmludGsoIkZBSUxFRFxuICBObyBtZW1vcnkgZm9yIHJlcXVlc3RcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKLQlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOwogCWZvciAocmV0cmllcyA9IDM7IHJldHJpZXMgPiAwOyAtLXJldHJpZXMpIHsKIAkJdW5zaWduZWQgY2hhciBjbWRbMTBdID0geyAwIH07CiAKQEAgLTcwMywyMiArNjk2LDIwIEBACiAJCSAqIExlYXZlIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kIHplcm8gdG8gaW5kaWNhdGUKIAkJICogZmx1c2ggZXZlcnl0aGluZy4KIAkJICovCi0JCXNjc2lfd2FpdF9yZXEoc3JlcSwgY21kLCBOVUxMLCAwLCBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUyk7Ci0JCWlmIChzcmVxLT5zcl9yZXN1bHQgPT0gMCkKKwkJcmVzID0gc2NzaV9leGVjdXRlX3JlcShzZHAsIGNtZCwgRE1BX05PTkUsIE5VTEwsIDAsICZzc2hkciwKKwkJCQkgICAgICAgU0RfVElNRU9VVCwgU0RfTUFYX1JFVFJJRVMpOworCQlpZiAocmVzID09IDApCiAJCQlicmVhazsKIAl9CiAKLQlyZXMgPSBzcmVxLT5zcl9yZXN1bHQ7Ci0JaWYgKHJlcykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJGQUlMRURcbiAgc3RhdHVzID0gJXgsIG1lc3NhZ2UgPSAlMDJ4LCAiCisJaWYgKHJlcykgewkJcHJpbnRrKEtFUk5fV0FSTklORyAiRkFJTEVEXG4gIHN0YXR1cyA9ICV4LCBtZXNzYWdlID0gJTAyeCwgIgogCQkJCSAgICAiaG9zdCA9ICVkLCBkcml2ZXIgPSAlMDJ4XG4gICIsCiAJCQkJICAgIHN0YXR1c19ieXRlKHJlcyksIG1zZ19ieXRlKHJlcyksCiAJCQkJICAgIGhvc3RfYnl0ZShyZXMpLCBkcml2ZXJfYnl0ZShyZXMpKTsKIAkJCWlmIChkcml2ZXJfYnl0ZShyZXMpICYgRFJJVkVSX1NFTlNFKQotCQkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCJzZCIsIHNyZXEpOworCQkJCXNjc2lfcHJpbnRfc2Vuc2VfaGRyKCJzZCIsICZzc2hkcik7CiAJfQogCi0Jc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtOTU3LDIyICs5NDgsMTkgQEAKIAlzY3NpX2lvX2NvbXBsZXRpb24oU0NwbnQsIGdvb2RfYnl0ZXMsIGJsb2NrX3NlY3RvcnMgPDwgOSk7CiB9CiAKLXN0YXRpYyBpbnQgbWVkaWFfbm90X3ByZXNlbnQoc3RydWN0IHNjc2lfZGlzayAqc2RrcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JwKQorc3RhdGljIGludCBtZWRpYV9ub3RfcHJlc2VudChzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwLAorCQkJICAgICBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKnNzaGRyKQogewotCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKIAotCWlmICghc3JwLT5zcl9yZXN1bHQpCi0JCXJldHVybiAwOwotCWlmICghKGRyaXZlcl9ieXRlKHNycC0+c3JfcmVzdWx0KSAmIERSSVZFUl9TRU5TRSkpCisJaWYgKCFzY3NpX3NlbnNlX3ZhbGlkKHNzaGRyKSkKIAkJcmV0dXJuIDA7CiAJLyogbm90IGludm9rZWQgZm9yIGNvbW1hbmRzIHRoYXQgY291bGQgcmV0dXJuIGRlZmVycmVkIGVycm9ycyAqLwotCWlmIChzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKHNycCwgJnNzaGRyKSkgewotCQlpZiAoc3NoZHIuc2Vuc2Vfa2V5ICE9IE5PVF9SRUFEWSAmJgotCQkgICAgc3NoZHIuc2Vuc2Vfa2V5ICE9IFVOSVRfQVRURU5USU9OKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChzc2hkci5hc2MgIT0gMHgzQSkgLyogbWVkaXVtIG5vdCBwcmVzZW50ICovCi0JCQlyZXR1cm4gMDsKLQl9CisJaWYgKHNzaGRyLT5zZW5zZV9rZXkgIT0gTk9UX1JFQURZICYmCisJICAgIHNzaGRyLT5zZW5zZV9rZXkgIT0gVU5JVF9BVFRFTlRJT04pCisJCXJldHVybiAwOworCWlmIChzc2hkci0+YXNjICE9IDB4M0EpIC8qIG1lZGl1bSBub3QgcHJlc2VudCAqLworCQlyZXR1cm4gMDsKKwogCXNldF9tZWRpYV9ub3RfcHJlc2VudChzZGtwKTsKIAlyZXR1cm4gMTsKIH0KQEAgLTk4MSwxMCArOTY5LDEwIEBACiAgKiBzcGludXAgZGlzayAtIGNhbGxlZCBvbmx5IGluIHNkX3JldmFsaWRhdGVfZGlzaygpCiAgKi8KIHN0YXRpYyB2b2lkCi1zZF9zcGludXBfZGlzayhzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwLCBjaGFyICpkaXNrbmFtZSwKLQkgICAgICAgc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikgeworc2Rfc3BpbnVwX2Rpc2soc3RydWN0IHNjc2lfZGlzayAqc2RrcCwgY2hhciAqZGlza25hbWUpCit7CiAJdW5zaWduZWQgY2hhciBjbWRbMTBdOwotCXVuc2lnbmVkIGxvbmcgc3BpbnRpbWVfdmFsdWUgPSAwOworCXVuc2lnbmVkIGxvbmcgc3BpbnRpbWVfZXhwaXJlID0gMDsKIAlpbnQgcmV0cmllcywgc3BpbnRpbWU7CiAJdW5zaWduZWQgaW50IHRoZV9yZXN1bHQ7CiAJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOwpAQCAtMTAwMSwxOCArOTg5LDEzIEBACiAJCQljbWRbMF0gPSBURVNUX1VOSVRfUkVBRFk7CiAJCQltZW1zZXQoKHZvaWQgKikgJmNtZFsxXSwgMCwgOSk7CiAKLQkJCVNScG50LT5zcl9jbWRfbGVuID0gMDsKLQkJCW1lbXNldChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyLCAwLAotCQkJICAgICAgIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7Ci0JCQlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKwkJCXRoZV9yZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNka3AtPmRldmljZSwgY21kLAorCQkJCQkJICAgICAgRE1BX05PTkUsIE5VTEwsIDAsCisJCQkJCQkgICAgICAmc3NoZHIsIFNEX1RJTUVPVVQsCisJCQkJCQkgICAgICBTRF9NQVhfUkVUUklFUyk7CiAKLQkJCXNjc2lfd2FpdF9yZXEgKFNScG50LCAodm9pZCAqKSBjbWQsICh2b2lkICopIGJ1ZmZlciwKLQkJCQkgICAgICAgMC8qNTEyKi8sIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTKTsKLQotCQkJdGhlX3Jlc3VsdCA9IFNScG50LT5zcl9yZXN1bHQ7CiAJCQlpZiAodGhlX3Jlc3VsdCkKLQkJCQlzZW5zZV92YWxpZCA9IHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2UoCi0JCQkJCQkJU1JwbnQsICZzc2hkcik7CisJCQkJc2Vuc2VfdmFsaWQgPSBzY3NpX3NlbnNlX3ZhbGlkKCZzc2hkcik7CiAJCQlyZXRyaWVzKys7CiAJCX0gd2hpbGUgKHJldHJpZXMgPCAzICYmIAogCQkJICghc2NzaV9zdGF0dXNfaXNfZ29vZCh0aGVfcmVzdWx0KSB8fApAQCAtMTAyNCw3ICsxMDA3LDcgQEAKIAkJICogYW55IG1lZGlhIGluIGl0LCBkb24ndCBib3RoZXIgd2l0aCBhbnkgb2YgdGhlIHJlc3Qgb2YKIAkJICogdGhpcyBjcmFwLgogCQkgKi8KLQkJaWYgKG1lZGlhX25vdF9wcmVzZW50KHNka3AsIFNScG50KSkKKwkJaWYgKG1lZGlhX25vdF9wcmVzZW50KHNka3AsICZzc2hkcikpCiAJCQlyZXR1cm47CiAKIAkJaWYgKChkcml2ZXJfYnl0ZSh0aGVfcmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgPT0gMCkgewpAQCAtMTA2MywzMyArMTA0Niw0MiBAQAogCQkJCWNtZFsxXSA9IDE7CS8qIFJldHVybiBpbW1lZGlhdGVseSAqLwogCQkJCW1lbXNldCgodm9pZCAqKSAmY21kWzJdLCAwLCA4KTsKIAkJCQljbWRbNF0gPSAxOwkvKiBTdGFydCBzcGluIGN5Y2xlICovCi0JCQkJU1JwbnQtPnNyX2NtZF9sZW4gPSAwOwotCQkJCW1lbXNldChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyLCAwLAotCQkJCQlTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOwotCi0JCQkJU1JwbnQtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7Ci0JCQkJc2NzaV93YWl0X3JlcShTUnBudCwgKHZvaWQgKiljbWQsIAotCQkJCQkgICAgICAodm9pZCAqKSBidWZmZXIsIDAvKjUxMiovLCAKLQkJCQkJICAgICAgU0RfVElNRU9VVCwgU0RfTUFYX1JFVFJJRVMpOwotCQkJCXNwaW50aW1lX3ZhbHVlID0gamlmZmllczsKKwkJCQlzY3NpX2V4ZWN1dGVfcmVxKHNka3AtPmRldmljZSwgY21kLCBETUFfTk9ORSwKKwkJCQkJCSBOVUxMLCAwLCAmc3NoZHIsCisJCQkJCQkgU0RfVElNRU9VVCwgU0RfTUFYX1JFVFJJRVMpOworCQkJCXNwaW50aW1lX2V4cGlyZSA9IGppZmZpZXMgKyAxMDAgKiBIWjsKKwkJCQlzcGludGltZSA9IDE7CiAJCQl9Ci0JCQlzcGludGltZSA9IDE7CiAJCQkvKiBXYWl0IDEgc2Vjb25kIGZvciBuZXh0IHRyeSAqLwogCQkJbXNsZWVwKDEwMDApOwogCQkJcHJpbnRrKCIuIik7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgVVNCIGZsYXNoIGRldmljZXMgd2l0aCBzbG93IGZpcm13YXJlLgorCQkgKiBZZXMsIHRoaXMgc2Vuc2Uga2V5L0FTQyBjb21iaW5hdGlvbiBzaG91bGRuJ3QKKwkJICogb2NjdXIgaGVyZS4gIEl0J3MgY2hhcmFjdGVyaXN0aWMgb2YgdGhlc2UgZGV2aWNlcy4KKwkJICovCisJCX0gZWxzZSBpZiAoc2Vuc2VfdmFsaWQgJiYKKwkJCQlzc2hkci5zZW5zZV9rZXkgPT0gVU5JVF9BVFRFTlRJT04gJiYKKwkJCQlzc2hkci5hc2MgPT0gMHgyOCkgeworCQkJaWYgKCFzcGludGltZSkgeworCQkJCXNwaW50aW1lX2V4cGlyZSA9IGppZmZpZXMgKyA1ICogSFo7CisJCQkJc3BpbnRpbWUgPSAxOworCQkJfQorCQkJLyogV2FpdCAxIHNlY29uZCBmb3IgbmV4dCB0cnkgKi8KKwkJCW1zbGVlcCgxMDAwKTsKIAkJfSBlbHNlIHsKIAkJCS8qIHdlIGRvbid0IHVuZGVyc3RhbmQgdGhlIHNlbnNlIGNvZGUsIHNvIGl0J3MKIAkJCSAqIHByb2JhYmx5IHBvaW50bGVzcyB0byBsb29wICovCiAJCQlpZighc3BpbnRpbWUpIHsKIAkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBVbml0IE5vdCBSZWFkeSwgIgogCQkJCQkic2Vuc2U6XG4iLCBkaXNrbmFtZSk7Ci0JCQkJc2NzaV9wcmludF9yZXFfc2Vuc2UoIiIsIFNScG50KTsKKwkJCQlzY3NpX3ByaW50X3NlbnNlX2hkcigiIiwgJnNzaGRyKTsKIAkJCX0KIAkJCWJyZWFrOwogCQl9CiAJCQkJCi0JfSB3aGlsZSAoc3BpbnRpbWUgJiYKLQkJIHRpbWVfYWZ0ZXIoc3BpbnRpbWVfdmFsdWUgKyAxMDAgKiBIWiwgamlmZmllcykpOworCX0gd2hpbGUgKHNwaW50aW1lICYmIHRpbWVfYmVmb3JlX2VxKGppZmZpZXMsIHNwaW50aW1lX2V4cGlyZSkpOwogCiAJaWYgKHNwaW50aW1lKSB7CiAJCWlmIChzY3NpX3N0YXR1c19pc19nb29kKHRoZV9yZXN1bHQpKQpAQCAtMTEwNCwxNCArMTA5NiwxNSBAQAogICovCiBzdGF0aWMgdm9pZAogc2RfcmVhZF9jYXBhY2l0eShzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwLCBjaGFyICpkaXNrbmFtZSwKLQkJIHN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpIHsKKwkJIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKK3sKIAl1bnNpZ25lZCBjaGFyIGNtZFsxNl07Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSBzZGtwLT5kZXZpY2U7CiAJaW50IHRoZV9yZXN1bHQsIHJldHJpZXM7CiAJaW50IHNlY3Rvcl9zaXplID0gMDsKIAlpbnQgbG9uZ3JjID0gMDsKIAlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CiAJaW50IHNlbnNlX3ZhbGlkID0gMDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHNka3AtPmRldmljZTsKIAogcmVwZWF0OgogCXJldHJpZXMgPSAzOwpAQCAtMTEyOCwyMCArMTEyMSwxNSBAQAogCQkJbWVtc2V0KCh2b2lkICopIGJ1ZmZlciwgMCwgOCk7CiAJCX0KIAkJCi0JCVNScG50LT5zcl9jbWRfbGVuID0gMDsKLQkJbWVtc2V0KFNScG50LT5zcl9zZW5zZV9idWZmZXIsIDAsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7Ci0JCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwkJdGhlX3Jlc3VsdCA9IHNjc2lfZXhlY3V0ZV9yZXEoc2RwLCBjbWQsIERNQV9GUk9NX0RFVklDRSwKKwkJCQkJICAgICAgYnVmZmVyLCBsb25ncmMgPyAxMiA6IDgsICZzc2hkciwKKwkJCQkJICAgICAgU0RfVElNRU9VVCwgU0RfTUFYX1JFVFJJRVMpOwogCi0JCXNjc2lfd2FpdF9yZXEoU1JwbnQsICh2b2lkICopIGNtZCwgKHZvaWQgKikgYnVmZmVyLAotCQkJICAgICAgbG9uZ3JjID8gMTIgOiA4LCBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUyk7Ci0KLQkJaWYgKG1lZGlhX25vdF9wcmVzZW50KHNka3AsIFNScG50KSkKKwkJaWYgKG1lZGlhX25vdF9wcmVzZW50KHNka3AsICZzc2hkcikpCiAJCQlyZXR1cm47CiAKLQkJdGhlX3Jlc3VsdCA9IFNScG50LT5zcl9yZXN1bHQ7CiAJCWlmICh0aGVfcmVzdWx0KQotCQkJc2Vuc2VfdmFsaWQgPSBzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKFNScG50LAotCQkJCQkJCQkgICAmc3NoZHIpOworCQkJc2Vuc2VfdmFsaWQgPSBzY3NpX3NlbnNlX3ZhbGlkKCZzc2hkcik7CiAJCXJldHJpZXMtLTsKIAogCX0gd2hpbGUgKHRoZV9yZXN1bHQgJiYgcmV0cmllcyk7CkBAIC0xMTU2LDcgKzExNDQsNyBAQAogCQkgICAgICAgZHJpdmVyX2J5dGUodGhlX3Jlc3VsdCkpOwogCiAJCWlmIChkcml2ZXJfYnl0ZSh0aGVfcmVzdWx0KSAmIERSSVZFUl9TRU5TRSkKLQkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCJzZCIsIFNScG50KTsKKwkJCXNjc2lfcHJpbnRfc2Vuc2VfaGRyKCJzZCIsICZzc2hkcik7CiAJCWVsc2UKIAkJCXByaW50aygiJXMgOiBzZW5zZSBub3QgYXZhaWxhYmxlLiBcbiIsIGRpc2tuYW1lKTsKIApAQCAtMTI5NiwxMSArMTI4NCwxMyBAQAogCiAvKiBjYWxsZWQgd2l0aCBidWZmZXIgb2YgbGVuZ3RoIDUxMiAqLwogc3RhdGljIGlubGluZSBpbnQKLXNkX2RvX21vZGVfc2Vuc2Uoc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQsIGludCBkYmQsIGludCBtb2RlcGFnZSwKLQkJIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwgc3RydWN0IHNjc2lfbW9kZV9kYXRhICpkYXRhKQorc2RfZG9fbW9kZV9zZW5zZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCwgaW50IGRiZCwgaW50IG1vZGVwYWdlLAorCQkgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuLCBzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgKmRhdGEsCisJCSBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKnNzaGRyKQogewotCXJldHVybiBfX3Njc2lfbW9kZV9zZW5zZShTUnBudCwgZGJkLCBtb2RlcGFnZSwgYnVmZmVyLCBsZW4sCi0JCQkJIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTLCBkYXRhKTsKKwlyZXR1cm4gc2NzaV9tb2RlX3NlbnNlKHNkcCwgZGJkLCBtb2RlcGFnZSwgYnVmZmVyLCBsZW4sCisJCQkgICAgICAgU0RfVElNRU9VVCwgU0RfTUFYX1JFVFJJRVMsIGRhdGEsCisJCQkgICAgICAgc3NoZHIpOwogfQogCiAvKgpAQCAtMTMwOSwyNSArMTI5OSwyNyBAQAogICovCiBzdGF0aWMgdm9pZAogc2RfcmVhZF93cml0ZV9wcm90ZWN0X2ZsYWcoc3RydWN0IHNjc2lfZGlzayAqc2RrcCwgY2hhciAqZGlza25hbWUsCi0JCSAgIHN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpIHsKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKK3sKIAlpbnQgcmVzOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gc2RrcC0+ZGV2aWNlOwogCXN0cnVjdCBzY3NpX21vZGVfZGF0YSBkYXRhOwogCiAJc2V0X2Rpc2tfcm8oc2RrcC0+ZGlzaywgMCk7Ci0JaWYgKHNka3AtPmRldmljZS0+c2tpcF9tc19wYWdlXzNmKSB7CisJaWYgKHNkcC0+c2tpcF9tc19wYWdlXzNmKSB7CiAJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGFzc3VtaW5nIFdyaXRlIEVuYWJsZWRcbiIsIGRpc2tuYW1lKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChzZGtwLT5kZXZpY2UtPnVzZV8xOTJfYnl0ZXNfZm9yXzNmKSB7Ci0JCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2UoU1JwbnQsIDAsIDB4M0YsIGJ1ZmZlciwgMTkyLCAmZGF0YSk7CisJaWYgKHNkcC0+dXNlXzE5Ml9ieXRlc19mb3JfM2YpIHsKKwkJcmVzID0gc2RfZG9fbW9kZV9zZW5zZShzZHAsIDAsIDB4M0YsIGJ1ZmZlciwgMTkyLCAmZGF0YSwgTlVMTCk7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogRmlyc3QgYXR0ZW1wdDogYXNrIGZvciBhbGwgcGFnZXMgKDB4M0YpLCBidXQgb25seSA0IGJ5dGVzLgogCQkgKiBXZSBoYXZlIHRvIHN0YXJ0IGNhcmVmdWxseTogc29tZSBkZXZpY2VzIGhhbmcgaWYgd2UgYXNrCiAJCSAqIGZvciBtb3JlIHRoYW4gaXMgYXZhaWxhYmxlLgogCQkgKi8KLQkJcmVzID0gc2RfZG9fbW9kZV9zZW5zZShTUnBudCwgMCwgMHgzRiwgYnVmZmVyLCA0LCAmZGF0YSk7CisJCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2Uoc2RwLCAwLCAweDNGLCBidWZmZXIsIDQsICZkYXRhLCBOVUxMKTsKIAogCQkvKgogCQkgKiBTZWNvbmQgYXR0ZW1wdDogYXNrIGZvciBwYWdlIDAgV2hlbiBvbmx5IHBhZ2UgMCBpcwpAQCAtMTMzNiwxNCArMTMyOCwxNCBAQAogCQkgKiBDREIuCiAJCSAqLwogCQlpZiAoIXNjc2lfc3RhdHVzX2lzX2dvb2QocmVzKSkKLQkJCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2UoU1JwbnQsIDAsIDAsIGJ1ZmZlciwgNCwgJmRhdGEpOworCQkJcmVzID0gc2RfZG9fbW9kZV9zZW5zZShzZHAsIDAsIDAsIGJ1ZmZlciwgNCwgJmRhdGEsIE5VTEwpOwogCiAJCS8qCiAJCSAqIFRoaXJkIGF0dGVtcHQ6IGFzayAyNTUgYnl0ZXMsIGFzIHdlIGRpZCBlYXJsaWVyLgogCQkgKi8KIAkJaWYgKCFzY3NpX3N0YXR1c19pc19nb29kKHJlcykpCi0JCQlyZXMgPSBzZF9kb19tb2RlX3NlbnNlKFNScG50LCAwLCAweDNGLCBidWZmZXIsIDI1NSwKLQkJCQkJICAgICAgICZkYXRhKTsKKwkJCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2Uoc2RwLCAwLCAweDNGLCBidWZmZXIsIDI1NSwKKwkJCQkJICAgICAgICZkYXRhLCBOVUxMKTsKIAl9CiAKIAlpZiAoIXNjc2lfc3RhdHVzX2lzX2dvb2QocmVzKSkgewpAQCAtMTM2NSwxOSArMTM1NywyMCBAQAogICovCiBzdGF0aWMgdm9pZAogc2RfcmVhZF9jYWNoZV90eXBlKHN0cnVjdCBzY3NpX2Rpc2sgKnNka3AsIGNoYXIgKmRpc2tuYW1lLAotCQkgICBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKQorCQkgICB1bnNpZ25lZCBjaGFyICpidWZmZXIpCiB7CiAJaW50IGxlbiA9IDAsIHJlczsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHNka3AtPmRldmljZTsKIAogCWludCBkYmQ7CiAJaW50IG1vZGVwYWdlOwogCXN0cnVjdCBzY3NpX21vZGVfZGF0YSBkYXRhOwogCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKIAotCWlmIChzZGtwLT5kZXZpY2UtPnNraXBfbXNfcGFnZV84KQorCWlmIChzZHAtPnNraXBfbXNfcGFnZV84KQogCQlnb3RvIGRlZmF1bHRzOwogCi0JaWYgKHNka3AtPmRldmljZS0+dHlwZSA9PSBUWVBFX1JCQykgeworCWlmIChzZHAtPnR5cGUgPT0gVFlQRV9SQkMpIHsKIAkJbW9kZXBhZ2UgPSA2OwogCQlkYmQgPSA4OwogCX0gZWxzZSB7CkBAIC0xMzg2LDcgKzEzNzksNyBAQAogCX0KIAogCS8qIGNhdXRpb3VzbHkgYXNrICovCi0JcmVzID0gc2RfZG9fbW9kZV9zZW5zZShTUnBudCwgZGJkLCBtb2RlcGFnZSwgYnVmZmVyLCA0LCAmZGF0YSk7CisJcmVzID0gc2RfZG9fbW9kZV9zZW5zZShzZHAsIGRiZCwgbW9kZXBhZ2UsIGJ1ZmZlciwgNCwgJmRhdGEsICZzc2hkcik7CiAKIAlpZiAoIXNjc2lfc3RhdHVzX2lzX2dvb2QocmVzKSkKIAkJZ290byBiYWRfc2Vuc2U7CkBAIC0xNDA3LDcgKzE0MDAsNyBAQAogCWxlbiArPSBkYXRhLmhlYWRlcl9sZW5ndGggKyBkYXRhLmJsb2NrX2Rlc2NyaXB0b3JfbGVuZ3RoOwogCiAJLyogR2V0IHRoZSBkYXRhICovCi0JcmVzID0gc2RfZG9fbW9kZV9zZW5zZShTUnBudCwgZGJkLCBtb2RlcGFnZSwgYnVmZmVyLCBsZW4sICZkYXRhKTsKKwlyZXMgPSBzZF9kb19tb2RlX3NlbnNlKHNkcCwgZGJkLCBtb2RlcGFnZSwgYnVmZmVyLCBsZW4sICZkYXRhLCAmc3NoZHIpOwogCiAJaWYgKHNjc2lfc3RhdHVzX2lzX2dvb2QocmVzKSkgewogCQljb25zdCBjaGFyICp0eXBlc1tdID0gewpAQCAtMTQzOSw3ICsxNDMyLDcgQEAKIAl9CiAKIGJhZF9zZW5zZToKLQlpZiAoc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShTUnBudCwgJnNzaGRyKSAmJgorCWlmIChzY3NpX3NlbnNlX3ZhbGlkKCZzc2hkcikgJiYKIAkgICAgc3NoZHIuc2Vuc2Vfa2V5ID09IElMTEVHQUxfUkVRVUVTVCAmJgogCSAgICBzc2hkci5hc2MgPT0gMHgyNCAmJiBzc2hkci5hc2NxID09IDB4MCkKIAkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogY2FjaGUgZGF0YSB1bmF2YWlsYWJsZVxuIiwKQEAgLTE0NjQsNyArMTQ1Nyw2IEBACiB7CiAJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IHNjc2lfZGlzayhkaXNrKTsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHNka3AtPmRldmljZTsKLQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAogCVNDU0lfTE9HX0hMUVVFVUUoMywgcHJpbnRrKCJzZF9yZXZhbGlkYXRlX2Rpc2s6IGRpc2s9JXNcbiIsIGRpc2stPmRpc2tfbmFtZSkpOwpAQCAtMTQ3NiwxOCArMTQ2OCwxMSBAQAogCWlmICghc2NzaV9kZXZpY2Vfb25saW5lKHNkcCkpCiAJCWdvdG8gb3V0OwogCi0Jc3JlcSA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZHAsIEdGUF9LRVJORUwpOwotCWlmICghc3JlcSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIoc2RfcmV2YWxpZGF0ZV9kaXNrOikgUmVxdWVzdCBhbGxvY2F0aW9uICIKLQkJICAgICAgICJmYWlsdXJlLlxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQogCWJ1ZmZlciA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMIHwgX19HRlBfRE1BKTsKIAlpZiAoIWJ1ZmZlcikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIoc2RfcmV2YWxpZGF0ZV9kaXNrOikgTWVtb3J5IGFsbG9jYXRpb24gIgogCQkgICAgICAgImZhaWx1cmUuXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZXF1ZXN0OworCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBkZWZhdWx0cywgdW50aWwgdGhlIGRldmljZSB0ZWxscyB1cyBvdGhlcndpc2UgKi8KQEAgLTE0OTgsMjUgKzE0ODMsMjMgQEAKIAlzZGtwLT5XQ0UgPSAwOwogCXNka3AtPlJDRCA9IDA7CiAKLQlzZF9zcGludXBfZGlzayhzZGtwLCBkaXNrLT5kaXNrX25hbWUsIHNyZXEsIGJ1ZmZlcik7CisJc2Rfc3BpbnVwX2Rpc2soc2RrcCwgZGlzay0+ZGlza19uYW1lKTsKIAogCS8qCiAJICogV2l0aG91dCBtZWRpYSB0aGVyZSBpcyBubyByZWFzb24gdG8gYXNrOyBtb3Jlb3Zlciwgc29tZSBkZXZpY2VzCiAJICogcmVhY3QgYmFkbHkgaWYgd2UgZG8uCiAJICovCiAJaWYgKHNka3AtPm1lZGlhX3ByZXNlbnQpIHsKLQkJc2RfcmVhZF9jYXBhY2l0eShzZGtwLCBkaXNrLT5kaXNrX25hbWUsIHNyZXEsIGJ1ZmZlcik7CisJCXNkX3JlYWRfY2FwYWNpdHkoc2RrcCwgZGlzay0+ZGlza19uYW1lLCBidWZmZXIpOwogCQlpZiAoc2RwLT5yZW1vdmFibGUpCiAJCQlzZF9yZWFkX3dyaXRlX3Byb3RlY3RfZmxhZyhzZGtwLCBkaXNrLT5kaXNrX25hbWUsCi0JCQkJCXNyZXEsIGJ1ZmZlcik7Ci0JCXNkX3JlYWRfY2FjaGVfdHlwZShzZGtwLCBkaXNrLT5kaXNrX25hbWUsIHNyZXEsIGJ1ZmZlcik7CisJCQkJCQkgICBidWZmZXIpOworCQlzZF9yZWFkX2NhY2hlX3R5cGUoc2RrcCwgZGlzay0+ZGlza19uYW1lLCBidWZmZXIpOwogCX0KIAkJCiAJc2V0X2NhcGFjaXR5KGRpc2ssIHNka3AtPmNhcGFjaXR5KTsKIAlrZnJlZShidWZmZXIpOwogCi0gb3V0X3JlbGVhc2VfcmVxdWVzdDogCi0Jc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7CiAgb3V0OgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NnLmMgYi9kcml2ZXJzL3Njc2kvc2cuYwppbmRleCBlODIyY2EwLi5iMWI2OWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2cuYworKysgYi9kcml2ZXJzL3Njc2kvc2cuYwpAQCAtNjEsNyArNjEsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NDU0lfUFJPQ19GUwogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLXN0YXRpYyBjaGFyICpzZ192ZXJzaW9uX2RhdGUgPSAiMjAwNTAzMjgiOworc3RhdGljIGNoYXIgKnNnX3ZlcnNpb25fZGF0ZSA9ICIyMDA1MDkwMSI7CiAKIHN0YXRpYyBpbnQgc2dfcHJvY19pbml0KHZvaWQpOwogc3RhdGljIHZvaWQgc2dfcHJvY19jbGVhbnVwKHZvaWQpOwpAQCAtMTAyNyw4ICsxMDI3LDcgQEAKIAkJaWYgKHNkcC0+ZGV0YWNoZWQpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQlpZiAodGVzdF9iaXQoU0hPU1RfUkVDT1ZFUlksCi0JCQkJICAgICAmc2RwLT5kZXZpY2UtPmhvc3QtPnNob3N0X3N0YXRlKSkKKwkJCWlmIChzZHAtPmRldmljZS0+aG9zdC0+c2hvc3Rfc3RhdGUgPT0gU0hPU1RfUkVDT1ZFUlkpCiAJCQkJcmV0dXJuIC1FQlVTWTsKIAkJfSBlbHNlIGlmICghc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkcC0+ZGV2aWNlKSkKIAkJCXJldHVybiAtRUJVU1k7CkBAIC0xNzk1LDEyICsxNzk0LDEyIEBACiAJICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHNpemVfdCBjb3VudCwgaW50IHJ3LAogCSAgICAgICAgICB1bnNpZ25lZCBsb25nIG1heF9wZm4pCiB7CisJdW5zaWduZWQgbG9uZyBlbmQgPSAodWFkZHIgKyBjb3VudCArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHVhZGRyID4+IFBBR0VfU0hJRlQ7CisJY29uc3QgaW50IG5yX3BhZ2VzID0gZW5kIC0gc3RhcnQ7CiAJaW50IHJlcywgaSwgajsKLQl1bnNpZ25lZCBpbnQgbnJfcGFnZXM7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAotCW5yX3BhZ2VzID0gKCh1YWRkciAmIH5QQUdFX01BU0spICsgY291bnQgKyB+UEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOwotCiAJLyogVXNlciBhdHRlbXB0ZWQgT3ZlcmZsb3chICovCiAJaWYgKCh1YWRkciArIGNvdW50KSA8IHVhZGRyKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zci5jIGIvZHJpdmVycy9zY3NpL3NyLmMKaW5kZXggMmYyNTlmMi4uY2U2M2ZjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NyLmMKKysrIGIvZHJpdmVycy9zY3NpL3NyLmMKQEAgLTUwLDEwICs1MCwxMCBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RyaXZlci5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4JLyogRm9yIHRoZSBkb29yIGxvY2svdW5sb2NrIGNvbW1hbmRzICovCi0jaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KIAogI2luY2x1ZGUgInNjc2lfbG9nZ2luZy5oIgogI2luY2x1ZGUgInNyLmgiCkBAIC0xOTksMTUgKzE5OSw3IEBACiAJCS8qIGNoZWNrIG11bHRpc2Vzc2lvbiBvZmZzZXQgZXRjICovCiAJCXNyX2NkX2NoZWNrKGNkaSk7CiAKLQkJLyogCi0JCSAqIElmIHRoZSBkaXNrIGNoYW5nZWQsIHRoZSBjYXBhY2l0eSB3aWxsIG5vdyBiZSBkaWZmZXJlbnQsCi0JCSAqIHNvIHdlIGZvcmNlIGEgcmUtcmVhZCBvZiB0aGlzIGluZm9ybWF0aW9uIAotCQkgKiBGb3JjZSAyMDQ4IGZvciB0aGUgc2VjdG9yIHNpemUgc28gdGhhdCBmaWxlc3lzdGVtcyB3b24ndAotCQkgKiBiZSB0cnlpbmcgdG8gdXNlIHNvbWV0aGluZyB0aGF0IGlzIHRvbyBzbWFsbCBpZiB0aGUgZGlzYwotCQkgKiBoYXMgY2hhbmdlZC4KLQkJICovCi0JCWNkLT5uZWVkc19zZWN0b3Jfc2l6ZSA9IDE7Ci0JCWNkLT5kZXZpY2UtPnNlY3Rvcl9zaXplID0gMjA0ODsKKwkJZ2V0X3NlY3RvcnNpemUoY2QpOwogCX0KIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNTM4LDEzICs1MzAsNiBAQAogCWlmICghc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkZXYpKQogCQlnb3RvIGVycm9yX291dDsKIAotCS8qCi0JICogSWYgdGhpcyBkZXZpY2UgZGlkIG5vdCBoYXZlIG1lZGlhIGluIHRoZSBkcml2ZSBhdCBib290IHRpbWUsIHRoZW4KLQkgKiB3ZSB3b3VsZCBoYXZlIGJlZW4gdW5hYmxlIHRvIGdldCB0aGUgc2VjdG9yIHNpemUuICBDaGVjayB0byBzZWUgaWYKLQkgKiB0aGlzIGlzIHRoZSBjYXNlLCBhbmQgdHJ5IGFnYWluLgotCSAqLwotCWlmIChjZC0+bmVlZHNfc2VjdG9yX3NpemUpCi0JCWdldF9zZWN0b3JzaXplKGNkKTsKIAlyZXR1cm4gMDsKIAogZXJyb3Jfb3V0OgpAQCAtNjA0LDcgKzU4OSw2IEBACiAJY2QtPmRyaXZlciA9ICZzcl90ZW1wbGF0ZTsKIAljZC0+ZGlzayA9IGRpc2s7CiAJY2QtPmNhcGFjaXR5ID0gMHgxZmZmZmY7Ci0JY2QtPm5lZWRzX3NlY3Rvcl9zaXplID0gMTsKIAljZC0+ZGV2aWNlLT5jaGFuZ2VkID0gMTsJLyogZm9yY2UgcmVjaGVjayBDRCB0eXBlICovCiAJY2QtPnVzZSA9IDE7CiAJY2QtPnJlYWRjZF9rbm93biA9IDA7CkBAIC02NTgsNDMgKzY0MiwzMCBAQAogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAlpbnQgdGhlX3Jlc3VsdCwgcmV0cmllcyA9IDM7CiAJaW50IHNlY3Rvcl9zaXplOwotCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50ID0gTlVMTDsKIAlyZXF1ZXN0X3F1ZXVlX3QgKnF1ZXVlOwogCiAJYnVmZmVyID0ga21hbGxvYyg1MTIsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAlpZiAoIWJ1ZmZlcikKIAkJZ290byBFbm9tZW07Ci0JU1JwbnQgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3QoY2QtPmRldmljZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFTUnBudCkKLQkJZ290byBFbm9tZW07CiAKIAlkbyB7CiAJCWNtZFswXSA9IFJFQURfQ0FQQUNJVFk7CiAJCW1lbXNldCgodm9pZCAqKSAmY21kWzFdLCAwLCA5KTsKLQkJLyogTWFyayBhcyByZWFsbHkgYnVzeSAqLwotCQlTUnBudC0+c3JfcmVxdWVzdC0+cnFfc3RhdHVzID0gUlFfU0NTSV9CVVNZOwotCQlTUnBudC0+c3JfY21kX2xlbiA9IDA7Ci0KIAkJbWVtc2V0KGJ1ZmZlciwgMCwgOCk7CiAKIAkJLyogRG8gdGhlIGNvbW1hbmQgYW5kIHdhaXQuLiAqLwotCQlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7Ci0JCXNjc2lfd2FpdF9yZXEoU1JwbnQsICh2b2lkICopIGNtZCwgKHZvaWQgKikgYnVmZmVyLAotCQkJICAgICAgOCwgU1JfVElNRU9VVCwgTUFYX1JFVFJJRVMpOworCQl0aGVfcmVzdWx0ID0gc2NzaV9leGVjdXRlX3JlcShjZC0+ZGV2aWNlLCBjbWQsIERNQV9GUk9NX0RFVklDRSwKKwkJCQkJICAgICAgYnVmZmVyLCA4LCBOVUxMLCBTUl9USU1FT1VULAorCQkJCQkgICAgICBNQVhfUkVUUklFUyk7CiAKLQkJdGhlX3Jlc3VsdCA9IFNScG50LT5zcl9yZXN1bHQ7CiAJCXJldHJpZXMtLTsKIAogCX0gd2hpbGUgKHRoZV9yZXN1bHQgJiYgcmV0cmllcyk7CiAKIAotCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKLQlTUnBudCA9IE5VTEw7Ci0KIAlpZiAodGhlX3Jlc3VsdCkgewogCQljZC0+Y2FwYWNpdHkgPSAweDFmZmZmZjsKIAkJc2VjdG9yX3NpemUgPSAyMDQ4OwkvKiBBIGd1ZXNzLCBqdXN0IGluIGNhc2UgKi8KLQkJY2QtPm5lZWRzX3NlY3Rvcl9zaXplID0gMTsKIAl9IGVsc2UgewogI2lmIDAKIAkJaWYgKGNkcm9tX2dldF9sYXN0X3dyaXR0ZW4oJmNkLT5jZGksCkBAIC03MjcsNyArNjk4LDYgQEAKIAkJCXByaW50aygiJXM6IHVuc3VwcG9ydGVkIHNlY3RvciBzaXplICVkLlxuIiwKIAkJCSAgICAgICBjZC0+Y2RpLm5hbWUsIHNlY3Rvcl9zaXplKTsKIAkJCWNkLT5jYXBhY2l0eSA9IDA7Ci0JCQljZC0+bmVlZHNfc2VjdG9yX3NpemUgPSAxOwogCQl9CiAKIAkJY2QtPmRldmljZS0+c2VjdG9yX3NpemUgPSBzZWN0b3Jfc2l6ZTsKQEAgLTczNiw3ICs3MDYsNiBAQAogCQkgKiBBZGQgdGhpcyBzbyB0aGF0IHdlIGhhdmUgdGhlIGFiaWxpdHkgdG8gY29ycmVjdGx5IGdhdWdlCiAJCSAqIHdoYXQgdGhlIGRldmljZSBpcyBjYXBhYmxlIG9mLgogCQkgKi8KLQkJY2QtPm5lZWRzX3NlY3Rvcl9zaXplID0gMDsKIAkJc2V0X2NhcGFjaXR5KGNkLT5kaXNrLCBjZC0+Y2FwYWNpdHkpOwogCX0KIApAQCAtNzQ4LDEwICs3MTcsNyBAQAogCiBFbm9tZW06CiAJY2QtPmNhcGFjaXR5ID0gMHgxZmZmZmY7Ci0Jc2VjdG9yX3NpemUgPSAyMDQ4OwkvKiBBIGd1ZXNzLCBqdXN0IGluIGNhc2UgKi8KLQljZC0+bmVlZHNfc2VjdG9yX3NpemUgPSAxOwotCWlmIChTUnBudCkKLQkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCWNkLT5kZXZpY2UtPnNlY3Rvcl9zaXplID0gMjA0ODsJLyogQSBndWVzcywganVzdCBpbiBjYXNlICovCiAJZ290byBvdXQ7CiB9CiAKQEAgLTc1OSw4ICs3MjUsOCBAQAogewogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAlzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgZGF0YTsKLQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudDsKIAl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CiAJdW5zaWduZWQgaW50IHRoZV9yZXN1bHQ7CiAJaW50IHJldHJpZXMsIHJjLCBuOwogCkBAIC03NzYsMTkgKzc0MiwxMSBAQAogCQkiIgogCX07CiAKLQkvKiBhbGxvY2F0ZSBhIHJlcXVlc3QgZm9yIHRoZSBURVNUX1VOSVRfUkVBRFkgKi8KLQlTUnBudCA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChjZC0+ZGV2aWNlLCBHRlBfS0VSTkVMKTsKLQlpZiAoIVNScG50KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIihnZXRfY2FwYWJpbGl0aWVzOikgUmVxdWVzdCBhbGxvY2F0aW9uICIKLQkJICAgICAgICJmYWlsdXJlLlxuIik7Ci0JCXJldHVybjsKLQl9CiAKIAkvKiBhbGxvY2F0ZSB0cmFuc2ZlciBidWZmZXIgKi8KIAlidWZmZXIgPSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwogCWlmICghYnVmZmVyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAic3I6IG91dCBvZiBtZW1vcnkuXG4iKTsKLQkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCQlyZXR1cm47CiAJfQogCkBAIC04MDAsMjQgKzc1OCwxOSBAQAogCQltZW1zZXQoKHZvaWQgKiljbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOwogCQljbWRbMF0gPSBURVNUX1VOSVRfUkVBRFk7CiAKLQkJU1JwbnQtPnNyX2NtZF9sZW4gPSAwOwotCQlTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzBdID0gMDsKLQkJU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSA9IDA7Ci0JCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCQl0aGVfcmVzdWx0ID0gc2NzaV9leGVjdXRlX3JlcSAoY2QtPmRldmljZSwgY21kLCBETUFfTk9ORSwgTlVMTCwKKwkJCQkJICAgICAgIDAsICZzc2hkciwgU1JfVElNRU9VVCwKKwkJCQkJICAgICAgIE1BWF9SRVRSSUVTKTsKIAotCQlzY3NpX3dhaXRfcmVxIChTUnBudCwgKHZvaWQgKikgY21kLCBidWZmZXIsCi0JCQkgICAgICAgMCwgU1JfVElNRU9VVCwgTUFYX1JFVFJJRVMpOwotCi0JCXRoZV9yZXN1bHQgPSBTUnBudC0+c3JfcmVzdWx0OwogCQlyZXRyaWVzKys7CiAJfSB3aGlsZSAocmV0cmllcyA8IDUgJiYgCiAJCSAoIXNjc2lfc3RhdHVzX2lzX2dvb2QodGhlX3Jlc3VsdCkgfHwKLQkJICAoKGRyaXZlcl9ieXRlKHRoZV9yZXN1bHQpICYgRFJJVkVSX1NFTlNFKSAmJgotCQkgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdID09IFVOSVRfQVRURU5USU9OKSkpOworCQkgIChzY3NpX3NlbnNlX3ZhbGlkKCZzc2hkcikgJiYKKwkJICAgc3NoZHIuc2Vuc2Vfa2V5ID09IFVOSVRfQVRURU5USU9OKSkpOwogCiAJLyogYXNrIGZvciBtb2RlIHBhZ2UgMHgyYSAqLwogCXJjID0gc2NzaV9tb2RlX3NlbnNlKGNkLT5kZXZpY2UsIDAsIDB4MmEsIGJ1ZmZlciwgMTI4LAotCQkJICAgICBTUl9USU1FT1VULCAzLCAmZGF0YSk7CisJCQkgICAgIFNSX1RJTUVPVVQsIDMsICZkYXRhLCBOVUxMKTsKIAogCWlmICghc2NzaV9zdGF0dXNfaXNfZ29vZChyYykpIHsKIAkJLyogZmFpbGVkLCBkcml2ZSBkb2Vzbid0IGhhdmUgY2FwYWJpbGl0aWVzIG1vZGUgcGFnZSAqLwpAQCAtODI1LDcgKzc3OCw2IEBACiAJCWNkLT5jZGkubWFzayB8PSAoQ0RDX0NEX1IgfCBDRENfQ0RfUlcgfCBDRENfRFZEX1IgfAogCQkJCQkgQ0RDX0RWRCB8IENEQ19EVkRfUkFNIHwKIAkJCQkJIENEQ19TRUxFQ1RfRElTQyB8IENEQ19TRUxFQ1RfU1BFRUQpOwotCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CiAJCWtmcmVlKGJ1ZmZlcik7CiAJCXByaW50aygiJXM6IHNjc2ktMSBkcml2ZVxuIiwgY2QtPmNkaS5uYW1lKTsKIAkJcmV0dXJuOwpAQCAtODg1LDcgKzgzNyw2IEBACiAJCWNkLT5kZXZpY2UtPndyaXRlYWJsZSA9IDE7CiAJfQogCi0Jc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCWtmcmVlKGJ1ZmZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zci5oIGIvZHJpdmVycy9zY3NpL3NyLmgKaW5kZXggMGIzMTc4MC4uZDJiY2Q5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NyLmgKKysrIGIvZHJpdmVycy9zY3NpL3NyLmgKQEAgLTMzLDcgKzMzLDYgQEAKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZTsKIAl1bnNpZ25lZCBpbnQgdmVuZG9yOwkvKiB2ZW5kb3IgY29kZSwgc2VlIHNyX3ZlbmRvci5jICAgICAgICAgKi8KIAl1bnNpZ25lZCBsb25nIG1zX29mZnNldDsJLyogZm9yIHJlYWRpbmcgbXVsdGlzZXNzaW9uLUNEJ3MgICAgICAgICovCi0JdW5zaWduZWQgbmVlZHNfc2VjdG9yX3NpemU6MTsJLyogbmVlZHMgdG8gZ2V0IHNlY3RvciBzaXplICovCiAJdW5zaWduZWQgdXNlOjE7CQkvKiBpcyB0aGlzIGRldmljZSBzdGlsbCBzdXBwb3J0YWJsZSAgICAgKi8KIAl1bnNpZ25lZCB4YV9mbGFnOjE7CS8qIENEIGhhcyBYQSBzZWN0b3JzID8gKi8KIAl1bnNpZ25lZCByZWFkY2Rfa25vd246MTsJLyogZHJpdmUgc3VwcG9ydHMgUkVBRF9DRCAoMHhiZSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jIGIvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKaW5kZXggODJkNjhmZC4uNmU0NWFjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgotI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KIAogI2luY2x1ZGUgInNyLmgiCiAKQEAgLTg0LDQxICs4NCwzNyBAQAogCiBpbnQgc3JfZG9faW9jdGwoU2NzaV9DRCAqY2QsIHN0cnVjdCBwYWNrZXRfY29tbWFuZCAqY2djKQogewotCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50OwogCXN0cnVjdCBzY3NpX2RldmljZSAqU0RldjsKLSAgICAgICAgc3RydWN0IHJlcXVlc3QgKnJlcTsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CiAJaW50IHJlc3VsdCwgZXJyID0gMCwgcmV0cmllcyA9IDA7CisJc3RydWN0IHJlcXVlc3Rfc2Vuc2UgKnNlbnNlID0gY2djLT5zZW5zZTsKIAogCVNEZXYgPSBjZC0+ZGV2aWNlOwotCVNScG50ID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KFNEZXYsIEdGUF9LRVJORUwpOwotICAgICAgICBpZiAoIVNScG50KSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgU0NTSSByZXF1ZXN0IGluIHNyX2RvX2lvY3RsIik7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotICAgICAgICB9Ci0JU1JwbnQtPnNyX2RhdGFfZGlyZWN0aW9uID0gY2djLT5kYXRhX2RpcmVjdGlvbjsKKworCWlmICghc2Vuc2UpIHsKKwkJc2Vuc2UgPSBrbWFsbG9jKHNpemVvZigqc2Vuc2UpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzZW5zZSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQogCiAgICAgICByZXRyeToKIAlpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhTRGV2KSkgewogCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIG91dF9mcmVlOworCQlnb3RvIG91dDsKIAl9CiAKLQlzY3NpX3dhaXRfcmVxKFNScG50LCBjZ2MtPmNtZCwgY2djLT5idWZmZXIsIGNnYy0+YnVmbGVuLAotCQkgICAgICBjZ2MtPnRpbWVvdXQsIElPQ1RMX1JFVFJJRVMpOworCW1lbXNldChzZW5zZSwgMCwgc2l6ZW9mKCpzZW5zZSkpOworCXJlc3VsdCA9IHNjc2lfZXhlY3V0ZShTRGV2LCBjZ2MtPmNtZCwgY2djLT5kYXRhX2RpcmVjdGlvbiwKKwkJCSAgICAgIGNnYy0+YnVmZmVyLCBjZ2MtPmJ1ZmxlbiwgKGNoYXIgKilzZW5zZSwKKwkJCSAgICAgIGNnYy0+dGltZW91dCwgSU9DVExfUkVUUklFUywgMCk7CiAKLQlyZXEgPSBTUnBudC0+c3JfcmVxdWVzdDsKLQlpZiAoU1JwbnQtPnNyX2J1ZmZlciAmJiByZXEtPmJ1ZmZlciAmJiBTUnBudC0+c3JfYnVmZmVyICE9IHJlcS0+YnVmZmVyKSB7Ci0JCW1lbWNweShyZXEtPmJ1ZmZlciwgU1JwbnQtPnNyX2J1ZmZlciwgU1JwbnQtPnNyX2J1ZmZsZW4pOwotCQlrZnJlZShTUnBudC0+c3JfYnVmZmVyKTsKLQkJU1JwbnQtPnNyX2J1ZmZlciA9IHJlcS0+YnVmZmVyOwotICAgICAgICB9Ci0KLQlyZXN1bHQgPSBTUnBudC0+c3JfcmVzdWx0OworCXNjc2lfbm9ybWFsaXplX3NlbnNlKChjaGFyICopc2Vuc2UsIHNpemVvZigqc2Vuc2UpLCAmc3NoZHIpOwogCiAJLyogTWluaW1hbCBlcnJvciBjaGVja2luZy4gIElnbm9yZSBjYXNlcyB3ZSBrbm93IGFib3V0LCBhbmQgcmVwb3J0IHRoZSByZXN0LiAqLwogCWlmIChkcml2ZXJfYnl0ZShyZXN1bHQpICE9IDApIHsKLQkJc3dpdGNoIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICYgMHhmKSB7CisJCXN3aXRjaCAoc3NoZHIuc2Vuc2Vfa2V5KSB7CiAJCWNhc2UgVU5JVF9BVFRFTlRJT046CiAJCQlTRGV2LT5jaGFuZ2VkID0gMTsKIAkJCWlmICghY2djLT5xdWlldCkKQEAgLTEyOCw4ICsxMjQsOCBAQAogCQkJZXJyID0gLUVOT01FRElVTTsKIAkJCWJyZWFrOwogCQljYXNlIE5PVF9SRUFEWToJLyogVGhpcyBoYXBwZW5zIGlmIHRoZXJlIGlzIG5vIGRpc2MgaW4gZHJpdmUgKi8KLQkJCWlmIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSA9PSAweDA0ICYmCi0JCQkgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gPT0gMHgwMSkgeworCQkJaWYgKHNzaGRyLmFzYyA9PSAweDA0ICYmCisJCQkgICAgc3NoZHIuYXNjcSA9PSAweDAxKSB7CiAJCQkJLyogc2Vuc2U6IExvZ2ljYWwgdW5pdCBpcyBpbiBwcm9jZXNzIG9mIGJlY29taW5nIHJlYWR5ICovCiAJCQkJaWYgKCFjZ2MtPnF1aWV0KQogCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0RST00gbm90IHJlYWR5IHlldC5cbiIsIGNkLT5jZGkubmFtZSk7CkBAIC0xNDYsMzcgKzE0MiwzMyBAQAogCQkJaWYgKCFjZ2MtPnF1aWV0KQogCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDRFJPTSBub3QgcmVhZHkuICBNYWtlIHN1cmUgdGhlcmUgaXMgYSBkaXNjIGluIHRoZSBkcml2ZS5cbiIsIGNkLT5jZGkubmFtZSk7CiAjaWZkZWYgREVCVUcKLQkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCJzciIsIFNScG50KTsKKwkJCXNjc2lfcHJpbnRfc2Vuc2VfaGRyKCJzciIsICZzc2hkcik7CiAjZW5kaWYKIAkJCWVyciA9IC1FTk9NRURJVU07CiAJCQlicmVhazsKIAkJY2FzZSBJTExFR0FMX1JFUVVFU1Q6CiAJCQllcnIgPSAtRUlPOwotCQkJaWYgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdID09IDB4MjAgJiYKLQkJCSAgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSA9PSAweDAwKQorCQkJaWYgKHNzaGRyLmFzYyA9PSAweDIwICYmCisJCQkgICAgc3NoZHIuYXNjcSA9PSAweDAwKQogCQkJCS8qIHNlbnNlOiBJbnZhbGlkIGNvbW1hbmQgb3BlcmF0aW9uIGNvZGUgKi8KIAkJCQllcnIgPSAtRURSSVZFX0NBTlRfRE9fVEhJUzsKICNpZmRlZiBERUJVRwogCQkJX19zY3NpX3ByaW50X2NvbW1hbmQoY2djLT5jbWQpOwotCQkJc2NzaV9wcmludF9yZXFfc2Vuc2UoInNyIiwgU1JwbnQpOworCQkJc2NzaV9wcmludF9zZW5zZV9oZHIoInNyIiwgJnNzaGRyKTsKICNlbmRpZgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDRFJPTSAoaW9jdGwpIGVycm9yLCBjb21tYW5kOiAiLCBjZC0+Y2RpLm5hbWUpOwogCQkJX19zY3NpX3ByaW50X2NvbW1hbmQoY2djLT5jbWQpOwotCQkJc2NzaV9wcmludF9yZXFfc2Vuc2UoInNyIiwgU1JwbnQpOworCQkJc2NzaV9wcmludF9zZW5zZV9oZHIoInNyIiwgJnNzaGRyKTsKIAkJCWVyciA9IC1FSU87CiAJCX0KIAl9CiAKLQlpZiAoY2djLT5zZW5zZSkKLQkJbWVtY3B5KGNnYy0+c2Vuc2UsIFNScG50LT5zcl9zZW5zZV9idWZmZXIsIHNpemVvZigqY2djLT5zZW5zZSkpOwotCiAJLyogV2FrZSB1cCBhIHByb2Nlc3Mgd2FpdGluZyBmb3IgZGV2aWNlICovCi0gICAgICBvdXRfZnJlZToKLQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7Ci0JU1JwbnQgPSBOVUxMOwogICAgICAgb3V0OgorCWlmICghY2djLT5zZW5zZSkKKwkJa2ZyZWUoc2Vuc2UpOwogCWNnYy0+c3RhdCA9IGVycjsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N0LmMgYi9kcml2ZXJzL3Njc2kvc3QuYwppbmRleCAwYTc4MzlkLi5hOTMzMDhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvc3QuYwpAQCAtMTcsNyArMTcsNyBAQAogICAgTGFzdCBtb2RpZmllZDogMTgtSkFOLTE5OTggUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+IERldmZzIHN1cHBvcnQKICAqLwogCi1zdGF0aWMgY2hhciAqdmVyc3RyID0gIjIwMDUwNTAxIjsKK3N0YXRpYyBjaGFyICp2ZXJzdHIgPSAiMjAwNTA4MzAiOwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKQEAgLTIxOSw2ICsyMTksMTIgQEAKIAogc3RhdGljIGludCBzdF9pbnRfaW9jdGwoc3RydWN0IHNjc2lfdGFwZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCitzdGF0aWMgdm9pZCBzY3NpX3RhcGVfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqKTsKKworI2RlZmluZSB0b19zY3NpX3RhcGUob2JqKSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3Qgc2NzaV90YXBlLCBrcmVmKQorCitzdGF0aWMgREVDTEFSRV9NVVRFWChzdF9yZWZfc2VtKTsKKwogDAogI2luY2x1ZGUgIm9zc3RfZGV0ZWN0LmgiCiAjaWZuZGVmIFNJR1NfRlJPTV9PU1NUCkBAIC0yMzAsNiArMjM2LDQ2IEBACiAJeyJPblN0cmVhbSIsICJGVy0iLCAiIiwgIm9zc3QifQogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV90YXBlICpzY3NpX3RhcGVfZ2V0KGludCBkZXYpCit7CisJc3RydWN0IHNjc2lfdGFwZSAqU1RwID0gTlVMTDsKKworCWRvd24oJnN0X3JlZl9zZW0pOworCXdyaXRlX2xvY2soJnN0X2Rldl9hcnJfbG9jayk7CisKKwlpZiAoZGV2IDwgc3RfZGV2X21heCAmJiBzY3NpX3RhcGVzICE9IE5VTEwpCisJCVNUcCA9IHNjc2lfdGFwZXNbZGV2XTsKKwlpZiAoIVNUcCkgZ290byBvdXQ7CisKKwlrcmVmX2dldCgmU1RwLT5rcmVmKTsKKworCWlmICghU1RwLT5kZXZpY2UpCisJCWdvdG8gb3V0X3B1dDsKKworCWlmIChzY3NpX2RldmljZV9nZXQoU1RwLT5kZXZpY2UpKQorCQlnb3RvIG91dF9wdXQ7CisKKwlnb3RvIG91dDsKKworb3V0X3B1dDoKKwlrcmVmX3B1dCgmU1RwLT5rcmVmLCBzY3NpX3RhcGVfcmVsZWFzZSk7CisJU1RwID0gTlVMTDsKK291dDoKKwl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJdXAoJnN0X3JlZl9zZW0pOworCXJldHVybiBTVHA7Cit9CisKK3N0YXRpYyB2b2lkIHNjc2lfdGFwZV9wdXQoc3RydWN0IHNjc2lfdGFwZSAqU1RwKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IFNUcC0+ZGV2aWNlOworCisJZG93bigmc3RfcmVmX3NlbSk7CisJa3JlZl9wdXQoJlNUcC0+a3JlZiwgc2NzaV90YXBlX3JlbGVhc2UpOworCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKKwl1cCgmc3RfcmVmX3NlbSk7Cit9CisKIHN0cnVjdCBzdF9yZWplY3RfZGF0YSB7CiAJY2hhciAqdmVuZG9yOwogCWNoYXIgKm1vZGVsOwpAQCAtMzExLDcgKzM1Nyw3IEBACiAJCXJldHVybiAwOwogCiAJY21kc3RhdHAgPSAmU1RwLT5idWZmZXItPmNtZHN0YXQ7Ci0Jc3RfYW5hbHl6ZV9zZW5zZShTVHAtPmJ1ZmZlci0+bGFzdF9TUnBudCwgY21kc3RhdHApOworCXN0X2FuYWx5emVfc2Vuc2UoU1JwbnQsIGNtZHN0YXRwKTsKIAogCWlmIChjbWRzdGF0cC0+aGF2ZV9zZW5zZSkKIAkJc2NvZGUgPSBTVHAtPmJ1ZmZlci0+Y21kc3RhdC5zZW5zZV9oZHIuc2Vuc2Vfa2V5OwpAQCAtMzk5LDEwICs0NDUsMTAgQEAKIAogCShTVHAtPmJ1ZmZlciktPmNtZHN0YXQubWlkbGV2ZWxfcmVzdWx0ID0gU0NwbnQtPnJlc3VsdDsKIAlTQ3BudC0+cmVxdWVzdC0+cnFfc3RhdHVzID0gUlFfU0NTSV9ET05FOwotCShTVHAtPmJ1ZmZlciktPmxhc3RfU1JwbnQgPSBTQ3BudC0+c2NfcmVxdWVzdDsKIAlERUIoIFNUcC0+d3JpdGVfcGVuZGluZyA9IDA7ICkKIAotCWNvbXBsZXRlKFNDcG50LT5yZXF1ZXN0LT53YWl0aW5nKTsKKwlpZiAoU0NwbnQtPnJlcXVlc3QtPndhaXRpbmcpCisJCWNvbXBsZXRlKFNDcG50LT5yZXF1ZXN0LT53YWl0aW5nKTsKIH0KIAogLyogRG8gdGhlIHNjc2kgY29tbWFuZC4gV2FpdHMgdW50aWwgY29tbWFuZCBwZXJmb3JtZWQgaWYgZG9fd2FpdCBpcyB0cnVlLgpAQCAtNDEyLDggKzQ1OCwyMCBAQAogc3RfZG9fc2NzaShzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICogU1JwbnQsIHN0cnVjdCBzY3NpX3RhcGUgKiBTVHAsIHVuc2lnbmVkIGNoYXIgKmNtZCwKIAkgICBpbnQgYnl0ZXMsIGludCBkaXJlY3Rpb24sIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcywgaW50IGRvX3dhaXQpCiB7CisJc3RydWN0IGNvbXBsZXRpb24gKndhaXRpbmc7CiAJdW5zaWduZWQgY2hhciAqYnA7CiAKKwkvKiBpZiBhc3luYywgbWFrZSBzdXJlIHRoZXJlJ3Mgbm8gY29tbWFuZCBvdXRzdGFuZGluZyAqLworCWlmICghZG9fd2FpdCAmJiAoKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQXN5bmMgY29tbWFuZCBhbHJlYWR5IGFjdGl2ZS5cbiIsCisJCSAgICAgICB0YXBlX25hbWUoU1RwKSk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCShTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ID0gKC1FSU5UUik7CisJCWVsc2UKKwkJCShTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ID0gKC1FQlVTWSk7CisJCXJldHVybiBOVUxMOworCX0KKwogCWlmIChTUnBudCA9PSBOVUxMKSB7CiAJCVNScG50ID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KFNUcC0+ZGV2aWNlLCBHRlBfQVRPTUlDKTsKIAkJaWYgKFNScG50ID09IE5VTEwpIHsKQEAgLTQyNyw3ICs0ODUsMTMgQEAKIAkJfQogCX0KIAotCWluaXRfY29tcGxldGlvbigmU1RwLT53YWl0KTsKKwkvKiBJZiBhc3luYyBJTywgc2V0IGxhc3RfU1JwbnQuIFRoaXMgcHRyIHRlbGxzIHdyaXRlX2JlaGluZF9jaGVjaworCSAgIHdoaWNoIElPIGlzIG91dHN0YW5kaW5nLiBJdCdzIG51bGxlZCBvdXQgd2hlbiB0aGUgSU8gY29tcGxldGVzLiAqLworCWlmICghZG9fd2FpdCkKKwkJKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCA9IFNScG50OworCisJd2FpdGluZyA9ICZTVHAtPndhaXQ7CisJaW5pdF9jb21wbGV0aW9uKHdhaXRpbmcpOwogCVNScG50LT5zcl91c2Vfc2cgPSBTVHAtPmJ1ZmZlci0+ZG9fZGlvIHx8IChieXRlcyA+IChTVHAtPmJ1ZmZlciktPmZycFswXS5sZW5ndGgpOwogCWlmIChTUnBudC0+c3JfdXNlX3NnKSB7CiAJCWlmICghU1RwLT5idWZmZXItPmRvX2RpbykKQEAgLTQzOCwxNyArNTAyLDIwIEBACiAJCWJwID0gKFNUcC0+YnVmZmVyKS0+Yl9kYXRhOwogCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IGRpcmVjdGlvbjsKIAlTUnBudC0+c3JfY21kX2xlbiA9IDA7Ci0JU1JwbnQtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSAmKFNUcC0+d2FpdCk7CisJU1JwbnQtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSB3YWl0aW5nOwogCVNScG50LT5zcl9yZXF1ZXN0LT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0JVU1k7CiAJU1JwbnQtPnNyX3JlcXVlc3QtPnJxX2Rpc2sgPSBTVHAtPmRpc2s7CisJU1JwbnQtPnNyX3JlcXVlc3QtPmVuZF9pbyA9IGJsa19lbmRfc3luY19ycTsKIAlTVHAtPmJ1ZmZlci0+Y21kc3RhdC5oYXZlX3NlbnNlID0gMDsKIAogCXNjc2lfZG9fcmVxKFNScG50LCAodm9pZCAqKSBjbWQsIGJwLCBieXRlcywKIAkJICAgIHN0X3NsZWVwX2RvbmUsIHRpbWVvdXQsIHJldHJpZXMpOwogCiAJaWYgKGRvX3dhaXQpIHsKLQkJd2FpdF9mb3JfY29tcGxldGlvbihTUnBudC0+c3JfcmVxdWVzdC0+d2FpdGluZyk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24od2FpdGluZyk7CiAJCVNScG50LT5zcl9yZXF1ZXN0LT53YWl0aW5nID0gTlVMTDsKKwkJaWYgKFNScG50LT5zcl9yZXF1ZXN0LT5ycV9zdGF0dXMgIT0gUlFfU0NTSV9ET05FKQorCQkJU1JwbnQtPnNyX3Jlc3VsdCB8PSAoRFJJVkVSX0VSUk9SIDw8IDI0KTsKIAkJKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPSBzdF9jaGtfcmVzdWx0KFNUcCwgU1JwbnQpOwogCX0KIAlyZXR1cm4gU1JwbnQ7CkBAIC00NjUsNiArNTMyLDcgQEAKIAlzdHJ1Y3Qgc3RfYnVmZmVyICpTVGJ1ZmZlcjsKIAlzdHJ1Y3Qgc3RfcGFydHN0YXQgKlNUcHM7CiAJc3RydWN0IHN0X2NtZHN0YXR1cyAqY21kc3RhdHA7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQ7CiAKIAlTVGJ1ZmZlciA9IFNUcC0+YnVmZmVyOwogCWlmICghU1RidWZmZXItPndyaXRpbmcpCkBAIC00NzgsMTAgKzU0NiwxNCBAQAogICAgICAgICApIC8qIGVuZCBERUIgKi8KIAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJihTVHAtPndhaXQpKTsKLQkoU1RwLT5idWZmZXIpLT5sYXN0X1NScG50LT5zcl9yZXF1ZXN0LT53YWl0aW5nID0gTlVMTDsKKwlTUnBudCA9IFNUYnVmZmVyLT5sYXN0X1NScG50OworCVNUYnVmZmVyLT5sYXN0X1NScG50ID0gTlVMTDsKKwlTUnBudC0+c3JfcmVxdWVzdC0+d2FpdGluZyA9IE5VTEw7CisJaWYgKFNScG50LT5zcl9yZXF1ZXN0LT5ycV9zdGF0dXMgIT0gUlFfU0NTSV9ET05FKQorCQlTUnBudC0+c3JfcmVzdWx0IHw9IChEUklWRVJfRVJST1IgPDwgMjQpOwogCi0JKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPSBzdF9jaGtfcmVzdWx0KFNUcCwgKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCk7Ci0Jc2NzaV9yZWxlYXNlX3JlcXVlc3QoKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCk7CisJKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPSBzdF9jaGtfcmVzdWx0KFNUcCwgU1JwbnQpOworCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAogCVNUYnVmZmVyLT5idWZmZXJfYnl0ZXMgLT0gU1RidWZmZXItPndyaXRpbmc7CiAJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOwpAQCAtMTA1NSwyNSArMTEyNywyMCBAQAogCSAqLwogCWZpbHAtPmZfbW9kZSAmPSB+KEZNT0RFX1BSRUFEIHwgRk1PREVfUFdSSVRFKTsKIAorCWlmICghKFNUcCA9IHNjc2lfdGFwZV9nZXQoZGV2KSkpCisJCXJldHVybiAtRU5YSU87CisKIAl3cml0ZV9sb2NrKCZzdF9kZXZfYXJyX2xvY2spOwotCWlmIChkZXYgPj0gc3RfZGV2X21heCB8fCBzY3NpX3RhcGVzID09IE5VTEwgfHwKLQkgICAgKChTVHAgPSBzY3NpX3RhcGVzW2Rldl0pID09IE5VTEwpKSB7Ci0JCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKLQkJcmV0dXJuICgtRU5YSU8pOwotCX0KIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBTVHA7CiAJbmFtZSA9IHRhcGVfbmFtZShTVHApOwogCiAJaWYgKFNUcC0+aW5fdXNlKSB7CiAJCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKKwkJc2NzaV90YXBlX3B1dChTVHApOwogCQlERUIoIHByaW50ayhTVF9ERUJfTVNHICIlczogRGV2aWNlIGFscmVhZHkgaW4gdXNlLlxuIiwgbmFtZSk7ICkKIAkJcmV0dXJuICgtRUJVU1kpOwogCX0KIAotCWlmKHNjc2lfZGV2aWNlX2dldChTVHAtPmRldmljZSkpIHsKLQkJd3JpdGVfdW5sb2NrKCZzdF9kZXZfYXJyX2xvY2spOwotCQlyZXR1cm4gKC1FTlhJTyk7Ci0JfQogCVNUcC0+aW5fdXNlID0gMTsKIAl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7CiAJU1RwLT5yZXdfYXRfY2xvc2UgPSBTVHAtPmF1dG9yZXdfZGV2ID0gKGltaW5vcihpbm9kZSkgJiAweDgwKSA9PSAwOwpAQCAtMTExOCw3ICsxMTg1LDcgQEAKICBlcnJfb3V0OgogCW5vcm1hbGl6ZV9idWZmZXIoU1RwLT5idWZmZXIpOwogCVNUcC0+aW5fdXNlID0gMDsKLQlzY3NpX2RldmljZV9wdXQoU1RwLT5kZXZpY2UpOworCXNjc2lfdGFwZV9wdXQoU1RwKTsKIAlyZXR1cm4gcmV0dmFsOwogCiB9CkBAIC0xMjUwLDcgKzEzMTcsNyBAQAogCXdyaXRlX2xvY2soJnN0X2Rldl9hcnJfbG9jayk7CiAJU1RwLT5pbl91c2UgPSAwOwogCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKLQlzY3NpX2RldmljZV9wdXQoU1RwLT5kZXZpY2UpOworCXNjc2lfdGFwZV9wdXQoU1RwKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0zODg3LDYgKzM5NTQsNyBAQAogCQlnb3RvIG91dF9wdXRfZGlzazsKIAl9CiAJbWVtc2V0KHRwbnQsIDAsIHNpemVvZihzdHJ1Y3Qgc2NzaV90YXBlKSk7CisJa3JlZl9pbml0KCZ0cG50LT5rcmVmKTsKIAl0cG50LT5kaXNrID0gZGlzazsKIAlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgInN0JWQiLCBpKTsKIAlkaXNrLT5wcml2YXRlX2RhdGEgPSAmdHBudC0+ZHJpdmVyOwpAQCAtMzkwMiw2ICszOTcwLDcgQEAKIAkJdHBudC0+dGFwZV90eXBlID0gTVRfSVNTQ1NJMjsKIAogCXRwbnQtPmJ1ZmZlciA9IGJ1ZmZlcjsKKwl0cG50LT5idWZmZXItPmxhc3RfU1JwbnQgPSBOVUxMOwogCiAJdHBudC0+aW5pdGVkID0gMDsKIAl0cG50LT5kaXJ0eSA9IDA7CkBAIC00MDc2LDE1ICs0MTQ1LDEwIEBACiAJCQkJCXRwbnQtPm1vZGVzW21vZGVdLmNkZXZzW2pdID0gTlVMTDsKIAkJCQl9CiAJCQl9Ci0JCQl0cG50LT5kZXZpY2UgPSBOVUxMOwogCi0JCQlpZiAodHBudC0+YnVmZmVyKSB7Ci0JCQkJdHBudC0+YnVmZmVyLT5vcmlnX2ZycF9zZWdzID0gMDsKLQkJCQlub3JtYWxpemVfYnVmZmVyKHRwbnQtPmJ1ZmZlcik7Ci0JCQkJa2ZyZWUodHBudC0+YnVmZmVyKTsKLQkJCX0KLQkJCXB1dF9kaXNrKHRwbnQtPmRpc2spOwotCQkJa2ZyZWUodHBudCk7CisJCQlkb3duKCZzdF9yZWZfc2VtKTsKKwkJCWtyZWZfcHV0KCZ0cG50LT5rcmVmLCBzY3NpX3RhcGVfcmVsZWFzZSk7CisJCQl1cCgmc3RfcmVmX3NlbSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTQwOTMsNiArNDE1NywzNCBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqICAgICAgc2NzaV90YXBlX3JlbGVhc2UgLSBDYWxsZWQgdG8gZnJlZSB0aGUgU2NzaV9UYXBlIHN0cnVjdHVyZQorICogICAgICBAa3JlZjogcG9pbnRlciB0byBlbWJlZGRlZCBrcmVmCisgKgorICogICAgICBzdF9yZWZfc2VtIG11c3QgYmUgaGVsZCBlbnRlcmluZyB0aGlzIHJvdXRpbmUuICBCZWNhdXNlIGl0IGlzCisgKiAgICAgIGNhbGxlZCBvbiBsYXN0IHB1dCwgeW91IHNob3VsZCBhbHdheXMgdXNlIHRoZSBzY3NpX3RhcGVfZ2V0KCkKKyAqICAgICAgc2NzaV90YXBlX3B1dCgpIGhlbHBlcnMgd2hpY2ggbWFuaXB1bGF0ZSB0aGUgc2VtYXBob3JlIGRpcmVjdGx5CisgKiAgICAgIGFuZCBuZXZlciBkbyBhIGRpcmVjdCBrcmVmX3B1dCgpLgorICoqLworc3RhdGljIHZvaWQgc2NzaV90YXBlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHNjc2lfdGFwZSAqdHBudCA9IHRvX3Njc2lfdGFwZShrcmVmKTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IHRwbnQtPmRpc2s7CisKKwl0cG50LT5kZXZpY2UgPSBOVUxMOworCisJaWYgKHRwbnQtPmJ1ZmZlcikgeworCQl0cG50LT5idWZmZXItPm9yaWdfZnJwX3NlZ3MgPSAwOworCQlub3JtYWxpemVfYnVmZmVyKHRwbnQtPmJ1ZmZlcik7CisJCWtmcmVlKHRwbnQtPmJ1ZmZlcik7CisJfQorCisJZGlzay0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlwdXRfZGlzayhkaXNrKTsKKwlrZnJlZSh0cG50KTsKKwlyZXR1cm47Cit9CisKIHN0YXRpYyB2b2lkIHN0X2ludHIoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCiB7CiAJc2NzaV9pb19jb21wbGV0aW9uKFNDcG50LCAoU0NwbnQtPnJlc3VsdCA/IDA6IFNDcG50LT5idWZmbGVuKSwgMSk7CkBAIC00MzQ4LDEyICs0NDQwLDEyIEBACiBzdGF0aWMgaW50IHNnbF9tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgY29uc3QgdW5zaWduZWQgaW50IG1heF9wYWdlcywgCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIHVhZGRyLCBzaXplX3QgY291bnQsIGludCBydykKIHsKKwl1bnNpZ25lZCBsb25nIGVuZCA9ICh1YWRkciArIGNvdW50ICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdWFkZHIgPj4gUEFHRV9TSElGVDsKKwljb25zdCBpbnQgbnJfcGFnZXMgPSBlbmQgLSBzdGFydDsKIAlpbnQgcmVzLCBpLCBqOwotCXVuc2lnbmVkIGludCBucl9wYWdlczsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwogCi0JbnJfcGFnZXMgPSAoKHVhZGRyICYgflBBR0VfTUFTSykgKyBjb3VudCArIH5QQUdFX01BU0spID4+IFBBR0VfU0hJRlQ7Ci0KIAkvKiBVc2VyIGF0dGVtcHRlZCBPdmVyZmxvdyEgKi8KIAlpZiAoKHVhZGRyICsgY291bnQpIDwgdWFkZHIpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N0LmggYi9kcml2ZXJzL3Njc2kvc3QuaAppbmRleCAwNjFkYTExLi43OTBhY2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3QuaAorKysgYi9kcml2ZXJzL3Njc2kvc3QuaApAQCAtMyw3ICszLDcgQEAKICNkZWZpbmUgX1NUX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLQorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KIAogLyogRGVzY3JpcHRvciBmb3IgYW5hbHl6ZWQgc2Vuc2UgZGF0YSAqLwogc3RydWN0IHN0X2NtZHN0YXR1cyB7CkBAIC0xNTYsNiArMTU2LDcgQEAKIAl1bnNpZ25lZCBjaGFyIGxhc3Rfc2Vuc2VbMTZdOwogI2VuZGlmCiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CisJc3RydWN0IGtyZWYgICAgIGtyZWY7CiB9OwogCiAvKiBCaXQgbWFza3MgZm9yIHVzZV9wZiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvMjEyODUuYyBiL2RyaXZlcnMvc2VyaWFsLzIxMjg1LmMKaW5kZXggMGIxMDE2OS4uYWVjMzlmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvMjEyODUuYworKysgYi9kcml2ZXJzL3NlcmlhbC8yMTI4NS5jCkBAIC01OCw4ICs1OCw3IEBACiAgKiAgaW50KChCQVVEX0JBU0UgLSAoYmF1ZCA+PiAxKSkgLyBiYXVkKQogICovCiAKLXN0YXRpYyB2b2lkCi1zZXJpYWwyMTI4NV9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RvcCkKK3N0YXRpYyB2b2lkIHNlcmlhbDIxMjg1X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlpZiAodHhfZW5hYmxlZChwb3J0KSkgewogCQlkaXNhYmxlX2lycShJUlFfQ09OVFgpOwpAQCAtNjcsOCArNjYsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQKLXNlcmlhbDIxMjg1X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RhcnQpCitzdGF0aWMgdm9pZCBzZXJpYWwyMTI4NV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCWlmICghdHhfZW5hYmxlZChwb3J0KSkgewogCQllbmFibGVfaXJxKElSUV9DT05UWCk7CkBAIC0xNDgsNyArMTQ2LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKHBvcnQpKSB7Ci0JCXNlcmlhbDIxMjg1X3N0b3BfdHgocG9ydCwgMCk7CisJCXNlcmlhbDIxMjg1X3N0b3BfdHgocG9ydCk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTY0LDcgKzE2Miw3IEBACiAJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOwogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKLQkJc2VyaWFsMjEyODVfc3RvcF90eChwb3J0LCAwKTsKKwkJc2VyaWFsMjEyODVfc3RvcF90eChwb3J0KTsKIAogIG91dDoKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYwppbmRleCA5MDk3ZjJmLi4yZWZiMzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzY4MzI4c2VyaWFsLmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMKaW5kZXggYjExNjEyMi4uMTcwYzlkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jCkBAIC0yNDc0LDggKzI0NzQsNyBAQAogCS50aW9jbXNldCA9IHJzXzM2MF90aW9jbXNldCwKIH07CiAKLS8qIGludCBfX2luaXQgcnNfMzYwX2luaXQodm9pZCkgKi8KLWludCByc18zNjBfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcnNfMzYwX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3Qgc2VyaWFsX3N0YXRlICogc3RhdGU7CiAJc2VyX2luZm9fdAkqaW5mbzsKQEAgLTI4MjcsMTAgKzI4MjYsNyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLQotCi0KK21vZHVsZV9pbml0KHJzXzM2MF9pbml0KTsKIAogLyogVGhpcyBtdXN0IGFsd2F5cyBiZSBjYWxsZWQgYmVmb3JlIHRoZSByc18zNjBfaW5pdCgpIGZ1bmN0aW9uLCBvdGhlcndpc2UKICAqIGl0IGJsb3dzIGF3YXkgdGhlIHBvcnQgY29udHJvbCBpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwppbmRleCA3ZThmYzdjLi40ZDc1Y2RmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCkBAIC04NjQsNyArODY0LDcgQEAKIAkvKgogCSAqIFdlJ3JlIHByZXR0eSBzdXJlIHRoZXJlJ3MgYSBwb3J0IGhlcmUuICBMZXRzIGZpbmQgb3V0IHdoYXQKIAkgKiB0eXBlIG9mIHBvcnQgaXQgaXMuICBUaGUgSUlSIHRvcCB0d28gYml0cyBhbGxvd3MgdXMgdG8gZmluZAotCSAqIG91dCBpZiBpdHMgODI1MCBvciAxNjQ1MCwgMTY1NTAsIDE2NTUwQSBvciBsYXRlci4gIFRoaXMKKwkgKiBvdXQgaWYgaXQncyA4MjUwIG9yIDE2NDUwLCAxNjU1MCwgMTY1NTBBIG9yIGxhdGVyLiAgVGhpcwogCSAqIGRldGVybWluZXMgd2hhdCB3ZSB0ZXN0IGZvciBuZXh0LgogCSAqCiAJICogV2UgYWxzbyBpbml0aWFsaXNlIHRoZSBFRlIgKGlmIGFueSkgdG8gemVybyBmb3IgbGF0ZXIuICBUaGUKQEAgLTEwMDEsNyArMTAwMSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzZXJpYWw4MjUwX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgc2VyaWFsODI1MF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKilwb3J0OwogCkBAIC0xMDE4LDcgKzEwMTgsNyBAQAogCiBzdGF0aWMgdm9pZCB0cmFuc21pdF9jaGFycyhzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwKTsKIAotc3RhdGljIHZvaWQgc2VyaWFsODI1MF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KQorc3RhdGljIHZvaWQgc2VyaWFsODI1MF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfODI1MF9wb3J0ICopcG9ydDsKIApAQCAtMTE1OCw3ICsxMTU4LDExIEBACiAJCXVwLT5wb3J0LnhfY2hhciA9IDA7CiAJCXJldHVybjsKIAl9Ci0JaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQoJnVwLT5wb3J0KSkgeworCWlmICh1YXJ0X3R4X3N0b3BwZWQoJnVwLT5wb3J0KSkgeworCQlzZXJpYWw4MjUwX3N0b3BfdHgoJnVwLT5wb3J0KTsKKwkJcmV0dXJuOworCX0KKwlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKSB7CiAJCV9fc3RvcF90eCh1cCk7CiAJCXJldHVybjsKIAl9CkBAIC0yNTMyLDcgKzI1MzYsNyBAQAogCQlnb3RvIG91dDsKIAogCXNlcmlhbDgyNTBfaXNhX2RldnMgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJzZXJpYWw4MjUwIiwKLQkJCQkJCQkgICAgICAtMSwgTlVMTCwgMCk7CisJCQkJCSBQTEFUODI1MF9ERVZfTEVHQUNZLCBOVUxMLCAwKTsKIAlpZiAoSVNfRVJSKHNlcmlhbDgyNTBfaXNhX2RldnMpKSB7CiAJCXJldCA9IFBUUl9FUlIoc2VyaWFsODI1MF9pc2FfZGV2cyk7CiAJCWdvdG8gdW5yZWc7CkBAIC0yNTg2LDgyICsyNTkwLDMgQEAKIE1PRFVMRV9QQVJNX0RFU0MocHJvYmVfcnNhLCAiUHJvYmUgSS9PIHBvcnRzIGZvciBSU0EiKTsKICNlbmRpZgogTU9EVUxFX0FMSUFTX0NIQVJERVZfTUFKT1IoVFRZX01BSk9SKTsKLQotLyoqCi0gKglyZWdpc3Rlcl9zZXJpYWwgLSBjb25maWd1cmUgYSAxNng1MCBzZXJpYWwgcG9ydCBhdCBydW50aW1lCi0gKglAcmVxOiByZXF1ZXN0IHN0cnVjdHVyZQotICoKLSAqCUNvbmZpZ3VyZSB0aGUgc2VyaWFsIHBvcnQgc3BlY2lmaWVkIGJ5IHRoZSByZXF1ZXN0LiBJZiB0aGUKLSAqCXBvcnQgZXhpc3RzIGFuZCBpcyBpbiB1c2UgYW4gZXJyb3IgaXMgcmV0dXJuZWQuIElmIHRoZSBwb3J0Ci0gKglpcyBub3QgY3VycmVudGx5IGluIHRoZSB0YWJsZSBpdCBpcyBhZGRlZC4KLSAqCi0gKglUaGUgcG9ydCBpcyB0aGVuIHByb2JlZCBhbmQgaWYgbmVjZXNzYXJ5IHRoZSBJUlEgaXMgYXV0b2RldGVjdGVkCi0gKglJZiB0aGlzIGZhaWxzIGFuIGVycm9yIGlzIHJldHVybmVkLgotICoKLSAqCU9uIHN1Y2Nlc3MgdGhlIHBvcnQgaXMgcmVhZHkgdG8gdXNlIGFuZCB0aGUgbGluZSBudW1iZXIgaXMgcmV0dXJuZWQuCi0gKgotICoJTm90ZTogdGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIC0gdXNlIHNlcmlhbDgyNTBfcmVnaXN0ZXJfcG9ydAotICoJaW5zdGVhZC4KLSAqLwotaW50IHJlZ2lzdGVyX3NlcmlhbChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqcmVxKQotewotCXN0cnVjdCB1YXJ0X3BvcnQgcG9ydDsKLQotCXBvcnQuaW9iYXNlICAgPSByZXEtPnBvcnQ7Ci0JcG9ydC5tZW1iYXNlICA9IHJlcS0+aW9tZW1fYmFzZTsKLQlwb3J0LmlycSAgICAgID0gcmVxLT5pcnE7Ci0JcG9ydC51YXJ0Y2xrICA9IHJlcS0+YmF1ZF9iYXNlICogMTY7Ci0JcG9ydC5maWZvc2l6ZSA9IHJlcS0+eG1pdF9maWZvX3NpemU7Ci0JcG9ydC5yZWdzaGlmdCA9IHJlcS0+aW9tZW1fcmVnX3NoaWZ0OwotCXBvcnQuaW90eXBlICAgPSByZXEtPmlvX3R5cGU7Ci0JcG9ydC5mbGFncyAgICA9IHJlcS0+ZmxhZ3MgfCBVUEZfQk9PVF9BVVRPQ09ORjsKLQlwb3J0Lm1hcGJhc2UgID0gcmVxLT5pb21hcF9iYXNlOwotCXBvcnQuZGV2ICAgICAgPSBOVUxMOwotCi0JaWYgKHNoYXJlX2lycXMpCi0JCXBvcnQuZmxhZ3MgfD0gVVBGX1NIQVJFX0lSUTsKLQotCWlmIChISUdIX0JJVFNfT0ZGU0VUKQotCQlwb3J0LmlvYmFzZSB8PSAobG9uZykgcmVxLT5wb3J0X2hpZ2ggPDwgSElHSF9CSVRTX09GRlNFVDsKLQotCS8qCi0JICogSWYgYSBjbG9jayByYXRlIHdhc24ndCBzcGVjaWZpZWQgYnkgdGhlIGxvdyBsZXZlbCBkcml2ZXIsIHRoZW4KLQkgKiBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBjbG9jayByYXRlLiAgVGhpcyBzaG91bGQgYmUgMTE1MjAwICgqMTYpCi0JICogYW5kIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoZSBhcmNoaXRlY3R1cmUncyBCQVNFX0JBVUQgZGVmaW5pdGlvbi4KLQkgKiBIb3dldmVyLCBzaW5jZSB0aGlzIEFQSSB3aWxsIGJlIGRlcHJlY2F0ZWQsIGl0J3MgcHJvYmFibHkgYQotCSAqIGJldHRlciBpZGVhIHRvIGNvbnZlcnQgdGhlIGRyaXZlcnMgdG8gdXNlIHRoZSBuZXcgQVBJCi0JICogKHNlcmlhbDgyNTBfcmVnaXN0ZXJfcG9ydCBhbmQgc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQpLgotCSAqLwotCWlmIChwb3J0LnVhcnRjbGsgPT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiU2VyaWFsOiByZWdpc3RlcmluZyBwb3J0IGF0IFslMDh4LCUwOGx4LCVwXSBpcnEgJWQgd2l0aCB6ZXJvIGJhdWRfYmFzZVxuIiwKLQkJICAgICAgIHBvcnQuaW9iYXNlLCBwb3J0Lm1hcGJhc2UsIHBvcnQubWVtYmFzZSwgcG9ydC5pcnEpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJTZXJpYWw6IHNlZSAlczolZCBmb3IgbW9yZSBpbmZvcm1hdGlvblxuIiwKLQkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0JCWR1bXBfc3RhY2soKTsKLQotCQkvKgotCQkgKiBGaXggaXQgdXAgZm9yIG5vdywgYnV0IHRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBtZWFzdXJlLgotCQkgKi8KLQkJcG9ydC51YXJ0Y2xrID0gQkFTRV9CQVVEICogMTY7Ci0JfQotCi0JcmV0dXJuIHNlcmlhbDgyNTBfcmVnaXN0ZXJfcG9ydCgmcG9ydCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX3NlcmlhbCk7Ci0KLS8qKgotICoJdW5yZWdpc3Rlcl9zZXJpYWwgLSByZW1vdmUgYSAxNng1MCBzZXJpYWwgcG9ydCBhdCBydW50aW1lCi0gKglAbGluZTogc2VyaWFsIGxpbmUgbnVtYmVyCi0gKgotICoJUmVtb3ZlIG9uZSBzZXJpYWwgcG9ydC4gIFRoaXMgbWF5IG5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQKLSAqCWNvbnRleHQuICBXZSBoYW5kIHRoZSBwb3J0IGJhY2sgdG8gb3VyIGxvY2FsIFBNIGNvbnRyb2wuCi0gKgotICoJTm90ZTogdGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIC0gdXNlIHNlcmlhbDgyNTBfdW5yZWdpc3Rlcl9wb3J0Ci0gKglpbnN0ZWFkLgotICovCi12b2lkIHVucmVnaXN0ZXJfc2VyaWFsKGludCBsaW5lKQotewotCXNlcmlhbDgyNTBfdW5yZWdpc3Rlcl9wb3J0KGxpbmUpOwotfQotRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3NlcmlhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwLmggYi9kcml2ZXJzL3NlcmlhbC84MjUwLmgKaW5kZXggOTIyNWM4Mi4uYjFiNDU5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MC5oCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuaApAQCAtMTYsMTEgKzE2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0KLWludCBzZXJpYWw4MjUwX3JlZ2lzdGVyX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqKTsKLXZvaWQgc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQoaW50IGxpbmUpOwotdm9pZCBzZXJpYWw4MjUwX3N1c3BlbmRfcG9ydChpbnQgbGluZSk7Ci12b2lkIHNlcmlhbDgyNTBfcmVzdW1lX3BvcnQoaW50IGxpbmUpOworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAKIHN0cnVjdCBvbGRfc2VyaWFsX3BvcnQgewogCXVuc2lnbmVkIGludCB1YXJ0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9hY2NlbnQuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfYWNjZW50LmMKaW5kZXggMWYyYzI3Ni4uOWMxMDI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9hY2NlbnQuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2FjY2VudC5jCkBAIC0yOSw3ICsyOSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFjY2VudF9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDIsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfQUNDRU5ULAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBhY2NlbnRfZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9hY3BpLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2FjcGkuYwppbmRleCA2YjllYWQyLi5hODAyYmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwX2FjcGkuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2FjcGkuYwpAQCAtNDcsMTggKzQ3LDMwIEBACiBzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9zZXJpYWxfZXh0X2lycShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAogCQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxICpleHRfaXJxKQogewotCWlmIChleHRfaXJxLT5udW1iZXJfb2ZfaW50ZXJydXB0cyA+IDApCi0JCXBvcnQtPmlycSA9IGFjcGlfcmVnaXN0ZXJfZ3NpKGV4dF9pcnEtPmludGVycnVwdHNbMF0sCisJaW50IHJjOworCisJaWYgKGV4dF9pcnEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzID4gMCkgeworCQlyYyA9IGFjcGlfcmVnaXN0ZXJfZ3NpKGV4dF9pcnEtPmludGVycnVwdHNbMF0sCiAJICAgICAgICAgICAgICAgICAgIGV4dF9pcnEtPmVkZ2VfbGV2ZWwsIGV4dF9pcnEtPmFjdGl2ZV9oaWdoX2xvdyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gQUVfRVJST1I7CisJCXBvcnQtPmlycSA9IHJjOworCX0KIAlyZXR1cm4gQUVfT0s7CiB9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3NlcmlhbF9pcnEoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKIAkJCQkgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgKmlycSkKIHsKLQlpZiAoaXJxLT5udW1iZXJfb2ZfaW50ZXJydXB0cyA+IDApCi0JCXBvcnQtPmlycSA9IGFjcGlfcmVnaXN0ZXJfZ3NpKGlycS0+aW50ZXJydXB0c1swXSwKKwlpbnQgcmM7CisKKwlpZiAoaXJxLT5udW1iZXJfb2ZfaW50ZXJydXB0cyA+IDApIHsKKwkJcmMgPSBhY3BpX3JlZ2lzdGVyX2dzaShpcnEtPmludGVycnVwdHNbMF0sCiAJICAgICAgICAgICAgICAgICAgIGlycS0+ZWRnZV9sZXZlbCwgaXJxLT5hY3RpdmVfaGlnaF9sb3cpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIEFFX0VSUk9SOworCQlwb3J0LT5pcnEgPSByYzsKKwl9CiAJcmV0dXJuIEFFX09LOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX2JvY2EuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfYm9jYS5jCmluZGV4IDQ2NWM5ZWEuLjNiZmUwZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfYm9jYS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfYm9jYS5jCkBAIC00Myw3ICs0Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJvY2FfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAzLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX0JPQ0EsCiAJLmRldgkJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9IGJvY2FfZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9mb3VycG9ydC5jIGIvZHJpdmVycy9zZXJpYWwvODI1MF9mb3VycG9ydC5jCmluZGV4IGU5YjRkOTAuLjYzNzVkNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfZm91cnBvcnQuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2ZvdXJwb3J0LmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZm91cnBvcnRfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAxLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX0ZPVVJQT1JULAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBmb3VycG9ydF9kYXRhLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX2h1YjYuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfaHViNi5jCmluZGV4IDc3ZjM5NmYuLmRhZjU2OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfaHViNi5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfaHViNi5jCkBAIC00MCw3ICs0MCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGh1YjZfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSA0LAorCS5pZAkJCT0gUExBVDgyNTBfREVWX0hVQjYsCiAJLmRldgkJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9IGh1YjZfZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9tY2EuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfbWNhLmMKaW5kZXggZjBjNDBkNi4uYWMyMDUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9tY2EuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX21jYS5jCkBAIC00NCw3ICs0NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1jYV9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDUsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfTUNBLAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBtY2FfZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKaW5kZXggZDU3OTc2MS4uYjc0NWExYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCkBAIC04MCw3ICs4MCw3IEBACiBjb25maWcgU0VSSUFMXzgyNTBfQUNQSQogCWJvb2wgIjgyNTAvMTY1NTAgZGV2aWNlIGRpc2NvdmVyeSB2aWEgQUNQSSBuYW1lc3BhY2UiCiAJZGVmYXVsdCB5IGlmIElBNjQKLQlkZXBlbmRzIG9uIEFDUElfQlVTICYmIFNFUklBTF84MjUwCisJZGVwZW5kcyBvbiBBQ1BJICYmIFNFUklBTF84MjUwCiAJLS0taGVscC0tLQogCSAgSWYgeW91IHdpc2ggdG8gZW5hYmxlIHNlcmlhbCBwb3J0IGRpc2NvdmVyeSB2aWEgdGhlIEFDUEkKIAkgIG5hbWVzcGFjZSwgc2F5IFkgaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCkBAIC0zMDgsNyArMzA4LDcgQEAKIAogY29uZmlnIFNFUklBTF9EWgogCWJvb2wgIkRFQ3N0YXRpb24gRFogc2VyaWFsIGRyaXZlciIKLQlkZXBlbmRzIG9uIE1BQ0hfREVDU1RBVElPTiAmJiBNSVBTMzIKKwlkZXBlbmRzIG9uIE1BQ0hfREVDU1RBVElPTiAmJiAzMkJJVAogCXNlbGVjdCBTRVJJQUxfQ09SRQogCWhlbHAKIAkgIERaMTEtZmFtaWx5IHNlcmlhbCBjb250cm9sbGVycyBmb3IgVkFYc3RhdGlvbnMsIGluY2x1ZGluZyB0aGUKQEAgLTgzMCw3ICs4MzAsNyBAQAogCiBjb25maWcgU0VSSUFMX1RYWDkKIAlib29sICJUTVBUWDM5WFgvNDlYWCBTSU8gc3VwcG9ydCIKLQlkZXBlbmRzIEhBU19UWFg5X1NFUklBTAorCWRlcGVuZHMgSEFTX1RYWDlfU0VSSUFMICYmIEJST0tFTgogCXNlbGVjdCBTRVJJQUxfQ09SRQogCWRlZmF1bHQgeQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDEwLmMgYi9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDEwLmMKaW5kZXggMjg4NGIzMS4uOTc4ZTEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTAuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJdW5zaWduZWQgaW50CQlvbGRfc3RhdHVzOwogfTsKIAotc3RhdGljIHZvaWQgcGwwMTBfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0b3ApCitzdGF0aWMgdm9pZCBwbDAxMF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJdW5zaWduZWQgaW50IGNyOwogCkBAIC0xMTQsNyArMTE0LDcgQEAKIAlVQVJUX1BVVF9DUihwb3J0LCBjcik7CiB9CiAKLXN0YXRpYyB2b2lkIHBsMDEwX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RhcnQpCitzdGF0aWMgdm9pZCBwbDAxMF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXVuc2lnbmVkIGludCBjcjsKIApAQCAtMjE5LDcgKzIxOSw3IEBACiAJCXJldHVybjsKIAl9CiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQocG9ydCkpIHsKLQkJcGwwMTBfc3RvcF90eChwb3J0LCAwKTsKKwkJcGwwMTBfc3RvcF90eChwb3J0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjM2LDcgKzIzNiw3IEBACiAJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOwogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKLQkJcGwwMTBfc3RvcF90eChwb3J0LCAwKTsKKwkJcGwwMTBfc3RvcF90eChwb3J0KTsKIH0KIAogc3RhdGljIHZvaWQgcGwwMTBfbW9kZW1fc3RhdHVzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDExLmMgYi9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDExLmMKaW5kZXggN2RiODhlZS4uNTYwNzEzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTEuYwpAQCAtNzQsNyArNzQsNyBAQAogCXVuc2lnbmVkIGludAkJb2xkX3N0YXR1czsKIH07CiAKLXN0YXRpYyB2b2lkIHBsMDExX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgcGwwMTFfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0X2FtYmFfcG9ydCAqdWFwID0gKHN0cnVjdCB1YXJ0X2FtYmFfcG9ydCAqKXBvcnQ7CiAKQEAgLTgyLDcgKzgyLDcgQEAKIAl3cml0ZXcodWFwLT5pbSwgdWFwLT5wb3J0Lm1lbWJhc2UgKyBVQVJUMDExX0lNU0MpOwogfQogCi1zdGF0aWMgdm9pZCBwbDAxMV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KQorc3RhdGljIHZvaWQgcGwwMTFfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF9hbWJhX3BvcnQgKnVhcCA9IChzdHJ1Y3QgdWFydF9hbWJhX3BvcnQgKilwb3J0OwogCkBAIC0xODQsNyArMTg0LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZCgmdWFwLT5wb3J0KSkgewotCQlwbDAxMV9zdG9wX3R4KCZ1YXAtPnBvcnQsIDApOworCQlwbDAxMV9zdG9wX3R4KCZ1YXAtPnBvcnQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMDEsNyArMjAxLDcgQEAKIAkJdWFydF93cml0ZV93YWtldXAoJnVhcC0+cG9ydCk7CiAKIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQotCQlwbDAxMV9zdG9wX3R4KCZ1YXAtPnBvcnQsIDApOworCQlwbDAxMV9zdG9wX3R4KCZ1YXAtPnBvcnQpOwogfQogCiBzdGF0aWMgdm9pZCBwbDAxMV9tb2RlbV9zdGF0dXMoc3RydWN0IHVhcnRfYW1iYV9wb3J0ICp1YXApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hdTF4MDBfdWFydC5jIGIvZHJpdmVycy9zZXJpYWwvYXUxeDAwX3VhcnQuYwppbmRleCA2MTA0YWVlLi5hMjc0ZWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9hdTF4MDBfdWFydC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2F1MXgwMF91YXJ0LmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCURFQlVHX0FVVE9DT05GKCJ0eXBlPSVzXG4iLCB1YXJ0X2NvbmZpZ1t1cC0+cG9ydC50eXBlXS5uYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgc2VyaWFsODI1MF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RvcCkKK3N0YXRpYyB2b2lkIHNlcmlhbDgyNTBfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfODI1MF9wb3J0ICopcG9ydDsKIApAQCAtMjEwLDcgKzIxMCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzZXJpYWw4MjUwX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RhcnQpCitzdGF0aWMgdm9pZCBzZXJpYWw4MjUwX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKilwb3J0OwogCkBAIC0zMzcsNyArMzM3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZCgmdXAtPnBvcnQpKSB7Ci0JCXNlcmlhbDgyNTBfc3RvcF90eCgmdXAtPnBvcnQsIDApOworCQlzZXJpYWw4MjUwX3N0b3BfdHgoJnVwLT5wb3J0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzU2LDcgKzM1Niw3IEBACiAJREVCVUdfSU5UUigiVEhSRS4uLiIpOwogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKLQkJc2VyaWFsODI1MF9zdG9wX3R4KCZ1cC0+cG9ydCwgMCk7CisJCXNlcmlhbDgyNTBfc3RvcF90eCgmdXAtPnBvcnQpOwogfQogCiBzdGF0aWMgX0lOTElORV8gdm9pZCBjaGVja19tb2RlbV9zdGF0dXMoc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NscHM3MTF4LmMgYi9kcml2ZXJzL3NlcmlhbC9jbHBzNzExeC5jCmluZGV4IGU5MjUyMmIuLmQ4MjI4OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NscHM3MTF4LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY2xwczcxMXguYwpAQCAtNjksOCArNjksNyBAQAogCiAjZGVmaW5lIHR4X2VuYWJsZWQocG9ydCkJKChwb3J0KS0+dW51c2VkWzBdKQogCi1zdGF0aWMgdm9pZAotY2xwczcxMXh1YXJ0X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgY2xwczcxMXh1YXJ0X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlpZiAodHhfZW5hYmxlZChwb3J0KSkgewogCQlkaXNhYmxlX2lycShUWF9JUlEocG9ydCkpOwpAQCAtNzgsOCArNzcsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQKLWNscHM3MTF4dWFydF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KQorc3RhdGljIHZvaWQgY2xwczcxMXh1YXJ0X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJaWYgKCF0eF9lbmFibGVkKHBvcnQpKSB7CiAJCWVuYWJsZV9pcnEoVFhfSVJRKHBvcnQpKTsKQEAgLTE2NSw3ICsxNjMsNyBAQAogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKHBvcnQpKSB7Ci0JCWNscHM3MTF4dWFydF9zdG9wX3R4KHBvcnQsIDApOworCQljbHBzNzExeHVhcnRfc3RvcF90eChwb3J0KTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIApAQCAtMTgyLDcgKzE4MCw3IEBACiAJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOwogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKLQkJY2xwczcxMXh1YXJ0X3N0b3BfdHgocG9ydCwgMCk7CisJCWNscHM3MTF4dWFydF9zdG9wX3R4KHBvcnQpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jCmluZGV4IGQ2MzlhYzkuLjI1ODI1ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogLyoKICAqIFN0b3AgdHJhbnNtaXR0ZXIKICAqLwotc3RhdGljIHZvaWQgY3BtX3VhcnRfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0b3ApCitzdGF0aWMgdm9pZCBjcG1fdWFydF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVhcnRfY3BtX3BvcnQgKnBpbmZvID0gKHN0cnVjdCB1YXJ0X2NwbV9wb3J0ICopcG9ydDsKIAl2b2xhdGlsZSBzbWNfdCAqc21jcCA9IHBpbmZvLT5zbWNwOwpAQCAtMTQxLDcgKzE0MSw3IEBACiAvKgogICogU3RhcnQgdHJhbnNtaXR0ZXIKICAqLwotc3RhdGljIHZvaWQgY3BtX3VhcnRfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdGFydCkKK3N0YXRpYyB2b2lkIGNwbV91YXJ0X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVhcnRfY3BtX3BvcnQgKnBpbmZvID0gKHN0cnVjdCB1YXJ0X2NwbV9wb3J0ICopcG9ydDsKIAl2b2xhdGlsZSBzbWNfdCAqc21jcCA9IHBpbmZvLT5zbWNwOwpAQCAtNDAzLDEwICs0MDMsOCBAQAogCiBpbmxpbmUgdm9pZCBjcG1fdWFydF93YWl0X3VudGlsX3NlbmQoc3RydWN0IHVhcnRfY3BtX3BvcnQgKnBpbmZvKQogewotCXVuc2lnbmVkIGxvbmcgdGFyZ2V0X2ppZmZpZXMgPSBqaWZmaWVzICsgcGluZm8tPndhaXRfY2xvc2luZzsKLQotCXdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCB0YXJnZXRfamlmZmllcykpCi0gICAJCXNjaGVkdWxlKCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQocGluZm8tPndhaXRfY2xvc2luZyk7CiB9CiAKIC8qCkBAIC00MjUsOSArNDIzLDEyIEBACiAJLyogSWYgdGhlIHBvcnQgaXMgbm90IHRoZSBjb25zb2xlLCBkaXNhYmxlIFJ4IGFuZCBUeC4gKi8KIAlpZiAoIShwaW5mby0+ZmxhZ3MgJiBGTEFHX0NPTlNPTEUpKSB7CiAJCS8qIFdhaXQgZm9yIGFsbCB0aGUgQkRzIG1hcmtlZCBzZW50ICovCi0JCXdoaWxlKCFjcG1fdWFydF90eF9lbXB0eShwb3J0KSkKKwkJd2hpbGUoIWNwbV91YXJ0X3R4X2VtcHR5KHBvcnQpKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCQlzY2hlZHVsZV90aW1lb3V0KDIpOwotCQlpZihwaW5mby0+d2FpdF9jbG9zaW5nKQorCQl9CisKKwkJaWYgKHBpbmZvLT53YWl0X2Nsb3NpbmcpCiAJCQljcG1fdWFydF93YWl0X3VudGlsX3NlbmQocGluZm8pOwogCiAJCS8qIFN0b3AgdWFydHMgKi8KQEAgLTYyMyw3ICs2MjQsNyBAQAogCX0KIAogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKHBvcnQpKSB7Ci0JCWNwbV91YXJ0X3N0b3BfdHgocG9ydCwgMCk7CisJCWNwbV91YXJ0X3N0b3BfdHgocG9ydCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNjU2LDcgKzY1Nyw3IEBACiAJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOwogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkgewotCQljcG1fdWFydF9zdG9wX3R4KHBvcnQsIDApOworCQljcG1fdWFydF9zdG9wX3R4KHBvcnQpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTIuYyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTIuYwppbmRleCBjNGM4ZjRiLi4xNWFkNThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0yLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMi5jCkBAIC0xNDIsNiArMTQyLDE0IEBACiAJICogYmUgc3VwcG9ydGVkIGluIGEgc2FuZSBmYXNoaW9uLgogCSAqLwogI2lmbmRlZiBDT05GSUdfU1RYX0dQMworI2lmZGVmIENPTkZJR19NUEM4NTYwX0FEUworCXZvbGF0aWxlIGlvcF9jcG0yX3QgKmlvID0gJmNwbTJfaW1tci0+aW1faW9wb3J0OworCWlvLT5pb3BfcHBhcmQgfD0gMHgwMDAwMDAxODsKKwlpby0+aW9wX3Bzb3JkICY9IH4weDAwMDAwMDA4OwkvKiBSeCAqLworCWlvLT5pb3BfcHNvcmQgJj0gfjB4MDAwMDAwMTA7CS8qIFR4ICovCisJaW8tPmlvcF9wZGlyZCAmPSB+MHgwMDAwMDAwODsJLyogUnggKi8KKwlpby0+aW9wX3BkaXJkIHw9IDB4MDAwMDAwMTA7CS8qIFR4ICovCisjZWxzZQogCXZvbGF0aWxlIGlvcF9jcG0yX3QgKmlvID0gJmNwbTJfaW1tci0+aW1faW9wb3J0OwogCWlvLT5pb3BfcHBhcmIgfD0gMHgwMDhiMDAwMDsKIAlpby0+aW9wX3BkaXJiIHw9IDB4MDA4ODAwMDA7CkBAIC0xNDksNiArMTU3LDcgQEAKIAlpby0+aW9wX3BkaXJiICY9IH4weDAwMDMwMDAwOwogCWlvLT5pb3BfcHNvcmIgJj0gfjB4MDAwMzAwMDA7CiAjZW5kaWYKKyNlbmRpZgogCWNwbTJfaW1tci0+aW1fY3BtdXguY214X3NjciAmPSAweGZmMDBmZmZmOwogCWNwbTJfaW1tci0+aW1fY3BtdXguY214X3NjciB8PSAweDAwMDkwMDAwOwogCXBpbmZvLT5icmcgPSAyOwpAQCAtMjU3LDYgKzI2Niw3IEBACiAJY3BtX3VhcnRfcG9ydHNbVUFSVF9TTUMxXS5zbWNwID0gKHNtY190ICopICYgY3BtMl9pbW1yLT5pbV9zbWNbMF07CiAJY3BtX3VhcnRfcG9ydHNbVUFSVF9TTUMxXS5zbWN1cCA9CiAJICAgIChzbWNfdWFydF90ICopICYgY3BtMl9pbW1yLT5pbV9kcHJhbWJhc2VbUFJPRkZfU01DMV07CisJKih1MTYgKikoJmNwbTJfaW1tci0+aW1fZHByYW1iYXNlW1BST0ZGX1NNQzFfQkFTRV0pID0gUFJPRkZfU01DMTsKIAljcG1fdWFydF9wb3J0c1tVQVJUX1NNQzFdLnBvcnQubWFwYmFzZSA9CiAJICAgICh1bnNpZ25lZCBsb25nKSZjcG0yX2ltbXItPmltX3NtY1swXTsKIAljcG1fdWFydF9wb3J0c1tVQVJUX1NNQzFdLnNtY3AtPnNtY19zbWNtIHw9IChTTUNNX1JYIHwgU01DTV9UWCk7CkBAIC0yNjksNiArMjc5LDcgQEAKIAljcG1fdWFydF9wb3J0c1tVQVJUX1NNQzJdLnNtY3AgPSAoc21jX3QgKikgJiBjcG0yX2ltbXItPmltX3NtY1sxXTsKIAljcG1fdWFydF9wb3J0c1tVQVJUX1NNQzJdLnNtY3VwID0KIAkgICAgKHNtY191YXJ0X3QgKikgJiBjcG0yX2ltbXItPmltX2RwcmFtYmFzZVtQUk9GRl9TTUMyXTsKKwkqKHUxNiAqKSgmY3BtMl9pbW1yLT5pbV9kcHJhbWJhc2VbUFJPRkZfU01DMl9CQVNFXSkgPSBQUk9GRl9TTUMyOwogCWNwbV91YXJ0X3BvcnRzW1VBUlRfU01DMl0ucG9ydC5tYXBiYXNlID0KIAkgICAgKHVuc2lnbmVkIGxvbmcpJmNwbTJfaW1tci0+aW1fc21jWzFdOwogCWNwbV91YXJ0X3BvcnRzW1VBUlRfU01DMl0uc21jcC0+c21jX3NtY20gfD0gKFNNQ01fUlggfCBTTUNNX1RYKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYyBiL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYwppbmRleCAyM2I4ODcxLi40MGQzZTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jCkBAIC00NDYsNyArNDQ2LDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKQEAgLTUwNDEsMTcgKzUwNDAsMyBAQAogLyogdGhpcyBtYWtlcyBzdXJlIHRoYXQgcnNfaW5pdCBpcyBjYWxsZWQgZHVyaW5nIGtlcm5lbCBib290ICovCiAKIG1vZHVsZV9pbml0KHJzX2luaXQpOwotCi0vKgotICogcmVnaXN0ZXJfc2VyaWFsIGFuZCB1bnJlZ2lzdGVyX3NlcmlhbCBhbGxvd3MgZm9yIHNlcmlhbCBwb3J0cyB0byBiZQotICogY29uZmlndXJlZCBhdCBydW4tdGltZSwgdG8gc3VwcG9ydCBQQ01DSUEgbW9kZW1zLgotICovCi1pbnQKLXJlZ2lzdGVyX3NlcmlhbChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqcmVxKQotewotCXJldHVybiAtMTsKLX0KLQotdm9pZCB1bnJlZ2lzdGVyX3NlcmlhbChpbnQgbGluZSkKLXsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2R6LmMgYi9kcml2ZXJzL3NlcmlhbC9kei5jCmluZGV4IDk3ODI0ZWUuLmU2M2I5ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2R6LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvZHouYwpAQCAtMTEyLDcgKzExMiw3IEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCi1zdGF0aWMgdm9pZCBkel9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0b3ApCitzdGF0aWMgdm9pZCBkel9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQogewogCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9IChzdHJ1Y3QgZHpfcG9ydCAqKXVwb3J0OwogCXVuc2lnbmVkIHNob3J0IHRtcCwgbWFzayA9IDEgPDwgZHBvcnQtPnBvcnQubGluZTsKQEAgLTEyNSw3ICsxMjUsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgZHpfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RhcnQpCitzdGF0aWMgdm9pZCBkel9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKIHsKIAlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQgPSAoc3RydWN0IGR6X3BvcnQgKil1cG9ydDsKIAl1bnNpZ25lZCBzaG9ydCB0bXAsIG1hc2sgPSAxIDw8IGRwb3J0LT5wb3J0LmxpbmU7CkBAIC0yOTAsNyArMjkwLDcgQEAKIAl9CiAJLyogaWYgbm90aGluZyB0byBkbyBvciBzdG9wcGVkIG9yIGhhcmR3YXJlIHN0b3BwZWQgKi8KIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZCgmZHBvcnQtPnBvcnQpKSB7Ci0JCWR6X3N0b3BfdHgoJmRwb3J0LT5wb3J0LCAwKTsKKwkJZHpfc3RvcF90eCgmZHBvcnQtPnBvcnQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zMDgsNyArMzA4LDcgQEAKIAogCS8qIEFyZSB3ZSBkb25lICovCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKLQkJZHpfc3RvcF90eCgmZHBvcnQtPnBvcnQsIDApOworCQlkel9zdG9wX3R4KCZkcG9ydC0+cG9ydCk7CiB9CiAKIC8qCkBAIC00NDAsNyArNDQwLDcgQEAKICAqLwogc3RhdGljIHZvaWQgZHpfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCiB7Ci0JZHpfc3RvcF90eCh1cG9ydCwgMCk7CisJZHpfc3RvcF90eCh1cG9ydCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9pY29tLmMgYi9kcml2ZXJzL3NlcmlhbC9pY29tLmMKaW5kZXggYzExMmIzMi4uZWIzMTEyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvaWNvbS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2ljb20uYwpAQCAtNTYsNyArNTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC05ODksMTggKzk4OCwxNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIGljb21fc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0b3ApCitzdGF0aWMgdm9pZCBpY29tX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAl1bnNpZ25lZCBjaGFyIGNtZFJlZzsKIAotCWlmICh0dHlfc3RvcCkgewotCQl0cmFjZShJQ09NX1BPUlQsICJTVE9QIiwgMCk7Ci0JCWNtZFJlZyA9IHJlYWRiKCZJQ09NX1BPUlQtPmRyYW0tPkNtZFJlZyk7Ci0JCXdyaXRlYihjbWRSZWcgfCBDTURfSE9MRF9YTUlULCAmSUNPTV9QT1JULT5kcmFtLT5DbWRSZWcpOwotCX0KKwl0cmFjZShJQ09NX1BPUlQsICJTVE9QIiwgMCk7CisJY21kUmVnID0gcmVhZGIoJklDT01fUE9SVC0+ZHJhbS0+Q21kUmVnKTsKKwl3cml0ZWIoY21kUmVnIHwgQ01EX0hPTERfWE1JVCwgJklDT01fUE9SVC0+ZHJhbS0+Q21kUmVnKTsKIH0KIAotc3RhdGljIHZvaWQgaWNvbV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KQorc3RhdGljIHZvaWQgaWNvbV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXVuc2lnbmVkIGNoYXIgY21kUmVnOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9pbXguYyBiL2RyaXZlcnMvc2VyaWFsL2lteC5jCmluZGV4IDAxYTg3MjYuLjRjOTg1ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2lteC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2lteC5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIC8qCiAgKiBpbnRlcnJ1cHRzIGRpc2FibGVkIG9uIGVudHJ5CiAgKi8KLXN0YXRpYyB2b2lkIGlteF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RvcCkKK3N0YXRpYyB2b2lkIGlteF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGlteF9wb3J0ICpzcG9ydCA9IChzdHJ1Y3QgaW14X3BvcnQgKilwb3J0OwogCVVDUjEoKHUzMilzcG9ydC0+cG9ydC5tZW1iYXNlKSAmPSB+VUNSMV9UWE1QVFlFTjsKQEAgLTE2NSwxMyArMTY1LDEzIEBACiAJfSB3aGlsZSAoIShVVFMoKHUzMilzcG9ydC0+cG9ydC5tZW1iYXNlKSAmIFVUU19UWEZVTEwpKTsKIAogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCi0JCWlteF9zdG9wX3R4KCZzcG9ydC0+cG9ydCwgMCk7CisJCWlteF9zdG9wX3R4KCZzcG9ydC0+cG9ydCk7CiB9CiAKIC8qCiAgKiBpbnRlcnJ1cHRzIGRpc2FibGVkIG9uIGVudHJ5CiAgKi8KLXN0YXRpYyB2b2lkIGlteF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KQorc3RhdGljIHZvaWQgaW14X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGlteF9wb3J0ICpzcG9ydCA9IChzdHJ1Y3QgaW14X3BvcnQgKilwb3J0OwogCkBAIC0xOTYsNyArMTk2LDcgQEAKIAl9CiAKIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZCgmc3BvcnQtPnBvcnQpKSB7Ci0JCWlteF9zdG9wX3R4KCZzcG9ydC0+cG9ydCwgMCk7CisJCWlteF9zdG9wX3R4KCZzcG9ydC0+cG9ydCk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjkxLDEzICsyOTEsMzEgQEAKIAlyZXR1cm4gVVNSMigodTMyKXNwb3J0LT5wb3J0Lm1lbWJhc2UpICYgVVNSMl9UWERDID8gIFRJT0NTRVJfVEVNVCA6IDA7CiB9CiAKKy8qCisgKiBXZSBoYXZlIGEgbW9kZW0gc2lkZSB1YXJ0LCBzbyB0aGUgbWVhbmluZ3Mgb2YgUlRTIGFuZCBDVFMgYXJlIGludmVydGVkLgorICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGlteF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlyZXR1cm4gVElPQ01fQ1RTIHwgVElPQ01fRFNSIHwgVElPQ01fQ0FSOworICAgICAgICBzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0ID0gKHN0cnVjdCBpbXhfcG9ydCAqKXBvcnQ7CisgICAgICAgIHVuc2lnbmVkIGludCB0bXAgPSBUSU9DTV9EU1IgfCBUSU9DTV9DQVI7CisKKyAgICAgICAgaWYgKFVTUjEoKHUzMilzcG9ydC0+cG9ydC5tZW1iYXNlKSAmIFVTUjFfUlRTUykKKyAgICAgICAgICAgICAgICB0bXAgfD0gVElPQ01fQ1RTOworCisgICAgICAgIGlmIChVQ1IyKCh1MzIpc3BvcnQtPnBvcnQubWVtYmFzZSkgJiBVQ1IyX0NUUykKKyAgICAgICAgICAgICAgICB0bXAgfD0gVElPQ01fUlRTOworCisgICAgICAgIHJldHVybiB0bXA7CiB9CiAKIHN0YXRpYyB2b2lkIGlteF9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQogeworICAgICAgICBzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0ID0gKHN0cnVjdCBpbXhfcG9ydCAqKXBvcnQ7CisKKyAgICAgICAgaWYgKG1jdHJsICYgVElPQ01fUlRTKQorICAgICAgICAgICAgICAgIFVDUjIoKHUzMilzcG9ydC0+cG9ydC5tZW1iYXNlKSB8PSBVQ1IyX0NUUzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFVDUjIoKHUzMilzcG9ydC0+cG9ydC5tZW1iYXNlKSAmPSB+VUNSMl9DVFM7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9pb2M0X3NlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvaW9jNF9zZXJpYWwuYwppbmRleCA3OTNjM2E3Li4wYzVjOTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9pb2M0X3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2lvYzRfc2VyaWFsLmMKQEAgLTIzNzMsMTAgKzIzNzMsOSBAQAogLyoqCiAgKiBpYzRfc3RvcF90eCAtIHN0b3AgdGhlIHRyYW5zbWl0dGVyCiAgKiBAcG9ydDogUG9ydCB0byBvcGVyYXRlIG9uCi0gKiBAdHR5X3N0b3A6IFNldCB0byAxIGlmIGNhbGxlZCB2aWEgdWFydF9zdG9wCiAgKgogICovCi1zdGF0aWMgdm9pZCBpYzRfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgaWM0X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQpCiB7CiB9CiAKQEAgLTI0NzEsMTAgKzI0NzAsOSBAQAogLyoqCiAgKiBpYzRfc3RhcnRfdHggLSBTdGFydCB0cmFuc21pdHRlciwgZmx1c2ggYW55IG91dHB1dAogICogQHBvcnQ6IFBvcnQgdG8gb3BlcmF0ZSBvbgotICogQHR0eV9zdG9wOiBTZXQgdG8gMSBpZiBjYWxsZWQgdmlhIHVhcnRfc3RhcnQKICAqCiAgKi8KLXN0YXRpYyB2b2lkIGljNF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgaWM0X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0KQogewogCXN0cnVjdCBpb2M0X3BvcnQgKnBvcnQgPSBnZXRfaW9jNF9wb3J0KHRoZV9wb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvaXAyMnppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYwppbmRleCBlYTViZjRkLi5lZjEzMjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYworKysgYi9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYwpAQCAtNTkyLDcgKzU5Miw3IEBACiB9CiAKIC8qIFRoZSBwb3J0IGxvY2sgaXMgaGVsZCBhbmQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuICAqLwotc3RhdGljIHZvaWQgaXAyMnppbG9nX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgaXAyMnppbG9nX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF9pcDIyemlsb2dfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfaXAyMnppbG9nX3BvcnQgKikgcG9ydDsKIApAQCAtNjAwLDcgKzYwMCw3IEBACiB9CiAKIC8qIFRoZSBwb3J0IGxvY2sgaXMgaGVsZCBhbmQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuICAqLwotc3RhdGljIHZvaWQgaXAyMnppbG9nX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RhcnQpCitzdGF0aWMgdm9pZCBpcDIyemlsb2dfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF9pcDIyemlsb2dfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfaXAyMnppbG9nX3BvcnQgKikgcG9ydDsKIAlzdHJ1Y3Qgemlsb2dfY2hhbm5lbCAqY2hhbm5lbCA9IFpJTE9HX0NIQU5ORUxfRlJPTV9QT1JUKHBvcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvanNtL2pzbV90dHkuYyBiL2RyaXZlcnMvc2VyaWFsL2pzbS9qc21fdHR5LmMKaW5kZXggOThkZTIyNS4uNmZhMGQ2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvanNtL2pzbV90dHkuYworKysgYi9kcml2ZXJzL3NlcmlhbC9qc20vanNtX3R0eS5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAl1ZGVsYXkoMTApOwogfQogCi1zdGF0aWMgdm9pZCBqc21fdHR5X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RhcnQpCitzdGF0aWMgdm9pZCBqc21fdHR5X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGpzbV9jaGFubmVsICpjaGFubmVsID0gKHN0cnVjdCBqc21fY2hhbm5lbCAqKXBvcnQ7CiAKQEAgLTEyNSw3ICsxMjUsNyBAQAogCWpzbV9wcmludGsoSU9DVEwsIElORk8sICZjaGFubmVsLT5jaF9iZC0+cGNpX2RldiwgImZpbmlzaFxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIGpzbV90dHlfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0b3ApCitzdGF0aWMgdm9pZCBqc21fdHR5X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QganNtX2NoYW5uZWwgKmNoYW5uZWwgPSAoc3RydWN0IGpzbV9jaGFubmVsICopcG9ydDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbTMycl9zaW8uYyBiL2RyaXZlcnMvc2VyaWFsL20zMnJfc2lvLmMKaW5kZXggOWI1MDU2MC4uYjBlY2M3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbTMycl9zaW8uYworKysgYi9kcml2ZXJzL3NlcmlhbC9tMzJyX3Npby5jCkBAIC0yNzUsNyArMjc1LDcgQEAKIAlfX3Npb19vdXQodmFsdWUsIG9mZnNldCk7CiB9CiAKLXN0YXRpYyB2b2lkIG0zMnJfc2lvX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgbTMycl9zaW9fc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0X3Npb19wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF9zaW9fcG9ydCAqKXBvcnQ7CiAKQEAgLTI4NSw3ICsyODUsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbTMycl9zaW9fc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdGFydCkKK3N0YXRpYyB2b2lkIG0zMnJfc2lvX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAjaWZkZWYgQ09ORklHX1NFUklBTF9NMzJSX1BMRFNJTwogCXN0cnVjdCB1YXJ0X3Npb19wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF9zaW9fcG9ydCAqKXBvcnQ7CkBAIC00MjUsNyArNDI1LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZCgmdXAtPnBvcnQpKSB7Ci0JCW0zMnJfc2lvX3N0b3BfdHgoJnVwLT5wb3J0LCAwKTsKKwkJbTMycl9zaW9fc3RvcF90eCgmdXAtPnBvcnQpOwogCQlyZXR1cm47CiAJfQogCkBAIC00NDYsNyArNDQ2LDcgQEAKIAlERUJVR19JTlRSKCJUSFJFLi4uIik7CiAKIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQotCQltMzJyX3Npb19zdG9wX3R4KCZ1cC0+cG9ydCwgMCk7CisJCW0zMnJfc2lvX3N0b3BfdHgoJnVwLT5wb3J0KTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL21jZnNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvbWNmc2VyaWFsLmMKaW5kZXggOGM0MDE2Ny4uNDNiMDNjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbWNmc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvbWNmc2VyaWFsLmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9jb2xkZmlyZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC9tcGM1Mnh4X3VhcnQuYwppbmRleCAyYTVjZjE3Li5hM2NkMGVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9tcGM1Mnh4X3VhcnQuYworKysgYi9kcml2ZXJzL3NlcmlhbC9tcGM1Mnh4X3VhcnQuYwpAQCAtMTE5LDcgKzExOSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIAotbXBjNTJ4eF91YXJ0X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorbXBjNTJ4eF91YXJ0X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAkvKiBwb3J0LT5sb2NrIHRha2VuIGJ5IGNhbGxlciAqLwogCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgJj0gfk1QQzUyeHhfUFNDX0lNUl9UWFJEWTsKQEAgLTEyNyw3ICsxMjcsNyBAQAogfQogCiBzdGF0aWMgdm9pZCAKLW1wYzUyeHhfdWFydF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KQorbXBjNTJ4eF91YXJ0X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJLyogcG9ydC0+bG9jayB0YWtlbiBieSBjYWxsZXIgKi8KIAlwb3J0LT5yZWFkX3N0YXR1c19tYXNrIHw9IE1QQzUyeHhfUFNDX0lNUl9UWFJEWTsKQEAgLTQ4NSw3ICs0ODUsNyBAQAogCiAJLyogTm90aGluZyB0byBkbyA/ICovCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQocG9ydCkpIHsKLQkJbXBjNTJ4eF91YXJ0X3N0b3BfdHgocG9ydCwwKTsKKwkJbXBjNTJ4eF91YXJ0X3N0b3BfdHgocG9ydCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNTA0LDcgKzUwNCw3IEBACiAKIAkvKiBNYXliZSB3ZSdyZSBkb25lIGFmdGVyIGFsbCAqLwogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpIHsKLQkJbXBjNTJ4eF91YXJ0X3N0b3BfdHgocG9ydCwwKTsKKwkJbXBjNTJ4eF91YXJ0X3N0b3BfdHgocG9ydCk7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbXBzYy5jIGIvZHJpdmVycy9zZXJpYWwvbXBzYy5jCmluZGV4IGU0MzI3NmMuLmVmZTc5YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL21wc2MuYworKysgYi9kcml2ZXJzL3NlcmlhbC9tcHNjLmMKQEAgLTEwNzIsMTggKzEwNzIsMTggQEAKIH0KIAogc3RhdGljIHZvaWQKLW1wc2Nfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1aW50IHR0eV9zdGFydCkKK21wc2Nfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBtcHNjX3BvcnRfaW5mbyAqcGkgPSAoc3RydWN0IG1wc2NfcG9ydF9pbmZvICopcG9ydDsKIAotCXByX2RlYnVnKCJtcHNjX3N0b3BfdHhbJWRdOiB0dHlfc3RhcnQ6ICVkXG4iLCBwb3J0LT5saW5lLCB0dHlfc3RhcnQpOworCXByX2RlYnVnKCJtcHNjX3N0b3BfdHhbJWRdXG4iLCBwb3J0LT5saW5lKTsKIAogCW1wc2NfZnJlZXplKHBpKTsKIAlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkCi1tcHNjX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVpbnQgdHR5X3N0YXJ0KQorbXBzY19zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBtcHNjX3BvcnRfaW5mbyAqcGkgPSAoc3RydWN0IG1wc2NfcG9ydF9pbmZvICopcG9ydDsKIApAQCAtMTA5MSw3ICsxMDkxLDcgQEAKIAltcHNjX2NvcHlfdHhfZGF0YShwaSk7CiAJbXBzY19zZG1hX3N0YXJ0X3R4KHBpKTsKIAotCXByX2RlYnVnKCJtcHNjX3N0YXJ0X3R4WyVkXTogdHR5X3N0YXJ0OiAlZFxuIiwgcG9ydC0+bGluZSwgdHR5X3N0YXJ0KTsKKwlwcl9kZWJ1ZygibXBzY19zdGFydF90eFslZF1cbiIsIHBvcnQtPmxpbmUpOwogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbXV4LmMgYi9kcml2ZXJzL3NlcmlhbC9tdXguYwppbmRleCBkYWRkN2UxLi4xODkwNjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9tdXguYworKysgYi9kcml2ZXJzL3NlcmlhbC9tdXguYwpAQCAtMTExLDIyICsxMTEsMjAgQEAKIC8qKgogICogbXV4X3N0b3BfdHggLSBTdG9wIHRyYW5zbWl0dGluZyBjaGFyYWN0ZXJzLgogICogQHBvcnQ6IFB0ciB0byB0aGUgdWFydF9wb3J0LgotICogQHR0eV9zdG9wOiB0dHkgbGF5ZXIgaXNzdWUgdGhpcyBjb21tYW5kPwogICoKICAqIFRoZSBTZXJpYWwgTVVYIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbi4KICAqLwotc3RhdGljIHZvaWQgbXV4X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgbXV4X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIH0KIAogLyoqCiAgKiBtdXhfc3RhcnRfdHggLSBTdGFydCB0cmFuc21pdHRpbmcgY2hhcmFjdGVycy4KICAqIEBwb3J0OiBQdHIgdG8gdGhlIHVhcnRfcG9ydC4KLSAqIEB0dHlfc3RhcnQ6IHR0eSBsYXllciBpc3N1ZSB0aGlzIGNvbW1hbmQ/CiAgKgogICogVGhlIFNlcmlhbCBNdXggZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgdm9pZCBtdXhfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdGFydCkKK3N0YXRpYyB2b2lkIG11eF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogfQogCkBAIC0xODEsNyArMTc5LDcgQEAKIAl9CiAKIAlpZih1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKHBvcnQpKSB7Ci0JCW11eF9zdG9wX3R4KHBvcnQsIDApOworCQltdXhfc3RvcF90eChwb3J0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjAyLDcgKzIwMCw3IEBACiAJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOwogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKLQkJbXV4X3N0b3BfdHgocG9ydCwgMCk7CisJCW11eF9zdG9wX3R4KHBvcnQpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYyBiL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYwppbmRleCA3ZGIyZjM3Li41ZGRkOGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvcG1hY196aWxvZy5jCkBAIC02MzAsMTEgKzYzMCwxMCBAQAogCiAvKiAKICAqIFN0b3AgVFggc2lkZS4gRGVhbHQgbGlrZSBzdW56aWxvZyBhdCBuZXh0IFR4IGludGVycnVwdCwKLSAqIHRob3VnaCBmb3IgRE1BLCB3ZSB3aWxsIGhhdmUgdG8gZG8gYSBiaXQgbW9yZS4gV2hhdCBpcwotICogdGhlIG1lYW5pbmcgb2YgdGhlIHR0eV9zdG9wIGJpdCA/IFhYWAorICogdGhvdWdoIGZvciBETUEsIHdlIHdpbGwgaGF2ZSB0byBkbyBhIGJpdCBtb3JlLgogICogVGhlIHBvcnQgbG9jayBpcyBoZWxkIGFuZCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4KICAqLwotc3RhdGljIHZvaWQgcG16X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgcG16X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAl0b19wbXoocG9ydCktPmZsYWdzIHw9IFBNQUNaSUxPR19GTEFHX1RYX1NUT1BQRUQ7CiB9CkBAIC02NDMsNyArNjQyLDcgQEAKICAqIEtpY2sgdGhlIFR4IHNpZGUuCiAgKiBUaGUgcG9ydCBsb2NrIGlzIGhlbGQgYW5kIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgogICovCi1zdGF0aWMgdm9pZCBwbXpfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdGFydCkKK3N0YXRpYyB2b2lkIHBtel9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0X3BtYWNfcG9ydCAqdWFwID0gdG9fcG16KHBvcnQpOwogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwpAQCAtMTYwMSw3ICsxNjAwLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHBtX3N0YXRlID09IG1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSB8fCBwbV9zdGF0ZSA8IDIpCisJaWYgKHBtX3N0YXRlLmV2ZW50ID09IG1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkKIAkJcmV0dXJuIDA7CiAKIAlwbXpfZGVidWcoInN1c3BlbmQsIHN3aXRjaGluZyB0byBzdGF0ZSAlZFxuIiwgcG1fc3RhdGUpOwpAQCAtMTY2MSw3ICsxNjYwLDcgQEAKIAlpZiAodWFwID09IE5VTEwpCiAJCXJldHVybiAwOwogCi0JaWYgKG1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9PSAwKQorCWlmIChtZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pCiAJCXJldHVybiAwOwogCQogCXBtel9kZWJ1ZygicmVzdW1lLCBzd2l0Y2hpbmcgdG8gc3RhdGUgMFxuIik7CkBAIC0xNzE0LDcgKzE3MTMsNyBAQAogCiAJcG16X2RlYnVnKCJyZXN1bWUsIHN3aXRjaGluZyBjb21wbGV0ZVxuIik7CiAKLQltZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSAwOworCW1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9IFBNX0VWRU5UX09OOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9weGEuYyBiL2RyaXZlcnMvc2VyaWFsL3B4YS5jCmluZGV4IDQ2MWM4MWMuLmVhYTBhZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3B4YS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3B4YS5jCkBAIC04MCw3ICs4MCw3IEBACiAJc2VyaWFsX291dCh1cCwgVUFSVF9JRVIsIHVwLT5pZXIpOwogfQogCi1zdGF0aWMgdm9pZCBzZXJpYWxfcHhhX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgc2VyaWFsX3B4YV9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVhcnRfcHhhX3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3B4YV9wb3J0ICopcG9ydDsKIApAQCAtMTg1LDcgKzE4NSw3IEBACiAJCXJldHVybjsKIAl9CiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQoJnVwLT5wb3J0KSkgewotCQlzZXJpYWxfcHhhX3N0b3BfdHgoJnVwLT5wb3J0LCAwKTsKKwkJc2VyaWFsX3B4YV9zdG9wX3R4KCZ1cC0+cG9ydCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIwMywxMCArMjAzLDEwIEBACiAKIAogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCi0JCXNlcmlhbF9weGFfc3RvcF90eCgmdXAtPnBvcnQsIDApOworCQlzZXJpYWxfcHhhX3N0b3BfdHgoJnVwLT5wb3J0KTsKIH0KIAotc3RhdGljIHZvaWQgc2VyaWFsX3B4YV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KQorc3RhdGljIHZvaWQgc2VyaWFsX3B4YV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0X3B4YV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF9weGFfcG9ydCAqKXBvcnQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3MzYzI0MTAuYyBiL2RyaXZlcnMvc2VyaWFsL3MzYzI0MTAuYwppbmRleCA3MzY1ZDRiLi5jMzYxYzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zM2MyNDEwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jCkBAIC0yNDYsOCArMjQ2LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkCi1zM2MyNHh4X3NlcmlhbF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RvcCkKK3N0YXRpYyB2b2lkIHMzYzI0eHhfc2VyaWFsX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlpZiAodHhfZW5hYmxlZChwb3J0KSkgewogCQlkaXNhYmxlX2lycShUWF9JUlEocG9ydCkpOwpAQCAtMjU3LDggKzI1Niw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAotczNjMjR4eF9zZXJpYWxfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdGFydCkKK3N0YXRpYyB2b2lkIHMzYzI0eHhfc2VyaWFsX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJaWYgKCF0eF9lbmFibGVkKHBvcnQpKSB7CiAJCWlmIChwb3J0LT5mbGFncyAmIFVQRl9DT05TX0ZMT1cpCkBAIC00MjQsNyArNDIyLDcgQEAKIAkqLwogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQocG9ydCkpIHsKLQkJczNjMjR4eF9zZXJpYWxfc3RvcF90eChwb3J0LCAwKTsKKwkJczNjMjR4eF9zZXJpYWxfc3RvcF90eChwb3J0KTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC00NDMsNyArNDQxLDcgQEAKIAkJdWFydF93cml0ZV93YWtldXAocG9ydCk7CiAKIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQotCQlzM2MyNHh4X3NlcmlhbF9zdG9wX3R4KHBvcnQsIDApOworCQlzM2MyNHh4X3NlcmlhbF9zdG9wX3R4KHBvcnQpOwogCiAgb3V0OgogCXJldHVybiBJUlFfSEFORExFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NhMTEwMC5jIGIvZHJpdmVycy9zZXJpYWwvc2ExMTAwLmMKaW5kZXggOTg2NDFjMy4uMTIyNWIxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2ExMTAwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2ExMTAwLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogLyoKICAqIGludGVycnVwdHMgZGlzYWJsZWQgb24gZW50cnkKICAqLwotc3RhdGljIHZvaWQgc2ExMTAwX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgc2ExMTAwX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3Qgc2ExMTAwX3BvcnQgKnNwb3J0ID0gKHN0cnVjdCBzYTExMDBfcG9ydCAqKXBvcnQ7CiAJdTMyIHV0Y3IzOwpAQCAtMTU4LDcgKzE1OCw3IEBACiAvKgogICogaW50ZXJydXB0cyBtYXkgbm90IGJlIGRpc2FibGVkIG9uIGVudHJ5CiAgKi8KLXN0YXRpYyB2b2lkIHNhMTEwMF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KQorc3RhdGljIHZvaWQgc2ExMTAwX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHNhMTEwMF9wb3J0ICpzcG9ydCA9IChzdHJ1Y3Qgc2ExMTAwX3BvcnQgKilwb3J0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNjQsNyArMjY0LDcgQEAKIAlzYTExMDBfbWN0cmxfY2hlY2soc3BvcnQpOwogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQoJnNwb3J0LT5wb3J0KSkgewotCQlzYTExMDBfc3RvcF90eCgmc3BvcnQtPnBvcnQsIDApOworCQlzYTExMDBfc3RvcF90eCgmc3BvcnQtPnBvcnQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yODQsNyArMjg0LDcgQEAKIAkJdWFydF93cml0ZV93YWtldXAoJnNwb3J0LT5wb3J0KTsKIAogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCi0JCXNhMTEwMF9zdG9wX3R4KCZzcG9ydC0+cG9ydCwgMCk7CisJCXNhMTEwMF9zdG9wX3R4KCZzcG9ydC0+cG9ydCk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzYTExMDBfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYwppbmRleCA1NDY5OWMzLi4yZDg2MjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlwb3J0LT5vcHMtPnN0b3BfdHgocG9ydCwgMSk7CisJcG9ydC0+b3BzLT5zdG9wX3R4KHBvcnQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtOTEsNyArOTEsNyBAQAogCiAJaWYgKCF1YXJ0X2NpcmNfZW1wdHkoJnN0YXRlLT5pbmZvLT54bWl0KSAmJiBzdGF0ZS0+aW5mby0+eG1pdC5idWYgJiYKIAkgICAgIXR0eS0+c3RvcHBlZCAmJiAhdHR5LT5od19zdG9wcGVkKQotCQlwb3J0LT5vcHMtPnN0YXJ0X3R4KHBvcnQsIDEpOworCQlwb3J0LT5vcHMtPnN0YXJ0X3R4KHBvcnQpOwogfQogCiBzdGF0aWMgdm9pZCB1YXJ0X3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCkBAIC01NDIsNyArNTQyLDcgQEAKIAkJcG9ydC0+eF9jaGFyID0gY2g7CiAJCWlmIChjaCkgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCXBvcnQtPm9wcy0+c3RhcnRfdHgocG9ydCwgMCk7CisJCQlwb3J0LT5vcHMtPnN0YXJ0X3R4KHBvcnQpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCQl9CiAJfQpAQCAtMTE0Niw3ICsxMTQ2LDcgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5wb3J0LT5sb2NrLCBmbGFncyk7CiAJCWlmICghKHN0YXRlLT5wb3J0LT5vcHMtPmdldF9tY3RybChzdGF0ZS0+cG9ydCkgJiBUSU9DTV9DVFMpKSB7CiAJCQl0dHktPmh3X3N0b3BwZWQgPSAxOwotCQkJc3RhdGUtPnBvcnQtPm9wcy0+c3RvcF90eChzdGF0ZS0+cG9ydCwgMCk7CisJCQlzdGF0ZS0+cG9ydC0+b3BzLT5zdG9wX3R4KHN0YXRlLT5wb3J0KTsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+cG9ydC0+bG9jaywgZmxhZ3MpOwogCX0KQEAgLTE4NjksNyArMTg2OSw3IEBACiAJCXN0cnVjdCB1YXJ0X29wcyAqb3BzID0gcG9ydC0+b3BzOwogCiAJCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOwotCQlvcHMtPnN0b3BfdHgocG9ydCwgMCk7CisJCW9wcy0+c3RvcF90eChwb3J0KTsKIAkJb3BzLT5zZXRfbWN0cmwocG9ydCwgMCk7CiAJCW9wcy0+c3RvcF9yeChwb3J0KTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKQEAgLTE5MzUsNyArMTkzNSw3IEBACiAJCXVhcnRfY2hhbmdlX3NwZWVkKHN0YXRlLCBOVUxMKTsKIAkJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7CiAJCW9wcy0+c2V0X21jdHJsKHBvcnQsIHBvcnQtPm1jdHJsKTsKLQkJb3BzLT5zdGFydF90eChwb3J0LCAwKTsKKwkJb3BzLT5zdGFydF90eChwb3J0KTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKIAl9CiAKQEAgLTE5NDcsMjEgKzE5NDcsMjkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogdWFydF9yZXBvcnRfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlwcmludGsoIiVzJWQiLCBkcnYtPmRldl9uYW1lLCBwb3J0LT5saW5lKTsKLQlwcmludGsoIiBhdCAiKTsKKwljaGFyIGFkZHJlc3NbNjRdOworCiAJc3dpdGNoIChwb3J0LT5pb3R5cGUpIHsKIAljYXNlIFVQSU9fUE9SVDoKLQkJcHJpbnRrKCJJL08gMHgleCIsIHBvcnQtPmlvYmFzZSk7CisJCXNucHJpbnRmKGFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSwKKwkJCSAiSS9PIDB4JXgiLCBwb3J0LT5pb2Jhc2UpOwogCQlicmVhazsKIAljYXNlIFVQSU9fSFVCNjoKLQkJcHJpbnRrKCJJL08gMHgleCBvZmZzZXQgMHgleCIsIHBvcnQtPmlvYmFzZSwgcG9ydC0+aHViNik7CisJCXNucHJpbnRmKGFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSwKKwkJCSAiSS9PIDB4JXggb2Zmc2V0IDB4JXgiLCBwb3J0LT5pb2Jhc2UsIHBvcnQtPmh1YjYpOwogCQlicmVhazsKIAljYXNlIFVQSU9fTUVNOgogCWNhc2UgVVBJT19NRU0zMjoKLQkJcHJpbnRrKCJNTUlPIDB4JWx4IiwgcG9ydC0+bWFwYmFzZSk7CisJCXNucHJpbnRmKGFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSwKKwkJCSAiTU1JTyAweCVseCIsIHBvcnQtPm1hcGJhc2UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdHJsY3B5KGFkZHJlc3MsICIqdW5rbm93bioiLCBzaXplb2YoYWRkcmVzcykpOwogCQlicmVhazsKIAl9Ci0JcHJpbnRrKCIgKGlycSA9ICVkKSBpcyBhICVzXG4iLCBwb3J0LT5pcnEsIHVhcnRfdHlwZShwb3J0KSk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlcyVkIGF0ICVzIChpcnEgPSAlZCkgaXMgYSAlc1xuIiwKKwkgICAgICAgZHJ2LT5kZXZfbmFtZSwgcG9ydC0+bGluZSwgYWRkcmVzcywgcG9ydC0+aXJxLCB1YXJ0X3R5cGUocG9ydCkpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjI4OSwxNDMgKzIyOTcsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0wodWFydF9tYXRjaF9wb3J0KTsKIAotLyoKLSAqCVRyeSB0byBmaW5kIGFuIHVudXNlZCB1YXJ0X3N0YXRlIHNsb3QgZm9yIGEgcG9ydC4KLSAqLwotc3RhdGljIHN0cnVjdCB1YXJ0X3N0YXRlICoKLXVhcnRfZmluZF9tYXRjaF9vcl91bnVzZWQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIEZpcnN0LCBmaW5kIGEgcG9ydCBlbnRyeSB3aGljaCBtYXRjaGVzLiAgTm90ZTogaWYgd2UgZG8KLQkgKiBmaW5kIGEgbWF0Y2hpbmcgZW50cnksIGFuZCBpdCBoYXMgYSBub24temVybyB1c2UgY291bnQsCi0JICogdGhlbiB3ZSBjYW4ndCByZWdpc3RlciB0aGUgcG9ydC4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZHJ2LT5ucjsgaSsrKQotCQlpZiAodWFydF9tYXRjaF9wb3J0KGRydi0+c3RhdGVbaV0ucG9ydCwgcG9ydCkpCi0JCQlyZXR1cm4gJmRydi0+c3RhdGVbaV07Ci0KLQkvKgotCSAqIFdlIGRpZG4ndCBmaW5kIGEgbWF0Y2hpbmcgZW50cnksIHNvIGxvb2sgZm9yIHRoZSBmaXJzdAotCSAqIGZyZWUgZW50cnkuICBXZSBsb29rIGZvciBvbmUgd2hpY2ggaGFzbid0IGJlZW4gcHJldmlvdXNseQotCSAqIHVzZWQgKGluZGljYXRlZCBieSB6ZXJvIGlvYmFzZSkuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGRydi0+bnI7IGkrKykKLQkJaWYgKGRydi0+c3RhdGVbaV0ucG9ydC0+dHlwZSA9PSBQT1JUX1VOS05PV04gJiYKLQkJICAgIGRydi0+c3RhdGVbaV0ucG9ydC0+aW9iYXNlID09IDAgJiYKLQkJICAgIGRydi0+c3RhdGVbaV0uY291bnQgPT0gMCkKLQkJCXJldHVybiAmZHJ2LT5zdGF0ZVtpXTsKLQotCS8qCi0JICogVGhhdCBhbHNvIGZhaWxlZC4gIExhc3QgcmVzb3J0IGlzIHRvIGZpbmQgYW55IGN1cnJlbnRseQotCSAqIGVudHJ5IHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIHJlYWwgcG9ydCBhc3NvY2lhdGVkIHdpdGggaXQuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGRydi0+bnI7IGkrKykKLQkJaWYgKGRydi0+c3RhdGVbaV0ucG9ydC0+dHlwZSA9PSBQT1JUX1VOS05PV04gJiYKLQkJICAgIGRydi0+c3RhdGVbaV0uY291bnQgPT0gMCkKLQkJCXJldHVybiAmZHJ2LT5zdGF0ZVtpXTsKLQotCXJldHVybiBOVUxMOwotfQotCi0vKioKLSAqCXVhcnRfcmVnaXN0ZXJfcG9ydDogcmVnaXN0ZXIgdWFydCBzZXR0aW5ncyB3aXRoIGEgcG9ydAotICoJQGRydjogcG9pbnRlciB0byB0aGUgdWFydCBsb3cgbGV2ZWwgZHJpdmVyIHN0cnVjdHVyZSBmb3IgdGhpcyBwb3J0Ci0gKglAcG9ydDogdWFydCBwb3J0IHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBwb3J0Ci0gKgotICoJUmVnaXN0ZXIgVUFSVCBzZXR0aW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgbG93IGxldmVsIGRyaXZlci4gIERldGVjdAotICoJdGhlIHR5cGUgb2YgdGhlIHBvcnQgaWYgVVBGX0JPT1RfQVVUT0NPTkYgaXMgc2V0LCBhbmQgZGV0ZWN0IHRoZQotICoJSVJRIGlmIFVQRl9BVVRPX0lSUSBpcyBzZXQuCi0gKgotICoJV2UgdHJ5IHRvIHBpY2sgdGhlIHNhbWUgcG9ydCBmb3IgdGhlIHNhbWUgSU8gYmFzZSBhZGRyZXNzLCBzbyB0aGF0Ci0gKgl3aGVuIGEgbW9kZW0gaXMgcGx1Z2dlZCBpbiwgdW5wbHVnZ2VkIGFuZCBwbHVnZ2VkIGJhY2sgaW4sIGl0IGdldHMKLSAqCWFsbG9jYXRlZCB0aGUgc2FtZSBwb3J0LgotICoKLSAqCVJldHVybnMgbmVnYXRpdmUgZXJyb3IsIG9yIHBvc2l0aXZlIGxpbmUgbnVtYmVyLgotICovCi1pbnQgdWFydF9yZWdpc3Rlcl9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCB1YXJ0X3N0YXRlICpzdGF0ZTsKLQlpbnQgcmV0OwotCi0JZG93bigmcG9ydF9zZW0pOwotCi0Jc3RhdGUgPSB1YXJ0X2ZpbmRfbWF0Y2hfb3JfdW51c2VkKGRydiwgcG9ydCk7Ci0KLQlpZiAoc3RhdGUpIHsKLQkJLyoKLQkJICogT2ssIHdlJ3ZlIGZvdW5kIGEgbGluZSB0aGF0IHdlIGNhbiB1c2UuCi0JCSAqCi0JCSAqIElmIHdlIGZpbmQgYSBwb3J0IHRoYXQgbWF0Y2hlcyB0aGlzIG9uZSwgYW5kIGl0IGFwcGVhcnMKLQkJICogdG8gYmUgaW4tdXNlIChldmVuIGlmIGl0IGRvZXNuJ3QgaGF2ZSBhIHR5cGUpIHdlIHNob3VsZG4ndAotCQkgKiBhbHRlciBpdCB1bmRlcm5lYXRoIGl0c2VsZiAtIHRoZSBwb3J0IG1heSBiZSBvcGVuIGFuZAotCQkgKiB0cnlpbmcgdG8gZG8gdXNlZnVsIHdvcmsuCi0JCSAqLwotCQlpZiAodWFydF91c2VycyhzdGF0ZSkgIT0gMCkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiB0aGUgcG9ydCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkLCBkb24ndCB0b3VjaCBpdC4KLQkJICovCi0JCWlmIChzdGF0ZS0+cG9ydC0+dHlwZSA9PSBQT1JUX1VOS05PV04pIHsKLQkJCXN0YXRlLT5wb3J0LT5pb2Jhc2UgICA9IHBvcnQtPmlvYmFzZTsKLQkJCXN0YXRlLT5wb3J0LT5tZW1iYXNlICA9IHBvcnQtPm1lbWJhc2U7Ci0JCQlzdGF0ZS0+cG9ydC0+aXJxICAgICAgPSBwb3J0LT5pcnE7Ci0JCQlzdGF0ZS0+cG9ydC0+dWFydGNsayAgPSBwb3J0LT51YXJ0Y2xrOwotCQkJc3RhdGUtPnBvcnQtPmZpZm9zaXplID0gcG9ydC0+Zmlmb3NpemU7Ci0JCQlzdGF0ZS0+cG9ydC0+cmVnc2hpZnQgPSBwb3J0LT5yZWdzaGlmdDsKLQkJCXN0YXRlLT5wb3J0LT5pb3R5cGUgICA9IHBvcnQtPmlvdHlwZTsKLQkJCXN0YXRlLT5wb3J0LT5mbGFncyAgICA9IHBvcnQtPmZsYWdzOwotCQkJc3RhdGUtPnBvcnQtPmxpbmUgICAgID0gc3RhdGUgLSBkcnYtPnN0YXRlOwotCQkJc3RhdGUtPnBvcnQtPm1hcGJhc2UgID0gcG9ydC0+bWFwYmFzZTsKLQotCQkJdWFydF9jb25maWd1cmVfcG9ydChkcnYsIHN0YXRlLCBzdGF0ZS0+cG9ydCk7Ci0JCX0KLQotCQlyZXQgPSBzdGF0ZS0+cG9ydC0+bGluZTsKLQl9IGVsc2UKLQkJcmV0ID0gLUVOT1NQQzsKLSBvdXQ6Ci0JdXAoJnBvcnRfc2VtKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqCXVhcnRfdW5yZWdpc3Rlcl9wb3J0IC0gZGUtYWxsb2NhdGUgYSBwb3J0Ci0gKglAZHJ2OiBwb2ludGVyIHRvIHRoZSB1YXJ0IGxvdyBsZXZlbCBkcml2ZXIgc3RydWN0dXJlIGZvciB0aGlzIHBvcnQKLSAqCUBsaW5lOiBsaW5lIGluZGV4IHByZXZpb3VzbHkgcmV0dXJuZWQgZnJvbSB1YXJ0X3JlZ2lzdGVyX3BvcnQoKQotICoKLSAqCUhhbmcgdXAgdGhlIHNwZWNpZmllZCBsaW5lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG93IGxldmVsIGRyaXZlciwKLSAqCWFuZCBtYXJrIHRoZSBwb3J0IGFzIHVudXNlZC4KLSAqLwotdm9pZCB1YXJ0X3VucmVnaXN0ZXJfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgaW50IGxpbmUpCi17Ci0Jc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlOwotCi0JaWYgKGxpbmUgPCAwIHx8IGxpbmUgPj0gZHJ2LT5ucikgewotCQlwcmludGsoS0VSTl9FUlIgIkF0dGVtcHQgdG8gdW5yZWdpc3RlciAiKTsKLQkJcHJpbnRrKCIlcyVkIiwgZHJ2LT5kZXZfbmFtZSwgbGluZSk7Ci0JCXByaW50aygiXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXN0YXRlID0gZHJ2LT5zdGF0ZSArIGxpbmU7Ci0KLQlkb3duKCZwb3J0X3NlbSk7Ci0JdWFydF91bmNvbmZpZ3VyZV9wb3J0KGRydiwgc3RhdGUpOwotCXVwKCZwb3J0X3NlbSk7Ci19Ci0KIEVYUE9SVF9TWU1CT0wodWFydF93cml0ZV93YWtldXApOwogRVhQT1JUX1NZTUJPTCh1YXJ0X3JlZ2lzdGVyX2RyaXZlcik7CiBFWFBPUlRfU1lNQk9MKHVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIpOwogRVhQT1JUX1NZTUJPTCh1YXJ0X3N1c3BlbmRfcG9ydCk7CiBFWFBPUlRfU1lNQk9MKHVhcnRfcmVzdW1lX3BvcnQpOwotRVhQT1JUX1NZTUJPTCh1YXJ0X3JlZ2lzdGVyX3BvcnQpOwotRVhQT1JUX1NZTUJPTCh1YXJ0X3VucmVnaXN0ZXJfcG9ydCk7CiBFWFBPUlRfU1lNQk9MKHVhcnRfYWRkX29uZV9wb3J0KTsKIEVYUE9SVF9TWU1CT0wodWFydF9yZW1vdmVfb25lX3BvcnQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfbGg3YTQweC5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2xoN2E0MHguYwppbmRleCA1NmYyNjliLi44MzAyMzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfbGg3YTQweC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9saDdhNDB4LmMKQEAgLTExMiwxMyArMTEyLDEyIEBACiAJdW5zaWduZWQgaW50IHN0YXR1c1ByZXY7IC8qIE1vc3QgcmVjZW50bHkgcmVhZCBtb2RlbSBzdGF0dXMgKi8KIH07CiAKLXN0YXRpYyB2b2lkIGxoN2E0MHh1YXJ0X3N0b3BfdHggKHN0cnVjdCB1YXJ0X3BvcnQqIHBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RvcCkKK3N0YXRpYyB2b2lkIGxoN2E0MHh1YXJ0X3N0b3BfdHggKHN0cnVjdCB1YXJ0X3BvcnQqIHBvcnQpCiB7CiAJQklUX0NMUiAocG9ydCwgVUFSVF9SX0lOVEVOLCBUeEludCk7CiB9CiAKLXN0YXRpYyB2b2lkIGxoN2E0MHh1YXJ0X3N0YXJ0X3R4IChzdHJ1Y3QgdWFydF9wb3J0KiBwb3J0LAotCQkJCSAgdW5zaWduZWQgaW50IHR0eV9zdGFydCkKK3N0YXRpYyB2b2lkIGxoN2E0MHh1YXJ0X3N0YXJ0X3R4IChzdHJ1Y3QgdWFydF9wb3J0KiBwb3J0KQogewogCUJJVF9TRVQgKHBvcnQsIFVBUlRfUl9JTlRFTiwgVHhJbnQpOwogCkBAIC0yMDgsNyArMjA3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAodWFydF9jaXJjX2VtcHR5ICh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQgKHBvcnQpKSB7Ci0JCWxoN2E0MHh1YXJ0X3N0b3BfdHggKHBvcnQsIDApOworCQlsaDdhNDB4dWFydF9zdG9wX3R4IChwb3J0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjMwLDcgKzIyOSw3IEBACiAJCXVhcnRfd3JpdGVfd2FrZXVwIChwb3J0KTsKIAogCWlmICh1YXJ0X2NpcmNfZW1wdHkgKHhtaXQpKQotCQlsaDdhNDB4dWFydF9zdG9wX3R4IChwb3J0LCAwKTsKKwkJbGg3YTQweHVhcnRfc3RvcF90eCAocG9ydCk7CiB9CiAKIHN0YXRpYyB2b2lkIGxoN2E0MHh1YXJ0X21vZGVtX3N0YXR1cyAoc3RydWN0IHVhcnRfcG9ydCogcG9ydCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF90eHg5LmMgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jCmluZGV4IGQwODUwMzAuLmYxMGM4NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF90eHg5LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX3R4eDkuYwpAQCAtMzEsNiArMzEsOCBAQAogICoJMS4wMQlTZXQgZmlmb3NpemUgdG8gbWFrZSB0eF9lbXByeSBjYWxsZWQgcHJvcGVybHkuCiAgKgkJVXNlIHN0YW5kYXJkIHVhcnRfZ2V0X2Rpdmlzb3IuCiAgKgkxLjAyCUNsZWFudXAuIChpbXBvcnQgODI1MC5jIGNoYW5nZXMpCisgKgkxLjAzCUZpeCBsb3ctbGF0ZW5jeSBtb2RlLiAoaW1wb3J0IDgyNTAuYyBjaGFuZ2VzKQorICoJMS4wNAlSZW1vdmUgdXNhZ2Ugb2YgZGVwcmVjYXRlZCBmdW5jdGlvbnMsIGNsZWFudXAuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIApAQCAtNTQsNyArNTYsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAotc3RhdGljIGNoYXIgKnNlcmlhbF92ZXJzaW9uID0gIjEuMDIiOworc3RhdGljIGNoYXIgKnNlcmlhbF92ZXJzaW9uID0gIjEuMDQiOwogc3RhdGljIGNoYXIgKnNlcmlhbF9uYW1lID0gIlRYMzkvNDkgU2VyaWFsIGRyaXZlciI7CiAKICNkZWZpbmUgUEFTU19MSU1JVAkyNTYKQEAgLTg2LDkgKzg4LDkgQEAKICAqLwogI2lmZGVmIEVOQUJMRV9TRVJJQUxfVFhYOV9QQ0kKICNkZWZpbmUgTlJfUENJX0JPQVJEUwk0Ci0jZGVmaW5lIFVBUlRfTlIgICgyICsgTlJfUENJX0JPQVJEUykKKyNkZWZpbmUgVUFSVF9OUiAgKDQgKyBOUl9QQ0lfQk9BUkRTKQogI2Vsc2UKLSNkZWZpbmUgVUFSVF9OUiAgMgorI2RlZmluZSBVQVJUX05SICA0CiAjZW5kaWYKIAogc3RydWN0IHVhcnRfdHh4OV9wb3J0IHsKQEAgLTI1Myw3ICsyNTUsNyBAQAogCQlzaW9fb3V0KHVwLCBUWFg5X1NJQkdSLCAweGZmIHwgVFhYOV9TSUJHUl9CQ0xLX1Q2KTsKIH0KIAotc3RhdGljIHZvaWQgc2VyaWFsX3R4eDlfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0b3ApCitzdGF0aWMgdm9pZCBzZXJpYWxfdHh4OV9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKilwb3J0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNjMsNyArMjY1LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHNlcmlhbF90eHg5X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RhcnQpCitzdGF0aWMgdm9pZCBzZXJpYWxfdHh4OV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfdHh4OV9wb3J0ICopcG9ydDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzA0LDggKzMwNiwxMSBAQAogCQkvKiBUaGUgZm9sbG93aW5nIGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSB0dHkgbGF5ZXIgYW5kCiAJCSAgIHVuc2FmZS4gSXQgc2hvdWxkIGJlIGZpeGVkIEFTQVAgKi8KIAkJaWYgKHVubGlrZWx5KHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSkgewotCQkJaWYodHR5LT5sb3dfbGF0ZW5jeSkKKwkJCWlmICh0dHktPmxvd19sYXRlbmN5KSB7CisJCQkJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOwogCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJCQkJc3Bpbl9sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKwkJCX0KIAkJCS8qIElmIHRoaXMgZmFpbGVkIHRoZW4gd2Ugd2lsbCB0aHJvdyBhd2F5IHRoZQogCQkJICAgYnl0ZXMgYnV0IG11c3QgZG8gc28gdG8gY2xlYXIgaW50ZXJydXB0cyAqLwogCQl9CkBAIC0zNTYsNyArMzYxLDkgQEAKIAlpZ25vcmVfY2hhcjoKIAkJZGlzciA9IHNpb19pbih1cCwgVFhYOV9TSURJU1IpOwogCX0gd2hpbGUgKCEoZGlzciAmIFRYWDlfU0lESVNSX1VWQUxJRCkgJiYgKG1heF9jb3VudC0tID4gMCkpOworCXNwaW5fdW5sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKIAl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7CiAJKnN0YXR1cyA9IGRpc3I7CiB9CiAKQEAgLTM3Miw3ICszNzksNyBAQAogCQlyZXR1cm47CiAJfQogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKCZ1cC0+cG9ydCkpIHsKLQkJc2VyaWFsX3R4eDlfc3RvcF90eCgmdXAtPnBvcnQsIDApOworCQlzZXJpYWxfdHh4OV9zdG9wX3R4KCZ1cC0+cG9ydCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM4OSw3ICszOTYsNyBAQAogCQl1YXJ0X3dyaXRlX3dha2V1cCgmdXAtPnBvcnQpOwogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKLQkJc2VyaWFsX3R4eDlfc3RvcF90eCgmdXAtPnBvcnQsIDApOworCQlzZXJpYWxfdHh4OV9zdG9wX3R4KCZ1cC0+cG9ydCk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzZXJpYWxfdHh4OV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTY2NywxNyArNjc0LDggQEAKIAkgICAgICB1bnNpZ25lZCBpbnQgb2xkc3RhdGUpCiB7CiAJc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKilwb3J0OwotCWlmIChzdGF0ZSkgewotCQkvKiBzbGVlcCAqLwotCi0JCWlmICh1cC0+cG0pCi0JCQl1cC0+cG0ocG9ydCwgc3RhdGUsIG9sZHN0YXRlKTsKLQl9IGVsc2UgewotCQkvKiB3YWtlICovCi0KLQkJaWYgKHVwLT5wbSkKLQkJCXVwLT5wbShwb3J0LCBzdGF0ZSwgb2xkc3RhdGUpOwotCX0KKwlpZiAodXAtPnBtKQorCQl1cC0+cG0ocG9ydCwgc3RhdGUsIG9sZHN0YXRlKTsKIH0KIAogc3RhdGljIGludCBzZXJpYWxfdHh4OV9yZXF1ZXN0X3Jlc291cmNlKHN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXApCkBAIC05NzksMTQgKzk3Nyw2IEBACiB9CiBjb25zb2xlX2luaXRjYWxsKHNlcmlhbF90eHg5X2NvbnNvbGVfaW5pdCk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHNlcmlhbF90eHg5X2xhdGVfY29uc29sZV9pbml0KHZvaWQpCi17Ci0JaWYgKCEoc2VyaWFsX3R4eDlfY29uc29sZS5mbGFncyAmIENPTl9FTkFCTEVEKSkKLQkJcmVnaXN0ZXJfY29uc29sZSgmc2VyaWFsX3R4eDlfY29uc29sZSk7Ci0JcmV0dXJuIDA7Ci19Ci1sYXRlX2luaXRjYWxsKHNlcmlhbF90eHg5X2xhdGVfY29uc29sZV9pbml0KTsKLQogI2RlZmluZSBTRVJJQUxfVFhYOV9DT05TT0xFCSZzZXJpYWxfdHh4OV9jb25zb2xlCiAjZWxzZQogI2RlZmluZSBTRVJJQUxfVFhYOV9DT05TT0xFCU5VTEwKQEAgLTEwMzksNiArMTAyOSw3MyBAQAogCXVhcnRfcmVzdW1lX3BvcnQoJnNlcmlhbF90eHg5X3JlZywgJnNlcmlhbF90eHg5X3BvcnRzW2xpbmVdLnBvcnQpOwogfQogCitzdGF0aWMgREVDTEFSRV9NVVRFWChzZXJpYWxfdHh4OV9zZW0pOworCisvKioKKyAqCXNlcmlhbF90eHg5X3JlZ2lzdGVyX3BvcnQgLSByZWdpc3RlciBhIHNlcmlhbCBwb3J0CisgKglAcG9ydDogc2VyaWFsIHBvcnQgdGVtcGxhdGUKKyAqCisgKglDb25maWd1cmUgdGhlIHNlcmlhbCBwb3J0IHNwZWNpZmllZCBieSB0aGUgcmVxdWVzdC4KKyAqCisgKglUaGUgcG9ydCBpcyB0aGVuIHByb2JlZCBhbmQgaWYgbmVjZXNzYXJ5IHRoZSBJUlEgaXMgYXV0b2RldGVjdGVkCisgKglJZiB0aGlzIGZhaWxzIGFuIGVycm9yIGlzIHJldHVybmVkLgorICoKKyAqCU9uIHN1Y2Nlc3MgdGhlIHBvcnQgaXMgcmVhZHkgdG8gdXNlIGFuZCB0aGUgbGluZSBudW1iZXIgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHNlcmlhbF90eHg5X3JlZ2lzdGVyX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKnVhcnQ7CisJaW50IHJldCA9IC1FTk9TUEM7CisKKwlkb3duKCZzZXJpYWxfdHh4OV9zZW0pOworCWZvciAoaSA9IDA7IGkgPCBVQVJUX05SOyBpKyspIHsKKwkJdWFydCA9ICZzZXJpYWxfdHh4OV9wb3J0c1tpXTsKKwkJaWYgKHVhcnQtPnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04pCisJCQlicmVhazsKKwl9CisJaWYgKGkgPCBVQVJUX05SKSB7CisJCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZzZXJpYWxfdHh4OV9yZWcsICZ1YXJ0LT5wb3J0KTsKKwkJdWFydC0+cG9ydC5pb2Jhc2UgPSBwb3J0LT5pb2Jhc2U7CisJCXVhcnQtPnBvcnQubWVtYmFzZSA9IHBvcnQtPm1lbWJhc2U7CisJCXVhcnQtPnBvcnQuaXJxICAgICAgPSBwb3J0LT5pcnE7CisJCXVhcnQtPnBvcnQudWFydGNsayAgPSBwb3J0LT51YXJ0Y2xrOworCQl1YXJ0LT5wb3J0LmlvdHlwZSAgID0gcG9ydC0+aW90eXBlOworCQl1YXJ0LT5wb3J0LmZsYWdzICAgID0gcG9ydC0+ZmxhZ3MgfCBVUEZfQk9PVF9BVVRPQ09ORjsKKwkJdWFydC0+cG9ydC5tYXBiYXNlICA9IHBvcnQtPm1hcGJhc2U7CisJCWlmIChwb3J0LT5kZXYpCisJCQl1YXJ0LT5wb3J0LmRldiA9IHBvcnQtPmRldjsKKwkJcmV0ID0gdWFydF9hZGRfb25lX3BvcnQoJnNlcmlhbF90eHg5X3JlZywgJnVhcnQtPnBvcnQpOworCQlpZiAocmV0ID09IDApCisJCQlyZXQgPSB1YXJ0LT5wb3J0LmxpbmU7CisJfQorCXVwKCZzZXJpYWxfdHh4OV9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJc2VyaWFsX3R4eDlfdW5yZWdpc3Rlcl9wb3J0IC0gcmVtb3ZlIGEgdHh4OSBzZXJpYWwgcG9ydCBhdCBydW50aW1lCisgKglAbGluZTogc2VyaWFsIGxpbmUgbnVtYmVyCisgKgorICoJUmVtb3ZlIG9uZSBzZXJpYWwgcG9ydC4gIFRoaXMgbWF5IG5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQKKyAqCWNvbnRleHQuICBXZSBoYW5kIHRoZSBwb3J0IGJhY2sgdG8gdGhlIG91ciBjb250cm9sLgorICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc2VyaWFsX3R4eDlfdW5yZWdpc3Rlcl9wb3J0KGludCBsaW5lKQoreworCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdWFydCA9ICZzZXJpYWxfdHh4OV9wb3J0c1tsaW5lXTsKKworCWRvd24oJnNlcmlhbF90eHg5X3NlbSk7CisJdWFydF9yZW1vdmVfb25lX3BvcnQoJnNlcmlhbF90eHg5X3JlZywgJnVhcnQtPnBvcnQpOworCXVhcnQtPnBvcnQuZmxhZ3MgPSAwOworCXVhcnQtPnBvcnQudHlwZSA9IFBPUlRfVU5LTk9XTjsKKwl1YXJ0LT5wb3J0LmlvYmFzZSA9IDA7CisJdWFydC0+cG9ydC5tYXBiYXNlID0gMDsKKwl1YXJ0LT5wb3J0Lm1lbWJhc2UgPSAwOworCXVhcnQtPnBvcnQuZGV2ID0gTlVMTDsKKwl1YXJ0X2FkZF9vbmVfcG9ydCgmc2VyaWFsX3R4eDlfcmVnLCAmdWFydC0+cG9ydCk7CisJdXAoJnNlcmlhbF90eHg5X3NlbSk7Cit9CisKIC8qCiAgKiBQcm9iZSBvbmUgc2VyaWFsIGJvYXJkLiAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gcmh5bWUgbm9yIHJlYXNvbgogICogdG8gdGhlIGFycmFuZ2VtZW50IG9mIHNlcmlhbCBwb3J0cyBvbiBhIFBDSSBjYXJkLgpAQCAtMTA1NiwxMyArMTExMywxMyBAQAogCiAJbWVtc2V0KCZwb3J0LCAwLCBzaXplb2YocG9ydCkpOwogCXBvcnQub3BzID0gJnNlcmlhbF90eHg5X3BvcHM7Ci0JcG9ydC5mbGFncyB8PSBVUEZfQk9PVF9BVVRPQ09ORjsgLyogdWFydF9vcHMuY29uZmlnX3BvcnQgd2lsbCBiZSBjYWxsZWQgKi8KIAlwb3J0LmZsYWdzIHw9IFVQRl9UWFg5X0hBVkVfQ1RTX0xJTkU7CiAJcG9ydC51YXJ0Y2xrID0gNjY2NzAwMDA7CiAJcG9ydC5pcnEgPSBkZXYtPmlycTsKIAlwb3J0LmlvdHlwZSA9IFVQSU9fUE9SVDsKIAlwb3J0LmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDEpOwotCWxpbmUgPSB1YXJ0X3JlZ2lzdGVyX3BvcnQoJnNlcmlhbF90eHg5X3JlZywgJnBvcnQpOworCXBvcnQuZGV2ID0gJmRldi0+ZGV2OworCWxpbmUgPSBzZXJpYWxfdHh4OV9yZWdpc3Rlcl9wb3J0KCZwb3J0KTsKIAlpZiAobGluZSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ291bGRuJ3QgcmVnaXN0ZXIgc2VyaWFsIHBvcnQgJXM6ICVkXG4iLCBwY2lfbmFtZShkZXYpLCBsaW5lKTsKIAl9CkBAIC0xMDc4LDcgKzExMzUsNyBAQAogCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogCiAJaWYgKGxpbmUpIHsKLQkJdWFydF91bnJlZ2lzdGVyX3BvcnQoJnNlcmlhbF90eHg5X3JlZywgbGluZSk7CisJCXNlcmlhbF90eHg5X3VucmVnaXN0ZXJfcG9ydChsaW5lKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CiAJfQogfQpAQCAtMTA4OSw2ICsxMTQ2LDggQEAKIAogCWlmIChsaW5lKQogCQlzZXJpYWxfdHh4OV9zdXNwZW5kX3BvcnQobGluZSk7CisJcGNpX3NhdmVfc3RhdGUoZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgcGNpX2Nob29zZV9zdGF0ZShkZXYsIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwOTYsOCArMTE1NSwxMyBAQAogewogCWludCBsaW5lID0gKGludCkobG9uZylwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmIChsaW5lKQorCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CisKKwlpZiAobGluZSkgeworCQlwY2lfZW5hYmxlX2RldmljZShkZXYpOwogCQlzZXJpYWxfdHh4OV9yZXN1bWVfcG9ydChsaW5lKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5jIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKaW5kZXggYWQ1Yjc3Ni4uNTEyMjY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKQEAgLTc5LDggKzc5LDggQEAKICNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFICovCiAKIC8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB2b2lkIHNjaV9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RvcCk7Ci1zdGF0aWMgdm9pZCBzY2lfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdGFydCk7CitzdGF0aWMgdm9pZCBzY2lfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIHNjaV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKIHN0YXRpYyB2b2lkIHNjaV9zdGFydF9yeChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KTsKIHN0YXRpYyB2b2lkIHNjaV9zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwogc3RhdGljIGludCBzY2lfcmVxdWVzdF9pcnEoc3RydWN0IHNjaV9wb3J0ICpwb3J0KTsKQEAgLTQ1NSw3ICs0NTUsNyBAQAogCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKIAkJdWFydF93cml0ZV93YWtldXAocG9ydCk7CiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkgewotCQlzY2lfc3RvcF90eChwb3J0LCAwKTsKKwkJc2NpX3N0b3BfdHgocG9ydCk7CiAJfSBlbHNlIHsKIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQljdHJsID0gc2NpX2luKHBvcnQsIFNDU0NSKTsKQEAgLTkwMCw3ICs5MDAsNyBAQAogCXJldHVybiBUSU9DTV9EVFIgfCBUSU9DTV9SVFMgfCBUSU9DTV9EU1I7CiB9CiAKLXN0YXRpYyB2b2lkIHNjaV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KQorc3RhdGljIHZvaWQgc2NpX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHNjaV9wb3J0ICpzID0gJnNjaV9wb3J0c1twb3J0LT5saW5lXTsKIApAQCAtOTA5LDcgKzkwOSw3IEBACiAJZW5hYmxlX2lycShzLT5pcnFzW1NDSXhfVFhJX0lSUV0pOwogfQogCi1zdGF0aWMgdm9pZCBzY2lfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0b3ApCitzdGF0aWMgdm9pZCBzY2lfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgc2hvcnQgY3RybDsKQEAgLTk3OCw3ICs5NzgsNyBAQAogCXN0cnVjdCBzY2lfcG9ydCAqcyA9ICZzY2lfcG9ydHNbcG9ydC0+bGluZV07CiAKIAlzY2lfc3RvcF9yeChwb3J0KTsKLQlzY2lfc3RvcF90eChwb3J0LCAxKTsKKwlzY2lfc3RvcF90eChwb3J0KTsKIAlzY2lfZnJlZV9pcnEocyk7CiAKICNpZiBkZWZpbmVkKF9fSDgzMDBTX18pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zbl9jb25zb2xlLmMgYi9kcml2ZXJzL3NlcmlhbC9zbl9jb25zb2xlLmMKaW5kZXggMTJkMWYxNC4uMzEzZjlkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc25fY29uc29sZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NuX2NvbnNvbGUuYwpAQCAtMjU5LDEwICsyNTksOSBAQAogLyoqCiAgKiBzbnBfc3RvcF90eCAtIHN0b3AgdGhlIHRyYW5zbWl0dGVyIC0gbm8tb3AgZm9yIHVzCiAgKiBAcG9ydDogUG9ydCB0byBvcGVyYXQgZW9uIC0gd2UgaWdub3JlIC0gbm8tb3AgZnVuY3Rpb24KLSAqIEB0dHlfc3RvcDogU2V0IHRvIDEgaWYgY2FsbGVkIHZpYSB1YXJ0X3N0b3AKICAqCiAgKi8KLXN0YXRpYyB2b2lkIHNucF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RvcCkKK3N0YXRpYyB2b2lkIHNucF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiB9CiAKQEAgLTMyNSwxMCArMzI0LDkgQEAKIC8qKgogICogc25wX3N0YXJ0X3R4IC0gU3RhcnQgdHJhbnNtaXR0ZXIKICAqIEBwb3J0OiBQb3J0IHRvIG9wZXJhdGUgb24KLSAqIEB0dHlfc3RvcDogU2V0IHRvIDEgaWYgY2FsbGVkIHZpYSB1YXJ0X3N0YXJ0CiAgKgogICovCi1zdGF0aWMgdm9pZCBzbnBfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgc25wX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJaWYgKHNhbF9jb25zb2xlX3BvcnQuc2Nfb3BzLT5zYWxfd2FrZXVwX3RyYW5zbWl0KQogCQlzYWxfY29uc29sZV9wb3J0LnNjX29wcy0+c2FsX3dha2V1cF90cmFuc21pdCgmc2FsX2NvbnNvbGVfcG9ydCwKQEAgLTYxNSw3ICs2MTMsNyBAQAogCQl1YXJ0X3dyaXRlX3dha2V1cCgmcG9ydC0+c2NfcG9ydCk7CiAKIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQotCQlzbnBfc3RvcF90eCgmcG9ydC0+c2NfcG9ydCwgMCk7CS8qIG5vLW9wIGZvciB1cyAqLworCQlzbnBfc3RvcF90eCgmcG9ydC0+c2NfcG9ydCk7CS8qIG5vLW9wIGZvciB1cyAqLwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKaW5kZXggOGQxOTg4OC4uZTk3MTE1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKQEAgLTI0NSw3ICsyNDUsNyBAQAogCXJldHVybiB0dHk7CiB9CiAKLXN0YXRpYyB2b2lkIHN1bnNhYl9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKiwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkIHN1bnNhYl9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKik7CiBzdGF0aWMgdm9pZCBzdW5zYWJfdHhfaWRsZShzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqKTsKIAogc3RhdGljIHZvaWQgdHJhbnNtaXRfY2hhcnMoc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKnVwLApAQCAtMzAxLDcgKzMwMSw3IEBACiAJCXVhcnRfd3JpdGVfd2FrZXVwKCZ1cC0+cG9ydCk7CiAKIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQotCQlzdW5zYWJfc3RvcF90eCgmdXAtPnBvcnQsIDApOworCQlzdW5zYWJfc3RvcF90eCgmdXAtPnBvcnQpOwogfQogCiBzdGF0aWMgdm9pZCBjaGVja19zdGF0dXMoc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKnVwLApAQCAtNDQ4LDcgKzQ0OCw3IEBACiB9CiAKIC8qIHBvcnQtPmxvY2sgaGVsZCBieSBjYWxsZXIuICAqLwotc3RhdGljIHZvaWQgc3Vuc2FiX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIHZvaWQgc3Vuc2FiX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKikgcG9ydDsKIApAQCAtNDc2LDcgKzQ3Niw3IEBACiB9CiAKIC8qIHBvcnQtPmxvY2sgaGVsZCBieSBjYWxsZXIuICAqLwotc3RhdGljIHZvaWQgc3Vuc2FiX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RhcnQpCitzdGF0aWMgdm9pZCBzdW5zYWJfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKikgcG9ydDsKIAlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmdXAtPnBvcnQuaW5mby0+eG1pdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMgYi9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jCmluZGV4IGQ1N2EzNTUuLjU5NTllNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYwpAQCAtMjU1LDIxICsyNTUsMzAgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfU0VSSUFMXzgyNTBfUlNBICovCiAKLXN0YXRpYyB2b2lkIHN1bnN1X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQorc3RhdGljIGlubGluZSB2b2lkIF9fc3RvcF90eChzdHJ1Y3QgdWFydF9zdW5zdV9wb3J0ICpwKQoreworCWlmIChwLT5pZXIgJiBVQVJUX0lFUl9USFJJKSB7CisJCXAtPmllciAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJc2VyaWFsX291dChwLCBVQVJUX0lFUiwgcC0+aWVyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN1bnN1X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF9zdW5zdV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF9zdW5zdV9wb3J0ICopIHBvcnQ7CiAKLQlpZiAodXAtPmllciAmIFVBUlRfSUVSX1RIUkkpIHsKLQkJdXAtPmllciAmPSB+VUFSVF9JRVJfVEhSSTsKLQkJc2VyaWFsX291dCh1cCwgVUFSVF9JRVIsIHVwLT5pZXIpOwotCX0KLQlpZiAodXAtPnBvcnQudHlwZSA9PSBQT1JUXzE2Qzk1MCAmJiB0dHlfc3RvcCkgeworCV9fc3RvcF90eCh1cCk7CisKKwkvKgorCSAqIFdlIHJlYWxseSB3YW50IHRvIHN0b3AgdGhlIHRyYW5zbWl0dGVyIGZyb20gc2VuZGluZy4KKwkgKi8KKwlpZiAodXAtPnBvcnQudHlwZSA9PSBQT1JUXzE2Qzk1MCkgewogCQl1cC0+YWNyIHw9IFVBUlRfQUNSX1RYRElTOwogCQlzZXJpYWxfaWNyX3dyaXRlKHVwLCBVQVJUX0FDUiwgdXAtPmFjcik7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBzdW5zdV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KQorc3RhdGljIHZvaWQgc3Vuc3Vfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF9zdW5zdV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF9zdW5zdV9wb3J0ICopIHBvcnQ7CiAKQEAgLTI3NywxMCArMjg2LDExIEBACiAJCXVwLT5pZXIgfD0gVUFSVF9JRVJfVEhSSTsKIAkJc2VyaWFsX291dCh1cCwgVUFSVF9JRVIsIHVwLT5pZXIpOwogCX0KKwogCS8qCi0JICogV2Ugb25seSBkbyB0aGlzIGZyb20gdWFydF9zdGFydAorCSAqIFJlLWVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgaWYgd2UgZGlzYWJsZWQgaXQuCiAJICovCi0JaWYgKHR0eV9zdGFydCAmJiB1cC0+cG9ydC50eXBlID09IFBPUlRfMTZDOTUwKSB7CisJaWYgKHVwLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkM5NTAgJiYgdXAtPmFjciAmIFVBUlRfQUNSX1RYRElTKSB7CiAJCXVwLT5hY3IgJj0gflVBUlRfQUNSX1RYRElTOwogCQlzZXJpYWxfaWNyX3dyaXRlKHVwLCBVQVJUX0FDUiwgdXAtPmFjcik7CiAJfQpAQCAtNDEzLDggKzQyMywxMiBAQAogCQl1cC0+cG9ydC54X2NoYXIgPSAwOwogCQlyZXR1cm47CiAJfQotCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKCZ1cC0+cG9ydCkpIHsKLQkJc3Vuc3Vfc3RvcF90eCgmdXAtPnBvcnQsIDApOworCWlmICh1YXJ0X3R4X3N0b3BwZWQoJnVwLT5wb3J0KSkgeworCQlzdW5zdV9zdG9wX3R4KCZ1cC0+cG9ydCk7CisJCXJldHVybjsKKwl9CisJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkgeworCQlfX3N0b3BfdHgodXApOwogCQlyZXR1cm47CiAJfQogCkBAIC00MzEsNyArNDQ1LDcgQEAKIAkJdWFydF93cml0ZV93YWtldXAoJnVwLT5wb3J0KTsKIAogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCi0JCXN1bnN1X3N0b3BfdHgoJnVwLT5wb3J0LCAwKTsKKwkJX19zdG9wX3R4KHVwKTsKIH0KIAogc3RhdGljIF9JTkxJTkVfIHZvaWQgY2hlY2tfbW9kZW1fc3RhdHVzKHN0cnVjdCB1YXJ0X3N1bnN1X3BvcnQgKnVwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYyBiL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKaW5kZXggYmZmNDJhNy4uZDc1NDQ1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCkBAIC02ODQsNyArNjg0LDcgQEAKIH0KIAogLyogVGhlIHBvcnQgbG9jayBpcyBoZWxkIGFuZCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4gICovCi1zdGF0aWMgdm9pZCBzdW56aWxvZ19zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RvcCkKK3N0YXRpYyB2b2lkIHN1bnppbG9nX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF9zdW56aWxvZ19wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF9zdW56aWxvZ19wb3J0ICopIHBvcnQ7CiAKQEAgLTY5Miw3ICs2OTIsNyBAQAogfQogCiAvKiBUaGUgcG9ydCBsb2NrIGlzIGhlbGQgYW5kIGludGVycnVwdHMgYXJlIGRpc2FibGVkLiAgKi8KLXN0YXRpYyB2b2lkIHN1bnppbG9nX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RhcnQpCitzdGF0aWMgdm9pZCBzdW56aWxvZ19zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0X3N1bnppbG9nX3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3N1bnppbG9nX3BvcnQgKikgcG9ydDsKIAlzdHJ1Y3Qgemlsb2dfY2hhbm5lbCBfX2lvbWVtICpjaGFubmVsID0gWklMT0dfQ0hBTk5FTF9GUk9NX1BPUlQocG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC91YXJ0MDAuYyBiL2RyaXZlcnMvc2VyaWFsL3VhcnQwMC5jCmluZGV4IDE4NmYxMzAuLjQ3YjUwNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3VhcnQwMC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3VhcnQwMC5jCkBAIC04Nyw3ICs4Nyw3IEBACiAjZGVmaW5lIFVBUlRfVFhfUkVBRFkocykJKCgocykgJiBVQVJUX1RTUl9UWF9MRVZFTF9NU0spIDwgMTUpCiAvLyNkZWZpbmUgVUFSVF9UWF9FTVBUWShwKQkoKFVBUlRfR0VUX0ZSKHApICYgVUFSVDAwX1VBUlRGUl9UTVNLKSA9PSAwKQogCi1zdGF0aWMgdm9pZCB1YXJ0MDBfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0b3ApCitzdGF0aWMgdm9pZCB1YXJ0MDBfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCVVBUlRfUFVUX0lFQyhwb3J0LCBVQVJUX0lFQ19USUVfTVNLKTsKIH0KQEAgLTE5OSw3ICsxOTksNyBAQAogCQlyZXR1cm47CiAJfQogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKHBvcnQpKSB7Ci0JCXVhcnQwMF9zdG9wX3R4KHBvcnQsIDApOworCQl1YXJ0MDBfc3RvcF90eChwb3J0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjE4LDEwICsyMTgsMTAgQEAKIAkJdWFydF93cml0ZV93YWtldXAocG9ydCk7CiAKIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQotCQl1YXJ0MDBfc3RvcF90eChwb3J0LCAwKTsKKwkJdWFydDAwX3N0b3BfdHgocG9ydCk7CiB9CiAKLXN0YXRpYyB2b2lkIHVhcnQwMF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KQorc3RhdGljIHZvaWQgdWFydDAwX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJVUFSVF9QVVRfSUVTKHBvcnQsIFVBUlRfSUVTX1RJRV9NU0spOwogCXVhcnQwMF90eF9jaGFycyhwb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3Y4NTBlX3VhcnQuYyBiL2RyaXZlcnMvc2VyaWFsL3Y4NTBlX3VhcnQuYwppbmRleCBiYjQ4Mjc4Li45Mzc4ODk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC92ODUwZV91YXJ0LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvdjg1MGVfdWFydC5jCkBAIC0yNDAsNyArMjQwLDcgQEAKIAwKIC8qIFRYL1JYIGludGVycnVwdCBoYW5kbGVycy4gICovCiAKLXN0YXRpYyB2b2lkIHY4NTBlX3VhcnRfc3RvcF90eCAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgdHR5X3N0b3ApOworc3RhdGljIHZvaWQgdjg1MGVfdWFydF9zdG9wX3R4IChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKIAogdm9pZCB2ODUwZV91YXJ0X3R4IChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewpAQCAtMzM5LDE0ICszMzksMTQgQEAKIAlyZXR1cm4gbWN0cmw7CiB9CiAKLXN0YXRpYyB2b2lkIHY4NTBlX3VhcnRfc3RhcnRfdHggKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIHR0eV9zdGFydCkKK3N0YXRpYyB2b2lkIHY4NTBlX3VhcnRfc3RhcnRfdHggKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJdjg1MGVfaW50Y19kaXNhYmxlX2lycSAoVjg1MEVfVUFSVF9UWF9JUlEgKHBvcnQtPmxpbmUpKTsKIAl2ODUwZV91YXJ0X3R4IChwb3J0KTsKIAl2ODUwZV9pbnRjX2VuYWJsZV9pcnEgKFY4NTBFX1VBUlRfVFhfSVJRIChwb3J0LT5saW5lKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHY4NTBlX3VhcnRfc3RvcF90eCAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgdHR5X3N0b3ApCitzdGF0aWMgdm9pZCB2ODUwZV91YXJ0X3N0b3BfdHggKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJdjg1MGVfaW50Y19kaXNhYmxlX2lycSAoVjg1MEVfVUFSVF9UWF9JUlEgKHBvcnQtPmxpbmUpKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3ZyNDF4eF9zaXUuYyBiL2RyaXZlcnMvc2VyaWFsL3ZyNDF4eF9zaXUuYwppbmRleCAxZjk4NTMyLi4wYzVkNjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC92cjQxeHhfc2l1LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvdnI0MXh4X3NpdS5jCkBAIC0yODQsNyArMjg0LDcgQEAKIAlyZXR1cm4gbWN0cmw7CiB9CiAKLXN0YXRpYyB2b2lkIHNpdV9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RvcCkKK3N0YXRpYyB2b2lkIHNpdV9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1aW50OF90IGllcjsKQEAgLTI5OCw3ICsyOTgsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgc2l1X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RhcnQpCitzdGF0aWMgdm9pZCBzaXVfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVpbnQ4X3QgaWVyOwpAQCAtNDU4LDcgKzQ1OCw3IEBACiAJfQogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQocG9ydCkpIHsKLQkJc2l1X3N0b3BfdHgocG9ydCwgMCk7CisJCXNpdV9zdG9wX3R4KHBvcnQpOwogCQlyZXR1cm47CiAJfQogCkBAIC00NzQsNyArNDc0LDcgQEAKIAkJdWFydF93cml0ZV93YWtldXAocG9ydCk7CiAKIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQotCQlzaXVfc3RvcF90eChwb3J0LCAwKTsKKwkJc2l1X3N0b3BfdHgocG9ydCk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzaXVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RlbGVwaG9ueS9peGouYyBiL2RyaXZlcnMvdGVsZXBob255L2l4ai5jCmluZGV4IGYyYzlmYTQuLmY2NzA0NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGVsZXBob255L2l4ai5jCisrKyBiL2RyaXZlcnMvdGVsZXBob255L2l4ai5jCkBAIC03NzQsMTAgKzc3NCw3IEBACiAJai0+cG90c193aW5rc3RhcnQgPSBqaWZmaWVzOwogCVNMSUNfU2V0U3RhdGUoUExEX1NMSUNfU1RBVEVfT0MsIGopOwogCi0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGotPnBvdHNfd2lua3N0YXJ0ICsgai0+d2lua3RpbWUpKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JfQorCW1zbGVlcChqaWZmaWVzX3RvX21zZWNzKGotPndpbmt0aW1lKSk7CiAKIAlTTElDX1NldFN0YXRlKHNsaWNub3csIGopOwogCXJldHVybiAwOwpAQCAtMTkxMiw3ICsxOTA5LDYgQEAKIAogc3RhdGljIGludCBpeGpfaG9va3N0YXRlKElYSiAqaikKIHsKLQl1bnNpZ25lZCBsb25nIGRldDsKIAlpbnQgZk9mZkhvb2sgPSAwOwogCiAJc3dpdGNoIChqLT5jYXJkdHlwZSkgewpAQCAtMTk0MywxMSArMTkzOSw3IEBACiAJCQkgICAgai0+cGxkX3NsaWNyLmJpdHMuc3RhdGUgPT0gUExEX1NMSUNfU1RBVEVfU1RBTkRCWSkgewogCQkJCWlmIChqLT5mbGFncy5yaW5naW5nIHx8IGotPmZsYWdzLmNyaW5naW5nKSB7CiAJCQkJCWlmICghaW5faW50ZXJydXB0KCkpIHsKLQkJCQkJCWRldCA9IGppZmZpZXMgKyAoaGVydHogLyA1MCk7Ci0JCQkJCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZGV0KSkgewotCQkJCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQkJCQkJCX0KKwkJCQkJCW1zbGVlcCgyMCk7CiAJCQkJCX0KIAkJCQkJU0xJQ19HZXRTdGF0ZShqKTsKIAkJCQkJaWYgKGotPnBsZF9zbGljci5iaXRzLnN0YXRlID09IFBMRF9TTElDX1NUQVRFX1JJTkdJTkcpIHsKQEAgLTIwNjIsNyArMjA1NCw3IEBACiBzdGF0aWMgaW50IGl4al9yaW5nKElYSiAqaikKIHsKIAljaGFyIGNudHI7Ci0JdW5zaWduZWQgbG9uZyBqaWYsIGRldDsKKwl1bnNpZ25lZCBsb25nIGppZjsKIAogCWotPmZsYWdzLnJpbmdpbmcgPSAxOwogCWlmIChpeGpfaG9va3N0YXRlKGopICYgMSkgewpAQCAtMjA3MCw3ICsyMDYyLDYgQEAKIAkJai0+ZmxhZ3MucmluZ2luZyA9IDA7CiAJCXJldHVybiAxOwogCX0KLQlkZXQgPSAwOwogCWZvciAoY250ciA9IDA7IGNudHIgPCBqLT5tYXhyaW5nczsgY250cisrKSB7CiAJCWppZiA9IGppZmZpZXMgKyAoMSAqIGhlcnR6KTsKIAkJaXhqX3Jpbmdfb24oaik7CkBAIC0yMDgwLDggKzIwNzEsNyBAQAogCQkJCWotPmZsYWdzLnJpbmdpbmcgPSAwOwogCQkJCXJldHVybiAxOwogCQkJfQotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQkJYnJlYWs7CiAJCX0KQEAgLTIwODksMjAgKzIwNzksMTMgQEAKIAkJaXhqX3Jpbmdfb2ZmKGopOwogCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgamlmKSkgewogCQkJaWYgKGl4al9ob29rc3RhdGUoaikgJiAxKSB7Ci0JCQkJZGV0ID0gamlmZmllcyArIChoZXJ0eiAvIDEwMCk7Ci0JCQkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGRldCkpIHsKLQkJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCW1zbGVlcCgxMCk7CiAJCQkJaWYgKGl4al9ob29rc3RhdGUoaikgJiAxKSB7CiAJCQkJCWotPmZsYWdzLnJpbmdpbmcgPSAwOwogCQkJCQlyZXR1cm4gMTsKIAkJCQl9CiAJCQl9Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCQlicmVhazsKIAkJfQpAQCAtMjE2OCwxMCArMjE1MSw4IEBACiAJICogICAgU2V0IHVwIGxvY2tzIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIHByb2Nlc3MgaXMgdGFsa2luZyB0byB0aGUgRFNQIGF0IGEgdGltZS4KIAkgKiAgICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBrZWVwIHRoZSBEU1AgZnJvbSBsb2NraW5nIHVwLgogCSAqLwotCXdoaWxlKHRlc3RfYW5kX3NldF9iaXQoYm9hcmQsICh2b2lkICopJmotPmJ1c3lmbGFncykgIT0gMCkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCX0KKwl3aGlsZSh0ZXN0X2FuZF9zZXRfYml0KGJvYXJkLCAodm9pZCAqKSZqLT5idXN5ZmxhZ3MpICE9IDApCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAlpZiAoaXhqZGVidWcgJiAweDAwMDIpCiAJCXByaW50ayhLRVJOX0lORk8gIkNsb3NpbmcgYm9hcmQgJWRcbiIsIE5VTShpbm9kZSkpOwogCkBAIC0zMzAxLDE0ICszMjgyLDEwIEBACiAJaXhqX3BsYXlfdG9uZShqLCAyMyk7CiAKIAljbGVhcl9iaXQoai0+Ym9hcmQsICZqLT5idXN5ZmxhZ3MpOwotCXdoaWxlKGotPnRvbmVfc3RhdGUpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQl9Ci0Jd2hpbGUodGVzdF9hbmRfc2V0X2JpdChqLT5ib2FyZCwgKHZvaWQgKikmai0+YnVzeWZsYWdzKSAhPSAwKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JfQorCXdoaWxlKGotPnRvbmVfc3RhdGUpCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKKwl3aGlsZSh0ZXN0X2FuZF9zZXRfYml0KGotPmJvYXJkLCAodm9pZCAqKSZqLT5idXN5ZmxhZ3MpICE9IDApCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAlpZihpeGpkZWJ1ZyAmIDB4MDIwMCkgewogCQlwcmludGsoIklYSiBjaWRjdyBwaG9uZSVkIGZpcnN0IHRvbmUgZW5kIGF0ICVsZFxuIiwgai0+Ym9hcmQsIGppZmZpZXMpOwogCX0KQEAgLTMzMjgsMTQgKzMzMDUsMTAgQEAKIAlpeGpfcGxheV90b25lKGosIDI0KTsKIAogCWNsZWFyX2JpdChqLT5ib2FyZCwgJmotPmJ1c3lmbGFncyk7Ci0Jd2hpbGUoai0+dG9uZV9zdGF0ZSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCX0KLQl3aGlsZSh0ZXN0X2FuZF9zZXRfYml0KGotPmJvYXJkLCAodm9pZCAqKSZqLT5idXN5ZmxhZ3MpICE9IDApIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQl9CisJd2hpbGUoai0+dG9uZV9zdGF0ZSkKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOworCXdoaWxlKHRlc3RfYW5kX3NldF9iaXQoai0+Ym9hcmQsICh2b2lkICopJmotPmJ1c3lmbGFncykgIT0gMCkKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwogCWlmKGl4amRlYnVnICYgMHgwMjAwKSB7CiAJCXByaW50aygiSVhKIGNpZGN3IHBob25lJWQgc2VudCBzZWNvbmQgdG9uZSBhdCAlbGRcbiIsIGotPmJvYXJkLCBqaWZmaWVzKTsKIAl9CkBAIC0zMzQzLDE0ICszMzE2LDEwIEBACiAJai0+Y2lkY3dfd2FpdCA9IGppZmZpZXMgKyAoKDUwICogaGVydHopIC8gMTAwKTsKIAogCWNsZWFyX2JpdChqLT5ib2FyZCwgJmotPmJ1c3lmbGFncyk7Ci0Jd2hpbGUoIWotPmZsYWdzLmNpZGN3X2FjayAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBqLT5jaWRjd193YWl0KSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCX0KLQl3aGlsZSh0ZXN0X2FuZF9zZXRfYml0KGotPmJvYXJkLCAodm9pZCAqKSZqLT5idXN5ZmxhZ3MpICE9IDApIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQl9CisJd2hpbGUoIWotPmZsYWdzLmNpZGN3X2FjayAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBqLT5jaWRjd193YWl0KSkKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOworCXdoaWxlKHRlc3RfYW5kX3NldF9iaXQoai0+Ym9hcmQsICh2b2lkICopJmotPmJ1c3lmbGFncykgIT0gMCkKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwogCWotPmNpZGN3X3dhaXQgPSAwOwogCWlmKCFqLT5mbGFncy5jaWRjd19hY2spIHsKIAkJaWYoaXhqZGVidWcgJiAweDAyMDApIHsKQEAgLTYxMjUsMTAgKzYwOTQsOCBAQAogCSAqICAgIFNldCB1cCBsb2NrcyB0byBlbnN1cmUgdGhhdCBvbmx5IG9uZSBwcm9jZXNzIGlzIHRhbGtpbmcgdG8gdGhlIERTUCBhdCBhIHRpbWUuCiAJICogICAgVGhpcyBpcyBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgRFNQIGZyb20gbG9ja2luZyB1cC4KIAkgKi8KLQl3aGlsZSh0ZXN0X2FuZF9zZXRfYml0KGJvYXJkLCAodm9pZCAqKSZqLT5idXN5ZmxhZ3MpICE9IDApIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQl9CisJd2hpbGUodGVzdF9hbmRfc2V0X2JpdChib2FyZCwgKHZvaWQgKikmai0+YnVzeWZsYWdzKSAhPSAwKQorCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CiAJaWYgKGl4amRlYnVnICYgMHgwMDQwKQogCQlwcmludGsoInBob25lJWQgaW9jdGwsIGNtZDogMHgleCwgYXJnOiAweCVseFxuIiwgbWlub3IsIGNtZCwgYXJnKTsKIAlpZiAobWlub3IgPj0gSVhKTUFYKSB7CkBAIC02Njk0LDggKzY2NjEsNiBAQAogCiBzdGF0aWMgaW50IGl4al9saW5ldGVzdChJWEogKmopCiB7Ci0JdW5zaWduZWQgbG9uZyBqaWZ3YWl0OwotCiAJai0+ZmxhZ3MucHN0bmNoZWNrID0gMTsJLyogVGVzdGluZyAqLwogCWotPmZsYWdzLnBzdG5fcHJlc2VudCA9IDA7IC8qIEFzc3VtZSB0aGUgbGluZSBpcyBub3QgdGhlcmUgKi8KIApAQCAtNjcyNiwxMSArNjY5MSw3IEBACiAKIAkJb3V0Yl9wKGotPnBsZF9zY3J3LmJ5dGUsIGotPlhJTElOWGJhc2UpOwogCQlkYWFfc2V0X21vZGUoaiwgU09QX1BVX0NPTlZFUlNBVElPTik7Ci0JCWppZndhaXQgPSBqaWZmaWVzICsgaGVydHo7Ci0JCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBqaWZ3YWl0KSkgewotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCX0KKwkJbXNsZWVwKDEwMDApOwogCQlkYWFfaW50X3JlYWQoaik7CiAJCWRhYV9zZXRfbW9kZShqLCBTT1BfUFVfUkVTRVQpOwogCQlpZiAoai0+bV9EQUFTaGFkb3dSZWdzLlhPUF9SRUdTLlhPUC54cjAuYml0cmVnLlZERF9PSykgewpAQCAtNjc1MCwxMSArNjcxMSw3IEBACiAJai0+cGxkX3NsaWN3LmJpdHMucmx5MyA9IDA7CiAJb3V0Yl9wKGotPnBsZF9zbGljdy5ieXRlLCBqLT5YSUxJTlhiYXNlICsgMHgwMSk7CiAJZGFhX3NldF9tb2RlKGosIFNPUF9QVV9DT05WRVJTQVRJT04pOwotCWppZndhaXQgPSBqaWZmaWVzICsgaGVydHo7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGppZndhaXQpKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JfQorCW1zbGVlcCgxMDAwKTsKIAlkYWFfaW50X3JlYWQoaik7CiAJZGFhX3NldF9tb2RlKGosIFNPUF9QVV9SRVNFVCk7CiAJaWYgKGotPm1fREFBU2hhZG93UmVncy5YT1BfUkVHUy5YT1AueHIwLmJpdHJlZy5WRERfT0spIHsKQEAgLTY3ODMsNyArNjc0MCw2IEBACiBzdGF0aWMgaW50IGl4al9zZWxmcHJvYmUoSVhKICpqKQogewogCXVuc2lnbmVkIHNob3J0IGNtZDsKLQl1bnNpZ25lZCBsb25nIGppZjsKIAlpbnQgY250OwogCUJZVEVTIGJ5dGVzOwogCkBAIC02OTMzLDI5ICs2ODg5LDEzIEBACiAJfSBlbHNlIHsKIAkJaWYgKGotPmNhcmR0eXBlID09IFFUSV9MSU5FSkFDSykgewogCQkJTEVEX1NldFN0YXRlKDB4MSwgaik7Ci0JCQlqaWYgPSBqaWZmaWVzICsgKGhlcnR6IC8gMTApOwotCQkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGppZikpIHsKLQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCQl9CisJCQltc2xlZXAoMTAwKTsKIAkJCUxFRF9TZXRTdGF0ZSgweDIsIGopOwotCQkJamlmID0gamlmZmllcyArIChoZXJ0eiAvIDEwKTsKLQkJCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBqaWYpKSB7Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCQkJfQorCQkJbXNsZWVwKDEwMCk7CiAJCQlMRURfU2V0U3RhdGUoMHg0LCBqKTsKLQkJCWppZiA9IGppZmZpZXMgKyAoaGVydHogLyAxMCk7Ci0JCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgamlmKSkgewotCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQkJCX0KKwkJCW1zbGVlcCgxMDApOwogCQkJTEVEX1NldFN0YXRlKDB4OCwgaik7Ci0JCQlqaWYgPSBqaWZmaWVzICsgKGhlcnR6IC8gMTApOwotCQkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGppZikpIHsKLQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCQl9CisJCQltc2xlZXAoMTAwKTsKIAkJCUxFRF9TZXRTdGF0ZSgweDAsIGopOwogCQkJZGFhX2dldF92ZXJzaW9uKGopOwogCQkJaWYgKGl4amRlYnVnICYgMHgwMDAyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jIGIvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCmluZGV4IDhlMTg0ZTIuLjc5ODYxZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYworKysgYi9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKQEAgLTcxNSwxMyArNzE1LDExIEBACiAJCQl1c2JfZGV2LCB1c2JfcmN2aW50cGlwZSh1c2JfZGV2LCBDWEFDUlVfRVBfQ01EKSwKIAkJCWluc3RhbmNlLT5yY3ZfYnVmLCBQQUdFX1NJWkUsCiAJCQljeGFjcnVfYmxvY2tpbmdfY29tcGxldGlvbiwgJmluc3RhbmNlLT5yY3ZfZG9uZSwgMSk7Ci0JaW5zdGFuY2UtPnJjdl91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAKIAl1c2JfZmlsbF9pbnRfdXJiKGluc3RhbmNlLT5zbmRfdXJiLAogCQkJdXNiX2RldiwgdXNiX3NuZGludHBpcGUodXNiX2RldiwgQ1hBQ1JVX0VQX0NNRCksCiAJCQlpbnN0YW5jZS0+c25kX2J1ZiwgUEFHRV9TSVpFLAogCQkJY3hhY3J1X2Jsb2NraW5nX2NvbXBsZXRpb24sICZpbnN0YW5jZS0+c25kX2RvbmUsIDQpOwotCWluc3RhbmNlLT5zbmRfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOwogCiAJaW5pdF9NVVRFWCgmaW5zdGFuY2UtPmNtX3NlcmlhbGl6ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwppbmRleCBiYjFkYjE5Li5jNDY2NzM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCkBAIC05NjAsNyArOTYwLDcgQEAKIAkJCWludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7CiAKIAkvKiBpbnN0YW5jZSBpbml0ICovCi0JaW5zdGFuY2UgPSBrY2FsbG9jKDEsIHNpemVvZigqaW5zdGFuY2UpICsgc2l6ZW9mKHN0cnVjdCB1cmIgKikgKiAobnVtX3Jjdl91cmJzICsgbnVtX3NuZF91cmJzKSwgR0ZQX0tFUk5FTCk7CisJaW5zdGFuY2UgPSBremFsbG9jKHNpemVvZigqaW5zdGFuY2UpICsgc2l6ZW9mKHN0cnVjdCB1cmIgKikgKiAobnVtX3Jjdl91cmJzICsgbnVtX3NuZF91cmJzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbnN0YW5jZSkgewogCQlkZXZfZGJnKGRldiwgIiVzOiBubyBtZW1vcnkgZm9yIGluc3RhbmNlIGRhdGEhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2NsYXNzL0tjb25maWcKaW5kZXggMDU2MWQwMi4uMzMzZTM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9LY29uZmlnCkBAIC00LDkgKzQsMjIgQEAKIGNvbW1lbnQgIlVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycyIKIAlkZXBlbmRzIG9uIFVTQgogCitjb25maWcgT0JTT0xFVEVfT1NTX1VTQl9EUklWRVIKKwlib29sICJPYnNvbGV0ZSBPU1MgVVNCIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBVU0IgJiYgU09VTkQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBvYnNvbGV0ZSBVU0IgQXVkaW8gYW5kIE1pZGkKKwkgIGRyaXZlcnMgdGhhdCBhcmUgc2NoZWR1bGVkIGZvciByZW1vdmFsIGluIHRoZSBuZWFyIGZ1dHVyZSBzaW5jZQorCSAgdGhlcmUgYXJlIEFMU0EgZHJpdmVycyBmb3IgdGhlIHNhbWUgaGFyZHdhcmUuCisKKwkgIFBsZWFzZSBjb250YWN0IEFkcmlhbiBCdW5rIDxidW5rQHN0dXN0YS5kZT4gaWYgeW91IGhhZCB0bworCSAgc2F5IFkgaGVyZSBiZWNhdXNlIG9mIG1pc3Npbmcgc3VwcG9ydCBpbiB0aGUgQUxTQSBkcml2ZXJzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgVVNCX0FVRElPCiAJdHJpc3RhdGUgIlVTQiBBdWRpbyBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCICYmIFNPVU5ECisJZGVwZW5kcyBvbiBVU0IgJiYgU09VTkQgJiYgT0JTT0xFVEVfT1NTX1VTQl9EUklWRVIKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgVVNCIGF1ZGlvIGVxdWlwbWVudCBzdWNoIGFzCiAJICBzcGVha2VycyB0byB5b3VyIGNvbXB1dGVyJ3MgVVNCIHBvcnQuIFlvdSBvbmx5IG5lZWQgdGhpcyBpZiB5b3UgdXNlCkBAIC00MCwxMCArNTMsMTIgQEAKIAogY29uZmlnIFVTQl9NSURJCiAJdHJpc3RhdGUgIlVTQiBNSURJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBVU0IgJiYgU09VTkQKKwlkZXBlbmRzIG9uIFVTQiAmJiBTT1VORCAmJiBPQlNPTEVURV9PU1NfVVNCX0RSSVZFUgogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCBhIFVTQiBNSURJIGRldmljZSB0byB5b3VyCi0JICBjb21wdXRlcidzIFVTQiBwb3J0LiBUaGlzIGRyaXZlciBpcyBmb3IgZGV2aWNlcyB0aGF0IGNvbXBseSB3aXRoCisJICBjb21wdXRlcidzIFVTQiBwb3J0LiAgWW91IG9ubHkgbmVlZCB0aGlzIGlmIHlvdSB1c2UgdGhlIE9TUworCSAgc291bmQgc3lzdGVtOyBVU0IgTUlESSBkZXZpY2VzIGFyZSBzdXBwb3J0ZWQgYnkgQUxTQSdzIFVTQgorCSAgYXVkaW8gZHJpdmVyLiBUaGlzIGRyaXZlciBpcyBmb3IgZGV2aWNlcyB0aGF0IGNvbXBseSB3aXRoCiAJICAnVW5pdmVyc2FsIFNlcmlhbCBCdXMgRGV2aWNlIENsYXNzIERlZmluaXRpb24gZm9yIE1JREkgRGV2aWNlJy4KIAogCSAgVGhlIGZvbGxvd2luZyBkZXZpY2VzIGFyZSBrbm93biB0byB3b3JrOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYyBiL2RyaXZlcnMvdXNiL2NsYXNzL3VzYmxwLmMKaW5kZXggN2NlNDNmYi4uZTE5NTcwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2JscC5jCkBAIC0zMTAsOCArMzEwLDkgQEAKIAogCWVycm9yID0gdXNibHBfcmVhZF9zdGF0dXMgKHVzYmxwLCB1c2JscC0+c3RhdHVzYnVmKTsKIAlpZiAoZXJyb3IgPCAwKSB7Ci0JCWVycigidXNibHAlZDogZXJyb3IgJWQgcmVhZGluZyBwcmludGVyIHN0YXR1cyIsCi0JCQl1c2JscC0+bWlub3IsIGVycm9yKTsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCWVycigidXNibHAlZDogZXJyb3IgJWQgcmVhZGluZyBwcmludGVyIHN0YXR1cyIsCisJCQkJdXNibHAtPm1pbm9yLCBlcnJvcik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNjA0LDcgKzYwNSw5IEBACiAKIAkJCWNhc2UgTFBHRVRTVEFUVVM6CiAJCQkJaWYgKHVzYmxwX3JlYWRfc3RhdHVzKHVzYmxwLCB1c2JscC0+c3RhdHVzYnVmKSkgewotCQkJCQllcnIoInVzYmxwJWQ6IGZhaWxlZCByZWFkaW5nIHByaW50ZXIgc3RhdHVzIiwgdXNibHAtPm1pbm9yKTsKKwkJCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCQkJCWVycigidXNibHAlZDogZmFpbGVkIHJlYWRpbmcgcHJpbnRlciBzdGF0dXMiLAorCQkJCQkJCXVzYmxwLT5taW5vcik7CiAJCQkJCXJldHZhbCA9IC1FSU87CiAJCQkJCWdvdG8gZG9uZTsKIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL01ha2VmaWxlIGIvZHJpdmVycy91c2IvY29yZS9NYWtlZmlsZQppbmRleCA5ZThjMzc3Li5kNTUwM2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvTWFrZWZpbGUKQEAgLTMsMTQgKzMsMTQgQEAKICMKIAogdXNiY29yZS1vYmpzCTo9IHVzYi5vIGh1Yi5vIGhjZC5vIHVyYi5vIG1lc3NhZ2UubyBcCi0JCQljb25maWcubyBmaWxlLm8gYnVmZmVyLm8gc3lzZnMubworCQkJY29uZmlnLm8gZmlsZS5vIGJ1ZmZlci5vIHN5c2ZzLm8gZGV2aW8ubwogCiBpZmVxICgkKENPTkZJR19QQ0kpLHkpCiAJdXNiY29yZS1vYmpzCSs9IGhjZC1wY2kubwogZW5kaWYKIAogaWZlcSAoJChDT05GSUdfVVNCX0RFVklDRUZTKSx5KQotCXVzYmNvcmUtb2JqcwkrPSBkZXZpby5vIGlub2RlLm8gZGV2aWNlcy5vCisJdXNiY29yZS1vYmpzCSs9IGlub2RlLm8gZGV2aWNlcy5vCiBlbmRpZgogCiBvYmotJChDT05GSUdfVVNCKQkrPSB1c2Jjb3JlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwppbmRleCBmODZiZjE0Li5iNDI2NWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiZGV2aWNlX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CkBAIC01MCw2ICs1MSwxMCBAQAogI2luY2x1ZGUgImhjZC5oIgkvKiBmb3IgdXNiY29yZSBpbnRlcm5hbHMgKi8KICNpbmNsdWRlICJ1c2IuaCIKIAorI2RlZmluZSBVU0JfTUFYQlVTCQkJNjQKKyNkZWZpbmUgVVNCX0RFVklDRV9NQVgJCQlVU0JfTUFYQlVTICogMTI4CitzdGF0aWMgc3RydWN0IGNsYXNzICp1c2JfZGV2aWNlX2NsYXNzOworCiBzdHJ1Y3QgYXN5bmMgewogCXN0cnVjdCBsaXN0X2hlYWQgYXN5bmNsaXN0OwogCXN0cnVjdCBkZXZfc3RhdGUgKnBzOwpAQCAtNzEsNiArNzYsOCBAQAogCQkJZGV2X2luZm8oIGRldiAsIGZvcm1hdCAsICMjIGFyZyk7CVwKIAl9IHdoaWxlICgwKQogCisjZGVmaW5lIFVTQl9ERVZJQ0VfREVWCQlNS0RFVihVU0JfREVWSUNFX01BSk9SLCAwKQorCiAKICNkZWZpbmUJTUFYX1VTQkZTX0JVRkZFUl9TSVpFCTE2Mzg0CiAKQEAgLTQ4Nyw3ICs0OTQsNyBAQAogICovCiBzdGF0aWMgaW50IHVzYmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IE5VTEw7CiAJc3RydWN0IGRldl9zdGF0ZSAqcHM7CiAJaW50IHJldDsKIApAQCAtNTAxLDExICs1MDgsMTYgQEAKIAogCWxvY2tfa2VybmVsKCk7CiAJcmV0ID0gLUVOT0VOVDsKLQlkZXYgPSB1c2JfZ2V0X2Rldihpbm9kZS0+dS5nZW5lcmljX2lwKTsKKwkvKiBjaGVjayBpZiB3ZSBhcmUgY2FsbGVkIGZyb20gYSByZWFsIG5vZGUgb3IgdXNiZnMgKi8KKwlpZiAoaW1ham9yKGlub2RlKSA9PSBVU0JfREVWSUNFX01BSk9SKQorCQlkZXYgPSB1c2JkZXZfbG9va3VwX21pbm9yKGltaW5vcihpbm9kZSkpOworCWlmICghZGV2KQorCQlkZXYgPSBpbm9kZS0+dS5nZW5lcmljX2lwOwogCWlmICghZGV2KSB7CiAJCWtmcmVlKHBzKTsKIAkJZ290byBvdXQ7CiAJfQorCXVzYl9nZXRfZGV2KGRldik7CiAJcmV0ID0gMDsKIAlwcy0+ZGV2ID0gZGV2OwogCXBzLT5maWxlID0gZmlsZTsKQEAgLTEyMjYsNyArMTIzOCw2IEBACiAJaW50CQkJcmV0dmFsID0gMDsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAgICAqaW50ZiA9IE5VTEw7CiAJc3RydWN0IHVzYl9kcml2ZXIgICAgICAgKmRyaXZlciA9IE5VTEw7Ci0JaW50CQkJaTsKIAogCS8qIGdldCBpbnB1dCBwYXJhbWV0ZXJzIGFuZCBhbGxvYyBidWZmZXIgKi8KIAlpZiAoY29weV9mcm9tX3VzZXIoJmN0cmwsIGFyZywgc2l6ZW9mIChjdHJsKSkpCkBAIC0xMjU4LDE1ICsxMjY5LDYgQEAKIAkvKiBkaXNjb25uZWN0IGtlcm5lbCBkcml2ZXIgZnJvbSBpbnRlcmZhY2UgKi8KIAljYXNlIFVTQkRFVkZTX0RJU0NPTk5FQ1Q6CiAKLQkJLyogZG9uJ3QgYWxsb3cgdGhlIHVzZXIgdG8gdW5iaW5kIHRoZSBodWIgZHJpdmVyIGZyb20KLQkJICogYSBodWIgd2l0aCBjaGlsZHJlbiB0byBtYW5hZ2UgKi8KLQkJZm9yIChpID0gMDsgaSA8IHBzLT5kZXYtPm1heGNoaWxkOyArK2kpIHsKLQkJCWlmIChwcy0+ZGV2LT5jaGlsZHJlbltpXSkKLQkJCQlyZXR2YWwgPSAtRUJVU1k7Ci0JCX0KLQkJaWYgKHJldHZhbCkKLQkJCWJyZWFrOwotCiAJCWRvd25fd3JpdGUoJnVzYl9idXNfdHlwZS5zdWJzeXMucndzZW0pOwogCQlpZiAoaW50Zi0+ZGV2LmRyaXZlcikgewogCQkJZHJpdmVyID0gdG9fdXNiX2RyaXZlcihpbnRmLT5kZXYuZHJpdmVyKTsKQEAgLTE0NzcsMyArMTQ3OSw3OSBAQAogCS5vcGVuID0JCXVzYmRldl9vcGVuLAogCS5yZWxlYXNlID0JdXNiZGV2X3JlbGVhc2UsCiB9OworCitzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2X2xvb2t1cF9taW5vcihpbnQgbWlub3IpCit7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBOVUxMOworCisJZG93bigmdXNiX2RldmljZV9jbGFzcy0+c2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsYXNzX2RldiwgJnVzYl9kZXZpY2VfY2xhc3MtPmNoaWxkcmVuLCBub2RlKSB7CisJCWlmIChjbGFzc19kZXYtPmRldnQgPT0gTUtERVYoVVNCX0RFVklDRV9NQUpPUiwgbWlub3IpKSB7CisJCQlkZXYgPSBjbGFzc19kZXYtPmNsYXNzX2RhdGE7CisJCQlicmVhazsKKwkJfQorCX0KKwl1cCgmdXNiX2RldmljZV9jbGFzcy0+c2VtKTsKKworCXJldHVybiBkZXY7Cit9OworCit2b2lkIHVzYmRldl9hZGQoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKK3sKKwlpbnQgbWlub3IgPSAoKGRldi0+YnVzLT5idXNudW0tMSkgKiAxMjgpICsgKGRldi0+ZGV2bnVtLTEpOworCisJZGV2LT5jbGFzc19kZXYgPSBjbGFzc19kZXZpY2VfY3JlYXRlKHVzYl9kZXZpY2VfY2xhc3MsCisJCQkJTUtERVYoVVNCX0RFVklDRV9NQUpPUiwgbWlub3IpLCAmZGV2LT5kZXYsCisJCQkJInVzYmRldiVkLiVkIiwgZGV2LT5idXMtPmJ1c251bSwgZGV2LT5kZXZudW0pOworCisJZGV2LT5jbGFzc19kZXYtPmNsYXNzX2RhdGEgPSBkZXY7Cit9CisKK3ZvaWQgdXNiZGV2X3JlbW92ZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KQoreworCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKGRldi0+Y2xhc3NfZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBjZGV2IHVzYl9kZXZpY2VfY2RldiA9IHsKKwkua29iaiAgID0gey5uYW1lID0gInVzYl9kZXZpY2UiLCB9LAorCS5vd25lciAgPSBUSElTX01PRFVMRSwKK307CisKK2ludCBfX2luaXQgdXNiZGV2X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihVU0JfREVWSUNFX0RFViwgVVNCX0RFVklDRV9NQVgsCisJCQkidXNiX2RldmljZSIpOworCWlmIChyZXR2YWwpIHsKKwkJZXJyKCJ1bmFibGUgdG8gcmVnaXN0ZXIgbWlub3JzIGZvciB1c2JfZGV2aWNlIik7CisJCWdvdG8gb3V0OworCX0KKwljZGV2X2luaXQoJnVzYl9kZXZpY2VfY2RldiwgJnVzYmZzX2RldmljZV9maWxlX29wZXJhdGlvbnMpOworCXJldHZhbCA9IGNkZXZfYWRkKCZ1c2JfZGV2aWNlX2NkZXYsIFVTQl9ERVZJQ0VfREVWLCBVU0JfREVWSUNFX01BWCk7CisJaWYgKHJldHZhbCkgeworCQllcnIoInVuYWJsZSB0byBnZXQgdXNiX2RldmljZSBtYWpvciAlZCIsIFVTQl9ERVZJQ0VfTUFKT1IpOworCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oVVNCX0RFVklDRV9ERVYsIFVTQl9ERVZJQ0VfTUFYKTsKKwkJZ290byBvdXQ7CisJfQorCXVzYl9kZXZpY2VfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJ1c2JfZGV2aWNlIik7CisJaWYgKElTX0VSUih1c2JfZGV2aWNlX2NsYXNzKSkgeworCQllcnIoInVuYWJsZSB0byByZWdpc3RlciB1c2JfZGV2aWNlIGNsYXNzIik7CisJCXJldHZhbCA9IFBUUl9FUlIodXNiX2RldmljZV9jbGFzcyk7CisJCXVzYl9kZXZpY2VfY2xhc3MgPSBOVUxMOworCQljZGV2X2RlbCgmdXNiX2RldmljZV9jZGV2KTsKKwkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKFVTQl9ERVZJQ0VfREVWLCBVU0JfREVWSUNFX01BWCk7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCB1c2JkZXZfY2xlYW51cCh2b2lkKQoreworCWNsYXNzX2Rlc3Ryb3kodXNiX2RldmljZV9jbGFzcyk7CisJY2Rldl9kZWwoJnVzYl9kZXZpY2VfY2Rldik7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKFVTQl9ERVZJQ0VfREVWLCBVU0JfREVWSUNFX01BWCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMKaW5kZXggZmMwNTYwNi4uY2JiNDUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMKQEAgLTEyMSwxMCArMTIxLDYgQEAKIAkJfQogCX0KIAotI2lmZGVmIENPTkZJR19QQ0lfTkFNRVMKLQloY2QtPnByb2R1Y3RfZGVzYyA9IGRldi0+cHJldHR5X25hbWU7Ci0jZW5kaWYKLQogCXBjaV9zZXRfbWFzdGVyIChkZXYpOwogCiAJcmV0dmFsID0gdXNiX2FkZF9oY2QgKGhjZCwgZGV2LT5pcnEsIFNBX1NISVJRKTsKQEAgLTI2NCw4ICsyNjAsMTAgQEAKIAkJcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZSAoZGV2LCBQQ0lfRDNob3QpOwogCQlpZiAocmV0dmFsID09IDApIHsKIAkJCWRldl9kYmcgKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiLS0+IFBDSSBEM1xuIik7Ci0JCQlwY2lfZW5hYmxlX3dha2UgKGRldiwgUENJX0QzaG90LCBoY2QtPnJlbW90ZV93YWtldXApOwotCQkJcGNpX2VuYWJsZV93YWtlIChkZXYsIFBDSV9EM2NvbGQsIGhjZC0+cmVtb3RlX3dha2V1cCk7CisJCQlyZXR2YWwgPSBwY2lfZW5hYmxlX3dha2UgKGRldiwgUENJX0QzaG90LCBoY2QtPnJlbW90ZV93YWtldXApOworCQkJaWYgKHJldHZhbCkKKwkJCQlicmVhazsKKwkJCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZSAoZGV2LCBQQ0lfRDNjb2xkLCBoY2QtPnJlbW90ZV93YWtldXApOwogCQl9IGVsc2UgaWYgKHJldHZhbCA8IDApIHsKIAkJCWRldl9kYmcgKCZkZXYtPmRldiwgIlBDSSBEMyBzdXNwZW5kIGZhaWwsICVkXG4iLAogCQkJCQlyZXR2YWwpOwpAQCAtMzM5LDggKzMzNywyMCBAQAogCQkJCWRldi0+Y3VycmVudF9zdGF0ZSk7CiAJCX0KICNlbmRpZgotCQlwY2lfZW5hYmxlX3dha2UgKGRldiwgZGV2LT5jdXJyZW50X3N0YXRlLCAwKTsKLQkJcGNpX2VuYWJsZV93YWtlIChkZXYsIFBDSV9EM2NvbGQsIDApOworCQlyZXR2YWwgPSBwY2lfZW5hYmxlX3dha2UgKGRldiwgZGV2LT5jdXJyZW50X3N0YXRlLCAwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJZGV2X2VycihoY2QtPnNlbGYuY29udHJvbGxlciwKKwkJCQkiY2FuJ3QgZW5hYmxlX3dha2UgdG8gJWQsICVkIVxuIiwKKwkJCQlkZXYtPmN1cnJlbnRfc3RhdGUsIHJldHZhbCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZSAoZGV2LCBQQ0lfRDNjb2xkLCAwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJZGV2X2VycihoY2QtPnNlbGYuY29udHJvbGxlciwKKwkJCQkiY2FuJ3QgZW5hYmxlX3dha2UgdG8gJWQsICVkIVxuIiwKKwkJCQlQQ0lfRDNjb2xkLCByZXR2YWwpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0gZWxzZSB7CiAJCS8qIFNhbWUgYmFzaWMgY2FzZXM6IGNsZWFuIChwb3dlcmVkL25vdCksIGRpcnR5ICovCiAJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJQQ0kgbGVnYWN5IHJlc3VtZVxuIik7CkBAIC0zODAsNyArMzkwLDcgQEAKIAkJdXNiX2hjX2RpZWQgKGhjZCk7CiAJfQogCi0JcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOwogCXJldHVybiByZXR2YWw7CiB9CiBFWFBPUlRfU1lNQk9MICh1c2JfaGNkX3BjaV9yZXN1bWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKaW5kZXggNzk0MjJhMy4uMTJlY2RiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCkBAIC03ODIsNyArNzgyLDcgQEAKIAkJcmV0dXJuIC1FMkJJRzsKIAl9CiAKLQlidXMtPmNsYXNzX2RldiA9IGNsYXNzX2RldmljZV9jcmVhdGUodXNiX2hvc3RfY2xhc3MsIE1LREVWKDAsMCksIGJ1cy0+Y29udHJvbGxlciwgInVzYiVkIiwgYnVzbnVtKTsKKwlidXMtPmNsYXNzX2RldiA9IGNsYXNzX2RldmljZV9jcmVhdGUodXNiX2hvc3RfY2xhc3MsIE1LREVWKDAsMCksIGJ1cy0+Y29udHJvbGxlciwgInVzYl9ob3N0JWQiLCBidXNudW0pOwogCWlmIChJU19FUlIoYnVzLT5jbGFzc19kZXYpKSB7CiAJCWNsZWFyX2JpdChidXNudW0sIGJ1c21hcC5idXNtYXApOwogCQl1cCgmdXNiX2J1c19saXN0X2xvY2spOwpAQCAtMTY2OSw3ICsxNjY5LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkOwogCi0JaGNkID0ga2NhbGxvYygxLCBzaXplb2YoKmhjZCkgKyBkcml2ZXItPmhjZF9wcml2X3NpemUsIEdGUF9LRVJORUwpOworCWhjZCA9IGt6YWxsb2Moc2l6ZW9mKCpoY2QpICsgZHJpdmVyLT5oY2RfcHJpdl9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhjZCkgewogCQlkZXZfZGJnIChkZXYsICJoY2QgYWxsb2MgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oIGIvZHJpdmVycy91c2IvY29yZS9oY2QuaAppbmRleCAyODA1NWY5Li5hYzQ1MWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKQEAgLTMzOSwxMSArMzM5LDExIEBACiAgKiB0byBwcmVhbGxvY2F0ZSBiYW5kd2lkdGgpCiAgKi8KICNkZWZpbmUgVVNCMl9IT1NUX0RFTEFZCTUJLyogbnNlYywgZ3Vlc3MgKi8KLSNkZWZpbmUgSFNfTlNFQ1MoYnl0ZXMpICggKCg1NSAqIDggKiAyMDgzKS8xMDAwKSBcCi0JKyAoKDIwODNVTCAqICgzMTY3ICsgQml0VGltZSAoYnl0ZXMpKSkvMTAwMCkgXAorI2RlZmluZSBIU19OU0VDUyhieXRlcykgKCAoKDU1ICogOCAqIDIwODMpIFwKKwkrICgyMDgzVUwgKiAoMyArIEJpdFRpbWUoYnl0ZXMpKSkpLzEwMDAgXAogCSsgVVNCMl9IT1NUX0RFTEFZKQotI2RlZmluZSBIU19OU0VDU19JU08oYnl0ZXMpICggKCgzOCAqIDggKiAyMDgzKS8xMDAwKSBcCi0JKyAoKDIwODNVTCAqICgzMTY3ICsgQml0VGltZSAoYnl0ZXMpKSkvMTAwMCkgXAorI2RlZmluZSBIU19OU0VDU19JU08oYnl0ZXMpICggKCgzOCAqIDggKiAyMDgzKSBcCisJKyAoMjA4M1VMICogKDMgKyBCaXRUaW1lKGJ5dGVzKSkpKS8xMDAwIFwKIAkrIFVTQjJfSE9TVF9ERUxBWSkKICNkZWZpbmUgSFNfVVNFQ1MoYnl0ZXMpIE5TX1RPX1VTIChIU19OU0VDUyhieXRlcykpCiAjZGVmaW5lIEhTX1VTRUNTX0lTTyhieXRlcykgTlNfVE9fVVMgKEhTX05TRUNTX0lTTyhieXRlcykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCBjM2U0NmQyLi43NThjN2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTQ5Miw2ICs0OTIsMjMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGh1Yl9wb3J0X2Rpc2FibGUoc3RydWN0IHVzYl9odWIgKmh1YiwgaW50IHBvcnQxLCBpbnQgc2V0X3N0YXRlKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpoZGV2ID0gaHViLT5oZGV2OworCWludCByZXQ7CisKKwlpZiAoaGRldi0+Y2hpbGRyZW5bcG9ydDEtMV0gJiYgc2V0X3N0YXRlKSB7CisJCXVzYl9zZXRfZGV2aWNlX3N0YXRlKGhkZXYtPmNoaWxkcmVuW3BvcnQxLTFdLAorCQkJCVVTQl9TVEFURV9OT1RBVFRBQ0hFRCk7CisJfQorCXJldCA9IGNsZWFyX3BvcnRfZmVhdHVyZShoZGV2LCBwb3J0MSwgVVNCX1BPUlRfRkVBVF9FTkFCTEUpOworCWlmIChyZXQpCisJCWRldl9lcnIoaHViLT5pbnRmZGV2LCAiY2Fubm90IGRpc2FibGUgcG9ydCAlZCAoZXJyID0gJWQpXG4iLAorCQkJcG9ydDEsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGh1Yl9jb25maWd1cmUoc3RydWN0IHVzYl9odWIgKmh1YiwKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50KQogewpAQCAtNjEwLDE5ICs2MjcsMzMgQEAKIAkJCWJyZWFrOwogCX0KIAorCS8qIE5vdGUgOCBGUyBiaXQgdGltZXMgPT0gKDggYml0cyAvIDEyMDAwMDAwIGJwcykgfj0gNjY2bnMgKi8KIAlzd2l0Y2ggKGh1Yi0+ZGVzY3JpcHRvci0+d0h1YkNoYXJhY3RlcmlzdGljcyAmIEhVQl9DSEFSX1RUVFQpIHsKLQkJY2FzZSAweDAwOgotCQkJaWYgKGhkZXYtPmRlc2NyaXB0b3IuYkRldmljZVByb3RvY29sICE9IDApCi0JCQkJZGV2X2RiZyhodWJfZGV2LCAiVFQgcmVxdWlyZXMgYXQgbW9zdCA4IEZTIGJpdCB0aW1lc1xuIik7CisJCWNhc2UgSFVCX1RUVFRfOF9CSVRTOgorCQkJaWYgKGhkZXYtPmRlc2NyaXB0b3IuYkRldmljZVByb3RvY29sICE9IDApIHsKKwkJCQlodWItPnR0LnRoaW5rX3RpbWUgPSA2NjY7CisJCQkJZGV2X2RiZyhodWJfZGV2LCAiVFQgcmVxdWlyZXMgYXQgbW9zdCAlZCAiCisJCQkJCQkiRlMgYml0IHRpbWVzICglZCBucylcbiIsCisJCQkJCTgsIGh1Yi0+dHQudGhpbmtfdGltZSk7CisJCQl9CiAJCQlicmVhazsKLQkJY2FzZSAweDIwOgotCQkJZGV2X2RiZyhodWJfZGV2LCAiVFQgcmVxdWlyZXMgYXQgbW9zdCAxNiBGUyBiaXQgdGltZXNcbiIpOworCQljYXNlIEhVQl9UVFRUXzE2X0JJVFM6CisJCQlodWItPnR0LnRoaW5rX3RpbWUgPSA2NjYgKiAyOworCQkJZGV2X2RiZyhodWJfZGV2LCAiVFQgcmVxdWlyZXMgYXQgbW9zdCAlZCAiCisJCQkJCSJGUyBiaXQgdGltZXMgKCVkIG5zKVxuIiwKKwkJCQkxNiwgaHViLT50dC50aGlua190aW1lKTsKIAkJCWJyZWFrOwotCQljYXNlIDB4NDA6Ci0JCQlkZXZfZGJnKGh1Yl9kZXYsICJUVCByZXF1aXJlcyBhdCBtb3N0IDI0IEZTIGJpdCB0aW1lc1xuIik7CisJCWNhc2UgSFVCX1RUVFRfMjRfQklUUzoKKwkJCWh1Yi0+dHQudGhpbmtfdGltZSA9IDY2NiAqIDM7CisJCQlkZXZfZGJnKGh1Yl9kZXYsICJUVCByZXF1aXJlcyBhdCBtb3N0ICVkICIKKwkJCQkJIkZTIGJpdCB0aW1lcyAoJWQgbnMpXG4iLAorCQkJCTI0LCBodWItPnR0LnRoaW5rX3RpbWUpOwogCQkJYnJlYWs7Ci0JCWNhc2UgMHg2MDoKLQkJCWRldl9kYmcoaHViX2RldiwgIlRUIHJlcXVpcmVzIGF0IG1vc3QgMzIgRlMgYml0IHRpbWVzXG4iKTsKKwkJY2FzZSBIVUJfVFRUVF8zMl9CSVRTOgorCQkJaHViLT50dC50aGlua190aW1lID0gNjY2ICogNDsKKwkJCWRldl9kYmcoaHViX2RldiwgIlRUIHJlcXVpcmVzIGF0IG1vc3QgJWQgIgorCQkJCQkiRlMgYml0IHRpbWVzICglZCBucylcbiIsCisJCQkJMzIsIGh1Yi0+dHQudGhpbmtfdGltZSk7CiAJCQlicmVhazsKIAl9CiAKQEAgLTcxMiwyMCArNzQzLDM2IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBoaWdoc3BlZWRfaHViczsKIAorLyogQ2FsbGVkIGFmdGVyIHRoZSBodWIgZHJpdmVyIGlzIHVuYm91bmQgZnJvbSBhIGh1YiB3aXRoIGNoaWxkcmVuICovCitzdGF0aWMgdm9pZCBodWJfcmVtb3ZlX2NoaWxkcmVuX3dvcmsodm9pZCAqX19odWIpCit7CisJc3RydWN0IHVzYl9odWIJCSpodWIgPSBfX2h1YjsKKwlzdHJ1Y3QgdXNiX2RldmljZQkqaGRldiA9IGh1Yi0+aGRldjsKKwlpbnQJCQlpOworCisJa2ZyZWUoaHViKTsKKworCXVzYl9sb2NrX2RldmljZShoZGV2KTsKKwlmb3IgKGkgPSAwOyBpIDwgaGRldi0+bWF4Y2hpbGQ7ICsraSkgeworCQlpZiAoaGRldi0+Y2hpbGRyZW5baV0pCisJCQl1c2JfZGlzY29ubmVjdCgmaGRldi0+Y2hpbGRyZW5baV0pOworCX0KKwl1c2JfdW5sb2NrX2RldmljZShoZGV2KTsKKwl1c2JfcHV0X2RldihoZGV2KTsKK30KKwogc3RhdGljIHZvaWQgaHViX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHVzYl9odWIgKmh1YiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwogCXN0cnVjdCB1c2JfZGV2aWNlICpoZGV2OworCWludCBuLCBwb3J0MTsKIAotCWlmICghaHViKQotCQlyZXR1cm47CisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CiAJaGRldiA9IGh1Yi0+aGRldjsKIAogCWlmIChoZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKIAkJaGlnaHNwZWVkX2h1YnMtLTsKIAotCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIE5VTEwpOwotCiAJaHViX3F1aWVzY2UoaHViKTsKIAl1c2JfZnJlZV91cmIoaHViLT51cmIpOwogCWh1Yi0+dXJiID0gTlVMTDsKQEAgLTc0Niw4ICs3OTMsMjcgQEAKIAkJaHViLT5idWZmZXIgPSBOVUxMOwogCX0KIAotCS8qIEZyZWUgdGhlIG1lbW9yeSAqLwotCWtmcmVlKGh1Yik7CisJLyogSWYgdGhlcmUgYXJlIGFueSBjaGlsZHJlbiB0aGVuIHRoaXMgaXMgYW4gdW5iaW5kIG9ubHksIG5vdCBhCisJICogcGh5c2ljYWwgZGlzY29ubmVjdGlvbi4gIFRoZSBhY3RpdmUgcG9ydHMgbXVzdCBiZSBkaXNhYmxlZAorCSAqIGFuZCBsYXRlciBvbiB3ZSBtdXN0IGNhbGwgdXNiX2Rpc2Nvbm5lY3QoKS4gIFdlIGNhbid0IGNhbGwKKwkgKiBpdCBub3cgYmVjYXVzZSB3ZSBtYXkgbm90IGhvbGQgdGhlIGh1YidzIGRldmljZSBsb2NrLgorCSAqLworCW4gPSAwOworCWZvciAocG9ydDEgPSAxOyBwb3J0MSA8PSBoZGV2LT5tYXhjaGlsZDsgKytwb3J0MSkgeworCQlpZiAoaGRldi0+Y2hpbGRyZW5bcG9ydDEgLSAxXSkgeworCQkJKytuOworCQkJaHViX3BvcnRfZGlzYWJsZShodWIsIHBvcnQxLCAxKTsKKwkJfQorCX0KKworCWlmIChuID09IDApCisJCWtmcmVlKGh1Yik7CisJZWxzZSB7CisJCS8qIFJldXNlIHRoZSBodWItPmxlZHMgd29ya19zdHJ1Y3QgZm9yIG91ciBvd24gcHVycG9zZXMgKi8KKwkJSU5JVF9XT1JLKCZodWItPmxlZHMsIGh1Yl9yZW1vdmVfY2hpbGRyZW5fd29yaywgaHViKTsKKwkJc2NoZWR1bGVfd29yaygmaHViLT5sZWRzKTsKKwkJdXNiX2dldF9kZXYoaGRldik7CisJfQogfQogCiBzdGF0aWMgaW50IGh1Yl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQpAQCAtMTA1MSw2ICsxMTE3LDcgQEAKIAlkZXZfZGJnICgmdWRldi0+ZGV2LCAidW5yZWdpc3RlcmluZyBkZXZpY2VcbiIpOwogCXJlbGVhc2VfYWRkcmVzcyh1ZGV2KTsKIAl1c2Jmc19yZW1vdmVfZGV2aWNlKHVkZXYpOworCXVzYmRldl9yZW1vdmUodWRldik7CiAJdXNiX3JlbW92ZV9zeXNmc19kZXZfZmlsZXModWRldik7CiAKIAkvKiBBdm9pZCByYWNlcyB3aXRoIHJlY3Vyc2l2ZWx5X21hcmtfTk9UQVRUQUNIRUQoKSAqLwpAQCAtMTI5MCw2ICsxMzU3LDcgQEAKIAkvKiBVU0IgZGV2aWNlIHN0YXRlID09IGNvbmZpZ3VyZWQgLi4uIHVzYWJsZSAqLwogCiAJLyogYWRkIGEgL3Byb2MvYnVzL3VzYiBlbnRyeSAqLworCXVzYmRldl9hZGQodWRldik7CiAJdXNiZnNfYWRkX2RldmljZSh1ZGV2KTsKIAlyZXR1cm4gMDsKIApAQCAtMTQyOCwyMyArMTQ5Niw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBodWJfcG9ydF9kaXNhYmxlKHN0cnVjdCB1c2JfaHViICpodWIsIGludCBwb3J0MSwgaW50IHNldF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiA9IGh1Yi0+aGRldjsKLQlpbnQgcmV0OwotCi0JaWYgKGhkZXYtPmNoaWxkcmVuW3BvcnQxLTFdICYmIHNldF9zdGF0ZSkgewotCQl1c2Jfc2V0X2RldmljZV9zdGF0ZShoZGV2LT5jaGlsZHJlbltwb3J0MS0xXSwKLQkJCQlVU0JfU1RBVEVfTk9UQVRUQUNIRUQpOwotCX0KLQlyZXQgPSBjbGVhcl9wb3J0X2ZlYXR1cmUoaGRldiwgcG9ydDEsIFVTQl9QT1JUX0ZFQVRfRU5BQkxFKTsKLQlpZiAocmV0KQotCQlkZXZfZXJyKGh1Yi0+aW50ZmRldiwgImNhbm5vdCBkaXNhYmxlIHBvcnQgJWQgKGVyciA9ICVkKVxuIiwKLQkJCXBvcnQxLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogLyoKICAqIERpc2FibGUgYSBwb3J0IGFuZCBtYXJrIGEgbG9naWNhbCBjb25ubmVjdC1jaGFuZ2UgZXZlbnQsIHNvIHRoYXQgc29tZQogICogdGltZSBsYXRlciBraHViZCB3aWxsIGRpc2Nvbm5lY3QoKSBhbnkgZXhpc3RpbmcgdXNiX2RldmljZSBvbiB0aGUgcG9ydApAQCAtMTU3MCw3ICsxNjIxLDcgQEAKIAkJCXN0cnVjdCB1c2JfZHJpdmVyCSpkcml2ZXI7CiAKIAkJCWludGYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXTsKLQkJCWlmIChzdGF0ZSA8PSBpbnRmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUpCisJCQlpZiAoc3RhdGUuZXZlbnQgPD0gaW50Zi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50KQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFpbnRmLT5kZXYuZHJpdmVyKQogCQkJCWNvbnRpbnVlOwpAQCAtMTU3OCwxMSArMTYyOSwxMSBAQAogCiAJCQlpZiAoZHJpdmVyLT5zdXNwZW5kKSB7CiAJCQkJc3RhdHVzID0gZHJpdmVyLT5zdXNwZW5kKGludGYsIHN0YXRlKTsKLQkJCQlpZiAoaW50Zi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlICE9IHN0YXRlCisJCQkJaWYgKGludGYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCAhPSBzdGF0ZS5ldmVudAogCQkJCQkJfHwgc3RhdHVzKQogCQkJCQlkZXZfZXJyKCZpbnRmLT5kZXYsCiAJCQkJCQkic3VzcGVuZCAlZCBmYWlsLCBjb2RlICVkXG4iLAotCQkJCQkJc3RhdGUsIHN0YXR1cyk7CisJCQkJCQlzdGF0ZS5ldmVudCwgc3RhdHVzKTsKIAkJCX0KIAogCQkJLyogb25seSBkcml2ZXJzIHdpdGggc3VzcGVuZCgpIGNhbiBldmVyIHJlc3VtZSgpOwpAQCAtMTU5NSw3ICsxNjQ2LDcgQEAKIAkJCSAqIHNpbmNlIHdlIGtub3cgZXZlcnkgZHJpdmVyJ3MgcHJvYmUvZGlzY29ubmVjdCB3b3JrcwogCQkJICogZXZlbiBmb3IgZHJpdmVycyB0aGF0IGNhbid0IHN1c3BlbmQuCiAJCQkgKi8KLQkJCWlmICghZHJpdmVyLT5zdXNwZW5kIHx8IHN0YXRlID4gUE1fU1VTUEVORF9NRU0pIHsKKwkJCWlmICghZHJpdmVyLT5zdXNwZW5kIHx8IHN0YXRlLmV2ZW50ID4gUE1fRVZFTlRfRlJFRVpFKSB7CiAjaWYgMQogCQkJCWRldl93YXJuKCZpbnRmLT5kZXYsICJyZXN1bWUgaXMgdW5zYWZlIVxuIik7CiAjZWxzZQpAQCAtMTYxNiw3ICsxNjY3LDcgQEAKIAkgKiBwb2xpY2llcyAod2hlbiBITlAgZG9lc24ndCBhcHBseSkgb25jZSB3ZSBoYXZlIG1lY2hhbmlzbXMgdG8KIAkgKiB0dXJuIHBvd2VyIGJhY2sgb24hICAoTGlrZWx5IG5vdCBiZWZvcmUgMi43Li4uKQogCSAqLwotCWlmIChzdGF0ZSA+IFBNX1NVU1BFTkRfTUVNKSB7CisJaWYgKHN0YXRlLmV2ZW50ID4gUE1fRVZFTlRfRlJFRVpFKSB7CiAJCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJubyBwb3dlcm9mZiB5ZXQsIHN1c3BlbmRpbmcgaW5zdGVhZFxuIik7CiAJfQogCkBAIC0xNzMzLDcgKzE3ODQsNyBAQAogCQkJc3RydWN0IHVzYl9kcml2ZXIJKmRyaXZlcjsKIAogCQkJaW50ZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQkJaWYgKGludGYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9PSBQTVNHX09OKQorCQkJaWYgKGludGYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9PTikKIAkJCQljb250aW51ZTsKIAkJCWlmICghaW50Zi0+ZGV2LmRyaXZlcikgewogCQkJCS8qIEZJWE1FIG1heWJlIGZvcmNlIHRvIGFsdCAwICovCkBAIC0xNzQ3LDExICsxNzk4LDExIEBACiAKIAkJCS8qIGNhbiB3ZSBkbyBiZXR0ZXIgdGhhbiBqdXN0IGxvZ2dpbmcgZXJyb3JzPyAqLwogCQkJc3RhdHVzID0gZHJpdmVyLT5yZXN1bWUoaW50Zik7Ci0JCQlpZiAoaW50Zi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlICE9IFBNU0dfT04KKwkJCWlmIChpbnRmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgIT0gUE1fRVZFTlRfT04KIAkJCQkJfHwgc3RhdHVzKQogCQkJCWRldl9kYmcoJmludGYtPmRldiwKIAkJCQkJInJlc3VtZSBmYWlsLCBzdGF0ZSAlZCBjb2RlICVkXG4iLAotCQkJCQlpbnRmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUsIHN0YXR1cyk7CisJCQkJCWludGYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCwgc3RhdHVzKTsKIAkJfQogCQlzdGF0dXMgPSAwOwogCkBAIC0xOTM0LDcgKzE5ODUsNyBAQAogCXVuc2lnbmVkCQlwb3J0MTsKIAlpbnQJCQlzdGF0dXM7CiAKLQlpZiAoaW50Zi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID09IFBNX1NVU1BFTkRfT04pCisJaWYgKGludGYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9PTikKIAkJcmV0dXJuIDA7CiAKIAlmb3IgKHBvcnQxID0gMTsgcG9ydDEgPD0gaGRldi0+bWF4Y2hpbGQ7IHBvcnQxKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmggYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oCmluZGV4IDUzYmY1NjQuLmU3ZmE5YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuaApAQCAtMTU3LDYgKzE1NywxMiBAQAogCiBzdHJ1Y3QgdXNiX2RldmljZTsKIAorLyogVHJhbnNhY3Rpb24gVHJhbnNsYXRvciBUaGluayBUaW1lcywgaW4gYml0cyAqLworI2RlZmluZSBIVUJfVFRUVF84X0JJVFMJCTB4MDAKKyNkZWZpbmUgSFVCX1RUVFRfMTZfQklUUwkweDIwCisjZGVmaW5lIEhVQl9UVFRUXzI0X0JJVFMJMHg0MAorI2RlZmluZSBIVUJfVFRUVF8zMl9CSVRTCTB4NjAKKwogLyoKICAqIEFzIG9mIFVTQiAyLjAsIGZ1bGwvbG93IHNwZWVkIGRldmljZXMgYXJlIHNlZ3JlZ2F0ZWQgaW50byB0cmVlcy4KICAqIE9uZSB0eXBlIGdyb3dzIGZyb20gVVNCIDEuMSBob3N0IGNvbnRyb2xsZXJzIChPSENJLCBVSENJIGV0YykuCkBAIC0xNzAsNiArMTc2LDcgQEAKIHN0cnVjdCB1c2JfdHQgewogCXN0cnVjdCB1c2JfZGV2aWNlCSpodWI7CS8qIHVwc3RyZWFtIGhpZ2hzcGVlZCBodWIgKi8KIAlpbnQJCQltdWx0aTsJLyogdHJ1ZSBtZWFucyBvbmUgVFQgcGVyIHBvcnQgKi8KKwl1bnNpZ25lZAkJdGhpbmtfdGltZTsJLyogdGhpbmsgdGltZSBpbiBucyAqLwogCiAJLyogZm9yIGNvbnRyb2wvYnVsayBlcnJvciByZWNvdmVyeSAoQ0xFQVJfVFRfQlVGRkVSKSAqLwogCXNwaW5sb2NrX3QJCWxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKaW5kZXggYzNlM2E5NS4uNjQwZjQxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYwpAQCAtNzI4LDE2ICs3MjgsMTAgQEAKIHsKIAlpbnQgcmV0dmFsOwogCi0JcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ1c2Jmc19kcml2ZXIpOworCXJldHZhbCA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnVzYl9mc190eXBlKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JcmV0dmFsID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdXNiX2ZzX3R5cGUpOwotCWlmIChyZXR2YWwpIHsKLQkJdXNiX2RlcmVnaXN0ZXIoJnVzYmZzX2RyaXZlcik7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCiAJLyogY3JlYXRlIG1vdW50IHBvaW50IGZvciB1c2JmcyAqLwogCXVzYmRpciA9IHByb2NfbWtkaXIoInVzYiIsIHByb2NfYnVzKTsKIApAQCAtNzQ2LDcgKzc0MCw2IEBACiAKIHZvaWQgdXNiZnNfY2xlYW51cCh2b2lkKQogewotCXVzYl9kZXJlZ2lzdGVyKCZ1c2Jmc19kcml2ZXIpOwogCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmdXNiX2ZzX3R5cGUpOwogCWlmICh1c2JkaXIpCiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJ1c2IiLCBwcm9jX2J1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IDg4ZDFiMzcuLmM0N2M4MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCkBAIC00OCw3ICs0OCw2IEBACiAKIAlpbml0X2NvbXBsZXRpb24oJmRvbmUpOyAJCiAJdXJiLT5jb250ZXh0ID0gJmRvbmU7Ci0JdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOwogCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CiAJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfTk9JTyk7CiAKQEAgLTI2Niw3ICsyNjUsOSBAQAogCQkJCWNvbnRpbnVlOwogCQkJaWYgKGZvdW5kKSB7CiAJCQkJc3RhdHVzID0gdXNiX3VubGlua191cmIgKGlvLT51cmJzIFtpXSk7Ci0JCQkJaWYgKHN0YXR1cyAhPSAtRUlOUFJPR1JFU1MgJiYgc3RhdHVzICE9IC1FQlVTWSkKKwkJCQlpZiAoc3RhdHVzICE9IC1FSU5QUk9HUkVTUworCQkJCQkJJiYgc3RhdHVzICE9IC1FTk9ERVYKKwkJCQkJCSYmIHN0YXR1cyAhPSAtRUJVU1kpCiAJCQkJCWRldl9lcnIgKCZpby0+ZGV2LT5kZXYsCiAJCQkJCQkiJXMsIHVubGluayAtLT4gJWRcbiIsCiAJCQkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CkBAIC0zNTcsOCArMzU4LDcgQEAKIAlpZiAoIWlvLT51cmJzKQogCQlnb3RvIG5vbWVtOwogCi0JdXJiX2ZsYWdzID0gVVJCX0FTWU5DX1VOTElOSyB8IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQCi0JCQl8IFVSQl9OT19JTlRFUlJVUFQ7CisJdXJiX2ZsYWdzID0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fSU5URVJSVVBUOwogCWlmICh1c2JfcGlwZWluIChwaXBlKSkKIAkJdXJiX2ZsYWdzIHw9IFVSQl9TSE9SVF9OT1RfT0s7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCmluZGV4IGMwZmVlZTIuLmM4NDZmZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS91cmIuYwpAQCAtMzA5LDkgKzMwOSw4IEBACiAJdW5zaWduZWQgaW50CWFsbG93ZWQ7CiAKIAkvKiBlbmZvcmNlIHNpbXBsZS9zdGFuZGFyZCBwb2xpY3kgKi8KLQlhbGxvd2VkID0gVVJCX0FTWU5DX1VOTElOSzsJLy8gYWZmZWN0cyBsYXRlciB1bmxpbmtzCi0JYWxsb3dlZCB8PSAoVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fU0VUVVBfRE1BX01BUCk7Ci0JYWxsb3dlZCB8PSBVUkJfTk9fSU5URVJSVVBUOworCWFsbG93ZWQgPSAoVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fU0VUVVBfRE1BX01BUCB8CisJCQlVUkJfTk9fSU5URVJSVVBUKTsKIAlzd2l0Y2ggKHRlbXApIHsKIAljYXNlIFBJUEVfQlVMSzoKIAkJaWYgKGlzX291dCkKQEAgLTQwMCwxNCArMzk5LDggQEAKICAqIGNhbmNlbGVkIChyYXRoZXIgdGhhbiBhbnkgb3RoZXIgY29kZSkgYW5kIHdpbGwgcXVpY2tseSBiZSByZW1vdmVkCiAgKiBmcm9tIGhvc3QgY29udHJvbGxlciBkYXRhIHN0cnVjdHVyZXMuCiAgKgotICogSW4gdGhlIHBhc3QsIGNsZWFyaW5nIHRoZSBVUkJfQVNZTkNfVU5MSU5LIHRyYW5zZmVyIGZsYWcgZm9yIHRoZQotICogVVJCIGluZGljYXRlZCB0aGF0IHRoZSByZXF1ZXN0IHdhcyBzeW5jaHJvbm91cy4gIFRoaXMgdXNhZ2UgaXMgbm93Ci0gKiBkZXByZWNhdGVkOyBpZiB0aGUgZmxhZyBpcyBjbGVhciB0aGUgY2FsbCB3aWxsIGJlIGZvcndhcmRlZCB0bwotICogdXNiX2tpbGxfdXJiKCkgYW5kIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSAwLiAgSW4gdGhlIGZ1dHVyZSwgZHJpdmVycwotICogc2hvdWxkIGNhbGwgdXNiX2tpbGxfdXJiKCkgZGlyZWN0bHkgZm9yIHN5bmNocm9ub3VzIHVubGlua2luZy4KLSAqCi0gKiBXaGVuIHRoZSBVUkJfQVNZTkNfVU5MSU5LIHRyYW5zZmVyIGZsYWcgZm9yIHRoZSBVUkIgaXMgc2V0LCB0aGlzCi0gKiByZXF1ZXN0IGlzIGFzeW5jaHJvbm91cy4gIFN1Y2Nlc3MgaXMgaW5kaWNhdGVkIGJ5IHJldHVybmluZyAtRUlOUFJPR1JFU1MsCisgKiBUaGlzIHJlcXVlc3QgaXMgYWx3YXlzIGFzeW5jaHJvbm91cy4KKyAqIFN1Y2Nlc3MgaXMgaW5kaWNhdGVkIGJ5IHJldHVybmluZyAtRUlOUFJPR1JFU1MsCiAgKiBhdCB3aGljaCB0aW1lIHRoZSBVUkIgd2lsbCBub3JtYWxseSBoYXZlIGJlZW4gdW5saW5rZWQgYnV0IG5vdCB5ZXQKICAqIGdpdmVuIGJhY2sgdG8gdGhlIGRldmljZSBkcml2ZXIuICBXaGVuIGl0IGlzIGNhbGxlZCwgdGhlIGNvbXBsZXRpb24KICAqIGZ1bmN0aW9uIHdpbGwgc2VlIHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VULiAgRmFpbHVyZSBpcyBpbmRpY2F0ZWQKQEAgLTQ1MywxNyArNDQ2LDYgQEAKIHsKIAlpZiAoIXVyYikKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCEodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9BU1lOQ19VTkxJTkspKSB7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0tFUk5FTAotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSB7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgInVzYl91bmxpbmtfdXJiKCkgaXMgZGVwcmVjYXRlZCBmb3IgIgotCQkJCSJzeW5jaHJvbm91cyB1bmxpbmtzLiAgVXNlIHVzYl9raWxsX3VyYigpIGluc3RlYWQuXG4iKTsKLQkJCVdBUk5fT04oMSk7Ci0JCX0KLSNlbmRpZgotCQl1c2Jfa2lsbF91cmIodXJiKTsKLQkJcmV0dXJuIDA7Ci0JfQogCWlmICghKHVyYi0+ZGV2ICYmIHVyYi0+ZGV2LT5idXMgJiYgdXJiLT5kZXYtPmJ1cy0+b3ApKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlyZXR1cm4gdXJiLT5kZXYtPmJ1cy0+b3AtPnVubGlua191cmIodXJiLCAtRUNPTk5SRVNFVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwppbmRleCA5OWM4NWQyLi4wODdhZjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKQEAgLTY1LDYgKzY1LDE2IEBACiB9CiBzdGF0aWMgaW50IGdlbmVyaWNfcmVtb3ZlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB0b191c2JfZGV2aWNlKGRldik7CisKKwkvKiBpZiB0aGlzIGlzIG9ubHkgYW4gdW5iaW5kLCBub3QgYSBwaHlzaWNhbCBkaXNjb25uZWN0LCB0aGVuCisJICogdW5jb25maWd1cmUgdGhlIGRldmljZSAqLworCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfQ09ORklHVVJFRCkKKwkJdXNiX3NldF9jb25maWd1cmF0aW9uKHVkZXYsIDApOworCisJLyogaW4gY2FzZSB0aGUgY2FsbCBmYWlsZWQgb3IgdGhlIGRldmljZSB3YXMgc3VzcGVuZGVkICovCisJaWYgKHVkZXYtPnN0YXRlID49IFVTQl9TVEFURV9DT05GSUdVUkVEKQorCQl1c2JfZGlzYWJsZV9kZXZpY2UodWRldiwgMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkxMiw3ICs5MjIsNyBAQAogICogaXMgbmVpdGhlciBCSU5ESU5HIG5vciBCT1VORC4gIFJhdGhlciB0aGFuIHNsZWVwaW5nIHRvIHdhaXQgZm9yIHRoZQogICogbG9jaywgdGhlIHJvdXRpbmUgcG9sbHMgcmVwZWF0ZWRseS4gIFRoaXMgaXMgdG8gcHJldmVudCBkZWFkbG9jayB3aXRoCiAgKiBkaXNjb25uZWN0OyBpbiBzb21lIGRyaXZlcnMgKHN1Y2ggYXMgdXNiLXN0b3JhZ2UpIHRoZSBkaXNjb25uZWN0KCkKLSAqIGNhbGxiYWNrIHdpbGwgYmxvY2sgd2FpdGluZyBmb3IgYSBkZXZpY2UgcmVzZXQgdG8gY29tcGxldGUuCisgKiBvciBzdXNwZW5kKCkgbWV0aG9kIHdpbGwgYmxvY2sgd2FpdGluZyBmb3IgYSBkZXZpY2UgcmVzZXQgdG8gY29tcGxldGUuCiAgKgogICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUsIG90aGVyd2lzZSAxIG9yIDAgdG8gaW5kaWNhdGUKICAqIHRoYXQgdGhlIGRldmljZSB3aWxsIG9yIHdpbGwgbm90IGhhdmUgdG8gYmUgdW5sb2NrZWQuICAoMCBjYW4gYmUKQEAgLTkyMiw2ICs5MzIsOCBAQAogaW50IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCiAJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKIHsKKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfZXhwaXJlID0gamlmZmllcyArIEhaOworCiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCkBAIC05MzgsNiArOTUwLDEyIEBACiAJfQogCiAJd2hpbGUgKCF1c2JfdHJ5bG9ja19kZXZpY2UodWRldikpIHsKKworCQkvKiBJZiB3ZSBjYW4ndCBhY3F1aXJlIHRoZSBsb2NrIGFmdGVyIHdhaXRpbmcgb25lIHNlY29uZCwKKwkJICogd2UncmUgcHJvYmFibHkgZGVhZGxvY2tlZCAqLworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBqaWZmaWVzX2V4cGlyZSkpCisJCQlyZXR1cm4gLUVCVVNZOworCiAJCW1zbGVlcCgxNSk7CiAJCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpCiAJCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE0MDAsNyArMTQxOCw3IEBACiAJZHJpdmVyID0gdG9fdXNiX2RyaXZlcihkZXYtPmRyaXZlcik7CiAKIAkvKiB0aGVyZSdzIG9ubHkgb25lIFVTQiBzdXNwZW5kIHN0YXRlICovCi0JaWYgKGludGYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSkKKwlpZiAoaW50Zi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50KQogCQlyZXR1cm4gMDsKIAogCWlmIChkcml2ZXItPnN1c3BlbmQpCkBAIC0xNDc4LDEzICsxNDk2LDE4IEBACiAJcmV0dmFsID0gdXNiX21ham9yX2luaXQoKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIG1ham9yX2luaXRfZmFpbGVkOworCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmdXNiZnNfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGRyaXZlcl9yZWdpc3Rlcl9mYWlsZWQ7CisJcmV0dmFsID0gdXNiZGV2X2luaXQoKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIHVzYmRldmljZV9pbml0X2ZhaWxlZDsKIAlyZXR2YWwgPSB1c2Jmc19pbml0KCk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBmc19pbml0X2ZhaWxlZDsKIAlyZXR2YWwgPSB1c2JfaHViX2luaXQoKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGh1Yl9pbml0X2ZhaWxlZDsKLQogCXJldHZhbCA9IGRyaXZlcl9yZWdpc3RlcigmdXNiX2dlbmVyaWNfZHJpdmVyKTsKIAlpZiAoIXJldHZhbCkKIAkJZ290byBvdXQ7CkBAIC0xNDkzLDcgKzE1MTYsMTEgQEAKIGh1Yl9pbml0X2ZhaWxlZDoKIAl1c2Jmc19jbGVhbnVwKCk7CiBmc19pbml0X2ZhaWxlZDoKLQl1c2JfbWFqb3JfY2xlYW51cCgpOwkKKwl1c2JkZXZfY2xlYW51cCgpOwordXNiZGV2aWNlX2luaXRfZmFpbGVkOgorCXVzYl9kZXJlZ2lzdGVyKCZ1c2Jmc19kcml2ZXIpOworZHJpdmVyX3JlZ2lzdGVyX2ZhaWxlZDoKKwl1c2JfbWFqb3JfY2xlYW51cCgpOwogbWFqb3JfaW5pdF9mYWlsZWQ6CiAJdXNiX2hvc3RfY2xlYW51cCgpOwogaG9zdF9pbml0X2ZhaWxlZDoKQEAgLTE1MTQsNiArMTU0MSw4IEBACiAJZHJpdmVyX3VucmVnaXN0ZXIoJnVzYl9nZW5lcmljX2RyaXZlcik7CiAJdXNiX21ham9yX2NsZWFudXAoKTsKIAl1c2Jmc19jbGVhbnVwKCk7CisJdXNiX2RlcmVnaXN0ZXIoJnVzYmZzX2RyaXZlcik7CisJdXNiZGV2X2NsZWFudXAoKTsKIAl1c2JfaHViX2NsZWFudXAoKTsKIAl1c2JfaG9zdF9jbGVhbnVwKCk7CiAJYnVzX3VucmVnaXN0ZXIoJnVzYl9idXNfdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oIGIvZHJpdmVycy91c2IvY29yZS91c2IuaAppbmRleCAyYzY5MGY2Li44M2Q0OGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKQEAgLTM3LDYgKzM3LDExIEBACiBleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2Jmc19kZXZpY2VfZmlsZV9vcGVyYXRpb25zOwogZXh0ZXJuIHZvaWQgdXNiZnNfY29ubl9kaXNjX2V2ZW50KHZvaWQpOwogCitleHRlcm4gaW50IHVzYmRldl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgdXNiZGV2X2NsZWFudXAodm9pZCk7CitleHRlcm4gdm9pZCB1c2JkZXZfYWRkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgdXNiZGV2X3JlbW92ZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KTsKK2V4dGVybiBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2X2xvb2t1cF9taW5vcihpbnQgbWlub3IpOwogCiBzdHJ1Y3QgZGV2X3N0YXRlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7ICAgICAgLyogc3RhdGUgbGlzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwppbmRleCA4NTA5ZTk1Li40OTQ1OWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwpAQCAtMjE4MSw2ICsyMTgxLDcgQEAKIAl1OAkJCWNkYyA9IDEsIHpscCA9IDEsIHJuZGlzID0gMTsKIAlzdHJ1Y3QgdXNiX2VwCQkqaW5fZXAsICpvdXRfZXAsICpzdGF0dXNfZXAgPSBOVUxMOwogCWludAkJCXN0YXR1cyA9IC1FTk9NRU07CisJaW50CQkJZ2NudW07CiAKIAkvKiB0aGVzZSBmbGFncyBhcmUgb25seSBldmVyIGNsZWFyZWQ7IGNvbXBpbGVyIHRha2Ugbm90ZSAqLwogI2lmbmRlZglERVZfQ09ORklHX0NEQwpAQCAtMjE5NCw0NCArMjE5NSwyNiBAQAogCSAqIHN0YW5kYXJkIHByb3RvY29sIGlzIF9zdHJvbmdseV8gcHJlZmVycmVkIGZvciBpbnRlcm9wIHB1cnBvc2VzLgogCSAqIChCeSBldmVyeW9uZSBleGNlcHQgTWljcm9zb2Z0LikKIAkgKi8KLQlpZiAoZ2FkZ2V0X2lzX25ldDIyODAgKGdhZGdldCkpIHsKLQkJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNiAoMHgwMjAxKTsKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19kdW1teSAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDIpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3B4YSAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDMpOworCWlmIChnYWRnZXRfaXNfcHhhIChnYWRnZXQpKSB7CiAJCS8qIHB4YSBkb2Vzbid0IHN1cHBvcnQgYWx0c2V0dGluZ3MgKi8KIAkJY2RjID0gMDsKIAl9IGVsc2UgaWYgKGdhZGdldF9pc19zaChnYWRnZXQpKSB7Ci0JCWRldmljZV9kZXNjLmJjZERldmljZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDB4MDIwNCk7CiAJCS8qIHNoIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aXBsZSBpbnRlcmZhY2VzIG9yIGNvbmZpZ3MgKi8KIAkJY2RjID0gMDsKIAkJcm5kaXMgPSAwOwogCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3NhMTEwMCAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDUpOwogCQkvKiBoYXJkd2FyZSBjYW4ndCB3cml0ZSB6bHBzICovCiAJCXpscCA9IDA7CiAJCS8qIHNhMTEwMCBDQU4gZG8gQ0RDLCB3aXRob3V0IHN0YXR1cyBlbmRwb2ludCAuLi4gd2UgdXNlCiAJCSAqIG5vbi1DREMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIEFSTSBMaW51eC0yLjQgInVzYi1ldGgiLgogCQkgKi8KIAkJY2RjID0gMDsKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19nb2t1IChnYWRnZXQpKSB7Ci0JCWRldmljZV9kZXNjLmJjZERldmljZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDB4MDIwNik7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfbXExMXh4IChnYWRnZXQpKSB7Ci0JCWRldmljZV9kZXNjLmJjZERldmljZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDB4MDIwNyk7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfb21hcCAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDgpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX2xoN2E0MHgoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDkpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX245NjA0KGdhZGdldCkpIHsKLQkJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNiAoMHgwMjEwKTsKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19weGEyN3goZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMTEpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3MzYzI0MTAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMTIpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX2F0OTEoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMTMpOwotCX0gZWxzZSB7CisJfQorCisJZ2NudW0gPSB1c2JfZ2FkZ2V0X2NvbnRyb2xsZXJfbnVtYmVyIChnYWRnZXQpOworCWlmIChnY251bSA+PSAwKQorCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBjcHVfdG9fbGUxNiAoMHgwMjAwICsgZ2NudW0pOworCWVsc2UgewogCQkvKiBjYW4ndCBhc3N1bWUgQ0RDIHdvcmtzLiAgZG9uJ3Qgd2FudCB0byBkZWZhdWx0IHRvCiAJCSAqIGFueXRoaW5nIGxlc3MgZnVuY3Rpb25hbCBvbiBDREMtY2FwYWJsZSBoYXJkd2FyZSwKIAkJICogc28gd2UgZmFpbCBpbiB0aGlzIGNhc2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKaW5kZXggNGY1NzA4NS4uYTQxZDlkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwpAQCAtMzcxMyw2ICszNzEzLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGNoZWNrX3BhcmFtZXRlcnMoc3RydWN0IGZzZ19kZXYgKmZzZykKIHsKIAlpbnQJcHJvdDsKKwlpbnQJZ2NudW07CiAKIAkvKiBTdG9yZSB0aGUgZGVmYXVsdCB2YWx1ZXMgKi8KIAltb2RfZGF0YS50cmFuc3BvcnRfdHlwZSA9IFVTQl9QUl9CVUxLOwpAQCAtMzcyNCwzMyArMzcyNSwxMyBAQAogCQltb2RfZGF0YS5jYW5fc3RhbGwgPSAwOwogCiAJaWYgKG1vZF9kYXRhLnJlbGVhc2UgPT0gMHhmZmZmKSB7CS8vIFBhcmFtZXRlciB3YXNuJ3Qgc2V0Ci0JCWlmIChnYWRnZXRfaXNfbmV0MjI4MChmc2ctPmdhZGdldCkpCi0JCQltb2RfZGF0YS5yZWxlYXNlID0gMHgwMzAxOwotCQllbHNlIGlmIChnYWRnZXRfaXNfZHVtbXkoZnNnLT5nYWRnZXQpKQotCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMwMjsKLQkJZWxzZSBpZiAoZ2FkZ2V0X2lzX3B4YShmc2ctPmdhZGdldCkpCi0JCQltb2RfZGF0YS5yZWxlYXNlID0gMHgwMzAzOwotCQllbHNlIGlmIChnYWRnZXRfaXNfc2goZnNnLT5nYWRnZXQpKQotCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMwNDsKLQogCQkvKiBUaGUgc2ExMTAwIGNvbnRyb2xsZXIgaXMgbm90IHN1cHBvcnRlZCAqLwotCi0JCWVsc2UgaWYgKGdhZGdldF9pc19nb2t1KGZzZy0+Z2FkZ2V0KSkKLQkJCW1vZF9kYXRhLnJlbGVhc2UgPSAweDAzMDY7Ci0JCWVsc2UgaWYgKGdhZGdldF9pc19tcTExeHgoZnNnLT5nYWRnZXQpKQotCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMwNzsKLQkJZWxzZSBpZiAoZ2FkZ2V0X2lzX29tYXAoZnNnLT5nYWRnZXQpKQotCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMwODsKLQkJZWxzZSBpZiAoZ2FkZ2V0X2lzX2xoN2E0MHgoZnNnLT5nYWRnZXQpKQotCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMwOTsKLQkJZWxzZSBpZiAoZ2FkZ2V0X2lzX245NjA0KGZzZy0+Z2FkZ2V0KSkKLQkJCW1vZF9kYXRhLnJlbGVhc2UgPSAweDAzMTA7Ci0JCWVsc2UgaWYgKGdhZGdldF9pc19weGEyN3goZnNnLT5nYWRnZXQpKQotCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMxMTsKLQkJZWxzZSBpZiAoZ2FkZ2V0X2lzX3MzYzI0MTAoZ2FkZ2V0KSkKLQkJCW1vZF9kYXRhLnJlbGVhc2UgPSAweDAzMTI7Ci0JCWVsc2UgaWYgKGdhZGdldF9pc19hdDkxKGZzZy0+Z2FkZ2V0KSkKLQkJCW1vZF9kYXRhLnJlbGVhc2UgPSAweDAzMTM7CisJCWlmIChnYWRnZXRfaXNfc2ExMTAwKGZzZy0+Z2FkZ2V0KSkKKwkJCWdjbnVtID0gLTE7CisJCWVsc2UKKwkJCWdjbnVtID0gdXNiX2dhZGdldF9jb250cm9sbGVyX251bWJlcihmc2ctPmdhZGdldCk7CisJCWlmIChnY251bSA+PSAwKQorCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMwMCArIGdjbnVtOwogCQllbHNlIHsKIAkJCVdBUk4oZnNnLCAiY29udHJvbGxlciAnJXMnIG5vdCByZWNvZ25pemVkXG4iLAogCQkJCWZzZy0+Z2FkZ2V0LT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9nYWRnZXRfY2hpcHMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9nYWRnZXRfY2hpcHMuaAppbmRleCBlYTJlYjUyLi44Y2JhZTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ2FkZ2V0X2NoaXBzLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dhZGdldF9jaGlwcy5oCkBAIC01LDYgKzUsNyBAQAogICoKICAqIFRoaXMgY291bGQgZXZlbnR1YWxseSB3b3JrIGxpa2UgdGhlIEFSTSBtYWNoX2lzXyooKSBzdHVmZiwgZHJpdmVuIGJ5CiAgKiBzb21lIGNvbmZpZyBmaWxlIHRoYXQgZ2V0cyB1cGRhdGVkIGFzIG5ldyBoYXJkd2FyZSBpcyBzdXBwb3J0ZWQuCisgKiAoQW5kIGF2b2lkaW5nIHRoZSBydW50aW1lIGNvbXBhcmlzb25zIGluIHR5cGljYWwgb25lLWNob2ljZSBjYXNlcy4pCiAgKgogICogTk9URTogIHNvbWUgb2YgdGhlc2UgY29udHJvbGxlciBkcml2ZXJzIG1heSBub3QgYmUgYXZhaWxhYmxlIHlldC4KICAqLwpAQCAtODYsNyArODcsNjEgQEAKICNkZWZpbmUgZ2FkZ2V0X2lzX2F0OTEoZykJMAogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9JTVgKKyNkZWZpbmUgZ2FkZ2V0X2lzX2lteChnKQkhc3RyY21wKCJpbXhfdWRjIiwgKGcpLT5uYW1lKQorI2Vsc2UKKyNkZWZpbmUgZ2FkZ2V0X2lzX2lteChnKQkwCisjZW5kaWYKKwogLy8gQ09ORklHX1VTQl9HQURHRVRfU1gyCiAvLyBDT05GSUdfVVNCX0dBREdFVF9BVTFYMDAKIC8vIC4uLgogCisKKy8qKgorICogdXNiX2dhZGdldF9jb250cm9sbGVyX251bWJlciAtIHN1cHBvcnQgYmNkRGV2aWNlIGlkIGNvbnZlbnRpb24KKyAqIEBnYWRnZXQ6IHRoZSBjb250cm9sbGVyIGJlaW5nIGRyaXZlbgorICoKKyAqIFJldHVybiBhIDItZGlnaXQgQkNEIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGVyaXBoZXJhbCBjb250cm9sbGVyLAorICogc3VpdGFibGUgZm9yIHVzZSBhcyBwYXJ0IG9mIGEgYmNkRGV2aWNlIHZhbHVlLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKgorICogTk9URTogIHRoaXMgY29udmVudGlvbiBpcyBwdXJlbHkgb3B0aW9uYWwsIGFuZCBoYXMgbm8gbWVhbmluZyBpbiB0ZXJtcyBvZgorICogYW55IFVTQiBzcGVjaWZpY2F0aW9uLiAgSWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGNvbnZlbnRpb24gaW4geW91cgorICogZ2FkZ2V0IGRyaXZlciBmaXJtd2FyZSAtLSBtYXliZSBhIG1vcmUgZm9ybWFsIHJldmlzaW9uIElEIC0tIGZlZWwgZnJlZS4KKyAqCisgKiBIb3N0cyBzZWUgdGhlc2UgYmNkRGV2aWNlIG51bWJlcnMsIGFuZCBhcmUgYWxsb3dlZCAoYnV0IG5vdCBlbmNvdXJhZ2VkISkKKyAqIHRvIGNoYW5nZSB0aGVpciBiZWhhdmlvciBhY2NvcmRpbmdseS4gIEZvciBleGFtcGxlIGl0IG1pZ2h0IGhlbHAgYXZvaWRpbmcKKyAqIHNvbWUgY2hpcCBidWcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9nYWRnZXRfY29udHJvbGxlcl9udW1iZXIoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlpZiAoZ2FkZ2V0X2lzX25ldDIyODAoZ2FkZ2V0KSkKKwkJcmV0dXJuIDB4MDE7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX2R1bW15KGdhZGdldCkpCisJCXJldHVybiAweDAyOworCWVsc2UgaWYgKGdhZGdldF9pc19weGEoZ2FkZ2V0KSkKKwkJcmV0dXJuIDB4MDM7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX3NoKGdhZGdldCkpCisJCXJldHVybiAweDA0OworCWVsc2UgaWYgKGdhZGdldF9pc19zYTExMDAoZ2FkZ2V0KSkKKwkJcmV0dXJuIDB4MDU7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX2dva3UoZ2FkZ2V0KSkKKwkJcmV0dXJuIDB4MDY7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX21xMTF4eChnYWRnZXQpKQorCQlyZXR1cm4gMHgwNzsKKwllbHNlIGlmIChnYWRnZXRfaXNfb21hcChnYWRnZXQpKQorCQlyZXR1cm4gMHgwODsKKwllbHNlIGlmIChnYWRnZXRfaXNfbGg3YTQweChnYWRnZXQpKQorCQlyZXR1cm4gMHgwOTsKKwllbHNlIGlmIChnYWRnZXRfaXNfbjk2MDQoZ2FkZ2V0KSkKKwkJcmV0dXJuIDB4MTA7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX3B4YTI3eChnYWRnZXQpKQorCQlyZXR1cm4gMHgxMTsKKwllbHNlIGlmIChnYWRnZXRfaXNfczNjMjQxMChnYWRnZXQpKQorCQlyZXR1cm4gMHgxMjsKKwllbHNlIGlmIChnYWRnZXRfaXNfYXQ5MShnYWRnZXQpKQorCQlyZXR1cm4gMHgxMzsKKwllbHNlIGlmIChnYWRnZXRfaXNfaW14KGdhZGdldCkpCisJCXJldHVybiAweDE0OworCXJldHVybiAtRU5PRU5UOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCmluZGV4IDllNGYxYzYuLmM5MjVkOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKQEAgLTE0MjIsNDkgKzE0MjIsMjAgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCB1c2JfZXAgKmVwOwogCXN0cnVjdCBnc19kZXYgKmRldjsKKwlpbnQgZ2NudW07CiAKLQkvKiBkZXZpY2Ugc3BlY2lmaWMgKi8KLQlpZiAoZ2FkZ2V0X2lzX25ldDIyODAoZ2FkZ2V0KSkgewotCQlnc19kZXZpY2VfZGVzYy5iY2REZXZpY2UgPQotCQkJX19jb25zdGFudF9jcHVfdG9fbGUxNihHU19WRVJTSU9OX05VTXwweDAwMDEpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3B4YShnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAwMik7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfc2goZ2FkZ2V0KSkgewotCQlnc19kZXZpY2VfZGVzYy5iY2REZXZpY2UgPQotCQkJX19jb25zdGFudF9jcHVfdG9fbGUxNihHU19WRVJTSU9OX05VTXwweDAwMDMpOwotCQkvKiBzaCBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgaW50ZXJmYWNlcyBvciBjb25maWdzICovCisJLyogU29tZSBjb250cm9sbGVycyBjYW4ndCBzdXBwb3J0IENEQyBBQ006CisJICogLSBzaCBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgaW50ZXJmYWNlcyBvciBjb25maWdzOworCSAqIC0gc2ExMTAwIGRvZXNuJ3QgaGF2ZSBhIHRoaXJkIGludGVycnVwdCBlbmRwb2ludAorCSAqLworCWlmIChnYWRnZXRfaXNfc2goZ2FkZ2V0KSB8fCBnYWRnZXRfaXNfc2ExMTAwKGdhZGdldCkpCiAJCXVzZV9hY20gPSAwOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3NhMTEwMChnYWRnZXQpKSB7CisKKwlnY251bSA9IHVzYl9nYWRnZXRfY29udHJvbGxlcl9udW1iZXIoZ2FkZ2V0KTsKKwlpZiAoZ2NudW0gPj0gMCkKIAkJZ3NfZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0KLQkJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoR1NfVkVSU0lPTl9OVU18MHgwMDA0KTsKLQkJLyogc2ExMTAwIGRvZXNuJ3Qgc3VwcG9ydCBuZWNlc3NhcnkgZW5kcG9pbnRzICovCi0JCXVzZV9hY20gPSAwOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX2dva3UoZ2FkZ2V0KSkgewotCQlnc19kZXZpY2VfZGVzYy5iY2REZXZpY2UgPQotCQkJX19jb25zdGFudF9jcHVfdG9fbGUxNihHU19WRVJTSU9OX05VTXwweDAwMDUpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX21xMTF4eChnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAwNik7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfb21hcChnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAwNyk7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfbGg3YTQweChnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAwOCk7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfbjk2MDQoZ2FkZ2V0KSkgewotCQlnc19kZXZpY2VfZGVzYy5iY2REZXZpY2UgPQotCQkJX19jb25zdGFudF9jcHVfdG9fbGUxNihHU19WRVJTSU9OX05VTXwweDAwMDkpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3B4YTI3eChnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAxMSk7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfczNjMjQxMChnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAxMik7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfYXQ5MShnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAxMyk7Ci0JfSBlbHNlIHsKKwkJCQljcHVfdG9fbGUxNihHU19WRVJTSU9OX05VTSB8IGdjbnVtKTsKKwllbHNlIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiZ3NfYmluZDogY29udHJvbGxlciAnJXMnIG5vdCByZWNvZ25pemVkXG4iLAogCQkJZ2FkZ2V0LT5uYW1lKTsKIAkJLyogdW5yZWNvZ25pemVkLCBidXQgc2FmZSB1bmxlc3MgYnVsayBpcyBSRUFMTFkgcXVpcmt5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYwppbmRleCBiYjliMmQ5Li42ODkwZTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMKQEAgLTExMzksNiArMTEzOSwxMyBAQAogewogCXN0cnVjdCB6ZXJvX2RldgkJKmRldjsKIAlzdHJ1Y3QgdXNiX2VwCQkqZXA7CisJaW50CQkJZ2NudW07CisKKwkvKiBGSVhNRSB0aGlzIGNhbid0IHlldCB3b3JrIHJpZ2h0IHdpdGggU0ggLi4uIGl0IGhhcyBvbmx5CisJICogb25lIGNvbmZpZ3VyYXRpb24sIG51bWJlcmVkIG9uZS4KKwkgKi8KKwlpZiAoZ2FkZ2V0X2lzX3NoKGdhZGdldCkpCisJCXJldHVybiAtRU5PREVWOwogCiAJLyogQnVsay1vbmx5IGRyaXZlcnMgbGlrZSB0aGlzIG9uZSBTSE9VTEQgYmUgYWJsZSB0bwogCSAqIGF1dG9jb25maWd1cmUgb24gYW55IHNhbmUgdXNiIGNvbnRyb2xsZXIgZHJpdmVyLApAQCAtMTE2MSw0MyArMTE2OCwxMCBAQAogCUVQX09VVF9OQU1FID0gZXAtPm5hbWU7CiAJZXAtPmRyaXZlcl9kYXRhID0gZXA7CS8qIGNsYWltICovCiAKLQotCS8qCi0JICogRFJJVkVSIFBPTElDWSBDSE9JQ0U6ICB5b3UgbWF5IHdhbnQgdG8gZG8gdGhpcyBkaWZmZXJlbnRseS4KLQkgKiBPbmUgdGhpbmcgdG8gYXZvaWQgaXMgcmV1c2luZyBhIGJjZERldmljZSByZXZpc2lvbiBjb2RlCi0JICogd2l0aCBkaWZmZXJlbnQgaG9zdC12aXNpYmxlIGNvbmZpZ3VyYXRpb25zIG9yIGJlaGF2aW9yCi0JICogcmVzdHJpY3Rpb25zIC0tIHVzaW5nIGVwMWluL2VwMm91dCB2cyBlcDFvdXQvZXAzaW4sIGV0YwotCSAqLwotCWlmIChnYWRnZXRfaXNfbmV0MjI4MCAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDEpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3B4YSAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDMpOwotI2lmIDAKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19zaChnYWRnZXQpKSB7Ci0JCWRldmljZV9kZXNjLmJjZERldmljZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDB4MDIwNCk7Ci0JCS8qIFNIIGhhcyBvbmx5IG9uZSBjb25maWd1cmF0aW9uOyBzZWUgImxvb3BkZWZhdWx0IiAqLwotCQlkZXZpY2VfZGVzYy5iTnVtQ29uZmlndXJhdGlvbnMgPSAxOwotCQkvKiBGSVhNRSBtYWtlIDEgPT0gZGVmYXVsdC5iQ29uZmlndXJhdGlvblZhbHVlICovCi0jZW5kaWYKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19zYTExMDAgKGdhZGdldCkpIHsKLQkJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNiAoMHgwMjA1KTsKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19nb2t1IChnYWRnZXQpKSB7Ci0JCWRldmljZV9kZXNjLmJjZERldmljZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDB4MDIwNik7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfbXExMXh4IChnYWRnZXQpKSB7Ci0JCWRldmljZV9kZXNjLmJjZERldmljZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDB4MDIwNyk7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfb21hcCAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDgpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX2xoN2E0MHgoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDkpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX245NjA0KGdhZGdldCkpIHsKLQkJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNiAoMHgwMjEwKTsKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19weGEyN3goZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMTEpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3MzYzI0MTAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMTIpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX2F0OTEoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMTMpOwotCX0gZWxzZSB7CisJZ2NudW0gPSB1c2JfZ2FkZ2V0X2NvbnRyb2xsZXJfbnVtYmVyIChnYWRnZXQpOworCWlmIChnY251bSA+PSAwKQorCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBjcHVfdG9fbGUxNiAoMHgwMjAwICsgZ2NudW0pOworCWVsc2UgewogCQkvKiBnYWRnZXQgemVybyBpcyBzbyBzaW1wbGUgKGZvciBub3csIG5vIGFsdHNldHRpbmdzKSB0aGF0CiAJCSAqIGl0IFNIT1VMRCBOT1QgaGF2ZSBwcm9ibGVtcyB3aXRoIGJ1bGstY2FwYWJsZSBoYXJkd2FyZS4KIAkJICogc28gd2FybiBhYm91dCB1bnJjb2duaXplZCBjb250cm9sbGVycywgZG9uJ3QgcGFuaWMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMKaW5kZXggYjAxZWZiNi4uNjVhYzlmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYwpAQCAtNjQxLDcgKzY0MSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmVoY2ktPmxvY2ssIGZsYWdzKTsKIAotCWlmIChidXMtPmNvbnRyb2xsZXItPnBvd2VyLnBvd2VyX3N0YXRlKSB7CisJaWYgKGJ1cy0+Y29udHJvbGxlci0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpIHsKIAkJc2l6ZSA9IHNjbnByaW50ZiAobmV4dCwgc2l6ZSwKIAkJCSJidXMgJXMsIGRldmljZSAlcyAoZHJpdmVyICIgRFJJVkVSX1ZFUlNJT04gIilcbiIKIAkJCSIlc1xuIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCmluZGV4IDE0OWIxM2YuLjI1MDdlODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKQEAgLTU0OSw3ICs1NDksOSBAQAogCQloY2QtPmNhbl93YWtldXAgPSAocG9ydF93YWtlICYgMSkgIT0gMDsKIAogCQkvKiBoZWxwIGhjIGRtYSB3b3JrIHdlbGwgd2l0aCBjYWNoZWxpbmVzICovCi0JCXBjaV9zZXRfbXdpIChwZGV2KTsKKwkJcmV0dmFsID0gcGNpX3NldF9td2kocGRldik7CisJCWlmIChyZXR2YWwpCisJCQllaGNpX2RiZyhlaGNpLCAidW5hYmxlIHRvIGVuYWJsZSBNV0kgLSBub3QgZmF0YWwuXG4iKTsKIAl9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKaW5kZXggMjBkZjAxYS4uOTQwZDM4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCkBAIC02NzcsNiArNjc3LDkgQEAKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CiAJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgdXNiX3R0CSp0dCA9IHVyYi0+ZGV2LT50dDsKKwkJCWludAkJdGhpbmtfdGltZTsKKwogCQkJLyogZ2FwIGlzIGYoRlMvTFMgdHJhbnNmZXIgdGltZXMpICovCiAJCQlxaC0+Z2FwX3VmID0gMSArIHVzYl9jYWxjX2J1c190aW1lICh1cmItPmRldi0+c3BlZWQsCiAJCQkJCWlzX2lucHV0LCAwLCBtYXhwKSAvICgxMjUgKiAxMDAwKTsKQEAgLTY5MCw2ICs2OTMsMTAgQEAKIAkJCQlxaC0+Y191c2VjcyA9IEhTX1VTRUNTICgwKTsKIAkJCX0KIAorCQkJdGhpbmtfdGltZSA9IHR0ID8gdHQtPnRoaW5rX3RpbWUgOiAwOworCQkJcWgtPnR0X3VzZWNzID0gTlNfVE9fVVMgKHRoaW5rX3RpbWUgKworCQkJCQl1c2JfY2FsY19idXNfdGltZSAodXJiLT5kZXYtPnNwZWVkLAorCQkJCQlpc19pbnB1dCwgMCwgbWF4X3BhY2tldCAobWF4cCkpKTsKIAkJCXFoLT5wZXJpb2QgPSB1cmItPmludGVydmFsOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc2NoZWQuYwppbmRleCBiNTZmMjU4Li5jY2M3MzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc2NoZWQuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc2NoZWQuYwpAQCAtNjM4LDcgKzYzOCw3IEBACiB7CiAJc3RydWN0IGVoY2lfaXNvX3N0cmVhbSAqc3RyZWFtOwogCi0Jc3RyZWFtID0ga2NhbGxvYygxLCBzaXplb2YgKnN0cmVhbSwgbWVtX2ZsYWdzKTsKKwlzdHJlYW0gPSBremFsbG9jKHNpemVvZiAqc3RyZWFtLCBtZW1fZmxhZ3MpOwogCWlmIChsaWtlbHkgKHN0cmVhbSAhPSBOVUxMKSkgewogCQlJTklUX0xJU1RfSEVBRCgmc3RyZWFtLT50ZF9saXN0KTsKIAkJSU5JVF9MSVNUX0hFQUQoJnN0cmVhbS0+ZnJlZV9saXN0KTsKQEAgLTcwMCw2ICs3MDAsNyBAQAogCiAJfSBlbHNlIHsKIAkJdTMyCQlhZGRyOworCQlpbnQJCXRoaW5rX3RpbWU7CiAKIAkJYWRkciA9IGRldi0+dHRwb3J0IDw8IDI0OwogCQlpZiAoIWVoY2lfaXNfVERJKGVoY2kpCkBAIC03MDksNiArNzEwLDkgQEAKIAkJYWRkciB8PSBlcG51bSA8PCA4OwogCQlhZGRyIHw9IGRldi0+ZGV2bnVtOwogCQlzdHJlYW0tPnVzZWNzID0gSFNfVVNFQ1NfSVNPIChtYXhwKTsKKwkJdGhpbmtfdGltZSA9IGRldi0+dHQgPyBkZXYtPnR0LT50aGlua190aW1lIDogMDsKKwkJc3RyZWFtLT50dF91c2VjcyA9IE5TX1RPX1VTICh0aGlua190aW1lICsgdXNiX2NhbGNfYnVzX3RpbWUgKAorCQkJCWRldi0+c3BlZWQsIGlzX2lucHV0LCAxLCBtYXhwKSk7CiAJCWlmIChpc19pbnB1dCkgewogCQkJdTMyCXRtcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLmggYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaAppbmRleCBhNzU0MjE1Li4yMGM5YjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaApAQCAtNDIxLDYgKzQyMSw3IEBACiAJdTgJCQl1c2VjczsJCS8qIGludHIgYmFuZHdpZHRoICovCiAJdTgJCQlnYXBfdWY7CQkvKiB1ZnJhbWVzIHNwbGl0L2NzcGxpdCBnYXAgKi8KIAl1OAkJCWNfdXNlY3M7CS8qIC4uLiBzcGxpdCBjb21wbGV0aW9uIGJ3ICovCisJdTE2CQkJdHRfdXNlY3M7CS8qIHR0IGRvd25zdHJlYW0gYmFuZHdpZHRoICovCiAJdW5zaWduZWQgc2hvcnQJCXBlcmlvZDsJCS8qIHBvbGxpbmcgaW50ZXJ2YWwgKi8KIAl1bnNpZ25lZCBzaG9ydAkJc3RhcnQ7CQkvKiB3aGVyZSBwb2xsaW5nIHN0YXJ0cyAqLwogI2RlZmluZSBOT19GUkFNRSAoKHVuc2lnbmVkIHNob3J0KX4wKQkJCS8qIHBpY2sgbmV3IHN0YXJ0ICovCkBAIC00NzksNiArNDgwLDcgQEAKIAkgKi8KIAl1OAkJCWludGVydmFsOwogCXU4CQkJdXNlY3MsIGNfdXNlY3M7CisJdTE2CQkJdHRfdXNlY3M7CiAJdTE2CQkJbWF4cDsKIAl1MTYJCQlyYXdfbWFzazsKIAl1bnNpZ25lZAkJYmFuZHdpZHRoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9oY19jcmlzdjEwLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYwppbmRleCA4MWY4ZjZiLi5hODI2N2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYwpAQCAtMTc4LDggKzE3OCw4IEBACiAJMHhmZiAgIC8qICBfX3U4ICBQb3J0UHdyQ3RybE1hc2s7ICoqKiA3IHBvcnRzIG1heCAqKiogKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBidWxrX3N0YXJ0X3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoTlVMTCwgMCwgMCk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgYnVsa19lb3RfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoYnVsa19zdGFydF90aW1lciwgTlVMTCwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGJ1bGtfZW90X3RpbWVyLCBOVUxMLCAwLCAwKTsKIAogLyogV2Ugd2FudCB0aGUgc3RhcnQgdGltZXIgdG8gZXhwaXJlIGJlZm9yZSB0aGUgZW90IHRpbWVyLCBiZWNhdXNlIHRoZSBmb3JtZXIgbWlnaHQgc3RhcnQKICAgIHRyYWZmaWMsIHRodXMgbWFraW5nIGl0IHVubmVjZXNzYXJ5IGZvciB0aGUgbGF0dGVyIHRvIHRpbWUgb3V0LiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jCmluZGV4IDc2Y2I0OTYuLjQxYmJhZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNngtaGNkLmMKQEAgLTgzLDcgKzgzLDcgQEAKICNpbmNsdWRlICIuLi9jb3JlL2hjZC5oIgogI2luY2x1ZGUgImlzcDExNnguaCIKIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMDggQXByIDIwMDUiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwNSBBdWcgMjAwNSIKICNkZWZpbmUgRFJJVkVSX0RFU0MJIklTUDExNnggVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXIiCiAKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CkBAIC02MjksMTQgKzYyOSwxMiBAQAogCQkJRVJSKCJVbnJlY292ZXJhYmxlIGVycm9yXG4iKTsKIAkJCS8qIFdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/IFJlc2V0PyAgKi8KIAkJfQotCQlpZiAoaW50c3RhdCAmIEhDSU5UX1JIU0MpIHsKLQkJCWlzcDExNngtPnJoc3RhdHVzID0KLQkJCSAgICBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUyk7Ci0JCQlpc3AxMTZ4LT5yaHBvcnRbMF0gPQotCQkJICAgIGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEpOwotCQkJaXNwMTE2eC0+cmhwb3J0WzFdID0KLQkJCSAgICBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQyKTsKLQkJfQorCQlpZiAoaW50c3RhdCAmIEhDSU5UX1JIU0MpCisJCQkvKiBXaGVuIHJvb3QgaHViIG9yIGFueSBvZiBpdHMgcG9ydHMgaXMgZ29pbmcKKwkJCSAgIHRvIGNvbWUgb3V0IG9mIHN1c3BlbmQsIGl0IG1heSB0YWtlIG1vcmUKKwkJCSAgIHRoYW4gMTBtcyBmb3Igc3RhdHVzIGJpdHMgdG8gc3RhYmlsaXplLiAqLworCQkJbW9kX3RpbWVyKCZoY2QtPnJoX3RpbWVyLCBqaWZmaWVzCisJCQkJICArIG1zZWNzX3RvX2ppZmZpZXMoMjApICsgMSk7CiAJCWlmIChpbnRzdGF0ICYgSENJTlRfUkQpIHsKIAkJCURCRygiLS0tLSByZW1vdGUgd2FrZXVwXG4iKTsKIAkJCXNjaGVkdWxlX3dvcmsoJmlzcDExNngtPnJoX3Jlc3VtZSk7CkBAIC03MTcsNyArNzE1LDcgQEAKIAl9CiAJLyogYXZvaWQgYWxsIGFsbG9jYXRpb25zIHdpdGhpbiBzcGlubG9ja3M6IHJlcXVlc3Qgb3IgZW5kcG9pbnQgKi8KIAlpZiAoIWhlcC0+aGNwcml2KSB7Ci0JCWVwID0ga2NhbGxvYygxLCBzaXplb2YgKmVwLCBtZW1fZmxhZ3MpOworCQllcCA9IGt6YWxsb2Moc2l6ZW9mICplcCwgbWVtX2ZsYWdzKTsKIAkJaWYgKCFlcCkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTkyNSwyMCArOTIzLDI3IEBACiB7CiAJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSBoY2RfdG9faXNwMTE2eChoY2QpOwogCWludCBwb3J0cywgaSwgY2hhbmdlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghSENfSVNfUlVOTklORyhoY2QtPnN0YXRlKSkKIAkJcmV0dXJuIC1FU0hVVERPV047CiAKLQlwb3J0cyA9IGlzcDExNngtPnJoZGVzY2EgJiBSSF9BX05EUDsKKwkvKiBSZXBvcnQgbm8gc3RhdHVzIGNoYW5nZSBub3csIGlmIHdlIGFyZSBzY2hlZHVsZWQgdG8gYmUKKwkgICBjYWxsZWQgbGF0ZXIgKi8KKwlpZiAodGltZXJfcGVuZGluZygmaGNkLT5yaF90aW1lcikpCisJCXJldHVybiAwOwogCi0JLyogaW5pdCBzdGF0dXMgKi8KKwlwb3J0cyA9IGlzcDExNngtPnJoZGVzY2EgJiBSSF9BX05EUDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCWlzcDExNngtPnJoc3RhdHVzID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhTVEFUVVMpOwogCWlmIChpc3AxMTZ4LT5yaHN0YXR1cyAmIChSSF9IU19MUFNDIHwgUkhfSFNfT0NJQykpCiAJCWJ1ZlswXSA9IGNoYW5nZWQgPSAxOwogCWVsc2UKIAkJYnVmWzBdID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBwb3J0czsgaSsrKSB7Ci0JCXUzMiBzdGF0dXMgPSBpc3AxMTZ4LT5yaHBvcnRbaV07CisJCXUzMiBzdGF0dXMgPSBpc3AxMTZ4LT5yaHBvcnRbaV0gPQorCQkgICAgaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIGkgPyBIQ1JIUE9SVDIgOiBIQ1JIUE9SVDEpOwogCiAJCWlmIChzdGF0dXMgJiAoUkhfUFNfQ1NDIHwgUkhfUFNfUEVTQyB8IFJIX1BTX1BTU0MKIAkJCSAgICAgIHwgUkhfUFNfT0NJQyB8IFJIX1BTX1BSU0MpKSB7CkBAIC05NDcsNiArOTUyLDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gY2hhbmdlZDsKIH0KIApAQCAtMTQ2MywxMCArMTQ2OSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAgUmVzZXQuIFRyaWVzIHRvIHBlcmZvcm0gcGxhdGZvcm0tc3BlY2lmaWMgaGFyZHdhcmUKLSAgcmVzZXQgZmlyc3Q7IGZhbGxzIGJhY2sgdG8gc29mdHdhcmUgcmVzZXQuCi0qLwogc3RhdGljIGludCBpc3AxMTZ4X3Jlc2V0KHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSBoY2RfdG9faXNwMTE2eChoY2QpOwpAQCAtMTQ3NCwxNyArMTQ3Niw3IEBACiAJdTE2IGNsa3JkeSA9IDA7CiAJaW50IHJldCA9IDAsIHRpbWVvdXQgPSAxNSAvKiBtcyAqLyA7CiAKLQlpZiAoaXNwMTE2eC0+Ym9hcmQgJiYgaXNwMTE2eC0+Ym9hcmQtPnJlc2V0KSB7Ci0JCS8qIEhhcmR3YXJlIHJlc2V0ICovCi0JCWlzcDExNngtPmJvYXJkLT5yZXNldChoY2QtPnNlbGYuY29udHJvbGxlciwgMSk7Ci0JCW1zbGVlcCgxMCk7Ci0JCWlmIChpc3AxMTZ4LT5ib2FyZC0+Y2xvY2spCi0JCQlpc3AxMTZ4LT5ib2FyZC0+Y2xvY2soaGNkLT5zZWxmLmNvbnRyb2xsZXIsIDEpOwotCQltc2xlZXAoMSk7Ci0JCWlzcDExNngtPmJvYXJkLT5yZXNldChoY2QtPnNlbGYuY29udHJvbGxlciwgMCk7Ci0JfSBlbHNlCi0JCXJldCA9IGlzcDExNnhfc3dfcmVzZXQoaXNwMTE2eCk7Ci0KKwlyZXQgPSBpc3AxMTZ4X3N3X3Jlc2V0KGlzcDExNngpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTE1MDEsMTAgKzE0OTMsNyBAQAogCQlFUlIoIkNsb2NrIG5vdCByZWFkeSBhZnRlciAyMG1zXG4iKTsKIAkJLyogQWZ0ZXIgc3dfcmVzZXQgdGhlIGNsb2NrIHdvbid0IHJlcG9ydCB0byBiZSByZWFkeSwgaWYKIAkJICAgSF9XQUtFVVAgcGluIGlzIGhpZ2guICovCi0JCWlmICghaXNwMTE2eC0+Ym9hcmQgfHwgIWlzcDExNngtPmJvYXJkLT5yZXNldCkKLQkJCUVSUigiVGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGhhcmR3YXJlIHdha2V1cC5cbiIpOwotCQkJRVJSKCJQbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIEhfV0FLRVVQIHBpbiAiCi0JCQkJImlzIHB1bGxlZCBsb3chXG4iKTsKKwkJRVJSKCJQbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIEhfV0FLRVVQIHBpbiBpcyBwdWxsZWQgbG93IVxuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJfQogCXJldHVybiByZXQ7CkBAIC0xNTI3LDE1ICsxNTE2LDcgQEAKIAlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhTVEFUVVMsIFJIX0hTX0xQUyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOwogCi0JLyogUHV0IHRoZSBjaGlwIGludG8gcmVzZXQgc3RhdGUgKi8KLQlpZiAoaXNwMTE2eC0+Ym9hcmQgJiYgaXNwMTE2eC0+Ym9hcmQtPnJlc2V0KQotCQlpc3AxMTZ4LT5ib2FyZC0+cmVzZXQoaGNkLT5zZWxmLmNvbnRyb2xsZXIsIDApOwotCWVsc2UKLQkJaXNwMTE2eF9zd19yZXNldChpc3AxMTZ4KTsKLQotCS8qIFN0b3AgdGhlIGNsb2NrICovCi0JaWYgKGlzcDExNngtPmJvYXJkICYmIGlzcDExNngtPmJvYXJkLT5jbG9jaykKLQkJaXNwMTE2eC0+Ym9hcmQtPmNsb2NrKGhjZC0+c2VsZi5jb250cm9sbGVyLCAwKTsKKwlpc3AxMTZ4X3N3X3Jlc2V0KGlzcDExNngpOwogfQogCiAvKgpAQCAtMTU2MSw2ICsxNTQyLDkgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJLyogVG8gYmUgcmVtb3ZlZCBpbiBmdXR1cmUgKi8KKwloY2QtPnVzZXNfbmV3X3BvbGxpbmcgPSAxOworCiAJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ0lUTEJVRkxFTiwgSVNQMTE2eF9JVExfQlVGU0laRSk7CiAJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ0FUTEJVRkxFTiwgSVNQMTE2eF9BVExfQlVGU0laRSk7CiAKQEAgLTE1NjksNyArMTU1Myw3IEBACiAJaWYgKGJvYXJkLT5zZWwxNUtyZXMpCiAJCXZhbCB8PSBIQ0hXQ0ZHXzE1S1JTRUw7CiAJLyogUmVtb3RlIHdha2V1cCB3b24ndCB3b3JrIHdpdGhvdXQgd29ya2luZyBjbG9jayAqLwotCWlmIChib2FyZC0+Y2xrbm90c3RvcCB8fCBib2FyZC0+cmVtb3RlX3dha2V1cF9lbmFibGUpCisJaWYgKGJvYXJkLT5yZW1vdGVfd2FrZXVwX2VuYWJsZSkKIAkJdmFsIHw9IEhDSFdDRkdfQ0xLTk9UU1RPUDsKIAlpZiAoYm9hcmQtPm9jX2VuYWJsZSkKIAkJdmFsIHw9IEhDSFdDRkdfQU5BTE9HX09DOwpAQCAtMTU4MCwxNiArMTU2NCwxMyBAQAogCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSENIV0NGRywgdmFsKTsKIAogCS8qIC0tLS0tIFJvb3QgaHViIGNvbmYgKi8KLQl2YWwgPSAwOwotCS8qIEFOMTAwMDNfMS5wZGYgcmVjb21tZW5kcyBOUFMgdG8gYmUgYWx3YXlzIDEgKi8KLQlpZiAoYm9hcmQtPm5vX3Bvd2VyX3N3aXRjaGluZykKLQkJdmFsIHw9IFJIX0FfTlBTOwotCWlmIChib2FyZC0+cG93ZXJfc3dpdGNoaW5nX21vZGUpCi0JCXZhbCB8PSBSSF9BX1BTTTsKLQlpZiAoYm9hcmQtPnBvdHBnKQotCQl2YWwgfD0gKGJvYXJkLT5wb3RwZyA8PCAyNCkgJiBSSF9BX1BPVFBHVDsKLQllbHNlCi0JCXZhbCB8PSAoMjUgPDwgMjQpICYgUkhfQV9QT1RQR1Q7CisJdmFsID0gKDI1IDw8IDI0KSAmIFJIX0FfUE9UUEdUOworCS8qIEFOMTAwMDNfMS5wZGYgcmVjb21tZW5kcyBSSF9BX05QUyAobm8gcG93ZXIgc3dpdGNoaW5nKSB0bworCSAgIGJlIGFsd2F5cyBzZXQuIFlldCwgaW5zdGVhZCwgd2UgcmVxdWVzdCBpbmRpdmlkdWFsIHBvcnQKKwkgICBwb3dlciBzd2l0Y2hpbmcuICovCisJdmFsIHw9IFJIX0FfUFNNOworCS8qIFJlcG9ydCBvdmVyY3VycmVudCBwZXIgcG9ydCAqLworCXZhbCB8PSBSSF9BX09DUE07CiAJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0EsIHZhbCk7CiAJaXNwMTE2eC0+cmhkZXNjYSA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0EpOwogCkBAIC0xNjE5LDkgKzE2MDAsNiBAQAogCiAJLyogR28gb3BlcmF0aW9uYWwgKi8KIAl2YWwgPSBIQ0NPTlRST0xfVVNCX09QRVI7Ci0JLyogUmVtb3RlIHdha2V1cCBjb25uZWN0ZWQgLSBOT1QgU1VQUE9SVEVEICovCi0JLyogIGlmIChib2FyZC0+cmVtb3RlX3dha2V1cF9jb25uZWN0ZWQpCi0JICAgdmFsIHw9IEhDQ09OVFJPTF9SV0M7ICAqLwogCWlmIChib2FyZC0+cmVtb3RlX3dha2V1cF9lbmFibGUpCiAJCXZhbCB8PSBIQ0NPTlRST0xfUldFOwogCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENDT05UUk9MLCB2YWwpOwpAQCAtMTY3MCw3ICsxNjQ4LDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCi0JaWYoIWhjZCkKKwlpZiAoIWhjZCkKIAkJcmV0dXJuIDA7CiAJaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CiAJcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktZGJnLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktZGJnLmMKaW5kZXggYzU4NDA4Yy4uNDQ3ZjQ4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWRiZy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1kYmcuYwpAQCAtNjMxLDcgKzYzMSw3IEBACiAJCWhjZC0+cHJvZHVjdF9kZXNjLAogCQloY2RfbmFtZSk7CiAKLQlpZiAoYnVzLT5jb250cm9sbGVyLT5wb3dlci5wb3dlcl9zdGF0ZSkgeworCWlmIChidXMtPmNvbnRyb2xsZXItPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50KSB7CiAJCXNpemUgLT0gc2NucHJpbnRmIChuZXh0LCBzaXplLAogCQkJIlNVU1BFTkRFRCAobm8gcmVnaXN0ZXIgYWNjZXNzKVxuIik7CiAJCWdvdG8gZG9uZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtc29jLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLXNvYy5jCmluZGV4IDE3OTY0YzMuLjI1MTUzMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtc29jLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1zb2MuYwpAQCAtMTQsOCArMTQsNiBAQAogICogVGhpcyBmaWxlIGlzIGxpY2VuY2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KIAotI2luY2x1ZGUgPGFzbS91c2IuaD4KLQogLyogY29uZmlndXJlIHNvIGFuIEhDIGRldmljZSBhbmQgaWQgYXJlIGFsd2F5cyBwcm92aWRlZCAqLwogLyogYWx3YXlzIGNhbGxlZCB3aXRoIHByb2Nlc3MgY29udGV4dDsgc2xlZXBpbmcgaXMgT0sgKi8KIApAQCAtMjMsOSArMjEsNyBAQAogICogdXNiX2hjZF9wcGNfc29jX3Byb2JlIC0gaW5pdGlhbGl6ZSBPbi1DaGlwIEhDRHMKICAqIENvbnRleHQ6ICFpbl9pbnRlcnJ1cHQoKQogICoKLSAqIEFsbG9jYXRlcyBiYXNpYyByZXNvdXJjZXMgZm9yIHRoaXMgVVNCIGhvc3QgY29udHJvbGxlciwgYW5kCi0gKiB0aGVuIGludm9rZXMgdGhlIHN0YXJ0KCkgbWV0aG9kIGZvciB0aGUgSENEIGFzc29jaWF0ZWQgd2l0aCBpdAotICogdGhyb3VnaCB0aGUgaG90cGx1ZyBlbnRyeSdzIGRyaXZlcl9kYXRhLgorICogQWxsb2NhdGVzIGJhc2ljIHJlc291cmNlcyBmb3IgdGhpcyBVU0IgaG9zdCBjb250cm9sbGVyLgogICoKICAqIFN0b3JlIHRoaXMgZnVuY3Rpb24gaW4gdGhlIEhDRCdzIHN0cnVjdCBwY2lfZHJpdmVyIGFzIHByb2JlKCkuCiAgKi8KQEAgLTM3LDcgKzMzLDYgQEAKIAlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2k7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IGlycTsKLQlzdHJ1Y3QgdXNiX2hjZF9wbGF0Zm9ybV9kYXRhICpwZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAJcHJfZGVidWcoImluaXRpYWxpemluZyBQUEMtU09DIFVTQiBDb250cm9sbGVyXG4iKTsKIApAQCAtNzMsOSArNjgsNiBAQAogCQlnb3RvIGVycjI7CiAJfQogCi0JaWYgKHBkLT5zdGFydCAmJiAocmV0dmFsID0gcGQtPnN0YXJ0KHBkZXYpKSkKLQkJZ290byBlcnIzOwotCiAJb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CiAJb2hjaS0+ZmxhZ3MgfD0gT0hDSV9CSUdfRU5ESUFOOwogCW9oY2lfaGNkX2luaXQob2hjaSk7CkBAIC04NSw5ICs3Nyw3IEBACiAJCXJldHVybiByZXR2YWw7CiAKIAlwcl9kZWJ1ZygiUmVtb3ZpbmcgUFBDLVNPQyBVU0IgQ29udHJvbGxlclxuIik7Ci0JaWYgKHBkICYmIHBkLT5zdG9wKQotCQlwZC0+c3RvcChwZGV2KTsKLSBlcnIzOgorCiAJaW91bm1hcChoY2QtPnJlZ3MpOwogIGVycjI6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CkBAIC0xMDUsMjUgKzk1LDIxIEBACiAgKiBAcGRldjogVVNCIEhvc3QgQ29udHJvbGxlciBiZWluZyByZW1vdmVkCiAgKiBDb250ZXh0OiAhaW5faW50ZXJydXB0KCkKICAqCi0gKiBSZXZlcnNlcyB0aGUgZWZmZWN0IG9mIHVzYl9oY2RfcHBjX3NvY19wcm9iZSgpLCBmaXJzdCBpbnZva2luZwotICogdGhlIEhDRCdzIHN0b3AoKSBtZXRob2QuICBJdCBpcyBhbHdheXMgY2FsbGVkIGZyb20gYSB0aHJlYWQKKyAqIFJldmVyc2VzIHRoZSBlZmZlY3Qgb2YgdXNiX2hjZF9wcGNfc29jX3Byb2JlKCkuCisgKiBJdCBpcyBhbHdheXMgY2FsbGVkIGZyb20gYSB0aHJlYWQKICAqIGNvbnRleHQsIG5vcm1hbGx5ICJybW1vZCIsICJhcG1kIiwgb3Igc29tZXRoaW5nIHNpbWlsYXIuCiAgKgogICovCiBzdGF0aWMgdm9pZCB1c2JfaGNkX3BwY19zb2NfcmVtb3ZlKHN0cnVjdCB1c2JfaGNkICpoY2QsCiAJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHVzYl9oY2RfcGxhdGZvcm1fZGF0YSAqcGQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQogCXVzYl9yZW1vdmVfaGNkKGhjZCk7CiAKIAlwcl9kZWJ1Zygic3RvcHBpbmcgUFBDLVNPQyBVU0IgQ29udHJvbGxlclxuIik7Ci0JaWYgKHBkICYmIHBkLT5zdG9wKQotCQlwZC0+c3RvcChwZGV2KTsKIAogCWlvdW5tYXAoaGNkLT5yZWdzKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKLQl1c2JfaGNkX3B1dChoY2QpOworCXVzYl9wdXRfaGNkKGhjZCk7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktczNjMjQxMC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXMzYzI0MTAuYwppbmRleCBlOTQwMTY2Li4zZDliY2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zM2MyNDEwLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCiAJaWYgKGluZm8tPnBvd2VyX2NvbnRyb2wgIT0gTlVMTCkgewogCQlpbmZvLT5wb3J0W3BvcnQtMV0ucG93ZXIgPSB0bzsKLQkJKGluZm8tPnBvd2VyX2NvbnRyb2wpKHBvcnQsIHRvKTsKKwkJKGluZm8tPnBvd2VyX2NvbnRyb2wpKHBvcnQtMSwgdG8pOwogCX0KIH0KIApAQCAtMzM5LDggKzMzOSw4IEBACiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IE5VTEw7CiAJaW50IHJldHZhbDsKIAotCXMzYzI0MTBfdXNiX3NldF9wb3dlcihkZXYtPmRldi5wbGF0Zm9ybV9kYXRhLCAwLCAxKTsKIAlzM2MyNDEwX3VzYl9zZXRfcG93ZXIoZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwgMSwgMSk7CisJczNjMjQxMF91c2Jfc2V0X3Bvd2VyKGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsIDIsIDEpOwogCiAJaGNkID0gdXNiX2NyZWF0ZV9oY2QoZHJpdmVyLCAmZGV2LT5kZXYsICJzM2MyNHh4Iik7CiAJaWYgKGhjZCA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9zbDgxMS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMKaW5kZXggN2E4OTBhNi4uZDJhMWZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9zbDgxMS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3NsODExLWhjZC5jCkBAIC04MzUsNyArODM1LDcgQEAKIAogCS8qIGF2b2lkIGFsbCBhbGxvY2F0aW9ucyB3aXRoaW4gc3BpbmxvY2tzICovCiAJaWYgKCFoZXAtPmhjcHJpdikKLQkJZXAgPSBrY2FsbG9jKDEsIHNpemVvZiAqZXAsIG1lbV9mbGFncyk7CisJCWVwID0ga3phbGxvYyhzaXplb2YgKmVwLCBtZW1fZmxhZ3MpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNsODExLT5sb2NrLCBmbGFncyk7CiAKQEAgLTE3ODEsOSArMTc4MSw5IEBACiAJaWYgKHBoYXNlICE9IFNVU1BFTkRfUE9XRVJfRE9XTikKIAkJcmV0dXJuIHJldHZhbDsKIAotCWlmIChzdGF0ZSA8PSBQTV9TVVNQRU5EX01FTSkKKwlpZiAoc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfRlJFRVpFKQogCQlyZXR2YWwgPSBzbDgxMWhfaHViX3N1c3BlbmQoaGNkKTsKLQllbHNlCisJZWxzZSBpZiAoc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkKIAkJcG9ydF9wb3dlcihzbDgxMSwgMCk7CiAJaWYgKHJldHZhbCA9PSAwKQogCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CkBAIC0xODAyLDcgKzE4MDIsNyBAQAogCS8qIHdpdGggbm8gImNoZWNrIHRvIHNlZSBpZiBWQlVTIGlzIHN0aWxsIHBvd2VyZWQiIGJvYXJkIGhvb2ssCiAJICogbGV0J3MgYXNzdW1lIGl0J2Qgb25seSBiZSBwb3dlcmVkIHRvIGVuYWJsZSByZW1vdGUgd2FrZXVwLgogCSAqLwotCWlmIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID4gUE1fU1VTUEVORF9NRU0KKwlpZiAoZGV2LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9TVVNQRU5ECiAJCQl8fCAhaGNkLT5jYW5fd2FrZXVwKSB7CiAJCXNsODExLT5wb3J0MSA9IDA7CiAJCXBvcnRfcG93ZXIoc2w4MTEsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKaW5kZXggMjk4ZTRhMi4uNDgyYzRiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCkBAIC0yMzAsNiArMjMwLDIwIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0b3VjaGtpdHVzYi4KIAorY29uZmlnIFVTQl9ZRUFMSU5LCisJdHJpc3RhdGUgIlllYWxpbmsgdXNiLXAxayB2b2lwIHBob25lIgorCWRlcGVuZHMgb24gVVNCICYmIElOUFVUICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGtleWJvYXJkIGFuZCBMQ0QgZnVuY3Rpb25zIG9mIHRoZQorCSAgWWVhbGluayB1c2ItcDFrIHVzYiBwaG9uZXMuIFRoZSBhdWRpbyBwYXJ0IGlzIGVuYWJsZWQgYnkgdGhlIGdlbmVyaWMKKwkgIHVzYiBzb3VuZCBkcml2ZXIsIHNvIHlvdSBtaWdodCB3YW50IHRvIGVuYWJsZSB0aGF0IGFzIHdlbGwuCisKKwkgIEZvciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gdXNlIHRoZXNlIGFkZGl0aW9uYWwgZnVuY3Rpb25zLCBzZWUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vaW5wdXQveWVhbGluay50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB5ZWFsaW5rLgorCiBjb25maWcgVVNCX1hQQUQKIAl0cmlzdGF0ZSAiWC1Cb3ggZ2FtZXBhZCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCICYmIElOUFVUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2lucHV0L01ha2VmaWxlCmluZGV4IGYxNTQ3YmUuLjQzYjJmOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L01ha2VmaWxlCkBAIC0zOSw0ICszOSw1IEBACiBvYmotJChDT05GSUdfVVNCX1BPV0VSTUFURSkJKz0gcG93ZXJtYXRlLm8KIG9iai0kKENPTkZJR19VU0JfV0FDT00pCQkrPSB3YWNvbS5vCiBvYmotJChDT05GSUdfVVNCX0FDRUNBRCkJKz0gYWNlY2FkLm8KK29iai0kKENPTkZJR19VU0JfWUVBTElOSykJKz0geWVhbGluay5vCiBvYmotJChDT05GSUdfVVNCX1hQQUQpCQkrPSB4cGFkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2FjZWNhZC5jIGIvZHJpdmVycy91c2IvaW5wdXQvYWNlY2FkLmMKaW5kZXggMTM1MzJmMy4uNzRmODc2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvYWNlY2FkLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvYWNlY2FkLmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCXBpcGUgPSB1c2JfcmN2aW50cGlwZShkZXYsIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKIAltYXhwID0gdXNiX21heHBhY2tldChkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKIAotCWFjZWNhZCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB1c2JfYWNlY2FkKSwgR0ZQX0tFUk5FTCk7CisJYWNlY2FkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9hY2VjYWQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFjZWNhZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCmluZGV4IGIyY2IyYjMuLmUxMDhlMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYwpAQCAtMiw3ICsyLDggQEAKICAqICBVU0IgSElEIHN1cHBvcnQgZm9yIExpbnV4CiAgKgogICogIENvcHlyaWdodCAoYykgMTk5OSBBbmRyZWFzIEdhbAotICogIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKICAqLwogCiAvKgpAQCAtMzgsNyArMzksNyBAQAogICogVmVyc2lvbiBJbmZvcm1hdGlvbgogICovCiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjAxIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjIuNiIKICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQW5kcmVhcyBHYWwsIFZvanRlY2ggUGF2bGlrIgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIEhJRCBjb3JlIGRyaXZlciIKICNkZWZpbmUgRFJJVkVSX0xJQ0VOU0UgIkdQTCIKQEAgLTEwNTgsOCArMTA1OSw4IEBACiAJCWlmIChtYXhwYWNrZXQgPiAwKSB7CiAJCQlwYWRsZW4gPSAobGVuICsgbWF4cGFja2V0IC0gMSkgLyBtYXhwYWNrZXQ7CiAJCQlwYWRsZW4gKj0gbWF4cGFja2V0OwotCQkJaWYgKHBhZGxlbiA+IEhJRF9CVUZGRVJfU0laRSkKLQkJCQlwYWRsZW4gPSBISURfQlVGRkVSX1NJWkU7CisJCQlpZiAocGFkbGVuID4gaGlkLT5idWZzaXplKQorCQkJCXBhZGxlbiA9IGhpZC0+YnVmc2l6ZTsKIAkJfSBlbHNlCiAJCQlwYWRsZW4gPSAwOwogCQloaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBwYWRsZW47CkBAIC0xMDk2LDYgKzEwOTcsNyBAQAogCiAJc3dpdGNoICh1cmItPnN0YXR1cykgewogCQljYXNlIDA6CQkJLyogc3VjY2VzcyAqLworCQkJYnJlYWs7CiAJCWNhc2UgLUVTSFVURE9XTjoJLyogdW5wbHVnICovCiAJCWNhc2UgLUVJTFNFUToJCS8qIHVucGx1ZyB0aW1lb3V0IG9uIHVoY2kgKi8KIAkJCXVucGx1ZyA9IDE7CkBAIC0xMTQzLDYgKzExNDUsNyBAQAogCQljYXNlIDA6CQkJLyogc3VjY2VzcyAqLwogCQkJaWYgKGhpZC0+Y3RybFtoaWQtPmN0cmx0YWlsXS5kaXIgPT0gVVNCX0RJUl9JTikKIAkJCQloaWRfaW5wdXRfcmVwb3J0KGhpZC0+Y3RybFtoaWQtPmN0cmx0YWlsXS5yZXBvcnQtPnR5cGUsIHVyYiwgMCwgcmVncyk7CisJCQlicmVhazsKIAkJY2FzZSAtRVNIVVRET1dOOgkvKiB1bnBsdWcgKi8KIAkJY2FzZSAtRUlMU0VROgkJLyogdW5wbHVnIHRpbWVjdHJsIG9uIHVoY2kgKi8KIAkJCXVucGx1ZyA9IDE7CkBAIC0xMjg0LDEzICsxMjg3LDggQEAKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwogCWludCBlcnIsIHJldDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVtISURfSU5QVVRfUkVQT1JUXS5yZXBvcnRfbGlzdCwgbGlzdCkgewotCQlpbnQgc2l6ZSA9ICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxICsgaGlkLT5yZXBvcnRfZW51bVtISURfSU5QVVRfUkVQT1JUXS5udW1iZXJlZDsKLQkJaWYgKHNpemUgPiBISURfQlVGRkVSX1NJWkUpIHNpemUgPSBISURfQlVGRkVSX1NJWkU7Ci0JCWlmIChzaXplID4gaGlkLT51cmJpbi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCkKLQkJCWhpZC0+dXJiaW4tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBzaXplOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVtISURfSU5QVVRfUkVQT1JUXS5yZXBvcnRfbGlzdCwgbGlzdCkKIAkJaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfSU4pOwotCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVtISURfRkVBVFVSRV9SRVBPUlRdLnJlcG9ydF9saXN0LCBsaXN0KQogCQloaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9JTik7CkBAIC0xMzcyLDEyICsxMzcwLDE0IEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQTRURUNICQkweDA5ZGEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BNFRFQ0hfV0NQMzJQVQkweDAwMDYKIAotI2RlZmluZSBVU0JfVkVORE9SX0lEX0FBU0hJTUEJCTB4MDZENgorI2RlZmluZSBVU0JfVkVORE9SX0lEX0FBU0hJTUEJCTB4MDZkNgogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FBU0hJTUFfR0FNRVBBRAkweDAwMjUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BQVNISU1BX1BSRURBVE9SCTB4MDAyNgogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ1lQUkVTUwkJMHgwNGI0CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19NT1VTRQkweDAwMDEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0hJRENPTQkweDU1MDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX1VMVFJBTU9VU0UJMHg3NDE3CiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9CRVJLU0hJUkUJCTB4MGM5OAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0JFUktTSElSRV9QQ1dECTB4MTE0MApAQCAtMTQzMiw3ICsxNDMyLDcgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0NZQ0xPUFMJMHgwMDA0CiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9MRAkJMHgwZjExCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0FTU1kgICAgICAgIAkweDEwMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DQVNTWQkJMHgxMDAwCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUE9DS0VUQ0FTU1kJMHgxMDEwCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTU9CSUxFQ0FTU1kJMHgxMDIwCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfSldNCQkweDEwODAKQEAgLTE0NDQsNiArMTQ0NCw5IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTkVUV09SS0FOQUxZU0VSCTB4MjAyMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1BPV0VSQ09OVFJPTAkweDIwMzAKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX0FQUExFCQkweDA1YWMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9QT1dFUk1PVVNFCTB4MDMwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0JMVUVUT09USAkweDEwMDAKIAogLyoKICAqIEFscGhhYmV0aWNhbGx5IHNvcnRlZCBibGFja2xpc3QgYnkgcXVpcmsgdHlwZS4KQEAgLTE0NjIsMTIgKzE0NjUsMTQgQEAKIAl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18yMiwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIzLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQkxVRVRPT1RILCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0JFUktTSElSRSwgVVNCX0RFVklDRV9JRF9CRVJLU0hJUkVfUENXRCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9DT0RFTUVSQ1MsIFVTQl9ERVZJQ0VfSURfQ09ERU1FUkNTX0lPVzQwLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0NPREVNRVJDUywgVVNCX0RFVklDRV9JRF9DT0RFTUVSQ1NfSU9XMjQsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfQ09ERU1FUkNTLCBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1c0OCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9DT0RFTUVSQ1MsIFVTQl9ERVZJQ0VfSURfQ09ERU1FUkNTX0lPVzI4LCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19ISURDT00sIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX1VMVFJBTU9VU0UsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfREVMT1JNRSwgVVNCX0RFVklDRV9JRF9ERUxPUk1FX0VBUlRITUFURSwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9ERUxPUk1FLCBVU0JfREVWSUNFX0lEX0RFTE9STUVfRU1fTFQyMCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9FU1NFTlRJQUxfUkVBTElUWSwgVVNCX0RFVklDRV9JRF9FU1NFTlRJQUxfUkVBTElUWV9QNSwgSElEX1FVSVJLX0lHTk9SRSB9LApAQCAtMTU0OCwxMCArMTU1MywxMiBAQAogCXsgVVNCX1ZFTkRPUl9JRF9DSElDT05ZLCBVU0JfREVWSUNFX0lEX0NISUNPTllfVVNCSFVCX0tCLCBISURfUVVJUktfTk9HRVR9LAogCXsgVVNCX1ZFTkRPUl9JRF9UQU5HVE9QLCBVU0JfREVWSUNFX0lEX1RBTkdUT1BfVVNCUFMyLCBISURfUVVJUktfTk9HRVQgfSwKIAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9QT1dFUk1PVVNFLCBISURfUVVJUktfMldIRUVMX1BPV0VSTU9VU0UgfSwKIAl7IFVTQl9WRU5ET1JfSURfQTRURUNILCBVU0JfREVWSUNFX0lEX0E0VEVDSF9XQ1AzMlBVLCBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNyB9LAogCXsgVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UsIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181IH0sCiAKIAl7IFVTQl9WRU5ET1JfSURfQUFTSElNQSwgVVNCX0RFVklDRV9JRF9BQVNISU1BX0dBTUVQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKKwl7IFVTQl9WRU5ET1JfSURfQUFTSElNQSwgVVNCX0RFVklDRV9JRF9BQVNISU1BX1BSRURBVE9SLCBISURfUVVJUktfQkFEUEFEIH0sCiAJeyBVU0JfVkVORE9SX0lEX0FMUFMsIFVTQl9ERVZJQ0VfSURfSUJNX0dBTUVQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKIAl7IFVTQl9WRU5ET1JfSURfQ0hJQywgVVNCX0RFVklDRV9JRF9DSElDX0dBTUVQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKIAl7IFVTQl9WRU5ET1JfSURfSEFQUCwgVVNCX0RFVklDRV9JRF9VR0NJX0RSSVZJTkcsIEhJRF9RVUlSS19CQURQQUQgfCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKQEAgLTE1NjQsMTUgKzE1NzEsMzIgQEAKIAl7IDAsIDAgfQogfTsKIAorLyoKKyAqIFRyYXZlcnNlIHRoZSBzdXBwbGllZCBsaXN0IG9mIHJlcG9ydHMgYW5kIGZpbmQgdGhlIGxvbmdlc3QKKyAqLworc3RhdGljIHZvaWQgaGlkX2ZpbmRfbWF4X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCB1bnNpZ25lZCBpbnQgdHlwZSwgaW50ICptYXgpCit7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlpbnQgc2l6ZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5yZXBvcnRfbGlzdCwgbGlzdCkgeworCQlzaXplID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDE7CisJCWlmICh0eXBlID09IEhJRF9JTlBVVF9SRVBPUlQgJiYgaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5udW1iZXJlZCkKKwkJCXNpemUrKzsKKwkJaWYgKCptYXggPCBzaXplKQorCQkJKm1heCA9IHNpemU7CisJfQorfQorCiBzdGF0aWMgaW50IGhpZF9hbGxvY19idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCiB7Ci0JaWYgKCEoaGlkLT5pbmJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCBISURfQlVGRkVSX1NJWkUsIFNMQUJfQVRPTUlDLCAmaGlkLT5pbmJ1Zl9kbWEpKSkKKwlpZiAoIShoaWQtPmluYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIGhpZC0+YnVmc2l6ZSwgU0xBQl9BVE9NSUMsICZoaWQtPmluYnVmX2RtYSkpKQogCQlyZXR1cm4gLTE7Ci0JaWYgKCEoaGlkLT5vdXRidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgSElEX0JVRkZFUl9TSVpFLCBTTEFCX0FUT01JQywgJmhpZC0+b3V0YnVmX2RtYSkpKQorCWlmICghKGhpZC0+b3V0YnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIGhpZC0+YnVmc2l6ZSwgU0xBQl9BVE9NSUMsICZoaWQtPm91dGJ1Zl9kbWEpKSkKIAkJcmV0dXJuIC0xOwogCWlmICghKGhpZC0+Y3IgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgc2l6ZW9mKCooaGlkLT5jcikpLCBTTEFCX0FUT01JQywgJmhpZC0+Y3JfZG1hKSkpCiAJCXJldHVybiAtMTsKLQlpZiAoIShoaWQtPmN0cmxidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgSElEX0JVRkZFUl9TSVpFLCBTTEFCX0FUT01JQywgJmhpZC0+Y3RybGJ1Zl9kbWEpKSkKKwlpZiAoIShoaWQtPmN0cmxidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgaGlkLT5idWZzaXplLCBTTEFCX0FUT01JQywgJmhpZC0+Y3RybGJ1Zl9kbWEpKSkKIAkJcmV0dXJuIC0xOwogCiAJcmV0dXJuIDA7CkBAIC0xNTgxLDEzICsxNjA1LDEzIEBACiBzdGF0aWMgdm9pZCBoaWRfZnJlZV9idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCiB7CiAJaWYgKGhpZC0+aW5idWYpCi0JCXVzYl9idWZmZXJfZnJlZShkZXYsIEhJRF9CVUZGRVJfU0laRSwgaGlkLT5pbmJ1ZiwgaGlkLT5pbmJ1Zl9kbWEpOworCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBoaWQtPmJ1ZnNpemUsIGhpZC0+aW5idWYsIGhpZC0+aW5idWZfZG1hKTsKIAlpZiAoaGlkLT5vdXRidWYpCi0JCXVzYl9idWZmZXJfZnJlZShkZXYsIEhJRF9CVUZGRVJfU0laRSwgaGlkLT5vdXRidWYsIGhpZC0+b3V0YnVmX2RtYSk7CisJCXVzYl9idWZmZXJfZnJlZShkZXYsIGhpZC0+YnVmc2l6ZSwgaGlkLT5vdXRidWYsIGhpZC0+b3V0YnVmX2RtYSk7CiAJaWYgKGhpZC0+Y3IpCiAJCXVzYl9idWZmZXJfZnJlZShkZXYsIHNpemVvZigqKGhpZC0+Y3IpKSwgaGlkLT5jciwgaGlkLT5jcl9kbWEpOwogCWlmIChoaWQtPmN0cmxidWYpCi0JCXVzYl9idWZmZXJfZnJlZShkZXYsIEhJRF9CVUZGRVJfU0laRSwgaGlkLT5jdHJsYnVmLCBoaWQtPmN0cmxidWZfZG1hKTsKKwkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgaGlkLT5idWZzaXplLCBoaWQtPmN0cmxidWYsIGhpZC0+Y3RybGJ1Zl9kbWEpOwogfQogCiBzdGF0aWMgc3RydWN0IGhpZF9kZXZpY2UgKnVzYl9oaWRfY29uZmlndXJlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQpAQCAtMTU5OCw3ICsxNjIyLDcgQEAKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkOwogCXVuc2lnbmVkIHF1aXJrcyA9IDAsIHJzaXplID0gMDsKIAljaGFyICpidWYsICpyZGVzYzsKLQlpbnQgbjsKKwlpbnQgbiwgaW5zaXplID0gMDsKIAogCWZvciAobiA9IDA7IGhpZF9ibGFja2xpc3Rbbl0uaWRWZW5kb3I7IG4rKykKIAkJaWYgKChoaWRfYmxhY2tsaXN0W25dLmlkVmVuZG9yID09IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikpICYmCkBAIC0xNjUyLDYgKzE2NzYsMTkgQEAKIAlrZnJlZShyZGVzYyk7CiAJaGlkLT5xdWlya3MgPSBxdWlya3M7CiAKKwloaWQtPmJ1ZnNpemUgPSBISURfTUlOX0JVRkZFUl9TSVpFOworCWhpZF9maW5kX21heF9yZXBvcnQoaGlkLCBISURfSU5QVVRfUkVQT1JULCAmaGlkLT5idWZzaXplKTsKKwloaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX09VVFBVVF9SRVBPUlQsICZoaWQtPmJ1ZnNpemUpOworCWhpZF9maW5kX21heF9yZXBvcnQoaGlkLCBISURfRkVBVFVSRV9SRVBPUlQsICZoaWQtPmJ1ZnNpemUpOworCisJaWYgKGhpZC0+YnVmc2l6ZSA+IEhJRF9NQVhfQlVGRkVSX1NJWkUpCisJCWhpZC0+YnVmc2l6ZSA9IEhJRF9NQVhfQlVGRkVSX1NJWkU7CisKKwloaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX0lOUFVUX1JFUE9SVCwgJmluc2l6ZSk7CisKKwlpZiAoaW5zaXplID4gSElEX01BWF9CVUZGRVJfU0laRSkKKwkJaW5zaXplID0gSElEX01BWF9CVUZGRVJfU0laRTsKKwogCWlmIChoaWRfYWxsb2NfYnVmZmVycyhkZXYsIGhpZCkpIHsKIAkJaGlkX2ZyZWVfYnVmZmVycyhkZXYsIGhpZCk7CiAJCWdvdG8gZmFpbDsKQEAgLTE2ODIsMTAgKzE3MTksMTAgQEAKIAkJCWlmICghKGhpZC0+dXJiaW4gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpKSkKIAkJCQlnb3RvIGZhaWw7CiAJCQlwaXBlID0gdXNiX3JjdmludHBpcGUoZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7Ci0JCQl1c2JfZmlsbF9pbnRfdXJiKGhpZC0+dXJiaW4sIGRldiwgcGlwZSwgaGlkLT5pbmJ1ZiwgMCwKKwkJCXVzYl9maWxsX2ludF91cmIoaGlkLT51cmJpbiwgZGV2LCBwaXBlLCBoaWQtPmluYnVmLCBpbnNpemUsCiAJCQkJCSBoaWRfaXJxX2luLCBoaWQsIGludGVydmFsKTsKIAkJCWhpZC0+dXJiaW4tPnRyYW5zZmVyX2RtYSA9IGhpZC0+aW5idWZfZG1hOwotCQkJaGlkLT51cmJpbi0+dHJhbnNmZXJfZmxhZ3MgfD0oVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfQVNZTkNfVU5MSU5LKTsKKwkJCWhpZC0+dXJiaW4tPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCQl9IGVsc2UgewogCQkJaWYgKGhpZC0+dXJib3V0KQogCQkJCWNvbnRpbnVlOwpAQCAtMTY5NSw3ICsxNzMyLDcgQEAKIAkJCXVzYl9maWxsX2ludF91cmIoaGlkLT51cmJvdXQsIGRldiwgcGlwZSwgaGlkLT5vdXRidWYsIDAsCiAJCQkJCSBoaWRfaXJxX291dCwgaGlkLCBpbnRlcnZhbCk7CiAJCQloaWQtPnVyYm91dC0+dHJhbnNmZXJfZG1hID0gaGlkLT5vdXRidWZfZG1hOwotCQkJaGlkLT51cmJvdXQtPnRyYW5zZmVyX2ZsYWdzIHw9IChVUkJfTk9fVFJBTlNGRVJfRE1BX01BUCB8IFVSQl9BU1lOQ19VTkxJTkspOworCQkJaGlkLT51cmJvdXQtPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCQl9CiAJfQogCkBAIC0xNzQ3LDcgKzE3ODQsNyBAQAogCQkJICAgICBoaWQtPmN0cmxidWYsIDEsIGhpZF9jdHJsLCBoaWQpOwogCWhpZC0+dXJiY3RybC0+c2V0dXBfZG1hID0gaGlkLT5jcl9kbWE7CiAJaGlkLT51cmJjdHJsLT50cmFuc2Zlcl9kbWEgPSBoaWQtPmN0cmxidWZfZG1hOwotCWhpZC0+dXJiY3RybC0+dHJhbnNmZXJfZmxhZ3MgfD0gKFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQIHwgVVJCX05PX1NFVFVQX0RNQV9NQVAgfCBVUkJfQVNZTkNfVU5MSU5LKTsKKwloaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2ZsYWdzIHw9IChVUkJfTk9fVFJBTlNGRVJfRE1BX01BUCB8IFVSQl9OT19TRVRVUF9ETUFfTUFQKTsKIAogCXJldHVybiBoaWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWRlYnVnLmgKaW5kZXggNTI0MzdlNS4uY2VlYmFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWRlYnVnLmgKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWRlYnVnLmgKQEAgLTg1LDYgKzg1LDIzIEBACiAgICAgICB7MCwgMHg5MSwgIkQtUGFkRG93biJ9LAogICAgICAgezAsIDB4OTIsICJELVBhZFJpZ2h0In0sCiAgICAgICB7MCwgMHg5MywgIkQtUGFkTGVmdCJ9LAorICB7ICAyLCAwLCAiU2ltdWxhdGlvbiIgfSwKKyAgICAgIHswLCAweGIwLCAiQWlsZXJvbiJ9LAorICAgICAgezAsIDB4YjEsICJBaWxlcm9uVHJpbSJ9LAorICAgICAgezAsIDB4YjIsICJBbnRpLVRvcnF1ZSJ9LAorICAgICAgezAsIDB4YjMsICJBdXRvcGlsb3QifSwKKyAgICAgIHswLCAweGI0LCAiQ2hhZmYifSwKKyAgICAgIHswLCAweGI1LCAiQ29sbGVjdGl2ZSJ9LAorICAgICAgezAsIDB4YjYsICJEaXZlQnJha2UifSwKKyAgICAgIHswLCAweGI3LCAiRWxlY3Ryb25pY0NvdW50ZXJtZWFzdXJlcyJ9LAorICAgICAgezAsIDB4YjgsICJFbGV2YXRvciJ9LAorICAgICAgezAsIDB4YjksICJFbGV2YXRvclRyaW0ifSwKKyAgICAgIHswLCAweGJhLCAiUnVkZGVyIn0sCisgICAgICB7MCwgMHhiYiwgIlRocm90dGxlIn0sCisgICAgICB7MCwgMHhiYywgIkZsaWdodENvbW11bmljYXRpb25zIn0sCisgICAgICB7MCwgMHhiZCwgIkZsYXJlUmVsZWFzZSJ9LAorICAgICAgezAsIDB4YmUsICJMYW5kaW5nR2VhciJ9LAorICAgICAgezAsIDB4YmYsICJUb2VCcmFrZSJ9LAogICB7ICA3LCAwLCAiS2V5Ym9hcmQiIH0sCiAgIHsgIDgsIDAsICJMRUQiIH0sCiAgICAgICB7MCwgMHgwMSwgIk51bUxvY2sifSwKQEAgLTkyLDYgKzEwOSw3IEBACiAgICAgICB7MCwgMHgwMywgIlNjcm9sbExvY2sifSwKICAgICAgIHswLCAweDA0LCAiQ29tcG9zZSJ9LAogICAgICAgezAsIDB4MDUsICJLYW5hIn0sCisgICAgICB7MCwgMHg0YiwgIkdlbmVyaWNJbmRpY2F0b3IifSwKICAgeyAgOSwgMCwgIkJ1dHRvbiIgfSwKICAgeyAxMCwgMCwgIk9yZGluYWwiIH0sCiAgIHsgMTIsIDAsICJDb25zdW1lciIgfSwKQEAgLTU3NCw3ICs1OTIsOCBAQAogCVtLRVlfRVhJVF0gPSAiRXhpdCIsCQkJW0tFWV9NT1ZFXSA9ICJNb3ZlIiwKIAlbS0VZX0VESVRdID0gIkVkaXQiLAkJCVtLRVlfU0NST0xMVVBdID0gIlNjcm9sbFVwIiwKIAlbS0VZX1NDUk9MTERPV05dID0gIlNjcm9sbERvd24iLAlbS0VZX0tQTEVGVFBBUkVOXSA9ICJLUExlZnRQYXJlbnRoZXNpcyIsCi0JW0tFWV9LUFJJR0hUUEFSRU5dID0gIktQUmlnaHRQYXJlbnRoZXNpcyIsIFtLRVlfRjEzXSA9ICJGMTMiLAorCVtLRVlfS1BSSUdIVFBBUkVOXSA9ICJLUFJpZ2h0UGFyZW50aGVzaXMiLCBbS0VZX05FV10gPSAiTmV3IiwKKwlbS0VZX1JFRE9dID0gIlJlZG8iLAkJCVtLRVlfRjEzXSA9ICJGMTMiLAogCVtLRVlfRjE0XSA9ICJGMTQiLAkJCVtLRVlfRjE1XSA9ICJGMTUiLAogCVtLRVlfRjE2XSA9ICJGMTYiLAkJCVtLRVlfRjE3XSA9ICJGMTciLAogCVtLRVlfRjE4XSA9ICJGMTgiLAkJCVtLRVlfRjE5XSA9ICJGMTkiLApAQCAtNTg0LDE1ICs2MDMsMTUgQEAKIAlbS0VZX1BBVVNFQ0RdID0gIlBhdXNlQ0QiLAkJW0tFWV9QUk9HM10gPSAiUHJvZzMiLAogCVtLRVlfUFJPRzRdID0gIlByb2c0IiwJCQlbS0VZX1NVU1BFTkRdID0gIlN1c3BlbmQiLAogCVtLRVlfQ0xPU0VdID0gIkNsb3NlIiwJCQlbS0VZX1BMQVldID0gIlBsYXkiLAotCVtLRVlfRkFTVEZPUldBUkRdID0gIkZhc3QgRm9yd2FyZCIsCVtLRVlfQkFTU0JPT1NUXSA9ICJCYXNzIEJvb3N0IiwKKwlbS0VZX0ZBU1RGT1JXQVJEXSA9ICJGYXN0Rm9yd2FyZCIsCVtLRVlfQkFTU0JPT1NUXSA9ICJCYXNzQm9vc3QiLAogCVtLRVlfUFJJTlRdID0gIlByaW50IiwJCQlbS0VZX0hQXSA9ICJIUCIsCiAJW0tFWV9DQU1FUkFdID0gIkNhbWVyYSIsCQlbS0VZX1NPVU5EXSA9ICJTb3VuZCIsCiAJW0tFWV9RVUVTVElPTl0gPSAiUXVlc3Rpb24iLAkJW0tFWV9FTUFJTF0gPSAiRW1haWwiLAogCVtLRVlfQ0hBVF0gPSAiQ2hhdCIsCQkJW0tFWV9TRUFSQ0hdID0gIlNlYXJjaCIsCiAJW0tFWV9DT05ORUNUXSA9ICJDb25uZWN0IiwJCVtLRVlfRklOQU5DRV0gPSAiRmluYW5jZSIsCiAJW0tFWV9TUE9SVF0gPSAiU3BvcnQiLAkJCVtLRVlfU0hPUF0gPSAiU2hvcCIsCi0JW0tFWV9BTFRFUkFTRV0gPSAiQWx0ZXJuYXRlIEVyYXNlIiwJW0tFWV9DQU5DRUxdID0gIkNhbmNlbCIsCi0JW0tFWV9CUklHSFRORVNTRE9XTl0gPSAiQnJpZ2h0bmVzcyBkb3duIiwgW0tFWV9CUklHSFRORVNTVVBdID0gIkJyaWdodG5lc3MgdXAiLAorCVtLRVlfQUxURVJBU0VdID0gIkFsdGVybmF0ZUVyYXNlIiwJW0tFWV9DQU5DRUxdID0gIkNhbmNlbCIsCisJW0tFWV9CUklHSFRORVNTRE9XTl0gPSAiQnJpZ2h0bmVzc0Rvd24iLCBbS0VZX0JSSUdIVE5FU1NVUF0gPSAiQnJpZ2h0bmVzc1VwIiwKIAlbS0VZX01FRElBXSA9ICJNZWRpYSIsCQkJW0tFWV9VTktOT1dOXSA9ICJVbmtub3duIiwKIAlbQlROXzBdID0gIkJ0bjAiLAkJCVtCVE5fMV0gPSAiQnRuMSIsCiAJW0JUTl8yXSA9ICJCdG4yIiwJCQlbQlROXzNdID0gIkJ0bjMiLApAQCAtNjIyLDggKzY0MSw4IEBACiAJW0JUTl9UT09MX0FJUkJSVVNIXSA9ICJUb29sQWlyYnJ1c2giLAlbQlROX1RPT0xfRklOR0VSXSA9ICJUb29sRmluZ2VyIiwKIAlbQlROX1RPT0xfTU9VU0VdID0gIlRvb2xNb3VzZSIsCQlbQlROX1RPT0xfTEVOU10gPSAiVG9vbExlbnMiLAogCVtCVE5fVE9VQ0hdID0gIlRvdWNoIiwJCQlbQlROX1NUWUxVU10gPSAiU3R5bHVzIiwKLQlbQlROX1NUWUxVUzJdID0gIlN0eWx1czIiLAkJW0JUTl9UT09MX0RPVUJMRVRBUF0gPSAiVG9vbCBEb3VibGV0YXAiLAotCVtCVE5fVE9PTF9UUklQTEVUQVBdID0gIlRvb2wgVHJpcGxldGFwIiwgW0JUTl9HRUFSX0RPV05dID0gIldoZWVsQnRuIiwKKwlbQlROX1NUWUxVUzJdID0gIlN0eWx1czIiLAkJW0JUTl9UT09MX0RPVUJMRVRBUF0gPSAiVG9vbERvdWJsZVRhcCIsCisJW0JUTl9UT09MX1RSSVBMRVRBUF0gPSAiVG9vbFRyaXBsZVRhcCIsIFtCVE5fR0VBUl9ET1dOXSA9ICJXaGVlbEJ0biIsCiAJW0JUTl9HRUFSX1VQXSA9ICJHZWFyIHVwIiwJCVtLRVlfT0tdID0gIk9rIiwKIAlbS0VZX1NFTEVDVF0gPSAiU2VsZWN0IiwJCVtLRVlfR09UT10gPSAiR290byIsCiAJW0tFWV9DTEVBUl0gPSAiQ2xlYXIiLAkJCVtLRVlfUE9XRVIyXSA9ICJQb3dlcjIiLApAQCAtNjU5LDYgKzY3OCw5IEBACiAJW0tFWV9UV0VOXSA9ICJUV0VOIiwJCQlbS0VZX0RFTF9FT0xdID0gIkRlbGV0ZUVPTCIsCiAJW0tFWV9ERUxfRU9TXSA9ICJEZWxldGVFT1MiLAkJW0tFWV9JTlNfTElORV0gPSAiSW5zZXJ0TGluZSIsCiAJW0tFWV9ERUxfTElORV0gPSAiRGVsZXRlTGluZSIsCisJW0tFWV9TRU5EXSA9ICJTZW5kIiwJCQlbS0VZX1JFUExZXSA9ICJSZXBseSIsCisJW0tFWV9GT1JXQVJETUFJTF0gPSAiRm9yd2FyZE1haWwiLAlbS0VZX1NBVkVdID0gIlNhdmUiLAorCVtLRVlfRE9DVU1FTlRTXSA9ICJEb2N1bWVudHMiLAogfTsKIAogc3RhdGljIGNoYXIgKnJlbGF0aXZlc1tSRUxfTUFYICsgMV0gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jCmluZGV4IDYzYTRkYjcuLjBiNjQ1MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jCkBAIC03OCw4ICs3OCw4IEBACiB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSAmaGlkaW5wdXQtPmlucHV0OwogCXN0cnVjdCBoaWRfZGV2aWNlICpkZXZpY2UgPSBoaWRpbnB1dC0+aW5wdXQucHJpdmF0ZTsKLQlpbnQgbWF4LCBjb2RlOwotCXVuc2lnbmVkIGxvbmcgKmJpdDsKKwlpbnQgbWF4ID0gMCwgY29kZTsKKwl1bnNpZ25lZCBsb25nICpiaXQgPSBOVUxMOwogCiAJZmllbGQtPmhpZGlucHV0ID0gaGlkaW5wdXQ7CiAKQEAgLTEzMSw2ICsxMzEsMTUgQEAKIAkJCW1hcF9rZXkoY29kZSk7CiAJCQlicmVhazsKIAorCisJCWNhc2UgSElEX1VQX1NJTVVMQVRJT046CisKKwkJCXN3aXRjaCAodXNhZ2UtPmhpZCAmIDB4ZmZmZikgeworCQkJCWNhc2UgMHhiYTogbWFwX2FicyhBQlNfUlVEREVSKTsgYnJlYWs7CisJCQkJY2FzZSAweGJiOiBtYXBfYWJzKEFCU19USFJPVFRMRSk7IGJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKIAkJY2FzZSBISURfVVBfR0VOREVTSzoKIAogCQkJaWYgKCh1c2FnZS0+aGlkICYgMHhmMCkgPT0gMHg4MCkgewkvKiBTeXN0ZW1Db250cm9sICovCkBAIC0yMzgsOCArMjQ3LDEyIEBACiAJCQkJY2FzZSAweDAwMDogZ290byBpZ25vcmU7CiAJCQkJY2FzZSAweDAzNDogbWFwX2tleV9jbGVhcihLRVlfU0xFRVApOwkJYnJlYWs7CiAJCQkJY2FzZSAweDAzNjogbWFwX2tleV9jbGVhcihCVE5fTUlTQyk7CQlicmVhazsKKwkJCQljYXNlIDB4MDQ1OiBtYXBfa2V5X2NsZWFyKEtFWV9SQURJTyk7CQlicmVhazsKIAkJCQljYXNlIDB4MDhhOiBtYXBfa2V5X2NsZWFyKEtFWV9XV1cpOwkJYnJlYWs7CisJCQkJY2FzZSAweDA4ZDogbWFwX2tleV9jbGVhcihLRVlfUFJPR1JBTSk7CQlicmVhazsKIAkJCQljYXNlIDB4MDk1OiBtYXBfa2V5X2NsZWFyKEtFWV9IRUxQKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwOWM6IG1hcF9rZXlfY2xlYXIoS0VZX0NIQU5ORUxVUCk7CWJyZWFrOworCQkJCWNhc2UgMHgwOWQ6IG1hcF9rZXlfY2xlYXIoS0VZX0NIQU5ORUxET1dOKTsJYnJlYWs7CiAJCQkJY2FzZSAweDBiMDogbWFwX2tleV9jbGVhcihLRVlfUExBWSk7CQlicmVhazsKIAkJCQljYXNlIDB4MGIxOiBtYXBfa2V5X2NsZWFyKEtFWV9QQVVTRSk7CQlicmVhazsKIAkJCQljYXNlIDB4MGIyOiBtYXBfa2V5X2NsZWFyKEtFWV9SRUNPUkQpOwkJYnJlYWs7CkBAIC0yNTksNiArMjcyLDExIEBACiAJCQkJY2FzZSAweDE4YTogbWFwX2tleV9jbGVhcihLRVlfTUFJTCk7CQlicmVhazsKIAkJCQljYXNlIDB4MTkyOiBtYXBfa2V5X2NsZWFyKEtFWV9DQUxDKTsJCWJyZWFrOwogCQkJCWNhc2UgMHgxOTQ6IG1hcF9rZXlfY2xlYXIoS0VZX0ZJTEUpOwkJYnJlYWs7CisJCQkJY2FzZSAweDFhNzogbWFwX2tleV9jbGVhcihLRVlfRE9DVU1FTlRTKTsJYnJlYWs7CisJCQkJY2FzZSAweDIwMTogbWFwX2tleV9jbGVhcihLRVlfTkVXKTsJCWJyZWFrOworCQkJCWNhc2UgMHgyMDc6IG1hcF9rZXlfY2xlYXIoS0VZX1NBVkUpOwkJYnJlYWs7CisJCQkJY2FzZSAweDIwODogbWFwX2tleV9jbGVhcihLRVlfUFJJTlQpOwkJYnJlYWs7CisJCQkJY2FzZSAweDIwOTogbWFwX2tleV9jbGVhcihLRVlfUFJPUFMpOwkJYnJlYWs7CiAJCQkJY2FzZSAweDIxYTogbWFwX2tleV9jbGVhcihLRVlfVU5ETyk7CQlicmVhazsKIAkJCQljYXNlIDB4MjFiOiBtYXBfa2V5X2NsZWFyKEtFWV9DT1BZKTsJCWJyZWFrOwogCQkJCWNhc2UgMHgyMWM6IG1hcF9rZXlfY2xlYXIoS0VZX0NVVCk7CQlicmVhazsKQEAgLTI3MSw3ICsyODksMTEgQEAKIAkJCQljYXNlIDB4MjI3OiBtYXBfa2V5X2NsZWFyKEtFWV9SRUZSRVNIKTsJCWJyZWFrOwogCQkJCWNhc2UgMHgyMmE6IG1hcF9rZXlfY2xlYXIoS0VZX0JPT0tNQVJLUyk7CWJyZWFrOwogCQkJCWNhc2UgMHgyMzg6IG1hcF9yZWwoUkVMX0hXSEVFTCk7CQlicmVhazsKLQkJCQlkZWZhdWx0OiAgICBnb3RvIHVua25vd247CisJCQkJY2FzZSAweDI3OTogbWFwX2tleV9jbGVhcihLRVlfUkVETyk7CQlicmVhazsKKwkJCQljYXNlIDB4Mjg5OiBtYXBfa2V5X2NsZWFyKEtFWV9SRVBMWSk7CQlicmVhazsKKwkJCQljYXNlIDB4MjhiOiBtYXBfa2V5X2NsZWFyKEtFWV9GT1JXQVJETUFJTCk7CWJyZWFrOworCQkJCWNhc2UgMHgyOGM6IG1hcF9rZXlfY2xlYXIoS0VZX1NFTkQpOwkJYnJlYWs7CisJCQkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7CiAJCQl9CiAJCQlicmVhazsKIApAQCAtMjk2LDkgKzMxOCw0MiBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBISURfVVBfTVNWRU5ET1I6Ci0KIAkJCWdvdG8gaWdub3JlOwogCisJCWNhc2UgSElEX1VQX0NVU1RPTTogLyogUmVwb3J0ZWQgb24gTG9naXRlY2ggYW5kIFBvd2VyYm9vayBVU0Iga2V5Ym9hcmRzICovCisKKwkJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOworCQkJc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwkJCQljYXNlIDB4MDAzOiBtYXBfa2V5X2NsZWFyKEtFWV9GTik7CQlicmVhazsKKwkJCQlkZWZhdWx0OiAgICBnb3RvIGlnbm9yZTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgSElEX1VQX0xPR0lWRU5ET1I6IC8qIFJlcG9ydGVkIG9uIExvZ2l0ZWNoIFVsdHJhIFggTWVkaWEgUmVtb3RlICovCisKKwkJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOworCQkJc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwkJCQljYXNlIDB4MDA0OiBtYXBfa2V5X2NsZWFyKEtFWV9BR0FJTik7CQlicmVhazsKKwkJCQljYXNlIDB4MDBkOiBtYXBfa2V5X2NsZWFyKEtFWV9IT01FKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwMjQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NIVUZGTEUpOwkJYnJlYWs7CisJCQkJY2FzZSAweDAyNTogbWFwX2tleV9jbGVhcihLRVlfVFYpOwkJYnJlYWs7CisJCQkJY2FzZSAweDAyNjogbWFwX2tleV9jbGVhcihLRVlfTUVOVSk7CQlicmVhazsKKwkJCQljYXNlIDB4MDMxOiBtYXBfa2V5X2NsZWFyKEtFWV9BVURJTyk7CQlicmVhazsKKwkJCQljYXNlIDB4MDMyOiBtYXBfa2V5X2NsZWFyKEtFWV9TVUJUSVRMRSk7CWJyZWFrOworCQkJCWNhc2UgMHgwMzM6IG1hcF9rZXlfY2xlYXIoS0VZX0xBU1QpOwkJYnJlYWs7CisJCQkJY2FzZSAweDA0NzogbWFwX2tleV9jbGVhcihLRVlfTVAzKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwNDg6IG1hcF9rZXlfY2xlYXIoS0VZX0RWRCk7CQlicmVhazsKKwkJCQljYXNlIDB4MDQ5OiBtYXBfa2V5X2NsZWFyKEtFWV9NRURJQSk7CQlicmVhazsKKwkJCQljYXNlIDB4MDRhOiBtYXBfa2V5X2NsZWFyKEtFWV9WSURFTyk7CQlicmVhazsKKwkJCQljYXNlIDB4MDRiOiBtYXBfa2V5X2NsZWFyKEtFWV9BTkdMRSk7CQlicmVhazsKKwkJCQljYXNlIDB4MDRjOiBtYXBfa2V5X2NsZWFyKEtFWV9MQU5HVUFHRSk7CWJyZWFrOworCQkJCWNhc2UgMHgwNGQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NVQlRJVExFKTsJYnJlYWs7CisJCQkJY2FzZSAweDA1MTogbWFwX2tleV9jbGVhcihLRVlfUkVEKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwNTI6IG1hcF9rZXlfY2xlYXIoS0VZX0NMT1NFKTsJCWJyZWFrOworCQkJCWRlZmF1bHQ6ICAgIGdvdG8gaWdub3JlOworCQkJfQorCQkJYnJlYWs7CisKIAkJY2FzZSBISURfVVBfUElEOgogCiAJCQlzZXRfYml0KEVWX0ZGLCBpbnB1dC0+ZXZiaXQpOwpAQCAtMzQ5LDYgKzQwNCw5IEBACiAJaWYgKHVzYWdlLT5jb2RlID4gbWF4KQogCQlnb3RvIGlnbm9yZTsKIAorCWlmICgoKGRldmljZS0+cXVpcmtzICYgKEhJRF9RVUlSS18yV0hFRUxfUE9XRVJNT1VTRSkpICYmICh1c2FnZS0+aGlkID09IDB4MDAwMTAwMzIpKSkKKwkJbWFwX3JlbChSRUxfSFdIRUVMKTsKKwogCWlmICgoZGV2aWNlLT5xdWlya3MgJiAoSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzcgfCBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNSkpICYmCiAJCSAodXNhZ2UtPnR5cGUgPT0gRVZfUkVMKSAmJiAodXNhZ2UtPmNvZGUgPT0gUkVMX1dIRUVMKSkKIAkJCXNldF9iaXQoUkVMX0hXSEVFTCwgYml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLmgKaW5kZXggYzFiNmI2OS4uZWMyNDEyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLmgKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLmgKQEAgLTE3Myw2ICsxNzMsNyBAQAogCiAjZGVmaW5lIEhJRF9VUF9VTkRFRklORUQJMHgwMDAwMDAwMAogI2RlZmluZSBISURfVVBfR0VOREVTSwkJMHgwMDAxMDAwMAorI2RlZmluZSBISURfVVBfU0lNVUxBVElPTgkweDAwMDIwMDAwCiAjZGVmaW5lIEhJRF9VUF9LRVlCT0FSRAkJMHgwMDA3MDAwMAogI2RlZmluZSBISURfVVBfTEVECQkweDAwMDgwMDAwCiAjZGVmaW5lIEhJRF9VUF9CVVRUT04JCTB4MDAwOTAwMDAKQEAgLTE4Miw2ICsxODMsOCBAQAogI2RlZmluZSBISURfVVBfUElECQkweDAwMGYwMDAwCiAjZGVmaW5lIEhJRF9VUF9IUFZFTkRPUiAgICAgICAgIDB4ZmY3ZjAwMDAKICNkZWZpbmUgSElEX1VQX01TVkVORE9SCQkweGZmMDAwMDAwCisjZGVmaW5lIEhJRF9VUF9DVVNUT00JCTB4MDBmZjAwMDAKKyNkZWZpbmUgSElEX1VQX0xPR0lWRU5ET1IJMHhmZmJjMDAwMAogCiAjZGVmaW5lIEhJRF9VU0FHRQkJMHgwMDAwZmZmZgogCkBAIC0yNDIsNiArMjQ1LDcgQEAKICNkZWZpbmUgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzcJCTB4MDgwCiAjZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181CQkweDEwMAogI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfT04JCTB4MjAwCisjZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfUE9XRVJNT1VTRQkJMHg0MDAKIAogLyoKICAqIFRoaXMgaXMgdGhlIGdsb2JhbCBlbnZpcm9ubWVudCBvZiB0aGUgcGFyc2VyLiBUaGlzIGluZm9ybWF0aW9uIGlzCkBAIC0zNDgsNyArMzUyLDggQEAKIAogI2RlZmluZSBISURfUkVQT1JUX1RZUEVTIDMKIAotI2RlZmluZSBISURfQlVGRkVSX1NJWkUJCTY0CQkvKiB1c2UgNjQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhbGwgcG9zc2libGUgcGFja2V0bGVuICovCisjZGVmaW5lIEhJRF9NSU5fQlVGRkVSX1NJWkUJNjQJCS8qIG1ha2Ugc3VyZSB0aGVyZSBpcyBhdCBsZWFzdCBhIHBhY2tldCBzaXplIG9mIHNwYWNlICovCisjZGVmaW5lIEhJRF9NQVhfQlVGRkVSX1NJWkUJNDA5NgkJLyogNGtiICovCiAjZGVmaW5lIEhJRF9DT05UUk9MX0ZJRk9fU0laRQkyNTYJCS8qIHRvIGluaXQgZGV2aWNlcyB3aXRoID4xMDAgcmVwb3J0cyAqLwogI2RlZmluZSBISURfT1VUUFVUX0ZJRk9fU0laRQk2NAogCkBAIC0zODYsNiArMzkxLDggQEAKIAogCXVuc2lnbmVkIGxvbmcgaW9mbDsJCQkJCQkvKiBJL08gZmxhZ3MgKENUUkxfUlVOTklORywgT1VUX1JVTk5JTkcpICovCiAKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZTsJCQkJCQkvKiBVUkIgYnVmZmVyIHNpemUgKi8KKwogCXN0cnVjdCB1cmIgKnVyYmluOwkJCQkJCS8qIElucHV0IFVSQiAqLwogCWNoYXIgKmluYnVmOwkJCQkJCQkvKiBJbnB1dCBidWZmZXIgKi8KIAlkbWFfYWRkcl90IGluYnVmX2RtYTsJCQkJCQkvKiBJbnB1dCBidWZmZXIgZG1hICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWRkZXYuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZGRldi5jCmluZGV4IDRjMTMzMzEuLmQzMjQyNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZGRldi5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZGRldi5jCkBAIC01MDcsNiArNTA3LDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX09VVCk7CisJCWhpZF93YWl0X2lvKGhpZCk7CiAKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2l0bXRvdWNoLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9pdG10b3VjaC5jCmluZGV4IDBkYzQzOWYuLmJlY2I4N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2l0bXRvdWNoLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaXRtdG91Y2guYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CiAJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFswXS5kZXNjOwogCi0JaWYgKCEoaXRtdG91Y2ggPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaXRtdG91Y2hfZGV2KSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEoaXRtdG91Y2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXRtdG91Y2hfZGV2KSwgR0ZQX0tFUk5FTCkpKSB7CiAJCWVycigiJXMgLSBPdXQgb2YgbWVtb3J5LiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2tleXNwYW5fcmVtb3RlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9rZXlzcGFuX3JlbW90ZS5jCmluZGV4IDY3ZGM5MzYuLjk5ZGUxYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2tleXNwYW5fcmVtb3RlLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQva2V5c3Bhbl9yZW1vdGUuYwpAQCAtNDMxLDExICs0MzEsNiBAQAogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOwogCi0JLyogU2VlIGlmIHRoZSBvZmZlcmVkIGRldmljZSBtYXRjaGVzIHdoYXQgd2UgY2FuIGFjY2VwdCAqLwotCWlmICgodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciAhPSBVU0JfS0VZU1BBTl9WRU5ET1JfSUQpIHx8Ci0JICAgICh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCAhPSBVU0JfS0VZU1BBTl9QUk9EVUNUX1VJQTExKSApCi0JCXJldHVybiAtRU5PREVWOwotCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJcmVtb3RlID0ga21hbGxvYyhzaXplb2YoKnJlbW90ZSksIEdGUF9LRVJORUwpOwogCWlmIChyZW1vdGUgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvbWFwX3RvXzdzZWdtZW50LmggYi9kcml2ZXJzL3VzYi9pbnB1dC9tYXBfdG9fN3NlZ21lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmZmMjdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvbWFwX3RvXzdzZWdtZW50LmgKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBkcml2ZXJzL3VzYi9pbnB1dC9tYXBfdG9fN3NlZ21lbnQuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBIZW5rIFZlcmdvbmV0IDxIZW5rLlZlcmdvbmV0QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgTUFQX1RPXzdTRUdNRU5UX0gKKyNkZWZpbmUgTUFQX1RPXzdTRUdNRU5UX0gKKworLyogVGhpcyBmaWxlIHByb3ZpZGVzIHRyYW5zbGF0aW9uIHByaW1pdGl2ZXMgYW5kIHRhYmxlcyBmb3IgdGhlIGNvbnZlcnNpb24KKyAqIG9mIChBU0NJSSkgY2hhcmFjdGVycyB0byBhIDctc2VnbWVudHMgbm90YXRpb24uCisgKgorICogVGhlIDcgc2VnbWVudCdzIHdpa2lwZWRpYSBub3RhdGlvbiBiZWxvdyBpcyB1c2VkIGFzIHN0YW5kYXJkLgorICogU2VlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NldmVuX3NlZ21lbnRfZGlzcGxheQorICoKKyAqIE5vdGF0aW9uOgkrLWEtKworICoJCWYgICBiCisgKgkJKy1nLSsKKyAqCQllICAgYworICoJCSstZC0rCisgKgorICogVXNhZ2U6CisgKgorICogICBSZWdpc3RlciBhIG1hcCB2YXJpYWJsZSwgYW5kIGZpbGwgaXQgd2l0aCBhIGNoYXJhY3RlciBzZXQ6CisgKiAJc3RhdGljIFNFRzdfREVGQVVMVF9NQVAobWFwX3NlZzcpOworICoKKyAqCisgKiAgIFRoZW4gdXNlIGZvciBjb252ZXJzaW9uOgorICoJc2VnNyA9IG1hcF90b19zZWc3KCZtYXBfc2VnNywgc29tZV9jaGFyKTsKKyAqCS4uLgorICoKKyAqIEluIGRldmljZSBkcml2ZXJzIGl0IGlzIHJlY29tbWVuZGVkLCBpZiByZXF1aXJlZCwgdG8gbWFrZSB0aGUgY2hhciBtYXAKKyAqIGFjY2Vzc2libGUgdmlhIHRoZSBzeXNmcyBpbnRlcmZhY2UgdXNpbmcgdGhlIGZvbGxvd2luZyBzY2hlbWU6CisgKgorICogc3RhdGljIHNzaXplX3Qgc2hvd19tYXAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpIHsKKyAqCW1lbWNweShidWYsICZtYXBfc2VnNywgc2l6ZW9mKG1hcF9zZWc3KSk7CisgKglyZXR1cm4gc2l6ZW9mKG1hcF9zZWc3KTsKKyAqIH0KKyAqIHN0YXRpYyBzc2l6ZV90IHN0b3JlX21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNudCkgeworICoJaWYoY250ICE9IHNpemVvZihtYXBfc2VnNykpCisgKgkJcmV0dXJuIC1FSU5WQUw7CisgKgltZW1jcHkoJm1hcF9zZWc3LCBidWYsIGNudCk7CisgKglyZXR1cm4gY250OworICogfQorICogc3RhdGljIERFVklDRV9BVFRSKG1hcF9zZWc3LCBQRVJNU19SVywgc2hvd19tYXAsIHN0b3JlX21hcCk7CisgKgorICogSGlzdG9yeToKKyAqIDIwMDUtMDUtMzEJUkZDIGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKworI2RlZmluZSBCSVRfU0VHN19BCQkwCisjZGVmaW5lIEJJVF9TRUc3X0IJCTEKKyNkZWZpbmUgQklUX1NFRzdfQwkJMgorI2RlZmluZSBCSVRfU0VHN19ECQkzCisjZGVmaW5lIEJJVF9TRUc3X0UJCTQKKyNkZWZpbmUgQklUX1NFRzdfRgkJNQorI2RlZmluZSBCSVRfU0VHN19HCQk2CisjZGVmaW5lIEJJVF9TRUc3X1JFU0VSVkVECTcKKworc3RydWN0IHNlZzdfY29udmVyc2lvbl9tYXAgeworCXVuc2lnbmVkIGNoYXIJdGFibGVbMTI4XTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IG1hcF90b19zZWc3KHN0cnVjdCBzZWc3X2NvbnZlcnNpb25fbWFwICptYXAsIGludCBjKQoreworCXJldHVybiBjICYgMHg3ZiA/IG1hcC0+dGFibGVbY10gOiAtRUlOVkFMOworfQorCisjZGVmaW5lIFNFRzdfQ09OVkVSU0lPTl9NQVAoX25hbWUsIF9tYXApCVwKKwlzdHJ1Y3Qgc2VnN19jb252ZXJzaW9uX21hcCBfbmFtZSA9IHsgLnRhYmxlID0geyBfbWFwIH0gfQorCisvKgorICogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGEgZmFjaWxpdHkgdGhhdCBhbGxvd3MgdXNlciBzcGFjZSB0byByZWRlZmluZQorICogY3VzdG9tIGNoYXJhY3RlciBzZXRzIGZvciBMQ0QgZGV2aWNlcy4gUGxlYXNlIHVzZSBhIHN5c2ZzIGludGVyZmFjZQorICogYXMgZGVzY3JpYmVkIGFib3ZlLgorICovCisjZGVmaW5lIE1BUF9UT19TRUc3X1NZU0ZTX0ZJTEUJIm1hcF9zZWc3IgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQVNDSUkgY29udmVyc2lvbiB0YWJsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBfU0VHNyhsLGEsYixjLGQsZSxmLGcpCVwKKyAgICAgICgJYTw8QklUX1NFRzdfQSB8CWI8PEJJVF9TRUc3X0IgfAljPDxCSVRfU0VHN19DIHwJZDw8QklUX1NFRzdfRCB8CVwKKwllPDxCSVRfU0VHN19FIHwJZjw8QklUX1NFRzdfRiB8CWc8PEJJVF9TRUc3X0cgKQorCisjZGVmaW5lIF9NQVBfMF8zMl9BU0NJSV9TRUc3X05PTl9QUklOVEFCTEUJXAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCisjZGVmaW5lIF9NQVBfMzNfNDdfQVNDSUlfU0VHN19TWU1CT0wJCVwKKyBfU0VHNygnIScsMCwwLDAsMCwxLDEsMCksIF9TRUc3KCciJywwLDEsMCwwLDAsMSwwKSwgX1NFRzcoJyMnLDAsMSwxLDAsMSwxLDApLFwKKyBfU0VHNygnJCcsMSwwLDEsMSwwLDEsMSksIF9TRUc3KCclJywwLDAsMSwwLDAsMSwwKSwgX1NFRzcoJyYnLDEsMCwxLDEsMSwxLDEpLFwKKyBfU0VHNygnXCcnLDAsMCwwLDAsMCwxLDApLF9TRUc3KCcoJywxLDAsMCwxLDEsMSwwKSwgX1NFRzcoJyknLDEsMSwxLDEsMCwwLDApLFwKKyBfU0VHNygnKicsMCwxLDEsMCwxLDEsMSksIF9TRUc3KCcrJywwLDEsMSwwLDAsMCwxKSwgX1NFRzcoJywnLDAsMCwwLDAsMSwwLDApLFwKKyBfU0VHNygnLScsMCwwLDAsMCwwLDAsMSksIF9TRUc3KCcuJywwLDAsMCwwLDEsMCwwKSwgX1NFRzcoJy8nLDAsMSwwLDAsMSwwLDEpLAorCisjZGVmaW5lIF9NQVBfNDhfNTdfQVNDSUlfU0VHN19OVU1FUklDCQlcCisgX1NFRzcoJzAnLDEsMSwxLDEsMSwxLDApLCBfU0VHNygnMScsMCwxLDEsMCwwLDAsMCksIF9TRUc3KCcyJywxLDEsMCwxLDEsMCwxKSxcCisgX1NFRzcoJzMnLDEsMSwxLDEsMCwwLDEpLCBfU0VHNygnNCcsMCwxLDEsMCwwLDEsMSksIF9TRUc3KCc1JywxLDAsMSwxLDAsMSwxKSxcCisgX1NFRzcoJzYnLDEsMCwxLDEsMSwxLDEpLCBfU0VHNygnNycsMSwxLDEsMCwwLDAsMCksIF9TRUc3KCc4JywxLDEsMSwxLDEsMSwxKSxcCisgX1NFRzcoJzknLDEsMSwxLDEsMCwxLDEpLAorCisjZGVmaW5lIF9NQVBfNThfNjRfQVNDSUlfU0VHN19TWU1CT0wJCVwKKyBfU0VHNygnOicsMCwwLDAsMSwwLDAsMSksIF9TRUc3KCc7JywwLDAsMCwxLDAsMCwxKSwgX1NFRzcoJzwnLDEsMCwwLDAsMCwxLDEpLFwKKyBfU0VHNygnPScsMCwwLDAsMSwwLDAsMSksIF9TRUc3KCc+JywxLDEsMCwwLDAsMCwxKSwgX1NFRzcoJz8nLDEsMSwxLDAsMCwxLDApLFwKKyBfU0VHNygnQCcsMSwxLDAsMSwxLDEsMSksCisKKyNkZWZpbmUgX01BUF82NV85MF9BU0NJSV9TRUc3X0FMUEhBX1VQUFIJXAorIF9TRUc3KCdBJywxLDEsMSwwLDEsMSwxKSwgX1NFRzcoJ0InLDEsMSwxLDEsMSwxLDEpLCBfU0VHNygnQycsMSwwLDAsMSwxLDEsMCksXAorIF9TRUc3KCdEJywxLDEsMSwxLDEsMSwwKSwgX1NFRzcoJ0UnLDEsMCwwLDEsMSwxLDEpLCBfU0VHNygnRicsMSwwLDAsMCwxLDEsMSksXAorIF9TRUc3KCdHJywxLDEsMSwxLDAsMSwxKSwgX1NFRzcoJ0gnLDAsMSwxLDAsMSwxLDEpLCBfU0VHNygnSScsMCwxLDEsMCwwLDAsMCksXAorIF9TRUc3KCdKJywwLDEsMSwxLDAsMCwwKSwgX1NFRzcoJ0snLDAsMSwxLDAsMSwxLDEpLCBfU0VHNygnTCcsMCwwLDAsMSwxLDEsMCksXAorIF9TRUc3KCdNJywxLDEsMSwwLDEsMSwwKSwgX1NFRzcoJ04nLDEsMSwxLDAsMSwxLDApLCBfU0VHNygnTycsMSwxLDEsMSwxLDEsMCksXAorIF9TRUc3KCdQJywxLDEsMCwwLDEsMSwxKSwgX1NFRzcoJ1EnLDEsMSwxLDEsMSwxLDApLCBfU0VHNygnUicsMSwxLDEsMCwxLDEsMSksXAorIF9TRUc3KCdTJywxLDAsMSwxLDAsMSwxKSwgX1NFRzcoJ1QnLDAsMCwwLDEsMSwxLDEpLCBfU0VHNygnVScsMCwxLDEsMSwxLDEsMCksXAorIF9TRUc3KCdWJywwLDEsMSwxLDEsMSwwKSwgX1NFRzcoJ1cnLDAsMSwxLDEsMSwxLDEpLCBfU0VHNygnWCcsMCwxLDEsMCwxLDEsMSksXAorIF9TRUc3KCdZJywwLDEsMSwwLDAsMSwxKSwgX1NFRzcoJ1onLDEsMSwwLDEsMSwwLDEpLAorCisjZGVmaW5lIF9NQVBfOTFfOTZfQVNDSUlfU0VHN19TWU1CT0wJCVwKKyBfU0VHNygnWycsMSwwLDAsMSwxLDEsMCksIF9TRUc3KCdcXCcsMCwwLDEsMCwwLDEsMSksX1NFRzcoJ10nLDEsMSwxLDEsMCwwLDApLFwKKyBfU0VHNygnXicsMSwxLDAsMCwwLDEsMCksIF9TRUc3KCdfJywwLDAsMCwxLDAsMCwwKSwgX1NFRzcoJ2AnLDAsMSwwLDAsMCwwLDApLAorCisjZGVmaW5lIF9NQVBfOTdfMTIyX0FTQ0lJX1NFRzdfQUxQSEFfTE9XRVIJXAorIF9TRUc3KCdBJywxLDEsMSwwLDEsMSwxKSwgX1NFRzcoJ2InLDAsMCwxLDEsMSwxLDEpLCBfU0VHNygnYycsMCwwLDAsMSwxLDAsMSksXAorIF9TRUc3KCdkJywwLDEsMSwxLDEsMCwxKSwgX1NFRzcoJ0UnLDEsMCwwLDEsMSwxLDEpLCBfU0VHNygnRicsMSwwLDAsMCwxLDEsMSksXAorIF9TRUc3KCdHJywxLDEsMSwxLDAsMSwxKSwgX1NFRzcoJ2gnLDAsMCwxLDAsMSwxLDEpLCBfU0VHNygnaScsMCwwLDEsMCwwLDAsMCksXAorIF9TRUc3KCdqJywwLDAsMSwxLDAsMCwwKSwgX1NFRzcoJ2snLDAsMCwxLDAsMSwxLDEpLCBfU0VHNygnTCcsMCwwLDAsMSwxLDEsMCksXAorIF9TRUc3KCdNJywxLDEsMSwwLDEsMSwwKSwgX1NFRzcoJ24nLDAsMCwxLDAsMSwwLDEpLCBfU0VHNygnbycsMCwwLDEsMSwxLDAsMSksXAorIF9TRUc3KCdQJywxLDEsMCwwLDEsMSwxKSwgX1NFRzcoJ3EnLDEsMSwxLDAsMCwxLDEpLCBfU0VHNygncicsMCwwLDAsMCwxLDAsMSksXAorIF9TRUc3KCdTJywxLDAsMSwxLDAsMSwxKSwgX1NFRzcoJ1QnLDAsMCwwLDEsMSwxLDEpLCBfU0VHNygndScsMCwwLDEsMSwxLDAsMCksXAorIF9TRUc3KCd2JywwLDAsMSwxLDEsMCwwKSwgX1NFRzcoJ1cnLDAsMSwxLDEsMSwxLDEpLCBfU0VHNygnWCcsMCwxLDEsMCwxLDEsMSksXAorIF9TRUc3KCd5JywwLDEsMSwxLDAsMSwxKSwgX1NFRzcoJ1onLDEsMSwwLDEsMSwwLDEpLAorCisjZGVmaW5lIF9NQVBfMTIzXzEyNl9BU0NJSV9TRUc3X1NZTUJPTAkJXAorIF9TRUc3KCd7JywxLDAsMCwxLDEsMSwwKSwgX1NFRzcoJ3wnLDAsMCwwLDAsMSwxLDApLCBfU0VHNygnfScsMSwxLDEsMSwwLDAsMCksXAorIF9TRUc3KCd+JywxLDAsMCwwLDAsMCwwKSwKKworLyogTWFwcyAqLworCisvKiBUaGlzIHNldCB0cmllcyB0byBtYXAgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIHZpc2libGUgY2hhcmFjdGVyaXN0aWNzCisgKiBvZiB0aGUgQVNDSUkgc3ltYm9sLCBsb3dlcmNhc2UgYW5kIHVwcGVyY2FzZSBsZXR0ZXJzIG1heSBkaWZmZXIgaW4KKyAqIHByZXNlbnRhdGlvbiBvbiB0aGUgZGlzcGxheS4KKyAqLworI2RlZmluZSBNQVBfQVNDSUk3U0VHX0FMUEhBTlVNCQkJXAorCV9NQVBfMF8zMl9BU0NJSV9TRUc3X05PTl9QUklOVEFCTEUJXAorCV9NQVBfMzNfNDdfQVNDSUlfU0VHN19TWU1CT0wJCVwKKwlfTUFQXzQ4XzU3X0FTQ0lJX1NFRzdfTlVNRVJJQwkJXAorCV9NQVBfNThfNjRfQVNDSUlfU0VHN19TWU1CT0wJCVwKKwlfTUFQXzY1XzkwX0FTQ0lJX1NFRzdfQUxQSEFfVVBQUglcCisJX01BUF85MV85Nl9BU0NJSV9TRUc3X1NZTUJPTAkJXAorCV9NQVBfOTdfMTIyX0FTQ0lJX1NFRzdfQUxQSEFfTE9XRVIJXAorCV9NQVBfMTIzXzEyNl9BU0NJSV9TRUc3X1NZTUJPTAorCisvKiBUaGlzIHNldCB0cmllcyB0byBtYXAgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIHN5bWJvbGljIGNoYXJhY3RlcmlzdGljcworICogb2YgdGhlIEFTQ0lJIGNoYXJhY3RlciBmb3IgbWF4aW11bSBkaXNjcmltaW5hdGlvbi4KKyAqIEZvciBub3cgdGhpcyBtZWFucyBhbGwgYWxwaGEgY2hhcnMgYXJlIGluIGxvd2VyIGNhc2UgcmVwcmVzZW50YXRpb25zLgorICogKFRoaXMgZm9yIGV4YW1wbGUgZmFjaWxpdGF0ZXMgdGhlIHVzZSBvZiBoZXggbnVtYmVycyB3aXRoIHVwcGVyY2FzZSBpbnB1dC4pCisgKi8KKyNkZWZpbmUgTUFQX0FTQ0lJN1NFR19BTFBIQU5VTV9MQwkJCVwKKwlfTUFQXzBfMzJfQVNDSUlfU0VHN19OT05fUFJJTlRBQkxFCVwKKwlfTUFQXzMzXzQ3X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisJX01BUF80OF81N19BU0NJSV9TRUc3X05VTUVSSUMJCVwKKwlfTUFQXzU4XzY0X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisJX01BUF85N18xMjJfQVNDSUlfU0VHN19BTFBIQV9MT1dFUglcCisJX01BUF85MV85Nl9BU0NJSV9TRUc3X1NZTUJPTAkJXAorCV9NQVBfOTdfMTIyX0FTQ0lJX1NFRzdfQUxQSEFfTE9XRVIJXAorCV9NQVBfMTIzXzEyNl9BU0NJSV9TRUc3X1NZTUJPTAorCisjZGVmaW5lIFNFRzdfREVGQVVMVF9NQVAoX25hbWUpCQlcCisJU0VHN19DT05WRVJTSU9OX01BUChfbmFtZSxNQVBfQVNDSUk3U0VHX0FMUEhBTlVNKQorCisjZW5kaWYJLyogTUFQX1RPXzdTRUdNRU5UX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvcGlkLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9waWQuYwppbmRleCAyNTY5NjM4Li5hY2M3MWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9waWQuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9waWQuYwpAQCAtMjYzLDcgKzI2Myw3IEBACiAJc3RydWN0IGhpZF9mZl9waWQgKnByaXZhdGU7CiAJc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQgPSBsaXN0X2VudHJ5KCZoaWQtPmlucHV0cywgc3RydWN0IGhpZF9pbnB1dCwgbGlzdCk7CiAKLQlwcml2YXRlID0gaGlkLT5mZl9wcml2YXRlID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGhpZF9mZl9waWQpLCBHRlBfS0VSTkVMKTsKKwlwcml2YXRlID0gaGlkLT5mZl9wcml2YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9mZl9waWQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXZhdGUpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC95ZWFsaW5rLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC95ZWFsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhMTc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3llYWxpbmsuYwpAQCAtMCwwICsxLDEwMTMgQEAKKy8qCisgKiBkcml2ZXJzL3VzYi9pbnB1dC95ZWFsaW5rLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSGVuayBWZXJnb25ldCA8SGVuay5WZXJnb25ldEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworLyoKKyAqIERlc2NyaXB0aW9uOgorICogICBEcml2ZXIgZm9yIHRoZSBVU0ItUDFLIHZvaXAgdXNiIHBob25lLgorICogICBUaGlzIGRldmljZSBpcyBwcm9kdWNlZCBieSBZZWFsaW5rIE5ldHdvcmsgVGVjaG5vbG9neSBDbyBMdGQKKyAqICAgYnV0IG1heSBiZSBicmFuZGVkIHVuZGVyIHNldmVyYWwgbmFtZXM6CisgKgktIFllYWxpbmsgdXNiLXAxaworICoJLSBUaXB0ZWwgMTE1CisgKgktIC4uLgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uOgorICogICAtIHRoZSB1c2JiMmstYXBpCWh0dHA6Ly9zYXZhbm5haC5ub25nbnUub3JnL3Byb2plY3RzL3VzYmIyay1hcGkvCisgKiAgIC0gaW5mb3JtYXRpb24gZnJvbQlodHRwOi8vbWVtZXRlYXUuZnJlZS5mci91c2JiMmsKKyAqICAgLSB0aGUgeHBhZC1kcml2ZXIJZHJpdmVycy91c2IvaW5wdXQveHBhZC5jCisgKgorICogVGhhbmtzIHRvOgorICogICAtIE9saXZpZXIgVmFuZG9ycGUsIGZvciBwcm92aWRpbmcgdGhlIHVzYmIyay1hcGkuCisgKiAgIC0gTWFydGluIERpZWhsLCBmb3Igc3BvdHRpbmcgbXkgbWVtb3J5IGFsbG9jYXRpb24gYnVnLgorICoKKyAqIEhpc3Rvcnk6CisgKiAgIDIwMDUwNTI3IGhlbmsJRmlyc3QgdmVyc2lvbiwgZnVuY3Rpb25hbCBrZXlib2FyZC4gS2V5Ym9hcmQgZXZlbnRzCisgKgkJCXdpbGwgcG9wLXVwIG9uIHRoZSAuLi9pbnB1dC9ldmVudFggYnVzLgorICogICAyMDA1MDUzMSBoZW5rCUFkZGVkIGxlZCwgTENELCBkaWFsdG9uZSBhbmQgc3lzZnMgaW50ZXJmYWNlLgorICogICAyMDA1MDYxMCBoZW5rCUNsZWFudXBzLCBtYWtlIGl0IHJlYWR5IGZvciBwdWJsaWMgY29uc3VtcHRpb24uCisgKiAgIDIwMDUwNjMwIGhlbmsJQ2xlYW51cHMsIGZpeGVzIGluIHJlc3BvbnNlIHRvIGNvbW1lbnRzLgorICogICAyMDA1MDcwMSBoZW5rCXN5c2ZzIHdyaXRlIHNlcmlhbGlzYXRpb24sIGZpeCBwb3RlbnRpYWwgdW5sb2FkIHJhY2VzCisgKiAgIDIwMDUwODAxIGhlbmsJQWRkZWQgcmluZ3RvbmUsIHJlc3RydWN0dXJlIFVTQgorICogICAyMDA1MDgxNiBoZW5rCU1lcmdlIDIuNi4xMy1yYzYKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJtYXBfdG9fN3NlZ21lbnQuaCIKKyNpbmNsdWRlICJ5ZWFsaW5rLmgiCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInlsZC0yMDA1MDgxNiIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiSGVuayBWZXJnb25ldCIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIlllYWxpbmsgcGhvbmUgZHJpdmVyIgorCisjZGVmaW5lIFlFQUxJTktfUE9MTElOR19GUkVRVUVOQ1kJMTAJLyogaW4gW0h6XSAqLworCitzdHJ1Y3QgeWxkX3N0YXR1cyB7CisJdTgJbGNkWzI0XTsKKwl1OAlsZWQ7CisJdTgJZGlhbHRvbmU7CisJdTgJcmluZ3RvbmU7CisJdTgJa2V5bnVtOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBSZWdpc3RlciB0aGUgTENEIHNlZ21lbnQgYW5kIGljb24gbWFwCisgKi8KKyNkZWZpbmUgX0xPQyhrLGwpCXsgLmEgPSAoayksIC5tID0gKGwpIH0KKyNkZWZpbmUgX1NFRyh0LCBhLCBhbSwgYiwgYm0sIGMsIGNtLCBkLCBkbSwgZSwgZW0sIGYsIGZtLCBnLCBnbSkJXAorCXsgLnR5cGUJPSAodCksCQkJCQkJCVwKKwkgIC51ID0geyAucyA9IHsJX0xPQyhhLCBhbSksIF9MT0MoYiwgYm0pLCBfTE9DKGMsIGNtKSwJCVwKKwkJICAgICAgICBfTE9DKGQsIGRtKSwgX0xPQyhlLCBlbSksIF9MT0MoZywgZ20pLAkJXAorCQkJX0xPQyhmLCBmbSkgfSB9IH0KKyNkZWZpbmUgX1BJQyh0LCBoLCBobSwgbikJCQkJCQlcCisJeyAudHlwZQk9ICh0KSwJCQkJCQkJXAorIAkgIC51ID0geyAucCA9IHsgLm5hbWUgPSAobiksIC5hID0gKGgpLCAubSA9IChobSkgfSB9IH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsY2Rfc2VnbWVudF9tYXAgeworCWNoYXIJdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCBwaWN0b2dyYW1fbWFwIHsKKwkJCXU4CWEsbTsKKwkJCWNoYXIJbmFtZVsxMF07CisJCX0JcDsKKwkJc3RydWN0IHNlZ21lbnRfbWFwIHsKKwkJCXU4CWEsbTsKKwkJfSBzWzddOworCX0gdTsKK30gbGNkTWFwW10gPSB7CisjaW5jbHVkZSAieWVhbGluay5oIgorfTsKKworc3RydWN0IHllYWxpbmtfZGV2IHsKKwlzdHJ1Y3QgaW5wdXRfZGV2IGlkZXY7CQkvKiBpbnB1dCBkZXZpY2UgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsJLyogdXNiIGRldmljZSAqLworCisJLyogaXJxIGlucHV0IGNoYW5uZWwgKi8KKwlzdHJ1Y3QgeWxkX2N0bF9wYWNrZXQJKmlycV9kYXRhOworCWRtYV9hZGRyX3QgCQlpcnFfZG1hOworCXN0cnVjdCB1cmIJCSp1cmJfaXJxOworCisJLyogY29udHJvbCBvdXRwdXQgY2hhbm5lbCAqLworCXN0cnVjdCB5bGRfY3RsX3BhY2tldAkqY3RsX2RhdGE7CisJZG1hX2FkZHJfdAkJY3RsX2RtYTsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0CSpjdGxfcmVxOworCWRtYV9hZGRyX3QJCWN0bF9yZXFfZG1hOworCXN0cnVjdCB1cmIJCSp1cmJfY3RsOworCisJY2hhciBwaHlzWzY0XTsJCQkvKiBwaHlzaWNhbCBkZXZpY2UgcGF0aCAqLworCisJdTggbGNkTWFwW0FSUkFZX1NJWkUobGNkTWFwKV07CS8qIHN0YXRlIG9mIExDRCwgTEVEIC4uLiAqLworCWludCBrZXlfY29kZTsJCQkvKiBsYXN0IHJlcG9ydGVkIGtleQkgKi8KKworCWludAlzdGF0X2l4OworCXVuaW9uIHsKKwkJc3RydWN0IHlsZF9zdGF0dXMgczsKKwkJdTgJCSAgYltzaXplb2Yoc3RydWN0IHlsZF9zdGF0dXMpXTsKKwl9IG1hc3RlciwgY29weTsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFllYWxpbmsgbGNkIGludGVyZmFjZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFJlZ2lzdGVyIGEgZGVmYXVsdCA3IHNlZ21lbnQgY2hhcmFjdGVyIHNldAorICovCitzdGF0aWMgU0VHN19ERUZBVUxUX01BUChtYXBfc2VnNyk7CisKKyAvKiBEaXNwbGF5IGEgY2hhciwKKyAgKiBjaGFyICdcOScgYW5kICdcbicgYXJlIHBsYWNlaG9sZGVycyBhbmQgZG8gbm90IG92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgdGV4dC4KKyAgKiBBIHNwYWNlIHdpbGwgYWx3YXlzIGhpZGUgYW4gaWNvbi4KKyAgKi8KK3N0YXRpYyBpbnQgc2V0Q2hhcihzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZCwgaW50IGVsLCBpbnQgY2hyKQoreworCWludCBpLCBhLCBtLCB2YWw7CisKKwlpZiAoZWwgPj0gQVJSQVlfU0laRShsY2RNYXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjaHIgPT0gJ1x0JyB8fCBjaHIgPT0gJ1xuJykKKwkgICAgcmV0dXJuIDA7CisKKwl5bGQtPmxjZE1hcFtlbF0gPSBjaHI7CisKKwlpZiAobGNkTWFwW2VsXS50eXBlID09ICcuJykgeworCQlhID0gbGNkTWFwW2VsXS51LnAuYTsKKwkJbSA9IGxjZE1hcFtlbF0udS5wLm07CisJCWlmIChjaHIgIT0gJyAnKQorCQkJeWxkLT5tYXN0ZXIuYlthXSB8PSBtOworCQllbHNlCisJCQl5bGQtPm1hc3Rlci5iW2FdICY9IH5tOworCQlyZXR1cm4gMDsKKwl9CisKKwl2YWwgPSBtYXBfdG9fc2VnNygmbWFwX3NlZzcsIGNocik7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGNkTWFwWzBdLnUucyk7IGkrKykgeworCQltID0gbGNkTWFwW2VsXS51LnNbaV0ubTsKKworCQlpZiAobSA9PSAwKQorCQkJY29udGludWU7CisKKwkJYSA9IGxjZE1hcFtlbF0udS5zW2ldLmE7CisJCWlmICh2YWwgJiAxKQorCQkJeWxkLT5tYXN0ZXIuYlthXSB8PSBtOworCQllbHNlCisJCQl5bGQtPm1hc3Rlci5iW2FdICY9IH5tOworCQl2YWwgPSB2YWwgPj4gMTsKKwl9CisJcmV0dXJuIDA7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWWVhbGluayBrZXkgaW50ZXJmYWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNYXAgZGV2aWNlIGJ1dHRvbnMgdG8gaW50ZXJuYWwga2V5IGV2ZW50cy4KKyAqCisgKiBVU0ItUDFLIGJ1dHRvbiBsYXlvdXQ6CisgKgorICogICAgICAgICAgICAgdXAKKyAqICAgICAgIElOICAgICAgICAgICBPVVQKKyAqICAgICAgICAgICAgZG93bgorICoKKyAqICAgICBwaWNrdXAgICBDICAgIGhhbmd1cAorICogICAgICAgMSAgICAgIDIgICAgICAzCisgKiAgICAgICA0ICAgICAgNSAgICAgIDYKKyAqICAgICAgIDcgICAgICA4ICAgICAgOQorICogICAgICAgKiAgICAgIDAgICAgICAjCisgKgorICogVGhlICJ1cCIgYW5kICJkb3duIiBrZXlzLCBhcmUgc3ltYm9saXNlZCBieSBhcnJvd3Mgb24gdGhlIGJ1dHRvbi4KKyAqIFRoZSAicGlja3VwIiBhbmQgImhhbmd1cCIga2V5cyBhcmUgc3ltYm9saXNlZCBieSBhIGdyZWVuIGFuZCByZWQgcGhvbmUKKyAqIG9uIHRoZSBidXR0b24uCisgKi8KK3N0YXRpYyBpbnQgbWFwX3Axa190b19rZXkoaW50IHNjYW5jb2RlKQoreworCXN3aXRjaChzY2FuY29kZSkgewkJLyogcGhvbmUga2V5OgkqLworCWNhc2UgMHgyMzogcmV0dXJuIEtFWV9MRUZUOwkvKiAgIElOCQkqLworCWNhc2UgMHgzMzogcmV0dXJuIEtFWV9VUDsJLyogICB1cAkJKi8KKwljYXNlIDB4MDQ6IHJldHVybiBLRVlfUklHSFQ7CS8qICAgT1VUCSovCisJY2FzZSAweDI0OiByZXR1cm4gS0VZX0RPV047CS8qICAgZG93bgkqLworCWNhc2UgMHgwMzogcmV0dXJuIEtFWV9FTlRFUjsJLyogICBwaWNrdXAJKi8KKwljYXNlIDB4MTQ6IHJldHVybiBLRVlfQkFDS1NQQUNFOyAvKiAgQwkJKi8KKwljYXNlIDB4MTM6IHJldHVybiBLRVlfRVNDOwkvKiAgIGhhbmd1cAkqLworCWNhc2UgMHgwMDogcmV0dXJuIEtFWV8xOwkvKiAgIDEJCSovCisJY2FzZSAweDAxOiByZXR1cm4gS0VZXzI7CS8qICAgMiAJCSovCisJY2FzZSAweDAyOiByZXR1cm4gS0VZXzM7CS8qICAgMwkJKi8KKwljYXNlIDB4MTA6IHJldHVybiBLRVlfNDsJLyogICA0CQkqLworCWNhc2UgMHgxMTogcmV0dXJuIEtFWV81OwkvKiAgIDUJCSovCisJY2FzZSAweDEyOiByZXR1cm4gS0VZXzY7CS8qICAgNgkJKi8KKwljYXNlIDB4MjA6IHJldHVybiBLRVlfNzsJLyogICA3CQkqLworCWNhc2UgMHgyMTogcmV0dXJuIEtFWV84OwkvKiAgIDgJCSovCisJY2FzZSAweDIyOiByZXR1cm4gS0VZXzk7CS8qICAgOQkJKi8KKwljYXNlIDB4MzA6IHJldHVybiBLRVlfS1BBU1RFUklTSzsgLyogKgkJKi8KKwljYXNlIDB4MzE6IHJldHVybiBLRVlfMDsJLyogICAwCQkqLworCWNhc2UgMHgzMjogcmV0dXJuIEtFWV9MRUZUU0hJRlQgfAorCQkJICBLRVlfMyA8PCA4OwkvKiAgICMJCSovCisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisvKiBDb21wbGV0ZXMgYSByZXF1ZXN0IGJ5IGNvbnZlcnRpbmcgdGhlIGRhdGEgaW50byBldmVudHMgZm9yIHRoZQorICogaW5wdXQgc3Vic3lzdGVtLgorICoKKyAqIFRoZSBrZXkgcGFyYW1ldGVyIGNhbiBiZSBjYXNjYWRlZDoga2V5MiA8PCA4IHwga2V5MQorICovCitzdGF0aWMgdm9pZCByZXBvcnRfa2V5KHN0cnVjdCB5ZWFsaW5rX2RldiAqeWxkLCBpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2ID0gJnlsZC0+aWRldjsKKworCWlucHV0X3JlZ3MoaWRldiwgcmVncyk7CisJaWYgKHlsZC0+a2V5X2NvZGUgPj0gMCkgeworCQkvKiBvbGQga2V5IHVwICovCisJCWlucHV0X3JlcG9ydF9rZXkoaWRldiwgeWxkLT5rZXlfY29kZSAmIDB4ZmYsIDApOworCQlpZiAoeWxkLT5rZXlfY29kZSA+PiA4KQorCQkJaW5wdXRfcmVwb3J0X2tleShpZGV2LCB5bGQtPmtleV9jb2RlID4+IDgsIDApOworCX0KKworCXlsZC0+a2V5X2NvZGUgPSBrZXk7CisJaWYgKGtleSA+PSAwKSB7CisJCS8qIG5ldyB2YWxpZCBrZXkgKi8KKwkJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBrZXkgJiAweGZmLCAxKTsKKwkJaWYgKGtleSA+PiA4KQorCQkJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBrZXkgPj4gOCwgMSk7CisJfQorCWlucHV0X3N5bmMoaWRldik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZZWFsaW5rIHVzYiBjb21tdW5pY2F0aW9uIGludGVyZmFjZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB5ZWFsaW5rX2NtZChzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZCwgc3RydWN0IHlsZF9jdGxfcGFja2V0ICpwKQoreworCXU4CSpidWYgPSAodTggKilwOworCWludAlpOworCXU4CXN1bSA9IDA7CisKKwlmb3IoaT0wOyBpPFVTQl9QS1RfTEVOLTE7IGkrKykKKwkJc3VtIC09IGJ1ZltpXTsKKwlwLT5zdW0gPSBzdW07CisJcmV0dXJuIHVzYl9jb250cm9sX21zZyh5bGQtPnVkZXYsCisJCQl1c2Jfc25kY3RybHBpcGUoeWxkLT51ZGV2LCAwKSwKKwkJCVVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT04sCisJCQlVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKKwkJCTB4MjAwLCAzLAorCQkJcCwgc2l6ZW9mKCpwKSwKKwkJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKK30KKworc3RhdGljIHU4IGRlZmF1bHRfcmluZ3RvbmVbXSA9IHsKKwkweEVGLAkJCS8qIHZvbHVtZSBbMC0yNTVdICovCisJMHhGQiwgMHgxRSwgMHgwMCwgMHgwQywJLyogMTI1MCBbaHpdLCAxMi8xMDAgW3NdICovCisJMHhGQywgMHgxOCwgMHgwMCwgMHgwQywJLyogMTAwMCBbaHpdLCAxMi8xMDAgW3NdICovCisJMHhGQiwgMHgxRSwgMHgwMCwgMHgwQywKKwkweEZDLCAweDE4LCAweDAwLCAweDBDLAorCTB4RkIsIDB4MUUsIDB4MDAsIDB4MEMsCisJMHhGQywgMHgxOCwgMHgwMCwgMHgwQywKKwkweEZCLCAweDFFLCAweDAwLCAweDBDLAorCTB4RkMsIDB4MTgsIDB4MDAsIDB4MEMsCisJMHhGRiwgMHhGRiwgMHgwMSwgMHg5MCwJLyogc2lsZW50LCA0MDAvMTAwIFtzXSAqLworCTB4MDAsIDB4MDAJCS8qIGVuZCBvZiBzZXF1ZW5jZSAqLworfTsKKworc3RhdGljIGludCB5ZWFsaW5rX3NldF9yaW5ndG9uZShzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZCwgdTggKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHlsZF9jdGxfcGFja2V0ICpwID0geWxkLT5jdGxfZGF0YTsKKwlpbnQJaXgsIGxlbjsKKworCWlmIChzaXplIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU2V0IHRoZSByaW5ndG9uZSB2b2x1bWUgKi8KKwltZW1zZXQoeWxkLT5jdGxfZGF0YSwgMCwgc2l6ZW9mKCooeWxkLT5jdGxfZGF0YSkpKTsKKwl5bGQtPmN0bF9kYXRhLT5jbWQJPSBDTURfUklOR19WT0xVTUU7CisJeWxkLT5jdGxfZGF0YS0+c2l6ZQk9IDE7CisJeWxkLT5jdGxfZGF0YS0+ZGF0YVswXQk9IGJ1ZlswXTsKKwl5ZWFsaW5rX2NtZCh5bGQsIHApOworCisJYnVmKys7CisJc2l6ZS0tOworCisJcC0+Y21kID0gQ01EX1JJTkdfTk9URTsKKwlpeCA9IDA7CisJd2hpbGUgKHNpemUgIT0gaXgpIHsKKwkJbGVuID0gc2l6ZSAtIGl4OworCQlpZiAobGVuID4gc2l6ZW9mKHAtPmRhdGEpKQorCQkJbGVuID0gc2l6ZW9mKHAtPmRhdGEpOworCQlwLT5zaXplCSAgPSBsZW47CisJCXAtPm9mZnNldCA9IGNwdV90b19iZTE2KGl4KTsKKwkJbWVtY3B5KHAtPmRhdGEsICZidWZbaXhdLCBsZW4pOworCQl5ZWFsaW5rX2NtZCh5bGQsIHApOworCQlpeCArPSBsZW47CisJfQorCXJldHVybiAwOworfQorCisvKiBrZWVwIHN0YXRfbWFzdGVyICYgc3RhdF9jb3B5IGluIHN5bmMuCisgKi8KK3N0YXRpYyBpbnQgeWVhbGlua19kb19pZGxlX3Rhc2tzKHN0cnVjdCB5ZWFsaW5rX2RldiAqeWxkKQoreworCXU4IHZhbDsKKwlpbnQgaSwgaXgsIGxlbjsKKworCWl4ID0geWxkLT5zdGF0X2l4OworCisJbWVtc2V0KHlsZC0+Y3RsX2RhdGEsIDAsIHNpemVvZigqKHlsZC0+Y3RsX2RhdGEpKSk7CisJeWxkLT5jdGxfZGF0YS0+Y21kICA9IENNRF9LRVlQUkVTUzsKKwl5bGQtPmN0bF9kYXRhLT5zaXplID0gMTsKKwl5bGQtPmN0bF9kYXRhLT5zdW0gID0gMHhmZiAtIENNRF9LRVlQUkVTUzsKKworCS8qIElmIHN0YXRlIHVwZGF0ZSBwb2ludGVyIHdyYXBzIGRvIGEgS0VZUFJFU1MgZmlyc3QuICovCisJaWYgKGl4ID49IHNpemVvZih5bGQtPm1hc3RlcikpIHsKKwkJeWxkLT5zdGF0X2l4ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZmluZCB1cGRhdGUgY2FuZGlkYXRlczogY29weSAhPSBtYXN0ZXIgKi8KKwlkbyB7CisJCXZhbCA9IHlsZC0+bWFzdGVyLmJbaXhdOworCQlpZiAodmFsICE9IHlsZC0+Y29weS5iW2l4XSkKKwkJCWdvdG8gc2VuZF91cGRhdGU7CisJfSB3aGlsZSAoKytpeCA8IHNpemVvZih5bGQtPm1hc3RlcikpOworCisJLyogbm90aGluZyB0b2RvLCB3YWl0IGEgYml0IGFuZCBwb2xsIGZvciBhIEtFWVBSRVNTICovCisJeWxkLT5zdGF0X2l4ID0gMDsKKwkvKiBUT0RPIGhvdyBjYW4gd2Ugd2FpdCBhYml0LiA/PworCSAqIG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDAgLyBZRUFMSU5LX1BPTExJTkdfRlJFUVVFTkNZKTsKKwkgKi8KKwlyZXR1cm4gMDsKKworc2VuZF91cGRhdGU6CisKKwkvKiBTZXR1cCBhbiBhcHByb3ByaWF0ZSB1cGRhdGUgcmVxdWVzdCAqLworCXlsZC0+Y29weS5iW2l4XSA9IHZhbDsKKwl5bGQtPmN0bF9kYXRhLT5kYXRhWzBdID0gdmFsOworCisJc3dpdGNoKGl4KSB7CisJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgeWxkX3N0YXR1cywgbGVkKToKKwkJeWxkLT5jdGxfZGF0YS0+Y21kCT0gQ01EX0xFRDsKKwkJeWxkLT5jdGxfZGF0YS0+c3VtCT0gLTEgLSBDTURfTEVEIC0gdmFsOworCQlicmVhazsKKwljYXNlIG9mZnNldG9mKHN0cnVjdCB5bGRfc3RhdHVzLCBkaWFsdG9uZSk6CisJCXlsZC0+Y3RsX2RhdGEtPmNtZAk9IENNRF9ESUFMVE9ORTsKKwkJeWxkLT5jdGxfZGF0YS0+c3VtCT0gLTEgLSBDTURfRElBTFRPTkUgLSB2YWw7CisJCWJyZWFrOworCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IHlsZF9zdGF0dXMsIHJpbmd0b25lKToKKwkJeWxkLT5jdGxfZGF0YS0+Y21kCT0gQ01EX1JJTkdUT05FOworCQl5bGQtPmN0bF9kYXRhLT5zdW0JPSAtMSAtIENNRF9SSU5HVE9ORSAtIHZhbDsKKwkJYnJlYWs7CisJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgeWxkX3N0YXR1cywga2V5bnVtKToKKwkJdmFsLS07CisJCXZhbCAmPSAweDFmOworCQl5bGQtPmN0bF9kYXRhLT5jbWQJPSBDTURfU0NBTkNPREU7CisJCXlsZC0+Y3RsX2RhdGEtPm9mZnNldAk9IGNwdV90b19iZTE2KHZhbCk7CisJCXlsZC0+Y3RsX2RhdGEtPmRhdGFbMF0JPSAwOworCQl5bGQtPmN0bF9kYXRhLT5zdW0JPSAtMSAtIENNRF9TQ0FOQ09ERSAtIHZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGVuID0gc2l6ZW9mKHlsZC0+bWFzdGVyLnMubGNkKSAtIGl4OworCQlpZiAobGVuID4gc2l6ZW9mKHlsZC0+Y3RsX2RhdGEtPmRhdGEpKQorCQkJbGVuID0gc2l6ZW9mKHlsZC0+Y3RsX2RhdGEtPmRhdGEpOworCisJCS8qIENvbWJpbmUgdXAgdG8gPGxlbj4gY29uc2VjdXRpdmUgTENEIGJ5dGVzIGluIGEgc2luZ2UgcmVxdWVzdAorCQkgKi8KKwkJeWxkLT5jdGxfZGF0YS0+Y21kCT0gQ01EX0xDRDsKKwkJeWxkLT5jdGxfZGF0YS0+b2Zmc2V0CT0gY3B1X3RvX2JlMTYoaXgpOworCQl5bGQtPmN0bF9kYXRhLT5zaXplCT0gbGVuOworCQl5bGQtPmN0bF9kYXRhLT5zdW0JPSAtQ01EX0xDRCAtIGl4IC0gdmFsIC0gbGVuOworCQlmb3IoaT0xOyBpPGxlbjsgaSsrKSB7CisJCQlpeCsrOworCQkJdmFsID0geWxkLT5tYXN0ZXIuYltpeF07CisJCQl5bGQtPmNvcHkuYltpeF0JCT0gdmFsOworCQkJeWxkLT5jdGxfZGF0YS0+ZGF0YVtpXQk9IHZhbDsKKwkJCXlsZC0+Y3RsX2RhdGEtPnN1bSAgICAgLT0gdmFsOworCQl9CisJfQorCXlsZC0+c3RhdF9peCA9IGl4ICsgMTsKKwlyZXR1cm4gMTsKK30KKworLyogRGVjaWRlIG9uIGhvdyB0byBoYW5kbGUgcmVzcG9uc2VzCisgKgorICogVGhlIHN0YXRlIHRyYW5zaXRpb24gZGlhZ3JhbSBpcyBzb21ldGhoaW5nIGxpa2U6CisgKgorICogICAgICAgICAgc3luY1N0YXRlPC0tKworICogICAgICAgICAgICAgICB8ICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgIGlkbGUKKyAqICAgICAgICAgICAgICBcfC8gICAgIHwKKyAqIGluaXQgLS1vay0tPiB3YWl0Rm9yS2V5IC0tb2stLT4gZ2V0S2V5CisgKiAgXiAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgfAorICogIHwgICAgICAgICAgICAgICArLS0tLS0tLW9rLS0tLS0tLSsKKyAqIGVycm9yLHN0YXJ0CisgKgorICovCitzdGF0aWMgdm9pZCB1cmJfaXJxX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHllYWxpbmtfZGV2ICp5bGQgPSB1cmItPmNvbnRleHQ7CisJaW50IHJldDsKKworCWlmICh1cmItPnN0YXR1cykKKwkJZXJyKCIlcyAtIHVyYiBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKworCXN3aXRjaCAoeWxkLT5pcnFfZGF0YS0+Y21kKSB7CisJY2FzZSBDTURfS0VZUFJFU1M6CisKKwkJeWxkLT5tYXN0ZXIucy5rZXludW0gPSB5bGQtPmlycV9kYXRhLT5kYXRhWzBdOworCQlicmVhazsKKworCWNhc2UgQ01EX1NDQU5DT0RFOgorCQlkYmcoImdldCBzY2FuY29kZSAleCIsIHlsZC0+aXJxX2RhdGEtPmRhdGFbMF0pOworCisJCXJlcG9ydF9rZXkoeWxkLCBtYXBfcDFrX3RvX2tleSh5bGQtPmlycV9kYXRhLT5kYXRhWzBdKSwgcmVncyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyKCJ1bmV4cGVjdGVkIHJlc3BvbnNlICV4IiwgeWxkLT5pcnFfZGF0YS0+Y21kKTsKKwl9CisKKwl5ZWFsaW5rX2RvX2lkbGVfdGFza3MoeWxkKTsKKworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHlsZC0+dXJiX2N0bCwgR0ZQX0FUT01JQyk7CisJaWYgKHJldCkKKwkJZXJyKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdGljIHZvaWQgdXJiX2N0bF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB5ZWFsaW5rX2RldiAqeWxkID0gdXJiLT5jb250ZXh0OworCWludCByZXQ7CisKKwlpZiAodXJiLT5zdGF0dXMpCisJCWVycigiJXMgLSB1cmIgc3RhdHVzICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisKKwlzd2l0Y2ggKHlsZC0+Y3RsX2RhdGEtPmNtZCkgeworCWNhc2UgQ01EX0tFWVBSRVNTOgorCWNhc2UgQ01EX1NDQU5DT0RFOgorCQkvKiBhc2sgZm9yIGEgcmVzcG9uc2UgKi8KKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIoeWxkLT51cmJfaXJxLCBHRlBfQVRPTUlDKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogc2VuZCBuZXcgY29tbWFuZCAqLworCQl5ZWFsaW5rX2RvX2lkbGVfdGFza3MoeWxkKTsKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIoeWxkLT51cmJfY3RsLCBHRlBfQVRPTUlDKTsKKwl9CisKKwlpZiAocmV0KQorCQllcnIoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkICVkIiwgX19GVU5DVElPTl9fLCByZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5wdXQgZXZlbnQgaW50ZXJmYWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUT0RPIHNob3VsZCB3ZSBpc3N1ZSBhIHJpbmd0b25lIG9uIGEgU05EX0JFTEwgZXZlbnQ/CitzdGF0aWMgaW50IGlucHV0X2V2KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsCisJCXVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCit7CisKKwlpZiAodHlwZSAhPSBFVl9TTkQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBTTkRfQkVMTDoKKwljYXNlIFNORF9UT05FOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyovCisKK3N0YXRpYyBpbnQgaW5wdXRfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHllYWxpbmtfZGV2ICp5bGQgPSBkZXYtPnByaXZhdGU7CisJaW50IGksIHJldDsKKworCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCisJLyogZm9yY2UgdXBkYXRlcyB0byBkZXZpY2UgKi8KKwlmb3IgKGkgPSAwOyBpPHNpemVvZih5bGQtPm1hc3Rlcik7IGkrKykKKwkJeWxkLT5jb3B5LmJbaV0gPSB+eWxkLT5tYXN0ZXIuYltpXTsKKwl5bGQtPmtleV9jb2RlID0gLTE7CS8qIG5vIGtleXMgcHJlc3NlZCAqLworCisgICAgICAgIHllYWxpbmtfc2V0X3Jpbmd0b25lKHlsZCwgZGVmYXVsdF9yaW5ndG9uZSwgc2l6ZW9mKGRlZmF1bHRfcmluZ3RvbmUpKTsKKworCS8qIGlzc3VlIElOSVQgKi8KKwltZW1zZXQoeWxkLT5jdGxfZGF0YSwgMCwgc2l6ZW9mKCooeWxkLT5jdGxfZGF0YSkpKTsKKwl5bGQtPmN0bF9kYXRhLT5jbWQJPSBDTURfSU5JVDsKKwl5bGQtPmN0bF9kYXRhLT5zaXplCT0gMTA7CisJeWxkLT5jdGxfZGF0YS0+c3VtCT0gMHgxMDAtQ01EX0lOSVQtMTA7CisJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYih5bGQtPnVyYl9jdGwsIEdGUF9LRVJORUwpKSAhPSAwKSB7CisJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAorCQkgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlucHV0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZCA9IGRldi0+cHJpdmF0ZTsKKworCXVzYl9raWxsX3VyYih5bGQtPnVyYl9jdGwpOworCXVzYl9raWxsX3VyYih5bGQtPnVyYl9pcnEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3lzZnMgaW50ZXJmYWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgREVDTEFSRV9SV1NFTShzeXNmc19yd3NlbWEpOworCisvKiBJbnRlcmZhY2UgdG8gdGhlIDctc2VnbWVudHMgdHJhbnNsYXRpb24gdGFibGUgYWthLiBjaGFyIHNldC4KKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19tYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJbWVtY3B5KGJ1ZiwgJm1hcF9zZWc3LCBzaXplb2YobWFwX3NlZzcpKTsKKwlyZXR1cm4gc2l6ZW9mKG1hcF9zZWc3KTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY250KQoreworCWlmIChjbnQgIT0gc2l6ZW9mKG1hcF9zZWc3KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtY3B5KCZtYXBfc2VnNywgYnVmLCBzaXplb2YobWFwX3NlZzcpKTsKKwlyZXR1cm4gc2l6ZW9mKG1hcF9zZWc3KTsKK30KKworLyogSW50ZXJmYWNlIHRvIHRoZSBMQ0QuCisgKi8KKworLyogUmVhZGluZyAvc3lzLy4uL2xpbmVYIHdpbGwgcmV0dXJuIHRoZSBmb3JtYXQgc3RyaW5nIHdpdGggaXRzIHNldHRpbmdzOgorICoKKyAqIEV4YW1wbGU6CisgKiBjYXQgLi9saW5lMworICogODg4ODg4ODg4ODg4CisgKiBMaW51eCBSb2NrcyEKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19saW5lKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgYSwgaW50IGIpCit7CisJc3RydWN0IHllYWxpbmtfZGV2ICp5bGQ7CisJaW50IGk7CisKKwlkb3duX3JlYWQoJnN5c2ZzX3J3c2VtYSk7CisJeWxkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKHlsZCA9PSBOVUxMKSB7CisJCXVwX3JlYWQoJnN5c2ZzX3J3c2VtYSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAoaSA9IGE7IGkgPCBiOyBpKyspCisJCSpidWYrKyA9IGxjZE1hcFtpXS50eXBlOworCSpidWYrKyA9ICdcbic7CisJZm9yIChpID0gYTsgaSA8IGI7IGkrKykKKwkJKmJ1ZisrID0geWxkLT5sY2RNYXBbaV07CisJKmJ1ZisrID0gJ1xuJzsKKwkqYnVmID0gMDsKKworCXVwX3JlYWQoJnN5c2ZzX3J3c2VtYSk7CisJcmV0dXJuIDMgKyAoKGIgLSBhKSA8PCAxKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19saW5lMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXJldHVybiBzaG93X2xpbmUoZGV2LCBidWYsIExDRF9MSU5FMV9PRkZTRVQsIExDRF9MSU5FMl9PRkZTRVQpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2xpbmUyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNob3dfbGluZShkZXYsIGJ1ZiwgTENEX0xJTkUyX09GRlNFVCwgTENEX0xJTkUzX09GRlNFVCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbGluZTMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc2hvd19saW5lKGRldiwgYnVmLCBMQ0RfTElORTNfT0ZGU0VULCBMQ0RfTElORTRfT0ZGU0VUKTsKK30KKworLyogV3JpdGluZyB0byAvc3lzLy4uL2xpbmVYIHdpbGwgc2V0IHRoZSBjb3Jlc3BvbmRpbmcgTENEIGxpbmUuCisgKiAtIEV4Y2VzcyBjaGFyYWN0ZXJzIGFyZSBpZ25vcmVkLgorICogLSBJZiBsZXNzIGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdGhhbiBhbGxvd2VkLCB0aGUgcmVtYWluaW5nIGRpZ2l0cyBhcmUKKyAqICAgdW5jaGFuZ2VkLgorICogLSBUaGUgJ1xuJyBvciAnXHQnIGNoYXIgaXMgYSBwbGFjZWhvbGRlciwgaXQgZG9lcyBub3Qgb3ZlcndyaXRlIHRoZQorICogICBvcmlnaW5hbCBjb250ZW50LgorICovCitzdGF0aWMgc3NpemVfdCBzdG9yZV9saW5lKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCWludCBlbCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZDsKKwlpbnQgaTsKKworCWRvd25fd3JpdGUoJnN5c2ZzX3J3c2VtYSk7CisJeWxkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKHlsZCA9PSBOVUxMKSB7CisJCXVwX3dyaXRlKCZzeXNmc19yd3NlbWEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAobGVuID4gY291bnQpCisJCWxlbiA9IGNvdW50OworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJc2V0Q2hhcih5bGQsIGVsKyssIGJ1ZltpXSk7CisKKwl1cF93cml0ZSgmc3lzZnNfcndzZW1hKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2xpbmUxKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIHN0b3JlX2xpbmUoZGV2LCBidWYsIGNvdW50LCBMQ0RfTElORTFfT0ZGU0VULCBMQ0RfTElORTFfU0laRSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2xpbmUyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIHN0b3JlX2xpbmUoZGV2LCBidWYsIGNvdW50LCBMQ0RfTElORTJfT0ZGU0VULCBMQ0RfTElORTJfU0laRSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2xpbmUzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIHN0b3JlX2xpbmUoZGV2LCBidWYsIGNvdW50LCBMQ0RfTElORTNfT0ZGU0VULCBMQ0RfTElORTNfU0laRSk7Cit9CisKKy8qIEludGVyZmFjZSB0byB2aXNpYmxlIGFuZCBhdWRpYmxlICJpY29ucyIsIHRoZXNlIGluY2x1ZGU6CisgKiBwaWN0dXJlcyBvbiB0aGUgTENELCB0aGUgTEVELCBhbmQgdGhlIGRpYWx0b25lIHNpZ25hbC4KKyAqLworCisvKiBHZXQgYSBsaXN0IG9mICJzd2l0Y2hhYmxlIGVsZW1lbnRzIiB3aXRoIHRoZWlyIGN1cnJlbnQgc3RhdGUuICovCitzdGF0aWMgc3NpemVfdCBnZXRfaWNvbnMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZDsKKwlpbnQgaSwgcmV0ID0gMTsKKworCWRvd25fcmVhZCgmc3lzZnNfcndzZW1hKTsKKwl5bGQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpZiAoeWxkID09IE5VTEwpIHsKKwkJdXBfcmVhZCgmc3lzZnNfcndzZW1hKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGNkTWFwKTsgaSsrKSB7CisJCWlmIChsY2RNYXBbaV0udHlwZSAhPSAnLicpCisJCQljb250aW51ZTsKKwkJcmV0ICs9IHNwcmludGYoJmJ1ZltyZXRdLCAiJXMgJXNcbiIsCisJCQkJeWxkLT5sY2RNYXBbaV0gPT0gJyAnID8gIiAgIiA6ICJvbiIsCisJCQkJbGNkTWFwW2ldLnUucC5uYW1lKTsKKwl9CisJdXBfcmVhZCgmc3lzZnNfcndzZW1hKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBDaGFuZ2UgdGhlIHZpc2liaWxpdHkgb2YgYSBwYXJ0aWN1bGFyIGVsZW1lbnQuICovCitzdGF0aWMgc3NpemVfdCBzZXRfaWNvbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJaW50IGNocikKK3sKKwlzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZDsKKwlpbnQgaTsKKworCWRvd25fd3JpdGUoJnN5c2ZzX3J3c2VtYSk7CisJeWxkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKHlsZCA9PSBOVUxMKSB7CisJCXVwX3dyaXRlKCZzeXNmc19yd3NlbWEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsY2RNYXApOyBpKyspIHsKKwkJaWYgKGxjZE1hcFtpXS50eXBlICE9ICcuJykKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RybmNtcChidWYsIGxjZE1hcFtpXS51LnAubmFtZSwgY291bnQpID09IDApIHsKKwkJCXNldENoYXIoeWxkLCBpLCBjaHIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl1cF93cml0ZSgmc3lzZnNfcndzZW1hKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaWNvbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gc2V0X2ljb24oZGV2LCBidWYsIGNvdW50LCBidWZbMF0pOworfQorCitzdGF0aWMgc3NpemVfdCBoaWRlX2ljb24oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIHNldF9pY29uKGRldiwgYnVmLCBjb3VudCwgJyAnKTsKK30KKworLyogVXBsb2FkIGEgcmluZ3RvbmUgdG8gdGhlIGRldmljZS4KKyAqLworCisvKiBTdG9yZXMgcmF3IHJpbmd0b25lIGRhdGEgaW4gdGhlIHBob25lICovCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yaW5ndG9uZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZDsKKworCWRvd25fd3JpdGUoJnN5c2ZzX3J3c2VtYSk7CisJeWxkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKHlsZCA9PSBOVUxMKSB7CisJCXVwX3dyaXRlKCZzeXNmc19yd3NlbWEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBUT0RPIGxvY2tpbmcgd2l0aCBhc3luYyB1c2IgY29udHJvbCBpbnRlcmZhY2U/Pz8gKi8KKwl5ZWFsaW5rX3NldF9yaW5ndG9uZSh5bGQsIChjaGFyICopYnVmLCBjb3VudCk7CisJdXBfd3JpdGUoJnN5c2ZzX3J3c2VtYSk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIF9NNDQ0CVNfSVJVR08KKyNkZWZpbmUgX002NjQJU19JUlVHT3xTX0lXVVNSfFNfSVdHUlAKKyNkZWZpbmUgX00yMjAJU19JV1VTUnxTX0lXR1JQCisKK3N0YXRpYyBERVZJQ0VfQVRUUihtYXBfc2VnNwksIF9NNjY0LCBzaG93X21hcAksIHN0b3JlX21hcAkpOworc3RhdGljIERFVklDRV9BVFRSKGxpbmUxCSwgX002NjQsIHNob3dfbGluZTEJLCBzdG9yZV9saW5lMQkpOworc3RhdGljIERFVklDRV9BVFRSKGxpbmUyCSwgX002NjQsIHNob3dfbGluZTIJLCBzdG9yZV9saW5lMgkpOworc3RhdGljIERFVklDRV9BVFRSKGxpbmUzCSwgX002NjQsIHNob3dfbGluZTMJLCBzdG9yZV9saW5lMwkpOworc3RhdGljIERFVklDRV9BVFRSKGdldF9pY29ucwksIF9NNDQ0LCBnZXRfaWNvbnMJLCBOVUxMCQkpOworc3RhdGljIERFVklDRV9BVFRSKHNob3dfaWNvbgksIF9NMjIwLCBOVUxMCQksIHNob3dfaWNvbgkpOworc3RhdGljIERFVklDRV9BVFRSKGhpZGVfaWNvbgksIF9NMjIwLCBOVUxMCQksIGhpZGVfaWNvbgkpOworc3RhdGljIERFVklDRV9BVFRSKHJpbmd0b25lCSwgX00yMjAsIE5VTEwJCSwgc3RvcmVfcmluZ3RvbmUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqeWxkX2F0dHJpYnV0ZXNbXSA9IHsKKwkmZGV2X2F0dHJfbGluZTEuYXR0ciwKKwkmZGV2X2F0dHJfbGluZTIuYXR0ciwKKwkmZGV2X2F0dHJfbGluZTMuYXR0ciwKKwkmZGV2X2F0dHJfZ2V0X2ljb25zLmF0dHIsCisJJmRldl9hdHRyX3Nob3dfaWNvbi5hdHRyLAorCSZkZXZfYXR0cl9oaWRlX2ljb24uYXR0ciwKKwkmZGV2X2F0dHJfbWFwX3NlZzcuYXR0ciwKKwkmZGV2X2F0dHJfcmluZ3RvbmUuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB5bGRfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSB5bGRfYXR0cmlidXRlcworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpbnV4IGludGVyZmFjZSBhbmQgdXNiIGluaXRpYWxpc2F0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHlsZF9kZXZpY2UgeworCXUxNiBpZFZlbmRvcjsKKwl1MTYgaWRQcm9kdWN0OworCWNoYXIgKm5hbWU7Cit9IHlsZF9kZXZpY2VbXSA9IHsKKwl7IDB4Njk5MywgMHhiMDAxLCAiWWVhbGluayB1c2ItcDFrIiB9LAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYl90YWJsZSBbXSA9IHsKKwl7IFVTQl9JTlRFUkZBQ0VfSU5GTyhVU0JfQ0xBU1NfSElELCAwLCAwKSB9LAorCXsgfQorfTsKKworc3RhdGljIGludCB1c2JfY2xlYW51cChzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZCwgaW50IGVycikKK3sKKwlpZiAoeWxkID09IE5VTEwpCisJCXJldHVybiBlcnI7CisKKyAgICAgICAgaWYgKHlsZC0+dXJiX2lycSkgeworCQl1c2Jfa2lsbF91cmIoeWxkLT51cmJfaXJxKTsKKwkJdXNiX2ZyZWVfdXJiKHlsZC0+dXJiX2lycSk7CisJfQorICAgICAgICBpZiAoeWxkLT51cmJfY3RsKQorCQl1c2JfZnJlZV91cmIoeWxkLT51cmJfY3RsKTsKKyAgICAgICAgaWYgKHlsZC0+aWRldi5kZXYpCisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZ5bGQtPmlkZXYpOworCWlmICh5bGQtPmN0bF9yZXEpCisJCXVzYl9idWZmZXJfZnJlZSh5bGQtPnVkZXYsIHNpemVvZigqKHlsZC0+Y3RsX3JlcSkpLAorCQkJCXlsZC0+Y3RsX3JlcSwgeWxkLT5jdGxfcmVxX2RtYSk7CisJaWYgKHlsZC0+Y3RsX2RhdGEpCisJCXVzYl9idWZmZXJfZnJlZSh5bGQtPnVkZXYsIFVTQl9QS1RfTEVOLAorCQkJCXlsZC0+Y3RsX2RhdGEsIHlsZC0+Y3RsX2RtYSk7CisJaWYgKHlsZC0+aXJxX2RhdGEpCisJCXVzYl9idWZmZXJfZnJlZSh5bGQtPnVkZXYsIFVTQl9QS1RfTEVOLAorCQkJCXlsZC0+aXJxX2RhdGEsIHlsZC0+aXJxX2RtYSk7CisJa2ZyZWUoeWxkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZDsKKworCWRvd25fd3JpdGUoJnN5c2ZzX3J3c2VtYSk7CisJeWxkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmeWxkX2F0dHJfZ3JvdXApOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJdXBfd3JpdGUoJnN5c2ZzX3J3c2VtYSk7CisKKwl1c2JfY2xlYW51cCh5bGQsIDApOworfQorCitzdGF0aWMgaW50IHVzYl9tYXRjaChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwlpbnQgaTsKKwl1MTYgaWRWZW5kb3IgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwl1MTYgaWRQcm9kdWN0ID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeWxkX2RldmljZSk7IGkrKykgeworCQlpZiAoKGlkVmVuZG9yID09IHlsZF9kZXZpY2VbaV0uaWRWZW5kb3IpICYmCisJCSAgICAoaWRQcm9kdWN0ID09IHlsZF9kZXZpY2VbaV0uaWRQcm9kdWN0KSkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCB1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYgKGludGYpOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCXN0cnVjdCB5ZWFsaW5rX2RldiAqeWxkOworCWNoYXIgcGF0aFs2NF07CisJaW50IHJldCwgcGlwZSwgaTsKKworCWkgPSB1c2JfbWF0Y2godWRldik7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKKwlpZiAoIShlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSAhPSAzKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICgoeWxkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHllYWxpbmtfZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHlsZCwgMCwgc2l6ZW9mKCp5bGQpKTsKKwl5bGQtPnVkZXYgPSB1ZGV2OworCisJLyogYWxsb2NhdGUgdXNiIGJ1ZmZlcnMgKi8KKwl5bGQtPmlycV9kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBVU0JfUEtUX0xFTiwKKwkJCQkJU0xBQl9BVE9NSUMsICZ5bGQtPmlycV9kbWEpOworCWlmICh5bGQtPmlycV9kYXRhID09IE5VTEwpCisJCXJldHVybiB1c2JfY2xlYW51cCh5bGQsIC1FTk9NRU0pOworCisJeWxkLT5jdGxfZGF0YSA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgVVNCX1BLVF9MRU4sCisJCQkJCVNMQUJfQVRPTUlDLCAmeWxkLT5jdGxfZG1hKTsKKwlpZiAoIXlsZC0+Y3RsX2RhdGEpCisJCXJldHVybiB1c2JfY2xlYW51cCh5bGQsIC1FTk9NRU0pOworCisJeWxkLT5jdGxfcmVxID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBzaXplb2YoKih5bGQtPmN0bF9yZXEpKSwKKwkJCQkJU0xBQl9BVE9NSUMsICZ5bGQtPmN0bF9yZXFfZG1hKTsKKwlpZiAoeWxkLT5jdGxfcmVxID09IE5VTEwpCisJCXJldHVybiB1c2JfY2xlYW51cCh5bGQsIC1FTk9NRU0pOworCisJLyogYWxsb2NhdGUgdXJiIHN0cnVjdHVyZXMgKi8KKwl5bGQtPnVyYl9pcnEgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoeWxkLT51cmJfaXJxID09IE5VTEwpCisJCXJldHVybiB1c2JfY2xlYW51cCh5bGQsIC1FTk9NRU0pOworCisJeWxkLT51cmJfY3RsID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKHlsZC0+dXJiX2N0bCA9PSBOVUxMKQorCQlyZXR1cm4gdXNiX2NsZWFudXAoeWxkLCAtRU5PTUVNKTsKKworCS8qIGdldCBhIGhhbmRsZSB0byB0aGUgaW50ZXJydXB0IGRhdGEgcGlwZSAqLworCXBpcGUgPSB1c2JfcmN2aW50cGlwZSh1ZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7CisJcmV0ID0gdXNiX21heHBhY2tldCh1ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CisJaWYgKHJldCAhPSBVU0JfUEtUX0xFTikKKwkJZXJyKCJpbnZhbGlkIHBheWxvYWQgc2l6ZSAlZCwgZXhwZWN0ZWQgJWQiLCByZXQsIFVTQl9QS1RfTEVOKTsKKworCS8qIGluaXRpYWxpc2UgaXJxIHVyYiAqLworCXVzYl9maWxsX2ludF91cmIoeWxkLT51cmJfaXJxLCB1ZGV2LCBwaXBlLCB5bGQtPmlycV9kYXRhLAorCQkJVVNCX1BLVF9MRU4sCisJCQl1cmJfaXJxX2NhbGxiYWNrLAorCQkJeWxkLCBlbmRwb2ludC0+YkludGVydmFsKTsKKwl5bGQtPnVyYl9pcnEtPnRyYW5zZmVyX2RtYSA9IHlsZC0+aXJxX2RtYTsKKwl5bGQtPnVyYl9pcnEtPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCXlsZC0+dXJiX2lycS0+ZGV2ID0gdWRldjsKKworCS8qIGluaXRpYWxpc2UgY3RsIHVyYiAqLworCXlsZC0+Y3RsX3JlcS0+YlJlcXVlc3RUeXBlID0gVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwKKwkJCQkgICAgICBVU0JfRElSX09VVDsKKwl5bGQtPmN0bF9yZXEtPmJSZXF1ZXN0CT0gVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTjsKKwl5bGQtPmN0bF9yZXEtPndWYWx1ZQk9IGNwdV90b19sZTE2KDB4MjAwKTsKKwl5bGQtPmN0bF9yZXEtPndJbmRleAk9IGNwdV90b19sZTE2KGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKwl5bGQtPmN0bF9yZXEtPndMZW5ndGgJPSBjcHVfdG9fbGUxNihVU0JfUEtUX0xFTik7CisKKwl1c2JfZmlsbF9jb250cm9sX3VyYih5bGQtPnVyYl9jdGwsIHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSh2b2lkICopeWxkLT5jdGxfcmVxLCB5bGQtPmN0bF9kYXRhLCBVU0JfUEtUX0xFTiwKKwkJCXVyYl9jdGxfY2FsbGJhY2ssIHlsZCk7CisJeWxkLT51cmJfY3RsLT5zZXR1cF9kbWEJPSB5bGQtPmN0bF9yZXFfZG1hOworCXlsZC0+dXJiX2N0bC0+dHJhbnNmZXJfZG1hCT0geWxkLT5jdGxfZG1hOworCXlsZC0+dXJiX2N0bC0+dHJhbnNmZXJfZmxhZ3MJfD0gVVJCX05PX1NFVFVQX0RNQV9NQVAgfAorCQkJCQlVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwl5bGQtPnVyYl9jdGwtPmRldiA9IHVkZXY7CisKKwkvKiBmaW5kIG91dCB0aGUgcGh5c2ljYWwgYnVzIGxvY2F0aW9uICovCisJaWYgKHVzYl9tYWtlX3BhdGgodWRldiwgcGF0aCwgc2l6ZW9mKHBhdGgpKSA+IDApCisJCXNucHJpbnRmKHlsZC0+cGh5cywgc2l6ZW9mKHlsZC0+cGh5cyktMSwgICIlcy9pbnB1dDAiLCBwYXRoKTsKKworCS8qIHJlZ2lzdGVyIHNldHRpbmdzIGZvciB0aGUgaW5wdXQgZGV2aWNlICovCisJaW5pdF9pbnB1dF9kZXYoJnlsZC0+aWRldik7CisJeWxkLT5pZGV2LnByaXZhdGUJPSB5bGQ7CisJeWxkLT5pZGV2LmlkLmJ1c3R5cGUJPSBCVVNfVVNCOworCXlsZC0+aWRldi5pZC52ZW5kb3IJPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwl5bGQtPmlkZXYuaWQucHJvZHVjdAk9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwl5bGQtPmlkZXYuaWQudmVyc2lvbgk9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKwl5bGQtPmlkZXYuZGV2CQk9ICZpbnRmLT5kZXY7CisJeWxkLT5pZGV2Lm5hbWUJCT0geWxkX2RldmljZVtpXS5uYW1lOworCXlsZC0+aWRldi5waHlzCQk9IHlsZC0+cGh5czsKKwkvKiB5bGQtPmlkZXYuZXZlbnQJCT0gaW5wdXRfZXY7CVRPRE8gKi8KKwl5bGQtPmlkZXYub3BlbgkJPSBpbnB1dF9vcGVuOworCXlsZC0+aWRldi5jbG9zZQkJPSBpbnB1dF9jbG9zZTsKKworCS8qIHJlZ2lzdGVyIGF2YWlsYWJsZSBrZXkgZXZlbnRzICovCisJeWxkLT5pZGV2LmV2Yml0WzBdID0gQklUKEVWX0tFWSk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWludCBrID0gbWFwX3Axa190b19rZXkoaSk7CisJCWlmIChrID49IDApIHsKKwkJCXNldF9iaXQoayAmIDB4ZmYsIHlsZC0+aWRldi5rZXliaXQpOworCQkJaWYgKGsgPj4gOCkKKwkJCQlzZXRfYml0KGsgPj4gOCwgeWxkLT5pZGV2LmtleWJpdCk7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJpbnB1dDogJXMgb24gJXNcbiIsIHlsZC0+aWRldi5uYW1lLCBwYXRoKTsKKworCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmeWxkLT5pZGV2KTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgeWxkKTsKKworCS8qIGNsZWFyIHZpc2libGUgZWxlbWVudHMgKi8KKwlmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGxjZE1hcCk7IGkrKykKKwkJc2V0Q2hhcih5bGQsIGksICcgJyk7CisKKwkvKiBkaXNwbGF5IGRyaXZlciB2ZXJzaW9uIG9uIExDRCBsaW5lIDMgKi8KKwlzdG9yZV9saW5lMygmaW50Zi0+ZGV2LCBOVUxMLAorCQkJRFJJVkVSX1ZFUlNJT04sIHNpemVvZihEUklWRVJfVkVSU0lPTikpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKGRvbid0IGNhcmUgYWJvdXQgZmFpbHVyZSkgKi8KKwlzeXNmc19jcmVhdGVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmeWxkX2F0dHJfZ3JvdXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgeWVhbGlua19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ5ZWFsaW5rIiwKKwkucHJvYmUJCT0gdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gdXNiX3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgeWVhbGlua19kZXZfaW5pdCh2b2lkKQoreworCWludCByZXQgPSB1c2JfcmVnaXN0ZXIoJnllYWxpbmtfZHJpdmVyKTsKKwlpZiAocmV0ID09IDApCisJCWluZm8oRFJJVkVSX0RFU0MgIjoiIERSSVZFUl9WRVJTSU9OKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgeWVhbGlua19kZXZfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZ5ZWFsaW5rX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHllYWxpbmtfZGV2X2luaXQpOworbW9kdWxlX2V4aXQoeWVhbGlua19kZXZfZXhpdCk7CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgdXNiX3RhYmxlKTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC95ZWFsaW5rLmggYi9kcml2ZXJzL3VzYi9pbnB1dC95ZWFsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhZjBiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3llYWxpbmsuaApAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIGRyaXZlcnMvdXNiL2lucHV0L3llYWxpbmsuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBIZW5rIFZlcmdvbmV0IDxIZW5rLlZlcmdvbmV0QGdtYWlsLmNvbT4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBJTlBVVF9ZRUFMSU5LX0gKKyNkZWZpbmUgSU5QVVRfWUVBTElOS19ICisKKy8qIFVzaW5nIHRoZSBjb250cm9sIGNoYW5uZWwgb24gaW50ZXJmYWNlIDMgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwaG9uZQorICogY2FuIGJlIGNvbnRyb2xsZWQgbGlrZSBMQ0QsIExFRCwgZGlhbHRvbmUgYW5kIHRoZSByaW5ndG9uZS4KKyAqLworCitzdHJ1Y3QgeWxkX2N0bF9wYWNrZXQgeworCXU4CWNtZDsJCS8qIGNvbW1hbmQgY29kZSwgc2VlIGJlbG93ICovCisJdTgJc2l6ZTsJCS8qIDEtMTEsIHNpemUgb2YgdXNlZCBkYXRhIGJ5dGVzLiAqLworCXUxNglvZmZzZXQ7CQkvKiBpbnRlcm5hbCBwYWNrZXQgb2Zmc2V0ICovCisJdTgJZGF0YVsxMV07CisJczgJc3VtOwkJLyogbmVnYXRpdmUgc3VtIG9mIDE1IHByZWNlZGluZyBieXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX1BLVF9MRU4Jc2l6ZW9mKHN0cnVjdCB5bGRfY3RsX3BhY2tldCkKKworLyogVGhlIGZvbGxvd2luZyB5bGRfY3RsX3BhY2tldCdzIGFyZSBhdmFpbGFibGU6ICovCisKKy8qIEluaXQgcmVnaXN0ZXJzCisgKgorICogY21kCQkweDhlCisgKiBzaXplCQkxMAorICogb2Zmc2V0CTAKKyAqIGRhdGEJCTAsMCwwLDAuLi4uCisgKi8KKyNkZWZpbmUgQ01EX0lOSVQJCTB4OGUKKworLyogUmVxdWVzdCBrZXkgc2NhbgorICoKKyAqIGNtZAkJMHg4MAorICogc2l6ZQkJMQorICogb2Zmc2V0CTAKKyAqIGRhdGFbMF0Jb24gcmV0dXJuIHJldHVybnMgdGhlIGtleSBudW1iZXIsIGlmIGl0IGNoYW5nZXMgdGhlcmUncyBhIG5ldworICogCQlrZXkgcHJlc3NlZC4KKyAqLworI2RlZmluZSBDTURfS0VZUFJFU1MJCTB4ODAKKworLyogUmVxdWVzdCBzY2FuY29kZQorICoKKyAqIGNtZAkJMHg4MQorICogc2l6ZQkJMQorICogb2Zmc2V0CWtleSBudW1iZXIgWzAtMWZdCisgKiBkYXRhWzBdCW9uIHJldHVybiByZXR1cm5zIHRoZSBzY2FuY29kZQorICovCisjZGVmaW5lIENNRF9TQ0FOQ09ERQkJMHg4MQorCisvKiBTZXQgTENECisgKgorICogY21kCQkweDA0CisgKiBzaXplCQkxLTExCisgKiBvZmZzZXQJMC0yMworICogZGF0YQkJc2VnbWVudCBiaXRzCisgKi8KKyNkZWZpbmUgQ01EX0xDRAkJCTB4MDQKKworLyogU2V0IGxlZAorICoKKyAqIGNtZAkJMHgwNQorICogc2l6ZQkJMQorICogb2Zmc2V0CTAKKyAqIGRhdGFbMF0JMCBPRkYgLyAxIE9OCisgKi8KKyNkZWZpbmUgQ01EX0xFRAkJCTB4MDUKKworLyogU2V0IHJpbmd0b25lIHZvbHVtZQorICoKKyAqIGNtZAkJMHgxMQorICogc2l6ZQkJMQorICogb2Zmc2V0CTAKKyAqIGRhdGFbMF0JMC0weGZmICB2b2x1bWUKKyAqLworI2RlZmluZSBDTURfUklOR19WT0xVTUUJCTB4MTEKKworLyogU2V0IHJpbmd0b25lIG5vdGVzCisgKgorICogY21kCQkweDAyCisgKiBzaXplCQkxLTExCisgKiBvZmZzZXQJMC0+CisgKiBkYXRhCQliaW5hcnkgcmVwcmVzZW50YXRpb24gTEUxNigtZnJlcSksIExFMTYoZHVyYXRpb24pIC4uLi4KKyAqLworI2RlZmluZSBDTURfUklOR19OT1RFCQkweDAyCisKKy8qIFNvdW5kIHJpbmd0b25lIHZpYSB0aGUgc3BlYWtlciBvbiB0aGUgYmFjaworICoKKyAqIGNtZAkJMHgwMworICogc2l6ZQkJMQorICogb2Zmc2V0CTAKKyAqIGRhdGFbMF0JMCBPRkYgLyAweDI0IE9OCisgKi8KKyNkZWZpbmUgQ01EX1JJTkdUT05FCQkweDAzCisKKy8qIFNvdW5kIGRpYWwgdG9uZSB2aWEgdGhlIGVhciBzcGVha2VyCisgKgorICogY21kCQkweDA5CisgKiBzaXplCQkxCisgKiBvZmZzZXQJMAorICogZGF0YVswXQkwIE9GRiAvIDEgT04KKyAqLworI2RlZmluZSBDTURfRElBTFRPTkUJCTB4MDkKKworI2VuZGlmIC8qIElOUFVUX1lFQUxJTktfSCAqLworCisKKyNpZiBkZWZpbmVkKF9TRUcpICYmIGRlZmluZWQoX1BJQykKKy8qIFRoaXMgdGFibGUgbWFwcyB0aGUgTENEIHNlZ21lbnRzIG9udG8gaW5kaXZpZHVhbCBiaXQgcG9zaXRpb25zIGluIHRoZQorICogeWxkX3N0YXR1cyBzdHJ1Y3QuCisgKi8KKworLyogTENELCBlYWNoIHNlZ21lbnQgbXVzdCBiZSBkcml2ZW4gc2VwZXJhdGVseS4KKyAqCisgKiBMYXlvdXQ6CisgKgorICogICB8W10gICBbXVtdICAgW11bXSAgIFtdW10gICBpbiAgIHxbXVtdCisgKiAgIHxbXSBNIFtdW10gRCBbXVtdIDogW11bXSAgIG91dCAgfFtdW10KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZQorICoKKyAqICAgIE5FVyBSRVAgICAgICAgICBTVSBNTyBUVSBXRSBUSCBGUiBTQQorICoKKyAqICAgIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdCisgKiAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXQorICovCisKKy8qIExpbmUgMQorICoJRm9ybWF0CQk6IDE4LmU4Lk04Ljg4Li4uMTg4CisgKglJY29uIG5hbWVzCTogTSBEIDogSU4gT1VUIFNUT1JFCisgKi8KKyNkZWZpbmUgTENEX0xJTkUxX09GRlNFVAkwCisjZGVmaW5lIExDRF9MSU5FMV9TSVpFCQkxNworCisvKiBOb3RlOiBmaXJzdCBnIHRoZW4gZiA9PgkJCSAgICAgICAhICAgICAgISAgICAgICovCisvKiBfU0VHKCAgICB0eXBlICAgIGEgICAgICBiICAgICAgYyAgICAgIGQgICAgICBlICAgICAgZyAgICAgIGYgICApICAqLworCV9TRUcoJzEnLCAgMCwwICwgMjIsMiAsIDIyLDIgLCAgMCwwICwgIDAsMCAsICAwLDAgLCAgMCwwCSksCisJX1NFRygnOCcsIDIwLDEgLCAyMCwyICwgMjAsNCAsIDIwLDggLCAyMSw0ICwgMjEsMiAsIDIxLDEJKSwKKwlfUElDKCcuJywgMjIsMSAsICJNIgkJCQkJCSksCisJX1NFRygnZScsIDE4LDEgLCAxOCwyICwgMTgsNCAsIDE4LDEgLCAxOSwyICwgMTgsMSAsIDE5LDEJKSwKKwlfU0VHKCc4JywgMTYsMSAsIDE2LDIgLCAxNiw0ICwgMTYsOCAsIDE3LDQgLCAxNywyICwgMTcsMQkpLAorCV9QSUMoJy4nLCAxNSw4ICwgIkQiCQkJCQkJKSwKKwlfU0VHKCdNJywgMTQsMSAsIDE0LDIgLCAxNCw0ICwgMTQsMSAsIDE1LDQgLCAxNSwyICwgMTUsMQkpLAorCV9TRUcoJzgnLCAxMiwxICwgMTIsMiAsIDEyLDQgLCAxMiw4ICwgMTMsNCAsIDEzLDIgLCAxMywxCSksCisJX1BJQygnLicsIDExLDggLCAiOiIJCQkJCQkpLAorCV9TRUcoJzgnLCAxMCwxICwgMTAsMiAsIDEwLDQgLCAxMCw4ICwgMTEsNCAsIDExLDIgLCAxMSwxCSksCisJX1NFRygnOCcsICA4LDEgLCAgOCwyICwgIDgsNCAsICA4LDggLCAgOSw0ICwgIDksMiAsICA5LDEJKSwKKwlfUElDKCcuJywgIDcsMSAsICJJTiIJCQkJCQkpLAorCV9QSUMoJy4nLCAgNywyICwgIk9VVCIJCQkJCQkpLAorCV9QSUMoJy4nLCAgNyw0ICwgIlNUT1JFIgkJCQkJKSwKKwlfU0VHKCcxJywgIDAsMCAsICA1LDEgLCAgNSwxICwgIDAsMCAsICAwLDAgLCAgMCwwICwgIDAsMAkpLAorCV9TRUcoJzgnLCAgNCwxICwgIDQsMiAsICA0LDQgLCAgNCw4ICwgIDUsOCAsICA1LDQgLCAgNSwyCSksCisJX1NFRygnOCcsICAyLDEgLCAgMiwyICwgIDIsNCAsICAyLDggLCAgMyw0ICwgIDMsMiAsICAzLDEJKSwKKworLyogTGluZSAyCisgKglGb3JtYXQJCTogLi4uLi4uLi4uCisgKglQaWN0LiBuYW1lCTogTkVXIFJFUCBTVSBNTyBUVSBXRSBUSCBGUiBTQQorICovCisjZGVmaW5lIExDRF9MSU5FMl9PRkZTRVQJTENEX0xJTkUxX09GRlNFVCArIExDRF9MSU5FMV9TSVpFCisjZGVmaW5lIExDRF9MSU5FMl9TSVpFCQk5CisKKwlfUElDKCcuJywgMjMsMiAsICJORVciCSksCisJX1BJQygnLicsIDIzLDQgLCAiUkVQIgkpLAorCV9QSUMoJy4nLCAgMSw4ICwgIlNVIgkpLAorCV9QSUMoJy4nLCAgMSw0ICwgIk1PIgkpLAorCV9QSUMoJy4nLCAgMSwyICwgIlRVIgkpLAorCV9QSUMoJy4nLCAgMSwxICwgIldFIgkpLAorCV9QSUMoJy4nLCAgMCwxICwgIlRIIgkpLAorCV9QSUMoJy4nLCAgMCwyICwgIkZSIgkpLAorCV9QSUMoJy4nLCAgMCw0ICwgIlNBIgkpLAorCisvKiBMaW5lIDMKKyAqCUZvcm1hdAkJOiA4ODg4ODg4ODg4ODgKKyAqLworI2RlZmluZSBMQ0RfTElORTNfT0ZGU0VUCUxDRF9MSU5FMl9PRkZTRVQgKyBMQ0RfTElORTJfU0laRQorI2RlZmluZSBMQ0RfTElORTNfU0laRQkJMTIKKworCV9TRUcoJzgnLCAyMiwxNiwgMjIsMzIsIDIyLDY0LCAyMiwxMjgsIDIzLDEyOCwgMjMsNjQsIDIzLDMyICApLAorCV9TRUcoJzgnLCAyMCwxNiwgMjAsMzIsIDIwLDY0LCAyMCwxMjgsIDIxLDEyOCwgMjEsNjQsIDIxLDMyICApLAorCV9TRUcoJzgnLCAxOCwxNiwgMTgsMzIsIDE4LDY0LCAxOCwxMjgsIDE5LDEyOCwgMTksNjQsIDE5LDMyICApLAorCV9TRUcoJzgnLCAxNiwxNiwgMTYsMzIsIDE2LDY0LCAxNiwxMjgsIDE3LDEyOCwgMTcsNjQsIDE3LDMyICApLAorCV9TRUcoJzgnLCAxNCwxNiwgMTQsMzIsIDE0LDY0LCAxNCwxMjgsIDE1LDEyOCwgMTUsNjQsIDE1LDMyICApLAorCV9TRUcoJzgnLCAxMiwxNiwgMTIsMzIsIDEyLDY0LCAxMiwxMjgsIDEzLDEyOCwgMTMsNjQsIDEzLDMyICApLAorCV9TRUcoJzgnLCAxMCwxNiwgMTAsMzIsIDEwLDY0LCAxMCwxMjgsIDExLDEyOCwgMTEsNjQsIDExLDMyICApLAorCV9TRUcoJzgnLCAgOCwxNiwgIDgsMzIsICA4LDY0LCAgOCwxMjgsICA5LDEyOCwgIDksNjQsICA5LDMyICApLAorCV9TRUcoJzgnLCAgNiwxNiwgIDYsMzIsICA2LDY0LCAgNiwxMjgsICA3LDEyOCwgIDcsNjQsICA3LDMyICApLAorCV9TRUcoJzgnLCAgNCwxNiwgIDQsMzIsICA0LDY0LCAgNCwxMjgsICA1LDEyOCwgIDUsNjQsICA1LDMyICApLAorCV9TRUcoJzgnLCAgMiwxNiwgIDIsMzIsICAyLDY0LCAgMiwxMjgsICAzLDEyOCwgIDMsNjQsICAzLDMyICApLAorCV9TRUcoJzgnLCAgMCwxNiwgIDAsMzIsICAwLDY0LCAgMCwxMjgsICAxLDEyOCwgIDEsNjQsICAxLDMyICApLAorCisvKiBMaW5lIDQKKyAqCisgKiBUaGUgTEVELCBESUFMVE9ORSBhbmQgUklOR1RPTkUgYXJlIGltcGxlbWVudGVkIGFzIGljb25zIGFuZCB1c2UgdGhlIHNhbWUKKyAqIHN5c2ZzIGludGVyZmFjZS4KKyAqLworI2RlZmluZSBMQ0RfTElORTRfT0ZGU0VUCUxDRF9MSU5FM19PRkZTRVQgKyBMQ0RfTElORTNfU0laRQorCisJX1BJQygnLicsIG9mZnNldG9mKHN0cnVjdCB5bGRfc3RhdHVzLCBsZWQpCSwgMHgwMSwgIkxFRCIgKSwKKwlfUElDKCcuJywgb2Zmc2V0b2Yoc3RydWN0IHlsZF9zdGF0dXMsIGRpYWx0b25lKSAsIDB4MDEsICJESUFMVE9ORSIgKSwKKwlfUElDKCcuJywgb2Zmc2V0b2Yoc3RydWN0IHlsZF9zdGF0dXMsIHJpbmd0b25lKSAsIDB4MjQsICJSSU5HVE9ORSIgKSwKKworI3VuZGVmIF9TRUcKKyN1bmRlZiBfUElDCisjZW5kaWYgLyogX1NFRyAmJiBfUElDICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3N0djY4MC5jCmluZGV4IDczOThhN2YuLjBmZDBmYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21lZGlhL3N0djY4MC5jCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3N0djY4MC5jCkBAIC0yNjAsNyArMjYwLDcgQEAKIAkJCVBERUJVRyAoMCwgIlNUVihpKTogQ2FtZXJhIHNldCB0byBvcmlnaW5hbCByZXNvbHV0aW9uIik7CiAJfQogCS8qIG9yaWdNb2RlICovCi0Ja2ZyZWUgKGJ1Zik7CisJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gaTsKIH0KIApAQCAtMjc2LDcgKzI3Niw3IEBACiAJfQogCiAJaWYgKChpID0gc3R2X3NldF9jb25maWcgKGRldiwgMSwgMCwgMCkpIDwgMCkgewotCQlrZnJlZSAoYnVmKTsKKwkJa2ZyZWUoYnVmKTsKIAkJcmV0dXJuIGk7CiAJfQogCkBAIC0zMDEsMTMgKzMwMSwxMyBAQAogCWdvdG8gZXhpdDsKIAogZXJyb3I6Ci0Ja2ZyZWUgKGJ1Zik7CisJa2ZyZWUoYnVmKTsKIAlpZiAoc3RvcF92aWRlbyA9PSAxKQogCQlzdHZfc3RvcF92aWRlbyAoZGV2KTsKIAlyZXR1cm4gLTE7CiAKIGV4aXQ6Ci0Ja2ZyZWUgKGJ1Zik7CisJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzI3LDcgKzMyNyw3IEBACiAKIAkvKiBzZXQgY29uZmlnIDEsIGludGVyZmFjZSAwLCBhbHRlcm5hdGUgMCAqLwogCWlmICgoaSA9IHN0dl9zZXRfY29uZmlnIChzdHY2ODAsIDEsIDAsIDApKSA8IDApIHsKLQkJa2ZyZWUgKGJ1ZmZlcik7CisJCWtmcmVlKGJ1ZmZlcik7CiAJCVBERUJVRyAoMCwgIlNUVihlKTogc2V0IGNvbmZpZyAxLDAsMCBmYWlsZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTQzNSwxMSArNDM1LDExIEBACiBlcnJvcjoKIAlpID0gc3R2X3NuZGN0cmwgKDAsIHN0djY4MCwgMHg4MCwgMCwgYnVmZmVyLCAweDAyKTsJLyogR2V0IExhc3QgRXJyb3IgKi8KIAlQREVCVUcgKDEsICJTVFYoaSk6IGxhc3QgZXJyb3I6ICVpLCAgY29tbWFuZCA9IDB4JXgiLCBidWZmZXJbMF0sIGJ1ZmZlclsxXSk7Ci0Ja2ZyZWUgKGJ1ZmZlcik7CisJa2ZyZWUoYnVmZmVyKTsKIAlyZXR1cm4gLTE7CiAKIGV4aXQ6Ci0Ja2ZyZWUgKGJ1ZmZlcik7CisJa2ZyZWUoYnVmZmVyKTsKIAogCS8qIHZpZGVvID0gMzIweDI0MCwgMzUyeDI4OCAqLwogCWlmIChzdHY2ODAtPkNJRiA9PSAxKSB7CkBAIC03MDgsMTAgKzcwOCwxMCBAQAogCQkJdXNiX2tpbGxfdXJiIChzdHY2ODAtPnVyYltpXSk7CiAJCQl1c2JfZnJlZV91cmIgKHN0djY4MC0+dXJiW2ldKTsKIAkJCXN0djY4MC0+dXJiW2ldID0gTlVMTDsKLQkJCWtmcmVlIChzdHY2ODAtPnNidWZbaV0uZGF0YSk7CisJCQlrZnJlZShzdHY2ODAtPnNidWZbaV0uZGF0YSk7CiAJCX0KIAlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTVNDUkFUQ0g7IGkrKykgewotCQlrZnJlZSAoc3R2NjgwLT5zY3JhdGNoW2ldLmRhdGEpOworCQlrZnJlZShzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSk7CiAJCXN0djY4MC0+c2NyYXRjaFtpXS5kYXRhID0gTlVMTDsKIAl9CiAKQEAgLTEwNjgsNyArMTA2OCw3IEBACiAJc3R2NjgwLT51c2VyID0gMDsKIAogCWlmIChzdHY2ODAtPnJlbW92ZWQpIHsKLQkJa2ZyZWUgKHN0djY4MCk7CisJCWtmcmVlKHN0djY4MCk7CiAJCXN0djY4MCA9IE5VTEw7CiAJCVBERUJVRyAoMCwgIlNUVihpKTogZGV2aWNlIHVucmVnaXN0ZXJlZCIpOwogCX0KQEAgLTE0NDUsMTQgKzE0NDUsMTQgQEAKIAkJCXVzYl9raWxsX3VyYiAoc3R2NjgwLT51cmJbaV0pOwogCQkJdXNiX2ZyZWVfdXJiIChzdHY2ODAtPnVyYltpXSk7CiAJCQlzdHY2ODAtPnVyYltpXSA9IE5VTEw7Ci0JCQlrZnJlZSAoc3R2NjgwLT5zYnVmW2ldLmRhdGEpOworCQkJa2ZyZWUoc3R2NjgwLT5zYnVmW2ldLmRhdGEpOwogCQl9CiAJZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1TQ1JBVENIOyBpKyspCi0JCWtmcmVlIChzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSk7CisJCWtmcmVlKHN0djY4MC0+c2NyYXRjaFtpXS5kYXRhKTsKIAlQREVCVUcgKDAsICJTVFYoaSk6ICVzIGRpc2Nvbm5lY3RlZCIsIHN0djY4MC0+Y2FtZXJhX25hbWUpOwogCiAJLyogRnJlZSB0aGUgbWVtb3J5ICovCi0Ja2ZyZWUgKHN0djY4MCk7CisJa2ZyZWUoc3R2NjgwKTsKIH0KIAogc3RhdGljIHZvaWQgc3R2NjgwX2Rpc2Nvbm5lY3QgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZi5jIGIvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZi5jCmluZGV4IGNhOWYzYTMuLmYzNmMwYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21lZGlhL3c5OTY4Y2YuYworKysgYi9kcml2ZXJzL3VzYi9tZWRpYS93OTk2OGNmLmMKQEAgLTE1MjMsNyArMTUyMyw2IEBACiBzdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2F0dGFjaF9pbmZvcm0oc3RydWN0IGkyY19jbGllbnQqIGNsaWVudCkKIHsKIAlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKLQljb25zdCBjaGFyKiBjbGllbnRuYW1lID0gaTJjX2NsaWVudG5hbWUoY2xpZW50KTsKIAlpbnQgaWQgPSBjbGllbnQtPmRyaXZlci0+aWQsIGVyciA9IDA7CiAKIAlpZiAoaWQgPT0gSTJDX0RSSVZFUklEX09WQ0FNQ0hJUCkgewpAQCAtMTUzNSwxMiArMTUzNCwxMiBAQAogCQl9CiAJfSBlbHNlIHsKIAkJREJHKDQsICJSZWplY3RlZCBjbGllbnQgWyVzXSB3aXRoIGRyaXZlciBbJXNdIiwgCi0JCSAgICBjbGllbnRuYW1lLCBjbGllbnQtPmRyaXZlci0+bmFtZSkKKwkJICAgIGNsaWVudC0+bmFtZSwgY2xpZW50LT5kcml2ZXItPm5hbWUpCiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCURCRyg1LCAiSTJDIGF0dGFjaCBjbGllbnQgWyVzXSB3aXRoIGRyaXZlciBbJXNdIiwKLQkgICAgY2xpZW50bmFtZSwgY2xpZW50LT5kcml2ZXItPm5hbWUpCisJICAgIGNsaWVudC0+bmFtZSwgY2xpZW50LT5kcml2ZXItPm5hbWUpCiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1NDksMTIgKzE1NDgsMTEgQEAKIHN0YXRpYyBpbnQgdzk5NjhjZl9pMmNfZGV0YWNoX2luZm9ybShzdHJ1Y3QgaTJjX2NsaWVudCogY2xpZW50KQogewogCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtID0gaTJjX2dldF9hZGFwZGF0YShjbGllbnQtPmFkYXB0ZXIpOwotCWNvbnN0IGNoYXIqIGNsaWVudG5hbWUgPSBpMmNfY2xpZW50bmFtZShjbGllbnQpOwogCiAJaWYgKGNhbS0+c2Vuc29yX2NsaWVudCA9PSBjbGllbnQpCiAJCWNhbS0+c2Vuc29yX2NsaWVudCA9IE5VTEw7CiAKLQlEQkcoNSwgIkkyQyBkZXRhY2ggY2xpZW50IFslc10iLCBjbGllbnRuYW1lKQorCURCRyg1LCAiSTJDIGRldGFjaCBjbGllbnQgWyVzXSIsIGNsaWVudC0+bmFtZSkKIAogCXJldHVybiAwOwogfQpAQCAtMTU3MywxNSArMTU3MSwxMyBAQAogCWludCBlcnIgPSAwOwogCiAJc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGFsZ28gPSB7Ci0JCS5uYW1lID0gICAgICAgICAgIlc5OTZbODddQ0YgYWxnb3JpdGhtIiwKLQkJLmlkID0gICAgICAgICAgICBJMkNfQUxHT19TTUJVUywKIAkJLnNtYnVzX3hmZXIgPSAgICB3OTk2OGNmX2kyY19zbWJ1c194ZmVyLAogCQkuYWxnb19jb250cm9sID0gIHc5OTY4Y2ZfaTJjX2NvbnRyb2wsCiAJCS5mdW5jdGlvbmFsaXR5ID0gdzk5NjhjZl9pMmNfZnVuYywKIAl9OwogCiAJc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBhZGFwID0gewotCQkuaWQgPSAgICAgICAgICAgICAgICBJMkNfQUxHT19TTUJVUyB8IEkyQ19IV19TTUJVU19XOTk2OENGLAorCQkuaWQgPSAgICAgICAgICAgICAgICBJMkNfSFdfU01CVVNfVzk5NjhDRiwKIAkJLmNsYXNzID0gICAgICAgICAgICAgSTJDX0NMQVNTX0NBTV9ESUdJVEFMLAogCQkub3duZXIgPSAgICAgICAgICAgICBUSElTX01PRFVMRSwKIAkJLmNsaWVudF9yZWdpc3RlciA9ICAgdzk5NjhjZl9pMmNfYXR0YWNoX2luZm9ybSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvYXVlcnN3YWxkLmMgYi9kcml2ZXJzL3VzYi9taXNjL2F1ZXJzd2FsZC5jCmluZGV4IDZmNzk5NGYuLmFlNDY4MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvYXVlcnN3YWxkLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9hdWVyc3dhbGQuYwpAQCAtNDI2LDcgKzQyNiw3IEBACiAKIC8qIGNhbmNlbCBhbiB1cmIgd2hpY2ggaXMgc3VibWl0dGVkIHRvIHRoZSBjaGFpbgogICAgdGhlIHJlc3VsdCBpcyAwIGlmIHRoZSB1cmIgaXMgY2FuY2VsbGVkLCBvciAtRUlOUFJPR1JFU1MgaWYKLSAgIFVSQl9BU1lOQ19VTkxJTksgaXMgc2V0IGFuZCB0aGUgZnVuY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuCisgICB0aGUgZnVuY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuCiAqLwogc3RhdGljIGludCBhdWVyY2hhaW5fdW5saW5rX3VyYiAocGF1ZXJjaGFpbl90IGFjcCwgc3RydWN0IHVyYiAqIHVyYikKIHsKQEAgLTUxNSw3ICs1MTUsNiBAQAogICAgICAgICBhY2VwID0gYWNwLT5hY3RpdmU7CiAgICAgICAgIGlmIChhY2VwKSB7CiAgICAgICAgICAgICAgICAgdXJicCA9IGFjZXAtPnVyYnA7Ci0gICAgICAgICAgICAgICAgdXJicC0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CiAgICAgICAgICAgICAgICAgZGJnICgidW5saW5rIGFjdGl2ZSB1cmIiKTsKICAgICAgICAgICAgICAgICB1c2Jfa2lsbF91cmIgKHVyYnApOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMgYi9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMKaW5kZXggYWQxNzg5Mi4uN2U5M2FjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAJYWN0dWFsX2J1ZmZlciA9IChzaXplX3QqKShkZXYtPnJpbmdfYnVmZmVyICsgZGV2LT5yaW5nX3RhaWwqKHNpemVvZihzaXplX3QpK2Rldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUpKTsKIAlieXRlc190b19yZWFkID0gbWluKGNvdW50LCAqYWN0dWFsX2J1ZmZlcik7CiAJaWYgKGJ5dGVzX3RvX3JlYWQgPCAqYWN0dWFsX2J1ZmZlcikKLQkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiUmVhZCBidWZmZXIgb3ZlcmZsb3csICVkIGJ5dGVzIGRyb3BwZWRcbiIsCisJCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwgIlJlYWQgYnVmZmVyIG92ZXJmbG93LCAlemQgYnl0ZXMgZHJvcHBlZFxuIiwKIAkJCSAqYWN0dWFsX2J1ZmZlci1ieXRlc190b19yZWFkKTsKIAogCS8qIGNvcHkgb25lIGludGVycnVwdF9pbl9idWZmZXIgZnJvbSByaW5nX2J1ZmZlciBpbnRvIHVzZXJzcGFjZSAqLwpAQCAtNTI4LDggKzUyOCw4IEBACiAJLyogd3JpdGUgdGhlIGRhdGEgaW50byBpbnRlcnJ1cHRfb3V0X2J1ZmZlciBmcm9tIHVzZXJzcGFjZSAqLwogCWJ5dGVzX3RvX3dyaXRlID0gbWluKGNvdW50LCB3cml0ZV9idWZmZXJfc2l6ZSpkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSk7CiAJaWYgKGJ5dGVzX3RvX3dyaXRlIDwgY291bnQpCi0JCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwgIldyaXRlIGJ1ZmZlciBvdmVyZmxvdywgJWQgYnl0ZXMgZHJvcHBlZFxuIixjb3VudC1ieXRlc190b193cml0ZSk7Ci0JZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvdW50ID0gJWQsIGJ5dGVzX3RvX3dyaXRlID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgY291bnQsIGJ5dGVzX3RvX3dyaXRlKTsKKwkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiV3JpdGUgYnVmZmVyIG92ZXJmbG93LCAlemQgYnl0ZXMgZHJvcHBlZFxuIixjb3VudC1ieXRlc190b193cml0ZSk7CisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvdW50ID0gJXpkLCBieXRlc190b193cml0ZSA9ICV6ZFxuIiwgX19GVU5DVElPTl9fLCBjb3VudCwgYnl0ZXNfdG9fd3JpdGUpOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsIGJ1ZmZlciwgYnl0ZXNfdG9fd3JpdGUpKSB7CiAJCXJldHZhbCA9IC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYyBiL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCmluZGV4IDJmZDEyMjYuLmQ2M2NlNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCkBAIC0yMjksNyArMjI5LDcgQEAKIAl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHNpc3VzYi0+c2lzdXNiX2RldiwgcGlwZSwgZGF0YSwgbGVuLAogCQlzaXN1c2JfYnVsa19jb21wbGV0ZW91dCwgJnNpc3VzYi0+dXJib3V0X2NvbnRleHRbaW5kZXhdKTsKIAotCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gKHRmbGFncyB8IFVSQl9BU1lOQ19VTkxJTkspOworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gdGZsYWdzOwogCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CiAKIAlpZiAoKHVyYi0+dHJhbnNmZXJfZG1hID0gdHJhbnNmZXJfZG1hKSkKQEAgLTI5NSw3ICsyOTUsNyBAQAogCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgc2lzdXNiLT5zaXN1c2JfZGV2LCBwaXBlLCBkYXRhLCBsZW4sCiAJCQlzaXN1c2JfYnVsa19jb21wbGV0ZWluLCBzaXN1c2IpOwogCi0JdXJiLT50cmFuc2Zlcl9mbGFncyB8PSAodGZsYWdzIHwgVVJCX0FTWU5DX1VOTElOSyk7CisJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSB0ZmxhZ3M7CiAJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKIAogCWlmICgodXJiLT50cmFuc2Zlcl9kbWEgPSB0cmFuc2Zlcl9kbWEpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYwppbmRleCBjZGE3MjQ5Li41NDc5OWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYwpAQCAtOTg2LDcgKzk4Niw2IEBACiAKIAkJdS0+Y29udGV4dCA9ICZjb250ZXh0OwogCQl1LT5jb21wbGV0ZSA9IGN0cmxfY29tcGxldGU7Ci0JCXUtPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAJfQogCiAJLyogcXVldWUgdGhlIHVyYnMgKi8KQEAgLTEwNTIsNyArMTA1MSw2IEBACiAJdXJiID0gc2ltcGxlX2FsbG9jX3VyYiAodGVzdGRldl90b191c2JkZXYgKGRldiksIHBpcGUsIHNpemUpOwogCWlmICghdXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAJdXJiLT5jb250ZXh0ID0gJmNvbXBsZXRpb247CiAJdXJiLT5jb21wbGV0ZSA9IHVubGluazFfY2FsbGJhY2s7CiAKQEAgLTE1MzMsNyArMTUzMSw3IEBACiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmRldi0+c2VtKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCWlmIChpbnRmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUgIT0gUE1TR19PTikgeworCWlmIChpbnRmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgIT0gUE1fRVZFTlRfT04pIHsKIAkJdXAgKCZkZXYtPnNlbSk7CiAJCXJldHVybiAtRUhPU1RVTlJFQUNIOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZQppbmRleCBiMDAxNWI4Li4zY2YzZWEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIFVTQiBDb3JlIGZpbGVzIGFuZCBmaWxlc3lzdGVtCiAjCiAKLXVzYm1vbi1vYmpzCTo9IG1vbl9tYWluLm8gbW9uX3N0YXQubyBtb25fdGV4dC5vCit1c2Jtb24tb2Jqcwk6PSBtb25fbWFpbi5vIG1vbl9zdGF0Lm8gbW9uX3RleHQubyBtb25fZG1hLm8KIAogIyBUaGlzIGRvZXMgbm90IHVzZSBDT05GSUdfVVNCX01PTiBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byB1c2UgYSB0cmlzdGF0ZS4KIG9iai0kKENPTkZJR19VU0IpCSs9IHVzYm1vbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX2RtYS5jIGIvZHJpdmVycy91c2IvbW9uL21vbl9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTEzNjdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbW9uL21vbl9kbWEuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogVGhlIFVTQiBNb25pdG9yLCBpbnNwaXJlZCBieSBEYXZlIEhhcmRpbmcncyBVU0JNb24uCisgKgorICogbW9uX2RtYS5jOiBMaWJyYXJ5IHdoaWNoIHNub29wcyBvbiBETUEgYXJlYXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBldGUgWmFpdGNldiAoemFpdGNldkByZWRoYXQuY29tKQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CS8qIE9ubHkgbmVlZGVkIGZvciBkZWNsYXJhdGlvbnMgaW4gdXNiX21vbi5oICovCisjaW5jbHVkZSAidXNiX21vbi5oIgorCisjaWZkZWYgX19pMzg2X18JCS8qIENPTkZJR19BUkNIX0kzODYgZG9lcyBub3QgZXhpdCAqLworI2RlZmluZSBNT05fSEFTX1VOTUFQIDEKKworI2RlZmluZSBwaHlzX3RvX3BhZ2UocGh5cykJcGZuX3RvX3BhZ2UoKHBoeXMpID4+IFBBR0VfU0hJRlQpCisKK2NoYXIgbW9uX2RtYXBlZWsodW5zaWduZWQgY2hhciAqZHN0LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYWdlICpwZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgKm1hcDsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwkvKgorCSAqIE9uIGkzODYsIGEgRE1BIGhhbmRsZSBpcyB0aGUgInBoeXNpY2FsIiBhZGRyZXNzIG9mIGEgcGFnZS4KKwkgKiBJbiBvdGhlciB3b3JkcywgdGhlIGJ1cyBhZGRyZXNzIGlzIGVxdWFsIHRvIHBoeXNpY2FsIGFkZHJlc3MuCisJICogVGhlcmUgaXMgbm8gSU9NTVUuCisJICovCisJcGcgPSBwaHlzX3RvX3BhZ2UoZG1hX2FkZHIpOworCisJLyoKKwkgKiBXZSBhcmUgY2FsbGVkIGZyb20gaGFyZHdhcmUgSVJRcyBpbiBjYXNlIG9mIGNhbGxiYWNrcy4KKwkgKiBCdXQgd2UgY2FuIGJlIGNhbGxlZCBmcm9tIHNvZnRpcnEgb3IgcHJvY2VzcyBjb250ZXh0IGluIGNhc2UKKwkgKiBvZiBzdWJtaXNzaW9ucy4gSW4gc3VjaCBjYXNlLCB3ZSBuZWVkIHRvIHByb3RlY3QgS01fSVJRMC4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbWFwID0ga21hcF9hdG9taWMocGcsIEtNX0lSUTApOworCXB0ciA9IG1hcCArIChkbWFfYWRkciAmIChQQUdFX1NJWkUtMSkpOworCW1lbWNweShkc3QsIHB0ciwgbGVuKTsKKwlrdW5tYXBfYXRvbWljKG1hcCwgS01fSVJRMCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIF9faTM4Nl9fICovCisKKyNpZm5kZWYgTU9OX0hBU19VTk1BUAorY2hhciBtb25fZG1hcGVlayh1bnNpZ25lZCBjaGFyICpkc3QsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIGludCBsZW4pCit7CisJcmV0dXJuICdEJzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYwppbmRleCAyNjI2NmIzMC4uNDE3NDY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKKysrIGIvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKQEAgLTkxLDI1ICs5MSwxMSBAQAogICAgIGludCBsZW4sIGNoYXIgZXZfdHlwZSkKIHsKIAlpbnQgcGlwZSA9IHVyYi0+cGlwZTsKLQl1bnNpZ25lZCBjaGFyICpkYXRhOwotCi0JLyoKLQkgKiBUaGUgY2hlY2sgdG8gc2VlIGlmIGl0J3Mgc2FmZSB0byBwb2tlIGF0IGRhdGEgaGFzIGFuIGVub3Jtb3VzCi0JICogbnVtYmVyIG9mIGNvcm5lciBjYXNlcywgYnV0IGl0IHNlZW1zIHRoYXQgdGhlIGZvbGxvd2luZyBpcwotCSAqIG1vcmUgb3IgbGVzcyBzYWZlLgotCSAqCi0JICogV2UgZG8gbm90IGV2ZW4gdHJ5IHRvIGxvb2sgdHJhbnNmZXJfYnVmZmVyLCBiZWNhdXNlIGl0IGNhbgotCSAqIGNvbnRhaW4gbm9uLU5VTEwgZ2FyYmFnZSBpbiBjYXNlIHRoZSB1cHBlciBsZXZlbCBwcm9taXNlZCB0bwotCSAqIHNldCBETUEgZm9yIHRoZSBIQ0QuCi0JICovCi0JaWYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUCkKLQkJcmV0dXJuICdEJzsKIAogCWlmIChsZW4gPD0gMCkKIAkJcmV0dXJuICdMJzsKLQotCWlmICgoZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyKSA9PSBOVUxMKQotCQlyZXR1cm4gJ1onOwkvKiAnMCcgd291bGQgYmUgbm90IGFzIHByZXR0eS4gKi8KKwlpZiAobGVuID49IERBVEFfTUFYKQorCQlsZW4gPSBEQVRBX01BWDsKIAogCS8qCiAJICogQnVsayBpcyBlYXN5IHRvIHNob3J0Y3V0IHJlbGlhYmx5LiAKQEAgLTEyNiw4ICsxMTIsMjEgQEAKIAkJfQogCX0KIAotCWlmIChsZW4gPj0gREFUQV9NQVgpCi0JCWxlbiA9IERBVEFfTUFYOworCS8qCisJICogVGhlIGNoZWNrIHRvIHNlZSBpZiBpdCdzIHNhZmUgdG8gcG9rZSBhdCBkYXRhIGhhcyBhbiBlbm9ybW91cworCSAqIG51bWJlciBvZiBjb3JuZXIgY2FzZXMsIGJ1dCBpdCBzZWVtcyB0aGF0IHRoZSBmb2xsb3dpbmcgaXMKKwkgKiBtb3JlIG9yIGxlc3Mgc2FmZS4KKwkgKgorCSAqIFdlIGRvIG5vdCBldmVuIHRyeSB0byBsb29rIHRyYW5zZmVyX2J1ZmZlciwgYmVjYXVzZSBpdCBjYW4KKwkgKiBjb250YWluIG5vbi1OVUxMIGdhcmJhZ2UgaW4gY2FzZSB0aGUgdXBwZXIgbGV2ZWwgcHJvbWlzZWQgdG8KKwkgKiBzZXQgRE1BIGZvciB0aGUgSENELgorCSAqLworCWlmICh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVApCisJCXJldHVybiBtb25fZG1hcGVlayhlcC0+ZGF0YSwgdXJiLT50cmFuc2Zlcl9kbWEsIGxlbik7CisKKwlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuICdaJzsJLyogJzAnIHdvdWxkIGJlIG5vdCBhcyBwcmV0dHkuICovCisKIAltZW1jcHkoZXAtPmRhdGEsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCBsZW4pOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL3VzYl9tb24uaCBiL2RyaXZlcnMvdXNiL21vbi91c2JfbW9uLmgKaW5kZXggOWIwNjc4NC4uNGJlMGY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL3VzYl9tb24uaAorKysgYi9kcml2ZXJzL3VzYi9tb24vdXNiX21vbi5oCkBAIC00NSw2ICs0NSwxMCBAQAogdm9pZCBtb25fcmVhZGVyX2FkZChzdHJ1Y3QgbW9uX2J1cyAqbWJ1cywgc3RydWN0IG1vbl9yZWFkZXIgKnIpOwogdm9pZCBtb25fcmVhZGVyX2RlbChzdHJ1Y3QgbW9uX2J1cyAqbWJ1cywgc3RydWN0IG1vbl9yZWFkZXIgKnIpOwogCisvKgorICovCitleHRlcm4gY2hhciBtb25fZG1hcGVlayh1bnNpZ25lZCBjaGFyICpkc3QsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIGludCBsZW4pOworCiBleHRlcm4gc3RydWN0IHNlbWFwaG9yZSBtb25fbG9jazsKIAogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbW9uX2ZvcHNfdGV4dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9LY29uZmlnIGIvZHJpdmVycy91c2IvbmV0L0tjb25maWcKaW5kZXggYjEwNDQzMC4uOGMwMTBiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbmV0L0tjb25maWcKQEAgLTk5LDcgKzk5LDcgQEAKIAkgIHdpdGggIm1pbmlkcml2ZXJzIiBidWlsdCBhcm91bmQgYSBjb21tb24gbmV0d29yayBkcml2ZXIgY29yZQogCSAgdGhhdCBzdXBwb3J0cyBkZWVwIHF1ZXVlcyBmb3IgZWZmaWNpZW50IHRyYW5zZmVycy4gIChUaGlzIGdpdmVzCiAJICBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aCBzbWFsbCBwYWNrZXRzIGFuZCBhdCBoaWdoIHNwZWVkcykuCi0JICAKKwogCSAgVGhlIFVTQiBob3N0IHJ1bnMgInVzYm5ldCIsIGFuZCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBsaW5rIG1pZ2h0IGJlOgogCiAJICAtIEFub3RoZXIgVVNCIGhvc3QsIHdoZW4gdXNpbmcgVVNCICJuZXR3b3JrIiBvciAiZGF0YSB0cmFuc2ZlciIKQEAgLTEyNSwzOCArMTI1LDYzIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1c2JuZXQuCiAKLWNvbW1lbnQgIlVTQiBIb3N0LXRvLUhvc3QgQ2FibGVzIgotCWRlcGVuZHMgb24gVVNCX1VTQk5FVAorY29uZmlnIFVTQl9ORVRfQVg4ODE3WAorCXRyaXN0YXRlICJBU0lYIEFYODh4eHggQmFzZWQgVVNCIDIuMCBFdGhlcm5ldCBBZGFwdGVycyIKKwlkZXBlbmRzIG9uIFVTQl9VU0JORVQgJiYgTkVUX0VUSEVSTkVUCisJc2VsZWN0IENSQzMyCisJc2VsZWN0IE1JSQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgc3VwcG9ydCBmb3IgQVNJWCBBWDg4eHh4IGJhc2VkIFVTQiAyLjAKKwkgIDEwLzEwMCBFdGhlcm5ldCBhZGFwdGVycy4KIAotY29uZmlnIFVTQl9BTElfTTU2MzIKLQlib29sZWFuICJBTGkgTTU2MzIgYmFzZWQgJ1VTQiAyLjAgRGF0YSBMaW5rJyBjYWJsZXMiCisgCSAgVGhpcyBkcml2ZXIgc2hvdWxkIHdvcmsgd2l0aCBhdCBsZWFzdCB0aGUgZm9sbG93aW5nIGRldmljZXM6CisJICAgICogQXRlbiBVQzIxMFQKKwkgICAgKiBBU0lYIEFYODgxNzIKKwkgICAgKiBCaWxsaW9udG9uIFN5c3RlbXMsIFVTQjJBUgorCSAgICAqIEJ1ZmZhbG8gTFVBLVUyLUtUWAorCSAgICAqIENvcmVnYSBGRXRoZXIgVVNCMi1UWAorCSAgICAqIEQtTGluayBEVUItRTEwMAorCSAgICAqIEhhd2tpbmcgVUYyMDAKKwkgICAgKiBMaW5rc3lzIFVTQjIwME0KKwkgICAgKiBOZXRnZWFyIEZBMTIwCisJICAgICogU2l0ZWNvbSBMTi0wMjkKKwkgICAgKiBJbnRlbGxpbmV0IFVTQiAyLjAgRXRoZXJuZXQKKwkgICAgKiBTVCBMYWIgVVNCIDIuMCBFdGhlcm5ldAorCSAgICAqIFRyZW5kTmV0IFRVMi1FVDEwMAorCisJICBUaGlzIGRyaXZlciBjcmVhdGVzIGFuIGludGVyZmFjZSBuYW1lZCAiZXRoWCIsIHdoZXJlIFggZGVwZW5kcyBvbgorCSAgd2hhdCBvdGhlciBuZXR3b3JraW5nIGRldmljZXMgeW91IGhhdmUgaW4gdXNlLgorCisKK2NvbmZpZyBVU0JfTkVUX0NEQ0VUSEVSCisJdHJpc3RhdGUgIkNEQyBFdGhlcm5ldCBzdXBwb3J0IChzbWFydCBkZXZpY2VzIHN1Y2ggYXMgY2FibGUgbW9kZW1zKSIKIAlkZXBlbmRzIG9uIFVTQl9VU0JORVQKIAlkZWZhdWx0IHkKIAloZWxwCi0JICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91J3JlIHVzaW5nIGEgaG9zdC10by1ob3N0IGNhYmxlCi0JICBiYXNlZCBvbiB0aGlzIGRlc2lnbiwgd2hpY2ggc3VwcG9ydHMgVVNCIDIuMCBoaWdoIHNwZWVkLgorCSAgVGhpcyBvcHRpb24gc3VwcG9ydHMgZGV2aWNlcyBjb25mb3JtaW5nIHRvIHRoZSBDb21tdW5pY2F0aW9uIERldmljZQorCSAgQ2xhc3MgKENEQykgRXRoZXJuZXQgQ29udHJvbCBNb2RlbCwgYSBzcGVjaWZpY2F0aW9uIHRoYXQncyBlYXN5IHRvCisJICBpbXBsZW1lbnQgaW4gZGV2aWNlIGZpcm13YXJlLiAgVGhlIENEQyBzcGVjaWZpY2F0aW9ucyBhcmUgYXZhaWxhYmxlCisJICBmcm9tIDxodHRwOi8vd3d3LnVzYi5vcmcvPi4KIAotY29uZmlnIFVTQl9BTjI3MjAKLQlib29sZWFuICJBbmNob3JDaGlwcyAyNzIwIGJhc2VkIGNhYmxlcyAoWGlyY29tIFBHVU5FVCwgLi4uKSIKLQlkZXBlbmRzIG9uIFVTQl9VU0JORVQKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91J3JlIHVzaW5nIGEgaG9zdC10by1ob3N0IGNhYmxlCi0JICBiYXNlZCBvbiB0aGlzIGRlc2lnbi4gIE5vdGUgdGhhdCBBbmNob3JDaGlwcyBpcyBub3cgYQotCSAgQ3lwcmVzcyBicmFuZC4KKwkgIENEQyBFdGhlcm5ldCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvcHRpb24gZm9yIERPQ1NJUyBjYWJsZSBtb2RlbXMKKwkgIHRoYXQgc3VwcG9ydCBVU0IgY29ubmVjdGl2aXR5LCB1c2VkIGZvciBub24tTWljcm9zb2Z0IFVTQiBob3N0cy4KKwkgIFRoZSBMaW51eC1VU0IgQ0RDIEV0aGVybmV0IEdhZGdldCBkcml2ZXIgaXMgYW4gb3BlbiBpbXBsZW1lbnRhdGlvbi4KKyAJICBUaGlzIGRyaXZlciBzaG91bGQgd29yayB3aXRoIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgZGV2aWNlczoKIAotY29uZmlnIFVTQl9CRUxLSU4KLQlib29sZWFuICJlVEVLIGJhc2VkIGhvc3QtdG8taG9zdCBjYWJsZXMgKEFkdmFuY2UsIEJlbGtpbiwgLi4uKSIKLQlkZXBlbmRzIG9uIFVTQl9VU0JORVQKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91J3JlIHVzaW5nIGEgaG9zdC10by1ob3N0IGNhYmxlCi0JICBiYXNlZCBvbiB0aGlzIGRlc2lnbjogIHR3byBOZXRDaGlwIDI4OTAgY2hpcHMgYW5kIGFuIEF0bWVsCi0JICBtaWNyb2NvbnRyb2xsZXIsIHdpdGggTEVEcyB0aGF0IGluZGljYXRlIHRyYWZmaWMuCisgCSAgICAqIEVyaWNzc29uIFBpcGVSaWRlciAoYWxsIHZhcmlhbnRzKQorIAkgICAgKiBNb3Rvcm9sYSAoRE0xMDAgYW5kIFNCNDEwMCkKKyAJICAgICogQnJvYWRjb20gQ2FibGUgTW9kZW0gKHJlZmVyZW5jZSBkZXNpZ24pCisgCSAgICAqIFRvc2hpYmEgUENYMTEwMFUKKwkgICAgKiAuLi4KIAotY29uZmlnIFVTQl9HRU5FU1lTCi0JYm9vbGVhbiAiR2VuZVN5cyBHTDYyMFVTQi1BIGJhc2VkIGNhYmxlcyIKLQlkZWZhdWx0IHkKKwkgIFRoaXMgZHJpdmVyIGNyZWF0ZXMgYW4gaW50ZXJmYWNlIG5hbWVkICJldGhYIiwgd2hlcmUgWCBkZXBlbmRzIG9uCisJICB3aGF0IG90aGVyIG5ldHdvcmtpbmcgZGV2aWNlcyB5b3UgaGF2ZSBpbiB1c2UuICBIb3dldmVyLCBpZiB0aGUKKwkgIElFRUUgODAyICJsb2NhbCBhc3NpZ25tZW50IiBiaXQgaXMgc2V0IGluIHRoZSBhZGRyZXNzLCBhICJ1c2JYIgorCSAgbmFtZSBpcyB1c2VkIGluc3RlYWQuCisKK2NvbmZpZyBVU0JfTkVUX0dMNjIwQQorCXRyaXN0YXRlICJHZW5lU3lzIEdMNjIwVVNCLUEgYmFzZWQgY2FibGVzIgogCWRlcGVuZHMgb24gVVNCX1VTQk5FVAogCWhlbHAKIAkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UncmUgdXNpbmcgYSBob3N0LXRvLWhvc3QgY2FibGUsCkBAIC0xNjQsMzggKzE4OSw3OCBAQAogCiAJICBOb3RlIHRoYXQgdGhlIGhhbGYtZHVwbGV4ICJHTDYyMFVTQiIgaXMgbm90IHN1cHBvcnRlZC4KIAotY29uZmlnIFVTQl9ORVQxMDgwCi0JYm9vbGVhbiAiTmV0Q2hpcCAxMDgwIGJhc2VkIGNhYmxlcyAoTGFwbGluaywgLi4uKSIKK2NvbmZpZyBVU0JfTkVUX05FVDEwODAKKwl0cmlzdGF0ZSAiTmV0Q2hpcCAxMDgwIGJhc2VkIGNhYmxlcyAoTGFwbGluaywgLi4uKSIKIAlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIFVTQl9VU0JORVQKIAloZWxwCiAJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91J3JlIHVzaW5nIGEgaG9zdC10by1ob3N0IGNhYmxlIGJhc2VkCi0JICBvbiB0aGlzIGRlc2lnbjogIG9uZSBOZXRDaGlwIDEwODAgY2hpcHMgYW5kIHN1cHBvcnRpbmcgbG9naWMsCi0JICBzdXBwb3J0aW5nIExFRHMgdGhhdCBpbmRpY2F0ZSB0cmFmZmljCisJICBvbiB0aGlzIGRlc2lnbjogIG9uZSBOZXRDaGlwIDEwODAgY2hpcCBhbmQgc3VwcG9ydGluZyBsb2dpYywKKwkgIG9wdGlvbmFsbHkgd2l0aCBMRURzIHRoYXQgaW5kaWNhdGUgdHJhZmZpYwogCi1jb25maWcgVVNCX1BMMjMwMQotCWJvb2xlYW4gIlByb2xpZmljIFBMLTIzMDEvMjMwMiBiYXNlZCBjYWJsZXMiCi0JZGVmYXVsdCB5Ci0JIyBoYW5kc2hha2UvaW5pdC9yZXNldCBwcm9ibGVtcywgZnJvbSBvcmlnaW5hbCAncGx1c2InIGRyaXZlcgorY29uZmlnIFVTQl9ORVRfUExVU0IKKwl0cmlzdGF0ZSAiUHJvbGlmaWMgUEwtMjMwMS8yMzAyIGJhc2VkIGNhYmxlcyIKKwkjIGlmIHRoZSBoYW5kc2hha2UvaW5pdC9yZXNldCBwcm9ibGVtcywgZnJvbSBvcmlnaW5hbCAncGx1c2InLAorCSMgYXJlIGV2ZXIgcmVzb2x2ZWQgLi4uIHRoZW4gcmVtb3ZlICJleHBlcmltZW50YWwiCiAJZGVwZW5kcyBvbiBVU0JfVVNCTkVUICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UncmUgdXNpbmcgYSBob3N0LXRvLWhvc3QgY2FibGUKIAkgIHdpdGggb25lIG9mIHRoZXNlIGNoaXBzLgogCi1jb25maWcgVVNCX0tDMjE5MAotCWJvb2xlYW4gIktUIFRlY2hub2xvZ3kgS0MyMTkwIGJhc2VkIGNhYmxlcyAoSW5zdGFOZXQpIgotCWRlZmF1bHQgeQorY29uZmlnIFVTQl9ORVRfUk5ESVNfSE9TVAorCXRyaXN0YXRlICJIb3N0IGZvciBSTkRJUyBkZXZpY2VzIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gVVNCX1VTQk5FVCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgVVNCX05FVF9DRENFVEhFUgogCWhlbHAKLQkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UncmUgdXNpbmcgYSBob3N0LXRvLWhvc3QgY2FibGUKLQkgIHdpdGggb25lIG9mIHRoZXNlIGNoaXBzLgorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBob3N0aW5nICJSZW1vdGUgTkRJUyIgVVNCIG5ldHdvcmtpbmcgbGlua3MsCisJICBhcyBlbmNvdXJhZ2VkIGJ5IE1pY3Jvc29mdCAoaW5zdGVhZCBvZiBDREMgRXRoZXJuZXQhKSBmb3IgdXNlIGluCisJICB2YXJpb3VzIGRldmljZXMgdGhhdCBtYXkgb25seSBzdXBwb3J0IHRoaXMgcHJvdG9jb2wuCiAKLWNvbW1lbnQgIkludGVsbGlnZW50IFVTQiBEZXZpY2VzL0dhZGdldHMiCisJICBBdm9pZCB1c2luZyB0aGlzIHByb3RvY29sIHVubGVzcyB5b3UgaGF2ZSBubyBiZXR0ZXIgb3B0aW9ucy4KKwkgIFRoZSBwcm90b2NvbCBzcGVjaWZpY2F0aW9uIGlzIGluY29tcGxldGUsIGFuZCBpcyBjb250cm9sbGVkIGJ5CisJICAoYW5kIGZvcikgTWljcm9zb2Z0OyBpdCBpc24ndCBhbiAiT3BlbiIgZWNvc3lzdGVtIG9yIG1hcmtldC4KKworY29uZmlnIFVTQl9ORVRfQ0RDX1NVQlNFVAorCXRyaXN0YXRlICJTaW1wbGUgVVNCIE5ldHdvcmsgTGlua3MgKENEQyBFdGhlcm5ldCBzdWJzZXQpIgogCWRlcGVuZHMgb24gVVNCX1VTQk5FVAorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIG1vZHVsZSBzdXBwb3J0cyBVU0IgbmV0d29yayBkZXZpY2VzIHRoYXQgY2FuIHdvcmsKKwkgIHdpdGhvdXQgYW55IGRldmljZS1zcGVjaWZpYyBpbmZvcm1hdGlvbi4gIFNlbGVjdCBpdCBpZiB5b3UgaGF2ZQorCSAgb25lIG9mIHRoZXNlIGRyaXZlcnMuCisKKwkgIE5vdGUgdGhhdCB3aGlsZSBtYW55IFVTQiBob3N0LXRvLWhvc3QgY2FibGVzIGNhbiB3b3JrIGluIHRoaXMgbW9kZSwKKwkgIHRoYXQgbWF5IG1lYW4gbm90IGJlaW5nIGFibGUgdG8gdGFsayB0byBXaW4zMiBzeXN0ZW1zIG9yIG1vcmUKKwkgIGNvbW1vbmx5IG5vdCBiZWluZyBhYmxlIHRvIGhhbmRsZSBjZXJ0YWluIGV2ZW50cyAobGlrZSByZXBsdWdnaW5nCisJICB0aGUgaG9zdCBvbiB0aGUgb3RoZXIgZW5kKSB2ZXJ5IHdlbGwuICBBbHNvLCB0aGVzZSBkZXZpY2VzIHdpbGwKKwkgIG5vdCBnZW5lcmFsbHkgaGF2ZSBwZXJtYW5lbnRseSBhc3NpZ25lZCBFdGhlcm5ldCBhZGRyZXNzZXMuCisKK2NvbmZpZyBVU0JfQUxJX001NjMyCisJYm9vbGVhbiAiQUxpIE01NjMyIGJhc2VkICdVU0IgMi4wIERhdGEgTGluaycgY2FibGVzIgorCWRlcGVuZHMgb24gVVNCX05FVF9DRENfU1VCU0VUCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSdyZSB1c2luZyBhIGhvc3QtdG8taG9zdCBjYWJsZQorCSAgYmFzZWQgb24gdGhpcyBkZXNpZ24sIHdoaWNoIHN1cHBvcnRzIFVTQiAyLjAgaGlnaCBzcGVlZC4KKworY29uZmlnIFVTQl9BTjI3MjAKKwlib29sZWFuICJBbmNob3JDaGlwcyAyNzIwIGJhc2VkIGNhYmxlcyAoWGlyY29tIFBHVU5FVCwgLi4uKSIKKwlkZXBlbmRzIG9uIFVTQl9ORVRfQ0RDX1NVQlNFVAorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UncmUgdXNpbmcgYSBob3N0LXRvLWhvc3QgY2FibGUKKwkgIGJhc2VkIG9uIHRoaXMgZGVzaWduLiAgTm90ZSB0aGF0IEFuY2hvckNoaXBzIGlzIG5vdyBhCisJICBDeXByZXNzIGJyYW5kLgorCitjb25maWcgVVNCX0JFTEtJTgorCWJvb2xlYW4gImVURUsgYmFzZWQgaG9zdC10by1ob3N0IGNhYmxlcyAoQWR2YW5jZSwgQmVsa2luLCAuLi4pIgorCWRlcGVuZHMgb24gVVNCX05FVF9DRENfU1VCU0VUCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSdyZSB1c2luZyBhIGhvc3QtdG8taG9zdCBjYWJsZQorCSAgYmFzZWQgb24gdGhpcyBkZXNpZ246ICB0d28gTmV0Q2hpcCAyODkwIGNoaXBzIGFuZCBhbiBBdG1lbAorCSAgbWljcm9jb250cm9sbGVyLCB3aXRoIExFRHMgdGhhdCBpbmRpY2F0ZSB0cmFmZmljLgogCiBjb25maWcgVVNCX0FSTUxJTlVYCiAJYm9vbGVhbiAiRW1iZWRkZWQgQVJNIExpbnV4IGxpbmtzIChpUGFxLCAuLi4pIgotCWRlcGVuZHMgb24gVVNCX1VTQk5FVAorCWRlcGVuZHMgb24gVVNCX05FVF9DRENfU1VCU0VUCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIHRvIHN1cHBvcnQgdGhlICJ1c2ItZXRoIiBuZXR3b3JraW5nIGRyaXZlcgpAQCAtMjEyLDE1ICsyNzcsMTUgQEAKIAogY29uZmlnIFVTQl9FUFNPTjI4ODgKIAlib29sZWFuICJFcHNvbiAyODg4IGJhc2VkIGZpcm13YXJlIChERVZFTE9QTUVOVCkiCi0JZGVwZW5kcyBvbiBVU0JfVVNCTkVUCi0JZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVU0JfTkVUX0NEQ19TVUJTRVQKIAloZWxwCiAJICBDaG9vc2UgdGhpcyBvcHRpb24gdG8gc3VwcG9ydCB0aGUgdXNiIG5ldHdvcmtpbmcgbGlua3MgdXNlZAogCSAgYnkgc29tZSBzYW1wbGUgZmlybXdhcmUgZnJvbSBFcHNvbi4KIAotY29uZmlnIFVTQl9aQVVSVVMKLQlib29sZWFuICJTaGFycCBaYXVydXMgKHN0b2NrIFJPTXMpIGFuZCBjb21wYXRpYmxlIgorY29uZmlnIFVTQl9ORVRfWkFVUlVTCisJdHJpc3RhdGUgIlNoYXJwIFphdXJ1cyAoc3RvY2sgUk9NcykgYW5kIGNvbXBhdGlibGUiCiAJZGVwZW5kcyBvbiBVU0JfVVNCTkVUCisJc2VsZWN0IFVTQl9ORVRfQ0RDRVRIRVIKIAlzZWxlY3QgQ1JDMzIKIAlkZWZhdWx0IHkKIAloZWxwCkBAIC0yMzUsNjEgKzMwMCw2IEBACiAJICByZWFsbHkgbmVlZCB0aGlzIG5vbi1jb25mb3JtYW50IHZhcmlhbnQgb2YgQ0RDIEV0aGVybmV0IChvciBpbgogCSAgc29tZSBjYXNlcyBDREMgTURMTSkgcHJvdG9jb2wsIG5vdCAiZ19ldGhlciIuCiAKLWNvbmZpZyBVU0JfQ0RDRVRIRVIKLQlib29sZWFuICJDREMgRXRoZXJuZXQgc3VwcG9ydCAoc21hcnQgZGV2aWNlcyBzdWNoIGFzIGNhYmxlIG1vZGVtcykiCi0JZGVwZW5kcyBvbiBVU0JfVVNCTkVUCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBvcHRpb24gc3VwcG9ydHMgZGV2aWNlcyBjb25mb3JtaW5nIHRvIHRoZSBDb21tdW5pY2F0aW9uIERldmljZQotCSAgQ2xhc3MgKENEQykgRXRoZXJuZXQgQ29udHJvbCBNb2RlbCwgYSBzcGVjaWZpY2F0aW9uIHRoYXQncyBlYXN5IHRvCi0JICBpbXBsZW1lbnQgaW4gZGV2aWNlIGZpcm13YXJlLiAgVGhlIENEQyBzcGVjaWZpY2F0aW9ucyBhcmUgYXZhaWxhYmxlCi0JICBmcm9tIDxodHRwOi8vd3d3LnVzYi5vcmcvPi4KLQkgIAotCSAgQ0RDIEV0aGVybmV0IGlzIGFuIGltcGxlbWVudGF0aW9uIG9wdGlvbiBmb3IgRE9DU0lTIGNhYmxlIG1vZGVtcwotCSAgdGhhdCBzdXBwb3J0IFVTQiBjb25uZWN0aXZpdHksIHVzZWQgZm9yIG5vbi1NaWNyb3NvZnQgVVNCIGhvc3RzLgotIAkgIFRoaXMgZHJpdmVyIHNob3VsZCB3b3JrIHdpdGggYXQgbGVhc3QgdGhlIGZvbGxvd2luZyBkZXZpY2VzOgotCi0gCSAgICAqIEVyaWNzc29uIFBpcGVSaWRlciAoYWxsIHZhcmlhbnRzKQotIAkgICAgKiBNb3Rvcm9sYSAoRE0xMDAgYW5kIFNCNDEwMCkKLSAJICAgICogQnJvYWRjb20gQ2FibGUgTW9kZW0gKHJlZmVyZW5jZSBkZXNpZ24pCi0gCSAgICAqIFRvc2hpYmEgUENYMTEwMFUKLQkgICAgKiAuLi4KLQotCSAgVGhpcyBkcml2ZXIgY3JlYXRlcyBhbiBpbnRlcmZhY2UgbmFtZWQgImV0aFgiLCB3aGVyZSBYIGRlcGVuZHMgb24KLQkgIHdoYXQgb3RoZXIgbmV0d29ya2luZyBkZXZpY2VzIHlvdSBoYXZlIGluIHVzZS4gIEhvd2V2ZXIsIGlmIHRoZQotCSAgSUVFRSA4MDIgImxvY2FsIGFzc2lnbm1lbnQiIGJpdCBpcyBzZXQgaW4gdGhlIGFkZHJlc3MsIGEgInVzYlgiCi0JICBuYW1lIGlzIHVzZWQgaW5zdGVhZC4KLQotY29tbWVudCAiVVNCIE5ldHdvcmsgQWRhcHRlcnMiCi0JZGVwZW5kcyBvbiBVU0JfVVNCTkVUCi0KLWNvbmZpZyBVU0JfQVg4ODE3WAotCWJvb2xlYW4gIkFTSVggQVg4OHh4eCBCYXNlZCBVU0IgMi4wIEV0aGVybmV0IERldmljZXMiCi0JZGVwZW5kcyBvbiBVU0JfVVNCTkVUICYmIE5FVF9FVEhFUk5FVAotCXNlbGVjdCBDUkMzMgotCXNlbGVjdCBNSUkKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhZGRzIHN1cHBvcnQgZm9yIEFTSVggQVg4OHh4eCBiYXNlZCBVU0IgMi4wCi0JICAxMC8xMDAgRXRoZXJuZXQgZGV2aWNlcy4KLQotIAkgIFRoaXMgZHJpdmVyIHNob3VsZCB3b3JrIHdpdGggYXQgbGVhc3QgdGhlIGZvbGxvd2luZyBkZXZpY2VzOgotCSAgICAqIEF0ZW4gVUMyMTBUCi0JICAgICogQVNJWCBBWDg4MTcyCi0JICAgICogQmlsbGlvbnRvbiBTeXN0ZW1zLCBVU0IyQVIgCi0JICAgICogQnVmZmFsbyBMVUEtVTItS1RYCi0JICAgICogQ29yZWdhIEZFdGhlciBVU0IyLVRYCi0JICAgICogRC1MaW5rIERVQi1FMTAwCi0JICAgICogSGF3a2luZyBVRjIwMAotCSAgICAqIExpbmtzeXMgVVNCMjAwTQotCSAgICAqIE5ldGdlYXIgRkExMjAKLQkgICAgKiBTaXRlY29tIExOLTAyOQotCSAgICAqIEludGVsbGluZXQgVVNCIDIuMCBFdGhlcm5ldAotCSAgICAqIFNUIExhYiBVU0IgMi4wIEV0aGVybmV0Ci0JICAgICogVHJlbmROZXQgVFUyLUVUMTAwCi0KLQkgIFRoaXMgZHJpdmVyIGNyZWF0ZXMgYW4gaW50ZXJmYWNlIG5hbWVkICJldGhYIiwgd2hlcmUgWCBkZXBlbmRzIG9uCi0JICB3aGF0IG90aGVyIG5ldHdvcmtpbmcgZGV2aWNlcyB5b3UgaGF2ZSBpbiB1c2UuICAKIAogY29uZmlnIFVTQl9aRDEyMDEKIAl0cmlzdGF0ZSAiVVNCIFpEMTIwMSBiYXNlZCBXaXJlbGVzcyBkZXZpY2Ugc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL25ldC9NYWtlZmlsZQppbmRleCAxNmYzNTIxLi4yMjJjMDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbmV0L01ha2VmaWxlCkBAIC02LDcgKzYsMTMgQEAKIG9iai0kKENPTkZJR19VU0JfS0FXRVRIKQkrPSBrYXdldGgubwogb2JqLSQoQ09ORklHX1VTQl9QRUdBU1VTKQkrPSBwZWdhc3VzLm8KIG9iai0kKENPTkZJR19VU0JfUlRMODE1MCkJKz0gcnRsODE1MC5vCitvYmotJChDT05GSUdfVVNCX05FVF9BWDg4MTdYKQkrPSBhc2l4Lm8KK29iai0kKENPTkZJR19VU0JfTkVUX0NEQ0VUSEVSKQkrPSBjZGNfZXRoZXIubworb2JqLSQoQ09ORklHX1VTQl9ORVRfR0w2MjBBKQkrPSBnbDYyMGEubworb2JqLSQoQ09ORklHX1VTQl9ORVRfTkVUMTA4MCkJKz0gbmV0MTA4MC5vCitvYmotJChDT05GSUdfVVNCX05FVF9QTFVTQikJKz0gcGx1c2Iubworb2JqLSQoQ09ORklHX1VTQl9ORVRfUk5ESVNfSE9TVCkJKz0gcm5kaXNfaG9zdC5vCitvYmotJChDT05GSUdfVVNCX05FVF9DRENfU1VCU0VUKQkrPSBjZGNfc3Vic2V0Lm8KK29iai0kKENPTkZJR19VU0JfTkVUX1pBVVJVUykJKz0gemF1cnVzLm8KIG9iai0kKENPTkZJR19VU0JfVVNCTkVUKQkrPSB1c2JuZXQubwogb2JqLSQoQ09ORklHX1VTQl9aRDEyMDEpCSs9IHpkMTIwMS5vCi0KLUNGTEFHU196ZDEyMDEubyA9IC1JZHJpdmVycy9uZXQvd2lyZWxlc3MvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvYXNpeC5jIGIvZHJpdmVycy91c2IvbmV0L2FzaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFmMDBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbmV0L2FzaXguYwpAQCAtMCwwICsxLDk0OCBAQAorLyoKKyAqIEFTSVggQVg4ODE3WCBiYXNlZCBVU0IgMi4wIEV0aGVybmV0IERldmljZXMKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IERhdmlkIEhvbGxpcyA8ZGhvbGxpc0BkYXZlaG9sbGlzLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBQaGlsIENoYW5nIDxwY2hhbmcyM0BzYmNnbG9iYWwubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgVGlWbyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8vICNkZWZpbmUJREVCVUcJCQkvLyBlcnJvciBwYXRoIG1lc3NhZ2VzLCBleHRyYSBpbmZvCisvLyAjZGVmaW5lCVZFUkJPU0UJCQkvLyBtb3JlOyBzdWNjZXNzIG1lc3NhZ2VzCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpZmRlZglDT05GSUdfVVNCX0RFQlVHCisjICAgZGVmaW5lIERFQlVHCisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgInVzYm5ldC5oIgorCisKKy8qIEFTSVggQVg4ODE3WCBiYXNlZCBVU0IgMi4wIEV0aGVybmV0IERldmljZXMgKi8KKworI2RlZmluZSBBWF9DTURfU0VUX1NXX01JSQkJMHgwNgorI2RlZmluZSBBWF9DTURfUkVBRF9NSUlfUkVHCQkweDA3CisjZGVmaW5lIEFYX0NNRF9XUklURV9NSUlfUkVHCQkweDA4CisjZGVmaW5lIEFYX0NNRF9TRVRfSFdfTUlJCQkweDBhCisjZGVmaW5lIEFYX0NNRF9SRUFEX0VFUFJPTQkJMHgwYgorI2RlZmluZSBBWF9DTURfV1JJVEVfRUVQUk9NCQkweDBjCisjZGVmaW5lIEFYX0NNRF9XUklURV9FTkFCTEUJCTB4MGQKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX0RJU0FCTEUJCTB4MGUKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX1JYX0NUTAkJMHgxMAorI2RlZmluZSBBWF9DTURfUkVBRF9JUEcwMTIJCTB4MTEKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX0lQRzAJCTB4MTIKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX0lQRzEJCTB4MTMKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX0lQRzIJCTB4MTQKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX01VTFRJX0ZJTFRFUgkweDE2CisjZGVmaW5lIEFYX0NNRF9SRUFEX05PREVfSUQJCTB4MTcKKyNkZWZpbmUgQVhfQ01EX1JFQURfUEhZX0lECQkweDE5CisjZGVmaW5lIEFYX0NNRF9SRUFEX01FRElVTV9TVEFUVVMJMHgxYQorI2RlZmluZSBBWF9DTURfV1JJVEVfTUVESVVNX01PREUJMHgxYgorI2RlZmluZSBBWF9DTURfUkVBRF9NT05JVE9SX01PREUJMHgxYworI2RlZmluZSBBWF9DTURfV1JJVEVfTU9OSVRPUl9NT0RFCTB4MWQKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX0dQSU9TCQkweDFmCisjZGVmaW5lIEFYX0NNRF9TV19SRVNFVAkJCTB4MjAKKyNkZWZpbmUgQVhfQ01EX1NXX1BIWV9TVEFUVVMJCTB4MjEKKyNkZWZpbmUgQVhfQ01EX1NXX1BIWV9TRUxFQ1QJCTB4MjIKKyNkZWZpbmUgQVg4ODc3Ml9DTURfUkVBRF9OT0RFX0lECTB4MTMKKworI2RlZmluZSBBWF9NT05JVE9SX01PREUJCQkweDAxCisjZGVmaW5lIEFYX01PTklUT1JfTElOSwkJCTB4MDIKKyNkZWZpbmUgQVhfTU9OSVRPUl9NQUdJQwkJMHgwNAorI2RlZmluZSBBWF9NT05JVE9SX0hTRlMJCQkweDEwCisKKy8qIEFYODgxNzIgTWVkaXVtIFN0YXR1cyBSZWdpc3RlciB2YWx1ZXMgKi8KKyNkZWZpbmUgQVhfTUVESVVNX0ZVTExfRFVQTEVYCQkweDAyCisjZGVmaW5lIEFYX01FRElVTV9UWF9BQk9SVF9BTExPVwkweDA0CisjZGVmaW5lIEFYX01FRElVTV9GTE9XX0NPTlRST0xfRU4JMHgxMAorCisjZGVmaW5lIEFYX01DQVNUX0ZJTFRFUl9TSVpFCQk4CisjZGVmaW5lIEFYX01BWF9NQ0FTVAkJCTY0CisKKyNkZWZpbmUgQVhfRUVQUk9NX0xFTgkJCTB4NDAKKworI2RlZmluZSBBWF9TV1JFU0VUX0NMRUFSCQkweDAwCisjZGVmaW5lIEFYX1NXUkVTRVRfUlIJCQkweDAxCisjZGVmaW5lIEFYX1NXUkVTRVRfUlQJCQkweDAyCisjZGVmaW5lIEFYX1NXUkVTRVRfUFJURQkJCTB4MDQKKyNkZWZpbmUgQVhfU1dSRVNFVF9QUkwJCQkweDA4CisjZGVmaW5lIEFYX1NXUkVTRVRfQloJCQkweDEwCisjZGVmaW5lIEFYX1NXUkVTRVRfSVBSTAkJCTB4MjAKKyNkZWZpbmUgQVhfU1dSRVNFVF9JUFBECQkJMHg0MAorCisjZGVmaW5lIEFYODg3NzJfSVBHMF9ERUZBVUxUCQkweDE1CisjZGVmaW5lIEFYODg3NzJfSVBHMV9ERUZBVUxUCQkweDBjCisjZGVmaW5lIEFYODg3NzJfSVBHMl9ERUZBVUxUCQkweDEyCisKKyNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fRlVMTF9EVVBMRVgJMHgwMDAyCisjZGVmaW5lIEFYODg3NzJfTUVESVVNX1JFU0VSVkVECQkweDAwMDQKKyNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fUlhfRkNfRU5BQkxFCTB4MDAxMAorI2RlZmluZSBBWDg4NzcyX01FRElVTV9UWF9GQ19FTkFCTEUJMHgwMDIwCisjZGVmaW5lIEFYODg3NzJfTUVESVVNX1BBVVNFX0ZPUk1BVAkweDAwODAKKyNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fUlhfRU5BQkxFCTB4MDEwMAorI2RlZmluZSBBWDg4NzcyX01FRElVTV8xMDBNQgkJMHgwMjAwCisjZGVmaW5lIEFYODg3NzJfTUVESVVNX0RFRkFVTFQJXAorCShBWDg4NzcyX01FRElVTV9GVUxMX0RVUExFWCB8IEFYODg3NzJfTUVESVVNX1JYX0ZDX0VOQUJMRSB8IFwKKwkgQVg4ODc3Ml9NRURJVU1fVFhfRkNfRU5BQkxFIHwgQVg4ODc3Ml9NRURJVU1fMTAwTUIgfCBcCisJIEFYODg3NzJfTUVESVVNX1JFU0VSVkVEIHwgQVg4ODc3Ml9NRURJVU1fUlhfRU5BQkxFICkKKworI2RlZmluZSBBWF9FRVBST01fTUFHSUMJCQkweGRlYWRiZWVmCisKKy8qIFRoaXMgc3RydWN0dXJlIGNhbm5vdCBleGNlZWQgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgWzVdKSBBS0EgMjAgYnl0ZXMgKi8KK3N0cnVjdCBheDg4MTd4X2RhdGEgeworCXU4IG11bHRpX2ZpbHRlcltBWF9NQ0FTVF9GSUxURVJfU0laRV07Cit9OworCitzdHJ1Y3QgYXg4ODE3Ml9pbnRfZGF0YSB7CisJdTE2IHJlczE7CisJdTggbGluazsKKwl1MTYgcmVzMjsKKwl1OCBzdGF0dXM7CisJdTE2IHJlczM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIGludCBheDg4MTd4X3JlYWRfY21kKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKKwkJCSAgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKAorCQlkZXYtPnVkZXYsCisJCXVzYl9yY3ZjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQljbWQsCisJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQl2YWx1ZSwKKwkJaW5kZXgsCisJCWRhdGEsCisJCXNpemUsCisJCVVTQl9DVFJMX0dFVF9USU1FT1VUKTsKK30KKworc3RhdGljIGludCBheDg4MTd4X3dyaXRlX2NtZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCisJCQkgICAgIHUxNiBzaXplLCB2b2lkICpkYXRhKQoreworCXJldHVybiB1c2JfY29udHJvbF9tc2coCisJCWRldi0+dWRldiwKKwkJdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCksCisJCWNtZCwKKwkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQl2YWx1ZSwKKwkJaW5kZXgsCisJCWRhdGEsCisJCXNpemUsCisJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKK30KKworc3RhdGljIHZvaWQgYXg4ODE3eF9hc3luY19jbWRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXEgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKXVyYi0+Y29udGV4dDsKKworCWlmICh1cmItPnN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0RFQlVHICJheDg4MTd4X2FzeW5jX2NtZF9jYWxsYmFjaygpIGZhaWxlZCB3aXRoICVkIiwKKwkJCXVyYi0+c3RhdHVzKTsKKworCWtmcmVlKHJlcSk7CisJdXNiX2ZyZWVfdXJiKHVyYik7Cit9CisKK3N0YXRpYyB2b2lkIGF4ODgxN3hfc3RhdHVzKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBheDg4MTcyX2ludF9kYXRhICpldmVudDsKKwlpbnQgbGluazsKKworCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPCA4KQorCQlyZXR1cm47CisKKwlldmVudCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCWxpbmsgPSBldmVudC0+bGluayAmIDB4MDE7CisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2LT5uZXQpICE9IGxpbmspIHsKKwkJaWYgKGxpbmspIHsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2LT5uZXQpOworCQkJdXNibmV0X2RlZmVyX2tldmVudCAoZGV2LCBFVkVOVF9MSU5LX1JFU0VUICk7CisJCX0gZWxzZQorCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2LT5uZXQpOworCQlkZXZkYmcoZGV2LCAiYXg4ODE3eCAtIExpbmsgU3RhdHVzIGlzOiAlZCIsIGxpbmspOworCX0KK30KKworc3RhdGljIHZvaWQKK2F4ODgxN3hfd3JpdGVfY21kX2FzeW5jKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKKwkJCQkgICAgdTE2IHNpemUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqcmVxOworCWludCBzdGF0dXM7CisJc3RydWN0IHVyYiAqdXJiOworCisJaWYgKCh1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWRldmRiZyhkZXYsICJFcnJvciBhbGxvY2F0aW5nIFVSQiBpbiB3cml0ZV9jbWRfYXN5bmMhIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHJlcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQlkZXZlcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udHJvbCByZXF1ZXN0Iik7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCQlyZXR1cm47CisJfQorCisJcmVxLT5iUmVxdWVzdFR5cGUgPSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0U7CisJcmVxLT5iUmVxdWVzdCA9IGNtZDsKKwlyZXEtPndWYWx1ZSA9IGNwdV90b19sZTE2KHZhbHVlKTsKKwlyZXEtPndJbmRleCA9IGNwdV90b19sZTE2KGluZGV4KTsKKwlyZXEtPndMZW5ndGggPSBjcHVfdG9fbGUxNihzaXplKTsKKworCXVzYl9maWxsX2NvbnRyb2xfdXJiKHVyYiwgZGV2LT51ZGV2LAorCQkJICAgICB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKKwkJCSAgICAgKHZvaWQgKilyZXEsIGRhdGEsIHNpemUsCisJCQkgICAgIGF4ODgxN3hfYXN5bmNfY21kX2NhbGxiYWNrLCByZXEpOworCisJaWYoKHN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpIDwgMCkgeworCQlkZXZlcnIoZGV2LCAiRXJyb3Igc3VibWl0dGluZyB0aGUgY29udHJvbCBtZXNzYWdlOiBzdGF0dXM9JWQiLAorCQkJCXN0YXR1cyk7CisJCWtmcmVlKHJlcSk7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCX0KK30KKworc3RhdGljIHZvaWQgYXg4ODE3eF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlzdHJ1Y3QgYXg4ODE3eF9kYXRhICpkYXRhID0gKHN0cnVjdCBheDg4MTd4X2RhdGEgKikmZGV2LT5kYXRhOworCXU4IHJ4X2N0bCA9IDB4OGM7CisKKwlpZiAobmV0LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXJ4X2N0bCB8PSAweDAxOworCX0gZWxzZSBpZiAobmV0LT5mbGFncyAmIElGRl9BTExNVUxUSQorCQkgICB8fCBuZXQtPm1jX2NvdW50ID4gQVhfTUFYX01DQVNUKSB7CisJCXJ4X2N0bCB8PSAweDAyOworCX0gZWxzZSBpZiAobmV0LT5tY19jb3VudCA9PSAwKSB7CisJCS8qIGp1c3QgYnJvYWRjYXN0IGFuZCBkaXJlY3RlZCAqLworCX0gZWxzZSB7CisJCS8qIFdlIHVzZSB0aGUgMjAgYnl0ZSBkZXYtPmRhdGEKKwkJICogZm9yIG91ciA4IGJ5dGUgZmlsdGVyIGJ1ZmZlcgorCQkgKiB0byBhdm9pZCBhbGxvY2F0aW5nIG1lbW9yeSB0aGF0CisJCSAqIGlzIHRyaWNreSB0byBmcmVlIGxhdGVyICovCisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfbGlzdCA9IG5ldC0+bWNfbGlzdDsKKwkJdTMyIGNyY19iaXRzOworCQlpbnQgaTsKKworCQltZW1zZXQoZGF0YS0+bXVsdGlfZmlsdGVyLCAwLCBBWF9NQ0FTVF9GSUxURVJfU0laRSk7CisKKwkJLyogQnVpbGQgdGhlIG11bHRpY2FzdCBoYXNoIGZpbHRlci4gKi8KKwkJZm9yIChpID0gMDsgaSA8IG5ldC0+bWNfY291bnQ7IGkrKykgeworCQkJY3JjX2JpdHMgPQorCQkJICAgIGV0aGVyX2NyYyhFVEhfQUxFTiwKKwkJCQkgICAgICBtY19saXN0LT5kbWlfYWRkcikgPj4gMjY7CisJCQlkYXRhLT5tdWx0aV9maWx0ZXJbY3JjX2JpdHMgPj4gM10gfD0KKwkJCSAgICAxIDw8IChjcmNfYml0cyAmIDcpOworCQkJbWNfbGlzdCA9IG1jX2xpc3QtPm5leHQ7CisJCX0KKworCQlheDg4MTd4X3dyaXRlX2NtZF9hc3luYyhkZXYsIEFYX0NNRF9XUklURV9NVUxUSV9GSUxURVIsIDAsIDAsCisJCQkJICAgQVhfTUNBU1RfRklMVEVSX1NJWkUsIGRhdGEtPm11bHRpX2ZpbHRlcik7CisKKwkJcnhfY3RsIHw9IDB4MTA7CisJfQorCisJYXg4ODE3eF93cml0ZV9jbWRfYXN5bmMoZGV2LCBBWF9DTURfV1JJVEVfUlhfQ1RMLCByeF9jdGwsIDAsIDAsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGF4ODgxN3hfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsIGludCBsb2MpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MTYgcmVzOworCXU4IGJ1ZlsxXTsKKworCWF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9TV19NSUksIDAsIDAsIDAsICZidWYpOworCWF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9NSUlfUkVHLCBwaHlfaWQsCisJCQkJKF9fdTE2KWxvYywgMiwgKHUxNiAqKSZyZXMpOworCWF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9IV19NSUksIDAsIDAsIDAsICZidWYpOworCisJcmV0dXJuIHJlcyAmIDB4ZmZmZjsKK30KKworLyogc2FtZSBhcyBhYm92ZSwgYnV0IGNvbnZlcnRzIHJlc3VsdGluZyB2YWx1ZSB0byBjcHUgYnl0ZSBvcmRlciAqLworc3RhdGljIGludCBheDg4MTd4X21kaW9fcmVhZF9sZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jKQoreworCXJldHVybiBsZTE2X3RvX2NwdShheDg4MTd4X21kaW9fcmVhZChuZXRkZXYscGh5X2lkLCBsb2MpKTsKK30KKworc3RhdGljIHZvaWQKK2F4ODgxN3hfbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jLCBpbnQgdmFsKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTE2IHJlcyA9IHZhbDsKKwl1OCBidWZbMV07CisKKwlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfU1dfTUlJLCAwLCAwLCAwLCAmYnVmKTsKKwlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NSUlfUkVHLCBwaHlfaWQsCisJCQkJKF9fdTE2KWxvYywgMiwgKHUxNiAqKSZyZXMpOworCWF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9IV19NSUksIDAsIDAsIDAsICZidWYpOworfQorCisvKiBzYW1lIGFzIGFib3ZlLCBidXQgY29udmVydHMgbmV3IHZhbHVlIHRvIGxlMTYgYnl0ZSBvcmRlciBiZWZvcmUgd3JpdGluZyAqLworc3RhdGljIHZvaWQKK2F4ODgxN3hfbWRpb193cml0ZV9sZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jLCBpbnQgdmFsKQoreworCWF4ODgxN3hfbWRpb193cml0ZSggbmV0ZGV2LCBwaHlfaWQsIGxvYywgY3B1X3RvX2xlMTYodmFsKSApOworfQorCitzdGF0aWMgaW50IGF4ODgxNzJfbGlua19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJdTE2IGxwYTsKKwl1MTYgYWR2OworCXUxNiByZXM7CisJdTggbW9kZTsKKworCW1vZGUgPSBBWF9NRURJVU1fVFhfQUJPUlRfQUxMT1cgfCBBWF9NRURJVU1fRkxPV19DT05UUk9MX0VOOworCWxwYSA9IGF4ODgxN3hfbWRpb19yZWFkX2xlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9MUEEpOworCWFkdiA9IGF4ODgxN3hfbWRpb19yZWFkX2xlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOworCXJlcyA9IG1paV9ud2F5X3Jlc3VsdChscGF8YWR2KTsKKwlpZiAocmVzICYgTFBBX0RVUExFWCkKKwkJbW9kZSB8PSBBWF9NRURJVU1fRlVMTF9EVVBMRVg7CisJYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTUVESVVNX01PREUsIG1vZGUsIDAsIDAsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitheDg4MTd4X2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29saW5mbykKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXU4IG9wdDsKKworCWlmIChheDg4MTd4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTU9OSVRPUl9NT0RFLCAwLCAwLCAxLCAmb3B0KSA8IDApIHsKKwkJd29saW5mby0+c3VwcG9ydGVkID0gMDsKKwkJd29saW5mby0+d29sb3B0cyA9IDA7CisJCXJldHVybjsKKwl9CisJd29saW5mby0+c3VwcG9ydGVkID0gV0FLRV9QSFkgfCBXQUtFX01BR0lDOworCXdvbGluZm8tPndvbG9wdHMgPSAwOworCWlmIChvcHQgJiBBWF9NT05JVE9SX01PREUpIHsKKwkJaWYgKG9wdCAmIEFYX01PTklUT1JfTElOSykKKwkJCXdvbGluZm8tPndvbG9wdHMgfD0gV0FLRV9QSFk7CisJCWlmIChvcHQgJiBBWF9NT05JVE9SX01BR0lDKQorCQkJd29saW5mby0+d29sb3B0cyB8PSBXQUtFX01BR0lDOworCX0KK30KKworc3RhdGljIGludAorYXg4ODE3eF9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwl1OCBvcHQgPSAwOworCXU4IGJ1ZlsxXTsKKworCWlmICh3b2xpbmZvLT53b2xvcHRzICYgV0FLRV9QSFkpCisJCW9wdCB8PSBBWF9NT05JVE9SX0xJTks7CisJaWYgKHdvbGluZm8tPndvbG9wdHMgJiBXQUtFX01BR0lDKQorCQlvcHQgfD0gQVhfTU9OSVRPUl9NQUdJQzsKKwlpZiAob3B0ICE9IDApCisJCW9wdCB8PSBBWF9NT05JVE9SX01PREU7CisKKwlpZiAoYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTU9OSVRPUl9NT0RFLAorCQkJICAgICAgb3B0LCAwLCAwLCAmYnVmKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXg4ODE3eF9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQoreworCXJldHVybiBBWF9FRVBST01fTEVOOworfQorCitzdGF0aWMgaW50IGF4ODgxN3hfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisJdTE2ICplYnVmID0gKHUxNiAqKWRhdGE7CisJaW50IGk7CisKKwkvKiBDcnVkZSBoYWNrIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IG92ZXJ3cml0ZSBtZW1vcnkKKwkgKiBpZiBhbiBvZGQgbGVuZ3RoIGlzIHN1cHBsaWVkCisJICovCisJaWYgKGVlcHJvbS0+bGVuICUgMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllZXByb20tPm1hZ2ljID0gQVhfRUVQUk9NX01BR0lDOworCisJLyogYXg4ODE3eCByZXR1cm5zIDIgYnl0ZXMgZnJvbSBlZXByb20gb24gcmVhZCAqLworCWZvciAoaT0wOyBpIDwgZWVwcm9tLT5sZW4gLyAyOyBpKyspIHsKKwkJaWYgKGF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9FRVBST00sCisJCQllZXByb20tPm9mZnNldCArIGksIDAsIDIsICZlYnVmW2ldKSA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF4ODgxN3hfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsCisJCQkJIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJLyogSW5oZXJpdCBzdGFuZGFyZCBkZXZpY2UgaW5mbyAqLworCXVzYm5ldF9nZXRfZHJ2aW5mbyhuZXQsIGluZm8pOworCWluZm8tPmVlZHVtcF9sZW4gPSAweDNlOworfQorCitzdGF0aWMgaW50IGF4ODgxN3hfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisKKwlyZXR1cm4gbWlpX2V0aHRvb2xfZ3NldCgmZGV2LT5taWksY21kKTsKK30KKworc3RhdGljIGludCBheDg4MTd4X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCisJcmV0dXJuIG1paV9ldGh0b29sX3NzZXQoJmRldi0+bWlpLGNtZCk7Cit9CisKKy8qIFdlIG5lZWQgdG8gb3ZlcnJpZGUgc29tZSBldGh0b29sX29wcyBzbyB3ZSByZXF1aXJlIG91cgorICAgb3duIHN0cnVjdHVyZSBzbyB3ZSBkb24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciB1c2JuZXQKKyAgIGRldmljZXMgdGhhdCBtYXkgYmUgY29ubmVjdGVkIGF0IHRoZSBzYW1lIHRpbWUuICovCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF4ODgxN3hfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IGF4ODgxN3hfZ2V0X2RydmluZm8sCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9tc2dsZXZlbAkJPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gdXNibmV0X3NldF9tc2dsZXZlbCwKKwkuZ2V0X3dvbAkJPSBheDg4MTd4X2dldF93b2wsCisJLnNldF93b2wJCT0gYXg4ODE3eF9zZXRfd29sLAorCS5nZXRfZWVwcm9tX2xlbgkJPSBheDg4MTd4X2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tCQk9IGF4ODgxN3hfZ2V0X2VlcHJvbSwKKwkuZ2V0X3NldHRpbmdzCQk9IGF4ODgxN3hfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gYXg4ODE3eF9zZXRfc2V0dGluZ3MsCit9OworCitzdGF0aWMgaW50IGF4ODgxN3hfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKworCXJldHVybiBnZW5lcmljX21paV9pb2N0bCgmZGV2LT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYXg4ODE3eF9iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJaW50IHJldCA9IDA7CisJdm9pZCAqYnVmOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZ3Bpb19iaXRzID0gZGV2LT5kcml2ZXJfaW5mby0+ZGF0YTsKKworCXVzYm5ldF9nZXRfZW5kcG9pbnRzKGRldixpbnRmKTsKKworCWJ1ZiA9IGttYWxsb2MoRVRIX0FMRU4sIEdGUF9LRVJORUwpOworCWlmKCFidWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQxOworCX0KKworCS8qIFRvZ2dsZSB0aGUgR1BJT3MgaW4gYSBtYW51ZmFjdHVyZXIvbW9kZWwgc3BlY2lmaWMgd2F5ICovCisJZm9yIChpID0gMjsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKChyZXQgPSBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9HUElPUywKKwkJCQkJKGdwaW9fYml0cyA+PiAoaSAqIDgpKSAmIDB4ZmYsIDAsIDAsCisJCQkJCWJ1ZikpIDwgMCkKKwkJCWdvdG8gb3V0MjsKKwkJbXNsZWVwKDUpOworCX0KKworCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfUlhfQ1RMLAorCQkJCTB4ODAsIDAsIDAsIGJ1ZikpIDwgMCkgeworCQlkYmcoInNlbmQgQVhfQ01EX1dSSVRFX1JYX0NUTCBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCS8qIEdldCB0aGUgTUFDIGFkZHJlc3MgKi8KKwltZW1zZXQoYnVmLCAwLCBFVEhfQUxFTik7CisJaWYgKChyZXQgPSBheDg4MTd4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTk9ERV9JRCwKKwkJCQkwLCAwLCA2LCBidWYpKSA8IDApIHsKKwkJZGJnKCJyZWFkIEFYX0NNRF9SRUFEX05PREVfSUQgZmFpbGVkOiAlZCIsIHJldCk7CisJCWdvdG8gb3V0MjsKKwl9CisJbWVtY3B5KGRldi0+bmV0LT5kZXZfYWRkciwgYnVmLCBFVEhfQUxFTik7CisKKwkvKiBHZXQgdGhlIFBIWSBpZCAqLworCWlmICgocmV0ID0gYXg4ODE3eF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX1BIWV9JRCwKKwkJCQkwLCAwLCAyLCBidWYpKSA8IDApIHsKKwkJZGJnKCJlcnJvciBvbiByZWFkIEFYX0NNRF9SRUFEX1BIWV9JRDogJTAyeCIsIHJldCk7CisJCWdvdG8gb3V0MjsKKwl9IGVsc2UgaWYgKHJldCA8IDIpIHsKKwkJLyogdGhpcyBzaG91bGQgYWx3YXlzIHJldHVybiAyIGJ5dGVzICovCisJCWRiZygiQVhfQ01EX1JFQURfUEhZX0lEIHJldHVybmVkIGxlc3MgdGhhbiAyIGJ5dGVzOiByZXQ9JTAyeCIsCisJCQkJcmV0KTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQyOworCX0KKworCS8qIEluaXRpYWxpemUgTUlJIHN0cnVjdHVyZSAqLworCWRldi0+bWlpLmRldiA9IGRldi0+bmV0OworCWRldi0+bWlpLm1kaW9fcmVhZCA9IGF4ODgxN3hfbWRpb19yZWFkOworCWRldi0+bWlpLm1kaW9fd3JpdGUgPSBheDg4MTd4X21kaW9fd3JpdGU7CisJZGV2LT5taWkucGh5X2lkX21hc2sgPSAweDNmOworCWRldi0+bWlpLnJlZ19udW1fbWFzayA9IDB4MWY7CisJZGV2LT5taWkucGh5X2lkID0gKigodTggKilidWYgKyAxKTsKKwlkZXYtPm5ldC0+ZG9faW9jdGwgPSBheDg4MTd4X2lvY3RsOworCisJZGV2LT5uZXQtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGF4ODgxN3hfc2V0X211bHRpY2FzdDsKKwlkZXYtPm5ldC0+ZXRodG9vbF9vcHMgPSAmYXg4ODE3eF9ldGh0b29sX29wczsKKworCWF4ODgxN3hfbWRpb193cml0ZV9sZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisJYXg4ODE3eF9tZGlvX3dyaXRlX2xlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UsCisJCUFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9QQVVTRV9DQVApOworCW1paV9ud2F5X3Jlc3RhcnQoJmRldi0+bWlpKTsKKworCXJldHVybiAwOworb3V0MjoKKwlrZnJlZShidWYpOworb3V0MToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF4ODg3NzJfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IGF4ODgxN3hfZ2V0X2RydmluZm8sCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9tc2dsZXZlbAkJPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gdXNibmV0X3NldF9tc2dsZXZlbCwKKwkuZ2V0X3dvbAkJPSBheDg4MTd4X2dldF93b2wsCisJLnNldF93b2wJCT0gYXg4ODE3eF9zZXRfd29sLAorCS5nZXRfZWVwcm9tX2xlbgkJPSBheDg4MTd4X2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tCQk9IGF4ODgxN3hfZ2V0X2VlcHJvbSwKKwkuZ2V0X3NldHRpbmdzCQk9IGF4ODgxN3hfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gYXg4ODE3eF9zZXRfc2V0dGluZ3MsCit9OworCitzdGF0aWMgaW50IGF4ODg3NzJfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCWludCByZXQ7CisJdm9pZCAqYnVmOworCisJdXNibmV0X2dldF9lbmRwb2ludHMoZGV2LGludGYpOworCisJYnVmID0ga21hbGxvYyg2LCBHRlBfS0VSTkVMKTsKKwlpZighYnVmKSB7CisJCWRiZyAoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJ1ZmZlciIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDE7CisJfQorCisJaWYgKChyZXQgPSBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9HUElPUywKKwkJCQkgICAgIDB4MDBCMCwgMCwgMCwgYnVmKSkgPCAwKQorCQlnb3RvIG91dDI7CisKKwltc2xlZXAoNSk7CisJaWYgKChyZXQgPSBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19QSFlfU0VMRUNULAorCQkJCTB4MDAwMSwgMCwgMCwgYnVmKSkgPCAwKSB7CisJCWRiZygiU2VsZWN0IFBIWSAjMSBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUkVTRVQsIEFYX1NXUkVTRVRfSVBQRCwKKwkJCQkwLCAwLCBidWYpKSA8IDApIHsKKwkJZGJnKCJGYWlsZWQgdG8gcG93ZXIgZG93biBpbnRlcm5hbCBQSFk6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCW1zbGVlcCgxNTApOworCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUkVTRVQsIEFYX1NXUkVTRVRfQ0xFQVIsCisJCQkJMCwgMCwgYnVmKSkgPCAwKSB7CisJCWRiZygiRmFpbGVkIHRvIHBlcmZvcm0gc29mdHdhcmUgcmVzZXQ6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCW1zbGVlcCgxNTApOworCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUkVTRVQsCisJICAgICAJCQlBWF9TV1JFU0VUX0lQUkwgfCBBWF9TV1JFU0VUX1BSTCwKKwkJCQkwLCAwLCBidWYpKSA8IDApIHsKKwkJZGJnKCJGYWlsZWQgdG8gc2V0IEludGVybmFsL0V4dGVybmFsIFBIWSByZXNldCBjb250cm9sOiAlZCIsCisJCQkJCXJldCk7CisJCWdvdG8gb3V0MjsKKwl9CisKKwltc2xlZXAoMTUwKTsKKwlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX1JYX0NUTCwKKwkJCQkweDAwMDAsIDAsIDAsIGJ1ZikpIDwgMCkgeworCQlkYmcoIkZhaWxlZCB0byByZXNldCBSWF9DVEw6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCS8qIEdldCB0aGUgTUFDIGFkZHJlc3MgKi8KKwltZW1zZXQoYnVmLCAwLCBFVEhfQUxFTik7CisJaWYgKChyZXQgPSBheDg4MTd4X3JlYWRfY21kKGRldiwgQVg4ODc3Ml9DTURfUkVBRF9OT0RFX0lELAorCQkJCTAsIDAsIEVUSF9BTEVOLCBidWYpKSA8IDApIHsKKwkJZGJnKCJGYWlsZWQgdG8gcmVhZCBNQUMgYWRkcmVzczogJWQiLCByZXQpOworCQlnb3RvIG91dDI7CisJfQorCW1lbWNweShkZXYtPm5ldC0+ZGV2X2FkZHIsIGJ1ZiwgRVRIX0FMRU4pOworCisJaWYgKChyZXQgPSBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfU1dfTUlJLAorCQkJCTAsIDAsIDAsIGJ1ZikpIDwgMCkgeworCQlkYmcoIkVuYWJsaW5nIHNvZnR3YXJlIE1JSSBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCWlmICgoKHJldCA9IGF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9NSUlfUkVHLAorCSAgICAgIAkJCTB4MDAxMCwgMiwgMiwgYnVmKSkgPCAwKQorCQkJfHwgKCooKHUxNiAqKWJ1ZikgIT0gMHgwMDNiKSkgeworCQlkYmcoIlJlYWQgUEhZIHJlZ2lzdGVyIDIgbXVzdCBiZSAweDNiMDA6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCS8qIEluaXRpYWxpemUgTUlJIHN0cnVjdHVyZSAqLworCWRldi0+bWlpLmRldiA9IGRldi0+bmV0OworCWRldi0+bWlpLm1kaW9fcmVhZCA9IGF4ODgxN3hfbWRpb19yZWFkOworCWRldi0+bWlpLm1kaW9fd3JpdGUgPSBheDg4MTd4X21kaW9fd3JpdGU7CisJZGV2LT5taWkucGh5X2lkX21hc2sgPSAweGZmOworCWRldi0+bWlpLnJlZ19udW1fbWFzayA9IDB4ZmY7CisJZGV2LT5uZXQtPmRvX2lvY3RsID0gYXg4ODE3eF9pb2N0bDsKKworCS8qIEdldCB0aGUgUEhZIGlkICovCisJaWYgKChyZXQgPSBheDg4MTd4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfUEhZX0lELAorCQkJMCwgMCwgMiwgYnVmKSkgPCAwKSB7CisJCWRiZygiRXJyb3IgcmVhZGluZyBQSFkgSUQ6ICUwMngiLCByZXQpOworCQlnb3RvIG91dDI7CisJfSBlbHNlIGlmIChyZXQgPCAyKSB7CisJCS8qIHRoaXMgc2hvdWxkIGFsd2F5cyByZXR1cm4gMiBieXRlcyAqLworCQlkYmcoIkFYX0NNRF9SRUFEX1BIWV9JRCByZXR1cm5lZCBsZXNzIHRoYW4gMiBieXRlczogcmV0PSUwMngiLAorCQkgICAgcmV0KTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQyOworCX0KKwlkZXYtPm1paS5waHlfaWQgPSAqKCh1OCAqKWJ1ZiArIDEpOworCisJaWYgKChyZXQgPSBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19SRVNFVCwgQVhfU1dSRVNFVF9QUkwsCisJCQkJMCwgMCwgYnVmKSkgPCAwKSB7CisJCWRiZygiU2V0IGV4dGVybmFsIFBIWSByZXNldCBwaW4gbGV2ZWw6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKwltc2xlZXAoMTUwKTsKKwlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1JFU0VULAorCSAgICAgCQkJQVhfU1dSRVNFVF9JUFJMIHwgQVhfU1dSRVNFVF9QUkwsCisJCQkJMCwgMCwgYnVmKSkgPCAwKSB7CisJCWRiZygiU2V0IEludGVybmFsL0V4dGVybmFsIFBIWSByZXNldCBjb250cm9sOiAlZCIsIHJldCk7CisJCWdvdG8gb3V0MjsKKwl9CisJbXNsZWVwKDE1MCk7CisKKworCWRldi0+bmV0LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBheDg4MTd4X3NldF9tdWx0aWNhc3Q7CisJZGV2LT5uZXQtPmV0aHRvb2xfb3BzID0gJmF4ODg3NzJfZXRodG9vbF9vcHM7CisKKwlheDg4MTd4X21kaW9fd3JpdGVfbGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCWF4ODgxN3hfbWRpb193cml0ZV9sZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAorCQkJQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV9DU01BKTsKKwltaWlfbndheV9yZXN0YXJ0KCZkZXYtPm1paSk7CisKKwlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01FRElVTV9NT0RFLAorCQkJCUFYODg3NzJfTUVESVVNX0RFRkFVTFQsIDAsIDAsIGJ1ZikpIDwgMCkgeworCQlkYmcoIldyaXRlIG1lZGl1bSBtb2RlIHJlZ2lzdGVyOiAlZCIsIHJldCk7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0lQRzAsCisJCQkJQVg4ODc3Ml9JUEcwX0RFRkFVTFQgfCBBWDg4NzcyX0lQRzFfREVGQVVMVCwKKwkJCQlBWDg4NzcyX0lQRzJfREVGQVVMVCwgMCwgYnVmKSkgPCAwKSB7CisJCWRiZygiV3JpdGUgSVBHLElQRzEsSVBHMiBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKwlpZiAoKHJldCA9CisJICAgICBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfSFdfTUlJLCAwLCAwLCAwLCAmYnVmKSkgPCAwKSB7CisJCWRiZygiRmFpbGVkIHRvIHNldCBoYXJkd2FyZSBNSUk6ICUwMngiLCByZXQpOworCQlnb3RvIG91dDI7CisJfQorCisJLyogU2V0IFJYX0NUTCB0byBkZWZhdWx0IHZhbHVlcyB3aXRoIDJrIGJ1ZmZlciwgYW5kIGVuYWJsZSBjYWN0dXMgKi8KKwlpZiAoKHJldCA9CisJICAgICBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9SWF9DVEwsIDB4MDA4OCwgMCwgMCwKKwkJCSAgICAgICBidWYpKSA8IDApIHsKKwkJZGJnKCJSZXNldCBSWF9DVEwgZmFpbGVkOiAlZCIsIHJldCk7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlrZnJlZShidWYpOworCisJLyogQXNpeCBmcmFtaW5nIHBhY2tzIG11bHRpcGxlIGV0aCBmcmFtZXMgaW50byBhIDJLIHVzYiBidWxrIHRyYW5zZmVyICovCisJaWYgKGRldi0+ZHJpdmVyX2luZm8tPmZsYWdzICYgRkxBR19GUkFNSU5HX0FYKSB7CisJCS8qIGhhcmRfbXR1ICBpcyBzdGlsbCB0aGUgZGVmYXVsdCAtIHRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydAorCQkgICBqdW1ibyBldGggZnJhbWVzICovCisJCWRldi0+cnhfdXJiX3NpemUgPSAyMDQ4OworCX0KKworCXJldHVybiAwOworCitvdXQyOgorCWtmcmVlKGJ1Zik7CitvdXQxOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXg4ODc3Ml9yeF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggICpoZWFkOworCXUzMiAgaGVhZGVyOworCWNoYXIgKnBhY2tldDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYXhfc2tiOworCXUxNiBzaXplOworCisJaGVhZCA9ICh1OCAqKSBza2ItPmRhdGE7CisJbWVtY3B5KCZoZWFkZXIsIGhlYWQsIHNpemVvZihoZWFkZXIpKTsKKwlsZTMyX3RvX2NwdXMoJmhlYWRlcik7CisJcGFja2V0ID0gaGVhZCArIHNpemVvZihoZWFkZXIpOworCisJc2tiX3B1bGwoc2tiLCA0KTsKKworCXdoaWxlIChza2ItPmxlbiA+IDApIHsKKwkJaWYgKChzaG9ydCkoaGVhZGVyICYgMHgwMDAwZmZmZikgIT0KKwkJICAgIH4oKHNob3J0KSgoaGVhZGVyICYgMHhmZmZmMDAwMCkgPj4gMTYpKSkgeworCQkJZGV2ZGJnKGRldiwiaGVhZGVyIGxlbmd0aCBkYXRhIGlzIGVycm9yIik7CisJCX0KKwkJLyogZ2V0IHRoZSBwYWNrZXQgbGVuZ3RoICovCisJCXNpemUgPSAodTE2KSAoaGVhZGVyICYgMHgwMDAwZmZmZik7CisKKwkJaWYgKChza2ItPmxlbikgLSAoKHNpemUgKyAxKSAmIDB4ZmZmZSkgPT0gMCkKKwkJCXJldHVybiAyOworCQlpZiAoc2l6ZSA+IEVUSF9GUkFNRV9MRU4pIHsKKwkJCWRldmRiZyhkZXYsImludmFsaWQgcnggbGVuZ3RoICVkIiwgc2l6ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlheF9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGF4X3NrYikgeworCQkJYXhfc2tiLT5sZW4gPSBzaXplOworCQkJYXhfc2tiLT5kYXRhID0gcGFja2V0OworCQkJYXhfc2tiLT50YWlsID0gcGFja2V0ICsgc2l6ZTsKKwkJCXVzYm5ldF9za2JfcmV0dXJuKGRldiwgYXhfc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAwOworCQl9CisKKwkJc2tiX3B1bGwoc2tiLCAoc2l6ZSArIDEpICYgMHhmZmZlKTsKKworCQlpZiAoc2tiLT5sZW4gPT0gMCkKKwkJCWJyZWFrOworCisJCWhlYWQgPSAodTggKikgc2tiLT5kYXRhOworCQltZW1jcHkoJmhlYWRlciwgaGVhZCwgc2l6ZW9mKGhlYWRlcikpOworCQlsZTMyX3RvX2NwdXMoJmhlYWRlcik7CisJCXBhY2tldCA9IGhlYWQgKyBzaXplb2YoaGVhZGVyKTsKKwkJc2tiX3B1bGwoc2tiLCA0KTsKKwl9CisKKwlpZiAoc2tiLT5sZW4gPCAwKSB7CisJCWRldmRiZyhkZXYsImludmFsaWQgcnggbGVuZ3RoICVkIiwgc2tiLT5sZW4pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYXg4ODc3Ml90eF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCXVuc2lnbmVkIGZsYWdzKQoreworCWludCBwYWRsZW47CisJaW50IGhlYWRyb29tID0gc2tiX2hlYWRyb29tKHNrYik7CisJaW50IHRhaWxyb29tID0gc2tiX3RhaWxyb29tKHNrYik7CisJdTMyIHBhY2tldF9sZW47CisJdTMyIHBhZGJ5dGVzID0gMHhmZmZmMDAwMDsKKworCXBhZGxlbiA9ICgoc2tiLT5sZW4gKyA0KSAlIDUxMikgPyAwIDogNDsKKworCWlmICgoIXNrYl9jbG9uZWQoc2tiKSkKKwkgICAgJiYgKChoZWFkcm9vbSArIHRhaWxyb29tKSA+PSAoNCArIHBhZGxlbikpKSB7CisJCWlmICgoaGVhZHJvb20gPCA0KSB8fCAodGFpbHJvb20gPCBwYWRsZW4pKSB7CisJCQlza2ItPmRhdGEgPSBtZW1tb3ZlKHNrYi0+aGVhZCArIDQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgc2tiLT5sZW47CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwkJc2tiMiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIDQsIHBhZGxlbiwgZmxhZ3MpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlza2IgPSBza2IyOworCQlpZiAoIXNrYikKKwkJCXJldHVybiBOVUxMOworCX0KKworCXNrYl9wdXNoKHNrYiwgNCk7CisJcGFja2V0X2xlbiA9ICgoKHNrYi0+bGVuIC0gNCkgXiAweDAwMDBmZmZmKSA8PCAxNikgKyAoc2tiLT5sZW4gLSA0KTsKKwltZW1jcHkoc2tiLT5kYXRhLCAmcGFja2V0X2xlbiwgc2l6ZW9mKHBhY2tldF9sZW4pKTsKKworCWlmICgoc2tiLT5sZW4gJSA1MTIpID09IDApIHsKKwkJbWVtY3B5KCBza2ItPnRhaWwsICZwYWRieXRlcywgc2l6ZW9mKHBhZGJ5dGVzKSk7CisJCXNrYl9wdXQoc2tiLCBzaXplb2YocGFkYnl0ZXMpKTsKKwl9CisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludCBheDg4NzcyX2xpbmtfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXUxNiBscGE7CisJdTE2IGFkdjsKKwl1MTYgcmVzOworCXUxNiBtb2RlOworCisJbW9kZSA9IEFYODg3NzJfTUVESVVNX0RFRkFVTFQ7CisJbHBhID0gYXg4ODE3eF9tZGlvX3JlYWRfbGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0xQQSk7CisJYWR2ID0gYXg4ODE3eF9tZGlvX3JlYWRfbGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSk7CisJcmVzID0gbWlpX253YXlfcmVzdWx0KGxwYXxhZHYpOworCisJaWYgKChyZXMgJiBMUEFfRFVQTEVYKSA9PSAwKQorCQltb2RlICY9IH5BWDg4NzcyX01FRElVTV9GVUxMX0RVUExFWDsKKwlpZiAoKHJlcyAmIExQQV8xMDApID09IDApCisJCW1vZGUgJj0gfkFYODg3NzJfTUVESVVNXzEwME1COworCWF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01FRElVTV9NT0RFLCBtb2RlLCAwLCAwLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIGF4ODgxN3hfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPSAiQVNJWCBBWDg4MTd4IFVTQiAyLjAgRXRoZXJuZXQiLAorCS5iaW5kID0gYXg4ODE3eF9iaW5kLAorCS5zdGF0dXMgPSBheDg4MTd4X3N0YXR1cywKKwkubGlua19yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKKwkucmVzZXQgPSBheDg4MTcyX2xpbmtfcmVzZXQsCisJLmZsYWdzID0gIEZMQUdfRVRIRVIsCisJLmRhdGEgPSAweDAwMTMwMTAzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbyBkbGlua19kdWJfZTEwMF9pbmZvID0geworCS5kZXNjcmlwdGlvbiA9ICJETGluayBEVUItRTEwMCBVU0IgRXRoZXJuZXQiLAorCS5iaW5kID0gYXg4ODE3eF9iaW5kLAorCS5zdGF0dXMgPSBheDg4MTd4X3N0YXR1cywKKwkubGlua19yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKKwkucmVzZXQgPSBheDg4MTcyX2xpbmtfcmVzZXQsCisJLmZsYWdzID0gIEZMQUdfRVRIRVIsCisJLmRhdGEgPSAweDAwOWY5ZDlmLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbyBuZXRnZWFyX2ZhMTIwX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0gIk5ldGdlYXIgRkEtMTIwIFVTQiBFdGhlcm5ldCIsCisJLmJpbmQgPSBheDg4MTd4X2JpbmQsCisJLnN0YXR1cyA9IGF4ODgxN3hfc3RhdHVzLAorCS5saW5rX3Jlc2V0ID0gYXg4ODE3Ml9saW5rX3Jlc2V0LAorCS5yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKKwkuZmxhZ3MgPSAgRkxBR19FVEhFUiwKKwkuZGF0YSA9IDB4MDAxMzAxMDMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIGhhd2tpbmdfdWYyMDBfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPSAiSGF3a2luZyBVRjIwMCBVU0IgRXRoZXJuZXQiLAorCS5iaW5kID0gYXg4ODE3eF9iaW5kLAorCS5zdGF0dXMgPSBheDg4MTd4X3N0YXR1cywKKwkubGlua19yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKKwkucmVzZXQgPSBheDg4MTcyX2xpbmtfcmVzZXQsCisJLmZsYWdzID0gIEZMQUdfRVRIRVIsCisJLmRhdGEgPSAweDAwMWYxZDFmLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbyBheDg4NzcyX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0gIkFTSVggQVg4ODc3MiBVU0IgMi4wIEV0aGVybmV0IiwKKwkuYmluZCA9IGF4ODg3NzJfYmluZCwKKwkuc3RhdHVzID0gYXg4ODE3eF9zdGF0dXMsCisJLmxpbmtfcmVzZXQgPSBheDg4NzcyX2xpbmtfcmVzZXQsCisJLnJlc2V0ID0gYXg4ODc3Ml9saW5rX3Jlc2V0LAorCS5mbGFncyA9IEZMQUdfRVRIRVIgfCBGTEFHX0ZSQU1JTkdfQVgsCisJLnJ4X2ZpeHVwID0gYXg4ODc3Ml9yeF9maXh1cCwKKwkudHhfZml4dXAgPSBheDg4NzcyX3R4X2ZpeHVwLAorCS5kYXRhID0gMHgwMDEzMDEwMywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZAlwcm9kdWN0cyBbXSA9IHsKK3sKKwkvLyBMaW5rc3lzIFVTQjIwME0KKwlVU0JfREVWSUNFICgweDA3N2IsIDB4MjIyNiksCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCit9LCB7CisJLy8gTmV0Z2VhciBGQTEyMAorCVVTQl9ERVZJQ0UgKDB4MDg0NiwgMHgxMDQwKSwKKwkuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZuZXRnZWFyX2ZhMTIwX2luZm8sCit9LCB7CisJLy8gRExpbmsgRFVCLUUxMDAKKwlVU0JfREVWSUNFICgweDIwMDEsIDB4MWEwMCksCisJLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmZGxpbmtfZHViX2UxMDBfaW5mbywKK30sIHsKKwkvLyBJbnRlbGxpbmV0LCBTVCBMYWIgVVNCIEV0aGVybmV0CisJVVNCX0RFVklDRSAoMHgwYjk1LCAweDE3MjApLAorCS5kcml2ZXJfaW5mbyA9ICAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKK30sIHsKKwkvLyBIYXdraW5nIFVGMjAwLCBUcmVuZE5ldCBUVTItRVQxMDAKKwlVU0JfREVWSUNFICgweDA3YjgsIDB4NDIwYSksCisJLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmaGF3a2luZ191ZjIwMF9pbmZvLAorfSwgeworICAgICAgICAvLyBCaWxsaW9udG9uIFN5c3RlbXMsIFVTQjJBUgorICAgICAgICBVU0JfREVWSUNFICgweDA4ZGQsIDB4OTBmZiksCisgICAgICAgIC5kcml2ZXJfaW5mbyA9ICAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKK30sIHsKKwkvLyBBVEVOIFVDMjEwVAorCVVTQl9ERVZJQ0UgKDB4MDU1NywgMHgyMDA5KSwKKwkuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCit9LCB7CisJLy8gQnVmZmFsbyBMVUEtVTItS1RYCisJVVNCX0RFVklDRSAoMHgwNDExLCAweDAwM2QpLAorCS5kcml2ZXJfaW5mbyA9ICAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKK30sIHsKKwkvLyBTaXRlY29tIExOLTAyOSAiVVNCIDIuMCAxMC8xMDAgRXRoZXJuZXQgYWRhcHRlciIKKwlVU0JfREVWSUNFICgweDYxODksIDB4MTgyZCksCisJLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmYXg4ODE3eF9pbmZvLAorfSwgeworCS8vIGNvcmVnYSBGRXRoZXIgVVNCMi1UWAorCVVTQl9ERVZJQ0UgKDB4MDdhYSwgMHgwMDE3KSwKKwkuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCit9LCB7CisJLy8gU3VyZWNvbSBFUC0xNDI3WC0yCisJVVNCX0RFVklDRSAoMHgxMTg5LCAweDA4OTMpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODE3eF9pbmZvLAorfSwgeworCS8vIGdvb2R3YXkgY29ycCB1c2IgZ3d1c2IyZQorCVVTQl9ERVZJQ0UgKDB4MTYzMSwgMHg2MjAwKSwKKwkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKK30sIHsKKwkvLyBBU0lYIEFYODg3NzIgMTAvMTAwCisgICAgICAgIFVTQl9ERVZJQ0UgKDB4MGI5NSwgMHg3NzIwKSwKKyAgICAgICAgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZheDg4NzcyX2luZm8sCit9LAorCXsgfSwJCS8vIEVORAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBhc2l4X2RyaXZlciA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkiYXNpeCIsCisJLmlkX3RhYmxlID0JcHJvZHVjdHMsCisJLnByb2JlID0JdXNibmV0X3Byb2JlLAorCS5zdXNwZW5kID0JdXNibmV0X3N1c3BlbmQsCisJLnJlc3VtZSA9CXVzYm5ldF9yZXN1bWUsCisJLmRpc2Nvbm5lY3QgPQl1c2JuZXRfZGlzY29ubmVjdCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFzaXhfaW5pdCh2b2lkKQoreworIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZhc2l4X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhc2l4X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYXNpeF9leGl0KHZvaWQpCit7CisgCXVzYl9kZXJlZ2lzdGVyKCZhc2l4X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhc2l4X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBIb2xsaXMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVNJWCBBWDg4MTdYIGJhc2VkIFVTQiAyLjAgRXRoZXJuZXQgRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvY2F0Yy5jIGIvZHJpdmVycy91c2IvbmV0L2NhdGMuYwppbmRleCBjOGJlOTEyLi4zN2VmMzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvY2F0Yy5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9jYXRjLmMKQEAgLTM4Myw3ICszODMsNiBAQAogCiAJaWYgKHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUKSB7CiAJCWRiZygiVHggUmVzZXQuIik7Ci0JCXVyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CiAJCXVyYi0+c3RhdHVzID0gMDsKIAkJY2F0Yy0+bmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJCWNhdGMtPnN0YXRzLnR4X2Vycm9ycysrOwpAQCAtNDQ1LDcgKzQ0NCw2IEBACiAJc3RydWN0IGNhdGMgKmNhdGMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJd2FybigiVHJhbnNtaXQgdGltZWQgb3V0LiIpOwotCWNhdGMtPnR4X3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsKIAl1c2JfdW5saW5rX3VyYihjYXRjLT50eF91cmIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvY2RjX2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9uZXQvY2RjX2V0aGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyYjA0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL25ldC9jZGNfZXRoZXIuYwpAQCAtMCwwICsxLDUwOSBAQAorLyoKKyAqIENEQyBFdGhlcm5ldCBiYXNlZCBuZXR3b3JraW5nIHBlcmlwaGVyYWxzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBieSBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvLyAjZGVmaW5lCURFQlVHCQkJLy8gZXJyb3IgcGF0aCBtZXNzYWdlcywgZXh0cmEgaW5mbworLy8gI2RlZmluZQlWRVJCT1NFCQkJLy8gbW9yZTsgc3VjY2VzcyBtZXNzYWdlcworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaWZkZWYJQ09ORklHX1VTQl9ERUJVRworIyAgIGRlZmluZSBERUJVRworI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2JfY2RjLmg+CisKKyNpbmNsdWRlICJ1c2JuZXQuaCIKKworCisvKgorICogcHJvYmVzIGNvbnRyb2wgaW50ZXJmYWNlLCBjbGFpbXMgZGF0YSBpbnRlcmZhY2UsIGNvbGxlY3RzIHRoZSBidWxrCisgKiBlbmRwb2ludHMsIGFjdGl2YXRlcyBkYXRhIGludGVyZmFjZSAoaWYgbmVlZGVkKSwgbWF5YmUgc2V0cyBNVFUuCisgKiBhbGwgcHVyZSBjZGMsIGV4Y2VwdCBmb3IgY2VydGFpbiBmaXJtd2FyZSB3b3JrYXJvdW5kcywgYW5kIGtub3dpbmcKKyAqIHRoYXQgcm5kaXMgdXNlcyBvbmUgZGlmZmVyZW50IHJ1bGUuCisgKi8KK2ludCB1c2JuZXRfZ2VuZXJpY19jZGNfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXU4CQkJCSpidWYgPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZXh0cmE7CisJaW50CQkJCWxlbiA9IGludGYtPmN1cl9hbHRzZXR0aW5nLT5leHRyYWxlbjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yCSpkOworCXN0cnVjdCBjZGNfc3RhdGUJCSppbmZvID0gKHZvaWQgKikgJmRldi0+ZGF0YTsKKwlpbnQJCQkJc3RhdHVzOworCWludAkJCQlybmRpczsKKwlzdHJ1Y3QgdXNiX2RyaXZlcgkJKmRyaXZlciA9IGRyaXZlcl9vZihpbnRmKTsKKworCWlmIChzaXplb2YgZGV2LT5kYXRhIDwgc2l6ZW9mICppbmZvKQorCQlyZXR1cm4gLUVET007CisKKwkvKiBleHBlY3Qgc3RyaWN0IHNwZWMgY29uZm9ybWFuY2UgZm9yIHRoZSBkZXNjcmlwdG9ycywgYnV0CisJICogY29wZSB3aXRoIGZpcm13YXJlIHdoaWNoIHN0b3JlcyB0aGVtIGluIHRoZSB3cm9uZyBwbGFjZQorCSAqLworCWlmIChsZW4gPT0gMCAmJiBkZXYtPnVkZXYtPmFjdGNvbmZpZy0+ZXh0cmFsZW4pIHsKKwkJLyogTW90b3JvbGEgU0I0MTAwIChhbmQgb3RoZXJzOiBCcmFkIEhhcmRzIHNheXMgaXQncworCQkgKiBmcm9tIGEgQnJvYWRjb20gZGVzaWduKSBwdXQgQ0RDIGRlc2NyaXB0b3JzIGhlcmUKKwkJICovCisJCWJ1ZiA9IGRldi0+dWRldi0+YWN0Y29uZmlnLT5leHRyYTsKKwkJbGVuID0gZGV2LT51ZGV2LT5hY3Rjb25maWctPmV4dHJhbGVuOworCQlpZiAobGVuKQorCQkJZGV2X2RiZygmaW50Zi0+ZGV2LAorCQkJCSJDREMgZGVzY3JpcHRvcnMgb24gY29uZmlnXG4iKTsKKwl9CisKKwkvKiB0aGlzIGFzc3VtZXMgdGhhdCBpZiB0aGVyZSdzIGEgbm9uLVJORElTIHZlbmRvciB2YXJpYW50CisJICogb2YgY2RjLWFjbSwgaXQnbGwgZmFpbCBSTkRJUyByZXF1ZXN0cyBjbGVhbmx5LgorCSAqLworCXJuZGlzID0gKGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSAweGZmKTsKKworCW1lbXNldChpbmZvLCAwLCBzaXplb2YgKmluZm8pOworCWluZm8tPmNvbnRyb2wgPSBpbnRmOworCXdoaWxlIChsZW4gPiAzKSB7CisJCWlmIChidWYgWzFdICE9IFVTQl9EVF9DU19JTlRFUkZBQ0UpCisJCQlnb3RvIG5leHRfZGVzYzsKKworCQkvKiB1c2UgYkRlc2NyaXB0b3JTdWJUeXBlIHRvIGlkZW50aWZ5IHRoZSBDREMgZGVzY3JpcHRvcnMuCisJCSAqIFdlIGV4cGVjdCBkZXZpY2VzIHdpdGggQ0RDIGhlYWRlciBhbmQgdW5pb24gZGVzY3JpcHRvcnMuCisJCSAqIEZvciBDREMgRXRoZXJuZXQgd2UgbmVlZCB0aGUgZXRoZXJuZXQgZGVzY3JpcHRvci4KKwkJICogRm9yIFJORElTLCBpZ25vcmUgdHdvIChwb2ludGxlc3MpIENEQyBtb2RlbSBkZXNjcmlwdG9ycworCQkgKiBpbiBmYXZvciBvZiBhIGNvbXBsaWNhdGVkIE9JRC1iYXNlZCBSUEMgc2NoZW1lIGRvaW5nIHdoYXQKKwkJICogQ0RDIEV0aGVybmV0IGFjaGlldmVzIHdpdGggYSBzaW1wbGUgZGVzY3JpcHRvci4KKwkJICovCisJCXN3aXRjaCAoYnVmIFsyXSkgeworCQljYXNlIFVTQl9DRENfSEVBREVSX1RZUEU6CisJCQlpZiAoaW5mby0+aGVhZGVyKSB7CisJCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiZXh0cmEgQ0RDIGhlYWRlclxuIik7CisJCQkJZ290byBiYWRfZGVzYzsKKwkJCX0KKwkJCWluZm8tPmhlYWRlciA9ICh2b2lkICopIGJ1ZjsKKwkJCWlmIChpbmZvLT5oZWFkZXItPmJMZW5ndGggIT0gc2l6ZW9mICppbmZvLT5oZWFkZXIpIHsKKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJDREMgaGVhZGVyIGxlbiAldVxuIiwKKwkJCQkJaW5mby0+aGVhZGVyLT5iTGVuZ3RoKTsKKwkJCQlnb3RvIGJhZF9kZXNjOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVVNCX0NEQ19VTklPTl9UWVBFOgorCQkJaWYgKGluZm8tPnUpIHsKKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJleHRyYSBDREMgdW5pb25cbiIpOworCQkJCWdvdG8gYmFkX2Rlc2M7CisJCQl9CisJCQlpbmZvLT51ID0gKHZvaWQgKikgYnVmOworCQkJaWYgKGluZm8tPnUtPmJMZW5ndGggIT0gc2l6ZW9mICppbmZvLT51KSB7CisJCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiQ0RDIHVuaW9uIGxlbiAldVxuIiwKKwkJCQkJaW5mby0+dS0+Ykxlbmd0aCk7CisJCQkJZ290byBiYWRfZGVzYzsKKwkJCX0KKworCQkJLyogd2UgbmVlZCBhIG1hc3Rlci9jb250cm9sIGludGVyZmFjZSAod2hhdCB3ZSdyZQorCQkJICogcHJvYmVkIHdpdGgpIGFuZCBhIHNsYXZlL2RhdGEgaW50ZXJmYWNlOyB1bmlvbgorCQkJICogZGVzY3JpcHRvcnMgc29ydCB0aGlzIGFsbCBvdXQuCisJCQkgKi8KKwkJCWluZm8tPmNvbnRyb2wgPSB1c2JfaWZudW1fdG9faWYoZGV2LT51ZGV2LAorCQkJCQkJaW5mby0+dS0+Yk1hc3RlckludGVyZmFjZTApOworCQkJaW5mby0+ZGF0YSA9IHVzYl9pZm51bV90b19pZihkZXYtPnVkZXYsCisJCQkJCQlpbmZvLT51LT5iU2xhdmVJbnRlcmZhY2UwKTsKKwkJCWlmICghaW5mby0+Y29udHJvbCB8fCAhaW5mby0+ZGF0YSkgeworCQkJCWRldl9kYmcoJmludGYtPmRldiwKKwkJCQkJIm1hc3RlciAjJXUvJXAgc2xhdmUgIyV1LyVwXG4iLAorCQkJCQlpbmZvLT51LT5iTWFzdGVySW50ZXJmYWNlMCwKKwkJCQkJaW5mby0+Y29udHJvbCwKKwkJCQkJaW5mby0+dS0+YlNsYXZlSW50ZXJmYWNlMCwKKwkJCQkJaW5mby0+ZGF0YSk7CisJCQkJZ290byBiYWRfZGVzYzsKKwkJCX0KKwkJCWlmIChpbmZvLT5jb250cm9sICE9IGludGYpIHsKKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJib2d1cyBDREMgVW5pb25cbiIpOworCQkJCS8qIEFtYml0IFVTQiBDYWJsZSBNb2RlbSAoYW5kIG1heWJlIG90aGVycykKKwkJCQkgKiBpbnRlcmNoYW5nZXMgbWFzdGVyIGFuZCBzbGF2ZSBpbnRlcmZhY2UuCisJCQkJICovCisJCQkJaWYgKGluZm8tPmRhdGEgPT0gaW50ZikgeworCQkJCQlpbmZvLT5kYXRhID0gaW5mby0+Y29udHJvbDsKKwkJCQkJaW5mby0+Y29udHJvbCA9IGludGY7CisJCQkJfSBlbHNlCisJCQkJCWdvdG8gYmFkX2Rlc2M7CisJCQl9CisKKwkJCS8qIGEgZGF0YSBpbnRlcmZhY2UgYWx0c2V0dGluZyBkb2VzIHRoZSByZWFsIGkvbyAqLworCQkJZCA9ICZpbmZvLT5kYXRhLT5jdXJfYWx0c2V0dGluZy0+ZGVzYzsKKwkJCWlmIChkLT5iSW50ZXJmYWNlQ2xhc3MgIT0gVVNCX0NMQVNTX0NEQ19EQVRBKSB7CisJCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAic2xhdmUgY2xhc3MgJXVcbiIsCisJCQkJCWQtPmJJbnRlcmZhY2VDbGFzcyk7CisJCQkJZ290byBiYWRfZGVzYzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFVTQl9DRENfRVRIRVJORVRfVFlQRToKKwkJCWlmIChpbmZvLT5ldGhlcikgeworCQkJCWRldl9kYmcoJmludGYtPmRldiwgImV4dHJhIENEQyBldGhlclxuIik7CisJCQkJZ290byBiYWRfZGVzYzsKKwkJCX0KKwkJCWluZm8tPmV0aGVyID0gKHZvaWQgKikgYnVmOworCQkJaWYgKGluZm8tPmV0aGVyLT5iTGVuZ3RoICE9IHNpemVvZiAqaW5mby0+ZXRoZXIpIHsKKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJDREMgZXRoZXIgbGVuICV1XG4iLAorCQkJCQlpbmZvLT5ldGhlci0+Ykxlbmd0aCk7CisJCQkJZ290byBiYWRfZGVzYzsKKwkJCX0KKwkJCWRldi0+aGFyZF9tdHUgPSBsZTE2X3RvX2NwdSgKKwkJCQkJCWluZm8tPmV0aGVyLT53TWF4U2VnbWVudFNpemUpOworCQkJLyogYmVjYXVzZSBvZiBaYXVydXMsIHdlIG1heSBiZSBpZ25vcmluZyB0aGUgaG9zdAorCQkJICogc2lkZSBsaW5rIGFkZHJlc3Mgd2Ugd2VyZSBnaXZlbi4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KK25leHRfZGVzYzoKKwkJbGVuIC09IGJ1ZiBbMF07CS8qIGJMZW5ndGggKi8KKwkJYnVmICs9IGJ1ZiBbMF07CisJfQorCisJaWYgKCFpbmZvLT5oZWFkZXIgfHwgIWluZm8tPnUgfHwgKCFybmRpcyAmJiAhaW5mby0+ZXRoZXIpKSB7CisJCWRldl9kYmcoJmludGYtPmRldiwgIm1pc3NpbmcgY2RjICVzJXMlc2Rlc2NyaXB0b3JcbiIsCisJCQlpbmZvLT5oZWFkZXIgPyAiIiA6ICJoZWFkZXIgIiwKKwkJCWluZm8tPnUgPyAiIiA6ICJ1bmlvbiAiLAorCQkJaW5mby0+ZXRoZXIgPyAiIiA6ICJldGhlciAiKTsKKwkJZ290byBiYWRfZGVzYzsKKwl9CisKKwkvKiBjbGFpbSBkYXRhIGludGVyZmFjZSBhbmQgc2V0IGl0IHVwIC4uLiB3aXRoIHNpZGUgZWZmZWN0cy4KKwkgKiBuZXR3b3JrIHRyYWZmaWMgY2FuJ3QgZmxvdyB1bnRpbCBhbiBhbHRzZXR0aW5nIGlzIGVuYWJsZWQuCisJICovCisJc3RhdHVzID0gdXNiX2RyaXZlcl9jbGFpbV9pbnRlcmZhY2UoZHJpdmVyLCBpbmZvLT5kYXRhLCBkZXYpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCXN0YXR1cyA9IHVzYm5ldF9nZXRfZW5kcG9pbnRzKGRldiwgaW5mby0+ZGF0YSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJLyogZW5zdXJlIGltbWVkaWF0ZSBleGl0IGZyb20gdXNibmV0X2Rpc2Nvbm5lY3QgKi8KKwkJdXNiX3NldF9pbnRmZGF0YShpbmZvLT5kYXRhLCBOVUxMKTsKKwkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZShkcml2ZXIsIGluZm8tPmRhdGEpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIHN0YXR1cyBlbmRwb2ludDogb3B0aW9uYWwgZm9yIENEQyBFdGhlcm5ldCwgbm90IFJORElTIChvciBBQ00pICovCisJZGV2LT5zdGF0dXMgPSBOVUxMOworCWlmIChpbmZvLT5jb250cm9sLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzID09IDEpIHsKKwkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpkZXNjOworCisJCWRldi0+c3RhdHVzID0gJmluZm8tPmNvbnRyb2wtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludCBbMF07CisJCWRlc2MgPSAmZGV2LT5zdGF0dXMtPmRlc2M7CisJCWlmIChkZXNjLT5ibUF0dHJpYnV0ZXMgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UCisJCQkJfHwgIShkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikKKwkJCQl8fCAobGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpCisJCQkJCTwgc2l6ZW9mKHN0cnVjdCB1c2JfY2RjX25vdGlmaWNhdGlvbikpCisJCQkJfHwgIWRlc2MtPmJJbnRlcnZhbCkgeworCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiYmFkIG5vdGlmaWNhdGlvbiBlbmRwb2ludFxuIik7CisJCQlkZXYtPnN0YXR1cyA9IE5VTEw7CisJCX0KKwl9CisJaWYgKHJuZGlzICYmICFkZXYtPnN0YXR1cykgeworCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJtaXNzaW5nIFJORElTIHN0YXR1cyBlbmRwb2ludFxuIik7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW5mby0+ZGF0YSwgTlVMTCk7CisJCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoZHJpdmVyLCBpbmZvLT5kYXRhKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworCitiYWRfZGVzYzoKKwlkZXZfaW5mbygmZGV2LT51ZGV2LT5kZXYsICJiYWQgQ0RDIGRlc2NyaXB0b3JzXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9nZW5lcmljX2NkY19iaW5kKTsKKwordm9pZCB1c2JuZXRfY2RjX3VuYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBjZGNfc3RhdGUJCSppbmZvID0gKHZvaWQgKikgJmRldi0+ZGF0YTsKKwlzdHJ1Y3QgdXNiX2RyaXZlcgkJKmRyaXZlciA9IGRyaXZlcl9vZihpbnRmKTsKKworCS8qIGRpc2Nvbm5lY3QgbWFzdGVyIC0tPiBkaXNjb25uZWN0IHNsYXZlICovCisJaWYgKGludGYgPT0gaW5mby0+Y29udHJvbCAmJiBpbmZvLT5kYXRhKSB7CisJCS8qIGVuc3VyZSBpbW1lZGlhdGUgZXhpdCBmcm9tIHVzYm5ldF9kaXNjb25uZWN0ICovCisJCXVzYl9zZXRfaW50ZmRhdGEoaW5mby0+ZGF0YSwgTlVMTCk7CisJCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoZHJpdmVyLCBpbmZvLT5kYXRhKTsKKwkJaW5mby0+ZGF0YSA9IE5VTEw7CisJfQorCisJLyogYW5kIHZpY2UgdmVyc2EgKGp1c3QgaW4gY2FzZSkgKi8KKwllbHNlIGlmIChpbnRmID09IGluZm8tPmRhdGEgJiYgaW5mby0+Y29udHJvbCkgeworCQkvKiBlbnN1cmUgaW1tZWRpYXRlIGV4aXQgZnJvbSB1c2JuZXRfZGlzY29ubmVjdCAqLworCQl1c2Jfc2V0X2ludGZkYXRhKGluZm8tPmNvbnRyb2wsIE5VTEwpOworCQl1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKGRyaXZlciwgaW5mby0+Y29udHJvbCk7CisJCWluZm8tPmNvbnRyb2wgPSBOVUxMOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9jZGNfdW5iaW5kKTsKKworDAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQ29tbXVuaWNhdGlvbnMgRGV2aWNlIENsYXNzLCBFdGhlcm5ldCBDb250cm9sIG1vZGVsCisgKgorICogVGFrZXMgdHdvIGludGVyZmFjZXMuICBUaGUgREFUQSBpbnRlcmZhY2UgaXMgaW5hY3RpdmUgdGlsbCBhbiBhbHRzZXR0aW5nCisgKiBpcyBzZWxlY3RlZC4gIENvbmZpZ3VyYXRpb24gZGF0YSBpbmNsdWRlcyBjbGFzcyBkZXNjcmlwdG9ycy4gIFRoZXJlJ3MKKyAqIGFuIG9wdGlvbmFsIHN0YXR1cyBlbmRwb2ludCBvbiB0aGUgY29udHJvbCBpbnRlcmZhY2UuCisgKgorICogVGhpcyBzaG91bGQgaW50ZXJvcCB3aXRoIHdoYXRldmVyIHRoZSAyLjQgIkNEQ0V0aGVyLmMiIGRyaXZlcgorICogKGJ5IEJyYWQgSGFyZHMpIHRhbGtlZCB3aXRoLCB3aXRoIG1vcmUgZnVuY3Rpb25hbGl0eS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBkdW1wc3BlZWQoc3RydWN0IHVzYm5ldCAqZGV2LCBfX2xlMzIgKnNwZWVkcykKK3sKKwlpZiAobmV0aWZfbXNnX3RpbWVyKGRldikpCisJCWRldmluZm8oZGV2LCAibGluayBzcGVlZHM6ICV1IGticHMgdXAsICV1IGticHMgZG93biIsCisJCQlfX2xlMzJfdG9fY3B1KHNwZWVkc1swXSkgLyAxMDAwLAorCQlfX2xlMzJfdG9fY3B1KHNwZWVkc1sxXSkgLyAxMDAwKTsKK30KKworc3RhdGljIHZvaWQgY2RjX3N0YXR1cyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX2NkY19ub3RpZmljYXRpb24JKmV2ZW50OworCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA8IHNpemVvZiAqZXZlbnQpCisJCXJldHVybjsKKworCS8qIFNQRUVEX0NIQU5HRSBjYW4gZ2V0IHNwbGl0IGludG8gdHdvIDgtYnl0ZSBwYWNrZXRzICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChFVkVOVF9TVFNfU1BMSVQsICZkZXYtPmZsYWdzKSkgeworCQlkdW1wc3BlZWQoZGV2LCAoX19sZTMyICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJcmV0dXJuOworCX0KKworCWV2ZW50ID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJc3dpdGNoIChldmVudC0+Yk5vdGlmaWNhdGlvblR5cGUpIHsKKwljYXNlIFVTQl9DRENfTk9USUZZX05FVFdPUktfQ09OTkVDVElPTjoKKwkJaWYgKG5ldGlmX21zZ190aW1lcihkZXYpKQorCQkJZGV2ZGJnKGRldiwgIkNEQzogY2FycmllciAlcyIsCisJCQkJCWV2ZW50LT53VmFsdWUgPyAib24iIDogIm9mZiIpOworCQlpZiAoZXZlbnQtPndWYWx1ZSkKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2LT5uZXQpOworCQllbHNlCisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYtPm5ldCk7CisJCWJyZWFrOworCWNhc2UgVVNCX0NEQ19OT1RJRllfU1BFRURfQ0hBTkdFOgkvKiB0eC9yeCByYXRlcyAqLworCQlpZiAobmV0aWZfbXNnX3RpbWVyKGRldikpCisJCQlkZXZkYmcoZGV2LCAiQ0RDOiBzcGVlZCBjaGFuZ2UgKGxlbiAlZCkiLAorCQkJCQl1cmItPmFjdHVhbF9sZW5ndGgpOworCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IChzaXplb2YgKmV2ZW50ICsgOCkpCisJCQlzZXRfYml0KEVWRU5UX1NUU19TUExJVCwgJmRldi0+ZmxhZ3MpOworCQllbHNlCisJCQlkdW1wc3BlZWQoZGV2LCAoX19sZTMyICopICZldmVudFsxXSk7CisJCWJyZWFrOworCS8qIFVTQl9DRENfTk9USUZZX1JFU1BPTlNFX0FWQUlMQUJMRSBjYW4gaGFwcGVuIHRvbyAoZS5nLiBSTkRJUyksCisJICogYnV0IHRoZXJlIGFyZSBubyBzdGFuZGFyZCBmb3JtYXRzIGZvciB0aGUgcmVzcG9uc2UgZGF0YS4KKwkgKi8KKwlkZWZhdWx0OgorCQlkZXZlcnIoZGV2LCAiQ0RDOiB1bmV4cGVjdGVkIG5vdGlmaWNhdGlvbiAlMDJ4ISIsCisJCQkJIGV2ZW50LT5iTm90aWZpY2F0aW9uVHlwZSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHU4IG5pYmJsZSh1bnNpZ25lZCBjaGFyIGMpCit7CisJaWYgKGxpa2VseShpc2RpZ2l0KGMpKSkKKwkJcmV0dXJuIGMgLSAnMCc7CisJYyA9IHRvdXBwZXIoYyk7CisJaWYgKGxpa2VseShpc3hkaWdpdChjKSkpCisJCXJldHVybiAxMCArIGMgLSAnQSc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitnZXRfZXRoZXJuZXRfYWRkcihzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfY2RjX2V0aGVyX2Rlc2MgKmUpCit7CisJaW50IAkJdG1wLCBpOworCXVuc2lnbmVkIGNoYXIJYnVmIFsxM107CisKKwl0bXAgPSB1c2Jfc3RyaW5nKGRldi0+dWRldiwgZS0+aU1BQ0FkZHJlc3MsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CisJaWYgKHRtcCAhPSAxMikgeworCQlkZXZfZGJnKCZkZXYtPnVkZXYtPmRldiwKKwkJCSJiYWQgTUFDIHN0cmluZyAlZCBmZXRjaCwgJWRcbiIsIGUtPmlNQUNBZGRyZXNzLCB0bXApOworCQlpZiAodG1wID49IDApCisJCQl0bXAgPSAtRUlOVkFMOworCQlyZXR1cm4gdG1wOworCX0KKwlmb3IgKGkgPSB0bXAgPSAwOyBpIDwgNjsgaSsrLCB0bXAgKz0gMikKKwkJZGV2LT5uZXQtPmRldl9hZGRyIFtpXSA9CisJCQkobmliYmxlKGJ1ZiBbdG1wXSkgPDwgNCkgKyBuaWJibGUoYnVmIFt0bXAgKyAxXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2RjX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQJCQkJc3RhdHVzOworCXN0cnVjdCBjZGNfc3RhdGUJCSppbmZvID0gKHZvaWQgKikgJmRldi0+ZGF0YTsKKworCXN0YXR1cyA9IHVzYm5ldF9nZW5lcmljX2NkY19iaW5kKGRldiwgaW50Zik7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlzdGF0dXMgPSBnZXRfZXRoZXJuZXRfYWRkcihkZXYsIGluZm8tPmV0aGVyKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQl1c2Jfc2V0X2ludGZkYXRhKGluZm8tPmRhdGEsIE5VTEwpOworCQl1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKGRyaXZlcl9vZihpbnRmKSwgaW5mby0+ZGF0YSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogRklYTUUgY2RjLWV0aGVyIGhhcyBzb21lIG11bHRpY2FzdCBjb2RlIHRvbywgdGhvdWdoIGl0IGNvbXBsYWlucworCSAqIGluIHJvdXRpbmUgY2FzZXMuICBpbmZvLT5ldGhlciBkZXNjcmliZXMgdGhlIG11bHRpY2FzdCBzdXBwb3J0LgorCSAqIEltcGxlbWVudCB0aGF0IGhlcmUsIG1hbmlwdWxhdGluZyB0aGUgY2RjIGZpbHRlciBhcyBuZWVkZWQuCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JY2RjX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0JIkNEQyBFdGhlcm5ldCBEZXZpY2UiLAorCS5mbGFncyA9CUZMQUdfRVRIRVIsCisJLy8gLmNoZWNrX2Nvbm5lY3QgPSBjZGNfY2hlY2tfY29ubmVjdCwKKwkuYmluZCA9CQljZGNfYmluZCwKKwkudW5iaW5kID0JdXNibmV0X2NkY191bmJpbmQsCisJLnN0YXR1cyA9CWNkY19zdGF0dXMsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZAlwcm9kdWN0cyBbXSA9IHsKKy8qCisgKiBCTEFDS0xJU1QgISEKKyAqCisgKiBGaXJzdCBibGFja2xpc3QgYW55IHByb2R1Y3RzIHRoYXQgYXJlIGVncmVnaW91c2x5IG5vbmNvbmZvcm1hbnQKKyAqIHdpdGggdGhlIENEQyBFdGhlcm5ldCBzcGVjcy4gIE1pbm9yIGJyYWluZGFtYWdlIHdlIGNvcGUgd2l0aDsgd2hlbgorICogdGhleSdyZSBub3QgZXZlbiB0cnlpbmcsIG5lZWRpbmcgYSBzZXBhcmF0ZSBkcml2ZXIgaXMgb25seSB0aGUgZmlyc3QKKyAqIG9mIHRoZSBkaWZmZXJlbmNlcyB0byBzaG93IHVwLgorICovCisKKyNkZWZpbmUJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UgXAorCS5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfQ09NTSwgXAorCS5iSW50ZXJmYWNlU3ViQ2xhc3MJPSBVU0JfQ0RDX1NVQkNMQVNTX0VUSEVSTkVULCBcCisJLmJJbnRlcmZhY2VQcm90b2NvbAk9IFVTQl9DRENfUFJPVE9fTk9ORQorCisvKiBTQS0xMTAwIGJhc2VkIFNoYXJwIFphdXJ1cyAoImNvbGxpZSIpLCBvciBjb21wYXRpYmxlOworICogd2lyZS1pbmNvbXBhdGlibGUgd2l0aCB0cnVlIENEQyBFdGhlcm5ldCBpbXBsZW1lbnRhdGlvbnMuCisgKiAoQW5kLCBpdCBzZWVtcywgbmVlZGxlc3NseSBzby4uLikKKyAqLworeworCS5tYXRjaF9mbGFncwk9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTworCQkJICB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCS5pZFZlbmRvcgkJPSAweDA0REQsCisJLmlkUHJvZHVjdAkJPSAweDgwMDQsCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvCQk9IDAsCit9LAorCisvKiBQWEEtMjV4IGJhc2VkIFNoYXJwIFphdXJpaS4gIE5vdGUgdGhhdCBpdCBzZWVtcyBzb21lIG9mIHRoZXNlCisgKiAobGF0ZXIgbW9kZWxzIGVzcGVjaWFsbHkpIG1heSBoYXZlIHNoaXBwZWQgb25seSB3aXRoIGZpcm13YXJlCisgKiBhZHZlcnRpc2luZyBmYWxzZSAiQ0RDIE1ETE0iIGNvbXBhdGliaWxpdHkgLi4uIGJ1dCB3ZSdyZSBub3QKKyAqIGNsZWFyIHdoaWNoIG1vZGVscyBkaWQgdGhhdCwgc28gZm9yIG5vdyBsZXQncyBhc3N1bWUgdGhlIHdvcnN0LgorICovCit7CisJLm1hdGNoX2ZsYWdzCT0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCisJCQkgIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCisJLmlkVmVuZG9yCQk9IDB4MDRERCwKKwkuaWRQcm9kdWN0CQk9IDB4ODAwNSwJLyogQS0zMDAgKi8KKwlaQVVSVVNfTUFTVEVSX0lOVEVSRkFDRSwKKwkuZHJpdmVyX2luZm8JCT0gMCwKK30sIHsKKwkubWF0Y2hfZmxhZ3MJPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KKwkJCSAgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkuaWRWZW5kb3IJCT0gMHgwNERELAorCS5pZFByb2R1Y3QJCT0gMHg4MDA2LAkvKiBCLTUwMC9TTC01NjAwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvCQk9IDAsCit9LCB7CisJLm1hdGNoX2ZsYWdzICAgID0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCisJICAgICAgICAgIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCisJLmlkVmVuZG9yCQk9IDB4MDRERCwKKwkuaWRQcm9kdWN0CQk9IDB4ODAwNywJLyogQy03MDAgKi8KKwlaQVVSVVNfTUFTVEVSX0lOVEVSRkFDRSwKKwkuZHJpdmVyX2luZm8JCT0gMCwKK30sIHsKKwkubWF0Y2hfZmxhZ3MgICAgPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KKwkJIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCisJLmlkVmVuZG9yICAgICAgICAgICAgICAgPSAweDA0REQsCisJLmlkUHJvZHVjdCAgICAgICAgICAgICAgPSAweDkwMzEsCS8qIEMtNzUwIEMtNzYwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvCQk9IDAsCit9LCB7CisJLm1hdGNoX2ZsYWdzICAgID0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCisJCSB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCS5pZFZlbmRvciAgICAgICAgICAgICAgID0gMHgwNERELAorCS5pZFByb2R1Y3QgICAgICAgICAgICAgID0gMHg5MDMyLAkvKiBTTC02MDAwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvCQk9IDAsCit9LCB7CisJLm1hdGNoX2ZsYWdzICAgID0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCisJCSB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCS5pZFZlbmRvciAgICAgICAgICAgICAgID0gMHgwNERELAorCS8qIHJlcG9ydGVkIHdpdGggc29tZSBDODYwIHVuaXRzICovCisJLmlkUHJvZHVjdCAgICAgICAgICAgICAgPSAweDkwNTAsCS8qIEMtODYwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvCQk9IDAsCit9LAorCisvKgorICogV0hJVEVMSVNUISEhCisgKgorICogQ0RDIEV0aGVyIHVzZXMgdHdvIGludGVyZmFjZXMsIG5vdCBuZWNlc3NhcmlseSBjb25zZWN1dGl2ZS4KKyAqIFdlIG1hdGNoIHRoZSBtYWluIGludGVyZmFjZSwgaWdub3JpbmcgdGhlIG9wdGlvbmFsIGRldmljZQorICogY2xhc3Mgc28gd2UgY291bGQgaGFuZGxlIGRldmljZXMgdGhhdCBhcmVuJ3QgZXhjbHVzaXZlbHkKKyAqIENEQyBldGhlci4KKyAqCisgKiBOT1RFOiAgdGhpcyBtYXRjaCBtdXN0IGNvbWUgQUZURVIgZW50cmllcyBibGFja2xpc3RpbmcgZGV2aWNlcworICogYmVjYXVzZSBvZiBidWdzL3F1aXJrcyBpbiBhIGdpdmVuIHByb2R1Y3QgKGxpa2UgWmF1cnVzLCBhYm92ZSkuCisgKi8KK3sKKwlVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX0NPTU0sIFVTQl9DRENfU1VCQ0xBU1NfRVRIRVJORVQsCisJCQlVU0JfQ0RDX1BST1RPX05PTkUpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY2RjX2luZm8sCit9LAorCXsgfSwJCS8vIEVORAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBjZGNfZHJpdmVyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJjZGNfZXRoZXIiLAorCS5pZF90YWJsZSA9CXByb2R1Y3RzLAorCS5wcm9iZSA9CXVzYm5ldF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYm5ldF9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0JdXNibmV0X3N1c3BlbmQsCisJLnJlc3VtZSA9CXVzYm5ldF9yZXN1bWUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGNkY19pbml0KHZvaWQpCit7CisJQlVHX09OKChzaXplb2YoKChzdHJ1Y3QgdXNibmV0ICopMCktPmRhdGEpCisJCQk8IHNpemVvZihzdHJ1Y3QgY2RjX3N0YXRlKSkpOworCisgCXJldHVybiB1c2JfcmVnaXN0ZXIoJmNkY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoY2RjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgY2RjX2V4aXQodm9pZCkKK3sKKyAJdXNiX2RlcmVnaXN0ZXIoJmNkY19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoY2RjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBCcm93bmVsbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVU0IgQ0RDIEV0aGVybmV0IGRldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9jZGNfc3Vic2V0LmMgYi9kcml2ZXJzL3VzYi9uZXQvY2RjX3N1YnNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzMwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9uZXQvY2RjX3N1YnNldC5jCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogU2ltcGxlICJDREMgU3Vic2V0IiBVU0IgTmV0d29ya2luZyBMaW5rcworICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgYnkgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmCUNPTkZJR19VU0JfREVCVUcKKyMgICBkZWZpbmUgREVCVUcKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgInVzYm5ldC5oIgorCisKKy8qCisgKiBUaGlzIHN1cHBvcnRzIHNpbXBsZSBVU0IgbmV0d29yayBsaW5rcyB0aGF0IGRvbid0IHJlcXVpcmUgYW55IHNwZWNpYWwKKyAqIGZyYW1pbmcgb3IgaGFyZHdhcmUgY29udHJvbCBvcGVyYXRpb25zLiAgVGhlIHByb3RvY29sIHVzZWQgaGVyZSBpcyBhCisgKiBzdHJpY3Qgc3Vic2V0IG9mIENEQyBFdGhlcm5ldCwgd2l0aCB0aHJlZSBiYXNpYyBkaWZmZXJlbmNlcyByZWZsZWN0aW5nCisgKiB0aGUgZ29hbCB0aGF0IGFsbW9zdCBhbnkgaGFyZHdhcmUgc2hvdWxkIHJ1biBpdDoKKyAqCisgKiAgLSBNaW5pbWFsIHJ1bnRpbWUgY29udHJvbDogIG9uZSBpbnRlcmZhY2UsIG5vIGFsdHNldHRpbmdzLCBhbmQKKyAqICAgIG5vIHZlbmRvciBvciBjbGFzcyBzcGVjaWZpYyBjb250cm9sIHJlcXVlc3RzLiAgSWYgYSBkZXZpY2UgaXMKKyAqICAgIGNvbmZpZ3VyZWQsIGl0IGlzIGFsbG93ZWQgdG8gZXhjaGFuZ2UgcGFja2V0cyB3aXRoIHRoZSBob3N0LgorICogICAgRmFuY2llciBtb2RlbHMgd291bGQgbWVhbiBub3Qgd29ya2luZyBvbiBzb21lIGhhcmR3YXJlLgorICoKKyAqICAtIE1pbmltYWwgbWFudWZhY3R1cmluZyBjb250cm9sOiAgbm8gSUVFRSAiT3JnYW5pemF0aW9uYWxseQorICogICAgVW5pcXVlIElEIiByZXF1aXJlZCwgb3IgYW4gRUVQUk9NcyB0byBzdG9yZSBvbmUuICBFYWNoIGhvc3QgdXNlcworICogICAgb25lIHJhbmRvbSAibG9jYWxseSBhc3NpZ25lZCIgRXRoZXJuZXQgYWRkcmVzcyBpbnN0ZWFkLCB3aGljaCBjYW4KKyAqICAgIG9mIGNvdXJzZSBiZSBvdmVycmlkZGVuIHVzaW5nIHN0YW5kYXJkIHRvb2xzIGxpa2UgImlmY29uZmlnIi4KKyAqICAgIChXaXRoIDJeNDYgc3VjaCBhZGRyZXNzZXMsIHNhbWUtbmV0IGNvbGxpc2lvbnMgYXJlIHF1aXRlIHJhcmUuKQorICoKKyAqICAtIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgZnJhbWluZyBkYXRhIGZvciBVU0IuICBQYWNrZXRzIGFyZSB3cml0dGVuCisgKiAgICBleGFjdGx5IGFzIGluIENEQyBFdGhlcm5ldCwgc3RhcnRpbmcgd2l0aCBhbiBFdGhlcm5ldCBoZWFkZXIgYW5kCisgKiAgICB0ZXJtaW5hdGVkIGJ5IGEgc2hvcnQgcGFja2V0LiAgSG93ZXZlciwgdGhlIGhvc3Qgd2lsbCBuZXZlciBzZW5kIGEKKyAqICAgIHplcm8gbGVuZ3RoIHBhY2tldDsgc29tZSBzeXN0ZW1zIGNhbid0IGhhbmRsZSB0aG9zZSByb2J1c3RseS4KKyAqCisgKiBBbnl0aGluZyB0aGF0IGNhbiB0cmFuc21pdCBhbmQgcmVjZWl2ZSBVU0IgYnVsayBwYWNrZXRzIGNhbiBpbXBsZW1lbnQKKyAqIHRoaXMgcHJvdG9jb2wuICBUaGF0IGluY2x1ZGVzIGJvdGggc21hcnQgcGVyaXBoZXJhbHMgYW5kIHF1aXRlIGEgbG90CisgKiBvZiAiaG9zdC10by1ob3N0IiBVU0IgY2FibGVzICh3aGljaCBlbWJlZCB0d28gZGV2aWNlcyBiYWNrLXRvLWJhY2spLgorICoKKyAqIE5vdGUgdGhhdCBhbHRob3VnaCBMaW51eCBtYXkgdXNlIG1hbnkgb2YgdGhvc2UgaG9zdC10by1ob3N0IGxpbmtzCisgKiB3aXRoIHRoaXMgImNkY19zdWJzZXQiIGZyYW1pbmcsIHRoYXQgZG9lc24ndCBtZWFuIHRoZXJlIG1heSBub3QgYmUgYQorICogYmV0dGVyIGFwcHJvYWNoLiAgSGFuZGxpbmcgdGhlICJvdGhlciBlbmQgdW5wbHVncy9yZXBsdWdzIiBzY2VuYXJpbworICogd2VsbCB0ZW5kcyB0byByZXF1aXJlIGNoaXAtc3BlY2lmaWMgdmVuZG9yIHJlcXVlc3RzLiAgQWxzbywgV2luZG93cworICogcGVlcnMgYXQgdGhlIG90aGVyIGVuZCBvZiBob3N0LXRvLWhvc3QgY2FibGVzIG1heSBleHBlY3QgdGhlaXIgb3duCisgKiBmcmFtaW5nIHRvIGJlIHVzZWQgcmF0aGVyIHRoYW4gdGhpcyAiY2RjX3N1YnNldCIgbW9kZWwuCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9FUFNPTjI4ODgpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9BUk1MSU5VWCkKKy8qIFBEQSBzdHlsZSBkZXZpY2VzIGFyZSBhbHdheXMgY29ubmVjdGVkIGlmIHByZXNlbnQgKi8KK3N0YXRpYyBpbnQgYWx3YXlzX2Nvbm5lY3RlZCAoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZglDT05GSUdfVVNCX0FMSV9NNTYzMgorI2RlZmluZQlIQVZFX0hBUkRXQVJFCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEFMaSBNNTYzMiBkcml2ZXIgLi4uIGRvZXMgaGlnaCBzcGVlZAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JYWxpX201NjMyX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0JIkFMaSBNNTYzMiIsCit9OworCisKKyNlbmRpZgorCisMCisjaWZkZWYJQ09ORklHX1VTQl9BTjI3MjAKKyNkZWZpbmUJSEFWRV9IQVJEV0FSRQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBBbmNob3JDaGlwcyAyNzIwIGRyaXZlciAuLi4gaHR0cDovL3d3dy5jeXByZXNzLmNvbQorICoKKyAqIFRoaXMgZG9lc24ndCBzZWVtIHRvIGhhdmUgYSB3YXkgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHBlZXIgaXMKKyAqIGNvbm5lY3RlZCwgb3IgbmVlZCBhbnkgcmVzZXQgaGFuZHNoYWtpbmcuICBJdCdzIGdvdCBwcmV0dHkgYmlnCisgKiBpbnRlcm5hbCBidWZmZXJzIChoYW5kbGVzIG1vc3Qgb2YgYSBmcmFtZSdzIHdvcnRoIG9mIGRhdGEpLgorICogQ2hpcCBkYXRhIHNoZWV0cyBkb24ndCBkZXNjcmliZSBhbnkgdmVuZG9yIGNvbnRyb2wgbWVzc2FnZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwlhbjI3MjBfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiQW5jaG9yQ2hpcHMvQ3lwcmVzcyAyNzIwIiwKKwkvLyBubyByZXNldCBhdmFpbGFibGUhCisJLy8gbm8gY2hlY2tfY29ubmVjdCBhdmFpbGFibGUhCisKKwkuaW4gPSAyLCAub3V0ID0gMiwJCS8vIGRpcmVjdGlvbiBkaXN0aW5ndWlzaGVzIHRoZXNlCit9OworCisjZW5kaWYJLyogQ09ORklHX1VTQl9BTjI3MjAgKi8KKworDAorI2lmZGVmCUNPTkZJR19VU0JfQkVMS0lOCisjZGVmaW5lCUhBVkVfSEFSRFdBUkUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQmVsa2luIEY1VTEwNCAuLi4gdHdvIE5ldENoaXAgMjI4MCBkZXZpY2VzICsgQXRtZWwgQVZSIG1pY3JvY29udHJvbGxlcgorICoKKyAqIC4uLiBhbHNvIHR3byBlVEVLIGRlc2lnbnMsIGluY2x1ZGluZyBvbmUgc29sZCBhcyAiQWR2YW5jZSBVU0JORVQiCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwliZWxraW5faW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiQmVsa2luLCBlVEVLLCBvciBjb21wYXRpYmxlIiwKK307CisKKyNlbmRpZgkvKiBDT05GSUdfVVNCX0JFTEtJTiAqLworCisKKwwKKyNpZmRlZglDT05GSUdfVVNCX0VQU09OMjg4OAorI2RlZmluZQlIQVZFX0hBUkRXQVJFCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEVQU09OIFVTQiBjbGllbnRzCisgKgorICogVGhpcyBpcyB0aGUgc2FtZSBpZGVhIGFzIExpbnV4IFBEQXMgKGJlbG93KSBleGNlcHQgdGhlIGZpcm13YXJlIGluIHRoZQorICogZGV2aWNlIG1pZ2h0IG5vdCBiZSBUdXgtcG93ZXJlZC4gIEVwc29uIHByb3ZpZGVzIHJlZmVyZW5jZSBmaXJtd2FyZSB0aGF0CisgKiBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLiAgUHJvZHVjdCBkZXZlbG9wZXJzIGNhbiByZXVzZSBvciBtb2RpZnkgdGhhdAorICogY29kZSwgc3VjaCBhcyBieSB1c2luZyB0aGVpciBvd24gcHJvZHVjdCBhbmQgdmVuZG9yIGNvZGVzLgorICoKKyAqIFN1cHBvcnQgd2FzIGZyb20gSnVybyBCeXN0cmlja3kgPGJ5c3RyaWNreS5qdXJvQGVyZC5lcHNvbi5jb20+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwllcHNvbjI4ODhfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiRXBzb24gVVNCIERldmljZSIsCisJLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAorCisJLmluID0gNCwgLm91dCA9IDMsCit9OworCisjZW5kaWYJLyogQ09ORklHX1VTQl9FUFNPTjI4ODggKi8KKworDAorI2lmZGVmIENPTkZJR19VU0JfS0MyMTkwCisjZGVmaW5lIEhBVkVfSEFSRFdBUkUKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8ga2MyMTkwX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0gICJLQyBUZWNobm9sb2d5IEtDLTE5MCIsCit9OworI2VuZGlmIC8qIENPTkZJR19VU0JfS0MyMTkwICovCisKKwwKKyNpZmRlZglDT05GSUdfVVNCX0FSTUxJTlVYCisjZGVmaW5lCUhBVkVfSEFSRFdBUkUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSW50ZWwncyBTQS0xMTAwIGNoaXAgaW50ZWdyYXRlcyBiYXNpYyBVU0Igc3VwcG9ydCwgYW5kIGlzIHVzZWQKKyAqIGluIFBEQXMgbGlrZSBzb21lIGlQYXFzLCB0aGUgWW9weSwgc29tZSBaYXVydXMgbW9kZWxzLCBhbmQgbW9yZS4KKyAqIFdoZW4gdGhleSBydW4gTGludXgsIGFyY2gvYXJtL21hY2gtc2ExMTAwL3VzYi1ldGguYyBtYXkgYmUgdXNlZCB0bworICogbmV0d29yayB1c2luZyBtaW5pbWFsIFVTQiBmcmFtaW5nIGRhdGEuCisgKgorICogVGhpcyBkZXNjcmliZXMgdGhlIGRyaXZlciBjdXJyZW50bHkgaW4gc3RhbmRhcmQgQVJNIExpbnV4IGtlcm5lbHMuCisgKiBUaGUgWmF1cnVzIHVzZXMgYSBkaWZmZXJlbnQgZHJpdmVyIChzZWUgbGF0ZXIpLgorICoKKyAqIFBYQTI1eCBhbmQgUFhBMjEwIHVzZSBYU2NhbGUgY29yZXMgKEFSTSB2NVRFKSB3aXRoIGJldHRlciBVU0Igc3VwcG9ydAorICogYW5kIGRpZmZlcmVudCBVU0IgZW5kcG9pbnQgbnVtYmVyaW5nIHRoYW4gdGhlIFNBMTEwMCBkZXZpY2VzLiAgVGhlCisgKiBtYWNoLXB4YS91c2ItZXRoLmMgZHJpdmVyIHJlLXVzZXMgdGhlIGRldmljZSBpZHMgZnJvbSBtYWNoLXNhMTEwMAorICogc28gd2UgcmVseSBvbiB0aGUgZW5kcG9pbnQgZGVzY3JpcHRvcnMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwlsaW51eGRldl9pbmZvID0geworCS5kZXNjcmlwdGlvbiA9CSJMaW51eCBEZXZpY2UiLAorCS5jaGVja19jb25uZWN0ID0gYWx3YXlzX2Nvbm5lY3RlZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JeW9weV9pbmZvID0geworCS5kZXNjcmlwdGlvbiA9CSJZb3B5IiwKKwkuY2hlY2tfY29ubmVjdCA9IGFsd2F5c19jb25uZWN0ZWQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvCWJsb2JfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiQm9vdCBMb2FkZXIgT0JqZWN0IiwKKwkuY2hlY2tfY29ubmVjdCA9IGFsd2F5c19jb25uZWN0ZWQsCit9OworCisjZW5kaWYJLyogQ09ORklHX1VTQl9BUk1MSU5VWCAqLworCisMCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmCUhBVkVfSEFSRFdBUkUKKyNlcnJvciBZb3UgbmVlZCB0byBjb25maWd1cmUgc29tZSBoYXJkd2FyZSBmb3IgdGhpcyBkcml2ZXIKKyNlbmRpZgorCisvKgorICogY2hpcCB2ZW5kb3IgbmFtZXMgd29uJ3Qgbm9ybWFsbHkgYmUgb24gdGhlIGNhYmxlcywgYW5kCisgKiBtYXkgbm90IGJlIG9uIHRoZSBkZXZpY2UuCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkCXByb2R1Y3RzIFtdID0geworCisjaWZkZWYJQ09ORklHX1VTQl9BTElfTTU2MzIKK3sKKwlVU0JfREVWSUNFICgweDA0MDIsIDB4NTYzMiksCS8vIEFMaSBkZWZhdWx0cworCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmYWxpX201NjMyX2luZm8sCit9LAorI2VuZGlmCisKKyNpZmRlZglDT05GSUdfVVNCX0FOMjcyMAoreworCVVTQl9ERVZJQ0UgKDB4MDU0NywgMHgyNzIwKSwJLy8gQW5jaG9yQ2hpcHMgZGVmYXVsdHMKKwkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmFuMjcyMF9pbmZvLAorfSwgeworCVVTQl9ERVZJQ0UgKDB4MDU0NywgMHgyNzI3KSwJLy8gWGlyY29tIFBHVU5FVAorCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmYW4yNzIwX2luZm8sCit9LAorI2VuZGlmCisKKyNpZmRlZglDT05GSUdfVVNCX0JFTEtJTgoreworCVVTQl9ERVZJQ0UgKDB4MDUwZCwgMHgwMDA0KSwJLy8gQmVsa2luCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZiZWxraW5faW5mbywKK30sIHsKKwlVU0JfREVWSUNFICgweDA1NmMsIDB4ODEwMCksCS8vIGVURUsKKwkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmJlbGtpbl9pbmZvLAorfSwgeworCVVTQl9ERVZJQ0UgKDB4MDUyNSwgMHg5OTAxKSwJLy8gQWR2YW5jZSBVU0JORVQgKGVURUspCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZiZWxraW5faW5mbywKK30sCisjZW5kaWYKKworI2lmZGVmCUNPTkZJR19VU0JfRVBTT04yODg4Cit7CisJVVNCX0RFVklDRSAoMHgwNTI1LCAweDI4ODgpLAkvLyBFUFNPTiBVU0IgY2xpZW50CisJLmRyaXZlcl9pbmZvCT0gKHVuc2lnbmVkIGxvbmcpICZlcHNvbjI4ODhfaW5mbywKK30sCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19VU0JfS0MyMTkwCit7CisJVVNCX0RFVklDRSAoMHgwNTBmLCAweDAxOTApLAkvLyBLQy0xOTAKKwkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmtjMjE5MF9pbmZvLAorfSwKKyNlbmRpZgorCisjaWZkZWYJQ09ORklHX1VTQl9BUk1MSU5VWAorLyoKKyAqIFNBLTExMDAgdXNpbmcgc3RhbmRhcmQgQVJNIExpbnV4IGtlcm5lbHMsIG9yIGNvbXBhdGlibGUuCisgKiBPZnRlbiB1c2VkIHdoZW4gdGFsa2luZyB0byBMaW51eCBQREFzIChpUGFxLCBZb3B5LCBldGMpLgorICogVGhlIHNhLTExMDAgInVzYi1ldGgiIGRyaXZlciBoYW5kbGVzIHRoZSBiYXNpYyBmcmFtaW5nLgorICoKKyAqIFBYQTI1eCBvciBQWEEyMTAgLi4uICB0aGVzZSB1c2UgYSAidXNiLWV0aCIgZHJpdmVyIG11Y2ggbGlrZQorICogdGhlIHNhMTEwMCBvbmUsIGJ1dCBoYXJkd2FyZSB1c2VzIGRpZmZlcmVudCBlbmRwb2ludCBudW1iZXJzLgorICoKKyAqIE9yIHRoZSBMaW51eCAiRXRoZXJuZXQiIGdhZGdldCBvbiBoYXJkd2FyZSB0aGF0IGNhbid0IHRhbGsKKyAqIENEQyBFdGhlcm5ldCAoZS5nLiwgbm8gYWx0c2V0dGluZ3MpLCBpbiBlaXRoZXIgb2YgdHdvIG1vZGVzOgorICogIC0gYWN0aW5nIGp1c3QgbGlrZSB0aGUgb2xkICJ1c2ItZXRoIiBmaXJtd2FyZSwgdGhvdWdoCisgKiAgICB0aGUgaW1wbGVtZW50YXRpb24gaXMgZGlmZmVyZW50CisgKiAgLSBzdXBwb3J0aW5nIFJORElTIGFzIHRoZSBmaXJzdC9kZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yCisgKiAgICBNUy1XaW5kb3dzIGludGVyb3A7IExpbnV4IG5lZWRzIHRvIHVzZSB0aGUgb3RoZXIgY29uZmlnCisgKi8KK3sKKwkvLyAxMTgzID0gMHgwNDlGLCBib3RoIHVzZWQgYXMgaGV4IHZhbHVlcz8KKwkvLyBDb21wYXEgIkl0c3kiIHZlbmRvci9wcm9kdWN0IGlkCisJVVNCX0RFVklDRSAoMHgwNDlGLCAweDUwNUEpLAkvLyB1c2ItZXRoLCBvciBjb21wYXRpYmxlCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZsaW51eGRldl9pbmZvLAorfSwgeworCVVTQl9ERVZJQ0UgKDB4MEU3RSwgMHgxMDAxKSwJLy8gRy5NYXRlICJZb3B5IgorCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmeW9weV9pbmZvLAorfSwgeworCVVTQl9ERVZJQ0UgKDB4ODA4NiwgMHgwN2QzKSwJLy8gImJsb2IiIGJvb3Rsb2FkZXIKKwkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmJsb2JfaW5mbywKK30sIHsKKwkvLyBMaW51eCBFdGhlcm5ldC9STkRJUyBnYWRnZXQgb24gcHhhMjEwLzI1eC8yNngsIHNlY29uZCBjb25maWcKKwkvLyBlLmcuIEd1bXN0aXgsIGN1cnJlbnQgT3BlblphdXJ1cywgLi4uCisJVVNCX0RFVklDRV9WRVIgKDB4MDUyNSwgMHhhNGEyLCAweDAyMDMsIDB4MDIwMyksCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZsaW51eGRldl9pbmZvLAorfSwKKyNlbmRpZgorCisJeyB9LAkJLy8gRU5ECit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHByb2R1Y3RzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGNkY19zdWJzZXRfZHJpdmVyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJjZGNfc3Vic2V0IiwKKwkucHJvYmUgPQl1c2JuZXRfcHJvYmUsCisJLnN1c3BlbmQgPQl1c2JuZXRfc3VzcGVuZCwKKwkucmVzdW1lID0JdXNibmV0X3Jlc3VtZSwKKwkuZGlzY29ubmVjdCA9CXVzYm5ldF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CXByb2R1Y3RzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY2RjX3N1YnNldF9pbml0KHZvaWQpCit7CisgCXJldHVybiB1c2JfcmVnaXN0ZXIoJmNkY19zdWJzZXRfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGNkY19zdWJzZXRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjZGNfc3Vic2V0X2V4aXQodm9pZCkKK3sKKyAJdXNiX2RlcmVnaXN0ZXIoJmNkY19zdWJzZXRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGNkY19zdWJzZXRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEJyb3duZWxsIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpbXBsZSAnQ0RDIFN1YnNldCcgVVNCIG5ldHdvcmtpbmcgbGlua3MiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9nbDYyMGEuYyBiL2RyaXZlcnMvdXNiL25ldC9nbDYyMGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODc2M2FlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbmV0L2dsNjIwYS5jCkBAIC0wLDAgKzEsNDA3IEBACisvKgorICogR2VuZVN5cyBHTDYyMFVTQi1BIGJhc2VkIGxpbmtzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgSml1bi1KaWUgSHVhbmcgPGh1YW5nampAZ2VuZXN5c2xvZ2ljLmNvbS50dz4KKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBTdGFuaXNsYXYgQnJhYmVjIDx1dHhAcGVuZ3Vpbi5jej4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLy8gI2RlZmluZQlERUJVRwkJCS8vIGVycm9yIHBhdGggbWVzc2FnZXMsIGV4dHJhIGluZm8KKy8vICNkZWZpbmUJVkVSQk9TRQkJCS8vIG1vcmU7IHN1Y2Nlc3MgbWVzc2FnZXMKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmCUNPTkZJR19VU0JfREVCVUcKKyMgICBkZWZpbmUgREVCVUcKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAidXNibmV0LmgiCisKKworLyoKKyAqIEdlbmVTeXMgR0w2MjBVU0ItQSAod3d3LmdlbmVzeXNsb2dpYy5jb20udHcpCisgKgorICogLi4uIHNob3VsZCBwYXJ0aWFsbHkgaW50ZXJvcCB3aXRoIHRoZSBXaW4zMiBkcml2ZXIgZm9yIHRoaXMgaGFyZHdhcmUuCisgKiBUaGUgR2VuZVN5cyBkb2NzIGltcGx5IHRoZXJlJ3Mgc29tZSBORElTIGlzc3VlIG1vdGl2YXRpbmcgdGhpcyBmcmFtaW5nLgorICoKKyAqIFNvbWUgaW5mbyBmcm9tIEdlbmVTeXM6CisgKiAgLSBHTDYyMFVTQi1BIGlzIGZ1bGwgZHVwbGV4OyBHTDYyMFVTQiBpcyBvbmx5IGhhbGYgZHVwbGV4IGZvciBidWxrLgorICogICAgKFNvbWUgY2FibGVzLCBsaWtlIHRoZSBCQUZPLTEwMGMsIHVzZSB0aGUgaGFsZiBkdXBsZXggdmVyc2lvbi4pCisgKiAgLSBGb3IgdGhlIGZ1bGwgZHVwbGV4IG1vZGVsLCB0aGUgbG93IGJpdCBvZiB0aGUgdmVyc2lvbiBjb2RlIHNheXMKKyAqICAgIHdoaWNoIHNpZGUgaXMgd2hpY2ggKCJsZWZ0L3JpZ2h0IikuCisgKiAgLSBGb3IgdGhlIGhhbGYgZHVwbGV4IHR5cGUsIGEgY29udHJvbC9pbnRlcnJ1cHQgaGFuZHNoYWtlIHNldHRsZXMKKyAqICAgIHRoZSB0cmFuc2ZlciBkaXJlY3Rpb24uICAoVGhhdCdzIGRpc2FibGVkIGhlcmUsIHBhcnRpYWxseSBjb2RlZC4pCisgKiAgICBBIGNvbnRyb2wgVVJCIHdvdWxkIGJsb2NrIHVudGlsIG90aGVyIHNpZGUgd3JpdGVzIGFuIGludGVycnVwdC4KKyAqCisgKiBPcmlnaW5hbCBjb2RlIGZyb20gSml1bi1KaWUgSHVhbmcgPGh1YW5nampAZ2VuZXN5c2xvZ2ljLmNvbS50dz4KKyAqIGFuZCBtZXJnZWQgaW50byAidXNibmV0IiBieSBTdGFuaXNsYXYgQnJhYmVjIDx1dHhAcGVuZ3Vpbi5jej4uCisgKi8KKworLy8gY29udHJvbCBtc2cgd3JpdGUgY29tbWFuZAorI2RlZmluZSBHRU5FTElOS19DT05ORUNUX1dSSVRFCQkJMHhGMAorLy8gaW50ZXJydXB0IHBpcGUgaW5kZXgKKyNkZWZpbmUgR0VORUxJTktfSU5URVJSVVBUX1BJUEUJCQkweDAzCisvLyBpbnRlcnJ1cHQgcmVhZCBidWZmZXIgc2l6ZQorI2RlZmluZSBJTlRFUlJVUFRfQlVGU0laRQkJCTB4MDgKKy8vIGludGVycnVwdCBwaXBlIGludGVydmFsIHZhbHVlCisjZGVmaW5lIEdFTkVMSU5LX0lOVEVSUlVQVF9JTlRFUlZBTAkJMHgxMAorLy8gbWF4IHRyYW5zbWl0IHBhY2tldCBudW1iZXIgcGVyIHRyYW5zbWl0CisjZGVmaW5lIEdMX01BWF9UUkFOU01JVF9QQUNLRVRTCQkJMzIKKy8vIG1heCBwYWNrZXQgbGVuZ3RoCisjZGVmaW5lIEdMX01BWF9QQUNLRVRfTEVOCQkJMTUxNAorLy8gbWF4IHJlY2VpdmUgYnVmZmVyIHNpemUKKyNkZWZpbmUgR0xfUkNWX0JVRl9TSVpFCQlcCisJKCgoR0xfTUFYX1BBQ0tFVF9MRU4gKyA0KSAqIEdMX01BWF9UUkFOU01JVF9QQUNLRVRTKSArIDQpCisKK3N0cnVjdCBnbF9wYWNrZXQgeworCXUzMgkJcGFja2V0X2xlbmd0aDsKKwljaGFyCQlwYWNrZXRfZGF0YSBbMV07Cit9OworCitzdHJ1Y3QgZ2xfaGVhZGVyIHsKKwl1MzIJCQlwYWNrZXRfY291bnQ7CisJc3RydWN0IGdsX3BhY2tldAlwYWNrZXRzOworfTsKKworI2lmZGVmCUdFTkVMSU5LX0FDSworCisvLyBGSVhNRTogIHRoaXMgY29kZSBpcyBpbmNvbXBsZXRlLCBub3QgZGVidWdnZWQ7IGl0IGRvZXNuJ3QKKy8vIGhhbmRsZSBpbnRlcnJ1cHRzIGNvcnJlY3RseTsgaXQgc2hvdWxkIHVzZSB0aGUgZ2VuZXJpYworLy8gc3RhdHVzIElSUSBjb2RlICh3aGljaCBkaWRuJ3QgZXhpc3QgYmFjayBpbiAyMDAxKS4KKworc3RydWN0IGdsX3ByaXYgeworCXN0cnVjdCB1cmIJKmlycV91cmI7CisJY2hhcgkJaXJxX2J1ZiBbSU5URVJSVVBUX0JVRlNJWkVdOworfTsKKworc3RhdGljIGlubGluZSBpbnQgZ2xfY29udHJvbF93cml0ZShzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKGRldi0+dWRldiwKKwkJICAgICAgdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCksCisJCSAgICAgIHJlcXVlc3QsCisJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkgICAgICB2YWx1ZSwKKwkJICAgICAgMCwJCQkvLyBpbmRleAorCQkgICAgICAwLAkJCS8vIGRhdGEgYnVmZmVyCisJCSAgICAgIDAsCQkJLy8gc2l6ZQorCQkgICAgICBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgZ2xfaW50ZXJydXB0X2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLworCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKKwkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCisJCQkJX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJfQorCisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3RhdHVzKQorCQllcnIoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKKwkJICAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgZ2xfaW50ZXJydXB0X3JlYWQoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXN0cnVjdCBnbF9wcml2CSpwcml2ID0gZGV2LT5wcml2X2RhdGE7CisJaW50CQlyZXR2YWw7CisKKwkvLyBpc3N1ZSB1c2IgaW50ZXJydXB0IHJlYWQKKwlpZiAocHJpdiAmJiBwcml2LT5pcnFfdXJiKSB7CisJCS8vIHN1Ym1pdCB1cmIKKwkJaWYgKChyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihwcml2LT5pcnFfdXJiLCBHRlBfS0VSTkVMKSkgIT0gMCkKKwkJCWRiZygiZ2xfaW50ZXJydXB0X3JlYWQ6IHN1Ym1pdCBmYWlsIC0gJVguLi4iLCByZXR2YWwpOworCQllbHNlCisJCQlkYmcoImdsX2ludGVycnVwdF9yZWFkOiBzdWJtaXQgc3VjY2Vzcy4uLiIpOworCX0KKworCXJldHVybiAwOworfQorCisvLyBjaGVjayB3aGV0aGVyIGFub3RoZXIgc2lkZSBpcyBjb25uZWN0ZWQKK3N0YXRpYyBpbnQgZ2VuZWxpbmtfY2hlY2tfY29ubmVjdChzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJaW50CQkJcmV0dmFsOworCisJZGJnKCJnZW5lbGlua19jaGVja19jb25uZWN0Li4uIik7CisKKwkvLyBkZXRlY3Qgd2hldGhlciBhbm90aGVyIHNpZGUgaXMgY29ubmVjdGVkCisJaWYgKChyZXR2YWwgPSBnbF9jb250cm9sX3dyaXRlKGRldiwgR0VORUxJTktfQ09OTkVDVF9XUklURSwgMCkpICE9IDApIHsKKwkJZGJnKCIlczogZ2VuZWxpbmtfY2hlY2tfY29ubmVjdCB3cml0ZSBmYWlsIC0gJVgiLAorCQkJZGV2LT5uZXQtPm5hbWUsIHJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLy8gdXNiIGludGVycnVwdCByZWFkIHRvIGFjayBhbm90aGVyIHNpZGUKKwlpZiAoKHJldHZhbCA9IGdsX2ludGVycnVwdF9yZWFkKGRldikpICE9IDApIHsKKwkJZGJnKCIlczogZ2VuZWxpbmtfY2hlY2tfY29ubmVjdCByZWFkIGZhaWwgLSAlWCIsCisJCQlkZXYtPm5ldC0+bmFtZSwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlkYmcoIiVzOiBnZW5lbGlua19jaGVja19jb25uZWN0IHJlYWQgc3VjY2VzcyIsIGRldi0+bmV0LT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworLy8gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHByaXZhdGUgZGF0YSBmb3IgZ2VuZWxpbmsKK3N0YXRpYyBpbnQgZ2VuZWxpbmtfaW5pdChzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJc3RydWN0IGdsX3ByaXYgKnByaXY7CisKKwkvLyBhbGxvY2F0ZSB0aGUgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorCWlmICgocHJpdiA9IGttYWxsb2Moc2l6ZW9mICpwcml2LCBHRlBfS0VSTkVMKSkgPT0gMCkgeworCQlkYmcoIiVzOiBjYW5ub3QgYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIHBlciBkZXZpY2UiLAorCQkJZGV2LT5uZXQtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvLyBhbGxvY2F0ZSBpcnEgdXJiCisJaWYgKChwcml2LT5pcnFfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkgPT0gMCkgeworCQlkYmcoIiVzOiBjYW5ub3QgYWxsb2NhdGUgcHJpdmF0ZSBpcnEgdXJiIHBlciBkZXZpY2UiLAorCQkJZGV2LT5uZXQtPm5hbWUpOworCQlrZnJlZShwcml2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLy8gZmlsbCBpcnEgdXJiCisJdXNiX2ZpbGxfaW50X3VyYihwcml2LT5pcnFfdXJiLCBkZXYtPnVkZXYsCisJCXVzYl9yY3ZpbnRwaXBlKGRldi0+dWRldiwgR0VORUxJTktfSU5URVJSVVBUX1BJUEUpLAorCQlwcml2LT5pcnFfYnVmLCBJTlRFUlJVUFRfQlVGU0laRSwKKwkJZ2xfaW50ZXJydXB0X2NvbXBsZXRlLCAwLAorCQlHRU5FTElOS19JTlRFUlJVUFRfSU5URVJWQUwpOworCisJLy8gc2V0IHByaXZhdGUgZGF0YSBwb2ludGVyCisJZGV2LT5wcml2X2RhdGEgPSBwcml2OworCisJcmV0dXJuIDA7Cit9CisKKy8vIHJlbGVhc2UgdGhlIHByaXZhdGUgZGF0YQorc3RhdGljIGludCBnZW5lbGlua19mcmVlKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlzdHJ1Y3QgZ2xfcHJpdgkqcHJpdiA9IGRldi0+cHJpdl9kYXRhOworCisJaWYgKCFwcml2KQorCQlyZXR1cm4gMDsKKworLy8gRklYTUU6ICBjYW4ndCBjYW5jZWwgaGVyZTsgaXQncyBzeW5jaHJvbm91cywgYW5kCisvLyBzaG91bGQgaGF2ZSBoYXBwZW5lZCBlYXJsaWVyIGluIGFueSBjYXNlIChpbnRlcnJ1cHQKKy8vIGhhbmRsaW5nIG5lZWRzIHRvIGJlIGdlbmVyaWMpCisKKwkvLyBjYW5jZWwgaXJxIHVyYiBmaXJzdAorCXVzYl9raWxsX3VyYihwcml2LT5pcnFfdXJiKTsKKworCS8vIGZyZWUgaXJxIHVyYgorCXVzYl9mcmVlX3VyYihwcml2LT5pcnFfdXJiKTsKKworCS8vIGZyZWUgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKwlrZnJlZShwcml2KTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBnZW5lbGlua19yeF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGdsX2hlYWRlcgkqaGVhZGVyOworCXN0cnVjdCBnbF9wYWNrZXQJKnBhY2tldDsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKmdsX3NrYjsKKwl1MzIJCQlzaXplOworCisJaGVhZGVyID0gKHN0cnVjdCBnbF9oZWFkZXIgKikgc2tiLT5kYXRhOworCisJLy8gZ2V0IHRoZSBwYWNrZXQgY291bnQgb2YgdGhlIHJlY2VpdmVkIHNrYgorCWxlMzJfdG9fY3B1cygmaGVhZGVyLT5wYWNrZXRfY291bnQpOworCWlmICgoaGVhZGVyLT5wYWNrZXRfY291bnQgPiBHTF9NQVhfVFJBTlNNSVRfUEFDS0VUUykKKwkJCXx8IChoZWFkZXItPnBhY2tldF9jb3VudCA8IDApKSB7CisJCWRiZygiZ2VuZWxpbms6IGludmFsaWQgcmVjZWl2ZWQgcGFja2V0IGNvdW50ICVkIiwKKwkJCWhlYWRlci0+cGFja2V0X2NvdW50KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLy8gc2V0IHRoZSBjdXJyZW50IHBhY2tldCBwb2ludGVyIHRvIHRoZSBmaXJzdCBwYWNrZXQKKwlwYWNrZXQgPSAmaGVhZGVyLT5wYWNrZXRzOworCisJLy8gZGVjcmVtZW50IHRoZSBsZW5ndGggZm9yIHRoZSBwYWNrZXQgY291bnQgc2l6ZSA0IGJ5dGVzCisJc2tiX3B1bGwoc2tiLCA0KTsKKworCXdoaWxlIChoZWFkZXItPnBhY2tldF9jb3VudCA+IDEpIHsKKwkJLy8gZ2V0IHRoZSBwYWNrZXQgbGVuZ3RoCisJCXNpemUgPSBsZTMyX3RvX2NwdShwYWNrZXQtPnBhY2tldF9sZW5ndGgpOworCisJCS8vIHRoaXMgbWF5IGJlIGEgYnJva2VuIHBhY2tldAorCQlpZiAoc2l6ZSA+IEdMX01BWF9QQUNLRVRfTEVOKSB7CisJCQlkYmcoImdlbmVsaW5rOiBpbnZhbGlkIHJ4IGxlbmd0aCAlZCIsIHNpemUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvLyBhbGxvY2F0ZSB0aGUgc2tiIGZvciB0aGUgaW5kaXZpZHVhbCBwYWNrZXQKKwkJZ2xfc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9BVE9NSUMpOworCQlpZiAoZ2xfc2tiKSB7CisKKwkJCS8vIGNvcHkgdGhlIHBhY2tldCBkYXRhIHRvIHRoZSBuZXcgc2tiCisJCQltZW1jcHkoc2tiX3B1dChnbF9za2IsIHNpemUpLAorCQkJCQlwYWNrZXQtPnBhY2tldF9kYXRhLCBzaXplKTsKKwkJCXVzYm5ldF9za2JfcmV0dXJuKGRldiwgZ2xfc2tiKTsKKwkJfQorCisJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgcGFja2V0CisJCXBhY2tldCA9IChzdHJ1Y3QgZ2xfcGFja2V0ICopCisJCQkmcGFja2V0LT5wYWNrZXRfZGF0YSBbc2l6ZV07CisJCWhlYWRlci0+cGFja2V0X2NvdW50LS07CisKKwkJLy8gc2hpZnQgdGhlIGRhdGEgcG9pbnRlciB0byB0aGUgbmV4dCBnbF9wYWNrZXQKKwkJc2tiX3B1bGwoc2tiLCBzaXplICsgNCk7CisJfQorCisJLy8gc2tpcCB0aGUgcGFja2V0IGxlbmd0aCBmaWVsZCA0IGJ5dGVzCisJc2tiX3B1bGwoc2tiLCA0KTsKKworCWlmIChza2ItPmxlbiA+IEdMX01BWF9QQUNLRVRfTEVOKSB7CisJCWRiZygiZ2VuZWxpbms6IGludmFsaWQgcnggbGVuZ3RoICVkIiwgc2tiLT5sZW4pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitnZW5lbGlua190eF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGZsYWdzKQoreworCWludCAJcGFkbGVuOworCWludAlsZW5ndGggPSBza2ItPmxlbjsKKwlpbnQJaGVhZHJvb20gPSBza2JfaGVhZHJvb20oc2tiKTsKKwlpbnQJdGFpbHJvb20gPSBza2JfdGFpbHJvb20oc2tiKTsKKwl1MzIJKnBhY2tldF9jb3VudDsKKwl1MzIJKnBhY2tldF9sZW47CisKKwkvLyBGSVhNRTogIG1hZ2ljIG51bWJlcnMsIGJsZWVjaAorCXBhZGxlbiA9ICgoc2tiLT5sZW4gKyAoNCArIDQqMSkpICUgNjQpID8gMCA6IDE7CisKKwlpZiAoKCFza2JfY2xvbmVkKHNrYikpCisJCQkmJiAoKGhlYWRyb29tICsgdGFpbHJvb20pID49IChwYWRsZW4gKyAoNCArIDQqMSkpKSkgeworCQlpZiAoKGhlYWRyb29tIDwgKDQgKyA0KjEpKSB8fCAodGFpbHJvb20gPCBwYWRsZW4pKSB7CisJCQlza2ItPmRhdGEgPSBtZW1tb3ZlKHNrYi0+aGVhZCArICg0ICsgNCoxKSwKKwkJCQkJICAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IHNrX2J1ZmYJKnNrYjI7CisJCXNrYjIgPSBza2JfY29weV9leHBhbmQoc2tiLCAoNCArIDQqMSkgLCBwYWRsZW4sIGZsYWdzKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJc2tiID0gc2tiMjsKKwkJaWYgKCFza2IpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBhdHRhY2ggdGhlIHBhY2tldCBjb3VudCB0byB0aGUgaGVhZGVyCisJcGFja2V0X2NvdW50ID0gKHUzMiAqKSBza2JfcHVzaChza2IsICg0ICsgNCoxKSk7CisJcGFja2V0X2xlbiA9IHBhY2tldF9jb3VudCArIDE7CisKKwkqcGFja2V0X2NvdW50ID0gY3B1X3RvX2xlMzIoMSk7CisJKnBhY2tldF9sZW4gPSBjcHVfdG9fbGUzMihsZW5ndGgpOworCisJLy8gYWRkIHBhZGRpbmcgYnl0ZQorCWlmICgoc2tiLT5sZW4gJSBkZXYtPm1heHBhY2tldCkgPT0gMCkKKwkJc2tiX3B1dChza2IsIDEpOworCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludCBnZW5lbGlua19iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJZGV2LT5oYXJkX210dSA9IEdMX1JDVl9CVUZfU0laRTsKKwlkZXYtPm5ldC0+aGFyZF9oZWFkZXJfbGVuICs9IDQ7CisJZGV2LT5pbiA9IHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+ZHJpdmVyX2luZm8tPmluKTsKKwlkZXYtPm91dCA9IHVzYl9zbmRidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+ZHJpdmVyX2luZm8tPm91dCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JZ2VuZWxpbmtfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiR2VuZXN5cyBHZW5lTGluayIsCisJLmZsYWdzID0JRkxBR19GUkFNSU5HX0dMIHwgRkxBR19OT19TRVRJTlQsCisJLmJpbmQgPQkJZ2VuZWxpbmtfYmluZCwKKwkucnhfZml4dXAgPQlnZW5lbGlua19yeF9maXh1cCwKKwkudHhfZml4dXAgPQlnZW5lbGlua190eF9maXh1cCwKKworCS5pbiA9IDEsIC5vdXQgPSAyLAorCisjaWZkZWYJR0VORUxJTktfQUNLCisJLmNoZWNrX2Nvbm5lY3QgPWdlbmVsaW5rX2NoZWNrX2Nvbm5lY3QsCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZAlwcm9kdWN0cyBbXSA9IHsKKworeworCVVTQl9ERVZJQ0UoMHgwNWUzLCAweDA1MDIpLAkvLyBHTDYyMFVTQi1BCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZnZW5lbGlua19pbmZvLAorfSwKKwkvKiBOT1Q6IFVTQl9ERVZJQ0UoMHgwNWUzLCAweDA1MDEpLAkvLyBHTDYyMFVTQgorCSAqIHRoYXQncyBoYWxmIGR1cGxleCwgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKi8KKwl7IH0sCQkvLyBFTkQKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcHJvZHVjdHMpOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZ2w2MjBhX2RyaXZlciA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkiZ2w2MjBhIiwKKwkuaWRfdGFibGUgPQlwcm9kdWN0cywKKwkucHJvYmUgPQl1c2JuZXRfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQl1c2JuZXRfZGlzY29ubmVjdCwKKwkuc3VzcGVuZCA9CXVzYm5ldF9zdXNwZW5kLAorCS5yZXN1bWUgPQl1c2JuZXRfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdXNibmV0X2luaXQodm9pZCkKK3sKKyAJcmV0dXJuIHVzYl9yZWdpc3RlcigmZ2w2MjBhX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdCh1c2JuZXRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2JuZXRfZXhpdCh2b2lkKQoreworIAl1c2JfZGVyZWdpc3RlcigmZ2w2MjBhX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh1c2JuZXRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkppdW4tSmllIEh1YW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdMNjIwLVVTQi1BIEhvc3QtdG8tSG9zdCBMaW5rIGNhYmxlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMgYi9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMKaW5kZXggN2ZmYTk5Yi4uZTA0YjBjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L2thd2V0aC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9rYXdldGguYwpAQCAtNzg3LDcgKzc4Nyw2IEBACiAJCSAgICAgIGthd2V0aF91c2JfdHJhbnNtaXRfY29tcGxldGUsCiAJCSAgICAgIGthd2V0aCk7CiAJa2F3ZXRoLT5lbmQgPSAwOwotCWthd2V0aC0+dHhfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOwogCiAJaWYoKHJlcyA9IHVzYl9zdWJtaXRfdXJiKGthd2V0aC0+dHhfdXJiLCBHRlBfQVRPTUlDKSkpCiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L25ldDEwODAuYyBiL2RyaXZlcnMvdXNiL25ldC9uZXQxMDgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzMDljNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL25ldC9uZXQxMDgwLmMKQEAgLTAsMCArMSw2MjIgQEAKKy8qCisgKiBOZXQxMDgwIGJhc2VkIFVTQiBob3N0LXRvLWhvc3QgY2FibGVzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBieSBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvLyAjZGVmaW5lCURFQlVHCQkJLy8gZXJyb3IgcGF0aCBtZXNzYWdlcywgZXh0cmEgaW5mbworLy8gI2RlZmluZQlWRVJCT1NFCQkJLy8gbW9yZTsgc3VjY2VzcyBtZXNzYWdlcworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaWZkZWYJQ09ORklHX1VTQl9ERUJVRworIyAgIGRlZmluZSBERUJVRworI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlICJ1c2JuZXQuaCIKKworCisvKgorICogTmV0Y2hpcCAxMDgwIGRyaXZlciAuLi4gaHR0cDovL3d3dy5uZXRjaGlwLmNvbQorICogKFNlcHQgMjAwNDogIEVuZC1vZi1saWZlIGFubm91bmNlbWVudCBoYXMgYmVlbiBzZW50LikKKyAqIFVzZWQgaW4gKHNvbWUpIExhcExpbmsgY2FibGVzCisgKi8KKworI2RlZmluZSBmcmFtZV9lcnJvcnMJZGF0YVsxXQorCisvKgorICogTmV0Q2hpcCBmcmFtaW5nIG9mIGV0aGVybmV0IHBhY2tldHMsIHN1cHBvcnRpbmcgYWRkaXRpb25hbCBlcnJvcgorICogY2hlY2tzIGZvciBsaW5rcyB0aGF0IG1heSBkcm9wIGJ1bGsgcGFja2V0cyBmcm9tIGluc2lkZSBtZXNzYWdlcy4KKyAqIE9kZCBVU0IgbGVuZ3RoID09IGFsd2F5cyBzaG9ydCByZWFkIGZvciBsYXN0IHVzYiBwYWNrZXQuCisgKgktIG5jX2hlYWRlcgorICoJLSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKQorICoJLSBwYXlsb2FkCisgKgktIChvcHRpb25hbCBwYWRkaW5nIGJ5dGUsIGlmIG5lZWRlZCBzbyBsZW5ndGggYmVjb21lcyBvZGQpCisgKgktIG5jX3RyYWlsZXIKKyAqCisgKiBUaGlzIGZyYW1pbmcgaXMgdG8gYmUgYXZvaWRlZCBmb3Igbm9uLU5ldENoaXAgZGV2aWNlcy4KKyAqLworCitzdHJ1Y3QgbmNfaGVhZGVyIHsJCS8vIHBhY2tlZDoKKwlfX2xlMTYJaGRyX2xlbjsJCS8vIHNpemVvZiBuY19oZWFkZXIgKExFLCBhbGwpCisJX19sZTE2CXBhY2tldF9sZW47CQkvLyBwYXlsb2FkIHNpemUgKGluY2x1ZGluZyBldGhoZHIpCisJX19sZTE2CXBhY2tldF9pZDsJCS8vIGRldGVjdHMgZHJvcHBlZCBwYWNrZXRzCisjZGVmaW5lIE1JTl9IRUFERVIJNgorCisJLy8gYWxsIGVsc2UgaXMgb3B0aW9uYWwsIGFuZCBtdXN0IHN0YXJ0IHdpdGg6CisJLy8gX19sZTE2CXZlbmRvcklkOwkvLyBmcm9tIHVzYi1pZgorCS8vIF9fbGUxNglwcm9kdWN0SWQ7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZQlQQURfQllURQkoKHVuc2lnbmVkIGNoYXIpMHhBQykKKworc3RydWN0IG5jX3RyYWlsZXIgeworCV9fbGUxNglwYWNrZXRfaWQ7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLy8gcGFja2V0cyBtYXkgdXNlIEZMQUdfRlJBTUlOR19OQyBhbmQgb3B0aW9uYWwgcGFkCisjZGVmaW5lIEZSQU1FRF9TSVpFKG10dSkgKHNpemVvZiAoc3RydWN0IG5jX2hlYWRlcikgXAorCQkJCSsgc2l6ZW9mIChzdHJ1Y3QgZXRoaGRyKSBcCisJCQkJKyAobXR1KSBcCisJCQkJKyAxIFwKKwkJCQkrIHNpemVvZiAoc3RydWN0IG5jX3RyYWlsZXIpKQorCisjZGVmaW5lIE1JTl9GUkFNRUQJRlJBTUVEX1NJWkUoMCkKKworLyogcGFja2V0cyBfY291bGRfIGJlIHVwIHRvIDY0S0IuLi4gKi8KKyNkZWZpbmUgTkNfTUFYX1BBQ0tFVAkzMjc2NworCisKKy8qCisgKiBaZXJvIG1lYW5zIG5vIHRpbWVvdXQ7IGVsc2UsIGhvdyBsb25nIGEgNjQgYnl0ZSBidWxrIHBhY2tldCBtYXkgYmUgcXVldWVkCisgKiBiZWZvcmUgdGhlIGhhcmR3YXJlIGRyb3BzIGl0LiAgSWYgdGhhdCdzIGRvbmUsIHRoZSBkcml2ZXIgd2lsbCBuZWVkIHRvCisgKiBmcmFtZSBuZXR3b3JrIHBhY2tldHMgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgZHJvcHBlZCBVU0IgcGFja2V0cy4gIFRoZSB3aW4zMgorICogZHJpdmVyIHNldHMgdGhpcyBmb3IgYm90aCBzaWRlcyBvZiB0aGUgbGluay4KKyAqLworI2RlZmluZQlOQ19SRUFEX1RUTF9NUwkoKHU4KTI1NSkJLy8gbXMKKworLyoKKyAqIFdlIGlnbm9yZSBtb3N0IHJlZ2lzdGVycyBhbmQgRUVQUk9NIGNvbnRlbnRzLgorICovCisjZGVmaW5lCVJFR19VU0JDVEwJKCh1OCkweDA0KQorI2RlZmluZSBSRUdfVFRMCQkoKHU4KTB4MTApCisjZGVmaW5lIFJFR19TVEFUVVMJKCh1OCkweDExKQorCisvKgorICogVmVuZG9yIHNwZWNpZmljIHJlcXVlc3RzIHRvIHJlYWQvd3JpdGUgZGF0YQorICovCisjZGVmaW5lCVJFUVVFU1RfUkVHSVNURVIJKCh1OCkweDEwKQorI2RlZmluZQlSRVFVRVNUX0VFUFJPTQkJKCh1OCkweDExKQorCitzdGF0aWMgaW50CituY192ZW5kb3JfcmVhZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlcSwgdTggcmVnbnVtLCB1MTYgKnJldHZhbF9wdHIpCit7CisJaW50IHN0YXR1cyA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsCisJCXVzYl9yY3ZjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQlyZXEsCisJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkwLCByZWdudW0sCisJCXJldHZhbF9wdHIsIHNpemVvZiAqcmV0dmFsX3B0ciwKKwkJVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCWlmIChzdGF0dXMgPiAwKQorCQlzdGF0dXMgPSAwOworCWlmICghc3RhdHVzKQorCQlsZTE2X3RvX2NwdXMocmV0dmFsX3B0cik7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25jX3JlZ2lzdGVyX3JlYWQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCByZWdudW0sIHUxNiAqcmV0dmFsX3B0cikKK3sKKwlyZXR1cm4gbmNfdmVuZG9yX3JlYWQoZGV2LCBSRVFVRVNUX1JFR0lTVEVSLCByZWdudW0sIHJldHZhbF9wdHIpOworfQorCisvLyBubyByZXR2YWwgLi4uIGNhbiBiZWNvbWUgYXN5bmMsIHVzYWJsZSBpbl9pbnRlcnJ1cHQoKQorc3RhdGljIHZvaWQKK25jX3ZlbmRvcl93cml0ZShzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlcSwgdTggcmVnbnVtLCB1MTYgdmFsdWUpCit7CisJdXNiX2NvbnRyb2xfbXNnKGRldi0+dWRldiwKKwkJdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCksCisJCXJlcSwKKwkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQl2YWx1ZSwgcmVnbnVtLAorCQlOVUxMLCAwLAkJCS8vIGRhdGEgaXMgaW4gc2V0dXAgcGFja2V0CisJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCituY19yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlZ251bSwgdTE2IHZhbHVlKQoreworCW5jX3ZlbmRvcl93cml0ZShkZXYsIFJFUVVFU1RfUkVHSVNURVIsIHJlZ251bSwgdmFsdWUpOworfQorCisKKyNpZiAwCitzdGF0aWMgdm9pZCBuY19kdW1wX3JlZ2lzdGVycyhzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJdTgJcmVnOworCXUxNgkqdnAgPSBrbWFsbG9jKHNpemVvZiAodTE2KSk7CisKKwlpZiAoIXZwKSB7CisJCWRiZygibm8gbWVtb3J5PyIpOworCQlyZXR1cm47CisJfQorCisJZGJnKCIlcyByZWdpc3RlcnM6IiwgZGV2LT5uZXQtPm5hbWUpOworCWZvciAocmVnID0gMDsgcmVnIDwgMHgyMDsgcmVnKyspIHsKKwkJaW50IHJldHZhbDsKKworCQkvLyByZWFkaW5nIHNvbWUgcmVnaXN0ZXJzIGlzIHRyb3VibGUKKwkJaWYgKHJlZyA+PSAweDA4ICYmIHJlZyA8PSAweGYpCisJCQljb250aW51ZTsKKwkJaWYgKHJlZyA+PSAweDEyICYmIHJlZyA8PSAweDFlKQorCQkJY29udGludWU7CisKKwkJcmV0dmFsID0gbmNfcmVnaXN0ZXJfcmVhZChkZXYsIHJlZywgdnApOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWRiZygiJXMgcmVnIFsweCV4XSA9PT4gZXJyb3IgJWQiLAorCQkJCWRldi0+bmV0LT5uYW1lLCByZWcsIHJldHZhbCk7CisJCWVsc2UKKwkJCWRiZygiJXMgcmVnIFsweCV4XSA9IDB4JXgiLAorCQkJCWRldi0+bmV0LT5uYW1lLCByZWcsICp2cCk7CisJfQorCWtmcmVlKHZwKTsKK30KKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBDb250cm9sIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZQlVU0JDVExfV1JJVEFCTEVfTUFTSwkweDFmMGYKKy8vIGJpdHMgMTUtMTMgcmVzZXJ2ZWQsIHIvbworI2RlZmluZQlVU0JDVExfRU5BQkxFX0xBTkcJKDEgPDwgMTIpCisjZGVmaW5lCVVTQkNUTF9FTkFCTEVfTUZHUgkoMSA8PCAxMSkKKyNkZWZpbmUJVVNCQ1RMX0VOQUJMRV9QUk9ECSgxIDw8IDEwKQorI2RlZmluZQlVU0JDVExfRU5BQkxFX1NFUklBTAkoMSA8PCA5KQorI2RlZmluZQlVU0JDVExfRU5BQkxFX0RFRkFVTFRTCSgxIDw8IDgpCisvLyBiaXRzIDctNCByZXNlcnZlZCwgci9vCisjZGVmaW5lCVVTQkNUTF9GTFVTSF9PVEhFUgkoMSA8PCAzKQorI2RlZmluZQlVU0JDVExfRkxVU0hfVEhJUwkoMSA8PCAyKQorI2RlZmluZQlVU0JDVExfRElTQ09OTl9PVEhFUgkoMSA8PCAxKQorI2RlZmluZQlVU0JDVExfRElTQ09OTl9USElTCSgxIDw8IDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuY19kdW1wX3VzYmN0bChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiB1c2JjdGwpCit7CisJaWYgKCFuZXRpZl9tc2dfbGluayhkZXYpKQorCQlyZXR1cm47CisJZGV2ZGJnKGRldiwgIm5ldDEwODAgJXMtJXMgdXNiY3RsIDB4JXg6JXMlcyVzJXMlczsiCisJCQkiIHRoaXMlcyVzOyIKKwkJCSIgb3RoZXIlcyVzOyByL28gMHgleCIsCisJCWRldi0+dWRldi0+YnVzLT5idXNfbmFtZSwgZGV2LT51ZGV2LT5kZXZwYXRoLAorCQl1c2JjdGwsCisJCSh1c2JjdGwgJiBVU0JDVExfRU5BQkxFX0xBTkcpID8gIiBsYW5nIiA6ICIiLAorCQkodXNiY3RsICYgVVNCQ1RMX0VOQUJMRV9NRkdSKSA/ICIgbWZnciIgOiAiIiwKKwkJKHVzYmN0bCAmIFVTQkNUTF9FTkFCTEVfUFJPRCkgPyAiIHByb2QiIDogIiIsCisJCSh1c2JjdGwgJiBVU0JDVExfRU5BQkxFX1NFUklBTCkgPyAiIHNlcmlhbCIgOiAiIiwKKwkJKHVzYmN0bCAmIFVTQkNUTF9FTkFCTEVfREVGQVVMVFMpID8gIiBkZWZhdWx0cyIgOiAiIiwKKworCQkodXNiY3RsICYgVVNCQ1RMX0ZMVVNIX09USEVSKSA/ICIgRkxVU0giIDogIiIsCisJCSh1c2JjdGwgJiBVU0JDVExfRElTQ09OTl9PVEhFUikgPyAiIERJUyIgOiAiIiwKKwkJKHVzYmN0bCAmIFVTQkNUTF9GTFVTSF9USElTKSA/ICIgRkxVU0giIDogIiIsCisJCSh1c2JjdGwgJiBVU0JDVExfRElTQ09OTl9USElTKSA/ICIgRElTIiA6ICIiLAorCQl1c2JjdGwgJiB+VVNCQ1RMX1dSSVRBQkxFX01BU0sKKwkJKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFN0YXR1cyByZWdpc3RlcgorICovCisKKyNkZWZpbmUJU1RBVFVTX1BPUlRfQQkJKDEgPDwgMTUpCisKKyNkZWZpbmUJU1RBVFVTX0NPTk5fT1RIRVIJKDEgPDwgMTQpCisjZGVmaW5lCVNUQVRVU19TVVNQRU5EX09USEVSCSgxIDw8IDEzKQorI2RlZmluZQlTVEFUVVNfTUFJTEJPWF9PVEhFUgkoMSA8PCAxMikKKyNkZWZpbmUJU1RBVFVTX1BBQ0tFVFNfT1RIRVIobikJKCgobikgPj4gOCkgJiYgMHgwMykKKworI2RlZmluZQlTVEFUVVNfQ09OTl9USElTCSgxIDw8IDYpCisjZGVmaW5lCVNUQVRVU19TVVNQRU5EX1RISVMJKDEgPDwgNSkKKyNkZWZpbmUJU1RBVFVTX01BSUxCT1hfVEhJUwkoMSA8PCA0KQorI2RlZmluZQlTVEFUVVNfUEFDS0VUU19USElTKG4pCSgoKG4pID4+IDApICYmIDB4MDMpCisKKyNkZWZpbmUJU1RBVFVTX1VOU1BFQ19NQVNLCTB4MGM4YworI2RlZmluZQlTVEFUVVNfTk9JU0VfTUFTSyAJKCh1MTYpfigweDAzMDN8U1RBVFVTX1VOU1BFQ19NQVNLKSkKKworCitzdGF0aWMgaW5saW5lIHZvaWQgbmNfZHVtcF9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgc3RhdHVzKQoreworCWlmICghbmV0aWZfbXNnX2xpbmsoZGV2KSkKKwkJcmV0dXJuOworCWRldmRiZyhkZXYsICJuZXQxMDgwICVzLSVzIHN0YXR1cyAweCV4OiIKKwkJCSIgdGhpcyAoJWMpIFBLVD0lZCVzJXMlczsiCisJCQkiIG90aGVyIFBLVD0lZCVzJXMlczsgdW5zcGVjIDB4JXgiLAorCQlkZXYtPnVkZXYtPmJ1cy0+YnVzX25hbWUsIGRldi0+dWRldi0+ZGV2cGF0aCwKKwkJc3RhdHVzLAorCisJCS8vIFhYWCB0aGUgcGFja2V0IGNvdW50cyBkb24ndCBzZWVtIHJpZ2h0CisJCS8vICgxIGF0IHJlc2V0LCBub3QgMCk7IG1heWJlIFVOU1BFQyB0b28KKworCQkoc3RhdHVzICYgU1RBVFVTX1BPUlRfQSkgPyAnQScgOiAnQicsCisJCVNUQVRVU19QQUNLRVRTX1RISVMoc3RhdHVzKSwKKwkJKHN0YXR1cyAmIFNUQVRVU19DT05OX1RISVMpID8gIiBDT04iIDogIiIsCisJCShzdGF0dXMgJiBTVEFUVVNfU1VTUEVORF9USElTKSA/ICIgU1VTIiA6ICIiLAorCQkoc3RhdHVzICYgU1RBVFVTX01BSUxCT1hfVEhJUykgPyAiIE1CT1giIDogIiIsCisKKwkJU1RBVFVTX1BBQ0tFVFNfT1RIRVIoc3RhdHVzKSwKKwkJKHN0YXR1cyAmIFNUQVRVU19DT05OX09USEVSKSA/ICIgQ09OIiA6ICIiLAorCQkoc3RhdHVzICYgU1RBVFVTX1NVU1BFTkRfT1RIRVIpID8gIiBTVVMiIDogIiIsCisJCShzdGF0dXMgJiBTVEFUVVNfTUFJTEJPWF9PVEhFUikgPyAiIE1CT1giIDogIiIsCisKKwkJc3RhdHVzICYgU1RBVFVTX1VOU1BFQ19NQVNLCisJCSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUVEwgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lCVRUTF9USElTKHR0bCkJKDB4MDBmZiAmIHR0bCkKKyNkZWZpbmUJVFRMX09USEVSKHR0bCkJKDB4MDBmZiAmICh0dGwgPj4gOCkpCisjZGVmaW5lIE1LX1RUTCh0aGlzLG90aGVyKQkoKHUxNikoKChvdGhlcik8PDgpfCgweDAwZmYmKHRoaXMpKSkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuY19kdW1wX3R0bChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiB0dGwpCit7CisJaWYgKG5ldGlmX21zZ19saW5rKGRldikpCisJCWRldmRiZyhkZXYsICJuZXQxMDgwICVzLSVzIHR0bCAweCV4IHRoaXMgPSAlZCwgb3RoZXIgPSAlZCIsCisJCQlkZXYtPnVkZXYtPmJ1cy0+YnVzX25hbWUsIGRldi0+dWRldi0+ZGV2cGF0aCwKKwkJCXR0bCwgVFRMX1RISVModHRsKSwgVFRMX09USEVSKHR0bCkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IG5ldDEwODBfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXUxNgkJdXNiY3RsLCBzdGF0dXMsIHR0bDsKKwl1MTYJCSp2cCA9IGttYWxsb2Moc2l6ZW9mICh1MTYpLCBHRlBfS0VSTkVMKTsKKwlpbnQJCXJldHZhbDsKKworCWlmICghdnApCisJCXJldHVybiAtRU5PTUVNOworCisJLy8gbmNfZHVtcF9yZWdpc3RlcnMoZGV2KTsKKworCWlmICgocmV0dmFsID0gbmNfcmVnaXN0ZXJfcmVhZChkZXYsIFJFR19TVEFUVVMsIHZwKSkgPCAwKSB7CisJCWRiZygiY2FuJ3QgcmVhZCAlcy0lcyBzdGF0dXM6ICVkIiwKKwkJCWRldi0+dWRldi0+YnVzLT5idXNfbmFtZSwgZGV2LT51ZGV2LT5kZXZwYXRoLCByZXR2YWwpOworCQlnb3RvIGRvbmU7CisJfQorCXN0YXR1cyA9ICp2cDsKKwluY19kdW1wX3N0YXR1cyhkZXYsIHN0YXR1cyk7CisKKwlpZiAoKHJldHZhbCA9IG5jX3JlZ2lzdGVyX3JlYWQoZGV2LCBSRUdfVVNCQ1RMLCB2cCkpIDwgMCkgeworCQlkYmcoImNhbid0IHJlYWQgVVNCQ1RMLCAlZCIsIHJldHZhbCk7CisJCWdvdG8gZG9uZTsKKwl9CisJdXNiY3RsID0gKnZwOworCW5jX2R1bXBfdXNiY3RsKGRldiwgdXNiY3RsKTsKKworCW5jX3JlZ2lzdGVyX3dyaXRlKGRldiwgUkVHX1VTQkNUTCwKKwkJCVVTQkNUTF9GTFVTSF9USElTIHwgVVNCQ1RMX0ZMVVNIX09USEVSKTsKKworCWlmICgocmV0dmFsID0gbmNfcmVnaXN0ZXJfcmVhZChkZXYsIFJFR19UVEwsIHZwKSkgPCAwKSB7CisJCWRiZygiY2FuJ3QgcmVhZCBUVEwsICVkIiwgcmV0dmFsKTsKKwkJZ290byBkb25lOworCX0KKwl0dGwgPSAqdnA7CisJLy8gbmNfZHVtcF90dGwoZGV2LCB0dGwpOworCisJbmNfcmVnaXN0ZXJfd3JpdGUoZGV2LCBSRUdfVFRMLAorCQkJTUtfVFRMKE5DX1JFQURfVFRMX01TLCBUVExfT1RIRVIodHRsKSkgKTsKKwlkYmcoIiVzOiBhc3NpZ25lZCBUVEwsICVkIG1zIiwgZGV2LT5uZXQtPm5hbWUsIE5DX1JFQURfVFRMX01TKTsKKworCWlmIChuZXRpZl9tc2dfbGluayhkZXYpKQorCQlkZXZpbmZvKGRldiwgInBvcnQgJWMsIHBlZXIgJXNjb25uZWN0ZWQiLAorCQkJKHN0YXR1cyAmIFNUQVRVU19QT1JUX0EpID8gJ0EnIDogJ0InLAorCQkJKHN0YXR1cyAmIFNUQVRVU19DT05OX09USEVSKSA/ICIiIDogImRpcyIKKwkJCSk7CisJcmV0dmFsID0gMDsKKworZG9uZToKKwlrZnJlZSh2cCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBuZXQxMDgwX2NoZWNrX2Nvbm5lY3Qoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCWludAkJCXJldHZhbDsKKwl1MTYJCQlzdGF0dXM7CisJdTE2CQkJKnZwID0ga21hbGxvYyhzaXplb2YgKHUxNiksIEdGUF9LRVJORUwpOworCisJaWYgKCF2cCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dmFsID0gbmNfcmVnaXN0ZXJfcmVhZChkZXYsIFJFR19TVEFUVVMsIHZwKTsKKwlzdGF0dXMgPSAqdnA7CisJa2ZyZWUodnApOworCWlmIChyZXR2YWwgIT0gMCkgeworCQlkYmcoIiVzIG5ldDEwODBfY2hlY2tfY29ubiByZWFkIC0gJWQiLCBkZXYtPm5ldC0+bmFtZSwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJaWYgKChzdGF0dXMgJiBTVEFUVVNfQ09OTl9PVEhFUikgIT0gU1RBVFVTX0NPTk5fT1RIRVIpCisJCXJldHVybiAtRU5PTElOSzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmNfZmx1c2hfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrZnJlZSh1cmItPmNvbnRleHQpOworCXVzYl9mcmVlX3VyYih1cmIpOworfQorCitzdGF0aWMgdm9pZCBuY19lbnN1cmVfc3luYyhzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJZGV2LT5mcmFtZV9lcnJvcnMrKzsKKwlpZiAoZGV2LT5mcmFtZV9lcnJvcnMgPiA1KSB7CisJCXN0cnVjdCB1cmIJCSp1cmI7CisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJKnJlcTsKKwkJaW50CQkJc3RhdHVzOworCisJCS8qIFNlbmQgYSBmbHVzaCAqLworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIFNMQUJfQVRPTUlDKTsKKwkJaWYgKCF1cmIpCisJCQlyZXR1cm47CisKKwkJcmVxID0ga21hbGxvYyhzaXplb2YgKnJlcSwgR0ZQX0FUT01JQyk7CisJCWlmICghcmVxKSB7CisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXJlcS0+YlJlcXVlc3RUeXBlID0gVVNCX0RJUl9PVVQKKwkJCXwgVVNCX1RZUEVfVkVORE9SCisJCQl8IFVTQl9SRUNJUF9ERVZJQ0U7CisJCXJlcS0+YlJlcXVlc3QgPSBSRVFVRVNUX1JFR0lTVEVSOworCQlyZXEtPndWYWx1ZSA9IGNwdV90b19sZTE2KFVTQkNUTF9GTFVTSF9USElTCisJCQkJfCBVU0JDVExfRkxVU0hfT1RIRVIpOworCQlyZXEtPndJbmRleCA9IGNwdV90b19sZTE2KFJFR19VU0JDVEwpOworCQlyZXEtPndMZW5ndGggPSBjcHVfdG9fbGUxNigwKTsKKworCQkvKiBxdWV1ZSBhbiBhc3luYyBjb250cm9sIHJlcXVlc3QsIHdlIGRvbid0IG5lZWQKKwkJICogdG8gZG8gYW55dGhpbmcgd2hlbiBpdCBmaW5pc2hlcyBleGNlcHQgY2xlYW4gdXAuCisJCSAqLworCQl1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIGRldi0+dWRldiwKKwkJCXVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQkJKHVuc2lnbmVkIGNoYXIgKikgcmVxLAorCQkJTlVMTCwgMCwKKwkJCW5jX2ZsdXNoX2NvbXBsZXRlLCByZXEpOworCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCQlpZiAoc3RhdHVzKSB7CisJCQlrZnJlZShyZXEpOworCQkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAobmV0aWZfbXNnX3J4X2VycihkZXYpKQorCQkJZGV2ZGJnKGRldiwgImZsdXNoIG5ldDEwODA7IHRvbyBtYW55IGZyYW1pbmcgZXJyb3JzIik7CisJCWRldi0+ZnJhbWVfZXJyb3JzID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbmV0MTA4MF9yeF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5jX2hlYWRlcgkqaGVhZGVyOworCXN0cnVjdCBuY190cmFpbGVyCSp0cmFpbGVyOworCXUxNgkJCWhkcl9sZW4sIHBhY2tldF9sZW47CisKKwlpZiAoIShza2ItPmxlbiAmIDB4MDEpKSB7CisjaWZkZWYgREVCVUcKKwkJc3RydWN0IG5ldF9kZXZpY2UJKm5ldCA9IGRldi0+bmV0OworCQlkYmcoInJ4IGZyYW1lc2l6ZSAlZCByYW5nZSAlZC4uJWQgbXR1ICVkIiwgc2tiLT5sZW4sCisJCQluZXQtPmhhcmRfaGVhZGVyX2xlbiwgZGV2LT5oYXJkX210dSwgbmV0LT5tdHUpOworI2VuZGlmCisJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCW5jX2Vuc3VyZV9zeW5jKGRldik7CisJCXJldHVybiAwOworCX0KKworCWhlYWRlciA9IChzdHJ1Y3QgbmNfaGVhZGVyICopIHNrYi0+ZGF0YTsKKwloZHJfbGVuID0gbGUxNl90b19jcHVwKCZoZWFkZXItPmhkcl9sZW4pOworCXBhY2tldF9sZW4gPSBsZTE2X3RvX2NwdXAoJmhlYWRlci0+cGFja2V0X2xlbik7CisJaWYgKEZSQU1FRF9TSVpFKHBhY2tldF9sZW4pID4gTkNfTUFYX1BBQ0tFVCkgeworCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQlkYmcoInBhY2tldCB0b28gYmlnLCAlZCIsIHBhY2tldF9sZW4pOworCQluY19lbnN1cmVfc3luYyhkZXYpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGhkcl9sZW4gPCBNSU5fSEVBREVSKSB7CisJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWRiZygiaGVhZGVyIHRvbyBzaG9ydCwgJWQiLCBoZHJfbGVuKTsKKwkJbmNfZW5zdXJlX3N5bmMoZGV2KTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChoZHJfbGVuID4gTUlOX0hFQURFUikgeworCQkvLyBvdXQgb2YgYmFuZCBkYXRhIGZvciB1cz8KKwkJZGJnKCJoZWFkZXIgT09CLCAlZCBieXRlcyIsIGhkcl9sZW4gLSBNSU5fSEVBREVSKTsKKwkJbmNfZW5zdXJlX3N5bmMoZGV2KTsKKwkJLy8gc3dpdGNoICh2ZW5kb3IvcHJvZHVjdCBpZHMpIHsgLi4uIH0KKwl9CisJc2tiX3B1bGwoc2tiLCBoZHJfbGVuKTsKKworCXRyYWlsZXIgPSAoc3RydWN0IG5jX3RyYWlsZXIgKikKKwkJKHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gc2l6ZW9mICp0cmFpbGVyKTsKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gc2l6ZW9mICp0cmFpbGVyKTsKKworCWlmICgocGFja2V0X2xlbiAmIDB4MDEpID09IDApIHsKKwkJaWYgKHNrYi0+ZGF0YSBbcGFja2V0X2xlbl0gIT0gUEFEX0JZVEUpIHsKKwkJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlkYmcoImJhZCBwYWQiKTsKKwkJCXJldHVybiAwOworCQl9CisJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSAxKTsKKwl9CisJaWYgKHNrYi0+bGVuICE9IHBhY2tldF9sZW4pIHsKKwkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJZGJnKCJiYWQgcGFja2V0IGxlbiAlZCAoZXhwZWN0ZWQgJWQpIiwKKwkJCXNrYi0+bGVuLCBwYWNrZXRfbGVuKTsKKwkJbmNfZW5zdXJlX3N5bmMoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChoZWFkZXItPnBhY2tldF9pZCAhPSBnZXRfdW5hbGlnbmVkKCZ0cmFpbGVyLT5wYWNrZXRfaWQpKSB7CisJCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJZGJnKCIoMisgZHJvcHBlZCkgcnggcGFja2V0X2lkIG1pc21hdGNoIDB4JXggMHgleCIsCisJCQlsZTE2X3RvX2NwdShoZWFkZXItPnBhY2tldF9pZCksCisJCQlsZTE2X3RvX2NwdSh0cmFpbGVyLT5wYWNrZXRfaWQpKTsKKwkJcmV0dXJuIDA7CisJfQorI2lmIDAKKwlkZXZkYmcoZGV2LCAiZnJhbWUgPHJ4IGggJWQgcCAlZCBpZCAlZCIsIGhlYWRlci0+aGRyX2xlbiwKKwkJaGVhZGVyLT5wYWNrZXRfbGVuLCBoZWFkZXItPnBhY2tldF9pZCk7CisjZW5kaWYKKwlkZXYtPmZyYW1lX2Vycm9ycyA9IDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCituZXQxMDgwX3R4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgZmxhZ3MpCit7CisJaW50CQkJcGFkbGVuOworCXN0cnVjdCBza19idWZmCQkqc2tiMjsKKwlzdHJ1Y3QgbmNfaGVhZGVyCSpoZWFkZXIgPSBOVUxMOworCXN0cnVjdCBuY190cmFpbGVyCSp0cmFpbGVyID0gTlVMTDsKKwlpbnQJCQlsZW4gPSBza2ItPmxlbjsKKworCXBhZGxlbiA9ICgobGVuICsgc2l6ZW9mIChzdHJ1Y3QgbmNfaGVhZGVyKQorCQkJKyBzaXplb2YgKHN0cnVjdCBuY190cmFpbGVyKSkgJiAweDAxKSA/IDAgOiAxOworCWlmICghc2tiX2Nsb25lZChza2IpKSB7CisJCWludAloZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOworCQlpbnQJdGFpbHJvb20gPSBza2JfdGFpbHJvb20oc2tiKTsKKworCQlpZiAoKHBhZGxlbiArIHNpemVvZiAoc3RydWN0IG5jX3RyYWlsZXIpKSA8PSB0YWlscm9vbQorCQkJICAgICYmIHNpemVvZiAoc3RydWN0IG5jX2hlYWRlcikgPD0gaGVhZHJvb20pCisJCQkvKiBUaGVyZSdzIGVub3VnaCBoZWFkIGFuZCB0YWlsIHJvb20gKi8KKwkJCWdvdG8gZW5jYXBzdWxhdGU7CisKKwkJaWYgKChzaXplb2YgKHN0cnVjdCBuY19oZWFkZXIpICsgcGFkbGVuCisJCQkJCSsgc2l6ZW9mIChzdHJ1Y3QgbmNfdHJhaWxlcikpIDwKKwkJCQkoaGVhZHJvb20gKyB0YWlscm9vbSkpIHsKKwkJCS8qIFRoZXJlJ3MgZW5vdWdoIHRvdGFsIHJvb20sIHNvIGp1c3QgcmVhZGp1c3QgKi8KKwkJCXNrYi0+ZGF0YSA9IG1lbW1vdmUoc2tiLT5oZWFkCisJCQkJCQkrIHNpemVvZiAoc3RydWN0IG5jX2hlYWRlciksCisJCQkJCSAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIGxlbjsKKwkJCWdvdG8gZW5jYXBzdWxhdGU7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgYSBuZXcgc2tiIHRvIHVzZSB3aXRoIHRoZSBjb3JyZWN0IHNpemUgKi8KKwlza2IyID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwKKwkJCQlzaXplb2YgKHN0cnVjdCBuY19oZWFkZXIpLAorCQkJCXNpemVvZiAoc3RydWN0IG5jX3RyYWlsZXIpICsgcGFkbGVuLAorCQkJCWZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWlmICghc2tiMikKKwkJcmV0dXJuIHNrYjI7CisJc2tiID0gc2tiMjsKKworZW5jYXBzdWxhdGU6CisJLyogaGVhZGVyIGZpcnN0ICovCisJaGVhZGVyID0gKHN0cnVjdCBuY19oZWFkZXIgKikgc2tiX3B1c2goc2tiLCBzaXplb2YgKmhlYWRlcik7CisJaGVhZGVyLT5oZHJfbGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mICgqaGVhZGVyKSk7CisJaGVhZGVyLT5wYWNrZXRfbGVuID0gY3B1X3RvX2xlMTYobGVuKTsKKwloZWFkZXItPnBhY2tldF9pZCA9IGNwdV90b19sZTE2KCh1MTYpZGV2LT54aWQrKyk7CisKKwkvKiBtYXliZSBwYWQ7IHRoZW4gdHJhaWxlciAqLworCWlmICghKChza2ItPmxlbiArIHNpemVvZiAqdHJhaWxlcikgJiAweDAxKSkKKwkJKnNrYl9wdXQoc2tiLCAxKSA9IFBBRF9CWVRFOworCXRyYWlsZXIgPSAoc3RydWN0IG5jX3RyYWlsZXIgKikgc2tiX3B1dChza2IsIHNpemVvZiAqdHJhaWxlcik7CisJcHV0X3VuYWxpZ25lZChoZWFkZXItPnBhY2tldF9pZCwgJnRyYWlsZXItPnBhY2tldF9pZCk7CisjaWYgMAorCWRldmRiZyhkZXYsICJmcmFtZSA+dHggaCAlZCBwICVkIGlkICVkIiwKKwkJaGVhZGVyLT5oZHJfbGVuLCBoZWFkZXItPnBhY2tldF9sZW4sCisJCWhlYWRlci0+cGFja2V0X2lkKTsKKyNlbmRpZgorCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbnQgbmV0MTA4MF9iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJdW5zaWduZWQJZXh0cmEgPSBzaXplb2YgKHN0cnVjdCBuY19oZWFkZXIpCisJCQkJKyAxCisJCQkJKyBzaXplb2YgKHN0cnVjdCBuY190cmFpbGVyKTsKKworCWRldi0+bmV0LT5oYXJkX2hlYWRlcl9sZW4gKz0gZXh0cmE7CisJZGV2LT5yeF91cmJfc2l6ZSA9IGRldi0+bmV0LT5oYXJkX2hlYWRlcl9sZW4gKyBkZXYtPm5ldC0+bXR1OworCWRldi0+aGFyZF9tdHUgPSBOQ19NQVhfUEFDS0VUOworCXJldHVybiB1c2JuZXRfZ2V0X2VuZHBvaW50cyAoZGV2LCBpbnRmKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwluZXQxMDgwX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0JIk5ldENoaXAgVHVyYm9DT05ORUNUIiwKKwkuZmxhZ3MgPQlGTEFHX0ZSQU1JTkdfTkMsCisJLmJpbmQgPQkJbmV0MTA4MF9iaW5kLAorCS5yZXNldCA9CW5ldDEwODBfcmVzZXQsCisJLmNoZWNrX2Nvbm5lY3QgPSBuZXQxMDgwX2NoZWNrX2Nvbm5lY3QsCisJLnJ4X2ZpeHVwID0JbmV0MTA4MF9yeF9maXh1cCwKKwkudHhfZml4dXAgPQluZXQxMDgwX3R4X2ZpeHVwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkCXByb2R1Y3RzIFtdID0geworeworCVVTQl9ERVZJQ0UoMHgwNTI1LCAweDEwODApLAkvLyBOZXRDaGlwIHJlZiBkZXNpZ24KKwkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJm5ldDEwODBfaW5mbywKK30sIHsKKwlVU0JfREVWSUNFKDB4MDZEMCwgMHgwNjIyKSwJLy8gTGFwbGluayBHb2xkCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZuZXQxMDgwX2luZm8sCit9LAorCXsgfSwJCS8vIEVORAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBuZXQxMDgwX2RyaXZlciA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkibmV0MTA4MCIsCisJLmlkX3RhYmxlID0JcHJvZHVjdHMsCisJLnByb2JlID0JdXNibmV0X3Byb2JlLAorCS5kaXNjb25uZWN0ID0JdXNibmV0X2Rpc2Nvbm5lY3QsCisJLnN1c3BlbmQgPQl1c2JuZXRfc3VzcGVuZCwKKwkucmVzdW1lID0JdXNibmV0X3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5ldDEwODBfaW5pdCh2b2lkKQoreworIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZuZXQxMDgwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChuZXQxMDgwX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbmV0MTA4MF9leGl0KHZvaWQpCit7CisgCXVzYl9kZXJlZ2lzdGVyKCZuZXQxMDgwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChuZXQxMDgwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBCcm93bmVsbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXRDaGlwIDEwODAgYmFzZWQgVVNCIEhvc3QtdG8tSG9zdCBMaW5rcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYyBiL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmMKaW5kZXggZmNkNmQzYy4uNzQ4NGQzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5jCkBAIC04MjUsNyArODI1LDYgQEAKIAlwZWdhc3VzX3QgKnBlZ2FzdXMgPSBuZXRkZXZfcHJpdihuZXQpOwogCWlmIChuZXRpZl9tc2dfdGltZXIocGVnYXN1cykpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0eCB0aW1lb3V0XG4iLCBuZXQtPm5hbWUpOwotCXBlZ2FzdXMtPnR4X3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsKIAl1c2JfdW5saW5rX3VyYihwZWdhc3VzLT50eF91cmIpOwogCXBlZ2FzdXMtPnN0YXRzLnR4X2Vycm9ycysrOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3BsdXNiLmMgYi9kcml2ZXJzL3VzYi9uZXQvcGx1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGMyYjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbmV0L3BsdXNiLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBQTC0yMzAxLzIzMDIgVVNCIGhvc3QtdG8taG9zdCBsaW5rIGNhYmxlcworICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgYnkgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLy8gI2RlZmluZQlERUJVRwkJCS8vIGVycm9yIHBhdGggbWVzc2FnZXMsIGV4dHJhIGluZm8KKy8vICNkZWZpbmUJVkVSQk9TRQkJCS8vIG1vcmU7IHN1Y2Nlc3MgbWVzc2FnZXMKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmCUNPTkZJR19VU0JfREVCVUcKKyMgICBkZWZpbmUgREVCVUcKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAidXNibmV0LmgiCisKKworLyoKKyAqIFByb2xpZmljIFBMLTIzMDEvUEwtMjMwMiBkcml2ZXIgLi4uIGh0dHA6Ly93d3cucHJvbGlmaWN0ZWNoLmNvbQorICoKKyAqIFRoZSBwcm90b2NvbCBhbmQgaGFuZHNoYWtpbmcgdXNlZCBoZXJlIHNob3VsZCBiZSBidWctY29tcGF0aWJsZQorICogd2l0aCB0aGUgTGludXggMi4yICJwbHVzYiIgZHJpdmVyLCBieSBEZXRpIEZsaWVnbC4KKyAqCisgKiBIRUFEUyBVUDogIHRoaXMgaGFuZHNoYWtpbmcgaXNuJ3QgYWxsIHRoYXQgcm9idXN0LiAgVGhpcyBkcml2ZXIKKyAqIGdldHMgY29uZnVzZWQgZWFzaWx5IGlmIHlvdSB1bnBsdWcgb25lIGVuZCBvZiB0aGUgY2FibGUgdGhlbgorICogdHJ5IHRvIGNvbm5lY3QgaXQgYWdhaW47IHlvdSdsbCBuZWVkIHRvIHJlc3RhcnQgYm90aCBlbmRzLiBUaGUKKyAqICJuYXBsaW5rIiBzb2Z0d2FyZSAodXNlZCBieSBzb21lIFBsYXlTdGF0aW9uLzIgZGV2ZW9wZXJzKSBkb2VzCisgKiB0aGUgaGFuZHNoYWtpbmcgbXVjaCBiZXR0ZXIhICAgQWxzbywgc29tZXRpbWVzIHRoaXMgaGFyZHdhcmUKKyAqIHNlZW1zIHRvIGdldCB3ZWRnZWQgdW5kZXIgbG9hZC4gIFByb2xpZmljIGRvY3MgYXJlIHdlYWssIGFuZAorICogZG9uJ3QgaWRlbnRpZnkgZGlmZmVyZW5jZXMgYmV0d2VlbiBQTDIzMDEgYW5kIFBMMjMwMiwgbXVjaCBsZXNzCisgKiBhbnl0aGluZyB0byBleHBsYWluIHRoZSBkaWZmZXJlbnQgUEwyMzAyIHZlcnNpb25zIG9ic2VydmVkLgorICovCisKKy8qCisgKiBCaXRzIDAtNCBjYW4gYmUgdXNlZCBmb3Igc29mdHdhcmUgaGFuZHNoYWtpbmc7IHRoZXkncmUgc2V0IGZyb20KKyAqIG9uZSBlbmQsIGNsZWFyZWQgZnJvbSB0aGUgb3RoZXIsICJyZWFkIiB3aXRoIHRoZSBpbnRlcnJ1cHQgYnl0ZS4KKyAqLworI2RlZmluZQlQTF9TX0VOCQkoMTw8NykJCS8qIChmZWF0dXJlIG9ubHkpIHN1c3BlbmQgZW5hYmxlICovCisvKiByZXNlcnZlZCBiaXQgLS0gcnggcmVhZHkgKDYpID8gKi8KKyNkZWZpbmUJUExfVFhfUkVBRFkJKDE8PDUpCQkvKiAoaW50ZXJydXB0IG9ubHkpIHRyYW5zbWl0IHJlYWR5ICovCisjZGVmaW5lCVBMX1JFU0VUX09VVAkoMTw8NCkJCS8qIHJlc2V0IG91dHB1dCBwaXBlICovCisjZGVmaW5lCVBMX1JFU0VUX0lOCSgxPDwzKQkJLyogcmVzZXQgaW5wdXQgcGlwZSAqLworI2RlZmluZQlQTF9UWF9DCQkoMTw8MikJCS8qIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSAqLworI2RlZmluZQlQTF9UWF9SRVEJKDE8PDEpCQkvKiB0cmFuc21pc3Npb24gcmVjZWl2ZWQgKi8KKyNkZWZpbmUJUExfUEVFUl9FCSgxPDwwKQkJLyogcGVlciBleGlzdHMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK3BsX3ZlbmRvcl9yZXEoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCByZXEsIHU4IHZhbCwgdTggaW5kZXgpCit7CisJcmV0dXJuIHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsCisJCXVzYl9yY3ZjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQlyZXEsCisJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQl2YWwsIGluZGV4LAorCQlOVUxMLCAwLAorCQlVU0JfQ1RSTF9HRVRfVElNRU9VVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitwbF9jbGVhcl9RdWlja0xpbmtfZmVhdHVyZXMoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgdmFsKQoreworCXJldHVybiBwbF92ZW5kb3JfcmVxKGRldiwgMSwgKHU4KSB2YWwsIDApOworfQorCitzdGF0aWMgaW5saW5lIGludAorcGxfc2V0X1F1aWNrTGlua19mZWF0dXJlcyhzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCB2YWwpCit7CisJcmV0dXJuIHBsX3ZlbmRvcl9yZXEoZGV2LCAzLCAodTgpIHZhbCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgcGxfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCS8qIHNvbWUgdW5pdHMgc2VlbSB0byBuZWVkIHRoaXMgcmVzZXQsIG90aGVycyByZWplY3QgaXQgdXR0ZXJseS4KKwkgKiBGSVhNRSBiZSBtb3JlIGxpa2UgIm5hcGxpbmsiIG9yIHdpbmRvd3MgZHJpdmVycy4KKwkgKi8KKwkodm9pZCkgcGxfc2V0X1F1aWNrTGlua19mZWF0dXJlcyhkZXYsCisJCVBMX1NfRU58UExfUkVTRVRfT1VUfFBMX1JFU0VUX0lOfFBMX1BFRVJfRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JcHJvbGlmaWNfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiUHJvbGlmaWMgUEwtMjMwMS9QTC0yMzAyIiwKKwkuZmxhZ3MgPQlGTEFHX05PX1NFVElOVCwKKwkJLyogc29tZSBQTC0yMzAyIHZlcnNpb25zIHNlZW0gdG8gZmFpbCB1c2Jfc2V0X2ludGVyZmFjZSgpICovCisJLnJlc2V0ID0JcGxfcmVzZXQsCit9OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBQcm9pbGlmaWMncyBuYW1lIHdvbid0IG5vcm1hbGx5IGJlIG9uIHRoZSBjYWJsZXMsIGFuZAorICogbWF5IG5vdCBiZSBvbiB0aGUgZGV2aWNlLgorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZAlwcm9kdWN0cyBbXSA9IHsKKworeworCVVTQl9ERVZJQ0UoMHgwNjdiLCAweDAwMDApLAkvLyBQTC0yMzAxCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZwcm9saWZpY19pbmZvLAorfSwgeworCVVTQl9ERVZJQ0UoMHgwNjdiLCAweDAwMDEpLAkvLyBQTC0yMzAyCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZwcm9saWZpY19pbmZvLAorfSwKKworCXsgfSwJCS8vIEVORAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwbHVzYl9kcml2ZXIgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm5hbWUgPQkJInBsdXNiIiwKKwkuaWRfdGFibGUgPQlwcm9kdWN0cywKKwkucHJvYmUgPQl1c2JuZXRfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQl1c2JuZXRfZGlzY29ubmVjdCwKKwkuc3VzcGVuZCA9CXVzYm5ldF9zdXNwZW5kLAorCS5yZXN1bWUgPQl1c2JuZXRfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGx1c2JfaW5pdCh2b2lkKQoreworIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZwbHVzYl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQocGx1c2JfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwbHVzYl9leGl0KHZvaWQpCit7CisgCXVzYl9kZXJlZ2lzdGVyKCZwbHVzYl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQocGx1c2JfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEJyb3duZWxsIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlByb2xpZmljIFBMLTIzMDEvMjMwMiBVU0IgSG9zdCB0byBIb3N0IExpbmsgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvcm5kaXNfaG9zdC5jIGIvZHJpdmVycy91c2IvbmV0L3JuZGlzX2hvc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQyZTVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbmV0L3JuZGlzX2hvc3QuYwpAQCAtMCwwICsxLDYxNSBAQAorLyoKKyAqIEhvc3QgU2lkZSBzdXBwb3J0IGZvciBSTkRJUyBOZXR3b3JraW5nIExpbmtzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLy8gI2RlZmluZQlERUJVRwkJCS8vIGVycm9yIHBhdGggbWVzc2FnZXMsIGV4dHJhIGluZm8KKy8vICNkZWZpbmUJVkVSQk9TRQkJCS8vIG1vcmU7IHN1Y2Nlc3MgbWVzc2FnZXMKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmCUNPTkZJR19VU0JfREVCVUcKKyMgICBkZWZpbmUgREVCVUcKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl9jZGMuaD4KKworI2luY2x1ZGUgInVzYm5ldC5oIgorCisKKy8qCisgKiBSTkRJUyBpcyBORElTIHJlbW90ZWQgb3ZlciBVU0IuICBJdCdzIGEgTVNGVCB2YXJpYW50IG9mIENEQyBBQ00gLi4uIG9mCisgKiBjb3Vyc2UgQUNNIHdhcyBpbnRlbmRlZCBmb3IgbW9kZW1zLCBub3QgRXRoZXJuZXQgbGlua3MhICBVU0IncyBzdGFuZGFyZAorICogZm9yIEV0aGVybmV0IGxpbmtzIGlzICJDREMgRXRoZXJuZXQiLCB3aGljaCBpcyBzaWduaWZpY2FudGx5IHNpbXBsZXIuCisgKi8KKworLyoKKyAqIENPTlRST0wgdXNlcyBDREMgImVuY2Fwc3VsYXRlZCBjb21tYW5kcyIgd2l0aCBmdW5reSBub3RpZmljYXRpb25zLgorICogIC0gY29udHJvbC1vdXQ6ICBTRU5EX0VOQ0FQU1VMQVRFRAorICogIC0gaW50ZXJydXB0LWluOiAgUkVTUE9OU0VfQVZBSUxBQkxFCisgKiAgLSBjb250cm9sLWluOiAgR0VUX0VOQ0FQU1VMQVRFRAorICoKKyAqIFdlJ2xsIHRyeSB0byBpZ25vcmUgdGhlIFJFU1BPTlNFX0FWQUlMQUJMRSBub3RpZmljYXRpb25zLgorICovCitzdHJ1Y3Qgcm5kaXNfbXNnX2hkciB7CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR18qICovCisJX19sZTMyCW1zZ19sZW47CisJLy8gZm9sbG93ZWQgYnkgZGF0YSB0aGF0IHZhcmllcyBiZXR3ZWVuIG1lc3NhZ2VzCisJX19sZTMyCXJlcXVlc3RfaWQ7CisJX19sZTMyCXN0YXR1czsKKwkvLyAuLi4gYW5kIG1vcmUKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBSTkRJUyBkZWZpbmVzIHRoaXMgKGFic3VyZGx5IGh1Z2UpIGNvbnRyb2wgdGltZW91dCAqLworI2RlZmluZQlSTkRJU19DT05UUk9MX1RJTUVPVVRfTVMJKDEwICogMTAwMCkKKworCisjZGVmaW5lIGNjcHUyIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIKKworI2RlZmluZSBSTkRJU19NU0dfQ09NUExFVElPTgljY3B1MigweDgwMDAwMDAwKQorCisvKiBjb2RlcyBmb3IgIm1zZ190eXBlIiBmaWVsZCBvZiBybmRpcyBtZXNzYWdlczsKKyAqIG9ubHkgdGhlIGRhdGEgY2hhbm5lbCB1c2VzIHBhY2tldCBtZXNzYWdlcyAobWF5YmUgYmF0Y2hlZCk7CisgKiBldmVyeXRoaW5nIGVsc2UgZ29lcyBvbiB0aGUgY29udHJvbCBjaGFubmVsLgorICovCisjZGVmaW5lIFJORElTX01TR19QQUNLRVQJY2NwdTIoMHgwMDAwMDAwMSkJLyogMS1OIHBhY2tldHMgKi8KKyNkZWZpbmUgUk5ESVNfTVNHX0lOSVQJCWNjcHUyKDB4MDAwMDAwMDIpCisjZGVmaW5lIFJORElTX01TR19JTklUX0MgCShSTkRJU19NU0dfSU5JVHxSTkRJU19NU0dfQ09NUExFVElPTikKKyNkZWZpbmUgUk5ESVNfTVNHX0hBTFQJCWNjcHUyKDB4MDAwMDAwMDMpCisjZGVmaW5lIFJORElTX01TR19RVUVSWQkJY2NwdTIoMHgwMDAwMDAwNCkKKyNkZWZpbmUgUk5ESVNfTVNHX1FVRVJZX0MgCShSTkRJU19NU0dfUVVFUll8Uk5ESVNfTVNHX0NPTVBMRVRJT04pCisjZGVmaW5lIFJORElTX01TR19TRVQJCWNjcHUyKDB4MDAwMDAwMDUpCisjZGVmaW5lIFJORElTX01TR19TRVRfQyAJKFJORElTX01TR19TRVR8Uk5ESVNfTVNHX0NPTVBMRVRJT04pCisjZGVmaW5lIFJORElTX01TR19SRVNFVAkJY2NwdTIoMHgwMDAwMDAwNikKKyNkZWZpbmUgUk5ESVNfTVNHX1JFU0VUX0MgCShSTkRJU19NU0dfUkVTRVR8Uk5ESVNfTVNHX0NPTVBMRVRJT04pCisjZGVmaW5lIFJORElTX01TR19JTkRJQ0FURQljY3B1MigweDAwMDAwMDA3KQorI2RlZmluZSBSTkRJU19NU0dfS0VFUEFMSVZFCWNjcHUyKDB4MDAwMDAwMDgpCisjZGVmaW5lIFJORElTX01TR19LRUVQQUxJVkVfQyAJKFJORElTX01TR19LRUVQQUxJVkV8Uk5ESVNfTVNHX0NPTVBMRVRJT04pCisKKy8qIGNvZGVzIGZvciAic3RhdHVzIiBmaWVsZCBvZiBjb21wbGV0aW9uIG1lc3NhZ2VzICovCisjZGVmaW5lCVJORElTX1NUQVRVU19TVUNDRVNTCQljY3B1MigweDAwMDAwMDAwKQorI2RlZmluZQlSTkRJU19TVEFUVVNfRkFJTFVSRQkJY2NwdTIoMHhjMDAwMDAwMSkKKyNkZWZpbmUJUk5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQljY3B1MigweGMwMDEwMDE1KQorI2RlZmluZQlSTkRJU19TVEFUVVNfTk9UX1NVUFBPUlRFRAljY3B1MigweGMwMDAwMGJiKQorI2RlZmluZQlSTkRJU19TVEFUVVNfTUVESUFfQ09OTkVDVAljY3B1MigweDQwMDEwMDBiKQorI2RlZmluZQlSTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVAljY3B1MigweDQwMDEwMDBjKQorCisKK3N0cnVjdCBybmRpc19kYXRhX2hkciB7CisJX19sZTMyCW1zZ190eXBlOwkJLyogUk5ESVNfTVNHX1BBQ0tFVCAqLworCV9fbGUzMgltc2dfbGVuOwkJLy8gcm5kaXNfZGF0YV9oZHIgKyBkYXRhX2xlbiArIHBhZAorCV9fbGUzMglkYXRhX29mZnNldDsJCS8vIDM2IC0tIHJpZ2h0IGFmdGVyIGhlYWRlcgorCV9fbGUzMglkYXRhX2xlbjsJCS8vIC4uLiByZWFsIHBhY2tldCBzaXplCisKKwlfX2xlMzIJb29iX2RhdGFfb2Zmc2V0OwkvLyB6ZXJvCisJX19sZTMyCW9vYl9kYXRhX2xlbjsJCS8vIHplcm8KKwlfX2xlMzIJbnVtX29vYjsJCS8vIHplcm8KKwlfX2xlMzIJcGFja2V0X2RhdGFfb2Zmc2V0OwkvLyB6ZXJvCisKKwlfX2xlMzIJcGFja2V0X2RhdGFfbGVuOwkvLyB6ZXJvCisJX19sZTMyCXZjX2hhbmRsZTsJCS8vIHplcm8KKwlfX2xlMzIJcmVzZXJ2ZWQ7CQkvLyB6ZXJvCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHJuZGlzX2luaXQgewkJLyogT1VUICovCisJLy8gaGVhZGVyIGFuZDoKKwlfX2xlMzIJbXNnX3R5cGU7CQkJLyogUk5ESVNfTVNHX0lOSVQgKi8KKwlfX2xlMzIJbXNnX2xlbjsJCQkvLyAyNAorCV9fbGUzMglyZXF1ZXN0X2lkOworCV9fbGUzMgltYWpvcl92ZXJzaW9uOwkJCS8vIG9mIHJuZGlzICgxLjApCisJX19sZTMyCW1pbm9yX3ZlcnNpb247CisJX19sZTMyCW1heF90cmFuc2Zlcl9zaXplOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBybmRpc19pbml0X2MgewkJLyogSU4gKi8KKwkvLyBoZWFkZXIgYW5kOgorCV9fbGUzMgltc2dfdHlwZTsJCQkvKiBSTkRJU19NU0dfSU5JVF9DICovCisJX19sZTMyCW1zZ19sZW47CisJX19sZTMyCXJlcXVlc3RfaWQ7CisJX19sZTMyCXN0YXR1czsKKwlfX2xlMzIJbWFqb3JfdmVyc2lvbjsJCQkvLyBvZiBybmRpcyAoMS4wKQorCV9fbGUzMgltaW5vcl92ZXJzaW9uOworCV9fbGUzMglkZXZpY2VfZmxhZ3M7CisJX19sZTMyCW1lZGl1bTsJCQkJLy8gemVybyA9PSA4MDIuMworCV9fbGUzMgltYXhfcGFja2V0c19wZXJfbWVzc2FnZTsKKwlfX2xlMzIJbWF4X3RyYW5zZmVyX3NpemU7CisJX19sZTMyCXBhY2tldF9hbGlnbm1lbnQ7CQkvLyBtYXggNzsgKDE8PG4pIGJ5dGVzCisJX19sZTMyCWFmX2xpc3Rfb2Zmc2V0OwkJCS8vIHplcm8KKwlfX2xlMzIJYWZfbGlzdF9zaXplOwkJCS8vIHplcm8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgcm5kaXNfaGFsdCB7CQkvKiBPVVQgKG5vIHJlcGx5KSAqLworCS8vIGhlYWRlciBhbmQ6CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR19IQUxUICovCisJX19sZTMyCW1zZ19sZW47CisJX19sZTMyCXJlcXVlc3RfaWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHJuZGlzX3F1ZXJ5IHsJCS8qIE9VVCAqLworCS8vIGhlYWRlciBhbmQ6CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR19RVUVSWSAqLworCV9fbGUzMgltc2dfbGVuOworCV9fbGUzMglyZXF1ZXN0X2lkOworCV9fbGUzMglvaWQ7CisJX19sZTMyCWxlbjsKKwlfX2xlMzIJb2Zmc2V0OworLyo/Ki8JX19sZTMyCWhhbmRsZTsJCQkJLy8gemVybworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBybmRpc19xdWVyeV9jIHsJCS8qIElOICovCisJLy8gaGVhZGVyIGFuZDoKKwlfX2xlMzIJbXNnX3R5cGU7CQkJLyogUk5ESVNfTVNHX1FVRVJZX0MgKi8KKwlfX2xlMzIJbXNnX2xlbjsKKwlfX2xlMzIJcmVxdWVzdF9pZDsKKwlfX2xlMzIJc3RhdHVzOworCV9fbGUzMglsZW47CisJX19sZTMyCW9mZnNldDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgcm5kaXNfc2V0IHsJCS8qIE9VVCAqLworCS8vIGhlYWRlciBhbmQ6CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR19TRVQgKi8KKwlfX2xlMzIJbXNnX2xlbjsKKwlfX2xlMzIJcmVxdWVzdF9pZDsKKwlfX2xlMzIJb2lkOworCV9fbGUzMglsZW47CisJX19sZTMyCW9mZnNldDsKKy8qPyovCV9fbGUzMgloYW5kbGU7CQkJCS8vIHplcm8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgcm5kaXNfc2V0X2MgewkJLyogSU4gKi8KKwkvLyBoZWFkZXIgYW5kOgorCV9fbGUzMgltc2dfdHlwZTsJCQkvKiBSTkRJU19NU0dfU0VUX0MgKi8KKwlfX2xlMzIJbXNnX2xlbjsKKwlfX2xlMzIJcmVxdWVzdF9pZDsKKwlfX2xlMzIJc3RhdHVzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBybmRpc19yZXNldCB7CQkvKiBJTiAqLworCS8vIGhlYWRlciBhbmQ6CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR19SRVNFVCAqLworCV9fbGUzMgltc2dfbGVuOworCV9fbGUzMglyZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgcm5kaXNfcmVzZXRfYyB7CQkvKiBPVVQgKi8KKwkvLyBoZWFkZXIgYW5kOgorCV9fbGUzMgltc2dfdHlwZTsJCQkvKiBSTkRJU19NU0dfUkVTRVRfQyAqLworCV9fbGUzMgltc2dfbGVuOworCV9fbGUzMglzdGF0dXM7CisJX19sZTMyCWFkZHJlc3NpbmdfbG9zdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgcm5kaXNfaW5kaWNhdGUgewkJLyogSU4gKHVucmVxdWVzdGVkKSAqLworCS8vIGhlYWRlciBhbmQ6CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR19JTkRJQ0FURSAqLworCV9fbGUzMgltc2dfbGVuOworCV9fbGUzMglzdGF0dXM7CisJX19sZTMyCWxlbmd0aDsKKwlfX2xlMzIJb2Zmc2V0OworLyoqLwlfX2xlMzIJZGlhZ19zdGF0dXM7CisJX19sZTMyCWVycm9yX29mZnNldDsKKy8qKi8JX19sZTMyCW1lc3NhZ2U7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHJuZGlzX2tlZXBhbGl2ZSB7CS8qIE9VVCAob3B0aW9uYWxseSBJTikgKi8KKwkvLyBoZWFkZXIgYW5kOgorCV9fbGUzMgltc2dfdHlwZTsJCQkvKiBSTkRJU19NU0dfS0VFUEFMSVZFICovCisJX19sZTMyCW1zZ19sZW47CisJX19sZTMyCXJlcXVlc3RfaWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHJuZGlzX2tlZXBhbGl2ZV9jIHsJLyogSU4gKG9wdGlvbmFsbHkgT1VUKSAqLworCS8vIGhlYWRlciBhbmQ6CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR19LRUVQQUxJVkVfQyAqLworCV9fbGUzMgltc2dfbGVuOworCV9fbGUzMglyZXF1ZXN0X2lkOworCV9fbGUzMglzdGF0dXM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogTk9URTogIGFib3V0IDMwIE9JRHMgYXJlICJtYW5kYXRvcnkiIGZvciBwZXJpcGhlcmFscyB0byBzdXBwb3J0IC4uLiBhbmQKKyAqIHRoZXJlIGFyZSBnb2JzIG1vcmUgdGhhdCBtYXkgb3B0aW9uYWxseSBiZSBzdXBwb3J0ZWQuICBXZSdsbCBhdm9pZCBhcyBtdWNoCisgKiBvZiB0aGF0IG1lc3MgYXMgcG9zc2libGUuCisgKi8KKyNkZWZpbmUgT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTCWNjcHUyKDB4MDEwMTAxMDEpCisjZGVmaW5lIE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSCWNjcHUyKDB4MDAwMTAxMGUpCisKKy8qCisgKiBSTkRJUyBub3RpZmljYXRpb25zIGZyb20gZGV2aWNlOiBjb21tYW5kIGNvbXBsZXRpb247ICJyZXZlcnNlIgorICoga2VlcGFsaXZlczsgZXRjCisgKi8KK3N0YXRpYyB2b2lkIHJuZGlzX3N0YXR1cyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlkZXZkYmcoZGV2LCAicm5kaXMgc3RhdHVzIHVyYiwgbGVuICVkIHN0YXQgJWQiLAorCQl1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+c3RhdHVzKTsKKwkvLyBGSVhNRSBmb3Iga2VlcGFsaXZlcywgcmVzcG9uZCBpbW1lZGlhdGVseSAoYXN5bmNocm9ub3VzbHkpCisJLy8gaWYgbm90IGFuIFJORElTIHN0YXR1cywgZG8gbGlrZSBjZGNfc3RhdHVzKGRldix1cmIpIGRvZXMKK30KKworLyoKKyAqIFJQQyBkb25lIFJORElTLXN0eWxlLiAgQ2FsbGVyIGd1YXJhbnRlZXM6CisgKiAtIG1lc3NhZ2UgaXMgcHJvcGVybHkgYnl0ZXN3YXBwZWQKKyAqIC0gdGhlcmUncyBubyBvdGhlciByZXF1ZXN0IHBlbmRpbmcKKyAqIC0gYnVmIGNhbiBob2xkIHVwIHRvIDFLQiByZXNwb25zZSAocmVxdWlyZWQgYnkgUk5ESVMgc3BlYykKKyAqIE9uIHJldHVybiwgdGhlIGZpcnN0IGZldyBlbnRyaWVzIGFyZSBhbHJlYWR5IGJ5dGVzd2FwcGVkLgorICoKKyAqIENhbGwgY29udGV4dCBpcyBsaWtlbHkgcHJvYmUoKSwgYmVmb3JlIGludGVyZmFjZSBuYW1lIGlzIGtub3duLAorICogd2hpY2ggaXMgd2h5IHdlIHdvbid0IHRyeSB0byB1c2UgaXQgaW4gdGhlIGRpYWdub3N0aWNzLgorICovCitzdGF0aWMgaW50IHJuZGlzX2NvbW1hbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgcm5kaXNfbXNnX2hkciAqYnVmKQoreworCXN0cnVjdCBjZGNfc3RhdGUJKmluZm8gPSAodm9pZCAqKSAmZGV2LT5kYXRhOworCWludAkJCXJldHZhbDsKKwl1bnNpZ25lZAkJY291bnQ7CisJX19sZTMyCQkJcnNwOworCXUzMgkJCXhpZCA9IDAsIG1zZ19sZW4sIHJlcXVlc3RfaWQ7CisKKwkvKiBSRVZJU0lUIHdoZW4gdGhpcyBnZXRzIGNhbGxlZCBmcm9tIGNvbnRleHRzIG90aGVyIHRoYW4gcHJvYmUoKSBvcgorCSAqIGRpc2Nvbm5lY3QoKTogZWl0aGVyIHNlcmlhbGl6ZSwgb3IgZGlzcGF0Y2ggcmVzcG9uc2VzIG9uIHhpZAorCSAqLworCisJLyogSXNzdWUgdGhlIHJlcXVlc3Q7IGRvbid0IGJvdGhlciBieXRlc3dhcHBpbmcgb3VyIHhpZCAqLworCWlmIChsaWtlbHkoYnVmLT5tc2dfdHlwZSAhPSBSTkRJU19NU0dfSEFMVAorCQkJJiYgYnVmLT5tc2dfdHlwZSAhPSBSTkRJU19NU0dfUkVTRVQpKSB7CisJCXhpZCA9IGRldi0+eGlkKys7CisJCWlmICgheGlkKQorCQkJeGlkID0gZGV2LT54aWQrKzsKKwkJYnVmLT5yZXF1ZXN0X2lkID0gKF9fZm9yY2UgX19sZTMyKSB4aWQ7CisJfQorCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsCisJCXVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQlVU0JfQ0RDX1NFTkRfRU5DQVBTVUxBVEVEX0NPTU1BTkQsCisJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJMCwgaW5mby0+dS0+Yk1hc3RlckludGVyZmFjZTAsCisJCWJ1ZiwgbGUzMl90b19jcHUoYnVmLT5tc2dfbGVuKSwKKwkJUk5ESVNfQ09OVFJPTF9USU1FT1VUX01TKTsKKwlpZiAodW5saWtlbHkocmV0dmFsIDwgMCB8fCB4aWQgPT0gMCkpCisJCXJldHVybiByZXR2YWw7CisKKwkvLyBGSVhNRSBTZWVtcyBsaWtlIHNvbWUgZGV2aWNlcyBkaXNjYXJkIHJlc3BvbnNlcyB3aGVuCisJLy8gd2UgdGltZSBvdXQgYW5kIGNhbmNlbCBvdXIgImdldCByZXNwb25zZSIgcmVxdWVzdHMuLi4KKwkvLyBzbywgdGhpcyBpcyBmcmFnaWxlLiAgUHJvYmFibHkgbmVlZCB0byBwb2xsIGZvciBzdGF0dXMuCisKKwkvKiBpZ25vcmUgc3RhdHVzIGVuZHBvaW50LCBqdXN0IHBvbGwgdGhlIGNvbnRyb2wgY2hhbm5lbDsKKwkgKiB0aGUgcmVxdWVzdCBwcm9iYWJseSBjb21wbGV0ZWQgaW1tZWRpYXRlbHkKKwkgKi8KKwlyc3AgPSBidWYtPm1zZ190eXBlIHwgUk5ESVNfTVNHX0NPTVBMRVRJT047CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTA7IGNvdW50KyspIHsKKwkJbWVtc2V0KGJ1ZiwgMCwgMTAyNCk7CisJCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsCisJCQl1c2JfcmN2Y3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKKwkJCVVTQl9DRENfR0VUX0VOQ0FQU1VMQVRFRF9SRVNQT05TRSwKKwkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCQkwLCBpbmZvLT51LT5iTWFzdGVySW50ZXJmYWNlMCwKKwkJCWJ1ZiwgMTAyNCwKKwkJCVJORElTX0NPTlRST0xfVElNRU9VVF9NUyk7CisJCWlmIChsaWtlbHkocmV0dmFsID49IDgpKSB7CisJCQltc2dfbGVuID0gbGUzMl90b19jcHUoYnVmLT5tc2dfbGVuKTsKKwkJCXJlcXVlc3RfaWQgPSAoX19mb3JjZSB1MzIpIGJ1Zi0+cmVxdWVzdF9pZDsKKwkJCWlmIChsaWtlbHkoYnVmLT5tc2dfdHlwZSA9PSByc3ApKSB7CisJCQkJaWYgKGxpa2VseShyZXF1ZXN0X2lkID09IHhpZCkpIHsKKwkJCQkJaWYgKHVubGlrZWx5KHJzcCA9PSBSTkRJU19NU0dfUkVTRVRfQykpCisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJaWYgKGxpa2VseShSTkRJU19TVEFUVVNfU1VDQ0VTUworCQkJCQkJCT09IGJ1Zi0+c3RhdHVzKSkKKwkJCQkJCXJldHVybiAwOworCQkJCQlkZXZfZGJnKCZpbmZvLT5jb250cm9sLT5kZXYsCisJCQkJCQkicm5kaXMgcmVwbHkgc3RhdHVzICUwOHhcbiIsCisJCQkJCQlsZTMyX3RvX2NwdShidWYtPnN0YXR1cykpOworCQkJCQlyZXR1cm4gLUVMM1JTVDsKKwkJCQl9CisJCQkJZGV2X2RiZygmaW5mby0+Y29udHJvbC0+ZGV2LAorCQkJCQkicm5kaXMgcmVwbHkgaWQgJWQgZXhwZWN0ZWQgJWRcbiIsCisJCQkJCXJlcXVlc3RfaWQsIHhpZCk7CisJCQkJLyogdGhlbiBsaWtlbHkgcmV0cnkgKi8KKwkJCX0gZWxzZSBzd2l0Y2ggKGJ1Zi0+bXNnX3R5cGUpIHsKKwkJCWNhc2UgUk5ESVNfTVNHX0lORElDQVRFOiB7CS8qIGZhdWx0ICovCisJCQkJLy8gc3RydWN0IHJuZGlzX2luZGljYXRlICptc2cgPSAodm9pZCAqKWJ1ZjsKKwkJCQlkZXZfaW5mbygmaW5mby0+Y29udHJvbC0+ZGV2LAorCQkJCQkgInJuZGlzIGZhdWx0IGluZGljYXRpb25cbiIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUk5ESVNfTVNHX0tFRVBBTElWRTogewkvKiBwaW5nICovCisJCQkJc3RydWN0IHJuZGlzX2tlZXBhbGl2ZV9jICptc2cgPSAodm9pZCAqKWJ1ZjsKKworCQkJCW1zZy0+bXNnX3R5cGUgPSBSTkRJU19NU0dfS0VFUEFMSVZFX0M7CisJCQkJbXNnLT5tc2dfbGVuID0gY2NwdTIoc2l6ZW9mICptc2cpOworCQkJCW1zZy0+c3RhdHVzID0gUk5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKGRldi0+dWRldiwKKwkJCQkJdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCksCisJCQkJCVVTQl9DRENfU0VORF9FTkNBUFNVTEFURURfQ09NTUFORCwKKwkJCQkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCQkwLCBpbmZvLT51LT5iTWFzdGVySW50ZXJmYWNlMCwKKwkJCQkJbXNnLCBzaXplb2YgKm1zZywKKwkJCQkJUk5ESVNfQ09OVFJPTF9USU1FT1VUX01TKTsKKwkJCQlpZiAodW5saWtlbHkocmV0dmFsIDwgMCkpCisJCQkJCWRldl9kYmcoJmluZm8tPmNvbnRyb2wtPmRldiwKKwkJCQkJCSJybmRpcyBrZWVwYWxpdmUgZXJyICVkXG4iLAorCQkJCQkJcmV0dmFsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWRldl9kYmcoJmluZm8tPmNvbnRyb2wtPmRldiwKKwkJCQkJInVuZXhwZWN0ZWQgcm5kaXMgbXNnICUwOHggbGVuICVkXG4iLAorCQkJCQlsZTMyX3RvX2NwdShidWYtPm1zZ190eXBlKSwgbXNnX2xlbik7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBkZXZpY2UgcHJvYmFibHkgaXNzdWVkIGEgcHJvdG9jb2wgc3RhbGw7IGlnbm9yZSAqLworCQkJZGV2X2RiZygmaW5mby0+Y29udHJvbC0+ZGV2LAorCQkJCSJybmRpcyByZXNwb25zZSBlcnJvciwgY29kZSAlZFxuIiwgcmV0dmFsKTsKKwkJfQorCQltc2xlZXAoMik7CisJfQorCWRldl9kYmcoJmluZm8tPmNvbnRyb2wtPmRldiwgInJuZGlzIHJlc3BvbnNlIHRpbWVvdXRcbiIpOworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW50IHJuZGlzX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQJCQlyZXR2YWw7CisJc3RydWN0IG5ldF9kZXZpY2UJKm5ldCA9IGRldi0+bmV0OworCXVuaW9uIHsKKwkJdm9pZAkJCSpidWY7CisJCXN0cnVjdCBybmRpc19tc2dfaGRyCSpoZWFkZXI7CisJCXN0cnVjdCBybmRpc19pbml0CSppbml0OworCQlzdHJ1Y3Qgcm5kaXNfaW5pdF9jCSppbml0X2M7CisJCXN0cnVjdCBybmRpc19xdWVyeQkqZ2V0OworCQlzdHJ1Y3Qgcm5kaXNfcXVlcnlfYwkqZ2V0X2M7CisJCXN0cnVjdCBybmRpc19zZXQJKnNldDsKKwkJc3RydWN0IHJuZGlzX3NldF9jCSpzZXRfYzsKKwl9IHU7CisJdTMyCQkJdG1wOworCisJLyogd2UgY2FuJ3QgcmVseSBvbiBpL28gZnJvbSBzdGFjayB3b3JraW5nLCBvciBzdGFjayBhbGxvY2F0aW9uICovCisJdS5idWYgPSBrbWFsbG9jKDEwMjQsIEdGUF9LRVJORUwpOworCWlmICghdS5idWYpCisJCXJldHVybiAtRU5PTUVNOworCXJldHZhbCA9IHVzYm5ldF9nZW5lcmljX2NkY19iaW5kKGRldiwgaW50Zik7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZG9uZTsKKworCW5ldC0+aGFyZF9oZWFkZXJfbGVuICs9IHNpemVvZiAoc3RydWN0IHJuZGlzX2RhdGFfaGRyKTsKKworCS8qIGluaXRpYWxpemU7IG1heCB0cmFuc2ZlciBpcyAxNktCIGF0IGZ1bGwgc3BlZWQgKi8KKwl1LmluaXQtPm1zZ190eXBlID0gUk5ESVNfTVNHX0lOSVQ7CisJdS5pbml0LT5tc2dfbGVuID0gY2NwdTIoc2l6ZW9mICp1LmluaXQpOworCXUuaW5pdC0+bWFqb3JfdmVyc2lvbiA9IGNjcHUyKDEpOworCXUuaW5pdC0+bWlub3JfdmVyc2lvbiA9IGNjcHUyKDApOworCXUuaW5pdC0+bWF4X3RyYW5zZmVyX3NpemUgPSBjY3B1MihuZXQtPm10dSArIG5ldC0+aGFyZF9oZWFkZXJfbGVuKTsKKworCXJldHZhbCA9IHJuZGlzX2NvbW1hbmQoZGV2LCB1LmhlYWRlcik7CisJaWYgKHVubGlrZWx5KHJldHZhbCA8IDApKSB7CisJCS8qIGl0IG1pZ2h0IG5vdCBldmVuIGJlIGFuIFJORElTIGRldmljZSEhICovCisJCWRldl9lcnIoJmludGYtPmRldiwgIlJORElTIGluaXQgZmFpbGVkLCAlZFxuIiwgcmV0dmFsKTsKK2ZhaWw6CisJCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoZHJpdmVyX29mKGludGYpLAorCQkJKChzdHJ1Y3QgY2RjX3N0YXRlICopJihkZXYtPmRhdGEpKS0+ZGF0YSk7CisJCWdvdG8gZG9uZTsKKwl9CisJZGV2LT5oYXJkX210dSA9IGxlMzJfdG9fY3B1KHUuaW5pdF9jLT5tYXhfdHJhbnNmZXJfc2l6ZSk7CisJLyogUkVWSVNJVDogIHBlcmlwaGVyYWwgImFsaWdubWVudCIgcmVxdWVzdCBpcyBpZ25vcmVkIC4uLiAqLworCWRldl9kYmcoJmludGYtPmRldiwgImhhcmQgbXR1ICV1LCBhbGlnbiAlZFxuIiwgZGV2LT5oYXJkX210dSwKKwkJMSA8PCBsZTMyX3RvX2NwdSh1LmluaXRfYy0+cGFja2V0X2FsaWdubWVudCkpOworCisJLyogZ2V0IGRlc2lnbmF0ZWQgaG9zdCBldGhlcm5ldCBhZGRyZXNzICovCisJbWVtc2V0KHUuZ2V0LCAwLCBzaXplb2YgKnUuZ2V0KTsKKwl1LmdldC0+bXNnX3R5cGUgPSBSTkRJU19NU0dfUVVFUlk7CisJdS5nZXQtPm1zZ19sZW4gPSBjY3B1MihzaXplb2YgKnUuZ2V0KTsKKwl1LmdldC0+b2lkID0gT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTOworCisJcmV0dmFsID0gcm5kaXNfY29tbWFuZChkZXYsIHUuaGVhZGVyKTsKKwlpZiAodW5saWtlbHkocmV0dmFsIDwgMCkpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAicm5kaXMgZ2V0IGV0aGFkZHIsICVkXG4iLCByZXR2YWwpOworCQlnb3RvIGZhaWw7CisJfQorCXRtcCA9IGxlMzJfdG9fY3B1KHUuZ2V0X2MtPm9mZnNldCk7CisJaWYgKHVubGlrZWx5KCh0bXAgKyA4KSA+ICgxMDI0IC0gRVRIX0FMRU4pCisJCQl8fCB1LmdldF9jLT5sZW4gIT0gY2NwdTIoRVRIX0FMRU4pKSkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJybmRpcyBldGhhZGRyIG9mZiAlZCBsZW4gJWQgP1xuIiwKKwkJCXRtcCwgbGUzMl90b19jcHUodS5nZXRfYy0+bGVuKSk7CisJCXJldHZhbCA9IC1FRE9NOworCQlnb3RvIGZhaWw7CisJfQorCW1lbWNweShuZXQtPmRldl9hZGRyLCB0bXAgKyAoY2hhciAqKSZ1LmdldF9jLT5yZXF1ZXN0X2lkLCBFVEhfQUxFTik7CisKKwkvKiBzZXQgYSBub256ZXJvIGZpbHRlciB0byBlbmFibGUgZGF0YSB0cmFuc2ZlcnMgKi8KKwltZW1zZXQodS5zZXQsIDAsIHNpemVvZiAqdS5zZXQpOworCXUuc2V0LT5tc2dfdHlwZSA9IFJORElTX01TR19TRVQ7CisJdS5zZXQtPm1zZ19sZW4gPSBjY3B1Mig0ICsgc2l6ZW9mICp1LnNldCk7CisJdS5zZXQtPm9pZCA9IE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSOworCXUuc2V0LT5sZW4gPSBjY3B1Mig0KTsKKwl1LnNldC0+b2Zmc2V0ID0gY2NwdTIoKHNpemVvZiAqdS5zZXQpIC0gOCk7CisJKihfX2xlMzIgKikodS5idWYgKyBzaXplb2YgKnUuc2V0KSA9IGNjcHUyKERFRkFVTFRfRklMVEVSKTsKKworCXJldHZhbCA9IHJuZGlzX2NvbW1hbmQoZGV2LCB1LmhlYWRlcik7CisJaWYgKHVubGlrZWx5KHJldHZhbCA8IDApKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgInJuZGlzIHNldCBwYWNrZXQgZmlsdGVyLCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHZhbCA9IDA7Citkb25lOgorCWtmcmVlKHUuYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBybmRpc191bmJpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3Qgcm5kaXNfaGFsdAkqaGFsdDsKKworCS8qIHRyeSB0byBjbGVhciBhbnkgcm5kaXMgc3RhdGUvYWN0aXZpdHkgKG5vIGkvbyBmcm9tIHN0YWNrISkgKi8KKwloYWx0ID0ga2NhbGxvYygxLCBzaXplb2YgKmhhbHQsIFNMQUJfS0VSTkVMKTsKKwlpZiAoaGFsdCkgeworCQloYWx0LT5tc2dfdHlwZSA9IFJORElTX01TR19IQUxUOworCQloYWx0LT5tc2dfbGVuID0gY2NwdTIoc2l6ZW9mICpoYWx0KTsKKwkJKHZvaWQpIHJuZGlzX2NvbW1hbmQoZGV2LCAodm9pZCAqKWhhbHQpOworCQlrZnJlZShoYWx0KTsKKwl9CisKKwlyZXR1cm4gdXNibmV0X2NkY191bmJpbmQoZGV2LCBpbnRmKTsKK30KKworLyoKKyAqIERBVEEgLS0gaG9zdCBtdXN0IG5vdCB3cml0ZSB6bHBzCisgKi8KK3N0YXRpYyBpbnQgcm5kaXNfcnhfZml4dXAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIHBlcmlwaGVyYWwgbWF5IGhhdmUgYmF0Y2hlZCBwYWNrZXRzIHRvIHVzLi4uICovCisJd2hpbGUgKGxpa2VseShza2ItPmxlbikpIHsKKwkJc3RydWN0IHJuZGlzX2RhdGFfaGRyCSpoZHIgPSAodm9pZCAqKXNrYi0+ZGF0YTsKKwkJc3RydWN0IHNrX2J1ZmYJCSpza2IyOworCQl1MzIJCQltc2dfbGVuLCBkYXRhX29mZnNldCwgZGF0YV9sZW47CisKKwkJbXNnX2xlbiA9IGxlMzJfdG9fY3B1KGhkci0+bXNnX2xlbik7CisJCWRhdGFfb2Zmc2V0ID0gbGUzMl90b19jcHUoaGRyLT5kYXRhX29mZnNldCk7CisJCWRhdGFfbGVuID0gbGUzMl90b19jcHUoaGRyLT5kYXRhX2xlbik7CisKKwkJLyogZG9uJ3QgY2hva2UgaWYgd2Ugc2VlIG9vYiwgcGVyLXBhY2tldCBkYXRhLCBldGMgKi8KKwkJaWYgKHVubGlrZWx5KGhkci0+bXNnX3R5cGUgIT0gUk5ESVNfTVNHX1BBQ0tFVAorCQkJCXx8IHNrYi0+bGVuIDwgbXNnX2xlbgorCQkJCXx8IChkYXRhX29mZnNldCArIGRhdGFfbGVuICsgOCkgPiBtc2dfbGVuKSkgeworCQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWRldmRiZyhkZXYsICJiYWQgcm5kaXMgbWVzc2FnZSAlZC8lZC8lZC8lZCwgbGVuICVkIiwKKwkJCQlsZTMyX3RvX2NwdShoZHItPm1zZ190eXBlKSwKKwkJCQltc2dfbGVuLCBkYXRhX29mZnNldCwgZGF0YV9sZW4sIHNrYi0+bGVuKTsKKwkJCXJldHVybiAwOworCQl9CisJCXNrYl9wdWxsKHNrYiwgOCArIGRhdGFfb2Zmc2V0KTsKKworCQkvKiBhdCBtb3N0IG9uZSBwYWNrZXQgbGVmdD8gKi8KKwkJaWYgKGxpa2VseSgoZGF0YV9sZW4gLSBza2ItPmxlbikgPD0gc2l6ZW9mICpoZHIpKSB7CisJCQlza2JfdHJpbShza2IsIGRhdGFfbGVuKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogdHJ5IHRvIHJldHVybiBhbGwgdGhlIHBhY2tldHMgaW4gdGhlIGJhdGNoICovCisJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHVubGlrZWx5KCFza2IyKSkKKwkJCWJyZWFrOworCQlza2JfcHVsbChza2IsIG1zZ19sZW4gLSBzaXplb2YgKmhkcik7CisJCXNrYl90cmltKHNrYjIsIGRhdGFfbGVuKTsKKwkJdXNibmV0X3NrYl9yZXR1cm4oZGV2LCBza2IyKTsKKwl9CisKKwkvKiBjYWxsZXIgd2lsbCB1c2JuZXRfc2tiX3JldHVybiB0aGUgcmVtYWluaW5nIHBhY2tldCAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorcm5kaXNfdHhfZml4dXAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3Qgcm5kaXNfZGF0YV9oZHIJKmhkcjsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjI7CisJdW5zaWduZWQJCWxlbiA9IHNrYi0+bGVuOworCisJaWYgKGxpa2VseSghc2tiX2Nsb25lZChza2IpKSkgeworCQlpbnQJcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOworCisJCS8qIGVub3VnaCBoZWFkIHJvb20gYXMtaXM/ICovCisJCWlmICh1bmxpa2VseSgoc2l6ZW9mICpoZHIpIDw9IHJvb20pKQorCQkJZ290byBmaWxsOworCisJCS8qIGVub3VnaCByb29tLCBidXQgbmVlZHMgdG8gYmUgcmVhZGp1c3RlZD8gKi8KKwkJcm9vbSArPSBza2JfdGFpbHJvb20oc2tiKTsKKwkJaWYgKGxpa2VseSgoc2l6ZW9mICpoZHIpIDw9IHJvb20pKSB7CisJCQlza2ItPmRhdGEgPSBtZW1tb3ZlKHNrYi0+aGVhZCArIHNpemVvZiAqaGRyLAorCQkJCQkgICAgc2tiLT5kYXRhLCBsZW4pOworCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgbGVuOworCQkJZ290byBmaWxsOworCQl9CisJfQorCisJLyogY3JlYXRlIGEgbmV3IHNrYiwgd2l0aCB0aGUgY29ycmVjdCBzaXplIChhbmQgdGFpbHBhZCkgKi8KKwlza2IyID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgc2l6ZW9mICpoZHIsIDEsIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWlmICh1bmxpa2VseSghc2tiMikpCisJCXJldHVybiBza2IyOworCXNrYiA9IHNrYjI7CisKKwkvKiBmaWxsIG91dCB0aGUgUk5ESVMgaGVhZGVyLiAgd2Ugd29uJ3QgYm90aGVyIHRyeWluZyB0byBiYXRjaAorCSAqIHBhY2tldHM7IExpbnV4IG1pbmltaXplcyB3YXN0ZWQgYmFuZHdpZHRoIHRocm91Z2ggdHggcXVldWVzLgorCSAqLworZmlsbDoKKwloZHIgPSAodm9pZCAqKSBfX3NrYl9wdXNoKHNrYiwgc2l6ZW9mICpoZHIpOworCW1lbXNldChoZHIsIDAsIHNpemVvZiAqaGRyKTsKKwloZHItPm1zZ190eXBlID0gUk5ESVNfTVNHX1BBQ0tFVDsKKwloZHItPm1zZ19sZW4gPSBjcHVfdG9fbGUzMihza2ItPmxlbik7CisJaGRyLT5kYXRhX29mZnNldCA9IGNjcHUyKHNpemVvZigqaGRyKSAtIDgpOworCWhkci0+ZGF0YV9sZW4gPSBjcHVfdG9fbGUzMihsZW4pOworCisJLyogRklYTUUgbWFrZSB0aGUgbGFzdCBwYWNrZXQgYWx3YXlzIGJlIHNob3J0IC4uLiAqLworCXJldHVybiBza2I7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwlybmRpc19pbmZvID0geworCS5kZXNjcmlwdGlvbiA9CSJSTkRJUyBkZXZpY2UiLAorCS5mbGFncyA9CUZMQUdfRVRIRVIgfCBGTEFHX0ZSQU1JTkdfUk4sCisJLmJpbmQgPQkJcm5kaXNfYmluZCwKKwkudW5iaW5kID0Jcm5kaXNfdW5iaW5kLAorCS5zdGF0dXMgPQlybmRpc19zdGF0dXMsCisJLnJ4X2ZpeHVwID0Jcm5kaXNfcnhfZml4dXAsCisJLnR4X2ZpeHVwID0Jcm5kaXNfdHhfZml4dXAsCit9OworCisjdW5kZWYgY2NwdTIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQJcHJvZHVjdHMgW10gPSB7Cit7CisJLyogUk5ESVMgaXMgTVNGVCdzIHVuLW9mZmljaWFsIHZhcmlhbnQgb2YgQ0RDIEFDTSAqLworCVVTQl9JTlRFUkZBQ0VfSU5GTyhVU0JfQ0xBU1NfQ09NTSwgMiAvKiBBQ00gKi8sIDB4MGZmKSwKKwkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJnJuZGlzX2luZm8sCit9LAorCXsgfSwJCS8vIEVORAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBybmRpc19kcml2ZXIgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm5hbWUgPQkJInJuZGlzX2hvc3QiLAorCS5pZF90YWJsZSA9CXByb2R1Y3RzLAorCS5wcm9iZSA9CXVzYm5ldF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYm5ldF9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0JdXNibmV0X3N1c3BlbmQsCisJLnJlc3VtZSA9CXVzYm5ldF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBybmRpc19pbml0KHZvaWQpCit7CisgCXJldHVybiB1c2JfcmVnaXN0ZXIoJnJuZGlzX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChybmRpc19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHJuZGlzX2V4aXQodm9pZCkKK3sKKyAJdXNiX2RlcmVnaXN0ZXIoJnJuZGlzX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChybmRpc19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRGF2aWQgQnJvd25lbGwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVVNCIEhvc3Qgc2lkZSBSTkRJUyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMgYi9kcml2ZXJzL3VzYi9uZXQvcnRsODE1MC5jCmluZGV4IDU5YWI0MGUuLmMzZDRlMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3J0bDgxNTAuYwpAQCAtNjUzLDcgKzY1Myw2IEBACiB7CiAJcnRsODE1MF90ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXdhcm4oIiVzOiBUeCB0aW1lb3V0LiIsIG5ldGRldi0+bmFtZSk7Ci0JZGV2LT50eF91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAJdXNiX3VubGlua191cmIoZGV2LT50eF91cmIpOwogCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMgYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMKaW5kZXggYTJmNjcyNC4uNmM0NjA5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYwpAQCAtMSwxMCArMSw3IEBACiAvKgotICogVVNCIE5ldHdvcmtpbmcgTGlua3MKLSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA1IGJ5IERhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PgorICogVVNCIE5ldHdvcmsgZHJpdmVyIGluZnJhc3RydWN0dXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBieSBEYXZpZCBCcm93bmVsbAogICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgRGF2aWQgSG9sbGlzIDxkaG9sbGlzQGRhdmVob2xsaXMuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDA1IFBoaWwgQ2hhbmcgPHBjaGFuZzIzQHNiY2dsb2JhbC5uZXQ+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBUaVZvIEluYy4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIzLDk1ICsyMCwxNSBAQAogCiAvKgogICogVGhpcyBpcyBhIGdlbmVyaWMgIlVTQiBuZXR3b3JraW5nIiBmcmFtZXdvcmsgdGhhdCB3b3JrcyB3aXRoIHNldmVyYWwKLSAqIGtpbmRzIG9mIGZ1bGwgYW5kIGhpZ2ggc3BlZWQgbmV0d29ya2luZyBkZXZpY2VzOgorICoga2luZHMgb2YgZnVsbCBhbmQgaGlnaCBzcGVlZCBuZXR3b3JraW5nIGRldmljZXM6ICBob3N0LXRvLWhvc3QgY2FibGVzLAorICogc21hcnQgdXNiIHBlcmlwaGVyYWxzLCBhbmQgYWN0dWFsIEV0aGVybmV0IGFkYXB0ZXJzLgogICoKLSAqICAgKyBVU0IgaG9zdC10by1ob3N0ICJuZXR3b3JrIGNhYmxlcyIsIHVzZWQgZm9yIElQLW92ZXItVVNCIGxpbmtzLgotICogICAgIFRoZXNlIGFyZSBvZnRlbiB1c2VkIGZvciBMYXBsaW5rIHN0eWxlIGNvbm5lY3Rpdml0eSBwcm9kdWN0cy4KLSAqCS0gQW5jaG9yQ2hpcCAyNzIwCi0gKgktIEJlbGtpbiwgZVRFSyAoaW50ZXJvcHMgd2l0aCBXaW4zMiBkcml2ZXJzKQotICoJLSBHZW5lU3lzIEdMNjIwVVNCLUEKLSAqCS0gTmV0Q2hpcCAxMDgwIChpbnRlcm9wZXJhdGVzIHdpdGggTmV0Q2hpcCBXaW4zMiBkcml2ZXJzKQotICoJLSBQcm9saWZpYyBQTC0yMzAxLzIzMDIgKHJlcGxhY2VzICJwbHVzYiIgZHJpdmVyKQotICoJLSBLQyBUZWNobm9sb2d5IEtDMjE5MAotICoKLSAqICAgKyBTbWFydCBVU0IgZGV2aWNlcyBjYW4gc3VwcG9ydCBzdWNoIGxpbmtzIGRpcmVjdGx5LCB1c2luZyBJbnRlcm5ldAotICogICAgIHN0YW5kYXJkIHByb3RvY29scyBpbnN0ZWFkIG9mIHByb3ByaWV0YXJ5IGhvc3QtdG8tZGV2aWNlIGxpbmtzLgotICoJLSBMaW51eCBQREFzIGxpa2UgaVBhcSwgWW9weSwgYW5kIFphdXJ1cwotICoJLSBUaGUgQkxPQiBib290IGxvYWRlciAoZm9yIGRpc2tsZXNzIGJvb3RpbmcpCi0gKgktIExpbnV4ICJnYWRnZXRzIiwgcGVyaGFwcyB1c2luZyBQWEEtMnh4IG9yIE5ldDIyODAgY29udHJvbGxlcnMKLSAqCS0gRGV2aWNlcyB1c2luZyBFUFNPTidzIHNhbXBsZSBVU0IgZmlybXdhcmUKLSAqCS0gQ0RDLUV0aGVybmV0IGNsYXNzIGRldmljZXMsIHN1Y2ggYXMgbWFueSBjYWJsZSBtb2RlbXMKLSAqCi0gKiAgICsgQWRhcHRlcnMgdG8gbmV0d29ya3Mgc3VjaCBhcyBFdGhlcm5ldC4KLSAqCS0gQVg4ODE3WCBiYXNlZCBVU0IgMi4wIHByb2R1Y3RzCi0gKgotICogTGlua3MgdG8gdGhlc2UgZGV2aWNlcyBjYW4gYmUgYnJpZGdlZCB1c2luZyBMaW51eCBFdGhlcm5ldCBicmlkZ2luZy4KLSAqIFdpdGggbWlub3IgZXhjZXB0aW9ucywgdGhlc2UgYWxsIHVzZSBzaW1pbGFyIFVTQiBmcmFtaW5nIGZvciBuZXR3b3JrCi0gKiB0cmFmZmljLCBidXQgbmVlZCBkaWZmZXJlbnQgcHJvdG9jb2xzIGZvciBjb250cm9sIHRyYWZmaWMuCi0gKgotICogVVNCIGRldmljZXMgY2FuIGltcGxlbWVudCB0aGVpciBzaWRlIG9mIHRoaXMgcHJvdG9jb2wgYXQgdGhlIGNvc3QKLSAqIG9mIHR3byBidWxrIGVuZHBvaW50czsgaXQncyBub3QgcmVzdHJpY3RlZCB0byAiY2FibGUiIGFwcGxpY2F0aW9ucy4KLSAqIFNlZSB0aGUgU0ExMTEwLCBaYXVydXMsIG9yIEVQU09OIGRldmljZS9jbGllbnQgc3VwcG9ydCBpbiB0aGlzIGRyaXZlcjsKLSAqIHNsYXZlL3RhcmdldCBkcml2ZXJzIHN1Y2ggYXMgInVzYi1ldGgiIChvbiBtb3N0IFNBLTExMDAgUERBcykgb3IKLSAqICJnX2V0aGVyIiAoaW4gdGhlIExpbnV4ICJnYWRnZXQiIGZyYW1ld29yaykgaW1wbGVtZW50IHRoYXQgYmVoYXZpb3IKLSAqIHdpdGhpbiBkZXZpY2VzLgotICoKLSAqCi0gKiBDSEFOR0VMT0c6Ci0gKgotICogMTMtc2VwLTIwMDAJZXhwZXJpbWVudGFsLCBuZXcKLSAqIDEwLW9jdC0yMDAwCXVzYl9kZXZpY2VfaWQgdGFibGUgY3JlYXRlZC4gCi0gKiAyOC1vY3QtMjAwMAltaXNjIGZpeGVzOyBtb3N0bHksIGRpc2NhcmQgbW9yZSBUVEwtbWFuZ2xlZCByeCBwYWNrZXRzLgotICogMDEtbm92LTIwMDAJdXNiX2RldmljZV9pZCB0YWJsZSBhbmQgcHJvYmluZyBhcGkgdXBkYXRlIGJ5Ci0gKgkJQWRhbSBKLiBSaWNodGVyIDxhZGFtQHlnZ2RyYXNpbC5jb20+LgotICogMTgtZGVjLTIwMDAJKGRiKSB0eCB3YXRjaGRvZywgIm5ldDEwODAiIHJlbmFtaW5nIHRvICJ1c2JuZXQiLCBkZXZpY2VfaW5mbwotICoJCWFuZCBwcm9saWZpYyBzdXBwb3J0LCBpc29sYXRlIG5ldDEwODAtc3BlY2lmaWMgYml0cywgY2xlYW51cC4KLSAqCQlmaXggdW5saW5rX3VyYnMgb29wcyBpbiBEMyBQTSByZXN1bWUgY29kZSBwYXRoLgotICoKLSAqIDAyLWZlYi0yMDAxCShkYikgZml4IHR4IHNrYiBzaGFyaW5nLCBwYWNrZXQgbGVuZ3RoLCBtYXRjaF9mbGFncywgLi4uCi0gKiAwOC1mZWItMjAwMQlzdHViYmVkIGluICJsaW51eGRldiIsIG1heWJlIHRoZSBTQS0xMTAwIGZvbGsgY2FuIHVzZSBpdDsKLSAqCQlBbmNob3JDaGlwcyAyNzIwIHN1cHBvcnQgKGZyb20gc3BlYykgZm9yIHRlc3Rpbmc7Ci0gKgkJZml4IGJpdC1vcmRlcmluZyBwcm9ibGVtIHdpdGggZXRoZXJuZXQgbXVsdGljYXN0IGFkZHIKLSAqIDE5LWZlYi0yMDAxICBTdXBwb3J0IGZvciBjbGVhcmluZyBoYWx0IGNvbmRpdGlvbnMuIFNBMTEwMCBVREMgc3VwcG9ydAotICoJCXVwZGF0ZXMuIE9sZWcgRHJva2luIChncmVlbkBpWGNlbGVyYXRvci5jb20pCi0gKiAyNS1tYXItMjAwMQlNb3JlIFNBLTExMDAgdXBkYXRlcywgaW5jbHVkaW5nIHdvcmthcm91bmQgZm9yIGlwIHByb2JsZW0KLSAqCQlleHBlY3RpbmcgY2xlYXJlZCBza2ItPmNiIGFuZCBmcmFtaW5nIGNoYW5nZSB0byBtYXRjaCBsYXRlc3QKLSAqCQloYW5kaGVsZHMub3JnIHZlcnNpb24gKE9sZWcpLiAgRW5hYmxlIGRldmljZSBJRHMgZnJvbSB0aGUKLSAqCQlXaW4zMiBCZWxraW4gZHJpdmVyOyBvdGhlciBjbGVhbnVwcyAoZGIpLgotICogMTYtanVsLTIwMDEJQnVnZml4ZXMgZm9yIHVoY2kgb29wcy1vbi11bnBsdWcsIEJlbGtpbiBzdXBwb3J0LCB2YXJpb3VzCi0gKgkJY2xlYW51cHMgZm9yIHByb2JsZW1zIG5vdCB5ZXQgc2VlbiBpbiB0aGUgZmllbGQuIChkYikKLSAqIDE3LW9jdC0yMDAxCUhhbmRsZSAiQWR2YW5jZSBVU0JORVQiIHByb2R1Y3QsIGxpa2UgQmVsa2luL2VURUsgZGV2aWNlcywKLSAqCQlmcm9tIElvYW5uaXMgTWF2cm91a2FraXMgPGkubWF2cm91a2FraXNAYnRpbnRlcm5ldC5jb20+OwotICoJCXJ4IHVubGlua3Mgc29tZWhvdyB3ZXJlbid0IGFzeW5jOyBtaW5vciBjbGVhbnVwLgotICogMDMtbm92LTIwMDEJTWVyZ2VkIEdlbmVTeXMgZHJpdmVyOyBvcmlnaW5hbCBjb2RlIGZyb20gSml1bi1KaWUgSHVhbmcKLSAqCQk8aHVhbmdqakBnZW5lc3lzbG9naWMuY29tLnR3PiwgdXBkYXRlZCBieSBTdGFuaXNsYXYgQnJhYmVjCi0gKgkJPHV0eEBwZW5ndWluLmN6Pi4gIE1hZGUgZnJhbWluZyBvcHRpb25zIChOZXRDaGlwL0dlbmVTeXMpCi0gKgkJdGllIG1vc3RseSB0byAoc3ViKWRyaXZlciBpbmZvLiAgV29ya2Fyb3VuZCBzb21lIFBMLTIzMDIKLSAqCQljaGlwcyB0aGF0IHNlZW0gdG8gcmVqZWN0IFNFVF9JTlRFUkZBQ0UgcmVxdWVzdHMuCi0gKgotICogMDYtYXByLTIwMDIJQWRkZWQgZXRodG9vbCBzdXBwb3J0LCBiYXNlZCBvbiBhIHBhdGNoIGZyb20gQnJhZCBIYXJkcy4KLSAqCQlMZXZlbCBvZiBkaWFnbm9zdGljcyBpcyBtb3JlIGNvbmZpZ3VyYWJsZTsgdGhleSB1c2UgZGV2aWNlCi0gKgkJbG9jYXRpb24gKHVzYl9kZXZpY2UtPmRldnBhdGgpIGluc3RlYWQgb2YgYWRkcmVzcyAoMi41KS4KLSAqCQlGb3IgdHhfZml4dXAsIG1lbWZsYWdzIGNhbid0IGJlIE5PSU8uCi0gKiAwNy1tYXktMjAwMglHZW5lcmFsaXplL2NsZWFudXAga2V2ZW50ZCBzdXBwb3J0LCBoYW5kbGluZyByeCBzdGFsbHMgKG1vc3RseQotICoJCWZvciBVU0IgMi4wIFRUcykgYW5kIG1lbW9yeSBzaG9ydGFnZXMgKHBvdGVudGlhbCkgdG9vLiAoZGIpCi0gKgkJVXNlICJsb2NhbGx5IGFzc2lnbmVkIiBJRUVFODAyIGFkZHJlc3Mgc3BhY2UuIChCcmFkIEhhcmRzKQotICogMTgtb2N0LTIwMDIJU3VwcG9ydCBmb3IgWmF1cnVzIChQYXZlbCBNYWNoZWspLCByZWxhdGVkIGNsZWFudXAgKGRiKS4KLSAqIDE0LWRlYy0yMDAyCVJlbW92ZSBaYXVydXMtcHJpdmF0ZSBjcmMzMiBjb2RlIChQYXZlbCk7IDIuNSBvb3BzIGZpeCwKLSAqIAkJY2xlYW51cHMgYW5kIHN0dWJiZWQgUFhBLTI1MCBzdXBwb3J0IChkYiksIGZpeCBmb3IgZnJhbWluZwotICogCQlpc3N1ZXMgb24gWiwgbmV0MTA4MCwgYW5kIGdsNjIwYSAoVG9ieSBNaWxuZSkKLSAqCi0gKiAzMS1tYXItMjAwMwlVc2UgZW5kcG9pbnQgZGVzY3JpcHRvcnM6ICBoaWdoIHNwZWVkIHN1cHBvcnQsIHNpbXBsZXIgc2ExMTAwCi0gKiAJCXZzIHB4YTI1eCwgYW5kIENEQyBFdGhlcm5ldC4gIFRocm90dGxlIGRvd24gbG9nIGZsb29kcyBvbgotICogCQlkaXNjb25uZWN0OyBvdGhlciBjbGVhbnVwcy4gKGRiKSAgRmx1c2ggbmV0MTA4MCBmaWZvcwotICogCQlhZnRlciBzZXZlcmFsIHNlcXVlbnRpYWwgZnJhbWluZyBlcnJvcnMuIChKb2hhbm5lcyBFcmRmZWx0KQotICogMjItYXVnLTIwMDMJQVg4ODE3WCBzdXBwb3J0IChEYXZlIEhvbGxpcykuCi0gKiAxNC1qdW4tMjAwNCAgVHJpdmlhbCBwYXRjaCBmb3IgQVg4ODE3WCBiYXNlZCBCdWZmYWxvIExVQS1VMi1LVFggaW4gSmFwYW4KLSAqCQkoTmVpbCBCb3J0bmFrKQotICogMDMtbm92LTIwMDQJVHJpdmlhbCBwYXRjaCBmb3IgS0MyMTkwIChLQy0xOTApIGNoaXAuIChKb25hdGhhbiBNY0Rvd2VsbCkKLSAqCi0gKiAwMS1mZWItMjAwNQlBWDg4NzcyIHN1cHBvcnQgKFBoaWwgQ2hhbmcgJiBEYXZlIEhvbGxpcykKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBUaGVzZSBkZXZpY2VzIHVzdWFsbHkgZGlmZmVyIGluIHRlcm1zIG9mIGNvbnRyb2wgcHJvdG9jb2xzIChpZiB0aGV5CisgKiBldmVuIGhhdmUgb25lISkgYW5kIHNvbWV0aW1lcyB0aGV5IGRlZmluZSBuZXcgZnJhbWluZyB0byB3cmFwIG9yIGJhdGNoCisgKiBFdGhlcm5ldCBwYWNrZXRzLiAgT3RoZXJ3aXNlLCB0aGV5IHRhbGsgdG8gVVNCIHByZXR0eSBtdWNoIHRoZSBzYW1lLAorICogc28gaW50ZXJmYWNlICh1biliaW5kaW5nLCBlbmRwb2ludCBJL08gcXVldWVzLCBmYXVsdCBoYW5kbGluZywgYW5kIG90aGVyCisgKiBpc3N1ZXMgY2FuIHVzZWZ1bGx5IGJlIGFkZHJlc3NlZCBieSB0aGlzIGZyYW1ld29yay4KKyAqLwogCiAvLyAjZGVmaW5lCURFQlVHCQkJLy8gZXJyb3IgcGF0aCBtZXNzYWdlcywgZXh0cmEgaW5mbwogLy8gI2RlZmluZQlWRVJCT1NFCQkJLy8gbW9yZTsgc3VjY2VzcyBtZXNzYWdlcwpAQCAtMTIxLDI0ICszOCwxOCBAQAogIyAgIGRlZmluZSBERUJVRwogI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJIjAzLU5vdi0yMDA0IgorI2luY2x1ZGUgInVzYm5ldC5oIgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMjItQXVnLTIwMDUiCiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE0OSwxNSArNjAsMTQgQEAKICAqIE9uZSBtYXhpbXVtIHNpemUgRXRoZXJuZXQgcGFja2V0IHRha2VzIHR3ZW50eSBmb3VyIG9mIHRoZW0uCiAgKiBGb3IgaGlnaCBzcGVlZCwgZWFjaCBmcmFtZSBjb21mb3J0YWJseSBmaXRzIGFsbW9zdCAzNiBtYXggc2l6ZQogICogRXRoZXJuZXQgcGFja2V0cyAoc28gcXVldWVzIHNob3VsZCBiZSBiaWdnZXIpLgorICoKKyAqIFJFVklTSVQgcWxlbnMgc2hvdWxkIGJlIG1lbWJlcnMgb2YgJ3N0cnVjdCB1c2JuZXQnOyB0aGUgZ29hbCBpcyB0bworICogbGV0IHRoZSBVU0IgaG9zdCBjb250cm9sbGVyIGJlIGJ1c3kgZm9yIDVtc2VjIG9yIG1vcmUgYmVmb3JlIGFuIGlycQorICogaXMgcmVxdWlyZWQsIHVuZGVyIGxvYWQuICBKdW1ib2dyYW1zIGNoYW5nZSB0aGUgZXF1YXRpb24uCiAgKi8KICNkZWZpbmUJUlhfUUxFTihkZXYpICgoKGRldiktPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSA/IDYwIDogNCkKICNkZWZpbmUJVFhfUUxFTihkZXYpICgoKGRldiktPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSA/IDYwIDogNCkKIAotLy8gcGFja2V0cyBhcmUgYWx3YXlzIGV0aGVybmV0IGluc2lkZQotLy8gLi4uIGV4Y2VwdCB0aGV5IGNhbiBiZSBiaWdnZXIgKGxpbWl0IG9mIDY0SyB3aXRoIE5ldENoaXAgZnJhbWluZykKLSNkZWZpbmUgTUlOX1BBQ0tFVAlzaXplb2Yoc3RydWN0IGV0aGhkcikKLSNkZWZpbmUgTUFYX1BBQ0tFVAkzMjc2OAotCiAvLyByZWF3YWtlbiBuZXR3b3JrIHF1ZXVlIHRoaXMgc29vbiBhZnRlciBzdG9wcGluZzsgZWxzZSB3YXRjaGRvZyBiYXJrcwogI2RlZmluZSBUWF9USU1FT1VUX0pJRkZJRVMJKDUqSFopCiAKQEAgLTE2NSw5ICs3NSw2IEBACiAvLyB1cyAoaXQgcG9sbHMgYXQgSFovNCB1c3VhbGx5KSBiZWZvcmUgd2UgcmVwb3J0IHRvbyBtYW55IGZhbHNlIGVycm9ycy4KICNkZWZpbmUgVEhST1RUTEVfSklGRklFUwkoSFovOCkKIAotLy8gZm9yIHZlbmRvci1zcGVjaWZpYyBjb250cm9sIG9wZXJhdGlvbnMKLSNkZWZpbmUJQ09OVFJPTF9USU1FT1VUX01TCTUwMAotCiAvLyBiZXR3ZWVuIHdha2V1cHMKICNkZWZpbmUgVU5MSU5LX1RJTUVPVVRfTVMJMwogCkBAIC0xNzYsMTA5ICs4Myw2IEBACiAvLyByYW5kb21seSBnZW5lcmF0ZWQgZXRoZXJuZXQgYWRkcmVzcwogc3RhdGljIHU4CW5vZGVfaWQgW0VUSF9BTEVOXTsKIAotLy8gc3RhdGUgd2Uga2VlcCBmb3IgZWFjaCBkZXZpY2Ugd2UgaGFuZGxlCi1zdHJ1Y3QgdXNibmV0IHsKLQkvLyBob3VzZWtlZXBpbmcKLQlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKLQlzdHJ1Y3QgZHJpdmVyX2luZm8JKmRyaXZlcl9pbmZvOwotCXdhaXRfcXVldWVfaGVhZF90CSp3YWl0OwotCi0JLy8gaS9vIGluZm86IHBpcGVzIGV0YwotCXVuc2lnbmVkCQlpbiwgb3V0OwotCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqc3RhdHVzOwotCXVuc2lnbmVkCQltYXhwYWNrZXQ7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJZGVsYXk7Ci0KLQkvLyBwcm90b2NvbC9pbnRlcmZhY2Ugc3RhdGUKLQlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOwotCWludAkJCW1zZ19lbmFibGU7Ci0JdW5zaWduZWQgbG9uZwkJZGF0YSBbNV07Ci0KLQlzdHJ1Y3QgbWlpX2lmX2luZm8JbWlpOwotCi0JLy8gdmFyaW91cyBraW5kcyBvZiBwZW5kaW5nIGRyaXZlciB3b3JrCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlyeHE7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZAl0eHE7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlkb25lOwotCXN0cnVjdCB1cmIJCSppbnRlcnJ1cHQ7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CWJoOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0CWtldmVudDsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLSMJCWRlZmluZSBFVkVOVF9UWF9IQUxUCTAKLSMJCWRlZmluZSBFVkVOVF9SWF9IQUxUCTEKLSMJCWRlZmluZSBFVkVOVF9SWF9NRU1PUlkJMgotIwkJZGVmaW5lIEVWRU5UX1NUU19TUExJVAkzCi0jCQlkZWZpbmUgRVZFTlRfTElOS19SRVNFVAk0Ci19OwotCi0vLyBkZXZpY2Utc3BlY2lmaWMgaW5mbyB1c2VkIGJ5IHRoZSBkcml2ZXIKLXN0cnVjdCBkcml2ZXJfaW5mbyB7Ci0JY2hhcgkJKmRlc2NyaXB0aW9uOwotCi0JaW50CQlmbGFnczsKLS8qIGZyYW1pbmcgaXMgQ0RDIEV0aGVybmV0LCBub3Qgd3JpdGluZyBaTFBzIChodyBpc3N1ZXMpLCBvciBvcHRpb25hbGx5OiAqLwotI2RlZmluZSBGTEFHX0ZSQU1JTkdfTkMJMHgwMDAxCQkvKiBndWFyZCBhZ2FpbnN0IGRldmljZSBkcm9wb3V0cyAqLyAKLSNkZWZpbmUgRkxBR19GUkFNSU5HX0dMCTB4MDAwMgkJLyogZ2VuZWxpbmsgYmF0Y2hlcyBwYWNrZXRzICovCi0jZGVmaW5lIEZMQUdfRlJBTUlOR19aCTB4MDAwNAkJLyogemF1cnVzIGFkZHMgYSB0cmFpbGVyICovCi0jZGVmaW5lIEZMQUdfRlJBTUlOR19STgkweDAwMDgJCS8qIFJORElTIGJhdGNoZXMsIHBsdXMgaHVnZSBoZWFkZXIgKi8KLQotI2RlZmluZSBGTEFHX05PX1NFVElOVAkweDAwMTAJCS8qIGRldmljZSBjYW4ndCBzZXRfaW50ZXJmYWNlKCkgKi8KLSNkZWZpbmUgRkxBR19FVEhFUgkweDAwMjAJCS8qIG1heWJlIHVzZSAiZXRoJWQiIG5hbWVzICovCi0KLSNkZWZpbmUgRkxBR19GUkFNSU5HX0FYIDB4MDA0MCAgICAgICAgICAvKiBBWDg4NzcyLzE3OCBwYWNrZXRzICovCi0KLQkvKiBpbml0IGRldmljZSAuLi4gY2FuIHNsZWVwLCBvciBjYXVzZSBwcm9iZSgpIGZhaWx1cmUgKi8KLQlpbnQJKCpiaW5kKShzdHJ1Y3QgdXNibmV0ICosIHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOwotCi0JLyogY2xlYW51cCBkZXZpY2UgLi4uIGNhbiBzbGVlcCwgYnV0IGNhbid0IGZhaWwgKi8KLQl2b2lkCSgqdW5iaW5kKShzdHJ1Y3QgdXNibmV0ICosIHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOwotCi0JLyogcmVzZXQgZGV2aWNlIC4uLiBjYW4gc2xlZXAgKi8KLQlpbnQJKCpyZXNldCkoc3RydWN0IHVzYm5ldCAqKTsKLQotCS8qIHNlZSBpZiBwZWVyIGlzIGNvbm5lY3RlZCAuLi4gY2FuIHNsZWVwICovCi0JaW50CSgqY2hlY2tfY29ubmVjdCkoc3RydWN0IHVzYm5ldCAqKTsKLQotCS8qIGZvciBzdGF0dXMgcG9sbGluZyAqLwotCXZvaWQJKCpzdGF0dXMpKHN0cnVjdCB1c2JuZXQgKiwgc3RydWN0IHVyYiAqKTsKLQotCS8qIGxpbmsgcmVzZXQgaGFuZGxpbmcsIGNhbGxlZCBmcm9tIGRlZmVyX2tldmVudCAqLwotCWludAkoKmxpbmtfcmVzZXQpKHN0cnVjdCB1c2JuZXQgKik7Ci0KLQkvKiBmaXh1cCByeCBwYWNrZXQgKHN0cmlwIGZyYW1pbmcpICovCi0JaW50CSgqcnhfZml4dXApKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLQkvKiBmaXh1cCB0eCBwYWNrZXQgKGFkZCBmcmFtaW5nKSAqLwotCXN0cnVjdCBza19idWZmCSooKnR4X2ZpeHVwKShzdHJ1Y3QgdXNibmV0ICpkZXYsCi0JCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGZsYWdzKTsKLQotCS8vIEZJWE1FIC0tIGFsc28gYW4gaW50ZXJydXB0IG1lY2hhbmlzbQotCS8vIHVzZWZ1bCBmb3IgYXQgbGVhc3QgUEwyMzAxLzIzMDIgYW5kIEdMNjIwVVNCLUEKLQkvLyBhbmQgQ0RDIHVzZSB0aGVtIHRvIHJlcG9ydCAnaXMgaXQgY29ubmVjdGVkJyBjaGFuZ2VzCi0KLQkvKiBmb3IgbmV3IGRldmljZXMsIHVzZSB0aGUgZGVzY3JpcHRvci1yZWFkaW5nIGNvZGUgaW5zdGVhZCAqLwotCWludAkJaW47CQkvKiByeCBlbmRwb2ludCAqLwotCWludAkJb3V0OwkJLyogdHggZW5kcG9pbnQgKi8KLQotCXVuc2lnbmVkIGxvbmcJZGF0YTsJCS8qIE1pc2MgZHJpdmVyIHNwZWNpZmljIGRhdGEgKi8KLX07Ci0KLS8vIHdlIHJlY29yZCB0aGUgc3RhdGUgZm9yIGVhY2ggb2Ygb3VyIHF1ZXVlZCBza2JzCi1lbnVtIHNrYl9zdGF0ZSB7Ci0JaWxsZWdhbCA9IDAsCi0JdHhfc3RhcnQsIHR4X2RvbmUsCi0Jcnhfc3RhcnQsIHJ4X2RvbmUsIHJ4X2NsZWFudXAKLX07Ci0KLXN0cnVjdCBza2JfZGF0YSB7CS8vIHNrYi0+Y2IgaXMgb25lIG9mIHRoZXNlCi0Jc3RydWN0IHVyYgkJKnVyYjsKLQlzdHJ1Y3QgdXNibmV0CQkqZGV2OwotCWVudW0gc2tiX3N0YXRlCQlzdGF0ZTsKLQlzaXplX3QJCQlsZW5ndGg7Ci19OwotCiBzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZSBbXSA9ICJ1c2JuZXQiOwogCiAvKiB1c2UgZXRodG9vbCB0byBjaGFuZ2UgdGhlIGxldmVsIGZvciBhbnkgZ2l2ZW4gZGV2aWNlICovCkBAIC0yODYsMzkgKzkwLDEwIEBACiBtb2R1bGVfcGFyYW0gKG1zZ19sZXZlbCwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MgKG1zZ19sZXZlbCwgIk92ZXJyaWRlIGRlZmF1bHQgbWVzc2FnZSBsZXZlbCIpOwogCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBkZXZkYmcodXNibmV0LCBmbXQsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmbXQgIlxuIiAsICh1c2JuZXQpLT5uZXQtPm5hbWUgLCAjIyBhcmcpCi0jZWxzZQotI2RlZmluZSBkZXZkYmcodXNibmV0LCBmbXQsIGFyZy4uLikgZG8ge30gd2hpbGUoMCkKLSNlbmRpZgotCi0jZGVmaW5lIGRldmVycih1c2JuZXQsIGZtdCwgYXJnLi4uKSBcCi0JcHJpbnRrKEtFUk5fRVJSICIlczogIiBmbXQgIlxuIiAsICh1c2JuZXQpLT5uZXQtPm5hbWUgLCAjIyBhcmcpCi0jZGVmaW5lIGRldndhcm4odXNibmV0LCBmbXQsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAiIGZtdCAiXG4iICwgKHVzYm5ldCktPm5ldC0+bmFtZSAsICMjIGFyZykKLQotI2RlZmluZSBkZXZpbmZvKHVzYm5ldCwgZm10LCBhcmcuLi4pIFwKLQlwcmludGsoS0VSTl9JTkZPICIlczogIiBmbXQgIlxuIiAsICh1c2JuZXQpLT5uZXQtPm5hbWUgLCAjIyBhcmcpOyBcCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyB2b2lkIHVzYm5ldF9nZXRfZHJ2aW5mbyAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqKTsKLXN0YXRpYyB1MzIgdXNibmV0X2dldF9saW5rIChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXN0YXRpYyB1MzIgdXNibmV0X2dldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgdm9pZCB1c2JuZXRfc2V0X21zZ2xldmVsIChzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIpOwotc3RhdGljIHZvaWQgZGVmZXJfa2V2ZW50IChzdHJ1Y3QgdXNibmV0ICosIGludCk7Ci0KLS8qIG1vc3RseSBmb3IgUERBIHN0eWxlIGRldmljZXMsIHdoaWNoIGFyZSBhbHdheXMgY29ubmVjdGVkIGlmIHByZXNlbnQgKi8KLXN0YXRpYyBpbnQgYWx3YXlzX2Nvbm5lY3RlZCAoc3RydWN0IHVzYm5ldCAqZGV2KQotewotCXJldHVybiAwOwotfQotCiAvKiBoYW5kbGVzIENEQyBFdGhlcm5ldCBhbmQgbWFueSBvdGhlciBuZXR3b3JrICJidWxrIGRhdGEiIGludGVyZmFjZXMgKi8KLXN0YXRpYyBpbnQKLWdldF9lbmRwb2ludHMgKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitpbnQgdXNibmV0X2dldF9lbmRwb2ludHMoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlpbnQJCQkJdG1wOwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UJKmFsdCA9IE5VTEw7CkBAIC0zODIsNiArMTU3LDcgQEAKIAlkZXYtPnN0YXR1cyA9IHN0YXR1czsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9nZXRfZW5kcG9pbnRzKTsKIAogc3RhdGljIHZvaWQgaW50cl9jb21wbGV0ZSAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKQEAgLTQyMSw3ICsxOTcsMTEgQEAKIAlyZXR1cm4gIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNrYl9yZXR1cm4gKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKKy8qIFBhc3NlcyB0aGlzIHBhY2tldCB1cCB0aGUgc3RhY2ssIHVwZGF0aW5nIGl0cyBhY2NvdW50aW5nLgorICogU29tZSBsaW5rIHByb3RvY29scyBiYXRjaCBwYWNrZXRzLCBzbyB0aGVpciByeF9maXh1cCBwYXRocworICogY2FuIHJldHVybiBjbG9uZXMgYXMgd2VsbCBhcyBqdXN0IG1vZGlmeSB0aGUgb3JpZ2luYWwgc2tiLgorICovCit2b2lkIHVzYm5ldF9za2JfcmV0dXJuIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50CXN0YXR1czsKIApAQCAtNDM4LDI0MjUgKzIxOCw3IEBACiAJaWYgKHN0YXR1cyAhPSBORVRfUlhfU1VDQ0VTUyAmJiBuZXRpZl9tc2dfcnhfZXJyIChkZXYpKQogCQlkZXZkYmcgKGRldiwgIm5ldGlmX3J4IHN0YXR1cyAlZCIsIHN0YXR1cyk7CiB9Ci0KLQwKLSNpZmRlZglDT05GSUdfVVNCX0FMSV9NNTYzMgotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIEFMaSBNNTYzMiBkcml2ZXIgLi4uIGRvZXMgaGlnaCBzcGVlZAotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JYWxpX201NjMyX2luZm8gPSB7Ci0JLmRlc2NyaXB0aW9uID0JIkFMaSBNNTYzMiIsCi19OwotCi0KLSNlbmRpZgotCi0MCi0jaWZkZWYJQ09ORklHX1VTQl9BTjI3MjAKLSNkZWZpbmUJSEFWRV9IQVJEV0FSRQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBBbmNob3JDaGlwcyAyNzIwIGRyaXZlciAuLi4gaHR0cDovL3d3dy5jeXByZXNzLmNvbQotICoKLSAqIFRoaXMgZG9lc24ndCBzZWVtIHRvIGhhdmUgYSB3YXkgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHBlZXIgaXMKLSAqIGNvbm5lY3RlZCwgb3IgbmVlZCBhbnkgcmVzZXQgaGFuZHNoYWtpbmcuICBJdCdzIGdvdCBwcmV0dHkgYmlnCi0gKiBpbnRlcm5hbCBidWZmZXJzIChoYW5kbGVzIG1vc3Qgb2YgYSBmcmFtZSdzIHdvcnRoIG9mIGRhdGEpLgotICogQ2hpcCBkYXRhIHNoZWV0cyBkb24ndCBkZXNjcmliZSBhbnkgdmVuZG9yIGNvbnRyb2wgbWVzc2FnZXMuCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwlhbjI3MjBfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPQkiQW5jaG9yQ2hpcHMvQ3lwcmVzcyAyNzIwIiwKLQkvLyBubyByZXNldCBhdmFpbGFibGUhCi0JLy8gbm8gY2hlY2tfY29ubmVjdCBhdmFpbGFibGUhCi0KLQkuaW4gPSAyLCAub3V0ID0gMiwJCS8vIGRpcmVjdGlvbiBkaXN0aW5ndWlzaGVzIHRoZXNlCi19OwotCi0jZW5kaWYJLyogQ09ORklHX1VTQl9BTjI3MjAgKi8KLQotDAotI2lmZGVmIENPTkZJR19VU0JfQVg4ODE3WAotLyogQVNJWCBBWDg4MTdYIGJhc2VkIFVTQiAyLjAgRXRoZXJuZXQgRGV2aWNlcyAqLwotCi0jZGVmaW5lIEhBVkVfSEFSRFdBUkUKLSNkZWZpbmUgTkVFRF9NSUkKLQotI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+Ci0KLSNkZWZpbmUgQVhfQ01EX1NFVF9TV19NSUkJCTB4MDYKLSNkZWZpbmUgQVhfQ01EX1JFQURfTUlJX1JFRwkJMHgwNwotI2RlZmluZSBBWF9DTURfV1JJVEVfTUlJX1JFRwkJMHgwOAotI2RlZmluZSBBWF9DTURfU0VUX0hXX01JSQkJMHgwYQotI2RlZmluZSBBWF9DTURfUkVBRF9FRVBST00JCTB4MGIKLSNkZWZpbmUgQVhfQ01EX1dSSVRFX0VFUFJPTQkJMHgwYwotI2RlZmluZSBBWF9DTURfV1JJVEVfRU5BQkxFCQkweDBkCi0jZGVmaW5lIEFYX0NNRF9XUklURV9ESVNBQkxFCQkweDBlCi0jZGVmaW5lIEFYX0NNRF9XUklURV9SWF9DVEwJCTB4MTAKLSNkZWZpbmUgQVhfQ01EX1JFQURfSVBHMDEyCQkweDExCi0jZGVmaW5lIEFYX0NNRF9XUklURV9JUEcwCQkweDEyCi0jZGVmaW5lIEFYX0NNRF9XUklURV9JUEcxCQkweDEzCi0jZGVmaW5lIEFYX0NNRF9XUklURV9JUEcyCQkweDE0Ci0jZGVmaW5lIEFYX0NNRF9XUklURV9NVUxUSV9GSUxURVIJMHgxNgotI2RlZmluZSBBWF9DTURfUkVBRF9OT0RFX0lECQkweDE3Ci0jZGVmaW5lIEFYX0NNRF9SRUFEX1BIWV9JRAkJMHgxOQotI2RlZmluZSBBWF9DTURfUkVBRF9NRURJVU1fU1RBVFVTCTB4MWEKLSNkZWZpbmUgQVhfQ01EX1dSSVRFX01FRElVTV9NT0RFCTB4MWIKLSNkZWZpbmUgQVhfQ01EX1JFQURfTU9OSVRPUl9NT0RFCTB4MWMKLSNkZWZpbmUgQVhfQ01EX1dSSVRFX01PTklUT1JfTU9ERQkweDFkCi0jZGVmaW5lIEFYX0NNRF9XUklURV9HUElPUwkJMHgxZgotI2RlZmluZSBBWF9DTURfU1dfUkVTRVQJCQkweDIwCi0jZGVmaW5lIEFYX0NNRF9TV19QSFlfU1RBVFVTCQkweDIxCi0jZGVmaW5lIEFYX0NNRF9TV19QSFlfU0VMRUNUCQkweDIyCi0jZGVmaW5lIEFYODg3NzJfQ01EX1JFQURfTk9ERV9JRAkweDEzCi0KLSNkZWZpbmUgQVhfTU9OSVRPUl9NT0RFCQkJMHgwMQotI2RlZmluZSBBWF9NT05JVE9SX0xJTksJCQkweDAyCi0jZGVmaW5lIEFYX01PTklUT1JfTUFHSUMJCTB4MDQKLSNkZWZpbmUgQVhfTU9OSVRPUl9IU0ZTCQkJMHgxMAotCi0vKiBBWDg4MTcyIE1lZGl1bSBTdGF0dXMgUmVnaXN0ZXIgdmFsdWVzICovCi0jZGVmaW5lIEFYX01FRElVTV9GVUxMX0RVUExFWAkJMHgwMgotI2RlZmluZSBBWF9NRURJVU1fVFhfQUJPUlRfQUxMT1cJMHgwNAotI2RlZmluZSBBWF9NRURJVU1fRkxPV19DT05UUk9MX0VOCTB4MTAKLQotI2RlZmluZSBBWF9NQ0FTVF9GSUxURVJfU0laRQkJOAotI2RlZmluZSBBWF9NQVhfTUNBU1QJCQk2NAotCi0jZGVmaW5lIEFYX0VFUFJPTV9MRU4JCQkweDQwCi0KLSNkZWZpbmUgQVhfU1dSRVNFVF9DTEVBUgkJMHgwMAotI2RlZmluZSBBWF9TV1JFU0VUX1JSCQkJMHgwMQotI2RlZmluZSBBWF9TV1JFU0VUX1JUCQkJMHgwMgotI2RlZmluZSBBWF9TV1JFU0VUX1BSVEUJCQkweDA0Ci0jZGVmaW5lIEFYX1NXUkVTRVRfUFJMCQkJMHgwOAotI2RlZmluZSBBWF9TV1JFU0VUX0JaCQkJMHgxMAotI2RlZmluZSBBWF9TV1JFU0VUX0lQUkwJCQkweDIwCi0jZGVmaW5lIEFYX1NXUkVTRVRfSVBQRAkJCTB4NDAKLQotI2RlZmluZSBBWDg4NzcyX0lQRzBfREVGQVVMVAkJMHgxNQotI2RlZmluZSBBWDg4NzcyX0lQRzFfREVGQVVMVAkJMHgwYwotI2RlZmluZSBBWDg4NzcyX0lQRzJfREVGQVVMVAkJMHgxMgotCi0jZGVmaW5lIEFYODg3NzJfTUVESVVNX0ZVTExfRFVQTEVYCTB4MDAwMgotI2RlZmluZSBBWDg4NzcyX01FRElVTV9SRVNFUlZFRAkJMHgwMDA0Ci0jZGVmaW5lIEFYODg3NzJfTUVESVVNX1JYX0ZDX0VOQUJMRQkweDAwMTAKLSNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fVFhfRkNfRU5BQkxFCTB4MDAyMAotI2RlZmluZSBBWDg4NzcyX01FRElVTV9QQVVTRV9GT1JNQVQJMHgwMDgwCi0jZGVmaW5lIEFYODg3NzJfTUVESVVNX1JYX0VOQUJMRQkweDAxMDAKLSNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fMTAwTUIJCTB4MDIwMAotI2RlZmluZSBBWDg4NzcyX01FRElVTV9ERUZBVUxUCVwKLQkoQVg4ODc3Ml9NRURJVU1fRlVMTF9EVVBMRVggfCBBWDg4NzcyX01FRElVTV9SWF9GQ19FTkFCTEUgfCBcCi0JIEFYODg3NzJfTUVESVVNX1RYX0ZDX0VOQUJMRSB8IEFYODg3NzJfTUVESVVNXzEwME1CIHwgXAotCSBBWDg4NzcyX01FRElVTV9SRVNFUlZFRCB8IEFYODg3NzJfTUVESVVNX1JYX0VOQUJMRSApCi0KLSNkZWZpbmUgQVhfRUVQUk9NX01BR0lDCQkJMHhkZWFkYmVlZgotCi0vKiBUaGlzIHN0cnVjdHVyZSBjYW5ub3QgZXhjZWVkIHNpemVvZih1bnNpZ25lZCBsb25nIFs1XSkgQUtBIDIwIGJ5dGVzICovCi1zdHJ1Y3QgYXg4ODE3eF9kYXRhIHsKLQl1OCBtdWx0aV9maWx0ZXJbQVhfTUNBU1RfRklMVEVSX1NJWkVdOwotfTsKLQotc3RydWN0IGF4ODgxNzJfaW50X2RhdGEgewotCXUxNiByZXMxOwotCXU4IGxpbms7Ci0JdTE2IHJlczI7Ci0JdTggc3RhdHVzOwotCXUxNiByZXMzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0YXRpYyBpbnQgYXg4ODE3eF9yZWFkX2NtZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCi0JCQkgICAgdTE2IHNpemUsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHVzYl9jb250cm9sX21zZygKLQkJZGV2LT51ZGV2LAotCQl1c2JfcmN2Y3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKLQkJY21kLAotCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJdmFsdWUsCi0JCWluZGV4LAotCQlkYXRhLAotCQlzaXplLAotCQlDT05UUk9MX1RJTUVPVVRfTVMpOwotfQotCi1zdGF0aWMgaW50IGF4ODgxN3hfd3JpdGVfY21kKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKLQkJCSAgICAgdTE2IHNpemUsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHVzYl9jb250cm9sX21zZygKLQkJZGV2LT51ZGV2LAotCQl1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKLQkJY21kLAotCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCXZhbHVlLAotCQlpbmRleCwKLQkJZGF0YSwKLQkJc2l6ZSwKLQkJQ09OVFJPTF9USU1FT1VUX01TKTsKLX0KLQotc3RhdGljIHZvaWQgYXg4ODE3eF9hc3luY19jbWRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXEgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKXVyYi0+Y29udGV4dDsKLQotCWlmICh1cmItPnN0YXR1cyA8IDApCi0JCXByaW50ayhLRVJOX0RFQlVHICJheDg4MTd4X2FzeW5jX2NtZF9jYWxsYmFjaygpIGZhaWxlZCB3aXRoICVkIiwKLQkJCXVyYi0+c3RhdHVzKTsKLQotCWtmcmVlKHJlcSk7Ci0JdXNiX2ZyZWVfdXJiKHVyYik7Ci19Ci0KLXN0YXRpYyB2b2lkIGF4ODgxN3hfc3RhdHVzKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBheDg4MTcyX2ludF9kYXRhICpldmVudDsKLQlpbnQgbGluazsKLQotCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPCA4KQotCQlyZXR1cm47Ci0KLQlldmVudCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotCWxpbmsgPSBldmVudC0+bGluayAmIDB4MDE7Ci0JaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2LT5uZXQpICE9IGxpbmspIHsKLQkJaWYgKGxpbmspIHsKLQkJCW5ldGlmX2NhcnJpZXJfb24oZGV2LT5uZXQpOwotCQkJZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX0xJTktfUkVTRVQgKTsKLQkJfSBlbHNlCi0JCQluZXRpZl9jYXJyaWVyX29mZihkZXYtPm5ldCk7Ci0JCWRldmRiZyhkZXYsICJheDg4MTd4IC0gTGluayBTdGF0dXMgaXM6ICVkIiwgbGluayk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBheDg4MTd4X3dyaXRlX2NtZF9hc3luYyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCi0JCQkJICAgIHUxNiBzaXplLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcTsKLQlpbnQgc3RhdHVzOwotCXN0cnVjdCB1cmIgKnVyYjsKLQotCWlmICgodXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewotCQlkZXZkYmcoZGV2LCAiRXJyb3IgYWxsb2NhdGluZyBVUkIgaW4gd3JpdGVfY21kX2FzeW5jISIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKChyZXEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKLQkJZGV2ZXJyKGRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnRyb2wgcmVxdWVzdCIpOwotCQl1c2JfZnJlZV91cmIodXJiKTsKLQkJcmV0dXJuOwotCX0KLQotCXJlcS0+YlJlcXVlc3RUeXBlID0gVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFOwotCXJlcS0+YlJlcXVlc3QgPSBjbWQ7Ci0JcmVxLT53VmFsdWUgPSBjcHVfdG9fbGUxNih2YWx1ZSk7Ci0JcmVxLT53SW5kZXggPSBjcHVfdG9fbGUxNihpbmRleCk7IAotCXJlcS0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOwotCi0JdXNiX2ZpbGxfY29udHJvbF91cmIodXJiLCBkZXYtPnVkZXYsCi0JCQkgICAgIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApLAotCQkJICAgICAodm9pZCAqKXJlcSwgZGF0YSwgc2l6ZSwKLQkJCSAgICAgYXg4ODE3eF9hc3luY19jbWRfY2FsbGJhY2ssIHJlcSk7Ci0KLQlpZigoc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgPCAwKSB7Ci0JCWRldmVycihkZXYsICJFcnJvciBzdWJtaXR0aW5nIHRoZSBjb250cm9sIG1lc3NhZ2U6IHN0YXR1cz0lZCIsIHN0YXR1cyk7Ci0JCWtmcmVlKHJlcSk7Ci0JCXVzYl9mcmVlX3VyYih1cmIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXg4ODE3eF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQlzdHJ1Y3QgYXg4ODE3eF9kYXRhICpkYXRhID0gKHN0cnVjdCBheDg4MTd4X2RhdGEgKikmZGV2LT5kYXRhOwotCXU4IHJ4X2N0bCA9IDB4OGM7Ci0KLQlpZiAobmV0LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7Ci0JCXJ4X2N0bCB8PSAweDAxOwotCX0gZWxzZSBpZiAobmV0LT5mbGFncyAmIElGRl9BTExNVUxUSQotCQkgICB8fCBuZXQtPm1jX2NvdW50ID4gQVhfTUFYX01DQVNUKSB7Ci0JCXJ4X2N0bCB8PSAweDAyOwotCX0gZWxzZSBpZiAobmV0LT5tY19jb3VudCA9PSAwKSB7Ci0JCS8qIGp1c3QgYnJvYWRjYXN0IGFuZCBkaXJlY3RlZCAqLwotCX0gZWxzZSB7Ci0JCS8qIFdlIHVzZSB0aGUgMjAgYnl0ZSBkZXYtPmRhdGEKLQkJICogZm9yIG91ciA4IGJ5dGUgZmlsdGVyIGJ1ZmZlcgotCQkgKiB0byBhdm9pZCBhbGxvY2F0aW5nIG1lbW9yeSB0aGF0Ci0JCSAqIGlzIHRyaWNreSB0byBmcmVlIGxhdGVyICovCi0JCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfbGlzdCA9IG5ldC0+bWNfbGlzdDsKLQkJdTMyIGNyY19iaXRzOwotCQlpbnQgaTsKLQotCQltZW1zZXQoZGF0YS0+bXVsdGlfZmlsdGVyLCAwLCBBWF9NQ0FTVF9GSUxURVJfU0laRSk7Ci0KLQkJLyogQnVpbGQgdGhlIG11bHRpY2FzdCBoYXNoIGZpbHRlci4gKi8KLQkJZm9yIChpID0gMDsgaSA8IG5ldC0+bWNfY291bnQ7IGkrKykgewotCQkJY3JjX2JpdHMgPQotCQkJICAgIGV0aGVyX2NyYyhFVEhfQUxFTiwKLQkJCQkgICAgICBtY19saXN0LT5kbWlfYWRkcikgPj4gMjY7Ci0JCQlkYXRhLT5tdWx0aV9maWx0ZXJbY3JjX2JpdHMgPj4gM10gfD0KLQkJCSAgICAxIDw8IChjcmNfYml0cyAmIDcpOwotCQkJbWNfbGlzdCA9IG1jX2xpc3QtPm5leHQ7Ci0JCX0KLQotCQlheDg4MTd4X3dyaXRlX2NtZF9hc3luYyhkZXYsIEFYX0NNRF9XUklURV9NVUxUSV9GSUxURVIsIDAsIDAsCi0JCQkJICAgQVhfTUNBU1RfRklMVEVSX1NJWkUsIGRhdGEtPm11bHRpX2ZpbHRlcik7Ci0KLQkJcnhfY3RsIHw9IDB4MTA7Ci0JfQotCi0JYXg4ODE3eF93cml0ZV9jbWRfYXN5bmMoZGV2LCBBWF9DTURfV1JJVEVfUlhfQ1RMLCByeF9jdGwsIDAsIDAsIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IGF4ODgxN3hfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsIGludCBsb2MpCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1MTYgcmVzOwotCXU4IGJ1ZlsxXTsKLQotCWF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9TV19NSUksIDAsIDAsIDAsICZidWYpOwotCWF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9NSUlfUkVHLCBwaHlfaWQsIChfX3UxNilsb2MsIDIsICh1MTYgKikmcmVzKTsKLQlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfSFdfTUlJLCAwLCAwLCAwLCAmYnVmKTsKLQotCXJldHVybiByZXMgJiAweGZmZmY7Ci19Ci0KLXN0YXRpYyB2b2lkIGF4ODgxN3hfbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jLCBpbnQgdmFsKQotewotCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdTE2IHJlcyA9IHZhbDsKLQl1OCBidWZbMV07Ci0KLQlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfU1dfTUlJLCAwLCAwLCAwLCAmYnVmKTsKLQlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NSUlfUkVHLCBwaHlfaWQsIChfX3UxNilsb2MsIDIsICh1MTYgKikmcmVzKTsKLQlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfSFdfTUlJLCAwLCAwLCAwLCAmYnVmKTsKLX0KLQotc3RhdGljIGludCBheDg4MTcyX2xpbmtfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2KQotewotCXUxNiBscGE7Ci0JdTggbW9kZTsKLQotCW1vZGUgPSBBWF9NRURJVU1fVFhfQUJPUlRfQUxMT1cgfCBBWF9NRURJVU1fRkxPV19DT05UUk9MX0VOOwotCWxwYSA9IGF4ODgxN3hfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9MUEEpOwotCWlmIChscGEgJiBMUEFfRFVQTEVYKQotCQltb2RlIHw9IEFYX01FRElVTV9GVUxMX0RVUExFWDsKLQlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NRURJVU1fTU9ERSwgbW9kZSwgMCwgMCwgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXg4ODE3eF9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQl1OCBvcHQ7Ci0KLQlpZiAoYXg4ODE3eF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX01PTklUT1JfTU9ERSwgMCwgMCwgMSwgJm9wdCkgPCAwKSB7Ci0JCXdvbGluZm8tPnN1cHBvcnRlZCA9IDA7Ci0JCXdvbGluZm8tPndvbG9wdHMgPSAwOwotCQlyZXR1cm47Ci0JfQotCXdvbGluZm8tPnN1cHBvcnRlZCA9IFdBS0VfUEhZIHwgV0FLRV9NQUdJQzsKLQl3b2xpbmZvLT53b2xvcHRzID0gMDsKLQlpZiAob3B0ICYgQVhfTU9OSVRPUl9NT0RFKSB7Ci0JCWlmIChvcHQgJiBBWF9NT05JVE9SX0xJTkspCi0JCQl3b2xpbmZvLT53b2xvcHRzIHw9IFdBS0VfUEhZOwotCQlpZiAob3B0ICYgQVhfTU9OSVRPUl9NQUdJQykKLQkJCXdvbGluZm8tPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYXg4ODE3eF9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQl1OCBvcHQgPSAwOwotCXU4IGJ1ZlsxXTsKLQotCWlmICh3b2xpbmZvLT53b2xvcHRzICYgV0FLRV9QSFkpCi0JCW9wdCB8PSBBWF9NT05JVE9SX0xJTks7Ci0JaWYgKHdvbGluZm8tPndvbG9wdHMgJiBXQUtFX01BR0lDKQotCQlvcHQgfD0gQVhfTU9OSVRPUl9NQUdJQzsKLQlpZiAob3B0ICE9IDApCi0JCW9wdCB8PSBBWF9NT05JVE9SX01PREU7Ci0KLQlpZiAoYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTU9OSVRPUl9NT0RFLAotCQkJICAgICAgb3B0LCAwLCAwLCAmYnVmKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXg4ODE3eF9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQotewotCXJldHVybiBBWF9FRVBST01fTEVOOwotfQotCi1zdGF0aWMgaW50IGF4ODgxN3hfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAotCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQotewotCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7Ci0JdTE2ICplYnVmID0gKHUxNiAqKWRhdGE7Ci0JaW50IGk7Ci0KLQkvKiBDcnVkZSBoYWNrIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IG92ZXJ3cml0ZSBtZW1vcnkKLQkgKiBpZiBhbiBvZGQgbGVuZ3RoIGlzIHN1cHBsaWVkCi0JICovCi0JaWYgKGVlcHJvbS0+bGVuICUgMikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQllZXByb20tPm1hZ2ljID0gQVhfRUVQUk9NX01BR0lDOwotCi0JLyogYXg4ODE3eCByZXR1cm5zIDIgYnl0ZXMgZnJvbSBlZXByb20gb24gcmVhZCAqLwotCWZvciAoaT0wOyBpIDwgZWVwcm9tLT5sZW4gLyAyOyBpKyspIHsKLQkJaWYgKGF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9FRVBST00sIAotCQkJZWVwcm9tLT5vZmZzZXQgKyBpLCAwLCAyLCAmZWJ1ZltpXSkgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBheDg4MTd4X2dldF9kcnZpbmZvIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAotCQkJCSBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQotewotCS8qIEluaGVyaXQgc3RhbmRhcmQgZGV2aWNlIGluZm8gKi8KLQl1c2JuZXRfZ2V0X2RydmluZm8obmV0LCBpbmZvKTsKLQlpbmZvLT5lZWR1bXBfbGVuID0gMHgzZTsKLX0KLQotc3RhdGljIGludCBheDg4MTd4X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwotCi0JcmV0dXJuIG1paV9ldGh0b29sX2dzZXQoJmRldi0+bWlpLGNtZCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXg4ODE3eF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQotCXJldHVybiBtaWlfZXRodG9vbF9zc2V0KCZkZXYtPm1paSxjbWQpOwotfQotCi0vKiBXZSBuZWVkIHRvIG92ZXJyaWRlIHNvbWUgZXRodG9vbF9vcHMgc28gd2UgcmVxdWlyZSBvdXIKLSAgIG93biBzdHJ1Y3R1cmUgc28gd2UgZG9uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgdXNibmV0Ci0gICBkZXZpY2VzIHRoYXQgbWF5IGJlIGNvbm5lY3RlZCBhdCB0aGUgc2FtZSB0aW1lLiAqLwotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBheDg4MTd4X2V0aHRvb2xfb3BzID0gewotCS5nZXRfZHJ2aW5mbwkJPSBheDg4MTd4X2dldF9kcnZpbmZvLAotCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAotCS5nZXRfbXNnbGV2ZWwJCT0gdXNibmV0X2dldF9tc2dsZXZlbCwKLQkuc2V0X21zZ2xldmVsCQk9IHVzYm5ldF9zZXRfbXNnbGV2ZWwsCi0JLmdldF93b2wJCT0gYXg4ODE3eF9nZXRfd29sLAotCS5zZXRfd29sCQk9IGF4ODgxN3hfc2V0X3dvbCwKLQkuZ2V0X2VlcHJvbV9sZW4JCT0gYXg4ODE3eF9nZXRfZWVwcm9tX2xlbiwKLQkuZ2V0X2VlcHJvbQkJPSBheDg4MTd4X2dldF9lZXByb20sCi0JLmdldF9zZXR0aW5ncwkJPSBheDg4MTd4X2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IGF4ODgxN3hfc2V0X3NldHRpbmdzLAotfTsKLQotc3RhdGljIGludCBheDg4MTd4X2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlpbnQgcmV0ID0gMDsKLQl2b2lkICpidWY7Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBncGlvX2JpdHMgPSBkZXYtPmRyaXZlcl9pbmZvLT5kYXRhOwotCi0JZ2V0X2VuZHBvaW50cyhkZXYsaW50Zik7Ci0KLQlidWYgPSBrbWFsbG9jKEVUSF9BTEVOLCBHRlBfS0VSTkVMKTsKLQlpZighYnVmKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0MTsKLQl9Ci0KLQkvKiBUb2dnbGUgdGhlIEdQSU9zIGluIGEgbWFudWZhY3R1cmVyL21vZGVsIHNwZWNpZmljIHdheSAqLwotCWZvciAoaSA9IDI7IGkgPj0gMDsgaS0tKSB7Ci0JCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfR1BJT1MsCi0JCQkJCShncGlvX2JpdHMgPj4gKGkgKiA4KSkgJiAweGZmLCAwLCAwLAotCQkJCQlidWYpKSA8IDApCi0JCQlnb3RvIG91dDI7Ci0JCW1zbGVlcCg1KTsKLQl9Ci0KLQlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX1JYX0NUTCwgMHg4MCwgMCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygic2VuZCBBWF9DTURfV1JJVEVfUlhfQ1RMIGZhaWxlZDogJWQiLCByZXQpOwotCQlnb3RvIG91dDI7Ci0JfQotCi0JLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLwotCW1lbXNldChidWYsIDAsIEVUSF9BTEVOKTsKLQlpZiAoKHJldCA9IGF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9OT0RFX0lELCAwLCAwLCA2LCBidWYpKSA8IDApIHsKLQkJZGJnKCJyZWFkIEFYX0NNRF9SRUFEX05PREVfSUQgZmFpbGVkOiAlZCIsIHJldCk7Ci0JCWdvdG8gb3V0MjsKLQl9Ci0JbWVtY3B5KGRldi0+bmV0LT5kZXZfYWRkciwgYnVmLCBFVEhfQUxFTik7Ci0KLQkvKiBHZXQgdGhlIFBIWSBpZCAqLwotCWlmICgocmV0ID0gYXg4ODE3eF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX1BIWV9JRCwgMCwgMCwgMiwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiZXJyb3Igb24gcmVhZCBBWF9DTURfUkVBRF9QSFlfSUQ6ICUwMngiLCByZXQpOwotCQlnb3RvIG91dDI7Ci0JfSBlbHNlIGlmIChyZXQgPCAyKSB7Ci0JCS8qIHRoaXMgc2hvdWxkIGFsd2F5cyByZXR1cm4gMiBieXRlcyAqLwotCQlkYmcoIkFYX0NNRF9SRUFEX1BIWV9JRCByZXR1cm5lZCBsZXNzIHRoYW4gMiBieXRlczogcmV0PSUwMngiLCByZXQpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dDI7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBNSUkgc3RydWN0dXJlICovCi0JZGV2LT5taWkuZGV2ID0gZGV2LT5uZXQ7Ci0JZGV2LT5taWkubWRpb19yZWFkID0gYXg4ODE3eF9tZGlvX3JlYWQ7Ci0JZGV2LT5taWkubWRpb193cml0ZSA9IGF4ODgxN3hfbWRpb193cml0ZTsKLQlkZXYtPm1paS5waHlfaWRfbWFzayA9IDB4M2Y7Ci0JZGV2LT5taWkucmVnX251bV9tYXNrID0gMHgxZjsKLQlkZXYtPm1paS5waHlfaWQgPSAqKCh1OCAqKWJ1ZiArIDEpOwotCi0JZGV2LT5uZXQtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGF4ODgxN3hfc2V0X211bHRpY2FzdDsKLQlkZXYtPm5ldC0+ZXRodG9vbF9vcHMgPSAmYXg4ODE3eF9ldGh0b29sX29wczsKLQotCWF4ODgxN3hfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7Ci0JYXg4ODE3eF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UsCi0JCUFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9QQVVTRV9DQVApOwotCW1paV9ud2F5X3Jlc3RhcnQoJmRldi0+bWlpKTsKLQotCXJldHVybiAwOwotb3V0MjoKLQlrZnJlZShidWYpOwotb3V0MToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF4ODg3NzJfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9kcnZpbmZvCQk9IGF4ODgxN3hfZ2V0X2RydmluZm8sCi0JLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCi0JLmdldF9tc2dsZXZlbAkJPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAotCS5zZXRfbXNnbGV2ZWwJCT0gdXNibmV0X3NldF9tc2dsZXZlbCwKLQkuZ2V0X3dvbAkJPSBheDg4MTd4X2dldF93b2wsCi0JLnNldF93b2wJCT0gYXg4ODE3eF9zZXRfd29sLAotCS5nZXRfZWVwcm9tX2xlbgkJPSBheDg4MTd4X2dldF9lZXByb21fbGVuLAotCS5nZXRfZWVwcm9tCQk9IGF4ODgxN3hfZ2V0X2VlcHJvbSwKLQkuZ2V0X3NldHRpbmdzCQk9IGF4ODgxN3hfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MJCT0gYXg4ODE3eF9zZXRfc2V0dGluZ3MsCi19OwotCi1zdGF0aWMgaW50IGF4ODg3NzJfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCWludCByZXQ7Ci0Jdm9pZCAqYnVmOwotCi0JZ2V0X2VuZHBvaW50cyhkZXYsaW50Zik7Ci0KLQlidWYgPSBrbWFsbG9jKDYsIEdGUF9LRVJORUwpOwotCWlmKCFidWYpIHsKLQkJZGJnICgiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYnVmZmVyIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0MTsKLQl9Ci0KLQlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0dQSU9TLAotCQkJCSAgICAgMHgwMEIwLCAwLCAwLCBidWYpKSA8IDApCi0JCWdvdG8gb3V0MjsKLQotCW1zbGVlcCg1KTsKLQlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1BIWV9TRUxFQ1QsIDB4MDAwMSwgMCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiU2VsZWN0IFBIWSAjMSBmYWlsZWQ6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQotCWlmICgocmV0ID0KLQkgICAgIGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1JFU0VULCBBWF9TV1JFU0VUX0lQUEQsIDAsIDAsIGJ1ZikpIDwgMCkgewotCQlkYmcoIkZhaWxlZCB0byBwb3dlciBkb3duIGludGVybmFsIFBIWTogJWQiLCByZXQpOwotCQlnb3RvIG91dDI7Ci0JfQotCi0JbXNsZWVwKDE1MCk7Ci0JaWYgKChyZXQgPQotCSAgICAgYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUkVTRVQsIEFYX1NXUkVTRVRfQ0xFQVIsIDAsIDAsIGJ1ZikpIDwgMCkgewotCQlkYmcoIkZhaWxlZCB0byBwZXJmb3JtIHNvZnR3YXJlIHJlc2V0OiAlZCIsIHJldCk7Ci0JCWdvdG8gb3V0MjsKLQl9Ci0KLQltc2xlZXAoMTUwKTsKLQlpZiAoKHJldCA9Ci0JICAgICBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19SRVNFVCwgQVhfU1dSRVNFVF9JUFJMIHwgQVhfU1dSRVNFVF9QUkwsIDAsIDAsIGJ1ZikpIDwgMCkgewotCQlkYmcoIkZhaWxlZCB0byBzZXQgSW50ZXJuYWwvRXh0ZXJuYWwgUEhZIHJlc2V0IGNvbnRyb2w6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQotCW1zbGVlcCgxNTApOwotCWlmICgocmV0ID0KLQkgICAgIGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX1JYX0NUTCwgMHgwMDAwLCAwLCAwLAotCQkJICAgICAgIGJ1ZikpIDwgMCkgewotCQlkYmcoIkZhaWxlZCB0byByZXNldCBSWF9DVEw6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQotCS8qIEdldCB0aGUgTUFDIGFkZHJlc3MgKi8KLQltZW1zZXQoYnVmLCAwLCBFVEhfQUxFTik7Ci0JaWYgKChyZXQgPSBheDg4MTd4X3JlYWRfY21kKGRldiwgQVg4ODc3Ml9DTURfUkVBRF9OT0RFX0lELCAwLCAwLCBFVEhfQUxFTiwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiRmFpbGVkIHRvIHJlYWQgTUFDIGFkZHJlc3M6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQltZW1jcHkoZGV2LT5uZXQtPmRldl9hZGRyLCBidWYsIEVUSF9BTEVOKTsKLQotCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU0VUX1NXX01JSSwgMCwgMCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiRW5hYmxpbmcgc29mdHdhcmUgTUlJIGZhaWxlZDogJWQiLCByZXQpOwotCQlnb3RvIG91dDI7Ci0JfQotCi0JaWYgKCgocmV0ID0KLQkgICAgICBheDg4MTd4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTUlJX1JFRywgMHgwMDEwLCAyLCAyLCBidWYpKSA8IDApCi0JICAgIHx8ICgqKCh1MTYgKilidWYpICE9IDB4MDAzYikpIHsKLQkJZGJnKCJSZWFkIFBIWSByZWdpc3RlciAyIG11c3QgYmUgMHgzYjAwOiAlZCIsIHJldCk7Ci0JCWdvdG8gb3V0MjsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIE1JSSBzdHJ1Y3R1cmUgKi8KLQlkZXYtPm1paS5kZXYgPSBkZXYtPm5ldDsKLQlkZXYtPm1paS5tZGlvX3JlYWQgPSBheDg4MTd4X21kaW9fcmVhZDsKLQlkZXYtPm1paS5tZGlvX3dyaXRlID0gYXg4ODE3eF9tZGlvX3dyaXRlOwotCWRldi0+bWlpLnBoeV9pZF9tYXNrID0gMHhmZjsKLQlkZXYtPm1paS5yZWdfbnVtX21hc2sgPSAweGZmOwotCi0JLyogR2V0IHRoZSBQSFkgaWQgKi8KLQlpZiAoKHJldCA9IGF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9QSFlfSUQsIDAsIDAsIDIsIGJ1ZikpIDwgMCkgewotCQlkYmcoIkVycm9yIHJlYWRpbmcgUEhZIElEOiAlMDJ4IiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0gZWxzZSBpZiAocmV0IDwgMikgewotCQkvKiB0aGlzIHNob3VsZCBhbHdheXMgcmV0dXJuIDIgYnl0ZXMgKi8KLQkJZGJnKCJBWF9DTURfUkVBRF9QSFlfSUQgcmV0dXJuZWQgbGVzcyB0aGFuIDIgYnl0ZXM6IHJldD0lMDJ4IiwKLQkJICAgIHJldCk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0MjsKLQl9Ci0JZGV2LT5taWkucGh5X2lkID0gKigodTggKilidWYgKyAxKTsKLQotCWlmICgocmV0ID0KLQkgICAgIGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1JFU0VULCBBWF9TV1JFU0VUX1BSTCwgMCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiU2V0IGV4dGVybmFsIFBIWSByZXNldCBwaW4gbGV2ZWw6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQltc2xlZXAoMTUwKTsKLQlpZiAoKHJldCA9Ci0JICAgICBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19SRVNFVCwgQVhfU1dSRVNFVF9JUFJMIHwgQVhfU1dSRVNFVF9QUkwsIDAsIDAsIGJ1ZikpIDwgMCkgewotCQlkYmcoIlNldCBJbnRlcm5hbC9FeHRlcm5hbCBQSFkgcmVzZXQgY29udHJvbDogJWQiLCByZXQpOwotCQlnb3RvIG91dDI7Ci0JfQotCW1zbGVlcCgxNTApOwotCi0KLQlkZXYtPm5ldC0+c2V0X211bHRpY2FzdF9saXN0ID0gYXg4ODE3eF9zZXRfbXVsdGljYXN0OwotCWRldi0+bmV0LT5ldGh0b29sX29wcyA9ICZheDg4NzcyX2V0aHRvb2xfb3BzOwotCi0JYXg4ODE3eF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKLQlheDg4MTd4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwKLQkJCUFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfQ1NNQSk7Ci0JbWlpX253YXlfcmVzdGFydCgmZGV2LT5taWkpOwotCi0JaWYgKChyZXQgPSBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NRURJVU1fTU9ERSwgQVg4ODc3Ml9NRURJVU1fREVGQVVMVCwgMCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiV3JpdGUgbWVkaXVtIG1vZGUgcmVnaXN0ZXI6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQotCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfSVBHMCwgQVg4ODc3Ml9JUEcwX0RFRkFVTFQgfCBBWDg4NzcyX0lQRzFfREVGQVVMVCxBWDg4NzcyX0lQRzJfREVGQVVMVCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiV3JpdGUgSVBHLElQRzEsSVBHMiBmYWlsZWQ6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQlpZiAoKHJldCA9Ci0JICAgICBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfSFdfTUlJLCAwLCAwLCAwLCAmYnVmKSkgPCAwKSB7Ci0JCWRiZygiRmFpbGVkIHRvIHNldCBoYXJkd2FyZSBNSUk6ICUwMngiLCByZXQpOwotCQlnb3RvIG91dDI7Ci0JfQotCi0JLyogU2V0IFJYX0NUTCB0byBkZWZhdWx0IHZhbHVlcyB3aXRoIDJrIGJ1ZmZlciwgYW5kIGVuYWJsZSBjYWN0dXMgKi8KLQlpZiAoKHJldCA9Ci0JICAgICBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9SWF9DVEwsIDB4MDA4OCwgMCwgMCwKLQkJCSAgICAgICBidWYpKSA8IDApIHsKLQkJZGJnKCJSZXNldCBSWF9DVEwgZmFpbGVkOiAlZCIsIHJldCk7Ci0JCWdvdG8gb3V0MjsKLQl9Ci0KLQlrZnJlZShidWYpOwotCi0JcmV0dXJuIDA7Ci0KLW91dDI6Ci0Ja2ZyZWUoYnVmKTsKLW91dDE6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBheDg4NzcyX3J4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQl1MzIgKmhlYWRlcjsKLQljaGFyICpwYWNrZXQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKmF4X3NrYjsKLQl1MTYgc2l6ZTsKLQotCWhlYWRlciA9ICh1MzIgKikgc2tiLT5kYXRhOwotCWxlMzJfdG9fY3B1cyhoZWFkZXIpOwotCXBhY2tldCA9IChjaGFyICopKGhlYWRlciArIDEpOwotCi0Jc2tiX3B1bGwoc2tiLCA0KTsKLQotCXdoaWxlIChza2ItPmxlbiA+IDApIHsKLQkJaWYgKChzaG9ydCkoKmhlYWRlciAmIDB4MDAwMGZmZmYpICE9Ci0JCSAgICB+KChzaG9ydCkoKCpoZWFkZXIgJiAweGZmZmYwMDAwKSA+PiAxNikpKSB7Ci0JCQlkZXZkYmcoZGV2LCJoZWFkZXIgbGVuZ3RoIGRhdGEgaXMgZXJyb3IiKTsKLQkJfQotCQkvKiBnZXQgdGhlIHBhY2tldCBsZW5ndGggKi8KLQkJc2l6ZSA9ICh1MTYpICgqaGVhZGVyICYgMHgwMDAwZmZmZik7Ci0KLQkJaWYgKChza2ItPmxlbikgLSAoKHNpemUgKyAxKSAmIDB4ZmZmZSkgPT0gMCkKLQkJCXJldHVybiAyOwotCQlpZiAoc2l6ZSA+IEVUSF9GUkFNRV9MRU4pIHsKLQkJCWRldmRiZyhkZXYsImludmFsaWQgcnggbGVuZ3RoICVkIiwgc2l6ZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlheF9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKGF4X3NrYikgewotCQkJYXhfc2tiLT5sZW4gPSBzaXplOwotCQkJYXhfc2tiLT5kYXRhID0gcGFja2V0OwotCQkJYXhfc2tiLT50YWlsID0gcGFja2V0ICsgc2l6ZTsKLQkJCXNrYl9yZXR1cm4oZGV2LCBheF9za2IpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlza2JfcHVsbChza2IsIChzaXplICsgMSkgJiAweGZmZmUpOwotCi0JCWlmIChza2ItPmxlbiA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaGVhZGVyID0gKHUzMiAqKSBza2ItPmRhdGE7Ci0JCWxlMzJfdG9fY3B1cyhoZWFkZXIpOwotCQlwYWNrZXQgPSAoY2hhciAqKShoZWFkZXIgKyAxKTsKLQkJc2tiX3B1bGwoc2tiLCA0KTsKLQl9Ci0KLQlpZiAoc2tiLT5sZW4gPCAwKSB7Ci0JCWRldmRiZyhkZXYsImludmFsaWQgcnggbGVuZ3RoICVkIiwgc2tiLT5sZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYXg4ODc3Ml90eF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCWludCBmbGFncykKLXsKLQlpbnQgcGFkbGVuOwotCWludCBoZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOwotCWludCB0YWlscm9vbSA9IHNrYl90YWlscm9vbShza2IpOwotCXUzMiAqcGFja2V0X2xlbjsKLQl1MzIgKnBhZGJ5dGVzX3B0cjsKLQotCXBhZGxlbiA9ICgoc2tiLT5sZW4gKyA0KSAlIDUxMikgPyAwIDogNDsKLQotCWlmICgoIXNrYl9jbG9uZWQoc2tiKSkKLQkgICAgJiYgKChoZWFkcm9vbSArIHRhaWxyb29tKSA+PSAoNCArIHBhZGxlbikpKSB7Ci0JCWlmICgoaGVhZHJvb20gPCA0KSB8fCAodGFpbHJvb20gPCBwYWRsZW4pKSB7Ci0JCQlza2ItPmRhdGEgPSBtZW1tb3ZlKHNrYi0+aGVhZCArIDQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgc2tiLT5sZW47Ci0JCX0KLQl9IGVsc2UgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKLQkJc2tiMiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIDQsIHBhZGxlbiwgZmxhZ3MpOwotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQlza2IgPSBza2IyOwotCQlpZiAoIXNrYikKLQkJCXJldHVybiBOVUxMOwotCX0KLQotCXBhY2tldF9sZW4gPSAodTMyICopIHNrYl9wdXNoKHNrYiwgNCk7Ci0KLQlwYWNrZXRfbGVuID0gKHUzMiAqKSBza2ItPmRhdGE7Ci0JKnBhY2tldF9sZW4gPSAoKChza2ItPmxlbiAtIDQpIF4gMHgwMDAwZmZmZikgPDwgMTYpICsgKHNrYi0+bGVuIC0gNCk7Ci0KLQlpZiAoKHNrYi0+bGVuICUgNTEyKSA9PSAwKSB7Ci0JCXBhZGJ5dGVzX3B0ciA9ICh1MzIgKikgc2tiLT50YWlsOwotCQkqcGFkYnl0ZXNfcHRyID0gMHhmZmZmMDAwMDsKLQkJc2tiX3B1dChza2IsIHBhZGxlbik7Ci0JfQotCXJldHVybiBza2I7Ci19Ci0KLXN0YXRpYyBpbnQgYXg4ODc3Ml9saW5rX3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQl1MTYgbHBhOwotCXUxNiBtb2RlOwotCi0JbW9kZSA9IEFYODg3NzJfTUVESVVNX0RFRkFVTFQ7Ci0JbHBhID0gYXg4ODE3eF9tZGlvX3JlYWQoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0xQQSk7Ci0KLQlpZiAoKGxwYSAmIExQQV9EVVBMRVgpID09IDApCi0JCW1vZGUgJj0gfkFYODg3NzJfTUVESVVNX0ZVTExfRFVQTEVYOwotCWlmICgobHBhICYgTFBBXzEwMCkgPT0gMCkKLQkJbW9kZSAmPSB+QVg4ODc3Ml9NRURJVU1fMTAwTUI7Ci0JYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTUVESVVNX01PREUsIG1vZGUsIDAsIDAsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8gYXg4ODE3eF9pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9ICJBU0lYIEFYODgxN3ggVVNCIDIuMCBFdGhlcm5ldCIsCi0JLmJpbmQgPSBheDg4MTd4X2JpbmQsCi0JLnN0YXR1cyA9IGF4ODgxN3hfc3RhdHVzLAotCS5saW5rX3Jlc2V0ID0gYXg4ODE3Ml9saW5rX3Jlc2V0LAotCS5yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKLQkuZmxhZ3MgPSAgRkxBR19FVEhFUiwKLQkuZGF0YSA9IDB4MDAxMzAxMDMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIGRsaW5rX2R1Yl9lMTAwX2luZm8gPSB7Ci0JLmRlc2NyaXB0aW9uID0gIkRMaW5rIERVQi1FMTAwIFVTQiBFdGhlcm5ldCIsCi0JLmJpbmQgPSBheDg4MTd4X2JpbmQsCi0JLnN0YXR1cyA9IGF4ODgxN3hfc3RhdHVzLAotCS5saW5rX3Jlc2V0ID0gYXg4ODE3Ml9saW5rX3Jlc2V0LAotCS5yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKLQkuZmxhZ3MgPSAgRkxBR19FVEhFUiwKLQkuZGF0YSA9IDB4MDA5ZjlkOWYsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIG5ldGdlYXJfZmExMjBfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPSAiTmV0Z2VhciBGQS0xMjAgVVNCIEV0aGVybmV0IiwKLQkuYmluZCA9IGF4ODgxN3hfYmluZCwKLQkuc3RhdHVzID0gYXg4ODE3eF9zdGF0dXMsCi0JLmxpbmtfcmVzZXQgPSBheDg4MTcyX2xpbmtfcmVzZXQsCi0JLnJlc2V0ID0gYXg4ODE3Ml9saW5rX3Jlc2V0LAotCS5mbGFncyA9ICBGTEFHX0VUSEVSLAotCS5kYXRhID0gMHgwMDEzMDEwMywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8gaGF3a2luZ191ZjIwMF9pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9ICJIYXdraW5nIFVGMjAwIFVTQiBFdGhlcm5ldCIsCi0JLmJpbmQgPSBheDg4MTd4X2JpbmQsCi0JLnN0YXR1cyA9IGF4ODgxN3hfc3RhdHVzLAotCS5saW5rX3Jlc2V0ID0gYXg4ODE3Ml9saW5rX3Jlc2V0LAotCS5yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKLQkuZmxhZ3MgPSAgRkxBR19FVEhFUiwKLQkuZGF0YSA9IDB4MDAxZjFkMWYsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIGF4ODg3NzJfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPSAiQVNJWCBBWDg4NzcyIFVTQiAyLjAgRXRoZXJuZXQiLAotCS5iaW5kID0gYXg4ODc3Ml9iaW5kLAotCS5zdGF0dXMgPSBheDg4MTd4X3N0YXR1cywKLQkubGlua19yZXNldCA9IGF4ODg3NzJfbGlua19yZXNldCwKLQkucmVzZXQgPSBheDg4NzcyX2xpbmtfcmVzZXQsCi0JLmZsYWdzID0gRkxBR19FVEhFUiB8IEZMQUdfRlJBTUlOR19BWCwKLQkucnhfZml4dXAgPSBheDg4NzcyX3J4X2ZpeHVwLAotCS50eF9maXh1cCA9IGF4ODg3NzJfdHhfZml4dXAsCi0JLmRhdGEgPSAweDAwMTMwMTAzLAotfTsKLQotI2VuZGlmIC8qIENPTkZJR19VU0JfQVg4ODE3WCAqLwotCi0KLQwKLSNpZmRlZglDT05GSUdfVVNCX0JFTEtJTgotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIEJlbGtpbiBGNVUxMDQgLi4uIHR3byBOZXRDaGlwIDIyODAgZGV2aWNlcyArIEF0bWVsIG1pY3JvY29udHJvbGxlcgotICoKLSAqIC4uLiBhbHNvIHR3byBlVEVLIGRlc2lnbnMsIGluY2x1ZGluZyBvbmUgc29sZCBhcyAiQWR2YW5jZSBVU0JORVQiCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwliZWxraW5faW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPQkiQmVsa2luLCBlVEVLLCBvciBjb21wYXRpYmxlIiwKLX07Ci0KLSNlbmRpZgkvKiBDT05GSUdfVVNCX0JFTEtJTiAqLwotCi0KLQwKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIENvbW11bmljYXRpb25zIERldmljZSBDbGFzcyBkZWNsYXJhdGlvbnMuCi0gKiBVc2VkIGJ5IENEQyBFdGhlcm5ldCwgYW5kIHNvbWUgQ0RDIHZhcmlhbnRzCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmCUNPTkZJR19VU0JfQ0RDRVRIRVIKLSNkZWZpbmUgTkVFRF9HRU5FUklDX0NEQwotI2VuZGlmCi0KLSNpZmRlZglDT05GSUdfVVNCX1pBVVJVUwotLyogRXRoZXJuZXQgdmFyaWFudCB1c2VzIGZ1bmt5IGZyYW1pbmcsIGJyb2tlbiBldGhlcm5ldCBhZGRyZXNzaW5nICovCi0jZGVmaW5lIE5FRURfR0VORVJJQ19DREMKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9STkRJUwotLyogQUNNIHZhcmlhbnQgdXNlcyBldmVuIGZ1bmtpZXIgZnJhbWluZywgY29tcGxleCBjb250cm9sIFJQQyBzY2hlbWUgKi8KLSNkZWZpbmUgTkVFRF9HRU5FUklDX0NEQwotI2VuZGlmCi0KLQotI2lmZGVmCU5FRURfR0VORVJJQ19DREMKLQotI2luY2x1ZGUgPGxpbnV4L3VzYl9jZGMuaD4KLQotc3RydWN0IGNkY19zdGF0ZSB7Ci0Jc3RydWN0IHVzYl9jZGNfaGVhZGVyX2Rlc2MJKmhlYWRlcjsKLQlzdHJ1Y3QgdXNiX2NkY191bmlvbl9kZXNjCSp1OwotCXN0cnVjdCB1c2JfY2RjX2V0aGVyX2Rlc2MJKmV0aGVyOwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlCQkqY29udHJvbDsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkJKmRhdGE7Ci19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNibmV0X2RyaXZlcjsKLQotLyoKLSAqIHByb2JlcyBjb250cm9sIGludGVyZmFjZSwgY2xhaW1zIGRhdGEgaW50ZXJmYWNlLCBjb2xsZWN0cyB0aGUgYnVsawotICogZW5kcG9pbnRzLCBhY3RpdmF0ZXMgZGF0YSBpbnRlcmZhY2UgKGlmIG5lZWRlZCksIG1heWJlIHNldHMgTVRVLgotICogYWxsIHB1cmUgY2RjLCBleGNlcHQgZm9yIGNlcnRhaW4gZmlybXdhcmUgd29ya2Fyb3VuZHMuCi0gKi8KLXN0YXRpYyBpbnQgZ2VuZXJpY19jZGNfYmluZCAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQl1OAkJCQkqYnVmID0gaW50Zi0+Y3VyX2FsdHNldHRpbmctPmV4dHJhOwotCWludAkJCQlsZW4gPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZXh0cmFsZW47Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvcgkqZDsKLQlzdHJ1Y3QgY2RjX3N0YXRlCQkqaW5mbyA9ICh2b2lkICopICZkZXYtPmRhdGE7Ci0JaW50CQkJCXN0YXR1czsKLQlpbnQJCQkJcm5kaXM7Ci0KLQlpZiAoc2l6ZW9mIGRldi0+ZGF0YSA8IHNpemVvZiAqaW5mbykKLQkJcmV0dXJuIC1FRE9NOwotCi0JLyogZXhwZWN0IHN0cmljdCBzcGVjIGNvbmZvcm1hbmNlIGZvciB0aGUgZGVzY3JpcHRvcnMsIGJ1dAotCSAqIGNvcGUgd2l0aCBmaXJtd2FyZSB3aGljaCBzdG9yZXMgdGhlbSBpbiB0aGUgd3JvbmcgcGxhY2UKLQkgKi8KLQlpZiAobGVuID09IDAgJiYgZGV2LT51ZGV2LT5hY3Rjb25maWctPmV4dHJhbGVuKSB7Ci0JCS8qIE1vdG9yb2xhIFNCNDEwMCAoYW5kIG90aGVyczogQnJhZCBIYXJkcyBzYXlzIGl0J3MKLQkJICogZnJvbSBhIEJyb2FkY29tIGRlc2lnbikgcHV0IENEQyBkZXNjcmlwdG9ycyBoZXJlCi0JCSAqLwotCQlidWYgPSBkZXYtPnVkZXYtPmFjdGNvbmZpZy0+ZXh0cmE7Ci0JCWxlbiA9IGRldi0+dWRldi0+YWN0Y29uZmlnLT5leHRyYWxlbjsKLQkJaWYgKGxlbikKLQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsCi0JCQkJIkNEQyBkZXNjcmlwdG9ycyBvbiBjb25maWdcbiIpOwotCX0KLQotCS8qIHRoaXMgYXNzdW1lcyB0aGF0IGlmIHRoZXJlJ3MgYSBub24tUk5ESVMgdmVuZG9yIHZhcmlhbnQKLQkgKiBvZiBjZGMtYWNtLCBpdCdsbCBmYWlsIFJORElTIHJlcXVlc3RzIGNsZWFubHkuCi0JICovCi0Jcm5kaXMgPSAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVByb3RvY29sID09IDB4ZmYpOwotCi0JbWVtc2V0IChpbmZvLCAwLCBzaXplb2YgKmluZm8pOwotCWluZm8tPmNvbnRyb2wgPSBpbnRmOwotCXdoaWxlIChsZW4gPiAzKSB7Ci0JCWlmIChidWYgWzFdICE9IFVTQl9EVF9DU19JTlRFUkZBQ0UpCi0JCQlnb3RvIG5leHRfZGVzYzsKLQotCQkvKiB1c2UgYkRlc2NyaXB0b3JTdWJUeXBlIHRvIGlkZW50aWZ5IHRoZSBDREMgZGVzY3JpcHRvcnMuCi0JCSAqIFdlIGV4cGVjdCBkZXZpY2VzIHdpdGggQ0RDIGhlYWRlciBhbmQgdW5pb24gZGVzY3JpcHRvcnMuCi0JCSAqIEZvciBDREMgRXRoZXJuZXQgd2UgbmVlZCB0aGUgZXRoZXJuZXQgZGVzY3JpcHRvci4KLQkJICogRm9yIFJORElTLCBpZ25vcmUgdHdvIChwb2ludGxlc3MpIENEQyBtb2RlbSBkZXNjcmlwdG9ycwotCQkgKiBpbiBmYXZvciBvZiBhIGNvbXBsaWNhdGVkIE9JRC1iYXNlZCBSUEMgc2NoZW1lIGRvaW5nIHdoYXQKLQkJICogQ0RDIEV0aGVybmV0IGFjaGlldmVzIHdpdGggYSBzaW1wbGUgZGVzY3JpcHRvci4KLQkJICovCi0JCXN3aXRjaCAoYnVmIFsyXSkgewotCQljYXNlIFVTQl9DRENfSEVBREVSX1RZUEU6Ci0JCQlpZiAoaW5mby0+aGVhZGVyKSB7Ci0JCQkJZGV2X2RiZyAoJmludGYtPmRldiwgImV4dHJhIENEQyBoZWFkZXJcbiIpOwotCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0JCQlpbmZvLT5oZWFkZXIgPSAodm9pZCAqKSBidWY7Ci0JCQlpZiAoaW5mby0+aGVhZGVyLT5iTGVuZ3RoICE9IHNpemVvZiAqaW5mby0+aGVhZGVyKSB7Ci0JCQkJZGV2X2RiZyAoJmludGYtPmRldiwgIkNEQyBoZWFkZXIgbGVuICV1XG4iLAotCQkJCQlpbmZvLT5oZWFkZXItPmJMZW5ndGgpOwotCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBVU0JfQ0RDX1VOSU9OX1RZUEU6Ci0JCQlpZiAoaW5mby0+dSkgewotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJleHRyYSBDREMgdW5pb25cbiIpOwotCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0JCQlpbmZvLT51ID0gKHZvaWQgKikgYnVmOwotCQkJaWYgKGluZm8tPnUtPmJMZW5ndGggIT0gc2l6ZW9mICppbmZvLT51KSB7Ci0JCQkJZGV2X2RiZyAoJmludGYtPmRldiwgIkNEQyB1bmlvbiBsZW4gJXVcbiIsCi0JCQkJCWluZm8tPnUtPmJMZW5ndGgpOwotCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0KLQkJCS8qIHdlIG5lZWQgYSBtYXN0ZXIvY29udHJvbCBpbnRlcmZhY2UgKHdoYXQgd2UncmUKLQkJCSAqIHByb2JlZCB3aXRoKSBhbmQgYSBzbGF2ZS9kYXRhIGludGVyZmFjZTsgdW5pb24KLQkJCSAqIGRlc2NyaXB0b3JzIHNvcnQgdGhpcyBhbGwgb3V0LgotCQkJICovCi0JCQlpbmZvLT5jb250cm9sID0gdXNiX2lmbnVtX3RvX2lmKGRldi0+dWRldiwKLQkJCQkJCWluZm8tPnUtPmJNYXN0ZXJJbnRlcmZhY2UwKTsKLQkJCWluZm8tPmRhdGEgPSB1c2JfaWZudW1fdG9faWYoZGV2LT51ZGV2LAotCQkJCQkJaW5mby0+dS0+YlNsYXZlSW50ZXJmYWNlMCk7Ci0JCQlpZiAoIWluZm8tPmNvbnRyb2wgfHwgIWluZm8tPmRhdGEpIHsKLQkJCQlkZXZfZGJnICgmaW50Zi0+ZGV2LAotCQkJCQkibWFzdGVyICMldS8lcCBzbGF2ZSAjJXUvJXBcbiIsCi0JCQkJCWluZm8tPnUtPmJNYXN0ZXJJbnRlcmZhY2UwLAotCQkJCQlpbmZvLT5jb250cm9sLAotCQkJCQlpbmZvLT51LT5iU2xhdmVJbnRlcmZhY2UwLAotCQkJCQlpbmZvLT5kYXRhKTsKLQkJCQlnb3RvIGJhZF9kZXNjOwotCQkJfQotCQkJaWYgKGluZm8tPmNvbnRyb2wgIT0gaW50ZikgewotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJib2d1cyBDREMgVW5pb25cbiIpOwotCQkJCS8qIEFtYml0IFVTQiBDYWJsZSBNb2RlbSAoYW5kIG1heWJlIG90aGVycykKLQkJCQkgKiBpbnRlcmNoYW5nZXMgbWFzdGVyIGFuZCBzbGF2ZSBpbnRlcmZhY2UuCi0JCQkJICovCi0JCQkJaWYgKGluZm8tPmRhdGEgPT0gaW50ZikgewotCQkJCQlpbmZvLT5kYXRhID0gaW5mby0+Y29udHJvbDsKLQkJCQkJaW5mby0+Y29udHJvbCA9IGludGY7Ci0JCQkJfSBlbHNlCi0JCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0KLQkJCS8qIGEgZGF0YSBpbnRlcmZhY2UgYWx0c2V0dGluZyBkb2VzIHRoZSByZWFsIGkvbyAqLwotCQkJZCA9ICZpbmZvLT5kYXRhLT5jdXJfYWx0c2V0dGluZy0+ZGVzYzsKLQkJCWlmIChkLT5iSW50ZXJmYWNlQ2xhc3MgIT0gVVNCX0NMQVNTX0NEQ19EQVRBKSB7Ci0JCQkJZGV2X2RiZyAoJmludGYtPmRldiwgInNsYXZlIGNsYXNzICV1XG4iLAotCQkJCQlkLT5iSW50ZXJmYWNlQ2xhc3MpOwotCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBVU0JfQ0RDX0VUSEVSTkVUX1RZUEU6Ci0JCQlpZiAoaW5mby0+ZXRoZXIpIHsKLQkJCQlkZXZfZGJnICgmaW50Zi0+ZGV2LCAiZXh0cmEgQ0RDIGV0aGVyXG4iKTsKLQkJCQlnb3RvIGJhZF9kZXNjOwotCQkJfQotCQkJaW5mby0+ZXRoZXIgPSAodm9pZCAqKSBidWY7Ci0JCQlpZiAoaW5mby0+ZXRoZXItPmJMZW5ndGggIT0gc2l6ZW9mICppbmZvLT5ldGhlcikgewotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJDREMgZXRoZXIgbGVuICV1XG4iLAotCQkJCQlpbmZvLT5ldGhlci0+Ykxlbmd0aCk7Ci0JCQkJZ290byBiYWRfZGVzYzsKLQkJCX0KLQkJCWRldi0+bmV0LT5tdHUgPSBsZTE2X3RvX2NwdXAgKAotCQkJCQkJJmluZm8tPmV0aGVyLT53TWF4U2VnbWVudFNpemUpCi0JCQkJCS0gRVRIX0hMRU47Ci0JCQkvKiBiZWNhdXNlIG9mIFphdXJ1cywgd2UgbWF5IGJlIGlnbm9yaW5nIHRoZSBob3N0Ci0JCQkgKiBzaWRlIGxpbmsgYWRkcmVzcyB3ZSB3ZXJlIGdpdmVuLgotCQkJICovCi0JCQlicmVhazsKLQkJfQotbmV4dF9kZXNjOgotCQlsZW4gLT0gYnVmIFswXTsJLyogYkxlbmd0aCAqLwotCQlidWYgKz0gYnVmIFswXTsKLQl9Ci0KLQlpZiAoIWluZm8tPmhlYWRlciB8fCAhaW5mby0+dSB8fCAoIXJuZGlzICYmICFpbmZvLT5ldGhlcikpIHsKLQkJZGV2X2RiZyAoJmludGYtPmRldiwgIm1pc3NpbmcgY2RjICVzJXMlc2Rlc2NyaXB0b3JcbiIsCi0JCQlpbmZvLT5oZWFkZXIgPyAiIiA6ICJoZWFkZXIgIiwKLQkJCWluZm8tPnUgPyAiIiA6ICJ1bmlvbiAiLAotCQkJaW5mby0+ZXRoZXIgPyAiIiA6ICJldGhlciAiKTsKLQkJZ290byBiYWRfZGVzYzsKLQl9Ci0KLQkvKiBjbGFpbSBkYXRhIGludGVyZmFjZSBhbmQgc2V0IGl0IHVwIC4uLiB3aXRoIHNpZGUgZWZmZWN0cy4KLQkgKiBuZXR3b3JrIHRyYWZmaWMgY2FuJ3QgZmxvdyB1bnRpbCBhbiBhbHRzZXR0aW5nIGlzIGVuYWJsZWQuCi0JICovCi0Jc3RhdHVzID0gdXNiX2RyaXZlcl9jbGFpbV9pbnRlcmZhY2UgKCZ1c2JuZXRfZHJpdmVyLCBpbmZvLT5kYXRhLCBkZXYpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCXN0YXR1cyA9IGdldF9lbmRwb2ludHMgKGRldiwgaW5mby0+ZGF0YSk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJLyogZW5zdXJlIGltbWVkaWF0ZSBleGl0IGZyb20gdXNibmV0X2Rpc2Nvbm5lY3QgKi8KLQkJdXNiX3NldF9pbnRmZGF0YShpbmZvLT5kYXRhLCBOVUxMKTsKLQkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSAoJnVzYm5ldF9kcml2ZXIsIGluZm8tPmRhdGEpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qIHN0YXR1cyBlbmRwb2ludDogb3B0aW9uYWwgZm9yIENEQyBFdGhlcm5ldCwgbm90IFJORElTIChvciBBQ00pICovCi0JZGV2LT5zdGF0dXMgPSBOVUxMOwotCWlmIChpbmZvLT5jb250cm9sLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzID09IDEpIHsKLQkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpkZXNjOwotCi0JCWRldi0+c3RhdHVzID0gJmluZm8tPmNvbnRyb2wtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludCBbMF07Ci0JCWRlc2MgPSAmZGV2LT5zdGF0dXMtPmRlc2M7Ci0JCWlmIChkZXNjLT5ibUF0dHJpYnV0ZXMgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UCi0JCQkJfHwgIShkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikKLQkJCQl8fCAobGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpCi0JCQkJCTwgc2l6ZW9mIChzdHJ1Y3QgdXNiX2NkY19ub3RpZmljYXRpb24pKQotCQkJCXx8ICFkZXNjLT5iSW50ZXJ2YWwpIHsKLQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJiYWQgbm90aWZpY2F0aW9uIGVuZHBvaW50XG4iKTsKLQkJCWRldi0+c3RhdHVzID0gTlVMTDsKLQkJfQotCX0KLQlpZiAocm5kaXMgJiYgIWRldi0+c3RhdHVzKSB7Ci0JCWRldl9kYmcgKCZpbnRmLT5kZXYsICJtaXNzaW5nIFJORElTIHN0YXR1cyBlbmRwb2ludFxuIik7Ci0JCXVzYl9zZXRfaW50ZmRhdGEoaW5mby0+ZGF0YSwgTlVMTCk7Ci0JCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UgKCZ1c2JuZXRfZHJpdmVyLCBpbmZvLT5kYXRhKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybiAwOwotCi1iYWRfZGVzYzoKLQlkZXZfaW5mbyAoJmRldi0+dWRldi0+ZGV2LCAiYmFkIENEQyBkZXNjcmlwdG9yc1xuIik7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyB2b2lkIGNkY191bmJpbmQgKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3RydWN0IGNkY19zdGF0ZQkJKmluZm8gPSAodm9pZCAqKSAmZGV2LT5kYXRhOwotCi0JLyogZGlzY29ubmVjdCBtYXN0ZXIgLS0+IGRpc2Nvbm5lY3Qgc2xhdmUgKi8KLQlpZiAoaW50ZiA9PSBpbmZvLT5jb250cm9sICYmIGluZm8tPmRhdGEpIHsKLQkJLyogZW5zdXJlIGltbWVkaWF0ZSBleGl0IGZyb20gdXNibmV0X2Rpc2Nvbm5lY3QgKi8KLQkJdXNiX3NldF9pbnRmZGF0YShpbmZvLT5kYXRhLCBOVUxMKTsKLQkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSAoJnVzYm5ldF9kcml2ZXIsIGluZm8tPmRhdGEpOwotCQlpbmZvLT5kYXRhID0gTlVMTDsKLQl9Ci0KLQkvKiBhbmQgdmljZSB2ZXJzYSAoanVzdCBpbiBjYXNlKSAqLwotCWVsc2UgaWYgKGludGYgPT0gaW5mby0+ZGF0YSAmJiBpbmZvLT5jb250cm9sKSB7Ci0JCS8qIGVuc3VyZSBpbW1lZGlhdGUgZXhpdCBmcm9tIHVzYm5ldF9kaXNjb25uZWN0ICovCi0JCXVzYl9zZXRfaW50ZmRhdGEoaW5mby0+Y29udHJvbCwgTlVMTCk7Ci0JCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UgKCZ1c2JuZXRfZHJpdmVyLCBpbmZvLT5jb250cm9sKTsKLQkJaW5mby0+Y29udHJvbCA9IE5VTEw7Ci0JfQotfQotCi0jZW5kaWYJLyogTkVFRF9HRU5FUklDX0NEQyAqLwotCi0MCi0jaWZkZWYJQ09ORklHX1VTQl9DRENFVEhFUgotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIENvbW11bmljYXRpb25zIERldmljZSBDbGFzcywgRXRoZXJuZXQgQ29udHJvbCBtb2RlbAotICoKLSAqIFRha2VzIHR3byBpbnRlcmZhY2VzLiAgVGhlIERBVEEgaW50ZXJmYWNlIGlzIGluYWN0aXZlIHRpbGwgYW4gYWx0c2V0dGluZwotICogaXMgc2VsZWN0ZWQuICBDb25maWd1cmF0aW9uIGRhdGEgaW5jbHVkZXMgY2xhc3MgZGVzY3JpcHRvcnMuCi0gKgotICogVGhpcyBzaG91bGQgaW50ZXJvcCB3aXRoIHdoYXRldmVyIHRoZSAyLjQgIkNEQ0V0aGVyLmMiIGRyaXZlcgotICogKGJ5IEJyYWQgSGFyZHMpIHRhbGtlZCB3aXRoLgotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotCi0KLXN0YXRpYyB2b2lkIGR1bXBzcGVlZCAoc3RydWN0IHVzYm5ldCAqZGV2LCBfX2xlMzIgKnNwZWVkcykKLXsKLQlpZiAobmV0aWZfbXNnX3RpbWVyIChkZXYpKQotCQlkZXZpbmZvIChkZXYsICJsaW5rIHNwZWVkczogJXUga2JwcyB1cCwgJXUga2JwcyBkb3duIiwKLQkJCV9fbGUzMl90b19jcHUoc3BlZWRzWzBdKSAvIDEwMDAsCi0JCV9fbGUzMl90b19jcHUoc3BlZWRzWzFdKSAvIDEwMDApOwotfQotCi1zdGF0aWMgdm9pZCBjZGNfc3RhdHVzIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3QgdXNiX2NkY19ub3RpZmljYXRpb24JKmV2ZW50OwotCi0JaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA8IHNpemVvZiAqZXZlbnQpCi0JCXJldHVybjsKLQkKLQkvKiBTUEVFRF9DSEFOR0UgY2FuIGdldCBzcGxpdCBpbnRvIHR3byA4LWJ5dGUgcGFja2V0cyAqLwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQgKEVWRU5UX1NUU19TUExJVCwgJmRldi0+ZmxhZ3MpKSB7Ci0JCWR1bXBzcGVlZCAoZGV2LCAoX19sZTMyICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKLQkJcmV0dXJuOwotCX0KLQotCWV2ZW50ID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0Jc3dpdGNoIChldmVudC0+Yk5vdGlmaWNhdGlvblR5cGUpIHsKLQljYXNlIFVTQl9DRENfTk9USUZZX05FVFdPUktfQ09OTkVDVElPTjoKLQkJaWYgKG5ldGlmX21zZ190aW1lciAoZGV2KSkKLQkJCWRldmRiZyAoZGV2LCAiQ0RDOiBjYXJyaWVyICVzIiwKLQkJCQkJZXZlbnQtPndWYWx1ZSA/ICJvbiIgOiAib2ZmIik7Ci0JCWlmIChldmVudC0+d1ZhbHVlKQotCQkJbmV0aWZfY2Fycmllcl9vbihkZXYtPm5ldCk7Ci0JCWVsc2UKLQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldi0+bmV0KTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfQ0RDX05PVElGWV9TUEVFRF9DSEFOR0U6CS8qIHR4L3J4IHJhdGVzICovCi0JCWlmIChuZXRpZl9tc2dfdGltZXIgKGRldikpCi0JCQlkZXZkYmcgKGRldiwgIkNEQzogc3BlZWQgY2hhbmdlIChsZW4gJWQpIiwKLQkJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSAoc2l6ZW9mICpldmVudCArIDgpKQotCQkJc2V0X2JpdCAoRVZFTlRfU1RTX1NQTElULCAmZGV2LT5mbGFncyk7Ci0JCWVsc2UKLQkJCWR1bXBzcGVlZCAoZGV2LCAoX19sZTMyICopICZldmVudFsxXSk7Ci0JCWJyZWFrOwotCS8vIGNhc2UgVVNCX0NEQ19OT1RJRllfUkVTUE9OU0VfQVZBSUxBQkxFOgkvKiBSTkRJUzsgb3IgdW5zb2xpY2l0ZWQgKi8KLQlkZWZhdWx0OgotCQlkZXZlcnIgKGRldiwgIkNEQzogdW5leHBlY3RlZCBub3RpZmljYXRpb24gJTAyeCEiLAotCQkJCSBldmVudC0+Yk5vdGlmaWNhdGlvblR5cGUpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB1OCBuaWJibGUgKHVuc2lnbmVkIGNoYXIgYykKLXsKLQlpZiAobGlrZWx5IChpc2RpZ2l0IChjKSkpCi0JCXJldHVybiBjIC0gJzAnOwotCWMgPSB0b3VwcGVyIChjKTsKLQlpZiAobGlrZWx5IChpc3hkaWdpdCAoYykpKQotCQlyZXR1cm4gMTAgKyBjIC0gJ0EnOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotZ2V0X2V0aGVybmV0X2FkZHIgKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9jZGNfZXRoZXJfZGVzYyAqZSkKLXsKLQlpbnQgCQl0bXAsIGk7Ci0JdW5zaWduZWQgY2hhcglidWYgWzEzXTsKLQotCXRtcCA9IHVzYl9zdHJpbmcgKGRldi0+dWRldiwgZS0+aU1BQ0FkZHJlc3MsIGJ1Ziwgc2l6ZW9mIGJ1Zik7Ci0JaWYgKHRtcCAhPSAxMikgewotCQlkZXZfZGJnICgmZGV2LT51ZGV2LT5kZXYsCi0JCQkiYmFkIE1BQyBzdHJpbmcgJWQgZmV0Y2gsICVkXG4iLCBlLT5pTUFDQWRkcmVzcywgdG1wKTsKLQkJaWYgKHRtcCA+PSAwKQotCQkJdG1wID0gLUVJTlZBTDsKLQkJcmV0dXJuIHRtcDsKLQl9Ci0JZm9yIChpID0gdG1wID0gMDsgaSA8IDY7IGkrKywgdG1wICs9IDIpCi0JCWRldi0+bmV0LT5kZXZfYWRkciBbaV0gPQotCQkJIChuaWJibGUgKGJ1ZiBbdG1wXSkgPDwgNCkgKyBuaWJibGUgKGJ1ZiBbdG1wICsgMV0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNkY19iaW5kIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCWludAkJCQlzdGF0dXM7Ci0Jc3RydWN0IGNkY19zdGF0ZQkJKmluZm8gPSAodm9pZCAqKSAmZGV2LT5kYXRhOwotCi0Jc3RhdHVzID0gZ2VuZXJpY19jZGNfYmluZCAoZGV2LCBpbnRmKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCXN0YXR1cyA9IGdldF9ldGhlcm5ldF9hZGRyIChkZXYsIGluZm8tPmV0aGVyKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQl1c2Jfc2V0X2ludGZkYXRhKGluZm8tPmRhdGEsIE5VTEwpOwotCQl1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlICgmdXNibmV0X2RyaXZlciwgaW5mby0+ZGF0YSk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyogRklYTUUgY2RjLWV0aGVyIGhhcyBzb21lIG11bHRpY2FzdCBjb2RlIHRvbywgdGhvdWdoIGl0IGNvbXBsYWlucwotCSAqIGluIHJvdXRpbmUgY2FzZXMuICBpbmZvLT5ldGhlciBkZXNjcmliZXMgdGhlIG11bHRpY2FzdCBzdXBwb3J0LgotCSAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvCWNkY19pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9CSJDREMgRXRoZXJuZXQgRGV2aWNlIiwKLQkuZmxhZ3MgPQlGTEFHX0VUSEVSLAotCS8vIC5jaGVja19jb25uZWN0ID0gY2RjX2NoZWNrX2Nvbm5lY3QsCi0JLmJpbmQgPQkJY2RjX2JpbmQsCi0JLnVuYmluZCA9CWNkY191bmJpbmQsCi0JLnN0YXR1cyA9CWNkY19zdGF0dXMsCi19OwotCi0jZW5kaWYJLyogQ09ORklHX1VTQl9DRENFVEhFUiAqLwotCi0KLQwKLSNpZmRlZglDT05GSUdfVVNCX0VQU09OMjg4OAotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIEVQU09OIFVTQiBjbGllbnRzCi0gKgotICogVGhpcyBpcyB0aGUgc2FtZSBpZGVhIGFzIExpbnV4IFBEQXMgKGJlbG93KSBleGNlcHQgdGhlIGZpcm13YXJlIGluIHRoZQotICogZGV2aWNlIG1pZ2h0IG5vdCBiZSBUdXgtcG93ZXJlZC4gIEVwc29uIHByb3ZpZGVzIHJlZmVyZW5jZSBmaXJtd2FyZSB0aGF0Ci0gKiBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLiAgUHJvZHVjdCBkZXZlbG9wZXJzIGNhbiByZXVzZSBvciBtb2RpZnkgdGhhdAotICogY29kZSwgc3VjaCBhcyBieSB1c2luZyB0aGVpciBvd24gcHJvZHVjdCBhbmQgdmVuZG9yIGNvZGVzLgotICoKLSAqIFN1cHBvcnQgd2FzIGZyb20gSnVybyBCeXN0cmlja3kgPGJ5c3RyaWNreS5qdXJvQGVyZC5lcHNvbi5jb20+Ci0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwllcHNvbjI4ODhfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPQkiRXBzb24gVVNCIERldmljZSIsCi0JLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAotCi0JLmluID0gNCwgLm91dCA9IDMsCi19OwotCi0jZW5kaWYJLyogQ09ORklHX1VTQl9FUFNPTjI4ODggKi8KLQotDAotI2lmZGVmIENPTkZJR19VU0JfR0VORVNZUwotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIEdlbmVTeXMgR0w2MjBVU0ItQSAod3d3LmdlbmVzeXNsb2dpYy5jb20udHcpCi0gKgotICogLi4uIHNob3VsZCBwYXJ0aWFsbHkgaW50ZXJvcCB3aXRoIHRoZSBXaW4zMiBkcml2ZXIgZm9yIHRoaXMgaGFyZHdhcmUKLSAqIFRoZSBHZW5lU3lzIGRvY3MgaW1wbHkgdGhlcmUncyBzb21lIE5ESVMgaXNzdWUgbW90aXZhdGluZyB0aGlzIGZyYW1pbmcuCi0gKgotICogU29tZSBpbmZvIGZyb20gR2VuZVN5czoKLSAqICAtIEdMNjIwVVNCLUEgaXMgZnVsbCBkdXBsZXg7IEdMNjIwVVNCIGlzIG9ubHkgaGFsZiBkdXBsZXggZm9yIGJ1bGsuCi0gKiAgICAoU29tZSBjYWJsZXMsIGxpa2UgdGhlIEJBRk8tMTAwYywgdXNlIHRoZSBoYWxmIGR1cGxleCB2ZXJzaW9uLikKLSAqICAtIEZvciB0aGUgZnVsbCBkdXBsZXggbW9kZWwsIHRoZSBsb3cgYml0IG9mIHRoZSB2ZXJzaW9uIGNvZGUgc2F5cwotICogICAgd2hpY2ggc2lkZSBpcyB3aGljaCAoImxlZnQvcmlnaHQiKS4KLSAqICAtIEZvciB0aGUgaGFsZiBkdXBsZXggdHlwZSwgYSBjb250cm9sL2ludGVycnVwdCBoYW5kc2hha2Ugc2V0dGxlcwotICogICAgdGhlIHRyYW5zZmVyIGRpcmVjdGlvbi4gIChUaGF0J3MgZGlzYWJsZWQgaGVyZSwgcGFydGlhbGx5IGNvZGVkLikKLSAqICAgIEEgY29udHJvbCBVUkIgd291bGQgYmxvY2sgdW50aWwgb3RoZXIgc2lkZSB3cml0ZXMgYW4gaW50ZXJydXB0LgotICoKLSAqIE9yaWdpbmFsIGNvZGUgZnJvbSBKaXVuLUppZSBIdWFuZyA8aHVhbmdqakBnZW5lc3lzbG9naWMuY29tLnR3PgotICogYW5kIG1lcmdlZCBpbnRvICJ1c2JuZXQiIGJ5IFN0YW5pc2xhdiBCcmFiZWMgPHV0eEBwZW5ndWluLmN6Pi4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vLyBjb250cm9sIG1zZyB3cml0ZSBjb21tYW5kCi0jZGVmaW5lIEdFTkVMSU5LX0NPTk5FQ1RfV1JJVEUJCQkweEYwCi0vLyBpbnRlcnJ1cHQgcGlwZSBpbmRleAotI2RlZmluZSBHRU5FTElOS19JTlRFUlJVUFRfUElQRQkJCTB4MDMKLS8vIGludGVycnVwdCByZWFkIGJ1ZmZlciBzaXplCi0jZGVmaW5lIElOVEVSUlVQVF9CVUZTSVpFCQkJMHgwOAotLy8gaW50ZXJydXB0IHBpcGUgaW50ZXJ2YWwgdmFsdWUKLSNkZWZpbmUgR0VORUxJTktfSU5URVJSVVBUX0lOVEVSVkFMCQkweDEwCi0vLyBtYXggdHJhbnNtaXQgcGFja2V0IG51bWJlciBwZXIgdHJhbnNtaXQKLSNkZWZpbmUgR0xfTUFYX1RSQU5TTUlUX1BBQ0tFVFMJCQkzMgotLy8gbWF4IHBhY2tldCBsZW5ndGgKLSNkZWZpbmUgR0xfTUFYX1BBQ0tFVF9MRU4JCQkxNTE0Ci0vLyBtYXggcmVjZWl2ZSBidWZmZXIgc2l6ZSAKLSNkZWZpbmUgR0xfUkNWX0JVRl9TSVpFCQlcCi0JKCgoR0xfTUFYX1BBQ0tFVF9MRU4gKyA0KSAqIEdMX01BWF9UUkFOU01JVF9QQUNLRVRTKSArIDQpCi0KLXN0cnVjdCBnbF9wYWNrZXQgewotCXUzMgkJcGFja2V0X2xlbmd0aDsKLQljaGFyCQlwYWNrZXRfZGF0YSBbMV07Ci19OwotCi1zdHJ1Y3QgZ2xfaGVhZGVyIHsKLQl1MzIJCQlwYWNrZXRfY291bnQ7Ci0Jc3RydWN0IGdsX3BhY2tldAlwYWNrZXRzOwotfTsKLQotI2lmZGVmCUdFTkVMSU5LX0FDSwotCi0vLyBGSVhNRTogIHRoaXMgY29kZSBpcyBpbmNvbXBsZXRlLCBub3QgZGVidWdnZWQ7IGl0IGRvZXNuJ3QKLS8vIGhhbmRsZSBpbnRlcnJ1cHRzIGNvcnJlY3RseS4gIGludGVycnVwdHMgc2hvdWxkIGJlIGdlbmVyaWMKLS8vIGNvZGUgbGlrZSBhbGwgb3RoZXIgZGV2aWNlIEkvTywgYW55d2F5LgotCi1zdHJ1Y3QgZ2xfcHJpdiB7IAotCXN0cnVjdCB1cmIJKmlycV91cmI7Ci0JY2hhcgkJaXJxX2J1ZiBbSU5URVJSVVBUX0JVRlNJWkVdOwotfTsKLQotc3RhdGljIGlubGluZSBpbnQgZ2xfY29udHJvbF93cml0ZSAoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUpCi17Ci0JaW50IHJldHZhbDsKLQotCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyAoZGV2LT51ZGV2LAotCQkgICAgICB1c2Jfc25kY3RybHBpcGUgKGRldi0+dWRldiwgMCksCi0JCSAgICAgIHJlcXVlc3QsCi0JCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAotCQkgICAgICB2YWx1ZSwgCi0JCSAgICAgIDAsCQkJLy8gaW5kZXgKLQkJICAgICAgMCwJCQkvLyBkYXRhIGJ1ZmZlcgotCQkgICAgICAwLAkJCS8vIHNpemUKLQkJICAgICAgQ09OVFJPTF9USU1FT1VUX01TKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZCBnbF9pbnRlcnJ1cHRfY29tcGxldGUgKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwotCQotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JY2FzZSAwOgotCQkvKiBzdWNjZXNzICovCi0JCWJyZWFrOwotCWNhc2UgLUVDT05OUkVTRVQ6Ci0JY2FzZSAtRU5PRU5UOgotCWNhc2UgLUVTSFVURE9XTjoKLQkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCi0JCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOwotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJCV9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwotCX0KLQotCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwotCWlmIChzdGF0dXMpCi0JCWVyciAoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2xfaW50ZXJydXB0X3JlYWQgKHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQlzdHJ1Y3QgZ2xfcHJpdgkqcHJpdiA9IGRldi0+cHJpdl9kYXRhOwotCWludAkJcmV0dmFsOwotCi0JLy8gaXNzdWUgdXNiIGludGVycnVwdCByZWFkCi0JaWYgKHByaXYgJiYgcHJpdi0+aXJxX3VyYikgewotCQkvLyBzdWJtaXQgdXJiCi0JCWlmICgocmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHByaXYtPmlycV91cmIsIEdGUF9LRVJORUwpKSAhPSAwKQotCQkJZGJnICgiZ2xfaW50ZXJydXB0X3JlYWQ6IHN1Ym1pdCBmYWlsIC0gJVguLi4iLCByZXR2YWwpOwotCQllbHNlCi0JCQlkYmcgKCJnbF9pbnRlcnJ1cHRfcmVhZDogc3VibWl0IHN1Y2Nlc3MuLi4iKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLy8gY2hlY2sgd2hldGhlciBhbm90aGVyIHNpZGUgaXMgY29ubmVjdGVkCi1zdGF0aWMgaW50IGdlbmVsaW5rX2NoZWNrX2Nvbm5lY3QgKHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQlpbnQJCQlyZXR2YWw7Ci0KLQlkYmcgKCJnZW5lbGlua19jaGVja19jb25uZWN0Li4uIik7Ci0KLQkvLyBkZXRlY3Qgd2hldGhlciBhbm90aGVyIHNpZGUgaXMgY29ubmVjdGVkCi0JaWYgKChyZXR2YWwgPSBnbF9jb250cm9sX3dyaXRlIChkZXYsIEdFTkVMSU5LX0NPTk5FQ1RfV1JJVEUsIDApKSAhPSAwKSB7Ci0JCWRiZyAoIiVzOiBnZW5lbGlua19jaGVja19jb25uZWN0IHdyaXRlIGZhaWwgLSAlWCIsCi0JCQlkZXYtPm5ldC0+bmFtZSwgcmV0dmFsKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQkvLyB1c2IgaW50ZXJydXB0IHJlYWQgdG8gYWNrIGFub3RoZXIgc2lkZSAKLQlpZiAoKHJldHZhbCA9IGdsX2ludGVycnVwdF9yZWFkIChkZXYpKSAhPSAwKSB7Ci0JCWRiZyAoIiVzOiBnZW5lbGlua19jaGVja19jb25uZWN0IHJlYWQgZmFpbCAtICVYIiwKLQkJCWRldi0+bmV0LT5uYW1lLCByZXR2YWwpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCWRiZyAoIiVzOiBnZW5lbGlua19jaGVja19jb25uZWN0IHJlYWQgc3VjY2VzcyIsIGRldi0+bmV0LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotLy8gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHByaXZhdGUgZGF0YSBmb3IgZ2VuZWxpbmsKLXN0YXRpYyBpbnQgZ2VuZWxpbmtfaW5pdCAoc3RydWN0IHVzYm5ldCAqZGV2KQotewotCXN0cnVjdCBnbF9wcml2ICpwcml2OwotCi0JLy8gYWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKLQlpZiAoKHByaXYgPSBrbWFsbG9jIChzaXplb2YgKnByaXYsIEdGUF9LRVJORUwpKSA9PSAwKSB7Ci0JCWRiZyAoIiVzOiBjYW5ub3QgYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIHBlciBkZXZpY2UiLAotCQkJZGV2LT5uZXQtPm5hbWUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvLyBhbGxvY2F0ZSBpcnEgdXJiCi0JaWYgKChwcml2LT5pcnFfdXJiID0gdXNiX2FsbG9jX3VyYiAoMCwgR0ZQX0tFUk5FTCkpID09IDApIHsKLQkJZGJnICgiJXM6IGNhbm5vdCBhbGxvY2F0ZSBwcml2YXRlIGlycSB1cmIgcGVyIGRldmljZSIsCi0JCQlkZXYtPm5ldC0+bmFtZSk7Ci0JCWtmcmVlIChwcml2KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLy8gZmlsbCBpcnEgdXJiCi0JdXNiX2ZpbGxfaW50X3VyYiAocHJpdi0+aXJxX3VyYiwgZGV2LT51ZGV2LAotCQl1c2JfcmN2aW50cGlwZSAoZGV2LT51ZGV2LCBHRU5FTElOS19JTlRFUlJVUFRfUElQRSksCi0JCXByaXYtPmlycV9idWYsIElOVEVSUlVQVF9CVUZTSVpFLAotCQlnbF9pbnRlcnJ1cHRfY29tcGxldGUsIDAsCi0JCUdFTkVMSU5LX0lOVEVSUlVQVF9JTlRFUlZBTCk7Ci0KLQkvLyBzZXQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIKLQlkZXYtPnByaXZfZGF0YSA9IHByaXY7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLy8gcmVsZWFzZSB0aGUgcHJpdmF0ZSBkYXRhCi1zdGF0aWMgaW50IGdlbmVsaW5rX2ZyZWUgKHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQlzdHJ1Y3QgZ2xfcHJpdgkqcHJpdiA9IGRldi0+cHJpdl9kYXRhOwotCi0JaWYgKCFwcml2KSAKLQkJcmV0dXJuIDA7Ci0KLS8vIEZJWE1FOiAgY2FuJ3QgY2FuY2VsIGhlcmU7IGl0J3Mgc3luY2hyb25vdXMsIGFuZAotLy8gc2hvdWxkIGhhdmUgaGFwcGVuZWQgZWFybGllciBpbiBhbnkgY2FzZSAoaW50ZXJydXB0Ci0vLyBoYW5kbGluZyBuZWVkcyB0byBiZSBnZW5lcmljKQotCi0JLy8gY2FuY2VsIGlycSB1cmIgZmlyc3QKLQl1c2Jfa2lsbF91cmIgKHByaXYtPmlycV91cmIpOwotCi0JLy8gZnJlZSBpcnEgdXJiCi0JdXNiX2ZyZWVfdXJiIChwcml2LT5pcnFfdXJiKTsKLQotCS8vIGZyZWUgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKLQlrZnJlZSAocHJpdik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgZ2VuZWxpbmtfcnhfZml4dXAgKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgZ2xfaGVhZGVyCSpoZWFkZXI7Ci0Jc3RydWN0IGdsX3BhY2tldAkqcGFja2V0OwotCXN0cnVjdCBza19idWZmCQkqZ2xfc2tiOwotCXUzMgkJCXNpemU7Ci0KLQloZWFkZXIgPSAoc3RydWN0IGdsX2hlYWRlciAqKSBza2ItPmRhdGE7Ci0KLQkvLyBnZXQgdGhlIHBhY2tldCBjb3VudCBvZiB0aGUgcmVjZWl2ZWQgc2tiCi0JbGUzMl90b19jcHVzICgmaGVhZGVyLT5wYWNrZXRfY291bnQpOwotCWlmICgoaGVhZGVyLT5wYWNrZXRfY291bnQgPiBHTF9NQVhfVFJBTlNNSVRfUEFDS0VUUykKLQkJCXx8IChoZWFkZXItPnBhY2tldF9jb3VudCA8IDApKSB7Ci0JCWRiZyAoImdlbmVsaW5rOiBpbnZhbGlkIHJlY2VpdmVkIHBhY2tldCBjb3VudCAlZCIsCi0JCQloZWFkZXItPnBhY2tldF9jb3VudCk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8vIHNldCB0aGUgY3VycmVudCBwYWNrZXQgcG9pbnRlciB0byB0aGUgZmlyc3QgcGFja2V0Ci0JcGFja2V0ID0gJmhlYWRlci0+cGFja2V0czsKLQotCS8vIGRlY3JlbWVudCB0aGUgbGVuZ3RoIGZvciB0aGUgcGFja2V0IGNvdW50IHNpemUgNCBieXRlcwotCXNrYl9wdWxsIChza2IsIDQpOwotCi0Jd2hpbGUgKGhlYWRlci0+cGFja2V0X2NvdW50ID4gMSkgewotCQkvLyBnZXQgdGhlIHBhY2tldCBsZW5ndGgKLQkJc2l6ZSA9IHBhY2tldC0+cGFja2V0X2xlbmd0aDsKLQotCQkvLyB0aGlzIG1heSBiZSBhIGJyb2tlbiBwYWNrZXQKLQkJaWYgKHNpemUgPiBHTF9NQVhfUEFDS0VUX0xFTikgewotCQkJZGJnICgiZ2VuZWxpbms6IGludmFsaWQgcnggbGVuZ3RoICVkIiwgc2l6ZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8vIGFsbG9jYXRlIHRoZSBza2IgZm9yIHRoZSBpbmRpdmlkdWFsIHBhY2tldAotCQlnbF9za2IgPSBhbGxvY19za2IgKHNpemUsIEdGUF9BVE9NSUMpOwotCQlpZiAoZ2xfc2tiKSB7Ci0KLQkJCS8vIGNvcHkgdGhlIHBhY2tldCBkYXRhIHRvIHRoZSBuZXcgc2tiCi0JCQltZW1jcHkoc2tiX3B1dChnbF9za2IsIHNpemUpLCBwYWNrZXQtPnBhY2tldF9kYXRhLCBzaXplKTsKLQkJCXNrYl9yZXR1cm4gKGRldiwgZ2xfc2tiKTsKLQkJfQotCi0JCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgcGFja2V0Ci0JCXBhY2tldCA9IChzdHJ1Y3QgZ2xfcGFja2V0ICopCi0JCQkmcGFja2V0LT5wYWNrZXRfZGF0YSBbc2l6ZV07Ci0JCWhlYWRlci0+cGFja2V0X2NvdW50LS07Ci0KLQkJLy8gc2hpZnQgdGhlIGRhdGEgcG9pbnRlciB0byB0aGUgbmV4dCBnbF9wYWNrZXQKLQkJc2tiX3B1bGwgKHNrYiwgc2l6ZSArIDQpOwotCX0KLQotCS8vIHNraXAgdGhlIHBhY2tldCBsZW5ndGggZmllbGQgNCBieXRlcwotCXNrYl9wdWxsIChza2IsIDQpOwotCi0JaWYgKHNrYi0+bGVuID4gR0xfTUFYX1BBQ0tFVF9MRU4pIHsKLQkJZGJnICgiZ2VuZWxpbms6IGludmFsaWQgcnggbGVuZ3RoICVkIiwgc2tiLT5sZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCi1nZW5lbGlua190eF9maXh1cCAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZmxhZ3MpCi17Ci0JaW50IAlwYWRsZW47Ci0JaW50CWxlbmd0aCA9IHNrYi0+bGVuOwotCWludAloZWFkcm9vbSA9IHNrYl9oZWFkcm9vbSAoc2tiKTsKLQlpbnQJdGFpbHJvb20gPSBza2JfdGFpbHJvb20gKHNrYik7Ci0JdTMyCSpwYWNrZXRfY291bnQ7Ci0JdTMyCSpwYWNrZXRfbGVuOwotCi0JLy8gRklYTUU6ICBtYWdpYyBudW1iZXJzLCBibGVlY2gKLQlwYWRsZW4gPSAoKHNrYi0+bGVuICsgKDQgKyA0KjEpKSAlIDY0KSA/IDAgOiAxOwotCi0JaWYgKCghc2tiX2Nsb25lZCAoc2tiKSkKLQkJCSYmICgoaGVhZHJvb20gKyB0YWlscm9vbSkgPj0gKHBhZGxlbiArICg0ICsgNCoxKSkpKSB7Ci0JCWlmICgoaGVhZHJvb20gPCAoNCArIDQqMSkpIHx8ICh0YWlscm9vbSA8IHBhZGxlbikpIHsKLQkJCXNrYi0+ZGF0YSA9IG1lbW1vdmUgKHNrYi0+aGVhZCArICg0ICsgNCoxKSwKLQkJCQkJICAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHNrX2J1ZmYJKnNrYjI7Ci0JCXNrYjIgPSBza2JfY29weV9leHBhbmQgKHNrYiwgKDQgKyA0KjEpICwgcGFkbGVuLCBmbGFncyk7Ci0JCWRldl9rZnJlZV9za2JfYW55IChza2IpOwotCQlza2IgPSBza2IyOwotCQlpZiAoIXNrYikKLQkJCXJldHVybiBOVUxMOwotCX0KLQotCS8vIGF0dGFjaCB0aGUgcGFja2V0IGNvdW50IHRvIHRoZSBoZWFkZXIKLQlwYWNrZXRfY291bnQgPSAodTMyICopIHNrYl9wdXNoIChza2IsICg0ICsgNCoxKSk7Ci0JcGFja2V0X2xlbiA9IHBhY2tldF9jb3VudCArIDE7Ci0KLQkvLyBGSVhNRSBsaXR0bGUgZW5kaWFuPwotCSpwYWNrZXRfY291bnQgPSAxOwotCSpwYWNrZXRfbGVuID0gbGVuZ3RoOwotCi0JLy8gYWRkIHBhZGRpbmcgYnl0ZQotCWlmICgoc2tiLT5sZW4gJSBkZXYtPm1heHBhY2tldCkgPT0gMCkKLQkJc2tiX3B1dCAoc2tiLCAxKTsKLQotCXJldHVybiBza2I7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JZ2VuZWxpbmtfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPQkiR2VuZXN5cyBHZW5lTGluayIsCi0JLmZsYWdzID0JRkxBR19GUkFNSU5HX0dMIHwgRkxBR19OT19TRVRJTlQsCi0JLnJ4X2ZpeHVwID0JZ2VuZWxpbmtfcnhfZml4dXAsCi0JLnR4X2ZpeHVwID0JZ2VuZWxpbmtfdHhfZml4dXAsCi0KLQkuaW4gPSAxLCAub3V0ID0gMiwKLQotI2lmZGVmCUdFTkVMSU5LX0FDSwotCS5jaGVja19jb25uZWN0ID1nZW5lbGlua19jaGVja19jb25uZWN0LAotI2VuZGlmCi19OwotCi0jZW5kaWYgLyogQ09ORklHX1VTQl9HRU5FU1lTICovCi0KLQotDAotI2lmZGVmCUNPTkZJR19VU0JfTkVUMTA4MAotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIE5ldGNoaXAgMTA4MCBkcml2ZXIgLi4uIGh0dHA6Ly93d3cubmV0Y2hpcC5jb20KLSAqIFVzZWQgaW4gTGFwTGluayBjYWJsZXMKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIGRldl9wYWNrZXRfaWQJZGF0YVswXQotI2RlZmluZSBmcmFtZV9lcnJvcnMJZGF0YVsxXQotCi0vKgotICogTmV0Q2hpcCBmcmFtaW5nIG9mIGV0aGVybmV0IHBhY2tldHMsIHN1cHBvcnRpbmcgYWRkaXRpb25hbCBlcnJvcgotICogY2hlY2tzIGZvciBsaW5rcyB0aGF0IG1heSBkcm9wIGJ1bGsgcGFja2V0cyBmcm9tIGluc2lkZSBtZXNzYWdlcy4KLSAqIE9kZCBVU0IgbGVuZ3RoID09IGFsd2F5cyBzaG9ydCByZWFkIGZvciBsYXN0IHVzYiBwYWNrZXQuCi0gKgktIG5jX2hlYWRlcgotICoJLSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKQotICoJLSBwYXlsb2FkCi0gKgktIChvcHRpb25hbCBwYWRkaW5nIGJ5dGUsIGlmIG5lZWRlZCBzbyBsZW5ndGggYmVjb21lcyBvZGQpCi0gKgktIG5jX3RyYWlsZXIKLSAqCi0gKiBUaGlzIGZyYW1pbmcgaXMgdG8gYmUgYXZvaWRlZCBmb3Igbm9uLU5ldENoaXAgZGV2aWNlcy4KLSAqLwotCi1zdHJ1Y3QgbmNfaGVhZGVyIHsJCS8vIHBhY2tlZDoKLQlfX2xlMTYJaGRyX2xlbjsJCS8vIHNpemVvZiBuY19oZWFkZXIgKExFLCBhbGwpCi0JX19sZTE2CXBhY2tldF9sZW47CQkvLyBwYXlsb2FkIHNpemUgKGluY2x1ZGluZyBldGhoZHIpCi0JX19sZTE2CXBhY2tldF9pZDsJCS8vIGRldGVjdHMgZHJvcHBlZCBwYWNrZXRzCi0jZGVmaW5lIE1JTl9IRUFERVIJNgotCi0JLy8gYWxsIGVsc2UgaXMgb3B0aW9uYWwsIGFuZCBtdXN0IHN0YXJ0IHdpdGg6Ci0JLy8gdTE2CXZlbmRvcklkOwkJLy8gZnJvbSB1c2ItaWYKLQkvLyB1MTYJcHJvZHVjdElkOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLSNkZWZpbmUJUEFEX0JZVEUJKCh1bnNpZ25lZCBjaGFyKTB4QUMpCi0KLXN0cnVjdCBuY190cmFpbGVyIHsKLQlfX2xlMTYJcGFja2V0X2lkOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLS8vIHBhY2tldHMgbWF5IHVzZSBGTEFHX0ZSQU1JTkdfTkMgYW5kIG9wdGlvbmFsIHBhZAotI2RlZmluZSBGUkFNRURfU0laRShtdHUpIChzaXplb2YgKHN0cnVjdCBuY19oZWFkZXIpIFwKLQkJCQkrIHNpemVvZiAoc3RydWN0IGV0aGhkcikgXAotCQkJCSsgKG10dSkgXAotCQkJCSsgMSBcCi0JCQkJKyBzaXplb2YgKHN0cnVjdCBuY190cmFpbGVyKSkKLQotI2RlZmluZSBNSU5fRlJBTUVECUZSQU1FRF9TSVpFKDApCi0KLQotLyoKLSAqIFplcm8gbWVhbnMgbm8gdGltZW91dDsgZWxzZSwgaG93IGxvbmcgYSA2NCBieXRlIGJ1bGsgcGFja2V0IG1heSBiZSBxdWV1ZWQKLSAqIGJlZm9yZSB0aGUgaGFyZHdhcmUgZHJvcHMgaXQuICBJZiB0aGF0J3MgZG9uZSwgdGhlIGRyaXZlciB3aWxsIG5lZWQgdG8KLSAqIGZyYW1lIG5ldHdvcmsgcGFja2V0cyB0byBndWFyZCBhZ2FpbnN0IHRoZSBkcm9wcGVkIFVTQiBwYWNrZXRzLiAgVGhlIHdpbjMyCi0gKiBkcml2ZXIgc2V0cyB0aGlzIGZvciBib3RoIHNpZGVzIG9mIHRoZSBsaW5rLgotICovCi0jZGVmaW5lCU5DX1JFQURfVFRMX01TCSgodTgpMjU1KQkvLyBtcwotCi0vKgotICogV2UgaWdub3JlIG1vc3QgcmVnaXN0ZXJzIGFuZCBFRVBST00gY29udGVudHMuCi0gKi8KLSNkZWZpbmUJUkVHX1VTQkNUTAkoKHU4KTB4MDQpCi0jZGVmaW5lIFJFR19UVEwJCSgodTgpMHgxMCkKLSNkZWZpbmUgUkVHX1NUQVRVUwkoKHU4KTB4MTEpCi0KLS8qCi0gKiBWZW5kb3Igc3BlY2lmaWMgcmVxdWVzdHMgdG8gcmVhZC93cml0ZSBkYXRhCi0gKi8KLSNkZWZpbmUJUkVRVUVTVF9SRUdJU1RFUgkoKHU4KTB4MTApCi0jZGVmaW5lCVJFUVVFU1RfRUVQUk9NCQkoKHU4KTB4MTEpCi0KLXN0YXRpYyBpbnQKLW5jX3ZlbmRvcl9yZWFkIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlcSwgdTggcmVnbnVtLCB1MTYgKnJldHZhbF9wdHIpCi17Ci0JaW50IHN0YXR1cyA9IHVzYl9jb250cm9sX21zZyAoZGV2LT51ZGV2LAotCQl1c2JfcmN2Y3RybHBpcGUgKGRldi0+dWRldiwgMCksCi0JCXJlcSwKLQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCTAsIHJlZ251bSwKLQkJcmV0dmFsX3B0ciwgc2l6ZW9mICpyZXR2YWxfcHRyLAotCQlDT05UUk9MX1RJTUVPVVRfTVMpOwotCWlmIChzdGF0dXMgPiAwKQotCQlzdGF0dXMgPSAwOwotCWlmICghc3RhdHVzKQotCQlsZTE2X3RvX2NwdXMgKHJldHZhbF9wdHIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1uY19yZWdpc3Rlcl9yZWFkIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlZ251bSwgdTE2ICpyZXR2YWxfcHRyKQotewotCXJldHVybiBuY192ZW5kb3JfcmVhZCAoZGV2LCBSRVFVRVNUX1JFR0lTVEVSLCByZWdudW0sIHJldHZhbF9wdHIpOwotfQotCi0vLyBubyByZXR2YWwgLi4uIGNhbiBiZWNvbWUgYXN5bmMsIHVzYWJsZSBpbl9pbnRlcnJ1cHQoKQotc3RhdGljIHZvaWQKLW5jX3ZlbmRvcl93cml0ZSAoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCByZXEsIHU4IHJlZ251bSwgdTE2IHZhbHVlKQotewotCXVzYl9jb250cm9sX21zZyAoZGV2LT51ZGV2LAotCQl1c2Jfc25kY3RybHBpcGUgKGRldi0+dWRldiwgMCksCi0JCXJlcSwKLQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAotCQl2YWx1ZSwgcmVnbnVtLAotCQlOVUxMLCAwLAkJCS8vIGRhdGEgaXMgaW4gc2V0dXAgcGFja2V0Ci0JCUNPTlRST0xfVElNRU9VVF9NUyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbmNfcmVnaXN0ZXJfd3JpdGUgKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggcmVnbnVtLCB1MTYgdmFsdWUpCi17Ci0JbmNfdmVuZG9yX3dyaXRlIChkZXYsIFJFUVVFU1RfUkVHSVNURVIsIHJlZ251bSwgdmFsdWUpOwotfQotCi0KLSNpZiAwCi1zdGF0aWMgdm9pZCBuY19kdW1wX3JlZ2lzdGVycyAoc3RydWN0IHVzYm5ldCAqZGV2KQotewotCXU4CXJlZzsKLQl1MTYJKnZwID0ga21hbGxvYyAoc2l6ZW9mICh1MTYpKTsKLQotCWlmICghdnApIHsKLQkJZGJnICgibm8gbWVtb3J5PyIpOwotCQlyZXR1cm47Ci0JfQotCi0JZGJnICgiJXMgcmVnaXN0ZXJzOiIsIGRldi0+bmV0LT5uYW1lKTsKLQlmb3IgKHJlZyA9IDA7IHJlZyA8IDB4MjA7IHJlZysrKSB7Ci0JCWludCByZXR2YWw7Ci0KLQkJLy8gcmVhZGluZyBzb21lIHJlZ2lzdGVycyBpcyB0cm91YmxlCi0JCWlmIChyZWcgPj0gMHgwOCAmJiByZWcgPD0gMHhmKQotCQkJY29udGludWU7Ci0JCWlmIChyZWcgPj0gMHgxMiAmJiByZWcgPD0gMHgxZSkKLQkJCWNvbnRpbnVlOwotCi0JCXJldHZhbCA9IG5jX3JlZ2lzdGVyX3JlYWQgKGRldiwgcmVnLCB2cCk7Ci0JCWlmIChyZXR2YWwgPCAwKQotCQkJZGJnICgiJXMgcmVnIFsweCV4XSA9PT4gZXJyb3IgJWQiLAotCQkJCWRldi0+bmV0LT5uYW1lLCByZWcsIHJldHZhbCk7Ci0JCWVsc2UKLQkJCWRiZyAoIiVzIHJlZyBbMHgleF0gPSAweCV4IiwKLQkJCQlkZXYtPm5ldC0+bmFtZSwgcmVnLCAqdnApOwotCX0KLQlrZnJlZSAodnApOwotfQotI2VuZGlmCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIENvbnRyb2wgcmVnaXN0ZXIKLSAqLwotCi0jZGVmaW5lCVVTQkNUTF9XUklUQUJMRV9NQVNLCTB4MWYwZgotLy8gYml0cyAxNS0xMyByZXNlcnZlZCwgci9vCi0jZGVmaW5lCVVTQkNUTF9FTkFCTEVfTEFORwkoMSA8PCAxMikKLSNkZWZpbmUJVVNCQ1RMX0VOQUJMRV9NRkdSCSgxIDw8IDExKQotI2RlZmluZQlVU0JDVExfRU5BQkxFX1BST0QJKDEgPDwgMTApCi0jZGVmaW5lCVVTQkNUTF9FTkFCTEVfU0VSSUFMCSgxIDw8IDkpCi0jZGVmaW5lCVVTQkNUTF9FTkFCTEVfREVGQVVMVFMJKDEgPDwgOCkKLS8vIGJpdHMgNy00IHJlc2VydmVkLCByL28KLSNkZWZpbmUJVVNCQ1RMX0ZMVVNIX09USEVSCSgxIDw8IDMpCi0jZGVmaW5lCVVTQkNUTF9GTFVTSF9USElTCSgxIDw8IDIpCi0jZGVmaW5lCVVTQkNUTF9ESVNDT05OX09USEVSCSgxIDw8IDEpCi0jZGVmaW5lCVVTQkNUTF9ESVNDT05OX1RISVMJKDEgPDwgMCkKLQotc3RhdGljIGlubGluZSB2b2lkIG5jX2R1bXBfdXNiY3RsIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiB1c2JjdGwpCi17Ci0JaWYgKCFuZXRpZl9tc2dfbGluayAoZGV2KSkKLQkJcmV0dXJuOwotCWRldmRiZyAoZGV2LCAibmV0MTA4MCAlcy0lcyB1c2JjdGwgMHgleDolcyVzJXMlcyVzOyIKLQkJCSIgdGhpcyVzJXM7IgotCQkJIiBvdGhlciVzJXM7IHIvbyAweCV4IiwKLQkJZGV2LT51ZGV2LT5idXMtPmJ1c19uYW1lLCBkZXYtPnVkZXYtPmRldnBhdGgsCi0JCXVzYmN0bCwKLQkJKHVzYmN0bCAmIFVTQkNUTF9FTkFCTEVfTEFORykgPyAiIGxhbmciIDogIiIsCi0JCSh1c2JjdGwgJiBVU0JDVExfRU5BQkxFX01GR1IpID8gIiBtZmdyIiA6ICIiLAotCQkodXNiY3RsICYgVVNCQ1RMX0VOQUJMRV9QUk9EKSA/ICIgcHJvZCIgOiAiIiwKLQkJKHVzYmN0bCAmIFVTQkNUTF9FTkFCTEVfU0VSSUFMKSA/ICIgc2VyaWFsIiA6ICIiLAotCQkodXNiY3RsICYgVVNCQ1RMX0VOQUJMRV9ERUZBVUxUUykgPyAiIGRlZmF1bHRzIiA6ICIiLAotCi0JCSh1c2JjdGwgJiBVU0JDVExfRkxVU0hfT1RIRVIpID8gIiBGTFVTSCIgOiAiIiwKLQkJKHVzYmN0bCAmIFVTQkNUTF9ESVNDT05OX09USEVSKSA/ICIgRElTIiA6ICIiLAotCQkodXNiY3RsICYgVVNCQ1RMX0ZMVVNIX1RISVMpID8gIiBGTFVTSCIgOiAiIiwKLQkJKHVzYmN0bCAmIFVTQkNUTF9ESVNDT05OX1RISVMpID8gIiBESVMiIDogIiIsCi0JCXVzYmN0bCAmIH5VU0JDVExfV1JJVEFCTEVfTUFTSwotCQkpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogU3RhdHVzIHJlZ2lzdGVyCi0gKi8KLQotI2RlZmluZQlTVEFUVVNfUE9SVF9BCQkoMSA8PCAxNSkKLQotI2RlZmluZQlTVEFUVVNfQ09OTl9PVEhFUgkoMSA8PCAxNCkKLSNkZWZpbmUJU1RBVFVTX1NVU1BFTkRfT1RIRVIJKDEgPDwgMTMpCi0jZGVmaW5lCVNUQVRVU19NQUlMQk9YX09USEVSCSgxIDw8IDEyKQotI2RlZmluZQlTVEFUVVNfUEFDS0VUU19PVEhFUihuKQkoKChuKSA+PiA4KSAmJiAweDAzKQotCi0jZGVmaW5lCVNUQVRVU19DT05OX1RISVMJKDEgPDwgNikKLSNkZWZpbmUJU1RBVFVTX1NVU1BFTkRfVEhJUwkoMSA8PCA1KQotI2RlZmluZQlTVEFUVVNfTUFJTEJPWF9USElTCSgxIDw8IDQpCi0jZGVmaW5lCVNUQVRVU19QQUNLRVRTX1RISVMobikJKCgobikgPj4gMCkgJiYgMHgwMykKLQotI2RlZmluZQlTVEFUVVNfVU5TUEVDX01BU0sJMHgwYzhjCi0jZGVmaW5lCVNUQVRVU19OT0lTRV9NQVNLIAkoKHUxNil+KDB4MDMwM3xTVEFUVVNfVU5TUEVDX01BU0spKQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBuY19kdW1wX3N0YXR1cyAoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgc3RhdHVzKQotewotCWlmICghbmV0aWZfbXNnX2xpbmsgKGRldikpCi0JCXJldHVybjsKLQlkZXZkYmcgKGRldiwgIm5ldDEwODAgJXMtJXMgc3RhdHVzIDB4JXg6IgotCQkJIiB0aGlzICglYykgUEtUPSVkJXMlcyVzOyIKLQkJCSIgb3RoZXIgUEtUPSVkJXMlcyVzOyB1bnNwZWMgMHgleCIsCi0JCWRldi0+dWRldi0+YnVzLT5idXNfbmFtZSwgZGV2LT51ZGV2LT5kZXZwYXRoLAotCQlzdGF0dXMsCi0KLQkJLy8gWFhYIHRoZSBwYWNrZXQgY291bnRzIGRvbid0IHNlZW0gcmlnaHQKLQkJLy8gKDEgYXQgcmVzZXQsIG5vdCAwKTsgbWF5YmUgVU5TUEVDIHRvbwotCi0JCShzdGF0dXMgJiBTVEFUVVNfUE9SVF9BKSA/ICdBJyA6ICdCJywKLQkJU1RBVFVTX1BBQ0tFVFNfVEhJUyAoc3RhdHVzKSwKLQkJKHN0YXR1cyAmIFNUQVRVU19DT05OX1RISVMpID8gIiBDT04iIDogIiIsCi0JCShzdGF0dXMgJiBTVEFUVVNfU1VTUEVORF9USElTKSA/ICIgU1VTIiA6ICIiLAotCQkoc3RhdHVzICYgU1RBVFVTX01BSUxCT1hfVEhJUykgPyAiIE1CT1giIDogIiIsCi0KLQkJU1RBVFVTX1BBQ0tFVFNfT1RIRVIgKHN0YXR1cyksCi0JCShzdGF0dXMgJiBTVEFUVVNfQ09OTl9PVEhFUikgPyAiIENPTiIgOiAiIiwKLQkJKHN0YXR1cyAmIFNUQVRVU19TVVNQRU5EX09USEVSKSA/ICIgU1VTIiA6ICIiLAotCQkoc3RhdHVzICYgU1RBVFVTX01BSUxCT1hfT1RIRVIpID8gIiBNQk9YIiA6ICIiLAotCi0JCXN0YXR1cyAmIFNUQVRVU19VTlNQRUNfTUFTSwotCQkpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogVFRMIHJlZ2lzdGVyCi0gKi8KLQotI2RlZmluZQlUVExfVEhJUyh0dGwpCSgweDAwZmYgJiB0dGwpCi0jZGVmaW5lCVRUTF9PVEhFUih0dGwpCSgweDAwZmYgJiAodHRsID4+IDgpKQotI2RlZmluZSBNS19UVEwodGhpcyxvdGhlcikJKCh1MTYpKCgob3RoZXIpPDw4KXwoMHgwMGZmJih0aGlzKSkpKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmNfZHVtcF90dGwgKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IHR0bCkKLXsKLQlpZiAobmV0aWZfbXNnX2xpbmsgKGRldikpCi0JCWRldmRiZyAoZGV2LCAibmV0MTA4MCAlcy0lcyB0dGwgMHgleCB0aGlzID0gJWQsIG90aGVyID0gJWQiLAotCQkJZGV2LT51ZGV2LT5idXMtPmJ1c19uYW1lLCBkZXYtPnVkZXYtPmRldnBhdGgsCi0JCQl0dGwsIFRUTF9USElTICh0dGwpLCBUVExfT1RIRVIgKHR0bCkpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IG5ldDEwODBfcmVzZXQgKHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQl1MTYJCXVzYmN0bCwgc3RhdHVzLCB0dGw7Ci0JdTE2CQkqdnAgPSBrbWFsbG9jIChzaXplb2YgKHUxNiksIEdGUF9LRVJORUwpOwotCWludAkJcmV0dmFsOwotCi0JaWYgKCF2cCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvLyBuY19kdW1wX3JlZ2lzdGVycyAoZGV2KTsKLQotCWlmICgocmV0dmFsID0gbmNfcmVnaXN0ZXJfcmVhZCAoZGV2LCBSRUdfU1RBVFVTLCB2cCkpIDwgMCkgewotCQlkYmcgKCJjYW4ndCByZWFkICVzLSVzIHN0YXR1czogJWQiLAotCQkJZGV2LT51ZGV2LT5idXMtPmJ1c19uYW1lLCBkZXYtPnVkZXYtPmRldnBhdGgsIHJldHZhbCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0Jc3RhdHVzID0gKnZwOwotCW5jX2R1bXBfc3RhdHVzIChkZXYsIHN0YXR1cyk7Ci0KLQlpZiAoKHJldHZhbCA9IG5jX3JlZ2lzdGVyX3JlYWQgKGRldiwgUkVHX1VTQkNUTCwgdnApKSA8IDApIHsKLQkJZGJnICgiY2FuJ3QgcmVhZCBVU0JDVEwsICVkIiwgcmV0dmFsKTsKLQkJZ290byBkb25lOwotCX0KLQl1c2JjdGwgPSAqdnA7Ci0JbmNfZHVtcF91c2JjdGwgKGRldiwgdXNiY3RsKTsKLQotCW5jX3JlZ2lzdGVyX3dyaXRlIChkZXYsIFJFR19VU0JDVEwsCi0JCQlVU0JDVExfRkxVU0hfVEhJUyB8IFVTQkNUTF9GTFVTSF9PVEhFUik7Ci0KLQlpZiAoKHJldHZhbCA9IG5jX3JlZ2lzdGVyX3JlYWQgKGRldiwgUkVHX1RUTCwgdnApKSA8IDApIHsKLQkJZGJnICgiY2FuJ3QgcmVhZCBUVEwsICVkIiwgcmV0dmFsKTsKLQkJZ290byBkb25lOwotCX0KLQl0dGwgPSAqdnA7Ci0JLy8gbmNfZHVtcF90dGwgKGRldiwgdHRsKTsKLQotCW5jX3JlZ2lzdGVyX3dyaXRlIChkZXYsIFJFR19UVEwsCi0JCQlNS19UVEwgKE5DX1JFQURfVFRMX01TLCBUVExfT1RIRVIgKHR0bCkpICk7Ci0JZGJnICgiJXM6IGFzc2lnbmVkIFRUTCwgJWQgbXMiLCBkZXYtPm5ldC0+bmFtZSwgTkNfUkVBRF9UVExfTVMpOwotCi0JaWYgKG5ldGlmX21zZ19saW5rIChkZXYpKQotCQlkZXZpbmZvIChkZXYsICJwb3J0ICVjLCBwZWVyICVzY29ubmVjdGVkIiwKLQkJCShzdGF0dXMgJiBTVEFUVVNfUE9SVF9BKSA/ICdBJyA6ICdCJywKLQkJCShzdGF0dXMgJiBTVEFUVVNfQ09OTl9PVEhFUikgPyAiIiA6ICJkaXMiCi0JCQkpOwotCXJldHZhbCA9IDA7Ci0KLWRvbmU6Ci0Ja2ZyZWUgKHZwKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IG5ldDEwODBfY2hlY2tfY29ubmVjdCAoc3RydWN0IHVzYm5ldCAqZGV2KQotewotCWludAkJCXJldHZhbDsKLQl1MTYJCQlzdGF0dXM7Ci0JdTE2CQkJKnZwID0ga21hbGxvYyAoc2l6ZW9mICh1MTYpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghdnApCi0JCXJldHVybiAtRU5PTUVNOwotCXJldHZhbCA9IG5jX3JlZ2lzdGVyX3JlYWQgKGRldiwgUkVHX1NUQVRVUywgdnApOwotCXN0YXR1cyA9ICp2cDsKLQlrZnJlZSAodnApOwotCWlmIChyZXR2YWwgIT0gMCkgewotCQlkYmcgKCIlcyBuZXQxMDgwX2NoZWNrX2Nvbm4gcmVhZCAtICVkIiwgZGV2LT5uZXQtPm5hbWUsIHJldHZhbCk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCWlmICgoc3RhdHVzICYgU1RBVFVTX0NPTk5fT1RIRVIpICE9IFNUQVRVU19DT05OX09USEVSKQotCQlyZXR1cm4gLUVOT0xJTks7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG5jX2ZsdXNoX2NvbXBsZXRlIChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWtmcmVlICh1cmItPmNvbnRleHQpOwotCXVzYl9mcmVlX3VyYih1cmIpOwotfQotCi1zdGF0aWMgdm9pZCBuY19lbnN1cmVfc3luYyAoc3RydWN0IHVzYm5ldCAqZGV2KQotewotCWRldi0+ZnJhbWVfZXJyb3JzKys7Ci0JaWYgKGRldi0+ZnJhbWVfZXJyb3JzID4gNSkgewotCQlzdHJ1Y3QgdXJiCQkqdXJiOwotCQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0CSpyZXE7Ci0JCWludAkJCXN0YXR1czsKLQotCQkvKiBTZW5kIGEgZmx1c2ggKi8KLQkJdXJiID0gdXNiX2FsbG9jX3VyYiAoMCwgU0xBQl9BVE9NSUMpOwotCQlpZiAoIXVyYikKLQkJCXJldHVybjsKLQotCQlyZXEgPSBrbWFsbG9jIChzaXplb2YgKnJlcSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghcmVxKSB7Ci0JCQl1c2JfZnJlZV91cmIgKHVyYik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlyZXEtPmJSZXF1ZXN0VHlwZSA9IFVTQl9ESVJfT1VUCi0JCQl8IFVTQl9UWVBFX1ZFTkRPUgotCQkJfCBVU0JfUkVDSVBfREVWSUNFOwotCQlyZXEtPmJSZXF1ZXN0ID0gUkVRVUVTVF9SRUdJU1RFUjsKLQkJcmVxLT53VmFsdWUgPSBjcHVfdG9fbGUxNiAoVVNCQ1RMX0ZMVVNIX1RISVMKLQkJCQl8IFVTQkNUTF9GTFVTSF9PVEhFUik7Ci0JCXJlcS0+d0luZGV4ID0gY3B1X3RvX2xlMTYgKFJFR19VU0JDVEwpOwotCQlyZXEtPndMZW5ndGggPSBjcHVfdG9fbGUxNiAoMCk7Ci0KLQkJLyogcXVldWUgYW4gYXN5bmMgY29udHJvbCByZXF1ZXN0LCB3ZSBkb24ndCBuZWVkCi0JCSAqIHRvIGRvIGFueXRoaW5nIHdoZW4gaXQgZmluaXNoZXMgZXhjZXB0IGNsZWFuIHVwLgotCQkgKi8KLQkJdXNiX2ZpbGxfY29udHJvbF91cmIgKHVyYiwgZGV2LT51ZGV2LAotCQkJdXNiX3NuZGN0cmxwaXBlIChkZXYtPnVkZXYsIDApLAotCQkJKHVuc2lnbmVkIGNoYXIgKikgcmVxLAotCQkJTlVMTCwgMCwKLQkJCW5jX2ZsdXNoX2NvbXBsZXRlLCByZXEpOwotCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHN0YXR1cykgewotCQkJa2ZyZWUgKHJlcSk7Ci0JCQl1c2JfZnJlZV91cmIgKHVyYik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobmV0aWZfbXNnX3J4X2VyciAoZGV2KSkKLQkJCWRldmRiZyAoZGV2LCAiZmx1c2ggbmV0MTA4MDsgdG9vIG1hbnkgZnJhbWluZyBlcnJvcnMiKTsKLQkJZGV2LT5mcmFtZV9lcnJvcnMgPSAwOwotCX0KLX0KLQotc3RhdGljIGludCBuZXQxMDgwX3J4X2ZpeHVwIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5jX2hlYWRlcgkqaGVhZGVyOwotCXN0cnVjdCBuY190cmFpbGVyCSp0cmFpbGVyOwotCXUxNgkJCWhkcl9sZW4sIHBhY2tldF9sZW47Ci0KLQlpZiAoIShza2ItPmxlbiAmIDB4MDEpCi0JCQl8fCBNSU5fRlJBTUVEID4gc2tiLT5sZW4KLQkJCXx8IHNrYi0+bGVuID4gRlJBTUVEX1NJWkUgKGRldi0+bmV0LT5tdHUpKSB7Ci0JCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7Ci0JCWRiZyAoInJ4IGZyYW1lc2l6ZSAlZCByYW5nZSAlZC4uJWQgbXR1ICVkIiwgc2tiLT5sZW4sCi0JCQkoaW50KU1JTl9GUkFNRUQsIChpbnQpRlJBTUVEX1NJWkUgKGRldi0+bmV0LT5tdHUpLAotCQkJZGV2LT5uZXQtPm10dSk7Ci0JCW5jX2Vuc3VyZV9zeW5jIChkZXYpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQloZWFkZXIgPSAoc3RydWN0IG5jX2hlYWRlciAqKSBza2ItPmRhdGE7Ci0JaGRyX2xlbiA9IGxlMTZfdG9fY3B1cCAoJmhlYWRlci0+aGRyX2xlbik7Ci0JcGFja2V0X2xlbiA9IGxlMTZfdG9fY3B1cCAoJmhlYWRlci0+cGFja2V0X2xlbik7Ci0JaWYgKEZSQU1FRF9TSVpFIChwYWNrZXRfbGVuKSA+IE1BWF9QQUNLRVQpIHsKLQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKLQkJZGJnICgicGFja2V0IHRvbyBiaWcsICVkIiwgcGFja2V0X2xlbik7Ci0JCW5jX2Vuc3VyZV9zeW5jIChkZXYpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKGhkcl9sZW4gPCBNSU5fSEVBREVSKSB7Ci0JCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7Ci0JCWRiZyAoImhlYWRlciB0b28gc2hvcnQsICVkIiwgaGRyX2xlbik7Ci0JCW5jX2Vuc3VyZV9zeW5jIChkZXYpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKGhkcl9sZW4gPiBNSU5fSEVBREVSKSB7Ci0JCS8vIG91dCBvZiBiYW5kIGRhdGEgZm9yIHVzPwotCQlkYmcgKCJoZWFkZXIgT09CLCAlZCBieXRlcyIsIGhkcl9sZW4gLSBNSU5fSEVBREVSKTsKLQkJbmNfZW5zdXJlX3N5bmMgKGRldik7Ci0JCS8vIHN3aXRjaCAodmVuZG9yL3Byb2R1Y3QgaWRzKSB7IC4uLiB9Ci0JfQotCXNrYl9wdWxsIChza2IsIGhkcl9sZW4pOwotCi0JdHJhaWxlciA9IChzdHJ1Y3QgbmNfdHJhaWxlciAqKQotCQkoc2tiLT5kYXRhICsgc2tiLT5sZW4gLSBzaXplb2YgKnRyYWlsZXIpOwotCXNrYl90cmltIChza2IsIHNrYi0+bGVuIC0gc2l6ZW9mICp0cmFpbGVyKTsKLQotCWlmICgocGFja2V0X2xlbiAmIDB4MDEpID09IDApIHsKLQkJaWYgKHNrYi0+ZGF0YSBbcGFja2V0X2xlbl0gIT0gUEFEX0JZVEUpIHsKLQkJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7Ci0JCQlkYmcgKCJiYWQgcGFkIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlza2JfdHJpbSAoc2tiLCBza2ItPmxlbiAtIDEpOwotCX0KLQlpZiAoc2tiLT5sZW4gIT0gcGFja2V0X2xlbikgewotCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwotCQlkYmcgKCJiYWQgcGFja2V0IGxlbiAlZCAoZXhwZWN0ZWQgJWQpIiwKLQkJCXNrYi0+bGVuLCBwYWNrZXRfbGVuKTsKLQkJbmNfZW5zdXJlX3N5bmMgKGRldik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoaGVhZGVyLT5wYWNrZXRfaWQgIT0gZ2V0X3VuYWxpZ25lZCAoJnRyYWlsZXItPnBhY2tldF9pZCkpIHsKLQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwotCQlkYmcgKCIoMisgZHJvcHBlZCkgcnggcGFja2V0X2lkIG1pc21hdGNoIDB4JXggMHgleCIsCi0JCQlsZTE2X3RvX2NwdSAoaGVhZGVyLT5wYWNrZXRfaWQpLAotCQkJbGUxNl90b19jcHUgKHRyYWlsZXItPnBhY2tldF9pZCkpOwotCQlyZXR1cm4gMDsKLQl9Ci0jaWYgMAotCWRldmRiZyAoZGV2LCAiZnJhbWUgPHJ4IGggJWQgcCAlZCBpZCAlZCIsIGhlYWRlci0+aGRyX2xlbiwKLQkJaGVhZGVyLT5wYWNrZXRfbGVuLCBoZWFkZXItPnBhY2tldF9pZCk7Ci0jZW5kaWYKLQlkZXYtPmZyYW1lX2Vycm9ycyA9IDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCi1uZXQxMDgwX3R4X2ZpeHVwIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIGludCBmbGFncykKLXsKLQlpbnQJCQlwYWRsZW47Ci0Jc3RydWN0IHNrX2J1ZmYJCSpza2IyOwotCi0JcGFkbGVuID0gKChza2ItPmxlbiArIHNpemVvZiAoc3RydWN0IG5jX2hlYWRlcikKLQkJCSsgc2l6ZW9mIChzdHJ1Y3QgbmNfdHJhaWxlcikpICYgMHgwMSkgPyAwIDogMTsKLQlpZiAoIXNrYl9jbG9uZWQgKHNrYikpIHsKLQkJaW50CWhlYWRyb29tID0gc2tiX2hlYWRyb29tIChza2IpOwotCQlpbnQJdGFpbHJvb20gPSBza2JfdGFpbHJvb20gKHNrYik7Ci0KLQkJaWYgKChwYWRsZW4gKyBzaXplb2YgKHN0cnVjdCBuY190cmFpbGVyKSkgPD0gdGFpbHJvb20KLQkJCSAgICAmJiBzaXplb2YgKHN0cnVjdCBuY19oZWFkZXIpIDw9IGhlYWRyb29tKQotCQkJLyogVGhlcmUncyBlbm91Z2ggaGVhZCBhbmQgdGFpbCByb29tICovCi0JCQlyZXR1cm4gc2tiOwotCi0JCWlmICgoc2l6ZW9mIChzdHJ1Y3QgbmNfaGVhZGVyKSArIHBhZGxlbgotCQkJCQkrIHNpemVvZiAoc3RydWN0IG5jX3RyYWlsZXIpKSA8Ci0JCQkJKGhlYWRyb29tICsgdGFpbHJvb20pKSB7Ci0JCQkvKiBUaGVyZSdzIGVub3VnaCB0b3RhbCByb29tLCBzbyBqdXN0IHJlYWRqdXN0ICovCi0JCQlza2ItPmRhdGEgPSBtZW1tb3ZlIChza2ItPmhlYWQKLQkJCQkJCSsgc2l6ZW9mIChzdHJ1Y3QgbmNfaGVhZGVyKSwKLQkJCQkJICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgc2tiLT5sZW47Ci0JCQlyZXR1cm4gc2tiOwotCQl9Ci0JfQotCi0JLyogQ3JlYXRlIGEgbmV3IHNrYiB0byB1c2Ugd2l0aCB0aGUgY29ycmVjdCBzaXplICovCi0Jc2tiMiA9IHNrYl9jb3B5X2V4cGFuZCAoc2tiLAotCQkJCXNpemVvZiAoc3RydWN0IG5jX2hlYWRlciksCi0JCQkJc2l6ZW9mIChzdHJ1Y3QgbmNfdHJhaWxlcikgKyBwYWRsZW4sCi0JCQkJZmxhZ3MpOwotCWRldl9rZnJlZV9za2JfYW55IChza2IpOwotCXJldHVybiBza2IyOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvCW5ldDEwODBfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPQkiTmV0Q2hpcCBUdXJib0NPTk5FQ1QiLAotCS5mbGFncyA9CUZMQUdfRlJBTUlOR19OQywKLQkucmVzZXQgPQluZXQxMDgwX3Jlc2V0LAotCS5jaGVja19jb25uZWN0ID1uZXQxMDgwX2NoZWNrX2Nvbm5lY3QsCi0JLnJ4X2ZpeHVwID0JbmV0MTA4MF9yeF9maXh1cCwKLQkudHhfZml4dXAgPQluZXQxMDgwX3R4X2ZpeHVwLAotfTsKLQotI2VuZGlmIC8qIENPTkZJR19VU0JfTkVUMTA4MCAqLwotCi0KLQwKLSNpZmRlZiBDT05GSUdfVVNCX1BMMjMwMQotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFByb2xpZmljIFBMLTIzMDEvUEwtMjMwMiBkcml2ZXIgLi4uIGh0dHA6Ly93d3cucHJvbGlmaWN0ZWNoLmNvbQotICoKLSAqIFRoZSBwcm90b2NvbCBhbmQgaGFuZHNoYWtpbmcgdXNlZCBoZXJlIHNob3VsZCBiZSBidWctY29tcGF0aWJsZQotICogd2l0aCB0aGUgTGludXggMi4yICJwbHVzYiIgZHJpdmVyLCBieSBEZXRpIEZsaWVnbC4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogQml0cyAwLTQgY2FuIGJlIHVzZWQgZm9yIHNvZnR3YXJlIGhhbmRzaGFraW5nOyB0aGV5J3JlIHNldCBmcm9tCi0gKiBvbmUgZW5kLCBjbGVhcmVkIGZyb20gdGhlIG90aGVyLCAicmVhZCIgd2l0aCB0aGUgaW50ZXJydXB0IGJ5dGUuCi0gKi8KLSNkZWZpbmUJUExfU19FTgkJKDE8PDcpCQkvKiAoZmVhdHVyZSBvbmx5KSBzdXNwZW5kIGVuYWJsZSAqLwotLyogcmVzZXJ2ZWQgYml0IC0tIHJ4IHJlYWR5ICg2KSA/ICovCi0jZGVmaW5lCVBMX1RYX1JFQURZCSgxPDw1KQkJLyogKGludGVycnVwdCBvbmx5KSB0cmFuc21pdCByZWFkeSAqLwotI2RlZmluZQlQTF9SRVNFVF9PVVQJKDE8PDQpCQkvKiByZXNldCBvdXRwdXQgcGlwZSAqLwotI2RlZmluZQlQTF9SRVNFVF9JTgkoMTw8MykJCS8qIHJlc2V0IGlucHV0IHBpcGUgKi8KLSNkZWZpbmUJUExfVFhfQwkJKDE8PDIpCQkvKiB0cmFuc21pc3Npb24gY29tcGxldGUgKi8KLSNkZWZpbmUJUExfVFhfUkVRCSgxPDwxKQkJLyogdHJhbnNtaXNzaW9uIHJlY2VpdmVkICovCi0jZGVmaW5lCVBMX1BFRVJfRQkoMTw8MCkJCS8qIHBlZXIgZXhpc3RzICovCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wbF92ZW5kb3JfcmVxIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlcSwgdTggdmFsLCB1OCBpbmRleCkKLXsKLQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnIChkZXYtPnVkZXYsCi0JCXVzYl9yY3ZjdHJscGlwZSAoZGV2LT51ZGV2LCAwKSwKLQkJcmVxLAotCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJdmFsLCBpbmRleCwKLQkJTlVMTCwgMCwKLQkJQ09OVFJPTF9USU1FT1VUX01TKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXBsX2NsZWFyX1F1aWNrTGlua19mZWF0dXJlcyAoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgdmFsKQotewotCXJldHVybiBwbF92ZW5kb3JfcmVxIChkZXYsIDEsICh1OCkgdmFsLCAwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXBsX3NldF9RdWlja0xpbmtfZmVhdHVyZXMgKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IHZhbCkKLXsKLQlyZXR1cm4gcGxfdmVuZG9yX3JlcSAoZGV2LCAzLCAodTgpIHZhbCwgMCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcGxfcmVzZXQgKHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQkvKiBzb21lIHVuaXRzIHNlZW0gdG8gbmVlZCB0aGlzIHJlc2V0LCBvdGhlcnMgcmVqZWN0IGl0IHV0dGVybHkuCi0JICogRklYTUUgYmUgbW9yZSBsaWtlICJuYXBsaW5rIiBvciB3aW5kb3dzIGRyaXZlcnMuCi0JICovCi0JKHZvaWQpIHBsX3NldF9RdWlja0xpbmtfZmVhdHVyZXMgKGRldiwKLQkJUExfU19FTnxQTF9SRVNFVF9PVVR8UExfUkVTRVRfSU58UExfUEVFUl9FKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwlwcm9saWZpY19pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9CSJQcm9saWZpYyBQTC0yMzAxL1BMLTIzMDIiLAotCS5mbGFncyA9CUZMQUdfTk9fU0VUSU5ULAotCQkvKiBzb21lIFBMLTIzMDIgdmVyc2lvbnMgc2VlbSB0byBmYWlsIHVzYl9zZXRfaW50ZXJmYWNlKCkgKi8KLQkucmVzZXQgPQlwbF9yZXNldCwKLX07Ci0KLSNlbmRpZiAvKiBDT05GSUdfVVNCX1BMMjMwMSAqLwotCi0MCi0jaWZkZWYgQ09ORklHX1VTQl9LQzIxOTAKLSNkZWZpbmUgSEFWRV9IQVJEV0FSRQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbyBrYzIxOTBfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPSAgIktDIFRlY2hub2xvZ3kgS0MtMTkwIiwKLX07Ci0jZW5kaWYgLyogQ09ORklHX1VTQl9LQzIxOTAgKi8KLQotDAotI2lmZGVmCUNPTkZJR19VU0JfQVJNTElOVVgKLSNkZWZpbmUJSEFWRV9IQVJEV0FSRQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBJbnRlbCdzIFNBLTExMDAgY2hpcCBpbnRlZ3JhdGVzIGJhc2ljIFVTQiBzdXBwb3J0LCBhbmQgaXMgdXNlZAotICogaW4gUERBcyBsaWtlIHNvbWUgaVBhcXMsIHRoZSBZb3B5LCBzb21lIFphdXJ1cyBtb2RlbHMsIGFuZCBtb3JlLgotICogV2hlbiB0aGV5IHJ1biBMaW51eCwgYXJjaC9hcm0vbWFjaC1zYTExMDAvdXNiLWV0aC5jIG1heSBiZSB1c2VkIHRvCi0gKiBuZXR3b3JrIHVzaW5nIG1pbmltYWwgVVNCIGZyYW1pbmcgZGF0YS4KLSAqCi0gKiBUaGlzIGRlc2NyaWJlcyB0aGUgZHJpdmVyIGN1cnJlbnRseSBpbiBzdGFuZGFyZCBBUk0gTGludXgga2VybmVscy4KLSAqIFRoZSBaYXVydXMgdXNlcyBhIGRpZmZlcmVudCBkcml2ZXIgKHNlZSBsYXRlcikuCi0gKgotICogUFhBMjV4IGFuZCBQWEEyMTAgdXNlIFhTY2FsZSBjb3JlcyAoQVJNIHY1VEUpIHdpdGggYmV0dGVyIFVTQiBzdXBwb3J0Ci0gKiBhbmQgZGlmZmVyZW50IFVTQiBlbmRwb2ludCBudW1iZXJpbmcgdGhhbiB0aGUgU0ExMTAwIGRldmljZXMuICBUaGUKLSAqIG1hY2gtcHhhL3VzYi1ldGguYyBkcml2ZXIgcmUtdXNlcyB0aGUgZGV2aWNlIGlkcyBmcm9tIG1hY2gtc2ExMTAwCi0gKiBzbyB3ZSByZWx5IG9uIHRoZSBlbmRwb2ludCBkZXNjcmlwdG9ycy4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvCWxpbnV4ZGV2X2luZm8gPSB7Ci0JLmRlc2NyaXB0aW9uID0JIkxpbnV4IERldmljZSIsCi0JLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwl5b3B5X2luZm8gPSB7Ci0JLmRlc2NyaXB0aW9uID0JIllvcHkiLAotCS5jaGVja19jb25uZWN0ID0gYWx3YXlzX2Nvbm5lY3RlZCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JYmxvYl9pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9CSJCb290IExvYWRlciBPQmplY3QiLAotCS5jaGVja19jb25uZWN0ID0gYWx3YXlzX2Nvbm5lY3RlZCwKLX07Ci0KLSNlbmRpZgkvKiBDT05GSUdfVVNCX0FSTUxJTlVYICovCi0KLQwKLSNpZmRlZiBDT05GSUdfVVNCX1pBVVJVUwotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLSNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBaYXVydXMgaXMgYWxzbyBhIFNBLTExMTAgYmFzZWQgUERBLCBidXQgb25lIHVzaW5nIGEgZGlmZmVyZW50IGRyaXZlcgotICogKGFuZCBmcmFtaW5nKSBmb3IgaXRzIFVTQiBzbGF2ZS9nYWRnZXQgY29udHJvbGxlciB0aGFuIHRoZSBjYXNlIGFib3ZlLgotICoKLSAqIEZvciB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoYXQgZHJpdmVyLCB0aGUgbWFpbiB3YXkgdGhhdCBmcmFtaW5nIGlzCi0gKiBub25zdGFuZGFyZCAoYWxzbyBmcm9tIHBlcnNwZWN0aXZlIG9mIHRoZSBDREMgZXRoZXJuZXQgbW9kZWwhKSBpcyBhCi0gKiBjcmMzMiwgYWRkZWQgdG8gaGVscCBkZXRlY3Qgd2hlbiBzb21lIHNhMTEwMCB1c2ItdG8tbWVtb3J5IERNQSBlcnJhdGEKLSAqIGhhdmVuJ3QgYmVlbiBmdWxseSB3b3JrZWQgYXJvdW5kLiAgQWxzbywgYWxsIFphdXJpaSB1c2UgdGhlIHNhbWUKLSAqIGRlZmF1bHQgRXRoZXJuZXQgYWRkcmVzcy4KLSAqCi0gKiBQWEEgYmFzZWQgbW9kZWxzIHVzZSB0aGUgc2FtZSBmcmFtaW5nLCBhbmQgYWxzbyBjYW4ndCBpbXBsZW1lbnQKLSAqIHNldF9pbnRlcmZhY2UgcHJvcGVybHkuCi0gKgotICogQWxsIGtub3duIFphdXJpaSBsaWUgYWJvdXQgdGhlaXIgc3RhbmRhcmRzIGNvbmZvcm1hbmNlLiAgTW9zdCBsaWUgYnkKLSAqIHNheWluZyB0aGV5IHN1cHBvcnQgQ0RDIEV0aGVybmV0LiAgU29tZSBsaWUgYW5kIHNheSB0aGV5IHN1cHBvcnQgQ0RDCi0gKiBNRExNIChhcyBpZiBmb3IgYWNjZXNzIHRvIGNlbGwgcGhvbmUgbW9kZW1zKS4gIFNvbWVvbmUsIHBsZWFzZSBiZWF0IAotICogb24gU2hhcnAgKGFuZCBvdGhlciBzdWNoIHZlbmRvcnMpIGZvciBhIHdoaWxlIHdpdGggYSBjbHVlc3RpY2suCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHN0cnVjdCBza19idWZmICoKLXphdXJ1c190eF9maXh1cCAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZmxhZ3MpCi17Ci0JaW50CQkJcGFkbGVuOwotCXN0cnVjdCBza19idWZmCQkqc2tiMjsKLQotCXBhZGxlbiA9IDI7Ci0JaWYgKCFza2JfY2xvbmVkIChza2IpKSB7Ci0JCWludAl0YWlscm9vbSA9IHNrYl90YWlscm9vbSAoc2tiKTsKLQkJaWYgKChwYWRsZW4gKyA0KSA8PSB0YWlscm9vbSkKLQkJCWdvdG8gZG9uZTsKLQl9Ci0Jc2tiMiA9IHNrYl9jb3B5X2V4cGFuZCAoc2tiLCAwLCA0ICsgcGFkbGVuLCBmbGFncyk7Ci0JZGV2X2tmcmVlX3NrYl9hbnkgKHNrYik7Ci0Jc2tiID0gc2tiMjsKLQlpZiAoc2tiKSB7Ci0JCXUzMgkJZmNzOwotZG9uZToKLQkJZmNzID0gY3JjMzJfbGUgKH4wLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJZmNzID0gfmZjczsKLQotCQkqc2tiX3B1dCAoc2tiLCAxKSA9IGZjcyAgICAgICAmIDB4ZmY7Ci0JCSpza2JfcHV0IChza2IsIDEpID0gKGZjcz4+IDgpICYgMHhmZjsKLQkJKnNrYl9wdXQgKHNrYiwgMSkgPSAoZmNzPj4xNikgJiAweGZmOwotCQkqc2tiX3B1dCAoc2tiLCAxKSA9IChmY3M+PjI0KSAmIDB4ZmY7Ci0JfQotCXJldHVybiBza2I7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JemF1cnVzX3NsNXgwMF9pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9CSJTaGFycCBaYXVydXMgU0wtNXgwMCIsCi0JLmZsYWdzID0JRkxBR19GUkFNSU5HX1osCi0JLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAotCS5iaW5kID0JCWdlbmVyaWNfY2RjX2JpbmQsCi0JLnVuYmluZCA9CWNkY191bmJpbmQsCi0JLnR4X2ZpeHVwID0gCXphdXJ1c190eF9maXh1cCwKLX07Ci0jZGVmaW5lCVpBVVJVU19TVFJPTkdBUk1fSU5GTwkoKHVuc2lnbmVkIGxvbmcpJnphdXJ1c19zbDV4MDBfaW5mbykKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwl6YXVydXNfcHhhX2luZm8gPSB7Ci0JLmRlc2NyaXB0aW9uID0JIlNoYXJwIFphdXJ1cywgUFhBLTJ4eCBiYXNlZCIsCi0JLmZsYWdzID0JRkxBR19GUkFNSU5HX1osCi0JLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAotCS5iaW5kID0JCWdlbmVyaWNfY2RjX2JpbmQsCi0JLnVuYmluZCA9CWNkY191bmJpbmQsCi0JLnR4X2ZpeHVwID0gCXphdXJ1c190eF9maXh1cCwKLX07Ci0jZGVmaW5lCVpBVVJVU19QWEFfSU5GTwkJKCh1bnNpZ25lZCBsb25nKSZ6YXVydXNfcHhhX2luZm8pCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8Jb2x5bXB1c19teGxfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPQkiT2x5bXB1cyBSMTAwMCIsCi0JLmZsYWdzID0JRkxBR19GUkFNSU5HX1osCi0JLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAotCS5iaW5kID0JCWdlbmVyaWNfY2RjX2JpbmQsCi0JLnVuYmluZCA9CWNkY191bmJpbmQsCi0JLnR4X2ZpeHVwID0gCXphdXJ1c190eF9maXh1cCwKLX07Ci0jZGVmaW5lCU9MWU1QVVNfTVhMX0lORk8JKCh1bnNpZ25lZCBsb25nKSZvbHltcHVzX214bF9pbmZvKQotCi0KLS8qIFNvbWUgbW9yZSByZWNlbnQgcHJvZHVjdHMgdXNpbmcgTGluZW8vQmVsY2FycmEgY29kZSB3aWxsIHdyb25nbHkgY2xhaW0KLSAqIENEQyBNRExNIGNvbmZvcm1hbmNlLiAgVGhleSBhcmVuJ3QgY29uZm9ybWFudDogIGRhdGEgZW5kcG9pbnRzIGxpdmUKLSAqIGluIHRoZSBjb250cm9sIGludGVyZmFjZSwgdGhlcmUncyBubyBkYXRhIGludGVyZmFjZSwgYW5kIGl0J3Mgbm90IHVzZWQKLSAqIHRvIHRhbGsgdG8gYSBjZWxsIHBob25lIHJhZGlvLiAgQnV0IGF0IGxlYXN0IHdlIGNhbiBkZXRlY3QgdGhlc2UgdHdvCi0gKiBwc2V1ZG8tY2xhc3NlcywgcmF0aGVyIHRoYW4gZ3Jvd2luZyB0aGlzIHByb2R1Y3QgbGlzdCB3aXRoIGVudHJpZXMgZm9yCi0gKiBlYWNoIG5ldyBub25jb25mb3JtYW50IHByb2R1Y3QgKHNpZ2gpLgotICovCi1zdGF0aWMgY29uc3QgdTggc2FmZV9ndWlkWzE2XSA9IHsKLQkweDVkLCAweDM0LCAweGNmLCAweDY2LCAweDExLCAweDE4LCAweDExLCAweGQ2LAotCTB4YTIsIDB4MWEsIDB4MDAsIDB4MDEsIDB4MDIsIDB4Y2EsIDB4OWEsIDB4N2YsCi19Owotc3RhdGljIGNvbnN0IHU4IGJsYW5fZ3VpZFsxNl0gPSB7Ci0JMHg3NCwgMHhmMCwgMHgzZCwgMHhiZCwgMHgxZSwgMHhjMSwgMHg0NCwgMHg3MCwKLQkweGEzLCAweDY3LCAweDcxLCAweDM0LCAweGM5LCAweGY1LCAweDU0LCAweDM3LAotfTsKLQotc3RhdGljIGludCBibGFuX21kbG1fYmluZCAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQl1OAkJCQkqYnVmID0gaW50Zi0+Y3VyX2FsdHNldHRpbmctPmV4dHJhOwotCWludAkJCQlsZW4gPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZXh0cmFsZW47Ci0Jc3RydWN0IHVzYl9jZGNfbWRsbV9kZXNjCSpkZXNjID0gTlVMTDsKLQlzdHJ1Y3QgdXNiX2NkY19tZGxtX2RldGFpbF9kZXNjCSpkZXRhaWwgPSBOVUxMOwotCi0Jd2hpbGUgKGxlbiA+IDMpIHsKLQkJaWYgKGJ1ZiBbMV0gIT0gVVNCX0RUX0NTX0lOVEVSRkFDRSkKLQkJCWdvdG8gbmV4dF9kZXNjOwotCi0JCS8qIHVzZSBiRGVzY3JpcHRvclN1YlR5cGUsIGFuZCBqdXN0IHZlcmlmeSB0aGF0IHdlIGdldCBhCi0JCSAqICJCTEFOIiAob3IgIlNBRkUiKSBkZXNjcmlwdG9yLgotCQkgKi8KLQkJc3dpdGNoIChidWYgWzJdKSB7Ci0JCWNhc2UgVVNCX0NEQ19NRExNX1RZUEU6Ci0JCQlpZiAoZGVzYykgewotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJleHRyYSBNRExNXG4iKTsKLQkJCQlnb3RvIGJhZF9kZXNjOwotCQkJfQotCQkJZGVzYyA9ICh2b2lkICopIGJ1ZjsKLQkJCWlmIChkZXNjLT5iTGVuZ3RoICE9IHNpemVvZiAqZGVzYykgewotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJNRExNIGxlbiAldVxuIiwKLQkJCQkJZGVzYy0+Ykxlbmd0aCk7Ci0JCQkJZ290byBiYWRfZGVzYzsKLQkJCX0KLQkJCS8qIGV4cGVjdCBiY2RWZXJzaW9uIDEuMCwgaWdub3JlICovCi0JCQlpZiAobWVtY21wKCZkZXNjLT5iR1VJRCwgYmxhbl9ndWlkLCAxNikKLQkJCQkgICAgJiYgbWVtY21wKCZkZXNjLT5iR1VJRCwgc2FmZV9ndWlkLCAxNikgKSB7Ci0JCQkJLyogaGV5LCB0aGlzIG9uZSBtaWdodCBfcmVhbGx5XyBiZSBNRExNISAqLwotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJNRExNIGd1aWRcbiIpOwotCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBVU0JfQ0RDX01ETE1fREVUQUlMX1RZUEU6Ci0JCQlpZiAoZGV0YWlsKSB7Ci0JCQkJZGV2X2RiZyAoJmludGYtPmRldiwgImV4dHJhIE1ETE0gZGV0YWlsXG4iKTsKLQkJCQlnb3RvIGJhZF9kZXNjOwotCQkJfQotCQkJZGV0YWlsID0gKHZvaWQgKikgYnVmOwotCQkJc3dpdGNoIChkZXRhaWwtPmJHdWlkRGVzY3JpcHRvclR5cGUpIHsKLQkJCWNhc2UgMDoJCQkvKiAiU0FGRSIgKi8KLQkJCQlpZiAoZGV0YWlsLT5iTGVuZ3RoICE9IChzaXplb2YgKmRldGFpbCArIDIpKQotCQkJCQlnb3RvIGJhZF9kZXRhaWw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6CQkJLyogIkJMQU4iICovCi0JCQkJaWYgKGRldGFpbC0+Ykxlbmd0aCAhPSAoc2l6ZW9mICpkZXRhaWwgKyAzKSkKLQkJCQkJZ290byBiYWRfZGV0YWlsOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlnb3RvIGJhZF9kZXRhaWw7Ci0JCQl9Ci0KLQkJCS8qIGFzc3VtaW5nIHdlIGVpdGhlciBub3RpY2VkIEJMQU4gYWxyZWFkeSwgb3Igd2lsbAotCQkJICogZmluZCBpdCBzb29uLCB0aGVyZSBhcmUgc29tZSBkYXRhIGJ5dGVzIGhlcmU6Ci0JCQkgKiAgLSBibU5ldHdvcmtDYXBhYmlsaXRpZXMgKHVudXNlZCkKLQkJCSAqICAtIGJtRGF0YUNhcGFiaWxpdGllcyAoYml0cywgc2VlIGJlbG93KQotCQkJICogIC0gYlBhZCAoaWdub3JlZCwgZm9yIFBBREFGVEVSIC0tIEJMQU4tb25seSkKLQkJCSAqIGJpdHMgYXJlOgotCQkJICogIC0gMHgwMSAtLSBaYXVydXMgZnJhbWluZyAoYWRkIENSQykKLQkJCSAqICAtIDB4MDIgLS0gUEFEQkVGT1JFIChDUkMgaW5jbHVkZXMgc29tZSBwYWRkaW5nKQotCQkJICogIC0gMHgwNCAtLSBQQURBRlRFUiAoc29tZSBwYWRkaW5nIGFmdGVyIENSQykKLQkJCSAqICAtIDB4MDggLS0gImZlcm1hdCIgcGFja2V0IG1hbmdsaW5nIChmb3IgaHcgYnVncykKLQkJCSAqIHRoZSBQQURCRUZPUkUgYXBwZWFycyBub3QgdG8gbWF0dGVyOyB3ZSBpbnRlcm9wCi0JCQkgKiB3aXRoIGRldmljZXMgdGhhdCB1c2UgaXQgYW5kIHRob3NlIHRoYXQgZG9uJ3QuCi0JCQkgKi8KLQkJCWlmICgoZGV0YWlsLT5iRGV0YWlsRGF0YVsxXSAmIH4wMikgIT0gMHgwMSkgewotCQkJCS8qIGJtRGF0YUNhcGFiaWxpdGVzID09IDAgd291bGQgYmUgZmluZSB0b28sCi0JCQkJICogYnV0IGZyYW1pbmcgaXMgbWluaWRyaXZlci1jb3VwbGVkIGZvciBub3cuCi0JCQkJICovCi1iYWRfZGV0YWlsOgotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsCi0JCQkJCQkiYmFkIE1ETE0gZGV0YWlsLCAlZCAlZCAlZFxuIiwKLQkJCQkJCWRldGFpbC0+Ykxlbmd0aCwKLQkJCQkJCWRldGFpbC0+YkRldGFpbERhdGFbMF0sCi0JCQkJCQlkZXRhaWwtPmJEZXRhaWxEYXRhWzJdKTsKLQkJCQlnb3RvIGJhZF9kZXNjOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLW5leHRfZGVzYzoKLQkJbGVuIC09IGJ1ZiBbMF07CS8qIGJMZW5ndGggKi8KLQkJYnVmICs9IGJ1ZiBbMF07Ci0JfQotCi0JaWYgKCFkZXNjIHx8ICFkZXRhaWwpIHsKLQkJZGV2X2RiZyAoJmludGYtPmRldiwgIm1pc3NpbmcgY2RjIG1kbG0gJXMlc2Rlc2NyaXB0b3JcbiIsCi0JCQlkZXNjID8gIiIgOiAiZnVuYyAiLAotCQkJZGV0YWlsID8gIiIgOiAiZGV0YWlsICIpOwotCQlnb3RvIGJhZF9kZXNjOwotCX0KLQotCS8qIFRoZXJlJ3MgcHJvYmFibHkgYSBDREMgRXRoZXJuZXQgZGVzY3JpcHRvciB0aGVyZSwgYnV0IHdlIGNhbid0Ci0JICogcmVseSBvbiB0aGUgRXRoZXJuZXQgYWRkcmVzcyBpdCBwcm92aWRlcyBzaW5jZSBub3QgYWxsIHZlbmRvcnMKLQkgKiBib3RoZXIgdG8gbWFrZSBpdCB1bmlxdWUuICBMaWtld2lzZSB0aGVyZSdzIG5vIHBvaW50IGluIHRyYWNraW5nCi0JICogb2YgdGhlIENEQyBldmVudCBub3RpZmljYXRpb25zLgotCSAqLwotCXJldHVybiBnZXRfZW5kcG9pbnRzIChkZXYsIGludGYpOwotCi1iYWRfZGVzYzoKLQlkZXZfaW5mbyAoJmRldi0+dWRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgTURMTSBkZXNjcmlwdG9yc1xuIik7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JYm9ndXNfbWRsbV9pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9CSJwc2V1ZG8tTURMTSAoQkxBTikgZGV2aWNlIiwKLQkuZmxhZ3MgPQlGTEFHX0ZSQU1JTkdfWiwKLQkuY2hlY2tfY29ubmVjdCA9IGFsd2F5c19jb25uZWN0ZWQsCi0JLnR4X2ZpeHVwID0gCXphdXJ1c190eF9maXh1cCwKLQkuYmluZCA9CQlibGFuX21kbG1fYmluZCwKLX07Ci0KLSNlbHNlCi0KLS8qIGJsYWNrbGlzdCBhbGwgdGhvc2UgZGV2aWNlcyAqLwotI2RlZmluZQlaQVVSVVNfU1RST05HQVJNX0lORk8JMAotI2RlZmluZQlaQVVSVVNfUFhBX0lORk8JCTAKLSNkZWZpbmUJT0xZTVBVU19NWExfSU5GTwkwCi0KLSNlbmRpZgorRVhQT1JUX1NZTUJPTF9HUEwodXNibmV0X3NrYl9yZXR1cm4pOwogCiAMCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI4NjgsMjIgKzIzMCwxMiBAQAogc3RhdGljIGludCB1c2JuZXRfY2hhbmdlX210dSAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgaW50IG5ld19tdHUpCiB7CiAJc3RydWN0IHVzYm5ldAkqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlpbnQJCWxsX210dSA9IG5ld19tdHUgKyBuZXQtPmhhcmRfaGVhZGVyX2xlbjsKIAotCWlmIChuZXdfbXR1IDw9IE1JTl9QQUNLRVQgfHwgbmV3X210dSA+IE1BWF9QQUNLRVQpCisJaWYgKG5ld19tdHUgPD0gMCB8fCBsbF9tdHUgPiBkZXYtPmhhcmRfbXR1KQogCQlyZXR1cm4gLUVJTlZBTDsKLSNpZmRlZglDT05GSUdfVVNCX05FVDEwODAKLQlpZiAoKChkZXYtPmRyaXZlcl9pbmZvLT5mbGFncykgJiBGTEFHX0ZSQU1JTkdfTkMpKSB7Ci0JCWlmIChGUkFNRURfU0laRSAobmV3X210dSkgPiBNQVhfUEFDS0VUKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotI2VuZGlmCi0jaWZkZWYJQ09ORklHX1VTQl9HRU5FU1lTCi0JaWYgKCgoZGV2LT5kcml2ZXJfaW5mby0+ZmxhZ3MpICYgRkxBR19GUkFNSU5HX0dMKQotCQkJJiYgbmV3X210dSA+IEdMX01BWF9QQUNLRVRfTEVOKQotCQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgogCS8vIG5vIHNlY29uZCB6ZXJvLWxlbmd0aCBwYWNrZXQgcmVhZCB3YW50ZWQgYWZ0ZXIgbXR1LXNpemVkIHBhY2tldHMKLQlpZiAoKChuZXdfbXR1ICsgc2l6ZW9mIChzdHJ1Y3QgZXRoaGRyKSkgJSBkZXYtPm1heHBhY2tldCkgPT0gMCkKKwlpZiAoKGxsX210dSAlIGRldi0+bWF4cGFja2V0KSA9PSAwKQogCQlyZXR1cm4gLUVET007CiAJbmV0LT5tdHUgPSBuZXdfbXR1OwogCXJldHVybiAwOwpAQCAtMjkyMiw3ICsyNzQsNyBAQAogICogTk9URTogIGFubm95aW5nIGFzeW1tZXRyeTogIGlmIGl0J3MgYWN0aXZlLCBzY2hlZHVsZV93b3JrKCkgZmFpbHMsCiAgKiBidXQgdGFza2xldF9zY2hlZHVsZSgpIGRvZXNuJ3QuICBob3BlIHRoZSBmYWlsdXJlIGlzIHJhcmUuCiAgKi8KLXN0YXRpYyB2b2lkIGRlZmVyX2tldmVudCAoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgd29yaykKK3ZvaWQgdXNibmV0X2RlZmVyX2tldmVudCAoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgd29yaykKIHsKIAlzZXRfYml0ICh3b3JrLCAmZGV2LT5mbGFncyk7CiAJaWYgKCFzY2hlZHVsZV93b3JrICgmZGV2LT5rZXZlbnQpKQpAQCAtMjkzMCw1MCArMjgyLDI0IEBACiAJZWxzZQogCQlkZXZkYmcgKGRldiwgImtldmVudCAlZCBzY2hlZHVsZWQiLCB3b3JrKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9kZWZlcl9rZXZlbnQpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgdm9pZCByeF9jb21wbGV0ZSAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKLXN0YXRpYyB2b2lkIHJ4X3N1Ym1pdCAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXJiICp1cmIsIGludCBmbGFncykKK3N0YXRpYyB2b2lkIHJ4X3N1Ym1pdCAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIGZsYWdzKQogewogCXN0cnVjdCBza19idWZmCQkqc2tiOwogCXN0cnVjdCBza2JfZGF0YQkJKmVudHJ5OwogCWludAkJCXJldHZhbCA9IDA7CiAJdW5zaWduZWQgbG9uZwkJbG9ja2ZsYWdzOwotCXNpemVfdAkJCXNpemU7Ci0KLSNpZmRlZiBDT05GSUdfVVNCX05FVDEwODAKLQlpZiAoZGV2LT5kcml2ZXJfaW5mby0+ZmxhZ3MgJiBGTEFHX0ZSQU1JTkdfTkMpCi0JCXNpemUgPSBGUkFNRURfU0laRSAoZGV2LT5uZXQtPm10dSk7Ci0JZWxzZQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1VTQl9HRU5FU1lTCi0JaWYgKGRldi0+ZHJpdmVyX2luZm8tPmZsYWdzICYgRkxBR19GUkFNSU5HX0dMKQotCQlzaXplID0gR0xfUkNWX0JVRl9TSVpFOwotCWVsc2UKLSNlbmRpZgotI2lmZGVmIENPTkZJR19VU0JfWkFVUlVTCi0JaWYgKGRldi0+ZHJpdmVyX2luZm8tPmZsYWdzICYgRkxBR19GUkFNSU5HX1opCi0JCXNpemUgPSA2ICsgKHNpemVvZiAoc3RydWN0IGV0aGhkcikgKyBkZXYtPm5ldC0+bXR1KTsKLQllbHNlCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVVNCX1JORElTCi0JaWYgKGRldi0+ZHJpdmVyX2luZm8tPmZsYWdzICYgRkxBR19GUkFNSU5HX1JOKQotCQlzaXplID0gUk5ESVNfTUFYX1RSQU5TRkVSOwotCWVsc2UKLSNlbmRpZgotI2lmZGVmIENPTkZJR19VU0JfQVg4ODE3WAotCWlmIChkZXYtPmRyaXZlcl9pbmZvLT5mbGFncyAmIEZMQUdfRlJBTUlOR19BWCkKLQkJc2l6ZSA9IDIwNDg7Ci0JZWxzZQotI2VuZGlmCi0JCXNpemUgPSAoc2l6ZW9mIChzdHJ1Y3QgZXRoaGRyKSArIGRldi0+bmV0LT5tdHUpOworCXNpemVfdAkJCXNpemUgPSBkZXYtPnJ4X3VyYl9zaXplOwogCiAJaWYgKChza2IgPSBhbGxvY19za2IgKHNpemUgKyBORVRfSVBfQUxJR04sIGZsYWdzKSkgPT0gTlVMTCkgewogCQlpZiAobmV0aWZfbXNnX3J4X2VyciAoZGV2KSkKIAkJCWRldmRiZyAoZGV2LCAibm8gcnggc2tiIik7Ci0JCWRlZmVyX2tldmVudCAoZGV2LCBFVkVOVF9SWF9NRU1PUlkpOworCQl1c2JuZXRfZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX1JYX01FTU9SWSk7CiAJCXVzYl9mcmVlX3VyYiAodXJiKTsKIAkJcmV0dXJuOwogCX0KQEAgLTI5ODcsNyArMzEzLDYgQEAKIAogCXVzYl9maWxsX2J1bGtfdXJiICh1cmIsIGRldi0+dWRldiwgZGV2LT5pbiwKIAkJc2tiLT5kYXRhLCBzaXplLCByeF9jb21wbGV0ZSwgc2tiKTsKLQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmRldi0+cnhxLmxvY2ssIGxvY2tmbGFncyk7CiAKQEAgLTI5OTYsMTAgKzMyMSwxMCBAQAogCQkJJiYgIXRlc3RfYml0IChFVkVOVF9SWF9IQUxULCAmZGV2LT5mbGFncykpIHsKIAkJc3dpdGNoIChyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKSl7IAogCQljYXNlIC1FUElQRToKLQkJCWRlZmVyX2tldmVudCAoZGV2LCBFVkVOVF9SWF9IQUxUKTsKKwkJCXVzYm5ldF9kZWZlcl9rZXZlbnQgKGRldiwgRVZFTlRfUlhfSEFMVCk7CiAJCQlicmVhazsKIAkJY2FzZSAtRU5PTUVNOgotCQkJZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX1JYX01FTU9SWSk7CisJCQl1c2JuZXRfZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX1JYX01FTU9SWSk7CiAJCQlicmVhazsKIAkJY2FzZSAtRU5PREVWOgogCQkJaWYgKG5ldGlmX21zZ19pZmRvd24gKGRldikpCkBAIC0zMDM3LDcgKzM2Miw3IEBACiAJLy8gZWxzZSBuZXR3b3JrIHN0YWNrIHJlbW92ZXMgZXh0cmEgYnl0ZSBpZiB3ZSBmb3JjZWQgYSBzaG9ydCBwYWNrZXQKIAogCWlmIChza2ItPmxlbikKLQkJc2tiX3JldHVybiAoZGV2LCBza2IpOworCQl1c2JuZXRfc2tiX3JldHVybiAoZGV2LCBza2IpOwogCWVsc2UgewogCQlpZiAobmV0aWZfbXNnX3J4X2VyciAoZGV2KSkKIAkJCWRldmRiZyAoZGV2LCAiZHJvcCIpOwpAQCAtMzA2Myw3ICszODgsNyBAQAogCXN3aXRjaCAodXJiX3N0YXR1cykgewogCSAgICAvLyBzdWNjZXNzCiAJICAgIGNhc2UgMDoKLQkJaWYgKE1JTl9QQUNLRVQgPiBza2ItPmxlbiB8fCBza2ItPmxlbiA+IE1BWF9QQUNLRVQpIHsKKwkJaWYgKHNrYi0+bGVuIDwgZGV2LT5uZXQtPmhhcmRfaGVhZGVyX2xlbikgewogCQkJZW50cnktPnN0YXRlID0gcnhfY2xlYW51cDsKIAkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKQEAgLTMwNzgsNyArNDAzLDcgQEAKIAkgICAgLy8gc3Rvcm0sIHJlY292ZXJpbmcgYXMgbmVlZGVkLgogCSAgICBjYXNlIC1FUElQRToKIAkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX1JYX0hBTFQpOworCQl1c2JuZXRfZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX1JYX0hBTFQpOwogCQkvLyBGQUxMVEhST1VHSAogCiAJICAgIC8vIHNvZnR3YXJlLWRyaXZlbiBpbnRlcmZhY2Ugc2h1dGRvd24KQEAgLTMzMjAsNTUgKzY0NSw1OCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgdm9pZCB1c2JuZXRfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCisvKiBldGh0b29sIG1ldGhvZHM7IG1pbmlkcml2ZXJzIG1heSBuZWVkIHRvIGFkZCBzb21lIG1vcmUsIGJ1dAorICogdGhleSdsbCBwcm9iYWJseSB3YW50IHRvIHVzZSB0aGlzIGJhc2Ugc2V0LgorICovCisKK3ZvaWQgdXNibmV0X2dldF9kcnZpbmZvIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKKwkvKiBSRVZJU0lUIGRvbid0IGFsd2F5cyByZXR1cm4gInVzYm5ldCIgKi8KIAlzdHJuY3B5IChpbmZvLT5kcml2ZXIsIGRyaXZlcl9uYW1lLCBzaXplb2YgaW5mby0+ZHJpdmVyKTsKIAlzdHJuY3B5IChpbmZvLT52ZXJzaW9uLCBEUklWRVJfVkVSU0lPTiwgc2l6ZW9mIGluZm8tPnZlcnNpb24pOwogCXN0cm5jcHkgKGluZm8tPmZ3X3ZlcnNpb24sIGRldi0+ZHJpdmVyX2luZm8tPmRlc2NyaXB0aW9uLAogCQlzaXplb2YgaW5mby0+ZndfdmVyc2lvbik7CiAJdXNiX21ha2VfcGF0aCAoZGV2LT51ZGV2LCBpbmZvLT5idXNfaW5mbywgc2l6ZW9mIGluZm8tPmJ1c19pbmZvKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9nZXRfZHJ2aW5mbyk7CiAKIHN0YXRpYyB1MzIgdXNibmV0X2dldF9saW5rIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKLQkvKiBJZiBhIGNoZWNrX2Nvbm5lY3QgaXMgZGVmaW5lZCwgcmV0dXJuIGl0J3MgcmVzdWx0cyAqLworCS8qIElmIGEgY2hlY2tfY29ubmVjdCBpcyBkZWZpbmVkLCByZXR1cm4gaXRzIHJlc3VsdCAqLwogCWlmIChkZXYtPmRyaXZlcl9pbmZvLT5jaGVja19jb25uZWN0KQogCQlyZXR1cm4gZGV2LT5kcml2ZXJfaW5mby0+Y2hlY2tfY29ubmVjdCAoZGV2KSA9PSAwOwogCi0JLyogT3RoZXJ3aXNlLCB3ZSdyZSB1cCB0byBhdm9pZCBicmVha2luZyBzY3JpcHRzICovCisJLyogT3RoZXJ3aXNlLCBzYXkgd2UncmUgdXAgKHRvIGF2b2lkIGJyZWFraW5nIHNjcmlwdHMpICovCiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB1MzIgdXNibmV0X2dldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3UzMiB1c2JuZXRfZ2V0X21zZ2xldmVsIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKIAlyZXR1cm4gZGV2LT5tc2dfZW5hYmxlOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNibmV0X2dldF9tc2dsZXZlbCk7CiAKLXN0YXRpYyB2b2lkIHVzYm5ldF9zZXRfbXNnbGV2ZWwgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHUzMiBsZXZlbCkKK3ZvaWQgdXNibmV0X3NldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgdTMyIGxldmVsKQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKIAlkZXYtPm1zZ19lbmFibGUgPSBsZXZlbDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9zZXRfbXNnbGV2ZWwpOwogCi1zdGF0aWMgaW50IHVzYm5ldF9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKLXsKLSNpZmRlZiBORUVEX01JSQotCXsKLQlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwotCi0JaWYgKGRldi0+bWlpLm1kaW9fcmVhZCAhPSBOVUxMICYmIGRldi0+bWlpLm1kaW9fd3JpdGUgIT0gTlVMTCkKLQkJcmV0dXJuIGdlbmVyaWNfbWlpX2lvY3RsKCZkZXYtPm1paSwgaWZfbWlpKHJxKSwgY21kLCBOVUxMKTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19CisvKiBkcml2ZXJzIG1heSBvdmVycmlkZSBkZWZhdWx0IGV0aHRvb2xfb3BzIGluIHRoZWlyIGJpbmQoKSByb3V0aW5lICovCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHVzYm5ldF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gdXNibmV0X2dldF9kcnZpbmZvLAorCS5nZXRfbGluawkJPSB1c2JuZXRfZ2V0X2xpbmssCisJLmdldF9tc2dsZXZlbAkJPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gdXNibmV0X3NldF9tc2dsZXZlbCwKK307CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTMzODcsMTkgKzcxNSwyNCBAQAogCWlmICh0ZXN0X2JpdCAoRVZFTlRfVFhfSEFMVCwgJmRldi0+ZmxhZ3MpKSB7CiAJCXVubGlua191cmJzIChkZXYsICZkZXYtPnR4cSk7CiAJCXN0YXR1cyA9IHVzYl9jbGVhcl9oYWx0IChkZXYtPnVkZXYsIGRldi0+b3V0KTsKLQkJaWYgKHN0YXR1cyA8IDAgJiYgc3RhdHVzICE9IC1FUElQRSkgeworCQlpZiAoc3RhdHVzIDwgMAorCQkJCSYmIHN0YXR1cyAhPSAtRVBJUEUKKwkJCQkmJiBzdGF0dXMgIT0gLUVTSFVURE9XTikgewogCQkJaWYgKG5ldGlmX21zZ190eF9lcnIgKGRldikpCiAJCQkJZGV2ZXJyIChkZXYsICJjYW4ndCBjbGVhciB0eCBoYWx0LCBzdGF0dXMgJWQiLAogCQkJCQlzdGF0dXMpOwogCQl9IGVsc2UgewogCQkJY2xlYXJfYml0IChFVkVOVF9UWF9IQUxULCAmZGV2LT5mbGFncyk7Ci0JCQluZXRpZl93YWtlX3F1ZXVlIChkZXYtPm5ldCk7CisJCQlpZiAoc3RhdHVzICE9IC1FU0hVVERPV04pCisJCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2LT5uZXQpOwogCQl9CiAJfQogCWlmICh0ZXN0X2JpdCAoRVZFTlRfUlhfSEFMVCwgJmRldi0+ZmxhZ3MpKSB7CiAJCXVubGlua191cmJzIChkZXYsICZkZXYtPnJ4cSk7CiAJCXN0YXR1cyA9IHVzYl9jbGVhcl9oYWx0IChkZXYtPnVkZXYsIGRldi0+aW4pOwotCQlpZiAoc3RhdHVzIDwgMCAmJiBzdGF0dXMgIT0gLUVQSVBFKSB7CisJCWlmIChzdGF0dXMgPCAwCisJCQkJJiYgc3RhdHVzICE9IC1FUElQRQorCQkJCSYmIHN0YXR1cyAhPSAtRVNIVVRET1dOKSB7CiAJCQlpZiAobmV0aWZfbXNnX3J4X2VyciAoZGV2KSkKIAkJCQlkZXZlcnIgKGRldiwgImNhbid0IGNsZWFyIHJ4IGhhbHQsIHN0YXR1cyAlZCIsCiAJCQkJCXN0YXR1cyk7CkBAIC0zNDU4LDcgKzc5MSw3IEBACiAKIAkJc3dpdGNoICh1cmItPnN0YXR1cykgewogCQljYXNlIC1FUElQRToKLQkJCWRlZmVyX2tldmVudCAoZGV2LCBFVkVOVF9UWF9IQUxUKTsKKwkJCXVzYm5ldF9kZWZlcl9rZXZlbnQgKGRldiwgRVZFTlRfVFhfSEFMVCk7CiAJCQlicmVhazsKIAogCQkvKiBzb2Z0d2FyZS1kcml2ZW4gaW50ZXJmYWNlIHNodXRkb3duICovCkBAIC0zNTE1LDEwICs4NDgsNiBAQAogCXN0cnVjdCBza2JfZGF0YQkJKmVudHJ5OwogCXN0cnVjdCBkcml2ZXJfaW5mbwkqaW5mbyA9IGRldi0+ZHJpdmVyX2luZm87CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0jaWZkZWYJQ09ORklHX1VTQl9ORVQxMDgwCi0Jc3RydWN0IG5jX2hlYWRlcgkqaGVhZGVyID0gTlVMTDsKLQlzdHJ1Y3QgbmNfdHJhaWxlcgkqdHJhaWxlciA9IE5VTEw7Ci0jZW5kaWYJLyogQ09ORklHX1VTQl9ORVQxMDgwICovCiAKIAkvLyBzb21lIGRldmljZXMgd2FudCBmdW5reSBVU0ItbGV2ZWwgZnJhbWluZywgZm9yCiAJLy8gd2luMzIgZHJpdmVyICh1c3VhbGx5KSBhbmQvb3IgaGFyZHdhcmUgcXVpcmtzCkBAIC0zNTQ0LDI0ICs4NzMsOCBAQAogCWVudHJ5LT5zdGF0ZSA9IHR4X3N0YXJ0OwogCWVudHJ5LT5sZW5ndGggPSBsZW5ndGg7CiAKLQkvLyBGSVhNRTogcmVvcmdhbml6ZSBhIGJpdCwgc28gdGhhdCBmaXh1cCgpIGZpbGxzIG91dCBOZXRDaGlwCi0JLy8gZnJhbWluZyB0b28uIChQYWNrZXQgSUQgdXBkYXRlIG5lZWRzIHRoZSBzcGlubG9jay4uLikKLQkvLyBbIEJFVFRFUjogIHdlIGFscmVhZHkgb3duIG5ldC0+eG1pdF9sb2NrLCB0aGF0J3MgZW5vdWdoIF0KLQotI2lmZGVmCUNPTkZJR19VU0JfTkVUMTA4MAotCWlmIChpbmZvLT5mbGFncyAmIEZMQUdfRlJBTUlOR19OQykgewotCQloZWFkZXIgPSAoc3RydWN0IG5jX2hlYWRlciAqKSBza2JfcHVzaCAoc2tiLCBzaXplb2YgKmhlYWRlcik7Ci0JCWhlYWRlci0+aGRyX2xlbiA9IGNwdV90b19sZTE2IChzaXplb2YgKCpoZWFkZXIpKTsKLQkJaGVhZGVyLT5wYWNrZXRfbGVuID0gY3B1X3RvX2xlMTYgKGxlbmd0aCk7Ci0JCWlmICghKChza2ItPmxlbiArIHNpemVvZiAqdHJhaWxlcikgJiAweDAxKSkKLQkJCSpza2JfcHV0IChza2IsIDEpID0gUEFEX0JZVEU7Ci0JCXRyYWlsZXIgPSAoc3RydWN0IG5jX3RyYWlsZXIgKikgc2tiX3B1dCAoc2tiLCBzaXplb2YgKnRyYWlsZXIpOwotCX0KLSNlbmRpZgkvKiBDT05GSUdfVVNCX05FVDEwODAgKi8KLQogCXVzYl9maWxsX2J1bGtfdXJiICh1cmIsIGRldi0+dWRldiwgZGV2LT5vdXQsCiAJCQlza2ItPmRhdGEsIHNrYi0+bGVuLCB0eF9jb21wbGV0ZSwgc2tiKTsKLQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAKIAkvKiBkb24ndCBhc3N1bWUgdGhlIGhhcmR3YXJlIGhhbmRsZXMgVVNCX1pFUk9fUEFDS0VUCiAJICogTk9URTogIHN0cmljdGx5IGNvbmZvcm1pbmcgY2RjLWV0aGVyIGRldmljZXMgc2hvdWxkIGV4cGVjdApAQCAtMzU3NCwyMiArODg3LDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmRldi0+dHhxLmxvY2ssIGZsYWdzKTsKIAotI2lmZGVmCUNPTkZJR19VU0JfTkVUMTA4MAotCWlmIChpbmZvLT5mbGFncyAmIEZMQUdfRlJBTUlOR19OQykgewotCQloZWFkZXItPnBhY2tldF9pZCA9IGNwdV90b19sZTE2ICgodTE2KWRldi0+ZGV2X3BhY2tldF9pZCsrKTsKLQkJcHV0X3VuYWxpZ25lZCAoaGVhZGVyLT5wYWNrZXRfaWQsICZ0cmFpbGVyLT5wYWNrZXRfaWQpOwotI2lmIDAKLQkJZGV2ZGJnIChkZXYsICJmcmFtZSA+dHggaCAlZCBwICVkIGlkICVkIiwKLQkJCWhlYWRlci0+aGRyX2xlbiwgaGVhZGVyLT5wYWNrZXRfbGVuLAotCQkJaGVhZGVyLT5wYWNrZXRfaWQpOwotI2VuZGlmCi0JfQotI2VuZGlmCS8qIENPTkZJR19VU0JfTkVUMTA4MCAqLwotCiAJc3dpdGNoICgocmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQykpKSB7CiAJY2FzZSAtRVBJUEU6CiAJCW5ldGlmX3N0b3BfcXVldWUgKG5ldCk7Ci0JCWRlZmVyX2tldmVudCAoZGV2LCBFVkVOVF9UWF9IQUxUKTsKKwkJdXNibmV0X2RlZmVyX2tldmVudCAoZGV2LCBFVkVOVF9UWF9IQUxUKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJaWYgKG5ldGlmX21zZ190eF9lcnIgKGRldikpCkBAIC0zNjkyLDcgKzk5Myw3IEBACiAgCiAvLyBwcmVjb25kaXRpb246IG5ldmVyIGNhbGxlZCBpbl9pbnRlcnJ1cHQKIAotc3RhdGljIHZvaWQgdXNibmV0X2Rpc2Nvbm5lY3QgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQordm9pZCB1c2JuZXRfZGlzY29ubmVjdCAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHVzYm5ldAkJKmRldjsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqeGRldjsKQEAgLTM3MDYsNyArMTAwNyw4IEBACiAJeGRldiA9IGludGVyZmFjZV90b191c2JkZXYgKGludGYpOwogCiAJaWYgKG5ldGlmX21zZ19wcm9iZSAoZGV2KSkKLQkJZGV2aW5mbyAoZGV2LCAidW5yZWdpc3RlciB1c2JuZXQgdXNiLSVzLSVzLCAlcyIsCisJCWRldmluZm8gKGRldiwgInVucmVnaXN0ZXIgJyVzJyB1c2ItJXMtJXMsICVzIiwKKwkJCWludGYtPmRldi5kcml2ZXItPm5hbWUsCiAJCQl4ZGV2LT5idXMtPmJ1c19uYW1lLCB4ZGV2LT5kZXZwYXRoLAogCQkJZGV2LT5kcml2ZXJfaW5mby0+ZGVzY3JpcHRpb24pOwogCQpAQCAtMzcyMiwxNSArMTAyNCwxNCBAQAogCWZyZWVfbmV0ZGV2KG5ldCk7CiAJdXNiX3B1dF9kZXYgKHhkZXYpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNibmV0X2Rpc2Nvbm5lY3QpOwogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgdXNibmV0X2V0aHRvb2xfb3BzOwotCiAvLyBwcmVjb25kaXRpb246IG5ldmVyIGNhbGxlZCBpbl9pbnRlcnJ1cHQKIAotc3RhdGljIGludAoraW50CiB1c2JuZXRfcHJvYmUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1ZGV2LCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqcHJvZCkKIHsKIAlzdHJ1Y3QgdXNibmV0CQkJKmRldjsKQEAgLTM3NzksNiArMTA4MCwxMCBAQAogCXN0cmNweSAobmV0LT5uYW1lLCAidXNiJWQiKTsKIAltZW1jcHkgKG5ldC0+ZGV2X2FkZHIsIG5vZGVfaWQsIHNpemVvZiBub2RlX2lkKTsKIAorCS8qIHJ4IGFuZCB0eCBzaWRlcyBjYW4gdXNlIGRpZmZlcmVudCBtZXNzYWdlIHNpemVzOworCSAqIGJpbmQoKSBzaG91bGQgc2V0IHJ4X3VyYl9zaXplIGluIHRoYXQgY2FzZS4KKwkgKi8KKwlkZXYtPmhhcmRfbXR1ID0gbmV0LT5tdHUgKyBuZXQtPmhhcmRfaGVhZGVyX2xlbjsKICNpZiAwCiAvLyBkbWFfc3VwcG9ydGVkKCkgaXMgZGVlcGx5IGJyb2tlbiBvbiBhbG1vc3QgYWxsIGFyY2hpdGVjdHVyZXMKIAkvLyBwb3NzaWJsZSB3aXRoIHNvbWUgRUhDSSBjb250cm9sbGVycwpAQCAtMzc5Myw3ICsxMDk4LDYgQEAKIAluZXQtPnN0b3AgPSB1c2JuZXRfc3RvcDsKIAluZXQtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVF9KSUZGSUVTOwogCW5ldC0+dHhfdGltZW91dCA9IHVzYm5ldF90eF90aW1lb3V0OwotCW5ldC0+ZG9faW9jdGwgPSB1c2JuZXRfaW9jdGw7CiAJbmV0LT5ldGh0b29sX29wcyA9ICZ1c2JuZXRfZXRodG9vbF9vcHM7CiAKIAkvLyBhbGxvdyBkZXZpY2Utc3BlY2lmaWMgYmluZC9pbml0IHByb2NlZHVyZXMKQEAgLTM4MDYsOCArMTExMCwxMiBAQAogCQlpZiAoKGRldi0+ZHJpdmVyX2luZm8tPmZsYWdzICYgRkxBR19FVEhFUikgIT0gMAogCQkJCSYmIChuZXQtPmRldl9hZGRyIFswXSAmIDB4MDIpID09IDApCiAJCQlzdHJjcHkgKG5ldC0+bmFtZSwgImV0aCVkIik7Ci0JfSBlbHNlIGlmICghaW5mby0+aW4gfHwgaW5mby0+b3V0KQotCQlzdGF0dXMgPSBnZXRfZW5kcG9pbnRzIChkZXYsIHVkZXYpOworCisJCS8qIG1heWJlIHRoZSByZW1vdGUgY2FuJ3QgcmVjZWl2ZSBhbiBFdGhlcm5ldCBNVFUgKi8KKwkJaWYgKG5ldC0+bXR1ID4gKGRldi0+aGFyZF9tdHUgLSBuZXQtPmhhcmRfaGVhZGVyX2xlbikpCisJCQluZXQtPm10dSA9IGRldi0+aGFyZF9tdHUgLSBuZXQtPmhhcmRfaGVhZGVyX2xlbjsKKwl9IGVsc2UgaWYgKCFpbmZvLT5pbiB8fCAhaW5mby0+b3V0KQorCQlzdGF0dXMgPSB1c2JuZXRfZ2V0X2VuZHBvaW50cyAoZGV2LCB1ZGV2KTsKIAllbHNlIHsKIAkJZGV2LT5pbiA9IHVzYl9yY3ZidWxrcGlwZSAoeGRldiwgaW5mby0+aW4pOwogCQlkZXYtPm91dCA9IHVzYl9zbmRidWxrcGlwZSAoeGRldiwgaW5mby0+b3V0KTsKQEAgLTM4MTksMTIgKzExMjcsMTMgQEAKIAkJCXN0YXR1cyA9IDA7CiAKIAl9Ci0KIAlpZiAoc3RhdHVzID09IDAgJiYgZGV2LT5zdGF0dXMpCiAJCXN0YXR1cyA9IGluaXRfc3RhdHVzIChkZXYsIHVkZXYpOwogCWlmIChzdGF0dXMgPCAwKQogCQlnb3RvIG91dDE7CiAKKwlpZiAoIWRldi0+cnhfdXJiX3NpemUpCisJCWRldi0+cnhfdXJiX3NpemUgPSBkZXYtPmhhcmRfbXR1OwogCWRldi0+bWF4cGFja2V0ID0gdXNiX21heHBhY2tldCAoZGV2LT51ZGV2LCBkZXYtPm91dCwgMSk7CiAJCiAJU0VUX05FVERFVl9ERVYobmV0LCAmdWRldi0+ZGV2KTsKQEAgLTM4MzIsOCArMTE0MSw5IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQzOwogCWlmIChuZXRpZl9tc2dfcHJvYmUgKGRldikpCi0JCWRldmluZm8gKGRldiwgInJlZ2lzdGVyIHVzYm5ldCBhdCB1c2ItJXMtJXMsICVzLCAiCisJCWRldmluZm8gKGRldiwgInJlZ2lzdGVyICclcycgYXQgdXNiLSVzLSVzLCAlcywgIgogCQkJCSIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQl1ZGV2LT5kZXYuZHJpdmVyLT5uYW1lLAogCQkJeGRldi0+YnVzLT5idXNfbmFtZSwgeGRldi0+ZGV2cGF0aCwKIAkJCWRldi0+ZHJpdmVyX2luZm8tPmRlc2NyaXB0aW9uLAogCQkJbmV0LT5kZXZfYWRkciBbMF0sIG5ldC0+ZGV2X2FkZHIgWzFdLApAQCAtMzg1NywxMiArMTE2NywxNSBAQAogCXVzYl9wdXRfZGV2KHhkZXYpOwogCXJldHVybiBzdGF0dXM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JuZXRfcHJvYmUpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWZkZWYJQ09ORklHX1BNCisvKiBGSVhNRSB0aGVzZSBzdXNwZW5kL3Jlc3VtZSBtZXRob2RzIGFzc3VtZSBub24tQ0RDIHN0eWxlCisgKiBkZXZpY2VzLCB3aXRoIG9ubHkgb25lIGludGVyZmFjZS4KKyAqLwogCi1zdGF0aWMgaW50IHVzYm5ldF9zdXNwZW5kIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCitpbnQgdXNibmV0X3N1c3BlbmQgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKIHsKIAlzdHJ1Y3QgdXNibmV0CQkqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAkKQEAgLTM4NzUsOCArMTE4OCw5IEBACiAJaW50Zi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19TVVNQRU5EOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNibmV0X3N1c3BlbmQpOwogCi1zdGF0aWMgaW50IHVzYm5ldF9yZXN1bWUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoraW50IHVzYm5ldF9yZXN1bWUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCB1c2JuZXQJCSpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCkBAIC0zODg1LDM1NyArMTE5OSwyNyBAQAogCXRhc2tsZXRfc2NoZWR1bGUgKCZkZXYtPmJoKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9yZXN1bWUpOwogCi0jZWxzZQkvKiAhQ09ORklHX1BNICovCi0KLSNkZWZpbmUJdXNibmV0X3N1c3BlbmQJTlVMTAotI2RlZmluZQl1c2JuZXRfcmVzdW1lCU5VTEwKLQotI2VuZGlmCS8qIENPTkZJR19QTSAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWZuZGVmCUhBVkVfSEFSRFdBUkUKLSNlcnJvciBZb3UgbmVlZCB0byBjb25maWd1cmUgc29tZSBoYXJkd2FyZSBmb3IgdGhpcyBkcml2ZXIKLSNlbmRpZgotCi0vKgotICogY2hpcCB2ZW5kb3IgbmFtZXMgd29uJ3Qgbm9ybWFsbHkgYmUgb24gdGhlIGNhYmxlcywgYW5kCi0gKiBtYXkgbm90IGJlIG9uIHRoZSBkZXZpY2UuCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkCXByb2R1Y3RzIFtdID0gewotCi0jaWZkZWYJQ09ORklHX1VTQl9BTElfTTU2MzIKK3N0YXRpYyBpbnQgX19pbml0IHVzYm5ldF9pbml0KHZvaWQpCiB7Ci0JVVNCX0RFVklDRSAoMHgwNDAyLCAweDU2MzIpLAkvLyBBTGkgZGVmYXVsdHMKLQkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmFsaV9tNTYzMl9pbmZvLAotfSwKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9BTjI3MjAKLXsKLQlVU0JfREVWSUNFICgweDA1NDcsIDB4MjcyMCksCS8vIEFuY2hvckNoaXBzIGRlZmF1bHRzCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZhbjI3MjBfaW5mbywKLX0sIHsKLQlVU0JfREVWSUNFICgweDA1NDcsIDB4MjcyNyksCS8vIFhpcmNvbSBQR1VORVQKLQkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmFuMjcyMF9pbmZvLAotfSwKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9CRUxLSU4KLXsKLQlVU0JfREVWSUNFICgweDA1MGQsIDB4MDAwNCksCS8vIEJlbGtpbgotCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmYmVsa2luX2luZm8sCi19LCB7Ci0JVVNCX0RFVklDRSAoMHgwNTZjLCAweDgxMDApLAkvLyBlVEVLCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZiZWxraW5faW5mbywKLX0sIHsKLQlVU0JfREVWSUNFICgweDA1MjUsIDB4OTkwMSksCS8vIEFkdmFuY2UgVVNCTkVUIChlVEVLKQotCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmYmVsa2luX2luZm8sCi19LAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfVVNCX0FYODgxN1gKLXsKLQkvLyBMaW5rc3lzIFVTQjIwME0KLQlVU0JfREVWSUNFICgweDA3N2IsIDB4MjIyNiksCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCi19LCB7Ci0JLy8gTmV0Z2VhciBGQTEyMAotCVVTQl9ERVZJQ0UgKDB4MDg0NiwgMHgxMDQwKSwKLQkuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZuZXRnZWFyX2ZhMTIwX2luZm8sCi19LCB7Ci0JLy8gRExpbmsgRFVCLUUxMDAKLQlVU0JfREVWSUNFICgweDIwMDEsIDB4MWEwMCksCi0JLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmZGxpbmtfZHViX2UxMDBfaW5mbywKLX0sIHsKLQkvLyBJbnRlbGxpbmV0LCBTVCBMYWIgVVNCIEV0aGVybmV0Ci0JVVNCX0RFVklDRSAoMHgwYjk1LCAweDE3MjApLAotCS5kcml2ZXJfaW5mbyA9ICAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKLX0sIHsKLQkvLyBIYXdraW5nIFVGMjAwLCBUcmVuZE5ldCBUVTItRVQxMDAKLQlVU0JfREVWSUNFICgweDA3YjgsIDB4NDIwYSksCi0JLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmaGF3a2luZ191ZjIwMF9pbmZvLAotfSwgewotICAgICAgICAvLyBCaWxsaW9udG9uIFN5c3RlbXMsIFVTQjJBUiAKLSAgICAgICAgVVNCX0RFVklDRSAoMHgwOGRkLCAweDkwZmYpLAotICAgICAgICAuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCi19LCB7Ci0JLy8gQVRFTiBVQzIxMFQKLQlVU0JfREVWSUNFICgweDA1NTcsIDB4MjAwOSksCi0JLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmYXg4ODE3eF9pbmZvLAotfSwgewotCS8vIEJ1ZmZhbG8gTFVBLVUyLUtUWAotCVVTQl9ERVZJQ0UgKDB4MDQxMSwgMHgwMDNkKSwKLQkuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCi19LCB7Ci0JLy8gU2l0ZWNvbSBMTi0wMjkgIlVTQiAyLjAgMTAvMTAwIEV0aGVybmV0IGFkYXB0ZXIiCi0JVVNCX0RFVklDRSAoMHg2MTg5LCAweDE4MmQpLAotCS5kcml2ZXJfaW5mbyA9ICAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKLX0sIHsKLQkvLyBjb3JlZ2EgRkV0aGVyIFVTQjItVFgKLQlVU0JfREVWSUNFICgweDA3YWEsIDB4MDAxNyksCi0JLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmYXg4ODE3eF9pbmZvLAotfSwgewotCS8vIFN1cmVjb20gRVAtMTQyN1gtMgotCVVTQl9ERVZJQ0UgKDB4MTE4OSwgMHgwODkzKSwKLQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKLX0sIHsKLQkvLyBnb29kd2F5IGNvcnAgdXNiIGd3dXNiMmUKLQlVU0JfREVWSUNFICgweDE2MzEsIDB4NjIwMCksCi0JLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCi19LCB7Ci0JLy8gQVNJWCBBWDg4NzcyIDEwLzEwMAotICAgICAgICBVU0JfREVWSUNFICgweDBiOTUsIDB4NzcyMCksCi0gICAgICAgIC5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODc3Ml9pbmZvLAotfSwKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9FUFNPTjI4ODgKLXsKLQlVU0JfREVWSUNFICgweDA1MjUsIDB4Mjg4OCksCS8vIEVQU09OIFVTQiBjbGllbnQKLQkuZHJpdmVyX2luZm8JPSAodW5zaWduZWQgbG9uZykgJmVwc29uMjg4OF9pbmZvLAotfSwKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9HRU5FU1lTCi17Ci0JVVNCX0RFVklDRSAoMHgwNWUzLCAweDA1MDIpLAkvLyBHTDYyMFVTQi1BCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZnZW5lbGlua19pbmZvLAotfSwKLQkvKiBOT1Q6IFVTQl9ERVZJQ0UgKDB4MDVlMywgMHgwNTAxKSwJLy8gR0w2MjBVU0IKLQkgKiB0aGF0J3MgaGFsZiBkdXBsZXgsIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICovCi0jZW5kaWYKLQotI2lmZGVmCUNPTkZJR19VU0JfTkVUMTA4MAotewotCVVTQl9ERVZJQ0UgKDB4MDUyNSwgMHgxMDgwKSwJLy8gTmV0Q2hpcCByZWYgZGVzaWduCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZuZXQxMDgwX2luZm8sCi19LCB7Ci0JVVNCX0RFVklDRSAoMHgwNkQwLCAweDA2MjIpLAkvLyBMYXBsaW5rIEdvbGQKLQkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJm5ldDEwODBfaW5mbywKLX0sCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19VU0JfUEwyMzAxCi17Ci0JVVNCX0RFVklDRSAoMHgwNjdiLCAweDAwMDApLAkvLyBQTC0yMzAxCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZwcm9saWZpY19pbmZvLAotfSwgewotCVVTQl9ERVZJQ0UgKDB4MDY3YiwgMHgwMDAxKSwJLy8gUEwtMjMwMgotCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmcHJvbGlmaWNfaW5mbywKLX0sCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19VU0JfS0MyMTkwCi17Ci0JVVNCX0RFVklDRSAoMHgwNTBmLCAweDAxOTApLAkvLyBLQy0xOTAKLQkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmtjMjE5MF9pbmZvLAotfSwKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9STkRJUwotewotCS8qIFJORElTIGlzIE1TRlQncyB1bi1vZmZpY2lhbCB2YXJpYW50IG9mIENEQyBBQ00gKi8KLQlVU0JfSU5URVJGQUNFX0lORk8gKFVTQl9DTEFTU19DT01NLCAyIC8qIEFDTSAqLywgMHgwZmYpLAotCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmcm5kaXNfaW5mbywKLX0sCi0jZW5kaWYKLQotI2lmZGVmCUNPTkZJR19VU0JfQVJNTElOVVgKLS8qCi0gKiBTQS0xMTAwIHVzaW5nIHN0YW5kYXJkIEFSTSBMaW51eCBrZXJuZWxzLCBvciBjb21wYXRpYmxlLgotICogT2Z0ZW4gdXNlZCB3aGVuIHRhbGtpbmcgdG8gTGludXggUERBcyAoaVBhcSwgWW9weSwgZXRjKS4KLSAqIFRoZSBzYS0xMTAwICJ1c2ItZXRoIiBkcml2ZXIgaGFuZGxlcyB0aGUgYmFzaWMgZnJhbWluZy4KLSAqCi0gKiBQWEEyNXggb3IgUFhBMjEwIC4uLiAgdGhlc2UgdXNlIGEgInVzYi1ldGgiIGRyaXZlciBtdWNoIGxpa2UKLSAqIHRoZSBzYTExMDAgb25lLCBidXQgaGFyZHdhcmUgdXNlcyBkaWZmZXJlbnQgZW5kcG9pbnQgbnVtYmVycy4KLSAqCi0gKiBPciB0aGUgTGludXggIkV0aGVybmV0IiBnYWRnZXQgb24gaGFyZHdhcmUgdGhhdCBjYW4ndCB0YWxrCi0gKiBDREMgRXRoZXJuZXQgKGUuZy4sIG5vIGFsdHNldHRpbmdzKSwgaW4gZWl0aGVyIG9mIHR3byBtb2RlczoKLSAqICAtIGFjdGluZyBqdXN0IGxpa2UgdGhlIG9sZCAidXNiLWV0aCIgZmlybXdhcmUsIHRob3VnaAotICogICAgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudCAKLSAqICAtIHN1cHBvcnRpbmcgUk5ESVMgYXMgdGhlIGZpcnN0L2RlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IKLSAqICAgIE1TLVdpbmRvd3MgaW50ZXJvcDsgTGludXggbmVlZHMgdG8gdXNlIHRoZSBvdGhlciBjb25maWcKLSAqLwotewotCS8vIDExODMgPSAweDA0OUYsIGJvdGggdXNlZCBhcyBoZXggdmFsdWVzPwotCS8vIENvbXBhcSAiSXRzeSIgdmVuZG9yL3Byb2R1Y3QgaWQKLQlVU0JfREVWSUNFICgweDA0OUYsIDB4NTA1QSksCS8vIHVzYi1ldGgsIG9yIGNvbXBhdGlibGUKLQkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmxpbnV4ZGV2X2luZm8sCi19LCB7Ci0JVVNCX0RFVklDRSAoMHgwRTdFLCAweDEwMDEpLAkvLyBHLk1hdGUgIllvcHkiCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZ5b3B5X2luZm8sCi19LCB7Ci0JVVNCX0RFVklDRSAoMHg4MDg2LCAweDA3ZDMpLAkvLyAiYmxvYiIgYm9vdGxvYWRlcgotCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmYmxvYl9pbmZvLAotfSwgewotCS8vIExpbnV4IEV0aGVybmV0L1JORElTIGdhZGdldCBvbiBweGEyMTAvMjV4LzI2eAotCS8vIGUuZy4gR3Vtc3RpeCwgY3VycmVudCBPcGVuWmF1cnVzLCAuLi4KLQlVU0JfREVWSUNFX1ZFUiAoMHgwNTI1LCAweGE0YTIsIDB4MDIwMywgMHgwMjAzKSwKLQkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmxpbnV4ZGV2X2luZm8sCi19LCAKLSNlbmRpZgotCi0jaWYJZGVmaW5lZChDT05GSUdfVVNCX1pBVVJVUykgfHwgZGVmaW5lZChDT05GSUdfVVNCX0NEQ0VUSEVSKQotLyoKLSAqIFNBLTExMDAgYmFzZWQgU2hhcnAgWmF1cnVzICgiY29sbGllIiksIG9yIGNvbXBhdGlibGUuCi0gKiBTYW1lIGlkZWEgYXMgYWJvdmUsIGJ1dCBkaWZmZXJlbnQgZnJhbWluZy4KLSAqCi0gKiBQWEEtMnh4IGJhc2VkIG1vZGVscyBhcmUgYWxzbyBseWluZy1hYm91dC1jZGMuCi0gKiBTb21lIG1vZGVscyBkb24ndCBldmVuIHRlbGwgdGhlIHNhbWUgbGllcyAuLi4KLSAqCi0gKiBOT1RFOiAgT3BlblphdXJ1cyB2ZXJzaW9ucyB3aXRoIDIuNiBrZXJuZWxzIHdvbid0IHVzZSB0aGVzZSBlbnRyaWVzLAotICogdW5saWtlIHRoZSBvbGRlciBvbmVzIHdpdGggMi40ICJlbWJlZGl4IiBrZXJuZWxzLgotICoKLSAqIE5PVEU6ICBUaGVzZSBlbnRyaWVzIGRvIGRvdWJsZS1kdXR5LCBzZXJ2aW5nIGFzIGJsYWNrbGlzdCBlbnRyaWVzCi0gKiB3aGVuZXZlciBaYXVydXMgc3VwcG9ydCBpc24ndCBlbmFibGVkLCBidXQgQ0RDIEV0aGVybmV0IGlzLgotICovCi0jZGVmaW5lCVpBVVJVU19NQVNURVJfSU5URVJGQUNFIFwKLQkuYkludGVyZmFjZUNsYXNzCT0gVVNCX0NMQVNTX0NPTU0sIFwKLQkuYkludGVyZmFjZVN1YkNsYXNzCT0gVVNCX0NEQ19TVUJDTEFTU19FVEhFUk5FVCwgXAotCS5iSW50ZXJmYWNlUHJvdG9jb2wJPSBVU0JfQ0RDX1BST1RPX05PTkUKLXsKLQkubWF0Y2hfZmxhZ3MJPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KLQkJCSAgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwgCi0JLmlkVmVuZG9yCQk9IDB4MDRERCwKLQkuaWRQcm9kdWN0CQk9IDB4ODAwNCwKLQlaQVVSVVNfTUFTVEVSX0lOVEVSRkFDRSwKLQkuZHJpdmVyX2luZm8gPSBaQVVSVVNfU1RST05HQVJNX0lORk8sCi19LCB7Ci0JLm1hdGNoX2ZsYWdzCT0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCi0JCQkgIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsIAotCS5pZFZlbmRvcgkJPSAweDA0REQsCi0JLmlkUHJvZHVjdAkJPSAweDgwMDUsCS8qIEEtMzAwICovCi0JWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCi0JLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAotfSwgewotCS5tYXRjaF9mbGFncwk9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTwotCQkJICB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLCAKLQkuaWRWZW5kb3IJCT0gMHgwNERELAotCS5pZFByb2R1Y3QJCT0gMHg4MDA2LAkvKiBCLTUwMC9TTC01NjAwICovCi0JWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCi0JLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAotfSwgewotCS5tYXRjaF9mbGFncyAgICA9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTwotCSAgICAgICAgICB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAotCS5pZFZlbmRvcgkJPSAweDA0REQsCi0JLmlkUHJvZHVjdAkJPSAweDgwMDcsCS8qIEMtNzAwICovCi0JWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCi0JLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAotfSwgewotCS5tYXRjaF9mbGFncyAgICA9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTwotCQkgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKLQkuaWRWZW5kb3IgICAgICAgICAgICAgICA9IDB4MDRERCwKLQkuaWRQcm9kdWN0ICAgICAgICAgICAgICA9IDB4OTAzMSwJLyogQy03NTAgQy03NjAgKi8KLQlaQVVSVVNfTUFTVEVSX0lOVEVSRkFDRSwKLQkuZHJpdmVyX2luZm8gPSBaQVVSVVNfUFhBX0lORk8sCi19LCB7Ci0JLm1hdGNoX2ZsYWdzICAgID0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCi0JCSB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAotCS5pZFZlbmRvciAgICAgICAgICAgICAgID0gMHgwNERELAotCS5pZFByb2R1Y3QgICAgICAgICAgICAgID0gMHg5MDMyLAkvKiBTTC02MDAwICovCi0JWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCi0JLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAotfSwgewotCS5tYXRjaF9mbGFncyAgICA9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTwotCQkgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKLQkuaWRWZW5kb3IgICAgICAgICAgICAgICA9IDB4MDRERCwKLQkvKiByZXBvcnRlZCB3aXRoIHNvbWUgQzg2MCB1bml0cyAqLwotCS5pZFByb2R1Y3QgICAgICAgICAgICAgID0gMHg5MDUwLAkvKiBDLTg2MCAqLwotCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAotCS5kcml2ZXJfaW5mbyA9IFpBVVJVU19QWEFfSU5GTywKLX0sCi0KLSNpZmRlZglDT05GSUdfVVNCX1pBVVJVUwotCS8qIEF0IGxlYXN0IHNvbWUgKHJlcG9ydHMgdmFyeSkgUFhBIHVuaXRzIGhhdmUgdmVyeSBkaWZmZXJlbnQgbGllcwotCSAqIGFib3V0IHRoZWlyIHN0YW5kYXJkcyBzdXBwb3J0OiAgdGhleSBjbGFpbSB0byBiZSBjZWxsIHBob25lcyB3aXRoCi0JICogZGlyZWN0IGFjY2VzcyB0byB0aGVpciByYWRpb3MuICAoVGhleSBkb24ndCBjb25mb3JtIHRvIENEQyBNRExNLikKLQkgKi8KLXsKLQlVU0JfSU5URVJGQUNFX0lORk8gKFVTQl9DTEFTU19DT01NLCBVU0JfQ0RDX1NVQkNMQVNTX01ETE0sCi0JCQlVU0JfQ0RDX1BST1RPX05PTkUpLAotCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYm9ndXNfbWRsbV9pbmZvLAotfSwKLSNlbmRpZgotCi0vKiBPbHltcHVzIGhhcyBzb21lIG1vZGVscyB3aXRoIGEgWmF1cnVzLWNvbXBhdGlibGUgb3B0aW9uLgotICogUi0xMDAwIHVzZXMgYSBGcmVlU2NhbGUgaS5NWEwgY3B1IChBUk12NFQpCi0gKi8KLXsKLQkubWF0Y2hfZmxhZ3MgICAgPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KLQkJIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCi0JLmlkVmVuZG9yICAgICAgICAgICAgICAgPSAweDA3QjQsCi0JLmlkUHJvZHVjdCAgICAgICAgICAgICAgPSAweDBGMDIsCS8qIFItMTAwMCAqLwotCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAotCS5kcml2ZXJfaW5mbyA9IE9MWU1QVVNfTVhMX0lORk8sCi19LAotI2VuZGlmCi0KLSNpZmRlZglDT05GSUdfVVNCX0NEQ0VUSEVSCi17Ci0JLyogQ0RDIEV0aGVyIHVzZXMgdHdvIGludGVyZmFjZXMsIG5vdCBuZWNlc3NhcmlseSBjb25zZWN1dGl2ZS4KLQkgKiBXZSBtYXRjaCB0aGUgbWFpbiBpbnRlcmZhY2UsIGlnbm9yaW5nIHRoZSBvcHRpb25hbCBkZXZpY2UKLQkgKiBjbGFzcyBzbyB3ZSBjb3VsZCBoYW5kbGUgZGV2aWNlcyB0aGF0IGFyZW4ndCBleGNsdXNpdmVseQotCSAqIENEQyBldGhlci4KLQkgKgotCSAqIE5PVEU6ICB0aGlzIG1hdGNoIG11c3QgY29tZSBBRlRFUiBlbnRyaWVzIHdvcmtpbmcgYXJvdW5kCi0JICogYnVncy9xdWlya3MgaW4gYSBnaXZlbiBwcm9kdWN0IChsaWtlIFphdXJ1cywgYWJvdmUpLgotCSAqLwotCVVTQl9JTlRFUkZBQ0VfSU5GTyAoVVNCX0NMQVNTX0NPTU0sIFVTQl9DRENfU1VCQ0xBU1NfRVRIRVJORVQsCi0JCQlVU0JfQ0RDX1BST1RPX05PTkUpLAotCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY2RjX2luZm8sCi19LAotI2VuZGlmCi0KLQl7IH0sCQkvLyBFTkQKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIHByb2R1Y3RzKTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYm5ldF9kcml2ZXIgPSB7Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLm5hbWUgPQkJZHJpdmVyX25hbWUsCi0JLmlkX3RhYmxlID0JcHJvZHVjdHMsCi0JLnByb2JlID0JdXNibmV0X3Byb2JlLAotCS5kaXNjb25uZWN0ID0JdXNibmV0X2Rpc2Nvbm5lY3QsCi0JLnN1c3BlbmQgPQl1c2JuZXRfc3VzcGVuZCwKLQkucmVzdW1lID0JdXNibmV0X3Jlc3VtZSwKLX07Ci0KLS8qIERlZmF1bHQgZXRodG9vbF9vcHMgYXNzaWduZWQuICBEZXZpY2VzIGNhbiBvdmVycmlkZSBpbiB0aGVpciBiaW5kKCkgcm91dGluZSAqLwotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB1c2JuZXRfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9kcnZpbmZvCQk9IHVzYm5ldF9nZXRfZHJ2aW5mbywKLQkuZ2V0X2xpbmsJCT0gdXNibmV0X2dldF9saW5rLAotCS5nZXRfbXNnbGV2ZWwJCT0gdXNibmV0X2dldF9tc2dsZXZlbCwKLQkuc2V0X21zZ2xldmVsCQk9IHVzYm5ldF9zZXRfbXNnbGV2ZWwsCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IF9faW5pdCB1c2JuZXRfaW5pdCAodm9pZCkKLXsKLQkvLyBjb21waWxlciBzaG91bGQgb3B0aW1pemUgdGhlc2Ugb3V0CisJLyogY29tcGlsZXIgc2hvdWxkIG9wdGltaXplIHRoaXMgb3V0ICovCiAJQlVHX09OIChzaXplb2YgKCgoc3RydWN0IHNrX2J1ZmYgKikwKS0+Y2IpCiAJCQk8IHNpemVvZiAoc3RydWN0IHNrYl9kYXRhKSk7Ci0jaWZkZWYJQ09ORklHX1VTQl9DRENFVEhFUgotCUJVR19PTiAoKHNpemVvZiAoKChzdHJ1Y3QgdXNibmV0ICopMCktPmRhdGEpCi0JCQk8IHNpemVvZiAoc3RydWN0IGNkY19zdGF0ZSkpKTsKLSNlbmRpZgogCiAJcmFuZG9tX2V0aGVyX2FkZHIobm9kZV9pZCk7Ci0KLSAJcmV0dXJuIHVzYl9yZWdpc3RlcigmdXNibmV0X2RyaXZlcik7CisgCXJldHVybiAwOwogfQotbW9kdWxlX2luaXQgKHVzYm5ldF9pbml0KTsKK21vZHVsZV9pbml0KHVzYm5ldF9pbml0KTsKIAotc3RhdGljIHZvaWQgX19leGl0IHVzYm5ldF9leGl0ICh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHVzYm5ldF9leGl0KHZvaWQpCiB7Ci0gCXVzYl9kZXJlZ2lzdGVyICgmdXNibmV0X2RyaXZlcik7CiB9Ci1tb2R1bGVfZXhpdCAodXNibmV0X2V4aXQpOworbW9kdWxlX2V4aXQodXNibmV0X2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SICgiRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04gKCJVU0IgSG9zdC10by1Ib3N0IExpbmsgRHJpdmVycyAobnVtZXJvdXMgdmVuZG9ycykiKTsKLU1PRFVMRV9MSUNFTlNFICgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBCcm93bmVsbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVU0IgbmV0d29yayBkcml2ZXIgZnJhbWV3b3JrIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmggYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhMGFiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuaApAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIFVTQiBOZXR3b3JraW5nIExpbmsgSW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgYnkgRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBEYXZpZCBIb2xsaXMgPGRob2xsaXNAZGF2ZWhvbGxpcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKworI2lmbmRlZglfX1VTQk5FVF9ICisjZGVmaW5lCV9fVVNCTkVUX0gKKworCisvKiBpbnRlcmZhY2UgZnJvbSB1c2JuZXQgY29yZSB0byBlYWNoIFVTQiBuZXR3b3JraW5nIGxpbmsgd2UgaGFuZGxlICovCitzdHJ1Y3QgdXNibmV0IHsKKwkvKiBob3VzZWtlZXBpbmcgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKKwlzdHJ1Y3QgZHJpdmVyX2luZm8JKmRyaXZlcl9pbmZvOworCXdhaXRfcXVldWVfaGVhZF90CSp3YWl0OworCisJLyogaS9vIGluZm86IHBpcGVzIGV0YyAqLworCXVuc2lnbmVkCQlpbiwgb3V0OworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqc3RhdHVzOworCXVuc2lnbmVkCQltYXhwYWNrZXQ7CisJc3RydWN0IHRpbWVyX2xpc3QJZGVsYXk7CisKKwkvKiBwcm90b2NvbC9pbnRlcmZhY2Ugc3RhdGUgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCWludAkJCW1zZ19lbmFibGU7CisJdW5zaWduZWQgbG9uZwkJZGF0YSBbNV07CisJdTMyCQkJeGlkOworCXUzMgkJCWhhcmRfbXR1OwkvKiBjb3VudCBhbnkgZXh0cmEgZnJhbWluZyAqLworCXNpemVfdAkJICAgICAgICByeF91cmJfc2l6ZTsgICAgLyogc2l6ZSBmb3IgcnggdXJicyAgKi8KKwlzdHJ1Y3QgbWlpX2lmX2luZm8JbWlpOworCisJLyogdmFyaW91cyBraW5kcyBvZiBwZW5kaW5nIGRyaXZlciB3b3JrICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZAlyeHE7CisJc3RydWN0IHNrX2J1ZmZfaGVhZAl0eHE7CisJc3RydWN0IHNrX2J1ZmZfaGVhZAlkb25lOworCXN0cnVjdCB1cmIJCSppbnRlcnJ1cHQ7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CWJoOworCisJc3RydWN0IHdvcmtfc3RydWN0CWtldmVudDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKyMJCWRlZmluZSBFVkVOVF9UWF9IQUxUCTAKKyMJCWRlZmluZSBFVkVOVF9SWF9IQUxUCTEKKyMJCWRlZmluZSBFVkVOVF9SWF9NRU1PUlkJMgorIwkJZGVmaW5lIEVWRU5UX1NUU19TUExJVAkzCisjCQlkZWZpbmUgRVZFTlRfTElOS19SRVNFVAk0Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfZHJpdmVyICpkcml2ZXJfb2Yoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJcmV0dXJuIHRvX3VzYl9kcml2ZXIoaW50Zi0+ZGV2LmRyaXZlcik7Cit9CisKKy8qIGludGVyZmFjZSBmcm9tIHRoZSBkZXZpY2UvZnJhbWluZyBsZXZlbCAibWluaWRyaXZlciIgdG8gY29yZSAqLworc3RydWN0IGRyaXZlcl9pbmZvIHsKKwljaGFyCQkqZGVzY3JpcHRpb247CisKKwlpbnQJCWZsYWdzOworLyogZnJhbWluZyBpcyBDREMgRXRoZXJuZXQsIG5vdCB3cml0aW5nIFpMUHMgKGh3IGlzc3VlcyksIG9yIG9wdGlvbmFsbHk6ICovCisjZGVmaW5lIEZMQUdfRlJBTUlOR19OQwkweDAwMDEJCS8qIGd1YXJkIGFnYWluc3QgZGV2aWNlIGRyb3BvdXRzICovCisjZGVmaW5lIEZMQUdfRlJBTUlOR19HTAkweDAwMDIJCS8qIGdlbmVsaW5rIGJhdGNoZXMgcGFja2V0cyAqLworI2RlZmluZSBGTEFHX0ZSQU1JTkdfWgkweDAwMDQJCS8qIHphdXJ1cyBhZGRzIGEgdHJhaWxlciAqLworI2RlZmluZSBGTEFHX0ZSQU1JTkdfUk4JMHgwMDA4CQkvKiBSTkRJUyBiYXRjaGVzLCBwbHVzIGh1Z2UgaGVhZGVyICovCisKKyNkZWZpbmUgRkxBR19OT19TRVRJTlQJMHgwMDEwCQkvKiBkZXZpY2UgY2FuJ3Qgc2V0X2ludGVyZmFjZSgpICovCisjZGVmaW5lIEZMQUdfRVRIRVIJMHgwMDIwCQkvKiBtYXliZSB1c2UgImV0aCVkIiBuYW1lcyAqLworCisjZGVmaW5lIEZMQUdfRlJBTUlOR19BWCAweDAwNDAgICAgICAgICAgLyogQVg4ODc3Mi8xNzggcGFja2V0cyAqLworCisJLyogaW5pdCBkZXZpY2UgLi4uIGNhbiBzbGVlcCwgb3IgY2F1c2UgcHJvYmUoKSBmYWlsdXJlICovCisJaW50CSgqYmluZCkoc3RydWN0IHVzYm5ldCAqLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKKworCS8qIGNsZWFudXAgZGV2aWNlIC4uLiBjYW4gc2xlZXAsIGJ1dCBjYW4ndCBmYWlsICovCisJdm9pZAkoKnVuYmluZCkoc3RydWN0IHVzYm5ldCAqLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKKworCS8qIHJlc2V0IGRldmljZSAuLi4gY2FuIHNsZWVwICovCisJaW50CSgqcmVzZXQpKHN0cnVjdCB1c2JuZXQgKik7CisKKwkvKiBzZWUgaWYgcGVlciBpcyBjb25uZWN0ZWQgLi4uIGNhbiBzbGVlcCAqLworCWludAkoKmNoZWNrX2Nvbm5lY3QpKHN0cnVjdCB1c2JuZXQgKik7CisKKwkvKiBmb3Igc3RhdHVzIHBvbGxpbmcgKi8KKwl2b2lkCSgqc3RhdHVzKShzdHJ1Y3QgdXNibmV0ICosIHN0cnVjdCB1cmIgKik7CisKKwkvKiBsaW5rIHJlc2V0IGhhbmRsaW5nLCBjYWxsZWQgZnJvbSBkZWZlcl9rZXZlbnQgKi8KKwlpbnQJKCpsaW5rX3Jlc2V0KShzdHJ1Y3QgdXNibmV0ICopOworCisJLyogZml4dXAgcnggcGFja2V0IChzdHJpcCBmcmFtaW5nKSAqLworCWludAkoKnJ4X2ZpeHVwKShzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCisJLyogZml4dXAgdHggcGFja2V0IChhZGQgZnJhbWluZykgKi8KKwlzdHJ1Y3Qgc2tfYnVmZgkqKCp0eF9maXh1cCkoc3RydWN0IHVzYm5ldCAqZGV2LAorCQkJCXN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGZsYWdzKTsKKworCS8qIGZvciBuZXcgZGV2aWNlcywgdXNlIHRoZSBkZXNjcmlwdG9yLXJlYWRpbmcgY29kZSBpbnN0ZWFkICovCisJaW50CQlpbjsJCS8qIHJ4IGVuZHBvaW50ICovCisJaW50CQlvdXQ7CQkvKiB0eCBlbmRwb2ludCAqLworCisJdW5zaWduZWQgbG9uZwlkYXRhOwkJLyogTWlzYyBkcml2ZXIgc3BlY2lmaWMgZGF0YSAqLworfTsKKworLyogTWluaWRyaXZlcnMgYXJlIGp1c3QgZHJpdmVycyB1c2luZyB0aGUgInVzYm5ldCIgY29yZSBhcyBhIHBvd2VyZnVsCisgKiBuZXR3b3JrLXNwZWNpZmljIHN1YnJvdXRpbmUgbGlicmFyeSAuLi4gdGhhdCBoYXBwZW5zIHRvIGRvIHByZXR0eQorICogbXVjaCBldmVyeXRoaW5nIGV4Y2VwdCBjdXN0b20gZnJhbWluZyBhbmQgY2hpcC1zcGVjaWZpYyBzdHVmZi4KKyAqLworZXh0ZXJuIGludCB1c2JuZXRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKik7CitleHRlcm4gaW50IHVzYm5ldF9zdXNwZW5kIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLCBwbV9tZXNzYWdlX3QgKTsKK2V4dGVybiBpbnQgdXNibmV0X3Jlc3VtZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKik7CitleHRlcm4gdm9pZCB1c2JuZXRfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKKworCisvKiBEcml2ZXJzIHRoYXQgcmV1c2Ugc29tZSBvZiB0aGUgc3RhbmRhcmQgVVNCIENEQyBpbmZyYXN0cnVjdHVyZQorICogKG5vdGFibHksIHVzaW5nIG11bHRpcGxlIGludGVyZmFjZXMgYWNjb3JkaW5nIHRvIHRoZSB0aGUgQ0RDCisgKiB1bmlvbiBkZXNjcmlwdG9yKSBnZXQgc29tZSBoZWxwZXIgY29kZS4KKyAqLworc3RydWN0IGNkY19zdGF0ZSB7CisJc3RydWN0IHVzYl9jZGNfaGVhZGVyX2Rlc2MJKmhlYWRlcjsKKwlzdHJ1Y3QgdXNiX2NkY191bmlvbl9kZXNjCSp1OworCXN0cnVjdCB1c2JfY2RjX2V0aGVyX2Rlc2MJKmV0aGVyOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlCQkqY29udHJvbDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkJKmRhdGE7Cit9OworCitleHRlcm4gaW50IHVzYm5ldF9nZW5lcmljX2NkY19iaW5kIChzdHJ1Y3QgdXNibmV0ICosIHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOworZXh0ZXJuIHZvaWQgdXNibmV0X2NkY191bmJpbmQgKHN0cnVjdCB1c2JuZXQgKiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKik7CisKKy8qIENEQyBhbmQgUk5ESVMgc3VwcG9ydCB0aGUgc2FtZSBob3N0LWNob3NlbiBwYWNrZXQgZmlsdGVycyBmb3IgSU4gdHJhbnNmZXJzICovCisjZGVmaW5lCURFRkFVTFRfRklMVEVSCShVU0JfQ0RDX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVCBcCisgCQkJfFVTQl9DRENfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVCBcCisgCQkJfFVTQl9DRENfUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVMgXAorIAkJCXxVU0JfQ0RDX1BBQ0tFVF9UWVBFX0RJUkVDVEVEKQorCisKKy8qIHdlIHJlY29yZCB0aGUgc3RhdGUgZm9yIGVhY2ggb2Ygb3VyIHF1ZXVlZCBza2JzICovCitlbnVtIHNrYl9zdGF0ZSB7CisJaWxsZWdhbCA9IDAsCisJdHhfc3RhcnQsIHR4X2RvbmUsCisJcnhfc3RhcnQsIHJ4X2RvbmUsIHJ4X2NsZWFudXAKK307CisKK3N0cnVjdCBza2JfZGF0YSB7CS8qIHNrYi0+Y2IgaXMgb25lIG9mIHRoZXNlICovCisJc3RydWN0IHVyYgkJKnVyYjsKKwlzdHJ1Y3QgdXNibmV0CQkqZGV2OworCWVudW0gc2tiX3N0YXRlCQlzdGF0ZTsKKwlzaXplX3QJCQlsZW5ndGg7Cit9OworCisKK2V4dGVybiBpbnQgdXNibmV0X2dldF9lbmRwb2ludHMoc3RydWN0IHVzYm5ldCAqLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKK2V4dGVybiB2b2lkIHVzYm5ldF9kZWZlcl9rZXZlbnQgKHN0cnVjdCB1c2JuZXQgKiwgaW50KTsKK2V4dGVybiB2b2lkIHVzYm5ldF9za2JfcmV0dXJuIChzdHJ1Y3QgdXNibmV0ICosIHN0cnVjdCBza19idWZmICopOworCitleHRlcm4gdTMyIHVzYm5ldF9nZXRfbXNnbGV2ZWwgKHN0cnVjdCBuZXRfZGV2aWNlICopOworZXh0ZXJuIHZvaWQgdXNibmV0X3NldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTMyKTsKK2V4dGVybiB2b2lkIHVzYm5ldF9nZXRfZHJ2aW5mbyAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqKTsKKworLyogbWVzc2FnaW5nIHN1cHBvcnQgaW5jbHVkZXMgdGhlIGludGVyZmFjZSBuYW1lLCBzbyBpdCBtdXN0IG5vdCBiZQorICogdXNlZCBiZWZvcmUgaXQgaGFzIG9uZSAuLi4gbm90YWJseSwgaW4gbWluaWRyaXZlciBiaW5kKCkgY2FsbHMuCisgKi8KKyNpZmRlZiBERUJVRworI2RlZmluZSBkZXZkYmcodXNibmV0LCBmbXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmbXQgIlxuIiAsICh1c2JuZXQpLT5uZXQtPm5hbWUgLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBkZXZkYmcodXNibmV0LCBmbXQsIGFyZy4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIGRldmVycih1c2JuZXQsIGZtdCwgYXJnLi4uKSBcCisJcHJpbnRrKEtFUk5fRVJSICIlczogIiBmbXQgIlxuIiAsICh1c2JuZXQpLT5uZXQtPm5hbWUgLCAjIyBhcmcpCisjZGVmaW5lIGRldndhcm4odXNibmV0LCBmbXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAiIGZtdCAiXG4iICwgKHVzYm5ldCktPm5ldC0+bmFtZSAsICMjIGFyZykKKworI2RlZmluZSBkZXZpbmZvKHVzYm5ldCwgZm10LCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9JTkZPICIlczogIiBmbXQgIlxuIiAsICh1c2JuZXQpLT5uZXQtPm5hbWUgLCAjIyBhcmcpOyBcCisKKworI2VuZGlmCS8qIF9fVVNCTkVUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC96YXVydXMuYyBiL2RyaXZlcnMvdXNiL25ldC96YXVydXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTNiODkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbmV0L3phdXJ1cy5jCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgYnkgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLy8gI2RlZmluZQlERUJVRwkJCS8vIGVycm9yIHBhdGggbWVzc2FnZXMsIGV4dHJhIGluZm8KKy8vICNkZWZpbmUJVkVSQk9TRQkJCS8vIG1vcmU7IHN1Y2Nlc3MgbWVzc2FnZXMKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmCUNPTkZJR19VU0JfREVCVUcKKyMgICBkZWZpbmUgREVCVUcKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl9jZGMuaD4KKworI2luY2x1ZGUgInVzYm5ldC5oIgorCisKKy8qCisgKiBBbGwga25vd24gWmF1cmlpIGxpZSBhYm91dCB0aGVpciBzdGFuZGFyZHMgY29uZm9ybWFuY2UuICBBdCBsZWFzdAorICogdGhlIGVhcmxpZXN0IFNBLTExMDAgbW9kZWxzIGxpZSBieSBzYXlpbmcgdGhleSBzdXBwb3J0IENEQyBFdGhlcm5ldC4KKyAqIFNvbWUgbGF0ZXIgbW9kZWxzIChlc3BlY2lhbGx5IFBYQS0yNXggYW5kIFBYQS0yN3ggYmFzZWQgb25lcykgbGllCisgKiBhbmQgc2F5IHRoZXkgc3VwcG9ydCBDREMgTURMTSAoZm9yIGFjY2VzcyB0byBjZWxsIHBob25lIG1vZGVtcykuCisgKgorICogVGhlcmUgYXJlIG5vbi1aYXVydXMgcHJvZHVjdHMgdGhhdCB1c2UgdGhlc2Ugc2FtZSBwcm90b2NvbHMgdG9vLgorICoKKyAqIFRoZSBhbm5veWluZyB0aGluZyBpcyB0aGF0IGF0IHRoZSBzYW1lIHRpbWUgU2hhcnAgd2FzIGRldmVsb3BpbmcKKyAqIHRoYXQgYW5ub3lpbmcgc3RhbmRhcmRzLWJyZWFraW5nIHNvZnR3YXJlLCB0aGUgTGludXggY29tbXVuaXR5IGhhZAorICogYSBzaW1wbGUgIkNEQyBTdWJzZXQiIHdvcmtpbmcgcmVsaWFibHkgb24gdGhlIHNhbWUgU0EtMTEwMCBoYXJkd2FyZS4KKyAqIFRoYXQgaXMsIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYnV0IG5vdCB2aW9sYXRpbmcgc3RhbmRhcmRzLgorICoKKyAqIFRoZSBDREMgRXRoZXJuZXQgbm9uY29uZm9ybWFuY2UgcG9pbnRzIGFyZSB0cm91Ymxlc29tZSB0byBob3N0cworICogd2l0aCBhIHRydWUgQ0RDIEV0aGVybmV0IGltcGxlbWVudGF0aW9uOgorICogICAtIEZyYW1pbmcgYXBwZW5kcyBhIENSQywgd2hpY2ggdGhlIHNwZWMgc2F5cyBkcml2ZXJzICJtdXN0IG5vdCIgZG87CisgKiAgIC0gVHJhbnNmZXJzIGRhdGEgaW4gYWx0c2V0dGluZyB6ZXJvLCBpbnN0ZWFkIG9mIGFsdHNldHRpbmcgMTsKKyAqICAgLSBBbGwgdGhlc2UgcGVyaXBoZXJhbHMgdXNlIHRoZSBzYW1lIGV0aGVybmV0IGFkZHJlc3MuCisgKgorICogVGhlIENEQyBNRExNIG5vbmNvbmZvcm1hbmNlIGlzIGxlc3MgaW1tZWRpYXRlbHkgdHJvdWJsZXNvbWUsIHNpbmNlIGFsbAorICogTURMTSBpbXBsZW1lbnRhdGlvbnMgYXJlIHF1YXNpLXByb3ByaWV0YXJ5IGFueXdheS4KKyAqLworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgoremF1cnVzX3R4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgZmxhZ3MpCit7CisJaW50CQkJcGFkbGVuOworCXN0cnVjdCBza19idWZmCQkqc2tiMjsKKworCXBhZGxlbiA9IDI7CisJaWYgKCFza2JfY2xvbmVkKHNrYikpIHsKKwkJaW50CXRhaWxyb29tID0gc2tiX3RhaWxyb29tKHNrYik7CisJCWlmICgocGFkbGVuICsgNCkgPD0gdGFpbHJvb20pCisJCQlnb3RvIGRvbmU7CisJfQorCXNrYjIgPSBza2JfY29weV9leHBhbmQoc2tiLCAwLCA0ICsgcGFkbGVuLCBmbGFncyk7CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlza2IgPSBza2IyOworCWlmIChza2IpIHsKKwkJdTMyCQlmY3M7Citkb25lOgorCQlmY3MgPSBjcmMzMl9sZSh+MCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWZjcyA9IH5mY3M7CisKKwkJKnNrYl9wdXQgKHNrYiwgMSkgPSBmY3MgICAgICAgJiAweGZmOworCQkqc2tiX3B1dCAoc2tiLCAxKSA9IChmY3M+PiA4KSAmIDB4ZmY7CisJCSpza2JfcHV0IChza2IsIDEpID0gKGZjcz4+MTYpICYgMHhmZjsKKwkJKnNrYl9wdXQgKHNrYiwgMSkgPSAoZmNzPj4yNCkgJiAweGZmOworCX0KKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW50IHphdXJ1c19iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJLyogQmVsY2FycmEncyBmdW5reSBmcmFtaW5nIGhhcyBvdGhlciBvcHRpb25zOyBtb3N0bHkKKwkgKiBUUkFJTEVSUyAoISkgd2l0aCA0IGJ5dGVzIENSQywgYW5kIG1heWJlIDIgcGFkIGJ5dGVzLgorCSAqLworCWRldi0+bmV0LT5oYXJkX2hlYWRlcl9sZW4gKz0gNjsKKwlkZXYtPnJ4X3VyYl9zaXplID0gZGV2LT5uZXQtPmhhcmRfaGVhZGVyX2xlbiArIGRldi0+bmV0LT5tdHU7CisJcmV0dXJuIHVzYm5ldF9nZW5lcmljX2NkY19iaW5kKGRldiwgaW50Zik7Cit9CisKKy8qIFBEQSBzdHlsZSBkZXZpY2VzIGFyZSBhbHdheXMgY29ubmVjdGVkIGlmIHByZXNlbnQgKi8KK3N0YXRpYyBpbnQgYWx3YXlzX2Nvbm5lY3RlZCAoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvCXphdXJ1c19zbDV4MDBfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiU2hhcnAgWmF1cnVzIFNMLTV4MDAiLAorCS5mbGFncyA9CUZMQUdfRlJBTUlOR19aLAorCS5jaGVja19jb25uZWN0ID0gYWx3YXlzX2Nvbm5lY3RlZCwKKwkuYmluZCA9CQl6YXVydXNfYmluZCwKKwkudW5iaW5kID0JdXNibmV0X2NkY191bmJpbmQsCisJLnR4X2ZpeHVwID0gCXphdXJ1c190eF9maXh1cCwKK307CisjZGVmaW5lCVpBVVJVU19TVFJPTkdBUk1fSU5GTwkoKHVuc2lnbmVkIGxvbmcpJnphdXJ1c19zbDV4MDBfaW5mbykKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwl6YXVydXNfcHhhX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0JIlNoYXJwIFphdXJ1cywgUFhBLTJ4eCBiYXNlZCIsCisJLmZsYWdzID0JRkxBR19GUkFNSU5HX1osCisJLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAorCS5iaW5kID0JCXphdXJ1c19iaW5kLAorCS51bmJpbmQgPQl1c2JuZXRfY2RjX3VuYmluZCwKKwkudHhfZml4dXAgPSAJemF1cnVzX3R4X2ZpeHVwLAorfTsKKyNkZWZpbmUJWkFVUlVTX1BYQV9JTkZPCQkoKHVuc2lnbmVkIGxvbmcpJnphdXJ1c19weGFfaW5mbykKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwlvbHltcHVzX214bF9pbmZvID0geworCS5kZXNjcmlwdGlvbiA9CSJPbHltcHVzIFIxMDAwIiwKKwkuZmxhZ3MgPQlGTEFHX0ZSQU1JTkdfWiwKKwkuY2hlY2tfY29ubmVjdCA9IGFsd2F5c19jb25uZWN0ZWQsCisJLmJpbmQgPQkJemF1cnVzX2JpbmQsCisJLnVuYmluZCA9CXVzYm5ldF9jZGNfdW5iaW5kLAorCS50eF9maXh1cCA9IAl6YXVydXNfdHhfZml4dXAsCit9OworI2RlZmluZQlPTFlNUFVTX01YTF9JTkZPCSgodW5zaWduZWQgbG9uZykmb2x5bXB1c19teGxfaW5mbykKKworCisvKiBTb21lIG1vcmUgcmVjZW50IHByb2R1Y3RzIHVzaW5nIExpbmVvL0JlbGNhcnJhIGNvZGUgd2lsbCB3cm9uZ2x5IGNsYWltCisgKiBDREMgTURMTSBjb25mb3JtYW5jZS4gIFRoZXkgYXJlbid0IGNvbmZvcm1hbnQ6ICBkYXRhIGVuZHBvaW50cyBsaXZlCisgKiBpbiB0aGUgY29udHJvbCBpbnRlcmZhY2UsIHRoZXJlJ3Mgbm8gZGF0YSBpbnRlcmZhY2UsIGFuZCBpdCdzIG5vdCB1c2VkCisgKiB0byB0YWxrIHRvIGEgY2VsbCBwaG9uZSByYWRpby4gIEJ1dCBhdCBsZWFzdCB3ZSBjYW4gZGV0ZWN0IHRoZXNlIHR3bworICogcHNldWRvLWNsYXNzZXMsIHJhdGhlciB0aGFuIGdyb3dpbmcgdGhpcyBwcm9kdWN0IGxpc3Qgd2l0aCBlbnRyaWVzIGZvcgorICogZWFjaCBuZXcgbm9uY29uZm9ybWFudCBwcm9kdWN0IChzaWdoKS4KKyAqLworc3RhdGljIGNvbnN0IHU4IHNhZmVfZ3VpZFsxNl0gPSB7CisJMHg1ZCwgMHgzNCwgMHhjZiwgMHg2NiwgMHgxMSwgMHgxOCwgMHgxMSwgMHhkNiwKKwkweGEyLCAweDFhLCAweDAwLCAweDAxLCAweDAyLCAweGNhLCAweDlhLCAweDdmLAorfTsKK3N0YXRpYyBjb25zdCB1OCBibGFuX2d1aWRbMTZdID0geworCTB4NzQsIDB4ZjAsIDB4M2QsIDB4YmQsIDB4MWUsIDB4YzEsIDB4NDQsIDB4NzAsCisJMHhhMywgMHg2NywgMHg3MSwgMHgzNCwgMHhjOSwgMHhmNSwgMHg1NCwgMHgzNywKK307CisKK3N0YXRpYyBpbnQgYmxhbl9tZGxtX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwl1OAkJCQkqYnVmID0gaW50Zi0+Y3VyX2FsdHNldHRpbmctPmV4dHJhOworCWludAkJCQlsZW4gPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZXh0cmFsZW47CisJc3RydWN0IHVzYl9jZGNfbWRsbV9kZXNjCSpkZXNjID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2NkY19tZGxtX2RldGFpbF9kZXNjCSpkZXRhaWwgPSBOVUxMOworCisJd2hpbGUgKGxlbiA+IDMpIHsKKwkJaWYgKGJ1ZiBbMV0gIT0gVVNCX0RUX0NTX0lOVEVSRkFDRSkKKwkJCWdvdG8gbmV4dF9kZXNjOworCisJCS8qIHVzZSBiRGVzY3JpcHRvclN1YlR5cGUsIGFuZCBqdXN0IHZlcmlmeSB0aGF0IHdlIGdldCBhCisJCSAqICJCTEFOIiAob3IgIlNBRkUiKSBkZXNjcmlwdG9yLgorCQkgKi8KKwkJc3dpdGNoIChidWYgWzJdKSB7CisJCWNhc2UgVVNCX0NEQ19NRExNX1RZUEU6CisJCQlpZiAoZGVzYykgeworCQkJCWRldl9kYmcoJmludGYtPmRldiwgImV4dHJhIE1ETE1cbiIpOworCQkJCWdvdG8gYmFkX2Rlc2M7CisJCQl9CisJCQlkZXNjID0gKHZvaWQgKikgYnVmOworCQkJaWYgKGRlc2MtPmJMZW5ndGggIT0gc2l6ZW9mICpkZXNjKSB7CisJCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiTURMTSBsZW4gJXVcbiIsCisJCQkJCWRlc2MtPmJMZW5ndGgpOworCQkJCWdvdG8gYmFkX2Rlc2M7CisJCQl9CisJCQkvKiBleHBlY3QgYmNkVmVyc2lvbiAxLjAsIGlnbm9yZSAqLworCQkJaWYgKG1lbWNtcCgmZGVzYy0+YkdVSUQsIGJsYW5fZ3VpZCwgMTYpCisJCQkJICAgICYmIG1lbWNtcCgmZGVzYy0+YkdVSUQsIHNhZmVfZ3VpZCwgMTYpICkgeworCQkJCS8qIGhleSwgdGhpcyBvbmUgbWlnaHQgX3JlYWxseV8gYmUgTURMTSEgKi8KKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJNRExNIGd1aWRcbiIpOworCQkJCWdvdG8gYmFkX2Rlc2M7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBVU0JfQ0RDX01ETE1fREVUQUlMX1RZUEU6CisJCQlpZiAoZGV0YWlsKSB7CisJCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiZXh0cmEgTURMTSBkZXRhaWxcbiIpOworCQkJCWdvdG8gYmFkX2Rlc2M7CisJCQl9CisJCQlkZXRhaWwgPSAodm9pZCAqKSBidWY7CisJCQlzd2l0Y2ggKGRldGFpbC0+Ykd1aWREZXNjcmlwdG9yVHlwZSkgeworCQkJY2FzZSAwOgkJCS8qICJTQUZFIiAqLworCQkJCWlmIChkZXRhaWwtPmJMZW5ndGggIT0gKHNpemVvZiAqZGV0YWlsICsgMikpCisJCQkJCWdvdG8gYmFkX2RldGFpbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToJCQkvKiAiQkxBTiIgKi8KKwkJCQlpZiAoZGV0YWlsLT5iTGVuZ3RoICE9IChzaXplb2YgKmRldGFpbCArIDMpKQorCQkJCQlnb3RvIGJhZF9kZXRhaWw7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gYmFkX2RldGFpbDsKKwkJCX0KKworCQkJLyogYXNzdW1pbmcgd2UgZWl0aGVyIG5vdGljZWQgQkxBTiBhbHJlYWR5LCBvciB3aWxsCisJCQkgKiBmaW5kIGl0IHNvb24sIHRoZXJlIGFyZSBzb21lIGRhdGEgYnl0ZXMgaGVyZToKKwkJCSAqICAtIGJtTmV0d29ya0NhcGFiaWxpdGllcyAodW51c2VkKQorCQkJICogIC0gYm1EYXRhQ2FwYWJpbGl0aWVzIChiaXRzLCBzZWUgYmVsb3cpCisJCQkgKiAgLSBiUGFkIChpZ25vcmVkLCBmb3IgUEFEQUZURVIgLS0gQkxBTi1vbmx5KQorCQkJICogYml0cyBhcmU6CisJCQkgKiAgLSAweDAxIC0tIFphdXJ1cyBmcmFtaW5nIChhZGQgQ1JDKQorCQkJICogIC0gMHgwMiAtLSBQQURCRUZPUkUgKENSQyBpbmNsdWRlcyBzb21lIHBhZGRpbmcpCisJCQkgKiAgLSAweDA0IC0tIFBBREFGVEVSIChzb21lIHBhZGRpbmcgYWZ0ZXIgQ1JDKQorCQkJICogIC0gMHgwOCAtLSAiZmVybWF0IiBwYWNrZXQgbWFuZ2xpbmcgKGZvciBodyBidWdzKQorCQkJICogdGhlIFBBREJFRk9SRSBhcHBlYXJzIG5vdCB0byBtYXR0ZXI7IHdlIGludGVyb3AKKwkJCSAqIHdpdGggZGV2aWNlcyB0aGF0IHVzZSBpdCBhbmQgdGhvc2UgdGhhdCBkb24ndC4KKwkJCSAqLworCQkJaWYgKChkZXRhaWwtPmJEZXRhaWxEYXRhWzFdICYgfjB4MDIpICE9IDB4MDEpIHsKKwkJCQkvKiBibURhdGFDYXBhYmlsaXRlcyA9PSAwIHdvdWxkIGJlIGZpbmUgdG9vLAorCQkJCSAqIGJ1dCBmcmFtaW5nIGlzIG1pbmlkcml2ZXItY291cGxlZCBmb3Igbm93LgorCQkJCSAqLworYmFkX2RldGFpbDoKKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsCisJCQkJCQkiYmFkIE1ETE0gZGV0YWlsLCAlZCAlZCAlZFxuIiwKKwkJCQkJCWRldGFpbC0+Ykxlbmd0aCwKKwkJCQkJCWRldGFpbC0+YkRldGFpbERhdGFbMF0sCisJCQkJCQlkZXRhaWwtPmJEZXRhaWxEYXRhWzJdKTsKKwkJCQlnb3RvIGJhZF9kZXNjOworCQkJfQorCQkJYnJlYWs7CisJCX0KK25leHRfZGVzYzoKKwkJbGVuIC09IGJ1ZiBbMF07CS8qIGJMZW5ndGggKi8KKwkJYnVmICs9IGJ1ZiBbMF07CisJfQorCisJaWYgKCFkZXNjIHx8ICFkZXRhaWwpIHsKKwkJZGV2X2RiZygmaW50Zi0+ZGV2LCAibWlzc2luZyBjZGMgbWRsbSAlcyVzZGVzY3JpcHRvclxuIiwKKwkJCWRlc2MgPyAiIiA6ICJmdW5jICIsCisJCQlkZXRhaWwgPyAiIiA6ICJkZXRhaWwgIik7CisJCWdvdG8gYmFkX2Rlc2M7CisJfQorCisJLyogVGhlcmUncyBwcm9iYWJseSBhIENEQyBFdGhlcm5ldCBkZXNjcmlwdG9yIHRoZXJlLCBidXQgd2UgY2FuJ3QKKwkgKiByZWx5IG9uIHRoZSBFdGhlcm5ldCBhZGRyZXNzIGl0IHByb3ZpZGVzIHNpbmNlIG5vdCBhbGwgdmVuZG9ycworCSAqIGJvdGhlciB0byBtYWtlIGl0IHVuaXF1ZS4gIExpa2V3aXNlIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gdHJhY2tpbmcKKwkgKiBvZiB0aGUgQ0RDIGV2ZW50IG5vdGlmaWNhdGlvbnMuCisJICovCisJcmV0dXJuIHVzYm5ldF9nZXRfZW5kcG9pbnRzKGRldiwgaW50Zik7CisKK2JhZF9kZXNjOgorCWRldl9pbmZvKCZkZXYtPnVkZXYtPmRldiwgInVuc3VwcG9ydGVkIE1ETE0gZGVzY3JpcHRvcnNcbiIpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvCWJvZ3VzX21kbG1faW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkicHNldWRvLU1ETE0gKEJMQU4pIGRldmljZSIsCisJLmZsYWdzID0JRkxBR19GUkFNSU5HX1osCisJLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAorCS50eF9maXh1cCA9IAl6YXVydXNfdHhfZml4dXAsCisJLmJpbmQgPQkJYmxhbl9tZGxtX2JpbmQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQJcHJvZHVjdHMgW10gPSB7CisjZGVmaW5lCVpBVVJVU19NQVNURVJfSU5URVJGQUNFIFwKKwkuYkludGVyZmFjZUNsYXNzCT0gVVNCX0NMQVNTX0NPTU0sIFwKKwkuYkludGVyZmFjZVN1YkNsYXNzCT0gVVNCX0NEQ19TVUJDTEFTU19FVEhFUk5FVCwgXAorCS5iSW50ZXJmYWNlUHJvdG9jb2wJPSBVU0JfQ0RDX1BST1RPX05PTkUKKworLyogU0EtMTEwMCBiYXNlZCBTaGFycCBaYXVydXMgKCJjb2xsaWUiKSwgb3IgY29tcGF0aWJsZS4gKi8KK3sKKwkubWF0Y2hfZmxhZ3MJPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KKwkJCSAgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkuaWRWZW5kb3IJCT0gMHgwNERELAorCS5pZFByb2R1Y3QJCT0gMHg4MDA0LAorCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAorCS5kcml2ZXJfaW5mbyA9IFpBVVJVU19TVFJPTkdBUk1fSU5GTywKK30sCisKKy8qIFBYQS0yeHggYmFzZWQgbW9kZWxzIGFyZSBhbHNvIGx5aW5nLWFib3V0LWNkYy4gIElmIHlvdSBhZGQgYW55CisgKiBtb3JlIGRldmljZXMgdGhhdCBjbGFpbSB0byBiZSBDREMgRXRoZXJuZXQsIG1ha2Ugc3VyZSB0aGV5IGdldAorICogYWRkZWQgdG8gdGhlIGJsYWNrbGlzdCBpbiBjZGNfZXRoZXIgdG9vLgorICoKKyAqIE5PVEU6ICBPcGVuWmF1cnVzIHZlcnNpb25zIHdpdGggMi42IGtlcm5lbHMgd29uJ3QgdXNlIHRoZXNlIGVudHJpZXMsCisgKiB1bmxpa2UgdGhlIG9sZGVyIG9uZXMgd2l0aCAyLjQgImVtYmVkaXgiIGtlcm5lbHMuCisgKi8KK3sKKwkubWF0Y2hfZmxhZ3MJPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KKwkJCSAgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkuaWRWZW5kb3IJCT0gMHgwNERELAorCS5pZFByb2R1Y3QJCT0gMHg4MDA1LAkvKiBBLTMwMCAqLworCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAorCS5kcml2ZXJfaW5mbyA9IFpBVVJVU19QWEFfSU5GTywKK30sIHsKKwkubWF0Y2hfZmxhZ3MJPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KKwkJCSAgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkuaWRWZW5kb3IJCT0gMHgwNERELAorCS5pZFByb2R1Y3QJCT0gMHg4MDA2LAkvKiBCLTUwMC9TTC01NjAwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAorfSwgeworCS5tYXRjaF9mbGFncyAgICA9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTworCSAgICAgICAgICB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCS5pZFZlbmRvcgkJPSAweDA0REQsCisJLmlkUHJvZHVjdAkJPSAweDgwMDcsCS8qIEMtNzAwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAorfSwgeworCS5tYXRjaF9mbGFncyAgICA9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTworCQkgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkuaWRWZW5kb3IgICAgICAgICAgICAgICA9IDB4MDRERCwKKwkuaWRQcm9kdWN0ICAgICAgICAgICAgICA9IDB4OTAzMSwJLyogQy03NTAgQy03NjAgKi8KKwlaQVVSVVNfTUFTVEVSX0lOVEVSRkFDRSwKKwkuZHJpdmVyX2luZm8gPSBaQVVSVVNfUFhBX0lORk8sCit9LCB7CisJLm1hdGNoX2ZsYWdzICAgID0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCisJCSB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCS5pZFZlbmRvciAgICAgICAgICAgICAgID0gMHgwNERELAorCS5pZFByb2R1Y3QgICAgICAgICAgICAgID0gMHg5MDMyLAkvKiBTTC02MDAwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAorfSwgeworCS5tYXRjaF9mbGFncyAgICA9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTworCQkgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkuaWRWZW5kb3IgICAgICAgICAgICAgICA9IDB4MDRERCwKKwkvKiByZXBvcnRlZCB3aXRoIHNvbWUgQzg2MCB1bml0cyAqLworCS5pZFByb2R1Y3QgICAgICAgICAgICAgID0gMHg5MDUwLAkvKiBDLTg2MCAqLworCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAorCS5kcml2ZXJfaW5mbyA9IFpBVVJVU19QWEFfSU5GTywKK30sCisKKworLyogQXQgbGVhc3Qgc29tZSBvZiB0aGUgbmV3ZXN0IFBYQSB1bml0cyBoYXZlIHZlcnkgZGlmZmVyZW50IGxpZXMgYWJvdXQKKyAqIHRoZWlyIHN0YW5kYXJkcyBzdXBwb3J0OiAgdGhleSBjbGFpbSB0byBiZSBjZWxsIHBob25lcyBvZmZlcmluZworICogZGlyZWN0IGFjY2VzcyB0byB0aGVpciByYWRpb3MhICAoTm8sIHRoZXkgZG9uJ3QgY29uZm9ybSB0byBDREMgTURMTS4pCisgKi8KK3sKKwlVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX0NPTU0sIFVTQl9DRENfU1VCQ0xBU1NfTURMTSwKKwkJCVVTQl9DRENfUFJPVE9fTk9ORSksCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZib2d1c19tZGxtX2luZm8sCit9LAorCisvKiBPbHltcHVzIGhhcyBzb21lIG1vZGVscyB3aXRoIGEgWmF1cnVzLWNvbXBhdGlibGUgb3B0aW9uLgorICogUi0xMDAwIHVzZXMgYSBGcmVlU2NhbGUgaS5NWEwgY3B1IChBUk12NFQpCisgKi8KK3sKKwkubWF0Y2hfZmxhZ3MgICAgPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KKwkJIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCisJLmlkVmVuZG9yICAgICAgICAgICAgICAgPSAweDA3QjQsCisJLmlkUHJvZHVjdCAgICAgICAgICAgICAgPSAweDBGMDIsCS8qIFItMTAwMCAqLworCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAorCS5kcml2ZXJfaW5mbyA9IE9MWU1QVVNfTVhMX0lORk8sCit9LAorCXsgfSwJCS8vIEVORAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB6YXVydXNfZHJpdmVyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJ6YXVydXMiLAorCS5pZF90YWJsZSA9CXByb2R1Y3RzLAorCS5wcm9iZSA9CXVzYm5ldF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYm5ldF9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0JdXNibmV0X3N1c3BlbmQsCisJLnJlc3VtZSA9CXVzYm5ldF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB6YXVydXNfaW5pdCh2b2lkKQoreworIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZ6YXVydXNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHphdXJ1c19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHphdXJ1c19leGl0KHZvaWQpCit7CisgCXVzYl9kZXJlZ2lzdGVyKCZ6YXVydXNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHphdXJ1c19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUGF2ZWwgTWFjaGVrLCBEYXZpZCBCcm93bmVsbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaGFycCBaYXVydXMgUERBLCBhbmQgY29tcGF0aWJsZSBwcm9kdWN0cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3pkMTIwMS5jIGIvZHJpdmVycy91c2IvbmV0L3pkMTIwMS5jCmluZGV4IGUzMmE4MGIuLmM0ZTQ3OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC96ZDEyMDEuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvemQxMjAxLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGllZWU4MDJfMTEuaD4KKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CiAjaW5jbHVkZSAiemQxMjAxLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB6ZDEyMDFfdGFibGVbXSA9IHsKQEAgLTMzOCwyNCArMzM4LDI0IEBACiAJCQlnb3RvIHJlc3VibWl0OwogCQl9CiAJCQkKLQkJaWYgKChzZXEgJiBJRUVFODAyXzExX1NDVExfRlJBRykgfHwKLQkJICAgIChmYyAmIElFRUU4MDJfMTFfRkNUTF9NT1JFRlJBR1MpKSB7CisJCWlmICgoc2VxICYgSUVFRTgwMjExX1NDVExfRlJBRykgfHwKKwkJICAgIChmYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykpIHsKIAkJCXN0cnVjdCB6ZDEyMDFfZnJhZyAqZnJhZyA9IE5VTEw7CiAJCQljaGFyICpwdHI7CiAKIAkJCWlmIChkYXRhbGVuPDE0KQogCQkJCWdvdG8gcmVzdWJtaXQ7Ci0JCQlpZiAoKHNlcSAmIElFRUU4MDJfMTFfU0NUTF9GUkFHKSA9PSAwKSB7CisJCQlpZiAoKHNlcSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpID09IDApIHsKIAkJCQlmcmFnID0ga21hbGxvYyhzaXplb2YoKmZyYWcpLCBHRlBfQVRPTUlDKTsKIAkJCQlpZiAoIWZyYWcpCiAJCQkJCWdvdG8gcmVzdWJtaXQ7Ci0JCQkJc2tiID0gZGV2X2FsbG9jX3NrYihJRUVFODAyXzExX0RBVEFfTEVOICsxNCsyKTsKKwkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKElFRUU4MDIxMV9EQVRBX0xFTiArMTQrMik7CiAJCQkJaWYgKCFza2IpIHsKIAkJCQkJa2ZyZWUoZnJhZyk7CiAJCQkJCWdvdG8gcmVzdWJtaXQ7CiAJCQkJfQogCQkJCWZyYWctPnNrYiA9IHNrYjsKLQkJCQlmcmFnLT5zZXEgPSBzZXEgJiBJRUVFODAyXzExX1NDVExfU0VROworCQkJCWZyYWctPnNlcSA9IHNlcSAmIElFRUU4MDIxMV9TQ1RMX1NFUTsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwogCQkJCW1lbWNweShza2JfcHV0KHNrYiwgMTIpLCAmZGF0YVtkYXRhbGVuLTE0XSwgMTIpOwogCQkJCW1lbWNweShza2JfcHV0KHNrYiwgMiksICZkYXRhWzZdLCAyKTsKQEAgLTM2NCw3ICszNjQsNyBAQAogCQkJCWdvdG8gcmVzdWJtaXQ7CiAJCQl9CiAJCQlobGlzdF9mb3JfZWFjaF9lbnRyeShmcmFnLCBub2RlLCAmemQtPmZyYWdsaXN0LCBmbm9kZSkKLQkJCQlpZihmcmFnLT5zZXEgPT0gKHNlcSZJRUVFODAyXzExX1NDVExfU0VRKSkKKwkJCQlpZihmcmFnLT5zZXEgPT0gKHNlcSZJRUVFODAyMTFfU0NUTF9TRVEpKQogCQkJCQlicmVhazsKIAkJCWlmICghZnJhZykKIAkJCQlnb3RvIHJlc3VibWl0OwpAQCAtMzcyLDcgKzM3Miw3IEBACiAJCQlwdHIgPSBza2JfcHV0KHNrYiwgbGVuKTsKIAkJCWlmIChwdHIpCiAJCQkJbWVtY3B5KHB0ciwgZGF0YSs4LCBsZW4pOwotCQkJaWYgKGZjICYgSUVFRTgwMl8xMV9GQ1RMX01PUkVGUkFHUykKKwkJCWlmIChmYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykKIAkJCQlnb3RvIHJlc3VibWl0OwogCQkJaGxpc3RfZGVsX2luaXQoJmZyYWctPmZub2RlKTsKIAkJCWtmcmVlKGZyYWcpOwpAQCAtODQ3LDcgKzg0Nyw2IEBACiAJCXJldHVybjsKIAlkZXZfd2FybigmemQtPnVzYi0+ZGV2LCAiJXM6IFRYIHRpbWVvdXQsIHNob290aW5nIGRvd24gdXJiXG4iLAogCSAgICBkZXYtPm5hbWUpOwotCXpkLT50eF91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAJdXNiX3VubGlua191cmIoemQtPnR4X3VyYik7CiAJemQtPnN0YXRzLnR4X2Vycm9ycysrOwogCS8qIFJlc3RhcnQgdGhlIHRpbWVvdXQgdG8gcXVpZXQgdGhlIHdhdGNoZG9nOiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKaW5kZXggMDEyZTYzZS4uMDVjNDRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCkBAIC00NTMsOCArNDUzLDggQEAKIAlwcml2LT5jYnJfbWFzayA9IEIzMDA7CiAJdXNiX3NldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSwgcHJpdik7CiAJCi0JcmV0dXJuICgwKTsJCi19CQorCXJldHVybiAwOworfQogCiAKIHN0YXRpYyBpbnQgY3lwcmVzc19lYXJ0aG1hdGVfc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKQEAgLTQ2NCwxNCArNDY0LDE1IEBACiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKIAlpZiAoZ2VuZXJpY19zdGFydHVwKHNlcmlhbCkpIHsKLQkJZGJnKCIlcyAtIEZhaWxlZCBzZXR0aW5nIHVwIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHNlcmlhbC0+cG9ydFswXS0+bnVtYmVyKTsKKwkJZGJnKCIlcyAtIEZhaWxlZCBzZXR0aW5nIHVwIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sCisJCQkJc2VyaWFsLT5wb3J0WzBdLT5udW1iZXIpOwogCQlyZXR1cm4gMTsKIAl9CiAKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7CiAJcHJpdi0+Y2hpcHR5cGUgPSBDVF9FQVJUSE1BVEU7Ci0JCi0JcmV0dXJuICgwKTsJCisKKwlyZXR1cm4gMDsKIH0gLyogY3lwcmVzc19lYXJ0aG1hdGVfc3RhcnR1cCAqLwogCiAKQEAgLTQ4MiwxNCArNDgzLDE1IEBACiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKIAlpZiAoZ2VuZXJpY19zdGFydHVwKHNlcmlhbCkpIHsKLQkJZGJnKCIlcyAtIEZhaWxlZCBzZXR0aW5nIHVwIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHNlcmlhbC0+cG9ydFswXS0+bnVtYmVyKTsKKwkJZGJnKCIlcyAtIEZhaWxlZCBzZXR0aW5nIHVwIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sCisJCQkJc2VyaWFsLT5wb3J0WzBdLT5udW1iZXIpOwogCQlyZXR1cm4gMTsKIAl9CiAKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7CiAJcHJpdi0+Y2hpcHR5cGUgPSBDVF9DWVBISURDT007CiAJCi0JcmV0dXJuICgwKTsJCisJcmV0dXJuIDA7CiB9IC8qIGN5cHJlc3NfaGlkY29tX3N0YXJ0dXAgKi8KIAogCkBAIC05MDksNyArOTExLDggQEAKIH0gLyogY3lwcmVzc19pb2N0bCAqLwogCiAKLXN0YXRpYyB2b2lkIGN5cHJlc3Nfc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3N0YXRpYyB2b2lkIGN5cHJlc3Nfc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCXN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CkBAIC05MTgsNyArOTIxLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCV9fdTggb2xkbGluZXM7CiAJaW50IGxpbmVjaGFuZ2UgPSAwOwotCQorCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CiAKIAl0dHkgPSBwb3J0LT50dHk7CkBAIC05MzEsMTAgKzkzNCwxMiBAQAogCWlmICghcHJpdi0+dGVybWlvc19pbml0aWFsaXplZCkgewogCQlpZiAocHJpdi0+Y2hpcHR5cGUgPT0gQ1RfRUFSVEhNQVRFKSB7CiAJCQkqKHR0eS0+dGVybWlvcykgPSB0dHlfc3RkX3Rlcm1pb3M7Ci0JCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBCNDgwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBCNDgwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfAorCQkJCUNMT0NBTDsKIAkJfSBlbHNlIGlmIChwcml2LT5jaGlwdHlwZSA9PSBDVF9DWVBISURDT00pIHsKIAkJCSoodHR5LT50ZXJtaW9zKSA9IHR0eV9zdGRfdGVybWlvczsKLQkJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwkJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8CisJCQkJQ0xPQ0FMOwogCQl9CiAJCXByaXYtPnRlcm1pb3NfaW5pdGlhbGl6ZWQgPSAxOwogCX0KQEAgLTk0NiwxMiArOTUxLDE1IEBACiAJLyogY2hlY2sgaWYgdGhlcmUgYXJlIG5ldyBzZXR0aW5ncyAqLwogCWlmIChvbGRfdGVybWlvcykgewogCQlpZiAoKGNmbGFnICE9IG9sZF90ZXJtaW9zLT5jX2NmbGFnKSB8fAotCQkgICAgKFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAhPSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKSB7Ci0JCQlkYmcoIiVzIC0gYXR0ZW1wdGluZyB0byBzZXQgbmV3IHRlcm1pb3Mgc2V0dGluZ3MiLCBfX0ZVTkNUSU9OX18pOwotCQkJLyogc2hvdWxkIG1ha2UgYSBjb3B5IG9mIHRoaXMgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZyBpbiB0aGUgZnVuY3Rpb24sIHdlIGNhbiByZXN0b3JlIGl0ICovCisJCQkoUkVMRVZBTlRfSUZMQUcoaWZsYWcpICE9CisJCQkgUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgeworCQkJZGJnKCIlcyAtIGF0dGVtcHRpbmcgdG8gc2V0IG5ldyB0ZXJtaW9zIHNldHRpbmdzIiwKKwkJCQkJX19GVU5DVElPTl9fKTsKKwkJCS8qIHNob3VsZCBtYWtlIGEgY29weSBvZiB0aGlzIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMKKwkJCSAqIHdyb25nIGluIHRoZSBmdW5jdGlvbiwgd2UgY2FuIHJlc3RvcmUgaXQgKi8KIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCQlwcml2LT50bXBfdGVybWlvcyA9ICoodHR5LT50ZXJtaW9zKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsgCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCX0gZWxzZSB7CiAJCQlkYmcoIiVzIC0gbm90aGluZyB0byBkbywgZXhpdGluZyIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm47CkBAIC05NjIsMjEgKzk3MCwzNCBAQAogCS8qIHNldCBudW1iZXIgb2YgZGF0YSBiaXRzLCBwYXJpdHksIHN0b3AgYml0cyAqLwogCS8qIHdoZW4gcGFyaXR5IGlzIGRpc2FibGVkIHRoZSBwYXJpdHkgdHlwZSBiaXQgaXMgaWdub3JlZCAqLwogCi0Jc3RvcF9iaXRzID0gY2ZsYWcgJiBDU1RPUEIgPyAxIDogMDsgLyogMSBtZWFucyAyIHN0b3AgYml0cywgMCBtZWFucyAxIHN0b3AgYml0ICovCi0JCisJLyogMSBtZWFucyAyIHN0b3AgYml0cywgMCBtZWFucyAxIHN0b3AgYml0ICovCisJc3RvcF9iaXRzID0gY2ZsYWcgJiBDU1RPUEIgPyAxIDogMDsKKwogCWlmIChjZmxhZyAmIFBBUkVOQikgewogCQlwYXJpdHlfZW5hYmxlID0gMTsKLQkJcGFyaXR5X3R5cGUgPSBjZmxhZyAmIFBBUk9ERCA/IDEgOiAwOyAvKiAxIG1lYW5zIG9kZCBwYXJpdHksIDAgbWVhbnMgZXZlbiBwYXJpdHkgKi8KKwkJLyogMSBtZWFucyBvZGQgcGFyaXR5LCAwIG1lYW5zIGV2ZW4gcGFyaXR5ICovCisJCXBhcml0eV90eXBlID0gY2ZsYWcgJiBQQVJPREQgPyAxIDogMDsKIAl9IGVsc2UKIAkJcGFyaXR5X2VuYWJsZSA9IHBhcml0eV90eXBlID0gMDsKIAogCWlmIChjZmxhZyAmIENTSVpFKSB7CiAJCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgewotCQkJY2FzZSBDUzU6IGRhdGFfYml0cyA9IDA7IGJyZWFrOwotCQkJY2FzZSBDUzY6IGRhdGFfYml0cyA9IDE7IGJyZWFrOwotCQkJY2FzZSBDUzc6IGRhdGFfYml0cyA9IDI7IGJyZWFrOwotCQkJY2FzZSBDUzg6IGRhdGFfYml0cyA9IDM7IGJyZWFrOwotCQkJZGVmYXVsdDogZXJyKCIlcyAtIENTSVpFIHdhcyBzZXQsIGJ1dCBub3QgQ1M1LUNTOCIsIF9fRlVOQ1RJT05fXyk7IGRhdGFfYml0cyA9IDM7CisJCQljYXNlIENTNToKKwkJCQlkYXRhX2JpdHMgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBDUzY6CisJCQkJZGF0YV9iaXRzID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1M3OgorCQkJCWRhdGFfYml0cyA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIENTODoKKwkJCQlkYXRhX2JpdHMgPSAzOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQllcnIoIiVzIC0gQ1NJWkUgd2FzIHNldCwgYnV0IG5vdCBDUzUtQ1M4IiwKKwkJCQkJCV9fRlVOQ1RJT05fXyk7CisJCQkJZGF0YV9iaXRzID0gMzsKIAkJfQogCX0gZWxzZQogCQlkYXRhX2JpdHMgPSAzOwpAQCAtOTkxLDYzICsxMDEyLDg1IEBACiAJfSBlbHNlIHsKIAkJYmF1ZF9tYXNrID0gKGNmbGFnICYgQ0JBVUQpOwogCQlzd2l0Y2goYmF1ZF9tYXNrKSB7Ci0JCQljYXNlIEIzMDA6IGRiZygiJXMgLSBzZXR0aW5nIGJhdWQgMzAwYnBzIiwgX19GVU5DVElPTl9fKTsgYnJlYWs7Ci0JCQljYXNlIEI2MDA6IGRiZygiJXMgLSBzZXR0aW5nIGJhdWQgNjAwYnBzIiwgX19GVU5DVElPTl9fKTsgYnJlYWs7Ci0JCQljYXNlIEIxMjAwOiBkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDEyMDBicHMiLCBfX0ZVTkNUSU9OX18pOyBicmVhazsKLQkJCWNhc2UgQjI0MDA6IGRiZygiJXMgLSBzZXR0aW5nIGJhdWQgMjQwMGJwcyIsIF9fRlVOQ1RJT05fXyk7IGJyZWFrOwotCQkJY2FzZSBCNDgwMDogZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCA0ODAwYnBzIiwgX19GVU5DVElPTl9fKTsgYnJlYWs7Ci0JCQljYXNlIEI5NjAwOiBkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDk2MDBicHMiLCBfX0ZVTkNUSU9OX18pOyBicmVhazsKLQkJCWNhc2UgQjE5MjAwOiBkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDE5MjAwYnBzIiwgX19GVU5DVElPTl9fKTsgYnJlYWs7Ci0JCQljYXNlIEIzODQwMDogZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCAzODQwMGJwcyIsIF9fRlVOQ1RJT05fXyk7IGJyZWFrOwotCQkJY2FzZSBCNTc2MDA6IGRiZygiJXMgLSBzZXR0aW5nIGJhdWQgNTc2MDBicHMiLCBfX0ZVTkNUSU9OX18pOyBicmVhazsKLQkJCWNhc2UgQjExNTIwMDogZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCAxMTUyMDBicHMiLCBfX0ZVTkNUSU9OX18pOyBicmVhazsKLQkJCWRlZmF1bHQ6IGRiZygiJXMgLSB1bmtub3duIG1hc2tlZCBiYXVkIHJhdGUiLCBfX0ZVTkNUSU9OX18pOworCQkJY2FzZSBCMzAwOgorCQkJCWRiZygiJXMgLSBzZXR0aW5nIGJhdWQgMzAwYnBzIiwgX19GVU5DVElPTl9fKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQjYwMDoKKwkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDYwMGJwcyIsIF9fRlVOQ1RJT05fXyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEIxMjAwOgorCQkJCWRiZygiJXMgLSBzZXR0aW5nIGJhdWQgMTIwMGJwcyIsIF9fRlVOQ1RJT05fXyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEIyNDAwOgorCQkJCWRiZygiJXMgLSBzZXR0aW5nIGJhdWQgMjQwMGJwcyIsIF9fRlVOQ1RJT05fXyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEI0ODAwOgorCQkJCWRiZygiJXMgLSBzZXR0aW5nIGJhdWQgNDgwMGJwcyIsIF9fRlVOQ1RJT05fXyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEI5NjAwOgorCQkJCWRiZygiJXMgLSBzZXR0aW5nIGJhdWQgOTYwMGJwcyIsIF9fRlVOQ1RJT05fXyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEIxOTIwMDoKKwkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDE5MjAwYnBzIiwgX19GVU5DVElPTl9fKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQjM4NDAwOgorCQkJCWRiZygiJXMgLSBzZXR0aW5nIGJhdWQgMzg0MDBicHMiLCBfX0ZVTkNUSU9OX18pOworCQkJCWJyZWFrOworCQkJY2FzZSBCNTc2MDA6CisJCQkJZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCA1NzYwMGJwcyIsIF9fRlVOQ1RJT05fXyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEIxMTUyMDA6CisJCQkJZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCAxMTUyMDBicHMiLCBfX0ZVTkNUSU9OX18pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkYmcoIiVzIC0gdW5rbm93biBtYXNrZWQgYmF1ZCByYXRlIiwgX19GVU5DVElPTl9fKTsKIAkJfQogCQlwcml2LT5saW5lX2NvbnRyb2wgPSAoQ09OVFJPTF9EVFIgfCBDT05UUk9MX1JUUyk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkKLQlkYmcoIiVzIC0gc2VuZGluZyAlZCBzdG9wX2JpdHMsICVkIHBhcml0eV9lbmFibGUsICVkIHBhcml0eV90eXBlLCAlZCBkYXRhX2JpdHMgKCs1KSIsIF9fRlVOQ1RJT05fXywKLQkgICAgc3RvcF9iaXRzLCBwYXJpdHlfZW5hYmxlLCBwYXJpdHlfdHlwZSwgZGF0YV9iaXRzKTsKIAotCWN5cHJlc3Nfc2VyaWFsX2NvbnRyb2wocG9ydCwgYmF1ZF9tYXNrLCBkYXRhX2JpdHMsIHN0b3BfYml0cywgcGFyaXR5X2VuYWJsZSwKLQkJCSAgICAgICBwYXJpdHlfdHlwZSwgMCwgQ1lQUkVTU19TRVRfQ09ORklHKTsKKwlkYmcoIiVzIC0gc2VuZGluZyAlZCBzdG9wX2JpdHMsICVkIHBhcml0eV9lbmFibGUsICVkIHBhcml0eV90eXBlLCAiCisJCQkiJWQgZGF0YV9iaXRzICgrNSkiLCBfX0ZVTkNUSU9OX18sIHN0b3BfYml0cywKKwkJCXBhcml0eV9lbmFibGUsIHBhcml0eV90eXBlLCBkYXRhX2JpdHMpOwogCi0JLyogd2UgcGVyZm9ybSBhIENZUFJFU1NfR0VUX0NPTkZJRyBzbyB0aGF0IHRoZSBjdXJyZW50IHNldHRpbmdzIGFyZSBmaWxsZWQgaW50byB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAgICAgICAgICogdGhpcyBzaG91bGQgY29uZmlybSB0aGF0IGFsbCBpcyB3b3JraW5nIGlmIGl0IHJldHVybnMgd2hhdCB3ZSBqdXN0IHNldCAqLworCWN5cHJlc3Nfc2VyaWFsX2NvbnRyb2wocG9ydCwgYmF1ZF9tYXNrLCBkYXRhX2JpdHMsIHN0b3BfYml0cywKKwkJCXBhcml0eV9lbmFibGUsIHBhcml0eV90eXBlLCAwLCBDWVBSRVNTX1NFVF9DT05GSUcpOworCisJLyogd2UgcGVyZm9ybSBhIENZUFJFU1NfR0VUX0NPTkZJRyBzbyB0aGF0IHRoZSBjdXJyZW50IHNldHRpbmdzIGFyZQorCSAqIGZpbGxlZCBpbnRvIHRoZSBwcml2YXRlIHN0cnVjdHVyZSB0aGlzIHNob3VsZCBjb25maXJtIHRoYXQgYWxsIGlzCisJICogd29ya2luZyBpZiBpdCByZXR1cm5zIHdoYXQgd2UganVzdCBzZXQgKi8KIAljeXByZXNzX3NlcmlhbF9jb250cm9sKHBvcnQsIDAsIDAsIDAsIDAsIDAsIDAsIENZUFJFU1NfR0VUX0NPTkZJRyk7CiAKLQkvKiBIZXJlIHdlIGNhbiBkZWZpbmUgY3VzdG9tIHR0eSBzZXR0aW5ncyBmb3IgZGV2aWNlcwotICAgICAgICAgKgotICAgICAgICAgKiB0aGUgbWFpbiB0dHkgdGVybWlvcyBmbGFnIGJhc2UgY29tZXMgZnJvbSBlbXBlZy5jCi0gICAgICAgICAqLworCS8qIEhlcmUgd2UgY2FuIGRlZmluZSBjdXN0b20gdHR5IHNldHRpbmdzIGZvciBkZXZpY2VzOyB0aGUgbWFpbiB0dHkKKwkgKiB0ZXJtaW9zIGZsYWcgYmFzZSBjb21lcyBmcm9tIGVtcGVnLmMgKi8KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CQorCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKCAocHJpdi0+Y2hpcHR5cGUgPT0gQ1RfRUFSVEhNQVRFKSAmJiAocHJpdi0+YmF1ZF9yYXRlID09IDQ4MDApICkgewotCi0JCWRiZygiVXNpbmcgY3VzdG9tIHRlcm1pb3Mgc2V0dGluZ3MgZm9yIGEgYmF1ZCByYXRlIG9mIDQ4MDBicHMuIik7CisJCWRiZygiVXNpbmcgY3VzdG9tIHRlcm1pb3Mgc2V0dGluZ3MgZm9yIGEgYmF1ZCByYXRlIG9mICIKKwkJCQkiNDgwMGJwcy4iKTsKIAkJLyogZGVmaW5lIGN1c3RvbSB0ZXJtaW9zIHNldHRpbmdzIGZvciBOTUVBIHByb3RvY29sICovCiAKIAkJdHR5LT50ZXJtaW9zLT5jX2lmbGFnIC8qIGlucHV0IG1vZGVzIC0gKi8KLQkJCSY9IH4oSUdOQlJLCQkvKiBkaXNhYmxlIGlnbm9yZSBicmVhayAqLwotCQkJfCBCUktJTlQJCS8qIGRpc2FibGUgYnJlYWsgY2F1c2VzIGludGVycnVwdCAqLwotCQkJfCBQQVJNUksJCS8qIGRpc2FibGUgbWFyayBwYXJpdHkgZXJyb3JzICovCi0JCQl8IElTVFJJUAkJLyogZGlzYWJsZSBjbGVhciBoaWdoIGJpdCBvZiBpbnB1dCBjaGFyYWN0ZXJzICovCi0JCQl8IElOTENSCQkJLyogZGlzYWJsZSB0cmFuc2xhdGUgTkwgdG8gQ1IgKi8KLQkJCXwgSUdOQ1IJCQkvKiBkaXNhYmxlIGlnbm9yZSBDUiAqLwotCQkJfCBJQ1JOTAkJCS8qIGRpc2FibGUgdHJhbnNsYXRlIENSIHRvIE5MICovCi0JCQl8IElYT04pOwkJLyogZGlzYWJsZSBlbmFibGUgWE9OL1hPRkYgZmxvdyBjb250cm9sICovCi0JCQotCQl0dHktPnRlcm1pb3MtPmNfb2ZsYWcgLyogb3V0cHV0IG1vZGVzICovCi0JCQkmPSB+T1BPU1Q7CQkvKiBkaXNhYmxlIHBvc3Rwcm9jZXNzIG91dHB1dCBjaGFyYWN0ZXJzICovCi0JCQotCQl0dHktPnRlcm1pb3MtPmNfbGZsYWcgLyogbGluZSBkaXNjaXBsaW5lIG1vZGVzICovCi0JCQkmPSB+KEVDSE8gCQkvKiBkaXNhYmxlIGVjaG8gaW5wdXQgY2hhcmFjdGVycyAqLwotCQkJfCBFQ0hPTkwJCS8qIGRpc2FibGUgZWNobyBuZXcgbGluZSAqLwotCQkJfCBJQ0FOT04JCS8qIGRpc2FibGUgZXJhc2UsIGtpbGwsIHdlcmFzZSwgYW5kIHJwcm50IHNwZWNpYWwgY2hhcmFjdGVycyAqLwotCQkJfCBJU0lHCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHQsIHF1aXQsIGFuZCBzdXNwZW5kIHNwZWNpYWwgY2hhcmFjdGVycyAqLwotCQkJfCBJRVhURU4pOwkJLyogZGlzYWJsZSBub24tUE9TSVggc3BlY2lhbCBjaGFyYWN0ZXJzICovCisJCQkmPSB+KElHTkJSSyAgLyogZGlzYWJsZSBpZ25vcmUgYnJlYWsgKi8KKwkJCXwgQlJLSU5UICAgICAvKiBkaXNhYmxlIGJyZWFrIGNhdXNlcyBpbnRlcnJ1cHQgKi8KKwkJCXwgUEFSTVJLICAgICAvKiBkaXNhYmxlIG1hcmsgcGFyaXR5IGVycm9ycyAqLworCQkJfCBJU1RSSVAgICAgIC8qIGRpc2FibGUgY2xlYXIgaGlnaCBiaXQgb2YgaW5wdXQgY2hhciAqLworCQkJfCBJTkxDUiAgICAgIC8qIGRpc2FibGUgdHJhbnNsYXRlIE5MIHRvIENSICovCisJCQl8IElHTkNSICAgICAgLyogZGlzYWJsZSBpZ25vcmUgQ1IgKi8KKwkJCXwgSUNSTkwgICAgICAvKiBkaXNhYmxlIHRyYW5zbGF0ZSBDUiB0byBOTCAqLworCQkJfCBJWE9OKTsgICAgIC8qIGRpc2FibGUgZW5hYmxlIFhPTi9YT0ZGIGZsb3cgY29udHJvbCAqLwogCisJCXR0eS0+dGVybWlvcy0+Y19vZmxhZyAvKiBvdXRwdXQgbW9kZXMgKi8KKwkJCSY9IH5PUE9TVDsgICAgLyogZGlzYWJsZSBwb3N0cHJvY2VzcyBvdXRwdXQgY2hhciAqLworCisJCXR0eS0+dGVybWlvcy0+Y19sZmxhZyAvKiBsaW5lIGRpc2NpcGxpbmUgbW9kZXMgKi8KKwkJCSY9IH4oRUNITyAgICAgLyogZGlzYWJsZSBlY2hvIGlucHV0IGNoYXJhY3RlcnMgKi8KKwkJCXwgRUNIT05MICAgICAgLyogZGlzYWJsZSBlY2hvIG5ldyBsaW5lICovCisJCQl8IElDQU5PTiAgICAgIC8qIGRpc2FibGUgZXJhc2UsIGtpbGwsIHdlcmFzZSwgYW5kIHJwcm50CisJCQkJCSBzcGVjaWFsIGNoYXJhY3RlcnMgKi8KKwkJCXwgSVNJRyAgICAgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHQsIHF1aXQsIGFuZCBzdXNwZW5kCisJCQkJCSBzcGVjaWFsIGNoYXJhY3RlcnMgKi8KKwkJCXwgSUVYVEVOKTsgICAgLyogZGlzYWJsZSBub24tUE9TSVggc3BlY2lhbCBjaGFyYWN0ZXJzICovCiAJfSAvKiBDVF9DWVBISURDT006IEFwcGxpY2F0aW9uIHNob3VsZCBoYW5kbGUgdGhpcyBmb3IgZGV2aWNlICovCiAKIAlsaW5lY2hhbmdlID0gKHByaXYtPmxpbmVfY29udHJvbCAhPSBvbGRsaW5lcyk7CkBAIC0xMDYwLDcgKzExMDMsNyBAQAogCX0KIH0gLyogY3lwcmVzc19zZXRfdGVybWlvcyAqLwogCi0gCisKIC8qIHJldHVybnMgYW1vdW50IG9mIGRhdGEgc3RpbGwgbGVmdCBpbiBzb2Z0IGJ1ZmZlciAqLwogc3RhdGljIGludCBjeXByZXNzX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewpAQCAtMTA4OCw3ICsxMTMxLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJcHJpdi0+cnhfZmxhZ3MgPSBUSFJPVFRMRUQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwkgICAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiB9CiAKIApAQCAtMTExMCw3ICsxMTUzLDggQEAKIAogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCAiCisJCQkJCSJlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOwogCX0KIH0KIApAQCAtMTEyMiw3ICsxMTY2LDcgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWNoYXIgdHR5X2ZsYWcgPSBUVFlfTk9STUFMOwkKKwljaGFyIHR0eV9mbGFnID0gVFRZX05PUk1BTDsKIAlpbnQgaGF2ZWRhdGEgPSAwOwogCWludCBieXRlcyA9IDA7CiAJaW50IHJlc3VsdDsKQEAgLTExMzEsNyArMTE3NSw4IEBACiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAodXJiLT5zdGF0dXMpIHsKLQkJZGJnKCIlcyAtIG5vbnplcm8gcmVhZCBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJCQl1cmItPnN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTExNTUsNTEgKzEyMDAsNTUgQEAKIAkJY2FzZSAzMjoKIAkJCS8qIFRoaXMgaXMgZm9yIHRoZSBDWTdDNjQwMTMuLi4gKi8KIAkJCXByaXYtPmN1cnJlbnRfc3RhdHVzID0gZGF0YVswXSAmIDB4Rjg7Ci0JCQlieXRlcyA9IGRhdGFbMV0rMjsKLQkJCWk9MjsKKwkJCWJ5dGVzID0gZGF0YVsxXSArIDI7CisJCQlpID0gMjsKIAkJCWlmIChieXRlcyA+IDIpCiAJCQkJaGF2ZWRhdGEgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgODoKIAkJCS8qIFRoaXMgaXMgZm9yIHRoZSBDWTdDNjM3NDMuLi4gKi8KIAkJCXByaXYtPmN1cnJlbnRfc3RhdHVzID0gZGF0YVswXSAmIDB4Rjg7Ci0JCQlieXRlcyA9IChkYXRhWzBdICYgMHgwNykrMTsKLQkJCWk9MTsKKwkJCWJ5dGVzID0gKGRhdGFbMF0gJiAweDA3KSArIDE7CisJCQlpID0gMTsKIAkJCWlmIChieXRlcyA+IDEpCiAJCQkJaGF2ZWRhdGEgPSAxOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkYmcoIiVzIC0gd3JvbmcgcGFja2V0IHNpemUgLSByZWNlaXZlZCAlZCBieXRlcyIsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCWRiZygiJXMgLSB3cm9uZyBwYWNrZXQgc2l6ZSAtIHJlY2VpdmVkICVkIGJ5dGVzIiwKKwkJCQkJX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQkJZ290byBjb250aW51ZV9yZWFkOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEgKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhIChkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLAorCQkJdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJLyogY2hlY2sgdG8gc2VlIGlmIHN0YXR1cyBoYXMgY2hhbmdlZCAqLwogCWlmIChwcml2ICE9IE5VTEwpIHsKIAkJaWYgKHByaXYtPmN1cnJlbnRfc3RhdHVzICE9IHByaXYtPnByZXZfc3RhdHVzKSB7Ci0JCQlwcml2LT5kaWZmX3N0YXR1cyB8PSBwcml2LT5jdXJyZW50X3N0YXR1cyBeIHByaXYtPnByZXZfc3RhdHVzOworCQkJcHJpdi0+ZGlmZl9zdGF0dXMgfD0gcHJpdi0+Y3VycmVudF9zdGF0dXMgXgorCQkJCXByaXYtPnByZXZfc3RhdHVzOwogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7CiAJCQlwcml2LT5wcmV2X3N0YXR1cyA9IHByaXYtPmN1cnJlbnRfc3RhdHVzOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JLyogaGFuZ3VwLCBhcyBkZWZpbmVkIGluIGFjbS5jLi4uIHRoaXMgbWlnaHQgYmUgYSBiYWQgcGxhY2UgZm9yIGl0IHRob3VnaCAqLwotCWlmICh0dHkgJiYgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICYmICEocHJpdi0+Y3VycmVudF9zdGF0dXMgJiBVQVJUX0NEKSkgeworCS8qIGhhbmd1cCwgYXMgZGVmaW5lZCBpbiBhY20uYy4uLiB0aGlzIG1pZ2h0IGJlIGEgYmFkIHBsYWNlIGZvciBpdAorCSAqIHRob3VnaCAqLworCWlmICh0dHkgJiYgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICYmCisJCQkhKHByaXYtPmN1cnJlbnRfc3RhdHVzICYgVUFSVF9DRCkpIHsKIAkJZGJnKCIlcyAtIGNhbGxpbmcgaGFuZ3VwIiwgX19GVU5DVElPTl9fKTsKIAkJdHR5X2hhbmd1cCh0dHkpOwogCQlnb3RvIGNvbnRpbnVlX3JlYWQ7CiAJfQogCi0JLyogVGhlcmUgaXMgb25lIGVycm9yIGJpdC4uLiBJJ20gYXNzdW1pbmcgaXQgaXMgYSBwYXJpdHkgZXJyb3IgaW5kaWNhdG9yCi0JICogYXMgdGhlIGdlbmVyaWMgZmlybXdhcmUgd2lsbCBzZXQgdGhpcyBiaXQgdG8gMSBpZiBhIHBhcml0eSBlcnJvciBvY2N1cnMuCi0JICogSSBjYW4gbm90IGZpbmQgcmVmZXJlbmNlIHRvIGFueSBvdGhlciBlcnJvciBldmVudHMuCi0JICoKLQkgKi8KKwkvKiBUaGVyZSBpcyBvbmUgZXJyb3IgYml0Li4uIEknbSBhc3N1bWluZyBpdCBpcyBhIHBhcml0eSBlcnJvcgorCSAqIGluZGljYXRvciBhcyB0aGUgZ2VuZXJpYyBmaXJtd2FyZSB3aWxsIHNldCB0aGlzIGJpdCB0byAxIGlmIGEKKwkgKiBwYXJpdHkgZXJyb3Igb2NjdXJzLgorCSAqIEkgY2FuIG5vdCBmaW5kIHJlZmVyZW5jZSB0byBhbnkgb3RoZXIgZXJyb3IgZXZlbnRzLiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKHByaXYtPmN1cnJlbnRfc3RhdHVzICYgQ1lQX0VSUk9SKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKQEAgLTEyMTEsNyArMTI2MCw4IEBACiAJLyogcHJvY2VzcyByZWFkIGlmIHRoZXJlIGlzIGRhdGEgb3RoZXIgdGhhbiBsaW5lIHN0YXR1cyAqLwogCWlmICh0dHkgJiYgKGJ5dGVzID4gaSkpIHsKIAkJZm9yICg7IGkgPCBieXRlcyA7ICsraSkgewotCQkJZGJnKCJwdXNoaW5nIGJ5dGUgbnVtYmVyICVkIC0gJWQgLSAlYyIsaSxkYXRhW2ldLGRhdGFbaV0pOworCQkJZGJnKCJwdXNoaW5nIGJ5dGUgbnVtYmVyICVkIC0gJWQgLSAlYyIsIGksIGRhdGFbaV0sCisJCQkJCWRhdGFbaV0pOwogCQkJaWYodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKIAkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCQkJfQpAQCAtMTIyMSwyNSArMTI3MSwyOCBAQAogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcHJpdi0+Ynl0ZXNfaW4gKz0gYnl0ZXM7ICAvKiBjb250cm9sIGFuZCBzdGF0dXMgYnl0ZShzKSBhcmUgYWxzbyBjb3VudGVkICovCisJLyogY29udHJvbCBhbmQgc3RhdHVzIGJ5dGUocykgYXJlIGFsc28gY291bnRlZCAqLworCXByaXYtPmJ5dGVzX2luICs9IGJ5dGVzOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogY29udGludWVfcmVhZDoKLQkKLQkvKiBDb250aW51ZSB0cnlpbmcgdG8gYWx3YXlzIHJlYWQuLi4gdW5sZXNzIHRoZSBwb3J0IGhhcyBjbG9zZWQuICAqLworCisJLyogQ29udGludWUgdHJ5aW5nIHRvIGFsd2F5cyByZWFkLi4uIHVubGVzcyB0aGUgcG9ydCBoYXMgY2xvc2VkLiAqLwogCiAJaWYgKHBvcnQtPm9wZW5fY291bnQgPiAwKSB7Ci0JdXNiX2ZpbGxfaW50X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKLQkJdXNiX3JjdmludHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIHBvcnQtPmludGVycnVwdF9pbl9lbmRwb2ludEFkZHJlc3MpLAotCQlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCXBvcnQtPmludGVycnVwdF9pbl91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCi0JCWN5cHJlc3NfcmVhZF9pbnRfY2FsbGJhY2ssIHBvcnQsCi0JCWludGVydmFsKTsKLQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmVzdWx0KQotCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQl1c2JfZmlsbF9pbnRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LAorCQkJCXVzYl9yY3ZpbnRwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LAorCQkJCQlwb3J0LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRBZGRyZXNzKSwKKwkJCQlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCQkJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCQljeXByZXNzX3JlYWRfaW50X2NhbGxiYWNrLCBwb3J0LCBpbnRlcnZhbCk7CisJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9BVE9NSUMpOworCQlpZiAocmVzdWx0KQorCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyAiCisJCQkJCSJyZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkJcmVzdWx0KTsKIAl9Ci0JCisKIAlyZXR1cm47CiB9IC8qIGN5cHJlc3NfcmVhZF9pbnRfY2FsbGJhY2sgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwppbmRleCBkMTk2NGEwLi4wYTZlOGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwpAQCAtMjY5LDYgKzI2OSw4IEBACiAjZGVmaW5lIERSSVZFUl9ERVNDICJVU0IgRlRESSBTZXJpYWwgQ29udmVydGVycyBEcml2ZXIiCiAKIHN0YXRpYyBpbnQgZGVidWc7CitzdGF0aWMgX191MTYgdmVuZG9yID0gRlRESV9WSUQ7CitzdGF0aWMgX191MTYgcHJvZHVjdDsKIAogLyogc3RydWN0IGZ0ZGlfc2lvX3F1aXJrIGlzIHVzZWQgYnkgZGV2aWNlcyByZXF1aXJpbmcgc3BlY2lhbCBhdHRlbnRpb24uICovCiBzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgewpAQCAtNDA3LDYgKzQwOSwzNCBAQAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEZfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVU8xMDBfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVU0xMDBfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVVIxMDBfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfQUxDODUwMF9QSUQpIH0sCisJLyoKKwkgKiBUaGVzZSB3aWxsIHByb2JhYmx5IHVzZSB1c2VyLXNwYWNlIGRyaXZlcnMuICBVbmNvbW1lbnQgdGhlbSBpZgorCSAqIHlvdSBuZWVkIHRoZW0gb3IgdXNlIHRoZSB1c2VyLXNwZWNpZmllZCB2ZW5kb3IvcHJvZHVjdCBtb2R1bGUKKwkgKiBwYXJhbWV0ZXJzIChzZWUgZnRkaV9zaW8uaCBmb3IgdGhlIG51bWJlcnMpLiAgTWFrZSBhIGZ1c3MgaWYKKwkgKiB5b3UgdGhpbmsgdGhlIGRyaXZlciBzaG91bGQgcmVjb2duaXplIGFueSBvZiB0aGVtIGJ5IGRlZmF1bHQuCisJICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9DTEk3MDAwX1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1BQUzczMzBfUElEKSB9LCAqLworCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVEZNMTAwX1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VERjc3X1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VJTzg4X1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VBRDhfUElEKSB9LCAqLworCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVURBN19QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VU0kyX1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1QxMTAwX1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1BDRDIwMF9QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VTEEyMDBfUElEKSB9LCAqLworCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfRkhaMTAwMFBDX1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX0NTSThfUElEKSB9LCAqLworCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfRU0xMDAwRExfUElEKSB9LCAqLworCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfUENLMTAwX1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1JGUDUwMF9QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9GUzIwU0lHX1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1dTMzAwUENfUElEKSB9LCAqLworCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfRkhaMTMwMFBDX1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1dTNTAwX1BJRCkgfSwgKi8KICAJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX1NETVVTQlFTU19QSUQpIH0sCiAgCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9NQVNURVJERVZFTDJfUElEKSB9LAogIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfRlVUVVJFXzBfUElEKSB9LApAQCAtNDE4LDYgKzQ0OCw3IEBACiAJeyBVU0JfREVWSUNFKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfVkFMVUVDQU5fUElEKSB9LAogCXsgVVNCX0RFVklDRShJTlRSRVBJRF9WSUQsIElOVFJFUElEX05FT1ZJX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRkFMQ09NX1ZJRCwgRkFMQ09NX1RXSVNUX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRkFMQ09NX1ZJRCwgRkFMQ09NX1NBTUJBX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfU1VVTlRPX1NQT1JUU19QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1JNX0NBTlZJRVdfUElEKSB9LAogCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTT1RMNF9QSUQpIH0sCkBAIC00MjcsMTIgKzQ1OCwyMSBAQAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzJfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzBfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzFfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzJfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzNfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzRfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzVfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzZfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzdfUElEKSB9LAogCXsgVVNCX0RFVklDRShNT0JJTElUWV9WSUQsIE1PQklMSVRZX1VTQl9TRVJJQUxfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9BQ1RJVkVfUk9CT1RTX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9ZNl9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01IQU1fWThfUElEKSB9LAogCXsgVVNCX0RFVklDRShFVk9MVVRJT05fVklELCBFVk9MVVRJT05fRVIxX1BJRCkgfSwKLQl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworCXsgfSwJCQkJCS8qIE9wdGlvbmFsIHBhcmFtZXRlciBlbnRyeSAqLworCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgaWRfdGFibGVfY29tYmluZWQpOwpAQCAtMjAzMCw2ICsyMDcwLDE1IEBACiAJaW50IHJldHZhbDsKIAogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWlmICh2ZW5kb3IgPiAwICYmIHByb2R1Y3QgPiAwKSB7CisJCS8qIEFkZCB1c2VyIHNwZWNpZmllZCBWSUQvUElEIHRvIHJlc2VydmVkIGVsZW1lbnQgb2YgdGFibGUuICovCisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpZF90YWJsZV9jb21iaW5lZFtpXS5pZFZlbmRvcjsgaSsrKQorCQkJOworCQlpZF90YWJsZV9jb21iaW5lZFtpXS5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFOworCQlpZF90YWJsZV9jb21iaW5lZFtpXS5pZFZlbmRvciA9IHZlbmRvcjsKKwkJaWRfdGFibGVfY29tYmluZWRbaV0uaWRQcm9kdWN0ID0gcHJvZHVjdDsKKwl9CiAJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmZnRkaV9zaW9fZGV2aWNlKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGZhaWxlZF9zaW9fcmVnaXN0ZXI7CkBAIC0yMDY2LDQgKzIxMTUsOSBAQAogCiBtb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBlbmFibGVkIG9yIG5vdCIpOworbW9kdWxlX3BhcmFtKHZlbmRvciwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmVuZG9yLCAiVXNlciBzcGVjaWZpZWQgdmVuZG9yIElEIChkZWZhdWx0PSIKKwkJX19NT0RVTEVfU1RSSU5HKEZURElfVklEKSIpIik7Cittb2R1bGVfcGFyYW0ocHJvZHVjdCwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmVuZG9yLCAiVXNlciBzcGVjaWZpZWQgcHJvZHVjdCBJRCIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCmluZGV4IDlmNDM0MjAuLjJjMzVkNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCkBAIC0xNDIsMTAgKzE0Miw0MyBAQAogLyogaHR0cDovL2hvbWUuZWFydGhsaW5rLm5ldC9+anJoZWVzL1VTQlVJUlQvaW5kZXguaHRtICovCiAjZGVmaW5lIEZURElfVVNCX1VJUlRfUElECTB4Rjg1MAkvKiBQcm9kdWN0IElkICovCiAKLS8qIEVMViBVU0IgTW9kdWxlIFVPMTAwIChQSUQgc2VudCBieSBTdGVmYW4gRnJpbmdzKSAqLwotI2RlZmluZSBGVERJX0VMVl9VTzEwMF9QSUQJMHhGQjU4CS8qIFByb2R1Y3QgSWQgKi8KLS8qIEVMViBVU0IgTW9kdWxlIFVNMTAwIChQSUQgc2VudCBieSBBcm5pbSBMYWV1Z2VyKSAqLwotI2RlZmluZSBGVERJX0VMVl9VTTEwMF9QSUQJMHhGQjVBCS8qIFByb2R1Y3QgSWQgKi8KKy8qCisgKiBFTFYgVVNCIGRldmljZXMgc3VibWl0dGVkIGJ5IENocmlzdGlhbiBBYnQgb2YgRUxWICh3d3cuZWx2LmRlKS4KKyAqIEFsbCBvZiB0aGVzZSBkZXZpY2VzIHVzZSBGVERJJ3MgdmVuZG9yIElEICgweDA0MDMpLgorICoKKyAqIFRoZSBwcmV2aW91c2x5IGluY2x1ZGVkIFBJRCBmb3IgdGhlIFVPIDEwMCBtb2R1bGUgd2FzIGluY29ycmVjdC4KKyAqIEluIGZhY3QsIHRoYXQgUElEIHdhcyBmb3IgRUxWJ3MgVVIgMTAwIFVTQi1SUzIzMiBjb252ZXJ0ZXIgKDB4RkI1OCkuCisgKgorICogQXJtaW4gTGFldWdlciBvcmlnaW5hbGx5IHNlbnQgdGhlIFBJRCBmb3IgdGhlIFVNIDEwMCBtb2R1bGUuCisgKi8KKyNkZWZpbmUgRlRESV9FTFZfVVIxMDBfUElECTB4RkI1OAkvKiBVU0ItUlMyMzItVW1zZXR6ZXIgKFVSIDEwMCkgKi8KKyNkZWZpbmUgRlRESV9FTFZfVU0xMDBfUElECTB4RkI1QQkvKiBVU0ItTW9kdWwgVU0gMTAwICovCisjZGVmaW5lIEZURElfRUxWX1VPMTAwX1BJRAkweEZCNUIJLyogVVNCLU1vZHVsIFVPIDEwMCAqLworI2RlZmluZSBGVERJX0VMVl9BTEM4NTAwX1BJRAkweEYwNkUJLyogQUxDIDg1MDAgRXhwZXJ0ICovCisvKiBBZGRpdGlvbmFsIEVMViBQSURzIHRoYXQgZGVmYXVsdCB0byB1c2luZyB0aGUgRlRESSBEMlhYIGRyaXZlcnMgb24KKyAqIE1TIFdpbmRvd3MsIHJhdGhlciB0aGFuIHRoZSBGVERJIFZpcnR1YWwgQ29tIFBvcnQgZHJpdmVycy4KKyAqIE1heWJlIHRoZXNlIHdpbGwgYmUgZWFzaWVyIHRvIHVzZSB3aXRoIHRoZSBsaWJmdGRpL2xpYnVzYiB1c2VyLXNwYWNlCisgKiBkcml2ZXJzLCBvciBwb3NzaWJseSB0aGUgQ29tZWRpIGRyaXZlcnMgaW4gc29tZSBjYXNlcy4gKi8KKyNkZWZpbmUgRlRESV9FTFZfQ0xJNzAwMF9QSUQJMHhGQjU5CS8qIENvbXB1dGVyLUxpZ2h0LUludGVyZmFjZSAoQ0xJIDcwMDApICovCisjZGVmaW5lIEZURElfRUxWX1BQUzczMzBfUElECTB4RkI1QwkvKiBQcm9jZXNzb3ItUG93ZXItU3VwcGx5IChQUFMgNzMzMCkgKi8KKyNkZWZpbmUgRlRESV9FTFZfVEZNMTAwX1BJRAkweEZCNUQJLyogVGVtcGVyYXJ0dXItRmV1Y2h0ZSBNZXNzZ2VyYWV0IChURk0gMTAwKSAqLworI2RlZmluZSBGVERJX0VMVl9VREY3N19QSUQJMHhGQjVFCS8qIFVTQiBEQ0YgRnVua3VyaCAoVURGIDc3KSAqLworI2RlZmluZSBGVERJX0VMVl9VSU84OF9QSUQJMHhGQjVGCS8qIFVTQi1JL08gSW50ZXJmYWNlIChVSU8gODgpICovCisjZGVmaW5lIEZURElfRUxWX1VBRDhfUElECTB4RjA2OAkvKiBVU0ItQUQtV2FuZGxlciAoVUFEIDgpICovCisjZGVmaW5lIEZURElfRUxWX1VEQTdfUElECTB4RjA2OQkvKiBVU0ItREEtV2FuZGxlciAoVURBIDcpICovCisjZGVmaW5lIEZURElfRUxWX1VTSTJfUElECTB4RjA2QQkvKiBVU0ItU2Nocml0dG1vdG9yZW4tSW50ZXJmYWNlIChVU0kgMikgKi8KKyNkZWZpbmUgRlRESV9FTFZfVDExMDBfUElECTB4RjA2QgkvKiBUaGVybW9tZXRlciAoVCAxMTAwKSAqLworI2RlZmluZSBGVERJX0VMVl9QQ0QyMDBfUElECTB4RjA2QwkvKiBQQy1EYXRlbmxvZ2dlciAoUENEIDIwMCkgKi8KKyNkZWZpbmUgRlRESV9FTFZfVUxBMjAwX1BJRAkweEYwNkQJLyogVVNCLUxDRC1BbnN0ZXVlcnVuZyAoVUxBIDIwMCkgKi8KKyNkZWZpbmUgRlRESV9FTFZfRkhaMTAwMFBDX1BJRAkweEYwNkYJLyogRkhaIDEwMDAgUEMgKi8KKyNkZWZpbmUgRlRESV9FTFZfQ1NJOF9QSUQJMHhFMEYwCS8qIENvbXB1dGVyLVNjaGFsdC1JbnRlcmZhY2UgKENTSSA4KSAqLworI2RlZmluZSBGVERJX0VMVl9FTTEwMDBETF9QSUQJMHhFMEYxCS8qIFBDLURhdGVubG9nZ2VyIGZ1ZXIgRW5lcmdpZW1vbml0b3IgKEVNIDEwMDAgREwpICovCisjZGVmaW5lIEZURElfRUxWX1BDSzEwMF9QSUQJMHhFMEYyCS8qIFBDLUthYmVsdGVzdGVyIChQQ0sgMTAwKSAqLworI2RlZmluZSBGVERJX0VMVl9SRlA1MDBfUElECTB4RTBGMwkvKiBIRi1MZWlzdHVuZ3NtZXNzZXIgKFJGUCA1MDApICovCisjZGVmaW5lIEZURElfRUxWX0ZTMjBTSUdfUElECTB4RTBGNAkvKiBTaWduYWxnZWJlciAoRlMgMjAgU0lHKSAqLworI2RlZmluZSBGVERJX0VMVl9XUzMwMFBDX1BJRAkweEUwRjYJLyogUEMtV2V0dGVyc3RhdGlvbiAoV1MgMzAwIFBDKSAqLworI2RlZmluZSBGVERJX0VMVl9GSFoxMzAwUENfUElECTB4RTBFOAkvKiBGSFogMTMwMCBQQyAqLworI2RlZmluZSBGVERJX0VMVl9XUzUwMF9QSUQJMHhFMEU5CS8qIFBDLVdldHRlcnN0YXRpb24gKFdTIDUwMCkgKi8KIAogLyoKICAqIERlZmluaXRpb25zIGZvciBJRCBURUNIICh3d3cuaWR0LW5ldC5jb20pIGRldmljZXMKQEAgLTIyMiw2ICsyNTUsNyBAQAogICovCiAjZGVmaW5lIEZBTENPTV9WSUQJCTB4MEY5NAkvKiBWZW5kb3IgSWQgKi8KICNkZWZpbmUgRkFMQ09NX1RXSVNUX1BJRAkweDAwMDEJLyogRmFsY29tIFR3aXN0IFVTQiBHUFJTIG1vZGVtICovCisjZGVmaW5lIEZBTENPTV9TQU1CQV9QSUQJMHgwMDA1CS8qIEZhbGNvbSBTYW1iYSBVU0IgR1BSUyBtb2RlbSAqLwogCiAvKgogICogU1VVTlRPIHByb2R1Y3QgaWRzCkBAIC0yNzcsNiArMzExLDE4IEBACiAjZGVmaW5lIEZURElfQUNUSVZFX1JPQk9UU19QSUQJMHhFNTQ4CS8qIFVTQiBjb21tcyBib2FyZCAqLwogCiAvKgorICogWHNlbnMgVGVjaG5vbG9naWVzIEJWIHByb2R1Y3RzIChodHRwOi8vd3d3LnhzZW5zLmNvbSkuCisgKi8KKyNkZWZpbmUgWFNFTlNfQ09OVkVSVEVSXzBfUElECTB4RDM4OAorI2RlZmluZSBYU0VOU19DT05WRVJURVJfMV9QSUQJMHhEMzg5CisjZGVmaW5lIFhTRU5TX0NPTlZFUlRFUl8yX1BJRAkweEQzOEEKKyNkZWZpbmUgWFNFTlNfQ09OVkVSVEVSXzNfUElECTB4RDM4QgorI2RlZmluZSBYU0VOU19DT05WRVJURVJfNF9QSUQJMHhEMzhDCisjZGVmaW5lIFhTRU5TX0NPTlZFUlRFUl81X1BJRAkweEQzOEQKKyNkZWZpbmUgWFNFTlNfQ09OVkVSVEVSXzZfUElECTB4RDM4RQorI2RlZmluZSBYU0VOU19DT05WRVJURVJfN19QSUQJMHhEMzhGCisKKy8qCiAgKiBFdm9sdXRpb24gUm9ib3RpY3MgcHJvZHVjdHMgKGh0dHA6Ly93d3cuZXZvbHV0aW9uLmNvbS8pLgogICogU3VibWl0dGVkIGJ5IFNoYXduIE0uIExhdmVsbGUuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jCmluZGV4IGZiMDkyNjIuLjNiOTU4ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYwpAQCAtMzgzLDExICszODMsOCBAQAogCQlkYmcoIiVzIC0gZW5kcG9pbnQgJWQgZmxpcCAlZCIsIF9fRlVOQ1RJT05fXywgdXNiX3BpcGVlbmRwb2ludCh0aGlzX3VyYi0+cGlwZSksIGZsaXApOwogCiAJCWlmICh0aGlzX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQkJaWYgKHRoaXNfdXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9BU1lOQ19VTkxJTkspCi0JCQkJYnJlYWs7CiAJCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcF9wcml2LT50eF9zdGFydF90aW1lW2ZsaXBdICsgMTAgKiBIWikpCiAJCQkJYnJlYWs7Ci0JCQl0aGlzX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsKIAkJCXVzYl91bmxpbmtfdXJiKHRoaXNfdXJiKTsKIAkJCWJyZWFrOwogCQl9CkBAIC00MDIsNyArMzk5LDYgQEAKIAkJLyogc2VuZCB0aGUgZGF0YSBvdXQgdGhlIGJ1bGsgcG9ydCAqLwogCQl0aGlzX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHRvZG8gKyBkYXRhT2Zmc2V0OwogCi0JCXRoaXNfdXJiLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX0FTWU5DX1VOTElOSzsKIAkJdGhpc191cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCQlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHRoaXNfdXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkgewogCQkJZGJnKCJ1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQgKCVkKSIsIGVycik7CkBAIC0xMTE5LDEwICsxMTE1LDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHN0b3BfdXJiKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlpZiAodXJiICYmIHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQl1cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfQVNZTkNfVU5MSU5LOworCWlmICh1cmIgJiYgdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQogCQl1c2Jfa2lsbF91cmIodXJiKTsKLQl9CiB9CiAKIHN0YXRpYyB2b2lkIGtleXNwYW5fY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKaW5kZXggZTkyNTY0MC4uOTJkMGY5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwpAQCAtNDUsMjkgKzQ1LDI5IEBACiAjaW5jbHVkZSAidXNiLXNlcmlhbC5oIgogCiAvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCi1zdGF0aWMgaW50ICBvcHRpb25fb3BlbiAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQgb3B0aW9uX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1zdGF0aWMgaW50ICBvcHRpb25fc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7Ci1zdGF0aWMgdm9pZCBvcHRpb25fc2h1dGRvd24gKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwotc3RhdGljIHZvaWQgb3B0aW9uX3J4X3Rocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIG9wdGlvbl9yeF91bnRocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKLXN0YXRpYyBpbnQgIG9wdGlvbl93cml0ZV9yb29tIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKK3N0YXRpYyBpbnQgIG9wdGlvbl9vcGVuKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkIG9wdGlvbl9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgaW50ICBvcHRpb25fc3RhcnR1cChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKK3N0YXRpYyB2b2lkIG9wdGlvbl9zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKK3N0YXRpYyB2b2lkIG9wdGlvbl9yeF90aHJvdHRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIG9wdGlvbl9yeF91bnRocm90dGxlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOworc3RhdGljIGludCAgb3B0aW9uX3dyaXRlX3Jvb20oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiAKIHN0YXRpYyB2b2lkIG9wdGlvbl9pbnN0YXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKLXN0YXRpYyBpbnQgIG9wdGlvbl93cml0ZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOworc3RhdGljIGludCBvcHRpb25fd3JpdGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKIAotc3RhdGljIGludCAgb3B0aW9uX2NoYXJzX2luX2J1ZmZlciAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgaW50ICBvcHRpb25faW9jdGwgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgdm9pZCBvcHRpb25fc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpOwotc3RhdGljIHZvaWQgb3B0aW9uX2JyZWFrX2N0bCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKTsKLXN0YXRpYyBpbnQgIG9wdGlvbl90aW9jbWdldCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGludCAgb3B0aW9uX3Rpb2Ntc2V0IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKLXN0YXRpYyBpbnQgIG9wdGlvbl9zZW5kX3NldHVwIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKK3N0YXRpYyBpbnQgIG9wdGlvbl9jaGFyc19pbl9idWZmZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CitzdGF0aWMgaW50ICBvcHRpb25faW9jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZCBvcHRpb25fc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCQlzdHJ1Y3QgdGVybWlvcyAqb2xkKTsKK3N0YXRpYyB2b2lkIG9wdGlvbl9icmVha19jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKTsKK3N0YXRpYyBpbnQgIG9wdGlvbl90aW9jbWdldChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50ICBvcHRpb25fdGlvY21zZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKK3N0YXRpYyBpbnQgIG9wdGlvbl9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogCiAvKiBWZW5kb3IgYW5kIHByb2R1Y3QgSURzICovCiAjZGVmaW5lIE9QVElPTl9WRU5ET1JfSUQJCQkweDBBRjAKQEAgLTc2LDcgKzc2LDYgQEAKICNkZWZpbmUgT1BUSU9OX1BST0RVQ1RfRlVTSU9OCTB4NjAwMAogI2RlZmluZSBPUFRJT05fUFJPRFVDVF9GVVNJT04yCTB4NjMwMAogCi0KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBvcHRpb25faWRzW10gPSB7CiAJeyBVU0JfREVWSUNFKE9QVElPTl9WRU5ET1JfSUQsIE9QVElPTl9QUk9EVUNUX09MRCkgfSwKIAl7IFVTQl9ERVZJQ0UoT1BUSU9OX1ZFTkRPUl9JRCwgT1BUSU9OX1BST0RVQ1RfRlVTSU9OKSB9LApAQCAtMTI5LDcgKzEyOCw2IEBACiAjZGVmaW5lIGRlYnVnIDAKICNlbmRpZgogCi0KIC8qIHBlciBwb3J0IHByaXZhdGUgZGF0YSAqLwogCiAjZGVmaW5lIE5fSU5fVVJCIDQKQEAgLTE1NiwxMCArMTU0LDggQEAKIAl1bnNpZ25lZCBsb25nIHR4X3N0YXJ0X3RpbWVbTl9PVVRfVVJCXTsKIH07CiAKLQogLyogRnVuY3Rpb25zIHVzZWQgYnkgbmV3IHVzYi1zZXJpYWwgY29kZS4gKi8KLXN0YXRpYyBpbnQgX19pbml0Ci1vcHRpb25faW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IG9wdGlvbl9pbml0KHZvaWQpCiB7CiAJaW50IHJldHZhbDsKIAlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZvcHRpb25fM3BvcnRfZGV2aWNlKTsKQEAgLTE3OSw4ICsxNzUsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAotb3B0aW9uX2V4aXQgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgb3B0aW9uX2V4aXQodm9pZCkKIHsKIAl1c2JfZGVyZWdpc3RlciAoJm9wdGlvbl9kcml2ZXIpOwogCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJm9wdGlvbl8zcG9ydF9kZXZpY2UpOwpAQCAtMTg5LDM5ICsxODQsMzEgQEAKIG1vZHVsZV9pbml0KG9wdGlvbl9pbml0KTsKIG1vZHVsZV9leGl0KG9wdGlvbl9leGl0KTsKIAotc3RhdGljIHZvaWQKLW9wdGlvbl9yeF90aHJvdHRsZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIG9wdGlvbl9yeF90aHJvdHRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwogfQogCi0KLXN0YXRpYyB2b2lkCi1vcHRpb25fcnhfdW50aHJvdHRsZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIG9wdGlvbl9yeF91bnRocm90dGxlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKLQotc3RhdGljIHZvaWQKLW9wdGlvbl9icmVha19jdGwgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKK3N0YXRpYyB2b2lkIG9wdGlvbl9icmVha19jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQogewogCS8qIFVuZm9ydHVuYXRlbHksIEkgZG9uJ3Qga25vdyBob3cgdG8gc2VuZCBhIGJyZWFrICovCiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKLQotc3RhdGljIHZvaWQKLW9wdGlvbl9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgb3B0aW9uX3NldF90ZXJtaW9zKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQlzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKIAlvcHRpb25fc2VuZF9zZXR1cChwb3J0KTsKIH0KIAotc3RhdGljIGludAotb3B0aW9uX3Rpb2NtZ2V0IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQgb3B0aW9uX3Rpb2NtZ2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXVuc2lnbmVkIGludCB2YWx1ZTsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CkBAIC0yMzgsOSArMjI1LDggQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKLXN0YXRpYyBpbnQKLW9wdGlvbl90aW9jbXNldCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3N0YXRpYyBpbnQgb3B0aW9uX3Rpb2Ntc2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQogewogCXN0cnVjdCBvcHRpb25fcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKIApAQCAtMjU4LDE3ICsyNDQsMTUgQEAKIAlyZXR1cm4gb3B0aW9uX3NlbmRfc2V0dXAocG9ydCk7CiB9CiAKLXN0YXRpYyBpbnQKLW9wdGlvbl9pb2N0bCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCi0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBvcHRpb25faW9jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogfQogCiAvKiBXcml0ZSAqLwotc3RhdGljIGludAotb3B0aW9uX3dyaXRlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgb3B0aW9uX3dyaXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAJaW50IGk7CkBAIC0yODksMjggKzI3MywyOSBAQAogCiAJCXRoaXNfdXJiID0gcG9ydGRhdGEtPm91dF91cmJzW2ldOwogCQlpZiAodGhpc191cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJCWlmICh0aGlzX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfQVNZTkNfVU5MSU5LKQorCQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsCisJCQkJCXBvcnRkYXRhLT50eF9zdGFydF90aW1lW2ldICsgMTAgKiBIWikpCiAJCQkJY29udGludWU7Ci0JCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcG9ydGRhdGEtPnR4X3N0YXJ0X3RpbWVbaV0gKyAxMCAqIEhaKSkKLQkJCQljb250aW51ZTsKLQkJCXRoaXNfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOwogCQkJdXNiX3VubGlua191cmIodGhpc191cmIpOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKHRoaXNfdXJiLT5zdGF0dXMgIT0gMCkKLQkJCWRiZygidXNiX3dyaXRlICVwIGZhaWxlZCAoZXJyPSVkKSIsIHRoaXNfdXJiLCB0aGlzX3VyYi0+c3RhdHVzKTsKKwkJCWRiZygidXNiX3dyaXRlICVwIGZhaWxlZCAoZXJyPSVkKSIsCisJCQkJdGhpc191cmIsIHRoaXNfdXJiLT5zdGF0dXMpOwogCi0JCWRiZygiJXM6IGVuZHBvaW50ICVkIGJ1ZiAlZCIsIF9fRlVOQ1RJT05fXywgdXNiX3BpcGVlbmRwb2ludCh0aGlzX3VyYi0+cGlwZSksIGkpOworCQlkYmcoIiVzOiBlbmRwb2ludCAlZCBidWYgJWQiLCBfX0ZVTkNUSU9OX18sCisJCQl1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSwgaSk7CiAKIAkJLyogc2VuZCB0aGUgZGF0YSAqLwogCQltZW1jcHkgKHRoaXNfdXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZiwgdG9kbyk7CiAJCXRoaXNfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdG9kbzsKIAotCQl0aGlzX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CiAJCXRoaXNfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIodGhpc191cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoZXJyKSB7Ci0JCQlkYmcoInVzYl9zdWJtaXRfdXJiICVwICh3cml0ZSBidWxrKSBmYWlsZWQgKCVkLCBoYXMgJWQpIiwgdGhpc191cmIsIGVyciwgdGhpc191cmItPnN0YXR1cyk7CisJCQlkYmcoInVzYl9zdWJtaXRfdXJiICVwICh3cml0ZSBidWxrKSBmYWlsZWQgIgorCQkJCSIoJWQsIGhhcyAlZCkiLCB0aGlzX3VyYiwKKwkJCQllcnIsIHRoaXNfdXJiLT5zdGF0dXMpOwogCQkJY29udGludWU7CiAJCX0KIAkJcG9ydGRhdGEtPnR4X3N0YXJ0X3RpbWVbaV0gPSBqaWZmaWVzOwpAQCAtMzIzLDggKzMwOCw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgdm9pZAotb3B0aW9uX2luZGF0X2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgb3B0aW9uX2luZGF0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGksIGVycjsKIAlpbnQgZW5kcG9pbnQ7CkBAIC0zNTcsMTQgKzM0MSwxNCBAQAogCQlpZiAocG9ydC0+b3Blbl9jb3VudCAmJiB1cmItPnN0YXR1cyAhPSAtRVNIVVRET1dOKSB7CiAJCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKGVycikKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAiCisJCQkJCSIoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOwogCQl9CiAJfQogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQKLW9wdGlvbl9vdXRkYXRfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBvcHRpb25fb3V0ZGF0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIApAQCAtMzc2LDggKzM2MCw3IEBACiAJCXNjaGVkdWxlX3dvcmsoJnBvcnQtPndvcmspOwogfQogCi1zdGF0aWMgdm9pZAotb3B0aW9uX2luc3RhdF9jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIG9wdGlvbl9pbnN0YXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CkBAIC0zOTUsMTAgKzM3OCwxMiBAQAogCQkJZGJnKCIlczogTlVMTCByZXFfcGt0XG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuOwogCQl9Ci0JCWlmICgocmVxX3BrdC0+YlJlcXVlc3RUeXBlID09IDB4QTEpICYmIChyZXFfcGt0LT5iUmVxdWVzdCA9PSAweDIwKSkgeworCQlpZiAoKHJlcV9wa3QtPmJSZXF1ZXN0VHlwZSA9PSAweEExKSAmJgorCQkJCShyZXFfcGt0LT5iUmVxdWVzdCA9PSAweDIwKSkgewogCQkJaW50IG9sZF9kY2Rfc3RhdGU7CiAJCQl1bnNpZ25lZCBjaGFyIHNpZ25hbHMgPSAqKCh1bnNpZ25lZCBjaGFyICopCi0JCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpKTsKKwkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgKworCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCkpOwogCiAJCQlkYmcoIiVzOiBzaWduYWwgeCV4IiwgX19GVU5DVElPTl9fLCBzaWduYWxzKTsKIApAQCAtNDA4LDEyICszOTMsMTMgQEAKIAkJCXBvcnRkYXRhLT5kc3Jfc3RhdGUgPSAoKHNpZ25hbHMgJiAweDAyKSA/IDEgOiAwKTsKIAkJCXBvcnRkYXRhLT5yaV9zdGF0ZSA9ICgoc2lnbmFscyAmIDB4MDgpID8gMSA6IDApOwogCi0JCQlpZiAocG9ydC0+dHR5ICYmICFDX0NMT0NBTChwb3J0LT50dHkpCi0JCQkJCSYmIG9sZF9kY2Rfc3RhdGUgJiYgIXBvcnRkYXRhLT5kY2Rfc3RhdGUpIHsKKwkJCWlmIChwb3J0LT50dHkgJiYgIUNfQ0xPQ0FMKHBvcnQtPnR0eSkgJiYKKwkJCQkJb2xkX2RjZF9zdGF0ZSAmJiAhcG9ydGRhdGEtPmRjZF9zdGF0ZSkKIAkJCQl0dHlfaGFuZ3VwKHBvcnQtPnR0eSk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJZGJnKCIlczogdHlwZSAleCByZXEgJXgiLCBfX0ZVTkNUSU9OX18sIHJlcV9wa3QtPmJSZXF1ZXN0VHlwZSxyZXFfcGt0LT5iUmVxdWVzdCk7CisJCX0gZWxzZSB7CisJCQlkYmcoIiVzOiB0eXBlICV4IHJlcSAleCIsIF9fRlVOQ1RJT05fXywKKwkJCQlyZXFfcGt0LT5iUmVxdWVzdFR5cGUscmVxX3BrdC0+YlJlcXVlc3QpOworCQl9CiAJfSBlbHNlCiAJCWRiZygiJXM6IGVycm9yICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CiAKQEAgLTQyMiwxMyArNDA4LDEyIEBACiAJCXVyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChlcnIpCi0JCQlkYmcoIiVzOiByZXN1Ym1pdCBpbnRyIHVyYiBmYWlsZWQuICglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQlkYmcoIiVzOiByZXN1Ym1pdCBpbnRyIHVyYiBmYWlsZWQuICglZCkiLAorCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKIAl9CiB9CiAKLQotc3RhdGljIGludAotb3B0aW9uX3dyaXRlX3Jvb20gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IG9wdGlvbl93cml0ZV9yb29tKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCWludCBpOwpAQCAtNDQ3LDkgKzQzMiw3IEBACiAJcmV0dXJuIGRhdGFfbGVuOwogfQogCi0KLXN0YXRpYyBpbnQKLW9wdGlvbl9jaGFyc19pbl9idWZmZXIgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IG9wdGlvbl9jaGFyc19pbl9idWZmZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAJaW50IGk7CkBAIC00NjcsOSArNDUwLDcgQEAKIAlyZXR1cm4gZGF0YV9sZW47CiB9CiAKLQotc3RhdGljIGludAotb3B0aW9uX29wZW4gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIGludCBvcHRpb25fb3BlbihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKQEAgLTQ5MCwxNyArNDcxLDIxIEBACiAJCWlmICghIHVyYikKIAkJCWNvbnRpbnVlOwogCQlpZiAodXJiLT5kZXYgIT0gc2VyaWFsLT5kZXYpIHsKLQkJCWRiZygiJXM6IGRldiAlcCAhPSAlcCIsIF9fRlVOQ1RJT05fXywgdXJiLT5kZXYsIHNlcmlhbC0+ZGV2KTsKKwkJCWRiZygiJXM6IGRldiAlcCAhPSAlcCIsIF9fRlVOQ1RJT05fXywKKwkJCQl1cmItPmRldiwgc2VyaWFsLT5kZXYpOwogCQkJY29udGludWU7CiAJCX0KIAotCQkvKiBtYWtlIHN1cmUgZW5kcG9pbnQgZGF0YSB0b2dnbGUgaXMgc3luY2hyb25pemVkIHdpdGggdGhlIGRldmljZSAqLwotCisJCS8qCisJCSAqIG1ha2Ugc3VyZSBlbmRwb2ludCBkYXRhIHRvZ2dsZSBpcyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUKKwkJICogZGV2aWNlCisJCSAqLwogCQl1c2JfY2xlYXJfaGFsdCh1cmItPmRldiwgdXJiLT5waXBlKTsKIAogCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOwogCQlpZiAoZXJyKSB7Ci0JCQlkYmcoIiVzOiBzdWJtaXQgdXJiICVkIGZhaWxlZCAoJWQpICVkIiwgX19GVU5DVElPTl9fLCBpLCBlcnIsCisJCQlkYmcoIiVzOiBzdWJtaXQgdXJiICVkIGZhaWxlZCAoJWQpICVkIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGksIGVyciwKIAkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwogCQl9CiAJfQpAQCAtNTExLDcgKzQ5Niw4IEBACiAJCWlmICghIHVyYikKIAkJCWNvbnRpbnVlOwogCQl1cmItPmRldiA9IHNlcmlhbC0+ZGV2OwotCQkvKiB1c2Jfc2V0dG9nZ2xlKHVyYi0+ZGV2LCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksIHVzYl9waXBlb3V0KHVyYi0+cGlwZSksIDApOyAqLworCQkvKiB1c2Jfc2V0dG9nZ2xlKHVyYi0+ZGV2LCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksCisJCQkJdXNiX3BpcGVvdXQodXJiLT5waXBlKSwgMCk7ICovCiAJfQogCiAJcG9ydC0+dHR5LT5sb3dfbGF0ZW5jeSA9IDE7CkBAIC01MjEsMTcgKzUwNywxMyBAQAogCXJldHVybiAoMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotc3RvcF91cmIgKHN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX3VyYihzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JaWYgKHVyYiAmJiB1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJdXJiLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX0FTWU5DX1VOTElOSzsKKwlpZiAodXJiICYmIHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykKIAkJdXNiX2tpbGxfdXJiKHVyYik7Ci0JfQogfQogCi1zdGF0aWMgdm9pZAotb3B0aW9uX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIG9wdGlvbl9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwpAQCAtNTU1LDEyICs1MzcsMTAgQEAKIAlwb3J0LT50dHkgPSBOVUxMOwogfQogCi0KIC8qIEhlbHBlciBmdW5jdGlvbnMgdXNlZCBieSBvcHRpb25fc2V0dXBfdXJicyAqLwotc3RhdGljIHN0cnVjdCB1cmIgKgotb3B0aW9uX3NldHVwX3VyYiAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgaW50IGVuZHBvaW50LAotICAgICAgICAgICAgICAgICAgaW50IGRpciwgdm9pZCAqY3R4LCBjaGFyICpidWYsIGludCBsZW4sCi0gICAgICAgICAgICAgICAgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB1cmIgKiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpKQorc3RhdGljIHN0cnVjdCB1cmIgKm9wdGlvbl9zZXR1cF91cmIoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgaW50IGVuZHBvaW50LAorCQlpbnQgZGlyLCB2b2lkICpjdHgsIGNoYXIgKmJ1ZiwgaW50IGxlbiwKKwkJdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgdXJiICosIHN0cnVjdCBwdF9yZWdzICpyZWdzKSkKIHsKIAlzdHJ1Y3QgdXJiICp1cmI7CiAKQEAgLTU4Miw4ICs1NjIsNyBAQAogfQogCiAvKiBTZXR1cCB1cmJzICovCi1zdGF0aWMgdm9pZAotb3B0aW9uX3NldHVwX3VyYnMgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCitzdGF0aWMgdm9pZCBvcHRpb25fc2V0dXBfdXJicyhzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewogCWludCBqOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CkBAIC02MDksOSArNTg4LDcgQEAKIAl9CiB9CiAKLQotc3RhdGljIGludAotb3B0aW9uX3NlbmRfc2V0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IG9wdGlvbl9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CkBAIC02MjcsMTYgKzYwNCwxNSBAQAogCQlpZiAocG9ydGRhdGEtPnJ0c19zdGF0ZSkKIAkJCXZhbCB8PSAweDAyOwogCi0JCXJldHVybiB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsIHVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCi0JCQkJCTB4MjIsMHgyMSx2YWwsMCxOVUxMLDAsVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LAorCQkJCXVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCisJCQkJMHgyMiwweDIxLHZhbCwwLE5VTEwsMCxVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludAotb3B0aW9uX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCitzdGF0aWMgaW50IG9wdGlvbl9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJaW50IGksIGVycjsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwpAQCAtNjQ3LDkgKzYyMywxMCBAQAogCS8qIE5vdyBzZXR1cCBwZXIgcG9ydCBwcml2YXRlIGRhdGEgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7IGkrKykgewogCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOwotCQlwb3J0ZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcHRpb25fcG9ydF9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJCXBvcnRkYXRhID0ga21hbGxvYyhzaXplb2YoKnBvcnRkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcG9ydGRhdGEpIHsKLQkJCWRiZygiJXM6IGttYWxsb2MgZm9yIG9wdGlvbl9wb3J0X3ByaXZhdGUgKCVkKSBmYWlsZWQhLiIsIF9fRlVOQ1RJT05fXywgaSk7CisJCQlkYmcoIiVzOiBrbWFsbG9jIGZvciBvcHRpb25fcG9ydF9wcml2YXRlICglZCkgZmFpbGVkIS4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIGkpOwogCQkJcmV0dXJuICgxKTsKIAkJfQogCQltZW1zZXQocG9ydGRhdGEsIDAsIHNpemVvZihzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSkpOwpAQCAtNjYwLDcgKzYzNyw4IEBACiAJCQljb250aW51ZTsKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnIpCi0JCQlkYmcoIiVzOiBzdWJtaXQgaXJxX2luIHVyYiBmYWlsZWQgJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQlkYmcoIiVzOiBzdWJtaXQgaXJxX2luIHVyYiBmYWlsZWQgJWQiLAorCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKIAl9CiAKIAlvcHRpb25fc2V0dXBfdXJicyhzZXJpYWwpOwpAQCAtNjY4LDggKzY0Niw3IEBACiAJcmV0dXJuICgwKTsKIH0KIAotc3RhdGljIHZvaWQKLW9wdGlvbl9zaHV0ZG93biAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKK3N0YXRpYyB2b2lkIG9wdGlvbl9zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewogCWludCBpLCBqOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKaW5kZXggN2VhYjVkNC4uNDYxNDc0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYwpAQCAtNTM4LDggKzUzOCwxMCBAQAogCiAJZGJnKCIlcyAtICBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCi0JdXNiX2NsZWFyX2hhbHQoc2VyaWFsLT5kZXYsIHBvcnQtPndyaXRlX3VyYi0+cGlwZSk7Ci0JdXNiX2NsZWFyX2hhbHQoc2VyaWFsLT5kZXYsIHBvcnQtPnJlYWRfdXJiLT5waXBlKTsKKwlpZiAocHJpdi0+dHlwZSAhPSBIWCkgeworCQl1c2JfY2xlYXJfaGFsdChzZXJpYWwtPmRldiwgcG9ydC0+d3JpdGVfdXJiLT5waXBlKTsKKwkJdXNiX2NsZWFyX2hhbHQoc2VyaWFsLT5kZXYsIHBvcnQtPnJlYWRfdXJiLT5waXBlKTsKKwl9CiAKIAlidWYgPSBrbWFsbG9jKDEwLCBHRlBfS0VSTkVMKTsKIAlpZiAoYnVmPT1OVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKaW5kZXggMDI2N2IyNi4uZTc3ZmJkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCkBAIC01MzEsNyArNTMxLDcgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWlmICghcG9ydCkKIAkJcmV0dXJuOwpAQCAtNTYxLDcgKzU2MSw3IEBACiAKIHN0YXRpYyBpbnQgc2VyaWFsX3dyaXRlIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJldHZhbCA9IC1FSU5WQUw7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCwgJWQgYnl0ZShzKSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CkBAIC01ODAsNyArNTgwLDcgQEAKIAogc3RhdGljIGludCBzZXJpYWxfd3JpdGVfcm9vbSAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJldHZhbCA9IC1FSU5WQUw7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKQEAgLTU5OSw3ICs1OTksNyBAQAogCiBzdGF0aWMgaW50IHNlcmlhbF9jaGFyc19pbl9idWZmZXIgKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCWludCByZXR2YWwgPSAtRUlOVkFMOwogCiAJZGJnKCIlcyA9IHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CkBAIC02MTgsNyArNjE4LDcgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsX3Rocm90dGxlIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCkBAIC02MzQsNyArNjM0LDcgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsX3VudGhyb3R0bGUgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CiAKQEAgLTY1MCw3ICs2NTAsNyBAQAogCiBzdGF0aWMgaW50IHNlcmlhbF9pb2N0bCAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgcmV0dmFsID0gLUVOT0RFVjsKIAogCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgMHglLjR4IiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNtZCk7CkBAIC02NzIsNyArNjcyLDcgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsX3NldF90ZXJtaW9zIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCkBAIC02ODgsNyArNjg4LDcgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsX2JyZWFrIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKIApAQCAtNzQ5LDcgKzc0OSw3IEBACiAKIHN0YXRpYyBpbnQgc2VyaWFsX3Rpb2NtZ2V0IChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCkBAIC03NjgsNyArNzY4LDcgQEAKIHN0YXRpYyBpbnQgc2VyaWFsX3Rpb2Ntc2V0IChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKIApAQCAtNzg2LDcgKzc4Niw3IEBACiAKIHZvaWQgdXNiX3NlcmlhbF9wb3J0X3NvZnRpbnQodm9pZCAqcHJpdmF0ZSkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKilwcml2YXRlOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBwcml2YXRlOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZwppbmRleCBmMWYxYzA2Li5iYjk4MTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCkBAIC0xMTEsMyArMTExLDE1IEBACiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb2RlIHRvIHN1cHBvcnQgdGhlIExleGFyIEp1bXBzaG90CiAJICBVU0IgQ29tcGFjdEZsYXNoIHJlYWRlci4KIAorCitjb25maWcgVVNCX1NUT1JBR0VfT05FVE9VQ0gKKwlib29sICJTdXBwb3J0IE9uZVRvdWNoIEJ1dHRvbiBvbiBNYXh0b3IgSGFyZCBEcml2ZXMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBVU0JfU1RPUkFHRSAmJiBJTlBVVF9FVkRFViAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb2RlIHRvIHN1cHBvcnQgdGhlIE1heHRvciBPbmVUb3VjaAorCSAgVVNCIGhhcmQgZHJpdmUncyBvbmV0b3VjaCBidXR0b24uCisKKwkgIFRoaXMgY29kZSByZWdpc3RlcnMgdGhlIGJ1dHRvbiBvbiB0aGUgZnJvbnQgb2YgTWF4dG9yIE9uZVRvdWNoIFVTQgorCSAgaGFyZCBkcml2ZSdzIGFzIGFuIGlucHV0IGRldmljZS4gQW4gYWN0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGgKKwkgIHRoaXMgaW5wdXQgaW4gYW55IGtleWJpbmRpbmcgc29mdHdhcmUuIChlLmcuIGdub21lJ3Mga2V5Ym9hcmQgc2hvcnQtCisJICBjdXRzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvTWFrZWZpbGUKaW5kZXggNTY2NTJjYy4uNDRhYjhmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlCkBAIC0xOCw2ICsxOCw3IEBACiB1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwKQkrPSBpc2QyMDAubwogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIpCSs9IGRhdGFmYWIubwogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UKQkrPSBqdW1wc2hvdC5vCit1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0gpCSs9IG9uZXRvdWNoLm8KIAogdXNiLXN0b3JhZ2Utb2JqcyA6PQlzY3NpZ2x1ZS5vIHByb3RvY29sLm8gdHJhbnNwb3J0Lm8gdXNiLm8gXAogCQkJaW5pdGlhbGl6ZXJzLm8gJCh1c2Itc3RvcmFnZS1vYmoteSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzk0MDJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vbmV0b3VjaC5jCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogU3VwcG9ydCBmb3IgdGhlIE1heHRvciBPbmVUb3VjaCBVU0IgaGFyZCBkcml2ZSdzIGJ1dHRvbgorICoKKyAqIEN1cnJlbnQgZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlIGJ5OgorICoJQ29weXJpZ2h0IChjKSAyMDA1IE5pY2sgU2lsbGlrIDxuLnNpbGxpa0B0ZW1wbGUuZWR1PgorICoKKyAqIEluaXRpYWwgd29yayBieToKKyAqIAlDb3B5cmlnaHQgKGMpIDIwMDMgRXJpayBUaHlyZW4gPGVydGg3NDExQHN0dWRlbnQudXUuc2U+CisgKgorICogQmFzZWQgb24gdXNibW91c2UuYyAoVm9qdGVjaCBQYXZsaWspIGFuZCB4cGFkLmMgKE1hcmtvIEZyaWVkZW1hbm4pCisgKgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2JfaW5wdXQuaD4KKyNpbmNsdWRlICJ1c2IuaCIKKyNpbmNsdWRlICJvbmV0b3VjaC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK3ZvaWQgb25ldG91Y2hfcmVsZWFzZV9pbnB1dCh2b2lkICpvbmV0b3VjaF8pOworCitzdHJ1Y3QgdXNiX29uZXRvdWNoIHsKKwljaGFyIG5hbWVbMTI4XTsKKwljaGFyIHBoeXNbNjRdOworCXN0cnVjdCBpbnB1dF9kZXYgZGV2OwkvKiBpbnB1dCBkZXZpY2UgaW50ZXJmYWNlICovCisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CS8qIHVzYiBkZXZpY2UgKi8KKworCXN0cnVjdCB1cmIgKmlycTsJLyogdXJiIGZvciBpbnRlcnJ1cHQgaW4gcmVwb3J0ICovCisJdW5zaWduZWQgY2hhciAqZGF0YTsJLyogaW5wdXQgZGF0YSAqLworCWRtYV9hZGRyX3QgZGF0YV9kbWE7Cit9OworCitzdGF0aWMgdm9pZCB1c2Jfb25ldG91Y2hfaXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHVzYl9vbmV0b3VjaCAqb25ldG91Y2ggPSB1cmItPmNvbnRleHQ7CisJc2lnbmVkIGNoYXIgKmRhdGEgPSBvbmV0b3VjaC0+ZGF0YTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSAmb25ldG91Y2gtPmRldjsKKwlpbnQgc3RhdHVzOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoJCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CS8qIHVubGluayAqLworCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCXJldHVybjsKKwkvKiAtRVBJUEU6ICBzaG91bGQgY2xlYXIgdGhlIGhhbHQgKi8KKwlkZWZhdWx0OgkJLyogZXJyb3IgKi8KKwkJZ290byByZXN1Ym1pdDsKKwl9CisKKwlpbnB1dF9yZWdzKGRldiwgcmVncyk7CisKKwlpbnB1dF9yZXBvcnRfa2V5KCZvbmV0b3VjaC0+ZGV2LCBPTkVUT1VDSF9CVVRUT04sCisJCQkgZGF0YVswXSAmIDB4MDIpOworCisJaW5wdXRfc3luYyhkZXYpOworcmVzdWJtaXQ6CisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgU0xBQl9BVE9NSUMpOworCWlmIChzdGF0dXMpCisJCWVyciAoImNhbid0IHJlc3VibWl0IGludHIsICVzLSVzL2lucHV0MCwgc3RhdHVzICVkIiwKKwkJCW9uZXRvdWNoLT51ZGV2LT5idXMtPmJ1c19uYW1lLAorCQkJb25ldG91Y2gtPnVkZXYtPmRldnBhdGgsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgdXNiX29uZXRvdWNoX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCB1c2Jfb25ldG91Y2ggKm9uZXRvdWNoID0gZGV2LT5wcml2YXRlOworCisJb25ldG91Y2gtPmlycS0+ZGV2ID0gb25ldG91Y2gtPnVkZXY7CisJaWYgKHVzYl9zdWJtaXRfdXJiKG9uZXRvdWNoLT5pcnEsIEdGUF9LRVJORUwpKSB7CisJCWVycigidXNiX3N1Ym1pdF91cmIgZmFpbGVkIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2Jfb25ldG91Y2hfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCB1c2Jfb25ldG91Y2ggKm9uZXRvdWNoID0gZGV2LT5wcml2YXRlOworCisJdXNiX2tpbGxfdXJiKG9uZXRvdWNoLT5pcnEpOworfQorCitpbnQgb25ldG91Y2hfY29ubmVjdF9pbnB1dChzdHJ1Y3QgdXNfZGF0YSAqc3MpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzcy0+cHVzYl9kZXY7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJc3RydWN0IHVzYl9vbmV0b3VjaCAqb25ldG91Y2g7CisJaW50IHBpcGUsIG1heHA7CisJY2hhciBwYXRoWzY0XTsKKworCWludGVyZmFjZSA9IHNzLT5wdXNiX2ludGYtPmN1cl9hbHRzZXR0aW5nOworCisJaWYgKGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IDMpCisJCXJldHVybiAtRU5PREVWOworCisJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFsyXS5kZXNjOworCWlmKCEoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykKKwkJCSE9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwaXBlID0gdXNiX3JjdmludHBpcGUodWRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCW1heHAgPSB1c2JfbWF4cGFja2V0KHVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKworCWlmICghKG9uZXRvdWNoID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHVzYl9vbmV0b3VjaCksIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvbmV0b3VjaC0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgT05FVE9VQ0hfUEtUX0xFTiwKKwkJCQkJICBTTEFCX0FUT01JQywgJm9uZXRvdWNoLT5kYXRhX2RtYSk7CisJaWYgKCFvbmV0b3VjaC0+ZGF0YSl7CisJCWtmcmVlKG9uZXRvdWNoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJb25ldG91Y2gtPmlycSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvbmV0b3VjaC0+aXJxKXsKKwkJa2ZyZWUob25ldG91Y2gpOworCQl1c2JfYnVmZmVyX2ZyZWUodWRldiwgT05FVE9VQ0hfUEtUX0xFTiwKKwkJCQlvbmV0b3VjaC0+ZGF0YSwgb25ldG91Y2gtPmRhdGFfZG1hKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisKKwlvbmV0b3VjaC0+dWRldiA9IHVkZXY7CisKKwlzZXRfYml0KEVWX0tFWSwgb25ldG91Y2gtPmRldi5ldmJpdCk7CisJc2V0X2JpdChPTkVUT1VDSF9CVVRUT04sIG9uZXRvdWNoLT5kZXYua2V5Yml0KTsKKwljbGVhcl9iaXQoMCwgb25ldG91Y2gtPmRldi5rZXliaXQpOworCisJb25ldG91Y2gtPmRldi5wcml2YXRlID0gb25ldG91Y2g7CisJb25ldG91Y2gtPmRldi5vcGVuID0gdXNiX29uZXRvdWNoX29wZW47CisJb25ldG91Y2gtPmRldi5jbG9zZSA9IHVzYl9vbmV0b3VjaF9jbG9zZTsKKworCXVzYl9tYWtlX3BhdGgodWRldiwgcGF0aCwgc2l6ZW9mKHBhdGgpKTsKKwlzcHJpbnRmKG9uZXRvdWNoLT5waHlzLCAiJXMvaW5wdXQwIiwgcGF0aCk7CisKKwlvbmV0b3VjaC0+ZGV2Lm5hbWUgPSBvbmV0b3VjaC0+bmFtZTsKKwlvbmV0b3VjaC0+ZGV2LnBoeXMgPSBvbmV0b3VjaC0+cGh5czsKKworCXVzYl90b19pbnB1dF9pZCh1ZGV2LCAmb25ldG91Y2gtPmRldi5pZCk7CisKKwlvbmV0b3VjaC0+ZGV2LmRldiA9ICZ1ZGV2LT5kZXY7CisKKwlpZiAodWRldi0+bWFudWZhY3R1cmVyKQorCQlzdHJjYXQob25ldG91Y2gtPm5hbWUsIHVkZXYtPm1hbnVmYWN0dXJlcik7CisJaWYgKHVkZXYtPnByb2R1Y3QpCisJCXNwcmludGYob25ldG91Y2gtPm5hbWUsICIlcyAlcyIsIG9uZXRvdWNoLT5uYW1lLAorCQkJdWRldi0+cHJvZHVjdCk7CisJaWYgKCFzdHJsZW4ob25ldG91Y2gtPm5hbWUpKQorCQlzcHJpbnRmKG9uZXRvdWNoLT5uYW1lLCAiTWF4dG9yIE9uZXRvdWNoICUwNHg6JTA0eCIsCisJCQlvbmV0b3VjaC0+ZGV2LmlkLnZlbmRvciwgb25ldG91Y2gtPmRldi5pZC5wcm9kdWN0KTsKKworCXVzYl9maWxsX2ludF91cmIob25ldG91Y2gtPmlycSwgdWRldiwgcGlwZSwgb25ldG91Y2gtPmRhdGEsCisJCQkgKG1heHAgPiA4ID8gOCA6IG1heHApLAorCQkJIHVzYl9vbmV0b3VjaF9pcnEsIG9uZXRvdWNoLCBlbmRwb2ludC0+YkludGVydmFsKTsKKwlvbmV0b3VjaC0+aXJxLT50cmFuc2Zlcl9kbWEgPSBvbmV0b3VjaC0+ZGF0YV9kbWE7CisJb25ldG91Y2gtPmlycS0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwlzcy0+ZXh0cmFfZGVzdHJ1Y3RvciA9IG9uZXRvdWNoX3JlbGVhc2VfaW5wdXQ7CisJc3MtPmV4dHJhID0gb25ldG91Y2g7CisKKwlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJm9uZXRvdWNoLT5kZXYpOworCXByaW50ayhLRVJOX0lORk8gInVzYi1pbnB1dDogJXMgb24gJXNcbiIsIG9uZXRvdWNoLT5kZXYubmFtZSwgcGF0aCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBvbmV0b3VjaF9yZWxlYXNlX2lucHV0KHZvaWQgKm9uZXRvdWNoXykKK3sKKwlzdHJ1Y3QgdXNiX29uZXRvdWNoICpvbmV0b3VjaCA9IChzdHJ1Y3QgdXNiX29uZXRvdWNoICopIG9uZXRvdWNoXzsKKworCWlmIChvbmV0b3VjaCkgeworCQl1c2Jfa2lsbF91cmIob25ldG91Y2gtPmlycSk7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZvbmV0b3VjaC0+ZGV2KTsKKwkJdXNiX2ZyZWVfdXJiKG9uZXRvdWNoLT5pcnEpOworCQl1c2JfYnVmZmVyX2ZyZWUob25ldG91Y2gtPnVkZXYsIE9ORVRPVUNIX1BLVF9MRU4sCisJCQkJb25ldG91Y2gtPmRhdGEsIG9uZXRvdWNoLT5kYXRhX2RtYSk7CisJCXByaW50ayhLRVJOX0lORk8gInVzYi1pbnB1dDogZGVyZWdpc3RlcmluZyAlc1xuIiwKKwkJCQlvbmV0b3VjaC0+ZGV2Lm5hbWUpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWM3YWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vbmV0b3VjaC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfT05FVE9VQ0hfSF8KKyNkZWZpbmUgX09ORVRPVUNIX0hfCisKKyNkZWZpbmUgT05FVE9VQ0hfUEtUX0xFTiAgICAgICAgMHgwMgorI2RlZmluZSBPTkVUT1VDSF9CVVRUT04gICAgICAgICBLRVlfUFJPRzEKKworaW50IG9uZXRvdWNoX2Nvbm5lY3RfaW5wdXQoc3RydWN0IHVzX2RhdGEgKnNzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKaW5kZXggYWYyOTRiYi4uZDM0ZGM5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYwpAQCAtMTU2LDYgKzE1NiwxNCBAQAogCQlpZiAodXMtPmZsYWdzICYgVVNfRkxfRklYX0NBUEFDSVRZKQogCQkJc2Rldi0+Zml4X2NhcGFjaXR5ID0gMTsKIAorCQkvKiBTb21lIGRldmljZXMgcmVwb3J0IGEgU0NTSSByZXZpc2lvbiBsZXZlbCBhYm92ZSAyIGJ1dCBhcmUKKwkJICogdW5hYmxlIHRvIGhhbmRsZSB0aGUgUkVQT1JUIExVTlMgY29tbWFuZCAoZm9yIHdoaWNoCisJCSAqIHN1cHBvcnQgaXMgbWFuZGF0b3J5IGF0IGxldmVsIDMpLiAgU2luY2Ugd2UgYWxyZWFkeSBoYXZlCisJCSAqIGEgR2V0LU1heC1MVU4gcmVxdWVzdCwgd2Ugd29uJ3QgbG9zZSBtdWNoIGJ5IHNldHRpbmcgdGhlCisJCSAqIHJldmlzaW9uIGxldmVsIGRvd24gdG8gMi4gIFRoZSBvbmx5IGRldmljZXMgdGhhdCB3b3VsZCBiZQorCQkgKiBhZmZlY3RlZCBhcmUgdGhvc2Ugd2l0aCBzcGFyc2UgTFVOcy4gKi8KKwkJc2Rldi0+c2NzaV9sZXZlbCA9IFNDU0lfMjsKKwogCQkvKiBVU0ItSURFIGJyaWRnZXMgdGVuZCB0byByZXBvcnQgU0sgPSAweDA0IChOb24tcmVjb3ZlcmFibGUKIAkJICogSGFyZHdhcmUgRXJyb3IpIHdoZW4gYW55IGxvdy1sZXZlbCBlcnJvciBvY2N1cnMsCiAJCSAqIHJlY292ZXJhYmxlIG9yIG5vdC4gIFNldHRpbmcgdGhpcyBmbGFnIHRlbGxzIHRoZSBTQ1NJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3NodXR0bGVfdXNiYXQuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2h1dHRsZV91c2JhdC5jCmluZGV4IGYzYjYwMjguLjM1NjM0MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2h1dHRsZV91c2JhdC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2h1dHRsZV91c2JhdC5jCkBAIC04MzksMzQgKzgzOSwzMSBAQAogCXJjID0gdXNiYXRfZGV2aWNlX3Jlc2V0KHVzKTsKIAlpZiAocmMgIT0gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0QpCiAJCXJldHVybiByYzsKKwltc2xlZXAoMjUpOwogCiAJLyoKLQkgKiBCeSBleGFtaW5pbmcgdGhlIGRldmljZSBzaWduYXR1cmUgYWZ0ZXIgYSByZXNldCwgd2UgY2FuIGlkZW50aWZ5Ci0JICogd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZSBBVEFQSSBwYWNrZXQgaW50ZXJmYWNlLgotCSAqIFRoZSBmbGFzaC1kZXZpY2VzIGRvIG5vdCBzdXBwb3J0IHRoaXMsIHdoZXJlYXMgdGhlIEhQIENEUlcncyBvYnZpb3VzbHkKLQkgKiBkby4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBpZGVhbCwgYnV0IHdvcmtzIGJlY2F1c2Ugbm8gb3RoZXIgZGV2aWNlcyBoYXZlIGJlZW4KLQkgKiBwcm9kdWNlZCBiYXNlZCBvbiB0aGUgVVNCQVQvVVNCQVQwMi4KLQkgKgotCSAqIFNlY3Rpb24gOS4xIG9mIHRoZSBBVEFQSS00IHNwZWMgc3RhdGVzIChhbW9uZ3N0IG90aGVyIHRoaW5ncykgdGhhdAotCSAqIGFmdGVyIGEgZGV2aWNlIHJlc2V0LCBhIEN5bGluZGVyIGxvdyBvZiAweDE0IGluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UKLQkgKiBkb2VzIHN1cHBvcnQgcGFja2V0IGNvbW1hbmRzLgorCSAqIEluIGF0dGVtcHQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBIUCBDRFJXJ3MgYW5kIEZsYXNoIHJlYWRlcnMsIHdlIG5vdworCSAqIGV4ZWN1dGUgdGhlIElERU5USUZZIFBBQ0tFVCBERVZJQ0UgY29tbWFuZC4gT24gQVRBIGRldmljZXMgKGkuZS4gZmxhc2gKKwkgKiByZWFkZXJzKSwgdGhpcyBjb21tYW5kIHNob3VsZCBmYWlsIHdpdGggZXJyb3IuIE9uIEFUQVBJIGRldmljZXMgKGkuZS4KKwkgKiBDRFJPTSBkcml2ZXMpLCBpdCBzaG91bGQgc3VjY2VlZC4KIAkgKi8KLQlyYyA9IHVzYmF0X3JlYWQodXMsIFVTQkFUX0FUQSwgVVNCQVRfQVRBX0xCQV9NRSwgJnN0YXR1cyk7Ci0JaWYgKHJjICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKKwlyYyA9IHVzYmF0X3dyaXRlKHVzLCBVU0JBVF9BVEEsIFVTQkFUX0FUQV9DTUQsIDB4QTEpOworIAlpZiAocmMgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQorIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAotCVVTX0RFQlVHUCgidXNiYXRfaWRlbnRpZnlfZGV2aWNlOiBDeWxpbmRlciBsb3cgaXMgJTAyWFxuIiwgc3RhdHVzKTsKKwlyYyA9IHVzYmF0X2dldF9zdGF0dXModXMsICZzdGF0dXMpOworIAlpZiAocmMgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQorIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAotCWlmIChzdGF0dXMgPT0gMHgxNCkgeworCS8vIENoZWNrIGZvciBlcnJvciBiaXQKKwlpZiAoc3RhdHVzICYgMHgwMSkgeworCQkgLy8gRGV2aWNlIGlzIGEgQ29tcGFjdEZsYXNoIHJlYWRlci93cml0ZXIKKwkJVVNfREVCVUdQKCJ1c2JhdF9pZGVudGlmeV9kZXZpY2U6IERldGVjdGVkIEZsYXNoIHJlYWRlci93cml0ZXJcbiIpOworCQlpbmZvLT5kZXZpY2V0eXBlID0gVVNCQVRfREVWX0ZMQVNIOworCX0gZWxzZSB7CiAJCS8vIERldmljZSBpcyBIUCA4MjAwCiAJCVVTX0RFQlVHUCgidXNiYXRfaWRlbnRpZnlfZGV2aWNlOiBEZXRlY3RlZCBIUDgyMDAgQ0RSV1xuIik7CiAJCWluZm8tPmRldmljZXR5cGUgPSBVU0JBVF9ERVZfSFA4MjAwOwotCX0gZWxzZSB7Ci0JCS8vIERldmljZSBpcyBhIENvbXBhY3RGbGFzaCByZWFkZXIvd3JpdGVyCi0JCVVTX0RFQlVHUCgidXNiYXRfaWRlbnRpZnlfZGV2aWNlOiBEZXRlY3RlZCBGbGFzaCByZWFkZXIvd3JpdGVyXG4iKTsKLQkJaW5mby0+ZGV2aWNldHlwZSA9IFVTQkFUX0RFVl9GTEFTSDsKIAl9CiAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CkBAIC0xMjM5LDE2ICsxMjM2LDEwIEBACiB7CiAJaW50IHNlbGVjdG9yOwogCXVuc2lnbmVkIGNoYXIgKnN0YXR1cyA9IHVzLT5pb2J1ZjsKLQl1bnNpZ25lZCBjaGFyIG1heF9zZWxlY3RvciA9IDB4QjA7Ci0JaWYgKHVzYmF0X2dldF9kZXZpY2VfdHlwZSh1cykgPT0gVVNCQVRfREVWX0ZMQVNIKQotCQltYXhfc2VsZWN0b3IgPSAweEEwOwogCiAJLy8gdHJ5IGRldmljZSA9IG1hc3RlciwgdGhlbiBkZXZpY2UgPSBzbGF2ZS4KLQotCWZvciAoc2VsZWN0b3IgPSAweEEwOyBzZWxlY3RvciA8PSBtYXhfc2VsZWN0b3I7IHNlbGVjdG9yICs9IDB4MTApIHsKLQotCQlpZiAodXNiYXRfZ2V0X2RldmljZV90eXBlKHVzKSA9PSBVU0JBVF9ERVZfSFA4MjAwICYmCi0JCQl1c2JhdF93cml0ZSh1cywgVVNCQVRfQVRBLCBVU0JBVF9BVEFfREVWSUNFLCBzZWxlY3RvcikgIT0gCisJZm9yIChzZWxlY3RvciA9IDB4QTA7IHNlbGVjdG9yIDw9IDB4QjA7IHNlbGVjdG9yICs9IDB4MTApIHsKKwkJaWYgKHVzYmF0X3dyaXRlKHVzLCBVU0JBVF9BVEEsIFVTQkFUX0FUQV9ERVZJQ0UsIHNlbGVjdG9yKSAhPQogCQkJCVVTQl9TVE9SX1hGRVJfR09PRCkKIAkJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKQEAgLTEzMzQsNjAgKzEzMjUsMzAgQEAKIAogCVVTX0RFQlVHUCgiSU5JVCAzXG4iKTsKIAotCS8vIEF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gZGV0ZWN0IHdoaWNoIGRldmljZSB3ZSBhcmUgdXNpbmcKLQlpZiAodXNiYXRfc2V0X3RyYW5zcG9ydCh1cywgaW5mbykpCi0JCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Ci0KLQlVU19ERUJVR1AoIklOSVQgNFxuIik7Ci0KLQlpZiAodXNiYXRfZ2V0X2RldmljZV90eXBlKHVzKSA9PSBVU0JBVF9ERVZfSFA4MjAwKSB7Ci0JCW1zbGVlcCgyNTApOwotCi0JCS8vIFdyaXRlIDB4ODAgdG8gSVNBIHBvcnQgMHgzRgotCQlyYyA9IHVzYmF0X3dyaXRlKHVzLCBVU0JBVF9JU0EsIDB4M0YsIDB4ODApOwotCQlpZiAocmMgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQotCQlVU19ERUJVR1AoIklOSVQgNVxuIik7Ci0KLQkJLy8gUmVhZCBJU0EgcG9ydCAweDI3Ci0JCXJjID0gdXNiYXRfcmVhZCh1cywgVVNCQVRfSVNBLCAweDI3LCBzdGF0dXMpOwotCQlpZiAocmMgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQotCQlVU19ERUJVR1AoIklOSVQgNlxuIik7Ci0KLQkJcmMgPSB1c2JhdF9yZWFkX3VzZXJfaW8odXMsIHN0YXR1cyk7Ci0JCWlmIChyYyAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwotCi0JCVVTX0RFQlVHUCgiSU5JVCA3XG4iKTsKLQl9Ci0KIAlyYyA9IHVzYmF0X3NlbGVjdF9hbmRfdGVzdF9yZWdpc3RlcnModXMpOwogCWlmIChyYyAhPSBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRCkKIAkJcmV0dXJuIHJjOwogCi0JVVNfREVCVUdQKCJJTklUIDhcbiIpOworCVVTX0RFQlVHUCgiSU5JVCA0XG4iKTsKIAogCXJjID0gdXNiYXRfcmVhZF91c2VyX2lvKHVzLCBzdGF0dXMpOwogCWlmIChyYyAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKLQlVU19ERUJVR1AoIklOSVQgOVxuIik7CisJVVNfREVCVUdQKCJJTklUIDVcbiIpOwogCiAJLy8gRW5hYmxlIHBlcmlwaGVyYWwgY29udHJvbCBzaWduYWxzIGFuZCBjYXJkIGRldGVjdAogCXJjID0gdXNiYXRfZGV2aWNlX2VuYWJsZV9jZHQodXMpOwogCWlmIChyYyAhPSBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRCkKIAkJcmV0dXJuIHJjOwogCi0JVVNfREVCVUdQKCJJTklUIDEwXG4iKTsKKwlVU19ERUJVR1AoIklOSVQgNlxuIik7CiAKIAlyYyA9IHVzYmF0X3JlYWRfdXNlcl9pbyh1cywgc3RhdHVzKTsKIAlpZiAocmMgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCi0JVVNfREVCVUdQKCJJTklUIDExXG4iKTsKKwlVU19ERUJVR1AoIklOSVQgN1xuIik7CiAKIAltc2xlZXAoMTQwMCk7CiAKQEAgLTEzOTUsMTMgKzEzNTYsMTkgQEAKIAlpZiAocmMgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCi0JVVNfREVCVUdQKCJJTklUIDEyXG4iKTsKKwlVU19ERUJVR1AoIklOSVQgOFxuIik7CiAKIAlyYyA9IHVzYmF0X3NlbGVjdF9hbmRfdGVzdF9yZWdpc3RlcnModXMpOwogCWlmIChyYyAhPSBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRCkKIAkJcmV0dXJuIHJjOwogCi0JVVNfREVCVUdQKCJJTklUIDEzXG4iKTsKKwlVU19ERUJVR1AoIklOSVQgOVxuIik7CisKKwkvLyBBdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIGRldGVjdCB3aGljaCBkZXZpY2Ugd2UgYXJlIHVzaW5nCisJaWYgKHVzYmF0X3NldF90cmFuc3BvcnQodXMsIGluZm8pKQorCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOworCisJVVNfREVCVUdQKCJJTklUIDEwXG4iKTsKIAogCWlmICh1c2JhdF9nZXRfZGV2aWNlX3R5cGUodXMpID09IFVTQkFUX0RFVl9GTEFTSCkgeyAKIAkJc3ViY291bnRIID0gMHgwMjsKQEAgLTE0MTIsNyArMTM3OSw3IEBACiAJaWYgKHJjICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAotCVVTX0RFQlVHUCgiSU5JVCAxNFxuIik7CisJVVNfREVCVUdQKCJJTklUIDExXG4iKTsKIAogCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCmluZGV4IGU2YjFjNmMuLmMxYmE1MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwpAQCAtOTYsOCArOTYsOCBAQAogICogb3IgYmVmb3JlIHRoZSBVUkJfQUNUSVZFIGJpdCB3YXMgc2V0LiAgSWYgc28sIGl0J3MgZXNzZW50aWFsIHRvIGNhbmNlbAogICogdGhlIFVSQiBpZiBpdCBoYXNuJ3QgYmVlbiBjYW5jZWxsZWQgYWxyZWFkeSAoaS5lLiwgaWYgdGhlIFVSQl9BQ1RJVkUgYml0CiAgKiBpcyBzdGlsbCBzZXQpLiAgRWl0aGVyIHdheSwgdGhlIGZ1bmN0aW9uIG11c3QgdGhlbiB3YWl0IGZvciB0aGUgVVJCIHRvCi0gKiBmaW5pc2guICBOb3RlIHRoYXQgYmVjYXVzZSB0aGUgVVJCX0FTWU5DX1VOTElOSyBmbGFnIGlzIHNldCwgdGhlIFVSQiBjYW4KLSAqIHN0aWxsIGJlIGluIHByb2dyZXNzIGV2ZW4gYWZ0ZXIgYSBjYWxsIHRvIHVzYl91bmxpbmtfdXJiKCkgcmV0dXJucy4KKyAqIGZpbmlzaC4gIE5vdGUgdGhhdCB0aGUgVVJCIGNhbiBzdGlsbCBiZSBpbiBwcm9ncmVzcyBldmVuIGFmdGVyIGEgY2FsbCB0bworICogdXNiX3VubGlua191cmIoKSByZXR1cm5zLgogICoKICAqIFRoZSBpZGVhIGlzIHRoYXQgKDEpIG9uY2UgdGhlIEFCT1JUSU5HIG9yIERJU0NPTk5FQ1RJTkcgYml0IGlzIHNldCwKICAqIGVpdGhlciB0aGUgc3RvcF90cmFuc3BvcnQoKSBmdW5jdGlvbiBvciB0aGUgc3VibWl0dGluZyBmdW5jdGlvbgpAQCAtMTU4LDggKzE1OCw3IEBACiAJICogaGFzbid0IGJlZW4gbWFwcGVkIGZvciBETUEuICBZZXMsIHRoaXMgaXMgY2x1bmt5LCBidXQgaXQncwogCSAqIGVhc2llciB0aGFuIGFsd2F5cyBoYXZpbmcgdGhlIGNhbGxlciB0ZWxsIHVzIHdoZXRoZXIgdGhlCiAJICogdHJhbnNmZXIgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gbWFwcGVkLiAqLwotCXVzLT5jdXJyZW50X3VyYi0+dHJhbnNmZXJfZmxhZ3MgPQotCQkJVVJCX0FTWU5DX1VOTElOSyB8IFVSQl9OT19TRVRVUF9ETUFfTUFQOworCXVzLT5jdXJyZW50X3VyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfTk9fU0VUVVBfRE1BX01BUDsKIAlpZiAodXMtPmN1cnJlbnRfdXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gdXMtPmlvYnVmKQogCQl1cy0+Y3VycmVudF91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCXVzLT5jdXJyZW50X3VyYi0+dHJhbnNmZXJfZG1hID0gdXMtPmlvYnVmX2RtYTsKQEAgLTYxMSw3ICs2MTAsNiBAQAogCQl1bnNpZ25lZCBjaGFyIG9sZF9zY19kYXRhX2RpcmVjdGlvbjsKIAkJdW5zaWduZWQgY2hhciBvbGRfY21kX2xlbjsKIAkJdW5zaWduZWQgY2hhciBvbGRfY21uZFtNQVhfQ09NTUFORF9TSVpFXTsKLQkJdW5zaWduZWQgbG9uZyBvbGRfc2VyaWFsX251bWJlcjsKIAkJaW50IG9sZF9yZXNpZDsKIAogCQlVU19ERUJVR1AoIklzc3VpbmcgYXV0by1SRVFVRVNUX1NFTlNFXG4iKTsKQEAgLTY0OCwxMCArNjQ2LDYgQEAKIAkJb2xkX3NnID0gc3JiLT51c2Vfc2c7CiAJCXNyYi0+dXNlX3NnID0gMDsKIAotCQkvKiBjaGFuZ2UgdGhlIHNlcmlhbCBudW1iZXIgLS0gdG9nZ2xlIHRoZSBoaWdoIGJpdCovCi0JCW9sZF9zZXJpYWxfbnVtYmVyID0gc3JiLT5zZXJpYWxfbnVtYmVyOwotCQlzcmItPnNlcmlhbF9udW1iZXIgXj0gMHg4MDAwMDAwMDsKLQogCQkvKiBpc3N1ZSB0aGUgYXV0by1zZW5zZSBjb21tYW5kICovCiAJCW9sZF9yZXNpZCA9IHNyYi0+cmVzaWQ7CiAJCXNyYi0+cmVzaWQgPSAwOwpAQCAtNjYyLDcgKzY1Niw2IEBACiAJCXNyYi0+cmVxdWVzdF9idWZmZXIgPSBvbGRfcmVxdWVzdF9idWZmZXI7CiAJCXNyYi0+cmVxdWVzdF9idWZmbGVuID0gb2xkX3JlcXVlc3RfYnVmZmxlbjsKIAkJc3JiLT51c2Vfc2cgPSBvbGRfc2c7Ci0JCXNyYi0+c2VyaWFsX251bWJlciA9IG9sZF9zZXJpYWxfbnVtYmVyOwogCQlzcmItPnNjX2RhdGFfZGlyZWN0aW9uID0gb2xkX3NjX2RhdGFfZGlyZWN0aW9uOwogCQlzcmItPmNtZF9sZW4gPSBvbGRfY21kX2xlbjsKIAkJbWVtY3B5KHNyYi0+Y21uZCwgb2xkX2NtbmQsIE1BWF9DT01NQU5EX1NJWkUpOwpAQCAtOTg1LDcgKzk3OCw3IEBACiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwogCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoID0gY3B1X3RvX2xlMzIodHJhbnNmZXJfbGVuZ3RoKTsKIAliY2ItPkZsYWdzID0gc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UgPyAxIDw8IDcgOiAwOwotCWJjYi0+VGFnID0gc3JiLT5zZXJpYWxfbnVtYmVyOworCWJjYi0+VGFnID0gKyt1cy0+dGFnOwogCWJjYi0+THVuID0gc3JiLT5kZXZpY2UtPmx1bjsKIAlpZiAodXMtPmZsYWdzICYgVVNfRkxfU0NNX01VTFRfVEFSRykKIAkJYmNiLT5MdW4gfD0gc3JiLT5kZXZpY2UtPmlkIDw8IDQ7CkBAIC0xMDc0LDcgKzEwNjcsNyBAQAogCVVTX0RFQlVHUCgiQnVsayBTdGF0dXMgUyAweCV4IFQgMHgleCBSICV1IFN0YXQgMHgleFxuIiwKIAkJCWxlMzJfdG9fY3B1KGJjcy0+U2lnbmF0dXJlKSwgYmNzLT5UYWcsIAogCQkJcmVzaWR1ZSwgYmNzLT5TdGF0dXMpOwotCWlmIChiY3MtPlRhZyAhPSBzcmItPnNlcmlhbF9udW1iZXIgfHwgYmNzLT5TdGF0dXMgPiBVU19CVUxLX1NUQVRfUEhBU0UpIHsKKwlpZiAoYmNzLT5UYWcgIT0gdXMtPnRhZyB8fCBiY3MtPlN0YXR1cyA+IFVTX0JVTEtfU1RBVF9QSEFTRSkgewogCQlVU19ERUJVR1AoIkJ1bGsgbG9naWNhbCBlcnJvclxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKaW5kZXggYmQwYWIzMC4uYWQwY2ZkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCkBAIC03OSw2ICs3OSwxMyBAQAogCQlVU19TQ184MDcwLCBVU19QUl9TQ01fQVRBUEksIGluaXRfdXNiYXQsIDApLCAKICNlbmRpZgogCisvKiBQYXRjaCBzdWJtaXR0ZWQgYnkgTWlobmVhLUNvc3RpbiBHcmlnb3JlIDxtaWhuZWFAenVsdS5ybz4gKi8KK1VOVVNVQUxfREVWKCAgMHgwNDBkLCAweDYyMDUsIDB4MDAwMywgMHgwMDAzLAorCQkiVklBIFRlY2hub2xvZ2llcyBJbmMuIiwKKwkJIlVTQiAyLjAgQ2FyZCBSZWFkZXIiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfSUdOT1JFX1JFU0lEVUUgKSwKKwogLyogRGVkdWNlZCBieSBKb25hdGhhbiBXb2l0aGUgPGp3b2l0aGVAcGh5c2ljcy5hZGVsYWlkZS5lZHUuYXU+CiAgKiBFbnRyeSBuZWVkZWQgZm9yIGZsYWdzOiBVU19GTF9GSVhfSU5RVUlSWSBiZWNhdXNlIGluaXRpYWwgaW5xdWlyeSBtZXNzYWdlCiAgKiBhbHdheXMgZmFpbHMgYW5kIGNvbmZ1c2VzIGRyaXZlLgpAQCAtOTI5LDYgKzkzNiwxOCBAQAogCSAgICAgICBVU19GTF9TSU5HTEVfTFVOICksCiAjZW5kaWYKIAorLyogU3VibWl0dGVkIGJ5OiBOaWNrIFNpbGxpayA8bi5zaWxsaWtAdGVtcGxlLmVkdT4KKyAqIE5lZWRlZCBmb3IgT25lVG91Y2ggZXh0ZW5zaW9uIHRvIHVzYi1zdG9yYWdlCisgKgorICovCisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX09ORVRPVUNICisJVU5VU1VBTF9ERVYoICAweDBkNDksIDB4NzAxMCwgMHgwMDAwLCAweDk5OTksCisJCQkiTWF4dG9yIiwKKwkJCSJPbmVUb3VjaCBFeHRlcm5hbCBIYXJkZHJpdmUiLAorCQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIG9uZXRvdWNoX2Nvbm5lY3RfaW5wdXQsCisJCQkwKSwKKyNlbmRpZgorCiAvKiBTdWJtaXR0ZWQgYnkgSm9yaXMgU3RydXl2ZSA8am9yaXNAc3RydXl2ZS5iZT4gKi8KIFVOVVNVQUxfREVWKCAweDBkOTYsIDB4NDEwYSwgMHgwMDAxLCAweGZmZmYsCiAJCSJNZWRpb24iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKaW5kZXggNzdlN2ZjMi4uY2I0Yzc3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCkBAIC05MCw3ICs5MCw5IEBACiAjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UCiAjaW5jbHVkZSAianVtcHNob3QuaCIKICNlbmRpZgotCisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX09ORVRPVUNICisjaW5jbHVkZSAib25ldG91Y2guaCIKKyNlbmRpZgogCiAvKiBTb21lIGluZm9ybWF0aW9uYWwgZGF0YSAqLwogTU9EVUxFX0FVVEhPUigiTWF0dGhldyBEaGFybSA8bWRoYXJtLXVzYkBvbmUtZXllZC1hbGllbi5uZXQ+Iik7CkBAIC03ODYsNiArNzg4LDcgQEAKIAkgKiBhbnkgbW9yZSBjb21tYW5kcy4KIAkgKi8KIAlVU19ERUJVR1AoIi0tIHNlbmRpbmcgZXhpdCBjb21tYW5kIHRvIHRocmVhZFxuIik7CisJc2V0X2JpdChVU19GTElEWF9ESVNDT05ORUNUSU5HLCAmdXMtPmZsYWdzKTsKIAl1cCgmdXMtPnNlbWEpOwogCiAJLyogQ2FsbCB0aGUgZGVzdHJ1Y3RvciByb3V0aW5lLCBpZiBpdCBleGlzdHMgKi8KQEAgLTgxNiw2ICs4MTksNDkgQEAKIAl1c2Jfc2V0X2ludGZkYXRhKHVzLT5wdXNiX2ludGYsIE5VTEwpOwogfQogCisvKiBGaXJzdCBzdGFnZSBvZiBkaXNjb25uZWN0IHByb2Nlc3Npbmc6IHN0b3AgYWxsIGNvbW1hbmRzIGFuZCByZW1vdmUKKyAqIHRoZSBob3N0ICovCitzdGF0aWMgdm9pZCBxdWllc2NlX2FuZF9yZW1vdmVfaG9zdChzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJLyogUHJldmVudCBuZXcgVVNCIHRyYW5zZmVycywgc3RvcCB0aGUgY3VycmVudCBjb21tYW5kLCBhbmQKKwkgKiBpbnRlcnJ1cHQgYSBTQ1NJLXNjYW4gb3IgZGV2aWNlLXJlc2V0IGRlbGF5ICovCisJc2V0X2JpdChVU19GTElEWF9ESVNDT05ORUNUSU5HLCAmdXMtPmZsYWdzKTsKKwl1c2Jfc3Rvcl9zdG9wX3RyYW5zcG9ydCh1cyk7CisJd2FrZV91cCgmdXMtPmRlbGF5X3dhaXQpOworCisJLyogSXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIFNDU0ktc2Nhbm5pbmcgdGhyZWFkIGlzIHN0aWxsIHJ1bm5pbmcuCisJICogVGhlIHRocmVhZCB3aWxsIGV4aXQgd2hlbiBpdCBzZWVzIHRoZSBESVNDT05ORUNUSU5HIGZsYWcuICovCisKKwkvKiBXYWl0IGZvciB0aGUgY3VycmVudCBjb21tYW5kIHRvIGZpbmlzaCwgdGhlbiByZW1vdmUgdGhlIGhvc3QgKi8KKwlkb3duKCZ1cy0+ZGV2X3NlbWFwaG9yZSk7CisJdXAoJnVzLT5kZXZfc2VtYXBob3JlKTsKKworCS8qIHF1ZXVlY29tbWFuZCB3b24ndCBhY2NlcHQgYW55IG5ldyBjb21tYW5kcyBhbmQgdGhlIGNvbnRyb2wKKwkgKiB0aHJlYWQgd29uJ3QgZXhlY3V0ZSBhIHByZXZpb3VzbHktcXVldWVkIGNvbW1hbmQuICBJZiB0aGVyZQorCSAqIGlzIHN1Y2ggYSBjb21tYW5kIHBlbmRpbmcsIGNvbXBsZXRlIGl0IHdpdGggYW4gZXJyb3IuICovCisJaWYgKHVzLT5zcmIpIHsKKwkJdXMtPnNyYi0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCXNjc2lfbG9jayh1c190b19ob3N0KHVzKSk7CisJCXVzLT5zcmItPnNjc2lfZG9uZSh1cy0+c3JiKTsKKwkJdXMtPnNyYiA9IE5VTEw7CisJCXNjc2lfdW5sb2NrKHVzX3RvX2hvc3QodXMpKTsKKwl9CisKKwkvKiBOb3cgd2Ugb3duIG5vIGNvbW1hbmRzIHNvIGl0J3Mgc2FmZSB0byByZW1vdmUgdGhlIFNDU0kgaG9zdCAqLworCXNjc2lfcmVtb3ZlX2hvc3QodXNfdG9faG9zdCh1cykpOworfQorCisvKiBTZWNvbmQgc3RhZ2Ugb2YgZGlzY29ubmVjdCBwcm9jZXNzaW5nOiBkZWFsbG9jYXRlIGFsbCByZXNvdXJjZXMgKi8KK3N0YXRpYyB2b2lkIHJlbGVhc2VfZXZlcnl0aGluZyhzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJdXNiX3N0b3JfcmVsZWFzZV9yZXNvdXJjZXModXMpOworCWRpc3NvY2lhdGVfZGV2KHVzKTsKKworCS8qIERyb3Agb3VyIHJlZmVyZW5jZSB0byB0aGUgaG9zdDsgdGhlIFNDU0kgY29yZSB3aWxsIGZyZWUgaXQKKwkgKiAoYW5kICJ1cyIgYWxvbmcgd2l0aCBpdCkgd2hlbiB0aGUgcmVmY291bnQgYmVjb21lcyAwLiAqLworCXNjc2lfaG9zdF9wdXQodXNfdG9faG9zdCh1cykpOworfQorCiAvKiBUaHJlYWQgdG8gY2Fycnkgb3V0IGRlbGF5ZWQgU0NTSS1kZXZpY2Ugc2Nhbm5pbmcgKi8KIHN0YXRpYyBpbnQgdXNiX3N0b3Jfc2Nhbl90aHJlYWQodm9pZCAqIF9fdXMpCiB7CkBAIC05NTYsNyArMTAwMiw3IEBACiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBVU0JfU1RPUkFHRSAKIAkJICAgICAgICJVbmFibGUgdG8gc3RhcnQgdGhlIGRldmljZS1zY2FubmluZyB0aHJlYWRcbiIpOwotCQlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCQlxdWllc2NlX2FuZF9yZW1vdmVfaG9zdCh1cyk7CiAJCWdvdG8gQmFkRGV2aWNlOwogCX0KIAlhdG9taWNfaW5jKCZ0b3RhbF90aHJlYWRzKTsKQEAgLTk2OSwxMCArMTAxNSw3IEBACiAJLyogV2UgY29tZSBoZXJlIGlmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMgKi8KIEJhZERldmljZToKIAlVU19ERUJVR1AoInN0b3JhZ2VfcHJvYmUoKSBmYWlsZWRcbiIpOwotCXNldF9iaXQoVVNfRkxJRFhfRElTQ09OTkVDVElORywgJnVzLT5mbGFncyk7Ci0JdXNiX3N0b3JfcmVsZWFzZV9yZXNvdXJjZXModXMpOwotCWRpc3NvY2lhdGVfZGV2KHVzKTsKLQlzY3NpX2hvc3RfcHV0KGhvc3QpOworCXJlbGVhc2VfZXZlcnl0aGluZyh1cyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtOTgyLDI4ICsxMDI1LDggQEAKIAlzdHJ1Y3QgdXNfZGF0YSAqdXMgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCiAJVVNfREVCVUdQKCJzdG9yYWdlX2Rpc2Nvbm5lY3QoKSBjYWxsZWRcbiIpOwotCi0JLyogUHJldmVudCBuZXcgVVNCIHRyYW5zZmVycywgc3RvcCB0aGUgY3VycmVudCBjb21tYW5kLCBhbmQKLQkgKiBpbnRlcnJ1cHQgYSBTQ1NJLXNjYW4gb3IgZGV2aWNlLXJlc2V0IGRlbGF5ICovCi0Jc2V0X2JpdChVU19GTElEWF9ESVNDT05ORUNUSU5HLCAmdXMtPmZsYWdzKTsKLQl1c2Jfc3Rvcl9zdG9wX3RyYW5zcG9ydCh1cyk7Ci0Jd2FrZV91cCgmdXMtPmRlbGF5X3dhaXQpOwotCi0JLyogSXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIFNDU0ktc2Nhbm5pbmcgdGhyZWFkIGlzIHN0aWxsIHJ1bm5pbmcuCi0JICogVGhlIHRocmVhZCB3aWxsIGV4aXQgd2hlbiBpdCBzZWVzIHRoZSBESVNDT05ORUNUSU5HIGZsYWcuICovCi0KLQkvKiBXYWl0IGZvciB0aGUgY3VycmVudCBjb21tYW5kIHRvIGZpbmlzaCwgdGhlbiByZW1vdmUgdGhlIGhvc3QgKi8KLQlkb3duKCZ1cy0+ZGV2X3NlbWFwaG9yZSk7Ci0JdXAoJnVzLT5kZXZfc2VtYXBob3JlKTsKLQlzY3NpX3JlbW92ZV9ob3N0KHVzX3RvX2hvc3QodXMpKTsKLQotCS8qIFdhaXQgZm9yIGV2ZXJ5dGhpbmcgdG8gYmVjb21lIGlkbGUgYW5kIHJlbGVhc2UgYWxsIG91ciByZXNvdXJjZXMgKi8KLQl1c2Jfc3Rvcl9yZWxlYXNlX3Jlc291cmNlcyh1cyk7Ci0JZGlzc29jaWF0ZV9kZXYodXMpOwotCi0JLyogRHJvcCBvdXIgcmVmZXJlbmNlIHRvIHRoZSBob3N0OyB0aGUgU0NTSSBjb3JlIHdpbGwgZnJlZSBpdAotCSAqIChhbmQgInVzIiBhbG9uZyB3aXRoIGl0KSB3aGVuIHRoZSByZWZjb3VudCBiZWNvbWVzIDAuICovCi0Jc2NzaV9ob3N0X3B1dCh1c190b19ob3N0KHVzKSk7CisJcXVpZXNjZV9hbmRfcmVtb3ZlX2hvc3QodXMpOworCXJlbGVhc2VfZXZlcnl0aGluZyh1cyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKaW5kZXggNjI1YjdhYTkuLmExOTVhZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaApAQCAtMTU4LDYgKzE1OCw3IEBACiAKIAkvKiBTQ1NJIGludGVyZmFjZXMgKi8KIAlzdHJ1Y3Qgc2NzaV9jbW5kCSpzcmI7CQkgLyogY3VycmVudCBzcmIJCSovCisJdW5zaWduZWQgaW50CQl0YWc7CQkgLyogY3VycmVudCBkQ0JXVGFnCSovCiAKIAkvKiB0aHJlYWQgaW5mb3JtYXRpb24gKi8KIAlpbnQJCQlwaWQ7CQkgLyogY29udHJvbCB0aHJlYWQJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggY2RlMGVkMC4uNjE1ODc0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtNjUwLDcgKzY1MCw2IEBACiAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAogCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAotCXNlbGVjdCBGQl9TT0ZUX0NVUlNPUgogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGdyYXBoaWNzIGJvYXJkcyB3aXRoIHRoZSBuVmlkaWEgY2hpcHMsIFROVAogCSAgYW5kIG5ld2VyLiBGb3IgdmVyeSBvbGQgY2hpcHNldHMsIHN1Y2ggYXMgdGhlIFJJVkExMjgsIHRoZW4gdXNlCkBAIC02ODEsNyArNjgwLDYgQEAKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCi0Jc2VsZWN0IEZCX1NPRlRfQ1VSU09SCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgZ3JhcGhpY3MgYm9hcmRzIHdpdGggdGhlIG5WaWRpYSBSaXZhL0dlZm9yY2UKIAkgIGNoaXBzLgpAQCAtNzIwLDcgKzcxOCw2IEBACiAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAogCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAotCXNlbGVjdCBGQl9TT0ZUX0NVUlNPUgogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBvbi1ib2FyZCBncmFwaGljcyBidWlsdCBpbiB0byB0aGUgSW50ZWwgODEwIAogICAgICAgICAgIGFuZCA4MTUgY2hpcHNldHMuICBTYXkgWSBpZiB5b3UgaGF2ZSBhbmQgcGxhbiB0byB1c2Ugc3VjaCBhIGJvYXJkLgpAQCAtNzU0LDYgKzc1MSwxMiBAQAogICAKICAgICAgICAgICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgRkJfSTgxMF9JMkMKKwlib29sICJFbmFibGUgRERDIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBGQl9JODEwICYmIEkyQyAmJiBGQl9JODEwX0dURgorCXNlbGVjdCBJMkNfQUxHT0JJVAorCWhlbHAKKwogY29uZmlnIEZCX0lOVEVMCiAJdHJpc3RhdGUgIkludGVsIDgzME0vODQ1Ry84NTJHTS84NTVHTS84NjVHIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBGQiAmJiBFWFBFUklNRU5UQUwgJiYgUENJICYmIFg4NiAmJiAhWDg2XzY0CkBAIC03NjMsNyArNzY2LDYgQEAKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCi0Jc2VsZWN0IEZCX1NPRlRfQ1VSU09SCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIG9uLWJvYXJkIGdyYXBoaWNzIGJ1aWx0IGluIHRvIHRoZSBJbnRlbAogICAgICAgICAgIDgzME0vODQ1Ry84NTJHTS84NTVHTS84NjVHIGNoaXBzZXRzLgpAQCAtOTYwLDggKzk2Miw3IEBACiAJICBjYW4gYmUgYnVpbGQgZWl0aGVyIGFzIG1vZHVsZXMgb3IgYnVpbHQtaW4uCiAKIAkgIFRoZXJlIGlzIGEgcHJvZHVjdCBwYWdlIGF0Ci0JICA8aHR0cDovL3d3dy5hdGkuY29tL25hL3BhZ2VzL3Byb2R1Y3RzL3BjL3JhZGVvbjMyL2luZGV4Lmh0bWw+LgotCisJICBodHRwOi8vYXBwcy5hdGkuY29tL0FUSWNvbXBhcmUvCiBjb25maWcgRkJfUkFERU9OX0kyQwogCWJvb2wgIkREQy9JMkMgZm9yIEFUSSBSYWRlb24gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZCX1JBREVPTgpAQCAtMTA4NCwxNSArMTA4NSwxNiBAQAogICAgICAgICAgIGNob29zZSBOIGhlcmUuCiAKIGNvbmZpZyBGQl9TSVMKLQl0cmlzdGF0ZSAiU2lTIGFjY2VsZXJhdGlvbiIKKwl0cmlzdGF0ZSAiU2lTL1hHSSBkaXNwbGF5IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQiAmJiBQQ0kKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCiAJc2VsZWN0IEZCX1NPRlRfQ1VSU09SCiAJaGVscAotCSAgVGhpcyBpcyB0aGUgZnJhbWUgYnVmZmVyIGRldmljZSBkcml2ZXIgZm9yIHRoZSBTaVMgMzAwLCAzMTUgYW5kCi0JICAzMzAgc2VyaWVzIFZHQSBjaGlwc2V0cy4gU3BlY3MgYXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LnNpcy5jb20+CisJICBUaGlzIGlzIHRoZSBmcmFtZSBidWZmZXIgZGV2aWNlIGRyaXZlciBmb3IgdGhlIFNpUyAzMDAsIDMxNSwgMzMwCisJICBhbmQgMzQwIHNlcmllcyBhcyB3ZWxsIGFzIFhHSSBWM1hULCBWNSwgVjgsIFo3IGdyYXBoaWNzIGNoaXBzZXRzLgorCSAgU3BlY3MgYXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LnNpcy5jb20+IGFuZCA8aHR0cDovL3d3dy54Z2l0ZWNoLmNvbT4uCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU7IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNpc2ZiLgpAQCAtMTEwNCwxMSArMTEwNiwxMiBAQAogCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHVzZSBvZiB0aGUgU2lTIDMwMC8zMDUsIDU0MCwgNjMwIGFuZCA3MzAuCiAKIGNvbmZpZyBGQl9TSVNfMzE1Ci0JYm9vbCAiU2lTIDMxNS8zMzAgc2VyaWVzIHN1cHBvcnQiCisJYm9vbCAiU2lTIDMxNS8zMzAvMzQwIHNlcmllcyBhbmQgWEdJIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQl9TSVMKIAloZWxwCi0JICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdXNlIG9mIHRoZSBTaVMgMzE1IGFuZCAzMzAgc2VyaWVzCi0JICAoMzE1L0gvUFJPLCA1NXgsIDY1MCwgNjUxLCA3NDAsIDMzMCwgNjYxLCA3NDEsIDc2MCkuCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdXNlIG9mIHRoZSBTaVMgMzE1LCAzMzAgYW5kIDM0MCBzZXJpZXMKKwkgICgzMTUvSC9QUk8sIDU1eCwgNjUwLCA2NTEsIDc0MCwgMzMwLCA2NjEsIDc0MSwgNzYwLCA3NjEpIGFzIHdlbGwKKwkgIGFzIFhHSSBWM1hULCBWNSwgVjggYW5kIFo3LgogCiBjb25maWcgRkJfTkVPTUFHSUMKIAl0cmlzdGF0ZSAiTmVvTWFnaWMgZGlzcGxheSBzdXBwb3J0IgpAQCAtMTE4MCw2ICsxMTgzLDMyIEBACiAJICBQbGVhc2UgcmVhZCB0aGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mYi9SRUFETUUtc3N0ZmIudHh0PiBmb3Igc3VwcG9ydGVkCiAJICBvcHRpb25zIGFuZCBvdGhlciBpbXBvcnRhbnQgaW5mbyAgc3VwcG9ydC4KIAorY29uZmlnIEZCX0NZQkxBCisJdHJpc3RhdGUgIkN5YmVyYmxhZGUvaTEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCICYmIFBDSQorCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJc2VsZWN0IEZCX1NPRlRfQ1VSU09SCisJc2VsZWN0IFZJREVPX1NFTEVDVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGlzIHN1cHBvc2VkIHRvIHN1cHBvcnQgdGhlIFRyaWRlbnQgQ3liZXJibGFkZS9pMQorCSAgZ3JhcGhpY3MgY29yZSBpbnRlZ3JhdGVkIGluIHRoZSBWSUEgVlQ4NjAxQSBOb3J0aCBCcmlkZ2UsCisJICBhbHNvIGtub3duIGFzIFZJQSBBcG9sbG8gUExFMTMzLgorCisJICBTdGF0dXM6CisJICAgLSBEZXZlbG9wZWQsIHRlc3RlZCBhbmQgd29ya2luZyBvbiBFUElBIDUwMDAgYW5kIEVQSUEgODAwLgorCSAgIC0gRG9lcyB3b3JrIHJlbGlhYmxlIG9uIGFsbCBzeXN0ZW1zIHdpdGggQ1JUL0xDRCBjb25uZWN0ZWQgdG8KKwkgICAgIG5vcm1hbCBWR0EgcG9ydHMuCisJICAgLSBTaG91bGQgd29yayBvbiBzeXN0ZW1zIHRoYXQgZG8gdXNlIHRoZSBpbnRlcm5hbCBMQ0QgcG9ydCwgYnV0CisJICAgICB0aGlzIGlzIGFic29sdXRlbHkgbm90IHRlc3RlZC4KKworCSAgQ2hhcmFjdGVyIGltYWdlYmxpdCwgY29weWFyZWEgYW5kIHJlY3RhbmdsZSBmaWxsIGFyZSBodyBhY2NlbGVyYXRlZCwKKwkgIHlwYW4gc2Nyb2xsaW5nIGlzIHVzZWQgYnkgZGVmYXVsdC4KKworCSAgUGxlYXNlIGRvIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiLyo+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjeWJsYWZiLgorCiBjb25maWcgRkJfVFJJREVOVAogCXRyaXN0YXRlICJUcmlkZW50IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQiAmJiBQQ0kKQEAgLTExOTMsOCArMTIyMiwxMiBAQAogCSAgYnV0IGFsc28gb24gc29tZSBtb3RoZXJib2FyZHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkCiAJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZiL3RyaWRlbnRmYi50eHQ+CiAKKwkgIEN5YmVyYmxhZGUvaTEgc3VwcG9ydCB3aWxsIGJlIHJlbW92ZWQgc29vbiwgdXNlIHRoZSBjeWJsYWZiIGRyaXZlcgorCSAgaW5zdGVhZC4KKwogCSAgU2F5IFkgaWYgeW91IGhhdmUgc3VjaCBhIGdyYXBoaWNzIGJvYXJkLgogCisKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRyaWRlbnRmYi4KIApAQCAtMTIwNSw3ICsxMjM4LDYgQEAKIAlUaGlzIHdpbGwgY29tcGlsZSB0aGUgVHJpZGVudCBmcmFtZSBidWZmZXIgZGV2aWNlIHdpdGgKIAlhY2NlbGVyYXRpb24gZnVuY3Rpb25zLgogCi0KIGNvbmZpZyBGQl9QTTMKIAl0cmlzdGF0ZSAiUGVybWVkaWEzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQiAmJiBQQ0kgJiYgQlJPS0VOCkBAIC0xNDg0LDYgKzE1MTYsMzAgQEAKIAkgIHdvcmtpbmcgd2l0aCBTMUQxMzgwNikuIFByb2R1Y3Qgc3BlY3MgYXQKIAkgIDxodHRwOi8vd3d3LmVyZC5lcHNvbi5jb20vdmRjL2h0bWwvbGVnYWN5XzEzeHh4Lmh0bT4KIAorY29uZmlnIEZCX1MzQzI0MTAKKwl0cmlzdGF0ZSAiUzNDMjQxMCBMQ0QgZnJhbWVidWZmZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCICYmIEFSQ0hfUzNDMjQxMAorCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKKwlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCisJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKKwlzZWxlY3QgRkJfU09GVF9DVVJTT1IKKwktLS1oZWxwLS0tCisJICBGcmFtZSBidWZmZXIgZHJpdmVyIGZvciB0aGUgYnVpbHQtaW4gTENEIGNvbnRyb2xsZXIgaW4gdGhlIFNhbXN1bmcKKwkgIFMzQzI0MTAgcHJvY2Vzc29yLgorCisJICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4gVGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgczNjMjQxMGZiLiBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLAorCSAgc2F5IE0gaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KK2NvbmZpZyBGQl9TM0MyNDEwX0RFQlVHCisJYm9vbCAiUzNDMjQxMCBsY2QgZGVidWcgbWVzc2FnZXMiCisJZGVwZW5kcyBvbiBGQl9TM0MyNDEwCisJaGVscAorCSAgVHVybiBvbiBkZWJ1Z2dpbmcgbWVzc2FnZXMuIE5vdGUgdGhhdCB5b3UgY2FuIHNldC91bnNldCBhdCBydW4gdGltZQorCSAgdGhyb3VnaCBzeXNmcworCiBjb25maWcgRkJfVklSVFVBTAogCXRyaXN0YXRlICJWaXJ0dWFsIEZyYW1lIEJ1ZmZlciBzdXBwb3J0IChPTkxZIEZPUiBURVNUSU5HISkiCiAJZGVwZW5kcyBvbiBGQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKaW5kZXggYjAxOGRmNC4uMWZmZjI5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCkBAIC05LDcgKzksOCBAQAogb2JqLSQoQ09ORklHX1NZU0ZTKQkJICArPSBiYWNrbGlnaHQvCiAKIG9iai0kKENPTkZJR19GQikgICAgICAgICAgICAgICAgICArPSBmYi5vCi1mYi15ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gZmJtZW0ubyBmYm1vbi5vIGZiY21hcC5vIGZic3lzZnMubyBtb2RlZGIubworZmIteSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo9IGZibWVtLm8gZmJtb24ubyBmYmNtYXAubyBmYnN5c2ZzLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVkYi5vIGZiY3Z0Lm8KIGZiLW9ianMgICAgICAgICAgICAgICAgICAgICAgICAgICA6PSAkKGZiLXkpCiAKIG9iai0kKENPTkZJR19GQl9DRkJfRklMTFJFQ1QpICArPSBjZmJmaWxscmVjdC5vCkBAIC01MCw3ICs1MSw4IEBACiBvYmotJChDT05GSUdfRkJfSU1TVFQpICAgICAgICAgICAgKz0gaW1zdHRmYi5vCiBvYmotJChDT05GSUdfRkJfUzNUUklPKSAgICAgICAgICAgKz0gUzN0cmlvZmIubwogb2JqLSQoQ09ORklHX0ZCX0ZNMikgICAgICAgICAgICAgICs9IGZtMmZiLm8KLW9iai0kKENPTkZJR19GQl9UUklERU5UKQkgICs9IHRyaWRlbnRmYi5vCitvYmotJChDT05GSUdfRkJfQ1lCTEEpICAgICAgICAgICAgKz0gY3libGFmYi5vCitvYmotJChDT05GSUdfRkJfVFJJREVOVCkgICAgICAgICAgKz0gdHJpZGVudGZiLm8KIG9iai0kKENPTkZJR19GQl9TVEkpICAgICAgICAgICAgICArPSBzdGlmYi5vCiBvYmotJChDT05GSUdfRkJfRkZCKSAgICAgICAgICAgICAgKz0gZmZiLm8gc2J1c2xpYi5vCiBvYmotJChDT05GSUdfRkJfQ0c2KSAgICAgICAgICAgICAgKz0gY2c2Lm8gc2J1c2xpYi5vCkBAIC05Miw2ICs5NCw3IEBACiBvYmotJChDT05GSUdfRkJfVFgzOTEyKQkJICArPSB0eDM5MTJmYi5vCiBvYmotJChDT05GSUdfRkJfUzFEMTNYWFgpCSAgKz0gczFkMTN4eHhmYi5vCiBvYmotJChDT05GSUdfRkJfSU1YKSAgICAgICAgICAgICAgKz0gaW14ZmIubworb2JqLSQoQ09ORklHX0ZCX1MzQzI0MTApCSAgKz0gczNjMjQxMGZiLm8KIAogIyBQbGF0Zm9ybSBvciBmYWxsYmFjayBkcml2ZXJzIGdvIGhlcmUKIG9iai0kKENPTkZJR19GQl9WRVNBKSAgICAgICAgICAgICArPSB2ZXNhZmIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKaW5kZXggN2JjMWQ0NC4uZTM4MGVlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCkBAIC04MDYsOCArODA2LDggQEAKIAogCS8qIFZlcnkgc2ltcGxlIHRlc3QgdG8gbWFrZSBzdXJlIGl0IGFwcGVhcmVkICovCiAJaWYgKEJJT1NfSU4xNigwKSAhPSAweGFhNTUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdHkxMjhmYjogSW52YWxpZCBST00gc2lnbmF0dXJlICV4IHNob3VsZCBiZSAweGFhNTVcbiIsCi0JCSAgICAgICBCSU9TX0lOMTYoMCkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiYXR5MTI4ZmI6IEludmFsaWQgUk9NIHNpZ25hdHVyZSAleCBzaG91bGQgIgorCQkJIiBiZSAweGFhNTVcbiIsIEJJT1NfSU4xNigwKSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtMjMyMywxNyArMjMyMywxNiBAQAogCSAqIGNhbiBwcm9wZXJseSB0YWtlIGNhcmUgb2YgRDMgPyBBbHNvLCB3aXRoIHN3c3VzcCwgd2UKIAkgKiBrbm93IHdlJ2xsIGJlIHJlYm9vdGVkLCAuLi4KIAkgKi8KLSNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKyNpZm5kZWYgQ09ORklHX1BQQ19QTUFDCiAJLyogSEFDSyBBTEVSVCAhIE9uY2UgSSBmaW5kIGEgcHJvcGVyIHdheSB0byBzYXkgdG8gZWFjaCBkcml2ZXIKIAkgKiBpbmRpdmlkdWFsbHkgd2hhdCB3aWxsIGhhcHBlbiB3aXRoIGl0J3MgUENJIHNsb3QsIEknbGwgY2hhbmdlCiAJICogdGhhdC4gT24gbGFwdG9wcywgdGhlIEFHUCBzbG90IGlzIGp1c3QgdW5jbG9ja2VkLCBzbyBEMiBpcwogCSAqIGV4cGVjdGVkLCB3aGlsZSBvbiBkZXNrdG9wcywgdGhlIGNhcmQgaXMgcG93ZXJlZCBvZmYKIAkgKi8KLQlpZiAoc3RhdGUgPj0gMykKLQkJc3RhdGUgPSAyOworCXJldHVybiAwOwogI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwogCSAKLQlpZiAoc3RhdGUgIT0gMiB8fCBzdGF0ZSA9PSBwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUpCisJaWYgKHN0YXRlLmV2ZW50ID09IHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkKIAkJcmV0dXJuIDA7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiYXR5MTI4ZmI6IHN1c3BlbmRpbmcuLi5cbiIpOwpAQCAtMjM2Nyw3ICsyMzY2LDcgQEAKIAkgKiB1c2VkIGR1bW15IGZiIG9wcywgMi41IG5lZWQgcHJvcGVyIHN1cHBvcnQgZm9yIHRoaXMgYXQgdGhlCiAJICogZmJkZXYgbGV2ZWwKIAkgKi8KLQlpZiAoc3RhdGUgPT0gMikKKwlpZiAoc3RhdGUuZXZlbnQgIT0gUE1fRVZFTlRfT04pCiAJCWF0eTEyOF9zZXRfc3VzcGVuZChwYXIsIDEpOwogCiAJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwpAQCAtMjM4MiwxMiArMjM4MSwxMSBAQAogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBhdHkxMjhmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAotCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPT0gMCkKKwlpZiAocGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX09OKQogCQlyZXR1cm4gMDsKIAogCS8qIFdha2V1cCBjaGlwICovCi0JaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9PSAyKQotCQlhdHkxMjhfc2V0X3N1c3BlbmQocGFyLCAwKTsKKwlhdHkxMjhfc2V0X3N1c3BlbmQocGFyLCAwKTsKIAlwYXItPmFzbGVlcCA9IDA7CiAKIAkvKiBSZXN0b3JlIGRpc3BsYXkgJiBlbmdpbmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYwppbmRleCA4YzQyNTM4Li4wMzdmZTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCkBAIC05MTEsMjAgKzkxMSw2IEBACiAJCXZkaXNwbGF5ICA9IHBhci0+bGNkX2hlaWdodDsKICNlbmRpZgogCi0JaWYodmRpc3BsYXkgPCA0MDApIHsKLQkJaF9zeW5jX3BvbCA9IDE7Ci0JCXZfc3luY19wb2wgPSAwOwotCX0gZWxzZSBpZih2ZGlzcGxheSA8IDQ4MCkgewotCQloX3N5bmNfcG9sID0gMDsKLQkJdl9zeW5jX3BvbCA9IDE7Ci0JfSBlbHNlIGlmKHZkaXNwbGF5IDwgNzY4KSB7Ci0JCWhfc3luY19wb2wgPSAwOwotCQl2X3N5bmNfcG9sID0gMDsKLQl9IGVsc2UgewotCQloX3N5bmNfcG9sID0gMTsKLQkJdl9zeW5jX3BvbCA9IDE7Ci0JfQotCiAJdl9kaXNwLS07CiAJdl9zeW5jX3N0cnQtLTsKIAl2X3N5bmNfZW5kLS07CkBAIC0yMDIyLDE3ICsyMDA4LDE2IEBACiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwogCi0jaWZkZWYgQ09ORklHX1BQQ19QTUFDCisjaWZuZGVmIENPTkZJR19QUENfUE1BQwogCS8qIEhBQ0sgQUxFUlQgISBPbmNlIEkgZmluZCBhIHByb3BlciB3YXkgdG8gc2F5IHRvIGVhY2ggZHJpdmVyCiAJICogaW5kaXZpZHVhbGx5IHdoYXQgd2lsbCBoYXBwZW4gd2l0aCBpdCdzIFBDSSBzbG90LCBJJ2xsIGNoYW5nZQogCSAqIHRoYXQuIE9uIGxhcHRvcHMsIHRoZSBBR1Agc2xvdCBpcyBqdXN0IHVuY2xvY2tlZCwgc28gRDIgaXMKIAkgKiBleHBlY3RlZCwgd2hpbGUgb24gZGVza3RvcHMsIHRoZSBjYXJkIGlzIHBvd2VyZWQgb2ZmCiAJICovCi0JaWYgKHN0YXRlID49IDMpCi0JCXN0YXRlID0gMjsKKwlyZXR1cm4gMDsKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KIAotCWlmIChzdGF0ZSAhPSAyIHx8IHN0YXRlID09IHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSkKKwlpZiAoc3RhdGUuZXZlbnQgPT0gcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50KQogCQlyZXR1cm4gMDsKIAogCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKQEAgLTIwNzEsMTIgKzIwNTYsMTIgQEAKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CiAKLQlpZiAocGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID09IDApCisJaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9PTikKIAkJcmV0dXJuIDA7CiAKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CiAKLQlpZiAocGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID09IDIpCisJaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSAyKQogCQlhdHlfcG93ZXJfbWdtdCgwLCBwYXIpOwogCXBhci0+YXNsZWVwID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKaW5kZXggZTdlOGI1Mi4uMDQ2YjQ3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCkBAIC0zMjksOCArMzI5LDkgQEAKIAogCS8qIFZlcnkgc2ltcGxlIHRlc3QgdG8gbWFrZSBzdXJlIGl0IGFwcGVhcmVkICovCiAJaWYgKEJJT1NfSU4xNigwKSAhPSAweGFhNTUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJyYWRlb25mYiAoJXMpOiBJbnZhbGlkIFJPTSBzaWduYXR1cmUgJXggc2hvdWxkIGJlIgotCQkgICAgICAgIjB4YWE1NVxuIiwgcGNpX25hbWUocmluZm8tPnBkZXYpLCBCSU9TX0lOMTYoMCkpOworCQlwcmludGsoS0VSTl9ERUJVRyAicmFkZW9uZmIgKCVzKTogSW52YWxpZCBST00gc2lnbmF0dXJlICV4ICIKKwkJCSJzaG91bGQgYmUgMHhhYTU1XG4iLAorCQkJcGNpX25hbWUocmluZm8tPnBkZXYpLCBCSU9TX0lOMTYoMCkpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAJLyogTG9vayBmb3IgdGhlIFBDSSBkYXRhIHRvIGNoZWNrIHRoZSBST00gdHlwZSAqLwpAQCAtMjMxMiwxOSArMjMxMywyNyBAQAogCXJpbmZvLT5tbWlvX2Jhc2VfcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMik7CiAKIAkvKiByZXF1ZXN0IHRoZSBtZW0gcmVnaW9ucyAqLwotCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgInJhZGVvbmZiIik7CisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDAsICJyYWRlb25mYiBmcmFtZWJ1ZmZlciIpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayggS0VSTl9FUlIgInJhZGVvbmZiICglcyk6IGNhbm5vdCByZXNlcnZlIFBDSSByZWdpb25zLiIKLQkJCSIgIFNvbWVvbmUgYWxyZWFkeSBnb3QgdGhlbT9cbiIsIHBjaV9uYW1lKHJpbmZvLT5wZGV2KSk7CisJCXByaW50ayggS0VSTl9FUlIgInJhZGVvbmZiICglcyk6IGNhbm5vdCByZXF1ZXN0IHJlZ2lvbiAwLlxuIiwKKwkJCXBjaV9uYW1lKHJpbmZvLT5wZGV2KSk7CiAJCWdvdG8gZXJyX3JlbGVhc2VfZmI7CiAJfQogCisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDIsICJyYWRlb25mYiBtbWlvIik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAicmFkZW9uZmIgKCVzKTogY2Fubm90IHJlcXVlc3QgcmVnaW9uIDIuXG4iLAorCQkJcGNpX25hbWUocmluZm8tPnBkZXYpKTsKKwkJZ290byBlcnJfcmVsZWFzZV9wY2kwOworCX0KKwogCS8qIG1hcCB0aGUgcmVnaW9ucyAqLwogCXJpbmZvLT5tbWlvX2Jhc2UgPSBpb3JlbWFwKHJpbmZvLT5tbWlvX2Jhc2VfcGh5cywgUkFERU9OX1JFR1NJWkUpOwogCWlmICghcmluZm8tPm1taW9fYmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgInJhZGVvbmZiICglcyk6IGNhbm5vdCBtYXAgTU1JT1xuIiwgcGNpX25hbWUocmluZm8tPnBkZXYpKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYWRlb25mYiAoJXMpOiBjYW5ub3QgbWFwIE1NSU9cbiIsCisJCSAgICAgICBwY2lfbmFtZShyaW5mby0+cGRldikpOwogCQlyZXQgPSAtRUlPOwotCQlnb3RvIGVycl9yZWxlYXNlX3BjaTsKKwkJZ290byBlcnJfcmVsZWFzZV9wY2kyOwogCX0KIAogCXJpbmZvLT5mYl9sb2NhbF9iYXNlID0gSU5SRUcoTUNfRkJfTE9DQVRJT04pIDw8IDE2OwpAQCAtMjQ5OSwxMCArMjUwOCwxMiBAQAogCWlmIChyaW5mby0+Ymlvc19zZWcpCiAJCXJhZGVvbl91bm1hcF9ST00ocmluZm8sIHBkZXYpOwogCWlvdW5tYXAocmluZm8tPm1taW9fYmFzZSk7Ci1lcnJfcmVsZWFzZV9wY2k6Ci0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9yZWxlYXNlX3BjaTI6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDIpOworZXJyX3JlbGVhc2VfcGNpMDoKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CiBlcnJfcmVsZWFzZV9mYjoKLQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworICAgICAgICBmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogZXJyX2Rpc2FibGU6CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogZXJyX291dDoKQEAgLTI1NDgsNyArMjU1OSw4IEBACiAgICAgICAgIGlvdW5tYXAocmluZm8tPm1taW9fYmFzZSk7CiAgICAgICAgIGlvdW5tYXAocmluZm8tPmZiX2Jhc2UpOwogIAotIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAyKTsKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CiAKIAlrZnJlZShyaW5mby0+bW9uMV9FRElEKTsKIAlrZnJlZShyaW5mby0+bW9uMl9FRElEKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9pMmMuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9pMmMuYwppbmRleCA3NjIyNDQxLi5hOWQwNDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25faTJjLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2kyYy5jCkBAIC03NSw3ICs3NSw3IEBACiAKIAlzdHJjcHkoY2hhbi0+YWRhcHRlci5uYW1lLCBuYW1lKTsKIAljaGFuLT5hZGFwdGVyLm93bmVyCQk9IFRISVNfTU9EVUxFOwotCWNoYW4tPmFkYXB0ZXIuaWQJCT0gSTJDX0FMR09fQVRJOworCWNoYW4tPmFkYXB0ZXIuaWQJCT0gSTJDX0hXX0JfUkFERU9OOwogCWNoYW4tPmFkYXB0ZXIuYWxnb19kYXRhCQk9ICZjaGFuLT5hbGdvOwogCWNoYW4tPmFkYXB0ZXIuZGV2LnBhcmVudAk9ICZjaGFuLT5yaW5mby0+cGRldi0+ZGV2OwogCWNoYW4tPmFsZ28uc2V0c2RhCQk9IHJhZGVvbl9ncGlvX3NldHNkYTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9wbS5jIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX3BtLmMKaW5kZXggOTgzNTJhZi4uNTlhMWI2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX3BtLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX3BtLmMKQEAgLTI1MjYsMTggKzI1MjYsMTggQEAKICAgICAgICAgc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvID0gaW5mby0+cGFyOwogCWludCBpOwogCi0JaWYgKHN0YXRlID09IHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSkKKwlpZiAoc3RhdGUuZXZlbnQgPT0gcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50KQogCQlyZXR1cm4gMDsKIAogCXByaW50ayhLRVJOX0RFQlVHICJyYWRlb25mYiAoJXMpOiBzdXNwZW5kaW5nIHRvIHN0YXRlOiAlZC4uLlxuIiwKLQkgICAgICAgcGNpX25hbWUocGRldiksIHN0YXRlKTsKKwkgICAgICAgcGNpX25hbWUocGRldiksIHN0YXRlLmV2ZW50KTsKIAogCS8qIEZvciBzdXNwZW5kLXRvLWRpc2ssIHdlIGNoZWF0IGhlcmUuIFdlIGRvbid0IHN1c3BlbmQgYW55dGhpbmcgYW5kCiAJICogbGV0IGZiY29uIGNvbnRpbnVlIGRyYXdpbmcgdW50aWwgd2UgYXJlIGFsbCBzZXQuIFRoYXQgc2hvdWxkbid0CiAJICogcmVhbGx5IGNhdXNlIGFueSBwcm9ibGVtIGF0IHRoaXMgcG9pbnQsIHByb3ZpZGVkIHRoYXQgdGhlIHdha2V1cAogCSAqIGNvZGUga25vd3MgdGhhdCBhbnkgc3RhdGUgaW4gbWVtb3J5IG1heSBub3QgbWF0Y2ggdGhlIEhXCiAJICovCi0JaWYgKHN0YXRlICE9IFBNX1NVU1BFTkRfTUVNKQorCWlmIChzdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9GUkVFWkUpCiAJCWdvdG8gZG9uZTsKIAogCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKQEAgLTI2MTYsNyArMjYxNiw3IEBACiAgICAgICAgIHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbyA9IGluZm8tPnBhcjsKIAlpbnQgcmMgPSAwOwogCi0JaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9PSAwKQorCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pCiAJCXJldHVybiAwOwogCiAJaWYgKHJpbmZvLT5ub19zY2hlZHVsZSkgewpAQCAtMjYyNiw3ICsyNjI2LDcgQEAKIAkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgInJhZGVvbmZiICglcyk6IHJlc3VtaW5nIGZyb20gc3RhdGU6ICVkLi4uXG4iLAotCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlKTsKKwkgICAgICAgcGNpX25hbWUocGRldiksIHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCk7CiAKIAogCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgewpAQCAtMjYzNyw3ICsyNjM3LDcgQEAKIAl9CiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKLQlpZiAocGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID09IFBNX1NVU1BFTkRfTUVNKSB7CisJaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9TVVNQRU5EKSB7CiAJCS8qIFdha2V1cCBjaGlwLiBDaGVjayBmcm9tIGNvbmZpZyBzcGFjZSBpZiB3ZSB3ZXJlIHBvd2VyZWQgb2ZmCiAJCSAqICh0b2RvOiBhZGRpdGlvbmFsbHksIGNoZWNrIENMS19QSU5fQ05UTCB0b28pCiAJCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQppbmRleCA5YWFlODg0Li40YWYzMjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQpAQCAtMywzICszLDQgQEAKIG9iai0kKENPTkZJR19MQ0RfQ0xBU1NfREVWSUNFKSAgICAgKz0gbGNkLm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFKSArPSBiYWNrbGlnaHQubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9DT1JHSSkJKz0gY29yZ2lfYmwubworb2JqLSQoQ09ORklHX1NIQVJQX0xPQ09NTykJKz0gbG9jb21vbGNkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xvY29tb2xjZC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG9jb21vbGNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhNmU3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xvY29tb2xjZC5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQmFja2xpZ2h0IGNvbnRyb2wgY29kZSBmb3IgU2hhcnAgWmF1cnVzIFNMLTU1MDAKKyAqCisgKiBDb3B5cmlnaHQgMjAwNSBKb2huIExlbnogPGxlbnpAY3Mud2lzYy5lZHU+CisgKiBNYWludGFpbmVyOiBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+ICh1bmxlc3MgSm9obiB3YW50cyB0byA6LSkKKyAqIEdQTCB2MgorICoKKyAqIFRoaXMgZHJpdmVyIGFzc3VtZXMgc2luZ2xlIENQVS4gVGhhdCdzIG9rYXksIGJlY2F1c2UgY29sbGllIGlzCisgKiBzbGlnaHRseSBvbGQgaGFyZHdhcmUsIGFuZCBub29uZSBpcyBnb2luZyB0byByZXRyb2ZpdCBzZWNvbmQgQ1BVIHRvCisgKiBvbGQgUERBLgorICovCisKKy8qIExDRCBwb3dlciBmdW5jdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9sb2NvbW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpZmRlZiBDT05GSUdfU0ExMTAwX0NPTExJRQorI2luY2x1ZGUgPGFzbS9hcmNoL2NvbGxpZS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhc20vYXJjaC9wb29kbGUuaD4KKyNlbmRpZgorCitleHRlcm4gdm9pZCAoKnNhMTEwMGZiX2xjZF9wb3dlcikoaW50IG9uKTsKKworc3RhdGljIHN0cnVjdCBsb2NvbW9fZGV2ICpsb2NvbW9sY2RfZGV2OworCitzdGF0aWMgdm9pZCBsb2NvbW9sY2Rfb24oaW50IGNvbWFkaikKK3sKKwlsb2NvbW9fZ3Bpb19zZXRfZGlyKGxvY29tb2xjZF9kZXYsIExPQ09NT19HUElPX0xDRF9WU0hBX09OLCAwKTsKKwlsb2NvbW9fZ3Bpb193cml0ZShsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfVlNIQV9PTiwgMSk7CisJbWRlbGF5KDIpOworCisJbG9jb21vX2dwaW9fc2V0X2Rpcihsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfVlNIRF9PTiwgMCk7CisJbG9jb21vX2dwaW9fd3JpdGUobG9jb21vbGNkX2RldiwgTE9DT01PX0dQSU9fTENEX1ZTSERfT04sIDEpOworCW1kZWxheSgyKTsKKworCWxvY29tb19tNjIzMzJfc2VuZGRhdGEobG9jb21vbGNkX2RldiwgY29tYWRqLCAwKTsKKwltZGVsYXkoNSk7CisKKwlsb2NvbW9fZ3Bpb19zZXRfZGlyKGxvY29tb2xjZF9kZXYsIExPQ09NT19HUElPX0xDRF9WRUVfT04sIDApOworCWxvY29tb19ncGlvX3dyaXRlKGxvY29tb2xjZF9kZXYsIExPQ09NT19HUElPX0xDRF9WRUVfT04sIDEpOworCW1kZWxheSgxMCk7CisKKwkvKiBURlRDUlNUIHwgQ1BTT1VUPTAgfCBDUFNFTiAqLworCWxvY29tb193cml0ZWwoMHgwMSwgbG9jb21vbGNkX2Rldi0+bWFwYmFzZSArIExPQ09NT19UQyk7CisKKwkvKiBTZXQgQ1BTRCAqLworCWxvY29tb193cml0ZWwoNiwgbG9jb21vbGNkX2Rldi0+bWFwYmFzZSArIExPQ09NT19DUFNEKTsKKworCS8qIFRGVENSU1QgfCBDUFNPVVQ9MCB8IENQU0VOICovCisJbG9jb21vX3dyaXRlbCgoMHgwNCB8IDB4MDEpLCBsb2NvbW9sY2RfZGV2LT5tYXBiYXNlICsgTE9DT01PX1RDKTsKKwltZGVsYXkoMTApOworCisJbG9jb21vX2dwaW9fc2V0X2Rpcihsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfTU9ELCAwKTsKKwlsb2NvbW9fZ3Bpb193cml0ZShsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfTU9ELCAxKTsKK30KKworc3RhdGljIHZvaWQgbG9jb21vbGNkX29mZihpbnQgY29tYWRqKQoreworCS8qIFRGVENSU1Q9MSB8IENQU09VVD0xIHwgQ1BTRU4gPSAwICovCisJbG9jb21vX3dyaXRlbCgweDA2LCBsb2NvbW9sY2RfZGV2LT5tYXBiYXNlICsgTE9DT01PX1RDKTsKKwltZGVsYXkoMSk7CisKKwlsb2NvbW9fZ3Bpb193cml0ZShsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfVlNIQV9PTiwgMCk7CisJbWRlbGF5KDExMCk7CisKKwlsb2NvbW9fZ3Bpb193cml0ZShsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfVkVFX09OLCAwKTsKKwltZGVsYXkoNzAwKTsKKworCS8qIFRGVENSU1Q9MCB8IENQU09VVD0wIHwgQ1BTRU4gPSAwICovCisJbG9jb21vX3dyaXRlbCgwLCBsb2NvbW9sY2RfZGV2LT5tYXBiYXNlICsgTE9DT01PX1RDKTsKKwlsb2NvbW9fZ3Bpb193cml0ZShsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfTU9ELCAwKTsKKwlsb2NvbW9fZ3Bpb193cml0ZShsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfVlNIRF9PTiwgMCk7Cit9CisKK3ZvaWQgbG9jb21vbGNkX3Bvd2VyKGludCBvbikKK3sKKwlpbnQgY29tYWRqID0gMTE4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAoIWxvY29tb2xjZF9kZXYpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogcmVhZCBjb21hZGogKi8KKyNpZmRlZiBDT05GSUdfTUFDSF9QT09ETEUKKwljb21hZGogPSAxMTg7CisjZWxzZQorCWNvbWFkaiA9IDEyODsKKyNlbmRpZgorCisJaWYgKG9uKQorCQlsb2NvbW9sY2Rfb24oY29tYWRqKTsKKwllbHNlCisJCWxvY29tb2xjZF9vZmYoY29tYWRqKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wobG9jb21vbGNkX3Bvd2VyKTsKKworc3RhdGljIGludCBwb29kbGVfbGNkX3Byb2JlKHN0cnVjdCBsb2NvbW9fZGV2ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NvbW9sY2RfZGV2ID0gZGV2OworCisJLyogdGhlIHBvb2RsZV9sY2RfcG93ZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZQorCSAqIGZyb20gZnNfaW5pdGNhbGwsIHdoaWNoIGlzIGJlZm9yZSBsb2NvbW8gaXMgYWN0aXZhdGVkLgorCSAqIFdlIG5lZWQgdG8gcmVjYWxsIHBvb2RsZV9sY2RfcG93ZXIgaGVyZSovCisjaWZkZWYgQ09ORklHX01BQ0hfUE9PRExFCisJbG9jb21vbGNkX3Bvd2VyKDEpOworI2VuZGlmCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvb2RsZV9sY2RfcmVtb3ZlKHN0cnVjdCBsb2NvbW9fZGV2ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jb21vbGNkX2RldiA9IE5VTEw7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGxvY29tb19kcml2ZXIgcG9vZGxlX2xjZF9kcml2ZXIgPSB7CisJLmRydiA9IHsKKwkJLm5hbWUgPSAibG9jb21vLWJhY2tsaWdodCIsCisJfSwKKwkuZGV2aWQJPSBMT0NPTU9fREVWSURfQkFDS0xJR0hULAorCS5wcm9iZQk9IHBvb2RsZV9sY2RfcHJvYmUsCisJLnJlbW92ZQk9IHBvb2RsZV9sY2RfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcG9vZGxlX2xjZF9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IGxvY29tb19kcml2ZXJfcmVnaXN0ZXIoJnBvb2RsZV9sY2RfZHJpdmVyKTsKKwlpZiAocmV0KSByZXR1cm4gcmV0OworCisjaWZkZWYgQ09ORklHX1NBMTEwMF9DT0xMSUUKKwlzYTExMDBmYl9sY2RfcG93ZXIgPSBsb2NvbW9sY2RfcG93ZXI7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChwb29kbGVfbGNkX2luaXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NoaXBzZmIuYyBiL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jCmluZGV4IGU3NWE5NjUuLjQxMzEyNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jCkBAIC00NjIsOSArNDYyLDkgQEAKIHsKICAgICAgICAgc3RydWN0IGZiX2luZm8gKnAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAoc3RhdGUgPT0gcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlKQorCWlmIChzdGF0ZS5ldmVudCA9PSBwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpCiAJCXJldHVybiAwOwotCWlmIChzdGF0ZSAhPSBQTV9TVVNQRU5EX01FTSkKKwlpZiAoc3RhdGUuZXZlbnQgIT0gUE1fU1VTUEVORF9NRU0pCiAJCWdvdG8gZG9uZTsKIAogCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9iaXRibGl0LmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvYml0YmxpdC5jCmluZGV4IDNjNzMxNTcuLjlmNzBlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9iaXRibGl0LmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2JpdGJsaXQuYwpAQCAtMzksNyArMzksNyBAQAogewogCWludCBhdHRyaWJ1dGUgPSAwOwogCi0JaWYgKGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyKSA9PSAxKSB7CisJaWYgKGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyLCAmaW5mby0+Zml4KSA9PSAxKSB7CiAJCWlmIChhdHRyX3VuZGVybGluZShjKSkKIAkJCWF0dHJpYnV0ZSB8PSBGQkNPTl9BVFRSSUJVVEVfVU5ERVJMSU5FOwogCQlpZiAoYXR0cl9yZXZlcnNlKGMpKQpAQCAtMTAzLDIyICsxMDMsOTIgQEAKIAlpbmZvLT5mYm9wcy0+ZmJfZmlsbHJlY3QoaW5mbywgJnJlZ2lvbik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBiaXRfcHV0Y3NfYWxpZ25lZChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJCSAgICAgY29uc3QgdTE2ICpzLCB1MzIgYXR0ciwgdTMyIGNudCwKKwkJCQkgICAgIHUzMiBkX3BpdGNoLCB1MzIgc19waXRjaCwgdTMyIGNlbGxzaXplLAorCQkJCSAgICAgc3RydWN0IGZiX2ltYWdlICppbWFnZSwgdTggKmJ1ZiwgdTggKmRzdCkKK3sKKwl1MTYgY2hhcm1hc2sgPSB2Yy0+dmNfaGlfZm9udF9tYXNrID8gMHgxZmYgOiAweGZmOworCXUzMiBpZHggPSB2Yy0+dmNfZm9udC53aWR0aCA+PiAzOworCXU4ICpzcmM7CisKKwl3aGlsZSAoY250LS0pIHsKKwkJc3JjID0gdmMtPnZjX2ZvbnQuZGF0YSArIChzY3JfcmVhZHcocysrKSYKKwkJCQkJICBjaGFybWFzaykqY2VsbHNpemU7CisKKwkJaWYgKGF0dHIpIHsKKwkJCXVwZGF0ZV9hdHRyKGJ1Ziwgc3JjLCBhdHRyLCB2Yyk7CisJCQlzcmMgPSBidWY7CisJCX0KKworCQlpZiAobGlrZWx5KGlkeCA9PSAxKSkKKwkJCV9fZmJfcGFkX2FsaWduZWRfYnVmZmVyKGRzdCwgZF9waXRjaCwgc3JjLCBpZHgsCisJCQkJCQlpbWFnZS0+aGVpZ2h0KTsKKwkJZWxzZQorCQkJZmJfcGFkX2FsaWduZWRfYnVmZmVyKGRzdCwgZF9waXRjaCwgc3JjLCBpZHgsCisJCQkJCSAgICAgIGltYWdlLT5oZWlnaHQpOworCisJCWRzdCArPSBzX3BpdGNoOworCX0KKworCWluZm8tPmZib3BzLT5mYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYml0X3B1dGNzX3VuYWxpZ25lZChzdHJ1Y3QgdmNfZGF0YSAqdmMsCisJCQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCB1MTYgKnMsCisJCQkJICAgICAgIHUzMiBhdHRyLCB1MzIgY250LCB1MzIgZF9waXRjaCwKKwkJCQkgICAgICAgdTMyIHNfcGl0Y2gsIHUzMiBjZWxsc2l6ZSwKKwkJCQkgICAgICAgc3RydWN0IGZiX2ltYWdlICppbWFnZSwgdTggKmJ1ZiwKKwkJCQkgICAgICAgdTggKmRzdCkKK3sKKwl1MTYgY2hhcm1hc2sgPSB2Yy0+dmNfaGlfZm9udF9tYXNrID8gMHgxZmYgOiAweGZmOworCXUzMiBzaGlmdF9sb3cgPSAwLCBtb2QgPSB2Yy0+dmNfZm9udC53aWR0aCAlIDg7CisJdTMyIHNoaWZ0X2hpZ2ggPSA4OworCXUzMiBpZHggPSB2Yy0+dmNfZm9udC53aWR0aCA+PiAzOworCXU4ICpzcmM7CisKKwl3aGlsZSAoY250LS0pIHsKKwkJc3JjID0gdmMtPnZjX2ZvbnQuZGF0YSArIChzY3JfcmVhZHcocysrKSYKKwkJCQkJICBjaGFybWFzaykqY2VsbHNpemU7CisKKwkJaWYgKGF0dHIpIHsKKwkJCXVwZGF0ZV9hdHRyKGJ1Ziwgc3JjLCBhdHRyLCB2Yyk7CisJCQlzcmMgPSBidWY7CisJCX0KKworCQlmYl9wYWRfdW5hbGlnbmVkX2J1ZmZlcihkc3QsIGRfcGl0Y2gsIHNyYywgaWR4LAorCQkJCQlpbWFnZS0+aGVpZ2h0LCBzaGlmdF9oaWdoLAorCQkJCQlzaGlmdF9sb3csIG1vZCk7CisJCXNoaWZ0X2xvdyArPSBtb2Q7CisJCWRzdCArPSAoc2hpZnRfbG93ID49IDgpID8gc19waXRjaCA6IHNfcGl0Y2ggLSAxOworCQlzaGlmdF9sb3cgJj0gNzsKKwkJc2hpZnRfaGlnaCA9IDggLSBzaGlmdF9sb3c7CisJfQorCisJaW5mby0+ZmJvcHMtPmZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisKK30KKwogc3RhdGljIHZvaWQgYml0X3B1dGNzKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCSAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpzLCBpbnQgY291bnQsIGludCB5eSwgaW50IHh4LAogCQkgICAgICBpbnQgZmcsIGludCBiZykKIHsKLQl1bnNpZ25lZCBzaG9ydCBjaGFybWFzayA9IHZjLT52Y19oaV9mb250X21hc2sgPyAweDFmZiA6IDB4ZmY7Ci0JdW5zaWduZWQgaW50IHdpZHRoID0gKHZjLT52Y19mb250LndpZHRoICsgNykgPj4gMzsKLQl1bnNpZ25lZCBpbnQgY2VsbHNpemUgPSB2Yy0+dmNfZm9udC5oZWlnaHQgKiB3aWR0aDsKLQl1bnNpZ25lZCBpbnQgbWF4Y250ID0gaW5mby0+cGl4bWFwLnNpemUvY2VsbHNpemU7Ci0JdW5zaWduZWQgaW50IHNjYW5fYWxpZ24gPSBpbmZvLT5waXhtYXAuc2Nhbl9hbGlnbiAtIDE7Ci0JdW5zaWduZWQgaW50IGJ1Zl9hbGlnbiA9IGluZm8tPnBpeG1hcC5idWZfYWxpZ24gLSAxOwotCXVuc2lnbmVkIGludCBzaGlmdF9sb3cgPSAwLCBtb2QgPSB2Yy0+dmNfZm9udC53aWR0aCAlIDg7Ci0JdW5zaWduZWQgaW50IHNoaWZ0X2hpZ2ggPSA4LCBwaXRjaCwgY250LCBzaXplLCBrOwotCXVuc2lnbmVkIGludCBpZHggPSB2Yy0+dmNfZm9udC53aWR0aCA+PiAzOwotCXVuc2lnbmVkIGludCBhdHRyaWJ1dGUgPSBnZXRfYXR0cmlidXRlKGluZm8sIHNjcl9yZWFkdyhzKSk7CiAJc3RydWN0IGZiX2ltYWdlIGltYWdlOwotCXU4ICpzcmMsICpkc3QsICpidWYgPSBOVUxMOworCXUzMiB3aWR0aCA9ICh2Yy0+dmNfZm9udC53aWR0aCArIDcpLzg7CisJdTMyIGNlbGxzaXplID0gd2lkdGggKiB2Yy0+dmNfZm9udC5oZWlnaHQ7CisJdTMyIG1heGNudCA9IGluZm8tPnBpeG1hcC5zaXplL2NlbGxzaXplOworCXUzMiBzY2FuX2FsaWduID0gaW5mby0+cGl4bWFwLnNjYW5fYWxpZ24gLSAxOworCXUzMiBidWZfYWxpZ24gPSBpbmZvLT5waXhtYXAuYnVmX2FsaWduIC0gMTsKKwl1MzIgbW9kID0gdmMtPnZjX2ZvbnQud2lkdGggJSA4LCBjbnQsIHBpdGNoLCBzaXplOworCXUzMiBhdHRyaWJ1dGUgPSBnZXRfYXR0cmlidXRlKGluZm8sIHNjcl9yZWFkdyhzKSk7CisJdTggKmRzdCwgKmJ1ZiA9IE5VTEw7CisKKwlpbWFnZS5mZ19jb2xvciA9IGZnOworCWltYWdlLmJnX2NvbG9yID0gYmc7CisJaW1hZ2UuZHggPSB4eCAqIHZjLT52Y19mb250LndpZHRoOworCWltYWdlLmR5ID0geXkgKiB2Yy0+dmNfZm9udC5oZWlnaHQ7CisJaW1hZ2UuaGVpZ2h0ID0gdmMtPnZjX2ZvbnQuaGVpZ2h0OworCWltYWdlLmRlcHRoID0gMTsKIAogCWlmIChhdHRyaWJ1dGUpIHsKIAkJYnVmID0ga21hbGxvYyhjZWxsc2l6ZSwgR0ZQX0tFUk5FTCk7CkBAIC0xMjYsMTkgKzE5NiwxMSBAQAogCQkJcmV0dXJuOwogCX0KIAotCWltYWdlLmZnX2NvbG9yID0gZmc7Ci0JaW1hZ2UuYmdfY29sb3IgPSBiZzsKLQotCWltYWdlLmR4ID0geHggKiB2Yy0+dmNfZm9udC53aWR0aDsKLQlpbWFnZS5keSA9IHl5ICogdmMtPnZjX2ZvbnQuaGVpZ2h0OwotCWltYWdlLmhlaWdodCA9IHZjLT52Y19mb250LmhlaWdodDsKLQlpbWFnZS5kZXB0aCA9IDE7Ci0KIAl3aGlsZSAoY291bnQpIHsKIAkJaWYgKGNvdW50ID4gbWF4Y250KQotCQkJY250ID0gayA9IG1heGNudDsKKwkJCWNudCA9IG1heGNudDsKIAkJZWxzZQotCQkJY250ID0gayA9IGNvdW50OworCQkJY250ID0gY291bnQ7CiAKIAkJaW1hZ2Uud2lkdGggPSB2Yy0+dmNfZm9udC53aWR0aCAqIGNudDsKIAkJcGl0Y2ggPSAoKGltYWdlLndpZHRoICsgNykgPj4gMykgKyBzY2FuX2FsaWduOwpAQCAtMTQ3LDQxICsyMDksMTggQEAKIAkJc2l6ZSAmPSB+YnVmX2FsaWduOwogCQlkc3QgPSBmYl9nZXRfYnVmZmVyX29mZnNldChpbmZvLCAmaW5mby0+cGl4bWFwLCBzaXplKTsKIAkJaW1hZ2UuZGF0YSA9IGRzdDsKLQkJaWYgKG1vZCkgewotCQkJd2hpbGUgKGstLSkgewotCQkJCXNyYyA9IHZjLT52Y19mb250LmRhdGEgKyAoc2NyX3JlYWR3KHMrKykmCi0JCQkJCQkJICBjaGFybWFzaykqY2VsbHNpemU7CiAKLQkJCQlpZiAoYXR0cmlidXRlKSB7Ci0JCQkJCXVwZGF0ZV9hdHRyKGJ1Ziwgc3JjLCBhdHRyaWJ1dGUsIHZjKTsKLQkJCQkJc3JjID0gYnVmOwotCQkJCX0KKwkJaWYgKCFtb2QpCisJCQliaXRfcHV0Y3NfYWxpZ25lZCh2YywgaW5mbywgcywgYXR0cmlidXRlLCBjbnQsIHBpdGNoLAorCQkJCQkgIHdpZHRoLCBjZWxsc2l6ZSwgJmltYWdlLCBidWYsIGRzdCk7CisJCWVsc2UKKwkJCWJpdF9wdXRjc191bmFsaWduZWQodmMsIGluZm8sIHMsIGF0dHJpYnV0ZSwgY250LAorCQkJCQkgICAgcGl0Y2gsIHdpZHRoLCBjZWxsc2l6ZSwgJmltYWdlLAorCQkJCQkgICAgYnVmLCBkc3QpOwogCi0JCQkJZmJfcGFkX3VuYWxpZ25lZF9idWZmZXIoZHN0LCBwaXRjaCwgc3JjLCBpZHgsCi0JCQkJCQlpbWFnZS5oZWlnaHQsIHNoaWZ0X2hpZ2gsCi0JCQkJCQlzaGlmdF9sb3csIG1vZCk7Ci0JCQkJc2hpZnRfbG93ICs9IG1vZDsKLQkJCQlkc3QgKz0gKHNoaWZ0X2xvdyA+PSA4KSA/IHdpZHRoIDogd2lkdGggLSAxOwotCQkJCXNoaWZ0X2xvdyAmPSA3OwotCQkJCXNoaWZ0X2hpZ2ggPSA4IC0gc2hpZnRfbG93OwotCQkJfQotCQl9IGVsc2UgewotCQkJd2hpbGUgKGstLSkgewotCQkJCXNyYyA9IHZjLT52Y19mb250LmRhdGEgKyAoc2NyX3JlYWR3KHMrKykmCi0JCQkJCQkJICBjaGFybWFzaykqY2VsbHNpemU7Ci0KLQkJCQlpZiAoYXR0cmlidXRlKSB7Ci0JCQkJCXVwZGF0ZV9hdHRyKGJ1Ziwgc3JjLCBhdHRyaWJ1dGUsIHZjKTsKLQkJCQkJc3JjID0gYnVmOwotCQkJCX0KLQotCQkJCWZiX3BhZF9hbGlnbmVkX2J1ZmZlcihkc3QsIHBpdGNoLCBzcmMsIGlkeCwgaW1hZ2UuaGVpZ2h0KTsKLQkJCQlkc3QgKz0gd2lkdGg7Ci0JCQl9Ci0JCX0KLQkJaW5mby0+ZmJvcHMtPmZiX2ltYWdlYmxpdChpbmZvLCAmaW1hZ2UpOwogCQlpbWFnZS5keCArPSBjbnQgKiB2Yy0+dmNfZm9udC53aWR0aDsKIAkJY291bnQgLT0gY250OworCQlzICs9IGNudDsKIAl9CiAKIAkvKiBidWYgaXMgYWx3YXlzIE5VTEwgZXhjZXB0IHdoZW4gaW4gbW9ub2Nocm9tZSBtb2RlLCBzbyBpbiB0aGlzIGNhc2UKQEAgLTE4OSw2ICsyMjgsNyBAQAogCSAgIE5VTEwgcG9pbnRlcnMganVzdCBmaW5lICovCiAJaWYgKHVubGlrZWx5KGJ1ZikpCiAJCWtmcmVlKGJ1Zik7CisKIH0KIAogc3RhdGljIHZvaWQgYml0X2NsZWFyX21hcmdpbnMoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKaW5kZXggMzVjODhiZC4uMmU5MzIyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogc3RhdGljIGlubGluZSBpbnQgZ2V0X2NvbG9yKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sCiAJICAgICAgdTE2IGMsIGludCBpc19mZykKIHsKLQlpbnQgZGVwdGggPSBmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhcik7CisJaW50IGRlcHRoID0gZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIsICZpbmZvLT5maXgpOwogCWludCBjb2xvciA9IDA7CiAKIAlpZiAoY29uc29sZV9ibGFua2VkKSB7CkBAIC0yMzAsOSArMjMwLDEzIEBACiAJc3dpdGNoIChkZXB0aCkgewogCWNhc2UgMToKIAl7CisJCWludCBjb2wgPSB+KDB4ZmZmIDw8IChtYXgoaW5mby0+dmFyLmdyZWVuLmxlbmd0aCwKKwkJCQkJICBtYXgoaW5mby0+dmFyLnJlZC5sZW5ndGgsCisJCQkJCSAgICAgIGluZm8tPnZhci5ibHVlLmxlbmd0aCkpKSkgJiAweGZmOworCiAJCS8qIDAgb3IgMSAqLwotCQlpbnQgZmcgPSAoaW5mby0+Zml4LnZpc3VhbCAhPSBGQl9WSVNVQUxfTU9OTzAxKSA/IDEgOiAwOwotCQlpbnQgYmcgPSAoaW5mby0+Zml4LnZpc3VhbCAhPSBGQl9WSVNVQUxfTU9OTzAxKSA/IDAgOiAxOworCQlpbnQgZmcgPSAoaW5mby0+Zml4LnZpc3VhbCAhPSBGQl9WSVNVQUxfTU9OTzAxKSA/IGNvbCA6IDA7CisJCWludCBiZyA9IChpbmZvLT5maXgudmlzdWFsICE9IEZCX1ZJU1VBTF9NT05PMDEpID8gMCA6IGNvbDsKIAogCQlpZiAoY29uc29sZV9ibGFua2VkKQogCQkJZmcgPSBiZzsKQEAgLTI0Myw5ICsyNDcsMjUgQEAKIAljYXNlIDI6CiAJCS8qCiAJCSAqIFNjYWxlIGRvd24gMTYtY29sb3JzIHRvIDQgY29sb3JzLiBEZWZhdWx0IDQtY29sb3IgcGFsZXR0ZQotCQkgKiBpcyBncmF5c2NhbGUuCisJCSAqIGlzIGdyYXlzY2FsZS4gSG93ZXZlciwgc2ltcGx5IGRpdmlkaW5nIHRoZSB2YWx1ZXMgYnkgNAorCQkgKiB3aWxsIG5vdCB3b3JrLCBhcyBjb2xvcnMgMSwgMiBhbmQgMyB3aWxsIGJlIHNjYWxlZC1kb3duCisJCSAqIHRvIHplcm8gcmVuZGVyaW5nIHRoZW0gaW52aXNpYmxlLiAgU28gZW1waXJpY2FsbHkgY29udmVydAorCQkgKiBjb2xvcnMgdG8gYSBzYW5lIDQtbGV2ZWwgZ3JheXNjYWxlLgogCQkgKi8KLQkJY29sb3IgLz0gNDsKKwkJc3dpdGNoIChjb2xvcikgeworCQljYXNlIDA6CisJCQljb2xvciA9IDA7IC8qIGJsYWNrICovCisJCQlicmVhazsKKwkJY2FzZSAxIC4uLiA2OgorCQkJY29sb3IgPSAyOyAvKiB3aGl0ZSAqLworCQkJYnJlYWs7CisJCWNhc2UgNyAuLi4gODoKKwkJCWNvbG9yID0gMTsgLyogZ3JheSAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb2xvciA9IDM7IC8qIGludGVuc2Ugd2hpdGUgKi8KKwkJCWJyZWFrOworCQl9CiAJCWJyZWFrOwogCWNhc2UgMzoKIAkJLyoKQEAgLTMxMSw2ICszMzEsMzUgQEAKIAltb2RfdGltZXIoJm9wcy0+Y3Vyc29yX3RpbWVyLCBqaWZmaWVzICsgSFovNSk7CiB9CiAKK3N0YXRpYyB2b2lkIGZiY29uX2FkZF9jdXJzb3JfdGltZXIoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOworCisJaWYgKCghaW5mby0+cXVldWUuZnVuYyB8fCBpbmZvLT5xdWV1ZS5mdW5jID09IGZiX2ZsYXNoY3Vyc29yKSAmJgorCSAgICAhKG9wcy0+ZmxhZ3MgJiBGQkNPTl9GTEFHU19DVVJTT1JfVElNRVIpKSB7CisJCWlmICghaW5mby0+cXVldWUuZnVuYykKKwkJCUlOSVRfV09SSygmaW5mby0+cXVldWUsIGZiX2ZsYXNoY3Vyc29yLCBpbmZvKTsKKworCQlpbml0X3RpbWVyKCZvcHMtPmN1cnNvcl90aW1lcik7CisJCW9wcy0+Y3Vyc29yX3RpbWVyLmZ1bmN0aW9uID0gY3Vyc29yX3RpbWVyX2hhbmRsZXI7CisJCW9wcy0+Y3Vyc29yX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyA1OworCQlvcHMtPmN1cnNvcl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcgKSBpbmZvOworCQlhZGRfdGltZXIoJm9wcy0+Y3Vyc29yX3RpbWVyKTsKKwkJb3BzLT5mbGFncyB8PSBGQkNPTl9GTEFHU19DVVJTT1JfVElNRVI7CisJfQorfQorCitzdGF0aWMgdm9pZCBmYmNvbl9kZWxfY3Vyc29yX3RpbWVyKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IGluZm8tPmZiY29uX3BhcjsKKworCWlmIChpbmZvLT5xdWV1ZS5mdW5jID09IGZiX2ZsYXNoY3Vyc29yICYmCisJICAgIG9wcy0+ZmxhZ3MgJiBGQkNPTl9GTEFHU19DVVJTT1JfVElNRVIpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJm9wcy0+Y3Vyc29yX3RpbWVyKTsKKwkJb3BzLT5mbGFncyAmPSB+RkJDT05fRkxBR1NfQ1VSU09SX1RJTUVSOworCX0KK30KKwogI2lmbmRlZiBNT0RVTEUKIHN0YXRpYyBpbnQgX19pbml0IGZiX2NvbnNvbGVfc2V0dXAoY2hhciAqdGhpc19vcHQpCiB7CkBAIC00MjYsNyArNDc1LDcgQEAKIAkgKiByZW1vdmUgdW5kZXJsaW5lIGF0dHJpYnV0ZSBmcm9tIGVyYXNlIGNoYXJhY3RlcgogCSAqIGlmIGJsYWNrIGFuZCB3aGl0ZSBmcmFtZWJ1ZmZlci4KIAkgKi8KLQlpZiAoZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIpID09IDEpCisJaWYgKGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyLCAmaW5mby0+Zml4KSA9PSAxKQogCQllcmFzZSAmPSB+MHg0MDA7CiAJbG9nb19oZWlnaHQgPSBmYl9wcmVwYXJlX2xvZ28oaW5mbyk7CiAJbG9nb19saW5lcyA9IChsb2dvX2hlaWdodCArIHZjLT52Y19mb250LmhlaWdodCAtIDEpIC8KQEAgLTU2Myw5ICs2MTIsNyBAQAogCX0KIAogCWlmICghZXJyKSB7Ci0JCWlmIChvbGRpbmZvLT5xdWV1ZS5mdW5jID09IGZiX2ZsYXNoY3Vyc29yKQotCQkJZGVsX3RpbWVyX3N5bmMoJm9wcy0+Y3Vyc29yX3RpbWVyKTsKLQorCQlmYmNvbl9kZWxfY3Vyc29yX3RpbWVyKG9sZGluZm8pOwogCQlrZnJlZShvcHMtPmN1cnNvcl9zdGF0ZS5tYXNrKTsKIAkJa2ZyZWUob3BzLT5jdXJzb3JfZGF0YSk7CiAJCWtmcmVlKG9sZGluZm8tPmZiY29uX3Bhcik7CkBAIC01NzYsMjIgKzYyMyw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgY29uMmZiX2luaXRfbmV3aW5mbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlpZiAoIWluZm8tPnF1ZXVlLmZ1bmMgfHwgaW5mby0+cXVldWUuZnVuYyA9PSBmYl9mbGFzaGN1cnNvcikgewotCQlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7Ci0KLQkJaWYgKCFpbmZvLT5xdWV1ZS5mdW5jKQotCQkJSU5JVF9XT1JLKCZpbmZvLT5xdWV1ZSwgZmJfZmxhc2hjdXJzb3IsIGluZm8pOwotCi0JCWluaXRfdGltZXIoJm9wcy0+Y3Vyc29yX3RpbWVyKTsKLQkJb3BzLT5jdXJzb3JfdGltZXIuZnVuY3Rpb24gPSBjdXJzb3JfdGltZXJfaGFuZGxlcjsKLQkJb3BzLT5jdXJzb3JfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAvIDU7Ci0JCW9wcy0+Y3Vyc29yX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyApIGluZm87Ci0JCWFkZF90aW1lcigmb3BzLT5jdXJzb3JfdGltZXIpOwotCX0KLX0KLQogc3RhdGljIHZvaWQgY29uMmZiX2luaXRfZGlzcGxheShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkJCWludCB1bml0LCBpbnQgc2hvd19sb2dvKQogewpAQCAtNjc1LDcgKzcwNiw3IEBACiAgCQkJCSBsb2dvX3Nob3duICE9IEZCQ09OX0xPR09fRE9OVFNIT1cpOwogCiAgCQlpZiAoIWZvdW5kKQotIAkJCWNvbjJmYl9pbml0X25ld2luZm8oaW5mbyk7CisgCQkJZmJjb25fYWRkX2N1cnNvcl90aW1lcihpbmZvKTsKICAJCWNvbjJmYl9tYXBfYm9vdFt1bml0XSA9IG5ld2lkeDsKICAJCWNvbjJmYl9pbml0X2Rpc3BsYXkodmMsIGluZm8sIHVuaXQsIHNob3dfbG9nbyk7CiAJfQpAQCAtODc4LDE4ICs5MDksNyBAQAogCX0KICNlbmRpZgkJCQkvKiBDT05GSUdfTUFDICovCiAKLQkvKiBJbml0aWFsaXplIHRoZSB3b3JrIHF1ZXVlLiBJZiB0aGUgZHJpdmVyIHByb3ZpZGVzIGl0cwotCSAqIG93biB3b3JrIHF1ZXVlIHRoaXMgbWVhbnMgaXQgd2lsbCB1c2Ugc29tZXRoaW5nIGJlc2lkZXMgCi0JICogZGVmYXVsdCB0aW1lciB0byBmbGFzaCB0aGUgY3Vyc29yLiAqLwotCWlmICghaW5mby0+cXVldWUuZnVuYykgewotCQlJTklUX1dPUksoJmluZm8tPnF1ZXVlLCBmYl9mbGFzaGN1cnNvciwgaW5mbyk7Ci0KLQkJaW5pdF90aW1lcigmb3BzLT5jdXJzb3JfdGltZXIpOwotCQlvcHMtPmN1cnNvcl90aW1lci5mdW5jdGlvbiA9IGN1cnNvcl90aW1lcl9oYW5kbGVyOwotCQlvcHMtPmN1cnNvcl90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaIC8gNTsKLQkJb3BzLT5jdXJzb3JfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nICkgaW5mbzsKLQkJYWRkX3RpbWVyKCZvcHMtPmN1cnNvcl90aW1lcik7Ci0JfQorCWZiY29uX2FkZF9jdXJzb3JfdGltZXIoaW5mbyk7CiAJcmV0dXJuIGRpc3BsYXlfZGVzYzsKIH0KIApAQCAtOTMwLDcgKzk1MCw3IEBACiAJfQogCWlmIChwLT51c2VyZm9udCkKIAkJY2hhcmNudCA9IEZOVENIQVJDTlQocC0+Zm9udGRhdGEpOwotCXZjLT52Y19jYW5fZG9fY29sb3IgPSAoZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIpICE9IDEpOworCXZjLT52Y19jYW5fZG9fY29sb3IgPSAoZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIsICZpbmZvLT5maXgpIT0xKTsKIAl2Yy0+dmNfY29tcGxlbWVudF9tYXNrID0gdmMtPnZjX2Nhbl9kb19jb2xvciA/IDB4NzcwMCA6IDB4MDgwMDsKIAlpZiAoY2hhcmNudCA9PSAyNTYpIHsKIAkJdmMtPnZjX2hpX2ZvbnRfbWFzayA9IDA7CkBAIC0xMTc4LDcgKzExOTgsMTIgQEAKIAlpZiAocC0+dXNlcmZvbnQpCiAJCWNoYXJjbnQgPSBGTlRDSEFSQ05UKHAtPmZvbnRkYXRhKTsKIAotCXZjLT52Y19jYW5fZG9fY29sb3IgPSAoZmJfZ2V0X2NvbG9yX2RlcHRoKHZhcikgIT0gMSk7CisJdmFyLT5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX05PVzsKKwlpbmZvLT52YXIuYWN0aXZhdGUgPSB2YXItPmFjdGl2YXRlOworCWluZm8tPnZhci55b2Zmc2V0ID0gaW5mby0+dmFyLnhvZmZzZXQgPSAwOworCWZiX3NldF92YXIoaW5mbywgdmFyKTsKKworCXZjLT52Y19jYW5fZG9fY29sb3IgPSAoZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIsICZpbmZvLT5maXgpIT0xKTsKIAl2Yy0+dmNfY29tcGxlbWVudF9tYXNrID0gdmMtPnZjX2Nhbl9kb19jb2xvciA/IDB4NzcwMCA6IDB4MDgwMDsKIAlpZiAoY2hhcmNudCA9PSAyNTYpIHsKIAkJdmMtPnZjX2hpX2ZvbnRfbWFzayA9IDA7CkBAIC0xODk4LDcgKzE5MjMsNyBAQAogCiBzdGF0aWMgaW50IGZiY29uX3N3aXRjaChzdHJ1Y3QgdmNfZGF0YSAqdmMpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGZiX2luZm8gKmluZm8sICpvbGRfaW5mbyA9IE5VTEw7CiAJc3RydWN0IGRpc3BsYXkgKnAgPSAmZmJfZGlzcGxheVt2Yy0+dmNfbnVtXTsKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOwogCWludCBpLCBwcmV2X2NvbnNvbGU7CkBAIC0xOTMxLDcgKzE5NTYsOCBAQAogCX0KIAogCXByZXZfY29uc29sZSA9ICgoc3RydWN0IGZiY29uX29wcyAqKWluZm8tPmZiY29uX3BhciktPmN1cnJjb247Ci0KKwlpZiAocHJldl9jb25zb2xlICE9IC0xKQorCQlvbGRfaW5mbyA9IHJlZ2lzdGVyZWRfZmJbY29uMmZiX21hcFtwcmV2X2NvbnNvbGVdXTsKIAkvKgogCSAqIEZJWE1FOiBJZiB3ZSBoYXZlIG11bHRpcGxlIGZiZGV2J3MgbG9hZGVkLCB3ZSBuZWVkIHRvCiAJICogdXBkYXRlIGFsbCBpbmZvLT5jdXJyY29uLiAgUGVyaGFwcywgd2UgY2FuIHBsYWNlIHRoaXMKQEAgLTE5NTksMTUgKzE5ODUsMTcgQEAKIAlpbmZvLT52YXIueW9mZnNldCA9IGluZm8tPnZhci54b2Zmc2V0ID0gcC0+eXNjcm9sbCA9IDA7CiAJZmJfc2V0X3ZhcihpbmZvLCAmdmFyKTsKIAotCWlmIChwcmV2X2NvbnNvbGUgIT0gLTEgJiYKLQkgICAgcmVnaXN0ZXJlZF9mYltjb24yZmJfbWFwW3ByZXZfY29uc29sZV1dICE9IGluZm8gJiYKLQkgICAgaW5mby0+ZmJvcHMtPmZiX3NldF9wYXIpCi0JCWluZm8tPmZib3BzLT5mYl9zZXRfcGFyKGluZm8pOworCWlmIChvbGRfaW5mbyAhPSBOVUxMICYmIG9sZF9pbmZvICE9IGluZm8pIHsKKwkJaWYgKGluZm8tPmZib3BzLT5mYl9zZXRfcGFyKQorCQkJaW5mby0+ZmJvcHMtPmZiX3NldF9wYXIoaW5mbyk7CisJCWZiY29uX2RlbF9jdXJzb3JfdGltZXIob2xkX2luZm8pOworCQlmYmNvbl9hZGRfY3Vyc29yX3RpbWVyKGluZm8pOworCX0KIAogCXNldF9ibGl0dGluZ190eXBlKHZjLCBpbmZvLCBwKTsKIAkoKHN0cnVjdCBmYmNvbl9vcHMgKilpbmZvLT5mYmNvbl9wYXIpLT5jdXJzb3JfcmVzZXQgPSAxOwogCi0JdmMtPnZjX2Nhbl9kb19jb2xvciA9IChmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhcikgIT0gMSk7CisJdmMtPnZjX2Nhbl9kb19jb2xvciA9IChmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhciwgJmluZm8tPmZpeCkhPTEpOwogCXZjLT52Y19jb21wbGVtZW50X21hc2sgPSB2Yy0+dmNfY2FuX2RvX2NvbG9yID8gMHg3NzAwIDogMHgwODAwOwogCXVwZGF0ZXNjcm9sbG1vZGUocCwgaW5mbywgdmMpOwogCkBAIC0yMDQ4LDExICsyMDc2LDE2IEBACiAJCQkJZmJjb25fZ2VuZXJpY19ibGFuayh2YywgaW5mbywgYmxhbmspOwogCQl9CiAKLSAJCWlmICghYmxhbmspCi0gCQkJdXBkYXRlX3NjcmVlbih2Yyk7Ci0gCX0KKwkJaWYgKCFibGFuaykKKwkJCXVwZGF0ZV9zY3JlZW4odmMpOworCX0KIAotIAlyZXR1cm4gMDsKKwlpZiAoIWJsYW5rKQorCQlmYmNvbl9hZGRfY3Vyc29yX3RpbWVyKGluZm8pOworCWVsc2UKKwkJZmJjb25fZGVsX2N1cnNvcl90aW1lcihpbmZvKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBmYmNvbl9mcmVlX2ZvbnQoc3RydWN0IGRpc3BsYXkgKnApCkBAIC0yMzMyLDcgKzIzNjUsNyBAQAogCWlmICghQ09OX0lTX1ZJU0lCTEUodmMpKQogCQlyZXR1cm4gMDsKIAotCWRlcHRoID0gZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIpOworCWRlcHRoID0gZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIsICZpbmZvLT5maXgpOwogCWlmIChkZXB0aCA+IDMpIHsKIAkJZm9yIChpID0gaiA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCQlrID0gdGFibGVbaV07CkBAIC0yNTkzLDYgKzI2MjYsNTEgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGZiY29uX3NldF9hbGxfdmNzKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IGluZm8tPmZiY29uX3BhcjsKKwlzdHJ1Y3QgdmNfZGF0YSAqdmM7CisJc3RydWN0IGRpc3BsYXkgKnA7CisJaW50IGksIHJvd3MsIGNvbHM7CisKKwlpZiAoIW9wcyB8fCBvcHMtPmN1cnJjb24gPCAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspIHsKKwkJdmMgPSB2Y19jb25zW2ldLmQ7CisJCWlmICghdmMgfHwgdmMtPnZjX21vZGUgIT0gS0RfVEVYVCB8fAorCQkgICAgcmVnaXN0ZXJlZF9mYltjb24yZmJfbWFwW2ldXSAhPSBpbmZvKQorCQkJY29udGludWU7CisKKwkJcCA9ICZmYl9kaXNwbGF5W3ZjLT52Y19udW1dOworCisJCWluZm8tPnZhci54b2Zmc2V0ID0gaW5mby0+dmFyLnlvZmZzZXQgPSBwLT55c2Nyb2xsID0gMDsKKwkJdmFyX3RvX2Rpc3BsYXkocCwgJmluZm8tPnZhciwgaW5mbyk7CisJCWNvbHMgPSBpbmZvLT52YXIueHJlcyAvIHZjLT52Y19mb250LndpZHRoOworCQlyb3dzID0gaW5mby0+dmFyLnlyZXMgLyB2Yy0+dmNfZm9udC5oZWlnaHQ7CisJCXZjX3Jlc2l6ZSh2YywgY29scywgcm93cyk7CisKKwkJaWYgKENPTl9JU19WSVNJQkxFKHZjKSkgeworCQkJdXBkYXRlc2Nyb2xsbW9kZShwLCBpbmZvLCB2Yyk7CisJCQlzY3JvbGxiYWNrX21heCA9IDA7CisJCQlzY3JvbGxiYWNrX2N1cnJlbnQgPSAwOworCQkJdXBkYXRlX3Zhcih2Yy0+dmNfbnVtLCBpbmZvKTsKKwkJCWZiY29uX3NldF9wYWxldHRlKHZjLCBjb2xvcl90YWJsZSk7CisJCQl1cGRhdGVfc2NyZWVuKHZjKTsKKwkJCWlmIChzb2Z0YmFja19idWYpIHsKKwkJCQlpbnQgbCA9IGZiY29uX3NvZnRiYWNrX3NpemUgLyB2Yy0+dmNfc2l6ZV9yb3c7CisJCQkJaWYgKGwgPiA1KQorCQkJCQlzb2Z0YmFja19lbmQgPSBzb2Z0YmFja19idWYgKyBsICogdmMtPnZjX3NpemVfcm93OworCQkJCWVsc2UgeworCQkJCQkvKiBTbWFsbGVyIHNjcm9sbGJhY2sgbWFrZXMgbm8gc2Vuc2UsIGFuZCAwCisJCQkJCSAgIHdvdWxkIHNjcmV3IHRoZSBvcGVyYXRpb24gdG90YWxseSAqLworCQkJCQlzb2Z0YmFja190b3AgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKwogc3RhdGljIGludCBmYmNvbl9tb2RlX2RlbGV0ZWQoc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCQkgICAgICBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlKQogewpAQCAtMjcwOCw2ICsyNzg2LDkgQEAKIAljYXNlIEZCX0VWRU5UX01PREVfQ0hBTkdFOgogCQlmYmNvbl9tb2RlY2hhbmdlZChpbmZvKTsKIAkJYnJlYWs7CisJY2FzZSBGQl9FVkVOVF9NT0RFX0NIQU5HRV9BTEw6CisJCWZiY29uX3NldF9hbGxfdmNzKGluZm8pOworCQlicmVhazsKIAljYXNlIEZCX0VWRU5UX01PREVfREVMRVRFOgogCQltb2RlID0gZXZlbnQtPmRhdGE7CiAJCXJldCA9IGZiY29uX21vZGVfZGVsZXRlZChpbmZvLCBtb2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5oIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmgKaW5kZXggNWQzNzc4Ni4uMDhiZWZhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmgKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmgKQEAgLTE4LDcgKzE4LDggQEAKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jZGVmaW5lIEZCQ09OX0ZMQUdTX0lOSVQgMQorI2RlZmluZSBGQkNPTl9GTEFHU19JTklUICAgICAgICAgMQorI2RlZmluZSBGQkNPTl9GTEFHU19DVVJTT1JfVElNRVIgMgogCiAgICAvKgogICAgICogICAgVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIGxvdy1sZXZlbCBjb25zb2xlIGRyaXZlciBhbmQgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKaW5kZXggZDI3ZmE5MS4uMDcwNWNkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYwpAQCAtNDk3LDYgKzQ5Nyw1NyBAQAogCX0KIH0KIAorc3RhdGljIGludCB2Z2Fjb25fZG9yZXNpemUoc3RydWN0IHZjX2RhdGEgKmMsCisJCXVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBzY2FubGluZXMgPSBoZWlnaHQgKiBjLT52Y19mb250LmhlaWdodDsKKwl1OCBzY2FubGluZXNfbG8sIHI3LCB2c3luY19lbmQsIG1vZGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmdhX2xvY2ssIGZsYWdzKTsKKworCW91dGJfcChWR0FfQ1JUQ19NT0RFLCB2Z2FfdmlkZW9fcG9ydF9yZWcpOworCW1vZGUgPSBpbmJfcCh2Z2FfdmlkZW9fcG9ydF92YWwpOworCisJaWYgKG1vZGUgJiAweDA0KQorCQlzY2FubGluZXMgPj49IDE7CisKKwlzY2FubGluZXMgLT0gMTsKKwlzY2FubGluZXNfbG8gPSBzY2FubGluZXMgJiAweGZmOworCisJb3V0Yl9wKFZHQV9DUlRDX09WRVJGTE9XLCB2Z2FfdmlkZW9fcG9ydF9yZWcpOworCXI3ID0gaW5iX3AodmdhX3ZpZGVvX3BvcnRfdmFsKSAmIH4weDQyOworCisJaWYgKHNjYW5saW5lcyAmIDB4MTAwKQorCQlyNyB8PSAweDAyOworCWlmIChzY2FubGluZXMgJiAweDIwMCkKKwkJcjcgfD0gMHg0MDsKKworCS8qIGRlcHJvdGVjdCByZWdpc3RlcnMgKi8KKwlvdXRiX3AoVkdBX0NSVENfVl9TWU5DX0VORCwgdmdhX3ZpZGVvX3BvcnRfcmVnKTsKKwl2c3luY19lbmQgPSBpbmJfcCh2Z2FfdmlkZW9fcG9ydF92YWwpOworCW91dGJfcChWR0FfQ1JUQ19WX1NZTkNfRU5ELCB2Z2FfdmlkZW9fcG9ydF9yZWcpOworCW91dGJfcCh2c3luY19lbmQgJiB+MHg4MCwgdmdhX3ZpZGVvX3BvcnRfdmFsKTsKKworCW91dGJfcChWR0FfQ1JUQ19IX0RJU1AsIHZnYV92aWRlb19wb3J0X3JlZyk7CisJb3V0Yl9wKHdpZHRoIC0gMSwgdmdhX3ZpZGVvX3BvcnRfdmFsKTsKKwlvdXRiX3AoVkdBX0NSVENfT0ZGU0VULCB2Z2FfdmlkZW9fcG9ydF9yZWcpOworCW91dGJfcCh3aWR0aCA+PiAxLCB2Z2FfdmlkZW9fcG9ydF92YWwpOworCisJb3V0Yl9wKFZHQV9DUlRDX1ZfRElTUF9FTkQsIHZnYV92aWRlb19wb3J0X3JlZyk7CisJb3V0Yl9wKHNjYW5saW5lc19sbywgdmdhX3ZpZGVvX3BvcnRfdmFsKTsKKwlvdXRiX3AoVkdBX0NSVENfT1ZFUkZMT1csIHZnYV92aWRlb19wb3J0X3JlZyk7CisJb3V0Yl9wKHI3LHZnYV92aWRlb19wb3J0X3ZhbCk7CisKKwkvKiByZXByb3RlY3QgcmVnaXN0ZXJzICovCisJb3V0Yl9wKFZHQV9DUlRDX1ZfU1lOQ19FTkQsIHZnYV92aWRlb19wb3J0X3JlZyk7CisJb3V0Yl9wKHZzeW5jX2VuZCwgdmdhX3ZpZGVvX3BvcnRfdmFsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZnYV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB2Z2Fjb25fc3dpdGNoKHN0cnVjdCB2Y19kYXRhICpjKQogewogCS8qCkBAIC01MTAsOSArNTYxLDEzIEBACiAJLyogV2UgY2FuIG9ubHkgY29weSBvdXQgdGhlIHNpemUgb2YgdGhlIHZpZGVvIGJ1ZmZlciBoZXJlLAogCSAqIG90aGVyd2lzZSB3ZSBnZXQgaW50byBWR0EgQklPUyAqLwogCi0JaWYgKCF2Z2FfaXNfZ2Z4KQorCWlmICghdmdhX2lzX2dmeCkgewogCQlzY3JfbWVtY3B5dygodTE2ICopIGMtPnZjX29yaWdpbiwgKHUxNiAqKSBjLT52Y19zY3JlZW5idWYsCi0JCQkgICAgYy0+dmNfc2NyZWVuYnVmX3NpemUgPiB2Z2FfdnJhbV9zaXplID8gdmdhX3ZyYW1fc2l6ZSA6IGMtPnZjX3NjcmVlbmJ1Zl9zaXplKTsKKwkJCSAgICBjLT52Y19zY3JlZW5idWZfc2l6ZSA+IHZnYV92cmFtX3NpemUgPworCQkJCXZnYV92cmFtX3NpemUgOiBjLT52Y19zY3JlZW5idWZfc2l6ZSk7CisJCXZnYWNvbl9kb3Jlc2l6ZShjLCBjLT52Y19jb2xzLCBjLT52Y19yb3dzKTsKKwl9CisKIAlyZXR1cm4gMDsJCS8qIFJlZHJhd2luZyBub3QgbmVlZGVkICovCiB9CiAKQEAgLTk2Miw2ICsxMDE3LDE3IEBACiAKICNlbmRpZgogCitzdGF0aWMgaW50IHZnYWNvbl9yZXNpemUoc3RydWN0IHZjX2RhdGEgKmMsIHVuc2lnbmVkIGludCB3aWR0aCwKKwkJCQl1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworCWlmICh3aWR0aCAlIDIgfHwgd2lkdGggPiBPUklHX1ZJREVPX0NPTFMgfHwgaGVpZ2h0ID4gT1JJR19WSURFT19MSU5FUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoQ09OX0lTX1ZJU0lCTEUoYykgJiYgIXZnYV9pc19nZngpIC8qIHdobyBrbm93cyAqLworCQl2Z2Fjb25fZG9yZXNpemUoYywgd2lkdGgsIGhlaWdodCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdmdhY29uX3Njcm9sbGRlbHRhKHN0cnVjdCB2Y19kYXRhICpjLCBpbnQgbGluZXMpCiB7CiAJaWYgKCFsaW5lcykJCS8qIFR1cm4gc2Nyb2xsYmFjayBvZmYgKi8KQEAgLTExMDMsNiArMTE2OSw3IEBACiAJLmNvbl9ibGFuayA9IHZnYWNvbl9ibGFuaywKIAkuY29uX2ZvbnRfc2V0ID0gdmdhY29uX2ZvbnRfc2V0LAogCS5jb25fZm9udF9nZXQgPSB2Z2Fjb25fZm9udF9nZXQsCisJLmNvbl9yZXNpemUgPSB2Z2Fjb25fcmVzaXplLAogCS5jb25fc2V0X3BhbGV0dGUgPSB2Z2Fjb25fc2V0X3BhbGV0dGUsCiAJLmNvbl9zY3JvbGxkZWx0YSA9IHZnYWNvbl9zY3JvbGxkZWx0YSwKIAkuY29uX3NldF9vcmlnaW4gPSB2Z2Fjb25fc2V0X29yaWdpbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY3libGFmYi5jIGIvZHJpdmVycy92aWRlby9jeWJsYWZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyNzYyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vY3libGFmYi5jCkBAIC0wLDAgKzEsMTQ1NiBAQAorLyoKKyAqIEZyYW1lIGJ1ZmZlciBkcml2ZXIgZm9yIFRyaWRlbnQgQ3liZXJibGFkZS9pMSBncmFwaGljcyBjb3JlCisgKgorICogQ29weXJpZ2h0IDIwMDUgS251dCBQZXRlcnNlbiA8S251dF9QZXRlcnNlbkB0LW9ubGluZS5kZT4KKyAqCisgKiBDUkVESVRTOgorICoJdHJpZGVudGZiLmMgYnkgSmFuaSBNb25vc2VzCisgKglzZWUgZmlsZXMgYWJvdmUgZm9yIGZ1cnRoZXIgY3JlZGl0cworICoKKyAqIFRPRE86CisgKgorICovCisKKyNkZWZpbmUgQ1lCTEFGQl9ERUJVRyAwCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDx2aWRlby9jeWJsYWZiLmg+CisKKyNkZWZpbmUgVkVSU0lPTiAiMC41NCIKKworc3RydWN0IGN5YmxhZmJfcGFyIHsKKwl1MzIgcHNldWRvX3BhbFsxNl07CisJc3RydWN0IGZiX29wcyBvcHM7Cit9OworCitzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGN5YmxhZmJfZml4IF9fZGV2aW5pdGRhdGEgPSB7CisJLmlkID0gIkN5QmxhIiwKKwkudHlwZSA9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUywKKwkueXBhbnN0ZXAgPSAxLAorCS52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1IsCisJLmFjY2VsID0gRkJfQUNDRUxfTk9ORSwKK307CisKK3N0YXRpYyBjaGFyICptb2RlIF9fZGV2aW5pdGRhdGEgPSBOVUxMOworc3RhdGljIGludCBicHAgX19kZXZpbml0ZGF0YSA9IDg7CitzdGF0aWMgaW50IHJlZiBfX2RldmluaXRkYXRhID0gNzU7CitzdGF0aWMgaW50IGZwIF9fZGV2aW5pdGRhdGE7CitzdGF0aWMgaW50IGNydCBfX2RldmluaXRkYXRhOworc3RhdGljIGludCBtZW1zaXplIF9fZGV2aW5pdGRhdGE7CitzdGF0aWMgaW50IHZlc2FmYiBfX2RldmluaXRkYXRhOworCitzdGF0aWMgaW50IG5hdGl2ZXg7CitzdGF0aWMgaW50IGNlbnRlcjsKK3N0YXRpYyBpbnQgc3RyZXRjaDsKK3N0YXRpYyBpbnQgcGNpd2IgPSAxOworc3RhdGljIGludCBwY2lyYiA9IDE7CitzdGF0aWMgaW50IHBjaXdyID0gMTsKK3N0YXRpYyBpbnQgcGNpcnIgPSAxOworc3RhdGljIGludCB2ZXJib3NpdHk7CitzdGF0aWMgaW50IGRpc3BsYXl0eXBlOworCitzdGF0aWMgdm9pZCBfX2lvbWVtICogaW9fdmlydDsgLy8gaW9zcGFjZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzCisKK21vZHVsZV9wYXJhbShtb2RlLGNoYXJwLDApOworbW9kdWxlX3BhcmFtKGJwcCxpbnQsMCk7Cittb2R1bGVfcGFyYW0ocmVmLGludCwwKTsKK21vZHVsZV9wYXJhbShmcCxpbnQsMCk7Cittb2R1bGVfcGFyYW0oY3J0LGludCwwKTsKK21vZHVsZV9wYXJhbShuYXRpdmV4LGludCwwKTsKK21vZHVsZV9wYXJhbShjZW50ZXIsaW50LDApOworbW9kdWxlX3BhcmFtKHN0cmV0Y2gsaW50LDApOworbW9kdWxlX3BhcmFtKHBjaXdiLGludCwwKTsKK21vZHVsZV9wYXJhbShwY2lyYixpbnQsMCk7Cittb2R1bGVfcGFyYW0ocGNpd3IsaW50LDApOworbW9kdWxlX3BhcmFtKHBjaXJyLGludCwwKTsKK21vZHVsZV9wYXJhbShtZW1zaXplLGludCwwKTsKK21vZHVsZV9wYXJhbSh2ZXJib3NpdHksaW50LDApOworbW9kdWxlX3BhcmFtKHZlc2FmYixpbnQsMCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBQb3J0IGFjY2VzcyBtYWNyb3MgZm9yIG1lbW9yeSBtYXBwZWQgaW8KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgb3V0OChyLHYpIHdyaXRlYih2LGlvX3ZpcnQrcikKKyNkZWZpbmUgb3V0MzIocix2KSB3cml0ZWwodixpb192aXJ0K3IpCisjZGVmaW5lIGluOChyKSByZWFkYihpb192aXJ0K3IpCisjZGVmaW5lIGluMzIocikgcmVhZGwoaW9fdmlydCtyKQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gSGFyZHdhcmUgYWNjZXNzIGlubGluZSBmdW5jdGlvbnMKKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWFkM1g0KGludCByZWcpCit7CisJb3V0OCgweDNENCxyZWcpOworCXJldHVybiBpbjgoMHgzRDUpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZDNDNChpbnQgcmVnKQoreworCW91dDgoMHgzQzQscmVnKTsKKwlyZXR1cm4gaW44KDB4M0M1KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWQzQ0UoaW50IHJlZykKK3sKKwlvdXQ4KDB4M0NFLHJlZyk7CisJcmV0dXJuIGluOCgweDNDRik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZTNYNChpbnQgcmVnLHVuc2lnbmVkIGNoYXIgdmFsKQoreworCW91dDgoMHgzRDQscmVnKTsKKwlvdXQ4KDB4M0Q1LHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZTNDNChpbnQgcmVnLHVuc2lnbmVkIGNoYXIgdmFsKQoreworCW91dDgoMHgzQzQscmVnKTsKKwlvdXQ4KDB4M0M1LHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZTNDRShpbnQgcmVnLHVuc2lnbmVkIGNoYXIgdmFsKQoreworCW91dDgoMHgzQ0UscmVnKTsKKwlvdXQ4KDB4M0NGLHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZTNDMChpbnQgcmVnLHVuc2lnbmVkIGNoYXIgdmFsKQoreworCWluOCgweDNEQSk7CS8vIHJlYWQgdG8gcmVzZXQgaW5kZXgKKwlvdXQ4KDB4M0MwLHJlZyk7CisJb3V0OCgweDNDMCx2YWwpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBFbmFibGUgbWVtb3J5IG1hcHBlZCBpbyBhbmQgdW5wcm90ZWN0IHJlZ2lzdGVycworLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX21taW8odm9pZCkKK3sKKwlpbnQgdG1wOworCisJb3V0YigweDBCLDB4M0M0KTsKKwlpbmIoMHgzQzUpOwkJLy8gU2V0IE5FVyBtb2RlCisJb3V0YihTUjBFLDB4M0M0KTsJLy8gd3JpdGUgZW5hYmxlIGEgbG90IG9mIGV4dGVuZGVkIHBvcnRzCisJb3V0YigweDgwLDB4M0M1KTsKKworCW91dGIoU1IxMSwweDNDNCk7CS8vIHdyaXRlIGVuYWJsZSB0aG9zZSBleHRlbmRlZCBwb3J0cyB0aGF0CisJb3V0YigweDg3LDB4M0M1KTsJLy8gYXJlIG5vdCBhZmZlY3RlZCBieSBTUjBFX05ldworCisJb3V0YihDUjFFLDB4M2Q0KTsJLy8gY2xlYXIgd3JpdGUgcHJvdGVjdCBiaXQgZm9yIHBvcnQgMHgzYzIKKwl0bXA9aW5iKDB4M2Q1KSAmIDB4QkY7CisJb3V0YihDUjFFLDB4M2Q0KTsKKwlvdXRiKHRtcCwweDNkNSk7CisKKwlvdXRiKENSMzksMHgzRDQpOworCW91dGIoaW5iKDB4M0Q1KXwweDAxLDB4M0Q1KTsgLy8gRW5hYmxlIG1taW8sIGV2ZXJ5dGhpbmcgZWxzZSB1bnRvdWNoZWQKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gU2V0IHBpeGVsIGNsb2NrIFZDTEsxCisvLyAgIC0gbXVsdGlwbGllcnMgc2V0IGVsc3doZXJlCisvLyAgIC0gZnJlcSBpbiB1bml0cyBvZiAwLjAxIE1IegorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgdm9pZCBzZXRfdmNsayhzdHJ1Y3QgY3libGFmYl9wYXIgKnBhciwgaW50IGZyZXEpCit7CisJdTMyIG0sbixrOworCWludCBmLGZpLGQsZGk7CisJdTggbG89MCxoaT0wOworCisJZCA9IDIwMDA7CisJayA9IGZyZXEgPj0gMTAwMDAgPyAwIDogZnJlcSA+PSA1MDAwID8gMSA6IGZyZXEgPj0gMjUwMCA/IDIgOiAzOworCWZvcihtID0gMDttPDY0O20rKykKKwlmb3IobiA9IDA7bjwyNTA7bisrKSB7IC8vIG1heCAyNDkgaXMgYSBoYXJkd2FyZSBsaW1pdCBmb3IgY3libGEvaTEgIQorCQlmaSA9IChpbnQpKCgoNTg2NDcyNyoobis4KSkvKChtKzIpKigxPDxrKSkpPj4xMik7CisJCWlmICgoZGkgPSBhYnMoZmkgLSBmcmVxKSkgPCBkKSB7CisJCQlkID0gZGk7CisJCQlmID0gZmk7CisJCQlsbyA9ICh1OCkgbjsKKwkJCWhpID0gKHU4KSAoKGs8PDYpIHwgbSk7CisJCX0KKwl9CisJd3JpdGUzQzQoU1IxOSxoaSk7CisJd3JpdGUzQzQoU1IxOCxsbyk7CisJaWYodmVyYm9zaXR5ID4gMSkKKwkJb3V0cHV0KCJwaXhjbG9jayA9ICVkLiUwMmQgTUh6LCBrL20vbiAleCAleCAleFxuIiwKKwkJZnJlcS8xMDAsZnJlcSUxMDAsKGhpJjB4YzApPj42LGhpJjB4M2YsbG8pOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIEN5YmVyYmxhZGUgc3BlY2lmaWMgR3JhcGhpY3MgRW5naW5lIChHRSkgc2V0dXAKKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgdm9pZCBjeWJsYWZiX3NldHVwX0dFKGludCBwaXRjaCxpbnQgYnBwKQoreworCWludCBiYXNlID0gKHBpdGNoPj4zKTw8MjA7CisKKwlzd2l0Y2ggKGJwcCkgeworCQljYXNlICA4OiBiYXNlIHw9ICgwPDwyOSk7IGJyZWFrOworCQljYXNlIDE1OiBiYXNlIHw9ICg1PDwyOSk7IGJyZWFrOworCQljYXNlIDE2OiBiYXNlIHw9ICgxPDwyOSk7IGJyZWFrOworCQljYXNlIDI0OgorCQljYXNlIDMyOiBiYXNlIHw9ICgyPDwyOSk7IGJyZWFrOworCX0KKworCXdyaXRlM1g0KENSMzYsMHg5MCk7CS8vIHJlc2V0IEdFCisJd3JpdGUzWDQoQ1IzNiwweDgwKTsJLy8gZW5hYmxlIEdFCisKKwlvdXQzMihHRTI0LDE8PDcpOwkvLyByZXNldCBhbGwgR0UgcG9pbnRlcnMKKwlvdXQzMihHRTI0LDApOworCisJd3JpdGUzWDQoQ1IyRCwweDAwKTsJLy8gR0UgVGltaW5pZ3MsIG5vIGRlbGF5cworCisJb3V0MzIoR0VCOCxiYXNlKTsgLy8gRGVzdGluYXRpb24gU3RyaWRlIC8gQnVmZmVyIEJhc2UgMCwgcCAxMzMKKwlvdXQzMihHRUJDLGJhc2UpOyAvLyBEZXN0aW5hdGlvbiBTdHJpZGUgLyBCdWZmZXIgQmFzZSAxLCBwIDEzMworCW91dDMyKEdFQzAsYmFzZSk7IC8vIERlc3RpbmF0aW9uIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDIsIHAgMTMzCisJb3V0MzIoR0VDNCxiYXNlKTsgLy8gRGVzdGluYXRpb24gU3RyaWRlIC8gQnVmZmVyIEJhc2UgMywgcCAxMzMKKwlvdXQzMihHRUM4LGJhc2UpOyAvLyBTb3VyY2UgU3RyaWRlIC8gQnVmZmVyIEJhc2UgMCwgcCAxMzMKKwlvdXQzMihHRUNDLGJhc2UpOyAvLyBTb3VyY2UgU3RyaWRlIC8gQnVmZmVyIEJhc2UgMSwgcCAxMzMKKwlvdXQzMihHRUQwLGJhc2UpOyAvLyBTb3VyY2UgU3RyaWRlIC8gQnVmZmVyIEJhc2UgMiwgcCAxMzMKKwlvdXQzMihHRUQ0LGJhc2UpOyAvLyBTb3VyY2UgU3RyaWRlIC8gQnVmZmVyIEJhc2UgMywgcCAxMzMKKwlvdXQzMihHRTZDLDApOwkgIC8vIFBhdHRlcm4gYW5kIFN0eWxlLCBwIDEyOSwgb2sKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBBbHRob3VnaCB0aGlzIGlzIGEgLmZiX3N5bmMgZnVuY3Rpb24gdGhhdCBjb3VsZCBiZSBlbmFibGVkIGluCisvLyBjeWJsYWZiX29wcywgd2UgZG8gbm90IGluY2x1ZGUgaXQgdGhlcmUuIFdlIHN5bmMgaW1tZWRpYXRlbHkgYmVmb3JlCisvLyBuZXcgR0Ugb3BlcmF0aW9ucyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgY3libGFmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWludCBzdGF0dXMsIGk9MTAwMDAwOworCXdoaWxlKCAoKHN0YXR1cz1pbjMyKEdFMjApKSAmIDB4RkE4MDAwMDApICYmIGkgIT0gMCkKKwkJaS0tOworCisJaWYgKGkgPT0gMCkgeworCQkvLyBUaGUgdGltZW91dCBtaWdodCBiZSBjYXVzZWQgYnkgZGlzYWJsZWQgbW1pby4KKwkJLy8gQ2F1c2U6CisJCS8vICAgLSBiaXQgQ1IzOSAmIDEgPT0gMCB1cG9uIHJldHVybiwgWCB0cmlkZW50IGRyaXZlciBidWcKKwkJLy8gICAtIGtkbSBidWcgKEtEX0dSQVBISUNTIG5vdCBzZXQgb24gZmlyc3Qgc3dpdGNoKQorCQkvLyAgIC0ga2VybmVsIGRlc2lnbiBmbGF3IChpdCBiZWxpZXZlcyBpbiB0aGUgY29ycmVjdG5lc3MKKwkJLy8gICAgIG9mIGtkbS9YCisJCS8vIFNvIHdlIG1ha2Ugc3VyZSB0aGF0IG1taW8gaXMgZW5hYmxlZCBmaXJzdCAuLi4KKwkJZW5hYmxlX21taW8oKTsKKy8vCQlzaG93X3RyYWNlKE5VTEwsJnN0YXR1cyk7CisJCWk9MTAwMDAwMDsKKwkJd2hpbGUoICgoc3RhdHVzPWluMzIoR0UyMCkpICYgMHhGQTgwMDAwMCkgJiYgaSAhPSAwKQorCQkJaS0tOworCQlpZiAoaSA9PSAwKSB7CisJCQlvdXRwdXQoIkdFIFRpbWVvdXQsIHN0YXR1czogJXhcbiIsc3RhdHVzKTsKKwkJCWlmKHN0YXR1cyAmIDB4ODAwMDAwMDApCisJCQkJb3V0cHV0KCJCcmVzZW5oYW0gRW5naW5lIDogQnVzeVxuIik7CisJCQlpZihzdGF0dXMgJiAweDQwMDAwMDAwKQorCQkJCW91dHB1dCgiU2V0dXAgRW5naW5lICAgICA6IEJ1c3lcbiIpOworCQkJaWYoc3RhdHVzICYgMHgyMDAwMDAwMCkKKwkJCQlvdXRwdXQoIlNQIC8gRFBFICAgICAgICAgOiBCdXN5XG4iKTsKKwkJCWlmKHN0YXR1cyAmIDB4MTAwMDAwMDApCisJCQkJb3V0cHV0KCJNZW1vcnkgSW50ZXJmYWNlIDogQnVzeVxuIik7CisJCQlpZihzdGF0dXMgJiAweDA4MDAwMDAwKQorCQkJCW91dHB1dCgiQ29tIExzdCBQcm9jICAgICA6IEJ1c3lcbiIpOworCQkJaWYoc3RhdHVzICYgMHgwNDAwMDAwMCkKKwkJCQlvdXRwdXQoIkJsb2NrIFdyaXRlICAgICAgOiBCdXN5XG4iKTsKKwkJCWlmKHN0YXR1cyAmIDB4MDIwMDAwMDApCisJCQkJb3V0cHV0KCJDb21tYW5kIEJ1ZmZlciAgIDogRnVsbFxuIik7CisJCQlpZihzdGF0dXMgJiAweDAxMDAwMDAwKQorCQkJCW91dHB1dCgiUkVTRVJWRUQgICAgICAgICA6IEJ1c3lcbiIpOworCQkJaWYoc3RhdHVzICYgMHgwMDgwMDAwMCkKKwkJCQlvdXRwdXQoIlBDSSBXcml0ZSBCdWZmZXIgOiBCdXN5XG4iKTsKKwkJCWN5YmxhZmJfc2V0dXBfR0UoaW5mby0+dmFyLnhyZXMsCisJCQkJCSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gQ3liZXJibGFkZSBzcGVjaWZpYyBmaWxscmVjdAorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyB2b2lkIGN5YmxhZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKiBpbmZvLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKmZyKQoreworCWludCBicHAgPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWw7CisJaW50IGNvbDsKKworCXN3aXRjaCAoYnBwKSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgODogY29sID0gZnItPmNvbG9yOworCQkJY29sIHw9IGNvbCA8PDg7CisJCQljb2wgfD0gY29sIDw8MTY7CisJCQlicmVhazsKKwkJY2FzZSAxNjogY29sID0gKCh1MzIgKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtmci0+Y29sb3JdOworCQkJIGNvbCB8PSBjb2wgPDwxNjsKKwkJCSBicmVhazsKKwkJY2FzZSAzMjogY29sID0gKCh1MzIgKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtmci0+Y29sb3JdOworCQkJIGJyZWFrOworCX0KKworCWN5YmxhZmJfc3luYyhpbmZvKTsKKworCW91dDMyKEdFNjAsY29sKTsKKwlvdXQzMihHRTQ4LGZyLT5yb3AgPyAweDY2OlJPUF9TKTsKKwlvdXQzMihHRTQ0LDB4MjAwMDAwMDB8MTw8MTl8MTw8NHwyPDwyKTsKKwlvdXQzMihHRTA4LHBvaW50KGZyLT5keCxmci0+ZHkpKTsKKwlvdXQzMihHRTBDLHBvaW50KGZyLT5keCtmci0+d2lkdGgtMSxmci0+ZHkrZnItPmhlaWdodC0xKSk7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBDeWJlcmJsYWRlIHNwZWNpZmljIGNvcHlhcmVhCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIHZvaWQgY3libGFmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCSAgICAgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpjYSkKK3sKKwlfX3UzMiBzMSxzMixkMSxkMjsKKwlpbnQgZGlyZWN0aW9uOworCisJczEgPSBwb2ludChjYS0+c3gsY2EtPnN5KTsKKwlzMiA9IHBvaW50KGNhLT5zeCtjYS0+d2lkdGgtMSxjYS0+c3krY2EtPmhlaWdodC0xKTsKKwlkMSA9IHBvaW50KGNhLT5keCxjYS0+ZHkpOworCWQyID0gcG9pbnQoY2EtPmR4K2NhLT53aWR0aC0xLGNhLT5keStjYS0+aGVpZ2h0LTEpOworCWlmICgoY2EtPnN5ID4gY2EtPmR5KSB8fCAoKGNhLT5zeSA9PSBjYS0+ZHkpICYmIChjYS0+c3ggPiBjYS0+ZHgpKSkKKwkJZGlyZWN0aW9uID0gMDsKKwllbHNlCisJCWRpcmVjdGlvbiA9IDI7CisKKwljeWJsYWZiX3N5bmMoaW5mbyk7CisKKwlvdXQzMihHRTQ0LDB4YTAwMDAwMDB8MTw8MTl8MTw8MnxkaXJlY3Rpb24pOworCW91dDMyKEdFMDAsZGlyZWN0aW9uP3MyOnMxKTsKKwlvdXQzMihHRTA0LGRpcmVjdGlvbj9zMTpzMik7CisJb3V0MzIoR0UwOCxkaXJlY3Rpb24/ZDI6ZDEpOworCW91dDMyKEdFMEMsZGlyZWN0aW9uP2QxOmQyKTsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gQ3liZXJibGFkZSBzcGVjaWZpYyBpbWFnZWJsaXQKKy8vCisvLyBBY2NlbGVyYXRlZCBmb3IgdGhlIG1vc3QgdXN1YWwgY2FzZSwgYmxpdHRpbmcgMS1iaXQgZGVlcCBjaGFyYWN0ZXIKKy8vIGNoYXJhY3RlciBpbWFnZXMuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBwYXNzZWQgdG8gdGhlIGdlbmVyaWMgaW1hZ2VibGl0LgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIHZvaWQgY3libGFmYl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKQoreworCisJdTMyIGZnY29sLCBiZ2NvbDsKKworCWludCBpOworCWludCBicHAgPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWw7CisJaW50IGluZGV4ID0gMDsKKwlpbnQgaW5kZXhfZW5kPWltYWdlLT5oZWlnaHQgKiBpbWFnZS0+d2lkdGggLyA4OworCWludCB3aWR0aF9kZHM9aW1hZ2UtPndpZHRoIC8gMzI7CisJaW50IHdpZHRoX2Ricz1pbWFnZS0+d2lkdGggJSAzMjsKKworCWlmIChpbWFnZS0+ZGVwdGggIT0gMSB8fCBicHAgPCA4IHx8IGJwcCA+IDMyIHx8IGJwcCAlIDggIT0gMCB8fAorCSAgICBpbWFnZS0+d2lkdGggJSA4ICE9IDAgfHwgaW1hZ2UtPndpZHRoID09IDAgfHwgaW1hZ2UtPmhlaWdodCA9PSAwKSB7CisJCWNmYl9pbWFnZWJsaXQoaW5mbyxpbWFnZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfVFJVRUNPTE9SIHx8CisJICAgIGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX0RJUkVDVENPTE9SKSB7CisJCWZnY29sID0gKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5mZ19jb2xvcl07CisJCWJnY29sID0gKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5iZ19jb2xvcl07CisJfSBlbHNlIHsKKwkJZmdjb2wgPSBpbWFnZS0+ZmdfY29sb3I7CisJCWJnY29sID0gaW1hZ2UtPmJnX2NvbG9yOworCX0KKworCXN3aXRjaCAoYnBwKSB7CisJCWNhc2UgODoKKwkJCWZnY29sIHw9IGZnY29sIDw8ODsgZmdjb2wgfD0gZmdjb2wgPDwxNjsKKwkJCWJnY29sIHw9IGJnY29sIDw8ODsgYmdjb2wgfD0gYmdjb2wgPDwxNjsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJZmdjb2wgfD0gZmdjb2wgPDwxNjsKKwkJCWJnY29sIHw9IGJnY29sIDw8MTY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCSBicmVhazsKKwl9CisKKwljeWJsYWZiX3N5bmMoaW5mbyk7CisKKwlvdXQzMihHRTYwLGZnY29sKTsKKwlvdXQzMihHRTY0LGJnY29sKTsKKwlvdXQzMihHRTQ0LDB4YTAwMDAwMDAgfCAxPDwyMCB8IDE8PDE5KTsKKwlvdXQzMihHRTA4LHBvaW50KGltYWdlLT5keCxpbWFnZS0+ZHkpKTsKKwlvdXQzMihHRTBDLHBvaW50KGltYWdlLT5keCtpbWFnZS0+d2lkdGgtMSxpbWFnZS0+ZHkraW1hZ2UtPmhlaWdodC0xKSk7CisKKwl3aGlsZShpbmRleCA8IGluZGV4X2VuZCkgeworCQlmb3IoaT0wO2k8d2lkdGhfZGRzO2krKykgeworCQkJb3V0MzIoR0U5QywqKCh1MzIqKSAoKHUzMilpbWFnZS0+ZGF0YSArIGluZGV4KSkpOworCQkJaW5kZXgrPTQ7CisJCX0KKwkJc3dpdGNoKHdpZHRoX2RicykgeworCQljYXNlIDA6IGJyZWFrOworCQljYXNlIDg6CW91dDMyKEdFOUMsKigodTgqKSgodTMyKWltYWdlLT5kYXRhK2luZGV4KSkpOworCQkJaW5kZXgrPTE7CisJCQlicmVhazsKKwkJY2FzZSAxNjogb3V0MzIoR0U5QywqKCh1MTYqKSgodTMyKWltYWdlLT5kYXRhK2luZGV4KSkpOworCQkJaW5kZXgrPTI7CisJCQlicmVhazsKKwkJY2FzZSAyNDogb3V0MzIoR0U5QywodTMyKSgqKCh1MTYqKSgodTMyKWltYWdlLT5kYXRhK2luZGV4KSkpIHwKKwkJCSAgICAgICAodTMyKSgqKCh1OCopKCh1MzIpaW1hZ2UtPmRhdGEraW5kZXgrMikpKTw8MTYpOworCQkJaW5kZXgrPTM7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gQ2hlY2sgaWYgdmlkZW8gbW9kZSBpcyBhY2NlcHRhYmxlLiBXZSBjaGFuZ2UgdmFyLT4/Pz8gaWYKKy8vIHZpZGVvIG1vZGUgaXMgc2xpZ2h0bHkgb2ZmIG9yIHJldHVybiBlcnJvciBvdGhlcndpc2UuCisvLyBpbmZvLT4/Pz8gbXVzdCBub3QgYmUgY2hhbmdlZCEKKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludCBjeWJsYWZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IGJwcCA9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJaW50IHMsdCxtYXh2eXJlczsKKworCS8vCisJLy8gd2UgdHJ5IHRvIHN1cHBvcnQgOCwgMTYsIDI0IGFuZCAzMiBicHAgbW9kZXMsCisJLy8gZGVmYXVsdCB0byA4CisJLy8KKwkvLyB0aGVyZSBpcyBhIDI0IGJwcCBtb2RlLCBidXQgZm9yIG5vdyB3ZSBjaGFuZ2UgcmVxdWVzdHMgdG8gMzIgYnBwCisJLy8gKFRoaXMgaXMgd2hhdCB0cmlkZW50ZmIgZG9lcyAuLi4gd2lsbCBiZSBjaGFuZ2VkIGluIHRoZSBmdXR1cmUpCisJLy8KKwkvLworCWlmICggYnBwICUgOCAhPSAwIHx8IGJwcCA8IDggfHwgYnBwID4zMikKKwkJYnBwID0gODsKKwlpZiAoYnBwID09IDI0ICkKKwkJYnBwID0gdmFyLT5iaXRzX3Blcl9waXhlbCA9IDMyOworCisJLy8KKwkvLyBpbnRlcmxhY2VkIG1vZGVzIGFyZSBicm9rZW4sIGZhaWwgaWYgb25lIGlzIHJlcXVlc3RlZAorCS8vCisJaWYgKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9JTlRFUkxBQ0VEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8vCisJLy8gZmFpbCBpZiByZXF1ZXN0ZWQgcmVzb2x1dGlvbiBpcyBoaWdoZXIgdGhhbiBwaHlzaWNhbAorCS8vIGZsYXRwYW5lbCByZXNvbHV0aW9uCisJLy8KKwlpZiAoKGRpc3BsYXl0eXBlID09IERJU1BMQVlfRlApICYmIG5hdGl2ZXggJiYgdmFyLT54cmVzID4gbmF0aXZleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvLworCS8vIHhyZXMgIT0geHJlc192aXJ0dWFsIGlzIGJyb2tlbiwgZmFpbCBpZiBzdWNoIGFuCisJLy8gdW51c3VhbCBtb2RlIGlzIHJlcXVlc3RlZAorCS8vCisJaWYgKHZhci0+eHJlcyAhPSB2YXItPnhyZXNfdmlydHVhbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvLworCS8vIHdlIGRvIG5vdCBhbGxvdyB2Y2xrIHRvIGV4Y2VlZCAyMzAgTUh6CisJLy8KKwlpZiAoKGJwcD09MzIgPyAyMDAwMDAwMDAgOiAxMDAwMDAwMDApIC8gdmFyLT5waXhjbG9jayA+IDIzMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8vCisJLy8gY2FsYyBtYXggeXJlc192aXJ0dWFsIHRoYXQgd291bGQgZml0IGluIG1lbW9yeQorCS8vIGFuZCBtYXggeXJlc192aXJ0dWFsIHRoYXQgY291bGQgYmUgdXNlZCBmb3Igc2Nyb2xsaW5nCisJLy8gYW5kIHVzZSBtaW5pbXVtIG9mIHRoZSByZXN1bHRzIGFzIG1heHZ5cmVzCisJLy8KKwkvLyBhZGp1c3QgdnlyZXNfdmlydHVhbCB0byBtYXh2eXJlcyBpZiBuZWNlc3NhcnkKKwkvLyBmYWlsIGlmIHJlcXVlc3RlZCB5cmVzIGlzIGJpZ2dlciB0aGFuIG1heHZ5cmVzCisJLy8KKwlzID0gKDB4MWZmZmZmIC8gKHZhci0+eHJlcyAqIGJwcC84KSkgKyB2YXItPnlyZXM7CisJdCA9IGluZm8tPmZpeC5zbWVtX2xlbiAvICh2YXItPnhyZXMgKiBicHAvOCk7CisJbWF4dnlyZXMgPSB0IDwgcyA/IHQgOiBzOworCWlmIChtYXh2eXJlcyA8IHZhci0+eXJlc192aXJ0dWFsKQorCQl2YXItPnlyZXNfdmlydHVhbD1tYXh2eXJlczsKKwlpZiAobWF4dnlyZXMgPCB2YXItPnlyZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChicHApIHsKKwkJY2FzZSA4OgorCQkJdmFyLT5yZWQub2Zmc2V0ID0gMDsKKwkJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gMDsKKwkJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQkJdmFyLT5yZWQubGVuZ3RoID0gNjsKKwkJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKKwkJCXZhci0+Ymx1ZS5sZW5ndGggPSA2OworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsKKwkJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsKKwkJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQkJdmFyLT5yZWQubGVuZ3RoID0gNTsKKwkJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKKwkJCXZhci0+Ymx1ZS5sZW5ndGggPSA1OworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKKwkJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKKwkJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQkJdmFyLT5yZWQubGVuZ3RoID0gODsKKwkJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKKwkJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFBhbiB0aGUgZGlzcGxheQorLy8KKy8vIFRoZSBkYXRhc2hlZXRzIGRlZmluZXMgY3J0IHN0YXJ0IGFkZHJlc3MgdG8gYmUgMjAgYml0cyB3aWRlIGFuZAorLy8gdG8gYmUgcHJvZ3JhbW1lZCB0byBDUjBDLCBDUjBELCBDUjFFIGFuZCBDUjI3LiBBY3R1YWxseSB0aGVyZSBpcworLy8gQ1IyQls1XSBhcyBhbiB1bmRvY3VtZW50ZWQgZXh0ZW5zaW9uIGJpdC4gRXBpYSBCSU9TIDIuMDcgZG9lcyB1c2UKKy8vIGl0LCBzbyBpdCBpcyBhbHNvIHNhZmUgdG8gYmUgdXNlZCBoZXJlLiBCVFc6IGRhdGFzaGVldCBDUjBFIG9uIHBhZ2UKKy8vIDkwIHJlYWxseSBpcyBDUjFFLCB0aGUgcmVhbCBDUkUgaXMgZG9jdW1lbnRlZCBvbiBwYWdlIDcyLgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgY3libGFmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCisJb2Zmc2V0PSh2YXItPnhvZmZzZXQrKHZhci0+eW9mZnNldCp2YXItPnhyZXMpKSp2YXItPmJpdHNfcGVyX3BpeGVsLzMyOworCWluZm8tPnZhci54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OworCWluZm8tPnZhci55b2Zmc2V0ID0gdmFyLT55b2Zmc2V0OworCisJd3JpdGUzWDQoQ1IwRCxvZmZzZXQgJiAweEZGKTsKKwl3cml0ZTNYNChDUjBDLChvZmZzZXQgJiAweEZGMDApID4+IDgpOworCXdyaXRlM1g0KENSMUUsKHJlYWQzWDQoQ1IxRSkgJiAweERGKSB8ICgob2Zmc2V0ICYgMHgxMDAwMCkgPj4gMTEpKTsKKwl3cml0ZTNYNChDUjI3LChyZWFkM1g0KENSMjcpICYgMHhGOCkgfCAoKG9mZnNldCAmIDB4RTAwMDApID4+IDE3KSk7CisJd3JpdGUzWDQoQ1IyQiwocmVhZDNYNChDUjJCKSAmIDB4REYpIHwgKChvZmZzZXQgJiAweDEwMDAwMCkgPj4gMTUpKTsKKworCXJldHVybiAwOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyB3aWxsIHJlYWxseSBoZWxwIGluIGNhc2Ugb2YgYSBidWcgLi4uCisvLyBkdW1wIG1vc3QgZ2FwaGljcyBjb3JlIHJlZ2lzdGVycy4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyB2b2lkIHJlZ2R1bXAoc3RydWN0IGN5YmxhZmJfcGFyICpwYXIpCit7CisJaW50IGk7CisKKwlpZiAodmVyYm9zaXR5IDwgMikKKwkJcmV0dXJuOworCisJcHJpbnRrKCJcbiIpOworCWZvcihpPTA7IGk8PTB4ZmY7IGkrKykgeworCQlvdXRiKGksMHgzZDQpOworCQlwcmludGsoIkNSJTAyeD0lMDJ4ICIsaSxpbmIoMHgzZDUpKTsKKwkJaWYgKGklMTY9PTE1KQorCQkJcHJpbnRrKCJcbiIpOworCX0KKworCW91dGIoMHgzMCwweDNjZSk7CisJb3V0YihpbmIoMHgzY2YpIHwgMHg0MCwweDNjZik7CisJZm9yKGk9MDsgaTw9MHgxZjsgaSsrKSB7CisJCWlmIChpPT0wIHx8IChpPjIgJiYgaTw4KSB8fCBpPT0weDEwIHx8IGk9PTB4MTEgfHwgaT09MHgxNikgeworCQkJb3V0YihpLDB4M2Q0KTsKKwkJCXByaW50aygiQ1IlMDJ4PSUwMnggIixpLGluYigweDNkNSkpOworCQl9IGVsc2UKKwkJCXByaW50aygiLS0tLS0tLSAiKTsKKwkJaWYgKGklMTY9PTE1KQorCQkJcHJpbnRrKCJcbiIpOworCX0KKwlvdXRiKDB4MzAsMHgzY2UpOworCW91dGIoaW5iKDB4M2NmKSAmIDB4YmYsMHgzY2YpOworCisJcHJpbnRrKCJcbiIpOworCWZvcihpPTA7IGk8PTB4N2Y7IGkrKykgeworCQlvdXRiKGksMHgzY2UpOworCQlwcmludGsoIkdSJTAyeD0lMDJ4ICIsaSxpbmIoMHgzY2YpKTsKKwkJaWYgKGklMTY9PTE1KQorCQkJcHJpbnRrKCJcbiIpOworCX0KKworCXByaW50aygiXG4iKTsKKwlmb3IoaT0wOyBpPD0weGZmOyBpKyspIHsKKwkJb3V0YihpLDB4M2M0KTsKKwkJcHJpbnRrKCJTUiUwMng9JTAyeCAiLGksaW5iKDB4M2M1KSk7CisJCWlmIChpJTE2PT0xNSkKKwkJCXByaW50aygiXG4iKTsKKwl9CisKKwlwcmludGsoIlxuIik7CisJZm9yKGk9MDsgaSA8PSAweDFGOyBpKyspIHsKKwkJaW5iKDB4M2RhKTsgLy8gbmV4dCBhY2Nlc3MgaXMgaW5kZXghCisJCW91dGIoaSwweDNjMCk7CisJCXByaW50aygiQVIlMDJ4PSUwMnggIixpLGluYigweDNjMSkpOworCQlpZiAoaSUxNj09MTUpCisJCQlwcmludGsoIlxuIik7CisJfQorCXByaW50aygiXG4iKTsKKworCWluYigweDNEQSk7CQkJLy8gcmVzZXQgaW50ZXJuYWwgZmxhZyB0byAzYzAgaW5kZXgKKwlvdXRiKDB4MjAsMHgzQzApOwkJLy8gZW5hYmxlIGF0dHIKKworCXJldHVybjsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFNldCBoYXJkd2FyZSB0byByZXF1ZXN0ZWQgdmlkZW8gbW9kZQorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludCBjeWJsYWZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGN5YmxhZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJdTMyCisJaHRvdGFsLGhkaXNwZW5kLGhzeW5jc3RhcnQsaHN5bmNlbmQsaGJsYW5rc3RhcnQsaGJsYW5rZW5kLHByZWVuZGZldGNoLAorCQl2dG90YWwsdmRpc3BlbmQsdnN5bmNzdGFydCx2c3luY2VuZCx2YmxhbmtzdGFydCx2YmxhbmtlbmQ7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOworCWludCBicHAgPSB2YXItPmJpdHNfcGVyX3BpeGVsOworCWludCBpOworCisJaWYgKHZlcmJvc2l0eSA+IDApCisJCW91dHB1dCgiU3dpdGNoaW5nIHRvIG5ldyBtb2RlOiAiCisJCSAgICAgICAiZmJzZXQgLWcgJWQgJWQgJWQgJWQgJWQgLXQgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCisJCQl2YXItPnhyZXMsdmFyLT55cmVzLHZhci0+eHJlc192aXJ0dWFsLAorCQkJdmFyLT55cmVzX3ZpcnR1YWwsdmFyLT5iaXRzX3Blcl9waXhlbCx2YXItPnBpeGNsb2NrLAorCQkJdmFyLT5sZWZ0X21hcmdpbix2YXItPnJpZ2h0X21hcmdpbix2YXItPnVwcGVyX21hcmdpbiwKKwkJCXZhci0+bG93ZXJfbWFyZ2luLHZhci0+aHN5bmNfbGVuLHZhci0+dnN5bmNfbGVuKTsKKworCWh0b3RhbCA9ICh2YXItPnhyZXMgKyB2YXItPmxlZnRfbWFyZ2luICsgdmFyLT5yaWdodF9tYXJnaW4gKworCQkJCQkJIHZhci0+aHN5bmNfbGVuKSAvIDggLSA1OworCWhkaXNwZW5kID0gdmFyLT54cmVzLzggLSAxOworCWhzeW5jc3RhcnQgPSAodmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4pLzg7CisJaHN5bmNlbmQgPSB2YXItPmhzeW5jX2xlbi84OworCWhibGFua3N0YXJ0ID0gaGRpc3BlbmQgKyAxOworCWhibGFua2VuZCA9IGh0b3RhbCArIDM7IC8vIHNob3VsZCBiZSBodG90YWwgKyA1LCBiaW9zIGRvZXMgaXQgdGhpcyB3YXkKKwlwcmVlbmRmZXRjaCA9ICgodmFyLT54cmVzID4+IDMpICsgMSkgKiAoKGJwcCsxKSA+PiAzKTsKKworCXZ0b3RhbCA9IHZhci0+eXJlcyArIHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT5sb3dlcl9tYXJnaW4gKworCQkJCQkJIHZhci0+dnN5bmNfbGVuIC0gMjsKKwl2ZGlzcGVuZCA9IHZhci0+eXJlcyAtIDE7CisJdnN5bmNzdGFydCA9IHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luOworCXZibGFua3N0YXJ0ID0gdmFyLT55cmVzOworCXZibGFua2VuZCA9IHZ0b3RhbDsgLy8gc2hvdWxkIGJlIHZ0b3RhbCArIDIsIGJ1dCBiaW9zIGRvZXMgaXQgdGhpcyB3YXkKKwl2c3luY2VuZCA9IHZhci0+dnN5bmNfbGVuOworCisJZW5hYmxlX21taW8oKTsJCS8vIG5lY2Vzc2FyeSEgLi4uIGNoZWNrIFggLi4uCisKKwl3cml0ZTNYNChDUjExLHJlYWQzWDQoQ1IxMSkgJiAweDdGKTsgLy8gdW5sb2NrIGNyMDAgLi4gY3IwNworCisJd3JpdGUzQ0UoR1IzMCw4KTsKKworCWlmICgoZGlzcGxheXR5cGUgPT0gRElTUExBWV9GUCkgJiYgdmFyLT54cmVzIDwgbmF0aXZleCkgeworCisJCS8vIHN0cmV0Y2ggb3IgY2VudGVyID8KKworCQlvdXQ4KDB4M0MyLDB4RUIpOworCisJCXdyaXRlM0NFKEdSMzAscmVhZDNDRShHUjMwKSB8IDB4ODEpOyAvLyBzaGFkb3cgbW9kZSBvbgorCisJCWlmIChjZW50ZXIpIHsKKwkJCXdyaXRlM0NFKEdSNTIsKHJlYWQzQ0UoR1I1MikgJiAweDdDKSB8IDB4ODApOworCQkJd3JpdGUzQ0UoR1I1MywocmVhZDNDRShHUjUzKSAmIDB4N0MpIHwgMHg4MCk7CisJCX0KKwkJZWxzZSBpZiAoc3RyZXRjaCkgeworCQkJd3JpdGUzQ0UoR1I1RCwwKTsKKwkJCXdyaXRlM0NFKEdSNTIsKHJlYWQzQ0UoR1I1MikgJiAweDdDKSB8IDEpOworCQkJd3JpdGUzQ0UoR1I1MywocmVhZDNDRShHUjUzKSAmIDB4N0MpIHwgMSk7CisJCX0KKworCX0gZWxzZSB7CisJCW91dDgoMHgzQzIsMHgyQik7CisJCXdyaXRlM0NFKEdSMzAsOCk7CisJfQorCisJLy8KKwkvLyBTZXR1cCBDUnh4IHJlZ3MKKwkvLworCisJd3JpdGUzWDQoQ1IwMCxodG90YWwgJiAweEZGKTsKKwl3cml0ZTNYNChDUjAxLGhkaXNwZW5kICYgMHhGRik7CisJd3JpdGUzWDQoQ1IwMixoYmxhbmtzdGFydCAmIDB4RkYpOworCXdyaXRlM1g0KENSMDMsaGJsYW5rZW5kICYgMHgxRik7CisJd3JpdGUzWDQoQ1IwNCxoc3luY3N0YXJ0ICYgMHhGRik7CisJd3JpdGUzWDQoQ1IwNSwoaHN5bmNlbmQgJiAweDFGKSB8ICgoaGJsYW5rZW5kICYgMHgyMCk8PDIpKTsKKwl3cml0ZTNYNChDUjA2LHZ0b3RhbCAmIDB4RkYpOworCXdyaXRlM1g0KENSMDcsKHZ0b3RhbCAmIDB4MTAwKSA+PiA4IHwKKwkJICAgICAgKHZkaXNwZW5kICYgMHgxMDApID4+IDcgfAorCQkgICAgICAodnN5bmNzdGFydCAmIDB4MTAwKSA+PiA2IHwKKwkJICAgICAgKHZibGFua3N0YXJ0ICYgMHgxMDApID4+IDUgfAorCQkgICAgICAweDEwIHwKKwkJICAgICAgKHZ0b3RhbCAmIDB4MjAwKSA+PiA0IHwKKwkJICAgICAgKHZkaXNwZW5kICYgMHgyMDApID4+IDMgfAorCQkgICAgICAodnN5bmNzdGFydCAmIDB4MjAwKSA+PiAyKTsKKwl3cml0ZTNYNChDUjA4LDApOworCXdyaXRlM1g0KENSMDksKHZibGFua3N0YXJ0ICYgMHgyMDApID4+IDQgfCAweDQwIHwgIC8vIEZJWCAhISEKKwkJICAgICAgKChpbmZvLT52YXIudm1vZGUgJiBGQl9WTU9ERV9ET1VCTEUpID8gMHg4MCA6IDApKTsKKwl3cml0ZTNYNChDUjBBLDApOyAgLy8gSW5pdCB0byBzb21lIHJlYXNvbmFibGUgZGVmYXVsdAorCXdyaXRlM1g0KENSMEIsMCk7ICAvLyBJbml0IHRvIHNvbWUgcmVhc29uYWJsZSBkZWZhdWx0CisJd3JpdGUzWDQoQ1IwQywwKTsgIC8vIE9mZnNldCAwCisJd3JpdGUzWDQoQ1IwRCwwKTsgIC8vIE9mZnNldCAwCisJd3JpdGUzWDQoQ1IwRSwwKTsgIC8vIEluaXQgdG8gc29tZSByZWFzb25hYmxlIGRlZmF1bHQKKwl3cml0ZTNYNChDUjBGLDApOyAgLy8gSW5pdCB0byBzb21lIHJlYXNvbmFibGUgZGVmYXVsdAorCXdyaXRlM1g0KENSMTAsdnN5bmNzdGFydCAmIDB4RkYpOworCXdyaXRlM1g0KENSMTEsKHZzeW5jZW5kICYgMHgwRikpOworCXdyaXRlM1g0KENSMTIsdmRpc3BlbmQgJiAweEZGKTsKKwl3cml0ZTNYNChDUjEzLCgoaW5mby0+dmFyLnhyZXMgKiBicHApLyg0KjE2KSkgJiAweEZGKTsKKwl3cml0ZTNYNChDUjE0LDB4NDApOyAgLy8gZG91YmxlIHdvcmQgbW9kZQorCXdyaXRlM1g0KENSMTUsdmJsYW5rc3RhcnQgJiAweEZGKTsKKwl3cml0ZTNYNChDUjE2LHZibGFua2VuZCAmIDB4RkYpOworCXdyaXRlM1g0KENSMTcsMHhDMyk7CisJd3JpdGUzWDQoQ1IxOCwweEZGKTsKKwkvLwkgQ1IxOTogbmVlZGVkIGZvciBpbnRlcmxhY2VkIG1vZGVzIC4uLiBpZ25vcmUgaXQgZm9yIG5vdworCXdyaXRlM1g0KENSMUEsMHgwNyk7IC8vIEFyYml0cmF0aW9uIENvbnRyb2wgQ291bnRlciAxCisJd3JpdGUzWDQoQ1IxQiwweDA3KTsgLy8gQXJiaXRyYXRpb24gQ29udHJvbCBDb3VudGVyIDIKKwl3cml0ZTNYNChDUjFDLDB4MDcpOyAvLyBBcmJpdHJhdGlvbiBDb250cm9sIENvdW50ZXIgMworCXdyaXRlM1g0KENSMUQsMHgwMCk7IC8vIERvbid0IGtub3csIGRvZXNuJ3QgaHVydCA7LSkKKwl3cml0ZTNYNChDUjFFLChpbmZvLT52YXIudm1vZGUgJiBGQl9WTU9ERV9JTlRFUkxBQ0VEKSA/IDB4ODQgOiAweDgwKTsKKwkvLwkgQ1IxRjogZG8gbm90IHNldCwgY29udGFpbnMgQklPUyBpbmZvIGFib3V0IG1lbXNpemUKKwl3cml0ZTNYNChDUjIwLDB4MjApOyAvLyBlbmFiZSB3ciBidWYsIGRpc2FibGUgMTZiaXQgcGxhbmFyIG1vZGUKKwl3cml0ZTNYNChDUjIxLDB4MjApOyAvLyBlbmFibGUgbGluZWFyIG1lbW9yeSBhY2Nlc3MKKwkvLwkgQ1IyMjogUk8gY3B1IGxhdGNoIHJlYWRiYWNrCisJLy8JIENSMjM6ID8/PworCS8vCSBDUjI0OiBSTyBBUiBmbGFnIHN0YXRlCisJLy8JIENSMjU6IFJBTURBQyBydyB0aW1pbmcsIHBjbGsgYnVmZmVyIHRyaXN0YXRlIGNvbnRyb2wgPz8/PworCS8vCSBDUjI2OiA/Pz8KKwl3cml0ZTNYNChDUjI3LCh2ZGlzcGVuZCAmIDB4NDAwKSA+PiA2IHwKKwkJICAgICAgKHZzeW5jc3RhcnQgJiAweDQwMCkgPj4gNSB8CisJCSAgICAgICh2YmxhbmtzdGFydCAmIDB4NDAwKSA+PiA0IHwKKwkJICAgICAgKHZ0b3RhbCAmIDB4NDAwKSA+PiAzIHwKKwkJICAgICAgMHg4KTsKKwkvLwkgQ1IyODogPz8/CisJd3JpdGUzWDQoQ1IyOSwocmVhZDNYNChDUjI5KSAmIDB4Q0YpIHwKKwkJICAgICAgKCgoKGluZm8tPnZhci54cmVzICogYnBwKSAvICg0KjE2KSkgJiAweDMwMCkgPj40KSk7CisJd3JpdGUzWDQoQ1IyQSxyZWFkM1g0KENSMkEpIHwgMHg0MCk7CisJd3JpdGUzWDQoQ1IyQiwoaHRvdGFsICYgMHgxMDApID4+IDggfAorCQkgICAgICAoaGRpc3BlbmQgJiAweDEwMCkgPj4gNyB8CisJCSAgICAgIC8vICgweDAwICYgMHgxMDApID4+IDYgfAkgaGludGVybGFjZSBwYXJhIGJpdCA4ID8/PworCQkgICAgICAoaHN5bmNzdGFydCAmIDB4MTAwKSA+PiA1IHwKKwkJICAgICAgKGhibGFua3N0YXJ0ICYgMHgxMDApID4+IDQpOworCS8vCSBDUjJDOiA/Pz8KKwkvLwkgQ1IyRDogaW5pdGlhbGl6ZWQgaW4gY3libGFmYl9zZXR1cF9HRSgpCisJd3JpdGUzWDQoQ1IyRiwweDkyKTsgLy8gY29uc2VydmF0aXZlLCBiZXR0ZXIgc2lnbmFsIHF1YWxpdHkKKwkvLwkgQ1IzMDogcmVzZXJ2ZWQKKwkvLwkgQ1IzMTogcmVzZXJ2ZWQKKwkvLwkgQ1IzMjogcmVzZXJ2ZWQKKwkvLwkgQ1IzMzogcmVzZXJ2ZWQKKwkvLwkgQ1IzNDogZGlzYWJsZWQgaW4gQ1IzNgorCS8vCSBDUjM1OiBkaXNhYmxlZCBpbiBDUjM2CisJLy8JIENSMzY6IGluaXRpYWxpemVkIGluIGN5YmxhZmJfc2V0dXBfR0UKKwkvLwkgQ1IzNzogaTJjLCBpZ25vcmUgZm9yIG5vdworCXdyaXRlM1g0KENSMzgsKGJwcCA9PSA4KSA/IDB4MDAgOgkvLworCQkgICAgICAoYnBwID09IDE2KSA/IDB4MDUgOgkvLyBoaWdoY29sb3IKKwkJICAgICAgKGJwcCA9PSAyNCkgPyAweDI5IDoJLy8gcGFja2VkIDI0Yml0IHRydWVjb2xvcgorCQkgICAgICAoYnBwID09IDMyKSA/IDB4MDkgOiAwKTsJLy8gdHJ1ZWNvbG9yLCAxNiBiaXQgcGl4ZWxidXMKKwl3cml0ZTNYNChDUjM5LDB4MDEgfAkJCS8vIE1NSU8gZW5hYmxlCisJCSAgICAgIChwY2lyYiA/IDB4MDIgOiAwKSB8IC8vIHBjaSByZWFkIGJ1cnN0IGVuYWJsZQorCQkgICAgICAocGNpd2IgPyAweDA0IDogMCkpOyAvLyBwY2kgd3JpdGUgYnVyc3QgZW5hYmxlCisJd3JpdGUzWDQoQ1I1NSwweDFGIHwgLy8gcGNpIGNsb2NrcyAqIDIgZm9yIFNUT1AjIGR1cmluZyAxc3QgZGF0YSBwaGFzZQorCQkgICAgICAocGNpcnIgPyAweDQwIDogMCkgfCAvLyBwY2kgcmVhZCByZXRyeSBlbmFibGUKKwkJICAgICAgKHBjaXdyID8gMHg4MCA6IDApKTsgLy8gcGNpIHdyaXRlIHJldHJ5IGVuYWJsZQorCXdyaXRlM1g0KENSNTYscHJlZW5kZmV0Y2ggPj4gOCA8IDIgPyAocHJlZW5kZmV0Y2ggPj4gOCAmIDB4MDEpfDIgOiAwKTsKKwl3cml0ZTNYNChDUjU3LHByZWVuZGZldGNoID4+IDggPCAyID8gcHJlZW5kZmV0Y2ggJiAweGZmIDogMCk7CisJd3JpdGUzWDQoQ1I1OCwweDgyKTsJLy8gQmlvcyBkb2VzIHRoaXMgLi4uLiBkb24ndCBrbm93IG1vcmUKKwkvLworCS8vIFNldHVwIFNSeHggcmVncworCS8vCisJd3JpdGUzQzQoU1IwMCwzKTsKKwl3cml0ZTNDNChTUjAxLDEpOwkvL3NldCBjaGFyIGNsb2NrIDggZG90cyB3aWRlCisJd3JpdGUzQzQoU1IwMiwweDBGKTsJLy9lbmFibGUgNCBtYXBzIG5lZWRlZCBpbiBjaGFpbjQgbW9kZQorCXdyaXRlM0M0KFNSMDMsMCk7CS8vbm8gY2hhcmFjdGVyIG1hcCBzZWxlY3QKKwl3cml0ZTNDNChTUjA0LDB4MEUpOwkvL21lbW9yeSBtb2RlOiBleHQgbWVtLCBldmVuLCBjaGFpbjQKKworCW91dDgoMHgzQzQsMHgwYik7CisJaW44KDB4M0M1KTsJCS8vIFNldCBORVcgbW9kZQorCXdyaXRlM0M0KFNSMEQsMHgwMCk7CS8vIHRlc3QgLi4uIGNoZWNrCisKKwlzZXRfdmNsayhwYXIsKGJwcD09MzIgPyAyMDAwMDAwMDAgOiAxMDAwMDAwMDApLworCQkgaW5mby0+dmFyLnBpeGNsb2NrKTsgLy9TUjE4LFNSMTkKKworCS8vCisJLy8gU2V0dXAgR1J4eCByZWdzCisJLy8KKwl3cml0ZTNDRShHUjAwLDB4MDApOwkvLyB0ZXN0IC4uLiBjaGVjaworCXdyaXRlM0NFKEdSMDEsMHgwMCk7CS8vIHRlc3QgLi4uIGNoZWNrCisJd3JpdGUzQ0UoR1IwMiwweDAwKTsJLy8gdGVzdCAuLi4gY2hlY2sKKwl3cml0ZTNDRShHUjAzLDB4MDApOwkvLyB0ZXN0IC4uLiBjaGVjaworCXdyaXRlM0NFKEdSMDQsMHgwMCk7CS8vIHRlc3QgLi4uIGNoZWNrCisJd3JpdGUzQ0UoR1IwNSwweDQwKTsJLy8gbm8gQ0dBIGNvbXBhdCxhbGxvdyAyNTYgY29sCisJd3JpdGUzQ0UoR1IwNiwweDA1KTsJLy8gZ3JhcGhpY3MgbW9kZQorCXdyaXRlM0NFKEdSMDcsMHgwRik7CS8vIHBsYW5lcz8KKwl3cml0ZTNDRShHUjA4LDB4RkYpOwkvLyB0ZXN0IC4uLiBjaGVjaworCXdyaXRlM0NFKEdSMEYsKGJwcD09MzIpPzB4MUE6MHgxMik7IC8vIGRpdiB2Y2xrIGJ5IDIgaWYgMzJicHAsIGNoYWluNAorCXdyaXRlM0NFKEdSMjAsMHhDMCk7CS8vIHRlc3QgLi4uIGNoZWNrCisJd3JpdGUzQ0UoR1IyRiwweEEwKTsJLy8gUENMSyA9IFZDTEssIG5vIHNrZXcsCisKKwkvLworCS8vIFNldHVwIEFSeHggcmVncworCS8vCisJZm9yKGkgPSAwO2kgPCAweDEwO2krKykgLy8gc2V0IEFSMDAgLi4gQVIwZgorCQl3cml0ZTNDMChpLGkpOworCXdyaXRlM0MwKEFSMTAsMHg0MSk7CS8vIGdyYXBoaWNzIG1vZGUgYW5kIHN1cHBvcnQgMjU2IGNvbG9yIG1vZGVzCisJd3JpdGUzQzAoQVIxMiwweDBGKTsJLy8gcGxhbmVzCisJd3JpdGUzQzAoQVIxMywwKTsJLy8gaG9yaXpvbnRhbCBwZWwgcGFubmluZworCWluOCgweDNEQSk7CQkvLyByZXNldCBpbnRlcm5hbCBmbGFnIHRvIDNjMCBpbmRleAorCW91dDgoMHgzQzAsMHgyMCk7CS8vIGVuYWJsZSBhdHRyCisKKwkvLworCS8vIFNldHVwIGhpZGRlbiBSQU1EQUMgY29tbWFuZCByZWdpc3RlcgorCS8vCisJaW44KDB4M0M4KTsgIC8vIHRoZXNlIHJlYWRzIGFyZQorCWluOCgweDNDNik7ICAvLyBuZWNlc3NhcnkgdG8KKwlpbjgoMHgzQzYpOyAgLy8gdW5tYXNrIHRoZSBSQU1EQUMKKwlpbjgoMHgzQzYpOyAgLy8gY29tbWFuZCByZWcsIG90aGVyd2lzZQorCWluOCgweDNDNik7ICAvLyB3ZSB3b3VsZCB3cml0ZSB0aGUgcGl4ZWxtYXNrIHJlZyEKKwlvdXQ4KDB4M0M2LChicHAgPT0gIDgpID8gMHgwMCA6IAkvLyAyNTYgY29sb3JzCisJCSAgIChicHAgPT0gMTUpID8gMHgxMCA6IAkvLworCQkgICAoYnBwID09IDE2KSA/IDB4MzAgOiAJLy8gaGljb2xvcgorCQkgICAoYnBwID09IDI0KSA/IDB4RDAgOiAJLy8gdHJ1ZWNvbG9yCisJCSAgIChicHAgPT0gMzIpID8gMHhEMCA6IDApOwkvLyB0cnVlY29sb3IKKwlpbjgoMHgzQzgpOworCisJLy8KKwkvLyBHUjMxIGlzIG5vdCBtZW50aW9uZWQgaW4gdGhlIGRhdGFzaGVldAorCS8vCisJaWYgKGRpc3BsYXl0eXBlID09IERJU1BMQVlfRlApCisJCXdyaXRlM0NFKEdSMzEsKHJlYWQzQ0UoR1IzMSkgJiAweDhGKSB8CisJCQkgKChpbmZvLT52YXIueXJlcyA+IDEwMjQpID8gMHg1MCA6CisJCQkgKGluZm8tPnZhci55cmVzID4gICA3NjgpID8gMHgzMCA6CisJCQkgKGluZm8tPnZhci55cmVzID4gICA2MDApID8gMHgyMCA6CisJCQkgKGluZm8tPnZhci55cmVzID4gICA0ODApID8gMHgxMCA6IDApKTsKKworCWluZm8tPmZpeC52aXN1YWwgPSAoYnBwID09IDgpID8gRkJfVklTVUFMX1BTRVVET0NPTE9SCisJCQkJICAgICAgOiBGQl9WSVNVQUxfVFJVRUNPTE9SOworCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IGluZm8tPnZhci54cmVzICogKGJwcCA+PiAzKTsKKwlpbmZvLT5jbWFwLmxlbiA9IChicHAgPT0gOCkgPyAyNTY6IDE2OworCisJLy8KKwkvLyBpbml0IGFjY2VsZXJhdGlvbiBlbmdpbmUKKwkvLworCWN5YmxhZmJfc2V0dXBfR0UoaW5mby0+dmFyLnhyZXMsaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKKworCXJlZ2R1bXAocGFyKTsKKworCXJldHVybiAwOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFNldCBvbmUgY29sb3IgcmVnaXN0ZXIKKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IGN5YmxhZmJfc2V0Y29scmVnKHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAorCQkJICAgICB1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCisJCQkgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWludCBicHAgPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWw7CisKKwlpZiAocmVnbm8gPj0gaW5mby0+Y21hcC5sZW4pCisJCXJldHVybiAxOworCisJaWYgKGJwcCA9PSA4KSB7CisJCW91dDgoMHgzQzYsMHhGRik7CisJCW91dDgoMHgzQzgscmVnbm8pOworCQlvdXQ4KDB4M0M5LHJlZD4+MTApOworCQlvdXQ4KDB4M0M5LGdyZWVuPj4xMCk7CisJCW91dDgoMHgzQzksYmx1ZT4+MTApOworCisJfSBlbHNlIGlmIChicHAgPT0gMTYpCQkJCS8vIFJHQiA1NjUKKwkJKCh1MzIqKWluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPQorCQkJKHJlZCAmIDB4RjgwMCkgfAorCQkJKChncmVlbiAmIDB4RkMwMCkgPj4gNSkgfAorCQkJKChibHVlICYgMHhGODAwKSA+PiAxMSk7CisJZWxzZSBpZiAoYnBwID09IDMyKQkJCQkvLyBBUkdCIDg4ODgKKwkJKCh1MzIqKWluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPQorCQkJKCh0cmFuc3AgJiAweEZGMDApIDw8MTYpIHwKKwkJCSgocmVkICYgMHhGRjAwKSA8PCA4KSB8CisJCQkoKGdyZWVuICYgMHhGRjAwKSkgfAorCQkJKChibHVlICYgMHhGRjAwKT4+OCk7CisKKwlyZXR1cm4gMDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVHJ5IGJsYW5raW5nIHRoZSBzY3JlZW4uIEZvciBmbGF0IHBhbmVscyBpdCBkb2VzIG5vdGhpbmcKKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludCBjeWJsYWZiX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIFBNQ29udCxEUE1TQ29udDsKKworCWlmIChkaXNwbGF5dHlwZSA9PSBESVNQTEFZX0ZQKQorCQlyZXR1cm4gMDsKKworCW91dDgoMHg4M0M4LDB4MDQpOyAJCS8vIERQTVMgQ29udHJvbAorCVBNQ29udCA9IGluOCgweDgzQzYpICYgMHhGQzsKKworCURQTVNDb250ID0gcmVhZDNDRShHUjIzKSAmIDB4RkM7CisKKwlzd2l0Y2ggKGJsYW5rX21vZGUpCisJeworCWNhc2UgRkJfQkxBTktfVU5CTEFOSzogICAgICAgLy8gU2NyZWVuOiBPbiwgSFN5bmM6IE9uLCBWU3luYzogT24KKwljYXNlIEZCX0JMQU5LX05PUk1BTDoJICAgICAvLyBTY3JlZW46IE9mZiwgSFN5bmM6IE9uLCBWU3luYzogT24KKwkJUE1Db250IHw9IDB4MDM7CisJCURQTVNDb250IHw9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDogLy8gU2NyZWVuOiBPZmYsIEhTeW5jOiBPZmYsIFZTeW5jOiBPbgorCQlQTUNvbnQgfD0gMHgwMjsKKwkJRFBNU0NvbnQgfD0gMHgwMTsKKwkJYnJlYWs7CisJY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOiAvLyBTY3JlZW46IE9mZiwgSFN5bmM6IE9uLCBWU3luYzogT2ZmCisJCVBNQ29udCB8PSAweDAyOworCQlEUE1TQ29udCB8PSAweDAyOworCQlicmVhazsKKwljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjogICAgIC8vIFNjcmVlbjogT2ZmLCBIU3luYzogT2ZmLCBWU3luYzogT2ZmCisJCVBNQ29udCB8PSAweDAwOworCQlEUE1TQ29udCB8PSAweDAzOworCQlicmVhazsKKwl9CisKKwl3cml0ZTNDRShHUjIzLERQTVNDb250KTsKKwlvdXQ4KDB4ODNDOCw0KTsKKwlvdXQ4KDB4ODNDNixQTUNvbnQpOworCS8vCisJLy8gbGV0IGZiY29uIGRvIGEgc29mdGJsYW5rIGZvciB1cworCS8vCisJcmV0dXJuIChibGFua19tb2RlID09IEZCX0JMQU5LX05PUk1BTCkgPyAxIDogMDsKK30KKworc3RhdGljIHN0cnVjdCBmYl9vcHMgY3libGFmYl9vcHMgX19kZXZpbml0ZGF0YSA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuZmJfc2V0Y29scmVnID0gY3libGFmYl9zZXRjb2xyZWcsCisJLmZiX3Bhbl9kaXNwbGF5ID0gY3libGFmYl9wYW5fZGlzcGxheSwKKwkuZmJfYmxhbmsgPSBjeWJsYWZiX2JsYW5rLAorCS5mYl9jaGVja192YXIgPSBjeWJsYWZiX2NoZWNrX3ZhciwKKwkuZmJfc2V0X3BhciA9IGN5YmxhZmJfc2V0X3BhciwKKwkuZmJfZmlsbHJlY3QgPSBjeWJsYWZiX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYT0gY3libGFmYl9jb3B5YXJlYSwKKwkuZmJfaW1hZ2VibGl0ID0gY3libGFmYl9pbWFnZWJsaXQsCisJLmZiX2N1cnNvciA9IHNvZnRfY3Vyc29yLAorfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIGdldHN0YXJ0dXBtb2RlKCkgZGVjaWRlcyBhYm91dCB0aGUgaW5pdGFsIHZpZGVvIG1vZGUKKy8vCisvLyBUaGVyZSBpcyBubyByZWFzb24gdG8gdXNlIG1vZGVkYiwgYSBsb3Qgb2YgdmlkZW8gbW9kZXMgdGhlcmUgd291bGQKKy8vIG5lZWQgYWx0ZXJlZCB0aW1pbmdzIHRvIGRpc3BsYXkgY29ycmVjdGx5LiBTbyBJIGRlY2lkZWQgdGhhdCBpdCBpcyBtdWNoCisvLyBiZXR0ZXIgdG8gcHJvdmlkZSBhIGxpbWl0ZWQgb3B0aW1pemVkIHNldCBvZiBtb2RlcyBwbHVzIHRoZSBvcHRpb24gb2YKKy8vIHVzaW5nIHRoZSBtb2RlIGluIGVmZmVjdCBhdCBzdGFydHVwIHRpbWUgKG1pZ2h0IGJlIHNlbGVjdGVkIHVzaW5nIHRoZQorLy8gdmdhPT8/PyBwYXJhbXRlcikuIEFmdGVyIHRoYXQgdGhlIHVzZXIgbWlnaHQgdXNlIGZic2V0IHRvIHNlbGVjdCBhbnkKKy8vIG1vZGUgaGUgbGlrZXMsIGNoZWNrX3ZhciB3aWxsIG5vdCB0cnkgdG8gYWx0ZXIgZ2VvbWV0cnkgcGFyYW1ldGVycyBhcworLy8gaXQgd291bGQgYmUgbmVjZXNzYXJ5IG90aGVyd2lzZS4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdldHN0YXJ0dXBtb2RlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXUzMglodG90YWwsaGRpc3BlbmQsaHN5bmNzdGFydCxoc3luY2VuZCxoYmxhbmtzdGFydCxoYmxhbmtlbmQsCisJCXZ0b3RhbCx2ZGlzcGVuZCx2c3luY3N0YXJ0LHZzeW5jZW5kLHZibGFua3N0YXJ0LHZibGFua2VuZCwKKwkJY3IwMCxjcjAxLGNyMDIsY3IwMyxjcjA0LGNyMDUsY3IyYiwKKwkJY3IwNixjcjA3LGNyMDksY3IxMCxjcjExLGNyMTIsY3IxNSxjcjE2LGNyMjcsCisJCWNyMzgsCisJCXNyMGQsc3IxOCxzcjE5LAorCQlncjBmLAorCQlmaSxweGNsa2Rpdix2Y2xrZGl2LHRtcCxpOworCisJc3RydWN0IG1vZHVzIHsKKwkJaW50IHhyZXM7IGludCB5cmVzOyBpbnQgdnlyZXM7IGludCBicHA7IGludCBweGNsazsKKwkJaW50IGxlZnRfbWFyZ2luOyBpbnQgcmlnaHRfbWFyZ2luOyBpbnQgdXBwZXJfbWFyZ2luOworCQlpbnQgbG93ZXJfbWFyZ2luOyBpbnQgaHN5bmNfbGVuOyBpbnQgdnN5bmNfbGVuOworCX0gIG1vZGVkYls1XSA9IHsKKwkJeyAgIDAsCSAgMCwgODAwMCwgMCwgMCwgICAwLCAgMCwgIDAsIDAsICAgMCwgIDB9LAorCQl7IDY0MCwJNDgwLCAzNzU2LCAwLCAwLCAtNDAsIDI0LCAxNywgMCwgMjE2LCAgM30sCisJCXsgODAwLAk2MDAsIDMyMjEsIDAsIDAsICA5NiwgMjQsIDE0LCAwLCAxMzYsIDExfSwKKwkJezEwMjQsCTc2OCwgMjgxNSwgMCwgMCwgMTQ0LCAyNCwgMjksIDAsIDEyMCwgIDN9LAorCQl7MTI4MCwgMTAyNCwgMjY2MiwgMCwgMCwgMjMyLCAxNiwgMzksIDAsIDE2MCwgIDN9CisJfTsKKworCW91dGIoMHgwMCwweDNkNCk7IGNyMDA9aW5iKDB4M2Q1KTsgb3V0YigweDAxLDB4M2Q0KTsgY3IwMT1pbmIoMHgzZDUpOworCW91dGIoMHgwMiwweDNkNCk7IGNyMDI9aW5iKDB4M2Q1KTsgb3V0YigweDAzLDB4M2Q0KTsgY3IwMz1pbmIoMHgzZDUpOworCW91dGIoMHgwNCwweDNkNCk7IGNyMDQ9aW5iKDB4M2Q1KTsgb3V0YigweDA1LDB4M2Q0KTsgY3IwNT1pbmIoMHgzZDUpOworCW91dGIoMHgwNiwweDNkNCk7IGNyMDY9aW5iKDB4M2Q1KTsgb3V0YigweDA3LDB4M2Q0KTsgY3IwNz1pbmIoMHgzZDUpOworCW91dGIoMHgwOSwweDNkNCk7IGNyMDk9aW5iKDB4M2Q1KTsgb3V0YigweDEwLDB4M2Q0KTsgY3IxMD1pbmIoMHgzZDUpOworCW91dGIoMHgxMSwweDNkNCk7IGNyMTE9aW5iKDB4M2Q1KTsgb3V0YigweDEyLDB4M2Q0KTsgY3IxMj1pbmIoMHgzZDUpOworCW91dGIoMHgxNSwweDNkNCk7IGNyMTU9aW5iKDB4M2Q1KTsgb3V0YigweDE2LDB4M2Q0KTsgY3IxNj1pbmIoMHgzZDUpOworCW91dGIoMHgyNywweDNkNCk7IGNyMjc9aW5iKDB4M2Q1KTsgb3V0YigweDJiLDB4M2Q0KTsgY3IyYj1pbmIoMHgzZDUpOworCW91dGIoMHgzOCwweDNkNCk7IGNyMzg9aW5iKDB4M2Q1KTsgb3V0YigweDBiLDB4M2M0KTsgaW5iKDB4M2M1KTsKKwlvdXRiKDB4MGQsMHgzYzQpOyBzcjBkPWluYigweDNjNSk7IG91dGIoMHgxOCwweDNjNCk7IHNyMTg9aW5iKDB4M2M1KTsKKwlvdXRiKDB4MTksMHgzYzQpOyBzcjE5PWluYigweDNjNSk7IG91dGIoMHgwZiwweDNjZSk7IGdyMGY9aW5iKDB4M2NmKTsKKworCWh0b3RhbAkgICAgPSBjcjAwIHwgKGNyMmIgJiAweDAxKSA8PCA4OworCWhkaXNwZW5kICAgID0gY3IwMSB8IChjcjJiICYgMHgwMikgPDwgNzsKKwloYmxhbmtzdGFydCA9IGNyMDIgfCAoY3IyYiAmIDB4MTApIDw8IDQ7CisJaGJsYW5rZW5kICAgPSAoY3IwMyAmIDB4MWYpIHwgKGNyMDUgJiAweDgwKSA+PiAyOworCWhzeW5jc3RhcnQgID0gY3IwNCB8IChjcjJiICYgMHgwOCkgPDwgNTsKKwloc3luY2VuZCAgICA9IGNyMDUgJiAweDFmOworCisJbW9kZWRiWzBdLnhyZXMgPSBoYmxhbmtzdGFydCAqIDg7CisJbW9kZWRiWzBdLmhzeW5jX2xlbiA9IGhzeW5jZW5kICogODsKKwltb2RlZGJbMF0ucmlnaHRfbWFyZ2luID0gaHN5bmNzdGFydCAqIDggLSBtb2RlZGJbMF0ueHJlczsKKwltb2RlZGJbMF0ubGVmdF9tYXJnaW4gPSAoaHRvdGFsICsgNSkgKiA4IC0gbW9kZWRiWzBdLnhyZXMgLQorCQltb2RlZGJbMF0ucmlnaHRfbWFyZ2luIC0gbW9kZWRiWzBdLmhzeW5jX2xlbjsKKworCXZ0b3RhbAkgICAgPSBjcjA2IHwgKGNyMDcgJiAweDAxKSA8PCA4IHwgKGNyMDcgJiAweDIwKSA8PCA0CisJCQkgICB8IChjcjI3ICYgMHg4MCkgPDwgMzsKKwl2ZGlzcGVuZCAgICA9IGNyMTIgfCAoY3IwNyAmIDB4MDIpIDw8IDcgfCAoY3IwNyAmIDB4NDApIDw8IDMKKwkJCSAgIHwgKGNyMjcgJiAweDEwKSA8PCA2OworCXZzeW5jc3RhcnQgID0gY3IxMCB8IChjcjA3ICYgMHgwNCkgPDwgNiB8IChjcjA3ICYgMHg4MCkgPDwgMgorCQkJICAgfCAoY3IyNyAmIDB4MjApIDw8IDU7CisJdnN5bmNlbmQgICAgPSBjcjExICYgMHgwZjsKKwl2YmxhbmtzdGFydCA9IGNyMTUgfCAoY3IwNyAmIDB4MDgpIDw8IDUgfCAoY3IwOSAmIDB4MjApIDw8IDQKKwkJCSAgIHwgKGNyMjcgJiAweDQwKSA8PCA0OworCXZibGFua2VuZCAgID0gY3IxNjsKKworCW1vZGVkYlswXS55cmVzCSAgICAgICA9IHZkaXNwZW5kICsgMTsKKwltb2RlZGJbMF0udnN5bmNfbGVuICAgID0gdnN5bmNlbmQ7CisJbW9kZWRiWzBdLmxvd2VyX21hcmdpbiA9IHZzeW5jc3RhcnQgLSBtb2RlZGJbMF0ueXJlczsKKwltb2RlZGJbMF0udXBwZXJfbWFyZ2luID0gdnRvdGFsIC0gbW9kZWRiWzBdLnlyZXMgLQorCQltb2RlZGJbMF0ubG93ZXJfbWFyZ2luIC0gbW9kZWRiWzBdLnZzeW5jX2xlbiArIDI7CisKKwl0bXAgPSBjcjM4ICYgMHgzYzsKKwltb2RlZGJbMF0uYnBwID0gdG1wID09IDAgPyA4IDogdG1wID09IDQgPyAxNiA6IHRtcCA9PSAyOCA/IDI0IDoKKwkJCXRtcCA9PSA4ID8gMzIgOiA4OworCisJZmkgPSAoKDU4NjQ3MjcqKHNyMTgrOCkpLygoKHNyMTkmMHgzZikrMikqKDE8PCgoc3IxOSYweGMwKT4+NikpKSk+PjEyOworCXB4Y2xrZGl2ID0gKChncjBmICYgMHgwOCkgPj4gMyB8IChncjBmICYgMHg0MCkgPj4gNSkgKyAxOworCXRtcCA9IHNyMGQgJiAweDA2OworCXZjbGtkaXYgPSB0bXAgPT0gMCA/IDIgOiB0bXAgPT0gMiA/IDQgOiB0bXAgPT0gNCA/IDggOiAzOyAvLyAqIDIgIQorCW1vZGVkYlswXS5weGNsayA9ICgoMTAwMDAwMDAwICogcHhjbGtkaXYgKiB2Y2xrZGl2KSA+PiAxKSAvIGZpOworCisJaWYgKHZlcmJvc2l0eSA+IDApCisJCW91dHB1dCgiZGV0ZWN0ZWQgc3RhcnR1cCBtb2RlOiAiCisJCSAgICAgICAiZmJzZXQgLWcgJWQgJWQgJWQgPz8/ICVkIC10ICVkICVkICVkICVkICVkICVkICVkXG4iLAorCQkgICAgICAgbW9kZWRiWzBdLnhyZXMsbW9kZWRiWzBdLnlyZXMsbW9kZWRiWzBdLnhyZXMsCisJCSAgICAgICBtb2RlZGJbMF0uYnBwLG1vZGVkYlswXS5weGNsayxtb2RlZGJbMF0ubGVmdF9tYXJnaW4sCisJCSAgICAgICBtb2RlZGJbMF0ucmlnaHRfbWFyZ2luLG1vZGVkYlswXS51cHBlcl9tYXJnaW4sCisJCSAgICAgICBtb2RlZGJbMF0ubG93ZXJfbWFyZ2luLG1vZGVkYlswXS5oc3luY19sZW4sCisJCSAgICAgICBtb2RlZGJbMF0udnN5bmNfbGVuKTsKKworCS8vCisJLy8gV2UgdXNlIHRoaXMgZ290byB0YXJnZXQgaW4gY2FzZSBvZiBhIGZhaWxlZCBjaGVja192YXIuIE5vLCBJIHJlYWxseQorCS8vIGRvIG5vdCB3YW50IHRvIGRvIGl0IGluIGFub3RoZXIgd2F5IQorCS8vCisKKwl0cnlhZ2FpbjoKKworCWkgPSAobW9kZSA9PSBOVUxMKSA/IDAgOgorCSAgICAhc3RybmNtcChtb2RlLCI2NDB4NDgwIiw3KSA/IDEgOgorCSAgICAhc3RybmNtcChtb2RlLCI4MDB4NjAwIiw3KSA/IDIgOgorCSAgICAhc3RybmNtcChtb2RlLCIxMDI0eDc2OCIsOCkgPyAzIDoKKwkgICAgIXN0cm5jbXAobW9kZSwiMTI4MHgxMDI0Iiw5KSA/IDQgOiAwOworCisJcmVmID0gKHJlZiA8IDUwKSA/IDUwIDogKHJlZiA+IDg1KSA/IDg1IDogcmVmOworCisJaWYoaT09MCkgeworCQlpbmZvLT52YXIucGl4Y2xvY2sgPSBtb2RlZGJbaV0ucHhjbGs7CisJCWluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9IG1vZGVkYltpXS5icHA7CisJfSBlbHNlIHsKKwkJaW5mby0+dmFyLnBpeGNsb2NrID0gKDEwMDAwMDAwMCAvCisJCQkoKG1vZGVkYltpXS5sZWZ0X21hcmdpbiArIG1vZGVkYltpXS54cmVzICsKKwkJCSAgbW9kZWRiW2ldLnJpZ2h0X21hcmdpbiArIG1vZGVkYltpXS5oc3luY19sZW4KKwkJCSApICogKAorCQkJICBtb2RlZGJbaV0udXBwZXJfbWFyZ2luICsgbW9kZWRiW2ldLnlyZXMgKworCQkJICBtb2RlZGJbaV0ubG93ZXJfbWFyZ2luICsgbW9kZWRiW2ldLnZzeW5jX2xlbgorCQkJICkgKgorCQkJICByZWYgLyAxMDAwMAorCQkJKSk7CisJCWluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9IGJwcDsKKwl9CisKKwlpbmZvLT52YXIubGVmdF9tYXJnaW4gPSBtb2RlZGJbaV0ubGVmdF9tYXJnaW47CisJaW5mby0+dmFyLnJpZ2h0X21hcmdpbiA9IG1vZGVkYltpXS5yaWdodF9tYXJnaW47CisJaW5mby0+dmFyLnhyZXMgPSBtb2RlZGJbaV0ueHJlczsKKwlpbmZvLT52YXIueHJlc192aXJ0dWFsID0gbW9kZWRiW2ldLnhyZXM7CisJaW5mby0+dmFyLnhvZmZzZXQgPSAwOworCWluZm8tPnZhci5oc3luY19sZW4gPSBtb2RlZGJbaV0uaHN5bmNfbGVuOworCWluZm8tPnZhci51cHBlcl9tYXJnaW4gPSBtb2RlZGJbaV0udXBwZXJfbWFyZ2luOworCWluZm8tPnZhci55cmVzID0gbW9kZWRiW2ldLnlyZXM7CisJaW5mby0+dmFyLnlyZXNfdmlydHVhbCA9IG1vZGVkYltpXS52eXJlczsKKwlpbmZvLT52YXIueW9mZnNldCA9IDA7CisJaW5mby0+dmFyLmxvd2VyX21hcmdpbiA9IG1vZGVkYltpXS5sb3dlcl9tYXJnaW47CisJaW5mby0+dmFyLnZzeW5jX2xlbiA9IG1vZGVkYltpXS52c3luY19sZW47CisJaW5mby0+dmFyLnN5bmMgPSAwOworCWluZm8tPnZhci52bW9kZSA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQ7CisKKwlpZihjeWJsYWZiX2NoZWNrX3ZhcigmaW5mby0+dmFyLGluZm8pKSB7CisJCS8vIDY0MHg0ODAtOEA3NSBzaG91bGQgcmVhbGx5IG5ldmVyIGZhaWwuIE9uZSBjYXNlIHdvdWxkCisJCS8vIGJlIGZwID09IDEgYW5kIG5hdGl2ZXggPCA2NDAgLi4uIGdpdmUgdXAgdGhlbgorCQlpZihpPT0xICYmIGJwcCA9PSA4ICYmIHJlZiA9PSA3NSl7CisJCQlvdXRwdXQoIkNhbid0IGZpbmQgYSB2YWxpZCBtb2RlIDotKFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvLyBPdXIgZGV0ZWN0ZWQgbW9kZSBpcyB1bmxpa2VseSB0byBmYWlsLiBJZiBpdCBkb2VzLAorCQkvLyB0cnkgNjQweDQ4MC04QDc1IC4uLgorCQlpZihpPT0wKSB7CisJCQltb2RlPSI2NDB4NDgwIjsKKwkJCWJwcD04OworCQkJcmVmPTc1OworCQkJb3V0cHV0KCJEZXRlY3RlZCBtb2RlIGZhaWxlZCBjaGVja192YXIhICIKKwkJCSAgICAgICAiVHJ5aW5nIDY0MHg0ODAtOEA3NVxuIik7CisJCQlnb3RvIHRyeWFnYWluOworCQl9CisJCS8vIEEgc3BlY2lmaWVkIHZpZGVvIG1vZGUgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4KKwkJLy8gVHJ5IHRoZSBzdGFydHVwIG1vZGUgZmlyc3QKKwkJb3V0cHV0KCJTcGVjaWZpZWQgbW9kZSAnJXMnIGZhaWxlZCBjaGVjayEgIgorCQkJIkZhbGxpbmcgYmFjayB0byBzdGFydHVwIG1vZGUuXG4iLG1vZGUpOworCQltb2RlPU5VTEw7CisJCWdvdG8gdHJ5YWdhaW47CisJfQorCisJcmV0dXJuIDA7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIERldGVjdCBhY3RpdmF0ZWQgbWVtb3J5IHNpemUuIFVuZGVmaW5lZCB2YWx1ZXMgcmVxdWlyZQorLy8gbWVtc2l6ZSBwYXJhbWV0ZXIuCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBnZXRfbWVtc2l6ZSh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgdG1wOworCXVuc2lnbmVkIGludCBrOworCisJaWYgKG1lbXNpemUpCisJCWsgPSBtZW1zaXplICogS2I7CisJZWxzZSB7CisJCXRtcCA9IHJlYWQzWDQoQ1IxRikgJiAweDBGOworCQlzd2l0Y2ggKHRtcCkgeworCQkJY2FzZSAweDAzOiBrID0gMSAqIE1iOyBicmVhazsKKwkJCWNhc2UgMHgwNzogayA9IDIgKiBNYjsgYnJlYWs7CisJCQljYXNlIDB4MEY6IGsgPSA0ICogTWI7IGJyZWFrOworCQkJY2FzZSAweDA0OiBrID0gOCAqIE1iOyBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJayA9IDEgKiBNYjsKKwkJCQlvdXRwdXQoIlVua25vd24gbWVtb3J5IHNpemUgY29kZSAleCBpbiBDUjFGLiIKKwkJCQkgICAgICAgIiBXZSBkZWZhdWx0IHRvIDEgTWIgZm9yIG5vdywgcGxlYXNlIgorCQkJCSAgICAgICAiIGRvIHByb3ZpZGUgYSBtZW1zaXplIHBhcmFtZXRlciFcbiIsCisJCQkJICAgICAgIHRtcCk7CisJCX0KKwl9CisKKwlpZiAodmVyYm9zaXR5ID4gMCkKKwkJb3V0cHV0KCJmcmFtZWJ1ZmZlciBzaXplID0gJWQgS2JcbiIsay9LYik7CisJcmV0dXJuIGs7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gRGV0ZWN0IGlmIGEgZmxhdCBwYW5lbCBtb25pdG9yIGNvbm5lY3RlZCB0byB0aGUgc3BlY2lhbAorLy8gaW50ZXJmYWNlIGlzIGFjdGl2ZS4gT3ZlcnJpZGUgaXMgcG9zc2libGUgYnkgZnAgYW5kIGNydAorLy8gcGFyYW1ldGVycy4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBnZXRfZGlzcGxheXR5cGUodm9pZCkKK3sKKwlpZiAoZnApCisJCXJldHVybiBESVNQTEFZX0ZQOworCWlmIChjcnQpCisJCXJldHVybiBESVNQTEFZX0NSVDsKKwlyZXR1cm4gKHJlYWQzQ0UoR1IzMykgJiAweDEwKT9ESVNQTEFZX0ZQOkRJU1BMQVlfQ1JUOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBHZXQgbmF0aXZlIHJlc29sdXRpb24gb2YgZmxhdCBwYW5lbAorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBnZXRfbmF0aXZleCh2b2lkKQoreworCWludCB4LHksdG1wOworCisJaWYgKG5hdGl2ZXgpCisJCXJldHVybiBuYXRpdmV4OworCisJdG1wID0gKHJlYWQzQ0UoR1I1MikgPj4gNCkgJiAzOworCisJc3dpdGNoICh0bXApIHsKKwkJY2FzZSAwOiAgeCA9IDEyODA7IHkgPSAxMDI0OyBicmVhazsKKwkJY2FzZSAyOiAgeCA9IDEwMjQ7IHkgPSA3Njg7ICBicmVhazsKKwkJY2FzZSAzOiAgeCA9IDgwMDsgIHkgPSA2MDA7ICBicmVhazsKKwkJY2FzZSA0OiAgeCA9IDE0MDA7IHkgPSAxMDUwOyBicmVhazsKKwkJY2FzZSAxOgorCQlkZWZhdWx0OiB4ID0gNjQwOyAgeSA9IDQ4MDsgIGJyZWFrOworCX0KKworCWlmICh2ZXJib3NpdHkgPiAwKQorCQlvdXRwdXQoIiVkeCVkIGZsYXQgcGFuZWwgZm91bmRcbiIseCx5KTsKKwlyZXR1cm4geDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgY3libGFfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICogZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKiBpZCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgY3libGFmYl9wYXIgKnBhcjsKKworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGN5YmxhZmJfcGFyKSwmZGV2LT5kZXYpOworCisJaWYgKCFpbmZvKQorCQlnb3RvIGVycm91dF9hbGxvYzsKKworCXBhciA9IGluZm8tPnBhcjsKKwlwYXItPm9wcyA9IGN5YmxhZmJfb3BzOworCisJaW5mby0+Zml4ID0gY3libGFmYl9maXg7CisJaW5mby0+ZmJvcHMgPSAmcGFyLT5vcHM7CisJaW5mby0+Zml4ID0gY3libGFmYl9maXg7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkgeworCQlvdXRwdXQoImNvdWxkIG5vdCBlbmFibGUgZGV2aWNlIVxuIik7CisJCWdvdG8gZXJyb3V0X2VuYWJsZTsKKwl9CisKKwkvLyBtaWdodCBhbHJlYWR5IGJlIHJlcXVlc3RlZCBieSB2Z2EgY29uc29sZSBvciB2ZXNhZmIsCisJLy8gc28gd2UgZG8gY2FyZSBhYm91dCBzdWNjZXNzCisJcmVxdWVzdF9yZWdpb24oMHgzYzAsMzIsImN5YmxhZmIiKTsKKworCS8vCisJLy8gR3JhcGhpY3MgRW5naW5lIFJlZ2lzdGVycworCS8vCisJcmVxdWVzdF9yZWdpb24oR0VCYXNlLDB4MTAwLCJjeWJsYWZiIik7CisKKwlyZWdkdW1wKHBhcik7CisKKwllbmFibGVfbW1pbygpOworCisJLy8gc2V0dXAgTU1JTyByZWdpb24KKwlpbmZvLT5maXgubW1pb19zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsMSk7CisJaW5mby0+Zml4Lm1taW9fbGVuID0gMHgyMDAwMDsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGluZm8tPmZpeC5tbWlvX3N0YXJ0LAorCQkJCWluZm8tPmZpeC5tbWlvX2xlbiwiY3libGFmYiIpKSB7CisJCW91dHB1dCgicmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZCBmb3IgbW1pbyByZWdpb24hXG4iKTsKKwkJZ290byBlcnJvdXRfbW1pb19yZXFtZW07CisJfQorCisJaW9fdmlydCA9IGlvcmVtYXBfbm9jYWNoZShpbmZvLT5maXgubW1pb19zdGFydCwgaW5mby0+Zml4Lm1taW9fbGVuKTsKKworCWlmICghaW9fdmlydCkgeworCQlvdXRwdXQoImlvcmVtYXAgZmFpbGVkIGZvciBtbWlvIHJlZ2lvblxuIik7CisJCWdvdG8gZXJyb3V0X21taW9fcmVtYXA7CisJfQorCisJLy8gc2V0dXAgZnJhbWVidWZmZXIgbWVtb3J5IC4uLiBtaWdodCBhbHJlYWR5IGJlIHJlcXVlc3RlZAorCS8vIGJ5IHZlc2FmYi4gTm90IHRvIGZhaWwgaW4gY2FzZSBvZiBhbiB1bnN1Y2Nlc3NmdWwgcmVxdWVzdAorCS8vIGlzIHVzZWZ1bCBmb3IgdGhlIGRldmVsb3BtZW50IGN5Y2xlCisJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LDApOworCWluZm8tPmZpeC5zbWVtX2xlbiA9IGdldF9tZW1zaXplKCk7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpbmZvLT5maXguc21lbV9zdGFydCwKKwkJCQlpbmZvLT5maXguc21lbV9sZW4sImN5YmxhZmIiKSkgeworCQlvdXRwdXQoInJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWQgZm9yIHNtZW0gcmVnaW9uIVxuIik7CisJCWlmICghdmVzYWZiKQorCQkJZ290byBlcnJvdXRfc21lbV9yZXE7CisJfQorCisJaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoaW5mby0+Zml4LnNtZW1fc3RhcnQsCisJCQkJCSAgICBpbmZvLT5maXguc21lbV9sZW4pOworCisJaWYgKCFpbmZvLT5zY3JlZW5fYmFzZSkgeworCQlvdXRwdXQoImlvcmVtYXAgZmFpbGVkIGZvciBzbWVtIHJlZ2lvblxuIik7CisJCWdvdG8gZXJyb3V0X3NtZW1fcmVtYXA7CisJfQorCisJZGlzcGxheXR5cGUgPSBnZXRfZGlzcGxheXR5cGUoKTsKKworCWlmKGRpc3BsYXl0eXBlID09IERJU1BMQVlfRlApCisJCW5hdGl2ZXggPSBnZXRfbmF0aXZleCgpOworCisJLy8KKwkvLyBGQklORk9fSFdBQ0NFTF9ZV1JBUCAgICAuLi4uIGRvZXMgbm90IHdvcmsgKGNvdWxkIGJlIG1hZGUgdG8gd29yaz8pCisJLy8gRkJJTkZPX1BBUlRJQUxfUEFOX09LICAgLi4uLiBpcyBub3Qgb2sKKwkvLyBGQklORk9fUkVBRFNfRkFTVAkgICAuLi4uIGlzIG5lY2Vzc2FyeSBmb3Igb3B0aW1hbCBzY3JvbGxpbmcKKwkvLworCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQgfCBGQklORk9fSFdBQ0NFTF9ZUEFOCisJCSAgICAgIHwgRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEgfCBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVAorCQkgICAgICB8IEZCSU5GT19IV0FDQ0VMX0lNQUdFQkxJVCB8IEZCSU5GT19SRUFEU19GQVNUOworCisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYXItPnBzZXVkb19wYWw7CisKKwlpZihnZXRzdGFydHVwbW9kZShpbmZvKSkKKwkJZ290byBlcnJvdXRfZmluZG1vZGU7CisKKwlmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLDI1NiwwKTsKKworCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSkgeworCQlvdXRwdXQoIkNvdWxkIG5vdCByZWdpc3RlciBDeUJsYSBmcmFtZWJ1ZmZlclxuIik7CisJCWdvdG8gZXJyb3V0X3JlZ2lzdGVyOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsaW5mbyk7CisKKwkvLworCS8vIG5vcm1hbCBleGl0IGFuZCBlcnJvciBwYXRocworCS8vCisKKwlyZXR1cm4gMDsKKworIGVycm91dF9yZWdpc3RlcjoKKyBlcnJvdXRfZmluZG1vZGU6CisJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CisgZXJyb3V0X3NtZW1fcmVtYXA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPmZpeC5zbWVtX3N0YXJ0LAorCQkJICAgaW5mby0+Zml4LnNtZW1fbGVuKTsKKyBlcnJvdXRfc21lbV9yZXE6CisJaW91bm1hcChpb192aXJ0KTsKKyBlcnJvdXRfbW1pb19yZW1hcDoKKwlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4Lm1taW9fc3RhcnQsCisJCQkgICBpbmZvLT5maXgubW1pb19sZW4pOworIGVycm91dF9tbWlvX3JlcW1lbToKKy8vCXJlbGVhc2VfcmVnaW9uKDB4M2MwLDMyKTsKKyBlcnJvdXRfZW5hYmxlOgorCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisgZXJyb3V0X2FsbG9jOgorCW91dHB1dCgiQ3libGFGQiB2ZXJzaW9uICVzIGFib3J0aW5nIGluaXQuXG4iLFZFUlNJT04pOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY3libGFfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCWlvdW5tYXAoaW9fdmlydCk7CisJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPmZpeC5zbWVtX3N0YXJ0LGluZm8tPmZpeC5zbWVtX2xlbik7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPmZpeC5tbWlvX3N0YXJ0LGluZm8tPmZpeC5tbWlvX2xlbik7CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCW91dHB1dCgiQ3libGFGQiB2ZXJzaW9uICVzIG5vcm1hbCBleGl0LlxuIixWRVJTSU9OKTsKK30KKworLy8KKy8vIExpc3Qgb2YgYm9hcmRzIHRoYXQgd2UgYXJlIHRyeWluZyB0byBzdXBwb3J0CisvLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGN5YmxhX2RldmljZXNbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9UUklERU5ULENZQkVSQkxBREVpMSxQQ0lfQU5ZX0lELFBDSV9BTllfSUQsMCwwLDB9LAorCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLGN5YmxhX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY3libGFmYl9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJjeWJsYWZiIiwKKwkuaWRfdGFibGUJPSBjeWJsYV9kZXZpY2VzLAorCS5wcm9iZQkJPSBjeWJsYV9wY2lfcHJvYmUsCisJLnJlbW92ZSAJPSBfX2RldmV4aXRfcChjeWJsYV9wY2lfcmVtb3ZlKQorfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8ga2VybmVsIGNvbW1hbmQgbGluZSBleGFtcGxlOgorLy8KKy8vCXZpZGVvPWN5YmxhZmI6MTI4MHgxMDI0LGJwcD0xNixyZWY9NTAgLi4uCisvLworLy8gbW9kcHJvYmUgY29tbWFuZCBsaW5lIGV4YW1wbGU6CisvLworLy8JbW9kcHJvYmUgY3libGFmYiBtb2RlPTEyODB4MTAyNCBicHA9MTYgcmVmPTUwIC4uLgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjeWJsYWZiX2luaXQodm9pZCkKK3sKKyNpZm5kZWYgTU9EVUxFCisJY2hhciAqb3B0aW9ucyA9IE5VTEw7CisJY2hhciAqb3B0OworCisJaWYgKGZiX2dldF9vcHRpb25zKCJjeWJsYWZiIiwmb3B0aW9ucykpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKG9wdGlvbnMgJiYgKm9wdGlvbnMpCisJCXdoaWxlKChvcHQgPSBzdHJzZXAoJm9wdGlvbnMsIiwiKSkgIT0gTlVMTCApIHsKKwkJCWlmICghKm9wdCkgY29udGludWU7CisJCQllbHNlIGlmICghc3RybmNtcChvcHQsImJwcD0iLDQpKQorCQkJCWJwcCA9IHNpbXBsZV9zdHJ0b3VsKG9wdCs0LE5VTEwsMCk7CisJCQllbHNlIGlmICghc3RybmNtcChvcHQsInJlZj0iLDQpKQorCQkJCXJlZiA9IHNpbXBsZV9zdHJ0b3VsKG9wdCs0LE5VTEwsMCk7CisJCQllbHNlIGlmICghc3RybmNtcChvcHQsImZwIiwyKSkKKwkJCQlkaXNwbGF5dHlwZSA9IERJU1BMQVlfRlA7CisJCQllbHNlIGlmICghc3RybmNtcChvcHQsImNydCIsMykpCisJCQkJZGlzcGxheXR5cGUgPSBESVNQTEFZX0NSVDsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwibmF0aXZleD0iLDgpKQorCQkJCW5hdGl2ZXggPSBzaW1wbGVfc3RydG91bChvcHQrOCxOVUxMLDApOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJjZW50ZXIiLDYpKQorCQkJCWNlbnRlciA9IDE7CisJCQllbHNlIGlmICghc3RybmNtcChvcHQsInN0cmV0Y2giLDcpKQorCQkJCXN0cmV0Y2ggPSAxOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJwY2l3Yj0iLDYpKQorCQkJCXBjaXdiID0gc2ltcGxlX3N0cnRvdWwob3B0KzYsTlVMTCwwKTsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwicGNpcmI9Iiw2KSkKKwkJCQlwY2lyYiA9IHNpbXBsZV9zdHJ0b3VsKG9wdCs2LE5VTEwsMCk7CisJCQllbHNlIGlmICghc3RybmNtcChvcHQsInBjaXdyPSIsNikpCisJCQkJcGNpd3IgPSBzaW1wbGVfc3RydG91bChvcHQrNixOVUxMLDApOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJwY2lycj0iLDYpKQorCQkJCXBjaXJyID0gc2ltcGxlX3N0cnRvdWwob3B0KzYsTlVMTCwwKTsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwibWVtc2l6ZT0iLDgpKQorCQkJCW1lbXNpemUgPSBzaW1wbGVfc3RydG91bChvcHQrOCxOVUxMLDApOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJ2ZXJib3NpdHk9IiwxMCkpCisJCQkJdmVyYm9zaXR5ID0gc2ltcGxlX3N0cnRvdWwob3B0KzEwLE5VTEwsMCk7CisJCQllbHNlIGlmICghc3RybmNtcChvcHQsInZlc2FmYiIsNikpCisJCQkJdmVzYWZiID0gMTsKKwkJCWVsc2UKKwkJCQltb2RlID0gb3B0OworCQl9CisjZW5kaWYKKwlvdXRwdXQoIkN5YmxhRkIgdmVyc2lvbiAlcyBpbml0aWFsaXppbmdcbiIsVkVSU0lPTik7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmY3libGFmYl9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGN5YmxhZmJfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY3libGFmYl9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY3libGFmYl9pbml0KTsKK21vZHVsZV9leGl0KGN5YmxhZmJfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIktudXQgUGV0ZXJzZW4gPGtudXRfcGV0ZXJzZW5AdC1vbmxpbmUuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZyYW1lYnVmZmVyIGRyaXZlciBmb3IgQ3liZXJibGFkZS9pMSBncmFwaGljcyBjb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZiY3Z0LmMgYi9kcml2ZXJzL3ZpZGVvL2ZiY3Z0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhNjFiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJjdnQuYwpAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvdmlkZW8vZmJjdnQuYyAtIFZFU0EoVE0pIENvb3JkaW5hdGVkIFZpZGVvIFRpbWluZ3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQW50b25pbm8gRGFwbGFzIDxhZGFwbGFzQHBvbC5uZXQ+CisgKgorICogICAgICBCYXNlZCBmcm9tIHRoZSBWRVNBKFRNKSBDb29yZGluYXRlZCBWaWRlbyBUaW1pbmcgR2VuZXJhdG9yIGJ5CisgKiAgICAgIEdyYWhhbSBMb3ZlcmlkZ2UgQXByaWwgOSwgMjAwMyBhdmFpbGFibGUgYXQKKyAqICAgICAgaHR0cDovL3d3dy52ZXNhLm9yZy9wdWJsaWMvQ1ZUL0NWVGQ2cjEueGxzCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgRkJfQ1ZUX0NFTExTSVpFICAgICAgICAgICAgICAgOAorI2RlZmluZSBGQl9DVlRfR1RGX0MgICAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIEZCX0NWVF9HVEZfSiAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgRkJfQ1ZUX0dURl9LICAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBGQl9DVlRfR1RGX00gICAgICAgICAgICAgICAgNjAwCisjZGVmaW5lIEZCX0NWVF9NSU5fVlNZTkNfQlAgICAgICAgICA1NTAKKyNkZWZpbmUgRkJfQ1ZUX01JTl9WUE9SQ0ggICAgICAgICAgICAgMworI2RlZmluZSBGQl9DVlRfTUlOX0JQT1JDSCAgICAgICAgICAgICA2CisKKyNkZWZpbmUgRkJfQ1ZUX1JCX01JTl9WQkxBTksgICAgICAgIDQ2MAorI2RlZmluZSBGQl9DVlRfUkJfSEJMQU5LICAgICAgICAgICAgMTYwCisjZGVmaW5lIEZCX0NWVF9SQl9WX0ZQT1JDSCAgICAgICAgICAgIDMKKworI2RlZmluZSBGQl9DVlRfRkxBR19SRURVQ0VEX0JMQU5LIDEKKyNkZWZpbmUgRkJfQ1ZUX0ZMQUdfTUFSR0lOUyAgICAgICAyCisjZGVmaW5lIEZCX0NWVF9GTEFHX0lOVEVSTEFDRUQgICAgNAorCitzdHJ1Y3QgZmJfY3Z0X2RhdGEgeworCXUzMiB4cmVzOworCXUzMiB5cmVzOworCXUzMiByZWZyZXNoOworCXUzMiBmX3JlZnJlc2g7CisJdTMyIHBpeGNsb2NrOworCXUzMiBocGVyaW9kOworCXUzMiBoYmxhbms7CisJdTMyIGhmcmVxOworCXUzMiBodG90YWw7CisJdTMyIHZ0b3RhbDsKKwl1MzIgdnN5bmM7CisJdTMyIGhzeW5jOworCXUzMiBoX2Zyb250X3BvcmNoOworCXUzMiBoX2JhY2tfcG9yY2g7CisJdTMyIHZfZnJvbnRfcG9yY2g7CisJdTMyIHZfYmFja19wb3JjaDsKKwl1MzIgaF9tYXJnaW47CisJdTMyIHZfbWFyZ2luOworCXUzMiBpbnRlcmxhY2U7CisJdTMyIGFzcGVjdF9yYXRpbzsKKwl1MzIgYWN0aXZlX3BpeGVsczsKKwl1MzIgZmxhZ3M7CisJdTMyIHN0YXR1czsKK307CisKK3N0YXRpYyBpbnQgZmJfY3Z0X3ZiaV90YWJbXSA9IHsKKwk0LCAgICAgICAgLyogNDozICAgICAgKi8KKwk1LCAgICAgICAgLyogMTY6OSAgICAgKi8KKwk2LCAgICAgICAgLyogMTY6MTAgICAgKi8KKwk3LCAgICAgICAgLyogNTo0ICAgICAgKi8KKwk3LCAgICAgICAgLyogMTU6OSAgICAgKi8KKwk4LCAgICAgICAgLyogcmVzZXJ2ZWQgKi8KKwk5LCAgICAgICAgLyogcmVzZXJ2ZWQgKi8KKwkxMCAgICAgICAgLyogY3VzdG9tICAgKi8KK307CisKKy8qIHJldHVybnMgaHBlcmlvZCAqIDEwMDAgKi8KK3N0YXRpYyB1MzIgZmJfY3Z0X2hwZXJpb2Qoc3RydWN0IGZiX2N2dF9kYXRhICpjdnQpCit7CisJdTMyIG51bSA9IDEwMDAwMDAwMDAvY3Z0LT5mX3JlZnJlc2g7CisJdTMyIGRlbjsKKworCWlmIChjdnQtPmZsYWdzICYgRkJfQ1ZUX0ZMQUdfUkVEVUNFRF9CTEFOSykgeworCQludW0gLT0gRkJfQ1ZUX1JCX01JTl9WQkxBTksgKiAxMDAwOworCQlkZW4gPSAyICogKGN2dC0+eXJlcy9jdnQtPmludGVybGFjZSArIDIgKiBjdnQtPnZfbWFyZ2luKTsKKwl9IGVsc2UgeworCQludW0gLT0gRkJfQ1ZUX01JTl9WU1lOQ19CUCAqIDEwMDA7CisJCWRlbiA9IDIgKiAoY3Z0LT55cmVzL2N2dC0+aW50ZXJsYWNlICsgY3Z0LT52X21hcmdpbiAqIDIKKwkJCSAgICsgRkJfQ1ZUX01JTl9WUE9SQ0ggKyBjdnQtPmludGVybGFjZS8yKTsKKwl9CisKKwlyZXR1cm4gMiAqIChudW0vZGVuKTsKK30KKworLyogcmV0dXJucyBpZGVhbCBkdXR5IGN5Y2xlICogMTAwMCAqLworc3RhdGljIHUzMiBmYl9jdnRfaWRlYWxfZHV0eV9jeWNsZShzdHJ1Y3QgZmJfY3Z0X2RhdGEgKmN2dCkKK3sKKwl1MzIgY19wcmltZSA9IChGQl9DVlRfR1RGX0MgLSBGQl9DVlRfR1RGX0opICoKKwkJKEZCX0NWVF9HVEZfSykgKyAyNTYgKiBGQl9DVlRfR1RGX0o7CisJdTMyIG1fcHJpbWUgPSAoRkJfQ1ZUX0dURl9LICogRkJfQ1ZUX0dURl9NKTsKKwl1MzIgaF9wZXJpb2RfZXN0ID0gY3Z0LT5ocGVyaW9kOworCisJcmV0dXJuICgxMDAwICogY19wcmltZSAgLSAoKG1fcHJpbWUgKiBoX3BlcmlvZF9lc3QpLzEwMDApKS8yNTY7Cit9CisKK3N0YXRpYyB1MzIgZmJfY3Z0X2hibGFuayhzdHJ1Y3QgZmJfY3Z0X2RhdGEgKmN2dCkKK3sKKwl1MzIgaGJsYW5rID0gMDsKKworCWlmIChjdnQtPmZsYWdzICYgRkJfQ1ZUX0ZMQUdfUkVEVUNFRF9CTEFOSykKKwkJaGJsYW5rID0gRkJfQ1ZUX1JCX0hCTEFOSzsKKwllbHNlIHsKKwkJdTMyIGlkZWFsX2R1dHlfY3ljbGUgPSBmYl9jdnRfaWRlYWxfZHV0eV9jeWNsZShjdnQpOworCQl1MzIgYWN0aXZlX3BpeGVscyA9IGN2dC0+YWN0aXZlX3BpeGVsczsKKworCQlpZiAoaWRlYWxfZHV0eV9jeWNsZSA8IDIwMDAwKQorCQkJaGJsYW5rID0gKGFjdGl2ZV9waXhlbHMgKiAyMDAwMCkvCisJCQkJKDEwMDAwMCAtIDIwMDAwKTsKKwkJZWxzZSB7CisJCQloYmxhbmsgPSAoYWN0aXZlX3BpeGVscyAqIGlkZWFsX2R1dHlfY3ljbGUpLworCQkJCSgxMDAwMDAgLSBpZGVhbF9kdXR5X2N5Y2xlKTsKKwkJfQorCX0KKworCWhibGFuayAmPSB+KCgyICogRkJfQ1ZUX0NFTExTSVpFKSAtIDEpOworCisJcmV0dXJuIGhibGFuazsKK30KKworc3RhdGljIHUzMiBmYl9jdnRfaHN5bmMoc3RydWN0IGZiX2N2dF9kYXRhICpjdnQpCit7CisJdTMyIGhzeW5jOworCisJaWYgKGN2dC0+ZmxhZ3MgJiBGQl9DVlRfRkxBR19SRURVQ0VEX0JMQU5LKQorCQloc3luYyA9IDMyOworCWVsc2UKKwkJaHN5bmMgPSAoRkJfQ1ZUX0NFTExTSVpFICogY3Z0LT5odG90YWwpLzEwMDsKKworCWhzeW5jICY9IH4oRkJfQ1ZUX0NFTExTSVpFIC0gMSk7CisJcmV0dXJuIGhzeW5jOworfQorCitzdGF0aWMgdTMyIGZiX2N2dF92YmlfbGluZXMoc3RydWN0IGZiX2N2dF9kYXRhICpjdnQpCit7CisJdTMyIHZiaV9saW5lcywgbWluX3ZiaV9saW5lcywgYWN0X3ZiaV9saW5lczsKKworCWlmIChjdnQtPmZsYWdzICYgRkJfQ1ZUX0ZMQUdfUkVEVUNFRF9CTEFOSykgeworCQl2YmlfbGluZXMgPSAoMTAwMCAqIEZCX0NWVF9SQl9NSU5fVkJMQU5LKS9jdnQtPmhwZXJpb2QgKyAxOworCQltaW5fdmJpX2xpbmVzID0gIEZCX0NWVF9SQl9WX0ZQT1JDSCArIGN2dC0+dnN5bmMgKworCQkJRkJfQ1ZUX01JTl9CUE9SQ0g7CisKKwl9IGVsc2UgeworCQl2YmlfbGluZXMgPSAoRkJfQ1ZUX01JTl9WU1lOQ19CUCAqIDEwMDApL2N2dC0+aHBlcmlvZCArIDEgKworCQkJIEZCX0NWVF9NSU5fVlBPUkNIOworCQltaW5fdmJpX2xpbmVzID0gY3Z0LT52c3luYyArIEZCX0NWVF9NSU5fQlBPUkNIICsKKwkJCUZCX0NWVF9NSU5fVlBPUkNIOworCX0KKworCWlmICh2YmlfbGluZXMgPCBtaW5fdmJpX2xpbmVzKQorCQlhY3RfdmJpX2xpbmVzID0gbWluX3ZiaV9saW5lczsKKwllbHNlCisJCWFjdF92YmlfbGluZXMgPSB2YmlfbGluZXM7CisKKwlyZXR1cm4gYWN0X3ZiaV9saW5lczsKK30KKworc3RhdGljIHUzMiBmYl9jdnRfdnRvdGFsKHN0cnVjdCBmYl9jdnRfZGF0YSAqY3Z0KQoreworCXUzMiB2dG90YWwgPSBjdnQtPnlyZXMvY3Z0LT5pbnRlcmxhY2U7CisKKwl2dG90YWwgKz0gMiAqIGN2dC0+dl9tYXJnaW4gKyBjdnQtPmludGVybGFjZS8yICsgZmJfY3Z0X3ZiaV9saW5lcyhjdnQpOworCXZ0b3RhbCB8PSBjdnQtPmludGVybGFjZS8yOworCisJcmV0dXJuIHZ0b3RhbDsKK30KKworc3RhdGljIHUzMiBmYl9jdnRfcGl4Y2xvY2soc3RydWN0IGZiX2N2dF9kYXRhICpjdnQpCit7CisJdTMyIHBpeGNsb2NrOworCisJaWYgKGN2dC0+ZmxhZ3MgJiBGQl9DVlRfRkxBR19SRURVQ0VEX0JMQU5LKQorCQlwaXhjbG9jayA9IChjdnQtPmZfcmVmcmVzaCAqIGN2dC0+dnRvdGFsICogY3Z0LT5odG90YWwpLzEwMDA7CisJZWxzZQorCQlwaXhjbG9jayA9IChjdnQtPmh0b3RhbCAqIDEwMDAwMDApL2N2dC0+aHBlcmlvZDsKKworCXBpeGNsb2NrIC89IDI1MDsKKwlwaXhjbG9jayAqPSAyNTA7CisJcGl4Y2xvY2sgKj0gMTAwMDsKKworCXJldHVybiBwaXhjbG9jazsKK30KKworc3RhdGljIHUzMiBmYl9jdnRfYXNwZWN0X3JhdGlvKHN0cnVjdCBmYl9jdnRfZGF0YSAqY3Z0KQoreworCXUzMiB4cmVzID0gY3Z0LT54cmVzOworCXUzMiB5cmVzID0gY3Z0LT55cmVzOworCXUzMiBhc3BlY3QgPSAtMTsKKworCWlmICh4cmVzID09ICh5cmVzICogNCkvMyAmJiAhKCh5cmVzICogNCkgJSAzKSkKKwkJYXNwZWN0ID0gMDsKKwllbHNlIGlmICh4cmVzID09ICh5cmVzICogMTYpLzkgJiYgISgoeXJlcyAqIDE2KSAlIDkpKQorCQlhc3BlY3QgPSAxOworCWVsc2UgaWYgKHhyZXMgPT0gKHlyZXMgKiAxNikvMTAgJiYgISgoeXJlcyAqIDE2KSAlIDEwKSkKKwkJYXNwZWN0ID0gMjsKKwllbHNlIGlmICh4cmVzID09ICh5cmVzICogNSkvNCAmJiAhKCh5cmVzICogNSkgJSA0KSkKKwkJYXNwZWN0ID0gMzsKKwllbHNlIGlmICh4cmVzID09ICh5cmVzICogMTUpLzkgJiYgISgoeXJlcyAqIDE1KSAlIDkpKQorCQlhc3BlY3QgPSA0OworCWVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJmYmN2dDogQXNwZWN0IHJhdGlvIG5vdCBDVlQgIgorCQkgICAgICAgInN0YW5kYXJkXG4iKTsKKwkJYXNwZWN0ID0gNzsKKwkJY3Z0LT5zdGF0dXMgPSAxOworCX0KKworCXJldHVybiBhc3BlY3Q7Cit9CisKK3N0YXRpYyB2b2lkIGZiX2N2dF9wcmludF9uYW1lKHN0cnVjdCBmYl9jdnRfZGF0YSAqY3Z0KQoreworCXUzMiBwaXhjb3VudCwgcGl4Y291bnRfbW9kOworCWludCBjbnQgPSAyNTUsIG9mZnNldCA9IDAsIHJlYWQgPSAwOworCXU4ICpidWYgPSBrbWFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJbWVtc2V0KGJ1ZiwgMCwgMjU2KTsKKwlwaXhjb3VudCA9IChjdnQtPnhyZXMgKiAoY3Z0LT55cmVzL2N2dC0+aW50ZXJsYWNlKSkvMTAwMDAwMDsKKwlwaXhjb3VudF9tb2QgPSAoY3Z0LT54cmVzICogKGN2dC0+eXJlcy9jdnQtPmludGVybGFjZSkpICUgMTAwMDAwMDsKKwlwaXhjb3VudF9tb2QgLz0gMTAwMDsKKworCXJlYWQgPSBzbnByaW50ZihidWYrb2Zmc2V0LCBjbnQsICJmYmN2dDogJWR4JWRAJWQ6IENWVCBOYW1lIC0gIiwKKwkJCWN2dC0+eHJlcywgY3Z0LT55cmVzLCBjdnQtPnJlZnJlc2gpOworCW9mZnNldCArPSByZWFkOworCWNudCAtPSByZWFkOworCisJaWYgKGN2dC0+c3RhdHVzKQorCQlzbnByaW50ZihidWYrb2Zmc2V0LCBjbnQsICJOb3QgYSBDVlQgc3RhbmRhcmQgLSAlZC4lMDNkIE1lZ2EgIgorCQkJICJQaXhlbCBJbWFnZVxuIiwgcGl4Y291bnQsIHBpeGNvdW50X21vZCk7CisJZWxzZSB7CisJCWlmIChwaXhjb3VudCkgeworCQkJcmVhZCA9IHNucHJpbnRmKGJ1ZitvZmZzZXQsIGNudCwgIiVkIiwgcGl4Y291bnQpOworCQkJY250IC09IHJlYWQ7CisJCQlvZmZzZXQgKz0gcmVhZDsKKwkJfQorCisJCXJlYWQgPSBzbnByaW50ZihidWYrb2Zmc2V0LCBjbnQsICIuJTAzZE0iLCBwaXhjb3VudF9tb2QpOworCQljbnQgLT0gcmVhZDsKKwkJb2Zmc2V0ICs9IHJlYWQ7CisKKwkJaWYgKGN2dC0+YXNwZWN0X3JhdGlvID09IDApCisJCQlyZWFkID0gc25wcmludGYoYnVmK29mZnNldCwgY250LCAiMyIpOworCQllbHNlIGlmIChjdnQtPmFzcGVjdF9yYXRpbyA9PSAzKQorCQkJcmVhZCA9IHNucHJpbnRmKGJ1ZitvZmZzZXQsIGNudCwgIjQiKTsKKwkJZWxzZSBpZiAoY3Z0LT5hc3BlY3RfcmF0aW8gPT0gMSB8fCBjdnQtPmFzcGVjdF9yYXRpbyA9PSA0KQorCQkJcmVhZCA9IHNucHJpbnRmKGJ1ZitvZmZzZXQsIGNudCwgIjkiKTsKKwkJZWxzZSBpZiAoY3Z0LT5hc3BlY3RfcmF0aW8gPT0gMikKKwkJCXJlYWQgPSBzbnByaW50ZihidWYrb2Zmc2V0LCBjbnQsICJBIik7CisJCWVsc2UKKwkJCXJlYWQgPSAwOworCQljbnQgLT0gcmVhZDsKKwkJb2Zmc2V0ICs9IHJlYWQ7CisKKwkJaWYgKGN2dC0+ZmxhZ3MgJiBGQl9DVlRfRkxBR19SRURVQ0VEX0JMQU5LKSB7CisJCQlyZWFkID0gc25wcmludGYoYnVmK29mZnNldCwgY250LCAiLVIiKTsKKwkJCWNudCAtPSByZWFkOworCQkJb2Zmc2V0ICs9IHJlYWQ7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgYnVmKTsKKwlrZnJlZShidWYpOworfQorCitzdGF0aWMgdm9pZCBmYl9jdnRfY29udmVydF90b19tb2RlKHN0cnVjdCBmYl9jdnRfZGF0YSAqY3Z0LAorCQkJCSAgIHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUpCit7CisJbW9kZS0+cmVmcmVzaCA9IGN2dC0+Zl9yZWZyZXNoOworCW1vZGUtPnBpeGNsb2NrID0gS0haMlBJQ09TKGN2dC0+cGl4Y2xvY2svMTAwMCk7CisJbW9kZS0+bGVmdF9tYXJnaW4gPSBjdnQtPmhfZnJvbnRfcG9yY2g7CisJbW9kZS0+cmlnaHRfbWFyZ2luID0gY3Z0LT5oX2JhY2tfcG9yY2g7CisJbW9kZS0+aHN5bmNfbGVuID0gY3Z0LT5oc3luYzsKKwltb2RlLT51cHBlcl9tYXJnaW4gPSBjdnQtPnZfZnJvbnRfcG9yY2g7CisJbW9kZS0+bG93ZXJfbWFyZ2luID0gY3Z0LT52X2JhY2tfcG9yY2g7CisJbW9kZS0+dnN5bmNfbGVuID0gY3Z0LT52c3luYzsKKworCW1vZGUtPnN5bmMgJj0gfihGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCk7CisKKwlpZiAoY3Z0LT5mbGFncyAmIEZCX0NWVF9GTEFHX1JFRFVDRURfQkxBTkspCisJCW1vZGUtPnN5bmMgfD0gRkJfU1lOQ19IT1JfSElHSF9BQ1Q7CisJZWxzZQorCQltb2RlLT5zeW5jIHw9IEZCX1NZTkNfVkVSVF9ISUdIX0FDVDsKK30KKworLyoKKyAqIGZiX2ZpbmRfbW9kZV9jdnQgLSBjYWxjdWxhdGUgbW9kZSB1c2luZyBWRVNBKFRNKSBDVlQKKyAqIEBtb2RlOiBwb2ludGVyIHRvIGZiX3ZpZGVvbW9kZTsgeHJlcywgeXJlcywgcmVmcmVzaCBhbmQgdm1vZGUgbXVzdCBiZQorICogICAgICAgIHByZS1maWxsZWQgd2l0aCB0aGUgZGVzaXJlZCB2YWx1ZXMKKyAqIEBtYXJnaW5zOiBhZGQgbWFyZ2luIHRvIGNhbGN1bGF0aW9uICgxLjglIG9mIHhyZXMgYW5kIHlyZXMpCisgKiBAcmI6IGNvbXB1dGUgd2l0aCByZWR1Y2VkIGJsYW5raW5nIChmb3IgZmxhdHBhbmVscykKKyAqCisgKiBSRVRVUk5TOgorICogMCBmb3Igc3VjY2VzcworICogQG1vZGUgaXMgZmlsbGVkIHdpdGggY29tcHV0ZWQgdmFsdWVzLiAgSWYgaW50ZXJsYWNlZCwgdGhlIHJlZnJlc2ggZmllbGQKKyAqIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGZpZWxkIHJhdGUgKDJ4IHRoZSBmcmFtZSByYXRlKQorICoKKyAqIERFU0NSSVBUSU9OOgorICogQ29tcHV0ZXMgdmlkZW8gdGltaW5ncyB1c2luZyBWRVNBKFRNKSBDb29yZGluYXRlZCBWaWRlbyBUaW1pbmdzCisgKi8KK2ludCBmYl9maW5kX21vZGVfY3Z0KHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUsIGludCBtYXJnaW5zLCBpbnQgcmIpCit7CisJc3RydWN0IGZiX2N2dF9kYXRhIGN2dDsKKworCW1lbXNldCgmY3Z0LCAwLCBzaXplb2YoY3Z0KSk7CisKKwlpZiAobWFyZ2lucykKKwkgICAgY3Z0LmZsYWdzIHw9IEZCX0NWVF9GTEFHX01BUkdJTlM7CisKKwlpZiAocmIpCisJICAgIGN2dC5mbGFncyB8PSBGQl9DVlRfRkxBR19SRURVQ0VEX0JMQU5LOworCisJaWYgKG1vZGUtPnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCkKKwkgICAgY3Z0LmZsYWdzIHw9IEZCX0NWVF9GTEFHX0lOVEVSTEFDRUQ7CisKKwljdnQueHJlcyA9IG1vZGUtPnhyZXM7CisJY3Z0LnlyZXMgPSBtb2RlLT55cmVzOworCWN2dC5yZWZyZXNoID0gbW9kZS0+cmVmcmVzaDsKKwljdnQuZl9yZWZyZXNoID0gY3Z0LnJlZnJlc2g7CisJY3Z0LmludGVybGFjZSA9IDE7CisKKwlpZiAoIWN2dC54cmVzIHx8ICFjdnQueXJlcyB8fCAhY3Z0LnJlZnJlc2gpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZmJjdnQ6IEludmFsaWQgaW5wdXQgcGFyYW1ldGVyc1xuIik7CisJCXJldHVybiAxOworCX0KKworCWlmICghKGN2dC5yZWZyZXNoID09IDUwIHx8IGN2dC5yZWZyZXNoID09IDYwIHx8IGN2dC5yZWZyZXNoID09IDcwIHx8CisJICAgICAgY3Z0LnJlZnJlc2ggPT0gODUpKSB7CisJCXByaW50ayhLRVJOX0lORk8gImZiY3Z0OiBSZWZyZXNoIHJhdGUgbm90IENWVCAiCisJCSAgICAgICAic3RhbmRhcmRcbiIpOworCQljdnQuc3RhdHVzID0gMTsKKwl9CisKKwljdnQueHJlcyAmPSB+KEZCX0NWVF9DRUxMU0laRSAtIDEpOworCisJaWYgKGN2dC5mbGFncyAmIEZCX0NWVF9GTEFHX0lOVEVSTEFDRUQpIHsKKwkJY3Z0LmludGVybGFjZSA9IDI7CisJCWN2dC5mX3JlZnJlc2ggKj0gMjsKKwl9CisKKwlpZiAoY3Z0LmZsYWdzICYgRkJfQ1ZUX0ZMQUdfUkVEVUNFRF9CTEFOSykgeworCQlpZiAoY3Z0LnJlZnJlc2ggIT0gNjApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImZiY3Z0OiA2MEh6IHJlZnJlc2ggcmF0ZSAiCisJCQkgICAgICAgImFkdmlzZWQgZm9yIHJlZHVjZWQgYmxhbmtpbmdcbiIpOworCQkJY3Z0LnN0YXR1cyA9IDE7CisJCX0KKwl9CisKKwlpZiAoY3Z0LmZsYWdzICYgRkJfQ1ZUX0ZMQUdfTUFSR0lOUykgeworCQljdnQuaF9tYXJnaW4gPSAoY3Z0LnhyZXMgKiAxOCkvMTAwMDsKKwkJY3Z0LmhfbWFyZ2luICY9IH4oRkJfQ1ZUX0NFTExTSVpFIC0gMSk7CisJCWN2dC52X21hcmdpbiA9ICgoY3Z0LnlyZXMvY3Z0LmludGVybGFjZSkqIDE4KS8xMDAwOworCX0KKworCWN2dC5hc3BlY3RfcmF0aW8gPSBmYl9jdnRfYXNwZWN0X3JhdGlvKCZjdnQpOworCWN2dC5hY3RpdmVfcGl4ZWxzID0gY3Z0LnhyZXMgKyAyICogY3Z0LmhfbWFyZ2luOworCWN2dC5ocGVyaW9kID0gZmJfY3Z0X2hwZXJpb2QoJmN2dCk7CisJY3Z0LnZzeW5jID0gZmJfY3Z0X3ZiaV90YWJbY3Z0LmFzcGVjdF9yYXRpb107CisJY3Z0LnZ0b3RhbCA9IGZiX2N2dF92dG90YWwoJmN2dCk7CisJY3Z0LmhibGFuayA9IGZiX2N2dF9oYmxhbmsoJmN2dCk7CisJY3Z0Lmh0b3RhbCA9IGN2dC5hY3RpdmVfcGl4ZWxzICsgY3Z0LmhibGFuazsKKwljdnQuaHN5bmMgPSBmYl9jdnRfaHN5bmMoJmN2dCk7CisJY3Z0LnBpeGNsb2NrID0gZmJfY3Z0X3BpeGNsb2NrKCZjdnQpOworCWN2dC5oZnJlcSA9IGN2dC5waXhjbG9jay9jdnQuaHRvdGFsOworCWN2dC5oX2JhY2tfcG9yY2ggPSBjdnQuaGJsYW5rLzIgKyBjdnQuaF9tYXJnaW47CisJY3Z0LmhfZnJvbnRfcG9yY2ggPSBjdnQuaGJsYW5rIC0gY3Z0LmhzeW5jIC0gY3Z0LmhfYmFja19wb3JjaCArCisJCTIgKiBjdnQuaF9tYXJnaW47CisJY3Z0LnZfYmFja19wb3JjaCA9IDMgKyBjdnQudl9tYXJnaW47CisJY3Z0LnZfZnJvbnRfcG9yY2ggPSBjdnQudnRvdGFsIC0gY3Z0LnlyZXMvY3Z0LmludGVybGFjZSAtCisJICAgIGN2dC52X2JhY2tfcG9yY2ggLSBjdnQudnN5bmM7CisJZmJfY3Z0X3ByaW50X25hbWUoJmN2dCk7CisJZmJfY3Z0X2NvbnZlcnRfdG9fbW9kZSgmY3Z0LCBtb2RlKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmYl9maW5kX21vZGVfY3Z0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJtZW0uYyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwppbmRleCA0ZmY4NTNmLi43MGJlNzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKKysrIGIvZHJpdmVycy92aWRlby9mYm1lbS5jCkBAIC02MiwxNiArNjIsMjYgQEAKICAqIEhlbHBlcnMKICAqLwogCi1pbnQgZmJfZ2V0X2NvbG9yX2RlcHRoKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQoraW50IGZiX2dldF9jb2xvcl9kZXB0aChzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJICAgICAgIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4KQogewotCWlmICh2YXItPmdyZWVuLmxlbmd0aCA9PSB2YXItPmJsdWUubGVuZ3RoICYmCi0JICAgIHZhci0+Z3JlZW4ubGVuZ3RoID09IHZhci0+cmVkLmxlbmd0aCAmJgotCSAgICAhdmFyLT5ncmVlbi5vZmZzZXQgJiYgIXZhci0+Ymx1ZS5vZmZzZXQgJiYKLQkgICAgIXZhci0+cmVkLm9mZnNldCkKLQkJcmV0dXJuIHZhci0+Z3JlZW4ubGVuZ3RoOwotCWVsc2UKLQkJcmV0dXJuICh2YXItPmdyZWVuLmxlbmd0aCArIHZhci0+cmVkLmxlbmd0aCArCi0JCQl2YXItPmJsdWUubGVuZ3RoKTsKKwlpbnQgZGVwdGggPSAwOworCisJaWYgKGZpeC0+dmlzdWFsID09IEZCX1ZJU1VBTF9NT05PMDEgfHwKKwkgICAgZml4LT52aXN1YWwgPT0gRkJfVklTVUFMX01PTk8xMCkKKwkJZGVwdGggPSAxOworCWVsc2UgeworCQlpZiAodmFyLT5ncmVlbi5sZW5ndGggPT0gdmFyLT5ibHVlLmxlbmd0aCAmJgorCQkgICAgdmFyLT5ncmVlbi5sZW5ndGggPT0gdmFyLT5yZWQubGVuZ3RoICYmCisJCSAgICB2YXItPmdyZWVuLm9mZnNldCA9PSB2YXItPmJsdWUub2Zmc2V0ICYmCisJCSAgICB2YXItPmdyZWVuLm9mZnNldCA9PSB2YXItPnJlZC5vZmZzZXQpCisJCQlkZXB0aCA9IHZhci0+Z3JlZW4ubGVuZ3RoOworCQllbHNlCisJCQlkZXB0aCA9IHZhci0+Z3JlZW4ubGVuZ3RoICsgdmFyLT5yZWQubGVuZ3RoICsKKwkJCQl2YXItPmJsdWUubGVuZ3RoOworCX0KKworCXJldHVybiBkZXB0aDsKIH0KIEVYUE9SVF9TWU1CT0woZmJfZ2V0X2NvbG9yX2RlcHRoKTsKIApAQCAtODAsMTUgKzkwLDcgQEAKICAqLwogdm9pZCBmYl9wYWRfYWxpZ25lZF9idWZmZXIodTggKmRzdCwgdTMyIGRfcGl0Y2gsIHU4ICpzcmMsIHUzMiBzX3BpdGNoLCB1MzIgaGVpZ2h0KQogewotCWludCBpLCBqOwotCi0JZm9yIChpID0gaGVpZ2h0OyBpLS07ICkgewotCQkvKiBzX3BpdGNoIGlzIGEgZmV3IGJ5dGVzIGF0IHRoZSBtb3N0LCBtZW1jcHkgaXMgc3Vib3B0aW1hbCAqLwotCQlmb3IgKGogPSAwOyBqIDwgc19waXRjaDsgaisrKQotCQkJZHN0W2pdID0gc3JjW2pdOwotCQlzcmMgKz0gc19waXRjaDsKLQkJZHN0ICs9IGRfcGl0Y2g7Ci0JfQorCV9fZmJfcGFkX2FsaWduZWRfYnVmZmVyKGRzdCwgZF9waXRjaCwgc3JjLCBzX3BpdGNoLCBoZWlnaHQpOwogfQogRVhQT1JUX1NZTUJPTChmYl9wYWRfYWxpZ25lZF9idWZmZXIpOwogCkBAIC0yNDksMTMgKzI1MSwxOCBAQAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvICpsb2dvLCB1OCAqZHN0LAogCQkJICAgICAgIGludCBkZXB0aCkKIHsKLQlpbnQgaSwgaiwgaywgZmcgPSAxOworCWludCBpLCBqLCBrOwogCWNvbnN0IHU4ICpzcmMgPSBsb2dvLT5kYXRhOwotCXU4IGQsIHhvciA9IChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9NT05PMDEpID8gMHhmZiA6IDA7CisJdTggeG9yID0gKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX01PTk8wMSkgPyAweGZmIDogMDsKKwl1OCBmZyA9IDEsIGQ7CiAKLQlpZiAoZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIpID09IDMpCisJaWYgKGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyLCAmaW5mby0+Zml4KSA9PSAzKQogCQlmZyA9IDc7CiAKKwlpZiAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfTU9OTzAxIHx8CisJICAgIGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX01PTk8xMCkKKwkJZmcgPSB+KCh1OCkgKDB4ZmZmIDw8IGluZm8tPnZhci5ncmVlbi5sZW5ndGgpKTsKKwogCXN3aXRjaCAoZGVwdGgpIHsKIAljYXNlIDQ6CiAJCWZvciAoaSA9IDA7IGkgPCBsb2dvLT5oZWlnaHQ7IGkrKykKQEAgLTMxOCw3ICszMjUsNyBAQAogCiBpbnQgZmJfcHJlcGFyZV9sb2dvKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCWludCBkZXB0aCA9IGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyKTsKKwlpbnQgZGVwdGggPSBmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhciwgJmluZm8tPmZpeCk7CiAKIAltZW1zZXQoJmZiX2xvZ28sIDAsIHNpemVvZihzdHJ1Y3QgbG9nb19kYXRhKSk7CiAKQEAgLTY4NCwxMSArNjkxLDEzIEBACiAKIAkJCWlmICghZXJyICYmIChmbGFncyAmIEZCSU5GT19NSVNDX1VTRVJFVkVOVCkpIHsKIAkJCQlzdHJ1Y3QgZmJfZXZlbnQgZXZlbnQ7CisJCQkJaW50IGV2bnQgPSAodmFyLT5hY3RpdmF0ZSAmIEZCX0FDVElWQVRFX0FMTCkgPworCQkJCQlGQl9FVkVOVF9NT0RFX0NIQU5HRV9BTEwgOgorCQkJCQlGQl9FVkVOVF9NT0RFX0NIQU5HRTsKIAogCQkJCWluZm8tPmZsYWdzICY9IH5GQklORk9fTUlTQ19VU0VSRVZFTlQ7CiAJCQkJZXZlbnQuaW5mbyA9IGluZm87Ci0JCQkJbm90aWZpZXJfY2FsbF9jaGFpbigmZmJfbm90aWZpZXJfbGlzdCwKLQkJCQkJCSAgICBGQl9FVkVOVF9NT0RFX0NIQU5HRSwKKwkJCQlub3RpZmllcl9jYWxsX2NoYWluKCZmYl9ub3RpZmllcl9saXN0LCBldm50LAogCQkJCQkJICAgICZldmVudCk7CiAJCQl9CiAJCX0KQEAgLTEwMTIsNiArMTAyMSw3IEBACiB7CiAJaW50IGk7CiAJc3RydWN0IGZiX2V2ZW50IGV2ZW50OworCXN0cnVjdCBmYl92aWRlb21vZGUgbW9kZTsKIAogCWlmIChudW1fcmVnaXN0ZXJlZF9mYiA9PSBGQl9NQVgpCiAJCXJldHVybiAtRU5YSU87CkBAIC0xMDQyLDE2ICsxMDUyLDExIEBACiAJfQkKIAlmYl9pbmZvLT5waXhtYXAub2Zmc2V0ID0gMDsKIAotCWlmICghZmJfaW5mby0+bW9kZWxpc3QucHJldiB8fAotCSAgICAhZmJfaW5mby0+bW9kZWxpc3QubmV4dCB8fAotCSAgICBsaXN0X2VtcHR5KCZmYl9pbmZvLT5tb2RlbGlzdCkpIHsKLQkgICAgICAgIHN0cnVjdCBmYl92aWRlb21vZGUgbW9kZTsKLQorCWlmICghZmJfaW5mby0+bW9kZWxpc3QucHJldiB8fCAhZmJfaW5mby0+bW9kZWxpc3QubmV4dCkKIAkJSU5JVF9MSVNUX0hFQUQoJmZiX2luZm8tPm1vZGVsaXN0KTsKLQkJZmJfdmFyX3RvX3ZpZGVvbW9kZSgmbW9kZSwgJmZiX2luZm8tPnZhcik7Ci0JCWZiX2FkZF92aWRlb21vZGUoJm1vZGUsICZmYl9pbmZvLT5tb2RlbGlzdCk7Ci0JfQogCisJZmJfdmFyX3RvX3ZpZGVvbW9kZSgmbW9kZSwgJmZiX2luZm8tPnZhcik7CisJZmJfYWRkX3ZpZGVvbW9kZSgmbW9kZSwgJmZiX2luZm8tPm1vZGVsaXN0KTsKIAlyZWdpc3RlcmVkX2ZiW2ldID0gZmJfaW5mbzsKIAogCWRldmZzX21rX2NkZXYoTUtERVYoRkJfTUFKT1IsIGkpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1vbi5jIGIvZHJpdmVycy92aWRlby9mYm1vbi5jCmluZGV4IGMyNzE4YmIuLjcxMzIyNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibW9uLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPHZpZGVvL2VkaWQuaD4KICNpZmRlZiBDT05GSUdfUFBDX09GCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTMxMywxMSArMzE0LDEzIEBACiAJCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjYWxjX21vZGVfdGltaW5ncyhpbnQgeHJlcywgaW50IHlyZXMsIGludCByZWZyZXNoLCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlKQorc3RhdGljIHZvaWQgY2FsY19tb2RlX3RpbWluZ3MoaW50IHhyZXMsIGludCB5cmVzLCBpbnQgcmVmcmVzaCwKKwkJCSAgICAgIHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUpCiB7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKIAlzdHJ1Y3QgZmJfaW5mbyBpbmZvOwogCQorCW1lbXNldCgmdmFyLCAwLCBzaXplb2Yoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKSk7CiAJdmFyLnhyZXMgPSB4cmVzOwogCXZhci55cmVzID0geXJlczsKIAlmYl9nZXRfbW9kZShGQl9WU1lOQ1RJTUlOR1MgfCBGQl9JR05PUkVNT04sIApAQCAtMTI1MSw5ICsxMjU0LDQxIEBACiAJCS1FSU5WQUwgOiAwOwogfQogCisjaWYgZGVmaW5lZChfX2kzODZfXykKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworLyoKKyAqIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIEVESUQgYmxvY2sgaXMgb25seSByZXR1cm5lZCBmb3IKKyAqIHRoZSBwcmltYXJ5IGdyYXBoaWNzIGFkYXB0ZXIuCisgKi8KKworY29uc3QgdW5zaWduZWQgY2hhciAqZmJfZmlybXdhcmVfZWRpZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKmVkaWQgPSBOVUxMOworCisJaWYgKGRldmljZSkKKwkJZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOworCisJaWYgKGRldikKKwkJcmVzID0gJmRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV07CisKKwlpZiAocmVzICYmIHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9TSEFET1cpCisJCWVkaWQgPSBlZGlkX2luZm8uZHVtbXk7CisKKwlyZXR1cm4gZWRpZDsKK30KKyNlbHNlCitjb25zdCB1bnNpZ25lZCBjaGFyICpmYl9maXJtd2FyZV9lZGlkKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvKiBfaTM4Nl8gKi8KKwogRVhQT1JUX1NZTUJPTChmYl9wYXJzZV9lZGlkKTsKIEVYUE9SVF9TWU1CT0woZmJfZWRpZF90b19tb25zcGVjcyk7Ci0KK0VYUE9SVF9TWU1CT0woZmJfZmlybXdhcmVfZWRpZCk7CiBFWFBPUlRfU1lNQk9MKGZiX2dldF9tb2RlKTsKIEVYUE9SVF9TWU1CT0woZmJfdmFsaWRhdGVfbW9kZSk7CiBFWFBPUlRfU1lNQk9MKGZiX2Rlc3Ryb3lfbW9kZWRiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvS2NvbmZpZwppbmRleCBiMDc1ZmQwLi41YTliODljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9LY29uZmlnCkBAIC0zLDE1ICszLDEzIEBACiAjCiBjb25maWcgRkJfR0VPREUKIAlib29sICJBTUQgR2VvZGUgZmFtaWx5IGZyYW1lYnVmZmVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVmYXVsdCBuCi0JZGVwZW5kcyBvbiBGQiAmJiBFWFBFUklNRU5UQUwgJiYgWDg2CisJZGVwZW5kcyBvbiBGQiAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMICYmIFg4NgogCS0tLWhlbHAtLS0KIAkgIFNheSAnWScgaGVyZSB0byBhbGxvdyB5b3UgdG8gc2VsZWN0IGZyYW1lYnVmZmVyIGRyaXZlcnMgZm9yCiAJICB0aGUgQU1EIEdlb2RlIGZhbWlseSBvZiBwcm9jZXNzb3JzLgogCiBjb25maWcgRkJfR0VPREVfR1gxCiAJdHJpc3RhdGUgIkFNRCBHZW9kZSBHWDEgZnJhbWVidWZmZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZWZhdWx0IG4KIAlkZXBlbmRzIG9uIEZCX0dFT0RFICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCkBAIC0yMSw5ICsxOSw3IEBACiAJICBGcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIHRoZSBkaXNwbGF5IGNvbnRyb2xsZXIgaW50ZWdyYXRlZCBpbnRvIHRoZQogCSAgQU1EIEdlb2RlIEdYMSBwcm9jZXNzb3IuCiAKLQkgIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQotCSAgaW5zZXJ0ZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLiBUaGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBneDFmYi4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwKLQkgIHNheSBNIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBneDFmYi4KIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZGlzcGxheV9neDEuYyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZGlzcGxheV9neDEuYwppbmRleCBmNDk4Mzg3Li45MjZkNTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2Rpc3BsYXlfZ3gxLmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9kaXNwbGF5X2d4MS5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSAiZ2VvZGVmYi5oIgogI2luY2x1ZGUgImRpc3BsYXlfZ3gxLmgiCiAKLXN0YXRpYyBzcGlubG9ja190IGd4MV9jb25mX3JlZ19sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhneDFfY29uZl9yZWdfbG9jayk7CiAKIHN0YXRpYyB1OCBneDFfcmVhZF9jb25mX3JlZyh1OCByZWcpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2dlb2RlZmIuaCBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ2VvZGVmYi5oCmluZGV4IGI3YmFjMGEuLmFlMDQ4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ2VvZGVmYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ2VvZGVmYi5oCkBAIC0yOSw3ICsyOSw2IEBACiAJaW50IGVuYWJsZV9jcnQ7CiAJaW50IHBhbmVsX3g7IC8qIGRpbWVuc2lvbnMgb2YgYW4gYXR0YWNoZWQgZmxhdCBwYW5lbCwgbm9uLXplcm8gPT4gZW5hYmxlIHBhbmVsICovCiAJaW50IHBhbmVsX3k7Ci0Jc3RydWN0IHBjaV9kZXYgKnZpZF9kZXY7CiAJdm9pZCBfX2lvbWVtICpkY19yZWdzOwogCXZvaWQgX19pb21lbSAqdmlkX3JlZ3M7CiAJc3RydWN0IGdlb2RlX2RjX29wcyAgKmRjX29wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKaW5kZXggODM4MzBkMi4uNzRhNWZjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKQEAgLTMwLDYgKzMwLDYyIEBACiBzdGF0aWMgaW50ICBjcnRfb3B0aW9uID0gMTsKIHN0YXRpYyBjaGFyIHBhbmVsX29wdGlvblszMl0gPSAiIjsKIAorLyogTW9kZXMgcmVsZXZhbnQgdG8gdGhlIEdYMSAodGFrZW4gZnJvbSBtb2RlZGIuYykgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlIF9faW5pdGRhdGEgZ3gxX21vZGVkYltdID0geworCS8qIDY0MHg0ODAtNjAgVkVTQSAqLworCXsgTlVMTCwgNjAsIDY0MCwgNDgwLCAzOTY4MiwgIDQ4LCAxNiwgMzMsIDEwLCA5NiwgMiwKKwkgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAorCS8qIDY0MHg0ODAtNzUgVkVTQSAqLworCXsgTlVMTCwgNzUsIDY0MCwgNDgwLCAzMTc0NiwgMTIwLCAxNiwgMTYsIDAxLCA2NCwgMywKKwkgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAorCS8qIDY0MHg0ODAtODUgVkVTQSAqLworCXsgTlVMTCwgODUsIDY0MCwgNDgwLCAyNzc3NywgODAsIDU2LCAyNSwgMDEsIDU2LCAzLAorCSAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCisJLyogODAweDYwMC02MCBWRVNBICovCisJeyBOVUxMLCA2MCwgODAwLCA2MDAsIDI1MDAwLCA4OCwgNDAsIDIzLCAwMSwgMTI4LCA0LAorCSAgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJICBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKKwkvKiA4MDB4NjAwLTc1IFZFU0EgKi8KKwl7IE5VTEwsIDc1LCA4MDAsIDYwMCwgMjAyMDIsIDE2MCwgMTYsIDIxLCAwMSwgODAsIDMsCisJICBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkgIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAorCS8qIDgwMHg2MDAtODUgVkVTQSAqLworCXsgTlVMTCwgODUsIDgwMCwgNjAwLCAxNzc2MSwgMTUyLCAzMiwgMjcsIDAxLCA2NCwgMywKKwkgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSAgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCisJLyogMTAyNHg3NjgtNjAgVkVTQSAqLworCXsgTlVMTCwgNjAsIDEwMjQsIDc2OCwgMTUzODQsIDE2MCwgMjQsIDI5LCAzLCAxMzYsIDYsCisJICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKKwkvKiAxMDI0eDc2OC03NSBWRVNBICovCisJeyBOVUxMLCA3NSwgMTAyNCwgNzY4LCAxMjY5MCwgMTc2LCAxNiwgMjgsIDEsIDk2LCAzLAorCSAgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJICBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKKwkvKiAxMDI0eDc2OC04NSBWRVNBICovCisJeyBOVUxMLCA4NSwgMTAyNCwgNzY4LCAxMDU4MiwgMjA4LCA0OCwgMzYsIDEsIDk2LCAzLAorCSAgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJICBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKKwkvKiAxMjgweDk2MC02MCBWRVNBICovCisJeyBOVUxMLCA2MCwgMTI4MCwgOTYwLCA5MjU5LCAzMTIsIDk2LCAzNiwgMSwgMTEyLCAzLAorCSAgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJICBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKKwkvKiAxMjgweDk2MC04NSBWRVNBICovCisJeyBOVUxMLCA4NSwgMTI4MCwgOTYwLCA2NzM0LCAyMjQsIDY0LCA0NywgMSwgMTYwLCAzLAorCSAgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJICBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKKwkvKiAxMjgweDEwMjQtNjAgVkVTQSAqLworCXsgTlVMTCwgNjAsIDEyODAsIDEwMjQsIDkyNTksIDI0OCwgNDgsIDM4LCAxLCAxMTIsIDMsCisJICBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkgIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAorCS8qIDEyODB4MTAyNC03NSBWRVNBICovCisJeyBOVUxMLCA3NSwgMTI4MCwgMTAyNCwgNzQwNywgMjQ4LCAxNiwgMzgsIDEsIDE0NCwgMywKKwkgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSAgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCisJLyogMTI4MHgxMDI0LTg1IFZFU0EgKi8KKwl7IE5VTEwsIDg1LCAxMjgwLCAxMDI0LCA2MzQ5LCAyMjQsIDY0LCA0NCwgMSwgMTYwLCAzLAorCSAgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJICBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKK307CisKIHN0YXRpYyBpbnQgZ3gxX2xpbmVfZGVsdGEoaW50IHhyZXMsIGludCBicHApCiB7CiAJaW50IGxpbmVfZGVsdGEgPSB4cmVzICogKGJwcCA+PiAzKTsKQEAgLTQ3LDggKzEwMyw2IEBACiB7CiAJc3RydWN0IGdlb2RlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKLQogCS8qIE1heGltdW0gcmVzb2x1dGlvbiBpcyAxMjgweDEwMjQuICovCiAJaWYgKHZhci0+eHJlcyA+IDEyODAgfHwgdmFyLT55cmVzID4gMTAyNCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDYsNDAgKzIwMCw0OCBAQAogCXJldHVybiBwYXItPnZpZF9vcHMtPmJsYW5rX2Rpc3BsYXkoaW5mbywgYmxhbmtfbW9kZSk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGd4MWZiX21hcF92aWRlb19tZW1vcnkoc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IF9faW5pdCBneDFmYl9tYXBfdmlkZW9fbWVtb3J5KHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBnZW9kZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXVuc2lnbmVkIGd4X2Jhc2U7CiAJaW50IGZiX2xlbjsKKwlpbnQgcmV0OwogCiAJZ3hfYmFzZSA9IGd4MV9neF9iYXNlKCk7CiAJaWYgKCFneF9iYXNlKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXBhci0+dmlkX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQ1lSSVgsCi0JCQkJICAgICAgUENJX0RFVklDRV9JRF9DWVJJWF81NTMwX1ZJREVPLCBOVUxMKTsKLQlpZiAoIXBhci0+dmlkX2RldikKLQkJcmV0dXJuIC1FTk9ERVY7CisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAotCXBhci0+dmlkX3JlZ3MgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwYXItPnZpZF9kZXYsIDEpLAotCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGFyLT52aWRfZGV2LCAxKSk7CisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKGRldiwgMSwgImd4MWZiICh2aWRlbykiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlwYXItPnZpZF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKSwKKwkJCQlwY2lfcmVzb3VyY2VfbGVuKGRldiwgMSkpOwogCWlmICghcGFyLT52aWRfcmVncykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihneF9iYXNlICsgMHg4MzAwLCAweDEwMCwgImd4MWZiIChkaXNwbGF5IGNvbnRyb2xsZXIpIikpCisJCXJldHVybiAtRUJVU1k7CiAJcGFyLT5kY19yZWdzID0gaW9yZW1hcChneF9iYXNlICsgMHg4MzAwLCAweDEwMCk7CiAJaWYgKCFwYXItPmRjX3JlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBneF9iYXNlICsgMHg4MDAwMDA7CisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKGRldiwgMCwgImd4MWZiIChmcmFtZSBidWZmZXIpIik7CisJaWYgKHJldCA8IDAgKQorCQlyZXR1cm4gLUVCVVNZOwogCWlmICgoZmJfbGVuID0gZ3gxX2ZyYW1lX2J1ZmZlcl9zaXplKCkpIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07CisJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKIAlpbmZvLT5maXguc21lbV9sZW4gPSBmYl9sZW47CiAJaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKGluZm8tPmZpeC5zbWVtX3N0YXJ0LCBpbmZvLT5maXguc21lbV9sZW4pOwogCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVkIEtpYnl0ZSBvZiB2aWRlbyBtZW1vcnkgYXQgMHglbHhcbiIsCi0JICAgICAgIGluZm8tPmZpeC5pZCwgaW5mby0+Zml4LnNtZW1fbGVuIC8gMTAyNCwgaW5mby0+Zml4LnNtZW1fc3RhcnQpOworCWRldl9pbmZvKCZkZXYtPmRldiwgIiVkIEtpYnl0ZSBvZiB2aWRlbyBtZW1vcnkgYXQgMHglbHhcbiIsCisJCSBpbmZvLT5maXguc21lbV9sZW4gLyAxMDI0LCBpbmZvLT5maXguc21lbV9zdGFydCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIxNiwxMyArMjc4LDEzIEBACiAJLmZiX2N1cnNvcgk9IHNvZnRfY3Vyc29yLAogfTsKIAotc3RhdGljIHN0cnVjdCBmYl9pbmZvICogX19pbml0IGd4MWZiX2luaXRfZmJpbmZvKHZvaWQpCitzdGF0aWMgc3RydWN0IGZiX2luZm8gKiBfX2luaXQgZ3gxZmJfaW5pdF9mYmluZm8oc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCXN0cnVjdCBnZW9kZWZiX3BhciAqcGFyOworCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCiAJLyogQWxsb2MgZW5vdWdoIHNwYWNlIGZvciB0aGUgcHNldWRvIHBhbGV0dGUuICovCi0JaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ2VvZGVmYl9wYXIpICsgc2l6ZW9mKHUzMikgKiAxNiwgTlVMTCk7CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ2VvZGVmYl9wYXIpICsgc2l6ZW9mKHUzMikgKiAxNiwgZGV2KTsKIAlpZiAoIWluZm8pCiAJCXJldHVybiBOVUxMOwogCkBAIC0yNTUsNDcgKzMxNywzNyBAQAogCS8qIENSVCBhbmQgcGFuZWwgb3B0aW9ucyAqLwogCXBhci0+ZW5hYmxlX2NydCA9IGNydF9vcHRpb247CiAJaWYgKHBhcnNlX3BhbmVsX29wdGlvbihpbmZvKSA8IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkICdwYW5lbCcgb3B0aW9uIC0tIGRpc2FibGluZyBmbGF0IHBhbmVsXG4iLAotCQkgICAgICAgaW5mby0+Zml4LmlkKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZ3gxZmI6IGludmFsaWQgJ3BhbmVsJyBvcHRpb24gLS0gZGlzYWJsaW5nIGZsYXQgcGFuZWxcbiIpOwogCWlmICghcGFyLT5wYW5lbF94KQogCQlwYXItPmVuYWJsZV9jcnQgPSAxOyAvKiBmYWxsIGJhY2sgdG8gQ1JUIGlmIG5vIHBhbmVsIGlzIHNwZWNpZmllZCAqLwogCiAJcmV0dXJuIGluZm87CiB9CiAKLQotc3RhdGljIHN0cnVjdCBmYl9pbmZvICpneDFmYl9pbmZvOwotCi1zdGF0aWMgaW50IF9faW5pdCBneDFmYl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBneDFmYl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogeworCXN0cnVjdCBnZW9kZWZiX3BhciAqcGFyOwogCXN0cnVjdCBmYl9pbmZvICppbmZvOwotICAgICAgICBzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhcjsKIAlpbnQgcmV0OwogCi0jaWZuZGVmIE1PRFVMRQotCWlmIChmYl9nZXRfb3B0aW9ucygiZ3gxZmIiLCBOVUxMKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0jZW5kaWYKLQotCWluZm8gPSBneDFmYl9pbml0X2ZiaW5mbygpOworCWluZm8gPSBneDFmYl9pbml0X2ZiaW5mbygmcGRldi0+ZGV2KTsKIAlpZiAoIWluZm8pCiAJCXJldHVybiAtRU5PTUVNOwotCWd4MWZiX2luZm8gPSBpbmZvOwotCiAJcGFyID0gaW5mby0+cGFyOwogCiAJLyogR1gxIGRpc3BsYXkgY29udHJvbGxlciBhbmQgQ1M1NTMwIHZpZGVvIGRldmljZSAqLwogCXBhci0+ZGNfb3BzICA9ICZneDFfZGNfb3BzOwogCXBhci0+dmlkX29wcyA9ICZjczU1MzBfdmlkX29wczsKIAotCWlmICgocmV0ID0gZ3gxZmJfbWFwX3ZpZGVvX21lbW9yeShpbmZvKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGd4MWZiX21hcF92aWRlb19tZW1vcnkoKSBmYWlsZWRcbiIsIGluZm8tPmZpeC5pZCk7CisJaWYgKChyZXQgPSBneDFmYl9tYXBfdmlkZW9fbWVtb3J5KGluZm8sIHBkZXYpKSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIG1hcCBmcmFtZSBidWZmZXIgb3IgY29udHJvbGxlciByZWdpc3RlcnNcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKLQlyZXQgPSBmYl9maW5kX21vZGUoJmluZm8tPnZhciwgaW5mbywgbW9kZV9vcHRpb24sIE5VTEwsIDAsIE5VTEwsIDE2KTsKKwlyZXQgPSBmYl9maW5kX21vZGUoJmluZm8tPnZhciwgaW5mbywgbW9kZV9vcHRpb24sCisJCQkgICBneDFfbW9kZWRiLCBBUlJBWV9TSVpFKGd4MV9tb2RlZGIpLCBOVUxMLCAxNik7CiAJaWYgKHJldCA9PSAwIHx8IHJldCA9PSA0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBmaW5kIHZhbGlkIHZpZGVvIG1vZGVcbiIsIGluZm8tPmZpeC5pZCk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBmaW5kIHZhbGlkIHZpZGVvIG1vZGVcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycjsKIAl9CkBAIC0zMTAsMzkgKzM2Miw4MyBAQAogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycjsKIAl9CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOwogCXByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsIGluZm8tPm5vZGUsIGluZm8tPmZpeC5pZCk7CiAJcmV0dXJuIDA7CiAKICAgZXJyOgotCWlmIChpbmZvLT5zY3JlZW5fYmFzZSkKKwlpZiAoaW5mby0+c2NyZWVuX2Jhc2UpIHsKIAkJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7Ci0JaWYgKHBhci0+dmlkX3JlZ3MpCisJCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKKwl9CisJaWYgKHBhci0+dmlkX3JlZ3MpIHsKIAkJaW91bm1hcChwYXItPnZpZF9yZWdzKTsKLQlpZiAocGFyLT5kY19yZWdzKQorCQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMSk7CisJfQorCWlmIChwYXItPmRjX3JlZ3MpIHsKIAkJaW91bm1hcChwYXItPmRjX3JlZ3MpOwotCWlmIChwYXItPnZpZF9kZXYpCi0JCXBjaV9kZXZfcHV0KHBhci0+dmlkX2Rldik7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihneDFfZ3hfYmFzZSgpICsgMHg4MzAwLCAweDEwMCk7CisJfQorCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCiAJaWYgKGluZm8pCiAJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGd4MWZiX2NsZWFudXAodm9pZCkKK3N0YXRpYyB2b2lkIGd4MWZiX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGd4MWZiX2luZm87Ci0Jc3RydWN0IGdlb2RlZmJfcGFyICpwYXIgPSBneDFmYl9pbmZvLT5wYXI7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGdlb2RlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwogCiAJaW91bm1hcCgodm9pZCBfX2lvbWVtICopaW5mby0+c2NyZWVuX2Jhc2UpOwotCWlvdW5tYXAocGFyLT52aWRfcmVncyk7Ci0JaW91bm1hcChwYXItPmRjX3JlZ3MpOworCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKIAotCXBjaV9kZXZfcHV0KHBhci0+dmlkX2Rldik7CisJaW91bm1hcChwYXItPnZpZF9yZWdzKTsKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMSk7CisKKwlpb3VubWFwKHBhci0+ZGNfcmVncyk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGd4MV9neF9iYXNlKCkgKyAweDgzMDAsIDB4MTAwKTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogfQogCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZ3gxZmJfaWRfdGFibGVbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUzMF9WSURFTywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkgPDwgMTYsCisJICAweGZmMDAwMCwgMCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGd4MWZiX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGd4MWZiX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZ3gxZmIiLAorCS5pZF90YWJsZQk9IGd4MWZiX2lkX3RhYmxlLAorCS5wcm9iZQkJPSBneDFmYl9wcm9iZSwKKwkucmVtb3ZlCQk9IGd4MWZiX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGd4MWZiX2luaXQodm9pZCkKK3sKKyNpZm5kZWYgTU9EVUxFCisJaWYgKGZiX2dldF9vcHRpb25zKCJneDFmYiIsIE5VTEwpKQorCQlyZXR1cm4gLUVOT0RFVjsKKyNlbmRpZgorCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZneDFmYl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZ3gxZmJfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZ3gxZmJfZHJpdmVyKTsKK30KKwogbW9kdWxlX2luaXQoZ3gxZmJfaW5pdCk7CiBtb2R1bGVfZXhpdChneDFmYl9jbGVhbnVwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nZW9kZS92aWRlb19jczU1MzAuYyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvdmlkZW9fY3M1NTMwLmMKaW5kZXggZDM3NjRhYy4uNjQ5YzM5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS92aWRlb19jczU1MzAuYworKysgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL3ZpZGVvX2NzNTUzMC5jCkBAIC02OSw4ICs2OSw2IEBACiAJeyAgNDMxMCwgMHgyRkIxQjgwMiwgfSwgLyogMjMyLjAwMDAgKi8KIH07CiAKLSNkZWZpbmUgTlVNX0NTNTUzMF9GUkVRVUVOQ0lFUyBzaXplb2YoY3M1NTMwX3BsbF90YWJsZSkvc2l6ZW9mKHN0cnVjdCBjczU1MzBfcGxsX2VudHJ5KQotCiBzdGF0aWMgdm9pZCBjczU1MzBfc2V0X2RjbGtfZnJlcXVlbmN5KHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBnZW9kZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwpAQCAtODIsNyArODAsNyBAQAogCXZhbHVlID0gY3M1NTMwX3BsbF90YWJsZVswXS5wbGxfdmFsdWU7CiAJbWluID0gY3M1NTMwX3BsbF90YWJsZVswXS5waXhjbG9jayAtIGluZm8tPnZhci5waXhjbG9jazsKIAlpZiAobWluIDwgMCkgbWluID0gLW1pbjsKLQlmb3IgKGkgPSAxOyBpIDwgTlVNX0NTNTUzMF9GUkVRVUVOQ0lFUzsgaSsrKSB7CisJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUoY3M1NTMwX3BsbF90YWJsZSk7IGkrKykgewogCQlkaWZmID0gY3M1NTMwX3BsbF90YWJsZVtpXS5waXhjbG9jayAtIGluZm8tPnZhci5waXhjbG9jazsKIAkJaWYgKGRpZmYgPCAwTCkgZGlmZiA9IC1kaWZmOwogCQlpZiAoZGlmZiA8IG1pbikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pODEwL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9pODEwL01ha2VmaWxlCmluZGV4IDc5NGFlNzYuLjk2ZTA4YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaTgxMC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvTWFrZWZpbGUKQEAgLTQsNyArNCw2IEBACiAKIG9iai0kKENPTkZJR19GQl9JODEwKQkJKz0gaTgxMGZiLm8KIAotCiBpODEwZmItb2JqcyAgICAgICAgICAgICAgICAgICAgIDo9IGk4MTBfbWFpbi5vIGk4MTBfYWNjZWwubwogCiBpZmRlZiBDT05GSUdfRkJfSTgxMF9HVEYKQEAgLTEyLDMgKzExLDcgQEAKIGVsc2UKIGk4MTBmYi1vYmpzICAgICAgICAgICAgICAgICAgICAgKz0gaTgxMF9kdnQubwogZW5kaWYKKworaWZkZWYgQ09ORklHX0ZCX0k4MTBfSTJDCitpODEwZmItb2JqcyArPSBpODEwLWkyYy5vCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pODEwL2k4MTAtaTJjLmMgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGE1M2FhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTAtaTJjLmMKQEAgLTAsMCArMSwyNTcgQEAKKyAvKi0qLSBsaW51eC1jIC0qLQorICogIGxpbnV4L2RyaXZlcnMvdmlkZW8vaTgxMC1pMmMuYyAtLSBJbnRlbCA4MTAvODE1IEkyQyBzdXBwb3J0CisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDIwMDQgQW50b25pbm8gRGFwbGFzPGFkYXBsYXNAcG9sLm5ldD4KKyAqICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSAiaTgxMC5oIgorI2luY2x1ZGUgImk4MTBfcmVncy5oIgorI2luY2x1ZGUgIi4uL2VkaWQuaCIKKworI2RlZmluZSBJODEwX0REQyAweDUwCisvKiBiaXQgbG9jYXRpb25zIGluIHRoZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0NMX0RJUl9NQVNLCQkweDAwMDEKKyNkZWZpbmUgU0NMX0RJUgkJCTB4MDAwMgorI2RlZmluZSBTQ0xfVkFMX01BU0sJCTB4MDAwNAorI2RlZmluZSBTQ0xfVkFMX09VVAkJMHgwMDA4CisjZGVmaW5lIFNDTF9WQUxfSU4JCTB4MDAxMAorI2RlZmluZSBTREFfRElSX01BU0sJCTB4MDEwMAorI2RlZmluZSBTREFfRElSCQkJMHgwMjAwCisjZGVmaW5lIFNEQV9WQUxfTUFTSwkJMHgwNDAwCisjZGVmaW5lIFNEQV9WQUxfT1VUCQkweDA4MDAKKyNkZWZpbmUgU0RBX1ZBTF9JTgkJMHgxMDAwCisKKyNkZWZpbmUgREVCVUcgIC8qIGRlZmluZSB0aGlzIGZvciB2ZXJib3NlIEVESUQgcGFyc2luZyBvdXRwdXQgKi8KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKSBwcmludGsoZm10LCMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpODEwaTJjX3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisgICAgICAgIHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gICAgKmNoYW4gPSAoc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAqKWRhdGE7CisgICAgICAgIHN0cnVjdCBpODEwZmJfcGFyICAgICAgICAgKnBhciA9IGNoYW4tPnBhcjsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICptbWlvID0gcGFyLT5tbWlvX3N0YXJ0X3ZpcnR1YWw7CisKKwlpODEwX3dyaXRlbChtbWlvLCBHUElPQiwgKHN0YXRlID8gU0NMX1ZBTF9PVVQgOiAwKSB8IFNDTF9ESVIgfAorCQkgICAgU0NMX0RJUl9NQVNLIHwgU0NMX1ZBTF9NQVNLKTsKKwlpODEwX3JlYWRsKG1taW8sIEdQSU9CKTsJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCit9CisKK3N0YXRpYyB2b2lkIGk4MTBpMmNfc2V0c2RhKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKyAgICAgICAgc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAgICAqY2hhbiA9IChzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICopZGF0YTsKKyAgICAgICAgc3RydWN0IGk4MTBmYl9wYXIgICAgICAgICAqcGFyID0gY2hhbi0+cGFyOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgKm1taW8gPSBwYXItPm1taW9fc3RhcnRfdmlydHVhbDsKKworIAlpODEwX3dyaXRlbChtbWlvLCBHUElPQiwgKHN0YXRlID8gU0RBX1ZBTF9PVVQgOiAwKSB8IFNEQV9ESVIgfAorCQkgICAgU0RBX0RJUl9NQVNLIHwgU0RBX1ZBTF9NQVNLKTsKKwlpODEwX3JlYWRsKG1taW8sIEdQSU9CKTsJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCit9CisKK3N0YXRpYyBpbnQgaTgxMGkyY19nZXRzY2wodm9pZCAqZGF0YSkKK3sKKyAgICAgICAgc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAgICAqY2hhbiA9IChzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICopZGF0YTsKKyAgICAgICAgc3RydWN0IGk4MTBmYl9wYXIgICAgICAgICAqcGFyID0gY2hhbi0+cGFyOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgKm1taW8gPSBwYXItPm1taW9fc3RhcnRfdmlydHVhbDsKKworCWk4MTBfd3JpdGVsKG1taW8sIEdQSU9CLCBTQ0xfRElSX01BU0spOworCWk4MTBfd3JpdGVsKG1taW8sIEdQSU9CLCAwKTsKKwlyZXR1cm4gKDAgIT0gKGk4MTBfcmVhZGwobW1pbywgR1BJT0IpICYgU0NMX1ZBTF9JTikpOworfQorCitzdGF0aWMgaW50IGk4MTBpMmNfZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gICAgKmNoYW4gPSAoc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAqKWRhdGE7CisgICAgICAgIHN0cnVjdCBpODEwZmJfcGFyICAgICAgICAgKnBhciA9IGNoYW4tPnBhcjsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICptbWlvID0gcGFyLT5tbWlvX3N0YXJ0X3ZpcnR1YWw7CisKKwlpODEwX3dyaXRlbChtbWlvLCBHUElPQiwgU0RBX0RJUl9NQVNLKTsKKwlpODEwX3dyaXRlbChtbWlvLCBHUElPQiwgMCk7CisJcmV0dXJuICgwICE9IChpODEwX3JlYWRsKG1taW8sIEdQSU9CKSAmIFNEQV9WQUxfSU4pKTsKK30KKworc3RhdGljIHZvaWQgaTgxMGRkY19zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworICAgICAgICBzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICAgICpjaGFuID0gKHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gKilkYXRhOworICAgICAgICBzdHJ1Y3QgaTgxMGZiX3BhciAgICAgICAqcGFyID0gY2hhbi0+cGFyOworCXU4ICAgICAgICAgICAgICAgICAgICAgICptbWlvID0gcGFyLT5tbWlvX3N0YXJ0X3ZpcnR1YWw7CisKKwlpODEwX3dyaXRlbChtbWlvLCBHUElPQSwgKHN0YXRlID8gU0NMX1ZBTF9PVVQgOiAwKSB8IFNDTF9ESVIgfAorCQkgICAgU0NMX0RJUl9NQVNLIHwgU0NMX1ZBTF9NQVNLKTsKKwlpODEwX3JlYWRsKG1taW8sIEdQSU9BKTsJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCit9CisKK3N0YXRpYyB2b2lkIGk4MTBkZGNfc2V0c2RhKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKyAgICAgICAgc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAgICAqY2hhbiA9IChzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICopZGF0YTsKKyAgICAgICAgc3RydWN0IGk4MTBmYl9wYXIgICAgICAgICAqcGFyID0gY2hhbi0+cGFyOworCXU4ICAgICAgICAgICAgICAgICAgICAgICptbWlvID0gcGFyLT5tbWlvX3N0YXJ0X3ZpcnR1YWw7CisKKyAJaTgxMF93cml0ZWwobW1pbywgR1BJT0EsIChzdGF0ZSA/IFNEQV9WQUxfT1VUIDogMCkgfCBTREFfRElSIHwKKwkJICAgIFNEQV9ESVJfTUFTSyB8IFNEQV9WQUxfTUFTSyk7CisJaTgxMF9yZWFkbChtbWlvLCBHUElPQSk7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworfQorCitzdGF0aWMgaW50IGk4MTBkZGNfZ2V0c2NsKHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gICAgKmNoYW4gPSAoc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAqKWRhdGE7CisgICAgICAgIHN0cnVjdCBpODEwZmJfcGFyICAgICAgICAgKnBhciA9IGNoYW4tPnBhcjsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAqbW1pbyA9IHBhci0+bW1pb19zdGFydF92aXJ0dWFsOworCisJaTgxMF93cml0ZWwobW1pbywgR1BJT0EsIFNDTF9ESVJfTUFTSyk7CisJaTgxMF93cml0ZWwobW1pbywgR1BJT0EsIDApOworCXJldHVybiAoMCAhPSAoaTgxMF9yZWFkbChtbWlvLCBHUElPQSkgJiBTQ0xfVkFMX0lOKSk7Cit9CisKK3N0YXRpYyBpbnQgaTgxMGRkY19nZXRzZGEodm9pZCAqZGF0YSkKK3sKKyAgICAgICAgc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAgICAqY2hhbiA9IChzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICopZGF0YTsKKyAgICAgICAgc3RydWN0IGk4MTBmYl9wYXIgICAgICAgICAqcGFyID0gY2hhbi0+cGFyOworCXU4ICAgICAgICAgICAgICAgICAgICAgICptbWlvID0gcGFyLT5tbWlvX3N0YXJ0X3ZpcnR1YWw7CisKKwlpODEwX3dyaXRlbChtbWlvLCBHUElPQSwgU0RBX0RJUl9NQVNLKTsKKwlpODEwX3dyaXRlbChtbWlvLCBHUElPQSwgMCk7CisJcmV0dXJuICgwICE9IChpODEwX3JlYWRsKG1taW8sIEdQSU9BKSAmIFNEQV9WQUxfSU4pKTsKK30KKworI2RlZmluZSBJMkNfQUxHT19ERENfSTgxMCAgIDB4MGUwMDAwCisjZGVmaW5lIEkyQ19BTEdPX0kyQ19JODEwICAgMHgwZjAwMDAKK3N0YXRpYyBpbnQgaTgxMF9zZXR1cF9pMmNfYnVzKHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gKmNoYW4sIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICBpbnQgY29ubikKK3sKKyAgICAgICAgaW50IHJjOworCisgICAgICAgIHN0cmNweShjaGFuLT5hZGFwdGVyLm5hbWUsIG5hbWUpOworICAgICAgICBjaGFuLT5hZGFwdGVyLm93bmVyICAgICAgICAgICAgID0gVEhJU19NT0RVTEU7CisgICAgICAgIGNoYW4tPmFkYXB0ZXIuYWxnb19kYXRhICAgICAgICAgPSAmY2hhbi0+YWxnbzsKKyAgICAgICAgY2hhbi0+YWRhcHRlci5kZXYucGFyZW50ICAgICAgICA9ICZjaGFuLT5wYXItPmRldi0+ZGV2OworCXN3aXRjaCAoY29ubikgeworCWNhc2UgMToKKwkJY2hhbi0+YWRhcHRlci5pZCAgICAgICAgICAgICAgICA9IEkyQ19BTEdPX0REQ19JODEwOworCQljaGFuLT5hbGdvLnNldHNkYSAgICAgICAgICAgICAgID0gaTgxMGRkY19zZXRzZGE7CisJCWNoYW4tPmFsZ28uc2V0c2NsICAgICAgICAgICAgICAgPSBpODEwZGRjX3NldHNjbDsKKwkJY2hhbi0+YWxnby5nZXRzZGEgICAgICAgICAgICAgICA9IGk4MTBkZGNfZ2V0c2RhOworCQljaGFuLT5hbGdvLmdldHNjbCAgICAgICAgICAgICAgID0gaTgxMGRkY19nZXRzY2w7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJY2hhbi0+YWRhcHRlci5pZCAgICAgICAgICAgICAgICA9IEkyQ19BTEdPX0kyQ19JODEwOworCQljaGFuLT5hbGdvLnNldHNkYSAgICAgICAgICAgICAgID0gaTgxMGkyY19zZXRzZGE7CisJCWNoYW4tPmFsZ28uc2V0c2NsICAgICAgICAgICAgICAgPSBpODEwaTJjX3NldHNjbDsKKwkJY2hhbi0+YWxnby5nZXRzZGEgICAgICAgICAgICAgICA9IGk4MTBpMmNfZ2V0c2RhOworCQljaGFuLT5hbGdvLmdldHNjbCAgICAgICAgICAgICAgID0gaTgxMGkyY19nZXRzY2w7CisJCWJyZWFrOworCX0KKwljaGFuLT5hbGdvLnVkZWxheSAgICAgICAgICAgICAgID0gMTA7CisJY2hhbi0+YWxnby5tZGVsYXkgICAgICAgICAgICAgICA9IDEwOworICAgICAgICBjaGFuLT5hbGdvLnRpbWVvdXQgICAgICAgICAgICAgID0gKEhaLzIpOworICAgICAgICBjaGFuLT5hbGdvLmRhdGEgICAgICAgICAgICAgICAgID0gY2hhbjsKKworICAgICAgICBpMmNfc2V0X2FkYXBkYXRhKCZjaGFuLT5hZGFwdGVyLCBjaGFuKTsKKworICAgICAgICAvKiBSYWlzZSBTQ0wgYW5kIFNEQSAqLworICAgICAgICBjaGFuLT5hbGdvLnNldHNkYShjaGFuLCAxKTsKKyAgICAgICAgY2hhbi0+YWxnby5zZXRzY2woY2hhbiwgMSk7CisgICAgICAgIHVkZWxheSgyMCk7CisKKyAgICAgICAgcmMgPSBpMmNfYml0X2FkZF9idXMoJmNoYW4tPmFkYXB0ZXIpOworICAgICAgICBpZiAocmMgPT0gMCkKKyAgICAgICAgICAgICAgICBkZXZfZGJnKCZjaGFuLT5wYXItPmRldi0+ZGV2LCAiSTJDIGJ1cyAlcyByZWdpc3RlcmVkLlxuIixuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRldl93YXJuKCZjaGFuLT5wYXItPmRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIEkyQyBidXMgIgorCQkJICIlcy5cbiIsIG5hbWUpOworICAgICAgICByZXR1cm4gcmM7Cit9CisKK3ZvaWQgaTgxMF9jcmVhdGVfaTJjX2J1c3NlcyhzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyKQoreworICAgICAgICBwYXItPmNoYW5bMF0ucGFyICAgICAgICA9IHBhcjsKKwlwYXItPmNoYW5bMV0ucGFyICAgICAgICA9IHBhcjsKKwlpODEwX3NldHVwX2kyY19idXMoJnBhci0+Y2hhblswXSwgIkk4MTAtRERDIiwgMSk7CisJaTgxMF9zZXR1cF9pMmNfYnVzKCZwYXItPmNoYW5bMV0sICJJODEwLUkyQyIsIDIpOworfQorCit2b2lkIGk4MTBfZGVsZXRlX2kyY19idXNzZXMoc3RydWN0IGk4MTBmYl9wYXIgKnBhcikKK3sKKyAgICAgICAgaWYgKHBhci0+Y2hhblswXS5wYXIpCisgICAgICAgICAgICAgICAgaTJjX2JpdF9kZWxfYnVzKCZwYXItPmNoYW5bMF0uYWRhcHRlcik7CisgICAgICAgIHBhci0+Y2hhblswXS5wYXIgPSBOVUxMOworCWlmIChwYXItPmNoYW5bMV0ucGFyKQorCQlpMmNfYml0X2RlbF9idXMoJnBhci0+Y2hhblsxXS5hZGFwdGVyKTsKKwlwYXItPmNoYW5bMV0ucGFyID0gTlVMTDsKK30KKworc3RhdGljIHU4ICppODEwX2RvX3Byb2JlX2kyY19lZGlkKHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gKmNoYW4pCit7CisgICAgICAgIHU4IHN0YXJ0ID0gMHgwOworICAgICAgICBzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLmFkZHIgICA9IEk4MTBfRERDLAorICAgICAgICAgICAgICAgICAgICAgICAgLmxlbiAgICA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVmICAgID0gJnN0YXJ0LAorICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRyICAgPSBJODEwX0REQywKKyAgICAgICAgICAgICAgICAgICAgICAgIC5mbGFncyAgPSBJMkNfTV9SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sZW4gICAgPSBFRElEX0xFTkdUSCwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICB9OworICAgICAgICB1OCAqYnVmOworCisgICAgICAgIGJ1ZiA9IGttYWxsb2MoRURJRF9MRU5HVEgsIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIWJ1ZikgeworCQlEUFJJTlRLKCJpODEwLWkyYzogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbXNnc1sxXS5idWYgPSBidWY7CisKKyAgICAgICAgaWYgKGkyY190cmFuc2ZlcigmY2hhbi0+YWRhcHRlciwgbXNncywgMikgPT0gMikgeworCQlEUFJJTlRLKCJpODEwLWkyYzogSTJDIFRyYW5zZmVyIHN1Y2Nlc3NmdWxcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBidWY7CisJfQorICAgICAgICBEUFJJTlRLKCJpODEwLWkyYzogVW5hYmxlIHRvIHJlYWQgRURJRCBibG9jay5cbiIpOworICAgICAgICBrZnJlZShidWYpOworICAgICAgICByZXR1cm4gTlVMTDsKK30KKworaW50IGk4MTBfcHJvYmVfaTJjX2Nvbm5lY3RvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdTggKipvdXRfZWRpZCwgaW50IGNvbm4pCit7CisJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKyAgICAgICAgdTggKmVkaWQgPSBOVUxMOworICAgICAgICBpbnQgaTsKKworCURQUklOVEsoImk4MTAtaTJjOiBQcm9iZSBEREMlaSBCdXNcbiIsIGNvbm4pOworCWlmIChjb25uIDwgMykgeworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkvKiBEbyB0aGUgcmVhbCB3b3JrICovCisJCQllZGlkID0gaTgxMF9kb19wcm9iZV9pMmNfZWRpZCgmcGFyLT5jaGFuW2Nvbm4tMV0pOworCQkJaWYgKGVkaWQpCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlEUFJJTlRLKCJpODEwLWkyYzogR2V0dGluZyBFRElEIGZyb20gQklPU1xuIik7CisJCWVkaWQgPSBrbWFsbG9jKEVESURfTEVOR1RILCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVkaWQpCisJCQltZW1jcHkoZWRpZCwgZmJfZmlybXdhcmVfZWRpZChpbmZvLT5kZXZpY2UpLAorCQkJICAgICAgIEVESURfTEVOR1RIKTsKKwl9CisKKyAgICAgICAgaWYgKG91dF9lZGlkKQorICAgICAgICAgICAgICAgICpvdXRfZWRpZCA9IGVkaWQ7CisKKyAgICAgICAgcmV0dXJuIChlZGlkKSA/IDAgOiAxOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLmggYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC5oCmluZGV4IGZlM2I3NTcuLmQ0ODk0OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLmgKKysrIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTAuaApAQCAtMTYsNiArMTYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWlkLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8dmlkZW8vdmdhLmg+CiAKIC8qIEZlbmNlICovCkBAIC0yMDEsNyArMjA0LDYgQEAKICNkZWZpbmUgSEFTX0FDQ0VMRVJBVElPTiAgICAgICAgICAgIDIKICNkZWZpbmUgQUxXQVlTX1NZTkMgICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgTE9DS1VQICAgICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgVVNFX0hXQ1VSICAgICAgICAgICAgICAgICAgMTYKIAogc3RydWN0IGd0dF9kYXRhIHsKIAlzdHJ1Y3QgYWdwX21lbW9yeSAqaTgxMF9mYl9tZW1vcnk7CkBAIC0yNDEsNiArMjQzLDE0IEBACiAJdTggY3IzOSwgY3I0MSwgY3I3MCwgc3IwMSwgbXNyOwogfTsKIAorc3RydWN0IGk4MTBmYl9wYXI7CisKK3N0cnVjdCBpODEwZmJfaTJjX2NoYW4geworCXN0cnVjdCBpODEwZmJfcGFyICpwYXI7CisJc3RydWN0IGkyY19hZGFwdGVyIGFkYXB0ZXI7CisJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGFsZ287Cit9OworCiBzdHJ1Y3QgaTgxMGZiX3BhciB7CiAJc3RydWN0IG1vZGVfcmVnaXN0ZXJzICAgIHJlZ3M7CiAJc3RydWN0IHN0YXRlX3JlZ2lzdGVycyAgIGh3X3N0YXRlOwpAQCAtMjUyLDEwICsyNjIsMTIgQEAKIAlzdHJ1Y3QgaGVhcF9kYXRhICAgICAgICAgaXJpbmc7CiAJc3RydWN0IGhlYXBfZGF0YSAgICAgICAgIGN1cnNvcl9oZWFwOwogCXN0cnVjdCB2Z2FzdGF0ZSAgICAgICAgICBzdGF0ZTsKKwlzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICAgY2hhblsyXTsKIAlhdG9taWNfdCAgICAgICAgICAgICAgICAgdXNlX2NvdW50OwogCXUzMiBwc2V1ZG9fcGFsZXR0ZVsxN107CiAJdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0X3BoeXM7CiAJdTggX19pb21lbSAqbW1pb19zdGFydF92aXJ0dWFsOworCXU4ICplZGlkOwogCXUzMiBwaXRjaDsKIAl1MzIgcGl4Y29uZjsKIAl1MzIgd2F0ZXJtYXJrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pODEwL2k4MTBfbWFpbi5jIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTBfbWFpbi5jCmluZGV4IDc1MTNmYjkuLjcwMThmZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX21haW4uYworKysgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9tYWluLmMKQEAgLTkyLDIwICs5MiwyMSBAQAogCS5yZXN1bWUgICA9ICAgICBpODEwZmJfcmVzdW1lLAogfTsKIAotc3RhdGljIGludCB2cmFtICAgICAgIF9faW5pdGRhdGEgPSA0Owotc3RhdGljIGludCBicHAgICAgICAgIF9faW5pdGRhdGEgPSA4Owotc3RhdGljIGludCBtdHJyICAgICAgIF9faW5pdGRhdGEgPSAwOwotc3RhdGljIGludCBhY2NlbCAgICAgIF9faW5pdGRhdGEgPSAwOwotc3RhdGljIGludCBoc3luYzEgICAgIF9faW5pdGRhdGEgPSAwOwotc3RhdGljIGludCBoc3luYzIgICAgIF9faW5pdGRhdGEgPSAwOwotc3RhdGljIGludCB2c3luYzEgICAgIF9faW5pdGRhdGEgPSAwOwotc3RhdGljIGludCB2c3luYzIgICAgIF9faW5pdGRhdGEgPSAwOwotc3RhdGljIGludCB4cmVzICAgICAgIF9faW5pdGRhdGEgPSA2NDA7Ci1zdGF0aWMgaW50IHlyZXMgICAgICAgX19pbml0ZGF0YSA9IDQ4MDsKLXN0YXRpYyBpbnQgdnlyZXMgICAgICBfX2luaXRkYXRhID0gMDsKLXN0YXRpYyBpbnQgc3luYyAgICAgICBfX2luaXRkYXRhID0gMDsKLXN0YXRpYyBpbnQgZXh0X3ZnYSAgICBfX2luaXRkYXRhID0gMDsKLXN0YXRpYyBpbnQgZGNvbG9yICAgICBfX2luaXRkYXRhID0gMDsKK3N0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2RldmluaXRkYXRhID0gTlVMTDsKK3N0YXRpYyBpbnQgdnJhbSAgICAgICBfX2RldmluaXRkYXRhID0gNDsKK3N0YXRpYyBpbnQgYnBwICAgICAgICBfX2RldmluaXRkYXRhID0gODsKK3N0YXRpYyBpbnQgbXRyciAgICAgICBfX2RldmluaXRkYXRhID0gMDsKK3N0YXRpYyBpbnQgYWNjZWwgICAgICBfX2RldmluaXRkYXRhID0gMDsKK3N0YXRpYyBpbnQgaHN5bmMxICAgICBfX2RldmluaXRkYXRhID0gMDsKK3N0YXRpYyBpbnQgaHN5bmMyICAgICBfX2RldmluaXRkYXRhID0gMDsKK3N0YXRpYyBpbnQgdnN5bmMxICAgICBfX2RldmluaXRkYXRhID0gMDsKK3N0YXRpYyBpbnQgdnN5bmMyICAgICBfX2RldmluaXRkYXRhID0gMDsKK3N0YXRpYyBpbnQgeHJlcyAgICAgICBfX2RldmluaXRkYXRhID0gNjQwOworc3RhdGljIGludCB5cmVzICAgICAgIF9fZGV2aW5pdGRhdGEgPSA0ODA7CitzdGF0aWMgaW50IHZ5cmVzICAgICAgX19kZXZpbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IHN5bmMgICAgICAgX19kZXZpbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IGV4dF92Z2EgICAgX19kZXZpbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IGRjb2xvciAgICAgX19kZXZpbml0ZGF0YSA9IDA7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMzEwLDYgKzMxMSw4IEBACiAJdmFsID0gaTgxMF9yZWFkYihDUl9EQVRBX0NHQSwgbW1pbyk7CiAJaTgxMF93cml0ZWIoQ1JfSU5ERVhfQ0dBLCBtbWlvLCBDUjgwKTsKIAlpODEwX3dyaXRlYihDUl9EQVRBX0NHQSwgbW1pbywgdmFsIHwgMSk7CisJLyogU3RvcCBMQ0QgZGlzcGxheXMgZnJvbSBmbGlja2VyaW5nICovCisJaTgxMF93cml0ZWwoTUVNX01PREUsIG1taW8sIGk4MTBfcmVhZGwoTUVNX01PREUsIG1taW8pIHwgNCk7CiB9CiAKIC8qKgpAQCAtOTQ3LDMxICs5NTAsMjQgQEAKIAkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7Ci0JaW50IGxpbmVfbGVuZ3RoLCB2aWRtZW07Ci0JdTMyIHhyZXMsIHlyZXMsIHZ4cmVzLCB2eXJlczsKLQotCXhyZXMgPSB2YXItPnhyZXM7Ci0JeXJlcyA9IHZhci0+eXJlczsKLQl2eHJlcyA9IHZhci0+eHJlc192aXJ0dWFsOwotCXZ5cmVzID0gdmFyLT55cmVzX3ZpcnR1YWw7Ci0KKwlpbnQgbGluZV9sZW5ndGgsIHZpZG1lbSwgbW9kZV92YWxpZCA9IDA7CisJdTMyIHZ5cmVzID0gdmFyLT55cmVzX3ZpcnR1YWwsIHZ4cmVzID0gdmFyLT54cmVzX3ZpcnR1YWw7CiAJLyoKIAkgKiAgTWVtb3J5IGxpbWl0CiAJICovCi0JbGluZV9sZW5ndGggPSBnZXRfbGluZV9sZW5ndGgocGFyLCB2eHJlcywgCi0JCQkJICAgICAgdmFyLT5iaXRzX3Blcl9waXhlbCk7Ci0KKwlsaW5lX2xlbmd0aCA9IGdldF9saW5lX2xlbmd0aChwYXIsIHZ4cmVzLCB2YXItPmJpdHNfcGVyX3BpeGVsKTsKIAl2aWRtZW0gPSBsaW5lX2xlbmd0aCp2eXJlczsKKwogCWlmICh2aWRtZW0gPiBwYXItPmZiLnNpemUpIHsKIAkJdnlyZXMgPSBwYXItPmZiLnNpemUvbGluZV9sZW5ndGg7Ci0JCWlmICh2eXJlcyA8IHlyZXMpIHsKKwkJaWYgKHZ5cmVzIDwgdmFyLT55cmVzKSB7CiAJCQl2eXJlcyA9IHlyZXM7CiAJCQl2eHJlcyA9IHBhci0+ZmIuc2l6ZS92eXJlczsKIAkJCXZ4cmVzIC89IHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gMzsKIAkJCWxpbmVfbGVuZ3RoID0gZ2V0X2xpbmVfbGVuZ3RoKHBhciwgdnhyZXMsIAogCQkJCQkJICAgICAgdmFyLT5iaXRzX3Blcl9waXhlbCk7CiAJCQl2aWRtZW0gPSBsaW5lX2xlbmd0aCAqIHlyZXM7Ci0JCQlpZiAodnhyZXMgPCB4cmVzKSB7CisJCQlpZiAodnhyZXMgPCB2YXItPnhyZXMpIHsKIAkJCQlwcmludGsoImk4MTBmYjogcmVxdWlyZWQgdmlkZW8gbWVtb3J5LCAiCiAJCQkJICAgICAgICIlZCBieXRlcywgZm9yICVkeCVkLSVkICh2aXJ0dWFsKSAiCiAJCQkJICAgICAgICJpcyBvdXQgb2YgcmFuZ2VcbiIsIApAQCAtOTgxLDYgKzk3NywxMCBAQAogCQkJfQogCQl9CiAJfQorCisJdmFyLT54cmVzX3ZpcnR1YWwgPSB2eHJlczsKKwl2YXItPnlyZXNfdmlydHVhbCA9IHZ5cmVzOworCiAJLyoKIAkgKiBNb25pdG9yIGxpbWl0CiAJICovCkBAIC05OTYsMjUgKzk5NiwzOSBAQAogCQlpbmZvLT5tb25zcGVjcy5kY2xrbWF4ID0gMjA0MDAwMDAwOwogCQlicmVhazsKIAl9CisKIAlpbmZvLT5tb25zcGVjcy5kY2xrbWluID0gMTUwMDAwMDA7CiAKLQlpZiAoZmJfdmFsaWRhdGVfbW9kZSh2YXIsIGluZm8pKSB7Ci0JCWlmIChmYl9nZXRfbW9kZShGQl9NQVhUSU1JTkdTLCAwLCB2YXIsIGluZm8pKSB7Ci0JCQlpbnQgZGVmYXVsdF9zeW5jID0gKGluZm8tPm1vbnNwZWNzLmhmbWluLUhGTUlOKQotCQkJCQkJfChpbmZvLT5tb25zcGVjcy5oZm1heC1IRk1BWCkKLQkJCQkJCXwoaW5mby0+bW9uc3BlY3MudmZtaW4tVkZNSU4pCi0JCQkJCQl8KGluZm8tPm1vbnNwZWNzLnZmbWF4LVZGTUFYKTsKLQkJCXByaW50aygiaTgxMGZiOiBpbnZhbGlkIHZpZGVvIG1vZGUlc1xuIiwKLQkJCSAgICBkZWZhdWx0X3N5bmMgPyAiIiA6Ci0JCQkgICAgIi4gU3BlY2lmeWluZyB2c3luY04vaHN5bmNOIHBhcmFtZXRlcnMgbWF5IGhlbHAiKTsKLQkJCXJldHVybiAtRUlOVkFMOworCWlmICghZmJfdmFsaWRhdGVfbW9kZSh2YXIsIGluZm8pKQorCQltb2RlX3ZhbGlkID0gMTsKKworI2lmZGVmIENPTkZJR19GQl9JODEwX0kyQworCWlmICghbW9kZV92YWxpZCAmJiBpbmZvLT5tb25zcGVjcy5ndGYgJiYKKwkgICAgIWZiX2dldF9tb2RlKEZCX01BWFRJTUlOR1MsIDAsIHZhciwgaW5mbykpCisJCW1vZGVfdmFsaWQgPSAxOworCisJaWYgKCFtb2RlX3ZhbGlkICYmIGluZm8tPm1vbnNwZWNzLm1vZGVkYl9sZW4pIHsKKwkJc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZTsKKworCQltb2RlID0gZmJfZmluZF9iZXN0X21vZGUodmFyLCAmaW5mby0+bW9kZWxpc3QpOworCQlpZiAobW9kZSkgeworCQkJZmJfdmlkZW9tb2RlX3RvX3Zhcih2YXIsIG1vZGUpOworCQkJbW9kZV92YWxpZCA9IDE7CiAJCX0KIAl9Ci0JCi0JdmFyLT54cmVzID0geHJlczsKLQl2YXItPnlyZXMgPSB5cmVzOwotCXZhci0+eHJlc192aXJ0dWFsID0gdnhyZXM7Ci0JdmFyLT55cmVzX3ZpcnR1YWwgPSB2eXJlczsKKyNlbmRpZgorCWlmICghbW9kZV92YWxpZCAmJiBpbmZvLT5tb25zcGVjcy5tb2RlZGJfbGVuID09IDApIHsKKwkJaWYgKGZiX2dldF9tb2RlKEZCX01BWFRJTUlOR1MsIDAsIHZhciwgaW5mbykpIHsKKwkJCWludCBkZWZhdWx0X3N5bmMgPSAoaW5mby0+bW9uc3BlY3MuaGZtaW4tSEZNSU4pCisJCQkJfChpbmZvLT5tb25zcGVjcy5oZm1heC1IRk1BWCkKKwkJCQl8KGluZm8tPm1vbnNwZWNzLnZmbWluLVZGTUlOKQorCQkJCXwoaW5mby0+bW9uc3BlY3MudmZtYXgtVkZNQVgpOworCQkJcHJpbnRrKCJpODEwZmI6IGludmFsaWQgdmlkZW8gbW9kZSVzXG4iLAorCQkJICAgICAgIGRlZmF1bHRfc3luYyA/ICIiIDogIi4gU3BlY2lmeWluZyAiCisJCQkgICAgICAgInZzeW5jTi9oc3luY04gcGFyYW1ldGVycyBtYXkgaGVscCIpOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CQogCkBAIC0xMzc1LDcgKzEzODksNiBAQAogCWRlY29kZV92YXIoJmluZm8tPnZhciwgcGFyKTsKIAlpODEwX2xvYWRfcmVncyhwYXIpOwogCWk4MTBfaW5pdF9jdXJzb3IocGFyKTsKLQogCWVuY29kZV9maXgoJmluZm8tPmZpeCwgaW5mbyk7CiAKIAlpZiAoaW5mby0+dmFyLmFjY2VsX2ZsYWdzICYmICEocGFyLT5kZXZfZmxhZ3MgJiBMT0NLVVApKSB7CkBAIC0xNDE4LDkgKzE0MzEsOCBAQAogCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSAoc3RydWN0IGk4MTBmYl9wYXIgKilpbmZvLT5wYXI7CiAJdTggX19pb21lbSAqbW1pbyA9IHBhci0+bW1pb19zdGFydF92aXJ0dWFsOwogCi0JaWYgKCEocGFyLT5kZXZfZmxhZ3MgJiBVU0VfSFdDVVIpIHx8ICFpbmZvLT52YXIuYWNjZWxfZmxhZ3MgfHwKLQkgICAgcGFyLT5kZXZfZmxhZ3MgJiBMT0NLVVApCi0JCXJldHVybiBzb2Z0X2N1cnNvcihpbmZvLCBjdXJzb3IpOworCWlmICghcGFyLT5kZXZfZmxhZ3MgJiBMT0NLVVApCisJCXJldHVybiAtRU5YSU87CiAKIAlpZiAoY3Vyc29yLT5pbWFnZS53aWR0aCA+IDY0IHx8IGN1cnNvci0+aW1hZ2UuaGVpZ2h0ID4gNjQpCiAJCXJldHVybiAtRU5YSU87CkBAIC0xNTA2LDEyICsxNTE4LDEyIEBACiAJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7CiAJaW50IGJsYW5rID0gMCwgcHJldl9zdGF0ZSA9IHBhci0+Y3VyX3N0YXRlOwogCi0JaWYgKHN0YXRlID09IHByZXZfc3RhdGUpCisJaWYgKHN0YXRlLmV2ZW50ID09IHByZXZfc3RhdGUpCiAJCXJldHVybiAwOwogCi0JcGFyLT5jdXJfc3RhdGUgPSBzdGF0ZTsKKwlwYXItPmN1cl9zdGF0ZSA9IHN0YXRlLmV2ZW50OwogCi0Jc3dpdGNoIChzdGF0ZSkgeworCXN3aXRjaCAoc3RhdGUuZXZlbnQpIHsKIAljYXNlIDE6CiAJCWJsYW5rID0gVkVTQV9WU1lOQ19TVVNQRU5EOwogCQlicmVhazsKQEAgLTE4MTQsOCArMTgyNiw3MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaTgxMGZiX2ZpbmRfaW5pdF9tb2RlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBmYl92aWRlb21vZGUgbW9kZTsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOworCXN0cnVjdCBmYl9tb25zcGVjcyAqc3BlY3MgPSBOVUxMOworCWludCBmb3VuZCA9IDA7CisjaWZkZWYgQ09ORklHX0ZCX0k4MTBfSTJDCisJaW50IGk7CisJaW50IGVycjsKKwlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gaW5mby0+cGFyOworI2VuZGlmCisKKwlJTklUX0xJU1RfSEVBRCgmaW5mby0+bW9kZWxpc3QpOworCW1lbXNldCgmbW9kZSwgMCwgc2l6ZW9mKHN0cnVjdCBmYl92aWRlb21vZGUpKTsKKwl2YXIgPSBpbmZvLT52YXI7CisjaWZkZWYgQ09ORklHX0ZCX0k4MTBfSTJDCisJaTgxMF9jcmVhdGVfaTJjX2J1c3NlcyhwYXIpOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQllcnIgPSBpODEwX3Byb2JlX2kyY19jb25uZWN0b3IoaW5mbywgJnBhci0+ZWRpZCwgaSsxKTsKKwkJaWYgKCFlcnIpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIWVycikKKwkJcHJpbnRrKCJpODEwZmJfaW5pdF9wY2k6IEREQyBwcm9iZSBzdWNjZXNzZnVsXG4iKTsKKworCWZiX2VkaWRfdG9fbW9uc3BlY3MocGFyLT5lZGlkLCAmaW5mby0+bW9uc3BlY3MpOworCisJaWYgKGluZm8tPm1vbnNwZWNzLm1vZGVkYiA9PSBOVUxMKQorCQlwcmludGsoImk4MTBmYl9pbml0X3BjaTogVW5hYmxlIHRvIGdldCBNb2RlIERhdGFiYXNlXG4iKTsKKworCXNwZWNzID0gJmluZm8tPm1vbnNwZWNzOworCWZiX3ZpZGVvbW9kZV90b19tb2RlbGlzdChzcGVjcy0+bW9kZWRiLCBzcGVjcy0+bW9kZWRiX2xlbiwKKwkJCQkgJmluZm8tPm1vZGVsaXN0KTsKKwlpZiAoc3BlY3MtPm1vZGVkYiAhPSBOVUxMKSB7CisJCWlmIChzcGVjcy0+bWlzYyAmIEZCX01JU0NfMVNUX0RFVEFJTCkgeworCQkJZm9yIChpID0gMDsgaSA8IHNwZWNzLT5tb2RlZGJfbGVuOyBpKyspIHsKKwkJCQlpZiAoc3BlY3MtPm1vZGVkYltpXS5mbGFnICYgRkJfTU9ERV9JU19GSVJTVCkgeworCQkJCQltb2RlID0gc3BlY3MtPm1vZGVkYltpXTsKKwkJCQkJZm91bmQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKSB7CisJCQltb2RlID0gc3BlY3MtPm1vZGVkYlswXTsKKwkJCWZvdW5kID0gMTsKKwkJfQorCisJCWZiX3ZpZGVvbW9kZV90b192YXIoJnZhciwgJm1vZGUpOworCX0KKyNlbmRpZgorCWlmIChtb2RlX29wdGlvbikKKwkJZmJfZmluZF9tb2RlKCZ2YXIsIGluZm8sIG1vZGVfb3B0aW9uLCBzcGVjcy0+bW9kZWRiLAorCQkJICAgICBzcGVjcy0+bW9kZWRiX2xlbiwgKGZvdW5kKSA/ICZtb2RlIDogTlVMTCwKKwkJCSAgICAgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKKworCWluZm8tPnZhciA9IHZhcjsKKwlmYl9kZXN0cm95X21vZGVkYihzcGVjcy0+bW9kZWRiKTsKKwlzcGVjcy0+bW9kZWRiID0gTlVMTDsKK30KKwogI2lmbmRlZiBNT0RVTEUKLXN0YXRpYyBpbnQgX19pbml0IGk4MTBmYl9zZXR1cChjaGFyICpvcHRpb25zKQorc3RhdGljIGludCBfX2RldmluaXQgaTgxMGZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCiB7CiAJY2hhciAqdGhpc19vcHQsICpzdWZmaXggPSBOVUxMOwogCkBAIC0xODU3LDYgKzE5MzMsOCBAQAogCQkJdnN5bmMyID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNywgTlVMTCwgMCk7CiAJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiZGNvbG9yIiwgNikpCiAJCQlkY29sb3IgPSAxOworCQllbHNlCisJCQltb2RlX29wdGlvbiA9IHRoaXNfb3B0OwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTE4NjcsNiArMTk0NSw3IEBACiB7CiAJc3RydWN0IGZiX2luZm8gICAgKmluZm87CiAJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IE5VTEw7CisJc3RydWN0IGZiX3ZpZGVvbW9kZSBtb2RlOwogCWludCBpLCBlcnIgPSAtMSwgdmZyZXEsIGhmcmVxLCBwaXhjbG9jazsKIAogCWkgPSAwOwpAQCAtMTg3NSw3ICsxOTU0LDcgQEAKIAlpZiAoIWluZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcGFyID0gKHN0cnVjdCBpODEwZmJfcGFyICopIGluZm8tPnBhcjsKKwlwYXIgPSBpbmZvLT5wYXI7CiAJcGFyLT5kZXYgPSBkZXY7CiAKIAlpZiAoIShpbmZvLT5waXhtYXAuYWRkciA9IGttYWxsb2MoOCoxMDI0LCBHRlBfS0VSTkVMKSkpIHsKQEAgLTE5MDYsMTUgKzE5ODUsMjAgQEAKIAlpbmZvLT5mYm9wcyA9ICZwYXItPmk4MTBmYl9vcHM7CiAJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYXItPnBzZXVkb19wYWxldHRlOwogCWZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCk7CisJaTgxMGZiX2ZpbmRfaW5pdF9tb2RlKGluZm8pOwogCiAJaWYgKChlcnIgPSBpbmZvLT5mYm9wcy0+ZmJfY2hlY2tfdmFyKCZpbmZvLT52YXIsIGluZm8pKSkgewogCQlpODEwZmJfcmVsZWFzZV9yZXNvdXJjZShpbmZvLCBwYXIpOwogCQlyZXR1cm4gZXJyOwogCX0KKworCWZiX3Zhcl90b192aWRlb21vZGUoJm1vZGUsICZpbmZvLT52YXIpOworCWZiX2FkZF92aWRlb21vZGUoJm1vZGUsICZpbmZvLT5tb2RlbGlzdCk7CiAJZW5jb2RlX2ZpeCgmaW5mby0+Zml4LCBpbmZvKTsgCiAJIAkgICAgCiAJaTgxMGZiX2luaXRfcmluZ2J1ZmZlcihpbmZvKTsKIAllcnIgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwogCWlmIChlcnIgPCAwKSB7CiAgICAgCQlpODEwZmJfcmVsZWFzZV9yZXNvdXJjZShpbmZvLCBwYXIpOyAKIAkJcHJpbnRrKCJpODEwZmJfaW5pdDogY2Fubm90IHJlZ2lzdGVyIGZyYW1lYnVmZmVyIGRldmljZVxuIik7CkBAIC0xOTUzLDYgKzIwMzcsOCBAQAogCXN0cnVjdCBndHRfZGF0YSAqZ3R0ID0gJnBhci0+aTgxMF9ndHQ7CiAJdW5zZXRfbXRycihwYXIpOwogCisJaTgxMF9kZWxldGVfaTJjX2J1c3NlcyhwYXIpOworCiAJaWYgKHBhci0+aTgxMF9ndHQuaTgxMF9jdXJzb3JfbWVtb3J5KQogCQlhZ3BfZnJlZV9tZW1vcnkoZ3R0LT5pODEwX2N1cnNvcl9tZW1vcnkpOwogCWlmIChwYXItPmk4MTBfZ3R0Lmk4MTBfZmJfbWVtb3J5KQpAQCAtMTk2Miw3ICsyMDQ4LDggQEAKIAkJaW91bm1hcChwYXItPm1taW9fc3RhcnRfdmlydHVhbCk7CiAJaWYgKHBhci0+YXBlcnR1cmUudmlydHVhbCkKIAkJaW91bm1hcChwYXItPmFwZXJ0dXJlLnZpcnR1YWwpOwotCisJaWYgKHBhci0+ZWRpZCkKKwkJa2ZyZWUocGFyLT5lZGlkKTsKIAlpZiAocGFyLT5yZXNfZmxhZ3MgJiBGUkFNRUJVRkZFUl9SRVEpCiAJCXJlbGVhc2VfbWVtX3JlZ2lvbihwYXItPmFwZXJ0dXJlLnBoeXNpY2FsLAogCQkJCSAgIHBhci0+YXBlcnR1cmUuc2l6ZSk7CkBAIC0xOTg4LDcgKzIwNzUsNyBAQAogfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkKIAogI2lmbmRlZiBNT0RVTEUKLXN0YXRpYyBpbnQgX19pbml0IGk4MTBmYl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpODEwZmJfaW5pdCh2b2lkKQogewogCWNoYXIgKm9wdGlvbiA9IE5VTEw7CiAKQEAgLTIwMDYsNyArMjA5Myw3IEBACiAKICNpZmRlZiBNT0RVTEUKIAotc3RhdGljIGludCBfX2luaXQgaTgxMGZiX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGk4MTBmYl9pbml0KHZvaWQpCiB7CiAJaHN5bmMxICo9IDEwMDA7CiAJaHN5bmMyICo9IDEwMDA7CkBAIC0yMDU0LDYgKzIxNDEsOCBAQAogbW9kdWxlX3BhcmFtKGRjb2xvciwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRjb2xvciwgInVzZSBEaXJlY3RDb2xvciB2aXN1YWxzIgogCQkgIiAoZGVmYXVsdCA9IDAgPSBUcnVlQ29sb3IpIik7Cittb2R1bGVfcGFyYW0obW9kZV9vcHRpb24sIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZV9vcHRpb24sICJTcGVjaWZ5IGluaXRpYWwgdmlkZW8gbW9kZSIpOwogCiBNT0RVTEVfQVVUSE9SKCJUb255IEEuIERhcGxhcyIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmFtZWJ1ZmZlciBkZXZpY2UgZm9yIHRoZSBJbnRlbCA4MTAvODE1IGFuZCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX21haW4uaCBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX21haW4uaAppbmRleCA0M2I0Mjk3Li4wNjA3MmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9tYWluLmgKKysrIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTBfbWFpbi5oCkBAIC04Myw2ICs4MywyMiBAQAogZXh0ZXJuIHZvaWQgaTgxMGZiX2luaXRfcmluZ2J1ZmZlcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBleHRlcm4gdm9pZCBpODEwZmJfbG9hZF9mcm9udCAgICAgKHUzMiBvZmZzZXQsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAorI2lmZGVmIENPTkZJR19GQl9JODEwX0kyQworLyogSTJDICovCitleHRlcm4gaW50IGk4MTBfcHJvYmVfaTJjX2Nvbm5lY3RvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdTggKipvdXRfZWRpZCwKKwkJCQkgICAgaW50IGNvbm4pOworZXh0ZXJuIHZvaWQgaTgxMF9jcmVhdGVfaTJjX2J1c3NlcyhzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyKTsKK2V4dGVybiB2b2lkIGk4MTBfZGVsZXRlX2kyY19idXNzZXMoc3RydWN0IGk4MTBmYl9wYXIgKnBhcik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaTgxMF9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1OCAqKm91dF9lZGlkLAorCQkJCSAgICBpbnQgY29ubikKK3sKKwlyZXR1cm4gMTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBpODEwX2NyZWF0ZV9pMmNfYnVzc2VzKHN0cnVjdCBpODEwZmJfcGFyICpwYXIpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGk4MTBfZGVsZXRlX2kyY19idXNzZXMoc3RydWN0IGk4MTBmYl9wYXIgKnBhcikgeyB9CisjZW5kaWYKKwogLyogQ29uZGl0aW9uYWxzICovCiAjaWZkZWYgQ09ORklHX1g4NgogaW5saW5lIHZvaWQgZmx1c2hfY2FjaGUodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiLmggYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYi5oCmluZGV4IDY2ODBlYzkuLjAxMWUxMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiLmgKKysrIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmIuaApAQCAtMjM0LDcgKzIzNCw2IEBACiAKIAkvKiBwYWxldHRlICovCiAJdTMyIHBzZXVkb19wYWxldHRlWzE3XTsKLQlzdHJ1Y3QgeyB1OCByZWQsIGdyZWVuLCBibHVlLCBwYWQ7IH0gcGFsZXR0ZVsyNTZdOwogCiAJLyogY2hpcCBpbmZvICovCiAJaW50IHBjaV9jaGlwc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYyBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMKaW5kZXggYTExMmExNy4uYmY2MmU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jCkBAIC0xMTcsMTQgKzExNywxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbGVjdGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgva2QuaD4KLSNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIApAQCAtMjQyLDcgKzIzOCw3IEBACiBzdGF0aWMgY2hhciAqbW9kZSAgICAgICA9IE5VTEw7CiAKIG1vZHVsZV9wYXJhbShhY2NlbCwgYm9vbCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKGFjY2VsLCAiRW5hYmxlIGNvbnNvbGUgYWNjZWxlcmF0aW9uIik7CitNT0RVTEVfUEFSTV9ERVNDKGFjY2VsLCAiRW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiIpOwogbW9kdWxlX3BhcmFtKHZyYW0sIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHZyYW0sICJTeXN0ZW0gUkFNIHRvIGFsbG9jYXRlIHRvIGZyYW1lYnVmZmVyIGluIE1pQiIpOwogbW9kdWxlX3BhcmFtKHZvZmZzZXQsIGludCwgU19JUlVHTyk7CkBAIC00OTgsNyArNDk0LDcgQEAKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbzsKLQlpbnQgaSwgaiwgZXJyLCBkdm87CisJaW50IGksIGVyciwgZHZvOwogCWludCBhcGVydHVyZV9zaXplLCBzdG9sZW5fc2l6ZTsKIAlzdHJ1Y3QgYWdwX2tlcm5faW5mbyBndHRfaW5mbzsKIAlpbnQgYWdwX21lbXR5cGU7CkBAIC04NDUsMTMgKzg0MSw2IEBACiAJaWYgKGJhaWxlYXJseSA9PSA1KQogCQliYWlsb3V0KGRpbmZvKTsKIAotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCWogPSBjb2xvcl90YWJsZVtpXTsKLQkJZGluZm8tPnBhbGV0dGVbaV0ucmVkID0gZGVmYXVsdF9yZWRbal07Ci0JCWRpbmZvLT5wYWxldHRlW2ldLmdyZWVuID0gZGVmYXVsdF9ncm5bal07Ci0JCWRpbmZvLT5wYWxldHRlW2ldLmJsdWUgPSBkZWZhdWx0X2JsdVtqXTsKLQl9Ci0KIAlpZiAoYmFpbGVhcmx5ID09IDYpCiAJCWJhaWxvdXQoZGluZm8pOwogCkBAIC0xMzYzLDEwICsxMzUyLDYgQEAKIAkJCWdyZWVuID4+PSA4OwogCQkJYmx1ZSA+Pj0gODsKIAotCQkJZGluZm8tPnBhbGV0dGVbcmVnbm9dLnJlZCA9IHJlZDsKLQkJCWRpbmZvLT5wYWxldHRlW3JlZ25vXS5ncmVlbiA9IGdyZWVuOwotCQkJZGluZm8tPnBhbGV0dGVbcmVnbm9dLmJsdWUgPSBibHVlOwotCiAJCQlpbnRlbGZiaHdfc2V0Y29scmVnKGRpbmZvLCByZWdubywgcmVkLCBncmVlbiwgYmx1ZSwKIAkJCQkJICAgIHRyYW5zcCk7CiAJCX0KQEAgLTE0OTksNyArMTQ4NCw3IEBACiAjZW5kaWYKIAogCWlmICghZGluZm8tPmh3Y3Vyc29yKQotCQlyZXR1cm4gc29mdF9jdXJzb3IoaW5mbywgY3Vyc29yKTsKKwkJcmV0dXJuIC1FTlhJTzsKIAogCWludGVsZmJod19jdXJzb3JfaGlkZShkaW5mbyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiaHcuYyBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiaHcuYwppbmRleCBmNWJlZDU4Li41YmFmYzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmh3LmMKKysrIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJody5jCkBAIC0yOSwxNCArMjksMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZWxlY3Rpb24uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX21hdmVuLmMgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9tYXZlbi5jCmluZGV4IDY3Zjg1MzQuLmFkNjBiYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX21hdmVuLmMKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfbWF2ZW4uYwpAQCAtMTI3MSw3ICsxMjcxLDcgQEAKIH0KIAogc3RhdGljIGludCBtYXZlbl9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGFkYXB0ZXIpIHsKLQlpZiAoYWRhcHRlci0+aWQgPT0gKEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0c0MDApKQorCWlmIChhZGFwdGVyLT5pZCA9PSBJMkNfSFdfQl9HNDAwKQogCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsICZtYXZlbl9kZXRlY3RfY2xpZW50KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX21pc2MuYyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX21pc2MuYwppbmRleCBhMThkZDAyLi5kOWQzZTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9taXNjLmMKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfbWlzYy5jCkBAIC02OCw2ICs2OCw5IEBACiAgKiAgICAgICAgICAgICAgICJEYXZpZCBDLiBIYW5zZW4iIDxoYXZlYmx1ZUB1cy5pYm0uY29tPgogICogICAgICAgICAgICAgICAgICAgICBGaXhlcwogICoKKyAqICAgICAgICAgICAgICAgIklhbiBSb21hbmljayIgPGlkckB1cy5pYm0uY29tPgorICogICAgICAgICAgICAgICAgICAgICBGaW5kIFBJblMgZGF0YSBpbiBCSU9TIG9uIFBvd2VyUEMgc3lzdGVtcy4KKyAqCiAgKiAoZm9sbG93aW5nIGF1dGhvciBpcyBub3QgaW4gYW55IHJlbGF0aW9uIHdpdGggdGhpcyBjb2RlLCBidXQgaGlzIGNvZGUKICAqICBpcyBpbmNsdWRlZCBpbiB0aGlzIGRyaXZlcikKICAqCkBAIC00OTYsMTAgKzQ5OSwzNSBAQAogCWdldF9iaW9zX3ZlcnNpb24odmJpb3MsIGJkKTsKIAlnZXRfYmlvc19vdXRwdXQodmJpb3MsIGJkKTsKIAlnZXRfYmlvc190dm91dCh2YmlvcywgYmQpOworI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCisJLyogT24gUG93ZXJQQyBjYXJkcywgdGhlIFBJblMgb2Zmc2V0IGlzbid0IHN0b3JlZCBhdCB0aGUgZW5kIG9mIHRoZQorCSAqIEJJT1MgaW1hZ2UuICBJbnN0ZWFkLCB5b3UgbXVzdCBzZWFyY2ggdGhlIGVudGlyZSBCSU9TIGltYWdlIGZvcgorCSAqIHRoZSBtYWdpYyBQSW5TIHNpZ25hdHVyZS4KKwkgKgorCSAqIFRoaXMgYWN0dWFsbHkgYXBwbGllcyB0byBhbGwgT3BlbkZpcm13YXJlIGJhc2UgY2FyZHMuICBTaW5jZSB0aGVzZQorCSAqIGNhcmRzIGNvdWxkIGJlIHB1dCBpbiBhIE1JUFMgb3IgU1BBUkMgc3lzdGVtLCBzaG91bGQgdGhlIGNvbmRpdGlvbgorCSAqIGJlIHNvbWV0aGluZyBkaWZmZXJlbnQ/CisJICovCisJZm9yICggcGluc19vZmZzZXQgPSAwIDsgcGluc19vZmZzZXQgPD0gMHhGRjgwIDsgcGluc19vZmZzZXQrKyApIHsKKwkJdW5zaWduZWQgY2hhciBoZWFkZXJbM107CisKKwkJaGVhZGVyWzBdID0gcmVhZGIodmJpb3MgKyBwaW5zX29mZnNldCk7CisJCWhlYWRlclsxXSA9IHJlYWRiKHZiaW9zICsgcGluc19vZmZzZXQgKyAxKTsKKwkJaGVhZGVyWzJdID0gcmVhZGIodmJpb3MgKyBwaW5zX29mZnNldCArIDIpOworCQlpZiAoIChoZWFkZXJbMF0gPT0gMHgyRSkgJiYgKGhlYWRlclsxXSA9PSAweDQxKQorCQkgICAgICYmICgoaGVhZGVyWzJdID09IDB4NDApIHx8IChoZWFkZXJbMl0gPT0gMHg4MCkpICkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUEluUyBkYXRhIGZvdW5kIGF0IG9mZnNldCAldVxuIiwKKwkJCSAgICAgICBwaW5zX29mZnNldCk7CisJCQlnZXRfcGlucyh2YmlvcyArIHBpbnNfb2Zmc2V0LCBiZCk7CisJCQlicmVhazsKKwkJfQorCX0KKyNlbHNlCiAJcGluc19vZmZzZXQgPSByZWFkYih2YmlvcyArIDB4N0ZGQykgfCAocmVhZGIodmJpb3MgKyAweDdGRkQpIDw8IDgpOwogCWlmIChwaW5zX29mZnNldCA8PSAweEZGODApIHsKIAkJZ2V0X3BpbnModmJpb3MgKyBwaW5zX29mZnNldCwgYmQpOwogCX0KKyNlbmRpZgogfQogCiAjZGVmaW5lIGdldF91MTYoeCkgKGxlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fdTE2KikoeCkpKSkKQEAgLTc1NSw2ICs3ODMsOCBAQAogCX0KICNlbmRpZgogCW1hdHJveGZiX3NldF9saW1pdHMoUE1JTkZPICZBQ0NFU1NfRkJJTkZPKGJpb3MpKTsKKwlwcmludGsoS0VSTl9JTkZPICJQSW5TIG1lbXR5cGUgPSAldVxuIiwKKwkgICAgICAgKEFDQ0VTU19GQklORk8odmFsdWVzKS5yZWcub3B0ICYgMHgxQzAwKSA+PiAxMCk7CiB9CiAKIEVYUE9SVF9TWU1CT0wobWF0cm94ZmJfREFDX2luKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMgYi9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCmluZGV4IDNlZGM5ZjQuLjQ3NTE2YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKKysrIGIvZHJpdmVycy92aWRlby9tb2RlZGIuYwpAQCAtNDU2LDEyICs0NTYsMjIgQEAKICAqCiAgKglWYWxpZCBtb2RlIHNwZWNpZmllcnMgZm9yIEBtb2RlX29wdGlvbjoKICAqCi0gKgk8eHJlcz54PHlyZXM+Wy08YnBwPl1bQDxyZWZyZXNoPl0gb3IKKyAqCTx4cmVzPng8eXJlcz5bTV1bUl1bLTxicHA+XVtAPHJlZnJlc2g+XVtpXVttXSBvcgogICoJPG5hbWU+Wy08YnBwPl1bQDxyZWZyZXNoPl0KICAqCiAgKgl3aXRoIDx4cmVzPiwgPHlyZXM+LCA8YnBwPiBhbmQgPHJlZnJlc2g+IGRlY2ltYWwgbnVtYmVycyBhbmQKICAqCTxuYW1lPiBhIHN0cmluZy4KICAqCisgKiAgICAgIElmICdNJyBpcyBwcmVzZW50IGFmdGVyIHlyZXMgKGFuZCBiZWZvcmUgcmVmcmVzaC9icHAgaWYgcHJlc2VudCksCisgKiAgICAgIHRoZSBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIHRpbWluZ3MgdXNpbmcgVkVTQSh0bSkgQ29vcmRpbmF0ZWQKKyAqICAgICAgVmlkZW8gVGltaW5ncyAoQ1ZUKS4gIElmICdSJyBpcyBwcmVzZW50IGFmdGVyICdNJywgd2lsbCBjb21wdXRlIHdpdGgKKyAqICAgICAgcmVkdWNlZCBibGFua2luZyAoZm9yIGZsYXRwYW5lbHMpLiAgSWYgJ2knIGlzIHByZXNlbnQsIGNvbXB1dGUKKyAqICAgICAgaW50ZXJsYWNlZCBtb2RlLiAgSWYgJ20nIGlzIHByZXNlbnQsIGFkZCBtYXJnaW5zIGVxdWFsIHRvIDEuOCUKKyAqICAgICAgb2YgeHJlcyByb3VuZGVkIGRvd24gdG8gOCBwaXhlbHMsIGFuZCAxLjglIG9mIHlyZXMuIFRoZSBjaGFyCisgKiAgICAgICdpJyBhbmQgJ20nIG11c3QgYmUgYWZ0ZXIgJ00nIGFuZCAnUicuIEV4YW1wbGU6CisgKgorICogICAgICAxMDI0eDc2OE1SLThANjBtIC0gUmVkdWNlZCBibGFuayB3aXRoIG1hcmdpbnMgYXQgNjBIei4KKyAqCiAgKglOT1RFOiBUaGUgcGFzc2VkIHN0cnVjdCBAdmFyIGlzIF9ub3RfIGNsZWFyZWQhICBUaGlzIGFsbG93cyB5b3UKICAqCXRvIHN1cHBseSB2YWx1ZXMgZm9yIGUuZy4gdGhlIGdyYXlzY2FsZSBhbmQgYWNjZWxfZmxhZ3MgZmllbGRzLgogICoKQEAgLTQ5NSw3ICs1MDUsNyBAQAogCXVuc2lnbmVkIGludCBuYW1lbGVuID0gc3RybGVuKG5hbWUpOwogCWludCByZXNfc3BlY2lmaWVkID0gMCwgYnBwX3NwZWNpZmllZCA9IDAsIHJlZnJlc2hfc3BlY2lmaWVkID0gMDsKIAl1bnNpZ25lZCBpbnQgeHJlcyA9IDAsIHlyZXMgPSAwLCBicHAgPSBkZWZhdWx0X2JwcCwgcmVmcmVzaCA9IDA7Ci0JaW50IHlyZXNfc3BlY2lmaWVkID0gMDsKKwlpbnQgeXJlc19zcGVjaWZpZWQgPSAwLCBjdnQgPSAwLCByYiA9IDAsIGludGVybGFjZSA9IDAsIG1hcmdpbnMgPSAwOwogCXUzMiBiZXN0LCBkaWZmOwogCiAJZm9yIChpID0gbmFtZWxlbi0xOyBpID49IDA7IGktLSkgewpAQCAtNTA2LDYgKzUxNiw4IEBACiAJCQkheXJlc19zcGVjaWZpZWQpIHsKIAkJCXJlZnJlc2ggPSBteV9hdG9pKCZuYW1lW2krMV0pOwogCQkJcmVmcmVzaF9zcGVjaWZpZWQgPSAxOworCQkJaWYgKGN2dCB8fCByYikKKwkJCSAgICBjdnQgPSAwOwogCQkgICAgfSBlbHNlCiAJCQlnb3RvIGRvbmU7CiAJCSAgICBicmVhazsKQEAgLTUxNCw2ICs1MjYsOCBAQAogCQkgICAgaWYgKCFicHBfc3BlY2lmaWVkICYmICF5cmVzX3NwZWNpZmllZCkgewogCQkJYnBwID0gbXlfYXRvaSgmbmFtZVtpKzFdKTsKIAkJCWJwcF9zcGVjaWZpZWQgPSAxOworCQkJaWYgKGN2dCB8fCByYikKKwkJCSAgICBjdnQgPSAwOwogCQkgICAgfSBlbHNlCiAJCQlnb3RvIGRvbmU7CiAJCSAgICBicmVhazsKQEAgLTUyNiw2ICs1NDAsMjIgQEAKIAkJICAgIGJyZWFrOwogCQljYXNlICcwJy4uLic5JzoKIAkJICAgIGJyZWFrOworCQljYXNlICdNJzoKKwkJICAgIGlmICgheXJlc19zcGVjaWZpZWQpCisJCQljdnQgPSAxOworCQkgICAgYnJlYWs7CisJCWNhc2UgJ1InOgorCQkgICAgaWYgKCFjdnQpCisJCQlyYiA9IDE7CisJCSAgICBicmVhazsKKwkJY2FzZSAnbSc6CisJCSAgICBpZiAoIWN2dCkKKwkJCW1hcmdpbnMgPSAxOworCQkgICAgYnJlYWs7CisJCWNhc2UgJ2knOgorCQkgICAgaWYgKCFjdnQpCisJCQlpbnRlcmxhY2UgPSAxOworCQkgICAgYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCSAgICBnb3RvIGRvbmU7CiAJICAgIH0KQEAgLTUzNSw2ICs1NjUsMzQgQEAKIAkgICAgcmVzX3NwZWNpZmllZCA9IDE7CiAJfQogZG9uZToKKwlpZiAoY3Z0KSB7CisJICAgIHN0cnVjdCBmYl92aWRlb21vZGUgY3Z0X21vZGU7CisJICAgIGludCByZXQ7CisKKwkgICAgRFBSSU5USygiQ1ZUIG1vZGUgJWR4JWRAJWRIeiVzJXMlc1xuIiwgeHJlcywgeXJlcywKKwkJICAgIChyZWZyZXNoKSA/IHJlZnJlc2ggOiA2MCwgKHJiKSA/ICIgcmVkdWNlZCBibGFua2luZyIgOgorCQkgICAgIiIsIChtYXJnaW5zKSA/ICIgd2l0aCBtYXJnaW5zIiA6ICIiLCAoaW50ZXJsYWNlKSA/CisJCSAgICAiIGludGVybGFjZWQiIDogIiIpOworCisJICAgIGN2dF9tb2RlLnhyZXMgPSB4cmVzOworCSAgICBjdnRfbW9kZS55cmVzID0geXJlczsKKwkgICAgY3Z0X21vZGUucmVmcmVzaCA9IChyZWZyZXNoKSA/IHJlZnJlc2ggOiA2MDsKKworCSAgICBpZiAoaW50ZXJsYWNlKQorCQljdnRfbW9kZS52bW9kZSB8PSBGQl9WTU9ERV9JTlRFUkxBQ0VEOworCSAgICBlbHNlCisJCWN2dF9tb2RlLnZtb2RlICY9IH5GQl9WTU9ERV9JTlRFUkxBQ0VEOworCisJICAgIHJldCA9IGZiX2ZpbmRfbW9kZV9jdnQoJmN2dF9tb2RlLCBtYXJnaW5zLCByYik7CisKKwkgICAgaWYgKCFyZXQgJiYgIWZiX3RyeV9tb2RlKHZhciwgaW5mbywgJmN2dF9tb2RlLCBicHApKSB7CisJCURQUklOVEsoIm1vZGVkYiBDVlQ6IENWVCBtb2RlIG9rXG4iKTsKKwkJcmV0dXJuIDE7CisJICAgIH0KKworCSAgICBEUFJJTlRLKCJDVlQgbW9kZSBpbnZhbGlkLCBnZXR0aW5nIG1vZGUgZnJvbSBkYXRhYmFzZVxuIik7CisJfQorCiAJRFBSSU5USygiVHJ5aW5nIHNwZWNpZmllZCB2aWRlbyBtb2RlJXMgJWl4JWlcbiIsCiAJICAgIHJlZnJlc2hfc3BlY2lmaWVkID8gIiIgOiAiIChpZ25vcmluZyByZWZyZXNoIHJhdGUpIiwgeHJlcywgeXJlcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2kyYy5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaTJjLmMKaW5kZXggMzc1N2MxNC4uYWNlNDg0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaTJjLmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaTJjLmMKQEAgLTkwLDE0ICs5MCwxMyBAQAogCXJldHVybiB2YWw7CiB9CiAKLSNkZWZpbmUgSTJDX0FMR09fTlZJRElBICAgMHgwZTAwMDAKIHN0YXRpYyBpbnQgbnZpZGlhX3NldHVwX2kyY19idXMoc3RydWN0IG52aWRpYV9pMmNfY2hhbiAqY2hhbiwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlpbnQgcmM7CiAKIAlzdHJjcHkoY2hhbi0+YWRhcHRlci5uYW1lLCBuYW1lKTsKIAljaGFuLT5hZGFwdGVyLm93bmVyID0gVEhJU19NT0RVTEU7Ci0JY2hhbi0+YWRhcHRlci5pZCA9IEkyQ19BTEdPX05WSURJQTsKKwljaGFuLT5hZGFwdGVyLmlkID0gSTJDX0hXX0JfTlZJRElBOwogCWNoYW4tPmFkYXB0ZXIuYWxnb19kYXRhID0gJmNoYW4tPmFsZ287CiAJY2hhbi0+YWRhcHRlci5kZXYucGFyZW50ID0gJmNoYW4tPnBhci0+cGNpX2Rldi0+ZGV2OwogCWNoYW4tPmFsZ28uc2V0c2RhID0gbnZpZGlhX2dwaW9fc2V0c2RhOwpAQCAtMTk1LDggKzE5NCw5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLWludCBudmlkaWFfcHJvYmVfaTJjX2Nvbm5lY3RvcihzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyLCBpbnQgY29ubiwgdTggKipvdXRfZWRpZCkKK2ludCBudmlkaWFfcHJvYmVfaTJjX2Nvbm5lY3RvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IGNvbm4sIHU4ICoqb3V0X2VkaWQpCiB7CisJc3RydWN0IG52aWRpYV9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1OCAqZWRpZCA9IE5VTEw7CiAJaW50IGk7CiAKQEAgLTIwNiwxMCArMjA2LDE3IEBACiAJCWlmIChlZGlkKQogCQkJYnJlYWs7CiAJfQorCisJaWYgKCFlZGlkICYmIGNvbm4gPT0gMSkgeworCQkvKiB0cnkgdG8gZ2V0IGZyb20gZmlybXdhcmUgKi8KKwkJZWRpZCA9IGttYWxsb2MoRURJRF9MRU5HVEgsIEdGUF9LRVJORUwpOworCQlpZiAoZWRpZCkKKwkJCW1lbWNweShlZGlkLCBmYl9maXJtd2FyZV9lZGlkKGluZm8tPmRldmljZSksCisJCQkgICAgICAgRURJRF9MRU5HVEgpOworCX0KKwogCWlmIChvdXRfZWRpZCkKIAkJKm91dF9lZGlkID0gZWRpZDsKLQlpZiAoIWVkaWQpCi0JCXJldHVybiAxOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIChlZGlkKSA/IDAgOiAxOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfbG9jYWwuaCBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2xvY2FsLmgKaW5kZXggOWRhMzIwOS4uYWZlZTI4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfbG9jYWwuaAorKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9sb2NhbC5oCkBAIC05NSw2ICs5NSw3IEBACiAKICNkZWZpbmUgUkVBRF9HRVQocGFyKSAoTlZfUkQzMigmKHBhciktPkZJRk9bMHgwMDExXSwgMCkgPj4gMikKIAorI2lmZGVmIF9fTElUVExFX0VORElBTgogI2RlZmluZSByZXZlcnNlX29yZGVyKGwpICAgICAgICBcCiBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl1OCAqYSA9ICh1OCAqKShsKTsgICAgICBcCkBAIC0xMDMsNSArMTA0LDggQEAKIAkqYSA9IGJ5dGVfcmV2WyphXSwgYSsrOyBcCiAJKmEgPSBieXRlX3JldlsqYV07ICAgICAgXAogfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgcmV2ZXJzZV9vcmRlcihsKQorI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBfX0xJVFRMRV9FTkRJQU4gKi8KIAogI2VuZGlmCQkJCS8qIF9fTlZfTE9DQUxfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9vZi5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfb2YuYwppbmRleCA3ZDEyZWI4NS4uNGZhMmNmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfb2YuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9vZi5jCkBAIC0zMCw4ICszMCw5IEBACiB2b2lkIG52aWRpYV9jcmVhdGVfaTJjX2J1c3NlcyhzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyKSB7fQogdm9pZCBudmlkaWFfZGVsZXRlX2kyY19idXNzZXMoc3RydWN0IG52aWRpYV9wYXIgKnBhcikge30KIAotaW50IG52aWRpYV9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCBudmlkaWFfcGFyICpwYXIsIGludCBjb25uLCB1OCAqKm91dF9lZGlkKQoraW50IG52aWRpYV9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgY29ubiwgdTggKipvdXRfZWRpZCkKIHsKKwlzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAJdW5zaWduZWQgY2hhciAqcGVkaWQgPSBOVUxMOwogCXVuc2lnbmVkIGNoYXIgKmRpc3B0eXBlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3Byb3RvLmggYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9wcm90by5oCmluZGV4IDQyODQ3Y2UuLmNhYzQ0ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3Byb3RvLmgKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfcHJvdG8uaApAQCAtMzQsNyArMzQsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX0ZCX05WSURJQV9JMkMpIHx8IGRlZmluZWQgKENPTkZJR19QUENfT0YpCiB2b2lkIG52aWRpYV9jcmVhdGVfaTJjX2J1c3NlcyhzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyKTsKIHZvaWQgbnZpZGlhX2RlbGV0ZV9pMmNfYnVzc2VzKHN0cnVjdCBudmlkaWFfcGFyICpwYXIpOwotaW50IG52aWRpYV9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCBudmlkaWFfcGFyICpwYXIsIGludCBjb25uLAoraW50IG52aWRpYV9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgY29ubiwKIAkJCSAgICAgICB1OCAqKiBvdXRfZWRpZCk7CiAjZWxzZQogI2RlZmluZSBudmlkaWFfY3JlYXRlX2kyY19idXNzZXMoLi4uKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfc2V0dXAuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3NldHVwLmMKaW5kZXggMGJiZGNhMi4uMTFjODQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfc2V0dXAuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9zZXR1cC5jCkBAIC00MDEsNyArNDAxLDcgQEAKIAludmlkaWFfY3JlYXRlX2kyY19idXNzZXMocGFyKTsKIAlpZiAoIXBhci0+dHdvSGVhZHMpIHsKIAkJcGFyLT5DUlRDbnVtYmVyID0gMDsKLQkJbnZpZGlhX3Byb2JlX2kyY19jb25uZWN0b3IocGFyLCAxLCAmZWRpZEEpOworCQludmlkaWFfcHJvYmVfaTJjX2Nvbm5lY3RvcihpbmZvLCAxLCAmZWRpZEEpOwogCQlpZiAoZWRpZEEgJiYgIWZiX3BhcnNlX2VkaWQoZWRpZEEsICZ2YXIpKSB7CiAJCQlwcmludGsoIm52aWRpYWZiOiBFRElEIGZvdW5kIGZyb20gQlVTMVxuIik7CiAJCQltb25BID0gJm1vbml0b3JBOwpAQCAtNDg4LDE0ICs0ODgsMTQgQEAKIAkJb2xkaGVhZCA9IE5WX1JEMzIocGFyLT5QQ1JUQzAsIDB4MDAwMDA4NjApOwogCQlOVl9XUjMyKHBhci0+UENSVEMwLCAweDAwMDAwODYwLCBvbGRoZWFkIHwgMHgwMDAwMDAxMCk7CiAKLQkJbnZpZGlhX3Byb2JlX2kyY19jb25uZWN0b3IocGFyLCAxLCAmZWRpZEEpOworCQludmlkaWFfcHJvYmVfaTJjX2Nvbm5lY3RvcihpbmZvLCAxLCAmZWRpZEEpOwogCQlpZiAoZWRpZEEgJiYgIWZiX3BhcnNlX2VkaWQoZWRpZEEsICZ2YXIpKSB7CiAJCQlwcmludGsoIm52aWRpYWZiOiBFRElEIGZvdW5kIGZyb20gQlVTMVxuIik7CiAJCQltb25BID0gJm1vbml0b3JBOwogCQkJZmJfZWRpZF90b19tb25zcGVjcyhlZGlkQSwgbW9uQSk7CiAJCX0KIAotCQludmlkaWFfcHJvYmVfaTJjX2Nvbm5lY3RvcihwYXIsIDIsICZlZGlkQik7CisJCW52aWRpYV9wcm9iZV9pMmNfY29ubmVjdG9yKGluZm8sIDIsICZlZGlkQik7CiAJCWlmIChlZGlkQiAmJiAhZmJfcGFyc2VfZWRpZChlZGlkQiwgJnZhcikpIHsKIAkJCXByaW50aygibnZpZGlhZmI6IEVESUQgZm91bmQgZnJvbSBCVVMyXG4iKTsKIAkJCW1vbkIgPSAmbW9uaXRvckI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCmluZGV4IDUyYjE2ODUuLjM2MjBkZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCkBAIC02NTgsNyArNjU4LDcgQEAKIHsKIAlzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXN0cnVjdCBfcml2YV9od19zdGF0ZSAqc3RhdGUgPSAmcGFyLT5Nb2RlUmVnOwotCWludCBpLCBkZXB0aCA9IGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyKTsKKwlpbnQgaSwgZGVwdGggPSBmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhciwgJmluZm8tPmZpeCk7CiAJaW50IGhfZGlzcGxheSA9IGluZm8tPnZhci54cmVzIC8gOCAtIDE7CiAJaW50IGhfc3RhcnQgPSAoaW5mby0+dmFyLnhyZXMgKyBpbmZvLT52YXIucmlnaHRfbWFyZ2luKSAvIDggLSAxOwogCWludCBoX2VuZCA9IChpbmZvLT52YXIueHJlcyArIGluZm8tPnZhci5yaWdodF9tYXJnaW4gKwpAQCAtODkzLDcgKzg5Myw3IEBACiAJaW50IGksIHNldCA9IGN1cnNvci0+c2V0OwogCXUxNiBmZywgYmc7CiAKLQlpZiAoY3Vyc29yLT5pbWFnZS53aWR0aCA+IE1BWF9DVVJTIHx8IGN1cnNvci0+aW1hZ2UuaGVpZ2h0ID4gTUFYX0NVUlMpCisJaWYgKCFod2N1ciB8fCBjdXJzb3ItPmltYWdlLndpZHRoID4gTUFYX0NVUlMgfHwgY3Vyc29yLT5pbWFnZS5oZWlnaHQgPiBNQVhfQ1VSUykKIAkJcmV0dXJuIC1FTlhJTzsKIAogCU5WU2hvd0hpZGVDdXJzb3IocGFyLCAwKTsKQEAgLTk3OCw2ICs5NzgsOSBAQAogCSAgICAhcGFyLT50d29IZWFkcykKIAkJcGFyLT5GUERpdGhlciA9IDA7CiAKKwlpbmZvLT5maXgudmlzdWFsID0gKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSA4KSA/CisJICAgIEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiA6IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUjsKKwogCW52aWRpYV9pbml0X3ZnYShpbmZvKTsKIAludmlkaWFfY2FsY19yZWdzKGluZm8pOwogCW52aWRpYV93cml0ZV9yZWdzKHBhcik7CkBAIC05OTIsOSArOTk1LDYgQEAKIAlOVldyaXRlQ3J0YyhwYXIsIDB4MTEsIDB4MDApOwogCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IChpbmZvLT52YXIueHJlc192aXJ0dWFsICoKIAkJCQkgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSA+PiAzOwotCWluZm8tPmZpeC52aXN1YWwgPSAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDgpID8KLQkgICAgRkJfVklTVUFMX1BTRVVET0NPTE9SIDogRkJfVklTVUFMX0RJUkVDVENPTE9SOwotCiAJaWYgKGluZm8tPnZhci5hY2NlbF9mbGFncykgewogCQlpbmZvLT5mYm9wcy0+ZmJfaW1hZ2VibGl0ID0gbnZpZGlhZmJfaW1hZ2VibGl0OwogCQlpbmZvLT5mYm9wcy0+ZmJfZmlsbHJlY3QgPSBudmlkaWFmYl9maWxscmVjdDsKQEAgLTEzMjgsNyArMTMyOCw3IEBACiAJCWNoYXIgYnVmWzE2XTsKIAogCQltZW1zZXQoYnVmLCAwLCAxNik7Ci0JCXNucHJpbnRmKGJ1ZiwgMTUsICIlZHglZCIsIHBhci0+ZnBXaWR0aCwgcGFyLT5mcEhlaWdodCk7CisJCXNucHJpbnRmKGJ1ZiwgMTUsICIlZHglZE1SIiwgcGFyLT5mcFdpZHRoLCBwYXItPmZwSGVpZ2h0KTsKIAkJZmJfZmluZF9tb2RlKCZudmlkaWFmYl9kZWZhdWx0X3ZhciwgaW5mbywgYnVmLCBzcGVjcy0+bW9kZWRiLAogCQkJICAgICBzcGVjcy0+bW9kZWRiX2xlbiwgJm1vZGVkYiwgOCk7CiAJfQpAQCAtMTM1Niw4ICsxMzU2LDYgQEAKIAlpbmZvLT5waXhtYXAuc2l6ZSA9IDggKiAxMDI0OwogCWluZm8tPnBpeG1hcC5mbGFncyA9IEZCX1BJWE1BUF9TWVNURU07CiAKLQlpZiAoIWh3Y3VyKQotCQlpbmZvLT5mYm9wcy0+ZmJfY3Vyc29yID0gc29mdF9jdXJzb3I7CiAJaW5mby0+dmFyLmFjY2VsX2ZsYWdzID0gKCFub2FjY2VsKTsKIAogCXN3aXRjaCAocGFyLT5BcmNoaXRlY3R1cmUpIHsKQEAgLTE0NzMsMTAgKzE0NzEsNiBAQAogCXBhci0+Q2hpcHNldCA9IChwZC0+dmVuZG9yIDw8IDE2KSB8IHBkLT5kZXZpY2U7CiAJcHJpbnRrKEtFUk5fSU5GTyBQRlggIm5WaWRpYSBkZXZpY2UvY2hpcHNldCAlWFxuIiwgcGFyLT5DaGlwc2V0KTsKIAotI2lmZGVmIENPTkZJR19QQ0lfTkFNRVMKLQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXNcbiIsIHBkLT5wcmV0dHlfbmFtZSk7Ci0jZW5kaWYKLQogCWlmIChwYXItPkFyY2hpdGVjdHVyZSA9PSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggInVua25vd24gTlZfQVJDSFxuIik7CiAJCWdvdG8gZXJyX291dF9mcmVlX2Jhc2UwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vZmZiLmMgYi9kcml2ZXJzL3ZpZGVvL29mZmIuYwppbmRleCA0MmE2NTkxLi42MTE5MjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29mZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL29mZmIuYwpAQCAtMzYzLDcgKzM2Myw3IEBACiAJCWFkZHJlc3MgPSAodV9sb25nKSBkcC0+YWRkcnNbaV0uYWRkcmVzczsKIAogI2lmZGVmIENPTkZJR19QUEM2NAotCQlhZGRyZXNzICs9IGRwLT5waGItPnBjaV9tZW1fb2Zmc2V0OworCQlhZGRyZXNzICs9ICgoc3RydWN0IHBjaV9kbiAqKWRwLT5kYXRhKS0+cGhiLT5wY2lfbWVtX29mZnNldDsKICNlbmRpZgogCiAJCS8qIGtsdWRnZSBmb3IgdmFsa3lyaWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG1hZy1hYS1mYi5jIGIvZHJpdmVycy92aWRlby9wbWFnLWFhLWZiLmMKaW5kZXggM2UwMGFkNy4uMjhkMWZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbWFnLWFhLWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbWFnLWFhLWZiLmMKQEAgLTQxMyw3ICs0MTMsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X29uZShpbnQgc2xvdCkKIHsKLQl1bnNpZ25lZCBsb25nIGJhc2VfYWRkciA9IGdldF90Y19iYXNlX2FkZHIoc2xvdCk7CisJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHIgPSBDS1NFRzFBRERSKGdldF90Y19iYXNlX2FkZHIoc2xvdCkpOwogCXN0cnVjdCBhYWZiX2luZm8gKmlwID0gJm15X2ZiX2luZm9bc2xvdF07CiAKIAltZW1zZXQoaXAsIDAsIHNpemVvZihzdHJ1Y3QgYWFmYl9pbmZvKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BtYWctYmEtZmIuYyBiL2RyaXZlcnMvdmlkZW8vcG1hZy1iYS1mYi5jCmluZGV4IGY4MDk1NTguLmM5OGYxYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcG1hZy1iYS1mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcG1hZy1iYS1mYi5jCkBAIC0xLDU3ICsxLDU1IEBACiAvKgotICogICAgICBsaW51eC9kcml2ZXJzL3ZpZGVvL3BtYWctYmEtZmIuYworICoJbGludXgvZHJpdmVycy92aWRlby9wbWFnLWJhLWZiLmMKICAqCi0gKglQTUFHLUJBIFR1cmJvQ2hhbm5lbCBmcmFtZWJ1ZmZlciBjYXJkIHN1cHBvcnQgLi4uIGRlcml2ZWQgZnJvbToKKyAqCVBNQUctQkEgVFVSQk9jaGFubmVsIENvbG9yIEZyYW1lIEJ1ZmZlciAoQ0ZCKSBjYXJkIHN1cHBvcnQsCisgKglkZXJpdmVkIGZyb206CiAgKgkiSFAzMDAgVG9wY2F0IGZyYW1lYnVmZmVyIHN1cHBvcnQgKGRlcml2ZWQgZnJvbSBtYWNmYiBvZiBhbGwgdGhpbmdzKQogICoJUGhpbCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4gMTk5OCIsIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZQotICogICAgICBmb3VuZCBpbiB0aGUgZmlsZSBocGZiLmMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoJZm91bmQgaW4gdGhlIGZpbGUgaHBmYi5jIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KICAqCiAgKglCYXNlZCBvbiBkaWdpdGFsIGRvY3VtZW50OgogICogCSJQTUFHLUJBIFRVUkJPY2hhbm5lbCBDb2xvciBGcmFtZSBCdWZmZXIKICAqCSBGdW5jdGlvbmFsIFNwZWNpZmljYXRpb24iLCBSZXZpc2lvbiAxLjIsIEF1Z3VzdCAyNywgMTk5MAogICoKLSAqICAgICAgREVDc3RhdGlvbiByZWxhdGVkIGNvZGUgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxIGJ5Ci0gKiAgICAgIE1pY2hhZWwgRW5nZWwgPGVuZ2VsQHVuaXgtYWcub3JnPiwgCi0gKiAgICAgIEthcnN0ZW4gTWVya2VyIDxtZXJrZXJAbGludXh0YWcub3JnPiBhbmQKKyAqCURFQ3N0YXRpb24gcmVsYXRlZCBjb2RlIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSBieQorICoJTWljaGFlbCBFbmdlbCA8ZW5nZWxAdW5peC1hZy5vcmc+LAorICoJS2Fyc3RlbiBNZXJrZXIgPG1lcmtlckBsaW51eHRhZy5vcmc+IGFuZAogICoJSGFyYWxkIEtvZXJmZ2VuLgotICogICAgICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCi0gKiAgICAgIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKLSAqICAgICAgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoJQ29weXJpZ2h0IChjKSAyMDA1ICBNYWNpZWogVy4gUm96eWNraQogICoKKyAqCVRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqCVB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKKyAqCWFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgotI2luY2x1ZGUgPGFzbS9kZWMvbWFjaHR5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9idWcuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKICNpbmNsdWRlIDxhc20vZGVjL3RjLmg+CisKICNpbmNsdWRlIDx2aWRlby9wbWFnLWJhLWZiLmg+CiAKLXN0cnVjdCBwbWFnX2JhX3JhbWRhY19yZWdzIHsKLQl1bnNpZ25lZCBjaGFyIGFkZHJfbG93OwotCXVuc2lnbmVkIGNoYXIgcGFkMFszXTsKLQl1bnNpZ25lZCBjaGFyIGFkZHJfaGk7Ci0JdW5zaWduZWQgY2hhciBwYWQxWzNdOwotCXVuc2lnbmVkIGNoYXIgZGF0YTsKLQl1bnNpZ25lZCBjaGFyIHBhZDJbM107Ci0JdW5zaWduZWQgY2hhciBjbWFwOworCitzdHJ1Y3QgcG1hZ2JhZmJfcGFyIHsKKwlzdHJ1Y3QgZmJfaW5mbyAqbmV4dDsKKwl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKm1taW87CisJdm9sYXRpbGUgdTMyIF9faW9tZW0gKmRhYzsKKwlpbnQgc2xvdDsKIH07CiAKLS8qCi0gKiBNYXggMyBUVVJCT2NoYW5uZWwgc2xvdHMgLT4gbWF4IDMgUE1BRy1CQSA6KQotICovCi1zdGF0aWMgc3RydWN0IGZiX2luZm8gcG1hZ2JhX2ZiX2luZm9bM107CiAKLXN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gcG1hZ2JhZmJfZGVmaW5lZCA9IHsKK3N0YXRpYyBzdHJ1Y3QgZmJfaW5mbyAqcm9vdF9wbWFnYmFmYl9kZXY7CisKK3N0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gcG1hZ2JhZmJfZGVmaW5lZCBfX2luaXRkYXRhID0gewogCS54cmVzCQk9IDEwMjQsCiAJLnlyZXMJCT0gODY0LAogCS54cmVzX3ZpcnR1YWwJPSAxMDI0LApAQCAtNjEsNTggKzU5LDcxIEBACiAJLmdyZWVuLmxlbmd0aAk9IDgsCiAJLmJsdWUubGVuZ3RoCT0gOCwKIAkuYWN0aXZhdGUJPSBGQl9BQ1RJVkFURV9OT1csCi0JLmhlaWdodAkJPSAyNzQsCi0JLndpZHRoCQk9IDE5NSwKLQkuYWNjZWwJCT0gRkJfQUNDRUxfTk9ORSwKKwkuaGVpZ2h0CQk9IC0xLAorCS53aWR0aAkJPSAtMSwKKwkuYWNjZWxfZmxhZ3MJPSBGQl9BQ0NFTF9OT05FLAorCS5waXhjbG9jawk9IDE0NDUyLAorCS5sZWZ0X21hcmdpbgk9IDExNiwKKwkucmlnaHRfbWFyZ2luCT0gMTIsCisJLnVwcGVyX21hcmdpbgk9IDM0LAorCS5sb3dlcl9tYXJnaW4JPSAxMiwKKwkuaHN5bmNfbGVuCT0gMTI4LAorCS52c3luY19sZW4JPSAzLAorCS5zeW5jCQk9IEZCX1NZTkNfT05fR1JFRU4sCiAJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHBtYWdiYWZiX2ZpeCA9IHsKK3N0YXRpYyBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gcG1hZ2JhZmJfZml4IF9faW5pdGRhdGEgPSB7CiAJLmlkCQk9ICJQTUFHLUJBIiwKLQkuc21lbV9sZW4JPSAoMTAyNCAqIDg2NCksCisJLnNtZW1fbGVuCT0gKDEwMjQgKiAxMDI0KSwKIAkudHlwZQkJPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCiAJLnZpc3VhbAkJPSBGQl9WSVNVQUxfUFNFVURPQ09MT1IsCiAJLmxpbmVfbGVuZ3RoCT0gMTAyNCwKKwkubW1pb19sZW4JPSBQTUFHX0JBX1NJWkUgLSBQTUFHX0JBX0JUNDU5LAogfTsKIAotLyoKLSAqIFR1cm4gaGFyZHdhcmUgY3Vyc29yIG9mZgotICovCi12b2lkIHBtYWdiYWZiX2VyYXNlX2N1cnNvcihzdHJ1Y3QgcG1hZ19iYV9yYW1kYWNfcmVncyAqYnQ0NTlfcmVncykKKworc3RhdGljIGlubGluZSB2b2lkIGRhY193cml0ZShzdHJ1Y3QgcG1hZ2JhZmJfcGFyICpwYXIsIHVuc2lnbmVkIGludCByZWcsIHU4IHYpCiB7Ci0JYnQ0NTlfcmVncy0+YWRkcl9sb3cgPSAwOwotCWJ0NDU5X3JlZ3MtPmFkZHJfaGkgPSAzOwotCWJ0NDU5X3JlZ3MtPmRhdGEgPSAwOworCXdyaXRlYih2LCBwYXItPmRhYyArIHJlZyAvIDQpOwogfQogCi0vKgotICogU2V0IHRoZSBwYWxldHRlLiAKLSAqLwotc3RhdGljIGludCBwbWFnYmFmYl9zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCi0JCQkgICAgICB1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCi0JCQkgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbmxpbmUgdTggZGFjX3JlYWQoc3RydWN0IHBtYWdiYWZiX3BhciAqcGFyLCB1bnNpZ25lZCBpbnQgcmVnKQogewotCXN0cnVjdCBwbWFnX2JhX3JhbWRhY19yZWdzICpidDQ1OV9yZWdzID0gKHN0cnVjdCBwbWFnX2JhX3JhbWRhY19yZWdzICopIGluZm8tPnBhcjsKKwlyZXR1cm4gcmVhZGIocGFyLT5kYWMgKyByZWcgLyA0KTsKK30KIAotCWlmIChyZWdubyA+PSBpbmZvLT5jbWFwLmxlbikKLQkJcmV0dXJuIDE7CisKKy8qCisgKiBTZXQgdGhlIHBhbGV0dGUuCisgKi8KK3N0YXRpYyBpbnQgcG1hZ2JhZmJfc2V0Y29scmVnKHVuc2lnbmVkIGludCByZWdubywgdW5zaWduZWQgaW50IHJlZCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBncmVlbiwgdW5zaWduZWQgaW50IGJsdWUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcG1hZ2JhZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwlCVUdfT04ocmVnbm8gPj0gaW5mby0+Y21hcC5sZW4pOwogCiAJcmVkICAgPj49IDg7CS8qIFRoZSBjbWFwIGZpZWxkcyBhcmUgMTYgYml0cyAgICAqLwotCWdyZWVuID4+PSA4OwkvKiB3aWRlLCBidXQgdGhlIGhhcndhcmUgY29sb3JtYXAgKi8KKwlncmVlbiA+Pj0gODsJLyogd2lkZSwgYnV0IHRoZSBoYXJkd2FyZSBjb2xvcm1hcCAqLwogCWJsdWUgID4+PSA4OwkvKiByZWdpc3RlcnMgYXJlIG9ubHkgOCBiaXRzIHdpZGUgKi8KIAotCWJ0NDU5X3JlZ3MtPmFkZHJfbG93ID0gKF9fdTgpIHJlZ25vOwotCWJ0NDU5X3JlZ3MtPmFkZHJfaGkgPSAwOwotCWJ0NDU5X3JlZ3MtPmNtYXAgPSByZWQ7Ci0JYnQ0NTlfcmVncy0+Y21hcCA9IGdyZWVuOwotCWJ0NDU5X3JlZ3MtPmNtYXAgPSBibHVlOworCW1iKCk7CisJZGFjX3dyaXRlKHBhciwgQlQ0NTlfQUREUl9MTywgcmVnbm8pOworCWRhY193cml0ZShwYXIsIEJUNDU5X0FERFJfSEksIDB4MDApOworCXdtYigpOworCWRhY193cml0ZShwYXIsIEJUNDU5X0NNQVAsIHJlZCk7CisJd21iKCk7CisJZGFjX3dyaXRlKHBhciwgQlQ0NTlfQ01BUCwgZ3JlZW4pOworCXdtYigpOworCWRhY193cml0ZShwYXIsIEJUNDU5X0NNQVAsIGJsdWUpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHBtYWdiYWZiX29wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLmZiX2dldF9maXgJPSBnZW5fZ2V0X2ZpeCwKLQkuZmJfZ2V0X3Zhcgk9IGdlbl9nZXRfdmFyLAogCS5mYl9zZXRjb2xyZWcJPSBwbWFnYmFmYl9zZXRjb2xyZWcsCiAJLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAogCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKQEAgLTEyMCw2MyArMTMxLDEzMyBAQAogCS5mYl9jdXJzb3IJPSBzb2Z0X2N1cnNvciwKIH07CiAKLWludCBfX2luaXQgcG1hZ2JhZmJfaW5pdF9vbmUoaW50IHNsb3QpCisKKy8qCisgKiBUdXJuIHRoZSBoYXJkd2FyZSBjdXJzb3Igb2ZmLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcG1hZ2JhZmJfZXJhc2VfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyID0gZ2V0X3RjX2Jhc2VfYWRkcihzbG90KTsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9ICZwbWFnYmFfZmJfaW5mb1tzbG90XTsgCi0Jc3RydWN0IGRpc3BsYXkgKmRpc3AgPSAmcG1hZ2JhX2Rpc3Bbc2xvdF07CisJc3RydWN0IHBtYWdiYWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCi0JcHJpbnRrKCJQTUFHLUJBIGZyYW1lYnVmZmVyIGluIHNsb3QgJWRcbiIsIHNsb3QpOwotCS8qCi0JICogRnJhbWVidWZmZXIgZGlzcGxheSBtZW1vcnkgYmFzZSBhZGRyZXNzIGFuZCBmcmllbmRzCi0JICovCi0JcG1hZ2JhZmJfZml4LnNtZW1fc3RhcnQgPSBiYXNlX2FkZHIgKyBQTUFHX0JBX09OQk9BUkRfRkJNRU1fT0ZGU0VUOwotCWluZm8tPnBhciA9IChiYXNlX2FkZHIgKyBQTUFHX0JBX0JUNDU5X09GRlNFVCk7CisJbWIoKTsKKwlkYWNfd3JpdGUocGFyLCBCVDQ1OV9BRERSX0xPLCAweDAwKTsKKwlkYWNfd3JpdGUocGFyLCBCVDQ1OV9BRERSX0hJLCAweDAzKTsKKwl3bWIoKTsKKwlkYWNfd3JpdGUocGFyLCBCVDQ1OV9EQVRBLCAweDAwKTsKK30KIAotCS8qCi0JICogQ29uZmlndXJlIHRoZSBCdDQ1OSBSQU0gREFDCi0JICovCi0JcG1hZ2JhZmJfZXJhc2VfY3Vyc29yKChzdHJ1Y3QgcG1hZ19iYV9yYW1kYWNfcmVncyAqKSBpbmZvLT5wYXIpOwogCi0JLyoKLQkgKiAgICAgIExldCB0aGVyZSBiZSBjb25zb2xlcy4uCi0JICovCitzdGF0aWMgaW50IF9faW5pdCBwbWFnYmFmYl9pbml0X29uZShpbnQgc2xvdCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcG1hZ2JhZmJfcGFyICpwYXI7CisJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHI7CisKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbWFnYmFmYl9wYXIpLCBOVUxMKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJcGFyID0gaW5mby0+cGFyOworCXBhci0+c2xvdCA9IHNsb3Q7CisJY2xhaW1fdGNfY2FyZChwYXItPnNsb3QpOworCisJYmFzZV9hZGRyID0gZ2V0X3RjX2Jhc2VfYWRkcihwYXItPnNsb3QpOworCisJcGFyLT5uZXh0ID0gcm9vdF9wbWFnYmFmYl9kZXY7CisJcm9vdF9wbWFnYmFmYl9kZXYgPSBpbmZvOworCisJaWYgKGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCkgPCAwKQorCQlnb3RvIGVycl9hbGxvYzsKKwogCWluZm8tPmZib3BzID0gJnBtYWdiYWZiX29wczsKKwlpbmZvLT5maXggPSBwbWFnYmFmYl9maXg7CiAJaW5mby0+dmFyID0gcG1hZ2JhZmJfZGVmaW5lZDsKLQlpbmZvLT5maXggPSBwbWFnYmFmYl9maXg7IAotCWluZm8tPnNjcmVlbl9iYXNlID0gcG1hZ2JhZmJfZml4LnNtZW1fc3RhcnQ7CiAJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVDsKIAotCWZiX2FsbG9jX2NtYXAoJmZiX2luZm8uY21hcCwgMjU2LCAwKTsKKwkvKiBNTUlPIG1hcHBpbmcgc2V0dXAuICAqLworCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gYmFzZV9hZGRyOworCXBhci0+bW1pbyA9IGlvcmVtYXBfbm9jYWNoZShpbmZvLT5maXgubW1pb19zdGFydCwgaW5mby0+Zml4Lm1taW9fbGVuKTsKKwlpZiAoIXBhci0+bW1pbykKKwkJZ290byBlcnJfY21hcDsKKwlwYXItPmRhYyA9IHBhci0+bW1pbyArIFBNQUdfQkFfQlQ0NTk7CisKKwkvKiBGcmFtZSBidWZmZXIgbWFwcGluZyBzZXR1cC4gICovCisJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBiYXNlX2FkZHIgKyBQTUFHX0JBX0ZCTUVNOworCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKGluZm8tPmZpeC5zbWVtX3N0YXJ0LAorCQkJCQkgICAgaW5mby0+Zml4LnNtZW1fbGVuKTsKKwlpZiAoIWluZm8tPnNjcmVlbl9iYXNlKQorCQlnb3RvIGVycl9tbWlvX21hcDsKKwlpbmZvLT5zY3JlZW5fc2l6ZSA9IGluZm8tPmZpeC5zbWVtX2xlbjsKKworCXBtYWdiYWZiX2VyYXNlX2N1cnNvcihpbmZvKTsKIAogCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSA8IDApCi0JCXJldHVybiAxOworCQlnb3RvIGVycl9zbWVtX21hcDsKKworCXByX2luZm8oImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2UgaW4gc2xvdCAlZFxuIiwKKwkJaW5mby0+bm9kZSwgaW5mby0+Zml4LmlkLCBwYXItPnNsb3QpOworCiAJcmV0dXJuIDA7CisKKworZXJyX3NtZW1fbWFwOgorCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOworCitlcnJfbW1pb19tYXA6CisJaW91bm1hcChwYXItPm1taW8pOworCitlcnJfY21hcDoKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCitlcnJfYWxsb2M6CisJcm9vdF9wbWFnYmFmYl9kZXYgPSBwYXItPm5leHQ7CisJcmVsZWFzZV90Y19jYXJkKHBhci0+c2xvdCk7CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwlyZXR1cm4gLUVOWElPOwogfQogCi0vKiAKLSAqIEluaXRpYWxpc2UgdGhlIGZyYW1lYnVmZmVyCi0gKi8KLQotaW50IF9faW5pdCBwbWFnYmFmYl9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgcG1hZ2JhZmJfZXhpdF9vbmUodm9pZCkKIHsKLQlpbnQgc2lkOwotCWludCBmb3VuZCA9IDA7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSByb290X3BtYWdiYWZiX2RldjsKKwlzdHJ1Y3QgcG1hZ2JhZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOworCWlvdW5tYXAocGFyLT5tbWlvKTsKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCXJvb3RfcG1hZ2JhZmJfZGV2ID0gcGFyLT5uZXh0OworCXJlbGVhc2VfdGNfY2FyZChwYXItPnNsb3QpOworCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Cit9CisKKworLyoKKyAqIEluaXRpYWxpc2UgdGhlIGZyYW1lYnVmZmVyLgorICovCitzdGF0aWMgaW50IF9faW5pdCBwbWFnYmFmYl9pbml0KHZvaWQpCit7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgc2xvdDsKIAogCWlmIChmYl9nZXRfb3B0aW9ucygicG1hZ2JhZmIiLCBOVUxMKSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiAtRU5YSU87CiAKLQlpZiAoVFVSQk9DSEFOTkVMKSB7Ci0JCXdoaWxlICgoc2lkID0gc2VhcmNoX3RjX2NhcmQoIlBNQUctQkEiKSkgPj0gMCkgewotCQkJZm91bmQgPSAxOwotCQkJY2xhaW1fdGNfY2FyZChzaWQpOwotCQkJcG1hZ2JhZmJfaW5pdF9vbmUoc2lkKTsKLQkJfQotCQlyZXR1cm4gZm91bmQgPyAwIDogLUVOT0RFVjsKLQl9IGVsc2UgewotCQlyZXR1cm4gLUVOT0RFVjsKKwl3aGlsZSAoKHNsb3QgPSBzZWFyY2hfdGNfY2FyZCgiUE1BRy1CQSIpKSA+PSAwKSB7CisJCWlmIChwbWFnYmFmYl9pbml0X29uZShzbG90KSA8IDApCisJCQlicmVhazsKKwkJY291bnQrKzsKIAl9CisJcmV0dXJuIChjb3VudCA+IDApID8gMCA6IC1FTlhJTzsKIH0KIAorc3RhdGljIHZvaWQgX19leGl0IHBtYWdiYWZiX2V4aXQodm9pZCkKK3sKKwl3aGlsZSAocm9vdF9wbWFnYmFmYl9kZXYpCisJCXBtYWdiYWZiX2V4aXRfb25lKCk7Cit9CisKKwogbW9kdWxlX2luaXQocG1hZ2JhZmJfaW5pdCk7Cittb2R1bGVfZXhpdChwbWFnYmFmYl9leGl0KTsKKwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbWFnYi1iLWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BtYWdiLWItZmIuYwppbmRleCBkMTRlYWVlLi5hNDgzYjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BtYWdiLWItZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BtYWdiLWItZmIuYwpAQCAtMSwxMTQgKzEsMTI4IEBACiAvKgotICogICAgICBsaW51eC9kcml2ZXJzL3ZpZGVvL3BtYWdiLWItZmIuYworICoJbGludXgvZHJpdmVycy92aWRlby9wbWFnYi1iLWZiLmMKICAqCi0gKglQTUFHQi1CIFR1cmJvQ2hhbm5lbCBmcmFtZWJ1ZmZlciBjYXJkIHN1cHBvcnQgLi4uIGRlcml2ZWQgZnJvbToKKyAqCVBNQUdCLUIgVFVSQk9jaGFubmVsIFNtYXJ0IEZyYW1lIEJ1ZmZlciAoU0ZCKSBjYXJkIHN1cHBvcnQsCisgKglkZXJpdmVkIGZyb206CiAgKgkiSFAzMDAgVG9wY2F0IGZyYW1lYnVmZmVyIHN1cHBvcnQgKGRlcml2ZWQgZnJvbSBtYWNmYiBvZiBhbGwgdGhpbmdzKQogICoJUGhpbCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4gMTk5OCIsIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZQotICogICAgICBmb3VuZCBpbiB0aGUgZmlsZSBocGZiLmMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorICoJZm91bmQgaW4gdGhlIGZpbGUgaHBmYi5jIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KICAqCi0gKiAgICAgIERFQ3N0YXRpb24gcmVsYXRlZCBjb2RlIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSBieQotICogICAgICBNaWNoYWVsIEVuZ2VsIDxlbmdlbEB1bml4LWFnLm9yZz4sCi0gKiAgICAgIEthcnN0ZW4gTWVya2VyIDxtZXJrZXJAbGludXh0YWcub3JnPiBhbmQgCisgKglERUNzdGF0aW9uIHJlbGF0ZWQgY29kZSBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEgYnkKKyAqCU1pY2hhZWwgRW5nZWwgPGVuZ2VsQHVuaXgtYWcub3JnPiwKKyAqCUthcnN0ZW4gTWVya2VyIDxtZXJrZXJAbGludXh0YWcub3JnPiBhbmQKICAqCUhhcmFsZCBLb2VyZmdlbi4KLSAqICAgICAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAotICogICAgICBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzCi0gKiAgICAgIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCUNvcHlyaWdodCAoYykgMjAwNSAgTWFjaWVqIFcuIFJvenlja2kKICAqCisgKglUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKglQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzCisgKglhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotLyoKLSAqICAgICAgV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgUE1BR0ItQiBpbiBoaWdoIHJlc29sdXRpb24gbW9kZQotICogICAgICBhcyBJIGtub3cgb2Ygbm8gd2F5IHRvIGRldGVjdCBsb3cgcmVzb2x1dGlvbiBtb2RlIHNldCB2aWEganVtcGVyLgotICogICAgICBLTSwgMjAwMS8wMS8wNwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KLSNpbmNsdWRlIDxhc20vZGVjL21hY2h0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vYnVnLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCiAjaW5jbHVkZSA8YXNtL2RlYy90Yy5oPgorCiAjaW5jbHVkZSA8dmlkZW8vcG1hZ2ItYi1mYi5oPgogCi1zdHJ1Y3QgcG1hZ2JfYl9yYW1kYWNfcmVncyB7Ci0JdW5zaWduZWQgY2hhciBhZGRyX2xvdzsKLQl1bnNpZ25lZCBjaGFyIHBhZDBbM107Ci0JdW5zaWduZWQgY2hhciBhZGRyX2hpOwotCXVuc2lnbmVkIGNoYXIgcGFkMVszXTsKLQl1bnNpZ25lZCBjaGFyIGRhdGE7Ci0JdW5zaWduZWQgY2hhciBwYWQyWzNdOwotCXVuc2lnbmVkIGNoYXIgY21hcDsKKworc3RydWN0IHBtYWdiYmZiX3BhciB7CisJc3RydWN0IGZiX2luZm8gKm5leHQ7CisJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICptbWlvOworCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqc21lbTsKKwl2b2xhdGlsZSB1MzIgX19pb21lbSAqc2ZiOworCXZvbGF0aWxlIHUzMiBfX2lvbWVtICpkYWM7CisJdW5zaWduZWQgaW50IG9zYzA7CisJdW5zaWduZWQgaW50IG9zYzE7CisJaW50IHNsb3Q7CiB9OwogCi0vKgotICogTWF4IDMgVFVSQk9jaGFubmVsIHNsb3RzIC0+IG1heCAzIFBNQUdCLUIgOikKLSAqLwotc3RhdGljIHN0cnVjdCBmYl9pbmZvIHBtYWdiYl9mYl9pbmZvWzNdOwogCi1zdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHBtYWdiYmZiX2RlZmluZWQgPSB7Ci0JLnhyZXMJCT0gMTI4MCwKLQkueXJlcwkJPSAxMDI0LAotCS54cmVzX3ZpcnR1YWwJPSAxMjgwLAotCS55cmVzX3ZpcnR1YWwJPSAxMDI0LAorc3RhdGljIHN0cnVjdCBmYl9pbmZvICpyb290X3BtYWdiYmZiX2RldjsKKworc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBwbWFnYmJmYl9kZWZpbmVkIF9faW5pdGRhdGEgPSB7CiAJLmJpdHNfcGVyX3BpeGVsCT0gOCwKIAkucmVkLmxlbmd0aAk9IDgsCiAJLmdyZWVuLmxlbmd0aAk9IDgsCiAJLmJsdWUubGVuZ3RoCT0gOCwKIAkuYWN0aXZhdGUJPSBGQl9BQ1RJVkFURV9OT1csCi0JLmhlaWdodAkJPSAyNzQsCi0JLndpZHRoCQk9IDE5NSwKKwkuaGVpZ2h0CQk9IC0xLAorCS53aWR0aAkJPSAtMSwKIAkuYWNjZWxfZmxhZ3MJPSBGQl9BQ0NFTF9OT05FLAorCS5zeW5jCQk9IEZCX1NZTkNfT05fR1JFRU4sCiAJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHBtYWdiYWZiX2ZpeCA9IHsKK3N0YXRpYyBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gcG1hZ2JiZmJfZml4IF9faW5pdGRhdGEgPSB7CiAJLmlkCQk9ICJQTUFHQi1CQSIsCi0JLnNtZW1fbGVuCT0gKDEyODAgKiAxMDI0KSwKKwkuc21lbV9sZW4JPSAoMjA0OCAqIDEwMjQpLAogCS50eXBlCQk9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUywKIAkudmlzdWFsCQk9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiwKLQkubGluZV9sZW5ndGgJPSAxMjgwLAorCS5tbWlvX2xlbgk9IFBNQUdCX0JfRkJNRU0sCit9OworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZmJfd3JpdGUoc3RydWN0IHBtYWdiYmZiX3BhciAqcGFyLCB1bnNpZ25lZCBpbnQgcmVnLCB1MzIgdikKK3sKKwl3cml0ZWwodiwgcGFyLT5zZmIgKyByZWcgLyA0KTsKIH0KIAotLyoKLSAqIFR1cm4gaGFyZHdhcmUgY3Vyc29yIG9mZgotICovCi12b2lkIHBtYWdiYmZiX2VyYXNlX2N1cnNvcihzdHJ1Y3QgcG1hZ2JfYl9yYW1kYWNfcmVncyAqYnQ0NTlfcmVncykKK3N0YXRpYyBpbmxpbmUgdTMyIHNmYl9yZWFkKHN0cnVjdCBwbWFnYmJmYl9wYXIgKnBhciwgdW5zaWduZWQgaW50IHJlZykKIHsKLQlidDQ1OV9yZWdzLT5hZGRyX2xvdyA9IDA7Ci0JYnQ0NTlfcmVncy0+YWRkcl9oaSA9IDM7Ci0JYnQ0NTlfcmVncy0+ZGF0YSA9IDA7CisJcmV0dXJuIHJlYWRsKHBhci0+c2ZiICsgcmVnIC8gNCk7CiB9CiAKLS8qCi0gKiBTZXQgdGhlIHBhbGV0dGUuIAotICovCi1zdGF0aWMgaW50IHBtYWdiYmZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGlubGluZSB2b2lkIGRhY193cml0ZShzdHJ1Y3QgcG1hZ2JiZmJfcGFyICpwYXIsIHVuc2lnbmVkIGludCByZWcsIHU4IHYpCiB7Ci0Jc3RydWN0IHBtYWdiX2JfcmFtZGFjX3JlZ3MgKmJ0NDU5X3JlZ3MgPSAoc3RydWN0IHBtYWdiX2JfcmFtZGFjX3JlZ3MgKikgaW5mby0+cGFyOwotCQotCWlmIChyZWdubyA+PSBpbmZvLT5jbWFwLmxlbikKLQkJcmV0dXJuIDE7CisJd3JpdGViKHYsIHBhci0+ZGFjICsgcmVnIC8gNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggZGFjX3JlYWQoc3RydWN0IHBtYWdiYmZiX3BhciAqcGFyLCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXJldHVybiByZWFkYihwYXItPmRhYyArIHJlZyAvIDQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ3AwX3dyaXRlKHN0cnVjdCBwbWFnYmJmYl9wYXIgKnBhciwgdTMyIHYpCit7CisJd3JpdGVsKHYsIHBhci0+bW1pbyArIFBNQUdCX0JfR1AwKTsKK30KKworCisvKgorICogU2V0IHRoZSBwYWxldHRlLgorICovCitzdGF0aWMgaW50IHBtYWdiYmZiX3NldGNvbHJlZyh1bnNpZ25lZCBpbnQgcmVnbm8sIHVuc2lnbmVkIGludCByZWQsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZ3JlZW4sIHVuc2lnbmVkIGludCBibHVlLAorCQkJICAgICAgdW5zaWduZWQgaW50IHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHBtYWdiYmZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCisJQlVHX09OKHJlZ25vID49IGluZm8tPmNtYXAubGVuKTsKIAogCXJlZCAgID4+PSA4OwkvKiBUaGUgY21hcCBmaWVsZHMgYXJlIDE2IGJpdHMgICAgKi8KLQlncmVlbiA+Pj0gODsJLyogd2lkZSwgYnV0IHRoZSBoYXJ3YXJlIGNvbG9ybWFwICovCisJZ3JlZW4gPj49IDg7CS8qIHdpZGUsIGJ1dCB0aGUgaGFyZHdhcmUgY29sb3JtYXAgKi8KIAlibHVlICA+Pj0gODsJLyogcmVnaXN0ZXJzIGFyZSBvbmx5IDggYml0cyB3aWRlICovCiAKLQlidDQ1OV9yZWdzLT5hZGRyX2xvdyA9IChfX3U4KSByZWdubzsKLQlidDQ1OV9yZWdzLT5hZGRyX2hpID0gMDsKLQlidDQ1OV9yZWdzLT5jbWFwID0gcmVkOwotCWJ0NDU5X3JlZ3MtPmNtYXAgPSBncmVlbjsKLQlidDQ1OV9yZWdzLT5jbWFwID0gYmx1ZTsKKwltYigpOworCWRhY193cml0ZShwYXIsIEJUNDU5X0FERFJfTE8sIHJlZ25vKTsKKwlkYWNfd3JpdGUocGFyLCBCVDQ1OV9BRERSX0hJLCAweDAwKTsKKwl3bWIoKTsKKwlkYWNfd3JpdGUocGFyLCBCVDQ1OV9DTUFQLCByZWQpOworCXdtYigpOworCWRhY193cml0ZShwYXIsIEJUNDU5X0NNQVAsIGdyZWVuKTsKKwl3bWIoKTsKKwlkYWNfd3JpdGUocGFyLCBCVDQ1OV9DTUFQLCBibHVlKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMjEsNjIgKzEzNSwyNDcgQEAKIAkuZmJfY3Vyc29yCT0gc29mdF9jdXJzb3IsCiB9OwogCi1pbnQgX19pbml0IHBtYWdiYmZiX2luaXRfb25lKGludCBzbG90KQorCisvKgorICogVHVybiB0aGUgaGFyZHdhcmUgY3Vyc29yIG9mZi4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHBtYWdiYmZiX2VyYXNlX2N1cnNvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQl1bnNpZ25lZCBsb25nIGJhc2VfYWRkciA9IGdldF90Y19iYXNlX2FkZHIoc2xvdCk7Ci0Jc3RydWN0IGZiX2luZm8gKmluZm8gPSAmcG1hZ2JiX2ZiX2luZm9bc2xvdF07CisJc3RydWN0IHBtYWdiYmZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCi0JcHJpbnRrKCJQTUFHQi1CQSBmcmFtZWJ1ZmZlciBpbiBzbG90ICVkXG4iLCBzbG90KTsKLQkvKgotCSAqIEZyYW1lYnVmZmVyIGRpc3BsYXkgbWVtb3J5IGJhc2UgYWRkcmVzcyBhbmQgZnJpZW5kcwotCSAqLwotCXBtYWdiYmZiX2ZpeC5zbWVtX3N0YXJ0ID0gYmFzZV9hZGRyICsgUE1BR0JfQl9PTkJPQVJEX0ZCTUVNX09GRlNFVDsKLQlpbmZvLT5wYXIgPSAoYmFzZV9hZGRyICsgUE1BR0JfQl9CVDQ1OV9PRkZTRVQpOyAKLQkKLQkvKgotCSAqIENvbmZpZ3VyZSB0aGUgQnQ0NTkgUkFNIERBQwotCSAqLwotCXBtYWdiYmZiX2VyYXNlX2N1cnNvcigoc3RydWN0IHBtYWdiX2JfcmFtZGFjX3JlZ3MgKikgaW5mby0+cGFyKTsKKwltYigpOworCWRhY193cml0ZShwYXIsIEJUNDU5X0FERFJfTE8sIDB4MDApOworCWRhY193cml0ZShwYXIsIEJUNDU5X0FERFJfSEksIDB4MDMpOworCXdtYigpOworCWRhY193cml0ZShwYXIsIEJUNDU5X0RBVEEsIDB4MDApOworfQogCi0JLyoKLQkgKiAgICAgIExldCB0aGVyZSBiZSBjb25zb2xlcy4uCi0JICovCisvKgorICogU2V0IHVwIHNjcmVlbiBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcG1hZ2JiZmJfc2NyZWVuX3NldHVwKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBwbWFnYmJmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKworCWluZm8tPnZhci54cmVzID0gKChzZmJfcmVhZChwYXIsIFNGQl9SRUdfVklEX0hPUikgPj4KKwkJCSAgIFNGQl9WSURfSE9SX1BJWF9TSElGVCkgJiBTRkJfVklEX0hPUl9QSVhfTUFTSykgKiA0OworCWluZm8tPnZhci54cmVzX3ZpcnR1YWwgPSBpbmZvLT52YXIueHJlczsKKwlpbmZvLT52YXIueXJlcyA9IChzZmJfcmVhZChwYXIsIFNGQl9SRUdfVklEX1ZFUikgPj4KKwkJCSAgU0ZCX1ZJRF9WRVJfU0xfU0hJRlQpICYgU0ZCX1ZJRF9WRVJfU0xfTUFTSzsKKwlpbmZvLT52YXIueXJlc192aXJ0dWFsID0gaW5mby0+dmFyLnlyZXM7CisJaW5mby0+dmFyLmxlZnRfbWFyZ2luID0gKChzZmJfcmVhZChwYXIsIFNGQl9SRUdfVklEX0hPUikgPj4KKwkJCQkgIFNGQl9WSURfSE9SX0JQX1NISUZUKSAmCisJCQkJIFNGQl9WSURfSE9SX0JQX01BU0spICogNDsKKwlpbmZvLT52YXIucmlnaHRfbWFyZ2luID0gKChzZmJfcmVhZChwYXIsIFNGQl9SRUdfVklEX0hPUikgPj4KKwkJCQkgICBTRkJfVklEX0hPUl9GUF9TSElGVCkgJgorCQkJCSAgU0ZCX1ZJRF9IT1JfRlBfTUFTSykgKiA0OworCWluZm8tPnZhci51cHBlcl9tYXJnaW4gPSAoc2ZiX3JlYWQocGFyLCBTRkJfUkVHX1ZJRF9WRVIpID4+CisJCQkJICBTRkJfVklEX1ZFUl9CUF9TSElGVCkgJiBTRkJfVklEX1ZFUl9CUF9NQVNLOworCWluZm8tPnZhci5sb3dlcl9tYXJnaW4gPSAoc2ZiX3JlYWQocGFyLCBTRkJfUkVHX1ZJRF9WRVIpID4+CisJCQkJICBTRkJfVklEX1ZFUl9GUF9TSElGVCkgJiBTRkJfVklEX1ZFUl9GUF9NQVNLOworCWluZm8tPnZhci5oc3luY19sZW4gPSAoKHNmYl9yZWFkKHBhciwgU0ZCX1JFR19WSURfSE9SKSA+PgorCQkJCVNGQl9WSURfSE9SX1NZTl9TSElGVCkgJgorCQkJICAgICAgIFNGQl9WSURfSE9SX1NZTl9NQVNLKSAqIDQ7CisJaW5mby0+dmFyLnZzeW5jX2xlbiA9IChzZmJfcmVhZChwYXIsIFNGQl9SRUdfVklEX1ZFUikgPj4KKwkJCSAgICAgICBTRkJfVklEX1ZFUl9TWU5fU0hJRlQpICYgU0ZCX1ZJRF9WRVJfU1lOX01BU0s7CisKKwlpbmZvLT5maXgubGluZV9sZW5ndGggPSBpbmZvLT52YXIueHJlczsKK307CisKKy8qCisgKiBEZXRlcm1pbmUgb3NjaWxsYXRvciBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcG1hZ2JiZmJfb3NjX3NldHVwKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgcG1hZ2JiZmJfZnJlcXNbXSBfX2luaXRkYXRhID0geworCQkxMzA4MDgsIDExOTg0MywgMTA0MDAwLCA5Mjk4MCwgNzQzNjcsIDcyODAwLAorCQk2OTE5NywgNjYwMDAsIDY1MDAwLCA1MDM1MCwgMzYwMDAsIDMyMDAwLCAyNTE3NQorCX07CisJc3RydWN0IHBtYWdiYmZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCXUzMiBjb3VudDAgPSA4LCBjb3VudDEgPSA4LCBjb3VudHRjID0gMTYgKiAyNTYgKyA4OworCXUzMiBmcmVxMCwgZnJlcTEsIGZyZXF0YyA9IGdldF90Y19zcGVlZCgpIC8gMjUwOworCWludCBpLCBqOworCisJZ3AwX3dyaXRlKHBhciwgMCk7CQkJCS8qIHNlbGVjdCBPc2MwICovCisJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJbWIoKTsKKwkJc2ZiX3dyaXRlKHBhciwgU0ZCX1JFR19UQ0NMS19DT1VOVCwgMCk7CisJCW1iKCk7CisJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewkvKiBub21pbmFsbHkgbWF4LiAyMC41dXMgKi8KKwkJCWlmIChzZmJfcmVhZChwYXIsIFNGQl9SRUdfVENDTEtfQ09VTlQpID09IDApCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwkJY291bnQwICs9IHNmYl9yZWFkKHBhciwgU0ZCX1JFR19WSURDTEtfQ09VTlQpOworCX0KKworCWdwMF93cml0ZShwYXIsIDEpOwkJCQkvKiBzZWxlY3QgT3NjMSAqLworCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCW1iKCk7CisJCXNmYl93cml0ZShwYXIsIFNGQl9SRUdfVENDTEtfQ09VTlQsIDApOworCisJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewkvKiBub21pbmFsbHkgbWF4LiAyMC41dXMgKi8KKwkJCWlmIChzZmJfcmVhZChwYXIsIFNGQl9SRUdfVENDTEtfQ09VTlQpID09IDApCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwkJY291bnQxICs9IHNmYl9yZWFkKHBhciwgU0ZCX1JFR19WSURDTEtfQ09VTlQpOworCX0KKworCWZyZXEwID0gKGZyZXF0YyAqIGNvdW50MCArIGNvdW50dGMgLyAyKSAvIGNvdW50dGM7CisJcGFyLT5vc2MwID0gZnJlcTA7CisJaWYgKGZyZXEwID49IHBtYWdiYmZiX2ZyZXFzWzBdIC0gKHBtYWdiYmZiX2ZyZXFzWzBdICsgMzIpIC8gNjQgJiYKKwkgICAgZnJlcTAgPD0gcG1hZ2JiZmJfZnJlcXNbMF0gKyAocG1hZ2JiZmJfZnJlcXNbMF0gKyAzMikgLyA2NCkKKwkJcGFyLT5vc2MwID0gcG1hZ2JiZmJfZnJlcXNbMF07CisKKwlmcmVxMSA9IChwYXItPm9zYzAgKiBjb3VudDEgKyBjb3VudDAgLyAyKSAvIGNvdW50MDsKKwlwYXItPm9zYzEgPSBmcmVxMTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHBtYWdiYmZiX2ZyZXFzKSAvIHNpemVvZigqcG1hZ2JiZmJfZnJlcXMpOyBpKyspCisJCWlmIChmcmVxMSA+PSBwbWFnYmJmYl9mcmVxc1tpXSAtCisJCQkgICAgIChwbWFnYmJmYl9mcmVxc1tpXSArIDEyOCkgLyAyNTYgJiYKKwkJICAgIGZyZXExIDw9IHBtYWdiYmZiX2ZyZXFzW2ldICsKKwkJCSAgICAgKHBtYWdiYmZiX2ZyZXFzW2ldICsgMTI4KSAvIDI1NikgeworCQkJcGFyLT5vc2MxID0gcG1hZ2JiZmJfZnJlcXNbaV07CisJCQlicmVhazsKKwkJfQorCisJaWYgKHBhci0+b3NjMCAtIHBhci0+b3NjMSA8PSAocGFyLT5vc2MwICsgcGFyLT5vc2MxICsgMjU2KSAvIDUxMiB8fAorCSAgICBwYXItPm9zYzEgLSBwYXItPm9zYzAgPD0gKHBhci0+b3NjMCArIHBhci0+b3NjMSArIDI1NikgLyA1MTIpCisJCXBhci0+b3NjMSA9IDA7CisKKwlncDBfd3JpdGUocGFyLCBwYXItPm9zYzEgIT0gMCk7CQkJLyogcmVzZWxlY3QgT3NjWCAqLworCisJaW5mby0+dmFyLnBpeGNsb2NrID0gcGFyLT5vc2MxID8KKwkJCSAgICAgKDEwMDAwMDAwMDAgKyBwYXItPm9zYzEgLyAyKSAvIHBhci0+b3NjMSA6CisJCQkgICAgICgxMDAwMDAwMDAwICsgcGFyLT5vc2MwIC8gMikgLyBwYXItPm9zYzA7Cit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IHBtYWdiYmZiX2luaXRfb25lKGludCBzbG90KQoreworCWNoYXIgZnJlcTBbMTJdLCBmcmVxMVsxMl07CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IHBtYWdiYmZiX3BhciAqcGFyOworCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyOworCXUzMiB2aWRfYmFzZTsKKworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IHBtYWdiYmZiX3BhciksIE5VTEwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwYXIgPSBpbmZvLT5wYXI7CisJcGFyLT5zbG90ID0gc2xvdDsKKwljbGFpbV90Y19jYXJkKHBhci0+c2xvdCk7CisKKwliYXNlX2FkZHIgPSBnZXRfdGNfYmFzZV9hZGRyKHBhci0+c2xvdCk7CisKKwlwYXItPm5leHQgPSByb290X3BtYWdiYmZiX2RldjsKKwlyb290X3BtYWdiYmZiX2RldiA9IGluZm87CisKKwlpZiAoZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKSA8IDApCisJCWdvdG8gZXJyX2FsbG9jOworCiAJaW5mby0+ZmJvcHMgPSAmcG1hZ2JiZmJfb3BzOwotCWluZm8tPnZhciA9IHBtYWdiYmZiX2RlZmluZWQ7CiAJaW5mby0+Zml4ID0gcG1hZ2JiZmJfZml4OwotCWluZm8tPnNjcmVlbl9iYXNlID0gcG1hZ2JiZmJfZml4LnNtZW1fc3RhcnQ7IAorCWluZm8tPnZhciA9IHBtYWdiYmZiX2RlZmluZWQ7CiAJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVDsKIAotCWZiX2FsbG9jX2NtYXAoJmZiX2luZm8uY21hcCwgMjU2LCAwKTsKKwkvKiBNTUlPIG1hcHBpbmcgc2V0dXAuICAqLworCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gYmFzZV9hZGRyOworCXBhci0+bW1pbyA9IGlvcmVtYXBfbm9jYWNoZShpbmZvLT5maXgubW1pb19zdGFydCwgaW5mby0+Zml4Lm1taW9fbGVuKTsKKwlpZiAoIXBhci0+bW1pbykKKwkJZ290byBlcnJfY21hcDsKKwlwYXItPnNmYiA9IHBhci0+bW1pbyArIFBNQUdCX0JfU0ZCOworCXBhci0+ZGFjID0gcGFyLT5tbWlvICsgUE1BR0JfQl9CVDQ1OTsKKworCS8qIEZyYW1lIGJ1ZmZlciBtYXBwaW5nIHNldHVwLiAgKi8KKwlpbmZvLT5maXguc21lbV9zdGFydCA9IGJhc2VfYWRkciArIFBNQUdCX0JfRkJNRU07CisJcGFyLT5zbWVtID0gaW9yZW1hcF9ub2NhY2hlKGluZm8tPmZpeC5zbWVtX3N0YXJ0LCBpbmZvLT5maXguc21lbV9sZW4pOworCWlmICghcGFyLT5zbWVtKQorCQlnb3RvIGVycl9tbWlvX21hcDsKKwl2aWRfYmFzZSA9IHNmYl9yZWFkKHBhciwgU0ZCX1JFR19WSURfQkFTRSk7CisJaW5mby0+c2NyZWVuX2Jhc2UgPSAodm9pZCBfX2lvbWVtICopcGFyLT5zbWVtICsgdmlkX2Jhc2UgKiAweDEwMDA7CisJaW5mby0+c2NyZWVuX3NpemUgPSBpbmZvLT5maXguc21lbV9sZW4gLSAyICogdmlkX2Jhc2UgKiAweDEwMDA7CisKKwlwbWFnYmJmYl9lcmFzZV9jdXJzb3IoaW5mbyk7CisJcG1hZ2JiZmJfc2NyZWVuX3NldHVwKGluZm8pOworCXBtYWdiYmZiX29zY19zZXR1cChpbmZvKTsKIAogCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSA8IDApCi0JCXJldHVybiAxOworCQlnb3RvIGVycl9zbWVtX21hcDsKKworCXNucHJpbnRmKGZyZXEwLCBzaXplb2YoZnJlcTApLCAiJXUuJTAzdU1IeiIsCisJCSBwYXItPm9zYzAgLyAxMDAwLCBwYXItPm9zYzAgJSAxMDAwKTsKKwlzbnByaW50ZihmcmVxMSwgc2l6ZW9mKGZyZXExKSwgIiV1LiUwM3VNSHoiLAorCQkgcGFyLT5vc2MxIC8gMTAwMCwgcGFyLT5vc2MxICUgMTAwMCk7CisKKwlwcl9pbmZvKCJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlIGluIHNsb3QgJWRcbiIsCisJCWluZm8tPm5vZGUsIGluZm8tPmZpeC5pZCwgcGFyLT5zbG90KTsKKwlwcl9pbmZvKCJmYiVkOiBPc2MwOiAlcywgT3NjMTogJXMsIE9zYyV1IHNlbGVjdGVkXG4iLAorCQlpbmZvLT5ub2RlLCBmcmVxMCwgcGFyLT5vc2MxID8gZnJlcTEgOiAiZGlzYWJsZWQiLAorCQlwYXItPm9zYzEgIT0gMCk7CisKIAlyZXR1cm4gMDsKKworCitlcnJfc21lbV9tYXA6CisJaW91bm1hcChwYXItPnNtZW0pOworCitlcnJfbW1pb19tYXA6CisJaW91bm1hcChwYXItPm1taW8pOworCitlcnJfY21hcDoKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCitlcnJfYWxsb2M6CisJcm9vdF9wbWFnYmJmYl9kZXYgPSBwYXItPm5leHQ7CisJcmVsZWFzZV90Y19jYXJkKHBhci0+c2xvdCk7CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwlyZXR1cm4gLUVOWElPOwogfQogCi0vKiAKLSAqIEluaXRpYWxpc2UgdGhlIGZyYW1lYnVmZmVyCi0gKi8KLQotaW50IF9faW5pdCBwbWFnYmJmYl9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgcG1hZ2JiZmJfZXhpdF9vbmUodm9pZCkKIHsKLQlpbnQgc2lkOwotCWludCBmb3VuZCA9IDA7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSByb290X3BtYWdiYmZiX2RldjsKKwlzdHJ1Y3QgcG1hZ2JiZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCWlvdW5tYXAocGFyLT5zbWVtKTsKKwlpb3VubWFwKHBhci0+bW1pbyk7CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKKwlyb290X3BtYWdiYmZiX2RldiA9IHBhci0+bmV4dDsKKwlyZWxlYXNlX3RjX2NhcmQocGFyLT5zbG90KTsKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworfQorCisKKy8qCisgKiBJbml0aWFsaXNlIHRoZSBmcmFtZWJ1ZmZlci4KKyAqLworc3RhdGljIGludCBfX2luaXQgcG1hZ2JiZmJfaW5pdCh2b2lkKQoreworCWludCBjb3VudCA9IDA7CisJaW50IHNsb3Q7CiAKIAlpZiAoZmJfZ2V0X29wdGlvbnMoInBtYWdiYmZiIiwgTlVMTCkpCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gLUVOWElPOwogCi0JaWYgKFRVUkJPQ0hBTk5FTCkgewotCQl3aGlsZSAoKHNpZCA9IHNlYXJjaF90Y19jYXJkKCJQTUFHQi1CQSIpKSA+PSAwKSB7Ci0JCQlmb3VuZCA9IDE7Ci0JCQljbGFpbV90Y19jYXJkKHNpZCk7Ci0JCQlwbWFnYmJmYl9pbml0X29uZShzaWQpOwotCQl9Ci0JCXJldHVybiBmb3VuZCA/IDAgOiAtRU5PREVWOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRU5PREVWOworCXdoaWxlICgoc2xvdCA9IHNlYXJjaF90Y19jYXJkKCJQTUFHQi1CQSIpKSA+PSAwKSB7CisJCWlmIChwbWFnYmJmYl9pbml0X29uZShzbG90KSA8IDApCisJCQlicmVhazsKKwkJY291bnQrKzsKIAl9CisJcmV0dXJuIChjb3VudCA+IDApID8gMCA6IC1FTlhJTzsKIH0KIAorc3RhdGljIHZvaWQgX19leGl0IHBtYWdiYmZiX2V4aXQodm9pZCkKK3sKKwl3aGlsZSAocm9vdF9wbWFnYmJmYl9kZXYpCisJCXBtYWdiYmZiX2V4aXRfb25lKCk7Cit9CisKKwogbW9kdWxlX2luaXQocG1hZ2JiZmJfaW5pdCk7Cittb2R1bGVfZXhpdChwbWFnYmJmYl9leGl0KTsKKwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9weGFmYi5jIGIvZHJpdmVycy92aWRlby9weGFmYi5jCmluZGV4IDMwMTEyODEuLjM0ZDRkY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHhhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMKQEAgLTQ2OCw2ICs0NjgsMzYgQEAKIH0KIAogLyoKKyAqIFNvbWUgdG91Y2hzY3JlZW5zIG5lZWQgaHN5bmMgaW5mb3JtYXRpb24gZnJvbSB0aGUgdmlkZW8gZHJpdmVyIHRvCisgKiBmdW5jdGlvbiBjb3JyZWN0bHkuIFdlIGV4cG9ydCBpdCBoZXJlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2hzeW5jX3RpbWUoc3RydWN0IHB4YWZiX2luZm8gKmZiaSwgdW5zaWduZWQgaW50IHBjZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgaHRpbWU7CisKKwlpZiAoKHBjZCA9PSAwKSB8fCAoZmJpLT5mYi52YXIuaHN5bmNfbGVuID09IDApKSB7CisJCWZiaS0+aHN5bmNfdGltZT0wOworCQlyZXR1cm47CisJfQorCisJaHRpbWUgPSAodW5zaWduZWQgbG9uZyBsb25nKWdldF9sY2RjbGtfZnJlcXVlbmN5XzEwa2h6KCkgKiAxMDAwMDsKKwlkb19kaXYoaHRpbWUsIHBjZCAqIGZiaS0+ZmIudmFyLmhzeW5jX2xlbik7CisJZmJpLT5oc3luY190aW1lID0gaHRpbWU7Cit9CisKK3Vuc2lnbmVkIGxvbmcgcHhhZmJfZ2V0X2hzeW5jX3RpbWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBweGFmYl9pbmZvICpmYmkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCS8qIElmIGRpc3BsYXkgaXMgYmxhbmtlZC9zdXNwZW5kZWQsIGhzeW5jIGlzbid0IGFjdGl2ZSAqLworCWlmICghZmJpIHx8IChmYmktPnN0YXRlICE9IENfRU5BQkxFKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZmJpLT5oc3luY190aW1lOworfQorRVhQT1JUX1NZTUJPTChweGFmYl9nZXRfaHN5bmNfdGltZSk7CisKKy8qCiAgKiBweGFmYl9hY3RpdmF0ZV92YXIoKToKICAqCUNvbmZpZ3VyZXMgTENEIENvbnRyb2xsZXIgYmFzZWQgb24gZW50cmllcyBpbiB2YXIgcGFyYW1ldGVyLiAgU2V0dGluZ3MgYXJlCiAgKglvbmx5IHdyaXR0ZW4gdG8gdGhlIGNvbnRyb2xsZXIgaWYgY2hhbmdlcyB3ZXJlIG1hZGUuCkBAIC02MzEsNiArNjYxLDcgQEAKIAlmYmktPnJlZ19sY2NyMSA9IG5ld19yZWdzLmxjY3IxOwogCWZiaS0+cmVnX2xjY3IyID0gbmV3X3JlZ3MubGNjcjI7CiAJZmJpLT5yZWdfbGNjcjMgPSBuZXdfcmVncy5sY2NyMzsKKwlzZXRfaHN5bmNfdGltZShmYmksIHBjZCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJLyoKQEAgLTkwNyw2ICs5MzgsNyBAQAogCiAJY2FzZSBDUFVGUkVRX1BPU1RDSEFOR0U6CiAJCXBjZCA9IGdldF9wY2QoZmJpLT5mYi52YXIucGl4Y2xvY2spOworCQlzZXRfaHN5bmNfdGltZShmYmksIHBjZCk7CiAJCWZiaS0+cmVnX2xjY3IzID0gKGZiaS0+cmVnX2xjY3IzICYgfjB4ZmYpIHwgTENDUjNfUGl4Q2xrRGl2KHBjZCk7CiAJCXNldF9jdHJscl9zdGF0ZShmYmksIENfRU5BQkxFX0NMS0NIQU5HRSk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9weGFmYi5oIGIvZHJpdmVycy92aWRlby9weGFmYi5oCmluZGV4IGRlMTVmZWMuLjIyYzAwYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHhhZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3B4YWZiLmgKQEAgLTgzLDYgKzgzLDggQEAKIAl1X2ludAkJCXJlZ19sY2NyMjsKIAl1X2ludAkJCXJlZ19sY2NyMzsKIAorCXVuc2lnbmVkIGxvbmcJaHN5bmNfdGltZTsKKwogCXZvbGF0aWxlIHVfY2hhcgkJc3RhdGU7CiAJdm9sYXRpbGUgdV9jaGFyCQl0YXNrX3N0YXRlOwogCXN0cnVjdCBzZW1hcGhvcmUJY3RybHJfc2VtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9xNDBmYi5jIGIvZHJpdmVycy92aWRlby9xNDBmYi5jCmluZGV4IDcxYjY5ZGEuLjE2MjAxMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcTQwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3E0MGZiLmMKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3E0MF9tYXN0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9yaXZhL2ZiZGV2LmMgYi9kcml2ZXJzL3ZpZGVvL3JpdmEvZmJkZXYuYwppbmRleCBhZTI5N2UyLi4zZTlmOTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3JpdmEvZmJkZXYuYworKysgYi9kcml2ZXJzL3ZpZGVvL3JpdmEvZmJkZXYuYwpAQCAtMTkzNiwxMCArMTkzNiw2IEBACiAJZGVmYXVsdF9wYXItPkNoaXBzZXQgPSAocGQtPnZlbmRvciA8PCAxNikgfCBwZC0+ZGV2aWNlOwogCXByaW50ayhLRVJOX0lORk8gUEZYICJuVmlkaWEgZGV2aWNlL2NoaXBzZXQgJVhcbiIsZGVmYXVsdF9wYXItPkNoaXBzZXQpOwogCQotI2lmZGVmIENPTkZJR19QQ0lfTkFNRVMKLQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXNcbiIsIHBkLT5wcmV0dHlfbmFtZSk7Ci0jZW5kaWYKLQogCWlmKGRlZmF1bHRfcGFyLT5yaXZhLkFyY2hpdGVjdHVyZSA9PSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggInVua25vd24gTlZfQVJDSFxuIik7CiAJCXJldD0tRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9yaXZhL3JpdmFmYi1pMmMuYyBiL2RyaXZlcnMvdmlkZW8vcml2YS9yaXZhZmItaTJjLmMKaW5kZXggZGExMzM0ZC4uNzcxNTFkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9yaXZhL3JpdmFmYi1pMmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL3JpdmEvcml2YWZiLWkyYy5jCkBAIC05MiwxNCArOTIsMTMgQEAKIAlyZXR1cm4gdmFsOwogfQogCi0jZGVmaW5lIEkyQ19BTEdPX1JJVkEgICAweDBlMDAwMAogc3RhdGljIGludCByaXZhX3NldHVwX2kyY19idXMoc3RydWN0IHJpdmFfaTJjX2NoYW4gKmNoYW4sIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJaW50IHJjOwogCiAJc3RyY3B5KGNoYW4tPmFkYXB0ZXIubmFtZSwgbmFtZSk7CiAJY2hhbi0+YWRhcHRlci5vd25lcgkJPSBUSElTX01PRFVMRTsKLQljaGFuLT5hZGFwdGVyLmlkCQk9IEkyQ19BTEdPX1JJVkE7CisJY2hhbi0+YWRhcHRlci5pZAkJPSBJMkNfSFdfQl9SSVZBOwogCWNoYW4tPmFkYXB0ZXIuYWxnb19kYXRhCQk9ICZjaGFuLT5hbGdvOwogCWNoYW4tPmFkYXB0ZXIuZGV2LnBhcmVudAk9ICZjaGFuLT5wYXItPnBkZXYtPmRldjsKIAljaGFuLT5hbGdvLnNldHNkYQkJPSByaXZhX2dwaW9fc2V0c2RhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zMWQxM3h4eGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3MxZDEzeHh4ZmIuYwppbmRleCAzODQ4YmUyLi5mYTk4ZDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3MxZDEzeHh4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3MxZDEzeHh4ZmIuYwpAQCAtNjU1LDcgKzY1NSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgczFkMTN4eHhmYl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpCitzdGF0aWMgaW50IHMxZDEzeHh4ZmJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHMxZDEzeHh4ZmJfcGFyICpzMWRmYiA9IGluZm8tPnBhcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzAyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCkBAIC0wLDAgKzEsOTE1IEBACisvKgorICogbGludXgvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYworICoJQ29weXJpZ2h0IChjKSBBcm5hdWQgUGF0YXJkLCBCZW4gRG9va3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICoJICAgIFMzQzI0MTAgTENEIENvbnRyb2xsZXIgRnJhbWUgQnVmZmVyIERyaXZlcgorICoJICAgIGJhc2VkIG9uIHNrZWxldG9uZmIuYywgc2ExMTAwZmIuYyBhbmQgb3RoZXJzCisgKgorICogQ2hhbmdlTG9nCisgKiAyMDA1LTA0LTA3OiBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICogICAgICAtIHUzMiBzdGF0ZSAtPiBwbV9tZXNzYWdlX3Qgc3RhdGUKKyAqICAgICAgLSBTM0MyNDEwX3tWQSxTWn1fTENEIC0+IFMzQzI0WFgKKyAqCisgKiAyMDA1LTAzLTE1OiBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICogICAgICAtIFJlbW92ZWQgdGhlIGlvY3RsCisgKiAgICAgIC0gdXNlIHJlYWRsL3dyaXRlbCBpbnN0ZWFkIG9mIF9fcmF3X3dyaXRlbC9fX3Jhd19yZWFkbAorICoKKyAqIDIwMDQtMTItMDQ6IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKiAgICAgIC0gQWRkZWQgdGhlIHBvc3NpYmlsaXR5IHRvIHNldCBvbiBvciBvZmYgdGhlCisgKiAgICAgIGRlYnVnZ2luZyBtZXNhYWdlcworICogICAgICAtIFJlcGxhY2VkIDAgYW5kIDEgYnkgb24gb3Igb2ZmIHdoZW4gcmVhZGluZyB0aGUKKyAqICAgICAgL3N5cyBmaWxlcworICoKKyAqIDIwMDUtMDMtMjM6IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4KKyAqCS0gYWRkZWQgbm9uIDE2YnBwIG1vZGVzCisgKgktIHVwZGF0ZWQgcGxhdGZvcm0gaW5mb3JtYXRpb24gZm9yIHJhbmdlIG9mIHgveS9icHAKKyAqCS0gYWRkIGNvZGUgdG8gZW5zdXJlIHBhbGV0dGUgaXMgd3JpdHRlbiBjb3JyZWN0bHkKKyAqCS0gYWRkIHBpeGVsIGNsb2NrIGRpdmlzb3IgY29udHJvbAorICoKKyAqIDIwMDQtMTEtMTE6IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKiAJLSBSZW1vdmVkIHRoZSB1c2Ugb2YgY3VycmNvbiBhcyBpdCBubyBtb3JlIGV4aXN0CisgKiAJLSBBZGRlZCBMQ0QgcG93ZXIgc3lzZnMgaW50ZXJmYWNlCisgKgorICogMjAwNC0xMS0wMzogQmVuIERvb2tzIDxiZW4tbGludXhAZmx1ZmYub3JnPgorICoJLSBtaW5vciBjbGVhbnVwcworICoJLSBhZGQgc3VzcGVuZC9yZXN1bWUgc3VwcG9ydAorICoJLSBzM2MyNDEwZmJfc2V0Y29scmVnKCkgbm90IHZhbGlkIGluID44YnBwIG1vZGVzCisgKgktIHJlbW92ZWQgbGFzdCBDT05GSUdfRkJfUzNDMjQxMF9GSVhFRAorICoJLSBlbnN1cmUgbGNkIGNvbnRyb2xsZXIgc3RvcHBlZCBiZWZvcmUgY2xlYW51cAorICoJLSBhZGRlZCBzeXNmcyBpbnRlcmZhY2UgZm9yIGJhY2tsaWdodCBwb3dlcgorICoJLSBhZGRlZCBtYXNrIGZvciBncGlvIGNvbmZpZ3VyYXRpb24KKyAqCS0gZW5zdXJlZCBJUlFzIGRpc2FibGVkIGR1cmluZyBHUElPIGNvbmZpZ3VyYXRpb24KKyAqCS0gZGlzYWJsZSBUUEFMIGJlZm9yZSBlbmFibGluZyB2aWRlbworICoKKyAqIDIwMDQtMDktMjA6IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKiAgICAgIC0gU3VwcHJlc3MgY29tbWFuZCBsaW5lIG9wdGlvbnMKKyAqCisgKiAyMDA0LTA5LTE1OiBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICogCS0gY29kZSBjbGVhbnVwCisgKgorICogMjAwNC0wOS0wNzogQXJuYXVkIFBhdGFyZCA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4KKyAqIAktIFJlbmFtZWQgZnJvbSBoMTk0MGZiLmMgdG8gczNjMjQxMGZiLmMKKyAqIAktIEFkZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgZGV2aWNlcworICogCS0gQmFja2xpZ2h0IHN1cHBvcnQKKyAqCisgKiAyMDA0LTA5LTA1OiBIZXJiZXJ0IFD2dHpsIDxoZXJiZXJ0QDEzdGhmbG9vci5hdD4KKyAqCS0gYWRkZWQgY2xvY2sgKGRlLSlhbGxvY2F0aW9uIGNvZGUKKyAqCS0gYWRkZWQgZml4ZW0gZmJtZW0gb3B0aW9uCisgKgorICogMjAwNC0wNy0yNzogQXJuYXVkIFBhdGFyZCA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4KKyAqCS0gY29kZSBjbGVhbnVwCisgKgktIGFkZGVkIGEgZm9yZ290dGVuIHJldHVybiBpbiBoMTk0MGZiX2luaXQKKyAqCisgKiAyMDA0LTA3LTE5OiBIZXJiZXJ0IFD2dHpsIDxoZXJiZXJ0QDEzdGhmbG9vci5hdD4KKyAqCS0gY29kZSBjbGVhbnVwIGFuZCBleHRlbmRlZCBkZWJ1Z2dpbmcKKyAqCisgKiAyMDA0LTA3LTE1OiBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICoJLSBGaXJzdCB2ZXJzaW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWxjZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2ZiLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CisKKyNpZmRlZiBDT05GSUdfUE0KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzM2MyNDEwZmIuaCIKKworCitzdGF0aWMgc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8gKm1hY2hfaW5mbzsKKworLyogRGVidWdnaW5nIHN0dWZmICovCisjaWZkZWYgQ09ORklHX0ZCX1MzQzI0MTBfREVCVUcKK3N0YXRpYyBpbnQgZGVidWcJICAgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgZGVidWcJICAgPSAwOworI2VuZGlmCisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pCWlmIChkZWJ1ZykgeyBwcmludGsoS0VSTl9ERUJVRyAiczNjMjQxMGZiOiAiIG1zZyk7IH0KKworLyogdXNlZnVsIGZ1bmN0aW9ucyAqLworCisvKiBzM2MyNDEwZmJfc2V0X2xjZGFkZHIKKyAqCisgKiBpbml0aWFsaXNlIGxjZCBjb250cm9sbGVyIGFkZHJlc3MgcG9pbnRlcnMKKyovCisKK3N0YXRpYyB2b2lkIHMzYzI0MTBmYl9zZXRfbGNkYWRkcihzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZmYmktPmZiLT52YXI7CisJdW5zaWduZWQgbG9uZyBzYWRkcjEsIHNhZGRyMiwgc2FkZHIzOworCisJc2FkZHIxICA9IGZiaS0+ZmItPmZpeC5zbWVtX3N0YXJ0ID4+IDE7CisJc2FkZHIyICA9IGZiaS0+ZmItPmZpeC5zbWVtX3N0YXJ0OworCXNhZGRyMiArPSAodmFyLT54cmVzICogdmFyLT55cmVzICogdmFyLT5iaXRzX3Blcl9waXhlbCkvODsKKwlzYWRkcjI+Pj0gMTsKKworCXNhZGRyMyA9ICBTM0MyNDEwX09GRlNJWkUoMCkgfCBTM0MyNDEwX1BBR0VXSURUSCh2YXItPnhyZXMpOworCisJZHByaW50aygiTENEU0FERFIxID0gMHglMDhseFxuIiwgc2FkZHIxKTsKKwlkcHJpbnRrKCJMQ0RTQUREUjIgPSAweCUwOGx4XG4iLCBzYWRkcjIpOworCWRwcmludGsoIkxDRFNBRERSMyA9IDB4JTA4bHhcbiIsIHNhZGRyMyk7CisKKwl3cml0ZWwoc2FkZHIxLCBTM0MyNDEwX0xDRFNBRERSMSk7CisJd3JpdGVsKHNhZGRyMiwgUzNDMjQxMF9MQ0RTQUREUjIpOworCXdyaXRlbChzYWRkcjMsIFMzQzI0MTBfTENEU0FERFIzKTsKK30KKworLyogczNjMjQxMGZiX2NhbGNfcGl4Y2xrKCkKKyAqCisgKiBjYWxjdWxhdGUgZGl2aXNvciBmb3IgY2xrLT5waXhjbGsKKyovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgczNjMjQxMGZiX2NhbGNfcGl4Y2xrKHN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqZmJpLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGl4Y2xrKQoreworCXVuc2lnbmVkIGxvbmcgY2xrID0gY2xrX2dldF9yYXRlKGZiaS0+Y2xrKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGl2OworCisJLyogcGl4Y2xrIGlzIGluIHBpY29zZW9uY2RzLCBvdXIgY2xvY2sgaXMgaW4gSHoKKwkgKgorCSAqIEh6IC0+IHBpY29zZWNvbmRzIGlzIC8gMTBeLTEyCisJICovCisKKwlkaXYgPSAodW5zaWduZWQgbG9uZyBsb25nKWNsayAqIHBpeGNsazsKKwlkb19kaXYoZGl2LDEwMDAwMDBVTCk7CisJZG9fZGl2KGRpdiwxMDAwMDAwVUwpOworCisJZHByaW50aygicGl4Y2xrICVsZCwgZGl2aXNvciBpcyAlbGRcbiIsIHBpeGNsaywgKGxvbmcpZGl2KTsKKwlyZXR1cm4gZGl2OworfQorCisvKgorICoJczNjMjQxMGZiX2NoZWNrX3ZhcigpOgorICoJR2V0IHRoZSB2aWRlbyBwYXJhbXMgb3V0IG9mICd2YXInLiBJZiBhIHZhbHVlIGRvZXNuJ3QgZml0LCByb3VuZCBpdCB1cCwKKyAqCWlmIGl0J3MgdG9vIGJpZywgcmV0dXJuIC1FSU5WQUwuCisgKgorICovCitzdGF0aWMgaW50IHMzYzI0MTBmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHMzYzI0MTBmYl9pbmZvICpmYmkgPSBpbmZvLT5wYXI7CisKKwlkcHJpbnRrKCJjaGVja192YXIodmFyPSVwLCBpbmZvPSVwKVxuIiwgdmFyLCBpbmZvKTsKKworCS8qIHZhbGlkYXRlIHgveSByZXNvbHV0aW9uICovCisKKwlpZiAodmFyLT55cmVzID4gZmJpLT5tYWNoX2luZm8tPnlyZXMubWF4KQorCQl2YXItPnlyZXMgPSBmYmktPm1hY2hfaW5mby0+eXJlcy5tYXg7CisJZWxzZSBpZiAodmFyLT55cmVzIDwgZmJpLT5tYWNoX2luZm8tPnlyZXMubWluKQorCQl2YXItPnlyZXMgPSBmYmktPm1hY2hfaW5mby0+eXJlcy5taW47CisKKwlpZiAodmFyLT54cmVzID4gZmJpLT5tYWNoX2luZm8tPnhyZXMubWF4KQorCQl2YXItPnlyZXMgPSBmYmktPm1hY2hfaW5mby0+eHJlcy5tYXg7CisJZWxzZSBpZiAodmFyLT54cmVzIDwgZmJpLT5tYWNoX2luZm8tPnhyZXMubWluKQorCQl2YXItPnhyZXMgPSBmYmktPm1hY2hfaW5mby0+eHJlcy5taW47CisKKwkvKiB2YWxpZGF0ZSBicHAgKi8KKworCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsID4gZmJpLT5tYWNoX2luZm8tPmJwcC5tYXgpCisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBmYmktPm1hY2hfaW5mby0+YnBwLm1heDsKKwllbHNlIGlmICh2YXItPmJpdHNfcGVyX3BpeGVsIDwgZmJpLT5tYWNoX2luZm8tPmJwcC5taW4pCisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBmYmktPm1hY2hfaW5mby0+YnBwLm1pbjsKKworCS8qIHNldCByL2cvYiBwb3NpdGlvbnMgKi8KKworCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsID09IDE2KSB7CisJCXZhci0+cmVkLm9mZnNldAkJPSAxMTsKKwkJdmFyLT5ncmVlbi5vZmZzZXQJPSA1OworCQl2YXItPmJsdWUub2Zmc2V0CT0gMDsKKwkJdmFyLT5yZWQubGVuZ3RoCQk9IDU7CisJCXZhci0+Z3JlZW4ubGVuZ3RoCT0gNjsKKwkJdmFyLT5ibHVlLmxlbmd0aAk9IDU7CisJCXZhci0+dHJhbnNwLmxlbmd0aAk9IDA7CisJfSBlbHNlIHsKKwkJdmFyLT5yZWQubGVuZ3RoCQk9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJCXZhci0+cmVkLm9mZnNldAkJPSAwOworCQl2YXItPmdyZWVuLmxlbmd0aAk9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJCXZhci0+Z3JlZW4ub2Zmc2V0CT0gMDsKKwkJdmFyLT5ibHVlLmxlbmd0aAk9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJCXZhci0+Ymx1ZS5vZmZzZXQJPSAwOworCQl2YXItPnRyYW5zcC5sZW5ndGgJPSAwOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzM2MyNDEwZmJfYWN0aXZhdGVfdmFyCisgKgorICogYWN0aXZhdGUgKHNldCkgdGhlIGNvbnRyb2xsZXIgZnJvbSB0aGUgZ2l2ZW4gZnJhbWVidWZmZXIKKyAqIGluZm9ybWF0aW9uCisqLworCitzdGF0aWMgaW50IHMzYzI0MTBmYl9hY3RpdmF0ZV92YXIoc3RydWN0IHMzYzI0MTBmYl9pbmZvICpmYmksCisJCQkJICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlmYmktPnJlZ3MubGNkY29uMSAmPSB+UzNDMjQxMF9MQ0RDT04xX01PREVNQVNLOworCisJZHByaW50aygiJXM6IHZhci0+eHJlcyAgPSAlZFxuIiwgX19GVU5DVElPTl9fLCB2YXItPnhyZXMpOworCWRwcmludGsoIiVzOiB2YXItPnlyZXMgID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgdmFyLT55cmVzKTsKKwlkcHJpbnRrKCIlczogdmFyLT5icHAgICA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHZhci0+Yml0c19wZXJfcGl4ZWwpOworCisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAxOgorCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUMUJQUDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUMkJQUDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUNEJQUDsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUOEJQUDsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZmJpLT5yZWdzLmxjZGNvbjEgfD0gUzNDMjQxMF9MQ0RDT04xX1RGVDE2QlBQOworCQlicmVhazsKKwl9CisKKwkvKiBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byB1cGRhdGUgc3luYy9ib3JkZXJzICovCisKKwlpZiAoIWZiaS0+bWFjaF9pbmZvLT5maXhlZF9zeW5jcykgeworCQlkcHJpbnRrKCJzZXR0aW5nIHZlcnQ6IHVwPSVkLCBsb3c9JWQsIHN5bmM9JWRcbiIsCisJCQl2YXItPnVwcGVyX21hcmdpbiwgdmFyLT5sb3dlcl9tYXJnaW4sCisJCQl2YXItPnZzeW5jX2xlbik7CisKKwkJZHByaW50aygic2V0dGluZyBob3J6OiBsZnQ9JWQsIHJ0PSVkLCBzeW5jPSVkXG4iLAorCQkJdmFyLT5sZWZ0X21hcmdpbiwgdmFyLT5yaWdodF9tYXJnaW4sCisJCQl2YXItPmhzeW5jX2xlbik7CisKKwkJZmJpLT5yZWdzLmxjZGNvbjIgPQorCQkJUzNDMjQxMF9MQ0RDT04yX1ZCUEQodmFyLT51cHBlcl9tYXJnaW4gLSAxKSB8CisJCQlTM0MyNDEwX0xDRENPTjJfVkZQRCh2YXItPmxvd2VyX21hcmdpbiAtIDEpIHwKKwkJCVMzQzI0MTBfTENEQ09OMl9WU1BXKHZhci0+dnN5bmNfbGVuIC0gMSk7CisKKwkJZmJpLT5yZWdzLmxjZGNvbjMgPQorCQkJUzNDMjQxMF9MQ0RDT04zX0hCUEQodmFyLT5yaWdodF9tYXJnaW4gLSAxKSB8CisJCQlTM0MyNDEwX0xDRENPTjNfSEZQRCh2YXItPmxlZnRfbWFyZ2luIC0gMSk7CisKKwkJZmJpLT5yZWdzLmxjZGNvbjQgJj0gflMzQzI0MTBfTENEQ09ONF9IU1BXKDB4ZmYpOworCQlmYmktPnJlZ3MubGNkY29uNCB8PSAgUzNDMjQxMF9MQ0RDT040X0hTUFcodmFyLT5oc3luY19sZW4gLSAxKTsKKwl9CisKKwkvKiB1cGRhdGUgWC9ZIGluZm8gKi8KKworCWZiaS0+cmVncy5sY2Rjb24yICY9IH5TM0MyNDEwX0xDRENPTjJfTElORVZBTCgweDNmZik7CisJZmJpLT5yZWdzLmxjZGNvbjIgfD0gIFMzQzI0MTBfTENEQ09OMl9MSU5FVkFMKHZhci0+eXJlcyAtIDEpOworCisJZmJpLT5yZWdzLmxjZGNvbjMgJj0gflMzQzI0MTBfTENEQ09OM19IT1pWQUwoMHg3ZmYpOworCWZiaS0+cmVncy5sY2Rjb24zIHw9ICBTM0MyNDEwX0xDRENPTjNfSE9aVkFMKHZhci0+eHJlcyAtIDEpOworCisJaWYgKHZhci0+cGl4Y2xvY2sgPiAwKSB7CisJCWludCBjbGtkaXYgPSBzM2MyNDEwZmJfY2FsY19waXhjbGsoZmJpLCB2YXItPnBpeGNsb2NrKTsKKworCQljbGtkaXYgPSAoY2xrZGl2IC8gMikgLTE7CisJCWlmIChjbGtkaXYgPCAwKQorCQkJY2xrZGl2ID0gMDsKKworCQlmYmktPnJlZ3MubGNkY29uMSAmPSB+UzNDMjQxMF9MQ0RDT04xX0NMS1ZBTCgweDNmZik7CisJCWZiaS0+cmVncy5sY2Rjb24xIHw9ICBTM0MyNDEwX0xDRENPTjFfQ0xLVkFMKGNsa2Rpdik7CisJfQorCisJLyogd3JpdGUgbmV3IHJlZ2lzdGVycyAqLworCisJZHByaW50aygibmV3IHJlZ2lzdGVyIHNldDpcbiIpOworCWRwcmludGsoImxjZGNvblsxXSA9IDB4JTA4bHhcbiIsIGZiaS0+cmVncy5sY2Rjb24xKTsKKwlkcHJpbnRrKCJsY2Rjb25bMl0gPSAweCUwOGx4XG4iLCBmYmktPnJlZ3MubGNkY29uMik7CisJZHByaW50aygibGNkY29uWzNdID0gMHglMDhseFxuIiwgZmJpLT5yZWdzLmxjZGNvbjMpOworCWRwcmludGsoImxjZGNvbls0XSA9IDB4JTA4bHhcbiIsIGZiaS0+cmVncy5sY2Rjb240KTsKKwlkcHJpbnRrKCJsY2Rjb25bNV0gPSAweCUwOGx4XG4iLCBmYmktPnJlZ3MubGNkY29uNSk7CisKKwl3cml0ZWwoZmJpLT5yZWdzLmxjZGNvbjEgJiB+UzNDMjQxMF9MQ0RDT04xX0VOVklELCBTM0MyNDEwX0xDRENPTjEpOworCXdyaXRlbChmYmktPnJlZ3MubGNkY29uMiwgUzNDMjQxMF9MQ0RDT04yKTsKKwl3cml0ZWwoZmJpLT5yZWdzLmxjZGNvbjMsIFMzQzI0MTBfTENEQ09OMyk7CisJd3JpdGVsKGZiaS0+cmVncy5sY2Rjb240LCBTM0MyNDEwX0xDRENPTjQpOworCXdyaXRlbChmYmktPnJlZ3MubGNkY29uNSwgUzNDMjQxMF9MQ0RDT041KTsKKworCS8qIHNldCBsY2QgYWRkcmVzcyBwb2ludGVycyAqLworCXMzYzI0MTBmYl9zZXRfbGNkYWRkcihmYmkpOworCisJd3JpdGVsKGZiaS0+cmVncy5sY2Rjb24xLCBTM0MyNDEwX0xDRENPTjEpOworfQorCisKKy8qCisgKiAgICAgIHMzYzI0MTBmYl9zZXRfcGFyIC0gT3B0aW9uYWwgZnVuY3Rpb24uIEFsdGVycyB0aGUgaGFyZHdhcmUgc3RhdGUuCisgKiAgICAgIEBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIKKyAqCisgKi8KK3N0YXRpYyBpbnQgczNjMjQxMGZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHMzYzI0MTBmYl9pbmZvICpmYmkgPSBpbmZvLT5wYXI7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOworCisJaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMTYpCisJCWZiaS0+ZmItPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOworCWVsc2UKKwkJZmJpLT5mYi0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUjsKKworCWZiaS0+ZmItPmZpeC5saW5lX2xlbmd0aCAgICAgPSAodmFyLT53aWR0aCp2YXItPmJpdHNfcGVyX3BpeGVsKS84OworCisJLyogYWN0aXZhdGUgdGhpcyBuZXcgY29uZmlndXJhdGlvbiAqLworCisJczNjMjQxMGZiX2FjdGl2YXRlX3ZhcihmYmksIHZhcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjaGVkdWxlX3BhbGV0dGVfdXBkYXRlKHN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqZmJpLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcmVnbm8sIHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGlycWVuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZmJpLT5wYWxldHRlX2J1ZmZlcltyZWdub10gPSB2YWw7CisKKwlpZiAoIWZiaS0+cGFsZXR0ZV9yZWFkeSkgeworCQlmYmktPnBhbGV0dGVfcmVhZHkgPSAxOworCisJCS8qIGVuYWJsZSBJUlEgKi8KKwkJaXJxZW4gPSByZWFkbChTM0MyNDEwX0xDRElOVE1TSyk7CisJCWlycWVuICY9IH5TM0MyNDEwX0xDRElOVF9GUlNZTkM7CisJCXdyaXRlbChpcnFlbiwgUzNDMjQxMF9MQ0RJTlRNU0spOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyogZnJvbSBweGFmYi5jICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjaGFuX3RvX2ZpZWxkKHVuc2lnbmVkIGludCBjaGFuLCBzdHJ1Y3QgZmJfYml0ZmllbGQgKmJmKQoreworCWNoYW4gJj0gMHhmZmZmOworCWNoYW4gPj49IDE2IC0gYmYtPmxlbmd0aDsKKwlyZXR1cm4gY2hhbiA8PCBiZi0+b2Zmc2V0OworfQorCitzdGF0aWMgaW50IHMzYzI0MTBmYl9zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sCisJCQkgICAgICAgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwgdW5zaWduZWQgYmx1ZSwKKwkJCSAgICAgICB1bnNpZ25lZCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqZmJpID0gaW5mby0+cGFyOworCXVuc2lnbmVkIGludCB2YWw7CisKKwkvKiBkcHJpbnRrKCJzZXRjb2w6IHJlZ25vPSVkLCByZ2I9JWQsJWQsJWRcbiIsIHJlZ25vLCByZWQsIGdyZWVuLCBibHVlKTsgKi8KKworCXN3aXRjaCAoZmJpLT5mYi0+Zml4LnZpc3VhbCkgeworCWNhc2UgRkJfVklTVUFMX1RSVUVDT0xPUjoKKwkJLyogdHJ1ZS1jb2xvdXIsIHVzZSBwc2V1by1wYWxldHRlICovCisKKwkJaWYgKHJlZ25vIDwgMTYpIHsKKwkJCXUzMiAqcGFsID0gZmJpLT5mYi0+cHNldWRvX3BhbGV0dGU7CisKKwkJCXZhbCAgPSBjaGFuX3RvX2ZpZWxkKHJlZCwgICAmZmJpLT5mYi0+dmFyLnJlZCk7CisJCQl2YWwgfD0gY2hhbl90b19maWVsZChncmVlbiwgJmZiaS0+ZmItPnZhci5ncmVlbik7CisJCQl2YWwgfD0gY2hhbl90b19maWVsZChibHVlLCAgJmZiaS0+ZmItPnZhci5ibHVlKTsKKworCQkJcGFsW3JlZ25vXSA9IHZhbDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRkJfVklTVUFMX1BTRVVET0NPTE9SOgorCQlpZiAocmVnbm8gPCAyNTYpIHsKKwkJCS8qIGN1cnJlbnRseSBhc3N1bWUgUkdCIDUtNi01IG1vZGUgKi8KKworCQkJdmFsICA9ICgocmVkICAgPj4gIDApICYgMHhmODAwKTsKKwkJCXZhbCB8PSAoKGdyZWVuID4+ICA1KSAmIDB4MDdlMCk7CisJCQl2YWwgfD0gKChibHVlICA+PiAxMSkgJiAweDAwMWYpOworCisJCQl3cml0ZWwodmFsLCBTM0MyNDEwX1RGVFBBTChyZWdubykpOworCQkJc2NoZWR1bGVfcGFsZXR0ZV91cGRhdGUoZmJpLCByZWdubywgdmFsKTsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7ICAgLyogdW5rbm93biB0eXBlICovCisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiAgICAgIHMzYzI0MTBmYl9ibGFuaworICoJQGJsYW5rX21vZGU6IHRoZSBibGFuayBtb2RlIHdlIHdhbnQuCisgKglAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCisgKgorICoJQmxhbmsgdGhlIHNjcmVlbiBpZiBibGFua19tb2RlICE9IDAsIGVsc2UgdW5ibGFuay4gUmV0dXJuIDAgaWYKKyAqCWJsYW5raW5nIHN1Y2NlZWRlZCwgIT0gMCBpZiB1bi0vYmxhbmtpbmcgZmFpbGVkIGR1ZSB0byBlLmcuIGEKKyAqCXZpZGVvIG1vZGUgd2hpY2ggZG9lc24ndCBzdXBwb3J0IGl0LiBJbXBsZW1lbnRzIFZFU0Egc3VzcGVuZAorICoJYW5kIHBvd2VyZG93biBtb2RlcyBvbiBoYXJkd2FyZSB0aGF0IHN1cHBvcnRzIGRpc2FibGluZyBoc3luYy92c3luYzoKKyAqCWJsYW5rX21vZGUgPT0gMjogc3VzcGVuZCB2c3luYworICoJYmxhbmtfbW9kZSA9PSAzOiBzdXNwZW5kIGhzeW5jCisgKglibGFua19tb2RlID09IDQ6IHBvd2VyZG93bgorICoKKyAqCVJldHVybnMgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IsIG9yIHplcm8gb24gc3VjY2Vzcy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgczNjMjQxMGZiX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlkcHJpbnRrKCJibGFuayhtb2RlPSVkLCBpbmZvPSVwKVxuIiwgYmxhbmtfbW9kZSwgaW5mbyk7CisKKwlpZiAobWFjaF9pbmZvID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJsYW5rX21vZGUgPT0gRkJfQkxBTktfVU5CTEFOSykKKwkJd3JpdGVsKDB4MCwgUzNDMjQxMF9UUEFMKTsKKwllbHNlIHsKKwkJZHByaW50aygic2V0dGluZyBUUEFMIHRvIG91dHB1dCAweDAwMDAwMFxuIik7CisJCXdyaXRlbChTM0MyNDEwX1RQQUxfRU4sIFMzQzI0MTBfVFBBTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQxMGZiX2RlYnVnX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkZWJ1ZyA/ICJvbiIgOiAib2ZmIik7Cit9CitzdGF0aWMgaW50IHMzYzI0MTBmYl9kZWJ1Z19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKG1hY2hfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsZW4gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdHJuaWNtcChidWYsICJvbiIsIDIpID09IDAgfHwKKwkgICAgc3RybmljbXAoYnVmLCAiMSIsIDEpID09IDApIHsKKwkJZGVidWcgPSAxOworCQlwcmludGsoS0VSTl9ERUJVRyAiczNjMjQxMGZiOiBEZWJ1ZyBPbiIpOworCX0gZWxzZSBpZiAoc3RybmljbXAoYnVmLCAib2ZmIiwgMykgPT0gMCB8fAorCQkgICBzdHJuaWNtcChidWYsICIwIiwgMSkgPT0gMCkgeworCQlkZWJ1ZyA9IDA7CisJCXByaW50ayhLRVJOX0RFQlVHICJzM2MyNDEwZmI6IERlYnVnIE9mZiIpOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBsZW47Cit9CisKKworc3RhdGljIERFVklDRV9BVFRSKGRlYnVnLCAwNjY2LAorCQkgICBzM2MyNDEwZmJfZGVidWdfc2hvdywKKwkJICAgczNjMjQxMGZiX2RlYnVnX3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBmYl9vcHMgczNjMjQxMGZiX29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZiX2NoZWNrX3Zhcgk9IHMzYzI0MTBmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIJPSBzM2MyNDEwZmJfc2V0X3BhciwKKwkuZmJfYmxhbmsJPSBzM2MyNDEwZmJfYmxhbmssCisJLmZiX3NldGNvbHJlZwk9IHMzYzI0MTBmYl9zZXRjb2xyZWcsCisJLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKKwkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfY3Vyc29yCT0gc29mdF9jdXJzb3IsCit9OworCisKKy8qCisgKiBzM2MyNDEwZmJfbWFwX3ZpZGVvX21lbW9yeSgpOgorICoJQWxsb2NhdGVzIHRoZSBEUkFNIG1lbW9yeSBmb3IgdGhlIGZyYW1lIGJ1ZmZlci4gIFRoaXMgYnVmZmVyIGlzCisgKglyZW1hcHBlZCBpbnRvIGEgbm9uLWNhY2hlZCwgbm9uLWJ1ZmZlcmVkLCBtZW1vcnkgcmVnaW9uIHRvCisgKglhbGxvdyBwYWxldHRlIGFuZCBwaXhlbCB3cml0ZXMgdG8gb2NjdXIgd2l0aG91dCBmbHVzaGluZyB0aGUKKyAqCWNhY2hlLiAgT25jZSB0aGlzIGFyZWEgaXMgcmVtYXBwZWQsIGFsbCB2aXJ0dWFsIG1lbW9yeQorICoJYWNjZXNzIHRvIHRoZSB2aWRlbyBtZW1vcnkgc2hvdWxkIG9jY3VyIGF0IHRoZSBuZXcgcmVnaW9uLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzM2MyNDEwZmJfbWFwX3ZpZGVvX21lbW9yeShzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmZiaSkKK3sKKwlkcHJpbnRrKCJtYXBfdmlkZW9fbWVtb3J5KGZiaT0lcClcbiIsIGZiaSk7CisKKwlmYmktPm1hcF9zaXplID0gUEFHRV9BTElHTihmYmktPmZiLT5maXguc21lbV9sZW4gKyBQQUdFX1NJWkUpOworCWZiaS0+bWFwX2NwdSAgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKGZiaS0+ZGV2LCBmYmktPm1hcF9zaXplLAorCQkJCQkgICAgICAgJmZiaS0+bWFwX2RtYSwgR0ZQX0tFUk5FTCk7CisKKwlmYmktPm1hcF9zaXplID0gZmJpLT5mYi0+Zml4LnNtZW1fbGVuOworCisJaWYgKGZiaS0+bWFwX2NwdSkgeworCQkvKiBwcmV2ZW50IGluaXRpYWwgZ2FyYmFnZSBvbiBzY3JlZW4gKi8KKwkJZHByaW50aygibWFwX3ZpZGVvX21lbW9yeTogY2xlYXIgJXA6JTA4eFxuIiwKKwkJCWZiaS0+bWFwX2NwdSwgZmJpLT5tYXBfc2l6ZSk7CisJCW1lbXNldChmYmktPm1hcF9jcHUsIDB4ZjAsIGZiaS0+bWFwX3NpemUpOworCisJCWZiaS0+c2NyZWVuX2RtYQkJPSBmYmktPm1hcF9kbWE7CisJCWZiaS0+ZmItPnNjcmVlbl9iYXNlCT0gZmJpLT5tYXBfY3B1OworCQlmYmktPmZiLT5maXguc21lbV9zdGFydCAgPSBmYmktPnNjcmVlbl9kbWE7CisKKwkJZHByaW50aygibWFwX3ZpZGVvX21lbW9yeTogZG1hPSUwOHggY3B1PSVwIHNpemU9JTA4eFxuIiwKKwkJCWZiaS0+bWFwX2RtYSwgZmJpLT5tYXBfY3B1LCBmYmktPmZiLT5maXguc21lbV9sZW4pOworCX0KKworCXJldHVybiBmYmktPm1hcF9jcHUgPyAwIDogLUVOT01FTTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTBmYl91bm1hcF92aWRlb19tZW1vcnkoc3RydWN0IHMzYzI0MTBmYl9pbmZvICpmYmkpCit7CisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGZiaS0+ZGV2LGZiaS0+bWFwX3NpemUsZmJpLT5tYXBfY3B1LCBmYmktPm1hcF9kbWEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbW9kaWZ5X2dwaW8odm9pZCBfX2lvbWVtICpyZWcsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzZXQsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCXRtcCA9IHJlYWRsKHJlZykgJiB+bWFzazsKKwl3cml0ZWwodG1wIHwgc2V0LCByZWcpOworfQorCisKKy8qCisgKiBzM2MyNDEwZmJfaW5pdF9yZWdpc3RlcnMgLSBJbml0aWFsaXNlIGFsbCBMQ0QtcmVsYXRlZCByZWdpc3RlcnMKKyAqLworCitpbnQgczNjMjQxMGZiX2luaXRfcmVnaXN0ZXJzKHN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqZmJpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBJbml0aWFsaXNlIExDRCB3aXRoIHZhbHVlcyBmcm9tIGhhcmV0ICovCisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBtb2RpZnkgdGhlIGdwaW8ocykgd2l0aCBpbnRlcnJ1cHRzIHNldCAoYmpkKSAqLworCisJbW9kaWZ5X2dwaW8oUzNDMjQxMF9HUENVUCwgIG1hY2hfaW5mby0+Z3BjdXAsICBtYWNoX2luZm8tPmdwY3VwX21hc2spOworCW1vZGlmeV9ncGlvKFMzQzI0MTBfR1BDQ09OLCBtYWNoX2luZm8tPmdwY2NvbiwgbWFjaF9pbmZvLT5ncGNjb25fbWFzayk7CisJbW9kaWZ5X2dwaW8oUzNDMjQxMF9HUERVUCwgIG1hY2hfaW5mby0+Z3BkdXAsICBtYWNoX2luZm8tPmdwZHVwX21hc2spOworCW1vZGlmeV9ncGlvKFMzQzI0MTBfR1BEQ09OLCBtYWNoX2luZm8tPmdwZGNvbiwgbWFjaF9pbmZvLT5ncGRjb25fbWFzayk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwl3cml0ZWwoZmJpLT5yZWdzLmxjZGNvbjEsIFMzQzI0MTBfTENEQ09OMSk7CisJd3JpdGVsKGZiaS0+cmVncy5sY2Rjb24yLCBTM0MyNDEwX0xDRENPTjIpOworCXdyaXRlbChmYmktPnJlZ3MubGNkY29uMywgUzNDMjQxMF9MQ0RDT04zKTsKKwl3cml0ZWwoZmJpLT5yZWdzLmxjZGNvbjQsIFMzQzI0MTBfTENEQ09ONCk7CisJd3JpdGVsKGZiaS0+cmVncy5sY2Rjb241LCBTM0MyNDEwX0xDRENPTjUpOworCisgCXMzYzI0MTBmYl9zZXRfbGNkYWRkcihmYmkpOworCisJZHByaW50aygiTFBDU0VMICAgID0gMHglMDhseFxuIiwgbWFjaF9pbmZvLT5scGNzZWwpOworCXdyaXRlbChtYWNoX2luZm8tPmxwY3NlbCwgUzNDMjQxMF9MUENTRUwpOworCisJZHByaW50aygicmVwbGFjaW5nIFRQQUwgJTA4eFxuIiwgcmVhZGwoUzNDMjQxMF9UUEFMKSk7CisKKwkvKiBlbnN1cmUgdGVtcG9yYXJ5IHBhbGV0dGUgZGlzYWJsZWQgKi8KKwl3cml0ZWwoMHgwMCwgUzNDMjQxMF9UUEFMKTsKKworCS8qIEVuYWJsZSB2aWRlbyBieSBzZXR0aW5nIHRoZSBFTlZJRCBiaXQgdG8gMSAqLworCWZiaS0+cmVncy5sY2Rjb24xIHw9IFMzQzI0MTBfTENEQ09OMV9FTlZJRDsKKwl3cml0ZWwoZmJpLT5yZWdzLmxjZGNvbjEsIFMzQzI0MTBfTENEQ09OMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0MTBmYl93cml0ZV9wYWxldHRlKHN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqZmJpKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgZW50OworCisJZmJpLT5wYWxldHRlX3JlYWR5ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpZiAoKGVudCA9IGZiaS0+cGFsZXR0ZV9idWZmZXJbaV0pID09IFBBTEVUVEVfQlVGRl9DTEVBUikKKwkJCWNvbnRpbnVlOworCisJCXdyaXRlbChlbnQsIFMzQzI0MTBfVEZUUEFMKGkpKTsKKworCQkvKiBpdCBzZWVtcyB0aGUgb25seSB3YXkgdG8ga25vdyBleGFjdGx5CisJCSAqIGlmIHRoZSBwYWxldHRlIHdyb3RlIG9rLCBpcyB0byBjaGVjaworCQkgKiB0byBzZWUgaWYgdGhlIHZhbHVlIHZlcmlmaWVzIG9rCisJCSAqLworCisJCWlmIChyZWFkdyhTM0MyNDEwX1RGVFBBTChpKSkgPT0gZW50KQorCQkJZmJpLT5wYWxldHRlX2J1ZmZlcltpXSA9IFBBTEVUVEVfQlVGRl9DTEVBUjsKKwkJZWxzZQorCQkJZmJpLT5wYWxldHRlX3JlYWR5ID0gMTsgICAvKiByZXRyeSAqLworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHMzYzI0MTBmYl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcikKK3sKKwlzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmZiaSA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGxjZGlycSA9IHJlYWRsKFMzQzI0MTBfTENESU5UUE5EKTsKKworCWlmIChsY2RpcnEgJiBTM0MyNDEwX0xDRElOVF9GUlNZTkMpIHsKKwkJaWYgKGZiaS0+cGFsZXR0ZV9yZWFkeSkKKwkJCXMzYzI0MTBmYl93cml0ZV9wYWxldHRlKGZiaSk7CisKKwkJd3JpdGVsKFMzQzI0MTBfTENESU5UX0ZSU1lOQywgUzNDMjQxMF9MQ0RJTlRQTkQpOworCQl3cml0ZWwoUzNDMjQxMF9MQ0RJTlRfRlJTWU5DLCBTM0MyNDEwX0xDRFNSQ1BORCk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgY2hhciBkcml2ZXJfbmFtZVtdPSJzM2MyNDEwZmIiOworCitpbnQgX19pbml0IHMzYzI0MTBmYl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHMzYzI0MTBmYl9pbmZvICppbmZvOworCXN0cnVjdCBmYl9pbmZvCSAgICpmYmluZm87CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzM2MyNDEwZmJfaHcgKm1yZWdzOworCWludCByZXQ7CisJaW50IGlycTsKKwlpbnQgaTsKKworCW1hY2hfaW5mbyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpZiAobWFjaF9pbmZvID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsIm5vIHBsYXRmb3JtIGRhdGEgZm9yIGxjZCwgY2Fubm90IGF0dGFjaFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1yZWdzID0gJm1hY2hfaW5mby0+cmVnczsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJubyBpcnEgZm9yIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWZiaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgczNjMjQxMGZiX2luZm8pLCBkZXYpOworCWlmICghZmJpbmZvKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCisJaW5mbyA9IGZiaW5mby0+cGFyOworCWluZm8tPmZiID0gZmJpbmZvOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGZiaW5mbyk7CisKKwlzM2MyNDEwZmJfaW5pdF9yZWdpc3RlcnMoaW5mbyk7CisKKwlkcHJpbnRrKCJkZXZpbml0XG4iKTsKKworCXN0cmNweShmYmluZm8tPmZpeC5pZCwgZHJpdmVyX25hbWUpOworCisJbWVtY3B5KCZpbmZvLT5yZWdzLCAmbWFjaF9pbmZvLT5yZWdzLCBzaXplb2YoaW5mby0+cmVncykpOworCisJaW5mby0+bWFjaF9pbmZvCQkgICAgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisKKwlmYmluZm8tPmZpeC50eXBlCSAgICA9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKKwlmYmluZm8tPmZpeC50eXBlX2F1eAkgICAgPSAwOworCWZiaW5mby0+Zml4LnhwYW5zdGVwCSAgICA9IDA7CisJZmJpbmZvLT5maXgueXBhbnN0ZXAJICAgID0gMDsKKwlmYmluZm8tPmZpeC55d3JhcHN0ZXAJICAgID0gMDsKKwlmYmluZm8tPmZpeC5hY2NlbAkgICAgPSBGQl9BQ0NFTF9OT05FOworCisJZmJpbmZvLT52YXIubm9uc3RkCSAgICA9IDA7CisJZmJpbmZvLT52YXIuYWN0aXZhdGUJICAgID0gRkJfQUNUSVZBVEVfTk9XOworCWZiaW5mby0+dmFyLmhlaWdodAkgICAgPSBtYWNoX2luZm8tPmhlaWdodDsKKwlmYmluZm8tPnZhci53aWR0aAkgICAgPSBtYWNoX2luZm8tPndpZHRoOworCWZiaW5mby0+dmFyLmFjY2VsX2ZsYWdzICAgICA9IDA7CisJZmJpbmZvLT52YXIudm1vZGUJICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKKworCWZiaW5mby0+ZmJvcHMJCSAgICA9ICZzM2MyNDEwZmJfb3BzOworCWZiaW5mby0+ZmxhZ3MJCSAgICA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CisJZmJpbmZvLT5wc2V1ZG9fcGFsZXR0ZSAgICAgID0gJmluZm8tPnBzZXVkb19wYWw7CisKKwlmYmluZm8tPnZhci54cmVzCSAgICA9IG1hY2hfaW5mby0+eHJlcy5kZWZ2YWw7CisJZmJpbmZvLT52YXIueHJlc192aXJ0dWFsICAgID0gbWFjaF9pbmZvLT54cmVzLmRlZnZhbDsKKwlmYmluZm8tPnZhci55cmVzCSAgICA9IG1hY2hfaW5mby0+eXJlcy5kZWZ2YWw7CisJZmJpbmZvLT52YXIueXJlc192aXJ0dWFsICAgID0gbWFjaF9pbmZvLT55cmVzLmRlZnZhbDsKKwlmYmluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAgPSBtYWNoX2luZm8tPmJwcC5kZWZ2YWw7CisKKwlmYmluZm8tPnZhci51cHBlcl9tYXJnaW4gICAgPSBTM0MyNDEwX0xDRENPTjJfR0VUX1ZCUEQobXJlZ3MtPmxjZGNvbjIpICsxOworCWZiaW5mby0+dmFyLmxvd2VyX21hcmdpbiAgICA9IFMzQzI0MTBfTENEQ09OMl9HRVRfVkZQRChtcmVncy0+bGNkY29uMikgKzE7CisJZmJpbmZvLT52YXIudnN5bmNfbGVuCSAgICA9IFMzQzI0MTBfTENEQ09OMl9HRVRfVlNQVyhtcmVncy0+bGNkY29uMikgKyAxOworCisJZmJpbmZvLT52YXIubGVmdF9tYXJnaW4JICAgID0gUzNDMjQxMF9MQ0RDT04zX0dFVF9IRlBEKG1yZWdzLT5sY2Rjb24zKSArIDE7CisJZmJpbmZvLT52YXIucmlnaHRfbWFyZ2luICAgID0gUzNDMjQxMF9MQ0RDT04zX0dFVF9IQlBEKG1yZWdzLT5sY2Rjb24zKSArIDE7CisJZmJpbmZvLT52YXIuaHN5bmNfbGVuCSAgICA9IFMzQzI0MTBfTENEQ09ONF9HRVRfSFNQVyhtcmVncy0+bGNkY29uNCkgKyAxOworCisJZmJpbmZvLT52YXIucmVkLm9mZnNldCAgICAgID0gMTE7CisJZmJpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0ICAgID0gNTsKKwlmYmluZm8tPnZhci5ibHVlLm9mZnNldCAgICAgPSAwOworCWZiaW5mby0+dmFyLnRyYW5zcC5vZmZzZXQgICA9IDA7CisJZmJpbmZvLT52YXIucmVkLmxlbmd0aCAgICAgID0gNTsKKwlmYmluZm8tPnZhci5ncmVlbi5sZW5ndGggICAgPSA2OworCWZiaW5mby0+dmFyLmJsdWUubGVuZ3RoICAgICA9IDU7CisJZmJpbmZvLT52YXIudHJhbnNwLmxlbmd0aCAgID0gMDsKKwlmYmluZm8tPmZpeC5zbWVtX2xlbiAgICAgICAgPQltYWNoX2luZm8tPnhyZXMubWF4ICoKKwkJCQkJbWFjaF9pbmZvLT55cmVzLm1heCAqCisJCQkJCW1hY2hfaW5mby0+YnBwLm1heCAvIDg7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCWluZm8tPnBhbGV0dGVfYnVmZmVyW2ldID0gUEFMRVRURV9CVUZGX0NMRUFSOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oKHVuc2lnbmVkIGxvbmcpUzNDMjRYWF9WQV9MQ0QsIFNaXzFNLCAiczNjMjQxMC1sY2QiKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZGVhbGxvY19mYjsKKwl9CisKKworCWRwcmludGsoImdvdCBMQ0QgcmVnaW9uXG4iKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgczNjMjQxMGZiX2lycSwgU0FfSU5URVJSVVBULCBwZGV2LT5uYW1lLCBpbmZvKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGdldCBpcnEgJWQgLSBlcnIgJWRcbiIsIGlycSwgcmV0KTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIHJlbGVhc2VfbWVtOworCX0KKworCWluZm8tPmNsayA9IGNsa19nZXQoTlVMTCwgImxjZCIpOworCWlmICghaW5mby0+Y2xrIHx8IElTX0VSUihpbmZvLT5jbGspKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGdldCBsY2QgY2xvY2sgc291cmNlXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byByZWxlYXNlX2lycTsKKwl9CisKKwljbGtfdXNlKGluZm8tPmNsayk7CisJY2xrX2VuYWJsZShpbmZvLT5jbGspOworCWRwcmludGsoImdvdCBhbmQgZW5hYmxlZCBjbG9ja1xuIik7CisKKwltc2xlZXAoMSk7CisKKwkvKiBJbml0aWFsaXplIHZpZGVvIG1lbW9yeSAqLworCXJldCA9IHMzYzI0MTBmYl9tYXBfdmlkZW9fbWVtb3J5KGluZm8pOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAiRmFpbGVkIHRvIGFsbG9jYXRlIHZpZGVvIFJBTTogJWRcbiIsIHJldCk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gcmVsZWFzZV9jbG9jazsKKwl9CisJZHByaW50aygiZ290IHZpZGVvIG1lbW9yeVxuIik7CisKKwlyZXQgPSBzM2MyNDEwZmJfaW5pdF9yZWdpc3RlcnMoaW5mbyk7CisKKwlyZXQgPSBzM2MyNDEwZmJfY2hlY2tfdmFyKCZmYmluZm8tPnZhciwgZmJpbmZvKTsKKworCXJldCA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgZnJhbWVidWZmZXIgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBmcmVlX3ZpZGVvX21lbW9yeTsKKwl9CisKKwkvKiBjcmVhdGUgZGV2aWNlIGZpbGVzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlYnVnKTsKKworCXByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsCisJCWZiaW5mby0+bm9kZSwgZmJpbmZvLT5maXguaWQpOworCisJcmV0dXJuIDA7CisKK2ZyZWVfdmlkZW9fbWVtb3J5OgorCXMzYzI0MTBmYl91bm1hcF92aWRlb19tZW1vcnkoaW5mbyk7CityZWxlYXNlX2Nsb2NrOgorCWNsa19kaXNhYmxlKGluZm8tPmNsayk7CisJY2xrX3VudXNlKGluZm8tPmNsayk7CisJY2xrX3B1dChpbmZvLT5jbGspOworcmVsZWFzZV9pcnE6CisJZnJlZV9pcnEoaXJxLGluZm8pOworcmVsZWFzZV9tZW06CisgCXJlbGVhc2VfbWVtX3JlZ2lvbigodW5zaWduZWQgbG9uZylTM0MyNFhYX1ZBX0xDRCwgUzNDMjRYWF9TWl9MQ0QpOworZGVhbGxvY19mYjoKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGZiaW5mbyk7CisJcmV0dXJuIHJldDsKK30KKworLyogczNjMjQxMGZiX3N0b3BfbGNkCisgKgorICogc2h1dGRvd24gdGhlIGxjZCBjb250cm9sbGVyCisqLworCitzdGF0aWMgdm9pZCBzM2MyNDEwZmJfc3RvcF9sY2Qodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJdG1wID0gcmVhZGwoUzNDMjQxMF9MQ0RDT04xKTsKKwl3cml0ZWwodG1wICYgflMzQzI0MTBfTENEQ09OMV9FTlZJRCwgUzNDMjQxMF9MQ0RDT04xKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqICBDbGVhbnVwCisgKi8KK3N0YXRpYyBpbnQgczNjMjQxMGZiX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBmYl9pbmZvCSAgICpmYmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmluZm8gPSBmYmluZm8tPnBhcjsKKwlpbnQgaXJxOworCisJczNjMjQxMGZiX3N0b3BfbGNkKCk7CisJbXNsZWVwKDEpOworCisJczNjMjQxMGZiX3VubWFwX3ZpZGVvX21lbW9yeShpbmZvKTsKKworIAlpZiAoaW5mby0+Y2xrKSB7CisgCQljbGtfZGlzYWJsZShpbmZvLT5jbGspOworIAkJY2xrX3VudXNlKGluZm8tPmNsayk7CisgCQljbGtfcHV0KGluZm8tPmNsayk7CisgCQlpbmZvLT5jbGsgPSBOVUxMOworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJZnJlZV9pcnEoaXJxLGluZm8pOworCXJlbGVhc2VfbWVtX3JlZ2lvbigodW5zaWduZWQgbG9uZylTM0MyNFhYX1ZBX0xDRCwgUzNDMjRYWF9TWl9MQ0QpOworCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJpbmZvKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKKy8qIHN1c3BlbmQgYW5kIHJlc3VtZSBzdXBwb3J0IGZvciB0aGUgbGNkIGNvbnRyb2xsZXIgKi8KKworc3RhdGljIGludCBzM2MyNDEwZmJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKQoreworCXN0cnVjdCBmYl9pbmZvCSAgICpmYmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmluZm8gPSBmYmluZm8tPnBhcjsKKworCWlmIChsZXZlbCA9PSBTVVNQRU5EX0RJU0FCTEUgfHwgbGV2ZWwgPT0gU1VTUEVORF9QT1dFUl9ET1dOKSB7CisJCXMzYzI0MTBmYl9zdG9wX2xjZCgpOworCisJCS8qIHNsZWVwIGJlZm9yZSBkaXNhYmxpbmcgdGhlIGNsb2NrLCB3ZSBuZWVkIHRvIGVuc3VyZQorCQkgKiB0aGUgTENEIERNQSBlbmdpbmUgaXMgbm90IGdvaW5nIHRvIGdldCBiYWNrIG9uIHRoZSBidXMKKwkJICogYmVmb3JlIHRoZSBjbG9jayBnb2VzIG9mZiBhZ2FpbiAoYmpkKSAqLworCisJCW1zbGVlcCgxKTsKKwkJY2xrX2Rpc2FibGUoaW5mby0+Y2xrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEwZmJfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCXN0cnVjdCBmYl9pbmZvCSAgICpmYmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmluZm8gPSBmYmluZm8tPnBhcjsKKworCWlmIChsZXZlbCA9PSBSRVNVTUVfRU5BQkxFKSB7CisJCWNsa19lbmFibGUoaW5mby0+Y2xrKTsKKwkJbXNsZWVwKDEpOworCisJCXMzYzI0MTBmYl9pbml0X3JlZ2lzdGVycyhpbmZvKTsKKworCX0KKworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBzM2MyNDEwZmJfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHMzYzI0MTBmYl9yZXN1bWUgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgczNjMjQxMGZiX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC1sY2QiLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBzM2MyNDEwZmJfcHJvYmUsCisJLnN1c3BlbmQJPSBzM2MyNDEwZmJfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHMzYzI0MTBmYl9yZXN1bWUsCisJLnJlbW92ZQkJPSBzM2MyNDEwZmJfcmVtb3ZlCit9OworCitpbnQgX19kZXZpbml0IHMzYzI0MTBmYl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmczNjMjQxMGZiX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzM2MyNDEwZmJfY2xlYW51cCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZzM2MyNDEwZmJfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdChzM2MyNDEwZmJfaW5pdCk7Cittb2R1bGVfZXhpdChzM2MyNDEwZmJfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIkFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+LCBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZyYW1lYnVmZmVyIGRyaXZlciBmb3IgdGhlIHMzYzI0MTAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmggYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDA5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3MzYzI0MTBmYi5oCisgKiBDb3B5cmlnaHQgKGMpIEFybmF1ZCBQYXRhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICoJICAgIFMzQzI0MTAgTENEIENvbnRyb2xsZXIgRnJhbWUgQnVmZmVyIERyaXZlcgorICoJICAgIGJhc2VkIG9uIHNrZWxldG9uZmIuYywgc2ExMTAwZmIuaAorICoKKyAqIENoYW5nZUxvZworICoKKyAqIDIwMDQtMTItMDQ6IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKiAgICAgIC0gTW92ZWQgZHByaW50ayB0byBzM2MyNDEwZmIuYworICoKKyAqIDIwMDQtMDktMDc6IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKiAJLSBSZW5hbWVkIGZyb20gaDE5NDBmYi5oIHRvIHMzYzI0MTBmYi5oCisgKiAJLSBDaGVuZ2VkIGgxOTQwIHRvIHMzYzI0MTAKKyAqCisgKiAyMDA0LTA3LTE1OiBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICoJLSBGaXJzdCB2ZXJzaW9uCisgKi8KKworI2lmbmRlZiBfX1MzQzI0MTBGQl9ICisjZGVmaW5lIF9fUzNDMjQxMEZCX0gKKworc3RydWN0IHMzYzI0MTBmYl9pbmZvIHsKKwlzdHJ1Y3QgZmJfaW5mbwkJKmZiOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IGNsawkJKmNsazsKKworCXN0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvICptYWNoX2luZm87CisKKwkvKiByYXcgbWVtb3J5IGFkZHJlc3NlcyAqLworCWRtYV9hZGRyX3QJCW1hcF9kbWE7CS8qIHBoeXNpY2FsICovCisJdV9jaGFyICoJCW1hcF9jcHU7CS8qIHZpcnR1YWwgKi8KKwl1X2ludAkJCW1hcF9zaXplOworCisJc3RydWN0IHMzYzI0MTBmYl9odwlyZWdzOworCisJLyogYWRkcmVzc2VzIG9mIHBpZWNlcyBwbGFjZWQgaW4gcmF3IGJ1ZmZlciAqLworCXVfY2hhciAqCQlzY3JlZW5fY3B1OwkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgYnVmZmVyICovCisJZG1hX2FkZHJfdAkJc2NyZWVuX2RtYTsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQJCXBhbGV0dGVfcmVhZHk7CisKKwkvKiBrZWVwIHRoZXNlIHJlZ2lzdGVycyBpbiBjYXNlIHdlIG5lZWQgdG8gcmUtd3JpdGUgcGFsZXR0ZSAqLworCXUzMgkJCXBhbGV0dGVfYnVmZmVyWzI1Nl07CisJdTMyCQkJcHNldWRvX3BhbFsxNl07Cit9OworCisjZGVmaW5lIFBBTEVUVEVfQlVGRl9DTEVBUiAoMHg4MDAwMDAwMCkJLyogZW50cnkgaXMgY2xlYXIvaW52YWxpZCAqLworCitpbnQgczNjMjQxMGZiX2luaXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmItaTJjLmMgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi1pMmMuYwppbmRleCAwMjRhMGNlLi45NTk0MDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi1pMmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi1pMmMuYwpAQCAtMTM3LDcgKzEzNyw2IEBACiAJcmV0dXJuICgwICE9IChHRVRfQ1JfREFUQShjaGFuLT5pb2FkZHIpICYgUFJPU0FWQUdFX0kyQ19TREFfSU4pKTsKIH0KIAotI2RlZmluZSBJMkNfQUxHT19TQVZBR0UgICAweDBmMDAwMAogc3RhdGljIGludCBzYXZhZ2Vfc2V0dXBfaTJjX2J1cyhzdHJ1Y3Qgc2F2YWdlZmJfaTJjX2NoYW4gKmNoYW4sCiAJCQkJY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTE0Nyw3ICsxNDYsNyBAQAogCWlmIChhZGRfYnVzICYmIGNoYW4tPnBhcikgewogCQlzdHJjcHkoY2hhbi0+YWRhcHRlci5uYW1lLCBuYW1lKTsKIAkJY2hhbi0+YWRhcHRlci5vd25lcgkJPSBUSElTX01PRFVMRTsKLQkJY2hhbi0+YWRhcHRlci5pZAkJPSBJMkNfQUxHT19TQVZBR0U7CisJCWNoYW4tPmFkYXB0ZXIuaWQJCT0gSTJDX0hXX0JfU0FWQUdFOwogCQljaGFuLT5hZGFwdGVyLmFsZ29fZGF0YQkJPSAmY2hhbi0+YWxnbzsKIAkJY2hhbi0+YWRhcHRlci5kZXYucGFyZW50CT0gJmNoYW4tPnBhci0+cGNpZGV2LT5kZXY7CiAJCWNoYW4tPmFsZ28udWRlbGF5CQk9IDQwOwpAQCAtMjYwLDggKzI1OSw5IEBACiAJcmV0dXJuIGJ1ZjsKIH0KIAotaW50IHNhdmFnZWZiX3Byb2JlX2kyY19jb25uZWN0b3Ioc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyLCB1OCAqKm91dF9lZGlkKQoraW50IHNhdmFnZWZiX3Byb2JlX2kyY19jb25uZWN0b3Ioc3RydWN0IGZiX2luZm8gKmluZm8sIHU4ICoqb3V0X2VkaWQpCiB7CisJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXU4ICplZGlkID0gTlVMTDsKIAlpbnQgaTsKIApAQCAtMjcxLDEyICsyNzEsMTkgQEAKIAkJaWYgKGVkaWQpCiAJCQlicmVhazsKIAl9CisKKwlpZiAoIWVkaWQpIHsKKwkJLyogdHJ5IHRvIGdldCBmcm9tIGZpcm13YXJlICovCisJCWVkaWQgPSBrbWFsbG9jKEVESURfTEVOR1RILCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVkaWQpCisJCQltZW1jcHkoZWRpZCwgZmJfZmlybXdhcmVfZWRpZChpbmZvLT5kZXZpY2UpLAorCQkJICAgICAgIEVESURfTEVOR1RIKTsKKwl9CisKIAlpZiAob3V0X2VkaWQpCiAJCSpvdXRfZWRpZCA9IGVkaWQ7Ci0JaWYgKCFlZGlkKQotCQlyZXR1cm4gMTsKIAotCXJldHVybiAwOworCXJldHVybiAoZWRpZCkgPyAwIDogMTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmIuaCBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiLmgKaW5kZXggODU5NGIxZS4uZDZmOTQ3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi5oCkBAIC02MCw2ICs2MCw3IEBACiAKICNkZWZpbmUgUzNfU0FWQUdFX1NFUklFUyhjaGlwKSAgICAoKGNoaXA+PVMzX1NBVkFHRTNEKSAmJiAoY2hpcDw9UzNfU0FWQUdFMjAwMCkpCiAKKyNkZWZpbmUgUzNfTU9CSUxFX1RXSVNURVJfU0VSSUVTKGNoaXApICgoY2hpcD09UzNfVFdJU1RFUikgfHwgKGNoaXAgPT0gUzNfUFJPU0FWQUdFRERSKSkKIAogLyogQ2hpcCB0YWdzLiAgVGhlc2UgYXJlIHVzZWQgdG8gZ3JvdXAgdGhlIGFkYXB0ZXJzIGludG8KICAqIHJlbGF0ZWQgZmFtaWxpZXMuCkBAIC03Myw2ICs3NCw4IEBACiAgIFMzX1BST1NBVkFHRSwKICAgUzNfU1VQRVJTQVZBR0UsCiAgIFMzX1NBVkFHRTIwMDAsCisgIFMzX1BST1NBVkFHRUREUiwKKyAgUzNfVFdJU1RFUiwKICAgUzNfTEFTVAogfSBzYXZhZ2VfY2hpcHNldDsKIApAQCAtMTI4LDYgKzEzMSwxMCBAQAogI2RlZmluZSBCQ0lfQ01EX1NFVF9ST1AoY21kLCByb3ApICAgICgoY21kKSB8PSAoKHJvcCAmIDB4RkYpIDw8IDE2KSkKICNkZWZpbmUgQkNJX0NNRF9TRU5EX0NPTE9SICAgICAgICAgICAweDAwMDA4MDAwCiAKKyNkZWZpbmUgRElTUF9DUlQgICAgIDEKKyNkZWZpbmUgRElTUF9MQ0QgICAgIDIKKyNkZWZpbmUgRElTUF9ERlAgICAgIDMKKwogc3RydWN0IHh0aW1pbmdzIHsKIAl1bnNpZ25lZCBpbnQgQ2xvY2s7CiAJdW5zaWduZWQgaW50IEhEaXNwbGF5OwpAQCAtMTY2LDYgKzE3MywxMCBAQAogCXN0cnVjdCBzYXZhZ2VmYl9pMmNfY2hhbiBjaGFuOwogCXVuc2lnbmVkIGNoYXIgICAqZWRpZDsKIAl1MzIgcHNldWRvX3BhbGV0dGVbMTZdOworCWludCBwbV9zdGF0ZTsKKwlpbnQgZGlzcGxheV90eXBlOworCWludCBkdmk7CisJaW50IGNydG9ubHk7CiAJaW50IGRhY1NwZWVkQnBwOwogCWludCBtYXhDbG9jazsKIAlpbnQgbWluQ2xvY2s7CkBAIC0zMzgsNyArMzQ5LDcgQEAKIAl9IFwKIH0KIAotZXh0ZXJuIGludCBzYXZhZ2VmYl9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciwKK2V4dGVybiBpbnQgc2F2YWdlZmJfcHJvYmVfaTJjX2Nvbm5lY3RvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJCQkJdTggKipvdXRfZWRpZCk7CiBleHRlcm4gdm9pZCBzYXZhZ2VmYl9jcmVhdGVfaTJjX2J1c3NlcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBleHRlcm4gdm9pZCBzYXZhZ2VmYl9kZWxldGVfaTJjX2J1c3NlcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCmluZGV4IGY0NjMzZDEuLmI1Y2EzZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCkBAIC0xNDAwLDYgKzE0MDAsNTggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzYXZhZ2VmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwl1OCBzcjggPSAwLCBzcmQgPSAwOworCisJaWYgKHBhci0+ZGlzcGxheV90eXBlID09IERJU1BfQ1JUKSB7CisJCXZnYV9vdXQ4KDB4M2M0LCAweDA4KTsKKwkJc3I4ID0gdmdhX2luOCgweDNjNSk7CisJCXNyOCB8PSAweDA2OworCQl2Z2Ffb3V0OCgweDNjNSwgc3I4KTsKKwkJdmdhX291dDgoMHgzYzQsIDB4MGQpOworCQlzcmQgPSB2Z2FfaW44KDB4M2M1KTsKKwkJc3JkICY9IDB4MDM7CisKKwkJc3dpdGNoIChibGFuaykgeworCQljYXNlIEZCX0JMQU5LX1VOQkxBTks6CisJCWNhc2UgRkJfQkxBTktfTk9STUFMOgorCQkJYnJlYWs7CisJCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKKwkJCXNyZCB8PSAweDEwOworCQkJYnJlYWs7CisJCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKKwkJCXNyZCB8PSAweDQwOworCQkJYnJlYWs7CisJCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgorCQkJc3JkIHw9IDB4NTA7CisJCQlicmVhazsKKwkJfQorCisJCXZnYV9vdXQ4KDB4M2M0LCAweDBkKTsKKwkJdmdhX291dDgoMHgzYzUsIHNyZCk7CisJfQorCisJaWYgKHBhci0+ZGlzcGxheV90eXBlID09IERJU1BfTENEIHx8CisJICAgIHBhci0+ZGlzcGxheV90eXBlID09IERJU1BfREZQKSB7CisJCXN3aXRjaChibGFuaykgeworCQljYXNlIEZCX0JMQU5LX1VOQkxBTks6CisJCWNhc2UgRkJfQkxBTktfTk9STUFMOgorCQkJdmdhX291dDgoMHgzYzQsIDB4MzEpOyAvKiBTUjMxIGJpdCA0IC0gRlAgZW5hYmxlICovCisJCQl2Z2Ffb3V0OCgweDNjNSwgdmdhX2luOCgweDNjNSkgfCAweDEwKTsKKwkJCWJyZWFrOworCQljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CisJCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKKwkJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046CisJCQl2Z2Ffb3V0OCgweDNjNCwgMHgzMSk7IC8qIFNSMzEgYml0IDQgLSBGUCBlbmFibGUgKi8KKwkJCXZnYV9vdXQ4KDB4M2M1LCB2Z2FfaW44KDB4M2M1KSAmIH4weDEwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIChibGFuayA9PSBGQl9CTEFOS19OT1JNQUwpID8gMSA6IDA7Cit9CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHNhdmFnZWZiX29wcyA9IHsKIAkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKQEAgLTE0MDcsNiArMTQ1OSw3IEBACiAJLmZiX3NldF9wYXIgICAgID0gc2F2YWdlZmJfc2V0X3BhciwKIAkuZmJfc2V0Y29scmVnICAgPSBzYXZhZ2VmYl9zZXRjb2xyZWcsCiAJLmZiX3Bhbl9kaXNwbGF5ID0gc2F2YWdlZmJfcGFuX2Rpc3BsYXksCisJLmZiX2JsYW5rICAgICAgID0gc2F2YWdlZmJfYmxhbmssCiAjaWYgZGVmaW5lZChDT05GSUdfRkJfU0FWQUdFX0FDQ0VMKQogCS5mYl9maWxscmVjdCAgICA9IHNhdmFnZWZiX2ZpbGxyZWN0LAogCS5mYl9jb3B5YXJlYSAgICA9IHNhdmFnZWZiX2NvcHlhcmVhLApAQCAtMTU4Myw4ICsxNjM2LDcgQEAKIAlzdGF0aWMgdW5zaWduZWQgY2hhciBSYW1TYXZhZ2U0W10gPSAgeyAyLCA0LCA4LCAxMiwgMTYsIDMyLCA2NCwgMzIgfTsKIAlzdGF0aWMgdW5zaWduZWQgY2hhciBSYW1TYXZhZ2VNWFtdID0geyAyLCA4LCA0LCAxNiwgOCwgMTYsIDQsIDE2IH07CiAJc3RhdGljIHVuc2lnbmVkIGNoYXIgUmFtU2F2YWdlTkJbXSA9IHsgMCwgMiwgNCwgOCwgMTYsIDMyLCAyLCAyIH07Ci0KLQlpbnQgdmlkZW9SYW0sIHZpZGVvUmFtYnl0ZXM7CisJaW50IHZpZGVvUmFtLCB2aWRlb1JhbWJ5dGVzLCBkdmk7CiAKIAlEQkcoInNhdmFnZV9pbml0X2h3Iik7CiAKQEAgLTE3MDUsNiArMTc1NywzMCBAQAogCXByaW50ayAoS0VSTl9JTkZPICJzYXZhZ2VmYjogRGV0ZWN0ZWQgY3VycmVudCBNQ0xLIHZhbHVlIG9mICVkIGtIelxuIiwKIAkJcGFyLT5NQ0xLKTsKIAorCS8qIGNoZWNrIGZvciBEVkkvZmxhdCBwYW5lbCAqLworCWR2aSA9IDA7CisKKwlpZiAocGFyLT5jaGlwID09IFMzX1NBVkFHRTQpIHsKKwkJdW5zaWduZWQgY2hhciBzcjMwID0gMHgwMDsKKworCQl2Z2Ffb3V0OCgweDNjNCwgMHgzMCk7CisJCS8qIGNsZWFyIGJpdCAxICovCisJCXZnYV9vdXQ4KDB4M2M1LCB2Z2FfaW44KDB4M2M1KSAmIH4weDAyKTsKKwkJc3IzMCA9IHZnYV9pbjgoMHgzYzUpOworCQlpZiAoc3IzMCAmIDB4MDIgLyoweDA0ICovKSB7CisJCQlkdmkgPSAxOworCQkJcHJpbnRrKCJzYXZhZ2VmYjogRGlnaXRhbCBGbGF0IFBhbmVsIERldGVjdGVkXG4iKTsKKwkJfQorCX0KKworCWlmIChTM19TQVZBR0VfTU9CSUxFX1NFUklFUyhwYXItPmNoaXApIHx8CisJICAgIChTM19NT0JJTEVfVFdJU1RFUl9TRVJJRVMocGFyLT5jaGlwKSAmJiAhcGFyLT5jcnRvbmx5KSkKKwkJcGFyLT5kaXNwbGF5X3R5cGUgPSBESVNQX0xDRDsKKwllbHNlIGlmIChkdmkgfHwgKHBhci0+Y2hpcCA9PSBTM19TQVZBR0U0ICYmIHBhci0+ZHZpKSkKKwkJcGFyLT5kaXNwbGF5X3R5cGUgPSBESVNQX0RGUDsKKwllbHNlCisJCXBhci0+ZGlzcGxheV90eXBlID0gRElTUF9DUlQ7CisKIAkvKiBDaGVjayBMQ0QgcGFuZWwgcGFycm1hdGlvbiAqLwogCiAJaWYgKHBhci0+Y2hpcCA9PSBTM19TQVZBR0VfTVgpIHsKQEAgLTE3NTksNyArMTgzNSw4IEBACiAJCQlwYXItPlNhdmFnZVBhbmVsV2lkdGggPSBwYW5lbFg7CiAJCQlwYXItPlNhdmFnZVBhbmVsSGVpZ2h0ID0gcGFuZWxZOwogCi0JCX0KKwkJfSBlbHNlCisJCQlwYXItPmRpc3BsYXlfdHlwZSA9IERJU1BfQ1JUOwogCX0KIAogCXNhdmFnZV9nZXRfZGVmYXVsdF9wYXIgKHBhcik7CkBAIC0xODQ1LDE1ICsxOTIyLDE1IEBACiAJCXNucHJpbnRmIChpbmZvLT5maXguaWQsIDE2LCAiUHJvU2F2YWdlS00iKTsKIAkJYnJlYWs7CiAJY2FzZSBGQl9BQ0NFTF9TM1RXSVNURVJfUDoKLQkJcGFyLT5jaGlwID0gUzNfUFJPU0FWQUdFOworCQlwYXItPmNoaXAgPSBTM19UV0lTVEVSOwogCQlzbnByaW50ZiAoaW5mby0+Zml4LmlkLCAxNiwgIlR3aXN0ZXJQIik7CiAJCWJyZWFrOwogCWNhc2UgRkJfQUNDRUxfUzNUV0lTVEVSX0s6Ci0JCXBhci0+Y2hpcCA9IFMzX1BST1NBVkFHRTsKKwkJcGFyLT5jaGlwID0gUzNfVFdJU1RFUjsKIAkJc25wcmludGYgKGluZm8tPmZpeC5pZCwgMTYsICJUd2lzdGVySyIpOwogCQlicmVhazsKIAljYXNlIEZCX0FDQ0VMX1BST1NBVkFHRV9ERFI6Ci0JCXBhci0+Y2hpcCA9IFMzX1BST1NBVkFHRTsKKwkJcGFyLT5jaGlwID0gUzNfUFJPU0FWQUdFRERSOwogCQlzbnByaW50ZiAoaW5mby0+Zml4LmlkLCAxNiwgIlByb1NhdmFnZUREUiIpOwogCQlicmVhazsKIAljYXNlIEZCX0FDQ0VMX1BST1NBVkFHRV9ERFJLOgpAQCAtMTg5OSwxMiArMTk3NiwxMSBAQAogCQlpbmZvLT5waXhtYXAuYnVmX2FsaWduID0gNDsKIAkJaW5mby0+cGl4bWFwLmFjY2Vzc19hbGlnbiA9IDMyOwogCi0JCWZiX2FsbG9jX2NtYXAgKCZpbmZvLT5jbWFwLCBOUl9QQUxFVFRFLCAwKTsKKwkJZXJyID0gZmJfYWxsb2NfY21hcCAoJmluZm8tPmNtYXAsIE5SX1BBTEVUVEUsIDApOworCQlpZiAoIWVycikKIAkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEgfAogCSAgICAgICAgICAgICAgICAgICAgICAgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1QgfAogCQkgICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9JTUFHRUJMSVQ7Ci0KLQkJZXJyID0gMDsKIAl9CiAjZW5kaWYKIAlyZXR1cm4gZXJyOwpAQCAtMTkzMiwxNCArMjAwOCwxNCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZmFpbGVkX2VuYWJsZTsKIAotCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKGRldiwgInNhdmFnZWZiIikpIHsKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoZGV2LCAic2F2YWdlZmIiKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgcmVxdWVzdCBQQ0kgcmVnaW9uc1xuIik7CiAJCWdvdG8gZmFpbGVkX2VuYWJsZTsKIAl9CiAKIAllcnIgPSAtRU5PTUVNOwogCi0JaWYgKHNhdmFnZV9pbml0X2ZiX2luZm8oaW5mbywgZGV2LCBpZCkpCisJaWYgKChlcnIgPSBzYXZhZ2VfaW5pdF9mYl9pbmZvKGluZm8sIGRldiwgaWQpKSkKIAkJZ290byBmYWlsZWRfaW5pdDsKIAogCWVyciA9IHNhdmFnZV9tYXBfbW1pbyhpbmZvKTsKQEAgLTE5NDcsNiArMjAyMyw3IEBACiAJCWdvdG8gZmFpbGVkX21taW87CiAKIAl2aWRlb19sZW4gPSBzYXZhZ2VfaW5pdF9odyhwYXIpOworCS8qIEZJWE1FOiBjYW50IGJlIG5lZ2F0aXZlICovCiAJaWYgKHZpZGVvX2xlbiA8IDApIHsKIAkJZXJyID0gdmlkZW9fbGVuOwogCQlnb3RvIGZhaWxlZF9tbWlvOwpAQCAtMTk1OSw3ICsyMDM2LDggQEAKIAlJTklUX0xJU1RfSEVBRCgmaW5mby0+bW9kZWxpc3QpOwogI2lmIGRlZmluZWQoQ09ORklHX0ZCX1NBVkFHRV9JMkMpCiAJc2F2YWdlZmJfY3JlYXRlX2kyY19idXNzZXMoaW5mbyk7Ci0Jc2F2YWdlZmJfcHJvYmVfaTJjX2Nvbm5lY3RvcihwYXIsICZwYXItPmVkaWQpOworCXNhdmFnZWZiX3Byb2JlX2kyY19jb25uZWN0b3IoaW5mbywgJnBhci0+ZWRpZCk7CisJa2ZyZWUocGFyLT5lZGlkKTsKIAlmYl9lZGlkX3RvX21vbnNwZWNzKHBhci0+ZWRpZCwgJmluZm8tPm1vbnNwZWNzKTsKIAlmYl92aWRlb21vZGVfdG9fbW9kZWxpc3QoaW5mby0+bW9uc3BlY3MubW9kZWRiLAogCQkJCSBpbmZvLT5tb25zcGVjcy5tb2RlZGJfbGVuLApAQCAtMjExMCwxNSArMjE4OCwzMSBAQAogCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICopaW5mby0+cGFyOwogCiAJREJHKCJzYXZhZ2VmYl9zdXNwZW5kIik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgInN0YXRlOiAldVxuIiwgc3RhdGUpOworCisKKwlwYXItPnBtX3N0YXRlID0gc3RhdGUuZXZlbnQ7CisKKwkvKgorCSAqIEZvciBQTV9FVkVOVF9GUkVFWkUsIGRvIG5vdCBwb3dlciBkb3duIHNvIHRoZSBjb25zb2xlCisJICogY2FuIHJlbWFpbiBhY3RpdmUuCisJICovCisJaWYgKHN0YXRlLmV2ZW50ID09IFBNX0VWRU5UX0ZSRUVaRSkgeworCQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOworCQlyZXR1cm4gMDsKKwl9CiAKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7Ci0JZmJfc2V0X3N1c3BlbmQoaW5mbywgcGNpX2Nob29zZV9zdGF0ZShkZXYsIHN0YXRlKSk7Ci0Jc2F2YWdlX2Rpc2FibGVfbW1pbyhwYXIpOwotCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwlmYl9zZXRfc3VzcGVuZChpbmZvLCAxKTsKIAorCWlmIChpbmZvLT5mYm9wcy0+ZmJfc3luYykKKwkJaW5mby0+ZmJvcHMtPmZiX3N5bmMoaW5mbyk7CisKKwlzYXZhZ2VmYl9ibGFuayhGQl9CTEFOS19QT1dFUkRPV04sIGluZm8pOworCXNhdmFnZV9kaXNhYmxlX21taW8ocGFyKTsKKwlwY2lfc2F2ZV9zdGF0ZShkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBwY2lfY2hvb3NlX3N0YXRlKGRldiwgc3RhdGUpKTsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIxMjgsMjIgKzIyMjIsMzQgQEAKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9CiAJCShzdHJ1Y3QgZmJfaW5mbyAqKXBjaV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICopaW5mby0+cGFyOworCWludCBjdXJfc3RhdGUgPSBwYXItPnBtX3N0YXRlOwogCiAJREJHKCJzYXZhZ2VfcmVzdW1lIik7CiAKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgMCk7Ci0JcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKLQlpZihwY2lfZW5hYmxlX2RldmljZShkZXYpKQotCQlEQkcoImVyciIpOworCXBhci0+cG1fc3RhdGUgPSBQTV9FVkVOVF9PTjsKIAotCVNhdmFnZVByaW50UmVncygpOworCS8qCisJICogVGhlIGFkYXB0ZXIgd2FzIG5vdCBwb3dlcmVkIGRvd24gY29taW5nIGJhY2sgZnJvbSBhCisJICogUE1fRVZFTlRfRlJFRVpFLgorCSAqLworCWlmIChjdXJfc3RhdGUgPT0gUE1fRVZFTlRfRlJFRVpFKSB7CisJCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBQQ0lfRDApOworCQlyZXR1cm4gMDsKKwl9CiAKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CiAKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOworCisJaWYocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKKwkJREJHKCJlcnIiKTsKKworCXBjaV9zZXRfbWFzdGVyKGRldik7CiAJc2F2YWdlX2VuYWJsZV9tbWlvKHBhcik7CiAJc2F2YWdlX2luaXRfaHcocGFyKTsKIAlzYXZhZ2VmYl9zZXRfcGFyIChpbmZvKTsKLQorCXNhdmFnZWZiX2JsYW5rKEZCX0JMQU5LX1VOQkxBTkssIGluZm8pOwogCWZiX3NldF9zdXNwZW5kIChpbmZvLCAwKTsKIAlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAKQEAgLTIyNzcsMyArMjM4Myw2IEBACiAKIG1vZHVsZV9pbml0KHNhdmFnZWZiX2luaXQpOwogbW9kdWxlX2V4aXQoc2F2YWdlX2RvbmUpOworCittb2R1bGVfcGFyYW0obW9kZV9vcHRpb24sIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZV9vcHRpb24sICJTcGVjaWZ5IGluaXRpYWwgdmlkZW8gbW9kZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvMzAwdnRibC5oIGIvZHJpdmVycy92aWRlby9zaXMvMzAwdnRibC5oCmluZGV4IGI2ZDVjNzEuLmU0YjRhMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2lzLzMwMHZ0YmwuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy8zMDB2dGJsLmgKQEAgLTMsNyArMyw3IEBACiAvKgogICogUmVnaXN0ZXIgc2V0dGluZ3MgZm9yIFNpUyAzMDAgc2VyaWVzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKICAqCiAgKiBJZiBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIHRoZSBmb2xsb3dpbmcgbGljZW5zZSB0ZXJtcwogICogYXBwbHk6CkBAIC01MCwzMSArNTAsNyBAQAogICoKICAqLwogCi1zdGF0aWMgY29uc3QgU2lTX1N0U3RydWN0ICBTaVMzMDBfU01vZGVJRFRhYmxlW10gPQotewotCXsweDAxLDB4OTIwOCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4MDEsMHgxMjEwLDB4MTQsMHgwMSwweDAxLDB4MDAsMHgwMCwweDAwLCAwfSwKLQl7MHgwMSwweDEwMTAsMHgxNywweDAyLDB4MDIsMHgwMCwweDAwLDB4MDAsIDB9LAotCXsweDAzLDB4ODIwOCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4MDMsMHgwMjEwLDB4MTYsMHgwMSwweDAxLDB4MDAsMHgwMCwweDAwLCAwfSwKLQl7MHgwMywweDAwMTAsMHgxOCwweDAyLDB4MDIsMHgwMCwweDAwLDB4MDAsIDB9LAotCXsweDA1LDB4OTIwOSwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4MDYsMHg4MjA5LDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAwfSwKLQl7MHgwNywweDAwMDAsMHgwNywweDAzLDB4MDMsMHgwMCwweDAwLDB4MDAsIDB9LAotCXsweDA3LDB4MDAwMCwweDE5LDB4MDIsMHgwMiwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4MGQsMHg5MjBhLDB4MGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAwfSwKLQl7MHgwZSwweDgyMGEsMHgwZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIDB9LAotCXsweDBmLDB4MDIwMiwweDExLDB4MDEsMHgwMSwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4MTAsMHgwMjEyLDB4MTIsMHgwMSwweDAxLDB4MDAsMHgwMCwweDAwLCAwfSwKLQl7MHgxMSwweDAyMTIsMHgxYSwweDA0LDB4MDQsMHgwMCwweDAwLDB4MDAsIDB9LAotCXsweDEyLDB4MDIxMiwweDFiLDB4MDQsMHgwNCwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4MTMsMHgwMjFiLDB4MWMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAwfSwKLQl7MHgxMiwweDAwMTAsMHgxOCwweDAyLDB4MDIsMHgwMCwweDAwLDB4MDAsIDB9LAotCXsweDEyLDB4MDIxMCwweDE4LDB4MDEsMHgwMSwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4ZmYsICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19FeHRTdHJ1Y3QgIFNpUzMwMF9FTW9kZUlEVGFibGVbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19FeHQgU2lTMzAwX0VNb2RlSURUYWJsZVtdID0KIHsKIAl7MHg2YSwweDIyMTIsMHgwMTAyLFNJU19SSV84MDB4NjAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLC0xfSwgIC8qIDgwMHg2MDB4PyAqLwogCXsweDJlLDB4MGExYiwweDAxMDEsU0lTX1JJXzY0MHg0ODAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsLTF9LApAQCAtMTEwLDcgKzg2LDcgQEAKIAl7MHg1OSwweDkyMWIsMHgwMTM4LFNJU19SSV8zMjB4MjAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDIzLC0xfSwgIC8qIDMyMHgyMDB4OCAgKi8KIAl7MHg1YywweDkyMWYsMHgwMDAwLFNJU19SSV81MTJ4Mzg0LCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDI2LC0xfSwgIC8qIDUxMngzODR4MzIgKi8KIAl7MHg1ZCwweDAyMWQsMHgwMTM5LFNJU19SSV82NDB4NDAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLC0xfSwgIC8qIDY0MHg0MDB4MTYgKi8KLSAJezB4NWUsMHgwMjFmLDB4MDAwMCxTSVNfUklfNjQweDQwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwtMX0sICAvKiA2NDB4NDAweDMyICovCisJezB4NWUsMHgwMjFmLDB4MDAwMCxTSVNfUklfNjQweDQwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwtMX0sICAvKiA2NDB4NDAweDMyICovCiAJezB4NjIsMHgwYTNmLDB4MDEzYSxTSVNfUklfNjQweDQ4MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwtMX0sCiAJezB4NjMsMHgyYTNmLDB4MDEzYixTSVNfUklfODAweDYwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwtMX0sICAvKiA4MDB4NjAweDMyICovCiAJezB4NjQsMHgwYTdmLDB4MDEzYyxTSVNfUklfMTAyNHg3NjgsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMywtMX0sCkBAIC0xMTksOCArOTUsOCBAQAogCXsweDY4LDB4MDY3YiwweDAxM2YsU0lTX1JJXzE5MjB4MTQ0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsLTF9LAogCXsweDY5LDB4MDZmZCwweDAxNDAsU0lTX1JJXzE5MjB4MTQ0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsLTF9LAogCXsweDZiLDB4MDdmZiwweDAwMDAsU0lTX1JJXzE5MjB4MTQ0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsLTF9LAotCXsweDZjLDB4MDY3YiwweDAwMDAsU0lTX1JJXzIwNDh4MTUzNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjgsLTF9LCAgLyogMjA0OHgxNTM2eDggLSBub3QgaW4gQklPUyEgKi8KLQl7MHg2ZCwweDA2ZmQsMHgwMDAwLFNJU19SSV8yMDQ4eDE1MzYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI4LC0xfSwgIC8qIDIwNDh4MTUzNngxNiAtIG5vdCBpbiBCSU9TISAqLworCXsweDZjLDB4MDY3YiwweDAwMDAsU0lTX1JJXzIwNDh4MTUzNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjgsLTF9LCAgLyogMjA0OHgxNTM2eDggKi8KKwl7MHg2ZCwweDA2ZmQsMHgwMDAwLFNJU19SSV8yMDQ4eDE1MzYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI4LC0xfSwgIC8qIDIwNDh4MTUzNngxNiAqLwogCXsweDcwLDB4NmExYiwweDAwMDAsU0lTX1JJXzgwMHg0ODAsICAweDAwLDB4MDAsMHgwNywweDAwLDB4MmQsLTF9LCAgLyogODAweDQ4MHg4ICovCiAJezB4NzEsMHg0YTFiLDB4MDAwMCxTSVNfUklfMTAyNHg1NzYsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwtMX0sICAvKiAxMDI0eDU3Nng4ICovCiAJezB4NzQsMHg0YTFkLDB4MDAwMCxTSVNfUklfMTAyNHg1NzYsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwtMX0sICAvKiAxMDI0eDU3NngxNiAqLwpAQCAtMTY2LDc3ICsxNDIsNzcgQEAKIAl7MHhmZiwweDAwMDAsMHhmZmZmLDAsICAgICAgICAgICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19FeHQyU3RydWN0ICBTaVMzMDBfUmVmSW5kZXhbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19FeHQyIFNpUzMwMF9SZWZJbmRleFtdID0KIHsKLQl7MHgwODVmLDB4MGQsMHgwMywweDA1LDB4MDUsMHg2YSwgODAwLCA2MDAsIDB9LCAvKiAwMCAqLwotCXsweDA0NjcsMHgwZSwweDQ0LDB4MDUsMHgwNSwweDZhLCA4MDAsIDYwMCwgMH0sIC8qIDAxICovCi0JezB4MDA2NywweDBmLDB4MDcsMHg0OCwweDA1LDB4NmEsIDgwMCwgNjAwLCAwfSwgLyogMDIgLSBDUlQxQ1JUQyB3YXMgMHg0ZiAqLwotCXsweDAwNjcsMHgxMCwweDA2LDB4OGIsMHgwNSwweDZhLCA4MDAsIDYwMCwgMH0sIC8qIDAzICovCi0JezB4MDE0NywweDExLDB4MDgsMHgwMCwweDA1LDB4NmEsIDgwMCwgNjAwLCAwfSwgLyogMDQgKi8KLQl7MHgwMTQ3LDB4MTIsMHgwYywweDAwLDB4MDUsMHg2YSwgODAwLCA2MDAsIDB9LCAvKiAwNSAqLwotCXsweDAwNDcsMHgxMSwweDRlLDB4MDAsMHgwNSwweDZhLCA4MDAsIDYwMCwgMH0sIC8qIDA2IC0gQ1JUMUNSVEMgd2FzIDB4NTEgKi8KLQl7MHgwMDQ3LDB4MTEsMHgxMywweDAwLDB4MDUsMHg2YSwgODAwLCA2MDAsIDB9LCAvKiAwNyAqLwotCXsweGM4NWYsMHgwNSwweDAwLDB4MDQsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMH0sIC8qIDA4ICovCi0JezB4YzA2NywweDA2LDB4MDIsMHgwNCwweDA0LDB4MmUsIDY0MCwgNDgwLCAwfSwgLyogMDkgKi8KLQl7MHhjMDY3LDB4MDcsMHgwMiwweDQ3LDB4MDQsMHgyZSwgNjQwLCA0ODAsIDB9LCAvKiAwYSAqLwotCXsweGMwNjcsMHgwOCwweDAzLDB4OGEsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMH0sIC8qIDBiICovCi0JezB4YzA0NywweDA5LDB4MDUsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAwfSwgLyogMGMgKi8KLQl7MHhjMDQ3LDB4MGEsMHgwOCwweDAwLDB4MDQsMHgyZSwgNjQwLCA0ODAsIDB9LCAvKiAwZCAqLwotCXsweGMwNDcsMHgwYiwweDBhLDB4MDAsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMH0sIC8qIDBlICovCi0JezB4YzA0NywweDBjLDB4MTAsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAwfSwgLyogMGYgKi8KLQl7MHg0ODdmLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgyZiwgNjQwLCA0MDAsIDB9LCAvKiAxMCAqLwotCXsweGMwNmYsMHgzMSwweDAxLDB4MDYsMHgxMywweDMxLCA3MjAsIDQ4MCwgMH0sIC8qIDExICovCi0JezB4MDA2ZiwweDMyLDB4MDMsMHgwNiwweDE0LDB4MzIsIDcyMCwgNTc2LCAwfSwgLyogMTIgKi8KLQl7MHgwMTg3LDB4MTUsMHgwNSwweDAwLDB4MDYsMHgzNywxMDI0LCA3NjgsIDB9LCAvKiAxMyAqLwotICAgICAgICB7MHhjODc3LDB4MTYsMHgwOSwweDA2LDB4MDYsMHgzNywxMDI0LCA3NjgsIDB9LCAvKiAxNCAqLwotCXsweGMwNjcsMHgxNywweDBiLDB4NDksMHgwNiwweDM3LDEwMjQsIDc2OCwgMH0sIC8qIDE1IC0gQ1JUMUNSVEMgd2FzIDB4OTcgKi8KLQl7MHgwMjY3LDB4MTgsMHgwZCwweDAwLDB4MDYsMHgzNywxMDI0LCA3NjgsIDB9LCAvKiAxNiAqLwotCXsweDAwNDcsMHgxOSwweDExLDB4OGMsMHgwNiwweDM3LDEwMjQsIDc2OCwgMH0sIC8qIDE3IC0gQ1JUMUNSVEMgd2FzIDB4NTkgKi8KLQl7MHgwMDQ3LDB4MWEsMHg1MiwweDAwLDB4MDYsMHgzNywxMDI0LCA3NjgsIDB9LCAvKiAxOCAqLwotCXsweDAwMDcsMHgxYiwweDE2LDB4MDAsMHgwNiwweDM3LDEwMjQsIDc2OCwgMH0sIC8qIDE5IC0gQ1JUMUNSVEMgd2FzIDB4NWIgKi8KLQl7MHgwMzg3LDB4MWMsMHg0ZCwweDAwLDB4MDcsMHgzYSwxMjgwLDEwMjQsIDB9LCAvKiAxYSAtIENSVDFDUlRDIHdhcyAweDVjICovCi0JezB4MDA3NywweDFkLDB4MTQsMHgwNywweDA3LDB4M2EsMTI4MCwxMDI0LCAwfSwgLyogMWIgKi8KLQl7MHgwMDQ3LDB4MWUsMHgxNywweDAwLDB4MDcsMHgzYSwxMjgwLDEwMjQsIDB9LCAvKiAxYyAqLwotCXsweDAwMDcsMHgxZiwweDk4LDB4MDAsMHgwNywweDNhLDEyODAsMTAyNCwgMH0sIC8qIDFkICovCi0JezB4MDAwNywweDIwLDB4NTksMHgwMCwweDAwLDB4M2MsMTYwMCwxMjAwLCAwfSwgLyogMWUgLSBDUlQxQ1JUQyB3YXMgMHg2MCAqLwotCXsweDAwMDcsMHgyMSwweDVhLDB4MDAsMHgwMCwweDNjLDE2MDAsMTIwMCwgMH0sIC8qIDFmICovCi0JezB4MDAwNywweDIyLDB4MWIsMHgwMCwweDAwLDB4M2MsMTYwMCwxMjAwLCAwfSwgLyogMjAgKi8KLQl7MHgwMDA3LDB4MjMsMHgxZCwweDAwLDB4MDAsMHgzYywxNjAwLDEyMDAsIDB9LCAvKiAyMSAtIENSVDFDUlRDIHdhcyAweDYzICovCi0JezB4MDAwNywweDI0LDB4MWUsMHgwMCwweDAwLDB4M2MsMTYwMCwxMjAwLCAwfSwgLyogMjIgKi8KLQl7MHg0MDdmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwgMzIwLCAyMDAsIDB9LCAvKiAyMyAqLwotCXsweGMwN2YsMHgwMSwweDAwLDB4MDQsMHgwNCwweDUwLCAzMjAsIDI0MCwgMH0sIC8qIDI0ICovCi0JezB4MDA3NywweDAyLDB4MDQsMHgwNSwweDA1LDB4NTEsIDQwMCwgMzAwLCAwfSwgLyogMjUgKi8KLQl7MHhjODc3LDB4MDMsMHgwOSwweDA2LDB4MDYsMHg1MiwgNTEyLCAzODQsIDB9LCAvKiAyNiAqLyAgLyogd2FzIGMwNzcgKi8KLQl7MHg4MjA3LDB4MjUsMHgxZiwweDAwLDB4MDAsMHg2OCwxOTIwLDE0NDAsIDB9LCAvKiAyNyAqLwotCXsweDAwMDcsMHgyNiwweDIwLDB4MDAsMHgwMCwweDZjLDIwNDgsMTUzNiwgMH0sIC8qIDI4ICovCi0JezB4MDA2NywweDI3LDB4MTQsMHgwOCwweDBhLDB4NmUsMTI4MCwgOTYwLCAwfSwgLyogMjkgLSAxMjgweDk2MC02MCAqLwotCXsweDAwMjcsMHg0NSwweDNjLDB4MDgsMHgwYSwweDZlLDEyODAsIDk2MCwgMH0sIC8qIDJhIC0gMTI4MHg5NjAtODUgKi8KLQl7MHhjMDc3LDB4MzMsMHgwOSwweDA2LDB4MDAsMHgyMCwxMDI0LCA2MDAsIDB9LCAvKiAyYiAqLwotCXsweGMwNzcsMHgzNCwweDBiLDB4MDYsMHgwMCwweDIzLDExNTIsIDc2OCwgMH0sIC8qIDJjICovCS8qIFZDTEsgMHgwOSAqLwotCXsweDAwNzcsMHgzNSwweDI3LDB4MDgsMHgxOCwweDcwLCA4MDAsIDQ4MCwgMH0sIC8qIDJkICovCi0JezB4MDA0NywweDM2LDB4MzcsMHgwOCwweDE4LDB4NzAsIDgwMCwgNDgwLCAwfSwgLyogMmUgKi8KLQl7MHgwMDQ3LDB4MzcsMHgwOCwweDA4LDB4MTgsMHg3MCwgODAwLCA0ODAsIDB9LCAvKiAyZiAqLwotCXsweDAwNzcsMHgzOCwweDA5LDB4MDksMHgxOSwweDcxLDEwMjQsIDU3NiwgMH0sIC8qIDMwICovCi0JezB4MDA0NywweDM5LDB4MzgsMHgwOSwweDE5LDB4NzEsMTAyNCwgNTc2LCAwfSwgLyogMzEgKi8KLQl7MHgwMDQ3LDB4M2EsMHgxMSwweDA5LDB4MTksMHg3MSwxMDI0LCA1NzYsIDB9LCAvKiAzMiAqLwotCXsweDAwNzcsMHgzYiwweDM5LDB4MGEsMHgwYywweDc1LDEyODAsIDcyMCwgMH0sIC8qIDMzICovCi0JezB4MDA0NywweDNjLDB4M2EsMHgwYSwweDBjLDB4NzUsMTI4MCwgNzIwLCAwfSwgLyogMzQgKi8KLQl7MHgwMDA3LDB4M2QsMHgzYiwweDBhLDB4MGMsMHg3NSwxMjgwLCA3MjAsIDB9LCAvKiAzNSAqLwotCXsweDAwNjcsMHg0OSwweDM1LDB4MDYsMHgxYSwweDI5LDExNTIsIDg2NCwgMH0sIC8qIDM2IDExNTJ4ODY0LTYwSHogICovCi0JezB4MDA2NywweDNlLDB4MzQsMHgwNiwweDFhLDB4MjksMTE1MiwgODY0LCAwfSwgLyogMzcgMTE1Mng4NjQtNzVIeiAqLwotCXsweDAwNDcsMHg0NCwweDNhLDB4MDYsMHgxYSwweDI5LDExNTIsIDg2NCwgMH0sIC8qIDM4IDExNTJ4ODY0LTg1SHogKi8KLQl7MHgwMGM3LDB4M2YsMHgyOCwweDAwLDB4MTYsMHgzOSwgODQ4LCA0ODAsIDB9LCAvKiAzOSA4NDh4NDgwLTM4SHppICovCi0JezB4YzA2NywweDQwLDB4M2QsMHgwYiwweDE2LDB4MzksIDg0OCwgNDgwLCAwfSwgLyogM2EgODQ4eDQ4MC02MEh6ICAqLwotCXsweDAwYzcsMHg0MSwweDI4LDB4MDAsMHgxNywweDNmLCA4NTYsIDQ4MCwgMH0sIC8qIDNiIDg1Nng0ODAtMzhIemkgKi8KLQl7MHhjMDQ3LDB4NDIsMHgyOCwweDAwLDB4MTcsMHgzZiwgODU2LCA0ODAsIDB9LCAvKiAzYyA4NTZ4NDgwLTYwSHogICovCi0JezB4MDA2NywweDQzLDB4M2UsMHgwYywweDFiLDB4NDgsMTM2MCwgNzY4LCAwfSwgLyogM2QgMTM2MHg3NjgtNjBIeiAqLwotCXsweDAwNzcsMHg0NiwweDNmLDB4MDgsMHgwOCwweDU1LDEyODAsIDc2OCwgMH0sIC8qIDNlIDEyODB4NzY4LTYwSHogKi8KLQl7MHgwMDZmLDB4NDcsMHgwMywweDA2LDB4MTUsMHg1ZiwgNzY4LCA1NzYsIDB9LCAvKiAzZiA3Njh4NTc2ICovCi0JezB4MDAyNywweDQ4LDB4MTMsMHgwOCwweDAwLDB4NjcsMTM2MCwxMDI0LCAwfSwgLyogNDAgMTM2MHgxMDI0LTU5SHogKEJBUkNPMTM2NiBvbmx5KSAqLwotCXsweGZmZmYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMH0KKwl7MHgwODVmLDB4MGQsMHgwMywweDA1LDB4MDUsMHg2YSwgODAwLCA2MDAsIDAsIDB4MDAsIDB4MDB9LCAvKiAwMCAqLworCXsweDA0NjcsMHgwZSwweDA0LDB4MDUsMHgwNSwweDZhLCA4MDAsIDYwMCwgMCwgMHgwMCwgMHgwMH0sIC8qIDAxICovCisJezB4MDA2NywweDBmLDB4MDcsMHg0OCwweDA1LDB4NmEsIDgwMCwgNjAwLCAwLCAweDAwLCAweDAwfSwgLyogMDIgLSBDUlQxQ1JUQyB3YXMgMHg0ZiAqLworCXsweDAwNjcsMHgxMCwweDA2LDB4OGIsMHgwNSwweDZhLCA4MDAsIDYwMCwgMCwgMHgwMCwgMHgwMH0sIC8qIDAzICovCisJezB4MDE0NywweDExLDB4MDgsMHgwMCwweDA1LDB4NmEsIDgwMCwgNjAwLCAwLCAweDAwLCAweDAwfSwgLyogMDQgKi8KKwl7MHgwMTQ3LDB4MTIsMHgwYywweDAwLDB4MDUsMHg2YSwgODAwLCA2MDAsIDAsIDB4MDAsIDB4MDB9LCAvKiAwNSAqLworCXsweDAwNDcsMHgxMSwweDBlLDB4MDAsMHgwNSwweDZhLCA4MDAsIDYwMCwgMCwgMHgwMCwgMHgwMH0sIC8qIDA2IC0gQ1JUMUNSVEMgd2FzIDB4NTEgKi8KKwl7MHgwMDQ3LDB4MTEsMHgxMywweDAwLDB4MDUsMHg2YSwgODAwLCA2MDAsIDAsIDB4MDAsIDB4MDB9LCAvKiAwNyAqLworCXsweGM4NWYsMHgwNSwweDAwLDB4MDQsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDA4ICovCisJezB4YzA2NywweDA2LDB4MDIsMHgwNCwweDA0LDB4MmUsIDY0MCwgNDgwLCAwLCAweDAwLCAweDAwfSwgLyogMDkgKi8KKwl7MHhjMDY3LDB4MDcsMHgwMiwweDQ3LDB4MDQsMHgyZSwgNjQwLCA0ODAsIDAsIDB4MDAsIDB4MDB9LCAvKiAwYSAqLworCXsweGMwNjcsMHgwOCwweDAzLDB4OGEsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDBiICovCisJezB4YzA0NywweDA5LDB4MDUsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAwLCAweDAwLCAweDAwfSwgLyogMGMgKi8KKwl7MHhjMDQ3LDB4MGEsMHgwOCwweDAwLDB4MDQsMHgyZSwgNjQwLCA0ODAsIDAsIDB4MDAsIDB4MDB9LCAvKiAwZCAqLworCXsweGMwNDcsMHgwYiwweDBhLDB4MDAsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDBlICovCisJezB4YzA0NywweDBjLDB4MTAsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAwLCAweDAwLCAweDAwfSwgLyogMGYgKi8KKwl7MHg0ODdmLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgyZiwgNjQwLCA0MDAsIDAsIDB4NGEsIDB4NDl9LCAvKiAxMCAqLworCXsweGMwNmYsMHgzMSwweDAxLDB4MDYsMHgxMywweDMxLCA3MjAsIDQ4MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDExICovCisJezB4MDA2ZiwweDMyLDB4NGEsMHgwNiwweDE0LDB4MzIsIDcyMCwgNTc2LCAwLCAweDAwLCAweDAwfSwgLyogMTIgKi8gLyogNGEgd2FzIDAzICovCisJezB4MDE4NywweDE1LDB4MDUsMHgwMCwweDA2LDB4MzcsMTAyNCwgNzY4LCAwLCAweDAwLCAweDAwfSwgLyogMTMgKi8KKwl7MHhjODc3LDB4MTYsMHgwOSwweDA2LDB4MDYsMHgzNywxMDI0LCA3NjgsIDAsIDB4MDAsIDB4MDB9LCAvKiAxNCAqLworCXsweGMwNjcsMHgxNywweDBiLDB4NDksMHgwNiwweDM3LDEwMjQsIDc2OCwgMCwgMHgwMCwgMHgwMH0sIC8qIDE1IC0gQ1JUMUNSVEMgd2FzIDB4OTcgKi8KKwl7MHgwMjY3LDB4MTgsMHgwZCwweDAwLDB4MDYsMHgzNywxMDI0LCA3NjgsIDAsIDB4MDAsIDB4MDB9LCAvKiAxNiAqLworCXsweDAwNDcsMHgxOSwweDExLDB4OGMsMHgwNiwweDM3LDEwMjQsIDc2OCwgMCwgMHgwMCwgMHgwMH0sIC8qIDE3IC0gQ1JUMUNSVEMgd2FzIDB4NTkgKi8KKwl7MHgwMDQ3LDB4MWEsMHgxMiwweDAwLDB4MDYsMHgzNywxMDI0LCA3NjgsIDAsIDB4MDAsIDB4MDB9LCAvKiAxOCAqLworCXsweDAwMDcsMHgxYiwweDE2LDB4MDAsMHgwNiwweDM3LDEwMjQsIDc2OCwgMCwgMHgwMCwgMHgwMH0sIC8qIDE5IC0gQ1JUMUNSVEMgd2FzIDB4NWIgKi8KKwl7MHgwMzg3LDB4MWMsMHgwZCwweDAwLDB4MDcsMHgzYSwxMjgwLDEwMjQsIDAsIDB4MDAsIDB4MDB9LCAvKiAxYSAtIENSVDFDUlRDIHdhcyAweDVjICovCisJezB4MDA3NywweDFkLDB4MTQsMHgwNywweDA3LDB4M2EsMTI4MCwxMDI0LCAwLCAweDAwLCAweDAwfSwgLyogMWIgKi8KKwl7MHgwMDQ3LDB4MWUsMHgxNywweDAwLDB4MDcsMHgzYSwxMjgwLDEwMjQsIDAsIDB4MDAsIDB4MDB9LCAvKiAxYyAqLworCXsweDAwMDcsMHgxZiwweDE4LDB4MDAsMHgwNywweDNhLDEyODAsMTAyNCwgMCwgMHgwMCwgMHgwMH0sIC8qIDFkICovCisJezB4MDAwNywweDIwLDB4MTksMHgwMCwweDAwLDB4M2MsMTYwMCwxMjAwLCAwLCAweDAwLCAweDAwfSwgLyogMWUgLSBDUlQxQ1JUQyB3YXMgMHg2MCAqLworCXsweDAwMDcsMHgyMSwweDFhLDB4MDAsMHgwMCwweDNjLDE2MDAsMTIwMCwgMCwgMHgwMCwgMHgwMH0sIC8qIDFmICovCisJezB4MDAwNywweDIyLDB4MWIsMHgwMCwweDAwLDB4M2MsMTYwMCwxMjAwLCAwLCAweDAwLCAweDAwfSwgLyogMjAgKi8KKwl7MHgwMDA3LDB4MjMsMHgxZCwweDAwLDB4MDAsMHgzYywxNjAwLDEyMDAsIDAsIDB4MDAsIDB4MDB9LCAvKiAyMSAtIENSVDFDUlRDIHdhcyAweDYzICovCisJezB4MDAwNywweDI0LDB4MWUsMHgwMCwweDAwLDB4M2MsMTYwMCwxMjAwLCAwLCAweDAwLCAweDAwfSwgLyogMjIgKi8KKwl7MHg0MDdmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwgMzIwLCAyMDAsIDAsIDB4NGIsIDB4NGJ9LCAvKiAyMyAqLworCXsweGMwN2YsMHgwMSwweDAwLDB4MDQsMHgwNCwweDUwLCAzMjAsIDI0MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDI0ICovCisJezB4MDA3NywweDAyLDB4MDQsMHgwNSwweDA1LDB4NTEsIDQwMCwgMzAwLCAwLCAweDAwLCAweDAwfSwgLyogMjUgKi8KKwl7MHhjODc3LDB4MDMsMHgwOSwweDA2LDB4MDYsMHg1MiwgNTEyLCAzODQsIDAsIDB4MDAsIDB4MDB9LCAvKiAyNiAqLyAgLyogd2FzIGMwNzcgKi8KKwl7MHg4MjA3LDB4MjUsMHgxZiwweDAwLDB4MDAsMHg2OCwxOTIwLDE0NDAsIDAsIDB4MDAsIDB4MDB9LCAvKiAyNyAqLworCXsweDAwMDcsMHgyNiwweDIwLDB4MDAsMHgwMCwweDZjLDIwNDgsMTUzNiwgMCwgMHgwMCwgMHgwMH0sIC8qIDI4ICovCisJezB4MDA2NywweDI3LDB4MTQsMHgwOCwweDBhLDB4NmUsMTI4MCwgOTYwLCAwLCAweDAwLCAweDAwfSwgLyogMjkgLSAxMjgweDk2MC02MCAqLworCXsweDAwMjcsMHg0NSwweDNjLDB4MDgsMHgwYSwweDZlLDEyODAsIDk2MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDJhIC0gMTI4MHg5NjAtODUgKi8KKwl7MHhjMDc3LDB4MzMsMHgwOSwweDA2LDB4MDAsMHgyMCwxMDI0LCA2MDAsIDAsIDB4MDAsIDB4MDB9LCAvKiAyYiAqLworCXsweGMwNzcsMHgzNCwweDBiLDB4MDYsMHgwMCwweDIzLDExNTIsIDc2OCwgMCwgMHgwMCwgMHgwMH0sIC8qIDJjICovCS8qIFZDTEsgMHgwOSAqLworCXsweDAwNzcsMHgzNSwweDI3LDB4MDgsMHgxOCwweDcwLCA4MDAsIDQ4MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDJkICovCisJezB4MDA0NywweDM2LDB4MzcsMHgwOCwweDE4LDB4NzAsIDgwMCwgNDgwLCAwLCAweDAwLCAweDAwfSwgLyogMmUgKi8KKwl7MHgwMDQ3LDB4MzcsMHgwOCwweDA4LDB4MTgsMHg3MCwgODAwLCA0ODAsIDAsIDB4MDAsIDB4MDB9LCAvKiAyZiAqLworCXsweDAwNzcsMHgzOCwweDA5LDB4MDksMHgxOSwweDcxLDEwMjQsIDU3NiwgMCwgMHgwMCwgMHgwMH0sIC8qIDMwICovCisJezB4MDA0NywweDM5LDB4MzgsMHgwOSwweDE5LDB4NzEsMTAyNCwgNTc2LCAwLCAweDAwLCAweDAwfSwgLyogMzEgKi8KKwl7MHgwMDQ3LDB4M2EsMHgxMSwweDA5LDB4MTksMHg3MSwxMDI0LCA1NzYsIDAsIDB4MDAsIDB4MDB9LCAvKiAzMiAqLworCXsweDAwNzcsMHgzYiwweDM5LDB4MGEsMHgwYywweDc1LDEyODAsIDcyMCwgMCwgMHgwMCwgMHgwMH0sIC8qIDMzICovCisJezB4MDA0NywweDNjLDB4M2EsMHgwYSwweDBjLDB4NzUsMTI4MCwgNzIwLCAwLCAweDAwLCAweDAwfSwgLyogMzQgKi8KKwl7MHgwMDA3LDB4M2QsMHgzYiwweDBhLDB4MGMsMHg3NSwxMjgwLCA3MjAsIDAsIDB4MDAsIDB4MDB9LCAvKiAzNSAqLworCXsweDAwNjcsMHg0OSwweDM1LDB4MDYsMHgxYSwweDI5LDExNTIsIDg2NCwgMCwgMHgwMCwgMHgwMH0sIC8qIDM2IDExNTJ4ODY0LTYwSHogICovCisJezB4MDA2NywweDNlLDB4MzQsMHgwNiwweDFhLDB4MjksMTE1MiwgODY0LCAwLCAweDAwLCAweDAwfSwgLyogMzcgMTE1Mng4NjQtNzVIeiAqLworCXsweDAwNDcsMHg0NCwweDNhLDB4MDYsMHgxYSwweDI5LDExNTIsIDg2NCwgMCwgMHgwMCwgMHgwMH0sIC8qIDM4IDExNTJ4ODY0LTg1SHogKi8KKwl7MHgwMGM3LDB4M2YsMHgyOCwweDAwLDB4MTYsMHgzOSwgODQ4LCA0ODAsIDAsIDB4MDAsIDB4MDB9LCAvKiAzOSA4NDh4NDgwLTM4SHppICovCisJezB4YzA2NywweDQwLDB4M2QsMHgwYiwweDE2LDB4MzksIDg0OCwgNDgwLCAwLCAweDAwLCAweDAwfSwgLyogM2EgODQ4eDQ4MC02MEh6ICAqLworCXsweDAwYzcsMHg0MSwweDI4LDB4MDAsMHgxNywweDNmLCA4NTYsIDQ4MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDNiIDg1Nng0ODAtMzhIemkgKi8KKwl7MHhjMDY3LDB4NDIsMHgyOCwweDBjLDB4MTcsMHgzZiwgODU2LCA0ODAsIDAsIDB4MDAsIDB4MDB9LCAvKiAzYyA4NTZ4NDgwLTYwSHogICovCisJezB4MDA2NywweDQzLDB4M2UsMHgwZCwweDFiLDB4NDgsMTM2MCwgNzY4LCAwLCAweDAwLCAweDAwfSwgLyogM2QgMTM2MHg3NjgtNjBIeiAqLworCXsweDAwNzcsMHg0NiwweDNmLDB4MDgsMHgwOCwweDU1LDEyODAsIDc2OCwgMCwgMHgwMCwgMHgwMH0sIC8qIDNlIDEyODB4NzY4LTYwSHogKi8KKwl7MHgwMDZmLDB4NDcsMHg0YywweDA2LDB4MTUsMHg1ZiwgNzY4LCA1NzYsIDAsIDB4MDAsIDB4MDB9LCAvKiAzZiA3Njh4NTc2ICovCisJezB4MDAyNywweDQ4LDB4MTMsMHgwOCwweDAwLDB4NjcsMTM2MCwxMDI0LCAwLCAweDAwLCAweDAwfSwgLyogNDAgMTM2MHgxMDI0LTU5SHogKEJBUkNPMTM2NiBvbmx5KSAqLworCXsweGZmZmYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMCwgMHgwMCwgMHgwMH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfVkJNb2RlU3RydWN0IFNpUzMwMF9WQk1vZGVJRFRhYmxlW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfVkJNb2RlIFNpUzMwMF9WQk1vZGVJRFRhYmxlW10gPQogewogCXsweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAogCXsweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9LApAQCAtMzAzLDUzICsyNzksMjYgQEAKIAl7MHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19DUlQxVGFibGVTdHJ1Y3QgIFNpUzMwMF9DUlQxVGFibGVbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DUlQxVGFibGUgU2lTMzAwX0NSVDFUYWJsZVtdID0KIHsKLSNpZiAxCiAge3sweDJkLDB4MjcsMHgyOCwweDkwLDB4MmMsMHg4MCwweGJmLDB4MWYsICAgIC8qIDB4MDAgLSAzMjB4MjAwICovCiAgIDB4OWMsMHg4ZSwweDhmLDB4OTYsMHhiOSwweDMwLDB4MDAsMHgwMCwgICAgIC8qIEhSRSBbNF0sWzE1XSBpcyBpbnZhbGlkIC0gYnV0IGNvcnJlY3RpbmcgaXQgZG9lcyBub3Qgd29yayAqLwogICAweDAwfX0sCi0jZW5kaWYKLSNpZiAwCi0ge3sweDJkLDB4MjcsMHgyNywweDkxLDB4MmMsMHg5MiwweGJmLDB4MWYsICAgIC8qIDB4MDAgLSBjb3JyZWN0ZWQgMzIweDIwMC03MiAtIGRvZXMgbm90IHdvcmsgKi8KLSAgMHg5YywweDhlLDB4OGYsMHg5NiwweGI5LDB4MzAsMHgwMCwweDA0LAotICAweDAwfX0sCi0jZW5kaWYKICB7ezB4MmQsMHgyNywweDI4LDB4OTAsMHgyYywweDgwLDB4MGIsMHgzZSwgICAgLyogMHgwMSAqLwogICAweGU5LDB4OGIsMHhkZiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDAsICAgICAvKiBIUkUgWzRdLFsxNV0gaXMgaW52YWxpZCAtIGJ1dCBjb3JyZWN0aW5nIGl0IGRvZXMgbm90IHdvcmsgKi8KICAgMHgwMH19LAotI2lmIDAKLSB7ezB4MmQsMHgyNywweDI3LDB4OTEsMHgyYywweDkyLDB4MGIsMHgzZSwgICAgLyogMHgwMSAtIGNvcnJlY3RlZCAzMjB4MjQwLTYwIC0gZG9lcyBub3Qgd29yayAqLwotICAweGU5LDB4OGIsMHhkZiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDQsCi0gIDB4MDB9fSwKLSNlbmRpZgogIHt7MHgzZCwweDMxLDB4MzEsMHg4MSwweDM3LDB4MWYsMHg3MiwweGYwLCAgICAvKiAweDAyICovCiAgIDB4NTgsMHg4YywweDU3LDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNSwKICAgMHgwMX19LAotI2lmIDAKLSB7ezB4M2QsMHgzMSwweDMxLDB4ODEsMHgzNywweDFmLDB4NzIsMHhmMCwgICAgLyogMHgwMiAtIGNvcnJlY3RlZCA0MDB4MzAwLTYwICovCi0gIDB4NTgsMHg4YywweDU3LDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNSwKLSAgMHgwMX19LAotI2VuZGlmCiAge3sweDRmLDB4M2YsMHgzZiwweDkzLDB4NDUsMHgwZCwweDI0LDB4ZjUsCiAgIDB4MDIsMHg4OCwweGZmLDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMSwKICAgMHgwMX19LAogIHt7MHg1ZiwweDRmLDB4NTAsMHg4MiwweDU1LDB4ODEsMHhiZiwweDFmLAogICAweDljLDB4OGUsMHg4ZiwweDk2LDB4YjksMHgzMCwweDAwLDB4MDUsCiAgIDB4MDB9fSwKLSNpZiAwICAKLSB7ezB4NWYsMHg0ZiwweDUwLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwgICAgLyogMHgwNSAqLwotICAweGU5LDB4OGIsMHhkZiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDUsCi0gIDB4MDB9fSwKLSNlbmRpZgogIHt7MHg1ZiwweDRmLDB4NGYsMHg4MywweDU1LDB4ODEsMHgwYiwweDNlLCAgICAvKiAweDA1IC0gY29ycmVjdGVkIDY0MHg0ODAtNjAgKi8KICAgMHhlOSwweDhiLDB4ZGYsMHhlOCwweDBjLDB4MDAsMHgwMCwweDA1LAogICAweDAwfX0sCi0jaWYgMAotIHt7MHg2MywweDRmLDB4NTAsMHg4NiwweDU2LDB4OWIsMHgwNiwweDNlLCAgICAvKiAweDA2ICovCi0gIDB4ZTgsMHg4YiwweGRmLDB4ZTcsMHhmZiwweDEwLDB4MDAsMHgwMSwKLSAgMHgwMH19LAotI2VuZGlmICAKICB7ezB4NjMsMHg0ZiwweDRmLDB4ODcsMHg1NiwweDliLDB4MDYsMHgzZSwgICAgLyogMHgwNiAtIGNvcnJlY3RlZCA2NDB4NDgwLTcyICovCiAgIDB4ZTgsMHg4YSwweGRmLDB4ZTcsMHgwNywweDAwLDB4MDAsMHgwMSwKICAgMHgwMH19LApAQCAtMzU5LDE5ICszMDgsOSBAQAogIHt7MHg2MywweDRmLDB4NGYsMHg4NywweDVhLDB4ODEsMHhmYiwweDFmLAogICAweGUwLDB4ODMsMHhkZiwweGRmLDB4ZmMsMHgxMCwweDAwLDB4MDUsCiAgIDB4MDB9fSwKLSNpZiAwICAKLSB7ezB4NjYsMHg0ZiwweDRmLDB4ODYsMHg1NiwweDllLDB4MDMsMHgzZSwgICAgLyogMHgwOSAqLwotICAweGU0LDB4ODcsMHhkZiwweGRmLDB4MDQsMHgwMCwweDAwLDB4MDEsCi0gIDB4MDB9fSwKLSNlbmRpZgogIHt7MHg2NywweDRmLDB4NGYsMHg4YiwweDU3LDB4ODMsMHgxMCwweDNlLCAgICAvKiAweDA5IC0gY29ycmVjdGVkIDY0MHg0ODAtMTAwICovCiAgIDB4ZTcsMHg4ZCwweGRmLDB4ZTYsMHgxMSwweDAwLDB4MDAsMHgwNSwKICAgMHgwMH19LAotI2lmIDAgIAotIHt7MHg2YywweDRmLDB4NGYsMHg4MywweDU5LDB4OWUsMHgwMCwweDNlLCAgICAvKiAweDBhICovCi0gIDB4ZTUsMHg4ZCwweGRmLDB4ZGYsMHgwMSwweDAwLDB4MDAsMHgwMSwKLSAgMHgwMH19LAotI2VuZGlmICAgIAogIHt7MHg2NywweDRmLDB4NGYsMHg4YiwweDU3LDB4ODMsMHgxMCwweDNlLCAgICAvKiAweDBhIC0gY29ycmVjdGVkIDY0MHg0ODAtMTIwICovCiAgIDB4ZTcsMHg4ZCwweGRmLDB4ZTYsMHgxMSwweDAwLDB4MDAsMHgwNSwKICAgMHgwMH19LApAQCAtNDU5LDExICszOTgsNiBAQAogIHt7MHg1NSwweGZmLDB4ZmYsMHg5OSwweDBkLDB4MGMsMHgzZSwweGJhLAogICAweDAwLDB4ODQsMHhmZiwweGZmLDB4M2YsMHgwZiwweDQxLDB4MDUsCiAgIDB4MDB9fSwKLSNpZiAwICAKLSB7ezB4ZGMsMHg5ZiwweDlmLDB4MDAsMHhhYiwweDE5LDB4ZTYsMHhlZiwgIC8qIDB4Mjc6IDEyODB4OTYwLTcwIC0gaW52YWxpZCEgKi8KLSAgMHhjMCwweGMzLDB4YmYsMHhiZiwweGU3LDB4MTAsMHgwMCwweDA3LAotICAweDAxfX0sCi0jZW5kaWYgIAogIHt7MHhkYywweDlmLDB4OWYsMHg4MCwweGFmLDB4OWQsMHhlNiwweGZmLCAgLyogMHgyNzogMTI4MHg5NjAtNjAgLSBjb3JyZWN0ICovCiAgIDB4YzAsMHg4MywweGJmLDB4YmYsMHhlNywweDEwLDB4MDAsMHgwNywKICAgMHgwMX19LApAQCAtNDk3LDkgKzQzMSw5IEBACiAge3sweDZiLDB4NTksMHg1OSwweDhmLDB4NWUsMHg4YywweDBiLDB4M2UsCiAgIDB4ZTksMHg4YiwweGRmLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwNSwKICAgMHgwMH19LAotIHt7MHg3YiwweDU5LDB4NjMsMHg5ZiwweDZhLDB4OTMsMHg2ZiwweGYwLCAgLyogMHgzMiAqLwotICAweDU4LDB4OGEsMHgzZiwweDU3LDB4NzAsMHgyMCwweDAwLDB4MDUsCi0gIDB4MDF9fSwKKyB7ezB4NmQsMHg1OSwweDU5LDB4OTEsMHg2MCwweDg5LDB4NTMsMHhmMCwgIC8qIDB4MzI6IDcyMHg1NzYsIGNvcnJlY3RlZCB0byA2MEh6ICovCisgIDB4NDEsMHg4NCwweDNmLDB4M2YsMHg1NCwweDAwLDB4MDAsMHgwNSwKKyAgMHg0MX19LAogIHt7MHhhMywweDdmLDB4N2YsMHg4NywweDg2LDB4OTcsMHgxZSwweGYxLCAgLyogMHgzMyAtIDEwMjR4NjAwICovCiAgIDB4YWUsMHg4NSwweDU3LDB4NTcsMHgxZiwweDMwLDB4MDAsMHgwMiwKICAgMHgwMX19LApAQCAtNTYwLDE4ICs0OTQsMjQgQEAKICB7ezB4Y2UsMHg5ZiwweDlmLDB4OTIsMHhhOSwweDE3LDB4MjAsMHhmNSwgIC8qIDEyODB4NzY4LTYwICovCiAgICAweDAzLDB4ODgsMHhmZiwweGZmLDB4MjEsMHgxMCwweDAwLDB4MDcsCiAgICAweDAxfX0sIC8qIDB4NDYgKi8KLSB7ezB4N2IsMHg1ZiwweDYzLDB4OWYsMHg2YSwweDkzLDB4NmYsMHhmMCwgIC8qIDc2OHg1NzYgKi8KLSAgIDB4NTgsMHg4YSwweDNmLDB4NTcsMHg3MCwweDIwLDB4MDAsMHgwNSwKLSAgIDB4MDF9fSwgLyogMHg0NyAqLworIHt7MHg3NSwweDVmLDB4NWYsMHg5OSwweDY2LDB4OTAsMHg1MywweGYwLCAgLyogNzY4eDU3NiwgY29ycmVjdGVkIHRvIDYwSHogKi8KKyAgIDB4NDEsMHg4NCwweDNmLDB4M2YsMHg1NCwweDAwLDB4MDAsMHgwNSwKKyAgIDB4NDF9fSwgLyogMHg0NyAqLwogIHt7MHhjZSwweGE5LDB4YTksMHg5MiwweGIxLDB4MDcsMHgyOCwweDUyLCAgLyogMTM2MHgxMDI0IChCYXJjbyBpUSBQcm8gUjMwMCkgKi8KICAgIDB4MDIsMHg4ZSwweGZmLDB4MDAsMHgyOSwweDBkLDB4MDAsMHgwMywKICAgIDB4MDB9fSwgLyogMHg0OCAqLwogIHt7MHhjZCwweDhmLDB4OGYsMHg5MSwweDliLDB4MWIsMHg3YSwweGZmLCAgLyogMTE1Mng4NjQtNjAgKi8KICAgIDB4NjQsMHg4YywweDVmLDB4NjIsMHg3YiwweDEwLDB4MDAsMHgwNywKLSAgIDB4NDF9fSAgLyogMHg0OSAqLworICAgMHg0MX19LCAvKiAweDQ5ICovCisge3sweDVjLDB4NGYsMHg0ZiwweDgwLDB4NTcsMHg4MCwweGEzLDB4MWYsIC8qIGZha2UgNjQweDQwMEA2MEh6IChmb3IgTENEIGFuZCBUViwgbm90IGFjdHVhbGx5IHVzZWQpICovCisgICAweDk4LDB4OGMsMHg4ZiwweDk2LDB4YTQsMHgzMCwweDAwLDB4MDUsCisgICAweDQwfX0sIC8qIDB4NGEgKi8KKyB7ezB4MmMsMHgyNywweDI3LDB4OTAsMHgyZCwweDkyLDB4YTQsMHgxZiwgLyogZmFrZSAzMjB4MjAwQDYwSHogKGZvciBMQ0QgYW5kIFRWLCBub3QgYWN0dWFsbHkgdXNlZCkgKi8KKyAgIDB4OTgsMHg4YywweDhmLDB4OTYsMHhhNSwweDMwLDB4MDAsMHgwNCwKKyAgIDB4MDB9fSAgLyogMHg0YiAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCAgU2lTMzAwX01DTEtEYXRhXzYzMFtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX01DTEtEYXRhIFNpUzMwMF9NQ0xLRGF0YV82MzBbXSA9CiB7CiAJeyAweDVhLDB4NjQsMHg4MCwgNjZ9LAogCXsgMHhiMywweDQ1LDB4ODAsIDgzfSwKQEAgLTU4Myw3ICs1MjMsNyBAQAogCXsgMHgzNywweDYxLDB4ODAsMTAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCAgU2lTMzAwX01DTEtEYXRhXzMwMFtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX01DTEtEYXRhIFNpUzMwMF9NQ0xLRGF0YV8zMDBbXSA9CiB7CiAJeyAweDY4LDB4NDMsMHg4MCwxMjV9LAogCXsgMHg2OCwweDQzLDB4ODAsMTI1fSwKQEAgLTU5NSw3ICs1MzUsNyBAQAogCXsgMHgzNywweDYxLDB4ODAsMTAwfQogfTsKIAotc3RhdGljIFNpU19WQ0xLRGF0YVN0cnVjdCBTaVMzMDBfVkNMS0RhdGFbXSA9CitzdGF0aWMgc3RydWN0IFNpU19WQ0xLRGF0YSBTaVMzMDBfVkNMS0RhdGFbXSA9CiB7CiAJeyAweDFiLDB4ZTEsIDI1fSwgLyogMHgwMCAqLwogCXsgMHg0ZSwweGU0LCAyOH0sIC8qIDB4MDEgKi8KQEAgLTY2OSw1MyArNjA5LDI2IEBACiAJeyAweGUyLDB4NDYsMTM1fSwgLyogMHg0NSAqLyAgLyogMTI4MHgxMDI0LTc1LCBiZXR0ZXIgY2xvY2sgZm9yIFZHQTIgKi8KIAl7IDB4NzAsMHgyOSwgODF9LCAvKiAweDQ2ICovICAvKiB1bnVzZWQgKi8KIAl7ICAgIDAsICAgMCwgIDB9LCAvKiAweDQ3IGN1c3RvbSAod2lsbCBiZSBmaWxsZWQgb3V0KSAqLwotCXsgMHhjZSwweDI1LDE4OX0gIC8qIDB4NDggKi8gIC8qIFJlcGxhY2VtZW50IGZvciBpbmRleCAweDFiIGZvciA3MzAgKGFuZCA1NDA/KSAqLworCXsgMHhjZSwweDI1LDE4OX0sIC8qIDB4NDggKi8gIC8qIFJlcGxhY2VtZW50IGZvciBpbmRleCAweDFiIGZvciA3MzAgKGFuZCA1NDA/KSAqLworCXsgMHgxNSwweGUxLCAyMH0sIC8qIDB4NDkgKi8gIC8qIDY0MHg0MDBANjAgKGZha2UsIG5vdCBhY3R1YWxseSB1c2VkKSAqLworCXsgMHg1ZiwweGM2LCAzM30sIC8qIDB4NGEgKi8gIC8qIDcyMHg1NzZANjAgKi8KKwl7IDB4MzcsMHg1YSwgMTB9LCAvKiAweDRiICovICAvKiAzMjB4MjAwQDYwIChmYWtlLCBub3QgYWN0dWFsbHkgdXNlZCkgKi8KKwl7IDB4MmIsMHhjMiwgMzV9ICAvKiAweDRjICovICAvKiA3NjhANTc2QDYwICovCiB9OwogCi0jaWZkZWYgTElOVVhfS0VSTkVMCi1zdGF0aWMgVUNIQVIgU2lTMzAwX1NSMDcgPSAweDEwOwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBEUkFNNFR5cGUgU2lTMzAwX1NSMTVbOF0gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzAwX1NSMTVbNCAqIDhdID0KIHsKLQl7MHgwMSwweDA5LDB4YTMsMHgwMH0sCi0JezB4NDMsMHg0MywweDQzLDB4MDB9LAotCXsweDFlLDB4MWUsMHgxZSwweDAwfSwKLQl7MHgyYSwweDJhLDB4MmEsMHgwMH0sCi0JezB4MDYsMHgwNiwweDA2LDB4MDB9LAotCXsweDAwLDB4MDAsMHgwMCwweDAwfSwKLQl7MHgwMCwweDAwLDB4MDAsMHgwMH0sCi0JezB4MDAsMHgwMCwweDAwLDB4MDB9CisJMHgwMSwweDA5LDB4YTMsMHgwMCwKKwkweDQzLDB4NDMsMHg0MywweDAwLAorCTB4MWUsMHgxZSwweDFlLDB4MDAsCisJMHgyYSwweDJhLDB4MmEsMHgwMCwKKwkweDA2LDB4MDYsMHgwNiwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwCiB9OwogCi0jaWZkZWYgTElOVVhfS0VSTkVMCi1zdGF0aWMgVUNIQVIgU2lTMzAwX1NSMUYgPSAweDAwOwotc3RhdGljIFVDSEFSIFNpUzMwMF9TUjIxID0gMHgxNjsKLXN0YXRpYyBVQ0hBUiBTaVMzMDBfU1IyMiA9IDB4YjI7Ci1zdGF0aWMgVUNIQVIgU2lTMzAwX1NSMjMgPSAweGY2Owotc3RhdGljIFVDSEFSIFNpUzMwMF9TUjI0ID0gMHgwZDsKLXN0YXRpYyBVQ0hBUiBTaVMzMDBfU1IyNVtdID0gezB4MCwweDB9Owotc3RhdGljIFVDSEFSIFNpUzMwMF9TUjMxID0gMHgwMDsKLXN0YXRpYyBVQ0hBUiBTaVMzMDBfU1IzMiA9IDB4MTE7Ci1zdGF0aWMgVUNIQVIgU2lTMzAwX1NSMzMgPSAweDAwOwotc3RhdGljIFVDSEFSIFNpUzMwMF9DUlQyRGF0YV8xXzIgPSAweDQwOwotc3RhdGljIFVDSEFSIFNpUzMwMF9DUlQyRGF0YV80X0QgPSAweDAwOwotc3RhdGljIFVDSEFSIFNpUzMwMF9DUlQyRGF0YV80X0UgPSAweDAwOwotc3RhdGljIFVDSEFSIFNpUzMwMF9DUlQyRGF0YV80XzEwID0gMHg4MDsKLQotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVMzMDBfUkdCU2Vuc2VEYXRhID0gMHhkMTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgU2lTMzAwX1ZpZGVvU2Vuc2VEYXRhID0gMHhiMzsKLXN0YXRpYyBjb25zdCBVU0hPUlQgU2lTMzAwX1lDU2Vuc2VEYXRhID0gMHhiOTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgU2lTMzAwX1JHQlNlbnNlRGF0YTIgPSAweDAxOTA7Ci1zdGF0aWMgY29uc3QgVVNIT1JUIFNpUzMwMF9WaWRlb1NlbnNlRGF0YTIgPSAweDAxNzQ7Ci1zdGF0aWMgY29uc3QgVVNIT1JUIFNpUzMwMF9ZQ1NlbnNlRGF0YTIgPSAweDAxNmI7Ci0KLXN0YXRpYyBjb25zdCBEUkFNNFR5cGUgU2lTMzAwX0NSNDBbNV07Ci0KLXN0YXRpYyBVQ0hBUiBTaVMzMDBfQ1I0OVsyXTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgU2lTX1BhbmVsRGVsYXlUYmxTdHJ1Y3QgIFNpUzMwMF9QYW5lbERlbGF5VGJsW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfUGFuZWxEZWxheVRibCBTaVMzMDBfUGFuZWxEZWxheVRibFtdID0KIHsKIAl7ezB4MDUsMHhhYX19LAogCXt7MHgwNSwweDE0fX0sCkBAIC03MzUsMzMgKzY0OCwxMSBAQAogCXt7MHgwNSwweDYwfX0KIH07CiAKLSNpZiAwCi1zdGF0aWMgY29uc3QgU2lTX1BhbmVsRGVsYXlUYmxTdHJ1Y3QgIFNpUzMwMF9QYW5lbERlbGF5VGJsTFZEU1tdID0KLXsKLQl7ezB4MDUsMHhhYX19LAotCXt7MHgwNSwweDE0fX0sCi0Je3sweDA1LDB4MzZ9fSwKLQl7ezB4MDUsMHgxNH19LAotCXt7MHgwNSwweDE0fX0sCi0Je3sweDA1LDB4MTR9fSwKLQl7ezB4MDUsMHg5MH19LAotCXt7MHgwNSwweDkwfX0sCi0Je3sweDA1LDB4MTR9fSwKLQl7ezB4MDUsMHgxNH19LAotCXt7MHgwNSwweDE0fX0sCi0Je3sweDA1LDB4MTR9fSwgIC8qIDIuMDdhIChKVkMpOiAxNCw5NiAqLwotCXt7MHgwNSwweDI4fX0sICAvKiAyLjA0LjVjOiAyMCwgODAgLSBDbGV2byAoMi4wNC4yYyk6IDA1LCAyOCAqLwotCXt7MHgwNSwweDE0fX0sCi0Je3sweDA1LDB4MTR9fSwgIC8qIFNvbWUgQklPU2VzOiAwNSwgNDAgKi8KLQl7ezB4MDUsMHg2MH19Ci19OwotI2VuZGlmCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFNJUyBWSURFTyBCUklER0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVMzMDBfU3QyTENEMTAyNHg3NjhEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVMzMDBfU3QyTENEMTAyNHg3NjhEYXRhW10gPQogewogCXsgICA2MiwgIDI1LCA4MDAsIDU0NiwxMzQ0LCA4MDZ9LAogCXsgICAzMiwgIDE1LCA5MzAsIDU0NiwxMzQ0LCA4MDZ9LApAQCAtNzcyLDcgKzY2Myw3IEBACiAJeyAgICAxLCAgIDEsMTM0NCwgODA2LDEzNDQsIDgwNn0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTMzAwX0V4dExDRDEwMjR4NzY4RGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTMzAwX0V4dExDRDEwMjR4NzY4RGF0YVtdID0KIHsKIAl7ICAgMTIsICAgNSwgODk2LCA1MTIsMTM0NCwgODA2fSwKIAl7ICAgMTIsICAgNSwgODk2LCA1MTAsMTM0NCwgODA2fSwKQEAgLTc4OSw3ICs2ODAsNyBAQAogCXsgICAgMSwgICAxLDEzNDQsIDgwNiwxMzQ0LCA4MDZ9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpUzMwMF9TdDJMQ0QxMjgweDEwMjREYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVMzMDBfU3QyTENEMTI4MHgxMDI0RGF0YVtdID0KIHsKIAl7ICAgMjIsICAgNSwgODAwLCA1MTAsMTY1MCwxMDg4fSwKIAl7ICAgMjIsICAgNSwgODAwLCA1MTAsMTY1MCwxMDg4fSwKQEAgLTgwMSw3ICs2OTIsNyBAQAogCXsgICAgMSwgICAxLDE2ODgsMTA2NiwxNjg4LDEwNjZ9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpUzMwMF9FeHRMQ0QxMjgweDEwMjREYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVMzMDBfRXh0TENEMTI4MHgxMDI0RGF0YVtdID0KIHsKIAl7ICAyMTEsICA2MCwxMDI0LCA1MDEsMTY4OCwxMDY2fSwKIAl7ICAyMTEsICA2MCwxMDI0LCA1MDgsMTY4OCwxMDY2fSwKQEAgLTgxMyw1MyArNzA0LDExNiBAQAogCXsgICAgMSwgICAxLDE2ODgsMTA2NiwxNjg4LDEwNjZ9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCBTaVMzMDBfQ1JUMlBhcnQyXzEwMjR4NzY4XzFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19QYXJ0MlBvcnRUYmwgU2lTMzAwX0NSVDJQYXJ0Ml8xMDI0eDc2OF8xW10gPQogeyAvKiBWRVNBIFRpbWluZyAqLwotICB7ezB4MjEsMHgxMiwweGJmLDB4ZTQsMHhjMCwweDIxLDB4NDUsMHgwOSwweDAwLDB4YTksMHgwOSwweDA0fX0sCi0gIHt7MHgyYywweDEyLDB4OWEsMHhhZSwweDg4LDB4MjEsMHg0NSwweDA5LDB4MDAsMHhhOSwweDA5LDB4MDR9fSwKLSAge3sweDIxLDB4MTIsMHhiZiwweGU0LDB4YzAsMHgyMSwweDQ1LDB4MDksMHgwMCwweGE5LDB4MDksMHgwNH19LAotICB7ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfX0sCi0gIHt7MHgyMiwweDEzLDB4ZmUsMHgyNSwweGZmLDB4MjEsMHg0NSwweDBhLDB4MDAsMHhhOSwweDBkLDB4MDR9fSwKLSAge3sweDIyLDB4MTMsMHhmZSwweDI1LDB4ZmYsMHgyMSwweDQ1LDB4MGEsMHgwMCwweGE5LDB4MGQsMHgwNH19LAotICB7ezB4MjIsMHgxMywweGZlLDB4MjUsMHhmZiwweDIxLDB4NDUsMHgwYSwweDAwLDB4YTksMHgwZCwweDA0fX0KKwl7ezB4MjEsMHgxMiwweGJmLDB4ZTQsMHhjMCwweDIxLDB4NDUsMHgwOSwweDAwLDB4YTksMHgwOSwweDA0fX0sCisJe3sweDJjLDB4MTIsMHg5YSwweGFlLDB4ODgsMHgyMSwweDQ1LDB4MDksMHgwMCwweGE5LDB4MDksMHgwNH19LAorCXt7MHgyMSwweDEyLDB4YmYsMHhlNCwweGMwLDB4MjEsMHg0NSwweDA5LDB4MDAsMHhhOSwweDA5LDB4MDR9fSwKKwl7ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfX0sCisJe3sweDIyLDB4MTMsMHhmZSwweDI1LDB4ZmYsMHgyMSwweDQ1LDB4MGEsMHgwMCwweGE5LDB4MGQsMHgwNH19LAorCXt7MHgyMiwweDEzLDB4ZmUsMHgyNSwweGZmLDB4MjEsMHg0NSwweDBhLDB4MDAsMHhhOSwweDBkLDB4MDR9fSwKKwl7ezB4MjIsMHgxMywweGZlLDB4MjUsMHhmZiwweDIxLDB4NDUsMHgwYSwweDAwLDB4YTksMHgwZCwweDA0fX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfUGFydDJQb3J0VGJsU3RydWN0IFNpUzMwMF9DUlQyUGFydDJfMTAyNHg3NjhfMltdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1BhcnQyUG9ydFRibCBTaVMzMDBfQ1JUMlBhcnQyXzEwMjR4NzY4XzJbXSA9CiB7ICAvKiBOb24tVkVTQSAqLwotIHt7MHgyOCwweDEyLDB4YTMsMHhkMCwweGFhLDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fSwKLSB7ezB4MmMsMHgxMiwweDlhLDB4YWUsMHg4OCwweDVhLDB4NDUsMHgwYSwweDA3LDB4ZmEsMHgwYSwweDI0fX0sCi0ge3sweDI4LDB4MTIsMHhhMywweGQwLDB4YWEsMHg1YSwweDQ1LDB4MGEsMHgwNywweGZhLDB4MGEsMHgyNH19LAotIHt7MHgyYywweDEyLDB4OWEsMHhhZSwweDg4LDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fSwKLSB7ezB4MjgsMHgxMywweGU3LDB4MGIsMHhlOCwweDVhLDB4NDUsMHgwYSwweDA3LDB4ZmEsMHgwYSwweDI0fX0sCi0ge3sweDM4LDB4MTgsMHgxNiwweDAwLDB4MDAsMHg1YSwweDQ1LDB4MGEsMHgwNywweGZhLDB4MGEsMHgyNH19LAotIHt7MHgzNiwweDEzLDB4MTMsMHgyNSwweGZmLDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fQorCXt7MHgyOCwweDEyLDB4YTMsMHhkMCwweGFhLDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fSwKKwl7ezB4MmMsMHgxMiwweDlhLDB4YWUsMHg4OCwweDVhLDB4NDUsMHgwYSwweDA3LDB4ZmEsMHgwYSwweDI0fX0sCisJe3sweDI4LDB4MTIsMHhhMywweGQwLDB4YWEsMHg1YSwweDQ1LDB4MGEsMHgwNywweGZhLDB4MGEsMHgyNH19LAorCXt7MHgyYywweDEyLDB4OWEsMHhhZSwweDg4LDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fSwKKwl7ezB4MjgsMHgxMywweGU3LDB4MGIsMHhlOCwweDVhLDB4NDUsMHgwYSwweDA3LDB4ZmEsMHgwYSwweDI0fX0sCisJe3sweDM4LDB4MTgsMHgxNiwweDAwLDB4MDAsMHg1YSwweDQ1LDB4MGEsMHgwNywweGZhLDB4MGEsMHgyNH19LAorCXt7MHgzNiwweDEzLDB4MTMsMHgyNSwweGZmLDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19QYXJ0MlBvcnRUYmxTdHJ1Y3QgU2lTMzAwX0NSVDJQYXJ0Ml8xMDI0eDc2OF8zW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfUGFydDJQb3J0VGJsIFNpUzMwMF9DUlQyUGFydDJfMTAyNHg3NjhfM1tdID0KIHsKLSB7ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfUGFydDJQb3J0VGJsU3RydWN0IFNpUzMwMF9DUlQyUGFydDJfMTI4MHgxMDI0XzFbXSA9Ci17Ci0gIHt7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19QYXJ0MlBvcnRUYmxTdHJ1Y3QgU2lTMzAwX0NSVDJQYXJ0Ml8xMjgweDEwMjRfMltdID0KLXsKLSB7ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfUGFydDJQb3J0VGJsU3RydWN0IFNpUzMwMF9DUlQyUGFydDJfMTI4MHgxMDI0XzNbXSA9Ci17Ci0gIHt7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fQorCXt7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTFZEUy9DaHJvbnRlbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVMzMDBfQ0hUVlVQQUxEYXRhW10gPQorLyogQ3VzdG9tIGRhdGEgZm9yIEJhcmNvIGlRIFIgc2VyaWVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSBTaVMzMDBfTFZEU0JBUkNPMTM2NkRhdGFfMVtdPQoreworCXsgODMyLCA0MzgsMTMzMSwgODA2fSwKKwl7IDgzMiwgMzg4LDEzMzEsIDgwNn0sCisJeyA4MzIsIDQzOCwxMzMxLCA4MDZ9LAorCXsgODMyLCAzODgsMTMzMSwgODA2fSwKKwl7IDgzMiwgNTE4LDEzMzEsIDgwNn0sCisJezEwNTAsIDYzOCwxMzQ0LCA4MDZ9LAorCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKKwl7MTY4OCwxMDY2LDE2ODgsMTA2Nn0sCisJezE2ODgsMTA2NiwxNjg4LDEwNjZ9ICAgLyogMTM2MHgxMDI0ICovCit9OworCisvKiBDdXN0b20gZGF0YSBmb3IgQmFyY28gaVEgUiBzZXJpZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpUzMwMF9MVkRTQkFSQ08xMzY2RGF0YV8yW109Cit7CisJezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAorCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKKwl7MTM0NCwgODA2LDEzNDQsIDgwNn0sCisJezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAorCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKKwl7MTM0NCwgODA2LDEzNDQsIDgwNn0sCisJezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAorCXsxNjg4LDEwNjYsMTY4OCwxMDY2fSwKKwl7MTY4OCwxMDY2LDE2ODgsMTA2Nn0gICAvKiAxMzYweDEwMjQgKi8KK307CisKKy8qIEN1c3RvbSBkYXRhIGZvciBCYXJjbyBpUSBHIHNlcmllcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzAwX0xWRFNCQVJDTzEwMjREYXRhXzFbXT0KK3sKKwl7IDgzMiwgNDM4LDEzMzEsIDgwNn0sCisJeyA4MzIsIDQwOSwxMzMxLCA4MDZ9LAorCXsgODMyLCA0MzgsMTMzMSwgODA2fSwKKwl7IDgzMiwgNDA5LDEzMzEsIDgwNn0sCisJeyA4MzIsIDUxOCwxMzMxLCA4MDZ9LCAgIC8qIDY0MHg0ODAgKi8KKwl7MTA1MCwgNjM4LDEzNDQsIDgwNn0sICAgLyogODAweDYwMCAqLworCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwgICAvKiAxMDI0eDc2OCAqLworfTsKKworLyogQ3VzdG9tIGRhdGEgZm9yIDg0OHg0ODAgYW5kIDg1Nng0ODAgcGFyYWxsZWwgTFZEUyBwYW5lbHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpUzMwMF9MVkRTODQ4eDQ4MERhdGFfMVtdPQoreworCXsgICAwLCAgIDAsICAgMCwgICAwfSwKKwl7ICAgMCwgICAwLCAgIDAsICAgMH0sCisJeyAgIDAsICAgMCwgICAwLCAgIDB9LAorCXsgICAwLCAgIDAsICAgMCwgICAwfSwKKwl7MTA4OCwgNTI1LDEwODgsIDUyNX0sICAvKiA2NDB4NDgwIFRPRE8gKi8KKwl7MTA4OCwgNTI1LDEwODgsIDUyNX0sICAvKiA4MDB4NjAwIFRPRE8gKi8KKwl7MTA4OCwgNTI1LDEwODgsIDUyNX0sICAvKiAxMDI0eDc2OCBUT0RPICovCisJeyAgIDAsICAgMCwgICAwLCAgIDB9LAorCXsgICAwLCAgIDAsICAgMCwgICAwfSwKKwl7ICAgMCwgICAwLCAgIDAsICAgMH0sCisJeyAgIDAsICAgMCwgICAwLCAgIDB9LAorCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDg0OHg0ODAgKi8KKwl7MTA4OCwgNTI1LDEwODgsIDUyNX0sICAvKiA4NTZ4NDgwICovCisJezEwODgsIDUyNSwxMDg4LCA1MjV9ICAgLyogMTM2MHg3NjggVE9ETyAqLworfTsKKworLyogQ3VzdG9tIGRhdGEgZm9yIDg0OHg0ODAgcGFyYWxsZWwgcGFuZWwgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpUzMwMF9MVkRTODQ4eDQ4MERhdGFfMltdPQoreworCXsgICAwLCAgIDAsICAgMCwgICAwfSwKKwl7ICAgMCwgICAwLCAgIDAsICAgMH0sCisJeyAgIDAsICAgMCwgICAwLCAgIDB9LAorCXsgICAwLCAgIDAsICAgMCwgICAwfSwKKwl7MTA4OCwgNTI1LDEwODgsIDUyNX0sICAvKiAgNjQweDQ4MCAqLworCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qICA4MDB4NjAwICovCisJezEwODgsIDUyNSwxMDg4LCA1MjV9LCAgLyogMTAyNHg3NjggKi8KKwl7ICAgMCwgICAwLCAgIDAsICAgMH0sCisJeyAgIDAsICAgMCwgICAwLCAgIDB9LAorCXsgICAwLCAgIDAsICAgMCwgICAwfSwKKwl7ICAgMCwgICAwLCAgIDAsICAgMH0sCisJezEwODgsIDUyNSwxMDg4LCA1MjV9LCAgLyogODQ4eDQ4MCAqLworCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDg1Nng0ODAgKi8KKwl7MTA4OCwgNTI1LDEwODgsIDUyNX0JLyogMTM2MHg3NjggVE9ETyAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzAwX0NIVFZVUEFMRGF0YVtdID0KIHsKIAl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCiAJezEwMDgsIDYyNSwxMDA4LCA2MjV9LApAQCAtODY5LDcgKzgyMyw3IEBACiAJeyA5MzYsIDgzNiwgOTM2LCA4MzZ9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVMzMDBfQ0hUVk9QQUxEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzAwX0NIVFZPUEFMRGF0YVtdID0KIHsKIAl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCiAJezEwMDgsIDYyNSwxMDA4LCA2MjV9LApAQCAtODc5LDcgKzgzMyw3IEBACiAJeyA5NjAsIDc1MCwgOTYwLCA3NTB9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVMzMDBfQ0hUVlNPUEFMRGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpUzMwMF9DSFRWU09QQUxEYXRhW10gPQogewogCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKIAl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCkBAIC04ODksNDg2ICs4NDMsOCBAQAogCXsgOTQ0LCA2MjUsIDk0NCwgNjI1fQogfTsKIAotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMwMF9QYW5lbFR5cGUwMF8xW10gPQotewotCXsgMTA1OSwgNjI2IH0sICAgLyogMi4wOCAqLwotCXsgMTA1OSwgNjI0IH0sCi0JeyAxMDU5LCA2MjYgfSwKLQl7IDEwNTksIDYyNCB9LAotCXsgMTA1OSwgNjI0IH0sCi0JeyAgICAwLCA2MjcgfSwKLQl7ICAgIDAsIDYyNyB9LAotCXsgICAgMCwgICAwIH0sCi0JeyAgICAwLCAgIDAgfQotI2lmIDAKLQl7MCwgNjI2fSwKLQl7MCwgNjI0fSwKLQl7MCwgNjI2fSwKLQl7MCwgNjI0fSwKLQl7MCwgNjI0fSwKLQl7MCwgNjI3fSwKLQl7MCwgNjI3fSwKLQl7MCwgICAwfSwKLQl7MCwgICAwfQotI2VuZGlmCi19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMwMF9QYW5lbFR5cGUwMV8xW10gPQotewotCXsgICAwLCAgIDAgfSwgIC8qIDIuMDggKi8KLQl7ICAgMCwgICAwIH0sCi0JeyAgIDAsICAgMCB9LAotCXsgICAwLCAgIDAgfSwKLQl7ICAgMCwgICAwIH0sCi0JeyAgIDAsICAgMCB9LAotCXsgICAwLCAgIDAgfSwKLQl7ICAgMCwgICAwIH0sCi0JeyAgIDAsICAgMCB9Ci0jaWYgMAotCXsxMzQzLCA3OTh9LAotCXsxMzQzLCA3OTR9LAotCXsxMzQzLCA3OTh9LAotCXsxMzQzLCA3OTR9LAotCXsxMzQzLCAgIDB9LAotCXsxMzQzLCAgIDB9LAotCXsgICAwLCA4MDV9LAotCXsgICAwLCA3OTR9LAotCXsgICAwLCAgIDB9Ci0jZW5kaWYKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTAyXzFbXSA9Ci17Ci0JeyAxMDU5LCA2MjYgfSwgIC8qIDIuMDggKi8KLQl7IDEwNTksIDYyNCB9LAotCXsgMTA1OSwgNjI2IH0sCi0JeyAxMDU5LCA2MjQgfSwKLQl7IDEwNTksIDYyNCB9LAotCXsgICAgMCwgNjI3IH0sCi0JeyAgICAwLCA2MjcgfSwKLQl7ICAgIDAsICAgMCB9LAotCXsgICAgMCwgICAwIH0KLSNpZiAwCi0JezAsIDYyNn0sCi0JezAsIDYyNH0sCi0JezAsIDYyNn0sCi0JezAsIDYyNH0sCi0JezAsIDYyNH0sCi0JezAsIDYyN30sCi0JezAsIDYyN30sCi0JezAsICAgMH0sCi0JezAsICAgMH0KLSNlbmRpZgotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDNfMVtdID0KLXsKLQl7ICAgOCwgNDM2fSwKLQl7ICAgOCwgNDQwfSwKLQl7ICAgOCwgNDM2fSwKLQl7ICAgOCwgNDQwfSwKLQl7ICAgOCwgNTEyfSwKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDRfMVtdID0JLyogMTI4MHgxMDI0ICovCi17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTA1XzFbXSA9Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTA2XzFbXSA9CS8qIENsZXZvIFRydW1waW9uIDEwMjR4NzY4ICovCi17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTA3XzFbXSA9Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTA4XzFbXSA9Ci17Ci0JezEwNTksIDYyNn0sCi0JezEwNTksIDYyNH0sCi0JezEwNTksIDYyNn0sCi0JezEwNTksIDYyNH0sCi0JezEwNTksIDYyNH0sCi0JeyAgIDAsIDYyN30sCi0JeyAgIDAsIDYyN30sCi0JeyAgIDAsICAgMH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTA5XzFbXSA9Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTBhXzFbXSA9Ci17Ci0JezEwNTksIDYyNn0sCi0JezEwNTksIDYyNH0sCi0JezEwNTksIDYyNn0sCi0JezEwNTksIDYyNH0sCi0JezEwNTksIDYyNH0sCi0JeyAgIDAsIDYyN30sCi0JeyAgIDAsIDYyN30sCi0JeyAgIDAsICAgMH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTBiXzFbXSA9Ci17Ci0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDc5OX0sCi0JeyAgIDAsICAgMH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTBjXzFbXSA9Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTBkXzFbXSA9Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTBlXzFbXSA9Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sICAgIC8qIDY0MHg0ODAgKi8KLQl7MTM0MywgICAwfSwgICAgLyogODAweDYwMCAqLwotCXsgICAwLCA4MDV9LCAgICAvKiAxMDI0eDc2OCAqLwotCXsgICAwLCA3OTR9LCAgICAvKiAxMjgweDEwMjQgKi8KLQl7ICAgMCwgICAwfSAgICAgLyogMTI4MHg5NjAgLSBub3QgYXBwbGljYWJsZSAqLwotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGZfMVtdID0KLXsKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgICAwfSwKLQl7MTM0MywgICAwfSwKLQl7ICAgMCwgODA1fSwKLQl7ICAgMCwgNzk0fSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDBfMltdID0KLXsKLQl7OTc2LCA1Mjd9LAotCXs5NzYsIDUwMn0sCi0Jezk3NiwgNTI3fSwKLQl7OTc2LCA1MDJ9LAotCXs5NzYsIDU2N30sCi0JeyAgMCwgNjI3fSwKLQl7ICAwLCA2Mjd9LAotCXsgIDAsICAgMH0sCi0JeyAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDFfMltdID0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7ICAgMCwgODA1fSwKLQl7ICAgMCwgNzk0fSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDJfMltdID0KLXsKLQl7OTc2LCA1Mjd9LAotCXs5NzYsIDUwMn0sCi0Jezk3NiwgNTI3fSwKLQl7OTc2LCA1MDJ9LAotCXs5NzYsIDU2N30sCi0JeyAgMCwgNjI3fSwKLQl7ICAwLCA2Mjd9LAotCXsgIDAsICAgMH0sCi0JeyAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDNfMltdID0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7ICAgMCwgODA1fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDRfMltdID0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7ICAgMCwgODA1fSwKLQl7ICAgMCwgNzk0fSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDVfMltdID0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7ICAgMCwgODA1fSwKLQl7ICAgMCwgNzk0fSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDZfMltdID0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7ICAgMCwgODA1fSwKLQl7ICAgMCwgNzk0fSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDdfMltdID0KLXsKLSAJezExNTIsIDYyMn0sCi0gCXsxMTUyLCA1OTd9LAotIAl7MTE1MiwgNjIyfSwKLSAJezExNTIsIDU5N30sCi0gCXsxMTUyLCA2NjJ9LAotIAl7MTIzMiwgNzIyfSwKLQl7ICAgMCwgODA1fSwKLQl7ICAgMCwgNzk0fSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDhfMltdID0KLXsKLSAJezk3NiwgNTI3fSwKLSAJezk3NiwgNTAyfSwKLSAJezk3NiwgNTI3fSwKLSAJezk3NiwgNTAyfSwKLSAJezk3NiwgNTY3fSwKLSAJeyAgMCwgNjI3fSwKLSAJeyAgMCwgNjI3fSwKLSAJeyAgMCwgICAwfSwKLSAJeyAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDlfMltdID0KLXsKLSAJezExNTIsIDYyMn0sCi0gCXsxMTUyLCA1OTd9LAotIAl7MTE1MiwgNjIyfSwKLSAJezExNTIsIDU5N30sCi0gCXsxMTUyLCA2NjJ9LAotIAl7MTIzMiwgNzIyfSwKLSAJeyAgIDAsIDgwNX0sCi0gCXsgICAwLCA3OTR9LAotIAl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGFfMltdID0KLXsKLSAJezk3NiwgNTI3fSwKLSAJezk3NiwgNTAyfSwKLSAJezk3NiwgNTI3fSwKLSAJezk3NiwgNTAyfSwKLSAJezk3NiwgNTY3fSwKLSAJeyAgMCwgNjI3fSwKLSAJeyAgMCwgNjI3fSwKLSAJeyAgMCwgICAwfSwKLSAJeyAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGJfMltdID0KLXsKLSAJeyAxMTUyLCA3MDB9LAotIAl7IDExNTIsIDY3NX0sCi0gCXsgMTE1MiwgNzAwfSwKLSAJeyAxMTUyLCA2NzV9LAotIAl7IDExNTIsIDc0MH0sCi0gCXsgMTIzMiwgNzk5fSwKLSAJeyAgICAwLCA3OTl9LAotIAl7ICAgIDAsICAgMH0sCi0gCXsgICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGNfMltdID0KLXsKLSAJezExNTIsIDYyMn0sCi0gCXsxMTUyLCA1OTd9LAotIAl7MTE1MiwgNjIyfSwKLSAJezExNTIsIDU5N30sCi0gCXsxMTUyLCA2NjJ9LAotIAl7MTIzMiwgNzIyfSwKLSAJeyAgIDAsIDgwNX0sCi0gCXsgICAwLCA3OTR9LAotIAl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGRfMltdID0KLXsKLSAJezExNTIsIDYyMn0sCi0gCXsxMTUyLCA1OTd9LAotIAl7MTE1MiwgNjIyfSwKLSAJezExNTIsIDU5N30sCi0gCXsxMTUyLCA2NjJ9LAotIAl7MTIzMiwgNzIyfSwKLSAJeyAgIDAsIDgwNX0sCi0gCXsgICAwLCA3OTR9LAotIAl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGVfMltdID0KLXsKLSAJezExNTIsIDYyMn0sCi0gCXsxMTUyLCA1OTd9LAotIAl7MTE1MiwgNjIyfSwKLSAJezExNTIsIDU5N30sCi0gCXsxMTUyLCA2NjJ9LAotIAl7MTIzMiwgNzIyfSwKLSAJeyAgIDAsIDgwNX0sCi0gCXsgICAwLCA3OTR9LAotIAl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGZfMltdID0KLXsKLSAJezExNTIsIDYyMn0sCi0gCXsxMTUyLCA1OTd9LAotIAl7MTE1MiwgNjIyfSwKLSAJezExNTIsIDU5N30sCi0gCXsxMTUyLCA2NjJ9LAotIAl7MTIzMiwgNzIyfSwKLSAJeyAgIDAsIDgwNX0sCi0gCXsgICAwLCA3OTR9LAotIAl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlTlNfMVtdPQotewotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgODA1fSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlTlNfMltdID0KLXsKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfQotfTsKLQotLyogQ3VzdG9tIGRhdGEgZm9yIEJhcmNvIGlRIFIyMDAvMzAwLzQwMCAoQklPUyAyLjAwLjA3KSAqLwotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDRfMWFbXSA9CS8qIDEyODB4MTAyNCAoMTM2NngxMDI0KSAqLworLyogQ3VzdG9tIGRlcyBkYXRhIGZvciBCYXJjbyBpUSBSMjAwLzMwMC80MDAgKEJJT1MgMi4wMC4wNykgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEZXMgU2lTMzAwX1BhbmVsVHlwZTA0XzFhW10gPQkvKiAxMjgweDEwMjQgKDEzNjZ4MTAyNCkgKi8KIHsKIAl7MTMzMCwgNzk4fSwgIC8qIDMyMHgyMDAgKi8KIAl7MTMzMCwgNzk0fSwKQEAgLTEzODEsNyArODU3LDcgQEAKIAl7ICAgMCwgICAwfSAgIC8qIDEzNjB4MTAyNCAgICAgICAgICAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDRfMmFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGVzIFNpUzMwMF9QYW5lbFR5cGUwNF8yYVtdID0KIHsKIAl7MTE1MiwgNjIyfSwKIAl7MTE1MiwgNTk3fSwKQEAgLTEzOTQsOCArODcwLDggQEAKIAl7ICAgMCwgICAwfQogfTsKIAotLyogQ3VzdG9tIGRhdGEgZm9yIEJhcmNvIGlRIEcyMDAvMzAwLzQwMCAoQklPUyAyLjAwLjA3KSAqLwotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDRfMWJbXSA9CS8qIDEwMjR4NzY4ICovCisvKiBDdXN0b20gZGVzIGRhdGEgZm9yIEJhcmNvIGlRIEcyMDAvMzAwLzQwMCAoQklPUyAyLjAwLjA3KSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcyBTaVMzMDBfUGFuZWxUeXBlMDRfMWJbXSA9CS8qIDEwMjR4NzY4ICovCiB7CiAJezEzMzAsIDc5OH0sICAvKiAzMjB4MjAwICovCiAJezEzMzAsIDc5NH0sCkBAIC0xNDA2LDcgKzg4Miw3IEBACiAJeyAgIDAsIDgwNX0gICAvKiAxMDI0eDc2OCAvIDUxMngzODQgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTA0XzJiW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcyBTaVMzMDBfUGFuZWxUeXBlMDRfMmJbXSA9CiB7CiAJezExNTIsIDYyMn0sCiAJezExNTIsIDU5N30sCkBAIC0xNDE5LDM3NiArODk1LDcgQEAKIAogLyogQ1JUMSBDUlRDIGZvciBzbGF2ZSBtb2RlcyAqLwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzAwX0xWRFNDUlQxODAweDYwMF8xW10gPQotewotCXt7MHg2NSwweDRmLDB4ODksMHg1NiwweDgzLDB4YWYsMHgxZiwKLQkgIDB4OTAsMHg4NSwweDhmLDB4YWIsMHgzMCwweDAwLDB4MDUsCi0JICAweDAwIH19LAotCXt7MHg2NSwweDRmLDB4ODksMHg1NiwweDgzLDB4ODMsMHgxZiwKLQkgIDB4NWUsMHg4MywweDVkLDB4NzksMHgxMCwweDAwLDB4MDUsCi0JICAweDAwIH19LAotCXt7MHg2NSwweDRmLDB4ODksMHg1NiwweDgzLDB4YWYsMHgxZiwKLQkgIDB4OTAsMHg4NSwweDhmLDB4YWIsMHgzMCwweDAwLDB4MDUsCi0JICAweDAwIH19LAotCXt7MHg2NSwweDRmLDB4ODksMHg1NiwweDgzLDB4ODMsMHgxZiwKLQkgIDB4NWUsMHg4MywweDVkLDB4NzksMHgxMCwweDAwLDB4MDUsCi0JICAweDAwIH19LAotCXt7MHg2NSwweDRmLDB4ODksMHg1NiwweDgzLDB4MDQsMHgzZSwKLQkgIDB4ZTAsMHg4NSwweGRmLDB4ZmIsMHgxMCwweDAwLDB4MDUsCi0JICAweDAwIH19LAotCXt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKLQkgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCi0JICAweDAxIH19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzAwX0xWRFNDUlQxODAweDYwMF8xX0hbXSA9Ci17Ci0Je3sweDMwLDB4MjcsMHg5NCwweDJjLDB4OTIsMHhhZiwweDFmLAotCSAgMHg5MCwweDg1LDB4OGYsMHhhYiwweDMwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDMwLDB4MjcsMHg5NCwweDJjLDB4OTIsMHg4MywweDFmLAotCSAgMHg1ZSwweDgzLDB4NWQsMHg3OSwweDEwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDMwLDB4MjcsMHg5NCwweDJjLDB4OTIsMHhhZiwweDFmLAotCSAgMHg5MCwweDg1LDB4OGYsMHhhYiwweDMwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDMwLDB4MjcsMHg5NCwweDJjLDB4OTIsMHg4MywweDFmLAotCSAgMHg1ZSwweDgzLDB4NWQsMHg3OSwweDEwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDMwLDB4MjcsMHg5NCwweDJjLDB4OTIsMHgwNCwweDNlLAotCSAgMHhlMCwweDg1LDB4ZGYsMHhmYiwweDEwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDNkLDB4MzEsMHg4MSwweDM3LDB4MWYsMHg3MiwweGYwLAotCSAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNSwKLQkgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDExMDI0eDc2OF8xW10gPQotewotCXt7MHg2NCwweDRmLDB4ODgsMHg1NCwweDlmLDB4YzQsMHgxZiwKLQkgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDEsCi0JICAweDAwfX0sCi0Je3sweDY0LDB4NGYsMHg4OCwweDU0LDB4OWYsMHg5NywweDFmLAotCSAgMHg2MCwweDg3LDB4NWQsMHg4MywweDEwLDB4MDAsMHgwMSwKLQkgIDB4MDB9fSwKLQl7ezB4NjQsMHg0ZiwweDg4LDB4NTQsMHg5ZiwweGM0LDB4MWYsCi0JICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDAxLAotCSAgMHgwMH19LAotCXt7MHg2NCwweDRmLDB4ODgsMHg1NCwweDlmLDB4OTcsMHgxZiwKLQkgIDB4NjAsMHg4NywweDVkLDB4ODMsMHgxMCwweDAwLDB4MDEsCi0JICAweDAwfX0sCi0Je3sweDY0LDB4NGYsMHg4OCwweDU0LDB4OWYsMHgwNCwweDNlLAotCSAgMHhlMiwweDg5LDB4ZGYsMHgwNSwweDAwLDB4MDAsMHgwMSwKLQkgIDB4MDB9fSwKLQl7ezB4N2UsMHg2MywweDgyLDB4NjgsMHgxNSwweDdjLDB4ZjAsCi0JICAweDVhLDB4OGYsMHg1NywweDdkLDB4MjAsMHgwMCwweDI2LAotCSAgMHgwMX19LAotCXt7MHhhMywweDdmLDB4ODcsMHg4NiwweDk3LDB4MjQsMHhmNSwKLQkgIDB4MDIsMHg4OCwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDIsCi0JICAweDAxfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDExMDI0eDc2OF8xX0hbXSA9Ci17Ci0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHhjNCwweDFmLAotCSAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHg0NCwKLQkgIDB4MDAgfX0sCi0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHg5NywweDFmLAotCSAgMHg2MCwweDg3LDB4NUQsMHg4MywweDEwLDB4MDAsMHg0NCwKLQkgIDB4MDB9fSwKLQl7ezB4MmYsMHgyNywweDkzLDB4MmIsMHg5MCwweGM0LDB4MWYsCi0JICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDQ0LAotCSAgMHgwMH19LAotCXt7MHgyZiwweDI3LDB4OTMsMHgyYiwweDkwLDB4OTcsMHgxZiwKLQkgIDB4NjAsMHg4NywweDVELDB4ODMsMHgxMCwweDAwLDB4NDQsCi0JICAweDAwfX0sCi0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHgwNCwweDNlLAotCSAgMHhFMiwweDg5LDB4ZGYsMHgwNSwweDAwLDB4MDAsMHg0NCwKLQkgIDB4MDB9fSwKLQl7ezB4M2MsMHgzMSwweDgwLDB4MzUsMHgxYywweDdjLDB4ZjAsCi0JICAweDVBLDB4OEYsMHg1NywweDdELDB4MjAsMHgwMCwweDU1LAotCSAgMHgwMX19LAotCXt7MHg0ZiwweDNGLDB4OTMsMHg0NSwweDBELDB4MjQsMHhmNSwKLQkgIDB4MDIsMHg4OCwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0JICAweDAxIH19Ci0KLSNpZiAwCi0Je3sweDM3LDB4MjcsMHg5QiwweDJiLDB4OTQsMHhjNCwweDFmLAotCSAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHg0NCwKLQkgIDB4MDAgfX0sCi0Je3sweDM3LDB4MjcsMHg5QiwweDJiLDB4OTQsMHg5NywweDFmLAotCSAgMHg2MCwweDg3LDB4NUQsMHg4MywweDAxLDB4MDAsMHg0NCwKLQkgIDB4MDB9fSwKLQl7ezB4MzcsMHgyNywweDlCLDB4MmIsMHg5NCwweGM0LDB4MWYsCi0JICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDQ0LAotCSAgMHgwMH19LAotCXt7MHgzNywweDI3LDB4OUIsMHgyYiwweDk0LDB4OTcsMHgxZiwKLQkgIDB4NjAsMHg4NywweDVELDB4ODMsMHgwMSwweDAwLDB4NDQsCi0JICAweDAwfX0sCi0Je3sweDM3LDB4MjcsMHg5QiwweDJiLDB4OTQsMHgwNCwweDNlLAotCSAgMHhFMiwweDg5LDB4RGYsMHgwNSwweDAwLDB4MDAsMHg0NCwKLQkgIDB4MDB9fSwKLQl7ezB4NDEsMHgzMSwweDg1LDB4MzUsMHgxZCwweDdjLDB4ZjAsCi0JICAweDVBLDB4OEYsMHg1NywweDdELDB4MjAsMHgwMCwweDU1LAotCSAgMHgwMX19LAotCXt7MHg0ZiwweDNGLDB4OTMsMHg0NSwweDBELDB4MjQsMHhmNSwKLQkgIDB4MDIsMHg4OCwweEZmLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0JICAweDAxIH19Ci0jZW5kaWYKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDExMjgweDEwMjRfMVtdID0KLXsKLQl7ezB4NjMsMHg0ZiwweDg3LDB4NTQsMHg5ZiwweGI0LDB4MWYsCi0JICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDAxLAotCSAgMHgwMCB9fSwKLQl7ezB4NjMsMHg0ZiwweDg3LDB4NTQsMHg5ZiwweDgyLDB4MWYsCi0JICAweDYwLDB4ODcsMHg1ZCwweDgzLDB4MTAsMHgwMCwweDAxLAotCSAgMHgwMCB9fSwKLQl7ezB4NjMsMHg0ZiwweDg3LDB4NTQsMHg5ZiwweGI0LDB4MWYsCi0JICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDAxLAotCSAgMHgwMCB9fSwKLQl7ezB4NjMsMHg0ZiwweDg3LDB4NTQsMHg5ZiwweDgyLDB4MWYsCi0JICAweDYwLDB4ODcsMHg1ZCwweDgzLDB4MTAsMHgwMCwweDAxLAotCSAgMHgwMCB9fSwKLQl7ezB4NjMsMHg0ZiwweDg3LDB4NTQsMHg5ZiwweDA0LDB4M2UsCi0JICAweGUyLDB4ODksMHhkZiwweDA1LDB4MDAsMHgwMCwweDAxLAotCSAgMHgwMCB9fSwKLQl7ezB4N2UsMHg2MywweDgyLDB4NjgsMHgxNSwweDdjLDB4ZjAsCi0JICAweDVhLDB4OGYsMHg1NywweDdkLDB4MjAsMHgwMCwweDI2LAotCSAgMHgwMSB9fSwKLQl7ezB4YTMsMHg3ZiwweDg3LDB4ODYsMHg5NywweDI0LDB4ZjUsCi0JICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAyLAotCSAgMHgwMSB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMwMF9MVkRTQ1JUMTEyODB4MTAyNF8xX0hbXSA9Ci17Ci0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHhiNCwweDFmLAotCSAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHg4MiwweDFmLAotCSAgMHg2MCwweDg3LDB4NWQsMHg4MywweDEwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHhiNCwweDFmLAotCSAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHg4MiwweDFmLAotCSAgMHg2MCwweDg3LDB4NWQsMHg4MywweDEwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHgwNCwweDNlLAotCSAgMHhlMiwweDg5LDB4ZGYsMHgwNSwweDAwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDNjLDB4MzEsMHg4MCwweDM1LDB4MWMsMHg3YywweGYwLAotCSAgMHg1YSwweDhmLDB4NTcsMHg3ZCwweDIwLDB4MDAsMHg1NSwKLQkgIDB4MDEgfX0sCi0Je3sweDRmLDB4M2YsMHg5MywweDQ1LDB4MGQsMHgyNCwweGY1LAotCSAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMSwKLQkgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDE4MDB4NjAwXzJbXSA9Ci17Ci0Je3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotCSAgMHhmNCwweDg4LDB4OGYsMHg3MywweDIwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotCSAgMHhkYiwweDhmLDB4NWQsMHg3MywweDIwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotCSAgMHhmNCwweDg4LDB4OGYsMHg3MywweDIwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotCSAgMHhkYiwweDhmLDB4NWQsMHg3MywweDIwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweGJhLAotCSAgMHgxYywweDgwLDB4ZGYsMHg3MywweDAwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweDdmLDB4NjMsMHg4MywweDZjLDB4MWMsMHg3MiwweGYwLAotCSAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKLQkgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDE4MDB4NjAwXzJfSFtdID0KLXsKLQl7ezB4M2QsMHgyNywweDgxLDB4MzIsMHgxYSwweDcyLDB4M2UsCi0JICAweGY0LDB4ODgsMHg4ZiwweDczLDB4MjAsMHgwMCwweDA1LAotCSAgMHgwMCB9fSwKLQl7ezB4M2QsMHgyNywweDgxLDB4MzIsMHgxYSwweDcyLDB4M2UsCi0JICAweGRiLDB4OGYsMHg1ZCwweDczLDB4MjAsMHgwMCwweDA1LAotCSAgMHgwMCB9fSwKLQl7ezB4M2QsMHgyNywweDgxLDB4MzIsMHgxYSwweDcyLDB4M2UsCi0JICAweGY0LDB4ODgsMHg4ZiwweDczLDB4MjAsMHgwMCwweDA1LAotCSAgMHgwMCB9fSwKLQl7ezB4M2QsMHgyNywweDgxLDB4M2EsMHgxYSwweDcyLDB4M2UsCi0JICAweGRiLDB4OGYsMHg1ZCwweDczLDB4MjAsMHgwMCwweDA1LAotCSAgMHgwMCB9fSwKLQl7ezB4M2QsMHgyNywweDgxLDB4MzIsMHgxYSwweDcyLDB4YmEsCi0JICAweDFjLDB4ODAsMHhkZiwweDczLDB4MDAsMHgwMCwweDA1LAotCSAgMHgwMCB9fSwKLQl7ezB4M2QsMHgzMSwweDgxLDB4MzcsMHgxZiwweDcyLDB4ZjAsCi0JICAweDU4LDB4OGMsMHg1NywweDczLDB4MjAsMHgwMCwweDA1LAotCSAgMHgwMSB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMwMF9MVkRTQ1JUMTEwMjR4NzY4XzJbXSA9Ci17Ci0Je3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotCSAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotCSAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotCSAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotCSAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotCSAgMHg3MiwweDg4LDB4ZGYsMHgyNSwweDMwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweGEzLDB4NjMsMHg4NywweDc4LDB4ODksMHgyNCwweGYxLAotCSAgMHhhZSwweDg0LDB4NTcsMHgyNSwweDMwLDB4MDAsMHgwMiwKLQkgIDB4MDEgfX0sCi0Je3sweGEzLDB4N2YsMHg4NywweDg2LDB4OTcsMHgyNCwweGY1LAotCSAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMiwKLQkgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDExMDI0eDc2OF8yX0hbXSA9Ci17Ci0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotCSAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotCSAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotCSAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotCSAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotCSAgMHg3MiwweDg4LDB4ZGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MzEsMHg5MywweDNlLDB4MDYsMHgyNCwweGYxLAotCSAgMHhhZSwweDg0LDB4NTcsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDEgfX0sCi0Je3sweDRmLDB4M2YsMHg5MywweDQ1LDB4MGQsMHgyNCwweGY1LAotCSAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMSwKLQkgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDExMjgweDEwMjRfMltdID0KLXsKLQl7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0JICAweDRhLDB4ODAsMHg4ZiwweDI1LDB4MzAsMHgwMCwweDA2LAotCSAgMHgwMCB9fSwKLQl7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0JICAweDMxLDB4ODcsMHg1ZCwweDI1LDB4MzAsMHgwMCwweDA2LAotCSAgMHgwMCB9fSwKLQl7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0JICAweDRhLDB4ODAsMHg4ZiwweDI1LDB4MzAsMHgwMCwweDA2LAotCSAgMHgwMCB9fSwKLQl7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0JICAweDMxLDB4ODcsMHg1ZCwweDI1LDB4MzAsMHgwMCwweDA2LAotCSAgMHgwMCB9fSwKLQl7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0JICAweDcyLDB4ODgsMHhkZiwweDI1LDB4MzAsMHgwMCwweDA2LAotCSAgMHgwMCB9fSwKLQl7ezB4YTMsMHg2MywweDg3LDB4NzgsMHg4OSwweDI0LDB4ZjEsCi0JICAweGFlLDB4ODQsMHg1NywweDI1LDB4MzAsMHgwMCwweDAyLAotCSAgMHgwMSB9fSwKLQl7ezB4YTMsMHg3ZiwweDg3LDB4ODYsMHg5NywweDI0LDB4ZjUsCi0JICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAyLAotCSAgMHgwMSB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMwMF9MVkRTQ1JUMTEyODB4MTAyNF8yX0hbXSA9Ci17Ci0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4ODEsMHgyNCwweGJiLAotCSAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4ODEsMHgyNCwweGJiLAotCSAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4ODEsMHgyNCwweGJiLAotCSAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4ODEsMHgyNCwweGJiLAotCSAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4ODEsMHgyNCwweGJiLAotCSAgMHg3MiwweDg4LDB4ZGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MzEsMHg5MywweDNlLDB4ODYsMHgyNCwweGYxLAotCSAgMHhhZSwweDg0LDB4NTcsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDEgfX0sCi0Je3sweDRmLDB4M2YsMHg5MywweDQ1LDB4MGQsMHgyNCwweGY1LAotCSAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMSwKLQkgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMwMF9MVkRTQ1JUMVhYWHhYWFhfMVtdID0KLXsKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweGJmLDB4MWYsCi0gICAweDljLDB4OGUsMHg5NiwweGI5LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4YmYsMHgxZiwKLSAgIDB4OWMsMHg4ZSwweDk2LDB4YjksMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHhiZiwweDFmLAotICAgMHg5YywweDhlLDB4OTYsMHhiOSwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweGJmLDB4MWYsCi0gICAweDljLDB4OGUsMHg5NiwweGI5LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKLSAgIDB4ZTksMHg4YiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDdmLDB4NjMsMHg4MywweDZjLDB4MWMsMHg3MiwweGYwLAotICAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4YTMsMHg3ZiwweDg3LDB4ODYsMHg5NywweDI0LDB4ZjUsCi0gICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhjZSwweDlmLDB4OTIsMHhhOCwweDE0LDB4MjgsMHg1YSwKLSAgIDB4MDAsMHg4NCwweGZmLDB4MjksMHgwOSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4OWYsMHg5MiwweGE5LDB4MTcsMHgyNCwweGY1LAotICAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwNywKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMwMF9MVkRTQ1JUMVhYWHhYWFhfMV9IW10gPQotewotIHt7MHgzOCwweDI3LDB4OWMsMHgyYywweDgwLDB4YmYsMHgxZiwKLSAgIDB4OWMsMHg4ZSwweDk2LDB4YjksMHgzMCwweDAwLDB4MDAsCi0gICAweDAwfX0sCi0ge3sweDM4LDB4MjcsMHg5YywweDJjLDB4ODAsMHhiZiwweDFmLAotICAgMHg5YywweDhlLDB4OTYsMHhiOSwweDMwLDB4MDAsMHgwMCwKLSAgIDB4MDB9fSwKLSB7ezB4MzgsMHgyNywweDljLDB4MmMsMHg4MCwweGJmLDB4MWYsCi0gICAweDljLDB4OGUsMHg5NiwweGI5LDB4MzAsMHgwMCwweDAwLAotICAgMHgwMH19LAotIHt7MHgzOCwweDI3LDB4OWMsMHgyYywweDgwLDB4YmYsMHgxZiwKLSAgIDB4OWMsMHg4ZSwweDk2LDB4YjksMHgzMCwweDAwLDB4MDAsCi0gICAweDAwfX0sCi0ge3sweDM4LDB4MjcsMHg5YywweDJjLDB4ODAsMHgwYiwweDNlLAotICAgMHhlOSwweDhiLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgIDB4MDB9fSwKLSB7ezB4NGQsMHgzMSwweDkxLDB4M2IsMHgwMywweDcyLDB4ZjAsCi0gICAweDU4LDB4OGMsMHg1NywweDczLDB4MjAsMHgwMCwweDAxLAotICAgMHgwMX19LAotIHt7MHg2MywweDNmLDB4ODcsMHg0YSwweDkyLDB4MjQsMHhmNSwKLSAgIDB4MDIsMHg4OCwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAxfX0KLX07Ci0KLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMwMF9DSFRWQ1JUMVVOVFNDW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpUzMwMF9DSFRWQ1JUMVVOVFNDW10gPQogewogCXt7MHg2NCwweDRmLDB4ODgsMHg1NiwweDlmLDB4NTYsMHgzZSwKIAkgIDB4ZTgsMHg4NCwweDhmLDB4NTcsMHgyMCwweDAwLDB4MDEsCkBAIC0xODEwLDcgKzkxNyw3IEBACiAJICAweDAxIH19CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzAwX0NIVFZDUlQxT05UU0NbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEgU2lTMzAwX0NIVFZDUlQxT05UU0NbXSA9CiB7CiAJe3sweDY0LDB4NGYsMHg4OCwweDVhLDB4OWYsMHgwYiwweDNlLAogCSAgMHhjMCwweDg0LDB4OGYsMHgwYywweDIwLDB4MDAsMHgwMSwKQEAgLTE4MzIsNyArOTM5LDcgQEAKIAkgIDB4MDEgfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfQ0hUVkNSVDFVUEFMW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpUzMwMF9DSFRWQ1JUMVVQQUxbXSA9CiB7CiAJe3sweDc5LDB4NGYsMHg5ZCwweDVhLDB4OTAsMHg2ZiwweDNlLAogCSAgMHhmOCwweDgzLDB4OGYsMHg3MCwweDIwLDB4MDAsMHgwNSwKQEAgLTE4NTQsNyArOTYxLDcgQEAKIAkgIDB4MDEgfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfQ0hUVkNSVDFPUEFMW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpUzMwMF9DSFRWQ1JUMU9QQUxbXSA9CiB7CiAJe3sweDc5LDB4NGYsMHg5ZCwweDVhLDB4OTAsMHg2ZiwweDNlLAogCSAgMHhmMCwweDgzLDB4OGYsMHg3MCwweDIwLDB4MDAsMHgwNSwKQEAgLTE4NzYsNyArOTgzLDcgQEAKIAkgIDB4MDEgfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfQ0hUVkNSVDFTT1BBTFtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YSBTaVMzMDBfQ0hUVkNSVDFTT1BBTFtdID0KIHsKIAl7ezB4NzksMHg0ZiwweDlkLDB4NWEsMHg5MCwweDZmLDB4M2UsCiAJICAweGYwLDB4ODMsMHg4ZiwweDcwLDB4MjAsMHgwMCwweDA1LApAQCAtMTg5OCw3ICsxMDA1LDcgQEAKIAkgIDB4MDEgfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgU2lTMzAwX0NIVFZSZWdfVU5UU0NbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMDBfQ0hUVlJlZ19VTlRTQ1tdID0KIHsKIAl7ezB4NGEsMHg5NCwweDAwLDB4NDgsMHhmZSwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9fSwKIAl7ezB4NGEsMHg5NCwweDAwLDB4NDgsMHhmZSwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9fSwKQEAgLTE5MDgsNyArMTAxNSw3IEBACiAJe3sweDhkLDB4YzQsMHgwMCwweDNiLDB4ZmIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfX0gIC8qIE1vZGUgMjQ6IDgwMHg2MDAgTlRTQyA3LzEwICovCiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0IFNpUzMwMF9DSFRWUmVnX09OVFNDW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfQ0hUVlJlZ0RhdGEgU2lTMzAwX0NIVFZSZWdfT05UU0NbXSA9CiB7CiAJe3sweDQ5LDB4OTQsMHgwMCwweDM0LDB4ZmUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfX0sCiAJe3sweDQ5LDB4OTQsMHgwMCwweDM0LDB4ZmUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfX0sCkBAIC0xOTE4LDcgKzEwMjUsNyBAQAogCXt7MHg4YywweGI0LDB4MDAsMHgzMiwweGY5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19ICAvKiBNb2RlIDIzOiA4MDB4NjAwIE5UU0MgMy80ICovCiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0IFNpUzMwMF9DSFRWUmVnX1VQQUxbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMDBfQ0hUVlJlZ19VUEFMW10gPQogewogCXt7MHg0MSwweDEyLDB4MDEsMHg1MCwweDM0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LAogCXt7MHg0MSwweDEyLDB4MDAsMHg1MCwweDAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LApAQCAtMTkyOSw3ICsxMDM2LDcgQEAKIAogfTsKIAotc3RhdGljIGNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCBTaVMzMDBfQ0hUVlJlZ19PUEFMW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfQ0hUVlJlZ0RhdGEgU2lTMzAwX0NIVFZSZWdfT1BBTFtdID0KIHsKIAl7ezB4NDEsMHgxMiwweDAxLDB4NTAsMHgzNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9fSwgLyogTW9kZSA5OiA2NDB4NDAwIFBBTCAxLzEgKi8KIAl7ezB4NDEsMHgxMiwweDAwLDB4NTAsMHgwMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9fSwKQEAgLTE5NDAsMjYgKzEwNDcsMjYgQEAKIAogfTsKIAotc3RhdGljIGNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCBTaVMzMDBfQ0hUVlJlZ19TT1BBTFtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0NIVFZSZWdEYXRhIFNpUzMwMF9DSFRWUmVnX1NPUEFMW10gPQogewogCXt7MHg0MSwweDEyLDB4MDEsMHg1MCwweDM0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LCAvKiBNb2RlIDk6IDY0MHg0MDAgUEFMIDEvMSAqLwogCXt7MHg0MSwweDEyLDB4MDAsMHg1MCwweDAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LAogCXt7MHg0MSwweDEyLDB4MDEsMHg1MCwweDM0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LAogCXt7MHg0MSwweDEyLDB4MDAsMHg1MCwweDAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LAotCXt7MHg2MCwweDMwLDB4MDAsMHgxMCwweDAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LCAvKiBUVzogTW9kZSAxMzogNjQweDQ4MCBQQUwgNS80ICovCi0Je3sweDgxLDB4NTAsMHgwMCwweDFiLDB4MDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfX0gIC8qIFRXOiBNb2RlIDE5OiA4MDB4NjAwIFBBTCAxLzEgKi8KKwl7ezB4NjAsMHgzMCwweDAwLDB4MTAsMHgwMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9fSwgLyogTW9kZSAxMzogNjQweDQ4MCBQQUwgNS80ICovCisJe3sweDgxLDB4NTAsMHgwMCwweDFiLDB4MDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfX0gIC8qIE1vZGUgMTk6IDgwMHg2MDAgUEFMIDEvMSAqLwogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMwMF9DSFRWVkNMS1VOVFNDW10gID0gezB4MjksMHgyOSwweDI5LDB4MjksMHgyYSwweDJlfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMwMF9DSFRWVkNMS1VOVFNDW10gID0geyAweDI5LDB4MjksMHgyOSwweDI5LDB4MmEsMHgyZSB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX0NIVFZWQ0xLT05UU0NbXSAgPSB7MHgyYywweDJjLDB4MmMsMHgyYywweDJkLDB4MmJ9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzAwX0NIVFZWQ0xLT05UU0NbXSAgPSB7IDB4MmMsMHgyYywweDJjLDB4MmMsMHgyZCwweDJiIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfQ0hUVlZDTEtTT05UU0NbXSA9IHsweDJjLDB4MmMsMHgyYywweDJjLDB4MmQsMHgyYn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfQ0hUVlZDTEtTT05UU0NbXSA9IHsgMHgyYywweDJjLDB4MmMsMHgyYywweDJkLDB4MmIgfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMwMF9DSFRWVkNMS1VQQUxbXSAgID0gezB4MmYsMHgyZiwweDJmLDB4MmYsMHgyZiwweDMxfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMwMF9DSFRWVkNMS1VQQUxbXSAgID0geyAweDJmLDB4MmYsMHgyZiwweDJmLDB4MmYsMHgzMSB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX0NIVFZWQ0xLT1BBTFtdICAgPSB7MHgyZiwweDJmLDB4MmYsMHgyZiwweDMwLDB4MzJ9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzAwX0NIVFZWQ0xLT1BBTFtdICAgPSB7IDB4MmYsMHgyZiwweDJmLDB4MmYsMHgzMCwweDMyIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfQ0hUVlZDTEtTT1BBTFtdICA9IHsweDJmLDB4MmYsMHgyZiwweDJmLDB4MzYsMHgyOX07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfQ0hUVlZDTEtTT1BBTFtdICA9IHsgMHgyZiwweDJmLDB4MmYsMHgyZiwweDM2LDB4MjkgfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy8zMTB2dGJsLmggYi9kcml2ZXJzL3ZpZGVvL3Npcy8zMTB2dGJsLmgKaW5kZXggMmM3MWQwNC4uNTRmY2JiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvMzEwdnRibC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzLzMxMHZ0YmwuaApAQCAtMSw5ICsxLDkgQEAKIC8qICRYRnJlZTg2JCAqLwogLyogJFhkb3RPcmckICovCiAvKgotICogUmVnaXN0ZXIgc2V0dGluZ3MgZm9yIFNpUyAzMTUvMzMwIHNlcmllcworICogUmVnaXN0ZXIgc2V0dGluZ3MgZm9yIFNpUyAzMTUvMzMwLzM0MCBzZXJpZXMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQogICoKICAqIElmIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgdGhlIGZvbGxvd2luZyBsaWNlbnNlIHRlcm1zCiAgKiBhcHBseToKQEAgLTUwLDM3ICs1MCwxMyBAQAogICoKICAqLwogCi1zdGF0aWMgY29uc3QgU2lTX1N0U3RydWN0IFNpUzMxMF9TTW9kZUlEVGFibGVbXT0KLXsKLQl7MHgwMSwweDkyMDgsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsIDB4NDB9LAotCXsweDAxLDB4MTIxMCwweDE0LDB4MDEsMHgwMSwweDAwLDB4MDEsMHgwMCwgMHg0MH0sCi0JezB4MDEsMHgxMDEwLDB4MTcsMHgwMiwweDAyLDB4MDAsMHgwMSwweDAxLCAweDQwfSwKLQl7MHgwMywweDgyMDgsMHgwMywweDAwLDB4MDAsMHgwMCwweDAxLDB4MDIsIDB4NDB9LAotCXsweDAzLDB4MDIxMCwweDE2LDB4MDEsMHgwMSwweDAwLDB4MDEsMHgwMiwgMHg0MH0sCi0JezB4MDMsMHgwMDEwLDB4MTgsMHgwMiwweDAyLDB4MDAsMHgwMSwweDAzLCAweDQwfSwKLQl7MHgwNSwweDkyMDksMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsIDB4NDB9LAotCXsweDA2LDB4ODIwOSwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNSwgMHg0MH0sCi0JezB4MDcsMHgwMDAwLDB4MDcsMHgwMywweDAzLDB4MDAsMHgwMSwweDAzLCAweDQwfSwKLQl7MHgwNywweDAwMDAsMHgxOSwweDAyLDB4MDIsMHgwMCwweDAxLDB4MDMsIDB4NDB9LAotCXsweDBkLDB4OTIwYSwweDBkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwgMHg0MH0sCi0JezB4MGUsMHg4MjBhLDB4MGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA1LCAweDQwfSwKLQl7MHgwZiwweDAyMDIsMHgxMSwweDAxLDB4MDEsMHgwMCwweDAwLDB4MDUsIDB4NDB9LAotCXsweDEwLDB4MDIxMiwweDEyLDB4MDEsMHgwMSwweDAwLDB4MDAsMHgwNSwgMHg0MH0sCi0JezB4MTEsMHgwMjEyLDB4MWEsMHgwNCwweDA0LDB4MDAsMHgwMCwweDA1LCAweDQwfSwKLQl7MHgxMiwweDAyMTIsMHgxYiwweDA0LDB4MDQsMHgwMCwweDAwLDB4MDUsIDB4NDB9LAotCXsweDEzLDB4MDIxYiwweDFjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwgMHg0MH0sCi0JezB4MTIsMHgwMDEwLDB4MTgsMHgwMiwweDAyLDB4MDAsMHgwMCwweDA1LCAweDQwfSwKLQl7MHgxMiwweDAyMTAsMHgxOCwweDAxLDB4MDEsMHgwMCwweDAwLDB4MDUsIDB4NDB9LAotCXsweGZmLDB4MDAwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgMHg0MH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfRXh0U3RydWN0ICBTaVMzMTBfRU1vZGVJRFRhYmxlW109CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19FeHQgU2lTMzEwX0VNb2RlSURUYWJsZVtdID0KIHsKIAl7MHg2YSwweDIyMTIsMHgwMTAyLFNJU19SSV84MDB4NjAwLCAgMHgwMCwweDAwLDB4MDcsMHgwNiwweDAwLCAzfSwgLyogODAweDYwMHg/ICovCiAJezB4MmUsMHgwYTFiLDB4MDEwMSxTSVNfUklfNjQweDQ4MCwgIDB4MDAsMHgwMCwweDA1LDB4MDUsMHgwOCwgMn0sIC8qIDY0MHg0ODB4OCAqLwotICAgICAgICB7MHgyZiwweDBhMWIsMHgwMTAwLFNJU19SSV82NDB4NDAwLCAgMHgwMCwweDAwLDB4MDUsMHgwNSwweDEwLCAwfSwgLyogNjQweDQwMHg4ICovCisJezB4MmYsMHgwYTFiLDB4MDEwMCxTSVNfUklfNjQweDQwMCwgIDB4MDAsMHgwMCwweDA1LDB4MDUsMHgxMCwgMH0sIC8qIDY0MHg0MDB4OCAqLwogCXsweDMwLDB4MmExYiwweDAxMDMsU0lTX1JJXzgwMHg2MDAsICAweDAwLDB4MDAsMHgwNywweDA2LDB4MDAsIDN9LCAvKiA4MDB4NjAweDggKi8KLSAgICAgICAgezB4MzEsMHg0YTFiLDB4MDAwMCxTSVNfUklfNzIweDQ4MCwgIDB4MDAsMHgwMCwweDA2LDB4MDYsMHgxMSwtMX0sIC8qIDcyMHg0ODB4OCAqLworCXsweDMxLDB4NGExYiwweDAwMDAsU0lTX1JJXzcyMHg0ODAsICAweDAwLDB4MDAsMHgwNiwweDA2LDB4MTEsLTF9LCAvKiA3MjB4NDgweDggKi8KIAl7MHgzMiwweDRhMWIsMHgwMDAwLFNJU19SSV83MjB4NTc2LCAgMHgwMCwweDAwLDB4MDYsMHgwNiwweDEyLC0xfSwgLyogNzIweDU3Nng4ICovCiAJezB4MzMsMHg0YTFkLDB4MDAwMCxTSVNfUklfNzIweDQ4MCwgIDB4MDAsMHgwMCwweDA2LDB4MDYsMHgxMSwtMX0sIC8qIDcyMHg0ODB4MTYgKi8KIAl7MHgzNCwweDZhMWQsMHgwMDAwLFNJU19SSV83MjB4NTc2LCAgMHgwMCwweDAwLDB4MDYsMHgwNiwweDEyLC0xfSwgLyogNzIweDU3NngxNiAqLwpAQCAtMTAzLDEwICs3OSwxMCBAQAogCXsweDRkLDB4MGU3ZCwweDAxMWEsU0lTX1JJXzEyODB4MTAyNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MWEsIDh9LCAvKiAxMjgweDEwMjR4MTYgKi8KIAl7MHg1MCwweDlhMWIsMHgwMTMyLFNJU19SSV8zMjB4MjQwLCAgMHgwMCwweDAwLDB4MDQsMHgwNCwweDI2LCAyfSwgLyogMzIweDI0MHg4ICAqLwogCXsweDUxLDB4YmExYiwweDAxMzMsU0lTX1JJXzQwMHgzMDAsICAweDAwLDB4MDAsMHgwNywweDA3LDB4MjcsIDN9LCAvKiA0MDB4MzAweDggICovCi0gIAl7MHg1MiwweGJhMWIsMHgwMTM0LFNJU19SSV81MTJ4Mzg0LCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDI4LCA0fSwgLyogNTEyeDM4NHg4ICAqLworCXsweDUyLDB4YmExYiwweDAxMzQsU0lTX1JJXzUxMngzODQsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MjgsIDR9LCAvKiA1MTJ4Mzg0eDggICovCiAJezB4NTYsMHg5YTFkLDB4MDEzNSxTSVNfUklfMzIweDI0MCwgIDB4MDAsMHgwMCwweDA0LDB4MDQsMHgyNiwgMn0sIC8qIDMyMHgyNDB4MTYgKi8KIAl7MHg1NywweGJhMWQsMHgwMTM2LFNJU19SSV80MDB4MzAwLCAgMHgwMCwweDAwLDB4MDcsMHgwNywweDI3LCAzfSwgLyogNDAweDMwMHgxNiAqLwotIAl7MHg1OCwweGJhMWQsMHgwMTM3LFNJU19SSV81MTJ4Mzg0LCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDI4LCA0fSwgLyogNTEyeDM4NHgxNiAqLworCXsweDU4LDB4YmExZCwweDAxMzcsU0lTX1JJXzUxMngzODQsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MjgsIDR9LCAvKiA1MTJ4Mzg0eDE2ICovCiAJezB4NTksMHg5YTFiLDB4MDEzOCxTSVNfUklfMzIweDIwMCwgIDB4MDAsMHgwMCwweDA0LDB4MDQsMHgyNSwgMH0sIC8qIDMyMHgyMDB4OCAgKi8KIAl7MHg1YSwweDAyMWIsMHgwMTM4LFNJU19SSV8zMjB4MjQwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDNmLCAyfSwgLyogMzIweDI0MHg4ICBmc3RuICovCiAJezB4NWIsMHgwYTFkLDB4MDEzNSxTSVNfUklfMzIweDI0MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzZiwgMn0sIC8qIDMyMHgyNDB4MTYgZnN0biAqLwpAQCAtMTM5LDQwNiArMTE1LDMzNSBAQAogCXsweDIzLDB4MGUzYiwweDAwMDAsU0lTX1JJXzEyODB4NzY4LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsIDZ9LCAvKiAxMjgweDc2OHg4ICovCiAJezB4MjQsMHgwZTdkLDB4MDAwMCxTSVNfUklfMTI4MHg3NjgsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwgNn0sIC8qIDEyODB4NzY4eDE2ICovCiAJezB4MjUsMHgwZWZmLDB4MDAwMCxTSVNfUklfMTI4MHg3NjgsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwgNn0sIC8qIDEyODB4NzY4eDMyICovCi0JezB4MjYsMHgwZTNiLDB4MDAwMCxTSVNfUklfMTQwMHgxMDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MSwgOX0sIC8qIDE0MDB4MTA1MHg4ICovCi0JezB4MjcsMHgwZTdkLDB4MDAwMCxTSVNfUklfMTQwMHgxMDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MSwgOX0sIC8qIDE0MDB4MTA1MHgxNiAqLwotCXsweDI4LDB4MGVmZiwweDAwMDAsU0lTX1JJXzE0MDB4MTA1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDEsIDl9LCAvKiAxNDAweDEwNTB4MzIqLwotCXsweDI5LDB4NGUxYiwweDAwMDAsU0lTX1JJXzExNTJ4ODY0LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NDMsLTF9LCAvKiAxMTUyeDg2NCAqLwotCXsweDJhLDB4NGUzZCwweDAwMDAsU0lTX1JJXzExNTJ4ODY0LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NDMsLTF9LAotCXsweDJiLDB4NGU3ZiwweDAwMDAsU0lTX1JJXzExNTJ4ODY0LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NDMsLTF9LAotCXsweDM5LDB4NmExYiwweDAwMDAsU0lTX1JJXzg0OHg0ODAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NDYsLTF9LCAvKiA4NDh4NDgwICovCi0JezB4M2IsMHg2YTNkLDB4MDAwMCxTSVNfUklfODQ4eDQ4MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NiwtMX0sCi0JezB4M2UsMHg2YTdmLDB4MDAwMCxTSVNfUklfODQ4eDQ4MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NiwtMX0sCi0JezB4M2YsMHg2YTFiLDB4MDAwMCxTSVNfUklfODU2eDQ4MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0OCwtMX0sIC8qIDg1Nng0ODAgKi8KLQl7MHg0MiwweDZhM2QsMHgwMDAwLFNJU19SSV84NTZ4NDgwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ4LC0xfSwKLQl7MHg0NSwweDZhN2YsMHgwMDAwLFNJU19SSV84NTZ4NDgwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ4LC0xfSwKLQl7MHg0OCwweDZhM2IsMHgwMDAwLFNJU19SSV8xMzYweDc2OCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLC0xfSwgLyogMTM2MHg3NjggKi8KLQl7MHg0YiwweDZhN2QsMHgwMDAwLFNJU19SSV8xMzYweDc2OCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLC0xfSwKLQl7MHg0ZSwweDZhZmYsMHgwMDAwLFNJU19SSV8xMzYweDc2OCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLC0xfSwKKwl7MHgyNiwweDBlM2IsMHgwMDAwLFNJU19SSV8xNDAweDEwNTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLCA5fSwgLyogMTQwMHgxMDUweDggKi8KKwl7MHgyNywweDBlN2QsMHgwMDAwLFNJU19SSV8xNDAweDEwNTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLCA5fSwgLyogMTQwMHgxMDUweDE2ICovCisJezB4MjgsMHgwZWZmLDB4MDAwMCxTSVNfUklfMTQwMHgxMDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MywgOX0sIC8qIDE0MDB4MTA1MHgzMiovCisJezB4MjksMHg0ZTFiLDB4MDAwMCxTSVNfUklfMTE1Mng4NjQsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NSwtMX0sIC8qIDExNTJ4ODY0ICovCisJezB4MmEsMHg0ZTNkLDB4MDAwMCxTSVNfUklfMTE1Mng4NjQsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NSwtMX0sCisJezB4MmIsMHg0ZTdmLDB4MDAwMCxTSVNfUklfMTE1Mng4NjQsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NSwtMX0sCisJezB4MzksMHg2YTFiLDB4MDAwMCxTSVNfUklfODQ4eDQ4MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0OCwtMX0sIC8qIDg0OHg0ODAgKi8KKwl7MHgzYiwweDZhM2QsMHgwMDAwLFNJU19SSV84NDh4NDgwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ4LC0xfSwKKwl7MHgzZSwweDZhN2YsMHgwMDAwLFNJU19SSV84NDh4NDgwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ4LC0xfSwKKwl7MHgzZiwweDZhMWIsMHgwMDAwLFNJU19SSV84NTZ4NDgwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLC0xfSwgLyogODU2eDQ4MCAqLworCXsweDQyLDB4NmEzZCwweDAwMDAsU0lTX1JJXzg1Nng0ODAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGEsLTF9LAorCXsweDQ1LDB4NmE3ZiwweDAwMDAsU0lTX1JJXzg1Nng0ODAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGEsLTF9LAorCXsweDQ4LDB4NmEzYiwweDAwMDAsU0lTX1JJXzEzNjB4NzY4LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGMsLTF9LCAvKiAxMzYweDc2OCAqLworCXsweDRiLDB4NmE3ZCwweDAwMDAsU0lTX1JJXzEzNjB4NzY4LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGMsLTF9LAorCXsweDRlLDB4NmFmZiwweDAwMDAsU0lTX1JJXzEzNjB4NzY4LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGMsLTF9LAogCXsweDRmLDB4OWExZiwweDAwMDAsU0lTX1JJXzMyMHgyMDAsICAweDAwLDB4MDAsMHgwNCwweDA0LDB4MjUsIDB9LCAvKiAzMjB4MjAweDMyICovCiAJezB4NTMsMHg5YTFmLDB4MDAwMCxTSVNfUklfMzIweDI0MCwgIDB4MDAsMHgwMCwweDA0LDB4MDQsMHgyNiwgMn0sIC8qIDMyMHgyNDB4MzIgKi8KIAl7MHg1NCwweGJhMWYsMHgwMDAwLFNJU19SSV80MDB4MzAwLCAgMHgwMCwweDAwLDB4MDcsMHgwNywweDI3LCAzfSwgLyogNDAweDMwMHgzMiAqLwotCXsweDVmLDB4NmExYiwweDAwMDAsU0lTX1JJXzc2OHg1NzYsICAweDAwLDB4MDAsMHgwNiwweDA2LDB4NGIsLTF9LCAvKiA3Njh4NTc2ICovCi0JezB4NjAsMHg2YTFkLDB4MDAwMCxTSVNfUklfNzY4eDU3NiwgIDB4MDAsMHgwMCwweDA2LDB4MDYsMHg0YiwtMX0sCi0JezB4NjEsMHg2YTNmLDB4MDAwMCxTSVNfUklfNzY4eDU3NiwgIDB4MDAsMHgwMCwweDA2LDB4MDYsMHg0YiwtMX0sCi0JezB4MTQsMHgwZTNiLDB4MDAwMCxTSVNfUklfMTI4MHg4MDAsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YywgN30sIC8qIDEyODB4ODAwICovCi0JezB4MTUsMHgwZTdkLDB4MDAwMCxTSVNfUklfMTI4MHg4MDAsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YywgN30sCi0JezB4MTYsMHgwZWZmLDB4MDAwMCxTSVNfUklfMTI4MHg4MDAsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YywgN30sCi0JezB4MTcsMHgwZTNiLDB4MDAwMCxTSVNfUklfMTY4MHgxMDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0ZCwgOX0sIC8qIDE2ODB4MTA1MCAqLwotCXsweDE4LDB4MGU3ZCwweDAwMDAsU0lTX1JJXzE2ODB4MTA1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGQsIDl9LAotCXsweDE5LDB4MGVmZiwweDAwMDAsU0lTX1JJXzE2ODB4MTA1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGQsIDl9LAotCXsweDJjLDB4MjY3YiwweDAwMDAsU0lTX1JJXzE5MjB4MTA4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGUsLTF9LCAvKiAxOTIweDEwODAoaSkgKi8KLQl7MHgyZCwweDI2ZmQsMHgwMDAwLFNJU19SSV8xOTIweDEwODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDRlLC0xfSwKLQl7MHg3MywweDI3ZmYsMHgwMDAwLFNJU19SSV8xOTIweDEwODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDRlLC0xfSwKLQl7MHgxZCwweDZhMWIsMHgwMDAwLFNJU19SSV85NjB4NTQwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRmLC0xfSwgLyogOTYweDU0MCAqLwotCXsweDFlLDB4NmEzZCwweDAwMDAsU0lTX1JJXzk2MHg1NDAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGYsLTF9LAotCXsweDFmLDB4NmE3ZiwweDAwMDAsU0lTX1JJXzk2MHg1NDAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGYsLTF9LAotCXsweDIwLDB4NmExYiwweDAwMDAsU0lTX1JJXzk2MHg2MDAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NTAsLTF9LCAvKiA5NjB4NjAwICovCi0JezB4MjEsMHg2YTNkLDB4MDAwMCxTSVNfUklfOTYweDYwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MCwtMX0sCi0JezB4MjIsMHg2YTdmLDB4MDAwMCxTSVNfUklfOTYweDYwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MCwtMX0sCisJezB4NWYsMHg2YTFiLDB4MDAwMCxTSVNfUklfNzY4eDU3NiwgIDB4MDAsMHgwMCwweDA2LDB4MDYsMHg0ZCwtMX0sIC8qIDc2OHg1NzYgKi8KKwl7MHg2MCwweDZhMWQsMHgwMDAwLFNJU19SSV83Njh4NTc2LCAgMHgwMCwweDAwLDB4MDYsMHgwNiwweDRkLC0xfSwKKwl7MHg2MSwweDZhM2YsMHgwMDAwLFNJU19SSV83Njh4NTc2LCAgMHgwMCwweDAwLDB4MDYsMHgwNiwweDRkLC0xfSwKKwl7MHgxNCwweDBlM2IsMHgwMDAwLFNJU19SSV8xMjgweDgwMCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRlLCA3fSwgLyogMTI4MHg4MDAgKi8KKwl7MHgxNSwweDBlN2QsMHgwMDAwLFNJU19SSV8xMjgweDgwMCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRlLCA3fSwKKwl7MHgxNiwweDBlZmYsMHgwMDAwLFNJU19SSV8xMjgweDgwMCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRlLCA3fSwKKwl7MHgxNywweDBlM2IsMHgwMDAwLFNJU19SSV8xNjgweDEwNTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDUxLCA5fSwgLyogMTY4MHgxMDUwICovCisJezB4MTgsMHgwZTdkLDB4MDAwMCxTSVNfUklfMTY4MHgxMDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MSwgOX0sCisJezB4MTksMHgwZWZmLDB4MDAwMCxTSVNfUklfMTY4MHgxMDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MSwgOX0sCisJezB4MmMsMHgyNjdiLDB4MDAwMCxTSVNfUklfMTkyMHgxMDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MiwtMX0sIC8qIDE5MjB4MTA4MChpKSAqLworCXsweDJkLDB4MjZmZCwweDAwMDAsU0lTX1JJXzE5MjB4MTA4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTIsLTF9LAorCXsweDczLDB4MjdmZiwweDAwMDAsU0lTX1JJXzE5MjB4MTA4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTIsLTF9LAorCXsweDFkLDB4NmExYiwweDAwMDAsU0lTX1JJXzk2MHg1NDAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NTMsLTF9LCAvKiA5NjB4NTQwICovCisJezB4MWUsMHg2YTNkLDB4MDAwMCxTSVNfUklfOTYweDU0MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MywtMX0sCisJezB4MWYsMHg2YTdmLDB4MDAwMCxTSVNfUklfOTYweDU0MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MywtMX0sCisJezB4MjAsMHg2YTFiLDB4MDAwMCxTSVNfUklfOTYweDYwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1NCwtMX0sIC8qIDk2MHg2MDAgKi8KKwl7MHgyMSwweDZhM2QsMHgwMDAwLFNJU19SSV85NjB4NjAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDU0LC0xfSwKKwl7MHgyMiwweDZhN2YsMHgwMDAwLFNJU19SSV85NjB4NjAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDU0LC0xfSwKKwl7MHgxYSwweDBlM2IsMHgwMDAwLFNJU19SSV8xMjgweDg1NCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDU1LCA4fSwgLyogMTI4MHg4NTQgKi8KKwl7MHgxYiwweDBlN2QsMHgwMDAwLFNJU19SSV8xMjgweDg1NCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDU1LCA4fSwKKwl7MHgxYywweDBlZmYsMHgwMDAwLFNJU19SSV8xMjgweDg1NCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDU1LCA4fSwKIAl7MHhmZiwweDAwMDAsMHgwMDAwLDAsICAgICAgICAgICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLC0xfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19FeHQyU3RydWN0IFNpUzMxMF9SZWZJbmRleFtdPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfRXh0MiBTaVMzMTBfUmVmSW5kZXhbXSA9CiB7Ci0JezB4MDg1ZiwweDBkLDB4MDMsMHgwNSwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDQwfSwgLyogMHgwICovCi0JezB4MDA2NywweDBlLDB4MDQsMHgwNSwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDQwfSwgLyogMHgxICovCi0JezB4MDA2NywweDBmLDB4MDgsMHg0OCwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDQwfSwgLyogMHgyICovCi0JezB4MDA2NywweDEwLDB4MDcsMHg4YiwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDQwfSwgLyogMHgzICovCi0JezB4MDA0NywweDExLDB4MGEsMHgwMCwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDQwfSwgLyogMHg0ICovCi0JezB4MDA0NywweDEyLDB4MGQsMHgwMCwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDQwfSwgLyogMHg1ICovCi0JezB4MDA0NywweDEzLDB4MTMsMHgwMCwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDIwfSwgLyogMHg2ICovCi0JezB4MDEwNywweDE0LDB4MWMsMHgwMCwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDIwfSwgLyogMHg3ICovCi0JezB4Yzg1ZiwweDA1LDB4MDAsMHgwNCwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHg4ICovCi0JezB4YzA2NywweDA2LDB4MDIsMHgwNCwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHg5ICovCi0JezB4YzA2NywweDA3LDB4MDIsMHg0NywweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHhhICovCi0JezB4YzA2NywweDA4LDB4MDMsMHg4YSwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHhiICovCi0JezB4YzA0NywweDA5LDB4MDUsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHhjICovCi0JezB4YzA0NywweDBhLDB4MDksMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHhkICovCi0JezB4YzA0NywweDBiLDB4MGUsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHhlICovCi0JezB4YzA0NywweDBjLDB4MTUsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHhmICovCi0JezB4NDg3ZiwweDA0LDB4MDAsMHgwMCwweDAwLDB4MmYsIDY0MCwgNDAwLCAweDMwfSwgLyogMHgxMCAqLwotCXsweGMwNmYsMHgzYywweDAxLDB4MDYsMHgxMywweDMxLCA3MjAsIDQ4MCwgMHgzMH0sIC8qIDB4MTEgKi8KLQl7MHgwMDZmLDB4M2QsMHgwMywweDA2LDB4MTQsMHgzMiwgNzIwLCA1NzYsIDB4MzB9LCAvKiAweDEyICovCi0JezB4MDA4NywweDE1LDB4MDYsMHgwMCwweDA2LDB4MzcsMTAyNCwgNzY4LCAweDMwfSwgLyogMHgxMyAqLwotCXsweGM4NzcsMHgxNiwweDBiLDB4MDYsMHgwNiwweDM3LDEwMjQsIDc2OCwgMHgyMH0sIC8qIDB4MTQgKi8KLQl7MHhjMDY3LDB4MTcsMHgwZiwweDQ5LDB4MDYsMHgzNywxMDI0LCA3NjgsIDB4MjB9LCAvKiAweDE1ICovCi0JezB4MDA2NywweDE4LDB4MTEsMHgwMCwweDA2LDB4MzcsMTAyNCwgNzY4LCAweDIwfSwgLyogMHgxNiAqLwotCXsweDAwNDcsMHgxOSwweDE2LDB4OGMsMHgwNiwweDM3LDEwMjQsIDc2OCwgMHgyMH0sIC8qIDB4MTcgKi8KLQl7MHgwMTA3LDB4MWEsMHgxYiwweDAwLDB4MDYsMHgzNywxMDI0LCA3NjgsIDB4MTB9LCAvKiAweDE4ICovCi0JezB4MDEwNywweDFiLDB4MWYsMHgwMCwweDA2LDB4MzcsMTAyNCwgNzY4LCAweDEwfSwgLyogMHgxOSAqLwotCXsweDAwODcsMHgxYywweDExLDB4MDAsMHgwNywweDNhLDEyODAsMTAyNCwgMHgzMH0sIC8qIDB4MWEgKi8KLQl7MHgwMTM3LDB4MWQsMHgxOSwweDA3LDB4MDcsMHgzYSwxMjgwLDEwMjQsIDB4MDB9LCAvKiAweDFiICovCi0JezB4MDEwNywweDFlLDB4MWUsMHgwMCwweDA3LDB4M2EsMTI4MCwxMDI0LCAweDAwfSwgLyogMHgxYyAqLwotCXsweDAyMDcsMHgxZiwweDIwLDB4MDAsMHgwNywweDNhLDEyODAsMTAyNCwgMHgwMH0sIC8qIDB4MWQgKi8KLQl7MHgwMjI3LDB4MjAsMHgyMSwweDA5LDB4MDksMHgzYywxNjAwLDEyMDAsIDB4MDB9LCAvKiAweDFlICovCi0JezB4MDQwNywweDIxLDB4MjIsMHgwMCwweDA5LDB4M2MsMTYwMCwxMjAwLCAweDAwfSwgLyogMHgxZiAqLwotCXsweDA0MDcsMHgyMiwweDIzLDB4MDAsMHgwOSwweDNjLDE2MDAsMTIwMCwgMHgwMH0sIC8qIDB4MjAgKi8KLQl7MHgwNDA3LDB4MjMsMHgyNSwweDAwLDB4MDksMHgzYywxNjAwLDEyMDAsIDB4MDB9LCAvKiAweDIxICovCi0JezB4MDAwNywweDI0LDB4MjYsMHgwMCwweDA5LDB4M2MsMTYwMCwxMjAwLCAweDAwfSwgLyogMHgyMiAqLwotCXsweDAwMDcsMHgyNSwweDJjLDB4MDAsMHgwOSwweDNjLDE2MDAsMTIwMCwgMHgwMH0sIC8qIDB4MjMgKi8KLQl7MHgwMDA3LDB4MjYsMHgzNCwweDAwLDB4MDksMHgzYywxNjAwLDEyMDAsIDB4MDB9LCAvKiAweDI0ICovCi0JezB4NDA3ZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsIDMyMCwgMjAwLCAweDMwfSwgLyogMHgyNSAqLwotCXsweGMwN2YsMHgwMSwweDAwLDB4MDQsMHgwNCwweDUwLCAzMjAsIDI0MCwgMHgzMH0sIC8qIDB4MjYgKi8KLQl7MHgwMDdmLDB4MDIsMHgwNCwweDA1LDB4MDUsMHg1MSwgNDAwLCAzMDAsIDB4MzB9LCAvKiAweDI3ICovCi0JezB4YzA3NywweDAzLDB4MGIsMHgwNiwweDA2LDB4NTIsIDUxMiwgMzg0LCAweDMwfSwgLyogMHgyOCAqLwotCXsweDgwMDcsMHgyNywweDI3LDB4MDAsMHgwMCwweDY4LDE5MjAsMTQ0MCwgMHgwMH0sIC8qIDB4MjkgKi8KLQl7MHg0MDA3LDB4MjgsMHgyOSwweDAwLDB4MDAsMHg2OCwxOTIwLDE0NDAsIDB4MDB9LCAvKiAweDJhICovCi0JezB4NDAwNywweDI5LDB4MmUsMHgwMCwweDAwLDB4NjgsMTkyMCwxNDQwLCAweDAwfSwgLyogMHgyYiAqLwotCXsweDQwMDcsMHgyYSwweDMwLDB4MDAsMHgwMCwweDY4LDE5MjAsMTQ0MCwgMHgwMH0sIC8qIDB4MmMgKi8KLQl7MHg0MDA3LDB4MmIsMHgzNSwweDAwLDB4MDAsMHg2OCwxOTIwLDE0NDAsIDB4MDB9LCAvKiAweDJkICovCi0JezB4NDAwNSwweDJjLDB4MzksMHgwMCwweDAwLDB4NjgsMTkyMCwxNDQwLCAweDAwfSwgLyogMHgyZSAqLwotCXsweDQwMDcsMHgyZCwweDJiLDB4MDAsMHgwMCwweDZjLDIwNDgsMTUzNiwgMHgwMH0sIC8qIDB4MmYgKi8KLQl7MHg0MDA3LDB4MmUsMHgzMSwweDAwLDB4MDAsMHg2YywyMDQ4LDE1MzYsIDB4MDB9LCAvKiAweDMwICovCi0JezB4NDAwNywweDJmLDB4MzMsMHgwMCwweDAwLDB4NmMsMjA0OCwxNTM2LCAweDAwfSwgLyogMHgzMSAqLwotCXsweDQwMDcsMHgzMCwweDM3LDB4MDAsMHgwMCwweDZjLDIwNDgsMTUzNiwgMHgwMH0sIC8qIDB4MzIgKi8KLQl7MHg0MDA1LDB4MzEsMHgzOCwweDAwLDB4MDAsMHg2YywyMDQ4LDE1MzYsIDB4MDB9LCAvKiAweDMzICovCi0JezB4MDA3NywweDMyLDB4NDAsMHgwOCwweDE4LDB4NzAsIDgwMCwgNDgwLCAweDMwfSwgLyogMHgzNCAqLwotCXsweDAwNDcsMHgzMywweDA3LDB4MDgsMHgxOCwweDcwLCA4MDAsIDQ4MCwgMHgzMH0sIC8qIDB4MzUgKi8KLQl7MHgwMDQ3LDB4MzQsMHgwYSwweDA4LDB4MTgsMHg3MCwgODAwLCA0ODAsIDB4MzB9LCAvKiAweDM2ICovCi0JezB4MDA3NywweDM1LDB4MGIsMHgwOSwweDE5LDB4NzEsMTAyNCwgNTc2LCAweDMwfSwgLyogMHgzNyAqLwotCXsweDAwNDcsMHgzNiwweDExLDB4MDksMHgxOSwweDcxLDEwMjQsIDU3NiwgMHgzMH0sIC8qIDB4MzggKi8KLQl7MHgwMDQ3LDB4MzcsMHgxNiwweDA5LDB4MTksMHg3MSwxMDI0LCA1NzYsIDB4MzB9LCAvKiAweDM5ICovCi0JezB4MTEzNywweDM4LDB4MTksMHgwYSwweDBjLDB4NzUsMTI4MCwgNzIwLCAweDMwfSwgLyogMHgzYSAqLwotCXsweDExMDcsMHgzOSwweDFlLDB4MGEsMHgwYywweDc1LDEyODAsIDcyMCwgMHgzMH0sIC8qIDB4M2IgKi8KLQl7MHgxMzA3LDB4M2EsMHgyMCwweDBhLDB4MGMsMHg3NSwxMjgwLCA3MjAsIDB4MzB9LCAvKiAweDNjICovCi0JezB4MDEyNywweDNiLDB4MTksMHgwOCwweDBhLDB4N2MsMTI4MCwgOTYwLCAweDMwfSwgLyogMHgzZCAqLwotCXsweDAyMjcsMHg0YywweDU5LDB4MDgsMHgwYSwweDdjLDEyODAsIDk2MCwgMHgyMH0sIC8qIDB4M2UgKi8KLQl7MHhjMDdmLDB4NGUsMHgwMCwweDA2LDB4MDQsMHg1YSwgMzIwLCAyNDAsIDB4MzB9LCAvKiAweDNmICovICAgIC8qIEZTVE4gMzIweDI0MCAqLwotICAgICAgICB7MHgwMDc3LDB4NDIsMHg1YiwweDA4LDB4MTEsMHgyMywxMjgwLCA3NjgsIDB4MzB9LCAvKiAweDQwICovICAgIC8qIDB4NWIgd2FzIDB4MTIgKi8KLQl7MHgwMTI3LDB4NDMsMHg0ZCwweDA4LDB4MGIsMHgyNiwxNDAwLDEwNTAsIDB4MzB9LCAvKiAweDQxICovCi0JezB4MDIwNywweDRiLDB4NWEsMHgwOCwweDBiLDB4MjYsMTQwMCwxMDUwLCAweDMwfSwgLyogMHg0MiAxNDAweDEwNTAtNzVIeiAqLwotCXsweDAxMjcsMHg1NCwweDZkLDB4MDAsMHgxYSwweDI5LDExNTIsIDg2NCwgMHgzMH0sIC8qIDB4NDMgMTE1Mng4NjQtNjBIeiAgKi8KLQl7MHgwMTI3LDB4NDQsMHgxOSwweDAwLDB4MWEsMHgyOSwxMTUyLCA4NjQsIDB4MzB9LCAvKiAweDQ0IDExNTJ4ODY0LTc1SHogICovCi0JezB4MDEyNywweDRhLDB4MWUsMHgwMCwweDFhLDB4MjksMTE1MiwgODY0LCAweDMwfSwgLyogMHg0NSAxMTUyeDg2NC04NUh6ICAqLwotCXsweDAwODcsMHg0NSwweDU3LDB4MDAsMHgxNiwweDM5LCA4NDgsIDQ4MCwgMHgzMH0sIC8qIDB4NDYgODQ4eDQ4MC0zOEh6aSAgKi8KLQl7MHhjMDY3LDB4NDYsMHg1NSwweDBiLDB4MTYsMHgzOSwgODQ4LCA0ODAsIDB4MzB9LCAvKiAweDQ3IDg0OHg0ODAtNjBIeiAgICovCi0JezB4MDA4NywweDQ3LDB4NTcsMHgwMCwweDE3LDB4M2YsIDg1NiwgNDgwLCAweDMwfSwgLyogMHg0OCA4NTZ4NDgwLTM4SHppICAqLwotCXsweGMwNjcsMHg0OCwweDU3LDB4MDAsMHgxNywweDNmLCA4NTYsIDQ4MCwgMHgzMH0sIC8qIDB4NDkgODU2eDQ4MC02MEh6ICAgKi8KLQl7MHgwMDY3LDB4NDksMHg1OCwweDBjLDB4MWIsMHg0OCwxMzYwLCA3NjgsIDB4MzB9LCAvKiAweDRhIDEzNjB4NzY4LTYwSHogICovCi0JezB4MDA2ZiwweDRkLDB4MDMsMHgwNiwweDE1LDB4NWYsIDc2OCwgNTc2LCAweDMwfSwgLyogMHg0YiA3Njh4NTc2LTU2SHogICAqLwotCXsweDAwNjcsMHg0ZiwweDVjLDB4MDgsMHgwZCwweDE0LDEyODAsIDgwMCwgMHgzMH0sIC8qIDB4NGMgMTI4MHg4MDAtNjBIeiAgKi8KLQl7MHgwMDY3LDB4NTAsMHg1ZCwweDBjLDB4MGUsMHgxNywxNjgwLDEwNTAsIDB4MzB9LCAvKiAweDRkIDE2ODB4MTA1MC02MEh6ICovCi0JezB4MDA4NywweDUxLDB4NjksMHgwMCwweDAwLDB4MmMsMTkyMCwxMDgwLCAweDMwfSwgLyogMHg0ZSAxOTIweDEwODAgNjBIemkgKi8KLQl7MHgwMDY3LDB4NTIsMHg2YSwweDAwLDB4MWMsMHgxZCwgOTYwLCA1NDAsIDB4MzB9LCAvKiAweDRmIDk2MHg1NDAgNjBIeiAqLwotCXsweDAwNzcsMHg1MywweDZiLDB4MGIsMHgxZCwweDIwLCA5NjAsIDYwMCwgMHgzMH0sIC8qIDB4NTAgOTYweDYwMCA2MEh6ICovCi0JezB4ZmZmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsICAgMCwgICAwLCAgICAwfQorCXsweDA4NWYsMHgwZCwweDAzLDB4MDUsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MCAqLworCXsweDAwNjcsMHgwZSwweDA0LDB4MDUsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MSAqLworCXsweDAwNjcsMHgwZiwweDA4LDB4NDgsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MiAqLworCXsweDAwNjcsMHgxMCwweDA3LDB4OGIsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MyAqLworCXsweDAwNDcsMHgxMSwweDBhLDB4MDAsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NCAqLworCXsweDAwNDcsMHgxMiwweDBkLDB4MDAsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NSAqLworCXsweDAwNDcsMHgxMywweDEzLDB4MDAsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NiAqLworCXsweDAxMDcsMHgxNCwweDFjLDB4MDAsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NyAqLworCXsweGM4NWYsMHgwNSwweDAwLDB4MDQsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4OCAqLworCXsweGMwNjcsMHgwNiwweDAyLDB4MDQsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4OSAqLworCXsweGMwNjcsMHgwNywweDAyLDB4NDcsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4YSAqLworCXsweGMwNjcsMHgwOCwweDAzLDB4OGEsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4YiAqLworCXsweGMwNDcsMHgwOSwweDA1LDB4MDAsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4YyAqLworCXsweGMwNDcsMHgwYSwweDA5LDB4MDAsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4ZCAqLworCXsweGMwNDcsMHgwYiwweDBlLDB4MDAsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4ZSAqLworCXsweGMwNDcsMHgwYywweDE1LDB4MDAsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4ZiAqLworCXsweDQ4N2YsMHgwNCwweDAwLDB4MDAsMHgwMCwweDJmLCA2NDAsIDQwMCwgMHgzMCwgMHg1NSwgMHg2ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MTAgKi8KKwl7MHhjMDZmLDB4M2MsMHgwMSwweDA2LDB4MTMsMHgzMSwgNzIwLCA0ODAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDExICovCisJezB4MDA2ZiwweDNkLDB4NmYsMHgwNiwweDE0LDB4MzIsIDcyMCwgNTc2LCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgxMiAoNmYgd2FzIDAzKSAqLworCXsweDAwODcsMHgxNSwweDA2LDB4MDAsMHgwNiwweDM3LDEwMjQsIDc2OCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MTMgKi8KKwl7MHhjODc3LDB4MTYsMHgwYiwweDA2LDB4MDYsMHgzNywxMDI0LCA3NjgsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDE0ICovCisJezB4YzA2NywweDE3LDB4MGYsMHg0OSwweDA2LDB4MzcsMTAyNCwgNzY4LCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgxNSAqLworCXsweDAwNjcsMHgxOCwweDExLDB4MDAsMHgwNiwweDM3LDEwMjQsIDc2OCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MTYgKi8KKwl7MHgwMDQ3LDB4MTksMHgxNiwweDhjLDB4MDYsMHgzNywxMDI0LCA3NjgsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDE3ICovCisJezB4MDEwNywweDFhLDB4MWIsMHgwMCwweDA2LDB4MzcsMTAyNCwgNzY4LCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgxOCAqLworCXsweDAxMDcsMHgxYiwweDFmLDB4MDAsMHgwNiwweDM3LDEwMjQsIDc2OCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MTkgKi8KKwl7MHgwMDg3LDB4MWMsMHgxMSwweDAwLDB4MDcsMHgzYSwxMjgwLDEwMjQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDFhICovCisJezB4MDEzNywweDFkLDB4MTksMHgwNywweDA3LDB4M2EsMTI4MCwxMDI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgxYiAqLworCXsweDAxMDcsMHgxZSwweDFlLDB4MDAsMHgwNywweDNhLDEyODAsMTAyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MWMgKi8KKwl7MHgwMjA3LDB4MWYsMHgyMCwweDAwLDB4MDcsMHgzYSwxMjgwLDEwMjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDFkICovCisJezB4MDIyNywweDIwLDB4MjEsMHgwOSwweDA5LDB4M2MsMTYwMCwxMjAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgxZSAqLworCXsweDA0MDcsMHgyMSwweDIyLDB4MDAsMHgwOSwweDNjLDE2MDAsMTIwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MWYgKi8KKwl7MHgwNDA3LDB4MjIsMHgyMywweDAwLDB4MDksMHgzYywxNjAwLDEyMDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDIwICovCisJezB4MDQwNywweDIzLDB4MjUsMHgwMCwweDA5LDB4M2MsMTYwMCwxMjAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgyMSAqLworCXsweDAwMDcsMHgyNCwweDI2LDB4MDAsMHgwOSwweDNjLDE2MDAsMTIwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MjIgKi8KKwl7MHgwMDA3LDB4MjUsMHgyYywweDAwLDB4MDksMHgzYywxNjAwLDEyMDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDIzICovCisJezB4MDAwNywweDI2LDB4MzQsMHgwMCwweDA5LDB4M2MsMTYwMCwxMjAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgyNCAqLworCXsweDQwN2YsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLCAzMjAsIDIwMCwgMHgzMCwgMHg1NiwgMHg0ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MjUgKi8KKwl7MHhjMDdmLDB4MDEsMHgwMCwweDA0LDB4MDQsMHg1MCwgMzIwLCAyNDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDI2ICovCisJezB4MDA3ZiwweDAyLDB4MDQsMHgwNSwweDA1LDB4NTEsIDQwMCwgMzAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgyNyAqLworCXsweGMwNzcsMHgwMywweDBiLDB4MDYsMHgwNiwweDUyLCA1MTIsIDM4NCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MjggKi8KKwl7MHg4MDA3LDB4MjcsMHgyNywweDAwLDB4MDAsMHg2OCwxOTIwLDE0NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDI5ICovCisJezB4NDAwNywweDI4LDB4MjksMHgwMCwweDAwLDB4NjgsMTkyMCwxNDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgyYSAqLworCXsweDQwMDcsMHgyOSwweDJlLDB4MDAsMHgwMCwweDY4LDE5MjAsMTQ0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MmIgKi8KKwl7MHg0MDA3LDB4MmEsMHgzMCwweDAwLDB4MDAsMHg2OCwxOTIwLDE0NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDJjICovCisJezB4NDAwNywweDJiLDB4MzUsMHgwMCwweDAwLDB4NjgsMTkyMCwxNDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgyZCAqLworCXsweDQwMDUsMHgyYywweDM5LDB4MDAsMHgwMCwweDY4LDE5MjAsMTQ0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MmUgKi8KKwl7MHg0MDA3LDB4MmQsMHgyYiwweDAwLDB4MDAsMHg2YywyMDQ4LDE1MzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDJmICovCisJezB4NDAwNywweDJlLDB4MzEsMHgwMCwweDAwLDB4NmMsMjA0OCwxNTM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgzMCAqLworCXsweDQwMDcsMHgyZiwweDMzLDB4MDAsMHgwMCwweDZjLDIwNDgsMTUzNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MzEgKi8KKwl7MHg0MDA3LDB4MzAsMHgzNywweDAwLDB4MDAsMHg2YywyMDQ4LDE1MzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDMyICovCisJezB4NDAwNSwweDMxLDB4MzgsMHgwMCwweDAwLDB4NmMsMjA0OCwxNTM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgzMyAqLworCXsweDIwNzcsMHgzMiwweDQwLDB4MDgsMHgxOCwweDcwLCA4MDAsIDQ4MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgzMiwgMHg0MCwgMHg1ZSwgMHg3M30sIC8qIDB4MzQgKi8KKwl7MHgyMDQ3LDB4MzMsMHgwNywweDA4LDB4MTgsMHg3MCwgODAwLCA0ODAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MDcsIDB4ZmYsIDB4ZmZ9LCAvKiAweDM1ICovCisJezB4MjA0NywweDM0LDB4MGEsMHgwOCwweDE4LDB4NzAsIDgwMCwgNDgwLCAweDMwLCAweDAwLCAweDAwLCAweDM0LCAweDBhLCAweGZmLCAweGZmfSwgLyogMHgzNiAqLworCXsweDIwNzcsMHgzNSwweDBiLDB4MDksMHgxOSwweDcxLDEwMjQsIDU3NiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgzNSwgMHgwYiwgMHg1ZiwgMHg3NH0sIC8qIDB4MzcgKi8KKwl7MHgyMDQ3LDB4MzYsMHgxMSwweDA5LDB4MTksMHg3MSwxMDI0LCA1NzYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MzYsIDB4MTEsIDB4ZmYsIDB4ZmZ9LCAvKiAweDM4ICovCisJezB4MjA0NywweDM3LDB4MTYsMHgwOSwweDE5LDB4NzEsMTAyNCwgNTc2LCAweDMwLCAweDAwLCAweDAwLCAweDM3LCAweDE2LCAweGZmLCAweGZmfSwgLyogMHgzOSAqLworCXsweDMxMzcsMHgzOCwweDE5LDB4MGEsMHgwYywweDc1LDEyODAsIDcyMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgzOCwgMHgxOSwgMHg2MCwgMHg3NX0sIC8qIDB4M2EgKi8KKwl7MHgzMTA3LDB4MzksMHgxZSwweDBhLDB4MGMsMHg3NSwxMjgwLCA3MjAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MzksIDB4MWUsIDB4ZmYsIDB4ZmZ9LCAvKiAweDNiICovCisJezB4MzMwNywweDNhLDB4MjAsMHgwYSwweDBjLDB4NzUsMTI4MCwgNzIwLCAweDMwLCAweDAwLCAweDAwLCAweDNhLCAweDIwLCAweGZmLCAweGZmfSwgLyogMHgzYyAqLworCXsweDAxMjcsMHgzYiwweDE5LDB4MDgsMHgwYSwweDdjLDEyODAsIDk2MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4M2QgKi8KKwl7MHgwMjI3LDB4NGMsMHg1OSwweDA4LDB4MGEsMHg3YywxMjgwLCA5NjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDNlICovCisJezB4YzA3ZiwweDRlLDB4MDAsMHgwNiwweDA0LDB4NWEsIDMyMCwgMjQwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgzZiAqLyAgICAvKiBGU1ROIDMyMHgyNDAgKi8KKwl7MHgyMDc3LDB4NDIsMHg1YiwweDA4LDB4MTEsMHgyMywxMjgwLCA3NjgsIDB4MzAsIDB4MDAsIDB4MDAsIDB4NTgsIDB4MTksIDB4NDIsIDB4NWJ9LCAvKiAweDQwICovICAgIC8qIDB4NWIgd2FzIDB4MTIgKi8KKwl7MHgyMDc3LDB4NDIsMHg1YiwweDA4LDB4MTEsMHgyMywxMjgwLCA3NjgsIDB4MzAsIDB4MDAsIDB4MDAsIDB4NTksIDB4MWUsIDB4ZmYsIDB4ZmZ9LCAvKiAweDQxICovCisJezB4MjA3NywweDQyLDB4NWIsMHgwOCwweDExLDB4MjMsMTI4MCwgNzY4LCAweDMwLCAweDAwLCAweDAwLCAweDVhLCAweDIwLCAweGZmLCAweGZmfSwgLyogMHg0MiAqLworCXsweDAxMjcsMHg0MywweDRkLDB4MDgsMHgwYiwweDI2LDE0MDAsMTA1MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NDMgKi8KKwl7MHgwMjA3LDB4NGIsMHg1YSwweDA4LDB4MGIsMHgyNiwxNDAwLDEwNTAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDQ0IDE0MDB4MTA1MC03NUh6ICovCisJezB4MDEyNywweDU0LDB4NmQsMHgwMCwweDFhLDB4MjksMTE1MiwgODY0LCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHg0NSAxMTUyeDg2NC02MEh6ICAqLworCXsweDAxMjcsMHg0NCwweDE5LDB4MDAsMHgxYSwweDI5LDExNTIsIDg2NCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NDYgMTE1Mng4NjQtNzVIeiAgKi8KKwl7MHgwMTI3LDB4NGEsMHgxZSwweDAwLDB4MWEsMHgyOSwxMTUyLCA4NjQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDQ3IDExNTJ4ODY0LTg1SHogICovCisJezB4MDA4NywweDQ1LDB4NTcsMHgwMCwweDE2LDB4MzksIDg0OCwgNDgwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHg0OCA4NDh4NDgwLTM4SHppICAqLworCXsweGMwNjcsMHg0NiwweDU1LDB4MGIsMHgxNiwweDM5LCA4NDgsIDQ4MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NDkgODQ4eDQ4MC02MEh6ICAgKi8KKwl7MHgwMDg3LDB4NDcsMHg1NywweDAwLDB4MTcsMHgzZiwgODU2LCA0ODAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDRhIDg1Nng0ODAtMzhIemkgICovCisJezB4YzA2NywweDQ4LDB4NTcsMHgwMCwweDE3LDB4M2YsIDg1NiwgNDgwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHg0YiA4NTZ4NDgwLTYwSHogICAqLworCXsweDAwNjcsMHg0OSwweDU4LDB4MGMsMHgxYiwweDQ4LDEzNjAsIDc2OCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NGMgMTM2MHg3NjgtNjBIeiAgKi8KKwl7MHgwMDZmLDB4NGQsMHg3MSwweDA2LDB4MTUsMHg1ZiwgNzY4LCA1NzYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDRkIDc2OHg1NzYtNTZIeiAgICovCisJezB4MjA2NywweDRmLDB4NWMsMHgwOCwweDBkLDB4MTQsMTI4MCwgODAwLCAweDMwLCAweDAwLCAweDAwLCAweDViLCAweDE5LCAweDRmLCAweDVjfSwgLyogMHg0ZSAxMjgweDgwMC02MEh6ICAqLworCXsweDIwNjcsMHg0ZiwweDVjLDB4MDgsMHgwZCwweDE0LDEyODAsIDgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHg1YywgMHgxZSwgMHhmZiwgMHhmZn0sIC8qIDB4NGYgMTI4MHg4MDAtNzVIeiAgKi8KKwl7MHgyMDY3LDB4NGYsMHg1YywweDA4LDB4MGQsMHgxNCwxMjgwLCA4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4NWQsIDB4MjAsIDB4ZmYsIDB4ZmZ9LCAvKiAweDUwIDEyODB4ODAwLTg1SHogICovCisJezB4MDA2NywweDUwLDB4NWQsMHgwYywweDBlLDB4MTcsMTY4MCwxMDUwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHg1MSAxNjgweDEwNTAtNjBIeiAqLworCXsweDAwODcsMHg1MSwweDY5LDB4MDAsMHgwMCwweDJjLDE5MjAsMTA4MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NTIgMTkyMHgxMDgwIDYwSHppICovCisJezB4MDA2NywweDUyLDB4NmEsMHgwMCwweDFjLDB4MWQsIDk2MCwgNTQwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHg1MyA5NjB4NTQwIDYwSHogKi8KKwl7MHgwMDc3LDB4NTMsMHg2YiwweDBiLDB4MWQsMHgyMCwgOTYwLCA2MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDU0IDk2MHg2MDAgNjBIeiAqLworCXsweDIwNjcsMHg2MSwweDc2LDB4MGQsMHgyMiwweDFhLDEyODAsIDg1NCwgMHgzMCwgMHgwMCwgMHgwMCwgMHg2MiwgMHgxOSwgMHg2MSwgMHg3Nn0sIC8qIDB4NTUgMTI4MHg4NTQtNjBIeiAgKi8KKwl7MHgyMDY3LDB4NjEsMHg3NiwweDBkLDB4MjIsMHgxYSwxMjgwLCA4NTQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4NjMsIDB4MWUsIDB4ZmYsIDB4ZmZ9LCAvKiAweDU2IDEyODB4ODU0LTc1SHogICovCisJezB4MjA2NywweDYxLDB4NzYsMHgwZCwweDIyLDB4MWEsMTI4MCwgODU0LCAweDMwLCAweDAwLCAweDAwLCAweDY0LCAweDIwLCAweGZmLCAweGZmfSwgLyogMHg1NyAxMjgweDg1NC04NUh6ICAqLworCXsweGZmZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAgIDAsICAgMCwgICAgMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0KIH07CiAKLSNpZmRlZiBMSU5VWF9YRjg2Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHsKLQlVQ0hBUiAgRXh0X01vZGVJRDsgICAgIC8qIE1vZGVJRCBpbiBuZXcgUk9NICovCi0JVUNIQVIgIEV4dF9NeU1vZGVJRDsgICAvKiBjb3JyZXNwb25kaW5nIE1vZGVJRCBpbiBteSB0YWJsZXMgKDAgPSBpZGVudGljYWwpICovCi0JVVNIT1JUIEV4dF9WRVNBSUQ7ICAgICAvKiBjb3JyZXNwb25kaW5nIFZFU0EgSUQgaW4gbmV3IFJPTSAqLwotfSBTaVNfRU1vZGVJRFRhYmxlNjYxW10gPSB7Ci0gICAgICAgIHsgMHg2YSwgMHgwMCwgMHgwMTAyIH0sCi0JeyAweDFkLCAweDIwLCAweDAwMDAgfSwKLQl7IDB4MWUsIDB4MjEsIDB4MDAwMCB9LAotCXsgMHgxZiwgMHgyMiwgMHgwMDAwIH0sCi0JeyAweDIwLCAweDI5LCAweDAwMDAgfSwKLQl7IDB4MjEsIDB4MmEsIDB4MDAwMCB9LAotCXsgMHgyMiwgMHgyYiwgMHgwMDAwIH0sCi0JeyAweDIzLCAweDAwLCAweDAxMWMgfSwKLQl7IDB4MjQsIDB4MDAsIDB4MDExZCB9LAotCXsgMHgyNSwgMHgwMCwgMHgwMTFlIH0sCi0JeyAweDI2LCAweDAwLCAweDAxMWYgfSwKLQl7IDB4MjcsIDB4MDAsIDB4MDEyMCB9LAotCXsgMHgyOCwgMHgwMCwgMHgwMTIxIH0sCi0JeyAweDJhLCAweDE0LCAweDAxM2QgfSwKLQl7IDB4MmIsIDB4MTUsIDB4MDEzZSB9LAotCXsgMHgyYywgMHgxNiwgMHgwMTNmIH0sCi0JeyAweDJlLCAweDAwLCAweDAxMDEgfSwKLQl7IDB4MmYsIDB4MDAsIDB4MDEwMCB9LAotCXsgMHgzMCwgMHgwMCwgMHgwMTAzIH0sCi0JeyAweDM3LCAweDAwLCAweDAxMDQgfSwKLQl7IDB4MzgsIDB4MDAsIDB4MDEwNSB9LAotCXsgMHgzYSwgMHgwMCwgMHgwMTA3IH0sCi0JeyAweDNjLCAweDAwLCAweDAxMjUgfSwKLQl7IDB4M2QsIDB4MDAsIDB4MDEyNiB9LAotCXsgMHg0MCwgMHgwMCwgMHgwMTBkIH0sCi0JeyAweDQxLCAweDAwLCAweDAxMGUgfSwKLQl7IDB4NDMsIDB4MDAsIDB4MDExMCB9LAotCXsgMHg0NCwgMHgwMCwgMHgwMTExIH0sCi0JeyAweDQ2LCAweDAwLCAweDAxMTMgfSwKLQl7IDB4NDcsIDB4MDAsIDB4MDExNCB9LAotCXsgMHg0OSwgMHgwMCwgMHgwMTE2IH0sCi0JeyAweDRhLCAweDAwLCAweDAxMTcgfSwKLQl7IDB4NGMsIDB4MDAsIDB4MDExOSB9LAotCXsgMHg0ZCwgMHgwMCwgMHgwMTFhIH0sCi0JeyAweDUwLCAweDAwLCAweDAxMjcgfSwKLQl7IDB4NTEsIDB4MDAsIDB4MDEyOCB9LAotCXsgMHg1MiwgMHgwMCwgMHgwMTI5IH0sCi0JeyAweDU2LCAweDAwLCAweDAxMmEgfSwKLQl7IDB4NTcsIDB4MDAsIDB4MDEyYiB9LAotCXsgMHg1OCwgMHgwMCwgMHgwMTJjIH0sCi0JeyAweDU5LCAweDAwLCAweDAxMmQgfSwKLQl7IDB4NWEsIDB4MTcsIDB4MDEyZSB9LAotCXsgMHg1YiwgMHgxOCwgMHgwMTJmIH0sCi0JeyAweDVjLCAweDE5LCAweDAxMzAgfSwKLQl7IDB4NWQsIDB4MDAsIDB4MDEzMSB9LAotCXsgMHg2MiwgMHgwMCwgMHgwMTEyIH0sCi0JeyAweDYzLCAweDAwLCAweDAxMTUgfSwKLQl7IDB4NjQsIDB4MDAsIDB4MDExOCB9LAotCXsgMHg2NSwgMHgwMCwgMHgwMTFiIH0sCi0JeyAweDY2LCAweDAwLCAweDAxMzIgfSwKLQl7IDB4NzUsIDB4MDAsIDB4MDEzYSB9LAotCXsgMHg3OCwgMHgwMCwgMHgwMTNiIH0sCi0JeyAweDc5LCAweDAwLCAweDAxM2MgfSwKLQl7IDB4N2IsIDB4N2MsIDB4MDEzNiB9LAotCXsgMHg3YywgMHg3ZCwgMHgwMTM3IH0sCi0JeyAweDdkLCAweDdlLCAweDAxMzggfSwKLQl7IDB4ZmYsIDB4ZmYsIDB4ZmZmZiB9Ci19OwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBTaVNfQ1JUMVRhYmxlU3RydWN0IFNpUzMxMF9DUlQxVGFibGVbXT0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0NSVDFUYWJsZSBTaVMzMTBfQ1JUMVRhYmxlW10gPQogewogIHt7MHgyZCwweDI3LDB4MjgsMHg5MCwweDJjLDB4ODAsMHhiZiwweDFmLAogICAgMHg5YywweDhlLDB4OGYsMHg5NiwweGI5LDB4MzAsMHgwMCwweDAwLAotICAgMHgwMH19LCAvKiAweDAgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MCAqLwogIHt7MHgyZCwweDI3LDB4MjgsMHg5MCwweDJjLDB4ODAsMHgwYiwweDNlLAogICAgMHhlOSwweDhiLDB4ZGYsMHhlNywweDA0LDB4MDAsMHgwMCwweDAwLAotICAgMHgwMH19LCAvKiAweDEgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MSAqLwogIHt7MHgzZCwweDMxLDB4MzEsMHg4MSwweDM3LDB4MWYsMHg3MiwweGYwLAogICAgMHg1OCwweDhjLDB4NTcsMHg1NywweDczLDB4MjAsMHgwMCwweDA1LAotICAgMHgwMX19LCAvKiAweDIgKi8KKyAgIDB4MDF9fSwgIC8qIDB4MiAqLwogIHt7MHg0ZiwweDNmLDB4M2YsMHg5MywweDQ1LDB4MGQsMHgyNCwweGY1LAogICAgMHgwMiwweDg4LDB4ZmYsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19LCAvKiAweDMgKi8KKyAgIDB4MDF9fSwgIC8qIDB4MyAqLwogIHt7MHg1ZiwweDRmLDB4NTAsMHg4MiwweDU1LDB4ODEsMHhiZiwweDFmLAogICAgMHg5YywweDhlLDB4OGYsMHg5NiwweGI5LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LCAvKiAweDQgKi8KLSNpZiAwCi0ge3sweDVmLDB4NGYsMHg1MCwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhkZiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDUsCi0gICAweDAwfX0sIC8qIDB4NSAqLwotI2VuZGlmCi0ge3sweDVmLDB4NGYsMHg0ZiwweDgzLDB4NTUsMHg4MSwweDBiLDB4M2UsICAgIC8qIDB4MDUgLSBjb3JyZWN0ZWQgNjQweDQ4MC02MCAqLworICAgMHgwMH19LCAgLyogMHg0ICovCisge3sweDVmLDB4NGYsMHg0ZiwweDgzLDB4NTUsMHg4MSwweDBiLDB4M2UsICAgIC8qIGNvcnJlY3RlZCA2NDB4NDgwLTYwICovCiAgICAweGU5LDB4OGIsMHhkZiwweGU4LDB4MGMsMHgwMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0jaWYgMCAgIAotIHt7MHg2MywweDRmLDB4NTAsMHg4NiwweDU2LDB4OWIsMHgwNiwweDNlLAotICAgMHhlOCwweDhiLDB4ZGYsMHhlNywweGZmLDB4MTAsMHgwMCwweDAxLAotICAgMHgwMH19LCAvKiAweDYgKi8KLSNlbmRpZgotIHt7MHg2MywweDRmLDB4NGYsMHg4NywweDU2LDB4OWIsMHgwNiwweDNlLCAgICAvKiAweDA2IC0gY29ycmVjdGVkIDY0MHg0ODAtNzIgKi8KKyAgIDB4MDB9fSwgIC8qIDB4NSAqLworIHt7MHg2MywweDRmLDB4NGYsMHg4NywweDU2LDB4OWIsMHgwNiwweDNlLCAgICAvKiBjb3JyZWN0ZWQgNjQweDQ4MC03MiAqLwogICAgMHhlOCwweDhhLDB4ZGYsMHhlNywweDA3LDB4MDAsMHgwMCwweDAxLAotICAgMHgwMH19LAorICAgMHgwMH19LCAgLyogMHg2ICovCiAge3sweDY0LDB4NGYsMHg0ZiwweDg4LDB4NTUsMHg5ZCwweGYyLDB4MWYsCiAgICAweGUwLDB4ODMsMHhkZiwweGRmLDB4ZjMsMHgxMCwweDAwLDB4MDEsCi0gICAweDAwfX0sIC8qIDB4NyAqLworICAgMHgwMH19LCAgLyogMHg3ICovCiAge3sweDYzLDB4NGYsMHg0ZiwweDg3LDB4NWEsMHg4MSwweGZiLDB4MWYsCiAgICAweGUwLDB4ODMsMHhkZiwweGRmLDB4ZmMsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwfX0sIC8qIDB4OCAqLworICAgMHgwMH19LCAgLyogMHg4ICovCiAge3sweDY1LDB4NGYsMHg0ZiwweDg5LDB4NTgsMHg4MCwweGZiLDB4MWYsCiAgICAweGUwLDB4ODMsMHhkZiwweGRmLDB4ZmMsMHgxMCwweDAwLDB4MDUsICAvKiBDb3JyZWN0ZWQgVkJFICovCi0gICAweDYxfX0sIC8qIDB4OSAqLworICAgMHg2MX19LCAgLyogMHg5ICovCiAge3sweDY1LDB4NGYsMHg0ZiwweDg5LDB4NTgsMHg4MCwweDAxLDB4M2UsCiAgICAweGUwLDB4ODMsMHhkZiwweGRmLDB4MDIsMHgwMCwweDAwLDB4MDUsCi0gICAweDYxfX0sIC8qIDB4YSAqLworICAgMHg2MX19LCAgLyogMHhhICovCiAge3sweDY3LDB4NGYsMHg0ZiwweDhiLDB4NTgsMHg4MSwweDBkLDB4M2UsCiAgICAweGUwLDB4ODMsMHhkZiwweGRmLDB4MGUsMHgwMCwweDAwLDB4MDUsICAvKiBDb3JyZWN0ZWQgVkJFICovCi0gICAweDYxfX0sIC8qIDB4YiAqLworICAgMHg2MX19LCAgLyogMHhiICovCiAge3sweDY1LDB4NGYsMHg0ZiwweDg5LDB4NTcsMHg5ZiwweGZiLDB4MWYsCiAgICAweGU2LDB4OGEsMHhkZiwweGRmLDB4ZmMsMHgxMCwweDAwLDB4MDEsICAvKiBDb3JyZWN0ZWQgVkRFLCBWQkUgKi8KLSAgIDB4MDB9fSwgLyogMHhjICovCisgICAweDAwfX0sICAvKiAweGMgKi8KICB7ezB4N2IsMHg2MywweDYzLDB4OWYsMHg2YSwweDkzLDB4NmYsMHhmMCwKICAgIDB4NTgsMHg4YSwweDU3LDB4NTcsMHg3MCwweDIwLDB4MDAsMHgwNSwKLSAgIDB4MDF9fSwgLyogMHhkICovCisgICAweDAxfX0sICAvKiAweGQgKi8KICB7ezB4N2YsMHg2MywweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKICAgIDB4NTgsMHg4YywweDU3LDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwgLyogMHhlICovCisgICAweDAxfX0sICAvKiAweGUgKi8KICB7ezB4N2QsMHg2MywweDYzLDB4ODEsMHg2ZSwweDFkLDB4OTgsMHhmMCwKICAgIDB4N2MsMHg4MiwweDU3LDB4NTcsMHg5OSwweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwgLyogMHhmICovCisgICAweDAxfX0sICAvKiAweGYgKi8KICB7ezB4N2YsMHg2MywweDYzLDB4ODMsMHg2OSwweDEzLDB4NmYsMHhmMCwKICAgIDB4NTgsMHg4YiwweDU3LDB4NTcsMHg3MCwweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwgLyogMHgxMCAqLworICAgMHgwMX19LCAgLyogMHgxMCAqLwogIHt7MHg3ZSwweDYzLDB4NjMsMHg4MiwweDZiLDB4MTMsMHg3NSwweGYwLAogICAgMHg1OCwweDhiLDB4NTcsMHg1NywweDc2LDB4MjAsMHgwMCwweDA2LAotICAgMHgwMX19LCAvKiAweDExICovCisgICAweDAxfX0sICAvKiAweDExICovCiAge3sweDgxLDB4NjMsMHg2MywweDg1LDB4NmQsMHgxOCwweDdhLDB4ZjAsCiAgICAweDU4LDB4OGIsMHg1NywweDU3LDB4N2IsMHgyMCwweDAwLDB4MDYsCi0gICAweDYxfX0sIC8qIDB4MTIgKi8KKyAgIDB4NjF9fSwgIC8qIDB4MTIgKi8KICB7ezB4ODMsMHg2MywweDYzLDB4ODcsMHg2ZSwweDE5LDB4ODEsMHhmMCwKICAgIDB4NTgsMHg4YiwweDU3LDB4NTcsMHg4MiwweDIwLDB4MDAsMHgwNiwKLSAgIDB4NjF9fSwgLyogMHgxMyAqLworICAgMHg2MX19LCAgLyogMHgxMyAqLwogIHt7MHg4NSwweDYzLDB4NjMsMHg4OSwweDZmLDB4MWEsMHg5MSwweGYwLAogICAgMHg1OCwweDhiLDB4NTcsMHg1NywweDkyLDB4MjAsMHgwMCwweDA2LAotICAgMHg2MX19LCAvKiAweDE0ICovCisgICAweDYxfX0sICAvKiAweDE0ICovCiAge3sweDk5LDB4N2YsMHg3ZiwweDlkLDB4ODQsMHgxYSwweDk2LDB4MWYsCiAgICAweDdmLDB4ODMsMHg3ZiwweDdmLDB4OTcsMHgxMCwweDAwLDB4MDIsCi0gICAweDAwfX0sIC8qIDB4MTUgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MTUgKi8KICB7ezB4YTMsMHg3ZiwweDdmLDB4ODcsMHg4NiwweDk3LDB4MjQsMHhmNSwKICAgIDB4MDIsMHg4OCwweGZmLDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwgLyogMHgxNiAqLworICAgMHgwMX19LCAgLyogMHgxNiAqLwogIHt7MHhhMSwweDdmLDB4N2YsMHg4NSwweDg2LDB4OTcsMHgyNCwweGY1LAogICAgMHgwMiwweDg4LDB4ZmYsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAyLAotICAgMHgwMX19LCAvKiAweDE3ICovCisgICAweDAxfX0sICAvKiAweDE3ICovCiAge3sweDlmLDB4N2YsMHg3ZiwweDgzLDB4ODUsMHg5MSwweDFlLDB4ZjUsCiAgICAweDAwLDB4ODMsMHhmZiwweGZmLDB4MWYsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxfX0sIC8qIDB4MTggKi8KKyAgIDB4MDF9fSwgIC8qIDB4MTggKi8KICB7ezB4YTcsMHg3ZiwweDdmLDB4OGIsMHg4OSwweDk1LDB4MjYsMHhmNSwKICAgIDB4MDAsMHg4MywweGZmLDB4ZmYsMHgyNywweDEwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwgLyogMHgxOSAqLworICAgMHgwMX19LCAgLyogMHgxOSAqLwogIHt7MHhhOSwweDdmLDB4N2YsMHg4ZCwweDhjLDB4OWEsMHgyYywweGY1LAogICAgMHgwMCwweDgzLDB4ZmYsMHhmZiwweDJkLDB4MTQsMHgwMCwweDAyLAotICAgMHg2Mn19LCAvKiAweDFhICovCisgICAweDYyfX0sICAvKiAweDFhICovCiAge3sweGFiLDB4N2YsMHg3ZiwweDhmLDB4OGQsMHg5YiwweDM1LDB4ZjUsCiAgICAweDAwLDB4ODMsMHhmZiwweGZmLDB4MzYsMHgxNCwweDAwLDB4MDIsCi0gICAweDYyfX0sIC8qIDB4MWIgKi8KKyAgIDB4NjJ9fSwgIC8qIDB4MWIgKi8KICB7ezB4Y2YsMHg5ZiwweDlmLDB4OTMsMHhiMiwweDAxLDB4MTQsMHhiYSwKICAgIDB4MDAsMHg4MywweGZmLDB4ZmYsMHgxNSwweDAwLDB4MDAsMHgwMywKLSAgIDB4MDB9fSwgLyogMHgxYyAqLworICAgMHgwMH19LCAgLyogMHgxYyAqLwogIHt7MHhjZSwweDlmLDB4OWYsMHg5MiwweGE5LDB4MTcsMHgyOCwweDVhLAogICAgMHgwMCwweDgzLDB4ZmYsMHhmZiwweDI5LDB4MDksMHgwMCwweDA3LAotICAgMHgwMX19LCAvKiAweDFkICovCisgICAweDAxfX0sICAvKiAweDFkICovCiAge3sweGNlLDB4OWYsMHg5ZiwweDkyLDB4YTUsMHgxNywweDI4LDB4NWEsCiAgICAweDAwLDB4ODMsMHhmZiwweGZmLDB4MjksMHgwOSwweDAwLDB4MDcsCi0gICAweDAxfX0sIC8qIDB4MWUgKi8KKyAgIDB4MDF9fSwgIC8qIDB4MWUgKi8KICB7ezB4ZDMsMHg5ZiwweDlmLDB4OTcsMHhhYiwweDFmLDB4MmUsMHg1YSwKICAgIDB4MDAsMHg4MywweGZmLDB4ZmYsMHgyZiwweDA5LDB4MDAsMHgwNywKLSAgIDB4MDF9fSwgLyogMHgxZiAqLworICAgMHgwMX19LCAgLyogMHgxZiAqLwogIHt7MHgwOSwweGM3LDB4YzcsMHg4ZCwweGQzLDB4MGIsMHhlMCwweDEwLAogICAgMHhiMCwweDgzLDB4YWYsMHhhZiwweGUxLDB4MmYsMHgwMSwweDA0LAotICAgMHgwMH19LCAvKiAweDIwICovCisgICAweDAwfX0sICAvKiAweDIwICovCiAge3sweDA5LDB4YzcsMHhjNywweDhkLDB4ZDMsMHgwYiwweGUwLDB4MTAsCiAgICAweGIwLDB4ODMsMHhhZiwweGFmLDB4ZTEsMHgyZiwweDAxLDB4MDQsCi0gICAweDAwfX0sIC8qIDB4MjEgQCA0MDg0ICovCisgICAweDAwfX0sICAvKiAweDIxICovCiAge3sweDA5LDB4YzcsMHhjNywweDhkLDB4ZDMsMHgwYiwweGUwLDB4MTAsCiAgICAweGIwLDB4ODMsMHhhZiwweGFmLDB4ZTEsMHgyZiwweDAxLDB4MDQsCi0gICAweDAwfX0sIC8qIDB4MjIgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MjIgKi8KICB7ezB4MDksMHhjNywweGM3LDB4OGQsMHhkMywweDBiLDB4ZTAsMHgxMCwKICAgIDB4YjAsMHg4MywweGFmLDB4YWYsMHhlMSwweDJmLDB4MDEsMHgwNCwKLSAgIDB4MDB9fSwgLyogMHgyMyAqLworICAgMHgwMH19LCAgLyogMHgyMyAqLwogIHt7MHgwOSwweGM3LDB4YzcsMHg4ZCwweGQzLDB4MGIsMHhlMCwweDEwLAogICAgMHhiMCwweDgzLDB4YWYsMHhhZiwweGUxLDB4MmYsMHgwMSwweDA0LAotICAgMHgwMH19LCAvKiAweDI0ICovCisgICAweDAwfX0sICAvKiAweDI0ICovCiAge3sweDA5LDB4YzcsMHhjNywweDhkLDB4ZDMsMHgwYiwweGUwLDB4MTAsCiAgICAweGIwLDB4ODMsMHhhZiwweGFmLDB4ZTEsMHgyZiwweDAxLDB4MDQsCi0gICAweDAwfX0sIC8qIDB4MjUgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MjUgKi8KICB7ezB4MDksMHhjNywweGM3LDB4OGQsMHhkMywweDBiLDB4ZTAsMHgxMCwKICAgIDB4YjAsMHg4MywweGFmLDB4YWYsMHhlMSwweDJmLDB4MDEsMHgwNCwKLSAgIDB4MDB9fSwgLyogMHgyNiAqLworICAgMHgwMH19LCAgLyogMHgyNiAqLwogIHt7MHg0MCwweGVmLDB4ZWYsMHg4NCwweDAzLDB4MWQsMHhkYSwweDFmLAogICAgMHhhMCwweDgzLDB4OWYsMHg5ZiwweGRiLDB4MWYsMHg0MSwweDAxLAotICAgMHgwMH19LCAvKiAweDI3ICovCisgICAweDAwfX0sICAvKiAweDI3ICovCiAge3sweDQzLDB4ZWYsMHhlZiwweDg3LDB4MDYsMHgwMCwweGQ0LDB4MWYsCiAgICAweGEwLDB4ODMsMHg5ZiwweDlmLDB4ZDUsMHgxZiwweDQxLDB4MDUsCi0gICAweDYzfX0sIC8qIDB4MjggKi8KKyAgIDB4NjN9fSwgIC8qIDB4MjggKi8KICB7ezB4NDUsMHhlZiwweGVmLDB4ODksMHgwNywweDAxLDB4ZDksMHgxZiwKICAgIDB4YTAsMHg4MywweDlmLDB4OWYsMHhkYSwweDFmLDB4NDEsMHgwNSwKLSAgIDB4NjN9fSwgLyogMHgyOSAqLworICAgMHg2M319LCAgLyogMHgyOSAqLwogIHt7MHg0MCwweGVmLDB4ZWYsMHg4NCwweDAzLDB4MWQsMHhkYSwweDFmLAogICAgMHhhMCwweDgzLDB4OWYsMHg5ZiwweGRiLDB4MWYsMHg0MSwweDAxLAotICAgMHgwMH19LCAvKiAweDJhICovCisgICAweDAwfX0sICAvKiAweDJhICovCiAge3sweDQwLDB4ZWYsMHhlZiwweDg0LDB4MDMsMHgxZCwweGRhLDB4MWYsCiAgICAweGEwLDB4ODMsMHg5ZiwweDlmLDB4ZGIsMHgxZiwweDQxLDB4MDEsCi0gICAweDAwfX0sIC8qIDB4MmIgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MmIgKi8KICB7ezB4NDAsMHhlZiwweGVmLDB4ODQsMHgwMywweDFkLDB4ZGEsMHgxZiwKICAgIDB4YTAsMHg4MywweDlmLDB4OWYsMHhkYiwweDFmLDB4NDEsMHgwMSwKLSAgIDB4MDB9fSwgLyogMHgyYyAqLworICAgMHgwMH19LCAgLyogMHgyYyAqLwogIHt7MHg1OSwweGZmLDB4ZmYsMHg5ZCwweDE3LDB4MTMsMHgzMywweGJhLAogICAgMHgwMCwweDgzLDB4ZmYsMHhmZiwweDM0LDB4MGYsMHg0MSwweDA1LAotICAgMHg0NH19LCAvKiAweDJkICovCisgICAweDQ0fX0sICAvKiAweDJkICovCiAge3sweDViLDB4ZmYsMHhmZiwweDlmLDB4MTgsMHgxNCwweDM4LDB4YmEsCiAgICAweDAwLDB4ODMsMHhmZiwweGZmLDB4MzksMHgwZiwweDQxLDB4MDUsCi0gICAweDQ0fX0sIC8qIDB4MmUgKi8KKyAgIDB4NDR9fSwgIC8qIDB4MmUgKi8KICB7ezB4NWIsMHhmZiwweGZmLDB4OWYsMHgxOCwweDE0LDB4M2QsMHhiYSwKICAgIDB4MDAsMHg4MywweGZmLDB4ZmYsMHgzZSwweDBmLDB4NDEsMHgwNSwKLSAgIDB4NDR9fSwgLyogMHgyZiAqLworICAgMHg0NH19LCAgLyogMHgyZiAqLwogIHt7MHg1ZCwweGZmLDB4ZmYsMHg4MSwweDE5LDB4OTUsMHg0MSwweGJhLAogICAgMHgwMCwweDg0LDB4ZmYsMHhmZiwweDQyLDB4MGYsMHg0MSwweDA1LAotICAgMHg0NH19LCAvKiAweDMwICovCisgICAweDQ0fX0sICAvKiAweDMwICovCiAge3sweDU1LDB4ZmYsMHhmZiwweDk5LDB4MGQsMHgwYywweDNlLDB4YmEsCiAgICAweDAwLDB4ODQsMHhmZiwweGZmLDB4M2YsMHgwZiwweDQxLDB4MDUsCi0gICAweDAwfX0sIC8qIDB4MzEgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MzEgKi8KICB7ezB4N2YsMHg2MywweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhiYSwKICAgIDB4MjcsMHg4YiwweGRmLDB4ZGYsMHg3MywweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwgLyogMHgzMiAqLworICAgMHgwMX19LCAgLyogMHgzMiAqLwogIHt7MHg3ZiwweDYzLDB4NjMsMHg4MywweDY5LDB4MTMsMHg2ZiwweGJhLAogICAgMHgyNiwweDg5LDB4ZGYsMHhkZiwweDZmLDB4MDAsMHgwMCwweDA2LAotICAgMHgwMX19LCAvKiAweDMzICovCisgICAweDAxfX0sICAvKiAweDMzICovCiAge3sweDdmLDB4NjMsMHg2MywweDgyLDB4NmIsMHgxMywweDc1LDB4YmEsCiAgICAweDI5LDB4OGMsMHhkZiwweGRmLDB4NzUsMHgwMCwweDAwLDB4MDYsCi0gICAweDAxfX0sIC8qIDB4MzQgKi8KKyAgIDB4MDF9fSwgIC8qIDB4MzQgKi8KICB7ezB4YTMsMHg3ZiwweDdmLDB4ODcsMHg4NiwweDk3LDB4MjQsMHhmMSwKICAgIDB4YWYsMHg4NSwweDNmLDB4M2YsMHgyNSwweDMwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwgLyogMHgzNSAqLworICAgMHgwMX19LCAgLyogMHgzNSAqLwogIHt7MHg5ZiwweDdmLDB4N2YsMHg4MywweDg1LDB4OTEsMHgxZSwweGYxLAogICAgMHhhZCwweDgxLDB4M2YsMHgzZiwweDFmLDB4MzAsMHgwMCwweDAyLAotICAgMHgwMX19LCAvKiAweDM2ICovCisgICAweDAxfX0sICAvKiAweDM2ICovCiAge3sweGE3LDB4N2YsMHg3ZiwweDg4LDB4ODksMHg5NSwweDI2LDB4ZjEsICAgLyogOTUgd2FzIDE1IC0gaWxsZWdhbCBIQkUhICovCiAgICAweGIxLDB4ODUsMHgzZiwweDNmLDB4MjcsMHgzMCwweDAwLDB4MDIsCi0gICAweDAxfX0sIC8qIDB4MzcgKi8KKyAgIDB4MDF9fSwgIC8qIDB4MzcgKi8KICB7ezB4Y2UsMHg5ZiwweDlmLDB4OTIsMHhhOSwweDE3LDB4MjgsMHhjNCwKICAgIDB4N2EsMHg4ZSwweGNmLDB4Y2YsMHgyOSwweDIxLDB4MDAsMHgwNywKLSAgIDB4MDF9fSwgLyogMHgzOCAqLworICAgMHgwMX19LCAgLyogMHgzOCAqLwogIHt7MHhjZSwweDlmLDB4OWYsMHg5MiwweGE1LDB4MTcsMHgyOCwweGQ0LAogICAgMHg3YSwweDhlLDB4Y2YsMHhjZiwweDI5LDB4MjEsMHgwMCwweDA3LAotICAgMHgwMX19LCAvKiAweDM5ICovCisgICAweDAxfX0sICAvKiAweDM5ICovCiAge3sweGQzLDB4OWYsMHg5ZiwweDk3LDB4YWIsMHgxZiwweDJlLDB4ZDQsCiAgICAweDdkLDB4ODEsMHhjZiwweGNmLDB4MmYsMHgyMSwweDAwLDB4MDcsCi0gICAweDAxfX0sIC8qIDB4M2EgKi8KLSNpZiAwICAgCi0ge3sweGRjLDB4OWYsMHg5ZiwweDAwLDB4YWIsMHgxOSwweGU2LDB4ZWYsCS8qIDEyODB4OTYwIC0gaW52YWxpZCAqLwotICAgMHhjMCwweGMzLDB4YmYsMHhiZiwweGU3LDB4MTAsMHgwMCwweDA3LAotICAgMHgwMX19LCAvKiAweDNiICovCi0jZW5kaWYgIAorICAgMHgwMX19LCAgLyogMHgzYSAqLwogIHt7MHhkYywweDlmLDB4OWYsMHg4MCwweGFmLDB4OWQsMHhlNiwweGZmLAkvKiAxMjgweDk2MC02MCAtIGNvcnJlY3RlZCAqLwogICAgMHhjMCwweDgzLDB4YmYsMHhiZiwweGU3LDB4MTAsMHgwMCwweDA3LAotICAgMHgwMX19LCAvKiAweDNiICovIAorICAgMHgwMX19LCAgLyogMHgzYiAqLwogIHt7MHg2YiwweDU5LDB4NTksMHg4ZiwweDVlLDB4OGMsMHgwYiwweDNlLAogICAgMHhlOSwweDhiLDB4ZGYsMHhlNywweDA0LDB4MDAsMHgwMCwweDA1LAotICAgMHgwMH19LCAvKiAweDNjICovCi0ge3sweDdiLDB4NTksMHg2MywweDlmLDB4NmEsMHg5MywweDZmLDB4ZjAsCi0gICAweDU4LDB4OGEsMHgzZiwweDU3LDB4NzAsMHgyMCwweDAwLDB4MDUsCi0gICAweDAxfX0sIC8qIDB4M2QgKi8KKyAgIDB4MDB9fSwgIC8qIDB4M2MgKi8KKyB7ezB4NmQsMHg1OSwweDU5LDB4OTEsMHg2MCwweDg5LDB4NTMsMHhmMCwJLyogNzIweDU3NiwgY29ycmVjdGVkIHRvIDYwSHogKi8KKyAgIDB4NDEsMHg4NCwweDNmLDB4M2YsMHg1NCwweDAwLDB4MDAsMHgwNSwKKyAgIDB4NDF9fSwgIC8qIDB4M2QgKi8KICB7ezB4ODYsMHg2YSwweDZhLDB4OGEsMHg3NCwweDA2LDB4OGMsMHgxNSwKICAgIDB4NGYsMHg4MywweGVmLDB4ZWYsMHg4ZCwweDMwLDB4MDAsMHgwMiwKLSAgIDB4MDB9fSwgLyogMHgzZSAqLworICAgMHgwMH19LCAgLyogMHgzZSAqLwogIHt7MHg4MSwweDZhLDB4NmEsMHg4NSwweDcwLDB4MDAsMHgwZiwweDNlLAogICAgMHhlYiwweDhlLDB4ZGYsMHhkZiwweDEwLDB4MDAsMHgwMCwweDAyLAotICAgMHgwMH19LCAvKiAweDNmICovCisgICAweDAwfX0sICAvKiAweDNmICovCiAge3sweGEzLDB4N2YsMHg3ZiwweDg3LDB4ODYsMHg5NywweDFlLDB4ZjEsCiAgICAweGFlLDB4ODUsMHg1NywweDU3LDB4MWYsMHgzMCwweDAwLDB4MDIsCiAgICAweDAxfX0sICAvKiAweDQwICovCkBAIC01NzgsMTEgKzQ4MywxMSBAQAogIHt7MHhkMywweDlmLDB4OWYsMHg5NywweGFiLDB4MWYsMHhmMSwweGZmLCAvKiAxMjgweDk2MC04NSAqLwogICAgMHhjMCwweDgzLDB4YmYsMHhiZiwweGYyLDB4MTAsMHgwMCwweDA3LAogICAgMHgwMX19LCAgLyogMHg0YyAqLwotIHt7MHg3YiwweDVmLDB4NjMsMHg5ZiwweDZhLDB4OTMsMHg2ZiwweGYwLCAvKiA3Njh4NTc2ICovCi0gICAweDU4LDB4OGEsMHgzZiwweDU3LDB4NzAsMHgyMCwweDAwLDB4MDUsCi0gICAweDAxfX0sICAvKiAweDRkICovCi0ge3sweDJkLDB4MjcsMHgyOCwweDkwLDB4MmMsMHg4MCwweDBiLDB4M2UsIC8qIEZTVE4gMzIweDQ4MCwgVEVNUCAtIHBvc3NpYmx5IGludmFsaWQgKi8KLSAgIDB4ZTksMHg4YiwweGRmLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyB7ezB4NzUsMHg1ZiwweDVmLDB4OTksMHg2NiwweDkwLDB4NTMsMHhmMCwgLyogNzY4eDU3NiwgY29ycmVjdGVkIHRvIDYwSHogKi8KKyAgIDB4NDEsMHg4NCwweDNmLDB4M2YsMHg1NCwweDAwLDB4MDAsMHgwNSwKKyAgIDB4NDF9fSwgIC8qIDB4NGQgKi8KKyB7ezB4NWYsMHgyNywweDRmLDB4ODMsMHg1NSwweDgxLDB4MGIsMHgzZSwgLyogRlNUTiAzMjB4MjQwICh3b3JraW5nKSAqLworICAgMHhlOSwweDhiLDB4ZGYsMHhlOCwweDBjLDB4MDAsMHgwMCwweDA1LAogICAgMHgwMH19LCAgLyogMHg0ZSAqLwogIHt7MHhjZCwweDlmLDB4OWYsMHg5MSwweGFiLDB4MWMsMHgzYSwweGZmLCAvKiAxMjgweDgwMC02MCAqLwogICAgMHgyMCwweDgzLDB4MWYsMHgxZiwweDNiLDB4MTAsMHgwMCwweDA3LApAQCAtNjAxLDEwICs1MDYsNTggQEAKICAgIDB4MDF9fSwgIC8qIDB4NTMgKi8KICB7ezB4Y2QsMHg4ZiwweDhmLDB4OTEsMHg5YiwweDFiLDB4N2EsMHhmZiwgLyogMTE1Mng4NjQtNjAgKi8KICAgIDB4NjQsMHg4YywweDVmLDB4NjIsMHg3YiwweDEwLDB4MDAsMHgwNywKLSAgIDB4NDF9fSAgIC8qIDB4NTQgKi8KKyAgIDB4NDF9fSwgIC8qIDB4NTQgKi8KKyB7ezB4NWMsMHg0ZiwweDRmLDB4ODAsMHg1NywweDgwLDB4YTMsMHgxZiwgLyogZmFrZSA2NDB4NDAwQDYwSHogKGZvciBMQ0QgYW5kIFRWLCBub3QgYWN0dWFsbHkgdXNlZCkgKi8KKyAgIDB4OTgsMHg4YywweDhmLDB4OTYsMHhhNCwweDMwLDB4MDAsMHgwNSwKKyAgIDB4NDB9fSwgIC8qIDB4NTUgKi8KKyB7ezB4MmMsMHgyNywweDI3LDB4OTAsMHgyZCwweDkyLDB4YTQsMHgxZiwgLyogZmFrZSAzMjB4MjAwQDYwSHogKGZvciBMQ0QgYW5kIFRWLCBub3QgYWN0dWFsbHkgdXNlZCkgKi8KKyAgIDB4OTgsMHg4YywweDhmLDB4OTYsMHhhNSwweDMwLDB4MDAsMHgwNCwKKyAgIDB4MDB9fSwgIC8qIDB4NTYgKi8KKyB7ezB4ZDcsMHhjNywweGM3LDB4OWIsMHhkMSwweDE1LDB4ZDEsMHgxMCwgLyogMTYwMHgxMjAwIGZvciBMQ0RBICovCisgICAweGIyLDB4ODYsMHhhZiwweGIwLDB4ZDIsMHgyZiwweDAwLDB4MDMsCisgICAweDAwfX0sICAvKiAweDU3ICovCisge3sweGNlLDB4OWYsMHg5ZiwweDkyLDB4YTksMHgxNywweDI4LDB4ZGMsIC8qIDEyODB4NzY4ICgxMjgweDEwMjQpIDYwIEh6ICovCisgICAweDkyLDB4ODYsMHhmZiwweDkxLDB4MjksMHgyMSwweDAwLDB4MDcsCisgICAweDAxfX0sICAvKiAweDU4ICovCisge3sweGNlLDB4OWYsMHg5ZiwweDkyLDB4YTUsMHgxNywweDI4LDB4ZGMsIC8qIDEyODB4NzY4ICgxMjgweDEwMjQpIDc1IEh6ICovCisgICAweDkyLDB4ODYsMHhmZiwweDkxLDB4MjksMHgyMSwweDAwLDB4MDcsCisgICAweDAxfX0sICAvKiAweDU5ICovCisge3sweGQzLDB4OWYsMHg5ZiwweDk3LDB4YWIsMHgxZiwweDJlLDB4ZGMsIC8qIDEyODB4NzY4ICgxMjgweDEwMjQpIDg1IEh6ICovCisgICAweDk1LDB4ODksMHhmZiwweDk0LDB4MmYsMHgyMSwweDAwLDB4MDcsCisgICAweDAxfX0sICAvKiAweDVhICovCisge3sweGNlLDB4OWYsMHg5ZiwweDkyLDB4YTksMHgxNywweDI4LDB4ZGUsIC8qIDEyODB4ODAwICgxMjgweDEwMjQpIDYwIEh6ICovCisgICAweGEyLDB4ODYsMHgxZiwweGExLDB4MjksMHgwMSwweDAwLDB4MDcsCisgICAweDAxfX0sICAvKiAweDViICovCisge3sweGNlLDB4OWYsMHg5ZiwweDkyLDB4YTUsMHgxNywweDI4LDB4ZGUsIC8qIDEyODB4ODAwICgxMjgweDEwMjQpIDc1IEh6ICovCisgICAweGEyLDB4ODYsMHgxZiwweGExLDB4MjksMHgwMSwweDAwLDB4MDcsCisgICAweDAxfX0sICAvKiAweDVjICovCisge3sweGQzLDB4OWYsMHg5ZiwweDk3LDB4YWIsMHgxZiwweDJlLDB4ZGUsIC8qIDEyODB4ODAwICgxMjgweDEwMjQpIDg1IEh6ICovCisgICAweGE1LDB4ODksMHgxZiwweGE0LDB4MmYsMHgwMSwweDAwLDB4MDcsCisgICAweDAxfX0sICAvKiAweDVkICovCisge3sweDdmLDB4NjMsMHg2MywweDgzLDB4NmQsMHgxZCwweDBiLDB4M2UsIC8qIDgwMHg0ODAgKHdpZGUpIDYwIEh6ICovCisgICAweGU5LDB4OGIsMHhkZiwweGU4LDB4MGMsMHgwMCwweDAwLDB4MDYsCisgICAweDAwfX0sICAvKiAweDVlICovCisge3sweGEwLDB4N2YsMHg3ZiwweDg0LDB4ODUsMHg5NywweDUyLDB4ZjAsIC8qIDEwMjR4NTc2ICh3aWRlKSA2MCBIeiAqLworICAgMHg0MSwweDg1LDB4M2YsMHg0MCwweDUzLDB4MDAsMHgwMCwweDAyLAorICAgMHgwMX19LCAgLyogMHg1ZiAqLworIHt7MHhjOSwweDlmLDB4OWYsMHg4ZCwweGIwLDB4MTUsMHhlYywweGYwLCAvKiAxMjgweDcyMCAod2lkZSkgNjAgSHogKi8KKyAgIDB4ZDQsMHg4OSwweGNmLDB4ZDMsMHhlZCwweDIwLDB4MDAsMHgwNywKKyAgIDB4MDF9fSwgIC8qIDB4NjAgKi8KKyB7ezB4Y2IsMHg5ZiwweDlmLDB4OGYsMHhhNSwweDEzLDB4NWIsMHhmZiwgLyogMTI4MHg4NTQtNjAgd2lkZSAqLworICAgMHg1NiwweDg5LDB4NTUsMHg1NSwweDVjLDB4MzAsMHgwMCwweDA3LAorICAgMHgwMX19LCAgLyogMHg2MSAqLworIHt7MHhjZSwweDlmLDB4OWYsMHg5MiwweGE5LDB4MTcsMHgyOCwweGRlLCAvKiAxMjgweDg1NCAoMTI4MHgxMDI0KSA2MCBIeiAqLworICAgMHhiZCwweDgxLDB4NTUsMHhiYywweDI5LDB4MDEsMHgwMCwweDA3LAorICAgMHg0MX19LCAgLyogMHg2MiAqLworIHt7MHhjZSwweDlmLDB4OWYsMHg5MiwweGE1LDB4MTcsMHgyOCwweGRlLCAvKiAxMjgweDg1NCAoMTI4MHgxMDI0KSA3NSBIeiAqLworICAgMHhiZCwweDgxLDB4NTUsMHhiYywweDI5LDB4MDEsMHgwMCwweDA3LAorICAgMHg0MX19LCAgLyogMHg2MyAqLworIHt7MHhkMywweDlmLDB4OWYsMHg5NywweGFiLDB4MWYsMHgyZSwweGRlLCAvKiAxMjgweDg1NCAoMTI4MHgxMDI0KSA4NSBIeiAqLworICAgMHhjMCwweDg0LDB4NTUsMHhiZiwweDJmLDB4MDEsMHgwMCwweDA3LAorICAgMHg0MX19ICAgLyogMHg2NCAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCBTaVMzMTBfTUNMS0RhdGFfMF8zMTVbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YSBTaVMzMTBfTUNMS0RhdGFfMF8zMTVbXSA9CiB7CiAJeyAweDNiLDB4MjIsMHgwMSwxNDN9LAogCXsgMHg1YywweDIzLDB4MDEsMTY2fSwKQEAgLTYxNiw3ICs1NjksNyBAQAogCXsgMHg1YywweDIzLDB4MDEsMTY2fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCBTaVMzMTBfTUNMS0RhdGFfMF82NTBbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YSBTaVMzMTBfTUNMS0RhdGFfMF82NTBbXSA9CiB7CiAJeyAweDVhLDB4NjQsMHg4MiwgNjZ9LAogCXsgMHhiMywweDQ1LDB4ODIsIDgzfSwKQEAgLTYyOCw3ICs1ODEsNyBAQAogCXsgMHgzNywweDIyLDB4ODIsMTMzfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCBTaVMzMTBfTUNMS0RhdGFfMF8zMzBbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YSBTaVMzMTBfTUNMS0RhdGFfMF8zMzBbXSA9CiB7CiAJeyAweDVjLDB4MjMsMHgwMSwxNjZ9LAogCXsgMHg1YywweDIzLDB4MDEsMTY2fSwKQEAgLTY0MCw3ICs1OTMsNyBAQAogCXsgMHg3OSwweDA2LDB4MDEsMjUwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCBTaVMzMTBfTUNMS0RhdGFfMF82NjBbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YSBTaVMzMTBfTUNMS0RhdGFfMF82NjBbXSA9CiB7CiAJeyAweDVjLDB4MjMsMHg4MiwxNjZ9LAogCXsgMHg1YywweDIzLDB4ODIsMTY2fSwKQEAgLTY1Miw3ICs2MDUsNyBAQAogCXsgMHgzNywweDIxLDB4ODIsMjAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCBTaVMzMTBfTUNMS0RhdGFfMF83NjBbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YSBTaVMzMTBfTUNMS0RhdGFfMF83NjBbXSA9CiB7CiAJeyAweDM3LDB4MjIsMHg4MiwxMzN9LAogCXsgMHg1YywweDIzLDB4ODIsMTY2fSwKQEAgLTY2NCw3ICs2MTcsNyBAQAogCXsgMHgzNywweDIxLDB4ODIsMjAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCBTaVMzMTBfTUNMS0RhdGFfMF83NjFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YSBTaVMzMTBfTUNMS0RhdGFfMF83NjFbXSA9CiB7CiAJeyAweDM3LDB4MjIsMHg4MiwxMzN9LCAgLyogUHJlbGltaW5hcnkgKi8KIAl7IDB4NWMsMHgyMywweDgyLDE2Nn0sCkBAIC02NzYsNyArNjI5LDcgQEAKIAl7IDB4MzcsMHgyMSwweDgyLDIwMH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTUNMS0RhdGFTdHJ1Y3QgU2lTMzEwX01DTEtEYXRhXzBfMzQwW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTUNMS0RhdGEgU2lTMzEwX01DTEtEYXRhXzBfMzQwW10gPQogewogCXsgMHg3OSwweDA2LDB4MDEsMjUwfSwKIAl7IDB4N2MsMHgwOCwweDAxLDIwMH0sCkBAIC02ODgsOSArNjQxLDkgQEAKIAl7IDB4MjksMHgwMSwweDgxLDMwMH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTUNMS0RhdGFTdHJ1Y3QgU2lTMzEwX01DTEtEYXRhXzFbXSA9IC8qIEVDTEsgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX01DTEtEYXRhIFNpUzMxMF9NQ0xLRGF0YV8xW10gPSAvKiBFQ0xLICovCiB7Ci0gICAgICAgIHsgMHgyOSwweDIxLDB4ODIsMTUwfSwKKwl7IDB4MjksMHgyMSwweDgyLDE1MH0sCiAJeyAweDVjLDB4MjMsMHg4MiwxNjZ9LAogCXsgMHg2NSwweDIzLDB4ODIsMTgzfSwKIAl7IDB4MzcsMHgyMSwweDgyLDIwMH0sCkBAIC03MDAsNyArNjUzLDcgQEAKIAl7IDB4MzcsMHgyMiwweDgyLDEzM30KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTUNMS0RhdGFTdHJ1Y3QgU2lTMzEwX01DTEtEYXRhXzFfMzQwW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTUNMS0RhdGEgU2lTMzEwX01DTEtEYXRhXzFfMzQwW10gPQogewogCXsgMHg3YywweDA4LDB4MDEsMjAwfSwKIAl7IDB4N2MsMHgwOCwweDAxLDIwMH0sCkBAIC03MTIsNyArNjY1LDcgQEAKIAl7IDB4MjksMHgwMSwweDgxLDMwMH0KIH07CiAKLXN0YXRpYyBTaVNfVkNMS0RhdGFTdHJ1Y3QgU2lTMzEwX1ZDTEtEYXRhW109CitzdGF0aWMgc3RydWN0IFNpU19WQ0xLRGF0YSBTaVMzMTBfVkNMS0RhdGFbXSA9CiB7CiAJeyAweDFiLDB4ZTEsIDI1fSwgLyogMHgwMCAqLwogCXsgMHg0ZSwweGU0LCAyOH0sIC8qIDB4MDEgKi8KQEAgLTgwNSw3ICs3NTgsNyBAQAogCXsgMHgzMCwweDIzLCA4OH0sIC8qIDB4NTggMTM2MHg3NjgtNjIgKGlzIDYwSHohKSAqLwogCXsgMHg1MiwweDA3LDE0OX0sIC8qIDB4NTkgMTI4MHg5NjAtODUgKi8KIAl7IDB4NTYsMHgwNywxNTZ9LCAvKiAweDVhIDE0MDB4MTA1MC03NSAqLwotICAgCXsgMHg3MCwweDI5LCA4MX0sIC8qIDB4NWIgMTI4MHg3NjggTENEICovCisJeyAweDcwLDB4MjksIDgxfSwgLyogMHg1YiAxMjgweDc2OCBMQ0QgKi8KIAl7IDB4NDUsMHgyNSwgODN9LCAvKiAweDVjIDEyODB4ODAwICAqLwogCXsgMHg3MCwweDBhLDE0N30sIC8qIDB4NWQgMTY4MHgxMDUwICovCiAJeyAweDcwLDB4MjQsMTYyfSwgLyogMHg1ZSAxNjAweDEyMDAgKi8KQEAgLTgyMywxMCArNzc2LDE5IEBACiAJeyAweDdjLDB4NmIsIDM4fSwgLyogMHg2YSA5NjB4NTQwQDYwICovCiAJeyAweGUzLDB4NTYsIDQxfSwgLyogMHg2YiA5NjB4NjAwQDYwICovCiAJeyAweDQ1LDB4MjUsIDgzfSwgLyogMHg2YyAxMjgweDgwMCAqLwotCXsgMHg3MCwweDI4LCA5MH0gIC8qIDB4NmQgMTE1Mng4NjRANjAgKi8KKwl7IDB4NzAsMHgyOCwgOTB9LCAvKiAweDZkIDExNTJ4ODY0QDYwICovCisJeyAweDE1LDB4ZTEsIDIwfSwgLyogMHg2ZSA2NDB4NDAwQDYwIChmYWtlLCBub3QgYWN0dWFsbHkgdXNlZCkgKi8KKwl7IDB4NWYsMHhjNiwgMzN9LCAvKiAweDZmIDcyMHg1NzZANjAgKi8KKwl7IDB4MzcsMHg1YSwgMTB9LCAvKiAweDcwIDMyMHgyMDBANjAgKGZha2UsIG5vdCBhY3R1YWxseSB1c2VkKSAqLworCXsgMHgyYiwweGMyLCAzNX0sIC8qIDB4NzEgNzY4eDU3NkA2MCAqLworCXsgMHhhOCwweDQyLDEzMX0sIC8qIDB4NzIgMTYwMHgxMjAwQDYwIGZvciBMQ0RBICovCisJeyAweDFiLDB4YzEsIDM0fSwgLyogMHg3MyA4MDB4NDgwIDYwSHogKHdpZGUpICovCisJeyAweDQxLDB4NjQsIDQ4fSwgLyogMHg3NCAxMDI0eDU3NiA2MEh6ICh3aWRlKSAqLworCXsgMHg1MiwweDI3LCA3NX0sIC8qIDB4NzUgMTI4MHg3MjAgNjBIeiAod2lkZSkgKi8KKwl7IDB4NzUsMHgxMywgODR9ICAvKiAweDc2IDEyODB4ODU0IDYwSHogKHdpZGUpICovCiB9OwogCi1zdGF0aWMgU2lTX1ZCVkNMS0RhdGFTdHJ1Y3QgU2lTMzEwX1ZCVkNMS0RhdGFbXT0KK3N0YXRpYyBzdHJ1Y3QgU2lTX1ZCVkNMS0RhdGEgU2lTMzEwX1ZCVkNMS0RhdGFbXSA9CiB7CiAJeyAweDFiLDB4ZTEsIDI1fSwgLyogMHgwMCAqLwogCXsgMHg0ZSwweGU0LCAyOH0sIC8qIDB4MDEgKi8KQEAgLTg1OCwxMiArODIwLDYgQEAKIAl7IDB4NWUsMHg0MywxMTN9LCAvKiAweDFiICovCiAJeyAweGJjLDB4NDQsMTE2fSwgLyogMHgxYyAqLwogCXsgMHhlMCwweDQ2LDEzMn0sIC8qIDB4MWQgKi8KLSNpZiAwCi0JeyAweGQ0LDB4MjgsMTM1fSwgLyogMHgxZSAqLwotCXsgMHhlYSwweDJhLDEzOX0sIC8qIDB4MWYgKi8KLQl7IDB4NDEsMHgyMiwxNTd9LCAvKiAweDIwICovCi0JeyAweDcwLDB4MjQsMTYyfSwgLyogMHgyMSAqLwotI2VuZGlmCiAJeyAweGUyLDB4NDYsMTM1fSwgLyogMHgxZSAqLyAgLyogMTI4MHgxMDI0LTc1LCBiZXR0ZXIgY2xvY2sgZm9yIFZHQTIgKi8KIAl7IDB4ZTUsMHg0NiwxMzl9LCAvKiAweDFmICovICAvKiAxMDI0eDc2OC0xMjAsIGJldHRlciBjbG9jayBmb3IgVkdBMiAqLwogCXsgMHgxNSwweDAxLDE1N30sIC8qIDB4MjAgKi8gIC8qIDEyODB4MTAyNC04NSwgYmV0dGVyIGNsb2NrIGZvciBWR0EyICovCkBAIC05MTIsNyArODY4LDcgQEAKIAl7IDB4MzQsMHg2MSwgOTV9LCAvKiAweDRiIFVOVVNFRCAqLwogCXsgMHg3OCwweDI3LDEwOH0sIC8qIDB4NGMgVU5VU0VEICovCiAJeyAweDY2LDB4NDMsMTIzfSwgLyogMHg0ZCAxNDAweDEwNTAtNjAgKi8KLQl7IDB4NDEsMHg0ZSwgMjF9LCAvKiAweDRlIFVOVVNFRCAqLworCXsgMHg0MSwweDRlLCAyMX0sIC8qIDB4NGUgKi8KIAl7IDB4YTEsMHg0YSwgMjl9LCAvKiAweDRmIFVOVVNFRCAqLwogCXsgMHgxOSwweDQyLCA0Mn0sIC8qIDB4NTAgVU5VU0VEICovCiAJeyAweDU0LDB4NDYsIDU4fSwgLyogMHg1MSBVTlVTRUQgKi8KQEAgLTkyNSw3ICs4ODEsNyBAQAogCXsgMHgzMCwweDIzLCA4OH0sIC8qIDB4NTggMTM2MHg3NjgtNjIgKGlzIDYwSHohKSBURU1QLCBVTlVTRUQgKi8KIAl7IDB4NTIsMHgwNywxNDl9LCAvKiAweDU5IDEyODB4OTYwLTg1ICAqLwogCXsgMHg1NiwweDA3LDE1Nn0sIC8qIDB4NWEgMTQwMHgxMDUwLTc1ICovCi0gICAJeyAweDcwLDB4MjksIDgxfSwgLyogMHg1YiAxMjgweDc2OCBMQ0QgKFRNRFMpICovCisJeyAweDcwLDB4MjksIDgxfSwgLyogMHg1YiAxMjgweDc2OCBMQ0QgKFRNRFMpICovCiAJeyAweGNlLDB4MWUsIDczfSwgLyogMHg1YyAxMjgweDgwMF8yIExDRCAoU2lTIExWRFMpIC0gKENSVDE6IDQ1IDI1IDgzKSAqLwogCXsgMHhiZSwweDQ0LDEyMX0sIC8qIDB4NWQgMTY4MHgxMDUwIExDRCAqLwogCXsgMHg3MCwweDI0LDE2Mn0sIC8qIDB4NWUgMTYwMHgxMjAwIExDRCAqLwpAQCAtOTQzLDU3ICs4OTksMzMgQEAKIAl7IDB4N2MsMHg2YiwgMzh9LCAvKiAweDZhIDk2MHg1NDBANjAgKi8KIAl7IDB4ZTMsMHg1NiwgNDF9LCAvKiAweDZiIDk2MHg2MDBANjAgKi8KIAl7IDB4OWMsMHg2MiwgNjl9LCAvKiAweDZjIDEyODB4ODAwIChTaVMgVE1EUykgKHNwZWNpYWwpICovCi0JeyAweDcwLDB4MjgsIDkwfSAgLyogMHg2ZCAxMTUyeDg2NEA2MCAqLworCXsgMHg3MCwweDI4LCA5MH0sIC8qIDB4NmQgMTE1Mng4NjRANjAgKi8KKwl7IDB4MTUsMHhlMSwgMjB9LCAvKiAweDZlIDY0MHg0MDBANjAgKGZha2UsIG5vdCBhY3R1YWxseSB1c2VkKSAqLworCXsgMHg1ZiwweGM2LCAzM30sIC8qIDB4NmYgNzIweDU3NkA2MCAqLworCXsgMHgzNywweDVhLCAxMH0sIC8qIDB4NzAgMzIweDIwMEA2MCAoZmFrZSwgbm90IGFjdHVhbGx5IHVzZWQpICovCisJeyAweDJiLDB4YzIsIDM1fSwgLyogMHg3MSA3NjhANTc2QDYwICovCisJeyAweGE4LDB4NDIsMTMxfSwgLyogMHg3MiAxNjAweDEyMDBANjAgZm9yIExDREEgKi8KKwl7IDB4MWIsMHhjMSwgMzR9LCAvKiAweDczIDgwMHg0ODAgNjBIeiAod2lkZSkgKi8KKwl7IDB4NDEsMHg2NCwgNDh9LCAvKiAweDc0IDEwMjR4NTc2IDYwSHogKHdpZGUpICovCisJeyAweDUyLDB4MjcsIDc1fSwgLyogMHg3NSAxMjgweDcyMCA2MEh6ICh3aWRlKSAqLworCXsgMHg3NSwweDEzLCA4NH0gIC8qIDB4NzYgMTI4MHg4NTQgNjBIeiAoU2lTIExWRFMpIExDRCAqLwogfTsKIAotc3RhdGljIGNvbnN0IERSQU00VHlwZSBTaVMzMTBfU1IxNVs4XSA9IHsKLQl7MHgwMCwweDA0LDB4NjAsMHg2MH0sCi0JezB4MGYsMHgwZiwweDBmLDB4MGZ9LAotCXsweGJhLDB4YmEsMHhiYSwweGJhfSwKLQl7MHhhOSwweGE5LDB4YWMsMHhhY30sCi0JezB4YTAsMHhhMCwweGEwLDB4YTh9LAotCXsweDAwLDB4MDAsMHgwMiwweDAyfSwKLSAJezB4MzAsMHgzMCwweDQwLDB4NDB9LAotCXsweDAwLDB4YTUsMHhmYiwweGY2fQotfTsKLQotI2lmZGVmIExJTlVYX0tFUk5FTAotCi1zdGF0aWMgVUNIQVIgU2lTMzEwX1NSMDcgPSAweDE4OwotCi1zdGF0aWMgY29uc3QgRFJBTTRUeXBlIFNpUzMxMF9DUjQwWzVdID0gewotCXsweDc3LDB4NzcsMHgzMywweDMzfSwKLQl7MHg3NywweDc3LDB4MzMsMHgzM30sCi0JezB4MDAsMHgwMCwweDAwLDB4MDB9LAotCXsweDViLDB4NWIsMHgwMywweDAzfSwKLQl7MHgwMCwweDAwLDB4ZjAsMHhmOH0KLX07Ci0KLXN0YXRpYyBVQ0hBUiBTaVMzMTBfQ1I0OVtdID0gezB4YWEsMHg4OH07Ci1zdGF0aWMgVUNIQVIgU2lTMzEwX1NSMUYgPSAweDAwOwotc3RhdGljIFVDSEFSIFNpUzMxMF9TUjIxID0gMHhhNTsKLXN0YXRpYyBVQ0hBUiBTaVMzMTBfU1IyMiA9IDB4ZmI7Ci1zdGF0aWMgVUNIQVIgU2lTMzEwX1NSMjMgPSAweGY2Owotc3RhdGljIFVDSEFSIFNpUzMxMF9TUjI0ID0gMHgwZDsKLXN0YXRpYyBVQ0hBUiBTaVMzMTBfU1IyNVtdID0gezB4MzMsMHgzfTsKLXN0YXRpYyBVQ0hBUiBTaVMzMTBfU1IzMSA9IDB4MDA7Ci1zdGF0aWMgVUNIQVIgU2lTMzEwX1NSMzIgPSAweDExOwotc3RhdGljIFVDSEFSIFNpUzMxMF9TUjMzID0gMHgwMDsKLXN0YXRpYyBVQ0hBUiBTaVMzMTBfQ1JUMkRhdGFfMV8yICA9IDB4MDA7Ci1zdGF0aWMgVUNIQVIgU2lTMzEwX0NSVDJEYXRhXzRfRCAgPSAweDAwOwotc3RhdGljIFVDSEFSIFNpUzMxMF9DUlQyRGF0YV80X0UgID0gMHgwMDsKLXN0YXRpYyBVQ0hBUiBTaVMzMTBfQ1JUMkRhdGFfNF8xMCA9IDB4ODA7Ci1zdGF0aWMgY29uc3QgVVNIT1JUIFNpUzMxMF9SR0JTZW5zZURhdGEgICAgPSAweGQxOwotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVMzMTBfVmlkZW9TZW5zZURhdGEgID0gMHhiOTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgU2lTMzEwX1lDU2Vuc2VEYXRhICAgICA9IDB4YjM7Ci1zdGF0aWMgY29uc3QgVVNIT1JUIFNpUzMxMF9SR0JTZW5zZURhdGEyICAgPSAweDAxOTA7IAotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVMzMTBfVmlkZW9TZW5zZURhdGEyID0gMHgwMTc0Owotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVMzMTBfWUNTZW5zZURhdGEyICAgID0gMHgwMTZiOwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBTaVNfUGFuZWxEZWxheVRibFN0cnVjdCBTaVMzMTBfUGFuZWxEZWxheVRibFtdPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX1NSMTVbNCAqIDhdID0KIHsKLSAgICAgICAge3sweDEwLDB4NDB9fSwKKwkweDAwLDB4MDQsMHg2MCwweDYwLAorCTB4MGYsMHgwZiwweDBmLDB4MGYsCisJMHhiYSwweGJhLDB4YmEsMHhiYSwKKwkweGE5LDB4YTksMHhhYywweGFjLAorCTB4YTAsMHhhMCwweGEwLDB4YTgsCisJMHgwMCwweDAwLDB4MDIsMHgwMiwKKwkweDMwLDB4MzAsMHg0MCwweDQwLAorCTB4MDAsMHhhNSwweGZiLDB4ZjYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1BhbmVsRGVsYXlUYmwgU2lTMzEwX1BhbmVsRGVsYXlUYmxbXSA9Cit7CisJe3sweDEwLDB4NDB9fSwKIAl7ezB4MTAsMHg0MH19LAogCXt7MHgxMCwweDQwfX0sCiAJe3sweDEwLDB4NDB9fSwKQEAgLTEwMTEsNyArOTQzLDcgQEAKIAl7ezB4MTAsMHg0MH19CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX1BhbmVsRGVsYXlUYmxTdHJ1Y3QgU2lTMzEwX1BhbmVsRGVsYXlUYmxMVkRTW109CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19QYW5lbERlbGF5VGJsIFNpUzMxMF9QYW5lbERlbGF5VGJsTFZEU1tdID0KIHsKIAl7ezB4MjgsMHhjOH19LAogCXt7MHgyOCwweGM4fX0sCkBAIC0xMDM1LDE4ICs5NjcsMTggQEAKIC8qIFNJUyBWSURFTyBCUklER0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVMzMTBfU3QyTENEMTAyNHg3NjhEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVMzMTBfU3QyTENEMTAyNHg3NjhEYXRhW10gPQogewogCXsgICA2MiwgIDI1LCA4MDAsIDU0NiwxMzQ0LCA4MDZ9LAogCXsgICAzMiwgIDE1LCA5MzAsIDU0NiwxMzQ0LCA4MDZ9LAotICAgICAgICB7ICAgNjIsICAyNSwgODAwLCA1NDYsMTM0NCwgODA2fSwKKwl7ICAgNjIsICAyNSwgODAwLCA1NDYsMTM0NCwgODA2fSwKIAl7ICAxMDQsICA0NSwgOTQ1LCA0OTYsMTM0NCwgODA2fSwKIAl7ICAgNjIsICAyNSwgODAwLCA1NDYsMTM0NCwgODA2fSwKIAl7ICAgMzEsICAxOCwxMDA4LCA2MjQsMTM0NCwgODA2fSwKIAl7ICAgIDEsICAgMSwxMzQ0LCA4MDYsMTM0NCwgODA2fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVMzMTBfRXh0TENEMTAyNHg3NjhEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVMzMTBfRXh0TENEMTAyNHg3NjhEYXRhW10gPQogewogCXsgICA0MiwgIDI1LDE1MzYsIDQxOSwxMzQ0LCA4MDZ9LAogCXsgICA0OCwgIDI1LDE1MzYsIDM2OSwxMzQ0LCA4MDZ9LApAQCAtMTA1Nyw3ICs5ODksNyBAQAogCXsgICAgMSwgICAxLDEzNDQsIDgwNiwxMzQ0LCA4MDZ9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpUzMxMF9TdDJMQ0QxMjgweDEwMjREYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVMzMTBfU3QyTENEMTI4MHgxMDI0RGF0YVtdID0KIHsKIAl7ICAgMjIsICAgNSwgODAwLCA1MTAsMTY1MCwxMDg4fSwKIAl7ICAgMjIsICAgNSwgODAwLCA1MTAsMTY1MCwxMDg4fSwKQEAgLTEwNjksNyArMTAwMSw3IEBACiAJeyAgICAxLCAgIDEsMTY4OCwxMDY2LDE2ODgsMTA2Nn0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTMzEwX0V4dExDRDEyODB4MTAyNERhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhIFNpUzMxMF9FeHRMQ0QxMjgweDEwMjREYXRhW10gPQogewogCXsgIDIxMSwgIDYwLDEwMjQsIDUwMSwxNjg4LDEwNjZ9LAogCXsgIDIxMSwgIDYwLDEwMjQsIDUwOCwxNjg4LDEwNjZ9LApAQCAtMTA4MSw0NSArMTAxMywyMiBAQAogCXsgICAgMSwgICAxLDE2ODgsMTA2NiwxNjg4LDEwNjZ9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCBTaVMzMTBfQ1JUMlBhcnQyXzEwMjR4NzY4XzFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19QYXJ0MlBvcnRUYmwgU2lTMzEwX0NSVDJQYXJ0Ml8xMDI0eDc2OF8xW10gPQogewotIHt7MHgyNSwweDEyLDB4YzksMHhkYywweGI2LDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fSwKLSB7ezB4MmMsMHgxMiwweDlhLDB4YWUsMHg4OCwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0sCi0ge3sweDI1LDB4MTIsMHhjOSwweGRjLDB4YjYsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAotIHt7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fSwKLSB7ezB4MzgsMHgxMywweDE2LDB4MGMsMHhlNiwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0sCi0ge3sweDM4LDB4MTgsMHgxNiwweDAwLDB4MDAsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAotIHt7MHgzNiwweDEzLDB4MTMsMHgyNSwweGZmLDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fQorCXt7MHgyNSwweDEyLDB4YzksMHhkYywweGI2LDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fSwKKwl7ezB4MmMsMHgxMiwweDlhLDB4YWUsMHg4OCwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0sCisJe3sweDI1LDB4MTIsMHhjOSwweGRjLDB4YjYsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAorCXt7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fSwKKwl7ezB4MzgsMHgxMywweDE2LDB4MGMsMHhlNiwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0sCisJe3sweDM4LDB4MTgsMHgxNiwweDAwLDB4MDAsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAorCXt7MHgzNiwweDEzLDB4MTMsMHgyNSwweGZmLDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fQogfTsKIAotLyogKioqIExDREEgKioqICovCi0KLSNpZiAwCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTENEQTE2MDB4MTIwMERhdGFfMVtdPQoteyAvKiBDbGV2bywgNjUxKzMwMUMgKi8KLQl7MTIwMCwgNDUwLCAyMDQ4LDEyNTB9LAotCXsxMjAwLCA0MDAsIDIwNDgsMTI1MH0sCi0JezEyODAsIDQ1MCwgMjA0OCwxMjUwfSwKLQl7MTI4MCwgNDAwLCAyMDQ4LDEyNTB9LAotCXsxMjAwLCA1MzAsIDIwNDgsMTI1MH0sCi0JezEzNjAsIDY1MCwgMjA0OCwxMjUwfSwKLQl7MTU4NCwgODE4LCAyMDQ4LDEyNTB9LAotCXsxNjg4LDEwNjYsIDIwNDgsMTI1MH0sCi0JezE2ODgsMTA2NiwgMjA0OCwxMjUwfSwKLSNpZiAwCi0JezIwNDgsMTI1MCwgMjA0OCwxMjUwfSAgIC8qIHRoaXMgc2hvdWxkIGJlIGNvcnJlY3QgKi8KLSNlbmRpZgotI2lmIDEKLQl7MjE2MCwxMjUwLCAyMDQ4LDEyNTB9ICAgLyogPyAqLwotI2VuZGlmCi19OwotI2VuZGlmCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIExWRFMsIENIUk9OVEVMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTMzEwX0NIVFZVUEFMRGF0YVtdPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzEwX0NIVFZVUEFMRGF0YVtdID0KIHsKIAl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCiAJezEwMDgsIDYyNSwxMDA4LCA2MjV9LApAQCAtMTEzMCw3ICsxMDM5LDcgQEAKIAl7MTQwMCwxMDAwLDE0MDAsMTAwMH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpUzMxMF9DSFRWT1BBTERhdGFbXT0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpUzMxMF9DSFRWT1BBTERhdGFbXSA9CiB7CiAJezEwMDgsIDYyNSwxMDA4LCA2MjV9LAogCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKQEAgLTExMzgsMTAgKzEwNDcsMTAgQEAKIAl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCiAJeyA4NDAsIDYyNSwgODQwLCA2MjV9LAogCXsgOTQ0LCA2MjUsIDk0NCwgNjI1fSwKLSAgICAgICAgezE0MDAsIDg3NSwxNDAwLCA4NzV9CisJezE0MDAsIDg3NSwxNDAwLCA4NzV9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVMzMTBfQ0hUVlVQQUxNRGF0YVtdPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzEwX0NIVFZVUEFMTURhdGFbXSA9CiB7CiAJeyA4NDAsIDYwMCwgODQwLCA2MDB9LAogCXsgODQwLCA2MDAsIDg0MCwgNjAwfSwKQEAgLTExNDksMTAgKzEwNTgsMTAgQEAKIAl7IDg0MCwgNjAwLCA4NDAsIDYwMH0sCiAJeyA3ODQsIDYwMCwgNzg0LCA2MDB9LAogCXsxMDY0LCA3NTAsMTA2NCwgNzUwfSwKLSAgICAgICAgezExNjAsIDk0NSwxMTYwLCA5NDV9CisJezExNjAsIDk0NSwxMTYwLCA5NDV9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVMzMTBfQ0hUVk9QQUxNRGF0YVtdPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzEwX0NIVFZPUEFMTURhdGFbXSA9CiB7CiAJeyA4NDAsIDUyNSwgODQwLCA1MjV9LAogCXsgODQwLCA1MjUsIDg0MCwgNTI1fSwKQEAgLTExNjAsMTAgKzEwNjksMTAgQEAKIAl7IDg0MCwgNTI1LCA4NDAsIDUyNX0sCiAJeyA3ODQsIDUyNSwgNzg0LCA1MjV9LAogCXsxMDQwLCA3MDAsMTA0MCwgNzAwfSwKLSAgICAgICAgezExNjAsIDg0MCwxMTYwLCA4NDB9CisJezExNjAsIDg0MCwxMTYwLCA4NDB9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVMzMTBfQ0hUVlVQQUxORGF0YVtdPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzEwX0NIVFZVUEFMTkRhdGFbXSA9CiB7CiAJezEwMDgsIDYyNSwxMDA4LCA2MjV9LAogCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKQEAgLTExNzQsNyArMTA4MywxOCBAQAogCXsxNDAwLDEwMDAsMTQwMCwxMDAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTMzEwX0NIVFZPUEFMTkRhdGFbXT0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpUzMxMF9DSFRWT1BBTE5EYXRhW10gPQoreworCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKKwl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCisJezEwMDgsIDYyNSwxMDA4LCA2MjV9LAorCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKKwl7IDg0MCwgNjI1LCA4NDAsIDYyNX0sCisJeyA5NDQsIDYyNSwgOTQ0LCA2MjV9LAorCXsxNDAwLCA4NzUsMTQwMCwgODc1fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzEwX0NIVFZTT1BBTERhdGFbXSA9ICAgLyogKHN1cGVyIG92ZXJzY2FuIC0gbm8gZWZmZWN0IG9uIDcwMTkpICovCiB7CiAJezEwMDgsIDYyNSwxMDA4LCA2MjV9LAogCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKQEAgLTExODUsMTM0NCArMTEwNSwxMCBAQAogICAgICAgICB7MTQwMCwgODc1LDE0MDAsIDg3NX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpUzMxMF9DSFRWU09QQUxEYXRhW109ICAgLyogKHN1cGVyIG92ZXJzY2FuIC0gbm8gZWZmZWN0IG9uIDcwMTkpICovCi17Ci0JezEwMDgsIDYyNSwxMDA4LCA2MjV9LAotCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKLQl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCi0JezEwMDgsIDYyNSwxMDA4LCA2MjV9LAotCXsgODQwLCA2MjUsIDg0MCwgNjI1fSwKLQl7IDk0NCwgNjI1LCA5NDQsIDYyNX0sCi0gICAgICAgIHsxNDAwLCA4NzUsMTQwMCwgODc1fQotfTsKLQotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwMF8xW109ICAvKiA4MDB4NjAwICovCi17Ci0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTAxXzFbXT0gIC8qIDEwMjR4NzY4ICovCi17Ci0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCA4MDV9LAotCXsgMCwgMH0sCi0JeyAwLCAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDJfMVtdPSAgLyogMTI4MHgxMDI0ICovCi17Ci0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDEwNjV9LAotCXsgMCwgMH0sCi0JeyAwLCAwfQotfTsKLQotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwM18xW109Ci17Ci0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTA0XzFbXT0KLXsKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgICAwfSwKLQl7MTM0MywgICAwfSwKLQl7IDAsIDgwNX0sCi0JeyAwLCA3OTR9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDVfMVtdPQotewotCXsxMzQzLCA3OTh9LAotCXsxMzQzLCA3OTR9LAotCXsxMzQzLCA3OTh9LAotCXsxMzQzLCA3OTR9LAotCXsxMzQzLCAgIDB9LAotCXsxMzQzLCAgIDB9LAotCXsgMCwgODA1fSwKLQl7IDAsIDc5NH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwNl8xW109Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAwLCA4MDV9LAotCXsgMCwgNzk0fSwKLQl7IDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTA3XzFbXT0KLXsKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgICAwfSwKLQl7MTM0MywgICAwfSwKLQl7IDAsIDgwNX0sCi0JeyAwLCA3OTR9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDhfMVtdPSAgIC8qIDE0MDB4MTA1MCAqLwotewotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDlfMVtdPSAgIC8qIDEyODB4NzY4ICovCi17Ci0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwYV8xW109ICAvKiAxNjAweDEyMDAgKi8KLXsKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTBiXzFbXT0gIC8qIDY0MHg0ODBfMiAqLwotewotCXsgMCwgNTI0fSwKLQl7IDAsIDUyNH0sCi0JeyAwLCA1MjR9LAotCXsgMCwgNTI0fSwKLQl7IDAsIDUyNH0sCi0JeyAwLCA1MjR9LAotCXsgOCwgNTI0fSwKLQl7IDAsIDUyNH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTBjXzFbXT0gIC8qIDY0MHg0ODBfMyAqLwotewotCXsgMCwgNTI0fSwKLQl7IDAsIDUyNH0sCi0JeyAwLCA1MjR9LAotCXsgMCwgNTI0fSwKLQl7IDAsIDUyNH0sCi0JeyAwLCA1MjR9LAotCXsgOCwgNTI0fSwKLQl7IDAsIDUyNH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTBkXzFbXT0KLXsKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgICAwfSwKLQl7MTM0MywgICAwfSwKLQl7IDAsIDgwNX0sCi0JeyAwLCA3OTR9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMGVfMVtdPQotewotCXsxMzQzLCA3OTh9LAotCXsxMzQzLCA3OTR9LAotCXsxMzQzLCA3OTh9LAotCXsxMzQzLCA3OTR9LAotCXsxMzQzLCAgIDB9LAotCXsxMzQzLCAgIDB9LAotCXsgMCwgODA1fSwKLQl7IDAsIDc5NH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwZl8xW109Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAwLCA4MDV9LAotCXsgMCwgNzk0fSwKLQl7IDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTAwXzJbXT0KLXsKLQl7OTgwLCA1Mjh9LAotCXs5ODAsIDUwM30sCi0Jezk4MCwgNTI4fSwKLQl7OTgwLCA1MDN9LAotCXs5ODAsIDU2OH0sCi0JeyAwLCA2Mjh9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwMV8yW109Ci17Ci0JezExNTIsIDYyMn0sCi0JezExNTIsIDU5N30sCi0JezExNTIsIDYyMn0sCi0JezExNTIsIDU5N30sCi0JezExNTIsIDY2Mn0sCi0JezEyMzIsIDcyMn0sCi0JeyAwLCA4MDZ9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTAyXzJbXT0KLXsKLQl7MTM2OCwgNzU0fSwKLQl7MTM2OCwgNzI5fSwKLQl7MTM2OCwgNzU0fSwKLQl7MTM2OCwgNzI5fSwKLQl7MTM2OCwgNzk0fSwKLQl7MTQ0OCwgODU0fSwKLQl7MTU2MCwgOTM4fSwKLQl7ICAgMCwxMDY2fSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDNfMltdPQotewotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDRfMltdPQotewotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwNV8yW109Ci17Ci0JezExNTIsIDYyMn0sCi0JezExNTIsIDU5N30sCi0JezExNTIsIDYyMn0sCi0JezExNTIsIDU5N30sCi0JezExNTIsIDY2Mn0sCi0JezEyMzIsIDcyMn0sCi0JeyAwLCA4MDV9LAotCXsgMCwgNzk0fSwKLQl7IDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTA2XzJbXT0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7IDAsIDgwNX0sCi0JeyAwLCA3OTR9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDdfMltdPQotewotCXsxMTUyLCA2MjJ9LAotCXsxMTUyLCA1OTd9LAotCXsxMTUyLCA2MjJ9LAotCXsxMTUyLCA1OTd9LAotCXsxMTUyLCA2NjJ9LAotCXsxMjMyLCA3MjJ9LAotCXsgMCwgODA1fSwKLQl7IDAsIDc5NH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwOF8yW109ICAvKiAxNDAweDEwNTAgKi8KLXsKLQl7MTMwOCwgNzQxfSwKLQl7MTMwOCwgNzE2fSwKLQl7MTMwOCwgNzQxfSwKLQl7MTMwOCwgNzE2fSwKLQl7MTMwOCwgNzgxfSwKLQl7MTM4OCwgODQxfSwKLQl7MTUwMCwgOTI1fSwKLQl7MTYyOCwxMDUzfSwKLQl7ICAgMCwxMDY1fSwKLQl7ICAgMCwgICAwfSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDlfMltdPSAvKiAxMjgweDc2OCAqLwotewotCXsxMDgzLCA2MjJ9LAotCXsxMDgzLCA1OTd9LAotCXsxMDgzLCA2MjJ9LAotCXsxMDgzLCA1OTd9LAotCXsxMDgzLCA2NjJ9LAotCXsxMTYzLCA3MjJ9LAotCXsxMjg2LCA4MDV9LAotCXsgICAwLCA3OTR9LAotCXsgICAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwYV8yW109ICAvKiAxNjAweDEyMDAgKi8KLXsKLQl7MTU2OCwgOTIwfSwKLQl7MTU2OCwgODk1fSwKLQl7MTU2OCwgOTIwfSwKLQl7MTU2OCwgODk1fSwKLQl7MTU2OCwgOTYwfSwKLQl7MTY0OCwxMDIwfSwKLQl7MTc2MCwxMTA0fSwKLQl7MTg4OCwxMjMyfSwKLQl7MTk0OCwxMjQ1fSwKLQl7ICAgMCwgICAwfQotI2lmIDAKLQl7MTU2OCwgODUwfSwKLQl7MTU2OCwgODI1fSwKLQl7MTU2OCwgODUwfSwKLQl7MTU2OCwgODI1fSwKLQl7MTU2OCwgODkwfSwKLQl7MTY0OCwgOTUwfSwKLQl7MTc2MCwxMDM0fSwKLQl7MTg4OCwxMTYyfSwKLQl7MTk0OCwxMTc1fSwKLQl7ICAgMCwgICAwfQotI2VuZGlmCi19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwYl8yW109ICAvKiA2NDB4NDgwXzIgKi8KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7IDAsIDgwNX0sCi0JeyAwLCA3OTR9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMGNfMltdPSAgLyogNjQweDQ4MF8zICovCi17Ci0JezExNTIsIDYyMn0sCi0JezExNTIsIDU5N30sCi0JezExNTIsIDYyMn0sCi0JezExNTIsIDU5N30sCi0JezExNTIsIDY2Mn0sCi0JezEyMzIsIDcyMn0sCi0JeyAwLCA4MDV9LAotCXsgMCwgNzk0fSwKLQl7IDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTBkXzJbXT0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7IDAsIDgwNX0sCi0JeyAwLCA3OTR9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMGVfMltdPQotewotCXsxMTUyLCA2MjJ9LAotCXsxMTUyLCA1OTd9LAotCXsxMTUyLCA2MjJ9LAotCXsxMTUyLCA1OTd9LAotCXsxMTUyLCA2NjJ9LAotCXsxMjMyLCA3MjJ9LAotCXsgMCwgODA1fSwKLQl7IDAsIDc5NH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwZl8yW10gPQotewotCXsxMTUyLCA2MjJ9LAotCXsxMTUyLCA1OTd9LAotCXsxMTUyLCA2MjJ9LAotCXsxMTUyLCA1OTd9LAotCXsxMTUyLCA2NjJ9LAotCXsxMjMyLCA3MjJ9LAotCXsgMCwgODA1fSwKLQl7IDAsIDc5NH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGVOU18xW109Ci17Ci0JeyA4LCAgIDB9LAotCXsgOCwgICAwfSwKLQl7IDgsICAgMH0sCi0JeyA4LCAgIDB9LAotCXsgOCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsIDgwNn0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGVOU18yW10gPQotewotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9Ci19OwotCi0vKiBDUlQxIENSVEMgZm9yIFNsYXZlTW9kZXMgYW5kIExDREEgKi8KLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTgwMHg2MDBfMVtdID0KLXsKLSB7ezB4NmIsMHg0ZiwweDhmLDB4NTUsMHg4NSwweGFhLDB4MWYsCi0gICAweDkwLDB4ODUsMHg4ZiwweGFiLDB4MzAsMHgwMCwweDA1LAotICAgMHgwMCB9fSwKLSB7ezB4NmIsMHg0ZiwweDhmLDB4NTUsMHg4NSwweDc4LDB4MWYsCi0gICAweDVlLDB4ODMsMHg1ZCwweDc5LDB4MTAsMHgwMCwweDA1LAotICAgMHgwMCB9fSwKLSB7ezB4NmIsMHg0ZiwweDhmLDB4NTUsMHg4NSwweGFhLDB4MWYsCi0gICAweDkwLDB4ODUsMHg4ZiwweGFiLDB4MzAsMHgwMCwweDA1LAotICAgMHgwMCB9fSwKLSB7ezB4NmIsMHg0ZiwweDhmLDB4NTUsMHg4NSwweDc4LDB4MWYsCi0gICAweDVlLDB4ODMsMHg1ZCwweDc5LDB4MTAsMHgwMCwweDA1LAotICAgMHgwMCB9fSwKLSB7ezB4NmIsMHg0ZiwweDhmLDB4NTUsMHg4NSwweGZhLDB4MWYsCi0gICAweGUwLDB4ODUsMHhkZiwweGZiLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMCB9fSwKLSB7ezB4N2YsMHg2MywweDgzLDB4NjksMHgxOSwweDcyLDB4ZjAsCi0gICAweDU4LDB4OGMsMHg1NywweDczLDB4MjAsMHgwMCwweDA2LAotICAgMHgwMSB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTgwMHg2MDBfMV9IW10gPQotewotIHt7MHg0MywweDI3LDB4ODcsMHgyZCwweDFkLDB4YWEsMHgxZiwKLSAgIDB4OTAsMHg4NSwweDhmLDB4YWIsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwIH19LAotIHt7MHg0MywweDI3LDB4ODcsMHgyZCwweDFkLDB4NzgsMHgxZiwKLSAgIDB4NWUsMHg4MywweDVkLDB4NzksMHgxMCwweDAwLDB4MDUsCi0gICAweDAwIH19LAotIHt7MHg0MywweDI3LDB4ODcsMHgyZCwweDFkLDB4ZmEsMHgxZiwKLSAgIDB4ZTAsMHg4NSwweGRmLDB4ZmIsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwIH19LAotIHt7MHg0MywweDI3LDB4ODcsMHgyZCwweDFkLDB4NzgsMHgxZiwKLSAgIDB4NWUsMHg4MywweDVkLDB4NzksMHgxMCwweDAwLDB4MDUsCi0gICAweDAwIH19LAotIHt7MHg0MywweDI3LDB4ODcsMHgyZCwweDFkLDB4ZmEsMHgxZiwKLSAgIDB4ZTAsMHg4NSwweGRmLDB4ZmIsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwIH19LAotIHt7MHg0ZCwweDMxLDB4OTEsMHgzNywweDA3LDB4NzIsMHhmMCwKLSAgIDB4NTgsMHg4ZCwweDU3LDB4NzMsMHgyMCwweDAwLDB4MDEsCi0gICAweDAxIH19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxODAweDYwMF8yW109Ci17Ci0ge3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotICAgMHhmZiwweDg0LDB4OGYsMHg3MywweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDAgfX0sCi0ge3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotICAgMHhlNiwweDhiLDB4NWQsMHg3MywweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDAgfX0sCi0ge3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotICAgMHhmZiwweDg0LDB4OGYsMHg3MywweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDAgfX0sCi0ge3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotICAgMHhlNiwweDhiLDB4NWQsMHg3MywweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDAgfX0sCi0ge3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweGJhLAotICAgMHgyNywweDhjLDB4ZGYsMHg3MywweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDAgfX0sCi0ge3sweDdmLDB4NjMsMHg4MywweDY5LDB4MTksMHg3MiwweGYwLAotICAgMHg1OCwweDhkLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDE4MDB4NjAwXzJfSFtdID0KLXsKLSB7ezB4NTcsMHgyNywweDliLDB4M2EsMHgwYSwweDcyLDB4M2UsCi0gICAweGZmLDB4ODQsMHg4ZiwweDczLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMCB9fSwKLSB7ezB4NTcsMHgyNywweDliLDB4M2EsMHgwYSwweDcyLDB4M2UsCi0gICAweGQ2LDB4OGIsMHg1ZCwweDczLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMCB9fSwKLSB7ezB4NTcsMHgyNywweDliLDB4M2EsMHgwYSwweDcyLDB4M2UsCi0gICAweGZmLDB4ODQsMHg4ZiwweDczLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMCB9fSwKLSB7ezB4NTcsMHgyNywweDliLDB4M2EsMHgwYSwweDcyLDB4M2UsCi0gICAweGQ2LDB4OGIsMHg1ZCwweDczLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMCB9fSwKLSB7ezB4NTcsMHgyNywweDliLDB4M2EsMHgwYSwweDcyLDB4YmEsCi0gICAweDI3LDB4OGMsMHhkZiwweDczLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMCB9fSwKLSB7ezB4NGQsMHgzMSwweDkxLDB4M2EsMHgwYSwweDcyLDB4ZjAsCi0gICAweDYzLDB4ODgsMHg1NywweDczLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMSB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTEwMjR4NzY4XzFbXSA9Ci17Ci0ge3sweDczLDB4NGYsMHg5NywweDUzLDB4ODQsMHhiNCwweDFmLAotICAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NzMsMHg0ZiwweDk3LDB4NTMsMHg4NCwweDgyLDB4MWYsCi0gICAweDYwLDB4ODcsMHg1ZCwweDgzLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg3MywweDRmLDB4OTcsMHg1MywweDg0LDB4YjQsMHgxZiwKLSAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDczLDB4NGYsMHg5NywweDUzLDB4ODQsMHg4MiwweDFmLAotICAgMHg2MCwweDg3LDB4NWQsMHg4MywweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NzMsMHg0ZiwweDk3LDB4NTMsMHg4NCwweDA0LDB4M2UsCi0gICAweEUyLDB4ODksMHhEZiwweDA1LDB4MDAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg4NywweDYzLDB4OEIsMHg2NywweDE4LDB4N2MsMHhmMCwKLSAgIDB4NUEsMHg4MSwweDU3LDB4N0QsMHgwMCwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweEEzLDB4N2YsMHg4NywweDgzLDB4OTQsMHgyNCwweGY1LAotICAgMHgwMiwweDg5LDB4RmYsMHgyNSwweDEwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTEwMjR4NzY4XzFfSFtdID0KLXsKLSB7ezB4NGIsMHgyNywweDhmLDB4MmIsMHgxYywweGI0LDB4MWYsCi0gICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMCB9fSwKLSB7ezB4NGIsMHgyNywweDhmLDB4MmIsMHgxYywweDgyLDB4MWYsCi0gICAweDYwLDB4ODcsMHg1RCwweDgzLDB4MDEsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg0YiwweDI3LDB4OGYsMHgyYiwweDFjLDB4YjQsMHgxZiwKLSAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDRiLDB4MjcsMHg4ZiwweDJiLDB4MWMsMHg4MiwweDFmLAotICAgMHg2MCwweDg3LDB4NUQsMHg4MywweDAxLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NGIsMHgyNywweDhmLDB4MmIsMHgxYywweDA0LDB4M2UsCi0gICAweEUyLDB4ODksMHhEZiwweDA1LDB4MDAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1NSwweDMxLDB4OTksMHgzNSwweDA2LDB4N2MsMHhmMCwKLSAgIDB4NUEsMHg4MSwweDU3LDB4N0QsMHgwMCwweDAwLDB4MDEsCi0gICAweDAxfX0sCi0ge3sweDYzLDB4M0YsMHg4NywweDQzLDB4OTQsMHgyNCwweGY1LAotICAgMHgwMiwweDg5LDB4RmYsMHgyNSwweDEwLDB4MDAsMHgwMSwKLSAgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDExMDI0eDc2OF8yW10gPQotewotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4NTcsMHg4ZSwweDhmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAwIH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4M2UsMHg4NSwweDVkLDB4MjUsMHgxMCwweDAwLDB4MDYsCi0gICAweDAwIH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4NTcsMHg4ZSwweDhmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAwIH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4M2UsMHg4NSwweDVkLDB4MjUsMHgxMCwweDAwLDB4MDYsCi0gICAweDAxIH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4N2YsMHg4NiwweGRmLDB4MjUsMHgxMCwweDAwLDB4MDYsCi0gICAweDAwIH19LAotIHt7MHhhMywweDYzLDB4ODcsMHg3OCwweDg5LDB4MjQsMHhmMSwKLSAgIDB4YmIsMHg4MiwweDU3LDB4MjUsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxIH19LAotIHt7MHhhMywweDdmLDB4ODcsMHg4MywweDk0LDB4MjQsMHhmNSwKLSAgIDB4MDIsMHg4OSwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxIH19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxMTAyNHg3NjhfMl9IW10gPQotewotIHt7MHg3YiwweDI3LDB4OWYsMHg0NiwweDk3LDB4MjQsMHhiYiwKLSAgIDB4NTcsMHg4ZSwweDhmLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwIH19LAotIHt7MHg3YiwweDI3LDB4OWYsMHg0NiwweDk3LDB4MjQsMHhiYiwKLSAgIDB4M2UsMHg4NSwweDVkLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAwIH19LAotIHt7MHg3YiwweDI3LDB4OWYsMHg0NiwweDk3LDB4MjQsMHhiYiwKLSAgIDB4NTcsMHg4ZSwweDhmLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwIH19LAotIHt7MHg3YiwweDI3LDB4OWYsMHg0NiwweDk3LDB4MjQsMHhiYiwKLSAgIDB4M2UsMHg4NSwweDVkLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAwIH19LAotIHt7MHg3YiwweDI3LDB4OWYsMHg0NiwweDk3LDB4MjQsMHhiYiwKLSAgIDB4N2YsMHg4NiwweGRmLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAwIH19LAotIHt7MHg3MSwweDMxLDB4OTUsMHg0NiwweDk3LDB4MjQsMHhmMSwKLSAgIDB4YmIsMHg4MiwweDU3LDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAxIH19LAotIHt7MHg2MywweDNmLDB4ODcsMHg0NiwweDk3LDB4MjQsMHhmNSwKLSAgIDB4MGYsMHg4NiwweGZmLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAxIH19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxMTI4MHgxMDI0XzFbXSA9Ci17Ci0ge3sweDdlLDB4NGYsMHg4MiwweDU4LDB4MDQsMHhiOCwweDFmLAotICAgMHg5MCwweDg0LDB4OGYsMHhiOSwweDMwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4N2UsMHg0ZiwweDgyLDB4NTgsMHgwNCwweDg2LDB4MWYsCi0gICAweDVlLDB4ODIsMHg1ZCwweDg3LDB4MTAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHg3ZSwweDRmLDB4ODIsMHg1OCwweDA0LDB4YjgsMHgxZiwKLSAgIDB4OTAsMHg4NCwweDhmLDB4YjksMHgzMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweDdlLDB4NGYsMHg4MiwweDU4LDB4MDQsMHg4NiwweDFmLAotICAgMHg1ZSwweDgyLDB4NWQsMHg4NywweDEwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4N2UsMHg0ZiwweDgyLDB4NTgsMHgwNCwweDA4LDB4M2UsCi0gICAweGUwLDB4ODQsMHhkZiwweDA5LDB4MDAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHg5MiwweDYzLDB4OTYsMHg2YywweDE4LDB4ODAsMHhmMCwKLSAgIDB4NTgsMHg4YywweDU3LDB4ODEsMHgyMCwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweGFlLDB4N2YsMHg5MiwweDg4LDB4OTQsMHgyOCwweGY1LAotICAgMHgwMCwweDg0LDB4ZmYsMHgyOSwweDEwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg5ZiwweDkyLDB4YTgsMHgxNCwweDI4LDB4NWEsCi0gICAweDAwLDB4ODQsMHhmZiwweDI5LDB4MDksMHgwMCwweDA3LAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxMTI4MHgxMDI0XzFfSFtdID0KLXsKLSB7ezB4NTYsMHgyNywweDlhLDB4MzEsMHgxYywweGI4LDB4MWYsCi0gICAweDkwLDB4ODQsMHg4ZiwweGI5LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1NiwweDI3LDB4OWEsMHgzMSwweDFjLDB4ODYsMHgxZiwKLSAgIDB4NWUsMHg4MiwweDVkLDB4ODcsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDU2LDB4MjcsMHg5YSwweDMxLDB4MWMsMHhiOCwweDFmLAotICAgMHg5MCwweDg0LDB4OGYsMHhiOSwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NTYsMHgyNywweDlhLDB4MzEsMHgxYywweDg2LDB4MWYsCi0gICAweDVlLDB4ODIsMHg1ZCwweDg3LDB4MTAsMHgwMCwweDA1LAotICAgMHgwMX19LAotIHt7MHg1NiwweDI3LDB4OWEsMHgzMSwweDFjLDB4MDgsMHgzZSwKLSAgIDB4ZTAsMHg4NCwweGRmLDB4MDksMHgwMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDYwLDB4MzEsMHg4NCwweDNhLDB4ODYsMHg4MCwweGYwLAotICAgMHg1OCwweDhjLDB4NTcsMHg4MSwweDIwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NmUsMHgzZiwweDkyLDB4NDgsMHg5NCwweDI4LDB4ZjUsCi0gICAweDAwLDB4ODQsMHhmZiwweDI5LDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxMTI4MHgxMDI0XzJbXSA9Ci17Ci0ge3sweGNlLDB4NzIsMHg5MSwweDgxLDB4OGYsMHgyOCwweDkyLAotICAgMHhjOCwweDhjLDB4NWQsMHg1YywweDAxLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg3MiwweDkxLDB4ODEsMHg4ZiwweDI4LDB4OTIsCi0gICAweGFmLDB4ODMsMHg0NCwweDQzLDB4MjEsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhjZSwweDcyLDB4OTEsMHg4MSwweDhmLDB4MjgsMHg5MiwKLSAgIDB4YzgsMHg4YywweDVkLDB4NWMsMHgwMSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4NzIsMHg5MSwweDgxLDB4OGYsMHgyOCwweDkyLAotICAgMHhhZiwweDgzLDB4NDQsMHg0MywweDIxLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg3MiwweDkxLDB4ODEsMHg4ZiwweDI4LDB4OTIsCi0gICAweGYwLDB4ODQsMHg4NSwweDg0LDB4MTEsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhjZSwweDYzLDB4OTIsMHg4YiwweDE5LDB4MjgsMHhkNCwKLSAgIDB4M2YsMHg4MywweDU3LDB4MjksMHgwMSwweDAwLDB4MDMsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4N2YsMHg5MiwweDk5LDB4MDcsMHgyOCwweGQ0LAotICAgMHg5MywweDg3LDB4ZmYsMHgyOSwweDIxLDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg5ZiwweDkyLDB4YTgsMHgxNCwweDI4LDB4NWEsCi0gICAweDAwLDB4ODQsMHhmZiwweDI5LDB4MDksMHgwMCwweDA3LAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxMTI4MHgxMDI0XzJfSFtdID0KLXsKLSB7ezB4YTYsMHg0YSwweDg5LDB4NTksMHgwNywweDI4LDB4OTIsCi0gICAweGM4LDB4OGMsMHg1ZCwweDVjLDB4MDEsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhhNiwweDRhLDB4ODksMHg1OSwweDA3LDB4MjgsMHg5MiwKLSAgIDB4YWYsMHg4MywweDQ0LDB4NDMsMHgyMSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweGE2LDB4NGEsMHg4OSwweDU5LDB4MDcsMHgyOCwweDkyLAotICAgMHhjOCwweDhjLDB4NWQsMHg1YywweDAxLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4YTYsMHg0YSwweDg5LDB4NTksMHgwNywweDI4LDB4OTIsCi0gICAweGZhLDB4ODMsMHg0NCwweDQzLDB4MzEsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhhNiwweDRhLDB4ODksMHg1OSwweDA3LDB4MjgsMHg5MiwKLSAgIDB4ZjAsMHg4NCwweDg1LDB4ODQsMHgxMSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweDljLDB4MzEsMHg4MCwweDU5LDB4ODcsMHgyOCwweGQ0LAotICAgMHgzZiwweDgzLDB4NTcsMHgyOSwweDAxLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4OGUsMHgzZiwweDkyLDB4NTksMHgwNywweDI4LDB4ZDQsCi0gICAweDkzLDB4ODcsMHhmZiwweDI5LDB4MjEsMHgwMCwweDA2LAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxMTQwMHgxMDUwXzFbXSA9Ci17Ci0gIHt7MHg2ZiwweDRmLDB4OTMsMHg1NCwweDgyLDB4OWUsMHgxZiwKLSAgICAweDhmLDB4ODEsMHg4ZiwweDlmLDB4MzAsMHgwMCwweDA1LAotICAgIDB4MDB9fSwKLSAge3sweDZmLDB4NGYsMHg5MywweDU0LDB4ODIsMHg2YywweDFmLAotICAgIDB4NWUsMHg4MSwweDVkLDB4NmQsMHgxMCwweDAwLDB4MDUsCi0gICAgMHgwMH19LAotICB7ezB4NmYsMHg0ZiwweDkzLDB4NTQsMHg4MiwweDllLDB4MWYsCi0gICAgMHg5MCwweDgzLDB4OGYsMHg5ZiwweDMwLDB4MDAsMHgwNSwKLSAgICAweDAwfX0sCi0gIHt7MHg2ZiwweDRmLDB4OTMsMHg1NCwweDgyLDB4NmMsMHgxZiwKLSAgICAweDYwLDB4ODQsMHg1ZCwweDZkLDB4MTAsMHgwMCwweDA1LAotICAgIDB4MDB9fSwKLSAge3sweDZmLDB4NGYsMHg5MywweDU0LDB4ODIsMHhlZSwweDFmLAotICAgIDB4ZGYsMHg4MiwweGRmLDB4ZWYsMHgxMCwweDAwLDB4MDUsCi0gICAgMHgwMH19LAotICB7ezB4ODMsMHg2MywweDg3LDB4NjgsMHgxNiwweDY2LDB4ZjAsCi0gICAgMHg1NywweDhlLDB4NTcsMHg2NywweDIwLDB4MDAsMHgwNiwKLSAgICAweDAxfX0sCi0gIHt7MHg5ZiwweDdmLDB4ODMsMHg4NCwweDkyLDB4MGUsMHhmMSwKLSAgICAweGZmLDB4ODYsMHhmZiwweDBmLDB4MTAsMHgwMCwweDAyLAotICAgIDB4MDEsfX0sCi0gIHt7MHhiZiwweDlmLDB4ODMsMHhhNCwweDEyLDB4MGUsMHhkZSwKLSAgICAweGZmLDB4ODYsMHhmZiwweDBmLDB4MDEsMHgwMCwweDA3LAotICAgIDB4MDF9fSwKLSAge3sweGNlLDB4YWUsMHg5MiwweGIzLDB4MDEsMHgyOCwweDEwLAotICAgIDB4MTksMHg4MCwweDE5LDB4MjksMHgwZiwweDAwLDB4MDMsCi0gICAgMHgwMH19Ci0jaWYgMAotIHt7MHg2ZiwweDRmLDB4OTMsMHg1NCwweDgyLDB4OWUsMHgxZiwKLSAgIDB4OTMsMHg4NiwweDhmLDB4OWYsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDZmLDB4NGYsMHg5MywweDU0LDB4ODIsMHg2YywweDFmLAotICAgMHg2MCwweDg0LDB4NWQsMHg2ZCwweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NmYsMHg0ZiwweDkzLDB4NTQsMHg4MiwweDllLDB4MWYsCi0gICAweDkzLDB4ODYsMHg4ZiwweDlmLDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg2ZiwweDRmLDB4OTMsMHg1NCwweDgyLDB4NmMsMHgxZiwKLSAgIDB4NjAsMHg4NCwweDVkLDB4NmQsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDZmLDB4NGYsMHg5MywweDU0LDB4ODIsMHhlZSwweDFmLAotICAgMHhlMiwweDg2LDB4ZGYsMHhlZiwweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4ODMsMHg2MywweDg3LDB4NjgsMHgxNiwweDY2LDB4ZjAsCi0gICAweDVhLDB4OGUsMHg1NywweDY3LDB4MjAsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHg5ZiwweDdmLDB4ODMsMHg4NCwweDkyLDB4MGUsMHhmNSwKLSAgIDB4MDIsMHg4NiwweGZmLDB4MGYsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGJmLDB4OWYsMHg4MywweGE0LDB4MTIsMHgwZSwweDVhLAotICAgMHgwMiwweDg2LDB4ZmYsMHgwZiwweDA5LDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHhhZSwweDkyLDB4YjMsMHgwMSwweDI4LDB4MTAsCi0gICAweDFhLDB4ODAsMHgxOSwweDI5LDB4MGYsMHgwMCwweDAzLAotICAgMHgwMH19Ci0jZW5kaWYgICAKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDExNDAweDEwNTBfMV9IW10gPQotewotIHt7MHg0NywweDI3LDB4OGIsMHgyYywweDFhLDB4OWUsMHgxZiwKLSAgIDB4OGYsMHg4MSwweDhmLDB4OWYsMHgzMCwweDAwLDB4MDUsCi0gIDB4MDB9fSwKLSB7ezB4NDcsMHgyNywweDhiLDB4MmMsMHgxYSwweDZjLDB4MWYsCi0gICAweDYwLDB4ODQsMHg1ZCwweDZkLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg0NywweDI3LDB4OGIsMHgzMCwweDFlLDB4OWUsMHgxZiwKLSAgIDB4OTAsMHg4MywweDhmLDB4OWYsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDQ3LDB4MjcsMHg4YiwweDJjLDB4MWEsMHg2YywweDFmLAotICAgMHg2MCwweDg0LDB4NWQsMHg2ZCwweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NDcsMHgyNywweDhiLDB4MmMsMHgxYSwweGVlLDB4MWYsCi0gICAweGRmLDB4ODYsMHhkZiwweGVmLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1MSwweDMxLDB4OTUsMHgzNiwweDA0LDB4NjYsMHhmMCwKLSAgIDB4NTcsMHg4ZSwweDU3LDB4NjcsMHgyMCwweDAwLDB4MDEsCi0gICAweDAxfX0sCi0ge3sweDVmLDB4M2YsMHg4MywweDQ0LDB4OTIsMHgwZSwweGYxLAotICAgMHhmZiwweDg2LDB4ZmYsMHgwZiwweDEwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NmYsMHg0ZiwweDkzLDB4NTQsMHg4MiwweDBlLDB4NWEsCi0gICAweDAyLDB4ODYsMHhmZiwweDBmLDB4MDksMHgwMCwweDA1LAotICAgMHgwMX19LAotIHt7MHg3NiwweDU2LDB4OWEsMHg1YiwweDg5LDB4MjgsMHgxMCwKLSAgIDB4MWMsMHg4MCwweDE5LDB4MjksMHgwYiwweDAwLDB4MDUsCi0gICAweDAwfX0KLSNpZiAwCi0ge3sweDQ3LDB4MjcsMHg4YiwweDJjLDB4MWEsMHg5ZSwweDFmLAotICAgMHg5MywweDg2LDB4OGYsMHg5ZiwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NDcsMHgyNywweDhiLDB4MmMsMHgxYSwweDZjLDB4MWYsCi0gICAweDYwLDB4ODQsMHg1ZCwweDZkLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg0NywweDI3LDB4OGIsMHgzMCwweDFlLDB4OWUsMHgxZiwKLSAgIDB4OTIsMHg4NiwweDhmLDB4OWYsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDQ3LDB4MjcsMHg4YiwweDJjLDB4MWEsMHg2YywweDFmLAotICAgMHg2MCwweDg0LDB4NWQsMHg2ZCwweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NDcsMHgyNywweDhiLDB4MmMsMHgxYSwweGVlLDB4MWYsCi0gICAweGUyLDB4ODYsMHhkZiwweGVmLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1MSwweDMxLDB4OTUsMHgzNiwweDA0LDB4NjYsMHhmMCwKLSAgIDB4NWEsMHg4ZSwweDU3LDB4NjcsMHgyMCwweDAwLDB4MDEsCi0gICAweDAxfX0sCi0ge3sweDVmLDB4M2YsMHg4MywweDQ0LDB4OTIsMHgwZSwweGY1LAotICAgMHgwMiwweDg2LDB4ZmYsMHgwZiwweDEwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NmYsMHg0ZiwweDkzLDB4NTQsMHg4MiwweDBlLDB4NWEsCi0gICAweDAyLDB4ODYsMHhmZiwweDBmLDB4MDksMHgwMCwweDA1LAotICAgMHgwMX19LAotIHt7MHg3NiwweDU2LDB4OWEsMHg1YiwweDg5LDB4MjgsMHgxMCwKLSAgIDB4MWMsMHg4MCwweDE5LDB4MjksMHgwYiwweDAwLDB4MDUsCi0gICAweDAwfX0KLSNlbmRpZiAgIAotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTE0MDB4MTA1MF8yW10gPQotewotIHt7MHhjZSwweDcyLDB4OTEsMHg4NCwweDkyLDB4MjgsMHg5MiwKLSAgIDB4ZDcsMHg4YiwweDVkLDB4NWMsMHgyMSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4NzIsMHg5MSwweDg0LDB4OTIsMHgyOCwweDkyLAotICAgMHhiZSwweDgyLDB4NDQsMHg0MywweDAxLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg3MiwweDkxLDB4ODQsMHg5MiwweDI4LDB4OTIsCi0gICAweGQ3LDB4OGIsMHg1ZCwweDVjLDB4MjEsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhjZSwweDcyLDB4OTEsMHg4NCwweDkyLDB4MjgsMHg5MiwKLSAgIDB4YmUsMHg4MiwweDQ0LDB4NDMsMHgwMSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4NzIsMHg5MSwweDg0LDB4OTIsMHgyOCwweDkyLAotICAgMHhmZiwweDgzLDB4ODUsMHg4NCwweDExLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg2MywweDkyLDB4OGUsMHgxYywweDI4LDB4ZDQsCi0gICAweDNmLDB4ODMsMHg1NywweDI5LDB4MDEsMHgwMCwweDAzLAotICAgMHgwMX19LAotIHt7MHhjZSwweDdmLDB4OTIsMHg5YywweDBhLDB4MjgsMHhkNCwKLSAgIDB4OTMsMHg4NywweGZmLDB4MjksMHgyMSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4OWYsMHg5MiwweGFjLDB4MWEsMHgyOCwweDVhLAotICAgMHgxMywweDg3LDB4ZmYsMHgyOSwweDI5LDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHhhZSwweDkyLDB4YmMsMHgwYSwweDI4LDB4MTAsCi0gICAweDIwLDB4ODQsMHgxOSwweDI5LDB4MGYsMHgwMCwweDAzLAotICAgMHgwMH19Ci0jaWYgMAotIHt7MHhjZSwweDRmLDB4OTIsMHg4YywweDFhLDB4MjgsMHg5YSwKLSAgIDB4ZGIsMHg4ZiwweDhmLDB4MjksMHgyMSwweDAwLDB4MDMsCi0gICAweDAwfX0sCi0ge3sweGNlLDB4NGYsMHg5MiwweDhjLDB4MWEsMHgyOCwweDlhLAotICAgMHhjMiwweDg2LDB4NWQsMHgyOSwweDAxLDB4MDAsMHgwMywKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg0ZiwweDkyLDB4OGMsMHgxYSwweDI4LDB4OWEsCi0gICAweGRiLDB4OGYsMHg4ZiwweDI5LDB4MjEsMHgwMCwweDAzLAotICAgMHgwMH19LAotIHt7MHhjZSwweDRmLDB4OTIsMHg4YywweDFhLDB4MjgsMHg5YSwKLSAgIDB4YzIsMHg4NiwweDVkLDB4MjksMHgwMSwweDAwLDB4MDMsCi0gICAweDAwfX0sCi0ge3sweGNlLDB4NGYsMHg5MiwweDhjLDB4MWEsMHgyOCwweDllLAotICAgMHgwMywweDg3LDB4ZGYsMHgyOSwweDAxLDB4MDAsMHgwMywKLSAgIDB4MDB9fSwKLSB7ezB4Y2UsMHg2MywweDkyLDB4OTYsMHgwNCwweDI4LDB4ZDQsCi0gICAweDNmLDB4ODMsMHg1NywweDI5LDB4MDEsMHgwMCwweDA3LAotICAgMHgwMX19LAotIHt7MHhjZSwweDdmLDB4OTIsMHhhNCwweDEyLDB4MjgsMHhkNCwKLSAgIDB4OTMsMHg4NywweGZmLDB4MjksMHgyMSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4OWYsMHg5MiwweGI0LDB4MDIsMHgyOCwweDVhLAotICAgMHgxMywweDg3LDB4ZmYsMHgyOSwweDI5LDB4MDAsMHgwMywKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHhhZSwweDkyLDB4YmMsMHgwYSwweDI4LDB4MTAsCi0gICAweDIwLDB4ODQsMHgxOSwweDI5LDB4MGYsMHgwMCwweDAzLAotICAgMHgwMH19Ci0jZW5kaWYgICAKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDExNDAweDEwNTBfMl9IW10gPQotewotIHt7MHhhNiwweDRhLDB4ODksMHg1YywweDBhLDB4MjgsMHg5MiwKLSAgIDB4ZDcsMHg4YiwweDVkLDB4NWMsMHgyMSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweGE2LDB4NGEsMHg4OSwweDVjLDB4MGEsMHgyOCwweDkyLAotICAgMHhiZSwweDgyLDB4NDQsMHg0MywweDAxLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4YTYsMHg0YSwweDg5LDB4NWMsMHgwYSwweDI4LDB4OTIsCi0gICAweGQ3LDB4OGIsMHg1ZCwweDVjLDB4MjEsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhhNiwweDRhLDB4ODksMHg1YywweDBhLDB4MjgsMHg5MiwKLSAgIDB4YmUsMHg4MiwweDQ0LDB4NDMsMHgwMSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweGE2LDB4NGEsMHg4OSwweDVjLDB4MGEsMHgyOCwweDkyLAotICAgMHhmZiwweDgzLDB4ODUsMHg4NCwweDExLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4OWMsMHgzMSwweDgwLDB4NWMsMHg4YSwweDI4LDB4ZDQsCi0gICAweDNmLDB4ODMsMHg1NywweDI5LDB4MDEsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHg4ZSwweDNmLDB4OTIsMHg1YywweDBhLDB4MjgsMHhkNCwKLSAgIDB4OTMsMHg4NywweGZmLDB4MjksMHgyMSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweDdlLDB4NGYsMHg4MiwweDVjLDB4MGEsMHgyOCwweDVhLAotICAgMHgxMywweDg3LDB4ZmYsMHgyOSwweDI5LDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4NzYsMHg1NiwweDlhLDB4NjQsMHg5MiwweDI4LDB4MTAsCi0gICAweDIwLDB4ODQsMHgxOSwweDI5LDB4MGYsMHgwMCwweDA1LAotICAgMHgwMH19Ci0jaWYgMAotIHt7MHhhNiwweDI3LDB4OGEsMHg2NCwweDkyLDB4MjgsMHg5YSwKLSAgIDB4ZGIsMHg4ZiwweDhmLDB4MjksMHgyMSwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweGE2LDB4MjcsMHg4YSwweDY0LDB4OTIsMHgyOCwweDlhLAotICAgMHhjMiwweDg2LDB4NWQsMHgyOSwweDAxLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4YTYsMHgyNywweDhhLDB4NjQsMHg5MiwweDI4LDB4OWEsCi0gICAweGRiLDB4OGYsMHg4ZiwweDI5LDB4MjEsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHhhNiwweDI3LDB4OGEsMHg2NCwweDkyLDB4MjgsMHg5YSwKLSAgIDB4YzIsMHg4NiwweDVkLDB4MjksMHgwMSwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweGE2LDB4MjcsMHg4YSwweDY0LDB4OTIsMHgyOCwweDllLAotICAgMHgwMywweDg3LDB4ZGYsMHgyOSwweDAxLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4OWMsMHgzMSwweDgwLDB4NjQsMHg5MiwweDI4LDB4ZDQsCi0gICAweDNmLDB4ODMsMHg1NywweDI5LDB4MDEsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHg4ZSwweDNmLDB4OTIsMHg2NCwweDEyLDB4MjgsMHhkNCwKLSAgIDB4OTMsMHg4NywweGZmLDB4MjksMHgyMSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweDdlLDB4NGYsMHg4MiwweDY0LDB4MTIsMHgyOCwweDVhLAotICAgMHgxMywweDg3LDB4ZmYsMHgyOSwweDI5LDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4NzYsMHg1NiwweDlhLDB4NjQsMHg5MiwweDI4LDB4MTAsCi0gICAweDIwLDB4ODQsMHgxOSwweDI5LDB4MGYsMHgwMCwweDA1LAotICAgMHgwMH19Ci0jZW5kaWYgICAKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDExNjAweDEyMDBfMVtdID0KLXsKLSB7ezB4ODMsMHg0RiwweDg3LDB4NUIsMHgxMywweDA2LDB4M0UsCi0gICAweEIzLDB4ODYsMHg4RiwweDA3LDB4MjAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHg4MywweDRGLDB4ODcsMHg1QiwweDEzLDB4RDQsMHgxRiwKLSAgIDB4ODEsMHg4NCwweDVELDB4RDUsMHgxMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweDgzLDB4NEYsMHg4NywweDVCLDB4MTMsMHgwNiwweDNFLAotICAgMHhCMywweDg2LDB4OEYsMHgwNywweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4ODMsMHg0RiwweDg3LDB4NUIsMHgxMywweEQ0LDB4MUYsCi0gICAweDgxLDB4ODQsMHg1RCwweEQ1LDB4MTAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHg4MywweDRGLDB4ODcsMHg1QiwweDEzLDB4NTYsMHhCQSwKLSAgIDB4MDMsMHg4NiwweERGLDB4NTcsMHgwMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweDk3LDB4NjMsMHg5QiwweDZGLDB4MDcsMHhDRSwweEYwLAotICAgMHg3QiwweDhFLDB4NTcsMHhDRiwweDIwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4QjMsMHg3RiwweDk3LDB4OEIsMHg4MywweDc2LDB4RjUsCi0gICAweDIzLDB4ODYsMHhGRiwweDc3LDB4MTAsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhEMywweDlGLDB4OTcsMHhBQiwweDAzLDB4NzYsMHg1QSwKLSAgIDB4MjMsMHg4NiwweEZGLDB4NzcsMHgwOSwweDAwLDB4MDMsCi0gICAweDAxfX0sCi0ge3sweEUyLDB4QUUsMHg4NiwweEJBLDB4OTIsMHg5MCwweDEwLAotICAgMHgzRCwweDgwLDB4MTksMHg5MSwweDBGLDB4MDAsMHgwMywKLSAgIDB4MDB9fSwKLSB7ezB4RkIsMHhDNywweDlGLDB4RDMsMHg4QiwweDI2LDB4MTEsCi0gICAweEQzLDB4ODYsMHhBRiwweDI3LDB4M0YsMHgwMCwweDA3LAotICAgMHgwMH19Ci0jaWYgMAotIHt7MHg4MywweDRmLDB4ODcsMHg1MSwweDA5LDB4YzAsMHgxZiwKLSAgIDB4OTAsMHg4NCwweDhmLDB4YzEsMHgzMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweDgzLDB4NGYsMHg4NywweDUxLDB4MDksMHg4ZSwweDFmLAotICAgMHg1ZSwweDgyLDB4NWQsMHg4ZiwweDEwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4ODMsMHg0ZiwweDg3LDB4NTEsMHgwOSwweGMwLDB4MWYsCi0gICAweDkwLDB4ODQsMHg4ZiwweGMxLDB4MzAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHg4MywweDRmLDB4ODcsMHg1MSwweDA5LDB4OGUsMHgxZiwKLSAgIDB4NWUsMHg4MiwweDVkLDB4OGYsMHgxMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweDgzLDB4NGYsMHg4NywweDUxLDB4MDksMHgxMCwweDNlLAotICAgMHhlMCwweDg0LDB4ZGYsMHgxMSwweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4OTcsMHg2MywweDliLDB4NjUsMHgxZCwweDg4LDB4ZjAsCi0gICAweDU4LDB4OGMsMHg1NywweDg5LDB4MjAsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhiMywweDdmLDB4OTcsMHg4MSwweDk5LDB4MzAsMHhmNSwKLSAgIDB4MDAsMHg4NCwweGZmLDB4MzEsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGQzLDB4OWYsMHg5NywweGExLDB4MTksMHgzMCwweDVhLAotICAgMHgwMCwweDg0LDB4ZmYsMHgzMSwweDA5LDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4ZTIsMHhhZSwweDg2LDB4YjAsMHg4OCwweDRhLDB4MTAsCi0gICAweDFhLDB4OGUsMHgxOSwweDRiLDB4MmYsMHgwMCwweDAzLAotICAgMHgwMH19LAotIHt7MHhmYiwweGM3LDB4OWYsMHhjOSwweDgxLDB4ZTAsMHgxMCwKLSAgIDB4YjAsMHg4NCwweGFmLDB4ZTEsMHgyZiwweDAwLDB4MDcsCi0gICAweDAwfX0KLSNlbmRpZgotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTE2MDB4MTIwMF8xX0hbXSA9Ci17Ci0ge3sweDVCLDB4MjcsMHg5RiwweDMzLDB4MEIsMHgwNiwweDJFLAotICAgMHhCMywweDg2LDB4OEYsMHgwNywweDIwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NUIsMHgyNywweDlGLDB4MjksMHgwMSwweDhFLDB4MUYsCi0gICAweDgxLDB4ODQsMHg1RCwweEQ1LDB4MTAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHg1QiwweDI3LDB4OUYsMHgzMywweDBCLDB4MDYsMHgyRSwKLSAgIDB4QjMsMHg4NiwweDhGLDB4MDcsMHgyMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDgzLDB4NEYsMHg4NywweDVCLDB4MTMsMHhENCwweDFGLAotICAgMHg4MSwweDg0LDB4NUQsMHhENSwweDEwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4NUIsMHgyNywweDlGLDB4MzMsMHgwQiwweDU2LDB4QkEsCi0gICAweDAzLDB4ODYsMHhERiwweDU3LDB4MDAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg2NSwweDMxLDB4ODksMHgzRCwweDk1LDB4Q0UsMHhGMCwKLSAgIDB4N0IsMHg4RSwweDU3LDB4Q0YsMHgyMCwweDAwLDB4MDEsCi0gICAweDAxfX0sCi0ge3sweDczLDB4M0YsMHg5NywweDRCLDB4ODMsMHg3NiwweEY1LAotICAgMHgyMywweDg2LDB4RkYsMHg3NywweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDF9fSwKLSB7ezB4RDMsMHg5RiwweDk3LDB4QUIsMHgwMywweDc2LDB4NUEsCi0gICAweDIzLDB4ODYsMHhGRiwweDc3LDB4MDksMHgwMCwweDAzLAotICAgMHgwMX19LAotIHt7MHhFMiwweEFFLDB4ODYsMHhCQSwweDkyLDB4OTAsMHgxMCwKLSAgIDB4M0QsMHg4MCwweDE5LDB4OTEsMHgwRiwweDAwLDB4MDMsCi0gICAweDAwfX0sCi0ge3sweDk3LDB4NjMsMHg5QiwweDZGLDB4MDcsMHhFMCwweDEwLAotICAgMHhCMCwweDg0LDB4QUYsMHhFMSwweDJGLDB4MDAsMHgwNiwKLSAgIDB4MDB9fQotI2lmIDAKLSB7ezB4NWIsMHgyNywweDlmLDB4MjksMHgwMSwweGMwLDB4MWYsCi0gICAweDkwLDB4ODQsMHg4ZiwweGMxLDB4MzAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg1YiwweDI3LDB4OWYsMHgyOSwweDAxLDB4OGUsMHgxZiwKLSAgIDB4NWUsMHg4MiwweDVkLDB4OGYsMHgxMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDViLDB4MjcsMHg5ZiwweDI5LDB4MDEsMHhjMCwweDFmLAotICAgMHg5MCwweDg0LDB4OGYsMHhjMSwweDMwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NWIsMHgyNywweDlmLDB4MjksMHgwMSwweDhlLDB4MWYsCi0gICAweDVlLDB4ODIsMHg1ZCwweDhmLDB4MTAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg1YiwweDI3LDB4OWYsMHgyOSwweDAxLDB4MTAsMHgzZSwKLSAgIDB4ZTAsMHg4NCwweGRmLDB4MTEsMHgwMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDY1LDB4MzEsMHg4OSwweDMzLDB4OGIsMHg4OCwweGYwLAotICAgMHg1OCwweDhjLDB4NTcsMHg4OSwweDIwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NzMsMHgzZiwweDk3LDB4NDEsMHg5OSwweDMwLDB4ZjUsCi0gICAweDAwLDB4ODQsMHhmZiwweDMxLDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19LAotIHt7MHg4MywweDRmLDB4ODcsMHg1MSwweDA5LDB4MzAsMHg1YSwKLSAgIDB4MDAsMHg4NCwweGZmLDB4MzEsMHgwOSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweDhhLDB4NTYsMHg4ZSwweDU4LDB4MTAsMHg0YSwweDEwLAotICAgMHgxYSwweDhlLDB4MTksMHg0YiwweDJmLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4OTcsMHg2MywweDliLDB4NjUsMHgxZCwweGUwLDB4MTAsCi0gICAweGIwLDB4ODQsMHhhZiwweGUxLDB4MmYsMHgwMCwweDA2LAotICAgMHgwMH19Ci0jZW5kaWYKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDExNjAweDEyMDBfMltdID0KLXsKLSB7ezB4RkIsMHg4NywweDg2LDB4OTcsMHgwRiwweDI2LDB4OTcsCi0gICAweDQzLDB4ODYsMHhEQiwweERBLDB4MTEsMHgwMCwweDA3LAotICAgMHgwMX19LAotIHt7MHhGQiwweDg3LDB4ODYsMHg5NywweDBGLDB4MjYsMHg5NywKLSAgIDB4MkEsMHg4RCwweEMyLDB4QzEsMHgxMSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweEZCLDB4ODcsMHg4NiwweDk3LDB4MEYsMHgyNiwweDk3LAotICAgMHg0MywweDg2LDB4REIsMHhEQSwweDExLDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4RkIsMHg4NywweDg2LDB4OTcsMHgwRiwweDI2LDB4OTcsCi0gICAweDJBLDB4OEQsMHhDMiwweEMxLDB4MTEsMHgwMCwweDA3LAotICAgMHgwMX19LAotIHt7MHhGQiwweDg3LDB4ODYsMHg5NywweDBGLDB4MjYsMHg5RiwKLSAgIDB4NkIsMHg4RSwweDAzLDB4MDIsMHgwMSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweEZCLDB4NjMsMHg5RiwweEExLDB4OTksMHgyNiwweEQ1LAotICAgMHhBNywweDhBLDB4QkYsMHhCRSwweDAxLDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4RkIsMHg3RiwweDlGLDB4QUYsMHg4NywweDI2LDB4REQsCi0gICAweEZCLDB4OEUsMHgxMywweDEyLDB4MzEsMHgwMCwweDAzLAotICAgMHgwMX19LAotIHt7MHhGQiwweDlGLDB4OUYsMHhCRiwweDk3LDB4MjYsMHg1QiwKLSAgIDB4N0IsMHg4RSwweEZGLDB4MjcsMHgzOSwweDAwLDB4MDMsCi0gICAweDAxfX0sCi0ge3sweEZCLDB4QUUsMHg5RiwweEM2LDB4OUUsMHgyNiwweDExLAotICAgMHg4OCwweDhCLDB4MTksMHgyNywweDFGLDB4MDAsMHgwMywKLSAgIDB4MDB9fSwKLSB7ezB4RkIsMHhDNywweDlGLDB4RDMsMHg4QiwweDI2LDB4MTEsCi0gICAweEQzLDB4ODYsMHhBRiwweDI3LDB4M0YsMHgwMCwweDA3LAotICAgMHgwMH19Ci0jaWYgMAotIHt7MHhmYiwweDg4LDB4ODcsMHg5MCwweDA4LDB4ZTAsMHg5NiwKLSAgIDB4MjAsMHg4NCwweGI5LDB4YjgsMHgwMSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweGZiLDB4ODgsMHg4NywweDkwLDB4MDgsMHhlMCwweDk2LAotICAgMHgwNywweDhiLDB4YTAsMHg5ZiwweDAxLDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4ZmIsMHg4OCwweDg3LDB4OTAsMHgwOCwweGUwLDB4OTYsCi0gICAweDIwLDB4ODQsMHhiOSwweGI4LDB4MDEsMHgwMCwweDA3LAotICAgMHgwMX19LAotIHt7MHhmYiwweDg4LDB4ODcsMHg5MCwweDA4LDB4ZTAsMHg5NiwKLSAgIDB4MDcsMHg4YiwweGEwLDB4OWYsMHgwMSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweGZiLDB4ODgsMHg4NywweDkwLDB4MDgsMHhlMCwweDk2LAotICAgMHg0OCwweDhjLDB4ZTEsMHhlMCwweDExLDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4ZmIsMHg2MywweDlmLDB4OWEsMHg5MiwweGUwLDB4ZDQsCi0gICAweDliLDB4OGYsMHg5ZCwweDljLDB4MjEsMHgwMCwweDA3LAotICAgMHgwMX19LAotIHt7MHhmYiwweDdmLDB4OWYsMHhhOCwweDgwLDB4ZTAsMHhkNCwKLSAgIDB4ZWYsMHg4MywweGZmLDB4ZTEsMHgyMSwweDAwLDB4MDMsCi0gICAweDAxfX0sCi0ge3sweGZiLDB4OWYsMHg5ZiwweGI4LDB4OTAsMHhlMCwweDVhLAotICAgMHg2ZiwweDgzLDB4ZmYsMHhlMSwweDI5LDB4MDAsMHgwMywKLSAgIDB4MDF9fSwKLSB7ezB4ZmIsMHhhZSwweDlmLDB4YmYsMHg5NywweGUwLDB4MTAsCi0gICAweDdjLDB4ODAsMHgxOSwweGUxLDB4MGYsMHgwMCwweDAzLAotICAgMHgwMH19LAotIHt7MHhmYiwweGM3LDB4OWYsMHhjOSwweDg0LDB4ZTAsMHgxMCwKLSAgIDB4YzcsMHg4YiwweGFmLDB4ZTEsMHgwZiwweDAwLDB4MDcsCi0gICAweDAwfX0KLSNlbmRpZgotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTE2MDB4MTIwMF8yX0hbXSA9Ci17Ci0ge3sweEQzLDB4NUYsMHg5RSwweDZGLDB4MDcsMHgyNiwweDk3LAotICAgMHg0MywweDg2LDB4REIsMHhEQSwweDExLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4RDMsMHgyNywweDk3LDB4NkYsMHgwNywweDI2LDB4OTcsCi0gICAweDZCLDB4OEUsMHg4MywweDgyLDB4MDEsMHgwMCwweDAzLAotICAgMHgwMX19LAotIHt7MHhEMywweDVGLDB4OUUsMHg2RiwweDA3LDB4MjYsMHg5NywKLSAgIDB4NDMsMHg4NiwweERCLDB4REEsMHgxMSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweEQzLDB4MjcsMHg5NywweDZGLDB4MDcsMHgyNiwweDk3LAotICAgMHgwNywweDhCLDB4QTAsMHg5RiwweDAxLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4RDMsMHgyNywweDk3LDB4NkYsMHgwNywweDI2LDB4OTcsCi0gICAweDZCLDB4OEUsMHg4MywweDgyLDB4MDEsMHgwMCwweDAzLAotICAgMHgwMX19LAotIHt7MHhDOSwweDMxLDB4OEQsMHg2RiwweDA3LDB4MjYsMHhENSwKLSAgIDB4QTcsMHg4QSwweEJGLDB4QkUsMHgwMSwweDAwLDB4MDMsCi0gICAweDAxfX0sCi0ge3sweEJCLDB4M0YsMHg5RiwweDZGLDB4ODcsMHgyNiwweERELAotICAgMHhGQiwweDhFLDB4MTMsMHgxMiwweDMxLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4QUIsMHg0RiwweDhGLDB4NjgsMHg4MCwweEUwLDB4NUEsCi0gICAweDZGLDB4ODMsMHhGRiwweEUxLDB4MjksMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhBMywweDU2LDB4ODcsMHg2NywweDlGLDB4RTAsMHgxMCwKLSAgIDB4N0MsMHg4MCwweDE5LDB4RTEsMHgwRiwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweDk3LDB4NjMsMHg5QiwweDY4LDB4MDAsMHhFMCwweDEwLAotICAgMHhDNywweDhCLDB4QUYsMHhFMSwweDBGLDB4MDAsMHgwMiwKLSAgIDB4MDB9fQotI2lmIDAKLSB7ezB4ZDMsMHg2MCwweDlmLDB4NjgsMHgwMCwweGUwLDB4OTYsCi0gICAweDIwLDB4ODQsMHhiOSwweGI4LDB4MDEsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhkMywweDYwLDB4OWYsMHg2OCwweDAwLDB4ZTAsMHg5NiwKLSAgIDB4MDcsMHg4YiwweGEwLDB4OWYsMHgwMSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGQzLDB4NjAsMHg5ZiwweDY4LDB4MDAsMHhlMCwweDk2LAotICAgMHgyMCwweDg0LDB4YjksMHhiOCwweDAxLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4ZDMsMHg2MCwweDlmLDB4NjgsMHgwMCwweGUwLDB4OTYsCi0gICAweDA3LDB4OGIsMHhhMCwweDlmLDB4MDEsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhkMywweDYwLDB4OWYsMHg2OCwweDAwLDB4ZTAsMHg5NiwKLSAgIDB4NDgsMHg4YywweGUxLDB4ZTAsMHgxMSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGM5LDB4MzEsMHg4ZCwweDY4LDB4MDAsMHhlMCwweGQ0LAotICAgMHg5YiwweDhmLDB4OWQsMHg5YywweDIxLDB4MDAsMHgwMywKLSAgIDB4MDF9fSwKLSB7ezB4YmIsMHgzZiwweDlmLDB4NjgsMHg4MCwweGUwLDB4ZDQsCi0gICAweGVmLDB4ODMsMHhmZiwweGUxLDB4MjEsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhhYiwweDRmLDB4OGYsMHg2OCwweDgwLDB4ZTAsMHg1YSwKLSAgIDB4NmYsMHg4MywweGZmLDB4ZTEsMHgyOSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGEzLDB4NTYsMHg4NywweDY3LDB4OWYsMHhlMCwweDEwLAotICAgMHg3YywweDgwLDB4MTksMHhlMSwweDBmLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4OTcsMHg2MywweDliLDB4NjgsMHgwMCwweGUwLDB4MTAsCi0gICAweGM3LDB4OGIsMHhhZiwweGUxLDB4MGYsMHgwMCwweDAyLAotICAgMHgwMH19Ci0jZW5kaWYKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDFYWFh4WFhYXzFbXSA9Ci17Ci0ge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHhiZiwweDFmLAotICAgMHg5YywweDhlLDB4OTYsMHhiOSwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweGJmLDB4MWYsCi0gICAweDljLDB4OGUsMHg5NiwweGI5LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4YmYsMHgxZiwKLSAgIDB4OWMsMHg4ZSwweDk2LDB4YjksMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHhiZiwweDFmLAotICAgMHg5YywweDhlLDB4OTYsMHhiOSwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhlNywweDA0LDB4MDAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKLSAgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweGEzLDB4N2YsMHg4NywweDg2LDB4OTcsMHgyNCwweGY1LAotICAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg5ZiwweDkyLDB4YTgsMHgxNCwweDI4LDB4NWEsCi0gICAweDAwLDB4ODQsMHhmZiwweDI5LDB4MDksMHgwMCwweDA3LAotICAgMHgwMX19LAotIHt7MHhjZSwweDlmLDB4OTIsMHhhOSwweDE3LDB4MjQsMHhmNSwKLSAgIDB4MDIsMHg4OCwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDcsCi0gICAweDAxfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDFYWFh4WFhYXzFfSFtdID0KLXsKLSB7ezB4MzgsMHgyNywweDljLDB4MmMsMHg4MCwweGJmLDB4MWYsCi0gICAweDljLDB4OGUsMHg5NiwweGI5LDB4MzAsMHgwMCwweDAwLAotICAgMHgwMH19LAotIHt7MHgzOCwweDI3LDB4OWMsMHgyYywweDgwLDB4YmYsMHgxZiwKLSAgIDB4OWMsMHg4ZSwweDk2LDB4YjksMHgzMCwweDAwLDB4MDAsCi0gICAweDAwfX0sCi0ge3sweDM4LDB4MjcsMHg5YywweDJjLDB4ODAsMHhiZiwweDFmLAotICAgMHg5YywweDhlLDB4OTYsMHhiOSwweDMwLDB4MDAsMHgwMCwKLSAgIDB4MDB9fSwKLSB7ezB4MzgsMHgyNywweDljLDB4MmMsMHg4MCwweGJmLDB4MWYsCi0gICAweDljLDB4OGUsMHg5NiwweGI5LDB4MzAsMHgwMCwweDAwLAotICAgMHgwMH19LAotIHt7MHgzOCwweDI3LDB4OWMsMHgyYywweDgwLDB4MGIsMHgzZSwKLSAgIDB4ZTksMHg4YiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAweDAwfX0sCi0ge3sweDRkLDB4MzEsMHg5MSwweDNiLDB4MDMsMHg3MiwweGYwLAotICAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NjMsMHgzZiwweDg3LDB4NGEsMHg5MiwweDI0LDB4ZjUsCi0gICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19Ci19OwotCi0KIC8qIENSVDEgQ1JUQyBmb3IgQ2hyb250ZWwgVFYgc2xhdmUgbW9kZXMgKi8KIAotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9DSFRWQ1JUMVVOVFNDW10gPQoteyAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YSBTaVMzMTBfQ0hUVkNSVDFVTlRTQ1tdID0KK3sKICB7ezB4NjQsMHg0ZiwweDg4LDB4NTYsMHg5ZiwweDU2LDB4M2UsCiAgICAweGU4LDB4ODQsMHg4ZiwweDU3LDB4MjAsMHgwMCwweDAxLAogICAgMHgwMCB9fSwKQEAgLTI1NDYsNyArMTEzMiw3IEBACiAgICAweDAxfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfQ0hUVkNSVDFPTlRTQ1tdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YSBTaVMzMTBfQ0hUVkNSVDFPTlRTQ1tdID0KIHsKICB7ezB4NjMsMHg0ZiwweDg3LDB4NWEsMHg5ZiwweDBiLDB4M2UsCiAgICAweGMwLDB4ODQsMHg4ZiwweDBjLDB4MjAsMHgwMCwweDAxLApAQCAtMjU3MSw4ICsxMTU3LDggQEAKICAgIDB4MDEgfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfQ0hUVkNSVDFVUEFMW10gPQoteyAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YSBTaVMzMTBfQ0hUVkNSVDFVUEFMW10gPQorewogIHt7MHg3OSwweDRmLDB4OWQsMHg1YSwweDkwLDB4NmYsMHgzZSwKICAgIDB4ZjgsMHg4MywweDhmLDB4NzAsMHgyMCwweDAwLDB4MDUsCiAgICAweDAwIH19LApAQCAtMjU5Niw3ICsxMTgyLDcgQEAKICAgIDB4MDF9fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9DSFRWQ1JUMU9QQUxbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEgU2lTMzEwX0NIVFZDUlQxT1BBTFtdID0KIHsKICB7ezB4NzksMHg0ZiwweDlkLDB4NWEsMHg5MCwweDZmLDB4M2UsCiAgICAweGYwLDB4ODMsMHg4ZiwweDcwLDB4MjAsMHgwMCwweDA1LApAQCAtMjYyMSw4ICsxMjA3LDcgQEAKICAgIDB4MDEgfX0KIH07CiAKLQotc3RhdGljIGNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCBTaVMzMTBfQ0hUVlJlZ19VTlRTQ1tdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0NIVFZSZWdEYXRhIFNpUzMxMF9DSFRWUmVnX1VOVFNDW10gPQogewogIHt7MHg0YSwweDc3LDB4YmIsMHg5NCwweDg0LDB4NDgsMHhmZSwweDUwLDB4MDQsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMX19LAogIHt7MHg0YSwweDc3LDB4YmIsMHg5NCwweDg0LDB4NDgsMHhmZSwweDUwLDB4MDQsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMX19LApAQCAtMjY0Miw3ICsxMjI3LDcgQEAKICAgICAgIGZvciBQQUwtTSBhbmQgUEFMLU4gYWxsIGFib3ZlIGlzIGNvcnJlY3RlZC4KICAgICAqLwogCi1zdGF0aWMgY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0IFNpUzMxMF9DSFRWUmVnX09OVFNDW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfQ0hUVlJlZ0RhdGEgU2lTMzEwX0NIVFZSZWdfT05UU0NbXSA9CiB7CiAge3sweDQ5LDB4NzcsMHhiYiwweDdiLDB4ODQsMHgzNCwweDAwLDB4NTAsMHgwNCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxfX0sCiAge3sweDQ5LDB4NzcsMHhiYiwweDdiLDB4ODQsMHgzNCwweDAwLDB4NTAsMHgwNCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxfX0sCkBAIC0yNjUzLDcgKzEyMzgsNyBAQAogIHt7MHhlZCwweDc3LDB4YmIsMHg2NiwweDhjLDB4MjEsMHgwMiwweDVhLDB4MDQsMHgwMCwweDgwLDB4MWYsMHg5ZiwweGMxLDB4MGMsMHgwMH19CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0IFNpUzMxMF9DSFRWUmVnX1VQQUxbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMTBfQ0hUVlJlZ19VUEFMW10gPQogewogIHt7MHg0MSwweDdmLDB4YjcsMHgzNCwweGFkLDB4NTAsMHgzNCwweDgzLDB4MDUsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMX19LAogIHt7MHg0MSwweDdmLDB4YjcsMHg4MCwweDg1LDB4NTAsMHgwMCwweDgzLDB4MDUsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMX19LApAQCAtMjY2NCw3ICsxMjQ5LDcgQEAKICB7ezB4ZTUsMHg3ZiwweGI3LDB4MWQsMHhhNywweDNlLDB4MDQsMHg1YSwweDA1LDB4MDAsMHg4MCwweDIwLDB4M2UsMHhlNCwweDIyLDB4MDB9fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCBTaVMzMTBfQ0hUVlJlZ19PUEFMW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfQ0hUVlJlZ0RhdGEgU2lTMzEwX0NIVFZSZWdfT1BBTFtdID0KIHsKICB7ezB4NDEsMHg3ZiwweGI3LDB4MzYsMHhhZCwweDUwLDB4MzQsMHg4MywweDA1LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9fSwKICB7ezB4NDEsMHg3ZiwweGI3LDB4ODYsMHg4NSwweDUwLDB4MDAsMHg4MywweDA1LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9fSwKQEAgLTI2NzUsNyArMTI2MCw3IEBACiAge3sweGU0LDB4N2YsMHhiNywweDFlLDB4YWYsMHgyOSwweDM3LDB4NWEsMHgwNSwweDAwLDB4ODAsMHgyNSwweDhjLDB4YjIsMHgyYSwweDAwfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgU2lTMzEwX0NIVFZSZWdfVVBBTE1bXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMTBfQ0hUVlJlZ19VUEFMTVtdID0KIHsKICB7ezB4NTIsMHg3NywweGJiLDB4OTQsMHg4NCwweDQ4LDB4ZmUsMHg4MywweDA0LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9fSwKICB7ezB4NTIsMHg3NywweGJiLDB4OTQsMHg4NCwweDQ4LDB4ZmUsMHg4MywweDA0LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9fSwKQEAgLTI2OTEsNyArMTI3Niw3IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgU2lTMzEwX0NIVFZSZWdfT1BBTE1bXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMTBfQ0hUVlJlZ19PUEFMTVtdID0KIHsKICB7ezB4NTEsMHg3NywweGJiLDB4N2IsMHg4NCwweDM0LDB4MDAsMHg4MywweDA0LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9fSwKICB7ezB4NTEsMHg3NywweGJiLDB4N2IsMHg4NCwweDM0LDB4MDAsMHg4MywweDA0LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9fSwKQEAgLTI3MDcsNyArMTI5Miw3IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgU2lTMzEwX0NIVFZSZWdfVVBBTE5bXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMTBfQ0hUVlJlZ19VUEFMTltdID0KIHsKICB7ezB4NDEsMHg3ZiwweGI3LDB4MzQsMHhhZCwweDUwLDB4MzQsMHg2ZSwweDA1LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDN9fSwKICB7ezB4NDEsMHg3ZiwweGI3LDB4ODAsMHg4NSwweDUwLDB4MDAsMHg2ZSwweDA1LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDN9fSwKQEAgLTI3MjMsNyArMTMwOCw3IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgU2lTMzEwX0NIVFZSZWdfT1BBTE5bXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMTBfQ0hUVlJlZ19PUEFMTltdID0KIHsKICB7ezB4NDEsMHg3ZiwweGI3LDB4MzYsMHhhZCwweDUwLDB4MzQsMHg2ZSwweDA1LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDN9fSwKICB7ezB4NDEsMHg3ZiwweGI3LDB4ODYsMHg4NSwweDUwLDB4MDAsMHg2ZSwweDA1LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDN9fSwKQEAgLTI3MzksMTYgKzEzMjQsMTYgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9DSFRWVkNMS1VOVFNDW10gPSB7MHg0MSwweDQxLDB4NDEsMHg0MSwweDQyLDB4NDYsMHg1M307Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX0NIVFZWQ0xLT05UU0NbXSA9IHsweDQ4LDB4NDgsMHg0OCwweDQ4LDB4NDUsMHg0MywweDUxfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS1VOVFNDW10gPSB7IDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MiwweDQ2LDB4NTMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS09OVFNDW10gPSB7IDB4NDgsMHg0OCwweDQ4LDB4NDgsMHg0NSwweDQzLDB4NTEgfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9DSFRWVkNMS1VQQUxbXSAgPSB7MHg0NywweDQ3LDB4NDcsMHg0NywweDQ4LDB4NGEsMHg1NH07Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX0NIVFZWQ0xLT1BBTFtdICA9IHsweDQ3LDB4NDcsMHg0NywweDQ3LDB4NDgsMHg0ZiwweDUyfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS1VQQUxbXSAgPSB7IDB4NDcsMHg0NywweDQ3LDB4NDcsMHg0OCwweDRhLDB4NTQgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS09QQUxbXSAgPSB7IDB4NDcsMHg0NywweDQ3LDB4NDcsMHg0OCwweDRmLDB4NTIgfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9DSFRWVkNMS1VQQUxNW10gPSB7MHg0MSwweDQxLDB4NDEsMHg0MSwweDQyLDB4NDYsMHg1M307Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX0NIVFZWQ0xLT1BBTE1bXSA9IHsweDQ4LDB4NDgsMHg0OCwweDQ4LDB4NDUsMHg0MywweDUxfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS1VQQUxNW10gPSB7IDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MiwweDQ2LDB4NTMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS09QQUxNW10gPSB7IDB4NDgsMHg0OCwweDQ4LDB4NDgsMHg0NSwweDQzLDB4NTEgfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9DSFRWVkNMS1VQQUxOW10gPSB7MHg0NywweDQ3LDB4NDcsMHg0NywweDQ4LDB4NGEsMHg1NH07Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX0NIVFZWQ0xLT1BBTE5bXSA9IHsweDQ3LDB4NDcsMHg0NywweDQ3LDB4NDgsMHg0ZiwweDUyfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS1VQQUxOW10gPSB7IDB4NDcsMHg0NywweDQ3LDB4NDcsMHg0OCwweDRhLDB4NTQgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS09QQUxOW10gPSB7IDB4NDcsMHg0NywweDQ3LDB4NDcsMHg0OCwweDRmLDB4NTIgfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vc2lzL01ha2VmaWxlCmluZGV4IGFhZWQ4YzIuLmY3YzAwNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2lzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL01ha2VmaWxlCkBAIC00LDQgKzQsNCBAQAogCiBvYmotJChDT05GSUdfRkJfU0lTKSArPSBzaXNmYi5vCiAKLXNpc2ZiLW9ianMgOj0gc2lzX21haW4ubyBzaXNfYWNjZWwubyBpbml0Lm8gaW5pdDMwMS5vCitzaXNmYi1vYmpzIDo9IHNpc19tYWluLm8gc2lzX2FjY2VsLm8gaW5pdC5vIGluaXQzMDEubyBpbml0ZXh0bGZiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQuYyBiL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQuYwppbmRleCBlY2ZkNzIxLi4yYWIzODY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0LmMKKysrIGIvZHJpdmVycy92aWRlby9zaXMvaW5pdC5jCkBAIC0yLDExICsyLDEyIEBACiAvKiAkWGRvdE9yZyQgKi8KIC8qCiAgKiBNb2RlIGluaXRpYWxpemluZyBjb2RlIChDUlQxIHNlY3Rpb24pIGZvcgotICogZm9yIFNpUyAzMDAvMzA1LzU0MC82MzAvNzMwIGFuZAotICogICAgIFNpUyAzMTUvNTUwLzY1MC9NNjUwLzY1MS82NjFGWC9NNjYxRlgvNzQwLzc0MShHWCkvTTc0MS8zMzAvNjYwL002NjAvNzYwL003NjAKLSAqIChVbml2ZXJzYWwgbW9kdWxlIGZvciBMaW51eCBrZXJuZWwgZnJhbWVidWZmZXIgYW5kIFhGcmVlODYgNC54KQorICogZm9yIFNpUyAzMDAvMzA1LzU0MC82MzAvNzMwLAorICogICAgIFNpUyAzMTUvNTUwL1tNXTY1MC82NTEvW01dNjYxW0ZHTV1YL1tNXTc0eFtHWF0vMzMwL1tNXTc2eFtHWF0sCisgKiAgICAgWEdJIFZvbGFyaSBWM1hUL1Y1L1Y4LCBaNworICogKFVuaXZlcnNhbCBtb2R1bGUgZm9yIExpbnV4IGtlcm5lbCBmcmFtZWJ1ZmZlciBhbmQgWC5vcmcvWEZyZWU4NiA0LngpCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKICAqCiAgKiBJZiBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIHRoZSBmb2xsb3dpbmcgbGljZW5zZSB0ZXJtcwogICogYXBwbHk6CkBAIC01MywxNyArNTQsMTIgQEAKICAqCiAgKiBGb3JtZXJseSBiYXNlZCBvbiBub24tZnVuY3Rpb25hbCBjb2RlLWZyYWdlbWVudHMgZm9yIDMwMCBzZXJpZXMgYnkgU2lTLCBJbmMuCiAgKiBVc2VkIGJ5IHBlcm1pc3Npb24uCi0gKgotICogVFcgc2F5czogVGhpcyBjb2RlIGxvb2tzIGF3ZnVsLCBJIGtub3cuIEJ1dCBwbGVhc2UgZG9uJ3QgZG8gYW55dGhpbmcgYWJvdXQKLSAqIHRoaXMgb3RoZXJ3aXNlIGRlYnVnZ2luZyB3aWxsIGJlIGhlbGwuCi0gKiBUaGUgY29kZSBpcyBleHRyZW1lbHkgZnJhZ2lsZSBhcyByZWdhcmRzIHRoZSBkaWZmZXJlbnQgY2hpcHNldHMsIGRpZmZlcmVudAotICogdmlkZW8gYnJpZGdlcyBhbmQgY29tYmluYXRpb25zIHRoZXJlb2YuIElmIGFueXRoaW5nIGlzIGNoYW5nZWQsIGV4dHJlbWUKLSAqIGNhcmUgaGFzIHRvIGJlIHRha2VuIHRoYXQgdGhhdCBjaGFuZ2UgZG9lc24ndCBicmVhayBpdCBmb3Igb3RoZXIgY2hpcHNldHMsCi0gKiBicmlkZ2VzIG9yIGNvbWJpbmF0aW9ucyB0aGVyZW9mLgotICogQWxsIGNvbW1lbnRzIGluIHRoaXMgZmlsZSBhcmUgYnkgbWUsIHJlZ2FyZGxlc3MgaWYgdGhleSBhcmUgbWFya2VkIFRXIG9yIG5vdC4KLSAqCiAgKi8KLSAKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCiAjaW5jbHVkZSAiaW5pdC5oIgogCiAjaWZkZWYgU0lTMzAwCkBAIC04NCwyNCArODAsMTMgQEAKIAogI2lmIGRlZmluZWQoU0lTMzAwKSB8fCBkZWZpbmVkKFNJUzMxNUgpCiBzdGF0aWMgdm9pZAotSW5pdENvbW1vblBvaW50ZXIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK0luaXRDb21tb25Qb2ludGVyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogeworICAgU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlICA9IFNpU19TTW9kZUlEVGFibGU7CiAgICBTaVNfUHItPlNpU19TdFJlc0luZm8gICAgID0gU2lTX1N0UmVzSW5mbzsKICAgIFNpU19Qci0+U2lTX01vZGVSZXNJbmZvICAgPSBTaVNfTW9kZVJlc0luZm87CiAgICBTaVNfUHItPlNpU19TdGFuZFRhYmxlICAgID0gU2lTX1N0YW5kVGFibGU7CiAKLSAgIFNpU19Qci0+U2lTX05UU0NQaGFzZSAgICAgPSBTaVNfTlRTQ1BoYXNlOwotICAgU2lTX1ByLT5TaVNfUEFMUGhhc2UgICAgICA9IFNpU19QQUxQaGFzZTsKLSAgIFNpU19Qci0+U2lTX05UU0NQaGFzZTIgICAgPSBTaVNfTlRTQ1BoYXNlMjsKLSAgIFNpU19Qci0+U2lTX1BBTFBoYXNlMiAgICAgPSBTaVNfUEFMUGhhc2UyOwotICAgU2lTX1ByLT5TaVNfUEFMTVBoYXNlICAgICA9IFNpU19QQUxNUGhhc2U7Ci0gICBTaVNfUHItPlNpU19QQUxOUGhhc2UgICAgID0gU2lTX1BBTE5QaGFzZTsKLSAgIFNpU19Qci0+U2lTX1BBTE1QaGFzZTIgICAgPSBTaVNfUEFMTVBoYXNlMjsKLSAgIFNpU19Qci0+U2lTX1BBTE5QaGFzZTIgICAgPSBTaVNfUEFMTlBoYXNlMjsKLSAgIFNpU19Qci0+U2lTX1NwZWNpYWxQaGFzZSAgPSBTaVNfU3BlY2lhbFBoYXNlOwotICAgU2lTX1ByLT5TaVNfU3BlY2lhbFBoYXNlTSA9IFNpU19TcGVjaWFsUGhhc2VNOwotICAgU2lTX1ByLT5TaVNfU3BlY2lhbFBoYXNlSiA9IFNpU19TcGVjaWFsUGhhc2VKOwotCiAgICBTaVNfUHItPlNpU19OVFNDVGltaW5nICAgICA9IFNpU19OVFNDVGltaW5nOwogICAgU2lTX1ByLT5TaVNfUEFMVGltaW5nICAgICAgPSBTaVNfUEFMVGltaW5nOwogICAgU2lTX1ByLT5TaVNfSGlUVlN0MVRpbWluZyAgPSBTaVNfSGlUVlN0MVRpbWluZzsKQEAgLTEzNyw2ICsxMjIsNyBAQAogICAgU2lTX1ByLT5TaVNfRXh0TENEMTI4MHg3NjhfMkRhdGEgPSBTaVNfRXh0TENEMTI4MHg3NjhfMkRhdGE7CiAgICBTaVNfUHItPlNpU19MQ0QxMjgweDgwMERhdGEgICAgICA9IFNpU19MQ0QxMjgweDgwMERhdGE7CiAgICBTaVNfUHItPlNpU19MQ0QxMjgweDgwMF8yRGF0YSAgICA9IFNpU19MQ0QxMjgweDgwMF8yRGF0YTsKKyAgIFNpU19Qci0+U2lTX0xDRDEyODB4ODU0RGF0YSAgICAgID0gU2lTX0xDRDEyODB4ODU0RGF0YTsKICAgIFNpU19Qci0+U2lTX0xDRDEyODB4OTYwRGF0YSAgICAgID0gU2lTX0xDRDEyODB4OTYwRGF0YTsKICAgIFNpU19Qci0+U2lTX1N0TENEMTQwMHgxMDUwRGF0YSAgID0gU2lTX1N0TENEMTQwMHgxMDUwRGF0YTsKICAgIFNpU19Qci0+U2lTX0V4dExDRDE0MDB4MTA1MERhdGEgID0gU2lTX0V4dExDRDE0MDB4MTA1MERhdGE7CkBAIC0xNDUsNjcgKzEzMSwzMCBAQAogICAgU2lTX1ByLT5TaVNfRXh0TENEMTYwMHgxMjAwRGF0YSAgPSBTaVNfRXh0TENEMTYwMHgxMjAwRGF0YTsKICAgIFNpU19Qci0+U2lTX05vU2NhbGVEYXRhICAgICAgICAgID0gU2lTX05vU2NhbGVEYXRhOwogCi0gICBTaVNfUHItPlNpU19MVkRTMzIweDQ4MERhdGFfMSAgID0gU2lTX0xWRFMzMjB4NDgwRGF0YV8xOworICAgU2lTX1ByLT5TaVNfTFZEUzMyMHgyNDBEYXRhXzEgICA9IFNpU19MVkRTMzIweDI0MERhdGFfMTsKKyAgIFNpU19Qci0+U2lTX0xWRFMzMjB4MjQwRGF0YV8yICAgPSBTaVNfTFZEUzMyMHgyNDBEYXRhXzI7CisgICBTaVNfUHItPlNpU19MVkRTNjQweDQ4MERhdGFfMSAgID0gU2lTX0xWRFM2NDB4NDgwRGF0YV8xOwogICAgU2lTX1ByLT5TaVNfTFZEUzgwMHg2MDBEYXRhXzEgICA9IFNpU19MVkRTODAweDYwMERhdGFfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFM4MDB4NjAwRGF0YV8yICAgPSBTaVNfTFZEUzgwMHg2MDBEYXRhXzI7Ci0gICBTaVNfUHItPlNpU19MVkRTMTAyNHg3NjhEYXRhXzEgID0gU2lTX0xWRFMxMDI0eDc2OERhdGFfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFMxMDI0eDc2OERhdGFfMiAgPSBTaVNfTFZEUzEwMjR4NzY4RGF0YV8yOwotICAgU2lTX1ByLT5TaVNfTFZEUzEyODB4MTAyNERhdGFfMSA9IFNpU19MVkRTMTI4MHgxMDI0RGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzEyODB4MTAyNERhdGFfMiA9IFNpU19MVkRTMTI4MHgxMDI0RGF0YV8yOwotICAgU2lTX1ByLT5TaVNfTFZEUzE0MDB4MTA1MERhdGFfMSA9IFNpU19MVkRTMTQwMHgxMDUwRGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzE0MDB4MTA1MERhdGFfMiA9IFNpU19MVkRTMTQwMHgxMDUwRGF0YV8yOwotICAgU2lTX1ByLT5TaVNfTFZEUzE2MDB4MTIwMERhdGFfMSA9IFNpU19MVkRTMTYwMHgxMjAwRGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzE2MDB4MTIwMERhdGFfMiA9IFNpU19MVkRTMTYwMHgxMjAwRGF0YV8yOwotICAgU2lTX1ByLT5TaVNfTFZEUzEyODB4NzY4RGF0YV8xICA9IFNpU19MVkRTMTI4MHg3NjhEYXRhXzE7Ci0gICBTaVNfUHItPlNpU19MVkRTMTI4MHg3NjhEYXRhXzIgID0gU2lTX0xWRFMxMjgweDc2OERhdGFfMjsKICAgIFNpU19Qci0+U2lTX0xWRFMxMDI0eDYwMERhdGFfMSAgPSBTaVNfTFZEUzEwMjR4NjAwRGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzEwMjR4NjAwRGF0YV8yICA9IFNpU19MVkRTMTAyNHg2MDBEYXRhXzI7Ci0gICBTaVNfUHItPlNpU19MVkRTMTE1Mng3NjhEYXRhXzEgID0gU2lTX0xWRFMxMTUyeDc2OERhdGFfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFMxMTUyeDc2OERhdGFfMiAgPSBTaVNfTFZEUzExNTJ4NzY4RGF0YV8yOwotICAgU2lTX1ByLT5TaVNfTFZEU1hYWHhYWFhEYXRhXzEgICA9IFNpU19MVkRTWFhYeFhYWERhdGFfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFMxMjgweDk2MERhdGFfMSAgPSBTaVNfTFZEUzEyODB4OTYwRGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzEyODB4OTYwRGF0YV8yICA9IFNpU19MVkRTMTI4MHg5NjBEYXRhXzI7Ci0gICBTaVNfUHItPlNpU19MVkRTNjQweDQ4MERhdGFfMSAgID0gU2lTX0xWRFM2NDB4NDgwRGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzEyODB4OTYwRGF0YV8xICA9IFNpU19MVkRTMTI4MHgxMDI0RGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzEyODB4OTYwRGF0YV8yICA9IFNpU19MVkRTMTI4MHgxMDI0RGF0YV8yOwotICAgU2lTX1ByLT5TaVNfTFZEUzY0MHg0ODBEYXRhXzEgICA9IFNpU19MVkRTNjQweDQ4MERhdGFfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFM2NDB4NDgwRGF0YV8yICAgPSBTaVNfTFZEUzY0MHg0ODBEYXRhXzI7CisgICBTaVNfUHItPlNpU19MVkRTMTAyNHg3NjhEYXRhXzEgID0gU2lTX0xWRFMxMDI0eDc2OERhdGFfMTsKIAotICAgU2lTX1ByLT5TaVNfTFZEUzg0OHg0ODBEYXRhXzEgICA9IFNpU19MVkRTODQ4eDQ4MERhdGFfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFM4NDh4NDgwRGF0YV8yICAgPSBTaVNfTFZEUzg0OHg0ODBEYXRhXzI7Ci0gICBTaVNfUHItPlNpU19MVkRTQkFSQ08xMDI0RGF0YV8xID0gU2lTX0xWRFNCQVJDTzEwMjREYXRhXzE7Ci0gICBTaVNfUHItPlNpU19MVkRTQkFSQ08xMDI0RGF0YV8yID0gU2lTX0xWRFNCQVJDTzEwMjREYXRhXzI7Ci0gICBTaVNfUHItPlNpU19MVkRTQkFSQ08xMzY2RGF0YV8xID0gU2lTX0xWRFNCQVJDTzEzNjZEYXRhXzE7Ci0gICBTaVNfUHItPlNpU19MVkRTQkFSQ08xMzY2RGF0YV8yID0gU2lTX0xWRFNCQVJDTzEzNjZEYXRhXzI7Ci0KLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHg3NjhfMSAgICA9IFNpU19MVkRTQ1JUMTEyODB4NzY4XzE7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NjAwXzEgICAgPSBTaVNfTFZEU0NSVDExMDI0eDYwMF8xOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMTUyeDc2OF8xICAgID0gU2lTX0xWRFNDUlQxMTE1Mng3NjhfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHg3NjhfMV9IICA9IFNpU19MVkRTQ1JUMTEyODB4NzY4XzFfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMV9IICA9IFNpU19MVkRTQ1JUMTEwMjR4NjAwXzFfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTE1Mng3NjhfMV9IICA9IFNpU19MVkRTQ1JUMTExNTJ4NzY4XzFfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHg3NjhfMiAgICA9IFNpU19MVkRTQ1JUMTEyODB4NzY4XzI7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NjAwXzIgICAgPSBTaVNfTFZEU0NSVDExMDI0eDYwMF8yOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMTUyeDc2OF8yICAgID0gU2lTX0xWRFNDUlQxMTE1Mng3NjhfMjsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHg3NjhfMl9IICA9IFNpU19MVkRTQ1JUMTEyODB4NzY4XzJfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMl9IICA9IFNpU19MVkRTQ1JUMTEwMjR4NjAwXzJfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTE1Mng3NjhfMl9IICA9IFNpU19MVkRTQ1JUMTExNTJ4NzY4XzJfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDQ4MF8xICAgICA9IFNpU19MVkRTQ1JUMTMyMHg0ODBfMTsKKyAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8xICAgICA9IFNpU19MVkRTQ1JUMTMyMHgyNDBfMTsKKyAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8yICAgICA9IFNpU19MVkRTQ1JUMTMyMHgyNDBfMjsKKyAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8yX0ggICA9IFNpU19MVkRTQ1JUMTMyMHgyNDBfMl9IOworICAgU2lTX1ByLT5TaVNfTFZEU0NSVDEzMjB4MjQwXzMgICAgID0gU2lTX0xWRFNDUlQxMzIweDI0MF8zOworICAgU2lTX1ByLT5TaVNfTFZEU0NSVDEzMjB4MjQwXzNfSCAgID0gU2lTX0xWRFNDUlQxMzIweDI0MF8zX0g7CiAgICBTaVNfUHItPlNpU19MVkRTQ1JUMTY0MHg0ODBfMSAgICAgPSBTaVNfTFZEU0NSVDE2NDB4NDgwXzE7CiAgICBTaVNfUHItPlNpU19MVkRTQ1JUMTY0MHg0ODBfMV9IICAgPSBTaVNfTFZEU0NSVDE2NDB4NDgwXzFfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxNjQweDQ4MF8yICAgICA9IFNpU19MVkRTQ1JUMTY0MHg0ODBfMjsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxNjQweDQ4MF8yX0ggICA9IFNpU19MVkRTQ1JUMTY0MHg0ODBfMl9IOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDE2NDB4NDgwXzMgICAgID0gU2lTX0xWRFNDUlQxNjQweDQ4MF8zOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDE2NDB4NDgwXzNfSCAgID0gU2lTX0xWRFNDUlQxNjQweDQ4MF8zX0g7CisjaWYgMAorICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDYwMF8xICAgID0gU2lTX0xWRFNDUlQxMTAyNHg2MDBfMTsKKyAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMV9IICA9IFNpU19MVkRTQ1JUMTEwMjR4NjAwXzFfSDsKKyAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMiAgICA9IFNpU19MVkRTQ1JUMTEwMjR4NjAwXzI7CisgICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NjAwXzJfSCAgPSBTaVNfTFZEU0NSVDExMDI0eDYwMF8yX0g7CisjZW5kaWYKIAogICAgU2lTX1ByLT5TaVNfQ0hUVlVOVFNDRGF0YSA9IFNpU19DSFRWVU5UU0NEYXRhOwogICAgU2lTX1ByLT5TaVNfQ0hUVk9OVFNDRGF0YSA9IFNpU19DSFRWT05UU0NEYXRhOwogCi0gICBTaVNfUHItPlNpU19DSFRWVU5UU0NEZXNEYXRhID0gU2lTX0NIVFZVTlRTQ0Rlc0RhdGE7Ci0gICBTaVNfUHItPlNpU19DSFRWT05UU0NEZXNEYXRhID0gU2lTX0NIVFZPTlRTQ0Rlc0RhdGE7Ci0gICBTaVNfUHItPlNpU19DSFRWVVBBTERlc0RhdGEgID0gU2lTX0NIVFZVUEFMRGVzRGF0YTsKLSAgIFNpU19Qci0+U2lTX0NIVFZPUEFMRGVzRGF0YSAgPSBTaVNfQ0hUVk9QQUxEZXNEYXRhOwotCiAgICBTaVNfUHItPlNpU19QYW5lbE1pbkxWRFMgICA9IFBhbmVsXzgwMHg2MDA7ICAgIC8qIGxvd2VzdCB2YWx1ZSBMVkRTL0xDREEgKi8KICAgIFNpU19Qci0+U2lTX1BhbmVsTWluMzAxICAgID0gUGFuZWxfMTAyNHg3Njg7ICAgLyogbG93ZXN0IHZhbHVlIDMwMSAqLwogfQpAQCAtMjEzLDUwICsxNjIsMjQgQEAKIAogI2lmZGVmIFNJUzMwMAogc3RhdGljIHZvaWQKLUluaXRUbzMwMFBvaW50ZXIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK0luaXRUbzMwMFBvaW50ZXIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICBJbml0Q29tbW9uUG9pbnRlcihTaVNfUHIsIEh3SW5mbyk7CisgICBJbml0Q29tbW9uUG9pbnRlcihTaVNfUHIpOwogCi0gICBTaVNfUHItPlNpU19TTW9kZUlEVGFibGUgID0gU2lTMzAwX1NNb2RlSURUYWJsZTsKICAgIFNpU19Qci0+U2lTX1ZCTW9kZUlEVGFibGUgPSBTaVMzMDBfVkJNb2RlSURUYWJsZTsKICAgIFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZSAgPSBTaVMzMDBfRU1vZGVJRFRhYmxlOwogICAgU2lTX1ByLT5TaVNfUmVmSW5kZXggICAgICA9IFNpUzMwMF9SZWZJbmRleDsKICAgIFNpU19Qci0+U2lTX0NSVDFUYWJsZSAgICAgPSBTaVMzMDBfQ1JUMVRhYmxlOwotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMwMCkgewotICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCAgICA9IFNpUzMwMF9NQ0xLRGF0YV8zMDA7IC8qIDMwMCAqLworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfMzAwKSB7CisgICAgICBTaVNfUHItPlNpU19NQ0xLRGF0YV8wID0gU2lTMzAwX01DTEtEYXRhXzMwMDsgLyogMzAwICovCiAgICB9IGVsc2UgewotICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCAgICA9IFNpUzMwMF9NQ0xLRGF0YV82MzA7IC8qIDYzMCwgNzMwICovCisgICAgICBTaVNfUHItPlNpU19NQ0xLRGF0YV8wID0gU2lTMzAwX01DTEtEYXRhXzYzMDsgLyogNjMwLCA3MzAgKi8KICAgIH0KICAgIFNpU19Qci0+U2lTX1ZDTEtEYXRhICAgICAgPSBTaVMzMDBfVkNMS0RhdGE7Ci0gICBTaVNfUHItPlNpU19WQlZDTEtEYXRhICAgID0gKFNpU19WQlZDTEtEYXRhU3RydWN0ICopU2lTMzAwX1ZDTEtEYXRhOworICAgU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YSAgICA9IChzdHJ1Y3QgU2lTX1ZCVkNMS0RhdGEgKilTaVMzMDBfVkNMS0RhdGE7CiAKICAgIFNpU19Qci0+U2lTX1NSMTUgID0gU2lTMzAwX1NSMTU7CiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgIFNpU19Qci0+cFNpU19TUjA3ID0gJlNpUzMwMF9TUjA3OwotICAgU2lTX1ByLT5TaVNfQ1I0MCAgPSBTaVMzMDBfQ1I0MDsKLSAgIFNpU19Qci0+U2lTX0NSNDkgID0gU2lTMzAwX0NSNDk7Ci0gICBTaVNfUHItPnBTaVNfU1IxRiA9ICZTaVMzMDBfU1IxRjsKLSAgIFNpU19Qci0+cFNpU19TUjIxID0gJlNpUzMwMF9TUjIxOwotICAgU2lTX1ByLT5wU2lTX1NSMjIgPSAmU2lTMzAwX1NSMjI7Ci0gICBTaVNfUHItPnBTaVNfU1IyMyA9ICZTaVMzMDBfU1IyMzsKLSAgIFNpU19Qci0+cFNpU19TUjI0ID0gJlNpUzMwMF9TUjI0OwotICAgU2lTX1ByLT5TaVNfU1IyNSAgPSBTaVMzMDBfU1IyNTsKLSAgIFNpU19Qci0+cFNpU19TUjMxID0gJlNpUzMwMF9TUjMxOwotICAgU2lTX1ByLT5wU2lTX1NSMzIgPSAmU2lTMzAwX1NSMzI7Ci0gICBTaVNfUHItPnBTaVNfU1IzMyA9ICZTaVMzMDBfU1IzMzsKLSAgIFNpU19Qci0+cFNpU19DUlQyRGF0YV8xXzIgID0gJlNpUzMwMF9DUlQyRGF0YV8xXzI7Ci0gICBTaVNfUHItPnBTaVNfQ1JUMkRhdGFfNF9EICA9ICZTaVMzMDBfQ1JUMkRhdGFfNF9EOwotICAgU2lTX1ByLT5wU2lTX0NSVDJEYXRhXzRfRSAgPSAmU2lTMzAwX0NSVDJEYXRhXzRfRTsKLSAgIFNpU19Qci0+cFNpU19DUlQyRGF0YV80XzEwID0gJlNpUzMwMF9DUlQyRGF0YV80XzEwOwotICAgU2lTX1ByLT5wU2lTX1JHQlNlbnNlRGF0YSAgICA9ICZTaVMzMDBfUkdCU2Vuc2VEYXRhOwotICAgU2lTX1ByLT5wU2lTX1ZpZGVvU2Vuc2VEYXRhICA9ICZTaVMzMDBfVmlkZW9TZW5zZURhdGE7Ci0gICBTaVNfUHItPnBTaVNfWUNTZW5zZURhdGEgICAgID0gJlNpUzMwMF9ZQ1NlbnNlRGF0YTsKLSAgIFNpU19Qci0+cFNpU19SR0JTZW5zZURhdGEyICAgPSAmU2lTMzAwX1JHQlNlbnNlRGF0YTI7Ci0gICBTaVNfUHItPnBTaVNfVmlkZW9TZW5zZURhdGEyID0gJlNpUzMwMF9WaWRlb1NlbnNlRGF0YTI7Ci0gICBTaVNfUHItPnBTaVNfWUNTZW5zZURhdGEyICAgID0gJlNpUzMwMF9ZQ1NlbnNlRGF0YTI7Ci0jZW5kaWYKLQogICAgU2lTX1ByLT5TaVNfUGFuZWxEZWxheVRibCAgICAgPSBTaVMzMDBfUGFuZWxEZWxheVRibDsKICAgIFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxMVkRTID0gU2lTMzAwX1BhbmVsRGVsYXlUYmw7CiAKQEAgLTI2NiwxMSArMTg5LDggQEAKICAgIFNpU19Qci0+U2lTX1N0MkxDRDEyODB4MTAyNERhdGEgID0gU2lTMzAwX1N0MkxDRDEyODB4MTAyNERhdGE7CiAKICAgIFNpU19Qci0+U2lTX0NSVDJQYXJ0Ml8xMDI0eDc2OF8xICA9IFNpUzMwMF9DUlQyUGFydDJfMTAyNHg3NjhfMTsKLSAgIFNpU19Qci0+U2lTX0NSVDJQYXJ0Ml8xMjgweDEwMjRfMSA9IFNpUzMwMF9DUlQyUGFydDJfMTI4MHgxMDI0XzE7CiAgICBTaVNfUHItPlNpU19DUlQyUGFydDJfMTAyNHg3NjhfMiAgPSBTaVMzMDBfQ1JUMlBhcnQyXzEwMjR4NzY4XzI7Ci0gICBTaVNfUHItPlNpU19DUlQyUGFydDJfMTI4MHgxMDI0XzIgPSBTaVMzMDBfQ1JUMlBhcnQyXzEyODB4MTAyNF8yOwogICAgU2lTX1ByLT5TaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzMgID0gU2lTMzAwX0NSVDJQYXJ0Ml8xMDI0eDc2OF8zOwotICAgU2lTX1ByLT5TaVNfQ1JUMlBhcnQyXzEyODB4MTAyNF8zID0gU2lTMzAwX0NSVDJQYXJ0Ml8xMjgweDEwMjRfMzsKIAogICAgU2lTX1ByLT5TaVNfQ0hUVlVQQUxEYXRhICA9IFNpUzMwMF9DSFRWVVBBTERhdGE7CiAgICBTaVNfUHItPlNpU19DSFRWT1BBTERhdGEgID0gU2lTMzAwX0NIVFZPUEFMRGF0YTsKQEAgLTI4MCw2NCArMjAwLDE2IEBACiAgICBTaVNfUHItPlNpU19DSFRWT1BBTE5EYXRhID0gU2lTMzAwX0NIVFZPUEFMRGF0YTsgIC8qIG5vdCBzdXBwb3J0ZWQgb24gMzAwIHNlcmllcyAqLwogICAgU2lTX1ByLT5TaVNfQ0hUVlNPUEFMRGF0YSA9IFNpUzMwMF9DSFRWU09QQUxEYXRhOwogCi0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMF8xID0gU2lTMzAwX1BhbmVsVHlwZTAwXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMV8xID0gU2lTMzAwX1BhbmVsVHlwZTAxXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMl8xID0gU2lTMzAwX1BhbmVsVHlwZTAyXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwM18xID0gU2lTMzAwX1BhbmVsVHlwZTAzXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8xID0gU2lTMzAwX1BhbmVsVHlwZTA0XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNV8xID0gU2lTMzAwX1BhbmVsVHlwZTA1XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNl8xID0gU2lTMzAwX1BhbmVsVHlwZTA2XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwN18xID0gU2lTMzAwX1BhbmVsVHlwZTA3XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOF8xID0gU2lTMzAwX1BhbmVsVHlwZTA4XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOV8xID0gU2lTMzAwX1BhbmVsVHlwZTA5XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYV8xID0gU2lTMzAwX1BhbmVsVHlwZTBhXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYl8xID0gU2lTMzAwX1BhbmVsVHlwZTBiXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwY18xID0gU2lTMzAwX1BhbmVsVHlwZTBjXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZF8xID0gU2lTMzAwX1BhbmVsVHlwZTBkXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZV8xID0gU2lTMzAwX1BhbmVsVHlwZTBlXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZl8xID0gU2lTMzAwX1BhbmVsVHlwZTBmXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMF8yID0gU2lTMzAwX1BhbmVsVHlwZTAwXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMV8yID0gU2lTMzAwX1BhbmVsVHlwZTAxXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMl8yID0gU2lTMzAwX1BhbmVsVHlwZTAyXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwM18yID0gU2lTMzAwX1BhbmVsVHlwZTAzXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8yID0gU2lTMzAwX1BhbmVsVHlwZTA0XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNV8yID0gU2lTMzAwX1BhbmVsVHlwZTA1XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNl8yID0gU2lTMzAwX1BhbmVsVHlwZTA2XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwN18yID0gU2lTMzAwX1BhbmVsVHlwZTA3XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOF8yID0gU2lTMzAwX1BhbmVsVHlwZTA4XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOV8yID0gU2lTMzAwX1BhbmVsVHlwZTA5XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYV8yID0gU2lTMzAwX1BhbmVsVHlwZTBhXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYl8yID0gU2lTMzAwX1BhbmVsVHlwZTBiXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwY18yID0gU2lTMzAwX1BhbmVsVHlwZTBjXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZF8yID0gU2lTMzAwX1BhbmVsVHlwZTBkXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZV8yID0gU2lTMzAwX1BhbmVsVHlwZTBlXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZl8yID0gU2lTMzAwX1BhbmVsVHlwZTBmXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGVOU18xID0gU2lTMzAwX1BhbmVsVHlwZU5TXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGVOU18yID0gU2lTMzAwX1BhbmVsVHlwZU5TXzI7CisgICBTaVNfUHItPlNpU19MVkRTODQ4eDQ4MERhdGFfMSAgID0gU2lTMzAwX0xWRFM4NDh4NDgwRGF0YV8xOworICAgU2lTX1ByLT5TaVNfTFZEUzg0OHg0ODBEYXRhXzIgICA9IFNpUzMwMF9MVkRTODQ4eDQ4MERhdGFfMjsKKyAgIFNpU19Qci0+U2lTX0xWRFNCQVJDTzEwMjREYXRhXzEgPSBTaVMzMDBfTFZEU0JBUkNPMTAyNERhdGFfMTsKKyAgIFNpU19Qci0+U2lTX0xWRFNCQVJDTzEzNjZEYXRhXzEgPSBTaVMzMDBfTFZEU0JBUkNPMTM2NkRhdGFfMTsKKyAgIFNpU19Qci0+U2lTX0xWRFNCQVJDTzEzNjZEYXRhXzIgPSBTaVMzMDBfTFZEU0JBUkNPMTM2NkRhdGFfMjsKIAotICAgaWYoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB7Ci0gICAgICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8xID0gU2lTMzAwX1BhbmVsVHlwZTA0XzFhOwotICAgICAgU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDRfMiA9IFNpUzMwMF9QYW5lbFR5cGUwNF8yYTsKLSAgIH0KLSAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTAyNCkgewotICAgICAgU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDRfMSA9IFNpUzMwMF9QYW5lbFR5cGUwNF8xYjsKLSAgICAgIFNpU19Qci0+U2lTX1BhbmVsVHlwZTA0XzIgPSBTaVMzMDBfUGFuZWxUeXBlMDRfMmI7Ci0gICB9Ci0KLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxODAweDYwMF8xICAgICA9IFNpUzMwMF9MVkRTQ1JUMTgwMHg2MDBfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxODAweDYwMF8xX0ggICA9IFNpUzMwMF9MVkRTQ1JUMTgwMHg2MDBfMV9IOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDE4MDB4NjAwXzIgICAgID0gU2lTMzAwX0xWRFNDUlQxODAweDYwMF8yOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDE4MDB4NjAwXzJfSCAgID0gU2lTMzAwX0xWRFNDUlQxODAweDYwMF8yX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NzY4XzEgICAgPSBTaVMzMDBfTFZEU0NSVDExMDI0eDc2OF8xOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDc2OF8xX0ggID0gU2lTMzAwX0xWRFNDUlQxMTAyNHg3NjhfMV9IOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDc2OF8yICAgID0gU2lTMzAwX0xWRFNDUlQxMTAyNHg3NjhfMjsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg3NjhfMl9IICA9IFNpUzMwMF9MVkRTQ1JUMTEwMjR4NzY4XzJfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHgxMDI0XzEgICA9IFNpUzMwMF9MVkRTQ1JUMTEyODB4MTAyNF8xOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMjgweDEwMjRfMV9IID0gU2lTMzAwX0xWRFNDUlQxMTI4MHgxMDI0XzFfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHgxMDI0XzIgICA9IFNpUzMwMF9MVkRTQ1JUMTEyODB4MTAyNF8yOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMjgweDEwMjRfMl9IID0gU2lTMzAwX0xWRFNDUlQxMTI4MHgxMDI0XzJfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxWFhYeFhYWF8xICAgICA9IFNpUzMwMF9MVkRTQ1JUMVhYWHhYWFhfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxWFhYeFhYWF8xX0ggICA9IFNpUzMwMF9MVkRTQ1JUMVhYWHhYWFhfMV9IOworICAgU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDRfMWEgPSBTaVMzMDBfUGFuZWxUeXBlMDRfMWE7CisgICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8yYSA9IFNpUzMwMF9QYW5lbFR5cGUwNF8yYTsKKyAgIFNpU19Qci0+U2lTX1BhbmVsVHlwZTA0XzFiID0gU2lTMzAwX1BhbmVsVHlwZTA0XzFiOworICAgU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDRfMmIgPSBTaVMzMDBfUGFuZWxUeXBlMDRfMmI7CiAKICAgIFNpU19Qci0+U2lTX0NIVFZDUlQxVU5UU0MgPSBTaVMzMDBfQ0hUVkNSVDFVTlRTQzsKICAgIFNpU19Qci0+U2lTX0NIVFZDUlQxT05UU0MgPSBTaVMzMDBfQ0hUVkNSVDFPTlRTQzsKQEAgLTM2Nyw2NCArMjM5LDM4IEBACiAKICNpZmRlZiBTSVMzMTVICiBzdGF0aWMgdm9pZAotSW5pdFRvMzEwUG9pbnRlcihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorSW5pdFRvMzEwUG9pbnRlcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIEluaXRDb21tb25Qb2ludGVyKFNpU19QciwgSHdJbmZvKTsKKyAgIEluaXRDb21tb25Qb2ludGVyKFNpU19Qcik7CiAKLSAgIFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZSAgPSBTaVMzMTBfU01vZGVJRFRhYmxlOwogICAgU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlICA9IFNpUzMxMF9FTW9kZUlEVGFibGU7Ci0gICBTaVNfUHItPlNpU19SZWZJbmRleCAgICAgID0gKFNpU19FeHQyU3RydWN0ICopU2lTMzEwX1JlZkluZGV4OworICAgU2lTX1ByLT5TaVNfUmVmSW5kZXggICAgICA9IFNpUzMxMF9SZWZJbmRleDsKICAgIFNpU19Qci0+U2lTX0NSVDFUYWJsZSAgICAgPSBTaVMzMTBfQ1JUMVRhYmxlOwotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzM0MCkgewotICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCA9IFNpUzMxMF9NQ0xLRGF0YV8wXzM0MDsgIC8qIDM0MCAqLwotICAgfSBlbHNlIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU183NjEpIHsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzM0MCkgeworICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCA9IFNpUzMxMF9NQ0xLRGF0YV8wXzM0MDsgIC8qIDM0MCArIFhHSSAqLworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzc2MSkgewogICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCA9IFNpUzMxMF9NQ0xLRGF0YV8wXzc2MTsgIC8qIDc2MSAtIHByZWxpbWluYXJ5ICovCi0gICB9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzc2MCkgeworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzc2MCkgewogICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCA9IFNpUzMxMF9NQ0xLRGF0YV8wXzc2MDsgIC8qIDc2MCAqLwotICAgfSBlbHNlIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHsKKyAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsKICAgICAgIFNpU19Qci0+U2lTX01DTEtEYXRhXzAgPSBTaVMzMTBfTUNMS0RhdGFfMF82NjA7ICAvKiA2NjEvNzQxICovCi0gICB9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMzMCkgeworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMzMCkgewogICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCA9IFNpUzMxMF9NQ0xLRGF0YV8wXzMzMDsgIC8qIDMzMCAqLwotICAgfSBlbHNlIGlmKEh3SW5mby0+akNoaXBUeXBlID4gU0lTXzMxNVBSTykgeworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPiBTSVNfMzE1UFJPKSB7CiAgICAgICBTaVNfUHItPlNpU19NQ0xLRGF0YV8wID0gU2lTMzEwX01DTEtEYXRhXzBfNjUwOyAgLyogNTUwLCA2NTAsIDc0MCAqLwogICAgfSBlbHNlIHsKICAgICAgIFNpU19Qci0+U2lTX01DTEtEYXRhXzAgPSBTaVMzMTBfTUNMS0RhdGFfMF8zMTU7ICAvKiAzMTUgKi8KICAgIH0KLSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zNDApIHsKLSAgICAgIFNpU19Qci0+U2lTX01DTEtEYXRhXzEgICAgPSBTaVMzMTBfTUNMS0RhdGFfMV8zNDA7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zNDApIHsKKyAgICAgIFNpU19Qci0+U2lTX01DTEtEYXRhXzEgPSBTaVMzMTBfTUNMS0RhdGFfMV8zNDA7CiAgICB9IGVsc2UgewotICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMSAgICA9IFNpUzMxMF9NQ0xLRGF0YV8xOworICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMSA9IFNpUzMxMF9NQ0xLRGF0YV8xOwogICAgfQogICAgU2lTX1ByLT5TaVNfVkNMS0RhdGEgICAgICA9IFNpUzMxMF9WQ0xLRGF0YTsKICAgIFNpU19Qci0+U2lTX1ZCVkNMS0RhdGEgICAgPSBTaVMzMTBfVkJWQ0xLRGF0YTsKIAogICAgU2lTX1ByLT5TaVNfU1IxNSAgPSBTaVMzMTBfU1IxNTsKIAotI2lmZGVmIExJTlVYX0tFUk5FTAotICAgU2lTX1ByLT5wU2lTX1NSMDcgPSAmU2lTMzEwX1NSMDc7Ci0gICBTaVNfUHItPlNpU19DUjQwICA9IFNpUzMxMF9DUjQwOwotICAgU2lTX1ByLT5TaVNfQ1I0OSAgPSBTaVMzMTBfQ1I0OTsKLSAgIFNpU19Qci0+cFNpU19TUjFGID0gJlNpUzMxMF9TUjFGOwotICAgU2lTX1ByLT5wU2lTX1NSMjEgPSAmU2lTMzEwX1NSMjE7Ci0gICBTaVNfUHItPnBTaVNfU1IyMiA9ICZTaVMzMTBfU1IyMjsKLSAgIFNpU19Qci0+cFNpU19TUjIzID0gJlNpUzMxMF9TUjIzOwotICAgU2lTX1ByLT5wU2lTX1NSMjQgPSAmU2lTMzEwX1NSMjQ7Ci0gICBTaVNfUHItPlNpU19TUjI1ICA9IFNpUzMxMF9TUjI1OwotICAgU2lTX1ByLT5wU2lTX1NSMzEgPSAmU2lTMzEwX1NSMzE7Ci0gICBTaVNfUHItPnBTaVNfU1IzMiA9ICZTaVMzMTBfU1IzMjsKLSAgIFNpU19Qci0+cFNpU19TUjMzID0gJlNpUzMxMF9TUjMzOwotICAgU2lTX1ByLT5wU2lTX0NSVDJEYXRhXzFfMiAgPSAmU2lTMzEwX0NSVDJEYXRhXzFfMjsKLSAgIFNpU19Qci0+cFNpU19DUlQyRGF0YV80X0QgID0gJlNpUzMxMF9DUlQyRGF0YV80X0Q7Ci0gICBTaVNfUHItPnBTaVNfQ1JUMkRhdGFfNF9FICA9ICZTaVMzMTBfQ1JUMkRhdGFfNF9FOwotICAgU2lTX1ByLT5wU2lTX0NSVDJEYXRhXzRfMTAgPSAmU2lTMzEwX0NSVDJEYXRhXzRfMTA7Ci0gICBTaVNfUHItPnBTaVNfUkdCU2Vuc2VEYXRhICAgID0gJlNpUzMxMF9SR0JTZW5zZURhdGE7Ci0gICBTaVNfUHItPnBTaVNfVmlkZW9TZW5zZURhdGEgID0gJlNpUzMxMF9WaWRlb1NlbnNlRGF0YTsKLSAgIFNpU19Qci0+cFNpU19ZQ1NlbnNlRGF0YSAgICAgPSAmU2lTMzEwX1lDU2Vuc2VEYXRhOwotICAgU2lTX1ByLT5wU2lTX1JHQlNlbnNlRGF0YTIgICA9ICZTaVMzMTBfUkdCU2Vuc2VEYXRhMjsKLSAgIFNpU19Qci0+cFNpU19WaWRlb1NlbnNlRGF0YTIgPSAmU2lTMzEwX1ZpZGVvU2Vuc2VEYXRhMjsKLSAgIFNpU19Qci0+cFNpU19ZQ1NlbnNlRGF0YTIgICAgPSAmU2lTMzEwX1lDU2Vuc2VEYXRhMjsKLSNlbmRpZgotCiAgICBTaVNfUHItPlNpU19QYW5lbERlbGF5VGJsICAgICA9IFNpUzMxMF9QYW5lbERlbGF5VGJsOwogICAgU2lTX1ByLT5TaVNfUGFuZWxEZWxheVRibExWRFMgPSBTaVMzMTBfUGFuZWxEZWxheVRibExWRFM7CiAKQEAgLTQzNSw0MSArMjgxLDYgQEAKIAogICAgU2lTX1ByLT5TaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzEgID0gU2lTMzEwX0NSVDJQYXJ0Ml8xMDI0eDc2OF8xOwogCi0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMF8xID0gU2lTMzEwX1BhbmVsVHlwZTAwXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMV8xID0gU2lTMzEwX1BhbmVsVHlwZTAxXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMl8xID0gU2lTMzEwX1BhbmVsVHlwZTAyXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwM18xID0gU2lTMzEwX1BhbmVsVHlwZTAzXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8xID0gU2lTMzEwX1BhbmVsVHlwZTA0XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNV8xID0gU2lTMzEwX1BhbmVsVHlwZTA1XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNl8xID0gU2lTMzEwX1BhbmVsVHlwZTA2XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwN18xID0gU2lTMzEwX1BhbmVsVHlwZTA3XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOF8xID0gU2lTMzEwX1BhbmVsVHlwZTA4XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOV8xID0gU2lTMzEwX1BhbmVsVHlwZTA5XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYV8xID0gU2lTMzEwX1BhbmVsVHlwZTBhXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYl8xID0gU2lTMzEwX1BhbmVsVHlwZTBiXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwY18xID0gU2lTMzEwX1BhbmVsVHlwZTBjXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZF8xID0gU2lTMzEwX1BhbmVsVHlwZTBkXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZV8xID0gU2lTMzEwX1BhbmVsVHlwZTBlXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZl8xID0gU2lTMzEwX1BhbmVsVHlwZTBmXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMF8yID0gU2lTMzEwX1BhbmVsVHlwZTAwXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMV8yID0gU2lTMzEwX1BhbmVsVHlwZTAxXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMl8yID0gU2lTMzEwX1BhbmVsVHlwZTAyXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwM18yID0gU2lTMzEwX1BhbmVsVHlwZTAzXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8yID0gU2lTMzEwX1BhbmVsVHlwZTA0XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNV8yID0gU2lTMzEwX1BhbmVsVHlwZTA1XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNl8yID0gU2lTMzEwX1BhbmVsVHlwZTA2XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwN18yID0gU2lTMzEwX1BhbmVsVHlwZTA3XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOF8yID0gU2lTMzEwX1BhbmVsVHlwZTA4XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOV8yID0gU2lTMzEwX1BhbmVsVHlwZTA5XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYV8yID0gU2lTMzEwX1BhbmVsVHlwZTBhXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYl8yID0gU2lTMzEwX1BhbmVsVHlwZTBiXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwY18yID0gU2lTMzEwX1BhbmVsVHlwZTBjXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZF8yID0gU2lTMzEwX1BhbmVsVHlwZTBkXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZV8yID0gU2lTMzEwX1BhbmVsVHlwZTBlXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZl8yID0gU2lTMzEwX1BhbmVsVHlwZTBmXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGVOU18xID0gU2lTMzEwX1BhbmVsVHlwZU5TXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGVOU18yID0gU2lTMzEwX1BhbmVsVHlwZU5TXzI7Ci0KICAgIFNpU19Qci0+U2lTX0NIVFZVUEFMRGF0YSAgPSBTaVMzMTBfQ0hUVlVQQUxEYXRhOwogICAgU2lTX1ByLT5TaVNfQ0hUVk9QQUxEYXRhICA9IFNpUzMxMF9DSFRWT1BBTERhdGE7CiAgICBTaVNfUHItPlNpU19DSFRWVVBBTE1EYXRhID0gU2lTMzEwX0NIVFZVUEFMTURhdGE7CkBAIC00NzgsMzMgKzI4OSwxMSBAQAogICAgU2lTX1ByLT5TaVNfQ0hUVk9QQUxORGF0YSA9IFNpUzMxMF9DSFRWT1BBTE5EYXRhOwogICAgU2lTX1ByLT5TaVNfQ0hUVlNPUEFMRGF0YSA9IFNpUzMxMF9DSFRWU09QQUxEYXRhOwogCi0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTgwMHg2MDBfMSAgICAgPSBTaVMzMTBfTFZEU0NSVDE4MDB4NjAwXzE7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NzY4XzEgICAgPSBTaVMzMTBfTFZEU0NSVDExMDI0eDc2OF8xOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMjgweDEwMjRfMSAgID0gU2lTMzEwX0xWRFNDUlQxMTI4MHgxMDI0XzE7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTE0MDB4MTA1MF8xICAgPSBTaVMzMTBfTFZEU0NSVDExNDAweDEwNTBfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTYwMHgxMjAwXzEgICA9IFNpUzMxMF9MVkRTQ1JUMTE2MDB4MTIwMF8xOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDE4MDB4NjAwXzFfSCAgID0gU2lTMzEwX0xWRFNDUlQxODAweDYwMF8xX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NzY4XzFfSCAgPSBTaVMzMTBfTFZEU0NSVDExMDI0eDc2OF8xX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEyODB4MTAyNF8xX0ggPSBTaVMzMTBfTFZEU0NSVDExMjgweDEwMjRfMV9IOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExNDAweDEwNTBfMV9IID0gU2lTMzEwX0xWRFNDUlQxMTQwMHgxMDUwXzFfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTYwMHgxMjAwXzFfSCA9IFNpUzMxMF9MVkRTQ1JUMTE2MDB4MTIwMF8xX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTgwMHg2MDBfMiAgICAgPSBTaVMzMTBfTFZEU0NSVDE4MDB4NjAwXzI7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NzY4XzIgICAgPSBTaVMzMTBfTFZEU0NSVDExMDI0eDc2OF8yOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMjgweDEwMjRfMiAgID0gU2lTMzEwX0xWRFNDUlQxMTI4MHgxMDI0XzI7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTE0MDB4MTA1MF8yICAgPSBTaVMzMTBfTFZEU0NSVDExNDAweDEwNTBfMjsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTYwMHgxMjAwXzIgICA9IFNpUzMxMF9MVkRTQ1JUMTE2MDB4MTIwMF8yOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDE4MDB4NjAwXzJfSCAgID0gU2lTMzEwX0xWRFNDUlQxODAweDYwMF8yX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NzY4XzJfSCAgPSBTaVMzMTBfTFZEU0NSVDExMDI0eDc2OF8yX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEyODB4MTAyNF8yX0ggPSBTaVMzMTBfTFZEU0NSVDExMjgweDEwMjRfMl9IOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExNDAweDEwNTBfMl9IID0gU2lTMzEwX0xWRFNDUlQxMTQwMHgxMDUwXzJfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTYwMHgxMjAwXzJfSCA9IFNpUzMxMF9MVkRTQ1JUMTE2MDB4MTIwMF8yX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMVhYWHhYWFhfMSAgICAgPSBTaVMzMTBfTFZEU0NSVDFYWFh4WFhYXzE7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMVhYWHhYWFhfMV9IICAgPSBTaVMzMTBfTFZEU0NSVDFYWFh4WFhYXzFfSDsKLSAgIFNpU19Qci0+U2lTX0NIVFZDUlQxVU5UU0MgICAgICAgICA9IFNpUzMxMF9DSFRWQ1JUMVVOVFNDOwotICAgU2lTX1ByLT5TaVNfQ0hUVkNSVDFPTlRTQyAgICAgICAgID0gU2lTMzEwX0NIVFZDUlQxT05UU0M7Ci0gICBTaVNfUHItPlNpU19DSFRWQ1JUMVVQQUwgICAgICAgICAgPSBTaVMzMTBfQ0hUVkNSVDFVUEFMOwotICAgU2lTX1ByLT5TaVNfQ0hUVkNSVDFPUEFMICAgICAgICAgID0gU2lTMzEwX0NIVFZDUlQxT1BBTDsKLSAgIFNpU19Qci0+U2lTX0NIVFZDUlQxU09QQUwgICAgICAgICA9IFNpUzMxMF9DSFRWQ1JUMU9QQUw7CisgICBTaVNfUHItPlNpU19DSFRWQ1JUMVVOVFNDID0gU2lTMzEwX0NIVFZDUlQxVU5UU0M7CisgICBTaVNfUHItPlNpU19DSFRWQ1JUMU9OVFNDID0gU2lTMzEwX0NIVFZDUlQxT05UU0M7CisgICBTaVNfUHItPlNpU19DSFRWQ1JUMVVQQUwgID0gU2lTMzEwX0NIVFZDUlQxVVBBTDsKKyAgIFNpU19Qci0+U2lTX0NIVFZDUlQxT1BBTCAgPSBTaVMzMTBfQ0hUVkNSVDFPUEFMOworICAgU2lTX1ByLT5TaVNfQ0hUVkNSVDFTT1BBTCA9IFNpUzMxMF9DSFRWQ1JUMU9QQUw7CiAKICAgIFNpU19Qci0+U2lTX0NIVFZSZWdfVU5UU0MgPSBTaVMzMTBfQ0hUVlJlZ19VTlRTQzsKICAgIFNpU19Qci0+U2lTX0NIVFZSZWdfT05UU0MgPSBTaVMzMTBfQ0hUVlJlZ19PTlRTQzsKQEAgLTUyOCwyMDggKzMxNywyMDMgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZAotU2lTSW5pdFB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorQk9PTEVBTgorU2lTSW5pdFB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIHN3aXRjaChId0luZm8tPmpDaGlwVHlwZSkgewotI2lmZGVmIFNJUzMxNUgKLSAgIGNhc2UgU0lTXzMxNUg6Ci0gICBjYXNlIFNJU18zMTU6Ci0gICBjYXNlIFNJU18zMTVQUk86Ci0gICBjYXNlIFNJU181NTA6Ci0gICBjYXNlIFNJU182NTA6Ci0gICBjYXNlIFNJU183NDA6Ci0gICBjYXNlIFNJU18zMzA6Ci0gICBjYXNlIFNJU182NjE6Ci0gICBjYXNlIFNJU183NDE6Ci0gICBjYXNlIFNJU182NjA6Ci0gICBjYXNlIFNJU183NjA6Ci0gICBjYXNlIFNJU183NjE6Ci0gICBjYXNlIFNJU18zNDA6Ci0gICAgICBJbml0VG8zMTBQb2ludGVyKFNpU19QciwgSHdJbmZvKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCisgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKICNpZmRlZiBTSVMzMDAKLSAgIGNhc2UgU0lTXzMwMDoKLSAgIGNhc2UgU0lTXzU0MDoKLSAgIGNhc2UgU0lTXzYzMDoKLSAgIGNhc2UgU0lTXzczMDoKLSAgICAgIEluaXRUbzMwMFBvaW50ZXIoU2lTX1ByLCBId0luZm8pOwotICAgICAgYnJlYWs7CisgICAgICBJbml0VG8zMDBQb2ludGVyKFNpU19Qcik7CisjZWxzZQorICAgICAgcmV0dXJuIEZBTFNFOwogI2VuZGlmCi0gICBkZWZhdWx0OgotICAgICAgYnJlYWs7CisgICB9IGVsc2UgeworI2lmZGVmIFNJUzMxNUgKKyAgICAgIEluaXRUbzMxMFBvaW50ZXIoU2lTX1ByKTsKKyNlbHNlCisgICAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKICAgIH0KKyAgIHJldHVybiBUUlVFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICBIRUxQRVI6IEdldCBNb2RlSUQgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9YRjg2Ci1VU0hPUlQKLVNpU19HZXRNb2RlSUQoaW50IFZHQUVuZ2luZSwgVUxPTkcgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksCi0gICAgICAgICAgICAgIGludCBEZXB0aCwgQk9PTEVBTiBGU1ROLCBpbnQgTENEd2lkdGgsIGludCBMQ0RoZWlnaHQpCisjaWZuZGVmIFNJU19YT1JHX1hGODYKK3N0YXRpYworI2VuZGlmCit1bnNpZ25lZCBzaG9ydAorU2lTX0dldE1vZGVJRChpbnQgVkdBRW5naW5lLCB1bnNpZ25lZCBpbnQgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksCisJCWludCBEZXB0aCwgQk9PTEVBTiBGU1ROLCBpbnQgTENEd2lkdGgsIGludCBMQ0RoZWlnaHQpCiB7Ci0gICBVU0hPUlQgTW9kZUluZGV4ID0gMDsKKyAgIHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleCA9IDA7CiAKICAgIHN3aXRjaChIRGlzcGxheSkKICAgIHsKLSAgICAgY2FzZSAzMjA6Ci0gICAgIAkgIGlmKFZEaXNwbGF5ID09IDIwMCkgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjAwW0RlcHRoXTsKLQkgIGVsc2UgaWYoVkRpc3BsYXkgPT0gMjQwKSB7Ci0JICAgICBpZihGU1ROKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzIweDI0MF9GU1ROW0RlcHRoXTsKLQkgICAgIGVsc2UgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjQwW0RlcHRoXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgNDAwOgotICAgICAgICAgIGlmKCghKFZCRmxhZ3MgJiBDUlQxX0xDREEpKSB8fCAoKExDRHdpZHRoID49IDgwMCkgJiYgKExDRHdpZHRoID49IDYwMCkpKSB7Ci0gICAgICAgICAgICAgaWYoVkRpc3BsYXkgPT0gMzAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNDAweDMwMFtEZXB0aF07Ci0JICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgNTEyOgotICAgICAgICAgIGlmKCghKFZCRmxhZ3MgJiBDUlQxX0xDREEpKSB8fCAoKExDRHdpZHRoID49IDEwMjQpICYmIChMQ0R3aWR0aCA+PSA3NjgpKSkgewotICAgICAgICAgICAgIGlmKFZEaXNwbGF5ID09IDM4NCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzUxMngzODRbRGVwdGhdOwotCSAgfQotICAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIDY0MDoKLSAgICAgICAgICBpZihWRGlzcGxheSA9PSA0ODApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzY0MHg0ODBbRGVwdGhdOwotCSAgZWxzZSBpZihWRGlzcGxheSA9PSA0MDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF82NDB4NDAwW0RlcHRoXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgY2FzZSA3MjA6Ci0gICAgICAgICAgaWYoVkRpc3BsYXkgPT0gNDgwKSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NDgwW0RlcHRoXTsKLSAgICAgICAgICBlbHNlIGlmKFZEaXNwbGF5ID09IDU3NikgTW9kZUluZGV4ID0gTW9kZUluZGV4XzcyMHg1NzZbRGVwdGhdOwotICAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIDc2ODoKLSAgICAgICAgICBpZihWRGlzcGxheSA9PSA1NzYpIE1vZGVJbmRleCA9IE1vZGVJbmRleF83Njh4NTc2W0RlcHRoXTsKLQkgIGJyZWFrOwotICAgICBjYXNlIDgwMDoKLQkgIGlmKFZEaXNwbGF5ID09IDYwMCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODAweDYwMFtEZXB0aF07Ci0JICBlbHNlIGlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzgwMHg0ODBbRGVwdGhdOwotICAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIDg0ODoKLQkgIGlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzg0OHg0ODBbRGVwdGhdOwotCSAgYnJlYWs7Ci0gICAgIGNhc2UgODU2OgotCSAgaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODU2eDQ4MFtEZXB0aF07Ci0JICBicmVhazsKLSAgICAgY2FzZSA5NjA6Ci0JICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgIGlmKFZEaXNwbGF5ID09IDU0MCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfOTYweDU0MFtEZXB0aF07Ci0JICAgICBlbHNlIGlmKFZEaXNwbGF5ID09IDYwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg2MDBbRGVwdGhdOwotCSAgfQotCSAgYnJlYWs7Ci0gICAgIGNhc2UgMTAyNDoKLSAgICAgICAgICBpZihWRGlzcGxheSA9PSA1NzYpICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEwMjR4NTc2W0RlcHRoXTsKLSAgICAgICAgICBlbHNlIGlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEwMjR4NzY4W0RlcHRoXTsKLQkgIGVsc2UgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JICAgICBpZihWRGlzcGxheSA9PSA2MDApICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEwMjR4NjAwW0RlcHRoXTsKLQkgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgY2FzZSAxMTUyOgotICAgICAgICAgIGlmKFZEaXNwbGF5ID09IDg2NCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzExNTJ4ODY0W0RlcHRoXTsKLSAgICAgICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLQkgICAgIGlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzExNTJ4NzY4W0RlcHRoXTsKLQkgIH0KLQkgIGJyZWFrOwotICAgICBjYXNlIDEyODA6Ci0gICAgICAgICAgc3dpdGNoKFZEaXNwbGF5KSB7Ci0JICBjYXNlIDcyMDoKLQkgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDcyMFtEZXB0aF07Ci0JICAgICBicmVhazsKLQkgIGNhc2UgNzY4OgotCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JICAgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzAwXzEyODB4NzY4W0RlcHRoXTsKLQkgICAgIH0gZWxzZSB7Ci0JICAgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzEwXzEyODB4NzY4W0RlcHRoXTsKLQkgICAgIH0KLQkgICAgIGJyZWFrOwotCSAgY2FzZSA4MDA6Ci0JICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDgwMFtEZXB0aF07Ci0JICAgICB9Ci0JICAgICBicmVhazsKLQkgIGNhc2UgOTYwOgotCSAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4OTYwW0RlcHRoXTsKLQkgICAgIGJyZWFrOwotCSAgY2FzZSAxMDI0OgotCSAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4MTAyNFtEZXB0aF07Ci0JICAgICBicmVhazsKLQkgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgY2FzZSAxMzYwOgotICAgICAgICAgIGlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEzNjB4NzY4W0RlcHRoXTsKLQkgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotCSAgICAgaWYoVkRpc3BsYXkgPT0gMTAyNCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMwMF8xMzYweDEwMjRbRGVwdGhdOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgY2FzZSAxNDAwOgotICAgICAgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgaWYoVkRpc3BsYXkgPT0gMTA1MCkgewotCSAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE0MDB4MTA1MFtEZXB0aF07Ci0JICAgICB9Ci0JICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgMTYwMDoKLSAgICAgICAgICBpZihWRGlzcGxheSA9PSAxMjAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTYwMHgxMjAwW0RlcHRoXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgY2FzZSAxNjgwOgotICAgICAgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotICAgICAgICAgICAgIGlmKFZEaXNwbGF5ID09IDEwNTApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xNjgweDEwNTBbRGVwdGhdOwotCSAgfQotICAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIDE5MjA6Ci0gICAgICAgICAgaWYoVkRpc3BsYXkgPT0gMTQ0MCkgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE5MjB4MTQ0MFtEZXB0aF07Ci0JICBlbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgaWYoVkRpc3BsYXkgPT0gMTA4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE5MjB4MTA4MFtEZXB0aF07Ci0JICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgMjA0ODoKLSAgICAgICAgICBpZihWRGlzcGxheSA9PSAxNTM2KSB7Ci0gICAgICAgICAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JICAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMwMF8yMDQ4eDE1MzZbRGVwdGhdOwotICAJICAgICB9IGVsc2UgewotCSAgICAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMTBfMjA0OHgxNTM2W0RlcHRoXTsKLSAgICAgICAgICAgICB9Ci0JICB9Ci0gICAgICAgICAgYnJlYWs7CisJY2FzZSAzMjA6CisJCWlmKFZEaXNwbGF5ID09IDIwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMyMHgyMDBbRGVwdGhdOworCQllbHNlIGlmKFZEaXNwbGF5ID09IDI0MCkgeworCQkJaWYoKFZCRmxhZ3MgJiBDUlQyX0xDRCkgJiYgKEZTVE4pKQorCQkJCU1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjQwX0ZTVE5bRGVwdGhdOworCQkJZWxzZQorCQkJCU1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjQwW0RlcHRoXTsKKwkJfQorCQlicmVhazsKKwljYXNlIDQwMDoKKwkJaWYoKCEoVkJGbGFncyAmIENSVDFfTENEQSkpIHx8ICgoTENEd2lkdGggPj0gODAwKSAmJiAoTENEd2lkdGggPj0gNjAwKSkpIHsKKwkJCWlmKFZEaXNwbGF5ID09IDMwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzQwMHgzMDBbRGVwdGhdOworCQl9CisJCWJyZWFrOworCWNhc2UgNTEyOgorCQlpZigoIShWQkZsYWdzICYgQ1JUMV9MQ0RBKSkgfHwgKChMQ0R3aWR0aCA+PSAxMDI0KSAmJiAoTENEd2lkdGggPj0gNzY4KSkpIHsKKwkJCWlmKFZEaXNwbGF5ID09IDM4NCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzUxMngzODRbRGVwdGhdOworCQl9CisJCWJyZWFrOworCWNhc2UgNjQwOgorCQlpZihWRGlzcGxheSA9PSA0ODApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzY0MHg0ODBbRGVwdGhdOworCQllbHNlIGlmKFZEaXNwbGF5ID09IDQwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzY0MHg0MDBbRGVwdGhdOworCQlicmVhazsKKwljYXNlIDcyMDoKKwkJaWYoVkRpc3BsYXkgPT0gNDgwKSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NDgwW0RlcHRoXTsKKwkJZWxzZSBpZihWRGlzcGxheSA9PSA1NzYpIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NTc2W0RlcHRoXTsKKwkJYnJlYWs7CisJY2FzZSA3Njg6CisJCWlmKFZEaXNwbGF5ID09IDU3NikgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzc2OHg1NzZbRGVwdGhdOworCQlicmVhazsKKwljYXNlIDgwMDoKKwkJaWYoVkRpc3BsYXkgPT0gNjAwKSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF84MDB4NjAwW0RlcHRoXTsKKwkJZWxzZSBpZihWRGlzcGxheSA9PSA0ODApIE1vZGVJbmRleCA9IE1vZGVJbmRleF84MDB4NDgwW0RlcHRoXTsKKwkJYnJlYWs7CisJY2FzZSA4NDg6CisJCWlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzg0OHg0ODBbRGVwdGhdOworCQlicmVhazsKKwljYXNlIDg1NjoKKwkJaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODU2eDQ4MFtEZXB0aF07CisJCWJyZWFrOworCWNhc2UgOTYwOgorCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJCWlmKFZEaXNwbGF5ID09IDU0MCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfOTYweDU0MFtEZXB0aF07CisJCQllbHNlIGlmKFZEaXNwbGF5ID09IDYwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg2MDBbRGVwdGhdOworCQl9CisJCWJyZWFrOworCWNhc2UgMTAyNDoKKwkJaWYoVkRpc3BsYXkgPT0gNTc2KSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMDI0eDU3NltEZXB0aF07CisJCWVsc2UgaWYoVkRpc3BsYXkgPT0gNzY4KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTAyNHg3NjhbRGVwdGhdOworCQllbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCQkJaWYoVkRpc3BsYXkgPT0gNjAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTAyNHg2MDBbRGVwdGhdOworCQl9CisJCWJyZWFrOworCWNhc2UgMTE1MjoKKwkJaWYoVkRpc3BsYXkgPT0gODY0KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTE1Mng4NjRbRGVwdGhdOworCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKwkJCWlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzExNTJ4NzY4W0RlcHRoXTsKKwkJfQorCQlicmVhazsKKwljYXNlIDEyODA6CisJCXN3aXRjaChWRGlzcGxheSkgeworCQkJY2FzZSA3MjA6CisJCQkJTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4NzIwW0RlcHRoXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNzY4OgorCQkJCWlmKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCQkJCQlNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzAwXzEyODB4NzY4W0RlcHRoXTsKKwkJCQl9IGVsc2UgeworCQkJCQlNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzEwXzEyODB4NzY4W0RlcHRoXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDgwMDoKKwkJCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJCQkJTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4ODAwW0RlcHRoXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDg1NDoKKwkJCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJCQkJTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4ODU0W0RlcHRoXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDk2MDoKKwkJCQlNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTI4MHg5NjBbRGVwdGhdOworCQkJCWJyZWFrOworCQkJY2FzZSAxMDI0OgorCQkJCU1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDEwMjRbRGVwdGhdOworCQkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgMTM2MDoKKwkJaWYoVkRpc3BsYXkgPT0gNzY4KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTM2MHg3NjhbRGVwdGhdOworCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKwkJCWlmKFZEaXNwbGF5ID09IDEwMjQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMDBfMTM2MHgxMDI0W0RlcHRoXTsKKwkJfQorCQlicmVhazsKKwljYXNlIDE0MDA6CisJCWlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQkJaWYoVkRpc3BsYXkgPT0gMTA1MCkgeworCQkJCU1vZGVJbmRleCA9IE1vZGVJbmRleF8xNDAweDEwNTBbRGVwdGhdOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgMTYwMDoKKwkJaWYoVkRpc3BsYXkgPT0gMTIwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE2MDB4MTIwMFtEZXB0aF07CisJCWJyZWFrOworCWNhc2UgMTY4MDoKKwkJaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7CisJCQlpZihWRGlzcGxheSA9PSAxMDUwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTY4MHgxMDUwW0RlcHRoXTsKKwkJfQorCQlicmVhazsKKwljYXNlIDE5MjA6CisJCWlmKFZEaXNwbGF5ID09IDE0NDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xOTIweDE0NDBbRGVwdGhdOworCQllbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQkJaWYoVkRpc3BsYXkgPT0gMTA4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE5MjB4MTA4MFtEZXB0aF07CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyMDQ4OgorCQlpZihWRGlzcGxheSA9PSAxNTM2KSB7CisJCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKwkJCQlNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzAwXzIwNDh4MTUzNltEZXB0aF07CisJCQl9IGVsc2UgeworCQkJCU1vZGVJbmRleCA9IE1vZGVJbmRleF8zMTBfMjA0OHgxNTM2W0RlcHRoXTsKKwkJCX0KKwkJfQorCQlicmVhazsKICAgIH0KIAotICAgcmV0dXJuKE1vZGVJbmRleCk7CisgICByZXR1cm4gTW9kZUluZGV4OwogfQotI2VuZGlmCiAKLVVTSE9SVAotU2lTX0dldE1vZGVJRF9MQ0QoaW50IFZHQUVuZ2luZSwgVUxPTkcgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksCi0gICAgICAgICAgICAgICAgICBpbnQgRGVwdGgsIEJPT0xFQU4gRlNUTiwgVVNIT1JUIEN1c3RvbVQsIGludCBMQ0R3aWR0aCwgaW50IExDRGhlaWdodCkKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0TW9kZUlEX0xDRChpbnQgVkdBRW5naW5lLCB1bnNpZ25lZCBpbnQgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksCisJCWludCBEZXB0aCwgQk9PTEVBTiBGU1ROLCB1bnNpZ25lZCBzaG9ydCBDdXN0b21ULCBpbnQgTENEd2lkdGgsIGludCBMQ0RoZWlnaHQsCisJCXVuc2lnbmVkIGludCBWQkZsYWdzMikKIHsKLSAgIFVTSE9SVCBNb2RlSW5kZXggPSAwOworICAgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4ID0gMDsKIAotICAgaWYoVkJGbGFncyAmIChWQl9MVkRTIHwgVkJfMzB4QkRIKSkgeworICAgaWYoVkJGbGFnczIgJiAoVkIyX0xWRFMgfCBWQjJfMzB4QkRIKSkgewogCiAgICAgICBzd2l0Y2goSERpc3BsYXkpCiAgICAgICB7CiAJY2FzZSAzMjA6Ci0JICAgICBpZihDdXN0b21UICE9IENVVF9QQU5FTDg0OCkgewotICAgICAJICAJaWYoVkRpc3BsYXkgPT0gMjAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzIweDIwMFtEZXB0aF07Ci0JICAJZWxzZSBpZihWRGlzcGxheSA9PSAyNDApIHsKKwkgICAgIGlmKChDdXN0b21UICE9IENVVF9QQU5FTDg0OCkgJiYgKEN1c3RvbVQgIT0gQ1VUX1BBTkVMODU2KSkgeworCQlpZihWRGlzcGxheSA9PSAyMDApIHsKKwkJICAgaWYoIUZTVE4pIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjAwW0RlcHRoXTsKKwkJfSBlbHNlIGlmKFZEaXNwbGF5ID09IDI0MCkgewogCQkgICBpZighRlNUTikgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMyMHgyNDBbRGVwdGhdOwotICAgICAgICAgIAkgICBlbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotICAgICAgICAgICAgICAgICAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjQwX0ZTVE5bRGVwdGhdOworCQkgICBlbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzIweDI0MF9GU1ROW0RlcHRoXTsKIAkJICAgfQogCQl9CiAJICAgICB9Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgIAljYXNlIDQwMDoKLQkgICAgIGlmKEN1c3RvbVQgIT0gQ1VUX1BBTkVMODQ4KSB7Ci0JICAgICAgICBpZighKChWR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpICYmIChWQkZsYWdzICYgVkJfVFJVTVBJT04pKSkgewotICAgICAgICAgIAkgICBpZihWRGlzcGxheSA9PSAzMDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF80MDB4MzAwW0RlcHRoXTsKKwkgICAgIGJyZWFrOworCWNhc2UgNDAwOgorCSAgICAgaWYoKEN1c3RvbVQgIT0gQ1VUX1BBTkVMODQ4KSAmJiAoQ3VzdG9tVCAhPSBDVVRfUEFORUw4NTYpKSB7CisJCWlmKCEoKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgJiYgKFZCRmxhZ3MyICYgVkIyX1RSVU1QSU9OKSkpIHsKKwkJICAgaWYoVkRpc3BsYXkgPT0gMzAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNDAweDMwMFtEZXB0aF07CiAJCX0KIAkgICAgIH0KLSAgICAgICAgICAgICBicmVhazsKKwkgICAgIGJyZWFrOwogCWNhc2UgNTEyOgotCSAgICAgaWYoQ3VzdG9tVCAhPSBDVVRfUEFORUw4NDgpIHsKLQkgICAgICAgIGlmKCEoKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgJiYgKFZCRmxhZ3MgJiBWQl9UUlVNUElPTikpKSB7CisJICAgICBpZigoQ3VzdG9tVCAhPSBDVVRfUEFORUw4NDgpICYmIChDdXN0b21UICE9IENVVF9QQU5FTDg1NikpIHsKKwkJaWYoISgoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSAmJiAoVkJGbGFnczIgJiBWQjJfVFJVTVBJT04pKSkgewogCQkgICBpZihMQ0R3aWR0aCA+PSAxMDI0ICYmIExDRHdpZHRoICE9IDExNTIgJiYgTENEaGVpZ2h0ID49IDc2OCkgewogCQkgICAgICBpZihWRGlzcGxheSA9PSAzODQpIHsKIAkJICAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzUxMngzODRbRGVwdGhdOwpAQCAtNzM5LDkgKzUyMywxMCBAQAogCSAgICAgfQogCSAgICAgYnJlYWs7CiAJY2FzZSA2NDA6Ci0JICAgICBpZihWRGlzcGxheSA9PSA0ODApICAgICAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzY0MHg0ODBbRGVwdGhdOworCSAgICAgaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNjQweDQ4MFtEZXB0aF07CiAJICAgICBlbHNlIGlmKFZEaXNwbGF5ID09IDQwMCkgewotCSAgICAgICAgaWYoQ3VzdG9tVCAhPSBDVVRfUEFORUw4NDgpIE1vZGVJbmRleCA9IE1vZGVJbmRleF82NDB4NDAwW0RlcHRoXTsKKwkJaWYoKEN1c3RvbVQgIT0gQ1VUX1BBTkVMODQ4KSAmJiAoQ3VzdG9tVCAhPSBDVVRfUEFORUw4NTYpKQorCQkgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNjQweDQwMFtEZXB0aF07CiAJICAgICB9CiAJICAgICBicmVhazsKIAljYXNlIDgwMDoKQEAgLTc1Miw2ICs1MzcsMTEgQEAKIAkgICAgICAgIGlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzg0OHg0ODBbRGVwdGhdOwogCSAgICAgfQogCSAgICAgYnJlYWs7CisJY2FzZSA4NTY6CisJICAgICBpZihDdXN0b21UID09IENVVF9QQU5FTDg1NikgeworCSAgICAgICAgaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODU2eDQ4MFtEZXB0aF07CisJICAgICB9CisJICAgICBicmVhazsKIAljYXNlIDEwMjQ6CiAJICAgICBpZihWRGlzcGxheSA9PSA3NjgpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMDI0eDc2OFtEZXB0aF07CiAJICAgICBlbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewpAQCAtNzYyLDcgKzU1Miw3IEBACiAJICAgICBicmVhazsKIAljYXNlIDExNTI6CiAJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLQkgICAgICAgIGlmKChWRGlzcGxheSA9PSA3NjgpICYmIChMQ0RoZWlnaHQgPT0gNzY4KSkgeworCQlpZigoVkRpc3BsYXkgPT0gNzY4KSAmJiAoTENEaGVpZ2h0ID09IDc2OCkpIHsKIAkJICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzExNTJ4NzY4W0RlcHRoXTsKIAkJfQogCSAgICAgfQpAQCAtNzcwLDQ5ICs1NjAsNDkgQEAKICAgICAgICAgY2FzZSAxMjgwOgogCSAgICAgaWYoVkRpc3BsYXkgPT0gMTAyNCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4MTAyNFtEZXB0aF07CiAJICAgICBlbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgICAgaWYoKFZEaXNwbGF5ID09IDc2OCkgJiYgKExDRGhlaWdodCA9PSA3NjgpKSB7CisJCWlmKChWRGlzcGxheSA9PSA3NjgpICYmIChMQ0RoZWlnaHQgPT0gNzY4KSkgewogCQkgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzEwXzEyODB4NzY4W0RlcHRoXTsKIAkJfQogCSAgICAgfQogCSAgICAgYnJlYWs7CiAJY2FzZSAxMzYwOgogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JICAgICAgICBpZihDdXN0b21UID09IENVVF9CQVJDTzEzNjYpIHsKKwkJaWYoQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB7CiAJCSAgIGlmKFZEaXNwbGF5ID09IDEwMjQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMDBfMTM2MHgxMDI0W0RlcHRoXTsKIAkJfQogCSAgICAgfQogCSAgICAgaWYoQ3VzdG9tVCA9PSBDVVRfUEFORUw4NDgpIHsKLQkgICAgICAgIGlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEzNjB4NzY4W0RlcHRoXTsKKwkJaWYoVkRpc3BsYXkgPT0gNzY4KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTM2MHg3NjhbRGVwdGhdOwogCSAgICAgfQogCSAgICAgYnJlYWs7CiAJY2FzZSAxNDAwOgogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSAxMDUwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTQwMHgxMDUwW0RlcHRoXTsKKwkJaWYoVkRpc3BsYXkgPT0gMTA1MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE0MDB4MTA1MFtEZXB0aF07CiAJICAgICB9CiAJICAgICBicmVhazsKIAljYXNlIDE2MDA6CiAJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgIGlmKFZEaXNwbGF5ID09IDEyMDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xNjAweDEyMDBbRGVwdGhdOworCQlpZihWRGlzcGxheSA9PSAxMjAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTYwMHgxMjAwW0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogICAgICAgfQogCi0gICB9IGVsc2UgaWYoVkJGbGFncyAmIFZCX1NJU0JSSURHRSkgeworICAgfSBlbHNlIGlmKFZCRmxhZ3MyICYgVkIyX1NJU0JSSURHRSkgewogCiAgICAgICBzd2l0Y2goSERpc3BsYXkpCiAgICAgICB7CiAJY2FzZSAzMjA6Ci0gICAgIAkgICAgIGlmKFZEaXNwbGF5ID09IDIwMCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzIweDIwMFtEZXB0aF07CisJICAgICBpZihWRGlzcGxheSA9PSAyMDApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMyMHgyMDBbRGVwdGhdOwogCSAgICAgZWxzZSBpZihWRGlzcGxheSA9PSAyNDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjQwW0RlcHRoXTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgCWNhc2UgNDAwOgorCSAgICAgYnJlYWs7CisJY2FzZSA0MDA6CiAJICAgICBpZihMQ0R3aWR0aCA+PSA4MDAgJiYgTENEaGVpZ2h0ID49IDYwMCkgewotICAgICAgICAgICAgICAgIGlmKFZEaXNwbGF5ID09IDMwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzQwMHgzMDBbRGVwdGhdOworCQlpZihWRGlzcGxheSA9PSAzMDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF80MDB4MzAwW0RlcHRoXTsKIAkgICAgIH0KLSAgICAgICAgICAgICBicmVhazsKKwkgICAgIGJyZWFrOwogCWNhc2UgNTEyOgogCSAgICAgaWYoTENEd2lkdGggPj0gMTAyNCAmJiBMQ0RoZWlnaHQgPj0gNzY4ICYmIExDRHdpZHRoICE9IDExNTIpIHsKLQkgICAgICAgIGlmKFZEaXNwbGF5ID09IDM4NCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzUxMngzODRbRGVwdGhdOworCQlpZihWRGlzcGxheSA9PSAzODQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF81MTJ4Mzg0W0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgNjQwOgpAQCAtODIxLDk2ICs2MTEsMTE1IEBACiAJICAgICBicmVhazsKIAljYXNlIDcyMDoKIAkgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgICAgaWYoVkRpc3BsYXkgPT0gNDgwKSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NDgwW0RlcHRoXTsKKwkJaWYoVkRpc3BsYXkgPT0gNDgwKSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NDgwW0RlcHRoXTsKIAkJZWxzZSBpZihWRGlzcGxheSA9PSA1NzYpIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NTc2W0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgNzY4OgogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA1NzYpIE1vZGVJbmRleCA9IE1vZGVJbmRleF83Njh4NTc2W0RlcHRoXTsKKwkJaWYoVkRpc3BsYXkgPT0gNTc2KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNzY4eDU3NltEZXB0aF07CiAJICAgICB9CiAJICAgICBicmVhazsKIAljYXNlIDgwMDoKIAkgICAgIGlmKFZEaXNwbGF5ID09IDYwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzgwMHg2MDBbRGVwdGhdOwogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA0ODApIE1vZGVJbmRleCA9IE1vZGVJbmRleF84MDB4NDgwW0RlcHRoXTsKKwkJaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODAweDQ4MFtEZXB0aF07CiAJICAgICB9CiAJICAgICBicmVhazsKIAljYXNlIDg0ODoKIAkgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgICAgaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODQ4eDQ4MFtEZXB0aF07CisJCWlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzg0OHg0ODBbRGVwdGhdOwogCSAgICAgfQogCSAgICAgYnJlYWs7CiAJY2FzZSA4NTY6CiAJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgIGlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzg1Nng0ODBbRGVwdGhdOworCQlpZihWRGlzcGxheSA9PSA0ODApIE1vZGVJbmRleCA9IE1vZGVJbmRleF84NTZ4NDgwW0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgOTYwOgogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA1NDApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg1NDBbRGVwdGhdOworCQlpZihWRGlzcGxheSA9PSA1NDApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg1NDBbRGVwdGhdOwogCQllbHNlIGlmKFZEaXNwbGF5ID09IDYwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg2MDBbRGVwdGhdOwogCSAgICAgfQogCSAgICAgYnJlYWs7CiAJY2FzZSAxMDI0OgogCSAgICAgaWYoVkRpc3BsYXkgPT0gNzY4KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTAyNHg3NjhbRGVwdGhdOwogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA1NzYpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMDI0eDU3NltEZXB0aF07CisJCWlmKFZEaXNwbGF5ID09IDU3NikgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEwMjR4NTc2W0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgMTE1MjoKIAkgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgICAgaWYoVkRpc3BsYXkgPT0gODY0KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTE1Mng4NjRbRGVwdGhdOworCQlpZihWRGlzcGxheSA9PSA4NjQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMTUyeDg2NFtEZXB0aF07CiAJICAgICB9CiAJICAgICBicmVhazsKIAljYXNlIDEyODA6CiAJICAgICBzd2l0Y2goVkRpc3BsYXkpIHsKIAkgICAgIGNhc2UgNzIwOgotCSAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4NzIwW0RlcHRoXTsKKwkJTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4NzIwW0RlcHRoXTsKIAkgICAgIGNhc2UgNzY4OgotCSAgICAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7CisJCWlmKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewogCQkgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzAwXzEyODB4NzY4W0RlcHRoXTsKIAkJfSBlbHNlIHsKIAkJICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMxMF8xMjgweDc2OFtEZXB0aF07CiAJCX0KIAkJYnJlYWs7CiAJICAgICBjYXNlIDgwMDoKLQkgICAgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKIAkJICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4ODAwW0RlcHRoXTsKIAkJfQogCQlicmVhazsKKwkgICAgIGNhc2UgODU0OgorCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4ODU0W0RlcHRoXTsKKwkJfQorCQlicmVhazsKIAkgICAgIGNhc2UgOTYwOgotCSAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4OTYwW0RlcHRoXTsKKwkJTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4OTYwW0RlcHRoXTsKIAkJYnJlYWs7CiAJICAgICBjYXNlIDEwMjQ6Ci0JICAgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTI4MHgxMDI0W0RlcHRoXTsKKwkJTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4MTAyNFtEZXB0aF07CiAJCWJyZWFrOwogCSAgICAgfQogCSAgICAgYnJlYWs7CiAJY2FzZSAxMzYwOgotCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA3NjgpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMzYweDc2OFtEZXB0aF07CisJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsgIC8qIE9WRVIxMjgwIG9ubHk/ICovCisJCWlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEzNjB4NzY4W0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgMTQwMDoKIAkgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgICAgaWYoVkJGbGFncyAmIChWQl8zMDFDIHwgVkJfMzAyTFYgfCBWQl8zMDJFTFYpKSB7CisJCWlmKFZCRmxhZ3MyICYgVkIyX0xDRE9WRVIxMjgwQlJJREdFKSB7CiAJCSAgIGlmKFZEaXNwbGF5ID09IDEwNTApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xNDAweDEwNTBbRGVwdGhdOwogCQl9CiAJICAgICB9CiAJICAgICBicmVhazsKIAljYXNlIDE2MDA6CiAJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgIGlmKFZCRmxhZ3MgJiAoVkJfMzAxQyB8IFZCXzMwMkxWIHwgVkJfMzAyRUxWKSkgewotCSAgICAgICAgICAgaWYoVkRpc3BsYXkgPT0gMTIwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE2MDB4MTIwMFtEZXB0aF07CisJCWlmKFZCRmxhZ3MyICYgVkIyX0xDRE9WRVIxMjgwQlJJREdFKSB7CisJCSAgIGlmKFZEaXNwbGF5ID09IDEyMDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xNjAweDEyMDBbRGVwdGhdOwogCQl9CiAJICAgICB9CiAJICAgICBicmVhazsKICNpZm5kZWYgVkJfRk9SQklEX0NSVDJMQ0RfT1ZFUl8xNjAwCiAJY2FzZSAxNjgwOgogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWQkZsYWdzICYgKFZCXzMwMUMgfCBWQl8zMDJMViB8IFZCXzMwMkVMVikpIHsKLQkgICAgICAgICAgIGlmKFZEaXNwbGF5ID09IDEwNTApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xNjgweDEwNTBbRGVwdGhdOworCQlpZihWQkZsYWdzMiAmIFZCMl9MQ0RPVkVSMTI4MEJSSURHRSkgeworCQkgICBpZihWRGlzcGxheSA9PSAxMDUwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTY4MHgxMDUwW0RlcHRoXTsKKwkJfQorCSAgICAgfQorCSAgICAgYnJlYWs7CisJY2FzZSAxOTIwOgorCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7CisJCWlmKFZCRmxhZ3MyICYgVkIyX0xDRE9WRVIxNjAwQlJJREdFKSB7CisJCSAgIGlmKFZEaXNwbGF5ID09IDE0NDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xOTIweDE0NDBbRGVwdGhdOworCQl9CisJICAgICB9CisJICAgICBicmVhazsKKwljYXNlIDIwNDg6CisJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJaWYoVkJGbGFnczIgJiBWQjJfTENET1ZFUjE2MDBCUklER0UpIHsKKwkJICAgaWYoVkRpc3BsYXkgPT0gMTUzNikgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMxMF8yMDQ4eDE1MzZbRGVwdGhdOwogCQl9CiAJICAgICB9CiAJICAgICBicmVhazsKQEAgLTkyMSwxNiArNzMwLDE3IEBACiAgICByZXR1cm4gTW9kZUluZGV4OwogfQogCi1VU0hPUlQKLVNpU19HZXRNb2RlSURfVFYoaW50IFZHQUVuZ2luZSwgVUxPTkcgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksIGludCBEZXB0aCkKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0TW9kZUlEX1RWKGludCBWR0FFbmdpbmUsIHVuc2lnbmVkIGludCBWQkZsYWdzLCBpbnQgSERpc3BsYXksIGludCBWRGlzcGxheSwgaW50IERlcHRoLAorCQkJdW5zaWduZWQgaW50IFZCRmxhZ3MyKQogewotICAgVVNIT1JUIE1vZGVJbmRleCA9IDA7CisgICB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXggPSAwOwogCi0gICBpZihWQkZsYWdzICYgVkJfQ0hST05URUwpIHsKKyAgIGlmKFZCRmxhZ3MyICYgVkIyX0NIUk9OVEVMKSB7CiAKICAgICAgIHN3aXRjaChIRGlzcGxheSkKICAgICAgIHsKLSAgICAgIAljYXNlIDUxMjoKKwljYXNlIDUxMjoKIAkgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewogCQlpZihWRGlzcGxheSA9PSAzODQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF81MTJ4Mzg0W0RlcHRoXTsKIAkgICAgIH0KQEAgLTk0NCwyNyArNzU0LDI3IEBACiAJICAgICBicmVhazsKIAljYXNlIDEwMjQ6CiAJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgIGlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEwMjR4NzY4W0RlcHRoXTsKKwkJaWYoVkRpc3BsYXkgPT0gNzY4KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTAyNHg3NjhbRGVwdGhdOwogCSAgICAgfQogCSAgICAgYnJlYWs7CiAgICAgICB9CiAKLSAgIH0gZWxzZSBpZihWQkZsYWdzICYgVkJfU0lTVFZCUklER0UpIHsKKyAgIH0gZWxzZSBpZihWQkZsYWdzMiAmIFZCMl9TSVNUVkJSSURHRSkgewogCiAgICAgICBzd2l0Y2goSERpc3BsYXkpCiAgICAgICB7CiAJY2FzZSAzMjA6Ci0gICAgIAkgICAgIGlmKFZEaXNwbGF5ID09IDIwMCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzIweDIwMFtEZXB0aF07CisJICAgICBpZihWRGlzcGxheSA9PSAyMDApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMyMHgyMDBbRGVwdGhdOwogCSAgICAgZWxzZSBpZihWRGlzcGxheSA9PSAyNDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjQwW0RlcHRoXTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MDA6Ci0gICAgICAgICAgICAgaWYoVkRpc3BsYXkgPT0gMzAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNDAweDMwMFtEZXB0aF07Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAJY2FzZSA1MTI6CisJICAgICBicmVhazsKKwljYXNlIDQwMDoKKwkgICAgIGlmKFZEaXNwbGF5ID09IDMwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzQwMHgzMDBbRGVwdGhdOworCSAgICAgYnJlYWs7CisJY2FzZSA1MTI6CiAJICAgICBpZiggKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgKFRWX1lQQlBSNzUwUCB8IFRWX1lQQlBSMTA4MEkpKSkgfHwKLQkgICAgICAgICAoVkJGbGFncyAmIFRWX0hJVklTSU9OKSAJCQkJCSAgICAgIHx8Ci0JICAgICAgICAgKCghKFZCRmxhZ3MgJiAoVFZfWVBCUFIgfCBUVl9QQUxNKSkpICYmIChWQkZsYWdzICYgVFZfUEFMKSkgKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSAzODQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF81MTJ4Mzg0W0RlcHRoXTsKKwkJIChWQkZsYWdzICYgVFZfSElWSVNJT04pIAkJCQkJICAgICAgfHwKKwkJICgoIShWQkZsYWdzICYgKFRWX1lQQlBSIHwgVFZfUEFMTSkpKSAmJiAoVkJGbGFncyAmIFRWX1BBTCkpICkgeworCQlpZihWRGlzcGxheSA9PSAzODQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF81MTJ4Mzg0W0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgNjQwOgpAQCAtOTczLDM0ICs3ODMsMzQgQEAKIAkgICAgIGJyZWFrOwogCWNhc2UgNzIwOgogCSAgICAgaWYoKCEoVkJGbGFncyAmIFRWX0hJVklTSU9OKSkgJiYgKCEoKFZCRmxhZ3MgJiBUVl9ZUEJQUikgJiYgKFZCRmxhZ3MgJiBUVl9ZUEJQUjEwODBJKSkpKSB7Ci0gICAgICAgICAgICAgICAgaWYoVkRpc3BsYXkgPT0gNDgwKSB7Ci0gICAgICAgICAgICAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzcyMHg0ODBbRGVwdGhdOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihWRGlzcGxheSA9PSA1NzYpIHsKKwkJaWYoVkRpc3BsYXkgPT0gNDgwKSB7CisJCSAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NDgwW0RlcHRoXTsKKwkJfSBlbHNlIGlmKFZEaXNwbGF5ID09IDU3NikgewogCQkgICBpZiggKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgVFZfWVBCUFI3NTBQKSkgfHwKIAkJICAgICAgICgoIShWQkZsYWdzICYgKFRWX1lQQlBSIHwgVFZfUEFMTSkpKSAmJiAoVkJGbGFncyAmIFRWX1BBTCkpICkKLSAgICAgICAgICAgICAgICAgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNzIweDU3NltEZXB0aF07Ci0gICAgICAgICAgICAgICAgfQorCQkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNzIweDU3NltEZXB0aF07CisJCX0KIAkgICAgIH0KICAgICAgICAgICAgICBicmVhazsKIAljYXNlIDc2ODoKIAkgICAgIGlmKCghKFZCRmxhZ3MgJiBUVl9ISVZJU0lPTikpICYmICghKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgVFZfWVBCUFIxMDgwSSkpKSkgewotCSAgICAgICAgaWYoICgoVkJGbGFncyAmIFRWX1lQQlBSKSAmJiAoVkJGbGFncyAmIFRWX1lQQlBSNzUwUCkpIHx8CisJCWlmKCAoKFZCRmxhZ3MgJiBUVl9ZUEJQUikgJiYgKFZCRmxhZ3MgJiBUVl9ZUEJQUjc1MFApKSB8fAogCQkgICAgKCghKFZCRmxhZ3MgJiAoVFZfWVBCUFIgfCBUVl9QQUxNKSkpICYmIChWQkZsYWdzICYgVFZfUEFMKSkgKSB7Ci0gICAgICAgICAgCSAgIGlmKFZEaXNwbGF5ID09IDU3NikgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzc2OHg1NzZbRGVwdGhdOworCQkgICBpZihWRGlzcGxheSA9PSA1NzYpIE1vZGVJbmRleCA9IE1vZGVJbmRleF83Njh4NTc2W0RlcHRoXTsKIAkJfQogICAgICAgICAgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgODAwOgogCSAgICAgaWYoVkRpc3BsYXkgPT0gNjAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODAweDYwMFtEZXB0aF07CiAJICAgICBlbHNlIGlmKFZEaXNwbGF5ID09IDQ4MCkgewotCSAgICAgICAgaWYoKFZCRmxhZ3MgJiBUVl9ISVZJU0lPTikgfHwgKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgVFZfWVBCUFIxMDgwSSkpKSB7CisJCWlmKCEoKFZCRmxhZ3MgJiBUVl9ZUEJQUikgJiYgKFZCRmxhZ3MgJiBUVl9ZUEJQUjc1MFApKSkgewogCQkgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODAweDQ4MFtEZXB0aF07CiAJCX0KIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgOTYwOgogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA2MDApIHsKKwkJaWYoVkRpc3BsYXkgPT0gNjAwKSB7CiAJCSAgIGlmKChWQkZsYWdzICYgVFZfSElWSVNJT04pIHx8ICgoVkJGbGFncyAmIFRWX1lQQlBSKSAmJiAoVkJGbGFncyAmIFRWX1lQQlBSMTA4MEkpKSkgewogCQkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfOTYweDYwMFtEZXB0aF07CiAJCSAgIH0KQEAgLTEwMDksMjUgKzgxOSwyOCBAQAogCSAgICAgYnJlYWs7CiAJY2FzZSAxMDI0OgogCSAgICAgaWYoVkRpc3BsYXkgPT0gNzY4KSB7Ci0JCWlmKFZCRmxhZ3MgJiAoVkJfMzAxQnxWQl8zMDFDfFZCXzMwMkJ8VkJfMzAxTFZ8VkJfMzAyTFZ8VkJfMzAyRUxWKSkgeworCQlpZihWQkZsYWdzMiAmIFZCMl8zMHhCTFYpIHsKIAkJICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEwMjR4NzY4W0RlcHRoXTsKIAkJfQogCSAgICAgfSBlbHNlIGlmKFZEaXNwbGF5ID09IDU3NikgewotCSAgICAgICAgaWYoKFZCRmxhZ3MgJiBUVl9ISVZJU0lPTikgfHwgKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgVFZfWVBCUFIxMDgwSSkpKSB7CisJCWlmKCAoVkJGbGFncyAmIFRWX0hJVklTSU9OKSB8fAorCQkgICAgKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgVFZfWVBCUFIxMDgwSSkpIHx8CisJCSAgICAoKFZCRmxhZ3MyICYgVkIyXzMweEJMVikgJiYKKwkJICAgICAoKCEoVkJGbGFncyAmIChUVl9ZUEJQUiB8IFRWX1BBTE0pKSkgJiYgKFZCRmxhZ3MgJiBUVl9QQUwpKSkgKSB7CiAJCSAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMDI0eDU3NltEZXB0aF07CiAJCX0KIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgMTI4MDoKIAkgICAgIGlmKFZEaXNwbGF5ID09IDcyMCkgewotCSAgICAgICAgaWYoKFZCRmxhZ3MgJiBUVl9ISVZJU0lPTikgfHwKKwkJaWYoKFZCRmxhZ3MgJiBUVl9ISVZJU0lPTikgfHwKIAkJICAgKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgKFRWX1lQQlBSMTA4MEkgfCBUVl9ZUEJQUjc1MFApKSkpIHsKLQkgICAgICAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDcyMFtEZXB0aF07CisJCSAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDcyMFtEZXB0aF07CiAJCX0KIAkgICAgIH0gZWxzZSBpZihWRGlzcGxheSA9PSAxMDI0KSB7Ci0JICAgICAgICBpZigoVkJGbGFncyAmIFRWX0hJVklTSU9OKSB8fAorCQlpZigoVkJGbGFncyAmIFRWX0hJVklTSU9OKSB8fAogCQkgICAoKFZCRmxhZ3MgJiBUVl9ZUEJQUikgJiYgKFZCRmxhZ3MgJiBUVl9ZUEJQUjEwODBJKSkpIHsKLQkgICAgICAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDEwMjRbRGVwdGhdOworCQkgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTI4MHgxMDI0W0RlcHRoXTsKIAkJfQogCSAgICAgfQogCSAgICAgYnJlYWs7CkBAIC0xMDM2LDk5ICs4NDksMzEgQEAKICAgIHJldHVybiBNb2RlSW5kZXg7CiB9CiAKLVVTSE9SVAotU2lTX0dldE1vZGVJRF9WR0EyKGludCBWR0FFbmdpbmUsIFVMT05HIFZCRmxhZ3MsIGludCBIRGlzcGxheSwgaW50IFZEaXNwbGF5LCBpbnQgRGVwdGgpCit1bnNpZ25lZCBzaG9ydAorU2lTX0dldE1vZGVJRF9WR0EyKGludCBWR0FFbmdpbmUsIHVuc2lnbmVkIGludCBWQkZsYWdzLCBpbnQgSERpc3BsYXksIGludCBWRGlzcGxheSwgaW50IERlcHRoLAorCQkJdW5zaWduZWQgaW50IFZCRmxhZ3MyKQogewotICAgVVNIT1JUIE1vZGVJbmRleCA9IDA7CisgICBpZighKFZCRmxhZ3MyICYgVkIyX1NJU1ZHQTJCUklER0UpKSByZXR1cm4gMDsKIAotICAgaWYoIShWQkZsYWdzICYgKFZCXzMwMXxWQl8zMDFCfFZCXzMwMUN8VkJfMzAyQikpKSByZXR1cm4gMDsKKyAgIGlmKEhEaXNwbGF5ID49IDE5MjApIHJldHVybiAwOwogCiAgICBzd2l0Y2goSERpc3BsYXkpCiAgICB7Ci0JY2FzZSAzMjA6Ci0gICAgIAkgIAlpZihWRGlzcGxheSA9PSAyMDApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMyMHgyMDBbRGVwdGhdOwotCSAgCWVsc2UgaWYoVkRpc3BsYXkgPT0gMjQwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzIweDI0MFtEZXB0aF07Ci0gICAgICAgICAgCWJyZWFrOwotICAgICAJY2FzZSA0MDA6Ci0gICAgICAgICAgCWlmKFZEaXNwbGF5ID09IDMwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzQwMHgzMDBbRGVwdGhdOwotICAgICAgICAgIAlicmVhazsKLSAgCWNhc2UgNTEyOgotCQlpZihWRGlzcGxheSA9PSAzODQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF81MTJ4Mzg0W0RlcHRoXTsKLQkJYnJlYWs7Ci0JY2FzZSA2NDA6Ci0JCWlmKFZEaXNwbGF5ID09IDQ4MCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNjQweDQ4MFtEZXB0aF07Ci0JCWVsc2UgaWYoVkRpc3BsYXkgPT0gNDAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNjQweDQwMFtEZXB0aF07Ci0JCWJyZWFrOwotCWNhc2UgNzIwOgotCQlpZihWRGlzcGxheSA9PSA0ODApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzcyMHg0ODBbRGVwdGhdOwotCQllbHNlIGlmKFZEaXNwbGF5ID09IDU3NikgTW9kZUluZGV4ID0gTW9kZUluZGV4XzcyMHg1NzZbRGVwdGhdOwotCQlicmVhazsKLQljYXNlIDc2ODoKLSAgICAgICAgICAJaWYoVkRpc3BsYXkgPT0gNTc2KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNzY4eDU3NltEZXB0aF07Ci0JICAJYnJlYWs7Ci0JY2FzZSA4MDA6Ci0JCWlmKFZEaXNwbGF5ID09IDYwMCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODAweDYwMFtEZXB0aF07Ci0gICAJICAgICAgICBlbHNlIGlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzgwMHg0ODBbRGVwdGhdOwotCQlicmVhazsKLQljYXNlIDg0ODoKLQkJaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODQ4eDQ4MFtEZXB0aF07Ci0JCWJyZWFrOwotCWNhc2UgODU2OgotCQlpZihWRGlzcGxheSA9PSA0ODApIE1vZGVJbmRleCA9IE1vZGVJbmRleF84NTZ4NDgwW0RlcHRoXTsKLQkJYnJlYWs7Ci0JY2FzZSA5NjA6Ci0JCWlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCQkgICBpZihWRGlzcGxheSA9PSA1NDApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg1NDBbRGVwdGhdOwotCQkgICBlbHNlIGlmKFZEaXNwbGF5ID09IDYwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg2MDBbRGVwdGhdOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMTAyNDoKLQkJaWYoVkRpc3BsYXkgPT0gNzY4KSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMDI0eDc2OFtEZXB0aF07Ci0JCWVsc2UgaWYoVkRpc3BsYXkgPT0gNTc2KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTAyNHg1NzZbRGVwdGhdOwotCQlicmVhazsKLQljYXNlIDExNTI6Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA4NjQpICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMTUyeDg2NFtEZXB0aF07Ci0JCWVsc2UgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JCSAgIGlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzExNTJ4NzY4W0RlcHRoXTsKLQkJfQotCQlicmVhazsKLQljYXNlIDEyODA6Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA3NjgpIHsKLQkJICAgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JCSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMDBfMTI4MHg3NjhbRGVwdGhdOwotCQkgICB9IGVsc2UgewotCQkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzEwXzEyODB4NzY4W0RlcHRoXTsKLQkJICAgfQotCQl9IGVsc2UgaWYoVkRpc3BsYXkgPT0gMTAyNCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4MTAyNFtEZXB0aF07Ci0JCWVsc2UgaWYoVkRpc3BsYXkgPT0gNzIwKSAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTI4MHg3MjBbRGVwdGhdOwotCQllbHNlIGlmKFZEaXNwbGF5ID09IDgwMCkgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4ODAwW0RlcHRoXTsKLQkJZWxzZSBpZihWRGlzcGxheSA9PSA5NjApICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDk2MFtEZXB0aF07Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIDEzNjA6Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA3NjgpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMzYweDc2OFtEZXB0aF07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQwMDoKLQkJaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICAgICBpZihWRGlzcGxheSA9PSAxMDUwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTQwMHgxMDUwW0RlcHRoXTsKLQkJfQotCQlicmVhazsKIAljYXNlIDE2MDA6Ci0JCWlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCQkgICBpZihWQkZsYWdzICYgKFZCXzMwMUJ8VkJfMzAxQ3xWQl8zMDJCKSkgewotCSAgICAgICAgICAgICAgaWYoVkRpc3BsYXkgPT0gMTIwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE2MDB4MTIwMFtEZXB0aF07Ci0JCSAgIH0KKwkJaWYoVkRpc3BsYXkgPT0gMTIwMCkgeworCQkJaWYoVkdBRW5naW5lICE9IFNJU18zMTVfVkdBKSByZXR1cm4gMDsKKwkJCWlmKCEoVkJGbGFnczIgJiBWQjJfMzB4QikpIHJldHVybiAwOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgMTY4MDoKLQkJaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JCSAgIGlmKFZCRmxhZ3MgJiAoVkJfMzAxQnxWQl8zMDFDfFZCXzMwMkIpKSB7Ci0JICAgICAgICAgICAgICBpZihWRGlzcGxheSA9PSAxMDUwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTY4MHgxMDUwW0RlcHRoXTsKLQkJICAgfQorCQlpZihWRGlzcGxheSA9PSAxMDUwKSB7CisJCQlpZihWR0FFbmdpbmUgIT0gU0lTXzMxNV9WR0EpIHJldHVybiAwOworCQkJaWYoIShWQkZsYWdzMiAmIFZCMl8zMHhCKSkgcmV0dXJuIDA7CiAJCX0KIAkJYnJlYWs7CiAgICB9CiAKLSAgIHJldHVybiBNb2RlSW5kZXg7CisgICByZXR1cm4gU2lTX0dldE1vZGVJRChWR0FFbmdpbmUsIDAsIEhEaXNwbGF5LCBWRGlzcGxheSwgRGVwdGgsIEZBTFNFLCAwLCAwKTsKIH0KIAogCkBAIC0xMTM3LDgzICs4ODIsODMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLVNpU19TZXRSZWcoU0lTSU9BRERSRVNTIHBvcnQsIFVTSE9SVCBpbmRleCwgVVNIT1JUIGRhdGEpCitTaVNfU2V0UmVnKFNJU0lPQUREUkVTUyBwb3J0LCB1bnNpZ25lZCBzaG9ydCBpbmRleCwgdW5zaWduZWQgc2hvcnQgZGF0YSkKIHsKLSAgIE91dFBvcnRCeXRlKHBvcnQsaW5kZXgpOwotICAgT3V0UG9ydEJ5dGUocG9ydCArIDEsZGF0YSk7CisgICBPdXRQb3J0Qnl0ZShwb3J0LCBpbmRleCk7CisgICBPdXRQb3J0Qnl0ZShwb3J0ICsgMSwgZGF0YSk7CiB9CiAKIHZvaWQKLVNpU19TZXRSZWdCeXRlKFNJU0lPQUREUkVTUyBwb3J0LCBVU0hPUlQgZGF0YSkKK1NpU19TZXRSZWdCeXRlKFNJU0lPQUREUkVTUyBwb3J0LCB1bnNpZ25lZCBzaG9ydCBkYXRhKQogewotICAgT3V0UG9ydEJ5dGUocG9ydCxkYXRhKTsKKyAgIE91dFBvcnRCeXRlKHBvcnQsIGRhdGEpOwogfQogCiB2b2lkCi1TaVNfU2V0UmVnU2hvcnQoU0lTSU9BRERSRVNTIHBvcnQsIFVTSE9SVCBkYXRhKQorU2lTX1NldFJlZ1Nob3J0KFNJU0lPQUREUkVTUyBwb3J0LCB1bnNpZ25lZCBzaG9ydCBkYXRhKQogewotICAgT3V0UG9ydFdvcmQocG9ydCxkYXRhKTsKKyAgIE91dFBvcnRXb3JkKHBvcnQsIGRhdGEpOwogfQogCiB2b2lkCi1TaVNfU2V0UmVnTG9uZyhTSVNJT0FERFJFU1MgcG9ydCwgVUxPTkcgZGF0YSkKK1NpU19TZXRSZWdMb25nKFNJU0lPQUREUkVTUyBwb3J0LCB1bnNpZ25lZCBpbnQgZGF0YSkKIHsKLSAgIE91dFBvcnRMb25nKHBvcnQsZGF0YSk7CisgICBPdXRQb3J0TG9uZyhwb3J0LCBkYXRhKTsKIH0KIAotVUNIQVIKLVNpU19HZXRSZWcoU0lTSU9BRERSRVNTIHBvcnQsIFVTSE9SVCBpbmRleCkKK3Vuc2lnbmVkIGNoYXIKK1NpU19HZXRSZWcoU0lTSU9BRERSRVNTIHBvcnQsIHVuc2lnbmVkIHNob3J0IGluZGV4KQogewotICAgT3V0UG9ydEJ5dGUocG9ydCxpbmRleCk7CisgICBPdXRQb3J0Qnl0ZShwb3J0LCBpbmRleCk7CiAgICByZXR1cm4oSW5Qb3J0Qnl0ZShwb3J0ICsgMSkpOwogfQogCi1VQ0hBUgordW5zaWduZWQgY2hhcgogU2lTX0dldFJlZ0J5dGUoU0lTSU9BRERSRVNTIHBvcnQpCiB7CiAgICByZXR1cm4oSW5Qb3J0Qnl0ZShwb3J0KSk7CiB9CiAKLVVTSE9SVAordW5zaWduZWQgc2hvcnQKIFNpU19HZXRSZWdTaG9ydChTSVNJT0FERFJFU1MgcG9ydCkKIHsKICAgIHJldHVybihJblBvcnRXb3JkKHBvcnQpKTsKIH0KIAotVUxPTkcKK3Vuc2lnbmVkIGludAogU2lTX0dldFJlZ0xvbmcoU0lTSU9BRERSRVNTIHBvcnQpCiB7CiAgICByZXR1cm4oSW5Qb3J0TG9uZyhwb3J0KSk7CiB9CiAKIHZvaWQKLVNpU19TZXRSZWdBTkRPUihTSVNJT0FERFJFU1MgUG9ydCxVU0hPUlQgSW5kZXgsVVNIT1JUIERhdGFBTkQsVVNIT1JUIERhdGFPUikKK1NpU19TZXRSZWdBTkRPUihTSVNJT0FERFJFU1MgUG9ydCwgdW5zaWduZWQgc2hvcnQgSW5kZXgsIHVuc2lnbmVkIHNob3J0IERhdGFBTkQsIHVuc2lnbmVkIHNob3J0IERhdGFPUikKIHsKLSAgVVNIT1JUIHRlbXA7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCi0gIHRlbXAgPSBTaVNfR2V0UmVnKFBvcnQsSW5kZXgpOwotICB0ZW1wID0gKHRlbXAgJiAoRGF0YUFORCkpIHwgRGF0YU9SOwotICBTaVNfU2V0UmVnKFBvcnQsSW5kZXgsdGVtcCk7CisgICB0ZW1wID0gU2lTX0dldFJlZyhQb3J0LCBJbmRleCk7CisgICB0ZW1wID0gKHRlbXAgJiAoRGF0YUFORCkpIHwgRGF0YU9SOworICAgU2lTX1NldFJlZyhQb3J0LCBJbmRleCwgdGVtcCk7CiB9CiAKIHZvaWQKLVNpU19TZXRSZWdBTkQoU0lTSU9BRERSRVNTIFBvcnQsVVNIT1JUIEluZGV4LFVTSE9SVCBEYXRhQU5EKQorU2lTX1NldFJlZ0FORChTSVNJT0FERFJFU1MgUG9ydCwgdW5zaWduZWQgc2hvcnQgSW5kZXgsIHVuc2lnbmVkIHNob3J0IERhdGFBTkQpCiB7Ci0gIFVTSE9SVCB0ZW1wOworICAgdW5zaWduZWQgc2hvcnQgdGVtcDsKIAotICB0ZW1wID0gU2lTX0dldFJlZyhQb3J0LEluZGV4KTsKLSAgdGVtcCAmPSBEYXRhQU5EOwotICBTaVNfU2V0UmVnKFBvcnQsSW5kZXgsdGVtcCk7CisgICB0ZW1wID0gU2lTX0dldFJlZyhQb3J0LCBJbmRleCk7CisgICB0ZW1wICY9IERhdGFBTkQ7CisgICBTaVNfU2V0UmVnKFBvcnQsIEluZGV4LCB0ZW1wKTsKIH0KIAogdm9pZAotU2lTX1NldFJlZ09SKFNJU0lPQUREUkVTUyBQb3J0LFVTSE9SVCBJbmRleCxVU0hPUlQgRGF0YU9SKQorU2lTX1NldFJlZ09SKFNJU0lPQUREUkVTUyBQb3J0LCB1bnNpZ25lZCBzaG9ydCBJbmRleCwgdW5zaWduZWQgc2hvcnQgRGF0YU9SKQogewotICBVU0hPUlQgdGVtcDsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXA7CiAKLSAgdGVtcCA9IFNpU19HZXRSZWcoUG9ydCxJbmRleCk7Ci0gIHRlbXAgfD0gRGF0YU9SOwotICBTaVNfU2V0UmVnKFBvcnQsSW5kZXgsdGVtcCk7CisgICB0ZW1wID0gU2lTX0dldFJlZyhQb3J0LCBJbmRleCk7CisgICB0ZW1wIHw9IERhdGFPUjsKKyAgIFNpU19TZXRSZWcoUG9ydCwgSW5kZXgsIHRlbXApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTIyMSwxMyArOTY2LDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1TaVNfRGlzcGxheU9uKFNpU19Qcml2YXRlICpTaVNfUHIpCitTaVNfRGlzcGxheU9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MDEsMHhERik7CiB9CiAKIHZvaWQKLVNpU19EaXNwbGF5T2ZmKFNpU19Qcml2YXRlICpTaVNfUHIpCitTaVNfRGlzcGxheU9mZihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2M0LDB4MDEsMHgyMCk7CiB9CkBAIC0xMjM4LDcgKzk4Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1TaVNSZWdJbml0KFNpU19Qcml2YXRlICpTaVNfUHIsIFNJU0lPQUREUkVTUyBCYXNlQWRkcikKK1NpU1JlZ0luaXQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIFNJU0lPQUREUkVTUyBCYXNlQWRkcikKIHsKICAgIFNpU19Qci0+U2lTX1AzYzQgPSBCYXNlQWRkciArIDB4MTQ7CiAgICBTaVNfUHItPlNpU19QM2Q0ID0gQmFzZUFkZHIgKyAweDI0OwpAQCAtMTI1MSwxNiArOTk2LDE3IEBACiAgICBTaVNfUHItPlNpU19QM2M4ID0gQmFzZUFkZHIgKyAweDE4OwogICAgU2lTX1ByLT5TaVNfUDNjOSA9IEJhc2VBZGRyICsgMHgxOTsKICAgIFNpU19Qci0+U2lTX1AzY2IgPSBCYXNlQWRkciArIDB4MWI7CisgICBTaVNfUHItPlNpU19QM2NjID0gQmFzZUFkZHIgKyAweDFjOwogICAgU2lTX1ByLT5TaVNfUDNjZCA9IEJhc2VBZGRyICsgMHgxZDsKICAgIFNpU19Qci0+U2lTX1AzZGEgPSBCYXNlQWRkciArIDB4MmE7Ci0gICBTaVNfUHItPlNpU19QYXJ0MVBvcnQgPSBCYXNlQWRkciArIFNJU19DUlQyX1BPUlRfMDQ7ICAgICAvKiBEaWdpdGFsIHZpZGVvIGludGVyZmFjZSByZWdpc3RlcnMgKExDRCkgKi8KLSAgIFNpU19Qci0+U2lTX1BhcnQyUG9ydCA9IEJhc2VBZGRyICsgU0lTX0NSVDJfUE9SVF8xMDsgICAgIC8qIDMwMSBUViBFbmNvZGVyIHJlZ2lzdGVycyAqLwotICAgU2lTX1ByLT5TaVNfUGFydDNQb3J0ID0gQmFzZUFkZHIgKyBTSVNfQ1JUMl9QT1JUXzEyOyAgICAgLyogMzAxIE1hY3JvdmlzaW9uIHJlZ2lzdGVycyAqLwotICAgU2lTX1ByLT5TaVNfUGFydDRQb3J0ID0gQmFzZUFkZHIgKyBTSVNfQ1JUMl9QT1JUXzE0OyAgICAgLyogMzAxIFZHQTIgKGFuZCBMQ0QpIHJlZ2lzdGVycyAqLwotICAgU2lTX1ByLT5TaVNfUGFydDVQb3J0ID0gQmFzZUFkZHIgKyBTSVNfQ1JUMl9QT1JUXzE0ICsgMjsgLyogMzAxIHBhbGV0dGUgYWRkcmVzcyBwb3J0IHJlZ2lzdGVycyAqLwotICAgU2lTX1ByLT5TaVNfRERDX1BvcnQgPSBCYXNlQWRkciArIDB4MTQ7ICAgICAgICAgICAgICAgICAgLyogRERDIFBvcnQgKCA9IFAzQzQsIFNSMTEvMEEpICovCi0gICBTaVNfUHItPlNpU19WaWRDYXB0ID0gQmFzZUFkZHIgKyBTSVNfVklERU9fQ0FQVFVSRTsKLSAgIFNpU19Qci0+U2lTX1ZpZFBsYXkgPSBCYXNlQWRkciArIFNJU19WSURFT19QTEFZQkFDSzsKKyAgIFNpU19Qci0+U2lTX1BhcnQxUG9ydCA9IEJhc2VBZGRyICsgU0lTX0NSVDJfUE9SVF8wNDsKKyAgIFNpU19Qci0+U2lTX1BhcnQyUG9ydCA9IEJhc2VBZGRyICsgU0lTX0NSVDJfUE9SVF8xMDsKKyAgIFNpU19Qci0+U2lTX1BhcnQzUG9ydCA9IEJhc2VBZGRyICsgU0lTX0NSVDJfUE9SVF8xMjsKKyAgIFNpU19Qci0+U2lTX1BhcnQ0UG9ydCA9IEJhc2VBZGRyICsgU0lTX0NSVDJfUE9SVF8xNDsKKyAgIFNpU19Qci0+U2lTX1BhcnQ1UG9ydCA9IEJhc2VBZGRyICsgU0lTX0NSVDJfUE9SVF8xNCArIDI7CisgICBTaVNfUHItPlNpU19ERENfUG9ydCAgPSBCYXNlQWRkciArIDB4MTQ7CisgICBTaVNfUHItPlNpU19WaWRDYXB0ICAgPSBCYXNlQWRkciArIFNJU19WSURFT19DQVBUVVJFOworICAgU2lTX1ByLT5TaVNfVmlkUGxheSAgID0gQmFzZUFkZHIgKyBTSVNfVklERU9fUExBWUJBQ0s7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjY4LDcgKzEwMTQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19HZXRTeXNGbGFncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0dldFN5c0ZsYWdzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAgdW5zaWduZWQgY2hhciBjcjVmLCB0ZW1wMSwgdGVtcDI7CiAKQEAgLTEyNzYsOSArMTAyMiw5IEBACiAgICAvKiAoU1IxMSBpcyB1c2VkIGZvciBEREMgYW5kIGluIGVuYWJsZS9kaXNhYmxlYnJpZGdlKSAqLwogICAgU2lTX1ByLT5TaVNfU2Vuc2libGVTUjExID0gRkFMU0U7CiAgICBTaVNfUHItPlNpU19NeUNSNjMgPSAweDYzOwotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMzMCkgeworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzMwKSB7CiAgICAgICBTaVNfUHItPlNpU19NeUNSNjMgPSAweDUzOwotICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7CiAgICAgICAgICBTaVNfUHItPlNpU19TZW5zaWJsZVNSMTEgPSBUUlVFOwogICAgICAgfQogICAgfQpAQCAtMTI4Niw0MyArMTAzMiw1MiBAQAogICAgLyogWW91IHNob3VsZCB1c2UgdGhlIG1hY3Jvcywgbm90IHRoZXNlIGZsYWdzIGRpcmVjdGx5ICovCiAKICAgIFNpU19Qci0+U2lTX1N5c0ZsYWdzID0gMDsKLSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182NTApIHsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzY1MCkgewogICAgICAgY3I1ZiA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDVmKSAmIDB4ZjA7CiAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHg1YywweDA3KTsKICAgICAgIHRlbXAxID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NWMpICYgMHhmODsKICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4NWMsMHhmOCk7CiAgICAgICB0ZW1wMiA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDVjKSAmIDB4Zjg7CiAgICAgICBpZigoIXRlbXAxKSB8fCAodGVtcDIpKSB7Ci0gICAgICAgICBzd2l0Y2goY3I1ZikgeworCSBzd2l0Y2goY3I1ZikgewogCSAgICBjYXNlIDB4ODA6CiAJICAgIGNhc2UgMHg5MDoKIAkgICAgY2FzZSAweGMwOgotCSAgICAgICBTaVNfUHItPlNpU19TeXNGbGFncyB8PSBTRl9Jc002NTA7ICBicmVhazsKKwkgICAgICAgU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfSXNNNjUwOworCSAgICAgICBicmVhazsKIAkgICAgY2FzZSAweGEwOgogCSAgICBjYXNlIDB4YjA6CiAJICAgIGNhc2UgMHhlMDoKLQkgICAgICAgU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfSXM2NTE7ICAgYnJlYWs7CisJICAgICAgIFNpU19Qci0+U2lTX1N5c0ZsYWdzIHw9IFNGX0lzNjUxOworCSAgICAgICBicmVhazsKIAkgfQogICAgICAgfSBlbHNlIHsKLSAgICAgICAgIHN3aXRjaChjcjVmKSB7CisJIHN3aXRjaChjcjVmKSB7CiAJICAgIGNhc2UgMHg5MDoKIAkgICAgICAgdGVtcDEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg1YykgJiAweGY4OwogCSAgICAgICBzd2l0Y2godGVtcDEpIHsKLQkgICAgICAgICAgY2FzZSAweDAwOiBTaVNfUHItPlNpU19TeXNGbGFncyB8PSBTRl9Jc002NTI7IGJyZWFrOworCQkgIGNhc2UgMHgwMDogU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfSXNNNjUyOyBicmVhazsKIAkJICBjYXNlIDB4NDA6IFNpU19Qci0+U2lTX1N5c0ZsYWdzIHw9IFNGX0lzTTY1MzsgYnJlYWs7CiAJCSAgZGVmYXVsdDogICBTaVNfUHItPlNpU19TeXNGbGFncyB8PSBTRl9Jc002NTA7IGJyZWFrOwogCSAgICAgICB9CiAJICAgICAgIGJyZWFrOwogCSAgICBjYXNlIDB4YjA6Ci0JICAgICAgIFNpU19Qci0+U2lTX1N5c0ZsYWdzIHw9IFNGX0lzNjUyOyAgYnJlYWs7CisJICAgICAgIFNpU19Qci0+U2lTX1N5c0ZsYWdzIHw9IFNGX0lzNjUyOworCSAgICAgICBicmVhazsKIAkgICAgZGVmYXVsdDoKLQkgICAgICAgU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfSXNNNjUwOyBicmVhazsKKwkgICAgICAgU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfSXNNNjUwOworCSAgICAgICBicmVhazsKIAkgfQogICAgICAgfQogICAgfQotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc2MCkgewotICAgICAgdGVtcDEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg3OCk7Ci0gICAgICBpZih0ZW1wMSAmIDB4MzApIFNpU19Qci0+U2lTX1N5c0ZsYWdzIHw9IFNGXzc2MExGQjsKKworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNzYwICYmIFNpU19Qci0+Q2hpcFR5cGUgPD0gU0lTXzc2MSkgeworICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NzgpICYgMHgzMCkgeworICAgICAgICAgU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfNzYwTEZCOworICAgICAgfQorICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NzkpICYgMHhmMCkgeworICAgICAgICAgU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfNzYwVU1BOworICAgICAgfQogICAgfQogfQogCkBAIC0xMzMxLDE4ICsxMDg2LDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTSW5pdFBDSWV0YyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTSW5pdFBDSWV0YyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIHN3aXRjaChId0luZm8tPmpDaGlwVHlwZSkgeworICAgc3dpdGNoKFNpU19Qci0+Q2hpcFR5cGUpIHsKKyNpZmRlZiBTSVMzMDAKICAgIGNhc2UgU0lTXzMwMDoKICAgIGNhc2UgU0lTXzU0MDoKICAgIGNhc2UgU0lTXzYzMDoKICAgIGNhc2UgU0lTXzczMDoKICAgICAgIC8qIFNldCAtIFBDSSBMSU5FQVIgQUREUkVTU0lORyBFTkFCTEUgKDB4ODApCi0gICAgICAgKiAgICAgLSBSRUxPQ0FURUQgVkdBIElPICAoMHgyMCkKLSAgICAgICAqICAgICAtIE1NSU8gRU5BQkxFICgweDEpCisgICAgICAgKiAgICAgLSBSRUxPQ0FURUQgVkdBIElPIEVOQUJMRUQgKDB4MjApCisgICAgICAgKiAgICAgLSBNTUlPIEVOQUJMRUQgKDB4MDEpCisgICAgICAgKiBMZWF2ZSBvdGhlciBiaXRzIHVudG91Y2hlZC4KICAgICAgICAqLwotICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MjAsMHhhMSk7CisgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDIwLDB4YTEpOwogICAgICAgLyogIC0gRW5hYmxlIDJEICgweDQwKQogICAgICAgICogIC0gRW5hYmxlIDNEICgweDAyKQogICAgICAgICogIC0gRW5hYmxlIDNEIFZlcnRleCBjb21tYW5kIGZldGNoICgweDEwKSA/CkBAIC0xMzUwLDYgKzExMDcsOCBAQAogICAgICAgICovCiAgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4NUEpOwogICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBTSVMzMTVICiAgICBjYXNlIFNJU18zMTVIOgogICAgY2FzZSBTSVNfMzE1OgogICAgY2FzZSBTSVNfMzE1UFJPOgpAQCAtMTM2MiwyMSArMTEyMSwzMCBAQAogICAgY2FzZSBTSVNfNzYwOgogICAgY2FzZSBTSVNfNzYxOgogICAgY2FzZSBTSVNfMzQwOgotICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MjAsMHhhMSk7Ci0gICAgICAvKiAgLSBFbmFibGUgMkQgKDB4NDApCi0gICAgICAgKiAgLSBFbmFibGUgM0QgKDB4MDIpCisgICBjYXNlIFhHSV80MDoKKyAgICAgIC8qIFNlZSBhYm92ZSAqLworICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgyMCwweGExKTsKKyAgICAgIC8qICAtIEVuYWJsZSAzRCBHL0wgdHJhbnNmb3JtYXRpb24gZW5naW5lICgweDgwKQorICAgICAgICogIC0gRW5hYmxlIDJEICgweDQwKQogICAgICAgICogIC0gRW5hYmxlIDNEIHZlcnRleCBjb21tYW5kIGZldGNoICgweDEwKQogICAgICAgICogIC0gRW5hYmxlIDNEIGNvbW1hbmQgcGFyc2VyICgweDA4KQotICAgICAgICogIC0gRW5hYmxlIDNEIEcvTCB0cmFuc2Zvcm1hdGlvbiBlbmdpbmUgKDB4ODApCisgICAgICAgKiAgLSBFbmFibGUgM0QgKDB4MDIpCiAgICAgICAgKi8KICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2M0LDB4MUUsMHhEQSk7CiAgICAgICBicmVhazsKKyAgIGNhc2UgWEdJXzIwOgogICAgY2FzZSBTSVNfNTUwOgotICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MjAsMHhhMSk7CisgICAgICAvKiBTZWUgYWJvdmUgKi8KKyAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2M0LDB4MjAsMHhhMSk7CiAgICAgICAvKiBObyAzRCBlbmdpbmUgISAqLwogICAgICAgLyogIC0gRW5hYmxlIDJEICgweDQwKQorICAgICAgICogIC0gZGlzYWJsZSAzRAogICAgICAgICovCi0gICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4NDApOworICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweDYwLDB4NDApOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgIH0KIH0KIApAQCAtMTM4NCwzOCArMTE1Miw0MCBAQAogLyogICAgICAgICAgICAgSEVMUEVSOiBTZXRMVkRTZXRjICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1TaVNTZXRMVkRTZXRjKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorc3RhdGljCisjZW5kaWYKK3ZvaWQKK1NpU1NldExWRFNldGMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICBVU0hPUlQgdGVtcDsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXA7CiAKICAgIFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID0gMDsKICAgIFNpU19Qci0+U2lTX0lGX0RFRl9UUlVNUElPTiA9IDA7CiAgICBTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID0gMDsKLSAgIFNpU19Qci0+U2lTX0lGX0RFRl9EU1ROID0gMDsKLSAgIFNpU19Qci0+U2lTX0lGX0RFRl9GU1ROID0gMDsKICAgIFNpU19Qci0+U2lTX0lGX0RFRl9DT05FWCA9IDA7CiAKICAgIFNpU19Qci0+U2lTX0Nocm9udGVsSW5pdCA9IDA7CiAKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gWEdJXzIwKSByZXR1cm47CisKICAgIC8qIENoZWNrIGZvciBTaVMzMHggZmlyc3QgKi8KICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDAwKTsKICAgIGlmKCh0ZW1wID09IDEpIHx8ICh0ZW1wID09IDIpKSByZXR1cm47CiAKLSAgIHN3aXRjaChId0luZm8tPmpDaGlwVHlwZSkgeworICAgc3dpdGNoKFNpU19Qci0+Q2hpcFR5cGUpIHsKICNpZmRlZiBTSVMzMDAKICAgIGNhc2UgU0lTXzU0MDoKICAgIGNhc2UgU0lTXzYzMDoKICAgIGNhc2UgU0lTXzczMDoKLSAgICAgIAl0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzcpOwotICAgICAgCXRlbXAgPSAodGVtcCAmIDB4MEUpID4+IDE7Ci0gICAgICAJaWYoKHRlbXAgPj0gMikgJiYgKHRlbXAgPD0gNSkpIAlTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9IDE7Ci0gICAgICAJaWYodGVtcCA9PSAzKSAgIAkJU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OID0gMTsKLSAgICAgIAlpZigodGVtcCA9PSA0KSB8fCAodGVtcCA9PSA1KSkgeworCXRlbXAgPSAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzcpICYgMHgwZSkgPj4gMTsKKwlpZigodGVtcCA+PSAyKSAmJiAodGVtcCA8PSA1KSkJU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPSAxOworCWlmKHRlbXAgPT0gMykJCQlTaVNfUHItPlNpU19JRl9ERUZfVFJVTVBJT04gPSAxOworCWlmKCh0ZW1wID09IDQpIHx8ICh0ZW1wID09IDUpKSB7CiAJCS8qIFNhdmUgcG93ZXIgc3RhdHVzIChhbmQgZXJyb3IgY2hlY2spIC0gVU5VU0VEICovCiAJCVNpU19Qci0+U2lTX0JhY2t1cDcweHggPSBTaVNfR2V0Q0g3MDB4KFNpU19QciwgMHgwZSk7CiAJCVNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPSAxOwotICAgICAgICB9CisJfQogCWJyZWFrOwogI2VuZGlmCiAjaWZkZWYgU0lTMzE1SApAQCAtMTQyMywyNiArMTE5MywyNiBAQAogICAgY2FzZSBTSVNfNjUwOgogICAgY2FzZSBTSVNfNzQwOgogICAgY2FzZSBTSVNfMzMwOgotICAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzcpOwotICAgICAgCXRlbXAgPSAodGVtcCAmIDB4MEUpID4+IDE7Ci0gICAgICAJaWYoKHRlbXAgPj0gMikgJiYgKHRlbXAgPD0gMykpIAlTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9IDE7Ci0gICAgICAJaWYodGVtcCA9PSAzKSAgCQkJU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9IDI7Ci0gICAgICAgIGJyZWFrOworCXRlbXAgPSAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzcpICYgMHgwZSkgPj4gMTsKKwlpZigodGVtcCA+PSAyKSAmJiAodGVtcCA8PSAzKSkJU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPSAxOworCWlmKHRlbXAgPT0gMykJCQlTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID0gMjsKKwlicmVhazsKICAgIGNhc2UgU0lTXzY2MToKICAgIGNhc2UgU0lTXzc0MToKICAgIGNhc2UgU0lTXzY2MDoKICAgIGNhc2UgU0lTXzc2MDoKICAgIGNhc2UgU0lTXzc2MToKICAgIGNhc2UgU0lTXzM0MDoKLSAgICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKLSAgICAgIAl0ZW1wID0gKHRlbXAgJiAweGUwKSA+PiA1OwotICAgICAgCWlmKCh0ZW1wID49IDIpICYmICh0ZW1wIDw9IDMpKSAJU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPSAxOwotICAgICAgCWlmKHRlbXAgPT0gMykgIAkJCVNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPSAyOwotCWlmKHRlbXAgPT0gNCkgIAkJCVNpU19Qci0+U2lTX0lGX0RFRl9DT05FWCA9IDE7ICAvKiBOb3QgeWV0IHN1cHBvcnRlZCAqLwotICAgICAgICBicmVhazsKKyAgIGNhc2UgWEdJXzIwOgorICAgY2FzZSBYR0lfNDA6CisJdGVtcCA9IChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCkgJiAweGUwKSA+PiA1OworCWlmKCh0ZW1wID49IDIpICYmICh0ZW1wIDw9IDMpKSAJU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPSAxOworCWlmKHRlbXAgPT0gMykJCQlTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID0gMjsKKwlpZih0ZW1wID09IDQpCQkJU2lTX1ByLT5TaVNfSUZfREVGX0NPTkVYID0gMTsgIC8qIE5vdCB5ZXQgc3VwcG9ydGVkICovCisJYnJlYWs7CiAjZW5kaWYKICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOworCWJyZWFrOwogICAgfQogfQogCkBAIC0xNDUxLDM1ICsxMjIxLDU1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1TaVNfU2V0RW5hYmxlRHN0bihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgZW5hYmxlKQorU2lTX1NldEVuYWJsZURzdG4oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBlbmFibGUpCiB7CiAgICBTaVNfUHItPlNpU19JRl9ERUZfRFNUTiA9IGVuYWJsZSA/IDEgOiAwOwogfQogCiB2b2lkCi1TaVNfU2V0RW5hYmxlRnN0bihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgZW5hYmxlKQorU2lTX1NldEVuYWJsZUZzdG4oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBlbmFibGUpCiB7CiAgICBTaVNfUHItPlNpU19JRl9ERUZfRlNUTiA9IGVuYWJsZSA/IDEgOiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICBIRUxQRVI6IEdldCBtb2RlZmxhZyAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0TW9kZUZsYWcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCit7CisgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKKyAgICAgIHJldHVybiBTaVNfUHItPkNNb2RlRmxhZzsKKyAgIH0gZWxzZSBpZihNb2RlTm8gPD0gMHgxMykgeworICAgICAgcmV0dXJuIFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7CisgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVGbGFnOworICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgIEhFTFBFUjogRGV0ZXJtaW5lIFJPTSB1c2FnZSAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIEJPT0xFQU4KLVNpU0RldGVybWluZVJPTUxheW91dDY2MShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTRGV0ZXJtaW5lUk9NTGF5b3V0NjYxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgVUNIQVIgICpST01BZGRyICA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgIFVTSE9SVCByb212ZXJzb2Zmcywgcm9tdm1haiA9IDEsIHJvbXZtaW4gPSAwOworICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIHNob3J0IHJvbXZlcnNvZmZzLCByb212bWFqID0gMSwgcm9tdm1pbiA9IDA7CiAKLSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU183NjEpIHsKLSAgICAgIC8qIEkgdmVyeSBtdWNoIGFzc3VtZSA3NjEgYW5kIDM0MCB3aWxsIHVzZSBuZXcgbGF5b3V0ICovCisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFhHSV8yMCkgeworICAgICAgLyogWEdJIFJPTXMgZG9uJ3QgcXVhbGlmeSAqLworICAgICAgcmV0dXJuIEZBTFNFOworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzc2MSkgeworICAgICAgLyogSSB2ZXJ5IG11Y2ggYXNzdW1lIDc2MSwgMzQwIGFuZCBuZXdlciB3aWxsIHVzZSBuZXcgbGF5b3V0ICovCiAgICAgICByZXR1cm4gVFJVRTsKLSAgIH0gZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisgICB9IGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7CiAgICAgICBpZigoUk9NQWRkclsweDFhXSA9PSAnTicpICYmCi0gICAgICAgICAoUk9NQWRkclsweDFiXSA9PSAnZScpICYmCi0gICAgICAgICAoUk9NQWRkclsweDFjXSA9PSAndycpICYmCi0gICAgICAgICAoUk9NQWRkclsweDFkXSA9PSAnVicpKSB7CisJIChST01BZGRyWzB4MWJdID09ICdlJykgJiYKKwkgKFJPTUFkZHJbMHgxY10gPT0gJ3cnKSAmJgorCSAoUk9NQWRkclsweDFkXSA9PSAnVicpKSB7CiAJIHJldHVybiBUUlVFOwogICAgICAgfQogICAgICAgcm9tdmVyc29mZnMgPSBST01BZGRyWzB4MTZdIHwgKFJPTUFkZHJbMHgxN10gPDwgOCk7CkBAIC0xNDk0LDkgKzEyODQsOSBAQAogICAgICAgfQogICAgfSBlbHNlIGlmKElTX1NJUzY1MDc0MCkgewogICAgICAgaWYoKFJPTUFkZHJbMHgxYV0gPT0gJ04nKSAmJgotICAgICAgICAgKFJPTUFkZHJbMHgxYl0gPT0gJ2UnKSAmJgotICAgICAgICAgKFJPTUFkZHJbMHgxY10gPT0gJ3cnKSAmJgotICAgICAgICAgKFJPTUFkZHJbMHgxZF0gPT0gJ1YnKSkgeworCSAoUk9NQWRkclsweDFiXSA9PSAnZScpICYmCisJIChST01BZGRyWzB4MWNdID09ICd3JykgJiYKKwkgKFJPTUFkZHJbMHgxZF0gPT0gJ1YnKSkgewogCSByZXR1cm4gVFJVRTsKICAgICAgIH0KICAgIH0KQEAgLTE1MDQsNDUgKzEyOTQsNTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNpU0RldGVybWluZVJPTVVzYWdlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNEZXRlcm1pbmVST01Vc2FnZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIFVDSEFSICAqUk9NQWRkciAgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gICBVU0hPUlQgcm9tcHRyID0gMDsKKyAgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyICA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgICB1bnNpZ25lZCBzaG9ydCByb21wdHIgPSAwOwogCiAgICBTaVNfUHItPlNpU19Vc2VST00gPSBGQUxTRTsKICAgIFNpU19Qci0+U2lTX1JPTU5ldyA9IEZBTFNFOworICAgU2lTX1ByLT5TaVNfUFdET2Zmc2V0ID0gMDsKIAotICAgaWYoKFJPTUFkZHIpICYmIChId0luZm8tPlVzZVJPTSkpIHsKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMDApIHsKLSAgICAgICAgIC8qIDMwMDogV2UgY2hlY2sgaWYgdGhlIGNvZGUgc3RhcnRzIGJlbG93IDB4MjIwIGJ5CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFhHSV8yMCkgcmV0dXJuOworCisgICBpZigoUk9NQWRkcikgJiYgKFNpU19Qci0+VXNlUk9NKSkgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfMzAwKSB7CisJIC8qIDMwMDogV2UgY2hlY2sgaWYgdGhlIGNvZGUgc3RhcnRzIGJlbG93IDB4MjIwIGJ5CiAJICAqIGNoZWNraW5nIHRoZSBqbXAgaW5zdHJ1Y3Rpb24gYXQgdGhlIGJlZ2lubmluZwogCSAgKiBvZiB0aGUgQklPUyBpbWFnZS4KIAkgICovCiAJIGlmKChST01BZGRyWzNdID09IDB4ZTkpICYmICgoUk9NQWRkcls1XSA8PCA4KSB8IFJPTUFkZHJbNF0pID4gMHgyMWEpCiAJICAgIFNpU19Qci0+U2lTX1VzZVJPTSA9IFRSVUU7Ci0gICAgICB9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgeworICAgICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCSAvKiBTb255J3MgVkFJTyBCSU9TIDEuMDkgZm9sbG93cyB0aGUgc3RhbmRhcmQsIHNvIHBlcmhhcHMKIAkgICogdGhlIG90aGVycyBkbyBhcyB3ZWxsCiAJICAqLwogCSBTaVNfUHItPlNpU19Vc2VST00gPSBUUlVFOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgIC8qIDMxNS8zMzAgc2VyaWVzIHN0aWNrIHRvIHRoZSBzdGFuZGFyZChzKSAqLworCSAvKiAzMTUvMzMwIHNlcmllcyBzdGljayB0byB0aGUgc3RhbmRhcmQocykgKi8KIAkgU2lTX1ByLT5TaVNfVXNlUk9NID0gVFJVRTsKLQkgaWYoKFNpU19Qci0+U2lTX1JPTU5ldyA9IFNpU0RldGVybWluZVJPTUxheW91dDY2MShTaVNfUHIsIEh3SW5mbykpKSB7CisJIGlmKChTaVNfUHItPlNpU19ST01OZXcgPSBTaVNEZXRlcm1pbmVST01MYXlvdXQ2NjEoU2lTX1ByKSkpIHsKIAkgICAgU2lTX1ByLT5TaVNfRU1JT2Zmc2V0ID0gMTQ7CisJICAgIFNpU19Qci0+U2lTX1BXRE9mZnNldCA9IDE3OwogCSAgICBTaVNfUHItPlNpUzY2MUxDRDJUYWJsZVNpemUgPSAzNjsKIAkgICAgLyogRmluZCBvdXQgYWJvdXQgTENEIGRhdGEgdGFibGUgZW50cnkgc2l6ZSAqLwogCSAgICBpZigocm9tcHRyID0gU0lTR0VUUk9NVygweDAxMDIpKSkgewogCSAgICAgICBpZihST01BZGRyW3JvbXB0ciArICgzMiAqIDE2KV0gPT0gMHhmZikKLQkgICAgICAgICAgU2lTX1ByLT5TaVM2NjFMQ0QyVGFibGVTaXplID0gMzI7CisJCSAgU2lTX1ByLT5TaVM2NjFMQ0QyVGFibGVTaXplID0gMzI7CiAJICAgICAgIGVsc2UgaWYoUk9NQWRkcltyb21wdHIgKyAoMzQgKiAxNildID09IDB4ZmYpCi0JICAgICAgICAgIFNpU19Qci0+U2lTNjYxTENEMlRhYmxlU2l6ZSA9IDM0OwotCSAgICAgICBlbHNlIGlmKFJPTUFkZHJbcm9tcHRyICsgKDM2ICogMTYpXSA9PSAweGZmKQkgICAvKiAwLjk0ICovCi0JICAgICAgICAgIFNpU19Qci0+U2lTNjYxTENEMlRhYmxlU2l6ZSA9IDM2OworCQkgIFNpU19Qci0+U2lTNjYxTENEMlRhYmxlU2l6ZSA9IDM0OworCSAgICAgICBlbHNlIGlmKFJPTUFkZHJbcm9tcHRyICsgKDM2ICogMTYpXSA9PSAweGZmKQkgICAvKiAwLjk0LCAyLjA1LjAwKyAqLworCQkgIFNpU19Qci0+U2lTNjYxTENEMlRhYmxlU2l6ZSA9IDM2OwogCSAgICAgICBlbHNlIGlmKCAoUk9NQWRkcltyb21wdHIgKyAoMzggKiAxNildID09IDB4ZmYpIHx8ICAgLyogMi4wMC4wMCAtIDIuMDIuMDAgKi8KLQkgICAgICAgCSAJKFJPTUFkZHJbMHg2Rl0gJiAweDAxKSApIHsJCSAgIC8qIDIuMDMuMDArICovCi0JCSAgU2lTX1ByLT5TaVM2NjFMQ0QyVGFibGVTaXplID0gMzg7CisJCSAJKFJPTUFkZHJbMHg2Rl0gJiAweDAxKSApIHsJCSAgIC8qIDIuMDMuMDAgLSA8Mi4wNS4wMCAqLworCQkgIFNpU19Qci0+U2lTNjYxTENEMlRhYmxlU2l6ZSA9IDM4OwkJICAgLyogVU1DIGRhdGEgbGF5b3V0IGFiYW5kb25lZCBhdCAyLjA1LjAwICovCiAJCSAgU2lTX1ByLT5TaVNfRU1JT2Zmc2V0ID0gMTY7CisJCSAgU2lTX1ByLT5TaVNfUFdET2Zmc2V0ID0gMTk7CiAJICAgICAgIH0KIAkgICAgfQogCSB9CkBAIC0xNTU1LDkgKzEzNTAsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXRTZWdSZWdMb3dlcihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdmFsdWUpCitTaVNfU2V0U2VnUmVnTG93ZXIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQogewotICAgVVNIT1JUIHRlbXA7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCiAgICB2YWx1ZSAmPSAweDAwZmY7CiAgICB0ZW1wID0gU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjYikgJiAweGYwOwpAQCAtMTU2OSw5ICsxMzY0LDkgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNpU19TZXRTZWdSZWdVcHBlcihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdmFsdWUpCitTaVNfU2V0U2VnUmVnVXBwZXIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQogewotICAgVVNIT1JUIHRlbXA7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCiAgICB2YWx1ZSAmPSAweDAwZmY7CiAgICB0ZW1wID0gU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjYikgJiAweDBmOwpAQCAtMTU4MywyMiArMTM3OCwyMiBAQAogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldFNlZ21lbnRSZWcoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHZhbHVlKQorU2lTX1NldFNlZ21lbnRSZWcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQogewogICAgU2lTX1NldFNlZ1JlZ0xvd2VyKFNpU19QciwgdmFsdWUpOwogICAgU2lTX1NldFNlZ1JlZ1VwcGVyKFNpU19QciwgdmFsdWUpOwogfQogCiBzdGF0aWMgdm9pZAotU2lTX1Jlc2V0U2VnbWVudFJlZyhTaVNfUHJpdmF0ZSAqU2lTX1ByKQorU2lTX1Jlc2V0U2VnbWVudFJlZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICAgIFNpU19TZXRTZWdtZW50UmVnKFNpU19QciwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0U2VnbWVudFJlZ092ZXIoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHZhbHVlKQorU2lTX1NldFNlZ21lbnRSZWdPdmVyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKIHsKLSAgIFVTSE9SVCB0ZW1wID0gdmFsdWUgPj4gODsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXAgPSB2YWx1ZSA+PiA4OwogCiAgICB0ZW1wICY9IDB4MDc7CiAgICB0ZW1wIHw9ICh0ZW1wIDw8IDQpOwpAQCAtMTYwNywxNSArMTQwMiwxNSBAQAogfQogCiBzdGF0aWMgdm9pZAotU2lTX1Jlc2V0U2VnbWVudFJlZ092ZXIoU2lTX1ByaXZhdGUgKlNpU19QcikKK1NpU19SZXNldFNlZ21lbnRSZWdPdmVyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAgU2lTX1NldFNlZ21lbnRSZWdPdmVyKFNpU19QciwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfUmVzZXRTZWdtZW50UmVnaXN0ZXJzKFNpU19Qcml2YXRlICpTaVNfUHIsUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19SZXNldFNlZ21lbnRSZWdpc3RlcnMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICBpZigoSVNfU0lTNjV4KSB8fCAoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkpIHsKKyAgIGlmKChJU19TSVM2NXgpIHx8IChTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpKSB7CiAgICAgICBTaVNfUmVzZXRTZWdtZW50UmVnKFNpU19Qcik7CiAgICAgICBTaVNfUmVzZXRTZWdtZW50UmVnT3ZlcihTaVNfUHIpOwogICAgfQpAQCAtMTYyNSw4OSArMTQyMCw4NiBAQAogLyogICAgICAgICAgICAgSEVMUEVSOiBHZXRWQlR5cGUgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1TaVNfR2V0VkJUeXBlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorc3RhdGljCisjZW5kaWYKK3ZvaWQKK1NpU19HZXRWQlR5cGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnPTAsIHJldj0wLCBub2xjZD0wLCBwNF8wZiwgcDRfMjUsIHA0XzI3OworICAgdW5zaWduZWQgc2hvcnQgZmxhZyA9IDAsIHJldiA9IDAsIG5vbGNkID0gMDsKKyAgIHVuc2lnbmVkIHNob3J0IHA0XzBmLCBwNF8yNSwgcDRfMjc7CiAKLSAgU2lTX1ByLT5TaVNfVkJUeXBlID0gMDsKKyAgIFNpU19Qci0+U2lTX1ZCVHlwZSA9IDA7CiAKLSAgaWYoKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTKSB8fCAoU2lTX1ByLT5TaVNfSUZfREVGX0NPTkVYKSkKLSAgICAgcmV0dXJuOworICAgaWYoKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTKSB8fCAoU2lTX1ByLT5TaVNfSUZfREVGX0NPTkVYKSkKKyAgICAgIHJldHVybjsKIAotICBmbGFnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwMCk7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFhHSV8yMCkKKyAgICAgIHJldHVybjsKIAotICBpZihmbGFnID4gMykgcmV0dXJuOworICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MDApOwogCi0gIHJldiA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MDEpOworICAgaWYoZmxhZyA+IDMpCisgICAgICByZXR1cm47CiAKLSAgaWYoZmxhZyA+PSAyKSB7Ci0gICAgIFNpU19Qci0+U2lTX1ZCVHlwZSA9IFZCX1NJUzMwMkI7Ci0gIH0gZWxzZSBpZihmbGFnID09IDEpIHsKLSAgICAgaWYocmV2ID49IDB4QzApIHsKLSAgICAgICAJU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAxQzsKLSAgICAgfSBlbHNlIGlmKHJldiA+PSAweEIwKSB7Ci0gICAgICAgCVNpU19Qci0+U2lTX1ZCVHlwZSA9IFZCX1NJUzMwMUI7Ci0JLyogQ2hlY2sgaWYgMzB4QiBESCB2ZXJzaW9uIChubyBMQ0Qgc3VwcG9ydCwgdXNlIFBhbmVsIExpbmsgaW5zdGVhZCkgKi8KLSAgICAJbm9sY2QgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDIzKTsKLSAgICAgICAgaWYoIShub2xjZCAmIDB4MDIpKSBTaVNfUHItPlNpU19WQlR5cGUgfD0gVkJfTm9MQ0Q7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIFNpU19Qci0+U2lTX1ZCVHlwZSA9IFZCX1NJUzMwMTsKLSAgICAgfQotICB9Ci0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFCIHwgVkJfU0lTMzAxQyB8IFZCX1NJUzMwMkIpKSB7Ci0gICAgIGlmKHJldiA+PSAweEUwKSB7Ci0JZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzkpOwotCWlmKGZsYWcgPT0gMHhmZikgU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAyTFY7Ci0JZWxzZSAJIAkgU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAxQzsgIC8qIFZCX1NJUzMwMkVMVjsgKi8KLSAgICAgfSBlbHNlIGlmKHJldiA+PSAweEQwKSB7Ci0JU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAxTFY7Ci0gICAgIH0KLSAgfQotICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfMzAxQyB8IFZCXzMwMUxWIHwgVkJfMzAyTFYgfCBWQl8zMDJFTFYpKSB7Ci0gICAgIHA0XzBmID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwZik7Ci0gICAgIHA0XzI1ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNSk7Ci0gICAgIHA0XzI3ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNyk7Ci0gICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MGYsMHg3Zik7Ci0gICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNSwweDA4KTsKLSAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNywweGZkKTsKLSAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNikgJiAweDA4KSB7Ci0gICAgICAgIFNpU19Qci0+U2lTX1ZCVHlwZSB8PSBWQl9VTUM7Ci0gICAgIH0KLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNyxwNF8yNyk7Ci0gICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjUscDRfMjUpOwotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBmLHA0XzBmKTsKLSAgfQorICAgcmV2ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwMSk7CisKKyAgIGlmKGZsYWcgPj0gMikgeworICAgICAgU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAyQjsKKyAgIH0gZWxzZSBpZihmbGFnID09IDEpIHsKKyAgICAgIGlmKHJldiA+PSAweEMwKSB7CisJIFNpU19Qci0+U2lTX1ZCVHlwZSA9IFZCX1NJUzMwMUM7CisgICAgICB9IGVsc2UgaWYocmV2ID49IDB4QjApIHsKKwkgU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAxQjsKKwkgLyogQ2hlY2sgaWYgMzB4QiBESCB2ZXJzaW9uIChubyBMQ0Qgc3VwcG9ydCwgdXNlIFBhbmVsIExpbmsgaW5zdGVhZCkgKi8KKwkgbm9sY2QgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDIzKTsKKwkgaWYoIShub2xjZCAmIDB4MDIpKSBTaVNfUHItPlNpU19WQlR5cGUgfD0gVkJfTm9MQ0Q7CisgICAgICB9IGVsc2UgeworCSBTaVNfUHItPlNpU19WQlR5cGUgPSBWQl9TSVMzMDE7CisgICAgICB9CisgICB9CisgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAxQiB8IFZCX1NJUzMwMUMgfCBWQl9TSVMzMDJCKSkgeworICAgICAgaWYocmV2ID49IDB4RTApIHsKKwkgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzkpOworCSBpZihmbGFnID09IDB4ZmYpIFNpU19Qci0+U2lTX1ZCVHlwZSA9IFZCX1NJUzMwMkxWOworCSBlbHNlIAkgCSAgU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAxQzsgIC8qIFZCX1NJUzMwMkVMVjsgKi8KKyAgICAgIH0gZWxzZSBpZihyZXYgPj0gMHhEMCkgeworCSBTaVNfUHItPlNpU19WQlR5cGUgPSBWQl9TSVMzMDFMVjsKKyAgICAgIH0KKyAgIH0KKyAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFDIHwgVkJfU0lTMzAxTFYgfCBWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKKyAgICAgIHA0XzBmID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwZik7CisgICAgICBwNF8yNSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjUpOworICAgICAgcDRfMjcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI3KTsKKyAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MGYsMHg3Zik7CisgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjUsMHgwOCk7CisgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI3LDB4ZmQpOworICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNikgJiAweDA4KSB7CisgICAgICAgICBTaVNfUHItPlNpU19WQlR5cGUgfD0gVkJfVU1DOworICAgICAgfQorICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNyxwNF8yNyk7CisgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI1LHA0XzI1KTsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MGYscDRfMGYpOworICAgfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgIEhFTFBFUjogQ2hlY2sgUkFNIHNpemUgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCiBzdGF0aWMgQk9PTEVBTgotU2lTX0NoZWNrTWVtb3J5U2l6ZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgpCitTaVNfQ2hlY2tNZW1vcnlTaXplKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVU0hPUlQgQWRhcHRlck1lbVNpemUgPSBId0luZm8tPnVsVmlkZW9NZW1vcnlTaXplIC8gKDEwMjQqMTAyNCk7Ci0gIFVTSE9SVCBtZW1vcnlzaXplLG1vZGVmbGFnOworICAgdW5zaWduZWQgc2hvcnQgQWRhcHRlck1lbVNpemUgPSBTaVNfUHItPlZpZGVvTWVtb3J5U2l6ZSAvICgxMDI0KjEwMjQpOworICAgdW5zaWduZWQgc2hvcnQgbW9kZWZsYWcgPSBTaVNfR2V0TW9kZUZsYWcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyAgIHVuc2lnbmVkIHNob3J0IG1lbW9yeXNpemUgPSAoKG1vZGVmbGFnICYgTWVtb3J5SW5mb0ZsYWcpID4+IE1lbW9yeVNpemVTaGlmdCkgKyAxOwogCi0gIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewotICAgICBtb2RlZmxhZyA9IFNpU19Qci0+Q01vZGVGbGFnOwotICB9IGVsc2UgewotICAgICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICAgIH0KLSAgfQorICAgaWYoIUFkYXB0ZXJNZW1TaXplKSByZXR1cm4gVFJVRTsKIAotICBtZW1vcnlzaXplID0gbW9kZWZsYWcgJiBNZW1vcnlJbmZvRmxhZzsKLSAgbWVtb3J5c2l6ZSA+Pj0gTWVtb3J5U2l6ZVNoaWZ0OwkJLyogR2V0IHJlcXVpcmVkIG1lbW9yeSBzaXplICovCi0gIG1lbW9yeXNpemUrKzsKLQotICBpZihBZGFwdGVyTWVtU2l6ZSA8IG1lbW9yeXNpemUpIHJldHVybiBGQUxTRTsKLSAgcmV0dXJuIFRSVUU7CisgICBpZihBZGFwdGVyTWVtU2l6ZSA8IG1lbW9yeXNpemUpIHJldHVybiBGQUxTRTsKKyAgIHJldHVybiBUUlVFOwogfQogI2VuZGlmCiAKQEAgLTE3MTYsNjMgKzE1MDgsNjUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZmRlZiBTSVMzMTVICi1zdGF0aWMgVUNIQVIKLVNpU19HZXQzMTBEUkFNVHlwZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorc3RhdGljIHVuc2lnbmVkIGNoYXIKK1NpU19HZXQzMTBEUkFNVHlwZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIFVDSEFSIGRhdGEsIHRlbXA7CisgICB1bnNpZ25lZCBjaGFyIGRhdGE7CiAKICAgIGlmKCgqU2lTX1ByLT5wU2lTX1NvZnRTZXR0aW5nKSAmIFNvZnREUkFNVHlwZSkgewotICAgICBkYXRhID0gKCpTaVNfUHItPnBTaVNfU29mdFNldHRpbmcpICYgMHgwMzsKKyAgICAgIGRhdGEgPSAoKlNpU19Qci0+cFNpU19Tb2Z0U2V0dGluZykgJiAweDAzOwogICAgfSBlbHNlIHsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzM0MCkgewotICAgICAgICAvKiBUT0RPICovCi0JZGF0YSA9IDA7Ci0gICAgIH0gaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgewotICAgICAgICBkYXRhID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NzgpICYgMHgwNzsKLQlpZihTaVNfUHItPlNpU19ST01OZXcpIHsKLQkgICBkYXRhID0gKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg3OCkgJiAweGMwKSA+PiA2KTsKLQl9Ci0gICAgIH0gZWxzZSBpZihJU19TSVM1NTA2NTA3NDApIHsKLSAgICAgICAgZGF0YSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDEzKSAmIDB4MDc7Ci0gICAgIH0gZWxzZSB7CS8qIDMxNSwgMzMwICovCi0gICAgICAgIGRhdGEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzYSkgJiAweDAzOwotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfMzMwKSB7Ci0JICAgaWYoZGF0YSA+IDEpIHsKLQkgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NWYpICYgMHgzMDsKLQkgICAgICBzd2l0Y2godGVtcCkgewotCSAgICAgIGNhc2UgMHgwMDogZGF0YSA9IDE7IGJyZWFrOwotCSAgICAgIGNhc2UgMHgxMDogZGF0YSA9IDM7IGJyZWFrOwotCSAgICAgIGNhc2UgMHgyMDogZGF0YSA9IDM7IGJyZWFrOwotCSAgICAgIGNhc2UgMHgzMDogZGF0YSA9IDI7IGJyZWFrOwotCSAgICAgIH0KLQkgICB9IGVsc2UgewotCSAgICAgIGRhdGEgPSAwOwotCSAgIH0KLQl9Ci0gICAgIH0KKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gWEdJXzIwKSB7CisgICAgICAgICAvKiBEbyBJIG5lZWQgdGhpcz8gU1IxNyBzZWVtcyB0byBiZSB6ZXJvIGFueXdheS4uLiAqLworCSBkYXRhID0gMDsKKyAgICAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zNDApIHsKKwkgLyogVE9ETyAqLworCSBkYXRhID0gMDsKKyAgICAgIH0gaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisJIGlmKFNpU19Qci0+U2lTX1JPTU5ldykgeworCSAgICBkYXRhID0gKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg3OCkgJiAweGMwKSA+PiA2KTsKKwkgfSBlbHNlIHsKKwkgICAgZGF0YSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDc4KSAmIDB4MDc7CisJIH0KKyAgICAgIH0gZWxzZSBpZihJU19TSVM1NTA2NTA3NDApIHsKKwkgZGF0YSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDEzKSAmIDB4MDc7CisgICAgICB9IGVsc2UgewkvKiAzMTUsIDMzMCAqLworCSBkYXRhID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4M2EpICYgMHgwMzsKKwkgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfMzMwKSB7CisJICAgIGlmKGRhdGEgPiAxKSB7CisJICAgICAgIHN3aXRjaChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg1ZikgJiAweDMwKSB7CisJICAgICAgIGNhc2UgMHgwMDogZGF0YSA9IDE7IGJyZWFrOworCSAgICAgICBjYXNlIDB4MTA6IGRhdGEgPSAzOyBicmVhazsKKwkgICAgICAgY2FzZSAweDIwOiBkYXRhID0gMzsgYnJlYWs7CisJICAgICAgIGNhc2UgMHgzMDogZGF0YSA9IDI7IGJyZWFrOworCSAgICAgICB9CisJICAgIH0gZWxzZSB7CisJICAgICAgIGRhdGEgPSAwOworCSAgICB9CisJIH0KKyAgICAgIH0KICAgIH0KIAogICAgcmV0dXJuIGRhdGE7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19HZXRNQ0xLKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19HZXRNQ0xLKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCBpbmRleDsKKyAgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIHNob3J0IGluZGV4OwogCi0gIGluZGV4ID0gU2lTX0dldDMxMERSQU1UeXBlKFNpU19QciwgSHdJbmZvKTsKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgewotICAgICBpZihTaVNfUHItPlNpU19ST01OZXcpIHsKLSAgICAgICAgcmV0dXJuKChVU0hPUlQpKFNJU0dFVFJPTVcoKDB4OTAgKyAoaW5kZXggKiA1KSArIDMpKSkpOwotICAgICB9Ci0gICAgIHJldHVybihTaVNfUHItPlNpU19NQ0xLRGF0YV8wW2luZGV4XS5DTE9DSyk7Ci0gIH0gZWxzZSBpZihpbmRleCA+PSA0KSB7Ci0gICAgIGluZGV4IC09IDQ7Ci0gICAgIHJldHVybihTaVNfUHItPlNpU19NQ0xLRGF0YV8xW2luZGV4XS5DTE9DSyk7Ci0gIH0gZWxzZSB7Ci0gICAgIHJldHVybihTaVNfUHItPlNpU19NQ0xLRGF0YV8wW2luZGV4XS5DTE9DSyk7Ci0gIH0KKyAgIGluZGV4ID0gU2lTX0dldDMxMERSQU1UeXBlKFNpU19Qcik7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1JPTU5ldykgeworCSByZXR1cm4oKHVuc2lnbmVkIHNob3J0KShTSVNHRVRST01XKCgweDkwICsgKGluZGV4ICogNSkgKyAzKSkpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybihTaVNfUHItPlNpU19NQ0xLRGF0YV8wW2luZGV4XS5DTE9DSyk7CisgICB9IGVsc2UgaWYoaW5kZXggPj0gNCkgeworICAgICAgcmV0dXJuKFNpU19Qci0+U2lTX01DTEtEYXRhXzFbaW5kZXggLSA0XS5DTE9DSyk7CisgICB9IGVsc2UgeworICAgICAgcmV0dXJuKFNpU19Qci0+U2lTX01DTEtEYXRhXzBbaW5kZXhdLkNMT0NLKTsKKyAgIH0KIH0KICNlbmRpZgogCkBAIC0xNzgwLDMwICsxNTc0LDMwIEBACiAvKiAgICAgICAgICAgSEVMUEVSOiBDbGVhckJ1ZmZlciAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmZGVmIExJTlVYX0tFUk5FTAorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKIHN0YXRpYyB2b2lkCi1TaVNfQ2xlYXJCdWZmZXIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywgVVNIT1JUIE1vZGVObykKK1NpU19DbGVhckJ1ZmZlcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICBVQ0hBUiBTSVNJT01FTVRZUEUgKlZpZGVvTWVtb3J5QWRkcmVzcyA9IEh3SW5mby0+cGpWaWRlb01lbW9yeUFkZHJlc3M7Ci0gIFVMT05HICBBZGFwdGVyTWVtb3J5U2l6ZSA9IEh3SW5mby0+dWxWaWRlb01lbW9yeVNpemU7Ci0gIFVTSE9SVCBTSVNJT01FTVRZUEUgKnBCdWZmZXI7Ci0gIGludCBpOworICAgdW5zaWduZWQgY2hhciAgU0lTSU9NRU1UWVBFICptZW1hZGRyID0gU2lTX1ByLT5WaWRlb01lbW9yeUFkZHJlc3M7CisgICB1bnNpZ25lZCBpbnQgICBtZW1zaXplID0gU2lTX1ByLT5WaWRlb01lbW9yeVNpemU7CisgICB1bnNpZ25lZCBzaG9ydCBTSVNJT01FTVRZUEUgKnBCdWZmZXI7CisgICBpbnQgaTsKIAotICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+PSBNb2RlRUdBKSB7Ci0gICAgIGlmKE1vZGVObyA+IDB4MTMpIHsKLSAgICAgICAgU2lTX1NldE1lbW9yeShWaWRlb01lbW9yeUFkZHJlc3MsIEFkYXB0ZXJNZW1vcnlTaXplLCAwKTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgcEJ1ZmZlciA9IChVU0hPUlQgU0lTSU9NRU1UWVBFICopVmlkZW9NZW1vcnlBZGRyZXNzOwotICAgICAgICBmb3IoaT0wOyBpPDB4NDAwMDsgaSsrKSB3cml0ZXcoMHgwMDAwLCAmcEJ1ZmZlcltpXSk7Ci0gICAgIH0KLSAgfSBlbHNlIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPCBNb2RlQ0dBKSB7Ci0gICAgICAgIHBCdWZmZXIgPSAoVVNIT1JUIFNJU0lPTUVNVFlQRSAqKVZpZGVvTWVtb3J5QWRkcmVzczsKLSAgICAgICAgZm9yKGk9MDsgaTwweDQwMDA7IGkrKykgd3JpdGV3KDB4MDcyMCwgJnBCdWZmZXJbaV0pOwotICAgICB9IGVsc2UgewotICAgICAgICBTaVNfU2V0TWVtb3J5KFZpZGVvTWVtb3J5QWRkcmVzcywgMHg4MDAwLCAwKTsKLSAgICAgfQotICB9CisgICBpZighbWVtYWRkciB8fCAhbWVtc2l6ZSkgcmV0dXJuOworCisgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+PSBNb2RlRUdBKSB7CisgICAgICBpZihNb2RlTm8gPiAweDEzKSB7CisJIFNpU19TZXRNZW1vcnkobWVtYWRkciwgbWVtc2l6ZSwgMCk7CisgICAgICB9IGVsc2UgeworCSBwQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0IFNJU0lPTUVNVFlQRSAqKW1lbWFkZHI7CisJIGZvcihpID0gMDsgaSA8IDB4NDAwMDsgaSsrKSB3cml0ZXcoMHgwMDAwLCAmcEJ1ZmZlcltpXSk7CisgICAgICB9CisgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPCBNb2RlQ0dBKSB7CisgICAgICBwQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0IFNJU0lPTUVNVFlQRSAqKW1lbWFkZHI7CisgICAgICBmb3IoaSA9IDA7IGkgPCAweDQwMDA7IGkrKykgd3JpdGV3KDB4MDcyMCwgJnBCdWZmZXJbaV0pOworICAgfSBlbHNlIHsKKyAgICAgIFNpU19TZXRNZW1vcnkobWVtYWRkciwgMHg4MDAwLCAwKTsKKyAgIH0KIH0KICNlbmRpZgogCkBAIC0xODEyLDM1ICsxNjA2LDM2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBCT09MRUFOCi1TaVNfU2VhcmNoTW9kZUlEKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCAqTW9kZU5vLCBVU0hPUlQgKk1vZGVJZEluZGV4KQorU2lTX1NlYXJjaE1vZGVJRChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgKk1vZGVObywKKwkJdW5zaWduZWQgc2hvcnQgKk1vZGVJZEluZGV4KQogewotICAgVUNIQVIgVkdBSU5GTyA9IFNpU19Qci0+U2lTX1ZHQUlORk87CisgICB1bnNpZ25lZCBjaGFyIFZHQUlORk8gPSBTaVNfUHItPlNpU19WR0FJTkZPOwogCi0gICBpZigqTW9kZU5vIDw9IDB4MTMpIHsKKyAgIGlmKCgqTW9kZU5vKSA8PSAweDEzKSB7CiAKICAgICAgIGlmKCgqTW9kZU5vKSA8PSAweDA1KSAoKk1vZGVObykgfD0gMHgwMTsKIAotICAgICAgZm9yKCpNb2RlSWRJbmRleCA9IDA7IDsoKk1vZGVJZEluZGV4KSsrKSB7Ci0gICAgICAgICBpZihTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbKk1vZGVJZEluZGV4XS5TdF9Nb2RlSUQgPT0gKCpNb2RlTm8pKSBicmVhazsKLSAgICAgICAgIGlmKFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVsqTW9kZUlkSW5kZXhdLlN0X01vZGVJRCA9PSAweEZGKSAgIHJldHVybiBGQUxTRTsKKyAgICAgIGZvcigoKk1vZGVJZEluZGV4KSA9IDA7IDsoKk1vZGVJZEluZGV4KSsrKSB7CisJIGlmKFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVsoKk1vZGVJZEluZGV4KV0uU3RfTW9kZUlEID09ICgqTW9kZU5vKSkgYnJlYWs7CisJIGlmKFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVsoKk1vZGVJZEluZGV4KV0uU3RfTW9kZUlEID09IDB4RkYpIHJldHVybiBGQUxTRTsKICAgICAgIH0KIAotICAgICAgaWYoKk1vZGVObyA9PSAweDA3KSB7Ci0gICAgICAgICAgaWYoVkdBSU5GTyAmIDB4MTApICgqTW9kZUlkSW5kZXgpKys7ICAgLyogNDAwIGxpbmVzICovCi0gICAgICAgICAgLyogZWxzZSAzNTAgbGluZXMgKi8KKyAgICAgIGlmKCgqTW9kZU5vKSA9PSAweDA3KSB7CisJICBpZihWR0FJTkZPICYgMHgxMCkgKCpNb2RlSWRJbmRleCkrKzsgICAvKiA0MDAgbGluZXMgKi8KKwkgIC8qIGVsc2UgMzUwIGxpbmVzICovCiAgICAgICB9Ci0gICAgICBpZigqTW9kZU5vIDw9IDB4MDMpIHsKLSAgICAgICAgIGlmKCEoVkdBSU5GTyAmIDB4ODApKSAoKk1vZGVJZEluZGV4KSsrOwotICAgICAgICAgaWYoVkdBSU5GTyAmIDB4MTApICAgICgqTW9kZUlkSW5kZXgpKys7IC8qIDQwMCBsaW5lcyAgKi8KLSAgICAgICAgIC8qIGVsc2UgMzUwIGxpbmVzICAqLworICAgICAgaWYoKCpNb2RlTm8pIDw9IDB4MDMpIHsKKwkgaWYoIShWR0FJTkZPICYgMHg4MCkpICgqTW9kZUlkSW5kZXgpKys7CisJIGlmKFZHQUlORk8gJiAweDEwKSAgICAoKk1vZGVJZEluZGV4KSsrOyAvKiA0MDAgbGluZXMgICovCisJIC8qIGVsc2UgMzUwIGxpbmVzICAqLwogICAgICAgfQogICAgICAgLyogZWxzZSAyMDAgbGluZXMgICovCiAKICAgIH0gZWxzZSB7CiAKLSAgICAgIGZvcigqTW9kZUlkSW5kZXggPSAwOyA7KCpNb2RlSWRJbmRleCkrKykgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlWypNb2RlSWRJbmRleF0uRXh0X01vZGVJRCA9PSAoKk1vZGVObykpIGJyZWFrOwotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlWypNb2RlSWRJbmRleF0uRXh0X01vZGVJRCA9PSAweEZGKSAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGZvcigoKk1vZGVJZEluZGV4KSA9IDA7IDsoKk1vZGVJZEluZGV4KSsrKSB7CisJIGlmKFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVsoKk1vZGVJZEluZGV4KV0uRXh0X01vZGVJRCA9PSAoKk1vZGVObykpIGJyZWFrOworCSBpZihTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbKCpNb2RlSWRJbmRleCldLkV4dF9Nb2RlSUQgPT0gMHhGRikgcmV0dXJuIEZBTFNFOwogICAgICAgfQogCiAgICB9CkBAIC0xODUxLDEwICsxNjQ2LDEwIEBACiAvKiAgICAgICAgICAgIEhFTFBFUjogR2V0TW9kZVB0ciAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotVUNIQVIKLVNpU19HZXRNb2RlUHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCkKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0TW9kZVB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKLSAgIFVDSEFSIGluZGV4OworICAgdW5zaWduZWQgc2hvcnQgaW5kZXg7CiAKICAgIGlmKE1vZGVObyA8PSAweDEzKSB7CiAgICAgICBpbmRleCA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfU3RUYWJsZUluZGV4OwpAQCAtMTg2Niw3OSArMTY2MSwxMjUgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgSEVMUEVSUzogR2V0IHNvbWUgaW5kaWNlcyAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bnNpZ25lZCBzaG9ydAorU2lTX0dldFJlZkNSVFZDTEsoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IEluZGV4LCBpbnQgVXNlV2lkZSkKK3sKKyAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W0luZGV4XS5FeHRfSW5mb0ZsYWcgJiBIYXZlV2lkZVRpbWluZykgeworICAgICAgaWYoVXNlV2lkZSA9PSAxKSB7CisgICAgICAgICByZXR1cm4gU2lTX1ByLT5TaVNfUmVmSW5kZXhbSW5kZXhdLkV4dF9DUlRWQ0xLX1dJREU7CisgICAgICB9IGVsc2UgeworICAgICAgICAgcmV0dXJuIFNpU19Qci0+U2lTX1JlZkluZGV4W0luZGV4XS5FeHRfQ1JUVkNMS19OT1JNOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBTaVNfUHItPlNpU19SZWZJbmRleFtJbmRleF0uRXh0X0NSVFZDTEs7CisgICB9Cit9CisKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0UmVmQ1JUMUNSVEMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IEluZGV4LCBpbnQgVXNlV2lkZSkKK3sKKyAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W0luZGV4XS5FeHRfSW5mb0ZsYWcgJiBIYXZlV2lkZVRpbWluZykgeworICAgICAgaWYoVXNlV2lkZSA9PSAxKSB7CisgICAgICAgICByZXR1cm4gU2lTX1ByLT5TaVNfUmVmSW5kZXhbSW5kZXhdLkV4dF9DUlQxQ1JUQ19XSURFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHJldHVybiBTaVNfUHItPlNpU19SZWZJbmRleFtJbmRleF0uRXh0X0NSVDFDUlRDX05PUk07CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFNpU19Qci0+U2lTX1JlZkluZGV4W0luZGV4XS5FeHRfQ1JUMUNSVEM7CisgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgSEVMUEVSOiBMb3dNb2RlVGVzdHMgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIEJPT0xFQU4KLVNpU19Eb0xvd01vZGVUZXN0KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfRG9Mb3dNb2RlVGVzdChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICAgIFVTSE9SVCB0ZW1wLHRlbXAxLHRlbXAyOworICAgdW5zaWduZWQgc2hvcnQgdGVtcCwgdGVtcDEsIHRlbXAyOwogCi0gICAgaWYoKE1vZGVObyAhPSAweDAzKSAmJiAoTW9kZU5vICE9IDB4MTApICYmIChNb2RlTm8gIT0gMHgxMikpCi0gICAgICAgcmV0dXJuKFRSVUUpOwotICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgxMSk7Ci0gICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsMHgxMSwweDgwKTsKLSAgICB0ZW1wMSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDAwKTsKLSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgwMCwweDU1KTsKLSAgICB0ZW1wMiA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDAwKTsKLSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgwMCx0ZW1wMSk7Ci0gICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MTEsdGVtcCk7Ci0gICAgaWYoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB8fAotICAgICAgIChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfMzAwKSkgewotICAgICAgIGlmKHRlbXAyID09IDB4NTUpIHJldHVybihGQUxTRSk7Ci0gICAgICAgZWxzZSByZXR1cm4oVFJVRSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICBpZih0ZW1wMiAhPSAweDU1KSByZXR1cm4oVFJVRSk7Ci0gICAgICAgZWxzZSB7Ci0gICAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsMHgzNSwweDAxKTsKLSAgICAgICAgICByZXR1cm4oRkFMU0UpOwotICAgICAgIH0KLSAgICB9CisgICBpZigoTW9kZU5vICE9IDB4MDMpICYmIChNb2RlTm8gIT0gMHgxMCkgJiYgKE1vZGVObyAhPSAweDEyKSkKKyAgICAgIHJldHVybiBUUlVFOworICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDExKTsKKyAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MTEsMHg4MCk7CisgICB0ZW1wMSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDAwKTsKKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDAwLDB4NTUpOworICAgdGVtcDIgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgwMCk7CisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgwMCx0ZW1wMSk7CisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgxMSx0ZW1wKTsKKyAgIGlmKChTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB8fAorICAgICAgKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMwMCkpIHsKKyAgICAgIGlmKHRlbXAyID09IDB4NTUpIHJldHVybiBGQUxTRTsKKyAgICAgIGVsc2UgcmV0dXJuIFRSVUU7CisgICB9IGVsc2UgeworICAgICAgaWYodGVtcDIgIT0gMHg1NSkgcmV0dXJuIFRSVUU7CisgICAgICBlbHNlIHsKKwkgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsMHgzNSwweDAxKTsKKwkgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgfQogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldExvd01vZGVUZXN0KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfU2V0TG93TW9kZVRlc3Qoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObykKIHsKLSAgICBpZihTaVNfRG9Mb3dNb2RlVGVzdChTaVNfUHIsIE1vZGVObywgSHdJbmZvKSkgewotICAgICAgIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gTG93TW9kZVRlc3RzOwotICAgIH0KKyAgIGlmKFNpU19Eb0xvd01vZGVUZXN0KFNpU19QciwgTW9kZU5vKSkgeworICAgICAgU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBMb3dNb2RlVGVzdHM7CisgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgIEhFTFBFUjogRU5BQkxFIENSVDEgICAgICAgICAgICAqLworLyogICAgICAgIEhFTFBFUjogT1BFTi9DTE9TRSBDUlQxIENSVEMgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0dXBDUjV4KFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfT3BlbkNSVEMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICAgaWYoSVNfU0lTNjUwKSB7Ci0gICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0JICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHg1MSwweDFmKTsKLQkgIGlmKElTX1NJUzY1MSkgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsMHg1MSwweDIwKTsKLQkgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDU2LDB4ZTcpOwotICAgICAgIH0KLSAgICB9IGVsc2UgaWYoSVNfU0lTNjYxNzQxNjYwNzYwKSB7Ci0gICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4NjEsMHhmNyk7Ci0gICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4NTEsMHgxZik7Ci0gICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4NTYsMHhlNyk7Ci0gICAgICAgaWYoIVNpU19Qci0+U2lTX1JPTU5ldykgewotCSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4M2EsMHhlZik7Ci0gICAgICAgfQotICAgIH0KKyAgIGlmKElTX1NJUzY1MCkgeworICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4NTEsMHgxZik7CisgICAgICBpZihJU19TSVM2NTEpIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4NTEsMHgyMCk7CisgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHg1NiwweGU3KTsKKyAgIH0gZWxzZSBpZihJU19TSVM2NjE3NDE2NjA3NjApIHsKKyAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDYxLDB4ZjcpOworICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4NTEsMHgxZik7CisgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHg1NiwweGU3KTsKKyAgICAgIGlmKCFTaVNfUHItPlNpU19ST01OZXcpIHsKKwkgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4M2EsMHhlZik7CisgICAgICB9CisgICB9CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfSGFuZGxlQ1JUMShTaVNfUHJpdmF0ZSAqU2lTX1ByKQorU2lTX0Nsb3NlQ1JUQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgLyogRW5hYmxlIENSVDEgZ2F0aW5nICovCi0gIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCxTaVNfUHItPlNpU19NeUNSNjMsMHhiZik7CisjaWYgMCAvKiBUaGlzIGxvY2tzIHNvbWUgQ1JUQyByZWdpc3RlcnMuIFdlIGRvbid0IHdhbnQgdGhhdC4gKi8KKyAgIHVuc2lnbmVkIHNob3J0IHRlbXAxID0gMCwgdGVtcDIgPSAwOworCisgICBpZihJU19TSVM2NjE3NDE2NjA3NjApIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKKyAgICAgICAgIHRlbXAxID0gMHhhMDsgdGVtcDIgPSAweDA4OworICAgICAgfQorICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzZDQsMHg1MSwweDFmLHRlbXAxKTsKKyAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4NTYsMHhlNyx0ZW1wMik7CisgICB9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK1NpU19IYW5kbGVDUlQxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQoreworICAgLyogRW5hYmxlIENSVDEgZ2F0aW5nICovCisgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsU2lTX1ByLT5TaVNfTXlDUjYzLDB4YmYpOwogI2lmIDAKLSAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNSkgJiAweDAxKSkgewotICAgICBpZigoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTUpICYgMHgwYSkgfHwKLSAgICAgICAgKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE2KSAmIDB4MDEpKSB7Ci0gICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LFNpU19Qci0+U2lTX015Q1I2MywweDQwKTsKLSAgICAgfQotICB9CisgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE1KSAmIDB4MDEpKSB7CisgICAgICBpZigoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTUpICYgMHgwYSkgfHwKKyAgICAgICAgIChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNikgJiAweDAxKSkgeworICAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsU2lTX1ByLT5TaVNfTXlDUjYzLDB4NDApOworICAgICAgfQorICAgfQogI2VuZGlmCiB9CiAKQEAgLTE5NDYsNTcgKzE3ODcsNTQgQEAKIC8qICAgICAgICAgICBIRUxQRVI6IEdldENvbG9yRGVwdGggICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1VU0hPUlQKLVNpU19HZXRDb2xvckRlcHRoKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCkKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0Q29sb3JEZXB0aChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKLSAgVVNIT1JUIENvbG9yRGVwdGhbNl0gPSB7IDEsIDIsIDQsIDQsIDYsIDh9OwotICBTSE9SVCAgaW5kZXg7Ci0gIFVTSE9SVCBtb2RlZmxhZzsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBDb2xvckRlcHRoWzZdID0geyAxLCAyLCA0LCA0LCA2LCA4IH07CisgICB1bnNpZ25lZCBzaG9ydCBtb2RlZmxhZzsKKyAgIHNob3J0IGluZGV4OwogCi0gIC8qIERvIE5PVCBjaGVjayBVc2VDdXN0b21Nb2RlLCB3aWxsIHNrcmV3IHVwIEZJRk8gKi8KLSAgaWYoTW9kZU5vID09IDB4ZmUpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPkNNb2RlRmxhZzsKLSAgfSBlbHNlIHsKLSAgICAgaWYoTW9kZU5vIDw9IDB4MTMpCi0gICAgCW1vZGVmbGFnID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9Nb2RlRmxhZzsKLSAgICAgZWxzZQotICAgIAltb2RlZmxhZyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVGbGFnOwotICB9CisgICAvKiBEbyBOT1QgY2hlY2sgVXNlQ3VzdG9tTW9kZSwgd2lsbCBza3JldyB1cCBGSUZPICovCisgICBpZihNb2RlTm8gPT0gMHhmZSkgeworICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPkNNb2RlRmxhZzsKKyAgIH0gZWxzZSBpZihNb2RlTm8gPD0gMHgxMykgeworICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOworICAgfSBlbHNlIHsKKyAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7CisgICB9CiAKLSAgaW5kZXggPSAobW9kZWZsYWcgJiBNb2RlVHlwZU1hc2spIC0gTW9kZUVHQTsKLSAgaWYoaW5kZXggPCAwKSBpbmRleCA9IDA7Ci0gIHJldHVybihDb2xvckRlcHRoW2luZGV4XSk7CisgICBpbmRleCA9IChtb2RlZmxhZyAmIE1vZGVUeXBlTWFzaykgLSBNb2RlRUdBOworICAgaWYoaW5kZXggPCAwKSBpbmRleCA9IDA7CisgICByZXR1cm4gQ29sb3JEZXB0aFtpbmRleF07CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICBIRUxQRVI6IEdldE9mZnNldCAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotVVNIT1JUCi1TaVNfR2V0T2Zmc2V0KFNpU19Qcml2YXRlICpTaVNfUHIsVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsUFNJU19IV19JTkZPIEh3SW5mbykKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0T2Zmc2V0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSUlRJKQogewotICBVU0hPUlQgeHJlcywgdGVtcCwgY29sb3JkZXB0aCwgaW5mb2ZsYWc7CisgICB1bnNpZ25lZCBzaG9ydCB4cmVzLCB0ZW1wLCBjb2xvcmRlcHRoLCBpbmZvZmxhZzsKIAotICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPkNJbmZvRmxhZzsKLSAgICAgeHJlcyA9IFNpU19Qci0+Q0hEaXNwbGF5OwotICB9IGVsc2UgewotICAgICBpbmZvZmxhZyA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0luZm9GbGFnOwotICAgICB4cmVzID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5YUmVzOwotICB9CisgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKKyAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5DSW5mb0ZsYWc7CisgICAgICB4cmVzID0gU2lTX1ByLT5DSERpc3BsYXk7CisgICB9IGVsc2UgeworICAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJXS5FeHRfSW5mb0ZsYWc7CisgICAgICB4cmVzID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uWFJlczsKKyAgIH0KIAotICBjb2xvcmRlcHRoID0gU2lTX0dldENvbG9yRGVwdGgoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCk7CisgICBjb2xvcmRlcHRoID0gU2lTX0dldENvbG9yRGVwdGgoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAotICB0ZW1wID0geHJlcyAvIDE2OwotICBpZihpbmZvZmxhZyAmIEludGVybGFjZU1vZGUpIHRlbXAgPDw9IDE7Ci0gIHRlbXAgKj0gY29sb3JkZXB0aDsKLSAgaWYoeHJlcyAlIDE2KSB7Ci0gICAgIGNvbG9yZGVwdGggPj49IDE7Ci0gICAgIHRlbXAgKz0gY29sb3JkZXB0aDsKLSAgfQorICAgdGVtcCA9IHhyZXMgLyAxNjsKKyAgIGlmKGluZm9mbGFnICYgSW50ZXJsYWNlTW9kZSkgdGVtcCA8PD0gMTsKKyAgIHRlbXAgKj0gY29sb3JkZXB0aDsKKyAgIGlmKHhyZXMgJSAxNikgdGVtcCArPSAoY29sb3JkZXB0aCA+PiAxKTsKIAotICByZXR1cm4odGVtcCk7CisgICByZXR1cm4gdGVtcDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIwMDQsNTUgKzE4NDIsMjkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0U2VxUmVncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgU3RhbmRUYWJsZUluZGV4LCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldFNlcVJlZ3Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IFN0YW5kVGFibGVJbmRleCkKIHsKLSAgIFVDSEFSIFNSZGF0YTsKLSAgIFVTSE9SVCBpOworICAgdW5zaWduZWQgY2hhciBTUmRhdGE7CisgICBpbnQgaTsKIAotICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDAsMHgwMyk7ICAgICAgICAgICAJLyogU2V0IFNSMCAgKi8KKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDAwLDB4MDMpOwogCi0gICBTUmRhdGEgPSBTaVNfUHItPlNpU19TdGFuZFRhYmxlW1N0YW5kVGFibGVJbmRleF0uU1JbMF07CisgICAvKiBvciAiZGlzcGxheSBvZmYiICAqLworICAgU1JkYXRhID0gU2lTX1ByLT5TaVNfU3RhbmRUYWJsZVtTdGFuZFRhYmxlSW5kZXhdLlNSWzBdIHwgMHgyMDsKIAotICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0gICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7Ci0gICAgICAgICBTUmRhdGEgfD0gMHgwMTsKLSAgICAgIH0KLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHsKLSAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9UVikpIHsKLQkgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKLSAgICAgICAgICAgICAgIFNSZGF0YSB8PSAweDAxOyAgICAgICAgICAJCS8qIDggZG90IGNsb2NrICAqLwotICAgICAgICAgICAgfQotCSB9Ci0gICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7Ci0gICAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgewotCSAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewotICAgICAgICAgICAgICAgU1JkYXRhIHw9IDB4MDE7ICAgICAgICAgIAkJLyogOCBkb3QgY2xvY2sgICovCi0gICAgICAgICAgICB9Ci0JIH0KLSAgICAgIH0KKyAgIC8qIGRldGVybWluZSB3aGV0aGVyIHRvIGZvcmNlIHg4IGRvdGNsb2NrICovCisgICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHx8IChTaVNfUHItPlNpU19JRl9ERUZfTFZEUykpIHsKKworICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb1RWKSkgeworICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpICAgIFNSZGF0YSB8PSAweDAxOworICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIFNSZGF0YSB8PSAweDAxOworCiAgICB9CiAKLSAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKLSAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKLSAgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7Ci0gICAgICAgICAgICAgICBTUmRhdGEgfD0gMHgwMTsgICAgICAgIAkJCS8qIDggZG90IGNsb2NrICAqLwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7Ci0gICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewotICAgICAgICAgICAgU1JkYXRhIHw9IDB4MDE7ICAgICAgICAgIAkJCS8qIDggZG90IGNsb2NrICAqLwotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gICBTUmRhdGEgfD0gMHgyMDsgICAgICAgICAgICAgICAgCQkJLyogc2NyZWVuIG9mZiAgKi8KLQogICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDEsU1JkYXRhKTsKIAogICAgZm9yKGkgPSAyOyBpIDw9IDQ7IGkrKykgewotICAgICAgU1JkYXRhID0gU2lTX1ByLT5TaVNfU3RhbmRUYWJsZVtTdGFuZFRhYmxlSW5kZXhdLlNSW2ktMV07CisgICAgICBTUmRhdGEgPSBTaVNfUHItPlNpU19TdGFuZFRhYmxlW1N0YW5kVGFibGVJbmRleF0uU1JbaSAtIDFdOwogICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LGksU1JkYXRhKTsKICAgIH0KIH0KQEAgLTIwNjIsMTcgKzE4NzQsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0TWlzY1JlZ3MoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIFN0YW5kVGFibGVJbmRleCwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRNaXNjUmVncyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgU3RhbmRUYWJsZUluZGV4KQogewotICAgVUNIQVIgTWlzY2RhdGE7CisgICB1bnNpZ25lZCBjaGFyIE1pc2NkYXRhOwogCiAgICBNaXNjZGF0YSA9IFNpU19Qci0+U2lTX1N0YW5kVGFibGVbU3RhbmRUYWJsZUluZGV4XS5NSVNDOwogCi0gICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU182NjEpIHsKLSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgewotICAgICAgICAgICAgTWlzY2RhdGEgfD0gMHgwQzsKLSAgICAgICAgIH0KKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfNjYxKSB7CisgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKwkgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgeworCSAgIE1pc2NkYXRhIHw9IDB4MEM7CisJIH0KICAgICAgIH0KICAgIH0KIApAQCAtMjA4NCwzMyArMTg5NiwzNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXRDUlRDUmVncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICAgIFVTSE9SVCBTdGFuZFRhYmxlSW5kZXgpCitTaVNfU2V0Q1JUQ1JlZ3Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IFN0YW5kVGFibGVJbmRleCkKIHsKLSAgVUNIQVIgQ1JUQ2RhdGE7Ci0gIFVTSE9SVCBpOworICAgdW5zaWduZWQgY2hhciAgQ1JUQ2RhdGE7CisgICB1bnNpZ25lZCBzaG9ydCBpOwogCi0gIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDExLDB4N2YpOyAgICAgICAgICAgICAgICAgICAgICAgLyogVW5sb2NrIENSVEMgKi8KKyAgIC8qIFVubG9jayBDUlRDICovCisgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHgxMSwweDdmKTsKIAotICBmb3IoaSA9IDA7IGkgPD0gMHgxODsgaSsrKSB7Ci0gICAgIENSVENkYXRhID0gU2lTX1ByLT5TaVNfU3RhbmRUYWJsZVtTdGFuZFRhYmxlSW5kZXhdLkNSVENbaV07Ci0gICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxpLENSVENkYXRhKTsgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgQ1JUQygzZDQpICovCi0gIH0KLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgewotICAgICBTaVNfU2V0dXBDUjV4KFNpU19QciwgSHdJbmZvKTsKLSAgICAgZm9yKGkgPSAweDEzOyBpIDw9IDB4MTQ7IGkrKykgewotICAgICAgICBDUlRDZGF0YSA9IFNpU19Qci0+U2lTX1N0YW5kVGFibGVbU3RhbmRUYWJsZUluZGV4XS5DUlRDW2ldOwotICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaSxDUlRDZGF0YSk7Ci0gICAgIH0KLSAgfSBlbHNlIGlmKCAoIChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjMwKSB8fAotICAgICAgICAgICAgICAgKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183MzApICkgICYmCi0gICAgICAgICAgICAgKEh3SW5mby0+akNoaXBSZXZpc2lvbiA+PSAweDMwKSApIHsgICAgICAgCSAgIC8qIGZvciA2MzBTMCAqLwotICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewotICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvVFYpKSB7Ci0gICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDE4LDB4RkUpOwotICAgICAgICB9Ci0gICAgIH0KLSAgfQorICAgZm9yKGkgPSAwOyBpIDw9IDB4MTg7IGkrKykgeworICAgICAgQ1JUQ2RhdGEgPSBTaVNfUHItPlNpU19TdGFuZFRhYmxlW1N0YW5kVGFibGVJbmRleF0uQ1JUQ1tpXTsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxpLENSVENkYXRhKTsKKyAgIH0KKworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisgICAgICBTaVNfT3BlbkNSVEMoU2lTX1ByKTsKKyAgICAgIGZvcihpID0gMHgxMzsgaSA8PSAweDE0OyBpKyspIHsKKwkgQ1JUQ2RhdGEgPSBTaVNfUHItPlNpU19TdGFuZFRhYmxlW1N0YW5kVGFibGVJbmRleF0uQ1JUQ1tpXTsKKwkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LGksQ1JUQ2RhdGEpOworICAgICAgfQorICAgfSBlbHNlIGlmKCAoIChTaVNfUHItPkNoaXBUeXBlID09IFNJU182MzApIHx8CisJICAgICAgICAoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzMwKSApICAmJgorCSAgICAgIChTaVNfUHItPkNoaXBSZXZpc2lvbiA+PSAweDMwKSApIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7CisJIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9UVikpIHsKKwkgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MTgsMHhGRSk7CisJIH0KKyAgICAgIH0KKyAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIxMTgsNjQgKzE5MzEsNTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0QVRUUmVncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgU3RhbmRUYWJsZUluZGV4LAotICAgICAgICAgICAgICAgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRBVFRSZWdzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBTdGFuZFRhYmxlSW5kZXgpCiB7Ci0gICBVQ0hBUiBBUmRhdGE7Ci0gICBVU0hPUlQgaTsKKyAgIHVuc2lnbmVkIGNoYXIgIEFSZGF0YTsKKyAgIHVuc2lnbmVkIHNob3J0IGk7CiAKICAgIGZvcihpID0gMDsgaSA8PSAweDEzOyBpKyspIHsKICAgICAgIEFSZGF0YSA9IFNpU19Qci0+U2lTX1N0YW5kVGFibGVbU3RhbmRUYWJsZUluZGV4XS5BVFRSW2ldOwotI2lmIDAKLSAgICAgIGlmKChpIDw9IDB4MGYpIHx8IChpID09IDB4MTEpKSB7Ci0gICAgICAgICBpZihkczo0ODkgJiAweDA4KSB7Ci0JICAgIGNvbnRpbnVlOwotICAgICAgICAgfQotICAgICAgfQotI2VuZGlmCisKICAgICAgIGlmKGkgPT0gMHgxMykgewotICAgICAgICAgLyogUGl4ZWwgc2hpZnQuIElmIHNjcmVlbiBvbiBMQ0Qgb3IgVFYgaXMgc2hpZnRlZCBsZWZ0IG9yIHJpZ2h0LAotICAgICAgICAgICogdGhpcyBtaWdodCBiZSB0aGUgY2F1c2UuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgewotICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgIEFSZGF0YT0wOwotICAgICAgICAgfQotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewotICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7Ci0gICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgewotICAgICAgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIEFSZGF0YT0wOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotCSBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisJIC8qIFBpeGVsIHNoaWZ0LiBJZiBzY3JlZW4gb24gTENEIG9yIFRWIGlzIHNoaWZ0ZWQgbGVmdCBvciByaWdodCwKKwkgICogdGhpcyBtaWdodCBiZSB0aGUgY2F1c2UuCisJICAqLworCSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgQVJkYXRhID0gMDsKKwkgfQorCSBpZihTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB7CisJICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgeworCSAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgeworCQkgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSBBUmRhdGEgPSAwOworCSAgICAgICB9CisJICAgIH0KKwkgfQorCSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsKIAkgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb1RWIHwgU2V0Q1JUMlRvTENEKSkgewotCSAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgQVJkYXRhPTA7CisJICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSBBUmRhdGEgPSAwOwogCSAgICB9CiAJIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKLSAgICAgICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7CisJICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKIAkgICAgICAgaWYoSVNfU0lTNTUwNjUwNzQwNjYwKSB7Ci0JICAgICAgICAgIC8qIDMxNSwgMzMwIGRvbid0IGRvIHRoaXMgKi8KLQkgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQjMwMkIpIHsKLQkgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIEFSZGF0YT0wOwotCSAgICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgICBBUmRhdGEgPSAwOwotCSAgICAgICAgICB9CisJCSAgLyogMzE1LCAzMzAgZG9uJ3QgZG8gdGhpcyAqLworCQkgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEIpIHsKKwkJICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgQVJkYXRhID0gMDsKKwkJICB9IGVsc2UgeworCQkgICAgIEFSZGF0YSA9IDA7CisJCSAgfQogCSAgICAgICB9CiAJICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgIEFSZGF0YT0wOworCSAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgQVJkYXRhID0gMDsKIAkgICAgfQotICAgICAgICAgfQorCSB9CiAgICAgICB9Ci0gICAgICBTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXQgM2RhICAqLwotICAgICAgU2lTX1NldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjMCxpKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBpbmRleCAgKi8KLSAgICAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzAsQVJkYXRhKTsgICAgICAgICAgICAgICAgICAvKiBzZXQgZGF0YSAgICovCisgICAgICBTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKTsJCS8qIHJlc2V0IDNkYSAgKi8KKyAgICAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzAsaSk7CS8qIHNldCBpbmRleCAgKi8KKyAgICAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzAsQVJkYXRhKTsJLyogc2V0IGRhdGEgICAqLwogICAgfQotICAgU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNkYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2V0IDNkYSAgKi8KLSAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzAsMHgxNCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgaW5kZXggICovCi0gICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2MwLDB4MDApOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGRhdGEgICAqLworCisgICBTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKTsJCS8qIHJlc2V0IDNkYSAgKi8KKyAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzAsMHgxNCk7CS8qIHNldCBpbmRleCAgKi8KKyAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzAsMHgwMCk7CS8qIHNldCBkYXRhICAgKi8KIAogICAgU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNkYSk7Ci0gICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2MwLDB4MjApOwkJCS8qIEVuYWJsZSBBdHRyaWJ1dGUgICovCisgICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2MwLDB4MjApOwkvKiBFbmFibGUgQXR0cmlidXRlICAqLwogICAgU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNkYSk7CiB9CiAKQEAgLTIxODQsMTAgKzE5OTEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0R1JDUmVncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgU3RhbmRUYWJsZUluZGV4KQorU2lTX1NldEdSQ1JlZ3Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IFN0YW5kVGFibGVJbmRleCkKIHsKLSAgIFVDSEFSIEdSZGF0YTsKLSAgIFVTSE9SVCBpOworICAgdW5zaWduZWQgY2hhciAgR1JkYXRhOworICAgdW5zaWduZWQgc2hvcnQgaTsKIAogICAgZm9yKGkgPSAwOyBpIDw9IDB4MDg7IGkrKykgewogICAgICAgR1JkYXRhID0gU2lTX1ByLT5TaVNfU3RhbmRUYWJsZVtTdGFuZFRhYmxlSW5kZXhdLkdSQ1tpXTsKQEAgLTIyMDUsMjIgKzIwMTIsMjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfQ2xlYXJFeHQxUmVncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgTW9kZU5vKQorU2lTX0NsZWFyRXh0MVJlZ3Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObykKIHsKLSAgVVNIT1JUIGk7CisgICB1bnNpZ25lZCBzaG9ydCBpOwogCi0gIGZvcihpID0gMHgwQTsgaSA8PSAweDBFOyBpKyspIHsKLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LGksMHgwMCk7Ci0gIH0KKyAgIGZvcihpID0gMHgwQTsgaSA8PSAweDBFOyBpKyspIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCxpLDB4MDApOworICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDM3LDB4RkUpOwotICAgICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICAgICBpZihNb2RlTm8gPT0gMHgwNiB8fCBNb2RlTm8gPj0gMHgwZSkgewotCSAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDBlLDB4MjApOwotCX0KLSAgICAgfQotICB9CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgzNywweEZFKTsKKyAgICAgIGlmKE1vZGVObyA8PSAweDEzKSB7CisJIGlmKE1vZGVObyA9PSAweDA2IHx8IE1vZGVObyA+PSAweDBlKSB7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDBlLDB4MjApOworCSB9CisgICAgICB9CisgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMjI4LDMyICsyMDM1LDI0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1Jlc2V0Q1JUMVZDTEsoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19SZXNldENSVDFWQ0xLKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzY2MSkgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMCkgcmV0dXJuOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU182NjEpIHsKKwkgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMCkgcmV0dXJuOwogICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgIGlmKChTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAwKSAmJgotICAgICAgICAgKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSkgKSB7CisJICghKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikpICkgewogCSByZXR1cm47CiAgICAgICB9CiAgICB9CiAKLSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDMxLDB4Q0YsMHgyMCk7Ci0gICB9IGVsc2UgewotICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MzEsMHgyMCk7Ci0gICB9CisgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDMxLDB4Y2YsMHgyMCk7CiAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyQixTaVNfUHItPlNpU19WQ0xLRGF0YVsxXS5TUjJCKTsKICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJDLFNpU19Qci0+U2lTX1ZDTEtEYXRhWzFdLlNSMkMpOwogICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MkQsMHg4MCk7Ci0gICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgzMSwweGNmLDB4MTApOwotICAgfSBlbHNlIHsKLSAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDMxLDB4MTApOwotICAgfQorICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgzMSwweGNmLDB4MTApOwogICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MkIsU2lTX1ByLT5TaVNfVkNMS0RhdGFbMF0uU1IyQik7CiAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyQyxTaVNfUHItPlNpU19WQ0xLRGF0YVswXS5TUjJDKTsKICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJELDB4ODApOwpAQCAtMjI2NCwxOSArMjA2MywxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXRDUlQxU3luYyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQorU2lTX1NldENSVDFTeW5jKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBSUlRJKQogewotICBVU0hPUlQgc3luYzsKKyAgIHVuc2lnbmVkIHNob3J0IHN5bmM7CiAKLSAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0gICAgIHN5bmMgPSBTaVNfUHItPkNJbmZvRmxhZyA+PiA4OwotICB9IGVsc2UgewotICAgICBzeW5jID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfSW5mb0ZsYWcgPj4gODsKLSAgfQorICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisgICAgICBzeW5jID0gU2lTX1ByLT5DSW5mb0ZsYWcgPj4gODsKKyAgIH0gZWxzZSB7CisgICAgICBzeW5jID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0luZm9GbGFnID4+IDg7CisgICB9CiAKLSAgc3luYyAmPSAweEMwOwotICBzeW5jIHw9IDB4MmY7Ci0gIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzIsc3luYyk7CisgICBzeW5jICY9IDB4QzA7CisgICBzeW5jIHw9IDB4MmY7CisgICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2MyLHN5bmMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjI4NCw3MiArMjA4Myw2NyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXRDUlQxQ1JUQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLQkJUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRDUlQxQ1JUQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUlJUSSkKIHsKLSAgVUNIQVIgIGluZGV4OwotICBVU0hPUlQgdGVtcCxpLGosbW9kZWZsYWc7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wLCBpLCBqLCBtb2RlZmxhZzsKKyAgIHVuc2lnbmVkIGNoYXIgICpjcnQxZGF0YSA9IE5VTEw7CiAKLSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4MTEsMHg3Zik7CQkvKiB1bmxvY2sgY3IwLTcgKi8KKyAgIG1vZGVmbGFnID0gU2lTX0dldE1vZGVGbGFnKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CiAKLSAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKIAotICAgICBtb2RlZmxhZyA9IFNpU19Qci0+Q01vZGVGbGFnOworICAgICAgY3J0MWRhdGEgPSAmU2lTX1ByLT5DQ1JUMUNSVENbMF07CiAKLSAgICAgZm9yKGk9MCxqPTA7aTw9NztpKyssaisrKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxqLFNpU19Qci0+Q0NSVDFDUlRDW2ldKTsKLSAgICAgfQotICAgICBmb3Ioaj0weDEwO2k8PTEwO2krKyxqKyspIHsKLSAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LGosU2lTX1ByLT5DQ1JUMUNSVENbaV0pOwotICAgICB9Ci0gICAgIGZvcihqPTB4MTU7aTw9MTI7aSsrLGorKykgewotICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaixTaVNfUHItPkNDUlQxQ1JUQ1tpXSk7Ci0gICAgIH0KLSAgICAgZm9yKGo9MHgwQTtpPD0xNTtpKyssaisrKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCxqLFNpU19Qci0+Q0NSVDFDUlRDW2ldKTsKLSAgICAgfQorICAgfSBlbHNlIHsKIAotICAgICB0ZW1wID0gU2lTX1ByLT5DQ1JUMUNSVENbMTZdICYgMHhFMDsKLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MEUsdGVtcCk7CisgICAgICB0ZW1wID0gU2lTX0dldFJlZkNSVDFDUlRDKFNpU19QciwgUlJUSSwgU2lTX1ByLT5TaVNfVXNlV2lkZSk7CiAKLSAgICAgdGVtcCA9IChTaVNfUHItPkNDUlQxQ1JUQ1sxNl0gJiAweDAxKSA8PCA1OwotICAgICBpZihtb2RlZmxhZyAmIERvdWJsZVNjYW5Nb2RlKSB0ZW1wIHw9IDB4ODA7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MDksMHg1Rix0ZW1wKTsKKyAgICAgIC8qIEFsdGVybmF0ZSBmb3IgMTYwMHgxMjAwIExDREEgKi8KKyAgICAgIGlmKCh0ZW1wID09IDB4MjApICYmIChTaVNfUHItPkFsdGVybmF0ZTE2MDB4MTIwMCkpIHRlbXAgPSAweDU3OwogCi0gIH0gZWxzZSB7CisgICAgICBjcnQxZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopJlNpU19Qci0+U2lTX0NSVDFUYWJsZVt0ZW1wXS5DUlswXTsKIAotICAgICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICAgIH0KKyAgIH0KIAotICAgICBpbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVDFDUlRDOworICAgLyogdW5sb2NrIGNyMC03ICovCisgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHgxMSwweDdmKTsKIAotICAgICBmb3IoaT0wLGo9MDtpPD03O2krKyxqKyspIHsKLSAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LGosU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUltpXSk7Ci0gICAgIH0KLSAgICAgZm9yKGo9MHgxMDtpPD0xMDtpKyssaisrKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxqLFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbaV0pOwotICAgICB9Ci0gICAgIGZvcihqPTB4MTU7aTw9MTI7aSsrLGorKykgewotICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaixTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSW2ldKTsKLSAgICAgfQotICAgICBmb3Ioaj0weDBBO2k8PTE1O2krKyxqKyspIHsKLSAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LGosU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUltpXSk7Ci0gICAgIH0KKyAgIGZvcihpID0gMCwgaiA9IDA7IGkgPD0gNzsgaSsrLCBqKyspIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxqLGNydDFkYXRhW2ldKTsKKyAgIH0KKyAgIGZvcihqID0gMHgxMDsgaSA8PSAxMDsgaSsrLCBqKyspIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxqLGNydDFkYXRhW2ldKTsKKyAgIH0KKyAgIGZvcihqID0gMHgxNTsgaSA8PSAxMjsgaSsrLCBqKyspIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxqLGNydDFkYXRhW2ldKTsKKyAgIH0KKyAgIGZvcihqID0gMHgwQTsgaSA8PSAxNTsgaSsrLCBqKyspIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCxqLGNydDFkYXRhW2ldKTsKKyAgIH0KIAotICAgICB0ZW1wID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlsxNl0gJiAweEUwOwotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwRSx0ZW1wKTsKKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDBFLGNydDFkYXRhWzE2XSAmIDB4RTApOwogCi0gICAgIHRlbXAgPSAoKFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTZdKSAmIDB4MDEpIDw8IDU7Ci0gICAgIGlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpICB0ZW1wIHw9IDB4ODA7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MDksMHg1Rix0ZW1wKTsKKyAgIHRlbXAgPSAoY3J0MWRhdGFbMTZdICYgMHgwMSkgPDwgNTsKKyAgIGlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHRlbXAgfD0gMHg4MDsKKyAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MDksMHg1Rix0ZW1wKTsKIAotICB9CisgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVWR0EpIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDE0LDB4NEYpOworICAgfQogCi0gIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlID4gTW9kZVZHQSkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MTQsMHg0Rik7CisjaWZkZWYgU0lTMzE1SAorICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBYR0lfMjApIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDA0LGNydDFkYXRhWzRdIC0gMSk7CisgICAgICBpZighKHRlbXAgPSBjcnQxZGF0YVs1XSAmIDB4MWYpKSB7CisgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgwYywweGZiKTsKKyAgICAgIH0KKyAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MDUsMHhlMCwoKHRlbXAgLSAxKSAmIDB4MWYpKTsKKyAgICAgIHRlbXAgPSAoY3J0MWRhdGFbMTZdID4+IDUpICsgMzsKKyAgICAgIGlmKHRlbXAgPiA3KSB0ZW1wIC09IDc7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDBlLDB4MWYsKHRlbXAgPDwgNSkpOworICAgfQorI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMzU5LDMzICsyMTUzLDMyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDFPZmZzZXQoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLQkJICBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldENSVDFPZmZzZXQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJSVEkpCiB7Ci0gICBVU0hPUlQgdGVtcCwgRGlzcGxheVVuaXQsIGluZm9mbGFnOworICAgdW5zaWduZWQgc2hvcnQgdGVtcCwgRGlzcGxheVVuaXQsIGluZm9mbGFnOwogCiAgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKICAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5DSW5mb0ZsYWc7CiAgICB9IGVsc2UgewotICAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9JbmZvRmxhZzsKKyAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0luZm9GbGFnOwogICAgfQogCi0gICBEaXNwbGF5VW5pdCA9IFNpU19HZXRPZmZzZXQoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LEh3SW5mbyk7CisgICBEaXNwbGF5VW5pdCA9IFNpU19HZXRPZmZzZXQoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSUlRJKTsKIAogICAgdGVtcCA9IChEaXNwbGF5VW5pdCA+PiA4KSAmIDB4MGY7CiAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDBFLDB4RjAsdGVtcCk7CiAKLSAgIHRlbXAgPSBEaXNwbGF5VW5pdCAmIDB4RkY7Ci0gICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgxMyx0ZW1wKTsKKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDEzLERpc3BsYXlVbml0ICYgMHhGRik7CiAKICAgIGlmKGluZm9mbGFnICYgSW50ZXJsYWNlTW9kZSkgRGlzcGxheVVuaXQgPj49IDE7CiAKICAgIERpc3BsYXlVbml0IDw8PSA1OwotICAgdGVtcCA9IChEaXNwbGF5VW5pdCAmIDB4ZmYwMCkgPj4gODsKKyAgIHRlbXAgPSAoRGlzcGxheVVuaXQgPj4gOCkgKyAxOwogICAgaWYoRGlzcGxheVVuaXQgJiAweGZmKSB0ZW1wKys7Ci0gICB0ZW1wKys7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFhHSV8yMCkgeworICAgICAgaWYoTW9kZU5vID09IDB4NGEgfHwgTW9kZU5vID09IDB4NDkpIHRlbXAtLTsKKyAgIH0KICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDEwLHRlbXApOwogfQogCkBAIC0yMzk0LDM5ICsyMTg3LDQ5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDFWQ0xLKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQorU2lTX1NldENSVDFWQ0xLKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSUlRJKQogewotICBVU0hPUlQgIGluZGV4PTAsIGNsa2EsIGNsa2I7CisgICB1bnNpZ25lZCBzaG9ydCBpbmRleCA9IDAsIGNsa2EsIGNsa2I7CiAKLSAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0gICAgIGNsa2EgPSBTaVNfUHItPkNTUjJCOwotICAgICBjbGtiID0gU2lTX1ByLT5DU1IyQzsKLSAgfSBlbHNlIHsKLSAgICAgaW5kZXggPSBTaVNfR2V0VkNMSzJQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIEh3SW5mbyk7Ci0gICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkgewotICAgICAgICBjbGthID0gU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YVtpbmRleF0uUGFydDRfQTsKLQljbGtiID0gU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YVtpbmRleF0uUGFydDRfQjsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgY2xrYSA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2luZGV4XS5TUjJCOwotCWNsa2IgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtpbmRleF0uU1IyQzsKLSAgICAgfQotICB9CisgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKKyAgICAgIGNsa2EgPSBTaVNfUHItPkNTUjJCOworICAgICAgY2xrYiA9IFNpU19Qci0+Q1NSMkM7CisgICB9IGVsc2UgeworICAgICAgaW5kZXggPSBTaVNfR2V0VkNMSzJQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSUlRJKTsKKyAgICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpICYmCisJIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkgeworCSAvKiBBbHRlcm5hdGUgZm9yIDE2MDB4MTIwMCBMQ0RBICovCisJIGlmKChpbmRleCA9PSAweDIxKSAmJiAoU2lTX1ByLT5BbHRlcm5hdGUxNjAweDEyMDApKSBpbmRleCA9IDB4NzI7CisJIGNsa2EgPSBTaVNfUHItPlNpU19WQlZDTEtEYXRhW2luZGV4XS5QYXJ0NF9BOworCSBjbGtiID0gU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YVtpbmRleF0uUGFydDRfQjsKKyAgICAgIH0gZWxzZSB7CisJIGNsa2EgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtpbmRleF0uU1IyQjsKKwkgY2xrYiA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2luZGV4XS5TUjJDOworICAgICAgfQorICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDMxLDB4Q0YpOwotICB9IGVsc2UgewotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzMSwweDAwKTsKLSAgfQorICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MzEsMHhDRik7CiAKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MkIsY2xrYSk7Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJDLGNsa2IpOworICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MmIsY2xrYSk7CisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyYyxjbGtiKTsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyRCwweDAxKTsKLSAgfSBlbHNlIHsKLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MkQsMHg4MCk7Ci0gIH0KKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKyNpZmRlZiBTSVMzMTVICisgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyRCwweDAxKTsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gWEdJXzIwKSB7CisgICAgICAgICB1bnNpZ25lZCBzaG9ydCBtZiA9IFNpU19HZXRNb2RlRmxhZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOworCSBpZihtZiAmIEhhbGZEQ0xLKSB7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJiLFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJiKSk7CisJICAgIGNsa2IgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyYyk7CisJICAgIGNsa2IgPSAoKChjbGtiICYgMHgxZikgPDwgMSkgKyAxKSB8IChjbGtiICYgMHhlMCk7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJjLGNsa2IpOworCSB9CisgICAgICB9CisjZW5kaWYKKyAgIH0gZWxzZSB7CisgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyRCwweDgwKTsKKyAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI0MzQsNDE1ICsyMjM3LDM1OCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIFNJUzMwMAotc3RhdGljIFVTSE9SVAotU2lTX0RvQ2FsY0RlbGF5KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNQ0xLLCBVU0hPUlQgVkNMSywgVVNIT1JUIGNvbG9yZGVwdGgsIFVTSE9SVCBrZXkpCit2b2lkCitTaVNfR2V0RklGT1RocmVzaG9sZEluZGV4MzAwKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCAqaWR4MSwKKwkJdW5zaWduZWQgc2hvcnQgKmlkeDIpCiB7Ci0gIGNvbnN0IFVDSEFSIFRoTG93QVtdICAgPSB7IDYxLCAzLDUyLCA1LDY4LCA3LDEwMCwxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsIDMsNDIsIDUsNTQsIDcsIDc4LDExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwgMywzNywgNSw0NywgNywgNjcsMTEgfTsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXAxLCB0ZW1wMjsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFRoVGltaW5nWzhdID0geworCQkxLCAyLCAyLCAzLCAwLCAxLCAxLCAyCisgICB9OwogCi0gIGNvbnN0IFVDSEFSIFRoTG93QltdICAgPSB7IDgxLCA0LDcyLCA2LDg4LCA4LDEyMCwxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUsIDQsNTQsIDYsNjYsIDgsIDkwLDEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MiwgNCw0NSwgNiw1NSwgOCwgNzUsMTIgfTsKLQotICBjb25zdCBVQ0hBUiBUaFRpbWluZ1tdID0geyAgMSwgMiwgMiwgMywgMCwgMSwgIDEsIDIgfTsKLQotICBVU0hPUlQgdGVtcGFoLCB0ZW1wYWwsIHRlbXBjbCwgdGVtcGJ4LCB0ZW1wOwotICBVTE9ORyAgbG9uZ3RlbXA7Ci0KLSAgdGVtcGFoID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTgpOwotICB0ZW1wYWggJj0gMHg2MjsKLSAgdGVtcGFoID4+PSAxOwotICB0ZW1wYWwgPSB0ZW1wYWg7Ci0gIHRlbXBhaCA+Pj0gMzsKLSAgdGVtcGFsIHw9IHRlbXBhaDsKLSAgdGVtcGFsICY9IDB4MDc7Ci0gIHRlbXBjbCA9IFRoVGltaW5nW3RlbXBhbF07Ci0gIHRlbXBieCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE2KTsKLSAgdGVtcGJ4ID4+PSA2OwotICB0ZW1wYWggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNCk7Ci0gIHRlbXBhaCA+Pj0gNDsKLSAgdGVtcGFoICY9IDB4MGM7Ci0gIHRlbXBieCB8PSB0ZW1wYWg7Ci0gIHRlbXBieCA8PD0gMTsKLSAgaWYoa2V5ID09IDApIHsKLSAgICAgdGVtcGFsID0gVGhMb3dBW3RlbXBieCArIDFdOwotICAgICB0ZW1wYWwgKj0gdGVtcGNsOwotICAgICB0ZW1wYWwgKz0gVGhMb3dBW3RlbXBieF07Ci0gIH0gZWxzZSB7Ci0gICAgIHRlbXBhbCA9IFRoTG93Qlt0ZW1wYnggKyAxXTsKLSAgICAgdGVtcGFsICo9IHRlbXBjbDsKLSAgICAgdGVtcGFsICs9IFRoTG93Qlt0ZW1wYnhdOwotICB9Ci0gIGxvbmd0ZW1wID0gdGVtcGFsICogVkNMSyAqIGNvbG9yZGVwdGg7Ci0gIHRlbXAgPSBsb25ndGVtcCAlIChNQ0xLICogMTYpOwotICBsb25ndGVtcCAvPSAoTUNMSyAqIDE2KTsKLSAgaWYodGVtcCkgbG9uZ3RlbXArKzsKLSAgcmV0dXJuKChVU0hPUlQpbG9uZ3RlbXApOworICAgdGVtcDEgPSB0ZW1wMiA9IChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxOCkgJiAweDYyKSA+PiAxOworICAgKCppZHgyKSA9ICh1bnNpZ25lZCBzaG9ydCkoVGhUaW1pbmdbKCh0ZW1wMiA+PiAzKSB8IHRlbXAxKSAmIDB4MDddKTsKKyAgICgqaWR4MSkgPSAodW5zaWduZWQgc2hvcnQpKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE2KSA+PiA2KSAmIDB4MDM7CisgICAoKmlkeDEpIHw9ICh1bnNpZ25lZCBzaG9ydCkoKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNCkgPj4gNCkgJiAweDBjKSk7CisgICAoKmlkeDEpIDw8PSAxOwogfQogCi1zdGF0aWMgVVNIT1JUCi1TaVNfQ2FsY0RlbGF5KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBWQ0xLLCBVU0hPUlQgY29sb3JkZXB0aCwgVVNIT1JUIE1DTEspCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19HZXRGSUZPVGhyZXNob2xkQTMwMCh1bnNpZ25lZCBzaG9ydCBpZHgxLCB1bnNpZ25lZCBzaG9ydCBpZHgyKQogewotICBVU0hPUlQgdGVtcGF4LCB0ZW1wYng7CisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBUaExvd0FbOCAqIDNdID0geworCQk2MSwgMyw1MiwgNSw2OCwgNywxMDAsMTEsCisJCTQzLCAzLDQyLCA1LDU0LCA3LCA3OCwxMSwKKwkJMzQsIDMsMzcsIDUsNDcsIDcsIDY3LDExCisgICB9OwogCi0gIHRlbXBieCA9IFNpU19Eb0NhbGNEZWxheShTaVNfUHIsIE1DTEssIFZDTEssIGNvbG9yZGVwdGgsIDApOwotICB0ZW1wYXggPSBTaVNfRG9DYWxjRGVsYXkoU2lTX1ByLCBNQ0xLLCBWQ0xLLCBjb2xvcmRlcHRoLCAxKTsKLSAgaWYodGVtcGF4IDwgNCkgdGVtcGF4ID0gNDsKLSAgdGVtcGF4IC09IDQ7Ci0gIGlmKHRlbXBieCA8IHRlbXBheCkgdGVtcGJ4ID0gdGVtcGF4OwotICByZXR1cm4odGVtcGJ4KTsKKyAgIHJldHVybiAodW5zaWduZWQgc2hvcnQpKChUaExvd0FbaWR4MSArIDFdICogaWR4MikgKyBUaExvd0FbaWR4MV0pOworfQorCit1bnNpZ25lZCBzaG9ydAorU2lTX0dldEZJRk9UaHJlc2hvbGRCMzAwKHVuc2lnbmVkIHNob3J0IGlkeDEsIHVuc2lnbmVkIHNob3J0IGlkeDIpCit7CisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBUaExvd0JbOCAqIDNdID0geworCQk4MSwgNCw3MiwgNiw4OCwgOCwxMjAsMTIsCisJCTU1LCA0LDU0LCA2LDY2LCA4LCA5MCwxMiwKKwkJNDIsIDQsNDUsIDYsNTUsIDgsIDc1LDEyCisgICB9OworCisgICByZXR1cm4gKHVuc2lnbmVkIHNob3J0KSgoVGhMb3dCW2lkeDEgKyAxXSAqIGlkeDIpICsgVGhMb3dCW2lkeDFdKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfRG9DYWxjRGVsYXkoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1DTEssIHVuc2lnbmVkIHNob3J0IFZDTEssCisJCXVuc2lnbmVkIHNob3J0IGNvbG9yZGVwdGgsIHVuc2lnbmVkIHNob3J0IGtleSkKK3sKKyAgIHVuc2lnbmVkIHNob3J0IGlkeDEsIGlkeDI7CisgICB1bnNpZ25lZCBpbnQgICBsb25ndGVtcCA9IFZDTEsgKiBjb2xvcmRlcHRoOworCisgICBTaVNfR2V0RklGT1RocmVzaG9sZEluZGV4MzAwKFNpU19QciwgJmlkeDEsICZpZHgyKTsKKworICAgaWYoa2V5ID09IDApIHsKKyAgICAgIGxvbmd0ZW1wICo9IFNpU19HZXRGSUZPVGhyZXNob2xkQTMwMChpZHgxLCBpZHgyKTsKKyAgIH0gZWxzZSB7CisgICAgICBsb25ndGVtcCAqPSBTaVNfR2V0RklGT1RocmVzaG9sZEIzMDAoaWR4MSwgaWR4Mik7CisgICB9CisgICBpZHgxID0gbG9uZ3RlbXAgJSAoTUNMSyAqIDE2KTsKKyAgIGxvbmd0ZW1wIC89IChNQ0xLICogMTYpOworICAgaWYoaWR4MSkgbG9uZ3RlbXArKzsKKyAgIHJldHVybiAodW5zaWduZWQgc2hvcnQpbG9uZ3RlbXA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorU2lTX0NhbGNEZWxheShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgVkNMSywKKwkJdW5zaWduZWQgc2hvcnQgY29sb3JkZXB0aCwgdW5zaWduZWQgc2hvcnQgTUNMSykKK3sKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXAxLCB0ZW1wMjsKKworICAgdGVtcDIgPSBTaVNfRG9DYWxjRGVsYXkoU2lTX1ByLCBNQ0xLLCBWQ0xLLCBjb2xvcmRlcHRoLCAwKTsKKyAgIHRlbXAxID0gU2lTX0RvQ2FsY0RlbGF5KFNpU19QciwgTUNMSywgVkNMSywgY29sb3JkZXB0aCwgMSk7CisgICBpZih0ZW1wMSA8IDQpIHRlbXAxID0gNDsKKyAgIHRlbXAxIC09IDQ7CisgICBpZih0ZW1wMiA8IHRlbXAxKSB0ZW1wMiA9IHRlbXAxOworICAgcmV0dXJuIHRlbXAyOwogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDFGSUZPXzMwMChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICAgICAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQorU2lTX1NldENSVDFGSUZPXzMwMChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCiB7Ci0gIFVTSE9SVCAgVGhyZXNob2xkTG93ID0gMDsKLSAgVVNIT1JUICBpbmRleCwgVkNMSywgTUNMSywgY29sb3J0aD0wOwotICBVU0hPUlQgIHRlbXBhaCwgdGVtcDsKKyAgIHVuc2lnbmVkIHNob3J0IFRocmVzaG9sZExvdyA9IDA7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wLCBpbmRleCwgVkNMSywgTUNMSywgY29sb3J0aDsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjb2xvcnRoYXJyYXlbNl0gPSB7IDEsIDEsIDIsIDIsIDMsIDQgfTsKIAotICBpZihNb2RlTm8gPiAweDEzKSB7CisgICBpZihNb2RlTm8gPiAweDEzKSB7CiAKLSAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0gICAgICAgIFZDTEsgPSBTaVNfUHItPkNTUkNsb2NrOwotICAgICB9IGVsc2UgewotICAgICAgICBpbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVFZDTEs7Ci0gICAgICAgIGluZGV4ICY9IDB4M0Y7Ci0gICAgICAgIFZDTEsgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtpbmRleF0uQ0xPQ0s7ICAgICAgICAgICAgIC8qIEdldCBWQ0xLICAqLwotICAgICB9CisgICAgICAvKiBHZXQgVkNMSyAgKi8KKyAgICAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgeworCSBWQ0xLID0gU2lTX1ByLT5DU1JDbG9jazsKKyAgICAgIH0gZWxzZSB7CisJIGluZGV4ID0gU2lTX0dldFJlZkNSVFZDTEsoU2lTX1ByLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFNpU19Qci0+U2lTX1VzZVdpZGUpOworCSBWQ0xLID0gU2lTX1ByLT5TaVNfVkNMS0RhdGFbaW5kZXhdLkNMT0NLOworICAgICAgfQogCi0gICAgIHN3aXRjaCAoU2lTX1ByLT5TaVNfTW9kZVR5cGUgLSBNb2RlRUdBKSB7ICAgICAvKiBHZXQgaGFsZiBjb2xvcmRlcHRoICovCi0gICAgICAgIGNhc2UgMCA6IGNvbG9ydGggPSAxOyBicmVhazsKLSAgICAgICAgY2FzZSAxIDogY29sb3J0aCA9IDE7IGJyZWFrOwotICAgICAgICBjYXNlIDIgOiBjb2xvcnRoID0gMjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMyA6IGNvbG9ydGggPSAyOyBicmVhazsKLSAgICAgICAgY2FzZSA0IDogY29sb3J0aCA9IDM7IGJyZWFrOwotICAgICAgICBjYXNlIDUgOiBjb2xvcnRoID0gNDsgYnJlYWs7Ci0gICAgIH0KKyAgICAgIC8qIEdldCBoYWxmIGNvbG9yZGVwdGggKi8KKyAgICAgIGNvbG9ydGggPSBjb2xvcnRoYXJyYXlbKFNpU19Qci0+U2lTX01vZGVUeXBlIC0gTW9kZUVHQSldOwogCi0gICAgIGluZGV4ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4M0EpOwotICAgICBpbmRleCAmPSAweDA3OwotICAgICBNQ0xLID0gU2lTX1ByLT5TaVNfTUNMS0RhdGFfMFtpbmRleF0uQ0xPQ0s7ICAgICAgICAgICAvKiBHZXQgTUNMSyAgKi8KKyAgICAgIC8qIEdldCBNQ0xLICAqLworICAgICAgaW5kZXggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzQSkgJiAweDA3OworICAgICAgTUNMSyA9IFNpU19Qci0+U2lTX01DTEtEYXRhXzBbaW5kZXhdLkNMT0NLOwogCi0gICAgIHRlbXBhaCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM1KTsKLSAgICAgdGVtcGFoICY9IDB4YzM7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MTYsMHgzYyx0ZW1wYWgpOworICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM1KSAmIDB4YzM7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDE2LDB4M2MsdGVtcCk7CiAKLSAgICAgZG8gewotICAgICAgICBUaHJlc2hvbGRMb3cgPSBTaVNfQ2FsY0RlbGF5KFNpU19QciwgVkNMSywgY29sb3J0aCwgTUNMSyk7Ci0gICAgICAgIFRocmVzaG9sZExvdysrOwotICAgICAgICBpZihUaHJlc2hvbGRMb3cgPCAweDEzKSBicmVhazsKLSAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MTYsMHhmYyk7Ci0gICAgICAgIFRocmVzaG9sZExvdyA9IDB4MTM7Ci0gICAgICAgIHRlbXBhaCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE2KTsKLSAgICAgICAgdGVtcGFoID4+PSA2OwotICAgICAgICBpZighKHRlbXBhaCkpIGJyZWFrOwotICAgICAgICB0ZW1wYWgtLTsKLSAgICAgICAgdGVtcGFoIDw8PSA2OwotICAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDE2LDB4M2YsdGVtcGFoKTsKLSAgICAgfSB3aGlsZSgwKTsKKyAgICAgIGRvIHsKKwkgVGhyZXNob2xkTG93ID0gU2lTX0NhbGNEZWxheShTaVNfUHIsIFZDTEssIGNvbG9ydGgsIE1DTEspICsgMTsKKwkgaWYoVGhyZXNob2xkTG93IDwgMHgxMykgYnJlYWs7CisJIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDE2LDB4ZmMpOworCSBUaHJlc2hvbGRMb3cgPSAweDEzOworCSB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTYpID4+IDY7CisJIGlmKCF0ZW1wKSBicmVhazsKKwkgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgxNiwweDNmLCgodGVtcCAtIDEpIDw8IDYpKTsKKyAgICAgIH0gd2hpbGUoMCk7CiAKLSAgfSBlbHNlIFRocmVzaG9sZExvdyA9IDI7CisgICB9IGVsc2UgVGhyZXNob2xkTG93ID0gMjsKIAotICAvKiBXcml0ZSBDUlQvQ1BVIHRocmVzaG9sZCBsb3csIENSVC9FbmdpbmUgdGhyZXNob2xkIGhpZ2ggKi8KLSAgdGVtcCA9IChUaHJlc2hvbGRMb3cgPDwgNCkgfCAweDBmOwotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOCx0ZW1wKTsKKyAgIC8qIFdyaXRlIENSVC9DUFUgdGhyZXNob2xkIGxvdywgQ1JUL0VuZ2luZSB0aHJlc2hvbGQgaGlnaCAqLworICAgdGVtcCA9IChUaHJlc2hvbGRMb3cgPDwgNCkgfCAweDBmOworICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDgsdGVtcCk7CiAKLSAgdGVtcCA9IChUaHJlc2hvbGRMb3cgJiAweDEwKSA8PCAxOwotICBpZihNb2RlTm8gPiAweDEzKSB0ZW1wIHw9IDB4NDA7Ci0gIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MGYsMHg5Zix0ZW1wKTsKKyAgIHRlbXAgPSAoVGhyZXNob2xkTG93ICYgMHgxMCkgPDwgMTsKKyAgIGlmKE1vZGVObyA+IDB4MTMpIHRlbXAgfD0gMHg0MDsKKyAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MGYsMHg5Zix0ZW1wKTsKIAotICAvKiBXaGF0IGlzIHRoaXM/ICovCi0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDNCLDB4MDkpOworICAgLyogV2hhdCBpcyB0aGlzPyAqLworICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4M0IsMHgwOSk7CiAKLSAgLyogV3JpdGUgQ1JUL0NQVSB0aHJlc2hvbGQgaGlnaCAqLwotICB0ZW1wID0gVGhyZXNob2xkTG93ICsgMzsKLSAgaWYodGVtcCA+IDB4MGYpIHRlbXAgPSAweDBmOwotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOSx0ZW1wKTsKKyAgIC8qIFdyaXRlIENSVC9DUFUgdGhyZXNob2xkIGhpZ2ggKi8KKyAgIHRlbXAgPSBUaHJlc2hvbGRMb3cgKyAzOworICAgaWYodGVtcCA+IDB4MGYpIHRlbXAgPSAweDBmOworICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDksdGVtcCk7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19DYWxjRGVsYXkyKFNpU19Qcml2YXRlICpTaVNfUHIsIFVDSEFSIGtleSwgUFNJU19IV19JTkZPIEh3SW5mbykKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0TGF0ZW5jeUZhY3RvcjYzMChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgaW5kZXgpCiB7Ci0gIFVTSE9SVCBkYXRhLGluZGV4OwotICBjb25zdCBVQ0hBUiAgTGF0ZW5jeUZhY3RvcltdID0gewotICAgCTk3LCA4OCwgODYsIDc5LCA3NywgMDAsICAgICAgIC8qOyA2NCAgYml0ICAgIEJRPTIgICAqLwotICAgICAgICAwMCwgODcsIDg1LCA3OCwgNzYsIDU0LCAgICAgICAvKjsgNjQgIGJpdCAgICBCUT0xICAgKi8KLSAgICAgICAgOTcsIDg4LCA4NiwgNzksIDc3LCAwMCwgICAgICAgLyo7IDEyOCBiaXQgICAgQlE9MiAgICovCi0gICAgICAgIDAwLCA3OSwgNzcsIDcwLCA2OCwgNDgsICAgICAgIC8qOyAxMjggYml0ICAgIEJRPTEgICAqLwotICAgICAgICA4MCwgNzIsIDY5LCA2MywgNjEsIDAwLCAgICAgICAvKjsgNjQgIGJpdCAgICBCUT0yICAgKi8KLSAgICAgICAgMDAsIDcwLCA2OCwgNjEsIDU5LCAzNywgICAgICAgLyo7IDY0ICBiaXQgICAgQlE9MSAgICovCi0gICAgICAgIDg2LCA3NywgNzUsIDY4LCA2NiwgMDAsICAgICAgIC8qOyAxMjggYml0ICAgIEJRPTIgICAqLwotICAgICAgICAwMCwgNjgsIDY2LCA1OSwgNTcsIDM3ICAgICAgICAvKjsgMTI4IGJpdCAgICBCUT0xICAgKi8KLSAgfTsKLSAgY29uc3QgVUNIQVIgIExhdGVuY3lGYWN0b3I3MzBbXSA9IHsKLSAgICAgICAgIDY5LCA2MywgNjEsCi0JIDg2LCA3OSwgNzcsCi0JMTAzLCA5NiwgOTQsCi0JMTIwLDExMywxMTEsCi0JMTM3LDEzMCwxMjgsICAgIC8qIC0tLSBUYWJsZSBlbmRzIHdpdGggdGhpcyBlbnRyeSwgZGF0YSBiZWxvdyAqLwotCTEzNywxMzAsMTI4LAkvKiB0byBhdm9pZCB1c2luZyBpbGxlZ2FsIHZhbHVlcyAgICAgICAgICAgICAgKi8KLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLSAgfTsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExhdGVuY3lGYWN0b3JbXSA9IHsKKwkJOTcsIDg4LCA4NiwgNzksIDc3LCAgMCwgICAgICAgLyogNjQgIGJpdCAgICBCUT0yICAgKi8KKwkJIDAsIDg3LCA4NSwgNzgsIDc2LCA1NCwgICAgICAgLyogNjQgIGJpdCAgICBCUT0xICAgKi8KKwkJOTcsIDg4LCA4NiwgNzksIDc3LCAgMCwgICAgICAgLyogMTI4IGJpdCAgICBCUT0yICAgKi8KKwkJIDAsIDc5LCA3NywgNzAsIDY4LCA0OCwgICAgICAgLyogMTI4IGJpdCAgICBCUT0xICAgKi8KKwkJODAsIDcyLCA2OSwgNjMsIDYxLCAgMCwgICAgICAgLyogNjQgIGJpdCAgICBCUT0yICAgKi8KKwkJIDAsIDcwLCA2OCwgNjEsIDU5LCAzNywgICAgICAgLyogNjQgIGJpdCAgICBCUT0xICAgKi8KKwkJODYsIDc3LCA3NSwgNjgsIDY2LCAgMCwgICAgICAgLyogMTI4IGJpdCAgICBCUT0yICAgKi8KKwkJIDAsIDY4LCA2NiwgNTksIDU3LCAzNyAgICAgICAgLyogMTI4IGJpdCAgICBCUT0xICAgKi8KKyAgIH07CisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMYXRlbmN5RmFjdG9yNzMwW10gPSB7CisJCSA2OSwgNjMsIDYxLAorCQkgODYsIDc5LCA3NywKKwkJMTAzLCA5NiwgOTQsCisJCTEyMCwxMTMsMTExLAorCQkxMzcsMTMwLDEyOAorICAgfTsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzMwKSB7Ci0gICAgIGluZGV4ID0gKChrZXkgJiAweDBmKSAqIDMpICsgKChrZXkgJiAweEMwKSA+PiA2KTsKLSAgICAgZGF0YSA9IExhdGVuY3lGYWN0b3I3MzBbaW5kZXhdOwotICB9IGVsc2UgewotICAgICBpbmRleCA9IChrZXkgJiAweEUwKSA+PiA1OwotICAgICBpZihrZXkgJiAweDEwKSBpbmRleCArPTY7Ci0gICAgIGlmKCEoa2V5ICYgMHgwMSkpIGluZGV4ICs9IDI0OwotICAgICBkYXRhID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTQpOwotICAgICBpZihkYXRhICYgMHgwMDgwKSBpbmRleCArPSAxMjsKLSAgICAgZGF0YSA9IExhdGVuY3lGYWN0b3JbaW5kZXhdOwotICB9Ci0gIHJldHVybihkYXRhKTsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzczMCkgeworICAgICAgcmV0dXJuICh1bnNpZ25lZCBzaG9ydClMYXRlbmN5RmFjdG9yNzMwW2luZGV4XTsKKyAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gKHVuc2lnbmVkIHNob3J0KUxhdGVuY3lGYWN0b3JbaW5kZXhdOworICAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19DYWxjRGVsYXkyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBjaGFyIGtleSkKK3sKKyAgIHVuc2lnbmVkIHNob3J0IGluZGV4OworCisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApIHsKKyAgICAgIGluZGV4ID0gKChrZXkgJiAweDBmKSAqIDMpICsgKChrZXkgJiAweGMwKSA+PiA2KTsKKyAgIH0gZWxzZSB7CisgICAgICBpbmRleCA9IChrZXkgJiAweGUwKSA+PiA1OworICAgICAgaWYoa2V5ICYgMHgxMCkgICAgaW5kZXggKz0gIDY7CisgICAgICBpZighKGtleSAmIDB4MDEpKSBpbmRleCArPSAyNDsKKyAgICAgIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE0KSAmIDB4ODApIGluZGV4ICs9IDEyOworICAgfQorICAgcmV0dXJuIFNpU19HZXRMYXRlbmN5RmFjdG9yNjMwKFNpU19QciwgaW5kZXgpOwogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDFGSUZPXzYzMChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLAotIAkJICAgIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCitTaVNfU2V0Q1JUMUZJRk9fNjMwKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCkKIHsKLSAgVVNIT1JUICBpLGluZGV4LGRhdGEsVkNMSyxNQ0xLLGNvbG9ydGg9MDsKLSAgVUxPTkcgICBCLGVheCxibCxkYXRhMjsKLSAgVVNIT1JUICBUaHJlc2hvbGRMb3c9MDsKLSAgVUNIQVIgICBGUUJRRGF0YVtdPSB7Ci0gIAkweDAxLDB4MjEsMHg0MSwweDYxLDB4ODEsCi0gICAgICAgIDB4MzEsMHg1MSwweDcxLDB4OTEsMHhiMSwKLSAgICAgICAgMHgwMCwweDIwLDB4NDAsMHg2MCwweDgwLAotICAgICAgICAweDMwLDB4NTAsMHg3MCwweDkwLDB4YjAsCi0JMHhGRgotICB9OwotICBVQ0hBUiAgIEZRQlFEYXRhNzMwW109IHsKLSAgICAgICAgMHgzNCwweDc0LDB4YjQsCi0JMHgyMywweDYzLDB4YTMsCi0JMHgxMiwweDUyLDB4OTIsCi0JMHgwMSwweDQxLDB4ODEsCi0JMHgwMCwweDQwLDB4ODAsCi0JMHhmZgotICB9OworICAgdW5zaWduZWQgc2hvcnQgIFRocmVzaG9sZExvdyA9IDA7CisgICB1bnNpZ25lZCBzaG9ydCAgaSwgZGF0YSwgVkNMSywgTUNMSzE2LCBjb2xvcnRoID0gMDsKKyAgIHVuc2lnbmVkIGludCAgICB0ZW1wbCwgZGF0YWw7CisgICBjb25zdCB1bnNpZ25lZCBjaGFyICpxdWV1ZWRhdGEgPSBOVUxMOworICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgRlFCUURhdGFbMjFdID0geworCQkweDAxLDB4MjEsMHg0MSwweDYxLDB4ODEsCisJCTB4MzEsMHg1MSwweDcxLDB4OTEsMHhiMSwKKwkJMHgwMCwweDIwLDB4NDAsMHg2MCwweDgwLAorCQkweDMwLDB4NTAsMHg3MCwweDkwLDB4YjAsCisJCTB4ZmYKKyAgIH07CisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBGUUJRRGF0YTczMFsxNl0gPSB7CisJCTB4MzQsMHg3NCwweGI0LAorCQkweDIzLDB4NjMsMHhhMywKKwkJMHgxMiwweDUyLDB4OTIsCisJCTB4MDEsMHg0MSwweDgxLAorCQkweDAwLDB4NDAsMHg4MCwKKwkJMHhmZgorICAgfTsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjb2xvcnRoYXJyYXlbNl0gPSB7CisJCTEsIDEsIDIsIDIsIDMsIDQKKyAgIH07CiAKLSAgaT0wOwotICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0gICAgICAgVkNMSyA9IFNpU19Qci0+Q1NSQ2xvY2s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICBpbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVFZDTEs7Ci0gICAgICAgaW5kZXggJj0gMHgzRjsKLSAgICAgICBWQ0xLID0gU2lTX1ByLT5TaVNfVkNMS0RhdGFbaW5kZXhdLkNMT0NLOyAgICAgICAgICAvKiBHZXQgVkNMSyAgKi8KLSAgICB9CisgICBpID0gMDsKIAotICAgIGluZGV4ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MUEpOwotICAgIGluZGV4ICY9IDB4MDc7Ci0gICAgTUNMSyA9IFNpU19Qci0+U2lTX01DTEtEYXRhXzBbaW5kZXhdLkNMT0NLOyAgICAgICAgICAgLyogR2V0IE1DTEsgICovCisgICBpZihNb2RlTm8gPiAweDEzKSB7CiAKLSAgICBkYXRhMiA9IFNpU19Qci0+U2lTX01vZGVUeXBlIC0gTW9kZUVHQTsJICAvKiBHZXQgaGFsZiBjb2xvcmRlcHRoICovCi0gICAgc3dpdGNoIChkYXRhMikgewotICAgICAgICBjYXNlIDAgOiBjb2xvcnRoID0gMTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMSA6IGNvbG9ydGggPSAxOyBicmVhazsKLSAgICAgICAgY2FzZSAyIDogY29sb3J0aCA9IDI7IGJyZWFrOwotICAgICAgICBjYXNlIDMgOiBjb2xvcnRoID0gMjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNCA6IGNvbG9ydGggPSAzOyBicmVhazsKLSAgICAgICAgY2FzZSA1IDogY29sb3J0aCA9IDQ7IGJyZWFrOwotICAgIH0KKyAgICAgIC8qIEdldCBWQ0xLICAqLworICAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisJIFZDTEsgPSBTaVNfUHItPkNTUkNsb2NrOworICAgICAgfSBlbHNlIHsKKwkgZGF0YSA9IFNpU19HZXRSZWZDUlRWQ0xLKFNpU19QciwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBTaVNfUHItPlNpU19Vc2VXaWRlKTsKKwkgVkNMSyA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2RhdGFdLkNMT0NLOworICAgICAgfQogCi0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgeworICAgICAgLyogR2V0IE1DTEsgKiAxNiAqLworICAgICAgZGF0YSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDFBKSAmIDB4MDc7CisgICAgICBNQ0xLMTYgPSBTaVNfUHItPlNpU19NQ0xLRGF0YV8wW2RhdGFdLkNMT0NLICogMTY7CiAKLSAgICAgICBkbyB7Ci0gICAgICAgICAgQiA9IFNpU19DYWxjRGVsYXkyKFNpU19QciwgRlFCUURhdGE3MzBbaV0sIEh3SW5mbykgKiBWQ0xLICogY29sb3J0aDsKLQkgIGJsID0gQiAvIChNQ0xLICogMTYpOworICAgICAgLyogR2V0IGhhbGYgY29sb3JkZXB0aCAqLworICAgICAgY29sb3J0aCA9IGNvbG9ydGhhcnJheVsoU2lTX1ByLT5TaVNfTW9kZVR5cGUgLSBNb2RlRUdBKV07CiAKLSAgICAgICAgICBpZihCID09IGJsICogMTYgKiBNQ0xLKSB7Ci0gICAgICAgICAgICAgYmwgPSBibCArIDE7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBibCA9IGJsICsgMjsKLSAgICAgICAgICB9CisgICAgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApIHsKKwkgcXVldWVkYXRhID0gJkZRQlFEYXRhNzMwWzBdOworICAgICAgfSBlbHNlIHsKKwkgcXVldWVkYXRhID0gJkZRQlFEYXRhWzBdOworICAgICAgfQogCi0gICAgICAgICAgaWYoYmwgPiAweDEzKSB7Ci0gICAgICAgICAgICAgaWYoRlFCUURhdGE3MzBbaSsxXSA9PSAweEZGKSB7Ci0gICAgICAgICAgICAgICAgVGhyZXNob2xkTG93ID0gMHgxMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaSsrOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgVGhyZXNob2xkTG93ID0gYmw7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgIH0gd2hpbGUoRlFCUURhdGE3MzBbaV0gIT0gMHhGRik7CisgICAgICBkbyB7CisJIHRlbXBsID0gU2lTX0NhbGNEZWxheTIoU2lTX1ByLCBxdWV1ZWRhdGFbaV0pICogVkNMSyAqIGNvbG9ydGg7CiAKLSAgICB9IGVsc2UgeworCSBkYXRhbCA9IHRlbXBsICUgTUNMSzE2OworCSB0ZW1wbCA9ICh0ZW1wbCAvIE1DTEsxNikgKyAxOworCSBpZihkYXRhbCkgdGVtcGwrKzsKIAotICAgICAgIGRvIHsKLSAgICAgICAgICBCID0gU2lTX0NhbGNEZWxheTIoU2lTX1ByLCBGUUJRRGF0YVtpXSwgSHdJbmZvKSAqIFZDTEsgKiBjb2xvcnRoOwotICAgICAgICAgIGJsID0gQiAvIChNQ0xLICogMTYpOworCSBpZih0ZW1wbCA+IDB4MTMpIHsKKwkgICAgaWYocXVldWVkYXRhW2kgKyAxXSA9PSAweEZGKSB7CisJICAgICAgIFRocmVzaG9sZExvdyA9IDB4MTM7CisJICAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGkrKzsKKwkgfSBlbHNlIHsKKwkgICAgVGhyZXNob2xkTG93ID0gdGVtcGw7CisJICAgIGJyZWFrOworCSB9CisgICAgICB9IHdoaWxlKHF1ZXVlZGF0YVtpXSAhPSAweEZGKTsKIAotICAgICAgICAgIGlmKEIgPT0gYmwgKiAxNiAqIE1DTEspIHsKLSAgICAgICAgICAgICBibCA9IGJsICsgMTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGJsID0gYmwgKyAyOwotICAgICAgICAgIH0KKyAgIH0gZWxzZSB7CiAKLSAgICAgICAgICBpZihibCA+IDB4MTMpIHsKLSAgICAgICAgICAgICBpZihGUUJRRGF0YVtpKzFdID09IDB4RkYpIHsKLSAgICAgICAgICAgICAgICBUaHJlc2hvbGRMb3cgPSAweDEzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBUaHJlc2hvbGRMb3cgPSBibDsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgfSB3aGlsZShGUUJRRGF0YVtpXSAhPSAweEZGKTsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgewotICAgIH0gZWxzZSB7Ci0gICAgICBpID0gOTsKLSAgICB9Ci0gICAgVGhyZXNob2xkTG93ID0gMHgwMjsKLSAgfQorICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSAhPSBTSVNfNzMwKSBpID0gOTsKKyAgICAgIFRocmVzaG9sZExvdyA9IDB4MDI7CisKKyAgIH0KKworICAgLyogV3JpdGUgQ1JUL0NQVSB0aHJlc2hvbGQgbG93LCBDUlQvRW5naW5lIHRocmVzaG9sZCBoaWdoICovCisgICBkYXRhID0gKChUaHJlc2hvbGRMb3cgJiAweDBmKSA8PCA0KSB8IDB4MGY7CisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOCxkYXRhKTsKKworICAgZGF0YSA9IChUaHJlc2hvbGRMb3cgJiAweDEwKSA8PCAxOworICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwRiwweERGLGRhdGEpOworCisgICAvKiBXaGF0IGlzIHRoaXM/ICovCisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzQiwweDA5KTsKKworICAgLyogV3JpdGUgQ1JUL0NQVSB0aHJlc2hvbGQgaGlnaCAoZ2FwID0gMykgKi8KKyAgIGRhdGEgPSBUaHJlc2hvbGRMb3cgKyAzOworICAgaWYoZGF0YSA+IDB4MGYpIGRhdGEgPSAweDBmOworICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwOSwweDgwLGRhdGEpOwogCiAgIC8qIFdyaXRlIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgcXVldWUgKi8KLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgewotCi0gICAgIGRhdGEyID0gRlFCUURhdGE3MzBbaV07Ci0gICAgIGRhdGEyID0gKGRhdGEyICYgMHhDMCkgPj4gNTsKLSAgICAgZGF0YTIgPDw9IDg7Ci0KLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgICAgU2lTX1NldFJlZ0xvbmcoMHhjZjgsMHg4MDAwMDA1MCk7Ci0gICAgIGVheCA9IFNpU19HZXRSZWdMb25nKDB4Y2ZjKTsKLSAgICAgZWF4ICY9IDB4ZmZmZmY5ZmY7Ci0gICAgIGVheCB8PSBkYXRhMjsKLSAgICAgU2lTX1NldFJlZ0xvbmcoMHhjZmMsZWF4KTsKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICB0ZW1wbCA9IHNpc2ZiX3JlYWRfbmJyaWRnZV9wY2lfZHdvcmQoU2lTX1ByLCAweDUwKTsKICNlbHNlCi0gICAgIC8qIFdlIHVzZSBwY2kgZnVuY3Rpb25zIFggb2ZmZXJzLiBXZSB1c2UgcGNpdGFnIDAsIGJlY2F1c2UKLSAgICAgICogd2Ugd2FudCB0byByZWFkL3dyaXRlIHRvIHRoZSBob3N0IGJyaWRnZSAod2hpY2ggaXMgYWx3YXlzCi0gICAgICAqIDAwOjAwLjAgb24gNjMwLCA3MzAgYW5kIDU0MCksIG5vdCB0aGUgVkdBIGRldmljZS4KLSAgICAgICovCi0gICAgIGVheCA9IHBjaVJlYWRMb25nKDB4MDAwMDAwMDAsIDB4NTApOwotICAgICBlYXggJj0gMHhmZmZmZjlmZjsKLSAgICAgZWF4IHw9IGRhdGEyOwotICAgICBwY2lXcml0ZUxvbmcoMHgwMDAwMDAwMCwgMHg1MCwgZWF4KTsKKyAgIHRlbXBsID0gcGNpUmVhZExvbmcoMHgwMDAwMDAwMCwgMHg1MCk7CiAjZW5kaWYKIAotICAgICAvKiBXcml0ZSBHVUkgZ3JhbnQgdGltZXIgKFBDSSBjb25maWcgMHhBMykgKi8KLSAgICAgZGF0YTIgPSBGUUJRRGF0YTczMFtpXSA8PCA4OwotICAgICBkYXRhMiA9IChkYXRhMiAmIDB4MGYwMCkgfCAoKGRhdGEyICYgMHgzMDAwKSA+PiA4KTsKLSAgICAgZGF0YTIgPDw9IDIwOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzMwKSB7CiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgICAgU2lTX1NldFJlZ0xvbmcoMHhjZjgsMHg4MDAwMDBBMCk7Ci0gICAgIGVheCA9IFNpU19HZXRSZWdMb25nKDB4Y2ZjKTsKLSAgICAgZWF4ICY9IDB4MDBmZmZmZmY7Ci0gICAgIGVheCB8PSBkYXRhMjsKLSAgICAgU2lTX1NldFJlZ0xvbmcoMHhjZmMsZWF4KTsKKyAgICAgIHRlbXBsICY9IDB4ZmZmZmY5ZmY7CisgICAgICB0ZW1wbCB8PSAoKHF1ZXVlZGF0YVtpXSAmIDB4YzApIDw8IDMpOworCisgICB9IGVsc2UgeworCisgICAgICB0ZW1wbCAmPSAweGYwZmZmZmZmOworICAgICAgaWYoIChNb2RlTm8gPD0gMHgxMykgJiYKKyAgICAgICAgICAoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNjMwKSAmJgorCSAgKFNpU19Qci0+Q2hpcFJldmlzaW9uID49IDB4MzApICkgeworCSB0ZW1wbCB8PSAweDBiMDAwMDAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHRlbXBsIHw9ICgocXVldWVkYXRhW2ldICYgMHhmMCkgPDwgMjApOworICAgICAgfQorCisgICB9CisKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICBzaXNmYl93cml0ZV9uYnJpZGdlX3BjaV9kd29yZChTaVNfUHIsIDB4NTAsIHRlbXBsKTsKKyAgIHRlbXBsID0gc2lzZmJfcmVhZF9uYnJpZGdlX3BjaV9kd29yZChTaVNfUHIsIDB4QTApOwogI2Vsc2UKLSAgICAgZWF4ID0gcGNpUmVhZExvbmcoMHgwMDAwMDAwMCwgMHhBMCk7Ci0gICAgIGVheCAmPSAweDAwZmZmZmZmOwotICAgICBlYXggfD0gZGF0YTI7Ci0gICAgIHBjaVdyaXRlTG9uZygweDAwMDAwMDAwLCAweEEwLCBlYXgpOworICAgcGNpV3JpdGVMb25nKDB4MDAwMDAwMDAsIDB4NTAsIHRlbXBsKTsKKyAgIHRlbXBsID0gcGNpUmVhZExvbmcoMHgwMDAwMDAwMCwgMHhBMCk7CiAjZW5kaWYKIAotICB9IGVsc2UgeworICAgLyogR1VJIGdyYW50IHRpbWVyIChQQ0kgY29uZmlnIDB4QTMpICovCisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApIHsKIAotICAgICBkYXRhMiA9IEZRQlFEYXRhW2ldOwotICAgICBkYXRhMiA9IChkYXRhMiAmIDB4ZjApID4+IDQ7Ci0gICAgIGRhdGEyIDw8PSAyNDsKKyAgICAgIHRlbXBsICY9IDB4MDBmZmZmZmY7CisgICAgICBkYXRhbCA9IHF1ZXVlZGF0YVtpXSA8PCA4OworICAgICAgdGVtcGwgfD0gKCgoZGF0YWwgJiAweDBmMDApIHwgKChkYXRhbCAmIDB4MzAwMCkgPj4gOCkpIDw8IDIwKTsKIAotI2lmZGVmIExJTlVYX0tFUk5FTAotICAgICBTaVNfU2V0UmVnTG9uZygweGNmOCwweDgwMDAwMDUwKTsKLSAgICAgZWF4ID0gU2lTX0dldFJlZ0xvbmcoMHhjZmMpOwotICAgICBlYXggJj0gMHhmMGZmZmZmZjsKLSAgICAgZWF4IHw9IGRhdGEyOwotICAgICBTaVNfU2V0UmVnTG9uZygweGNmYyxlYXgpOworICAgfSBlbHNlIHsKKworICAgICAgdGVtcGwgJj0gMHhmMGZmZmZmZjsKKyAgICAgIHRlbXBsIHw9ICgocXVldWVkYXRhW2ldICYgMHgwZikgPDwgMjQpOworCisgICB9CisKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICBzaXNmYl93cml0ZV9uYnJpZGdlX3BjaV9kd29yZChTaVNfUHIsIDB4QTAsIHRlbXBsKTsKICNlbHNlCi0gICAgIGVheCA9IHBjaVJlYWRMb25nKDB4MDAwMDAwMDAsIDB4NTApOwotICAgICBlYXggJj0gMHhmMGZmZmZmZjsKLSAgICAgZWF4IHw9IGRhdGEyOwotICAgICBwY2lXcml0ZUxvbmcoMHgwMDAwMDAwMCwgMHg1MCwgZWF4KTsKKyAgIHBjaVdyaXRlTG9uZygweDAwMDAwMDAwLCAweEEwLCB0ZW1wbCk7CiAjZW5kaWYKLQotICAgICAvKiBXcml0ZSBHVUkgZ3JhbnQgdGltZXIgKFBDSSBjb25maWcgMHhBMykgKi8KLSAgICAgZGF0YTIgPSBGUUJRRGF0YVtpXTsKLSAgICAgZGF0YTIgJj0gMHgwZjsKLSAgICAgZGF0YTIgPDw9IDI0OwotCi0jaWZkZWYgTElOVVhfS0VSTkVMCi0gICAgIFNpU19TZXRSZWdMb25nKDB4Y2Y4LDB4ODAwMDAwQTApOwotICAgICBlYXggPSBTaVNfR2V0UmVnTG9uZygweGNmYyk7Ci0gICAgIGVheCAmPSAweGYwZmZmZmZmOwotICAgICBlYXggfD0gZGF0YTI7Ci0gICAgIFNpU19TZXRSZWdMb25nKDB4Y2ZjLGVheCk7Ci0jZWxzZQotICAgICBlYXggPSBwY2lSZWFkTG9uZygweDAwMDAwMDAwLCAweEEwKTsKLSAgICAgZWF4ICY9IDB4ZjBmZmZmZmY7Ci0gICAgIGVheCB8PSBkYXRhMjsKLSAgICAgcGNpV3JpdGVMb25nKDB4MDAwMDAwMDAsIDB4QTAsIGVheCk7Ci0jZW5kaWYKLQotICB9Ci0KLSAgLyogV3JpdGUgQ1JUL0NQVSB0aHJlc2hvbGQgbG93LCBDUlQvRW5naW5lIHRocmVzaG9sZCBoaWdoICovCi0gIGRhdGEgPSAoKFRocmVzaG9sZExvdyAmIDB4MGYpIDw8IDQpIHwgMHgwZjsKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDgsZGF0YSk7Ci0KLSAgZGF0YSA9IChUaHJlc2hvbGRMb3cgJiAweDEwKSA8PCAxOwotICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDBGLDB4REYsZGF0YSk7Ci0KLSAgLyogV2hhdCBpcyB0aGlzPyAqLwotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzQiwweDA5KTsKLQotICAvKiBXcml0ZSBDUlQvQ1BVIHRocmVzaG9sZCBoaWdoIChnYXAgPSAzKSAqLwotICBkYXRhID0gVGhyZXNob2xkTG93ICsgMzsKLSAgaWYoZGF0YSA+IDB4MGYpIGRhdGEgPSAweDBmOwotICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDA5LDB4ODAsZGF0YSk7CiB9Ci0jZW5kaWYKKyNlbmRpZiAvKiBTSVMzMDAgKi8KIAogI2lmZGVmIFNJUzMxNUgKIHN0YXRpYyB2b2lkCi1TaVNfU2V0Q1JUMUZJRk9fMzEwKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRDUlQxRklGT18zMTAoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFVTSE9SVCBtb2RlZmxhZzsKKyAgIHVuc2lnbmVkIHNob3J0IG1vZGVmbGFnOwogCi0gIC8qIGRpc2FibGUgYXV0by10aHJlc2hvbGQgKi8KLSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4M0QsMHhGRSk7CisgICAvKiBkaXNhYmxlIGF1dG8tdGhyZXNob2xkICovCisgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgzRCwweEZFKTsKIAotICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPkNNb2RlRmxhZzsKLSAgfSBlbHNlIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKLSAgfQorICAgbW9kZWZsYWcgPSBTaVNfR2V0TW9kZUZsYWcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOCwweEFFKTsKLSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MDksMHhGMCk7Ci0gIGlmKE1vZGVObyA+IDB4MTMpIHsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgewotICAgICAgICBpZighKG1vZGVmbGFnICYgSGFsZkRDTEspKSB7Ci0JICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDgsMHgzNCk7Ci0JICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgzRCwweDAxKTsKLQl9Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKCghKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpKSB8fCAoIShtb2RlZmxhZyAmIEhhbGZEQ0xLKSkpIHsKLSAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDgsMHgzNCk7Ci0gICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2M0LDB4M0QsMHgwMSk7Ci0JfQotICAgICB9Ci0gIH0KKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA4LDB4QUUpOworICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MDksMHhGMCk7CisgICBpZihNb2RlTm8gPiAweDEzKSB7CisgICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFhHSV8yMCkgeworCSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOCwweDM0KTsKKwkgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgzRCwweDAxKTsKKyAgICAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsKKwkgaWYoIShtb2RlZmxhZyAmIEhhbGZEQ0xLKSkgeworCSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOCwweDM0KTsKKwkgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgzRCwweDAxKTsKKwkgfQorICAgICAgfSBlbHNlIHsKKwkgaWYoKCEobW9kZWZsYWcgJiBEb3VibGVTY2FuTW9kZSkpIHx8ICghKG1vZGVmbGFnICYgSGFsZkRDTEspKSkgeworCSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOCwweDM0KTsKKwkgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgzRCwweDAxKTsKKwkgfQorICAgICAgfQorICAgfQogfQogI2VuZGlmCiAKQEAgLTI4NTEsMzg1ICsyNTk3LDM3MCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXRWQ0xLU3RhdGUoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLSAgICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVObywgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLSAgICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVJZEluZGV4KQorU2lTX1NldFZDTEtTdGF0ZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVU0hPUlQgZGF0YT0wLCBWQ0xLPTAsIGluZGV4PTA7CisgICB1bnNpZ25lZCBzaG9ydCBkYXRhID0gMCwgVkNMSyA9IDAsIGluZGV4ID0gMDsKIAotICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gICAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewotICAgICAgICBWQ0xLID0gU2lTX1ByLT5DU1JDbG9jazsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZXggPSBTaVNfR2V0VkNMSzJQdHIoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LEh3SW5mbyk7Ci0gICAgICAgIFZDTEsgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtpbmRleF0uQ0xPQ0s7Ci0gICAgIH0KLSAgfQorICAgaWYoTW9kZU5vID4gMHgxMykgeworICAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisgICAgICAgICBWQ0xLID0gU2lTX1ByLT5DU1JDbG9jazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBpbmRleCA9IFNpU19HZXRWQ0xLMlB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisgICAgICAgICBWQ0xLID0gU2lTX1ByLT5TaVNfVkNMS0RhdGFbaW5kZXhdLkNMT0NLOworICAgICAgfQorICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworI2lmZGVmIFNJUzMwMAorICAgICAgaWYoVkNMSyA+IDE1MCkgZGF0YSB8PSAweDgwOworICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwNywweDdCLGRhdGEpOwogCi0gICAgIGlmKFZDTEsgPiAxNTApIGRhdGEgfD0gMHg4MDsKLSAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwNywweDdCLGRhdGEpOworICAgICAgZGF0YSA9IDB4MDA7CisgICAgICBpZihWQ0xLID49IDE1MCkgZGF0YSB8PSAweDA4OworICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgzMiwweEY3LGRhdGEpOworI2VuZGlmCisgICB9IGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFhHSV8yMCkgeworI2lmZGVmIFNJUzMxNUgKKyAgICAgIGlmKFZDTEsgPj0gMTY2KSBkYXRhIHw9IDB4MGM7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4ZjMsZGF0YSk7CiAKLSAgICAgZGF0YSA9IDB4MDA7Ci0gICAgIGlmKFZDTEsgPj0gMTUwKSBkYXRhIHw9IDB4MDg7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MzIsMHhGNyxkYXRhKTsKKyAgICAgIGlmKFZDTEsgPj0gMTY2KSB7CisgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgxZiwweGU3KTsKKyAgICAgIH0KKyNlbmRpZgorICAgfSBlbHNlIHsKKyNpZmRlZiBTSVMzMTVICisgICAgICBpZihWQ0xLID49IDIwMCkgZGF0YSB8PSAweDBjOworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBYR0lfMjApIGRhdGEgJj0gfjB4MDQ7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4ZjMsZGF0YSk7CisgICAgICBpZihTaVNfUHItPkNoaXBUeXBlICE9IFhHSV8yMCkgeworICAgICAgICAgZGF0YSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDFmKSAmIDB4ZTc7CisJIGlmKFZDTEsgPCAyMDApIGRhdGEgfD0gMHgxMDsKKwkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MWYsZGF0YSk7CisgICAgICB9CisjZW5kaWYKKyAgIH0KIAotICB9IGVsc2UgeworICAgLyogREFDIHNwZWVkICovCisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsKIAotICAgICBpZihWQ0xLID49IDE2NikgZGF0YSB8PSAweDBjOwotICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4ZjMsZGF0YSk7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDA3LDB4RTgsMHgxMCk7CiAKLSAgICAgaWYoVkNMSyA+PSAxNjYpIHsKLSAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MWYsMHhlNyk7Ci0gICAgIH0KLSAgfQorICAgfSBlbHNlIHsKIAotICAvKiBEQUMgc3BlZWQgKi8KLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgeworICAgICAgZGF0YSA9IDB4MDM7CisgICAgICBpZihWQ0xLID49IDI2MCkgICAgICBkYXRhID0gMHgwMDsKKyAgICAgIGVsc2UgaWYoVkNMSyA+PSAxNjApIGRhdGEgPSAweDAxOworICAgICAgZWxzZSBpZihWQ0xLID49IDEzNSkgZGF0YSA9IDB4MDI7CiAKLSAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwNywweEU4LDB4MTApOworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNTQwKSB7CisgICAgICAgICBpZigoVkNMSyA9PSAyMDMpIHx8IChWQ0xLIDwgMjM0KSkgZGF0YSA9IDB4MDI7CisgICAgICB9CiAKLSAgfSBlbHNlIHsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworICAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwNywweEZDLGRhdGEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPiBTSVNfMzE1UFJPKSB7CisgICAgICAgICAgICBpZihNb2RlTm8gPiAweDEzKSBkYXRhICY9IDB4ZmM7CisgICAgICAgICB9CisgICAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDA3LDB4RjgsZGF0YSk7CisgICAgICB9CiAKLSAgICAgZGF0YSA9IDB4MDM7Ci0gICAgIGlmKChWQ0xLID49IDEzNSkgJiYgKFZDTEsgPCAxNjApKSAgICAgIGRhdGEgPSAweDAyOwotICAgICBlbHNlIGlmKChWQ0xLID49IDE2MCkgJiYgKFZDTEsgPCAyNjApKSBkYXRhID0gMHgwMTsKLSAgICAgZWxzZSBpZihWQ0xLID49IDI2MCkgICAgICAgICAgICAgICAgICAgZGF0YSA9IDB4MDA7Ci0KLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzU0MCkgewotICAgICAgICBpZigoVkNMSyA9PSAyMDMpIHx8IChWQ0xLIDwgMjM0KSkgICBkYXRhID0gMHgwMjsKLSAgICAgfQotCi0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwNywweEZDLGRhdGEpOwotICAgICB9IGVsc2UgewotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+IFNJU18zMTVQUk8pIHsKLSAgICAgICAgICAgaWYoTW9kZU5vID4gMHgxMykgZGF0YSAmPSAweGZjOwotICAgICAgICB9Ci0gICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MDcsMHhGOCxkYXRhKTsKLSAgICAgfQotCi0gIH0KKyAgIH0KIH0KIAogc3RhdGljIHZvaWQKLVNpU19TZXRDUlQxTW9kZVJlZ3MoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLSAgICAgICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCkKK1NpU19TZXRDUlQxTW9kZVJlZ3Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJSVEkpCiB7Ci0gIFVTSE9SVCBkYXRhLGluZm9mbGFnPTAsbW9kZWZsYWc7Ci0gIFVTSE9SVCByZXNpbmRleCx4cmVzOworICAgdW5zaWduZWQgc2hvcnQgZGF0YSwgaW5mb2ZsYWcgPSAwLCBtb2RlZmxhZywgcmVzaW5kZXg7CiAjaWZkZWYgU0lTMzE1SAotICBVU0hPUlQgZGF0YTIsZGF0YTM7Ci0gIFVMT05HICBsb25nZGF0YTsKLSAgVUNIQVIgICpST01BZGRyICA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyICA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgICB1bnNpZ25lZCBzaG9ydCBkYXRhMiwgZGF0YTM7CiAjZW5kaWYKIAotICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPkNNb2RlRmxhZzsKLSAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPkNJbmZvRmxhZzsKLSAgICAgeHJlcyA9IFNpU19Qci0+Q0hEaXNwbGF5OwotICB9IGVsc2UgewotICAgICByZXNpbmRleCA9IFNpU19HZXRSZXNJbmZvKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgpOwotICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gICAgCW1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICAgCWluZm9mbGFnID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfSW5mb0ZsYWc7Ci0JeHJlcyA9IFNpU19Qci0+U2lTX01vZGVSZXNJbmZvW3Jlc2luZGV4XS5IVG90YWw7Ci0gICAgIH0gZWxzZSB7Ci0gICAgCW1vZGVmbGFnID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9Nb2RlRmxhZzsKLQl4cmVzID0gU2lTX1ByLT5TaVNfU3RSZXNJbmZvW3Jlc2luZGV4XS5IVG90YWw7Ci0gICAgIH0KLSAgfQorICAgbW9kZWZsYWcgPSBTaVNfR2V0TW9kZUZsYWcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAotICAvKiBEaXNhYmxlIERQTVMgKi8KLSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MUYsMHgzRik7CisgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKKyAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5DSW5mb0ZsYWc7CisgICB9IGVsc2UgeworICAgICAgcmVzaW5kZXggPSBTaVNfR2V0UmVzSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOworICAgICAgaWYoTW9kZU5vID4gMHgxMykgeworCSBpbmZvZmxhZyA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9JbmZvRmxhZzsKKyAgICAgIH0KKyAgIH0KIAotICBkYXRhID0gMDsKLSAgaWYoTW9kZU5vID4gMHgxMykgewotICAgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVFR0EpIHsKLSAgICAgICAgZGF0YSB8PSAweDAyOwotICAgICAgICBkYXRhIHw9ICgoU2lTX1ByLT5TaVNfTW9kZVR5cGUgLSBNb2RlVkdBKSA8PCAyKTsKLSAgICAgfQotICAgICBpZihpbmZvZmxhZyAmIEludGVybGFjZU1vZGUpIGRhdGEgfD0gMHgyMDsKLSAgfQotICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDA2LDB4QzAsZGF0YSk7CisgICAvKiBEaXNhYmxlIERQTVMgKi8KKyAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDFGLDB4M0YpOwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlICE9IFNJU18zMDApIHsKLSAgICAgZGF0YSA9IDA7Ci0gICAgIGlmKGluZm9mbGFnICYgSW50ZXJsYWNlTW9kZSkgewotICAgICAgICBpZih4cmVzIDw9IDgwMCkgICAgICAgZGF0YSA9IDB4MDAyMDsKLSAgICAgICAgZWxzZSBpZih4cmVzIDw9IDEwMjQpIGRhdGEgPSAweDAwMzU7Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICBkYXRhID0gMHgwMDQ4OwotICAgICB9Ci0gICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDE5LChkYXRhICYgMHhGRikpOwotICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNkNCwweDFhLDB4RkMsKGRhdGEgPj4gOCkpOwotICB9CisgICBkYXRhID0gMDsKKyAgIGlmKE1vZGVObyA+IDB4MTMpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlID4gTW9kZUVHQSkgeworICAgICAgICAgZGF0YSB8PSAweDAyOworICAgICAgICAgZGF0YSB8PSAoKFNpU19Qci0+U2lTX01vZGVUeXBlIC0gTW9kZVZHQSkgPDwgMik7CisgICAgICB9CisgICAgICBpZihpbmZvZmxhZyAmIEludGVybGFjZU1vZGUpIGRhdGEgfD0gMHgyMDsKKyAgIH0KKyAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MDYsMHhDMCxkYXRhKTsKIAotICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB7Ci0gICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2M0LDB4MDEsMHgwOCk7Ci0gIH0KKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgIT0gU0lTXzMwMCkgeworICAgICAgZGF0YSA9IDA7CisgICAgICBpZihpbmZvZmxhZyAmIEludGVybGFjZU1vZGUpIHsKKwkgLyogZGF0YSA9IChIc3luYyAvIDgpIC0gKChIdG90YWwgLyA4KSAvIDIpICsgMyAqLworCSBpbnQgaHJzID0gKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDA0KSB8CisJCSAgICAoKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDBiKSAmIDB4YzApIDw8IDIpKSAtIDM7CisJIGludCBodG8gPSAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MDApIHwKKwkJICAgICgoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MGIpICYgMHgwMykgPDwgOCkpICsgNTsKKwkgZGF0YSA9IGhycyAtIChodG8gPj4gMSkgKyAzOworICAgICAgfQorICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MTksZGF0YSk7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNkNCwweDFhLDB4RkMsKChkYXRhID4+IDgpICYgMHgwMykpOworICAgfQogCi0gIGRhdGEgPSAwOwotICBpZihtb2RlZmxhZyAmIExpbmVDb21wYXJlT2ZmKSBkYXRhID0gMHgwODsKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMwMCkgewotICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDBGLDB4RjcsZGF0YSk7Ci0gIH0gZWxzZSB7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MEYsMHhCNyxkYXRhKTsKLSAgICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPT0gTW9kZUVHQSkgewotICAgICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDBGLDB4NDApOwotICAgICAgICB9Ci0gICAgIH0KLSAgfQorICAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgeworICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgwMSwweDA4KTsKKyAgIH0KIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB7Ci0gICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDMxLDB4ZmIpOwotICB9CisgICBkYXRhID0gMDsKKyAgIGlmKG1vZGVmbGFnICYgTGluZUNvbXBhcmVPZmYpIGRhdGEgPSAweDA4OworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfMzAwKSB7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDBGLDB4RjcsZGF0YSk7CisgICB9IGVsc2UgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBYR0lfMjApIGRhdGEgfD0gMHgyMDsKKyAgICAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlID09IE1vZGVFR0EpIHsKKwkgaWYoTW9kZU5vID4gMHgxMykgeworCSAgICBkYXRhIHw9IDB4NDA7CisJIH0KKyAgICAgIH0KKyAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MEYsMHhCNyxkYXRhKTsKKyAgIH0KIAogI2lmZGVmIFNJUzMxNUgKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMxNVBSTykgeworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MzEsMHhmYik7CisgICB9CiAKLSAgICAgZGF0YSA9IFNpU19HZXQzMTBEUkFNVHlwZShTaVNfUHIsIEh3SW5mbyk7Ci0gICAgIGRhdGEgPSBTaVNfUHItPlNpU19TUjE1WzJdW2RhdGFdOwotICAgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA9PSBNb2RlVGV4dCkgewotICAgICAgICBkYXRhICY9IDB4Yzc7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIGRhdGEyID0gU2lTX0dldE9mZnNldChTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LEh3SW5mbyk7Ci0JZGF0YTIgPj49IDE7Ci0JaWYoaW5mb2ZsYWcgJiBJbnRlcmxhY2VNb2RlKSBkYXRhMiA+Pj0gMTsKLQlkYXRhMyA9IFNpU19HZXRDb2xvckRlcHRoKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgpID4+IDE7Ci0JaWYoIWRhdGEzKSBkYXRhMysrOwotCWRhdGEyIC89IGRhdGEzOwotCWlmKGRhdGEyID49IDB4NTApIHsKLQkgICBkYXRhICY9IDB4MGY7Ci0JICAgZGF0YSB8PSAweDUwOwotCX0KLSAgICAgfQotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNyxkYXRhKTsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMxNVBSTykgewogCi0gIH0gZWxzZSBpZiggKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMzApIHx8Ci0gICAgICAgICAgICAgKChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzYwKSAmJiAoU2lTX1ByLT5TaVNfU3lzRmxhZ3MgJiBTRl83NjBMRkIpKSkgeworICAgICAgZGF0YSA9IFNpU19Qci0+U2lTX1NSMTVbKDIgKiA0KSArIFNpU19HZXQzMTBEUkFNVHlwZShTaVNfUHIpXTsKKyAgICAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlID09IE1vZGVUZXh0KSB7CisJIGRhdGEgJj0gMHhjNzsKKyAgICAgIH0gZWxzZSB7CisJIGRhdGEyID0gU2lTX0dldE9mZnNldChTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJSVEkpID4+IDE7CisJIGlmKGluZm9mbGFnICYgSW50ZXJsYWNlTW9kZSkgZGF0YTIgPj49IDE7CisJIGRhdGEzID0gU2lTX0dldENvbG9yRGVwdGgoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KSA+PiAxOworCSBpZihkYXRhMykgZGF0YTIgLz0gZGF0YTM7CisJIGlmKGRhdGEyID49IDB4NTApIHsKKwkgICAgZGF0YSAmPSAweDBmOworCSAgICBkYXRhIHw9IDB4NTA7CisJIH0KKyAgICAgIH0KKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE3LGRhdGEpOwogCi0gICAgIGRhdGEgPSBTaVNfR2V0MzEwRFJBTVR5cGUoU2lTX1ByLCBId0luZm8pOwotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfMzMwKSB7Ci0gICAgICAgIGRhdGEgPSBTaVNfUHItPlNpU19TUjE1WzJdW2RhdGFdOwotICAgICB9IGVsc2UgewotICAgICAgICBpZihTaVNfUHItPlNpU19ST01OZXcpIAkgICAgZGF0YSA9IFJPTUFkZHJbMHhmNl07Ci0gICAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSBkYXRhID0gUk9NQWRkclsweDEwMCArIGRhdGFdOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gMHhiYTsKLSAgICAgfQotICAgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA8PSBNb2RlRUdBKSB7Ci0gICAgICAgIGRhdGEgJj0gMHhjNzsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0JICAgZGF0YTIgPSBTaVNfUHItPkNTUkNsb2NrOwotCX0gZWxzZSB7Ci0gICAgICAgICAgIGRhdGEyID0gU2lTX0dldFZDTEsyUHRyKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCxId0luZm8pOwotICAgICAgICAgICBkYXRhMiA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2RhdGEyXS5DTE9DSzsKLQl9CisgICB9IGVsc2UgaWYoKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMzMCkgfHwgKFNpU19Qci0+U2lTX1N5c0ZsYWdzICYgU0ZfNzYwTEZCKSkgewogCi0JZGF0YTMgPSBTaVNfR2V0Q29sb3JEZXB0aChTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4KSA+PiAxOwotCWlmKGRhdGEzKSBkYXRhMiAqPSBkYXRhMzsKKyAgICAgIGRhdGEgPSBTaVNfR2V0MzEwRFJBTVR5cGUoU2lTX1ByKTsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMzMCkgeworCSBkYXRhID0gU2lTX1ByLT5TaVNfU1IxNVsoMiAqIDQpICsgZGF0YV07CisgICAgICB9IGVsc2UgeworCSBpZihTaVNfUHItPlNpU19ST01OZXcpCSAgICAgZGF0YSA9IFJPTUFkZHJbMHhmNl07CisJIGVsc2UgaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSBkYXRhID0gUk9NQWRkclsweDEwMCArIGRhdGFdOworCSBlbHNlCQkJICAgICBkYXRhID0gMHhiYTsKKyAgICAgIH0KKyAgICAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlIDw9IE1vZGVFR0EpIHsKKwkgZGF0YSAmPSAweGM3OworICAgICAgfSBlbHNlIHsKKwkgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisJICAgIGRhdGEyID0gU2lTX1ByLT5DU1JDbG9jazsKKwkgfSBlbHNlIHsKKwkgICAgZGF0YTIgPSBTaVNfR2V0VkNMSzJQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSUlRJKTsKKwkgICAgZGF0YTIgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtkYXRhMl0uQ0xPQ0s7CisJIH0KIAotCWxvbmdkYXRhID0gU2lTX0dldE1DTEsoU2lTX1ByLCBId0luZm8pICogMTAyNDsKKwkgZGF0YTMgPSBTaVNfR2V0Q29sb3JEZXB0aChTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpID4+IDE7CisJIGlmKGRhdGEzKSBkYXRhMiAqPSBkYXRhMzsKIAotCWRhdGEyID0gbG9uZ2RhdGEgLyBkYXRhMjsKKwkgZGF0YTIgPSAoKHVuc2lnbmVkIGludCkoU2lTX0dldE1DTEsoU2lTX1ByKSAqIDEwMjQpKSAvIGRhdGEyOwogCi0JaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMzMCkgewotCSAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlICE9IE1vZGUxNkJwcCkgewotICAgICAgICAgICAgICBpZiAgICAgKGRhdGEyID49IDB4MTljKSBkYXRhID0gMHhiYTsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4MTQwKSBkYXRhID0gMHg3YTsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4MTAxKSBkYXRhID0gMHgzYTsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4ZjUpICBkYXRhID0gMHgzMjsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4ZTIpICBkYXRhID0gMHgyYTsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4YzQpICBkYXRhID0gMHgyMjsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4YWMpICBkYXRhID0gMHgxYTsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4OWUpICBkYXRhID0gMHgxMjsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4OGUpICBkYXRhID0gMHgwYTsKLQkgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICBkYXRhID0gMHgwMjsKLQkgICB9IGVsc2UgewotCSAgICAgIGlmKGRhdGEyID49IDB4MTI3KSAgICAgIGRhdGEgPSAweGJhOwotCSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAweDdhOwotCSAgIH0KLQl9IGVsc2UgeyAgLyogNzYwK0xGQiAqLwotCSAgIGlmICAgICAoZGF0YTIgPj0gMHgxOTApIGRhdGEgPSAweGJhOwotCSAgIGVsc2UgaWYoZGF0YTIgPj0gMHhmZikgIGRhdGEgPSAweDdhOwotCSAgIGVsc2UgaWYoZGF0YTIgPj0gMHhkMykgIGRhdGEgPSAweDNhOwotCSAgIGVsc2UgaWYoZGF0YTIgPj0gMHhhOSkgIGRhdGEgPSAweDFhOwotCSAgIGVsc2UgaWYoZGF0YTIgPj0gMHg5MykgIGRhdGEgPSAweDBhOwotCSAgIGVsc2UgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAweDAyOwotCX0KLSAgICAgfQotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNyxkYXRhKTsKLSAgfSBlbHNlIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zNDApIHsKLSAgICAgLyogVE9ETyAqLwotICB9CisJIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMzMCkgeworCSAgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSAhPSBNb2RlMTZCcHApIHsKKwkgICAgICAgaWYgICAgIChkYXRhMiA+PSAweDE5YykgZGF0YSA9IDB4YmE7CisJICAgICAgIGVsc2UgaWYoZGF0YTIgPj0gMHgxNDApIGRhdGEgPSAweDdhOworCSAgICAgICBlbHNlIGlmKGRhdGEyID49IDB4MTAxKSBkYXRhID0gMHgzYTsKKwkgICAgICAgZWxzZSBpZihkYXRhMiA+PSAweGY1KSAgZGF0YSA9IDB4MzI7CisJICAgICAgIGVsc2UgaWYoZGF0YTIgPj0gMHhlMikgIGRhdGEgPSAweDJhOworCSAgICAgICBlbHNlIGlmKGRhdGEyID49IDB4YzQpICBkYXRhID0gMHgyMjsKKwkgICAgICAgZWxzZSBpZihkYXRhMiA+PSAweGFjKSAgZGF0YSA9IDB4MWE7CisJICAgICAgIGVsc2UgaWYoZGF0YTIgPj0gMHg5ZSkgIGRhdGEgPSAweDEyOworCSAgICAgICBlbHNlIGlmKGRhdGEyID49IDB4OGUpICBkYXRhID0gMHgwYTsKKwkgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgZGF0YSA9IDB4MDI7CisJICAgIH0gZWxzZSB7CisJICAgICAgIGlmKGRhdGEyID49IDB4MTI3KSAgICAgIGRhdGEgPSAweGJhOworCSAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICBkYXRhID0gMHg3YTsKKwkgICAgfQorCSB9IGVsc2UgeyAgLyogNzZ4K0xGQiAqLworCSAgICBpZiAgICAgKGRhdGEyID49IDB4MTkwKSBkYXRhID0gMHhiYTsKKwkgICAgZWxzZSBpZihkYXRhMiA+PSAweGZmKSAgZGF0YSA9IDB4N2E7CisJICAgIGVsc2UgaWYoZGF0YTIgPj0gMHhkMykgIGRhdGEgPSAweDNhOworCSAgICBlbHNlIGlmKGRhdGEyID49IDB4YTkpICBkYXRhID0gMHgxYTsKKwkgICAgZWxzZSBpZihkYXRhMiA+PSAweDkzKSAgZGF0YSA9IDB4MGE7CisJICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAweDAyOworCSB9CisgICAgICB9CisgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNyxkYXRhKTsKKworICAgfQorICAgICAgLyogWEdJOiBOb3RoaW5nLiAqLworICAgICAgLyogVE9ETzogQ2hlY2sgU2lTMzQwICovCiAjZW5kaWYKIAotICBkYXRhID0gMHg2MDsKLSAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgIT0gTW9kZVRleHQpIHsKLSAgICAgZGF0YSBePSAweDYwOwotICAgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSAhPSBNb2RlRUdBKSB7Ci0gICAgICAgIGRhdGEgXj0gMHhBMDsKLSAgICAgfQotICB9Ci0gIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MjEsMHgxRixkYXRhKTsKKyAgIGRhdGEgPSAweDYwOworICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgIT0gTW9kZVRleHQpIHsKKyAgICAgIGRhdGEgXj0gMHg2MDsKKyAgICAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlICE9IE1vZGVFR0EpIHsKKyAgICAgICAgIGRhdGEgXj0gMHhBMDsKKyAgICAgIH0KKyAgIH0KKyAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MjEsMHgxRixkYXRhKTsKIAotICBTaVNfU2V0VkNMS1N0YXRlKFNpU19QciwgSHdJbmZvLCBNb2RlTm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgTW9kZUlkSW5kZXgpOworICAgU2lTX1NldFZDTEtTdGF0ZShTaVNfUHIsIE1vZGVObywgUlJUSSwgTW9kZUlkSW5kZXgpOwogCiAjaWZkZWYgU0lTMzE1SAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMSkgJiAweDQwKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDUyLDB4MmMpOwotICAgICB9IGVsc2UgewotICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg1MiwweDZjKTsKLSAgICAgfQotICB9CisgICBpZigoKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpICYmIChTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzY2MSkpIHx8CisgICAgICAgKFNpU19Qci0+Q2hpcFR5cGUgPT0gWEdJXzQwKSkgeworICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzEpICYgMHg0MCkgeworICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NTIsMHgyYyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NTIsMHg2Yyk7CisgICAgICB9CisgICB9IGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBYR0lfMjApIHsKKyAgICAgIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMxKSAmIDB4NDApIHsKKyAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDUyLDB4MzMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDUyLDB4NzMpOworICAgICAgfQorICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NTEsMHgwMik7CisgICB9CiAjZW5kaWYKIH0KIAorI2lmZGVmIFNJUzMxNUgKK3N0YXRpYyB2b2lkCitTaVNfU2V0dXBEdWFsQ2hpcChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKK3sKKyNpZiAwCisgICAvKiBUT0RPOiBGaW5kIG91dCBhYm91dCBJT0FkZHJlc3MyICovCisgICBTSVNJT0FERFJFU1MgUDJfM2MyID0gU2lTX1ByLT5JT0FkZHJlc3MyICsgMHgxMjsKKyAgIFNJU0lPQUREUkVTUyBQMl8zYzQgPSBTaVNfUHItPklPQWRkcmVzczIgKyAweDE0OworICAgU0lTSU9BRERSRVNTIFAyXzNjZSA9IFNpU19Qci0+SU9BZGRyZXNzMiArIDB4MWU7CisgICBpbnQgaTsKKworICAgaWYoKFNpU19Qci0+Q2hpcFJldmlzaW9uICE9IDApIHx8CisgICAgICAoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzYSkgJiAweDA0KSkpCisgICAgICByZXR1cm47CisKKyAgIGZvcihpID0gMDsgaSA8PSA0OyBpKyspIHsJCQkJCS8qIFNSMDAgLSBTUjA0ICovCisgICAgICBTaVNfU2V0UmVnKFAyXzNjNCxpLFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCxpKSk7CisgICB9CisgICBmb3IoaSA9IDA7IGkgPD0gODsgaSsrKSB7CQkJCQkvKiBHUjAwIC0gR1IwOCAqLworICAgICAgU2lTX1NldFJlZyhQMl8zY2UsaSxTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzY2UsaSkpOworICAgfQorICAgU2lTX1NldFJlZyhQMl8zYzQsMHgwNSwweDg2KTsKKyAgIFNpU19TZXRSZWcoUDJfM2M0LDB4MDYsU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDYpKTsJLyogU1IwNiAqLworICAgU2lTX1NldFJlZyhQMl8zYzQsMHgyMSxTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyMSkpOwkvKiBTUjIxICovCisgICBTaVNfU2V0UmVnQnl0ZShQMl8zYzIsU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjYykpOwkvKiBNSVNDICovCisgICBTaVNfU2V0UmVnKFAyXzNjNCwweDA1LDB4MDApOworI2VuZGlmCit9CisjZW5kaWYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICBMT0FEIERBQyAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgMAogc3RhdGljIHZvaWQKLVNpU19DbGVhckRBQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVTE9ORyBwb3J0KQorU2lTX1dyaXRlREFDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTSVNJT0FERFJFU1MgREFDRGF0YSwgdW5zaWduZWQgc2hvcnQgc2hpZnRmbGFnLAorICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRsLCB1bnNpZ25lZCBzaG9ydCBhaCwgdW5zaWduZWQgc2hvcnQgYWwsIHVuc2lnbmVkIHNob3J0IGRoKQogewotICAgaW50IGk7CisgICB1bnNpZ25lZCBzaG9ydCBkMSwgZDIsIGQzOwogCi0gICBPdXRQb3J0Qnl0ZShwb3J0LCAwKTsKLSAgIHBvcnQrKzsKLSAgIGZvciAoaT0wOyBpIDwgKDI1NiAqIDMpOyBpKyspIHsKLSAgICAgIE91dFBvcnRCeXRlKHBvcnQsIDApOworICAgc3dpdGNoKGRsKSB7CisgICBjYXNlICAwOiBkMSA9IGRoOyBkMiA9IGFoOyBkMyA9IGFsOyBicmVhazsKKyAgIGNhc2UgIDE6IGQxID0gYWg7IGQyID0gYWw7IGQzID0gZGg7IGJyZWFrOworICAgZGVmYXVsdDogZDEgPSBhbDsgZDIgPSBkaDsgZDMgPSBhaDsKICAgIH0KLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotU2lTX1dyaXRlREFDKFNpU19Qcml2YXRlICpTaVNfUHIsIFNJU0lPQUREUkVTUyBEQUNEYXRhLCBVU0hPUlQgc2hpZnRmbGFnLAotICAgICAgICAgICAgIFVTSE9SVCBkbCwgVVNIT1JUIGFoLCBVU0hPUlQgYWwsIFVTSE9SVCBkaCkKLXsKLSAgVVNIT1JUIHRlbXAsYmgsYmw7Ci0KLSAgYmggPSBhaDsKLSAgYmwgPSBhbDsKLSAgaWYoZGwgIT0gMCkgewotICAgICB0ZW1wID0gYmg7Ci0gICAgIGJoID0gZGg7Ci0gICAgIGRoID0gdGVtcDsKLSAgICAgaWYoZGwgPT0gMSkgewotICAgICAgICB0ZW1wID0gYmw7Ci0gICAgICAgIGJsID0gZGg7Ci0gICAgICAgIGRoID0gdGVtcDsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgdGVtcCA9IGJsOwotICAgICAgICBibCA9IGJoOwotICAgICAgICBiaCA9IHRlbXA7Ci0gICAgIH0KLSAgfQotICBpZihzaGlmdGZsYWcpIHsKLSAgICAgZGggPDw9IDI7Ci0gICAgIGJoIDw8PSAyOwotICAgICBibCA8PD0gMjsKLSAgfQotICBTaVNfU2V0UmVnQnl0ZShEQUNEYXRhLChVU0hPUlQpZGgpOwotICBTaVNfU2V0UmVnQnl0ZShEQUNEYXRhLChVU0hPUlQpYmgpOwotICBTaVNfU2V0UmVnQnl0ZShEQUNEYXRhLChVU0hPUlQpYmwpOworICAgU2lTX1NldFJlZ0J5dGUoREFDRGF0YSwgKGQxIDw8IHNoaWZ0ZmxhZykpOworICAgU2lTX1NldFJlZ0J5dGUoREFDRGF0YSwgKGQyIDw8IHNoaWZ0ZmxhZykpOworICAgU2lTX1NldFJlZ0J5dGUoREFDRGF0YSwgKGQzIDw8IHNoaWZ0ZmxhZykpOwogfQogCiB2b2lkCi1TaVNfTG9hZERBQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4KQorU2lTX0xvYWREQUMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gICBVU0hPUlQgZGF0YSxkYXRhMjsKLSAgIFVTSE9SVCB0aW1lLGksaixrLG0sbixvOwotICAgVVNIT1JUIHNpLGRpLGJ4LGRsLGFsLGFoLGRoOwotICAgVVNIT1JUIHNoaWZ0ZmxhZzsKKyAgIHVuc2lnbmVkIHNob3J0IGRhdGEsIGRhdGEyLCB0aW1lLCBpLCBqLCBrLCBtLCBuLCBvOworICAgdW5zaWduZWQgc2hvcnQgc2ksIGRpLCBieCwgc2Y7CiAgICBTSVNJT0FERFJFU1MgREFDQWRkciwgREFDRGF0YTsKLSAgIGNvbnN0IFVTSE9SVCAqdGFibGUgPSBOVUxMOworICAgY29uc3QgdW5zaWduZWQgY2hhciAqdGFibGUgPSBOVUxMOwogCi0gICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICAgZGF0YSA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gICB9IGVsc2UgewotICAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0JIGRhdGEgPSBTaVNfUHItPkNNb2RlRmxhZzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBkYXRhID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICAgICB9Ci0gICB9CisgICBkYXRhID0gU2lTX0dldE1vZGVGbGFnKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCkgJiBEQUNJbmZvRmxhZzsKIAotICAgZGF0YSAmPSBEQUNJbmZvRmxhZzsKLSAgIHRpbWUgPSA2NDsKLSAgIGlmKGRhdGEgPT0gMHgwMCkgdGFibGUgPSBTaVNfTURBX0RBQzsKLSAgIGlmKGRhdGEgPT0gMHgwOCkgdGFibGUgPSBTaVNfQ0dBX0RBQzsKLSAgIGlmKGRhdGEgPT0gMHgxMCkgdGFibGUgPSBTaVNfRUdBX0RBQzsKLSAgIGlmKGRhdGEgPT0gMHgxOCkgeworICAgaiA9IHRpbWUgPSA2NDsKKyAgIGlmKGRhdGEgPT0gMHgwMCkgICAgICB0YWJsZSA9IFNpU19NREFfREFDOworICAgZWxzZSBpZihkYXRhID09IDB4MDgpIHRhYmxlID0gU2lTX0NHQV9EQUM7CisgICBlbHNlIGlmKGRhdGEgPT0gMHgxMCkgdGFibGUgPSBTaVNfRUdBX0RBQzsKKyAgIGVsc2UgaWYoZGF0YSA9PSAweDE4KSB7CisgICAgICBqID0gMTY7CiAgICAgICB0aW1lID0gMjU2OwogICAgICAgdGFibGUgPSBTaVNfVkdBX0RBQzsKICAgIH0KLSAgIGlmKHRpbWUgPT0gMjU2KSBqID0gMTY7Ci0gICBlbHNlICAgICAgICAgICAgaiA9IHRpbWU7CiAKICAgIGlmKCAoIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpICYmICAgICAgICAvKiAzMDFCLURIIExDRCAqLwogICAgICAgICAgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSApICAgICAgICB8fAogICAgICAgIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSAgICAgICB8fCAgIC8qIExDREEgKi8KICAgICAgICAoIShTaVNfUHItPlNpU19TZXRGbGFnICYgUHJvZ3JhbW1pbmdDUlQyKSkgKSB7ICAvKiBQcm9ncmFtbWluZyBDUlQxICovCisgICAgICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2M2LDB4RkYpOwogICAgICAgREFDQWRkciA9IFNpU19Qci0+U2lTX1AzYzg7CiAgICAgICBEQUNEYXRhID0gU2lTX1ByLT5TaVNfUDNjOTsKLSAgICAgIHNoaWZ0ZmxhZyA9IDA7Ci0gICAgICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2M2LDB4RkYpOworICAgICAgc2YgPSAwOwogICAgfSBlbHNlIHsKLSAgICAgIHNoaWZ0ZmxhZyA9IDE7CiAgICAgICBEQUNBZGRyID0gU2lTX1ByLT5TaVNfUGFydDVQb3J0OwogICAgICAgREFDRGF0YSA9IFNpU19Qci0+U2lTX1BhcnQ1UG9ydCArIDE7CisgICAgICBzZiA9IDI7CiAgICB9CiAKICAgIFNpU19TZXRSZWdCeXRlKERBQ0FkZHIsMHgwMCk7CiAKLSAgIGZvcihpPTA7IGk8ajsgaSsrKSB7CisgICBmb3IoaSA9IDA7IGkgPCBqOyBpKyspIHsKICAgICAgIGRhdGEgPSB0YWJsZVtpXTsKLSAgICAgIGZvcihrPTA7IGs8MzsgaysrKSB7CisgICAgICBmb3IoayA9IDA7IGsgPCAzOyBrKyspIHsKIAlkYXRhMiA9IDA7Ci0JaWYoZGF0YSAmIDB4MDEpIGRhdGEyID0gMHgyQTsKKwlpZihkYXRhICYgMHgwMSkgZGF0YTIgKz0gMHgyQTsKIAlpZihkYXRhICYgMHgwMikgZGF0YTIgKz0gMHgxNTsKLQlpZihzaGlmdGZsYWcpIGRhdGEyIDw8PSAyOwotCVNpU19TZXRSZWdCeXRlKERBQ0RhdGEsIGRhdGEyKTsKKwlTaVNfU2V0UmVnQnl0ZShEQUNEYXRhLCAoZGF0YTIgPDwgc2YpKTsKIAlkYXRhID4+PSAyOwogICAgICAgfQogICAgfQogCiAgICBpZih0aW1lID09IDI1NikgewogICAgICAgZm9yKGkgPSAxNjsgaSA8IDMyOyBpKyspIHsKLSAgIAkgZGF0YSA9IHRhYmxlW2ldOwotCSBpZihzaGlmdGZsYWcpIGRhdGEgPDw9IDI7CisJIGRhdGEgPSB0YWJsZVtpXSA8PCBzZjsKIAkgZm9yKGsgPSAwOyBrIDwgMzsgaysrKSBTaVNfU2V0UmVnQnl0ZShEQUNEYXRhLCBkYXRhKTsKICAgICAgIH0KICAgICAgIHNpID0gMzI7CiAgICAgICBmb3IobSA9IDA7IG0gPCA5OyBtKyspIHsKLSAgICAgICAgIGRpID0gc2k7Ci0gICAgICAgICBieCA9IHNpICsgNDsKLSAgICAgICAgIGRsID0gMDsKLSAgICAgICAgIGZvcihuID0gMDsgbiA8IDM7IG4rKykgewotICAJICAgIGZvcihvID0gMDsgbyA8IDU7IG8rKykgewotCSAgICAgICBkaCA9IHRhYmxlW3NpXTsKLQkgICAgICAgYWggPSB0YWJsZVtkaV07Ci0JICAgICAgIGFsID0gdGFibGVbYnhdOworCSBkaSA9IHNpOworCSBieCA9IHNpICsgNDsKKwkgZm9yKG4gPSAwOyBuIDwgMzsgbisrKSB7CisJICAgIGZvcihvID0gMDsgbyA8IDU7IG8rKykgeworCSAgICAgICBTaVNfV3JpdGVEQUMoU2lTX1ByLCBEQUNEYXRhLCBzZiwgbiwgdGFibGVbZGldLCB0YWJsZVtieF0sIHRhYmxlW3NpXSk7CiAJICAgICAgIHNpKys7Ci0JICAgICAgIFNpU19Xcml0ZURBQyhTaVNfUHIsIERBQ0RhdGEsIHNoaWZ0ZmxhZywgZGwsIGFoLCBhbCwgZGgpOwogCSAgICB9CiAJICAgIHNpIC09IDI7CiAJICAgIGZvcihvID0gMDsgbyA8IDM7IG8rKykgewotCSAgICAgICBkaCA9IHRhYmxlW2J4XTsKLQkgICAgICAgYWggPSB0YWJsZVtkaV07Ci0JICAgICAgIGFsID0gdGFibGVbc2ldOworCSAgICAgICBTaVNfV3JpdGVEQUMoU2lTX1ByLCBEQUNEYXRhLCBzZiwgbiwgdGFibGVbZGldLCB0YWJsZVtzaV0sIHRhYmxlW2J4XSk7CiAJICAgICAgIHNpLS07Ci0JICAgICAgIFNpU19Xcml0ZURBQyhTaVNfUHIsIERBQ0RhdGEsIHNoaWZ0ZmxhZywgZGwsIGFoLCBhbCwgZGgpOwogCSAgICB9Ci0JICAgIGRsKys7CiAJIH0gICAgICAgICAgICAvKiBmb3IgbiA8IDMgKi8KIAkgc2kgKz0gNTsKICAgICAgIH0gICAgICAgICAgICAgICAvKiBmb3IgbSA8IDkgKi8KQEAgLTMyNDEsODkgKzI5NzIsMTE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDFHcm91cChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgpCitTaVNfU2V0Q1JUMUdyb3VwKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVU0hPUlQgIFN0YW5kVGFibGVJbmRleCxSZWZyZXNoUmF0ZVRhYmxlSW5kZXg7CisgICB1bnNpZ25lZCBzaG9ydCBTdGFuZFRhYmxlSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleDsKIAotICBTaVNfUHItPlNpU19DUlQxTW9kZSA9IE1vZGVObzsKLSAgU3RhbmRUYWJsZUluZGV4ID0gU2lTX0dldE1vZGVQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKLSAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExvd01vZGVUZXN0cykgewotICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0U2ltdVNjYW5Nb2RlIHwgU3dpdGNoQ1JUMikpIHsKLSAgICAgICAgU2lTX0Rpc2FibGVCcmlkZ2UoU2lTX1ByLCBId0luZm8pOwotICAgICB9Ci0gIH0KKyAgIFNpU19Qci0+U2lTX0NSVDFNb2RlID0gTW9kZU5vOwogCi0gIFNpU19SZXNldFNlZ21lbnRSZWdpc3RlcnMoU2lTX1ByLCBId0luZm8pOworICAgU3RhbmRUYWJsZUluZGV4ID0gU2lTX0dldE1vZGVQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAotICBTaVNfU2V0U2VxUmVncyhTaVNfUHIsIFN0YW5kVGFibGVJbmRleCwgSHdJbmZvKTsKLSAgU2lTX1NldE1pc2NSZWdzKFNpU19QciwgU3RhbmRUYWJsZUluZGV4LCBId0luZm8pOwotICBTaVNfU2V0Q1JUQ1JlZ3MoU2lTX1ByLCBId0luZm8sIFN0YW5kVGFibGVJbmRleCk7Ci0gIFNpU19TZXRBVFRSZWdzKFNpU19QciwgU3RhbmRUYWJsZUluZGV4LCBId0luZm8pOwotICBTaVNfU2V0R1JDUmVncyhTaVNfUHIsIFN0YW5kVGFibGVJbmRleCk7Ci0gIFNpU19DbGVhckV4dDFSZWdzKFNpU19QciwgSHdJbmZvLCBNb2RlTm8pOwotICBTaVNfUmVzZXRDUlQxVkNMSyhTaVNfUHIsIEh3SW5mbyk7CisgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTG93TW9kZVRlc3RzKSB7CisgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0U2ltdVNjYW5Nb2RlIHwgU3dpdGNoQ1JUMikpIHsKKyAgICAgICAgIFNpU19EaXNhYmxlQnJpZGdlKFNpU19Qcik7CisgICAgICB9CisgICB9CiAKLSAgU2lTX1ByLT5TaVNfU2VsZWN0Q1JUMlJhdGUgPSAwOwotICBTaVNfUHItPlNpU19TZXRGbGFnICY9ICh+UHJvZ3JhbW1pbmdDUlQyKTsKKyAgIFNpU19SZXNldFNlZ21lbnRSZWdpc3RlcnMoU2lTX1ByKTsKIAotI2lmZGVmIExJTlVYX1hGODYKLSAgeGY4NkRydk1zZ1ZlcmIoMCwgWF9QUk9CRUQsIDQsICIoaW5pdDogVkJUeXBlPTB4JTA0eCwgVkJJbmZvPTB4JTA0eClcbiIsCisgICBTaVNfU2V0U2VxUmVncyhTaVNfUHIsIFN0YW5kVGFibGVJbmRleCk7CisgICBTaVNfU2V0TWlzY1JlZ3MoU2lTX1ByLCBTdGFuZFRhYmxlSW5kZXgpOworICAgU2lTX1NldENSVENSZWdzKFNpU19QciwgU3RhbmRUYWJsZUluZGV4KTsKKyAgIFNpU19TZXRBVFRSZWdzKFNpU19QciwgU3RhbmRUYWJsZUluZGV4KTsKKyAgIFNpU19TZXRHUkNSZWdzKFNpU19QciwgU3RhbmRUYWJsZUluZGV4KTsKKyAgIFNpU19DbGVhckV4dDFSZWdzKFNpU19QciwgTW9kZU5vKTsKKyAgIFNpU19SZXNldENSVDFWQ0xLKFNpU19Qcik7CisKKyAgIFNpU19Qci0+U2lTX1NlbGVjdENSVDJSYXRlID0gMDsKKyAgIFNpU19Qci0+U2lTX1NldEZsYWcgJj0gKH5Qcm9ncmFtbWluZ0NSVDIpOworCisjaWZkZWYgU0lTX1hPUkdfWEY4NgorICAgeGY4NkRydk1zZ1ZlcmIoMCwgWF9QUk9CRUQsIDQsICIoaW5pdDogVkJUeXBlPTB4JTA0eCwgVkJJbmZvPTB4JTA0eClcbiIsCiAgICAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX1ZCVHlwZSwgU2lTX1ByLT5TaVNfVkJJbmZvKTsKICNlbmRpZgogCi0gIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldFNpbXVTY2FuTW9kZSkgewotICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewotICAgICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IFByb2dyYW1taW5nQ1JUMjsKLSAgICAgfQotICB9CisgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRTaW11U2Nhbk1vZGUpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7CisgICAgICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IFByb2dyYW1taW5nQ1JUMjsKKyAgICAgIH0KKyAgIH0KIAotICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7Ci0gICAgIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gUHJvZ3JhbW1pbmdDUlQyOwotICB9CisgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7CisgICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IFByb2dyYW1taW5nQ1JUMjsKKyAgIH0KIAotICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSBTaVNfR2V0UmF0ZVB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7CisgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSBTaVNfR2V0UmF0ZVB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogCi0gIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKLSAgICAgU2lTX1ByLT5TaVNfU2V0RmxhZyAmPSB+UHJvZ3JhbW1pbmdDUlQyOwotICB9CisgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7CisgICAgICBTaVNfUHItPlNpU19TZXRGbGFnICY9IH5Qcm9ncmFtbWluZ0NSVDI7CisgICB9CiAKLSAgaWYoUmVmcmVzaFJhdGVUYWJsZUluZGV4ICE9IDB4RkZGRikgewotICAgICBTaVNfU2V0Q1JUMVN5bmMoU2lTX1ByLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwotICAgICBTaVNfU2V0Q1JUMUNSVEMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIEh3SW5mbyk7Ci0gICAgIFNpU19TZXRDUlQxT2Zmc2V0KFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOwotICAgICBTaVNfU2V0Q1JUMVZDTEsoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7Ci0gIH0KKyAgIGlmKFJlZnJlc2hSYXRlVGFibGVJbmRleCAhPSAweEZGRkYpIHsKKyAgICAgIFNpU19TZXRDUlQxU3luYyhTaVNfUHIsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisgICAgICBTaVNfU2V0Q1JUMUNSVEMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworICAgICAgU2lTX1NldENSVDFPZmZzZXQoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworICAgICAgU2lTX1NldENSVDFWQ0xLKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKKyAgIH0KIAorICAgc3dpdGNoKFNpU19Qci0+Q2hpcFR5cGUpIHsKICNpZmRlZiBTSVMzMDAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMwMCkgewotICAgICBTaVNfU2V0Q1JUMUZJRk9fMzAwKFNpU19QciwgTW9kZU5vLEh3SW5mbyxSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwotICB9IGVsc2UgaWYoKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182MzApIHx8Ci0gICAgICAgICAgICAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgfHwKLSAgICAgICAgICAgIChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNTQwKSkgewotICAgICBTaVNfU2V0Q1JUMUZJRk9fNjMwKFNpU19QciwgTW9kZU5vLCBId0luZm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7Ci0gIH0KKyAgIGNhc2UgU0lTXzMwMDoKKyAgICAgIFNpU19TZXRDUlQxRklGT18zMDAoU2lTX1ByLCBNb2RlTm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgU0lTXzU0MDoKKyAgIGNhc2UgU0lTXzYzMDoKKyAgIGNhc2UgU0lTXzczMDoKKyAgICAgIFNpU19TZXRDUlQxRklGT182MzAoU2lTX1ByLCBNb2RlTm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisgICAgICBicmVhazsKICNlbmRpZgorICAgZGVmYXVsdDoKICNpZmRlZiBTSVMzMTVICi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIFNpU19TZXRDUlQxRklGT18zMTAoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8pOwotICB9CisgICAgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFhHSV8yMCkgeworICAgICAgICAgdW5zaWduZWQgY2hhciBzcjJiID0gMCwgc3IyYyA9IDA7CisgICAgICAgICBzd2l0Y2goTW9kZU5vKSB7CisJIGNhc2UgMHgwMDoKKwkgY2FzZSAweDAxOiBzcjJiID0gMHg0ZTsgc3IyYyA9IDB4ZTk7IGJyZWFrOworCSBjYXNlIDB4MDQ6CisJIGNhc2UgMHgwNToKKwkgY2FzZSAweDBkOiBzcjJiID0gMHgxYjsgc3IyYyA9IDB4ZTM7IGJyZWFrOworCSB9CisJIGlmKHNyMmIpIHsKKyAgICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJiLHNyMmIpOworCSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyYyxzcjJjKTsKKwkgICAgU2lTX1NldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjMiwoU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjYykgfCAweDBjKSk7CisJIH0KKyAgICAgIH0KKyAgICAgIFNpU19TZXRDUlQxRklGT18zMTAoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICB9CisKKyAgIFNpU19TZXRDUlQxTW9kZVJlZ3MoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCisjaWZkZWYgU0lTMzE1SAorICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBYR0lfNDApIHsKKyAgICAgIFNpU19TZXR1cER1YWxDaGlwKFNpU19Qcik7CisgICB9CiAjZW5kaWYKIAotICBTaVNfU2V0Q1JUMU1vZGVSZWdzKFNpU19QciwgSHdJbmZvLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworICAgU2lTX0xvYWREQUMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAotICBTaVNfTG9hZERBQyhTaVNfUHIsIEh3SW5mbywgTW9kZU5vLCBNb2RlSWRJbmRleCk7Ci0KLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgaWYoU2lTX1ByLT5TaVNfZmxhZ19jbGVhcmJ1ZmZlcikgewotICAgICBTaVNfQ2xlYXJCdWZmZXIoU2lTX1ByLEh3SW5mbyxNb2RlTm8pOwotICB9CisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorICAgaWYoU2lTX1ByLT5TaVNfZmxhZ19jbGVhcmJ1ZmZlcikgeworICAgICAgU2lTX0NsZWFyQnVmZmVyKFNpU19QciwgTW9kZU5vKTsKKyAgIH0KICNlbmRpZgogCi0gIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldFNpbXVTY2FuTW9kZSB8IFN3aXRjaENSVDIgfCBTZXRDUlQyVG9MQ0RBKSkpIHsKLSAgICAgU2lTX1dhaXRSZXRyYWNlMShTaVNfUHIpOwotICAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7Ci0gIH0KKyAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldFNpbXVTY2FuTW9kZSB8IFN3aXRjaENSVDIgfCBTZXRDUlQyVG9MQ0RBKSkpIHsKKyAgICAgIFNpU19XYWl0UmV0cmFjZTEoU2lTX1ByKTsKKyAgICAgIFNpU19EaXNwbGF5T24oU2lTX1ByKTsKKyAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMzMzEsMzMgKzMwODcsNjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfUmVzZXRWQihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0luaXRWQihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIFVDSEFSICAqUk9NQWRkciAgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gICBVU0hPUlQgdGVtcDsKKyAgIHVuc2lnbmVkIGNoYXIgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOwogCi0gICAvKiBWQiBwcm9ncmFtbWluZyBjbG9jayAqLwotICAgaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSB7Ci0gICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMzApIHsKLSAgICAgICAgIHRlbXAgPSBST01BZGRyW1ZCMzEwRGF0YV8xXzJfT2Zmc2V0XSB8IDB4NDA7Ci0JIGlmKFNpU19Qci0+U2lTX1JPTU5ldykgdGVtcCA9IFJPTUFkZHJbMHg4MF0gfCAweDQwOwotCSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAyLHRlbXApOwotICAgICAgfSBlbHNlIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHsKLSAgICAgICAgIHRlbXAgPSBST01BZGRyWzB4N2VdIHwgMHg0MDsKLSAgICAgICAgIGlmKFNpU19Qci0+U2lTX1JPTU5ldykgdGVtcCA9IFJPTUFkZHJbMHg4MF0gfCAweDQwOwotCSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAyLHRlbXApOworICAgU2lTX1ByLT5Jbml0X1A0XzBFID0gMDsKKyAgIGlmKFNpU19Qci0+U2lTX1JPTU5ldykgeworICAgICAgU2lTX1ByLT5Jbml0X1A0XzBFID0gUk9NQWRkclsweDgyXTsKKyAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFhHSV80MCkgeworICAgICAgaWYoU2lTX1ByLT5TaVNfWEdJUk9NKSB7CisgICAgICAgICBTaVNfUHItPkluaXRfUDRfMEUgPSBST01BZGRyWzB4ODBdOwogICAgICAgfQogICAgfQogfQogCitzdGF0aWMgdm9pZAorU2lTX1Jlc2V0VkIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCit7CisjaWZkZWYgU0lTMzE1SAorICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICAgdW5zaWduZWQgc2hvcnQgdGVtcDsKKworICAgLyogVkIgcHJvZ3JhbW1pbmcgY2xvY2sgKi8KKyAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMzApIHsKKwkgdGVtcCA9IFJPTUFkZHJbVkIzMTBEYXRhXzFfMl9PZmZzZXRdIHwgMHg0MDsKKwkgaWYoU2lTX1ByLT5TaVNfUk9NTmV3KSB0ZW1wID0gUk9NQWRkclsweDgwXSB8IDB4NDA7CisJIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDIsdGVtcCk7CisgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxICYmIFNpU19Qci0+Q2hpcFR5cGUgPCBYR0lfMjApIHsKKwkgdGVtcCA9IFJPTUFkZHJbMHg3ZV0gfCAweDQwOworCSBpZihTaVNfUHItPlNpU19ST01OZXcpIHRlbXAgPSBST01BZGRyWzB4ODBdIHwgMHg0MDsKKwkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMix0ZW1wKTsKKyAgICAgIH0KKyAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFhHSV80MCkgeworICAgICAgdGVtcCA9IDB4NDA7CisgICAgICBpZihTaVNfUHItPlNpU19YR0lST00pIHRlbXAgfD0gUk9NQWRkclsweDdlXTsKKyAgICAgIC8qIENhbiB3ZSBkbyB0aGlzIG9uIGFueSBjaGlwc2V0PyAqLworICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMix0ZW1wKTsKKyAgIH0KKyNlbmRpZgorfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICBIRUxQRVI6IFNFVCBWSURFTyBSRUdJU1RFUlMgICAgICAgKi8KKy8qICAgIEhFTFBFUjogU0VUIFZJREVPL0NBUFRVUkUgUkVHSVNURVJTICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1N0cmFuZ2VTdHVmZihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1N0cmFuZ2VTdHVmZihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIGlmKChJU19TSVM2NTEpIHx8IChJU19TSVNNNjUwKSkgeworICAgLyogU2lTNjV4IGFuZCBYR0kgc2V0IHVwIHNvbWUgc29ydCBvZiAibG9jayBtb2RlIiBmb3IgdGV4dAorICAgICogd2hpY2ggbG9ja3MgQ1JUMiBpbiBzb21lIHdheSB0byBDUlQxIHRpbWluZy4gRGlzYWJsZQorICAgICogdGhpcyBoZXJlLgorICAgICovCisjaWZkZWYgU0lTMzE1SAorICAgaWYoKElTX1NJUzY1MSkgfHwgKElTX1NJU002NTApIHx8CisgICAgICBTaVNfUHItPkNoaXBUeXBlID09IFNJU18zNDAgfHwKKyAgICAgIFNpU19Qci0+Q2hpcFR5cGUgPT0gWEdJXzQwKSB7CiAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1ZpZENhcHQsIDB4M2YsIDB4MDApOyAgIC8qIEZpZGRsZSB3aXRoIGNhcHR1cmUgcmVncyAqLwogICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19WaWRDYXB0LCAweDAwLCAweDAwKTsKICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfVmlkUGxheSwgMHgwMCwgMHg4Nik7ICAgLyogKEJJT1MgZG9lcyBOT1QgdW5sb2NrKSAqLwpAQCAtMzM2NSw0OSArMzE1MCw5OSBAQAogICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19WaWRQbGF5LCAweDNmLCAweGVmKTsKICAgIH0KICAgIC8qICEhISBUaGlzIGRvZXMgbm90IHN1cHBvcnQgbW9kZXMgPCAweDEzICEhISAqLworI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgIFhGcmVlODY6IFNFVCBTQ1JFRU4gUElUQ0ggICAgICAgICAqLworLyogICAgIEhFTFBFUjogU0VUIEFHUCBUSU1JTkcgRk9SIFNpUzc2MCAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9YRjg2CiBzdGF0aWMgdm9pZAotU2lTX1NldFBpdGNoQ1JUMShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTY3JuSW5mb1B0ciBwU2NybikKK1NpU19IYW5kbGU3NjAoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCit7CisjaWZkZWYgU0lTMzE1SAorICAgdW5zaWduZWQgaW50IHNvbWViYXNlOworICAgdW5zaWduZWQgY2hhciB0ZW1wMSwgdGVtcDIsIHRlbXAzOworCisgICBpZiggKFNpU19Qci0+Q2hpcFR5cGUgIT0gU0lTXzc2MCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAoKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwgMHg1YykgJiAweGY4KSAhPSAweDgwKSB8fAorICAgICAgICghKFNpU19Qci0+U2lTX1N5c0ZsYWdzICYgU0ZfNzYwTEZCKSkgICAgICAgICAgICAgICAgIHx8CisgICAgICAgKCEoU2lTX1ByLT5TaVNfU3lzRmxhZ3MgJiBTRl83NjBVTUEpKSApCisgICAgICByZXR1cm47CisKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICBzb21lYmFzZSA9IHNpc2ZiX3JlYWRfbWlvX3BjaV93b3JkKFNpU19QciwgMHg3NCk7CisjZWxzZQorICAgc29tZWJhc2UgPSBwY2lSZWFkV29yZCgweDAwMDAxMDAwLCAweDc0KTsKKyNlbmRpZgorICAgc29tZWJhc2UgJj0gMHhmZmZmOworCisgICBpZihzb21lYmFzZSA9PSAwKSByZXR1cm47CisKKyAgIHRlbXAzID0gU2lTX0dldFJlZ0J5dGUoKHNvbWViYXNlICsgMHg4NSkpICYgMHhiNzsKKworICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzEpICYgMHg0MCkgeworICAgICAgdGVtcDEgPSAweDIxOworICAgICAgdGVtcDIgPSAweDAzOworICAgICAgdGVtcDMgfD0gMHgwODsKKyAgIH0gZWxzZSB7CisgICAgICB0ZW1wMSA9IDB4MjU7CisgICAgICB0ZW1wMiA9IDB4MGI7CisgICB9CisKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICBzaXNmYl93cml0ZV9uYnJpZGdlX3BjaV9ieXRlKFNpU19QciwgMHg3ZSwgdGVtcDEpOworICAgc2lzZmJfd3JpdGVfbmJyaWRnZV9wY2lfYnl0ZShTaVNfUHIsIDB4OGQsIHRlbXAyKTsKKyNlbHNlCisgICBwY2lXcml0ZUJ5dGUoMHgwMDAwMDAwMCwgMHg3ZSwgdGVtcDEpOworICAgcGNpV3JpdGVCeXRlKDB4MDAwMDAwMDAsIDB4OGQsIHRlbXAyKTsKKyNlbmRpZgorCisgICBTaVNfU2V0UmVnQnl0ZSgoc29tZWJhc2UgKyAweDg1KSwgdGVtcDMpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIFgub3JnL1hGcmVlODY6IFNFVCBTQ1JFRU4gUElUQ0ggICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFNJU19YT1JHX1hGODYKK3N0YXRpYyB2b2lkCitTaVNfU2V0UGl0Y2hDUlQxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTY3JuSW5mb1B0ciBwU2NybikKIHsKICAgIFNJU1B0ciBwU2lTID0gU0lTUFRSKHBTY3JuKTsKLSAgIFVTaG9ydCBIRGlzcGxheSA9IHBTaVMtPnNjcm5QaXRjaCA+PiAzOworICAgdW5zaWduZWQgc2hvcnQgSERpc3BsYXkgPSBwU2lTLT5zY3JuUGl0Y2ggPj4gMzsKIAogICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MTMsKEhEaXNwbGF5ICYgMHhGRikpOwotICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwRSwweEYwLChIRGlzcGxheT4+OCkpOworICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwRSwweEYwLChIRGlzcGxheSA+PiA4KSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0UGl0Y2hDUlQyKFNpU19Qcml2YXRlICpTaVNfUHIsIFNjcm5JbmZvUHRyIHBTY3JuKQorU2lTX1NldFBpdGNoQ1JUMihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU2NybkluZm9QdHIgcFNjcm4pCiB7CiAgICBTSVNQdHIgcFNpUyA9IFNJU1BUUihwU2Nybik7Ci0gICBVU2hvcnQgSERpc3BsYXkgPSBwU2lTLT5zY3JuUGl0Y2gyID4+IDM7CisgICB1bnNpZ25lZCBzaG9ydCBIRGlzcGxheSA9IHBTaVMtPnNjcm5QaXRjaDIgPj4gMzsKIAogICAgIC8qIFVubG9jayBDUlQyICovCiAgICBpZihwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpCi0gICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRiwgMHgwMSk7CisgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MkYsIDB4MDEpOwogICAgZWxzZQotICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MjQsIDB4MDEpOworICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDI0LCAweDAxKTsKIAogICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwNywoSERpc3BsYXkgJiAweEZGKSk7CiAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDksMHhGMCwoSERpc3BsYXkgPj4gOCkpOwogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldFBpdGNoKFNpU19Qcml2YXRlICpTaVNfUHIsIFNjcm5JbmZvUHRyIHBTY3JuKQorU2lTX1NldFBpdGNoKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTY3JuSW5mb1B0ciBwU2NybikKIHsKICAgIFNJU1B0ciBwU2lTID0gU0lTUFRSKHBTY3JuKTsKICAgIEJPT0xFQU4gaXNzbGF2ZW1vZGUgPSBGQUxTRTsKIAotICAgaWYoIChwU2lTLT5WQkZsYWdzICYgVkJfVklERU9CUklER0UpICYmCisgICBpZiggKHBTaVMtPlZCRmxhZ3MyICYgVkIyX1ZJREVPQlJJREdFKSAmJgogICAgICAgICggKChwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpICYmCi0gICAgICAgICAgKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDApICYgMHhhMCkgPT0gMHgyMCkgfHwKLSAgICAgICAgICgocFNpUy0+VkdBRW5naW5lID09IFNJU18zMTVfVkdBKSAmJgorCSAgKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDApICYgMHhhMCkgPT0gMHgyMCkgfHwKKwkgKChwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpICYmCiAJICAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCkgJiAweDUwKSA9PSAweDEwKSApICkgewogICAgICAgaXNzbGF2ZW1vZGUgPSBUUlVFOwogICAgfQpAQCAtMzQyNyw1OSArMzI2Miw1OSBAQAogLyogICAgICAgICAgICAgICAgIFNpU1NldE1vZGUoKSAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9YRjg2CisjaWZkZWYgU0lTX1hPUkdfWEY4NgogLyogV2UgbmVlZCBwU2NybiBmb3Igc2V0dGluZyB0aGUgcGl0Y2ggY29ycmVjdGx5ICovCiBCT09MRUFOCi1TaVNTZXRNb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sU2NybkluZm9QdHIgcFNjcm4sVVNIT1JUIE1vZGVObywgQk9PTEVBTiBkb3NldHBpdGNoKQorU2lTU2V0TW9kZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU2NybkluZm9QdHIgcFNjcm4sIHVuc2lnbmVkIHNob3J0IE1vZGVObywgQk9PTEVBTiBkb3NldHBpdGNoKQogI2Vsc2UKIEJPT0xFQU4KLVNpU1NldE1vZGUoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyxVU0hPUlQgTW9kZU5vKQorU2lTU2V0TW9kZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogI2VuZGlmCiB7Ci0gICBVU0hPUlQgIE1vZGVJZEluZGV4OwotICAgU0lTSU9BRERSRVNTIEJhc2VBZGRyID0gSHdJbmZvLT51bElPQWRkcmVzczsKLSAgIHVuc2lnbmVkIGNoYXIgYmFja3VwcmVnPTA7Ci0jaWZkZWYgTElOVVhfS0VSTkVMCi0gICBVU0hPUlQgIEtlZXBMb2NrUmVnOwotICAgVUxPTkcgICB0ZW1wOworICAgU0lTSU9BRERSRVNTIEJhc2VBZGRyID0gU2lTX1ByLT5JT0FkZHJlc3M7CisgICB1bnNpZ25lZCBzaG9ydCBSZWFsTW9kZU5vLCBNb2RlSWRJbmRleDsKKyAgIHVuc2lnbmVkIGNoYXIgIGJhY2t1cHJlZyA9IDA7CisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorICAgdW5zaWduZWQgc2hvcnQgS2VlcExvY2tSZWc7CiAKICAgIFNpU19Qci0+VXNlQ3VzdG9tTW9kZSA9IEZBTFNFOwogICAgU2lTX1ByLT5DUlQxVXNlc0N1c3RvbU1vZGUgPSBGQUxTRTsKICNlbmRpZgogCi0gICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgIE1vZGVObyA9IDB4ZmU7Ci0gICB9Ci0KLSAgIFNpU0luaXRQdHIoU2lTX1ByLCBId0luZm8pOwotICAgU2lTUmVnSW5pdChTaVNfUHIsIEJhc2VBZGRyKTsKLSAgIFNpU19HZXRTeXNGbGFncyhTaVNfUHIsIEh3SW5mbyk7Ci0KLSNpZiBkZWZpbmVkKExJTlVYX1hGODYpICYmIChkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fQU1ENjRfXykpCi0gICBpZihwU2NybikgU2lTX1ByLT5TaVNfVkdBSU5GTyA9IFNpU19HZXRTZXRCSU9TU2NyYXRjaChwU2NybiwgMHg0ODksIDB4ZmYpOwotICAgZWxzZQotI2VuZGlmCi0gICAgICAgICBTaVNfUHItPlNpU19WR0FJTkZPID0gMHgxMTsKLQotICAgU2lTSW5pdFBDSWV0YyhTaVNfUHIsIEh3SW5mbyk7Ci0gICBTaVNTZXRMVkRTZXRjKFNpU19QciwgSHdJbmZvKTsKLSAgIFNpU0RldGVybWluZVJPTVVzYWdlKFNpU19QciwgSHdJbmZvKTsKLQogICAgU2lTX1ByLT5TaVNfZmxhZ19jbGVhcmJ1ZmZlciA9IDA7CiAKLSAgIGlmKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSNpZmRlZiBMSU5VWF9LRVJORUwKKyAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgeworICAgICAgTW9kZU5vID0gMHhmZTsKKyAgIH0gZWxzZSB7CisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAogICAgICAgaWYoIShNb2RlTm8gJiAweDgwKSkgU2lTX1ByLT5TaVNfZmxhZ19jbGVhcmJ1ZmZlciA9IDE7CiAjZW5kaWYKICAgICAgIE1vZGVObyAmPSAweDdmOwogICAgfQogCi0jaWZkZWYgTElOVVhfS0VSTkVMCisgICAvKiBEb24ndCB1c2UgRlNUTiBtb2RlIGZvciBDUlQxICovCisgICBSZWFsTW9kZU5vID0gTW9kZU5vOworICAgaWYoTW9kZU5vID09IDB4NWIpIE1vZGVObyA9IDB4NTY7CisKKyAgIFNpU0luaXRQdHIoU2lTX1ByKTsKKyAgIFNpU1JlZ0luaXQoU2lTX1ByLCBCYXNlQWRkcik7CisgICBTaVNfR2V0U3lzRmxhZ3MoU2lTX1ByKTsKKworICAgU2lTX1ByLT5TaVNfVkdBSU5GTyA9IDB4MTE7CisjaWYgZGVmaW5lZChTSVNfWE9SR19YRjg2KSAmJiAoZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX0FNRDY0X18pIHx8IGRlZmluZWQoX19hbWQ2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQorICAgaWYocFNjcm4pIFNpU19Qci0+U2lTX1ZHQUlORk8gPSBTaVNfR2V0U2V0QklPU1NjcmF0Y2gocFNjcm4sIDB4NDg5LCAweGZmKTsKKyNlbmRpZgorCisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAogICAgS2VlcExvY2tSZWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNSk7CiAjZW5kaWYKICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA1LDB4ODYpOwogCi0gICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIsIEh3SW5mbyk7CisgICBTaVNJbml0UENJZXRjKFNpU19Qcik7CisgICBTaVNTZXRMVkRTZXRjKFNpU19Qcik7CisgICBTaVNEZXRlcm1pbmVST01Vc2FnZShTaVNfUHIpOworCisgICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIpOwogCiAgICBpZighU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CiAgICAgICBpZighKFNpU19TZWFyY2hNb2RlSUQoU2lTX1ByLCAmTW9kZU5vLCAmTW9kZUlkSW5kZXgpKSkgcmV0dXJuIEZBTFNFOwpAQCAtMzQ4NywxMyArMzMyMiwxMyBAQAogICAgICAgTW9kZUlkSW5kZXggPSAwOwogICAgfQogCi0gICBTaVNfR2V0VkJUeXBlKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU19HZXRWQlR5cGUoU2lTX1ByKTsKIAogICAgLyogSW5pdC9yZXN0b3JlIHNvbWUgVkIgcmVnaXN0ZXJzICovCi0KLSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgewotICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgIFNpU19SZXNldFZCKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU19Jbml0VkIoU2lTX1ByKTsKKyAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgICAgU2lTX1Jlc2V0VkIoU2lTX1ByKTsKIAkgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgzMiwweDEwKTsKIAkgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAwLDB4MGMpOwogICAgICAgICAgYmFja3VwcmVnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzgpOwpAQCAtMzUwMywyMSArMzMzOCwyMCBAQAogICAgfQogCiAgICAvKiBHZXQgVkIgaW5mb3JtYXRpb24gKGNvbm5lY3RvcnMsIGNvbm5lY3RlZCBkZXZpY2VzKSAqLwotICAgU2lTX0dldFZCSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbywgKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgPyAwIDogMSk7Ci0gICBTaVNfU2V0WVBiUHIoU2lTX1ByLCBId0luZm8pOwotICAgU2lTX1NldFRWTW9kZShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7Ci0gICBTaVNfR2V0TENEUmVzSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7Ci0gICBTaVNfU2V0TG93TW9kZVRlc3QoU2lTX1ByLCBNb2RlTm8sIEh3SW5mbyk7CisgICBTaVNfR2V0VkJJbmZvKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgPyAwIDogMSk7CisgICBTaVNfU2V0WVBiUHIoU2lTX1ByKTsKKyAgIFNpU19TZXRUVk1vZGUoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyAgIFNpU19HZXRMQ0RSZXNJbmZvKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CisgICBTaVNfU2V0TG93TW9kZVRlc3QoU2lTX1ByLCBNb2RlTm8pOwogCi0jaWZkZWYgTElOVVhfS0VSTkVMCi0gICAvKiAzLiBDaGVjayBtZW1vcnkgc2l6ZSAoS2VybmVsIGZyYW1lYnVmZmVyIGRyaXZlciBvbmx5KSAqLwotICAgdGVtcCA9IFNpU19DaGVja01lbW9yeVNpemUoU2lTX1ByLCBId0luZm8sIE1vZGVObywgTW9kZUlkSW5kZXgpOwotICAgaWYoIXRlbXApIHJldHVybigwKTsKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICAvKiBDaGVjayBtZW1vcnkgc2l6ZSAoa2VybmVsIGZyYW1lYnVmZmVyIGRyaXZlciBvbmx5KSAqLworICAgaWYoIVNpU19DaGVja01lbW9yeVNpemUoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgfQogI2VuZGlmCiAKLSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgICBTaVNfU2V0dXBDUjV4KFNpU19QciwgSHdJbmZvKTsKLSAgIH0KKyAgIFNpU19PcGVuQ1JUQyhTaVNfUHIpOwogCiAgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKICAgICAgIFNpU19Qci0+Q1JUMVVzZXNDdXN0b21Nb2RlID0gVFJVRTsKQEAgLTM1MzAsMzggKzMzNjQsNDEgQEAKICAgIC8qIFNldCBtb2RlIG9uIENSVDEgKi8KICAgIGlmKCAoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldFNpbXVTY2FuTW9kZSB8IFNldENSVDJUb0xDREEpKSB8fAogICAgICAgICghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFN3aXRjaENSVDIpKSApIHsKLSAgICAgIFNpU19TZXRDUlQxR3JvdXAoU2lTX1ByLCBId0luZm8sIE1vZGVObywgTW9kZUlkSW5kZXgpOworICAgICAgU2lTX1NldENSVDFHcm91cChTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogICAgfQogCiAgICAvKiBTZXQgbW9kZSBvbiBDUlQyICovCiAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0U2ltdVNjYW5Nb2RlIHwgU3dpdGNoQ1JUMiB8IFNldENSVDJUb0xDREEpKSB7CiAgICAgICBpZiggKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSAgICB8fAotICAgICAgICAgIChTaVNfUHItPlNpU19JRl9ERUZfTFZEUyAgICAgPT0gMSkgfHwKLSAgICAgICAgICAoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAgICE9IDApIHx8Ci0gICAgICAgICAgKFNpU19Qci0+U2lTX0lGX0RFRl9UUlVNUElPTiAhPSAwKSApIHsKLSAgICAgICAgIFNpU19TZXRDUlQyR3JvdXAoU2lTX1ByLCBId0luZm8sIE1vZGVObyk7CisJICAoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgICAgID09IDEpIHx8CisJICAoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAgICE9IDApIHx8CisJICAoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OICE9IDApICkgeworCSBTaVNfU2V0Q1JUMkdyb3VwKFNpU19QciwgUmVhbE1vZGVObyk7CiAgICAgICB9CiAgICB9CiAKICAgIFNpU19IYW5kbGVDUlQxKFNpU19Qcik7CiAKLSAgIFNpU19TdHJhbmdlU3R1ZmYoU2lTX1ByLCBId0luZm8pOworICAgU2lTX1N0cmFuZ2VTdHVmZihTaVNfUHIpOwogCiAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7CiAgICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2M2LDB4RkYpOwogCi0gICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworI2lmZGVmIFNJUzMxNUgKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKLSAgICAgICAgIGlmKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByLCBId0luZm8pKSkgeworCSBpZighKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpKSB7CiAJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTMsMHhmYik7CiAJIH0KICAgICAgIH0KICAgIH0KKyNlbmRpZgogCi0gICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgICAgICBpZighU2lTX1ByLT5TaVNfUk9NTmV3KSB7Ci0JICAgIGlmKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkgeworICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CisgICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisjaWZkZWYgU0lTMzE1SAorCSBpZighU2lTX1ByLT5TaVNfUk9NTmV3KSB7CisJICAgIGlmKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSB7CiAJICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MzUsMHgwMSk7CiAJICAgIH0gZWxzZSB7CiAJICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDM1LDB4RkUpOwpAQCAtMzU3NCwyMyArMzQxMSwyNCBAQAogCSAgICBpZigoTW9kZU5vID09IDB4MDMpIHx8IChNb2RlTm8gPT0gMHgxMCkpIHsKIAkgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsMHg1MSwweDgwKTsKIAkgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsMHg1NiwweDA4KTsKLSAgICAgICAgICAgIH0KKwkgICAgfQogCSB9CiAKIAkgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApICYgU2V0Q1JUMlRvTENEKSB7CiAJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDM4LDB4ZmMpOwogCSB9Ci0gICAgICB9IGVsc2UgaWYoKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182MzApIHx8Ci0gICAgICAgICAgICAgICAgKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183MzApKSB7Ci0gICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSxiYWNrdXByZWcpOworI2VuZGlmCisgICAgICB9IGVsc2UgaWYoKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzYzMCkgfHwKKwkgICAgICAgIChTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApKSB7CisJIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM1LGJhY2t1cHJlZyk7CiAgICAgICB9CiAgICB9CiAKLSNpZmRlZiBMSU5VWF9YRjg2CisjaWZkZWYgU0lTX1hPUkdfWEY4NgogICAgaWYocFNjcm4pIHsKICAgICAgIC8qIFNldFBpdGNoOiBBZGFwdCB0byB2aXJ0dWFsIHNpemUgJiBwb3NpdGlvbiAqLwogICAgICAgaWYoKE1vZGVObyA+IDB4MTMpICYmIChkb3NldHBpdGNoKSkgewotICAgICAgICAgU2lTX1NldFBpdGNoKFNpU19QciwgcFNjcm4pOworCSBTaVNfU2V0UGl0Y2goU2lTX1ByLCBwU2Nybik7CiAgICAgICB9CiAKICAgICAgIC8qIEJhY2t1cC9TZXQgTW9kZU5vIGluIEJJT1Mgc2NyYXRjaCBhcmVhICovCkBAIC0zNTk4LDMzICszNDM2LDM3IEBACiAgICB9CiAjZW5kaWYKIAotI2lmZGVmIExJTlVYX0tFUk5FTCAgLyogV2UgbmV2ZXIgbG9jayByZWdpc3RlcnMgaW4gWEY4NiAqLwotICAgaWYoS2VlcExvY2tSZWcgPT0gMHhBMSkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDUsMHg4Nik7Ci0gICBlbHNlIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA1LDB4MDApOworICAgU2lTX0Nsb3NlQ1JUQyhTaVNfUHIpOworCisgICBTaVNfSGFuZGxlNzYwKFNpU19Qcik7CisKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICAvKiBXZSBuZXZlciBsb2NrIHJlZ2lzdGVycyBpbiBYRjg2ICovCisgICBpZihLZWVwTG9ja1JlZyAhPSAweEExKSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNSwweDAwKTsKICNlbmRpZgogCiAgICByZXR1cm4gVFJVRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgIFhGcmVlODY6IFNpU0JJT1NTZXRNb2RlKCkgICAgICAgICovCisvKiAgICAgICBYLm9yZy9YRnJlZTg2OiBTaVNCSU9TU2V0TW9kZSgpICAgICAqLwogLyogICAgICAgICAgIGZvciBub24tRHVhbC1IZWFkIG1vZGUgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9YRjg2CisjaWZkZWYgU0lTX1hPUkdfWEY4NgogQk9PTEVBTgotU2lTQklPU1NldE1vZGUoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywgU2NybkluZm9QdHIgcFNjcm4sCitTaVNCSU9TU2V0TW9kZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU2NybkluZm9QdHIgcFNjcm4sCiAgICAgICAgICAgICAgICBEaXNwbGF5TW9kZVB0ciBtb2RlLCBCT09MRUFOIElzQ3VzdG9tKQogewogICAgU0lTUHRyIHBTaVMgPSBTSVNQVFIocFNjcm4pOwotICAgVVNob3J0IE1vZGVObyA9IDA7CisgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8gPSAwOwogCiAgICBTaVNfUHItPlVzZUN1c3RvbU1vZGUgPSBGQUxTRTsKIAogICAgaWYoKElzQ3VzdG9tKSAmJiAoU2lTX0NoZWNrQnVpbGRDdXN0b21Nb2RlKHBTY3JuLCBtb2RlLCBwU2lTLT5WQkZsYWdzKSkpIHsKIAogICAgICAgeGY4NkRydk1zZ1ZlcmIocFNjcm4tPnNjcm5JbmRleCwgWF9JTkZPLCAzLCAiU2V0dGluZyBjdXN0b20gbW9kZSAlZHglZFxuIiwKLQkgCVNpU19Qci0+Q0hEaXNwbGF5LAorCQlTaVNfUHItPkNIRGlzcGxheSwKIAkJKG1vZGUtPkZsYWdzICYgVl9JTlRFUkxBQ0UgPyBTaVNfUHItPkNWRGlzcGxheSAqIDIgOgogCQkgICAobW9kZS0+RmxhZ3MgJiBWX0RCTFNDQU4gPyBTaVNfUHItPkNWRGlzcGxheSAvIDIgOgogCQkgICAgICBTaVNfUHItPkNWRGlzcGxheSkpKTsKQEAgLTM2MzIsMzIgKzM0NzQsMzMgQEAKICAgIH0gZWxzZSB7CiAKICAgICAgIC8qIERvbid0IG5lZWQgdmJmbGFncyBoZXJlOyBjaGVja3MgZG9uZSBlYXJsaWVyICovCi0gICAgICBNb2RlTm8gPSBTaVNfR2V0TW9kZU51bWJlcihwU2NybiwgbW9kZSwgMCk7CisgICAgICBNb2RlTm8gPSBTaVNfR2V0TW9kZU51bWJlcihwU2NybiwgbW9kZSwgcFNpUy0+VkJGbGFncyk7CiAgICAgICBpZighTW9kZU5vKSByZXR1cm4gRkFMU0U7CiAKICAgICAgIHhmODZEcnZNc2dWZXJiKHBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywgMywgIlNldHRpbmcgc3RhbmRhcmQgbW9kZSAweCV4XG4iLCBNb2RlTm8pOwogCiAgICB9CiAKLSAgIHJldHVybihTaVNTZXRNb2RlKFNpU19QciwgSHdJbmZvLCBwU2NybiwgTW9kZU5vLCBUUlVFKSk7CisgICByZXR1cm4oU2lTU2V0TW9kZShTaVNfUHIsIHBTY3JuLCBNb2RlTm8sIFRSVUUpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgIFhGcmVlODY6IFNpU0JJT1NTZXRNb2RlQ1JUMigpICAgICAgICovCisvKiAgICBYLm9yZy9YRnJlZTg2OiBTaVNCSU9TU2V0TW9kZUNSVDIoKSAgICAqLwogLyogICAgICAgICAgIGZvciBEdWFsLUhlYWQgbW9kZXMgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIEJPT0xFQU4KLVNpU0JJT1NTZXRNb2RlQ1JUMihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBTY3JuSW5mb1B0ciBwU2NybiwKK1NpU0JJT1NTZXRNb2RlQ1JUMihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU2NybkluZm9QdHIgcFNjcm4sCiAgICAgICAgICAgICAgICBEaXNwbGF5TW9kZVB0ciBtb2RlLCBCT09MRUFOIElzQ3VzdG9tKQogewotICAgVVNIT1JUICBNb2RlSWRJbmRleDsKLSAgIFNJU0lPQUREUkVTUyBCYXNlQWRkciA9IEh3SW5mby0+dWxJT0FkZHJlc3M7Ci0gICBVU2hvcnQgIE1vZGVObyAgID0gMDsKLSAgIHVuc2lnbmVkIGNoYXIgYmFja3VwcmVnPTA7Ci0gICBTSVNQdHIgIHBTaVMgICAgID0gU0lTUFRSKHBTY3JuKTsKKyAgIFNJU0lPQUREUkVTUyBCYXNlQWRkciA9IFNpU19Qci0+SU9BZGRyZXNzOworICAgU0lTUHRyICBwU2lTID0gU0lTUFRSKHBTY3JuKTsKICNpZmRlZiBTSVNEVUFMSEVBRAogICAgU0lTRW50UHRyIHBTaVNFbnQgPSBwU2lTLT5lbnRpdHlQcml2YXRlOwogI2VuZGlmCisgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleDsKKyAgIHVuc2lnbmVkIHNob3J0IE1vZGVObyA9IDA7CisgICB1bnNpZ25lZCBjaGFyICBiYWNrdXByZWcgPSAwOwogCiAgICBTaVNfUHItPlVzZUN1c3RvbU1vZGUgPSBGQUxTRTsKIApAQCAtMzY3MiwyMiArMzUxNSwyNSBAQAogCiAgICB9IGVsc2UgewogCi0gICAgICAgICBNb2RlTm8gPSBTaVNfR2V0TW9kZU51bWJlcihwU2NybiwgbW9kZSwgMCk7Ci0gICAgICAgICBpZighTW9kZU5vKSByZXR1cm4gRkFMU0U7CisJIE1vZGVObyA9IFNpU19HZXRNb2RlTnVtYmVyKHBTY3JuLCBtb2RlLCBwU2lTLT5WQkZsYWdzKTsKKwkgaWYoIU1vZGVObykgcmV0dXJuIEZBTFNFOwogCiAgICB9CiAKICAgIFNpU1JlZ0luaXQoU2lTX1ByLCBCYXNlQWRkcik7Ci0gICBTaVNJbml0UHRyKFNpU19QciwgSHdJbmZvKTsKLSAgIFNpU19HZXRTeXNGbGFncyhTaVNfUHIsIEh3SW5mbyk7Ci0jaWYgKGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19BTUQ2NF9fKSkKKyAgIFNpU0luaXRQdHIoU2lTX1ByKTsKKyAgIFNpU19HZXRTeXNGbGFncyhTaVNfUHIpOworI2lmIGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19BTUQ2NF9fKSB8fCBkZWZpbmVkKF9fYW1kNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQogICAgU2lTX1ByLT5TaVNfVkdBSU5GTyA9IFNpU19HZXRTZXRCSU9TU2NyYXRjaChwU2NybiwgMHg0ODksIDB4ZmYpOwogI2Vsc2UKICAgIFNpU19Qci0+U2lTX1ZHQUlORk8gPSAweDExOwogI2VuZGlmCi0gICBTaVNJbml0UENJZXRjKFNpU19QciwgSHdJbmZvKTsKLSAgIFNpU1NldExWRFNldGMoU2lTX1ByLCBId0luZm8pOwotICAgU2lTRGV0ZXJtaW5lUk9NVXNhZ2UoU2lTX1ByLCBId0luZm8pOworCisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNSwweDg2KTsKKworICAgU2lTSW5pdFBDSWV0YyhTaVNfUHIpOworICAgU2lTU2V0TFZEU2V0YyhTaVNfUHIpOworICAgU2lTRGV0ZXJtaW5lUk9NVXNhZ2UoU2lTX1ByKTsKIAogICAgLyogU2F2ZSBtb2RlIGluZm8gc28gd2UgY2FuIHNldCBpdCBmcm9tIHdpdGhpbiBTZXRNb2RlIGZvciBDUlQxICovCiAjaWZkZWYgU0lTRFVBTEhFQUQKQEAgLTM3MDAsMjMgKzM1NDYsMjAgQEAKICAgICAgIHBTaVNFbnQtPkNSVDJDUjM1ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzUpOwogICAgICAgcFNpU0VudC0+Q1JUMkNSMzggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7CiAjaWYgMAotICAgICAgLyogV2UgY2FuJ3Qgc2V0IENSVDIgbW9kZSBiZWZvcmUgQ1JUMSBtb2RlIGlzIHNldCAqLworICAgICAgLyogV2UgY2FuJ3Qgc2V0IENSVDIgbW9kZSBiZWZvcmUgQ1JUMSBtb2RlIGlzIHNldCAtIHNheXMgd2hvLi4uPyAqLwogICAgICAgaWYocFNpU0VudC0+Q1JUMU1vZGVObyA9PSAtMSkgewotICAgIAkgeGY4NkRydk1zZ1ZlcmIocFNjcm4tPnNjcm5JbmRleCwgWF9JTkZPLCAzLAorCSB4Zjg2RHJ2TXNnVmVyYihwU2Nybi0+c2NybkluZGV4LCBYX0lORk8sIDMsCiAJCSJTZXR0aW5nIENSVDIgbW9kZSBkZWxheWVkIHVudGlsIGFmdGVyIHNldHRpbmcgQ1JUMSBtb2RlXG4iKTsKLSAgIAkgcmV0dXJuIFRSVUU7CisJIHJldHVybiBUUlVFOwogICAgICAgfQogI2VuZGlmCiAgICAgICBwU2lTRW50LT5DUlQyTW9kZVNldCA9IFRSVUU7CiAgICB9CiAjZW5kaWYKIAotICAgLyogV2UgZG9uJ3QgY2xlYXIgdGhlIGJ1ZmZlciBpbiBYICovCi0gICBTaVNfUHItPlNpU19mbGFnX2NsZWFyYnVmZmVyPTA7Ci0KICAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogCi0gICAgICBVU0hPUlQgdGVtcHRlbXAgPSBTaVNfUHItPkNWRGlzcGxheTsKKyAgICAgIHVuc2lnbmVkIHNob3J0IHRlbXB0ZW1wID0gU2lTX1ByLT5DVkRpc3BsYXk7CiAKICAgICAgIGlmKFNpU19Qci0+Q01vZGVGbGFnICYgRG91YmxlU2Nhbk1vZGUpICAgICB0ZW1wdGVtcCA+Pj0gMTsKICAgICAgIGVsc2UgaWYoU2lTX1ByLT5DSW5mb0ZsYWcgJiBJbnRlcmxhY2VNb2RlKSB0ZW1wdGVtcCA8PD0gMTsKQEAgLTM3MjgsMTMgKzM1NzEsMTEgQEAKICAgIH0gZWxzZSB7CiAKICAgICAgIHhmODZEcnZNc2dWZXJiKHBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywgMywKLSAgIAkgICJTZXR0aW5nIHN0YW5kYXJkIG1vZGUgMHgleCBvbiBDUlQyXG4iLCBNb2RlTm8pOworCSAgIlNldHRpbmcgc3RhbmRhcmQgbW9kZSAweCV4IG9uIENSVDJcbiIsIE1vZGVObyk7CiAKICAgIH0KIAotICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDUsMHg4Nik7Ci0KLSAgIFNpU19VbkxvY2tDUlQyKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU19VbkxvY2tDUlQyKFNpU19Qcik7CiAKICAgIGlmKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKICAgICAgIGlmKCEoU2lTX1NlYXJjaE1vZGVJRChTaVNfUHIsICZNb2RlTm8sICZNb2RlSWRJbmRleCkpKSByZXR1cm4gRkFMU0U7CkBAIC0zNzQyLDU2ICszNTgzLDU5IEBACiAgICAgICBNb2RlSWRJbmRleCA9IDA7CiAgICB9CiAKLSAgIFNpU19HZXRWQlR5cGUoU2lTX1ByLCBId0luZm8pOworICAgU2lTX0dldFZCVHlwZShTaVNfUHIpOwogCi0gICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0JIFNpU19SZXNldFZCKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU19Jbml0VkIoU2lTX1ByKTsKKyAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworCSBTaVNfUmVzZXRWQihTaVNfUHIpOwogCSBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4MTApOwogCSBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDAsMHgwYyk7Ci0gICAgICAgICBiYWNrdXByZWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7CisJIGJhY2t1cHJlZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBiYWNrdXByZWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSk7CisJIGJhY2t1cHJlZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM1KTsKICAgICAgIH0KICAgIH0KIAogICAgLyogR2V0IFZCIGluZm9ybWF0aW9uIChjb25uZWN0b3JzLCBjb25uZWN0ZWQgZGV2aWNlcykgKi8KICAgIGlmKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgIFNpU19HZXRWQkluZm8oU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8sIDEpOworICAgICAgU2lTX0dldFZCSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIDEpOwogICAgfSBlbHNlIHsKICAgICAgIC8qIElmIHRoaXMgaXMgYSBjdXN0b20gbW9kZSwgd2UgZG9uJ3QgY2hlY2sgdGhlIG1vZGVmbGFnIGZvciBDUlQyTW9kZSAqLwotICAgICAgU2lTX0dldFZCSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbywgMCk7CisgICAgICBTaVNfR2V0VkJJbmZvKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgMCk7CiAgICB9Ci0gICBTaVNfU2V0WVBiUHIoU2lTX1ByLCBId0luZm8pOwotICAgU2lTX1NldFRWTW9kZShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7Ci0gICBTaVNfR2V0TENEUmVzSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7Ci0gICBTaVNfU2V0TG93TW9kZVRlc3QoU2lTX1ByLCBNb2RlTm8sIEh3SW5mbyk7CisgICBTaVNfU2V0WVBiUHIoU2lTX1ByKTsKKyAgIFNpU19TZXRUVk1vZGUoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyAgIFNpU19HZXRMQ0RSZXNJbmZvKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CisgICBTaVNfU2V0TG93TW9kZVRlc3QoU2lTX1ByLCBNb2RlTm8pOworCisgICBTaVNfUmVzZXRTZWdtZW50UmVnaXN0ZXJzKFNpU19Qcik7CiAKICAgIC8qIFNldCBtb2RlIG9uIENSVDIgKi8KICAgIGlmKCAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpICAgIHx8CiAgICAgICAgKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTICAgICA9PSAxKSB8fAogICAgICAgIChTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICAgIT0gMCkgfHwKICAgICAgICAoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OICE9IDApICkgewotICAgICAgU2lTX1NldENSVDJHcm91cChTaVNfUHIsIEh3SW5mbywgTW9kZU5vKTsKKyAgICAgIFNpU19TZXRDUlQyR3JvdXAoU2lTX1ByLCBNb2RlTm8pOwogICAgfQogCi0gICBTaVNfU3RyYW5nZVN0dWZmKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU19TdHJhbmdlU3R1ZmYoU2lTX1ByKTsKIAogICAgU2lTX0Rpc3BsYXlPbihTaVNfUHIpOwogICAgU2lTX1NldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjNiwweEZGKTsKIAotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKLSAgICAgICAgIGlmKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByLCBId0luZm8pKSkgeworCSBpZighKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpKSB7CiAJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTMsMHhmYik7CiAJIH0KICAgICAgIH0KICAgIH0KIAotICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0gICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICAgICAgaWYoIVNpU19Qci0+U2lTX1JPTU5ldykgewotCSAgICBpZihTaVNfSXNWQU1vZGUoU2lTX1ByLEh3SW5mbykpIHsKKyAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworCSBpZighU2lTX1ByLT5TaVNfUk9NTmV3KSB7CisJICAgIGlmKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSB7CiAJICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MzUsMHgwMSk7CiAJICAgIH0gZWxzZSB7CiAJICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDM1LDB4RkUpOwpAQCAtMzgwMyw4ICszNjQ3LDggQEAKIAkgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApICYgU2V0Q1JUMlRvTENEKSB7CiAJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDM4LDB4ZmMpOwogCSB9Ci0gICAgICB9IGVsc2UgaWYoKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182MzApIHx8Ci0gICAgICAgICAgICAgICAgKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183MzApKSB7CisgICAgICB9IGVsc2UgaWYoKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzYzMCkgfHwKKwkgICAgICAgIChTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApKSB7CiAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSxiYWNrdXByZWcpOwogICAgICAgfQogICAgfQpAQCAtMzgxMiwyNSArMzY1NiwyNyBAQAogICAgLyogU2V0UGl0Y2g6IEFkYXB0IHRvIHZpcnR1YWwgc2l6ZSAmIHBvc2l0aW9uICovCiAgICBTaVNfU2V0UGl0Y2hDUlQyKFNpU19QciwgcFNjcm4pOwogCisgICBTaVNfSGFuZGxlNzYwKFNpU19Qcik7CisKICAgIHJldHVybiBUUlVFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgWEZyZWU4NjogU2lTQklPU1NldE1vZGVDUlQxKCkgICAgICAgKi8KKy8qICAgIFgub3JnL1hGcmVlODY6IFNpU0JJT1NTZXRNb2RlQ1JUMSgpICAgICovCiAvKiAgICAgICAgICAgZm9yIER1YWwtSGVhZCBtb2RlcyAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogQk9PTEVBTgotU2lTQklPU1NldE1vZGVDUlQxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sIFNjcm5JbmZvUHRyIHBTY3JuLAorU2lTQklPU1NldE1vZGVDUlQxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTY3JuSW5mb1B0ciBwU2NybiwKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TW9kZVB0ciBtb2RlLCBCT09MRUFOIElzQ3VzdG9tKQogeworICAgU0lTSU9BRERSRVNTIEJhc2VBZGRyID0gU2lTX1ByLT5JT0FkZHJlc3M7CiAgICBTSVNQdHIgIHBTaVMgPSBTSVNQVFIocFNjcm4pOwotICAgU0lTSU9BRERSRVNTIEJhc2VBZGRyID0gSHdJbmZvLT51bElPQWRkcmVzczsKLSAgIFVTSE9SVCAgTW9kZUlkSW5kZXgsIE1vZGVObz0wOwotICAgVUNIQVIgYmFja3VwcmVnPTA7CisgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgTW9kZU5vID0gMDsKKyAgIHVuc2lnbmVkIGNoYXIgIGJhY2t1cHJlZyA9IDA7CiAjaWZkZWYgU0lTRFVBTEhFQUQKICAgIFNJU0VudFB0ciBwU2lTRW50ID0gcFNpUy0+ZW50aXR5UHJpdmF0ZTsKLSAgIFVDSEFSIGJhY2t1cGNyMzAsIGJhY2t1cGNyMzEsIGJhY2t1cGNyMzgsIGJhY2t1cGNyMzUsIGJhY2t1cHA0MGQ9MDsKKyAgIHVuc2lnbmVkIGNoYXIgIGJhY2t1cGNyMzAsIGJhY2t1cGNyMzEsIGJhY2t1cGNyMzgsIGJhY2t1cGNyMzUsIGJhY2t1cHA0MGQ9MDsKICAgIEJPT0xFQU4gYmFja3VwY3VzdG9tOwogI2VuZGlmCiAKQEAgLTM4MzgsNDMgKzM2ODQsNDEgQEAKIAogICAgaWYoKElzQ3VzdG9tKSAmJiAoU2lTX0NoZWNrQnVpbGRDdXN0b21Nb2RlKHBTY3JuLCBtb2RlLCBwU2lTLT5WQkZsYWdzKSkpIHsKIAotICAgICAgICAgVVNIT1JUIHRlbXB0ZW1wID0gU2lTX1ByLT5DVkRpc3BsYXk7CisJIHVuc2lnbmVkIHNob3J0IHRlbXB0ZW1wID0gU2lTX1ByLT5DVkRpc3BsYXk7CiAKLSAgICAgICAgIGlmKFNpU19Qci0+Q01vZGVGbGFnICYgRG91YmxlU2Nhbk1vZGUpICAgICB0ZW1wdGVtcCA+Pj0gMTsKLSAgICAgICAgIGVsc2UgaWYoU2lTX1ByLT5DSW5mb0ZsYWcgJiBJbnRlcmxhY2VNb2RlKSB0ZW1wdGVtcCA8PD0gMTsKKwkgaWYoU2lTX1ByLT5DTW9kZUZsYWcgJiBEb3VibGVTY2FuTW9kZSkgICAgIHRlbXB0ZW1wID4+PSAxOworCSBlbHNlIGlmKFNpU19Qci0+Q0luZm9GbGFnICYgSW50ZXJsYWNlTW9kZSkgdGVtcHRlbXAgPDw9IDE7CiAKLSAgICAgICAgIHhmODZEcnZNc2dWZXJiKHBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywgMywKKwkgeGY4NkRydk1zZ1ZlcmIocFNjcm4tPnNjcm5JbmRleCwgWF9JTkZPLCAzLAogCSAJIlNldHRpbmcgY3VzdG9tIG1vZGUgJWR4JWQgb24gQ1JUMVxuIiwKIAkgCVNpU19Qci0+Q0hEaXNwbGF5LCB0ZW1wdGVtcCk7CiAJIE1vZGVObyA9IDB4ZmU7CiAKICAgIH0gZWxzZSB7CiAKLSAgICAgICAgIE1vZGVObyA9IFNpU19HZXRNb2RlTnVtYmVyKHBTY3JuLCBtb2RlLCAwKTsKLSAgICAgICAgIGlmKCFNb2RlTm8pIHJldHVybiBGQUxTRTsKKwkgTW9kZU5vID0gU2lTX0dldE1vZGVOdW1iZXIocFNjcm4sIG1vZGUsIDApOyAvKiBkb24ndCBnaXZlIFZCRmxhZ3MgKi8KKwkgaWYoIU1vZGVObykgcmV0dXJuIEZBTFNFOwogCi0gICAgICAgICB4Zjg2RHJ2TXNnVmVyYihwU2Nybi0+c2NybkluZGV4LCBYX0lORk8sIDMsCisJIHhmODZEcnZNc2dWZXJiKHBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywgMywKIAkgCSJTZXR0aW5nIHN0YW5kYXJkIG1vZGUgMHgleCBvbiBDUlQxXG4iLCBNb2RlTm8pOwogICAgfQogCi0gICBTaVNJbml0UHRyKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU0luaXRQdHIoU2lTX1ByKTsKICAgIFNpU1JlZ0luaXQoU2lTX1ByLCBCYXNlQWRkcik7Ci0gICBTaVNfR2V0U3lzRmxhZ3MoU2lTX1ByLCBId0luZm8pOwotI2lmIChkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fQU1ENjRfXykpCisgICBTaVNfR2V0U3lzRmxhZ3MoU2lTX1ByKTsKKyNpZiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fQU1ENjRfXykgfHwgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKICAgIFNpU19Qci0+U2lTX1ZHQUlORk8gPSBTaVNfR2V0U2V0QklPU1NjcmF0Y2gocFNjcm4sIDB4NDg5LCAweGZmKTsKICNlbHNlCiAgICBTaVNfUHItPlNpU19WR0FJTkZPID0gMHgxMTsKICNlbmRpZgotICAgU2lTSW5pdFBDSWV0YyhTaVNfUHIsIEh3SW5mbyk7Ci0gICBTaVNTZXRMVkRTZXRjKFNpU19QciwgSHdJbmZvKTsKLSAgIFNpU0RldGVybWluZVJPTVVzYWdlKFNpU19QciwgSHdJbmZvKTsKLQotICAgLyogV2UgZG9uJ3QgY2xlYXIgdGhlIGJ1ZmZlciBpbiBYICovCi0gICBTaVNfUHItPlNpU19mbGFnX2NsZWFyYnVmZmVyID0gMDsKIAogICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDUsMHg4Nik7CiAKLSAgIFNpU19VbkxvY2tDUlQyKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU0luaXRQQ0lldGMoU2lTX1ByKTsKKyAgIFNpU1NldExWRFNldGMoU2lTX1ByKTsKKyAgIFNpU0RldGVybWluZVJPTVVzYWdlKFNpU19Qcik7CisKKyAgIFNpU19VbkxvY2tDUlQyKFNpU19Qcik7CiAKICAgIGlmKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKICAgICAgIGlmKCEoU2lTX1NlYXJjaE1vZGVJRChTaVNfUHIsICZNb2RlTm8sICZNb2RlSWRJbmRleCkpKSByZXR1cm4gRkFMU0U7CkBAIC0zODgzLDEwICszNzI3LDExIEBACiAgICB9CiAKICAgIC8qIERldGVybWluZSBWQlR5cGUgKi8KLSAgIFNpU19HZXRWQlR5cGUoU2lTX1ByLCBId0luZm8pOworICAgU2lTX0dldFZCVHlwZShTaVNfUHIpOwogCi0gICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICBTaVNfSW5pdFZCKFNpU19Qcik7CisgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKICAgICAgICAgIGJhY2t1cHJlZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBiYWNrdXByZWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSk7CkBAIC0zODk1LDI1ICszNzQwLDI5IEBACiAKICAgIC8qIEdldCBWQiBpbmZvcm1hdGlvbiAoY29ubmVjdG9ycywgY29ubmVjdGVkIGRldmljZXMpICovCiAgICAvKiAoV2UgZG9uJ3QgY2FyZSBpZiB0aGUgY3VycmVudCBtb2RlIGlzIGEgQ1JUMiBtb2RlKSAqLwotICAgU2lTX0dldFZCSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbywgMCk7Ci0gICBTaVNfU2V0WVBiUHIoU2lTX1ByLCBId0luZm8pOwotICAgU2lTX1NldFRWTW9kZShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7Ci0gICBTaVNfR2V0TENEUmVzSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7Ci0gICBTaVNfU2V0TG93TW9kZVRlc3QoU2lTX1ByLCBNb2RlTm8sIEh3SW5mbyk7CisgICBTaVNfR2V0VkJJbmZvKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgMCk7CisgICBTaVNfU2V0WVBiUHIoU2lTX1ByKTsKKyAgIFNpU19TZXRUVk1vZGUoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyAgIFNpU19HZXRMQ0RSZXNJbmZvKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CisgICBTaVNfU2V0TG93TW9kZVRlc3QoU2lTX1ByLCBNb2RlTm8pOwogCi0gICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICAgU2lTX1NldHVwQ1I1eChTaVNfUHIsIEh3SW5mbyk7Ci0gICB9CisgICBTaVNfT3BlbkNSVEMoU2lTX1ByKTsKIAogICAgLyogU2V0IG1vZGUgb24gQ1JUMSAqLwotICAgU2lTX1NldENSVDFHcm91cChTaVNfUHIsIEh3SW5mbywgTW9kZU5vLCBNb2RlSWRJbmRleCk7CisgICBTaVNfU2V0Q1JUMUdyb3VwKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CiAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7Ci0gICAgICBTaVNfU2V0Q1JUMkdyb3VwKFNpU19QciwgSHdJbmZvLCBNb2RlTm8pOworICAgICAgU2lTX1NldENSVDJHcm91cChTaVNfUHIsIE1vZGVObyk7CiAgICB9CiAKICAgIC8qIFNldFBpdGNoOiBBZGFwdCB0byB2aXJ0dWFsIHNpemUgJiBwb3NpdGlvbiAqLwogICAgU2lTX1NldFBpdGNoQ1JUMShTaVNfUHIsIHBTY3JuKTsKIAorICAgU2lTX0hhbmRsZUNSVDEoU2lTX1ByKTsKKworICAgU2lTX1N0cmFuZ2VTdHVmZihTaVNfUHIpOworCisgICBTaVNfQ2xvc2VDUlRDKFNpU19Qcik7CisKICNpZmRlZiBTSVNEVUFMSEVBRAogICAgaWYocFNpUy0+RHVhbEhlYWRNb2RlKSB7CiAgICAgICBwU2lTRW50LT5DUlQxTW9kZU5vID0gTW9kZU5vOwpAQCAtMzkzMyw3ICszNzgyLDcgQEAKICNpZmRlZiBTSVNEVUFMSEVBRAogICAgaWYocFNpUy0+RHVhbEhlYWRNb2RlKSB7CiAgICAgICBpZihwU2lTRW50LT5DUlQyTW9kZU5vICE9IC0xKSB7Ci0gICAgICAgICB4Zjg2RHJ2TXNnVmVyYihwU2Nybi0+c2NybkluZGV4LCBYX0lORk8sIDMsCisJIHhmODZEcnZNc2dWZXJiKHBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywgMywKIAkJCQkiKFJlLSlTZXR0aW5nIG1vZGUgZm9yIENSVDJcbiIpOwogCSBiYWNrdXBjdXN0b20gPSBTaVNfUHItPlVzZUN1c3RvbU1vZGU7CiAJIGJhY2t1cGNyMzAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMCk7CkBAIC0zOTUyLDkgKzM4MDEsMTEgQEAKIAkgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzUscFNpU0VudC0+Q1JUMkNSMzUpOwogCSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCxwU2lTRW50LT5DUlQyQ1IzOCk7CiAJIH0KLQkgU2lTQklPU1NldE1vZGVDUlQyKFNpU19QciwgSHdJbmZvLCBwU2lTRW50LT5wU2Nybl8xLAorCisJIFNpU0JJT1NTZXRNb2RlQ1JUMihTaVNfUHIsIHBTaVNFbnQtPnBTY3JuXzEsCiAJCQkgICAgcFNpU0VudC0+Q1JUMkRNb2RlLCBwU2lTRW50LT5DUlQySXNDdXN0b20pOwotICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzAsYmFja3VwY3IzMCk7CisKKwkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzAsYmFja3VwY3IzMCk7CiAJIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMxLGJhY2t1cGNyMzEpOwogCSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSxiYWNrdXBjcjM1KTsKIAkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzgsYmFja3VwY3IzOCk7CkBAIC0zOTcwLDIyICszODIxLDIwIEBACiAgICAgKiBwb3NzaWJseSBvdmVyd3JpdHRlbgogICAgICovCiAKLSAgIFNpU19IYW5kbGVDUlQxKFNpU19Qcik7Ci0KLSAgIFNpU19TdHJhbmdlU3R1ZmYoU2lTX1ByLCBId0luZm8pOwotCiAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7CiAgICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2M2LDB4RkYpOwogCi0gICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKIAkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzgsYmFja3VwcmVnKTsKLSAgICAgIH0gZWxzZSBpZigoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzYzMCkgfHwKLSAgICAgICAgICAgICAgICAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkpIHsKKyAgICAgIH0gZWxzZSBpZigoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNjMwKSB8fAorICAgICAgICAgICAgICAgIChTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApKSB7CiAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSxiYWNrdXByZWcpOwogICAgICAgfQogICAgfQogCisgICBTaVNfSGFuZGxlNzYwKFNpU19Qcik7CisKICAgIC8qIEJhY2t1cC9TZXQgTW9kZU5vIGluIEJJT1Mgc2NyYXRjaCBhcmVhICovCiAgICBTaVNfR2V0U2V0TW9kZUlEKHBTY3JuLE1vZGVObyk7CiAKQEAgLTM5OTMsODQgKzM4NDIsNiBAQAogfQogI2VuZGlmIC8qIExpbnV4X1hGODYgKi8KIAotCi0jaWZkZWYgTElOVVhfWEY4NgotQk9PTEVBTgotU2lTX0dldFBhbmVsSUQoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKLXsKLSAgY29uc3QgVVNIT1JUIFBhbmVsVHlwZVRhYmxlMzAwWzE2XSA9IHsKLSAgICAgIDB4YzEwMSwgMHhjMTE3LCAweDAxMjEsIDB4YzEzNSwgMHhjMTQyLCAweGMxNTIsIDB4YzE2MiwgMHhjMDcyLAotICAgICAgMHhjMTgxLCAweGMxOTIsIDB4YzFhMSwgMHhjMWI2LCAweGMxYzIsIDB4YzBkMiwgMHhjMWUyLCAweGMxZjIKLSAgfTsKLSAgY29uc3QgVVNIT1JUIFBhbmVsVHlwZVRhYmxlMzEwMzB4WzE2XSA9IHsKLSAgICAgIDB4YzEwMiwgMHhjMTEyLCAweDAxMjIsIDB4YzEzMiwgMHhjMTQyLCAweGMxNTIsIDB4YzE2OSwgMHhjMTc5LAotICAgICAgMHgwMTg5LCAweGMxOTIsIDB4YzFhMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAKLSAgfTsKLSAgY29uc3QgVVNIT1JUIFBhbmVsVHlwZVRhYmxlMzEwTFZEU1sxNl0gPSB7Ci0gICAgICAweGMxMTEsIDB4YzEyMiwgMHhjMTMzLCAweGMxNDQsIDB4YzE1NSwgMHhjMTY2LCAweGMxNzcsIDB4YzE4OCwKLSAgICAgIDB4YzE5OSwgMHhjMGFhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwCi0gIH07Ci0gIFVTSE9SVCB0ZW1wYXgsdGVtcGJ4LHRlbXA7Ci0KLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotCi0gICAgIHRlbXBheCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE4KTsKLSAgICAgdGVtcGJ4ID0gdGVtcGF4ICYgMHgwRjsKLSAgICAgaWYoISh0ZW1wYXggJiAweDEwKSl7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpewotICAgICAgICAgICB0ZW1wYnggPSAwOwotICAgICAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MzgpOwotICAgICAgICAgICBpZih0ZW1wICYgMHg0MCkgdGVtcGJ4IHw9IDB4MDg7Ci0gICAgICAgICAgIGlmKHRlbXAgJiAweDIwKSB0ZW1wYnggfD0gMHgwMjsKLSAgICAgICAgICAgaWYodGVtcCAmIDB4MDEpIHRlbXBieCB8PSAweDAxOwotICAgICAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MzkpOwotICAgICAgICAgICBpZih0ZW1wICYgMHg4MCkgdGVtcGJ4IHw9IDB4MDQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgIH0KLSAgICAgdGVtcGJ4ID0gUGFuZWxUeXBlVGFibGUzMDBbdGVtcGJ4XTsKLSAgICAgdGVtcGJ4IHw9IExDRFN5bmM7Ci0gICAgIHRlbXAgPSB0ZW1wYnggJiAweDAwRkY7Ci0gICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM2LHRlbXApOwotICAgICB0ZW1wID0gKHRlbXBieCAmIDB4RkYwMCkgPj4gODsKLSAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzZDQsMHgzNyx+KExDRFN5bmNCaXR8TENEUkdCMThCaXQpLHRlbXApOwotCi0gIH0gZWxzZSB7Ci0KLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgcmV0dXJuIDA7Ci0KLSAgICAgdGVtcGF4ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MWEpOwotICAgICB0ZW1wYXggJj0gMHgxZTsKLSAgICAgdGVtcGF4ID4+PSAxOwotICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB7Ci0gICAgICAgIGlmKHRlbXBheCA9PSAwKSB7Ci0gICAgICAgICAgIC8qIFRPRE86IEluY2x1ZGUgSFVHRSBkZXRlY3Rpb24gcm91dGluZQotCSAgICAgICAgICAgIChQcm9iYWJseSBub3Qgd29ydGggYm90aGVyaW5nKQotCSAgICAqLwotICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICB0ZW1wID0gdGVtcGF4ICYgMHhmZjsKLSAgICAgICAgdGVtcGF4LS07Ci0gICAgICAgIHRlbXBieCA9IFBhbmVsVHlwZVRhYmxlMzEwTFZEU1t0ZW1wYXhdOwotICAgICB9IGVsc2UgewotICAgICAgICB0ZW1wYnggPSBQYW5lbFR5cGVUYWJsZTMxMDMweFt0ZW1wYXhdOwotICAgICAgICB0ZW1wID0gdGVtcGJ4ICYgMHhmZjsKLSAgICAgfQotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNix0ZW1wKTsKLSAgICAgdGVtcGJ4ID0gKHRlbXBieCAmIDB4ZmYwMCkgPj4gODsKLSAgICAgdGVtcCA9IHRlbXBieCAmIDB4YzE7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MzcsfihMQ0RTeW5jQml0fExDRFJHQjE4Qml0KSx0ZW1wKTsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLSAgICAgICAgdGVtcCA9IHRlbXBieCAmIDB4MDQ7Ci0gICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MzksMHhmYix0ZW1wKTsKLSAgICAgfQotCi0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQogI2lmbmRlZiBHRVRCSVRTVFIKICNkZWZpbmUgQklUTUFTSyhoLGwpICAgIAkoKCh1bnNpZ25lZCkoMVUgPDwgKChoKS0obCkrMSkpLTEpPDwobCkpCiAjZGVmaW5lIEdFTk1BU0sobWFzaykgICAJQklUTUFTSygxP21hc2ssMD9tYXNrKQpAQCAtNDA3OCwyNiArMzg0OSwyOCBAQAogI2RlZmluZSBHRVRCSVRTVFIodmFsLGZyb20sdG8pICAoKEdFVEJJVFModmFsLGZyb20pKSA8PCAoMD90bykpCiAjZW5kaWYKIAotc3RhdGljIHZvaWQKLVNpU19DYWxjQ1JSZWdpc3RlcnMoU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IGRlcHRoKQordm9pZAorU2lTX0NhbGNDUlJlZ2lzdGVycyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IGRlcHRoKQogeworICAgaW50IHggPSAxOyAvKiBGaXggc3luYyAqLworCiAgICBTaVNfUHItPkNDUlQxQ1JUQ1swXSAgPSAgKChTaVNfUHItPkNIVG90YWwgPj4gMykgLSA1KSAmIDB4ZmY7CQkvKiBDUjAgKi8KICAgIFNpU19Qci0+Q0NSVDFDUlRDWzFdICA9ICAoU2lTX1ByLT5DSERpc3BsYXkgPj4gMykgLSAxOwkJCS8qIENSMSAqLwogICAgU2lTX1ByLT5DQ1JUMUNSVENbMl0gID0gIChTaVNfUHItPkNIQmxhbmtTdGFydCA+PiAzKSAtIDE7CQkJLyogQ1IyICovCiAgICBTaVNfUHItPkNDUlQxQ1JUQ1szXSAgPSAgKCgoU2lTX1ByLT5DSEJsYW5rRW5kID4+IDMpIC0gMSkgJiAweDFGKSB8IDB4ODA7CS8qIENSMyAqLwogICAgU2lTX1ByLT5DQ1JUMUNSVENbNF0gID0gIChTaVNfUHItPkNIU3luY1N0YXJ0ID4+IDMpICsgMzsJCQkvKiBDUjQgKi8KICAgIFNpU19Qci0+Q0NSVDFDUlRDWzVdICA9ICAoKCgoU2lTX1ByLT5DSEJsYW5rRW5kID4+IDMpIC0gMSkgJiAweDIwKSA8PCAyKSB8CS8qIENSNSAqLwotICAgICAgIAkJCSAgICAoKChTaVNfUHItPkNIU3luY0VuZCA+PiAzKSArIDMpICYgMHgxRik7CisJCQkgICAgKCgoU2lTX1ByLT5DSFN5bmNFbmQgPj4gMykgKyAzKSAmIDB4MUYpOwogCi0gICBTaVNfUHItPkNDUlQxQ1JUQ1s2XSAgPSAgKFNpU19Qci0+Q1ZUb3RhbCAtIDIpICYgMHhGRjsJCQkvKiBDUjYgKi8KLSAgIFNpU19Qci0+Q0NSVDFDUlRDWzddICA9ICAoKChTaVNfUHItPkNWVG90YWwgLSAyKSAmIDB4MTAwKSA+PiA4KQkJLyogQ1I3ICovCi0gCSAJCSAgfCAoKChTaVNfUHItPkNWRGlzcGxheSAtIDEpICYgMHgxMDApID4+IDcpCi0JIAkJICB8ICgoU2lTX1ByLT5DVlN5bmNTdGFydCAmIDB4MTAwKSA+PiA2KQotCSAJICAJICB8ICgoKFNpU19Qci0+Q1ZCbGFua1N0YXJ0IC0gMSkgJiAweDEwMCkgPj4gNSkKKyAgIFNpU19Qci0+Q0NSVDFDUlRDWzZdICA9ICAoU2lTX1ByLT5DVlRvdGFsICAgICAgIC0gMikgJiAweEZGOwkJCS8qIENSNiAqLworICAgU2lTX1ByLT5DQ1JUMUNSVENbN10gID0gICgoKFNpU19Qci0+Q1ZUb3RhbCAgICAgLSAyKSAmIDB4MTAwKSA+PiA4KQkJLyogQ1I3ICovCisJCQkgIHwgKCgoU2lTX1ByLT5DVkRpc3BsYXkgICAtIDEpICYgMHgxMDApID4+IDcpCisJCQkgIHwgKCgoU2lTX1ByLT5DVlN5bmNTdGFydCAtIHgpICYgMHgxMDApID4+IDYpCisJCQkgIHwgKCgoU2lTX1ByLT5DVkJsYW5rU3RhcnQtIDEpICYgMHgxMDApID4+IDUpCiAJCQkgIHwgMHgxMAotCSAJCSAgfCAoKChTaVNfUHItPkNWVG90YWwgLSAyKSAmIDB4MjAwKSAgID4+IDQpCi0JIAkJICB8ICgoKFNpU19Qci0+Q1ZEaXNwbGF5IC0gMSkgJiAweDIwMCkgPj4gMykKLQkgCQkgIHwgKChTaVNfUHItPkNWU3luY1N0YXJ0ICYgMHgyMDApID4+IDIpOworCQkJICB8ICgoKFNpU19Qci0+Q1ZUb3RhbCAgICAgLSAyKSAmIDB4MjAwKSA+PiA0KQorCQkJICB8ICgoKFNpU19Qci0+Q1ZEaXNwbGF5ICAgLSAxKSAmIDB4MjAwKSA+PiAzKQorCQkJICB8ICgoKFNpU19Qci0+Q1ZTeW5jU3RhcnQgLSB4KSAmIDB4MjAwKSA+PiAyKTsKIAogICAgU2lTX1ByLT5DQ1JUMUNSVENbMTZdID0gKCgoKFNpU19Qci0+Q1ZCbGFua1N0YXJ0IC0gMSkgJiAweDIwMCkgPj4gNCkgPj4gNSk7IAkvKiBDUjkgKi8KIApAQCAtNDEwNiw1NSArMzg3OSw0NCBAQAogICAgICAgZWxzZSBpZihTaVNfUHItPkNIRGlzcGxheSA+PSA2NDApICBTaVNfUHItPkNDUlQxQ1JUQ1sxNl0gfD0gMHg0MDsKICAgIH0KIAotI2lmIDAKLSAgIGlmIChtb2RlLT5WU2NhbiA+PSAzMikKLQlyZWdwLT5DUlRDWzldIHw9IDB4MUY7Ci0gICBlbHNlIGlmIChtb2RlLT5WU2NhbiA+IDEpCi0JcmVncC0+Q1JUQ1s5XSB8PSBtb2RlLT5WU2NhbiAtIDE7Ci0jZW5kaWYKLQotICAgU2lTX1ByLT5DQ1JUMUNSVENbOF0gPSAgKFNpU19Qci0+Q1ZTeW5jU3RhcnQgICAgICkgJiAweEZGOwkJCS8qIENSMTAgKi8KLSAgIFNpU19Qci0+Q0NSVDFDUlRDWzldID0gICgoU2lTX1ByLT5DVlN5bmNFbmQgICAgICApICYgMHgwRikgfCAweDgwOwkJLyogQ1IxMSAqLworICAgU2lTX1ByLT5DQ1JUMUNSVENbOF0gPSAgKFNpU19Qci0+Q1ZTeW5jU3RhcnQgIC0geCkgJiAweEZGOwkJCS8qIENSMTAgKi8KKyAgIFNpU19Qci0+Q0NSVDFDUlRDWzldID0gICgoU2lTX1ByLT5DVlN5bmNFbmQgICAtIHgpICYgMHgwRikgfCAweDgwOwkJLyogQ1IxMSAqLwogICAgU2lTX1ByLT5DQ1JUMUNSVENbMTBdID0gKFNpU19Qci0+Q1ZEaXNwbGF5ICAgIC0gMSkgJiAweEZGOwkJCS8qIENSMTIgKi8KICAgIFNpU19Qci0+Q0NSVDFDUlRDWzExXSA9IChTaVNfUHItPkNWQmxhbmtTdGFydCAtIDEpICYgMHhGRjsJCQkvKiBDUjE1ICovCiAgICBTaVNfUHItPkNDUlQxQ1JUQ1sxMl0gPSAoU2lTX1ByLT5DVkJsYW5rRW5kICAgLSAxKSAmIDB4RkY7CQkJLyogQ1IxNiAqLwogCiAgICBTaVNfUHItPkNDUlQxQ1JUQ1sxM10gPQkJCQkJCQkvKiBTUkEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DVlRvdGFsICAgICAtMiksIDEwOjEwLCAwOjApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DVkRpc3BsYXkgICAtMSksIDEwOjEwLCAxOjEpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DVkJsYW5rU3RhcnQtMSksIDEwOjEwLCAyOjIpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DVlN5bmNTdGFydCAgICksIDEwOjEwLCAzOjMpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DVkJsYW5rRW5kICAtMSksICAgODo4LCA0OjQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DVlN5bmNFbmQgICAgICksICAgNDo0LCA1OjUpIDsKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DVlRvdGFsICAgICAtMiksIDEwOjEwLCAwOjApIHwKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DVkRpc3BsYXkgICAtMSksIDEwOjEwLCAxOjEpIHwKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DVkJsYW5rU3RhcnQtMSksIDEwOjEwLCAyOjIpIHwKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DVlN5bmNTdGFydCAteCksIDEwOjEwLCAzOjMpIHwKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DVkJsYW5rRW5kICAtMSksICAgODo4LCA0OjQpIHwKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DVlN5bmNFbmQgICAgICksICAgNDo0LCA1OjUpIDsKIAogICAgU2lTX1ByLT5DQ1JUMUNSVENbMTRdID0JCQkJCQkJLyogU1JCICovCi0gICAgICAgICAgICAgICAgICAgICAgICBHRVRCSVRTVFIoKFNpU19Qci0+Q0hUb3RhbCAgICAgID4+IDMpIC0gNSwgOTo4LCAxOjApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DSERpc3BsYXkgICAgPj4gMykgLSAxLCA5OjgsIDM6MikgfAotICAgICAgICAgICAgICAgICAgICAgICAgR0VUQklUU1RSKChTaVNfUHItPkNIQmxhbmtTdGFydCA+PiAzKSAtIDEsIDk6OCwgNTo0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRCSVRTVFIoKFNpU19Qci0+Q0hTeW5jU3RhcnQgID4+IDMpICsgMywgOTo4LCA3OjYpIDsKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DSFRvdGFsICAgICAgPj4gMykgLSA1LCA5OjgsIDE6MCkgfAorCQkJR0VUQklUU1RSKChTaVNfUHItPkNIRGlzcGxheSAgICA+PiAzKSAtIDEsIDk6OCwgMzoyKSB8CisJCQlHRVRCSVRTVFIoKFNpU19Qci0+Q0hCbGFua1N0YXJ0ID4+IDMpIC0gMSwgOTo4LCA1OjQpIHwKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DSFN5bmNTdGFydCAgPj4gMykgKyAzLCA5OjgsIDc6NikgOwogCiAKICAgIFNpU19Qci0+Q0NSVDFDUlRDWzE1XSA9CQkJCQkJCS8qIFNSQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUQklUU1RSKChTaVNfUHItPkNIQmxhbmtFbmQgPj4gMykgLSAxLCA3OjYsIDE6MCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgR0VUQklUU1RSKChTaVNfUHItPkNIU3luY0VuZCAgPj4gMykgKyAzLCA1OjUsIDI6MikgOworCQkJR0VUQklUU1RSKChTaVNfUHItPkNIQmxhbmtFbmQgPj4gMykgLSAxLCA3OjYsIDE6MCkgfAorCQkJR0VUQklUU1RSKChTaVNfUHItPkNIU3luY0VuZCAgPj4gMykgKyAzLCA1OjUsIDI6MikgOwogfQogCiB2b2lkCi1TaVNfQ2FsY0xDREFDUlQxVGltaW5nKFNpU19Qcml2YXRlICpTaVNfUHIsVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgpCitTaVNfQ2FsY0xDREFDUlQxVGltaW5nKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICAgVVNIT1JUIG1vZGVmbGFnLCB0ZW1wYXgsIHRlbXBieCwgVkdBSERFID0gU2lTX1ByLT5TaVNfVkdBSERFOwotICAgaW50IGksajsKKyAgIHVuc2lnbmVkIHNob3J0IG1vZGVmbGFnLCB0ZW1wYXgsIHRlbXBieCA9IDAsIHJlbWFpbmluZyA9IDA7CisgICB1bnNpZ25lZCBzaG9ydCBWR0FIREUgPSBTaVNfUHItPlNpU19WR0FIREU7CisgICBpbnQgaSwgajsKIAogICAgLyogMToxIGRhdGE6IHVzZSBkYXRhIHNldCBieSBzZXRjcnQxY3J0YygpICovCiAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSByZXR1cm47CiAKLSAgIGlmKE1vZGVObyA8PSAweDEzKSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9Nb2RlRmxhZzsKLSAgIH0gZWxzZSBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPkNNb2RlRmxhZzsKLSAgIH0gZWxzZSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICB9CisgICBtb2RlZmxhZyA9IFNpU19HZXRNb2RlRmxhZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogCiAgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSBWR0FIREUgPj49IDE7CiAKQEAgLTQxNjQsMzIgKzM5MjYsOTEgQEAKICAgIFNpU19Qci0+Q1ZEaXNwbGF5ID0gU2lTX1ByLT5TaVNfVkdBVkRFOwogICAgU2lTX1ByLT5DVkJsYW5rU3RhcnQgPSBTaVNfUHItPlNpU19WR0FWREU7CiAKLSAgIHRlbXBieCA9IFNpU19Qci0+UGFuZWxIVCAtIFNpU19Qci0+UGFuZWxYUmVzOwotICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfVkdBSERFOyAgLyogbm90IC8yICEgKi8KLSAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB7Ci0gICAgICB0ZW1wYXggPSBTaVNfUHItPlBhbmVsWFJlczsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworI2lmZGVmIFNJUzMwMAorICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfVkdBSFQ7CisgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgeworICAgICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5QYW5lbEhUOworICAgICAgfQorICAgICAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgdGVtcGJ4ID4+PSAxOworICAgICAgcmVtYWluaW5nID0gdGVtcGJ4ICUgODsKKyNlbmRpZgorICAgfSBlbHNlIHsKKyNpZmRlZiBTSVMzMTVICisgICAgICAvKiBPSyBmb3IgTENEQSwgTFZEUyAqLworICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5QYW5lbEhUIC0gU2lTX1ByLT5QYW5lbFhSZXM7CisgICAgICB0ZW1wYXggPSBTaVNfUHItPlNpU19WR0FIREU7ICAvKiBub3QgLzIgISAqLworICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKKyAgICAgICAgIHRlbXBheCA9IFNpU19Qci0+UGFuZWxYUmVzOworICAgICAgfQorICAgICAgdGVtcGJ4ICs9IHRlbXBheDsKKyAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHRlbXBieCAtPSBWR0FIREU7CisjZW5kaWYKICAgIH0KLSAgIHRlbXBieCArPSB0ZW1wYXg7Ci0gICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB0ZW1wYnggLT0gVkdBSERFOwogICAgU2lTX1ByLT5DSFRvdGFsID0gU2lTX1ByLT5DSEJsYW5rRW5kID0gdGVtcGJ4OwogCi0gICB0ZW1wYXggPSBWR0FIREU7Ci0gICB0ZW1wYnggPSBTaVNfUHItPkNIVG90YWw7Ci0gICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgewotICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5QYW5lbFhSZXM7Ci0gICAgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB0ZW1wYnggPj49IDE7Ci0gICAgICB0ZW1wYXggKz0gKCh0ZW1wYnggLSB0ZW1wYXgpID4+IDEpOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CisjaWZkZWYgU0lTMzAwCisgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgPT0gU2lTX1ByLT5QYW5lbFhSZXMpIHsKKwkgU2lTX1ByLT5DSFN5bmNTdGFydCA9IFNpU19Qci0+U2lTX1ZHQUhERSArICgoU2lTX1ByLT5QYW5lbEhSUyArIDEpICYgfjEpOworCSBTaVNfUHItPkNIU3luY0VuZCA9IFNpU19Qci0+Q0hTeW5jU3RhcnQgKyBTaVNfUHItPlBhbmVsSFJFOworCSBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB7CisJICAgIFNpU19Qci0+Q0hTeW5jU3RhcnQgPj49IDE7CisJICAgIFNpU19Qci0+Q0hTeW5jRW5kID4+PSAxOworCSB9CisgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKKwkgdGVtcGF4ID0gKFNpU19Qci0+UGFuZWxYUmVzIC0gU2lTX1ByLT5TaVNfVkdBSERFKSA+PiAxOworCSB0ZW1wYnggPSAoU2lTX1ByLT5QYW5lbEhSUyArIDEpICYgfjE7CisJIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHsKKwkgICAgdGVtcGF4ID4+PSAxOworCSAgICB0ZW1wYnggPj49IDE7CisJIH0KKwkgU2lTX1ByLT5DSFN5bmNTdGFydCA9IChWR0FIREUgKyB0ZW1wYXggKyB0ZW1wYnggKyA3KSAmIH43OworCSB0ZW1wYXggPSBTaVNfUHItPlBhbmVsSFJFICsgNzsKKwkgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgdGVtcGF4ID4+PSAxOworCSBTaVNfUHItPkNIU3luY0VuZCA9IChTaVNfUHItPkNIU3luY1N0YXJ0ICsgdGVtcGF4KSAmIH43OworICAgICAgfSBlbHNlIHsKKwkgU2lTX1ByLT5DSFN5bmNTdGFydCA9IFNpU19Qci0+U2lTX1ZHQUhERTsKKwkgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgeworCSAgICBTaVNfUHItPkNIU3luY1N0YXJ0ID4+PSAxOworCSAgICB0ZW1wYXggPSAoKFNpU19Qci0+Q0hUb3RhbCAtIFNpU19Qci0+Q0hTeW5jU3RhcnQpIC8gMykgPDwgMTsKKwkgICAgU2lTX1ByLT5DSFN5bmNFbmQgPSBTaVNfUHItPkNIU3luY1N0YXJ0ICsgdGVtcGF4OworCSB9IGVsc2UgeworCSAgICBTaVNfUHItPkNIU3luY0VuZCA9IChTaVNfUHItPkNIU3luY1N0YXJ0ICsgKFNpU19Qci0+Q0hUb3RhbCAvIDEwKSArIDcpICYgfjc7CisJICAgIFNpU19Qci0+Q0hTeW5jU3RhcnQgKz0gODsKKwkgfQorICAgICAgfQorI2VuZGlmCisgICB9IGVsc2UgeworI2lmZGVmIFNJUzMxNUgKKyAgICAgIHRlbXBheCA9IFZHQUhERTsKKyAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB7CisJIHRlbXBieCA9IFNpU19Qci0+UGFuZWxYUmVzOworCSBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB0ZW1wYnggPj49IDE7CisJIHRlbXBheCArPSAoKHRlbXBieCAtIHRlbXBheCkgPj4gMSk7CisgICAgICB9CisgICAgICB0ZW1wYXggKz0gU2lTX1ByLT5QYW5lbEhSUzsKKyAgICAgIFNpU19Qci0+Q0hTeW5jU3RhcnQgPSB0ZW1wYXg7CisgICAgICB0ZW1wYXggKz0gU2lTX1ByLT5QYW5lbEhSRTsKKyAgICAgIFNpU19Qci0+Q0hTeW5jRW5kID0gdGVtcGF4OworI2VuZGlmCiAgICB9CiAKLSAgIHRlbXBheCArPSBTaVNfUHItPlBhbmVsSFJTOwotICAgU2lTX1ByLT5DSFN5bmNTdGFydCA9IHRlbXBheDsKLSAgIHRlbXBheCArPSBTaVNfUHItPlBhbmVsSFJFOwotICAgU2lTX1ByLT5DSFN5bmNFbmQgPSB0ZW1wYXg7Ci0KICAgIHRlbXBieCA9IFNpU19Qci0+UGFuZWxWVCAtIFNpU19Qci0+UGFuZWxZUmVzOwogICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfVkdBVkRFOwogICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKICAgICAgIHRlbXBheCA9IFNpU19Qci0+UGFuZWxZUmVzOworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworI2lmZGVmIFNJUzMwMAorICAgICAgLyogU3R1cGlkIGhhY2sgZm9yIDY0MHg0MDAvMzIweDIwMCAqLworICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgeworCSBpZigodGVtcGF4ICsgdGVtcGJ4KSA9PSA0MzgpIHRlbXBieCArPSAxNjsKKyAgICAgIH0gZWxzZSBpZigoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF84MDB4NjAwKSB8fAorCQkoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDYwMCkpIHsKKwkgdGVtcGF4ID0gMDsKKwkgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfVkdBVlQ7CisgICAgICB9CisjZW5kaWYKICAgIH0KICAgIFNpU19Qci0+Q1ZUb3RhbCA9IFNpU19Qci0+Q1ZCbGFua0VuZCA9IHRlbXBieCArIHRlbXBheDsKIApAQCAtNDIwMSwyMiArNDAyMiwyOCBAQAogICAgU2lTX1ByLT5DVlN5bmNTdGFydCA9IHRlbXBheDsKICAgIHRlbXBheCArPSBTaVNfUHItPlBhbmVsVlJFOwogICAgU2lTX1ByLT5DVlN5bmNFbmQgPSB0ZW1wYXg7CisgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgICAgIFNpU19Qci0+Q1ZTeW5jU3RhcnQtLTsKKyAgICAgIFNpU19Qci0+Q1ZTeW5jRW5kLS07CisgICB9CiAKICAgIFNpU19DYWxjQ1JSZWdpc3RlcnMoU2lTX1ByLCA4KTsKKyAgIFNpU19Qci0+Q0NSVDFDUlRDWzE1XSAmPSB+MHhGODsKKyAgIFNpU19Qci0+Q0NSVDFDUlRDWzE1XSB8PSAocmVtYWluaW5nIDw8IDQpOwogICAgU2lTX1ByLT5DQ1JUMUNSVENbMTZdICY9IH4weEUwOwogCiAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHgxMSwweDdmKTsKIAotICAgZm9yKGk9MCxqPTA7aTw9NztpKyssaisrKSB7CisgICBmb3IoaSA9IDAsIGogPSAwOyBpIDw9IDc7IGkrKywgaisrKSB7CiAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaixTaVNfUHItPkNDUlQxQ1JUQ1tpXSk7CiAgICB9Ci0gICBmb3Ioaj0weDEwO2k8PTEwO2krKyxqKyspIHsKKyAgIGZvcihqID0gMHgxMDsgaSA8PSAxMDsgaSsrLCBqKyspIHsKICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxqLFNpU19Qci0+Q0NSVDFDUlRDW2ldKTsKICAgIH0KLSAgIGZvcihqPTB4MTU7aTw9MTI7aSsrLGorKykgeworICAgZm9yKGogPSAweDE1OyBpIDw9IDEyOyBpKyssIGorKykgewogICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LGosU2lTX1ByLT5DQ1JUMUNSVENbaV0pOwogICAgfQotICAgZm9yKGo9MHgwQTtpPD0xNTtpKyssaisrKSB7CisgICBmb3IoaiA9IDB4MEE7IGkgPD0gMTU7IGkrKywgaisrKSB7CiAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsaixTaVNfUHItPkNDUlQxQ1JUQ1tpXSk7CiAgICB9CiAKQEAgLTQyMjcsMTA5MiArNDA1NCwxOTIgQEAKICAgIGlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHRlbXBheCB8PSAweDgwOwogICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzZDQsMHgwOSwweDVGLHRlbXBheCk7CiAKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgeGY4NkRydk1zZygwLCBYX0lORk8sICIlZCAlZCAlZCAlZCAgJWQgJWQgJWQgJWQgICglZCAlZCAlZCAlZClcbiIsCi0gICAgICAgCVNpU19Qci0+Q0hEaXNwbGF5LCBTaVNfUHItPkNIU3luY1N0YXJ0LCBTaVNfUHItPkNIU3luY0VuZCwgU2lTX1ByLT5DSFRvdGFsLAorCVNpU19Qci0+Q0hEaXNwbGF5LCBTaVNfUHItPkNIU3luY1N0YXJ0LCBTaVNfUHItPkNIU3luY0VuZCwgU2lTX1ByLT5DSFRvdGFsLAogCVNpU19Qci0+Q1ZEaXNwbGF5LCBTaVNfUHItPkNWU3luY1N0YXJ0LCBTaVNfUHItPkNWU3luY0VuZCwgU2lTX1ByLT5DVlRvdGFsLAogCVNpU19Qci0+Q0hCbGFua1N0YXJ0LCBTaVNfUHItPkNIQmxhbmtFbmQsIFNpU19Qci0+Q1ZCbGFua1N0YXJ0LCBTaVNfUHItPkNWQmxhbmtFbmQpOwotCiAgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywgIiB7ezB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsXG4iLAotICAgCVNpU19Qci0+Q0NSVDFDUlRDWzBdLCBTaVNfUHItPkNDUlQxQ1JUQ1sxXSwKKwlTaVNfUHItPkNDUlQxQ1JUQ1swXSwgU2lTX1ByLT5DQ1JUMUNSVENbMV0sCiAJU2lTX1ByLT5DQ1JUMUNSVENbMl0sIFNpU19Qci0+Q0NSVDFDUlRDWzNdLAogCVNpU19Qci0+Q0NSVDFDUlRDWzRdLCBTaVNfUHItPkNDUlQxQ1JUQ1s1XSwKIAlTaVNfUHItPkNDUlQxQ1JUQ1s2XSwgU2lTX1ByLT5DQ1JUMUNSVENbN10pOwogICAgeGY4NkRydk1zZygwLCBYX0lORk8sICIgICAweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LFxuIiwKLSAgIAlTaVNfUHItPkNDUlQxQ1JUQ1s4XSwgU2lTX1ByLT5DQ1JUMUNSVENbOV0sCisJU2lTX1ByLT5DQ1JUMUNSVENbOF0sIFNpU19Qci0+Q0NSVDFDUlRDWzldLAogCVNpU19Qci0+Q0NSVDFDUlRDWzEwXSwgU2lTX1ByLT5DQ1JUMUNSVENbMTFdLAogCVNpU19Qci0+Q0NSVDFDUlRDWzEyXSwgU2lTX1ByLT5DQ1JUMUNSVENbMTNdLAogCVNpU19Qci0+Q0NSVDFDUlRDWzE0XSwgU2lTX1ByLT5DQ1JUMUNSVENbMTVdKTsKICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiICAgMHglMDJ4fX0sXG4iLCBTaVNfUHItPkNDUlQxQ1JUQ1sxNl0pOwogI2VuZGlmCisjZW5kaWYKIH0KIAotI2lmZGVmIExJTlVYX1hGODYKLQogdm9pZAotU2lTX01ha2VDbG9ja1JlZ3MoU2NybkluZm9QdHIgcFNjcm4sIGludCBjbG9jaywgVUNIQVIgKnAyYiwgVUNIQVIgKnAyYykKLXsKLSAgIGludCAgICAgICAgICBvdXRfbiwgb3V0X2RuLCBvdXRfZGl2LCBvdXRfc2JpdCwgb3V0X3NjYWxlOwotICAgdW5zaWduZWQgaW50IHZjbGtbNV07Ci0KLSNkZWZpbmUgTWlkeCAgICAgICAgIDAKLSNkZWZpbmUgTmlkeCAgICAgICAgIDEKLSNkZWZpbmUgVkxEaWR4ICAgICAgIDIKLSNkZWZpbmUgUGlkeCAgICAgICAgIDMKLSNkZWZpbmUgUFNOaWR4ICAgICAgIDQKLQotICAgaWYoU2lTX2NvbXB1dGVfdmNsayhjbG9jaywgJm91dF9uLCAmb3V0X2RuLCAmb3V0X2RpdiwgJm91dF9zYml0LCAmb3V0X3NjYWxlKSkgewotICAgICAgKCpwMmIpID0gKG91dF9kaXYgPT0gMikgPyAweDgwIDogMHgwMDsKLSAgICAgICgqcDJiKSB8PSAoKG91dF9uIC0gMSkgJiAweDdmKTsKLSAgICAgICgqcDJjKSA9IChvdXRfZG4gLSAxKSAmIDB4MWY7Ci0gICAgICAoKnAyYykgfD0gKCgob3V0X3NjYWxlIC0gMSkgJiAzKSA8PCA1KTsKLSAgICAgICgqcDJjKSB8PSAoKG91dF9zYml0ICYgMHgwMSkgPDwgNyk7Ci0jaWZkZWYgVFdERUJVRwotICAgICAgeGY4NkRydk1zZyhwU2Nybi0+c2NybkluZGV4LCBYX0lORk8sICJDbG9jayAlZDogbiAlZCBkbiAlZCBkaXYgJWQgc2IgJWQgc2MgJWRcbiIsCi0gICAgICAgIAkgY2xvY2ssIG91dF9uLCBvdXRfZG4sIG91dF9kaXYsIG91dF9zYml0LCBvdXRfc2NhbGUpOworU2lTX0dlbmVyaWNfQ29udmVydENSRGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgY2hhciAqY3JkYXRhLAorCQkJaW50IHhyZXMsIGludCB5cmVzLAorI2lmZGVmIFNJU19YT1JHX1hGODYKKwkJCURpc3BsYXlNb2RlUHRyIGN1cnJlbnQKICNlbmRpZgotICAgfSBlbHNlIHsKLSAgICAgIFNpU0NhbGNDbG9jayhwU2NybiwgY2xvY2ssIDIsIHZjbGspOwotICAgICAgKCpwMmIpID0gKHZjbGtbVkxEaWR4XSA9PSAyKSA/IDB4ODAgOiAweDAwOwotICAgICAgKCpwMmIpIHw9ICh2Y2xrW01pZHhdIC0gMSkgJiAweDdmOwotICAgICAgKCpwMmMpID0gKHZjbGtbTmlkeF0gLSAxKSAmIDB4MWY7Ci0gICAgICBpZih2Y2xrW1BpZHhdIDw9IDQpIHsKLSAgICAgICAgIC8qIHBvc3RzY2FsZSAxLDIsMyw0ICovCi0gICAgICAgICAoKnAyYykgfD0gKCh2Y2xrW1BpZHhdIC0gMSkgJiAzKSA8PCA1OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIC8qIHBvc3RzY2FsZSA2LDggKi8KLSAgICAgICAgICgqcDJjKSB8PSAoKCh2Y2xrW1BpZHhdIC8gMikgLSAxKSAmIDMpIDw8IDU7Ci0JICgqcDJjKSB8PSAweDgwOwotICAgICAgfQotI2lmZGVmIFRXREVCVUcKLSAgICAgIHhmODZEcnZNc2cocFNjcm4tPnNjcm5JbmRleCwgWF9JTkZPLCAiQ2xvY2sgJWQ6IG4gJWQgZG4gJWQgZGl2ICVkIHNjICVkXG4iLAotICAgICAgICAJIGNsb2NrLCB2Y2xrW01pZHhdLCB2Y2xrW05pZHhdLCB2Y2xrW1ZMRGlkeF0sIHZjbGtbUGlkeF0pOworI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKKwkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBCT09MRUFOIHdyaXRlcmVzCiAjZW5kaWYKLSAgIH0KLX0KLQotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT0gWEZSRUU4Ni9YLk9SRyA9PT09PT09PT09PT09PT09PSAqLwotCi0vKiBIZWxwZXIgZnVuY3Rpb25zICovCi0KLSNpZmRlZiBMSU5VWF9YRjg2Ci0KLVVTSE9SVAotU2lTX0NoZWNrQnVpbGRDdXN0b21Nb2RlKFNjcm5JbmZvUHRyIHBTY3JuLCBEaXNwbGF5TW9kZVB0ciBtb2RlLCBpbnQgVkJGbGFncykKKykKIHsKLSAgIFNJU1B0ciBwU2lTID0gU0lTUFRSKHBTY3JuKTsKLSAgIGludCAgICBkZXB0aCA9IHBTaVMtPkN1cnJlbnRMYXlvdXQuYml0c1BlclBpeGVsOwotCi0gICBwU2lTLT5TaVNfUHItPkNNb2RlRmxhZyA9IDA7Ci0gICAKLSAgIHBTaVMtPlNpU19Qci0+Q0RDbG9jayA9IG1vZGUtPkNsb2NrOwotCi0gICBwU2lTLT5TaVNfUHItPkNIRGlzcGxheSA9IG1vZGUtPkhEaXNwbGF5OwotICAgcFNpUy0+U2lTX1ByLT5DSFN5bmNTdGFydCA9IG1vZGUtPkhTeW5jU3RhcnQ7Ci0gICBwU2lTLT5TaVNfUHItPkNIU3luY0VuZCA9IG1vZGUtPkhTeW5jRW5kOwotICAgcFNpUy0+U2lTX1ByLT5DSFRvdGFsID0gbW9kZS0+SFRvdGFsOwotCi0gICBwU2lTLT5TaVNfUHItPkNWRGlzcGxheSA9IG1vZGUtPlZEaXNwbGF5OwotICAgcFNpUy0+U2lTX1ByLT5DVlN5bmNTdGFydCA9IG1vZGUtPlZTeW5jU3RhcnQ7Ci0gICBwU2lTLT5TaVNfUHItPkNWU3luY0VuZCA9IG1vZGUtPlZTeW5jRW5kOwotICAgcFNpUy0+U2lTX1ByLT5DVlRvdGFsID0gbW9kZS0+VlRvdGFsOwotCi0gICBwU2lTLT5TaVNfUHItPkNGbGFncyA9IG1vZGUtPkZsYWdzOwotCi0gICBpZihwU2lTLT5TaVNfUHItPkNGbGFncyAmIFZfSU5URVJMQUNFKSB7Ci0gICAgICBwU2lTLT5TaVNfUHItPkNWRGlzcGxheSA+Pj0gMTsKLSAgICAgIHBTaVMtPlNpU19Qci0+Q1ZTeW5jU3RhcnQgPj49IDE7Ci0gICAgICBwU2lTLT5TaVNfUHItPkNWU3luY0VuZCA+Pj0gMTsKLSAgICAgIHBTaVMtPlNpU19Qci0+Q1ZUb3RhbCA+Pj0gMTsKLSAgIH0KLSAgIGlmKHBTaVMtPlNpU19Qci0+Q0ZsYWdzICYgVl9EQkxTQ0FOKSB7Ci0gICAgICAvKiBwU2lTLT5TaVNfUHItPkNEQ2xvY2sgPDw9IDE7ICovCi0gICAgICBwU2lTLT5TaVNfUHItPkNWRGlzcGxheSA8PD0gMTsKLSAgICAgIHBTaVMtPlNpU19Qci0+Q1ZTeW5jU3RhcnQgPDw9IDE7Ci0gICAgICBwU2lTLT5TaVNfUHItPkNWU3luY0VuZCA8PD0gMTsKLSAgICAgIHBTaVMtPlNpU19Qci0+Q1ZUb3RhbCA8PD0gMTsKLSAgIH0KLQotICAgcFNpUy0+U2lTX1ByLT5DSEJsYW5rU3RhcnQgPSBwU2lTLT5TaVNfUHItPkNIRGlzcGxheTsKLSAgIHBTaVMtPlNpU19Qci0+Q0hCbGFua0VuZCA9IHBTaVMtPlNpU19Qci0+Q0hUb3RhbDsKLSAgIHBTaVMtPlNpU19Qci0+Q1ZCbGFua1N0YXJ0ID0gcFNpUy0+U2lTX1ByLT5DVlN5bmNTdGFydCAtIDE7Ci0gICBwU2lTLT5TaVNfUHItPkNWQmxhbmtFbmQgPSBwU2lTLT5TaVNfUHItPkNWVG90YWw7Ci0KLSAgIFNpU19NYWtlQ2xvY2tSZWdzKHBTY3JuLCBwU2lTLT5TaVNfUHItPkNEQ2xvY2ssICZwU2lTLT5TaVNfUHItPkNTUjJCLCAmcFNpUy0+U2lTX1ByLT5DU1IyQyk7Ci0KLSAgIHBTaVMtPlNpU19Qci0+Q1NSQ2xvY2sgPSAocFNpUy0+U2lTX1ByLT5DRENsb2NrIC8gMTAwMCkgKyAxOwotCi0gICBTaVNfQ2FsY0NSUmVnaXN0ZXJzKHBTaVMtPlNpU19QciwgZGVwdGgpOwotCi0gICBzd2l0Y2goZGVwdGgpIHsKLSAgIGNhc2UgODogIHBTaVMtPlNpU19Qci0+Q01vZGVGbGFnIHw9IDB4MjIzYjsgYnJlYWs7Ci0gICBjYXNlIDE2OiBwU2lTLT5TaVNfUHItPkNNb2RlRmxhZyB8PSAweDIyN2Q7IGJyZWFrOwotICAgY2FzZSAzMjogcFNpUy0+U2lTX1ByLT5DTW9kZUZsYWcgfD0gMHgyMmZmOyBicmVhazsKLSAgIGRlZmF1bHQ6IHJldHVybiAwOwotICAgfQotCi0gICBpZihwU2lTLT5TaVNfUHItPkNGbGFncyAmIFZfREJMU0NBTikKLSAgICAgIHBTaVMtPlNpU19Qci0+Q01vZGVGbGFnIHw9IERvdWJsZVNjYW5Nb2RlOwotCi0gICBpZigocFNpUy0+U2lTX1ByLT5DVkRpc3BsYXkgPj0gMTAyNCkJfHwKLSAgICAgIChwU2lTLT5TaVNfUHItPkNWVG90YWwgPj0gMTAyNCkgICB8fAotICAgICAgKHBTaVMtPlNpU19Qci0+Q0hEaXNwbGF5ID49IDEwMjQpKQotICAgICAgcFNpUy0+U2lTX1ByLT5DTW9kZUZsYWcgfD0gTGluZUNvbXBhcmVPZmY7Ci0KLSAgIGlmKHBTaVMtPlNpU19Qci0+Q0ZsYWdzICYgVl9DTEtESVYyKQotICAgICAgcFNpUy0+U2lTX1ByLT5DTW9kZUZsYWcgfD0gSGFsZkRDTEs7Ci0KLSAgIHBTaVMtPlNpU19Qci0+Q0luZm9GbGFnID0gMHgwMDA3OwotCi0gICBpZihwU2lTLT5TaVNfUHItPkNGbGFncyAmIFZfTkhTWU5DKQotICAgICAgcFNpUy0+U2lTX1ByLT5DSW5mb0ZsYWcgfD0gMHg0MDAwOwotCi0gICBpZihwU2lTLT5TaVNfUHItPkNGbGFncyAmIFZfTlZTWU5DKQotICAgICAgcFNpUy0+U2lTX1ByLT5DSW5mb0ZsYWcgfD0gMHg4MDAwOwotCi0gICBpZihwU2lTLT5TaVNfUHItPkNGbGFncyAmIFZfSU5URVJMQUNFKQotICAgICAgcFNpUy0+U2lTX1ByLT5DSW5mb0ZsYWcgfD0gSW50ZXJsYWNlTW9kZTsKLQotICAgcFNpUy0+U2lTX1ByLT5Vc2VDdXN0b21Nb2RlID0gVFJVRTsKLSNpZmRlZiBUV0RFQlVHCi0gICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywgIkN1c3RvbSBtb2RlICVkeCVkOlxuIiwKLSAgIAlwU2lTLT5TaVNfUHItPkNIRGlzcGxheSxwU2lTLT5TaVNfUHItPkNWRGlzcGxheSk7Ci0gICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywgIk1vZGVmbGFnICUwNHgsIEluZm9mbGFnICUwNHhcbiIsCi0gICAJcFNpUy0+U2lTX1ByLT5DTW9kZUZsYWcsIHBTaVMtPlNpU19Qci0+Q0luZm9GbGFnKTsKLSAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiIHt7MHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCxcbiIsCi0gICAJcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbMF0sIHBTaVMtPlNpU19Qci0+Q0NSVDFDUlRDWzFdLAotCXBTaVMtPlNpU19Qci0+Q0NSVDFDUlRDWzJdLCBwU2lTLT5TaVNfUHItPkNDUlQxQ1JUQ1szXSwKLQlwU2lTLT5TaVNfUHItPkNDUlQxQ1JUQ1s0XSwgcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbNV0sCi0JcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbNl0sIHBTaVMtPlNpU19Qci0+Q0NSVDFDUlRDWzddKTsKLSAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiICAweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LFxuIiwKLSAgIAlwU2lTLT5TaVNfUHItPkNDUlQxQ1JUQ1s4XSwgcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbOV0sCi0JcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbMTBdLCBwU2lTLT5TaVNfUHItPkNDUlQxQ1JUQ1sxMV0sCi0JcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbMTJdLCBwU2lTLT5TaVNfUHItPkNDUlQxQ1JUQ1sxM10sCi0JcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbMTRdLCBwU2lTLT5TaVNfUHItPkNDUlQxQ1JUQ1sxNV0pOwotICAgeGY4NkRydk1zZygwLCBYX0lORk8sICIgIDB4JTAyeH19LFxuIiwgcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbMTZdKTsKLSAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiQ2xvY2s6IDB4JTAyeCwgMHglMDJ4LCAlZFxuIiwKLSAgIAlwU2lTLT5TaVNfUHItPkNTUjJCLCBwU2lTLT5TaVNfUHItPkNTUjJDLCBwU2lTLT5TaVNfUHItPkNTUkNsb2NrKTsKLSNlbmRpZgotICAgcmV0dXJuIDE7Ci19Ci0KLWludAotU2lTX0ZpbmRQYW5lbEZyb21EQihTSVNQdHIgcFNpUywgVVNIT1JUIHBhbmVsdmVuZG9yLCBVU0hPUlQgcGFuZWxwcm9kdWN0LCBpbnQgKm1heHgsIGludCAqbWF4eSwgaW50ICpwcmVmeCwgaW50ICpwcmVmeSkKLXsKLSAgIGludCBpLCBqOwotICAgQk9PTEVBTiBkb25lID0gRkFMU0U7Ci0KLSAgIGkgPSAwOwotICAgd2hpbGUoKCFkb25lKSAmJiAoU2lTX1BsYXNtYVRhYmxlW2ldLnZlbmRvcikgJiYgcGFuZWx2ZW5kb3IpIHsKLSAgICAgIGlmKFNpU19QbGFzbWFUYWJsZVtpXS52ZW5kb3IgPT0gcGFuZWx2ZW5kb3IpIHsKLSAgICAgICAgIGZvcihqPTA7IGo8U2lTX1BsYXNtYVRhYmxlW2ldLnByb2R1Y3RudW07IGorKykgewotCSAgICBpZihTaVNfUGxhc21hVGFibGVbaV0ucHJvZHVjdFtqXSA9PSBwYW5lbHByb2R1Y3QpIHsKLQkgICAgICAgaWYoU2lTX1BsYXNtYVRhYmxlW2ldLm1heHggJiYgU2lTX1BsYXNtYVRhYmxlW2ldLm1heHkpIHsKLQkgICAgICAgICAgKCptYXh4KSA9IChpbnQpU2lTX1BsYXNtYVRhYmxlW2ldLm1heHg7Ci0JCSAgKCptYXh5KSA9IChpbnQpU2lTX1BsYXNtYVRhYmxlW2ldLm1heHk7Ci0JCSAgKCpwcmVmeCkgPSAoaW50KVNpU19QbGFzbWFUYWJsZVtpXS5wcmVmeDsKLQkJICAoKnByZWZ5KSA9IChpbnQpU2lTX1BsYXNtYVRhYmxlW2ldLnByZWZ5OwotCQkgIGRvbmUgPSBUUlVFOwotCQkgIHhmODZEcnZNc2cocFNpUy0+cFNjcm4tPnNjcm5JbmRleCwgWF9QUk9CRUQsCi0JICAgICAgIAkgICAgICAgICJJZGVudGlmaWVkICVzLCBjb3JyZWN0aW5nIG1heCBYIHJlcyAlZCwgbWF4IFkgcmVzICVkXG4iLAotCQkJIFNpU19QbGFzbWFUYWJsZVtpXS5wbGFzbWFuYW1lLAotCQkgICAgICAgICBTaVNfUGxhc21hVGFibGVbaV0ubWF4eCwgU2lTX1BsYXNtYVRhYmxlW2ldLm1heHkpOwotCSAgICAgICAgICBicmVhazsKLQkgICAgICAgfQotIAkgICAgfQotCSB9Ci0gICAgICB9Ci0gICAgICBpKys7Ci0gICB9Ci0gICByZXR1cm4gKGRvbmUpID8gMSA6IDA7Ci19Ci0KLS8qIEJ1aWxkIGEgbGlzdCBvZiBzdXBwb3J0ZWQgbW9kZXM6Ci0gKiBCdWlsdC1pbiBtb2RlcyBmb3Igd2hpY2ggd2UgaGF2ZSBhbGwgZGF0YSBhcmUgTV9UX0RFRkFVTFQsCi0gKiBtb2RlcyBkZXJpdmVkIGZyb20gRERDIG9yIGRhdGFiYXNlIGRhdGEgYXJlIE1fVF9CVUlMVElOCi0gKi8KLURpc3BsYXlNb2RlUHRyCi1TaVNCdWlsZEJ1aWx0SW5Nb2RlTGlzdChTY3JuSW5mb1B0ciBwU2NybiwgQk9PTEVBTiBpbmNsdWRlbGNkbW9kZXMsIEJPT0xFQU4gaXNmb3JkdmkpCi17Ci0gICBTSVNQdHIgICAgICAgICBwU2lTID0gU0lTUFRSKHBTY3JuKTsKLSAgIHVuc2lnbmVkIHNob3J0IFZSRSwgVkJFLCBWUlMsIFZCUywgVkRFLCBWVDsKICAgIHVuc2lnbmVkIHNob3J0IEhSRSwgSEJFLCBIUlMsIEhCUywgSERFLCBIVDsKLSAgIHVuc2lnbmVkIGNoYXIgIHNyX2RhdGEsIGNyX2RhdGEsIGNyX2RhdGEyLCBjcl9kYXRhMzsKLSAgIHVuc2lnbmVkIGNoYXIgIHNyMmIsIHNyMmM7Ci0gICBmbG9hdCAgICAgICAgICBudW0sIGRlbnVtLCBwb3N0c2NhbGFyLCBkaXZpZGVyOwotICAgaW50ICAgICAgICAgICAgQSwgQiwgQywgRCwgRSwgRiwgdGVtcCwgaSwgaiwgaywgbCwgaW5kZXgsIHZjbGtpbmRleDsKLSAgIERpc3BsYXlNb2RlUHRyIG5ldyA9IE5VTEwsIGN1cnJlbnQgPSBOVUxMLCBmaXJzdCA9IE5VTEw7Ci0gICBCT09MRUFOICAgICAgICBkb25lID0gRkFMU0U7Ci0jaWYgMAotICAgRGlzcGxheU1vZGVQdHIgYmFja3VwID0gTlVMTDsKLSNlbmRpZgorICAgdW5zaWduZWQgc2hvcnQgVlJFLCBWQkUsIFZSUywgVkJTLCBWREUsIFZUOworICAgdW5zaWduZWQgY2hhciAgc3JfZGF0YSwgY3JfZGF0YSwgY3JfZGF0YTI7CisgICBpbnQgICAgICAgICAgICBBLCBCLCBDLCBELCBFLCBGLCB0ZW1wOwogCi0gICBwU2lTLT5iYWNrdXBtb2RlbGlzdCA9IE5VTEw7Ci0gICBwU2lTLT5BZGRlZFBsYXNtYU1vZGVzID0gRkFMU0U7CisgICBzcl9kYXRhID0gY3JkYXRhWzE0XTsKIAotICAgLyogSW5pdGlhbGl6ZSBvdXIgcG9pbnRlcnMgKi8KLSAgIGlmKHBTaVMtPlZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotI2lmZGVmIFNJUzMwMAotICAgICAgSW5pdFRvMzAwUG9pbnRlcihwU2lTLT5TaVNfUHIsICZwU2lTLT5zaXNod19leHQpOwotI2Vsc2UKLSAgICAgIHJldHVybiBOVUxMOwotI2VuZGlmCi0gICB9IGVsc2UgaWYocFNpUy0+VkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0jaWZkZWYgU0lTMzE1SAotICAgICAgSW5pdFRvMzEwUG9pbnRlcihwU2lTLT5TaVNfUHIsICZwU2lTLT5zaXNod19leHQpOwotI2Vsc2UKLSAgICAgIHJldHVybiBOVUxMOwotI2VuZGlmCi0gICB9IGVsc2UgcmV0dXJuIE5VTEw7CisgICAvKiBIb3Jpem9udGFsIHRvdGFsICovCisgICBIVCA9ICBjcmRhdGFbMF0gfCAoKHVuc2lnbmVkIHNob3J0KShzcl9kYXRhICYgMHgwMykgPDwgOCk7CisgICBBID0gSFQgKyA1OwogCi0gICBpID0gMDsKLSAgIHdoaWxlKHBTaVMtPlNpU19Qci0+U2lTX1JlZkluZGV4W2ldLkV4dF9JbmZvRmxhZyAhPSAweEZGRkYpIHsKKyAgIC8qIEhvcml6b250YWwgZGlzcGxheSBlbmFibGUgZW5kICovCisgICBIREUgPSBjcmRhdGFbMV0gfCAoKHVuc2lnbmVkIHNob3J0KShzcl9kYXRhICYgMHgwQykgPDwgNik7CisgICBFID0gSERFICsgMTsKIAotICAgICAgaW5kZXggPSBwU2lTLT5TaVNfUHItPlNpU19SZWZJbmRleFtpXS5FeHRfQ1JUMUNSVEM7CisgICAvKiBIb3Jpem9udGFsIHJldHJhY2UgKD1zeW5jKSBzdGFydCAqLworICAgSFJTID0gY3JkYXRhWzRdIHwgKCh1bnNpZ25lZCBzaG9ydCkoc3JfZGF0YSAmIDB4QzApIDw8IDIpOworICAgRiA9IEhSUyAtIEUgLSAzOwogCi0gICAgICAvKiAweDVhICgzMjB4MjQwKSBpcyBhIHB1cmUgRlRTTiBtb2RlLCBub3QgRFNUTiEgKi8KLSAgICAgIGlmKCghcFNpUy0+RlNUTikgJiYKLQkgKHBTaVMtPlNpU19Qci0+U2lTX1JlZkluZGV4W2ldLk1vZGVJRCA9PSAweDVhKSkgIHsKLSAgICAgICAgICAgaSsrOwotICAgICAgCSAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYoKHBTaVMtPkZTVE4pICYmCi0gICAgICAgICAocFNpUy0+U2lTX1ByLT5TaVNfUmVmSW5kZXhbaV0uWFJlcyA9PSAzMjApICYmCi0JIChwU2lTLT5TaVNfUHItPlNpU19SZWZJbmRleFtpXS5ZUmVzID09IDI0MCkgJiYKLQkgKHBTaVMtPlNpU19Qci0+U2lTX1JlZkluZGV4W2ldLk1vZGVJRCAhPSAweDVhKSkgewotCSAgIGkrKzsKLQkgICBjb250aW51ZTsKLSAgICAgIH0KKyAgIC8qIEhvcml6b250YWwgYmxhbmsgc3RhcnQgKi8KKyAgIEhCUyA9IGNyZGF0YVsyXSB8ICgodW5zaWduZWQgc2hvcnQpKHNyX2RhdGEgJiAweDMwKSA8PCA0KTsKIAotICAgICAgaWYoIShuZXcgPSB4YWxsb2Moc2l6ZW9mKERpc3BsYXlNb2RlUmVjKSkpKSByZXR1cm4gZmlyc3Q7Ci0gICAgICBtZW1zZXQobmV3LCAwLCBzaXplb2YoRGlzcGxheU1vZGVSZWMpKTsKLSAgICAgIGlmKCEobmV3LT5uYW1lID0geGFsbG9jKDEwKSkpIHsKLSAgICAgIAkJeGZyZWUobmV3KTsKLQkJcmV0dXJuIGZpcnN0OwotICAgICAgfQotICAgICAgaWYoIWZpcnN0KSBmaXJzdCA9IG5ldzsKLSAgICAgIGlmKGN1cnJlbnQpIHsKLSAgICAgICAgIGN1cnJlbnQtPm5leHQgPSBuZXc7Ci0JIG5ldy0+cHJldiA9IGN1cnJlbnQ7Ci0gICAgICB9CisgICBzcl9kYXRhID0gY3JkYXRhWzE1XTsKKyAgIGNyX2RhdGEgPSBjcmRhdGFbNV07CiAKLSAgICAgIGN1cnJlbnQgPSBuZXc7CisgICAvKiBIb3Jpem9udGFsIGJsYW5rIGVuZCAqLworICAgSEJFID0gKGNyZGF0YVszXSAmIDB4MWYpIHwKKyAgICAgICAgICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEgJiAweDgwKSA+PiAyKSB8CisgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KShzcl9kYXRhICYgMHgwMykgPDwgNik7CiAKLSAgICAgIHNwcmludGYoY3VycmVudC0+bmFtZSwgIiVkeCVkIiwgcFNpUy0+U2lTX1ByLT5TaVNfUmVmSW5kZXhbaV0uWFJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpUy0+U2lTX1ByLT5TaVNfUmVmSW5kZXhbaV0uWVJlcyk7CisgICAvKiBIb3Jpem9udGFsIHJldHJhY2UgKD1zeW5jKSBlbmQgKi8KKyAgIEhSRSA9IChjcl9kYXRhICYgMHgxZikgfCAoKHNyX2RhdGEgJiAweDA0KSA8PCAzKTsKIAotICAgICAgY3VycmVudC0+c3RhdHVzID0gTU9ERV9PSzsKKyAgIHRlbXAgPSBIQkUgLSAoKEUgLSAxKSAmIDI1NSk7CisgICBCID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDI1Nik7CiAKLSAgICAgIGN1cnJlbnQtPnR5cGUgPSBNX1RfREVGQVVMVDsKKyAgIHRlbXAgPSBIUkUgLSAoKEUgKyBGICsgMykgJiA2Myk7CisgICBDID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDY0KTsKIAotICAgICAgdmNsa2luZGV4ID0gcFNpUy0+U2lTX1ByLT5TaVNfUmVmSW5kZXhbaV0uRXh0X0NSVFZDTEs7Ci0gICAgICBpZihwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHZjbGtpbmRleCAmPSAweDNGOworICAgRCA9IEIgLSBGIC0gQzsKIAotICAgICAgc3IyYiA9IHBTaVMtPlNpU19Qci0+U2lTX1ZDTEtEYXRhW3ZjbGtpbmRleF0uU1IyQjsKLSAgICAgIHNyMmMgPSBwU2lTLT5TaVNfUHItPlNpU19WQ0xLRGF0YVt2Y2xraW5kZXhdLlNSMkM7Ci0KLSAgICAgIGRpdmlkZXIgPSAoc3IyYiAmIDB4ODApID8gMi4wIDogMS4wOwotICAgICAgcG9zdHNjYWxhciA9IChzcjJjICYgMHg4MCkgPwotICAgICAgICAgICAgICAoICgoKHNyMmMgPj4gNSkgJiAweDAzKSA9PSAweDAyKSA/IDYuMCA6IDguMCkgOiAoKChzcjJjID4+IDUpICYgMHgwMykgKyAxLjApOwotICAgICAgbnVtID0gKHNyMmIgJiAweDdmKSArIDEuMDsKLSAgICAgIGRlbnVtID0gKHNyMmMgJiAweDFmKSArIDEuMDsKLQorI2lmZGVmIFNJU19YT1JHX1hGODYKKyAgIGN1cnJlbnQtPkhEaXNwbGF5ICAgPSAoRSAqIDgpOworICAgY3VycmVudC0+SFN5bmNTdGFydCA9IChFICogOCkgKyAoRiAqIDgpOworICAgY3VycmVudC0+SFN5bmNFbmQgICA9IChFICogOCkgKyAoRiAqIDgpICsgKEMgKiA4KTsKKyAgIGN1cnJlbnQtPkhUb3RhbCAgICAgPSAoRSAqIDgpICsgKEYgKiA4KSArIChDICogOCkgKyAoRCAqIDgpOwogI2lmZGVmIFRXREVCVUcKLSAgICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiLS0tLS0tLS0tLS0tXG4iKTsKLSAgICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAic3IyYjogJXggc3IyYyAleCBkaXYgJWYgcHMgJWYgbnVtICVmIGRlbnVtICVmXG4iLAotICAgICAgICAgc3IyYiwgc3IyYywgZGl2aWRlciwgcG9zdHNjYWxhciwgbnVtLCBkZW51bSk7Ci0jZW5kaWYKLQotICAgICAgY3VycmVudC0+Q2xvY2sgPSAoaW50KSgxNDMxOCAqIChkaXZpZGVyIC8gcG9zdHNjYWxhcikgKiAobnVtIC8gZGVudW0pKTsKLQotICAgICAgc3JfZGF0YSA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTRdOwotCS8qIGluU0lTSURYUkVHKFNJU1NSLCAweDBiLCBzcl9kYXRhKTsgKi8KLQotICAgICAgY3JfZGF0YSA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMF07Ci0JLyogaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDAsIGNyX2RhdGEpOyAqLwotCi0gICAgICAvKiBIb3Jpem9udGFsIHRvdGFsICovCi0gICAgICBIVCA9IChjcl9kYXRhICYgMHhmZikgfAotICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MDMpIDw8IDgpOwotICAgICAgQSA9IEhUICsgNTsKLQotICAgICAgY3JfZGF0YSA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMV07Ci0JLyogaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDEsIGNyX2RhdGEpOyAqLwotCi0gICAgICAvKiBIb3Jpem9udGFsIGRpc3BsYXkgZW5hYmxlIGVuZCAqLwotICAgICAgSERFID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MEMpIDw8IDYpOwotICAgICAgRSA9IEhERSArIDE7ICAvKiAweDgwIDB4NjQgKi8KLQotICAgICAgY3JfZGF0YSA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbNF07Ci0JLyogaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDQsIGNyX2RhdGEpOyAqLwotCi0gICAgICAvKiBIb3Jpem9udGFsIHJldHJhY2UgKD1zeW5jKSBzdGFydCAqLwotICAgICAgSFJTID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4QzApIDw8IDIpOwotICAgICAgRiA9IEhSUyAtIEUgLSAzOyAgLyogMHgwNiAweDA2ICovCi0KLSAgICAgIGNyX2RhdGEgPSBwU2lTLT5TaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzJdOwotCS8qIGluU0lTSURYUkVHKFNJU0NSLCAweDAyLCBjcl9kYXRhKTsgKi8KLQotICAgICAgLyogSG9yaXpvbnRhbCBibGFuayBzdGFydCAqLwotICAgICAgSEJTID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MzApIDw8IDQpOwotCi0gICAgICBzcl9kYXRhID0gcFNpUy0+U2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlsxNV07Ci0JLyogaW5TSVNJRFhSRUcoU0lTU1IsIDB4MGMsIHNyX2RhdGEpOyAqLwotCi0gICAgICBjcl9kYXRhID0gcFNpUy0+U2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlszXTsKLQkvKiBpblNJU0lEWFJFRyhTSVNDUiwgMHgwMywgY3JfZGF0YSk7ICAqLwotCi0gICAgICBjcl9kYXRhMiA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbNV07Ci0JLyogaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDUsIGNyX2RhdGEyKTsgKi8KLQotICAgICAgLyogSG9yaXpvbnRhbCBibGFuayBlbmQgKi8KLSAgICAgIEhCRSA9IChjcl9kYXRhICYgMHgxZikgfAotICAgICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKGNyX2RhdGEyICYgMHg4MCkgPj4gMikgfAotCSAgICAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MDMpIDw8IDYpOwotCi0gICAgICAvKiBIb3Jpem9udGFsIHJldHJhY2UgKD1zeW5jKSBlbmQgKi8KLSAgICAgIEhSRSA9IChjcl9kYXRhMiAmIDB4MWYpIHwgKChzcl9kYXRhICYgMHgwNCkgPDwgMyk7Ci0KLSAgICAgIHRlbXAgPSBIQkUgLSAoKEUgLSAxKSAmIDI1NSk7Ci0gICAgICBCID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDI1Nik7Ci0KLSAgICAgIHRlbXAgPSBIUkUgLSAoKEUgKyBGICsgMykgJiA2Myk7Ci0gICAgICBDID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDY0KTsgLyogMHgwYiAweDBiICovCi0KLSAgICAgIEQgPSBCIC0gRiAtIEM7Ci0KLSAgICAgIGlmKChwU2lTLT5TaVNfUHItPlNpU19SZWZJbmRleFtpXS5YUmVzID09IDMyMCkgJiYKLQkgKChwU2lTLT5TaVNfUHItPlNpU19SZWZJbmRleFtpXS5ZUmVzID09IDIwMCkgfHwKLQkgIChwU2lTLT5TaVNfUHItPlNpU19SZWZJbmRleFtpXS5ZUmVzID09IDI0MCkpKSB7Ci0KLQkgLyogVGVycmlibGUgaGFjaywgYnV0IGNvcnJlY3QgQ1JUQyBkYXRhIGZvcgotCSAgKiB0aGVzZSBtb2RlcyBvbmx5IHByb2R1Y2VzIGEgYmxhY2sgc2NyZWVuLi4uCi0JICAqIChIUkUgaXMgMCwgbGVhZGluZyBpbnRvIGEgdG9vIGxhcmdlIEMgYW5kCi0JICAqIGEgbmVnYXRpdmUgRC4gVGhlIENSVCBjb250cm9sbGVyIGRvZXMgbm90Ci0JICAqIHNlZW0gdG8gbGlrZSBjb3JyZWN0aW5nIEhSRSB0byA1MAotCSAgKi8KLQkgY3VycmVudC0+SERpc3BsYXkgICA9IDMyMDsKLSAgICAgICAgIGN1cnJlbnQtPkhTeW5jU3RhcnQgPSAzMjg7Ci0gICAgICAgICBjdXJyZW50LT5IU3luY0VuZCAgID0gMzc2OwotICAgICAgICAgY3VycmVudC0+SFRvdGFsICAgICA9IDQwMDsKLQotICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgY3VycmVudC0+SERpc3BsYXkgICA9IChFICogOCk7Ci0gICAgICAgICBjdXJyZW50LT5IU3luY1N0YXJ0ID0gKEUgKiA4KSArIChGICogOCk7Ci0gICAgICAgICBjdXJyZW50LT5IU3luY0VuZCAgID0gKEUgKiA4KSArIChGICogOCkgKyAoQyAqIDgpOwotICAgICAgICAgY3VycmVudC0+SFRvdGFsICAgICA9IChFICogOCkgKyAoRiAqIDgpICsgKEMgKiA4KSArIChEICogOCk7Ci0KLSAgICAgIH0KLQotI2lmZGVmIFRXREVCVUcKLSAgICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLAotICAgICAgICAiSDogQSAlZCBCICVkIEMgJWQgRCAlZCBFICVkIEYgJWQgIEhUICVkIEhERSAlZCBIUlMgJWQgSEJTICVkIEhCRSAlZCBIUkUgJWRcbiIsCi0gICAgICAJQSwgQiwgQywgRCwgRSwgRiwgSFQsIEhERSwgSFJTLCBIQlMsIEhCRSwgSFJFKTsKLSNlbmRpZgotCi0gICAgICBzcl9kYXRhID0gcFNpUy0+U2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlsxM107Ci0JLyogaW5TSVNJRFhSRUcoU0lTU1IsIDB4MEEsIHNyX2RhdGEpOyAqLwotCi0gICAgICBjcl9kYXRhID0gcFNpUy0+U2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUls2XTsKLSAgICAgICAgLyogaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDYsIGNyX2RhdGEpOyAqLwotCi0gICAgICBjcl9kYXRhMiA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbN107Ci0gICAgICAgIC8qIGluU0lTSURYUkVHKFNJU0NSLCAweDA3LCBjcl9kYXRhMik7ICAqLwotCi0gICAgICAvKiBWZXJ0aWNhbCB0b3RhbCAqLwotICAgICAgVlQgPSAoY3JfZGF0YSAmIDB4RkYpIHwKLSAgICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKGNyX2RhdGEyICYgMHgwMSkgPDwgOCkgfAotCSAgICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEyICYgMHgyMCkgPDwgNCkgfAotCSAgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgwMSkgPDwgMTApOwotICAgICAgQSA9IFZUICsgMjsKLQotICAgICAgY3JfZGF0YSA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTBdOwotCS8qIGluU0lTSURYUkVHKFNJU0NSLCAweDEyLCBjcl9kYXRhKTsgICovCi0KLSAgICAgIC8qIFZlcnRpY2FsIGRpc3BsYXkgZW5hYmxlIGVuZCAqLwotICAgICAgVkRFID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KSAoY3JfZGF0YTIgJiAweDAyKSA8PCA3KSB8Ci0JICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4NDApIDw8IDMpIHwKLQkgICAgKCh1bnNpZ25lZCBzaG9ydCkgKHNyX2RhdGEgJiAweDAyKSA8PCA5KTsKLSAgICAgIEUgPSBWREUgKyAxOwotCi0gICAgICBjcl9kYXRhID0gcFNpUy0+U2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUls4XTsKLQkvKiBpblNJU0lEWFJFRyhTSVNDUiwgMHgxMCwgY3JfZGF0YSk7ICovCi0KLSAgICAgIC8qIFZlcnRpY2FsIHJldHJhY2UgKD1zeW5jKSBzdGFydCAqLwotICAgICAgVlJTID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KSAoY3JfZGF0YTIgJiAweDA0KSA8PCA2KSB8Ci0JICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4ODApIDw8IDIpIHwKLQkgICAgKCh1bnNpZ25lZCBzaG9ydCkgKHNyX2RhdGEgJiAweDA4KSA8PCA3KTsKLSAgICAgIEYgPSBWUlMgKyAxIC0gRTsKLQotICAgICAgY3JfZGF0YSA9ICBwU2lTLT5TaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzExXTsKLQkvKiBpblNJU0lEWFJFRyhTSVNDUiwgMHgxNSwgY3JfZGF0YSk7ICAqLwotCi0gICAgICBjcl9kYXRhMyA9IChwU2lTLT5TaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzE2XSAmIDB4MDEpIDw8IDU7Ci0JLyogaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDksIGNyX2RhdGEzKTsgICovCi0KLSAgICAgIC8qIFZlcnRpY2FsIGJsYW5rIHN0YXJ0ICovCi0gICAgICBWQlMgPSAoY3JfZGF0YSAmIDB4ZmYpIHwKLSAgICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4MDgpIDw8IDUpIHwKLQkgICAgKCh1bnNpZ25lZCBzaG9ydCkgKGNyX2RhdGEzICYgMHgyMCkgPDwgNCkgfAotCSAgICAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MDQpIDw8IDgpOwotCi0gICAgICBjcl9kYXRhID0gIHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTJdOwotCS8qIGluU0lTSURYUkVHKFNJU0NSLCAweDE2LCBjcl9kYXRhKTsgKi8KLQotICAgICAgLyogVmVydGljYWwgYmxhbmsgZW5kICovCi0gICAgICBWQkUgPSAoY3JfZGF0YSAmIDB4ZmYpIHwKLSAgICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgxMCkgPDwgNCk7Ci0gICAgICB0ZW1wID0gVkJFIC0gKChFIC0gMSkgJiA1MTEpOwotICAgICAgQiA9ICh0ZW1wID4gMCkgPyB0ZW1wIDogKHRlbXAgKyA1MTIpOwotCi0gICAgICBjcl9kYXRhID0gcFNpUy0+U2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUls5XTsKLQkvKiBpblNJU0lEWFJFRyhTSVNDUiwgMHgxMSwgY3JfZGF0YSk7ICovCi0KLSAgICAgIC8qIFZlcnRpY2FsIHJldHJhY2UgKD1zeW5jKSBlbmQgKi8KLSAgICAgIFZSRSA9IChjcl9kYXRhICYgMHgwZikgfCAoKHNyX2RhdGEgJiAweDIwKSA+PiAxKTsKLSAgICAgIHRlbXAgPSBWUkUgLSAoKEUgKyBGIC0gMSkgJiAzMSk7Ci0gICAgICBDID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDMyKTsKLQotICAgICAgRCA9IEIgLSBGIC0gQzsKLQotICAgICAgY3VycmVudC0+VkRpc3BsYXkgICA9IFZERSArIDE7Ci0gICAgICBjdXJyZW50LT5WU3luY1N0YXJ0ID0gVlJTICsgMTsKLSAgICAgIGN1cnJlbnQtPlZTeW5jRW5kICAgPSAoKFZSUyAmIH4weDFmKSB8IFZSRSkgKyAxOwotICAgICAgaWYoVlJFIDw9IChWUlMgJiAweDFmKSkgY3VycmVudC0+VlN5bmNFbmQgKz0gMzI7Ci0gICAgICBjdXJyZW50LT5WVG90YWwgICAgID0gRSArIEQgKyBDICsgRjsKLQotI2lmIDAKLSAgICAgIGN1cnJlbnQtPlZEaXNwbGF5ICAgPSBFOwotICAgICAgY3VycmVudC0+VlN5bmNTdGFydCA9IEUgKyBEOwotICAgICAgY3VycmVudC0+VlN5bmNFbmQgICA9IEUgKyBEICsgQzsKLSAgICAgIGN1cnJlbnQtPlZUb3RhbCAgICAgPSBFICsgRCArIEMgKyBGOwotI2VuZGlmCi0KLSNpZmRlZiBUV0RFQlVHCi0gICAgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywKLSAgICAgICAgIlY6IEEgJWQgQiAlZCBDICVkIEQgJWQgRSAlZCBGICVkICBWVCAlZCBWREUgJWQgVlJTICVkIFZCUyAlZCBWQkUgJWQgVlJFICVkXG4iLAotICAgICAgCUEsIEIsIEMsIEQsIEUsIEYsIFZULCBWREUsIFZSUywgVkJTLCBWQkUsIFZSRSk7Ci0jZW5kaWYKLQotICAgICAgaWYocFNpUy0+U2lTX1ByLT5TaVNfUmVmSW5kZXhbaV0uRXh0X0luZm9GbGFnICYgMHg0MDAwKQotICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfTkhTWU5DOwotICAgICAgZWxzZQotICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfUEhTWU5DOwotCi0gICAgICBpZihwU2lTLT5TaVNfUHItPlNpU19SZWZJbmRleFtpXS5FeHRfSW5mb0ZsYWcgJiAweDgwMDApCi0gICAgICAJICBjdXJyZW50LT5GbGFncyB8PSBWX05WU1lOQzsKLSAgICAgIGVsc2UKLSAgICAgICAgICBjdXJyZW50LT5GbGFncyB8PSBWX1BWU1lOQzsKLQotICAgICAgaWYocFNpUy0+U2lTX1ByLT5TaVNfUmVmSW5kZXhbaV0uRXh0X0luZm9GbGFnICYgMHgwMDgwKQotICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfSU5URVJMQUNFOwotCi0gICAgICBqID0gMDsKLSAgICAgIHdoaWxlKHBTaVMtPlNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtqXS5FeHRfTW9kZUlEICE9IDB4ZmYpIHsKLSAgICAgICAgICBpZihwU2lTLT5TaVNfUHItPlNpU19FTW9kZUlEVGFibGVbal0uRXh0X01vZGVJRCA9PQotCSAgICAgICAgICAgICAgICAgIHBTaVMtPlNpU19Qci0+U2lTX1JlZkluZGV4W2ldLk1vZGVJRCkgewotICAgICAgICAgICAgICBpZihwU2lTLT5TaVNfUHItPlNpU19FTW9kZUlEVGFibGVbal0uRXh0X01vZGVGbGFnICYgRG91YmxlU2Nhbk1vZGUpIHsKLQkgICAgICAJICBjdXJyZW50LT5GbGFncyB8PSBWX0RCTFNDQU47Ci0gICAgICAgICAgICAgIH0KLQkgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0JICBqKys7Ci0gICAgICB9Ci0KLSAgICAgIGlmKGN1cnJlbnQtPkZsYWdzICYgVl9JTlRFUkxBQ0UpIHsKLSAgICAgICAgIGN1cnJlbnQtPlZEaXNwbGF5IDw8PSAxOwotCSBjdXJyZW50LT5WU3luY1N0YXJ0IDw8PSAxOwotCSBjdXJyZW50LT5WU3luY0VuZCA8PD0gMTsKLQkgY3VycmVudC0+VlRvdGFsIDw8PSAxOwotCSBjdXJyZW50LT5WVG90YWwgfD0gMTsKLSAgICAgIH0KLSAgICAgIGlmKGN1cnJlbnQtPkZsYWdzICYgVl9EQkxTQ0FOKSB7Ci0gICAgICAgICBjdXJyZW50LT5DbG9jayA+Pj0gMTsKLQkgY3VycmVudC0+VkRpc3BsYXkgPj49IDE7Ci0JIGN1cnJlbnQtPlZTeW5jU3RhcnQgPj49IDE7Ci0JIGN1cnJlbnQtPlZTeW5jRW5kID4+PSAxOwotCSBjdXJyZW50LT5WVG90YWwgPj49IDE7Ci0gICAgICB9Ci0KLSNpZmRlZiBUV0RFQlVHCi0gICAgICB4Zjg2RHJ2TXNnKHBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywKLSAgICAgIAkiQnVpbHQtaW46ICVzICUuMmYgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCi0JY3VycmVudC0+bmFtZSwgKGZsb2F0KWN1cnJlbnQtPkNsb2NrIC8gMTAwMCwKLQljdXJyZW50LT5IRGlzcGxheSwgY3VycmVudC0+SFN5bmNTdGFydCwgY3VycmVudC0+SFN5bmNFbmQsIGN1cnJlbnQtPkhUb3RhbCwKLQljdXJyZW50LT5WRGlzcGxheSwgY3VycmVudC0+VlN5bmNTdGFydCwgY3VycmVudC0+VlN5bmNFbmQsIGN1cnJlbnQtPlZUb3RhbCk7CisgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywKKwkJIkg6IEEgJWQgQiAlZCBDICVkIEQgJWQgRSAlZCBGICVkICBIVCAlZCBIREUgJWQgSFJTICVkIEhCUyAlZCBIQkUgJWQgSFJFICVkXG4iLAorCQlBLCBCLCBDLCBELCBFLCBGLCBIVCwgSERFLCBIUlMsIEhCUywgSEJFLCBIUkUpOwogI2Vsc2UKLSAgICAgICAgKHZvaWQpVkJTOyAgKHZvaWQpSEJTOyAgKHZvaWQpQTsKKyAgICh2b2lkKVZCUzsgICh2b2lkKUhCUzsgICh2b2lkKUE7CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKKyAgIGlmKHdyaXRlcmVzKSB2YXItPnhyZXMgPSB4cmVzID0gRSAqIDg7CisgICB2YXItPmxlZnRfbWFyZ2luID0gRCAqIDg7CisgICB2YXItPnJpZ2h0X21hcmdpbiA9IEYgKiA4OworICAgdmFyLT5oc3luY19sZW4gPSBDICogODsKICNlbmRpZgogCi0gICAgICBpKys7Ci0gICB9CisgICAvKiBWZXJ0aWNhbCAqLworICAgc3JfZGF0YSA9IGNyZGF0YVsxM107CisgICBjcl9kYXRhID0gY3JkYXRhWzddOwogCi0gICAvKiBBZGQgbm9uLXN0YW5kYXJkIExDRCBtb2RlcyBmb3IgcGFuZWwncyBkZXRhaWxlZCB0aW1pbmdzICovCisgICAvKiBWZXJ0aWNhbCB0b3RhbCAqLworICAgVlQgID0gY3JkYXRhWzZdIHwKKwkgKCh1bnNpZ25lZCBzaG9ydCkoY3JfZGF0YSAmIDB4MDEpIDw8IDgpIHwKKwkgKCh1bnNpZ25lZCBzaG9ydCkoY3JfZGF0YSAmIDB4MjApIDw8IDQpIHwKKwkgKCh1bnNpZ25lZCBzaG9ydCkoc3JfZGF0YSAmIDB4MDEpIDw8IDEwKTsKKyAgIEEgPSBWVCArIDI7CiAKLSAgIGlmKCFpbmNsdWRlbGNkbW9kZXMpIHJldHVybiBmaXJzdDsKKyAgIC8qIFZlcnRpY2FsIGRpc3BsYXkgZW5hYmxlIGVuZCAqLworICAgVkRFID0gY3JkYXRhWzEwXSB8CisJICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEgJiAweDAyKSA8PCA3KSB8CisJICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEgJiAweDQwKSA8PCAzKSB8CisJICgodW5zaWduZWQgc2hvcnQpKHNyX2RhdGEgJiAweDAyKSA8PCA5KTsKKyAgIEUgPSBWREUgKyAxOwogCi0gICBpZihwU2lTLT5TaVNfUHItPkNQX1ZlbmRvcikgewotICAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJDaGVja2luZyBkYXRhYmFzZSBmb3IgdmVuZG9yICV4LCBwcm9kdWN0ICV4XG4iLAotICAgICAgICAgcFNpUy0+U2lTX1ByLT5DUF9WZW5kb3IsIHBTaVMtPlNpU19Qci0+Q1BfUHJvZHVjdCk7Ci0gICB9CisgICAvKiBWZXJ0aWNhbCByZXRyYWNlICg9c3luYykgc3RhcnQgKi8KKyAgIFZSUyA9IGNyZGF0YVs4XSB8CisJICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEgJiAweDA0KSA8PCA2KSB8CisJICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEgJiAweDgwKSA8PCAyKSB8CisJICgodW5zaWduZWQgc2hvcnQpKHNyX2RhdGEgJiAweDA4KSA8PCA3KTsKKyAgIEYgPSBWUlMgKyAxIC0gRTsKIAotICAgaSA9IDA7Ci0gICB3aGlsZSgoIWRvbmUpICYmIChTaVNfUGxhc21hVGFibGVbaV0udmVuZG9yKSAmJiAocFNpUy0+U2lTX1ByLT5DUF9WZW5kb3IpKSB7CisgICBjcl9kYXRhMiA9IChjcmRhdGFbMTZdICYgMHgwMSkgPDwgNTsKIAotICAgICBpZihTaVNfUGxhc21hVGFibGVbaV0udmVuZG9yID09IHBTaVMtPlNpU19Qci0+Q1BfVmVuZG9yKSB7Ci0KLSAgICAgICAgZm9yKGo9MDsgajxTaVNfUGxhc21hVGFibGVbaV0ucHJvZHVjdG51bTsgaisrKSB7Ci0KLQkgICAgaWYoU2lTX1BsYXNtYVRhYmxlW2ldLnByb2R1Y3Rbal0gPT0gcFNpUy0+U2lTX1ByLT5DUF9Qcm9kdWN0KSB7Ci0KLQkgICAgICAgeGY4NkRydk1zZyhwU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLQkgICAgICAgCSAgIklkZW50aWZpZWQgJXMgcGFuZWwsIGFkZGluZyBzcGVjaWZpYyBtb2Rlc1xuIiwKLQkJICBTaVNfUGxhc21hVGFibGVbaV0ucGxhc21hbmFtZSk7Ci0KLQkgICAgICAgZm9yKGs9MDsgazxTaVNfUGxhc21hVGFibGVbaV0ubW9kZW51bTsgaysrKSB7Ci0KLQkgICAgICAgICAgaWYoaXNmb3JkdmkpIHsKLQkJICAgICBpZighKFNpU19QbGFzbWFUYWJsZVtpXS5wbGFzbWFtb2Rlc1trXSAmIDB4ODApKSBjb250aW51ZTsKLQkJICB9IGVsc2UgewotCQkgICAgIGlmKCEoU2lTX1BsYXNtYVRhYmxlW2ldLnBsYXNtYW1vZGVzW2tdICYgMHg0MCkpIGNvbnRpbnVlOwotCQkgIH0KLQotCQkgIGwgPSBTaVNfUGxhc21hVGFibGVbaV0ucGxhc21hbW9kZXNba10gJiAweDNmOwotCi0JCSAgaWYocFNpUy0+VkJGbGFncyAmIChWQl8zMDF8VkJfMzAxQnxWQl8zMDJCfFZCXzMwMUxWKSkgewotCQkgICAgIGlmKGlzZm9yZHZpKSB7Ci0JCSAgICAgICAgaWYoU2lTX1BsYXNtYU1vZGVbbF0uVkRpc3BsYXkgPiAxMDI0KSBjb250aW51ZTsKLQkJICAgICB9Ci0JCSAgfQotCi0JICAgICAgICAgIGlmKCEobmV3ID0geGFsbG9jKHNpemVvZihEaXNwbGF5TW9kZVJlYykpKSkgcmV0dXJuIGZpcnN0OwotCi0gICAgICAgICAgICAgICAgICBtZW1zZXQobmV3LCAwLCBzaXplb2YoRGlzcGxheU1vZGVSZWMpKTsKLSAgICAgICAgICAgICAgICAgIGlmKCEobmV3LT5uYW1lID0geGFsbG9jKDEyKSkpIHsKLSAgICAgIAkJICAgICB4ZnJlZShuZXcpOwotCQkgICAgIHJldHVybiBmaXJzdDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmKCFmaXJzdCkgZmlyc3QgPSBuZXc7Ci0gICAgICAgICAgICAgICAgICBpZihjdXJyZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5uZXh0ID0gbmV3OwotCSAgICAgICAgICAgICBuZXctPnByZXYgPSBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV3OwotCi0JCSAgcFNpUy0+QWRkZWRQbGFzbWFNb2RlcyA9IFRSVUU7Ci0KLQkJICBzdHJjcHkoY3VycmVudC0+bmFtZSwgU2lTX1BsYXNtYU1vZGVbbF0ubmFtZSk7Ci0JICAgICAgICAgIC8qIHNwcmludGYoY3VycmVudC0+bmFtZSwgIiVkeCVkIiwgU2lTX1BsYXNtYU1vZGVbbF0uSERpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpU19QbGFzbWFNb2RlW2xdLlZEaXNwbGF5KTsgKi8KLQotICAgICAgICAgICAgICAgICAgY3VycmVudC0+c3RhdHVzID0gTU9ERV9PSzsKLQotICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHlwZSA9IE1fVF9CVUlMVElOOwotCi0JCSAgY3VycmVudC0+Q2xvY2sgPSBTaVNfUGxhc21hTW9kZVtsXS5jbG9jazsKLSAgICAgICAgICAgIAkgIGN1cnJlbnQtPlN5bnRoQ2xvY2sgPSBjdXJyZW50LT5DbG9jazsKLQotICAgICAgICAgICAgICAgICAgY3VycmVudC0+SERpc3BsYXkgICA9IFNpU19QbGFzbWFNb2RlW2xdLkhEaXNwbGF5OwotICAgICAgICAgICAgICAgICAgY3VycmVudC0+SFN5bmNTdGFydCA9IGN1cnJlbnQtPkhEaXNwbGF5ICsgU2lTX1BsYXNtYU1vZGVbbF0uSEZyb250UG9yY2g7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5IU3luY0VuZCAgID0gY3VycmVudC0+SFN5bmNTdGFydCArIFNpU19QbGFzbWFNb2RlW2xdLkhTeW5jV2lkdGg7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5IVG90YWwgICAgID0gU2lTX1BsYXNtYU1vZGVbbF0uSFRvdGFsOwotCi0JCSAgY3VycmVudC0+VkRpc3BsYXkgICA9IFNpU19QbGFzbWFNb2RlW2xdLlZEaXNwbGF5OwotICAgICAgICAgICAgICAgICAgY3VycmVudC0+VlN5bmNTdGFydCA9IGN1cnJlbnQtPlZEaXNwbGF5ICsgU2lTX1BsYXNtYU1vZGVbbF0uVkZyb250UG9yY2g7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5WU3luY0VuZCAgID0gY3VycmVudC0+VlN5bmNTdGFydCArIFNpU19QbGFzbWFNb2RlW2xdLlZTeW5jV2lkdGg7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5WVG90YWwgICAgID0gU2lTX1BsYXNtYU1vZGVbbF0uVlRvdGFsOwotCi0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5DcnRjSERpc3BsYXkgPSBjdXJyZW50LT5IRGlzcGxheTsKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkNydGNIQmxhbmtTdGFydCA9IGN1cnJlbnQtPkhTeW5jU3RhcnQ7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5DcnRjSFN5bmNTdGFydCA9IGN1cnJlbnQtPkhTeW5jU3RhcnQ7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5DcnRjSFN5bmNFbmQgPSBjdXJyZW50LT5IU3luY0VuZDsKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkNydGNIQmxhbmtFbmQgPSBjdXJyZW50LT5IU3luY0VuZDsKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkNydGNIVG90YWwgPSBjdXJyZW50LT5IVG90YWw7Ci0KLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkNydGNWRGlzcGxheSA9IGN1cnJlbnQtPlZEaXNwbGF5OwotICAgICAgICAgICAgICAgICAgY3VycmVudC0+Q3J0Y1ZCbGFua1N0YXJ0ID0gY3VycmVudC0+VlN5bmNTdGFydDsKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkNydGNWU3luY1N0YXJ0ID0gY3VycmVudC0+VlN5bmNTdGFydDsKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkNydGNWU3luY0VuZCA9IGN1cnJlbnQtPlZTeW5jRW5kOwotICAgICAgICAgICAgICAgICAgY3VycmVudC0+Q3J0Y1ZCbGFua0VuZCA9IGN1cnJlbnQtPlZTeW5jRW5kOwotICAgICAgICAgICAgICAgICAgY3VycmVudC0+Q3J0Y1ZUb3RhbCA9IGN1cnJlbnQtPlZUb3RhbDsKLQotICAgICAgICAgICAgICAgICAgaWYoU2lTX1BsYXNtYU1vZGVbbF0uU3luY0ZsYWdzICYgU0lTX1BMX0hTWU5DUCkKLSAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfUEhTWU5DOwotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+RmxhZ3MgfD0gVl9OSFNZTkM7Ci0KLSAgICAgICAgICAgICAgICAgIGlmKFNpU19QbGFzbWFNb2RlW2xdLlN5bmNGbGFncyAmIFNJU19QTF9WU1lOQ1ApCi0gICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5GbGFncyB8PSBWX1BWU1lOQzsKLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfTlZTWU5DOwotCi0JCSAgaWYoY3VycmVudC0+SERpc3BsYXkgPiBwU2lTLT5MQ0R3aWR0aCkKLQkJICAgICBwU2lTLT5MQ0R3aWR0aCA9IHBTaVMtPlNpU19Qci0+Q1BfTWF4WCA9IGN1cnJlbnQtPkhEaXNwbGF5OwotCSAgICAgICAgICBpZihjdXJyZW50LT5WRGlzcGxheSA+IHBTaVMtPkxDRGhlaWdodCkKLQkJICAgICBwU2lTLT5MQ0RoZWlnaHQgPSBwU2lTLT5TaVNfUHItPkNQX01heFkgPSBjdXJyZW50LT5WRGlzcGxheTsKLQotCQkgIHhmODZEcnZNc2cocFNjcm4tPnNjcm5JbmRleCwgWF9QUk9CRUQsCi0JCSAgCSJcdEFkZGluZyBcIiVzXCIgdG8gbGlzdCBvZiBidWlsdC1pbiBtb2Rlc1xuIiwgY3VycmVudC0+bmFtZSk7Ci0KLSAgICAgICAgICAgICAgIH0KLQkgICAgICAgZG9uZSA9IFRSVUU7Ci0JICAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICB9Ci0KLSAgICAgaSsrOwotCi0gICB9Ci0KLSAgIGlmKHBTaVMtPlNpU19Qci0+Q1BfSGF2ZUN1c3RvbURhdGEpIHsKLQotICAgICAgZm9yKGk9MDsgaTw3OyBpKyspIHsKLQotICAgICAgICAgaWYocFNpUy0+U2lTX1ByLT5DUF9EYXRhVmFsaWRbaV0pIHsKLQotICAgICAgICAgICAgaWYoIShuZXcgPSB4YWxsb2Moc2l6ZW9mKERpc3BsYXlNb2RlUmVjKSkpKSByZXR1cm4gZmlyc3Q7Ci0KLSAgICAgICAgICAgIG1lbXNldChuZXcsIDAsIHNpemVvZihEaXNwbGF5TW9kZVJlYykpOwotICAgICAgICAgICAgaWYoIShuZXctPm5hbWUgPSB4YWxsb2MoMTApKSkgewotICAgICAgCQl4ZnJlZShuZXcpOwotCQlyZXR1cm4gZmlyc3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZighZmlyc3QpIGZpcnN0ID0gbmV3OwotICAgICAgICAgICAgaWYoY3VycmVudCkgewotICAgICAgICAgICAgICAgY3VycmVudC0+bmV4dCA9IG5ldzsKLQkgICAgICAgbmV3LT5wcmV2ID0gY3VycmVudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VycmVudCA9IG5ldzsKLQotICAgICAgICAgICAgc3ByaW50ZihjdXJyZW50LT5uYW1lLCAiJWR4JWQiLCBwU2lTLT5TaVNfUHItPkNQX0hEaXNwbGF5W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2lTLT5TaVNfUHItPkNQX1ZEaXNwbGF5W2ldKTsKLQotICAgICAgICAgICAgY3VycmVudC0+c3RhdHVzID0gTU9ERV9PSzsKLQotICAgICAgICAgICAgY3VycmVudC0+dHlwZSA9IE1fVF9CVUlMVElOOwotCi0gICAgICAgICAgICBjdXJyZW50LT5DbG9jayA9IHBTaVMtPlNpU19Qci0+Q1BfQ2xvY2tbaV07Ci0gICAgICAgICAgICBjdXJyZW50LT5TeW50aENsb2NrID0gY3VycmVudC0+Q2xvY2s7Ci0KLSAgICAgICAgICAgIGN1cnJlbnQtPkhEaXNwbGF5ICAgPSBwU2lTLT5TaVNfUHItPkNQX0hEaXNwbGF5W2ldOwotICAgICAgICAgICAgY3VycmVudC0+SFN5bmNTdGFydCA9IHBTaVMtPlNpU19Qci0+Q1BfSFN5bmNTdGFydFtpXTsKLSAgICAgICAgICAgIGN1cnJlbnQtPkhTeW5jRW5kICAgPSBwU2lTLT5TaVNfUHItPkNQX0hTeW5jRW5kW2ldOwotICAgICAgICAgICAgY3VycmVudC0+SFRvdGFsICAgICA9IHBTaVMtPlNpU19Qci0+Q1BfSFRvdGFsW2ldOwotCi0gICAgICAgICAgICBjdXJyZW50LT5WRGlzcGxheSAgID0gcFNpUy0+U2lTX1ByLT5DUF9WRGlzcGxheVtpXTsKLSAgICAgICAgICAgIGN1cnJlbnQtPlZTeW5jU3RhcnQgPSBwU2lTLT5TaVNfUHItPkNQX1ZTeW5jU3RhcnRbaV07Ci0gICAgICAgICAgICBjdXJyZW50LT5WU3luY0VuZCAgID0gcFNpUy0+U2lTX1ByLT5DUF9WU3luY0VuZFtpXTsKLSAgICAgICAgICAgIGN1cnJlbnQtPlZUb3RhbCAgICAgPSBwU2lTLT5TaVNfUHItPkNQX1ZUb3RhbFtpXTsKLQotICAgICAgICAgICAgY3VycmVudC0+Q3J0Y0hEaXNwbGF5ID0gY3VycmVudC0+SERpc3BsYXk7Ci0gICAgICAgICAgICBjdXJyZW50LT5DcnRjSEJsYW5rU3RhcnQgPSBwU2lTLT5TaVNfUHItPkNQX0hCbGFua1N0YXJ0W2ldOwotICAgICAgICAgICAgY3VycmVudC0+Q3J0Y0hTeW5jU3RhcnQgPSBjdXJyZW50LT5IU3luY1N0YXJ0OwotICAgICAgICAgICAgY3VycmVudC0+Q3J0Y0hTeW5jRW5kID0gY3VycmVudC0+SFN5bmNFbmQ7Ci0gICAgICAgICAgICBjdXJyZW50LT5DcnRjSEJsYW5rRW5kID0gcFNpUy0+U2lTX1ByLT5DUF9IQmxhbmtFbmRbaV07Ci0gICAgICAgICAgICBjdXJyZW50LT5DcnRjSFRvdGFsID0gY3VycmVudC0+SFRvdGFsOwotCi0gICAgICAgICAgICBjdXJyZW50LT5DcnRjVkRpc3BsYXkgPSBjdXJyZW50LT5WRGlzcGxheTsKLSAgICAgICAgICAgIGN1cnJlbnQtPkNydGNWQmxhbmtTdGFydCA9IHBTaVMtPlNpU19Qci0+Q1BfVkJsYW5rU3RhcnRbaV07Ci0gICAgICAgICAgICBjdXJyZW50LT5DcnRjVlN5bmNTdGFydCA9IGN1cnJlbnQtPlZTeW5jU3RhcnQ7Ci0gICAgICAgICAgICBjdXJyZW50LT5DcnRjVlN5bmNFbmQgPSBjdXJyZW50LT5WU3luY0VuZDsKLSAgICAgICAgICAgIGN1cnJlbnQtPkNydGNWQmxhbmtFbmQgPSBwU2lTLT5TaVNfUHItPkNQX1ZCbGFua0VuZFtpXTsKLSAgICAgICAgICAgIGN1cnJlbnQtPkNydGNWVG90YWwgPSBjdXJyZW50LT5WVG90YWw7Ci0KLQkgICAgaWYocFNpUy0+U2lTX1ByLT5DUF9TeW5jVmFsaWRbaV0pIHsKLSAgICAgICAgICAgICAgIGlmKHBTaVMtPlNpU19Qci0+Q1BfSFN5bmNfUFtpXSkKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfUEhTWU5DOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgY3VycmVudC0+RmxhZ3MgfD0gVl9OSFNZTkM7Ci0KLSAgICAgICAgICAgICAgIGlmKHBTaVMtPlNpU19Qci0+Q1BfVlN5bmNfUFtpXSkKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfUFZTWU5DOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgY3VycmVudC0+RmxhZ3MgfD0gVl9OVlNZTkM7Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgIC8qIE5vIHN5bmMgZGF0YT8gVXNlIHBvc2l0aXZlIHN5bmMuLi4gKi8KLQkgICAgICAgY3VycmVudC0+RmxhZ3MgfD0gVl9QSFNZTkM7Ci0JICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfUFZTWU5DOwotCSAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiBmaXJzdDsKLQotfQotCi0vKiBUcmFuc2xhdGUgYSBtb2RlIG51bWJlciBpbnRvIHRoZSBWRVNBIHBlbmRhbnQgKi8KLWludAotU2lTVHJhbnNsYXRlVG9WRVNBKFNjcm5JbmZvUHRyIHBTY3JuLCBpbnQgbW9kZW51bWJlcikKLXsKLSAgIFNJU1B0ciBwU2lTID0gU0lTUFRSKHBTY3JuKTsKLSAgIGludCAgICBpID0gMDsKLQotICAgLyogSW5pdGlhbGl6ZSBvdXIgcG9pbnRlcnMgKi8KLSAgIGlmKHBTaVMtPlZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotI2lmZGVmIFNJUzMwMAotCUluaXRUbzMwMFBvaW50ZXIocFNpUy0+U2lTX1ByLCAmcFNpUy0+c2lzaHdfZXh0KTsKLSNlbHNlCi0JcmV0dXJuIC0xOwotI2VuZGlmCi0gICB9IGVsc2UgaWYocFNpUy0+VkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0jaWZkZWYgU0lTMzE1SAotICAgICAgIAlJbml0VG8zMTBQb2ludGVyKHBTaVMtPlNpU19QciwgJnBTaVMtPnNpc2h3X2V4dCk7Ci0jZWxzZQotCXJldHVybiAtMTsKLSNlbmRpZgotICAgfSBlbHNlIHJldHVybiAtMTsKLQotICAgaWYobW9kZW51bWJlciA8PSAweDEzKSByZXR1cm4gbW9kZW51bWJlcjsKLQotI2lmZGVmIFNJUzMxNUgKLSAgIGlmKHBTaVMtPlJPTTY2MU5ldykgewotICAgICAgd2hpbGUoU2lTX0VNb2RlSURUYWJsZTY2MVtpXS5FeHRfTW9kZUlEICE9IDB4ZmYpIHsKLSAgICAgICAgIGlmKFNpU19FTW9kZUlEVGFibGU2NjFbaV0uRXh0X01vZGVJRCA9PSBtb2RlbnVtYmVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludClTaVNfRU1vZGVJRFRhYmxlNjYxW2ldLkV4dF9WRVNBSUQ7Ci0gICAgICAgICB9Ci0gICAgICAgICBpKys7Ci0gICAgICB9Ci0gICB9IGVsc2UgewotI2VuZGlmCi0gICAgICB3aGlsZShwU2lTLT5TaVNfUHItPlNpU19FTW9kZUlEVGFibGVbaV0uRXh0X01vZGVJRCAhPSAweGZmKSB7Ci0gICAgICAgICBpZihwU2lTLT5TaVNfUHItPlNpU19FTW9kZUlEVGFibGVbaV0uRXh0X01vZGVJRCA9PSBtb2RlbnVtYmVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludClwU2lTLT5TaVNfUHItPlNpU19FTW9kZUlEVGFibGVbaV0uRXh0X1ZFU0FJRDsKLSAgICAgICAgIH0KLSAgICAgICAgIGkrKzsKLSAgICAgIH0KLSNpZmRlZiBTSVMzMTVICi0gICB9Ci0jZW5kaWYKLSAgIHJldHVybiAtMTsKLX0KLQotLyogVHJhbnNsYXRlIGEgbmV3IEJJT1MgbW9kZSBudW1iZXIgaW50byB0aGUgZHJpdmVyJ3MgcGVuZGFudCAqLwotaW50Ci1TaVNUcmFuc2xhdGVUb09sZE1vZGUoaW50IG1vZGVudW1iZXIpCi17Ci0jaWZkZWYgU0lTMzE1SAotICAgaW50ICAgIGkgPSAwOwotCi0gICB3aGlsZShTaVNfRU1vZGVJRFRhYmxlNjYxW2ldLkV4dF9Nb2RlSUQgIT0gMHhmZikgewotICAgICAgaWYoU2lTX0VNb2RlSURUYWJsZTY2MVtpXS5FeHRfTW9kZUlEID09IG1vZGVudW1iZXIpIHsKLSAgICAgICAgIGlmKFNpU19FTW9kZUlEVGFibGU2NjFbaV0uRXh0X015TW9kZUlEKQotICAgICAgICAgICAgcmV0dXJuIChpbnQpU2lTX0VNb2RlSURUYWJsZTY2MVtpXS5FeHRfTXlNb2RlSUQ7Ci0JIGVsc2UKLQkgICAgcmV0dXJuIG1vZGVudW1iZXI7Ci0gICAgICB9Ci0gICAgICBpKys7Ci0gICB9Ci0jZW5kaWYKLSAgIHJldHVybiBtb2RlbnVtYmVyOwotfQotCi0jZW5kaWYgIC8qIFhmcmVlODYgKi8KLQotI2lmZGVmIExJTlVYX0tFUk5FTAotaW50Ci1zaXNmYl9tb2RlX3JhdGVfdG9fZGNsb2NrKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0JCQkgIHVuc2lnbmVkIGNoYXIgbW9kZW5vLCB1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCkKLXsKLSAgICBVU0hPUlQgTW9kZU5vID0gbW9kZW5vOwotICAgIFVTSE9SVCBNb2RlSWRJbmRleCA9IDAsIENsb2NrSW5kZXggPSAwOwotICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSAwOwotICAgIGludCAgICBDbG9jazsKLQotICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSNpZmRlZiBTSVMzMDAKLSAgICAgICBJbml0VG8zMDBQb2ludGVyKFNpU19QciwgSHdJbmZvKTsKLSNlbHNlCi0gICAgICAgcmV0dXJuIDY1ICogMTAwMDsKLSNlbmRpZgotICAgIH0gZWxzZSB7Ci0jaWZkZWYgU0lTMzE1SAotICAgICAgIEluaXRUbzMxMFBvaW50ZXIoU2lTX1ByLCBId0luZm8pOwotI2Vsc2UKLSAgICAgICByZXR1cm4gNjUgKiAxMDAwOwotI2VuZGlmCi0gICAgfQotCi0gICAgaWYoIShTaVNfU2VhcmNoTW9kZUlEKFNpU19QciwgJk1vZGVObywgJk1vZGVJZEluZGV4KSkpIHs7Ci0gICAgCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGZpbmQgbW9kZSAleFxuIiwgTW9kZU5vKTsKLSAgICAJcmV0dXJuIDY1ICogMTAwMDsKLSAgICB9Ci0KLSAgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlJFRmluZGV4OwotICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCArPSAocmF0ZWluZGV4IC0gMSk7Ci0gICAgQ2xvY2tJbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVFZDTEs7Ci0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotICAgICAgIENsb2NrSW5kZXggJj0gMHgzRjsKLSAgICB9Ci0gICAgQ2xvY2sgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtDbG9ja0luZGV4XS5DTE9DSyAqIDEwMDA7Ci0gICAgCi0gICAgcmV0dXJuKENsb2NrKTsKLX0KLQotQk9PTEVBTgotc2lzZmJfZ2V0dG90YWxmcm9tbW9kZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotCQkgICAgICAgdW5zaWduZWQgY2hhciBtb2Rlbm8sIGludCAqaHRvdGFsLCBpbnQgKnZ0b3RhbCwgdW5zaWduZWQgY2hhciByYXRlaW5kZXgpCi17Ci0gICAgVVNIT1JUIE1vZGVObyA9IG1vZGVubzsKLSAgICBVU0hPUlQgTW9kZUlkSW5kZXggPSAwLCBDUlQxSW5kZXggPSAwOwotICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSAwOwotICAgIHVuc2lnbmVkIGNoYXIgIHNyX2RhdGEsIGNyX2RhdGEsIGNyX2RhdGEyOwotCi0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotI2lmZGVmIFNJUzMwMAotICAgICAgIEluaXRUbzMwMFBvaW50ZXIoU2lTX1ByLCBId0luZm8pOwotI2Vsc2UKLSAgICAgICByZXR1cm4gRkFMU0U7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotI2lmZGVmIFNJUzMxNUgKLSAgICAgICBJbml0VG8zMTBQb2ludGVyKFNpU19QciwgSHdJbmZvKTsKLSNlbHNlCi0gICAgICAgcmV0dXJuIEZBTFNFOwotI2VuZGlmCi0gICAgfQotCi0gICAgaWYoIShTaVNfU2VhcmNoTW9kZUlEKFNpU19QciwgJk1vZGVObywgJk1vZGVJZEluZGV4KSkpIHJldHVybiBGQUxTRTsKLQotICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uUkVGaW5kZXg7Ci0gICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4ICs9IChyYXRlaW5kZXggLSAxKTsKLSAgICBDUlQxSW5kZXggPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQxQ1JUQzsKLQotICAgIHNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbQ1JUMUluZGV4XS5DUlsxNF07Ci0gICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzBdOwotICAgICpodG90YWwgPSAoKChjcl9kYXRhICYgMHhmZikgfCAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MDMpIDw8IDgpKSArIDUpICogODsKLQotICAgIHNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbQ1JUMUluZGV4XS5DUlsxM107Ci0gICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzZdOwotICAgIGNyX2RhdGEyID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW0NSVDFJbmRleF0uQ1JbN107Ci0gICAgKnZ0b3RhbCA9ICgoY3JfZGF0YSAmIDB4RkYpIHwKLSAgICAgICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEyICYgMHgwMSkgPDwgIDgpIHwKLQkgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkoY3JfZGF0YTIgJiAweDIwKSA8PCAgNCkgfAotCSAgICAgICAoKHVuc2lnbmVkIHNob3J0KShzcl9kYXRhICAmIDB4MDEpIDw8IDEwKSkgKyAyOwotCi0gICAgaWYoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfSW5mb0ZsYWcgJiBJbnRlcmxhY2VNb2RlKQotICAgICAgICp2dG90YWwgKj0gMjsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi1pbnQKLXNpc2ZiX21vZGVfcmF0ZV90b19kZGF0YShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotCQkJIHVuc2lnbmVkIGNoYXIgbW9kZW5vLCB1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCwKLQkJCSBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKLXsKLSAgICBVU0hPUlQgTW9kZU5vID0gbW9kZW5vOwotICAgIFVTSE9SVCBNb2RlSWRJbmRleCA9IDAsIGluZGV4ID0gMDsKLSAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4ID0gMDsKLSAgICB1bnNpZ25lZCBzaG9ydCBWUkUsIFZCRSwgVlJTLCBWQlMsIFZERSwgVlQ7Ci0gICAgdW5zaWduZWQgc2hvcnQgSFJFLCBIQkUsIEhSUywgSEJTLCBIREUsIEhUOwotICAgIHVuc2lnbmVkIGNoYXIgIHNyX2RhdGEsIGNyX2RhdGEsIGNyX2RhdGEyLCBjcl9kYXRhMzsKLSAgICBpbnQgICAgICAgICAgICBBLCBCLCBDLCBELCBFLCBGLCB0ZW1wLCBqOwotICAgCi0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotI2lmZGVmIFNJUzMwMAotICAgICAgIEluaXRUbzMwMFBvaW50ZXIoU2lTX1ByLCBId0luZm8pOwotI2Vsc2UKLSAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIH0gZWxzZSB7Ci0jaWZkZWYgU0lTMzE1SAotICAgICAgIEluaXRUbzMxMFBvaW50ZXIoU2lTX1ByLCBId0luZm8pOwotI2Vsc2UKLSAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIH0KLQotICAgIGlmKCEoU2lTX1NlYXJjaE1vZGVJRChTaVNfUHIsICZNb2RlTm8sICZNb2RlSWRJbmRleCkpKSByZXR1cm4gMDsKLQotICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uUkVGaW5kZXg7Ci0gICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4ICs9IChyYXRlaW5kZXggLSAxKTsKLSAgICBpbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVDFDUlRDOwotCi0gICAgc3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTRdOwotCi0gICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMF07Ci0KLSAgICAvKiBIb3Jpem9udGFsIHRvdGFsICovCi0gICAgSFQgPSAoY3JfZGF0YSAmIDB4ZmYpIHwKLSAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgwMykgPDwgOCk7Ci0gICAgQSA9IEhUICsgNTsKLQotICAgIGNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzFdOwotCQotICAgIC8qIEhvcml6b250YWwgZGlzcGxheSBlbmFibGUgZW5kICovCi0gICAgSERFID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKHNyX2RhdGEgJiAweDBDKSA8PCA2KTsKLSAgICBFID0gSERFICsgMTsKLQotICAgIGNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzRdOwotCQotICAgIC8qIEhvcml6b250YWwgcmV0cmFjZSAoPXN5bmMpIHN0YXJ0ICovCi0gICAgSFJTID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKHNyX2RhdGEgJiAweEMwKSA8PCAyKTsKLSAgICBGID0gSFJTIC0gRSAtIDM7Ci0KLSAgICBjcl9kYXRhID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlsyXTsKLQkKLSAgICAvKiBIb3Jpem9udGFsIGJsYW5rIHN0YXJ0ICovCi0gICAgSEJTID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKHNyX2RhdGEgJiAweDMwKSA8PCA0KTsKLQotICAgIHNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzE1XTsKLQkKLSAgICBjcl9kYXRhID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlszXTsKLQotICAgIGNyX2RhdGEyID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUls1XTsKLQkKLSAgICAvKiBIb3Jpem9udGFsIGJsYW5rIGVuZCAqLwotICAgIEhCRSA9IChjcl9kYXRhICYgMHgxZikgfAotICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4ODApID4+IDIpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgwMykgPDwgNik7Ci0KLSAgICAvKiBIb3Jpem9udGFsIHJldHJhY2UgKD1zeW5jKSBlbmQgKi8KLSAgICBIUkUgPSAoY3JfZGF0YTIgJiAweDFmKSB8ICgoc3JfZGF0YSAmIDB4MDQpIDw8IDMpOwotCi0gICAgdGVtcCA9IEhCRSAtICgoRSAtIDEpICYgMjU1KTsKLSAgICBCID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDI1Nik7Ci0KLSAgICB0ZW1wID0gSFJFIC0gKChFICsgRiArIDMpICYgNjMpOwotICAgIEMgPSAodGVtcCA+IDApID8gdGVtcCA6ICh0ZW1wICsgNjQpOwotCi0gICAgRCA9IEIgLSBGIC0gQzsKLQotICAgIGlmKChTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLlhSZXMgPT0gMzIwKSAmJgotICAgICAgICgoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5ZUmVzID09IDIwMCkgfHwKLQkoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5ZUmVzID09IDI0MCkpKSB7Ci0KLQkgLyogVGVycmlibGUgaGFjaywgYnV0IHRoZSBjb3JyZWN0IENSVEMgZGF0YSBmb3IKLQkgICogdGhlc2UgbW9kZXMgb25seSBwcm9kdWNlcyBhIGJsYWNrIHNjcmVlbi4uLgotCSAgKi8KLSAgICAgICB2YXItPmxlZnRfbWFyZ2luID0gKDQwMCAtIDM3Nik7Ci0gICAgICAgdmFyLT5yaWdodF9tYXJnaW4gPSAoMzI4IC0gMzIwKTsKLSAgICAgICB2YXItPmhzeW5jX2xlbiA9ICgzNzYgLSAzMjgpOwotCi0gICAgfSBlbHNlIHsKLQotICAgICAgIHZhci0+bGVmdF9tYXJnaW4gPSBEICogODsKLSAgICAgICB2YXItPnJpZ2h0X21hcmdpbiA9IEYgKiA4OwotICAgICAgIHZhci0+aHN5bmNfbGVuID0gQyAqIDg7Ci0KLSAgICB9Ci0KLSAgICBzcl9kYXRhID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlsxM107Ci0KLSAgICBjcl9kYXRhID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUls2XTsKLQotICAgIGNyX2RhdGEyID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUls3XTsKLQotICAgIC8qIFZlcnRpY2FsIHRvdGFsICovCi0gICAgVlQgPSAoY3JfZGF0YSAmIDB4RkYpIHwKLSAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4MDEpIDw8IDgpIHwKKyAgIC8qIFZlcnRpY2FsIGJsYW5rIHN0YXJ0ICovCisgICBWQlMgPSBjcmRhdGFbMTFdIHwKKwkgKCh1bnNpZ25lZCBzaG9ydCkoY3JfZGF0YSAgJiAweDA4KSA8PCA1KSB8CiAJICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEyICYgMHgyMCkgPDwgNCkgfAotCSAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MDEpIDw8IDEwKTsKLSAgICBBID0gVlQgKyAyOworCSAoKHVuc2lnbmVkIHNob3J0KShzcl9kYXRhICAmIDB4MDQpIDw8IDgpOwogCi0gICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTBdOwotCQotICAgIC8qIFZlcnRpY2FsIGRpc3BsYXkgZW5hYmxlIGVuZCAqLwotICAgIFZERSA9IChjcl9kYXRhICYgMHhmZikgfAotICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4MDIpIDw8IDcpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4NDApIDw8IDMpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgwMikgPDwgOSk7Ci0gICAgRSA9IFZERSArIDE7CisgICAvKiBWZXJ0aWNhbCBibGFuayBlbmQgKi8KKyAgIFZCRSA9IGNyZGF0YVsxMl0gfCAoKHVuc2lnbmVkIHNob3J0KShzcl9kYXRhICYgMHgxMCkgPDwgNCk7CisgICB0ZW1wID0gVkJFIC0gKChFIC0gMSkgJiA1MTEpOworICAgQiA9ICh0ZW1wID4gMCkgPyB0ZW1wIDogKHRlbXAgKyA1MTIpOwogCi0gICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbOF07CisgICAvKiBWZXJ0aWNhbCByZXRyYWNlICg9c3luYykgZW5kICovCisgICBWUkUgPSAoY3JkYXRhWzldICYgMHgwZikgfCAoKHNyX2RhdGEgJiAweDIwKSA+PiAxKTsKKyAgIHRlbXAgPSBWUkUgLSAoKEUgKyBGIC0gMSkgJiAzMSk7CisgICBDID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDMyKTsKIAotICAgIC8qIFZlcnRpY2FsIHJldHJhY2UgKD1zeW5jKSBzdGFydCAqLwotICAgIFZSUyA9IChjcl9kYXRhICYgMHhmZikgfAotICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4MDQpIDw8IDYpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4ODApIDw8IDIpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgwOCkgPDwgNyk7Ci0gICAgRiA9IFZSUyArIDEgLSBFOworICAgRCA9IEIgLSBGIC0gQzsKIAotICAgIGNyX2RhdGEgPSAgU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlsxMV07Ci0KLSAgICBjcl9kYXRhMyA9IChTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzE2XSAmIDB4MDEpIDw8IDU7Ci0KLSAgICAvKiBWZXJ0aWNhbCBibGFuayBzdGFydCAqLwotICAgIFZCUyA9IChjcl9kYXRhICYgMHhmZikgfAotICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4MDgpIDw8IDUpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMyAmIDB4MjApIDw8IDQpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgwNCkgPDwgOCk7Ci0KLSAgICBjcl9kYXRhID0gIFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTJdOwotCi0gICAgLyogVmVydGljYWwgYmxhbmsgZW5kICovCi0gICAgVkJFID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKHNyX2RhdGEgJiAweDEwKSA8PCA0KTsKLSAgICB0ZW1wID0gVkJFIC0gKChFIC0gMSkgJiA1MTEpOwotICAgIEIgPSAodGVtcCA+IDApID8gdGVtcCA6ICh0ZW1wICsgNTEyKTsKLQotICAgIGNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzldOwotCi0gICAgLyogVmVydGljYWwgcmV0cmFjZSAoPXN5bmMpIGVuZCAqLwotICAgIFZSRSA9IChjcl9kYXRhICYgMHgwZikgfCAoKHNyX2RhdGEgJiAweDIwKSA+PiAxKTsKLSAgICB0ZW1wID0gVlJFIC0gKChFICsgRiAtIDEpICYgMzEpOwotICAgIEMgPSAodGVtcCA+IDApID8gdGVtcCA6ICh0ZW1wICsgMzIpOwotCi0gICAgRCA9IEIgLSBGIC0gQzsKLSAgICAgIAotICAgIHZhci0+dXBwZXJfbWFyZ2luID0gRDsKLSAgICB2YXItPmxvd2VyX21hcmdpbiA9IEY7Ci0gICAgdmFyLT52c3luY19sZW4gPSBDOwotCi0gICAgaWYoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfSW5mb0ZsYWcgJiAweDgwMDApCi0gICAgICAgdmFyLT5zeW5jICY9IH5GQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7Ci0gICAgZWxzZQotICAgICAgIHZhci0+c3luYyB8PSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7Ci0KLSAgICBpZihTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9JbmZvRmxhZyAmIDB4NDAwMCkgICAgICAgCi0gICAgICAgdmFyLT5zeW5jICY9IH5GQl9TWU5DX0hPUl9ISUdIX0FDVDsKLSAgICBlbHNlCi0gICAgICAgdmFyLT5zeW5jIHw9IEZCX1NZTkNfSE9SX0hJR0hfQUNUOwotCQkKLSAgICB2YXItPnZtb2RlID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKLSAgICBpZihTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9JbmZvRmxhZyAmIDB4MDA4MCkKLSAgICAgICB2YXItPnZtb2RlID0gRkJfVk1PREVfSU5URVJMQUNFRDsKLSAgICBlbHNlIHsKLSAgICAgICBqID0gMDsKLSAgICAgICB3aGlsZShTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbal0uRXh0X01vZGVJRCAhPSAweGZmKSB7Ci0gICAgICAgICAgaWYoU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW2pdLkV4dF9Nb2RlSUQgPT0KLQkgICAgICAgICAgICAgICAgICBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLk1vZGVJRCkgewotICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbal0uRXh0X01vZGVGbGFnICYgRG91YmxlU2Nhbk1vZGUpIHsKLQkgICAgICAJICB2YXItPnZtb2RlID0gRkJfVk1PREVfRE9VQkxFOwotICAgICAgICAgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCSAgaisrOwotICAgICAgIH0KLSAgICB9ICAgICAgIAotCi0gICAgaWYoKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PSBGQl9WTU9ERV9JTlRFUkxBQ0VEKSB7Ci0jaWYgMCAgLyogRG8gdGhpcz8gKi8KLSAgICAgICB2YXItPnVwcGVyX21hcmdpbiA8PD0gMTsKLSAgICAgICB2YXItPmxvd2VyX21hcmdpbiA8PD0gMTsKLSAgICAgICB2YXItPnZzeW5jX2xlbiA8PD0gMTsKKyNpZmRlZiBTSVNfWE9SR19YRjg2CisgICBjdXJyZW50LT5WRGlzcGxheSAgID0gVkRFICsgMTsKKyAgIGN1cnJlbnQtPlZTeW5jU3RhcnQgPSBWUlMgKyAxOworICAgY3VycmVudC0+VlN5bmNFbmQgICA9ICgoVlJTICYgfjB4MWYpIHwgVlJFKSArIDE7CisgICBpZihWUkUgPD0gKFZSUyAmIDB4MWYpKSBjdXJyZW50LT5WU3luY0VuZCArPSAzMjsKKyAgIGN1cnJlbnQtPlZUb3RhbCAgICAgPSBFICsgRCArIEMgKyBGOworI2lmIDAKKyAgIGN1cnJlbnQtPlZEaXNwbGF5ICAgPSBFOworICAgY3VycmVudC0+VlN5bmNTdGFydCA9IEUgKyBEOworICAgY3VycmVudC0+VlN5bmNFbmQgICA9IEUgKyBEICsgQzsKKyAgIGN1cnJlbnQtPlZUb3RhbCAgICAgPSBFICsgRCArIEMgKyBGOwogI2VuZGlmCi0gICAgfSBlbHNlIGlmKCh2YXItPnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfRE9VQkxFKSB7Ci0gICAgICAgdmFyLT51cHBlcl9tYXJnaW4gPj49IDE7Ci0gICAgICAgdmFyLT5sb3dlcl9tYXJnaW4gPj49IDE7Ci0gICAgICAgdmFyLT52c3luY19sZW4gPj49IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7ICAgICAgIAotfQkJCSAgCi0KKyNpZmRlZiBUV0RFQlVHCisgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywKKwkiVjogQSAlZCBCICVkIEMgJWQgRCAlZCBFICVkIEYgJWQgIFZUICVkIFZERSAlZCBWUlMgJWQgVkJTICVkIFZCRSAlZCBWUkUgJWRcbiIsCisJQSwgQiwgQywgRCwgRSwgRiwgVlQsIFZERSwgVlJTLCBWQlMsIFZCRSwgVlJFKTsKICNlbmRpZgorI2VuZGlmCisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorICAgaWYod3JpdGVyZXMpIHZhci0+eXJlcyA9IHlyZXMgPSBFOworICAgdmFyLT51cHBlcl9tYXJnaW4gPSBEOworICAgdmFyLT5sb3dlcl9tYXJnaW4gPSBGOworICAgdmFyLT52c3luY19sZW4gPSBDOworI2VuZGlmCisKKyAgIGlmKCh4cmVzID09IDMyMCkgJiYgKCh5cmVzID09IDIwMCkgfHwgKHlyZXMgPT0gMjQwKSkpIHsKKwkvKiBUZXJyaWJsZSBoYWNrLCBidXQgY29ycmVjdCBDUlRDIGRhdGEgZm9yCisJICogdGhlc2UgbW9kZXMgb25seSBwcm9kdWNlcyBhIGJsYWNrIHNjcmVlbi4uLgorCSAqIChIUkUgaXMgMCwgbGVhZGluZyBpbnRvIGEgdG9vIGxhcmdlIEMgYW5kCisJICogYSBuZWdhdGl2ZSBELiBUaGUgQ1JUIGNvbnRyb2xsZXIgZG9lcyBub3QKKwkgKiBzZWVtIHRvIGxpa2UgY29ycmVjdGluZyBIUkUgdG8gNTApCisJICovCisjaWZkZWYgU0lTX1hPUkdfWEY4NgorICAgICAgY3VycmVudC0+SERpc3BsYXkgICA9IDMyMDsKKyAgICAgIGN1cnJlbnQtPkhTeW5jU3RhcnQgPSAzMjg7CisgICAgICBjdXJyZW50LT5IU3luY0VuZCAgID0gMzc2OworICAgICAgY3VycmVudC0+SFRvdGFsICAgICA9IDQwMDsKKyNlbmRpZgorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKKyAgICAgIHZhci0+bGVmdF9tYXJnaW4gPSAoNDAwIC0gMzc2KTsKKyAgICAgIHZhci0+cmlnaHRfbWFyZ2luID0gKDMyOCAtIDMyMCk7CisgICAgICB2YXItPmhzeW5jX2xlbiA9ICgzNzYgLSAzMjgpOworI2VuZGlmCisKKyAgIH0KKworfQorCisKKwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0LmggYi9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0LmgKaW5kZXggN2UzNmI3YS4uNjM0YzBhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvaW5pdC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQuaApAQCAtMyw3ICszLDcgQEAKIC8qCiAgKiBEYXRhIGFuZCBwcm90b3R5cGVzIGZvciBpbml0LmMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQogICoKICAqIElmIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgdGhlIGZvbGxvd2luZyBsaWNlbnNlIHRlcm1zCiAgKiBhcHBseToKQEAgLTUwLDE4ICs1MCwyNCBAQAogICoKICAqLwogCi0jaWZuZGVmIF9JTklUXwotI2RlZmluZSBfSU5JVF8KKyNpZm5kZWYgX0lOSVRfSF8KKyNkZWZpbmUgX0lOSVRfSF8KIAogI2luY2x1ZGUgIm9zZGVmLmgiCiAjaW5jbHVkZSAiaW5pdGRlZi5oIgogCi0jaWZkZWYgTElOVVhfWEY4NgorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpbmNsdWRlICJzaXMuaCIKKyNkZWZpbmUgU0lTX05FRURfaW5TSVNSRUcKKyNkZWZpbmUgU0lTX05FRURfaW5TSVNSRUdXCisjZGVmaW5lIFNJU19ORUVEX2luU0lTUkVHTAorI2RlZmluZSBTSVNfTkVFRF9vdXRTSVNSRUcKKyNkZWZpbmUgU0lTX05FRURfb3V0U0lTUkVHVworI2RlZmluZSBTSVNfTkVFRF9vdXRTSVNSRUdMCiAjaW5jbHVkZSAic2lzX3JlZ3MuaCIKICNlbmRpZgogCi0jaWZkZWYgTElOVVhfS0VSTkVMCisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAogI2luY2x1ZGUgInZnYXR5cGVzLmgiCiAjaW5jbHVkZSAidnN0cnVjdC5oIgogI2lmZGVmIFNJU19DUApAQCAtNzMsNiArNzksMTAgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2luY2x1ZGUgPHZpZGVvL2ZiY29uLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzaXMuaCIKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKICNpbmNsdWRlIDxsaW51eC9zaXNmYi5oPgogI2Vsc2UKICNpbmNsdWRlIDx2aWRlby9zaXNmYi5oPgpAQCAtODAsNDQgKzkwLDQ1IEBACiAjZW5kaWYKIAogLyogTW9kZSBudW1iZXJzICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8zMjB4MjAwW10gICAgICA9IHsweDU5LCAweDQxLCAweDAwLCAweDRmfTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzMyMHgyNDBbXSAgICAgID0gezB4NTAsIDB4NTYsIDB4MDAsIDB4NTN9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMzIweDI0MF9GU1ROW10gPSB7MHg1YSwgMHg1YiwgMHgwMCwgMHgwMH07ICAvKiBGU1ROICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF80MDB4MzAwW10gICAgICA9IHsweDUxLCAweDU3LCAweDAwLCAweDU0fTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzUxMngzODRbXSAgICAgID0gezB4NTIsIDB4NTgsIDB4MDAsIDB4NWN9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfNjQweDQwMFtdICAgICAgPSB7MHgyZiwgMHg1ZCwgMHgwMCwgMHg1ZX07Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF82NDB4NDgwW10gICAgICA9IHsweDJlLCAweDQ0LCAweDAwLCAweDYyfTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzcyMHg0ODBbXSAgICAgID0gezB4MzEsIDB4MzMsIDB4MDAsIDB4MzV9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfNzIweDU3NltdICAgICAgPSB7MHgzMiwgMHgzNCwgMHgwMCwgMHgzNn07Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF83Njh4NTc2W10gICAgICA9IHsweDVmLCAweDYwLCAweDAwLCAweDYxfTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzgwMHg0ODBbXSAgICAgID0gezB4NzAsIDB4N2EsIDB4MDAsIDB4NzZ9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfODAweDYwMFtdICAgICAgPSB7MHgzMCwgMHg0NywgMHgwMCwgMHg2M307Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF84NDh4NDgwW10gICAgICA9IHsweDM5LCAweDNiLCAweDAwLCAweDNlfTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4Xzg1Nng0ODBbXSAgICAgID0gezB4M2YsIDB4NDIsIDB4MDAsIDB4NDV9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfOTYweDU0MFtdICAgICAgPSB7MHgxZCwgMHgxZSwgMHgwMCwgMHgxZn07ICAvKiAzMTUgc2VyaWVzIG9ubHkgKi8KLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4Xzk2MHg2MDBbXSAgICAgID0gezB4MjAsIDB4MjEsIDB4MDAsIDB4MjJ9OyAgLyogMzE1IHNlcmllcyBvbmx5ICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8xMDI0eDc2OFtdICAgICA9IHsweDM4LCAweDRhLCAweDAwLCAweDY0fTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzEwMjR4NTc2W10gICAgID0gezB4NzEsIDB4NzQsIDB4MDAsIDB4Nzd9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMTAyNHg2MDBbXSAgICAgPSB7MHgyMCwgMHgyMSwgMHgwMCwgMHgyMn07ICAvKiAzMDAgc2VyaWVzIG9ubHkgKi8KLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzEyODB4MTAyNFtdICAgID0gezB4M2EsIDB4NGQsIDB4MDAsIDB4NjV9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMTI4MHg5NjBbXSAgICAgPSB7MHg3YywgMHg3ZCwgMHgwMCwgMHg3ZX07Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8xMTUyeDc2OFtdICAgICA9IHsweDIzLCAweDI0LCAweDAwLCAweDI1fTsgIC8qIDMwMCBzZXJpZXMgb25seSAqLwotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMTE1Mng4NjRbXSAgICAgPSB7MHgyOSwgMHgyYSwgMHgwMCwgMHgyYn07Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8zMDBfMTI4MHg3NjhbXSA9IHsweDU1LCAweDVhLCAweDAwLCAweDVifTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzMxMF8xMjgweDc2OFtdID0gezB4MjMsIDB4MjQsIDB4MDAsIDB4MjV9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMTI4MHg3MjBbXSAgICAgPSB7MHg3OSwgMHg3NSwgMHgwMCwgMHg3OH07Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8xMjgweDgwMFtdICAgICA9IHsweDE0LCAweDE1LCAweDAwLCAweDE2fTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzEzNjB4NzY4W10gICAgID0gezB4NDgsIDB4NGIsIDB4MDAsIDB4NGV9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMzAwXzEzNjB4MTAyNFtdPSB7MHg2NywgMHg2ZiwgMHgwMCwgMHg3Mn07ICAvKiAzMDAgc2VyaWVzLCBCQVJDTyBvbmx5ICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8xNDAweDEwNTBbXSAgICA9IHsweDI2LCAweDI3LCAweDAwLCAweDI4fTsgIC8qIDMxNSBzZXJpZXMgb25seSAqLwotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMTY4MHgxMDUwW10gICAgPSB7MHgxNywgMHgxOCwgMHgwMCwgMHgxOX07ICAvKiAzMTUgc2VyaWVzIG9ubHkgKi8KLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzE2MDB4MTIwMFtdICAgID0gezB4M2MsIDB4M2QsIDB4MDAsIDB4NjZ9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMTkyMHgxMDgwW10gICAgPSB7MHgyYywgMHgyZCwgMHgwMCwgMHg3M307ICAvKiAzMTUgc2VyaWVzIG9ubHkgKi8KLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzE5MjB4MTQ0MFtdICAgID0gezB4NjgsIDB4NjksIDB4MDAsIDB4NmJ9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMzAwXzIwNDh4MTUzNltdPSB7MHg2YywgMHg2ZCwgMHgwMCwgMHgwMH07Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8zMTBfMjA0OHgxNTM2W109IHsweDZjLCAweDZkLCAweDAwLCAweDZlfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMzIweDIwMFtdICAgICAgPSB7MHg1OSwgMHg0MSwgMHgwMCwgMHg0Zn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzMyMHgyNDBbXSAgICAgID0gezB4NTAsIDB4NTYsIDB4MDAsIDB4NTN9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8zMjB4MjQwX0ZTVE5bXSA9IHsweDVhLCAweDViLCAweDAwLCAweDAwfTsgIC8qIEZTVE4gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfNDAweDMwMFtdICAgICAgPSB7MHg1MSwgMHg1NywgMHgwMCwgMHg1NH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzUxMngzODRbXSAgICAgID0gezB4NTIsIDB4NTgsIDB4MDAsIDB4NWN9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF82NDB4NDAwW10gICAgICA9IHsweDJmLCAweDVkLCAweDAwLCAweDVlfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfNjQweDQ4MFtdICAgICAgPSB7MHgyZSwgMHg0NCwgMHgwMCwgMHg2Mn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzcyMHg0ODBbXSAgICAgID0gezB4MzEsIDB4MzMsIDB4MDAsIDB4MzV9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF83MjB4NTc2W10gICAgICA9IHsweDMyLCAweDM0LCAweDAwLCAweDM2fTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfNzY4eDU3NltdICAgICAgPSB7MHg1ZiwgMHg2MCwgMHgwMCwgMHg2MX07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzgwMHg0ODBbXSAgICAgID0gezB4NzAsIDB4N2EsIDB4MDAsIDB4NzZ9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF84MDB4NjAwW10gICAgICA9IHsweDMwLCAweDQ3LCAweDAwLCAweDYzfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfODQ4eDQ4MFtdICAgICAgPSB7MHgzOSwgMHgzYiwgMHgwMCwgMHgzZX07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4Xzg1Nng0ODBbXSAgICAgID0gezB4M2YsIDB4NDIsIDB4MDAsIDB4NDV9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF85NjB4NTQwW10gICAgICA9IHsweDFkLCAweDFlLCAweDAwLCAweDFmfTsgIC8qIDMxNSBzZXJpZXMgb25seSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF85NjB4NjAwW10gICAgICA9IHsweDIwLCAweDIxLCAweDAwLCAweDIyfTsgIC8qIDMxNSBzZXJpZXMgb25seSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8xMDI0eDc2OFtdICAgICA9IHsweDM4LCAweDRhLCAweDAwLCAweDY0fTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTAyNHg1NzZbXSAgICAgPSB7MHg3MSwgMHg3NCwgMHgwMCwgMHg3N307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzEwMjR4NjAwW10gICAgID0gezB4MjAsIDB4MjEsIDB4MDAsIDB4MjJ9OyAgLyogMzAwIHNlcmllcyBvbmx5ICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzEyODB4MTAyNFtdICAgID0gezB4M2EsIDB4NGQsIDB4MDAsIDB4NjV9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8xMjgweDk2MFtdICAgICA9IHsweDdjLCAweDdkLCAweDAwLCAweDdlfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTE1Mng3NjhbXSAgICAgPSB7MHgyMywgMHgyNCwgMHgwMCwgMHgyNX07ICAvKiAzMDAgc2VyaWVzIG9ubHkgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTE1Mng4NjRbXSAgICAgPSB7MHgyOSwgMHgyYSwgMHgwMCwgMHgyYn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzMwMF8xMjgweDc2OFtdID0gezB4NTUsIDB4NWEsIDB4MDAsIDB4NWJ9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8zMTBfMTI4MHg3NjhbXSA9IHsweDIzLCAweDI0LCAweDAwLCAweDI1fTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTI4MHg3MjBbXSAgICAgPSB7MHg3OSwgMHg3NSwgMHgwMCwgMHg3OH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzEyODB4ODAwW10gICAgID0gezB4MTQsIDB4MTUsIDB4MDAsIDB4MTZ9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8xMjgweDg1NFtdICAgICA9IHsweDFhLCAweDFiLCAweDAwLCAweDFjfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTM2MHg3NjhbXSAgICAgPSB7MHg0OCwgMHg0YiwgMHgwMCwgMHg0ZX07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzMwMF8xMzYweDEwMjRbXT0gezB4NjcsIDB4NmYsIDB4MDAsIDB4NzJ9OyAgLyogMzAwIHNlcmllcywgQkFSQ08gb25seSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8xNDAweDEwNTBbXSAgICA9IHsweDI2LCAweDI3LCAweDAwLCAweDI4fTsgIC8qIDMxNSBzZXJpZXMgb25seSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8xNjgweDEwNTBbXSAgICA9IHsweDE3LCAweDE4LCAweDAwLCAweDE5fTsgIC8qIDMxNSBzZXJpZXMgb25seSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8xNjAweDEyMDBbXSAgICA9IHsweDNjLCAweDNkLCAweDAwLCAweDY2fTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTkyMHgxMDgwW10gICAgPSB7MHgyYywgMHgyZCwgMHgwMCwgMHg3M307ICAvKiAzMTUgc2VyaWVzIG9ubHkgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTkyMHgxNDQwW10gICAgPSB7MHg2OCwgMHg2OSwgMHgwMCwgMHg2Yn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzMwMF8yMDQ4eDE1MzZbXT0gezB4NmMsIDB4NmQsIDB4MDAsIDB4MDB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8zMTBfMjA0OHgxNTM2W109IHsweDZjLCAweDZkLCAweDAwLCAweDZlfTsKIAotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVNfRFJBTVR5cGVbMTddWzVdPXsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBTaVNfRFJBTVR5cGVbMTddWzVdPXsKIAl7MHgwQywweDBBLDB4MDIsMHg0MCwweDM5fSwKIAl7MHgwRCwweDBBLDB4MDEsMHg0MCwweDQ4fSwKIAl7MHgwQywweDA5LDB4MDIsMHgyMCwweDM1fSwKQEAgLTEzNyw3ICsxNDgsNyBAQAogCXsweDA5LDB4MDgsMHgwMSwweDAxLDB4MDB9CiB9OwogCi1zdGF0aWMgY29uc3QgVVNIT1JUIFNpU19TRFJEUkFNX1RZUEVbMTNdWzVdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBTaVNfU0RSRFJBTV9UWVBFWzEzXVs1XSA9CiB7CiAJeyAyLDEyLCA5LDY0LDB4MzV9LAogCXsgMSwxMywgOSw2NCwweDQ0fSwKQEAgLTE1NCw3ICsxNjUsNyBAQAogCXsgMSwgOSwgOCwgMiwweDAwfQogfTsKIAotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVNfRERSRFJBTV9UWVBFWzRdWzVdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBTaVNfRERSRFJBTV9UWVBFWzRdWzVdID0KIHsKIAl7IDIsMTIsIDksNjQsMHgzNX0sCiAJeyAyLDEyLCA4LDMyLDB4MzF9LApAQCAtMTYyLDcgKzE3Myw3IEBACiAJeyAyLCA5LCA4LCA0LDB4MDF9CiB9OwogCi1zdGF0aWMgY29uc3QgVVNIT1JUIFNpU19NREFfREFDW10gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX01EQV9EQUNbXSA9CiB7CiAJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAogICAgICAgICAweDE1LDB4MTUsMHgxNSwweDE1LDB4MTUsMHgxNSwweDE1LDB4MTUsCkBAIC0xNzQsNyArMTg1LDcgQEAKICAgICAgICAgMHgzRiwweDNGLDB4M0YsMHgzRiwweDNGLDB4M0YsMHgzRiwweDNGCiB9OwogCi1zdGF0aWMgY29uc3QgVVNIT1JUIFNpU19DR0FfREFDW10gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX0NHQV9EQUNbXSA9CiB7CiAgICAgICAgIDB4MDAsMHgxMCwweDA0LDB4MTQsMHgwMSwweDExLDB4MDksMHgxNSwKICAgICAgICAgMHgwMCwweDEwLDB4MDQsMHgxNCwweDAxLDB4MTEsMHgwOSwweDE1LApAQCAtMTg2LDcgKzE5Nyw3IEBACiAgICAgICAgIDB4MkEsMHgzQSwweDJFLDB4M0UsMHgyQiwweDNCLDB4MkYsMHgzRgogfTsKIAotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVNfRUdBX0RBQ1tdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19FR0FfREFDW10gPQogewogICAgICAgICAweDAwLDB4MTAsMHgwNCwweDE0LDB4MDEsMHgxMSwweDA1LDB4MTUsCiAgICAgICAgIDB4MjAsMHgzMCwweDI0LDB4MzQsMHgyMSwweDMxLDB4MjUsMHgzNSwKQEAgLTE5OCw3ICsyMDksNyBAQAogICAgICAgICAweDJBLDB4M0EsMHgyRSwweDNFLDB4MkIsMHgzQiwweDJGLDB4M0YKIH07CiAKLXN0YXRpYyBjb25zdCBVU0hPUlQgU2lTX1ZHQV9EQUNbXSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfVkdBX0RBQ1tdID0KIHsKIAkweDAwLDB4MTAsMHgwNCwweDE0LDB4MDEsMHgxMSwweDA5LDB4MTUsCiAJMHgyQSwweDNBLDB4MkUsMHgzRSwweDJCLDB4M0IsMHgyRiwweDNGLApAQCAtMjEyLDcgKzIyMywzMSBAQAogCTB4MEIsMHgwQywweDBELDB4MEYsMHgxMAogfTsKIAotc3RhdGljIGNvbnN0IFNpU19TdFJlc0luZm9TdHJ1Y3QgU2lTX1N0UmVzSW5mb1tdPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfU3QgU2lTX1NNb2RlSURUYWJsZVtdID0KK3sKKwl7MHgwMSwweDkyMDgsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHg0MH0sCisJezB4MDEsMHgxMjEwLDB4MTQsMHgwMSwweDAxLDB4MDAsMHgwMSwweDAwLDB4NDB9LAorCXsweDAxLDB4MTAxMCwweDE3LDB4MDIsMHgwMiwweDAwLDB4MDEsMHgwMSwweDQwfSwKKwl7MHgwMywweDgyMDgsMHgwMywweDAwLDB4MDAsMHgwMCwweDAxLDB4MDIsMHg0MH0sCisJezB4MDMsMHgwMjEwLDB4MTYsMHgwMSwweDAxLDB4MDAsMHgwMSwweDAyLDB4NDB9LAorCXsweDAzLDB4MDAxMCwweDE4LDB4MDIsMHgwMiwweDAwLDB4MDEsMHgwMywweDQwfSwKKwl7MHgwNSwweDkyMDksMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHg0MH0sCisJezB4MDYsMHg4MjA5LDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA1LDB4NDB9LAorCXsweDA3LDB4MDAwMCwweDA3LDB4MDMsMHgwMywweDAwLDB4MDEsMHgwMywweDQwfSwKKwl7MHgwNywweDAwMDAsMHgxOSwweDAyLDB4MDIsMHgwMCwweDAxLDB4MDMsMHg0MH0sCisJezB4MGQsMHg5MjBhLDB4MGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4NDB9LAorCXsweDBlLDB4ODIwYSwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNSwweDQwfSwKKwl7MHgwZiwweDAyMDIsMHgxMSwweDAxLDB4MDEsMHgwMCwweDAwLDB4MDUsMHg0MH0sCisJezB4MTAsMHgwMjEyLDB4MTIsMHgwMSwweDAxLDB4MDAsMHgwMCwweDA1LDB4NDB9LAorCXsweDExLDB4MDIxMiwweDFhLDB4MDQsMHgwNCwweDAwLDB4MDAsMHgwNSwweDQwfSwKKwl7MHgxMiwweDAyMTIsMHgxYiwweDA0LDB4MDQsMHgwMCwweDAwLDB4MDUsMHg0MH0sCisJezB4MTMsMHgwMjFiLDB4MWMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4NDB9LAorCXsweDEyLDB4MDAxMCwweDE4LDB4MDIsMHgwMiwweDAwLDB4MDAsMHgwNSwweDQwfSwKKwl7MHgxMiwweDAyMTAsMHgxOCwweDAxLDB4MDEsMHgwMCwweDAwLDB4MDUsMHg0MH0sCisJezB4ZmYsMHgwMDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19TdFJlc0luZm9fUyBTaVNfU3RSZXNJbmZvW109CiB7CiAJeyA2NDAsNDAwfSwKIAl7IDY0MCwzNTB9LApAQCAtMjIxLDcgKzI1Niw3IEBACiAJeyA2NDAsNDgwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19Nb2RlUmVzSW5mb1N0cnVjdCBTaVNfTW9kZVJlc0luZm9bXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19Nb2RlUmVzSW5mb19TIFNpU19Nb2RlUmVzSW5mb1tdID0KIHsKIAl7ICAzMjAsIDIwMCwgOCwgOH0sICAgLyogMHgwMCAqLwogCXsgIDMyMCwgMjQwLCA4LCA4fSwgICAvKiAweDAxICovCkBAIC0yNTYsMTEgKzI5MSwxMiBAQAogCXsgMTI4MCwgODAwLCA4LDE2fSwgICAvKiAweDFlICovCiAJeyAxOTIwLDEwODAsIDgsMTZ9LCAgIC8qIDB4MWYgKi8KIAl7ICA5NjAsIDU0MCwgOCwxNn0sICAgLyogMHgyMCAqLwotCXsgIDk2MCwgNjAwLCA4LDE2fSAgICAvKiAweDIxICovCisJeyAgOTYwLCA2MDAsIDgsMTZ9LCAgIC8qIDB4MjEgKi8KKwl7IDEyODAsIDg1NCwgOCwxNn0gICAgLyogMHgyMiAqLwogfTsKIAogI2lmIGRlZmluZWQoU0lTMzAwKSB8fCBkZWZpbmVkKFNJUzMxNUgpCi1zdGF0aWMgY29uc3QgU2lTX1N0YW5kVGFibGVTdHJ1Y3QgU2lTX1N0YW5kVGFibGVbXT0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1N0YW5kVGFibGVfUyBTaVNfU3RhbmRUYWJsZVtdPQogewogLyogMHgwMDogTURfMF8yMDAgKi8KICB7CkBAIC03MDQsMTEgKzc0MCwxMSBAQAogLyogU0lTIFZJREVPIEJSSURHRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1NvZnRTZXR0aW5nICA9IDB4MzA7ICAgLyogUkFNIHNldHRpbmcgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19Tb2Z0U2V0dGluZyAgPSAweDMwOyAgIC8qIFJBTSBzZXR0aW5nICovCiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfT3V0cHV0U2VsZWN0ID0gMHg0MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19PdXRwdXRTZWxlY3QgPSAweDQwOwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX05UU0NUaW1pbmdbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19OVFNDVGltaW5nW10gPSB7CiAJMHgxNywweDFkLDB4MDMsMHgwOSwweDA1LDB4MDYsMHgwYywweDBjLAogCTB4OTQsMHg0OSwweDAxLDB4MGEsMHgwNiwweDBkLDB4MDQsMHgwYSwKIAkweDA2LDB4MTQsMHgwZCwweDA0LDB4MGEsMHgwMCwweDg1LDB4MWIsCkBAIC03MTksNyArNzU1LDcgQEAKIAkweDAwLDB4NDAsMHg0NCwweDAwLDB4ZGIsMHgwMiwweDNiLDB4MDAKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfUEFMVGltaW5nW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfUEFMVGltaW5nW10gPSB7CiAJMHgxOSwweDUyLDB4MzUsMHg2ZSwweDA0LDB4MzgsMHgzZCwweDcwLAogCTB4OTQsMHg0OSwweDAxLDB4MTIsMHgwNiwweDNlLDB4MzUsMHg2ZCwKIAkweDA2LDB4MTQsMHgzZSwweDM1LDB4NmQsMHgwMCwweDQ1LDB4MmIsCkBAIC03MzAsOCArNzY2LDggQEAKIAkweDAwLDB4NDAsMHgzZSwweDAwLDB4ZTEsMHgwMiwweDI4LDB4MDAKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfSGlUVkV4dFRpbWluZ1tdID0gewotICAgICAgICAweDMyLDB4NjUsMHgyYywweDVmLDB4MDgsMHgzMSwweDNhLDB4NjQsCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfSGlUVkV4dFRpbWluZ1tdID0geworCTB4MzIsMHg2NSwweDJjLDB4NWYsMHgwOCwweDMxLDB4M2EsMHg2NCwKIAkweDI4LDB4MDIsMHgwMSwweDNkLDB4MDYsMHgzZSwweDM1LDB4NmQsCiAJMHgwNiwweDE0LDB4M2UsMHgzNSwweDZkLDB4MDAsMHhjNSwweDNmLAogCTB4NjQsMHg5MCwweDMzLDB4OGMsMHgxOCwweDM2LDB4M2UsMHgxMywKQEAgLTc0MSw4ICs3NzcsOCBAQAogCTB4NjMsMHg0ZiwweDI3LDB4MDAsMHhmYywweGZmLDB4NmEsMHgwMAogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19IaVRWU3QxVGltaW5nW10gPSB7Ci0gICAgICAgIDB4MzIsMHg2NSwweDJjLDB4NWYsMHgwOCwweDMxLDB4M2EsMHg2NSwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19IaVRWU3QxVGltaW5nW10gPSB7CisJMHgzMiwweDY1LDB4MmMsMHg1ZiwweDA4LDB4MzEsMHgzYSwweDY1LAogCTB4MjgsMHgwMiwweDAxLDB4M2QsMHgwNiwweDNlLDB4MzUsMHg2ZCwKIAkweDA2LDB4MTQsMHgzZSwweDM1LDB4NmQsMHgwMCwweGM1LDB4M2YsCiAJMHg2NSwweDkwLDB4N2IsMHhhOCwweDAzLDB4ZjAsMHg4NywweDAzLApAQCAtNzUyLDggKzc4OCw4IEBACiAJMHhhZiwweDVkLDB4MGUsMHgwMCwweGZjLDB4ZmYsMHgyZCwweDAwCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX0hpVFZTdDJUaW1pbmdbXSA9IHsKLSAgICAgICAgMHgzMiwweDY1LDB4MmMsMHg1ZiwweDA4LDB4MzEsMHgzYSwweDY0LAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX0hpVFZTdDJUaW1pbmdbXSA9IHsKKwkweDMyLDB4NjUsMHgyYywweDVmLDB4MDgsMHgzMSwweDNhLDB4NjQsCiAJMHgyOCwweDAyLDB4MDEsMHgzZCwweDA2LDB4M2UsMHgzNSwweDZkLAogCTB4MDYsMHgxNCwweDNlLDB4MzUsMHg2ZCwweDAwLDB4YzUsMHgzZiwKIAkweDY0LDB4OTAsMHgzMywweDhjLDB4MTgsMHgzNiwweDNlLDB4MTMsCkBAIC03NjQsOCArODAwLDggQEAKIH07CiAKICNpZiAwCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX0hpVFZUZXh0VGltaW5nW10gPSB7Ci0gICAgICAgIDB4MzIsMHg2NSwweDJjLDB4NWYsMHgwOCwweDMxLDB4M2EsMHg2NSwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19IaVRWVGV4dFRpbWluZ1tdID0geworCTB4MzIsMHg2NSwweDJjLDB4NWYsMHgwOCwweDMxLDB4M2EsMHg2NSwKIAkweDI4LDB4MDIsMHgwMSwweDNkLDB4MDYsMHgzZSwweDM1LDB4NmQsCiAJMHgwNiwweDE0LDB4M2UsMHgzNSwweDZkLDB4MDAsMHhjNSwweDNmLAogCTB4NjUsMHg5MCwweGU3LDB4YmMsMHgwMywweDBjLDB4OTcsMHgwMywKQEAgLTc3Niw4ICs4MTIsOCBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX0hpVFZHcm91cDNEYXRhW10gPSB7Ci0gICAgICAgIDB4MDAsMHgxYSwweDIyLDB4NjMsMHg2MiwweDIyLDB4MDgsMHg1ZiwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19IaVRWR3JvdXAzRGF0YVtdID0geworCTB4MDAsMHgxYSwweDIyLDB4NjMsMHg2MiwweDIyLDB4MDgsMHg1ZiwKIAkweDA1LDB4MjEsMHhiMiwweGIyLDB4NTUsMHg3NywweDJhLDB4YTYsCiAJMHgyNSwweDJmLDB4NDcsMHhmYSwweGM4LDB4ZmYsMHg4ZSwweDIwLAogCTB4OGMsMHg2ZSwweDYwLDB4MmUsMHg1OCwweDQ4LDB4NzIsMHg0NCwKQEAgLTc4Nyw4ICs4MjMsOCBAQAogCTB4MTgsMHgwNSwweDE4LDB4MDUsMHg0YywweGE4LDB4MDEKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfSGlUVkdyb3VwM1NpbXVbXSA9IHsKLSAgICAgICAgMHgwMCwweDFhLDB4MjIsMHg2MywweDYyLDB4MjIsMHgwOCwweDk1LAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX0hpVFZHcm91cDNTaW11W10gPSB7CisJMHgwMCwweDFhLDB4MjIsMHg2MywweDYyLDB4MjIsMHgwOCwweDk1LAogCTB4ZGIsMHgyMCwweGI4LDB4YjgsMHg1NSwweDQ3LDB4MmEsMHhhNiwKIAkweDI1LDB4MmYsMHg0NywweGZhLDB4YzgsMHhmZiwweDhlLDB4MjAsCiAJMHg4YywweDZlLDB4NjAsMHgxNSwweDI2LDB4ZDMsMHhlNCwweDExLApAQCAtNzk5LDggKzgzNSw4IEBACiB9OwogCiAjaWYgMAotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19IaVRWR3JvdXAzVGV4dFtdID0gewotICAgICAgICAweDAwLDB4MWEsMHgyMiwweDYzLDB4NjIsMHgyMiwweDA4LDB4YTcsCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfSGlUVkdyb3VwM1RleHRbXSA9IHsKKwkweDAwLDB4MWEsMHgyMiwweDYzLDB4NjIsMHgyMiwweDA4LDB4YTcsCiAJMHhmNSwweDIwLDB4Y2UsMHhjZSwweDU1LDB4NDcsMHgyYSwweGE2LAogCTB4MjUsMHgyZiwweDQ3LDB4ZmEsMHhjOCwweGZmLDB4OGUsMHgyMCwKIAkweDhjLDB4NmUsMHg2MCwweDE4LDB4MmMsMHgwYywweDIwLDB4MjIsCkBAIC04MTEsMTM2ICs4NDcsMTQxIEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfTlRTQ1BoYXNlW10gICAgPSB7MHgyMSwweGVkLDB4YmEsMHgwOH07Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1BBTFBoYXNlW10gICAgID0gezB4MmEsMHgwNSwweGUzLDB4MDB9Owotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19QQUxNUGhhc2VbXSAgICA9IHsweDIxLDB4RTQsMHgyRSwweDlCfTsKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfUEFMTlBoYXNlW10gICAgPSB7MHgyMSwweEY0LDB4M0UsMHhCQX07Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX05UU0NQaGFzZTJbXSAgID0gezB4MjEsMHhGMCwweDdCLDB4RDZ9Owotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19QQUxQaGFzZTJbXSAgICA9IHsweDJhLDB4MDksMHg4NiwweGU5fTsKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfUEFMTVBoYXNlMltdICAgPSB7MHgyMSwweEU2LDB4RUYsMHhBNH07Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1BBTE5QaGFzZTJbXSAgID0gezB4MjEsMHhGNiwweDk0LDB4NDZ9Owotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19TcGVjaWFsUGhhc2VbXSA9IHsweDFlLDB4OGMsMHg1YywweDdhfTsKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfU3BlY2lhbFBoYXNlTVtdPSB7MHgxZSwweDgzLDB4MGEsMHhlMH07Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1NwZWNpYWxQaGFzZUpbXT0gezB4MjUsMHhkNCwweGZkLDB4NWV9OwotCi1zdGF0aWMgY29uc3QgU2lTX1RWRGF0YVN0cnVjdCAgU2lTX1N0UEFMRGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YSBTaVNfU3RQQUxEYXRhW10gPQogewotIHsgICAgMSwgICAxLCA4NjQsIDUyNSwxMjcwLCA0MDAsIDEwMCwgICAwLCA3NjAsMHhmNCwweGZmLDB4MWMsMHgyMn0sCi0geyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDM1MCwgMTAwLCAgIDAsIDc2MCwweGY0LDB4ZmYsMHgxYywweDIyfSwKLSB7ICAgIDEsICAgMSwgODY0LCA1MjUsMTI3MCwgNDAwLCAgIDAsICAgMCwgNzIwLDB4ZjEsMHgwNCwweDFmLDB4MTh9LAotIHsgICAgMSwgICAxLCA4NjQsIDUyNSwxMjcwLCAzNTAsICAgMCwgICAwLCA3MjAsMHhmNCwweDBiLDB4MWMsMHgwYX0sCi0geyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDQ4MCwgIDUwLCAgIDAsIDc2MCwweGY0LDB4ZmYsMHgxYywweDIyfSwKLSB7ICAgIDEsICAgMSwgODY0LCA1MjUsMTI3MCwgNjAwLCAgNTAsICAgMCwgICAwLDB4ZjQsMHhmZiwweDFjLDB4MjJ9CisgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDQwMCwgMTAwLCAwLCA3NjAsICAgIDAsMHhmNCwweGZmLDB4MWMsMHgyMn0sCisgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDM1MCwgMTAwLCAwLCA3NjAsICAgIDAsMHhmNCwweGZmLDB4MWMsMHgyMn0sCisgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDQwMCwgICAwLCAwLCA3MjAsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCisgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDM1MCwgICAwLCAwLCA3MjAsICAgIDAsMHhmNCwweDBiLDB4MWMsMHgwYX0sCisgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDQ4MCwgIDUwLCAwLCA3NjAsICAgIDAsMHhmNCwweGZmLDB4MWMsMHgyMn0sCisgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDYwMCwgIDUwLCAwLCAgIDAsMHgzMDAsMHhmNCwweGZmLDB4MWMsMHgyMn0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfVFZEYXRhU3RydWN0ICBTaVNfRXh0UEFMRGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YSBTaVNfRXh0UEFMRGF0YVtdID0KIHsKLSB7ICAgMjcsICAxMCwgODQ4LCA0NDgsMTI3MCwgNTMwLCAgNTAsICAgMCwgIDUwLDB4ZjQsMHhmZiwweDFjLDB4MjJ9LCAgLyogNjQweDQwMCwgMzIweDIwMCAqLwotIHsgIDEwOCwgIDM1LCA4NDgsIDM5OCwxMjcwLCA1MzAsICA1MCwgICAwLCAgNTAsMHhmNCwweGZmLDB4MWMsMHgyMn0sCi0geyAgIDEyLCAgIDUsIDk1NCwgNDQ4LDEyNzAsIDUzMCwgIDUwLCAgIDAsICA1MCwweGYxLDB4MDQsMHgxZiwweDE4fSwKLSB7ICAgIDksICAgNCwgOTYwLCA0NjMsMTY0NCwgNDM4LCAgNTAsICAgMCwgIDUwLDB4ZjQsMHgwYiwweDFjLDB4MGF9LAotIHsgICAgOSwgICA0LCA4NDgsIDUyOCwxMjcwLCA1MzAsICAgMCwgICAwLCAgNTAsMHhmNSwweGZiLDB4MWIsMHgyYX0sICAvKiA2NDB4NDgwLCAzMjB4MjQwICovCi0vKnsgIDM2LCAgMjUsMTA2MCwgNjQ4LDEzMTYsIDUzMCwgNDM4LCAgIDAsIDQzOCwweGViLDB4MDUsMHgyNSwweDE2fSwqLy8qIDgwMHg2MDAsIDQwMHgzMDAgKi8KLSB7ICAgMzYsICAyNSwxMDYwLCA2NDgsMTI3MCwgNTMwLCA0MzgsICAgMCwgNDM4LDB4ZWIsMHgwNSwweDI1LDB4MTZ9LCAgLyogODAweDYwMCwgNDAweDMwMCAtIGJldHRlciAqLwotIHsgICAgMywgICAyLDEwODAsIDYxOSwxMjcwLCA1NDAsIDQzOCwgICAwLCA0MzgsMHhmMywweDAwLDB4MWQsMHgyMH0sICAvKiA3MjB4NTc2ICovCi0geyAgICAxLCAgIDEsMTE3MCwgODIxLDEyNzAsIDUyMCwgNjg2LCAgIDAsIDY4NiwweEYzLDB4MDAsMHgxRCwweDIwfSwgIC8qIDEwMjR4NzY4ICovCi0geyAgICAxLCAgIDEsMTE3MCwgODIxLDEyNzAsIDUyMCwgNjg2LCAgIDAsIDY4NiwweEYzLDB4MDAsMHgxRCwweDIwfSwgIC8qIDEwMjR4NzY4IChmb3IgTlRTQyBlcXUpICovCi0geyAgICA5LCAgIDQsIDg0OCwgNTI4LDEyNzAsIDUzMCwgICAwLCAgIDAsICA1MCwweGY1LDB4ZmIsMHgxYiwweDJhfSAgIC8qIDcyMHg0ODAgdGVzdCAqLworIHsgICAyNywgIDEwLCA4NDgsIDQ0OCwxMjcwLCA1MzAsICA1MCwgMCwgIDUwLCAgICAwLDB4ZjQsMHhmZiwweDFjLDB4MjJ9LCAgLyogNjQweDQwMCwgMzIweDIwMCAqLworIHsgIDEwOCwgIDM1LCA4NDgsIDM5OCwxMjcwLCA1MzAsICA1MCwgMCwgIDUwLCAgICAwLDB4ZjQsMHhmZiwweDFjLDB4MjJ9LAorIHsgICAxMiwgICA1LCA5NTQsIDQ0OCwxMjcwLCA1MzAsICA1MCwgMCwgIDUwLCAgICAwLDB4ZjEsMHgwNCwweDFmLDB4MTh9LAorIHsgICAgOSwgICA0LCA5NjAsIDQ2MywxNjQ0LCA0MzgsICA1MCwgMCwgIDUwLCAgICAwLDB4ZjQsMHgwYiwweDFjLDB4MGF9LAorIHsgICAgOSwgICA0LCA4NDgsIDUyOCwxMjcwLCA1MzAsICAgMCwgMCwgIDUwLCAgICAwLDB4ZjUsMHhmYiwweDFiLDB4MmF9LCAgLyogNjQweDQ4MCwgMzIweDI0MCAqLworIHsgICAzNiwgIDI1LDEwNjAsIDY0OCwxMjcwLCA1MzAsIDQzOCwgMCwgNDM4LCAgICAwLDB4ZWIsMHgwNSwweDI1LDB4MTZ9LCAgLyogODAweDYwMCwgNDAweDMwMCAqLworIHsgICAgMywgICAyLDEwODAsIDYxOSwxMjcwLCA1NDAsIDQzOCwgMCwgNDM4LCAgICAwLDB4ZjMsMHgwMCwweDFkLDB4MjB9LCAgLyogNzIweDU3NiAqLworIHsgICAgMSwgICAxLDExNzAsIDgyMSwxMjcwLCA1MjAsIDY4NiwgMCwgNjg2LCAgICAwLDB4RjMsMHgwMCwweDFELDB4MjB9LCAgLyogMTAyNHg3NjggKi8KKyB7ICAgIDEsICAgMSwxMTcwLCA4MjEsMTI3MCwgNTIwLCA2ODYsIDAsIDY4NiwgICAgMCwweEYzLDB4MDAsMHgxRCwweDIwfSwgIC8qIDEwMjR4NzY4IChmb3IgTlRTQyBlcXUpICovCisgeyAgICA5LCAgIDQsIDg0OCwgNTI4LDEyNzAsIDUzMCwgICAwLCAwLCAgNTAsICAgIDAsMHhmNSwweGZiLDB4MWIsMHgyYX0gICAvKiA3MjB4NDgwICovCiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX1RWRGF0YVN0cnVjdCAgU2lTX1N0TlRTQ0RhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19UVkRhdGEgU2lTX1N0TlRTQ0RhdGFbXSA9CiB7Ci0geyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDQwMCwgIDUwLCAgIDAsIDc2MCwweGYxLDB4MDQsMHgxZiwweDE4fSwKLSB7ICAgIDEsICAgMSwgODU4LCA1MjUsMTI3MCwgMzUwLCAgNTAsICAgMCwgNjQwLDB4ZjEsMHgwNCwweDFmLDB4MTh9LAotIHsgICAgMSwgICAxLCA4NTgsIDUyNSwxMjcwLCA0MDAsICAgMCwgICAwLCA3MjAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCi0geyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDM1MCwgICAwLCAgIDAsIDcyMCwweGY0LDB4MGIsMHgxYywweDBhfSwKLSB7ICAgIDEsICAgMSwgODU4LCA1MjUsMTI3MCwgNDgwLCAgIDAsICAgMCwgNzYwLDB4ZjEsMHgwNCwweDFmLDB4MTh9CisgeyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDQwMCwgIDUwLCAwLCA3NjAsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCisgeyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDM1MCwgIDUwLCAwLCA2NDAsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCisgeyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDQwMCwgICAwLCAwLCA3MjAsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCisgeyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDM1MCwgICAwLCAwLCA3MjAsICAgIDAsMHhmNCwweDBiLDB4MWMsMHgwYX0sCisgeyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDQ4MCwgICAwLCAwLCA3NjAsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfVFZEYXRhU3RydWN0ICBTaVNfRXh0TlRTQ0RhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19UVkRhdGEgU2lTX0V4dE5UU0NEYXRhW10gPQogewotIHsgIDE0MywgIDY1LCA4NTgsIDQ0MywxMjcwLCA0NDAsIDE3MSwgICAwLCAxNzEsMHhmMSwweDA0LDB4MWYsMHgxOH0sICAgIC8qIDY0MHg0MDAsIDMyMHgyMDAgKi8KLSB7ICAgODgsICAzNSwgODU4LCAzOTMsMTI3MCwgNDQwLCAxNzEsICAgMCwgMTcxLDB4ZjEsMHgwNCwweDFmLDB4MTh9LAotIHsgIDE0MywgIDcwLCA5MjQsIDQ0MywxMjcwLCA0NDAsICA5MiwgICAwLCAgOTIsMHhmMSwweDA0LDB4MWYsMHgxOH0sCi0geyAgMTQzLCAgNzAsIDkyNCwgMzkzLDEyNzAsIDQ0MCwgIDkyLCAgIDAsICA5MiwweGY0LDB4MGIsMHgxYywweDBhfSwKLSB7ICAxNDMsICA3NiwgODM2LCA1MjMsMTI3MCwgNDQwLCAyMjQsICAgMCwgICAwLDB4ZjEsMHgwNSwweDFmLDB4MTZ9LCAgICAvKiA2NDB4NDgwLCAzMjB4MjQwICovCi0geyAgMTQzLCAxMjAsMTA1NiwgNjQzLDEyNzAsIDQ0MCwgICAwLCAxMjgsICAgMCwweGY0LDB4MTAsMHgxYywweDAwfSwgICAgLyogODAweDYwMCwgNDAweDMwMCAgKi8KLS8qeyAgIDIsICAgMSwgODU4LCA1MDMsMTI3MCwgNDgwLCAgIDAsIDEyOCwgICAwLDB4ZWUsMHgwYywweDIyLDB4MDh9LCovICAvKiA3MjB4NDgwICAob2xkLCBmcm9tIDY1MCkgKi8KLSB7ICAxNDMsICA3NiwgODM2LCA1MjMsMTI3MCwgNDQwLCAgIDAsIDEyOCwgICAwLDB4ZWUsMHgwYywweDIyLDB4MDh9LCAgICAvKiA3MjB4NDgwIC0gQkVUVEVSIChmcm9tIDMwMCBzZXJpZXMpICovCi0vKnsgIDY1LCAgNjQsMTA1NiwgNzkxLDEyNzAsIDQ4MCwgNjM4LCAgIDAsICAgMCwweEVFLDB4MEMsMHgyMiwweDA4fSAqLyAgLyogMTAyNHg3NjggKDUyNWkpICovCi0geyAgICAxLCAgIDEsMTEwMCwgODExLDE0MTIsIDQ0MCwgICAwLCAxMjgsICAgMCwweGVlLDB4MGMsMHgyMiwweDA4fSwgICAgLyogMTAyNHg3NjggKDUyNWkpIENPUlJFQ1RFRCAqLwotIHsgICA2NSwgIDY0LDEwNTYsIDc5MSwxMjcwLCA0ODAsIDQ1NSwgICAwLCAgIDAsMHgwMCwweDAwLDB4MDAsMHgwMH0gICAgIC8qIDEwMjR4NzY4ICg1MjVwKSAqLworIHsgIDE0MywgIDY1LCA4NTgsIDQ0MywxMjcwLCA0NDAsIDE3MSwgMCwgMTcxLCAgICAwLDB4ZjEsMHgwNCwweDFmLDB4MTh9LCAgICAvKiA2NDB4NDAwLCAzMjB4MjAwICovCisgeyAgIDg4LCAgMzUsIDg1OCwgMzkzLDEyNzAsIDQ0MCwgMTcxLCAwLCAxNzEsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCisgeyAgMTQzLCAgNzAsIDkyNCwgNDQzLDEyNzAsIDQ0MCwgIDkyLCAwLCAgOTIsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCisgeyAgMTQzLCAgNzAsIDkyNCwgMzkzLDEyNzAsIDQ0MCwgIDkyLCAwLCAgOTIsICAgIDAsMHhmNCwweDBiLDB4MWMsMHgwYX0sCisgeyAgMTQzLCAgNzYsIDgzNiwgNTIzLDEyNzAsIDQ0MCwgMjI0LCAwLCAgIDAsICAgIDAsMHhmMSwweDA1LDB4MWYsMHgxNn0sICAgIC8qIDY0MHg0ODAsIDMyMHgyNDAgKi8KKyB7ICAxNDMsIDEyMCwxMDU2LCA2NDMsMTI3MCwgNDQwLCAgIDAsIDEsICAgMCwgICAgMCwweGY0LDB4MTAsMHgxYywweDAwfSwgICAgLyogODAweDYwMCwgNDAweDMwMCAgKi8KKyB7ICAxNDMsICA3NiwgODM2LCA1MjMsMTI3MCwgNDQwLCAgIDAsIDEsICAgMCwgICAgMCwweGVlLDB4MGMsMHgyMiwweDA4fSwgICAgLyogNzIweDQ4MCAtIEJFVFRFUiAoZnJvbSAzMDAgc2VyaWVzKSAqLworIHsgICAgMSwgICAxLDExMDAsIDgxMSwxNDEyLCA0NDAsICAgMCwgMSwgICAwLCAgICAwLDB4ZWUsMHgwYywweDIyLDB4MDh9LCAgICAvKiAxMDI0eDc2OCAoNTI1aSkgQ09SUkVDVEVEICovCisjaWYgMCAgLyogZmxpbW1lcnQgdW5kIGlzdCB1bnRlbiBhYmdlc2Nobml0dGVuIChOVFNDSFQsIE5UU0MgY2xvY2spICovCisgeyAgIDY1LCAgNjQsMTA1NiwgNzkxLDEyNzAsIDQ4MCwgNDU1LCAwLCAgIDAsICAgIDAsMHgwMCwweDAwLDB4MDAsMHgwMH0gICAgIC8qIDEwMjR4NzY4ICg1MjVwKSAqLworI2VuZGlmCisjaWYgMAorIHsgICAgMSwgICAxLDExMDAsIDgxMSwxNDEyLCA0NDAsICAgMCwgMSwgICAwLCAgICAwLDB4MDAsMHgwMCwweDAwLDB4MDB9ICAgICAvKiAxMDI0eDc2OCAoNTI1cCkgKi8KKyNlbmRpZgorI2lmIDAKKyB7ICAgIDEsICAgMSwxMTIwLCA4MjEsMTUxNiwgNDIwLCAgIDAsIDEsICAgMCwgICAgMCwweDAwLDB4MDAsMHgwMCwweDAwfSAgICAgLyogMTAyNHg3NjggKDUyNXApICovCisjZW5kaWYKKyNpZiAwCisgeyAgICAxLCAgIDEsIDkzOCwgODIxLDE1MTYsIDQyMCwgICAwLCAxLCAgIDAsICAgIDAsMHgwMCwweDAwLDB4MDAsMHgwMH0gICAgIC8qIDEwMjR4NzY4ICg1MjVwKSAqLworI2VuZGlmCisjaWYgMCAvKiB6b29tIGhpbiwgdW50ZW4gYWJnZXNjaG5pdHRlbiAoTlRTQzJIVCwgTlRTQzEwMjQgY2xvY2spICovCisgeyAgICAxLCAgIDEsMTA3MiwgNzkxLDEyNzAsIDQ4MCwgNDU1LCAwLCAgIDAsICAgIDAsMHgwMCwweDAwLDB4MDAsMHgwMH0gICAgIC8qIDEwMjR4NzY4ICg1MjVwKSAqLworI2VuZGlmCisjaWYgMSAvKiB6dSB3ZWl0IGxpbmtzIChzcXVlZXplZCkgKE5UU0MySFQsIE5UU0MxMDI0IGNsb2NrKSAqLworIHsgICAgMSwgICAxLDExMDAsIDg0NiwxMjcwLCA0NDAsIDQ1NSwgMCwgICAwLCAgICAwLDB4MDAsMHgwMCwweDAwLDB4MDB9ICAgICAvKiAxMDI0eDc2OCAoNTI1cCkgKi8KKyNlbmRpZgorI2lmIDAgLyogenUgd2VpdCBsaW5rcywgcmVjaHRzIGFiZ2VzY2huaXR0ZW4gKE5UU0MySFQsIE5UU0MxMDI0IGNsb2NrKSAqLworIHsgICAgMSwgICAxLDExMDAsIDg0NiwxNDEyLCA0NDAsIDQ1NSwgMCwgICAwLCAgICAwLDB4MDAsMHgwMCwweDAwLDB4MDB9ICAgICAvKiAxMDI0eDc2OCAoNTI1cCkgKi8KKyNlbmRpZgogfTsKIAotc3RhdGljIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgIFNpU19TdEhpVFZEYXRhW10gPSAgLyogU2xhdmUgKyBUVlNpbXUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YSBTaVNfU3RIaVRWRGF0YVtdID0gIC8qIFNsYXZlICsgVFZTaW11ICovCiB7Ci0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MzIwLCAgICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MmJjLCAgICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MzIwLCAgICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MmJjLCAgICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4M2MwLCAgICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICA4LCAgIDUsIDB4NDFhLDB4MmFiLDB4NjcwLDB4M2MwLDB4MTUwLDEyOCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0KKyB7ICAgIDEsICAgMSwgMHgzN2MsMHgyMzMsMHgyYjIsMHgzMjAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorIHsgICAgMSwgICAxLCAweDM3YywweDIzMywweDJiMiwweDJiYywgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgeyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MzIwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHgzN2MsMHgyMzMsMHgyYjIsMHgyYmMsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorIHsgICAgMSwgICAxLCAweDM3YywweDIzMywweDJiMiwweDNjMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgeyAgICA4LCAgIDUsIDB4NDFhLDB4MmFiLDB4NjcwLDB4M2MwLDB4MTUwLCAxLCAwLCAwLCAwLCAwLCAwLCAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgIFNpU19TdDJIaVRWRGF0YVtdID0gLyogU2xhdmUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YSBTaVNfU3QySGlUVkRhdGFbXSA9IC8qIFNsYXZlICovCiB7Ci0geyAgICAzLCAgIDEsIDB4MzQ4LDB4MWUzLDB4NjcwLDB4M2MwLDB4MDMyLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MmJjLCAJICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAzLCAgIDEsIDB4MzQ4LDB4MWUzLDB4NjcwLDB4M2MwLDB4MDMyLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MmJjLCAgICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICA1LCAgIDIsIDB4MzQ4LDB4MjMzLDB4NjcwLDB4M2MwLDB4MDhkLDEyOCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICA4LCAgIDUsIDB4NDFhLDB4MmFiLDB4NjcwLDB4M2MwLDB4MTdjLDEyOCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0KKyB7ICAgIDMsICAgMSwgMHgzNDgsMHgxZTMsMHg2NzAsMHgzYzAsMHgwMzIsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorIHsgICAgMSwgICAxLCAweDM3YywweDIzMywweDJiMiwweDJiYywgCSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgeyAgICAzLCAgIDEsIDB4MzQ4LDB4MWUzLDB4NjcwLDB4M2MwLDB4MDMyLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHgzN2MsMHgyMzMsMHgyYjIsMHgyYmMsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorIHsgICAgNSwgICAyLCAweDM0OCwweDIzMywweDY3MCwweDNjMCwweDA4ZCwgMSwgMCwgMCwgMCwgMCwgMCwgMH0sCisgeyAgICA4LCAgIDUsIDB4NDFhLDB4MmFiLDB4NjcwLDB4M2MwLDB4MTdjLCAxLCAwLCAwLCAwLCAwLCAwLCAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgIFNpU19FeHRIaVRWRGF0YVtdID0KLXsKLSB7ICAgIDYsICAgMSwgMHgzNDgsMHgyMzMsMHg2NjAsMHgzYzAsICAgIDAsICAwLCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDMsICAgMSwgMHgzYzAsMHgyMzMsMHg2NjAsMHgzYzAsICAgIDAsICAwLCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDYsICAgMSwgMHgzNDgsMHgyMzMsMHg2NjAsMHgzYzAsICAgIDAsICAwLCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDMsICAgMSwgMHgzYzAsMHgyMzMsMHg2NjAsMHgzYzAsICAgIDAsICAwLCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDUsICAgMSwgMHgzNDgsMHgyMzMsMHg2NzAsMHgzYzAsMHgxNjYsMTI4LCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwgIC8qIDY0MHg0ODAgICAqLwotIHsgICAxNiwgICA1LCAweDQxYSwweDJhYiwweDY3MCwweDNjMCwweDE0MywxMjgsIDAsIDB4MDAsMHgwMCwweDAwLDB4MDB9LCAgLyogODAweDYwMCAgICovCi0geyAgIDI1LCAgMTIsIDB4NGVjLDB4MzUzLDB4NjcwLDB4M2MwLDB4MDMyLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sICAvKiAxMDI0eDc2OCAgKi8KLSB7ICAgIDUsICAgNCwgMHg2MjcsMHg0NjQsMHg2NzAsMHgzYzAsMHgxMjgsICAwLCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwgIC8qIDEyODB4MTAyNCAqLwotIHsgICAgNCwgICAxLCAweDQxYSwweDIzMywweDYwYywweDNjMCwweDE0MywxMjgsIDAsIDB4MDAsMHgwMCwweDAwLDB4MDB9LCAgLyogODAweDQ4MCAgICovCi0geyAgICA1LCAgIDIsIDB4NTc4LDB4MjkzLDB4NjcwLDB4M2MwLDB4MDMyLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sICAvKiAxMDI0eDU3NiAgKi8KLSB7ICAgIDgsICAgNSwgMHg2ZDYsMHgzMjMsMHg2NzAsMHgzYzAsMHgxMjgsICAwLCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwgIC8qIDEyODB4NzIwICAqLwotIHsgIDEzNywgIDMyLCAweDNkNCwweDIzMywweDY2MywweDNiZiwweDE0MywgIDAsIDAsIDB4MDAsMHgwMCwweDAwLDB4MDB9ICAgLyogOTYweDYwMCAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YSBTaVNfRXh0SGlUVkRhdGFbXSA9Cit7IC8qIGFsbCBvayAqLworIHsgICAgNiwgICAxLCAweDM0OCwweDIzMywweDY2MCwweDNjMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgeyAgICAzLCAgIDEsIDB4M2MwLDB4MjMzLDB4NjYwLDB4M2MwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDYsICAgMSwgMHgzNDgsMHgyMzMsMHg2NjAsMHgzYzAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorIHsgICAgMywgICAxLCAweDNjMCwweDIzMywweDY2MCwweDNjMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgeyAgICA1LCAgIDEsIDB4MzQ4LDB4MjMzLDB4NjcwLDB4M2MwLDB4MTY2LCAxLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDY0MHg0ODAgICAqLworIHsgICAxNiwgICA1LCAweDQxYSwweDJhYiwweDY3MCwweDNjMCwweDE0MywgMSwgMCwgMCwgMCwgMCwgMCwgMH0sICAvKiA4MDB4NjAwICAgKi8KKyB7ICAgMjUsICAxMiwgMHg0ZWMsMHgzNTMsMHg2NzAsMHgzYzAsMHgwMzIsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LCAgLyogMTAyNHg3NjggICovCisgeyAgICA1LCAgIDQsIDB4NjI3LDB4NDY0LDB4NjcwLDB4M2MwLDB4MTI4LCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDEyODB4MTAyNCAqLworIHsgICAgNCwgICAxLCAweDQxYSwweDIzMywweDYwYywweDNjMCwweDE0MywgMSwgMCwgMCwgMCwgMCwgMCwgMH0sICAvKiA4MDB4NDgwICAgKi8KKyB7ICAgIDUsICAgMiwgMHg1NzgsMHgyOTMsMHg2NzAsMHgzYzAsMHgwMzIsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LCAgLyogMTAyNHg1NzYgICovCisgeyAgICA4LCAgIDUsIDB4NmQ2LDB4MzIzLDB4NjcwLDB4M2MwLDB4MTI4LCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDEyODB4NzIwICAqLworIHsgICAgOCwgICAzLCAweDRlYywweDM1MywweDY3MCwweDNjMCwweDAzMiwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sICAvKiA5NjB4NjAwICAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgIFNpU19TdDUyNXBEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfVFZEYXRhIFNpU19TdDUyNXBEYXRhW10gPQogewotIHsgICAgMSwgICAxLCAweDZiNCwweDIwZCwweDRmNiwweDE5MCwgICA1MCwgIDAsIDB4MmY4LCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxNWUsICAgNTAsICAwLCAweDI4MCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4NmI0LDB4MjBkLDB4NGY2LDB4MTkwLCAgIDUwLCAgMCwgMHgyZjgsIDB4MDAsMHgwMCwweDAwLDB4MDB9LAotIHsgICAgMSwgICAxLCAweDZiNCwweDIwZCwweDRmNiwweDE1ZSwgICA1MCwgIDAsIDB4MjgwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxZTAsICAgIDAsICAwLCAweDJmOCwgMHgwMCwweDAwLDB4MDAsMHgwMH0KKyB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxOTAsICAgNTAsIDAsIDB4MmY4LCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxNWUsICAgNTAsIDAsIDB4MjgwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxOTAsICAgNTAsIDAsIDB4MmY4LCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxNWUsICAgNTAsIDAsIDB4MjgwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxZTAsICAgIDAsIDAsIDB4MmY4LCAwLCAwLCAwLCAwLCAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgIFNpU19TdDc1MHBEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfVFZEYXRhIFNpU19TdDc1MHBEYXRhW10gPQogewotIHsgICAgMSwgICAxLCAweDY3MiwweDJlZSwweDUwMCwweDE5MCwgICA1MCwgIDAsIDB4MmY4LCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxNWUsICAgNTAsICAwLCAweDI4MCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4NjcyLDB4MmVlLDB4NTAwLDB4MTkwLCAgICAwLCAgMCwgMHgyZDAsIDB4MDAsMHgwMCwweDAwLDB4MDB9LAotIHsgICAgMSwgICAxLCAweDY3MiwweDJlZSwweDUwMCwweDE1ZSwgICAgMCwgIDAsIDB4MmQwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxZTAsICAgIDAsICAwLCAweDJmOCwgMHgwMCwweDAwLDB4MDAsMHgwMH0KKyB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxOTAsICAgNTAsIDAsIDB4MmY4LCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxNWUsICAgNTAsIDAsIDB4MjgwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxOTAsICAgIDAsIDAsIDB4MmQwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxNWUsICAgIDAsIDAsIDB4MmQwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxZTAsICAgIDAsIDAsIDB4MmY4LCAwLCAwLCAwLCAwLCAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgIFNpU19FeHQ3NTBwRGF0YVtdID0KLXsKLSB7ICAxNDMsICA2NSwgMHgzNWEsMHgxYmIsMHg0ZjYsMHgxYjgsMHgwYWIsICAwLCAweDBhYiwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgIDg4LCAgMzUsIDB4MzVhLDB4MTg5LDB4NGY2LDB4MWI4LDB4MGFiLCAgMCwgMHgwYWIsIDB4MDAsMHgwMCwweDAwLDB4MDB9LAotIHsgICAxOCwgICA1LCAweDMzOSwweDFhZSwweDUwMCwweDJkMCwweDA1YywgIDAsIDB4MDVjLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAxNDMsICA3MCwgMHgzOWMsMHgxODksMHg0ZjYsMHgxYjgsMHgwNWMsICAwLCAweDA1YywgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgIDk5LCAgMzIsIDB4MzIwLDB4MWZlLDB4NTAwLDB4MmQwLCAgIDUwLCAgMCwgICAgIDAsIDB4MDAsMHgwMCwweDAwLDB4MDB9LCAgLyogNjQweDQ4MCAgKi8KLSB7ICAgIDUsICAgNCwgMHg1ZDgsMHgyOWUsMHg1MDAsMHgyYTgsICAgNTAsICAwLCAgICAgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sICAvKiA4MDB4NjAwICAqLwotIHsgICA5OSwgIDMyLCAweDMyMCwweDFmZSwweDUwMCwweDJkMCwgICA1MCwgIDAsICAgICAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwgIC8qIDcyMHg0ODAgdGVzdCBXT1JLUyAqLwotIHsgICA2OCwgIDY0LCAweDU1ZiwweDM0NiwweDUwMCwweDJhOCwweDI3ZSwgIDAsICAgICAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwgIC8qIDEwMjR4NzY4ICovCi0geyAgICA1LCAgIDIsIDB4M2E3LDB4MjI2LDB4NTAwLDB4MmE4LCAgICAwLDEyOCwgICAgIDAsIDB4MDAsMHgwMCwweDAwLDB4MDB9LCAgLyogNzIweDU3NiAgKi8KLSB7ICAgMjUsICAyNCwgMHg1ZDgsMHgyZjMsMHg0NjAsMHgyYTgsICAgNTAsICAwLCAgICAgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0gICAvKiAxMjgweDcyMCBXT1JLUyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfVFZEYXRhIFNpU19FeHQ3NTBwRGF0YVtdID0KK3sgLyogYWxsIG9rICovCisgeyAgICAzLCAgMSwgIDkzNSwgNDcwLCAxMTMwLCA2ODAsICA1MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sICAvKiAzMjB4MjAwLzY0MHg0MDAgKi8KKyB7ICAgMjQsICA3LCAgOTM1LCA0MjAsIDExMzAsIDY4MCwgIDUwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDMsICAxLCAgOTM1LCA0NzAsIDExMzAsIDY4MCwgIDUwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgMjQsICA3LCAgOTM1LCA0MjAsIDExMzAsIDY4MCwgIDUwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDIsICAxLCAxMTAwLCA1OTAsIDExMzAsIDY0MCwgIDUwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDY0MHg0ODAgKi8KKyB7ICAgIDMsICAyLCAxMjEwLCA2OTAsIDExMzAsIDY2MCwgIDUwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDgwMHg2MDAgT0sgKi8KKyB7ICAgIDIsICAxLCAxMTAwLCA1NjIsIDExMzAsIDY0MCwgICAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDcyMHg0ODAgT0sgKi8KKyB7ICAgIDEsICAxLCAxMzc1LCA4NzgsIDExMzAsIDY0MCwgNjM4LCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDEwMjR4NzY4IE9LICovCisgeyAgICA1LCAgMywgMTEwMCwgNjc1LCAxMTMwLCA2NDAsICAgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMH0sICAvKiA3MjAvNzY4eDU3NiBPSyAqLworIHsgICAyNSwgMjQsIDE0OTYsIDc1NSwgMTEyMCwgNjgwLCAgNTAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9ICAgLyogMTI4MHg3MjAgT0sgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTX0xDRDEyODB4NzIwRGF0YVtdID0gIC8qIDIuMDMuMDAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0xDRDEyODB4NzIwRGF0YVtdID0gIC8qIDIuMDMuMDAgKi8KIHsKIAl7ICA0NCwgICAxNSwgIDg2NCwgIDQzMCwgMTQwOCwgIDgwNiB9LCAvKiA2NDB4NDAwICovCiAJeyAxMjgsICAgMzUsICA3OTIsICAzODUsIDE0MDgsICA4MDYgfSwKQEAgLTk2Miw3ICsxMDAzLDcgQEAKICAqIChOb3RlOiAxMjgweDc2OF8zIGlzIG5vdyBzcGVjaWFsIGZvciBTaVMzMDEvTmV0VmlzdGEKICAqLwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpU19TdExDRDEyODB4NzY4XzJEYXRhW10gPSAvKiAyLjAzLjAwICovCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhIFNpU19TdExDRDEyODB4NzY4XzJEYXRhW10gPSAvKiAyLjAzLjAwICovCiB7CiAJeyAgNjQsICAgMjEsICA4NTgsICA0MzQsIDE0MDgsICA4MDYgfSwgLyogNjQweDQwMCAqLwogCXsgIDMyLCAgICA5LCAgODU4LCAgMzcyLCAxNDA4LCAgODA2IH0sCkBAIC05NzcsNyArMTAxOCw3IEBACiAJeyAgMTYsICAgMTUsIDE2MDAsICA3NTAsIDE2MDAsICA4MDYgfSAgLyogMTI4MHg3MjAgLSBmcm9tIEV4dCAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVNfRXh0TENEMTI4MHg3NjhfMkRhdGFbXSA9IC8qIDIuMDMuMDAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0V4dExDRDEyODB4NzY4XzJEYXRhW10gPSAvKiAyLjAzLjAwICovCiB7CiAJeyAgMTYsICAgIDUsICA5NjAsICA0MTAsIDE2MDAsICA4MDYgfSwgLyogNjQweDQwMCAqLwogCXsgIDY0LCAgIDIxLCAxMTUyLCAgMzY0LCAxNjAwLCAgODA2IH0sCkBAIC05OTMsNyArMTAzNCw3IEBACiB9OwogCiAjaWYgMCAgLyogTm90IHVzZWQ7IF8zIG5vdyByZXNlcnZlZCBmb3IgTmV0VmlzdGEgKFNpUzMwMSkgKi8KLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTX0xDRDEyODB4NzY4XzNEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVNfTENEMTI4MHg3NjhfM0RhdGFbXSA9CiB7CiAJeyAgNjQsICAgMjUsIDEwNTYsICA0MjIsIDE2NjQsICA3OTggfSwJCQkvKiA2NDB4NDAwICovCiAJeyAxMjgsICAgMzksICA4ODQsICAzOTYsIDE0MDgsICA4MDYgfSwgLyogLDY0MCAqLwpAQCAtMTAwOSw3ICsxMDUwLDcgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVNfTENEMTI4MHg4MDBEYXRhW10gPSAvKiAwLjkzLjEyYSAoVE1EUykgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0xDRDEyODB4ODAwRGF0YVtdID0gLyogMC45My4xMmEgKFRNRFMpICovCiB7CiAJeyAxMjgsICAgNTEsIDExMjIsICA0MTIsIDE0MDgsICA4MTYgfSwgIC8qIDY0MHg0MDAgKi8KIAl7IDEyOCwgICA0OSwgMTIzMiwgIDM2MSwgMTQwOCwgIDgxNiB9LApAQCAtMTAyNCw3ICsxMDY1LDcgQEAKIAl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9ICAgLyogMTI4MHg3MjAgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTX0xDRDEyODB4ODAwXzJEYXRhW10gPSAvKiAyLjAzLjAwIChMVkRTKSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVNfTENEMTI4MHg4MDBfMkRhdGFbXSA9IC8qIDIuMDMuMDAgKExWRFMpICovCiB7CiAJeyAgOTcsICAgNDIsIDEzNDQsICA0MDksIDE1NTIsICA4MTIgfSwgLyogNjQweDQwMCAqLwogCXsgIDk3LCAgIDM1LCAxMjgwLCAgMzU4LCAxNTUyLCAgODEyIH0sCkBAIC0xMDM5LDcgKzEwODAsNDIgQEAKIAl7ICA5NywgICA5MCwgMTYwMCwgIDczMCwgMTU1MiwgIDgxMiB9ICAvKiAxMjgweDcyMCAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVNfTENEMTI4MHg5NjBEYXRhW10gPQorI2lmIDAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0xDRDEyODB4ODAwXzNEYXRhW10gPSAvKiAyLjAyLjA1YSAoTFZEUyk7IG0yNTAgKi8KK3sKKwl7IDEyOCwgICA1MSwgMTEyMiwgIDQxMiwgMTQwOCwgIDgxNiB9LCAvKiA2NDB4NDAwICovCisJeyAxMjgsICAgNDksIDEyMzIsICAzNjEsIDE0MDgsICA4MTYgfSwKKwl7IDEyOCwgICA1MSwgMTEyMiwgIDQxMiwgMTQwOCwgIDgxNiB9LAorCXsgMTI4LCAgIDQ5LCAxMjMyLCAgMzYxLCAxNDA4LCAgODE2IH0sCisJeyAgIDgsICAgIDMsICA4ODAsICA0OTEsIDE0MDgsICA4MTYgfSwgLyogNjQweDQ4MCAqLworCXsgIDExLCAgICA2LCAxMDI0LCAgNjEyLCAxNDA4LCAgODE2IH0sIC8qIDgwMHg2MDAgKi8KKwl7ICAyMiwgICAyMSwgMTQwMCwgIDc4NCwgMTQwOCwgIDgxNiB9LCAvKiAxMDI0eDc2OCAqLworCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0sIC8qIDEyODB4MTAyNCAqLworCXsgICAxLCAgICAxLCAxNDA4LCAgODE2LCAxNDA4LCAgODE2IH0sIC8qIDEyODB4ODAwICovCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSwgLyogMTI4MHg3NjggLSBwYXRjaCBpbmRleCAqLworCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0gIC8qIDEyODB4NzIwICovCit9OworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0xDRDEyODB4ODU0RGF0YVtdID0gLyogMi4yMS4wMENTIChMVkRTKSAqLworeworCXsgIDU2LCAgIDE1LCAgOTM2LCAgNDEwLCAxNjY0LCAgODYxIH0sICAvKiA2NDB4NDAwICovCisJeyAgNjQsICAgMjUsIDE1ODYsICAzNTUsIDE2NjQsICA4NjEgfSwKKwl7ICA1NiwgICAxNSwgIDkzNiwgIDQxMCwgMTY2NCwgIDg2MSB9LAorCXsgIDY0LCAgIDI1LCAxNTg2LCAgMzU1LCAxNjY0LCAgODYxIH0sCisJeyAgOTEsICAgNDUsIDE0NjQsICA0ODUsIDE2NjQsICA4NjEgfSwgIC8qIDY0MHg0ODAgKi8KKwl7IDE4MiwgICA3NSwgIDk3NiwgIDYwNSwgMTY2NCwgIDg2MSB9LCAgLyogODAweDYwMCAqLworCXsgIDkxLCAgIDY2LCAxMzQyLCAgNzc0LCAxNjY0LCAgODYxIH0sICAvKiAxMDI0eDc2OCAqLworCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0sICAvKiAxMjgweDEwMjQgKi8KKwl7ICAyNiwgICAyNSwgMTcwOCwgIDgwNywgMTY2NCwgIDg2MSB9LCAgLyogMTI4MHg4MDAgKi8KKwl7ICAxMywgICAxMiwgMTcwOCwgIDc3NCwgMTY2NCwgIDg2MSB9LCAgLyogMTI4MHg3NjggLSBwYXRjaCBpbmRleCAqLworCXsgIDUyLCAgIDQ1LCAxNzA4LCAgNzI1LCAxNjY0LCAgODYxIH0sICAvKiAxMjgweDcyMCAqLworCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0sCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSwKKwl7ICAgMSwgICAgMSwgMTY2NCwgIDg2MSwgMTY2NCwgIDg2MSB9ICAgLyogMTI4MHg4NTQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0xDRDEyODB4OTYwRGF0YVtdID0KIHsKIAl7ICAgIDksICAgMiwgIDgwMCwgIDUwMCwgMTgwMCwgMTAwMCB9LAogCXsgICAgOSwgICAyLCAgODAwLCAgNTAwLCAxODAwLCAxMDAwIH0sCkBAIC0xMDQ5LDEwICsxMTI1LDE1IEBACiAJeyAgIDMwLCAgMTEsIDEwNTYsICA2MjUsIDE4MDAsIDEwMDAgfSwKIAl7ICAgIDUsICAgMywgMTM1MCwgIDgwMCwgMTgwMCwgMTAwMCB9LAogCXsgICAgMSwgICAxLCAxNTc2LCAxMDUwLCAxNTc2LCAxMDUwIH0sCi0JeyAgICAxLCAgIDEsIDE4MDAsIDEwMDAsIDE4MDAsIDEwMDAgfQorCXsgICAgMSwgICAxLCAxODAwLCAxMDAwLCAxODAwLCAxMDAwIH0sCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSwKKwl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9LAorCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0sCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSwKKwl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpU19TdExDRDE0MDB4MTA1MERhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhIFNpU19TdExDRDE0MDB4MTA1MERhdGFbXSA9CiB7CiAJeyAyMTEsICAxMDAsIDIxMDAsICA0MDgsIDE2ODgsIDEwNjYgfSwKIAl7IDIxMSwgICA2NCwgMTUzNiwgIDM1OCwgMTY4OCwgMTA2NiB9LApAQCAtMTA2MiwxMCArMTE0MywxNSBAQAogCXsgMjExLCAgIDcyLCAxMDA4LCAgNjA5LCAxNjg4LCAxMDY2IH0sCiAJeyAyMTEsICAxMjgsIDE0MDAsICA3NzYsIDE2ODgsIDEwNjYgfSwKIAl7IDIxMSwgIDIwNSwgMTY4MCwgMTA0MSwgMTY4OCwgMTA2NiB9LAotCXsgICAxLCAgICAxLCAxNjg4LCAxMDY2LCAxNjg4LCAxMDY2IH0KKwl7ICAgMSwgICAgMSwgMTY4OCwgMTA2NiwgMTY4OCwgMTA2NiB9LAorCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0sCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSwKKwl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9LAorCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0sCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVNfRXh0TENEMTQwMHgxMDUwRGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0V4dExDRDE0MDB4MTA1MERhdGFbXSA9CiB7CiAvKgl7IDIxMSwgICA2MCwgMTI2MCwgIDQxMCwgMTY4OCwgMTA2NiB9LCAgICA2NDB4NDAwICg2MzMwKSAqLwogCXsgMjExLCAgMTAwLCAyMTAwLCAgNDA4LCAxNjg4LCAxMDY2IH0sIC8qIDY0MHg0MDAgKDYzMjUpIFdPUktTICovCkBAIC0xMDgwLDEwICsxMTY2LDEzIEBACiAJeyAyMTEsICAyMDUsIDE2ODAsIDEwNDEsIDE2ODgsIDEwNjYgfSwgLyogMTI4MHgxMDI0IC0gbm90IHVzZWQgKGFsd2F5cyB1bnNjYWxlZCkgKi8KIAl7ICAgMSwgICAgMSwgMTY4OCwgMTA2NiwgMTY4OCwgMTA2NiB9LCAvKiAxNDAweDEwNTAgKi8KIAl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9LCAvKiBrbHVkZ2UgKi8KLQl7IDIxMSwgIDEyMCwgMTQwMCwgIDczMCwgMTY4OCwgMTA2NiB9ICAvKiAxMjgweDcyMCAqLworCXsgMjExLCAgMTIwLCAxNDAwLCAgNzMwLCAxNjg4LCAxMDY2IH0sIC8qIDEyODB4NzIwICovCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSwKKwl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9LAorCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTX0xDRDE2ODB4MTA1MERhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhIFNpU19MQ0QxNjgweDEwNTBEYXRhW10gPQogewogCXsgIDk1LCAgIDI0LCAxMjYwLCAgNDEwLCAxOTAwLCAxMDY2IH0sIC8qICAwIDY0MHg0MDAgKi8KIAl7ICAxMCwgICAgMywgMTcxMCwgIDM2MiwgMTkwMCwgMTA2NiB9LApAQCAtMTA5NywxMCArMTE4NiwxMSBAQAogCXsgIDk1LCAgIDY5LCAxODAwLCAgODE3LCAxOTAwLCAxMDY2IH0sIC8qICA5IDEyODB4ODAwIHBhdGNoIGluZGV4ICovCiAJeyAgMTMsICAgIDksIDE5MDAsICA3MzksIDE5MDAsIDEwNjYgfSwgLyogMTAgMTI4MHg3MjAgKi8KIAl7ICA5NSwgICA5NCwgMTg4MCwgMTA2NiwgMTkwMCwgMTA2NiB9LCAvKiAxMSAxNDAweDEwNTAgcGF0Y2ggaW5kZXggKi8KLQl7ICAgMSwgICAgMSwgMTkwMCwgMTA2NiwgMTkwMCwgMTA2NiB9ICAvKiAxMiAxNjgweDEwNTAgKi8KKwl7ICAgMSwgICAgMSwgMTkwMCwgMTA2NiwgMTkwMCwgMTA2NiB9LCAvKiAxMiAxNjgweDEwNTAgKi8KKwl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpU19TdExDRDE2MDB4MTIwMERhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhIFNpU19TdExDRDE2MDB4MTIwMERhdGFbXSA9CiB7CiAJezI3LCAgNCwgODAwLCA1MDAsIDIxNjAsIDEyNTAgfSwKIAl7MjcsICA0LCA4MDAsIDUwMCwgMjE2MCwgMTI1MCB9LApAQCAtMTExMSwxMCArMTIwMSwxNCBAQAogCXsgNSwgIDIsMTM1MCwgODAwLCAyMTYwLCAxMjUwIH0sCiAJezEzNSw4OCwxNjAwLDExMDAsIDIxNjAsIDEyNTAgfSwKIAl7NzIsIDQ5LDE2ODAsMTA5MiwgMjE2MCwgMTI1MCB9LAotCXsgMSwgIDEsMjE2MCwxMjUwLCAyMTYwLCAxMjUwIH0KKwl7IDEsICAxLDIxNjAsMTI1MCwgMjE2MCwgMTI1MCB9LAorCXsgMCwgIDAsICAgMCwgICAwLCAgICAwLCAgICAwIH0sCisJeyAwLCAgMCwgICAwLCAgIDAsICAgIDAsICAgIDAgfSwKKwl7IDAsICAwLCAgIDAsICAgMCwgICAgMCwgICAgMCB9LAorCXsgMCwgIDAsICAgMCwgICAwLCAgICAwLCAgICAwIH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTX0V4dExDRDE2MDB4MTIwMERhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhIFNpU19FeHRMQ0QxNjAweDEyMDBEYXRhW10gPQogewogCXs3MiwxMSwgOTkwLCA0MjIsIDIxNjAsIDEyNTAgfSwgLyogNjQweDQwMCAoNjMzMCkgV09SS1MgKi8KIC8qCXsyNywgNCwgODAwLCA1MDAsIDIxNjAsIDEyNTAgfSwgICAgNjQweDQwMCAoNjIzNSkgKi8KQEAgLTExMjcsMTAgKzEyMjEsMTQgQEAKIAl7IDUsIDIsMTM1MCwgODAwLCAyMTYwLCAxMjUwIH0sCiAJezI3LDE2LDE1MDAsMTA2NCwgMjE2MCwgMTI1MCB9LCAvKiAxMjgweDEwMjQgKi8KIAl7NzIsNDksMTY4MCwxMDkyLCAyMTYwLCAxMjUwIH0sIC8qIDE0MDB4MTA1MCAoNjMzMCwgd2FzIG5vdCBzdXBwb3J0ZWQgb24gNjMyNSkgKi8KLQl7IDEsIDEsMjE2MCwxMjUwLCAyMTYwLCAxMjUwIH0KKwl7IDEsIDEsMjE2MCwxMjUwLCAyMTYwLCAxMjUwIH0sCisJeyAwLCAwLCAgIDAsICAgMCwgICAgMCwgICAgMCB9LAorCXsgMCwgMCwgICAwLCAgIDAsICAgIDAsICAgIDAgfSwKKwl7IDAsIDAsICAgMCwgICAwLCAgICAwLCAgICAwIH0sCisJeyAwLCAwLCAgIDAsICAgMCwgICAgMCwgICAgMCB9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpU19Ob1NjYWxlRGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX05vU2NhbGVEYXRhW10gPQogewogCXsgMSwgMSwgODAwLCA0NDksIDgwMCwgNDQ5IH0sICAvKiAweDAwOiAzMjB4MjAwLCA2NDB4NDAwICovCiAJeyAxLCAxLCA4MDAsIDQ0OSwgODAwLCA0NDkgfSwKQEAgLTExNjIsMTQgKzEyNjAsMTggQEAKIAl7IDEsIDEsMTgwOCwgODA4LDE4MDgsIDgwOCB9LCAgLyogMHgxYjogMTM2MHg3NjggKi8KIAl7IDEsIDEsMTEwNCwgNTYzLDExMDQsIDU2MyB9LCAgLyogMHgxYzogOTYweDU0MCAqLwogCXsgMSwgMSwxMTIwLCA2MTgsMTEyMCwgNjE4IH0sICAvKiAweDFkOiA5NjB4NjAwICovCi0JeyAxLCAxLDE0MDgsIDgxNiwxNDA4LCA4MTYgfSAgIC8qIDB4MWY6IDEyODB4ODAwIChUTURTIHNwZWNpYWwpICovCisJeyAxLCAxLDE0MDgsIDgxNiwxNDA4LCA4MTYgfSwgIC8qIDB4MWY6IDEyODB4ODAwIChUTURTIHNwZWNpYWwpICovCisJeyAxLCAxLDE3NjAsMTIzNSwxNzYwLDEyMzUgfSwgIC8qIDB4MjA6IDE2MDB4MTIwMCBmb3IgTENEQSAqLworCXsgMSwgMSwyMDQ4LDEzMjAsMjA0OCwxMzIwIH0sICAvKiAweDIxOiAxNjAweDEyMDAgZm9yIG5vbi1TaVMgTFZEUyAqLworCXsgMSwgMSwxNjY0LCA4NjEsMTY2NCwgODYxIH0gICAvKiAweDIyOiAxMjgweDg1NCAqLwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTFZEUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzMyMHg0ODBEYXRhXzFbXT0KKy8qIEZTVE4vRFNUTiAzMjB4MjQwLCAyIHZhcmlhbnRzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSBTaVNfTFZEUzMyMHgyNDBEYXRhXzFbXT0KIHsKIAl7IDg0OCwgNDMzLCA0MDAsIDUyNX0sCiAJeyA4NDgsIDM4OSwgNDAwLCA1MjV9LApAQCAtMTE3NywxNTcgKzEyNzksNDAgQEAKIAl7IDg0OCwgMzg5LCA0MDAsIDUyNX0sCiAJeyA4NDgsIDUxOCwgNDAwLCA1MjV9LAogCXsxMDU2LCA2MjgsIDQwMCwgNTI1fSwKLQl7IDQwMCwgNTI1LCA0MDAsIDUyNX0sCi0JeyA4MDAsIDQ0OSwxMDAwLCA2NDR9LAotCXsgODAwLCA1MjUsMTAwMCwgNjM1fQorCXsgNDAwLCA1MjUsIDQwMCwgNTI1fSAgLyogeFNUTiAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFM2NDB4NDgwRGF0YV8xW109CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSBTaVNfTFZEUzMyMHgyNDBEYXRhXzJbXT0KK3sKKwl7IDgwMCwgNDQ1LCA4MDAsIDUyNX0sCisJeyA4MDAsIDM5NSwgODAwLCA1MjV9LAorCXsgODAwLCA0NDUsIDgwMCwgNTI1fSwKKwl7IDgwMCwgMzk1LCA4MDAsIDUyNX0sCisJeyA4MDAsIDUyNSwgODAwLCA1MjV9LAorCXsxMDU2LCA2MjgsMTA1NiwgNjI4fSwKKwl7IDQ4MCwgNTI1LCA0ODAsIDUyNX0gLyogeFNUTiAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTX0xWRFM2NDB4NDgwRGF0YV8xW109CiB7CiAJeyA4MDAsIDQ0NSwgODAwLCA1MjV9LCAgIC8qIDgwMCwgNDQ5LCA4MDAsIDQ0OSAqLwogCXsgODAwLCAzOTUsIDgwMCwgNTI1fSwKIAl7IDgwMCwgNDQ1LCA4MDAsIDUyNX0sCiAJeyA4MDAsIDM5NSwgODAwLCA1MjV9LAotCXsgODAwLCA1MjUsIDgwMCwgNTI1fSwKLQl7IDgwMCwgNTI1LCA4MDAsIDUyNX0sICAgLyogcHNldWRvICovCi0JeyA4MDAsIDUyNSwgODAwLCA1MjV9ICAgIC8qIHBzZXVkbyAqLworCXsgODAwLCA1MjUsIDgwMCwgNTI1fQogfTsKIAotLyogRlNUTiAzMjB4MjQwICovCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzY0MHg0ODBEYXRhXzJbXT0KLXsKLQl7IDgwMCwgNDQ1LCA4MDAsIDUyNX0sCi0JeyA4MDAsIDM5NSwgODAwLCA1MjV9LAotCXsgODAwLCA0NDUsIDgwMCwgNTI1fSwKLQl7IDgwMCwgMzk1LCA4MDAsIDUyNX0sCi0JeyA4MDAsIDUyNSwgODAwLCA1MjV9LAotICAgICAgICB7IDgwMCwgNTI1LCA4MDAsIDUyNX0sICAgLyogcHNldWRvICovCi0JeyA4MDAsIDUyNSwgODAwLCA1MjV9ICAgIC8qIHBzZXVkbyAqLwotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFM4MDB4NjAwRGF0YV8xW109CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSBTaVNfTFZEUzgwMHg2MDBEYXRhXzFbXT0KIHsKIAl7IDg0OCwgNDMzLDEwNjAsIDYyOX0sCiAJeyA4NDgsIDM4OSwxMDYwLCA2Mjl9LAogCXsgODQ4LCA0MzMsMTA2MCwgNjI5fSwKIAl7IDg0OCwgMzg5LDEwNjAsIDYyOX0sCiAJeyA4NDgsIDUxOCwxMDYwLCA2Mjl9LAotCXsxMDU2LCA2MjgsMTA1NiwgNjI4fSwKIAl7MTA1NiwgNjI4LDEwNTYsIDYyOH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTODAweDYwMERhdGFfMltdPQotewotCXsxMDU2LCA2MjgsMTA1NiwgNjI4fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFMxMDI0eDc2OERhdGFfMVtdPQotewotCXsgODQwLCA0MzgsMTM0NCwgODA2fSwKLQl7IDg0MCwgNDA5LDEzNDQsIDgwNn0sCi0JeyA4NDAsIDQzOCwxMzQ0LCA4MDZ9LAotCXsgODQwLCA0MDksMTM0NCwgODA2fSwKLQl7IDg0MCwgNTE4LDEzNDQsIDgwNn0sICAgLyogNjQweDQ4MCAqLwotCXsxMDUwLCA2MzgsMTM0NCwgODA2fSwgICAvKiA4MDB4NjAwICovCi0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LCAgIC8qIDEwMjR4NzY4ICovCi19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzEwMjR4NzY4RGF0YV8yW109Ci17Ci0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzEyODB4MTAyNERhdGFfMVtdPQotewotCXsxMDQ4LCA0NDIsMTY4OCwxMDY2fSwKLQl7MTA0OCwgMzkyLDE2ODgsMTA2Nn0sCi0JezEwNDgsIDQ0MiwxNjg4LDEwNjZ9LAotCXsxMDQ4LCAzOTIsMTY4OCwxMDY2fSwKLQl7MTA0OCwgNTIyLDE2ODgsMTA2Nn0sCi0JezEyMDgsIDY0MiwxNjg4LDEwNjZ9LAotCXsxNDMyLCA4MTAsMTY4OCwxMDY2fSwKLQl7MTY4OCwxMDY2LDE2ODgsMTA2Nn0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTMTI4MHgxMDI0RGF0YV8yW109Ci17Ci0JezE2ODgsMTA2NiwxNjg4LDEwNjZ9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzE0MDB4MTA1MERhdGFfMVtdPQotewotICAgICAgICB7IDkyOCwgNDE2LCAxNjg4LDEwNjZ9LAotCXsgOTI4LCAzNjYsIDE2ODgsMTA2Nn0sCi0JeyA5MjgsIDQxNiwgMTY4OCwxMDY2fSwKLQl7IDkyOCwgMzY2LCAxNjg4LDEwNjZ9LAotCXsgOTI4LCA0OTYsIDE2ODgsMTA2Nn0sCi0JezEwODgsIDYxNiwgMTY4OCwxMDY2fSwKLQl7MTMxMiwgNzg0LCAxNjg4LDEwNjZ9LAotCXsxNTY4LDEwNDAsIDE2ODgsMTA2Nn0sCi0JezE2ODgsMTA2NiwgMTY4OCwxMDY2fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFMxNDAweDEwNTBEYXRhXzJbXT0KLXsKLSAgICAgICAgezE2ODgsMTA2NiwgMTY4OCwxMDY2fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFMxNjAweDEyMDBEYXRhXzFbXT0KLXsKLSAgIAl7MTA4OCwgNTIwLCAyMDQ4LDEzMjB9LAotCXsxMDg4LCA0NzAsIDIwNDgsMTMyMH0sCi0JezEwODgsIDUyMCwgMjA0OCwxMzIwfSwKLQl7MTA4OCwgNDcwLCAyMDQ4LDEzMjB9LAotCXsxMDg4LCA2MDAsIDIwNDgsMTMyMH0sCi0JezEyNDgsIDcyMCwgMjA0OCwxMzIwfSwKLQl7MTQ3MiwgODg4LCAyMDQ4LDEzMjB9LAotCXsxNzI4LDExNDQsIDIwNDgsMTMyMH0sCi0JezE4NDgsMTE3MCwgMjA0OCwxMzIwfSwKLQl7MjA0OCwxMzIwLCAyMDQ4LDEzMjB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzE2MDB4MTIwMERhdGFfMltdPQotewotICAgICAgICB7MjA0OCwxMzIwLCAyMDQ4LDEzMjB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzEyODB4OTYwRGF0YV8xW109Ci17Ci0JeyA4NDAsIDQzOCwxMzQ0LCA4MDZ9LAotCXsgODQwLCA0MDksMTM0NCwgODA2fSwKLQl7IDg0MCwgNDM4LDEzNDQsIDgwNn0sCi0JeyA4NDAsIDQwOSwxMzQ0LCA4MDZ9LAotCXsgODQwLCA1MTgsMTM0NCwgODA2fSwKLQl7MTA1MCwgNjM4LDEzNDQsIDgwNn0sCi0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAotCXsgODAwLCA0NDksMTI4MCwgODAxfSwKLQl7IDgwMCwgNTI1LDEyODAsIDgxM30KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTMTI4MHg5NjBEYXRhXzJbXT0KLXsKLQl7MTM0NCwgODA2LDEzNDQsIDgwNn0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTMTI4MHg3NjhEYXRhXzFbXT0KLXsKLQl7IDc2OCwgNDM4LCAxNDA4LCA4MDZ9LAotCXsgNzY4LCAzODgsIDE0MDgsIDgwNn0sCi0JeyA3NjgsIDQzOCwgMTQwOCwgODA2fSwKLQl7IDc2OCwgMzg4LCAxNDA4LCA4MDZ9LAotCXsgNzY4LCA1MTgsIDE0MDgsIDgwNn0sCi0JeyA5MjgsIDYzOCwgMTQwOCwgODA2fSwKLQl7MTE1MiwgODA2LCAxNDA4LCA4MDZ9LAotCXsxNDA4LCA4MDYsIDE0MDgsIDgwNn0sCi0JezE0MDgsIDgwNiwgMTQwOCwgODA2fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFMxMjgweDc2OERhdGFfMltdPQotewotCXsxNDA4LCA4MDYsIDE0MDgsIDgwNn0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTMTAyNHg2MDBEYXRhXzFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSBTaVNfTFZEUzEwMjR4NjAwRGF0YV8xW10gPQogewogCXsgODQwLCA2MDQsMTM0NCwgODAwfSwKIAl7IDg0MCwgNTYwLDEzNDQsIDgwMH0sCkBAIC0xMzM4LDEyNCArMTMyMywxOCBAQAogCXsxMzQ0LCA4MDAsMTM0NCwgODAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFMxMDI0eDYwMERhdGFfMltdID0KLXsKLQl7MTM0NCwgODAwLDEzNDQsIDgwMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTMTE1Mng3NjhEYXRhXzFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSBTaVNfTFZEUzEwMjR4NzY4RGF0YV8xW109CiB7CiAJeyA4NDAsIDQzOCwxMzQ0LCA4MDZ9LAogCXsgODQwLCA0MDksMTM0NCwgODA2fSwKIAl7IDg0MCwgNDM4LDEzNDQsIDgwNn0sCiAJeyA4NDAsIDQwOSwxMzQ0LCA4MDZ9LAotCXsgODQwLCA1MTgsMTM0NCwgODA2fSwKLQl7MTA1MCwgNjM4LDEzNDQsIDgwNn0sCi0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzExNTJ4NzY4RGF0YV8yW10gPQotewotCXsxMzQ0LCA4MDYsMTM0NCwgODA2fQotfTsKLQotLyogUGFzcyAxOjEgZGF0YSAqLwotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFNYWFh4WFhYRGF0YV8xW109Ci17Ci0gICAgICAgIHsgODAwLCA0NDksICA4MDAsIDQ0OX0sCi0JeyA4MDAsIDQ0OSwgIDgwMCwgNDQ5fSwKLQl7IDkwMCwgNDQ5LCAgOTAwLCA0NDl9LAotCXsgOTAwLCA0NDksICA5MDAsIDQ0OX0sCi0JeyA4MDAsIDUyNSwgIDgwMCwgNTI1fSwgIC8qICA2NDB4NDgwICAqLwotCXsxMDU2LCA2MjgsIDEwNTYsIDYyOH0sICAvKiAgODAweDYwMCAgKi8KLQl7MTM0NCwgODA2LCAxMzQ0LCA4MDZ9LCAgLyogMTAyNHg3NjggICovCi0JezE2ODgsMTA2NiwgMTY4OCwxMDY2fSwgIC8qIDEyODB4MTAyNCAqLyAgLyogSU5TRVJURUQgKi8KLSAJezE2ODgsIDgwNiwgMTY4OCwgODA2fSwgIC8qIDEyODB4NzY4ICAqLwotfTsKLQotLyogQ3VzdG9tIGRhdGEgZm9yIEJhcmNvIGlRIFIgc2VyaWVzICovCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEU0JBUkNPMTM2NkRhdGFfMVtdPQotewotCXsgODMyLCA0MzgsMTMzMSwgODA2fSwKLQl7IDgzMiwgMzg4LDEzMzEsIDgwNn0sCi0JeyA4MzIsIDQzOCwxMzMxLCA4MDZ9LAotCXsgODMyLCAzODgsMTMzMSwgODA2fSwKLQl7IDgzMiwgNTE4LDEzMzEsIDgwNn0sCi0JezEwNTAsIDYzOCwxMzQ0LCA4MDZ9LAotCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKLQl7MTY4OCwxMDY2LDE2ODgsMTA2Nn0sCi0JezE2ODgsMTA2NiwxNjg4LDEwNjZ9ICAgLyogMTM2MHgxMDI0ICovCi19OwotCi0vKiBDdXN0b20gZGF0YSBmb3IgQmFyY28gaVEgUiBzZXJpZXMgKi8KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTQkFSQ08xMzY2RGF0YV8yW109Ci17Ci0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAotCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKLQl7MTM0NCwgODA2LDEzNDQsIDgwNn0sCi0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAotCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKLQl7MTM0NCwgODA2LDEzNDQsIDgwNn0sCi0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAotCXsxNjg4LDEwNjYsMTY4OCwxMDY2fSwKLQl7MTY4OCwxMDY2LDE2ODgsMTA2Nn0gICAvKiAxMzYweDEwMjQgKi8KLX07Ci0KLS8qIEN1c3RvbSBkYXRhIGZvciBCYXJjbyBpUSBHIHNlcmllcyAqLwotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFNCQVJDTzEwMjREYXRhXzFbXT0KLXsKLQl7IDgzMiwgNDM4LDEzMzEsIDgwNn0sCi0JeyA4MzIsIDQwOSwxMzMxLCA4MDZ9LAotCXsgODMyLCA0MzgsMTMzMSwgODA2fSwKLQl7IDgzMiwgNDA5LDEzMzEsIDgwNn0sCi0JeyA4MzIsIDUxOCwxMzMxLCA4MDZ9LCAgIC8qIDY0MHg0ODAgKi8KKwl7IDg0MCwgNTE4LDEzNDQsIDgwNn0sICAgLyogNjQweDQ4MCAqLwogCXsxMDUwLCA2MzgsMTM0NCwgODA2fSwgICAvKiA4MDB4NjAwICovCiAJezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LCAgIC8qIDEwMjR4NzY4ICovCiB9OwogCi0vKiBDdXN0b20gZGF0YSBmb3IgQmFyY28gaVEgRyBzZXJpZXMgKi8KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTQkFSQ08xMDI0RGF0YV8yW109Ci17Ci0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9Ci19OwotCi0vKiBDdXN0b20gZGF0YSBmb3IgODQ4eDQ4MCBwYXJhbGxlbCBwYW5lbCAqLwotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFM4NDh4NDgwRGF0YV8xW109Ci17Ci0JeyAgIDAsICAgMCwgICAwLCAgIDB9LAotCXsgICAwLCAgIDAsICAgMCwgICAwfSwKLQl7ICAgMCwgICAwLCAgIDAsICAgMH0sCi0JeyAgIDAsICAgMCwgICAwLCAgIDB9LAotCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDY0MHg0ODAgVE9ETyAqLwotCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDgwMHg2MDAgVE9ETyAqLwotCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDEwMjR4NzY4IFRPRE8gKi8KLQl7ICAgMCwgICAwLCAgIDAsICAgMH0sCi0JeyAgIDAsICAgMCwgICAwLCAgIDB9LAotCXsgICAwLCAgIDAsICAgMCwgICAwfSwKLQl7ICAgMCwgICAwLCAgIDAsICAgMH0sCi0JezEwODgsIDUyNSwxMDg4LCA1MjV9LCAgLyogODQ4eDQ4MCAqLwotCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSAgIC8qIDEzNjB4NzY4IFRPRE8gKi8KLX07Ci0KLS8qIEN1c3RvbSBkYXRhIGZvciA4NDh4NDgwIHBhcmFsbGVsIHBhbmVsICovCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzg0OHg0ODBEYXRhXzJbXT0KLXsKLQl7ICAgMCwgICAwLCAgIDAsICAgMH0sCi0JeyAgIDAsICAgMCwgICAwLCAgIDB9LAotCXsgICAwLCAgIDAsICAgMCwgICAwfSwKLQl7ICAgMCwgICAwLCAgIDAsICAgMH0sCi0JezEwODgsIDUyNSwxMDg4LCA1MjV9LCAgLyogIDY0MHg0ODAgKi8KLQl7MTA4OCwgNTI1LDEwODgsIDUyNX0sICAvKiAgODAweDYwMCAqLwotCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDEwMjR4NzY4ICovCi0JeyAgIDAsICAgMCwgICAwLCAgIDB9LAotCXsgICAwLCAgIDAsICAgMCwgICAwfSwKLQl7ICAgMCwgICAwLCAgIDAsICAgMH0sCi0JeyAgIDAsICAgMCwgICAwLCAgIDB9LAotCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDg0OHg0ODAgKi8KLQl7MTA4OCwgNTI1LDEwODgsIDUyNX0JLyogMTM2MHg3NjggVE9ETyAqLwotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0NIVFZVTlRTQ0RhdGFbXT0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpU19DSFRWVU5UU0NEYXRhW109CiB7CiAJeyA4NDAsIDYwMCwgODQwLCA2MDB9LAogCXsgODQwLCA2MDAsIDg0MCwgNjAwfSwKQEAgLTE0NjYsNyArMTM0NSw3IEBACiAgICAgICAgIHsxMTYwLCA5NDUsMTE2MCwgOTQ1fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0NIVFZPTlRTQ0RhdGFbXT0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpU19DSFRWT05UU0NEYXRhW109CiB7CiAJeyA4NDAsIDUyNSwgODQwLCA1MjV9LAogCXsgODQwLCA1MjUsIDg0MCwgNTI1fSwKQEAgLTE0NzcsNTUgKzEzNTYsOSBAQAogICAgICAgICB7MTE2MCwgODQwLDExNjAsIDg0MH0KIH07CiAKLS8qIENocm9udGVsIFRWIFNrZXcgKi8KLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVNfQ0hUVlVOVFNDRGVzRGF0YVtdPQotewotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVNfQ0hUVk9OVFNDRGVzRGF0YVtdPQotewotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVNfQ0hUVlVQQUxEZXNEYXRhW109Ci17Ci0JezI1NiwgIDB9LAotCXsyNTYsICAwfSwKLQl7MjU2LCAgMH0sCi0JezI1NiwgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpU19DSFRWT1BBTERlc0RhdGFbXT0KLXsKLQl7MjU2LCAgMH0sCi0JezI1NiwgIDB9LAotCXsyNTYsICAwfSwKLQl7MjU2LCAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0KLX07Ci0KIC8qIENSVDEgQ1JUQyBkYXRhIGZvciBzbGF2ZSBtb2RlcyAqLwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTX0xWRFNDUlQxMzIweDQ4MF8xW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpU19MVkRTQ1JUMTMyMHgyNDBfMVtdID0KIHsKICB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweGFhLDB4MWYsCiAgICAweDkwLDB4ODUsMHg4ZiwweGFiLDB4MzAsMHgwMCwweDA1LApAQCAtMTU1MCw3ICsxMzgzLDExMiBAQAogICAgMHgwMCB9fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTY0MHg0ODBfMVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YSBTaVNfTFZEU0NSVDEzMjB4MjQwXzJbXSA9Cit7Cisge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHgwYiwweDNlLAorICAgMHhlOSwweDhiLDB4ZGYsMHgwNCwweDMwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCisgICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MzAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKKyAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgzMCwweDAwLDB4MDUsCisgICAweDAwfX0sCisge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHgwYiwweDNlLAorICAgMHhlOSwweDhiLDB4ZGYsMHgwNCwweDMwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCisgICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MzAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKKyAgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCisgICAweDAxfX0sCisjaWYgMAorIHt7MHgyZCwweDI3LDB4OTAsMHgyYywweDgwLDB4MGIsMHgzZSwKKyAgIDB4ZTksMHg4YiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAweDAwfX0KKyNlbmRpZgorIHt7MHg1ZiwweDRmLDB4ODMsMHg1NSwweDgxLDB4MGIsMHgzZSwKKyAgIDB4ZTksMHg4YiwweGU4LDB4MGMsMHgwMCwweDAwLDB4MDUsCisgICAweDAwfX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEgU2lTX0xWRFNDUlQxMzIweDI0MF8yX0hbXSA9Cit7Cisge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHhhYSwweDFmLAorICAgMHg5MCwweDg1LDB4OGYsMHhhYiwweDMwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDgzLDB4MWYsCisgICAweDVlLDB4ODMsMHg1ZCwweDc5LDB4MTAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg2NSwweDRmLDB4ODksMHg1NCwweDlmLDB4YzQsMHgxZiwKKyAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDEsCisgICAweDAwfX0sCisge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHg4MywweDFmLAorICAgMHg1ZSwweDgzLDB4NWQsMHg3OSwweDEwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDA0LDB4M2UsCisgICAweGUwLDB4ODUsMHhkZiwweGZiLDB4MTAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKKyAgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCisgICAweDAxfX0sCisge3sweDJkLDB4MjcsMHg5MCwweDJjLDB4ODAsMHgwYiwweDNlLAorICAgMHhlOSwweDhiLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgIDB4MDB9fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpU19MVkRTQ1JUMTMyMHgyNDBfM1tdID0KK3sKKyB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCisgICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MDAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKKyAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgwMCwweDAwLDB4MDUsCisgICAweDAwfX0sCisge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHgwYiwweDNlLAorICAgMHhlOSwweDhiLDB4ZGYsMHgwNCwweDAwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCisgICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MDAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKKyAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgwMCwweDAwLDB4MDUsCisgICAweDAwfX0sCisge3sweDdmLDB4NjMsMHg4MywweDZjLDB4MWMsMHg3MiwweGYwLAorICAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKKyAgIDB4MDF9fSwKKyB7ezB4MmQsMHgyNywweDkwLDB4MmMsMHg4MCwweDBiLDB4M2UsCisgICAweGU5LDB4OGIsMHhlNywweDA0LDB4MDAsMHgwMCwweDAwLAorICAgMHgwMH19Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEgU2lTX0xWRFNDUlQxMzIweDI0MF8zX0hbXSA9Cit7Cisge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHhhYSwweDFmLAorICAgMHg5MCwweDg1LDB4OGYsMHhhYiwweDMwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDgzLDB4MWYsCisgICAweDVlLDB4ODMsMHg1ZCwweDc5LDB4MTAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg2NSwweDRmLDB4ODksMHg1NCwweDlmLDB4YzQsMHgxZiwKKyAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDEsCisgICAweDAwfX0sCisge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHg4MywweDFmLAorICAgMHg1ZSwweDgzLDB4NWQsMHg3OSwweDEwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDA0LDB4M2UsCisgICAweGUwLDB4ODUsMHhkZiwweGZiLDB4MTAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKKyAgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCisgICAweDAxfX0sCisge3sweDJkLDB4MjcsMHg5MCwweDJjLDB4ODAsMHgwYiwweDNlLAorICAgMHhlOSwweDhiLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgIDB4MDB9fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpU19MVkRTQ1JUMTY0MHg0ODBfMVtdID0KIHsKICB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCiAgICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MzAsMHgwMCwweDA1LApAQCAtMTU3Miw3ICsxNTEwLDcgQEAKICAgIDB4MDF9fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTY0MHg0ODBfMV9IW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpU19MVkRTQ1JUMTY0MHg0ODBfMV9IW10gPQogewogIHt7MHgyZCwweDI4LDB4OTAsMHgyYiwweGEwLDB4YmYsMHgxZiwKICAgIDB4OWMsMHg4ZSwweDk2LDB4YjksMHgwMCwweDAwLDB4MDAsCkBAIC0xNTkxLDg3OCArMTUyOSwxMzQgQEAKICAgIDB4MDB9fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTY0MHg0ODBfMltdID0KLXsKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKLSAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHgwYiwweDNlLAotICAgMHhlOSwweDhiLDB4ZGYsMHgwNCwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKLSAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDdmLDB4NjMsMHg4MywweDZjLDB4MWMsMHg3MiwweGYwLAotICAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4MmQsMHgyNywweDkwLDB4MmMsMHg4MCwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhlNywweDA0LDB4MDAsMHgwMCwweDAwLAotICAgMHgwMH19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTX0xWRFNDUlQxNjQweDQ4MF8yX0hbXSA9Ci17Ci0ge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHhhYSwweDFmLAotICAgMHg5MCwweDg1LDB4OGYsMHhhYiwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDgzLDB4MWYsCi0gICAweDVlLDB4ODMsMHg1ZCwweDc5LDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg2NSwweDRmLDB4ODksMHg1NCwweDlmLDB4YzQsMHgxZiwKLSAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHg4MywweDFmLAotICAgMHg1ZSwweDgzLDB4NWQsMHg3OSwweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDA0LDB4M2UsCi0gICAweGUwLDB4ODUsMHhkZiwweGZiLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKLSAgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweDJkLDB4MjcsMHg5MCwweDJjLDB4ODAsMHgwYiwweDNlLAotICAgMHhlOSwweDhiLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgIDB4MDB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTY0MHg0ODBfM1tdID0KLXsKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MDAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKLSAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgwMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHgwYiwweDNlLAotICAgMHhlOSwweDhiLDB4ZGYsMHgwNCwweDAwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MDAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKLSAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgwMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDdmLDB4NjMsMHg4MywweDZjLDB4MWMsMHg3MiwweGYwLAotICAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4MmQsMHgyNywweDkwLDB4MmMsMHg4MCwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhlNywweDA0LDB4MDAsMHgwMCwweDAwLAotICAgMHgwMH19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTX0xWRFNDUlQxNjQweDQ4MF8zX0hbXSA9Ci17Ci0ge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHhhYSwweDFmLAotICAgMHg5MCwweDg1LDB4OGYsMHhhYiwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDgzLDB4MWYsCi0gICAweDVlLDB4ODMsMHg1ZCwweDc5LDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg2NSwweDRmLDB4ODksMHg1NCwweDlmLDB4YzQsMHgxZiwKLSAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHg4MywweDFmLAotICAgMHg1ZSwweDgzLDB4NWQsMHg3OSwweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDA0LDB4M2UsCi0gICAweGUwLDB4ODUsMHhkZiwweGZiLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKLSAgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweDJkLDB4MjcsMHg5MCwweDJjLDB4ODAsMHgwYiwweDNlLAotICAgMHhlOSwweDhiLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgIDB4MDB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTEwMjR4NjAwXzFbXSA9Ci17Ci0ge3sweDY0LDB4NGYsMHg4OCwweDU0LDB4OWYsMHg1YSwweDNlLAotICAgMHhlOCwweDhmLDB4OGYsMHg1YiwweDAwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NjQsMHg0ZiwweDg4LDB4NTQsMHg5ZiwweDJlLDB4M2UsCi0gICAweGI5LDB4ODAsMHg1ZCwweDJmLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg2NCwweDRmLDB4ODgsMHg1NCwweDlmLDB4NWEsMHgzZSwKLSAgIDB4ZTgsMHg4ZiwweDhmLDB4NWIsMHgwMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDY0LDB4NGYsMHg4OCwweDU0LDB4OWYsMHgyZSwweDNlLAotICAgMHhiOSwweDgwLDB4NWQsMHgyZiwweDAwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NjQsMHg0ZiwweDg4LDB4NTQsMHg5ZiwweGFmLDB4YmEsCi0gICAweDNiLDB4ODIsMHhkZiwweGIwLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg3ZSwweDYzLDB4ODIsMHg2OCwweDE1LDB4MWUsMHhmMSwKLSAgIDB4YWUsMHg4NSwweDU3LDB4MWYsMHgzMCwweDAwLDB4MjYsCi0gICAweDAxfX0sCi0ge3sweGEzLDB4N2YsMHg4NywweDg2LDB4OTcsMHgxZSwweGYxLAotICAgMHhhZSwweDg1LDB4NTcsMHgxZiwweDMwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTEwMjR4NjAwXzFfSFtdID0KLXsKLSB7ezB4MmYsMHgyNywweDkzLDB4MmIsMHg5MCwweGM0LDB4MWYsCi0gICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDQ0LAotICAgMHgwMH19LAotIHt7MHgyZiwweDI3LDB4OTMsMHgyYiwweDkwLDB4OTcsMHgxZiwKLSAgIDB4NjAsMHg4NywweDVkLDB4ODMsMHgxMCwweDAwLDB4NDQsCi0gICAweDAwfX0sCi0ge3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHhjNCwweDFmLAotICAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHg0NCwKLSAgIDB4MDB9fSwKLSB7ezB4MmYsMHgyNywweDkzLDB4MmIsMHg5MCwweDk3LDB4MWYsCi0gICAweDYwLDB4ODcsMHg1ZCwweDgzLDB4MTAsMHgwMCwweDQ0LAotICAgMHgwMH19LAotIHt7MHgyZiwweDI3LDB4OTMsMHgyYiwweDkwLDB4MDQsMHgzZSwKLSAgIDB4ZTIsMHg4OSwweGRmLDB4MDUsMHgwMCwweDAwLDB4NDQsCi0gICAweDAwfX0sCi0ge3sweDNjLDB4MzEsMHg4MCwweDM1LDB4MWMsMHg3YywweGYwLAotICAgMHg1YSwweDhmLDB4NTcsMHg3ZCwweDIwLDB4MDAsMHg1NSwKLSAgIDB4MDF9fSwKLSB7ezB4NGYsMHgzZiwweDkzLDB4NDUsMHgwZCwweDI0LDB4ZjUsCi0gICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTX0xWRFNDUlQxMTAyNHg2MDBfMltdID0KLXsKLSB7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0gICAweDRhLDB4ODAsMHg4ZiwweDI1LDB4MzAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4MzEsMHg4NywweDVkLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotICAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0gICAweDMxLDB4ODcsMHg1ZCwweDI1LDB4MzAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4NzIsMHg4OCwweGRmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweGEzLDB4NjMsMHg4NywweDc4LDB4ODksMHgyNCwweGYxLAotICAgMHhhZSwweDg0LDB4NTcsMHgyNSwweDMwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4YTMsMHg3ZiwweDg3LDB4ODYsMHg5NywweDI0LDB4ZjUsCi0gICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAyLAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTX0xWRFNDUlQxMTAyNHg2MDBfMl9IW10gPQotewotIHt7MHg0ZiwweDI3LDB4OTMsMHgzOSwweDAxLDB4MjQsMHhiYiwKLSAgIDB4NGEsMHg4MCwweDhmLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotICAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NGYsMHgyNywweDkzLDB4MzksMHgwMSwweDI0LDB4YmIsCi0gICAweDRhLDB4ODAsMHg4ZiwweDI1LDB4MzAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg0ZiwweDI3LDB4OTMsMHgzOSwweDAxLDB4MjQsMHhiYiwKLSAgIDB4MzEsMHg4NywweDVkLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotICAgMHg3MiwweDg4LDB4ZGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NGYsMHgzMSwweDkzLDB4M2UsMHgwNiwweDI0LDB4ZjEsCi0gICAweGFlLDB4ODQsMHg1NywweDI1LDB4MzAsMHgwMCwweDAxLAotICAgMHgwMX19LAotIHt7MHg0ZiwweDNmLDB4OTMsMHg0NSwweDBkLDB4MjQsMHhmNSwKLSAgIDB4MDIsMHg4OCwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAxfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVNfTFZEU0NSVDExMTUyeDc2OF8xW10gPQotewotIHt7MHg2NCwweDRmLDB4ODgsMHg1NCwweDlmLDB4YzQsMHgxZiwKLSAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDY0LDB4NGYsMHg4OCwweDU0LDB4OWYsMHg5NywweDFmLAotICAgMHg2MCwweDg3LDB4NWQsMHg4MywweDEwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NjQsMHg0ZiwweDg4LDB4NTQsMHg5ZiwweGM0LDB4MWYsCi0gICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg2NCwweDRmLDB4ODgsMHg1NCwweDlmLDB4OTcsMHgxZiwKLSAgIDB4NjAsMHg4NywweDVkLDB4ODMsMHgxMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDY0LDB4NGYsMHg4OCwweDU0LDB4OWYsMHgwNCwweDNlLAotICAgMHhlMiwweDg5LDB4ZGYsMHgwNSwweDAwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4N2UsMHg2MywweDgyLDB4NjgsMHgxNSwweDdjLDB4ZjAsCi0gICAweDVhLDB4OGYsMHg1NywweDdkLDB4MjAsMHgwMCwweDI2LAotICAgMHgwMX19LAotIHt7MHhhMywweDdmLDB4ODcsMHg4NiwweDk3LDB4MjQsMHhmNSwKLSAgIDB4MDIsMHg4OCwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVNfTFZEU0NSVDExMTUyeDc2OF8xX0hbXSA9Ci17Ci0ge3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHhjNCwweDFmLAotICAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHg0NCwKLSAgIDB4MDB9fSwKLSB7ezB4MmYsMHgyNywweDkzLDB4MmIsMHg5MCwweDk3LDB4MWYsCi0gICAweDYwLDB4ODcsMHg1ZCwweDgzLDB4MTAsMHgwMCwweDQ0LAotICAgMHgwMH19LAotIHt7MHgyZiwweDI3LDB4OTMsMHgyYiwweDkwLDB4YzQsMHgxZiwKLSAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4NDQsCi0gICAweDAwfX0sCi0ge3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHg5NywweDFmLAotICAgMHg2MCwweDg3LDB4NWQsMHg4MywweDEwLDB4MDAsMHg0NCwKLSAgIDB4MDB9fSwKLSB7ezB4MmYsMHgyNywweDkzLDB4MmIsMHg5MCwweDA0LDB4M2UsCi0gICAweGUyLDB4ODksMHhkZiwweDA1LDB4MDAsMHgwMCwweDQ0LAotICAgMHgwMH19LAotIHt7MHgzYywweDMxLDB4ODAsMHgzNSwweDFjLDB4N2MsMHhmMCwKLSAgIDB4NWEsMHg4ZiwweDU3LDB4N2QsMHgyMCwweDAwLDB4NTUsCi0gICAweDAxfX0sCi0ge3sweDRmLDB4M2YsMHg5MywweDQ1LDB4MGQsMHgyNCwweGY1LAotICAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTExNTJ4NzY4XzJbXSA9Ci17Ci0ge3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotICAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0gICAweDMxLDB4ODcsMHg1ZCwweDI1LDB4MzAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4NGEsMHg4MCwweDhmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotICAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0gICAweDcyLDB4ODgsMHhkZiwweDI1LDB4MzAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHhhMywweDYzLDB4ODcsMHg3OCwweDg5LDB4MjQsMHhmMSwKLSAgIDB4YWUsMHg4NCwweDU3LDB4MjUsMHgzMCwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGEzLDB4N2YsMHg4NywweDg2LDB4OTcsMHgyNCwweGY1LAotICAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTExNTJ4NzY4XzJfSFtdID0KLXsKLSB7ezB4NGYsMHgyNywweDkzLDB4MzksMHgwMSwweDI0LDB4YmIsCi0gICAweDRhLDB4ODAsMHg4ZiwweDI1LDB4MzAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg0ZiwweDI3LDB4OTMsMHgzOSwweDAxLDB4MjQsMHhiYiwKLSAgIDB4MzEsMHg4NywweDVkLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotICAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NGYsMHgyNywweDkzLDB4MzksMHgwMSwweDI0LDB4YmIsCi0gICAweDMxLDB4ODcsMHg1ZCwweDI1LDB4MzAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg0ZiwweDI3LDB4OTMsMHgzOSwweDAxLDB4MjQsMHhiYiwKLSAgIDB4NzIsMHg4OCwweGRmLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDRmLDB4MzEsMHg5MywweDNlLDB4MDYsMHgyNCwweGYxLAotICAgMHhhZSwweDg0LDB4NTcsMHgyNSwweDMwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NGYsMHgzZiwweDkzLDB4NDUsMHgwZCwweDI0LDB4ZjUsCi0gICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTX0xWRFNDUlQxMTI4MHg3NjhfMVtdID0KLXsKLSB7ezB4NWIsMHg0ZiwweDlmLDB4NTUsMHgxOSwweGI0LDB4MWYsCi0gICAweDljLDB4OGUsMHg4ZiwweGI1LDB4MTAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg1YiwweDRmLDB4OWYsMHg1NSwweDE5LDB4ODIsMHgxZiwKLSAgIDB4NmEsMHg4YywweDVkLDB4ODMsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDViLDB4NGYsMHg5ZiwweDU1LDB4MTksMHhiNCwweDFmLAotICAgMHg5YywweDhlLDB4OGYsMHhiNSwweDEwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NWIsMHg0ZiwweDlmLDB4NTUsMHgxOSwweDgyLDB4MWYsCi0gICAweDZhLDB4OGMsMHg1ZCwweDgzLDB4MzAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg1YiwweDRmLDB4OWYsMHg1NSwweDE5LDB4MDQsMHgzZSwKLSAgIDB4ZWMsMHg4ZSwweGRmLDB4MDUsMHgyMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDZmLDB4NjMsMHg5MywweDY5LDB4OGQsMHg3YywweGYwLAotICAgMHg2NCwweDg2LDB4NTcsMHg3ZCwweDIwLDB4MDAsMHgwNSwKLSAgIDB4MDF9fSwKLSB7ezB4OGIsMHg3ZiwweDhmLDB4ODUsMHgwOSwweDI0LDB4ZjUsCi0gICAweDBjLDB4OGUsMHhmZiwweDI1LDB4MzAsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhhYiwweDlmLDB4OGYsMHhhNSwweDg5LDB4MjQsMHhmNSwKLSAgIDB4MGMsMHg4ZSwweGZmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweGFiLDB4OWYsMHg4ZiwweGE1LDB4ODksMHgyNCwweGY1LAotICAgMHgwYywweDhlLDB4ZmYsMHgyNSwweDMwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTEyODB4NzY4XzFfSFtdID0KLXsKLSB7ezB4NDcsMHgyNywweDhiLDB4MmMsMHgxYSwweDllLDB4MWYsCi0gICAweDkzLDB4ODYsMHg4ZiwweDlmLDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg0NywweDI3LDB4OGIsMHgyYywweDFhLDB4NmMsMHgxZiwKLSAgIDB4NjAsMHg4NCwweDVkLDB4NmQsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDQ3LDB4MjcsMHg4YiwweDMwLDB4MWUsMHg5ZSwweDFmLAotICAgMHg5MiwweDg2LDB4OGYsMHg5ZiwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NDcsMHgyNywweDhiLDB4MmMsMHgxYSwweDZjLDB4MWYsCi0gICAweDYwLDB4ODQsMHg1ZCwweDZkLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg0NywweDI3LDB4OGIsMHgyYywweDFhLDB4ZWUsMHgxZiwKLSAgIDB4ZTIsMHg4NiwweGRmLDB4ZWYsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDUxLDB4MzEsMHg5NSwweDM2LDB4MDQsMHg2NiwweGYwLAotICAgMHg1YSwweDhlLDB4NTcsMHg2NywweDIwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NWYsMHgzZiwweDgzLDB4NDQsMHg5MiwweDBlLDB4ZjUsCi0gICAweDAyLDB4ODYsMHhmZiwweDBmLDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19LAotIHt7MHg2ZiwweDRmLDB4OTMsMHg1NCwweDgyLDB4MGUsMHg1YSwKLSAgIDB4MDIsMHg4NiwweGZmLDB4MGYsMHgwOSwweDAwLDB4MDUsCi0gICAweDAxfX0sCi0ge3sweDZmLDB4NGYsMHg5MywweDU0LDB4ODIsMHgwZSwweDVhLAotICAgMHgwMiwweDg2LDB4ZmYsMHgwZiwweDA5LDB4MDAsMHgwNSwKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTEyODB4NzY4XzJbXSA9Ci17Ci0ge3sweGFiLDB4NjAsMHg5ZiwweDgwLDB4MDQsMHgyNCwweGJiLAotICAgMHg1NCwweDg2LDB4ZGIsMHhkYSwweDAwLDB4MDAsMHgwMiwKLSAgIDB4MDB9fSwKLSB7ezB4YWIsMHg2MCwweDlmLDB4ODAsMHgwNCwweDI0LDB4YmIsCi0gICAweDNiLDB4OGQsMHhjMiwweGMxLDB4MDAsMHgwMCwweDAyLAotICAgMHgwMH19LAotIHt7MHhhYiwweDYwLDB4OWYsMHg4MCwweDA0LDB4MjQsMHhiYiwKLSAgIDB4NTQsMHg4NiwweGRiLDB4ZGEsMHgwMCwweDAwLDB4MDIsCi0gICAweDAwfX0sCi0ge3sweGFiLDB4NjAsMHg5ZiwweDgwLDB4MDQsMHgyNCwweGJiLAotICAgMHgzYiwweDhkLDB4YzIsMHhjMSwweDAwLDB4MDAsMHgwMiwKLSAgIDB4MDB9fSwKLSB7ezB4YWIsMHg2MCwweDlmLDB4ODAsMHgwNCwweDI0LDB4YjMsCi0gICAweDdjLDB4OGUsMHgwMywweDAyLDB4MTAsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhhYiwweDYzLDB4OGYsMHg4YSwweDhlLDB4MjQsMHhmMSwKLSAgIDB4YjYsMHg4OCwweDU3LDB4MjUsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGFiLDB4N2YsMHg4ZiwweDk4LDB4OWMsMHgyNCwweGY1LAotICAgMHgwYSwweDhjLDB4ZmYsMHgyNSwweDMwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4YWIsMHg5ZiwweDhmLDB4YTgsMHg4YywweDI0LDB4ZjUsCi0gICAweDBhLDB4OGMsMHhmZiwweDI1LDB4MzAsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhhYiwweDlmLDB4OGYsMHhhOCwweDhjLDB4MjQsMHhmNSwKLSAgIDB4MGEsMHg4YywweGZmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAxfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVNfTFZEU0NSVDExMjgweDc2OF8yX0hbXSA9Ci17Ci0ge3sweDgzLDB4MzgsMHg5NywweDU4LDB4OWMsMHgyNCwweGJiLAotICAgMHg1NCwweDg2LDB4ZGIsMHhkYSwweDAwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4ODMsMHgzOCwweDk3LDB4NTgsMHg5YywweDI0LDB4YmIsCi0gICAweDNiLDB4OGQsMHhjMiwweGMxLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg4MywweDM4LDB4OTcsMHg1OCwweDljLDB4MjQsMHhiYiwKLSAgIDB4NTQsMHg4NiwweGRiLDB4ZGEsMHgwMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDgzLDB4MzgsMHg5NywweDU4LDB4OWMsMHgyNCwweGJiLAotICAgMHgzYiwweDhkLDB4YzIsMHhjMSwweDAwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4ODMsMHgzOCwweDk3LDB4NTgsMHg5YywweDI0LDB4YjMsCi0gICAweDdjLDB4OGUsMHgwMywweDAyLDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19LAotIHt7MHg3OSwweDMxLDB4OWQsMHg1OCwweDljLDB4MjQsMHhmMSwKLSAgIDB4YjYsMHg4OCwweDU3LDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAxfX0sCi0ge3sweDZiLDB4M2YsMHg4ZiwweDU4LDB4OWMsMHgyNCwweGY1LAotICAgMHgwYSwweDhjLDB4ZmYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4YWIsMHg5ZiwweDhmLDB4YTgsMHg4YywweDI0LDB4ZjUsCi0gICAweDBhLDB4OGMsMHhmZiwweDI1LDB4MzAsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhhYiwweDlmLDB4OGYsMHhhOCwweDhjLDB4MjQsMHhmNSwKLSAgIDB4MGEsMHg4YywweGZmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAxfX0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIENPTU1PTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIExJTlVYX1hGODYKLQotI2RlZmluZSBTSVNfUExfSFNZTkNQIDB4MDEKLSNkZWZpbmUgU0lTX1BMX0hTWU5DTiAweDAyCi0jZGVmaW5lIFNJU19QTF9WU1lOQ1AgMHgwNAotI2RlZmluZSBTSVNfUExfVlNZTkNOIDB4MDgKLSNkZWZpbmUgU0lTX1BMX0RWSSAgICAweDgwCi0KLXR5cGVkZWYgc3RydWN0IF9TaVNfUGxhc21hTW9kZXMKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgVUxPTkcgIGNsb2NrOwotICBVU0hPUlQgSERpc3BsYXksIEhUb3RhbCwgSEZyb250UG9yY2gsIEhTeW5jV2lkdGg7Ci0gIFVTSE9SVCBWRGlzcGxheSwgVlRvdGFsLCBWRnJvbnRQb3JjaCwgVlN5bmNXaWR0aDsKLSAgVUNIQVIgIFN5bmNGbGFnczsKLX0gU2lTX1BsYXNtYU1vZGVzOwotCi10eXBlZGVmIHN0cnVjdCBfU2lTX1BsYXNtYVRhYmxlcwotewotICAgVVNIT1JUIHZlbmRvcjsKLSAgIFVDSEFSICBwcm9kdWN0bnVtOwotICAgVVNIT1JUIHByb2R1Y3RbNV07Ci0gICBjb25zdCBjaGFyICpERENuYW1lc1s1XTsKLSAgIGNvbnN0IGNoYXIgKnBsYXNtYW5hbWU7Ci0gICBVU0hPUlQgbWF4eCxtYXh5OwotICAgVVNIT1JUIHByZWZ4LCBwcmVmeTsKLSAgIFVDSEFSICBtb2RlbnVtOwotICAgVUNIQVIgIHBsYXNtYW1vZGVzWzIwXTsgIC8qIHwgMHg4MCA9IERWSS1jYXBhYmxlLCB8IDB4NDAgPSBhbmFsb2cgKi8KLX0gU2lTX1BsYXNtYVRhYmxlczsKLQotc3RhdGljIGNvbnN0IFNpU19QbGFzbWFNb2RlcyBTaVNfUGxhc21hTW9kZVtdID0gewotICAgeyAgIjY0MHg0MDAiLAkJLyogMDA6IElCTSA0MDBANzAgKi8KLSAgICAgIDI1MTc1LAotICAgICAgIDY0MCwgIDgwMCwgMTcsICA2NCwKLSAgICAgICA0MDAsICA0NDksIDEzLCAgIDIsCi0gICAgICBTSVNfUExfSFNZTkNOIHwgU0lTX1BMX1ZTWU5DTiB9LAotICAgeyAgIjY0MHg0ODAiLAkJLyogMDE6IFZFU0EgNDgwQDcyICovCi0gICAgICAzMTUwMCwKLSAgICAgICA2NDAsICA4MzIsIDI0LCAgNDAsCi0gICAgICAgNDgwLCAgNTIwLCAgOSwgICAzLAotICAgICAgU0lTX1BMX0hTWU5DTiB8IFNJU19QTF9WU1lOQ04gfSwKLSAgIHsgICI4MDB4NjAwIiwJCS8qIDAyOiBWRVNBIDYwMEA3MiAqLwotICAgICAgNTAwMDAsCi0gICAgICAgODAwLCAxMDQwLCA1NiwgMTIwLAotICAgICAgIDYwMCwgIDY2NiwgMzcsICAgNiwKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiODY0eDQ4MCIsCQkvKiAwMzogQ2VyZWIgd2lkZSAxICovCi0gICAgICA0MjUyNiwKLSAgICAgICA4NjQsIDExMzQsIDIyLCAgODYsCi0gICAgICAgNDgwLCAgNTAwLCAgMSwgICAzLAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ04gfSwKLSAgIHsgICI4NDh4NDgwIiwJCS8qIDA0OiBWRVNBIHdpZGUgKE5FQzEpICovCi0gICAgICAzMzc1MCwKLSAgICAgICA4NDgsIDEwODgsIDE2LCAxMTIsCi0gICAgICAgNDgwLCAgNTE3LCAgNiwgICA4LAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMDI0eDU3NiIsCQkvKiAwNTogVkVTQSB3aWRlIChORUMyKSAqLwotICAgICAgNDcyNTAsCi0gICAgICAxMDI0LCAxMzIwLCAxNiwgMTQ0LAotICAgICAgIDU3NiwgIDU5NiwgIDIsICAgNCwKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiMTI4MHg3MjAiLAkJLyogMDY6IFZFU0Egd2lkZSAoTkVDMykgKi8KLSAgICAgIDc2NTAwLAotICAgICAgMTI4MCwgMTY5NiwgNDgsIDE3NiwKLSAgICAgICA3MjAsICA3NTAsICA0LCAgIDgsCi0gICAgICBTSVNfUExfSFNZTkNQIHwgU0lTX1BMX1ZTWU5DUCB9LAotICAgeyAgIjEzNjB4NzY1IiwJCS8qIDA3OiBWRVNBIHdpZGUgKE5FQzQpICovCi0gICAgICA4NTUwMCwKLSAgICAgIDEzNjAsIDE3OTIsIDY0LCAxNzYsCi0gICAgICAgNzY1LCAgNzk1LCAgNCwgICA4LAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMDI0eDYwMCIsCQkvKiAwODogQ0VSRUIgd2lkZSAyICovCi0gICAgICA1MTIwMCwKLSAgICAgIDEwMjQsIDEzNTIsIDUxLCAxNjQsCi0gICAgICAgNjAwLCAgNjI4LCAgMSwgICA0LAotICAgICAgU0lTX1BMX0hTWU5DTiB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMDI0eDc2OCIsCQkvKiAwOTogVkVTQSA3NjhANzUgKi8KLSAgICAgIDc4NzUwLAotICAgICAgMTAyNCwgMTMxMiwgIDE2LCA5NiwKLSAgICAgICA3NjgsICA4MDAsICAgMSwgIDMsCi0gICAgICBTSVNfUExfSFNZTkNQIHwgU0lTX1BMX1ZTWU5DUCB9LAotICAgeyAgIjExNTJ4ODY0IiwJCS8qIDEwOiBWRVNBIDExNTJ4ODY0QDc1ICovCi0gICAgICAxMDgwMDAsCi0gICAgICAxMTUyLCAxNjAwLCA2NCwgMTI4LAotICAgICAgIDg2NCwgIDkwMCwgIDEsICAgMywKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiMTI4MHgxMDI0IiwJCS8qIDExOiBWRVNBIDEwMjRANjAgKi8KLSAgICAgIDEwODAwMCwKLSAgICAgIDEyODAsIDE2ODgsIDQ4LCAxMTIsCi0gICAgICAxMDI0LCAxMDY2LCAgMSwgICAzLAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMjgweDc2OCIsCQkvKiAxMjogV19YR0EgKi8KLSAgICAgIDgxMDAwLAotICAgICAgMTI4MCwgMTY4OCwgNDgsIDExMiwKLSAgICAgICA3NjgsICA4MDIsICAzLCAgIDYsCi0gICAgICBTSVNfUExfSFNZTkNQIHwgU0lTX1BMX1ZTWU5DTiB9LAotICAgeyAgIjEyODB4NzY4IiwJCS8qIDEzOiBJL08gRGF0YSBXX1hHQUA1Nkh6ICovCi0gICAgICA3NjA2NCwKLSAgICAgIDEyODAsIDE2ODgsIDQ4LCAxMTIsCi0gICAgICAgNzY4LCAgODAyLCAgMiwgICAzLAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMzc2eDc2OCIsCQkvKiAxNDogSS9PIFdpZGUgWEdBICovCi0gICAgICA4NzM0MCwKLSAgICAgIDEzNzYsIDE4MDgsIDMyLCAxMjgsCi0gICAgICAgNzY4LCAgODA2LCAgMywgICA2LAotICAgICAgU0lTX1BMX0hTWU5DTiB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMjgweDk2MCIsCQkvKiAxNTogVkVTQSA5NjBANjAgKi8KLSAgICAgIDEwODAwMCwKLSAgICAgIDEyODAsIDE4MDAsIDk2LCAxMTIsCi0gICAgICAgOTYwLCAxMDAwLCAgMSwgICAzLAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxNDAweDEwNTAiLAkJLyogMTY6IFZFU0EgMTA1MEA2MEh6ICovCi0gICAgICAxMDgwMDAsCi0gICAgICAxNDAwLCAxNjg4LCA0OCwgMTEyLAotICAgICAgMTA1MCwgMTA2NiwgIDEsICAgMywKLSAgICAgIFNJU19QTF9IU1lOQ04gfCBTSVNfUExfVlNZTkNOIH0sCi0gICB7ICAiMTM2MHg3NjgiLAkJLyogMTc6IFZFU0Egd2lkZSAoTkVDNC8yKSAqLwotICAgICAgODU1MDAsCi0gICAgICAxMzYwLCAxNzkyLCA2NCwgMTEyLAotICAgICAgIDc2NSwgIDc5NSwgIDMsICAgNiwKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiODAweDYwMCIsCQkvKiAxODogVkVTQSA2MDBANTYgKi8KLSAgICAgIDM2MDAwLAotICAgICAgIDgwMCwgMTAyNCwgMjQsICAgMiwKLSAgICAgICA2MDAsICA2MjUsICAxLCAgIDIsCi0gICAgICBTSVNfUExfSFNZTkNQIHwgU0lTX1BMX1ZTWU5DUCB9LAotICAgeyAgIjEwNzJ4NjAwIiwJCS8qIDE5OiBQYW5hc29uaWMgMTA3Mng2MDAgKHN5bmM/KSAqLwotICAgICAgNTQxMDAsCi0gICAgICAgMTA3MiwgMTQyNCwgNDgsIDE3NiwKLSAgICAgICAgNjAwLCAgNjI4LCAxNiwgICAxLAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICI4NDh4NDgwIiwJCS8qIDIwOiBQYW5hc29uaWMgODQ4eDQ4MCAoc3luYz8pICovCi0gICAgICAzMzA3MCwJCQkvKiBpcyA4NTJ4NDgwLCBidXQgd2UgY2FuJ3QgdXNlIDg1MiAqLwotICAgICAgICA4NDgsIDEwNjgsIDIwLCAgNDAsCS8qIGRpZmZlcnMgZnJvbSBEREMgZGF0YSwgYmV0dGVyIGNlbnRlcmVkICovCi0gICAgICAgIDQ4MCwgIDUxNiwgIDMsICAgNSwJLyogd29uJ3Qgd29yayBhc3N1bWluZ2x5LCBiZWNhdXNlIGRhdGEgaXMgJSA4ICovCi0gICAgICBTSVNfUExfSFNZTkNOIHwgU0lTX1BMX1ZTWU5DTiB9LAotICAgeyAgIjEyODB4NzIwIiwJCS8qIDIxOiBXSURFNzIwKDYwKSAoYWthICI3NTBwIikgKFBhbmFzb25pYykgKi8KLSAgICAgIDc0MzAwLAotICAgICAgMTI4MCwgMTY1MCwxMTAsICA0MCwKLSAgICAgICA3MjAsICA3NTAsICA1LCAgIDUsCi0gICAgICBTSVNfUExfSFNZTkNQIHwgU0lTX1BMX1ZTWU5DUCB9LAotICAgeyAgIjEyODB4NzY4IiwJCS8qIDIyOiAxMjgweDc2OEA1Ni41IChQYW5hc29uaWMpICovCi0gICAgICA3NjIwMCwJCQkvKiAoQWNjb3JkaW5nIHRvIG1hbnVhbCBub3Qgc3VwcG9ydGVkIGZvciBIRE1JOyBidXQgd29ya3MpICovCi0gICAgICAxMjgwLCAxNjgwLCAxNiwgIDI0LAotICAgICAgIDc2OCwgIDgwMiwgIDIsICAgNSwKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiMTI4MHg3MjBANTAiLAkJLyogMjM6IFdJREU3MjAoNTApIChha2EgIjc1MHAiKSAoUGFuYXNvbmljKSAqLwotICAgICAgNzQzMDAsCQkJLyogUGFuYXNvbmljIHN0YXRlcyA0NS4wa0h6LiBOb3QgcG9zc2libGUuIFRoaXMgb25lIHdvcmtzICh3aXRoIHNvbWUgb3ZlcnNjYW4pICovCi0gICAgICAxMjgwLCAxOTgwLDQwMCwgIDgwLAotICAgICAgIDcyMCwgIDc1MCwgIDEsICAgMiwKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiNzIweDQ4MCIsCQkvKiAyNDogNzIweDQ4MCAoYWthICI1MjVwIiBhbmQgIjQ4MHAiKSAoUGFuYXNvbmljKSAqLwotICAgICAgMjcwMDAsCi0gICAgICAgNzIwLCAgODU2LCA0MCwgIDMyLAotICAgICAgIDQ4MCwgIDUyNSwgIDEsICAgMywKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiNzIweDU3NiIsCQkvKiAyNTogNzIweDU3NiAoYWthICI2MjVwImFuZCAiNTc2cCIpIChQYW5hc29uaWMpICovCi0gICAgICAyNzUwMCwKLSAgICAgICA3MjAsICA4NjQsIDE2LCAgNjQsCi0gICAgICAgNTc2LCAgNjI1LCAgNSwgICA2LAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMjgweDcyMEA1MCIsCQkvKiAyNjogV0lERTcyMCg1MCkgKGFrYSAiNzUwcCIpIChHZW5lcmljKSAqLwotICAgICAgNzQzMDAsCi0gICAgICAxMjgwLCAxOTgwLDQwMCwgIDgwLAotICAgICAgIDcyMCwgIDc1MCwgIDUsICAgNSwKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi19OwotCi0vKgotMjcuMDAgIDcyMCA3NTUgNzkxIDg1OCAgNDgwIDQ4MCA0ODQgNTI1Ci0yNy41MCAgNzIwIDczMiA3OTUgODY0ICA1NzYgNTgxIDU4NyA2MjUKLSovCi0KLXN0YXRpYyBjb25zdCBTaVNfUGxhc21hVGFibGVzIFNpU19QbGFzbWFUYWJsZVtdID0gewotI2lmIDAgIC8qIFByb2R1Y3QgSURzIG1pc3NpbmcgKi8KLSAgIHsgMHgzOGEzLCA0LAotICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIiIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJORUMgUGxhc21hU3luYyA0MlZQNC80MlZQNEQvNDJWUDRHLzQyVlA0REciLAotICAgICAwLCAwLAotICAgICAwLCAwLAotICAgICAxMSwgICAvKiBBbGwgRFZJLCBleGNlcHQgMCwgNywgMTMgKi8KLSAgICAgeyAwfDB4NDAsIDF8MHhjMCwgMnwweGMwLCA0fDB4YzAsIDd8MHg0MCwgOXwweGMwLDEwfDB4YzAsMTF8MHhjMCwxM3wweDQwLDE0fDB4YzAsCi0gICAgICAxN3wweGMwLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgICB9Ci0gICB9LAorQk9PTEVBTgkJU2lTSW5pdFB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CisjaWZkZWYgU0lTX1hPUkdfWEY4NgordW5zaWduZWQgc2hvcnQJU2lTX0dldE1vZGVJRChpbnQgVkdBRW5naW5lLCB1bnNpZ25lZCBpbnQgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksCisJCQkJaW50IERlcHRoLCBCT09MRUFOIEZTVE4sIGludCBMQ0R3aXRoLCBpbnQgTENEaGVpZ2h0KTsKICNlbmRpZgotI2lmIDAgIC8qIFByb2R1Y3QgSURzIG1pc3NpbmcgKi8KLSAgIHsgMHgzOGEzLCAzLAotICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIiIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJORUMgUGxhc21hU3luYyA0MlBEMS81MFBEMS81MFBEMiIsCi0gICAgIDAsIDAsCi0gICAgIDAsIDAsCi0gICAgIDUsICAgLyogRFZJIGVudGlyZWx5IHVua25vd24gKi8KLSAgICAgeyAwfDB4NDAsIDF8MHhjMCwgMnwweGMwLCA0fDB4YzAsIDl8MHhjMCwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsCi0gICAgICAgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgICB9Ci0gICB9LAotICAgeyAweDM4YTMsIDEsCi0gICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwKLSAgICAgeyAiIiwgIiIsICIiLCAiIiwgIiIgfSwKLSAgICAgIk5FQyBQbGFzbWFTeW5jIDQyUEQzIiwKLSAgICAgMCwgMCwKLSAgICAgMCwgMCwKLSAgICAgMTAsICAgLyogRFZJIGVudGlyZWx5IHVua25vd24gKi8KLSAgICAgeyAwfDB4NDAsIDF8MHhjMCwgMnwweGMwLCAzfDB4YzAsIDR8MHhjMCwgNXwweGMwLCA2fDB4YzAsIDd8MHg0MCwgOHwweGMwLCA5fDB4YzAsCi0gICAgICAgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgICB9Ci0gICB9LAotICAgeyAweDM4YTMsIDIsCi0gICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwKLSAgICAgeyAiIiwgIiIsICIiLCAiIiwgIiIgfSwKLSAgICAgIk5FQyBQbGFzbWFTeW5jIDQyVk0zLzYxWE0xIiwKLSAgICAgMCwgMCwKLSAgICAgMCwgMCwKLSAgICAgMTEsICAvKiBEVkkgZW50aXJlbHkgdW5rbm93biAqLwotICAgICB7IDB8MHg0MCwgMXwweGMwLCAyfDB4YzAsIDN8MHhjMCwgNHwweGMwLCA1fDB4YzAsIDZ8MHhjMCwgOHwweGMwLCA5fDB4YzAsMTF8MHhjMCwKLSAgICAgIDE3fDB4YzAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAgIH0KLSAgIH0sCi0gICB7IDB4MzhhMywgMiwKLSAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LAotICAgICB7ICIiLCAiIiwgIiIsICIiLCAiIiB9LAotICAgICAiTkVDIFBsYXNtYVN5bmMgNDJNUDEvNDJNUDIiLAotICAgICAwLCAwLAotICAgICAwLCAwLAotICAgICA2LCAgIC8qIERWSSBlbnRpcmVseSB1bmtub3duICovCi0gICAgIHsgMHwweDQwLCAxfDB4YzAsIDJ8MHhjMCwgNHwweGMwLCA5fDB4YzAsMTF8MHhjMCwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSAgIHsgMHgzOGEzLCAxLAotICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIiIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJORUMgUGxhc21hU3luYyA1ME1QMSIsCi0gICAgIDAsIDAsCi0gICAgIDAsIDAsCi0gICAgIDEwLCAgIC8qIERWSSBlbnRpcmVseSB1bmtub3duICovCi0gICAgIHsgMHwweDQwLCAxfDB4YzAsIDJ8MHhjMCwgNHwweGMwLCA3fDB4NDAsIDl8MHhjMCwxMHwweGMwLDExfDB4YzAsMTN8MHg0MCwxNHwweGMwLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKK3Vuc2lnbmVkIHNob3J0CVNpU19HZXRNb2RlSURfTENEKGludCBWR0FFbmdpbmUsIHVuc2lnbmVkIGludCBWQkZsYWdzLCBpbnQgSERpc3BsYXksCisJCQkJaW50IFZEaXNwbGF5LCBpbnQgRGVwdGgsIEJPT0xFQU4gRlNUTiwKKwkJCQl1bnNpZ25lZCBzaG9ydCBDdXN0b21ULCBpbnQgTENEd2l0aCwgaW50IExDRGhlaWdodCwKKwkJCQl1bnNpZ25lZCBpbnQgVkJGbGFnczIpOwordW5zaWduZWQgc2hvcnQJU2lTX0dldE1vZGVJRF9UVihpbnQgVkdBRW5naW5lLCB1bnNpZ25lZCBpbnQgVkJGbGFncywgaW50IEhEaXNwbGF5LAorCQkJCWludCBWRGlzcGxheSwgaW50IERlcHRoLCB1bnNpZ25lZCBpbnQgVkJGbGFnczIpOwordW5zaWduZWQgc2hvcnQJU2lTX0dldE1vZGVJRF9WR0EyKGludCBWR0FFbmdpbmUsIHVuc2lnbmVkIGludCBWQkZsYWdzLCBpbnQgSERpc3BsYXksCisJCQkJaW50IFZEaXNwbGF5LCBpbnQgRGVwdGgsIHVuc2lnbmVkIGludCBWQkZsYWdzMik7CisKK3ZvaWQJCVNpU19TZXRSZWcoU0lTSU9BRERSRVNTIHBvcnQsIHVuc2lnbmVkIHNob3J0IGluZGV4LCB1bnNpZ25lZCBzaG9ydCBkYXRhKTsKK3ZvaWQJCVNpU19TZXRSZWdCeXRlKFNJU0lPQUREUkVTUyBwb3J0LCB1bnNpZ25lZCBzaG9ydCBkYXRhKTsKK3ZvaWQJCVNpU19TZXRSZWdTaG9ydChTSVNJT0FERFJFU1MgcG9ydCwgdW5zaWduZWQgc2hvcnQgZGF0YSk7Cit2b2lkCQlTaVNfU2V0UmVnTG9uZyhTSVNJT0FERFJFU1MgcG9ydCwgdW5zaWduZWQgaW50IGRhdGEpOwordW5zaWduZWQgY2hhcglTaVNfR2V0UmVnKFNJU0lPQUREUkVTUyBwb3J0LCB1bnNpZ25lZCBzaG9ydCBpbmRleCk7Cit1bnNpZ25lZCBjaGFyCVNpU19HZXRSZWdCeXRlKFNJU0lPQUREUkVTUyBwb3J0KTsKK3Vuc2lnbmVkIHNob3J0CVNpU19HZXRSZWdTaG9ydChTSVNJT0FERFJFU1MgcG9ydCk7Cit1bnNpZ25lZCBpbnQJU2lTX0dldFJlZ0xvbmcoU0lTSU9BRERSRVNTIHBvcnQpOwordm9pZAkJU2lTX1NldFJlZ0FORE9SKFNJU0lPQUREUkVTUyBQb3J0LCB1bnNpZ25lZCBzaG9ydCBJbmRleCwgdW5zaWduZWQgc2hvcnQgRGF0YUFORCwKKwkJCQl1bnNpZ25lZCBzaG9ydCBEYXRhT1IpOwordm9pZAkJU2lTX1NldFJlZ0FORChTSVNJT0FERFJFU1MgUG9ydCx1bnNpZ25lZCBzaG9ydCBJbmRleCwgdW5zaWduZWQgc2hvcnQgRGF0YUFORCk7Cit2b2lkCQlTaVNfU2V0UmVnT1IoU0lTSU9BRERSRVNTIFBvcnQsdW5zaWduZWQgc2hvcnQgSW5kZXgsIHVuc2lnbmVkIHNob3J0IERhdGFPUik7CisKK3ZvaWQJCVNpU19EaXNwbGF5T24oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOwordm9pZAkJU2lTX0Rpc3BsYXlPZmYoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOwordm9pZAkJU2lTUmVnSW5pdChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU0lTSU9BRERSRVNTIEJhc2VBZGRyKTsKKyNpZm5kZWYgU0lTX0xJTlVYX0tFUk5FTAordm9pZAkJU2lTU2V0TFZEU2V0YyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CiAjZW5kaWYKLSAgIHsgMHgzOGEzLCA0LAotICAgICB7IDB4YTQ4MiwgMHhhNDgzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIlBYLTQyVk0iLCAiIiwgIiIsICIiLCAiIiB9LAotICAgICAiTkVDIFBsYXNtYVN5bmMgNDJNUDMvNDJNUDQvNTBNUDIvNjFNUDEiLAotICAgICAwLCAwLAotICAgICAwLCAwLAotICAgICAxMSwgICAvKiBBbGwgRFZJIGV4Y2VwdCAwLCA3LCAxMywgMTcgKi8KLSAgICAgeyAwfDB4NDAsIDF8MHhjMCwgMnwweGMwLCA0fDB4YzAsIDd8MHg0MCwgOXwweGMwLDEwfDB4YzAsMTF8MHhjMCwxM3wweDQwLDE0fDB4YzAsCi0gICAgICAxN3wweDQwLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgICB9Ci0gICB9LAotI2lmIDAgIC8qIFByb2R1Y3QgSURzIG1pc3NpbmcgKi8KLSAgIHsgMHgzOGEzLCAxLAotICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIiIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJORUMgUGxhc21hU3luYyAzMzAwVyIsCi0gICAgIDAsIDAsCi0gICAgIDAsIDAsCi0gICAgIDMsCi0gICAgIHsgMHwweDQwLCAxfDB4YzAsMTh8MHhjMCwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSAgIHsgMHgzOGEzLCAxLAotICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIiIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJORUMgUGxhc21hU3luYyA0MjAwVyIsCi0gICAgIDQsICAgLyogRFZJIGVudGlyZWx5IHVua25vd24gKi8KLSAgICAgeyAwfDB4NDAsIDF8MHhjMCwgMnwweGMwLCA0fDB4YzAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsCi0gICAgICAgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgICB9Ci0gICB9LAotICAgeyAweDM4YTMsIDEsCi0gICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwKLSAgICAgeyAiIiwgIiIsICIiLCAiIiwgIiIgfSwKLSAgICAgIk5FQyBQbGFzbWFTeW5jIDQyMTBXIiwKLSAgICAgMCwgMCwKLSAgICAgMCwgMCwKLSAgICAgNiwgICAvKiBEVkkgZW50aXJlbHkgdW5rbm93biAqLwotICAgICB7IDB8MHg0MCwgMXwweGMwLCAyfDB4YzAsIDR8MHhjMCwgOXwweGMwLDExfDB4YzAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwKLSAgICAgICAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAgIH0KLSAgIH0sCi0gICB7IDB4MzhhMywgMSwKLSAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LAotICAgICB7ICIiLCAiIiwgIiIsICIiLCAiIiB9LAotICAgICAiTkVDIFBsYXNtYVN5bmMgNTAwMFciLAotICAgICAwLCAwLAotICAgICAwLCAwLAotICAgICA3LCAgIC8qIERWSSBlbnRpcmVseSB1bmtub3duICovCi0gICAgIHsgMHwweDQwLCAxfDB4YzAsIDJ8MHhjMCwgNHwweGMwLCA3fDB4NDAsIDl8MHhjMCwxMXwweGMwLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSNlbmRpZgotICAgeyAweDQxMmYsIDIsCi0gICAgIHsgMHgwMDBjLCAweDAwMGIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwKLSAgICAgeyAiIiwgIiIsICIiLCAiIiwgIiIgfSwKLSAgICAgIlBpb25lZXIgNTAzQ01YL1BEQS01MDAyIiwKLSAgICAgMCwgMCwKLSAgICAgMCwgMCwKLSAgICAgNiwgICAvKiBEVkkgdW5rbm93biAqLwotICAgICB7IDF8MHhjMCwgMnwweGMwLCA5fDB4YzAsMTF8MHhjMCwxMnwweGMwLDE1fDB4YzAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwKLSAgICAgICAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAgIH0KLSAgIH0sCi0gICB7IDB4MzRhOSwgMSwKLSAgICAgeyAweGEwMGUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LAotICAgICB7ICIiLCAiIiwgIiIsICIiLCAiIiB9LAotICAgICAiUGFuYXNvbmljIFRILTQyIiwKLSAgICAgMCwgMCwKLSAgICAgMCwgMCwKLSAgICAgNSwgICAvKiBObyBEVkkgb3V0cHV0ICovCi0gICAgIHsgMXwweDQwLCAyfDB4NDAsIDR8MHg0MCwgOXwweDQwLDE1fDB4NDAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSAgIHsgMHgzNGE5LCAxLAotICAgICB7IDB4YTAwNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIlRILTQyUFcqNCIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJQYW5hc29uaWMgVEgtNDJQVzUiLAotICAgICAwLCAwLAotICAgICAwLCAwLAotICAgICAxLCAgIC8qIE5vIHNwZWNpYWwgbW9kZXMgb3RoZXJ3aXNlOyBubyBEVkkuICovCi0gICAgIHsyMHwweDQwLDE5fDB4NDAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSAgIHsgMHg0YzJlLCAxLAotICAgICB7IDB4OWIwNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIlBMVi1aMiIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJTYW55byBQTFYtWjIgKG5vbiBIRENQLW1vZGUpIiwgCS8qIEhEQ1AgbW9kZSB3b3VsZCBiZSBpZCA5YjA2LCBidXQgbm90IG5lZWRlZCAqLwotICAgICAxMjgwLCA3NjgsCQkJCS8qIGFzIGl0IHRoZW4gYWR2ZXJ0aXNlcyBjb3JyZWN0IHNpemUgKi8KLSAgICAgMTI4MCwgNzIwLAotICAgICAxLCAgIC8qIDEyODB4NzIwLCBubyBzcGVjaWFsIG1vZGVzIG90aGVyd2lzZSAqLwotICAgICB7MjF8MHhjMCwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwKLSAgICAgICAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAgIH0KLSAgIH0sCi0gICB7IDB4MzRhOSwgMSwKLSAgICAgeyAweGQwMzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LAotICAgICB7ICJBRTUwMFUgKERWSS1EKSIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJQYW5hc29uaWMgQUU1MDBVIiwKLSAgICAgMTI4MCwgNzY4LAotICAgICAxMjgwLCA3MjAsCi0gICAgIDEsICAgLyogMTI4MHg3MjAsIG5vIHNwZWNpYWwgbW9kZXMgb3RoZXJ3aXNlICovCi0gICAgIHsyMXwweGMwLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSAgIHsgMHgzNGE5LCAxLAotICAgICB7IDB4ZDA0MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIkFFNzAwVSAoSERNSSkiLCAiIiwgIiIsICIiLCAiIiB9LAotICAgICAiUGFuYXNvbmljIEFFNzAwVSIsCi0gICAgIDEzNjAsIDc2OCwKLSAgICAgMTI4MCwgNzIwLAotICAgICA2LCAgIC8qIDEyODB4NzIwLzYwLCAxMjgweDcyMC81MCwgMTI4MHg3NjhANTYoZGlnaXRhbC9hbmFsb2cpLCA3MjB4NDgwLCA3MjB4NTc2ICovCi0gICAgIHsyMXwweGMwLDIzfDB4YzAsMjJ8MHg4MCwxM3wweDQwLDI0fDB4ODAsMjV8MHg4MCwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSAgIHsgMHgwMDAwIH0KLX07Cit2b2lkCQlTaVNfU2V0RW5hYmxlRHN0bihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IGVuYWJsZSk7Cit2b2lkCQlTaVNfU2V0RW5hYmxlRnN0bihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IGVuYWJsZSk7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0TW9kZUZsYWcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7CitCT09MRUFOCQlTaVNEZXRlcm1pbmVST01MYXlvdXQ2NjEoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworI2lmbmRlZiBTSVNfTElOVVhfS0VSTkVMCit2b2lkCQlTaVNfR2V0VkJUeXBlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKICNlbmRpZgogCi0jaWZkZWYgTElOVVhfWEY4NgotVVNIT1JUICBTaVNfR2V0TW9kZUlEKGludCBWR0FFbmdpbmUsIFVMT05HIFZCRmxhZ3MsIGludCBIRGlzcGxheSwgaW50IFZEaXNwbGF5LAotCQkJICBpbnQgRGVwdGgsIEJPT0xFQU4gRlNUTiwgaW50IExDRHdpdGgsIGludCBMQ0RoZWlnaHQpOworQk9PTEVBTgkJU2lTX1NlYXJjaE1vZGVJRChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgKk1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCAqTW9kZUlkSW5kZXgpOwordW5zaWduZWQgc2hvcnQJU2lTX0dldE1vZGVQdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7Cit1bnNpZ25lZCBzaG9ydCAgU2lTX0dldFJlZkNSVFZDTEsoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IEluZGV4LCBpbnQgVXNlV2lkZSk7Cit1bnNpZ25lZCBzaG9ydCAgU2lTX0dldFJlZkNSVDFDUlRDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBJbmRleCwgaW50IFVzZVdpZGUpOwordW5zaWduZWQgc2hvcnQJU2lTX0dldENvbG9yRGVwdGgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0T2Zmc2V0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUlJUSSk7CisjaWZkZWYgU0lTMzAwCit2b2lkCQlTaVNfR2V0RklGT1RocmVzaG9sZEluZGV4MzAwKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCAqaWR4MSwKKwkJCQl1bnNpZ25lZCBzaG9ydCAqaWR4Mik7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0RklGT1RocmVzaG9sZEIzMDAodW5zaWduZWQgc2hvcnQgaWR4MSwgdW5zaWduZWQgc2hvcnQgaWR4Mik7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0TGF0ZW5jeUZhY3RvcjYzMChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgaW5kZXgpOwogI2VuZGlmCi1VU0hPUlQgIFNpU19HZXRNb2RlSURfTENEKGludCBWR0FFbmdpbmUsIFVMT05HIFZCRmxhZ3MsIGludCBIRGlzcGxheSwgaW50IFZEaXNwbGF5LCBpbnQgRGVwdGgsIEJPT0xFQU4gRlNUTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUIEN1c3RvbVQsIGludCBMQ0R3aXRoLCBpbnQgTENEaGVpZ2h0KTsKLVVTSE9SVCAgU2lTX0dldE1vZGVJRF9UVihpbnQgVkdBRW5naW5lLCBVTE9ORyBWQkZsYWdzLCBpbnQgSERpc3BsYXksIGludCBWRGlzcGxheSwgaW50IERlcHRoKTsKLVVTSE9SVCAgU2lTX0dldE1vZGVJRF9WR0EyKGludCBWR0FFbmdpbmUsIFVMT05HIFZCRmxhZ3MsIGludCBIRGlzcGxheSwgaW50IFZEaXNwbGF5LCBpbnQgRGVwdGgpOwotCi12b2lkIAlTaVNfU2V0UmVnKFNJU0lPQUREUkVTUyBwb3J0LCBVU0hPUlQgaW5kZXgsIFVTSE9SVCBkYXRhKTsKLXZvaWQgCVNpU19TZXRSZWdCeXRlKFNJU0lPQUREUkVTUyBwb3J0LCBVU0hPUlQgZGF0YSk7Ci12b2lkICAJU2lTX1NldFJlZ1Nob3J0KFNJU0lPQUREUkVTUyBwb3J0LCBVU0hPUlQgZGF0YSk7Ci12b2lkCVNpU19TZXRSZWdMb25nKFNJU0lPQUREUkVTUyBwb3J0LCBVTE9ORyBkYXRhKTsKLVVDSEFSCVNpU19HZXRSZWcoU0lTSU9BRERSRVNTIHBvcnQsIFVTSE9SVCBpbmRleCk7Ci1VQ0hBUiAJU2lTX0dldFJlZ0J5dGUoU0lTSU9BRERSRVNTIHBvcnQpOwotVVNIT1JUCVNpU19HZXRSZWdTaG9ydChTSVNJT0FERFJFU1MgcG9ydCk7Ci1VTE9ORwlTaVNfR2V0UmVnTG9uZyhTSVNJT0FERFJFU1MgcG9ydCk7Ci12b2lkCVNpU19TZXRSZWdBTkRPUihTSVNJT0FERFJFU1MgUG9ydCwgVVNIT1JUIEluZGV4LCBVU0hPUlQgRGF0YUFORCwgVVNIT1JUIERhdGFPUik7Ci12b2lkIAlTaVNfU2V0UmVnQU5EKFNJU0lPQUREUkVTUyBQb3J0LFVTSE9SVCBJbmRleCwgVVNIT1JUIERhdGFBTkQpOwotdm9pZAlTaVNfU2V0UmVnT1IoU0lTSU9BRERSRVNTIFBvcnQsVVNIT1JUIEluZGV4LCBVU0hPUlQgRGF0YU9SKTsKLXZvaWQJU2lTX0Rpc3BsYXlPbihTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLXZvaWQJU2lTX0Rpc3BsYXlPZmYoU2lTX1ByaXZhdGUgKlNpU19Qcik7Ci12b2lkCVNpU1JlZ0luaXQoU2lTX1ByaXZhdGUgKlNpU19QciwgU0lTSU9BRERSRVNTIEJhc2VBZGRyKTsKLUJPT0xFQU4gU2lTRGV0ZXJtaW5lUk9NTGF5b3V0NjYxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotdm9pZAlTaVNfU2V0RW5hYmxlRHN0bihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgZW5hYmxlKTsKLXZvaWQJU2lTX1NldEVuYWJsZUZzdG4oU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IGVuYWJsZSk7Ci1CT09MRUFOCVNpU19TZWFyY2hNb2RlSUQoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUICpNb2RlTm8sIFVTSE9SVCAqTW9kZUlkSW5kZXgpOwotVUNIQVIJU2lTX0dldE1vZGVQdHIoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4KTsKLVVTSE9SVAlTaVNfR2V0Q29sb3JEZXB0aChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgpOwotVVNIT1JUCVNpU19HZXRPZmZzZXQoU2lTX1ByaXZhdGUgKlNpU19QcixVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotdm9pZAlTaVNfTG9hZERBQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgpOwotdm9pZAlTaVNfQ2FsY0xDREFDUlQxVGltaW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCk7Ci0KLSNpZmRlZiBMSU5VWF9YRjg2Ci1CT09MRUFOCVNpU1NldE1vZGUoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyxTY3JuSW5mb1B0ciBwU2NybixVU0hPUlQgTW9kZU5vLCBCT09MRUFOIGRvc2V0cGl0Y2gpOwotQk9PTEVBTglTaVNCSU9TU2V0TW9kZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBTY3JuSW5mb1B0ciBwU2NybiwKLSAgICAgICAgICAgICAgIERpc3BsYXlNb2RlUHRyIG1vZGUsIEJPT0xFQU4gSXNDdXN0b20pOwotQk9PTEVBTglTaVNCSU9TU2V0TW9kZUNSVDIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywgU2NybkluZm9QdHIgcFNjcm4sCi0gICAgICAgICAgICAgICBEaXNwbGF5TW9kZVB0ciBtb2RlLCBCT09MRUFOIElzQ3VzdG9tKTsKLUJPT0xFQU4JU2lTQklPU1NldE1vZGVDUlQxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sIFNjcm5JbmZvUHRyIHBTY3JuLAotICAgICAgICAgICAgICAgRGlzcGxheU1vZGVQdHIgbW9kZSwgQk9PTEVBTiBJc0N1c3RvbSk7Ci1pbnQJU2lTVHJhbnNsYXRlVG9WRVNBKFNjcm5JbmZvUHRyIHBTY3JuLCBpbnQgbW9kZW51bWJlcik7Ci1pbnQJU2lTVHJhbnNsYXRlVG9PbGRNb2RlKGludCBtb2RlbnVtYmVyKTsKLUJPT0xFQU4JU2lTX0dldFBhbmVsSUQoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPKTsKLVVTSE9SVCAJU2lTX0NoZWNrQnVpbGRDdXN0b21Nb2RlKFNjcm5JbmZvUHRyIHBTY3JuLCBEaXNwbGF5TW9kZVB0ciBtb2RlLCBpbnQgVkJGbGFncyk7Ci1EaXNwbGF5TW9kZVB0ciBTaVNCdWlsZEJ1aWx0SW5Nb2RlTGlzdChTY3JuSW5mb1B0ciBwU2NybiwgQk9PTEVBTiBpbmNsdWRlbGNkbW9kZXMsIEJPT0xFQU4gaXNmb3JkdmkpOwotaW50IAlTaVNfRmluZFBhbmVsRnJvbURCKFNJU1B0ciBwU2lTLCBVU0hPUlQgcGFuZWx2ZW5kb3IsIFVTSE9SVCBwYW5lbHByb2R1Y3QsIGludCAqbWF4eCwgaW50ICptYXh5LCBpbnQgKnByZWZ4LCBpbnQgKnByZWZ5KTsKLXZvaWQgICAgU2lTX01ha2VDbG9ja1JlZ3MoU2NybkluZm9QdHIgcFNjcm4sIGludCBjbG9jaywgVUNIQVIgKnAyYiwgVUNIQVIgKnAyYyk7Ci0jZWxzZQotQk9PTEVBTglTaVNTZXRNb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sVVNIT1JUIE1vZGVObyk7Cit2b2lkCQlTaVNfTG9hZERBQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7CisjaWZkZWYgU0lTX1hPUkdfWEY4NgorQk9PTEVBTgkJU2lTU2V0TW9kZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU2NybkluZm9QdHIgcFNjcm4sIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQlCT09MRUFOIGRvc2V0cGl0Y2gpOworQk9PTEVBTgkJU2lTQklPU1NldE1vZGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIFNjcm5JbmZvUHRyIHBTY3JuLAorCQkJCURpc3BsYXlNb2RlUHRyIG1vZGUsIEJPT0xFQU4gSXNDdXN0b20pOworQk9PTEVBTgkJU2lTQklPU1NldE1vZGVDUlQyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTY3JuSW5mb1B0ciBwU2NybiwKKwkJCQlEaXNwbGF5TW9kZVB0ciBtb2RlLCBCT09MRUFOIElzQ3VzdG9tKTsKK0JPT0xFQU4JCVNpU0JJT1NTZXRNb2RlQ1JUMShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU2NybkluZm9QdHIgcFNjcm4sCisJCQkJRGlzcGxheU1vZGVQdHIgbW9kZSwgQk9PTEVBTiBJc0N1c3RvbSk7CisjZW5kaWYKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCitCT09MRUFOCQlTaVNTZXRNb2RlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8pOworI2VuZGlmCit2b2lkCQlTaVNfQ2FsY0NSUmVnaXN0ZXJzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgZGVwdGgpOwordm9pZAkJU2lTX0NhbGNMQ0RBQ1JUMVRpbWluZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKKyNpZmRlZiBTSVNfWE9SR19YRjg2Cit2b2lkCQlTaVNfR2VuZXJpY19Db252ZXJ0Q1JEYXRhKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBjaGFyICpjcmRhdGEsIGludCB4cmVzLAorCQkJCWludCB5cmVzLCBEaXNwbGF5TW9kZVB0ciBjdXJyZW50KTsKKyNlbmRpZgorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKK3ZvaWQJCVNpU19HZW5lcmljX0NvbnZlcnRDUkRhdGEoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGNoYXIgKmNyZGF0YSwgaW50IHhyZXMsCisJCQkJaW50IHlyZXMsIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBCT09MRUFOIHdyaXRlcmVzKTsKICNlbmRpZgogCi0jaWZkZWYgTElOVVhfS0VSTkVMCi1pbnQgICAgCXNpc2ZiX21vZGVfcmF0ZV90b19kY2xvY2soU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLQkJCSAgICAgIFVDSEFSIG1vZGVubywgVUNIQVIgcmF0ZWluZGV4KTsKLWludCAgICAJc2lzZmJfbW9kZV9yYXRlX3RvX2RkYXRhKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0JCQlVQ0hBUiBtb2Rlbm8sIFVDSEFSIHJhdGVpbmRleCwKLQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKTsKLUJPT0xFQU4gc2lzZmJfZ2V0dG90YWxmcm9tbW9kZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotCQkgICAgICAgCVVDSEFSIG1vZGVubywgaW50ICpodG90YWwsIGludCAqdnRvdGFsLCBVQ0hBUiByYXRlaW5kZXgpOworLyogRnJvbSBpbml0MzAxLmM6ICovCitleHRlcm4gdm9pZAkJU2lTX0dldFZCSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBpbnQgY2hrY3J0Mm1vZGUpOworZXh0ZXJuIHZvaWQJCVNpU19HZXRMQ0RSZXNJbmZvKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCQkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRZUGJQcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitleHRlcm4gdm9pZAkJU2lTX1NldFRWTW9kZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKK2V4dGVybiB2b2lkCQlTaVNfVW5Mb2NrQ1JUMihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitleHRlcm4gdm9pZAkJU2lTX0Rpc2FibGVCcmlkZ2Uoc3RydWN0IFNpU19Qcml2YXRlICopOworZXh0ZXJuIEJPT0xFQU4JCVNpU19TZXRDUlQyR3JvdXAoc3RydWN0IFNpU19Qcml2YXRlICosIHVuc2lnbmVkIHNob3J0KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0UmF0ZVB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKK2V4dGVybiB2b2lkCQlTaVNfV2FpdFJldHJhY2UxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0UmVzSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0Q0g3MDB4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCB0ZW1wYXgpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19HZXRWQ0xLMlB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSUlRJKTsKK2V4dGVybiBCT09MRUFOCQlTaVNfSXNWQU1vZGUoc3RydWN0IFNpU19Qcml2YXRlICopOworZXh0ZXJuIEJPT0xFQU4JCVNpU19Jc0R1YWxFZGdlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqKTsKKworI2lmZGVmIFNJU19YT1JHX1hGODYKKy8qIEZyb20gb3RoZXIgbW9kdWxlczogKi8KK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfQ2hlY2tCdWlsZEN1c3RvbU1vZGUoU2NybkluZm9QdHIgcFNjcm4sIERpc3BsYXlNb2RlUHRyIG1vZGUsCisJCQkJdW5zaWduZWQgaW50IFZCRmxhZ3MpOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIJU2lTX0dldFNldEJJT1NTY3JhdGNoKFNjcm5JbmZvUHRyIHBTY3JuLCB1bnNpZ25lZCBzaG9ydCBvZmZzZXQsCisJCQkJdW5zaWduZWQgY2hhciB2YWx1ZSk7CitleHRlcm4gdW5zaWduZWQgY2hhcglTaVNfR2V0U2V0TW9kZUlEKFNjcm5JbmZvUHRyIHBTY3JuLCB1bnNpZ25lZCBjaGFyIGlkKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCAJU2lTX0dldE1vZGVOdW1iZXIoU2NybkluZm9QdHIgcFNjcm4sIERpc3BsYXlNb2RlUHRyIG1vZGUsCisJCQkJdW5zaWduZWQgaW50IFZCRmxhZ3MpOwogI2VuZGlmCiAKLS8qIGluaXQzMDEuYzogKi8KLWV4dGVybiB2b2lkICAgICBTaVNfR2V0VkJJbmZvKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLQkJCSAgICAgICAJUFNJU19IV19JTkZPIEh3SW5mbywgaW50IGNoa2NydDJtb2RlKTsKLWV4dGVybiB2b2lkICAgICBTaVNfR2V0TENEUmVzSW5mbyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0JCQkgICAgICAgCVBTSVNfSFdfSU5GTyBId0luZm8pOwotZXh0ZXJuIHZvaWQgICAgIFNpU19TZXRZUGJQcihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLWV4dGVybiB2b2lkIAlTaVNfU2V0VFZNb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwgUFNJU19IV19JTkZPIEh3SW5mbyk7Ci1leHRlcm4gdm9pZCAgICAgU2lTX1VuTG9ja0NSVDIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyk7Ci1leHRlcm4gdm9pZCAgICAgU2lTX0Rpc2FibGVCcmlkZ2UoU2lTX1ByaXZhdGUgKiwgUFNJU19IV19JTkZPKTsKLWV4dGVybiBCT09MRUFOICBTaVNfU2V0Q1JUMkdyb3VwKFNpU19Qcml2YXRlICosIFBTSVNfSFdfSU5GTywgVVNIT1JUKTsKLWV4dGVybiBVU0hPUlQgICBTaVNfR2V0UmF0ZVB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVBTSVNfSFdfSU5GTyBId0luZm8pOwotZXh0ZXJuIHZvaWQgICAgIFNpU19XYWl0UmV0cmFjZTEoU2lTX1ByaXZhdGUgKlNpU19Qcik7Ci1leHRlcm4gVVNIT1JUICAgU2lTX0dldFJlc0luZm8oU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4KTsKLWV4dGVybiBVU0hPUlQgICBTaVNfR2V0Q0g3MDB4KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB0ZW1wYXgpOwotZXh0ZXJuIFVTSE9SVCAgIFNpU19HZXRWQ0xLMlB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotZXh0ZXJuIEJPT0xFQU4gIFNpU19Jc1ZBTW9kZShTaVNfUHJpdmF0ZSAqLCBQU0lTX0hXX0lORk8pOwotZXh0ZXJuIEJPT0xFQU4gIFNpU19Jc0R1YWxFZGdlKFNpU19Qcml2YXRlICosIFBTSVNfSFdfSU5GTyk7Ci0KLSNpZmRlZiBMSU5VWF9YRjg2Ci0vKiBGcm9tIG90aGVyIHNpcyBkcml2ZXIgbW9kdWxlczogKi8KLWV4dGVybiBpbnQgICAgICBTaVNfY29tcHV0ZV92Y2xrKGludCBDbG9jaywgaW50ICpvdXRfbiwgaW50ICpvdXRfZG4sIGludCAqb3V0X2RpdiwKLQkgICAgIAkgCSAJaW50ICpvdXRfc2JpdCwgaW50ICpvdXRfc2NhbGUpOwotZXh0ZXJuIHZvaWQgCVNpU0NhbGNDbG9jayhTY3JuSW5mb1B0ciBwU2NybiwgaW50IGNsb2NrLCBpbnQgbWF4X1ZMRCwgdW5zaWduZWQgaW50ICp2Y2xrKTsKLQotZXh0ZXJuIFVDSEFSICAgCVNpU19HZXRTZXRCSU9TU2NyYXRjaChTY3JuSW5mb1B0ciBwU2NybiwgVVNIT1JUIG9mZnNldCwgVUNIQVIgdmFsdWUpOwotZXh0ZXJuIFVDSEFSICAgCVNpU19HZXRTZXRNb2RlSUQoU2NybkluZm9QdHIgcFNjcm4sIFVDSEFSIGlkKTsKLWV4dGVybiBVU0hPUlQgCVNpU19HZXRNb2RlTnVtYmVyKFNjcm5JbmZvUHRyIHBTY3JuLCBEaXNwbGF5TW9kZVB0ciBtb2RlLCBVTE9ORyBWQkZsYWdzKTsKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisjaWZkZWYgU0lTMzAwCitleHRlcm4gdW5zaWduZWQgaW50CXNpc2ZiX3JlYWRfbmJyaWRnZV9wY2lfZHdvcmQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcpOworZXh0ZXJuIHZvaWQJCXNpc2ZiX3dyaXRlX25icmlkZ2VfcGNpX2R3b3JkKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgcmVnLAorCQkJCXVuc2lnbmVkIGludCB2YWwpOworI2VuZGlmCisjaWZkZWYgU0lTMzE1SAorZXh0ZXJuIHZvaWQJCXNpc2ZiX3dyaXRlX25icmlkZ2VfcGNpX2J5dGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcsCisJCQkJdW5zaWduZWQgY2hhciB2YWwpOworZXh0ZXJuIHVuc2lnbmVkIGludAlzaXNmYl9yZWFkX21pb19wY2lfd29yZChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IHJlZyk7CisjZW5kaWYKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQzMDEuYyBiL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQzMDEuYwppbmRleCAyNzRkYWNkLi4yZDg4ZjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0MzAxLmMKKysrIGIvZHJpdmVycy92aWRlby9zaXMvaW5pdDMwMS5jCkBAIC0yLDExICsyLDEyIEBACiAvKiAkWGRvdE9yZyQgKi8KIC8qCiAgKiBNb2RlIGluaXRpYWxpemluZyBjb2RlIChDUlQyIHNlY3Rpb24pCi0gKiBmb3IgU2lTIDMwMC8zMDUvNTQwLzYzMC83MzAgYW5kCi0gKiAgICAgU2lTIDMxNS81NTAvNjUwL002NTAvNjUxLzY2MUZYL002NjF4WC83NDAvNzQxKEdYKS9NNzQxLzMzMC82NjAvTTY2MC83NjAvTTc2MAotICogKFVuaXZlcnNhbCBtb2R1bGUgZm9yIExpbnV4IGtlcm5lbCBmcmFtZWJ1ZmZlciBhbmQgWEZyZWU4Ni9YLm9yZyA0LngpCisgKiBmb3IgU2lTIDMwMC8zMDUvNTQwLzYzMC83MzAsCisgKiAgICAgU2lTIDMxNS81NTAvW01dNjUwLzY1MS9bTV02NjFbRkdNXVgvW01dNzR4W0dYXS8zMzAvW01dNzZ4W0dYXSwKKyAqICAgICBYR0kgVjNYVC9WNS9WOCwgWjcKKyAqIChVbml2ZXJzYWwgbW9kdWxlIGZvciBMaW51eCBrZXJuZWwgZnJhbWVidWZmZXIgYW5kIFgub3JnL1hGcmVlODYgNC54KQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCiAgKgogICogSWYgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgdGVybXMKICAqIGFwcGx5OgpAQCAtMzgsNyArMzksNyBAQAogICogKiAzKSBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICAqICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAgKiAqCi0gKiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IKKyAqICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICAqICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogICogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgogICogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCkBAIC01NCwyMCArNTUsMjAgQEAKICAqIEZvcm1lcmx5IGJhc2VkIG9uIG5vbi1mdW5jdGlvbmFsIGNvZGUtZnJhZ2VtZW50cyBmb3IgMzAwIHNlcmllcyBieSBTaVMsIEluYy4KICAqIFVzZWQgYnkgcGVybWlzc2lvbi4KICAqCi0gKiBUVyBzYXlzOiBUaGlzIGNvZGUgbG9va3MgYXdmdWwsIEkga25vdy4gQnV0IHBsZWFzZSBkb24ndCBkbyBhbnl0aGluZyBhYm91dAotICogdGhpcyBvdGhlcndpc2UgZGVidWdnaW5nIHdpbGwgYmUgaGVsbC4KLSAqIFRoZSBjb2RlIGlzIGV4dHJlbWVseSBmcmFnaWxlIGFzIHJlZ2FyZHMgdGhlIGRpZmZlcmVudCBjaGlwc2V0cywgZGlmZmVyZW50Ci0gKiB2aWRlbyBicmlkZ2VzIGFuZCBjb21iaW5hdGlvbnMgdGhlcmVvZi4gSWYgYW55dGhpbmcgaXMgY2hhbmdlZCwgZXh0cmVtZQotICogY2FyZSBoYXMgdG8gYmUgdGFrZW4gdGhhdCB0aGF0IGNoYW5nZSBkb2Vzbid0IGJyZWFrIGl0IGZvciBvdGhlciBjaGlwc2V0cywKLSAqIGJyaWRnZXMgb3IgY29tYmluYXRpb25zIHRoZXJlb2YuCi0gKiBBbGwgY29tbWVudHMgaW4gdGhpcyBmaWxlIGFyZSBieSBtZSwgcmVnYXJkbGVzcyBpZiBtYXJrZWQgVFcgb3Igbm90LgotICoKICAqLwogCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKICNpZiAxCiAjZGVmaW5lIFNFVF9FTUkJCS8qIDMwMkxWL0VMVjogU2V0IEVNSSB2YWx1ZXMgKi8KICNlbmRpZgogCisjaWYgMQorI2RlZmluZSBTRVRfUFdECQkvKiAzMDEvMzAyTFY6IFNldCBQV0QgKi8KKyNlbmRpZgorCiAjZGVmaW5lIENPTVBBTF9IQUNLCS8qIE5lZWRlZCBmb3IgQ29tcGFsIDE0MDB4MTA1MCAoRU1JKSAqLwogI2RlZmluZSBDT01QQVFfSEFDSwkvKiBOZWVkZWQgZm9yIEludmVudGVjL0NvbXBhcSAxMjgweDEwMjQgKEVNSSkgKi8KICNkZWZpbmUgQVNVU19IQUNLCS8qIE5lZWRlZCBmb3IgQXN1cyBBMkggMTAyNHg3NjggKEVNSSkgKi8KQEAgLTg1LDI2ICs4NiwzNSBAQAogI2RlZmluZSBTaVNfSTJDREVMQVkgICAgICAxMDAwCiAjZGVmaW5lIFNpU19JMkNERUxBWVNIT1JUICAxNTAKIAotc3RhdGljIFVTSE9SVCBTaVNfR2V0QklPU0xDRFJlc0luZm8oU2lTX1ByaXZhdGUgKlNpU19Qcik7Ci1zdGF0aWMgdm9pZCBTaVNfU2V0Q0g3MHh4KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB0ZW1wYngpOworc3RhdGljIHVuc2lnbmVkIHNob3J0CVNpU19HZXRCSU9TTENEUmVzSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorc3RhdGljIHZvaWQJCVNpU19TZXRDSDcweHgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgY2hhciB2YWwpOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgIEhFTFBFUjogTG9jay9VbmxvY2sgQ1JUMiAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotU2lTX1VuTG9ja0NSVDIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19VbkxvY2tDUlQyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpCisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFhHSV8yMCkKKyAgICAgIHJldHVybjsKKyAgIGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkKICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZiwweDAxKTsKICAgIGVsc2UKICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyNCwweDAxKTsKIH0KIAotc3RhdGljIHZvaWQKLVNpU19Mb2NrQ1JUMihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKK3N0YXRpYworI2VuZGlmCit2b2lkCitTaVNfTG9ja0NSVDIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gWEdJXzIwKQorICAgICAgcmV0dXJuOworICAgZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKQogICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRiwweEZFKTsKICAgIGVsc2UKICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MjQsMHhGRSk7CkBAIC0xMTUsOSArMTI1LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0UmVnU1IxMUFORE9SKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sIFVTSE9SVCBEYXRhQU5ELCBVU0hPUlQgRGF0YU9SKQorU2lTX1NldFJlZ1NSMTFBTkRPUihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgRGF0YUFORCwgdW5zaWduZWQgc2hvcnQgRGF0YU9SKQogewotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgeworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7CiAgICAgICBEYXRhQU5EICY9IDB4MGY7CiAgICAgICBEYXRhT1IgICY9IDB4MGY7CiAgICB9CkBAIC0xMjksMTIgKzEzOSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIFNJUzMxNUgKLXN0YXRpYyBVQ0hBUiAqCi1HZXRMQ0RTdHJ1Y3RQdHI2NjEoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK0dldExDRFN0cnVjdFB0cjY2MShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgIFVDSEFSICAqbXlwdHIgPSBOVUxMOwotICAgVVNIT1JUIHJvbWluZGV4ID0gMCwgcmVnID0gMCwgaWR4ID0gMDsKKyAgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIGNoYXIgICpteXB0ciA9IE5VTEw7CisgICB1bnNpZ25lZCBzaG9ydCByb21pbmRleCA9IDAsIHJlZyA9IDAsIGlkeCA9IDA7CiAKICAgIC8qIFVzZSB0aGUgQklPUyB0YWJsZXMgb25seSBmb3IgTFZEUyBwYW5lbHM7IFRNRFMgaXMgdW5yZWxpYWJsZQogICAgICogZHVlIHRvIHRoZSB2YXJpYXR5IG9mIHBhbmVscyB0aGUgQklPUyBkb2Vzbid0IGtub3cgYWJvdXQuCkBAIC0xNDQsMTUgKzE1NCwxNSBAQAogICAgICovCiAKICAgIGlmKChTaVNfUHItPlNpU19ST01OZXcpICYmCi0gICAgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHx8ICghU2lTX1ByLT5QYW5lbFNlbGZEZXRlY3RlZCkpKSB7CisgICAgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHx8ICghU2lTX1ByLT5QYW5lbFNlbGZEZXRlY3RlZCkpKSB7CiAKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzY2MSkgcmVnID0gMHgzYzsKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gMHg3ZDsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfNjYxKSByZWcgPSAweDNjOworICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDB4N2Q7CiAKICAgICAgIGlkeCA9IChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQscmVnKSAmIDB4MWYpICogMjY7CiAKICAgICAgIGlmKGlkeCA8ICg4KjI2KSkgewotICAgICAgICAgbXlwdHIgPSAoVUNIQVIgKikmU2lTX0xDRFN0cnVjdDY2MVtpZHhdOworICAgICAgICAgbXlwdHIgPSAodW5zaWduZWQgY2hhciAqKSZTaVNfTENEU3RydWN0NjYxW2lkeF07CiAgICAgICB9CiAgICAgICByb21pbmRleCA9IFNJU0dFVFJPTVcoMHgxMDApOwogICAgICAgaWYocm9taW5kZXgpIHsKQEAgLTE2MywxMSArMTczLDExIEBACiAgICByZXR1cm4gbXlwdHI7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLUdldExDRFN0cnVjdFB0cjY2MV8yKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK0dldExDRFN0cnVjdFB0cjY2MV8yKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICAgVVNIT1JUIHJvbXB0ciA9IDA7CisgICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgICB1bnNpZ25lZCBzaG9ydCByb21wdHIgPSAwOwogCiAgICAvKiBVc2UgdGhlIEJJT1MgdGFibGVzIG9ubHkgZm9yIExWRFMgcGFuZWxzOyBUTURTIGlzIHVucmVsaWFibGUKICAgICAqIGR1ZSB0byB0aGUgdmFyaWF0eSBvZiBwYW5lbHMgdGhlIEJJT1MgZG9lc24ndCBrbm93IGFib3V0LgpAQCAtMTc3LDEyICsxODcsMTIgQEAKICAgICAqLwogCiAgICBpZigoU2lTX1ByLT5TaVNfUk9NTmV3KSAmJgotICAgICAgKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFMVjMwMkxWKSB8fCAoIVNpU19Qci0+UGFuZWxTZWxmRGV0ZWN0ZWQpKSkgeworICAgICAgKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSB8fCAoIVNpU19Qci0+UGFuZWxTZWxmRGV0ZWN0ZWQpKSkgewogICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDEwMik7CiAgICAgICByb21wdHIgKz0gKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgPj4gNCkgKiBTaVNfUHItPlNpUzY2MUxDRDJUYWJsZVNpemUpOwogICAgfQogCi0gICByZXR1cm4ocm9tcHRyKTsKKyAgIHJldHVybiByb21wdHI7CiB9CiAjZW5kaWYKIApAQCAtMTkxLDE4NiArMjAxLDE4NyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIEJPT0xFQU4KLVNpU19BZGp1c3RDUlQyUmF0ZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgVVNIT1JUIFJSVEksIFVTSE9SVCAqaSwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19BZGp1c3RDUlQyUmF0ZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUlJUSSwgdW5zaWduZWQgc2hvcnQgKmkpCiB7Ci0gIFVTSE9SVCBjaGVja21hc2s9MCxtb2RlaWQsaW5mb2ZsYWc7CisgICB1bnNpZ25lZCBzaG9ydCBjaGVja21hc2s9MCwgbW9kZWlkLCBpbmZvZmxhZzsKIAotICBtb2RlaWQgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgKCppKV0uTW9kZUlEOworICAgbW9kZWlkID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSSArICgqaSldLk1vZGVJRDsKIAotICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgeworICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAotICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9SQU1EQUMpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1JBTURBQykgewogCi0gICAgICAJY2hlY2ttYXNrIHw9IFN1cHBvcnRSQU1EQUMyOwotCWlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0JICAgY2hlY2ttYXNrIHw9IFN1cHBvcnRSQU1EQUMyXzEzNTsKLQkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLQkgICAgICBjaGVja21hc2sgfD0gU3VwcG9ydFJBTURBQzJfMTYyOwotCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUMpIHsKLQkJIGNoZWNrbWFzayB8PSBTdXBwb3J0UkFNREFDMl8yMDI7Ci0JICAgICAgfQotCSAgIH0KLQl9CisJIGNoZWNrbWFzayB8PSBTdXBwb3J0UkFNREFDMjsKKwkgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworCSAgICBjaGVja21hc2sgfD0gU3VwcG9ydFJBTURBQzJfMTM1OworCSAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKwkgICAgICAgY2hlY2ttYXNrIHw9IFN1cHBvcnRSQU1EQUMyXzE2MjsKKwkgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTUkFNREFDMjAyKSB7CisJCSAgY2hlY2ttYXNrIHw9IFN1cHBvcnRSQU1EQUMyXzIwMjsKKwkgICAgICAgfQorCSAgICB9CisJIH0KIAotICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7CisgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7CiAKLSAgICAgCWNoZWNrbWFzayB8PSBTdXBwb3J0TENEOwotCWlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0JICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLQkgICAgICBpZigoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpICYmIChTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkgewotCSAgICAgICAgIGlmKG1vZGVpZCA9PSAweDJlKSBjaGVja21hc2sgfD0gU3VwcG9ydDY0MDQ4MDYwSHo7Ci0JICAgICAgfQotCSAgIH0KLQl9CisJIGNoZWNrbWFzayB8PSBTdXBwb3J0TENEOworCSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CisJICAgICAgIGlmKChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgJiYgKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSB7CisJICAgICAgICAgIGlmKG1vZGVpZCA9PSAweDJlKSBjaGVja21hc2sgfD0gU3VwcG9ydDY0MDQ4MDYwSHo7CisJICAgICAgIH0KKwkgICAgfQorCSB9CiAKLSAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB7CisgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKIAotICAgICAgCWNoZWNrbWFzayB8PSBTdXBwb3J0SGlWaXNpb247CisJIGNoZWNrbWFzayB8PSBTdXBwb3J0SGlWaXNpb247CiAKLSAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9ZUGJQcjUyNTc1MHxTZXRDUlQyVG9BVklERU98U2V0Q1JUMlRvU1ZJREVPfFNldENSVDJUb1NDQVJUKSkgeworICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9ZUGJQcjUyNTc1MHxTZXRDUlQyVG9BVklERU98U2V0Q1JUMlRvU1ZJREVPfFNldENSVDJUb1NDQVJUKSkgewogCi0gICAgICAgIGNoZWNrbWFzayB8PSBTdXBwb3J0VFY7Ci0JaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0JICAgY2hlY2ttYXNrIHw9IFN1cHBvcnRUVjEwMjQ7Ci0JICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHsKLQkgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgewotCSAgICAgICAgIGNoZWNrbWFzayB8PSBTdXBwb3J0WVBiUHI3NTBwOwotCSAgICAgIH0KLQkgICB9Ci0JfQorCSBjaGVja21hc2sgfD0gU3VwcG9ydFRWOworCSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKwkgICAgY2hlY2ttYXNrIHw9IFN1cHBvcnRUVjEwMjQ7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1lQYlByNTI1NzUwKSB7CisJICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI3NTBwKSB7CisJICAgICAgICAgIGNoZWNrbWFzayB8PSBTdXBwb3J0WVBiUHI3NTBwOworCSAgICAgICB9CisJICAgIH0KKwkgfQogCi0gICAgIH0KKyAgICAgIH0KIAotICB9IGVsc2UgewkvKiBMVkRTICovCisgICB9IGVsc2UgewkvKiBMVkRTICovCiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7Ci0gICAgIAlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgewotICAgICAgICAgICBjaGVja21hc2sgfD0gU3VwcG9ydENIVFY7Ci0gICAgICAJfQotICAgICB9CisgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKKwkgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKKwkgICAgY2hlY2ttYXNrIHw9IFN1cHBvcnRDSFRWOworCSB9CisgICAgICB9CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7Ci0gICAgIAljaGVja21hc2sgfD0gU3VwcG9ydExDRDsKLSAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CisJIGNoZWNrbWFzayB8PSBTdXBwb3J0TENEOworICAgICAgfQogCi0gIH0KKyAgIH0KIAotICAvKiBMb29rIGJhY2t3YXJkcyBpbiB0YWJsZSBmb3IgbWF0Y2hpbmcgQ1JUMiBtb2RlICovCi0gIGZvcig7IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEkgKyAoKmkpXS5Nb2RlSUQgPT0gbW9kZWlkOyAoKmkpLS0pIHsKLSAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgKCppKV0uRXh0X0luZm9GbGFnOwotICAgICBpZihpbmZvZmxhZyAmIGNoZWNrbWFzaykgcmV0dXJuIFRSVUU7Ci0gICAgIGlmKCgqaSkgPT0gMCkgYnJlYWs7Ci0gIH0KKyAgIC8qIExvb2sgYmFja3dhcmRzIGluIHRhYmxlIGZvciBtYXRjaGluZyBDUlQyIG1vZGUgKi8KKyAgIGZvcig7IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEkgKyAoKmkpXS5Nb2RlSUQgPT0gbW9kZWlkOyAoKmkpLS0pIHsKKyAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSSArICgqaSldLkV4dF9JbmZvRmxhZzsKKyAgICAgIGlmKGluZm9mbGFnICYgY2hlY2ttYXNrKSByZXR1cm4gVFJVRTsKKyAgICAgIGlmKCgqaSkgPT0gMCkgYnJlYWs7CisgICB9CiAKLSAgLyogTG9vayB0aHJvdWdoIHRoZSB3aG9sZSBtb2RlLXNlY3Rpb24gb2YgdGhlIHRhYmxlIGZyb20gdGhlIGJlZ2lubmluZwotICAgKiBmb3IgYSBtYXRjaGluZyBDUlQyIG1vZGUgaWYgbm8gbW9kZSB3YXMgZm91bmQgeWV0LgotICAgKi8KLSAgZm9yKCgqaSkgPSAwOyA7ICgqaSkrKykgewotICAgICBpZihTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgKCppKV0uTW9kZUlEICE9IG1vZGVpZCkgYnJlYWs7Ci0gICAgIGluZm9mbGFnID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSSArICgqaSldLkV4dF9JbmZvRmxhZzsKLSAgICAgaWYoaW5mb2ZsYWcgJiBjaGVja21hc2spIHJldHVybiBUUlVFOwotICB9Ci0gIHJldHVybiBGQUxTRTsKKyAgIC8qIExvb2sgdGhyb3VnaCB0aGUgd2hvbGUgbW9kZS1zZWN0aW9uIG9mIHRoZSB0YWJsZSBmcm9tIHRoZSBiZWdpbm5pbmcKKyAgICAqIGZvciBhIG1hdGNoaW5nIENSVDIgbW9kZSBpZiBubyBtb2RlIHdhcyBmb3VuZCB5ZXQuCisgICAgKi8KKyAgIGZvcigoKmkpID0gMDsgOyAoKmkpKyspIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEkgKyAoKmkpXS5Nb2RlSUQgIT0gbW9kZWlkKSBicmVhazsKKyAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSSArICgqaSldLkV4dF9JbmZvRmxhZzsKKyAgICAgIGlmKGluZm9mbGFnICYgY2hlY2ttYXNrKSByZXR1cm4gVFJVRTsKKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICBHZXQgcmF0ZSBpbmRleCAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1VU0hPUlQKLVNpU19HZXRSYXRlUHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgIFBTSVNfSFdfSU5GTyBId0luZm8pCit1bnNpZ25lZCBzaG9ydAorU2lTX0dldFJhdGVQdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFNIT1JUICBMQ0RSZWZyZXNoSW5kZXhbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLAotCQkJICAgICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0JCQkgICAgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLQkJCSAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwIH07Ci0gIFVTSE9SVCBSUlRJLGksYmFja3VwX2k7Ci0gIFVTSE9SVCBtb2RlZmxhZyxpbmRleCx0ZW1wLGJhY2t1cGluZGV4OworICAgdW5zaWduZWQgc2hvcnQgUlJUSSxpLGJhY2t1cF9pOworICAgdW5zaWduZWQgc2hvcnQgbW9kZWZsYWcsaW5kZXgsdGVtcCxiYWNrdXBpbmRleDsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBMQ0RSZWZyZXNoSW5kZXhbXSA9IHsKKwkJMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwKKwkJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKwkJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKwkJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKwkJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorICAgfTsKIAotICAvKiBEbyBOT1QgY2hlY2sgZm9yIFVzZUN1c3RvbU1vZGUgaGVyZSwgd2lsbCBza3JldyB1cCBGSUZPICovCi0gIGlmKE1vZGVObyA9PSAweGZlKSByZXR1cm4gMDsKKyAgIC8qIERvIE5PVCBjaGVjayBmb3IgVXNlQ3VzdG9tTW9kZSBoZXJlLCB3aWxsIHNrcmV3IHVwIEZJRk8gKi8KKyAgIGlmKE1vZGVObyA9PSAweGZlKSByZXR1cm4gMDsKIAotICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gIH0gZWxzZSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gIH0KKyAgIGlmKE1vZGVObyA8PSAweDEzKSB7CisgICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7CisgICB9IGVsc2UgeworICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKKyAgIH0KIAotICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKLSAgICAgCWlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHJldHVybiAwOwotICAgICB9Ci0gIH0KKyAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgeworICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKKwkgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgcmV0dXJuIDA7CisgICAgICB9CisgICB9CiAKLSAgaWYoTW9kZU5vIDwgMHgxNCkgcmV0dXJuIDB4RkZGRjsKKyAgIGlmKE1vZGVObyA8IDB4MTQpIHJldHVybiAweEZGRkY7CiAKLSAgaW5kZXggPSAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzMpID4+IFNpU19Qci0+U2lTX1NlbGVjdENSVDJSYXRlKSAmIDB4MEY7Ci0gIGJhY2t1cGluZGV4ID0gaW5kZXg7CisgICBpbmRleCA9IChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMykgPj4gU2lTX1ByLT5TaVNfU2VsZWN0Q1JUMlJhdGUpICYgMHgwRjsKKyAgIGJhY2t1cGluZGV4ID0gaW5kZXg7CiAKLSAgaWYoaW5kZXggPiAwKSBpbmRleC0tOworICAgaWYoaW5kZXggPiAwKSBpbmRleC0tOwogCi0gIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIpIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7Ci0JICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpCQlpbmRleCA9IDA7Ci0JICAgZWxzZSBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgaW5kZXggPSBiYWNrdXBpbmRleCA9IDA7Ci0JfQotCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgewotCSAgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpKSB7Ci0gICAgICAgICAgICAgIHRlbXAgPSBMQ0RSZWZyZXNoSW5kZXhbU2lTX0dldEJJT1NMQ0RSZXNJbmZvKFNpU19QcildOwotICAgICAgICAgICAgICBpZihpbmRleCA+IHRlbXApIGluZGV4ID0gdGVtcDsKLQkgICB9Ci0JfQotICAgICB9IGVsc2UgewotICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIGluZGV4ID0gMDsKLQlpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKLSAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIGluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICB9Ci0gIH0KKyAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CisJIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgeworCSAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkJCSBpbmRleCA9IDA7CisJICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIGluZGV4ID0gYmFja3VwaW5kZXggPSAwOworCSB9CisJIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgeworCSAgICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSkgeworCSAgICAgICB0ZW1wID0gTENEUmVmcmVzaEluZGV4W1NpU19HZXRCSU9TTENEUmVzSW5mbyhTaVNfUHIpXTsKKwkgICAgICAgaWYoaW5kZXggPiB0ZW1wKSBpbmRleCA9IHRlbXA7CisJICAgIH0KKwkgfQorICAgICAgfSBlbHNlIHsKKwkgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSBpbmRleCA9IDA7CisJIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgeworCSAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgaW5kZXggPSAwOworCSB9CisgICAgICB9CisgICB9CiAKLSAgUlJUSSA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uUkVGaW5kZXg7Ci0gIE1vZGVObyA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLk1vZGVJRDsKKyAgIFJSVEkgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlJFRmluZGV4OworICAgTW9kZU5vID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uTW9kZUlEOwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgRHJpdmVyTW9kZSkpIHsKLSAgICAgICAgaWYoIChTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9WRVNBSUQgPT0gMHgxMDUpIHx8Ci0gICAgICAgICAgICAoU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfVkVTQUlEID09IDB4MTA3KSApIHsKLSAgICAgICAgICAgaWYoYmFja3VwaW5kZXggPD0gMSkgUlJUSSsrOwotICAgICAgICB9Ci0gICAgIH0KLSAgfQorICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBEcml2ZXJNb2RlKSkgeworCSBpZiggKFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X1ZFU0FJRCA9PSAweDEwNSkgfHwKKwkgICAgIChTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9WRVNBSUQgPT0gMHgxMDcpICkgeworCSAgICBpZihiYWNrdXBpbmRleCA8PSAxKSBSUlRJKys7CisJIH0KKyAgICAgIH0KKyAgIH0KIAotICBpID0gMDsKLSAgZG8gewotICAgICBpZihTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgaV0uTW9kZUlEICE9IE1vZGVObykgYnJlYWs7Ci0gICAgIHRlbXAgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgaV0uRXh0X0luZm9GbGFnOwotICAgICB0ZW1wICY9IE1vZGVUeXBlTWFzazsKLSAgICAgaWYodGVtcCA8IFNpU19Qci0+U2lTX01vZGVUeXBlKSBicmVhazsKLSAgICAgaSsrOwotICAgICBpbmRleC0tOwotICB9IHdoaWxlKGluZGV4ICE9IDB4RkZGRik7CisgICBpID0gMDsKKyAgIGRvIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEkgKyBpXS5Nb2RlSUQgIT0gTW9kZU5vKSBicmVhazsKKyAgICAgIHRlbXAgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgaV0uRXh0X0luZm9GbGFnOworICAgICAgdGVtcCAmPSBNb2RlVHlwZU1hc2s7CisgICAgICBpZih0ZW1wIDwgU2lTX1ByLT5TaVNfTW9kZVR5cGUpIGJyZWFrOworICAgICAgaSsrOworICAgICAgaW5kZXgtLTsKKyAgIH0gd2hpbGUoaW5kZXggIT0gMHhGRkZGKTsKIAotICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1JBTURBQykpIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKLSAgICAgIAl0ZW1wID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSSArIGkgLSAxXS5FeHRfSW5mb0ZsYWc7Ci0gICAgICAJaWYodGVtcCAmIEludGVybGFjZU1vZGUpIGkrKzsKLSAgICAgfQotICB9CisgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1JBTURBQykpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7CisJIHRlbXAgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgaSAtIDFdLkV4dF9JbmZvRmxhZzsKKwkgaWYodGVtcCAmIEludGVybGFjZU1vZGUpIGkrKzsKKyAgICAgIH0KKyAgIH0KIAotICBpLS07CisgICBpLS07CiAKLSAgaWYoKFNpU19Qci0+U2lTX1NldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIpICYmICghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkpKSB7Ci0gICAgIGJhY2t1cF9pID0gaTsKLSAgICAgaWYoIShTaVNfQWRqdXN0Q1JUMlJhdGUoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSUlRJLCAmaSwgSHdJbmZvKSkpIHsKLQlpID0gYmFja3VwX2k7Ci0gICAgIH0KLSAgfQorICAgaWYoKFNpU19Qci0+U2lTX1NldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIpICYmICghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkpKSB7CisgICAgICBiYWNrdXBfaSA9IGk7CisgICAgICBpZighKFNpU19BZGp1c3RDUlQyUmF0ZShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJSVEksICZpKSkpIHsKKwkgaSA9IGJhY2t1cF9pOworICAgICAgfQorICAgfQogCi0gIHJldHVybihSUlRJICsgaSk7CisgICByZXR1cm4gKFJSVEkgKyBpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM3OCwxNSArMzg5LDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1NhdmVDUlQySW5mbyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vKQorU2lTX1NhdmVDUlQySW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICBVU0hPUlQgdGVtcDEsdGVtcDI7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wMSwgdGVtcDI7CiAKLSAgLyogU3RvcmUgQ1JUMSBNb2RlTm8gaW4gQ1IzNCAqLwotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNCxNb2RlTm8pOwotICB0ZW1wMSA9IChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgPj4gODsKLSAgdGVtcDIgPSB+KFNldEluU2xhdmVNb2RlID4+IDgpOwotICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNkNCwweDMxLHRlbXAyLHRlbXAxKTsKKyAgIC8qIFN0b3JlIENSVDEgTW9kZU5vIGluIENSMzQgKi8KKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM0LE1vZGVObyk7CisgICB0ZW1wMSA9IChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgPj4gODsKKyAgIHRlbXAyID0gfihTZXRJblNsYXZlTW9kZSA+PiA4KTsKKyAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MzEsdGVtcDIsdGVtcDEpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzk1LDM1ICs0MDYsMzUgQEAKIAogI2lmZGVmIFNJUzMwMAogc3RhdGljIEJPT0xFQU4KLVNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19DUjM2QklPU1dvcmQyM2Ioc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgVVNIT1JUIHRlbXAsdGVtcDE7CisgICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wLHRlbXAxOwogCi0gIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgewotICAgICBpZigoUk9NQWRkclsweDIzM10gPT0gMHgxMikgJiYgKFJPTUFkZHJbMHgyMzRdID09IDB4MzQpKSB7Ci0gICAgICAgIHRlbXAgPSAxIDw8ICgoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzYpID4+IDQpICYgMHgwZik7Ci0gICAgICAgIHRlbXAxID0gU0lTR0VUUk9NVygweDIzYik7Ci0gICAgICAgIGlmKHRlbXAxICYgdGVtcCkgcmV0dXJuIFRSVUU7Ci0gICAgIH0KLSAgfQotICByZXR1cm4gRkFMU0U7CisgICBpZihTaVNfUHItPlNpU19Vc2VST00pIHsKKyAgICAgIGlmKChST01BZGRyWzB4MjMzXSA9PSAweDEyKSAmJiAoUk9NQWRkclsweDIzNF0gPT0gMHgzNCkpIHsKKwkgdGVtcCA9IDEgPDwgKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgPj4gNCkgJiAweDBmKTsKKwkgdGVtcDEgPSBTSVNHRVRST01XKDB4MjNiKTsKKwkgaWYodGVtcDEgJiB0ZW1wKSByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KIAogc3RhdGljIEJPT0xFQU4KLVNpU19DUjM2QklPU1dvcmQyM2QoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19DUjM2QklPU1dvcmQyM2Qoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgVVNIT1JUIHRlbXAsdGVtcDE7CisgICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wLHRlbXAxOwogCi0gIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgewotICAgICBpZigoUk9NQWRkclsweDIzM10gPT0gMHgxMikgJiYgKFJPTUFkZHJbMHgyMzRdID09IDB4MzQpKSB7Ci0gICAgICAgIHRlbXAgPSAxIDw8ICgoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzYpID4+IDQpICYgMHgwZik7Ci0gICAgICAgIHRlbXAxID0gU0lTR0VUUk9NVygweDIzZCk7Ci0gICAgICAgIGlmKHRlbXAxICYgdGVtcCkgcmV0dXJuIFRSVUU7Ci0gICAgIH0KLSAgfQotICByZXR1cm4gRkFMU0U7CisgICBpZihTaVNfUHItPlNpU19Vc2VST00pIHsKKyAgICAgIGlmKChST01BZGRyWzB4MjMzXSA9PSAweDEyKSAmJiAoUk9NQWRkclsweDIzNF0gPT0gMHgzNCkpIHsKKwkgdGVtcCA9IDEgPDwgKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgPj4gNCkgJiAweDBmKTsKKwkgdGVtcDEgPSBTSVNHRVRST01XKDB4MjNkKTsKKwkgaWYodGVtcDEgJiB0ZW1wKSByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCkBAIC00MzIsODUgKzQ0Myw3NiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotU2lTX0REQzJEZWxheShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgZGVsYXl0aW1lKQorU2lTX0REQzJEZWxheShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgaW50IGRlbGF5dGltZSkKIHsKLSAgVVNIT1JUIGksIGo7CisgICB1bnNpZ25lZCBpbnQgaSwgajsKIAotICBmb3IoaT0wOyBpPGRlbGF5dGltZTsgaSsrKSB7Ci0gICAgIGogKz0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDUpOwotICB9CisgICBmb3IoaSA9IDA7IGkgPCBkZWxheXRpbWU7IGkrKykgeworICAgICAgaiArPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNSk7CisgICB9CiB9CiAKICNpZiBkZWZpbmVkKFNJUzMwMCkgfHwgZGVmaW5lZChTSVMzMTVIKQogc3RhdGljIHZvaWQKLVNpU19HZW5lcmljRGVsYXkoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIGRlbGF5KQorU2lTX0dlbmVyaWNEZWxheShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgZGVsYXkpCiB7Ci0gIFVTSE9SVCB0ZW1wLGZsYWc7Ci0KLSAgZmxhZyA9IFNpU19HZXRSZWdCeXRlKDB4NjEpICYgMHgxMDsKLQotICB3aGlsZShkZWxheSkgewotICAgICB0ZW1wID0gU2lTX0dldFJlZ0J5dGUoMHg2MSkgJiAweDEwOwotICAgICBpZih0ZW1wID09IGZsYWcpIGNvbnRpbnVlOwotICAgICBmbGFnID0gdGVtcDsKLSAgICAgZGVsYXktLTsKLSAgfQorICAgU2lTX0REQzJEZWxheShTaVNfUHIsIGRlbGF5ICogMzYpOwogfQogI2VuZGlmCiAKICNpZmRlZiBTSVMzMTVICiBzdGF0aWMgdm9pZAotU2lTX0xvbmdEZWxheShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgZGVsYXkpCitTaVNfTG9uZ0RlbGF5KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBkZWxheSkKIHsKLSAgd2hpbGUoZGVsYXktLSkgewotICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwweDE5ZGYpOwotICB9CisgICB3aGlsZShkZWxheS0tKSB7CisgICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgNjYyMyk7CisgICB9CiB9CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoU0lTMzAwKSB8fCBkZWZpbmVkKFNJUzMxNUgpCiBzdGF0aWMgdm9pZAotU2lTX1Nob3J0RGVsYXkoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIGRlbGF5KQorU2lTX1Nob3J0RGVsYXkoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IGRlbGF5KQogewotICB3aGlsZShkZWxheS0tKSB7Ci0gICAgIFNpU19HZW5lcmljRGVsYXkoU2lTX1ByLDB4NDIpOwotICB9CisgICB3aGlsZShkZWxheS0tKSB7CisgICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgNjYpOworICAgfQogfQogI2VuZGlmCiAKIHN0YXRpYyB2b2lkCi1TaVNfUGFuZWxEZWxheShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgRGVsYXlUaW1lKQorU2lTX1BhbmVsRGVsYXkoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IERlbGF5VGltZSkKIHsKICNpZiBkZWZpbmVkKFNJUzMwMCkgfHwgZGVmaW5lZChTSVMzMTVIKQotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCBQYW5lbElELCBEZWxheUluZGV4LCBEZWxheT0wOworICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICAgdW5zaWduZWQgc2hvcnQgUGFuZWxJRCwgRGVsYXlJbmRleCwgRGVsYXk9MDsKICNlbmRpZgogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwCiAKICAgICAgIFBhbmVsSUQgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNik7CiAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSBQYW5lbElEICY9IDB4Zjc7Ci0gICAgICAgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE4KSAmIDB4MTApKSBQYW5lbElEID0gMHgxMjsKKwkgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSBQYW5lbElEICY9IDB4Zjc7CisJIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTgpICYgMHgxMCkpIFBhbmVsSUQgPSAweDEyOwogICAgICAgfQogICAgICAgRGVsYXlJbmRleCA9IFBhbmVsSUQgPj4gNDsKICAgICAgIGlmKChEZWxheVRpbWUgPj0gMikgJiYgKChQYW5lbElEICYgMHgwZikgPT0gMSkpICB7Ci0gICAgICAgICBEZWxheSA9IDM7CisJIERlbGF5ID0gMzsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZihEZWxheVRpbWUgPj0gMikgRGVsYXlUaW1lIC09IDI7Ci0gICAgICAgICBpZighKERlbGF5VGltZSAmIDB4MDEpKSB7Ci0gICAgICAgCSAgICBEZWxheSA9IFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxbRGVsYXlJbmRleF0udGltZXJbMF07Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgIAkgICAgRGVsYXkgPSBTaVNfUHItPlNpU19QYW5lbERlbGF5VGJsW0RlbGF5SW5kZXhdLnRpbWVyWzFdOwotICAgICAgICAgfQorCSBpZihEZWxheVRpbWUgPj0gMikgRGVsYXlUaW1lIC09IDI7CisJIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIHsKKwkgICAgRGVsYXkgPSBTaVNfUHItPlNpU19QYW5lbERlbGF5VGJsW0RlbGF5SW5kZXhdLnRpbWVyWzBdOworCSB9IGVsc2UgeworCSAgICBEZWxheSA9IFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxbRGVsYXlJbmRleF0udGltZXJbMV07CisJIH0KIAkgaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSB7Ci0gICAgICAgICAgICBpZihST01BZGRyWzB4MjIwXSAmIDB4NDApIHsKLSAgICAgICAgICAgICAgIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIERlbGF5ID0gKFVTSE9SVClST01BZGRyWzB4MjI1XTsKLSAgICAgICAgICAgICAgIGVsc2UgCSAgICAJICAgICAgIERlbGF5ID0gKFVTSE9SVClST01BZGRyWzB4MjI2XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KKwkgICAgaWYoUk9NQWRkclsweDIyMF0gJiAweDQwKSB7CisJICAgICAgIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIERlbGF5ID0gKHVuc2lnbmVkIHNob3J0KVJPTUFkZHJbMHgyMjVdOworCSAgICAgICBlbHNlIAkgICAgCSAgICAgICBEZWxheSA9ICh1bnNpZ25lZCBzaG9ydClST01BZGRyWzB4MjI2XTsKKwkgICAgfQorCSB9CiAgICAgICB9CiAgICAgICBTaVNfU2hvcnREZWxheShTaVNfUHIsIERlbGF5KTsKIApAQCAtNTIwLDIzICs1MjIsMjMgQEAKIAogI2lmZGVmIFNJUzMxNUgKIAotICAgICAgaWYoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpICAgIHx8Ci0gICAgICAgICAoSHdJbmZvLT5qQ2hpcFR5cGUgPD0gU0lTXzMxNVBSTykgfHwKLQkgKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMzApICAgIHx8CisgICAgICBpZigoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSAgICB8fAorCSAoU2lTX1ByLT5DaGlwVHlwZSA8PSBTSVNfMzE1UFJPKSB8fAorCSAoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfMzMwKSAgICB8fAogCSAoU2lTX1ByLT5TaVNfUk9NTmV3KSkgewogCi0gICAgICAgICBpZighKERlbGF5VGltZSAmIDB4MDEpKSB7CisJIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIHsKIAkgICAgU2lTX0REQzJEZWxheShTaVNfUHIsIDB4MTAwMCk7Ci0gICAgICAgICB9IGVsc2UgeworCSB9IGVsc2UgewogCSAgICBTaVNfRERDMkRlbGF5KFNpU19QciwgMHg0MDAwKTsKLSAgICAgICAgIH0KKwkgfQogCiAgICAgICB9IGVsc2UgaWYoKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIC8qIHx8Ci0gICAgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ09NUEFRMTI4MCkgfHwKKwkgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0NPTVBBUTEyODApIHx8CiAJIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9DTEVWTzE0MDApICovICkgewkJCS8qIDMxNSBzZXJpZXMsIExWRFM7IFNwZWNpYWwgKi8KIAotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAwKSB7Ci0gICAgICAgICAgICBQYW5lbElEID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzYpOworCSBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDApIHsKKwkgICAgUGFuZWxJRCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM2KTsKIAkgICAgaWYoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ0xFVk8xNDAwKSB7CiAJICAgICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MWIpICYgMHgxMCkpIFBhbmVsSUQgPSAweDEyOwogCSAgICB9CkBAIC01NDYsMzUgKzU0OCwzNSBAQAogCSAgICAgICBEZWxheUluZGV4ID0gUGFuZWxJRCA+PiA0OwogCSAgICB9CiAJICAgIGlmKChEZWxheVRpbWUgPj0gMikgJiYgKChQYW5lbElEICYgMHgwZikgPT0gMSkpICB7Ci0gICAgICAgICAgICAgICBEZWxheSA9IDM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgaWYoRGVsYXlUaW1lID49IDIpIERlbGF5VGltZSAtPSAyOwotICAgICAgICAgICAgICAgaWYoIShEZWxheVRpbWUgJiAweDAxKSkgewotICAgICAgIAkJICBEZWxheSA9IFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxMVkRTW0RlbGF5SW5kZXhdLnRpbWVyWzBdOwotICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAJCSAgRGVsYXkgPSBTaVNfUHItPlNpU19QYW5lbERlbGF5VGJsTFZEU1tEZWxheUluZGV4XS50aW1lclsxXTsKLSAgICAgICAgICAgICAgIH0KKwkgICAgICAgRGVsYXkgPSAzOworCSAgICB9IGVsc2UgeworCSAgICAgICBpZihEZWxheVRpbWUgPj0gMikgRGVsYXlUaW1lIC09IDI7CisJICAgICAgIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIHsKKwkJICBEZWxheSA9IFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxMVkRTW0RlbGF5SW5kZXhdLnRpbWVyWzBdOworCQl9IGVsc2UgeworCQkgIERlbGF5ID0gU2lTX1ByLT5TaVNfUGFuZWxEZWxheVRibExWRFNbRGVsYXlJbmRleF0udGltZXJbMV07CisJICAgICAgIH0KIAkgICAgICAgaWYoKFNpU19Qci0+U2lTX1VzZVJPTSkgJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKLSAgICAgICAgICAgICAgICAgIGlmKFJPTUFkZHJbMHgxM2NdICYgMHg0MCkgewotICAgICAgICAgICAgICAgICAgICAgaWYoIShEZWxheVRpbWUgJiAweDAxKSkgewotCSAgICAJICAgICAgICBEZWxheSA9IChVU0hPUlQpUk9NQWRkclsweDE3ZV07Ci0gICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCSAgICAJICAgICAgICBEZWxheSA9IChVU0hPUlQpUk9NQWRkclsweDE3Zl07Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisJCSAgaWYoUk9NQWRkclsweDEzY10gJiAweDQwKSB7CisJCSAgICAgaWYoIShEZWxheVRpbWUgJiAweDAxKSkgeworCQkJRGVsYXkgPSAodW5zaWduZWQgc2hvcnQpUk9NQWRkclsweDE3ZV07CisJCSAgICAgfSBlbHNlIHsKKwkJCURlbGF5ID0gKHVuc2lnbmVkIHNob3J0KVJPTUFkZHJbMHgxN2ZdOworCQkgICAgIH0KKwkJICB9CisJICAgICAgIH0KKwkgICAgfQogCSAgICBTaVNfU2hvcnREZWxheShTaVNfUHIsIERlbGF5KTsKIAkgfQogCiAgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsJCQkvKiAzMTUgc2VyaWVzLCBhbGwgYnJpZGdlcyAqLwogCiAJIERlbGF5SW5kZXggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgPj4gNDsKLSAgICAgICAgIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIHsKLSAgICAgICAJICAgIERlbGF5ID0gU2lTX1ByLT5TaVNfUGFuZWxEZWxheVRibFtEZWxheUluZGV4XS50aW1lclswXTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgCSAgICBEZWxheSA9IFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxbRGVsYXlJbmRleF0udGltZXJbMV07Ci0gICAgICAgICB9CisJIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIHsKKwkgICAgRGVsYXkgPSBTaVNfUHItPlNpU19QYW5lbERlbGF5VGJsW0RlbGF5SW5kZXhdLnRpbWVyWzBdOworCSB9IGVsc2UgeworCSAgICBEZWxheSA9IFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxbRGVsYXlJbmRleF0udGltZXJbMV07CisJIH0KIAkgRGVsYXkgPDw9IDg7CiAJIFNpU19EREMyRGVsYXkoU2lTX1ByLCBEZWxheSk7CiAKQEAgLTU4NywxMiArNTg5LDExIEBACiAKICNpZmRlZiBTSVMzMTVICiBzdGF0aWMgdm9pZAotU2lTX1BhbmVsRGVsYXlMb29wKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgVVNIT1JUIERlbGF5VGltZSwgVVNIT1JUIERlbGF5TG9vcCkKK1NpU19QYW5lbERlbGF5TG9vcChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgRGVsYXlUaW1lLCB1bnNpZ25lZCBzaG9ydCBEZWxheUxvb3ApCiB7CiAgICBpbnQgaTsKLSAgIGZvcihpPTA7IGk8RGVsYXlMb29wOyBpKyspIHsKLSAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCBEZWxheVRpbWUpOworICAgZm9yKGkgPSAwOyBpIDwgRGVsYXlMb29wOyBpKyspIHsKKyAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgRGVsYXlUaW1lKTsKICAgIH0KIH0KICNlbmRpZgpAQCAtNjAyLDg2ICs2MDMsODYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLVNpU19XYWl0UmV0cmFjZTEoU2lTX1ByaXZhdGUgKlNpU19QcikKK1NpU19XYWl0UmV0cmFjZTEoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCB3YXRjaGRvZzsKKyAgIHVuc2lnbmVkIHNob3J0IHdhdGNoZG9nOwogCi0gIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDFmKSAmIDB4YzApIHJldHVybjsKLSAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgxNykgJiAweDgwKSkgcmV0dXJuOworICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MWYpICYgMHhjMCkgcmV0dXJuOworICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgxNykgJiAweDgwKSkgcmV0dXJuOwogCi0gIHdhdGNoZG9nID0gNjU1MzU7Ci0gIHdoaWxlKChTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKSAmIDB4MDgpICYmIC0td2F0Y2hkb2cpOwotICB3YXRjaGRvZyA9IDY1NTM1OwotICB3aGlsZSgoIShTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKSAmIDB4MDgpKSAmJiAtLXdhdGNoZG9nKTsKKyAgIHdhdGNoZG9nID0gNjU1MzU7CisgICB3aGlsZSgoU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNkYSkgJiAweDA4KSAmJiAtLXdhdGNoZG9nKTsKKyAgIHdhdGNoZG9nID0gNjU1MzU7CisgICB3aGlsZSgoIShTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKSAmIDB4MDgpKSAmJiAtLXdhdGNoZG9nKTsKIH0KIAogI2lmIGRlZmluZWQoU0lTMzAwKSB8fCBkZWZpbmVkKFNJUzMxNUgpCiBzdGF0aWMgdm9pZAotU2lTX1dhaXRSZXRyYWNlMihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgcmVnKQorU2lTX1dhaXRSZXRyYWNlMihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnKQogewotICBVU0hPUlQgd2F0Y2hkb2c7CisgICB1bnNpZ25lZCBzaG9ydCB3YXRjaGRvZzsKIAotICB3YXRjaGRvZyA9IDY1NTM1OwotICB3aGlsZSgoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQscmVnKSAmIDB4MDIpICYmIC0td2F0Y2hkb2cpOwotICB3YXRjaGRvZyA9IDY1NTM1OwotICB3aGlsZSgoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxyZWcpICYgMHgwMikpICYmIC0td2F0Y2hkb2cpOworICAgd2F0Y2hkb2cgPSA2NTUzNTsKKyAgIHdoaWxlKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxyZWcpICYgMHgwMikgJiYgLS13YXRjaGRvZyk7CisgICB3YXRjaGRvZyA9IDY1NTM1OworICAgd2hpbGUoKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQscmVnKSAmIDB4MDIpKSAmJiAtLXdhdGNoZG9nKTsKIH0KICNlbmRpZgogCiBzdGF0aWMgdm9pZAotU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19XYWl0VkJSZXRyYWNlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKICNpZmRlZiBTSVMzMDAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0gICAgICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCkgJiAweDIwKSkgcmV0dXJuOwotICAgICB9Ci0gICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCkgJiAweDgwKSkgewotICAgICAgICBTaVNfV2FpdFJldHJhY2UxKFNpU19Qcik7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIFNpU19XYWl0UmV0cmFjZTIoU2lTX1ByLCAweDI1KTsKLSAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CisJIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCkgJiAweDIwKSkgcmV0dXJuOworICAgICAgfQorICAgICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKSAmIDB4ODApKSB7CisJIFNpU19XYWl0UmV0cmFjZTEoU2lTX1ByKTsKKyAgICAgIH0gZWxzZSB7CisJIFNpU19XYWl0UmV0cmFjZTIoU2lTX1ByLCAweDI1KTsKKyAgICAgIH0KICNlbmRpZgotICB9IGVsc2UgeworICAgfSBlbHNlIHsKICNpZmRlZiBTSVMzMTVICi0gICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCkgJiAweDQwKSkgewotICAgICAgICBTaVNfV2FpdFJldHJhY2UxKFNpU19Qcik7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIFNpU19XYWl0UmV0cmFjZTIoU2lTX1ByLCAweDMwKTsKLSAgICAgfQorICAgICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKSAmIDB4NDApKSB7CisJIFNpU19XYWl0UmV0cmFjZTEoU2lTX1ByKTsKKyAgICAgIH0gZWxzZSB7CisJIFNpU19XYWl0UmV0cmFjZTIoU2lTX1ByLCAweDMwKTsKKyAgICAgIH0KICNlbmRpZgotICB9CisgICB9CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfVkJXYWl0KFNpU19Qcml2YXRlICpTaVNfUHIpCitTaVNfVkJXYWl0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVU0hPUlQgdGVtcGFsLHRlbXAsaSxqOworICAgdW5zaWduZWQgc2hvcnQgdGVtcGFsLHRlbXAsaSxqOwogCi0gIHRlbXAgPSAwOwotICBmb3IoaT0wOyBpPDM7IGkrKykgewotICAgIGZvcihqPTA7IGo8MTAwOyBqKyspIHsKLSAgICAgICB0ZW1wYWwgPSBTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKTsKLSAgICAgICBpZih0ZW1wICYgMHgwMSkgewotICAgICAgICAgIGlmKCh0ZW1wYWwgJiAweDA4KSkgIGNvbnRpbnVlOwotICAgICAgICAgIGVsc2UgYnJlYWs7Ci0gICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZighKHRlbXBhbCAmIDB4MDgpKSBjb250aW51ZTsKLSAgICAgICAgICBlbHNlIGJyZWFrOwotICAgICAgIH0KLSAgICB9Ci0gICAgdGVtcCBePSAweDAxOwotICB9CisgICB0ZW1wID0gMDsKKyAgIGZvcihpID0gMDsgaSA8IDM7IGkrKykgeworICAgICBmb3IoaiA9IDA7IGogPCAxMDA7IGorKykgeworICAgICAgICB0ZW1wYWwgPSBTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKTsKKyAgICAgICAgaWYodGVtcCAmIDB4MDEpIHsKKwkgICBpZigodGVtcGFsICYgMHgwOCkpICBjb250aW51ZTsKKwkgICBlbHNlIGJyZWFrOworICAgICAgICB9IGVsc2UgeworCSAgIGlmKCEodGVtcGFsICYgMHgwOCkpIGNvbnRpbnVlOworCSAgIGVsc2UgYnJlYWs7CisgICAgICAgIH0KKyAgICAgfQorICAgICB0ZW1wIF49IDB4MDE7CisgICB9CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfVkJMb25nV2FpdChTaVNfUHJpdmF0ZSAqU2lTX1ByKQorU2lTX1ZCTG9uZ1dhaXQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgIFNpU19WQldhaXQoU2lTX1ByKTsKLSAgfSBlbHNlIHsKLSAgICAgU2lTX1dhaXRSZXRyYWNlMShTaVNfUHIpOwotICB9CisgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgeworICAgICAgU2lTX1ZCV2FpdChTaVNfUHIpOworICAgfSBlbHNlIHsKKyAgICAgIFNpU19XYWl0UmV0cmFjZTEoU2lTX1ByKTsKKyAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY5MCwyMzcgKzY5MSwyMjUgQEAKIAogI2lmZGVmIFNJUzMwMAogc3RhdGljIEJPT0xFQU4KLVNpU19JczMwMUIoU2lTX1ByaXZhdGUgKlNpU19QcikKK1NpU19JczMwMUIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MDEpID49IDB4YjApIHJldHVybiBUUlVFOwotICByZXR1cm4gRkFMU0U7CisgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDAxKSA+PSAweGIwKSByZXR1cm4gVFJVRTsKKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCiBzdGF0aWMgQk9PTEVBTgotU2lTX0NSVDJJc0xDRChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0NSVDJJc0xDRChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVVNIT1JUIGZsYWc7Ci0KLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgewotICAgICBmbGFnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTMpOwotICAgICBpZihmbGFnICYgMHgyMCkgcmV0dXJuIFRSVUU7Ci0gIH0KLSAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMwKTsKLSAgaWYoZmxhZyAmIDB4MjApIHJldHVybiBUUlVFOwotICByZXR1cm4gRkFMU0U7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApIHsKKyAgICAgIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDEzKSAmIDB4MjApIHJldHVybiBUUlVFOworICAgfQorICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApICYgMHgyMCkgcmV0dXJuIFRSVUU7CisgICByZXR1cm4gRkFMU0U7CiB9CiAKIEJPT0xFQU4KLVNpU19Jc0R1YWxFZGdlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfSXNEdWFsRWRnZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICNpZmRlZiBTSVMzMTVICi0gIFVTSE9SVCBmbGFnOwotCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGlmKChId0luZm8tPmpDaGlwVHlwZSAhPSBTSVNfNjUwKSB8fCAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NWYpICYgMHhmMCkpIHsKLSAgICAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKLSAgICAgICAgaWYoZmxhZyAmIEVuYWJsZUR1YWxFZGdlKSByZXR1cm4gVFJVRTsKLSAgICAgfQotICB9CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICAgICBpZigoU2lTX1ByLT5DaGlwVHlwZSAhPSBTSVNfNjUwKSB8fCAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NWYpICYgMHhmMCkpIHsKKwkgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzgpICYgRW5hYmxlRHVhbEVkZ2UpIHJldHVybiBUUlVFOworICAgICAgfQorICAgfQogI2VuZGlmCi0gIHJldHVybiBGQUxTRTsKKyAgIHJldHVybiBGQUxTRTsKIH0KIAogQk9PTEVBTgotU2lTX0lzVkFNb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfSXNWQU1vZGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAjaWZkZWYgU0lTMzE1SAotICBVU0hPUlQgZmxhZzsKKyAgIHVuc2lnbmVkIHNob3J0IGZsYWc7CiAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKLSAgICAgaWYoKGZsYWcgJiBFbmFibGVEdWFsRWRnZSkgJiYgKGZsYWcgJiBTZXRUb0xDREEpKSByZXR1cm4gVFJVRTsKLSAgfQorICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKKyAgICAgIGlmKChmbGFnICYgRW5hYmxlRHVhbEVkZ2UpICYmIChmbGFnICYgU2V0VG9MQ0RBKSkgcmV0dXJuIFRSVUU7CisgICB9CiAjZW5kaWYKLSAgcmV0dXJuIEZBTFNFOworICAgcmV0dXJuIEZBTFNFOwogfQogCiAjaWZkZWYgU0lTMzE1SAogc3RhdGljIEJPT0xFQU4KLVNpU19Jc1ZBb3JMQ0QoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19Jc1ZBb3JMQ0Qoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIGlmKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkgICByZXR1cm4gVFJVRTsKLSAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHJldHVybiBUUlVFOwotICByZXR1cm4gRkFMU0U7CisgICBpZihTaVNfSXNWQU1vZGUoU2lTX1ByKSkgIHJldHVybiBUUlVFOworICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIpKSByZXR1cm4gVFJVRTsKKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCiBzdGF0aWMgQk9PTEVBTgotU2lTX0lzRHVhbExpbmsoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19Jc0R1YWxMaW5rKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogI2lmZGVmIFNJUzMxNUgKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgaWYoKFNpU19DUlQySXNMQ0QoU2lTX1ByLCBId0luZm8pKSB8fAotICAgICAgICAoU2lTX0lzVkFNb2RlKFNpU19QciwgSHdJbmZvKSkpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRER1YWxMaW5rKSByZXR1cm4gVFJVRTsKLSAgICAgfQotICB9CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICAgICBpZigoU2lTX0NSVDJJc0xDRChTaVNfUHIpKSB8fAorICAgICAgICAgKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSkgeworCSBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENERHVhbExpbmspIHJldHVybiBUUlVFOworICAgICAgfQorICAgfQogI2VuZGlmCi0gIHJldHVybiBGQUxTRTsKKyAgIHJldHVybiBGQUxTRTsKIH0KIAogI2lmZGVmIFNJUzMxNUgKIHN0YXRpYyBCT09MRUFOCi1TaVNfVFZFbmFibGVkKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfVFZFbmFibGVkKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBpZigoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwMCkgJiAweDBmKSAhPSAweDBjKSByZXR1cm4gVFJVRTsKLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMUMgfCBWQl9TSVMzMDFMVjMwMkxWKSkgewotICAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDRkKSAmIDB4MTApIHJldHVybiBUUlVFOwotICB9Ci0gIHJldHVybiBGQUxTRTsKKyAgIGlmKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAwKSAmIDB4MGYpICE9IDB4MGMpIHJldHVybiBUUlVFOworICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTWVBCUFIpIHsKKyAgICAgIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4NGQpICYgMHgxMCkgcmV0dXJuIFRSVUU7CisgICB9CisgICByZXR1cm4gRkFMU0U7CiB9CiAjZW5kaWYKIAogI2lmZGVmIFNJUzMxNUgKIHN0YXRpYyBCT09MRUFOCi1TaVNfTENEQUVuYWJsZWQoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19MQ0RBRW5hYmxlZChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxMykgJiAweDA0KSByZXR1cm4gVFJVRTsKLSAgcmV0dXJuIEZBTFNFOworICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxMykgJiAweDA0KSByZXR1cm4gVFJVRTsKKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCiAjaWZkZWYgU0lTMzE1SAogc3RhdGljIEJPT0xFQU4KLVNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgaWYoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSAmJiAoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfNjYxKSkgewotICAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg3OSkgJiAweDEwKSByZXR1cm4gVFJVRTsKLSAgfQotICByZXR1cm4gRkFMU0U7CisgICBpZigoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfNjYxKSkgeworICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NzkpICYgMHgxMCkgcmV0dXJuIFRSVUU7CisgICB9CisgICByZXR1cm4gRkFMU0U7CiB9CiAjZW5kaWYKIAogI2lmZGVmIFNJUzMxNUgKIHN0YXRpYyBCT09MRUFOCi1TaVNfSXNOb3RNNjUwb3JMYXRlcihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0lzTm90TTY1MG9yTGF0ZXIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnOworICAgdW5zaWduZWQgc2hvcnQgZmxhZzsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjUwKSB7Ci0gICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg1Zik7Ci0gICAgIGZsYWcgJj0gMHhGMDsKLSAgICAgLyogQ2hlY2sgZm9yIHJldmlzaW9uICE9IEEwIG9ubHkgKi8KLSAgICAgaWYoKGZsYWcgPT0gMHhlMCkgfHwgKGZsYWcgPT0gMHhjMCkgfHwKLSAgICAgICAgKGZsYWcgPT0gMHhiMCkgfHwgKGZsYWcgPT0gMHg5MCkpIHJldHVybiBGQUxTRTsKLSAgfSBlbHNlIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHJldHVybiBGQUxTRTsKLSAgcmV0dXJuIFRSVUU7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU182NTApIHsKKyAgICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg1ZikgJiAweGYwOworICAgICAgLyogQ2hlY2sgZm9yIHJldmlzaW9uICE9IEEwIG9ubHkgKi8KKyAgICAgIGlmKChmbGFnID09IDB4ZTApIHx8IChmbGFnID09IDB4YzApIHx8CisgICAgICAgICAoZmxhZyA9PSAweGIwKSB8fCAoZmxhZyA9PSAweDkwKSkgcmV0dXJuIEZBTFNFOworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzY2MSkgcmV0dXJuIEZBTFNFOworICAgcmV0dXJuIFRSVUU7CiB9CiAjZW5kaWYKIAogI2lmZGVmIFNJUzMxNUgKIHN0YXRpYyBCT09MRUFOCi1TaVNfSXNZUGJQcihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0lzWVBiUHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnOwotCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7Ci0gICAgIGlmKGZsYWcgJiBFbmFibGVDSFlQYlByKSByZXR1cm4gVFJVRTsgIC8qID0gWVByUGIgPSAweDA4ICovCi0gIH0KLSAgcmV0dXJuIEZBTFNFOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgLyogWVByUGIgPSAweDA4ICovCisgICAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCkgJiBFbmFibGVDSFlQYlByKSByZXR1cm4gVFJVRTsKKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCiAjaWZkZWYgU0lTMzE1SAogc3RhdGljIEJPT0xFQU4KLVNpU19Jc0NoU2NhcnQoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19Jc0NoU2NhcnQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnOwotCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7Ci0gICAgIGlmKGZsYWcgJiBFbmFibGVDSFNjYXJ0KSByZXR1cm4gVFJVRTsgIC8qID0gU2NhcnQgPSAweDA0ICovCi0gIH0KLSAgcmV0dXJuIEZBTFNFOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgLyogU2NhcnQgPSAweDA0ICovCisgICAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCkgJiBFbmFibGVDSFNjYXJ0KSByZXR1cm4gVFJVRTsKKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCiAjaWZkZWYgU0lTMzE1SAogc3RhdGljIEJPT0xFQU4KLVNpU19Jc1RWT3JZUGJQck9yU2NhcnQoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19Jc1RWT3JZUGJQck9yU2NhcnQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnOworICAgdW5zaWduZWQgc2hvcnQgZmxhZzsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICBmbGFnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOwotICAgICBpZihmbGFnICYgU2V0Q1JUMlRvVFYpICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKLSAgICAgaWYoZmxhZyAmIEVuYWJsZUNIWVBiUHIpICAgICAgcmV0dXJuIFRSVUU7ICAvKiA9IFlQclBiID0gMHgwOCAqLwotICAgICBpZihmbGFnICYgRW5hYmxlQ0hTY2FydCkgICAgICByZXR1cm4gVFJVRTsgIC8qID0gU2NhcnQgPSAweDA0IC0gVFcgKi8KLSAgfSBlbHNlIHsKLSAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMwKTsKLSAgICAgaWYoZmxhZyAmIFNldENSVDJUb1RWKSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gIH0KLSAgcmV0dXJuIEZBTFNFOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMwKTsKKyAgICAgIGlmKGZsYWcgJiBTZXRDUlQyVG9UVikgICAgICAgIHJldHVybiBUUlVFOworICAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKKyAgICAgIGlmKGZsYWcgJiBFbmFibGVDSFlQYlByKSAgICAgIHJldHVybiBUUlVFOyAgLyogPSBZUHJQYiA9IDB4MDggKi8KKyAgICAgIGlmKGZsYWcgJiBFbmFibGVDSFNjYXJ0KSAgICAgIHJldHVybiBUUlVFOyAgLyogPSBTY2FydCA9IDB4MDQgLSBUVyAqLworICAgfSBlbHNlIHsKKyAgICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMCk7CisgICAgICBpZihmbGFnICYgU2V0Q1JUMlRvVFYpICAgICAgICByZXR1cm4gVFJVRTsKKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCiAjaWZkZWYgU0lTMzE1SAogc3RhdGljIEJPT0xFQU4KLVNpU19Jc0xDRE9yTENEQShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0lzTENET3JMQ0RBKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVU0hPUlQgZmxhZzsKKyAgIHVuc2lnbmVkIHNob3J0IGZsYWc7CiAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMwKTsKLSAgICAgaWYoZmxhZyAmIFNldENSVDJUb0xDRCkgcmV0dXJuIFRSVUU7Ci0gICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7Ci0gICAgIGlmKGZsYWcgJiBTZXRUb0xDREEpICAgIHJldHVybiBUUlVFOwotICB9IGVsc2UgewotICAgICBmbGFnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOwotICAgICBpZihmbGFnICYgU2V0Q1JUMlRvTENEKSByZXR1cm4gVFJVRTsKLSAgfQotICByZXR1cm4gRkFMU0U7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICAgICBmbGFnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOworICAgICAgaWYoZmxhZyAmIFNldENSVDJUb0xDRCkgcmV0dXJuIFRSVUU7CisgICAgICBmbGFnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzgpOworICAgICAgaWYoZmxhZyAmIFNldFRvTENEQSkgICAgcmV0dXJuIFRSVUU7CisgICB9IGVsc2UgeworICAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMwKTsKKyAgICAgIGlmKGZsYWcgJiBTZXRDUlQyVG9MQ0QpIHJldHVybiBUUlVFOworICAgfQorICAgcmV0dXJuIEZBTFNFOwogfQogI2VuZGlmCiAKIHN0YXRpYyBCT09MRUFOCi1TaVNfQnJpZGdlSXNPbihTaVNfUHJpdmF0ZSAqU2lTX1ByKQorU2lTX0hhdmVCcmlkZ2Uoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnOworICAgdW5zaWduZWQgc2hvcnQgZmxhZzsKIAotICBpZihTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB7Ci0gICAgIHJldHVybiBUUlVFOwotICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLSAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MDApOwotICAgICBpZigoZmxhZyA9PSAxKSB8fCAoZmxhZyA9PSAyKSkgcmV0dXJuIFRSVUU7Ci0gIH0KLSAgcmV0dXJuIEZBTFNFOworICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKyAgICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDAwKTsKKyAgICAgIGlmKChmbGFnID09IDEpIHx8IChmbGFnID09IDIpKSByZXR1cm4gVFJVRTsKKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KIAogc3RhdGljIEJPT0xFQU4KLVNpU19CcmlkZ2VJc0VuYWJsZWQoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19CcmlkZ2VJc0VuYWJsZWQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnOworICAgdW5zaWduZWQgc2hvcnQgZmxhZzsKIAotICBpZihTaVNfQnJpZGdlSXNPbihTaVNfUHIpKSB7Ci0gICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKTsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotICAgICAgIGZsYWcgJj0gMHhhMDsKLSAgICAgICBpZigoZmxhZyA9PSAweDgwKSB8fCAoZmxhZyA9PSAweDIwKSkgcmV0dXJuIFRSVUU7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgZmxhZyAmPSAweDUwOwotICAgICAgIGlmKChmbGFnID09IDB4NDApIHx8IChmbGFnID09IDB4MTApKSByZXR1cm4gVFJVRTsKLSAgICAgfQotICB9Ci0gIHJldHVybiBGQUxTRTsKKyAgIGlmKFNpU19IYXZlQnJpZGdlKFNpU19QcikpIHsKKyAgICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKTsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCWZsYWcgJj0gMHhhMDsKKwlpZigoZmxhZyA9PSAweDgwKSB8fCAoZmxhZyA9PSAweDIwKSkgcmV0dXJuIFRSVUU7CisgICAgICB9IGVsc2UgeworCWZsYWcgJj0gMHg1MDsKKwlpZigoZmxhZyA9PSAweDQwKSB8fCAoZmxhZyA9PSAweDEwKSkgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICB9CisgICByZXR1cm4gRkFMU0U7CiB9CiAKIHN0YXRpYyBCT09MRUFOCi1TaVNfQnJpZGdlSW5TbGF2ZW1vZGUoU2lTX1ByaXZhdGUgKlNpU19QcikKK1NpU19CcmlkZ2VJblNsYXZlbW9kZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVVNIT1JUIGZsYWcxOworICAgdW5zaWduZWQgc2hvcnQgZmxhZzE7CiAKLSAgZmxhZzEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMSk7Ci0gIGlmKGZsYWcxICYgKFNldEluU2xhdmVNb2RlID4+IDgpKSByZXR1cm4gVFJVRTsKLSAgcmV0dXJuIEZBTFNFOworICAgZmxhZzEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMSk7CisgICBpZihmbGFnMSAmIChTZXRJblNsYXZlTW9kZSA+PiA4KSkgcmV0dXJuIFRSVUU7CisgICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05MjgsMTE5ICs5MTcsOTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIFNldHVwIGdlbmVyYWwgcHVycG9zZSBJTyBmb3IgQ2hyb250ZWwgY29tbXVuaWNhdGlvbiAqLworI2lmZGVmIFNJUzMwMAogdm9pZAotU2lTX1NldENocm9udGVsR1BJTyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgbXl2YmluZm8pCitTaVNfU2V0Q2hyb250ZWxHUElPKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBteXZiaW5mbykKIHsKLSAgIHVuc2lnbmVkIGxvbmcgIGFjcGliYXNlOworICAgdW5zaWduZWQgaW50ICAgYWNwaWJhc2U7CiAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCiAgICBpZighKFNpU19Qci0+U2lTX0NoU1cpKSByZXR1cm47CiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgIFNpU19TZXRSZWdMb25nKDB4Y2Y4LDB4ODAwMDA4NzQpOwkJICAgICAgIC8qIGdldCBBQ1BJIGJhc2UgKi8KLSAgIGFjcGliYXNlID0gU2lTX0dldFJlZ0xvbmcoMHhjZmMpOworI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKKyAgIGFjcGliYXNlID0gc2lzZmJfcmVhZF9scGNfcGNpX2R3b3JkKFNpU19QciwgMHg3NCk7CiAjZWxzZQogICAgYWNwaWJhc2UgPSBwY2lSZWFkTG9uZygweDAwMDAwODAwLCAweDc0KTsKICNlbmRpZgogICAgYWNwaWJhc2UgJj0gMHhGRkZGOwotICAgdGVtcCA9IFNpU19HZXRSZWdTaG9ydCgoVVNIT1JUKShhY3BpYmFzZSArIDB4M2MpKTsgIC8qIEFDUEkgcmVnaXN0ZXIgMHgzYzogR1AgRXZlbnQgMSBJL08gbW9kZSBzZWxlY3QgKi8KKyAgIGlmKCFhY3BpYmFzZSkgcmV0dXJuOworICAgdGVtcCA9IFNpU19HZXRSZWdTaG9ydCgoYWNwaWJhc2UgKyAweDNjKSk7CS8qIEFDUEkgcmVnaXN0ZXIgMHgzYzogR1AgRXZlbnQgMSBJL08gbW9kZSBzZWxlY3QgKi8KICAgIHRlbXAgJj0gMHhGRUZGOwotICAgU2lTX1NldFJlZ1Nob3J0KChVU0hPUlQpKGFjcGliYXNlICsgMHgzYyksIHRlbXApOwotICAgdGVtcCA9IFNpU19HZXRSZWdTaG9ydCgoVVNIT1JUKShhY3BpYmFzZSArIDB4M2MpKTsKLSAgIHRlbXAgPSBTaVNfR2V0UmVnU2hvcnQoKFVTSE9SVCkoYWNwaWJhc2UgKyAweDNhKSk7ICAvKiBBQ1BJIHJlZ2lzdGVyIDB4M2E6IEdQIFBpbiBMZXZlbCAobG93L2hpZ2gpICovCisgICBTaVNfU2V0UmVnU2hvcnQoKGFjcGliYXNlICsgMHgzYyksIHRlbXApOworICAgdGVtcCA9IFNpU19HZXRSZWdTaG9ydCgoYWNwaWJhc2UgKyAweDNjKSk7CisgICB0ZW1wID0gU2lTX0dldFJlZ1Nob3J0KChhY3BpYmFzZSArIDB4M2EpKTsJLyogQUNQSSByZWdpc3RlciAweDNhOiBHUCBQaW4gTGV2ZWwgKGxvdy9oaWdoKSAqLwogICAgdGVtcCAmPSAweEZFRkY7CiAgICBpZighKG15dmJpbmZvICYgU2V0Q1JUMlRvVFYpKSB0ZW1wIHw9IDB4MDEwMDsKLSAgIFNpU19TZXRSZWdTaG9ydCgoVVNIT1JUKShhY3BpYmFzZSArIDB4M2EpLCB0ZW1wKTsKLSAgIHRlbXAgPSBTaVNfR2V0UmVnU2hvcnQoKFVTSE9SVCkoYWNwaWJhc2UgKyAweDNhKSk7CisgICBTaVNfU2V0UmVnU2hvcnQoKGFjcGliYXNlICsgMHgzYSksIHRlbXApOworICAgdGVtcCA9IFNpU19HZXRSZWdTaG9ydCgoYWNwaWJhc2UgKyAweDNhKSk7CiB9CisjZW5kaWYKIAogdm9pZAotU2lTX0dldFZCSW5mbyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgIFBTSVNfSFdfSU5GTyBId0luZm8sIGludCBjaGVja2NydDJtb2RlKQorU2lTX0dldFZCSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgaW50IGNoZWNrY3J0Mm1vZGUpCiB7Ci0gIFVTSE9SVCB0ZW1wYXgsdGVtcGJ4LHRlbXA7Ci0gIFVTSE9SVCBtb2RlZmxhZywgcmVzaW5mbz0wOworICAgdW5zaWduZWQgc2hvcnQgdGVtcGF4LCB0ZW1wYngsIHRlbXA7CisgICB1bnNpZ25lZCBzaG9ydCBtb2RlZmxhZywgcmVzaW5mbyA9IDA7CiAKLSAgaWYoTW9kZU5vIDw9IDB4MTMpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOwotICB9IGVsc2UgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5DTW9kZUZsYWc7Ci0gIH0gZWxzZSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICAgIHJlc2luZm8gPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9SRVNJTkZPOwotICB9CisgICBTaVNfUHItPlNpU19TZXRGbGFnID0gMDsKIAotICBTaVNfUHItPlNpU19TZXRGbGFnID0gMDsKKyAgIG1vZGVmbGFnID0gU2lTX0dldE1vZGVGbGFnKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CiAKLSAgU2lTX1ByLT5TaVNfTW9kZVR5cGUgPSBtb2RlZmxhZyAmIE1vZGVUeXBlTWFzazsKKyAgIFNpU19Qci0+U2lTX01vZGVUeXBlID0gbW9kZWZsYWcgJiBNb2RlVHlwZU1hc2s7CiAKLSAgdGVtcGJ4ID0gMDsKLSAgaWYoU2lTX0JyaWRnZUlzT24oU2lTX1ByKSkgewotICAgIAl0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOwotI2lmIDAKLSAgIAlpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU182NjEpIHsKLQkgICAvKiBOTyAtIFlQYlByIG5vdCBzZXQgeWV0ICEgKi8KLQkgICBpZihTaVNfUHItPlNpU19ZUGJQciAmIDxhbGwgeXBicHIgZXhjZXB0IDUyNWk+KSB7Ci0JICAgICAgdGVtcCAmPSAoU2V0Q1JUMlRvSGlWaXNpb24gfCBTd2l0Y2hDUlQyIHwgU2V0U2ltdVNjYW5Nb2RlKTsgCS8qIDB4ODMgKi8KLQkgICAgICB0ZW1wIHw9IFNldENSVDJUb0hpVmlzaW9uOyAgIAkJCQkJLyogMHg4MCAqLwotICAgCSAgIH0KLQkgICBpZihTaVNfUHItPlNpU19ZUGJQciAmIDx5cGJwcjUyNWk+KSB7Ci0JICAgICAgdGVtcCAmPSAoU2V0Q1JUMlRvSGlWaXNpb24gfCBTd2l0Y2hDUlQyIHwgU2V0U2ltdVNjYW5Nb2RlKTsgCS8qIDB4ODMgKi8KLQkgICAgICB0ZW1wIHw9IFNldENSVDJUb1NWSURFTzsgIAkJCQkJLyogMHgwOCAqLwotCSAgIH0KLQl9Ci0jZW5kaWYKLSAgICAJdGVtcGJ4IHw9IHRlbXA7Ci0gICAgCXRlbXBheCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMxKSA8PCA4OwotICAgICAgICB0ZW1wYXggJj0gKERyaXZlck1vZGUgfCBMb2FkREFDRmxhZyB8IFNldE5vdFNpbXVNb2RlIHwgU2V0UEFMVFYpOwotICAgIAl0ZW1wYnggfD0gdGVtcGF4OworICAgaWYoKE1vZGVObyA+IDB4MTMpICYmICghU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSkgeworICAgICAgcmVzaW5mbyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X1JFU0lORk87CisgICB9CisKKyAgIHRlbXBieCA9IDA7CisKKyAgIGlmKFNpU19IYXZlQnJpZGdlKFNpU19QcikpIHsKKworCXRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMCk7CisJdGVtcGJ4IHw9IHRlbXA7CisJdGVtcGF4ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzEpIDw8IDg7CisJdGVtcGF4ICY9IChEcml2ZXJNb2RlIHwgTG9hZERBQ0ZsYWcgfCBTZXROb3RTaW11TW9kZSB8IFNldFBBTFRWKTsKKwl0ZW1wYnggfD0gdGVtcGF4OwogCiAjaWZkZWYgU0lTMzE1SAotCWlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xDREEpIHsKKwlpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisJICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTENEQSkgewogCSAgICAgIGlmKE1vZGVObyA9PSAweDAzKSB7Ci0JICAgICAgICAgLyogTW9kZSAweDAzIGlzIG5ldmVyIGluIGRyaXZlciBtb2RlICovCisJCSAvKiBNb2RlIDB4MDMgaXMgbmV2ZXIgaW4gZHJpdmVyIG1vZGUgKi8KIAkJIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDMxLDB4YmYpOwogCSAgICAgIH0KIAkgICAgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMxKSAmIChEcml2ZXJNb2RlID4+IDgpKSkgewotCSAgICAgICAgIC8qIFJlc2V0IExDREEgc2V0dGluZyBpZiBub3QgZHJpdmVyIG1vZGUgKi8KKwkJIC8qIFJlc2V0IExDREEgc2V0dGluZyBpZiBub3QgZHJpdmVyIG1vZGUgKi8KIAkJIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDM4LDB4ZmMpOwogCSAgICAgIH0KIAkgICAgICBpZihJU19TSVM2NTApIHsKLQkgICAgICAgICBpZihTaVNfUHItPlNpU19Vc2VMQ0RBKSB7CisJCSBpZihTaVNfUHItPlNpU19Vc2VMQ0RBKSB7CiAJCSAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg1ZikgJiAweEYwKSB7CiAJCSAgICAgICBpZigoTW9kZU5vIDw9IDB4MTMpIHx8ICghKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMxKSAmIChEcml2ZXJNb2RlID4+IDgpKSkpIHsKLQkJICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MzgsKEVuYWJsZUR1YWxFZGdlIHwgU2V0VG9MQ0RBKSk7CisJCQkgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MzgsKEVuYWJsZUR1YWxFZGdlIHwgU2V0VG9MQ0RBKSk7CiAJCSAgICAgICB9CiAJCSAgICB9CiAJCSB9CiAJICAgICAgfQogCSAgICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7Ci0gICAgICAgCSAgICAgIGlmKCh0ZW1wICYgKEVuYWJsZUR1YWxFZGdlIHwgU2V0VG9MQ0RBKSkgPT0gKEVuYWJsZUR1YWxFZGdlIHwgU2V0VG9MQ0RBKSkgewotICAgICAgICAgIAkgdGVtcGJ4IHw9IFNldENSVDJUb0xDREE7CisJICAgICAgaWYoKHRlbXAgJiAoRW5hYmxlRHVhbEVkZ2UgfCBTZXRUb0xDREEpKSA9PSAoRW5hYmxlRHVhbEVkZ2UgfCBTZXRUb0xDREEpKSB7CisJCSB0ZW1wYnggfD0gU2V0Q1JUMlRvTENEQTsKIAkgICAgICB9CiAJICAgfQogCi0JICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMUxWfFZCX1NJUzMwMkxWfFZCX1NJUzMwMkVMVikpIHsKLQkgICAgICB0ZW1wYnggJj0gfihTZXRDUlQyVG9SQU1EQUMpOwotCSAgIH0KLQotCSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHsKKwkgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsgLyogTmV3IENSIGxheW91dCAqLwogCSAgICAgIHRlbXBieCAmPSB+KFNldENSVDJUb1lQYlByNTI1NzUwIHwgU2V0Q1JUMlRvSGlWaXNpb24pOwotCSAgICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7Ci0JICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTWVBCUFIpIHsKLQkgICAgICAgICBpZih0ZW1wICYgMHgwNCkgewotCQkgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM1KSAmIDB4ZTA7Ci0JCSAgICBpZih0ZW1wID09IDB4NjApIHRlbXBieCB8PSBTZXRDUlQyVG9IaVZpc2lvbjsKLQkJICAgIGVsc2UgICAgICAgICAgICAgdGVtcGJ4IHw9IFNldENSVDJUb1lQYlByNTI1NzUwOwotCQkgfQotCSAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNISVZJU0lPTikgewotCSAgICAgICAgIGlmKHRlbXAgJiAweDA0KSB7Ci0JCSAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzUpICYgMHhlMDsKLQkJICAgIGlmKHRlbXAgPT0gMHg2MCkgdGVtcGJ4IHw9IFNldENSVDJUb0hpVmlzaW9uOworCSAgICAgIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KSAmIDB4MDQpIHsKKwkJIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSkgJiAweGUwOworCQkgaWYodGVtcCA9PSAweDYwKSB0ZW1wYnggfD0gU2V0Q1JUMlRvSGlWaXNpb247CisJCSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1lQQlBSKSB7CisJCSAgICB0ZW1wYnggfD0gU2V0Q1JUMlRvWVBiUHI1MjU3NTA7CiAJCSB9CiAJICAgICAgfQotICAJICAgfQorCSAgIH0KIAogCSAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKIAkgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzgpOwpAQCAtMTA0OCw3ICsxMDE1LDcgQEAKIAkJIHRlbXBieCB8PSBTZXRDUlQyVG9MQ0RBOwogCSAgICAgIH0KIAkgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKLQkgICAgICAgICBpZih0ZW1wICYgRW5hYmxlQ0hZUGJQcikgeworCQkgaWYodGVtcCAmIEVuYWJsZUNIWVBiUHIpIHsKIAkJICAgIHRlbXBieCB8PSBTZXRDUlQyVG9DSFlQYlByOwogCQkgfQogCSAgICAgIH0KQEAgLTEwNTcsNDQgKzEwMjQsNDkgQEAKIAogI2VuZGlmICAvKiBTSVMzMTVIICovCiAKLSAgICAJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKyAgICAgICAgaWYoIShTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWR0EyKSkgeworCSAgIHRlbXBieCAmPSB+KFNldENSVDJUb1JBTURBQyk7CisJfQorCisJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAkgICB0ZW1wID0gU2V0Q1JUMlRvU1ZJREVPICAgfAotCSAgICAgICAgICBTZXRDUlQyVG9BVklERU8gICB8Ci0JICAgICAgICAgIFNldENSVDJUb1NDQVJUICAgIHwKLQkgICAgICAgICAgU2V0Q1JUMlRvTENEQSAgICAgfAotCSAgICAgICAgICBTZXRDUlQyVG9MQ0QgICAgICB8Ci0JICAgICAgICAgIFNldENSVDJUb1JBTURBQyAgIHwKLSAgICAgICAgICAgICAgICAgIFNldENSVDJUb0hpVmlzaW9uIHwKKwkJICBTZXRDUlQyVG9BVklERU8gICB8CisJCSAgU2V0Q1JUMlRvU0NBUlQgICAgfAorCQkgIFNldENSVDJUb0xDREEgICAgIHwKKwkJICBTZXRDUlQyVG9MQ0QgICAgICB8CisJCSAgU2V0Q1JUMlRvUkFNREFDICAgfAorCQkgIFNldENSVDJUb0hpVmlzaW9uIHwKIAkJICBTZXRDUlQyVG9ZUGJQcjUyNTc1MDsKLSAgICAJfSBlbHNlIHsKLSAgICAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7Ci0gICAgICAgIAkgdGVtcCA9IFNldENSVDJUb0FWSURFTyB8CisJfSBlbHNlIHsKKwkgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisJICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7CisJCSB0ZW1wID0gU2V0Q1JUMlRvQVZJREVPIHwKIAkJICAgICAgICBTZXRDUlQyVG9TVklERU8gfAogCQkgICAgICAgIFNldENSVDJUb1NDQVJUICB8CiAJCSAgICAgICAgU2V0Q1JUMlRvTENEQSAgIHwKIAkJICAgICAgICBTZXRDUlQyVG9MQ0QgICAgfAogCQkgICAgICAgIFNldENSVDJUb0NIWVBiUHI7Ci0gICAgICAJICAgICAgfSBlbHNlIHsKLSAgICAgICAgCSB0ZW1wID0gU2V0Q1JUMlRvTENEQSAgIHwKKwkgICAgICB9IGVsc2UgeworCQkgdGVtcCA9IFNldENSVDJUb0xDREEgICB8CiAJCSAgICAgICAgU2V0Q1JUMlRvTENEOwogCSAgICAgIH0KIAkgICB9IGVsc2UgewotICAgICAgCSAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgewotICAgICAgICAgIAkgdGVtcCA9IFNldENSVDJUb1RWIHwgU2V0Q1JUMlRvTENEOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAJIHRlbXAgPSBTZXRDUlQyVG9MQ0Q7CisJICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7CisJCSB0ZW1wID0gU2V0Q1JUMlRvVFYgfCBTZXRDUlQyVG9MQ0Q7CisJICAgICAgfSBlbHNlIHsKKwkJIHRlbXAgPSBTZXRDUlQyVG9MQ0Q7CiAJICAgICAgfQogCSAgIH0KLSAgICAJfQorCX0KIAotICAgIAlpZighKHRlbXBieCAmIHRlbXApKSB7Ci0gICAgICAJICAgdGVtcGF4ID0gRGlzYWJsZUNSVDJEaXNwbGF5OwotICAgICAgCSAgIHRlbXBieCA9IDA7Ci0gICAgCX0KKwlpZighKHRlbXBieCAmIHRlbXApKSB7CisJICAgdGVtcGF4ID0gRGlzYWJsZUNSVDJEaXNwbGF5OworCSAgIHRlbXBieCA9IDA7CisJfQogCi0gICAJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLQkgICBVU0hPUlQgY2xlYXJtYXNrID0gKCBEcml2ZXJNb2RlIAkgICB8CisJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKworCSAgIHVuc2lnbmVkIHNob3J0IGNsZWFybWFzayA9ICggRHJpdmVyTW9kZSB8CiAJCQkJRGlzYWJsZUNSVDJEaXNwbGF5IHwKIAkJCQlMb2FkREFDRmxhZyAJICAgfAogCQkJCVNldE5vdFNpbXVNb2RlIAkgICB8CkBAIC0xMTAyLDEwNiArMTA3NCwxMDQgQEAKIAkJCQlTZXRQQUxUViAJICAgfAogCQkJCVN3aXRjaENSVDIJICAgfAogCQkJCVNldFNpbXVTY2FuTW9kZSApOwotICAgICAgCSAgIGlmKHRlbXBieCAmIFNldENSVDJUb0xDREEpICAgICAgICB0ZW1wYnggJj0gKGNsZWFybWFzayB8IFNldENSVDJUb0xDREEpOworCisJICAgaWYodGVtcGJ4ICYgU2V0Q1JUMlRvTENEQSkgICAgICAgIHRlbXBieCAmPSAoY2xlYXJtYXNrIHwgU2V0Q1JUMlRvTENEQSk7CiAJICAgaWYodGVtcGJ4ICYgU2V0Q1JUMlRvUkFNREFDKSAgICAgIHRlbXBieCAmPSAoY2xlYXJtYXNrIHwgU2V0Q1JUMlRvUkFNREFDKTsKIAkgICBpZih0ZW1wYnggJiBTZXRDUlQyVG9MQ0QpICAgICAgICAgdGVtcGJ4ICY9IChjbGVhcm1hc2sgfCBTZXRDUlQyVG9MQ0QpOwogCSAgIGlmKHRlbXBieCAmIFNldENSVDJUb1NDQVJUKSAgICAgICB0ZW1wYnggJj0gKGNsZWFybWFzayB8IFNldENSVDJUb1NDQVJUKTsKIAkgICBpZih0ZW1wYnggJiBTZXRDUlQyVG9IaVZpc2lvbikgICAgdGVtcGJ4ICY9IChjbGVhcm1hc2sgfCBTZXRDUlQyVG9IaVZpc2lvbik7CiAJICAgaWYodGVtcGJ4ICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHRlbXBieCAmPSAoY2xlYXJtYXNrIHwgU2V0Q1JUMlRvWVBiUHI1MjU3NTApOwotICAgCX0gZWxzZSB7Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKworCX0gZWxzZSB7CisKKwkgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAJICAgICAgaWYodGVtcGJ4ICYgU2V0Q1JUMlRvTENEQSkgewotCSAgICAgICAgIHRlbXBieCAmPSAoMHhGRjAwfFN3aXRjaENSVDJ8U2V0U2ltdVNjYW5Nb2RlKTsKKwkJIHRlbXBieCAmPSAoMHhGRjAwfFN3aXRjaENSVDJ8U2V0U2ltdVNjYW5Nb2RlKTsKIAkgICAgICB9CiAJICAgfQotICAgICAgCSAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgewotICAgICAgICAgICAgICBpZih0ZW1wYnggJiBTZXRDUlQyVG9UVikgewotICAgICAgICAgIAkgdGVtcGJ4ICY9ICgweEZGMDB8U2V0Q1JUMlRvVFZ8U3dpdGNoQ1JUMnxTZXRTaW11U2Nhbk1vZGUpOworCSAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgeworCSAgICAgIGlmKHRlbXBieCAmIFNldENSVDJUb1RWKSB7CisJCSB0ZW1wYnggJj0gKDB4RkYwMHxTZXRDUlQyVG9UVnxTd2l0Y2hDUlQyfFNldFNpbXVTY2FuTW9kZSk7CiAJICAgICAgfQotICAgICAgCSAgIH0KLSAgICAgIAkgICBpZih0ZW1wYnggJiBTZXRDUlQyVG9MQ0QpIHsKLSAgICAgICAgICAgICAgdGVtcGJ4ICY9ICgweEZGMDB8U2V0Q1JUMlRvTENEfFN3aXRjaENSVDJ8U2V0U2ltdVNjYW5Nb2RlKTsKIAkgICB9Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKwkgICBpZih0ZW1wYnggJiBTZXRDUlQyVG9MQ0QpIHsKKwkgICAgICB0ZW1wYnggJj0gKDB4RkYwMHxTZXRDUlQyVG9MQ0R8U3dpdGNoQ1JUMnxTZXRTaW11U2Nhbk1vZGUpOworCSAgIH0KKwkgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAJICAgICAgaWYodGVtcGJ4ICYgU2V0Q1JUMlRvTENEQSkgewogCSAgICAgICAgIHRlbXBieCB8PSBTZXRDUlQyVG9MQ0Q7CiAJICAgICAgfQogCSAgIH0KKwogCX0KIAotICAgIAlpZih0ZW1wYXggJiBEaXNhYmxlQ1JUMkRpc3BsYXkpIHsKLSAgICAgIAkgICBpZighKHRlbXBieCAmIChTd2l0Y2hDUlQyIHwgU2V0U2ltdVNjYW5Nb2RlKSkpIHsKLSAgICAgICAgICAgICAgdGVtcGJ4ID0gU2V0U2ltdVNjYW5Nb2RlIHwgRGlzYWJsZUNSVDJEaXNwbGF5OwotICAgICAgCSAgIH0KLSAgICAJfQorCWlmKHRlbXBheCAmIERpc2FibGVDUlQyRGlzcGxheSkgeworCSAgIGlmKCEodGVtcGJ4ICYgKFN3aXRjaENSVDIgfCBTZXRTaW11U2Nhbk1vZGUpKSkgeworCSAgICAgIHRlbXBieCA9IFNldFNpbXVTY2FuTW9kZSB8IERpc2FibGVDUlQyRGlzcGxheTsKKwkgICB9CisJfQogCi0gICAgCWlmKCEodGVtcGJ4ICYgRHJpdmVyTW9kZSkpIHRlbXBieCB8PSBTZXRTaW11U2Nhbk1vZGU7CisJaWYoISh0ZW1wYnggJiBEcml2ZXJNb2RlKSkgdGVtcGJ4IHw9IFNldFNpbXVTY2FuTW9kZTsKIAogCS8qIExWRFMvQ0hST05URUwgKExDRC9UVikgYW5kIDMwMUJESCAoTENEKSBjYW4gb25seSBiZSBzbGF2ZSBpbiA4YnBwIG1vZGVzICovCiAJaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPD0gTW9kZVZHQSkgewogCSAgIGlmKCAoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgfHwKIAkgICAgICAgKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgJiYgKHRlbXBieCAmIFNldENSVDJUb0xDRCkpICkgewotCSAgICAgICBtb2RlZmxhZyAmPSAofkNSVDJNb2RlKTsKKwkgICAgICBtb2RlZmxhZyAmPSAofkNSVDJNb2RlKTsKIAkgICB9CiAJfQogCi0gICAgCWlmKCEodGVtcGJ4ICYgU2V0U2ltdVNjYW5Nb2RlKSkgewotICAgICAgCSAgIGlmKHRlbXBieCAmIFN3aXRjaENSVDIpIHsKLSAgICAgICAgICAgICAgaWYoKCEobW9kZWZsYWcgJiBDUlQyTW9kZSkpICYmIChjaGVja2NydDJtb2RlKSkgewotCQkgaWYoIChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYKLQkJICAgICAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSApIHsKLQkJICAgIGlmKHJlc2luZm8gIT0gU0lTX1JJXzE2MDB4MTIwMCkgewotICAgICAgICAgICAgICAgICAgICAgICB0ZW1wYnggfD0gU2V0U2ltdVNjYW5Nb2RlOwotCQkgICAgfQotCQkgfSBlbHNlIHsKLSAgICAgICAgICAgIAkgICAgdGVtcGJ4IHw9IFNldFNpbXVTY2FuTW9kZTsKLQkgICAgICAgICB9CisJaWYoISh0ZW1wYnggJiBTZXRTaW11U2Nhbk1vZGUpKSB7CisJICAgaWYodGVtcGJ4ICYgU3dpdGNoQ1JUMikgeworCSAgICAgIGlmKCghKG1vZGVmbGFnICYgQ1JUMk1vZGUpKSAmJiAoY2hlY2tjcnQybW9kZSkpIHsKKwkJIGlmKHJlc2luZm8gIT0gU0lTX1JJXzE2MDB4MTIwMCkgeworCQkgICAgdGVtcGJ4IHw9IFNldFNpbXVTY2FuTW9kZTsKKwkJIH0KICAgICAgICAgICAgICAgfQotICAgICAgCSAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGlmKFNpU19CcmlkZ2VJc0VuYWJsZWQoU2lTX1ByLEh3SW5mbykpIHsKLSAgICAgICAgICAJIGlmKCEodGVtcGJ4ICYgRHJpdmVyTW9kZSkpIHsKLSAgICAgICAgICAgIAkgICAgaWYoU2lTX0JyaWRnZUluU2xhdmVtb2RlKFNpU19QcikpIHsKKwkgICB9IGVsc2UgeworCSAgICAgIGlmKFNpU19CcmlkZ2VJc0VuYWJsZWQoU2lTX1ByKSkgeworCQkgaWYoISh0ZW1wYnggJiBEcml2ZXJNb2RlKSkgeworCQkgICAgaWYoU2lTX0JyaWRnZUluU2xhdmVtb2RlKFNpU19QcikpIHsKIAkJICAgICAgIHRlbXBieCB8PSBTZXRTaW11U2Nhbk1vZGU7Ci0gICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAJICAgfQotICAgIAl9CisJCSAgICB9CisJCSB9CisJICAgICAgfQorCSAgIH0KKwl9CiAKLSAgICAJaWYoISh0ZW1wYnggJiBEaXNhYmxlQ1JUMkRpc3BsYXkpKSB7Ci0gICAgICAgICAgIGlmKHRlbXBieCAmIERyaXZlck1vZGUpIHsKLSAgICAgICAgICAgICAgaWYodGVtcGJ4ICYgU2V0U2ltdVNjYW5Nb2RlKSB7Ci0gICAgICAgICAgCSBpZigoIShtb2RlZmxhZyAmIENSVDJNb2RlKSkgJiYgKGNoZWNrY3J0Mm1vZGUpKSB7Ci0JICAgICAgICAgICAgaWYoIChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYKLQkJICAgICAgICAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSApIHsKLQkJICAgICAgIGlmKHJlc2luZm8gIT0gU0lTX1JJXzE2MDB4MTIwMCkgewotCQkgICAgICAgICAgdGVtcGJ4IHw9IFNldEluU2xhdmVNb2RlOwotCQkgICAgICAgfQotCQkgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIAkgICAgICAgdGVtcGJ4IHw9IFNldEluU2xhdmVNb2RlOwotICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHRlbXBieCB8PSBTZXRJblNsYXZlTW9kZTsKLSAgICAgIAkgICB9Ci0gICAgCX0KKwlpZighKHRlbXBieCAmIERpc2FibGVDUlQyRGlzcGxheSkpIHsKKwkgICBpZih0ZW1wYnggJiBEcml2ZXJNb2RlKSB7CisJICAgICAgaWYodGVtcGJ4ICYgU2V0U2ltdVNjYW5Nb2RlKSB7CisJCSBpZigoIShtb2RlZmxhZyAmIENSVDJNb2RlKSkgJiYgKGNoZWNrY3J0Mm1vZGUpKSB7CisJCSAgICBpZihyZXNpbmZvICE9IFNJU19SSV8xNjAweDEyMDApIHsKKwkJICAgICAgIHRlbXBieCB8PSBTZXRJblNsYXZlTW9kZTsKKwkJICAgIH0KKwkJIH0KKwkgICAgICB9CisJICAgfSBlbHNlIHsKKwkgICAgICB0ZW1wYnggfD0gU2V0SW5TbGF2ZU1vZGU7CisJICAgfQorCX0KIAotICB9CisgICB9CiAKLSAgU2lTX1ByLT5TaVNfVkJJbmZvID0gdGVtcGJ4OworICAgU2lTX1ByLT5TaVNfVkJJbmZvID0gdGVtcGJ4OwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182MzApIHsKLSAgICAgU2lTX1NldENocm9udGVsR1BJTyhTaVNfUHIsIFNpU19Qci0+U2lTX1ZCSW5mbyk7Ci0gIH0KKyNpZmRlZiBTSVMzMDAKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzYzMCkgeworICAgICAgU2lTX1NldENocm9udGVsR1BJTyhTaVNfUHIsIFNpU19Qci0+U2lTX1ZCSW5mbyk7CisgICB9CisjZW5kaWYKIAotI2lmZGVmIFRXREVCVUcKLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiAoVkJJbmZvPSAweCUwNHgsIFNldEZsYWc9MHglMDR4KVxuIiwKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisjaWYgMAorICAgcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiAoaW5pdDMwMTogVkJJbmZvPSAweCUwNHgsIFNldEZsYWc9MHglMDR4KVxuIiwKICAgICAgIFNpU19Qci0+U2lTX1ZCSW5mbywgU2lTX1ByLT5TaVNfU2V0RmxhZyk7CiAjZW5kaWYKLSNpZmRlZiBMSU5VWF9YRjg2Ci0gIHhmODZEcnZNc2dWZXJiKDAsIFhfUFJPQkVELCAzLCAiKGluaXQzMDE6IFZCSW5mbz0weCUwNHgsIFNldEZsYWc9MHglMDR4KVxuIiwKKyNlbmRpZgorI2lmZGVmIFNJU19YT1JHX1hGODYKKyNpZmRlZiBUV0RFQlVHCisgICB4Zjg2RHJ2TXNnKDAsIFhfUFJPQkVELCAiKGluaXQzMDE6IFZCSW5mbz0weCUwNHgsIFNldEZsYWc9MHglMDR4KVxuIiwKICAgICAgIFNpU19Qci0+U2lTX1ZCSW5mbywgU2lTX1ByLT5TaVNfU2V0RmxhZyk7CiAjZW5kaWYKICNlbmRpZgpAQCAtMTIxMiw0MSArMTE4Miw0MSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotU2lTX1NldFlQYlByKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfU2V0WVBiUHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAKLSAgVUNIQVIgdGVtcDsKKyAgIHVuc2lnbmVkIGNoYXIgdGVtcDsKIAotICAvKiBOb3RlOiBUaGlzIHZhcmlhYmxlIGlzIG9ubHkgdXNlZCBvbiAzMHhMViBzeXN0ZW1zLgotICAgKiBDUjM4IGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIG9uIExWRFMvQ0g3MDE5IHN5c3RlbXMuCi0gICAqIE9uIDY2MSBhbmQgbGF0ZXIsIHRoZXNlIGJpdHMgbW92ZWQgdG8gQ1IzNS4KLSAgICoKLSAgICogT24gMzAxLCAzMDFCLCBvbmx5IEhpVmlzaW9uIDEwODBpIGlzIHN1cHBvcnRlZC4KLSAgICogT24gMzB4TFYsIDMwMUMsIG9ubHkgWVBiUHIgMTA4MGkgaXMgc3VwcG9ydGVkLgotICAgKi8KKyAgIC8qIE5vdGU6IFRoaXMgdmFyaWFibGUgaXMgb25seSB1c2VkIG9uIDMweExWIHN5c3RlbXMuCisgICAgKiBDUjM4IGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIG9uIExWRFMvQ0g3MDE5IHN5c3RlbXMuCisgICAgKiBPbiA2NjEgYW5kIGxhdGVyLCB0aGVzZSBiaXRzIG1vdmVkIHRvIENSMzUuCisgICAgKgorICAgICogT24gMzAxLCAzMDFCLCBvbmx5IEhpVmlzaW9uIDEwODBpIGlzIHN1cHBvcnRlZC4KKyAgICAqIE9uIDMweExWLCAzMDFDLCBvbmx5IFlQYlByIDEwODBpIGlzIHN1cHBvcnRlZC4KKyAgICAqLwogCi0gIFNpU19Qci0+U2lTX1lQYlByID0gMDsKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgcmV0dXJuOworICAgU2lTX1ByLT5TaVNfWVBiUHIgPSAwOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSByZXR1cm47CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB7Ci0JU2lTX1ByLT5TaVNfWVBiUHIgPSBZUGJQckhpVmlzaW9uOwotICAgICB9Ci0gIH0KKyAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSkgeworICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKKwkgU2lTX1ByLT5TaVNfWVBiUHIgPSBZUGJQckhpVmlzaW9uOworICAgICAgfQorICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFMVjMwMkxWIHwgVkJfU0lTMzAxQykpIHsKLSAgICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKLQlpZih0ZW1wICYgMHgwOCkgewotCSAgIHN3aXRjaCgodGVtcCA+PiA0KSkgewotCSAgIGNhc2UgMHgwMDogU2lTX1ByLT5TaVNfWVBiUHIgPSBZUGJQcjUyNWk7ICAgICBicmVhazsKLQkgICBjYXNlIDB4MDE6IFNpU19Qci0+U2lTX1lQYlByID0gWVBiUHI1MjVwOyAgICAgYnJlYWs7Ci0JICAgY2FzZSAweDAyOiBTaVNfUHItPlNpU19ZUGJQciA9IFlQYlByNzUwcDsgICAgIGJyZWFrOwotCSAgIGNhc2UgMHgwMzogU2lTX1ByLT5TaVNfWVBiUHIgPSBZUGJQckhpVmlzaW9uOyBicmVhazsKLQkgICB9Ci0JfQotICAgICB9Ci0gIH0KKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1lQQlBSKSB7CisJIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7CisJIGlmKHRlbXAgJiAweDA4KSB7CisJICAgIHN3aXRjaCgodGVtcCA+PiA0KSkgeworCSAgICBjYXNlIDB4MDA6IFNpU19Qci0+U2lTX1lQYlByID0gWVBiUHI1MjVpOyAgICAgYnJlYWs7CisJICAgIGNhc2UgMHgwMTogU2lTX1ByLT5TaVNfWVBiUHIgPSBZUGJQcjUyNXA7ICAgICBicmVhazsKKwkgICAgY2FzZSAweDAyOiBTaVNfUHItPlNpU19ZUGJQciA9IFlQYlByNzUwcDsgICAgIGJyZWFrOworCSAgICBjYXNlIDB4MDM6IFNpU19Qci0+U2lTX1lQYlByID0gWVBiUHJIaVZpc2lvbjsgYnJlYWs7CisJICAgIH0KKwkgfQorICAgICAgfQorICAgfQogCiB9CiAKQEAgLTEyNTUsMTk5ICsxMjI1LDIwNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotU2lTX1NldFRWTW9kZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfU2V0VFZNb2RlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCB0ZW1wLCB0ZW1wMSwgcmVzaW5mbyA9IDAsIHJvbWluZGV4ID0gMDsKLSAgVUNIQVIgIE91dHB1dFNlbGVjdCA9ICpTaVNfUHItPnBTaVNfT3V0cHV0U2VsZWN0OworICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICAgdW5zaWduZWQgc2hvcnQgdGVtcCwgdGVtcDEsIHJlc2luZm8gPSAwLCByb21pbmRleCA9IDA7CisgICB1bnNpZ25lZCBjaGFyICBPdXRwdXRTZWxlY3QgPSAqU2lTX1ByLT5wU2lTX091dHB1dFNlbGVjdDsKIAotICBTaVNfUHItPlNpU19UVk1vZGUgPSAwOworICAgU2lTX1ByLT5TaVNfVFZNb2RlID0gMDsKIAotICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgcmV0dXJuOwotICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHJldHVybjsKKyAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpKSByZXR1cm47CisgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHJldHVybjsKIAotICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gICAgIHJlc2luZm8gPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9SRVNJTkZPOwotICB9CisgICBpZihNb2RlTm8gPiAweDEzKSB7CisgICAgICByZXNpbmZvID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfUkVTSU5GTzsKKyAgIH0KIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU182NjEpIHsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfNjYxKSB7CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0UEFMVFYpIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFBBTDsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldFBBTFRWKSBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUw7CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLSAgICAgICAgdGVtcCA9IDA7Ci0gICAgICAgIGlmKChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjMwKSB8fAotICAgICAgICAgICAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkpIHsKLSAgICAgICAgICAgdGVtcCA9IDB4MzU7Ci0JICAgcm9taW5kZXggPSAweGZlOwotICAgICAgICB9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICAgdGVtcCA9IDB4Mzg7Ci0JICAgcm9taW5kZXggPSAweGYzOwotCSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMzApIHJvbWluZGV4ID0gMHgxMWI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYodGVtcCkgewotICAgICAgICAgICBpZihyb21pbmRleCAmJiBTaVNfUHItPlNpU19Vc2VST00gJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKLQkgICAgICBPdXRwdXRTZWxlY3QgPSBST01BZGRyW3JvbWluZGV4XTsKLQkgICAgICBpZighKE91dHB1dFNlbGVjdCAmIEVuYWJsZVBBTE1OKSkgewotICAgICAgICAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsdGVtcCwweDNGKTsKLQkgICAgICB9Ci0JICAgfQotCSAgIHRlbXAxID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LHRlbXApOwotCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSB7Ci0gICAgICAgICAgICAgIGlmKHRlbXAxICYgRW5hYmxlUEFMTSkgewkJLyogMHg0MCAqLwotICAgICAgICAgICAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUxNOwotCSAgICAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSAmPSB+VFZTZXRQQUw7Ci0JICAgICAgfSBlbHNlIGlmKHRlbXAxICYgRW5hYmxlUEFMTikgewkvKiAweDgwICovCi0JICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMTjsKLSAgICAgICAgICAgICAgfQotCSAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGlmKHRlbXAxICYgRW5hYmxlTlRTQ0opIHsJCS8qIDB4NDAgKi8KLQkgICAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXROVFNDSjsKLSAgCSAgICAgIH0KLQkgICB9Ci0gICAgICAgIH0KLQkvKiBUcmFuc2xhdGUgSGlWaXNpb24vWVBiUHIgdG8gb3VyIG5ldyBmbGFncyAqLwotCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB7Ci0JICAgaWYoU2lTX1ByLT5TaVNfWVBiUHIgPT0gWVBiUHI3NTBwKSAgICAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRZUGJQcjc1MHA7Ci0JICAgZWxzZSBpZihTaVNfUHItPlNpU19ZUGJQciA9PSBZUGJQcjUyNXApICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRZUGJQcjUyNXA7Ci0JICAgZWxzZQlpZihTaVNfUHItPlNpU19ZUGJQciA9PSBZUGJQckhpVmlzaW9uKSBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRIaVZpc2lvbjsKLQkgICBlbHNlCQkJCQkgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0WVBiUHI1MjVpOwotCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldFlQYlByNzUwcCB8IFRWU2V0WVBiUHI1MjVwIHwgVFZTZXRZUGJQcjUyNWkpKSB7Ci0JICAgICAgU2lTX1ByLT5TaVNfVkJJbmZvICY9IH5TZXRDUlQyVG9IaVZpc2lvbjsKLQkgICAgICBTaVNfUHItPlNpU19WQkluZm8gfD0gU2V0Q1JUMlRvWVBiUHI1MjU3NTA7Ci0JICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0SGlWaXNpb24pIHsKLQkgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUw7Ci0JICAgfQotCX0KLSAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgewotICAgICAgICBpZihTaVNfUHItPlNpU19DSE92ZXJTY2FuKSB7Ci0gICAgICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMSkgewotICAgICAgICAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzUpOwotICAgICAgICAgICAgICBpZigodGVtcCAmIFRWT3ZlclNjYW4pIHx8IChTaVNfUHItPlNpU19DSE92ZXJTY2FuID09IDEpKSB7Ci0JICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0Q0hPdmVyU2NhbjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAyKSB7Ci0gICAgICAJICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDc5KTsKLSAgICAgIAkgICAgICBpZigodGVtcCAmIDB4ODApIHx8IChTaVNfUHItPlNpU19DSE92ZXJTY2FuID09IDEpKSB7Ci0JICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0Q0hPdmVyU2NhbjsKLSAJICAgICAgfQotCSAgIH0KLSAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfQ0hTT3ZlclNjYW4pIHsKLSAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0Q0hPdmVyU2NhbjsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMikgewotCSAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7Ci0gICAgIAkgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkgewotICAgICAgICAgICAgICBpZih0ZW1wICYgRW5hYmxlUEFMTSkgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUxNOwotCSAgICAgIGVsc2UgaWYodGVtcCAmIEVuYWJsZVBBTE4pIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFBBTE47Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgaWYodGVtcCAmIEVuYWJsZU5UU0NKKSB7Ci0JICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0TlRTQ0o7Ci0gIAkgICAgICB9Ci0JICAgfQotCX0KLSAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKwkgdGVtcCA9IDA7CisJIGlmKChTaVNfUHItPkNoaXBUeXBlID09IFNJU182MzApIHx8CisJICAgIChTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApKSB7CisJICAgIHRlbXAgPSAweDM1OworCSAgICByb21pbmRleCA9IDB4ZmU7CisJIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisJICAgIHRlbXAgPSAweDM4OworCSAgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgWEdJXzIwKSB7CisJICAgICAgIHJvbWluZGV4ID0gMHhmMzsKKwkgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzMwKSByb21pbmRleCA9IDB4MTFiOworCSAgICB9CisJIH0KKwkgaWYodGVtcCkgeworCSAgICBpZihyb21pbmRleCAmJiBTaVNfUHItPlNpU19Vc2VST00gJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKKwkgICAgICAgT3V0cHV0U2VsZWN0ID0gUk9NQWRkcltyb21pbmRleF07CisJICAgICAgIGlmKCEoT3V0cHV0U2VsZWN0ICYgRW5hYmxlUEFMTU4pKSB7CisJCSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LHRlbXAsMHgzRik7CisJICAgICAgIH0KKwkgICAgfQorCSAgICB0ZW1wMSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCx0ZW1wKTsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKKwkgICAgICAgaWYodGVtcDEgJiBFbmFibGVQQUxNKSB7CQkvKiAweDQwICovCisJCSAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMTTsKKwkJICBTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWU2V0UEFMOworCSAgICAgICB9IGVsc2UgaWYodGVtcDEgJiBFbmFibGVQQUxOKSB7CS8qIDB4ODAgKi8KKwkJICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUxOOworCSAgICAgICB9CisJICAgIH0gZWxzZSB7CisJICAgICAgIGlmKHRlbXAxICYgRW5hYmxlTlRTQ0opIHsJLyogMHg0MCAqLworCQkgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldE5UU0NKOworCSAgICAgICB9CisJICAgIH0KKwkgfQorCSAvKiBUcmFuc2xhdGUgSGlWaXNpb24vWVBiUHIgdG8gb3VyIG5ldyBmbGFncyAqLworCSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgeworCSAgICBpZihTaVNfUHItPlNpU19ZUGJQciA9PSBZUGJQcjc1MHApICAgICAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFlQYlByNzUwcDsKKwkgICAgZWxzZSBpZihTaVNfUHItPlNpU19ZUGJQciA9PSBZUGJQcjUyNXApICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRZUGJQcjUyNXA7CisJICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfWVBiUHIgPT0gWVBiUHJIaVZpc2lvbikgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0SGlWaXNpb247CisJICAgIGVsc2UJCQkJICAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRZUGJQcjUyNWk7CisJICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldFlQYlByNzUwcCB8IFRWU2V0WVBiUHI1MjVwIHwgVFZTZXRZUGJQcjUyNWkpKSB7CisJICAgICAgIFNpU19Qci0+U2lTX1ZCSW5mbyAmPSB+U2V0Q1JUMlRvSGlWaXNpb247CisJICAgICAgIFNpU19Qci0+U2lTX1ZCSW5mbyB8PSBTZXRDUlQyVG9ZUGJQcjUyNTc1MDsKKwkgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0SGlWaXNpb24pIHsKKwkgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMOworCSAgICB9CisJIH0KKyAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKKwkgaWYoU2lTX1ByLT5TaVNfQ0hPdmVyU2NhbikgeworCSAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDEpIHsKKwkgICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM1KTsKKwkgICAgICAgaWYoKHRlbXAgJiBUVk92ZXJTY2FuKSB8fCAoU2lTX1ByLT5TaVNfQ0hPdmVyU2NhbiA9PSAxKSkgeworCQkgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldENIT3ZlclNjYW47CisJICAgICAgIH0KKwkgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMikgeworCSAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NzkpOworCSAgICAgICBpZigodGVtcCAmIDB4ODApIHx8IChTaVNfUHItPlNpU19DSE92ZXJTY2FuID09IDEpKSB7CisJCSAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0Q0hPdmVyU2NhbjsKKwkgICAgICAgfQorCSAgICB9CisJICAgIGlmKFNpU19Qci0+U2lTX0NIU092ZXJTY2FuKSB7CisJICAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldENIT3ZlclNjYW47CisJICAgIH0KKwkgfQorCSBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKKwkgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKKwkgICAgICAgaWYodGVtcCAmIEVuYWJsZVBBTE0pICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMTTsKKwkgICAgICAgZWxzZSBpZih0ZW1wICYgRW5hYmxlUEFMTikgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMTjsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgaWYodGVtcCAmIEVuYWJsZU5UU0NKKSB7CisJCSAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0TlRTQ0o7CisJICAgICAgIH0KKwkgICAgfQorCSB9CisgICAgICB9CiAKLSAgfSBlbHNlIHsgIC8qIDY2MSBhbmQgbGF0ZXIgKi8KKyAgIH0gZWxzZSB7ICAvKiA2NjEgYW5kIGxhdGVyICovCiAKLSAgICAgdGVtcDEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSk7Ci0gICAgIGlmKHRlbXAxICYgMHgwMSkgewotICAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUw7Ci0JaWYodGVtcDEgJiAweDA4KSB7Ci0JICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMTjsKLQl9IGVsc2UgaWYodGVtcDEgJiAweDA0KSB7Ci0JICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLQkgICAgICBTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWU2V0UEFMOwotCSAgIH0KLQkgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUxNOwotCX0KLSAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYodGVtcDEgJiAweDAyKSB7Ci0JICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0TlRTQ0o7Ci0JfQotICAgICB9Ci0gICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMikgewotICAgICAgICBpZihTaVNfUHItPlNpU19DSE92ZXJTY2FuKSB7Ci0gICAgICAgICAgIGlmKCh0ZW1wMSAmIDB4MTApIHx8IChTaVNfUHItPlNpU19DSE92ZXJTY2FuID09IDEpKSB7Ci0JICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0Q0hPdmVyU2NhbjsKLQkgICB9Ci0JfQotICAgICB9Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1lQYlByNTI1NzUwKSB7Ci0JICAgdGVtcDEgJj0gMHhlMDsKLQkgICBpZih0ZW1wMSA9PSAweDAwKSAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFlQYlByNTI1aTsKLQkgICBlbHNlIGlmKHRlbXAxID09IDB4MjApIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFlQYlByNTI1cDsKLQkgICBlbHNlIGlmKHRlbXAxID09IDB4NDApIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFlQYlByNzUwcDsKLQl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKLQkgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gKFRWU2V0SGlWaXNpb24gfCBUVlNldFBBTCk7Ci0JfQotCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9ZUGJQcjUyNTc1MCB8IFNldENSVDJUb0hpVmlzaW9uKSkgewotCSAgIGlmKHJlc2luZm8gPT0gU0lTX1JJXzgwMHg0ODAgfHwgcmVzaW5mbyA9PSBTSVNfUklfMTAyNHg1NzYgfHwgcmVzaW5mbyA9PSBTSVNfUklfMTI4MHg3MjApIHsKLQkgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZBc3BlY3QxNjk7Ci0JICAgfSBlbHNlIHsKLQkgICAgICB0ZW1wMSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM5KTsKLQkgICAgICBpZih0ZW1wMSAmIDB4MDIpIHsKLQkJIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldFlQYlByNzUwcCB8IFRWU2V0SGlWaXNpb24pKSB7Ci0JCSAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZBc3BlY3QxNjk7Ci0JCSB9IGVsc2UgewotCQkgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWQXNwZWN0NDNMQjsKLQkJIH0KLQkgICAgICB9IGVsc2UgewotCQkgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWQXNwZWN0NDM7Ci0JICAgICAgfQotCSAgIH0KLQl9Ci0gICAgIH0KLSAgfQorICAgICAgdGVtcDEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSk7CisgICAgICBpZih0ZW1wMSAmIDB4MDEpIHsKKwkgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMOworCSBpZih0ZW1wMSAmIDB4MDgpIHsKKwkgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMTjsKKwkgfSBlbHNlIGlmKHRlbXAxICYgMHgwNCkgeworCSAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgeworCSAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWU2V0UEFMOworCSAgICB9CisJICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFBBTE07CisJIH0KKyAgICAgIH0gZWxzZSB7CisJIGlmKHRlbXAxICYgMHgwMikgeworCSAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXROVFNDSjsKKwkgfQorICAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAyKSB7CisJIGlmKFNpU19Qci0+U2lTX0NIT3ZlclNjYW4pIHsKKwkgICAgaWYoKHRlbXAxICYgMHgxMCkgfHwgKFNpU19Qci0+U2lTX0NIT3ZlclNjYW4gPT0gMSkpIHsKKwkgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0Q0hPdmVyU2NhbjsKKwkgICAgfQorCSB9CisgICAgICB9CisgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgeworCSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgeworCSAgICB0ZW1wMSAmPSAweGUwOworCSAgICBpZih0ZW1wMSA9PSAweDAwKSAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFlQYlByNTI1aTsKKwkgICAgZWxzZSBpZih0ZW1wMSA9PSAweDIwKSBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRZUGJQcjUyNXA7CisJICAgIGVsc2UgaWYodGVtcDEgPT0gMHg0MCkgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0WVBiUHI3NTBwOworCSB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKKwkgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IChUVlNldEhpVmlzaW9uIHwgVFZTZXRQQUwpOworCSB9CisJIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9ZUGJQcjUyNTc1MCB8IFNldENSVDJUb0hpVmlzaW9uKSkgeworCSAgICBpZihyZXNpbmZvID09IFNJU19SSV84MDB4NDgwIHx8IHJlc2luZm8gPT0gU0lTX1JJXzEwMjR4NTc2IHx8IHJlc2luZm8gPT0gU0lTX1JJXzEyODB4NzIwKSB7CisJICAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVkFzcGVjdDE2OTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgdGVtcDEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOSk7CisJICAgICAgIGlmKHRlbXAxICYgMHgwMikgeworCQkgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldFlQYlByNzUwcCB8IFRWU2V0SGlWaXNpb24pKSB7CisJCSAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWQXNwZWN0MTY5OworCQkgIH0gZWxzZSB7CisJCSAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWQXNwZWN0NDNMQjsKKwkJICB9CisJICAgICAgIH0gZWxzZSB7CisJCSAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWQXNwZWN0NDM7CisJICAgICAgIH0KKwkgICAgfQorCSB9CisgICAgICB9CisgICB9CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvU0NBUlQpIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFBBTDsKKyAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1NDQVJUKSBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUw7CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKyAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKLSAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMOwotCVNpU19Qci0+U2lTX1RWTW9kZSAmPSB+KFRWU2V0UEFMTSB8IFRWU2V0UEFMTiB8IFRWU2V0TlRTQ0opOwotICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI1MjVpIHwgVFZTZXRZUGJQcjUyNXAgfCBUVlNldFlQYlByNzUwcCkpIHsKLQkgICBTaVNfUHItPlNpU19UVk1vZGUgJj0gfihUVlNldFBBTCB8IFRWU2V0TlRTQ0ogfCBUVlNldFBBTE0gfCBUVlNldFBBTE4pOwotCX0KLSAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKKwkgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMOworCSBTaVNfUHItPlNpU19UVk1vZGUgJj0gfihUVlNldFBBTE0gfCBUVlNldFBBTE4gfCBUVlNldE5UU0NKKTsKKyAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgeworCSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRZUGJQcjUyNWkgfCBUVlNldFlQYlByNTI1cCB8IFRWU2V0WVBiUHI3NTBwKSkgeworCSAgICBTaVNfUHItPlNpU19UVk1vZGUgJj0gfihUVlNldFBBTCB8IFRWU2V0TlRTQ0ogfCBUVlNldFBBTE0gfCBUVlNldFBBTE4pOworCSB9CisgICAgICB9CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKLSAgICAgICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXROb3RTaW11TW9kZSkpIHsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0VFZTaW11TW9kZTsKLSAgICAgICAgfQotICAgICB9CisgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgeworCSBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldE5vdFNpbXVNb2RlKSkgeworCSAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRUVlNpbXVNb2RlOworCSB9CisgICAgICB9CiAKLSAgICAgaWYoIShTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkpIHsKLSAgICAgICAgLyogQklPUyBzZXRzIFRWTlRTQzEwMjQgd2l0aG91dCBjaGVja2luZyA1MjVwIGhlcmUuIFdyb25nPyAqLwotICAgICAgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldEhpVmlzaW9uIHwgVFZTZXRZUGJQcjUyNXAgfCBUVlNldFlQYlByNzUwcCkpKSB7Ci0gICAgICAgICAgIGlmKHJlc2luZm8gPT0gU0lTX1JJXzEwMjR4NzY4KSB7Ci0gICAgICAgICAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldE5UU0MxMDI0OwotCSAgIH0KLSAgICAgICAgfQotICAgICB9CisgICAgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSkgeworCSBpZihyZXNpbmZvID09IFNJU19SSV8xMDI0eDc2OCkgeworCSAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNTI1cCkgeworCSAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXQ1MjVwMTAyNDsKKwkgICAgfSBlbHNlIGlmKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0SGlWaXNpb24gfCBUVlNldFlQYlByNzUwcCkpKSB7CisJICAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldE5UU0MxMDI0OworCSAgICB9CisJIH0KKyAgICAgIH0KIAotICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZSUExMRElWMlhPOwotICAgICBpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pICYmCi0gICAgICAgIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHsKLQlTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWUlBMTERJVjJYTzsKLSAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldFlQYlByNTI1cCB8IFRWU2V0WVBiUHI3NTBwKSkgewotICAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWUlBMTERJVjJYTzsKLSAgICAgfSBlbHNlIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSkgewotICAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFRWU2ltdU1vZGUpIHsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlICY9IH5UVlJQTExESVYyWE87Ci0gICAgICAgIH0KLSAgICAgfQorICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWUlBMTERJVjJYTzsKKyAgICAgIGlmKChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgJiYKKwkgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgeworCSBTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWUlBMTERJVjJYTzsKKyAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRZUGJQcjUyNXAgfCBUVlNldFlQYlByNzUwcCkpIHsKKwkgU2lTX1ByLT5TaVNfVFZNb2RlICY9IH5UVlJQTExESVYyWE87CisgICAgICB9IGVsc2UgaWYoIShTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpKSB7CisJIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgeworCSAgICBTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWUlBMTERJVjJYTzsKKwkgfQorICAgICAgfQogCi0gIH0KKyAgIH0KIAotICBTaVNfUHItPlNpU19WQkluZm8gJj0gflNldFBBTFRWOworICAgU2lTX1ByLT5TaVNfVkJJbmZvICY9IH5TZXRQQUxUVjsKIAorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCi0gIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiKGluaXQzMDE6IFRWTW9kZSAleCwgVkJJbmZvICV4KVxuIiwgU2lTX1ByLT5TaVNfVFZNb2RlLCBTaVNfUHItPlNpU19WQkluZm8pOworICAgeGY4NkRydk1zZygwLCBYX0lORk8sICIoaW5pdDMwMTogVFZNb2RlICV4LCBWQkluZm8gJXgpXG4iLCBTaVNfUHItPlNpU19UVk1vZGUsIFNpU19Qci0+U2lTX1ZCSW5mbyk7CisjZW5kaWYKICNlbmRpZgogfQogCkBAIC0xNDU1LDQxICsxNDMwLDQ2IEBACiAvKiAgICAgICAgICAgICAgIEdFVCBMQ0QgSU5GTyAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIFVTSE9SVAotU2lTX0dldEJJT1NMQ0RSZXNJbmZvKFNpU19Qcml2YXRlICpTaVNfUHIpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19HZXRCSU9TTENEUmVzSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIFVTSE9SVCB0ZW1wID0gU2lTX1ByLT5TaVNfTENEUmVzSW5mbzsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXAgPSBTaVNfUHItPlNpU19MQ0RSZXNJbmZvOwogICAgLyogVHJhbnNsYXRlIG15IExDRFJlc0luZm8gdG8gQklPUyB2YWx1ZSAqLwotICAgaWYodGVtcCA9PSBQYW5lbF8xMjgweDc2OF8yKSAgdGVtcCA9IFBhbmVsXzEyODB4NzY4OwotICAgaWYodGVtcCA9PSBQYW5lbF8xMjgweDgwMF8yKSAgdGVtcCA9IFBhbmVsXzEyODB4ODAwOworICAgc3dpdGNoKHRlbXApIHsKKyAgIGNhc2UgUGFuZWxfMTI4MHg3NjhfMjogdGVtcCA9IFBhbmVsXzEyODB4NzY4OyAgICBicmVhazsKKyAgIGNhc2UgUGFuZWxfMTI4MHg4MDBfMjogdGVtcCA9IFBhbmVsXzEyODB4ODAwOyAgICBicmVhazsKKyAgIGNhc2UgUGFuZWxfMTI4MHg4NTQ6ICAgdGVtcCA9IFBhbmVsNjYxXzEyODB4ODU0OyBicmVhazsKKyAgIH0KICAgIHJldHVybiB0ZW1wOwogfQogCiBzdGF0aWMgdm9pZAotU2lTX0dldExDREluZm9CSU9TKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfR2V0TENESW5mb0JJT1Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAjaWZkZWYgU0lTMzE1SAotICAgVUNIQVIgICpST01BZGRyOwotICAgVVNIT1JUIHRlbXA7CisgICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkcjsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXA7CiAKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJQYW5lbGRhdGEgZHJpdmVyOiBbJWQgJWRdIFtIICVkICVkXSBbViAlZCAlZF0gW0MgJWQgMHglMDJ4IDB4JTAyeF1cbiIsCi0gICAgICAJU2lTX1ByLT5QYW5lbEhULCBTaVNfUHItPlBhbmVsVlQsCisJU2lTX1ByLT5QYW5lbEhULCBTaVNfUHItPlBhbmVsVlQsCiAJU2lTX1ByLT5QYW5lbEhSUywgU2lTX1ByLT5QYW5lbEhSRSwKIAlTaVNfUHItPlBhbmVsVlJTLCBTaVNfUHItPlBhbmVsVlJFLAogCVNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTVdLkNMT0NLLAogCVNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTVdLlBhcnQ0X0EsCiAJU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YVtTaVNfUHItPlBhbmVsVkNMS0lkeDMxNV0uUGFydDRfQik7CiAjZW5kaWYKKyNlbmRpZgogCi0gICBpZigoUk9NQWRkciA9IEdldExDRFN0cnVjdFB0cjY2MShTaVNfUHIsIEh3SW5mbykpKSB7CisgICBpZigoUk9NQWRkciA9IEdldExDRFN0cnVjdFB0cjY2MShTaVNfUHIpKSkgewogICAgICAgaWYoKHRlbXAgPSBTSVNHRVRST01XKDYpKSAhPSBTaVNfUHItPlBhbmVsSFQpIHsKLSAgICAgICAgIFNpU19Qci0+U2lTX05lZWRSb21Nb2RlRGF0YSA9IFRSVUU7CisJIFNpU19Qci0+U2lTX05lZWRSb21Nb2RlRGF0YSA9IFRSVUU7CiAJIFNpU19Qci0+UGFuZWxIVCAgPSB0ZW1wOwogICAgICAgfQogICAgICAgaWYoKHRlbXAgPSBTSVNHRVRST01XKDgpKSAhPSBTaVNfUHItPlBhbmVsVlQpIHsKLSAgICAgICAgIFNpU19Qci0+U2lTX05lZWRSb21Nb2RlRGF0YSA9IFRSVUU7Ci0gICAgICAgICBTaVNfUHItPlBhbmVsVlQgID0gdGVtcDsKKwkgU2lTX1ByLT5TaVNfTmVlZFJvbU1vZGVEYXRhID0gVFJVRTsKKwkgU2lTX1ByLT5QYW5lbFZUICA9IHRlbXA7CiAgICAgICB9CiAgICAgICBTaVNfUHItPlBhbmVsSFJTID0gU0lTR0VUUk9NVygxMCk7CiAgICAgICBTaVNfUHItPlBhbmVsSFJFID0gU0lTR0VUUk9NVygxMik7CkBAIC0xNDk3LDU2ICsxNDc3LDU4IEBACiAgICAgICBTaVNfUHItPlBhbmVsVlJFID0gU0lTR0VUUk9NVygxNik7CiAgICAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEtfQ1VTVE9NXzMxNTsKICAgICAgIFNpU19Qci0+U2lTX1ZDTEtEYXRhW1ZDTEtfQ1VTVE9NXzMxNV0uQ0xPQ0sgPQotCSBTaVNfUHItPlNpU19WQlZDTEtEYXRhW1ZDTEtfQ1VTVE9NXzMxNV0uQ0xPQ0sgPSAoVVNIT1JUKSgoVUNIQVIpUk9NQWRkclsxOF0pOworCSBTaVNfUHItPlNpU19WQlZDTEtEYXRhW1ZDTEtfQ1VTVE9NXzMxNV0uQ0xPQ0sgPSAodW5zaWduZWQgc2hvcnQpKCh1bnNpZ25lZCBjaGFyKVJPTUFkZHJbMThdKTsKICAgICAgIFNpU19Qci0+U2lTX1ZDTEtEYXRhW1ZDTEtfQ1VTVE9NXzMxNV0uU1IyQiA9CiAJIFNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbVkNMS19DVVNUT01fMzE1XS5QYXJ0NF9BID0gUk9NQWRkclsxOV07CiAgICAgICBTaVNfUHItPlNpU19WQ0xLRGF0YVtWQ0xLX0NVU1RPTV8zMTVdLlNSMkMgPQogCSBTaVNfUHItPlNpU19WQlZDTEtEYXRhW1ZDTEtfQ1VTVE9NXzMxNV0uUGFydDRfQiA9IFJPTUFkZHJbMjBdOwogCisjaWZkZWYgU0lTX1hPUkdfWEY4NgogI2lmZGVmIFRXREVCVUcKICAgICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiUGFuZWxkYXRhIEJJT1M6ICBbJWQgJWRdIFtIICVkICVkXSBbViAlZCAlZF0gW0MgJWQgMHglMDJ4IDB4JTAyeF1cbiIsCi0gICAgICAJU2lTX1ByLT5QYW5lbEhULCBTaVNfUHItPlBhbmVsVlQsCisJU2lTX1ByLT5QYW5lbEhULCBTaVNfUHItPlBhbmVsVlQsCiAJU2lTX1ByLT5QYW5lbEhSUywgU2lTX1ByLT5QYW5lbEhSRSwKIAlTaVNfUHItPlBhbmVsVlJTLCBTaVNfUHItPlBhbmVsVlJFLAogCVNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTVdLkNMT0NLLAogCVNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTVdLlBhcnQ0X0EsCiAJU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YVtTaVNfUHItPlBhbmVsVkNMS0lkeDMxNV0uUGFydDRfQik7CiAjZW5kaWYKKyNlbmRpZgogCiAgICB9CiAjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQKLVNpU19DaGVja1NjYWxpbmcoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHJlc2luZm8sIGNvbnN0IFVDSEFSICpub25zY2FsaW5nbW9kZXMpCitTaVNfQ2hlY2tTY2FsaW5nKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCByZXNpbmZvLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqbm9uc2NhbGluZ21vZGVzKQogewotICAgIGludCBpID0gMDsKLSAgICB3aGlsZShub25zY2FsaW5nbW9kZXNbaV0gIT0gMHhmZikgewotICAgICAgICBpZihub25zY2FsaW5nbW9kZXNbaSsrXSA9PSByZXNpbmZvKSB7Ci0JICAgaWYoKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgfHwKLQkgICAgICAoU2lTX1ByLT5Vc2VQYW5lbFNjYWxlciA9PSAtMSkpIHsKLQkgICAgICBTaVNfUHItPlNpU19MQ0RJbmZvIHw9IERvbnRFeHBhbmRMQ0Q7Ci0JICAgfQotCSAgIGJyZWFrOwotCX0KLSAgICB9CisgICBpbnQgaSA9IDA7CisgICB3aGlsZShub25zY2FsaW5nbW9kZXNbaV0gIT0gMHhmZikgeworICAgICAgaWYobm9uc2NhbGluZ21vZGVzW2krK10gPT0gcmVzaW5mbykgeworCSBpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB8fAorCSAgICAoU2lTX1ByLT5Vc2VQYW5lbFNjYWxlciA9PSAtMSkpIHsKKwkgICAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBEb250RXhwYW5kTENEOworCSB9CisJIGJyZWFrOworICAgICAgfQorICAgfQogfQogCiB2b2lkCi1TaVNfR2V0TENEUmVzSW5mbyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0JCSAgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19HZXRMQ0RSZXNJbmZvKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogeworICB1bnNpZ25lZCBzaG9ydCB0ZW1wLG1vZGVmbGFnLHJlc2luZm89MCxtb2RleHJlcz0wLG1vZGV5cmVzPTA7CisgIEJPT0xFQU4gcGFuZWxjYW5zY2FsZSA9IEZBTFNFOwogI2lmZGVmIFNJUzMwMAotICBVQ0hBUiAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBTZXJpZXNMQ0RSZXNbXSA9CisgIHVuc2lnbmVkIGNoYXIgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBTZXJpZXNMQ0RSZXNbXSA9CiAgICAgICAgICAgeyAwLCAgMSwgIDIsICAzLCAgNywgIDQsICA1LCAgOCwKIAkgICAgMCwgIDAsIDEwLCAgMCwgIDAsICAwLCAgMCwgMTUgfTsKICNlbmRpZgogI2lmZGVmIFNJUzMxNUgKLSAgVUNIQVIgICAqbXlwdHIgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyICAgKm15cHRyID0gTlVMTDsKICNlbmRpZgotICBVU0hPUlQgIHRlbXAsbW9kZWZsYWcscmVzaW5mbz0wLG1vZGV4cmVzPTAsbW9kZXlyZXM9MDsKLSAgQk9PTEVBTiBwYW5lbGNhbnNjYWxlID0gRkFMU0U7CiAKICAgU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAgPSAwOwogICBTaVNfUHItPlNpU19MQ0RUeXBlSW5mbyA9IDA7CkBAIC0xNTU3LDE0ICsxNTM5LDE0IEBACiAgIFNpU19Qci0+UGFuZWxWUkUgICAgICAgID0gOTk5OyAvKiBWU3luYyBlbmQgKi8KICAgU2lTX1ByLT5TaVNfTmVlZFJvbU1vZGVEYXRhID0gRkFMU0U7CiAKKyAgLyogQWx0ZXJuYXRpdmUgMTYwMHgxMjAwQDYwIHRpbWluZyBmb3IgMTYwMHgxMjAwIExDREEgKi8KKyAgU2lTX1ByLT5BbHRlcm5hdGUxNjAweDEyMDAgPSBGQUxTRTsKKwogICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkpIHJldHVybjsKIAotICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gIH0gZWxzZSBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPkNNb2RlRmxhZzsKLSAgfSBlbHNlIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKKyAgbW9kZWZsYWcgPSBTaVNfR2V0TW9kZUZsYWcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKworICBpZigoTW9kZU5vID4gMHgxMykgJiYgKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpKSB7CiAgICAgIHJlc2luZm8gPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9SRVNJTkZPOwogICAgICBtb2RleHJlcyA9IFNpU19Qci0+U2lTX01vZGVSZXNJbmZvW3Jlc2luZm9dLkhUb3RhbDsKICAgICAgbW9kZXlyZXMgPSBTaVNfUHItPlNpU19Nb2RlUmVzSW5mb1tyZXNpbmZvXS5WVG90YWw7CkBAIC0xNTc1LDE2ICsxNTU3LDE2IEBACiAgIC8qIEZvciBicm9rZW4gQklPU2VzOiBBc3N1bWUgMTAyNHg3NjggKi8KICAgaWYodGVtcCA9PSAwKSB0ZW1wID0gMHgwMjsKIAotICBpZigoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgfHwgKFNpU19Qci0+U2lTX1JPTU5ldykpIHsKKyAgaWYoKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzY2MSkgfHwgKFNpU19Qci0+U2lTX1JPTU5ldykpIHsKICAgICAgU2lTX1ByLT5TaVNfTENEVHlwZUluZm8gPSAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzkpICYgMHg3YykgPj4gMjsKLSAgfSBlbHNlIGlmKChId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB8fCAoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkpIHsKKyAgfSBlbHNlIGlmKChTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHx8IChTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpKSB7CiAgICAgIFNpU19Qci0+U2lTX0xDRFR5cGVJbmZvID0gdGVtcCA+PiA0OwogICB9IGVsc2UgewogICAgICBTaVNfUHItPlNpU19MQ0RUeXBlSW5mbyA9ICh0ZW1wICYgMHgwRikgLSAxOwogICB9CiAgIHRlbXAgJj0gMHgwZjsKICNpZmRlZiBTSVMzMDAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgeworICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKICAgICAgLyogVmVyeSBvbGQgQklPU2VzIG9ubHkga25vdyA3IHNpemVzIChOZXRWaXN0YSAyMTc5LCAxLjAxZykgKi8KICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSB7CiAgICAgICAgIGlmKHRlbXAgPCAweDBmKSB0ZW1wICY9IDB4MDc7CkBAIC0xNTk1LDE3ICsxNTc3LDIyIEBACiAjZW5kaWYKIAogICAvKiBUcmFuc2xhdGUgdG8gb3VyIGludGVybmFsIHR5cGVzICovCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU181NTApIHsKLSAgICAgaWYodGVtcCA9PSBQYW5lbDMxMF82NDB4NDgwXzIpIHRlbXAgPSBQYW5lbF82NDB4NDgwXzI7Ci0gICAgIGlmKHRlbXAgPT0gUGFuZWwzMTBfNjQweDQ4MF8zKSB0ZW1wID0gUGFuZWxfNjQweDQ4MF8zOworI2lmZGVmIFNJUzMxNUgKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNTUwKSB7CisgICAgIGlmICAgICAodGVtcCA9PSBQYW5lbDMxMF8xMTUyeDc2OCkgIHRlbXAgPSBQYW5lbF8zMjB4MjQwXzI7IC8qIFZlcmlmaWVkIHdvcmtpbmcgKi8KKyAgICAgZWxzZSBpZih0ZW1wID09IFBhbmVsMzEwXzMyMHgyNDBfMikgdGVtcCA9IFBhbmVsXzMyMHgyNDBfMjsKKyAgICAgZWxzZSBpZih0ZW1wID09IFBhbmVsMzEwXzMyMHgyNDBfMykgdGVtcCA9IFBhbmVsXzMyMHgyNDBfMzsKKyAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzY2MSkgeworICAgICBpZih0ZW1wID09IFBhbmVsNjYxXzEyODB4ODU0KSAgICAgICB0ZW1wID0gUGFuZWxfMTI4MHg4NTQ7CiAgIH0KKyNlbmRpZgogCi0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsJLyogU2lTIExWRFMgKi8KKyAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewkJLyogU2lTIExWRFMgKi8KICAgICAgaWYodGVtcCA9PSBQYW5lbDMxMF8xMjgweDc2OCkgewogICAgICAgICB0ZW1wID0gUGFuZWxfMTI4MHg3NjhfMjsKICAgICAgfQogICAgICBpZihTaVNfUHItPlNpU19ST01OZXcpIHsKLSAgICAgICAgaWYodGVtcCA9PSBQYW5lbDY2MV8xMjgweDgwMCkgeworCWlmKHRlbXAgPT0gUGFuZWw2NjFfMTI4MHg4MDApIHsKIAkgICB0ZW1wID0gUGFuZWxfMTI4MHg4MDBfMjsKIAl9CiAgICAgIH0KQEAgLTE2MTMsMTMgKzE2MDAsMTcgQEAKIAogICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID0gdGVtcDsKIAorI2lmZGVmIFNJUzMwMAogICBpZihTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTM2NikgewotICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID0gUGFuZWxfQmFyY28xMzY2OworCVNpU19Qci0+U2lTX0xDRFJlc0luZm8gPSBQYW5lbF9CYXJjbzEzNjY7CiAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgewotICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID0gUGFuZWxfODQ4eDQ4MDsKKwlTaVNfUHItPlNpU19MQ0RSZXNJbmZvID0gUGFuZWxfODQ4eDQ4MDsKKyAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODU2KSB7CisJU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9IFBhbmVsXzg1Nng0ODA7CiAgICAgIH0KICAgfQorI2VuZGlmCiAKICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA8IFNpU19Qci0+U2lTX1BhbmVsTWluMzAxKQpAQCAtMTYzMywxMCArMTYyNCwxNiBAQAogICBTaVNfUHItPlNpU19MQ0RJbmZvID0gdGVtcCAmIH4weDAwMGU7CiAgIC8qIE5lZWQgdGVtcCBiZWxvdyEgKi8KIAotICAvKiBUaGVzZSBjYW4ndCBzY2FsZSBubyBtYXR0ZXIgd2hhdCAqLworICAvKiBUaGVzZSBtdXN0L2Nhbid0IHNjYWxlIG5vIG1hdHRlciB3aGF0ICovCiAgIHN3aXRjaChTaVNfUHItPlNpU19MQ0RSZXNJbmZvKSB7CisgIGNhc2UgUGFuZWxfMzIweDI0MF8xOgorICBjYXNlIFBhbmVsXzMyMHgyNDBfMjoKKyAgY2FzZSBQYW5lbF8zMjB4MjQwXzM6CiAgIGNhc2UgUGFuZWxfMTI4MHg5NjA6CiAgICAgICBTaVNfUHItPlNpU19MQ0RJbmZvICY9IH5Eb250RXhwYW5kTENEOworICAgICAgYnJlYWs7CisgIGNhc2UgUGFuZWxfNjQweDQ4MDoKKyAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gRG9udEV4cGFuZExDRDsKICAgfQogCiAgIHBhbmVsY2Fuc2NhbGUgPSAoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpID8gVFJVRSA6IEZBTFNFOwpAQCAtMTY0Niw0MSArMTY0Myw0MSBAQAogCiAgIC8qIER1YWwgbGluaywgUGFzcyAxOjEgQklPUyBkZWZhdWx0LCBldGMuICovCiAjaWZkZWYgU0lTMzE1SAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzY2MSkgewogICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgewotICAgICAgICBpZih0ZW1wICYgMHgwOCkgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBMQ0RQYXNzMTE7CisJaWYodGVtcCAmIDB4MDgpIFNpU19Qci0+U2lTX0xDREluZm8gfD0gTENEUGFzczExOwogICAgICB9Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfUk9NTmV3KSB7CisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0RVQUxMSU5LKSB7CisJaWYoU2lTX1ByLT5TaVNfUk9NTmV3KSB7CiAJICAgaWYodGVtcCAmIDB4MDIpIFNpU19Qci0+U2lTX0xDREluZm8gfD0gTENERHVhbExpbms7Ci0JfSBlbHNlIGlmKChteXB0ciA9IEdldExDRFN0cnVjdFB0cjY2MShTaVNfUHIsIEh3SW5mbykpKSB7Ci0gICAgICAgICAgIGlmKG15cHRyWzJdICYgMHgwMSkgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBMQ0REdWFsTGluazsKKwl9IGVsc2UgaWYoKG15cHRyID0gR2V0TENEU3RydWN0UHRyNjYxKFNpU19QcikpKSB7CisJICAgaWYobXlwdHJbMl0gJiAweDAxKSBTaVNfUHItPlNpU19MQ0RJbmZvIHw9IExDRER1YWxMaW5rOwogCX0KICAgICAgfQotICB9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKyAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKLSAgICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzkpICYgMHgwMSkgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBMQ0RQYXNzMTE7CisJaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzkpICYgMHgwMSkgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBMQ0RQYXNzMTE7CiAgICAgIH0KICAgICAgaWYoKFNpU19Qci0+U2lTX1JPTU5ldykgJiYgKCEoU2lTX1ByLT5QYW5lbFNlbGZEZXRlY3RlZCkpKSB7Ci0gICAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gJj0gfihMQ0RSR0IxOEJpdCk7CisJU2lTX1ByLT5TaVNfTENESW5mbyAmPSB+KExDRFJHQjE4Qml0KTsKIAl0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzUpOwotICAgICAgICBpZih0ZW1wICYgMHgwMSkgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBMQ0RSR0IxOEJpdDsKLQlpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYpKSB7CisJaWYodGVtcCAmIDB4MDEpIFNpU19Qci0+U2lTX0xDREluZm8gfD0gTENEUkdCMThCaXQ7CisJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRFVBTExJTkspIHsKIAkgICBpZih0ZW1wICYgMHgwMikgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBMQ0REdWFsTGluazsKIAl9CiAgICAgIH0gZWxzZSBpZighKFNpU19Qci0+U2lTX1JPTU5ldykpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMkxWIHwgVkJfU0lTMzAyRUxWKSkgewotICAgICAgICAgICBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ0xFVk8xMDI0KSAmJgorCWlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0RVQUxMSU5LKSB7CisJICAgaWYoKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0NMRVZPMTAyNCkgJiYKIAkgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkpIHsKIAkgICAgICBTaVNfUHItPlNpU19MQ0RJbmZvIHw9IExDRER1YWxMaW5rOwogCSAgIH0KLSAgICAgICAgICAgaWYoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHgxMDI0KSB8fAorCSAgIGlmKChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4MTAyNCkgfHwKIAkgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNDAweDEwNTApIHx8Ci0gICAgICAgICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE2MDB4MTIwMCkgfHwKKwkgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNjAweDEyMDApIHx8CiAJICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTY4MHgxMDUwKSkgewogCSAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gTENERHVhbExpbms7CiAJICAgfQotICAgICAgICB9CisJfQogICAgICB9CiAgIH0KICNlbmRpZgpAQCAtMTY5MSwxMiArMTY4OCwxMiBAQAogICAgICBTaVNfUHItPlNpU19MQ0RJbmZvICY9IH5MQ0RQYXNzMTE7CiAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewogICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSB7Ci0gICAgICAgIC8qIEFsd2F5cyBjZW50ZXIgc2NyZWVuIG9uIFNpUyBMVkRTIChpZiBzY2FsaW5nIGlzIGRpc2FibGVkKSAqLwotICAgICAgICBTaVNfUHItPlNpU19MQ0RJbmZvICY9IH5MQ0RQYXNzMTE7CisJLyogQWx3YXlzIGNlbnRlciBzY3JlZW4gb24gU2lTIExWRFMgKGlmIHNjYWxpbmcgaXMgZGlzYWJsZWQpICovCisJU2lTX1ByLT5TaVNfTENESW5mbyAmPSB+TENEUGFzczExOwogICAgICB9IGVsc2UgewotICAgICAgICAvKiBCeSBkZWZhdWx0LCBwYXNzIDE6MSBvbiBTaVMgVE1EUyAoaWYgc2NhbGluZyBpcyBzdXBwb3J0ZWQpICovCi0gICAgICAgIGlmKHBhbmVsY2Fuc2NhbGUpICAgICAgICAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gTENEUGFzczExOwotICAgICAgICBpZihTaVNfUHItPkNlbnRlclNjcmVlbiA9PSAxKSBTaVNfUHItPlNpU19MQ0RJbmZvICY9IH5MQ0RQYXNzMTE7CisJLyogQnkgZGVmYXVsdCwgcGFzcyAxOjEgb24gU2lTIFRNRFMgKGlmIHNjYWxpbmcgaXMgc3VwcG9ydGVkKSAqLworCWlmKHBhbmVsY2Fuc2NhbGUpICAgICAgICAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gTENEUGFzczExOworCWlmKFNpU19Qci0+Q2VudGVyU2NyZWVuID09IDEpIFNpU19Qci0+U2lTX0xDREluZm8gJj0gfkxDRFBhc3MxMTsKICAgICAgfQogICB9CiAKQEAgLTE3MDQsMTkgKzE3MDEsMTUgQEAKICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLMTA4XzJfMzE1OwogCiAgIHN3aXRjaChTaVNfUHItPlNpU19MQ0RSZXNJbmZvKSB7Ci0gICAgIGNhc2UgUGFuZWxfMzIweDQ4MDogICAgU2lTX1ByLT5QYW5lbFhSZXMgPSAgMzIwOyBTaVNfUHItPlBhbmVsWVJlcyA9ICA0ODA7Ci0gICAgIAkJCSAgICBTaVNfUHItPlBhbmVsSFQgICA9ICA0MDA7IFNpU19Qci0+UGFuZWxWVCAgID0gIDUyNTsKLQkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMwMCA9IFZDTEsyODsKLQkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEsyODsKLQkJCSAgICBicmVhazsKLSAgICAgY2FzZSBQYW5lbF82NDB4NDgwXzI6Ci0gICAgIGNhc2UgUGFuZWxfNjQweDQ4MF8zOiAgU2lTX1ByLT5QYW5lbFhSZXMgPSAgNjQwOyBTaVNfUHItPlBhbmVsWVJlcyA9ICA0ODA7Ci0gICAgIAkJCSAgICBTaVNfUHItPlBhbmVsVlJTICA9ICAgMjQ7IFNpU19Qci0+UGFuZWxWUkUgID0gICAgMzsKKyAgICAgY2FzZSBQYW5lbF8zMjB4MjQwXzE6CisgICAgIGNhc2UgUGFuZWxfMzIweDI0MF8yOgorICAgICBjYXNlIFBhbmVsXzMyMHgyNDBfMzogIFNpU19Qci0+UGFuZWxYUmVzID0gIDY0MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgNDgwOworCQkJICAgIFNpU19Qci0+UGFuZWxWUlMgID0gICAyNDsgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICAzOwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwID0gVkNMSzI4OwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1ID0gVkNMSzI4OwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzY0MHg0ODA6ICAgIFNpU19Qci0+UGFuZWxYUmVzID0gIDY0MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgNDgwOwotICAgICAJCQkgICAgCQkJICAgICAgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICAzOworCQkJCQkJICAgICAgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICAzOwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwID0gVkNMSzI4OwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1ID0gVkNMSzI4OwogCQkJICAgIGJyZWFrOwpAQCAtMTcyOCw1MiArMTcyMSw1MiBAQAogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1ID0gVkNMSzQwOwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEwMjR4NjAwOiAgIFNpU19Qci0+UGFuZWxYUmVzID0gMTAyNDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgNjAwOwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxMzQ0OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MDA7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxMzQ0OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MDA7CiAJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgPSAgIDI0OyBTaVNfUHItPlBhbmVsSFJFICA9ICAxMzY7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgPSAgICAyIC8qIDg4ICovIDsgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICA2OwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMDAgPSBWQ0xLNjVfMzAwOworCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwID0gVkNMSzY1XzMwMDsKIAkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEs2NV8zMTU7Ci0gICAgIAkJCSAgICBicmVhazsKKwkJCSAgICBicmVhazsKICAgICAgY2FzZSBQYW5lbF8xMDI0eDc2ODogICBTaVNfUHItPlBhbmVsWFJlcyA9IDEwMjQ7IFNpU19Qci0+UGFuZWxZUmVzID0gIDc2ODsKLSAgICAgCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTM0NDsgU2lTX1ByLT5QYW5lbFZUICAgPSAgODA2OworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTM0NDsgU2lTX1ByLT5QYW5lbFZUICAgPSAgODA2OwogCQkJICAgIFNpU19Qci0+UGFuZWxIUlMgID0gICAyNDsgU2lTX1ByLT5QYW5lbEhSRSAgPSAgMTM2OwogCQkJICAgIFNpU19Qci0+UGFuZWxWUlMgID0gICAgMzsgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICA2OwotCQkJICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkJCSAgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKIAkJCSAgICAgICBTaVNfUHItPlBhbmVsSFJTID0gMjM7Ci0JCQkgICAgICAgCQkJICAgICAgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICA1OworCQkJCQkJICAgICAgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICA1OwogCQkJICAgIH0KIAkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMwMCA9IFZDTEs2NV8zMDA7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLNjVfMzE1OwotCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIsIEh3SW5mbyk7CisJCQkgICAgU2lTX0dldExDREluZm9CSU9TKFNpU19Qcik7CiAJCQkgICAgYnJlYWs7CiAgICAgIGNhc2UgUGFuZWxfMTE1Mng3Njg6ICAgU2lTX1ByLT5QYW5lbFhSZXMgPSAxMTUyOyBTaVNfUHItPlBhbmVsWVJlcyA9ICA3Njg7Ci0gICAgIAkJCSAgICBTaVNfUHItPlBhbmVsSFQgICA9IDEzNDQ7IFNpU19Qci0+UGFuZWxWVCAgID0gIDgwNjsKLQkJCSAgICBTaVNfUHItPlBhbmVsSFJTICA9ICAgMjQ7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxMzQ0OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MDY7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgPSAgIDI0OyBTaVNfUHItPlBhbmVsSFJFICA9ICAxMzY7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgPSAgICAzOyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDY7Ci0JCQkgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCQkJICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCQkJICAgICAgIFNpU19Qci0+UGFuZWxIUlMgPSAyMzsKLQkJCSAgICAgICAJCQkgICAgICBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDU7CisJCQkJCQkgICAgICBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDU7CiAJCQkgICAgfQotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMDAgPSBWQ0xLNjVfMzAwOworCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwID0gVkNMSzY1XzMwMDsKIAkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEs2NV8zMTU7Ci0gICAgIAkJCSAgICBicmVhazsKKwkJCSAgICBicmVhazsKICAgICAgY2FzZSBQYW5lbF8xMTUyeDg2NDogICBTaVNfUHItPlBhbmVsWFJlcyA9IDExNTI7IFNpU19Qci0+UGFuZWxZUmVzID0gIDg2NDsKLSAgICAgCQkJICAgIGJyZWFrOworCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEyODB4NzIwOiAgIFNpU19Qci0+UGFuZWxYUmVzID0gMTI4MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgNzIwOwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNjUwOyBTaVNfUHItPlBhbmVsVlQgICA9ICA3NTA7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNjUwOyBTaVNfUHItPlBhbmVsVlQgICA9ICA3NTA7CiAJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgPSAgMTEwOyBTaVNfUHItPlBhbmVsSFJFICA9ICAgNDA7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgPSAgICA1OyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDU7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLXzEyODB4NzIwOwogCQkJICAgIC8qIERhdGEgYWJvdmUgZm9yIFRNRFMgKHByb2plY3Rvcik7IGdldCBmcm9tIEJJT1MgZm9yIExWRFMgKi8KLQkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByLCBId0luZm8pOworCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIpOwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEyODB4NzY4OiAgIFNpU19Qci0+UGFuZWxYUmVzID0gMTI4MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgNzY4OwotICAgICAJCQkgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgeworCQkJICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKIAkJCSAgICAgICBTaVNfUHItPlBhbmVsSFQgICA9IDE0MDg7IFNpU19Qci0+UGFuZWxWVCAgID0gIDgwNjsKIAkJCSAgICAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMwMCA9IFZDTEs4MV8zMDA7IC8qID8gKi8KIAkJCSAgICAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEs4MV8zMTU7IC8qID8gKi8KIAkJCSAgICB9IGVsc2UgewotICAgICAJCQkgICAgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNjg4OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MDI7CisJCQkgICAgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNjg4OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MDI7CiAJCQkgICAgICAgU2lTX1ByLT5QYW5lbEhSUyAgPSAgIDQ4OyBTaVNfUHItPlBhbmVsSFJTICA9ICAxMTI7CiAJCQkgICAgICAgU2lTX1ByLT5QYW5lbFZSUyAgPSAgICAzOyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDY7CiAJCQkgICAgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMDAgPSBWQ0xLODFfMzAwOwpAQCAtMTc4MSw3NyArMTc3NCwxMDAgQEAKIAkJCSAgICB9CiAJCQkgICAgYnJlYWs7CiAgICAgIGNhc2UgUGFuZWxfMTI4MHg3NjhfMjogU2lTX1ByLT5QYW5lbFhSZXMgPSAxMjgwOyBTaVNfUHItPlBhbmVsWVJlcyA9ICA3Njg7Ci0gICAgIAkJCSAgICBTaVNfUHItPlBhbmVsSFQgICA9IDE2NjA7IFNpU19Qci0+UGFuZWxWVCAgID0gIDgwNjsKKwkJCSAgICBTaVNfUHItPlBhbmVsSFQgICA9IDE2NjA7IFNpU19Qci0+UGFuZWxWVCAgID0gIDgwNjsKIAkJCSAgICBTaVNfUHItPlBhbmVsSFJTICA9ICAgNDg7IFNpU19Qci0+UGFuZWxIUkUgID0gIDExMjsKIAkJCSAgICBTaVNfUHItPlBhbmVsVlJTICA9ICAgIDM7IFNpU19Qci0+UGFuZWxWUkUgID0gICAgNjsKIAkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEtfMTI4MHg3NjhfMjsKLQkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByLCBId0luZm8pOworCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIpOwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEyODB4ODAwOiAgIFNpU19Qci0+UGFuZWxYUmVzID0gMTI4MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgODAwOwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNDA4OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MTY7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNDA4OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MTY7CiAJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgID0gIDIxOyBTaVNfUHItPlBhbmVsSFJFICA9ICAgMjQ7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgID0gICA0OyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDM7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLXzEyODB4ODAwXzMxNTsKLQkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByLCBId0luZm8pOworCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIpOwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEyODB4ODAwXzI6IFNpU19Qci0+UGFuZWxYUmVzID0gMTI4MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgODAwOwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNTUyOyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MTI7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNTUyOyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MTI7CiAJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgID0gIDQ4OyBTaVNfUHItPlBhbmVsSFJFICA9ICAxMTI7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgID0gICA0OyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDM7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLXzEyODB4ODAwXzMxNV8yOwotCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIsIEh3SW5mbyk7CisJCQkgICAgU2lTX0dldExDREluZm9CSU9TKFNpU19Qcik7CisJCQkgICAgYnJlYWs7CisgICAgIGNhc2UgUGFuZWxfMTI4MHg4NTQ6ICAgU2lTX1ByLT5QYW5lbFhSZXMgPSAxMjgwOyBTaVNfUHItPlBhbmVsWVJlcyA9ICA4NTQ7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNjY0OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4NjE7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgID0gIDE2OyBTaVNfUHItPlBhbmVsSFJFICA9ICAxMTI7CisJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgID0gICAxOyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDM7CisJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLXzEyODB4ODU0OworCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIpOwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEyODB4OTYwOiAgIFNpU19Qci0+UGFuZWxYUmVzID0gMTI4MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgOTYwOwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxODAwOyBTaVNfUHItPlBhbmVsVlQgICA9IDEwMDA7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxODAwOyBTaVNfUHItPlBhbmVsVlQgICA9IDEwMDA7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMDAgPSBWQ0xLMTA4XzNfMzAwOwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1ID0gVkNMSzEwOF8zXzMxNTsKLQkJIAkgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfMTI4MHgxMDI0KSB7CisJCQkgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfMTI4MHgxMDI0KSB7CiAJCQkgICAgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMDAgPSBWQ0xLMTAwXzMwMDsKIAkJCSAgICAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEsxMDBfMzE1OwogCQkJICAgIH0KIAkJCSAgICBicmVhazsKICAgICAgY2FzZSBQYW5lbF8xMjgweDEwMjQ6ICBTaVNfUHItPlBhbmVsWFJlcyA9IDEyODA7IFNpU19Qci0+UGFuZWxZUmVzID0gMTAyNDsKLSAgICAgCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTY4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTY4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OwogCQkJICAgIFNpU19Qci0+UGFuZWxIUlMgID0gICA0ODsgU2lTX1ByLT5QYW5lbEhSRSAgPSAgMTEyOwogCQkJICAgIFNpU19Qci0+UGFuZWxWUlMgID0gICAgMTsgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICAzOwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwID0gVkNMSzEwOF8zXzMwMDsKIAkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEsxMDhfMl8zMTU7Ci0JCQkgICAgU2lTX0dldExDREluZm9CSU9TKFNpU19QciwgSHdJbmZvKTsKKwkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByKTsKIAkJCSAgICBicmVhazsKICAgICAgY2FzZSBQYW5lbF8xNDAweDEwNTA6ICBTaVNfUHItPlBhbmVsWFJlcyA9IDE0MDA7IFNpU19Qci0+UGFuZWxZUmVzID0gMTA1MDsKLSAgICAgCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTY4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OwotCQkJICAgIFNpU19Qci0+UGFuZWxIUlMgID0gICA0ODsgU2lTX1ByLT5QYW5lbEhSRSAgPSAgMTEyOyAvKiBIUkUgT0sgZm9yIExWRFMsIG5vdCBmb3IgTENEQSAqLworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTY4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OworCQkJICAgIFNpU19Qci0+UGFuZWxIUlMgID0gICA0ODsgU2lTX1ByLT5QYW5lbEhSRSAgPSAgMTEyOwogCQkJICAgIFNpU19Qci0+UGFuZWxWUlMgID0gICAgMTsgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICAzOwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1ID0gVkNMSzEwOF8yXzMxNTsKLQkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByLCBId0luZm8pOworCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIpOwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzE2MDB4MTIwMDogIFNpU19Qci0+UGFuZWxYUmVzID0gMTYwMDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAxMjAwOwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAyMTYwOyBTaVNfUHItPlBhbmVsVlQgICA9IDEyNTA7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAyMTYwOyBTaVNfUHItPlBhbmVsVlQgICA9IDEyNTA7CiAJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgPSAgIDY0OyBTaVNfUHItPlBhbmVsSFJFICA9ICAxOTI7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgPSAgICAxOyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDM7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLMTYyXzMxNTsKLQkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByLCBId0luZm8pOworCQkJICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1RNRFNMQ0RBKSB7CisJCQkgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgeworCQkJCSAgU2lTX1ByLT5QYW5lbEhUICA9IDE3NjA7IFNpU19Qci0+UGFuZWxWVCAgPSAxMjM1OworCQkJCSAgU2lTX1ByLT5QYW5lbEhSUyA9ICAgNDg7IFNpU19Qci0+UGFuZWxIUkUgPSAgIDMyOworCQkJCSAgU2lTX1ByLT5QYW5lbFZSUyA9ICAgIDI7IFNpU19Qci0+UGFuZWxWUkUgPSAgICA0OworCQkJCSAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLMTMwXzMxNTsKKwkJCQkgIFNpU19Qci0+QWx0ZXJuYXRlMTYwMHgxMjAwID0gVFJVRTsKKwkJCSAgICAgICB9CisJCQkgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTKSB7CisJCQkgICAgICAgU2lTX1ByLT5QYW5lbEhUICA9IDIwNDg7IFNpU19Qci0+UGFuZWxWVCAgPSAxMzIwOworCQkJICAgICAgIFNpU19Qci0+UGFuZWxIUlMgPSBTaVNfUHItPlBhbmVsSFJFID0gOTk5OworCQkJICAgICAgIFNpU19Qci0+UGFuZWxWUlMgPSBTaVNfUHItPlBhbmVsVlJFID0gOTk5OworCQkJICAgIH0KKwkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByKTsKIAkJCSAgICBicmVhazsKICAgICAgY2FzZSBQYW5lbF8xNjgweDEwNTA6ICBTaVNfUHItPlBhbmVsWFJlcyA9IDE2ODA7IFNpU19Qci0+UGFuZWxZUmVzID0gMTA1MDsKLSAgICAgCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTkwMDsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTkwMDsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OwogCQkJICAgIFNpU19Qci0+UGFuZWxIUlMgID0gICAyNjsgU2lTX1ByLT5QYW5lbEhSRSAgPSAgIDc2OwogCQkJICAgIFNpU19Qci0+UGFuZWxWUlMgID0gICAgMzsgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICA2OwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1ID0gVkNMSzEyMV8zMTU7Ci0JCQkgICAgU2lTX0dldExDREluZm9CSU9TKFNpU19QciwgSHdJbmZvKTsKKwkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByKTsKIAkJCSAgICBicmVhazsKICAgICAgY2FzZSBQYW5lbF9CYXJjbzEzNjY6ICBTaVNfUHItPlBhbmVsWFJlcyA9IDEzNjA7IFNpU19Qci0+UGFuZWxZUmVzID0gMTAyNDsKLSAgICAgCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTY4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OwotICAgICAJCQkgICAgYnJlYWs7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNjg4OyBTaVNfUHItPlBhbmVsVlQgICA9IDEwNjY7CisJCQkgICAgYnJlYWs7CiAgICAgIGNhc2UgUGFuZWxfODQ4eDQ4MDogICAgU2lTX1ByLT5QYW5lbFhSZXMgPSAgODQ4OyBTaVNfUHItPlBhbmVsWVJlcyA9ICA0ODA7Ci0gICAgIAkJCSAgICBTaVNfUHItPlBhbmVsSFQgICA9IDEwODg7IFNpU19Qci0+UGFuZWxWVCAgID0gIDUyNTsKLSAgICAgCQkJICAgIGJyZWFrOworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTA4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAgNTI1OworCQkJICAgIGJyZWFrOworICAgICBjYXNlIFBhbmVsXzg1Nng0ODA6ICAgIFNpU19Qci0+UGFuZWxYUmVzID0gIDg1NjsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgNDgwOworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTA4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAgNTI1OworCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsX0N1c3RvbTogICAgIFNpU19Qci0+UGFuZWxYUmVzID0gU2lTX1ByLT5DUF9NYXhYOwotICAgIAkJCSAgICBTaVNfUHItPlBhbmVsWVJlcyA9IFNpU19Qci0+Q1BfTWF4WTsKKwkJCSAgICBTaVNfUHItPlBhbmVsWVJlcyA9IFNpU19Qci0+Q1BfTWF4WTsKIAkJCSAgICBTaVNfUHItPlBhbmVsSFQgICA9IFNpU19Qci0+Q0hUb3RhbDsKIAkJCSAgICBTaVNfUHItPlBhbmVsVlQgICA9IFNpU19Qci0+Q1ZUb3RhbDsKIAkJCSAgICBpZihTaVNfUHItPkNQX1ByZWZlcnJlZEluZGV4ICE9IC0xKSB7CiAJCQkgICAgICAgU2lTX1ByLT5QYW5lbFhSZXMgPSBTaVNfUHItPkNQX0hEaXNwbGF5W1NpU19Qci0+Q1BfUHJlZmVycmVkSW5kZXhdOwotICAgIAkJCSAgICAgICBTaVNfUHItPlBhbmVsWVJlcyA9IFNpU19Qci0+Q1BfVkRpc3BsYXlbU2lTX1ByLT5DUF9QcmVmZXJyZWRJbmRleF07CisJCQkgICAgICAgU2lTX1ByLT5QYW5lbFlSZXMgPSBTaVNfUHItPkNQX1ZEaXNwbGF5W1NpU19Qci0+Q1BfUHJlZmVycmVkSW5kZXhdOwogCQkJICAgICAgIFNpU19Qci0+UGFuZWxIVCAgID0gU2lTX1ByLT5DUF9IVG90YWxbU2lTX1ByLT5DUF9QcmVmZXJyZWRJbmRleF07CiAJCQkgICAgICAgU2lTX1ByLT5QYW5lbFZUICAgPSBTaVNfUHItPkNQX1ZUb3RhbFtTaVNfUHItPkNQX1ByZWZlcnJlZEluZGV4XTsKIAkJCSAgICAgICBTaVNfUHItPlBhbmVsSFJTICA9IFNpU19Qci0+Q1BfSFN5bmNTdGFydFtTaVNfUHItPkNQX1ByZWZlcnJlZEluZGV4XTsKQEAgLTE4NjMsMjIgKzE4NzksMjIgQEAKIAkJCSAgICAgICBTaVNfUHItPlBhbmVsVlJTIC09IFNpU19Qci0+UGFuZWxZUmVzOwogCQkJICAgICAgIFNpU19Qci0+UGFuZWxWUkUgLT0gU2lTX1ByLT5QYW5lbFZSUzsKIAkJCSAgICAgICBpZihTaVNfUHItPkNQX1ByZWZDbG9jaykgewotCQkJICAgICAgICAgIGludCBpZHg7Ci0JCQkgICAgICAgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLX0NVU1RPTV8zMTU7CisJCQkJICBpbnQgaWR4OworCQkJCSAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLX0NVU1RPTV8zMTU7CiAJCQkJICBTaVNfUHItPlBhbmVsVkNMS0lkeDMwMCA9IFZDTEtfQ1VTVE9NXzMwMDsKLQkJCQkgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIGlkeCA9IFZDTEtfQ1VTVE9NXzMwMDsKKwkJCQkgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgaWR4ID0gVkNMS19DVVNUT01fMzAwOwogCQkJCSAgZWxzZQkJCQkgICBpZHggPSBWQ0xLX0NVU1RPTV8zMTU7Ci0gICAgICAJCQkgICAgICAgICAgU2lTX1ByLT5TaVNfVkNMS0RhdGFbaWR4XS5DTE9DSyA9Ci0JIAkJICAgICAgICAgICAgIFNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbaWR4XS5DTE9DSyA9IFNpU19Qci0+Q1BfUHJlZkNsb2NrOwotICAgICAgCQkJICAgICAgICAgIFNpU19Qci0+U2lTX1ZDTEtEYXRhW2lkeF0uU1IyQiA9Ci0gIAkgCQkJICAgICBTaVNfUHItPlNpU19WQlZDTEtEYXRhW2lkeF0uUGFydDRfQSA9IFNpU19Qci0+Q1BfUHJlZlNSMkI7Ci0gICAgICAJCQkgICAgICAgICAgU2lTX1ByLT5TaVNfVkNMS0RhdGFbaWR4XS5TUjJDID0KLQkgCQkJICAgICBTaVNfUHItPlNpU19WQlZDTEtEYXRhW2lkeF0uUGFydDRfQiA9IFNpU19Qci0+Q1BfUHJlZlNSMkM7CisJCQkJICBTaVNfUHItPlNpU19WQ0xLRGF0YVtpZHhdLkNMT0NLID0KKwkJCQkgICAgIFNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbaWR4XS5DTE9DSyA9IFNpU19Qci0+Q1BfUHJlZkNsb2NrOworCQkJCSAgU2lTX1ByLT5TaVNfVkNMS0RhdGFbaWR4XS5TUjJCID0KKwkJCQkgICAgIFNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbaWR4XS5QYXJ0NF9BID0gU2lTX1ByLT5DUF9QcmVmU1IyQjsKKwkJCQkgIFNpU19Qci0+U2lTX1ZDTEtEYXRhW2lkeF0uU1IyQyA9CisJCQkJICAgICBTaVNfUHItPlNpU19WQlZDTEtEYXRhW2lkeF0uUGFydDRfQiA9IFNpU19Qci0+Q1BfUHJlZlNSMkM7CiAJCQkgICAgICAgfQogCQkJICAgIH0KIAkJCSAgICBicmVhazsKICAgICAgZGVmYXVsdDoJCSAgICBTaVNfUHItPlBhbmVsWFJlcyA9IDEwMjQ7IFNpU19Qci0+UGFuZWxZUmVzID0gIDc2ODsKLSAgICAgCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTM0NDsgU2lTX1ByLT5QYW5lbFZUICAgPSAgODA2OworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTM0NDsgU2lTX1ByLT5QYW5lbFZUICAgPSAgODA2OwogCQkJICAgIGJyZWFrOwogICB9CiAKQEAgLTE4ODcsMTQgKzE5MDMsMTYgQEAKICAgICAgIChTaVNfUHItPlNpU19JRl9ERUZfRFNUTikgICAgICAgICAgICAgIHx8CiAgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fAogICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTAyNCkgfHwKLSAgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgKSB7CisgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfUEFORUw4NDgpICB8fAorICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODU2KSApIHsKICAgICAgU2lTX1ByLT5QYW5lbEhSUyA9IDk5OTsKICAgICAgU2lTX1ByLT5QYW5lbEhSRSA9IDk5OTsKICAgfQogCiAgIGlmKCAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fAogICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTAyNCkgfHwKLSAgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgKSB7CisgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfUEFORUw4NDgpICB8fAorICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODU2KSApIHsKICAgICAgU2lTX1ByLT5QYW5lbFZSUyA9IDk5OTsKICAgICAgU2lTX1ByLT5QYW5lbFZSRSA9IDk5OTsKICAgfQpAQCAtMTkxMiwxOCArMTkzMCwxOCBAQAogICAgICBjYXNlIFBhbmVsX0N1c3RvbToKICAgICAgY2FzZSBQYW5lbF8xMTUyeDg2NDoKICAgICAgY2FzZSBQYW5lbF8xMjgweDc2ODoJLyogVE1EUyBvbmx5ICovCi0gICAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gRG9udEV4cGFuZExDRDsKKwlTaVNfUHItPlNpU19MQ0RJbmZvIHw9IERvbnRFeHBhbmRMQ0Q7CiAJYnJlYWs7CiAKICAgICAgY2FzZSBQYW5lbF84MDB4NjAwOiB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBVQ0hBUiBub25zY2FsaW5nbW9kZXNbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBub25zY2FsaW5nbW9kZXNbXSA9IHsKIAkgICBTSVNfUklfNzIweDQ4MCwgU0lTX1JJXzcyMHg1NzYsIFNJU19SSV83Njh4NTc2LCBTSVNfUklfODAweDQ4MCwgMHhmZgogCX07CiAJU2lTX0NoZWNrU2NhbGluZyhTaVNfUHIsIHJlc2luZm8sIG5vbnNjYWxpbmdtb2Rlcyk7CiAJYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSBQYW5lbF8xMDI0eDc2ODogewotICAgICAgICBzdGF0aWMgY29uc3QgVUNIQVIgbm9uc2NhbGluZ21vZGVzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgU0lTX1JJXzcyMHg0ODAsIFNJU19SSV83MjB4NTc2LCBTSVNfUklfNzY4eDU3NiwgU0lTX1JJXzgwMHg0ODAsIFNJU19SSV84NDh4NDgwLAogCSAgIFNJU19SSV84NTZ4NDgwLCBTSVNfUklfOTYweDU0MCwgU0lTX1JJXzk2MHg2MDAsIFNJU19SSV8xMDI0eDU3NixTSVNfUklfMTAyNHg2MDAsCiAJICAgMHhmZgpAQCAtMTkzMiw3ICsxOTUwLDcgQEAKIAlicmVhazsKICAgICAgfQogICAgICBjYXNlIFBhbmVsXzEyODB4NzIwOiB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBVQ0hBUiBub25zY2FsaW5nbW9kZXNbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBub25zY2FsaW5nbW9kZXNbXSA9IHsKIAkgICBTSVNfUklfNzIweDQ4MCwgU0lTX1JJXzcyMHg1NzYsIFNJU19SSV83Njh4NTc2LCBTSVNfUklfODAweDQ4MCwgU0lTX1JJXzg0OHg0ODAsCiAJICAgU0lTX1JJXzg1Nng0ODAsIFNJU19SSV85NjB4NTQwLCBTSVNfUklfOTYweDYwMCwgU0lTX1JJXzEwMjR4NTc2LFNJU19SSV8xMDI0eDYwMCwKIAkgICAweGZmCkBAIC0xOTQ0LDcgKzE5NjIsNyBAQAogCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgUGFuZWxfMTI4MHg3NjhfMjogeyAgLyogTFZEUyBvbmx5ICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBVQ0hBUiBub25zY2FsaW5nbW9kZXNbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBub25zY2FsaW5nbW9kZXNbXSA9IHsKIAkgICBTSVNfUklfNzIweDQ4MCwgU0lTX1JJXzcyMHg1NzYsIFNJU19SSV83Njh4NTc2LCBTSVNfUklfODAweDQ4MCwgU0lTX1JJXzg0OHg0ODAsCiAJICAgU0lTX1JJXzg1Nng0ODAsIFNJU19SSV85NjB4NTQwLCBTSVNfUklfOTYweDYwMCwgU0lTX1JJXzEwMjR4NTc2LFNJU19SSV8xMDI0eDYwMCwKIAkgICBTSVNfUklfMTE1Mng3NjgsMHhmZgpAQCAtMTk1MiwyMyArMTk3MCwyMyBAQAogCVNpU19DaGVja1NjYWxpbmcoU2lTX1ByLCByZXNpbmZvLCBub25zY2FsaW5nbW9kZXMpOwogCXN3aXRjaChyZXNpbmZvKSB7CiAJY2FzZSBTSVNfUklfMTI4MHg3MjA6ICBpZihTaVNfUHItPlVzZVBhbmVsU2NhbGVyID09IC0xKSB7Ci0JICAgICAgCQkJICBTaVNfUHItPlNpU19MQ0RJbmZvIHw9IERvbnRFeHBhbmRMQ0Q7Ci0JICAgCQkgICAgICAgfQotCSAgIAkJICAgICAgIGJyZWFrOworCQkJCSAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBEb250RXhwYW5kTENEOworCQkJICAgICAgIH0KKwkJCSAgICAgICBicmVhazsKIAl9Ci0gICAgICAgIGJyZWFrOworCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgUGFuZWxfMTI4MHg4MDA6IHsgIAkvKiBTaVMgVE1EUyBzcGVjaWFsIChBdmVyYXRlYyA2MjAwIHNlcmllcykgKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IFVDSEFSIG5vbnNjYWxpbmdtb2Rlc1tdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5vbnNjYWxpbmdtb2Rlc1tdID0gewogCSAgIFNJU19SSV83MjB4NDgwLCBTSVNfUklfNzIweDU3NiwgU0lTX1JJXzc2OHg1NzYsIFNJU19SSV84MDB4NDgwLCBTSVNfUklfODQ4eDQ4MCwKIAkgICBTSVNfUklfODU2eDQ4MCwgU0lTX1JJXzk2MHg1NDAsIFNJU19SSV85NjB4NjAwLCBTSVNfUklfMTAyNHg1NzYsU0lTX1JJXzEwMjR4NjAwLAogCSAgIFNJU19SSV8xMTUyeDc2OCxTSVNfUklfMTI4MHg3MjAsU0lTX1JJXzEyODB4NzY4LDB4ZmYKIAl9OwogCVNpU19DaGVja1NjYWxpbmcoU2lTX1ByLCByZXNpbmZvLCBub25zY2FsaW5nbW9kZXMpOwotICAgICAgICBicmVhazsKKwlicmVhazsKICAgICAgfQogICAgICBjYXNlIFBhbmVsXzEyODB4ODAwXzI6ICB7IAkvKiBTaVMgTFZEUyAqLwotICAgICAgICBzdGF0aWMgY29uc3QgVUNIQVIgbm9uc2NhbGluZ21vZGVzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgU0lTX1JJXzcyMHg0ODAsIFNJU19SSV83MjB4NTc2LCBTSVNfUklfNzY4eDU3NiwgU0lTX1JJXzgwMHg0ODAsIFNJU19SSV84NDh4NDgwLAogCSAgIFNJU19SSV84NTZ4NDgwLCBTSVNfUklfOTYweDU0MCwgU0lTX1JJXzk2MHg2MDAsIFNJU19SSV8xMDI0eDU3NixTSVNfUklfMTAyNHg2MDAsCiAJICAgU0lTX1JJXzExNTJ4NzY4LDB4ZmYKQEAgLTE5NzcsNjYgKzE5OTUsODMgQEAKIAlzd2l0Y2gocmVzaW5mbykgewogCWNhc2UgU0lTX1JJXzEyODB4NzIwOgogCWNhc2UgU0lTX1JJXzEyODB4NzY4OiAgaWYoU2lTX1ByLT5Vc2VQYW5lbFNjYWxlciA9PSAtMSkgewotCSAgICAgIAkJCSAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBEb250RXhwYW5kTENEOwotCSAgIAkJICAgICAgIH0KLQkgICAJCSAgICAgICBicmVhazsKKwkJCQkgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gRG9udEV4cGFuZExDRDsKKwkJCSAgICAgICB9CisJCQkgICAgICAgYnJlYWs7CiAJfQotICAgICAgICBicmVhazsKKwlicmVhazsKICAgICAgfQotICAgICBjYXNlIFBhbmVsXzEyODB4OTYwOiB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBVQ0hBUiBub25zY2FsaW5nbW9kZXNbXSA9IHsKKyAgICAgY2FzZSBQYW5lbF8xMjgweDg1NDogeyAgCS8qIFNpUyBMVkRTICovCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgU0lTX1JJXzcyMHg0ODAsIFNJU19SSV83MjB4NTc2LCBTSVNfUklfNzY4eDU3NiwgU0lTX1JJXzgwMHg0ODAsIFNJU19SSV84NDh4NDgwLAogCSAgIFNJU19SSV84NTZ4NDgwLCBTSVNfUklfOTYweDU0MCwgU0lTX1JJXzk2MHg2MDAsIFNJU19SSV8xMDI0eDU3NixTSVNfUklfMTAyNHg2MDAsCi0JICAgU0lTX1JJXzExNTJ4NzY4LFNJU19SSV8xMTUyeDg2NCxTSVNfUklfMTI4MHg3MjAsU0lTX1JJXzEyODB4NzY4LFNJU19SSV8xMjgweDgwMCwKLQkgICAweGZmCisJICAgU0lTX1JJXzExNTJ4NzY4LDB4ZmYKIAl9OwogCVNpU19DaGVja1NjYWxpbmcoU2lTX1ByLCByZXNpbmZvLCBub25zY2FsaW5nbW9kZXMpOwotICAgICAgICBicmVhazsKKwlzd2l0Y2gocmVzaW5mbykgeworCWNhc2UgU0lTX1JJXzEyODB4NzIwOgorCWNhc2UgU0lTX1JJXzEyODB4NzY4OgorCWNhc2UgU0lTX1JJXzEyODB4ODAwOiAgaWYoU2lTX1ByLT5Vc2VQYW5lbFNjYWxlciA9PSAtMSkgeworCQkJCSAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBEb250RXhwYW5kTENEOworCQkJICAgICAgIH0KKwkJCSAgICAgICBicmVhazsKKwl9CisJYnJlYWs7CiAgICAgIH0KLSAgICAgY2FzZSBQYW5lbF8xMjgweDEwMjQ6IHsKLSAgICAgICAgc3RhdGljIGNvbnN0IFVDSEFSIG5vbnNjYWxpbmdtb2Rlc1tdID0geworICAgICBjYXNlIFBhbmVsXzEyODB4OTYwOiB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgU0lTX1JJXzcyMHg0ODAsIFNJU19SSV83MjB4NTc2LCBTSVNfUklfNzY4eDU3NiwgU0lTX1JJXzgwMHg0ODAsIFNJU19SSV84NDh4NDgwLAogCSAgIFNJU19SSV84NTZ4NDgwLCBTSVNfUklfOTYweDU0MCwgU0lTX1JJXzk2MHg2MDAsIFNJU19SSV8xMDI0eDU3NixTSVNfUklfMTAyNHg2MDAsCiAJICAgU0lTX1JJXzExNTJ4NzY4LFNJU19SSV8xMTUyeDg2NCxTSVNfUklfMTI4MHg3MjAsU0lTX1JJXzEyODB4NzY4LFNJU19SSV8xMjgweDgwMCwKLQkgICBTSVNfUklfMTI4MHg5NjAsMHhmZgorCSAgIFNJU19SSV8xMjgweDg1NCwweGZmCisJfTsKKwlTaVNfQ2hlY2tTY2FsaW5nKFNpU19QciwgcmVzaW5mbywgbm9uc2NhbGluZ21vZGVzKTsKKwlicmVhazsKKyAgICAgfQorICAgICBjYXNlIFBhbmVsXzEyODB4MTAyNDogeworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5vbnNjYWxpbmdtb2Rlc1tdID0geworCSAgIFNJU19SSV83MjB4NDgwLCBTSVNfUklfNzIweDU3NiwgU0lTX1JJXzc2OHg1NzYsIFNJU19SSV84MDB4NDgwLCBTSVNfUklfODQ4eDQ4MCwKKwkgICBTSVNfUklfODU2eDQ4MCwgU0lTX1JJXzk2MHg1NDAsIFNJU19SSV85NjB4NjAwLCBTSVNfUklfMTAyNHg1NzYsU0lTX1JJXzEwMjR4NjAwLAorCSAgIFNJU19SSV8xMTUyeDc2OCxTSVNfUklfMTE1Mng4NjQsU0lTX1JJXzEyODB4NzIwLFNJU19SSV8xMjgweDc2OCxTSVNfUklfMTI4MHg4MDAsCisJICAgU0lTX1JJXzEyODB4ODU0LFNJU19SSV8xMjgweDk2MCwweGZmCiAJfTsKIAlTaVNfQ2hlY2tTY2FsaW5nKFNpU19QciwgcmVzaW5mbywgbm9uc2NhbGluZ21vZGVzKTsKIAlicmVhazsKICAgICAgfQogICAgICBjYXNlIFBhbmVsXzE0MDB4MTA1MDogewotICAgICAgICBzdGF0aWMgY29uc3QgVUNIQVIgbm9uc2NhbGluZ21vZGVzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgICBTSVNfUklfNzIweDQ4MCwgU0lTX1JJXzcyMHg1NzYsIFNJU19SSV83Njh4NTc2LCBTSVNfUklfODAweDQ4MCwgU0lTX1JJXzg0OHg0ODAsCiAJICAgICBTSVNfUklfODU2eDQ4MCwgU0lTX1JJXzk2MHg1NDAsIFNJU19SSV85NjB4NjAwLCBTSVNfUklfMTAyNHg1NzYsU0lTX1JJXzEwMjR4NjAwLAotCSAgICAgU0lTX1JJXzExNTJ4NzY4LFNJU19SSV8xMTUyeDg2NCxTSVNfUklfMTI4MHg3NjgsU0lTX1JJXzEyODB4ODAwLFNJU19SSV8xMjgweDk2MCwKLQkgICAgIDB4ZmYKKwkgICAgIFNJU19SSV8xMTUyeDc2OCxTSVNfUklfMTE1Mng4NjQsU0lTX1JJXzEyODB4NzY4LFNJU19SSV8xMjgweDgwMCxTSVNfUklfMTI4MHg4NTQsCisJICAgICBTSVNfUklfMTI4MHg5NjAsMHhmZgogCX07CiAJU2lTX0NoZWNrU2NhbGluZyhTaVNfUHIsIHJlc2luZm8sIG5vbnNjYWxpbmdtb2Rlcyk7Ci0gICAgICAgIHN3aXRjaChyZXNpbmZvKSB7CisJc3dpdGNoKHJlc2luZm8pIHsKIAljYXNlIFNJU19SSV8xMjgweDcyMDogIGlmKFNpU19Qci0+VXNlUGFuZWxTY2FsZXIgPT0gLTEpIHsKLQkgICAgICAJCQkgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gRG9udEV4cGFuZExDRDsKLQkgICAJCSAgICAgICB9Ci0JICAgCQkgICAgICAgYnJlYWs7CisJCQkJICBTaVNfUHItPlNpU19MQ0RJbmZvIHw9IERvbnRFeHBhbmRMQ0Q7CisJCQkgICAgICAgfQorCQkJICAgICAgIGJyZWFrOwogCWNhc2UgU0lTX1JJXzEyODB4MTAyNDogU2lTX1ByLT5TaVNfTENESW5mbyB8PSBEb250RXhwYW5kTENEOwotCSAgICAgIAkJICAgICAgIGJyZWFrOworCQkJICAgICAgIGJyZWFrOwogCX0KIAlicmVhazsKICAgICAgfQogICAgICBjYXNlIFBhbmVsXzE2MDB4MTIwMDogewotICAgICAgICBzdGF0aWMgY29uc3QgVUNIQVIgbm9uc2NhbGluZ21vZGVzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgICBTSVNfUklfNzIweDQ4MCwgU0lTX1JJXzcyMHg1NzYsIFNJU19SSV83Njh4NTc2LCBTSVNfUklfODAweDQ4MCwgU0lTX1JJXzg0OHg0ODAsCiAJICAgICBTSVNfUklfODU2eDQ4MCwgU0lTX1JJXzk2MHg1NDAsIFNJU19SSV85NjB4NjAwLCBTSVNfUklfMTAyNHg1NzYsU0lTX1JJXzEwMjR4NjAwLAogCSAgICAgU0lTX1JJXzExNTJ4NzY4LFNJU19SSV8xMTUyeDg2NCxTSVNfUklfMTI4MHg3MjAsU0lTX1JJXzEyODB4NzY4LFNJU19SSV8xMjgweDgwMCwKLQkgICAgIFNJU19SSV8xMjgweDk2MCxTSVNfUklfMTM2MHg3NjgsU0lTX1JJXzEzNjB4MTAyNCwweGZmCisJICAgICBTSVNfUklfMTI4MHg4NTQsU0lTX1JJXzEyODB4OTYwLFNJU19SSV8xMzYweDc2OCxTSVNfUklfMTM2MHgxMDI0LDB4ZmYKIAl9OwogCVNpU19DaGVja1NjYWxpbmcoU2lTX1ByLCByZXNpbmZvLCBub25zY2FsaW5nbW9kZXMpOwotICAgICAgICBicmVhazsKKwlicmVhazsKICAgICAgfQogICAgICBjYXNlIFBhbmVsXzE2ODB4MTA1MDogewotICAgICAgICBzdGF0aWMgY29uc3QgVUNIQVIgbm9uc2NhbGluZ21vZGVzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgICBTSVNfUklfNzIweDQ4MCwgU0lTX1JJXzcyMHg1NzYsIFNJU19SSV83Njh4NTc2LCBTSVNfUklfODAweDQ4MCwgU0lTX1JJXzg0OHg0ODAsCiAJICAgICBTSVNfUklfODU2eDQ4MCwgU0lTX1JJXzk2MHg1NDAsIFNJU19SSV85NjB4NjAwLCBTSVNfUklfMTAyNHg1NzYsU0lTX1JJXzEwMjR4NjAwLAotCSAgICAgU0lTX1JJXzExNTJ4NzY4LFNJU19SSV8xMTUyeDg2NCxTSVNfUklfMTI4MHg5NjAsU0lTX1JJXzEzNjB4NzY4LFNJU19SSV8xMzYweDEwMjQsCi0JICAgICAweGZmCisJICAgICBTSVNfUklfMTE1Mng3NjgsU0lTX1JJXzExNTJ4ODY0LFNJU19SSV8xMjgweDg1NCxTSVNfUklfMTI4MHg5NjAsU0lTX1JJXzEzNjB4NzY4LAorCSAgICAgU0lTX1JJXzEzNjB4MTAyNCwweGZmCiAJfTsKIAlTaVNfQ2hlY2tTY2FsaW5nKFNpU19QciwgcmVzaW5mbywgbm9uc2NhbGluZ21vZGVzKTsKIAlicmVhazsKQEAgLTIwNDQsMjUgKzIwNzksMjUgQEAKICAgICAgfQogICB9CiAKKyNpZmRlZiBTSVMzMDAKICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewotICAgICBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgewotICAgICAgICBTaVNfUHItPlNpU19MQ0RJbmZvID0gMHg4MCB8IDB4NDAgfCAweDIwOyAgIC8qIG5lZyBoL3Ygc3luYywgUkdCMjQoRDAgPSAwKSAqLworICAgICBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCB8fCBTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg1NikgeworCVNpU19Qci0+U2lTX0xDREluZm8gPSAweDgwIHwgMHg0MCB8IDB4MjA7ICAgLyogbmVnIGgvdiBzeW5jLCBSR0IyNChEMCA9IDApICovCiAgICAgIH0KICAgfQogCi0jaWZkZWYgU0lTMzAwCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSB7CisJaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSB7CiAJICAgaWYoKFJPTUFkZHJbMHgyMzNdID09IDB4MTIpICYmIChST01BZGRyWzB4MjM0XSA9PSAweDM0KSkgewotICAgICAgICAgICAgICBpZighKFJPTUFkZHJbMHgyMzVdICYgMHgwMikpIHsKLQkgICAgICAgICBTaVNfUHItPlNpU19MQ0RJbmZvICY9ICh+RG9udEV4cGFuZExDRCk7Ci0gCSAgICAgIH0KKwkgICAgICBpZighKFJPTUFkZHJbMHgyMzVdICYgMHgwMikpIHsKKwkJIFNpU19Qci0+U2lTX0xDREluZm8gJj0gKH5Eb250RXhwYW5kTENEKTsKKwkgICAgICB9CiAJICAgfQotICAgICAgICB9Ci0gICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKKwl9CisgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKIAlpZigoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpICYmICgoTW9kZU5vID09IDB4MDMpIHx8IChNb2RlTm8gPT0gMHgxMCkpKSB7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gJj0gKH5Eb250RXhwYW5kTENEKTsKKwkgICBTaVNfUHItPlNpU19MQ0RJbmZvICY9ICh+RG9udEV4cGFuZExDRCk7CiAJfQogICAgICB9CiAgIH0KQEAgLTIwODAsNyArMjExNSw3IEBACiAKICAgc3dpdGNoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8pIHsKICAgY2FzZSBQYW5lbF82NDB4NDgwOgotICAgICBTaVNfUHItPlNpU19MQ0RJbmZvIHw9IExDRFBhc3MxMTsKKyAgICAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSAoRG9udEV4cGFuZExDRCB8IExDRFBhc3MxMSk7CiAgICAgIGJyZWFrOwogICBjYXNlIFBhbmVsXzEyODB4ODAwOgogICAgICAvKiBEb24ndCBwYXNzIDE6MSBieSBkZWZhdWx0IChUTURTIHNwZWNpYWwpICovCkBAIC0yMDk3LDcgKzIxMzIsNyBAQAogICAgICBicmVhazsKICAgfQogCi0gIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgeworICBpZigoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB8fCAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfVU5LTk9XTkxDRCkpIHsKICAgICAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSAoRG9udEV4cGFuZExDRCB8IExDRFBhc3MxMSk7CiAgIH0KIApAQCAtMjEwNywxOSArMjE0MiwxOSBAQAogICB9CiAKICAgLyogTFZEUyBEREEgKi8KLSAgaWYoISgoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgJiYgKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSkpIHsKKyAgaWYoISgoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSAmJiAoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpKSkgewogCiAgICAgIGlmKChTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB8fCAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpKSB7CiAJaWYoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OID09IDApIHsKIAkgICBpZihNb2RlTm8gPT0gMHgxMikgewogCSAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpIHsKLQkgICAgICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IEVuYWJsZUxWRFNEREE7CisJCSBTaVNfUHItPlNpU19TZXRGbGFnIHw9IEVuYWJsZUxWRFNEREE7CiAJICAgICAgfQogCSAgIH0gZWxzZSBpZihNb2RlTm8gPiAweDEzKSB7CiAJICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDYwMCkgewotCSAgICAgICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpKSB7Ci0JICAgICAgICAgICAgaWYoKHJlc2luZm8gPT0gU0lTX1JJXzgwMHg2MDApIHx8IChyZXNpbmZvID09IFNJU19SSV80MDB4MzAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IEVuYWJsZUxWRFNEREE7CisJCSBpZighKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSkgeworCQkgICAgaWYoKHJlc2luZm8gPT0gU0lTX1JJXzgwMHg2MDApIHx8IChyZXNpbmZvID09IFNJU19SSV80MDB4MzAwKSkgeworCQkgICAgICAgU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBFbmFibGVMVkRTRERBOwogCQkgICAgfQogCQkgfQogCSAgICAgIH0KQEAgLTIxMjgsMTggKzIxNjMsMTggQEAKICAgICAgfQogCiAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OID09IDEpIHsKKwlpZihTaVNfUHItPlNpU19JRl9ERUZfVFJVTVBJT04gPT0gMSkgewogCSAgIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gRW5hYmxlTFZEU0REQTsKLSAgICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB7CisJfSBlbHNlIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB7CiAJICAgU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBFbmFibGVMVkRTRERBOwogCX0gZWxzZSBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzY0MHg0ODApIHsKIAkgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IEVuYWJsZUxWRFNEREE7CiAJfSBlbHNlIGlmKE1vZGVObyA+IDB4MTMpIHsKLSAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgewotICAgICAgICAgICAgICBpZihyZXNpbmZvID09IFNJU19SSV81MTJ4Mzg0KSBTaVNfUHItPlNpU19TZXRGbGFnIHw9IEVuYWJsZUxWRFNEREE7Ci0gICAgICAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzgwMHg2MDApIHsKLSAgICAgICAgICAgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfNDAweDMwMCkgU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBFbmFibGVMVkRTRERBOwotICAgICAgICAgICB9CisJICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgeworCSAgICAgIGlmKHJlc2luZm8gPT0gU0lTX1JJXzUxMngzODQpIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gRW5hYmxlTFZEU0REQTsKKwkgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF84MDB4NjAwKSB7CisJICAgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfNDAweDMwMCkgU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBFbmFibGVMVkRTRERBOworCSAgIH0KIAl9CiAgICAgIH0KIApAQCAtMjE0OCwyMSArMjE4MywyMSBAQAogICAvKiBWRVNBIHRpbWluZyAqLwogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewogICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXROb3RTaW11TW9kZSkgewotICAgICAJU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBMQ0RWRVNBVGltaW5nOworCVNpU19Qci0+U2lTX1NldEZsYWcgfD0gTENEVkVTQVRpbWluZzsKICAgICAgfQogICB9IGVsc2UgewogICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IExDRFZFU0FUaW1pbmc7CiAgIH0KIAotI2lmZGVmIExJTlVYX0tFUk5FTAotI2lmZGVmIFRXREVCVUcKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisjaWYgMAogICBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IChMQ0RJbmZvPTB4JTA0eCBMQ0RSZXNJbmZvPTB4JTAyeCBMQ0RUeXBlSW5mbz0weCUwMngpXG4iLAogCVNpU19Qci0+U2lTX0xDREluZm8sIFNpU19Qci0+U2lTX0xDRFJlc0luZm8sIFNpU19Qci0+U2lTX0xDRFR5cGVJbmZvKTsKICNlbmRpZgogI2VuZGlmCi0jaWZkZWYgTElOVVhfWEY4NgorI2lmZGVmIFNJU19YT1JHX1hGODYKICAgeGY4NkRydk1zZ1ZlcmIoMCwgWF9QUk9CRUQsIDQsCi0gIAkiKGluaXQzMDE6IExDREluZm89MHglMDR4IExDRFJlc0luZm89MHglMDJ4IExDRFR5cGVJbmZvPTB4JTAyeCBTZXRGbGFnPTB4JTA0eClcbiIsCisJIihpbml0MzAxOiBMQ0RJbmZvPTB4JTA0eCBMQ0RSZXNJbmZvPTB4JTAyeCBMQ0RUeXBlSW5mbz0weCUwMnggU2V0RmxhZz0weCUwNHgpXG4iLAogCVNpU19Qci0+U2lTX0xDREluZm8sIFNpU19Qci0+U2lTX0xDRFJlc0luZm8sIFNpU19Qci0+U2lTX0xDRFR5cGVJbmZvLCBTaVNfUHItPlNpU19TZXRGbGFnKTsKICNlbmRpZgogfQpAQCAtMjE3MSw0NSArMjIwNiw0NiBAQAogLyogICAgICAgICAgICAgICAgIEdFVCBWQ0xLICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLVVTSE9SVAotU2lTX0dldFZDTEsyUHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQU0lTX0hXX0lORk8gSHdJbmZvKQordW5zaWduZWQgc2hvcnQKK1NpU19HZXRWQ0xLMlB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewotICBVU0hPUlQgQ1JUMkluZGV4LFZDTEtJbmRleD0wLFZDTEtJbmRleEdFTj0wOwotICBVU0hPUlQgbW9kZWZsYWcscmVzaW5mbyx0ZW1wYng7Ci0gIGNvbnN0IFVDSEFSICpDSFRWVkNMS1B0ciA9IE5VTEw7CisgIHVuc2lnbmVkIHNob3J0IENSVDJJbmRleCwgVkNMS0luZGV4ID0gMCwgVkNMS0luZGV4R0VOID0gMCwgVkNMS0luZGV4R0VOQ1JUID0gMDsKKyAgdW5zaWduZWQgc2hvcnQgbW9kZWZsYWcsIHJlc2luZm8sIHRlbXBieDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqQ0hUVlZDTEtQdHIgPSBOVUxMOwogCiAgIGlmKE1vZGVObyA8PSAweDEzKSB7CiAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9Nb2RlRmxhZzsKICAgICAgcmVzaW5mbyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfUmVzSW5mbzsKICAgICAgQ1JUMkluZGV4ID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQzsKICAgICAgVkNMS0luZGV4R0VOID0gKFNpU19HZXRSZWdCeXRlKChTaVNfUHItPlNpU19QM2NhKzB4MDIpKSA+PiAyKSAmIDB4MDM7CisgICAgIFZDTEtJbmRleEdFTkNSVCA9IFZDTEtJbmRleEdFTjsKICAgfSBlbHNlIHsKICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKICAgICAgcmVzaW5mbyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X1JFU0lORk87CiAgICAgIENSVDJJbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVDJDUlRDOwogICAgICBWQ0xLSW5kZXhHRU4gPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlRWQ0xLOwotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSBWQ0xLSW5kZXhHRU4gJj0gMHgzZjsKKyAgICAgVkNMS0luZGV4R0VOQ1JUID0gU2lTX0dldFJlZkNSVFZDTEsoU2lTX1ByLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCShTaVNfUHItPlNpU19TZXRGbGFnICYgUHJvZ3JhbW1pbmdDUlQyKSA/IFNpU19Qci0+U2lTX1VzZVdpZGVDUlQyIDogU2lTX1ByLT5TaVNfVXNlV2lkZSk7CiAgIH0KIAogICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgeyAgICAvKiAzMHgvQi9MViAqLwogCiAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIpIHsKIAotICAgICAgICBDUlQySW5kZXggPj49IDY7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgeyAgICAgIAkvKiAgTENEICovCisJQ1JUMkluZGV4ID4+PSA2OworCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgeyAgICAgIAkvKiAgTENEICovCiAKLSAgICAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCSAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCSAgICAgIFZDTEtJbmRleCA9IFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwOwogCSAgICAgIGlmKChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgJiYgKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSB7Ci0JICAgICAgICAgVkNMS0luZGV4ID0gVkNMS0luZGV4R0VOOworCQkgVkNMS0luZGV4ID0gVkNMS0luZGV4R0VOOwogCSAgICAgIH0KIAkgICB9IGVsc2UgewogCSAgICAgIFZDTEtJbmRleCA9IFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1OwogCSAgICAgIGlmKChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgJiYgKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSB7CiAJCSBzd2l0Y2gocmVzaW5mbykgewotCQkgLyogT25seSB0aG9zZSB3aG9zZSBJbmRleEdFTiBkb2Vzbid0IG1hdGNoIFZCVkNMSyBhcnJheSAqLwotCQkgY2FzZSBTSVNfUklfMTI4MHg3MjA6IFZDTEtJbmRleCA9IFZDTEtfMTI4MHg3MjA7IGJyZWFrOworCQkgLyogQ29ycmVjdCB0aG9zZSB3aG9zZSBJbmRleEdFTiBkb2Vzbid0IG1hdGNoIFZCVkNMSyBhcnJheSAqLwogCQkgY2FzZSBTSVNfUklfNzIweDQ4MDogIFZDTEtJbmRleCA9IFZDTEtfNzIweDQ4MDsgIGJyZWFrOwogCQkgY2FzZSBTSVNfUklfNzIweDU3NjogIFZDTEtJbmRleCA9IFZDTEtfNzIweDU3NjsgIGJyZWFrOwogCQkgY2FzZSBTSVNfUklfNzY4eDU3NjogIFZDTEtJbmRleCA9IFZDTEtfNzY4eDU3NjsgIGJyZWFrOwpAQCAtMjIxOCwxOCArMjI1NCwxOSBAQAogCQkgY2FzZSBTSVNfUklfODAweDQ4MDogIFZDTEtJbmRleCA9IFZDTEtfODAweDQ4MDsgIGJyZWFrOwogCQkgY2FzZSBTSVNfUklfMTAyNHg1NzY6IFZDTEtJbmRleCA9IFZDTEtfMTAyNHg1NzY7IGJyZWFrOwogCQkgY2FzZSBTSVNfUklfMTE1Mng4NjQ6IFZDTEtJbmRleCA9IFZDTEtfMTE1Mng4NjQ7IGJyZWFrOworCQkgY2FzZSBTSVNfUklfMTI4MHg3MjA6IFZDTEtJbmRleCA9IFZDTEtfMTI4MHg3MjA7IGJyZWFrOwogCQkgY2FzZSBTSVNfUklfMTM2MHg3Njg6IFZDTEtJbmRleCA9IFZDTEtfMTM2MHg3Njg7IGJyZWFrOwogCQkgZGVmYXVsdDogICAgICAgICAgICAgIFZDTEtJbmRleCA9IFZDTEtJbmRleEdFTjsKIAkJIH0KIAogCQkgaWYoTW9kZU5vIDw9IDB4MTMpIHsKLQkJICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDw9IFNJU18zMTVQUk8pIHsKKwkJICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPD0gU0lTXzMxNVBSTykgewogCQkgICAgICAgaWYoU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQyA9PSAxKSBWQ0xLSW5kZXggPSAweDQyOwotCSAgICAgICAgICAgIH0gZWxzZSB7CisJCSAgICB9IGVsc2UgewogCQkgICAgICAgaWYoU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQyA9PSAxKSBWQ0xLSW5kZXggPSAweDAwOwogCQkgICAgfQogCQkgfQotCQkgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPD0gU0lTXzMxNVBSTykgeworCQkgaWYoU2lTX1ByLT5DaGlwVHlwZSA8PSBTSVNfMzE1UFJPKSB7CiAJCSAgICBpZihWQ0xLSW5kZXggPT0gMCkgVkNMS0luZGV4ID0gMHg0MTsKIAkJICAgIGlmKFZDTEtJbmRleCA9PSAxKSBWQ0xLSW5kZXggPSAweDQzOwogCQkgICAgaWYoVkNMS0luZGV4ID09IDQpIFZDTEtJbmRleCA9IDB4NDQ7CkBAIC0yMjM3LDQ5ICsyMjc0LDQ2IEBACiAJICAgICAgfQogCSAgIH0KIAotICAgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsgICAgICAgICAgICAgICAgIAkvKiAgVFYgKi8KKwl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsgICAgICAgICAgICAgICAgIAkvKiAgVFYgKi8KIAogCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB7Ci0gICAgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWUlBMTERJVjJYTykgCQlWQ0xLSW5kZXggPSBIaVRWVkNMS0RJVjI7Ci0gICAgIAkgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJVkNMS0luZGV4ID0gSGlUVlZDTEs7Ci0gICAgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgewotICAgICAgICAgICAgCSBpZihtb2RlZmxhZyAmIENoYXJ4OERvdCkgCSAgICAJCVZDTEtJbmRleCA9IEhpVFZTaW11VkNMSzsKLSAgICAgICAgICAgIAkgZWxzZSAJCQkgIAkgICAgCQlWQ0xLSW5kZXggPSBIaVRWVGV4dFZDTEs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI3NTBwKSAJVkNMS0luZGV4ID0gWVBiUHI3NTBwVkNMSzsKLQkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVwKSAgIAlWQ0xLSW5kZXggPSBUVlZDTEtESVYyOwotCSAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZSUExMRElWMlhPKSAgICAgCVZDTEtJbmRleCA9IFRWVkNMS0RJVjI7Ci0gICAgICAgICAgIGVsc2UgICAgICAgICAJCSAgICAgICAgICAgIAkgIAlWQ0xLSW5kZXggPSBUVlZDTEs7CisJICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZSUExMRElWMlhPKSAJICAgVkNMS0luZGV4ID0gSGlUVlZDTEtESVYyOworCSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgIFZDTEtJbmRleCA9IEhpVFZWQ0xLOworCSAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgICAgIFZDTEtJbmRleCA9IEhpVFZTaW11VkNMSzsKKwkgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjc1MHApICBWQ0xLSW5kZXggPSBZUGJQcjc1MHBWQ0xLOworCSAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjUyNXApICAgIFZDTEtJbmRleCA9IFRWVkNMS0RJVjI7CisJICAgZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlJQTExESVYyWE8pICAgICAgVkNMS0luZGV4ID0gVFZWQ0xLRElWMjsKKwkgICBlbHNlCQkJCQkJICAgVkNMS0luZGV4ID0gVFZWQ0xLOwogCi0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgVkNMS0luZGV4ICs9IFRWQ0xLQkFTRV8zMDA7Ci0gIAkgICBlbHNlIAkgICAgICAgICAgICAgICAgICAgIFZDTEtJbmRleCArPSBUVkNMS0JBU0VfMzE1OworCSAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgVkNMS0luZGV4ICs9IFRWQ0xLQkFTRV8zMDA7CisJICAgZWxzZQkJCQkgICBWQ0xLSW5kZXggKz0gVFZDTEtCQVNFXzMxNTsKIAotICAgICAgICB9IGVsc2UgeyAgICAgICAgIAkJCQkJCS8qIFZHQTIgKi8KKwl9IGVsc2UgewkJCQkJCQkvKiBWR0EyICovCiAKLQkgICBWQ0xLSW5kZXggPSBWQ0xLSW5kZXhHRU47Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotICAgICAgICAgICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0JCSBpZiggKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182MzApICYmCi0JCSAgICAgKEh3SW5mby0+akNoaXBSZXZpc2lvbiA+PSAweDMwKSkgeworCSAgIFZDTEtJbmRleCA9IFZDTEtJbmRleEdFTkNSVDsKKwkgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkgICAgICBpZihNb2RlTm8gPiAweDEzKSB7CisJCSBpZiggKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzYzMCkgJiYKKwkJICAgICAoU2lTX1ByLT5DaGlwUmV2aXNpb24gPj0gMHgzMCkpIHsKIAkJICAgIGlmKFZDTEtJbmRleCA9PSAweDE0KSBWQ0xLSW5kZXggPSAweDM0OwogCQkgfQogCQkgLyogQmV0dGVyIFZHQTIgY2xvY2sgZm9yIDEyODB4MTAyNEA3NSAqLwogCQkgaWYoVkNMS0luZGV4ID09IDB4MTcpIFZDTEtJbmRleCA9IDB4NDU7CiAJICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkgICB9CisJfQogCiAgICAgIH0gZWxzZSB7ICAgLyogSWYgbm90IHByb2dyYW1taW5nIENSVDIgKi8KIAotICAgICAgICBWQ0xLSW5kZXggPSBWQ0xLSW5kZXhHRU47Ci0JaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotICAgICAgICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0JICAgICAgaWYoIChId0luZm8tPmpDaGlwVHlwZSAhPSBTSVNfNjMwKSAmJgotCQkgIChId0luZm8tPmpDaGlwVHlwZSAhPSBTSVNfMzAwKSApIHsKKwlWQ0xLSW5kZXggPSBWQ0xLSW5kZXhHRU5DUlQ7CisJaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CisJICAgaWYoTW9kZU5vID4gMHgxMykgeworCSAgICAgIGlmKCAoU2lTX1ByLT5DaGlwVHlwZSAhPSBTSVNfNjMwKSAmJgorCQkgIChTaVNfUHItPkNoaXBUeXBlICE9IFNJU18zMDApICkgewogCQkgaWYoVkNMS0luZGV4ID09IDB4MWIpIFZDTEtJbmRleCA9IDB4NDg7CiAJICAgICAgfQogCSAgIH0KLSAgICAgICAgfQorCX0KICAgICAgfQogCiAgIH0gZWxzZSB7ICAgICAgIC8qICAgTFZEUyAgKi8KQEAgLTIyODgsMTIgKzIzMjIsMTIgQEAKIAogICAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgUHJvZ3JhbW1pbmdDUlQyKSB7CiAKLSAgICAgICAgaWYoIChTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgKSB7CisJaWYoIChTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgKSB7CiAKIAkgICBWQ0xLSW5kZXggJj0gMHgxZjsKLSAgICAgICAgICAgdGVtcGJ4ID0gMDsKKwkgICB0ZW1wYnggPSAwOwogCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0Q0hPdmVyU2NhbikgdGVtcGJ4ICs9IDE7Ci0gICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSB7CisJICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKIAkgICAgICB0ZW1wYnggKz0gMjsKIAkgICAgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVWR0EpIHsKIAkJIGlmKFNpU19Qci0+U2lTX0NIU092ZXJTY2FuKSB0ZW1wYnggPSA4OwpAQCAtMjMwNiw2NiArMjM0MCw2OCBAQAogCQkgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRDSE92ZXJTY2FuKSB0ZW1wYnggKz0gMTsKIAkgICAgICB9CiAJICAgfQotICAgICAgIAkgICBzd2l0Y2godGVtcGJ4KSB7Ci0gICAgICAgICAgICAgY2FzZSAgMDogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS1VOVFNDOyAgYnJlYWs7Ci0gICAgICAgICAgICAgY2FzZSAgMTogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS09OVFNDOyAgYnJlYWs7Ci0gICAgICAgICAgICAgY2FzZSAgMjogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS1VQQUw7ICAgYnJlYWs7Ci0gICAgICAgICAgICAgY2FzZSAgMzogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS09QQUw7ICAgYnJlYWs7CisJICAgc3dpdGNoKHRlbXBieCkgeworCSAgICAgY2FzZSAgMDogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS1VOVFNDOyAgYnJlYWs7CisJICAgICBjYXNlICAxOiBDSFRWVkNMS1B0ciA9IFNpU19Qci0+U2lTX0NIVFZWQ0xLT05UU0M7ICBicmVhazsKKwkgICAgIGNhc2UgIDI6IENIVFZWQ0xLUHRyID0gU2lTX1ByLT5TaVNfQ0hUVlZDTEtVUEFMOyAgIGJyZWFrOworCSAgICAgY2FzZSAgMzogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS09QQUw7ICAgYnJlYWs7CiAJICAgICBjYXNlICA0OiBDSFRWVkNMS1B0ciA9IFNpU19Qci0+U2lTX0NIVFZWQ0xLVVBBTE07ICBicmVhazsKLSAgICAgICAgICAgICBjYXNlICA1OiBDSFRWVkNMS1B0ciA9IFNpU19Qci0+U2lTX0NIVFZWQ0xLT1BBTE07ICBicmVhazsKLSAgICAgICAgICAgICBjYXNlICA2OiBDSFRWVkNMS1B0ciA9IFNpU19Qci0+U2lTX0NIVFZWQ0xLVVBBTE47ICBicmVhazsKLSAgICAgICAgICAgICBjYXNlICA3OiBDSFRWVkNMS1B0ciA9IFNpU19Qci0+U2lTX0NIVFZWQ0xLT1BBTE47ICBicmVhazsKKwkgICAgIGNhc2UgIDU6IENIVFZWQ0xLUHRyID0gU2lTX1ByLT5TaVNfQ0hUVlZDTEtPUEFMTTsgIGJyZWFrOworCSAgICAgY2FzZSAgNjogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS1VQQUxOOyAgYnJlYWs7CisJICAgICBjYXNlICA3OiBDSFRWVkNMS1B0ciA9IFNpU19Qci0+U2lTX0NIVFZWQ0xLT1BBTE47ICBicmVhazsKIAkgICAgIGNhc2UgIDg6IENIVFZWQ0xLUHRyID0gU2lTX1ByLT5TaVNfQ0hUVlZDTEtTT1BBTDsgIGJyZWFrOwogCSAgICAgZGVmYXVsdDogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS09QQUw7ICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgVkNMS0luZGV4ID0gQ0hUVlZDTEtQdHJbVkNMS0luZGV4XTsKKwkgICB9CisJICAgVkNMS0luZGV4ID0gQ0hUVlZDTEtQdHJbVkNMS0luZGV4XTsKIAotICAgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CisJfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewogCi0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCSAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCSAgICAgIFZDTEtJbmRleCA9IFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwOwogCSAgIH0gZWxzZSB7CiAJICAgICAgVkNMS0luZGV4ID0gU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTU7CiAJICAgfQogCisjaWZkZWYgU0lTMzAwCiAJICAgLyogU3BlY2lhbCBUaW1pbmc6IEJhcmNvIGlRIFBybyBSIHNlcmllcyAqLwogCSAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTM2NikgVkNMS0luZGV4ID0gMHg0NDsKIAotCSAgIC8qIFNwZWNpYWwgVGltaW5nOiA4NDh4NDgwIHBhcmFsbGVsIGx2ZHMgKi8KLQkgICBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgewotCSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkgICAvKiBTcGVjaWFsIFRpbWluZzogODQ4eDQ4MCBhbmQgODU2eDQ4MCBwYXJhbGxlbCBsdmRzIHBhbmVscyAqLworCSAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODQ4IHx8IFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODU2KSB7CisJICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CiAJCSBWQ0xLSW5kZXggPSBWQ0xLMzRfMzAwOwotCSAgICAgICAgIC8qIGlmKHJlc2luZm8gPT0gU0lTX1JJXzEzNjB4NzY4KSBWQ0xLSW5kZXggPSA/OyAqLworCQkgLyogaWYocmVzaW5mbyA9PSBTSVNfUklfMTM2MHg3NjgpIFZDTEtJbmRleCA9ID87ICovCiAJICAgICAgfSBlbHNlIHsKIAkJIFZDTEtJbmRleCA9IFZDTEszNF8zMTU7CiAJCSAvKiBpZihyZXNpbmZvID09IFNJU19SSV8xMzYweDc2OCkgVkNMS0luZGV4ID0gPzsgKi8KIAkgICAgICB9CiAJICAgfQorI2VuZGlmCiAKLSAgICAgICAgfSBlbHNlIHsKKwl9IGVsc2UgewogCi0JICAgVkNMS0luZGV4ID0gVkNMS0luZGV4R0VOOwotCSAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSAgICAgICAgICAgICAgaWYoTW9kZU5vID4gMHgxMykgewotCQkgaWYoIChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjMwKSAmJgotICAgICAgICAgICAgICAgICAgICAgKEh3SW5mby0+akNoaXBSZXZpc2lvbiA+PSAweDMwKSApIHsKKwkgICBWQ0xLSW5kZXggPSBWQ0xLSW5kZXhHRU5DUlQ7CisJICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CisJICAgICAgaWYoTW9kZU5vID4gMHgxMykgeworCQkgaWYoIChTaVNfUHItPkNoaXBUeXBlID09IFNJU182MzApICYmCisJCSAgICAgKFNpU19Qci0+Q2hpcFJldmlzaW9uID49IDB4MzApICkgewogCQkgICAgaWYoVkNMS0luZGV4ID09IDB4MTQpIFZDTEtJbmRleCA9IDB4MmU7Ci0JICAgICAgICAgfQotICAgICAgICAgICAgICB9CisJCSB9CisJICAgICAgfQogCSAgIH0KLSAgICAgICAgfQorCX0KIAogICAgICB9IGVsc2UgeyAgLyogaWYgbm90IHByb2dyYW1taW5nIENSVDIgKi8KIAotICAgICAgICBWQ0xLSW5kZXggPSBWQ0xLSW5kZXhHRU47Ci0JaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotICAgICAgICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0JICAgICAgaWYoIChId0luZm8tPmpDaGlwVHlwZSAhPSBTSVNfNjMwKSAmJgotCSAgICAgICAgICAoSHdJbmZvLT5qQ2hpcFR5cGUgIT0gU0lTXzMwMCkgKSB7CisJVkNMS0luZGV4ID0gVkNMS0luZGV4R0VOQ1JUOworCWlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCSAgIGlmKE1vZGVObyA+IDB4MTMpIHsKKwkgICAgICBpZiggKFNpU19Qci0+Q2hpcFR5cGUgIT0gU0lTXzYzMCkgJiYKKwkJICAoU2lTX1ByLT5DaGlwVHlwZSAhPSBTSVNfMzAwKSApIHsKIAkJIGlmKFZDTEtJbmRleCA9PSAweDFiKSBWQ0xLSW5kZXggPSAweDQ4OwogCSAgICAgIH0KICNpZiAwCi0JICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgeworCSAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzczMCkgewogCQkgaWYoVkNMS0luZGV4ID09IDB4MGIpIFZDTEtJbmRleCA9IDB4NDA7ICAgLyogMTAyNHg3NjgtNzAgKi8KIAkJIGlmKFZDTEtJbmRleCA9PSAweDBkKSBWQ0xLSW5kZXggPSAweDQxOyAgIC8qIDEwMjR4NzY4LTc1ICovCiAJICAgICAgfQpAQCAtMjM3NywxMSArMjQxMywxMyBAQAogCiAgIH0KIAorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiVkNMS0luZGV4ICVkICgweCV4KVxuIiwgVkNMS0luZGV4LCBWQ0xLSW5kZXgpOwogI2VuZGlmCisjZW5kaWYKIAotICByZXR1cm4oVkNMS0luZGV4KTsKKyAgcmV0dXJuIFZDTEtJbmRleDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzODksMjYgKzI0MjcsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0Q1JUMk1vZGVSZWdzKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRDUlQyTW9kZVJlZ3Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFVTSE9SVCBpLGosbW9kZWZsYWc7Ci0gIFVTSE9SVCB0ZW1wY2wsdGVtcGFoPTA7CisgIHVuc2lnbmVkIHNob3J0IGksIGosIG1vZGVmbGFnLCB0ZW1wYWg9MDsKKyAgc2hvcnQgdGVtcGNsOwogI2lmIGRlZmluZWQoU0lTMzAwKSB8fCBkZWZpbmVkKFNJUzMxNUgpCi0gIFVTSE9SVCB0ZW1wYmw7CisgIHVuc2lnbmVkIHNob3J0IHRlbXBibDsKICNlbmRpZgogI2lmZGVmIFNJUzMxNUgKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgdGVtcGFoMiwgdGVtcGJsMjsKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wYWgyLCB0ZW1wYmwyOwogI2VuZGlmCiAKLSAgaWYoTW9kZU5vIDw9IDB4MTMpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOwotICB9IGVsc2UgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5DTW9kZUZsYWc7Ci0gIH0gZWxzZSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gIH0KKyAgbW9kZWZsYWcgPSBTaVNfR2V0TW9kZUZsYWcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7CiAKQEAgLTI0MTgsMTggKzI0NDksMTggQEAKICAgfSBlbHNlIHsKIAogICAgICBmb3IoaT0wLGo9NDsgaTwzOyBpKyssaisrKSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxqLDApOwotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDIsMHg3Rik7CiAgICAgIH0KIAogICAgICB0ZW1wY2wgPSBTaVNfUHItPlNpU19Nb2RlVHlwZTsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwICAgIC8qIC0tLS0gMzAwIHNlcmllcyAtLS0tICovCiAKLSAgICAgICAgLyogRm9yIDMwMUJESDogKHdpdGggTENEIHZpYSBMVkRTKSAqLwotICAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgeworCS8qIEZvciAzMDFCREg6ICh3aXRoIExDRCB2aWEgTFZEUykgKi8KKwlpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgewogCSAgIHRlbXBibCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDMyKTsKIAkgICB0ZW1wYmwgJj0gMHhlZjsKIAkgICB0ZW1wYmwgfD0gMHgwMjsKQEAgLTI0MzgsMTYgKzI0NjksMTYgQEAKIAkgICAgICB0ZW1wYmwgJj0gMHhmZDsKIAkgICB9CiAJICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MzIsdGVtcGJsKTsKLSAgICAgICAgfQorCX0KIAotICAgICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gICAgICAgICAgIHRlbXBjbCAtPSBNb2RlVkdBOwotICAgICAgICAgICBpZigodGVtcGNsID4gMCkgfHwgKHRlbXBjbCA9PSAwKSkgeyAgICAgIC8qIHRlbXBjbCBpcyBVU0hPUlQgLT4gYWx3YXlzIHRydWUhICovCi0gICAgICAgICAgICAgIHRlbXBhaCA9ICgoMHgxMCA+PiB0ZW1wY2wpIHwgMHg4MCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHRlbXBhaCA9IDB4ODA7CisJaWYoTW9kZU5vID4gMHgxMykgeworCSAgIHRlbXBjbCAtPSBNb2RlVkdBOworCSAgIGlmKHRlbXBjbCA+PSAwKSB7CisJICAgICAgdGVtcGFoID0gKCgweDEwID4+IHRlbXBjbCkgfCAweDgwKTsKKwkgICB9CisJfSBlbHNlIHRlbXBhaCA9IDB4ODA7CiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpICB0ZW1wYWggXj0gMHhBMDsKKwlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgIHRlbXBhaCBePSAweEEwOwogCiAjZW5kaWYgIC8qIFNJUzMwMCAqLwogCkBAIC0yNDU1LDIyICsyNDg2LDE2IEBACiAKICNpZmRlZiBTSVMzMTVIICAgIC8qIC0tLS0tLS0gMzE1LzMzMCBzZXJpZXMgLS0tLS0tICovCiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0gICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkgewotCSAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZSwweDA4KTsKLSAgICAgICAgICAgfQotICAgICAgICB9CisJaWYoTW9kZU5vID4gMHgxMykgeworCSAgIHRlbXBjbCAtPSBNb2RlVkdBOworCSAgIGlmKHRlbXBjbCA+PSAwKSB7CisJICAgICAgdGVtcGFoID0gKDB4MDggPj4gdGVtcGNsKTsKKwkgICAgICBpZiAodGVtcGFoID09IDApIHRlbXBhaCA9IDE7CisJICAgICAgdGVtcGFoIHw9IDB4NDA7CisJICAgfQorCX0gZWxzZSB0ZW1wYWggPSAweDQwOwogCi0gICAgICAgIGlmKE1vZGVObyA+IDB4MTMpIHsKLSAgICAgICAgICAgdGVtcGNsIC09IE1vZGVWR0E7Ci0gICAgICAgICAgIGlmKCh0ZW1wY2wgPiAwKSB8fCAodGVtcGNsID09IDApKSB7ICAvKiB0ZW1wY2wgaXMgVVNIT1JUIC0+IGFsd2F5cyB0cnVlISAqLwotICAgICAgICAgICAgICB0ZW1wYWggPSAoMHgwOCA+PiB0ZW1wY2wpOwotICAgICAgICAgICAgICBpZiAodGVtcGFoID09IDApIHRlbXBhaCA9IDE7Ci0gICAgICAgICAgICAgIHRlbXBhaCB8PSAweDQwOwotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB0ZW1wYWggPSAweDQwOwotCi0gICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB0ZW1wYWggXj0gMHg1MDsKKwlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgdGVtcGFoIF49IDB4NTA7CiAKICNlbmRpZiAgLyogU0lTMzE1SCAqLwogCkBAIC0yNDc4LDg0ICsyNTAzLDg5IEBACiAKICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgRGlzYWJsZUNSVDJEaXNwbGF5KSB0ZW1wYWggPSAwOwogCi0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCx0ZW1wYWgpOworICAgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwlTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLHRlbXBhaCk7CiAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKLSAgICAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4YTAsdGVtcGFoKTsKLSAgICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7Ci0gICAgICAgICAgIGlmKElTX1NJUzc0MCkgeworI2lmZGVmIFNJUzMxNUgKKwlpZihTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB7CisJICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4YTAsdGVtcGFoKTsKKwl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKwkgICBpZihJU19TSVM3NDApIHsKIAkgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLHRlbXBhaCk7CiAJICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4YTAsdGVtcGFoKTsKKwkgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDAsMHhhMCx0ZW1wYWgpOwogCSAgIH0KLSAgICAgICAgfQorCX0KKyNlbmRpZgogICAgICB9CiAKICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAotICAgICAgICB0ZW1wYWggPSAweDAxOwotICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgewotICAgICAgCSAgIHRlbXBhaCB8PSAweDAyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvUkFNREFDKSkgewotICAgICAgCSAgIHRlbXBhaCBePSAweDA1OwotICAgICAgCSAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSkgewotICAgICAgICAgICAgICB0ZW1wYWggXj0gMHgwMTsKLSAgICAgIAkgICB9Ci0gICAgICAgIH0KKwl0ZW1wYWggPSAweDAxOworCWlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB7CisJICAgdGVtcGFoIHw9IDB4MDI7CisJfQorCWlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvUkFNREFDKSkgeworCSAgIHRlbXBhaCBePSAweDA1OworCSAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSkgeworCSAgICAgIHRlbXBhaCBePSAweDAxOworCSAgIH0KKwl9CiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgRGlzYWJsZUNSVDJEaXNwbGF5KSAgdGVtcGFoID0gMDsKKwlpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKIAotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisJICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgRGlzYWJsZUNSVDJEaXNwbGF5KSAgdGVtcGFoID0gMDsKIAotICAgICAgCSAgIHRlbXBhaCA9ICh0ZW1wYWggPDwgNSkgJiAweEZGOwotICAgICAgCSAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEsdGVtcGFoKTsKLSAgICAgIAkgICB0ZW1wYWggPSAodGVtcGFoID4+IDUpICYgMHhGRjsKKwkgICB0ZW1wYWggPSAodGVtcGFoIDw8IDUpICYgMHhGRjsKKwkgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLHRlbXBhaCk7CisJICAgdGVtcGFoID0gKHRlbXBhaCA+PiA1KSAmIDB4RkY7CiAKLSAgICAgICAgfSBlbHNlIHsKKwl9IGVsc2UgewogCi0gICAgICAJICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJFLDB4RjgsdGVtcGFoKTsKKwkgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBEaXNhYmxlQ1JUMkRpc3BsYXkpICB0ZW1wYWggPSAweDA4OworCSAgIGVsc2UgaWYoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIpKSkgICAgICAgICAgIHRlbXBhaCB8PSAweDA4OworCSAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRSwweEYwLHRlbXBhaCk7CisJICAgdGVtcGFoICY9IH4weDA4OwogCi0gICAgICAgIH0KKwl9CiAKLSAgICAgICAgaWYoKFNpU19Qci0+U2lTX01vZGVUeXBlID09IE1vZGVWR0EpICYmICghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkpIHsKLSAgICAgIAkgICB0ZW1wYWggfD0gMHgxMDsKLSAgICAgICAgfQorCWlmKChTaVNfUHItPlNpU19Nb2RlVHlwZSA9PSBNb2RlVkdBKSAmJiAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpKSB7CisJICAgdGVtcGFoIHw9IDB4MTA7CisJfQogCiAJdGVtcGFoIHw9IDB4ODA7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMSkgeworCWlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMSkgewogCSAgIGlmKFNpU19Qci0+UGFuZWxYUmVzIDwgMTI4MCAmJiBTaVNfUHItPlBhbmVsWVJlcyA8IDk2MCkgdGVtcGFoICY9IH4weDgwOwotICAgICAgICB9CisJfQogCi0gICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CisJaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKIAkgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldFlQYlByNzUwcCB8IFRWU2V0WVBiUHI1MjVwKSkpIHsKLSAgICAgIAkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewotICAgICAgICAgICAgICAgICB0ZW1wYWggfD0gMHgyMDsKKwkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgeworCQkgdGVtcGFoIHw9IDB4MjA7CiAJICAgICAgfQotICAgICAgCSAgIH0KLSAgICAgICAgfQorCSAgIH0KKwl9CiAKLSAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBELDB4NDAsdGVtcGFoKTsKKwlTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MEQsMHg0MCx0ZW1wYWgpOwogCiAJdGVtcGFoID0gMHg4MDsKIAlpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDEpIHsKIAkgICBpZihTaVNfUHItPlBhbmVsWFJlcyA8IDEyODAgJiYgU2lTX1ByLT5QYW5lbFlSZXMgPCA5NjApIHRlbXBhaCA9IDA7CiAJfQogCi0JaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByLCBId0luZm8pKSB0ZW1wYWggfD0gMHg0MDsKKwlpZihTaVNfSXNEdWFsTGluayhTaVNfUHIpKSB0ZW1wYWggfD0gMHg0MDsKIAotICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgeworCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CiAJICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZSUExMRElWMlhPKSB7Ci0gICAgICAgICAgICAgIHRlbXBhaCB8PSAweDQwOwotICAgICAgIAkgICB9Ci0gICAgICAgIH0KKwkgICAgICB0ZW1wYWggfD0gMHg0MDsKKwkgICB9CisJfQogCi0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MEMsdGVtcGFoKTsKKwlTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBDLHRlbXBhaCk7CiAKICAgICAgfSBlbHNlIHsgIC8qIExWRFMgKi8KIAotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworCWlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKIAogI2lmZGVmIFNJUzMxNUgKIAkgICAvKiBMVkRTIGNhbiBvbmx5IGJlIHNsYXZlIGluIDhicHAgbW9kZXMgKi8KQEAgLTI1NjYsMzYgKzI1OTYsMzAgQEAKIAkgICAgICB9CiAJICAgfQogCi0JICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHsKLSAgICAgICAgICAgICAgdGVtcGFoIHw9IDB4MDI7Ci0gICAgCSAgIH0KKwkgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgIHRlbXBhaCB8PSAweDAyOwogCi0JICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKLQkgICAgICB0ZW1wYWggXj0gMHgwMTsKLQkgICB9CisJICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpICAgICAgICB0ZW1wYWggXj0gMHgwMTsKIAotCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkgewotCSAgICAgIHRlbXBhaCA9IDE7Ci0JICAgfQorCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkgdGVtcGFoID0gMTsKIAotICAgIAkgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmUsMHhGMCx0ZW1wYWgpOworCSAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZSwweEYwLHRlbXBhaCk7CiAjZW5kaWYKIAotICAgICAgICB9IGVsc2UgeworCX0gZWxzZSB7CiAKICNpZmRlZiBTSVMzMDAKIAkgICB0ZW1wYWggPSAwOwogCSAgIGlmKCAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpICYmIChTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVWR0EpICkgewotICAgICAgICAgICAgICB0ZW1wYWggfD0gMHgwMjsKLSAgICAJICAgfQorCSAgICAgIHRlbXBhaCB8PSAweDAyOworCSAgIH0KIAkgICB0ZW1wYWggPDw9IDU7CiAKLQkgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBEaXNhYmxlQ1JUMkRpc3BsYXkpICB0ZW1wYWggPSAwOworCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkgdGVtcGFoID0gMDsKIAogCSAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEsdGVtcGFoKTsKICNlbmRpZgogCi0gICAgICAgIH0KKwl9CiAKICAgICAgfQogCkBAIC0yNjAzLDEwICsyNjI3LDEwIEBACiAKICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAKICNpZmRlZiBTSVMzMTVICi0gICAgICAgIHVuc2lnbmVkIGNoYXIgYnJpZGdlcmV2ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwMSk7CisJLyogdW5zaWduZWQgY2hhciBicmlkZ2VyZXYgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDAxKTsgKi8KIAogCS8qIFRoZSBmb2xsb3dpbmcgaXMgbmVhcmx5IHVucHJlZGl0YWJsZSBhbmQgdmFyaWVzIGZyb20gbWFjaGluZQogCSAqIHRvIG1hY2hpbmUuIEVzcGVjaWFsbHkgdGhlIDMwMURIIHNlZW1zIHRvIGJlIGEgcmVhbCB0cm91YmxlCkBAIC0yNjE5LDI1ICsyNjQzLDI4IEBACiAKIAkvKiA3NDAgdmFyaWFudHMgbWF0Y2ggZm9yIDMweEIsIDMwMUItREgsIDMweExWICovCiAKLSAgICAgICAgaWYoIShJU19TSVM3NDApKSB7Ci0gICAgICAgICAgIHRlbXBhaCA9IDB4MDQ7CQkJCQkJICAgLyogRm9yIGFsbCBicmlkZ2VzICovCi0gICAgICAgICAgIHRlbXBibCA9IDB4ZmI7Ci0gICAgICAgICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKLSAgICAgICAgICAgICAgdGVtcGFoID0gMHgwMDsKLQkgICAgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIsIEh3SW5mbykpIHsKKwlpZighKElTX1NJUzc0MCkpIHsKKwkgICB0ZW1wYWggPSAweDA0OwkJCQkJCSAgIC8qIEZvciBhbGwgYnJpZGdlcyAqLworCSAgIHRlbXBibCA9IDB4ZmI7CisJICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkgeworCSAgICAgIHRlbXBhaCA9IDB4MDA7CisJICAgICAgaWYoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkgewogCSAgICAgICAgIHRlbXBibCA9IDB4ZmY7CiAJICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxMyx0ZW1wYmwsdGVtcGFoKTsKKwkgICB9CisJICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEzLHRlbXBibCx0ZW1wYWgpOwogCX0KIAogCS8qIFRoZSBmb2xsb3dpbmcgdHdvIGFyZSByZXNwb25zaWJsZSBmb3IgZXZlbnR1YWxseSB3cm9uZyBjb2xvcnMKIAkgKiBpbiBUViBvdXRwdXQuIFRoZSBESCAoVkJfTm9MQ0QpIGNvbmRpdGlvbnMgYXJlIHVua25vd247IHRoZQogCSAqIGIwIHdhcyBmb3VuZCBpbiBzb21lIDY1MSBtYWNoaW5lIChQaW07IFA0XzIzPTB4ZTUpOyB0aGUgYjEgdmVyc2lvbgogCSAqIGluIGEgNjUwIGJveCAoSmFrZSkuIFdoYXQgaXMgdGhlIGNyaXRlcmlhPworCSAqIEFkZGVuZHVtOiBBbm90aGVyIGNvbWJpbmF0aW9uIDY1MSszMDFCLURIKGIxKSAoUmFwbykgbmVlZHMgc2FtZQorCSAqIHRyZWF0bWVudCBsaWtlIHRoZSA2NTErMzAxQi1ESChiMCkgY2FzZS4gU2VlbXMgbW9yZSB0byBiZSB0aGUKKwkgKiBjaGlwc2V0IHRoYW4gdGhlIGJyaWRnZSByZXZpc2lvbi4KIAkgKi8KIAotCWlmKChJU19TSVM3NDApIHx8IChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB8fCAoU2lTX1ByLT5TaVNfUk9NTmV3KSkgeworCWlmKChJU19TSVM3NDApIHx8IChTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHx8IChTaVNfUHItPlNpU19ST01OZXcpKSB7CiAJICAgdGVtcGFoID0gMHgzMDsKIAkgICB0ZW1wYmwgPSAweGMwOwogCSAgIGlmKChTaVNfUHItPlNpU19WQkluZm8gJiBEaXNhYmxlQ1JUMkRpc3BsYXkpIHx8CkBAIC0yNjQ5LDIwICsyNjc2LDMwIEBACiAJICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDIxLDB4M2YsdGVtcGJsKTsKIAl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSB7CiAJICAgLyogRml4ZXMgIlRWLWJsdWUtYnVnIiBvbiAzMTUrMzAxICovCi0JICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyYywweGNmKTsgICAgIC8qIEZvciAzMDEgICAqLworCSAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmMsMHhjZik7CS8qIEZvciAzMDEgICAqLwogCSAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjEsMHgzZik7Ci0JfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKLQkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmMsMHgzMCk7ICAgICAgLyogRm9yIDMweExWICovCisJfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKKwkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmMsMHgzMCk7CS8qIEZvciAzMHhMViAqLwogCSAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyMSwweGMwKTsKLQl9IGVsc2UgaWYoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSAmJiAoYnJpZGdlcmV2ID09IDB4YjApKSB7Ci0JICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJjLDB4MzApOyAgICAgIC8qIEZvciAzMHhCLURIIHJldiBiMCAob3IgIkRIIG9uIDY1MSI/KSAqLwotCSAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyMSwweGMwKTsKKwl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpIHsJCS8qIEZvciAzMDFCLURIICovCisJICAgdGVtcGFoID0gMHgzMDsgdGVtcGFoMiA9IDB4YzA7CisJICAgdGVtcGJsID0gMHhjZjsgdGVtcGJsMiA9IDB4M2Y7CisJICAgaWYoU2lTX1ByLT5TaVNfVFZCbHVlID09IDApIHsKKwkgICAgICAgICB0ZW1wYWggPSB0ZW1wYWgyID0gMHgwMDsKKwkgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZCbHVlID09IC0xKSB7CisJICAgICAgLyogU2V0IG9uIDY1MS9NNjUwLCBjbGVhciBvbiAzMTUvNjUwICovCisJICAgICAgaWYoIShJU19TSVM2NXgpKSAvKiAoYnJpZGdlcmV2ICE9IDB4YjApICovIHsKKwkgICAgICAgICB0ZW1wYWggPSB0ZW1wYWgyID0gMHgwMDsKKwkgICAgICB9CisJICAgfQorCSAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyYyx0ZW1wYmwsdGVtcGFoKTsKKwkgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjEsdGVtcGJsMix0ZW1wYWgyKTsKIAl9IGVsc2UgewotCSAgIHRlbXBhaCA9IDB4MzA7IHRlbXBhaDIgPSAweGMwOwkJICAgICAgIC8qIEZvciAzMHhCIChhbmQgMzAxQkRIIHJldiBiMSkgKi8KKwkgICB0ZW1wYWggPSAweDMwOyB0ZW1wYWgyID0gMHhjMDsJCSAgICAgICAvKiBGb3IgMzB4QiwgMzAxQyAqLwogCSAgIHRlbXBibCA9IDB4Y2Y7IHRlbXBibDIgPSAweDNmOwogCSAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKIAkgICAgICB0ZW1wYWggPSB0ZW1wYWgyID0gMHgwMDsKLQkgICAgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIsIEh3SW5mbykpIHsKKwkgICAgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIpKSB7CiAJCSB0ZW1wYmwgPSB0ZW1wYmwyID0gMHhmZjsKIAkgICAgICB9CiAJICAgfQpAQCAtMjY3NiwyMyArMjcxMywyMyBAQAogCSAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyMywweDdmLHRlbXBhaCk7CiAJfSBlbHNlIHsKIAkgICB0ZW1wYWggPSAweDAwOwotICAgICAgICAgICB0ZW1wYmwgPSAweDdmOwotICAgICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7Ci0gICAgICAgICAgICAgIHRlbXBibCA9IDB4ZmY7Ci0JICAgICAgaWYoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsIEh3SW5mbykpKSB0ZW1wYWggPSAweDgwOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyMyx0ZW1wYmwsdGVtcGFoKTsKKwkgICB0ZW1wYmwgPSAweDdmOworCSAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKKwkgICAgICB0ZW1wYmwgPSAweGZmOworCSAgICAgIGlmKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkpIHRlbXBhaCA9IDB4ODA7CisJICAgfQorCSAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyMyx0ZW1wYmwsdGVtcGFoKTsKIAl9CiAKICNlbmRpZiAvKiBTSVMzMTVIICovCiAKLSAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgeworICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CiAKICNpZmRlZiBTSVMzMDAKLSAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyMSwweDNmKTsKKwlTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDIxLDB4M2YpOwogCi0gICAgICAgIGlmKChTaVNfUHItPlNpU19WQkluZm8gJiBEaXNhYmxlQ1JUMkRpc3BsYXkpIHx8Ci0gICAgICAgICAgICgoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpICYmCisJaWYoKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkgfHwKKwkgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSAmJgogCSAgICAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSkpIHsKIAkgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDIzLDB4N0YpOwogCX0gZWxzZSB7CkBAIC0yNzAyLDkgKzI3MzksOSBAQAogCiAgICAgIH0KIAotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLSAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBELDB4ODApOwotICAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFDKSB7CisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgeworCVNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwRCwweDgwKTsKKwlpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhDTFYpIHsKIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4M0EsMHhDMCk7CiAgICAgICAgIH0KICAgICAgfQpAQCAtMjcxMiwxNiArMjc0OSwxNiBAQAogICB9IGVsc2UgeyAgLyogTFZEUyAqLwogCiAjaWZkZWYgU0lTMzE1SAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7CisJaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7CiAKLSAgICAgICAgICAgdGVtcGFoID0gMHgwNDsKKwkgICB0ZW1wYWggPSAweDA0OwogCSAgIHRlbXBibCA9IDB4ZmI7Ci0gICAgICAgICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKLSAgICAgICAgICAgICAgdGVtcGFoID0gMHgwMDsKLQkgICAgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIsIEh3SW5mbykpIHRlbXBibCA9IDB4ZmY7Ci0gICAgICAgICAgIH0KKwkgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7CisJICAgICAgdGVtcGFoID0gMHgwMDsKKwkgICAgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIpKSB0ZW1wYmwgPSAweGZmOworCSAgIH0KIAkgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTMsdGVtcGJsLHRlbXBhaCk7CiAKIAkgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBEaXNhYmxlQ1JUMkRpc3BsYXkpIHsKQEAgLTI3MzAsNyArMjc2Nyw3IEBACiAKIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmMsMHgzMCk7CiAKLQl9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzU1MCkgeworCX0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU181NTApIHsKIAogCSAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTMsMHhmYik7CiAJICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJjLDB4MzApOwpAQCAtMjc0OCwyMTIgKzI3ODUsMTIwIEBACiAvKiAgICAgICAgICAgIEdFVCBSRVNPTFVUSU9OIERBVEEgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotVVNIT1JUCi1TaVNfR2V0UmVzSW5mbyhTaVNfUHJpdmF0ZSAqU2lTX1ByLFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4KQordW5zaWduZWQgc2hvcnQKK1NpU19HZXRSZXNJbmZvKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBpZihNb2RlTm8gPD0gMHgxMykgcmV0dXJuKChVU0hPUlQpU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9SZXNJbmZvKTsKLSAgZWxzZSAgICAgICAgICAgICAgIHJldHVybigoVVNIT1JUKVNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X1JFU0lORk8pOworICAgaWYoTW9kZU5vIDw9IDB4MTMpCisgICAgICByZXR1cm4gKCh1bnNpZ25lZCBzaG9ydClTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X1Jlc0luZm8pOworICAgZWxzZQorICAgICAgcmV0dXJuICgodW5zaWduZWQgc2hvcnQpU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfUkVTSU5GTyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfR2V0Q1JUMlJlc0luZm8oU2lTX1ByaXZhdGUgKlNpU19QcixVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0dldENSVDJSZXNJbmZvKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVU0hPUlQgeHJlcyx5cmVzLG1vZGVmbGFnPTAscmVzaW5kZXg7CisgICB1bnNpZ25lZCBzaG9ydCB4cmVzLCB5cmVzLCBtb2RlZmxhZz0wLCByZXNpbmRleDsKIAotICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgeHJlcyA9IFNpU19Qci0+Q0hEaXNwbGF5OwotICAgICBpZihTaVNfUHItPkNNb2RlRmxhZyAmIEhhbGZEQ0xLKSB4cmVzICo9IDI7Ci0gICAgIFNpU19Qci0+U2lTX1ZHQUhERSA9IFNpU19Qci0+U2lTX0hERSA9IHhyZXM7Ci0gICAgIHlyZXMgPSBTaVNfUHItPkNWRGlzcGxheTsKLSAgICAgaWYoU2lTX1ByLT5DTW9kZUZsYWcgJiBEb3VibGVTY2FuTW9kZSkgeXJlcyAqPSAyOwotICAgICBTaVNfUHItPlNpU19WR0FWREUgPSBTaVNfUHItPlNpU19WREUgPSB5cmVzOwotICAgICByZXR1cm47Ci0gIH0KKyAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgeworICAgICAgeHJlcyA9IFNpU19Qci0+Q0hEaXNwbGF5OworICAgICAgaWYoU2lTX1ByLT5DTW9kZUZsYWcgJiBIYWxmRENMSykgeHJlcyA8PD0gMTsKKyAgICAgIFNpU19Qci0+U2lTX1ZHQUhERSA9IFNpU19Qci0+U2lTX0hERSA9IHhyZXM7CisgICAgICAvKiBEb3VibGVTY2FuTW9kZS1jaGVjayBkb25lIGluIENoZWNrQ2FsY0N1c3RvbU1vZGUoKSEgKi8KKyAgICAgIFNpU19Qci0+U2lTX1ZHQVZERSA9IFNpU19Qci0+U2lTX1ZERSA9IFNpU19Qci0+Q1ZEaXNwbGF5OworICAgICAgcmV0dXJuOworICAgfQogCi0gIHJlc2luZGV4ID0gU2lTX0dldFJlc0luZm8oU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCk7CisgICByZXNpbmRleCA9IFNpU19HZXRSZXNJbmZvKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgpOwogCi0gIGlmKE1vZGVObyA8PSAweDEzKSB7Ci0gICAgIHhyZXMgPSBTaVNfUHItPlNpU19TdFJlc0luZm9bcmVzaW5kZXhdLkhUb3RhbDsKLSAgICAgeXJlcyA9IFNpU19Qci0+U2lTX1N0UmVzSW5mb1tyZXNpbmRleF0uVlRvdGFsOwotICB9IGVsc2UgewotICAgICB4cmVzID0gU2lTX1ByLT5TaVNfTW9kZVJlc0luZm9bcmVzaW5kZXhdLkhUb3RhbDsKLSAgICAgeXJlcyA9IFNpU19Qci0+U2lTX01vZGVSZXNJbmZvW3Jlc2luZGV4XS5WVG90YWw7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gIH0KKyAgIGlmKE1vZGVObyA8PSAweDEzKSB7CisgICAgICB4cmVzID0gU2lTX1ByLT5TaVNfU3RSZXNJbmZvW3Jlc2luZGV4XS5IVG90YWw7CisgICAgICB5cmVzID0gU2lTX1ByLT5TaVNfU3RSZXNJbmZvW3Jlc2luZGV4XS5WVG90YWw7CisgICB9IGVsc2UgeworICAgICAgeHJlcyA9IFNpU19Qci0+U2lTX01vZGVSZXNJbmZvW3Jlc2luZGV4XS5IVG90YWw7CisgICAgICB5cmVzID0gU2lTX1ByLT5TaVNfTW9kZVJlc0luZm9bcmVzaW5kZXhdLlZUb3RhbDsKKyAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7CisgICB9CiAKLSAgaWYoIVNpU19Qci0+U2lTX0lGX0RFRl9EU1ROICYmICFTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgeworICAgaWYoIVNpU19Qci0+U2lTX0lGX0RFRl9EU1ROICYmICFTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgewogCi0gICAgIGlmKChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpKSB7Ci0gICAgICAgIGlmKChNb2RlTm8gIT0gMHgwMykgJiYgKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSkgewotICAgICAgICAgICBpZih5cmVzID09IDM1MCkgeXJlcyA9IDQwMDsKLSAgICAgICAgfQotICAgICAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzYSkgJiAweDAxKSB7Ci0gCSAgIGlmKE1vZGVObyA9PSAweDEyKSB5cmVzID0gNDAwOwotICAgICAgICB9Ci0gICAgIH0KKyAgICAgIGlmKChTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSAmJiAoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkpIHsKKwkgaWYoKE1vZGVObyAhPSAweDAzKSAmJiAoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpKSB7CisJICAgIGlmKHlyZXMgPT0gMzUwKSB5cmVzID0gNDAwOworCSB9CisJIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDNhKSAmIDB4MDEpIHsKKwkgICAgaWYoTW9kZU5vID09IDB4MTIpIHlyZXMgPSA0MDA7CisJIH0KKyAgICAgIH0KIAotICAgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSAgICAgICB4cmVzICo9IDI7Ci0gICAgIGlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHlyZXMgKj0gMjsKKyAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspICAgICAgIHhyZXMgPDw9IDE7CisgICAgICBpZihtb2RlZmxhZyAmIERvdWJsZVNjYW5Nb2RlKSB5cmVzIDw8PSAxOwogCi0gIH0KKyAgIH0KIAotICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpICYmICghKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSkpIHsKKyAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgJiYgKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpKSkgewogCi0jaWYgMAotICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEQSB8IFNldENSVDJUb0xDRCB8IFNldENSVDJUb0hpVmlzaW9uKSkgewotICAgICAgICAgICBpZih4cmVzID09IDcyMCkgeHJlcyA9IDY0MDsKLQl9Ci0jZW5kaWYKLQotCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotCSAgIHN3aXRjaChTaVNfUHItPlNpU19MQ0RSZXNJbmZvKSB7CisgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKKwkgc3dpdGNoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8pIHsKIAkgICBjYXNlIFBhbmVsXzEwMjR4NzY4OgogCSAgICAgIGlmKCEoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExDRFZFU0FUaW1pbmcpKSB7Ci0gICAgICAgICAgICAgICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpKSB7Ci0gICAgICAgICAgCSAgICBpZih5cmVzID09IDM1MCkgeXJlcyA9IDM1NzsKLSAgICAgICAgICAJICAgIGlmKHlyZXMgPT0gNDAwKSB5cmVzID0gNDIwOwotICAgICAgICAgICAgCSAgICBpZih5cmVzID09IDQ4MCkgeXJlcyA9IDUyNTsKLSAgICAgICAgCSB9Ci0gICAgICAJICAgICAgfQorCQkgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkpIHsKKwkJICAgIGlmKHlyZXMgPT0gMzUwKSB5cmVzID0gMzU3OworCQkgICAgaWYoeXJlcyA9PSA0MDApIHlyZXMgPSA0MjA7CisJCSAgICBpZih5cmVzID09IDQ4MCkgeXJlcyA9IDUyNTsKKwkJIH0KKwkgICAgICB9CiAJICAgICAgYnJlYWs7CiAJICAgY2FzZSBQYW5lbF8xMjgweDEwMjQ6CiAJICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkpIHsKIAkJIC8qIEJJT1MgYnVnIC0gZG9lcyB0aGlzIHJlZ2FyZGxlc3Mgb2Ygc2NhbGluZyAqLwotICAgICAgCQkgaWYoeXJlcyA9PSA0MDApIHlyZXMgPSA0MDU7CisJCSBpZih5cmVzID09IDQwMCkgeXJlcyA9IDQwNTsKIAkgICAgICB9Ci0gICAgICAJICAgICAgaWYoeXJlcyA9PSAzNTApIHlyZXMgPSAzNjA7Ci0gICAgICAJICAgICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExDRFZFU0FUaW1pbmcpIHsKLSAgICAgICAgICAgICAgICAgaWYoeXJlcyA9PSAzNjApIHlyZXMgPSAzNzU7Ci0gICAgICAJICAgICAgfQorCSAgICAgIGlmKHlyZXMgPT0gMzUwKSB5cmVzID0gMzYwOworCSAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSB7CisJCSBpZih5cmVzID09IDM2MCkgeXJlcyA9IDM3NTsKKwkgICAgICB9CiAJICAgICAgYnJlYWs7CiAJICAgY2FzZSBQYW5lbF8xNjAweDEyMDA6CiAJICAgICAgaWYoIShTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykpIHsKLSAgICAgICAgCSBpZih5cmVzID09IDEwMjQpIHlyZXMgPSAxMDU2OwotICAgICAgCSAgICAgIH0KKwkJIGlmKHlyZXMgPT0gMTAyNCkgeXJlcyA9IDEwNTY7CisJICAgICAgfQogCSAgICAgIGJyZWFrOwotCSAgIH0KLQl9CisJIH0KKyAgICAgIH0KIAotICB9IGVsc2UgeworICAgfSBlbHNlIHsKIAotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewotICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvSGlWaXNpb24pKSB7Ci0gICAgICAgICAgIGlmKHhyZXMgPT0gNzIwKSB4cmVzID0gNjQwOwotCX0KLSAgICAgfSBlbHNlIGlmKHhyZXMgPT0gNzIwKSB4cmVzID0gNjQwOworICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKwkgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0hpVmlzaW9uKSkgeworCSAgICBpZih4cmVzID09IDcyMCkgeHJlcyA9IDY0MDsKKwkgfQorICAgICAgfSBlbHNlIGlmKHhyZXMgPT0gNzIwKSB4cmVzID0gNjQwOwogCi0gICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSB7Ci0JeXJlcyA9IDQwMDsKLSAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTcpICYgMHg4MCkgeXJlcyA9IDQ4MDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTMpICYgMHg4MCkgeXJlcyA9IDQ4MDsKLSAgICAgICAgfQotICAgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfRFNUTiB8fCBTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgIHlyZXMgPSA0ODA7Ci0gICAgIH0KKyAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSB7CisJIHlyZXMgPSA0MDA7CisJIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKwkgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTcpICYgMHg4MCkgeXJlcyA9IDQ4MDsKKwkgfSBlbHNlIHsKKwkgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTMpICYgMHg4MCkgeXJlcyA9IDQ4MDsKKwkgfQorCSBpZihTaVNfUHItPlNpU19JRl9ERUZfRFNUTiB8fCBTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgeXJlcyA9IDQ4MDsKKyAgICAgIH0KIAotICB9Ci0gIFNpU19Qci0+U2lTX1ZHQUhERSA9IFNpU19Qci0+U2lTX0hERSA9IHhyZXM7Ci0gIFNpU19Qci0+U2lTX1ZHQVZERSA9IFNpU19Qci0+U2lTX1ZERSA9IHlyZXM7CisgICB9CisgICBTaVNfUHItPlNpU19WR0FIREUgPSBTaVNfUHItPlNpU19IREUgPSB4cmVzOworICAgU2lTX1ByLT5TaVNfVkdBVkRFID0gU2lTX1ByLT5TaVNfVkRFID0geXJlczsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICBHRVQgQ1JUMiBUSU1JTkcgREFUQSAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgQk9PTEVBTgotU2lTX0dldExWRFNDUlQxUHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLQkJICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgVVNIT1JUICpSZXNJbmRleCwKLQkJICAgVVNIT1JUICpEaXNwbGF5VHlwZSkKLSB7Ci0gIFVTSE9SVCBtb2RlZmxhZz0wOwotCi0gIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKLSAgICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkgewotICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgcmV0dXJuIEZBTFNFOwotICAgICB9Ci0gIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewotICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgICAgcmV0dXJuIEZBTFNFOwotICB9IGVsc2UKLSAgICAgcmV0dXJuIEZBTFNFOwotCi0gIGlmKE1vZGVObyA8PSAweDEzKSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9Nb2RlRmxhZzsKLSAgICAgKCpSZXNJbmRleCkgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X0NSVDJDUlRDOwotICB9IGVsc2UgewotICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVGbGFnOwotICAgICAoKlJlc0luZGV4KSA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVDJDUlRDOwotICB9Ci0KLSAgKCpSZXNJbmRleCkgJj0gMHgzRjsKLQotICBpZigoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCkgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgewotICAgICAoKkRpc3BsYXlUeXBlKSA9IDE4OwotICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pICgqRGlzcGxheVR5cGUpKys7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSB7Ci0gICAgICAJKCpEaXNwbGF5VHlwZSkgKz0gMjsKLQlpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVWR0EpIHsKLQkgICBpZihTaVNfUHItPlNpU19DSFNPdmVyU2NhbikgKCpEaXNwbGF5VHlwZSkgPSA5OTsKLQl9Ci0JaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUxNKSB7Ci0JICAgKCpEaXNwbGF5VHlwZSkgPSAxODsgIC8qIFBBTE0gdXNlcyBOVFNDIGRhdGEgKi8KLQkgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pICgqRGlzcGxheVR5cGUpKys7Ci0JfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTikgewotCSAgICgqRGlzcGxheVR5cGUpID0gMjA7ICAvKiBQQUxOIHVzZXMgUEFMIGRhdGEgICovCi0JICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRDSE92ZXJTY2FuKSAoKkRpc3BsYXlUeXBlKSsrOwotCX0KLSAgICAgfQotICB9IGVsc2UgewotICAgICBzd2l0Y2goU2lTX1ByLT5TaVNfTENEUmVzSW5mbykgewotICAgICBjYXNlIFBhbmVsXzY0MHg0ODA6ICAgKCpEaXNwbGF5VHlwZSkgPSA1MDsgYnJlYWs7Ci0gICAgIGNhc2UgUGFuZWxfNjQweDQ4MF8yOiAoKkRpc3BsYXlUeXBlKSA9IDUyOyBicmVhazsKLSAgICAgY2FzZSBQYW5lbF82NDB4NDgwXzM6ICgqRGlzcGxheVR5cGUpID0gNTQ7IGJyZWFrOwotICAgICBjYXNlIFBhbmVsXzgwMHg2MDA6ICAgKCpEaXNwbGF5VHlwZSkgPSAgMDsgYnJlYWs7Ci0gICAgIGNhc2UgUGFuZWxfMTAyNHg2MDA6ICAoKkRpc3BsYXlUeXBlKSA9IDIzOyBicmVhazsKLSAgICAgY2FzZSBQYW5lbF8xMDI0eDc2ODogICgqRGlzcGxheVR5cGUpID0gIDQ7IGJyZWFrOwotICAgICBjYXNlIFBhbmVsXzExNTJ4NzY4OiAgKCpEaXNwbGF5VHlwZSkgPSAyNzsgYnJlYWs7Ci0gICAgIGNhc2UgUGFuZWxfMTI4MHg3Njg6ICAoKkRpc3BsYXlUeXBlKSA9IDQwOyBicmVhazsKLSAgICAgY2FzZSBQYW5lbF8xMjgweDEwMjQ6ICgqRGlzcGxheVR5cGUpID0gIDg7IGJyZWFrOwotICAgICBjYXNlIFBhbmVsXzE0MDB4MTA1MDogKCpEaXNwbGF5VHlwZSkgPSAxNDsgYnJlYWs7Ci0gICAgIGNhc2UgUGFuZWxfMTYwMHgxMjAwOiAoKkRpc3BsYXlUeXBlKSA9IDM2OyBicmVhazsKLSAgICAgZGVmYXVsdDogcmV0dXJuIEZBTFNFOwotICAgICB9Ci0KLSAgICAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgKCpEaXNwbGF5VHlwZSkrKzsKLQotICAgICBzd2l0Y2goU2lTX1ByLT5TaVNfTENEUmVzSW5mbykgewotICAgICBjYXNlIFBhbmVsXzY0MHg0ODA6Ci0gICAgIGNhc2UgUGFuZWxfNjQweDQ4MF8yOgotICAgICBjYXNlIFBhbmVsXzY0MHg0ODBfMzoKLSAgICAgICAgYnJlYWs7Ci0gICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSAoKkRpc3BsYXlUeXBlKSArPSAyOwotICAgICB9Ci0KLSAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkgewotICAgICAgICAoKkRpc3BsYXlUeXBlKSA9IDEyOwotCWlmKG1vZGVmbGFnICYgSGFsZkRDTEspICgqRGlzcGxheVR5cGUpKys7Ci0gICAgIH0KLSAgfQotCi0jaWYgMAotICBpZihTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgewotICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFNpU19Qci0+U2lTX1BhbmVsMzIweDQ4MCl7Ci0gICAgICAgICgqRGlzcGxheVR5cGUpID0gMjI7Ci0gICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KIHN0YXRpYyB2b2lkCi1TaVNfR2V0Q1JUMlB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByLFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LAotCSAgICAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LFVTSE9SVCAqQ1JUMkluZGV4LFVTSE9SVCAqUmVzSW5kZXgsCi0JICAgICAgIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfR2V0Q1JUMlB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkgICAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCB1bnNpZ25lZCBzaG9ydCAqQ1JUMkluZGV4LAorCSAgICAgICB1bnNpZ25lZCBzaG9ydCAqUmVzSW5kZXgpCiB7Ci0gIFVTSE9SVCB0ZW1wYng9MCx0ZW1wYWw9MCxyZXNpbmZvPTA7CisgIHVuc2lnbmVkIHNob3J0IHRlbXBieD0wLCB0ZW1wYWw9MCwgcmVzaW5mbz0wOwogCiAgIGlmKE1vZGVObyA8PSAweDEzKSB7CiAgICAgIHRlbXBhbCA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfQ1JUMkNSVEM7CkBAIC0yOTY2LDE4ICsyOTExLDIwIEBACiAKICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExDRCAqLwogCi0gICAgICAgIHRlbXBieCA9IFNpU19Qci0+U2lTX0xDRFJlc0luZm87CisJdGVtcGJ4ID0gU2lTX1ByLT5TaVNfTENEUmVzSW5mbzsKIAlpZighKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSkgdGVtcGJ4ICs9IDMyOwogCisJLyogcGF0Y2ggaW5kZXggKi8KIAlpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE2ODB4MTA1MCkgewogCSAgIGlmICAgICAocmVzaW5mbyA9PSBTSVNfUklfMTI4MHg4MDApICB0ZW1wYWwgPSAgOTsKIAkgICBlbHNlIGlmKHJlc2luZm8gPT0gU0lTX1JJXzE0MDB4MTA1MCkgdGVtcGFsID0gMTE7CiAJfSBlbHNlIGlmKChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4ODAwKSB8fAotCSAgICAgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMjgweDgwMF8yKSkgeworCQkgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4ODAwXzIpIHx8CisJCSAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHg4NTQpKSB7CiAJICAgaWYgICAgIChyZXNpbmZvID09IFNJU19SSV8xMjgweDc2OCkgIHRlbXBhbCA9ICA5OwogCX0KIAotICAJaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKKwlpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgewogCSAgIC8qIFBhc3MgMToxIG9ubHkgKGNlbnRlci1zY3JlZW4gaGFuZGxlZCBvdXRzaWRlKSAqLwogCSAgIC8qIFRoaXMgaXMgbmV2ZXIgY2FsbGVkIGZvciB0aGUgcGFuZWwncyBuYXRpdmUgcmVzb2x1dGlvbiAqLwogCSAgIC8qIHNpbmNlIFBhc3MxOjEgd2lsbCBub3QgYmUgc2V0IGluIHRoaXMgY2FzZSAqLwpAQCAtMjk5MSw4ICsyOTM4LDggQEAKIAlpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9DT01QQVExMjgwKSB7CiAJICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMjgweDEwMjQpIHsKIAkgICAgICBpZighKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSkgewotCSAgICAgICAgIHRlbXBieCA9IDIwMDsKLQkgICAgICAgICBpZighKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSkgdGVtcGJ4Kys7CisJCSB0ZW1wYnggPSAyMDA7CisJCSBpZighKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSkgdGVtcGJ4Kys7CiAJICAgICAgfQogCSAgIH0KIAl9CkBAIC0zMDAwLDIzICsyOTQ3LDIzIEBACiAKICAgICAgfSBlbHNlIHsJCQkJCQkgIAkvKiBUViAqLwogCi0gICAgIAlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgewotICAgICAgICAgICAvKiBpZihTaVNfUHItPlNpU19WR0FWREUgPiA0ODApIFNpU19Qci0+U2lTX1RWTW9kZSAmPSAoflRWU2V0VFZTaW11TW9kZSk7ICovCi0gICAgICAgICAgIHRlbXBieCA9IDI7Ci0gICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7CisJaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKKwkgICAvKiBpZihTaVNfUHItPlNpU19WR0FWREUgPiA0ODApIFNpU19Qci0+U2lTX1RWTW9kZSAmPSAoflRWU2V0VFZTaW11TW9kZSk7ICovCisJICAgdGVtcGJ4ID0gMjsKKwkgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewogCSAgICAgIHRlbXBieCA9IDEzOwotICAgICAgICAgICAgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkpIHRlbXBieCA9IDE0OwotICAgICAgICAgICB9CisJICAgICAgaWYoIShTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFRWU2ltdU1vZGUpKSB0ZW1wYnggPSAxNDsKKwkgICB9CiAJfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1lQYlByNTI1NzUwKSB7Ci0JICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjc1MHApICAgICAgdGVtcGJ4ID0gNzsKLQkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVwKSB0ZW1wYnggPSA2OwotCSAgIGVsc2UgCQkJCQl0ZW1wYnggPSA1OwotCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgICAgIHRlbXBieCArPSA1OwotICAgICAgIAl9IGVsc2UgewotICAgICAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkgCQl0ZW1wYnggPSAzOwotICAgICAgICAgICBlbHNlIAkJCQkJdGVtcGJ4ID0gNDsKLSAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSAJdGVtcGJ4ICs9IDU7Ci0gICAgICAgCX0KKwkgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkJdGVtcGJ4ID0gNzsKKwkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVwKQl0ZW1wYnggPSA2OworCSAgIGVsc2UJCQkJCQl0ZW1wYnggPSA1OworCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkJdGVtcGJ4ICs9IDU7CisJfSBlbHNlIHsKKwkgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkJCXRlbXBieCA9IDM7CisJICAgZWxzZQkJCQkJCXRlbXBieCA9IDQ7CisJICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKQl0ZW1wYnggKz0gNTsKKwl9CiAKICAgICAgfQogCkBAIC0zMDI0LDI2ICsyOTcxLDM0IEBACiAKICAgICAgaWYoTW9kZU5vID4gMHgxMykgewogICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVk5vSGlWaXNpb24pIHsKLSAgICAgIAkgICBpZih0ZW1wYWwgPT0gNikgdGVtcGFsID0gNzsKLSAgICAgICAgICAgaWYoKHJlc2luZm8gPT0gU0lTX1JJXzcyMHg0ODApIHx8Ci0JICAgICAgKHJlc2luZm8gPT0gU0lTX1JJXzcyMHg1NzYpIHx8Ci0JICAgICAgKHJlc2luZm8gPT0gU0lTX1JJXzc2OHg1NzYpKSB7CisJICAgc3dpdGNoKHJlc2luZm8pIHsKKwkgICBjYXNlIFNJU19SSV83MjB4NDgwOgogCSAgICAgIHRlbXBhbCA9IDY7Ci0JICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0UEFMIHwgVFZTZXRQQUxOKSkgewotCSAgICAgICAgIGlmKHJlc2luZm8gPT0gU0lTX1JJXzcyMHg0ODApIHRlbXBhbCA9IDk7CisJICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0UEFMIHwgVFZTZXRQQUxOKSkJdGVtcGFsID0gOTsKKwkgICAgICBicmVhazsKKwkgICBjYXNlIFNJU19SSV83MjB4NTc2OgorCSAgIGNhc2UgU0lTX1JJXzc2OHg1NzY6CisJICAgY2FzZSBTSVNfUklfMTAyNHg1NzY6IC8qIE5vdCBpbiBOVFNDIG9yIFlQQlBSIG1vZGUgKGV4Y2VwdCAxMDgwaSkhICovCisJICAgICAgdGVtcGFsID0gNjsKKwkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgeworCQkgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjc1MHApCXRlbXBhbCA9IDg7CiAJICAgICAgfQotCSAgIH0KLQkgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgewotICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNTI1cCkgewotCSAgICAgICAgIGlmKHJlc2luZm8gPT0gU0lTX1JJXzEwMjR4NzY4KSB0ZW1wYWwgPSA4OworCSAgICAgIGJyZWFrOworCSAgIGNhc2UgU0lTX1JJXzgwMHg0ODA6CisJICAgICAgdGVtcGFsID0gNDsKKwkgICAgICBicmVhazsKKwkgICBjYXNlIFNJU19SSV81MTJ4Mzg0OgorCSAgIGNhc2UgU0lTX1JJXzEwMjR4NzY4OgorCSAgICAgIHRlbXBhbCA9IDc7CisJICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHsKKwkJIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVwKQl0ZW1wYWwgPSA4OwogCSAgICAgIH0KLQkgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgewotCQkgaWYoKHJlc2luZm8gPT0gU0lTX1JJXzcyMHg1NzYpIHx8Ci0JICAgICAgICAgICAgKHJlc2luZm8gPT0gU0lTX1JJXzc2OHg1NzYpKSB7Ci0JICAgICAgICAgICAgdGVtcGFsID0gODsKLQkgICAgICAgICB9Ci0JCSBpZihyZXNpbmZvID09IFNJU19SSV8xMjgweDcyMCkgdGVtcGFsID0gOTsKKwkgICAgICBicmVhazsKKwkgICBjYXNlIFNJU19SSV8xMjgweDcyMDoKKwkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgeworCQkgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjc1MHApCXRlbXBhbCA9IDk7CiAJICAgICAgfQorCSAgICAgIGJyZWFrOwogCSAgIH0KIAl9CiAgICAgIH0KQEAgLTMwNTYsNjUgKzMwMTEsNjAgQEAKICAgICAgdGVtcGJ4ID0gMDsKICAgICAgaWYoKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHgpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikpIHsKIAotICAgICAgICB0ZW1wYnggPSAxMDsKLQlpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pIHRlbXBieCArPSAxOwotICAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkgewotCSAgIHRlbXBieCArPSAyOworCXRlbXBieCA9IDkwOworCWlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSB7CisJICAgdGVtcGJ4ID0gOTI7CiAJICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPiBNb2RlVkdBKSB7CiAJICAgICAgaWYoU2lTX1ByLT5TaVNfQ0hTT3ZlclNjYW4pIHRlbXBieCA9IDk5OwogCSAgIH0KLQkgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTE0pIHsKLQkgICAgICB0ZW1wYnggPSA5MDsKLQkgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pIHRlbXBieCArPSAxOwotCSAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTE4pIHsKLQkgICAgICB0ZW1wYnggPSA5MjsKLQkgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pIHRlbXBieCArPSAxOwotCSAgIH0KLSAgICAgICAgfQorCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTSkgICAgICB0ZW1wYnggPSA5NDsKKwkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTikgdGVtcGJ4ID0gOTY7CisJfQorCWlmKHRlbXBieCAhPSA5OSkgeworCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0Q0hPdmVyU2NhbikgdGVtcGJ4Kys7CisJfQogCiAgICAgIH0gZWxzZSB7CiAKLSAgICAgICAgc3dpdGNoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8pIHsKLQljYXNlIFBhbmVsXzY0MHg0ODA6ICAgdGVtcGJ4ID0gNjsgIGJyZWFrOwotCWNhc2UgUGFuZWxfNjQweDQ4MF8yOgotCWNhc2UgUGFuZWxfNjQweDQ4MF8zOiB0ZW1wYnggPSAzMDsgYnJlYWs7Ci0JY2FzZSBQYW5lbF84MDB4NjAwOiAgIHRlbXBieCA9IDA7ICBicmVhazsKLQljYXNlIFBhbmVsXzEwMjR4NjAwOiAgdGVtcGJ4ID0gMTU7IGJyZWFrOwotCWNhc2UgUGFuZWxfMTAyNHg3Njg6ICB0ZW1wYnggPSAyOyAgYnJlYWs7Ci0JY2FzZSBQYW5lbF8xMTUyeDc2ODogIHRlbXBieCA9IDE3OyBicmVhazsKLQljYXNlIFBhbmVsXzEyODB4NzY4OiAgdGVtcGJ4ID0gMTg7IGJyZWFrOwotCWNhc2UgUGFuZWxfMTI4MHgxMDI0OiB0ZW1wYnggPSA0OyAgYnJlYWs7Ci0JY2FzZSBQYW5lbF8xNDAweDEwNTA6IHRlbXBieCA9IDg7ICBicmVhazsKLQljYXNlIFBhbmVsXzE2MDB4MTIwMDogdGVtcGJ4ID0gMjE7IGJyZWFrOworCXN3aXRjaChTaVNfUHItPlNpU19MQ0RSZXNJbmZvKSB7CisJY2FzZSBQYW5lbF82NDB4NDgwOiAgIHRlbXBieCA9IDEyOyBicmVhazsKKwljYXNlIFBhbmVsXzMyMHgyNDBfMTogdGVtcGJ4ID0gMTA7IGJyZWFrOworCWNhc2UgUGFuZWxfMzIweDI0MF8yOgorCWNhc2UgUGFuZWxfMzIweDI0MF8zOiB0ZW1wYnggPSAxNDsgYnJlYWs7CisJY2FzZSBQYW5lbF84MDB4NjAwOiAgIHRlbXBieCA9IDE2OyBicmVhazsKKwljYXNlIFBhbmVsXzEwMjR4NjAwOiAgdGVtcGJ4ID0gMTg7IGJyZWFrOworCWNhc2UgUGFuZWxfMTE1Mng3Njg6CisJY2FzZSBQYW5lbF8xMDI0eDc2ODogIHRlbXBieCA9IDIwOyBicmVhazsKKwljYXNlIFBhbmVsXzEyODB4NzY4OiAgdGVtcGJ4ID0gMjI7IGJyZWFrOworCWNhc2UgUGFuZWxfMTI4MHgxMDI0OiB0ZW1wYnggPSAyNDsgYnJlYWs7CisJY2FzZSBQYW5lbF8xNDAweDEwNTA6IHRlbXBieCA9IDI2OyBicmVhazsKKwljYXNlIFBhbmVsXzE2MDB4MTIwMDogdGVtcGJ4ID0gMjg7IGJyZWFrOworI2lmZGVmIFNJUzMwMAogCWNhc2UgUGFuZWxfQmFyY28xMzY2OiB0ZW1wYnggPSA4MDsgYnJlYWs7CisjZW5kaWYKIAl9CiAKIAlzd2l0Y2goU2lTX1ByLT5TaVNfTENEUmVzSW5mbykgeworCWNhc2UgUGFuZWxfMzIweDI0MF8xOgorCWNhc2UgUGFuZWxfMzIweDI0MF8yOgorCWNhc2UgUGFuZWxfMzIweDI0MF8zOgogCWNhc2UgUGFuZWxfNjQweDQ4MDoKLQljYXNlIFBhbmVsXzY0MHg0ODBfMjoKLQljYXNlIFBhbmVsXzY0MHg0ODBfMzoKIAkgICBicmVhazsKIAlkZWZhdWx0OgogCSAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB0ZW1wYngrKzsKIAl9CiAKLQlpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSB0ZW1wYnggPSA3OworCWlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpIHRlbXBieCA9IDMwOwogCisjaWZkZWYgU0lTMzAwCiAJaWYoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMDI0KSB7CiAJICAgdGVtcGJ4ID0gODI7CiAJICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHRlbXBieCsrOwotCX0gZWxzZSBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgeworCX0gZWxzZSBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCB8fCBTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg1NikgewogCSAgIHRlbXBieCA9IDg0OwogCSAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB0ZW1wYngrKzsKIAl9Ci0KLQlpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCAhPSBDVVRfQkFSQ08xMzY2KSAmJgotICAgICAgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCAhPSBDVVRfUEFORUw4NDgpKSB7Ci0gICAgICAgICAgIGlmKChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgJiYKLQkgICAgICAoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkpIHsKLSAgICAgICAgICAgICAgdGVtcGFsID0gMDsKLQkgICB9Ci0gICAgICAgIH0KKyNlbmRpZgogCiAgICAgIH0KIApAQCAtMzEyNCwxMiArMzA3NCwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotU2lTX0dldFJBTURBQzJEQVRBKFNpU19Qcml2YXRlICpTaVNfUHIsVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCxQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0dldFJBTURBQzJEQVRBKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQl1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCiB7Ci0gIFVTSE9SVCB0ZW1wYXg9MCx0ZW1wYng9MDsKLSAgVVNIT1JUIHRlbXAxPTAsbW9kZWZsYWc9MCx0ZW1wY3g9MDsKLSAgVVNIT1JUIGluZGV4OworICB1bnNpZ25lZCBzaG9ydCB0ZW1wYXg9MCwgdGVtcGJ4PTAsIGluZGV4LCBkb3RjbG9jazsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcDE9MCwgbW9kZWZsYWc9MCwgdGVtcGN4PTA7CiAKICAgU2lTX1ByLT5TaVNfUlZCSENNQVggID0gMTsKICAgU2lTX1ByLT5TaVNfUlZCSENGQUNUID0gMTsKQEAgLTMxNDMsMTAgKzMwOTIsMTIgQEAKICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfU3RhbmRUYWJsZVtpbmRleF0uQ1JUQ1s2XTsKICAgICAgdGVtcDEgPSBTaVNfUHItPlNpU19TdGFuZFRhYmxlW2luZGV4XS5DUlRDWzddOwogCisgICAgIGRvdGNsb2NrID0gKG1vZGVmbGFnICYgQ2hhcng4RG90KSA/IDggOiA5OworCiAgIH0gZWxzZSB7CiAKICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKLSAgICAgaW5kZXggPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQxQ1JUQzsKKyAgICAgaW5kZXggPSBTaVNfR2V0UmVmQ1JUMUNSVEMoU2lTX1ByLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFNpU19Qci0+U2lTX1VzZVdpZGVDUlQyKTsKIAogICAgICB0ZW1wYXggPSBTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzBdOwogICAgICB0ZW1wYXggfD0gKFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTRdIDw8IDgpOwpAQCAtMzE1OCwyMiArMzEwOSwxNiBAQAogICAgICB0ZW1wYnggfD0gdGVtcGN4OwogICAgICB0ZW1wMSAgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzddOwogCisgICAgIGRvdGNsb2NrID0gODsKKwogICB9CiAKICAgaWYodGVtcDEgJiAweDAxKSB0ZW1wYnggfD0gMHgwMTAwOwogICBpZih0ZW1wMSAmIDB4MjApIHRlbXBieCB8PSAweDAyMDA7CiAKICAgdGVtcGF4ICs9IDU7Ci0KLSAgLyogQ2hhcng4RG90IGlzIG5vIG1vcmUgdXNlZCAoYW5kIGFzc3VtZWQpLCBzbyB3ZSBzZXQgaXQgKi8KLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0gICAgIG1vZGVmbGFnIHw9IENoYXJ4OERvdDsKLSAgfQotCi0gIGlmKG1vZGVmbGFnICYgQ2hhcng4RG90KSB0ZW1wYXggKj0gODsKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgIHRlbXBheCAqPSA5OwotCi0gIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspICB0ZW1wYXggPDw9IDE7CisgIHRlbXBheCAqPSBkb3RjbG9jazsKKyAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgdGVtcGF4IDw8PSAxOwogCiAgIHRlbXBieCsrOwogCkBAIC0zMTgyLDEzICszMTI3LDU2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfR2V0Q1JUMkRhdGFMVkRTKFNpU19Qcml2YXRlICpTaVNfUHIsVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfQ2FsY1BhbmVsTGlua1RpbWluZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewotICAgVVNIT1JUIENSVDJJbmRleCwgUmVzSW5kZXg7Ci0gICBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgKkxWRFNEYXRhID0gTlVMTDsKKyAgIHVuc2lnbmVkIHNob3J0IFJlc0luZGV4OwogCi0gICBTaVNfR2V0Q1JUMlJlc0luZm8oU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8pOworICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpIHsKKwkgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisJICAgIFJlc0luZGV4ID0gU2lTX1ByLT5DSFRvdGFsOworCSAgICBpZihTaVNfUHItPkNNb2RlRmxhZyAmIEhhbGZEQ0xLKSBSZXNJbmRleCA8PD0gMTsKKwkgICAgU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPlNpU19IVCA9IFJlc0luZGV4OworCSAgICBTaVNfUHItPlNpU19WR0FWVCA9IFNpU19Qci0+U2lTX1ZUID0gU2lTX1ByLT5DVlRvdGFsOworCSB9IGVsc2UgeworCSAgICBpZihNb2RlTm8gPCAweDEzKSB7CisJICAgICAgIFJlc0luZGV4ID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQzsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgUmVzSW5kZXggPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQyQ1JUQ19OUzsKKwkgICAgfQorCSAgICBpZihSZXNJbmRleCA9PSAweDA5KSB7CisJICAgICAgIGlmKFNpU19Qci0+QWx0ZXJuYXRlMTYwMHgxMjAwKSAgICAgICAgUmVzSW5kZXggPSAweDIwOyAvKiAxNjAweDEyMDAgTENEQSAqLworCSAgICAgICBlbHNlIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIFJlc0luZGV4ID0gMHgyMTsgLyogMTYwMHgxMjAwIExWRFMgKi8KKwkgICAgfQorCSAgICBTaVNfUHItPlNpU19WR0FIVCA9IFNpU19Qci0+U2lTX05vU2NhbGVEYXRhW1Jlc0luZGV4XS5WR0FIVDsKKwkgICAgU2lTX1ByLT5TaVNfVkdBVlQgPSBTaVNfUHItPlNpU19Ob1NjYWxlRGF0YVtSZXNJbmRleF0uVkdBVlQ7CisJICAgIFNpU19Qci0+U2lTX0hUICAgID0gU2lTX1ByLT5TaVNfTm9TY2FsZURhdGFbUmVzSW5kZXhdLkxDREhUOworCSAgICBTaVNfUHItPlNpU19WVCAgICA9IFNpU19Qci0+U2lTX05vU2NhbGVEYXRhW1Jlc0luZGV4XS5MQ0RWVDsKKwkgfQorICAgICAgfSBlbHNlIHsKKwkgU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPlNpU19IVCA9IFNpU19Qci0+UGFuZWxIVDsKKwkgU2lTX1ByLT5TaVNfVkdBVlQgPSBTaVNfUHItPlNpU19WVCA9IFNpU19Qci0+UGFuZWxWVDsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICAvKiBUaGlzIGhhbmRsZXMgY3VzdG9tIG1vZGVzIGFuZCBjdXN0b20gcGFuZWxzICovCisgICAgICBTaVNfUHItPlNpU19IREUgPSBTaVNfUHItPlBhbmVsWFJlczsKKyAgICAgIFNpU19Qci0+U2lTX1ZERSA9IFNpU19Qci0+UGFuZWxZUmVzOworICAgICAgU2lTX1ByLT5TaVNfSFQgID0gU2lTX1ByLT5QYW5lbEhUOworICAgICAgU2lTX1ByLT5TaVNfVlQgID0gU2lTX1ByLT5QYW5lbFZUOworICAgICAgU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPlBhbmVsSFQgLSAoU2lTX1ByLT5QYW5lbFhSZXMgLSBTaVNfUHItPlNpU19WR0FIREUpOworICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgPSBTaVNfUHItPlBhbmVsVlQgLSAoU2lTX1ByLT5QYW5lbFlSZXMgLSBTaVNfUHItPlNpU19WR0FWREUpOworICAgfQorfQorCitzdGF0aWMgdm9pZAorU2lTX0dldENSVDJEYXRhTFZEUyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQoreworICAgdW5zaWduZWQgc2hvcnQgQ1JUMkluZGV4LCBSZXNJbmRleCwgYmFja3VwOworICAgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSAqTFZEU0RhdGEgPSBOVUxMOworCisgICBTaVNfR2V0Q1JUMlJlc0luZm8oU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAogICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKICAgICAgIFNpU19Qci0+U2lTX1JWQkhDTUFYICA9IDE7CkBAIC0zMTk5LDEzMyArMzE4Nyw5NCBAQAogICAgICAgU2lTX1ByLT5TaVNfUlkyQ09FID0gMDsKICAgICAgIFNpU19Qci0+U2lTX1JZM0NPRSA9IDA7CiAgICAgICBTaVNfUHItPlNpU19SWTRDT0UgPSAwOworICAgICAgU2lTX1ByLT5TaVNfUlZCSFJTMiA9IDA7CiAgICB9CiAKICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7CiAKICNpZmRlZiBTSVMzMTVICi0gICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkgewotCSAgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLQkgICAgICAgU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPlNpU19IVCA9IFNpU19Qci0+Q0hUb3RhbDsKLQkgICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgPSBTaVNfUHItPlNpU19WVCA9IFNpU19Qci0+Q1ZUb3RhbDsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgaWYoTW9kZU5vIDwgMHgxMykgewotCSAgICAgICAgICBSZXNJbmRleCA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfQ1JUMkNSVEM7Ci0JICAgICAgIH0gZWxzZSB7Ci0JICAgICAgICAgIFJlc0luZGV4ID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfQ1JUMkNSVENfTlM7Ci0JICAgICAgIH0KLQkgICAgICAgU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPlNpU19Ob1NjYWxlRGF0YVtSZXNJbmRleF0uVkdBSFQ7Ci0gICAgICAgICAgICAgICBTaVNfUHItPlNpU19WR0FWVCA9IFNpU19Qci0+U2lTX05vU2NhbGVEYXRhW1Jlc0luZGV4XS5WR0FWVDsKLSAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0hUICAgID0gU2lTX1ByLT5TaVNfTm9TY2FsZURhdGFbUmVzSW5kZXhdLkxDREhUOwotICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfVlQgICAgPSBTaVNfUHItPlNpU19Ob1NjYWxlRGF0YVtSZXNJbmRleF0uTENEVlQ7Ci0JICAgIH0KLQkgfSBlbHNlIHsKLSAgICAgCSAgICBTaVNfUHItPlNpU19WR0FIVCA9IFNpU19Qci0+U2lTX0hUID0gU2lTX1ByLT5QYW5lbEhUOwotICAgICAgICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgPSBTaVNfUHItPlNpU19WVCA9IFNpU19Qci0+UGFuZWxWVDsKLQkgfQotICAgICAgfSBlbHNlIHsKLQkgLyogVGhpcyBoYW5kbGVzIGN1c3RvbSBtb2RlcyBhbmQgY3VzdG9tIHBhbmVscyAqLwotCSBTaVNfUHItPlNpU19IREUgPSBTaVNfUHItPlBhbmVsWFJlczsKLSAgICAgICAgIFNpU19Qci0+U2lTX1ZERSA9IFNpU19Qci0+UGFuZWxZUmVzOwotICAgICAgICAgU2lTX1ByLT5TaVNfSFQgID0gU2lTX1ByLT5QYW5lbEhUOwotICAgICAgICAgU2lTX1ByLT5TaVNfVlQgID0gU2lTX1ByLT5QYW5lbFZUOwotCSBTaVNfUHItPlNpU19WR0FIVCA9IFNpU19Qci0+UGFuZWxIVCAtIChTaVNfUHItPlBhbmVsWFJlcyAtIFNpU19Qci0+U2lTX1ZHQUhERSk7Ci0JIFNpU19Qci0+U2lTX1ZHQVZUID0gU2lTX1ByLT5QYW5lbFZUIC0gKFNpU19Qci0+UGFuZWxZUmVzIC0gU2lTX1ByLT5TaVNfVkdBVkRFKTsKLSAgICAgIH0KLQotICAgICAgU2lTX0NhbGNMQ0RBQ1JUMVRpbWluZyhTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4KTsKLQorICAgICAgU2lTX0NhbGNQYW5lbExpbmtUaW1pbmcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworICAgICAgU2lTX0NhbGNMQ0RBQ1JUMVRpbWluZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogI2VuZGlmCiAKICAgIH0gZWxzZSB7CiAKICAgICAgIC8qIDMwMUJESCBuZWVkcyBMVkRTIERhdGEgKi8KKyAgICAgIGJhY2t1cCA9IFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTOwogICAgICAgaWYoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSkgewogCSBTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9IDE7CiAgICAgICB9CiAKICAgICAgIFNpU19HZXRDUlQyUHRyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgCQkmQ1JUMkluZGV4LCAmUmVzSW5kZXgsIEh3SW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAJCSAgICAgICAgICAgICZDUlQySW5kZXgsICZSZXNJbmRleCk7CiAKLSAgICAgIC8qIDMwMUJESCBuZWVkcyBMVkRTIERhdGEgKi8KLSAgICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkpIHsKLSAgICAgICAgIFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID0gMDsKLSAgICAgIH0KKyAgICAgIFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID0gYmFja3VwOwogCi0gICAgICBzd2l0Y2ggKENSVDJJbmRleCkgewotICAgICAgCSBjYXNlICAwOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFM4MDB4NjAwRGF0YV8xOyAgICBicmVhazsKLQkgY2FzZSAgMTogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTODAweDYwMERhdGFfMjsgICAgYnJlYWs7Ci0gICAgICAJIGNhc2UgIDI6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzEwMjR4NzY4RGF0YV8xOyAgIGJyZWFrOwotCSBjYXNlICAzOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFMxMDI0eDc2OERhdGFfMjsgICBicmVhazsKLSAgICAgIAkgY2FzZSAgNDogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMTI4MHgxMDI0RGF0YV8xOyAgYnJlYWs7Ci0gICAgICAJIGNhc2UgIDU6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzEyODB4MTAyNERhdGFfMjsgIGJyZWFrOwotCSBjYXNlICA2OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFM2NDB4NDgwRGF0YV8xOyAgICBicmVhazsKLSAgICAgICAgIGNhc2UgIDc6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEU1hYWHhYWFhEYXRhXzE7ICAgIGJyZWFrOwotCSBjYXNlICA4OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFMxNDAweDEwNTBEYXRhXzE7ICBicmVhazsKLQkgY2FzZSAgOTogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMTQwMHgxMDUwRGF0YV8yOyAgYnJlYWs7Ci0gICAgICAJIGNhc2UgMTA6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlVOVFNDRGF0YTsgICAgICAgIGJyZWFrOwotICAgICAgCSBjYXNlIDExOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZPTlRTQ0RhdGE7ICAgICAgICBicmVhazsKLSAgICAgIAkgY2FzZSAxMjogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19DSFRWVVBBTERhdGE7ICAgICAgICAgYnJlYWs7Ci0gICAgICAJIGNhc2UgMTM6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVk9QQUxEYXRhOyAgICAgICAgIGJyZWFrOwotICAgICAgCSBjYXNlIDE0OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFMzMjB4NDgwRGF0YV8xOyAgICBicmVhazsKLQkgY2FzZSAxNTogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMTAyNHg2MDBEYXRhXzE7ICAgYnJlYWs7Ci0JIGNhc2UgMTY6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzEwMjR4NjAwRGF0YV8yOyAgIGJyZWFrOwotCSBjYXNlIDE3OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFMxMTUyeDc2OERhdGFfMTsgICBicmVhazsKLQkgY2FzZSAxODogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMTE1Mng3NjhEYXRhXzI7ICAgYnJlYWs7Ci0JIGNhc2UgMTk6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzEyODB4NzY4RGF0YV8xOyAgIGJyZWFrOwotCSBjYXNlIDIwOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFMxMjgweDc2OERhdGFfMjsgICBicmVhazsKLQkgY2FzZSAyMTogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMTYwMHgxMjAwRGF0YV8xOyAgYnJlYWs7Ci0JIGNhc2UgMjI6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzE2MDB4MTIwMERhdGFfMjsgIGJyZWFrOwotCSBjYXNlIDMwOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFM2NDB4NDgwRGF0YV8yOyAgICBicmVhazsKKyAgICAgIHN3aXRjaChDUlQySW5kZXgpIHsKKwkgY2FzZSAxMDogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMzIweDI0MERhdGFfMTsgICAgYnJlYWs7CisJIGNhc2UgMTQ6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzMyMHgyNDBEYXRhXzI7ICAgIGJyZWFrOworCSBjYXNlIDEyOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFM2NDB4NDgwRGF0YV8xOyAgICBicmVhazsKKwkgY2FzZSAxNjogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTODAweDYwMERhdGFfMTsgICAgYnJlYWs7CisJIGNhc2UgMTg6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzEwMjR4NjAwRGF0YV8xOyAgIGJyZWFrOworCSBjYXNlIDIwOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFMxMDI0eDc2OERhdGFfMTsgICBicmVhazsKKyNpZmRlZiBTSVMzMDAKIAkgY2FzZSA4MDogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTQkFSQ08xMzY2RGF0YV8xOyAgYnJlYWs7CiAJIGNhc2UgODE6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEU0JBUkNPMTM2NkRhdGFfMjsgIGJyZWFrOwogCSBjYXNlIDgyOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFNCQVJDTzEwMjREYXRhXzE7ICBicmVhazsKLQkgY2FzZSA4MzogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTQkFSQ08xMDI0RGF0YV8yOyAgYnJlYWs7CiAJIGNhc2UgODQ6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzg0OHg0ODBEYXRhXzE7ICAgIGJyZWFrOwogCSBjYXNlIDg1OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFM4NDh4NDgwRGF0YV8yOyAgICBicmVhazsKLQkgY2FzZSA5MDogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19DSFRWVVBBTE1EYXRhOyAgICAgICAgYnJlYWs7Ci0gICAgICAJIGNhc2UgOTE6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVk9QQUxNRGF0YTsgICAgICAgIGJyZWFrOwotICAgICAgCSBjYXNlIDkyOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZVUEFMTkRhdGE7ICAgICAgICBicmVhazsKLSAgICAgIAkgY2FzZSA5MzogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19DSFRWT1BBTE5EYXRhOyAgICAgICAgYnJlYWs7Ci0JIGNhc2UgOTk6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlNPUEFMRGF0YTsJICAgICAgIGJyZWFrOyAgLyogU3VwZXIgT3ZlcnNjYW4gKi8KLQkgZGVmYXVsdDogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMTAyNHg3NjhEYXRhXzE7ICAgYnJlYWs7CisjZW5kaWYKKwkgY2FzZSA5MDogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19DSFRWVU5UU0NEYXRhOyAgICAgICAgYnJlYWs7CisJIGNhc2UgOTE6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVk9OVFNDRGF0YTsgICAgICAgIGJyZWFrOworCSBjYXNlIDkyOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZVUEFMRGF0YTsgICAgICAgICBicmVhazsKKwkgY2FzZSA5MzogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19DSFRWT1BBTERhdGE7ICAgICAgICAgYnJlYWs7CisJIGNhc2UgOTQ6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlVQQUxNRGF0YTsgICAgICAgIGJyZWFrOworCSBjYXNlIDk1OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZPUEFMTURhdGE7ICAgICAgICBicmVhazsKKwkgY2FzZSA5NjogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19DSFRWVVBBTE5EYXRhOyAgICAgICAgYnJlYWs7CisJIGNhc2UgOTc6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVk9QQUxORGF0YTsgICAgICAgIGJyZWFrOworCSBjYXNlIDk5OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZTT1BBTERhdGE7CSAgICAgICBicmVhazsKICAgICAgIH0KIAotICAgICAgU2lTX1ByLT5TaVNfVkdBSFQgPSAoTFZEU0RhdGErUmVzSW5kZXgpLT5WR0FIVDsKLSAgICAgIFNpU19Qci0+U2lTX1ZHQVZUID0gKExWRFNEYXRhK1Jlc0luZGV4KS0+VkdBVlQ7Ci0gICAgICBTaVNfUHItPlNpU19IVCAgICA9IChMVkRTRGF0YStSZXNJbmRleCktPkxDREhUOwotICAgICAgU2lTX1ByLT5TaVNfVlQgICAgPSAoTFZEU0RhdGErUmVzSW5kZXgpLT5MQ0RWVDsKKyAgICAgIGlmKExWRFNEYXRhKSB7CisJIFNpU19Qci0+U2lTX1ZHQUhUID0gKExWRFNEYXRhK1Jlc0luZGV4KS0+VkdBSFQ7CisJIFNpU19Qci0+U2lTX1ZHQVZUID0gKExWRFNEYXRhK1Jlc0luZGV4KS0+VkdBVlQ7CisJIFNpU19Qci0+U2lTX0hUICAgID0gKExWRFNEYXRhK1Jlc0luZGV4KS0+TENESFQ7CisJIFNpU19Qci0+U2lTX1ZUICAgID0gKExWRFNEYXRhK1Jlc0luZGV4KS0+TENEVlQ7CisgICAgICB9IGVsc2UgeworCSBTaVNfQ2FsY1BhbmVsTGlua1RpbWluZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisgICAgICB9CiAKLSAgICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpKSB7Ci0gICAgICAgICBpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSAmJiAoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkpIHsKLSAgICAgICAgICAgIGlmKCghKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSkgfHwgKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSkgewotCSAgICAgICBTaVNfUHItPlNpU19IREUgPSBTaVNfUHItPlBhbmVsWFJlczsKLSAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX1ZERSA9IFNpU19Qci0+UGFuZWxZUmVzOwotCSAgICAgICBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9CQVJDTzEzNjYpIHsKLQkJICBpZihSZXNJbmRleCA8IDB4MDgpIHsKLQkJICAgICBTaVNfUHItPlNpU19IREUgPSAxMjgwOwotICAgICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfVkRFID0gMTAyNDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgIGlmKCAoIShTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikpICYmCisJICAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSAmJgorCSAgKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkpICkgeworCSBpZiggKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpKSB8fAorCSAgICAgKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSApIHsKKwkgICAgU2lTX1ByLT5TaVNfSERFID0gU2lTX1ByLT5QYW5lbFhSZXM7CisgICAgICAgICAgICBTaVNfUHItPlNpU19WREUgPSBTaVNfUHItPlBhbmVsWVJlczsKKyNpZmRlZiBTSVMzMDAKKwkgICAgaWYoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB7CisJICAgICAgIGlmKFJlc0luZGV4IDwgMHgwOCkgeworCQkgIFNpU19Qci0+U2lTX0hERSA9IDEyODA7CisJCSAgU2lTX1ByLT5TaVNfVkRFID0gMTAyNDsKKwkgICAgICAgfQorCSAgICB9CisjZW5kaWYKICAgICAgICAgIH0KICAgICAgIH0KICAgIH0KIH0KIAogc3RhdGljIHZvaWQKLVNpU19HZXRDUlQyRGF0YTMwMShTaVNfUHJpdmF0ZSAqU2lTX1ByLFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0JCSAgIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfR2V0Q1JUMkRhdGEzMDEoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCXVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCkKIHsKLSAgVUNIQVIgICpST01BZGRyID0gTlVMTDsKLSAgVVNIT1JUIHRlbXBheCx0ZW1wYngsbW9kZWZsYWcscm9tcHRyPTA7Ci0gIFVTSE9SVCByZXNpbmZvLENSVDJJbmRleCxSZXNJbmRleDsKLSAgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgKkxDRFB0ciA9IE5VTEw7Ci0gIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgICpUVlB0ciAgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IE5VTEw7CisgIHVuc2lnbmVkIHNob3J0IHRlbXBheCwgdGVtcGJ4LCBtb2RlZmxhZywgcm9tcHRyPTA7CisgIHVuc2lnbmVkIHNob3J0IHJlc2luZm8sIENSVDJJbmRleCwgUmVzSW5kZXg7CisgIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSAqTENEUHRyID0gTlVMTDsKKyAgY29uc3Qgc3RydWN0IFNpU19UVkRhdGEgICpUVlB0ciAgPSBOVUxMOwogI2lmZGVmIFNJUzMxNUgKLSAgU0hPUlQgIHJlc2luZm82NjE7CisgIHNob3J0IHJlc2luZm82NjE7CiAjZW5kaWYKIAogICBpZihNb2RlTm8gPD0gMHgxMykgewpAQCAtMzM0MCw2NyArMzI4OSw2OSBAQAogI2lmZGVmIFNJUzMxNUgKICAgICAgcmVzaW5mbzY2MSA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uUk9NTU9ERUlEWDY2MTsKICAgICAgaWYoIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpICAgJiYKLSAgICAgICAgIChTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykgJiYKLSAgICAgICAgIChyZXNpbmZvNjYxID49IDApICAgICAgICAgICAgICAgICAgICAgJiYKKwkgKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSAmJgorCSAocmVzaW5mbzY2MSA+PSAwKSAgICAgICAgICAgICAgICAgICAgICYmCiAJIChTaVNfUHItPlNpU19OZWVkUm9tTW9kZURhdGEpICkgewotICAgICAgICBpZigoUk9NQWRkciA9IEdldExDRFN0cnVjdFB0cjY2MShTaVNfUHIsIEh3SW5mbykpKSB7CisJaWYoKFJPTUFkZHIgPSBHZXRMQ0RTdHJ1Y3RQdHI2NjEoU2lTX1ByKSkpIHsKIAkgICBpZigocm9tcHRyID0gKFNJU0dFVFJPTVcoMjEpKSkpIHsKLSAgICAgICAgICAgICAgcm9tcHRyICs9IChyZXNpbmZvNjYxICogMTApOwotCSAgICAgIFJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7CisJICAgICAgcm9tcHRyICs9IChyZXNpbmZvNjYxICogMTApOworCSAgICAgIFJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOwogCSAgIH0KIAl9CiAgICAgIH0KICNlbmRpZgogICB9Ci0gIAorCiAgIFNpU19Qci0+U2lTX05ld0ZsaWNrZXJNb2RlID0gMDsKICAgU2lTX1ByLT5TaVNfUlZCSFJTID0gNTA7CiAgIFNpU19Qci0+U2lTX1JZMUNPRSA9IDA7CiAgIFNpU19Qci0+U2lTX1JZMkNPRSA9IDA7CiAgIFNpU19Qci0+U2lTX1JZM0NPRSA9IDA7CiAgIFNpU19Qci0+U2lTX1JZNENPRSA9IDA7CisgIFNpU19Qci0+U2lTX1JWQkhSUzIgPSAwOwogCi0gIFNpU19HZXRDUlQyUmVzSW5mbyhTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4LEh3SW5mbyk7CisgIFNpU19HZXRDUlQyUmVzSW5mbyhTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4KTsKIAotICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9SQU1EQUMpeworICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9SQU1EQUMpIHsKIAogICAgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKIAotICAgICAgICBTaVNfUHItPlNpU19SVkJIQ01BWCAgPSAxOwotICAgICAgICBTaVNfUHItPlNpU19SVkJIQ0ZBQ1QgPSAxOwotICAgICAgICBTaVNfUHItPlNpU19WR0FIVCAgICAgPSBTaVNfUHItPkNIVG90YWw7Ci0gICAgICAgIFNpU19Qci0+U2lTX1ZHQVZUICAgICA9IFNpU19Qci0+Q1ZUb3RhbDsKLSAgICAgICAgU2lTX1ByLT5TaVNfSFQgICAgICAgID0gU2lTX1ByLT5DSFRvdGFsOwotICAgICAgICBTaVNfUHItPlNpU19WVCAgICAgICAgPSBTaVNfUHItPkNWVG90YWw7CisJU2lTX1ByLT5TaVNfUlZCSENNQVggID0gMTsKKwlTaVNfUHItPlNpU19SVkJIQ0ZBQ1QgPSAxOwogCVNpU19Qci0+U2lTX0hERSAgICAgICA9IFNpU19Qci0+U2lTX1ZHQUhERTsKLSAgICAgICAgU2lTX1ByLT5TaVNfVkRFICAgICAgID0gU2lTX1ByLT5TaVNfVkdBVkRFOworCVNpU19Qci0+U2lTX1ZERSAgICAgICA9IFNpU19Qci0+U2lTX1ZHQVZERTsKKworCXRlbXBheCA9IFNpU19Qci0+Q0hUb3RhbDsKKwlpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB0ZW1wYXggPDw9IDE7CisJU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPlNpU19IVCA9IHRlbXBheDsKKwlTaVNfUHItPlNpU19WR0FWVCA9IFNpU19Qci0+U2lTX1ZUID0gU2lTX1ByLT5DVlRvdGFsOwogCiAgICAgIH0gZWxzZSB7CiAKLSAgICAgICAgU2lTX0dldFJBTURBQzJEQVRBKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOworCVNpU19HZXRSQU1EQUMyREFUQShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAKICAgICAgfQogCiAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgewogCiAgICAgIFNpU19HZXRDUlQyUHRyKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsUmVmcmVzaFJhdGVUYWJsZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAmQ1JUMkluZGV4LCZSZXNJbmRleCxId0luZm8pOworCQkgICAgJkNSVDJJbmRleCwmUmVzSW5kZXgpOwogCiAgICAgIHN3aXRjaChDUlQySW5kZXgpIHsKLSAgICAgICAgY2FzZSAgMjogVFZQdHIgPSBTaVNfUHItPlNpU19FeHRIaVRWRGF0YTsgICBicmVhazsKLSAgICAgICAgY2FzZSAgMzogVFZQdHIgPSBTaVNfUHItPlNpU19FeHRQQUxEYXRhOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAgNDogVFZQdHIgPSBTaVNfUHItPlNpU19FeHROVFNDRGF0YTsgICBicmVhazsKLSAgICAgICAgY2FzZSAgNTogVFZQdHIgPSBTaVNfUHItPlNpU19FeHQ1MjVpRGF0YTsgICBicmVhazsKLSAgICAgICAgY2FzZSAgNjogVFZQdHIgPSBTaVNfUHItPlNpU19FeHQ1MjVwRGF0YTsgICBicmVhazsKLSAgICAgICAgY2FzZSAgNzogVFZQdHIgPSBTaVNfUHItPlNpU19FeHQ3NTBwRGF0YTsgICBicmVhazsKLSAgICAgICAgY2FzZSAgODogVFZQdHIgPSBTaVNfUHItPlNpU19TdFBBTERhdGE7ICAgICBicmVhazsKLSAgICAgICAgY2FzZSAgOTogVFZQdHIgPSBTaVNfUHItPlNpU19TdE5UU0NEYXRhOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDogVFZQdHIgPSBTaVNfUHItPlNpU19TdDUyNWlEYXRhOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMTogVFZQdHIgPSBTaVNfUHItPlNpU19TdDUyNXBEYXRhOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjogVFZQdHIgPSBTaVNfUHItPlNpU19TdDc1MHBEYXRhOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzogVFZQdHIgPSBTaVNfUHItPlNpU19TdDFIaVRWRGF0YTsgICBicmVhazsKLSAgICAgICAgY2FzZSAxNDogVFZQdHIgPSBTaVNfUHItPlNpU19TdDJIaVRWRGF0YTsgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogVFZQdHIgPSBTaVNfUHItPlNpU19TdFBBTERhdGE7ICAgICBicmVhazsKKwljYXNlICAyOiBUVlB0ciA9IFNpU19Qci0+U2lTX0V4dEhpVFZEYXRhOyAgIGJyZWFrOworCWNhc2UgIDM6IFRWUHRyID0gU2lTX1ByLT5TaVNfRXh0UEFMRGF0YTsgICAgYnJlYWs7CisJY2FzZSAgNDogVFZQdHIgPSBTaVNfUHItPlNpU19FeHROVFNDRGF0YTsgICBicmVhazsKKwljYXNlICA1OiBUVlB0ciA9IFNpU19Qci0+U2lTX0V4dDUyNWlEYXRhOyAgIGJyZWFrOworCWNhc2UgIDY6IFRWUHRyID0gU2lTX1ByLT5TaVNfRXh0NTI1cERhdGE7ICAgYnJlYWs7CisJY2FzZSAgNzogVFZQdHIgPSBTaVNfUHItPlNpU19FeHQ3NTBwRGF0YTsgICBicmVhazsKKwljYXNlICA4OiBUVlB0ciA9IFNpU19Qci0+U2lTX1N0UEFMRGF0YTsgICAgIGJyZWFrOworCWNhc2UgIDk6IFRWUHRyID0gU2lTX1ByLT5TaVNfU3ROVFNDRGF0YTsgICAgYnJlYWs7CisJY2FzZSAxMDogVFZQdHIgPSBTaVNfUHItPlNpU19TdDUyNWlEYXRhOyAgICBicmVhazsKKwljYXNlIDExOiBUVlB0ciA9IFNpU19Qci0+U2lTX1N0NTI1cERhdGE7ICAgIGJyZWFrOworCWNhc2UgMTI6IFRWUHRyID0gU2lTX1ByLT5TaVNfU3Q3NTBwRGF0YTsgICAgYnJlYWs7CisJY2FzZSAxMzogVFZQdHIgPSBTaVNfUHItPlNpU19TdDFIaVRWRGF0YTsgICBicmVhazsKKwljYXNlIDE0OiBUVlB0ciA9IFNpU19Qci0+U2lTX1N0MkhpVFZEYXRhOyAgIGJyZWFrOworCWRlZmF1bHQ6IFRWUHRyID0gU2lTX1ByLT5TaVNfU3RQQUxEYXRhOyAgICAgYnJlYWs7CiAgICAgIH0KIAogICAgICBTaVNfUHItPlNpU19SVkJIQ01BWCAgPSAoVFZQdHIrUmVzSW5kZXgpLT5SVkJIQ01BWDsKQEAgLTM0MDksNzMgKzMzNjAsNzcgQEAKICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgICAgID0gKFRWUHRyK1Jlc0luZGV4KS0+VkdBVlQ7CiAgICAgIFNpU19Qci0+U2lTX0hERSAgICAgICA9IChUVlB0citSZXNJbmRleCktPlRWSERFOwogICAgICBTaVNfUHItPlNpU19WREUgICAgICAgPSAoVFZQdHIrUmVzSW5kZXgpLT5UVlZERTsKLSAgICAgU2lTX1ByLT5TaVNfUlZCSFJTICAgID0gKFRWUHRyK1Jlc0luZGV4KS0+UlZCSFJTOwotICAgICBTaVNfUHItPlNpU19OZXdGbGlja2VyTW9kZSA9IChUVlB0citSZXNJbmRleCktPkZsaWNrZXJNb2RlOworICAgICBTaVNfUHItPlNpU19SVkJIUlMyICAgPSAoVFZQdHIrUmVzSW5kZXgpLT5SVkJIUlMyICYgMHgwZmZmOwogICAgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB7Ci0gICAgICAgIFNpU19Qci0+U2lTX1JWQkhSUyA9IChUVlB0citSZXNJbmRleCktPkhBTEZSVkJIUlM7CisJU2lTX1ByLT5TaVNfUlZCSFJTID0gKFRWUHRyK1Jlc0luZGV4KS0+SEFMRlJWQkhSUzsKKwlpZihTaVNfUHItPlNpU19SVkJIUlMyKSB7CisJICAgU2lTX1ByLT5TaVNfUlZCSFJTMiA9ICgoU2lTX1ByLT5TaVNfUlZCSFJTMiArIDMpID4+IDEpIC0gMzsKKwkgICB0ZW1wYXggPSAoKFRWUHRyK1Jlc0luZGV4KS0+UlZCSFJTMiA+PiAxMikgJiAweDA3OworCSAgIGlmKChUVlB0citSZXNJbmRleCktPlJWQkhSUzIgJiAweDgwMDApIFNpU19Qci0+U2lTX1JWQkhSUzIgLT0gdGVtcGF4OworCSAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX1JWQkhSUzIgKz0gdGVtcGF4OworCX0KKyAgICAgfSBlbHNlIHsKKwlTaVNfUHItPlNpU19SVkJIUlMgICAgPSAoVFZQdHIrUmVzSW5kZXgpLT5SVkJIUlM7CiAgICAgIH0KKyAgICAgU2lTX1ByLT5TaVNfTmV3RmxpY2tlck1vZGUgPSAoKFRWUHRyK1Jlc0luZGV4KS0+RmxpY2tlck1vZGUpIDw8IDc7CiAKICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKIAotICAgICAgICBpZigocmVzaW5mbyA9PSBTSVNfUklfMTAyNHg3NjgpICB8fAotICAgICAgICAgICAocmVzaW5mbyA9PSBTSVNfUklfMTI4MHgxMDI0KSB8fAotICAgICAgICAgICAocmVzaW5mbyA9PSBTSVNfUklfMTI4MHg3MjApKSB7CisJaWYoKHJlc2luZm8gPT0gU0lTX1JJXzk2MHg2MDApICAgfHwKKwkgICAocmVzaW5mbyA9PSBTSVNfUklfMTAyNHg3NjgpICB8fAorCSAgIChyZXNpbmZvID09IFNJU19SSV8xMjgweDEwMjQpIHx8CisJICAgKHJlc2luZm8gPT0gU0lTX1JJXzEyODB4NzIwKSkgewogCSAgIFNpU19Qci0+U2lTX05ld0ZsaWNrZXJNb2RlID0gMHg0MDsKIAl9CiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM1MCkgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0VFZTaW11TW9kZTsKKwlpZihTaVNfUHItPlNpU19WR0FWREUgPT0gMzUwKSBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRUVlNpbXVNb2RlOwogCi0gICAgICAgIFNpU19Qci0+U2lTX0hUID0gRXh0SGlUVkhUOwotICAgICAgICBTaVNfUHItPlNpU19WVCA9IEV4dEhpVFZWVDsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKLSAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSB7Ci0gICAgICAgICAgICAgIFNpU19Qci0+U2lTX0hUID0gU3RIaVRWSFQ7Ci0gICAgICAgICAgICAgIFNpU19Qci0+U2lTX1ZUID0gU3RIaVRWVlQ7Ci0jaWYgMAotICAgICAgICAgICAgICBpZighKG1vZGVmbGFnICYgQ2hhcng4RG90KSkgewotICAgICAgICAgICAgICAgICBTaVNfUHItPlNpU19IVCA9IFN0SGlUZXh0VFZIVDsKLSAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfVlQgPSBTdEhpVGV4dFRWVlQ7Ci0gICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICB9Ci0gICAgICAgIH0KKwlTaVNfUHItPlNpU19IVCA9IEV4dEhpVFZIVDsKKwlTaVNfUHItPlNpU19WVCA9IEV4dEhpVFZWVDsKKwlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgeworCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgeworCSAgICAgIFNpU19Qci0+U2lTX0hUID0gU3RIaVRWSFQ7CisJICAgICAgU2lTX1ByLT5TaVNfVlQgPSBTdEhpVFZWVDsKKwkgICB9CisJfQogCiAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgewogCi0gICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI3NTBwKSB7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX0hUID0gMTY1MDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVlQgPSA3NTA7CisJaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjc1MHApIHsKKwkgICBTaVNfUHItPlNpU19IVCA9IDE2NTA7CisJICAgU2lTX1ByLT5TaVNfVlQgPSA3NTA7CiAJfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVwKSB7CiAJICAgU2lTX1ByLT5TaVNfSFQgPSBOVFNDSFQ7CisJICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXQ1MjVwMTAyNCkgU2lTX1ByLT5TaVNfSFQgPSBOVFNDMkhUOwogCSAgIFNpU19Qci0+U2lTX1ZUID0gTlRTQ1ZUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBTaVNfUHItPlNpU19IVCA9IE5UU0NIVDsKKwl9IGVsc2UgeworCSAgIFNpU19Qci0+U2lTX0hUID0gTlRTQ0hUOwogCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0TlRTQzEwMjQpIFNpU19Qci0+U2lTX0hUID0gTlRTQzJIVDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVlQgPSBOVFNDVlQ7Ci0gICAgICAgIH0KKwkgICBTaVNfUHItPlNpU19WVCA9IE5UU0NWVDsKKwl9CiAKICAgICAgfSBlbHNlIHsKIAotICAgICAgICBTaVNfUHItPlNpU19SWTFDT0UgPSAoVFZQdHIrUmVzSW5kZXgpLT5SWTFDT0U7Ci0gICAgICAgIFNpU19Qci0+U2lTX1JZMkNPRSA9IChUVlB0citSZXNJbmRleCktPlJZMkNPRTsKLSAgICAgICAgU2lTX1ByLT5TaVNfUlkzQ09FID0gKFRWUHRyK1Jlc0luZGV4KS0+UlkzQ09FOwotICAgICAgICBTaVNfUHItPlNpU19SWTRDT0UgPSAoVFZQdHIrUmVzSW5kZXgpLT5SWTRDT0U7CisJU2lTX1ByLT5TaVNfUlkxQ09FID0gKFRWUHRyK1Jlc0luZGV4KS0+UlkxQ09FOworCVNpU19Qci0+U2lTX1JZMkNPRSA9IChUVlB0citSZXNJbmRleCktPlJZMkNPRTsKKwlTaVNfUHItPlNpU19SWTNDT0UgPSAoVFZQdHIrUmVzSW5kZXgpLT5SWTNDT0U7CisJU2lTX1ByLT5TaVNfUlk0Q09FID0gKFRWUHRyK1Jlc0luZGV4KS0+Ulk0Q09FOwogCi0gICAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfUlkxQ09FID0gMHgwMDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfUlkyQ09FID0gMHhmNDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfUlkzQ09FID0gMHgxMDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfUlk0Q09FID0gMHgzODsKLSAgICAgICAgfQorCWlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHsKKwkgICBTaVNfUHItPlNpU19SWTFDT0UgPSAweDAwOworCSAgIFNpU19Qci0+U2lTX1JZMkNPRSA9IDB4ZjQ7CisJICAgU2lTX1ByLT5TaVNfUlkzQ09FID0gMHgxMDsKKwkgICBTaVNfUHItPlNpU19SWTRDT0UgPSAweDM4OworCX0KIAotICAgICAgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSkgewotICAgICAgICAgICBTaVNfUHItPlNpU19IVCA9IE5UU0NIVDsKKwlpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSkgeworCSAgIFNpU19Qci0+U2lTX0hUID0gTlRTQ0hUOwogCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0TlRTQzEwMjQpIFNpU19Qci0+U2lTX0hUID0gTlRTQzJIVDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVlQgPSBOVFNDVlQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX0hUID0gUEFMSFQ7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX1ZUID0gUEFMVlQ7Ci0gICAgICAgIH0KKwkgICBTaVNfUHItPlNpU19WVCA9IE5UU0NWVDsKKwl9IGVsc2UgeworCSAgIFNpU19Qci0+U2lTX0hUID0gUEFMSFQ7CisJICAgU2lTX1ByLT5TaVNfVlQgPSBQQUxWVDsKKwl9CiAKICAgICAgfQogCkBAIC0zNDg2LDQyICszNDQxLDUzIEBACiAKICAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CiAKLSAgICAgICAgU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPkNIVG90YWw7Ci0gICAgICAgIFNpU19Qci0+U2lTX1ZHQVZUID0gU2lTX1ByLT5DVlRvdGFsOwotICAgICAgICBTaVNfUHItPlNpU19IVCAgICA9IFNpU19Qci0+Q0hUb3RhbDsKLSAgICAgICAgU2lTX1ByLT5TaVNfVlQgICAgPSBTaVNfUHItPkNWVG90YWw7CiAJU2lTX1ByLT5TaVNfSERFICAgPSBTaVNfUHItPlNpU19WR0FIREU7Ci0gICAgICAgIFNpU19Qci0+U2lTX1ZERSAgID0gU2lTX1ByLT5TaVNfVkdBVkRFOworCVNpU19Qci0+U2lTX1ZERSAgID0gU2lTX1ByLT5TaVNfVkdBVkRFOworCisJdGVtcGF4ID0gU2lTX1ByLT5DSFRvdGFsOworCWlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHRlbXBheCA8PD0gMTsKKwlTaVNfUHItPlNpU19WR0FIVCA9IFNpU19Qci0+U2lTX0hUID0gdGVtcGF4OworCVNpU19Qci0+U2lTX1ZHQVZUID0gU2lTX1ByLT5TaVNfVlQgPSBTaVNfUHItPkNWVG90YWw7CiAKICAgICAgfSBlbHNlIHsKIAotICAgICAgICBCT09MRUFOIGdvdGl0ID0gRkFMU0U7CisJQk9PTEVBTiBnb3RpdCA9IEZBTFNFOwogCi0gICAgICAgIGlmKChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgJiYgKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkpKSB7CisJaWYoKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSAmJiAoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkpIHsKIAotICAgICAgICAgICBTaVNfUHItPlNpU19WR0FIVCA9IFNpU19Qci0+UGFuZWxIVDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgPSBTaVNfUHItPlBhbmVsVlQ7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX0hUICAgID0gU2lTX1ByLT5QYW5lbEhUOwotICAgICAgICAgICBTaVNfUHItPlNpU19WVCAgICA9IFNpU19Qci0+UGFuZWxWVDsKKwkgICBTaVNfUHItPlNpU19WR0FIVCA9IFNpU19Qci0+UGFuZWxIVDsKKwkgICBTaVNfUHItPlNpU19WR0FWVCA9IFNpU19Qci0+UGFuZWxWVDsKKwkgICBTaVNfUHItPlNpU19IVCAgICA9IFNpU19Qci0+UGFuZWxIVDsKKwkgICBTaVNfUHItPlNpU19WVCAgICA9IFNpU19Qci0+UGFuZWxWVDsKIAkgICBnb3RpdCA9IFRSVUU7CiAKIAl9IGVsc2UgaWYoICghKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSkgJiYgKHJvbXB0cikgJiYgKFJPTUFkZHIpICkgewogCiAjaWZkZWYgU0lTMzE1SAogCSAgIFNpU19Qci0+U2lTX1JWQkhDTUFYICA9IFJPTUFkZHJbcm9tcHRyXTsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfUlZCSENGQUNUID0gUk9NQWRkcltyb21wdHIrMV07Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX1ZHQUhUICAgICA9IFJPTUFkZHJbcm9tcHRyKzJdIHwgKChST01BZGRyW3JvbXB0ciszXSAmIDB4MGYpIDw8IDgpOwotICAgICAgICAgICBTaVNfUHItPlNpU19WR0FWVCAgICAgPSBST01BZGRyW3JvbXB0cis0XSB8ICgoUk9NQWRkcltyb21wdHIrM10gJiAweGYwKSA8PCA0KTsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfSFQgICAgICAgID0gUk9NQWRkcltyb21wdHIrNV0gfCAoKFJPTUFkZHJbcm9tcHRyKzZdICYgMHgwZikgPDwgOCk7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX1ZUICAgICAgICA9IFJPTUFkZHJbcm9tcHRyKzddIHwgKChST01BZGRyW3JvbXB0cis2XSAmIDB4ZjApIDw8IDQpOworCSAgIFNpU19Qci0+U2lTX1JWQkhDRkFDVCA9IFJPTUFkZHJbcm9tcHRyKzFdOworCSAgIFNpU19Qci0+U2lTX1ZHQUhUICAgICA9IFJPTUFkZHJbcm9tcHRyKzJdIHwgKChST01BZGRyW3JvbXB0ciszXSAmIDB4MGYpIDw8IDgpOworCSAgIFNpU19Qci0+U2lTX1ZHQVZUICAgICA9IChST01BZGRyW3JvbXB0cis0XSA8PCA0KSB8ICgoUk9NQWRkcltyb21wdHIrM10gJiAweGYwKSA+PiA0KTsKKwkgICBTaVNfUHItPlNpU19IVCAgICAgICAgPSBST01BZGRyW3JvbXB0cis1XSB8ICgoUk9NQWRkcltyb21wdHIrNl0gJiAweDBmKSA8PCA4KTsKKwkgICBTaVNfUHItPlNpU19WVCAgICAgICAgPSAoUk9NQWRkcltyb21wdHIrN10gPDwgNCkgfCAoKFJPTUFkZHJbcm9tcHRyKzZdICYgMHhmMCkgPj4gNCk7CisJICAgU2lTX1ByLT5TaVNfUlZCSFJTMiAgID0gUk9NQWRkcltyb21wdHIrOF0gfCAoKFJPTUFkZHJbcm9tcHRyKzldICYgMHgwZikgPDwgOCk7CisJICAgaWYoKFNpU19Qci0+U2lTX1JWQkhSUzIpICYmIChtb2RlZmxhZyAmIEhhbGZEQ0xLKSkgeworCSAgICAgIFNpU19Qci0+U2lTX1JWQkhSUzIgPSAoKFNpU19Qci0+U2lTX1JWQkhSUzIgKyAzKSA+PiAxKSAtIDM7CisJICAgICAgdGVtcGF4ID0gKFJPTUFkZHJbcm9tcHRyKzldID4+IDQpICYgMHgwNzsKKwkgICAgICBpZihST01BZGRyW3JvbXB0cis5XSAmIDB4ODApIFNpU19Qci0+U2lTX1JWQkhSUzIgLT0gdGVtcGF4OworCSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfUlZCSFJTMiArPSB0ZW1wYXg7CisJICAgfQogCSAgIGlmKFNpU19Qci0+U2lTX1ZHQUhUKSBnb3RpdCA9IFRSVUU7CiAJICAgZWxzZSB7CiAJICAgICAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBEb250RXhwYW5kTENEOwogCSAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gJj0gfkxDRFBhc3MxMTsKKwkgICAgICBTaVNfUHItPlNpU19SVkJIQ01BWCAgPSAxOworCSAgICAgIFNpU19Qci0+U2lTX1JWQkhDRkFDVCA9IDE7CiAJICAgICAgU2lTX1ByLT5TaVNfVkdBSFQgICA9IFNpU19Qci0+UGFuZWxIVDsKLSAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgICA9IFNpU19Qci0+UGFuZWxWVDsKLSAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfSFQgICAgICA9IFNpU19Qci0+UGFuZWxIVDsKLSAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfVlQgICAgICA9IFNpU19Qci0+UGFuZWxWVDsKKwkgICAgICBTaVNfUHItPlNpU19WR0FWVCAgID0gU2lTX1ByLT5QYW5lbFZUOworCSAgICAgIFNpU19Qci0+U2lTX0hUICAgICAgPSBTaVNfUHItPlBhbmVsSFQ7CisJICAgICAgU2lTX1ByLT5TaVNfVlQgICAgICA9IFNpU19Qci0+UGFuZWxWVDsKKwkgICAgICBTaVNfUHItPlNpU19SVkJIUlMyID0gMDsKIAkgICAgICBnb3RpdCA9IFRSVUU7CiAJICAgfQogI2VuZGlmCkBAIC0zNTMwLDI4ICszNDk2LDMwIEBACiAKIAlpZighZ290aXQpIHsKIAotICAgICAgICAgICBTaVNfR2V0Q1JUMlB0cihTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4LFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJkNSVDJJbmRleCwmUmVzSW5kZXgsSHdJbmZvKTsKKwkgICBTaVNfR2V0Q1JUMlB0cihTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4LFJlZnJlc2hSYXRlVGFibGVJbmRleCwKKwkJCSAgJkNSVDJJbmRleCwmUmVzSW5kZXgpOwogCi0gICAgICAgICAgIHN3aXRjaChDUlQySW5kZXgpIHsKKwkgICBzd2l0Y2goQ1JUMkluZGV4KSB7CiAJICAgICAgY2FzZSBQYW5lbF8xMDI0eDc2OCAgICAgIDogTENEUHRyID0gU2lTX1ByLT5TaVNfRXh0TENEMTAyNHg3NjhEYXRhOyAgIGJyZWFrOwogCSAgICAgIGNhc2UgUGFuZWxfMTAyNHg3NjggICsgMzI6IExDRFB0ciA9IFNpU19Qci0+U2lTX1N0MkxDRDEwMjR4NzY4RGF0YTsgICBicmVhazsKIAkgICAgICBjYXNlIFBhbmVsXzEyODB4NzIwICAgICAgOgogCSAgICAgIGNhc2UgUGFuZWxfMTI4MHg3MjAgICsgMzI6IExDRFB0ciA9IFNpU19Qci0+U2lTX0xDRDEyODB4NzIwRGF0YTsgICAgICBicmVhazsKIAkgICAgICBjYXNlIFBhbmVsXzEyODB4NzY4XzIgICAgOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19FeHRMQ0QxMjgweDc2OF8yRGF0YTsgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgUGFuZWxfMTI4MHg3NjhfMisgMzI6IExDRFB0ciA9IFNpU19Qci0+U2lTX1N0TENEMTI4MHg3NjhfMkRhdGE7ICBicmVhazsKKwkgICAgICBjYXNlIFBhbmVsXzEyODB4NzY4XzIrIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19TdExDRDEyODB4NzY4XzJEYXRhOyAgYnJlYWs7CiAJICAgICAgY2FzZSBQYW5lbF8xMjgweDgwMCAgICAgIDoKIAkgICAgICBjYXNlIFBhbmVsXzEyODB4ODAwICArIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19MQ0QxMjgweDgwMERhdGE7ICAgICAgYnJlYWs7CiAJICAgICAgY2FzZSBQYW5lbF8xMjgweDgwMF8yICAgIDoKIAkgICAgICBjYXNlIFBhbmVsXzEyODB4ODAwXzIrIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19MQ0QxMjgweDgwMF8yRGF0YTsgICAgYnJlYWs7CisJICAgICAgY2FzZSBQYW5lbF8xMjgweDg1NCAgICAgIDoKKwkgICAgICBjYXNlIFBhbmVsXzEyODB4ODU0ICArIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19MQ0QxMjgweDg1NERhdGE7ICAgICAgYnJlYWs7CiAJICAgICAgY2FzZSBQYW5lbF8xMjgweDk2MCAgICAgIDoKIAkgICAgICBjYXNlIFBhbmVsXzEyODB4OTYwICArIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19MQ0QxMjgweDk2MERhdGE7ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgUGFuZWxfMTI4MHgxMDI0ICAgICA6IExDRFB0ciA9IFNpU19Qci0+U2lTX0V4dExDRDEyODB4MTAyNERhdGE7ICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBQYW5lbF8xMjgweDEwMjQgKyAzMjogTENEUHRyID0gU2lTX1ByLT5TaVNfU3QyTENEMTI4MHgxMDI0RGF0YTsgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIFBhbmVsXzE0MDB4MTA1MCAgICAgOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19FeHRMQ0QxNDAweDEwNTBEYXRhOyAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgUGFuZWxfMTQwMHgxMDUwICsgMzI6IExDRFB0ciA9IFNpU19Qci0+U2lTX1N0TENEMTQwMHgxMDUwRGF0YTsgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBQYW5lbF8xNjAweDEyMDAgICAgIDogTENEUHRyID0gU2lTX1ByLT5TaVNfRXh0TENEMTYwMHgxMjAwRGF0YTsgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIFBhbmVsXzE2MDB4MTIwMCArIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19TdExDRDE2MDB4MTIwMERhdGE7ICAgYnJlYWs7CisJICAgICAgY2FzZSBQYW5lbF8xMjgweDEwMjQgICAgIDogTENEUHRyID0gU2lTX1ByLT5TaVNfRXh0TENEMTI4MHgxMDI0RGF0YTsgIGJyZWFrOworCSAgICAgIGNhc2UgUGFuZWxfMTI4MHgxMDI0ICsgMzI6IExDRFB0ciA9IFNpU19Qci0+U2lTX1N0MkxDRDEyODB4MTAyNERhdGE7ICBicmVhazsKKwkgICAgICBjYXNlIFBhbmVsXzE0MDB4MTA1MCAgICAgOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19FeHRMQ0QxNDAweDEwNTBEYXRhOyAgYnJlYWs7CisJICAgICAgY2FzZSBQYW5lbF8xNDAweDEwNTAgKyAzMjogTENEUHRyID0gU2lTX1ByLT5TaVNfU3RMQ0QxNDAweDEwNTBEYXRhOyAgIGJyZWFrOworCSAgICAgIGNhc2UgUGFuZWxfMTYwMHgxMjAwICAgICA6IExDRFB0ciA9IFNpU19Qci0+U2lTX0V4dExDRDE2MDB4MTIwMERhdGE7ICBicmVhazsKKwkgICAgICBjYXNlIFBhbmVsXzE2MDB4MTIwMCArIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19TdExDRDE2MDB4MTIwMERhdGE7ICAgYnJlYWs7CiAJICAgICAgY2FzZSBQYW5lbF8xNjgweDEwNTAgICAgIDoKIAkgICAgICBjYXNlIFBhbmVsXzE2ODB4MTA1MCArIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19MQ0QxNjgweDEwNTBEYXRhOyAgICAgYnJlYWs7CiAJICAgICAgY2FzZSAxMDAJCSAgICAgICA6IExDRFB0ciA9IFNpU19Qci0+U2lTX05vU2NhbGVEYXRhOwkgICAgYnJlYWs7CkBAIC0zNTU5LDI3MSArMzUyNywzNDAgQEAKIAkgICAgICBjYXNlIDIwMCAgICAgICAgICAgICAgICAgOiBMQ0RQdHIgPSBTaVMzMTBfRXh0Q29tcGFxMTI4MHgxMDI0RGF0YTsgICAgYnJlYWs7CiAJICAgICAgY2FzZSAyMDEgICAgICAgICAgICAgICAgIDogTENEUHRyID0gU2lTX1ByLT5TaVNfU3QyTENEMTI4MHgxMDI0RGF0YTsgIGJyZWFrOwogI2VuZGlmCi0gICAgICAgICAgICAgIGRlZmF1bHQgICAgICAgICAgICAgICAgICA6IExDRFB0ciA9IFNpU19Qci0+U2lTX0V4dExDRDEwMjR4NzY4RGF0YTsgICBicmVhazsKLSAgICAgICAgICAgfQorCSAgICAgIGRlZmF1bHQgICAgICAgICAgICAgICAgICA6IExDRFB0ciA9IFNpU19Qci0+U2lTX0V4dExDRDEwMjR4NzY4RGF0YTsgICBicmVhazsKKwkgICB9CiAKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwotICAgICAgICAgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywgIkdldENSVDJEYXRhOiBJbmRleCAlZCBSZXNJbmRleCAlZFxuIiwgQ1JUMkluZGV4LCBSZXNJbmRleCk7CisJICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJHZXRDUlQyRGF0YTogSW5kZXggJWQgUmVzSW5kZXggJWRcbiIsIENSVDJJbmRleCwgUmVzSW5kZXgpOworI2VuZGlmCiAjZW5kaWYKIAotICAgICAgICAgICBTaVNfUHItPlNpU19SVkJIQ01BWCAgPSAoTENEUHRyK1Jlc0luZGV4KS0+UlZCSENNQVg7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX1JWQkhDRkFDVCA9IChMQ0RQdHIrUmVzSW5kZXgpLT5SVkJIQ0ZBQ1Q7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX1ZHQUhUICAgICA9IChMQ0RQdHIrUmVzSW5kZXgpLT5WR0FIVDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgICAgID0gKExDRFB0citSZXNJbmRleCktPlZHQVZUOwotICAgICAgICAgICBTaVNfUHItPlNpU19IVCAgICAgICAgPSAoTENEUHRyK1Jlc0luZGV4KS0+TENESFQ7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX1ZUICAgICAgICA9IChMQ0RQdHIrUmVzSW5kZXgpLT5MQ0RWVDsKKwkgICBTaVNfUHItPlNpU19SVkJIQ01BWCAgPSAoTENEUHRyK1Jlc0luZGV4KS0+UlZCSENNQVg7CisJICAgU2lTX1ByLT5TaVNfUlZCSENGQUNUID0gKExDRFB0citSZXNJbmRleCktPlJWQkhDRkFDVDsKKwkgICBTaVNfUHItPlNpU19WR0FIVCAgICAgPSAoTENEUHRyK1Jlc0luZGV4KS0+VkdBSFQ7CisJICAgU2lTX1ByLT5TaVNfVkdBVlQgICAgID0gKExDRFB0citSZXNJbmRleCktPlZHQVZUOworCSAgIFNpU19Qci0+U2lTX0hUICAgICAgICA9IChMQ0RQdHIrUmVzSW5kZXgpLT5MQ0RIVDsKKwkgICBTaVNfUHItPlNpU19WVCAgICAgICAgPSAoTENEUHRyK1Jlc0luZGV4KS0+TENEVlQ7CiAKICAgICAgICAgfQogCiAJdGVtcGF4ID0gU2lTX1ByLT5QYW5lbFhSZXM7Ci0gICAgICAgIHRlbXBieCA9IFNpU19Qci0+UGFuZWxZUmVzOworCXRlbXBieCA9IFNpU19Qci0+UGFuZWxZUmVzOwogCi0JaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgewotICAgICAgICAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykgewotICAgICAgICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7Ci0gICAgICAgICAgICAgICAgIGlmICAgICAoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM1MCkgdGVtcGJ4ID0gNTYwOwotICAgICAgICAgICAgICAgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSA0MDApIHRlbXBieCA9IDY0MDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpZiAgICAgKFNpU19Qci0+U2lTX1ZHQVZERSA9PSAzNTcpIHRlbXBieCA9IDUyNzsKLSAgICAgICAgICAgICAgZWxzZSBpZihTaVNfUHItPlNpU19WR0FWREUgPT0gNDIwKSB0ZW1wYnggPSA2MjA7Ci0gICAgICAgICAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDUyNSkgdGVtcGJ4ID0gNzc1OwotICAgICAgICAgICAgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSA2MDApIHRlbXBieCA9IDc3NTsKLSAgICAgICAgICAgICAgZWxzZSBpZihTaVNfUHItPlNpU19WR0FWREUgPT0gMzUwKSB0ZW1wYnggPSA1NjA7Ci0gICAgICAgICAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQwMCkgdGVtcGJ4ID0gNjQwOwotICAgICAgICAgICB9Ci0JfSBlbHNlIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHg5NjApIHsKLSAgICAgICAgICAgaWYgICAgIChTaVNfUHItPlNpU19WR0FWREUgPT0gMzUwKSAgdGVtcGJ4ID0gNzAwOwotICAgICAgICAgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSA0MDApICB0ZW1wYnggPSA4MDA7Ci0gICAgICAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDEwMjQpIHRlbXBieCA9IDk2MDsKLQl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMjgweDEwMjQpIHsKLSAgICAgICAgICAgaWYgICAgIChTaVNfUHItPlNpU19WR0FWREUgPT0gMzYwKSB0ZW1wYnggPSA3Njg7Ci0gICAgICAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM3NSkgdGVtcGJ4ID0gODAwOwotICAgICAgICAgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSA0MDUpIHRlbXBieCA9IDg2NDsKLSAgICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTYwMHgxMjAwKSB7CisJc3dpdGNoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8pIHsKKwljYXNlIFBhbmVsXzEwMjR4NzY4OgorCSAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSB7CisJICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CisJCSBpZiAgICAgKFNpU19Qci0+U2lTX1ZHQVZERSA9PSAzNTApIHRlbXBieCA9IDU2MDsKKwkJIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQwMCkgdGVtcGJ4ID0gNjQwOworCSAgICAgIH0KKwkgICB9IGVsc2UgeworCSAgICAgIGlmICAgICAoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM1NykgdGVtcGJ4ID0gNTI3OworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQyMCkgdGVtcGJ4ID0gNjIwOworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDUyNSkgdGVtcGJ4ID0gNzc1OworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDYwMCkgdGVtcGJ4ID0gNzc1OworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM1MCkgdGVtcGJ4ID0gNTYwOworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQwMCkgdGVtcGJ4ID0gNjQwOworCSAgIH0KKwkgICBicmVhazsKKwljYXNlIFBhbmVsXzEyODB4OTYwOgorCSAgIGlmICAgICAoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM1MCkgIHRlbXBieCA9IDcwMDsKKwkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSA0MDApICB0ZW1wYnggPSA4MDA7CisJICAgZWxzZSBpZihTaVNfUHItPlNpU19WR0FWREUgPT0gMTAyNCkgdGVtcGJ4ID0gOTYwOworCSAgIGJyZWFrOworCWNhc2UgUGFuZWxfMTI4MHgxMDI0OgorCSAgIGlmICAgICAoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM2MCkgdGVtcGJ4ID0gNzY4OworCSAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM3NSkgdGVtcGJ4ID0gODAwOworCSAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQwNSkgdGVtcGJ4ID0gODY0OworCSAgIGJyZWFrOworCWNhc2UgUGFuZWxfMTYwMHgxMjAwOgogCSAgIGlmKCEoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExDRFZFU0FUaW1pbmcpKSB7Ci0gICAgICAgICAgICAgIGlmICAgICAoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM1MCkgIHRlbXBieCA9IDg3NTsKLSAgICAgICAgICAgICAgZWxzZSBpZihTaVNfUHItPlNpU19WR0FWREUgPT0gNDAwKSAgdGVtcGJ4ID0gMTAwMDsKLSAgICAgICAgICAgfQotICAgICAgICB9CisJICAgICAgaWYgICAgIChTaVNfUHItPlNpU19WR0FWREUgPT0gMzUwKSAgdGVtcGJ4ID0gODc1OworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQwMCkgIHRlbXBieCA9IDEwMDA7CisJICAgfQorCSAgIGJyZWFrOworCX0KIAotICAgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgewotICAgICAgICAgICB0ZW1wYXggPSBTaVNfUHItPlNpU19WR0FIREU7Ci0gICAgICAgICAgIHRlbXBieCA9IFNpU19Qci0+U2lTX1ZHQVZERTsKLSAgICAgICAgfQorCWlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB7CisJICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfVkdBSERFOworCSAgIHRlbXBieCA9IFNpU19Qci0+U2lTX1ZHQVZERTsKKwl9CiAKLSAgICAgICAgU2lTX1ByLT5TaVNfSERFID0gdGVtcGF4OwotICAgICAgICBTaVNfUHItPlNpU19WREUgPSB0ZW1wYng7CisJU2lTX1ByLT5TaVNfSERFID0gdGVtcGF4OworCVNpU19Qci0+U2lTX1ZERSA9IHRlbXBieDsKICAgICAgfQogICB9CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfR2V0Q1JUMkRhdGEoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfR2V0Q1JUMkRhdGEoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewogCi0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CisgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewogCi0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKLSAgICAgICAgU2lTX0dldENSVDJEYXRhTFZEUyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgSHdJbmZvKTsKLSAgICAgfSBlbHNlIHsKLQlpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpKSB7Ci0JICAgLyogTmVlZCBMVkRTIERhdGEgZm9yIExDRCBvbiAzMDFCLURIICovCi0JICAgU2lTX0dldENSVDJEYXRhTFZEUyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgSHdJbmZvKTsKLQl9IGVsc2UgewotCSAgIFNpU19HZXRDUlQyRGF0YTMwMShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgSHdJbmZvKTsKLSAgICAgICAgfQotICAgICB9CisgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7CisgICAgICAgICBTaVNfR2V0Q1JUMkRhdGFMVkRTKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKKyAgICAgIH0gZWxzZSB7CisJIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkpIHsKKwkgICAgLyogTmVlZCBMVkRTIERhdGEgZm9yIExDRCBvbiAzMDFCLURIICovCisJICAgIFNpU19HZXRDUlQyRGF0YUxWRFMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSB9IGVsc2UgeworCSAgICBTaVNfR2V0Q1JUMkRhdGEzMDEoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSB9CisgICAgICB9CiAKLSAgfSBlbHNlIHsKKyAgIH0gZWxzZSB7CiAKLSAgICAgU2lTX0dldENSVDJEYXRhTFZEUyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgSHdJbmZvKTsKKyAgICAgIFNpU19HZXRDUlQyRGF0YUxWRFMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwogCi0gIH0KKyAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgR0VUIExWRFMgREVTIChTS0VXKSBEQVRBICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotU2lTX0dldExWRFNEZXNQdHIoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgVVNIT1JUICpQYW5lbEluZGV4LAotCQkgIFVTSE9SVCAqUmVzSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGVzICoKK1NpU19HZXRMVkRTRGVzUHRyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVU0hPUlQgbW9kZWZsYWc7CisgICBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEZXMgKlBhbmVsRGVzUHRyID0gTlVMTDsKIAotICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gICAgICgqUmVzSW5kZXgpID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQzsKLSAgfSBlbHNlIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKLSAgICAgKCpSZXNJbmRleCkgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQyQ1JUQzsKLSAgfQorI2lmZGVmIFNJUzMwMAorICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CiAKLSAgKCpSZXNJbmRleCkgJj0gMHgxRjsKLSAgKCpQYW5lbEluZGV4KSA9IDA7Ci0KLSAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgICAgICgqUGFuZWxJbmRleCkgPSA1MDsKLSAgICAgICAgaWYoKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSAmJiAoIShTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTE0pKSkgKCpQYW5lbEluZGV4KSArPSAyOwotICAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pICgqUGFuZWxJbmRleCkgKz0gMTsKLSAgICAgICAgLyogTm90aGluZyBzcGVjaWFsIG5lZWRlZCBmb3IgU092ZXJzY2FuICAgICovCi0gICAgICAgIC8qIFBBTE0gdXNlcyBOVFNDIGRhdGEsIFBBTE4gdXNlcyBQQUwgZGF0YSAqLwotICAgICB9Ci0gIH0KLQotICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKLSAgICAgKlBhbmVsSW5kZXggPSBTaVNfUHItPlNpU19MQ0RUeXBlSW5mbzsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgewotICAgICAgICAvKiBBcyBsb25nIGFzIHdlIGRvbidzIHVzZSB0aGUgQklPUyB0YWJsZXMsIHdlCi0JICogbmVlZCB0byBjb252ZXJ0IHRoZSBUeXBlSW5mbyBhcyBmb3IgMzE1IHNlcmllcwotCSAqLwotICAgICAgICAoKlBhbmVsSW5kZXgpID0gU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAtIDE7Ci0gICAgIH0KLSAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKLSAgICAgICAgKCpQYW5lbEluZGV4KSArPSAxNjsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkgewotICAgICAgICAgICAoKlBhbmVsSW5kZXgpID0gMzI7Ci0gICAgICAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspICgqUGFuZWxJbmRleCkrKzsKLQl9Ci0gICAgIH0KLSAgfQotCi0gIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfNjQweDQ4MCkgewotICAgICAgICAoKlJlc0luZGV4KSA9IDc7Ci0gICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSAgICAgICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTMpICYgMHg4MCkgKCpSZXNJbmRleCkrKzsKLSAgICAgICAgfQotICAgICB9Ci0gIH0KKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCSBpZihTaVNfUHItPlNpU19MQ0RUeXBlSW5mbyA9PSA0KSB7CisJICAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTM2NikgeworCSAgICAgICBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTA0XzFhOworCSAgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgeworCQkgIFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDRfMmE7CisJICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9CQVJDTzEwMjQpIHsKKwkgICAgICAgUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8xYjsKKwkgICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKKwkJICBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTA0XzJiOworCSAgICAgICB9CisJICAgIH0KKwkgfQorICAgICAgfQorICAgfQorI2VuZGlmCisgICByZXR1cm4gUGFuZWxEZXNQdHI7CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfR2V0TFZEU0Rlc0RhdGEoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19HZXRMVkRTRGVzRGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCiB7Ci0gIFVTSE9SVCBtb2RlZmxhZzsKLSAgVVNIT1JUIFBhbmVsSW5kZXgsUmVzSW5kZXg7Ci0gIGNvbnN0ICBTaVNfTFZEU0Rlc1N0cnVjdCAqUGFuZWxEZXNQdHIgPSBOVUxMOworICB1bnNpZ25lZCBzaG9ydCBtb2RlZmxhZywgUmVzSW5kZXg7CisgIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcyAqUGFuZWxEZXNQdHIgPSBOVUxMOwogCiAgIFNpU19Qci0+U2lTX0xDREhERVMgPSAwOwogICBTaVNfUHItPlNpU19MQ0RWREVTID0gMDsKIAorICAvKiBTb21lIHNwZWNpYWwgY2FzZXMgKi8KKyAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CisKKyAgICAgLyogVHJ1bXBpb24gKi8KKyAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OKSB7CisJaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgeworCSAgIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSBTaVNfUHItPlBhbmVsWVJlcykgeworCSAgICAgIFNpU19Qci0+U2lTX0xDRFZERVMgPSBTaVNfUHItPlBhbmVsVlQgLSAxOworCSAgIH0KKwl9CisJcmV0dXJuOworICAgICB9CisKKyAgICAgLyogNjQweDQ4MCBvbiBMVkRTICovCisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCWlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MCAmJiBTaVNfUHItPlNpU19MQ0RUeXBlSW5mbyA9PSAzKSB7CisJICAgU2lTX1ByLT5TaVNfTENESERFUyA9IDg7CisJICAgaWYgICAgIChTaVNfUHItPlNpU19WR0FWREUgPj0gNDgwKSBTaVNfUHItPlNpU19MQ0RWREVTID0gNTEyOworCSAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID49IDQwMCkgU2lTX1ByLT5TaVNfTENEVkRFUyA9IDQzNjsKKwkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA+PSAzNTApIFNpU19Qci0+U2lTX0xDRFZERVMgPSA0NDA7CisJICAgcmV0dXJuOworCX0KKyAgICAgfQorCisgIH0gLyogTENEICovCisKICAgaWYoIChTaVNfUHItPlVzZUN1c3RvbU1vZGUpIAkJICAgICAgICAgfHwKICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsX0N1c3RvbSkgICB8fAogICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODQ4KSAgICAgIHx8Ci0gICAgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSAmJgotICAgICAgIChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgJiYKLSAgICAgICAoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkpICkgeworICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODU2KSAgICAgIHx8CisgICAgICAoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkgKSB7CiAgICAgIHJldHVybjsKICAgfQogCi0gIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkgeworICBpZihNb2RlTm8gPD0gMHgxMykgUmVzSW5kZXggPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X0NSVDJDUlRDOworICBlbHNlICAgICAgICAgICAgICAgUmVzSW5kZXggPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQyQ1JUQzsKKworICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKIAogI2lmZGVmIFNJUzMxNUgKICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKLSAgICAgICAgLyogbm9uLXBhc3MgMToxIG9ubHksIHNlZSBhYm92ZSAqLwotICAgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgIT0gU2lTX1ByLT5QYW5lbFhSZXMpIHsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfTENESERFUyA9IFNpU19Qci0+U2lTX0hUIC0gKChTaVNfUHItPlBhbmVsWFJlcyAtIFNpU19Qci0+U2lTX1ZHQUhERSkgLyAyKTsKKwkvKiBub24tcGFzcyAxOjEgb25seSwgc2VlIGFib3ZlICovCisJaWYoU2lTX1ByLT5TaVNfVkdBSERFICE9IFNpU19Qci0+UGFuZWxYUmVzKSB7CisJICAgU2lTX1ByLT5TaVNfTENESERFUyA9IFNpU19Qci0+U2lTX0hUIC0gKChTaVNfUHItPlBhbmVsWFJlcyAtIFNpU19Qci0+U2lTX1ZHQUhERSkgLyAyKTsKIAl9CiAJaWYoU2lTX1ByLT5TaVNfVkdBVkRFICE9IFNpU19Qci0+UGFuZWxZUmVzKSB7CiAJICAgU2lTX1ByLT5TaVNfTENEVkRFUyA9IFNpU19Qci0+U2lTX1ZUIC0gKChTaVNfUHItPlBhbmVsWVJlcyAtIFNpU19Qci0+U2lTX1ZHQVZERSkgLyAyKTsKIAl9CiAgICAgIH0KICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IFNpU19Qci0+UGFuZWxZUmVzKSB7Ci0gICAgICAgIHN3aXRjaChTaVNfUHItPlNpU19DdXN0b21UKSB7Ci0gICAgICAgIGNhc2UgQ1VUX1VOSVdJTEwxMDI0OgotICAgICAgICBjYXNlIENVVF9VTklXSUxMMTAyNDI6Ci0gICAgICAgIGNhc2UgQ1VUX0NMRVZPMTQwMDoKKwlzd2l0Y2goU2lTX1ByLT5TaVNfQ3VzdG9tVCkgeworCWNhc2UgQ1VUX1VOSVdJTEwxMDI0OgorCWNhc2UgQ1VUX1VOSVdJTEwxMDI0MjoKKwljYXNlIENVVF9DTEVWTzE0MDA6CiAJICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgewogCSAgICAgIFNpU19Qci0+U2lTX0xDRFZERVMgPSBTaVNfUHItPlBhbmVsVlQgLSAxOwogCSAgIH0KIAkgICBicmVhazsKIAl9Ci0JaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMjgweDEwMjQpIHsKKwlzd2l0Y2goU2lTX1ByLT5TaVNfTENEUmVzSW5mbykgeworCWNhc2UgUGFuZWxfMTI4MHgxMDI0OgogCSAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgIT0gQ1VUX0NPTVBBUTEyODApIHsKIAkgICAgICBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUIC0gMTsKIAkgICB9CisJICAgYnJlYWs7CisJY2FzZSBQYW5lbF8xMjgweDgwMDoJLyogVmVyaWZpZWQgZm9yIEF2ZXJhdGVjIDYyNDAgKi8KKwljYXNlIFBhbmVsXzEyODB4ODAwXzI6CS8qIFZlcmlmaWVkIGZvciBBc3VzIEE0TCAqLworCWNhc2UgUGFuZWxfMTI4MHg4NTQ6ICAgIC8qIE5vdCB2ZXJpZmllZCB5ZXQgRklYTUUgKi8KKwkgICBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUIC0gMTsKKwkgICBicmVhazsKIAl9CiAgICAgIH0KICNlbmRpZgogCiAgIH0gZWxzZSB7CiAKLSAgICAgU2lTX0dldExWRFNEZXNQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICZQYW5lbEluZGV4LCAmUmVzSW5kZXgsIEh3SW5mbyk7CisgICAgIGlmKChTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikpIHsKIAotICAgICBzd2l0Y2goUGFuZWxJbmRleCkgewotICAgICAJY2FzZSAgMDogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwMF8xOyAgICBicmVhazsgICAvKiAtLS0gICovCi0gICAgIAljYXNlICAxOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTAxXzE7ICAgIGJyZWFrOwotICAgICAJY2FzZSAgMjogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwMl8xOyAgICBicmVhazsKLSAgICAgCWNhc2UgIDM6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDNfMTsgICAgYnJlYWs7Ci0gICAgIAljYXNlICA0OiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTA0XzE7ICAgIGJyZWFrOwotICAgICAJY2FzZSAgNTogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwNV8xOyAgICBicmVhazsKLSAgICAgCWNhc2UgIDY6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDZfMTsgICAgYnJlYWs7Ci0gICAgIAljYXNlICA3OiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTA3XzE7ICAgIGJyZWFrOwotICAgICAJY2FzZSAgODogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwOF8xOyAgICBicmVhazsKLSAgICAgCWNhc2UgIDk6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDlfMTsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDEwOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTBhXzE7ICAgIGJyZWFrOwotICAgICAJY2FzZSAxMTogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwYl8xOyAgICBicmVhazsKLSAgICAgCWNhc2UgMTI6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMGNfMTsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDEzOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTBkXzE7ICAgIGJyZWFrOwotICAgICAJY2FzZSAxNDogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwZV8xOyAgICBicmVhazsKLSAgICAgCWNhc2UgMTU6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMGZfMTsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDE2OiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTAwXzI7ICAgIGJyZWFrOyAgICAvKiAtLS0gKi8KLSAgICAgCWNhc2UgMTc6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDFfMjsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDE4OiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTAyXzI7ICAgIGJyZWFrOwotICAgICAJY2FzZSAxOTogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwM18yOyAgICBicmVhazsKLSAgICAgCWNhc2UgMjA6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDRfMjsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDIxOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTA1XzI7ICAgIGJyZWFrOwotICAgICAJY2FzZSAyMjogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwNl8yOyAgICBicmVhazsKLSAgICAgCWNhc2UgMjM6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDdfMjsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDI0OiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTA4XzI7ICAgIGJyZWFrOwotICAgICAJY2FzZSAyNTogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwOV8yOyAgICBicmVhazsKLSAgICAgCWNhc2UgMjY6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMGFfMjsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDI3OiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTBiXzI7ICAgIGJyZWFrOwotICAgICAJY2FzZSAyODogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwY18yOyAgICBicmVhazsKLSAgICAgCWNhc2UgMjk6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMGRfMjsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDMwOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTBlXzI7ICAgIGJyZWFrOwotICAgICAJY2FzZSAzMTogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwZl8yOyAgICBicmVhazsKLQljYXNlIDMyOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZU5TXzE7ICAgIGJyZWFrOyAgICAvKiBwYXNzIDE6MSAqLwotCWNhc2UgMzM6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlTlNfMjsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDUwOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX0NIVFZVTlRTQ0Rlc0RhdGE7IGJyZWFrOyAgICAvKiBUViAqLwotICAgICAJY2FzZSA1MTogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19DSFRWT05UU0NEZXNEYXRhOyBicmVhazsKLSAgICAgCWNhc2UgNTI6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfQ0hUVlVQQUxEZXNEYXRhOyAgYnJlYWs7Ci0gICAgIAljYXNlIDUzOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX0NIVFZPUEFMRGVzRGF0YTsgIGJyZWFrOwotCWRlZmF1bHQ6IHJldHVybjsKKwlpZigoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpICYmICghKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTSkpKSB7CisJICAgaWYoUmVzSW5kZXggPD0gMykgU2lTX1ByLT5TaVNfTENESERFUyA9IDI1NjsKKwl9CisKKyAgICAgfSBlbHNlIGlmKChQYW5lbERlc1B0ciA9IFNpU19HZXRMVkRTRGVzUHRyKFNpU19QcikpKSB7CisKKwlTaVNfUHItPlNpU19MQ0RIREVTID0gKFBhbmVsRGVzUHRyK1Jlc0luZGV4KS0+TENESERFUzsKKwlTaVNfUHItPlNpU19MQ0RWREVTID0gKFBhbmVsRGVzUHRyK1Jlc0luZGV4KS0+TENEVkRFUzsKKworICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKKworCWlmKFNpU19Qci0+U2lTX1ZHQUhERSAhPSBTaVNfUHItPlBhbmVsWFJlcykgeworCSAgIFNpU19Qci0+U2lTX0xDREhERVMgPSBTaVNfUHItPlNpU19IVCAtICgoU2lTX1ByLT5QYW5lbFhSZXMgLSBTaVNfUHItPlNpU19WR0FIREUpIC8gMik7CisJfQorCWlmKFNpU19Qci0+U2lTX1ZHQVZERSAhPSBTaVNfUHItPlBhbmVsWVJlcykgeworCSAgIFNpU19Qci0+U2lTX0xDRFZERVMgPSBTaVNfUHItPlNpU19WVCAtICgoU2lTX1ByLT5QYW5lbFlSZXMgLSBTaVNfUHItPlNpU19WR0FWREUpIC8gMik7CisJfSBlbHNlIHsKKwkgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkgICAgICBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUIC0gMTsKKwkgICB9IGVsc2UgeworCSAgICAgIHN3aXRjaChTaVNfUHItPlNpU19MQ0RSZXNJbmZvKSB7CisJICAgICAgY2FzZSBQYW5lbF84MDB4NjAwOgorCSAgICAgIGNhc2UgUGFuZWxfMTAyNHg3Njg6CisJICAgICAgY2FzZSBQYW5lbF8xMjgweDEwMjQ6CisJCSBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUOworCQkgYnJlYWs7CisJICAgICAgY2FzZSBQYW5lbF8xNDAweDEwNTA6CisJCSBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUIC0gMTsKKwkJIGJyZWFrOworCSAgICAgIH0KKwkgICB9CisJfQorCisgICAgIH0gZWxzZSB7CisKKyAgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CisjaWZkZWYgU0lTMzAwCisJICAgc3dpdGNoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8pIHsKKwkgICBjYXNlIFBhbmVsXzgwMHg2MDA6CisJICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IFNpU19Qci0+UGFuZWxZUmVzKSB7CisJCSBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUIC0gMTsKKwkgICAgICB9IGVsc2UgeworCQkgU2lTX1ByLT5TaVNfTENESERFUyA9IFNpU19Qci0+UGFuZWxIVCArIDM7CisJCSBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUOworCQkgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQwMCkgU2lTX1ByLT5TaVNfTENEVkRFUyAtPSAyOworCQkgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfTENEVkRFUyAtPSA0OworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICBjYXNlIFBhbmVsXzEwMjR4NzY4OgorCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSBTaVNfUHItPlBhbmVsWVJlcykgeworCQkgU2lTX1ByLT5TaVNfTENEVkRFUyA9IFNpU19Qci0+UGFuZWxWVCAtIDE7CisJICAgICAgfSBlbHNlIHsKKwkJIFNpU19Qci0+U2lTX0xDREhERVMgPSBTaVNfUHItPlBhbmVsSFQgLSAxOworCQkgaWYoU2lTX1ByLT5TaVNfVkdBVkRFIDw9IDQwMCkgU2lTX1ByLT5TaVNfTENEVkRFUyA9IFNpU19Qci0+UGFuZWxWVCAtIDg7CisJCSBpZihTaVNfUHItPlNpU19WR0FWREUgPD0gMzUwKSBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUIC0gMTI7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgIGNhc2UgUGFuZWxfMTAyNHg2MDA6CisJICAgZGVmYXVsdDoKKwkgICAgICBpZiggKFNpU19Qci0+U2lTX1ZHQUhERSA9PSBTaVNfUHItPlBhbmVsWFJlcykgJiYKKwkJICAoU2lTX1ByLT5TaVNfVkdBVkRFID09IFNpU19Qci0+UGFuZWxZUmVzKSApIHsKKwkJIFNpU19Qci0+U2lTX0xDRFZERVMgPSBTaVNfUHItPlBhbmVsVlQgLSAxOworCSAgICAgIH0gZWxzZSB7CisJCSBTaVNfUHItPlNpU19MQ0RIREVTID0gU2lTX1ByLT5QYW5lbEhUIC0gMTsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgfQorCisJICAgc3dpdGNoKFNpU19Qci0+U2lTX0xDRFR5cGVJbmZvKSB7CisJICAgY2FzZSAxOgorCSAgICAgIFNpU19Qci0+U2lTX0xDREhERVMgPSBTaVNfUHItPlNpU19MQ0RWREVTID0gMDsKKwkgICAgICBicmVhazsKKwkgICBjYXNlIDM6IC8qIDY0MHg0ODAgb25seT8gKi8KKwkgICAgICBTaVNfUHItPlNpU19MQ0RIREVTID0gODsKKwkgICAgICBpZiAgICAgKFNpU19Qci0+U2lTX1ZHQVZERSA+PSA0ODApIFNpU19Qci0+U2lTX0xDRFZERVMgPSA1MTI7CisJICAgICAgZWxzZSBpZihTaVNfUHItPlNpU19WR0FWREUgPj0gNDAwKSBTaVNfUHItPlNpU19MQ0RWREVTID0gNDM2OworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID49IDM1MCkgU2lTX1ByLT5TaVNfTENEVkRFUyA9IDQ0MDsKKwkgICAgICBicmVhazsKKwkgICB9CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBTSVMzMTVICisJICAgc3dpdGNoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8pIHsKKwkgICBjYXNlIFBhbmVsXzEwMjR4NzY4OgorCSAgIGNhc2UgUGFuZWxfMTI4MHgxMDI0OgorCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSBTaVNfUHItPlBhbmVsWVJlcykgeworCSAgICAgICAgIFNpU19Qci0+U2lTX0xDRFZERVMgPSBTaVNfUHItPlBhbmVsVlQgLSAxOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICBjYXNlIFBhbmVsXzMyMHgyNDBfMToKKwkgICBjYXNlIFBhbmVsXzMyMHgyNDBfMjoKKwkgICBjYXNlIFBhbmVsXzMyMHgyNDBfMzoKKwkgICAgICBTaVNfUHItPlNpU19MQ0RWREVTID0gNTI0OworCSAgICAgIGJyZWFrOworCSAgIH0KKyNlbmRpZgorCX0KICAgICAgfQogCi0gICAgIFNpU19Qci0+U2lTX0xDREhERVMgPSAoUGFuZWxEZXNQdHIrUmVzSW5kZXgpLT5MQ0RIREVTOwotICAgICBTaVNfUHItPlNpU19MQ0RWREVTID0gKFBhbmVsRGVzUHRyK1Jlc0luZGV4KS0+TENEVkRFUzsKLQogICAgICBpZigoTW9kZU5vIDw9IDB4MTMpICYmIChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkpIHsKLSAgICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOwotICAgICAgICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKKwltb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7CisJaWYoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7CiAJICAgaWYoIShtb2RlZmxhZyAmIEhhbGZEQ0xLKSkgU2lTX1ByLT5TaVNfTENESERFUyA9IDYzMjsKLSAgICAgICAgfSBlbHNlIGlmKCEoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpKSB7Ci0gICAgICAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTI4MHgxMDI0KSB7Ci0gICAgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPj0gUGFuZWxfMTAyNHg3NjgpIHsKLQkgICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisJfSBlbHNlIGlmKCEoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpKSB7CisJICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAhPSBQYW5lbF8xMjgweDEwMjQpIHsKKwkgICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID49IFBhbmVsXzEwMjR4NzY4KSB7CisJICAgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CiAJICAgICAgICAgICAgaWYoIShtb2RlZmxhZyAmIEhhbGZEQ0xLKSkgU2lTX1ByLT5TaVNfTENESERFUyA9IDMyMDsKIAkgICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpICBTaVNfUHItPlNpU19MQ0RIREVTID0gNDgwOwotICAgICAgICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE0MDB4MTA1MCkgU2lTX1ByLT5TaVNfTENESERFUyA9IDgwNDsKKyNpZmRlZiBTSVMzMTVICisJCSAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEwMjR4NzY4KSAgU2lTX1ByLT5TaVNfTENESERFUyA9IDQ4MDsKKwkJICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSBTaVNfUHItPlNpU19MQ0RIREVTID0gODA0OwogCQkgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNjAweDEyMDApIFNpU19Qci0+U2lTX0xDREhERVMgPSA3MDQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCEobW9kZWZsYWcgJiBIYWxmRENMSykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfTENESERFUyA9IDMyMDsKLQkgICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE0MDB4MTA1MCkgU2lTX1ByLT5TaVNfTENESERFUyA9IDYzMjsKKwkJICAgIGlmKCEobW9kZWZsYWcgJiBIYWxmRENMSykpIHsKKwkJICAgICAgIFNpU19Qci0+U2lTX0xDREhERVMgPSAzMjA7CisJCSAgICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE0MDB4MTA1MCkgU2lTX1ByLT5TaVNfTENESERFUyA9IDYzMjsKIAkJICAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTYwMHgxMjAwKSBTaVNfUHItPlNpU19MQ0RIREVTID0gNTQyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgCSAgICB9CisjZW5kaWYKKwkJIH0KKwkgICAgICB9CisJICAgfQorCX0KICAgICAgfQogICB9CiB9CkBAIC0zODMyLDU0ICszODY5LDkwIEBACiAvKiAgICAgICAgICAgRElTQUJMRSBWSURFTyBCUklER0UgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIFNJUzMxNUgKK3N0YXRpYyBpbnQKK1NpU19IYW5kbGVQV0Qoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCit7CisgICBpbnQgcmV0ID0gMDsKKyNpZmRlZiBTRVRfUFdECisgICB1bnNpZ25lZCBjaGFyICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIHNob3J0IHJvbXB0ciA9IEdldExDRFN0cnVjdFB0cjY2MV8yKFNpU19Qcik7CisgICB1bnNpZ25lZCBjaGFyICBkcml2ZXJtb2RlID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzEpICYgMHg0MDsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXA7CisKKyAgIGlmKCAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTUFdEKSAmJgorICAgICAgIChyb21wdHIpCQkJCSYmCisgICAgICAgKFNpU19Qci0+U2lTX1BXRE9mZnNldCkgKSB7CisgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDJiLFJPTUFkZHJbcm9tcHRyICsgU2lTX1ByLT5TaVNfUFdET2Zmc2V0ICsgMF0pOworICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyYyxST01BZGRyW3JvbXB0ciArIFNpU19Qci0+U2lTX1BXRE9mZnNldCArIDFdKTsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MmQsUk9NQWRkcltyb21wdHIgKyBTaVNfUHItPlNpU19QV0RPZmZzZXQgKyAyXSk7CisgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDJlLFJPTUFkZHJbcm9tcHRyICsgU2lTX1ByLT5TaVNfUFdET2Zmc2V0ICsgM10pOworICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyZixST01BZGRyW3JvbXB0ciArIFNpU19Qci0+U2lTX1BXRE9mZnNldCArIDRdKTsKKyAgICAgIHRlbXAgPSAweDAwOworICAgICAgaWYoKFJPTUFkZHJbcm9tcHRyICsgMl0gJiAoMHgwNiA8PCAxKSkgJiYgIWRyaXZlcm1vZGUpIHsKKyAgICAgICAgIHRlbXAgPSAweDgwOworCSByZXQgPSAxOworICAgICAgfQorICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI3LDB4N2YsdGVtcCk7CisjaWZkZWYgU0lTX1hPUkdfWEY4NgorI2lmZGVmIFRXREVCVUcKKyAgICAgIHhmODZEcnZNc2coMCwgMCwgIlNldHRpbmcgUFdEICV4XG4iLCB0ZW1wKTsKKyNlbmRpZgorI2VuZGlmCisgICB9CisjZW5kaWYKKyAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKwogLyogTkVWRVIgdXNlIGFueSB2YXJpYWJsZXMgKFZCSW5mbyksIHRoaXMgd2lsbCBiZSBjYWxsZWQKICAqIGZyb20gb3V0c2lkZSB0aGUgY29udGV4dCBvZiBtb2Rlc3dpdGNoIQogICogTVVTVCBjYWxsIGdldFZCVHlwZSBiZWZvcmUgY2FsbGluZyB0aGlzCiAgKi8KIHZvaWQKLVNpU19EaXNhYmxlQnJpZGdlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfRGlzYWJsZUJyaWRnZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICNpZmRlZiBTSVMzMTVICi0gIFVTSE9SVCB0ZW1wYWgscHVzaGF4PTAsbW9kZW51bTsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcGFoLCBwdXNoYXg9MCwgbW9kZW51bTsKICNlbmRpZgotICBVU0hPUlQgdGVtcD0wOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wPTA7CiAKICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsgICAvKiA9PT09PSBGb3IgMzB4Qi9MViA9PT09PSAqLworICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsJCS8qID09PT09IEZvciAzMHhCL0MvTFYgPT09PT0gKi8KIAotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisJaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CiAKICNpZmRlZiBTSVMzMDAJICAgLyogMzAwIHNlcmllcyAqLwogCi0JICAgaWYoIShTaVNfQ1IzNkJJT1NXb3JkMjNiKFNpU19QcixId0luZm8pKSkgewotCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKLQkgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4RkUpOworCSAgIGlmKCEoU2lTX0NSMzZCSU9TV29yZDIzYihTaVNfUHIpKSkgeworCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKKwkJIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhGRSk7CiAJICAgICAgfSBlbHNlIHsKLQkJIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLEh3SW5mbywweEY3LDB4MDgpOworCQkgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGNywweDA4KTsKIAkgICAgICB9Ci0JICAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDMpOworCSAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMyk7CiAJICAgfQogCSAgIGlmKFNpU19JczMwMUIoU2lTX1ByKSkgewogCSAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MWYsMHgzZik7CiAJICAgICAgU2lTX1Nob3J0RGVsYXkoU2lTX1ByLDEpOwotICAgICAgICAgICB9CisJICAgfQogCSAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDAsMHhERik7CiAJICAgU2lTX0Rpc3BsYXlPZmYoU2lTX1ByKTsKIAkgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgzMiwweERGKTsKIAkgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweERGKTsKLQkgICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIsSHdJbmZvKTsKLQkgICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpKSB7CisJICAgU2lTX1VuTG9ja0NSVDIoU2lTX1ByKTsKKwkgICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpKSB7CiAJICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4ODApOwogCSAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMiwweDQwKTsKIAkgICB9Ci0JICAgaWYoICghKFNpU19DUlQySXNMQ0QoU2lTX1ByLCBId0luZm8pKSkgfHwKLQkgICAgICAgKCEoU2lTX0NSMzZCSU9TV29yZDIzZChTaVNfUHIsIEh3SW5mbykpKSApIHsKLQkgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMik7Ci0JICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgewotICAgICAgICAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4RkQpOworCSAgIGlmKCAoIShTaVNfQ1JUMklzTENEKFNpU19QcikpKSB8fAorCSAgICAgICAoIShTaVNfQ1IzNkJJT1NXb3JkMjNkKFNpU19QcikpKSApIHsKKwkgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDIpOworCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKKwkgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4RkQpOwogCSAgICAgIH0gZWxzZSB7Ci0JCSBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGQiwweDA0KTsKKwkJIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLDB4RkIsMHgwNCk7CiAJICAgICAgfQogCSAgIH0KIApAQCAtMzg4OSwxMzAgKzM5NjIsMTI3IEBACiAKICNpZmRlZiBTSVMzMTVICSAgIC8qIDMxNSBzZXJpZXMgKi8KIAorCSAgIGludCBkaWRwd2QgPSAwOwogCSAgIEJPT0xFQU4gY3VzdG9tMSA9ICgoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ09NUEFRMTI4MCkgfHwKIAkgICAgICAgICAgICAgICAgICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0NMRVZPMTQwMCkpID8gVFJVRSA6IEZBTFNFOwogCiAJICAgbW9kZW51bSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM0KSAmIDB4N2Y7CiAKLSAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgeworCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKIAogI2lmZGVmIFNFVF9FTUkKLQkgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYpKSB7CisJICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRU1JKSB7CiAJCSBpZihTaVNfUHItPlNpU19DdXN0b21UICE9IENVVF9DTEVWTzE0MDApIHsKLQkgICAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDMwLDB4MGMpOworCQkgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgzMCwweDBjKTsKIAkJIH0KIAkgICAgICB9CiAjZW5kaWYKLQkgICAgICBpZiggKG1vZGVudW0gPD0gMHgxMykgICAgICAgICAgICAgICAgICB8fAotCQkgIChTaVNfSXNWQU1vZGUoU2lTX1ByLEh3SW5mbykpICAgICAgfHwKLQkJICAoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpICkgewotCSAgICAgCSBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4RkUpOwotCQkgaWYoY3VzdG9tMSkgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDMpOworCisJICAgICAgZGlkcHdkID0gU2lTX0hhbmRsZVBXRChTaVNfUHIpOworCisJICAgICAgaWYoIChtb2RlbnVtIDw9IDB4MTMpICAgICAgICAgICB8fAorCQkgIChTaVNfSXNWQU1vZGUoU2lTX1ByKSkgICAgICB8fAorCQkgICghKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpKSApIHsKKwkJIGlmKCFkaWRwd2QpIHsKKwkJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhmZSk7CisJCSAgICBpZihjdXN0b20xKSBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDMpOworCQkgfSBlbHNlIHsKKwkJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhmYyk7CisJCSB9CiAJICAgICAgfQogCiAJICAgICAgaWYoIWN1c3RvbTEpIHsKIAkJIFNpU19EREMyRGVsYXkoU2lTX1ByLDB4ZmYwMCk7CiAJCSBTaVNfRERDMkRlbGF5KFNpU19QciwweGUwMDApOwotCSAgICAgICAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzYsMHgwMCk7Ci0gICAgICAgICAgICAgICAgIHB1c2hheCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA2KTsKKwkJIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzYsMHgwMCk7CisJCSBwdXNoYXggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNik7CiAJCSBpZihJU19TSVM3NDApIHsKIAkJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDA2LDB4RTMpOwogCQkgfQotCSAgICAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCAzKTsKKwkgICAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDMpOwogCSAgICAgIH0KIAotICAgICAgICAgICB9Ci0KLQkgICBpZighKFNpU19Jc05vdE02NTBvckxhdGVyKFNpU19QciwgSHdJbmZvKSkpIHsKLQkgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zNDApIHsKLQkgICAgICAgICB0ZW1wYWggPSAweGVmOwotCSAgICAgICAgIGlmKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkgdGVtcGFoID0gMHhmNzsKLQkgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDRjLHRlbXBhaCk7Ci0JICAgICAgfQogCSAgIH0KIAotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKKwkgICBpZighKFNpU19Jc05vdE02NTBvckxhdGVyKFNpU19QcikpKSB7CisJICAgICAgLyogaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zNDApIHsqLworCQkgdGVtcGFoID0gMHhlZjsKKwkJIGlmKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSB0ZW1wYWggPSAweGY3OworCQkgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHg0Yyx0ZW1wYWgpOworCSAgICAgIC8qfSovCisJICAgfQorCisJICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewogCSAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MUYsfjB4MTApOwogCSAgIH0KIAogCSAgIHRlbXBhaCA9IDB4M2Y7Ci0JICAgaWYoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByLEh3SW5mbykpIHsKKwkgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIpKSB7CiAJICAgICAgdGVtcGFoID0gMHg3ZjsKLQkgICAgICBpZighKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkpIHRlbXBhaCA9IDB4YmY7CisJICAgICAgaWYoIShTaVNfSXNWQU1vZGUoU2lTX1ByKSkpIHRlbXBhaCA9IDB4YmY7CiAJICAgfQogCSAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MUYsdGVtcGFoKTsKIAotICAgICAgICAgICBpZigoU2lTX0lzVkFNb2RlKFNpU19QcixId0luZm8pKSB8fAotCSAgICAgICgoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgJiYgKG1vZGVudW0gPD0gMHgxMykpKSB7CisJICAgaWYoKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSB8fAorCSAgICAgICgoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgJiYgKG1vZGVudW0gPD0gMHgxMykpKSB7CiAKIAkgICAgICBTaVNfRGlzcGxheU9mZihTaVNfUHIpOwotCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKLQkJIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCAyKTsKKwkgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSB7CisJCSBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDIpOwogCSAgICAgIH0KIAkgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgzMiwweERGKTsKIAkgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFFLDB4REYpOwogCiAJICAgfQogCi0JICAgaWYoKCEoU2lTX0lzVkFNb2RlKFNpU19QcixId0luZm8pKSkgfHwKLQkgICAgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpICYmIChtb2RlbnVtIDw9IDB4MTMpKSkgeworCSAgIGlmKCghKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSkgfHwKKwkgICAgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpICYmIChtb2RlbnVtIDw9IDB4MTMpKSkgewogCi0JICAgICAgaWYoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpIHsKKwkgICAgICBpZighKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpKSB7CiAJCSBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAwLDB4ZGYpOwogCQkgU2lTX0Rpc3BsYXlPZmYoU2lTX1ByKTsKIAkgICAgICB9CiAJICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4ODApOwogCi0JICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgewotCQkgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDIpOworCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKKwkJIFNpU19QYW5lbERlbGF5KFNpU19QciwgMik7CiAJICAgICAgfQogCiAJICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MzIsMHhERik7CiAJICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDApOwotICAgICAgICAgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDAsMHgxMCk7CisJICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4MTApOwogCSAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4REYpOwogCSAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDAsdGVtcCk7CiAKIAkgICB9CiAKLQkgICBpZihTaVNfSXNOb3RNNjUwb3JMYXRlcihTaVNfUHIsSHdJbmZvKSkgeworCSAgIGlmKFNpU19Jc05vdE02NTBvckxhdGVyKFNpU19QcikpIHsKIAkgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJlLDB4N2YpOwogCSAgIH0KIAotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKKwkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSB7CisKKwkgICAgICBpZiggKCEoU2lTX0lzVkFNb2RlKFNpU19QcikpKSAgJiYKKwkJICAoIShTaVNfQ1JUMklzTENEKFNpU19QcikpKSAmJgorCQkgICghKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpKSApIHsKKworCQkgaWYoY3VzdG9tMSkgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAyKTsKKwkJIGlmKCFkaWRwd2QpIHsKKwkJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhGRCk7CisJCSB9CisJCSBpZihjdXN0b20xKSBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDQpOworCSAgICAgIH0KIAogCSAgICAgIGlmKCFjdXN0b20xKSB7Ci0KLQkgICAgICAgICBpZighKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkpIHsKLQkgICAgICAgICAgICBpZighKFNpU19DUlQySXNMQ0QoU2lTX1ByLEh3SW5mbykpKSB7Ci0JICAgICAgICAgICAgICAgaWYoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpIHsKLQkJICAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhGRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgIH0KLQotCSAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA2LHB1c2hheCk7Ci0KLQkJIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKLQkgICAgICAgICAgICBpZihTaVNfSXNWQW9yTENEKFNpU19QciwgSHdJbmZvKSkgewotCQkgICAgICAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgSHdJbmZvLCAzLCAyMCk7Ci0JCSAgICB9Ci0JICAgICAgICAgfQotCi0JICAgICAgfSBlbHNlIHsKLQotCQkgaWYoKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkgfHwKLQkJICAgICghKFNpU19Jc0R1YWxFZGdlKFNpU19QcixId0luZm8pKSkpIHsKLQkJICAgIGlmKCghKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QciwgSHdJbmZvKSkpIHx8Ci0JCSAgICAgICAoIShTaVNfQ1JUMklzTENEKFNpU19QciwgSHdJbmZvKSkpKSB7Ci0JCSAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMik7Ci0JICAgICAJICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhGRCk7Ci0JCSAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgNCk7CisJCSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNixwdXNoYXgpOworCQkgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRU1JKSB7CisJCSAgICBpZihTaVNfSXNWQW9yTENEKFNpU19QcikpIHsKKwkJICAgICAgIFNpU19QYW5lbERlbGF5TG9vcChTaVNfUHIsIDMsIDIwKTsKIAkJICAgIH0KIAkJIH0KLQogCSAgICAgIH0KLSAgICAgICAgICAgfQorCisJICAgfQogCiAjZW5kaWYgLyogU0lTMzE1SCAqLwogCkBAIC00MDIwLDM2ICs0MDkwLDM2IEBACiAKICAgICAgfSBlbHNlIHsgICAgIC8qID09PT09PT09PT09PSBGb3IgMzAxID09PT09PT09PT09PT09PT0gKi8KIAotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgICAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogI2lmZGVmIFNJUzMwMAotICAgICAgICAgICBpZighKFNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByLEh3SW5mbykpKSB7Ci0JICAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RjcsMHgwOCk7Ci0JICAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDMpOworCSAgIGlmKCEoU2lTX0NSMzZCSU9TV29yZDIzYihTaVNfUHIpKSkgeworCSAgICAgIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLDB4RjcsMHgwOCk7CisJICAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAzKTsKIAkgICB9CiAjZW5kaWYKIAl9CiAKLSAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwMCwweERGKTsgICAgICAgICAgIC8qIGRpc2FibGUgVkIgKi8KLSAgICAgICAgU2lTX0Rpc3BsYXlPZmYoU2lTX1ByKTsKKwlTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAwLDB4REYpOyAgICAgICAgICAgLyogZGlzYWJsZSBWQiAqLworCVNpU19EaXNwbGF5T2ZmKFNpU19Qcik7CiAKLSAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4ODApOworCWlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKwkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDAsMHg4MCk7CiAJfQogCi0gICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4REYpOyAgICAgICAgICAgICAgICAvKiBkaXNhYmxlIGxvY2sgbW9kZSAqLworCVNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4REYpOyAgICAgICAgICAgICAgICAvKiBkaXNhYmxlIGxvY2sgbW9kZSAqLwogCi0JaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKTsKLSAgICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCwweDEwKTsKKwlpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisJICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKTsKKwkgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4MTApOwogCSAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4MjApOwogCSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLHRlbXApOwogCX0gZWxzZSB7CiAjaWZkZWYgU0lTMzAwCi0gICAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweERGKTsgICAgICAgICAgICAvKiBkaXNhYmxlIENSVDIgKi8KLQkgICAgaWYoICghKFNpU19DUlQySXNMQ0QoU2lTX1ByLCBId0luZm8pKSkgfHwKLQkgICAgICAgICghKFNpU19DUjM2QklPU1dvcmQyM2QoU2lTX1ByLEh3SW5mbykpKSApIHsKLQkJU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDIpOwotCQlTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGQiwweDA0KTsKKwkgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MUUsMHhERik7ICAgICAgICAgICAgLyogZGlzYWJsZSBDUlQyICovCisJICAgIGlmKCAoIShTaVNfQ1JUMklzTENEKFNpU19QcikpKSB8fAorCQkoIShTaVNfQ1IzNkJJT1NXb3JkMjNkKFNpU19QcikpKSApIHsKKwkJU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAyKTsKKwkJU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGQiwweDA0KTsKIAkgICAgfQogI2VuZGlmCiAJfQpAQCAtNDA1OCwzNCArNDEyOCwzNCBAQAogCiAgIH0gZWxzZSB7ICAgICAvKiA9PT09PT09PT09PT0gRm9yIExWRFMgPT09PT09PT09PT09PSovCiAKLSAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CiAKICNpZmRlZiBTSVMzMDAJLyogMzAwIHNlcmllcyAqLwogCiAJaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAxKSB7Ci0JICAgU2lTX1NldENINzAweChTaVNfUHIsMHgwOTBFKTsKKwkgICBTaVNfU2V0Q0g3MDB4KFNpU19QciwweDBFLDB4MDkpOwogCX0KIAotCWlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183MzApIHsKKwlpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApIHsKIAkgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDExKSAmIDB4MDgpKSB7Ci0JICAgICAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByLEh3SW5mbyk7CisJICAgICAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByKTsKIAkgICB9Ci0JICAgaWYoIShTaVNfQ1IzNkJJT1NXb3JkMjNiKFNpU19QcixId0luZm8pKSkgewotCSAgICAgIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLEh3SW5mbywweEY3LDB4MDgpOwotCSAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCAzKTsKKwkgICBpZighKFNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByKSkpIHsKKwkgICAgICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QciwweEY3LDB4MDgpOworCSAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMyk7CiAJICAgfQogCX0gZWxzZSB7CiAJICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxMSkgJiAweDA4KSkgewogCSAgICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTMpICYgMHg0MCkpIHsKLSAgCSAgICAgICAgIGlmKCEoU2lTX0NSMzZCSU9TV29yZDIzYihTaVNfUHIsSHdJbmZvKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByLEh3SW5mbyk7CisJCSBpZighKFNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByKSkpIHsKKwkJICAgIFNpU19XYWl0VkJSZXRyYWNlKFNpU19Qcik7CiAJCSAgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA2KSAmIDB4MWMpKSB7CiAJCSAgICAgICBTaVNfRGlzcGxheU9mZihTaVNfUHIpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGNywweDA4KTsKLQkgICAgICAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMyk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQorCQkgICAgfQorCQkgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGNywweDA4KTsKKwkJICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMyk7CisJCSB9CisJICAgICAgfQogCSAgIH0KIAl9CiAKQEAgLTQwOTQsMTQgKzQxNjQsMTQgQEAKIAlTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgzMiwweERGKTsKIAogCVNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4REYpOwotCVNpU19VbkxvY2tDUlQyKFNpU19QcixId0luZm8pOworCVNpU19VbkxvY2tDUlQyKFNpU19Qcik7CiAJU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4ODApOwogCVNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMiwweDQwKTsKIAotCWlmKCAoIShTaVNfQ1JUMklzTENEKFNpU19QciwgSHdJbmZvKSkpIHx8Ci0JICAgICghKFNpU19DUjM2QklPU1dvcmQyM2QoU2lTX1ByLEh3SW5mbykpKSApIHsKLQkgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMik7Ci0JICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RkIsMHgwNCk7CisJaWYoICghKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkpIHx8CisJICAgICghKFNpU19DUjM2QklPU1dvcmQyM2QoU2lTX1ByKSkpICkgeworCSAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMik7CisJICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGQiwweDA0KTsKIAl9CiAKICNlbmRpZiAgLyogU0lTMzAwICovCkBAIC00MTEwLDExMyArNDE4MCwxMTMgQEAKIAogI2lmZGVmIFNJUzMxNUgJLyogMzE1IHNlcmllcyAqLwogCi0gICAgICAgIGlmKCEoU2lTX0lzTm90TTY1MG9yTGF0ZXIoU2lTX1ByLEh3SW5mbykpKSB7Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzQwKSB7Ci0gICAgICAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4NGMsfjB4MTgpOwotCSAgIH0KLSAgICAgICAgfQorCWlmKCEoU2lTX0lzTm90TTY1MG9yTGF0ZXIoU2lTX1ByKSkpIHsKKwkgICAvKmlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzQwKSB7ICovIC8qIFhHSSBuZWVkcyB0aGlzICovCisJICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHg0Yyx+MHgxOCk7CisJICAgLyogfSAqLworCX0KIAogCWlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgewogCi0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgeworCSAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgewogCSAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDYxKTsKIAkgICAgICBpZih0ZW1wIDwgMSkgewotCSAgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4YWM3Nik7Ci0JICAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwMDY2KTsKKwkJIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzYsMHhhYyk7CisJCSBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDY2LDB4MDApOwogCSAgICAgIH0KIAotCSAgICAgIGlmKCAoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpIHx8Ci0JICAgICAgICAgIChTaVNfSXNUVk9yWVBiUHJPclNjYXJ0KFNpU19QcixId0luZm8pKSApIHsKLQkgIAkgU2lTX1NldENINzAxeChTaVNfUHIsMHgzZTQ5KTsKKwkgICAgICBpZiggKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkpIHx8CisJCSAgKFNpU19Jc1RWT3JZUGJQck9yU2NhcnQoU2lTX1ByKSkgKSB7CisJCSBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ5LDB4M2UpOwogCSAgICAgIH0KIAkgICB9CiAKLQkgICBpZiggKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByLEh3SW5mbykpKSB8fAotCSAgICAgICAoU2lTX0lzVkFNb2RlKFNpU19QcixId0luZm8pKSApIHsKKwkgICBpZiggKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkpIHx8CisJICAgICAgIChTaVNfSXNWQU1vZGUoU2lTX1ByKSkgKSB7CiAJICAgICAgU2lTX0Nocm9udGVsNzAxeEJMT2ZmKFNpU19Qcik7Ci0JICAgICAgU2lTX0Nocm9udGVsNzAxeE9mZihTaVNfUHIsSHdJbmZvKTsKKwkgICAgICBTaVNfQ2hyb250ZWw3MDF4T2ZmKFNpU19Qcik7CiAJICAgfQogCi0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgIT0gU0lTXzc0MCkgewotCSAgICAgIGlmKCAoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpIHx8Ci0JICAgICAgICAgIChTaVNfSXNUVk9yWVBiUHJPclNjYXJ0KFNpU19QcixId0luZm8pKSApIHsKLQkgICAJIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDE0OSk7Ci0gIAkgICAgICB9CisJICAgaWYoU2lTX1ByLT5DaGlwVHlwZSAhPSBTSVNfNzQwKSB7CisJICAgICAgaWYoICghKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpKSB8fAorCQkgIChTaVNfSXNUVk9yWVBiUHJPclNjYXJ0KFNpU19QcikpICkgeworCQkgU2lTX1NldENINzAxeChTaVNfUHIsMHg0OSwweDAxKTsKKwkgICAgICB9CiAJICAgfQogCiAJfQogCiAJaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAwKSB7Ci0JICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RjcsMHgwOCk7Ci0JICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDMpOworCSAgIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLDB4RjcsMHgwOCk7CisJICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAzKTsKIAl9CiAKIAlpZiggKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMCkgICB8fAotCSAgICAoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpIHx8Ci0JICAgICghKFNpU19Jc1RWT3JZUGJQck9yU2NhcnQoU2lTX1ByLEh3SW5mbykpKSApIHsKKwkgICAgKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkpIHx8CisJICAgICghKFNpU19Jc1RWT3JZUGJQck9yU2NhcnQoU2lTX1ByKSkpICkgewogCSAgIFNpU19EaXNwbGF5T2ZmKFNpU19Qcik7CiAJfQogCiAJaWYoIChTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDApICAgfHwKLQkgICAgKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByLEh3SW5mbykpKSB8fAotCSAgICAoIShTaVNfSXNWQU1vZGUoU2lTX1ByLEh3SW5mbykpKSApIHsKKwkgICAgKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkpIHx8CisJICAgICghKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSkgKSB7CiAJICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4ODApOwogCX0KIAotCWlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApIHsKKwlpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183NDApIHsKIAkgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJlLDB4N2YpOwogCX0KIAogCVNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4REYpOwogCiAJaWYoIChTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDApICAgfHwKLQkgICAgKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByLEh3SW5mbykpKSB8fAotCSAgICAoIShTaVNfSXNWQU1vZGUoU2lTX1ByLEh3SW5mbykpKSApIHsKKwkgICAgKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkpIHx8CisJICAgICghKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSkgKSB7CiAJICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MUUsMHhERik7CiAJfQogCiAJaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAwKSB7Ci0JICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKKwkgICBpZihTaVNfQ1JUMklzTENEKFNpU19QcikpIHsKIAkgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFlLDB4ZGYpOwotCSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU181NTApIHsKLQkgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFlLDB4YmYpOwotCSAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MWUsMHhlZik7CisJICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNTUwKSB7CisJCSBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFlLDB4YmYpOworCQkgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxZSwweGVmKTsKIAkgICAgICB9CiAJICAgfQogCX0gZWxzZSB7Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgewotCSAgICAgIGlmKFNpU19Jc0xDRE9yTENEQShTaVNfUHIsSHdJbmZvKSkgewotCSAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MWUsMHhkZik7CisJICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisJICAgICAgaWYoU2lTX0lzTENET3JMQ0RBKFNpU19QcikpIHsKKwkJIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MWUsMHhkZik7CiAJICAgICAgfQotCSAgIH0gZWxzZSBpZihTaVNfSXNWQU1vZGUoU2lTX1ByLEh3SW5mbykpIHsKKwkgICB9IGVsc2UgaWYoU2lTX0lzVkFNb2RlKFNpU19QcikpIHsKIAkgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFlLDB4ZGYpOwogCSAgIH0KIAl9CiAKIAlpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKLQkgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkgeworCSAgIGlmKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpIHsKIAkgICAgICAvKiBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEzLDB4ZmYpOyAqLwogCSAgIH0gZWxzZSB7CiAJICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxMywweGZiKTsKIAkgICB9CiAJfQogCi0JU2lTX1VuTG9ja0NSVDIoU2lTX1ByLEh3SW5mbyk7CisJU2lTX1VuTG9ja0NSVDIoU2lTX1ByKTsKIAotCWlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU181NTApIHsKKwlpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU181NTApIHsKIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEsMHg4MCk7IC8qIERpcmVjdERWRCBQQUw/Ki8KIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDIsMHg0MCk7IC8qIFZCIGNsb2NrIC8gNCA/ICovCiAJfSBlbHNlIGlmKCAoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAwKSAgIHx8Ci0JICAgICAgICAgICAoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpIHx8Ci0JCSAgICghKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkpICkgeworCQkgICAoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIpKSkgfHwKKwkJICAgKCEoU2lTX0lzVkFNb2RlKFNpU19QcikpKSApIHsKIAkgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJlLDB4ZjcpOwogCX0KIAogICAgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDApIHsKLQkgICBpZihTaVNfQ1JUMklzTENEKFNpU19QciwgSHdJbmZvKSkgewotCSAgICAgIGlmKCEoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByLEh3SW5mbykpKSB7Ci0JIAkgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDIpOwotCQkgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RkIsMHgwNCk7CisJICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIpKSB7CisJICAgICAgaWYoIShTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChTaVNfUHIpKSkgeworCQkgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAyKTsKKwkJIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLDB4RkIsMHgwNCk7CiAJICAgICAgfQogCSAgIH0KICAgICAgICAgfQpAQCAtNDIzNyw3OCArNDMwNyw4MSBAQAogICogZnJvbSBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIGEgbW9kZSBzd2l0Y2ghCiAgKiBNVVNUIGNhbGwgZ2V0VkJUeXBlIGJlZm9yZSBjYWxsaW5nIHRoaXMKICAqLwotc3RhdGljIHZvaWQKLVNpU19FbmFibGVCcmlkZ2UoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCitzdGF0aWMKKyNlbmRpZgordm9pZAorU2lTX0VuYWJsZUJyaWRnZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVVNIT1JUIHRlbXA9MCx0ZW1wYWg7CisgIHVuc2lnbmVkIHNob3J0IHRlbXA9MCwgdGVtcGFoOwogI2lmZGVmIFNJUzMxNUgKLSAgVVNIT1JUIHRlbXAxLHB1c2hheD0wOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wMSwgcHVzaGF4PTA7CiAgIEJPT0xFQU4gZGVsYXlsb25nID0gRkFMU0U7CiAjZW5kaWYKIAogICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewogCi0gICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7ICAgLyogPT09PT09IEZvciAzMDFCIGV0IGFsICA9PT09PT0gKi8KKyAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsJCS8qID09PT09PSBGb3IgMzAxQiBldCBhbCAgPT09PT09ICovCiAKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwICAgICAvKiAzMDAgc2VyaWVzICovCiAKLQkgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKLQkgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgeworCSBpZihTaVNfQ1JUMklzTENEKFNpU19QcikpIHsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewogCSAgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHgwMik7CiAJICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgewotCSAgICAgICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGQiwweDAwKTsKKwkgICAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGQiwweDAwKTsKIAkgICAgfQotCSAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAxTFYzMDJMViB8IFZCX05vTENEKSkgewotCSAgICAgICBpZighKFNpU19DUjM2QklPU1dvcmQyM2QoU2lTX1ByLCBId0luZm8pKSkgewotCSAgICAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMCk7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVNMVkRTIHwgVkJfTm9MQ0QpKSB7CisJICAgICAgIGlmKCEoU2lTX0NSMzZCSU9TV29yZDIzZChTaVNfUHIpKSkgeworCQkgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMCk7CiAJICAgICAgIH0KIAkgICAgfQogCSB9CiAKIAkgaWYoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSAmJgotCSAgICAoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpKSB7CisJICAgIChTaVNfQ1JUMklzTENEKFNpU19QcikpKSB7CiAKIAkgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweDIwKTsgICAJCS8qIEVuYWJsZSBDUlQyICovCi0gICAgICAgICAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7Ci0JICAgIFNpU19VbkxvY2tDUlQyKFNpU19QcixId0luZm8pOworCSAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7CisJICAgIFNpU19VbkxvY2tDUlQyKFNpU19Qcik7CiAJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDIsMHhCRik7CiAJICAgIGlmKFNpU19CcmlkZ2VJblNsYXZlbW9kZShTaVNfUHIpKSB7Ci0gICAgICAJICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEsMHgxRik7Ci0gICAgICAJICAgIH0gZWxzZSB7Ci0gICAgICAJICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMSwweDFGLDB4NDApOwotICAgICAgICAgICAgfQorCSAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4MUYpOworCSAgICB9IGVsc2UgeworCSAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEsMHgxRiwweDQwKTsKKwkgICAgfQogCSAgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDEzKSAmIDB4NDApKSB7CiAJICAgICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTYpICYgMHgxMCkpIHsKLQkJICBpZighKFNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByLEh3SW5mbykpKSB7Ci0JCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDEpOwotICAgICAgICAgICAgICAgICAgfQotCQkgIFNpU19XYWl0VkJSZXRyYWNlKFNpU19QcixId0luZm8pOwotICAgICAgICAgICAgICAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RjcsMHgwMCk7Ci0gICAgICAgICAgICAgICB9CisJCSAgaWYoIShTaVNfQ1IzNkJJT1NXb3JkMjNiKFNpU19QcikpKSB7CisJCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAxKTsKKwkJICB9CisJCSAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByKTsKKwkJICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QciwweEY3LDB4MDApOworCSAgICAgICB9CiAJICAgIH0KIAogCSB9IGVsc2UgewogCiAJICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzMikgJiAweERGOyAgICAgICAgICAgICAvKiBsb2NrIG1vZGUgKi8KLSAgICAgICAgICAgIGlmKFNpU19CcmlkZ2VJblNsYXZlbW9kZShTaVNfUHIpKSB7Ci0gICAgICAgICAgICAgICB0ZW1wYWggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMCk7Ci0gICAgICAgICAgICAgICBpZighKHRlbXBhaCAmIFNldENSVDJUb1JBTURBQykpIHRlbXAgfD0gMHgyMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDMyLHRlbXApOworCSAgICBpZihTaVNfQnJpZGdlSW5TbGF2ZW1vZGUoU2lTX1ByKSkgeworCSAgICAgICB0ZW1wYWggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMCk7CisJICAgICAgIGlmKCEodGVtcGFoICYgU2V0Q1JUMlRvUkFNREFDKSkgdGVtcCB8PSAweDIwOworCSAgICB9CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDMyLHRlbXApOwogCSAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4MjApOwogCSAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDAsMHgxRiwweDIwKTsgICAgICAgIC8qIGVuYWJsZSBWQiBwcm9jZXNzb3IgKi8KIAkgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDFGLDB4QzApOwogCSAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7Ci0JICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKLQkgICAgICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKLQkgICAgICAgICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNikgJiAweDEwKSkgewotCQkgICAgIGlmKCEoU2lTX0NSMzZCSU9TV29yZDIzYihTaVNfUHIsSHdJbmZvKSkpIHsKLQkJICAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMSk7Ci0gICAgICAgICAgICAgICAgICAgICB9CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKKwkgICAgICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIpKSB7CisJCSAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNikgJiAweDEwKSkgeworCQkgICAgIGlmKCEoU2lTX0NSMzZCSU9TV29yZDIzYihTaVNfUHIpKSkgeworCQkgICAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMSk7CisJCSAgICAgfQogCQkgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNiwweDAxKTsKLQkgCSAgfQorCQkgIH0KIAkgICAgICAgfQogCSAgICB9CiAKQEAgLTQzMjIsMzEgKzQzOTUsMzIgQEAKICNpZmRlZiBTSVMzMTVIICAgIC8qIDMxNSBzZXJpZXMgKi8KIAogI2lmZGVmIFNFVF9FTUkKLQkgVUNIQVIgICByMzA9MCwgcjMxPTAsIHIzMj0wLCByMzM9MCwgY3IzNj0wOwotCSAvKiBVU0hPUlQgIGVtaWRlbGF5PTA7ICovCisJIHVuc2lnbmVkIGNoYXIgICByMzA9MCwgcjMxPTAsIHIzMj0wLCByMzM9MCwgY3IzNj0wOworCSBpbnQgZGlkcHdkID0gMDsKKwkgLyogdW5zaWduZWQgc2hvcnQgIGVtaWRlbGF5PTA7ICovCiAjZW5kaWYKIAotCSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFMVjMwMkxWKSB7CisJIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKIAkgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxZiwweGVmKTsKICNpZmRlZiBTRVRfRU1JCi0JICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRU1JKSB7CiAJICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgwYyk7CiAJICAgIH0KICNlbmRpZgogCSB9CiAKLSAgICAgICAgIGlmKCEoU2lTX0lzTm90TTY1MG9yTGF0ZXIoU2lTX1ByLCBId0luZm8pKSkgewotCSAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zNDApIHsKKwkgaWYoIShTaVNfSXNOb3RNNjUwb3JMYXRlcihTaVNfUHIpKSkgeworCSAgICAvKmlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzQwKSB7ICovCiAJICAgICAgIHRlbXBhaCA9IDB4MTA7Ci0JICAgICAgIGlmKFNpU19MQ0RBRW5hYmxlZChTaVNfUHIsIEh3SW5mbykpIHsKLQkgICAgICAgICAgaWYoU2lTX1RWRW5hYmxlZChTaVNfUHIsIEh3SW5mbykpIHRlbXBhaCA9IDB4MTg7Ci0JICAgICAgICAgIGVsc2UgCQkJICAgICAgICAgICAgdGVtcGFoID0gMHgwODsKKwkgICAgICAgaWYoU2lTX0xDREFFbmFibGVkKFNpU19QcikpIHsKKwkJICBpZihTaVNfVFZFbmFibGVkKFNpU19QcikpIHRlbXBhaCA9IDB4MTg7CisJCSAgZWxzZQkJCSAgICB0ZW1wYWggPSAweDA4OwogCSAgICAgICB9CiAJICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4NGMsdGVtcGFoKTsKLQkgICAgfQorCSAgICAvKn0qLwogCSB9CiAKLQkgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgeworCSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSB7CiAKIAkgICAgU2lTX1NldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjNiwweDAwKTsKIAkgICAgU2lTX0Rpc3BsYXlPZmYoU2lTX1ByKTsKQEAgLTQzNTUsNDIgKzQ0MjksNTEgQEAKIAkgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MDYsMHhFMyk7CiAJICAgIH0KIAotCSAgICBpZihTaVNfSXNWQW9yTENEKFNpU19QciwgSHdJbmZvKSkgewotICAgICAgICAgICAgICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2KSAmIDB4MDIpKSB7Ci0JCSAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgSHdJbmZvLCAzLCAyKTsKLQkJICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHgwMik7Ci0JCSAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgSHdJbmZvLCAzLCAyKTsKLQkJICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYpKSB7Ci0JCSAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsIDB4NDUwMCk7CisJICAgIGRpZHB3ZCA9IFNpU19IYW5kbGVQV0QoU2lTX1ByKTsKKworCSAgICBpZihTaVNfSXNWQW9yTENEKFNpU19QcikpIHsKKwkgICAgICAgaWYoIWRpZHB3ZCkgeworCQkgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNikgJiAweDAyKSkgeworCQkgICAgIFNpU19QYW5lbERlbGF5TG9vcChTaVNfUHIsIDMsIDIpOworCQkgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNiwweDAyKTsKKwkJICAgICBTaVNfUGFuZWxEZWxheUxvb3AoU2lTX1ByLCAzLCAyKTsKKwkJICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNFTUkpIHsKKwkJICAgICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgMTc2NjQpOworCQkgICAgIH0KKwkJICB9CisJICAgICAgIH0gZWxzZSB7CisJCSAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgMywgMik7CisJCSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRU1JKSB7CisJCSAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsIDE3NjY0KTsKIAkJICB9CiAJICAgICAgIH0KIAkgICAgfQogCiAJICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzEpICYgMHg0MCkpIHsKLSAgICAgICAgICAgICAgIFNpU19QYW5lbERlbGF5TG9vcChTaVNfUHIsIEh3SW5mbywgMywgMTApOworCSAgICAgICBTaVNfUGFuZWxEZWxheUxvb3AoU2lTX1ByLCAzLCAxMCk7CiAJICAgICAgIGRlbGF5bG9uZyA9IFRSVUU7CiAJICAgIH0KIAogCSB9CiAKLQkgaWYoIShTaVNfSXNWQU1vZGUoU2lTX1ByLEh3SW5mbykpKSB7CisJIGlmKCEoU2lTX0lzVkFNb2RlKFNpU19QcikpKSB7CiAKLSAgICAgICAgICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzMikgJiAweERGOworCSAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MzIpICYgMHhERjsKIAkgICAgaWYoU2lTX0JyaWRnZUluU2xhdmVtb2RlKFNpU19QcikpIHsKLSAgICAgICAgICAgICAgIHRlbXBhaCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMwKTsKLSAgICAgICAgICAgICAgIGlmKCEodGVtcGFoICYgU2V0Q1JUMlRvUkFNREFDKSkgewotCQkgIGlmKCEoU2lTX0xDREFFbmFibGVkKFNpU19QciwgSHdJbmZvKSkpIHRlbXAgfD0gMHgyMDsKKwkgICAgICAgdGVtcGFoID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOworCSAgICAgICBpZighKHRlbXBhaCAmIFNldENSVDJUb1JBTURBQykpIHsKKwkJICBpZighKFNpU19MQ0RBRW5hYmxlZChTaVNfUHIpKSkgdGVtcCB8PSAweDIwOwogCSAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzMix0ZW1wKTsKKwkgICAgfQorCSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzMix0ZW1wKTsKIAogCSAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4MjApOyAgICAgICAgICAgICAgICAgICAvKiBlbmFibGUgQ1JUMiAqLwogCiAJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmUsMHg3Zik7CiAJICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZSwweDgwKTsKIAotCSAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFMVjMwMkxWKSB7Ci0JICAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCAyKTsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgeworCSAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDIpOwogCSAgICB9CiAKIAkgfSBlbHNlIHsKQEAgLTQ0MDIsMzggKzQ0ODUsNDggQEAKIAkgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAwLDB4MWYsMHgyMCk7CiAJIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZSwweDgwKTsKIAotCSB0ZW1wYWggPSAweGMwOwotCSBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIsIEh3SW5mbykpIHsKLQkgICAgdGVtcGFoID0gMHg4MDsKLQkgICAgaWYoIShTaVNfSXNWQU1vZGUoU2lTX1ByLCBId0luZm8pKSkgdGVtcGFoID0gMHg0MDsKKwkgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTUE9XRVIpIHsKKwkgICAgaWYoIChTaVNfTENEQUVuYWJsZWQoU2lTX1ByKSkgfHwKKwkgICAgICAgIChTaVNfQ1JUMklzTENEKFNpU19QcikpICkgeworCSAgICAgICAvKiBFbmFibGUgIkxWRFMgUExMIHBvd2VyIG9uIiAoZXZlbiBvbiAzMDFDKSAqLworCSAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDJhLDB4N2YpOworCSAgICAgICAvKiBFbmFibGUgIkxWRFMgRHJpdmVyIFBvd2VyIG9uIiAoZXZlbiBvbiAzMDFDKSAqLworCSAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDMwLDB4N2YpOworCSAgICB9CiAJIH0KLSAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxRix0ZW1wYWgpOwogCi0JIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKKwkgdGVtcGFoID0gMHhjMDsKKwkgaWYoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkgeworCSAgICB0ZW1wYWggPSAweDgwOworCSAgICBpZighKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSkgdGVtcGFoID0gMHg0MDsKKwkgfQorCSBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MUYsdGVtcGFoKTsKIAotCSAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMik7CisJIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKKworCSAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDIpOwogCiAJICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxZiwweDEwKTsKIAkgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJlLDB4ODApOwogCiAJICAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgIT0gQ1VUX0NMRVZPMTQwMCkgewogI2lmZGVmIFNFVF9FTUkKLQkgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMkxWIHwgVkJfU0lTMzAyRUxWKSkgewotCSAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDMwLDB4MGMpOwotCQkgIFNpU19HZW5lcmljRGVsYXkoU2lTX1ByLCAweDUwMCk7CisJICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0VNSSkgeworCQkgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgwYyk7CisJCSAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsIDIwNDgpOwogCSAgICAgICB9CiAjZW5kaWYKIAkgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI3LDB4MGMpOwogCi0JICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKKwkgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRU1JKSB7CiAjaWZkZWYgU0VUX0VNSQogCQkgIGNyMzYgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNik7CiAKIAkJICBpZihTaVNfUHItPlNpU19ST01OZXcpIHsKLQkJICAgICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0JCSAgICAgVVNIT1JUIHJvbXB0ciA9IEdldExDRFN0cnVjdFB0cjY2MV8yKFNpU19QciwgSHdJbmZvKTsKKwkJICAgICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisJCSAgICAgdW5zaWduZWQgc2hvcnQgcm9tcHRyID0gR2V0TENEU3RydWN0UHRyNjYxXzIoU2lTX1ByKTsKIAkJICAgICBpZihyb21wdHIpIHsKLQkJICAgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgyMCk7IC8qIFJlc2V0ICovCisJCQlTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgyMCk7IC8qIFJlc2V0ICovCiAJCQlTaVNfUHItPkVNSV8zMCA9IDA7CiAJCQlTaVNfUHItPkVNSV8zMSA9IFJPTUFkZHJbcm9tcHRyICsgU2lTX1ByLT5TaVNfRU1JT2Zmc2V0ICsgMF07CiAJCQlTaVNfUHItPkVNSV8zMiA9IFJPTUFkZHJbcm9tcHRyICsgU2lTX1ByLT5TaVNfRU1JT2Zmc2V0ICsgMV07CkBAIC00NTExLDIxICs0NjA0LDIxIEBACiAJCSAgaWYoIVNpU19Qci0+T3ZlcnJ1bGVFTUkpIHsKICNpZmRlZiBDT01QQUxfSEFDSwogCQkgICAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0NPTVBBTDE0MDBfMikgewotCQkgICAgICAgIGlmKChjcjM2ICYgMHgwZikgPT0gMHgwOSkgeworCQkJaWYoKGNyMzYgJiAweDBmKSA9PSAweDA5KSB7CiAJCQkgICByMzAgPSAweDYwOyByMzEgPSAweDA1OyByMzIgPSAweDYwOyByMzMgPSAweDAwOwogCQkJfQogIAkJICAgICB9CiAjZW5kaWYKICNpZmRlZiBDT01QQVFfSEFDSwogCQkgICAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0NPTVBBUTEyODApIHsKLQkJICAgICAgICBpZigoY3IzNiAmIDB4MGYpID09IDB4MDMpIHsKKwkJCWlmKChjcjM2ICYgMHgwZikgPT0gMHgwMykgewogCQkJICAgcjMwID0gMHgyMDsgcjMxID0gMHgxMjsgcjMyID0gMHhkMDsgcjMzID0gMHg2YjsKIAkJCX0KIAkJICAgICB9CiAjZW5kaWYKICNpZmRlZiBBU1VTX0hBQ0sKIAkJICAgICBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9BU1VTQTJIXzIpIHsKLQkJICAgICAgICBpZigoY3IzNiAmIDB4MGYpID09IDB4MDIpIHsKKwkJCWlmKChjcjM2ICYgMHgwZikgPT0gMHgwMikgewogCQkJICAgLyogcjMwID0gMHg2MDsgcjMxID0gMHgwNTsgcjMyID0gMHg2MDsgcjMzID0gMHgzMzsgICovICAgLyogcmV2IDIgKi8KIAkJCSAgIC8qIHIzMCA9IDB4MjA7IHIzMSA9IDB4MDU7IHIzMiA9IDB4NjA7IHIzMyA9IDB4MzM7ICAqLyAgIC8qIHJldiAzICovCiAJCQkgICAvKiByMzAgPSAweDYwOyByMzEgPSAweDBkOyByMzIgPSAweDcwOyByMzMgPSAweDQwOyAgKi8gICAvKiByZXYgNCAqLwpAQCAtNDUzMywxMSArNDYyNiwxMSBAQAogCQkJfQogCQkgICAgIH0KICNlbmRpZgotIAkJICB9CisJCSAgfQogCiAJCSAgaWYoIShTaVNfUHItPk92ZXJydWxlRU1JICYmICghcjMwKSAmJiAoIXIzMSkgJiYgKCFyMzIpICYmICghcjMzKSkpIHsKIAkJICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgyMCk7IC8qIFJlc2V0ICovCi0JCSAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsIDB4NTAwKTsKKwkJICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgMjA0OCk7CiAJCSAgfQogCQkgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzEscjMxKTsKIAkJICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDMyLHIzMik7CkBAIC00NTQ3LDM2ICs0NjQwLDQ0IEBACiAJCSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgzNCwweDEwKTsKIAogI2lmZGVmIFNFVF9FTUkKLQkJICBpZiggKFNpU19MQ0RBRW5hYmxlZChTaVNfUHIsIEh3SW5mbykpIHx8Ci0JICAgICAgICAgICAgICAoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpICkgewotCSAgICAgICAgICAgICBpZihyMzAgJiAweDQwKSB7Ci0JCSAgICAgICAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgSHdJbmZvLCAzLCA1KTsKKwkJICBpZiggKFNpU19MQ0RBRW5hYmxlZChTaVNfUHIpKSB8fAorCQkgICAgICAoU2lTX0NSVDJJc0xDRChTaVNfUHIpKSApIHsKKwkJICAgICBpZihyMzAgJiAweDQwKSB7CisJCQkvKlNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyYSwweDgwKTsqLworCQkJU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgMywgNSk7CiAJCQlpZihkZWxheWxvbmcpIHsKLQkJCSAgIFNpU19QYW5lbERlbGF5TG9vcChTaVNfUHIsIEh3SW5mbywgMywgNSk7CisJCQkgICBTaVNfUGFuZWxEZWxheUxvb3AoU2lTX1ByLCAzLCA1KTsKIAkJCSAgIGRlbGF5bG9uZyA9IEZBTFNFOwogCQkJfQotCQkJU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByLEh3SW5mbyk7CisJCQlTaVNfV2FpdFZCUmV0cmFjZShTaVNfUHIpOworCQkJU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByKTsKIAkJCWlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0FTVVNBMkhfMikgewotCQkJICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsIDB4NTAwKTsKKwkJCSAgIFNpU19HZW5lcmljRGVsYXkoU2lTX1ByLCAxMjgwKTsKIAkJCX0KLQkgICAgICAgICAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDMwLDB4NDApOyAgIC8qIEVuYWJsZSAqLwotCSAgICAgICAgICAgICB9CisJCQlTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHg0MCk7ICAgLyogRW5hYmxlICovCisJCQkvKlNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MmEsMHg3Zik7Ki8KKwkJICAgICB9CiAJCSAgfQogI2VuZGlmCiAJICAgICAgIH0KIAkgICAgfQogCi0JICAgIGlmKCEoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByLEh3SW5mbykpKSB7Ci0JICAgICAgIGlmKFNpU19Jc1ZBb3JMQ0QoU2lTX1ByLCBId0luZm8pKSB7Ci0JCSAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgSHdJbmZvLCAzLCAxMCk7CisJICAgIGlmKCEoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByKSkpIHsKKwkgICAgICAgaWYoU2lTX0lzVkFvckxDRChTaVNfUHIpKSB7CisJCSAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgMywgMTApOwogCQkgIGlmKGRlbGF5bG9uZykgewotCQkgICAgIFNpU19QYW5lbERlbGF5TG9vcChTaVNfUHIsIEh3SW5mbywgMywgMTApOworCQkgICAgIFNpU19QYW5lbERlbGF5TG9vcChTaVNfUHIsIDMsIDEwKTsKIAkJICB9Ci0gICAgICAgICAgICAgICAgICBTaVNfV2FpdFZCUmV0cmFjZShTaVNfUHIsSHdJbmZvKTsKLQkJICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYpKSB7Ci0JIAkgICAgIFNpU19HZW5lcmljRGVsYXkoU2lTX1ByLCAweDUwMCk7CisJCSAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByKTsKKwkJICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNFTUkpIHsKKwkJICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgMjA0OCk7CisJCSAgICAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByKTsKIAkJICB9Ci0JCSAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4MDEpOworCQkgIGlmKCFkaWRwd2QpIHsKKwkJICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHgwMSk7CisJCSAgfSBlbHNlIHsKKwkJICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHgwMyk7CisJCSAgfQogCSAgICAgICB9CiAJICAgIH0KIApAQCAtNDU4Niw3ICs0Njg3LDcgQEAKIAogCSB9CiAKLQkgaWYoIShTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChTaVNfUHIsSHdJbmZvKSkpIHsKKwkgaWYoIShTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChTaVNfUHIpKSkgewogCSAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4N2YpOwogCSB9CiAKQEAgLTQ1OTYsMjYgKzQ2OTcsMjYgQEAKIAogICAgIH0gZWxzZSB7CS8qID09PT09PT09PT09PSAgRm9yIDMwMSA9PT09PT09PT09PT09PT09ICovCiAKLSAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7Ci0gICAgICAgICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKLSAgICAgICAgICAgICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGQiwweDAwKTsKLQkgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCAwKTsKKyAgICAgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkgeworCSAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGQiwweDAwKTsKKwkgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMCk7CiAJICB9CiAgICAgICAgfQogCiAgICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDMyKSAmIDB4REY7ICAgICAgICAgIC8qIGxvY2sgbW9kZSAqLwogICAgICAgIGlmKFNpU19CcmlkZ2VJblNsYXZlbW9kZShTaVNfUHIpKSB7Ci0gICAgICAgICAgdGVtcGFoID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOwotICAgICAgICAgIGlmKCEodGVtcGFoICYgU2V0Q1JUMlRvUkFNREFDKSkgdGVtcCB8PSAweDIwOworCSAgdGVtcGFoID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOworCSAgaWYoISh0ZW1wYWggJiBTZXRDUlQyVG9SQU1EQUMpKSB0ZW1wIHw9IDB4MjA7CiAgICAgICAgfQogICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDMyLHRlbXApOwogCiAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweDIwKTsgICAgICAgICAgICAgICAgICAvKiBlbmFibGUgQ1JUMiAqLwogCi0gICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRSk7Ci0gICAgICAgICAgaWYoISh0ZW1wICYgMHg4MCkpIHsKLSAgICAgICAgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MkUsMHg4MCk7ICAgICAgICAgLyogQlZCRE9FTkFCTEU9MSAqLworICAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKwkgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJFKTsKKwkgIGlmKCEodGVtcCAmIDB4ODApKSB7CisJICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MkUsMHg4MCk7ICAgICAgICAgLyogQlZCRE9FTkFCTEU9MSAqLwogCSAgfQogICAgICAgIH0KIApAQCAtNDYyMywxNSArNDcyNCwxNSBAQAogCiAgICAgICAgU2lTX1ZCTG9uZ1dhaXQoU2lTX1ByKTsKICAgICAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7Ci0gICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4N2YpOworICAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKwkgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDAsMHg3Zik7CiAgICAgICAgfQogICAgICAgIFNpU19WQkxvbmdXYWl0KFNpU19Qcik7CiAKLSAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7Ci0gICAgICAgICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKLQkgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCAxKTsKLSAgICAgICAgICAgICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGNywweDAwKTsKKyAgICAgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkgeworCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAxKTsKKwkgICAgIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLDB4RjcsMHgwMCk7CiAJICB9CiAgICAgICAgfQogCkBAIC00NjM5LDQ5ICs0NzQwLDQ5IEBACiAKICAgfSBlbHNlIHsgICAvKiA9PT09PT09PT09PT09PT09PT09IEZvciBMVkRTID09PT09PT09PT09PT09PT09PSAqLwogCi0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgeworICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwICAgIC8qIDMwMCBzZXJpZXMgKi8KIAotICAgICAgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByLCBId0luZm8pKSB7Ci0gICAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgewotCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDEpOwotCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDEpOwotCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDEpOworICAgICAgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkgeworCSAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzMwKSB7CisJICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDEpOworCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAxKTsKKwkgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMSk7CiAJICB9Ci0gICAgICAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RkIsMHgwMCk7Ci0JICBpZighKFNpU19DUjM2QklPU1dvcmQyM2QoU2lTX1ByLEh3SW5mbykpKSB7Ci0JICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMCk7CisJICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QciwweEZCLDB4MDApOworCSAgaWYoIShTaVNfQ1IzNkJJT1NXb3JkMjNkKFNpU19QcikpKSB7CisJICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDApOwogCSAgfQogICAgICAgIH0KIAogICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2M0LDB4MUUsMHgyMCk7CiAgICAgICAgU2lTX0Rpc3BsYXlPbihTaVNfUHIpOwotICAgICAgIFNpU19VbkxvY2tDUlQyKFNpU19QcixId0luZm8pOworICAgICAgIFNpU19VbkxvY2tDUlQyKFNpU19Qcik7CiAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMiwweEJGKTsKICAgICAgICBpZihTaVNfQnJpZGdlSW5TbGF2ZW1vZGUoU2lTX1ByKSkgewotICAgICAgCSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMSwweDFGKTsKKwkgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEsMHgxRik7CiAgICAgICAgfSBlbHNlIHsKLSAgICAgIAkgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMSwweDFGLDB4NDApOworCSAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4MUYsMHg0MCk7CiAgICAgICAgfQogCiAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAxKSB7Ci0gICAgICAgICAgaWYoIShTaVNfQ1JUMklzTENEKFNpU19QciwgSHdJbmZvKSkpIHsKLQkgICAgIFNpU19XYWl0VkJSZXRyYWNlKFNpU19QciwgSHdJbmZvKTsKLQkgICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLDB4MEIwRSk7Ci0gICAgICAgICAgfQorCSAgaWYoIShTaVNfQ1JUMklzTENEKFNpU19QcikpKSB7CisJICAgICBTaVNfV2FpdFZCUmV0cmFjZShTaVNfUHIpOworCSAgICAgU2lTX1NldENINzAweChTaVNfUHIsMHgwRSwweDBCKTsKKwkgIH0KICAgICAgICB9CiAKLSAgICAgICBpZihTaVNfQ1JUMklzTENEKFNpU19QciwgSHdJbmZvKSkgewotICAgICAgICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTMpICYgMHg0MCkpIHsKLSAgICAgICAgICAgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE2KSAmIDB4MTApKSB7Ci0JICAgICAgICBpZighKFNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByLEh3SW5mbykpKSB7Ci0JIAkgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMSk7Ci0gICAgICAgIAkgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBTaVNfV2FpdFZCUmV0cmFjZShTaVNfUHIsIEh3SW5mbyk7Ci0gICAgICAgICAgICAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RjcsMHgwMCk7Ci0gICAgICAgICAgICAgfQorICAgICAgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkgeworCSAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxMykgJiAweDQwKSkgeworCSAgICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNikgJiAweDEwKSkgeworCQlpZighKFNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByKSkpIHsKKwkJICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAxKTsKKwkJICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAxKTsKKwkJfQorCQlTaVNfV2FpdFZCUmV0cmFjZShTaVNfUHIpOworCQlTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QciwweEY3LDB4MDApOworCSAgICAgfQogCSAgfQogICAgICAgIH0KIApAQCAtNDY5MSw5NCArNDc5Miw5NCBAQAogCiAjaWZkZWYgU0lTMzE1SCAgICAvKiAzMTUgc2VyaWVzICovCiAKLSAgICAgICBpZighKFNpU19Jc05vdE02NTBvckxhdGVyKFNpU19QcixId0luZm8pKSkgewotICAgICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzM0MCkgewotICAgICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHg0YywweDE4KTsKLQkgIH0KKyAgICAgICBpZighKFNpU19Jc05vdE02NTBvckxhdGVyKFNpU19QcikpKSB7CisJICAvKmlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzQwKSB7Ki8gIC8qIFhHSSBuZWVkcyB0aGlzICovCisJICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4NGMsMHgxOCk7CisJICAvKn0qLwogICAgICAgIH0KIAogICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMCkgewotCSAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKLQkgICAgIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLEh3SW5mbywweEZCLDB4MDApOwotCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDApOwotICAgICAgICAgIH0KKwkgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkgeworCSAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGQiwweDAwKTsKKwkgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMCk7CisJICB9CiAgICAgICAgfQogCiAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweDIwKTsKLSAgICAgICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIsSHdJbmZvKTsKKyAgICAgICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIpOwogCiAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZSwweGY3KTsKIAogICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMikgewotICAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDY2KTsKKwkgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDY2KTsKIAkgIHRlbXAgJj0gMHgyMDsKIAkgIFNpU19DaHJvbnRlbDcwMXhCTE9mZihTaVNfUHIpOwogICAgICAgIH0KIAotICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlICE9IFNJU181NTApIHsKLSAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJlLDB4N2YpOworICAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgIT0gU0lTXzU1MCkgeworCSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZSwweDdmKTsKICAgICAgICB9CiAKLSAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQwKSB7Ci0gICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAyKSB7Ci0gICAgICAgICAgICAgaWYoU2lTX0lzTENET3JMQ0RBKFNpU19QciwgSHdJbmZvKSkgewotCSAgIAlTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MUUsMHgyMCk7CisgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisJICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKKwkgICAgIGlmKFNpU19Jc0xDRE9yTENEQShTaVNfUHIpKSB7CisJCVNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxRSwweDIwKTsKIAkgICAgIH0KIAkgIH0KICAgICAgICB9CiAKICAgICAgICB0ZW1wMSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MkUpOwogICAgICAgIGlmKCEodGVtcDEgJiAweDgwKSkgewotICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRSwweDgwKTsKKwkgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRSwweDgwKTsKICAgICAgICB9CiAKICAgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKLSAgICAgICAgICBpZih0ZW1wKSB7Ci0JICAgICBTaVNfQ2hyb250ZWw3MDF4QkxPbihTaVNfUHIsIEh3SW5mbyk7CisJICBpZih0ZW1wKSB7CisJICAgICBTaVNfQ2hyb250ZWw3MDF4QkxPbihTaVNfUHIpOwogCSAgfQogICAgICAgIH0KIAogICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMCkgewotICAgICAgICAgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByLCBId0luZm8pKSB7CisJICBpZihTaVNfQ1JUMklzTENEKFNpU19QcikpIHsKIAkgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxRSwweDIwKTsKLQkgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU181NTApIHsKKwkgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzU1MCkgewogCQlTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MUUsMHg0MCk7CiAJCVNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxRSwweDEwKTsKIAkgICAgIH0KIAkgIH0KLSAgICAgICB9IGVsc2UgaWYoU2lTX0lzVkFNb2RlKFNpU19QcixId0luZm8pKSB7Ci0gICAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgIT0gU0lTXzc0MCkgewotICAgICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxRSwweDIwKTsKKyAgICAgICB9IGVsc2UgaWYoU2lTX0lzVkFNb2RlKFNpU19QcikpIHsKKwkgIGlmKFNpU19Qci0+Q2hpcFR5cGUgIT0gU0lTXzc0MCkgeworCSAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFFLDB4MjApOwogCSAgfQogICAgICAgIH0KIAotICAgICAgIGlmKCEoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByLEh3SW5mbykpKSB7Ci0gICAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCwweDdmKTsKKyAgICAgICBpZighKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QcikpKSB7CisJICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4N2YpOwogICAgICAgIH0KIAogICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMikgewotICAgICAgIAkgIGlmKFNpU19Jc1RWT3JZUGJQck9yU2NhcnQoU2lTX1ByLEh3SW5mbykpIHsKLSAgICAgICAgICAgICBTaVNfQ2hyb250ZWw3MDF4T24oU2lTX1ByLEh3SW5mbyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmKCAoU2lTX0lzVkFNb2RlKFNpU19QcixId0luZm8pKSB8fAotCSAgICAgIChTaVNfSXNMQ0RPckxDREEoU2lTX1ByLEh3SW5mbykpICkgewotICAgICAgICAgICAgIFNpU19DaHJvbnRlbERvU29tZXRoaW5nMShTaVNfUHIsSHdJbmZvKTsKLSAgICAgICAgICB9CisJICBpZihTaVNfSXNUVk9yWVBiUHJPclNjYXJ0KFNpU19QcikpIHsKKwkgICAgIFNpU19DaHJvbnRlbDcwMXhPbihTaVNfUHIpOworCSAgfQorCSAgaWYoIChTaVNfSXNWQU1vZGUoU2lTX1ByKSkgfHwKKwkgICAgICAoU2lTX0lzTENET3JMQ0RBKFNpU19QcikpICkgeworCSAgICAgU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcxKFNpU19Qcik7CisJICB9CiAgICAgICAgfQogCiAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAyKSB7Ci0gICAgICAgCSAgaWYoIShTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChTaVNfUHIsSHdJbmZvKSkpIHsKLSAJICAgICBpZiggKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkgfHwKLQkgICAgICAgICAoU2lTX0lzTENET3JMQ0RBKFNpU19QcixId0luZm8pKSApIHsKLQkgICAgIAlTaVNfQ2hyb250ZWw3MDF4QkxPbihTaVNfUHIsIEh3SW5mbyk7Ci0JICAgICAJU2lTX0Nocm9udGVsSW5pdFRWVlN5bmMoU2lTX1ByLEh3SW5mbyk7Ci0gICAgICAgICAgICAgfQotICAgICAgIAkgIH0KKwkgIGlmKCEoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByKSkpIHsKKwkgICAgIGlmKCAoU2lTX0lzVkFNb2RlKFNpU19QcikpIHx8CisJCSAoU2lTX0lzTENET3JMQ0RBKFNpU19QcikpICkgeworCQlTaVNfQ2hyb250ZWw3MDF4QkxPbihTaVNfUHIpOworCQlTaVNfQ2hyb250ZWxJbml0VFZWU3luYyhTaVNfUHIpOworCSAgICAgfQorCSAgfQogICAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDApIHsKLSAgICAgICAJICBpZighKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QcixId0luZm8pKSkgewotCSAgICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKLQkJU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDEpOwotCQlTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGNywweDAwKTsKKwkgIGlmKCEoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByKSkpIHsKKwkgICAgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkgeworCQlTaVNfUGFuZWxEZWxheShTaVNfUHIsIDEpOworCQlTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QciwweEY3LDB4MDApOwogCSAgICAgfQogCSAgfQogICAgICAgIH0KQEAgLTQ3OTcsMjQzICs0ODk4LDIwNCBAQAogCiAvKiBTZXQgQ1JUMiBPRkZTRVQgLyBQSVRDSCAqLwogc3RhdGljIHZvaWQKLVNpU19TZXRDUlQyT2Zmc2V0KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLQkgICAgICAgICAgVVNIT1JUIFJSVEksIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfU2V0Q1JUMk9mZnNldChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUlJUSSkKIHsKLSAgVVNIT1JUIG9mZnNldDsKLSAgVUNIQVIgdGVtcDsKKyAgIHVuc2lnbmVkIHNob3J0IG9mZnNldDsKKyAgIHVuc2lnbmVkIGNoYXIgIHRlbXA7CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHJldHVybjsKKyAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSByZXR1cm47CiAKLSAgb2Zmc2V0ID0gU2lTX0dldE9mZnNldChTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4LFJSVEksSHdJbmZvKTsKKyAgIG9mZnNldCA9IFNpU19HZXRPZmZzZXQoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCxSUlRJKTsKIAotICBpZigoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF82NDB4NDgwXzIpIHx8Ci0gICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzY0MHg0ODBfMykpIHsKLSAgICAgb2Zmc2V0ID4+PSAxOwotICB9CisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDA3LChvZmZzZXQgJiAweEZGKSk7CisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDA5LChvZmZzZXQgPj4gOCkpOwogCi0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDcsKG9mZnNldCAmIDB4RkYpKTsKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwOSwob2Zmc2V0ID4+IDgpKTsKLSAgdGVtcCA9IChVQ0hBUikoKChvZmZzZXQgPj4gMykgJiAweEZGKSArIDEpOwotICBpZihvZmZzZXQgJSA4KSB0ZW1wKys7Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDMsdGVtcCk7CisgICB0ZW1wID0gKHVuc2lnbmVkIGNoYXIpKCgob2Zmc2V0ID4+IDMpICYgMHhGRikgKyAxKTsKKyAgIGlmKG9mZnNldCAmIDB4MDcpIHRlbXArKzsKKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDMsdGVtcCk7CiB9CiAKIC8qIFNldCBDUlQyIHN5bmMgYW5kIFBhbmVsTGluayBtb2RlICovCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDJTeW5jKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0gICAgICAgICAgICAgICAgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRDUlQyU3luYyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCiB7Ci0gIFVTSE9SVCB0ZW1wYWg9MCx0ZW1wYmwsaW5mb2ZsYWc7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYWg9MCwgdGVtcGJsLCBpbmZvZmxhZzsKIAotICB0ZW1wYmwgPSAweEMwOworICAgdGVtcGJsID0gMHhDMDsKIAotICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPkNJbmZvRmxhZzsKLSAgfSBlbHNlIHsKLSAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9JbmZvRmxhZzsKLSAgfQorICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisgICAgICBpbmZvZmxhZyA9IFNpU19Qci0+Q0luZm9GbGFnOworICAgfSBlbHNlIHsKKyAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfSW5mb0ZsYWc7CisgICB9CiAKLSAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewkJCQkJLyogTFZEUyAqLworICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewkJCQkJLyogTFZEUyAqLwogCi0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgICAgIHRlbXBhaCA9IDA7Ci0gICAgIH0gZWxzZSBpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSAmJiAoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFN5bmMpKSB7Ci0gICAgICAgIHRlbXBhaCA9IFNpU19Qci0+U2lTX0xDREluZm87Ci0gICAgIH0gZWxzZSB0ZW1wYWggPSBpbmZvZmxhZyA+PiA4OwotICAgICB0ZW1wYWggJj0gMHhDMDsKLSAgICAgdGVtcGFoIHw9IDB4MjA7Ci0gICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFJHQjE4Qml0KSkgdGVtcGFoIHw9IDB4MTA7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotICAgICAgICBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fAotICAgICAgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMDI0KSkgewotCSAgIHRlbXBhaCB8PSAweGYwOwotICAgICAgICB9Ci0JaWYoIChTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgfHwKLSAgICAgICAgICAgIChTaVNfUHItPlNpU19JRl9ERUZfRFNUTikgfHwKLSAgICAgICAgICAgIChTaVNfUHItPlNpU19JRl9ERUZfVFJVTVBJT04pIHx8Ci0gICAgICAgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfUEFORUw4NDgpICkgewotICAgICAgICAgICB0ZW1wYWggfD0gMHgzMDsKLSAgICAgICAgfQotICAgICB9Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgICAgICAgIHRlbXBhaCA+Pj0gMzsKLQkgICB0ZW1wYWggJj0gMHgxODsKLSAgICAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEzLDB4RTcsdGVtcGFoKTsKLQkgICAvKiBEb24ndCBjYXJlIGFib3V0IDEyLzE4LzI0IGJpdCBtb2RlIC0gVFYgaXMgdmlhIFZHQSwgbm90IFBMICovCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxOSwweDBGLDB4ZTApOwotICAgICAgICB9Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxOSwweDBGLHRlbXBhaCk7Ci0gICAgIH0KKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CisJIHRlbXBhaCA9IDA7CisgICAgICB9IGVsc2UgaWYoKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgJiYgKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RTeW5jKSkgeworCSB0ZW1wYWggPSBTaVNfUHItPlNpU19MQ0RJbmZvOworICAgICAgfSBlbHNlIHRlbXBhaCA9IGluZm9mbGFnID4+IDg7CisgICAgICB0ZW1wYWggJj0gMHhDMDsKKyAgICAgIHRlbXBhaCB8PSAweDIwOworICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgeworCSBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fAorCSAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMDI0KSkgeworCSAgICB0ZW1wYWggfD0gMHhmMDsKKwkgfQorCSBpZiggKFNpU19Qci0+U2lTX0lGX0RFRl9GU1ROKSB8fAorCSAgICAgKFNpU19Qci0+U2lTX0lGX0RFRl9EU1ROKSB8fAorCSAgICAgKFNpU19Qci0+U2lTX0lGX0RFRl9UUlVNUElPTikgfHwKKwkgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgfHwKKwkgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg1NikgKSB7CisJICAgIHRlbXBhaCB8PSAweDMwOworCSB9CisJIGlmKCAoU2lTX1ByLT5TaVNfSUZfREVGX0ZTVE4pIHx8CisJICAgICAoU2lTX1ByLT5TaVNfSUZfREVGX0RTVE4pICkgeworCSAgICB0ZW1wYWggJj0gfjB4YzA7CisJIH0KKyAgICAgIH0KKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CisJIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKwkgICAgdGVtcGFoID4+PSAzOworCSAgICB0ZW1wYWggJj0gMHgxODsKKwkgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEzLDB4RTcsdGVtcGFoKTsKKwkgICAgLyogRG9uJ3QgY2FyZSBhYm91dCAxMi8xOC8yNCBiaXQgbW9kZSAtIFRWIGlzIHZpYSBWR0EsIG5vdCBQTCAqLworCSB9IGVsc2UgeworCSAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTksMHgwRiwweGUwKTsKKwkgfQorICAgICAgfSBlbHNlIHsKKwkgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDE5LDB4MEYsdGVtcGFoKTsKKyAgICAgIH0KIAotICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKyAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewogCi0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwICAvKiAtLS0tIDMwMCBzZXJpZXMgLS0tICovCiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7CQkJLyogNjMwIC0gMzAxQigtREgpICovCisJIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgewkJCS8qIDYzMCAtIDMwMUIoLURIKSAqLwogCi0JICAgdGVtcGFoID0gaW5mb2ZsYWcgPj4gODsKLQkgICB0ZW1wYmwgPSAwOwotICAgICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKLQkgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEU3luYykgewotCSAgICAgICAgIHRlbXBhaCA9IFNpU19Qci0+U2lTX0xDREluZm87Ci0JCSB0ZW1wYmwgPSAodGVtcGFoID4+IDYpICYgMHgwMzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICAgIHRlbXBhaCAmPSAweEMwOwotICAgICAgICAgICB0ZW1wYWggfD0gMHgyMDsKLSAgICAgICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKLSAgCSAgIHRlbXBhaCB8PSAweGMwOwotICAgICAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTksMHgwRix0ZW1wYWgpOwotCSAgIGlmKChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpICYmICghKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSkpIHsKLQkgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MWEsMHhmMCx0ZW1wYmwpOwotCSAgIH0KKwkgICAgdGVtcGFoID0gaW5mb2ZsYWcgPj4gODsKKwkgICAgdGVtcGJsID0gMDsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CisJICAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RTeW5jKSB7CisJCSAgdGVtcGFoID0gU2lTX1ByLT5TaVNfTENESW5mbzsKKwkJICB0ZW1wYmwgPSAodGVtcGFoID4+IDYpICYgMHgwMzsKKwkgICAgICAgfQorCSAgICB9CisJICAgIHRlbXBhaCAmPSAweEMwOworCSAgICB0ZW1wYWggfD0gMHgyMDsKKwkgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKKwkgICAgdGVtcGFoIHw9IDB4YzA7CisJICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxOSwweDBGLHRlbXBhaCk7CisJICAgIGlmKChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpICYmICghKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSkpIHsKKwkgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDFhLDB4ZjAsdGVtcGJsKTsKKwkgICAgfQogCi0gICAgICAgIH0gZWxzZSB7CQkJCQkJCS8qIDYzMCAtIDMwMSAqLworCSB9IGVsc2UgewkJCQkJCQkvKiA2MzAgLSAzMDEgKi8KIAotICAgICAgICAgICB0ZW1wYWggPSBpbmZvZmxhZyA+PiA4OwotICAgICAgICAgICB0ZW1wYWggJj0gMHhDMDsKLSAgICAgICAgICAgdGVtcGFoIHw9IDB4MjA7Ci0JICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKLSAgICAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDE5LDB4MEYsdGVtcGFoKTsKKwkgICAgdGVtcGFoID0gKChpbmZvZmxhZyA+PiA4KSAmIDB4YzApIHwgMHgyMDsKKwkgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKKwkgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDE5LDB4MEYsdGVtcGFoKTsKIAotICAgICAgICB9CisJIH0KIAogI2VuZGlmIC8qIFNJUzMwMCAqLwogCi0gICAgIH0gZWxzZSB7CisgICAgICB9IGVsc2UgewogCiAjaWZkZWYgU0lTMzE1SCAgLyogLS0tLS0tLSAzMTUgc2VyaWVzIC0tLS0tLSAqLwogCi0gICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsJICAJCS8qIDMxNSAtIExWRFMgKi8KKwkgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewkgIAkJLyogMzE1IC0gTFZEUyAqLwogCi0JICAgdGVtcGJsID0gMDsKLQkgICBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ09NUEFRMTI4MCkgJiYKLQkgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMjgweDEwMjQpKSB7Ci0JICAgICAgdGVtcGFoID0gaW5mb2ZsYWcgPj4gODsKLQkgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEU3luYykgewotCSAgICAgICAgdGVtcGJsID0gKChTaVNfUHItPlNpU19MQ0RJbmZvICYgMHhjMCkgPj4gNik7Ci0JICAgICAgfQotCSAgIH0gZWxzZSBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ0xFVk8xNDAwKSAgJiYKLQkgICAgICAgICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSkgewotICAgICAgIAkgICAgICB0ZW1wYWggPSBpbmZvZmxhZyA+PiA4OwotCSAgICAgIHRlbXBibCA9IDB4MDM7Ci0JICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgdGVtcGFoID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzcpOwotCSAgICAgIHRlbXBibCA9ICh0ZW1wYWggPj4gNikgJiAweDAzOwotCSAgICAgIHRlbXBibCB8PSAweDA4OwotCSAgICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFJHQjE4Qml0KSkgdGVtcGJsIHw9IDB4MDQ7Ci0JICAgfQotCSAgIHRlbXBhaCAmPSAweEMwOwotICAgICAgICAgICB0ZW1wYWggfD0gMHgyMDsKLSAgICAgICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKLQkgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSAgIHRlbXBhaCB8PSAweGMwOwotICAgICAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTksMHgwRix0ZW1wYWgpOwotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgewotCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotCSAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgxYSwweGYwLHRlbXBibCk7Ci0JICAgICAgfQotCSAgIH0KKwkgICAgdGVtcGJsID0gMDsKKwkgICAgaWYoKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0NPTVBBUTEyODApICYmCisJICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4MTAyNCkpIHsKKwkgICAgICAgdGVtcGFoID0gaW5mb2ZsYWcgPj4gODsKKwkgICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFN5bmMpIHsKKwkJIHRlbXBibCA9ICgoU2lTX1ByLT5TaVNfTENESW5mbyAmIDB4YzApID4+IDYpOworCSAgICAgICB9CisJICAgIH0gZWxzZSBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ0xFVk8xNDAwKSAgJiYKKwkJICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSkgeworCSAgICAgICB0ZW1wYWggPSBpbmZvZmxhZyA+PiA4OworCSAgICAgICB0ZW1wYmwgPSAweDAzOworCSAgICB9IGVsc2UgeworCSAgICAgICB0ZW1wYWggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNyk7CisJICAgICAgIHRlbXBibCA9ICh0ZW1wYWggPj4gNikgJiAweDAzOworCSAgICAgICB0ZW1wYmwgfD0gMHgwODsKKwkgICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYmwgfD0gMHgwNDsKKwkgICAgfQorCSAgICB0ZW1wYWggJj0gMHhDMDsKKwkgICAgdGVtcGFoIHw9IDB4MjA7CisJICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFJHQjE4Qml0KSkgdGVtcGFoIHw9IDB4MTA7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpICAgdGVtcGFoIHw9IDB4YzA7CisJICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxOSwweDBGLHRlbXBhaCk7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgeworCSAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKKwkJICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MWEsMHhmMCx0ZW1wYmwpOworCSAgICAgICB9CisJICAgIH0KIAotICAgICAgICB9IGVsc2UgewkJCQkJCQkvKiAzMTUgLSBUTURTICovCisJIH0gZWxzZSB7CQkJCQkJCS8qIDMxNSAtIFRNRFMgKi8KIAotICAgICAgICAgICB0ZW1wYWggPSB0ZW1wYmwgPSBpbmZvZmxhZyA+PiA4OwotCSAgIGlmKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLQkgICAgICB0ZW1wYmwgPSAwOwotCSAgICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFDKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvUkFNREFDKSkgewotCSAgICAgICAgIGlmKE1vZGVObyA8PSAweDEzKSB7Ci0JICAgICAgICAgICAgdGVtcGFoID0gU2lTX0dldFJlZ0J5dGUoKFNpU19Qci0+U2lTX1AzY2ErMHgwMikpOwotICAJICAgICAgICAgfQotCSAgICAgIH0KLQkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKLQkgICAgICAgICBpZighKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSB7Ci0JICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFN5bmMpIHsKLQkgICAgICAgICAgICAgICB0ZW1wYWggPSBTaVNfUHItPlNpU19MQ0RJbmZvOworCSAgICB0ZW1wYWggPSB0ZW1wYmwgPSBpbmZvZmxhZyA+PiA4OworCSAgICBpZighU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisJICAgICAgIHRlbXBibCA9IDA7CisJICAgICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhDKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvUkFNREFDKSkgeworCQkgIGlmKE1vZGVObyA8PSAweDEzKSB7CisJCSAgICAgdGVtcGFoID0gU2lTX0dldFJlZ0J5dGUoKFNpU19Qci0+U2lTX1AzY2ErMHgwMikpOworCQkgIH0KKwkgICAgICAgfQorCSAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKKwkJICBpZighKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSB7CisJCSAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEU3luYykgeworCQkgICAgICAgdGVtcGFoID0gU2lTX1ByLT5TaVNfTENESW5mbzsKIAkJICAgICAgIHRlbXBibCA9ICh0ZW1wYWggPj4gNikgJiAweDAzOwogCQkgICAgfQotCSAgICAgICAgIH0KLQkgICAgICB9Ci0JICAgfQotCSAgIHRlbXBhaCAmPSAweEMwOwotICAgICAgICAgICB0ZW1wYWggfD0gMHgyMDsKLSAgICAgICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKLQkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgewotCSAgICAgIC8qIEltaXRhdGUgQklPUyBidWcgKi8KLQkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgIHRlbXBhaCB8PSAweGMwOwotCSAgIH0KLQkgICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQykgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1JBTURBQykpIHsKLQkgICAgICB0ZW1wYWggPj49IDM7Ci0JICAgICAgdGVtcGFoICY9IDB4MTg7Ci0JICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEzLDB4ZTcsdGVtcGFoKTsKLQkgICB9IGVsc2UgewotICAgICAgICAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTksMHgwRix0ZW1wYWgpOwotCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgewotCSAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotCSAgICAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgxYSwweGYwLHRlbXBibCk7Ci0JCSB9Ci0JICAgICAgfQotCSAgIH0KKwkJICB9CisJICAgICAgIH0KKwkgICAgfQorCSAgICB0ZW1wYWggJj0gMHhDMDsKKwkgICAgdGVtcGFoIHw9IDB4MjA7CisJICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFJHQjE4Qml0KSkgdGVtcGFoIHw9IDB4MTA7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSB7CisJICAgICAgIC8qIEltaXRhdGUgQklPUyBidWcgKi8KKwkgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpICB0ZW1wYWggfD0gMHhjMDsKKwkgICAgfQorCSAgICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QykgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1JBTURBQykpIHsKKwkgICAgICAgdGVtcGFoID4+PSAzOworCSAgICAgICB0ZW1wYWggJj0gMHgxODsKKwkgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEzLDB4ZTcsdGVtcGFoKTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDE5LDB4MEYsdGVtcGFoKTsKKwkgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CisJCSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CisJCSAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDFhLDB4ZjAsdGVtcGJsKTsKKwkJICB9CisJICAgICAgIH0KKwkgICAgfQogCi0gICAgICAgIH0KKyAgICAgICAgIH0KICNlbmRpZiAgLyogU0lTMzE1SCAqLwogICAgICAgfQogICAgfQogfQogCi0vKiBTZXQgQ1JUMiBGSUZPIG9uIDMwMC82MzAvNzMwICovCisvKiBTZXQgQ1JUMiBGSUZPIG9uIDMwMC81NDAvNjMwLzczMCAqLwogI2lmZGVmIFNJUzMwMAogc3RhdGljIHZvaWQKLVNpU19TZXRDUlQyRklGT18zMDAoU2lTX1ByaXZhdGUgKlNpU19QcixVU0hPUlQgTW9kZU5vLAotICAgICAgICAgICAgICAgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldENSVDJGSUZPXzMwMChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcix1bnNpZ25lZCBzaG9ydCBNb2RlTm8pCiB7Ci0gIFVDSEFSICAqUk9NQWRkciAgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCB0ZW1wLGluZGV4OwotICBVU0hPUlQgbW9kZWlkaW5kZXgscmVmcmVzaHJhdGV0YWJsZWluZGV4OwotICBVU0hPUlQgVkNMSz0wLE1DTEssY29sb3J0aD0wLGRhdGEyPTA7Ci0gIFVTSE9SVCB0ZW1wYWwsIHRlbXBhaCwgdGVtcGJ4LCB0ZW1wY2wsIHRlbXBheDsKLSAgVVNIT1JUIENSVDFNb2RlTm8sQ1JUMk1vZGVObzsKLSAgVVNIT1JUIFNlbGVjdFJhdGVfYmFja3VwOwotICBVTE9ORyAgZGF0YSxlYXg7Ci0gIGNvbnN0IFVDSEFSICBMYXRlbmN5RmFjdG9yW10gPSB7Ci0gIAk5NywgODgsIDg2LCA3OSwgNzcsIDAwLCAgICAgICAvKjsgNjQgIGJpdCAgICBCUT0yICAgKi8KLSAgICAgICAgMDAsIDg3LCA4NSwgNzgsIDc2LCA1NCwgICAgICAgLyo7IDY0ICBiaXQgICAgQlE9MSAgICovCi0gICAgICAgIDk3LCA4OCwgODYsIDc5LCA3NywgMDAsICAgICAgIC8qOyAxMjggYml0ICAgIEJRPTIgICAqLwotICAgICAgICAwMCwgNzksIDc3LCA3MCwgNjgsIDQ4LCAgICAgICAvKjsgMTI4IGJpdCAgICBCUT0xICAgKi8KLSAgICAgICAgODAsIDcyLCA2OSwgNjMsIDYxLCAwMCwgICAgICAgLyo7IDY0ICBiaXQgICAgQlE9MiAgICovCi0gICAgICAgIDAwLCA3MCwgNjgsIDYxLCA1OSwgMzcsICAgICAgIC8qOyA2NCAgYml0ICAgIEJRPTEgICAqLwotICAgICAgICA4NiwgNzcsIDc1LCA2OCwgNjYsIDAwLCAgICAgICAvKjsgMTI4IGJpdCAgICBCUT0yICAgKi8KLSAgICAgICAgMDAsIDY4LCA2NiwgNTksIDU3LCAzNyAgICAgICAgLyo7IDEyOCBiaXQgICAgQlE9MSAgICovCi0gIH07Ci0gIGNvbnN0IFVDSEFSICBMYXRlbmN5RmFjdG9yNzMwW10gPSB7Ci0gICAgICAgICA2OSwgNjMsIDYxLAotCSA4NiwgNzksIDc3LAotCTEwMywgOTYsIDk0LAotCTEyMCwxMTMsMTExLAotCTEzNywxMzAsMTI4LCAgICAvKiA8LS0gbGFzdCBlbnRyeSwgZGF0YSBiZWxvdyAqLwotCTEzNywxMzAsMTI4LAkvKiB0byBhdm9pZCB1c2luZyBpbGxlZ2FsIHZhbHVlcyAqLwotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotICB9OwotICBjb25zdCBVQ0hBUiBUaExvd0JbXSAgID0gewotICAJODEsIDQsIDcyLCA2LCA4OCwgOCwxMjAsMTIsCi0gICAgICAgIDU1LCA0LCA1NCwgNiwgNjYsIDgsIDkwLDEyLAotICAgICAgICA0MiwgNCwgNDUsIDYsIDU1LCA4LCA3NSwxMgotICB9OwotICBjb25zdCBVQ0hBUiBUaFRpbWluZ1tdID0gewotICAJMSwgMiwgMiwgMywgMCwgMSwgMSwgMgorICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciAgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wLCBpbmRleCwgbW9kZWlkaW5kZXgsIHJlZnJlc2hyYXRldGFibGVpbmRleDsKKyAgdW5zaWduZWQgc2hvcnQgVkNMSyA9IDAsIE1DTEssIGNvbG9ydGggPSAwLCBkYXRhMiA9IDA7CisgIHVuc2lnbmVkIHNob3J0IHRlbXBieCwgdGVtcGNsLCBDUlQxTW9kZU5vLCBDUlQyTW9kZU5vLCBTZWxlY3RSYXRlX2JhY2t1cDsKKyAgdW5zaWduZWQgaW50ICAgZGF0YSwgcGNpNTAsIHBjaUEwOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjb2xvcnRoYXJyYXlbXSA9IHsKKyAgCTEsIDEsIDIsIDIsIDMsIDQKICAgfTsKIAogICBTZWxlY3RSYXRlX2JhY2t1cCA9IFNpU19Qci0+U2lTX1NlbGVjdENSVDJSYXRlOwpAQCAtNTA0NCwyMzIgKzUxMDYsMTU5IEBACiAgICAgIFNpU19TZWFyY2hNb2RlSUQoU2lTX1ByLCAmQ1JUMU1vZGVObywgJm1vZGVpZGluZGV4KTsKICAgICAgU2lTX1ByLT5TaVNfU2V0RmxhZyAmPSAoflByb2dyYW1taW5nQ1JUMik7CiAgICAgIFNpU19Qci0+U2lTX1NlbGVjdENSVDJSYXRlID0gMDsKLSAgICAgcmVmcmVzaHJhdGV0YWJsZWluZGV4ID0gU2lTX0dldFJhdGVQdHIoU2lTX1ByLCBDUlQxTW9kZU5vLCBtb2RlaWRpbmRleCwgSHdJbmZvKTsKKyAgICAgcmVmcmVzaHJhdGV0YWJsZWluZGV4ID0gU2lTX0dldFJhdGVQdHIoU2lTX1ByLCBDUlQxTW9kZU5vLCBtb2RlaWRpbmRleCk7CiAKICAgICAgaWYoQ1JUMU1vZGVObyA+PSAweDEzKSB7Ci0gICAgICAgIGluZGV4ID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbcmVmcmVzaHJhdGV0YWJsZWluZGV4XS5FeHRfQ1JUVkNMSzsKLSAgICAgICAgaW5kZXggJj0gMHgzRjsKLSAgICAgICAgVkNMSyA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2luZGV4XS5DTE9DSzsJCQkvKiBHZXQgVkNMSyAqLworICAgICAgICAvKiBHZXQgVkNMSyAqLworCWluZGV4ID0gU2lTX0dldFJlZkNSVFZDTEsoU2lTX1ByLCByZWZyZXNocmF0ZXRhYmxlaW5kZXgsIFNpU19Qci0+U2lTX1VzZVdpZGUpOworCVZDTEsgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtpbmRleF0uQ0xPQ0s7CiAKLQljb2xvcnRoID0gU2lTX0dldENvbG9yRGVwdGgoU2lTX1ByLENSVDFNb2RlTm8sbW9kZWlkaW5kZXgpOyAJLyogR2V0IGNvbG9yZGVwdGggKi8KLSAgICAgICAgY29sb3J0aCA+Pj0gMTsKLSAgICAgICAgaWYoIWNvbG9ydGgpIGNvbG9ydGgrKzsKKwkvKiBHZXQgY29sb3JkZXB0aCAqLworCWNvbG9ydGggPSBTaVNfR2V0Q29sb3JEZXB0aChTaVNfUHIsQ1JUMU1vZGVObyxtb2RlaWRpbmRleCkgPj4gMTsKKwlpZighY29sb3J0aCkgY29sb3J0aCsrOwogICAgICB9CiAKICAgfSBlbHNlIHsKIAogICAgICBDUlQxTW9kZU5vID0gMHhmZTsKLSAgICAgVkNMSyA9IFNpU19Qci0+Q1NSQ2xvY2tfQ1JUMTsJCQkJCS8qIEdldCBWQ0xLICovCi0gICAgIGRhdGEyID0gKFNpU19Qci0+Q01vZGVGbGFnX0NSVDEgJiBNb2RlVHlwZU1hc2spIC0gMjsKLSAgICAgc3dpdGNoKGRhdGEyKSB7CQkJCQkJCS8qIEdldCBjb2xvciBkZXB0aCAqLwotICAgICAgICBjYXNlIDAgOiBjb2xvcnRoID0gMTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMSA6IGNvbG9ydGggPSAxOyBicmVhazsKLSAgICAgICAgY2FzZSAyIDogY29sb3J0aCA9IDI7IGJyZWFrOwotICAgICAgICBjYXNlIDMgOiBjb2xvcnRoID0gMjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNCA6IGNvbG9ydGggPSAzOyBicmVhazsKLSAgICAgICAgY2FzZSA1IDogY29sb3J0aCA9IDQ7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiBjb2xvcnRoID0gMjsKLSAgICAgfQorCisgICAgIC8qIEdldCBWQ0xLICovCisgICAgIFZDTEsgPSBTaVNfUHItPkNTUkNsb2NrX0NSVDE7CisKKyAgICAgLyogR2V0IGNvbG9yIGRlcHRoICovCisgICAgIGNvbG9ydGggPSBjb2xvcnRoYXJyYXlbKChTaVNfUHItPkNNb2RlRmxhZ19DUlQxICYgTW9kZVR5cGVNYXNrKSAtIDIpXTsKIAogICB9CiAKICAgaWYoQ1JUMU1vZGVObyA+PSAweDEzKSB7Ci0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMwMCkgewotICAgICAgIGluZGV4ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4M0EpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgaW5kZXggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxQSk7Ci0gICAgfQotICAgIGluZGV4ICY9IDB4MDc7Ci0gICAgTUNMSyA9IFNpU19Qci0+U2lTX01DTEtEYXRhXzBbaW5kZXhdLkNMT0NLOwkJCQkvKiBHZXQgTUNMSyAqLworICAgICAvKiBHZXQgTUNMSyAqLworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU18zMDApIHsKKyAgICAgICAgaW5kZXggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzQSk7CisgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGV4ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MUEpOworICAgICB9CisgICAgIGluZGV4ICY9IDB4MDc7CisgICAgIE1DTEsgPSBTaVNfUHItPlNpU19NQ0xLRGF0YV8wW2luZGV4XS5DTE9DSzsKIAotICAgIGRhdGEyID0gKGNvbG9ydGggKiBWQ0xLKSAvIE1DTEs7CisgICAgIHRlbXAgPSAoKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE0KSA+PiA2KSAmIDB4MDMpIDw8IDE7CisgICAgIGlmKCF0ZW1wKSB0ZW1wKys7CisgICAgIHRlbXAgPDw9IDI7CiAKLSAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTQpOwotICAgIHRlbXAgPSAoKHRlbXAgJiAweDAwRkYpID4+IDYpIDw8IDE7Ci0gICAgaWYodGVtcCA9PSAwKSB0ZW1wID0gMTsKLSAgICB0ZW1wIDw8PSAyOwotICAgIHRlbXAgJj0gMHhmZjsKKyAgICAgZGF0YTIgPSB0ZW1wIC0gKChjb2xvcnRoICogVkNMSykgLyBNQ0xLKTsKIAotICAgIGRhdGEyID0gdGVtcCAtIGRhdGEyOworICAgICB0ZW1wID0gKDI4ICogMTYpICUgZGF0YTI7CisgICAgIGRhdGEyID0gKDI4ICogMTYpIC8gZGF0YTI7CisgICAgIGlmKHRlbXApIGRhdGEyKys7CiAKLSAgICBpZigoMjggKiAxNikgJSBkYXRhMikgewotICAgICAgCWRhdGEyID0gKDI4ICogMTYpIC8gZGF0YTI7Ci0gICAgICAJZGF0YTIrKzsKLSAgICB9IGVsc2UgewotICAgICAgCWRhdGEyID0gKDI4ICogMTYpIC8gZGF0YTI7Ci0gICAgfQorICAgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU18zMDApIHsKIAotICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMDApIHsKKwlTaVNfR2V0RklGT1RocmVzaG9sZEluZGV4MzAwKFNpU19QciwgJnRlbXBieCwgJnRlbXBjbCk7CisJZGF0YSA9IFNpU19HZXRGSUZPVGhyZXNob2xkQjMwMCh0ZW1wYngsIHRlbXBjbCk7CiAKLQl0ZW1wYWggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxOCk7Ci0JdGVtcGFoICY9IDB4NjI7Ci0JdGVtcGFoID4+PSAxOwotCXRlbXBhbCA9IHRlbXBhaDsKLQl0ZW1wYWggPj49IDM7Ci0JdGVtcGFsIHw9IHRlbXBhaDsKLQl0ZW1wYWwgJj0gMHgwNzsKLQl0ZW1wY2wgPSBUaFRpbWluZ1t0ZW1wYWxdOwotCXRlbXBieCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE2KTsKLQl0ZW1wYnggPj49IDY7Ci0JdGVtcGFoID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTQpOwotCXRlbXBhaCA+Pj0gNDsKLQl0ZW1wYWggJj0gMHgwYzsKLQl0ZW1wYnggfD0gdGVtcGFoOwotCXRlbXBieCA8PD0gMTsKLQl0ZW1wYWwgPSBUaExvd0JbdGVtcGJ4ICsgMV07Ci0JdGVtcGFsICo9IHRlbXBjbDsKLQl0ZW1wYWwgKz0gVGhMb3dCW3RlbXBieF07Ci0JZGF0YSA9IHRlbXBhbDsKKyAgICAgfSBlbHNlIHsKIAotICAgIH0gZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzMwKSB7Ci0KLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgICAgICBTaVNfU2V0UmVnTG9uZygweGNmOCwweDgwMDAwMDUwKTsKLSAgICAgICBlYXggPSBTaVNfR2V0UmVnTG9uZygweGNmYyk7CisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorCXBjaTUwID0gc2lzZmJfcmVhZF9uYnJpZGdlX3BjaV9kd29yZChTaVNfUHIsIDB4NTApOworCXBjaUEwID0gc2lzZmJfcmVhZF9uYnJpZGdlX3BjaV9kd29yZChTaVNfUHIsIDB4YTApOwogI2Vsc2UKLSAgICAgICBlYXggPSBwY2lSZWFkTG9uZygweDAwMDAwMDAwLCAweDUwKTsKKwlwY2k1MCA9IHBjaVJlYWRMb25nKDB4MDAwMDAwMDAsIDB4NTApOworCXBjaUEwID0gcGNpUmVhZExvbmcoMHgwMDAwMDAwMCwgMHhBMCk7CiAjZW5kaWYKLSAgICAgICB0ZW1wYWwgPSAoVVNIT1JUKShlYXggPj4gOCk7Ci0gICAgICAgdGVtcGFsICY9IDB4MDY7Ci0gICAgICAgdGVtcGFsIDw8PSA1OwogCi0jaWZkZWYgTElOVVhfS0VSTkVMCi0gICAgICAgU2lTX1NldFJlZ0xvbmcoMHhjZjgsMHg4MDAwMDBBMCk7Ci0gICAgICAgZWF4ID0gU2lTX0dldFJlZ0xvbmcoMHhjZmMpOwotI2Vsc2UKLSAgICAgICBlYXggPSBwY2lSZWFkTG9uZygweDAwMDAwMDAwLCAweEEwKTsKLSNlbmRpZgotICAgICAgIHRlbXAgPSAoVVNIT1JUKShlYXggPj4gMjgpOwotICAgICAgIHRlbXAgJj0gMHgwRjsKLSAgICAgICB0ZW1wYWwgfD0gdGVtcDsKKyAgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzMwKSB7CiAKLSAgICAgICB0ZW1wYnggPSB0ZW1wYWw7ICAgLyogQklPUyBCVUcgKDIuMDQuNWQsIDIuMDQuNmEgdXNlIGFoIGhlcmUsIHdoaWNoIGlzIHVuc2V0ISkgKi8KLSAgICAgICB0ZW1wYnggPSAwOyAgICAgICAgLyogLS0gZG8gaXQgbGlrZSB0aGUgQklPUyBhbnl3YXkuLi4gKi8KLSAgICAgICB0ZW1wYXggPSB0ZW1wYng7Ci0gICAgICAgdGVtcGJ4ICY9IDB4YzA7Ci0gICAgICAgdGVtcGJ4ID4+PSA2OwotICAgICAgIHRlbXBheCAmPSAweDBmOwotICAgICAgIHRlbXBheCAqPSAzOwotICAgICAgIHRlbXBieCArPSB0ZW1wYXg7CisJICAgaW5kZXggPSAodW5zaWduZWQgc2hvcnQpKCgocGNpQTAgPj4gMjgpICYgMHgwZikgKiAzKTsKKwkgICBpbmRleCArPSAodW5zaWduZWQgc2hvcnQpKCgocGNpNTAgPj4gOSkpICYgMHgwMyk7CiAKLSAgICAgICBkYXRhID0gTGF0ZW5jeUZhY3RvcjczMFt0ZW1wYnhdOwotICAgICAgIGRhdGEgKz0gMTU7Ci0gICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE0KTsKLSAgICAgICBpZighKHRlbXAgJiAweDgwKSkgZGF0YSArPSA1OworCSAgIC8qIEJJT1MgQlVHICgyLjA0LjVkLCAyLjA0LjZhIHVzZSBhaCBoZXJlLCB3aGljaCBpcyB1bnNldCEpICovCisJICAgaW5kZXggPSAwOyAgLyogLS0gZG8gaXQgbGlrZSB0aGUgQklPUyBhbnl3YXkuLi4gKi8KIAotICAgIH0gZWxzZSB7CisJfSBlbHNlIHsKIAotICAgICAgIGluZGV4ID0gMDsKLSAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTQpOwotICAgICAgIGlmKHRlbXAgJiAweDAwODApIGluZGV4ICs9IDEyOworCSAgIHBjaTUwID4+PSAyNDsKKwkgICBwY2lBMCA+Pj0gMjQ7CiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgICAgICBTaVNfU2V0UmVnTG9uZygweGNmOCwweDgwMDAwMEEwKTsKLSAgICAgICBlYXggPSBTaVNfR2V0UmVnTG9uZygweGNmYyk7Ci0jZWxzZQotICAgICAgIC8qIFdlIHVzZSBwY2kgZnVuY3Rpb25zIFggb2ZmZXJzLiBXZSB1c2UgdGFnIDAsIGJlY2F1c2UKLSAgICAgICAgKiB3ZSB3YW50IHRvIHJlYWQvd3JpdGUgdG8gdGhlIGhvc3QgYnJpZGdlICh3aGljaCBpcyBhbHdheXMKLSAgICAgICAgKiAwMDowMC4wIG9uIDYzMCwgNzMwIGFuZCA1NDApLCBub3QgdGhlIFZHQSBkZXZpY2UuCi0gICAgICAgICovCi0gICAgICAgZWF4ID0gcGNpUmVhZExvbmcoMHgwMDAwMDAwMCwgMHhBMCk7Ci0jZW5kaWYKLSAgICAgICB0ZW1wID0gKFVTSE9SVCkoZWF4ID4+IDI0KTsKLSAgICAgICBpZighKHRlbXAmMHgwMSkpIGluZGV4ICs9IDI0OworCSAgIGluZGV4ID0gKHBjaTUwID4+IDEpICYgMHgwNzsKIAotI2lmZGVmIExJTlVYX0tFUk5FTAotICAgICAgIFNpU19TZXRSZWdMb25nKDB4Y2Y4LDB4ODAwMDAwNTApOwotICAgICAgIGVheCA9IFNpU19HZXRSZWdMb25nKDB4Y2ZjKTsKLSNlbHNlCi0gICAgICAgZWF4ID0gcGNpUmVhZExvbmcoMHgwMDAwMDAwMCwgMHg1MCk7Ci0jZW5kaWYKLSAgICAgICB0ZW1wPShVU0hPUlQpKGVheCA+PiAyNCk7Ci0gICAgICAgaWYodGVtcCAmIDB4MDEpIGluZGV4ICs9IDY7CisJICAgaWYocGNpNTAgJiAweDAxKSAgICBpbmRleCArPSA2OworCSAgIGlmKCEocGNpQTAgJiAweDAxKSkgaW5kZXggKz0gMjQ7CiAKLSAgICAgICB0ZW1wID0gKHRlbXAgJiAweDBGKSA+PiAxOwotICAgICAgIGluZGV4ICs9IHRlbXA7CisJICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTQpICYgMHg4MCkgaW5kZXggKz0gMTI7CiAKLSAgICAgICBkYXRhID0gTGF0ZW5jeUZhY3RvcltpbmRleF07Ci0gICAgICAgZGF0YSArPSAxNTsKLSAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTQpOwotICAgICAgIGlmKCEodGVtcCAmIDB4ODApKSBkYXRhICs9IDU7Ci0gICAgfQorCX0KIAotICAgIGRhdGEgKz0gZGF0YTI7CQkJCS8qIENSVDEgUmVxdWVzdCBQZXJpb2QgKi8KKwlkYXRhID0gU2lTX0dldExhdGVuY3lGYWN0b3I2MzAoU2lTX1ByLCBpbmRleCkgKyAxNTsKKwlpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE0KSAmIDB4ODApKSBkYXRhICs9IDU7CiAKLSAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IFByb2dyYW1taW5nQ1JUMjsKLSAgICBTaVNfUHItPlNpU19TZWxlY3RDUlQyUmF0ZSA9IFNlbGVjdFJhdGVfYmFja3VwOworICAgICB9CiAKLSAgICBpZighU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisgICAgIGRhdGEgKz0gZGF0YTI7CQkJCQkJLyogQ1JUMSBSZXF1ZXN0IFBlcmlvZCAqLwogCi0gICAgICAgQ1JUMk1vZGVObyA9IE1vZGVObzsKLSAgICAgICBTaVNfU2VhcmNoTW9kZUlEKFNpU19QciwgJkNSVDJNb2RlTm8sICZtb2RlaWRpbmRleCk7CisgICAgIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gUHJvZ3JhbW1pbmdDUlQyOworICAgICBTaVNfUHItPlNpU19TZWxlY3RDUlQyUmF0ZSA9IFNlbGVjdFJhdGVfYmFja3VwOwogCi0gICAgICAgcmVmcmVzaHJhdGV0YWJsZWluZGV4ID0gU2lTX0dldFJhdGVQdHIoU2lTX1ByLCBDUlQyTW9kZU5vLCBtb2RlaWRpbmRleCwgSHdJbmZvKTsKKyAgICAgaWYoIVNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogCi0gICAgICAgaW5kZXggPSBTaVNfR2V0VkNMSzJQdHIoU2lTX1ByLENSVDJNb2RlTm8sbW9kZWlkaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaHJhdGV0YWJsZWluZGV4LEh3SW5mbyk7Ci0gICAgICAgVkNMSyA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2luZGV4XS5DTE9DSzsgICAgICAgICAgICAgICAgLyogR2V0IFZDTEsgICovCisJQ1JUMk1vZGVObyA9IE1vZGVObzsKKwlTaVNfU2VhcmNoTW9kZUlEKFNpU19QciwgJkNSVDJNb2RlTm8sICZtb2RlaWRpbmRleCk7CiAKLSAgICAgICBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fCAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMDI0KSkgewotICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgewotCSAgICAgaWYoUk9NQWRkclsweDIyMF0gJiAweDAxKSB7Ci0gICAgICAgICAgICAgICAgVkNMSyA9IFJPTUFkZHJbMHgyMjldIHwgKFJPTUFkZHJbMHgyMmFdIDw8IDgpOwotCSAgICAgfQotICAgICAgICAgIH0KLSAgICAgICB9CisJcmVmcmVzaHJhdGV0YWJsZWluZGV4ID0gU2lTX0dldFJhdGVQdHIoU2lTX1ByLCBDUlQyTW9kZU5vLCBtb2RlaWRpbmRleCk7CiAKLSAgICB9IGVsc2UgeworCS8qIEdldCBWQ0xLICAqLworCWluZGV4ID0gU2lTX0dldFZDTEsyUHRyKFNpU19QciwgQ1JUMk1vZGVObywgbW9kZWlkaW5kZXgsIHJlZnJlc2hyYXRldGFibGVpbmRleCk7CisJVkNMSyA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2luZGV4XS5DTE9DSzsKIAotICAgICAgIENSVDJNb2RlTm8gPSAweGZlOwotICAgICAgIFZDTEsgPSBTaVNfUHItPkNTUkNsb2NrOwkJCQkJLyogR2V0IFZDTEsgKi8KKwlpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fCAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMDI0KSkgeworCSAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgeworCSAgICAgIGlmKFJPTUFkZHJbMHgyMjBdICYgMHgwMSkgeworCQkgVkNMSyA9IFJPTUFkZHJbMHgyMjldIHwgKFJPTUFkZHJbMHgyMmFdIDw8IDgpOworCSAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICB9CisgICAgIH0gZWxzZSB7CiAKLSAgICBjb2xvcnRoID0gU2lTX0dldENvbG9yRGVwdGgoU2lTX1ByLENSVDJNb2RlTm8sbW9kZWlkaW5kZXgpOyAvKiBHZXQgY29sb3JkZXB0aCAqLwotICAgIGNvbG9ydGggPj49IDE7Ci0gICAgaWYoIWNvbG9ydGgpIGNvbG9ydGgrKzsKKwkvKiBHZXQgVkNMSyAqLworCUNSVDJNb2RlTm8gPSAweGZlOworCVZDTEsgPSBTaVNfUHItPkNTUkNsb2NrOwogCi0gICAgZGF0YSA9IGRhdGEgKiBWQ0xLICogY29sb3J0aDsKLSAgICBpZihkYXRhICUgKE1DTEsgPDwgNCkpIHsKLSAgICAgIAlkYXRhID0gZGF0YSAvIChNQ0xLIDw8IDQpOwotICAgICAgCWRhdGErKzsKLSAgICB9IGVsc2UgewotICAgICAgCWRhdGEgPSBkYXRhIC8gKE1DTEsgPDwgNCk7Ci0gICAgfQorICAgICB9CiAKLSAgICBpZihkYXRhIDw9IDYpIGRhdGEgPSA2OwotICAgIGlmKGRhdGEgPiAweDE0KSBkYXRhID0gMHgxNDsKKyAgICAgLyogR2V0IGNvbG9yZGVwdGggKi8KKyAgICAgY29sb3J0aCA9IFNpU19HZXRDb2xvckRlcHRoKFNpU19QcixDUlQyTW9kZU5vLG1vZGVpZGluZGV4KSA+PiAxOworICAgICBpZighY29sb3J0aCkgY29sb3J0aCsrOwogCi0gICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEpOwotICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMDApIHsKLSAgICAgICBpZihkYXRhIDw9IDB4MGYpIHRlbXAgPSAodGVtcCAmICh+MHgxRikpIHwgMHgxMzsKLSAgICAgICBlbHNlICAgICAgICAgICAgIHRlbXAgPSAodGVtcCAmICh+MHgxRikpIHwgMHgxNjsKLSAgICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4MTAyNCkgewotICAgICAgIAkgIHRlbXAgPSAodGVtcCAmICh+MHgxRikpIHwgMHgxMzsKLSAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICBpZiggKCAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzYzMCkgfHwKLSAgICAgICAgICAgICAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgKSAgJiYKLSAgICAgICAgICAgKEh3SW5mby0+akNoaXBSZXZpc2lvbiA+PSAweDMwKSApIC8qIDYzMHMgb3IgNzMwKHM/KSAqLwotICAgICAgewotCSAgdGVtcCA9ICh0ZW1wICYgKH4weDFGKSkgfCAweDFiOwotICAgICAgfSBlbHNlIHsKLQkgIHRlbXAgPSAodGVtcCAmICh+MHgxRikpIHwgMHgxNjsKLSAgICAgIH0KLSAgICB9Ci0gICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4ZTAsdGVtcCk7CisgICAgIGRhdGEgPSBkYXRhICogVkNMSyAqIGNvbG9ydGg7CisgICAgIHRlbXAgPSBkYXRhICUgKE1DTEsgPDwgNCk7CisgICAgIGRhdGEgPSBkYXRhIC8gKE1DTEsgPDwgNCk7CisgICAgIGlmKHRlbXApIGRhdGErKzsKIAotICAgIGlmKCAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzYzMCkgJiYKLSAgICAgICAgKEh3SW5mby0+akNoaXBSZXZpc2lvbiA+PSAweDMwKSApIC8qIDYzMHMsIE5PVCA3MzAgKi8KLSAgICB7Ci0gICAJaWYoZGF0YSA+IDB4MTMpIGRhdGEgPSAweDEzOwotICAgIH0KLSAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDIsMHhlMCxkYXRhKTsKKyAgICAgaWYoZGF0YSA8IDYpIGRhdGEgPSA2OworICAgICBlbHNlIGlmKGRhdGEgPiAweDE0KSBkYXRhID0gMHgxNDsKKworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU18zMDApIHsKKyAgICAgICAgdGVtcCA9IDB4MTY7CisJaWYoKGRhdGEgPD0gMHgwZikgfHwgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHgxMDI0KSkKKwkgICB0ZW1wID0gMHgxMzsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgdGVtcCA9IDB4MTY7CisJaWYoKCAoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNjMwKSB8fAorCSAgICAgKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzczMCkgKSAgJiYKKwkgICAoU2lTX1ByLT5DaGlwUmV2aXNpb24gPj0gMHgzMCkpCisJICAgdGVtcCA9IDB4MWI7CisgICAgIH0KKyAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4ZTAsdGVtcCk7CisKKyAgICAgaWYoKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzYzMCkgJiYKKwkoU2lTX1ByLT5DaGlwUmV2aXNpb24gPj0gMHgzMCkpIHsKKwlpZihkYXRhID4gMHgxMykgZGF0YSA9IDB4MTM7CisgICAgIH0KKyAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAyLDB4ZTAsZGF0YSk7CiAKICAgfSBlbHNlIHsgIC8qIElmIG1vZGUgPD0gMHgxMywgd2UganVzdCByZXN0b3JlIGV2ZXJ5dGhpbmcgKi8KIAotICAgIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gUHJvZ3JhbW1pbmdDUlQyOwotICAgIFNpU19Qci0+U2lTX1NlbGVjdENSVDJSYXRlID0gU2VsZWN0UmF0ZV9iYWNrdXA7CisgICAgIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gUHJvZ3JhbW1pbmdDUlQyOworICAgICBTaVNfUHItPlNpU19TZWxlY3RDUlQyUmF0ZSA9IFNlbGVjdFJhdGVfYmFja3VwOwogCiAgIH0KIH0KQEAgLTUyNzgsMTAgKzUyNjcsMTAgQEAKIC8qIFNldCBDUlQyIEZJRk8gb24gMzE1LzMzMCBzZXJpZXMgKi8KICNpZmRlZiBTSVMzMTVICiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDJGSUZPXzMxMChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldENSVDJGSUZPXzMxMChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMSwweDNCKTsKLSAgaWYoIChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzYwKSAgICAgICYmCisgIGlmKCAoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzYwKSAgICAgICYmCiAgICAgICAoU2lTX1ByLT5TaVNfU3lzRmxhZ3MgJiBTRl83NjBMRkIpICAmJgogICAgICAgKFNpU19Qci0+U2lTX01vZGVUeXBlID09IE1vZGUzMkJwcCkgJiYKICAgICAgIChTaVNfUHItPlNpU19WR0FIREUgPj0gMTI4MCkJICAmJgpAQCAtNTI5OSwzMzcgKzUyODgsMTYyIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIFVTSE9SVAotU2lTX0dldFZHQUhUMihTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfR2V0VkdBSFQyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVTE9ORyB0ZW1wYXgsdGVtcGJ4OworICB1bnNpZ25lZCBpbnQgdGVtcGF4LHRlbXBieDsKIAogICB0ZW1wYnggPSAoU2lTX1ByLT5TaVNfVkdBVlQgLSBTaVNfUHItPlNpU19WR0FWREUpICogU2lTX1ByLT5TaVNfUlZCSENNQVg7CiAgIHRlbXBheCA9IChTaVNfUHItPlNpU19WVCAtIFNpU19Qci0+U2lTX1ZERSkgKiBTaVNfUHItPlNpU19SVkJIQ0ZBQ1Q7CiAgIHRlbXBheCA9ICh0ZW1wYXggKiBTaVNfUHItPlNpU19IVCkgLyB0ZW1wYng7Ci0gIHJldHVybigoVVNIT1JUKXRlbXBheCk7CisgIHJldHVybiAodW5zaWduZWQgc2hvcnQpdGVtcGF4OwogfQogCiAvKiBTZXQgUGFydCAxIC8gU2lTIGJyaWRnZSBzbGF2ZSBtb2RlICovCiBzdGF0aWMgdm9pZAotU2lTX1NldEdyb3VwMV8zMDEoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvLFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCitTaVNfU2V0R3JvdXAxXzMwMShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewotICBVU0hPUlQgIHB1c2gxLHB1c2gyOwotICBVU0hPUlQgIHRlbXBheCx0ZW1wYngsdGVtcGN4LHRlbXA7Ci0gIFVTSE9SVCAgcmVzaW5mbyxtb2RlZmxhZyx4cmVzPTA7Ci0gIHVuc2lnbmVkIGNoYXIgcDFfNywgcDFfODsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcCwgbW9kZWZsYWcsIGksIGosIHhyZXM9MCwgVkdBVkRFOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgQ1JUcmFuc2xhdGlvbltdID0geworICAgICAgIC8qIENSMCAgIENSMSAgIENSMiAgIENSMyAgIENSNCAgIENSNSAgIENSNiAgIENSNyAgICovCisJICAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLAorICAgICAgIC8qIENSOCAgIENSOSAgIFNSMEEgIFNSMEIgIFNSMEMgIFNSMEQgIFNSMEUgIENSMEYgICovCisJICAweDAwLCAweDBiLCAweDE3LCAweDE4LCAweDE5LCAweDAwLCAweDFhLCAweDAwLAorICAgICAgIC8qIENSMTAgIENSMTEgIENSMTIgIENSMTMgIENSMTQgIENSMTUgIENSMTYgIENSMTcgICovCisJICAweDBjLCAweDBkLCAweDBlLCAweDAwLCAweDBmLCAweDEwLCAweDExLCAweDAwCisgIH07CiAKICAgaWYoTW9kZU5vIDw9IDB4MTMpIHsKICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOwotICAgICByZXNpbmZvID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9SZXNJbmZvOwogICB9IGVsc2UgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CiAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5DTW9kZUZsYWc7Ci0gICAgIHJlc2luZm8gPSAwOwogICAgICB4cmVzID0gU2lTX1ByLT5DSERpc3BsYXk7CiAgIH0gZWxzZSB7CiAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICAgIHJlc2luZm8gPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9SRVNJTkZPOwogICAgICB4cmVzID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5YUmVzOwogICB9CiAKICAgLyogVGhlIGZvbGxvd2luZyBpcyBvbmx5IGRvbmUgaWYgYnJpZGdlIGlzIGluIHNsYXZlIG1vZGU6ICovCiAKLSAgaWYoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpICYmIChNb2RlTm8gPiAweDEzKSkgewotICAgICBpZih4cmVzID49IDE2MDApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICBpZih4cmVzID49IDE2MDApIHsgIC8qIEJJT1M6ID09IDE2MDAgKi8KICAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgzMSwweDA0KTsKICAgICAgfQogICB9CiAKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMywweGZmKTsgICAgICAgICAgICAgICAgICAvKiBzZXQgTUFYIEhUICovCisgIFNpU19Qci0+Q0hUb3RhbCA9IDgyMjQ7ICAvKiBNYXggSFQsIDB4MjAyMCwgcmVzdWx0cyBpbiAweDNmZiBpbiByZWdpc3RlcnMgKi8KIAotICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpICBtb2RlZmxhZyB8PSBDaGFyeDhEb3Q7CisgIFNpU19Qci0+Q0hEaXNwbGF5ID0gU2lTX1ByLT5TaVNfVkdBSERFOworICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSBTaVNfUHItPkNIRGlzcGxheSA+Pj0gMTsKIAotICBpZihtb2RlZmxhZyAmIENoYXJ4OERvdCkgdGVtcGN4ID0gMHgwODsKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgIHRlbXBjeCA9IDB4MDk7Ci0KLSAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfVkdBSERFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiAweDA0IEhvcml6b250YWwgRGlzcGxheSBFbmQgKi8KLSAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgdGVtcGF4ID4+PSAxOwotICB0ZW1wYXggPSAoKHRlbXBheCAvIHRlbXBjeCkgLSAxKSAmIDB4ZmY7Ci0gIHRlbXBieCA9IHRlbXBheDsKLQotICB0ZW1wID0gdGVtcGF4OwotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDA0LHRlbXApOwotCisgIFNpU19Qci0+Q0hCbGFua1N0YXJ0ID0gU2lTX1ByLT5DSERpc3BsYXk7CiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSkgewotICAgICAgICB0ZW1wICs9IDI7Ci0gICAgIH0KLSAgfQotICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgewotICAgICBpZihyZXNpbmZvID09IFNJU19SSV84MDB4NjAwKSB0ZW1wIC09IDI7Ci0gIH0KLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwNSx0ZW1wKTsgICAgICAgICAgICAgICAgIC8qIDB4MDUgSG9yaXpvbnRhbCBEaXNwbGF5IFN0YXJ0ICovCi0KLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwNiwweDAzKTsgICAgICAgICAgICAgICAgIC8qIDB4MDYgSG9yaXpvbnRhbCBCbGFuayBlbmQgICAgICovCi0KLSAgdGVtcGF4ID0gMHhGRkZGOwotICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgdGVtcGF4ID0gU2lTX0dldFZHQUhUMihTaVNfUHIpOwotICBpZih0ZW1wYXggPj0gU2lTX1ByLT5TaVNfVkdBSFQpIHRlbXBheCA9IFNpU19Qci0+U2lTX1ZHQUhUOwotICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSAgICAgICAgIHRlbXBheCA+Pj0gMTsKLSAgdGVtcGF4ID0gKHRlbXBheCAvIHRlbXBjeCkgLSA1OwotICB0ZW1wY3ggPSB0ZW1wYXg7Ci0KLSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKLSAgICAgdGVtcCA9IHRlbXBjeCAtIDE7Ci0gICAgIGlmKCEobW9kZWZsYWcgJiBIYWxmRENMSykpIHsKLSAgICAgICAgdGVtcCAtPSA2OwotICAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFRWU2ltdU1vZGUpIHsKLSAgICAgICAgICAgdGVtcCAtPSAyOwotICAgICAgICAgICBpZihNb2RlTm8gPiAweDEzKSB0ZW1wIC09IDEwOwotICAgICAgICB9Ci0gICAgIH0KLSAgfSBlbHNlIHsKLSAgICAgdGVtcGN4ID0gKHRlbXBjeCArIHRlbXBieCkgPj4gMTsKLSAgICAgdGVtcCA9ICh0ZW1wY3ggJiAweDAwRkYpICsgMjsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKLSAgICAgICAgdGVtcC0tOwotICAgICAgICBpZighKG1vZGVmbGFnICYgSGFsZkRDTEspKSB7Ci0gICAgICAgICAgIGlmKChtb2RlZmxhZyAmIENoYXJ4OERvdCkpIHsKLSAgICAgICAgICAgICAgdGVtcCArPSA0OwotICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgPj0gODAwKSB0ZW1wIC09IDY7Ci0gICAgICAgICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0JICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBSERFID09IDgwMCkgdGVtcCArPSAyOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICB9IGVsc2UgewotICAgICAgICBpZighKG1vZGVmbGFnICYgSGFsZkRDTEspKSB7Ci0gICAgICAgICAgIHRlbXAgLT0gNDsKLSAgICAgICAgICAgaWYoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTI4MHg5NjApICYmCi0JICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTYwMHgxMjAwKSkgewotICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgPj0gODAwKSB7Ci0gICAgICAgICAgICAgICAgIHRlbXAgLT0gNzsKLQkgICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlID09IE1vZGVFR0EpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDEwMjQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCArPSAxNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAhPSBQYW5lbF8xMjgweDEwMjQpCi0JCSAgCSAgICAgdGVtcCArPSA3OwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICB9Ci0JCSBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvICE9IFBhbmVsXzE0MDB4MTA1MCkgewotICAgICAgICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgPj0gMTI4MCkgewotICAgICAgICAgICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgdGVtcCArPSAyODsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICB9CisgICAgIFNpU19Qci0+Q0hCbGFua1N0YXJ0ICs9IDE2OwogICB9CiAKLSAgcDFfNyA9IHRlbXA7Ci0gIHAxXzggPSAweDAwOwotCi0gIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgewotICAgICAgICBpZihNb2RlTm8gPD0gMHgwMSkgewotCSAgIHAxXzcgPSAweDJhOwotCSAgIGlmKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpKSBwMV84ID0gMHg2MTsKLQkgICBlbHNlIAkgICAgICAJCQlwMV84ID0gMHg0MTsKLQl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPT0gTW9kZVRleHQpIHsKLQkgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSkgcDFfNyA9IDB4NTQ7Ci0JICAgZWxzZSAJICAgIAkJCXAxXzcgPSAweDU1OwotCSAgIHAxXzggPSAweDAwOwotCX0gZWxzZSBpZihNb2RlTm8gPD0gMHgxMykgewotCSAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHsKLQkgICAgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSkgewotCQkgcDFfNyA9IDB4MzA7Ci0JCSBwMV84ID0gMHgwMzsKLQkgICAgICB9IGVsc2UgewotCSAJIHAxXzcgPSAweDJmOwotCQkgcDFfOCA9IDB4MDI7Ci0JICAgICAgfQotCSAgIH0gZWxzZSB7Ci0JICAgICAgcDFfNyA9IDB4NWI7Ci0JICAgICAgcDFfOCA9IDB4MDM7Ci0JICAgfQotCX0gZWxzZSBpZiggKChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYKLQkgICAgICAgICAgICAoKE1vZGVObyA9PSAweDUwKSB8fCAoTW9kZU5vID09IDB4NTYpIHx8IChNb2RlTm8gPT0gMHg1MykpKSB8fAotCSAgICAgICAgICAgKChId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSAmJgotCQkgICAgKHJlc2luZm8gPT0gU0lTX1JJXzMyMHgyMDAgfHwgcmVzaW5mbyA9PSBTSVNfUklfMzIweDI0MCkpICkgewotCSAgIGlmKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpKSB7Ci0JICAgICAgcDFfNyA9IDB4MzAsCi0JICAgICAgcDFfOCA9IDB4MDM7Ci0JICAgfSBlbHNlIHsKLQkgICAgICBwMV83ID0gMHgyZjsKLQkgICAgICBwMV84ID0gMHgwMzsKLQkgICB9Ci0gICAgICAgIH0KLSAgICAgfQotICB9Ci0KLSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI1MjVwfFRWU2V0WVBiUHI3NTBwKSkgewotICAgICAgICBwMV83ID0gMHg2MzsKLQlpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgcDFfNyA9IDB4NTU7Ci0gICAgIH0KLSAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSB7Ci0gICAgICAgIGlmKCEobW9kZWZsYWcgJiBIYWxmRENMSykpIHsKLQkgICBwMV83ID0gMHhiMjsKLQkgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgewotCSAgICAgIHAxXzcgPSAweGFiOwotCSAgIH0KLQl9Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVwKSB7Ci0JICAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgcDFfNyA9IDB4MzA7Ci0JfQotICAgICB9Ci0gIH0KLQotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDA3LHAxXzcpOwkJCS8qIDB4MDcgSG9yaXpvbnRhbCBSZXRyYWNlIFN0YXJ0ICovCi0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDgscDFfOCk7CQkJLyogMHgwOCBIb3Jpem9udGFsIFJldHJhY2UgRW5kICAgKi8KLQotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDE4LDB4MDMpOyAgICAgICAgICAgICAgICAJLyogMHgxOCBTUjA4IChGSUZPIFRocmVzaG9sZD8pICAgKi8KLQotICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDE5LDB4RjApOwotCi0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDksMHhGRik7ICAgICAgICAgICAgICAgIAkvKiAweDA5IFNldCBNYXggVlQgICAgKi8KLQotICB0ZW1wY3ggPSAweDEyMTsKLSAgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfVkdBVkRFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogMHgwRSBWZXJ0aWNhbCBEaXNwbGF5IEVuZCAqLwotICBpZiAgICAgKHRlbXBieCA9PSAzNTcpIHRlbXBieCA9IDM1MDsKLSAgZWxzZSBpZih0ZW1wYnggPT0gMzYwKSB0ZW1wYnggPSAzNTA7Ci0gIGVsc2UgaWYodGVtcGJ4ID09IDM3NSkgdGVtcGJ4ID0gMzUwOwotICBlbHNlIGlmKHRlbXBieCA9PSA0MDUpIHRlbXBieCA9IDQwMDsKLSAgZWxzZSBpZih0ZW1wYnggPT0gNDIwKSB0ZW1wYnggPSA0MDA7Ci0gIGVsc2UgaWYodGVtcGJ4ID09IDUyNSkgdGVtcGJ4ID0gNDgwOwotICBwdXNoMiA9IHRlbXBieDsKKyAgU2lTX1ByLT5DSEJsYW5rRW5kID0gMzI7CiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEwMjR4NzY4KSB7Ci0gICAgICAJaWYoIShTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykpIHsKLSAgICAgICAgICAgaWYgICAgICh0ZW1wYnggPT0gMzUwKSB0ZW1wYnggKz0gNTsKLSAgICAgICAgICAgZWxzZSBpZih0ZW1wYnggPT0gNDgwKSB0ZW1wYnggKz0gNTsKLSAgICAgIAl9Ci0gICAgIH0KKyAgICAgaWYoeHJlcyA9PSAxNjAwKSBTaVNfUHItPkNIQmxhbmtFbmQgKz0gODA7CiAgIH0KLSAgdGVtcGJ4IC09IDI7Ci0gIHRlbXAgPSB0ZW1wYnggJiAweDAwRkY7Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTAsdGVtcCk7ICAgICAgICAJCS8qIDB4MTAgdmVydGljYWwgQmxhbmsgU3RhcnQgKi8KIAotICB0ZW1wYnggPSBwdXNoMjsKLSAgdGVtcGJ4LS07Ci0gIHRlbXAgPSB0ZW1wYnggJiAweDAwRkY7Ci0jaWYgMAotICAvKiBNaXNzaW5nIGNvZGUgZnJvbSA2MzAvMzAxQiAyLjA0LjVhIGFuZCA2NTAvMzAyTFYgMS4xMC42cyAoY2FsbGVzIGludCAyZikgKi8KLSAgaWYoeHh4KCkpIHsKLSAgICAgIGlmKHRlbXAgPT0gMHhkZikgdGVtcCA9IDB4ZGE7CisgIHRlbXAgPSBTaVNfUHItPlNpU19WR0FIVCAtIDk2OworICBpZighKG1vZGVmbGFnICYgSGFsZkRDTEspKSB0ZW1wIC09IDMyOworICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSB7CisgICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgwNCk7CisgICAgIHRlbXAgfD0gKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwYikgJiAweGMwKSA8PCAyKTsKKyAgICAgdGVtcCAtPSAzOworICAgICB0ZW1wIDw8PSAzOworICB9IGVsc2UgeworICAgICBpZihTaVNfUHItPlNpU19SVkJIUlMyKSB0ZW1wID0gU2lTX1ByLT5TaVNfUlZCSFJTMjsKICAgfQotI2VuZGlmCi0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MEUsdGVtcCk7CisgIFNpU19Qci0+Q0hTeW5jU3RhcnQgPSB0ZW1wOworCisgIFNpU19Qci0+Q0hTeW5jRW5kID0gMHhmZmU4OyAJLyogcmVzdWx0cyBpbiAweDIwMDAgaW4gcmVnaXN0ZXJzICovCisKKyAgU2lTX1ByLT5DVlRvdGFsID0gMjA0OTsgIAkvKiBNYXggVlQsIDB4MDgwMSwgcmVzdWx0cyBpbiAweDdmZiBpbiByZWdpc3RlcnMgKi8KKworICBWR0FWREUgPSBTaVNfUHItPlNpU19WR0FWREU7CisgIGlmICAgICAoVkdBVkRFID09ICAzNTcpIFZHQVZERSA9ICAzNTA7CisgIGVsc2UgaWYoVkdBVkRFID09ICAzNjApIFZHQVZERSA9ICAzNTA7CisgIGVsc2UgaWYoVkdBVkRFID09ICAzNzUpIFZHQVZERSA9ICAzNTA7CisgIGVsc2UgaWYoVkdBVkRFID09ICA0MDUpIFZHQVZERSA9ICA0MDA7CisgIGVsc2UgaWYoVkdBVkRFID09ICA0MjApIFZHQVZERSA9ICA0MDA7CisgIGVsc2UgaWYoVkdBVkRFID09ICA1MjUpIFZHQVZERSA9ICA0ODA7CisgIGVsc2UgaWYoVkdBVkRFID09IDEwNTYpIFZHQVZERSA9IDEwMjQ7CisgIFNpU19Qci0+Q1ZEaXNwbGF5ID0gVkdBVkRFOworCisgIFNpU19Qci0+Q1ZCbGFua1N0YXJ0ID0gU2lTX1ByLT5DVkRpc3BsYXk7CisKKyAgU2lTX1ByLT5DVkJsYW5rRW5kID0gMTsKKyAgaWYoTW9kZU5vID09IDB4M2MpIFNpU19Qci0+Q1ZCbGFua0VuZCA9IDIyNjsKKworICB0ZW1wID0gKFNpU19Qci0+U2lTX1ZHQVZUIC0gVkdBVkRFKSA+PiAxOworICBTaVNfUHItPkNWU3luY1N0YXJ0ID0gVkdBVkRFICsgdGVtcDsKKworICB0ZW1wID4+PSAzOworICBTaVNfUHItPkNWU3luY0VuZCA9IFNpU19Qci0+Q1ZTeW5jU3RhcnQgKyB0ZW1wOworCisgIFNpU19DYWxjQ1JSZWdpc3RlcnMoU2lTX1ByLCAwKTsKKyAgU2lTX1ByLT5DQ1JUMUNSVENbMTZdICY9IH4weEUwOworCisgIGZvcihpID0gMDsgaSA8PSA3OyBpKyspIHsKKyAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsQ1JUcmFuc2xhdGlvbltpXSxTaVNfUHItPkNDUlQxQ1JUQ1tpXSk7CisgIH0KKyAgZm9yKGkgPSAweDEwLCBqID0gODsgaSA8PSAweDEyOyBpKyssIGorKykgeworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxDUlRyYW5zbGF0aW9uW2ldLFNpU19Qci0+Q0NSVDFDUlRDW2pdKTsKKyAgfQorICBmb3IoaSA9IDB4MTUsIGogPSAxMTsgaSA8PSAweDE2OyBpKyssIGorKykgeworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxDUlRyYW5zbGF0aW9uW2ldLFNpU19Qci0+Q0NSVDFDUlRDW2pdKTsKKyAgfQorICBmb3IoaSA9IDB4MGEsIGogPSAxMzsgaSA8PSAweDBjOyBpKyssIGorKykgeworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxDUlRyYW5zbGF0aW9uW2ldLFNpU19Qci0+Q0NSVDFDUlRDW2pdKTsKKyAgfQorCisgIHRlbXAgPSBTaVNfUHItPkNDUlQxQ1JUQ1sxNl0gJiAweEUwOworICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LENSVHJhbnNsYXRpb25bMHgwRV0sMHgxRix0ZW1wKTsKKworICB0ZW1wID0gKFNpU19Qci0+Q0NSVDFDUlRDWzE2XSAmIDB4MDEpIDw8IDU7CisgIGlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHRlbXAgfD0gMHg4MDsKKyAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxDUlRyYW5zbGF0aW9uWzB4MDldLDB4NUYsdGVtcCk7CiAKICAgdGVtcCA9IDA7Ci0gIGlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHRlbXAgfD0gMHg4MDsKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgewotICAgICBpZih0ZW1wYnggJiAweDAyMDApICAgICAgICB0ZW1wIHw9IDB4MjA7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwQiwweDVGLHRlbXApOwotICAgICBpZih0ZW1wYnggJiAweDAxMDApICB0ZW1wY3ggfD0gMHgwMDBhOwotICAgICBpZih0ZW1wYnggJiAweDA0MDApICB0ZW1wY3ggfD0gMHgxMjAwOwotICB9IGVsc2UgewotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDBCLHRlbXApOwotICAgICBpZih0ZW1wYnggJiAweDAxMDApICB0ZW1wY3ggfD0gMHgwMDAyOwotICAgICBpZih0ZW1wYnggJiAweDA0MDApICB0ZW1wY3ggfD0gMHgwNjAwOwotICB9CisgIHRlbXAgfD0gKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDAxKSAmIDB4MDEpOworICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB0ZW1wIHw9IDB4MDg7CisgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTYsdGVtcCk7ICAgICAgICAgICAgICAJLyogU1IwMTogSGFsZkRDTEtbM10sIDgvOSBkaXYgZG90Y2xvY2tbMF0gKi8KIAotICBpZih0ZW1wYnggJiAweDAyMDApICB0ZW1wY3ggfD0gMHgwMDQwOworICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDBGLDB4MDApOyAgICAgICAgICAgICAgCS8qIENSMTQ6ICh0ZXh0IG1vZGU6IHVuZGVybGluZSBsb2NhdGlvbikgKi8KKyAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxMiwweDAwKTsgICAgICAgICAgICAgIAkvKiBDUjE3OiBuL2EgKi8KIAotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDExLDB4MDApOyAgICAgICAgICAgICAgICAJLyogMHgxMSBWZXJ0aWNhbCBCbGFuayBFbmQgKi8KLQotICB0ZW1wYXggPSAoU2lTX1ByLT5TaVNfVkdBVlQgLSB0ZW1wYngpID4+IDI7Ci0KLSAgaWYoKE1vZGVObyA+IDB4MTMpIHx8IChId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSkgewotICAgICBpZihyZXNpbmZvICE9IFNJU19SSV8xMjgweDEwMjQpIHsKLQl0ZW1wYnggKz0gKHRlbXBheCA8PCAxKTsKLSAgICAgfQotICB9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAhPSBQYW5lbF8xNDAweDEwNTApIHsKLQl0ZW1wYnggKz0gKHRlbXBheCA8PCAxKTsKLSAgICAgfQotICB9Ci0KLSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKLSAgICAgdGVtcGJ4IC09IDEwOwotICB9IGVsc2UgewotICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFRWU2ltdU1vZGUpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKLSAgICAgICAgICAgdGVtcGJ4ICs9IDQwOwotCSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0JICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBSERFID09IDgwMCkgdGVtcGJ4ICs9IDEwOwotCSAgIH0KLQl9Ci0gICAgIH0KLSAgfQotICB0ZW1wYXggPj49IDI7Ci0gIHRlbXBheCsrOwotICB0ZW1wYXggKz0gdGVtcGJ4OwotICBwdXNoMSA9IHRlbXBheDsKLSAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKLSAgICAgaWYodGVtcGJ4IDw9IDUxMykgIHsKLSAgICAgCWlmKHRlbXBheCA+PSA1MTMpIHRlbXBieCA9IDUxMzsKLSAgICAgfQotICB9Ci0gIHRlbXAgPSB0ZW1wYnggJiAweDAwRkY7Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MEMsdGVtcCk7CQkJLyogMHgwQyBWZXJ0aWNhbCBSZXRyYWNlIFN0YXJ0ICovCi0KLSAgdGVtcGJ4LS07Ci0gIHRlbXAgPSB0ZW1wYnggJiAweDAwRkY7Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTAsdGVtcCk7Ci0KLSAgaWYodGVtcGJ4ICYgMHgwMTAwKSB0ZW1wY3ggfD0gMHgwMDA4OwotCi0gIGlmKHRlbXBieCAmIDB4MDIwMCkgewotICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MEIsMHgyMCk7Ci0gIH0KLSAgdGVtcGJ4Kys7Ci0KLSAgaWYodGVtcGJ4ICYgMHgwMTAwKSB0ZW1wY3ggfD0gMHgwMDA0OwotICBpZih0ZW1wYnggJiAweDAyMDApIHRlbXBjeCB8PSAweDAwODA7Ci0gIGlmKHRlbXBieCAmIDB4MDQwMCkgewotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSAgICAgICAgdGVtcGN4IHw9IDB4MDgwMDsKLSAgICAgZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDEpIHRlbXBjeCB8PSAweDA4MDA7Ci0gICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wY3ggfD0gMHgwQzAwOwotICB9Ci0KLSAgdGVtcGJ4ID0gcHVzaDE7Ci0gIHRlbXAgPSB0ZW1wYnggJiAweDAwMEY7Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MEQsdGVtcCk7ICAgICAgICAJCS8qIDB4MEQgdmVydGljYWwgUmV0cmFjZSBFbmQgKi8KLQotICBpZih0ZW1wYnggJiAweDAwMTApIHRlbXBjeCB8PSAweDIwMDA7Ci0KLSAgdGVtcCA9IHRlbXBjeCAmIDB4MDBGRjsKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwQSx0ZW1wKTsgICAgICAgICAgICAgIAkvKiAweDBBIENSMDcgKi8KLQotICB0ZW1wID0gKHRlbXBjeCAmIDB4RkYwMCkgPj4gODsKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxNyx0ZW1wKTsgICAgICAgICAgICAgIAkvKiAweDE3IFNSMEEgKi8KLQotICB0ZW1wYXggPSBtb2RlZmxhZzsKLSAgdGVtcCA9ICh0ZW1wYXggJiAweEZGMDApID4+IDg7Ci0gIHRlbXAgPSAodGVtcCA+PiAxKSAmIDB4MDk7Ci0gIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSkgdGVtcCB8PSAweDAxOwkJLyogQWx3YXlzIDggZG90Y2xvY2sgKi8KLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxNix0ZW1wKTsgICAgICAgICAgICAgIAkvKiAweDE2IFNSMDEgKi8KLQotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDBGLDB4MDApOyAgICAgICAgICAgICAgCS8qIDB4MEYgQ1IxNCAqLwotCi0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTIsMHgwMCk7ICAgICAgICAgICAgICAJLyogMHgxMiBDUjE3ICovCi0KLSAgdGVtcCA9IDB4MDA7CisgIHRlbXAgPSAwOwogICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpIHsKLSAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCkgJiAweDAxKSB7Ci0JdGVtcCA9IDB4ODA7Ci0gICAgIH0KKyAgICAgdGVtcCA9IChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKSAmIDB4MDEpIDw8IDc7CiAgIH0KLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxQSx0ZW1wKTsgICAgICAgICAgICAgICAgCS8qIDB4MUEgU1IwRSAqLworICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFBLHRlbXApOyAgICAgICAgICAgICAgICAJLyogU1IwRSwgZGl0aGVyWzddICovCiAKICAgdGVtcCA9IFNpU19HZXRSZWdCeXRlKChTaVNfUHItPlNpU19QM2NhKzB4MDIpKTsKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxYix0ZW1wKTsKKyAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxYix0ZW1wKTsJCQkvKiA/ICovCisKKyNpZmRlZiBTSVNfWE9SR19YRjg2CisjaWZkZWYgVFdERUJVRworICAgeGY4NkRydk1zZygwLCBYX0lORk8sICIlZCAlZCAlZCAlZCAgJWQgJWQgJWQgJWQgICglZCAlZCAlZCAlZClcbiIsCisJU2lTX1ByLT5DSERpc3BsYXksIFNpU19Qci0+Q0hTeW5jU3RhcnQsIFNpU19Qci0+Q0hTeW5jRW5kLCBTaVNfUHItPkNIVG90YWwsCisJU2lTX1ByLT5DVkRpc3BsYXksIFNpU19Qci0+Q1ZTeW5jU3RhcnQsIFNpU19Qci0+Q1ZTeW5jRW5kLCBTaVNfUHItPkNWVG90YWwsCisJU2lTX1ByLT5DSEJsYW5rU3RhcnQsIFNpU19Qci0+Q0hCbGFua0VuZCwgU2lTX1ByLT5DVkJsYW5rU3RhcnQsIFNpU19Qci0+Q1ZCbGFua0VuZCk7CisKKyAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiIHt7MHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCxcbiIsCisJU2lTX1ByLT5DQ1JUMUNSVENbMF0sIFNpU19Qci0+Q0NSVDFDUlRDWzFdLAorCVNpU19Qci0+Q0NSVDFDUlRDWzJdLCBTaVNfUHItPkNDUlQxQ1JUQ1szXSwKKwlTaVNfUHItPkNDUlQxQ1JUQ1s0XSwgU2lTX1ByLT5DQ1JUMUNSVENbNV0sCisJU2lTX1ByLT5DQ1JUMUNSVENbNl0sIFNpU19Qci0+Q0NSVDFDUlRDWzddKTsKKyAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiICAgMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCxcbiIsCisJU2lTX1ByLT5DQ1JUMUNSVENbOF0sIFNpU19Qci0+Q0NSVDFDUlRDWzldLAorCVNpU19Qci0+Q0NSVDFDUlRDWzEwXSwgU2lTX1ByLT5DQ1JUMUNSVENbMTFdLAorCVNpU19Qci0+Q0NSVDFDUlRDWzEyXSwgU2lTX1ByLT5DQ1JUMUNSVENbMTNdLAorCVNpU19Qci0+Q0NSVDFDUlRDWzE0XSwgU2lTX1ByLT5DQ1JUMUNSVENbMTVdKTsKKyAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiICAgMHglMDJ4fX0sXG4iLCBTaVNfUHItPkNDUlQxQ1JUQ1sxNl0pOworI2VuZGlmCisjZW5kaWYKIH0KIAogLyogU2V0dXAgcGFuZWwgbGluawpAQCAtNTYzNywxOCArNTQ1MSwxOCBAQAogICogMzAwL0xWRFMrVFYsIDMwMC8zMDFCLURILCAzMTUvTFZEUytUViwgMzE1L0xDREEKICAqLwogc3RhdGljIHZvaWQKLVNpU19TZXRHcm91cDFfTFZEUyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgUFNJU19IV19JTkZPIEh3SW5mbywgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCkKK1NpU19TZXRHcm91cDFfTFZEUyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewotICBVU0hPUlQgbW9kZWZsYWcscmVzaW5mbzsKLSAgVVNIT1JUIHB1c2gyLHRlbXBheCx0ZW1wYngsdGVtcGN4LHRlbXA7Ci0gIFVMT05HIHRlbXBlYXg9MCx0ZW1wZWJ4LHRlbXBlY3gsdGVtcHZjZmFjdD0wOworICB1bnNpZ25lZCBzaG9ydCBtb2RlZmxhZywgcmVzaW5mbyA9IDA7CisgIHVuc2lnbmVkIHNob3J0IHB1c2gyLCB0ZW1wYXgsIHRlbXBieCwgdGVtcGN4LCB0ZW1wOworICB1bnNpZ25lZCBpbnQgICB0ZW1wZWF4ID0gMCwgdGVtcGVieCwgdGVtcGVjeCwgdGVtcHZjZmFjdCA9IDA7CiAgIEJPT0xFQU4gaXNsdmRzID0gRkFMU0UsIGlzc2lzICA9IEZBTFNFLCBjaGtkY2xrZmlyc3QgPSBGQUxTRTsKICNpZmRlZiBTSVMzMDAKLSAgVVNIT1JUIGNydDJjcnRjOworICB1bnNpZ25lZCBzaG9ydCBjcnQyY3J0YyA9IDA7CiAjZW5kaWYKICNpZmRlZiBTSVMzMTVICi0gIFVTSE9SVCBwdXNoY3g7CisgIHVuc2lnbmVkIHNob3J0IHB1c2hjeDsKICNlbmRpZgogCiAgIGlmKE1vZGVObyA8PSAweDEzKSB7CkBAIC01NjU5LDE1ICs1NDczLDExIEBACiAjZW5kaWYKICAgfSBlbHNlIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogICAgICBtb2RlZmxhZyA9IFNpU19Qci0+Q01vZGVGbGFnOwotICAgICByZXNpbmZvID0gMDsKLSNpZmRlZiBTSVMzMDAKLSAgICAgY3J0MmNydGMgPSAwOwotI2VuZGlmCiAgIH0gZWxzZSB7CiAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7CiAgICAgIHJlc2luZm8gPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9SRVNJTkZPOwogI2lmZGVmIFNJUzMwMAotICAgICBjcnQyY3J0YyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfQ1JUMkNSVEM7CisgICAgIGNydDJjcnRjID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfQ1JUMkNSVEM7CiAjZW5kaWYKICAgfQogCkBAIC01NjgxLDE0ICs1NDkxLDE0IEBACiAgICAgIGlzc2lzID0gVFJVRTsKICAgfQogCi0gIGlmKChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKGlzbHZkcykgJiYgKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpKSB7CisgIGlmKChTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSAmJiAoaXNsdmRzKSAmJiAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkpIHsKICAgICAgaWYoKCFTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgJiYgKCFTaVNfUHItPlNpU19JRl9ERUZfRFNUTikpIHsKICAgICAgICAgY2hrZGNsa2ZpcnN0ID0gVFJVRTsKICAgICAgfQogICB9CiAKICNpZmRlZiBTSVMzMTVICi0gIGlmKChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7CisgIGlmKChTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKICAgICAgaWYoSVNfU0lTMzMwKSB7CiAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRCwweDEwKTsKICAgICAgfSBlbHNlIGlmKElTX1NJUzc0MCkgewpAQCAtNTcwNCw3ICs1NTE0LDcgQEAKIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MkQsMHgwMCk7CiAgICAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewogICAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJELDB4MGYpOwotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUMpIHsKKwkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhDKSB7CiAJICAgICAgaWYoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHx8CiAJICAgICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHgxMDI0KSkgewogCSAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRCwweDIwKTsKQEAgLTU3MjAsMTAgKzU1MzAsMTAgQEAKICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfTENESERFUzsKICAgaWYoaXNsdmRzKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgewotICAgICAgICBpZigoIVNpU19Qci0+U2lTX0lGX0RFRl9GU1ROKSAmJiAoIVNpU19Qci0+U2lTX0lGX0RFRl9EU1ROKSkgewotICAgICAgICAgICBpZigoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF82NDB4NDgwKSAmJgotICAgICAgICAgICAgICAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpKSB7Ci0gIAkgICAgICB0ZW1wYXggLT0gODsKKwlpZighU2lTX1ByLT5TaVNfSUZfREVGX0ZTVE4gJiYgIVNpU19Qci0+U2lTX0lGX0RFRl9EU1ROKSB7CisJICAgaWYoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MCkgJiYKKwkgICAgICAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpKSB7CisJICAgICAgdGVtcGF4IC09IDg7CiAJICAgfQogCX0KICAgICAgfQpAQCAtNTczNiwxMyArNTU0NiwxNCBAQAogCiAgIHRlbXBieCA9IFNpU19Qci0+U2lTX0hERTsKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7Ci0gICAgIGlmKChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzY0MHg0ODBfMikgfHwKLSAgICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8zKSkgewotICAgICAgICB0ZW1wYnggPj49IDE7Ci0gICAgIH0KICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkgewogICAgICAgICB0ZW1wYnggPSBTaVNfUHItPlBhbmVsWFJlczsKICAgICAgfQorICAgICBpZigoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8zMjB4MjQwXzEpIHx8CisgICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMikgfHwKKyAgICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8zKSkgeworICAgICAgICB0ZW1wYnggPj49IDE7CisgICAgIH0KICAgfQogCiAgIHRlbXBheCArPSB0ZW1wYng7CkBAIC01NzY3LDI1ICs1NTc4LDI1IEBACiAgIHRlbXAgPSAodGVtcGN4ID4+IDMpICYgMHgwMEZGOwogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OKSB7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHsKLSAgICAgICAgICAgc3dpdGNoKE1vZGVObykgewotICAgICAgICAgICBjYXNlIDB4MDQ6Ci0gICAgICAgICAgIGNhc2UgMHgwNToKLSAgICAgICAgICAgY2FzZSAweDBkOiB0ZW1wID0gMHg1NjsgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgMHgxMDogdGVtcCA9IDB4NjA7IGJyZWFrOwotICAgICAgICAgICBjYXNlIDB4MTM6IHRlbXAgPSAweDVmOyBicmVhazsKLSAgICAgICAgICAgY2FzZSAweDQwOgotICAgICAgICAgICBjYXNlIDB4NDE6Ci0gICAgICAgICAgIGNhc2UgMHg0ZjoKLSAgICAgICAgICAgY2FzZSAweDQzOgotICAgICAgICAgICBjYXNlIDB4NDQ6Ci0gICAgICAgICAgIGNhc2UgMHg2MjoKLSAgICAgICAgICAgY2FzZSAweDU2OgotICAgICAgICAgICBjYXNlIDB4NTM6Ci0gICAgICAgICAgIGNhc2UgMHg1ZDoKLSAgICAgICAgICAgY2FzZSAweDVlOiB0ZW1wID0gMHg1NDsgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQorCWlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHsKKwkgICBzd2l0Y2goTW9kZU5vKSB7CisJICAgY2FzZSAweDA0OgorCSAgIGNhc2UgMHgwNToKKwkgICBjYXNlIDB4MGQ6IHRlbXAgPSAweDU2OyBicmVhazsKKwkgICBjYXNlIDB4MTA6IHRlbXAgPSAweDYwOyBicmVhazsKKwkgICBjYXNlIDB4MTM6IHRlbXAgPSAweDVmOyBicmVhazsKKwkgICBjYXNlIDB4NDA6CisJICAgY2FzZSAweDQxOgorCSAgIGNhc2UgMHg0ZjoKKwkgICBjYXNlIDB4NDM6CisJICAgY2FzZSAweDQ0OgorCSAgIGNhc2UgMHg2MjoKKwkgICBjYXNlIDB4NTY6CisJICAgY2FzZSAweDUzOgorCSAgIGNhc2UgMHg1ZDoKKwkgICBjYXNlIDB4NWU6IHRlbXAgPSAweDU0OyBicmVhazsKKwkgICB9CisJfQogICAgICB9CiAgIH0KICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxNCx0ZW1wKTsJCQkvKiBCUExIUlMgKi8KQEAgLTU3OTMsMTIgKzU2MDQsMTIgQEAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7CiAgICAgIHRlbXAgKz0gMjsKICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkgewotICAgICAgICB0ZW1wICs9IDg7Ci0gICAgICAgIGlmKFNpU19Qci0+UGFuZWxIUkUgIT0gOTk5KSB7Ci0gICAgICAgICAgIHRlbXAgPSB0ZW1wY3ggKyBTaVNfUHItPlBhbmVsSFJFOworCXRlbXAgKz0gODsKKwlpZihTaVNfUHItPlBhbmVsSFJFICE9IDk5OSkgeworCSAgIHRlbXAgPSB0ZW1wY3ggKyBTaVNfUHItPlBhbmVsSFJFOwogCSAgIGlmKHRlbXAgPj0gU2lTX1ByLT5TaVNfSFQpIHRlbXAgLT0gU2lTX1ByLT5TaVNfSFQ7CiAJICAgdGVtcCA+Pj0gMzsKLSAgICAgICAgfQorCX0KICAgICAgfQogICB9IGVsc2UgewogICAgICB0ZW1wICs9IDEwOwpAQCAtNTgwNiw5ICs1NjE3LDYgQEAKIAogICB0ZW1wICY9IDB4MUY7CiAgIHRlbXAgfD0gKCh0ZW1wY3ggJiAweDA3KSA8PCA1KTsKLSNpZiAwCi0gIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9GU1ROKSB0ZW1wID0gMHgyMDsgICAgICAgCQkvKiBXUk9ORz8gQklPUyBsb2FkcyBjbCwgbm90IGFoICovCi0jZW5kaWYKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxNSx0ZW1wKTsJCQkvKiBCUExIUkUgKi8KIAogICAvKiBWZXJ0aWNhbCAqLwpAQCAtNTgyNiw5ICs1NjM0LDkgQEAKICAgcHVzaDIgPSB0ZW1wYng7CiAKICAgdGVtcGN4ID0gU2lTX1ByLT5TaVNfVkdBVlQgLSBTaVNfUHItPlNpU19WR0FWREU7Ci0gIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgewotICAgICAgICBpZighKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSB7CisJaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkgewogCSAgIHRlbXBjeCA9IFNpU19Qci0+U2lTX1ZHQVZUIC0gU2lTX1ByLT5QYW5lbFlSZXM7CiAJfQogICAgICB9CkBAIC01ODQ0LDE5ICs1NjUyLDE5IEBACiAgICAgIGlmKGlzc2lzKSB0ZW1wYngrKzsKICAgfSBlbHNlIHsKICAgICAgdGVtcGJ4ICs9IHRlbXBjeDsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgdGVtcGJ4Kys7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgdGVtcGJ4Kys7CiAgICAgIGVsc2UgaWYoaXNzaXMpICAgICAgICAgICAgICAgICAgIHRlbXBieCsrOwogICB9CiAKLSAgaWYodGVtcGJ4ID49IFNpU19Qci0+U2lTX1ZUKSB0ZW1wYnggLT0gU2lTX1ByLT5TaVNfVlQ7CS8qIEJQTFZSUyAgKi8KKyAgaWYodGVtcGJ4ID49IFNpU19Qci0+U2lTX1ZUKSB0ZW1wYnggLT0gU2lTX1ByLT5TaVNfVlQ7CiAKICAgdGVtcCA9IHRlbXBieCAmIDB4MDBGRjsKICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHsKLSAgICAgICAgaWYoTW9kZU5vID09IDB4MTApIHRlbXAgPSAweGE5OworCWlmKE1vZGVObyA9PSAweDEwKSB0ZW1wID0gMHhhOTsKICAgICAgfQogICB9Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTgsdGVtcCk7CisgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTgsdGVtcCk7CQkJLyogQlBMVlJTICovCiAKICAgdGVtcGN4ID4+PSAzOwogICB0ZW1wY3grKzsKQEAgLTU4NzksMTMgKzU2ODcsMTMgQEAKICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSAhPSBTaVNfUHItPlNpU19WREUpIHRlbXAgfD0gMHg0MDsKICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIEVuYWJsZUxWRFNEREEpICAgICAgICAgIHRlbXAgfD0gMHg0MDsKICAgdGVtcGJ4ID0gMHg4NzsKLSAgaWYoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB8fAotICAgICAoSHdJbmZvLT5qQ2hpcFJldmlzaW9uID49IDB4MzApKSB7CisgIGlmKChTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB8fAorICAgICAoU2lTX1ByLT5DaGlwUmV2aXNpb24gPj0gMHgzMCkpIHsKICAgICAgdGVtcGJ4ID0gMHgwNzsKICAgICAgaWYoKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMSkgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgewogCWlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDApICYgMHgwMykgICAgdGVtcCB8PSAweDgwOwogICAgICB9Ci0gICAgIC8qIENocm9udGVsIDcwMXggb3BlcmF0ZXMgaW4gMjRiaXQgbW9kZSAoOC04LTgsIDJ4MTJiaXQgbXV0bGlwbGV4ZWQpIHZpYSBWR0EyICovCisgICAgIC8qIENocm9udGVsIDcwMXggb3BlcmF0ZXMgaW4gMjRiaXQgbW9kZSAoOC04LTgsIDJ4MTJiaXQgbXVsdGlwbGV4ZWQpIHZpYSBWR0EyICovCiAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RSR0IxOEJpdCkgewogCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKIAkgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNikgJiAweDEwKSAgICAgIHRlbXAgfD0gMHg4MDsKQEAgLTU4OTYsNTkgKzU3MDQsNTggQEAKICAgfQogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MUEsdGVtcGJ4LHRlbXApOwogCi0gIHRlbXBieCA9IHB1c2gyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkvKiBCUExWREVFICovCisgIHRlbXBieCA9IHB1c2gyOwkJCQkJCS8qIEJQTFZERUUgKi8KIAotICB0ZW1wY3ggPSBTaVNfUHItPlNpU19MQ0RWREVTOyAgICAgICAgICAgICAgICAgICAgICAgIAkJLyogQlBMVkRFUyAqLworICB0ZW1wY3ggPSBTaVNfUHItPlNpU19MQ0RWREVTOwkJCQkJLyogQlBMVkRFUyAqLwogCiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgewogICAgICBzd2l0Y2goU2lTX1ByLT5TaVNfTENEUmVzSW5mbykgewogICAgICBjYXNlIFBhbmVsXzY0MHg0ODA6Ci0gICAgICAgIHRlbXBieCA9IFNpU19Qci0+U2lTX1ZHQVZERSAtIDE7Ci0gICAgICAgIHRlbXBjeCA9IFNpU19Qci0+U2lTX1ZHQVZERTsKKwl0ZW1wYnggPSBTaVNfUHItPlNpU19WR0FWREUgLSAxOworCXRlbXBjeCA9IFNpU19Qci0+U2lTX1ZHQVZERTsKIAlicmVhazsKICAgICAgY2FzZSBQYW5lbF84MDB4NjAwOgotICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgewotICAgICAgICAgICBpZihyZXNpbmZvID09IFNJU19SSV84MDB4NjAwKSB0ZW1wY3grKzsKLSAgICAgICAgfQorCWlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB7CisJICAgaWYocmVzaW5mbyA9PSBTSVNfUklfODAweDYwMCkgdGVtcGN4Kys7CisJfQogCWJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEwMjR4NjAwOgotICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgewotICAgICAgICAgICBpZihyZXNpbmZvID09IFNJU19SSV8xMDI0eDYwMCkgdGVtcGN4Kys7Ci0gICAgICAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB7CisJaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHsKKwkgICBpZihyZXNpbmZvID09IFNJU19SSV8xMDI0eDYwMCkgdGVtcGN4Kys7CisJICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKIAkgICAgICBpZihyZXNpbmZvID09IFNJU19SSV84MDB4NjAwKSB0ZW1wY3grKzsKIAkgICB9Ci0gICAgICAgIH0KKwl9CiAJYnJlYWs7CiAgICAgIGNhc2UgUGFuZWxfMTAyNHg3Njg6Ci0gICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSAgICAgICAgICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHsKLSAgICAgICAgICAgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfMTAyNHg3NjgpIHRlbXBjeCsrOworCWlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCSAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB7CisJICAgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfMTAyNHg3NjgpIHRlbXBjeCsrOwogCSAgIH0KLSAgICAgICAgfQorCX0KIAlicmVhazsKICAgICAgfQogICB9CiAKICAgdGVtcCA9ICgodGVtcGJ4ID4+IDgpICYgMHgwNykgPDwgMzsKLSAgdGVtcCA9IHRlbXAgfCAoKHRlbXBjeCA+PiA4KSAmIDB4MDcpOworICB0ZW1wIHw9ICgodGVtcGN4ID4+IDgpICYgMHgwNyk7CiAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MUQsdGVtcCk7Ci0gIC8qIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9GU1ROKSB0ZW1wYngrKzsgICovCiAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MUMsdGVtcGJ4KTsKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxQix0ZW1wY3gpOwogCiAgIC8qIFZlcnRpY2FsIHNjYWxpbmcgKi8KIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwICAgICAgLyogMzAwIHNlcmllcyAqLwogICAgICB0ZW1wZWF4ID0gU2lTX1ByLT5TaVNfVkdBVkRFIDw8IDY7Ci0gICAgIHRlbXAgPSAodGVtcGVheCAlIChVTE9ORylTaVNfUHItPlNpU19WREUpOwotICAgICB0ZW1wZWF4ID0gdGVtcGVheCAvIChVTE9ORylTaVNfUHItPlNpU19WREU7CisgICAgIHRlbXAgPSAodGVtcGVheCAlICh1bnNpZ25lZCBpbnQpU2lTX1ByLT5TaVNfVkRFKTsKKyAgICAgdGVtcGVheCA9IHRlbXBlYXggLyAodW5zaWduZWQgaW50KVNpU19Qci0+U2lTX1ZERTsKICAgICAgaWYodGVtcCkgdGVtcGVheCsrOwogCiAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBFbmFibGVMVkRTRERBKSB0ZW1wZWF4ID0gMHgzRjsKIAotICAgICB0ZW1wID0gKFVTSE9SVCkodGVtcGVheCAmIDB4MDBGRik7CisgICAgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKHRlbXBlYXggJiAweDAwRkYpOwogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFFLHRlbXApOyAgICAgIAkvKiBCUExWQ0ZBQ1QgKi8KICAgICAgdGVtcHZjZmFjdCA9IHRlbXA7CiAjZW5kaWYgLyogU0lTMzAwICovCkBAIC01OTYzLDIwICs1NzcwLDIwIEBACiAgICAgIGlmKHRlbXApIHRlbXBlYXgrKzsKICAgICAgdGVtcHZjZmFjdCA9IHRlbXBlYXg7CiAKLSAgICAgdGVtcCA9IChVU0hPUlQpKHRlbXBlYXggJiAweDAwRkYpOworICAgICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSh0ZW1wZWF4ICYgMHgwMEZGKTsKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgzNyx0ZW1wKTsKLSAgICAgdGVtcCA9IChVU0hPUlQpKCh0ZW1wZWF4ICYgMHgwMEZGMDApID4+IDgpOworICAgICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSgodGVtcGVheCAmIDB4MDBGRjAwKSA+PiA4KTsKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgzNix0ZW1wKTsKLSAgICAgdGVtcCA9IChVU0hPUlQpKCh0ZW1wZWF4ICYgMHgwMDAzMDAwMCkgPj4gMTYpOworICAgICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSgodGVtcGVheCAmIDB4MDAwMzAwMDApID4+IDE2KTsKICAgICAgaWYoU2lTX1ByLT5TaVNfVkRFID09IFNpU19Qci0+U2lTX1ZHQVZERSkgdGVtcCB8PSAweDA0OwogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDM1LHRlbXApOwogCi0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFDIHwgVkJfU0lTMzAyRUxWKSkgewotICAgICAgICB0ZW1wID0gKFVTSE9SVCkodGVtcGVheCAmIDB4MDBGRik7CisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1BBUlQ0U0NBTEVSKSB7CisgICAgICAgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKHRlbXBlYXggJiAweDAwRkYpOwogICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDNjLHRlbXApOwotICAgICAgICB0ZW1wID0gKFVTSE9SVCkoKHRlbXBlYXggJiAweDAwRkYwMCkgPj4gOCk7CisgICAgICAgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKCh0ZW1wZWF4ICYgMHgwMEZGMDApID4+IDgpOwogICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDNiLHRlbXApOwotICAgICAgICB0ZW1wID0gKFVTSE9SVCkoKCh0ZW1wZWF4ICYgMHgwMDAzMDAwMCkgPj4gMTYpIDw8IDYpOworICAgICAgICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSgoKHRlbXBlYXggJiAweDAwMDMwMDAwKSA+PiAxNikgPDwgNik7CiAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgzYSwweDNmLHRlbXApOwogICAgICAgICB0ZW1wID0gMDsKICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkRFICE9IFNpU19Qci0+U2lTX1ZHQVZERSkgdGVtcCB8PSAweDA4OwpAQCAtNTk5NywyOSArNTgwNCwyOSBAQAogICAgICB0ZW1wZWN4ID0gMHhGRkZGOwogICB9IGVsc2UgewogICAgICB0ZW1wZWN4ID0gdGVtcGVieCAvIFNpU19Qci0+U2lTX0hERTsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKyAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgewogICAgICAgICBpZih0ZW1wZWJ4ICUgU2lTX1ByLT5TaVNfSERFKSB0ZW1wZWN4Kys7CiAgICAgIH0KICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKICAgICAgdGVtcGVheCA9ICh0ZW1wZWJ4IC8gdGVtcGVjeCkgLSAxOwogICB9IGVsc2UgewogICAgICB0ZW1wZWF4ID0gKChTaVNfUHItPlNpU19WR0FIVCA8PCAxNikgLyB0ZW1wZWN4KSAtIDE7CiAgIH0KICAgdGVtcGVjeCA9ICh0ZW1wZWN4IDw8IDE2KSB8ICh0ZW1wZWF4ICYgMHhGRkZGKTsKLSAgdGVtcCA9IChVU0hPUlQpKHRlbXBlY3ggJiAweDAwRkYpOworICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSh0ZW1wZWN4ICYgMHgwMEZGKTsKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxRix0ZW1wKTsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAgICAgIHRlbXBlYXggPSAoU2lTX1ByLT5TaVNfVkdBVkRFIDw8IDE4KSAvIHRlbXB2Y2ZhY3Q7Ci0gICAgIHRlbXBieCA9IChVU0hPUlQpKHRlbXBlYXggJiAweEZGRkYpOworICAgICB0ZW1wYnggPSAodW5zaWduZWQgc2hvcnQpKHRlbXBlYXggJiAweEZGRkYpOwogICB9IGVsc2UgewogICAgICB0ZW1wZWF4ID0gU2lTX1ByLT5TaVNfVkdBVkRFIDw8IDY7CiAgICAgIHRlbXBieCA9IHRlbXB2Y2ZhY3QgJiAweDNmOwogICAgICBpZih0ZW1wYnggPT0gMCkgdGVtcGJ4ID0gNjQ7CiAgICAgIHRlbXBlYXggLz0gdGVtcGJ4OwotICAgICB0ZW1wYnggPSAoVVNIT1JUKSh0ZW1wZWF4ICYgMHhGRkZGKTsKKyAgICAgdGVtcGJ4ID0gKHVuc2lnbmVkIHNob3J0KSh0ZW1wZWF4ICYgMHhGRkZGKTsKICAgfQogICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEwMjR4NzY4KSB0ZW1wYngtLTsKICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIEVuYWJsZUxWRFNEREEpIHsKQEAgLTYwMzIsMjQgKzU4MzksMjQgQEAKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyMCx0ZW1wKTsKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyMSx0ZW1wYngpOwogCi0gIHRlbXBlY3ggPj49IDE2OyAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIEJQTEhDRkFDVCAgKi8KKyAgdGVtcGVjeCA+Pj0gMTY7CQkJCQkJLyogQlBMSENGQUNUICAqLwogICBpZighY2hrZGNsa2ZpcnN0KSB7CiAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHRlbXBlY3ggPj49IDE7CiAgIH0KLSAgdGVtcCA9IChVU0hPUlQpKCh0ZW1wZWN4ICYgMHhGRjAwKSA+PiA4KTsKKyAgdGVtcCA9ICh1bnNpZ25lZCBzaG9ydCkoKHRlbXBlY3ggJiAweEZGMDApID4+IDgpOwogICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDIyLHRlbXApOwotICB0ZW1wID0gKFVTSE9SVCkodGVtcGVjeCAmIDB4MDBGRik7CisgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKHRlbXBlY3ggJiAweDAwRkYpOwogICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDIzLHRlbXApOwogCiAjaWZkZWYgU0lTMzE1SAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKLSAgICAgICAgaWYoKGlzbHZkcykgfHwgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFZCX1NJUzMwMUxWMzAyTFYpKSB7CisgICAgICAgIGlmKChpc2x2ZHMpIHx8IChTaVNfUHItPlNpU19WQkluZm8gJiBWQl9TSVNMVkRTKSkgewogICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFlLDB4MjApOwogCX0KICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYoaXNsdmRzKSB7Ci0gICAgICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApIHsKKyAgICAgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CiAgICAgICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxZSwweDAzKTsKICAgICAgICAgICAgfSBlbHNlIHsKIAkgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFlLDB4MjMpOwpAQCAtNjA2MSwxNyArNTg2OCwyNiBAQAogCiAjaWZkZWYgU0lTMzAwCiAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9UUlVNUElPTikgewotICAgICBpbnQgaTsKLSAgICAgVUNIQVIgVHJ1bXBNb2RlMTNbNF0gICA9IHsgMHgwMSwgMHgxMCwgMHgyYywgMHgwMCB9OwotICAgICBVQ0hBUiBUcnVtcE1vZGUxMF8xWzRdID0geyAweDAxLCAweDEwLCAweDI3LCAweDAwIH07Ci0gICAgIFVDSEFSIFRydW1wTW9kZTEwXzJbNF0gPSB7IDB4MDEsIDB4MTYsIDB4MTAsIDB4MDAgfTsKKyAgICAgdW5zaWduZWQgY2hhciAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgICAgIHVuc2lnbmVkIGNoYXIgKnRydW1wZGF0YTsKKyAgICAgaW50ICAgaSwgaiA9IGNydDJjcnRjOworICAgICB1bnNpZ25lZCBjaGFyIFRydW1wTW9kZTEzWzRdICAgPSB7IDB4MDEsIDB4MTAsIDB4MmMsIDB4MDAgfTsKKyAgICAgdW5zaWduZWQgY2hhciBUcnVtcE1vZGUxMF8xWzRdID0geyAweDAxLCAweDEwLCAweDI3LCAweDAwIH07CisgICAgIHVuc2lnbmVkIGNoYXIgVHJ1bXBNb2RlMTBfMls0XSA9IHsgMHgwMSwgMHgxNiwgMHgxMCwgMHgwMCB9OworCisgICAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgeworCXRydW1wZGF0YSA9ICZST01BZGRyWzB4ODAwMSArIChqICogODApXTsKKyAgICAgfSBlbHNlIHsKKwlpZihTaVNfUHItPlNpU19MQ0RUeXBlSW5mbyA9PSAweDBlKSBqICs9IDc7CisJdHJ1bXBkYXRhID0gJlNpUzMwMF9UcnVtcGlvbkRhdGFbal1bMF07CisgICAgIH0KIAogICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAyLDB4YmYpOwogICAgICBmb3IoaT0wOyBpPDU7IGkrKykgewotICAgICAgICBTaVNfU2V0VHJ1bXBpb25CbG9jayhTaVNfUHIsICZTaVMzMDBfVHJ1bXBpb25EYXRhW2NydDJjcnRjXVswXSk7CisJU2lTX1NldFRydW1waW9uQmxvY2soU2lTX1ByLCB0cnVtcGRhdGEpOwogICAgICB9CiAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHsKLSAgICAgICAgaWYoTW9kZU5vID09IDB4MTMpIHsKKwlpZihNb2RlTm8gPT0gMHgxMykgewogCSAgIGZvcihpPTA7IGk8NDsgaSsrKSB7CiAJICAgICAgU2lTX1NldFRydW1waW9uQmxvY2soU2lTX1ByLCAmVHJ1bXBNb2RlMTNbMF0pOwogCSAgIH0KQEAgLTYwOTUsNjcgKzU5MTEsNjYgQEAKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyOSwweDVBKTsKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyQSwweDRCKTsKICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDQ0LH4weDA3LDB4MDMpOwotICAgICB0ZW1wYXggPSBTaVNfUHItPlNpU19IREU7ICAgICAgICAgICAgICAgICAgICAgICAJCS8qIEJscHMgPSBsY2RoZGVlKGxjZGhkZXMrSERFKSArIDY0ICovCi0gICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8yIHx8Ci0gICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8zKSB0ZW1wYXggPj49IDE7CisgICAgIHRlbXBheCA9IFNpU19Qci0+U2lTX0hERTsJCQkJCS8qIEJscHMgPSBsY2RoZGVlKGxjZGhkZXMrSERFKSArIDY0ICovCisgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8xIHx8CisgICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8yIHx8CisgICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8zKSB0ZW1wYXggPj49IDE7CiAgICAgIHRlbXBheCArPSA2NDsKLSAgICAgdGVtcCA9IHRlbXBheCAmIDB4MDBGRjsKLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgzOCx0ZW1wKTsKLSAgICAgdGVtcCA9ICgodGVtcGF4ICYgMHhGRjAwKSA+PiA4KSA8PCAzOworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDM4LHRlbXBheCAmIDB4ZmYpOworICAgICB0ZW1wID0gKHRlbXBheCA+PiA4KSA8PCAzOwogICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MzUsfjB4MDc4LHRlbXApOwotICAgICB0ZW1wYXggKz0gMzI7CQkgICAgICAgICAgICAgICAgICAgICAJCS8qIEJscGU9bEJscHMrMzIgKi8KLSAgICAgdGVtcCA9IHRlbXBheCAmIDB4MDBGRjsKLSAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0ZTVE4pIHRlbXAgPSAwOwotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDM5LHRlbXApOwotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNBLDB4MDApOyAgICAgICAgCS8qIEJmbG1sPTAgKi8KLSAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNDLH4weDAwNywweDAwKTsKKyAgICAgdGVtcGF4ICs9IDMyOwkJCQkJCS8qIEJscGUgPSBsQmxwcyszMiAqLworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDM5LHRlbXBheCAmIDB4ZmYpOworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNBLDB4MDApOwkJLyogQmZsbWwgPSAwICovCisgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4M0MsfjB4MDA3KTsKIAogICAgICB0ZW1wYXggPSBTaVNfUHItPlNpU19WREU7Ci0gICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8yIHx8Ci0gICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8zKSB0ZW1wYXggPj49IDE7CisgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8xIHx8CisgICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8yIHx8CisgICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8zKSB0ZW1wYXggPj49IDE7CiAgICAgIHRlbXBheCA+Pj0gMTsKLSAgICAgdGVtcCA9IHRlbXBheCAmIDB4MDBGRjsKLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgzQix0ZW1wKTsKLSAgICAgdGVtcCA9ICgodGVtcGF4ICYgMHhGRjAwKSA+PiA4KSA8PCAzOworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNCLHRlbXBheCAmIDB4ZmYpOworICAgICB0ZW1wID0gKHRlbXBheCA+PiA4KSA8PCAzOwogICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4M0MsfjB4MDM4LHRlbXApOwogCiAgICAgIHRlbXBlYXggPSBTaVNfUHItPlNpU19IREU7Ci0gICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8yIHx8Ci0gICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8zKSB0ZW1wZWF4ID4+PSAxOwotICAgICB0ZW1wZWF4IDw8PSAyOyAgICAgICAgICAgICAgICAgICAgICAgCQkJLyogQkR4RklGT1NUT1AgPSAoSERFKjQpLzEyOCAqLwotICAgICB0ZW1wZWJ4ID0gMTI4OwotICAgICB0ZW1wID0gKFVTSE9SVCkodGVtcGVheCAlIHRlbXBlYngpOwotICAgICB0ZW1wZWF4ID0gdGVtcGVheCAvIHRlbXBlYng7CisgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8xIHx8CisgICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8yIHx8CisgICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8zKSB0ZW1wZWF4ID4+PSAxOworICAgICB0ZW1wZWF4IDw8PSAyOwkJCSAJCQkvKiBCRHhGSUZPU1RPUCA9IChIREUqNCkvMTI4ICovCisgICAgIHRlbXAgPSB0ZW1wZWF4ICYgMHg3ZjsKKyAgICAgdGVtcGVheCA+Pj0gNzsKICAgICAgaWYodGVtcCkgdGVtcGVheCsrOwotICAgICB0ZW1wID0gKFVTSE9SVCkodGVtcGVheCAmIDB4MDAzRik7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHg0NSx+MHgwRkYsdGVtcCk7Ci0gICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4M0YsMHgwMCk7ICAgICAgICAgCS8qIEJEeFdhZHJzdDAgKi8KKyAgICAgdGVtcCA9IHRlbXBlYXggJiAweDNmOworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDQ1LHRlbXApOworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNGLDB4MDApOwkJLyogQkR4V2FkcnN0MCAqLwogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNFLDB4MDApOwogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNELDB4MTApOwotICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4M0MsfjB4MDQwLDB4MDApOworICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNDLH4weDA0MCk7CiAKICAgICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfSERFOwotICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzY0MHg0ODBfMiB8fAotICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzY0MHg0ODBfMykgdGVtcGF4ID4+PSAxOwotICAgICB0ZW1wYXggPj49IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgCQkJLyogQkR4V2Fkcm9mZiA9IEhERSo0LzgvOCAqLworICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMSB8fAorICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMiB8fAorICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMykgdGVtcGF4ID4+PSAxOworICAgICB0ZW1wYXggPj49IDQ7CQkJCQkJLyogQkR4V2Fkcm9mZiA9IEhERSo0LzgvOCAqLwogICAgICBwdXNoY3ggPSB0ZW1wYXg7CiAgICAgIHRlbXAgPSB0ZW1wYXggJiAweDAwRkY7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4NDMsdGVtcCk7CiAgICAgIHRlbXAgPSAoKHRlbXBheCAmIDB4RkYwMCkgPj4gOCkgPDwgMzsKICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDQ0LH4weDBGOCx0ZW1wKTsKIAotICAgICB0ZW1wYXggPSBTaVNfUHItPlNpU19WREU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogQkR4V2FkcnN0MSA9IEJEeFdhZHJzdDAgKyBCRHhXYWRyb2ZmICogVkRFICovCi0gICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8yIHx8Ci0gICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8zKSB0ZW1wYXggPj49IDE7Ci0gICAgIHRlbXBlYXggPSAodGVtcGF4ICogcHVzaGN4KTsKLSAgICAgdGVtcGVieCA9IDB4MDAxMDAwMDAgKyB0ZW1wZWF4OwotICAgICB0ZW1wID0gKFVTSE9SVCl0ZW1wZWJ4ICYgMHgwMDAwMDBGRjsKKyAgICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfVkRFOwkJCQkgCS8qIEJEeFdhZHJzdDEgPSBCRHhXYWRyc3QwICsgQkR4V2Fkcm9mZiAqIFZERSAqLworICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMSB8fAorICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMiB8fAorICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMykgdGVtcGF4ID4+PSAxOworICAgICB0ZW1wZWF4ID0gdGVtcGF4ICogcHVzaGN4OworICAgICB0ZW1wID0gdGVtcGVheCAmIDB4RkY7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4NDIsdGVtcCk7Ci0gICAgIHRlbXAgPSAoVVNIT1JUKSgodGVtcGVieCAmIDB4MDAwMEZGMDApID4+IDgpOworICAgICB0ZW1wID0gKHRlbXBlYXggJiAweEZGMDApID4+IDg7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4NDEsdGVtcCk7Ci0gICAgIHRlbXAgPSAoVVNIT1JUKSgodGVtcGVieCAmIDB4MDBGRjAwMDApID4+IDE2KTsKKyAgICAgdGVtcCA9ICgodGVtcGVheCAmIDB4RkYwMDAwKSA+PiAxNikgfCAweDEwOwogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDQwLHRlbXApOwotICAgICB0ZW1wID0gKFVTSE9SVCkoKCh0ZW1wZWJ4ICYgMHgwMTAwMDAwMCkgPj4gMjQpIDw8IDcpOworICAgICB0ZW1wID0gKCh0ZW1wZWF4ICYgMHgwMTAwMDAwMCkgPj4gMjQpIDw8IDc7CiAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgzQyx+MHgwODAsdGVtcCk7CiAKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRiwweDAzKTsKQEAgLTYxOTIsMjAgKzYwMDcsMjAgQEAKIAogLyogU2V0IFBhcnQgMSAqLwogc3RhdGljIHZvaWQKLVNpU19TZXRHcm91cDEoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQorU2lTX1NldEdyb3VwMShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewogI2lmIGRlZmluZWQoU0lTMzAwKSB8fCBkZWZpbmVkKFNJUzMxNUgpCi0gIFVDSEFSICAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7CisgIHVuc2lnbmVkIGNoYXIgICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CiAjZW5kaWYKLSAgVVNIT1JUICB0ZW1wPTAsIHRlbXBheD0wLCB0ZW1wYng9MCwgdGVtcGN4PTAsIGJyaWRnZWFkZD0wOwotICBVU0hPUlQgIHB1c2hieD0wLCBDUlQxSW5kZXg9MCwgbW9kZWZsYWcsIHJlc2luZm89MDsKKyAgdW5zaWduZWQgc2hvcnQgIHRlbXA9MCwgdGVtcGF4PTAsIHRlbXBieD0wLCB0ZW1wY3g9MCwgYnJpZGdlYWRkPTA7CisgIHVuc2lnbmVkIHNob3J0ICBwdXNoYng9MCwgQ1JUMUluZGV4PTAsIG1vZGVmbGFnLCByZXNpbmZvPTA7CiAjaWZkZWYgU0lTMzE1SAotICBVU0hPUlQgIHRlbXBibD0wOworICB1bnNpZ25lZCBzaG9ydCAgdGVtcGJsPTA7CiAjZW5kaWYKIAogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7Ci0gICAgIFNpU19TZXRHcm91cDFfTFZEUyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbywgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKKyAgICAgU2lTX1NldEdyb3VwMV9MVkRTKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKICAgICAgcmV0dXJuOwogICB9CiAKQEAgLTYyMTQsNDcgKzYwMjksNDcgQEAKICAgfSBlbHNlIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogICAgICBtb2RlZmxhZyA9IFNpU19Qci0+Q01vZGVGbGFnOwogICB9IGVsc2UgewotICAgICBDUlQxSW5kZXggPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQxQ1JUQzsKKyAgICAgQ1JUMUluZGV4ID0gU2lTX0dldFJlZkNSVDFDUlRDKFNpU19QciwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBTaVNfUHItPlNpU19Vc2VXaWRlQ1JUMik7CiAgICAgIHJlc2luZm8gPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9SRVNJTkZPOwogICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVGbGFnOwogICB9CiAKLSAgU2lTX1NldENSVDJPZmZzZXQoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIEh3SW5mbyk7CisgIFNpU19TZXRDUlQyT2Zmc2V0KFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKIAotICBpZiggISAoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSAmJgorICBpZiggISAoKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpICYmCiAgICAgICAgICAoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgJiYKICAgICAgICAgIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpICkgewogCi0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUggKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCApIHsKICNpZmRlZiBTSVMzMDAKLSAgCVNpU19TZXRDUlQyRklGT18zMDAoU2lTX1ByLCBNb2RlTm8sIEh3SW5mbyk7CisJU2lTX1NldENSVDJGSUZPXzMwMChTaVNfUHIsIE1vZGVObyk7CiAjZW5kaWYKICAgICAgfSBlbHNlIHsKICNpZmRlZiBTSVMzMTVICi0gICAgICAgIFNpU19TZXRDUlQyRklGT18zMTAoU2lTX1ByLCBId0luZm8pOworCVNpU19TZXRDUlQyRklGT18zMTAoU2lTX1ByKTsKICNlbmRpZgogICAgICB9CiAKICAgICAgLyogMS4gSG9yaXpvbnRhbCBzZXR1cCAqLwogCi0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUggKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCApIHsKIAogI2lmZGVmIFNJUzMwMCAgIC8qIC0tLS0tLS0tLS0tLS0gMzAwIHNlcmllcyAtLS0tLS0tLS0tLS0tLSovCiAKLSAgICAJdGVtcCA9IChTaVNfUHItPlNpU19WR0FIVCAtIDEpICYgMHgwRkY7ICAgCQkgIC8qIEJUVkdBMkhUIDB4MDgsMHgwOSAqLwotICAgIAlTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDA4LHRlbXApOyAgICAgICAgICAgICAgLyogQ1JUMiBIb3Jpem9udGFsIFRvdGFsICovCisJdGVtcCA9IChTaVNfUHItPlNpU19WR0FIVCAtIDEpICYgMHgwRkY7ICAgCQkgIC8qIEJUVkdBMkhUIDB4MDgsMHgwOSAqLworCVNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDgsdGVtcCk7ICAgICAgICAgICAgICAvKiBDUlQyIEhvcml6b250YWwgVG90YWwgKi8KIAotICAgIAl0ZW1wID0gKCgoU2lTX1ByLT5TaVNfVkdBSFQgLSAxKSAmIDB4RkYwMCkgPj4gOCkgPDwgNDsKLSAgICAJU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDA5LDB4MGYsdGVtcCk7ICAgIC8qIENSVDIgSG9yaXpvbnRhbCBUb3RhbCBPdmVyZmxvdyBbNzo0XSAqLworCXRlbXAgPSAoKChTaVNfUHItPlNpU19WR0FIVCAtIDEpICYgMHhGRjAwKSA+PiA4KSA8PCA0OworCVNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwOSwweDBmLHRlbXApOyAgICAvKiBDUlQyIEhvcml6b250YWwgVG90YWwgT3ZlcmZsb3cgWzc6NF0gKi8KIAotICAgIAl0ZW1wID0gKFNpU19Qci0+U2lTX1ZHQUhERSArIDEyKSAmIDB4MEZGOyAgICAgICAgICAgICAgICAgLyogQlRWR0EySERFRSAweDBBLDB4MEMgKi8KLSAgICAJU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwQSx0ZW1wKTsgICAgICAgICAgICAgIC8qIENSVDIgSG9yaXpvbnRhbCBEaXNwbGF5IEVuYWJsZSBFbmQgKi8KKwl0ZW1wID0gKFNpU19Qci0+U2lTX1ZHQUhERSArIDEyKSAmIDB4MEZGOyAgICAgICAgICAgICAgICAgLyogQlRWR0EySERFRSAweDBBLDB4MEMgKi8KKwlTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDBBLHRlbXApOyAgICAgICAgICAgICAgLyogQ1JUMiBIb3Jpem9udGFsIERpc3BsYXkgRW5hYmxlIEVuZCAqLwogCiAJcHVzaGJ4ID0gU2lTX1ByLT5TaVNfVkdBSERFICsgMTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ4ICBCVFZHQTJIUlMgMHgwQiwweDBDICovCi0gICAgCXRlbXBjeCA9IChTaVNfUHItPlNpU19WR0FIVCAtIFNpU19Qci0+U2lTX1ZHQUhERSkgPj4gMjsKLSAgICAJdGVtcGJ4ID0gcHVzaGJ4ICsgdGVtcGN4OwotICAgIAl0ZW1wY3ggPDw9IDE7Ci0gICAgCXRlbXBjeCArPSB0ZW1wYng7CisJdGVtcGN4ID0gKFNpU19Qci0+U2lTX1ZHQUhUIC0gU2lTX1ByLT5TaVNfVkdBSERFKSA+PiAyOworCXRlbXBieCA9IHB1c2hieCArIHRlbXBjeDsKKwl0ZW1wY3ggPDw9IDE7CisJdGVtcGN4ICs9IHRlbXBieDsKIAogCWJyaWRnZWFkZCA9IDEyOwogCkBAIC02MzAxLDcgKzYxMTYsNyBAQAogCWJyaWRnZWFkZCA9IDE2OwogCiAJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLQkgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisJICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7CiAJICAgICAgaWYoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTYwMHgxMjAwKSB8fAogCQkgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHgxMDI0KSkgewogCQkgaWYocmVzaW5mbyA9PSBTSVNfUklfMTI4MHgxMDI0KSB7CkBAIC02MzE5LDcgKzYxMzQsNyBAQAogCiAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CiAKLSAgICAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisJaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CiAJICAgdGVtcGJ4ID0gU2lTX1ByLT5DSFN5bmNTdGFydCArIGJyaWRnZWFkZDsKIAkgICB0ZW1wY3ggPSBTaVNfUHItPkNIU3luY0VuZCArIGJyaWRnZWFkZDsKIAkgICB0ZW1wYXggPSBTaVNfUHItPlNpU19WR0FIVDsKQEAgLTYzNDEsMjIgKzYxNTYsMjIgQEAKIAkgICAgICBjcjUgID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW0NSVDFJbmRleF0uQ1JbNV07CiAJICAgICAgY3IxNSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzE1XTsKIAkgICB9Ci0gICAgICAgICAgIHRlbXBieCA9ICgoY3I0IHwgKChjcjE0ICYgMHhDMCkgPDwgMikpIC0gMykgPDwgMzsgCQkgICAgLyogKFZHQUhSUy0zKSo4ICovCi0gICAgICAgICAgIHRlbXBjeCA9ICgoKGNyNSAmIDB4MWYpIHwgKChjcjE1ICYgMHgwNCkgPDwgKDUtMikpKSAtIDMpIDw8IDM7ICAgLyogKFZHQUhSRS0zKSo4ICovCisJICAgdGVtcGJ4ID0gKChjcjQgfCAoKGNyMTQgJiAweEMwKSA8PCAyKSkgLSAzKSA8PCAzOyAJCSAgICAvKiAoVkdBSFJTLTMpKjggKi8KKwkgICB0ZW1wY3ggPSAoKChjcjUgJiAweDFmKSB8ICgoY3IxNSAmIDB4MDQpIDw8ICg1LTIpKSkgLSAzKSA8PCAzOyAgIC8qIChWR0FIUkUtMykqOCAqLwogCSAgIHRlbXBjeCAmPSAweDAwRkY7CiAJICAgdGVtcGN4IHw9ICh0ZW1wYnggJiAweEZGMDApOwotICAgICAgICAgICB0ZW1wYnggKz0gYnJpZGdlYWRkOwotICAgICAgICAgICB0ZW1wY3ggKz0gYnJpZGdlYWRkOworCSAgIHRlbXBieCArPSBicmlkZ2VhZGQ7CisJICAgdGVtcGN4ICs9IGJyaWRnZWFkZDsKIAkgICB0ZW1wYXggPSBTaVNfUHItPlNpU19WR0FIVDsKIAkgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB0ZW1wYXggPj49IDE7CiAJICAgdGVtcGF4LS07CiAJICAgaWYodGVtcGN4ID4gdGVtcGF4KSB0ZW1wY3ggPSB0ZW1wYXg7Ci0gICAgICAgIH0KKwl9CiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDMTAyNCkgewotICAgICAgCSAgIHRlbXBieCA9IDEwNDA7Ci0gICAgICAJICAgdGVtcGN4ID0gMTA0NDsgICAvKiBIV0N1cnNvciBidWchICovCi0gICAgICAgIH0KKwlpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXROVFNDMTAyNCB8IFRWU2V0NTI1cDEwMjQpKSB7CisJICAgdGVtcGJ4ID0gMTA0MDsKKwkgICB0ZW1wY3ggPSAxMDQ0OyAgIC8qIEhXQ3Vyc29yIGJ1ZyEgKi8KKwl9CiAKICAgICAgfQogCkBAIC02MzcyLDE4ICs2MTg3LDE4IEBACiAgICAgIHRlbXBjeCA9IFNpU19Qci0+U2lTX1ZHQVZUIC0gMTsKICAgICAgdGVtcCA9IHRlbXBjeCAmIDB4MDBGRjsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU182NjEpIHsKKyAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU182NjEpIHsKICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewotCSAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKIAkgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKIAkgICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvU1ZJREVPIHwgU2V0Q1JUMlRvQVZJREVPKSkgewogCSAgICAgICAgICAgIHRlbXAtLTsKIAkgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KKwkgICAgICB9CiAJICAgfSBlbHNlIHsKLSAJICAgICAgdGVtcC0tOwotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworCSAgICAgIHRlbXAtLTsKKwkgICB9CisJfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKIAkgICB0ZW1wLS07CiAJfQogICAgICB9CkBAIC02Mzk1LDkgKzYyMTAsOSBAQAogICAgICB0ZW1wID0gKCh0ZW1wYnggPj4gNSkgJiAweDM4KSB8ICgodGVtcGN4ID4+IDgpICYgMHgwNyk7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTIsdGVtcCk7ICAgICAgICAgICAgICAgICAvKiBPdmVyZmxvdyAqLwogCi0gICAgIGlmKChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzY2MSkpIHsKLSAgICAgICAgdGVtcGJ4Kys7Ci0gICAJdGVtcGF4ID0gdGVtcGJ4OworICAgICBpZigoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfNjYxKSkgeworCXRlbXBieCsrOworCXRlbXBheCA9IHRlbXBieDsKIAl0ZW1wY3grKzsKIAl0ZW1wY3ggLT0gdGVtcGF4OwogCXRlbXBjeCA+Pj0gMjsKQEAgLTY0MDcsOCArNjIyMiw4IEBACiAJdGVtcGN4ICs9IHRlbXBieDsKIAl0ZW1wY3grKzsKICAgICAgfSBlbHNlIHsKLSAgCXRlbXBieCA9IChTaVNfUHItPlNpU19WR0FWVCArIFNpU19Qci0+U2lTX1ZHQVZERSkgPj4gMTsgICAgICAgICAgICAgICAgIC8qICBCVFZHQTJWUlMgICAgIDB4MTAsMHgxMSAgICovCi0gIAl0ZW1wY3ggPSAoKFNpU19Qci0+U2lTX1ZHQVZUIC0gU2lTX1ByLT5TaVNfVkdBVkRFKSA+PiA0KSArIHRlbXBieCArIDE7ICAvKiAgQlRWR0EyVlJFICAgICAweDExICAgICAgICAqLworCXRlbXBieCA9IChTaVNfUHItPlNpU19WR0FWVCArIFNpU19Qci0+U2lTX1ZHQVZERSkgPj4gMTsgICAgICAgICAgICAgICAgIC8qICBCVFZHQTJWUlMgICAgIDB4MTAsMHgxMSAgICovCisJdGVtcGN4ID0gKChTaVNfUHItPlNpU19WR0FWVCAtIFNpU19Qci0+U2lTX1ZHQVZERSkgPj4gNCkgKyB0ZW1wYnggKyAxOyAgLyogIEJUVkdBMlZSRSAgICAgMHgxMSAgICAgICAgKi8KICAgICAgfQogCiAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CkBAIC02NDE2LDcgKzYyMzEsNyBAQAogCSAgIHRlbXBieCA9IFNpU19Qci0+Q1ZTeW5jU3RhcnQ7CiAJICAgdGVtcGN4ID0gU2lTX1ByLT5DVlN5bmNFbmQ7CiAJfQotICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9SQU1EQUMpIHsKKwlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9SQU1EQUMpIHsKIAkgICB1bnNpZ25lZCBjaGFyIGNyOCwgY3I3LCBjcjEzOwogCSAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogCSAgICAgIGNyOCAgICA9IFNpU19Qci0+Q0NSVDFDUlRDWzhdOwpAQCAtNjQyOSwxMSArNjI0NCwxMSBAQAogCSAgICAgIGNyMTMgICA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzEzXTsKIAkgICAgICB0ZW1wY3ggPSBTaVNfUHItPlNpU19DUlQxVGFibGVbQ1JUMUluZGV4XS5DUls5XTsKIAkgICB9Ci0gICAgICAJICAgdGVtcGJ4ID0gY3I4OwotICAgICAgCSAgIGlmKGNyNyAgJiAweDA0KSB0ZW1wYnggfD0gMHgwMTAwOwotICAgICAgCSAgIGlmKGNyNyAgJiAweDgwKSB0ZW1wYnggfD0gMHgwMjAwOwotICAgICAgCSAgIGlmKGNyMTMgJiAweDA4KSB0ZW1wYnggfD0gMHgwNDAwOwotICAgICAgIAl9CisJICAgdGVtcGJ4ID0gY3I4OworCSAgIGlmKGNyNyAgJiAweDA0KSB0ZW1wYnggfD0gMHgwMTAwOworCSAgIGlmKGNyNyAgJiAweDgwKSB0ZW1wYnggfD0gMHgwMjAwOworCSAgIGlmKGNyMTMgJiAweDA4KSB0ZW1wYnggfD0gMHgwNDAwOworCX0KICAgICAgfQogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEwLHRlbXBieCk7ICAgICAgICAgICAgICAgLyogQ1JUMiBWZXJ0aWNhbCBSZXRyYWNlIFN0YXJ0ICovCiAKQEAgLTY0NDIsMTMgKzYyNTcsMTMgQEAKIAogICAgICAvKiAzLiBQYW5lbCBkZWxheSBjb21wZW5zYXRpb24gKi8KIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwICAvKiAtLS0tLS0tLS0tIDMwMCBzZXJpZXMgLS0tLS0tLS0tLS0tLS0gKi8KIAogCWlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CiAJICAgdGVtcCA9IDB4MjA7Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMwMCkgeworCSAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMwMCkgewogCSAgICAgIHRlbXAgPSAweDEwOwogCSAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpICB0ZW1wID0gMHgyYzsKIAkgICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4MTAyNCkgdGVtcCA9IDB4MjA7CkBAIC02NDYwLDI0ICs2Mjc1LDIzIEBACiAJICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF9DdXN0b20pICAgICAgIHRlbXAgPSAweDJjOwogCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSAJICAgIHRlbXAgPSAweDA4OwogCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB7Ci0gICAgICAJICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIAkgICAgdGVtcCA9IDB4MmM7Ci0gICAgICAJICAgICAgZWxzZSAJCQkJCSAgICB0ZW1wID0gMHgyMDsKLSAgICAJICAgfQorCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSAJICAgIHRlbXAgPSAweDJjOworCSAgICAgIGVsc2UgCQkJCQkgICAgdGVtcCA9IDB4MjA7CisJICAgfQogCSAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgewogCSAgICAgIGlmKFJPTUFkZHJbMHgyMjBdICYgMHg4MCkgewotCSAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWTm9ZUGJQckhpVmlzaW9uKQotCSAgIAkgICAgdGVtcCA9IFJPTUFkZHJbMHgyMjFdOworCQkgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFZOb1lQYlBySGlWaXNpb24pCisJCSAgICB0ZW1wID0gUk9NQWRkclsweDIyMV07CiAJCSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKQogCQkgICAgdGVtcCA9IFJPTUFkZHJbMHgyMjJdOwogCQkgZWxzZSBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4MTAyNCkKIAkJICAgIHRlbXAgPSBST01BZGRyWzB4MjIzXTsKIAkJIGVsc2UKIAkJICAgIHRlbXAgPSBST01BZGRyWzB4MjI0XTsKLQkJIHRlbXAgJj0gMHgzYzsKIAkgICAgICB9CiAJICAgfQogCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotCSAgICAgIGlmKFNpU19Qci0+UERDICE9IC0xKSAgdGVtcCA9IFNpU19Qci0+UERDICYgMHgzYzsKKwkgICAgICBpZihTaVNfUHItPlBEQyAhPSAtMSkgIHRlbXAgPSBTaVNfUHItPlBEQzsKIAkgICB9CiAKIAl9IGVsc2UgewpAQCAtNjQ4NywxNSArNjMwMSwxNyBAQAogCSAgIH0KIAkgICBpZihTaVNfUHItPlNpU19Vc2VST00pIHsKIAkgICAgICBpZihST01BZGRyWzB4MjIwXSAmIDB4ODApIHsKLQkgICAgICAgICB0ZW1wID0gUk9NQWRkclsweDIyMF0gJiAweDNjOworCSAgICAgICAgIHRlbXAgPSBST01BZGRyWzB4MjIwXTsKIAkgICAgICB9CiAJICAgfQogCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotCSAgICAgIGlmKFNpU19Qci0+UERDICE9IC0xKSB0ZW1wID0gU2lTX1ByLT5QREMgJiAweDNjOworCSAgICAgIGlmKFNpU19Qci0+UERDICE9IC0xKSB0ZW1wID0gU2lTX1ByLT5QREM7CiAJICAgfQotICAgICAgICB9CisJfQogCi0gICAgCVNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxMyx+MHgzQyx0ZW1wKTsgICAvKiBQYW5lbCBMaW5rIERlbGF5IENvbXBlbnNhdGlvbjsgKFNvZnR3YXJlIENvbW1hbmQgUmVzZXQ7IFBvd2VyIFNhdmluZykgKi8KKwl0ZW1wICY9IDB4M2M7CisKKwlTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTMsfjB4M0MsdGVtcCk7ICAgLyogUGFuZWwgTGluayBEZWxheSBDb21wZW5zYXRpb247IChTb2Z0d2FyZSBDb21tYW5kIFJlc2V0OyBQb3dlciBTYXZpbmcpICovCiAKICNlbmRpZiAgLyogU0lTMzAwICovCiAKQEAgLTY1MDMsMTYgKzYzMTksMTYgQEAKIAogI2lmZGVmIFNJUzMxNUggICAvKiAtLS0tLS0tLS0tLS0tLS0gMzE1LzMzMCBzZXJpZXMgLS0tLS0tLS0tLS0tLS0tKi8KIAotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU182NjEpIHsKKwlpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzY2MSkgewogCiAJICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewogCi0JICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgdGVtcCA9IDB4MDM7Ci0JICAgICAgZWxzZSAJCSAgICAgICAgICAgICAgIHRlbXAgPSAweDAwOworCSAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgdGVtcCA9IDB4MDM7CisJICAgICAgZWxzZSAJCSAgICAgICAgICAgICAgdGVtcCA9IDB4MDA7CiAKIAkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgdGVtcCA9IDB4MGE7CiAJICAgICAgdGVtcGJsID0gMHhGMDsKLQkgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjUwKSB7CisJICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNjUwKSB7CiAJCSBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKIAkJICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpKSB0ZW1wYmwgPSAweDBGOwogCQkgfQpAQCAtNjUzMSwxMCArNjM0NywxMCBAQAogCiAJfSAvKiA8IDY2MSAqLwogCi0gICAgCXRlbXBheCA9IDA7Ci0gICAgCWlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHRlbXBheCB8PSAweDgwOwotICAgIAlpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSAgICAgICB0ZW1wYXggfD0gMHg0MDsKLSAgICAJU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJDLDB4M2YsdGVtcGF4KTsKKwl0ZW1wYXggPSAwOworCWlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHRlbXBheCB8PSAweDgwOworCWlmKG1vZGVmbGFnICYgSGFsZkRDTEspICAgICAgIHRlbXBheCB8PSAweDQwOworCVNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyQywweDNmLHRlbXBheCk7CiAKICNlbmRpZiAgLyogU0lTMzE1SCAqLwogCkBAIC02NTQ0LDIxICs2MzYwLDIxIEBACiAKICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKICAgICAgaWYoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSkgewotICAgICAgICAvKiBGb3IgMzAxQkRIIHdpdGggTENELCB3ZSBzZXQgdXAgdGhlIFBhbmVsIExpbmsgKi8KLQlTaVNfU2V0R3JvdXAxX0xWRFMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisJLyogRm9yIDMwMUJESCB3aXRoIExDRCwgd2Ugc2V0IHVwIHRoZSBQYW5lbCBMaW5rICovCisJU2lTX1NldEdyb3VwMV9MVkRTKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7Ci0gICAgCVNpU19TZXRHcm91cDFfMzAxKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgSHdJbmZvLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCVNpU19TZXRHcm91cDFfMzAxKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKICAgICAgfQogICB9IGVsc2UgewotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7Ci0JU2lTX1NldEdyb3VwMV9MVkRTKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgSHdJbmZvLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworICAgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwlTaVNfU2V0R3JvdXAxX0xWRFMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwogICAgICB9IGVsc2UgewogCWlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgewotICAgICAgICAgICBpZigoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikpIHx8IChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHsKLSAgICAJICAgICAgU2lTX1NldEdyb3VwMV9MVkRTKFNpU19QciwgTW9kZU5vLE1vZGVJZEluZGV4LCBId0luZm8sUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKLSAgICAgICAgICAgfQorCSAgIGlmKCghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgfHwgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgeworCSAgICAgIFNpU19TZXRHcm91cDFfTFZEUyhTaVNfUHIsIE1vZGVObyxNb2RlSWRJbmRleCxSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSAgIH0KIAl9IGVsc2UgewotCSAgIFNpU19TZXRHcm91cDFfTFZEUyhTaVNfUHIsIE1vZGVObyxNb2RlSWRJbmRleCwgSHdJbmZvLFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisJICAgU2lTX1NldEdyb3VwMV9MVkRTKFNpU19QciwgTW9kZU5vLE1vZGVJZEluZGV4LFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAJfQogICAgICB9CiAgIH0KQEAgLTY1NjksMTEgKzYzODUsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZmRlZiBTSVMzMTVICi1zdGF0aWMgVUNIQVIgKgotU2lTX0dldEdyb3VwMkNMVlhQdHIoU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IHRhYmxldHlwZSwgUFNJU19IV19JTkZPIEh3SW5mbykKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK1NpU19HZXRHcm91cDJDTFZYUHRyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgdGFibGV0eXBlKQogewotICAgY29uc3QgVUNIQVIgICp0YWJsZXB0ciA9IE5VTEw7Ci0gICBVU0hPUlQgICAgICAgYSwgYiwgcCA9IDA7CisgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZXB0ciA9IE5VTEw7CisgICB1bnNpZ25lZCBzaG9ydCAgICAgIGEsIGIsIHAgPSAwOwogCiAgICBhID0gU2lTX1ByLT5TaVNfVkdBSERFOwogICAgYiA9IFNpU19Qci0+U2lTX0hERTsKQEAgLTY2MDYsMjUgKzY0MjIsMjUgQEAKICAgICAgIGlmKCh0YWJsZXB0cltwXSB8IHRhYmxlcHRyW3ArMV0gPDwgOCkgPT0gMHhmZmZmKSBwIC09IDB4NDI7CiAgICB9CiAgICBwICs9IDI7Ci0gICByZXR1cm4oKFVDSEFSICopJnRhYmxlcHRyW3BdKTsKKyAgIHJldHVybiAoKHVuc2lnbmVkIGNoYXIgKikmdGFibGVwdHJbcF0pOwogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldEdyb3VwMl9DX0VMVihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0JICAgICAgCSAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldEdyb3VwMl9DX0VMVihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkgICAgICAJICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCkKIHsKLSAgIFVDSEFSICp0YWJsZXB0cjsKKyAgIHVuc2lnbmVkIGNoYXIgKnRhYmxlcHRyOworICAgdW5zaWduZWQgY2hhciB0ZW1wOwogICAgaW50IGksIGo7Ci0gICBVQ0hBUiB0ZW1wOwogCi0gICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFDIHwgVkJfU0lTMzAyRUxWKSkpIHJldHVybjsKKyAgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVEFQNFNDQUxFUikpIHJldHVybjsKIAotICAgdGFibGVwdHIgPSBTaVNfR2V0R3JvdXAyQ0xWWFB0cihTaVNfUHIsIDAsIEh3SW5mbyk7CisgICB0YWJsZXB0ciA9IFNpU19HZXRHcm91cDJDTFZYUHRyKFNpU19QciwgMCk7CiAgICBmb3IoaSA9IDB4ODAsIGogPSAwOyBpIDw9IDB4YmY7IGkrKywgaisrKSB7CiAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwgaSwgdGFibGVwdHJbal0pOwogICAgfQogICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKLSAgICAgIHRhYmxlcHRyID0gU2lTX0dldEdyb3VwMkNMVlhQdHIoU2lTX1ByLCAxLCBId0luZm8pOworICAgICAgdGFibGVwdHIgPSBTaVNfR2V0R3JvdXAyQ0xWWFB0cihTaVNfUHIsIDEpOwogICAgICAgZm9yKGkgPSAweGMwLCBqID0gMDsgaSA8PSAweGZmOyBpKyssIGorKykgewogICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsIGksIHRhYmxlcHRyW2pdKTsKICAgICAgIH0KQEAgLTY2MzUsMTIgKzY0NTEsMTIgQEAKIH0KIAogc3RhdGljIEJPT0xFQU4KLVNpU19HZXRDUlQyUGFydDJQdHIoU2lTX1ByaXZhdGUgKlNpU19QcixVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwKLQkJICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsVVNIT1JUICpDUlQySW5kZXgsCi0JCSAgICBVU0hPUlQgKlJlc0luZGV4LFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfR2V0Q1JUMlBhcnQyUHRyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLHVuc2lnbmVkIHNob3J0IE1vZGVObyx1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCx1bnNpZ25lZCBzaG9ydCAqQ1JUMkluZGV4LAorCQkgICAgdW5zaWduZWQgc2hvcnQgKlJlc0luZGV4KQogewogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHJldHVybiBGQUxTRTsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSByZXR1cm4gRkFMU0U7CiAKICAgaWYoTW9kZU5vIDw9IDB4MTMpCiAgICAgICgqUmVzSW5kZXgpID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQzsKQEAgLTY2NjEsODIgKzY0NzcsNzkgQEAKICAgICAgICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExDRFZFU0FUaW1pbmcpICgqQ1JUMkluZGV4KSA9IDIwNjsKICAgICAgfQogICB9Ci0gIHJldHVybigoKCpDUlQySW5kZXgpICE9IDApKTsKKyAgcmV0dXJuICgoKCpDUlQySW5kZXgpICE9IDApKTsKIH0KICNlbmRpZgogCiAjaWZkZWYgU0lTMzAwCiBzdGF0aWMgdm9pZAotU2lTX0dyb3VwMkxDRFNwZWNpYWwoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywgVVNIT1JUIE1vZGVObywgVVNIT1JUIGNydDJjcnRjKQorU2lTX0dyb3VwMkxDRFNwZWNpYWwoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgY3J0MmNydGMpCiB7Ci0gICBVU0hPUlQgdGVtcGN4OwotICAgY29uc3QgVUNIQVIgYXRhYmxlW10gPSB7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wY3g7CisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhdGFibGVbXSA9IHsKICAgICAgICAweGMzLDB4OWUsMHhjMywweDllLDB4MDIsMHgwMiwweDAyLAogICAgICAgIDB4YWIsMHg4NywweGFiLDB4OWUsMHhlNywweDAyLDB4MDIKICAgIH07CiAKICAgIGlmKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgIGlmKCAoICggKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182MzApIHx8Ci0gICAgICAgICAgICAgIChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzMwKSApICYmCi0gICAgICAgICAgICAoSHdJbmZvLT5qQ2hpcFJldmlzaW9uID4gMikgKSAgJiYKLSAgICAgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgJiYKLSAgICAgICAgICAoIShTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykpICAmJgotICAgICAgICAgICghKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSkgKSB7Ci0gICAgICAgICBpZihNb2RlTm8gPT0gMHgxMykgewotICAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNCwweEI5KTsKLSAgICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDUsMHhDQyk7Ci0gICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDA2LDB4QTYpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKChjcnQyY3J0YyAmIDB4M0YpID09IDQpIHsKLSAgICAgICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDEsMHgyQik7Ci0gICAgICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAyLDB4MTMpOwotICAgICAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNCwweEU1KTsKLSAgICAgICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDUsMHgwOCk7Ci0gICAgICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDA2LDB4RTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQorICAgICAgaWYoICggKCAoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNjMwKSB8fAorCSAgICAgIChTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApICkgJiYKKwkgICAgKFNpU19Qci0+Q2hpcFJldmlzaW9uID4gMikgKSAgJiYKKwkgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEwMjR4NzY4KSAmJgorCSAgKCEoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExDRFZFU0FUaW1pbmcpKSAgJiYKKwkgICghKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSkgKSB7CisJIGlmKE1vZGVObyA9PSAweDEzKSB7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDQsMHhCOSk7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDUsMHhDQyk7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDYsMHhBNik7CisJIH0gZWxzZSBpZigoY3J0MmNydGMgJiAweDNGKSA9PSA0KSB7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDEsMHgyQik7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDIsMHgxMyk7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDQsMHhFNSk7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDUsMHgwOCk7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDYsMHhFMik7CisJIH0KICAgICAgIH0KIAotICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENEVHlwZUluZm8gPT0gMHgwYykgewotICAgICAgICAgICAgY3J0MmNydGMgJj0gMHgxZjsKLSAgICAgICAgICAgIHRlbXBjeCA9IDA7Ci0gICAgICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldE5vdFNpbXVNb2RlKSkgewotICAgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKLSAgICAgICAgICAgICAgICAgIHRlbXBjeCArPSA3OwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGVtcGN4ICs9IGNydDJjcnRjOwotICAgICAgICAgICAgaWYoY3J0MmNydGMgPj0gNCkgewotICAgICAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNiwweGZmKTsKLSAgICAgICAgICAgIH0KKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCSBpZihTaVNfUHItPlNpU19MQ0RUeXBlSW5mbyA9PSAweDBjKSB7CisJICAgIGNydDJjcnRjICY9IDB4MWY7CisJICAgIHRlbXBjeCA9IDA7CisJICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Tm90U2ltdU1vZGUpKSB7CisJICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7CisJCSAgdGVtcGN4ICs9IDc7CisJICAgICAgIH0KKwkgICAgfQorCSAgICB0ZW1wY3ggKz0gY3J0MmNydGM7CisJICAgIGlmKGNydDJjcnRjID49IDQpIHsKKwkgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNiwweGZmKTsKKwkgICAgfQogCi0gICAgICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldE5vdFNpbXVNb2RlKSkgewotICAgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKLSAgICAgICAgICAgICAgICAgIGlmKGNydDJjcnRjID09IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDEsMHgyOCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAyLDB4MTgpOwotICAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNCxhdGFibGVbdGVtcGN4XSk7Ci0gICAgICAgICB9CisJICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Tm90U2ltdU1vZGUpKSB7CisJICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7CisJCSAgaWYoY3J0MmNydGMgPT0gNCkgeworCQkgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDEsMHgyOCk7CisJCSAgfQorCSAgICAgICB9CisJICAgIH0KKwkgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwMiwweDE4KTsKKwkgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNCxhdGFibGVbdGVtcGN4XSk7CisJIH0KICAgICAgIH0KICAgIH0KIH0KIAogLyogRm9yIEVDUyBBOTA3LiBIaWdobHkgcHJlbGltaW5hcnkuICovCiBzdGF0aWMgdm9pZAotU2lTX1NldDMwMFBhcnQyUmVncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgIAkJICAgIFVTSE9SVCBNb2RlSWRJbmRleCwgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLQkJICAgIFVTSE9SVCBNb2RlTm8pCitTaVNfU2V0MzAwUGFydDJSZWdzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkgICAgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICBVU0hPUlQgY3J0MmNydGMsIHJlc2luZGV4OwotICBpbnQgICAgaSxqOwotICBjb25zdCAgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCAqQ1JUMlBhcnQyUHRyID0gTlVMTDsKKyAgY29uc3Qgc3RydWN0IFNpU19QYXJ0MlBvcnRUYmwgKkNSVDJQYXJ0MlB0ciA9IE5VTEw7CisgIHVuc2lnbmVkIHNob3J0IGNydDJjcnRjLCByZXNpbmRleDsKKyAgaW50IGksIGo7CiAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgIT0gU0lTXzMwMCkgcmV0dXJuOwotICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikpIHJldHVybjsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSAhPSBTSVNfMzAwKSByZXR1cm47CisgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSkgcmV0dXJuOwogICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHJldHVybjsKIAogICBpZihNb2RlTm8gPD0gMHgxMykgewpAQCAtNjc1OCwxMyArNjU3MSwxMyBAQAogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDEsMHg4MCwoQ1JUMlBhcnQyUHRyK3Jlc2luZGV4KS0+Q1JbMF0pOwogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDIsMHg4MCwoQ1JUMlBhcnQyUHRyK3Jlc2luZGV4KS0+Q1JbMV0pOwogICBmb3IoaSA9IDIsIGogPSAweDA0OyBqIDw9IDB4MDY7IGkrKywgaisrICkgewotICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCxqLChDUlQyUGFydDJQdHIrcmVzaW5kZXgpLT5DUltpXSk7CisgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGosKENSVDJQYXJ0MlB0cityZXNpbmRleCktPkNSW2ldKTsKICAgfQogICBmb3IoaiA9IDB4MWM7IGogPD0gMHgxZDsgaSsrLCBqKysgKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGosKENSVDJQYXJ0MlB0cityZXNpbmRleCktPkNSW2ldKTsKKyAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaiwoQ1JUMlBhcnQyUHRyK3Jlc2luZGV4KS0+Q1JbaV0pOwogICB9CiAgIGZvcihqID0gMHgxZjsgaiA8PSAweDIxOyBpKyssIGorKyApIHsKLSAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaiwoQ1JUMlBhcnQyUHRyK3Jlc2luZGV4KS0+Q1JbaV0pOworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCxqLChDUlQyUGFydDJQdHIrcmVzaW5kZXgpLT5DUltpXSk7CiAgIH0KICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyMywoQ1JUMlBhcnQyUHRyK3Jlc2luZGV4KS0+Q1JbMTBdKTsKICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDI1LDB4MGYsKENSVDJQYXJ0MlB0cityZXNpbmRleCktPkNSWzExXSk7CkBAIC02NzcyLDE1ICs2NTg1LDE1IEBACiAjZW5kaWYKIAogc3RhdGljIHZvaWQKLVNpU19TZXRUVlNwZWNpYWwoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObykKK1NpU19TZXRUVlNwZWNpYWwoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObykKIHsKLSAgaWYoIShTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpKSByZXR1cm47CisgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSkgcmV0dXJuOwogICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWTm9IaVZpc2lvbikpIHJldHVybjsKICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI1MjVwIHwgVFZTZXRZUGJQcjc1MHApKSByZXR1cm47CiAKICAgaWYoIShTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDMTAyNCkgewotICAgICAgICBjb25zdCBVQ0hBUiBzcGVjaWFsdHZbXSA9IHsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBzcGVjaWFsdHZbXSA9IHsKIAkJMHhhNywweDA3LDB4ZjIsMHg2ZSwweDE3LDB4OGIsMHg3MywweDUzLAogCQkweDEzLDB4NDAsMHgzNCwweGY0LDB4NjMsMHhiYiwweGNjLDB4N2EsCiAJCTB4NTgsMHhlNCwweDczLDB4ZGEsMHgxMwpAQCAtNjgxMywxNiArNjYyNiwxNiBAQAogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldEdyb3VwMl9UYWlsKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8pCitTaVNfU2V0R3JvdXAyX1RhaWwoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObykKIHsKLSAgVVNIT1JUIHRlbXA7CisgIHVuc2lnbmVkIHNob3J0IHRlbXA7CiAKICAgaWYoIShTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDUyNSkgewogCXRlbXAgPSAweGMzOwogCWlmKFNpU19Qci0+U2lTX01vZGVUeXBlIDw9IE1vZGVWR0EpIHsKIAkgICB0ZW1wKys7Ci0JICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB0ZW1wICs9IDI7CisJICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB0ZW1wICs9IDI7CiAJfQogCVNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MmYsdGVtcCk7CiAJU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgzMCwweGIzKTsKQEAgLTY4MzAsNyArNjY0Myw3IEBACiAJdGVtcCA9IDB4NGQ7CiAJaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPD0gTW9kZVZHQSkgewogCSAgIHRlbXArKzsKLQkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHRlbXArKzsKKwkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHRlbXArKzsKIAl9CiAJU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyZix0ZW1wKTsKICAgICAgfQpAQCAtNjgzOCw3ICs2NjUxLDcgQEAKIAogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNDAweDEwNTApIHsKLQlpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCMzAyQikgeworCWlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEIpIHsKIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MWEsMHgwMyk7CiAJICAgLyogTm90IGFsd2F5cyBmb3IgTFYsIHNlZSBTZXRHcnAyICovCiAJfQpAQCAtNjg3MiwxNyArNjY4NSwxNyBAQAogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldEdyb3VwMihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLQkgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldEdyb3VwMihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewotICBVU0hPUlQgICAgICBpLCBqLCB0ZW1wYXgsIHRlbXBieCwgdGVtcGN4LCB0ZW1wY2gsIHRlbXBjbCwgdGVtcDsKLSAgVVNIT1JUICAgICAgcHVzaDIsIG1vZGVmbGFnLCBjcnQyY3J0YywgYnJpZGdlb2Zmc2V0OwotICBVTE9ORyAgICAgICBsb25ndGVtcDsKLSAgY29uc3QgICAgICAgVUNIQVIgKlBoYXNlUG9pbnQ7Ci0gIGNvbnN0ICAgICAgIFVDSEFSICpUaW1pbmdQb2ludDsKKyAgdW5zaWduZWQgc2hvcnQgaSwgaiwgdGVtcGF4LCB0ZW1wYngsIHRlbXBjeCwgdGVtcGNoLCB0ZW1wY2wsIHRlbXA7CisgIHVuc2lnbmVkIHNob3J0IHB1c2gyLCBtb2RlZmxhZywgY3J0MmNydGMsIGJyaWRnZW9mZnNldDsKKyAgdW5zaWduZWQgaW50ICAgbG9uZ3RlbXAsIFBoYXNlSW5kZXg7CisgIEJPT0xFQU4gICAgICAgIG5ld3R2cGhhc2U7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKlRpbWluZ1BvaW50OwogI2lmZGVmIFNJUzMxNUgKLSAgVVNIT1JUICAgICAgcmVzaW5kZXgsIENSVDJJbmRleDsKLSAgY29uc3QgICAgICAgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCAqQ1JUMlBhcnQyUHRyID0gTlVMTDsKKyAgdW5zaWduZWQgc2hvcnQgcmVzaW5kZXgsIENSVDJJbmRleDsKKyAgY29uc3Qgc3RydWN0IFNpU19QYXJ0MlBvcnRUYmwgKkNSVDJQYXJ0MlB0ciA9IE5VTEw7CiAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgcmV0dXJuOwogI2VuZGlmCkBAIC02OTA4LDkgKzY3MjEsMTYgQEAKIAogICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAwLHRlbXApOwogCi0gIFBoYXNlUG9pbnQgID0gU2lTX1ByLT5TaVNfUEFMUGhhc2U7CisgIFBoYXNlSW5kZXggID0gMHgwMTsgLyogU2lTX1BBTFBoYXNlICovCiAgIFRpbWluZ1BvaW50ID0gU2lTX1ByLT5TaVNfUEFMVGltaW5nOwogCisgIG5ld3R2cGhhc2UgPSBGQUxTRTsKKyAgaWYoIChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpICYmCisgICAgICAoICghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgfHwKKwkoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSApICkgeworICAgICBuZXd0dnBoYXNlID0gVFJVRTsKKyAgfQorCiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB7CiAKICAgICAgVGltaW5nUG9pbnQgPSBTaVNfUHItPlNpU19IaVRWRXh0VGltaW5nOwpAQCAtNjkxOCw4MiArNjczOCw1NCBAQAogICAgICAgICBUaW1pbmdQb2ludCA9IFNpU19Qci0+U2lTX0hpVFZTdDJUaW1pbmc7CiAgICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgewogCSAgIFRpbWluZ1BvaW50ID0gU2lTX1ByLT5TaVNfSGlUVlN0MVRpbWluZzsKLSNpZiAwCi0gICAgICAgICAgIGlmKCEobW9kZWZsYWcgJiBDaGFyeDhEb3QpKSAgVGltaW5nUG9pbnQgPSBTaVNfUHItPlNpU19IaVRWVGV4dFRpbWluZzsKLSNlbmRpZgogICAgICAgICB9CiAgICAgIH0KIAogICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHsKIAotICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgICAgICBUaW1pbmdQb2ludCA9ICZTaVNfWVBiUHJUYWJsZVsyXVswXTsKLSAgICAgZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNTI1cCkgVGltaW5nUG9pbnQgPSAmU2lTX1lQYlByVGFibGVbMV1bMF07Ci0gICAgIGVsc2UJCQkJCSAgVGltaW5nUG9pbnQgPSAmU2lTX1lQYlByVGFibGVbMF1bMF07CisgICAgIGkgPSAwOworICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgICAgICBpID0gMjsKKyAgICAgZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNTI1cCkgaSA9IDE7CiAKLSAgICAgUGhhc2VQb2ludCA9IFNpU19Qci0+U2lTX05UU0NQaGFzZTsKKyAgICAgVGltaW5nUG9pbnQgPSAmU2lTX1lQYlByVGFibGVbaV1bMF07CisKKyAgICAgUGhhc2VJbmRleCA9IDB4MDA7IC8qIFNpU19OVFNDUGhhc2UgKi8KIAogICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKIAotICAgICBpZiggKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgJiYKLSAgICAgICAgICggKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB8fAotCSAgIChTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFRWU2ltdU1vZGUpICkgKSB7Ci0gICAgICAgIFBoYXNlUG9pbnQgPSBTaVNfUHItPlNpU19QQUxQaGFzZTI7Ci0gICAgIH0KKyAgICAgaWYobmV3dHZwaGFzZSkgUGhhc2VJbmRleCA9IDB4MDk7IC8qIFNpU19QQUxQaGFzZTIgKi8KIAogICB9IGVsc2UgewogCiAgICAgIFRpbWluZ1BvaW50ID0gU2lTX1ByLT5TaVNfTlRTQ1RpbWluZzsKLSAgICAgUGhhc2VQb2ludCAgPSBTaVNfUHItPlNpU19OVFNDUGhhc2U7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0TlRTQ0opIHsKLQlQaGFzZVBvaW50ID0gU2lTX1ByLT5TaVNfUEFMUGhhc2U7Ci0gICAgIH0KLQotICAgICBpZiggKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgJiYKLQkgKCAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHx8Ci0JICAgKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgKSApIHsKLSAgICAgICAgUGhhc2VQb2ludCA9IFNpU19Qci0+U2lTX05UU0NQaGFzZTI7Ci0JaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDSikgewotCSAgIFBoYXNlUG9pbnQgPSBTaVNfUHItPlNpU19QQUxQaGFzZTI7Ci0JfQotICAgICB9CisgICAgIFBoYXNlSW5kZXggID0gKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0TlRTQ0opID8gMHgwMSA6IDB4MDA7CS8qIFNpU19QQUxQaGFzZSA6IFNpU19OVFNDUGhhc2UgKi8KKyAgICAgaWYobmV3dHZwaGFzZSkgUGhhc2VJbmRleCArPSA4OwkJCQkJLyogU2lTX1BBTFBoYXNlMiA6IFNpU19OVFNDUGhhc2UyICovCiAKICAgfQogCi0gIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTSkgewotICAgICBQaGFzZVBvaW50ID0gU2lTX1ByLT5TaVNfUEFMTVBoYXNlOwotICAgICBpZiggKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgJiYKLQkgKCAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHx8Ci0JICAgKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgKSApIHsKLSAgICAgICAgUGhhc2VQb2ludCA9IFNpU19Qci0+U2lTX1BBTE1QaGFzZTI7Ci0gICAgIH0KLSAgfQotCi0gIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTikgewotICAgICBQaGFzZVBvaW50ID0gU2lTX1ByLT5TaVNfUEFMTlBoYXNlOwotICAgICBpZiggKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgJiYKLQkgKCAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHx8Ci0JICAgKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgKSApIHsKLQlQaGFzZVBvaW50ID0gU2lTX1ByLT5TaVNfUEFMTlBoYXNlMjsKLSAgICAgfQorICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRQQUxNIHwgVFZTZXRQQUxOKSkgeworICAgICBQaGFzZUluZGV4ID0gKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTSkgPyAweDAyIDogMHgwMzsJLyogU2lTX1BBTE1QaGFzZSA6IFNpU19QQUxOUGhhc2UgKi8KKyAgICAgaWYobmV3dHZwaGFzZSkgUGhhc2VJbmRleCArPSA4OwkJCQkJLyogU2lTX1BBTE1QaGFzZTIgOiBTaVNfUEFMTlBoYXNlMiAqLwogICB9CiAKICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDMTAyNCkgewotICAgICBQaGFzZVBvaW50ID0gU2lTX1ByLT5TaVNfU3BlY2lhbFBoYXNlOwogICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTE0pIHsKLSAgICAgICAgUGhhc2VQb2ludCA9IFNpU19Qci0+U2lTX1NwZWNpYWxQaGFzZU07CisgICAgICAgIFBoYXNlSW5kZXggPSAweDA1OyAvKiBTaVNfU3BlY2lhbFBoYXNlTSAqLwogICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDSikgewotICAgICAgICBQaGFzZVBvaW50ID0gU2lTX1ByLT5TaVNfU3BlY2lhbFBoYXNlSjsKKyAgICAgICAgUGhhc2VJbmRleCA9IDB4MTE7IC8qIFNpU19TcGVjaWFsUGhhc2VKICovCisgICAgIH0gZWxzZSB7CisgICAgICAgIFBoYXNlSW5kZXggPSAweDEwOyAvKiBTaVNfU3BlY2lhbFBoYXNlICovCiAgICAgIH0KICAgfQogCi0gIGZvcihpPTB4MzEsIGo9MDsgaTw9MHgzNDsgaSsrLCBqKyspIHsKLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaSxQaGFzZVBvaW50W2pdKTsKKyAgZm9yKGkgPSAweDMxLCBqID0gMDsgaSA8PSAweDM0OyBpKyssIGorKykgeworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCxpLFNpU19UVlBoYXNlWyhQaGFzZUluZGV4ICogNCkgKyBqXSk7CiAgIH0KIAotICBmb3IoaT0weDAxLCBqPTA7IGk8PTB4MkQ7IGkrKywgaisrKSB7CisgIGZvcihpID0gMHgwMSwgaiA9IDA7IGkgPD0gMHgyRDsgaSsrLCBqKyspIHsKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaSxUaW1pbmdQb2ludFtqXSk7CiAgIH0KLSAgZm9yKGk9MHgzOTsgaTw9MHg0NTsgaSsrLCBqKyspIHsKKyAgZm9yKGkgPSAweDM5OyBpIDw9IDB4NDU7IGkrKywgaisrKSB7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGksVGltaW5nUG9pbnRbal0pOwogICB9CiAKQEAgLTcwMTAsMjggKzY4MDIsMzIgQEAKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgzNyxTaVNfUHItPlNpU19SWTNDT0UpOwogICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDM4LFNpU19Qci0+U2lTX1JZNENPRSk7CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIAl0ZW1wYXggPSA5NTA7Ci0gIGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpICAgICAgCXRlbXBheCA9IDUyMDsKLSAgZWxzZSAJCQkgICAgICAgICAgICAJCXRlbXBheCA9IDQ0MDsgLyogTlRTQywgWVBiUHIgNTI1LCA3NTAgKi8KKyAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pCXRlbXBheCA9IDk1MDsKKyAgZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgIHRlbXBheCA9IDY4MDsKKyAgZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkJdGVtcGF4ID0gNTIwOworICBlbHNlCQkJCQkJdGVtcGF4ID0gNDQwOyAvKiBOVFNDLCBZUGJQciA1MjUgKi8KIAotICBpZiggKCAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVk5vSGlWaXNpb24pKSAmJiAoU2lTX1ByLT5TaVNfVkRFIDw9IHRlbXBheCkgKSB8fAorICBpZiggKChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgJiYgKFNpU19Qci0+U2lTX1ZERSA8PSB0ZW1wYXgpKSB8fAogICAgICAgKCAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFZOb0hpVmlzaW9uKSAmJgogICAgICAgICAoKFNpU19Qci0+U2lTX1ZHQUhERSA9PSAxMDI0KSB8fCAoU2lTX1ByLT5TaVNfVkRFIDw9IHRlbXBheCkpICkgKSB7CiAKICAgICAgdGVtcGF4IC09IFNpU19Qci0+U2lTX1ZERTsKLSAgICAgdGVtcGF4ID4+PSAyOworICAgICB0ZW1wYXggPj49IDE7CisgICAgIGlmKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI1MjVwIHwgVFZTZXRZUGJQcjc1MHApKSkgeworICAgICAgICB0ZW1wYXggPj49IDE7CisgICAgIH0KICAgICAgdGVtcGF4ICY9IDB4MDBmZjsKIAotICAgICB0ZW1wID0gdGVtcGF4ICsgKFVTSE9SVClUaW1pbmdQb2ludFswXTsKKyAgICAgdGVtcCA9IHRlbXBheCArICh1bnNpZ25lZCBzaG9ydClUaW1pbmdQb2ludFswXTsKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwMSx0ZW1wKTsKIAotICAgICB0ZW1wID0gdGVtcGF4ICsgKFVTSE9SVClUaW1pbmdQb2ludFsxXTsKKyAgICAgdGVtcCA9IHRlbXBheCArICh1bnNpZ25lZCBzaG9ydClUaW1pbmdQb2ludFsxXTsKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwMix0ZW1wKTsKIAogICAgICBpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFZOb1lQYlBySGlWaXNpb24pICYmIChTaVNfUHItPlNpU19WR0FIREUgPj0gMTAyNCkpIHsKICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKLSAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwMSwweDFiKTsgIC8qIDE5ICovCi0gICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDIsMHg1NCk7ICAvKiA1MiAqLworICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAxLDB4MWIpOworICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAyLDB4NTQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAxLDB4MTcpOwogICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAyLDB4MWQpOwpAQCAtNzA0MSwxNCArNjgzNywxNCBAQAogICB9CiAKICAgdGVtcGN4ID0gU2lTX1ByLT5TaVNfSFQ7Ci0gIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgdGVtcGN4ID4+PSAxOworICBpZihTaVNfSXNEdWFsTGluayhTaVNfUHIpKSB0ZW1wY3ggPj49IDE7CiAgIHRlbXBjeC0tOwotICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHRlbXBjeC0tOworICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHRlbXBjeC0tOwogICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDFCLHRlbXBjeCk7CiAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgxRCwweEYwLCgodGVtcGN4ID4+IDgpICYgMHgwZikpOwogCiAgIHRlbXBjeCA9IFNpU19Qci0+U2lTX0hUID4+IDE7Ci0gIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgdGVtcGN4ID4+PSAxOworICBpZihTaVNfSXNEdWFsTGluayhTaVNfUHIpKSB0ZW1wY3ggPj49IDE7CiAgIHRlbXBjeCArPSA3OwogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgdGVtcGN4IC09IDQ7CiAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyMiwweDBGLCgodGVtcGN4IDw8IDQpICYgMHhmMCkpOwpAQCAtNzA3NSw3ICs2ODcxLDcgQEAKICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDJBLDB4MEYsKCh0ZW1wY3ggPDwgNCkgJiAweGYwKSk7CiAKICAgdGVtcGN4ID0gU2lTX1ByLT5TaVNfSFQgPj4gMTsKLSAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByLCBId0luZm8pKSB0ZW1wY3ggPj49IDE7CisgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QcikpIHRlbXBjeCA+Pj0gMTsKICAgaiArPSAyOwogICB0ZW1wY3ggLT0gKFRpbWluZ1BvaW50W2pdIHwgKChUaW1pbmdQb2ludFtqKzFdKSA8PCA4KSk7CiAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyRCwweDBGLCgodGVtcGN4IDw8IDQpICYgMHhmMCkpOwpAQCAtNzA5NCw3ICs2ODkwLDcgQEAKICAgfSBlbHNlIGlmKCAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpICYmCiAgICAgICAgICAgICAgKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI1MjVwfFRWU2V0WVBiUHI3NTBwKSkpICkgewogICAgICB0ZW1wYnggPj49IDE7Ci0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSB7CiAJICAgaWYoKE1vZGVObyA8PSAweDEzKSAmJiAoY3J0MmNydGMgPT0gMSkpIHRlbXBieCsrOwogCX0gZWxzZSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewpAQCAtNzEyMywyMyArNjkxOSwxMSBAQAogICB9CiAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MzAsdGVtcCk7CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMUMgfCBWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKKyAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTUEFSVDRPVkVSRkxPVykgewogICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MTAsMHhkZiwoKHRlbXBieCAmIDB4MDQwMCkgPj4gNSkpOwogICB9CiAKLSNpZiAwCi0gIC8qIFRFU1QgcXFxcSAqLwotICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgewotICAgICBmb3IoaT0weDAxLCBqPTA7IGk8PTB4MkQ7IGkrKywgaisrKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGksVGltaW5nUG9pbnRbal0pOwotICAgICB9Ci0gICAgIGZvcihpPTB4Mzk7IGk8PTB4NDU7IGkrKywgaisrKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGksVGltaW5nUG9pbnRbal0pOwotICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgeworICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfVkRFOwogICAgICBpZiggKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSAmJgogICAgICAgICAgKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI1MjVwIHwgVFZTZXRZUGJQcjc1MHApKSkgKSB7CkBAIC03MTUwLDcgKzY5MzQsNyBAQAogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDQ2LHRlbXApOwogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDQ3LHRlbXBieCk7CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMUMgfCBWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTUEFSVDRPVkVSRkxPVykgewogCVNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxMCwweGJmLCgodGVtcGJ4ICYgMHgwNDAwKSA+PiA0KSk7CiAgICAgIH0KICAgfQpAQCAtNzE2NSwxNCArNjk0OSwxNyBAQAogCiAgIHRlbXBjaCA9IHRlbXBjbCA9IDB4MDE7CiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZHQUhERSA+PSAxMDI0KSB7Ci0gICAgICAgIGlmKCghKG1vZGVmbGFnICYgSGFsZkRDTEspKSB8fCAoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkpIHsKLSAgICAgICAgICAgdGVtcGNoID0gMHgxOTsKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkdBSERFID49IDk2MCkgeworICAgICAgICBpZigoIShtb2RlZmxhZyAmIEhhbGZEQ0xLKSkgfHwgKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkpIHsKIAkgICB0ZW1wY2wgPSAweDIwOwotICAgICAgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgPj0gMTI4MCkgewotICAgICAgICAgICAgICB0ZW1wY2ggPSAweDE0OworCSAgIGlmKFNpU19Qci0+U2lTX1ZHQUhERSA+PSAxMjgwKSB7CisgICAgICAgICAgICAgIHRlbXBjaCA9IDIwOwogICAgICAgICAgICAgICB0ZW1wYnggJj0gfjB4MjA7Ci0gICAgICAgICAgIH0KKyAgICAgICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQUhERSA+PSAxMDI0KSB7CisgICAgICAgICAgICAgIHRlbXBjaCA9IDI1OworICAgICAgICAgICB9IGVsc2UgeworCSAgICAgIHRlbXBjaCA9IDI1OyAvKiBPSyAqLworCSAgIH0KICAgICAgICAgfQogICAgICB9CiAgIH0KQEAgLTcxODAsNyArNjk2Nyw3IEBACiAgIGlmKCEodGVtcGJ4ICYgMHgyMCkpIHsKICAgICAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgdGVtcGNsIDw8PSAxOwogICAgICBsb25ndGVtcCA9ICgoU2lTX1ByLT5TaVNfVkdBSERFICogdGVtcGNoKSAvIHRlbXBjbCkgPDwgMTM7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgbG9uZ3RlbXAgPDw9IDM7CisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgbG9uZ3RlbXAgPDw9IDM7CiAgICAgIHRlbXBheCA9IGxvbmd0ZW1wIC8gU2lTX1ByLT5TaVNfSERFOwogICAgICBpZihsb25ndGVtcCAlIFNpU19Qci0+U2lTX0hERSkgdGVtcGF4Kys7CiAgICAgIHRlbXBieCB8PSAoKHRlbXBheCA+PiA4KSAmIDB4MUYpOwpAQCAtNzE5MCw3ICs2OTc3LDcgQEAKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHg0NCx0ZW1wYXgpOwogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4NDUsMHhDMCx0ZW1wYngpOwogCi0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgeworICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKIAogICAgICB0ZW1wY3ggJj0gMHgwNzsKICAgICAgaWYodGVtcGJ4ICYgMHgyMCkgdGVtcGN4ID0gMDsKQEAgLTcyMTksNyArNzAwNiw3IEBACiAKICAgICAgU2lTX1NldFRWU3BlY2lhbChTaVNfUHIsIE1vZGVObyk7CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQykgeworICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhDTFYpIHsKICAgICAgICAgdGVtcCA9IDA7CiAgICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTSkgdGVtcCA9IDg7CiAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHg0ZSwweGY3LHRlbXApOwpAQCAtNzI0Niw3ICs3MDMzLDcgQEAKICAgLyogRnJvbSBoZXJlOiBQYXJ0MiBMQ0Qgc2V0dXAgKi8KIAogICB0ZW1wYnggPSBTaVNfUHItPlNpU19IREU7Ci0gIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgdGVtcGJ4ID4+PSAxOworICBpZihTaVNfSXNEdWFsTGluayhTaVNfUHIpKSB0ZW1wYnggPj49IDE7CiAgIHRlbXBieC0tOwkJCSAgICAgICAgIAkvKiBSSEFDVEUgPSBIREUgLSAxICovCiAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MkMsdGVtcGJ4KTsKICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDJCLDB4MEYsKCh0ZW1wYnggPj4gNCkgJiAweGYwKSk7CkBAIC03MjU2LDEwICs3MDQzLDggQEAKICAgICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPT0gTW9kZUVHQSkgewogICAgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgPj0gMTAyNCkgewogICAgICAgICAgICB0ZW1wID0gMHgwMjsKLQkgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykgewotICAgICAgICAgICAgICAgICB0ZW1wID0gMHgwMTsKLQkgICAgICB9CisgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSB7CisgICAgICAgICAgICAgIHRlbXAgPSAweDAxOwogCSAgIH0KICAgICAgICAgfQogICAgICB9CkBAIC03Mjg5LDExICs3MDc0LDExIEBACiAKICNpZmRlZiBTSVMzMTVICiAgIGlmKFNpU19HZXRDUlQyUGFydDJQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSZDUlQySW5kZXgsICZyZXNpbmRleCwgSHdJbmZvKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkmQ1JUMkluZGV4LCAmcmVzaW5kZXgpKSB7CiAgICAgICBzd2l0Y2goQ1JUMkluZGV4KSB7CisgICAgICAgIGNhc2UgMjA2OiBDUlQyUGFydDJQdHIgPSBTaVMzMTBfQ1JUMlBhcnQyX0FzdXMxMDI0eDc2OF8zOyAgICBicmVhazsKKwlkZWZhdWx0OgogICAgICAgICBjYXNlIDIwMDogQ1JUMlBhcnQyUHRyID0gU2lTX1ByLT5TaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzE7ICAgYnJlYWs7Ci0JY2FzZSAyMDY6IENSVDJQYXJ0MlB0ciA9IFNpUzMxMF9DUlQyUGFydDJfQXN1czEwMjR4NzY4XzM7ICAgIGJyZWFrOwotCWRlZmF1bHQ6ICBDUlQyUGFydDJQdHIgPSBTaVNfUHItPlNpU19DUlQyUGFydDJfMTAyNHg3NjhfMzsgICBicmVhazsKICAgICAgIH0KIAogICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAxLDB4ODAsKENSVDJQYXJ0MlB0cityZXNpbmRleCktPkNSWzBdKTsKQEAgLTczMTIsNyArNzA5Nyw2IEBACiAKICAgICAgIFNpU19TZXRHcm91cDJfVGFpbChTaVNfUHIsIE1vZGVObyk7CiAKLQogICB9IGVsc2UgewogI2VuZGlmCiAKQEAgLTczNDksOSArNzEzMywxMSBAQAogCiAgICAgLyogTm9uLWV4cGFuZGluZzogbGNkdmRlcyA9IHRlbXBjeCA9IFZULTE7IGxjZHZkZWUgPSB0ZW1wYnggPSBWREUtMSAqLwogCisjaWZkZWYgU0lTX1hPUkdfWEY4NgogI2lmZGVmIFRXREVCVUcKICAgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywgImxjZHZkZXMgMHgleCBsY2R2ZGVlIDB4JXhcbiIsIHRlbXBjeCwgdGVtcGJ4KTsKICNlbmRpZgorI2VuZGlmCiAKICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDA1LHRlbXBjeCk7CS8qIGxjZHZkZXMgICovCiAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNix0ZW1wYngpOwkvKiBsY2R2ZGVlICAqLwpAQCAtNzQwMSw5ICs3MTg3LDExIEBACiAgICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5DVlN5bmNTdGFydDsKICAgICB9CiAKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAibGNkdnJzIDB4JXhcbiIsIHRlbXBieCk7CiAjZW5kaWYKKyNlbmRpZgogCiAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNCx0ZW1wYngpOwkgICAgLyogbGNkdnJzICovCiAKQEAgLTc0MTYsMjYgKzcyMDQsMzAgQEAKICAgICAgICB0ZW1wIHw9IChTaVNfUHItPkNWU3luY0VuZCAmIDB4MGYpOwogICAgIH0KIAorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJsY2R2cmVbMzowXSAweCV4XG4iLCAodGVtcCAmIDB4MGYpKTsKICNlbmRpZgorI2VuZGlmCiAKICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAxLHRlbXApOwogCiAjaWZkZWYgU0lTMzAwCi0gICAgU2lTX0dyb3VwMkxDRFNwZWNpYWwoU2lTX1ByLCBId0luZm8sIE1vZGVObywgY3J0MmNydGMpOworICAgIFNpU19Hcm91cDJMQ0RTcGVjaWFsKFNpU19QciwgTW9kZU5vLCBjcnQyY3J0Yyk7CiAjZW5kaWYKIAogICAgIGJyaWRnZW9mZnNldCA9IDc7Ci0gICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSAgICAgICAgICBicmlkZ2VvZmZzZXQgKz0gMjsKLSAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAxQyB8IFZCX1NJUzMwMkVMVikpIGJyaWRnZW9mZnNldCsrOwotICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgICAgICAgIAkJIGJyaWRnZW9mZnNldCsrOworICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikJYnJpZGdlb2Zmc2V0ICs9IDI7CisgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4Q0xWKQlicmlkZ2VvZmZzZXQgKz0gMjsgLyogT0sgZm9yIEF2ZXJhdGVjIDEyODB4ODAwICgzMDFDKSAqLworICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QcikpCQkJYnJpZGdlb2Zmc2V0Kys7CisgICAgZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDJMVikJYnJpZGdlb2Zmc2V0Kys7ICAgIC8qIE9LIGZvciBBc3VzIEE0TCAxMjgweDgwMCAqLworICAgIC8qIEhpZ2hlciBicmlkZ2VvZmZzZXQgc2hpZnRzIHRvIHRoZSBMRUZUICovCiAKICAgICB0ZW1wID0gMDsKICAgICBpZigoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpICYmICghKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSkgewogICAgICAgIGlmKFNpU19Qci0+UGFuZWxYUmVzICE9IFNpU19Qci0+U2lTX0hERSkgewotICAgICAgICAgIHRlbXAgPSBTaVNfUHItPlNpU19IVCAtICgoU2lTX1ByLT5QYW5lbFhSZXMgLSBTaVNfUHItPlNpU19IREUpIC8gMik7Ci0JICBpZihTaVNfSXNEdWFsTGluayhTaVNfUHIsIEh3SW5mbykpIHRlbXAgPj49IDE7CisJICB0ZW1wID0gU2lTX1ByLT5TaVNfSFQgLSAoKFNpU19Qci0+UGFuZWxYUmVzIC0gU2lTX1ByLT5TaVNfSERFKSAvIDIpOworCSAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByKSkgdGVtcCA+Pj0gMTsKICAgICAgICB9CiAgICAgfQogICAgIHRlbXAgKz0gYnJpZGdlb2Zmc2V0OwpAQCAtNzQ1MCwxNSArNzI0MiwxNyBAQAogICAgICAgICAgIHRlbXBieCA9IFNpU19Qci0+UGFuZWxYUmVzIC0gKChTaVNfUHItPlBhbmVsWFJlcyAtIFNpU19Qci0+U2lTX0hERSkgLyAyKTsKICAgICAgICB9CiAgICAgfQotICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgeworICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QcikpIHsKICAgICAgICB0ZW1wY3ggPj49IDE7CiAgICAgICAgdGVtcGJ4ID4+PSAxOwogICAgICAgIHRlbXBheCA+Pj0gMTsKICAgICB9CiAKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAibGNkaGRlZSAweCV4XG4iLCB0ZW1wYngpOwogI2VuZGlmCisjZW5kaWYKIAogICAgIHRlbXBieCArPSBicmlkZ2VvZmZzZXQ7CiAKQEAgLTc0ODAsMTMgKzcyNzQsMTYgQEAKIAogICAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogICAgICAgIHRlbXBieCA9IFNpU19Qci0+Q0hTeW5jU3RhcnQ7Ci0gICAgICAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByLCBId0luZm8pKSB0ZW1wYnggPj49IDE7CisgICAgICAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgdGVtcGJ4IDw8PSAxOworICAgICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QcikpIHRlbXBieCA+Pj0gMTsKICAgICAgICB0ZW1wYnggKz0gYnJpZGdlb2Zmc2V0OwogICAgIH0KIAorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJsY2RocnMgMHgleFxuIiwgdGVtcGJ4KTsKICNlbmRpZgorI2VuZGlmCiAKICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDFDLHRlbXBieCk7CSAgICAvKiBsY2RocnMgKi8KICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MUQsMHgwRiwoKHRlbXBieCA+PiA0KSAmIDB4ZjApKTsKQEAgLTc1MDEsMjAgKzcyOTgsMjMgQEAKIAogICAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogICAgICAgIHRlbXBieCA9IFNpU19Qci0+Q0hTeW5jRW5kOwotICAgICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgdGVtcGJ4ID4+PSAxOworICAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHRlbXBieCA8PD0gMTsKKyAgICAgICBpZihTaVNfSXNEdWFsTGluayhTaVNfUHIpKSB0ZW1wYnggPj49IDE7CiAgICAgICAgdGVtcGJ4ICs9IGJyaWRnZW9mZnNldDsKICAgICB9CiAKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAibGNkaHJlIDB4JXhcbiIsIHRlbXBieCk7CiAjZW5kaWYKKyNlbmRpZgogCiAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyMSx0ZW1wYngpOwkgICAgLyogbGNkaHJlICovCiAKICAgICBTaVNfU2V0R3JvdXAyX1RhaWwoU2lTX1ByLCBNb2RlTm8pOwogCiAjaWZkZWYgU0lTMzAwCi0gICAgU2lTX1NldDMwMFBhcnQyUmVncyhTaVNfUHIsIEh3SW5mbywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgTW9kZU5vKTsKKyAgICBTaVNfU2V0MzAwUGFydDJSZWdzKFNpU19QciwgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgTW9kZU5vKTsKICNlbmRpZgogI2lmZGVmIFNJUzMxNUgKICAgfSAvKiBDUlQyLUxDRCBmcm9tIHRhYmxlICovCkBAIC03NTI2LDExICs3MzI2LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1NldEdyb3VwMyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfU2V0R3JvdXAzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVU0hPUlQgCWk7Ci0gIGNvbnN0IFVDSEFSICAJKnRlbXBkaTsKKyAgdW5zaWduZWQgc2hvcnQgaTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqdGVtcGRpOwogCiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHJldHVybjsKIApAQCAtNzU3MCw3ICs3MzY5LDcgQEAKICAgICAgZm9yKGk9MDsgaTw9MHgzRTsgaSsrKSB7CiAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDNQb3J0LGksdGVtcGRpW2ldKTsKICAgICAgfQotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAxQyB8IFZCX1NJUzMwMkVMVikpIHsKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4Q0xWKSB7CiAJaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjUyNXApIHsKIAkgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQzUG9ydCwweDI4LDB4M2YpOwogCX0KQEAgLTc1ODcsMzUgKzczODYsNDMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZmRlZiBTSVMzMTVICisjaWYgMAogc3RhdGljIHZvaWQKLVNpU19TaGlmdFhQb3MoU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IHNoaWZ0KQorU2lTX1NoaWZ0WFBvcyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IHNoaWZ0KQogewotICAgVVNIT1JUIHRlbXAsIHRlbXAxLCB0ZW1wMjsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXAsIHRlbXAxLCB0ZW1wMjsKIAogICAgdGVtcDEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDFmKTsKICAgIHRlbXAyID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyMCk7Ci0gICB0ZW1wID0gKFVTSE9SVCkoKGludCkoKHRlbXAxIHwgKCh0ZW1wMiAmIDB4ZjApIDw8IDQpKSkgKyBzaGlmdCk7CisgICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSgoaW50KSgodGVtcDEgfCAoKHRlbXAyICYgMHhmMCkgPDwgNCkpKSArIHNoaWZ0KTsKICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MWYsdGVtcCk7CiAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MjAsMHgwZiwoKHRlbXAgPj4gNCkgJiAweGYwKSk7CiAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyYikgJiAweDBmOwotICAgdGVtcCA9IChVU0hPUlQpKChpbnQpKHRlbXApICsgc2hpZnQpOworICAgdGVtcCA9ICh1bnNpZ25lZCBzaG9ydCkoKGludCkodGVtcCkgKyBzaGlmdCk7CiAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MmIsMHhmMCwodGVtcCAmIDB4MGYpKTsKICAgIHRlbXAxID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHg0Myk7CiAgICB0ZW1wMiA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4NDIpOwotICAgdGVtcCA9IChVU0hPUlQpKChpbnQpKCh0ZW1wMSB8ICgodGVtcDIgJiAweGYwKSA8PCA0KSkpICsgc2hpZnQpOworICAgdGVtcCA9ICh1bnNpZ25lZCBzaG9ydCkoKGludCkoKHRlbXAxIHwgKCh0ZW1wMiAmIDB4ZjApIDw8IDQpKSkgKyBzaGlmdCk7CiAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDQzLHRlbXApOwogICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDQyLDB4MGYsKCh0ZW1wID4+IDQpICYgMHhmMCkpOwogfQorI2VuZGlmCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0R3JvdXA0X0NfRUxWKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICAgIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCkKK1NpU19TZXRHcm91cDRfQ19FTFYoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gICBVU0hPUlQgdGVtcCwgdGVtcDEsIHJlc2luZm8gPSAwOworICAgdW5zaWduZWQgc2hvcnQgdGVtcCwgdGVtcDEsIHJlc2luZm8gPSAwOworICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOwogCi0gICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUMpKSByZXR1cm47CisgICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweENMVikpIHJldHVybjsKICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0hpVmlzaW9uIHwgU2V0Q1JUMlRvWVBiUHI1MjU3NTApKSkgcmV0dXJuOwogCisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFhHSV8yMCkgcmV0dXJuOworCisgICBpZigoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSAmJiAoU2lTX1ByLT5TaVNfUk9NTmV3KSkgeworICAgICAgaWYoIShST01BZGRyWzB4NjFdICYgMHgwNCkpIHJldHVybjsKKyAgIH0KKwogICAgaWYoTW9kZU5vID4gMHgxMykgewogICAgICAgcmVzaW5mbyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X1JFU0lORk87CiAgICB9CkBAIC03NjI1LDcgKzc0MzIsNyBAQAogICAgaWYoISh0ZW1wICYgMHgwMSkpIHsKICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4M2EsMHhkZik7CiAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI1LDB4ZmMpOwotICAgICAgaWYoKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzY2MSkgJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKKyAgICAgIGlmKChTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzY2MSkgJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKICAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjUsMHhmOCk7CiAgICAgICB9CiAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBmLDB4ZmIpOwpAQCAtNzYzMywyNCArNzQ0MCwyOSBAQAogICAgICAgZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNTI1cCkgdGVtcCA9IDB4MDAwMjsKICAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRIaVZpc2lvbikgIHRlbXAgPSAweDA0MDA7CiAgICAgICBlbHNlCQkJCQkgICB0ZW1wID0gMHgwNDAyOwotICAgICAgaWYoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHx8IChTaVNfUHItPlNpU19ST01OZXcpKSB7CisgICAgICBpZigoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB8fCAoU2lTX1ByLT5TaVNfUk9NTmV3KSkgewogICAgICAgICAgdGVtcDEgPSAwOwogCSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVkFzcGVjdDQzKSB0ZW1wMSA9IDQ7CiAJIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwZiwweGZiLHRlbXAxKTsKIAkgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZBc3BlY3Q0M0xCKSB0ZW1wIHw9IDB4MDE7CiAJIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNiwweDdjLCh0ZW1wICYgMHhmZikpOworCSBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4M2EsMHhmYiwodGVtcCA+PiA4KSk7CisJIGlmKE1vZGVObyA+IDB4MTMpIHsKKyAgICAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDM5LDB4ZmQpOworICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRlbXAxID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4M2IpICYgMHgwMzsKIAkgaWYodGVtcDEgPT0gMHgwMSkgdGVtcCB8PSAweDAxOwogCSBpZih0ZW1wMSA9PSAweDAzKSB0ZW1wIHw9IDB4MDQ7ICAvKiA/IHdoeSBub3QgMHgxMD8gKi8KIAkgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4ZjgsKHRlbXAgJiAweGZmKSk7Ci0gICAgICB9Ci0gICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4M2EsMHhmYiwodGVtcCA+PiA4KSk7Ci0gICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDNiLDB4ZmQpOworCSBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4M2EsMHhmYiwodGVtcCA+PiA4KSk7CisJIGlmKE1vZGVObyA+IDB4MTMpIHsKKyAgICAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4M2IsMHhmZCk7CisgICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHsgCQkvKiA/ICovCisjaWYgMAorICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7IAkJLyogPyAqLwogICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZBc3BlY3Q0MykgewogICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjc1MHApIHsKIAkgICAgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfMTAyNHg3NjgpIHsKQEAgLTc2NjMsMjkgKzc0NzUsMzAgQEAKIAkgICAgfQogICAgICAgICAgfQogICAgICAgfQorI2VuZGlmCisKICAgIH0KKwogfQogI2VuZGlmCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0Q1JUMlZDTEsoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldENSVDJWQ0xLKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCiB7Ci0gIFVTSE9SVCB2Y2xraW5kZXg7Ci0gIFVTSE9SVCB0ZW1wLCByZWcxLCByZWcyOworICB1bnNpZ25lZCBzaG9ydCB2Y2xraW5kZXgsIHRlbXAsIHJlZzEsIHJlZzI7CiAKICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CiAgICAgIHJlZzEgPSBTaVNfUHItPkNTUjJCOwogICAgICByZWcyID0gU2lTX1ByLT5DU1IyQzsKICAgfSBlbHNlIHsKLSAgICAgdmNsa2luZGV4ID0gU2lTX0dldFZDTEsyUHRyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHdJbmZvKTsKKyAgICAgdmNsa2luZGV4ID0gU2lTX0dldFZDTEsyUHRyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKICAgICAgcmVnMSA9IFNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbdmNsa2luZGV4XS5QYXJ0NF9BOwogICAgICByZWcyID0gU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YVt2Y2xraW5kZXhdLlBhcnQ0X0I7CiAgIH0KIAotICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDMTAyNCkgeworICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKyAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0TlRTQzEwMjQgfCBUVlNldDUyNXAxMDI0KSkgewogICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBhLDB4NTcpOwogIAlTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBiLDB4NDYpOwogCVNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MWYsMHhmNik7CkBAIC03NzA1LDExICs3NTE4LDM1IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0R3JvdXA0KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgCSAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfU2V0RHVhbExpbmtFdGMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCB0ZW1wYXgsdGVtcGN4LHRlbXBieCxtb2RlZmxhZyx0ZW1wLHJlc2luZm87Ci0gIFVMT05HIHRlbXBlYngsdGVtcGVheCx0ZW1wbG9uZzsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNEVUFMTElOSykgeworCWlmKChTaVNfQ1JUMklzTENEKFNpU19QcikpIHx8CisJICAgKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSkgeworCSAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0REdWFsTGluaykgeworCSAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNywweDJjKTsKKwkgICB9IGVsc2UgeworCSAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjcsfjB4MjApOworCSAgIH0KKwl9CisgICAgIH0KKyAgfQorICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNFTUkpIHsKKyAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyYSwweDAwKTsKKyNpZmRlZiBTRVRfRU1JCisgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgwYyk7CisjZW5kaWYKKyAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgzNCwweDEwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorU2lTX1NldEdyb3VwNChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQoreworICB1bnNpZ25lZCBzaG9ydCB0ZW1wYXgsIHRlbXBjeCwgdGVtcGJ4LCBtb2RlZmxhZywgdGVtcCwgcmVzaW5mbzsKKyAgdW5zaWduZWQgaW50ICAgdGVtcGVieCwgdGVtcGVheCwgdGVtcGxvbmc7CiAKICAgaWYoTW9kZU5vIDw9IDB4MTMpIHsKICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOwpAQCAtNzcyMiwzOCArNzU1OSwyNCBAQAogICAgICByZXNpbmZvID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfUkVTSU5GTzsKICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgewotICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI0LDB4MGUpOwotICAgICAgICB9Ci0gICAgIH0KLSAgfQotCi0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFDIHwgVkJfU0lTMzAyTFYpKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MTAsMHg5Zik7Ci0gICAgIH0KLSAgfQotCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgewotCSAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgewotCSAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNywweDJjKTsKLQkgICB9IGVsc2UgewotCSAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjcsfjB4MjApOwotCSAgIH0KLQotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKLQkgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDJhLDB4MDApOwotI2lmZGVmIFNFVF9FTUkKLQkgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDMwLDB4MGMpOwotI2VuZGlmCi0JICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgzNCwweDEwKTsKLQkgICB9CisgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgeworCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKKwkgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI0LDB4MGUpOwogCX0KLSAgIAlyZXR1cm47CisgICAgIH0KKyAgfQorCisgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMHhDTFYgfCBWQl9TSVMzMDJMVikpIHsKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKKwlTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDEwLDB4OWYpOworICAgICB9CisgIH0KKworICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKKwlTaVNfU2V0RHVhbExpbmtFdGMoU2lTX1ByKTsKKwlyZXR1cm47CiAgICAgIH0KICAgfQogCkBAIC03Nzc3LDE2ICs3NjAwLDE2IEBACiAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MTUsdGVtcCk7CiAKICAgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfVkdBSERFOwotICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSAgICAgICAgICAgIHRlbXBieCA+Pj0gMTsKLSAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByLCBId0luZm8pKSB0ZW1wYnggPj49IDE7CisgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspICAgIHRlbXBieCA+Pj0gMTsKKyAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByKSkgdGVtcGJ4ID4+PSAxOwogCiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewogICAgICB0ZW1wID0gMDsKICAgICAgaWYodGVtcGJ4ID4gODAwKSAgICAgICAgdGVtcCA9IDB4NjA7CiAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgewogICAgICB0ZW1wID0gMDsKLSAgICAgaWYodGVtcGJ4ID09IDEwMjQpICAgICAgdGVtcCA9IDB4QTA7Ci0gICAgIGVsc2UgaWYodGVtcGJ4ID4gMTAyNCkgIHRlbXAgPSAweEMwOworICAgICBpZih0ZW1wYnggPiAxMDI0KSAgICAgICB0ZW1wID0gMHhDMDsKKyAgICAgZWxzZSBpZih0ZW1wYnggPj0gOTYwKSAgdGVtcCA9IDB4QTA7CiAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRZUGJQcjUyNXAgfCBUVlNldFlQYlByNzUwcCkpIHsKICAgICAgdGVtcCA9IDA7CiAgICAgIGlmKHRlbXBieCA+PSAxMjgwKSAgICAgIHRlbXAgPSAweDQwOwpAQCAtNzc5Niw4ICs3NjE5LDEzIEBACiAgICAgIGlmKHRlbXBieCA+PSAxMDI0KSAgICAgIHRlbXAgPSAweEEwOwogICB9CiAKKyAgdGVtcCB8PSBTaVNfUHItPkluaXRfUDRfMEU7CisKICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTI4MHgxMDI0KSB0ZW1wIHw9IDB4MEE7CisgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTI4MHgxMDI0KSB7CisgICAgICAgIHRlbXAgJj0gMHhmMDsKKyAgICAgICAgdGVtcCB8PSAweDBBOworICAgICB9CiAgIH0KIAogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MEUsMHgxMCx0ZW1wKTsKQEAgLTc4MjQsMTUgKzc2NTIsMTUgQEAKICAgdGVtcGVheCAvPSB0ZW1wZWJ4OwogICBpZih0ZW1wbG9uZykgdGVtcGVheCsrOwogCi0gIHRlbXAgPSAoVVNIT1JUKSh0ZW1wZWF4ICYgMHgwMDAwMDBGRik7CisgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKHRlbXBlYXggJiAweDAwMDAwMEZGKTsKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxQix0ZW1wKTsKLSAgdGVtcCA9IChVU0hPUlQpKCh0ZW1wZWF4ICYgMHgwMDAwRkYwMCkgPj4gOCk7CisgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKCh0ZW1wZWF4ICYgMHgwMDAwRkYwMCkgPj4gOCk7CiAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MUEsdGVtcCk7Ci0gIHRlbXAgPSAoVVNIT1JUKSgodGVtcGVheCA+PiAxMikgJiAweDcwKTsgLyogc2ljISAqLworICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSgodGVtcGVheCA+PiAxMikgJiAweDcwKTsgLyogc2ljISAqLwogICB0ZW1wIHw9ICh0ZW1wY3ggJiAweDRGKTsKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxOSx0ZW1wKTsKIAotICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKKyAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CiAKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxQywweDI4KTsKIApAQCAtNzg0MCwyMyArNzY2OCwyNiBAQAogICAgICB0ZW1wYnggPSAwOwogICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRIaVZpc2lvbiB8IFRWU2V0WVBiUHI3NTBwKSkgdGVtcGJ4ID0gMHgwODsKICAgICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfVkdBSERFOwotICAgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSAgICAgICAgICAgIHRlbXBheCA+Pj0gMTsKLSAgICAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByLCBId0luZm8pKSB0ZW1wYXggPj49IDE7CisgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspICAgIHRlbXBheCA+Pj0gMTsKKyAgICAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByKSkgdGVtcGF4ID4+PSAxOwogICAgICBpZih0ZW1wYXggPiA4MDApIHsKICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CiAJICAgdGVtcGF4IC09IDgwMDsKLQl9IGVsc2UgeyAgLyogNjUxKzMwMUM6IE9ubHkgaWYgVFZOb0hpdmlOb1lQYlByICovCisJfSBlbHNlIHsKIAkgICB0ZW1wYnggPSAweDA4OwotICAgICAgICAgICBpZih0ZW1wYXggPT0gMTAyNCkgdGVtcGF4ICo9IDI1OwotICAgICAgICAgICBlbHNlCSAgICAgICAgICAgICAgdGVtcGF4ICo9IDIwOworCSAgIGlmKHRlbXBheCA9PSA5NjApCSAgIHRlbXBheCAqPSAyNTsgLyogQ29ycmVjdCAqLworICAgICAgICAgICBlbHNlIGlmKHRlbXBheCA9PSAxMDI0KSB0ZW1wYXggKj0gMjU7CisgICAgICAgICAgIGVsc2UJCQkgICB0ZW1wYXggKj0gMjA7CiAJICAgdGVtcCA9IHRlbXBheCAlIDMyOwogCSAgIHRlbXBheCAvPSAzMjsKIAkgICBpZih0ZW1wKSB0ZW1wYXgrKzsKIAkgICB0ZW1wYXgrKzsKLQkgICBpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFZOb1lQYlBySGlWaXNpb24pIHx8Ci0JICAgICAgKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVpKSkgewotCSAgICAgIGlmKHJlc2luZm8gPT0gU0lTX1JJXzEwMjR4NzY4KSB7Ci0JICAgICAgICAgLyogT3RoZXJ3aXNlIHdoaXRlIGxpbmUgYXQgcmlnaHQgZWRnZSAqLworCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CisJICAgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfMTAyNHg3NjggfHwKKwkgICAgICAgICByZXNpbmZvID09IFNJU19SSV8xMDI0eDU3NiB8fAorCQkgcmVzaW5mbyA9PSBTSVNfUklfMTI4MHgxMDI0IHx8CisJCSByZXNpbmZvID09IFNJU19SSV8xMjgweDcyMCkgeworCSAgICAgICAgIC8qIE90aGVyd2lzZSB3aGl0ZSBsaW5lIG9yIGdhcmJhZ2UgYXQgcmlnaHQgZWRnZSAqLwogCSAgICAgICAgIHRlbXBheCA9ICh0ZW1wYXggJiAweGZmMDApIHwgMHgyMDsKIAkgICAgICB9CiAJICAgfQpAQCAtNzg2OCw3ICs3Njk5LDcgQEAKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxRSx0ZW1wKTsKIAogICAgICB0ZW1wID0gMHgwMDM2OyB0ZW1wYnggPSAweEQwOwotICAgICBpZigoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpICYmIChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFMVjMwMkxWKSkgeworICAgICBpZigoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpKSB7CiAJdGVtcCA9IDB4MDAyNjsgdGVtcGJ4ID0gMHhDMDsgLyogU2VlIEVuL0Rpc2FibGVCcmlkZ2UoKSAqLwogICAgICB9CiAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CkBAIC03ODg0LDM2ICs3NzE1LDI0IEBACiAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxRix0ZW1wYngsdGVtcCk7CiAKICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfSFQgPj4gMTsKLSAgICAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByLCBId0luZm8pKSB0ZW1wYnggPj49IDE7CisgICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QcikpIHRlbXBieCA+Pj0gMTsKICAgICAgdGVtcGJ4IC09IDI7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjIsdGVtcGJ4KTsKICAgICAgdGVtcCA9ICh0ZW1wYnggPj4gNSkgJiAweDM4OwogICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjEsMHhDMCx0ZW1wKTsKIAotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFMVjMwMkxWKSB7CisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKIAlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKICAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNCwweDBlKTsKIAkgICAvKiBMQ0QtdG9vLWRhcmstZXJyb3Itc291cmNlLCBzZWUgRmluYWxpemVMQ0QoKSAqLwogCX0KLQlpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotCSAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgewotCSAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNywweDJjKTsKLQkgICB9IGVsc2UgewotCSAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjcsfjB4MjApOwotCSAgIH0KLQl9Ci0JaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMkxWIHwgVkJfU0lTMzAyRUxWKSkgewotCSAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MmEsMHgwMCk7Ci0jaWZkZWYgU0VUX0VNSQotCSAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgwYyk7Ci0jZW5kaWYKLQkgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDM0LDB4MTApOwotCX0KICAgICAgfQogCisgICAgIFNpU19TZXREdWFsTGlua0V0YyhTaVNfUHIpOworCiAgIH0gIC8qIDMwMUIgKi8KIAotICBTaVNfU2V0Q1JUMlZDTEsoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIEh3SW5mbyk7CisgIFNpU19TZXRDUlQyVkNMSyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03OTIxLDggKzc3NDAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXRHcm91cDUoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldEdyb3VwNShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKIAogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSAgcmV0dXJuOwpAQCAtNzkzMCw3ICs3NzQ4LDcgQEAKICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPT0gTW9kZVZHQSkgewogICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRJblNsYXZlTW9kZSB8IExvYWREQUNGbGFnKSkpIHsKICAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweDIwKTsKLSAgICAgICAgU2lTX0xvYWREQUMoU2lTX1ByLCBId0luZm8sIE1vZGVObywgTW9kZUlkSW5kZXgpOworICAgICAgICBTaVNfTG9hZERBQyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogICAgICB9CiAgIH0KIH0KQEAgLTc5MzksMTE2ICs3NzU3LDE1NiBAQAogLyogICAgIE1PRElGWSBDUlQxIEdST1VQIEZPUiBTTEFWRSBNT0RFICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1TaVNfTW9kQ1JUMUNSVEMoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pCi17Ci0gIFVTSE9SVCB0ZW1wYWgsaSxtb2RlZmxhZyxqOwotICBVU0hPUlQgUmVzSW5kZXgsRGlzcGxheVR5cGU7Ci0gIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgKkxWRFNDUlQxUHRyPU5VTEw7CitzdGF0aWMgQk9PTEVBTgorU2lTX0dldExWRFNDUlQxUHRyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHVuc2lnbmVkIHNob3J0ICpSZXNJbmRleCwKKwkJICAgdW5zaWduZWQgc2hvcnQgKkRpc3BsYXlUeXBlKQorIHsKKyAgdW5zaWduZWQgc2hvcnQgbW9kZWZsYWcgPSAwOworICBCT09MRUFOIGNoZWNraGQgPSBUUlVFOwogCi0gIGlmKE1vZGVObyA8PSAweDEzKSBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gIGVsc2UgICAgICAgICAgICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVGbGFnOworICAvKiBQYXNzIDE6MSBub3Qgc3VwcG9ydGVkIGhlcmUgKi8KKworICBpZihNb2RlTm8gPD0gMHgxMykgeworICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7CisgICAgICgqUmVzSW5kZXgpID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQzsKKyAgfSBlbHNlIHsKKyAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKKyAgICAgKCpSZXNJbmRleCkgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQyQ1JUQzsKKyAgfQorCisgICgqUmVzSW5kZXgpICY9IDB4M0Y7CisKKyAgaWYoKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHgpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikpIHsKKworICAgICAoKkRpc3BsYXlUeXBlKSA9IDgwOworICAgICBpZigoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpICYmICghKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTSkpKSB7CisgICAgICAJKCpEaXNwbGF5VHlwZSkgPSA4MjsKKwlpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVWR0EpIHsKKwkgICBpZihTaVNfUHItPlNpU19DSFNPdmVyU2NhbikgKCpEaXNwbGF5VHlwZSkgPSA4NDsKKwl9CisgICAgIH0KKyAgICAgaWYoKCpEaXNwbGF5VHlwZSkgIT0gODQpIHsKKyAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRDSE92ZXJTY2FuKSAoKkRpc3BsYXlUeXBlKSsrOworICAgICB9CisKKyAgfSBlbHNlIHsKKworICAgICAoKkRpc3BsYXlUeXBlID0gMCk7CisgICAgIHN3aXRjaChTaVNfUHItPlNpU19MQ0RSZXNJbmZvKSB7CisgICAgIGNhc2UgUGFuZWxfMzIweDI0MF8xOiAoKkRpc3BsYXlUeXBlKSA9IDUwOworCQkJICAgY2hlY2toZCA9IEZBTFNFOworCQkJICAgYnJlYWs7CisgICAgIGNhc2UgUGFuZWxfMzIweDI0MF8yOiAoKkRpc3BsYXlUeXBlKSA9IDE0OworCQkJICAgYnJlYWs7CisgICAgIGNhc2UgUGFuZWxfMzIweDI0MF8zOiAoKkRpc3BsYXlUeXBlKSA9IDE4OworCQkJICAgYnJlYWs7CisgICAgIGNhc2UgUGFuZWxfNjQweDQ4MDogICAoKkRpc3BsYXlUeXBlKSA9IDEwOworCQkJICAgYnJlYWs7CisgICAgIGNhc2UgUGFuZWxfMTAyNHg2MDA6ICAoKkRpc3BsYXlUeXBlKSA9IDI2OworCQkJICAgYnJlYWs7CisgICAgIGRlZmF1bHQ6IHJldHVybiBUUlVFOworICAgICB9CisKKyAgICAgaWYoY2hlY2toZCkgeworICAgICAgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSAoKkRpc3BsYXlUeXBlKSsrOworICAgICB9CisKKyAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDYwMCkgeworICAgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgKCpEaXNwbGF5VHlwZSkgKz0gMjsKKyAgICAgfQorCisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK1NpU19Nb2RDUlQxQ1JUQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCit7CisgIHVuc2lnbmVkIHNob3J0IHRlbXBhaCwgaSwgbW9kZWZsYWcsIGosIFJlc0luZGV4LCBEaXNwbGF5VHlwZTsKKyAgY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEgKkxWRFNDUlQxUHRyPU5VTEw7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBDUklkeFtdID0geworCTB4MDAsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsCisJMHgwNywgMHgxMCwgMHgxMSwgMHgxNSwgMHgxNgorICB9OwogCiAgIGlmKChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9CQVJDTzEzNjYpIHx8CiAgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9CQVJDTzEwMjQpIHx8Ci0gICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkpCisgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgIHx8CisgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg1NikgKQogICAgICByZXR1cm47CiAKKyAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMpIHsKKyAgICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkgeworICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgcmV0dXJuOworICAgICB9CisgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgeworICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgcmV0dXJuOworICB9IGVsc2UgcmV0dXJuOworCisgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpIHJldHVybjsKKworICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpIHJldHVybjsKKyAgfQorCiAgIGlmKCEoU2lTX0dldExWRFNDUlQxUHRyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAmUmVzSW5kZXgsICZEaXNwbGF5VHlwZSkpKSB7CiAgICAgIHJldHVybjsKICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpIHJldHVybjsKLSAgfQotCiAgIHN3aXRjaChEaXNwbGF5VHlwZSkgewotICAgIGNhc2UgMCA6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDE4MDB4NjAwXzE7ICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDEgOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxODAweDYwMF8xX0g7ICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyIDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTgwMHg2MDBfMjsgICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMyA6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDE4MDB4NjAwXzJfSDsgICAgICAgICBicmVhazsKLSAgICBjYXNlIDQgOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg3NjhfMTsgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1IDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NzY4XzFfSDsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgNiA6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDc2OF8yOyAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDcgOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg3NjhfMl9IOyAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4IDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEyODB4MTAyNF8xOyAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgOSA6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMjgweDEwMjRfMV9IOyAgICAgICBicmVhazsKLSAgICBjYXNlIDEwOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHgxMDI0XzI7ICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMTogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEyODB4MTAyNF8yX0g7ICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDFYWFh4WFhYXzE7ICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDEzOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxWFhYeFhYWF8xX0g7ICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTE0MDB4MTA1MF8xOyAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTU6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExNDAweDEwNTBfMV9IOyAgICAgICBicmVhazsKLSAgICBjYXNlIDE2OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTQwMHgxMDUwXzI7ICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNzogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTE0MDB4MTA1MF8yX0g7ICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTg6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfQ0hUVkNSVDFVTlRTQzsgICAgICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDE5OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0NIVFZDUlQxT05UU0M7ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19DSFRWQ1JUMVVQQUw7ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjE6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfQ0hUVkNSVDFPUEFMOyAgICAgICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDIyOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDQ4MF8xOyAgICAgICAgICAgYnJlYWs7IC8qIEZTVE4gKi8KLSAgICBjYXNlIDIzOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMTsgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NjAwXzFfSDsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjU6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDYwMF8yOyAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDI2OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMl9IOyAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNzogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTExNTJ4NzY4XzE7ICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjg6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMTUyeDc2OF8xX0g7ICAgICAgICBicmVhazsKLSAgICBjYXNlIDI5OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTE1Mng3NjhfMjsgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTExNTJ4NzY4XzJfSDsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzY6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExNjAweDEyMDBfMTsgICAgICAgICBicmVhazsKLSAgICBjYXNlIDM3OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTYwMHgxMjAwXzFfSDsgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzODogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTE2MDB4MTIwMF8yOyAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzk6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExNjAweDEyMDBfMl9IOyAgICAgICBicmVhazsKLSAgICBjYXNlIDQwOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHg3NjhfMTsgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0MTogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEyODB4NzY4XzFfSDsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDI6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMjgweDc2OF8yOyAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDQzOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHg3NjhfMl9IOyAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1MDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTY0MHg0ODBfMTsgICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgNTE6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDE2NDB4NDgwXzFfSDsgICAgICAgICBicmVhazsKLSAgICBjYXNlIDUyOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxNjQweDQ4MF8yOyAgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1MzogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTY0MHg0ODBfMl9IOyAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgNTQ6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDE2NDB4NDgwXzM7ICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDU1OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxNjQweDQ4MF8zX0g7ICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5OTogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19DSFRWQ1JUMVNPUEFMOyAgICAgICAgICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDc2OF8xOyAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDUwOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8xOyAgICAgICAgICAgYnJlYWs7IC8qIHhTVE4gKi8KKyAgICBjYXNlIDE0OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8yOyAgICAgICAgICAgYnJlYWs7IC8qIHhTVE4gKi8KKyAgICBjYXNlIDE1OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8yX0g7ICAgICAgICAgYnJlYWs7IC8qIHhTVE4gKi8KKyAgICBjYXNlIDE4OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8zOyAgICAgICAgICAgYnJlYWs7IC8qIHhTVE4gKi8KKyAgICBjYXNlIDE5OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8zX0g7ICAgICAgICAgYnJlYWs7IC8qIHhTVE4gKi8KKyAgICBjYXNlIDEwOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxNjQweDQ4MF8xOyAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTY0MHg0ODBfMV9IOyAgICAgICAgIGJyZWFrOworI2lmIDAgLyogV29ya3MgYmV0dGVyIHdpdGggY2FsY3VsYXRlZCBudW1iZXJzICovCisgICAgY2FzZSAyNjogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NjAwXzE7ICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjc6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDYwMF8xX0g7ICAgICAgICBicmVhazsKKyAgICBjYXNlIDI4OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMjsgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOTogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NjAwXzJfSDsgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSA4MDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19DSFRWQ1JUMVVOVFNDOyAgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgODE6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfQ0hUVkNSVDFPTlRTQzsgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDgyOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0NIVFZDUlQxVVBBTDsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4MzogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19DSFRWQ1JUMU9QQUw7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgODQ6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfQ0hUVkNSVDFTT1BBTDsgICAgICAgICAgICAgICBicmVhazsKICAgfQogCi0gIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDExLDB4N2YpOworICBpZihMVkRTQ1JUMVB0cikgewogCi0gIHRlbXBhaCA9IChMVkRTQ1JUMVB0ciArIFJlc0luZGV4KS0+Q1JbMF07Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDAwLHRlbXBhaCk7CisgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDExLDB4N2YpOwogCi0gIGZvcihpPTB4MDIsaj0xO2k8PTB4MDU7aSsrLGorKyl7Ci0gICAgdGVtcGFoID0gKExWRFNDUlQxUHRyICsgUmVzSW5kZXgpLT5DUltqXTsKLSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaSx0ZW1wYWgpOwotICB9Ci0gIGZvcihpPTB4MDYsaj01O2k8PTB4MDc7aSsrLGorKyl7Ci0gICAgdGVtcGFoID0gKExWRFNDUlQxUHRyICsgUmVzSW5kZXgpLT5DUltqXTsKLSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaSx0ZW1wYWgpOwotICB9Ci0gIGZvcihpPTB4MTAsaj03O2k8PTB4MTE7aSsrLGorKyl7Ci0gICAgdGVtcGFoID0gKExWRFNDUlQxUHRyICsgUmVzSW5kZXgpLT5DUltqXTsKLSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaSx0ZW1wYWgpOwotICB9Ci0gIGZvcihpPTB4MTUsaj05O2k8PTB4MTY7aSsrLGorKyl7Ci0gICAgdGVtcGFoID0gKExWRFNDUlQxUHRyICsgUmVzSW5kZXgpLT5DUltqXTsKLSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaSx0ZW1wYWgpOwotICB9Ci0gIGZvcihpPTB4MEEsaj0xMTtpPD0weDBDO2krKyxqKyspewotICAgIHRlbXBhaCA9IChMVkRTQ1JUMVB0ciArIFJlc0luZGV4KS0+Q1Jbal07Ci0gICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LGksdGVtcGFoKTsKLSAgfQorICAgICBmb3IoaSA9IDA7IGkgPD0gMTA7IGkrKykgeworICAgICAgICB0ZW1wYWggPSAoTFZEU0NSVDFQdHIgKyBSZXNJbmRleCktPkNSW2ldOworICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsQ1JJZHhbaV0sdGVtcGFoKTsKKyAgICAgfQogCi0gIHRlbXBhaCA9IChMVkRTQ1JUMVB0ciArIFJlc0luZGV4KS0+Q1JbMTRdOwotICB0ZW1wYWggJj0gMHhFMDsKLSAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwRSwweDFmLHRlbXBhaCk7CisgICAgIGZvcihpID0gMHgwQSwgaiA9IDExOyBpIDw9IDB4MEM7IGkrKywgaisrKSB7CisgICAgICAgIHRlbXBhaCA9IChMVkRTQ1JUMVB0ciArIFJlc0luZGV4KS0+Q1Jbal07CisgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCxpLHRlbXBhaCk7CisgICAgIH0KIAotICB0ZW1wYWggPSAoTFZEU0NSVDFQdHIgKyBSZXNJbmRleCktPkNSWzE0XTsKLSAgdGVtcGFoICY9IDB4MDE7Ci0gIHRlbXBhaCA8PD0gNTsKLSAgaWYobW9kZWZsYWcgJiBEb3VibGVTY2FuTW9kZSkgIHRlbXBhaCB8PSAweDA4MDsKLSAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzZDQsMHgwOSx+MHgwMjAsdGVtcGFoKTsKKyAgICAgdGVtcGFoID0gKExWRFNDUlQxUHRyICsgUmVzSW5kZXgpLT5DUlsxNF0gJiAweEUwOworICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDBFLDB4MWYsdGVtcGFoKTsKKworICAgICBpZihNb2RlTm8gPD0gMHgxMykgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOworICAgICBlbHNlICAgICAgICAgICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKKworICAgICB0ZW1wYWggPSAoKExWRFNDUlQxUHRyICsgUmVzSW5kZXgpLT5DUlsxNF0gJiAweDAxKSA8PCA1OworICAgICBpZihtb2RlZmxhZyAmIERvdWJsZVNjYW5Nb2RlKSB0ZW1wYWggfD0gMHg4MDsKKyAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzZDQsMHgwOSx+MHgwMjAsdGVtcGFoKTsKKworICB9IGVsc2UgeworCisgICAgIFNpU19DYWxjTENEQUNSVDFUaW1pbmcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKworICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04MDU2LDI0ICs3OTE0LDI0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDJFQ0xLKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRDUlQyRUNMSyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKyAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCBjbGtiYXNlLCB2Y2xraW5kZXg9MDsKLSAgVUNIQVIgIHNyMmIsIHNyMmM7CisgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgdW5zaWduZWQgc2hvcnQgY2xrYmFzZSwgdmNsa2luZGV4ID0gMDsKKyAgdW5zaWduZWQgY2hhciAgc3IyYiwgc3IyYzsKIAotICBpZigoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF82NDB4NDgwKSB8fCAoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkpIHsKLQlTaVNfUHItPlNpU19TZXRGbGFnICY9ICh+UHJvZ3JhbW1pbmdDUlQyKTsKLSAgICAgICAgaWYoKFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVFZDTEsgJiAweDNmKSA9PSAyKSB7Ci0JICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LS07Ci0JfQotCXZjbGtpbmRleCA9IFNpU19HZXRWQ0xLMlB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIEh3SW5mbyk7Ci0JU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBQcm9ncmFtbWluZ0NSVDI7CisgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpIHsKKyAgICAgU2lTX1ByLT5TaVNfU2V0RmxhZyAmPSAoflByb2dyYW1taW5nQ1JUMik7CisgICAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVFZDTEsgPT0gMikgeworCVJlZnJlc2hSYXRlVGFibGVJbmRleC0tOworICAgICB9CisgICAgIHZjbGtpbmRleCA9IFNpU19HZXRWQ0xLMlB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IFByb2dyYW1taW5nQ1JUMjsKICAgfSBlbHNlIHsKLSAgICAgICAgdmNsa2luZGV4ID0gU2lTX0dldFZDTEsyUHRyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgSHdJbmZvKTsKKyAgICAgdmNsa2luZGV4ID0gU2lTX0dldFZDTEsyUHRyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAgIH0KIAogICBzcjJiID0gU2lTX1ByLT5TaVNfVkNMS0RhdGFbdmNsa2luZGV4XS5TUjJCOwpAQCAtODA4Miw3ICs3OTQwLDcgQEAKICAgaWYoKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTM2NikgfHwgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTAyNCkpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSB7CiAJaWYoUk9NQWRkclsweDIyMF0gJiAweDAxKSB7Ci0gICAgICAgICAgIHNyMmIgPSBST01BZGRyWzB4MjI3XTsKKwkgICBzcjJiID0gUk9NQWRkclsweDIyN107CiAJICAgc3IyYyA9IFJPTUFkZHJbMHgyMjhdOwogCX0KICAgICAgfQpAQCAtODA5MSw3ICs3OTQ5LDcgQEAKICAgY2xrYmFzZSA9IDB4MDJCOwogICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7CiAgICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB7Ci0gICAgCWNsa2Jhc2UgKz0gMzsKKwljbGtiYXNlICs9IDM7CiAgICAgIH0KICAgfQogCkBAIC04MTExLDM2OCArNzk2OSwzMzEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0Q0hUVlJlZyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQorU2lTX1NldENIVFZSZWcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCiB7Ci0jaWYgZGVmaW5lZChTSVMzMDApIHx8IGRlZmluZWQoU0lTMzE1SCkKLSAgVVNIT1JUIHRlbXAsIHRlbXBieDsKLSNlbmRpZgotICBVU0hPUlQgdGVtcGNsOwotICBVU0hPUlQgVFZUeXBlLCByZXNpbmRleDsKLSAgY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0ICpDSFRWUmVnRGF0YSA9IE5VTEw7CisgICB1bnNpZ25lZCBzaG9ydCBUVlR5cGUsIHJlc2luZGV4OworICAgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSAqQ0hUVlJlZ0RhdGEgPSBOVUxMOwogCi0gIGlmKE1vZGVObyA8PSAweDEzKQotICAgICB0ZW1wY2wgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X0NSVDJDUlRDOwotICBlbHNlCi0gICAgIHRlbXBjbCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVDJDUlRDOworICAgaWYoTW9kZU5vIDw9IDB4MTMpCisgICAgICByZXNpbmRleCA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfQ1JUMkNSVEM7CisgICBlbHNlCisgICAgICByZXNpbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVDJDUlRDOwogCi0gIFRWVHlwZSA9IDA7Ci0gIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0Q0hPdmVyU2NhbikgVFZUeXBlICs9IDE7Ci0gIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSB7Ci0gIAlUVlR5cGUgKz0gMjsKLQlpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVWR0EpIHsKLQkgICBpZihTaVNfUHItPlNpU19DSFNPdmVyU2NhbikgVFZUeXBlID0gODsKLQl9Ci0JaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUxNKSB7Ci0JCVRWVHlwZSA9IDQ7Ci0JCWlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0Q0hPdmVyU2NhbikgVFZUeXBlICs9IDE7Ci0JfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTikgewotCQlUVlR5cGUgPSA2OwotCQlpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pIFRWVHlwZSArPSAxOwotCX0KLSAgfQotICBzd2l0Y2goVFZUeXBlKSB7Ci0gICAgIGNhc2UgIDA6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19VTlRTQzsgYnJlYWs7Ci0gICAgIGNhc2UgIDE6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PTlRTQzsgYnJlYWs7Ci0gICAgIGNhc2UgIDI6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19VUEFMOyAgYnJlYWs7Ci0gICAgIGNhc2UgIDM6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PUEFMOyAgYnJlYWs7Ci0gICAgIGNhc2UgIDQ6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19VUEFMTTsgYnJlYWs7Ci0gICAgIGNhc2UgIDU6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PUEFMTTsgYnJlYWs7Ci0gICAgIGNhc2UgIDY6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19VUEFMTjsgYnJlYWs7Ci0gICAgIGNhc2UgIDc6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PUEFMTjsgYnJlYWs7Ci0gICAgIGNhc2UgIDg6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19TT1BBTDsgYnJlYWs7Ci0gICAgIGRlZmF1bHQ6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PUEFMOyAgYnJlYWs7Ci0gIH0KLSAgcmVzaW5kZXggPSB0ZW1wY2wgJiAweDNGOworICAgcmVzaW5kZXggJj0gMHgzRjsKIAotICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDEpIHsKKyAgIFRWVHlwZSA9IDA7CisgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pIFRWVHlwZSArPSAxOworICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKKyAgICAgIFRWVHlwZSArPSAyOworICAgICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPiBNb2RlVkdBKSB7CisJIGlmKFNpU19Qci0+U2lTX0NIU092ZXJTY2FuKSBUVlR5cGUgPSA4OworICAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUxNKSB7CisJIFRWVHlwZSA9IDQ7CisJIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0Q0hPdmVyU2NhbikgVFZUeXBlICs9IDE7CisgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUxOKSB7CisJIFRWVHlwZSA9IDY7CisJIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0Q0hPdmVyU2NhbikgVFZUeXBlICs9IDE7CisgICAgICB9CisgICB9CisKKyAgIHN3aXRjaChUVlR5cGUpIHsKKyAgICAgIGNhc2UgIDA6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19VTlRTQzsgYnJlYWs7CisgICAgICBjYXNlICAxOiBDSFRWUmVnRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZSZWdfT05UU0M7IGJyZWFrOworICAgICAgY2FzZSAgMjogQ0hUVlJlZ0RhdGEgPSBTaVNfUHItPlNpU19DSFRWUmVnX1VQQUw7ICBicmVhazsKKyAgICAgIGNhc2UgIDM6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PUEFMOyAgYnJlYWs7CisgICAgICBjYXNlICA0OiBDSFRWUmVnRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZSZWdfVVBBTE07IGJyZWFrOworICAgICAgY2FzZSAgNTogQ0hUVlJlZ0RhdGEgPSBTaVNfUHItPlNpU19DSFRWUmVnX09QQUxNOyBicmVhazsKKyAgICAgIGNhc2UgIDY6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19VUEFMTjsgYnJlYWs7CisgICAgICBjYXNlICA3OiBDSFRWUmVnRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZSZWdfT1BBTE47IGJyZWFrOworICAgICAgY2FzZSAgODogQ0hUVlJlZ0RhdGEgPSBTaVNfUHItPlNpU19DSFRWUmVnX1NPUEFMOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PUEFMOyAgYnJlYWs7CisgICB9CisKKworICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAxKSB7CiAKICNpZmRlZiBTSVMzMDAKIAotICAgICAvKiBDaHJvbnRlbCA3MDA1IC0gSSBhc3N1bWUgdGhhdCBpdCBkb2VzIG5vdCBjb21lIHdpdGggYSAzMTUgc2VyaWVzIGNoaXAgKi8KKyAgICAgIC8qIENocm9udGVsIDcwMDUgLSBJIGFzc3VtZSB0aGF0IGl0IGRvZXMgbm90IGNvbWUgd2l0aCBhIDMxNSBzZXJpZXMgY2hpcCAqLwogCi0gICAgIC8qIFdlIGRvbid0IHN1cHBvcnQgbW9kZXMgPjgwMHg2MDAgKi8KLSAgICAgaWYgKHJlc2luZGV4ID4gNSkgcmV0dXJuOworICAgICAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBtb2RlcyA+ODAweDYwMCAqLworICAgICAgaWYgKHJlc2luZGV4ID4gNSkgcmV0dXJuOwogCi0gICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSB7Ci0gICAgCVNpU19TZXRDSDcwMHgoU2lTX1ByLDB4NDMwNCk7ICAgLyogMHg0MD03NnVBIChQQUwpOyAweDAzPTE1Yml0IG5vbi1tdWx0aSBSR0IqLwotICAgIAlTaVNfU2V0Q0g3MDB4KFNpU19QciwweDY5MDkpOwkvKiBCbGFjayBsZXZlbCBmb3IgUEFMICgxMDUpKi8KLSAgICAgfSBlbHNlIHsKLSAgICAJU2lTX1NldENINzAweChTaVNfUHIsMHgwMzA0KTsgICAvKiB1cHBlciBuaWJibGU9NzF1QSAoTlRTQyksIDB4MDM9MTViaXQgbm9uLW11bHRpIFJHQiovCi0gICAgCVNpU19TZXRDSDcwMHgoU2lTX1ByLDB4NzEwOSk7CS8qIEJsYWNrIGxldmVsIGZvciBOVFNDICgxMTMpKi8KLSAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKKwkgU2lTX1NldENINzAweChTaVNfUHIsMHgwNCwweDQzKTsgIC8qIDB4NDA9NzZ1QSAoUEFMKTsgMHgwMz0xNWJpdCBub24tbXVsdGkgUkdCKi8KKwkgU2lTX1NldENINzAweChTaVNfUHIsMHgwOSwweDY5KTsgIC8qIEJsYWNrIGxldmVsIGZvciBQQUwgKDEwNSkqLworICAgICAgfSBlbHNlIHsKKwkgU2lTX1NldENINzAweChTaVNfUHIsMHgwNCwweDAzKTsgICAvKiB1cHBlciBuaWJibGU9NzF1QSAoTlRTQyksIDB4MDM9MTViaXQgbm9uLW11bHRpIFJHQiovCisJIFNpU19TZXRDSDcwMHgoU2lTX1ByLDB4MDksMHg3MSk7ICAgLyogQmxhY2sgbGV2ZWwgZm9yIE5UU0MgKDExMykqLworICAgICAgfQogCi0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzBdOwotICAgICB0ZW1wYng9KCh0ZW1wJjB4MDBGRik8PDgpfDB4MDA7CS8qIE1vZGUgcmVnaXN0ZXIgKi8KLSAgICAgU2lTX1NldENINzAweChTaVNfUHIsdGVtcGJ4KTsKLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMV07Ci0gICAgIHRlbXBieD0oKHRlbXAmMHgwMEZGKTw8OCl8MHgwNzsJLyogU3RhcnQgYWN0aXZlIHZpZGVvIHJlZ2lzdGVyICovCi0gICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLHRlbXBieCk7Ci0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzJdOwotICAgICB0ZW1wYng9KCh0ZW1wJjB4MDBGRik8PDgpfDB4MDg7CS8qIFBvc2l0aW9uIG92ZXJmbG93IHJlZ2lzdGVyICovCi0gICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLHRlbXBieCk7Ci0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzNdOwotICAgICB0ZW1wYng9KCh0ZW1wJjB4MDBGRik8PDgpfDB4MEE7CS8qIEhvcml6IFBvc2l0aW9uIHJlZ2lzdGVyICovCi0gICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLHRlbXBieCk7Ci0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzRdOwotICAgICB0ZW1wYng9KCh0ZW1wJjB4MDBGRik8PDgpfDB4MEI7CS8qIFZlcnRpY2FsIFBvc2l0aW9uIHJlZ2lzdGVyICovCi0gICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLHRlbXBieCk7CisgICAgICBTaVNfU2V0Q0g3MDB4KFNpU19QciwweDAwLENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMF0pOwkvKiBNb2RlIHJlZ2lzdGVyICovCisgICAgICBTaVNfU2V0Q0g3MDB4KFNpU19QciwweDA3LENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMV0pOwkvKiBTdGFydCBhY3RpdmUgdmlkZW8gcmVnaXN0ZXIgKi8KKyAgICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLDB4MDgsQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1syXSk7CS8qIFBvc2l0aW9uIG92ZXJmbG93IHJlZ2lzdGVyICovCisgICAgICBTaVNfU2V0Q0g3MDB4KFNpU19QciwweDBhLENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbM10pOwkvKiBIb3JpeiBQb3NpdGlvbiByZWdpc3RlciAqLworICAgICAgU2lTX1NldENINzAweChTaVNfUHIsMHgwYixDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzRdKTsJLyogVmVydGljYWwgUG9zaXRpb24gcmVnaXN0ZXIgKi8KIAotICAgICAvKiBTZXQgbWluaW11bSBmbGlja2VyIGZpbHRlciBmb3IgTHVtYSBjaGFubmVsIChTUjEtMD0wMCksCisgICAgICAvKiBTZXQgbWluaW11bSBmbGlja2VyIGZpbHRlciBmb3IgTHVtYSBjaGFubmVsIChTUjEtMD0wMCksCiAgICAgICAgICAgICAgICAgbWluaW11bSB0ZXh0IGVuaGFuY2VtZW50IChTMy0yPTEwKSwKICAgIAkgICAgICAgIG1heGltdW0gZmxpY2tlciBmaWx0ZXIgZm9yIENocm9tYSBjaGFubmVsIChTNS00PTEwKQogCSAgICAgICAgPTAwMTAxMDAwPTB4MjggKFdoZW4gcmVhZGluZywgUzEtMC0+UzMtMiwgYW5kIFMzLTItPlMxLTAhKQotICAgICAgKi8KLSAgICAgU2lTX1NldENINzAweChTaVNfUHIsMHgyODAxKTsKKyAgICAgICAqLworICAgICAgU2lTX1NldENINzAweChTaVNfUHIsMHgwMSwweDI4KTsKIAotICAgICAvKiBTZXQgdmlkZW8gYmFuZHdpZHRoCisgICAgICAvKiBTZXQgdmlkZW8gYmFuZHdpZHRoCiAgICAgICAgICAgICBIaWdoIGJhbmR3aXRoIEx1bWEgY29tcG9zaXRlIHZpZGVvIGZpbHRlcihTMD0xKQogICAgICAgICAgICAgbG93IGJhbmR3aXRoIEx1bWEgUy12aWRlbyBmaWx0ZXIgKFMyLTE9MDApCiAJICAgIGRpc2FibGUgcGVhayBmaWx0ZXIgaW4gUy12aWRlbyBjaGFubmVsIChTMz0wKQogCSAgICBoaWdoIGJhbmR3aWR0aCBDaHJvbWEgRmlsdGVyIChTNS00PTExKQogCSAgICA9MDAxMTAwMDE9MHgzMQotICAgICAqLwotICAgICBTaVNfU2V0Q0g3MDB4KFNpU19QciwweGIxMDMpOyAgICAgICAvKiBvbGQ6IDMxMDMgKi8KLQotICAgICAvKiBSZWdpc3RlciAweDNEIGRvZXMgbm90IGV4aXN0IGluIG5vbi1tYWNyb3Zpc2lvbiByZWdpc3RlciBtYXAKLSAgICAgICAgICAgIChNYXliZSB0aGlzIGlzIGEgbWFjcm92aXNpb24gcmVnaXN0ZXI/KQogICAgICAgKi8KKyAgICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLDB4MDMsMHhiMSk7ICAgICAgIC8qIG9sZDogMzEwMyAqLworCisgICAgICAvKiBSZWdpc3RlciAweDNEIGRvZXMgbm90IGV4aXN0IGluIG5vbi1tYWNyb3Zpc2lvbiByZWdpc3RlciBtYXAKKyAgICAgICAgICAgIChNYXliZSB0aGlzIGlzIGEgbWFjcm92aXNpb24gcmVnaXN0ZXI/KQorICAgICAgICovCiAjaWZuZGVmIFNJU19DUAotICAgICBTaVNfU2V0Q0g3MHh4KFNpU19QciwweDAwM0QpOworICAgICAgU2lTX1NldENINzB4eChTaVNfUHIsMHgzZCwweDAwKTsKICNlbmRpZgogCi0gICAgIC8qIFJlZ2lzdGVyIDB4MTAgb25seSBjb250YWlucyAxIHdyaXRhYmxlIGJpdCAoUzApIGZvciBzZW5zaW5nLAotICAgICAgICAgICAgYWxsIG90aGVyIGJpdHMgYSByZWFkLW9ubHkuIE1hY3JvdmlzaW9uPwotICAgICAgKi8KLSAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAwMTAsMHgxRik7CisgICAgICAvKiBSZWdpc3RlciAweDEwIG9ubHkgY29udGFpbnMgMSB3cml0YWJsZSBiaXQgKFMwKSBmb3Igc2Vuc2luZywKKyAgICAgICAgICAgICBhbGwgb3RoZXIgYml0cyBhIHJlYWQtb25seS4gTWFjcm92aXNpb24/CisgICAgICAgKi8KKyAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgxMCwweDAwLDB4MUYpOwogCi0gICAgIC8qIFJlZ2lzdGVyIDB4MTEgb25seSBjb250YWlucyAzIHdyaXRhYmxlIGJpdHMgKFMwLVMyKSBmb3IKLSAgICAgICAgICAgIGNvbnRyYXN0IGVuaGFuY2VtZW50IChzZXQgdG8gMDEwIC0+IGdhaW4gMSBZb3V0ID0gMTcvMTYqKFlpbi0zMCkgKQotICAgICAgKi8KLSAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAyMTEsMHhGOCk7CisgICAgICAvKiBSZWdpc3RlciAweDExIG9ubHkgY29udGFpbnMgMyB3cml0YWJsZSBiaXRzIChTMC1TMikgZm9yCisgICAgICAgICAgICAgY29udHJhc3QgZW5oYW5jZW1lbnQgKHNldCB0byAwMTAgLT4gZ2FpbiAxIFlvdXQgPSAxNy8xNiooWWluLTMwKSApCisgICAgICAgKi8KKyAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgxMSwweDAyLDB4RjgpOwogCi0gICAgIC8qIENsZWFyIERTRU4KLSAgICAgICovCi0gICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMDFDLDB4RUYpOworICAgICAgLyogQ2xlYXIgRFNFTgorICAgICAgICovCisgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MWMsMHgwMCwweEVGKTsKIAotICAgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSkgewkJLyogLS0tLSBOVFNDIC0tLS0gKi8KLSAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pIHsKLSAgICAgICAgIGlmKHJlc2luZGV4ID09IDB4MDQpIHsgICAJCQkvKiA2NDB4NDgwIG92ZXJzY2FuOiBNb2RlIDE2ICovCi0gICAgICAJICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAwMjAsMHhFRik7ICAgCS8qIGxvb3AgZmlsdGVyIG9mZiAqLwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDEyMSwweEZFKTsgICAgICAvKiBBQ0lWIG9uLCBubyBuZWVkIHRvIHNldCBGU0NJICovCi0gICAgICAgICB9IGVsc2UgaWYocmVzaW5kZXggPT0gMHgwNSkgeyAgICAJCS8qIDgwMHg2MDAgb3ZlcnNjYW46IE1vZGUgMjMgKi8KLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAxMTgsMHhGMCk7CS8qIDB4MTgtMHgxZjogRlNDSSA0NjksNzYyLDA0OCAqLwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MEMxOSwweEYwKTsKLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAwMUEsMHhGMCk7Ci0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMDFCLDB4RjApOwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDAxQywweEYwKTsKLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAwMUQsMHhGMCk7Ci0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMDFFLDB4RjApOwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDAxRiwweEYwKTsKLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAxMjAsMHhFRik7ICAgICAgIC8qIExvb3AgZmlsdGVyIG9uIGZvciBtb2RlIDIzICovCi0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMDIxLDB4RkUpOyAgICAgICAvKiBBQ0lWIG9mZiwgbmVlZCB0byBzZXQgRlNDSSAqLwotICAgICAgICAgfQotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZihyZXNpbmRleCA9PSAweDA0KSB7ICAgICAJCQkgLyogLS0tLS0gNjQweDQ4MCB1bmRlcnNjYW47IE1vZGUgMTcgKi8KLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAwMjAsMHhFRik7IAkgLyogbG9vcCBmaWx0ZXIgb2ZmICovCi0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMTIxLDB4RkUpOwotICAgICAgICAgfSBlbHNlIGlmKHJlc2luZGV4ID09IDB4MDUpIHsgICAJCSAvKiAtLS0tLSA4MDB4NjAwIHVuZGVyc2NhbjogTW9kZSAyNCAqLwotI2lmIDAKLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAxMTgsMHhGMCk7ICAgICAgIC8qIChGU0NJIHdhcyAweDFmMWM3MWM3IC0gdGhpcyBpcyBmb3IgbW9kZSAyMikgKi8KLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDA5MTksMHhGMCk7CSAvKiBGU0NJIGZvciBtb2RlIDI0IGlzIDQyOCw1NTQsODUxICovCi0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwODFBLDB4RjApOyAgICAgICAvKiAxOThiM2E2MyAqLwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MGIxQiwweEYwKTsKLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDA0MUMsMHhGMCk7Ci0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMTFELDB4RjApOwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDYxRSwweEYwKTsKLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDA1MUYsMHhGMCk7Ci0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMDIwLDB4RUYpOyAgICAgICAvKiBsb29wIGZpbHRlciBvZmYgZm9yIG1vZGUgMjQgKi8KLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAwMjEsMHhGRSk7CSAvKiBBQ0lWIG9mZiwgbmVlZCB0byBzZXQgRlNDSSAqLwotI2VuZGlmICAgICAvKiBBbGwgYWx0ZXJuYXRpdmVzIHdyb25nIChkYXRhc2hlZXQgd3Jvbmc/KSwgZG9uJ3QgdXNlIEZTQ0kgKi8KLQkgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDAyMCwweEVGKTsgCSAvKiBsb29wIGZpbHRlciBvZmYgKi8KLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAxMjEsMHhGRSk7Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICB9IGVsc2UgewkJCQkJCS8qIC0tLS0gUEFMIC0tLS0gKi8KLSAgICAgICAgICAgLyogV2UgZG9uJ3QgcGxheSBhcm91bmQgd2l0aCBGU0NJIGluIFBBTCBtb2RlICovCi0gICAgICAgICBpZihyZXNpbmRleCA9PSAweDA0KSB7Ci0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMDIwLDB4RUYpOyAJLyogbG9vcCBmaWx0ZXIgb2ZmICovCi0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMTIxLDB4RkUpOyAgICAgIC8qIEFDSVYgb24gKi8KKyAgICAgIGlmKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpKSB7CQkvKiAtLS0tIE5UU0MgLS0tLSAqLworICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRDSE92ZXJTY2FuKSB7CisgICAgICAgICAgICBpZihyZXNpbmRleCA9PSAweDA0KSB7ICAgCQkJLyogNjQweDQ4MCBvdmVyc2NhbjogTW9kZSAxNiAqLworICAgICAgCSAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MjAsMHgwMCwweEVGKTsJLyogbG9vcCBmaWx0ZXIgb2ZmICovCisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MjEsMHgwMSwweEZFKTsJLyogQUNJViBvbiwgbm8gbmVlZCB0byBzZXQgRlNDSSAqLworICAgICAgICAgICAgfSBlbHNlIGlmKHJlc2luZGV4ID09IDB4MDUpIHsgICAgCQkvKiA4MDB4NjAwIG92ZXJzY2FuOiBNb2RlIDIzICovCisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MTgsMHgwMSwweEYwKTsJLyogMHgxOC0weDFmOiBGU0NJIDQ2OSw3NjIsMDQ4ICovCisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MTksMHgwQywweEYwKTsKKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgxYSwweDAwLDB4RjApOworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDFiLDB4MDAsMHhGMCk7CisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MWMsMHgwMCwweEYwKTsKKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgxZCwweDAwLDB4RjApOworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDFlLDB4MDAsMHhGMCk7CisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MWYsMHgwMCwweEYwKTsKKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgyMCwweDAxLDB4RUYpOwkvKiBMb29wIGZpbHRlciBvbiBmb3IgbW9kZSAyMyAqLworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDIxLDB4MDAsMHhGRSk7CS8qIEFDSVYgb2ZmLCBuZWVkIHRvIHNldCBGU0NJICovCisgICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDAyMCwweEVGKTsgCS8qIGxvb3AgZmlsdGVyIG9mZiAqLwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDEyMSwweEZFKTsgICAgICAvKiBBQ0lWIG9uICovCisgICAgICAgICAgICBpZihyZXNpbmRleCA9PSAweDA0KSB7ICAgICAJCQkvKiAtLS0tLSA2NDB4NDgwIHVuZGVyc2NhbjsgTW9kZSAxNyAqLworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDIwLDB4MDAsMHhFRik7CS8qIGxvb3AgZmlsdGVyIG9mZiAqLworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDIxLDB4MDEsMHhGRSk7CisgICAgICAgICAgICB9IGVsc2UgaWYocmVzaW5kZXggPT0gMHgwNSkgeyAgIAkJLyogLS0tLS0gODAweDYwMCB1bmRlcnNjYW46IE1vZGUgMjQgKi8KKyNpZiAwCisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MTgsMHgwMSwweEYwKTsJLyogKEZTQ0kgd2FzIDB4MWYxYzcxYzcgLSB0aGlzIGlzIGZvciBtb2RlIDIyKSAqLworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDE5LDB4MDksMHhGMCk7CS8qIEZTQ0kgZm9yIG1vZGUgMjQgaXMgNDI4LDU1NCw4NTEgKi8KKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgxYSwweDA4LDB4RjApOyAgICAgICAvKiAxOThiM2E2MyAqLworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDFiLDB4MGIsMHhGMCk7CisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MWMsMHgwNCwweEYwKTsKKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgxZCwweDAxLDB4RjApOworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDFlLDB4MDYsMHhGMCk7CisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MWYsMHgwNSwweEYwKTsKKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgyMCwweDAwLDB4RUYpOwkvKiBsb29wIGZpbHRlciBvZmYgZm9yIG1vZGUgMjQgKi8KKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgyMSwweDAwLDB4RkUpOwkqIEFDSVYgb2ZmLCBuZWVkIHRvIHNldCBGU0NJICovCisjZW5kaWYgICAgICAgICAvKiBBbGwgYWx0ZXJuYXRpdmVzIHdyb25nIChkYXRhc2hlZXQgd3Jvbmc/KSwgZG9uJ3QgdXNlIEZTQ0kgKi8KKwkgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDIwLDB4MDAsMHhFRik7CSAvKiBsb29wIGZpbHRlciBvZmYgKi8KKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgyMSwweDAxLDB4RkUpOworICAgICAgICAgICAgfQogICAgICAgICAgfQotICAgICB9Ci0gICAgIAorICAgICAgfSBlbHNlIHsJCQkJCQkvKiAtLS0tIFBBTCAtLS0tICovCisgICAgICAgICAvKiBXZSBkb24ndCBwbGF5IGFyb3VuZCB3aXRoIEZTQ0kgaW4gUEFMIG1vZGUgKi8KKyAgICAgICAgIGlmKHJlc2luZGV4ID09IDB4MDQpIHsKKyAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgyMCwweDAwLDB4RUYpOwkvKiBsb29wIGZpbHRlciBvZmYgKi8KKyAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgyMSwweDAxLDB4RkUpOwkvKiBBQ0lWIG9uICovCisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDIwLDB4MDAsMHhFRik7CS8qIGxvb3AgZmlsdGVyIG9mZiAqLworICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDIxLDB4MDEsMHhGRSk7CS8qIEFDSVYgb24gKi8KKyAgICAgICAgIH0KKyAgICAgIH0KKwogI2VuZGlmICAvKiAzMDAgKi8KIAotICB9IGVsc2UgeworICAgfSBlbHNlIHsKIAotICAgICAvKiBDaHJvbnRlbCA3MDE5IC0gYXNzdW1lZCB0aGF0IGl0IGRvZXMgbm90IGNvbWUgd2l0aCBhIDMwMCBzZXJpZXMgY2hpcCAqLworICAgICAgLyogQ2hyb250ZWwgNzAxOSAtIGFzc3VtZWQgdGhhdCBpdCBkb2VzIG5vdCBjb21lIHdpdGggYSAzMDAgc2VyaWVzIGNoaXAgKi8KIAogI2lmZGVmIFNJUzMxNUgKIAotICAgICAvKiBXZSBkb24ndCBzdXBwb3J0IG1vZGVzID4xMDI0eDc2OCAqLwotICAgICBpZiAocmVzaW5kZXggPiA2KSByZXR1cm47CisgICAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCi0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzBdOwotICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldE5UU0NKKSB7Ci0gICAgICAgIHRlbXAgfD0gMHgxMDsKLSAgICAgfQotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MDA7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7CisgICAgICAvKiBXZSBkb24ndCBzdXBwb3J0IG1vZGVzID4xMDI0eDc2OCAqLworICAgICAgaWYgKHJlc2luZGV4ID4gNikgcmV0dXJuOwogCi0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzFdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MDE7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7CisgICAgICB0ZW1wID0gQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1swXTsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0TlRTQ0opIHRlbXAgfD0gMHgxMDsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDAsdGVtcCk7CiAKLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMl07Ci0gICAgIHRlbXBieD0oKHRlbXAgJiAweDAwRkYpIDw8IDgpIHwgMHgwMjsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsdGVtcGJ4KTsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDEsQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1sxXSk7CisgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDAyLENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMl0pOworICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwNCxDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzNdKTsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDMsQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1s0XSk7CisgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDA1LENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbNV0pOworICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwNixDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzZdKTsKIAotICAgICB0ZW1wID0gQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1szXTsKLSAgICAgdGVtcGJ4PSgodGVtcCAmIDB4MDBGRikgPDwgOCkgfCAweDA0OwotICAgICBTaVNfU2V0Q0g3MDF4KFNpU19Qcix0ZW1wYngpOworICAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbN107CisgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldE5UU0NKKSB0ZW1wID0gMHg2NjsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDcsdGVtcCk7CiAKLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbNF07Ci0gICAgIHRlbXBieD0oKHRlbXAgJiAweDAwRkYpIDw8IDgpIHwgMHgwMzsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsdGVtcGJ4KTsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDgsQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1s4XSk7CisgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDE1LENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbOV0pOworICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgxZixDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzEwXSk7CisgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDBjLENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTFdKTsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MGQsQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1sxMl0pOworICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwZSxDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzEzXSk7CisgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDBmLENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTRdKTsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MTAsQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1sxNV0pOwogCi0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzVdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MDU7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbNl07Ci0gICAgIHRlbXBieD0oKHRlbXAgJiAweDAwRkYpIDw8IDgpIHwgMHgwNjsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsdGVtcGJ4KTsKLQotICAgICB0ZW1wID0gQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1s3XTsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDSikgewotCXRlbXAgPSAweDY2OwotICAgICB9Ci0gICAgIHRlbXBieD0oKHRlbXAgJiAweDAwRkYpIDw8IDgpIHwgMHgwNzsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsdGVtcGJ4KTsKLQotICAgICB0ZW1wID0gQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1s4XTsKLSAgICAgdGVtcGJ4PSgodGVtcCAmIDB4MDBGRikgPDwgOCkgfCAweDA4OwotICAgICBTaVNfU2V0Q0g3MDF4KFNpU19Qcix0ZW1wYngpOwotCi0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzldOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MTU7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTBdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MWY7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTFdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MGM7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTJdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MGQ7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTNdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MGU7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTRdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MGY7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTVdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MTA7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MjEpICYgfjB4MDI7Ci0gICAgIC8qIEQxIHNob3VsZCBiZSBzZXQgZm9yIFBBTCwgUEFMLU4gYW5kIE5UU0MtSiwKLSAgICAgICAgYnV0IEkgd29uJ3QgZG8gdGhhdCBmb3IgUEFMIHVubGVzcyBzb21lYm9keQotCXRlbGxzIG1lIHRvIGRvIHNvLiBTaW5jZSB0aGUgQklPUyB1c2VzCi0Jbm9uLWRlZmF1bHQgQ0lWIHZhbHVlcyBhbmQgYmxhY2tsZXZlbHMsCi0JdGhpcyBtaWdodCBiZSBjb21wZW5zYXRlZCBhbnl3YXkuCi0gICAgICAqLwotICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRQQUxOIHwgVFZTZXROVFNDSikpIHRlbXAgfD0gMHgwMjsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKCh0ZW1wIDw8IDgpIHwgMHgyMSkpOworICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MjEpICYgfjB4MDI7CisgICAgICAvKiBEMSBzaG91bGQgYmUgc2V0IGZvciBQQUwsIFBBTC1OIGFuZCBOVFNDLUosCisgICAgICAgICBidXQgSSB3b24ndCBkbyB0aGF0IGZvciBQQUwgdW5sZXNzIHNvbWVib2R5CisJIHRlbGxzIG1lIHRvIGRvIHNvLiBTaW5jZSB0aGUgQklPUyB1c2VzCisJIG5vbi1kZWZhdWx0IENJViB2YWx1ZXMgYW5kIGJsYWNrbGV2ZWxzLAorCSB0aGlzIG1pZ2h0IGJlIGNvbXBlbnNhdGVkIGFueXdheS4KKyAgICAgICAqLworICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0UEFMTiB8IFRWU2V0TlRTQ0opKSB0ZW1wIHw9IDB4MDI7CisgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDIxLHRlbXApOwogCiAjZW5kaWYJLyogMzE1ICovCiAKLSAgfQorICAgfQogCiAjaWZkZWYgU0lTX0NQCi0gIFNJU19DUF9JTklUMzAxX0NQMworICAgU0lTX0NQX0lOSVQzMDFfQ1AzCiAjZW5kaWYKIAogfQogCi12b2lkCi1TaVNfQ2hyb250ZWw3MDF4QkxPbihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQotewotICBVU0hPUlQgdGVtcDsKLQotICAvKiBFbmFibGUgQ2hyb250ZWwgNzAxOSBMQ0QgcGFuZWwgYmFja2xpZ2h0ICovCi0gIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMikgewotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQwKSB7Ci0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NjU2Nik7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDY2KTsKLSAgICAgICAgdGVtcCB8PSAweDIwOwotCVNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg2Nik7Ci0gICAgIH0KLSAgfQotfQotCi12b2lkCi1TaVNfQ2hyb250ZWw3MDF4QkxPZmYoU2lTX1ByaXZhdGUgKlNpU19QcikKLXsKLSAgVVNIT1JUIHRlbXA7Ci0KLSAgLyogRGlzYWJsZSBDaHJvbnRlbCA3MDE5IExDRCBwYW5lbCBiYWNrbGlnaHQgKi8KLSAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAyKSB7Ci0gICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDY2KTsKLSAgICAgdGVtcCAmPSAweERGOwotICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4NjYpOwotICB9Ci19Ci0KICNpZmRlZiBTSVMzMTVIICAvKiAtLS0tLS0tLS0tLSAzMTUgc2VyaWVzIG9ubHkgLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZAotU2lTX0Nocm9udGVsUG93ZXJTZXF1ZW5jaW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCit2b2lkCitTaVNfQ2hyb250ZWw3MDF4QkxPbihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVUNIQVIgcmVndGFibGVbXSAgICAgID0geyAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiIH07Ci0gIFVDSEFSIHRhYmxlMTAyNF83NDBbXSA9IHsgMHgwMSwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwMSB9OwotICBVQ0hBUiB0YWJsZTE0MDBfNzQwW10gPSB7IDB4MDEsIDB4NmUsIDB4MDEsIDB4MDEsIDB4MDEgfTsKLSAgVUNIQVIgYXN1czEwMjRfNzQwW10gID0geyAweDE5LCAweDZlLCAweDAxLCAweDE5LCAweDA5IH07Ci0gIFVDSEFSIGFzdXMxNDAwXzc0MFtdICA9IHsgMHgxOSwgMHg2ZSwgMHgwMSwgMHgxOSwgMHgwOSB9OwotICBVQ0hBUiB0YWJsZTEwMjRfNjUwW10gPSB7IDB4MDEsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDIgfTsKLSAgVUNIQVIgdGFibGUxNDAwXzY1MFtdID0geyAweDAxLCAweDAyLCAweDAxLCAweDAxLCAweDAyIH07Ci0gIFVDSEFSICp0YWJsZXB0ciA9IE5VTEw7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wOworCisgICAvKiBFbmFibGUgQ2hyb250ZWwgNzAxOSBMQ0QgcGFuZWwgYmFja2xpZ2h0ICovCisgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgeworCSBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDY2LDB4NjUpOworICAgICAgfSBlbHNlIHsKKwkgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NjYpOworCSB0ZW1wIHw9IDB4MjA7CisJIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NjYsdGVtcCk7CisgICAgICB9CisgICB9Cit9CisKK3ZvaWQKK1NpU19DaHJvbnRlbDcwMXhCTE9mZihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKK3sKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXA7CisKKyAgIC8qIERpc2FibGUgQ2hyb250ZWwgNzAxOSBMQ0QgcGFuZWwgYmFja2xpZ2h0ICovCisgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKKyAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDY2KTsKKyAgICAgIHRlbXAgJj0gMHhERjsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NjYsdGVtcCk7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitTaVNfQ2hyb250ZWxQb3dlclNlcXVlbmNpbmcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCit7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHJlZ3RhYmxlW10gICAgICA9IHsgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZTEwMjRfNzQwW10gPSB7IDB4MDEsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDEgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGUxNDAwXzc0MFtdID0geyAweDAxLCAweDZlLCAweDAxLCAweDAxLCAweDAxIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFzdXMxMDI0Xzc0MFtdICA9IHsgMHgxOSwgMHg2ZSwgMHgwMSwgMHgxOSwgMHgwOSB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhc3VzMTQwMF83NDBbXSAgPSB7IDB4MTksIDB4NmUsIDB4MDEsIDB4MTksIDB4MDkgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGUxMDI0XzY1MFtdID0geyAweDAxLCAweDAyLCAweDAxLCAweDAxLCAweDAyIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlMTQwMF82NTBbXSA9IHsgMHgwMSwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwMiB9OworICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZXB0ciA9IE5VTEw7CiAgIGludCBpOwogCiAgIC8qIFNldCB1cCBQb3dlciB1cC9kb3duIHRpbWluZyAqLwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQVNVU0wzMDAwRCkgdGFibGVwdHIgPSBhc3VzMTAyNF83NDA7Ci0gICAgICAgIGVsc2UgICAgCQkJICAgICAgICAgIHRhYmxlcHRyID0gdGFibGUxMDI0Xzc0MDsKKwlpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9BU1VTTDMwMDBEKSB0YWJsZXB0ciA9IGFzdXMxMDI0Xzc0MDsKKwllbHNlICAgIAkJCSAgICAgICAgICB0YWJsZXB0ciA9IHRhYmxlMTAyNF83NDA7CiAgICAgIH0gZWxzZSBpZigoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMjgweDEwMjQpIHx8Ci0gICAgICAgICAgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNDAweDEwNTApIHx8CisJICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE0MDB4MTA1MCkgfHwKIAkgICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTYwMHgxMjAwKSkgewogCWlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0FTVVNMMzAwMEQpIHRhYmxlcHRyID0gYXN1czE0MDBfNzQwOwogICAgICAgICBlbHNlCQkJCQkgIHRhYmxlcHRyID0gdGFibGUxNDAwXzc0MDsKICAgICAgfSBlbHNlIHJldHVybjsKICAgfSBlbHNlIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgewotICAgICAgICB0YWJsZXB0ciA9IHRhYmxlMTAyNF82NTA7CisJdGFibGVwdHIgPSB0YWJsZTEwMjRfNjUwOwogICAgICB9IGVsc2UgaWYoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHgxMDI0KSB8fAotICAgICAgICAgICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSB8fAorCSAgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNDAweDEwNTApIHx8CiAJICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE2MDB4MTIwMCkpIHsKLSAgICAgICAgdGFibGVwdHIgPSB0YWJsZTE0MDBfNjUwOworCXRhYmxlcHRyID0gdGFibGUxNDAwXzY1MDsKICAgICAgfSBlbHNlIHJldHVybjsKICAgfQogCiAgIGZvcihpPTA7IGk8NTsgaSsrKSB7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0YWJsZXB0cltpXSA8PCA4KSB8IHJlZ3RhYmxlW2ldKTsKKyAgICAgU2lTX1NldENINzAxeChTaVNfUHIsIHJlZ3RhYmxlW2ldLCB0YWJsZXB0cltpXSk7CiAgIH0KIH0KIAogc3RhdGljIHZvaWQKLVNpU19TZXRDSDcwMXhGb3JMQ0QoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRDSDcwMXhGb3JMQ0Qoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVDSEFSIHJlZ3RhYmxlW10gICAgICA9IHsgMHgxYywgMHg1ZiwgMHg2NCwgMHg2ZiwgMHg3MCwgMHg3MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcyLCAweDczLCAweDc0LCAweDc2LCAweDc4LCAweDdkLCAweDY2IH07Ci0gIFVDSEFSIHRhYmxlMTAyNF83NDBbXSA9IHsgMHg2MCwgMHgwMiwgMHgwMCwgMHgwNywgMHg0MCwgMHhlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGEzLCAweGM4LCAweGM3LCAweGFjLCAweGUwLCAweDAyLCAweDQ0IH07Ci0gIFVDSEFSIHRhYmxlMTI4MF83NDBbXSA9IHsgMHg2MCwgMHgwMywgMHgxMSwgMHgwMCwgMHg0MCwgMHhlMywKLSAgIAkJCSAgICAweGFkLCAweGRiLCAweGY2LCAweGFjLCAweGUwLCAweDAyLCAweDQ0IH07Ci0gIFVDSEFSIHRhYmxlMTQwMF83NDBbXSA9IHsgMHg2MCwgMHgwMywgMHgxMSwgMHgwMCwgMHg0MCwgMHhlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFkLCAweGRiLCAweGY2LCAweGFjLCAweGUwLCAweDAyLCAweDQ0IH07Ci0gIFVDSEFSIHRhYmxlMTYwMF83NDBbXSA9IHsgMHg2MCwgMHgwNCwgMHgxMSwgMHgwMCwgMHg0MCwgMHhlMywKLSAgCQkJICAgIDB4YWQsIDB4ZGUsIDB4ZjYsIDB4YWMsIDB4NjAsIDB4MWEsIDB4NDQgfTsKLSAgVUNIQVIgdGFibGUxMDI0XzY1MFtdID0geyAweDYwLCAweDAyLCAweDAwLCAweDA3LCAweDQwLCAweGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTMsIDB4YzgsIDB4YzcsIDB4YWMsIDB4NjAsIDB4MDIgfTsKLSAgVUNIQVIgdGFibGUxMjgwXzY1MFtdID0geyAweDYwLCAweDAzLCAweDExLCAweDAwLCAweDQwLCAweGUzLAotICAgCQkgICAJICAgIDB4YWQsIDB4ZGIsIDB4ZjYsIDB4YWMsIDB4ZTAsIDB4MDIgfTsKLSAgVUNIQVIgdGFibGUxNDAwXzY1MFtdID0geyAweDYwLCAweDAzLCAweDExLCAweDAwLCAweDQwLCAweGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWQsIDB4ZGIsIDB4ZjYsIDB4YWMsIDB4NjAsIDB4MDIgfTsKLSAgVUNIQVIgdGFibGUxNjAwXzY1MFtdID0geyAweDYwLCAweDA0LCAweDExLCAweDAwLCAweDQwLCAweGUzLAotICAJCQkgICAgMHhhZCwgMHhkZSwgMHhmNiwgMHhhYywgMHg2MCwgMHgxYSB9OwotICBVQ0hBUiAqdGFibGVwdHIgPSBOVUxMOwotICBVU0hPUlQgdGVtcGJoOworICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZXB0ciA9IE5VTEw7CisgIHVuc2lnbmVkIHNob3J0IHRlbXBiaDsKICAgaW50IGk7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHJlZ3RhYmxlW10gPSB7CisJCTB4MWMsIDB4NWYsIDB4NjQsIDB4NmYsIDB4NzAsIDB4NzEsCisJCTB4NzIsIDB4NzMsIDB4NzQsIDB4NzYsIDB4NzgsIDB4N2QsIDB4NjYKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGUxMDI0Xzc0MFtdID0geworCQkweDYwLCAweDAyLCAweDAwLCAweDA3LCAweDQwLCAweGVkLAorCQkweGEzLCAweGM4LCAweGM3LCAweGFjLCAweGUwLCAweDAyLCAweDQ0CisgIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlMTI4MF83NDBbXSA9IHsKKwkJMHg2MCwgMHgwMywgMHgxMSwgMHgwMCwgMHg0MCwgMHhlMywKKwkJMHhhZCwgMHhkYiwgMHhmNiwgMHhhYywgMHhlMCwgMHgwMiwgMHg0NAorICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZTE0MDBfNzQwW10gPSB7CisJCTB4NjAsIDB4MDMsIDB4MTEsIDB4MDAsIDB4NDAsIDB4ZTMsCisJCTB4YWQsIDB4ZGIsIDB4ZjYsIDB4YWMsIDB4ZTAsIDB4MDIsIDB4NDQKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGUxNjAwXzc0MFtdID0geworCQkweDYwLCAweDA0LCAweDExLCAweDAwLCAweDQwLCAweGUzLAorCQkweGFkLCAweGRlLCAweGY2LCAweGFjLCAweDYwLCAweDFhLCAweDQ0CisgIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlMTAyNF82NTBbXSA9IHsKKwkJMHg2MCwgMHgwMiwgMHgwMCwgMHgwNywgMHg0MCwgMHhlZCwKKwkJMHhhMywgMHhjOCwgMHhjNywgMHhhYywgMHg2MCwgMHgwMgorICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZTEyODBfNjUwW10gPSB7CisJCTB4NjAsIDB4MDMsIDB4MTEsIDB4MDAsIDB4NDAsIDB4ZTMsCisJCTB4YWQsIDB4ZGIsIDB4ZjYsIDB4YWMsIDB4ZTAsIDB4MDIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGUxNDAwXzY1MFtdID0geworCQkweDYwLCAweDAzLCAweDExLCAweDAwLCAweDQwLCAweGVmLAorCQkweGFkLCAweGRiLCAweGY2LCAweGFjLCAweDYwLCAweDAyCisgIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlMTYwMF82NTBbXSA9IHsKKwkJMHg2MCwgMHgwNCwgMHgxMSwgMHgwMCwgMHg0MCwgMHhlMywKKwkJMHhhZCwgMHhkZSwgMHhmNiwgMHhhYywgMHg2MCwgMHgxYQorICB9OwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpICAgICAgIHRhYmxlcHRyID0gdGFibGUxMDI0Xzc0MDsKICAgICAgZWxzZSBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4MTAyNCkgdGFibGVwdHIgPSB0YWJsZTEyODBfNzQwOwogICAgICBlbHNlIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSB0YWJsZXB0ciA9IHRhYmxlMTQwMF83NDA7CkBAIC04NDk5LDEzOCArODMyMCwxMzkgQEAKICAgICAgfQogICB9CiAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgdGVtcGJoID0gMHgwZDsKLSAgZWxzZSAgICAgCQkJICAgdGVtcGJoID0gMHgwYzsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB0ZW1wYmggPSAweDBkOworICBlbHNlICAgICAJCQkgIHRlbXBiaCA9IDB4MGM7CiAKICAgZm9yKGkgPSAwOyBpIDwgdGVtcGJoOyBpKyspIHsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRhYmxlcHRyW2ldIDw8IDgpIHwgcmVndGFibGVbaV0pOworICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwgcmVndGFibGVbaV0sIHRhYmxlcHRyW2ldKTsKICAgfQotICBTaVNfQ2hyb250ZWxQb3dlclNlcXVlbmNpbmcoU2lTX1ByLEh3SW5mbyk7CisgIFNpU19DaHJvbnRlbFBvd2VyU2VxdWVuY2luZyhTaVNfUHIpOwogICB0ZW1wYmggPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDFlKTsKICAgdGVtcGJoIHw9IDB4YzA7Ci0gIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wYmggPDwgOCkgfCAweDFlKTsKKyAgU2lTX1NldENINzAxeChTaVNfUHIsMHgxZSx0ZW1wYmgpOwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CiAgICAgIHRlbXBiaCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MWMpOwogICAgICB0ZW1wYmggJj0gMHhmYjsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXBiaCA8PCA4KSB8IDB4MWMpOworICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDFjLHRlbXBiaCk7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmQsMHgwMyk7CiAgICAgIHRlbXBiaCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NjQpOwogICAgICB0ZW1wYmggfD0gMHg0MDsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXBiaCA8PCA4KSB8IDB4NjQpOworICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDY0LHRlbXBiaCk7CiAgICAgIHRlbXBiaCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MDMpOwogICAgICB0ZW1wYmggJj0gMHgzZjsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXBiaCA8PCA4KSB8IDB4MDMpOworICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDAzLHRlbXBiaCk7CiAgIH0KIH0KIAogc3RhdGljIHZvaWQKLVNpU19DaHJvbnRlbFJlc2V0VlN5bmMoU2lTX1ByaXZhdGUgKlNpU19QcikKK1NpU19DaHJvbnRlbFJlc2V0VlN5bmMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAgIHVuc2lnbmVkIGNoYXIgdGVtcCwgdGVtcDE7CiAKICAgdGVtcDEgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDQ5KTsKLSAgU2lTX1NldENINzAxeChTaVNfUHIsMHgzZTQ5KTsKKyAgU2lTX1NldENINzAxeChTaVNfUHIsMHg0OSwweDNlKTsKICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NDcpOwogICB0ZW1wICY9IDB4N2Y7CS8qIFVzZSBleHRlcm5hbCBWU1lOQyAqLwotICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4NDcpOwotICBTaVNfTG9uZ0RlbGF5KFNpU19QciwzKTsKKyAgU2lTX1NldENINzAxeChTaVNfUHIsMHg0Nyx0ZW1wKTsKKyAgU2lTX0xvbmdEZWxheShTaVNfUHIsIDMpOwogICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg0Nyk7CiAgIHRlbXAgfD0gMHg4MDsJLyogVXNlIGludGVybmFsIFZTWU5DICovCi0gIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg0Nyk7Ci0gIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wMSA8PCA4KSB8IDB4NDkpOworICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ3LHRlbXApOworICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ5LHRlbXAxKTsKIH0KIAogc3RhdGljIHZvaWQKLVNpU19DaHJvbnRlbDcwMXhPbihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0Nocm9udGVsNzAxeE9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVU0hPUlQgdGVtcDsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcDsKIAogICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgeworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183NDApIHsKICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MWMpOwogICAgICAgICB0ZW1wIHw9IDB4MDQ7CS8qIEludmVydCBYQ0xLIHBoYXNlICovCi0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHgxYyk7CisgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MWMsdGVtcCk7CiAgICAgIH0KLSAgICAgaWYoU2lTX0lzWVBiUHIoU2lTX1ByLCBId0luZm8pKSB7CisgICAgIGlmKFNpU19Jc1lQYlByKFNpU19QcikpIHsKICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MDEpOwogCXRlbXAgJj0gMHgzZjsKIAl0ZW1wIHw9IDB4ODA7CS8qIEVuYWJsZSBZUHJQYiAoSERUVikgKi8KLQlTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4MDEpOworCVNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDEsdGVtcCk7CiAgICAgIH0KLSAgICAgaWYoU2lTX0lzQ2hTY2FydChTaVNfUHIsIEh3SW5mbykpIHsKKyAgICAgaWYoU2lTX0lzQ2hTY2FydChTaVNfUHIpKSB7CiAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDAxKTsKIAl0ZW1wICY9IDB4M2Y7CiAJdGVtcCB8PSAweGMwOwkvKiBFbmFibGUgU0NBUlQgKyBDVkJTICovCi0JU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXAgPDwgOCkgfCAweDAxKTsKKwlTaVNfU2V0Q0g3MDF4KFNpU19QciwweDAxLHRlbXApOwogICAgICB9Ci0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApIHsKKyAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CiAgICAgICAgIFNpU19DaHJvbnRlbFJlc2V0VlN5bmMoU2lTX1ByKTsKLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgyMDQ5KTsgICAvKiBFbmFibGUgVFYgcGF0aCAqLworICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ5LDB4MjApOyAgIC8qIEVuYWJsZSBUViBwYXRoICovCiAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MjA0OSk7ICAgLyogRW5hYmxlIFRWIHBhdGggKi8KKyAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg0OSwweDIwKTsgICAvKiBFbmFibGUgVFYgcGF0aCAqLwogICAgICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg0OSk7Ci0gICAgICAgIGlmKFNpU19Jc1lQYlByKFNpU19QcixId0luZm8pKSB7CisgICAgICAgIGlmKFNpU19Jc1lQYlByKFNpU19QcikpIHsKICAgICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NzMpOwogCSAgIHRlbXAgfD0gMHg2MDsKLQkgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4NzMpOworCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzMsdGVtcCk7CiAgICAgICAgIH0KICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NDcpOwogICAgICAgICB0ZW1wICY9IDB4N2Y7Ci0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg0Nyk7Ci0gICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLDIpOworICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ3LHRlbXApOworICAgICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwgMik7CiAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDQ3KTsKICAgICAgICAgdGVtcCB8PSAweDgwOwotICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4NDcpOworICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ3LHRlbXApOwogICAgICB9CiAgIH0KIH0KIAogc3RhdGljIHZvaWQKLVNpU19DaHJvbnRlbDcwMXhPZmYoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19DaHJvbnRlbDcwMXhPZmYoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCB0ZW1wOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCiAgIC8qIENvbXBsZXRlIHBvd2VyIGRvd24gb2YgTFZEUyAqLwogICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgewotICAgICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwxKTsKLQlTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwweDE2ZmYpOwotCVNpU19TZXRDSDcwMXgoU2lTX1ByLDB4YWM3Nik7Ci0JU2lTX1NldENINzAxeChTaVNfUHIsMHgwMDY2KTsKKyAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisgICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLCAxKTsKKwlTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgNTg4Nyk7CisJU2lTX1NldENINzAxeChTaVNfUHIsMHg3NiwweGFjKTsKKwlTaVNfU2V0Q0g3MDF4KFNpU19QciwweDY2LDB4MDApOwogICAgICB9IGVsc2UgewotICAgICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwyKTsKKyAgICAgICAgU2lTX0xvbmdEZWxheShTaVNfUHIsIDIpOwogCXRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDc2KTsKIAl0ZW1wICY9IDB4ZmM7Ci0JU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXAgPDwgOCkgfCAweDc2KTsKLQlTaVNfU2V0Q0g3MDF4KFNpU19QciwweDAwNjYpOworCVNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzYsdGVtcCk7CisJU2lTX1NldENINzAxeChTaVNfUHIsMHg2NiwweDAwKTsKICAgICAgfQogICB9CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfQ2hyb250ZWxSZXNldERCKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfQ2hyb250ZWxSZXNldERCKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgICBVU0hPUlQgdGVtcDsKKyAgICAgdW5zaWduZWQgc2hvcnQgdGVtcDsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgewogCiAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDRhKTsgIC8qIFZlcnNpb24gSUQgKi8KICAgICAgICAgdGVtcCAmPSAweDAxOwogICAgICAgICBpZighdGVtcCkgewogCi0gICAgICAgICAgIGlmKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QcixId0luZm8pKSB7CisgICAgICAgICAgIGlmKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QcikpIHsKIAkgICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg0OSk7Ci0JICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgzZTQ5KTsKKwkgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ5LDB4M2UpOwogCSAgIH0KLQkgICAvKiBSZXNldCBDaHJvbnRlbCA3MDE5IGRhdGFwYXRoICovCi0gICAgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MTA0OCk7Ci0gICAgICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLDEpOwotICAgICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDE4NDgpOwogCi0JICAgaWYoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByLCBId0luZm8pKSB7CisJICAgLyogUmVzZXQgQ2hyb250ZWwgNzAxOSBkYXRhcGF0aCAqLworICAgICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ4LDB4MTApOworICAgICAgICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwgMSk7CisgICAgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NDgsMHgxOCk7CisKKwkgICBpZihTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChTaVNfUHIpKSB7CiAJICAgICAgU2lTX0Nocm9udGVsUmVzZXRWU3luYyhTaVNfUHIpOwotCSAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg0OSk7CisJICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg0OSx0ZW1wKTsKIAkgICB9CiAKICAgICAgICAgfSBlbHNlIHsKQEAgLTg2MzgsNzIgKzg0NjAsNzIgQEAKIAkgICAvKiBDbGVhci9zZXQvY2xlYXIgR1BJTyAqLwogICAgICAgICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg1Yyk7CiAJICAgdGVtcCAmPSAweGVmOwotCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg1Yyk7CisJICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg1Yyx0ZW1wKTsKIAkgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg1Yyk7CiAJICAgdGVtcCB8PSAweDEwOwotCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg1Yyk7CisJICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg1Yyx0ZW1wKTsKIAkgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg1Yyk7CiAJICAgdGVtcCAmPSAweGVmOwotCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg1Yyk7CisJICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg1Yyx0ZW1wKTsKIAkgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg2MSk7CiAJICAgaWYoIXRlbXApIHsKLQkgICAgICBTaVNfU2V0Q0g3MDF4Rm9yTENEKFNpU19QciwgSHdJbmZvKTsKKwkgICAgICBTaVNfU2V0Q0g3MDF4Rm9yTENEKFNpU19Qcik7CiAJICAgfQogICAgICAgICB9CiAKICAgICAgfSBlbHNlIHsgLyogNjUwICovCiAgICAgICAgIC8qIFJlc2V0IENocm9udGVsIDcwMTkgZGF0YXBhdGggKi8KLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgxMDQ4KTsKLSAgICAgICAgU2lTX0xvbmdEZWxheShTaVNfUHIsMSk7Ci0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MTg0OCk7CisgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NDgsMHgxMCk7CisgICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLCAxKTsKKyAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg0OCwweDE4KTsKICAgICAgfQogfQogCiBzdGF0aWMgdm9pZAotU2lTX0Nocm9udGVsSW5pdFRWVlN5bmMoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19DaHJvbnRlbEluaXRUVlZTeW5jKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgICBVU0hPUlQgdGVtcDsKKyAgICAgdW5zaWduZWQgc2hvcnQgdGVtcDsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgewogCi0gICAgICAgIGlmKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QcixId0luZm8pKSB7CisgICAgICAgIGlmKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QcikpIHsKICAgICAgICAgICAgU2lTX0Nocm9udGVsUmVzZXRWU3luYyhTaVNfUHIpOwogICAgICAgICB9CiAKICAgICAgfSBlbHNlIHsKIAotICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweGFmNzYpOyAgLyogUG93ZXIgdXAgTFZEUyBibG9jayAqLworICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDc2LDB4YWYpOyAgLyogUG93ZXIgdXAgTFZEUyBibG9jayAqLwogICAgICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg0OSk7CiAgICAgICAgIHRlbXAgJj0gMTsKICAgICAgICAgaWYodGVtcCAhPSAxKSB7ICAvKiBUViBibG9jayBwb3dlcmVkPyAoMCA9IHllcywgMSA9IG5vKSAqLwogCSAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDQ3KTsKIAkgICB0ZW1wICY9IDB4NzA7Ci0JICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXAgPDwgOCkgfCAweDQ3KTsgIC8qIGVuYWJsZSBWU1lOQyAqLwotCSAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLDMpOworCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NDcsdGVtcCk7ICAvKiBlbmFibGUgVlNZTkMgKi8KKwkgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwgMyk7CiAJICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NDcpOwogCSAgIHRlbXAgfD0gMHg4MDsKLQkgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4NDcpOyAgLyogZGlzYWJsZSBWU1lOQyAqLworCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NDcsdGVtcCk7ICAvKiBkaXNhYmxlIFZTWU5DICovCiAgICAgICAgIH0KIAogICAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfQ2hyb250ZWxEb1NvbWV0aGluZzMoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19DaHJvbnRlbERvU29tZXRoaW5nMyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICAgICBVU0hPUlQgdGVtcCx0ZW1wMTsKKyAgICAgdW5zaWduZWQgc2hvcnQgdGVtcCx0ZW1wMTsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgewogCiAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDYxKTsKICAgICAgICAgaWYodGVtcCA8IDEpIHsKICAgICAgICAgICAgdGVtcCsrOwotCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg2MSk7CisJICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg2MSx0ZW1wKTsKICAgICAgICAgfQotICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ1NjYpOyAgLyogUGFuZWwgcG93ZXIgb24gKi8KLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHhhZjc2KTsgIC8qIEFsbCBwb3dlciBvbiAqLwotICAgICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwxKTsKLSAgICAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsMHgxNmZmKTsKKyAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg2NiwweDQ1KTsgIC8qIFBhbmVsIHBvd2VyIG9uICovCisgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzYsMHhhZik7ICAvKiBBbGwgcG93ZXIgb24gKi8KKyAgICAgICAgU2lTX0xvbmdEZWxheShTaVNfUHIsIDEpOworICAgICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgNTg4Nyk7CiAKICAgICAgfSBlbHNlIHsgIC8qIDY1MCAqLwogCkBAIC04NzExLDM4ICs4NTMzLDM4IEBACiAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDYxKTsKICAgICAgICAgaWYodGVtcCA8IDIpIHsKICAgICAgICAgICAgdGVtcCsrOwotCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg2MSk7CisJICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg2MSx0ZW1wKTsKIAkgICB0ZW1wMSA9IDE7CiAgICAgICAgIH0KLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHhhYzc2KTsKKyAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg3NiwweGFjKTsKICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NjYpOwogICAgICAgICB0ZW1wIHw9IDB4NWY7Ci0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg2Nik7CisgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NjYsdGVtcCk7CiAgICAgICAgIGlmKE1vZGVObyA+IDB4MTMpIHsKLSAgICAgICAgICAgaWYoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByLCBId0luZm8pKSB7Ci0JICAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsMHgzZmYpOworICAgICAgICAgICBpZihTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChTaVNfUHIpKSB7CisJICAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsIDEwMjMpOwogCSAgIH0gZWxzZSB7Ci0JICAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsMHgyZmYpOworCSAgICAgIFNpU19HZW5lcmljRGVsYXkoU2lTX1ByLCA3NjcpOwogCSAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYoIXRlbXAxKQotCSAgICAgIFNpU19HZW5lcmljRGVsYXkoU2lTX1ByLDB4MmZmKTsKKwkgICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgNzY3KTsKICAgICAgICAgfQogICAgICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg3Nik7CiAgICAgICAgIHRlbXAgfD0gMHgwMzsKLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXAgPDwgOCkgfCAweDc2KTsKKyAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg3Nix0ZW1wKTsKICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NjYpOwogICAgICAgICB0ZW1wICY9IDB4N2Y7Ci0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg2Nik7Ci0gICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLDEpOworICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDY2LHRlbXApOworICAgICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwgMSk7CiAKICAgICAgfQogfQogCiBzdGF0aWMgdm9pZAotU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfQ2hyb250ZWxEb1NvbWV0aGluZzIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICAgIFVTSE9SVCB0ZW1wLHRlbXBjbCx0ZW1wY2g7CisgICAgIHVuc2lnbmVkIHNob3J0IHRlbXAsdGVtcGNsLHRlbXBjaDsKIAogICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwgMSk7CiAgICAgIHRlbXBjbCA9IDM7CkBAIC04NzUzLDg3ICs4NTc1LDg3IEBACiAgICAgICAgdGVtcCAmPSAweDA0OyAgLyogUExMIHN0YWJsZT8gLT4gYmFpbCBvdXQgKi8KICAgICAgICBpZih0ZW1wID09IDB4MDQpIGJyZWFrOwogCi0gICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgeworICAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgewogICAgICAgICAgIC8qIFBvd2VyIGRvd24gTFZEUyBvdXRwdXQsIFBMTCBub3JtYWwgb3BlcmF0aW9uICovCi0gICAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHhhYzc2KTsKKyAgICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDc2LDB4YWMpOwogICAgICAgIH0KIAotICAgICAgIFNpU19TZXRDSDcwMXhGb3JMQ0QoU2lTX1ByLEh3SW5mbyk7CisgICAgICAgU2lTX1NldENINzAxeEZvckxDRChTaVNfUHIpOwogCiAgICAgICAgaWYodGVtcGNsID09IDApIHsKICAgICAgICAgICAgaWYodGVtcGNoID09IDMpIGJyZWFrOwotCSAgIFNpU19DaHJvbnRlbFJlc2V0REIoU2lTX1ByLEh3SW5mbyk7CisJICAgU2lTX0Nocm9udGVsUmVzZXREQihTaVNfUHIpOwogCSAgIHRlbXBjbCA9IDM7CiAJICAgdGVtcGNoKys7CiAgICAgICAgfQogICAgICAgIHRlbXBjbC0tOwogICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDc2KTsKICAgICAgICB0ZW1wICY9IDB4ZmI7ICAvKiBSZXNldCBQTEwgKi8KLSAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4NzYpOwotICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLDIpOworICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzYsdGVtcCk7CisgICAgICAgU2lTX0xvbmdEZWxheShTaVNfUHIsIDIpOwogICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDc2KTsKICAgICAgICB0ZW1wIHw9IDB4MDQ7ICAvKiBQTEwgbm9ybWFsIG9wZXJhdGlvbiAqLwotICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg3Nik7Ci0gICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgewotICAgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4ZTA3OCk7CS8qIFBMTCBsb29wIGZpbHRlciAqLworICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzYsdGVtcCk7CisgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisgICAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg3OCwweGUwKTsJLyogUExMIGxvb3AgZmlsdGVyICovCiAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDYwNzgpOworICAgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzgsMHg2MCk7CiAgICAgICAgfQotICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLDIpOworICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLCAyKTsKICAgICB9IHdoaWxlKDApOwogCi0gICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwMDc3KTsgIC8qIE1WPyAqLworICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzcsMHgwMCk7ICAvKiBNVj8gKi8KIH0KIAogc3RhdGljIHZvaWQKLVNpU19DaHJvbnRlbERvU29tZXRoaW5nMShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgICBVU0hPUlQgdGVtcDsKKyAgICAgdW5zaWduZWQgc2hvcnQgdGVtcDsKIAogICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHgwMyk7CiAgICAgIHRlbXAgfD0gMHg4MDsJLyogU2V0IGRhdGFwYXRoIDEgdG8gVFYgICAqLwogICAgICB0ZW1wICY9IDB4YmY7CS8qIFNldCBkYXRhcGF0aCAyIHRvIExWRFMgKi8KLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXAgPDwgOCkgfCAweDAzKTsKKyAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwMyx0ZW1wKTsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgewogCiAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDFjKTsKICAgICAgICAgdGVtcCAmPSAweGZiOwkvKiBOb3JtYWwgWENMSyBwaGFzZSAqLwotICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4MWMpOworICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDFjLHRlbXApOwogCiAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmQsMHgwMyk7CiAKICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NjQpOwogICAgICAgICB0ZW1wIHw9IDB4NDA7CS8qID8gQml0IG5vdCBkZWZpbmVkICovCi0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg2NCk7CisgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NjQsdGVtcCk7CiAKICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MDMpOwogICAgICAgICB0ZW1wICY9IDB4M2Y7CS8qIEQxIGlucHV0IHRvIGJvdGggTFZEUyBhbmQgVFYgKi8KLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXAgPDwgOCkgfCAweDAzKTsKKyAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwMyx0ZW1wKTsKIAogCWlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0FTVVNMMzAwMEQpIHsKLQkgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQwNjMpOyAvKiBMVkRTIG9mZiAqLworCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NjMsMHg0MCk7IC8qIExWRFMgb2ZmICovCiAJICAgU2lTX0xvbmdEZWxheShTaVNfUHIsIDEpOwotCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDA2Myk7IC8qIExWRFMgb24gKi8KLQkgICBTaVNfQ2hyb250ZWxSZXNldERCKFNpU19QciwgSHdJbmZvKTsKLQkgICBTaVNfQ2hyb250ZWxEb1NvbWV0aGluZzIoU2lTX1ByLCBId0luZm8pOwotCSAgIFNpU19DaHJvbnRlbERvU29tZXRoaW5nMyhTaVNfUHIsIDAsIEh3SW5mbyk7CisJICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg2MywweDAwKTsgLyogTFZEUyBvbiAqLworCSAgIFNpU19DaHJvbnRlbFJlc2V0REIoU2lTX1ByKTsKKwkgICBTaVNfQ2hyb250ZWxEb1NvbWV0aGluZzIoU2lTX1ByKTsKKwkgICBTaVNfQ2hyb250ZWxEb1NvbWV0aGluZzMoU2lTX1ByLCAwKTsKIAl9IGVsc2UgewogICAgICAgICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg2Nik7CiAgICAgICAgICAgIGlmKHRlbXAgIT0gMHg0NSkgewotICAgICAgICAgICAgICBTaVNfQ2hyb250ZWxSZXNldERCKFNpU19QciwgSHdJbmZvKTsKLSAgICAgICAgICAgICAgU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcyKFNpU19QciwgSHdJbmZvKTsKLSAgICAgICAgICAgICAgU2lTX0Nocm9udGVsRG9Tb21ldGhpbmczKFNpU19QciwgMCwgSHdJbmZvKTsKKyAgICAgICAgICAgICAgU2lTX0Nocm9udGVsUmVzZXREQihTaVNfUHIpOworICAgICAgICAgICAgICBTaVNfQ2hyb250ZWxEb1NvbWV0aGluZzIoU2lTX1ByKTsKKyAgICAgICAgICAgICAgU2lTX0Nocm9udGVsRG9Tb21ldGhpbmczKFNpU19QciwgMCk7CiAgICAgICAgICAgIH0KIAl9CiAKICAgICAgfSBlbHNlIHsgLyogNjUwICovCiAKLSAgICAgICAgU2lTX0Nocm9udGVsUmVzZXREQihTaVNfUHIsSHdJbmZvKTsKLSAgICAgICAgU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcyKFNpU19QcixId0luZm8pOworICAgICAgICBTaVNfQ2hyb250ZWxSZXNldERCKFNpU19Qcik7CisgICAgICAgIFNpU19DaHJvbnRlbERvU29tZXRoaW5nMihTaVNfUHIpOwogICAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzQpOwotICAgICAgICBTaVNfQ2hyb250ZWxEb1NvbWV0aGluZzMoU2lTX1ByLHRlbXAsSHdJbmZvKTsKLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHhhZjc2KTsgIC8qIEFsbCBwb3dlciBvbiwgTFZEUyBub3JtYWwgb3BlcmF0aW9uICovCisgICAgICAgIFNpU19DaHJvbnRlbERvU29tZXRoaW5nMyhTaVNfUHIsdGVtcCk7CisgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzYsMHhhZik7ICAvKiBBbGwgcG93ZXIgb24sIExWRFMgbm9ybWFsIG9wZXJhdGlvbiAqLwogCiAgICAgIH0KIApAQCAtODg0NSwxNSArODY2NywxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogQk9PTEVBTgotU2lTX1NldENSVDJHcm91cChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgTW9kZU5vKQorU2lTX1NldENSVDJHcm91cChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewogI2lmZGVmIFNJUzMwMAotICAgVUNIQVIgICpST01BZGRyICA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyICA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CiAjZW5kaWYKLSAgIFVTSE9SVCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4OwotI2lmIDAKLSAgIFVTSE9SVCB0ZW1wOwotI2VuZGlmCisgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4OwogCiAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IFByb2dyYW1taW5nQ1JUMjsKIApAQCAtODg2NiwzNyArODY4NSwzNyBAQAogICAgLyogVXNlZCBmb3Igc2hpZnRpbmcgQ1IzMyAqLwogICAgU2lTX1ByLT5TaVNfU2VsZWN0Q1JUMlJhdGUgPSA0OwogCi0gICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIsIEh3SW5mbyk7CisgICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIpOwogCi0gICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSBTaVNfR2V0UmF0ZVB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7CisgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSBTaVNfR2V0UmF0ZVB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogCiAgICBTaVNfU2F2ZUNSVDJJbmZvKFNpU19QcixNb2RlTm8pOwogCiAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTG93TW9kZVRlc3RzKSB7Ci0gICAgICBTaVNfRGlzYWJsZUJyaWRnZShTaVNfUHIsSHdJbmZvKTsKLSAgICAgIGlmKChTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSAmJiAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkpIHsKKyAgICAgIFNpU19EaXNhYmxlQnJpZGdlKFNpU19Qcik7CisgICAgICBpZigoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgJiYgKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzczMCkpIHsKICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDAsMHg4MCk7CiAgICAgICB9Ci0gICAgICBTaVNfU2V0Q1JUMk1vZGVSZWdzKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgSHdJbmZvKTsKKyAgICAgIFNpU19TZXRDUlQyTW9kZVJlZ3MoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKICAgIH0KIAogICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgRGlzYWJsZUNSVDJEaXNwbGF5KSB7Ci0gICAgICBTaVNfTG9ja0NSVDIoU2lTX1ByLCBId0luZm8pOworICAgICAgU2lTX0xvY2tDUlQyKFNpU19Qcik7CiAgICAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7CiAgICAgICByZXR1cm4gVFJVRTsKICAgIH0KIAotICAgU2lTX0dldENSVDJEYXRhKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOworICAgU2lTX0dldENSVDJEYXRhKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKIAogICAgLyogU2V0IHVwIFBhbmVsIExpbmsgZm9yIExWRFMgYW5kIExDREEgKi8KICAgIFNpU19Qci0+U2lTX0xDREhERVMgPSBTaVNfUHItPlNpU19MQ0RWREVTID0gMDsKICAgIGlmKCAoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgfHwKICAgICAgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSkgfHwKLSAgICAgICAoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSAmJiAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSkgKSB7Ci0gICAgICBTaVNfR2V0TFZEU0Rlc0RhdGEoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIEh3SW5mbyk7CisgICAgICAgKChTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSAmJiAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSkgKSB7CisgICAgICBTaVNfR2V0TFZEU0Rlc0RhdGEoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwogICAgfQogCi0jaWZkZWYgTElOVVhfWEY4NgorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiKGluaXQzMDE6IExDREhERVMgMHglMDN4IExDRFZERVMgMHglMDN4KVxuIiwgU2lTX1ByLT5TaVNfTENESERFUywgU2lTX1ByLT5TaVNfTENEVkRFUyk7CiAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiKGluaXQzMDE6IEhERSAgICAgMHglMDN4IFZERSAgICAgMHglMDN4KVxuIiwgU2lTX1ByLT5TaVNfSERFLCBTaVNfUHItPlNpU19WREUpOwpAQCAtODkwNyw4NiArODcyNiw3OSBAQAogI2VuZGlmCiAKICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMb3dNb2RlVGVzdHMpIHsKLSAgICAgIFNpU19TZXRHcm91cDEoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisgICAgICBTaVNfU2V0R3JvdXAxKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKICAgIH0KIAogICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAotICAgICAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTG93TW9kZVRlc3RzKSB7CisgICAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTG93TW9kZVRlc3RzKSB7CiAKLQkgICBTaVNfU2V0R3JvdXAyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOworCSBTaVNfU2V0R3JvdXAyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKICNpZmRlZiBTSVMzMTVICi0JICAgU2lTX1NldEdyb3VwMl9DX0VMVihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgSHdJbmZvKTsKKwkgU2lTX1NldEdyb3VwMl9DX0VMVihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAjZW5kaWYKLSAgICAgIAkgICBTaVNfU2V0R3JvdXAzKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgSHdJbmZvKTsKLSAgICAgIAkgICBTaVNfU2V0R3JvdXA0KFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOworCSBTaVNfU2V0R3JvdXAzKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CisJIFNpU19TZXRHcm91cDQoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwogI2lmZGVmIFNJUzMxNUgKLQkgICBTaVNfU2V0R3JvdXA0X0NfRUxWKFNpU19QciwgSHdJbmZvLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKwkgU2lTX1NldEdyb3VwNF9DX0VMVihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogI2VuZGlmCi0gICAgICAJICAgU2lTX1NldEdyb3VwNShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7CisJIFNpU19TZXRHcm91cDUoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAotCSAgIFNpU19TZXRDUlQyU3luYyhTaVNfUHIsIE1vZGVObywgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOworCSBTaVNfU2V0Q1JUMlN5bmMoU2lTX1ByLCBNb2RlTm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAKLQkgICAvKiBGb3IgMzAxQkRIIChQYW5lbCBsaW5rIGluaXRpYWxpemF0aW9uKTogKi8KLQkgICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpKSB7Ci0JICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAhPSBQYW5lbF82NDB4NDgwKSB7Ci0JCSBpZighKChTaVNfUHItPlNpU19TZXRGbGFnICYgU2V0RE9TTW9kZSkgJiYgKChNb2RlTm8gPT0gMHgwMykgfHwgKE1vZGVObyA9PSAweDEwKSkpKSB7Ci0JCSAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewotCQkgICAgICAgU2lTX01vZENSVDFDUlRDKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LEh3SW5mbyk7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLQkgICAgICB9Ci0JICAgICAgU2lTX1NldENSVDJFQ0xLKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsCi0JCSAgICAgICAgICAgICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LEh3SW5mbyk7Ci0JICAgfQotICAgICAgICB9CisJIC8qIEZvciAzMDFCREggKFBhbmVsIGxpbmsgaW5pdGlhbGl6YXRpb24pOiAqLworCSBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpKSB7CisKKwkgICAgaWYoISgoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpICYmICgoTW9kZU5vID09IDB4MDMpIHx8IChNb2RlTm8gPT0gMHgxMCkpKSkgeworCSAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgeworCQkgIFNpU19Nb2RDUlQxQ1JUQyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisJICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkgICAgU2lTX1NldENSVDJFQ0xLKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKKwkgfQorICAgICAgfQogCiAgICB9IGVsc2UgewogCi0gICAgICAgIFNpU19TZXRDUlQyU3luYyhTaVNfUHIsIE1vZGVObywgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOworICAgICAgU2lTX1NldENSVDJTeW5jKFNpU19QciwgTW9kZU5vLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwogCi0gICAgICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkpIHsKLSAgICAJICAgU2lTX01vZENSVDFDUlRDKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsUmVmcmVzaFJhdGVUYWJsZUluZGV4LEh3SW5mbyk7Ci0JfQorICAgICAgU2lTX01vZENSVDFDUlRDKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKIAotICAgICAgICBTaVNfU2V0Q1JUMkVDTEsoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCxSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsSHdJbmZvKTsKKyAgICAgIFNpU19TZXRDUlQyRUNMSyhTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4LFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAKLQlpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTG93TW9kZVRlc3RzKSB7Ci0gICAgIAkgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKLQkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKLQkgICAgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMb3dNb2RlVGVzdHMpIHsKKwkgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgeworCSAgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKICNpZmRlZiBTSVMzMTVICi0JCSAgICBTaVNfU2V0Q0g3MDF4Rm9yTENEKFNpU19QcixId0luZm8pOworCQkgIFNpU19TZXRDSDcwMXhGb3JMQ0QoU2lTX1ByKTsKICNlbmRpZgotCQkgfQotCSAgICAgIH0KLQkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgewotICAgICAgIAkJIFNpU19TZXRDSFRWUmVnKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKLQkgICAgICB9Ci0gICAgIAkgICB9Ci0JfQorCSAgICAgICB9CisJICAgIH0KKwkgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKKwkgICAgICAgU2lTX1NldENIVFZSZWcoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCxSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSAgICB9CisJIH0KKyAgICAgIH0KIAogICAgfQogCiAjaWZkZWYgU0lTMzAwCi0gICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKICAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMb3dNb2RlVGVzdHMpIHsKIAkgaWYoU2lTX1ByLT5TaVNfVXNlT0VNKSB7CiAJICAgIGlmKChTaVNfUHItPlNpU19Vc2VST00pICYmIChTaVNfUHItPlNpU19Vc2VPRU0gPT0gLTEpKSB7CiAJICAgICAgIGlmKChST01BZGRyWzB4MjMzXSA9PSAweDEyKSAmJiAoUk9NQWRkclsweDIzNF0gPT0gMHgzNCkpIHsKLQkgICAgICAgICAgU2lTX09FTTMwMFNldHRpbmcoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgsCi0JICAgICAgIAkJCSAgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCQkgIFNpU19PRU0zMDBTZXR0aW5nKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKIAkgICAgICAgfQogCSAgICB9IGVsc2UgewotICAgICAgIAkgICAgICAgU2lTX09FTTMwMFNldHRpbmcoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgsCi0JICAgICAgIAkJCSBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSAgICAgICBTaVNfT0VNMzAwU2V0dGluZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAJICAgIH0KIAkgfQogCSBpZihTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB7Ci0gICAgICAgICAgICBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fAorCSAgICBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fAogCSAgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMDI0KSkgewotCSAgICAgICBTZXRPRU1MQ0REYXRhMihTaVNfUHIsIEh3SW5mbywgTW9kZU5vLCBNb2RlSWRJbmRleCxSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSAgICAgICBTZXRPRU1MQ0REYXRhMihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKIAkgICAgfQogCSAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7CiAgICAgICAgICB9CkBAIC04OTk1LDIxICs4ODA3LDIxIEBACiAjZW5kaWYKIAogI2lmZGVmIFNJUzMxNUgKLSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAgICAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTG93TW9kZVRlc3RzKSB7Ci0JIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzY2MSkgewotCSAgICBTaVNfRmluYWxpemVMQ0QoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8pOwotICAgICAgICAgICAgU2lTX09FTTMxMFNldHRpbmcoU2lTX1ByLCBId0luZm8sIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisJIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfNjYxKSB7CisJICAgIFNpU19GaW5hbGl6ZUxDRChTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOworCSAgICBTaVNfT0VNMzEwU2V0dGluZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAJIH0gZWxzZSB7Ci0JICAgIFNpU19PRU02NjFTZXR0aW5nKFNpU19QciwgSHdJbmZvLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSAgICBTaVNfT0VNNjYxU2V0dGluZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAJIH0KLSAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMSwweDQwKTsKKwkgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4NDApOwogICAgICAgfQogICAgfQogI2VuZGlmCiAKICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMb3dNb2RlVGVzdHMpIHsKLSAgICAgIFNpU19FbmFibGVCcmlkZ2UoU2lTX1ByLCBId0luZm8pOworICAgICAgU2lTX0VuYWJsZUJyaWRnZShTaVNfUHIpOwogICAgfQogCiAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7CkBAIC05MDE3LDE1ICs4ODI5LDE1IEBACiAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDEpIHsKICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CiAJIC8qIERpc2FibGUgTENEIHBhbmVsIHdoZW4gdXNpbmcgVFYgKi8KLQkgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RkYsMHgwQyk7CisJIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLDB4RkYsMHgwQyk7CiAgICAgICB9IGVsc2UgewogCSAvKiBEaXNhYmxlIFRWIHdoZW4gdXNpbmcgTENEICovCi0JIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMTBFLDB4RjgpOworCSBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MGUsMHgwMSwweGY4KTsKICAgICAgIH0KICAgIH0KIAogICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExvd01vZGVUZXN0cykgewotICAgICAgU2lTX0xvY2tDUlQyKFNpU19QcixId0luZm8pOworICAgICAgU2lTX0xvY2tDUlQyKFNpU19Qcik7CiAgICB9CiAKICAgIHJldHVybiBUUlVFOwpAQCAtOTAzNywxMyArODg0OSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotU2lTX1NpUzMweEJMT24oU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TaVMzMHhCTE9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAvKiBTd2l0Y2ggb24gTENEIGJhY2tsaWdodCBvbiBTaVMzMHhMViAqLwogICBTaVNfRERDMkRlbGF5KFNpU19QciwweGZmMDApOwogICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYpICYgMHgwMikpIHsKICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4MDIpOwotICAgICBTaVNfV2FpdFZCUmV0cmFjZShTaVNfUHIsSHdJbmZvKTsKKyAgICAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByKTsKICAgfQogICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYpICYgMHgwMSkpIHsKICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4MDEpOwpAQCAtOTA1MSwxMiArODg2MywxMSBAQAogfQogCiB2b2lkCi1TaVNfU2lTMzB4QkxPZmYoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TaVMzMHhCTE9mZihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICAgLyogU3dpdGNoIG9mZiBMQ0QgYmFja2xpZ2h0IG9uIFNpUzMweExWICovCiAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhGRSk7Ci0gIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhGRCk7Ci0gIFNpU19EREMyRGVsYXkoU2lTX1ByLDB4ZTAwMCk7CisgIFNpU19EREMyRGVsYXkoU2lTX1ByLDB4ZmYwMCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05MDY0LDcgKzg4NzUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXR1cEREQ04oU2lTX1ByaXZhdGUgKlNpU19QcikKK1NpU19TZXR1cEREQ04oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSA9IH5TaVNfUHItPlNpU19ERENfRGF0YTsKICAgU2lTX1ByLT5TaVNfRERDX05DbGsgID0gflNpU19Qci0+U2lTX0REQ19DbGs7CkBAIC05MDc1LDEyICs4ODg2LDEyIEBACiB9CiAKICNpZmRlZiBTSVMzMDAKLXN0YXRpYyBVQ0hBUiAqCi1TaVNfU2V0VHJ1bXBCbG9ja0xvb3AoU2lTX1ByaXZhdGUgKlNpU19QciwgVUNIQVIgKmRhdGFwdHIpCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCitTaVNfU2V0VHJ1bXBCbG9ja0xvb3Aoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGNoYXIgKmRhdGFwdHIpCiB7CiAgIGludCBpLCBqLCBudW07Ci0gIFVTSE9SVCB0ZW1wYWgsdGVtcDsKLSAgVUNIQVIgKm15ZGF0YXB0cjsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcGFoLHRlbXA7CisgIHVuc2lnbmVkIGNoYXIgKm15ZGF0YXB0cjsKIAogICBmb3IoaT0wOyBpPDIwOyBpKyspIHsJCQkJLyogRG8gMjAgYXR0ZW1wdHMgdG8gd3JpdGUgKi8KICAgICAgbXlkYXRhcHRyID0gZGF0YXB0cjsKQEAgLTkwODgsNyArODg5OSw3IEBACiAgICAgIGlmKCFudW0pIHJldHVybiBteWRhdGFwdHI7CiAgICAgIGlmKGkpIHsKICAgICAgICAgU2lTX1NldFN0b3AoU2lTX1ByKTsKLQlTaVNfRERDMkRlbGF5KFNpU19QcixTaVNfSTJDREVMQVlTSE9SVCoyKTsKKwlTaVNfRERDMkRlbGF5KFNpU19QcixTaVNfSTJDREVMQVlTSE9SVCAqIDIpOwogICAgICB9CiAgICAgIGlmKFNpU19TZXRTdGFydChTaVNfUHIpKSBjb250aW51ZTsJCS8qIFNldCBzdGFydCBjb25kaXRpb24gKi8KICAgICAgdGVtcGFoID0gU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHI7CkBAIC05MTEwLDEyICs4OTIxLDEyIEBACiB9CiAKIHN0YXRpYyBCT09MRUFOCi1TaVNfU2V0VHJ1bXBpb25CbG9jayhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVQ0hBUiAqZGF0YXB0cikKK1NpU19TZXRUcnVtcGlvbkJsb2NrKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBjaGFyICpkYXRhcHRyKQogewogICBTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkciA9IDB4RjA7ICAJCS8qIERBQiAoRGV2aWNlIEFkZHJlc3MgQnl0ZSkgKi8KICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgxMTsJCQkvKiBCaXQgMCA9IFNDOyAgQml0IDEgPSBTRCAqLwotICBTaVNfUHItPlNpU19ERENfRGF0YSAgPSAweDAyOyAgICAgICAgICAgICAgCS8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIERhdGEgKi8KLSAgU2lTX1ByLT5TaVNfRERDX0NsayAgID0gMHgwMTsgICAgICAgICAgICAgIAkvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBDbGsgKi8KKyAgU2lTX1ByLT5TaVNfRERDX0RhdGEgID0gMHgwMjsJCQkvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBEYXRhICovCisgIFNpU19Qci0+U2lTX0REQ19DbGsgICA9IDB4MDE7CQkJLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgQ2xrICovCiAgIFNpU19TZXR1cEREQ04oU2lTX1ByKTsKIAogICBTaVNfU2V0U3dpdGNoRERDMihTaVNfUHIpOwpAQCAtOTEyNCw5ICs4OTM1LDExIEBACiAgICAgIGRhdGFwdHIgPSBTaVNfU2V0VHJ1bXBCbG9ja0xvb3AoU2lTX1ByLCBkYXRhcHRyKTsKICAgICAgaWYoIWRhdGFwdHIpIHJldHVybiBGQUxTRTsKICAgfQorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiVHJ1bXBpb24gYmxvY2sgc3VjY2Vzc1xuIik7CiAjZW5kaWYKKyNlbmRpZgogICByZXR1cm4gVFJVRTsKIH0KICNlbmRpZgpAQCAtOTEzOSwxNTUgKzg5NTIsMTIxIEBACiAgKi8KIAogc3RhdGljIEJPT0xFQU4KLVNpU19TZXRDaFJlZyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4LCBVU0hPUlQgbXlvcikKK1NpU19TZXRDaFJlZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCwgdW5zaWduZWQgc2hvcnQgbXlvcikKIHsKLSAgVVNIT1JUIHRlbXBhaCx0ZW1wLGk7CisgIHVuc2lnbmVkIHNob3J0IHRlbXAsIGk7CiAKICAgZm9yKGk9MDsgaTwyMDsgaSsrKSB7CQkJCS8qIERvIDIwIGF0dGVtcHRzIHRvIHdyaXRlICovCiAgICAgIGlmKGkpIHsKLSAgICAgICAgU2lTX1NldFN0b3AoU2lTX1ByKTsKLQlTaVNfRERDMkRlbGF5KFNpU19QcixTaVNfSTJDREVMQVlTSE9SVCk7CisJU2lTX1NldFN0b3AoU2lTX1ByKTsKKwlTaVNfRERDMkRlbGF5KFNpU19QcixTaVNfSTJDREVMQVlTSE9SVCAqIDQpOwogICAgICB9Ci0gICAgIGlmKFNpU19TZXRTdGFydChTaVNfUHIpKSBjb250aW51ZTsJCS8qIFNldCBzdGFydCBjb25kaXRpb24gKi8KLSAgICAgdGVtcGFoID0gU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHI7Ci0gICAgIHRlbXAgPSBTaVNfV3JpdGVEREMyRGF0YShTaVNfUHIsdGVtcGFoKTsJLyogV3JpdGUgREFCIChTMD0wPXdyaXRlKSAqLwotICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJLyogICAgKEVSUk9SOiBubyBhY2spICovCi0gICAgIHRlbXBhaCA9IHRlbXBieCAmIDB4MDBGRjsJCQkvKiBXcml0ZSBSQUIgKi8KLSAgICAgdGVtcGFoIHw9IG15b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICg3MDB4OiBzZXQgYml0IDcsIHNlZSBkYXRhc2hlZXQpICovCi0gICAgIHRlbXAgPSBTaVNfV3JpdGVEREMyRGF0YShTaVNfUHIsdGVtcGFoKTsKLSAgICAgaWYodGVtcCkgY29udGludWU7CQkJCS8qICAgIChFUlJPUjogbm8gYWNrKSAqLwotICAgICB0ZW1wYWggPSAodGVtcGJ4ICYgMHhGRjAwKSA+PiA4OwotICAgICB0ZW1wID0gU2lTX1dyaXRlRERDMkRhdGEoU2lTX1ByLHRlbXBhaCk7CS8qIFdyaXRlIGRhdGEgKi8KLSAgICAgaWYodGVtcCkgY29udGludWU7CQkJCS8qICAgIChFUlJPUjogbm8gYWNrKSAqLwotICAgICBpZihTaVNfU2V0U3RvcChTaVNfUHIpKSBjb250aW51ZTsJCS8qIFNldCBzdG9wIGNvbmRpdGlvbiAqLworICAgICBpZihTaVNfU2V0U3RhcnQoU2lTX1ByKSkgY29udGludWU7CQkJCQkvKiBTZXQgc3RhcnQgY29uZGl0aW9uICovCisgICAgIHRlbXAgPSBTaVNfV3JpdGVEREMyRGF0YShTaVNfUHIsIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyKTsJLyogV3JpdGUgREFCIChTMD0wPXdyaXRlKSAqLworICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJCQkJLyogICAgKEVSUk9SOiBubyBhY2spICovCisgICAgIHRlbXAgPSBTaVNfV3JpdGVEREMyRGF0YShTaVNfUHIsIChyZWcgfCBteW9yKSk7CQkJLyogV3JpdGUgUkFCICg3MDB4OiBzZXQgYml0IDcsIHNlZSBkYXRhc2hlZXQpICovCisgICAgIGlmKHRlbXApIGNvbnRpbnVlOwkJCQkJCQkvKiAgICAoRVJST1I6IG5vIGFjaykgKi8KKyAgICAgdGVtcCA9IFNpU19Xcml0ZUREQzJEYXRhKFNpU19QciwgdmFsKTsJCQkJLyogV3JpdGUgZGF0YSAqLworICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJCQkJLyogICAgKEVSUk9SOiBubyBhY2spICovCisgICAgIGlmKFNpU19TZXRTdG9wKFNpU19QcikpIGNvbnRpbnVlOwkJCQkJLyogU2V0IHN0b3AgY29uZGl0aW9uICovCiAgICAgIFNpU19Qci0+U2lTX0Nocm9udGVsSW5pdCA9IDE7CiAgICAgIHJldHVybiBUUlVFOwogICB9CiAgIHJldHVybiBGQUxTRTsKIH0KIAotI2lmIDAKLSNpZmRlZiBTSVMzMDAKLS8qIFdyaXRlIFRydW1waW9uIHJlZ2lzdGVyICovCi1zdGF0aWMgdm9pZAotU2lTX1NldFRydW1wUmVnKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB0ZW1wYngpCi17Ci0gIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhGMDsgIAkJLyogREFCIChEZXZpY2UgQWRkcmVzcyBCeXRlKSAqLwotICBTaVNfUHItPlNpU19ERENfSW5kZXggPSAweDExOwkJCS8qIEJpdCAwID0gU0M7ICBCaXQgMSA9IFNEICovCi0gIFNpU19Qci0+U2lTX0REQ19EYXRhICA9IDB4MDI7ICAgICAgICAgICAgICAJLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgRGF0YSAqLwotICBTaVNfUHItPlNpU19ERENfQ2xrICAgPSAweDAxOyAgICAgICAgICAgICAgCS8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIENsayAqLwotICBTaVNfU2V0dXBERENOKFNpU19Qcik7Ci0gIFNpU19TZXRDaFJlZyhTaVNfUHIsIHRlbXBieCwgMCk7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCiAvKiBXcml0ZSB0byBDaHJvbnRlbCA3MDB4ICovCi0vKiBQYXJhbWV0ZXIgaXMgW0RhdGEgKFMxNS1TOCkgfCBSZWdpc3RlciBubyAoUzctUzApXSAqLwogdm9pZAotU2lTX1NldENINzAweChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4KQorU2lTX1NldENINzAweChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKIHsKICAgU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHIgPSAweEVBOyAgCQkvKiBEQUIgKERldmljZSBBZGRyZXNzIEJ5dGUpICovCiAKKyAgU2lTX0REQzJEZWxheShTaVNfUHIsU2lTX0kyQ0RFTEFZU0hPUlQpOworCiAgIGlmKCEoU2lTX1ByLT5TaVNfQ2hyb250ZWxJbml0KSkgewogICAgICBTaVNfUHItPlNpU19ERENfSW5kZXggPSAweDExOwkJLyogQml0IDAgPSBTQzsgIEJpdCAxID0gU0QgKi8KLSAgICAgU2lTX1ByLT5TaVNfRERDX0RhdGEgID0gMHgwMjsgICAgICAgICAgICAgIC8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIERhdGEgKi8KLSAgICAgU2lTX1ByLT5TaVNfRERDX0NsayAgID0gMHgwMTsgICAgICAgICAgICAgIC8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIENsayAqLworICAgICBTaVNfUHItPlNpU19ERENfRGF0YSAgPSAweDAyOwkJLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgRGF0YSAqLworICAgICBTaVNfUHItPlNpU19ERENfQ2xrICAgPSAweDAxOwkJLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgQ2xrICovCiAgICAgIFNpU19TZXR1cEREQ04oU2lTX1ByKTsKICAgfQogCi0gIGlmKCAoIShTaVNfU2V0Q2hSZWcoU2lTX1ByLCB0ZW1wYngsIDB4ODApKSkgJiYKKyAgaWYoICghKFNpU19TZXRDaFJlZyhTaVNfUHIsIHJlZywgdmFsLCAweDgwKSkpICYmCiAgICAgICAoIShTaVNfUHItPlNpU19DaHJvbnRlbEluaXQpKSApIHsKLSAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgwYTsJCS8qIEJpdCA3ID0gU0M7ICBCaXQgNiA9IFNEICovCi0gICAgIFNpU19Qci0+U2lTX0REQ19EYXRhICA9IDB4ODA7ICAgICAgICAgICAgICAvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBEYXRhICovCi0gICAgIFNpU19Qci0+U2lTX0REQ19DbGsgICA9IDB4NDA7ICAgICAgICAgICAgICAvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBDbGsgKi8KKyAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgwYTsKKyAgICAgU2lTX1ByLT5TaVNfRERDX0RhdGEgID0gMHg4MDsKKyAgICAgU2lTX1ByLT5TaVNfRERDX0NsayAgID0gMHg0MDsKICAgICAgU2lTX1NldHVwRERDTihTaVNfUHIpOwogCi0gICAgIFNpU19TZXRDaFJlZyhTaVNfUHIsIHRlbXBieCwgMHg4MCk7CisgICAgIFNpU19TZXRDaFJlZyhTaVNfUHIsIHJlZywgdmFsLCAweDgwKTsKICAgfQogfQogCiAvKiBXcml0ZSB0byBDaHJvbnRlbCA3MDF4ICovCiAvKiBQYXJhbWV0ZXIgaXMgW0RhdGEgKFMxNS1TOCkgfCBSZWdpc3RlciBubyAoUzctUzApXSAqLwogdm9pZAotU2lTX1NldENINzAxeChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4KQorU2lTX1NldENINzAxeChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKIHsKICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgxMTsJCQkvKiBCaXQgMCA9IFNDOyAgQml0IDEgPSBTRCAqLwotICBTaVNfUHItPlNpU19ERENfRGF0YSAgPSAweDA4OyAgICAgICAgICAgICAgICAgLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgRGF0YSAqLwotICBTaVNfUHItPlNpU19ERENfQ2xrICAgPSAweDA0OyAgICAgICAgICAgICAgICAgLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgQ2xrICovCisgIFNpU19Qci0+U2lTX0REQ19EYXRhICA9IDB4MDg7CQkJLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgRGF0YSAqLworICBTaVNfUHItPlNpU19ERENfQ2xrICAgPSAweDA0OwkJCS8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIENsayAqLwogICBTaVNfU2V0dXBERENOKFNpU19Qcik7Ci0gIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhFQTsgIAkJLyogREFCIChEZXZpY2UgQWRkcmVzcyBCeXRlKSAqLwotICBTaVNfU2V0Q2hSZWcoU2lTX1ByLCB0ZW1wYngsIDApOworICBTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkciA9IDB4RUE7CQkvKiBEQUIgKERldmljZSBBZGRyZXNzIEJ5dGUpICovCisgIFNpU19TZXRDaFJlZyhTaVNfUHIsIHJlZywgdmFsLCAwKTsKIH0KIAotc3RhdGljIHZvaWQKLVNpU19TZXRDSDcweHgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBieCkKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCitzdGF0aWMKKyNlbmRpZgordm9pZAorU2lTX1NldENINzB4eChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKIHsKICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAxKQotICAgICBTaVNfU2V0Q0g3MDB4KFNpU19Qcix0ZW1wYngpOworICAgICBTaVNfU2V0Q0g3MDB4KFNpU19QciwgcmVnLCB2YWwpOwogICBlbHNlCi0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7CisgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCByZWcsIHZhbCk7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19HZXRDaFJlZyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgbXlvcikKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorU2lTX0dldENoUmVnKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBteW9yKQogewotICBVU0hPUlQgdGVtcGFoLHRlbXAsaTsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcGFoLCB0ZW1wLCBpOwogCiAgIGZvcihpPTA7IGk8MjA7IGkrKykgewkJCQkvKiBEbyAyMCBhdHRlbXB0cyB0byByZWFkICovCiAgICAgIGlmKGkpIHsKLSAgICAgICAgU2lTX1NldFN0b3AoU2lTX1ByKTsKLQlTaVNfRERDMkRlbGF5KFNpU19QcixTaVNfSTJDREVMQVlTSE9SVCk7CisJU2lTX1NldFN0b3AoU2lTX1ByKTsKKwlTaVNfRERDMkRlbGF5KFNpU19QcixTaVNfSTJDREVMQVlTSE9SVCAqIDQpOwogICAgICB9Ci0gICAgIGlmKFNpU19TZXRTdGFydChTaVNfUHIpKSBjb250aW51ZTsJCS8qIFNldCBzdGFydCBjb25kaXRpb24gKi8KLSAgICAgdGVtcGFoID0gU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHI7Ci0gICAgIHRlbXAgPSBTaVNfV3JpdGVEREMyRGF0YShTaVNfUHIsdGVtcGFoKTsJLyogV3JpdGUgREFCIChTMD0wPXdyaXRlKSAqLwotICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJLyogICAgICAgIChFUlJPUjogbm8gYWNrKSAqLwotICAgICB0ZW1wYWggPSBTaVNfUHItPlNpU19ERENfUmVhZEFkZHIgfCBteW9yOwkvKiBXcml0ZSBSQUIgKDcwMHg6IHwgMHg4MCkgKi8KLSAgICAgdGVtcCA9IFNpU19Xcml0ZUREQzJEYXRhKFNpU19Qcix0ZW1wYWgpOwotICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJLyogICAgICAgIChFUlJPUjogbm8gYWNrKSAqLwotICAgICBpZiAoU2lTX1NldFN0YXJ0KFNpU19QcikpIGNvbnRpbnVlOwkvKiBSZS1zdGFydCAqLwotICAgICB0ZW1wYWggPSBTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkciB8IDB4MDE7LyogREFCIHwgMHgwMSA9IFJlYWQgKi8KLSAgICAgdGVtcCA9IFNpU19Xcml0ZUREQzJEYXRhKFNpU19Qcix0ZW1wYWgpOwkvKiBEQUIgKFMwPTE9cmVhZCkgKi8KLSAgICAgaWYodGVtcCkgY29udGludWU7CQkJCS8qICAgICAgICAoRVJST1I6IG5vIGFjaykgKi8KLSAgICAgdGVtcGFoID0gU2lTX1JlYWREREMyRGF0YShTaVNfUHIsdGVtcGFoKTsJLyogUmVhZCBieXRlICovCi0gICAgIGlmKFNpU19TZXRTdG9wKFNpU19QcikpIGNvbnRpbnVlOwkJLyogU3RvcCBjb25kaXRpb24gKi8KKyAgICAgaWYoU2lTX1NldFN0YXJ0KFNpU19QcikpIGNvbnRpbnVlOwkJCQkJLyogU2V0IHN0YXJ0IGNvbmRpdGlvbiAqLworICAgICB0ZW1wID0gU2lTX1dyaXRlRERDMkRhdGEoU2lTX1ByLFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyKTsJLyogV3JpdGUgREFCIChTMD0wPXdyaXRlKSAqLworICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJCQkJLyogICAgICAgIChFUlJPUjogbm8gYWNrKSAqLworICAgICB0ZW1wID0gU2lTX1dyaXRlRERDMkRhdGEoU2lTX1ByLFNpU19Qci0+U2lTX0REQ19SZWFkQWRkciB8IG15b3IpOwkvKiBXcml0ZSBSQUIgKDcwMHg6IHwgMHg4MCkgKi8KKyAgICAgaWYodGVtcCkgY29udGludWU7CQkJCQkJCS8qICAgICAgICAoRVJST1I6IG5vIGFjaykgKi8KKyAgICAgaWYgKFNpU19TZXRTdGFydChTaVNfUHIpKSBjb250aW51ZTsJCQkJLyogUmUtc3RhcnQgKi8KKyAgICAgdGVtcCA9IFNpU19Xcml0ZUREQzJEYXRhKFNpU19QcixTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkciB8IDB4MDEpOy8qIERBQiAoUzA9MT1yZWFkKSAqLworICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJCQkJLyogICAgICAgIChFUlJPUjogbm8gYWNrKSAqLworICAgICB0ZW1wYWggPSBTaVNfUmVhZEREQzJEYXRhKFNpU19Qcik7CQkJCQkvKiBSZWFkIGJ5dGUgKi8KKyAgICAgaWYoU2lTX1NldFN0b3AoU2lTX1ByKSkgY29udGludWU7CQkJCQkvKiBTdG9wIGNvbmRpdGlvbiAqLwogICAgICBTaVNfUHItPlNpU19DaHJvbnRlbEluaXQgPSAxOwotICAgICByZXR1cm4odGVtcGFoKTsKKyAgICAgcmV0dXJuIHRlbXBhaDsKICAgfQogICByZXR1cm4gMHhGRkZGOwogfQogCi0jaWYgMAotI2lmZGVmIFNJUzMwMAotLyogUmVhZCBmcm9tIFRydW1waW9uICovCi1zdGF0aWMgVVNIT1JUCi1TaVNfR2V0VHJ1bXBSZWcoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBieCkKLXsKLSAgU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHIgPSAweEYwOwkvKiBEQUIgKi8KLSAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgxMTsJCS8qIEJpdCAwID0gU0M7ICBCaXQgMSA9IFNEICovCi0gIFNpU19Qci0+U2lTX0REQ19EYXRhICA9IDB4MDI7ICAgICAgICAgLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgRGF0YSAqLwotICBTaVNfUHItPlNpU19ERENfQ2xrICAgPSAweDAxOyAgICAgICAgIC8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIENsayAqLwotICBTaVNfU2V0dXBERENOKFNpU19Qcik7Ci0gIFNpU19Qci0+U2lTX0REQ19SZWFkQWRkciA9IHRlbXBieDsKLSAgcmV0dXJuKFNpU19HZXRDaFJlZyhTaVNfUHIsMCkpOwotfQotI2VuZGlmCi0jZW5kaWYKLQogLyogUmVhZCBmcm9tIENocm9udGVsIDcwMHggKi8KIC8qIFBhcmFtZXRlciBpcyBbUmVnaXN0ZXIgbm8gKFM3LVMwKV0gKi8KLVVTSE9SVAotU2lTX0dldENINzAweChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4KQordW5zaWduZWQgc2hvcnQKK1NpU19HZXRDSDcwMHgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHRlbXBieCkKIHsKLSAgVVNIT1JUIHJlc3VsdDsKKyAgdW5zaWduZWQgc2hvcnQgcmVzdWx0OwogCiAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhFQTsJCS8qIERBQiAqLwogCisgIFNpU19EREMyRGVsYXkoU2lTX1ByLFNpU19JMkNERUxBWVNIT1JUKTsKKwogICBpZighKFNpU19Qci0+U2lTX0Nocm9udGVsSW5pdCkpIHsKICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgxMTsJCS8qIEJpdCAwID0gU0M7ICBCaXQgMSA9IFNEICovCi0gICAgIFNpU19Qci0+U2lTX0REQ19EYXRhICA9IDB4MDI7ICAgICAgICAgICAgICAvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBEYXRhICovCi0gICAgIFNpU19Qci0+U2lTX0REQ19DbGsgICA9IDB4MDE7ICAgICAgICAgICAgICAvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBDbGsgKi8KKyAgICAgU2lTX1ByLT5TaVNfRERDX0RhdGEgID0gMHgwMjsJCS8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIERhdGEgKi8KKyAgICAgU2lTX1ByLT5TaVNfRERDX0NsayAgID0gMHgwMTsJCS8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIENsayAqLwogICAgICBTaVNfU2V0dXBERENOKFNpU19Qcik7CiAgIH0KIApAQCAtOTMwMyw1MiArOTA4Miw2OSBAQAogCiAgICAgIHJlc3VsdCA9IFNpU19HZXRDaFJlZyhTaVNfUHIsMHg4MCk7CiAgIH0KLSAgcmV0dXJuKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFJlYWQgZnJvbSBDaHJvbnRlbCA3MDF4ICovCiAvKiBQYXJhbWV0ZXIgaXMgW1JlZ2lzdGVyIG5vIChTNy1TMCldICovCi1VU0hPUlQKLVNpU19HZXRDSDcwMXgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBieCkKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0Q0g3MDF4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCB0ZW1wYngpCiB7CiAgIFNpU19Qci0+U2lTX0REQ19JbmRleCA9IDB4MTE7CQkJLyogQml0IDAgPSBTQzsgIEJpdCAxID0gU0QgKi8KLSAgU2lTX1ByLT5TaVNfRERDX0RhdGEgID0gMHgwODsgICAgICAgICAgICAgICAgIC8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIERhdGEgKi8KLSAgU2lTX1ByLT5TaVNfRERDX0NsayAgID0gMHgwNDsgICAgICAgICAgICAgICAgIC8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIENsayAqLworICBTaVNfUHItPlNpU19ERENfRGF0YSAgPSAweDA4OwkJCS8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIERhdGEgKi8KKyAgU2lTX1ByLT5TaVNfRERDX0NsayAgID0gMHgwNDsJCQkvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBDbGsgKi8KICAgU2lTX1NldHVwRERDTihTaVNfUHIpOwogICBTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkciA9IDB4RUE7CQkvKiBEQUIgKi8KIAogICBTaVNfUHItPlNpU19ERENfUmVhZEFkZHIgPSB0ZW1wYng7CiAKLSAgcmV0dXJuKFNpU19HZXRDaFJlZyhTaVNfUHIsMCkpOworICByZXR1cm4gU2lTX0dldENoUmVnKFNpU19QciwwKTsKIH0KIAogLyogUmVhZCBmcm9tIENocm9udGVsIDcweHggKi8KIC8qIFBhcmFtZXRlciBpcyBbUmVnaXN0ZXIgbm8gKFM3LVMwKV0gKi8KLXN0YXRpYyBVU0hPUlQKLVNpU19HZXRDSDcweHgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBieCkKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCitzdGF0aWMKKyNlbmRpZgordW5zaWduZWQgc2hvcnQKK1NpU19HZXRDSDcweHgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHRlbXBieCkKIHsKICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAxKQotICAgICByZXR1cm4oU2lTX0dldENINzAweChTaVNfUHIsIHRlbXBieCkpOworICAgICByZXR1cm4gU2lTX0dldENINzAweChTaVNfUHIsIHRlbXBieCk7CiAgIGVsc2UKLSAgICAgcmV0dXJuKFNpU19HZXRDSDcwMXgoU2lTX1ByLCB0ZW1wYngpKTsKKyAgICAgcmV0dXJuIFNpU19HZXRDSDcwMXgoU2lTX1ByLCB0ZW1wYngpOworfQorCit2b2lkCitTaVNfU2V0Q0g3MHh4QU5ET1Ioc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHJlZywKKwkJdW5zaWduZWQgY2hhciBteW9yLCB1bnNpZ25lZCBzaG9ydCBteWFuZCkKK3sKKyAgdW5zaWduZWQgc2hvcnQgdGVtcGJsOworCisgIHRlbXBibCA9IChTaVNfR2V0Q0g3MHh4KFNpU19QciwgKHJlZyAmIDB4RkYpKSAmIG15YW5kKSB8IG15b3I7CisgIFNpU19TZXRDSDcweHgoU2lTX1ByLCByZWcsIHRlbXBibCk7CiB9CiAKIC8qIE91ciBvd24gRERDIGZ1bmN0aW9ucyAqLwotc3RhdGljIFVTSE9SVAotU2lTX0luaXRERENSZWdzKFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGxvbmcgVkJGbGFncywgaW50IFZHQUVuZ2luZSwKLSAgICAgICAgICAgICAgICBVU0hPUlQgYWRhcHRudW0sIFVTSE9SVCBERENkYXRhdHlwZSwgQk9PTEVBTiBjaGVja2NyMzIpCisjaWZuZGVmIFNJU19YT1JHX1hGODYKK3N0YXRpYworI2VuZGlmCit1bnNpZ25lZCBzaG9ydAorU2lTX0luaXRERENSZWdzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBpbnQgVkJGbGFncywgaW50IFZHQUVuZ2luZSwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBhZGFwdG51bSwgdW5zaWduZWQgc2hvcnQgRERDZGF0YXR5cGUsIEJPT0xFQU4gY2hlY2tjcjMyLAorCQl1bnNpZ25lZCBpbnQgVkJGbGFnczIpCiB7CiAgICAgIHVuc2lnbmVkIGNoYXIgZGRjZHR5cGVbXSA9IHsgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMiwgMHhhNiB9OwogICAgICB1bnNpZ25lZCBjaGFyIGZsYWcsIGNyMzI7Ci0gICAgIFVTSE9SVCAgICAgICAgdGVtcCA9IDAsIG15YWRhcHRudW0gPSBhZGFwdG51bTsKKyAgICAgdW5zaWduZWQgc2hvcnQgICAgICAgIHRlbXAgPSAwLCBteWFkYXB0bnVtID0gYWRhcHRudW07CiAKICAgICAgaWYoYWRhcHRudW0gIT0gMCkgewotICAgICAgICBpZighKFZCRmxhZ3MgJiAoVkJfMzAxfFZCXzMwMUJ8VkJfMzAxQ3xWQl8zMDJCKSkpIHJldHVybiAweEZGRkY7Ci0JaWYoKFZCRmxhZ3MgJiBWQl8zMHhCREgpICYmIChhZGFwdG51bSA9PSAxKSkgcmV0dXJuIDB4RkZGRjsKLSAgICAgfQkKLSAgICAgCisJaWYoIShWQkZsYWdzMiAmIFZCMl9TSVNUTURTQlJJREdFKSkgcmV0dXJuIDB4RkZGRjsKKwlpZigoVkJGbGFnczIgJiBWQjJfMzB4QkRIKSAmJiAoYWRhcHRudW0gPT0gMSkpIHJldHVybiAweEZGRkY7CisgICAgIH0KKwogICAgICAvKiBhZGFwdGVybnVtIGZvciBTaVMgYnJpZGdlczogMCA9IENSVDEsIDEgPSBMQ0QsIDIgPSBWR0EyICovCi0gICAgIAorCiAgICAgIFNpU19Qci0+U2lTX0Nocm9udGVsSW5pdCA9IDA7ICAgLyogZm9yY2UgcmUtZGV0ZWN0aW9uISAqLwogCiAgICAgIFNpU19Qci0+U2lTX0REQ19TZWNBZGRyID0gMDsKQEAgLTkzNjAsNyArOTE1Niw3IEBACiAgICAgIGNyMzIgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMik7CiAKICNpZiAwCi0gICAgIGlmKFZCRmxhZ3MgJiBWQl9TSVNCUklER0UpIHsKKyAgICAgaWYoVkJGbGFnczIgJiBWQjJfU0lTQlJJREdFKSB7CiAJaWYobXlhZGFwdG51bSA9PSAwKSB7CiAJICAgaWYoIShjcjMyICYgMHgyMCkpIHsKIAkgICAgICBteWFkYXB0bnVtID0gMjsKQEAgLTkzNzYsMjAgKzkxNzIsMjAgQEAKICNlbmRpZgogCiAgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewkJLyogMzAwIHNlcmllcyAqLwotCQorCiAgICAgICAgIGlmKG15YWRhcHRudW0gIT0gMCkgewogCSAgIGZsYWcgPSAwOwotCSAgIGlmKFZCRmxhZ3MgJiBWQl9TSVNCUklER0UpIHsKKwkgICBpZihWQkZsYWdzMiAmIFZCMl9TSVNCUklER0UpIHsKIAkgICAgICBTaVNfUHItPlNpU19ERENfUG9ydCA9IFNpU19Qci0+U2lTX1BhcnQ0UG9ydDsKICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgwZjsKIAkgICB9CiAgICAgICAgIH0KIAotCWlmKCEoVkJGbGFncyAmIFZCXzMwMSkpIHsKKwlpZighKFZCRmxhZ3MyICYgVkIyXzMwMSkpIHsKIAkgICBpZigoY3IzMiAmIDB4ODApICYmIChjaGVja2NyMzIpKSB7CiAgICAgICAgICAgICAgIGlmKG15YWRhcHRudW0gPj0gMSkgewogCSAgICAgICAgIGlmKCEoY3IzMiAmIDB4MDgpKSB7Ci0JICAgICAgICAgICAgIG15YWRhcHRudW0gPSAxOworCQkgICAgIG15YWRhcHRudW0gPSAxOwogCQkgICAgIGlmKCEoY3IzMiAmIDB4MTApKSByZXR1cm4gMHhGRkZGOwogICAgICAgICAgICAgICAgICB9CiAJICAgICAgfQpAQCAtOTQwMSwxNyArOTE5NywxNyBAQAogCiAgICAgIH0gZWxzZSB7CQkJCQkJLyogMzE1LzMzMCBzZXJpZXMgKi8KIAotICAgICAJLyogaGVyZSB3ZSBzaW1wbGlmeTogMCA9IENSVDEsIDEgPSBDUlQyIChWR0EsIExDRCkgKi8KKwkvKiBoZXJlIHdlIHNpbXBsaWZ5OiAwID0gQ1JUMSwgMSA9IENSVDIgKFZHQSwgTENEKSAqLwogCi0JaWYoVkJGbGFncyAmIFZCX1NJU0JSSURHRSkgeworCWlmKFZCRmxhZ3MyICYgVkIyX1NJU0JSSURHRSkgewogCSAgIGlmKG15YWRhcHRudW0gPT0gMikgewogCSAgICAgIG15YWRhcHRudW0gPSAxOwotICAgICAgICAgICB9CisJICAgfQogCX0KIAogICAgICAgICBpZihteWFkYXB0bnVtID09IDEpIHsKLSAgICAgCSAgIGZsYWcgPSAwOwotCSAgIGlmKFZCRmxhZ3MgJiBWQl9TSVNCUklER0UpIHsKKwkgICBmbGFnID0gMDsKKwkgICBpZihWQkZsYWdzMiAmIFZCMl9TSVNCUklER0UpIHsKIAkgICAgICBTaVNfUHItPlNpU19ERENfUG9ydCA9IFNpU19Qci0+U2lTX1BhcnQ0UG9ydDsKICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgwZjsKIAkgICB9CkBAIC05NDI5LDkzICs5MjI1LDk2IEBACiAgICAgICAgIHRlbXAgPSBteWFkYXB0bnVtOwogICAgICAgICBpZihteWFkYXB0bnVtID09IDEpIHsKICAgICAgICAgICAgdGVtcCA9IDA7Ci0JICAgaWYoVkJGbGFncyAmIFZCX0xWRFMpIGZsYWcgPSAweGZmOworCSAgIGlmKFZCRmxhZ3MyICYgVkIyX0xWRFMpIGZsYWcgPSAweGZmOwogICAgICAgICB9CiAKIAlpZihmbGFnKSB0ZW1wID0gMDsKICAgICB9Ci0gICAgCisKICAgICBTaVNfUHItPlNpU19ERENfRGF0YSA9IDB4MDIgPDwgdGVtcDsKICAgICBTaVNfUHItPlNpU19ERENfQ2xrICA9IDB4MDEgPDwgdGVtcDsKIAogICAgIFNpU19TZXR1cEREQ04oU2lTX1ByKTsKIAorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJEREMgUG9ydCAleCBJbmRleCAleCBTaGlmdCAlZFxuIiwKICAgICAJCVNpU19Qci0+U2lTX0REQ19Qb3J0LCBTaVNfUHItPlNpU19ERENfSW5kZXgsIHRlbXApOwogI2VuZGlmCi0gICAgCisjZW5kaWYKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIFVTSE9SVAotU2lTX1dyaXRlREFCRERDKFNpU19Qcml2YXRlICpTaVNfUHIpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19Xcml0ZURBQkREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICAgIGlmKFNpU19TZXRTdGFydChTaVNfUHIpKSByZXR1cm4gMHhGRkZGOwogICAgaWYoU2lTX1dyaXRlRERDMkRhdGEoU2lTX1ByLCBTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkcikpIHsKLSAgCXJldHVybiAweEZGRkY7CisgICAgICByZXR1cm4gMHhGRkZGOwogICAgfQogICAgaWYoU2lTX1dyaXRlRERDMkRhdGEoU2lTX1ByLCBTaVNfUHItPlNpU19ERENfU2VjQWRkcikpIHsKLSAgIAlyZXR1cm4gMHhGRkZGOworICAgICAgcmV0dXJuIDB4RkZGRjsKICAgIH0KLSAgIHJldHVybigwKTsKKyAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgVVNIT1JUCi1TaVNfUHJlcGFyZVJlYWREREMoU2lTX1ByaXZhdGUgKlNpU19QcikKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorU2lTX1ByZXBhcmVSZWFkRERDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAgaWYoU2lTX1NldFN0YXJ0KFNpU19QcikpIHJldHVybiAweEZGRkY7CiAgICBpZihTaVNfV3JpdGVEREMyRGF0YShTaVNfUHIsIChTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkciB8IDB4MDEpKSkgewotICAgCXJldHVybiAweEZGRkY7CisgICAgICByZXR1cm4gMHhGRkZGOwogICAgfQotICAgcmV0dXJuKDApOworICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19QcmVwYXJlRERDKFNpU19Qcml2YXRlICpTaVNfUHIpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19QcmVwYXJlRERDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAgaWYoU2lTX1dyaXRlREFCRERDKFNpU19QcikpIFNpU19Xcml0ZURBQkREQyhTaVNfUHIpOwotICAgaWYoU2lTX1ByZXBhcmVSZWFkRERDKFNpU19QcikpIHJldHVybihTaVNfUHJlcGFyZVJlYWREREMoU2lTX1ByKSk7Ci0gICByZXR1cm4oMCk7CisgICBpZihTaVNfUHJlcGFyZVJlYWREREMoU2lTX1ByKSkgcmV0dXJuIChTaVNfUHJlcGFyZVJlYWREREMoU2lTX1ByKSk7CisgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKLVNpU19TZW5kQUNLKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB5ZXNubykKK1NpU19TZW5kQUNLKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCB5ZXNubykKIHsKICAgIFNpU19TZXRTQ0xLTG93KFNpU19Qcik7CiAgICBpZih5ZXNubykgewogICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX0REQ19Qb3J0LAotICAgICAgCQkgICAgICBTaVNfUHItPlNpU19ERENfSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAorCQkgICAgICBTaVNfUHItPlNpU19ERENfSW5kZXgsCisJCSAgICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKIAkJICAgICAgU2lTX1ByLT5TaVNfRERDX0RhdGEpOwogICAgfSBlbHNlIHsKICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19ERENfUG9ydCwKLSAgICAgIAkJICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKKwkJICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4LAorCQkgICAgICBTaVNfUHItPlNpU19ERENfTkRhdGEsCiAJCSAgICAgIDApOwogICAgfQogICAgU2lTX1NldFNDTEtIaWdoKFNpU19Qcik7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19Eb1Byb2JlRERDKFNpU19Qcml2YXRlICpTaVNfUHIpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19Eb1Byb2JlRERDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAgIHVuc2lnbmVkIGNoYXIgbWFzaywgdmFsdWU7Ci0gICAgVVNIT1JUICB0ZW1wLCByZXQ9MDsKKyAgICB1bnNpZ25lZCBzaG9ydCAgdGVtcCwgcmV0PTA7CiAgICAgQk9PTEVBTiBmYWlsZWQgPSBGQUxTRTsKIAogICAgIFNpU19TZXRTd2l0Y2hEREMyKFNpU19Qcik7CiAgICAgaWYoU2lTX1ByZXBhcmVEREMoU2lTX1ByKSkgewogICAgICAgICAgU2lTX1NldFN0b3AoU2lTX1ByKTsKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgICAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJQcm9iZTogUHJlcGFyZSBmYWlsZWRcbiIpOwogI2VuZGlmCi0gICAgICAgICByZXR1cm4oMHhGRkZGKTsKKyNlbmRpZgorICAgICAgICAgcmV0dXJuIDB4RkZGRjsKICAgICB9CiAgICAgbWFzayA9IDB4ZjA7CiAgICAgdmFsdWUgPSAweDIwOwogICAgIGlmKFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID09IDB4YTApIHsKLSAgICAgICB0ZW1wID0gKHVuc2lnbmVkIGNoYXIpU2lTX1JlYWREREMyRGF0YShTaVNfUHIsIDApOworICAgICAgIHRlbXAgPSAodW5zaWduZWQgY2hhcilTaVNfUmVhZEREQzJEYXRhKFNpU19Qcik7CiAgICAgICAgU2lTX1NlbmRBQ0soU2lTX1ByLCAwKTsKICAgICAgICBpZih0ZW1wID09IDApIHsKICAgICAgICAgICAgbWFzayA9IDB4ZmY7CkBAIC05NTIzLDM0ICs5MzIyLDQxIEBACiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZmFpbGVkID0gVFJVRTsKIAkgICByZXQgPSAweEZGRkY7CisjaWZkZWYgU0lTX1hPUkdfWEY4NgogI2lmZGVmIFRXREVCVUcKICAgICAgICAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJQcm9iZTogUmVhZCAxIGZhaWxlZFxuIik7CiAjZW5kaWYKKyNlbmRpZgogICAgICAgIH0KICAgICB9CiAgICAgaWYoZmFpbGVkID09IEZBTFNFKSB7Ci0gICAgICAgdGVtcCA9ICh1bnNpZ25lZCBjaGFyKVNpU19SZWFkRERDMkRhdGEoU2lTX1ByLCAwKTsKKyAgICAgICB0ZW1wID0gKHVuc2lnbmVkIGNoYXIpU2lTX1JlYWREREMyRGF0YShTaVNfUHIpOwogICAgICAgIFNpU19TZW5kQUNLKFNpU19QciwgMSk7CiAgICAgICAgdGVtcCAmPSBtYXNrOwogICAgICAgIGlmKHRlbXAgPT0gdmFsdWUpIHJldCA9IDA7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgcmV0ID0gMHhGRkZGOworI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgICAgICAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJQcm9iZTogUmVhZCAyIGZhaWxlZFxuIik7CiAjZW5kaWYKKyNlbmRpZgogICAgICAgICAgIGlmKFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID09IDB4YTApIHsKICAgICAgICAgICAgICBpZih0ZW1wID09IDB4MzApIHJldCA9IDA7CiAgICAgICAgICAgfQogICAgICAgIH0KICAgICB9CiAgICAgU2lTX1NldFN0b3AoU2lTX1ByKTsKLSAgICByZXR1cm4ocmV0KTsKKyAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgVVNIT1JUCi1TaVNfUHJvYmVEREMoU2lTX1ByaXZhdGUgKlNpU19QcikKKyNpZm5kZWYgU0lTX1hPUkdfWEY4Ngorc3RhdGljCisjZW5kaWYKK3Vuc2lnbmVkIHNob3J0CitTaVNfUHJvYmVEREMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICBVU0hPUlQgZmxhZzsKKyAgIHVuc2lnbmVkIHNob3J0IGZsYWc7CiAKICAgIGZsYWcgPSAweDE4MDsKICAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhhMDsKQEAgLTk1NjAsMTYgKzkzNjYsMTkgQEAKICAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhhNjsKICAgIGlmKCEoU2lTX0RvUHJvYmVEREMoU2lTX1ByKSkpIGZsYWcgfD0gMHgxMDsKICAgIGlmKCEoZmxhZyAmIDB4MWEpKSBmbGFnID0gMDsKLSAgIHJldHVybihmbGFnKTsKKyAgIHJldHVybiBmbGFnOwogfQogCi1zdGF0aWMgVVNIT1JUCi1TaVNfUmVhZEREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgRERDZGF0YXR5cGUsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKKyNpZm5kZWYgU0lTX1hPUkdfWEY4Ngorc3RhdGljCisjZW5kaWYKK3Vuc2lnbmVkIHNob3J0CitTaVNfUmVhZEREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgRERDZGF0YXR5cGUsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKIHsKLSAgIFVTSE9SVCBmbGFnLCBsZW5ndGgsIGk7CisgICB1bnNpZ25lZCBzaG9ydCBmbGFnLCBsZW5ndGgsIGk7CiAgICB1bnNpZ25lZCBjaGFyIGNoa3N1bSxnb3RjaGE7CiAKLSAgIGlmKEREQ2RhdGF0eXBlID4gNCkgcmV0dXJuIDB4RkZGRjsgIAorICAgaWYoRERDZGF0YXR5cGUgPiA0KSByZXR1cm4gMHhGRkZGOwogCiAgICBmbGFnID0gMDsKICAgIFNpU19TZXRTd2l0Y2hEREMyKFNpU19Qcik7CkBAIC05NTc5LDIxICs5Mzg4LDIxIEBACiAgICAgICBjaGtzdW0gPSAwOwogICAgICAgZ290Y2hhID0gMDsKICAgICAgIGZvcihpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLSAgICAgICAgIGJ1ZmZlcltpXSA9ICh1bnNpZ25lZCBjaGFyKVNpU19SZWFkRERDMkRhdGEoU2lTX1ByLCAwKTsKKwkgYnVmZmVyW2ldID0gKHVuc2lnbmVkIGNoYXIpU2lTX1JlYWREREMyRGF0YShTaVNfUHIpOwogCSBjaGtzdW0gKz0gYnVmZmVyW2ldOwogCSBnb3RjaGEgfD0gYnVmZmVyW2ldOwogCSBTaVNfU2VuZEFDSyhTaVNfUHIsIDApOwogICAgICAgfQotICAgICAgYnVmZmVyW2ldID0gKHVuc2lnbmVkIGNoYXIpU2lTX1JlYWREREMyRGF0YShTaVNfUHIsIDApOworICAgICAgYnVmZmVyW2ldID0gKHVuc2lnbmVkIGNoYXIpU2lTX1JlYWREREMyRGF0YShTaVNfUHIpOwogICAgICAgY2hrc3VtICs9IGJ1ZmZlcltpXTsKICAgICAgIFNpU19TZW5kQUNLKFNpU19QciwgMSk7Ci0gICAgICBpZihnb3RjaGEpIGZsYWcgPSAoVVNIT1JUKWNoa3N1bTsKKyAgICAgIGlmKGdvdGNoYSkgZmxhZyA9ICh1bnNpZ25lZCBzaG9ydCljaGtzdW07CiAgICAgICBlbHNlIGZsYWcgPSAweEZGRkY7CiAgICB9IGVsc2UgewogICAgICAgZmxhZyA9IDB4RkZGRjsKICAgIH0KICAgIFNpU19TZXRTdG9wKFNpU19Qcik7Ci0gICByZXR1cm4oZmxhZyk7CisgICByZXR1cm4gZmxhZzsKIH0KIAogLyogT3VyIHByaXZhdGUgRERDIGZ1bmN0aW9ucwpAQCAtOTYxNywxNyArOTQyNiwyNSBAQAogICAgICAgIGlmIEREQ2RhdGF0eXBlID0gMDogIFJldHVybnMgc3VwcG9ydGVkIEREQyBtb2RlcwogCiAgKi8KLVVTSE9SVAotU2lTX0hhbmRsZUREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBsb25nIFZCRmxhZ3MsIGludCBWR0FFbmdpbmUsCi0gICAgICAgICAgICAgIFVTSE9SVCBhZGFwdG51bSwgVVNIT1JUIEREQ2RhdGF0eXBlLCB1bnNpZ25lZCBjaGFyICpidWZmZXIpCit1bnNpZ25lZCBzaG9ydAorU2lTX0hhbmRsZUREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgaW50IFZCRmxhZ3MsIGludCBWR0FFbmdpbmUsCisgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGFkYXB0bnVtLCB1bnNpZ25lZCBzaG9ydCBERENkYXRhdHlwZSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorCSAgICAgIHVuc2lnbmVkIGludCBWQkZsYWdzMikKIHsKLSAgIHVuc2lnbmVkIGNoYXIgc3IxZixjcjE3PTE7Ci0gICBVU0hPUlQgcmVzdWx0OworICAgdW5zaWduZWQgY2hhciAgc3IxZiwgY3IxNz0xOworICAgdW5zaWduZWQgc2hvcnQgcmVzdWx0OwogCi0gICBpZihhZGFwdG51bSA+IDIpIHJldHVybiAweEZGRkY7Ci0gICBpZihERENkYXRhdHlwZSA+IDQpIHJldHVybiAweEZGRkY7Ci0gICBpZigoIShWQkZsYWdzICYgVkJfVklERU9CUklER0UpKSAmJiAoYWRhcHRudW0gPiAwKSkgcmV0dXJuIDB4RkZGRjsKLSAgIGlmKFNpU19Jbml0RERDUmVncyhTaVNfUHIsIFZCRmxhZ3MsIFZHQUVuZ2luZSwgYWRhcHRudW0sIEREQ2RhdGF0eXBlLCBGQUxTRSkgPT0gMHhGRkZGKSByZXR1cm4gMHhGRkZGOworICAgaWYoYWRhcHRudW0gPiAyKQorICAgICAgcmV0dXJuIDB4RkZGRjsKKworICAgaWYoRERDZGF0YXR5cGUgPiA0KQorICAgICAgcmV0dXJuIDB4RkZGRjsKKworICAgaWYoKCEoVkJGbGFnczIgJiBWQjJfVklERU9CUklER0UpKSAmJiAoYWRhcHRudW0gPiAwKSkKKyAgICAgIHJldHVybiAweEZGRkY7CisKKyAgIGlmKFNpU19Jbml0RERDUmVncyhTaVNfUHIsIFZCRmxhZ3MsIFZHQUVuZ2luZSwgYWRhcHRudW0sIEREQ2RhdGF0eXBlLCBGQUxTRSwgVkJGbGFnczIpID09IDB4RkZGRikKKyAgICAgIHJldHVybiAweEZGRkY7CiAKICAgIHNyMWYgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxZik7CiAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDFmLDB4M2YsMHgwNCk7CkBAIC05NjU2LDEwICs5NDczLDEyIEBACiAJICAgIChidWZmZXJbNF0gPT0gMHhmZikgJiYgKGJ1ZmZlcls1XSA9PSAweGZmKSAmJgogCSAgICAoYnVmZmVyWzZdID09IDB4ZmYpICYmIChidWZmZXJbN10gPT0gMHgwMCkgJiYKIAkgICAgKGJ1ZmZlclsweDEyXSA9PSAxKSkgewotCSAgICBpZihhZGFwdG51bSA9PSAxKSB7Ci0JICAgICAgIGlmKCEoYnVmZmVyWzB4MTRdICYgMHg4MCkpIHJlc3VsdCA9IDB4RkZGRTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgaWYoYnVmZmVyWzB4MTRdICYgMHg4MCkgICAgcmVzdWx0ID0gMHhGRkZFOworCSAgICBpZighU2lTX1ByLT5ERENQb3J0TWl4dXApIHsKKwkgICAgICAgaWYoYWRhcHRudW0gPT0gMSkgeworCSAgICAgICAgICBpZighKGJ1ZmZlclsweDE0XSAmIDB4ODApKSByZXN1bHQgPSAweEZGRkU7CisJICAgICAgIH0gZWxzZSB7CisJICAgICAgICAgIGlmKGJ1ZmZlclsweDE0XSAmIDB4ODApICAgIHJlc3VsdCA9IDB4RkZGRTsKKwkgICAgICAgfQogCSAgICB9CiAJIH0KICAgICAgIH0KQEAgLTk2NzEsODMyICs5NDkwLDEwIEBACiAgICByZXR1cm4gcmVzdWx0OwogfQogCi0jaWZkZWYgTElOVVhfWEY4NgotCi1zdGF0aWMgQk9PTEVBTgotY2hlY2tlZGlkMSh1bnNpZ25lZCBjaGFyICpidWZmZXIpCi17Ci0gICAvKiBDaGVjayBoZWFkZXIgKi8KLSAgIGlmKChidWZmZXJbMF0gIT0gMHgwMCkgfHwKLSAgICAgIChidWZmZXJbMV0gIT0gMHhmZikgfHwKLSAgICAgIChidWZmZXJbMl0gIT0gMHhmZikgfHwKLSAgICAgIChidWZmZXJbM10gIT0gMHhmZikgfHwKLSAgICAgIChidWZmZXJbNF0gIT0gMHhmZikgfHwKLSAgICAgIChidWZmZXJbNV0gIT0gMHhmZikgfHwKLSAgICAgIChidWZmZXJbNl0gIT0gMHhmZikgfHwKLSAgICAgIChidWZmZXJbN10gIT0gMHgwMCkpCi0gICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgIC8qIENoZWNrIEVESUQgdmVyc2lvbiBhbmQgcmV2aXNpb24gKi8KLSAgIGlmKChidWZmZXJbMHgxMl0gIT0gMSkgfHwgKGJ1ZmZlclsweDEzXSA+IDQpKSByZXR1cm4gRkFMU0U7Ci0KLSAgIC8qIENoZWNrIHdlZWsgb2YgbWFudWZhY3R1cmUgZm9yIHNhbml0eSAqLwotICAgaWYoYnVmZmVyWzB4MTBdID4gNTMpIHJldHVybiBGQUxTRTsKLQotICAgLyogQ2hlY2sgeWVhciBvZiBtYW51ZmFjdHVyZSBmb3Igc2FuaXR5ICovCi0gICBpZihidWZmZXJbMHgxMV0gPiA0MCkgcmV0dXJuIEZBTFNFOwotCi0gICByZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljIEJPT0xFQU4KLWNoZWNrZWRpZDIodW5zaWduZWQgY2hhciAqYnVmZmVyKQotewotICAgVVNIT1JUIHllYXIgPSBidWZmZXJbNl0gfCAoYnVmZmVyWzddIDw8IDgpOwotCi0gICAvKiBDaGVjayBFRElEIHZlcnNpb24gKi8KLSAgIGlmKChidWZmZXJbMF0gJiAweGYwKSAhPSAweDIwKSByZXR1cm4gRkFMU0U7Ci0KLSAgIC8qIENoZWNrIHdlZWsgb2YgbWFudWZhY3R1cmUgZm9yIHNhbml0eSAqLwotICAgaWYoYnVmZmVyWzVdID4gNTMpIHJldHVybiBGQUxTRTsKLQotICAgLyogQ2hlY2sgeWVhciBvZiBtYW51ZmFjdHVyZSBmb3Igc2FuaXR5ICovCi0gICBpZigoeWVhciAhPSAwKSAmJiAoKHllYXIgPCAxOTkwKSB8fCAoeWVhciA+IDIwMzApKSkgcmV0dXJuIEZBTFNFOwotCi0gICByZXR1cm4gVFJVRTsKLX0KLQotLyogU2Vuc2UgdGhlIExDRCBwYXJhbWV0ZXJzIChDUjM2LCBDUjM3KSB2aWEgRERDICovCi0vKiBTaVMzMHgoQikgb25seSAqLwotVVNIT1JUCi1TaVNfU2Vuc2VMQ0REREMoU2lTX1ByaXZhdGUgKlNpU19QciwgU0lTUHRyIHBTaVMpCi17Ci0gICBVU0hPUlQgRERDZGF0YXR5cGUsIHBhbmVsdHlwZSwgZmxhZywgeHJlcz0wLCB5cmVzPTA7Ci0gICBVU0hPUlQgaW5kZXgsIG15aW5kZXgsIGx1bXNpemUsIG51bWNvZGVzLCBwYW5lbHZlbmRvciwgcGFuZWxwcm9kdWN0OwotICAgaW50IG1heHg9MCwgbWF4eT0wLCBwcmVmeD0wLCBwcmVmeT0wOwotICAgdW5zaWduZWQgY2hhciBjcjM3PTAsIHNlZWtjb2RlOwotICAgQk9PTEVBTiBjaGVja2V4cGFuZCA9IEZBTFNFOwotICAgQk9PTEVBTiBoYXZlc3luYyA9IEZBTFNFOwotICAgQk9PTEVBTiBpbmRiID0gRkFMU0U7Ci0gICBpbnQgcmV0cnksIGk7Ci0gICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyNTZdOwotCi0gICBmb3IoaT0wOyBpPDc7IGkrKykgU2lTX1ByLT5DUF9EYXRhVmFsaWRbaV0gPSBGQUxTRTsKLSAgIFNpU19Qci0+Q1BfSGF2ZUN1c3RvbURhdGEgPSBGQUxTRTsKLSAgIFNpU19Qci0+Q1BfTWF4WCA9IFNpU19Qci0+Q1BfTWF4WSA9IFNpU19Qci0+Q1BfTWF4Q2xvY2sgPSAwOwotICAgU2lTX1ByLT5DUF9QcmVmZXJyZWRYID0gU2lTX1ByLT5DUF9QcmVmZXJyZWRZID0gMDsKLSAgIFNpU19Qci0+Q1BfUHJlZmVycmVkSW5kZXggPSAtMTsKLSAgIFNpU19Qci0+Q1BfUHJlZkNsb2NrID0gMDsKLSAgIFNpU19Qci0+UGFuZWxTZWxmRGV0ZWN0ZWQgPSBGQUxTRTsKLQotICAgaWYoIShwU2lTLT5WQkZsYWdzICYgKFZCXzMwMXxWQl8zMDFCfFZCXzMwMUN8VkJfMzAyQikpKSByZXR1cm4gMDsKLSAgIGlmKHBTaVMtPlZCRmxhZ3MgJiBWQl8zMHhCREgpIHJldHVybiAwOwotICAKLSAgIGlmKFNpU19Jbml0RERDUmVncyhTaVNfUHIsIHBTaVMtPlZCRmxhZ3MsIHBTaVMtPlZHQUVuZ2luZSwgMSwgMCwgRkFMU0UpID09IDB4RkZGRikgcmV0dXJuIDA7Ci0gICAKLSAgIFNpU19Qci0+U2lTX0REQ19TZWNBZGRyID0gMHgwMDsKLSAgIAotICAgLyogUHJvYmUgc3VwcG9ydGVkIERBJ3MgKi8KLSAgIGZsYWcgPSBTaVNfUHJvYmVEREMoU2lTX1ByKTsKLSNpZmRlZiBUV0RFQlVHCi0gICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywKLSAgIAkiQ1JUMiBEREMgY2FwYWJpbGl0aWVzIDB4JXhcbiIsIGZsYWcpOwotI2VuZGlmCQotICAgaWYoZmxhZyAmIDB4MTApIHsKLSAgICAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhhNjsJLyogRURJRCBWMiAoRlApICovCi0gICAgICBERENkYXRhdHlwZSA9IDQ7Ci0gICB9IGVsc2UgaWYoZmxhZyAmIDB4MDgpIHsKLSAgICAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhhMjsJLyogRURJRCBWMiAoUCZELUQgTW9uaXRvcikgKi8KLSAgICAgIEREQ2RhdGF0eXBlID0gMzsKLSAgIH0gZWxzZSBpZihmbGFnICYgMHgwMikgewotICAgICAgU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHIgPSAweGEwOwkvKiBFRElEIFYxICovCi0gICAgICBERENkYXRhdHlwZSA9IDE7Ci0gICB9IGVsc2UgcmV0dXJuIDA7CQkJCS8qIG5vIEREQyBzdXBwb3J0IChvciBubyBkZXZpY2UgYXR0YWNoZWQpICovCi0gICAKLSAgIC8qIFJlYWQgdGhlIGVudGlyZSBFRElEICovCi0gICByZXRyeSA9IDI7Ci0gICBkbyB7Ci0gICAgICBpZihTaVNfUmVhZEREQyhTaVNfUHIsIEREQ2RhdGF0eXBlLCBidWZmZXIpKSB7Ci0gICAgICAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfUFJPQkVELAotCSAJIkNSVDI6IEREQyByZWFkIGZhaWxlZCAoYXR0ZW1wdCAlZCksICVzXG4iLAotCQkoMy1yZXRyeSksIChyZXRyeSA9PSAxKSA/ICJnaXZpbmcgdXAiIDogInJldHJ5aW5nIik7Ci0JIHJldHJ5LS07Ci0JIGlmKHJldHJ5ID09IDApIHJldHVybiAweEZGRkY7Ci0gICAgICB9IGVsc2UgYnJlYWs7Ci0gICB9IHdoaWxlKDEpOwotCi0jaWZkZWYgVFdERUJVRwotICAgZm9yKGk9MDsgaTwyNTY7IGkrPTE2KSB7Ci0gICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLSAgICAgICAJIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0JYnVmZmVyW2ldLCAgICBidWZmZXJbaSsxXSwgYnVmZmVyW2krMl0sIGJ1ZmZlcltpKzNdLAotCWJ1ZmZlcltpKzRdLCAgYnVmZmVyW2krNV0sIGJ1ZmZlcltpKzZdLCBidWZmZXJbaSs3XSwKLQlidWZmZXJbaSs4XSwgIGJ1ZmZlcltpKzldLCBidWZmZXJbaSsxMF0sIGJ1ZmZlcltpKzExXSwKLQlidWZmZXJbaSsxMl0sIGJ1ZmZlcltpKzEzXSwgYnVmZmVyW2krMTRdLCBidWZmZXJbaSsxNV0pOwotICAgfQotI2VuZGlmICAgCi0gICAKLSAgIC8qIEFuYWx5emUgRURJRCBhbmQgcmV0cmlldmUgTENEIHBhbmVsIGluZm9ybWF0aW9uICovCi0gICBwYW5lbHR5cGUgPSAwOwotICAgc3dpdGNoKEREQ2RhdGF0eXBlKSB7Ci0gICBjYXNlIDE6CQkJCQkJCS8qIEFuYWx5emUgRURJRCBWMSAqLwotICAgICAgLyogQ2F0Y2ggYSBmZXcgY2xlYXIgY2FzZXM6ICovCi0gICAgICBpZighKGNoZWNrZWRpZDEoYnVmZmVyKSkpIHsKLSAgICAgICAgIHhmODZEcnZNc2cocFNpUy0+cFNjcm4tPnNjcm5JbmRleCwgWF9QUk9CRUQsCi0JIAkiTENEIHNlbnNlOiBFRElEIGNvcnJ1cHRcbiIpOwotCSByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgaWYoIShidWZmZXJbMHgxNF0gJiAweDgwKSkgewotICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLQkgICAgICAgICJMQ0Qgc2Vuc2U6IEF0dGFjaGVkIGRpc3BsYXkgZXhwZWN0cyBhbmFsb2cgaW5wdXQgKDB4JTAyeClcbiIsCi0JCWJ1ZmZlclsweDE0XSk7Ci0gICAgICAJIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICBpZigoYnVmZmVyWzB4MThdICYgMHgxOCkgIT0gMHgwOCkgewotICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLQkgCSJMQ0Qgc2Vuc2U6IFdhcm5pbmc6IEF0dGFjaGVkIGRpc3BsYXkgaXMgbm90IG9mIFJHQiBidXQgb2YgJXMgdHlwZSAoMHglMDJ4KVxuIiwKLQkJKChidWZmZXJbMHgxOF0gJiAweDE4KSA9PSAweDAwKSA/ICJtb25vY2hyb21lL2dyZXlzY2FsZSIgOgotCQkgICggKChidWZmZXJbMHgxOF0gJiAweDE4KSA9PSAweDEwKSA/ICJub24tUkdCIG11bHRpY29sb3IiIDoKLQkJICAgICAidW5kZWZpbmVkIiksCi0JCWJ1ZmZlclsweDE4XSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIE5vdyBhbmFseXplIHRoZSBmaXJzdCBEZXRhaWxlZCBUaW1pbmcgQmxvY2sgYW5kIHNlZQotICAgICAgICogaWYgdGhlIHByZWZlcnJlZCB0aW1pbmcgbW9kZSBpcyBzdG9yZWQgdGhlcmUuIElmIHNvLAotICAgICAgICogY2hlY2sgaWYgdGhpcyBpcyBhIHN0YW5kYXJkIHBhbmVsIGZvciB3aGljaCB3ZSBhbHJlYWR5Ci0gICAgICAgKiBrbm93IHRoZSB0aW1pbmcuCi0gICAgICAgKi8KLQotICAgICAgcGFuZWx0eXBlID0gUGFuZWxfQ3VzdG9tOwotICAgICAgY2hlY2tleHBhbmQgPSBGQUxTRTsKLQotICAgICAgcGFuZWx2ZW5kb3IgPSBidWZmZXJbOV0gfCAoYnVmZmVyWzhdIDw8IDgpOwotICAgICAgcGFuZWxwcm9kdWN0ID0gYnVmZmVyWzEwXSB8IChidWZmZXJbMTFdIDw8IDgpOwotCi0gICAgICAvKiBPdmVycnVsZSBib2d1cyBwcmVmZXJyZWQgbW9kZXMgZnJvbSBkYXRhYmFzZSAqLwotICAgICAgaWYoKGluZGIgPSBTaVNfRmluZFBhbmVsRnJvbURCKHBTaVMsIHBhbmVsdmVuZG9yLCBwYW5lbHByb2R1Y3QsICZtYXh4LCAmbWF4eSwgJnByZWZ4LCAmcHJlZnkpKSkgewotICAgICAgICAgaWYocHJlZngpIFNpU19Qci0+Q1BfUHJlZmVycmVkWCA9IHhyZXMgPSBwcmVmeDsKLQkgaWYocHJlZnkpIFNpU19Qci0+Q1BfUHJlZmVycmVkWSA9IHlyZXMgPSBwcmVmeTsKLSAgICAgIH0KLQotICAgICAgaWYoYnVmZmVyWzB4MThdICYgMHgwMikgewotCi0gICAgICAgICBVU0hPUlQgcGNsayA9IChidWZmZXJbMHgzNl0gfCAoYnVmZmVyWzB4MzddIDw8IDgpKTsKLQkgVVNIT1JUIHBoYiAgPSAoYnVmZmVyWzB4MzldIHwgKChidWZmZXJbMHgzYV0gJiAweDBmKSA8PCA4KSk7Ci0JIFVTSE9SVCBwdmIgID0gKGJ1ZmZlclsweDNjXSB8ICgoYnVmZmVyWzB4M2RdICYgMHgwZikgPDwgOCkpOwotCi0JIGlmKCF4cmVzKSBTaVNfUHItPkNQX1ByZWZlcnJlZFggPSB4cmVzID0gYnVmZmVyWzB4MzhdIHwgKChidWZmZXJbMHgzYV0gJiAweGYwKSA8PCA0KTsKLSAgICAgICAgIGlmKCF5cmVzKSBTaVNfUHItPkNQX1ByZWZlcnJlZFkgPSB5cmVzID0gYnVmZmVyWzB4M2JdIHwgKChidWZmZXJbMHgzZF0gJiAweGYwKSA8PCA0KTsKLQotICAgICAgICAgc3dpdGNoKHhyZXMpIHsKLSNpZiAwCSAgICAvKiBUcmVhdCBhcyBjdXN0b20gKi8KLSAgICAgICAgICAgIGNhc2UgODAwOgotCSAgICAgICAgaWYoeXJlcyA9PSA2MDApIHsKLQkgICAgIAkgICBwYW5lbHR5cGUgPSBQYW5lbF84MDB4NjAwOwotCSAgICAgCSAgIGNoZWNrZXhwYW5kID0gVFJVRTsKLQkgICAgICAgIH0KLQkgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICBjYXNlIDEwMjQ6Ci0JICAgICAgICBpZih5cmVzID09IDc2OCkgewotCSAgICAgCSAgIHBhbmVsdHlwZSA9IFBhbmVsXzEwMjR4NzY4OwotCSAgICAgCSAgIGNoZWNrZXhwYW5kID0gVFJVRTsKLQkgICAgICAgIH0KLQkgICAgICAgIGJyZWFrOwotCSAgICBjYXNlIDEyODA6Ci0JICAgICAgICBpZih5cmVzID09IDEwMjQpIHsKLQkgICAgIAkgICBwYW5lbHR5cGUgPSBQYW5lbF8xMjgweDEwMjQ7Ci0JCSAgIGNoZWNrZXhwYW5kID0gVFJVRTsKLQkgICAgICAgIH0gZWxzZSBpZih5cmVzID09IDk2MCkgewotCSAgICAgICAgICAgaWYocFNpUy0+VkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JCSAgICAgIHBhbmVsdHlwZSA9IFBhbmVsMzAwXzEyODB4OTYwOwotCQkgICB9IGVsc2UgewotCQkgICAgICBwYW5lbHR5cGUgPSBQYW5lbDMxMF8xMjgweDk2MDsKLQkJICAgfQotCSAgICAgICAgfSBlbHNlIGlmKHlyZXMgPT0gNzY4KSB7Ci0JCSAgIGlmKCAocGNsayA9PSA4MTAwKSAmJgotCQkgICAgICAgKHBoYiA9PSAoMTY4OCAtIDEyODApKSAmJgotCQkgICAgICAgKHB2YiA9PSAoODAyIC0gNzY4KSkgKSB7Ci0JICAgICAgIAkgICAgICBwYW5lbHR5cGUgPSBQYW5lbF8xMjgweDc2ODsKLQkJICAgICAgY2hlY2tleHBhbmQgPSBGQUxTRTsKLQkJICAgICAgY3IzNyB8PSAweDEwOwotCQkgICB9Ci0JICAgICAgICB9IGVsc2UgaWYoeXJlcyA9PSA4MDApIHsKLQkJICAgaWYoIChwY2xrID09IDY5MDApICYmCi0JCSAgICAgICAocGhiID09ICgxNDA4IC0gMTI4MCkpICYmCi0JCSAgICAgICAocHZiID09ICg4MTYgLSA4MDApKSApIHsKLQkgICAgICAgCSAgICAgIHBhbmVsdHlwZSA9IFBhbmVsXzEyODB4ODAwOwotCQkgICB9Ci0JCX0KLQkgICAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE0MDA6Ci0JICAgICAgICBpZihwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgICAgIGlmKHlyZXMgPT0gMTA1MCkgewotCSAgICAgICAgICAgICAgcGFuZWx0eXBlID0gUGFuZWwzMTBfMTQwMHgxMDUwOwotCQkgICAgICBjaGVja2V4cGFuZCA9IFRSVUU7Ci0JICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAJICAgICAgICBicmVhazsKLQkgICAgY2FzZSAxNjAwOgotCSAgICAgICAgaWYocFNpUy0+VkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JCSAgIGlmKHBTaVMtPlZCRmxhZ3MgJiBWQl8zMDFDKSB7Ci0JICAgICAgICAgICAgICBpZih5cmVzID09IDEyMDApIHsKLQkgICAgICAgICAgICAgICAgIHBhbmVsdHlwZSA9IFBhbmVsMzEwXzE2MDB4MTIwMDsKLQkJICAgICAgICAgY2hlY2tleHBhbmQgPSBUUlVFOwotCQkgICAgICB9Ci0JICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAJICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotCSAvKiBTYXZlIHN5bmM6IFRoaXMgaXMgdXNlZCBpZiAiUGFzcyAxOjEiIGlzIG9mZjsgaW4gdGhpcyBjYXNlCi0JICAqIHdlIGFsd2F5cyB1c2UgdGhlIHBhbmVsJ3MgbmF0aXZlIG1vZGUgPSB0aGlzICJwcmVmZXJyZWQgbW9kZSIKLQkgICogd2UganVzdCBoYXZlIGJlZW4gYW5hbHlzaW5nLiBIZW5jZSwgd2UgYWxzbyBuZWVkIGl0cyBzeW5jLgotCSAgKi8KLQkgaWYoKGJ1ZmZlclsweDQ3XSAmIDB4MTgpID09IDB4MTgpIHsKLQkgICAgY3IzNyB8PSAoKCgoYnVmZmVyWzB4NDddICYgMHgwNikgXiAweDA2KSA8PCA1KSB8IDB4MjApOwotCSAgICBoYXZlc3luYyA9IFRSVUU7Ci0JIH0gZWxzZSB7Ci0JICAgIC8qIFdoYXQgbm93PyBUaGVyZSBpcyBubyBkaWdpdGFsIHNlcGFyYXRlIG91dHB1dCB0aW1pbmcuLi4gKi8KLQkgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1dBUk5JTkcsCi0JICAgICAgIAkgICAiTENEIHNlbnNlOiBVbmFibGUgdG8gcmV0cmlldmUgU3luYyBwb2xhcml0eSBpbmZvcm1hdGlvblxuIik7Ci0JICAgIGNyMzcgfD0gMHhjMDsgIC8qIERlZmF1bHQgKi8KLQkgfQotCi0gICAgICB9Ci0KLSAgICAgIC8qIENoZWNrIGFnYWluc3Qgb3VyIGRhdGFiYXNlOyBlZy4gU2FueW8gWjIgcHJvamVjdG9yIHJlcG9ydHMKLSAgICAgICAqIDEwMjR4NzY4IGFzIHByZWZlcnJlZCBtb2RlLCBhbHRob3VnaCBpdCBzdXBwb3J0cyAxMjgweDcyMAotICAgICAgICogbmF0aXZlbHkgaW4gbm9uLUhEQ1AgbW9kZS4gVHJlYXQgc3VjaCB3cm9uZ2x5IHJlcG9ydGluZwotICAgICAgICogcGFuZWxzIGFzIGN1c3RvbSBhbmQgZml4dXAgYWN0dWFsIG1heGltdW0gcmVzb2x1dGlvbnMuCi0gICAgICAgKi8KLSAgICAgIGlmKHBhbmVsdHlwZSAhPSBQYW5lbF9DdXN0b20pIHsKLSAgICAgICAgIGlmKGluZGIpIHsKLQkgICAgcGFuZWx0eXBlID0gUGFuZWxfQ3VzdG9tOwotCSAgICBTaVNfUHItPkNQX01heFggPSBtYXh4OwotCSAgICBTaVNfUHItPkNQX01heFkgPSBtYXh5OwotCSAgICAvKiBMZWF2ZSBwcmVmZXJyZWQgdW5jaGFuZ2VkIChNVVNUIGNvbnRhaW4gYSB2YWxpZCBtb2RlISkgKi8KLQkgfQotICAgICAgfQotCi0gICAgICAvKiBJZiB3ZSBzdGlsbCBkb24ndCBrbm93IHdoYXQgcGFuZWwgdGhpcyBpcywgd2UgdGFrZSBpdAotICAgICAgICogYXMgYSBjdXN0b20gcGFuZWwgYW5kIGRlcml2ZSB0aGUgdGltaW5nIGRhdGEgZnJvbSB0aGUKLSAgICAgICAqIGRldGFpbGVkIHRpbWluZyBibG9ja3MKLSAgICAgICAqLwotICAgICAgaWYocGFuZWx0eXBlID09IFBhbmVsX0N1c3RvbSkgewotCi0JIGludCBpLCB0ZW1wLCBiYXNlID0gMHgzNjsKLQkgdW5zaWduZWQgbG9uZyBlc3RwYWNrOwotCSBjb25zdCB1bnNpZ25lZCBzaG9ydCBlc3R4W10gPSB7Ci0JIAk3MjAsIDcyMCwgNjQwLCA2NDAsIDY0MCwgNjQwLCA4MDAsIDgwMCwKLQkJODAwLCA4MDAsIDgzMiwxMDI0LDEwMjQsMTAyNCwxMDI0LDEyODAsCi0JCTExNTIKLQkgfTsKLQkgY29uc3QgdW5zaWduZWQgc2hvcnQgZXN0eVtdID0gewotCSAJNDAwLCA0MDAsIDQ4MCwgNDgwLCA0ODAsIDQ4MCwgNjAwLCA2MDAsCi0JCTYwMCwgNjAwLCA2MjQsIDc2OCwgNzY4LCA3NjgsIDc2OCwxMDI0LAotCQk4NzAKLQkgfTsKLQkgY29uc3QgaW50IGVzdGNsa1tdID0gewotCSAgICAgICAgICAgIDAsICAgICAwLCAyNTEwMCwgICAwLCAzMTUwMCwgMzE1MDAsIDM2MTAwLCA0MDAwMCwKLQkJNTAxMDAsIDQ5NTAwLCAgICAgMCwgICAwLCA2NTEwMCwgNzUyMDAsIDc4NzAwLDEzNTIwMCwKLQkJMAotCSB9OwotCi0JIHBhbmVsdHlwZSA9IDA7Ci0JIFNpU19Qci0+Q1BfU3VwcG9ydHM2NDA0ODA3NSA9IFRSVUU7Ci0KLQkgLyogRmluZCB0aGUgbWF4aW11bSByZXNvbHV0aW9uICovCi0KLQkgLyogMS4gRnJvbSBFc3RhYmxpc2hlZCB0aW1pbmdzICovCi0JIGVzdHBhY2sgPSAoYnVmZmVyWzB4MjNdIDw8IDkpIHwgKGJ1ZmZlclsweDI0XSA8PCAxKSB8ICgoYnVmZmVyWzB4MjVdID4+IDcpICYgMHgwMSk7Ci0JIGZvcihpPTE2OyBpPj0wOyBpLS0pIHsKLQkgICAgIGlmKGVzdHBhY2sgJiAoMSA8PCBpKSkgewotCSAgICAgICAgaWYoZXN0eFsxNiAtIGldID4gU2lTX1ByLT5DUF9NYXhYKSBTaVNfUHItPkNQX01heFggPSBlc3R4WzE2IC0gaV07Ci0JCWlmKGVzdHlbMTYgLSBpXSA+IFNpU19Qci0+Q1BfTWF4WSkgU2lTX1ByLT5DUF9NYXhZID0gZXN0eVsxNiAtIGldOwotCQlpZihlc3RjbGtbMTYgLSBpXSA+IFNpU19Qci0+Q1BfTWF4Q2xvY2spIFNpU19Qci0+Q1BfTWF4Q2xvY2sgPSBlc3RjbGtbMTYgLSBpXTsKLQkgICAgIH0KLQkgfQotCi0JIC8qIEJ5IGRlZmF1bHQgd2UgZHJpdmUgdGhlIExDRCBhdCA3NUh6IGluIDY0MHg0ODAgbW9kZTsgaWYKLSAgCSAgKiB0aGUgcGFuZWwgZG9lcyBub3QgcHJvdmlkZSB0aGlzIG1vZGUsIHVzZSA2MGh6Ci0JICAqLwotCSBpZighKGJ1ZmZlclsweDIzXSAmIDB4MDQpKSBTaVNfUHItPkNQX1N1cHBvcnRzNjQwNDgwNzUgPSBGQUxTRTsKLQotCSAvKiAyLiBGcm9tIFN0YW5kYXJkIFRpbWluZ3MgKi8KLQkgZm9yKGk9MHgyNjsgaSA8IDB4MzY7IGkrPTIpIHsKLQkgICAgaWYoKGJ1ZmZlcltpXSAhPSAweDAxKSAmJiAoYnVmZmVyW2krMV0gIT0gMHgwMSkpIHsKLQkgICAgICAgdGVtcCA9IChidWZmZXJbaV0gKyAzMSkgKiA4OwotCSAgICAgICBpZih0ZW1wID4gU2lTX1ByLT5DUF9NYXhYKSBTaVNfUHItPkNQX01heFggPSB0ZW1wOwotCSAgICAgICBzd2l0Y2goKGJ1ZmZlcltpKzFdICYgMHhjMCkgPj4gNikgewotCSAgICAgICBjYXNlIDB4MDM6IHRlbXAgPSB0ZW1wICogOSAvIDE2OyBicmVhazsKLQkgICAgICAgY2FzZSAweDAyOiB0ZW1wID0gdGVtcCAqIDQgLyA1OyAgYnJlYWs7Ci0JICAgICAgIGNhc2UgMHgwMTogdGVtcCA9IHRlbXAgKiAzIC8gNDsgIGJyZWFrOwotCSAgICAgICB9Ci0JICAgICAgIGlmKHRlbXAgPiBTaVNfUHItPkNQX01heFkpIFNpU19Qci0+Q1BfTWF4WSA9IHRlbXA7Ci0JICAgIH0KLQkgfQotCi0JIC8qIE5vdyBleHRyYWN0IHRoZSBEZXRhaWxlZCBUaW1pbmdzIGFuZCBjb252ZXJ0IHRoZW0gaW50byBtb2RlcyAqLwotCi0gICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyssIGJhc2UgKz0gMTgpIHsKLQotCSAgICAvKiBJcyB0aGlzIGEgZGV0YWlsZWQgdGltaW5nIGJsb2NrIG9yIGEgbW9uaXRvciBkZXNjcmlwdG9yPyAqLwotCSAgICBpZihidWZmZXJbYmFzZV0gfHwgYnVmZmVyW2Jhc2UrMV0gfHwgYnVmZmVyW2Jhc2UrMl0pIHsKLQotICAgICAgCSAgICAgICB4cmVzID0gYnVmZmVyW2Jhc2UrMl0gfCAoKGJ1ZmZlcltiYXNlKzRdICYgMHhmMCkgPDwgNCk7Ci0gICAgICAgICAgICAgICB5cmVzID0gYnVmZmVyW2Jhc2UrNV0gfCAoKGJ1ZmZlcltiYXNlKzddICYgMHhmMCkgPDwgNCk7Ci0KLQkgICAgICAgU2lTX1ByLT5DUF9IRGlzcGxheVtpXSA9IHhyZXM7Ci0JICAgICAgIFNpU19Qci0+Q1BfSFN5bmNTdGFydFtpXSA9IHhyZXMgKyAoYnVmZmVyW2Jhc2UrOF0gfCAoKGJ1ZmZlcltiYXNlKzExXSAmIDB4YzApIDw8IDIpKTsKLSAgICAgICAgICAgICAgIFNpU19Qci0+Q1BfSFN5bmNFbmRbaV0gICA9IFNpU19Qci0+Q1BfSFN5bmNTdGFydFtpXSArIChidWZmZXJbYmFzZSs5XSB8ICgoYnVmZmVyW2Jhc2UrMTFdICYgMHgzMCkgPDwgNCkpOwotCSAgICAgICBTaVNfUHItPkNQX0hUb3RhbFtpXSA9IHhyZXMgKyAoYnVmZmVyW2Jhc2UrM10gfCAoKGJ1ZmZlcltiYXNlKzRdICYgMHgwZikgPDwgOCkpOwotCSAgICAgICBTaVNfUHItPkNQX0hCbGFua1N0YXJ0W2ldID0geHJlcyArIDE7Ci0JICAgICAgIFNpU19Qci0+Q1BfSEJsYW5rRW5kW2ldID0gU2lTX1ByLT5DUF9IVG90YWxbaV07Ci0KLQkgICAgICAgU2lTX1ByLT5DUF9WRGlzcGxheVtpXSA9IHlyZXM7Ci0gICAgICAgICAgICAgICBTaVNfUHItPkNQX1ZTeW5jU3RhcnRbaV0gPSB5cmVzICsgKCgoYnVmZmVyW2Jhc2UrMTBdICYgMHhmMCkgPj4gNCkgfCAoKGJ1ZmZlcltiYXNlKzExXSAmIDB4MGMpIDw8IDIpKTsKLSAgICAgICAgICAgICAgIFNpU19Qci0+Q1BfVlN5bmNFbmRbaV0gPSBTaVNfUHItPkNQX1ZTeW5jU3RhcnRbaV0gKyAoKGJ1ZmZlcltiYXNlKzEwXSAmIDB4MGYpIHwgKChidWZmZXJbYmFzZSsxMV0gJiAweDAzKSA8PCA0KSk7Ci0JICAgICAgIFNpU19Qci0+Q1BfVlRvdGFsW2ldID0geXJlcyArIChidWZmZXJbYmFzZSs2XSB8ICgoYnVmZmVyW2Jhc2UrN10gJiAweDBmKSA8PCA4KSk7Ci0JICAgICAgIFNpU19Qci0+Q1BfVkJsYW5rU3RhcnRbaV0gPSB5cmVzICsgMTsKLQkgICAgICAgU2lTX1ByLT5DUF9WQmxhbmtFbmRbaV0gPSBTaVNfUHItPkNQX1ZUb3RhbFtpXTsKLQotCSAgICAgICBTaVNfUHItPkNQX0Nsb2NrW2ldID0gKGJ1ZmZlcltiYXNlXSB8IChidWZmZXJbYmFzZSsxXSA8PCA4KSkgKiAxMDsKLQotCSAgICAgICBTaVNfUHItPkNQX0RhdGFWYWxpZFtpXSA9IFRSVUU7Ci0KLQkgICAgICAgLyogU29ydCBvdXQgaW52YWxpZCB0aW1pbmdzLCBpbnRlcmxhY2UgYW5kIHRvbyBoaWdoIGNsb2NrcyAqLwotCSAgICAgICBpZigoU2lTX1ByLT5DUF9IRGlzcGxheVtpXSAmIDcpCQkJCQkJICB8fAotCSAgICAgICAgICAoU2lTX1ByLT5DUF9IRGlzcGxheVtpXSA+IFNpU19Qci0+Q1BfSFN5bmNTdGFydFtpXSkgIAkJCSAgfHwKLQkgICAgICAgICAgKFNpU19Qci0+Q1BfSERpc3BsYXlbaV0gPj0gU2lTX1ByLT5DUF9IU3luY0VuZFtpXSkgICAJCQkgIHx8Ci0JICAgICAgICAgIChTaVNfUHItPkNQX0hEaXNwbGF5W2ldID49IFNpU19Qci0+Q1BfSFRvdGFsW2ldKSAgICAgCQkJICB8fAotCSAgICAgICAgICAoU2lTX1ByLT5DUF9IU3luY1N0YXJ0W2ldID49IFNpU19Qci0+Q1BfSFN5bmNFbmRbaV0pIAkJCSAgfHwKLQkgICAgICAgICAgKFNpU19Qci0+Q1BfSFN5bmNTdGFydFtpXSA+IFNpU19Qci0+Q1BfSFRvdGFsW2ldKSAgICAJCQkgIHx8Ci0JICAgICAgICAgIChTaVNfUHItPkNQX0hTeW5jRW5kW2ldID4gU2lTX1ByLT5DUF9IVG90YWxbaV0pICAgICAgCQkJICB8fAotCSAgICAgICAgICAoU2lTX1ByLT5DUF9WRGlzcGxheVtpXSA+IFNpU19Qci0+Q1BfVlN5bmNTdGFydFtpXSkgIAkJCSAgfHwKLQkgICAgICAgICAgKFNpU19Qci0+Q1BfVkRpc3BsYXlbaV0gPj0gU2lTX1ByLT5DUF9WU3luY0VuZFtpXSkgICAJCQkgIHx8Ci0JICAgICAgICAgIChTaVNfUHItPkNQX1ZEaXNwbGF5W2ldID49IFNpU19Qci0+Q1BfVlRvdGFsW2ldKSAgICAgCQkJICB8fAotCSAgICAgICAgICAoU2lTX1ByLT5DUF9WU3luY1N0YXJ0W2ldID4gU2lTX1ByLT5DUF9WU3luY0VuZFtpXSkgIAkJCSAgfHwKLQkgICAgICAgICAgKFNpU19Qci0+Q1BfVlN5bmNTdGFydFtpXSA+IFNpU19Qci0+Q1BfVlRvdGFsW2ldKSAgICAJCQkgIHx8Ci0JICAgICAgICAgIChTaVNfUHItPkNQX1ZTeW5jRW5kW2ldID4gU2lTX1ByLT5DUF9WVG90YWxbaV0pICAgICAgCQkJICB8fAotCQkgICgoKHBTaVMtPlZCRmxhZ3MgJiBWQl8zMDFDKSAmJiAoU2lTX1ByLT5DUF9DbG9ja1tpXSA+IDE2MjUwMCkpIHx8Ci0JICAgICAgICAgICAoKCEocFNpUy0+VkJGbGFncyAmIFZCXzMwMUMpKSAmJgotCQkgICAgKChTaVNfUHItPkNQX0Nsb2NrW2ldID4gMTA4MjAwKSB8fCAoU2lTX1ByLT5DUF9WRGlzcGxheVtpXSA+IDEwMjQpIHx8Ci0JCSAgICAgKFNpU19Qci0+Q1BfSERpc3BsYXlbaV0gPiAxNjAwKSkpKSAJCQkJICB8fAotCQkgIChidWZmZXJbYmFzZSsxN10gJiAweDgwKSkgewotCi0JICAgICAgICAgIFNpU19Qci0+Q1BfRGF0YVZhbGlkW2ldID0gRkFMU0U7Ci0KLQkgICAgICAgfSBlbHNlIHsKLQotCQkgIFNpU19Qci0+Q1BfSGF2ZUN1c3RvbURhdGEgPSBUUlVFOwotCi0JCSAgaWYoeHJlcyA+IFNpU19Qci0+Q1BfTWF4WCkgU2lTX1ByLT5DUF9NYXhYID0geHJlczsKLQkgICAgICAgICAgaWYoeXJlcyA+IFNpU19Qci0+Q1BfTWF4WSkgU2lTX1ByLT5DUF9NYXhZID0geXJlczsKLQkJICBpZihTaVNfUHItPkNQX0Nsb2NrW2ldID4gU2lTX1ByLT5DUF9NYXhDbG9jaykgU2lTX1ByLT5DUF9NYXhDbG9jayA9IFNpU19Qci0+Q1BfQ2xvY2tbaV07Ci0KLQkJICBpZigoU2lTX1ByLT5DUF9QcmVmZXJyZWRYID09IHhyZXMpICYmIChTaVNfUHItPkNQX1ByZWZlcnJlZFkgPT0geXJlcykpIHsKLQkgICAgICAgICAgICAgU2lTX1ByLT5DUF9QcmVmZXJyZWRJbmRleCA9IGk7Ci0JCSAgICAgU2lTX01ha2VDbG9ja1JlZ3MocFNpUy0+cFNjcm4sIFNpU19Qci0+Q1BfQ2xvY2tbaV0sICZTaVNfUHItPkNQX1ByZWZTUjJCLCAmU2lTX1ByLT5DUF9QcmVmU1IyQyk7Ci0JCSAgICAgU2lTX1ByLT5DUF9QcmVmQ2xvY2sgPSAoU2lTX1ByLT5DUF9DbG9ja1tpXSAvIDEwMDApICsgMTsKLQkgICAgICAgICAgfQotCi0JICAgICAgICAgIC8qIEV4dHJhY3QgdGhlIHN5bmMgcG9sYXJpc2F0aW9uIGluZm9ybWF0aW9uLiBUaGlzIG9ubHkgd29ya3MKLQkgICAgICAgICAgICogaWYgdGhlIEZsYWdzIGluZGljYXRlIGEgZGlnaXRhbCBzZXBhcmF0ZSBvdXRwdXQuCi0JICAgICAgICAgICAqLwotCSAgICAgICAgICBpZigoYnVmZmVyW2Jhc2UrMTddICYgMHgxOCkgPT0gMHgxOCkgewotCQkgICAgIFNpU19Qci0+Q1BfSFN5bmNfUFtpXSA9IChidWZmZXJbYmFzZSsxN10gJiAweDAyKSA/IFRSVUUgOiBGQUxTRTsKLQkJICAgICBTaVNfUHItPkNQX1ZTeW5jX1BbaV0gPSAoYnVmZmVyW2Jhc2UrMTddICYgMHgwNCkgPyBUUlVFIDogRkFMU0U7Ci0JCSAgICAgU2lTX1ByLT5DUF9TeW5jVmFsaWRbaV0gPSBUUlVFOwotCQkgICAgIGlmKChpID09IFNpU19Qci0+Q1BfUHJlZmVycmVkSW5kZXgpICYmICghaGF2ZXN5bmMpKSB7Ci0JICAgICAgICAgICAgICAgIGNyMzcgfD0gKCgoKGJ1ZmZlcltiYXNlKzE3XSAmIDB4MDYpIF4gMHgwNikgPDwgNSkgfCAweDIwKTsKLQkJCWhhdmVzeW5jID0gVFJVRTsKLQkgICAJICAgICB9Ci0JICAgICAgICAgIH0gZWxzZSB7Ci0JCSAgICAgU2lTX1ByLT5DUF9TeW5jVmFsaWRbaV0gPSBGQUxTRTsKLQkJICB9Ci0KLQkgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYoKCFidWZmZXJbYmFzZV0pICYmICghYnVmZmVyW2Jhc2UrMV0pICYmICghYnVmZmVyW2Jhc2UrMl0pICYmICghYnVmZmVyW2Jhc2UrNF0pKSB7Ci0KLQkgICAgICAgLyogTWF4aW11bSBwaXhjbG9jayBmcm9tIE1vbml0b3IgUmFuZ2UgTGltaXRzICovCi0JICAgICAgIGlmKChidWZmZXJbYmFzZSszXSA9PSAweGZkKSAmJiAoYnVmZmVyW2Jhc2UrOV0gIT0gMHhmZikpIHsKLQkgICAgICAgICAgaW50IG1heGNsayA9IGJ1ZmZlcltiYXNlKzldICogMTA7Ci0JCSAgLyogTW9yZSB0aGFuIDE3MCBpcyBub3Qgc3VwcG9ydGVkIGFueXdheSAqLwotCQkgIGlmKG1heGNsayA8PSAxNzApIFNpU19Qci0+Q1BfTWF4Q2xvY2sgPSBtYXhjbGsgKiAxMDAwOwotCSAgICAgICB9Ci0KLQkgICAgfQotCi0JIH0KLQotCSBpZihTaVNfUHItPkNQX01heFggJiYgU2lTX1ByLT5DUF9NYXhZKSB7Ci0JICAgIHBhbmVsdHlwZSA9IFBhbmVsX0N1c3RvbTsKLQkgICAgY2hlY2tleHBhbmQgPSBGQUxTRTsKLQkgICAgY3IzNyB8PSAweDEwOwotCSAgICBTaVNfUHItPkNQX1ZlbmRvciA9IHBhbmVsdmVuZG9yOwotCSAgICBTaVNfUHItPkNQX1Byb2R1Y3QgPSBwYW5lbHByb2R1Y3Q7Ci0JIH0KLQotICAgICAgfQotCi0gICAgICBpZihwYW5lbHR5cGUgJiYgY2hlY2tleHBhbmQpIHsKLSAgICAgICAgIC8qIElmIGFueSBvZiB0aGUgRXN0YWJsaXNoZWQgbG93LXJlcyBtb2RlcyBpcyBzdXBwb3J0ZWQsIHRoZQotCSAgKiBwYW5lbCBjYW4gc2NhbGUgYXV0b21hdGljYWxseS4gRm9yIDgwMHg2MDAgcGFuZWxzLCB3ZSBvbmx5IAotCSAgKiBjaGVjayB0aGUgZXZlbiBsb3dlciBvbmVzLgotCSAgKi8KLQkgaWYocGFuZWx0eXBlID09IFBhbmVsXzgwMHg2MDApIHsKLQkgICAgaWYoYnVmZmVyWzB4MjNdICYgMHhmYykgY3IzNyB8PSAweDEwOwotCSB9IGVsc2UgewotICAgICAgICAgICAgaWYoYnVmZmVyWzB4MjNdKQkgICAgY3IzNyB8PSAweDEwOwotCSB9Ci0gICAgICB9Ci0gICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgY2FzZSAzOgkJCQkJCQkvKiBBbmFseXplIEVESUQgVjIgKi8KLSAgIGNhc2UgNDoKLSAgICAgIGluZGV4ID0gMDsKLQotICAgICAgaWYoIShjaGVja2VkaWQyKGJ1ZmZlcikpKSB7Ci0gICAgICAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfUFJPQkVELAotCSAJIkxDRCBzZW5zZTogRURJRCBjb3JydXB0XG4iKTsKLQkgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIGlmKChidWZmZXJbMHg0MV0gJiAweDBmKSA9PSAweDAzKSB7Ci0gICAgICAgICBpbmRleCA9IDB4NDIgKyAzOwotICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLQkgCSJMQ0Qgc2Vuc2U6IERpc3BsYXkgc3VwcG9ydHMgVE1EUyBpbnB1dCBvbiBwcmltYXJ5IGludGVyZmFjZVxuIik7Ci0gICAgICB9IGVsc2UgaWYoKGJ1ZmZlclsweDQxXSAmIDB4ZjApID09IDB4MzApIHsKLSAgICAgICAgIGluZGV4ID0gMHg0NiArIDM7Ci0gICAgICAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfUFJPQkVELAotCSAJIkxDRCBzZW5zZTogRGlzcGxheSBzdXBwb3J0cyBUTURTIGlucHV0IG9uIHNlY29uZGFyeSBpbnRlcmZhY2VcbiIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIHhmODZEcnZNc2cocFNpUy0+cFNjcm4tPnNjcm5JbmRleCwgWF9QUk9CRUQsCi0JIAkiTENEIHNlbnNlOiBEaXNwbGF5IGRvZXMgbm90IHN1cHBvcnQgVE1EUyB2aWRlbyBpbnRlcmZhY2UgKDB4JTAyeClcbiIsCi0JCWJ1ZmZlclsweDQxXSk7Ci0JIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICBTaVNfUHItPkNQX1ZlbmRvciA9IHBhbmVsdmVuZG9yID0gYnVmZmVyWzJdIHwgKGJ1ZmZlclsxXSA8PCA4KTsKLSAgICAgIFNpU19Qci0+Q1BfUHJvZHVjdCA9IHBhbmVscHJvZHVjdCA9IGJ1ZmZlclszXSB8IChidWZmZXJbNF0gPDwgOCk7Ci0KLSAgICAgIHBhbmVsdHlwZSA9IFBhbmVsX0N1c3RvbTsKLSAgICAgIFNpU19Qci0+Q1BfTWF4WCA9IFNpU19Qci0+Q1BfUHJlZmVycmVkWCA9IHhyZXMgPSBidWZmZXJbMHg3Nl0gfCAoYnVmZmVyWzB4NzddIDw8IDgpOwotICAgICAgU2lTX1ByLT5DUF9NYXhZID0gU2lTX1ByLT5DUF9QcmVmZXJyZWRZID0geXJlcyA9IGJ1ZmZlclsweDc4XSB8IChidWZmZXJbMHg3OV0gPDwgOCk7Ci0KLSAgICAgIHN3aXRjaCh4cmVzKSB7Ci0jaWYgMAotICAgICAgICAgY2FzZSA4MDA6Ci0JICAgICBpZih5cmVzID09IDYwMCkgewotCSAgICAgCXBhbmVsdHlwZSA9IFBhbmVsXzgwMHg2MDA7Ci0JICAgICAJY2hlY2tleHBhbmQgPSBUUlVFOwotCSAgICAgfQotCSAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgIGNhc2UgMTAyNDoKLQkgICAgIGlmKHlyZXMgPT0gNzY4KSB7Ci0JICAgICAJcGFuZWx0eXBlID0gUGFuZWxfMTAyNHg3Njg7Ci0JICAgICAJY2hlY2tleHBhbmQgPSBUUlVFOwotCSAgICAgfQotCSAgICAgYnJlYWs7Ci0JIGNhc2UgMTI4MDoKLQkgICAgIGlmKHlyZXMgPT0gOTYwKSB7Ci0JICAgICAgICBpZihwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgIAkgICBwYW5lbHR5cGUgPSBQYW5lbDMxMF8xMjgweDk2MDsKLQkJfSBlbHNlIHsKLQkJICAgcGFuZWx0eXBlID0gUGFuZWwzMDBfMTI4MHg5NjA7Ci0JCX0KLQkgICAgIH0gZWxzZSBpZih5cmVzID09IDEwMjQpIHsKLQkgICAgIAlwYW5lbHR5cGUgPSBQYW5lbF8xMjgweDEwMjQ7Ci0JCWNoZWNrZXhwYW5kID0gVFJVRTsKLQkgICAgIH0KLQkgICAgIC8qIDEyODB4NzY4IHRyZWF0ZWQgYXMgY3VzdG9tIGhlcmUgKi8KLQkgICAgIGJyZWFrOwotCSBjYXNlIDE0MDA6Ci0JICAgICBpZihwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgIGlmKHlyZXMgPT0gMTA1MCkgewotCSAgICAgICAgICAgcGFuZWx0eXBlID0gUGFuZWwzMTBfMTQwMHgxMDUwOwotCQkgICBjaGVja2V4cGFuZCA9IFRSVUU7Ci0JICAgICAgICB9Ci0JICAgICB9Ci0gICAgICAJICAgICBicmVhazsKLQkgY2FzZSAxNjAwOgotCSAgICAgaWYocFNpUy0+VkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihwU2lTLT5WQkZsYWdzICYgVkJfMzAxQykgewotCSAgICAgICAgICAgaWYoeXJlcyA9PSAxMjAwKSB7Ci0JICAgICAgICAgICAgICBwYW5lbHR5cGUgPSBQYW5lbDMxMF8xNjAweDEyMDA7Ci0JCSAgICAgIGNoZWNrZXhwYW5kID0gVFJVRTsKLQkJICAgfQotCSAgICAgICAgfQotCSAgICAgfQotICAgICAgCSAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8qIERldGVybWluZSBpZiBSR0IxOCBvciBSR0IyNCAqLwotICAgICAgaWYoaW5kZXgpIHsKLSAgICAgICAgIGlmKChidWZmZXJbaW5kZXhdID09IDB4MjApIHx8IChidWZmZXJbaW5kZXhdID09IDB4MzQpKSB7Ci0JICAgIGNyMzcgfD0gMHgwMTsKLQkgfQotICAgICAgfQotCi0gICAgICBpZihjaGVja2V4cGFuZCkgewotICAgICAgICAgLyogVE9ETyAtIGZvciBub3csIHdlIGxldCB0aGUgcGFuZWwgc2NhbGUgKi8KLQkgY3IzNyB8PSAweDEwOwotICAgICAgfQotCi0gICAgICAvKiBOb3cgc2VlayA0LUJ5dGUgVGltaW5nIGNvZGVzIGFuZCBleHRyYWN0IHN5bmMgcG9sIGluZm8gKi8KLSAgICAgIGluZGV4ID0gMHg4MDsKLSAgICAgIGlmKGJ1ZmZlclsweDdlXSAmIDB4MjApIHsJCQkgICAgLyogc2tpcCBMdW1pbmFuY2UgVGFibGUgKGlmIHByb3ZpZGVkKSAqLwotICAgICAgICAgbHVtc2l6ZSA9IGJ1ZmZlclsweDgwXSAmIDB4MWY7Ci0JIGlmKGJ1ZmZlclsweDgwXSAmIDB4ODApIGx1bXNpemUgKj0gMzsKLQkgbHVtc2l6ZSsrOyAgLyogbHVtaW5hbmNlIGhlYWRlciBieXRlICovCi0JIGluZGV4ICs9IGx1bXNpemU7Ci0gICAgICB9Ci0jaWYgMCAvKiAicGl4ZWwgcmF0ZSIgPSBwaXhlbCBjbG9jaz8gKi8KLSAgICAgIGlmKGJ1ZmZlclsweDdlXSAmIDB4MWMpIHsKLSAgICAgICAgIGZvcihpPTA7IGk8KChidWZmZXJbMHg3ZV0gJiAweDFjKSA+PiAyKTsgaSsrKSB7Ci0JICAgIGlmKGJ1ZmZlcltpbmRleCArIChpKjgpICsgNl0gJiYgKGJ1ZmZlcltpbmRleCArIChpKjgpICsgN10gJiAweDBmKSkgewotCSAgICAgICBpbnQgY2xrID0gKGJ1ZmZlcltpbmRleCArIChpKjgpICsgNl0gfCAoKGJ1ZmZlcltpbmRleCArIChpKjgpICsgN10gJiAweDBmKSA8PCA0KSkgKiAxMDAwOwotCSAgICAgICBpZihjbGsgPiBTaVNfUHItPkNQX01heENsb2NrKSBTaVNfUHItPkNQX01heENsb2NrID0gY2xrOwotCSAgICB9Ci0JIH0KLSAgICAgIH0KLSNlbmRpZgotICAgICAgaW5kZXggKz0gKCgoYnVmZmVyWzB4N2VdICYgMHgxYykgPj4gMikgKiA4KTsgICAvKiBza2lwIEZyZXF1ZW5jeSBSYW5nZXMgKi8KLSAgICAgIGlmKGJ1ZmZlclsweDdlXSAmIDB4MDMpIHsKLSAgICAgICAgIGZvcihpPTA7IGk8KGJ1ZmZlclsweDdlXSAmIDB4MDMpOyBpKyspIHsKLQkgICAgaWYoKGJ1ZmZlcltpbmRleCArIChpKjI3KSArIDldKSB8fCAoYnVmZmVyW2luZGV4ICsgKGkqMjcpICsgMTBdKSkgewotCSAgICAgICBpbnQgY2xrID0gKChidWZmZXJbaW5kZXggKyAoaSoyNykgKyA5XSkgfCAoKGJ1ZmZlcltpbmRleCArIChpKjI3KSArIDldKSA8PCA4KSkgKiAxMDsKLQkgICAgICAgaWYoY2xrID4gU2lTX1ByLT5DUF9NYXhDbG9jaykgU2lTX1ByLT5DUF9NYXhDbG9jayA9IGNsazsKLQkgICAgfQotCSB9Ci0gICAgICB9Ci0gICAgICBpbmRleCArPSAoKGJ1ZmZlclsweDdlXSAmIDB4MDMpICogMjcpOyAgICAgICAgIC8qIHNraXAgRGV0YWlsZWQgUmFuZ2UgTGltaXRzICovCi0gICAgICBudW1jb2RlcyA9IChidWZmZXJbMHg3Zl0gJiAweGY4KSA+PiAzOwotICAgICAgaWYobnVtY29kZXMpIHsKLSAgICAgICAgIG15aW5kZXggPSBpbmRleDsKLSAJIHNlZWtjb2RlID0gKHhyZXMgLSAyNTYpIC8gMTY7Ci0gICAgIAkgZm9yKGk9MDsgaTxudW1jb2RlczsgaSsrKSB7Ci0JICAgIGlmKGJ1ZmZlcltteWluZGV4XSA9PSBzZWVrY29kZSkgYnJlYWs7Ci0JICAgIG15aW5kZXggKz0gNDsKLQkgfQotCSBpZihidWZmZXJbbXlpbmRleF0gPT0gc2Vla2NvZGUpIHsKLQkgICAgY3IzNyB8PSAoKCgoYnVmZmVyW215aW5kZXggKyAxXSAmIDB4MGMpIF4gMHgwYykgPDwgNCkgfCAweDIwKTsKLQkgICAgaGF2ZXN5bmMgPSBUUlVFOwotCSB9IGVsc2UgewotCSAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfV0FSTklORywKLQkgICAgICAgICJMQ0Qgc2Vuc2U6IFVuYWJsZSB0byByZXRyaWV2ZSBTeW5jIHBvbGFyaXR5IGluZm9ybWF0aW9uXG4iKTsKLQkgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIHhmODZEcnZNc2cocFNpUy0+cFNjcm4tPnNjcm5JbmRleCwgWF9XQVJOSU5HLAotCSAgICAgIkxDRCBzZW5zZTogVW5hYmxlIHRvIHJldHJpZXZlIFN5bmMgcG9sYXJpdHkgaW5mb3JtYXRpb25cbiIpOwotICAgICAgfQotCi0gICAgICAvKiBDaGVjayBhZ2FpbnN0IG91ciBkYXRhYmFzZTsgRWcuIFNhbnlvIHByb2plY3RvciByZXBvcnRzCi0gICAgICAgKiAxMDI0eDc2OCBpbiBub24tSERQQyBtb2RlLCBhbHRob3VnaCBpdCBzdXBwb3J0cyAxMjgweDcyMC4KLSAgICAgICAqIFRyZWF0IHN1Y2ggd3JvbmdseSByZXBvcnRpbmcgcGFuZWxzIGFzIGN1c3RvbS4KLSAgICAgICAqLwotICAgICAgaWYocGFuZWx0eXBlICE9IFBhbmVsX0N1c3RvbSkgewotICAgICAgICAgaW50IG1heHgsIG1heHksIHByZWZ4LCBwcmVmeTsKLSAgICAgICAgIGlmKChTaVNfRmluZFBhbmVsRnJvbURCKHBTaVMsIHBhbmVsdmVuZG9yLCBwYW5lbHByb2R1Y3QsICZtYXh4LCAmbWF4eSwgJnByZWZ4LCAmcHJlZnkpKSkgewotCSAgICBwYW5lbHR5cGUgPSBQYW5lbF9DdXN0b207Ci0JICAgIFNpU19Qci0+Q1BfTWF4WCA9IG1heHg7Ci0JICAgIFNpU19Qci0+Q1BfTWF4WSA9IG1heHk7Ci0JICAgIGNyMzcgfD0gMHgxMDsKLQkgICAgLyogTGVhdmUgcHJlZmVycmVkIHVuY2hhbmdlZCAoTVVTVCBiZSBhIHZhbGlkIG1vZGUhKSAqLwotCSB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIE5vdyBzZWVrIHRoZSBkZXRhaWxlZCB0aW1pbmcgZGVzY3JpcHRpb25zIGZvciBjdXN0b20gcGFuZWxzICovCi0gICAgICBpZihwYW5lbHR5cGUgPT0gUGFuZWxfQ3VzdG9tKSB7Ci0KLSAgICAgICAgIFNpU19Qci0+Q1BfU3VwcG9ydHM2NDA0ODA3NSA9IFRSVUU7Ci0KLSAgICAgICAgIGluZGV4ICs9IChudW1jb2RlcyAqIDQpOwotCSBudW1jb2RlcyA9IGJ1ZmZlclsweDdmXSAmIDB4MDc7Ci0JIGZvcihpPTA7IGk8bnVtY29kZXM7IGkrKywgaW5kZXggKz0gMTgpIHsKLQkgICAgeHJlcyA9IGJ1ZmZlcltpbmRleCsyXSB8ICgoYnVmZmVyW2luZGV4KzRdICYgMHhmMCkgPDwgNCk7Ci0gICAgICAgICAgICB5cmVzID0gYnVmZmVyW2luZGV4KzVdIHwgKChidWZmZXJbaW5kZXgrN10gJiAweGYwKSA8PCA0KTsKLQotCSAgICBTaVNfUHItPkNQX0hEaXNwbGF5W2ldID0geHJlczsKLQkgICAgU2lTX1ByLT5DUF9IU3luY1N0YXJ0W2ldID0geHJlcyArIChidWZmZXJbaW5kZXgrOF0gfCAoKGJ1ZmZlcltpbmRleCsxMV0gJiAweGMwKSA8PCAyKSk7Ci0gICAgICAgICAgICBTaVNfUHItPkNQX0hTeW5jRW5kW2ldID0gU2lTX1ByLT5DUF9IU3luY1N0YXJ0W2ldICsgKGJ1ZmZlcltpbmRleCs5XSB8ICgoYnVmZmVyW2luZGV4KzExXSAmIDB4MzApIDw8IDQpKTsKLQkgICAgU2lTX1ByLT5DUF9IVG90YWxbaV0gPSB4cmVzICsgKGJ1ZmZlcltpbmRleCszXSB8ICgoYnVmZmVyW2luZGV4KzRdICYgMHgwZikgPDwgOCkpOwotCSAgICBTaVNfUHItPkNQX0hCbGFua1N0YXJ0W2ldID0geHJlcyArIDE7Ci0JICAgIFNpU19Qci0+Q1BfSEJsYW5rRW5kW2ldID0gU2lTX1ByLT5DUF9IVG90YWxbaV07Ci0KLQkgICAgU2lTX1ByLT5DUF9WRGlzcGxheVtpXSA9IHlyZXM7Ci0gICAgICAgICAgICBTaVNfUHItPkNQX1ZTeW5jU3RhcnRbaV0gPSB5cmVzICsgKCgoYnVmZmVyW2luZGV4KzEwXSAmIDB4ZjApID4+IDQpIHwgKChidWZmZXJbaW5kZXgrMTFdICYgMHgwYykgPDwgMikpOwotICAgICAgICAgICAgU2lTX1ByLT5DUF9WU3luY0VuZFtpXSA9IFNpU19Qci0+Q1BfVlN5bmNTdGFydFtpXSArICgoYnVmZmVyW2luZGV4KzEwXSAmIDB4MGYpIHwgKChidWZmZXJbaW5kZXgrMTFdICYgMHgwMykgPDwgNCkpOwotCSAgICBTaVNfUHItPkNQX1ZUb3RhbFtpXSA9IHlyZXMgKyAoYnVmZmVyW2luZGV4KzZdIHwgKChidWZmZXJbaW5kZXgrN10gJiAweDBmKSA8PCA4KSk7Ci0JICAgIFNpU19Qci0+Q1BfVkJsYW5rU3RhcnRbaV0gPSB5cmVzICsgMTsKLQkgICAgU2lTX1ByLT5DUF9WQmxhbmtFbmRbaV0gPSBTaVNfUHItPkNQX1ZUb3RhbFtpXTsKLQotCSAgICBTaVNfUHItPkNQX0Nsb2NrW2ldID0gKGJ1ZmZlcltpbmRleF0gfCAoYnVmZmVyW2luZGV4KzFdIDw8IDgpKSAqIDEwOwotCi0JICAgIFNpU19Qci0+Q1BfRGF0YVZhbGlkW2ldID0gVFJVRTsKLQotCSAgICBpZigoU2lTX1ByLT5DUF9IRGlzcGxheVtpXSAmIDcpCQkJCQkJfHwKLQkgICAgICAgKFNpU19Qci0+Q1BfSERpc3BsYXlbaV0gPiBTaVNfUHItPkNQX0hTeW5jU3RhcnRbaV0pICAJCQl8fAotCSAgICAgICAoU2lTX1ByLT5DUF9IRGlzcGxheVtpXSA+PSBTaVNfUHItPkNQX0hTeW5jRW5kW2ldKSAgIAkJCXx8Ci0JICAgICAgIChTaVNfUHItPkNQX0hEaXNwbGF5W2ldID49IFNpU19Qci0+Q1BfSFRvdGFsW2ldKSAgICAgCQkJfHwKLQkgICAgICAgKFNpU19Qci0+Q1BfSFN5bmNTdGFydFtpXSA+PSBTaVNfUHItPkNQX0hTeW5jRW5kW2ldKSAJCQl8fAotCSAgICAgICAoU2lTX1ByLT5DUF9IU3luY1N0YXJ0W2ldID4gU2lTX1ByLT5DUF9IVG90YWxbaV0pICAgIAkJCXx8Ci0JICAgICAgIChTaVNfUHItPkNQX0hTeW5jRW5kW2ldID4gU2lTX1ByLT5DUF9IVG90YWxbaV0pICAgICAgCQkJfHwKLQkgICAgICAgKFNpU19Qci0+Q1BfVkRpc3BsYXlbaV0gPiBTaVNfUHItPkNQX1ZTeW5jU3RhcnRbaV0pICAJCQl8fAotCSAgICAgICAoU2lTX1ByLT5DUF9WRGlzcGxheVtpXSA+PSBTaVNfUHItPkNQX1ZTeW5jRW5kW2ldKSAgIAkJCXx8Ci0JICAgICAgIChTaVNfUHItPkNQX1ZEaXNwbGF5W2ldID49IFNpU19Qci0+Q1BfVlRvdGFsW2ldKSAgICAgCQkJfHwKLQkgICAgICAgKFNpU19Qci0+Q1BfVlN5bmNTdGFydFtpXSA+IFNpU19Qci0+Q1BfVlN5bmNFbmRbaV0pICAJCQl8fAotCSAgICAgICAoU2lTX1ByLT5DUF9WU3luY1N0YXJ0W2ldID4gU2lTX1ByLT5DUF9WVG90YWxbaV0pICAgIAkJCXx8Ci0JICAgICAgIChTaVNfUHItPkNQX1ZTeW5jRW5kW2ldID4gU2lTX1ByLT5DUF9WVG90YWxbaV0pICAgICAgCQkJfHwKLQkgICAgICAgKCgocFNpUy0+VkJGbGFncyAmIFZCXzMwMUMpICYmIChTaVNfUHItPkNQX0Nsb2NrW2ldID4gMTYyNTAwKSkgfHwKLQkgICAgICAgICgoIShwU2lTLT5WQkZsYWdzICYgVkJfMzAxQykpICYmCi0JCSAoKFNpU19Qci0+Q1BfQ2xvY2tbaV0gPiAxMDgyMDApIHx8IChTaVNfUHItPkNQX1ZEaXNwbGF5W2ldID4gMTAyNCkpKSkJfHwKLQkgICAgICAgKGJ1ZmZlcltpbmRleCArIDE3XSAmIDB4ODApKSB7Ci0KLQkgICAgICAgU2lTX1ByLT5DUF9EYXRhVmFsaWRbaV0gPSBGQUxTRTsKLQotCSAgICB9IGVsc2UgewotCi0JICAgICAgIFNpU19Qci0+Q1BfSGF2ZUN1c3RvbURhdGEgPSBUUlVFOwotCi0JICAgICAgIGlmKFNpU19Qci0+Q1BfQ2xvY2tbaV0gPiBTaVNfUHItPkNQX01heENsb2NrKSBTaVNfUHItPkNQX01heENsb2NrID0gU2lTX1ByLT5DUF9DbG9ja1tpXTsKLQotCSAgICAgICBpZigoU2lTX1ByLT5DUF9QcmVmZXJyZWRYID09IHhyZXMpICYmIChTaVNfUHItPkNQX1ByZWZlcnJlZFkgPT0geXJlcykpIHsKLQkgICAgICAgICAgU2lTX1ByLT5DUF9QcmVmZXJyZWRJbmRleCA9IGk7Ci0JCSAgU2lTX01ha2VDbG9ja1JlZ3MocFNpUy0+cFNjcm4sIFNpU19Qci0+Q1BfQ2xvY2tbaV0sICZTaVNfUHItPkNQX1ByZWZTUjJCLCAmU2lTX1ByLT5DUF9QcmVmU1IyQyk7Ci0JCSAgU2lTX1ByLT5DUF9QcmVmQ2xvY2sgPSAoU2lTX1ByLT5DUF9DbG9ja1tpXSAvIDEwMDApICsgMTsKLQkJICBpZighaGF2ZXN5bmMpIHsKLQkgICAgICAgICAgICAgY3IzNyB8PSAoKCgoYnVmZmVyW2luZGV4ICsgMTddICYgMHgwNikgXiAweDA2KSA8PCA1KSB8IDB4MjApOwotCQkgICAgIGhhdmVzeW5jID0gVFJVRTsKLQkgICAJICB9Ci0JICAgICAgIH0KLQotCSAgICAgICBTaVNfUHItPkNQX0hTeW5jX1BbaV0gPSAoYnVmZmVyW2luZGV4ICsgMTddICYgMHgwMikgPyBUUlVFIDogRkFMU0U7Ci0JICAgICAgIFNpU19Qci0+Q1BfVlN5bmNfUFtpXSA9IChidWZmZXJbaW5kZXggKyAxN10gJiAweDA0KSA/IFRSVUUgOiBGQUxTRTsKLQkgICAgICAgU2lTX1ByLT5DUF9TeW5jVmFsaWRbaV0gPSBUUlVFOwotCi0JICAgIH0KLQkgfQotCi0JIGNyMzcgfD0gMHgxMDsKLQotICAgICAgfQotCi0gICAgICBicmVhazsKLQotICAgfQotCi0gICAvKiAxMjgweDk2MCBwYW5lbHMgYXJlIGFsd2F5cyBSR0IyNCwgdW5hYmxlIHRvIHNjYWxlIGFuZCB1c2UKLSAgICAqIGhpZ2ggYWN0aXZlIHN5bmMgcG9sYXJpdHkKLSAgICAqLwotICAgaWYocFNpUy0+VkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0gICAgICBpZihwYW5lbHR5cGUgPT0gUGFuZWwzMTBfMTI4MHg5NjApIGNyMzcgJj0gMHgwZTsKLSAgIH0gZWxzZSB7Ci0gICAgICBpZihwYW5lbHR5cGUgPT0gUGFuZWwzMDBfMTI4MHg5NjApIGNyMzcgJj0gMHgwZTsKLSAgIH0KLQotICAgZm9yKGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0gICAgICBpZihTaVNfUHItPkNQX0RhdGFWYWxpZFtpXSkgewotICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLSAgICAgICAgICAgICJOb24tc3RhbmRhcmQgTENEL0RWSS1EIHRpbWluZyBkYXRhIG5vLiAlZDpcbiIsIGkpOwotICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLQkgICAgIiAgIEhEaXNwbGF5ICVkIEhTeW5jICVkIEhTeW5jRW5kICVkIEhUb3RhbCAlZFxuIiwKLQkgICAgU2lTX1ByLT5DUF9IRGlzcGxheVtpXSwgU2lTX1ByLT5DUF9IU3luY1N0YXJ0W2ldLAotCSAgICBTaVNfUHItPkNQX0hTeW5jRW5kW2ldLCBTaVNfUHItPkNQX0hUb3RhbFtpXSk7Ci0gICAgICAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfUFJPQkVELAotICAgICAgICAgICAgIiAgIFZEaXNwbGF5ICVkIFZTeW5jICVkIFZTeW5jRW5kICVkIFZUb3RhbCAlZFxuIiwKLSAgICAgICAgICAgIFNpU19Qci0+Q1BfVkRpc3BsYXlbaV0sIFNpU19Qci0+Q1BfVlN5bmNTdGFydFtpXSwKLSAgIAkgICAgU2lTX1ByLT5DUF9WU3luY0VuZFtpXSwgU2lTX1ByLT5DUF9WVG90YWxbaV0pOwotICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLQkgICAgIiAgIFBpeGVsIGNsb2NrOiAlMy4zZk1oelxuIiwgKGZsb2F0KVNpU19Qci0+Q1BfQ2xvY2tbaV0gLyAxMDAwKTsKLQkgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX0lORk8sCi0JICAgICIgICBUbyB1c2UgdGhpcywgYWRkIFwiJWR4JWRcIiB0byB0aGUgbGlzdCBvZiBNb2RlcyBpbiB0aGUgU2NyZWVuIHNlY3Rpb25cbiIsCi0JICAgIFNpU19Qci0+Q1BfSERpc3BsYXlbaV0sCi0JICAgIFNpU19Qci0+Q1BfVkRpc3BsYXlbaV0pOwotICAgICAgfQotICAgfQotCi0gICBpZihwYW5lbHR5cGUpIHsKLSAgICAgICBpZighU2lTX1ByLT5DUF9QcmVmZXJyZWRYKSBTaVNfUHItPkNQX1ByZWZlcnJlZFggPSBTaVNfUHItPkNQX01heFg7Ci0gICAgICAgaWYoIVNpU19Qci0+Q1BfUHJlZmVycmVkWSkgU2lTX1ByLT5DUF9QcmVmZXJyZWRZID0gU2lTX1ByLT5DUF9NYXhZOwotICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MzIsMHgwOCk7Ci0gICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzYscGFuZWx0eXBlKTsKLSAgICAgICBjcjM3ICY9IDB4ZjE7Ci0gICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzZDQsMHgzNywweDBjLGNyMzcpOwotICAgICAgIFNpU19Qci0+UGFuZWxTZWxmRGV0ZWN0ZWQgPSBUUlVFOwotI2lmZGVmIFRXREVCVUcKLSAgICAgICB4Zjg2RHJ2TXNnVmVyYihwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwgMywgCi0gICAgICAgCSAgICJMQ0Qgc2Vuc2U6IFtEREMgTENEIHJlc3VsdHM6IDB4JTAyeCwgMHglMDJ4XVxuIiwgcGFuZWx0eXBlLCBjcjM3KTsKLSNlbmRpZgkKLSAgIH0gZWxzZSB7Ci0gICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4MzIsfjB4MDgpOwotICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM2LDB4MDApOwotICAgfQotICAgcmV0dXJuIDA7Ci19Ci0gICAKLVVTSE9SVAotU2lTX1NlbnNlVkdBMkREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTSVNQdHIgcFNpUykKLXsKLSAgIFVTSE9SVCBERENkYXRhdHlwZSxmbGFnOwotICAgQk9PTEVBTiBmb3VuZGNydCA9IEZBTFNFOwotICAgaW50IHJldHJ5OwotICAgdW5zaWduZWQgY2hhciBidWZmZXJbMjU2XTsKLQotICAgaWYoIShwU2lTLT5WQkZsYWdzICYgKFZCXzMwMXxWQl8zMDFCfFZCXzMwMUN8VkJfMzAyQikpKSByZXR1cm4gMDsKLQotICAgaWYoU2lTX0luaXRERENSZWdzKFNpU19QciwgcFNpUy0+VkJGbGFncywgcFNpUy0+VkdBRW5naW5lLCAyLCAwLCBGQUxTRSkgPT0gMHhGRkZGKSByZXR1cm4gMDsKLSAgIAotICAgU2lTX1ByLT5TaVNfRERDX1NlY0FkZHIgPSAweDAwOwotICAgCi0gICAvKiBQcm9iZSBzdXBwb3J0ZWQgREEncyAqLwotICAgZmxhZyA9IFNpU19Qcm9iZUREQyhTaVNfUHIpOwotICAgaWYoZmxhZyAmIDB4MTApIHsKLSAgICAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhhNjsJLyogRURJRCBWMiAoRlApICovCi0gICAgICBERENkYXRhdHlwZSA9IDQ7Ci0gICB9IGVsc2UgaWYoZmxhZyAmIDB4MDgpIHsKLSAgICAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhhMjsJLyogRURJRCBWMiAoUCZELUQgTW9uaXRvcikgKi8KLSAgICAgIEREQ2RhdGF0eXBlID0gMzsKLSAgIH0gZWxzZSBpZihmbGFnICYgMHgwMikgewotICAgICAgU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHIgPSAweGEwOwkvKiBFRElEIFYxICovCi0gICAgICBERENkYXRhdHlwZSA9IDE7Ci0gICB9IGVsc2UgewotICAgCXhmODZEcnZNc2cocFNpUy0+cFNjcm4tPnNjcm5JbmRleCwgWF9QUk9CRUQsCi0JCSJWR0EyIHNlbnNlOiBEbyBEREMgYW5zd2VyXG4iKTsKLSAgIAlyZXR1cm4gMDsJCQkJLyogbm8gRERDIHN1cHBvcnQgKG9yIG5vIGRldmljZSBhdHRhY2hlZCkgKi8KLSAgIH0KLQotICAgLyogUmVhZCB0aGUgZW50aXJlIEVESUQgKi8KLSAgIHJldHJ5ID0gMjsKLSAgIGRvIHsKLSAgICAgIGlmKFNpU19SZWFkRERDKFNpU19QciwgRERDZGF0YXR5cGUsIGJ1ZmZlcikpIHsKLSAgICAgICAgIHhmODZEcnZNc2cocFNpUy0+cFNjcm4tPnNjcm5JbmRleCwgWF9QUk9CRUQsCi0JIAkiVkdBMiBzZW5zZTogRERDIHJlYWQgZmFpbGVkIChhdHRlbXB0ICVkKSwgJXNcbiIsCi0JCSgzLXJldHJ5KSwgKHJldHJ5ID09IDEpID8gImdpdmluZyB1cCIgOiAicmV0cnlpbmciKTsKLQkgcmV0cnktLTsKLQkgaWYocmV0cnkgPT0gMCkgcmV0dXJuIDB4RkZGRjsKLSAgICAgIH0gZWxzZSBicmVhazsKLSAgIH0gd2hpbGUoMSk7Ci0KLSAgIC8qIEFuYWx5emUgRURJRC4gV2UgZG9uJ3QgaGF2ZSBtYW55IGNoYW5jZXMgdG8KLSAgICAqIGRpc3Rpbmd1aXNoIGEgZmxhdCBwYW5lbCBmcm9tIGEgQ1JULi4uCi0gICAgKi8KLSAgIHN3aXRjaChERENkYXRhdHlwZSkgewotICAgY2FzZSAxOgotICAgICAgaWYoIShjaGVja2VkaWQxKGJ1ZmZlcikpKSB7Ci0gICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX0VSUk9SLAotCSAgCSJWR0EyIHNlbnNlOiBFRElEIGNvcnJ1cHRcbiIpOwotICAgICAgCSAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBpZihidWZmZXJbMHgxNF0gJiAweDgwKSB7CQkJLyogRGlzcGxheSB1c2VzIGRpZ2l0YWwgaW5wdXQgKi8KLSAgICAgICAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfRVJST1IsCi0JICAJIlZHQTIgc2Vuc2U6IEF0dGFjaGVkIGRpc3BsYXkgZXhwZWN0cyBkaWdpdGFsIGlucHV0XG4iKTsKLSAgICAgIAkgIHJldHVybiAwOwotICAgICAgfQotICAgICAgU2lTX1ByLT5DUF9WZW5kb3IgPSBidWZmZXJbOV0gfCAoYnVmZmVyWzhdIDw8IDgpOwotICAgICAgU2lTX1ByLT5DUF9Qcm9kdWN0ID0gYnVmZmVyWzEwXSB8IChidWZmZXJbMTFdIDw8IDgpOwotICAgICAgZm91bmRjcnQgPSBUUlVFOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIDM6Ci0gICBjYXNlIDQ6Ci0gICAgICBpZighKGNoZWNrZWRpZDIoYnVmZmVyKSkpIHsKLSAgICAgICAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfRVJST1IsCi0JICAJIlZHQTIgc2Vuc2U6IEVESUQgY29ycnVwdFxuIik7Ci0gICAgICAJICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIGlmKCAoKGJ1ZmZlclsweDQxXSAmIDB4MGYpICE9IDB4MDEpICYmICAJLyogRGlzcGxheSBkb2VzIG5vdCBzdXBwb3J0IGFuYWxvZyBpbnB1dCAqLwotICAgICAgICAgICgoYnVmZmVyWzB4NDFdICYgMHgwZikgIT0gMHgwMikgJiYKLQkgICgoYnVmZmVyWzB4NDFdICYgMHhmMCkgIT0gMHgxMCkgJiYKLQkgICgoYnVmZmVyWzB4NDFdICYgMHhmMCkgIT0gMHgyMCkgKSB7Ci0JICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfRVJST1IsCi0JICAgICAJIlZHQTIgc2Vuc2U6IEF0dGFjaGVkIGRpc3BsYXkgZG9lcyBub3Qgc3VwcG9ydCBhbmFsb2cgaW5wdXQgKDB4JTAyeClcbiIsCi0JCWJ1ZmZlclsweDQxXSk7Ci0JICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIFNpU19Qci0+Q1BfVmVuZG9yID0gYnVmZmVyWzJdIHwgKGJ1ZmZlclsxXSA8PCA4KTsKLSAgICAgIFNpU19Qci0+Q1BfUHJvZHVjdCA9IGJ1ZmZlclszXSB8IChidWZmZXJbNF0gPDwgOCk7Ci0gICAgICBmb3VuZGNydCA9IFRSVUU7Ci0gICAgICBicmVhazsKLSAgIH0KLQotICAgaWYoZm91bmRjcnQpIHsKLSAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MzIsMHgxMCk7Ci0gICB9Ci0gICByZXR1cm4oMCk7Ci19Ci0KLSNlbmRpZgotCi12b2lkCi1TaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBheCxVU0hPUlQgdGVtcGJoKQotewotICBVU0hPUlQgdGVtcGJsOwotCi0gIHRlbXBibCA9IFNpU19HZXRDSDcweHgoU2lTX1ByLCh0ZW1wYXggJiAweDAwRkYpKTsKLSAgdGVtcGJsID0gKCgodGVtcGJsICYgdGVtcGJoKSA8PCA4KSB8IHRlbXBheCk7Ci0gIFNpU19TZXRDSDcweHgoU2lTX1ByLHRlbXBibCk7Ci19Ci0KIC8qIEdlbmVyaWMgSTJDIGZ1bmN0aW9ucyBmb3IgQ2hyb250ZWwgJiBEREMgLS0tLS0tLS0tICovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0U3dpdGNoRERDMihTaVNfUHJpdmF0ZSAqU2lTX1ByKQorU2lTX1NldFN3aXRjaEREQzIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAgIFNpU19TZXRTQ0xLSGlnaChTaVNfUHIpOwogICBTaVNfV2FpdFJldHJhY2UxKFNpU19Qcik7CkBAIC0xMDUwNSwxMjUgKzk1MDIsMTI3IEBACiAgIFNpU19XYWl0UmV0cmFjZTEoU2lTX1ByKTsKIH0KIAotVVNIT1JUCi1TaVNfUmVhZEREQzFCaXQoU2lTX1ByaXZhdGUgKlNpU19QcikKK3Vuc2lnbmVkIHNob3J0CitTaVNfUmVhZEREQzFCaXQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAgICBTaVNfV2FpdFJldHJhY2UxKFNpU19Qcik7Ci0gICByZXR1cm4oKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDExKSAmIDB4MDIpID4+IDEpOworICAgcmV0dXJuICgoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTEpICYgMHgwMikgPj4gMSk7CiB9CiAKIC8qIFNldCBJMkMgc3RhcnQgY29uZGl0aW9uICovCiAvKiBUaGlzIGlzIGRvbmUgYnkgYSBTRCBoaWdoLXRvLWxvdyB0cmFuc2l0aW9uIHdoaWxlIFNDIGlzIGhpZ2ggKi8KLXN0YXRpYyBVU0hPUlQKLVNpU19TZXRTdGFydChTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfU2V0U3RhcnQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIGlmKFNpU19TZXRTQ0xLTG93KFNpU19QcikpIHJldHVybiAweEZGRkY7CQkJICAgICAgICAgICAvKiAoU0MtPmxvdykgICovCisgIGlmKFNpU19TZXRTQ0xLTG93KFNpU19QcikpIHJldHVybiAweEZGRkY7CQkJLyogKFNDLT5sb3cpICAqLwogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfRERDX1BvcnQsCi0gICAgCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKLSAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKLQkJICBTaVNfUHItPlNpU19ERENfRGF0YSk7ICAgICAgICAgICAgIAkJCSAgIC8qIFNELT5oaWdoICovCi0gIGlmKFNpU19TZXRTQ0xLSGlnaChTaVNfUHIpKSByZXR1cm4gMHhGRkZGOwkJCSAgICAgICAgICAgLyogU0MtPmhpZ2ggKi8KKwkJICBTaVNfUHItPlNpU19ERENfSW5kZXgsCisJCSAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAorCQkgIFNpU19Qci0+U2lTX0REQ19EYXRhKTsgICAgICAgIAkJLyogU0QtPmhpZ2ggKi8KKyAgaWYoU2lTX1NldFNDTEtIaWdoKFNpU19QcikpIHJldHVybiAweEZGRkY7CQkJLyogU0MtPmhpZ2ggKi8KICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX0REQ19Qb3J0LAotICAJCSAgU2lTX1ByLT5TaVNfRERDX0luZGV4LAotICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAotCQkgIDB4MDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJICAgLyogU0QtPmxvdyA9IHN0YXJ0IGNvbmRpdGlvbiAqLwotICBpZihTaVNfU2V0U0NMS0hpZ2goU2lTX1ByKSkgcmV0dXJuIDB4RkZGRjsJCQkgICAgICAgICAgIC8qIChTQy0+bG93KSAqLworCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKKwkJICBTaVNfUHItPlNpU19ERENfTkRhdGEsCisJCSAgMHgwMCk7CQkJCQkvKiBTRC0+bG93ID0gc3RhcnQgY29uZGl0aW9uICovCisgIGlmKFNpU19TZXRTQ0xLSGlnaChTaVNfUHIpKSByZXR1cm4gMHhGRkZGOwkJCS8qIChTQy0+bG93KSAqLwogICByZXR1cm4gMDsKIH0KIAogLyogU2V0IEkyQyBzdG9wIGNvbmRpdGlvbiAqLwogLyogVGhpcyBpcyBkb25lIGJ5IGEgU0QgbG93LXRvLWhpZ2ggdHJhbnNpdGlvbiB3aGlsZSBTQyBpcyBoaWdoICovCi1zdGF0aWMgVVNIT1JUCi1TaVNfU2V0U3RvcChTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfU2V0U3RvcChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgaWYoU2lTX1NldFNDTEtMb3coU2lTX1ByKSkgcmV0dXJuIDB4RkZGRjsJCQkgICAgICAgICAgIC8qIChTQy0+bG93KSAqLworICBpZihTaVNfU2V0U0NMS0xvdyhTaVNfUHIpKSByZXR1cm4gMHhGRkZGOwkJCS8qIChTQy0+bG93KSAqLwogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfRERDX1BvcnQsCi0gIAkgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4LAotICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAotCQkgIDB4MDApOyAgICAgICAgICAJCSAgIAkJCSAgIC8qIFNELT5sb3cgICAqLwotICBpZihTaVNfU2V0U0NMS0hpZ2goU2lTX1ByKSkgcmV0dXJuIDB4RkZGRjsJCQkgICAgICAgICAgIC8qIFNDLT5oaWdoICAqLworCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKKwkJICBTaVNfUHItPlNpU19ERENfTkRhdGEsCisJCSAgMHgwMCk7CQkJCQkvKiBTRC0+bG93ICAgKi8KKyAgaWYoU2lTX1NldFNDTEtIaWdoKFNpU19QcikpIHJldHVybiAweEZGRkY7CQkJLyogU0MtPmhpZ2ggICovCiAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19ERENfUG9ydCwKLSAgCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKLSAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKLQkJICBTaVNfUHItPlNpU19ERENfRGF0YSk7ICAJICAgCQkJICAgLyogU0QtPmhpZ2ggPSBzdG9wIGNvbmRpdGlvbiAqLwotICBpZihTaVNfU2V0U0NMS0hpZ2goU2lTX1ByKSkgcmV0dXJuIDB4RkZGRjsJCQkgICAgICAgICAgIC8qIChTQy0+aGlnaCkgKi8KKwkJICBTaVNfUHItPlNpU19ERENfSW5kZXgsCisJCSAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAorCQkgIFNpU19Qci0+U2lTX0REQ19EYXRhKTsJCQkvKiBTRC0+aGlnaCA9IHN0b3AgY29uZGl0aW9uICovCisgIGlmKFNpU19TZXRTQ0xLSGlnaChTaVNfUHIpKSByZXR1cm4gMHhGRkZGOwkJCS8qIChTQy0+aGlnaCkgKi8KICAgcmV0dXJuIDA7CiB9CiAKIC8qIFdyaXRlIDggYml0cyBvZiBkYXRhICovCi1zdGF0aWMgVVNIT1JUCi1TaVNfV3JpdGVEREMyRGF0YShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGF4KQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfV3JpdGVEREMyRGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgdGVtcGF4KQogewotICBVU0hPUlQgaSxmbGFnLHRlbXA7CisgIHVuc2lnbmVkIHNob3J0IGksZmxhZyx0ZW1wOwogCiAgIGZsYWcgPSAweDgwOwotICBmb3IoaT0wOyBpPDg7IGkrKykgewotICAgIFNpU19TZXRTQ0xLTG93KFNpU19Qcik7CQkJCSAgICAgICAgICAgICAgICAgICAgICAvKiBTQy0+bG93ICovCisgIGZvcihpID0gMDsgaSA8IDg7IGkrKykgeworICAgIFNpU19TZXRTQ0xLTG93KFNpU19Qcik7CQkJCQkvKiBTQy0+bG93ICovCiAgICAgaWYodGVtcGF4ICYgZmxhZykgewogICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX0REQ19Qb3J0LAotICAgICAgCQkgICAgICBTaVNfUHItPlNpU19ERENfSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAotCQkgICAgICBTaVNfUHItPlNpU19ERENfRGF0YSk7ICAgICAgICAgICAgCQkgICAgICAvKiBXcml0ZSBiaXQgKDEpIHRvIFNEICovCisJCSAgICAgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKKwkJICAgICAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAorCQkgICAgICBTaVNfUHItPlNpU19ERENfRGF0YSk7CQkJLyogV3JpdGUgYml0ICgxKSB0byBTRCAqLwogICAgIH0gZWxzZSB7CiAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfRERDX1BvcnQsCi0gICAgICAJCSAgICAgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBTaVNfUHItPlNpU19ERENfTkRhdGEsCi0JCSAgICAgIDB4MDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgIC8qIFdyaXRlIGJpdCAoMCkgdG8gU0QgKi8KKwkJICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4LAorCQkgICAgICBTaVNfUHItPlNpU19ERENfTkRhdGEsCisJCSAgICAgIDB4MDApOwkJCQkJLyogV3JpdGUgYml0ICgwKSB0byBTRCAqLwogICAgIH0KLSAgICBTaVNfU2V0U0NMS0hpZ2goU2lTX1ByKTsJCQkJICAgICAgICAgICAgICAgICAgICAgIC8qIFNDLT5oaWdoICovCisgICAgU2lTX1NldFNDTEtIaWdoKFNpU19Qcik7CQkJCQkvKiBTQy0+aGlnaCAqLwogICAgIGZsYWcgPj49IDE7CiAgIH0KLSAgdGVtcCA9IFNpU19DaGVja0FDSyhTaVNfUHIpOwkJCQkgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgYWNrbm93bGVkZ2UgKi8KLSAgcmV0dXJuKHRlbXApOworICB0ZW1wID0gU2lTX0NoZWNrQUNLKFNpU19Qcik7CQkJCQkvKiBDaGVjayBhY2tub3dsZWRnZSAqLworICByZXR1cm4gdGVtcDsKIH0KIAotc3RhdGljIFVTSE9SVAotU2lTX1JlYWREREMyRGF0YShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGF4KQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfUmVhZEREQzJEYXRhKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVU0hPUlQgaSx0ZW1wLGdldGRhdGE7CisgIHVuc2lnbmVkIHNob3J0IGksIHRlbXAsIGdldGRhdGE7CiAKLSAgZ2V0ZGF0YT0wOwotICBmb3IoaT0wOyBpPDg7IGkrKykgeworICBnZXRkYXRhID0gMDsKKyAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgZ2V0ZGF0YSA8PD0gMTsKICAgICBTaVNfU2V0U0NMS0xvdyhTaVNfUHIpOwogICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19ERENfUG9ydCwKLSAgICAJCSAgICBTaVNfUHItPlNpU19ERENfSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKKwkJICAgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKKwkJICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKIAkJICAgIFNpU19Qci0+U2lTX0REQ19EYXRhKTsKICAgICBTaVNfU2V0U0NMS0hpZ2goU2lTX1ByKTsKICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19ERENfUG9ydCxTaVNfUHItPlNpU19ERENfSW5kZXgpOwogICAgIGlmKHRlbXAgJiBTaVNfUHItPlNpU19ERENfRGF0YSkgZ2V0ZGF0YSB8PSAweDAxOwogICB9Ci0gIHJldHVybihnZXRkYXRhKTsKKyAgcmV0dXJuIGdldGRhdGE7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19TZXRTQ0xLTG93KFNpU19Qcml2YXRlICpTaVNfUHIpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19TZXRTQ0xLTG93KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfRERDX1BvcnQsCi0gIAkJICBTaVNfUHItPlNpU19ERENfSW5kZXgsCi0gICAgICAgICAgICAgICAgICBTaVNfUHItPlNpU19ERENfTkNsaywKLQkJICAweDAwKTsgICAgICAJCQkJCS8qIFNldFNDTEtMb3coKSAgKi8KKwkJICBTaVNfUHItPlNpU19ERENfSW5kZXgsCisJCSAgU2lTX1ByLT5TaVNfRERDX05DbGssCisJCSAgMHgwMCk7CQkJCQkvKiBTZXRTQ0xLTG93KCkgICovCiAgIFNpU19EREMyRGVsYXkoU2lTX1ByLFNpU19JMkNERUxBWVNIT1JUKTsKICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19TZXRTQ0xLSGlnaChTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfU2V0U0NMS0hpZ2goc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCB0ZW1wLCB3YXRjaGRvZz0xMDAwOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wLCB3YXRjaGRvZz0xMDAwOwogCiAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19ERENfUG9ydCwKLSAgCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKLSAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0REQ19OQ2xrLAorCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKKwkJICBTaVNfUHItPlNpU19ERENfTkNsaywKIAkJICBTaVNfUHItPlNpU19ERENfQ2xrKTsgIAkJCS8qIFNldFNDTEtIaWdoKCkgICovCiAgIGRvIHsKICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19ERENfUG9ydCxTaVNfUHItPlNpU19ERENfSW5kZXgpOwogICB9IHdoaWxlKCghKHRlbXAgJiBTaVNfUHItPlNpU19ERENfQ2xrKSkgJiYgLS13YXRjaGRvZyk7CiAgIGlmICghd2F0Y2hkb2cpIHsKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgICAgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywgIlNldENsa0hpZ2ggZmFpbGVkXG4iKTsKICNlbmRpZgorI2VuZGlmCiAgIAlyZXR1cm4gMHhGRkZGOwogICB9CiAgIFNpU19EREMyRGVsYXkoU2lTX1ByLFNpU19JMkNERUxBWVNIT1JUKTsKQEAgLTEwNjMyLDIxICs5NjMxLDIxIEBACiAKIC8qIENoZWNrIEkyQyBhY2tub3dsZWRnZSAqLwogLyogUmV0dXJucyAwIGlmIGFjayBvaywgbm9uLTAgaWYgYWNrIG5vdCBvayAqLwotc3RhdGljIFVTSE9SVAotU2lTX0NoZWNrQUNLKFNpU19Qcml2YXRlICpTaVNfUHIpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19DaGVja0FDSyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVVNIT1JUIHRlbXBhaDsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcGFoOwogCiAgIFNpU19TZXRTQ0xLTG93KFNpU19Qcik7CQkJCSAgICAgICAgICAgLyogKFNDLT5sb3cpICovCiAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19ERENfUG9ydCwKLSAgCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKLSAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKLQkJICBTaVNfUHItPlNpU19ERENfRGF0YSk7ICAgICAJCQkgICAvKiAoU0QtPmhpZ2gpICovCisJCSAgU2lTX1ByLT5TaVNfRERDX0luZGV4LAorCQkgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKKwkJICBTaVNfUHItPlNpU19ERENfRGF0YSk7CQkJICAgLyogKFNELT5oaWdoKSAqLwogICBTaVNfU2V0U0NMS0hpZ2goU2lTX1ByKTsJCQkJICAgICAgICAgICAvKiBTQy0+aGlnaCA9IGNsb2NrIGltcHVsc2UgZm9yIGFjayAqLwogICB0ZW1wYWggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX0REQ19Qb3J0LFNpU19Qci0+U2lTX0REQ19JbmRleCk7IC8qIFJlYWQgU0QgKi8KICAgU2lTX1NldFNDTEtMb3coU2lTX1ByKTsJCQkJICAgICAgICAgICAvKiBTQy0+bG93ID0gZW5kIG9mIGNsb2NrIGltcHVsc2UgKi8KLSAgaWYodGVtcGFoICYgU2lTX1ByLT5TaVNfRERDX0RhdGEpIHJldHVybigxKTsJCQkgICAvKiBBY2sgT0sgaWYgYml0ID0gMCAqLwotICBlbHNlIHJldHVybigwKTsKKyAgaWYodGVtcGFoICYgU2lTX1ByLT5TaVNfRERDX0RhdGEpIHJldHVybiAxOwkJCSAgIC8qIEFjayBPSyBpZiBiaXQgPSAwICovCisgIHJldHVybiAwOwogfQogCiAvKiBFbmQgb2YgSTJDIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTA2NTYsNjcgKzk2NTUsNjcgQEAKIAogI2lmZGVmIFNJUzMxNUgKIAotc3RhdGljIFVTSE9SVAotR2V0UkFNREFDcm9tcHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK0dldFJBTURBQ3JvbXB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgcm9tcHRyOworICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgIHVuc2lnbmVkIHNob3J0IHJvbXB0cjsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMzApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMzApIHsKICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDEyOCk7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUIzMDJCKQorICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCKQogICAgICAgICByb21wdHIgPSBTSVNHRVRST01XKDB4MTJhKTsKICAgfSBlbHNlIHsKICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDFhOCk7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUIzMDJCKQorICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCKQogICAgICAgICByb21wdHIgPSBTSVNHRVRST01XKDB4MWFhKTsKICAgfQotICByZXR1cm4ocm9tcHRyKTsKKyAgcmV0dXJuIHJvbXB0cjsKIH0KIAotc3RhdGljIFVTSE9SVAotR2V0TENEcm9tcHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK0dldExDRHJvbXB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgcm9tcHRyOworICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgIHVuc2lnbmVkIHNob3J0IHJvbXB0cjsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMzApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMzApIHsKICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDEyMCk7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKQogICAgICAgICByb21wdHIgPSBTSVNHRVRST01XKDB4MTIyKTsKICAgfSBlbHNlIHsKICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDFhMCk7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKQogICAgICAgICByb21wdHIgPSBTSVNHRVRST01XKDB4MWEyKTsKICAgfQotICByZXR1cm4ocm9tcHRyKTsKKyAgcmV0dXJuIHJvbXB0cjsKIH0KIAotc3RhdGljIFVTSE9SVAotR2V0VFZyb21wdHIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorR2V0VFZyb21wdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgVVNIT1JUIHJvbXB0cjsKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCByb21wdHI7CiAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzMwKSB7CisgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzMwKSB7CiAgICAgIHJvbXB0ciA9IFNJU0dFVFJPTVcoMHgxMTQpOwotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpCisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikKICAgICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDExYSk7CiAgIH0gZWxzZSB7CiAgICAgIHJvbXB0ciA9IFNJU0dFVFJPTVcoMHgxOTQpOwotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpCisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikKICAgICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDE5YSk7CiAgIH0KLSAgcmV0dXJuKHJvbXB0cik7CisgIHJldHVybiByb21wdHI7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLUdldExDRFB0ckluZGV4QklPUyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitHZXRMQ0RQdHJJbmRleEJJT1Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBpbmRleDsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXg7CiAKLSAgaWYoKElTX1NJUzY1MCkgJiYgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpKSB7Ci0gICAgIGlmKCEoU2lTX0lzTm90TTY1MG9yTGF0ZXIoU2lTX1ByLCBId0luZm8pKSkgeworICBpZigoSVNfU0lTNjUwKSAmJiAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykpIHsKKyAgICAgaWYoIShTaVNfSXNOb3RNNjUwb3JMYXRlcihTaVNfUHIpKSkgewogICAgICAgICBpZigoaW5kZXggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgJiAweGYwKSkgewogCSAgIGluZGV4ID4+PSA0OwogCSAgIGluZGV4ICo9IDM7CkBAIC0xMDcyOSw3ICs5NzI4LDEyIEBACiAKICAgaW5kZXggPSBTaVNfR2V0QklPU0xDRFJlc0luZm8oU2lTX1ByKSAmIDB4MEY7CiAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSAgICAgIGluZGV4IC09IDU7Ci0gIGVsc2UgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNjAweDEyMDApIGluZGV4IC09IDY7CisgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUMpIHsgIC8qIDEuMTUuMjAgYW5kIGxhdGVyIChub3QgVkIgc3BlY2lmaWMpICovCisgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTYwMHgxMjAwKSBpbmRleCAtPSA1OworICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4NzY4KSBpbmRleCAtPSA1OworICB9IGVsc2UgeworICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE2MDB4MTIwMCkgaW5kZXggLT0gNjsKKyAgfQogICBpbmRleC0tOwogICBpbmRleCAqPSAzOwogICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgaW5kZXggKz0gMjsKQEAgLTEwNzM3LDEwICs5NzQxLDEwIEBACiAgIHJldHVybiBpbmRleDsKIH0KIAotc3RhdGljIFVTSE9SVAotR2V0TENEUHRySW5kZXgoU2lTX1ByaXZhdGUgKlNpU19QcikKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorR2V0TENEUHRySW5kZXgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBpbmRleDsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXg7CiAKICAgaW5kZXggPSAoKFNpU19HZXRCSU9TTENEUmVzSW5mbyhTaVNfUHIpICYgMHgwRikgLSAxKSAqIDM7CiAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSAgICAgICAgIGluZGV4ICs9IDI7CkBAIC0xMDc0OCwxMCArOTc1MiwxMCBAQAogICByZXR1cm4gaW5kZXg7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLUdldFRWUHRySW5kZXgoU2lTX1ByaXZhdGUgKlNpU19QcikKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorR2V0VFZQdHJJbmRleChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVVNIT1JUIGluZGV4OworICB1bnNpZ25lZCBzaG9ydCBpbmRleDsKIAogICBpbmRleCA9IDA7CiAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSBpbmRleCA9IDE7CkBAIC0xMDc2OSwxMCArOTc3MywxMCBAQAogICByZXR1cm4gaW5kZXg7CiB9CiAKLXN0YXRpYyBVTE9ORwotR2V0T0VNVFZQdHI2NjFfMl9HRU4oU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IGFkZG1lKQorc3RhdGljIHVuc2lnbmVkIGludAorR2V0T0VNVFZQdHI2NjFfMl9HRU4oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBhZGRtZSkKIHsKLSAgIFVTSE9SVCBpbmRleCA9IDAsIHRlbXAgPSAwOworICAgdW5zaWduZWQgc2hvcnQgaW5kZXggPSAwLCB0ZW1wID0gMDsKIAogICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpICAgaW5kZXggPSAxOwogICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUxNKSAgaW5kZXggPSAyOwpAQCAtMTA3ODQsNyArOTc4OCw3IEBACiAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldE5UU0NKKSBpbmRleCA9IDc7CiAgICB9CiAKLSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgeworICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CiAgICAgICBpZigoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHx8CiAgICAgICAgICAoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSkgewogCSBpbmRleCArPSBhZGRtZTsKQEAgLTEwNzkyLDI1ICs5Nzk2LDI1IEBACiAgICAgICB9CiAgICAgICB0ZW1wICs9IDB4MDEwMDsKICAgIH0KLSAgIHJldHVybihVTE9ORykoaW5kZXggfCAodGVtcCA8PCAxNikpOworICAgcmV0dXJuICh1bnNpZ25lZCBpbnQpKGluZGV4IHwgKHRlbXAgPDwgMTYpKTsKIH0KIAotc3RhdGljIFVMT05HCi1HZXRPRU1UVlB0cjY2MV8yX09MRChTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIGludAorR2V0T0VNVFZQdHI2NjFfMl9PTEQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICByZXR1cm4oR2V0T0VNVFZQdHI2NjFfMl9HRU4oU2lTX1ByLCA4KSk7CisgICByZXR1cm4gKEdldE9FTVRWUHRyNjYxXzJfR0VOKFNpU19QciwgOCkpOwogfQogCiAjaWYgMAotc3RhdGljIFVMT05HCi1HZXRPRU1UVlB0cjY2MV8yX05FVyhTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIGludAorR2V0T0VNVFZQdHI2NjFfMl9ORVcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICByZXR1cm4oR2V0T0VNVFZQdHI2NjFfMl9HRU4oU2lTX1ByLCA2KSk7CisgICByZXR1cm4gKEdldE9FTVRWUHRyNjYxXzJfR0VOKFNpU19QciwgNikpOwogfQogI2VuZGlmCiAKIHN0YXRpYyBpbnQKLUdldE9FTVRWUHRyNjYxKFNpU19Qcml2YXRlICpTaVNfUHIpCitHZXRPRU1UVlB0cjY2MShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICAgIGludCBpbmRleCA9IDA7CiAKQEAgLTEwODMzLDEwICs5ODM3LDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TZXREZWxheUNvbXAoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywgVVNIT1JUIE1vZGVObykKK1NldERlbGF5Q29tcChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCBkZWxheT0wLGluZGV4LG15aW5kZXgsdGVtcCxyb21wdHI9MDsKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCBkZWxheT0wLGluZGV4LG15aW5kZXgsdGVtcCxyb21wdHI9MDsKICAgQk9PTEVBTiBkb2NoaXB0ZXN0ID0gVFJVRTsKIAogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7CkBAIC0xMDg0OCwxOSArOTg1MiwxOSBAQAogICAvKiBGaW5kIGRlbGF5IChmcm9tIFJPTSwgaW50ZXJuYWwgdGFibGVzLCBQQ0kgc3Vic3lzdGVtKSAqLwogCiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1JBTURBQykgewkJCS8qIC0tLS0tLS0tLS0tLSBWR0EgKi8KLSAgICAgCisKICAgICAgaWYoKFNpU19Qci0+U2lTX1VzZVJPTSkgJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKLSAgICAgICAgcm9tcHRyID0gR2V0UkFNREFDcm9tcHRyKFNpU19QciwgSHdJbmZvKTsKKyAgICAgICAgcm9tcHRyID0gR2V0UkFNREFDcm9tcHRyKFNpU19Qcik7CiAgICAgIH0KICAgICAgaWYocm9tcHRyKSBkZWxheSA9IFJPTUFkZHJbcm9tcHRyXTsKICAgICAgZWxzZSB7CiAgICAgICAgIGRlbGF5ID0gMHgwNDsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQjMwMkIpIHsKKyAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QikgewogCSAgIGlmKElTX1NJUzY1MCkgewogCSAgICAgIGRlbGF5ID0gMHgwYTsKIAkgICB9IGVsc2UgaWYoSVNfU0lTNzQwKSB7CiAJICAgICAgZGVsYXkgPSAweDAwOwotCSAgIH0gZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMzApIHsKKwkgICB9IGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMzApIHsKIAkgICAgICBkZWxheSA9IDB4MGM7CiAJICAgfSBlbHNlIHsKIAkgICAgICBkZWxheSA9IDB4MGM7CkBAIC0xMDkwMSw4ICs5OTA1LDEyIEBACiAJICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJkLDB4MGYsZGVsYXkpOwogCX0gZWxzZSB7CiAJICAgZGVsYXkgPSAweDBjOwotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUMpIGRlbGF5ID0gMHgwMzsKLQkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKKwkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFDKSB7CisJICAgICAgZGVsYXkgPSAweDAzOworCSAgICAgIGlmKChTaVNfUHItPlBhbmVsWFJlcyA+IDEyODApICYmIChTaVNfUHItPlBhbmVsWVJlcyA+IDEwMjQpKSB7CisJICAgICAgICAgZGVsYXkgPSAweDAwOworCSAgICAgIH0KKwkgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewogCSAgICAgIGlmKElTX1NJUzc0MCkgZGVsYXkgPSAweDAxOwogCSAgICAgIGVsc2UgICAgICAgICAgZGVsYXkgPSAweDAzOwogCSAgIH0KQEAgLTEwOTQ3LDEyICs5OTU1LDEyIEBACiAKICAgICAgaWYoIWdvdGl0ZnJvbXBjaSkgewogCi0gICAgICAgIGluZGV4ID0gR2V0TENEUHRySW5kZXhCSU9TKFNpU19QciwgSHdJbmZvKTsKKyAgICAgICAgaW5kZXggPSBHZXRMQ0RQdHJJbmRleEJJT1MoU2lTX1ByKTsKICAgICAgICAgbXlpbmRleCA9IEdldExDRFB0ckluZGV4KFNpU19Qcik7CiAKLSAgICAgICAgaWYoSVNfU0lTNjUwICYmIChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFMVjMwMkxWKSkgeworICAgICAgICBpZihJU19TSVM2NTAgJiYgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpKSB7CiAKLSAgICAgICAgICAgaWYoU2lTX0lzTm90TTY1MG9yTGF0ZXIoU2lTX1ByLCBId0luZm8pKSB7CisgICAgICAgICAgIGlmKFNpU19Jc05vdE02NTBvckxhdGVyKFNpU19QcikpIHsKIAogICAgICAgICAgICAgICBpZigoU2lTX1ByLT5TaVNfVXNlUk9NKSAmJiAoIShTaVNfUHItPlNpU19ST01OZXcpKSkgewogCSAgICAgICAgIC8qIEFsd2F5cyB1c2UgdGhlIHNlY29uZCBwb2ludGVyIG9uIDY1MDsgc29tZSBCSU9TZXMgKi8KQEAgLTEwOTc4LDExICs5OTg2LDEyIEBACiAJCSAgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkJCSAgICAgICYmCiAJICAgICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvICE9IFBhbmVsXzEyODB4MTAyNCkgJiYKIAkJICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAhPSBQYW5lbF8xMjgweDc2OCkgICYmCi0JCSAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTI4MHg5NjApKSB7CisJCSAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTI4MHg5NjApICAmJgorCQkgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvICE9IFBhbmVsXzE2MDB4MTIwMCkgICYmCisJCSAgKChyb21wdHIgPSBHZXRMQ0Ryb21wdHIoU2lTX1ByKSkpKSB7CiAKIAkgICAvKiBEYXRhIGZvciAxMjgweDEwMjQgd3JvbmcgaW4gMzAxQiBCSU9TICovCi0gICAgICAgICAgIHJvbXB0ciA9IEdldExDRHJvbXB0cihTaVNfUHIsIEh3SW5mbyk7Ci0JICAgaWYoIXJvbXB0cikgcmV0dXJuOworCSAgIC8qIERhdGEgZm9yIDE2MDB4MTIwMCB3cm9uZyBpbiAzMDFDIEJJT1MgKi8KIAkgICBkZWxheSA9IFJPTUFkZHJbKHJvbXB0ciArIGluZGV4KV07CiAKICAgICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKQEAgLTEwOTkzLDE0ICsxMDAwMiwxNSBAQAogCX0gZWxzZSB7CiAKICAgICAgICAgICAgZGVsYXkgPSBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fMzAxW215aW5kZXhdOwotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKKwkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSB7CiAJICAgICAgaWYoSVNfU0lTNzQwKSBkZWxheSA9IDB4MDE7Ci0JICAgICAgZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA8PSBTSVNfMzE1UFJPKSBkZWxheSA9IFNpUzMxMF9MQ0REZWxheUNvbXBlbnNhdGlvbl8zeHgzMDFMVltteWluZGV4XTsKKwkgICAgICBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPD0gU0lTXzMxNVBSTykgZGVsYXkgPSBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fM3h4MzAxTFZbbXlpbmRleF07CiAJICAgICAgZWxzZSAgICAgICAgICBkZWxheSA9IFNpUzMxMF9MQ0REZWxheUNvbXBlbnNhdGlvbl82NTAzMDFMVltteWluZGV4XTsKIAkgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQykgewogCSAgICAgIGlmKElTX1NJUzc0MCkgZGVsYXkgPSAweDAxOyAgLyogPyAqLwogCSAgICAgIGVsc2UgICAgICAgICAgZGVsYXkgPSAweDAzOwotCSAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCMzAyQikgeworCSAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTYwMHgxMjAwKSBkZWxheSA9IDB4MDA7IC8qIGV4cGVyaWVuY2UgKi8KKwkgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QikgewogCSAgICAgIGlmKElTX1NJUzc0MCkgZGVsYXkgPSAweDAxOwogCSAgICAgIGVsc2UgICAgICAgICAgZGVsYXkgPSBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fM3h4MzAxQltteWluZGV4XTsKIAkgICB9CkBAIC0xMTAxMywxNCArMTAwMjMsMTQgQEAKIAlTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MkQsMHgwRiwoKGRlbGF5IDw8IDQpICYgMHhmMCkpOwogCWRvY2hpcHRlc3QgPSBGQUxTRTsKICAgICAgfQotICAgICAKKwogICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsJCQkvKiAtLS0tLS0tLS0tLS0gVFYgKi8KIAogICAgICBpbmRleCA9IEdldFRWUHRySW5kZXgoU2lTX1ByKTsKLSAgICAgCi0gICAgIGlmKElTX1NJUzY1MCAmJiAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikpIHsKIAotICAgICAgICBpZihTaVNfSXNOb3RNNjUwb3JMYXRlcihTaVNfUHIsSHdJbmZvKSkgeworICAgICBpZihJU19TSVM2NTAgJiYgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpKSB7CisKKyAgICAgICAgaWYoU2lTX0lzTm90TTY1MG9yTGF0ZXIoU2lTX1ByKSkgewogCiAgICAgICAgICAgIGlmKChTaVNfUHItPlNpU19Vc2VST00pICYmICghKFNpU19Qci0+U2lTX1JPTU5ldykpKSB7CiAJICAgICAgLyogQWx3YXlzIHVzZSB0aGUgc2Vjb25kIHBvaW50ZXIgb24gNjUwOyBzb21lIEJJT1NlcyAqLwpAQCAtMTEwNjIsNyArMTAwNzIsNyBAQAogCiAgICAgIH0gZWxzZSBpZigoU2lTX1ByLT5TaVNfVXNlUk9NKSAmJiAoIShTaVNfUHItPlNpU19ST01OZXcpKSkgewogCi0gICAgICAgIHJvbXB0ciA9IEdldFRWcm9tcHRyKFNpU19QciwgSHdJbmZvKTsKKyAgICAgICAgcm9tcHRyID0gR2V0VFZyb21wdHIoU2lTX1ByKTsKIAlpZighcm9tcHRyKSByZXR1cm47CiAJZGVsYXkgPSBST01BZGRyW3JvbXB0ciArIGluZGV4XTsKIApAQCAtMTEwNzMsNyArMTAwODMsNyBAQAogICAgICB9IGVsc2UgewogCiAJZGVsYXkgPSBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl8zMDFbaW5kZXhdOwotICAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKKyAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CiAJICAgaWYoSVNfU0lTNzQwKSB7CiAJICAgICAgZGVsYXkgPSBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl83NDAzMDFCW2luZGV4XTsKIAkgICAgICAvKiBMVjogdXNlIDMwMSBkYXRhPyBCSU9TIGJ1Zz8gKi8KQEAgLTExMDg1LDE4ICsxMDA5NSwxOCBAQAogCiAgICAgIH0KIAotICAgICBpZihTaVNfTENEQUVuYWJsZWQoU2lTX1ByLCBId0luZm8pKSB7CisgICAgIGlmKFNpU19MQ0RBRW5hYmxlZChTaVNfUHIpKSB7CiAJZGVsYXkgJj0gMHgwZjsKIAlkb2NoaXB0ZXN0ID0gRkFMU0U7CiAgICAgIH0KLSAgICAKKwogICB9IGVsc2UgcmV0dXJuOwogCiAgIC8qIFdyaXRlIGRlbGF5ICovCiAKICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAotICAgICBpZihJU19TSVM2NTAgJiYgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpICYmIGRvY2hpcHRlc3QpIHsKKyAgICAgaWYoSVNfU0lTNjUwICYmIChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSAmJiBkb2NoaXB0ZXN0KSB7CiAKICAgICAgICAgdGVtcCA9IChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgJiAweGYwKSA+PiA0OwogICAgICAgICBpZih0ZW1wID09IDgpIHsJCS8qIDE0MDB4MTA1MCBCSU9TIChDT01QQUwpICovCkBAIC0xMTEzNCwxMSArMTAxNDQsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNldEFudGlGbGlja2VyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCkKK1NldEFudGlGbGlja2VyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCBpbmRleCx0ZW1wLHRlbXAxLHJvbXB0cj0wOworICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgIHVuc2lnbmVkIHNob3J0IGluZGV4LHRlbXAsdGVtcDEscm9tcHRyPTA7CiAKICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI3NTBwfFRWU2V0WVBiUHI1MjVwKSkgcmV0dXJuOwogCkBAIC0xMTE1MiwxNCArMTAxNjEsMTQgQEAKICAgdGVtcDEgPSB0ZW1wOwogCiAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSAmJiAoIShTaVNfUHItPlNpU19ST01OZXcpKSkgewotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzY2MSkgewogICAgICAgICB0ZW1wMSA9IEdldE9FTVRWUHRyNjYxKFNpU19Qcik7CiAgICAgICAgIHRlbXAxID4+PSAxOwogICAgICAgICByb21wdHIgPSBTSVNHRVRST01XKDB4MjYwKTsKLSAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzc2MCkgeworICAgICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU183NjApIHsKIAkgICByb21wdHIgPSBTSVNHRVRST01XKDB4MzYwKTsKIAl9Ci0gICAgIH0gZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzMwKSB7CisgICAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMzApIHsKICAgICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDE5Mik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJvbXB0ciA9IFNJU0dFVFJPTVcoMHgxMTIpOwpAQCAtMTExNzgsMTEgKzEwMTg3LDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TZXRFZGdlRW5oYW5jZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgpCitTZXRFZGdlRW5oYW5jZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCBpbmRleCx0ZW1wLHRlbXAxLHJvbXB0cj0wOworICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgIHVuc2lnbmVkIHNob3J0IGluZGV4LHRlbXAsdGVtcDEscm9tcHRyPTA7CiAKICAgdGVtcCA9IHRlbXAxID0gR2V0VFZQdHJJbmRleChTaVNfUHIpID4+IDE7IAkvKiAwOiBOVFNDL1lQYlByLCAxOiBQQUwsIDI6IEhpVFYgKi8KIApAQCAtMTExOTIsMTQgKzEwMjAwLDE0IEBACiAgICAgIGluZGV4ID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5WQl9FeHRUVkVkZ2VJbmRleDsKIAogICBpZihTaVNfUHItPlNpU19Vc2VST00gJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgeworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsKICAgICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDI2Yyk7Ci0gICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU183NjApIHsKKyAgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNzYwKSB7CiAJICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDM2Yyk7CiAJfQogCXRlbXAxID0gR2V0T0VNVFZQdHI2NjEoU2lTX1ByKTsKICAgICAgICAgdGVtcDEgPj49IDE7Ci0gICAgIH0gZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzMwKSB7CisgICAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMzApIHsKICAgICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDFhNCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJvbXB0ciA9IFNJU0dFVFJPTVcoMHgxMjQpOwpAQCAtMTEyMTcsMTAgKzEwMjI1LDkgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNldFlGaWx0ZXIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLSAgICAgICAgICAgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgpCitTZXRZRmlsdGVyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFVTSE9SVCBpbmRleCwgdGVtcCwgaSwgajsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXgsIHRlbXAsIGksIGo7CiAKICAgaWYoTW9kZU5vIDw9IDB4MTMpIHsKICAgICAgaW5kZXggPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlZCX1N0VFZZRmlsdGVySW5kZXg7CkBAIC0xMTIzNSw3ICsxMDI0Miw3IEBACiAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUxOKSAgICB0ZW1wID0gNDsgIC8qIFBBTC1OICovCiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB0ZW1wID0gMTsgIC8qIEhpVmlzaW9uIHVzZXMgUEFMICovCiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7CisgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgewogICAgICBmb3IoaT0weDM1LCBqPTA7IGk8PTB4Mzg7IGkrKywgaisrKSB7CiAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGksU2lTMzEwX1RWWUZpbHRlcjJbdGVtcF1baW5kZXhdW2pdKTsKICAgICAgfQpAQCAtMTEyNTAsMjMgKzEwMjU3LDIyIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TZXRQaGFzZUluY3IoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLSAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCkKK1NldFBoYXNlSW5jcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgaW5kZXgsdGVtcCxpLGoscmVzaW5mbyxyb21wdHI9MDsKLSAgVUxPTkcgIGxpbmRleDsKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCBpbmRleCx0ZW1wLGksaixyZXNpbmZvLHJvbXB0cj0wOworICB1bnNpZ25lZCBpbnQgIGxpbmRleDsKIAogICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgcmV0dXJuOwogCiAgIC8qIE5UU0MtSiBkYXRhIG5vdCBpbiBCSU9TLCBhbmQgYWxyZWFkeSBzZXQgaW4gU2V0R3JvdXAyICovCiAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0TlRTQ0opIHJldHVybjsKIAotICBpZigoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgfHwgU2lTX1ByLT5TaVNfUk9NTmV3KSB7CisgIGlmKChTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHx8IFNpU19Qci0+U2lTX1JPTU5ldykgewogICAgICBsaW5kZXggPSBHZXRPRU1UVlB0cjY2MV8yX09MRChTaVNfUHIpICYgMHhmZmZmOwogICAgICBsaW5kZXggPDw9IDI7CiAgICAgIGZvcihqPTAsIGk9MHgzMTsgaTw9MHgzNDsgaSsrLCBqKyspIHsKLSAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaSxTaVM2NjFfVFZQaGFzZVtsaW5kZXggKyBqXSk7CisgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGksU2lTX1RWUGhhc2VbbGluZGV4ICsgal0pOwogICAgICB9CiAgICAgIHJldHVybjsKICAgfQpAQCAtMTEyODYsMTcgKzEwMjkyLDE3IEBACiAgICAqLwogICBpZihTaVNfUHItPlNpU19Vc2VST00pIHsKICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDExNik7Ci0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMzApIHsKKyAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzMwKSB7CiAgICAgICAgIHJvbXB0ciA9IFNJU0dFVFJPTVcoMHgxOTYpOwogICAgICB9Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgeworICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKICAgICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDExYyk7Ci0JaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMzMCkgeworCWlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMzMCkgewogCSAgIHJvbXB0ciA9IFNJU0dFVFJPTVcoMHgxOWMpOwogCX0KIAlpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpICYmICghKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkpKSB7CiAJICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDExNik7Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMzMCkgeworCSAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMzMCkgewogICAgICAgICAgICAgICByb21wdHIgPSBTSVNHRVRST01XKDB4MTk2KTsKICAgICAgICAgICAgfQogCX0KQEAgLTExMzExLDcgKzEwMzE3LDcgQEAKICAgICAgaW5kZXggPSB0ZW1wICUgMjsKICAgICAgdGVtcCA+Pj0gMTsgICAgICAgICAgLyogMDpOVFNDLCAxOlBBTCwgMjpIaVRWICovCiAgICAgIGZvcihqPTAsIGk9MHgzMTsgaTw9MHgzNDsgaSsrLCBqKyspIHsKLSAgICAgICAgaWYoIShTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpKQorICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikpCiAJICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaSxTaVMzMTBfVFZQaGFzZUluY3IxW3RlbXBdW2luZGV4XVtqXSk7CiAgICAgICAgIGVsc2UgaWYoKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB8fCAoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSkKICAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaSxTaVMzMTBfVFZQaGFzZUluY3IyW3RlbXBdW2luZGV4XVtqXSk7CkBAIC0xMTMyMCw3ICsxMDMyNiw3IEBACiAgICAgIH0KICAgfQogCi0gIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpICYmICghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSkpIHsKKyAgaWYoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgJiYgKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pKSkgewogICAgICBpZigoIShTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRQQUwgfCBUVlNldFlQYlByNTI1cCB8IFRWU2V0WVBiUHI3NTBwKSkpICYmIChNb2RlTm8gPiAweDEzKSkgewogICAgICAgICBpZigocmVzaW5mbyA9PSBTSVNfUklfNjQweDQ4MCkgfHwKIAkgICAocmVzaW5mbyA9PSBTSVNfUklfODAweDYwMCkpIHsKQEAgLTExMzM5LDExICsxMDM0NSwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotU2V0RGVsYXlDb21wNjYxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sIFVTSE9SVCBNb2RlTm8sCi0gICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVJZEluZGV4LCBVU0hPUlQgUlRJKQorU2V0RGVsYXlDb21wNjYxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJUSSkKIHsKLSAgIFVTSE9SVCBkZWxheSA9IDAsIHJvbXB0ciA9IDAsIGluZGV4LCBsY2RwZGNpbmRleDsKLSAgIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIHNob3J0IGRlbGF5ID0gMCwgcm9tcHRyID0gMCwgaW5kZXgsIGxjZHBkY2luZGV4OworICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOwogCiAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9UViB8IFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEgfCBTZXRDUlQyVG9SQU1EQUMpKSkKICAgICAgIHJldHVybjsKQEAgLTExMzU5LDcgKzEwMzY1LDcgQEAKICAgICAgICAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogCSAgICBpbmRleCA9IFNpU19Qci0+Q1NSQ2xvY2s7CiAgICAgICAgICB9IGVsc2UgaWYoTW9kZU5vID4gMHgxMykgewotICAgICAgICAgICAgaW5kZXggPSBTaVNfR2V0VkNMSzJQdHIoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCxSVEksSHdJbmZvKTsKKyAgICAgICAgICAgIGluZGV4ID0gU2lTX0dldFZDTEsyUHRyKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsUlRJKTsKICAgICAgICAgICAgIGluZGV4ID0gU2lTX1ByLT5TaVNfVkNMS0RhdGFbaW5kZXhdLkNMT0NLOwogICAgICAgICAgfQogCSBpZihpbmRleCA8IDI1KSBpbmRleCA9IDI1OwpAQCAtMTEzODcsNyArMTAzOTMsMzYgQEAKICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgPSAoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlRJXS5FeHRfUERDID4+IDQpOwogICAgZGVsYXkgfD0gKGRlbGF5IDw8IDgpOwogCi0gICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgeworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBYR0lfMjApIHsKKworICAgICAgZGVsYXkgPSAweDA2MDY7CisgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgeworCisJIGRlbGF5ID0gMHgwNDA0OworICAgICAgICAgaWYoU2lTX1ByLT5TaVNfWEdJUk9NKSB7CisJICAgICBpbmRleCA9IEdldFRWUHRySW5kZXgoU2lTX1ByKTsKKwkgICAgIGlmKChyb21wdHIgPSBTSVNHRVRST01XKDB4MzVlKSkpIHsKKwkgICAgICAgIGRlbGF5ID0gKFJPTUFkZHJbcm9tcHRyICsgaW5kZXhdICYgMHgwZikgPDwgMTsKKwkJZGVsYXkgfD0gKGRlbGF5IDw8IDgpOworCSAgICAgfQorCSB9CisKKwkgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKKwkgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBYR0lfNDAgJiYgU2lTX1ByLT5DaGlwUmV2aXNpb24gPT0gMHgwMikgeworCSAgICAgICBkZWxheSAtPSAweDA0MDQ7CisJICAgIH0KKwkgfQorICAgICAgfQorCisgICB9IGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzQwKSB7CisKKyAgICAgIGRlbGF5ID0gMHgwNjA2OworICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKKyAgICAgICAgIGRlbGF5ID0gMHgwNDA0OworICAgICAgfQorICAgICAgLyogVE9ETyAoZXZlbnR1YWxseSkgKi8KKworICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CiAKICAgICAgIC8qIDMuIFRWICovCiAKQEAgLTExNDA2LDcgKzEwNDQxLDcgQEAKICAgICAgIC8qIDQuIExDRCwgTENEQSAoZm9yIG5ldyBST00gb25seSBMViBhbmQgbm9uLVBhc3MgMToxKSAqLwogCiAgICAgICBpZiggKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfQ3VzdG9tKSAmJgotICAgICAgICAgICgocm9tcHRyID0gR2V0TENEU3RydWN0UHRyNjYxXzIoU2lTX1ByLCBId0luZm8pKSkgKSB7CisgICAgICAgICAgKChyb21wdHIgPSBHZXRMQ0RTdHJ1Y3RQdHI2NjFfMihTaVNfUHIpKSkgKSB7CiAKIAkgbGNkcGRjaW5kZXggPSAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfVU1DKSA/IDE0IDogMTI7CiAKQEAgLTExNDI2LDYgKzEwNDYxLDcgQEAKIAkgICAgY2FzZSBQYW5lbF8xMjgweDc2OF8yOmRlbGF5ID0gMHgwMDA0OyBicmVhazsKIAkgICAgY2FzZSBQYW5lbF8xMjgweDgwMDoKIAkgICAgY2FzZSBQYW5lbF8xMjgweDgwMF8yOmRlbGF5ID0gMHgwMDA0OyBicmVhazsgLyogVmVyaWZpZWQgZm9yIDEyODB4ODAwICovCisJICAgIGNhc2UgUGFuZWxfMTI4MHg4NTQ6ICBkZWxheSA9IDB4MDAwNDsgYnJlYWs7IC8qIEZJWE1FICovCiAJICAgIGNhc2UgUGFuZWxfMTI4MHgxMDI0OiBkZWxheSA9IDB4MWUwNDsgYnJlYWs7CiAJICAgIGNhc2UgUGFuZWxfMTQwMHgxMDUwOiBkZWxheSA9IDB4MDAwNDsgYnJlYWs7CiAJICAgIGNhc2UgUGFuZWxfMTYwMHgxMjAwOiBkZWxheSA9IDB4MDQwMDsgYnJlYWs7CkBAIC0xMTQ2OSwxMCArMTA1MDUsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNldENSVDJTeW5jRGl0aGVyNjYxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBSVEkpCitTZXRDUlQyU3luY0RpdGhlcjY2MShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBSVEkpCiB7Ci0gICBVU0hPUlQgaW5mb2ZsYWc7Ci0gICBVQ0hBUiB0ZW1wOworICAgdW5zaWduZWQgc2hvcnQgaW5mb2ZsYWc7CisgICB1bnNpZ25lZCBjaGFyICB0ZW1wOwogCiAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKIApAQCAtMTE1MTMsMTIgKzEwNTQ5LDE2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TZXRQYW5lbFBhcm1zNjYxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTZXRQYW5lbFBhcm1zNjYxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICAgVVNIT1JUIHJvbXB0ciwgdGVtcDEsIHRlbXAyOworICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICAgdW5zaWduZWQgc2hvcnQgcm9tcHRyLCB0ZW1wMSwgdGVtcDI7CiAKLSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFMViB8IFZCX1NJUzMwMkxWIHwgVkJfU0lTMzAyRUxWKSkgeworICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJU0xWRFMgfCBWQl9TSVMzMHhDKSkgeworICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNCwweDBmKTsKKyAgIH0KKworICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewogICAgICAgaWYoU2lTX1ByLT5MVkRTSEwgIT0gLTEpIHsKICAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNCwweGZjLFNpU19Qci0+TFZEU0hMKTsKICAgICAgIH0KQEAgLTExNTI2LDggKzEwNTY2LDggQEAKIAogICAgaWYoU2lTX1ByLT5TaVNfUk9NTmV3KSB7CiAKLSAgICAgIGlmKChyb21wdHIgPSBHZXRMQ0RTdHJ1Y3RQdHI2NjFfMihTaVNfUHIsIEh3SW5mbykpKSB7Ci0gICAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAxTFYgfCBWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKKyAgICAgIGlmKChyb21wdHIgPSBHZXRMQ0RTdHJ1Y3RQdHI2NjFfMihTaVNfUHIpKSkgeworICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewogICAgICAgICAgICAgdGVtcDEgPSAoUk9NQWRkcltyb21wdHJdICYgMHgwMykgfCAweDBjOwogCSAgICB0ZW1wMiA9IDB4ZmM7CiAJICAgIGlmKFNpU19Qci0+TFZEU0hMICE9IC0xKSB7CkBAIC0xMTU0Niw0OCArMTA1ODYsNDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNpU19PRU0zMTBTZXR0aW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCxVU0hPUlQgUlJUSSkKK1NpU19PRU0zMTBTZXR0aW5nKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSUlRJKQogewogICAgaWYoKFNpU19Qci0+U2lTX1JPTU5ldykgJiYgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpKSB7Ci0gICAgICBTZXREZWxheUNvbXA2NjEoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgsUlJUSSk7CisgICAgICBTZXREZWxheUNvbXA2NjEoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSUlRJKTsKICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgewotICAgICAgICAgU2V0Q1JUMlN5bmNEaXRoZXI2NjEoU2lTX1ByLEh3SW5mbyxNb2RlTm8sUlJUSSk7Ci0gICAgICAgICBTZXRQYW5lbFBhcm1zNjYxKFNpU19QcixId0luZm8pOworICAgICAgICAgU2V0Q1JUMlN5bmNEaXRoZXI2NjEoU2lTX1ByLCBNb2RlTm8sIFJSVEkpOworICAgICAgICAgU2V0UGFuZWxQYXJtczY2MShTaVNfUHIpOwogICAgICAgfQogICAgfSBlbHNlIHsKLSAgICAgIFNldERlbGF5Q29tcChTaVNfUHIsSHdJbmZvLE1vZGVObyk7CisgICAgICBTZXREZWxheUNvbXAoU2lTX1ByLE1vZGVObyk7CiAgICB9CiAKICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgewotICAgICAgU2V0QW50aUZsaWNrZXIoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgpOwotICAgICAgU2V0UGhhc2VJbmNyKFNpU19QcixId0luZm8sTW9kZU5vLE1vZGVJZEluZGV4KTsKLSAgICAgIFNldFlGaWx0ZXIoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgpOworICAgICAgU2V0QW50aUZsaWNrZXIoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCk7CisgICAgICBTZXRQaGFzZUluY3IoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCk7CisgICAgICBTZXRZRmlsdGVyKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgpOwogICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSB7Ci0gICAgICAgICBTZXRFZGdlRW5oYW5jZShTaVNfUHIsSHdJbmZvLE1vZGVObyxNb2RlSWRJbmRleCk7CisgICAgICAgICBTZXRFZGdlRW5oYW5jZShTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4KTsKICAgICAgIH0KICAgIH0KIH0KIAogc3RhdGljIHZvaWQKLVNpU19PRU02NjFTZXR0aW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgVVNIT1JUIFJSVEkpCitTaVNfT0VNNjYxU2V0dGluZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJSVEkpCiB7CiAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewogCi0gICAgICBTZXREZWxheUNvbXA2NjEoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgsUlJUSSk7CisgICAgICBTZXREZWxheUNvbXA2NjEoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSUlRJKTsKIAogICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7Ci0gICAgICAgICBTZXRDUlQyU3luY0RpdGhlcjY2MShTaVNfUHIsSHdJbmZvLE1vZGVObyxSUlRJKTsKLSAgICAgICAgIFNldFBhbmVsUGFybXM2NjEoU2lTX1ByLEh3SW5mbyk7CisgICAgICAgICBTZXRDUlQyU3luY0RpdGhlcjY2MShTaVNfUHIsIE1vZGVObywgUlJUSSk7CisgICAgICAgICBTZXRQYW5lbFBhcm1zNjYxKFNpU19Qcik7CiAgICAgICB9CiAKICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgICAgICBTZXRQaGFzZUluY3IoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgpOwotICAgICAgICAgU2V0WUZpbHRlcihTaVNfUHIsSHdJbmZvLE1vZGVObyxNb2RlSWRJbmRleCk7Ci0gICAgICAgICBTZXRBbnRpRmxpY2tlcihTaVNfUHIsSHdJbmZvLE1vZGVObyxNb2RlSWRJbmRleCk7CisgICAgICAgICBTZXRQaGFzZUluY3IoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyAgICAgICAgIFNldFlGaWx0ZXIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyAgICAgICAgIFNldEFudGlGbGlja2VyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CiAgICAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDEpIHsKLSAgICAgICAgICAgIFNldEVkZ2VFbmhhbmNlKFNpU19QcixId0luZm8sTW9kZU5vLE1vZGVJZEluZGV4KTsKKyAgICAgICAgICAgIFNldEVkZ2VFbmhhbmNlKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CiAgICAgICAgICB9CiAgICAgICB9CiAgICB9CkBAIC0xMTYwMSwxMyArMTA2NDAsMTIgQEAKICAqIHByYXkgdGhhdCB3ZSBoYXZlIGEgYmFja3VwLi4uCiAgKi8KIHN0YXRpYyB2b2lkCi1TaVNfRmluYWxpemVMQ0QoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfRmluYWxpemVMQ0Qoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFVTSE9SVCB0ZW1wY2wsdGVtcGNoLHRlbXBibCx0ZW1wYmgsdGVtcGJ4LHRlbXBheCx0ZW1wOwotICBVU0hPUlQgcmVzaW5mbyxtb2RlZmxhZzsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcGNsLHRlbXBjaCx0ZW1wYmwsdGVtcGJoLHRlbXBieCx0ZW1wYXgsdGVtcDsKKyAgdW5zaWduZWQgc2hvcnQgcmVzaW5mbyxtb2RlZmxhZzsKIAotICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpKSByZXR1cm47CisgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykpIHJldHVybjsKICAgaWYoU2lTX1ByLT5TaVNfUk9NTmV3KSByZXR1cm47CiAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7CkBAIC0xMTY3OCw3ICsxMDcxNiw3IEBACiAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHsKLQlpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYpKSB7CisJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRU1JKSB7CiAJICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyYSwweDAwKTsKICNpZmRlZiBTRVRfRU1JCiAJICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgzMCwweDBjKTsKQEAgLTExODA2LDExICsxMDg0NCwxMSBAQAogI2lmZGVmIFNJUzMwMAogCiBzdGF0aWMgdm9pZAotU2V0T0VNTENERGF0YTIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLSAgICAgICAgICAgICAgIFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LCBVU0hPUlQgUmVmVGFiSW5kZXgpCitTZXRPRU1MQ0REYXRhMihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQl1bnNpZ25lZCBzaG9ydCBSZWZUYWJJbmRleCkKIHsKLSAgVVNIT1JUIGNydDJjcnRjPTAsIG1vZGVmbGFnLCBteWluZGV4PTA7Ci0gIFVDSEFSICB0ZW1wOworICB1bnNpZ25lZCBzaG9ydCBjcnQyY3J0Yz0wLCBtb2RlZmxhZywgbXlpbmRleD0wOworICB1bnNpZ25lZCBjaGFyICB0ZW1wOwogICBpbnQgaTsKIAogICBpZihNb2RlTm8gPD0gMHgxMykgewpAQCAtMTE4NDksMjEgKzEwODg3LDIxIEBACiAgIH0KIH0KIAotc3RhdGljIFVTSE9SVAotR2V0T0VNTENEUHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sIGludCBGbGFnKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitHZXRPRU1MQ0RQdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBGbGFnKQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCB0ZW1wYng9MCxyb21wdHI9MDsKLSAgVUNIQVIgY3VzdG9tdGFibGUzMDBbXSA9IHsKLSAgCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wYng9MCxyb21wdHI9MDsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY3VzdG9tdGFibGUzMDBbXSA9IHsKKwkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCiAJMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmCiAgIH07Ci0gIFVDSEFSIGN1c3RvbXRhYmxlNjMwW10gPSB7Ci0gIAkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGN1c3RvbXRhYmxlNjMwW10gPSB7CisJMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAogCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZgogICB9OwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMDApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfMzAwKSB7CiAKICAgICB0ZW1wYnggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgJiAweDBmOwogICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMSkgdGVtcGJ4ICY9IDB4MDc7CkBAIC0xMTkxMiwxMSArMTA5NTAsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNldE9FTUxDRERlbGF5KFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCkKK1NldE9FTUxDRERlbGF5KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgVVNIT1JUIGluZGV4LHRlbXAscm9tcHRyPTA7CisgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXgsdGVtcCxyb21wdHI9MDsKIAogICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsX0N1c3RvbSkgcmV0dXJuOwogCkBAIC0xMTkyNywyMiArMTA5NjQsMjIgQEAKICAgfQogCiAgIC8qIFRoZSBQYW5lbCBDb21wZW5zYXRpb24gRGVsYXkgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gdGFibGVzCi0gICAqIGhlcmUuIFVuZm9ydHVuYXRlbHksIHZhcmlvdXMgQklPUyB2ZXJzaW9ucyBkb24ndCBjYXNlIGFib3V0CisgICAqIGhlcmUuIFVuZm9ydHVuYXRlbHksIHZhcmlvdXMgQklPUyB2ZXJzaW9ucyBkb24ndCBjYXJlIGFib3V0CiAgICAqIGEgdW5pZm9ybSB3YXkgdXNpbmcgZWcuIFJPTSBieXRlIDB4MjIwLCBidXQgdXNlIGRpZmZlcmVudAogICAgKiBoYXJkIGNvZGVkIGRlbGF5cyAoMHgwNCwgMHgyMCwgMHgxOCkgaW4gU2V0R3JvdXAxKCkuCi0gICAqIFRodXMgd2UgZG9uJ3Qgc2V0IHRoaXMgaWYgdGhlIHVzZXIgc2VsZWN0IGEgY3VzdG9tIHBkYyBvciBpZgorICAgKiBUaHVzIHdlIGRvbid0IHNldCB0aGlzIGlmIHRoZSB1c2VyIHNlbGVjdGVkIGEgY3VzdG9tIHBkYyBvciBpZgogICAgKiB3ZSBvdGhlcndpc2UgZGV0ZWN0ZWQgYSB2YWxpZCBwZGMuCiAgICAqLwogICBpZihTaVNfUHItPlBEQyAhPSAtMSkgcmV0dXJuOwogCi0gIHRlbXAgPSBHZXRPRU1MQ0RQdHIoU2lTX1ByLEh3SW5mbywgMCk7CisgIHRlbXAgPSBHZXRPRU1MQ0RQdHIoU2lTX1ByLCAwKTsKIAogICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpCiAgICAgIGluZGV4ID0gMDsKICAgZWxzZQogICAgICBpbmRleCA9IFNpU19Qci0+U2lTX1ZCTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlZCX0xDRERlbGF5SW5kZXg7CiAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgIT0gU0lTXzMwMCkgeworICBpZihTaVNfUHItPkNoaXBUeXBlICE9IFNJU18zMDApIHsKICAgICAgaWYocm9tcHRyKSB7CiAJcm9tcHRyICs9ICh0ZW1wICogMik7CiAJcm9tcHRyID0gU0lTR0VUUk9NVyhyb21wdHIpOwpAQCAtMTE5ODYsMTIgKzExMDIzLDExIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TZXRPRU1MQ0REYXRhKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgIFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4KQorU2V0T0VNTENERGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKICNpZiAwICAvKiBVbmZpbmlzaGVkOyBEYXRhIHRhYmxlIG1pc3NpbmcgKi8KLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgaW5kZXgsdGVtcDsKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCBpbmRleCx0ZW1wOwogCiAgIGlmKChTaVNfUHItPlNpU19Vc2VST00pIHsKICAgICAgaWYoIShST01BZGRyWzB4MjM3XSAmIDB4MDEpKSByZXR1cm47CkBAIC0xMTk5OSw4ICsxMTAzNSw4IEBACiAgICAgIC8qIE5vIHJvbSBwb2ludGVyIGluIEJJT1MgaGVhZGVyISAqLwogICB9CiAKLSAgdGVtcCA9IEdldE9FTUxDRFB0cihTaVNfUHIsSHdJbmZvLCAxKTsKLSAgaWYodGVtcCA9IDB4RkZGRikgcmV0dXJuOworICB0ZW1wID0gR2V0T0VNTENEUHRyKFNpU19QciwgMSk7CisgIGlmKHRlbXAgPT0gMHhGRkZGKSByZXR1cm47CiAKICAgaW5kZXggPSBTaVNfUHItPlNpU19WQk1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5fVkJfTENESEluZGV4OwogICBmb3IoaT0weDE0LCBqPTA7IGk8PTB4MTc7IGkrKywgaisrKSB7CkBAIC0xMjAxOCwxMCArMTEwNTQsMTAgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgVVNIT1JUCi1HZXRPRU1UVlB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitHZXRPRU1UVlB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVVNIT1JUIGluZGV4OworICB1bnNpZ25lZCBzaG9ydCBpbmRleDsKIAogICBpbmRleCA9IDA7CiAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSAgaW5kZXggKz0gNDsKQEAgLTEyMDM3LDExICsxMTA3MywxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotU2V0T0VNVFZEZWxheShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCkKK1NldE9FTVRWRGVsYXkoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgVVNIT1JUIGluZGV4LHRlbXAscm9tcHRyPTA7CisgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXgsdGVtcCxyb21wdHI9MDsKIAogICBpZihTaVNfUHItPlNpU19Vc2VST00pIHsKICAgICAgaWYoIShST01BZGRyWzB4MjM4XSAmIDB4MDEpKSByZXR1cm47CkBAIC0xMjA3MCwxMSArMTExMDUsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNldE9FTUFudGlGbGlja2VyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgpCitTZXRPRU1BbnRpRmxpY2tlcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgaW5kZXgsdGVtcCxyb21wdHI9MDsKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCBpbmRleCx0ZW1wLHJvbXB0cj0wOwogCiAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgewogICAgICBpZighKFJPTUFkZHJbMHgyMzhdICYgMHgwMSkpIHJldHVybjsKQEAgLTEyMDk5LDExICsxMTEzMywxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotU2V0T0VNUGhhc2VJbmNyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgpCitTZXRPRU1QaGFzZUluY3Ioc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObyx1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgaW5kZXgsaSxqLHRlbXAscm9tcHRyPTA7CisgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXgsaSxqLHRlbXAscm9tcHRyPTA7CiAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHJldHVybjsKIApAQCAtMTIxMTksNyArMTExNTIsNyBAQAogCiAgIGluZGV4ID0gU2lTX1ByLT5TaVNfVkJNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uVkJfVFZQaGFzZUluZGV4OwogCi0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgeworICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKICAgICAgZm9yKGk9MHgzMSwgaj0wOyBpPD0weDM0OyBpKyssIGorKykgewogICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCxpLFNpUzMwMF9QaGFzZTJbdGVtcF1baW5kZXhdW2pdKTsKICAgICAgfQpAQCAtMTIxNDAsMTEgKzExMTczLDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TZXRPRU1ZRmlsdGVyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgIFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4KQorU2V0T0VNWUZpbHRlcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgaW5kZXgsdGVtcCxpLGoscm9tcHRyPTA7CisgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXgsdGVtcCxpLGoscm9tcHRyPTA7CiAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb1NDQVJUIHwgU2V0Q1JUMlRvSGlWaXNpb24gfCBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkpIHJldHVybjsKIApAQCAtMTIxNjIsNyArMTExOTQsNyBAQAogCiAgIGluZGV4ID0gU2lTX1ByLT5TaVNfVkJNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uVkJfVFZZRmlsdGVySW5kZXg7CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7CisgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgewogICAgICAgZm9yKGk9MHgzNSwgaj0wOyBpPD0weDM4OyBpKyssIGorKykgewogICAgICAgIAlTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCxpLFNpUzMwMF9GaWx0ZXIyW3RlbXBdW2luZGV4XVtqXSk7CiAgICAgICB9CkBAIC0xMjE4NSwxMSArMTEyMTcsMTEgQEAKICAgfQogfQogCi1zdGF0aWMgVVNIT1JUCi1TaVNfU2VhcmNoVkJNb2RlSUQoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUICpNb2RlTm8pCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19TZWFyY2hWQk1vZGVJRChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgKk1vZGVObykKIHsKLSAgIFVTSE9SVCBNb2RlSWRJbmRleDsKLSAgIFVDSEFSIFZHQUlORk8gPSBTaVNfUHItPlNpU19WR0FJTkZPOworICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXg7CisgICB1bnNpZ25lZCBjaGFyICBWR0FJTkZPID0gU2lTX1ByLT5TaVNfVkdBSU5GTzsKIAogICAgaWYoKk1vZGVObyA8PSA1KSAqTW9kZU5vIHw9IDE7CiAKQEAgLTEyMjEwLDEwICsxMTI0MiwxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotU2lTX09FTTMwMFNldHRpbmcoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLQkJICBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsIFVTSE9SVCBSZWZUYWJsZUluZGV4KQorU2lTX09FTTMwMFNldHRpbmcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCSAgdW5zaWduZWQgc2hvcnQgUmVmVGFibGVJbmRleCkKIHsKLSAgVVNIT1JUIE9FTU1vZGVJZEluZGV4PTA7CisgIHVuc2lnbmVkIHNob3J0IE9FTU1vZGVJZEluZGV4ID0gMDsKIAogICBpZighU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CiAgICAgIE9FTU1vZGVJZEluZGV4ID0gU2lTX1NlYXJjaFZCTW9kZUlEKFNpU19QciwmTW9kZU5vKTsKQEAgLTEyMjIxLDE4ICsxMTI1MywxOCBAQAogICB9CiAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7Ci0gICAgIFNldE9FTUxDRERlbGF5KFNpU19QciwgSHdJbmZvLCBNb2RlTm8sIE9FTU1vZGVJZEluZGV4KTsKKyAgICAgU2V0T0VNTENERGVsYXkoU2lTX1ByLCBNb2RlTm8sIE9FTU1vZGVJZEluZGV4KTsKICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewotICAgICAgICBTZXRPRU1MQ0REYXRhKFNpU19QciwgSHdJbmZvLCBNb2RlTm8sIE9FTU1vZGVJZEluZGV4KTsKKyAgICAgICAgU2V0T0VNTENERGF0YShTaVNfUHIsIE1vZGVObywgT0VNTW9kZUlkSW5kZXgpOwogICAgICB9CiAgIH0KICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSByZXR1cm47CiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgIFNldE9FTVRWRGVsYXkoU2lTX1ByLCBId0luZm8sIE1vZGVObyxPRU1Nb2RlSWRJbmRleCk7CisgICAgIFNldE9FTVRWRGVsYXkoU2lTX1ByLCBNb2RlTm8sT0VNTW9kZUlkSW5kZXgpOwogICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewotICAgICAgICBTZXRPRU1BbnRpRmxpY2tlcihTaVNfUHIsIEh3SW5mbywgTW9kZU5vLCBPRU1Nb2RlSWRJbmRleCk7Ci0gICAgCVNldE9FTVBoYXNlSW5jcihTaVNfUHIsIEh3SW5mbywgTW9kZU5vLCBPRU1Nb2RlSWRJbmRleCk7Ci0gICAgICAgCVNldE9FTVlGaWx0ZXIoU2lTX1ByLCBId0luZm8sIE1vZGVObywgT0VNTW9kZUlkSW5kZXgpOworICAgICAgICBTZXRPRU1BbnRpRmxpY2tlcihTaVNfUHIsIE1vZGVObywgT0VNTW9kZUlkSW5kZXgpOworICAgIAlTZXRPRU1QaGFzZUluY3IoU2lTX1ByLCBNb2RlTm8sIE9FTU1vZGVJZEluZGV4KTsKKyAgICAgICAJU2V0T0VNWUZpbHRlcihTaVNfUHIsIE1vZGVObywgT0VNTW9kZUlkSW5kZXgpOwogICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQzMDEuaCBiL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQzMDEuaAppbmRleCBmODRlYjU0Li5mNDc1YjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0MzAxLmgKKysrIGIvZHJpdmVycy92aWRlby9zaXMvaW5pdDMwMS5oCkBAIC0zLDcgKzMsNyBAQAogLyoKICAqIERhdGEgYW5kIHByb3RvdHlwZXMgZm9yIGluaXQzMDEuYwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCiAgKgogICogSWYgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgdGVybXMKICAqIGFwcGx5OgpAQCAtNTAsMTggKzUwLDE4IEBACiAgKgogICovCiAKLSNpZm5kZWYgIF9JTklUMzAxXwotI2RlZmluZSAgX0lOSVQzMDFfCisjaWZuZGVmICBfSU5JVDMwMV9IXworI2RlZmluZSAgX0lOSVQzMDFfSF8KIAogI2luY2x1ZGUgIm9zZGVmLmgiCiAjaW5jbHVkZSAiaW5pdGRlZi5oIgogCi0jaWZkZWYgTElOVVhfWEY4NgorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpbmNsdWRlICJzaXMuaCIKICNpbmNsdWRlICJzaXNfcmVncy5oIgogI2VuZGlmCiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCiAjaW5jbHVkZSAidmdhdHlwZXMuaCIKICNpbmNsdWRlICJ2c3RydWN0LmgiCiAjaWZkZWYgU0lTX0NQCkBAIC02OSw4ICs2OSwxMyBAQAogI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpbmNsdWRlIDx2aWRlby9mYmNvbi5oPgorI2VuZGlmCisjaW5jbHVkZSAic2lzLmgiCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAjaW5jbHVkZSA8bGludXgvc2lzZmIuaD4KICNlbHNlCkBAIC03OCw3ICs4Myw3IEBACiAjZW5kaWYKICNlbmRpZgogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1lQYlByVGFibGVbM11bNjRdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX1lQYlByVGFibGVbM11bNjRdID0gewogICB7CiAgICAgMHgxNywweDFkLDB4MDMsMHgwOSwweDA1LDB4MDYsMHgwYywweDBjLAogICAgIDB4OTQsMHg0OSwweDAxLDB4MGEsMHgwNiwweDBkLDB4MDQsMHgwYSwKQEAgLTkwLDE3ICs5NSwxNyBAQAogICAgIDB4MDAsMHg0MCwweDQ0LDB4MDAsMHhkYiwweDAyLDB4M2IsMHgwMAogICB9LAogICB7Ci0gICAgMHgxZCwweDExLDB4MDYsMHgwOSwweDBiLDB4MGMsMHgwYywweDBjLAorICAgIDB4MzMsMHgwNiwweDA2LDB4MDksMHgwYiwweDBjLDB4MGMsMHgwYywKICAgICAweDk4LDB4MGEsMHgwMSwweDBkLDB4MDYsMHgwZCwweDA0LDB4MGEsCiAgICAgMHgwNiwweDE0LDB4MGQsMHgwNCwweDBhLDB4MDAsMHg4NSwweDNmLAotICAgIDB4MGMsMHg1MCwweGIyLDB4OWYsMHgxNiwweDU5LDB4NGMgLyoweDRmKi8sMHgxMywKKyAgICAweDBjLDB4NTAsMHhiMiwweDlmLDB4MTYsMHg1OSwweDRmLDB4MTMsCiAgICAgMHhhZCwweDExLDB4YWQsMHgxZCwweDQwLDB4OGEsMHgzZCwweGI4LAotICAgIDB4NTEsMHg1ZSwweDYwLDB4NTcgLyoweDQ5Ki8sMHg3YiAvKjB4N2QqLywweDkyLDB4MGYsMHg0MCwKLSAgICAweDYwLDB4ODAsMHgxNCwweDkwLDB4OGMsMHg2MCwweDE0LDB4NGIsCisgICAgMHg1MSwweDVlLDB4NjAsMHg0OSwweDdkLDB4OTIsMHgwZiwweDQwLAorICAgIDB4NjAsMHg4MCwweDE0LDB4OTAsMHg4YywweDYwLDB4MTQsMHg0ZSwKICAgICAweDQzLDB4NDEsMHgxMSwweDAwLDB4ZmMsMHhmZiwweDMyLDB4MDAKICAgfSwKICAgewotI2lmIDEKKyNpZiAwIC8qIE9LLCBidXQgc3RpY2tzIHRvIGxlZnQgZWRnZSAqLwogICAgIDB4MTMsMHgxZCwweGU4LDB4MDksMHgwOSwweGVkLDB4MGMsMHgwYywKICAgICAweDk4LDB4MGEsMHgwMSwweDBjLDB4MDYsMHgwZCwweDA0LDB4MGEsCiAgICAgMHgwNiwweDE0LDB4MGQsMHgwNCwweDBhLDB4MDAsMHg4NSwweDNmLApAQCAtMTEwLDIwICsxMTUsNDIgQEAKICAgICAweDYwLDB4ODAsMHgxNCwweDkwLDB4OGMsMHg2MCwweDE0LDB4MjcsCiAgICAgMHgwMCwweDQwLDB4MTEsMHgwMCwweGZjLDB4ZmYsMHgzMiwweDAwCiAjZW5kaWYKLSNpZiAwCi0gICAgMHgyYSwweDE0LDB4ZTgsMHgwOSwweDA5LDB4ZWQsMHgwYywweDBjLCAgLyogVEVTVCAoMC45MykgLSBCQUQgKi8KKyNpZiAxIC8qIFBlcmZlY3QgKi8KKyAgICAweDIzLDB4MmQsMHhlOCwweDA5LDB4MDksMHhlZCwweDBjLDB4MGMsCiAgICAgMHg5OCwweDBhLDB4MDEsMHgwYywweDA2LDB4MGQsMHgwNCwweDBhLAogICAgIDB4MDYsMHgxNCwweDBkLDB4MDQsMHgwYSwweDAwLDB4ODUsMHgzZiwKLSAgICAweGVkLDB4NTAsMHg3MCwweDllLDB4MTYsMHg1NywweDZjLDB4MTMsCi0gICAgMHgyNywweDBiLDB4MjcsMHhmYiwweDMwLDB4MjcsMHgxNSwweGIwLAotICAgIDB4M2IsMHhkYiwweDYxLDB4MjQsMHg3OCwweDkyLDB4MGYsMHhmZiwKLSAgICAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDE0LDB4NmYsCi0gICAgMHgwMCwweDUyLDB4YmIsMHgwMCwweGQ1LDB4ZjcsMHhhMiwweDAwCisgICAgMHhlZCwweDUwLDB4NzAsMHg5ZiwweDE2LDB4NTksMHg2MCwweDEzLAorICAgIDB4MjcsMHgwYiwweDI3LDB4ZmMsMHgzMCwweDI3LDB4MWMsMHhiMCwKKyAgICAweDRiLDB4NGIsMHg2ZiwweDJmLDB4NjMsMHg5MiwweDBmLDB4NDAsCisgICAgMHg2MCwweDgwLDB4MTQsMHg5MCwweDhjLDB4NjAsMHgxNCwweDczLAorICAgIDB4MDAsMHg0MCwweDExLDB4MDAsMHhmYywweGZmLDB4MzIsMHgwMAogI2VuZGlmCiAgIH0KIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfSGlUVkdyb3VwM18xW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfVFZQaGFzZVtdID0KK3sKKwkweDIxLDB4RUQsMHhCQSwweDA4LAkvKiAweDAwIFNpU19OVFNDUGhhc2UgKi8KKwkweDJBLDB4MDUsMHhFMywweDAwLAkvKiAweDAxIFNpU19QQUxQaGFzZSAqLworCTB4MjEsMHhFNCwweDJFLDB4OUIsCS8qIDB4MDIgU2lTX1BBTE1QaGFzZSAqLworCTB4MjEsMHhGNCwweDNFLDB4QkEsCS8qIDB4MDMgU2lTX1BBTE5QaGFzZSAqLworCTB4MUUsMHg4QiwweEEyLDB4QTcsCisJMHgxRSwweDgzLDB4MEEsMHhFMCwJLyogMHgwNSBTaVNfU3BlY2lhbFBoYXNlTSAqLworCTB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDIxLDB4RjAsMHg3QiwweEQ2LAkvKiAweDA4IFNpU19OVFNDUGhhc2UyICovCisJMHgyQSwweDA5LDB4ODYsMHhFOSwJLyogMHgwOSBTaVNfUEFMUGhhc2UyICovCisJMHgyMSwweEU2LDB4RUYsMHhBNCwJLyogMHgwYSBTaVNfUEFMTVBoYXNlMiAqLworCTB4MjEsMHhGNiwweDk0LDB4NDYsCS8qIDB4MGIgU2lTX1BBTE5QaGFzZTIgKi8KKwkweDFFLDB4OEIsMHhBMiwweEE3LAorCTB4MUUsMHg4MywweDBBLDB4RTAsCS8qIDB4MGQgU2lTX1NwZWNpYWxQaGFzZU0gKi8KKwkweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgxZSwweDhjLDB4NWMsMHg3YSwJLyogMHgxMCBTaVNfU3BlY2lhbFBoYXNlICovCisJMHgyNSwweGQ0LDB4ZmQsMHg1ZQkvKiAweDExIFNpU19TcGVjaWFsUGhhc2VKICovCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfSGlUVkdyb3VwM18xW10gPSB7CiAgICAgMHgwMCwgMHgxNCwgMHgxNSwgMHgyNSwgMHg1NSwgMHgxNSwgMHgwYiwgMHgxMywKICAgICAweGIxLCAweDQxLCAweDYyLCAweDYyLCAweGZmLCAweGY0LCAweDQ1LCAweGE2LAogICAgIDB4MjUsIDB4MmYsIDB4NjcsIDB4ZjYsIDB4YmYsIDB4ZmYsIDB4OGUsIDB4MjAsCkBAIC0xMzQsNyArMTYxLDcgQEAKICAgICAweDFhLCAweDFmLCAweDI1LCAweDJhLCAweDRjLCAweGFhLCAweDAxCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX0hpVFZHcm91cDNfMltdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX0hpVFZHcm91cDNfMltdID0gewogICAgIDB4MDAsIDB4MTQsIDB4MTUsIDB4MjUsIDB4NTUsIDB4MTUsIDB4MGIsIDB4N2EsCiAgICAgMHg1NCwgMHg0MSwgMHhlNywgMHhlNywgMHhmZiwgMHhmNCwgMHg0NSwgMHhhNiwKICAgICAweDI1LCAweDJmLCAweDY3LCAweGY2LCAweGJmLCAweGZmLCAweDhlLCAweDIwLApAQCAtMTQ3LDcgKzE3NCw3IEBACiAKIC8qIDMwMUMgLyAzMDJFTFYgZXh0ZW5kZWQgUGFydDIgVFYgcmVnaXN0ZXJzICg0IHRhcCBzY2FsZXIpICovCiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfUGFydDJDTFZYXzFbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19QYXJ0MkNMVlhfMVtdID0gewogICAgIDB4MDAsMHgwMCwKICAgICAweDAwLDB4MjAsMHgwMCwweDAwLDB4N0YsMHgyMCwweDAyLDB4N0YsMHg3RCwweDIwLDB4MDQsMHg3RiwweDdELDB4MUYsMHgwNiwweDdFLAogICAgIDB4N0MsMHgxRCwweDA5LDB4N0UsMHg3QywweDFCLDB4MEIsMHg3RSwweDdDLDB4MTksMHgwRSwweDdELDB4N0MsMHgxNywweDExLDB4N0MsCkBAIC0xNTUsNyArMTgyLDcgQEAKICAgICAweDdFLDB4MDksMHgxRCwweDdDLDB4N0YsMHgwNiwweDFGLDB4N0MsMHg3RiwweDA0LDB4MjAsMHg3RCwweDAwLDB4MDIsMHgyMCwweDdFCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1BhcnQyQ0xWWF8yW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfUGFydDJDTFZYXzJbXSA9IHsKICAgICAweDAwLDB4MDAsCiAgICAgMHgwMCwweDIwLDB4MDAsMHgwMCwweDdGLDB4MjAsMHgwMiwweDdGLDB4N0QsMHgyMCwweDA0LDB4N0YsMHg3RCwweDFGLDB4MDYsMHg3RSwKICAgICAweDdDLDB4MUQsMHgwOSwweDdFLDB4N0MsMHgxQiwweDBCLDB4N0UsMHg3QywweDE5LDB4MEUsMHg3RCwweDdDLDB4MTcsMHgxMSwweDdDLApAQCAtMTYzLDcgKzE5MCw3IEBACiAgICAgMHg3RSwweDA5LDB4MUQsMHg3QywweDdGLDB4MDYsMHgxRiwweDdDLDB4N0YsMHgwNCwweDIwLDB4N0QsMHgwMCwweDAyLDB4MjAsMHg3RQogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19QYXJ0MkNMVlhfM1tdID0geyAgLyogTlRTQywgNTI1aSwgNTI1cCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX1BhcnQyQ0xWWF8zW10gPSB7ICAvKiBOVFNDLCA1MjVpLCA1MjVwICovCiAgICAgMHhFMCwweDAxLAogICAgIDB4MDQsMHgxQSwweDA0LDB4N0UsMHgwMywweDFBLDB4MDYsMHg3RCwweDAxLDB4MUEsMHgwOCwweDdELDB4MDAsMHgxOSwweDBBLDB4N0QsCiAgICAgMHg3RiwweDE5LDB4MEMsMHg3QywweDdFLDB4MTgsMHgwRSwweDdDLDB4N0UsMHgxNywweDEwLDB4N0IsMHg3RCwweDE1LDB4MTIsMHg3QywKQEAgLTE4Miw3ICsyMDksNyBAQAogICAgIDB4RkYsMHhGRgogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19QYXJ0MkNMVlhfNFtdID0geyAgIC8qIFBBTCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX1BhcnQyQ0xWWF80W10gPSB7ICAgLyogUEFMICovCiAgICAgMHg1OCwweDAyLAogICAgIDB4MDUsMHgxOSwweDA1LDB4N0QsMHgwMywweDE5LDB4MDYsMHg3RSwweDAyLDB4MTksMHgwOCwweDdELDB4MDEsMHgxOCwweDBBLDB4N0QsCiAgICAgMHgwMCwweDE4LDB4MEMsMHg3QywweDdGLDB4MTcsMHgwRSwweDdDLDB4N0UsMHgxNiwweDBGLDB4N0QsMHg3RSwweDE0LDB4MTEsMHg3RCwKQEAgLTIwMSw3ICsyMjgsNyBAQAogICAgIDB4RkYsMHhGRgogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19QYXJ0MkNMVlhfNVtdID0geyAgIC8qIDc1MHAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19QYXJ0MkNMVlhfNVtdID0geyAgIC8qIDc1MHAgKi8KICAgICAweDAwLDB4MDMsCiAgICAgMHgwNSwweDE5LDB4MDUsMHg3RCwweDAzLDB4MTksMHgwNiwweDdFLDB4MDIsMHgxOSwweDA4LDB4N0QsMHgwMSwweDE4LDB4MEEsMHg3RCwKICAgICAweDAwLDB4MTgsMHgwQywweDdDLDB4N0YsMHgxNywweDBFLDB4N0MsMHg3RSwweDE2LDB4MEYsMHg3RCwweDdFLDB4MTQsMHgxMSwweDdELApAQCAtMjEwLDcgKzIzNyw3IEBACiAgICAgMHhGRiwweEZGCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1BhcnQyQ0xWWF82W10gPSB7ICAgLyogMTA4MGkgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19QYXJ0MkNMVlhfNltdID0geyAgIC8qIDEwODBpICovCiAgICAgMHgwMCwweDA0LAogICAgIDB4MDQsMHgxQSwweDA0LDB4N0UsMHgwMiwweDFCLDB4MDUsMHg3RSwweDAxLDB4MUEsMHgwNywweDdFLDB4MDAsMHgxQSwweDA5LDB4N0QsCiAgICAgMHg3RiwweDE5LDB4MEIsMHg3RCwweDdFLDB4MTgsMHgwRCwweDdELDB4N0QsMHgxNywweDEwLDB4N0MsMHg3RCwweDE1LDB4MTIsMHg3QywKQEAgLTIyMSw3ICsyNDgsNyBAQAogCiAjaWZkZWYgU0lTMzE1SAogLyogNjYxIGV0IGFsIExDRCBkYXRhIHN0cnVjdHVyZSAoMi4wMy4wMCkgKi8KLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfTENEU3RydWN0NjYxW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfTENEU3RydWN0NjYxW10gPSB7CiAgICAgLyogMTAyNHg3NjggKi8KIC8qICB0eXBlfENSMzd8ICAgSERFICAgfCAgIFZERSAgIHwgICAgSFQgICB8ICAgIFZUICAgfCAgIGhzcyAgICB8IGhzZSAgICovCiAgICAgMHgwMiwweEMwLDB4MDAsMHgwNCwweDAwLDB4MDMsMHg0MCwweDA1LDB4MjYsMHgwMywweDEwLDB4MDAsMHg4OCwKQEAgLTI0OSwxMSArMjc2LDIwIEBACiAgICAgLyogMTY4MHgxMDUwICovCiAgICAgMHgwRCwweEUwLDB4OTAsMHgwNiwweDFBLDB4MDQsMHg2QywweDA3LDB4MkEsMHgwNCwweDFBLDB4MDAsMHg0QywKICAgICAweDAwLDB4MDMsMHgwMCwweDA2LDB4MDAsMHg3OSwweEJFLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA2LAorICAgIC8qIDEyODB4ODAwXzMgKi8KKyAgICAweDBDLDB4RTAsMHgwMCwweDA1LDB4MjAsMHgwMywweEFBLDB4MDUsMHgyRSwweDAzLDB4MzAsMHgwMCwweDUwLAorICAgIDB4MDAsMHgwNCwweDAwLDB4MDMsMHgwMCwweDQ3LDB4QTksMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDcsCisgICAgLyogODAweDYwMCAqLworICAgIDB4MDEsMHhDMCwweDIwLDB4MDMsMHg1OCwweDAyLDB4MjAsMHgwNCwweDc0LDB4MDIsMHgyQSwweDAwLDB4ODAsCisgICAgMHgwMCwweDA2LDB4MDAsMHgwNCwweDAwLDB4MjgsMHg2MywweDRCLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAvKiAxMjgweDg1NCAqLworICAgIDB4MDgsMHhFMCwweDAwLDB4MDUsMHg1NiwweDAzLDB4ODAsMHgwNiwweDVkLDB4MDMsMHgxMCwweDAwLDB4NzAsCisgICAgMHgwMCwweDAxLDB4MDAsMHgwMywweDAwLDB4NTQsMHg3NSwweDEzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOAogfTsKICNlbmRpZgogCiAjaWZkZWYgU0lTMzAwCi1zdGF0aWMgVUNIQVIgU2lTMzAwX1RydW1waW9uRGF0YVs3XVs4MF0gPSB7CitzdGF0aWMgdW5zaWduZWQgY2hhciBTaVMzMDBfVHJ1bXBpb25EYXRhWzE0XVs4MF0gPSB7CiAgIHsgMHgwMiwweDBBLDB4MEEsMHgwMSwweDA0LDB4MDEsMHgwMCwweDAzLDB4MEQsMHgwMCwweDBELDB4MTAsMHg3RiwweDAwLDB4ODAsMHgwMiwKICAgICAweDIwLDB4MDMsMHgwQiwweDAwLDB4OTAsMHgwMSwweEMxLDB4MDEsMHg2MCwweDBDLDB4MzAsMHgxMCwweDAwLDB4MDAsMHgwNCwweDIzLAogICAgIDB4MDAsMHgwMCwweDAzLDB4MjgsMHgwMywweDEwLDB4MDUsMHgwOCwweDQwLDB4MTAsMHgwMCwweDEwLDB4MDQsMHgyMywweDAwLDB4MjMsCkBAIC0yODgsMTE5ICszMjQsMTgyIEBACiAgICAgMHg0MCwweDA1LDB4MTMsMHgwMCwweDAwLDB4MDMsMHgyNiwweDAzLDB4ODgsMHgwQywweDMwLDB4OTAsMHgwMCwweDAwLDB4MDQsMHgyMywKICAgICAweDAwLDB4MDEsMHgwMywweDI0LDB4MDMsMHgyOCwweDA2LDB4MDgsMHg0MCwweDkwLDB4MDAsMHg5MCwweDA0LDB4MjMsMHgwMCwweDIzLAogICAgIDB4MDMsMHgxMSwweDYwLDB4NDAsMHgwNSwweEZGLDB4MEYsMHhGNCwweDE4LDB4MDEsMHgwMCwweDA4LDB4MDEsMHgwMCwweDA4LDB4MDEsCi0gICAgMHgwMCwweDA4LDB4MDEsMHgwMSwweDAyLDB4QjAsMHgwMCwweDAwLDB4MDIsMHhCQSwweEYwLDB4NUIsMHgwMSwweEJFLDB4MDEsMHgwMCB9CisgICAgMHgwMCwweDA4LDB4MDEsMHgwMSwweDAyLDB4QjAsMHgwMCwweDAwLDB4MDIsMHhCQSwweEYwLDB4NUIsMHgwMSwweEJFLDB4MDEsMHgwMCB9LAorICAvKiB2YXJpYW50IDIgKi8KKyAgeyAweDAyLDB4MEEsMHgwQSwweDAxLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweDdGLDB4MDAsMHg4MCwweDAyLAorICAgIDB4MjAsMHgwMywweDE1LDB4MDAsMHg5MCwweDAxLDB4QzEsMHgwMSwweDYwLDB4MEMsMHgzMCwweDE4LDB4MDAsMHgwMCwweDA0LDB4MjMsCisgICAgMHgwMCwweDAxLDB4MDMsMHg0NCwweDAzLDB4MjgsMHgwNiwweDA4LDB4NDAsMHgxOCwweDAwLDB4MTgsMHgwNCwweDIzLDB4MDAsMHgyMywKKyAgICAweDAzLDB4MTEsMHg2MCwweEE2LDB4MDEsMHhGRiwweDAzLDB4RkYsMHgxOSwweDAxLDB4MDAsMHgwNSwweDEzLDB4MDQsMHgwNCwweDA1LAorICAgIDB4MDQsMHgwQywweDEzLDB4MEEsMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhGMCwweDU1LDB4MDEsMHhCRSwweDAxLDB4MDAgfSwKKyAgeyAweDAyLDB4MEEsMHgwQSwweDAxLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweDdGLDB4MDAsMHg4MCwweDAyLAorICAgIDB4MjAsMHgwMywweDE1LDB4MDAsMHg5MCwweDAxLDB4QzEsMHgwMSwweDYwLDB4MEMsMHgzMCwweDE4LDB4MDAsMHgwMCwweDA0LDB4MjMsCisgICAgMHgwMCwweDAxLDB4MDMsMHg0NCwweDAzLDB4MjgsMHgwNiwweDA4LDB4NDAsMHgxOCwweDAwLDB4MTgsMHgwNCwweDIzLDB4MDAsMHgyMywKKyAgICAweDAzLDB4MTEsMHg2MCwweEE2LDB4MDEsMHhGRiwweDAzLDB4RkYsMHgxOSwweDAxLDB4MDAsMHgwNSwweDEzLDB4MDQsMHgwNCwweDA1LAorICAgIDB4MDQsMHgwQywweDEzLDB4MEEsMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhGMCwweDU1LDB4MDEsMHhCRSwweDAxLDB4MDAgfSwKKyAgeyAweDAyLDB4MEEsMHgwQSwweDAxLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweDhBLDB4MDAsMHhEOCwweDAyLAorICAgIDB4ODQsMHgwMywweDE2LDB4MDAsMHg5MCwweDAxLDB4QzEsMHgwMSwweDYwLDB4MEMsMHgzMCwweDFDLDB4MDAsMHgyMCwweDA0LDB4MjMsCisgICAgMHgwMCwweDAxLDB4MDMsMHg1MywweDAzLDB4MjgsMHgwNiwweDA4LDB4NDAsMHgxQywweDAwLDB4MTYsMHgwNCwweDIzLDB4MDAsMHgyMywKKyAgICAweDAzLDB4MTEsMHg2MCwweERBLDB4MDEsMHhGRiwweDBGLDB4RjQsMHgxOCwweDA3LDB4MDUsMHgwNSwweDEzLDB4MDQsMHgwNCwweDA1LAorICAgIDB4MDEsMHgwQiwweDEzLDB4MEEsMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhGMCwweDU1LDB4MDEsMHhCRSwweDAxLDB4MDAgfSwKKyAgeyAweDAyLDB4MEEsMHgwQSwweDAxLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweDcyLDB4MDAsMHhEOCwweDAyLAorICAgIDB4ODQsMHgwMywweDE2LDB4MDAsMHg5MCwweDAxLDB4QzEsMHgwMSwweDYwLDB4MEMsMHgzMCwweDFDLDB4MDAsMHgyMCwweDA0LDB4MjMsCisgICAgMHgwMCwweDAxLDB4MDMsMHg1MywweDAzLDB4MjgsMHgwNiwweDA4LDB4NDAsMHgxQywweDAwLDB4MTYsMHgwNCwweDIzLDB4MDAsMHgyMywKKyAgICAweDAzLDB4MTEsMHg2MCwweERBLDB4MDEsMHhGRiwweDBGLDB4RjQsMHgxOCwweDA3LDB4MDUsMHgwNSwweDEzLDB4MDQsMHgwNCwweDA1LAorICAgIDB4MDEsMHgwQiwweDEzLDB4MEEsMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhGMCwweDU1LDB4MDEsMHhCRSwweDAxLDB4MDAgfSwKKyAgeyAweDAyLDB4MEEsMHgwMiwweDAwLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweDdGLDB4MDAsMHg4MCwweDAyLAorICAgIDB4MjAsMHgwMywweDE2LDB4MDAsMHhFMCwweDAxLDB4MEQsMHgwMiwweDYwLDB4MEMsMHgzMCwweDk4LDB4MDAsMHgwMCwweDA0LDB4MjMsCisgICAgMHgwMCwweDAxLDB4MDMsMHg0NSwweDAzLDB4NDgsMHgwNiwweDA4LDB4NDAsMHg5OCwweDAwLDB4OTgsMHgwNCwweDIzLDB4MDAsMHgyMywKKyAgICAweDAzLDB4MTEsMHg2MCwweEY0LDB4MDEsMHhGRiwweDBGLDB4RjQsMHgxOCwweDAxLDB4MDAsMHgwNSwweDAxLDB4MDAsMHgwNSwweDA1LAorICAgIDB4MDQsMHgwQywweDA4LDB4MDUsMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhFQSwweDU4LDB4MDEsMHhCRSwweDAxLDB4MDAgfSwKKyAgeyAweDAyLDB4MEEsMHgwMiwweDAxLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweEJGLDB4MDAsMHgyMCwweDAzLAorICAgIDB4MjAsMHgwNCwweDBELDB4MDAsMHg1OCwweDAyLDB4NzEsMHgwMiwweDgwLDB4MEMsMHgzMCwweDlBLDB4MDAsMHhGQSwweDAzLDB4MUQsCisgICAgMHgwMCwweDAxLDB4MDMsMHgyMiwweDAzLDB4MjgsMHgwNiwweDA4LDB4NDAsMHg5OCwweDAwLDB4OTgsMHgwNCwweDFELDB4MDAsMHgxRCwKKyAgICAweDAzLDB4MTEsMHg2MCwweDM5LDB4MDMsMHg0MCwweDA1LDB4RjQsMHgxOCwweDA3LDB4MDIsMHgwNiwweDA0LDB4MDEsMHgwNiwweDBCLAorICAgIDB4MDIsMHgwQSwweDIwLDB4MTksMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhFQSwweDU4LDB4MDEsMHhCRSwweDAxLDB4MDAgfSwKKyAgeyAweDAyLDB4MEEsMHgwQSwweDAxLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweEVGLDB4MDAsMHgwMCwweDA0LAorICAgIDB4NDAsMHgwNSwweDEzLDB4MDAsMHgwMCwweDAzLDB4MjYsMHgwMywweDg4LDB4MEMsMHgzMCwweDkwLDB4MDAsMHgwMCwweDA0LDB4MjMsCisgICAgMHgwMCwweDAxLDB4MDMsMHgyNCwweDAzLDB4MjgsMHgwNiwweDA4LDB4NDAsMHg5MCwweDAwLDB4OTAsMHgwNCwweDIzLDB4MDAsMHgyMywKKyAgICAweDAzLDB4MTEsMHg2MCwweDQwLDB4MDUsMHhGRiwweDBGLDB4RjQsMHgxOCwweDAxLDB4MDAsMHgwOCwweDAxLDB4MDAsMHgwOCwweDAxLAorICAgIDB4MDAsMHgwOCwweDAxLDB4MDEsMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhFQSwweDU4LDB4MDEsMHhCRSwweDAxLDB4MDAgfQogfTsKICNlbmRpZgogCi12b2lkCVNpU19VbkxvY2tDUlQyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotdm9pZAlTaVNfRW5hYmxlQ1JUMihTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLVVTSE9SVAlTaVNfR2V0UmF0ZVB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotdm9pZAlTaVNfV2FpdFJldHJhY2UxKFNpU19Qcml2YXRlICpTaVNfUHIpOwotQk9PTEVBTglTaVNfSXNEdWFsRWRnZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLUJPT0xFQU4JU2lTX0lzVkFNb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotdm9pZAlTaVNfU2V0Q2hyb250ZWxHUElPKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBteXZiaW5mbyk7Ci12b2lkCVNpU19HZXRWQkluZm8oU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywKLSAgICAgICAgICAgICAgCVVTSE9SVCBNb2RlSWRJbmRleCwgUFNJU19IV19JTkZPIEh3SW5mbywKLQkgICAgICAJaW50IGNoZWNrY3J0Mm1vZGUpOwotdm9pZAlTaVNfU2V0WVBiUHIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyk7Ci12b2lkICAgIFNpU19TZXRUVk1vZGUoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLXZvaWQJU2lTX0dldExDRFJlc0luZm8oU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLVVTSE9SVAlTaVNfR2V0VkNMSzJQdHIoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotVVNIT1JUCVNpU19HZXRSZXNJbmZvKFNpU19Qcml2YXRlICpTaVNfUHIsVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgpOwotdm9pZAlTaVNfRGlzYWJsZUJyaWRnZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLUJPT0xFQU4JU2lTX1NldENSVDJHcm91cChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgTW9kZU5vKTsKLXZvaWQJU2lTX1NpUzMweEJMT24oU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyk7Ci12b2lkCVNpU19TaVMzMHhCTE9mZihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKK3ZvaWQJCVNpU19VbkxvY2tDUlQyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKKyNpZm5kZWYgU0lTX0xJTlVYX0tFUk5FTAordm9pZAkJU2lTX0xvY2tDUlQyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKKyNlbmRpZgordm9pZAkJU2lTX0VuYWJsZUNSVDIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOwordW5zaWduZWQgc2hvcnQJU2lTX0dldFJhdGVQdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpOwordm9pZAkJU2lTX1dhaXRSZXRyYWNlMShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitCT09MRUFOCQlTaVNfSXNEdWFsRWRnZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitCT09MRUFOCQlTaVNfSXNWQU1vZGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOwordm9pZAkJU2lTX0dldFZCSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIGludCBjaGVja2NydDJtb2RlKTsKK3ZvaWQJCVNpU19TZXRZUGJQcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7Cit2b2lkICAgIAlTaVNfU2V0VFZNb2RlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7Cit2b2lkCQlTaVNfR2V0TENEUmVzSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0VkNMSzJQdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCQl1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwordW5zaWduZWQgc2hvcnQJU2lTX0dldFJlc0luZm8oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsdW5zaWduZWQgc2hvcnQgTW9kZU5vLHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKK3ZvaWQJCVNpU19EaXNhYmxlQnJpZGdlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKKyNpZm5kZWYgU0lTX0xJTlVYX0tFUk5FTAordm9pZAkJU2lTX0VuYWJsZUJyaWRnZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CisjZW5kaWYKK0JPT0xFQU4JCVNpU19TZXRDUlQyR3JvdXAoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObyk7Cit2b2lkCQlTaVNfU2lTMzB4QkxPbihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7Cit2b2lkCQlTaVNfU2lTMzB4QkxPZmYoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOwogCi12b2lkICAgCVNpU19TZXRDSDcwMHgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBheCk7Ci1VU0hPUlQgCVNpU19HZXRDSDcwMHgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBheCk7Ci12b2lkICAgCVNpU19TZXRDSDcwMXgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBheCk7Ci1VU0hPUlQgCVNpU19HZXRDSDcwMXgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBheCk7Ci12b2lkICAgCVNpU19TZXRDSDcweHhBTkRPUihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGF4LFVTSE9SVCB0ZW1wYmgpOwordm9pZAkJU2lTX1NldENINzAweChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCk7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0Q0g3MDB4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCB0ZW1wYXgpOwordm9pZAkJU2lTX1NldENINzAxeChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCk7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0Q0g3MDF4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCB0ZW1wYXgpOworI2lmbmRlZiBTSVNfTElOVVhfS0VSTkVMCit2b2lkCQlTaVNfU2V0Q0g3MHh4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK3Vuc2lnbmVkIHNob3J0CVNpU19HZXRDSDcweHgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHRlbXBheCk7CisjZW5kaWYKK3ZvaWQJCVNpU19TZXRDSDcweHhBTkRPUihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJdW5zaWduZWQgY2hhciBvcnZhbCx1bnNpZ25lZCBzaG9ydCBhbmR2YWwpOwogI2lmZGVmIFNJUzMxNUgKLXN0YXRpYyB2b2lkICAgCVNpU19DaHJvbnRlbDcwMXhPbihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLXN0YXRpYyB2b2lkICAgCVNpU19DaHJvbnRlbDcwMXhPZmYoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyk7Ci1zdGF0aWMgdm9pZCAgIAlTaVNfQ2hyb250ZWxJbml0VFZWU3luYyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLXN0YXRpYyB2b2lkICAJU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotdm9pZCAgIAlTaVNfQ2hyb250ZWw3MDF4QkxPbihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLXZvaWQgICAJU2lTX0Nocm9udGVsNzAxeEJMT2ZmKFNpU19Qcml2YXRlICpTaVNfUHIpOworc3RhdGljIHZvaWQJU2lTX0Nocm9udGVsNzAxeE9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB2b2lkCVNpU19DaHJvbnRlbDcwMXhPZmYoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworc3RhdGljIHZvaWQJU2lTX0Nocm9udGVsSW5pdFRWVlN5bmMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworc3RhdGljIHZvaWQJU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3ZvaWQJCVNpU19DaHJvbnRlbDcwMXhCTE9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3ZvaWQJCVNpU19DaHJvbnRlbDcwMXhCTE9mZihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CiAjZW5kaWYgLyogMzE1ICovCiAKICNpZmRlZiBTSVMzMDAKLSNpZiAwCi1zdGF0aWMgIHZvaWQgICAgU2lTX1NldFRydW1wUmVnKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB0ZW1wYngpOwotc3RhdGljICBVU0hPUlQgIFNpU19HZXRUcnVtcFJlZyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4KTsKLSNlbmRpZgotc3RhdGljICBCT09MRUFOCVNpU19TZXRUcnVtcGlvbkJsb2NrKFNpU19Qcml2YXRlICpTaVNfUHIsIFVDSEFSICpkYXRhcHRyKTsKK3N0YXRpYyAgQk9PTEVBTglTaVNfU2V0VHJ1bXBpb25CbG9jayhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgY2hhciAqZGF0YXB0cik7Cit2b2lkCQlTaVNfU2V0Q2hyb250ZWxHUElPKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBteXZiaW5mbyk7CiAjZW5kaWYKIAotdm9pZCAgICBTaVNfRERDMkRlbGF5KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBkZWxheXRpbWUpOwotVVNIT1JUICBTaVNfUmVhZEREQzFCaXQoU2lTX1ByaXZhdGUgKlNpU19Qcik7Ci1VU0hPUlQgIFNpU19IYW5kbGVEREMoU2lTX1ByaXZhdGUgKlNpU19QciwgVUxPTkcgVkJGbGFncywgaW50IFZHQUVuZ2luZSwKLQkJICAgICAgVVNIT1JUIGFkYXB0bnVtLCBVU0hPUlQgRERDZGF0YXR5cGUsIFVDSEFSICpidWZmZXIpOwotI2lmZGVmIExJTlVYX1hGODYKLVVTSE9SVCAgU2lTX1NlbnNlTENERERDKFNpU19Qcml2YXRlICpTaVNfUHIsIFNJU1B0ciBwU2lTKTsKLVVTSE9SVCAgU2lTX1NlbnNlVkdBMkREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTSVNQdHIgcFNpUyk7Ci0jZW5kaWYKK3ZvaWQJCVNpU19EREMyRGVsYXkoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGludCBkZWxheXRpbWUpOwordW5zaWduZWQgc2hvcnQJU2lTX1JlYWREREMxQml0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3Vuc2lnbmVkIHNob3J0CVNpU19IYW5kbGVEREMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGludCBWQkZsYWdzLCBpbnQgVkdBRW5naW5lLAorCQkJdW5zaWduZWQgc2hvcnQgYWRhcHRudW0sIHVuc2lnbmVkIHNob3J0IEREQ2RhdGF0eXBlLAorCQkJdW5zaWduZWQgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgVkJGbGFnczIpOwogCi1zdGF0aWMgdm9pZCAgICAJU2lTX1NldFN3aXRjaEREQzIoU2lTX1ByaXZhdGUgKlNpU19Qcik7Ci1zdGF0aWMgVVNIT1JUICAJU2lTX1NldFN0YXJ0KFNpU19Qcml2YXRlICpTaVNfUHIpOwotc3RhdGljIFVTSE9SVCAgCVNpU19TZXRTdG9wKFNpU19Qcml2YXRlICpTaVNfUHIpOwotc3RhdGljIFVTSE9SVCAgCVNpU19TZXRTQ0xLTG93KFNpU19Qcml2YXRlICpTaVNfUHIpOwotc3RhdGljIFVTSE9SVCAgCVNpU19TZXRTQ0xLSGlnaChTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLXN0YXRpYyBVU0hPUlQgIAlTaVNfUmVhZEREQzJEYXRhKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB0ZW1wYXgpOwotc3RhdGljIFVTSE9SVCAgCVNpU19Xcml0ZUREQzJEYXRhKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB0ZW1wYXgpOwotc3RhdGljIFVTSE9SVCAgCVNpU19DaGVja0FDSyhTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLXN0YXRpYyBVU0hPUlQgIAlTaVNfSW5pdEREQ1JlZ3MoU2lTX1ByaXZhdGUgKlNpU19QciwgVUxPTkcgVkJGbGFncywgaW50IFZHQUVuZ2luZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCBhZGFwdG51bSwgVVNIT1JUIEREQ2RhdGF0eXBlLCBCT09MRUFOIGNoZWNrY3IzMik7Ci1zdGF0aWMgVVNIT1JUICAJU2lTX1dyaXRlREFCRERDKFNpU19Qcml2YXRlICpTaVNfUHIpOwotc3RhdGljIFVTSE9SVCAgCVNpU19QcmVwYXJlUmVhZEREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLXN0YXRpYyBVU0hPUlQgIAlTaVNfUHJlcGFyZUREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLXN0YXRpYyB2b2lkICAgIAlTaVNfU2VuZEFDSyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgeWVzbm8pOwotc3RhdGljIFVTSE9SVCAgCVNpU19Eb1Byb2JlRERDKFNpU19Qcml2YXRlICpTaVNfUHIpOwotc3RhdGljIFVTSE9SVCAgCVNpU19Qcm9iZUREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLXN0YXRpYyBVU0hPUlQgIAlTaVNfUmVhZEREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgRERDZGF0YXR5cGUsIFVDSEFSICpidWZmZXIpOwotCi0jaWZkZWYgU0lTMzE1SAotc3RhdGljIHZvaWQgICAgCVNpU19PRU0zMTBTZXR0aW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgVVNIT1JUIFJSVEkpOwotc3RhdGljIHZvaWQgICAgCVNpU19PRU02NjFTZXR0aW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgVVNIT1JUIFJSVEkpOwotc3RhdGljIHZvaWQgICAgCVNpU19GaW5hbGl6ZUxDRChTaVNfUHJpdmF0ZSAqLCBVU0hPUlQsIFVTSE9SVCwgUFNJU19IV19JTkZPKTsKKyNpZmRlZiBTSVNfWE9SR19YRjg2Cit1bnNpZ25lZCBzaG9ydAkJU2lTX0luaXRERENSZWdzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBpbnQgVkJGbGFncywKKwkJCQlpbnQgVkdBRW5naW5lLCB1bnNpZ25lZCBzaG9ydCBhZGFwdG51bSwgdW5zaWduZWQgc2hvcnQgRERDZGF0YXR5cGUsCisJCQkJQk9PTEVBTiBjaGVja2NyMzIsIHVuc2lnbmVkIGludCBWQkZsYWdzMik7Cit1bnNpZ25lZCBzaG9ydAkJU2lTX1Byb2JlRERDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3Vuc2lnbmVkIHNob3J0CQlTaVNfUmVhZEREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgRERDZGF0YXR5cGUsCisJCQkJdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgc2hvcnQJU2lTX0luaXRERENSZWdzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBpbnQgVkJGbGFncywKKwkJCQlpbnQgVkdBRW5naW5lLCB1bnNpZ25lZCBzaG9ydCBhZGFwdG51bSwgdW5zaWduZWQgc2hvcnQgRERDZGF0YXR5cGUsCisJCQkJQk9PTEVBTiBjaGVja2NyMzIsIHVuc2lnbmVkIGludCBWQkZsYWdzMik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQJU2lTX1Byb2JlRERDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfUmVhZEREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgRERDZGF0YXR5cGUsCisJCQkJdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKICNlbmRpZgorc3RhdGljIHZvaWQJCVNpU19TZXRTd2l0Y2hEREMyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfU2V0U3RhcnQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworc3RhdGljIHVuc2lnbmVkIHNob3J0CVNpU19TZXRTdG9wKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfU2V0U0NMS0xvdyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQJU2lTX1NldFNDTEtIaWdoKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfUmVhZEREQzJEYXRhKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfV3JpdGVEREMyRGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgdGVtcGF4KTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfQ2hlY2tBQ0soc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworc3RhdGljIHVuc2lnbmVkIHNob3J0CVNpU19Xcml0ZURBQkREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQJU2lTX1ByZXBhcmVSZWFkRERDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfUHJlcGFyZUREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitzdGF0aWMgdm9pZAkJU2lTX1NlbmRBQ0soc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHllc25vKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfRG9Qcm9iZUREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CisKICNpZmRlZiBTSVMzMDAKLXN0YXRpYyB2b2lkICAgIAlTaVNfT0VNMzAwU2V0dGluZyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LCBVU0hPUlQgUmVmVGFiaW5kZXgpOwotc3RhdGljIHZvaWQgICAgCVNldE9FTUxDRERhdGEyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0JCSAgICAgICAgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LFVTSE9SVCBSZWZUYWJsZUluZGV4KTsKK3N0YXRpYyB2b2lkCQlTaVNfT0VNMzAwU2V0dGluZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSZWZUYWJpbmRleCk7CitzdGF0aWMgdm9pZAkJU2V0T0VNTENERGF0YTIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsCisJCQkJdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCx1bnNpZ25lZCBzaG9ydCBSZWZUYWJsZUluZGV4KTsKKyNlbmRpZgorI2lmZGVmIFNJUzMxNUgKK3N0YXRpYyB2b2lkCQlTaVNfT0VNMzEwU2V0dGluZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlTm8sdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJSVEkpOworc3RhdGljIHZvaWQJCVNpU19PRU02NjFTZXR0aW5nKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVObyx1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUlJUSSk7CitzdGF0aWMgdm9pZAkJU2lTX0ZpbmFsaXplTENEKHN0cnVjdCBTaVNfUHJpdmF0ZSAqLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOwogI2VuZGlmCiAKLWV4dGVybiB2b2lkICAgICBTaVNfU2V0UmVnKFNJU0lPQUREUkVTUywgVVNIT1JULCBVU0hPUlQpOwotZXh0ZXJuIHZvaWQgICAgIFNpU19TZXRSZWdCeXRlKFNJU0lPQUREUkVTUywgVVNIT1JUKTsKLWV4dGVybiB2b2lkICAgICBTaVNfU2V0UmVnU2hvcnQoU0lTSU9BRERSRVNTLCBVU0hPUlQpOwotZXh0ZXJuIHZvaWQgICAgIFNpU19TZXRSZWdMb25nKFNJU0lPQUREUkVTUywgVUxPTkcpOwotZXh0ZXJuIFVDSEFSICAgIFNpU19HZXRSZWcoU0lTSU9BRERSRVNTLCBVU0hPUlQpOwotZXh0ZXJuIFVDSEFSICAgIFNpU19HZXRSZWdCeXRlKFNJU0lPQUREUkVTUyk7Ci1leHRlcm4gVVNIT1JUICAgU2lTX0dldFJlZ1Nob3J0KFNJU0lPQUREUkVTUyk7Ci1leHRlcm4gVUxPTkcgICAgU2lTX0dldFJlZ0xvbmcoU0lTSU9BRERSRVNTKTsKLWV4dGVybiB2b2lkICAgICBTaVNfU2V0UmVnQU5ET1IoU0lTSU9BRERSRVNTLCBVU0hPUlQsIFVTSE9SVCwgVVNIT1JUKTsKLWV4dGVybiB2b2lkICAgICBTaVNfU2V0UmVnT1IoU0lTSU9BRERSRVNTLCBVU0hPUlQsIFVTSE9SVCk7Ci1leHRlcm4gdm9pZCAgICAgU2lTX1NldFJlZ0FORChTSVNJT0FERFJFU1MsIFVTSE9SVCwgVVNIT1JUKTsKLWV4dGVybiB2b2lkICAgICBTaVNfRGlzcGxheU9mZihTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLWV4dGVybiB2b2lkICAgICBTaVNfRGlzcGxheU9uKFNpU19Qcml2YXRlICpTaVNfUHIpOwotZXh0ZXJuIEJPT0xFQU4gIFNpU19TZWFyY2hNb2RlSUQoU2lTX1ByaXZhdGUgKiwgVVNIT1JUICosIFVTSE9SVCAqKTsKLWV4dGVybiBVQ0hBUiAgICBTaVNfR2V0TW9kZVB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgpOwotZXh0ZXJuIFVTSE9SVCAgIFNpU19HZXRDb2xvckRlcHRoKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCk7Ci1leHRlcm4gVVNIT1JUICAgU2lTX0dldE9mZnNldChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgCVVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotZXh0ZXJuIHZvaWQgICAgIFNpU19Mb2FkREFDKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTywgVVNIT1JUIE1vZGVObywKLSAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCBNb2RlSWRJbmRleCk7Ci1leHRlcm4gdm9pZAlTaVNfQ2FsY0xDREFDUlQxVGltaW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCk7Ci0jaWZkZWYgTElOVVhfWEY4NgotZXh0ZXJuIHZvaWQgICAgIFNpU19NYWtlQ2xvY2tSZWdzKFNjcm5JbmZvUHRyIHBTY3JuLCBpbnQgY2xvY2ssIFVDSEFSICpwMmIsIFVDSEFSICpwMmMpOwotZXh0ZXJuIGludCAJU2lTX0ZpbmRQYW5lbEZyb21EQihTSVNQdHIgcFNpUywgVVNIT1JUIHBhbmVsdmVuZG9yLCBVU0hPUlQgcGFuZWxwcm9kdWN0LAotCQkJaW50ICptYXh4LCBpbnQgKm1heHksIGludCAqcHJlZngsIGludCAqcHJlZnkpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRSZWcoU0lTSU9BRERSRVNTLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRSZWdCeXRlKFNJU0lPQUREUkVTUywgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRSZWdTaG9ydChTSVNJT0FERFJFU1MsIHVuc2lnbmVkIHNob3J0KTsKK2V4dGVybiB2b2lkCQlTaVNfU2V0UmVnTG9uZyhTSVNJT0FERFJFU1MsIHVuc2lnbmVkIGludCk7CitleHRlcm4gdW5zaWduZWQgY2hhcglTaVNfR2V0UmVnKFNJU0lPQUREUkVTUywgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIJU2lTX0dldFJlZ0J5dGUoU0lTSU9BRERSRVNTKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0UmVnU2hvcnQoU0lTSU9BRERSRVNTKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQJU2lTX0dldFJlZ0xvbmcoU0lTSU9BRERSRVNTKTsKK2V4dGVybiB2b2lkCQlTaVNfU2V0UmVnQU5ET1IoU0lTSU9BRERSRVNTLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKK2V4dGVybiB2b2lkCQlTaVNfU2V0UmVnT1IoU0lTSU9BRERSRVNTLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRSZWdBTkQoU0lTSU9BRERSRVNTLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQJCVNpU19EaXNwbGF5T2ZmKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK2V4dGVybiB2b2lkCQlTaVNfRGlzcGxheU9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK2V4dGVybiBCT09MRUFOCQlTaVNfU2VhcmNoTW9kZUlEKHN0cnVjdCBTaVNfUHJpdmF0ZSAqLCB1bnNpZ25lZCBzaG9ydCAqLCB1bnNpZ25lZCBzaG9ydCAqKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0TW9kZUZsYWcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQJU2lTX0dldE1vZGVQdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19HZXRDb2xvckRlcHRoKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0T2Zmc2V0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJCXVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CitleHRlcm4gdm9pZAkJU2lTX0xvYWREQUMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7CitleHRlcm4gdm9pZAkJU2lTX0NhbGNMQ0RBQ1JUMVRpbWluZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKK2V4dGVybiB2b2lkCQlTaVNfQ2FsY0NSUmVnaXN0ZXJzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgZGVwdGgpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19HZXRSZWZDUlRWQ0xLKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBJbmRleCwgaW50IFVzZVdpZGUpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19HZXRSZWZDUlQxQ1JUQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgSW5kZXgsIGludCBVc2VXaWRlKTsKKyNpZmRlZiBTSVMzMDAKK2V4dGVybiB2b2lkCQlTaVNfR2V0RklGT1RocmVzaG9sZEluZGV4MzAwKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCAqdGVtcGJ4LAorCQkJCXVuc2lnbmVkIHNob3J0ICp0ZW1wY2wpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19HZXRGSUZPVGhyZXNob2xkQjMwMCh1bnNpZ25lZCBzaG9ydCB0ZW1wYngsIHVuc2lnbmVkIHNob3J0IHRlbXBjbCk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQJU2lTX0dldExhdGVuY3lGYWN0b3I2MzAoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IGluZGV4KTsKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCitleHRlcm4gdW5zaWduZWQgaW50CXNpc2ZiX3JlYWRfbmJyaWRnZV9wY2lfZHdvcmQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcpOworZXh0ZXJuIHVuc2lnbmVkIGludAlzaXNmYl9yZWFkX2xwY19wY2lfZHdvcmQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcpOworI2VuZGlmCiAjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0ZGVmLmggYi9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0ZGVmLmgKaW5kZXggNTVhODJkNi4uMjY0YjU1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvaW5pdGRlZi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL2luaXRkZWYuaApAQCAtMyw3ICszLDcgQEAKIC8qCiAgKiBHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIGluaXQuYyBhbmQgaW5pdDMwMS5jCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKICAqCiAgKiBJZiBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIHRoZSBmb2xsb3dpbmcgbGljZW5zZSB0ZXJtcwogICogYXBwbHk6CkBAIC01MywxOSArNTMsMjAgQEAKICNpZm5kZWYgX0lOSVRERUZfCiAjZGVmaW5lIF9JTklUREVGXwogCi0jZGVmaW5lIElTX1NJUzMzMAkJKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMzApCi0jZGVmaW5lIElTX1NJUzU1MAkJKEh3SW5mby0+akNoaXBUeXBlID09IFNJU181NTApCi0jZGVmaW5lIElTX1NJUzY1MAkJKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182NTApICAvKiBBbGwgdmVyc2lvbnMsIGluY2wgNjUxLCBNNjV4ICovCi0jZGVmaW5lIElTX1NJUzc0MAkJKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApCisjZGVmaW5lIElTX1NJUzMzMAkJKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMzMCkKKyNkZWZpbmUgSVNfU0lTNTUwCQkoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNTUwKQorI2RlZmluZSBJU19TSVM2NTAJCShTaVNfUHItPkNoaXBUeXBlID09IFNJU182NTApICAvKiBBbGwgdmVyc2lvbnMsIGluY2wgNjUxLCBNNjV4ICovCisjZGVmaW5lIElTX1NJUzc0MAkJKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkKICNkZWZpbmUgSVNfU0lTNjUxCSAgICAgICAgKFNpU19Qci0+U2lTX1N5c0ZsYWdzICYgKFNGX0lzNjUxIHwgU0ZfSXM2NTIpKQogI2RlZmluZSBJU19TSVNNNjUwCSAgICAgICAgKFNpU19Qci0+U2lTX1N5c0ZsYWdzICYgKFNGX0lzTTY1MCB8IFNGX0lzTTY1MiB8IFNGX0lzTTY1MykpCiAjZGVmaW5lIElTX1NJUzY1eCAgICAgICAgICAgICAgIChJU19TSVM2NTEgfHwgSVNfU0lTTTY1MCkgICAgICAgLyogT25seSBzcGVjaWFsIHZlcnNpb25zIG9mIDY1eCAqLwotI2RlZmluZSBJU19TSVM2NjEJCShId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjYxKQotI2RlZmluZSBJU19TSVM3NDEJCShId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQxKQotI2RlZmluZSBJU19TSVM2NjAJCShId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjYwKQotI2RlZmluZSBJU19TSVM3NjAJCShId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzYwKQotI2RlZmluZSBJU19TSVM2NjE3NDE2NjA3NjAJKElTX1NJUzY2MSB8fCBJU19TSVM3NDEgfHwgSVNfU0lTNjYwIHx8IElTX1NJUzc2MCkKLSNkZWZpbmUgSVNfU0lTNjUwNzQwICAgICAgICAgICAgKChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjUwKSAmJiAoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzMwKSkKKyNkZWZpbmUgSVNfU0lTNjYxCQkoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNjYxKQorI2RlZmluZSBJU19TSVM3NDEJCShTaVNfUHItPkNoaXBUeXBlID09IFNJU183NDEpCisjZGVmaW5lIElTX1NJUzY2MAkJKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzY2MCkKKyNkZWZpbmUgSVNfU0lTNzYwCQkoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzYwKQorI2RlZmluZSBJU19TSVM3NjEJCShTaVNfUHItPkNoaXBUeXBlID09IFNJU183NjEpCisjZGVmaW5lIElTX1NJUzY2MTc0MTY2MDc2MAkoSVNfU0lTNjYxIHx8IElTX1NJUzc0MSB8fCBJU19TSVM2NjAgfHwgSVNfU0lTNzYwIHx8IElTX1NJUzc2MSkKKyNkZWZpbmUgSVNfU0lTNjUwNzQwICAgICAgICAgICAgKChTaVNfUHItPkNoaXBUeXBlID49IFNJU182NTApICYmIChTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMzMCkpCiAjZGVmaW5lIElTX1NJUzU1MDY1MDc0MCAgICAgICAgIChJU19TSVM1NTAgfHwgSVNfU0lTNjUwNzQwKQogI2RlZmluZSBJU19TSVM2NTA3NDA2NjAgICAgICAgICAoSVNfU0lTNjUwIHx8IElTX1NJUzc0MCB8fCBJU19TSVM2NjE3NDE2NjA3NjApCiAjZGVmaW5lIElTX1NJUzU1MDY1MDc0MDY2MCAgICAgIChJU19TSVM1NTAgfHwgSVNfU0lTNjUwNzQwNjYwKQpAQCAtNzMsMjQgKzc0LDM3IEBACiAjZGVmaW5lIFNJU0dFVFJPTVcoeCkJCShST01BZGRyWyh4KV0gfCAoUk9NQWRkclsoeCkrMV0gPDwgOCkpCiAKIC8qIFNpU19WQlR5cGUgKi8KLSNkZWZpbmUgVkJfU0lTMzAxCSAgICAgIAkweDAwMDEKLSNkZWZpbmUgVkJfU0lTMzAxQiAgICAgICAgCTB4MDAwMgotI2RlZmluZSBWQl9TSVMzMDJCICAgICAgICAJMHgwMDA0Ci0jZGVmaW5lIFZCX1NJUzMwMUxWICAgICAJMHgwMDA4Ci0jZGVmaW5lIFZCX1NJUzMwMkxWICAgICAJMHgwMDEwCisjZGVmaW5lIFZCX1NJUzMwMQkJMHgwMDAxCisjZGVmaW5lIFZCX1NJUzMwMUIJCTB4MDAwMgorI2RlZmluZSBWQl9TSVMzMDJCCQkweDAwMDQKKyNkZWZpbmUgVkJfU0lTMzAxTFYJCTB4MDAwOAorI2RlZmluZSBWQl9TSVMzMDJMVgkJMHgwMDEwCiAjZGVmaW5lIFZCX1NJUzMwMkVMVgkJMHgwMDIwCi0jZGVmaW5lIFZCX1NJUzMwMUMgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBWQl9TSVMzMDFDCQkweDAwNDAKKyNkZWZpbmUgVkJfU0lTMzA3VAkJMHgwMDgwCisjZGVmaW5lIFZCX1NJUzMwN0xWCQkweDAxMDAKICNkZWZpbmUgVkJfVU1DCQkJMHg0MDAwCiAjZGVmaW5lIFZCX05vTENEICAgICAgICAJMHg4MDAwCi0jZGVmaW5lIFZCX1NJUzMwMUJMVjMwMkJMViAgICAgIChWQl9TSVMzMDFCfFZCX1NJUzMwMUN8VkJfU0lTMzAyQnxWQl9TSVMzMDFMVnxWQl9TSVMzMDJMVnxWQl9TSVMzMDJFTFYpCi0jZGVmaW5lIFZCX1NJUzMwMUIzMDJCICAgICAgICAgIChWQl9TSVMzMDFCfFZCX1NJUzMwMUN8VkJfU0lTMzAyQikKLSNkZWZpbmUgVkJfU0lTMzAxTFYzMDJMViAgICAgICAgKFZCX1NJUzMwMUxWfFZCX1NJUzMwMkxWfFZCX1NJUzMwMkVMVikKLSNkZWZpbmUgVkJfU0lTVkIJCShWQl9TSVMzMDEgfCBWQl9TSVMzMDFCTFYzMDJCTFYpCi0jZGVmaW5lIFZCX1NJU1RNRFMJCShWQl9TSVMzMDEgfCBWQl9TSVMzMDFCMzAyQikKLSNkZWZpbmUgVkJfU0lTTFZEUwkJVkJfU0lTMzAxTFYzMDJMVgotI2RlZmluZSBWQl9TSVNMQ0RBCQkoVkJfU0lTMzAyQnxWQl9TSVMzMDFDfFZCX1NJUzMwMUxWfFZCX1NJUzMwMkxWfFZCX1NJUzMwMkVMVikKLSNkZWZpbmUgVkJfU0lTWVBCUFIJCShWQl9TSVMzMDFDfFZCX1NJUzMwMUxWfFZCX1NJUzMwMkxWfFZCX1NJUzMwMkVMVikKLSNkZWZpbmUgVkJfU0lTSElWSVNJT04JCShWQl9TSVMzMDF8VkJfU0lTMzAxQnxWQl9TSVMzMDJCKQorI2RlZmluZSBWQl9TSVMzMHhCCQkoVkJfU0lTMzAxQiB8IFZCX1NJUzMwMUMgfCBWQl9TSVMzMDJCIHwgVkJfU0lTMzA3VCkKKyNkZWZpbmUgVkJfU0lTMzB4QwkJKFZCX1NJUzMwMUMgfCBWQl9TSVMzMDdUKQorI2RlZmluZSBWQl9TSVNUTURTCQkoVkJfU0lTMzAxIHwgVkJfU0lTMzAxQiB8IFZCX1NJUzMwMUMgfCBWQl9TSVMzMDJCIHwgVkJfU0lTMzA3VCkKKyNkZWZpbmUgVkJfU0lTTFZEUwkJKFZCX1NJUzMwMUxWIHwgVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYgfCBWQl9TSVMzMDdMVikKKyNkZWZpbmUgVkJfU0lTMzB4QkxWCQkoVkJfU0lTMzB4QiB8IFZCX1NJU0xWRFMpCisjZGVmaW5lIFZCX1NJUzMweENMVgkJKFZCX1NJUzMweEMgfCBWQl9TSVMzMDJFTFYgfCBWQl9TSVMzMDdMVikKKyNkZWZpbmUgVkJfU0lTVkIJCShWQl9TSVMzMDEgfCBWQl9TSVMzMHhCTFYpCisjZGVmaW5lIFZCX1NJU0xDREEJCShWQl9TSVMzMDJCIHwgVkJfU0lTMzAxQyAgfCBWQl9TSVMzMDdUICB8IFZCX1NJU0xWRFMpCisjZGVmaW5lIFZCX1NJU1RNRFNMQ0RBCQkoVkJfU0lTMzAxQyB8IFZCX1NJUzMwN1QpCisjZGVmaW5lIFZCX1NJU1BBUlQ0U0NBTEVSCShWQl9TSVMzMDFDIHwgVkJfU0lTMzA3VCB8IFZCX1NJUzMwMkVMViB8IFZCX1NJUzMwN0xWKQorI2RlZmluZSBWQl9TSVNISVZJU0lPTgkJKFZCX1NJUzMwMSB8IFZCX1NJUzMwMUIgfCBWQl9TSVMzMDJCKQorI2RlZmluZSBWQl9TSVNZUEJQUgkJKFZCX1NJUzMwMUMgfCBWQl9TSVMzMDdUICB8IFZCX1NJUzMwMUxWIHwgVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYgfCBWQl9TSVMzMDdMVikKKyNkZWZpbmUgVkJfU0lTVEFQNFNDQUxFUgkoVkJfU0lTMzAxQyB8IFZCX1NJUzMwN1QgfCBWQl9TSVMzMDJFTFYgfCBWQl9TSVMzMDdMVikKKyNkZWZpbmUgVkJfU0lTUEFSVDRPVkVSRkxPVwkoVkJfU0lTMzAxQyB8IFZCX1NJUzMwN1QgfCBWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMViB8IFZCX1NJUzMwN0xWKQorI2RlZmluZSBWQl9TSVNQV0QJCShWQl9TSVMzMDFDIHwgVkJfU0lTMzA3VCB8IFZCX1NJU0xWRFMpCisjZGVmaW5lIFZCX1NJU0VNSQkJKFZCX1NJUzMwMkxWIHwgVkJfU0lTMzAyRUxWIHwgVkJfU0lTMzA3TFYpCisjZGVmaW5lIFZCX1NJU1BPV0VSCQkoVkJfU0lTMzAxQyB8IFZCX1NJUzMwN1QgfCBWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMViB8IFZCX1NJUzMwN0xWKQorI2RlZmluZSBWQl9TSVNEVUFMTElOSwkJKFZCX1NJUzMwMkxWIHwgVkJfU0lTMzAyRUxWIHwgVkJfU0lTMzA3VCB8IFZCX1NJUzMwN0xWKQorI2RlZmluZSBWQl9TSVNWR0EyCQlWQl9TSVNUTURTCisjZGVmaW5lIFZCX1NJU1JBTURBQzIwMgkJKFZCX1NJUzMwMUMgfCBWQl9TSVMzMDdUKQogCiAvKiBWQkluZm8gKi8KICNkZWZpbmUgU2V0U2ltdVNjYW5Nb2RlICAgICAgICAgMHgwMDAxICAgLyogQ1IgMzAgKi8KQEAgLTE2MCw2ICsxNzQsNyBAQAogI2RlZmluZSBTdXBwb3J0UkFNREFDMl8yMDIgICAgICAweDA0MDAgIC8qIEMgICAgICAgICAgICAgKDw9IDIwMk1oeikgKi8KICNkZWZpbmUgSW50ZXJsYWNlTW9kZSAgICAgICAgICAgMHgwMDgwCiAjZGVmaW5lIFN5bmNQUCAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBIYXZlV2lkZVRpbWluZwkJMHgyMDAwCS8qIEhhdmUgc3BlY2lmaWMgd2lkZS0gYW5kIG5vbi13aWRlIHRpbWluZyAqLwogI2RlZmluZSBTeW5jUE4gICAgICAgICAgICAgICAgICAweDQwMDAKICNkZWZpbmUgU3luY05QICAgICAgICAgICAgICAgICAgMHg4MDAwCiAjZGVmaW5lIFN5bmNOTiAgICAgICAgICAgICAgICAgIDB4YzAwMApAQCAtMTg4LDYgKzIwMyw3IEBACiAjZGVmaW5lIFRWU2V0VFZTaW11TW9kZQkJMHgwMjAwIC8qIG5ldyAweDIwMCwgcHJldi4gMHg4MDAgKi8KICNkZWZpbmUgVFZSUExMRElWMlhPCQkweDA0MDAgLyogcHJldiAweDEwMDAgKi8KICNkZWZpbmUgVFZTZXROVFNDMTAyNAkJMHgwODAwIC8qIG5ldyAweDEwMCwgcHJldi4gMHgyMDAwICovCisjZGVmaW5lIFRWU2V0NTI1cDEwMjQJCTB4MTAwMCAvKiBUVyAqLwogI2RlZmluZSBUVkFzcGVjdDQzCQkweDIwMDAKICNkZWZpbmUgVFZBc3BlY3QxNjkJCTB4NDAwMAogI2RlZmluZSBUVkFzcGVjdDQzTEIJCTB4ODAwMApAQCAtMjA4LDcgKzIyNCw4IEBACiAjZGVmaW5lIFNGX0lzTTY2MQkJMHgwMDIwCiAjZGVmaW5lIFNGX0lzTTc0MQkJMHgwMDQwCiAjZGVmaW5lIFNGX0lzTTc2MAkJMHgwMDgwCi0jZGVmaW5lIFNGXzc2MExGQgkJMHg4MDAwICAvKiA3NjA6IFdlIGhhdmUgTEZCICovCisjZGVmaW5lIFNGXzc2MFVNQQkJMHg0MDAwICAvKiA3Nng6IFdlIGhhdmUgVU1BICovCisjZGVmaW5lIFNGXzc2MExGQgkJMHg4MDAwICAvKiA3Nng6IFdlIGhhdmUgTEZCICovCiAKIC8qIENSMzIgKE5ld2VyIDYzMCwgYW5kIDMxNSBzZXJpZXMpCiAKQEAgLTIyOCwyNSArMjQ1LDE5IEBACiAjZGVmaW5lIFRWT3ZlclNjYW5TaGlmdCAgICAgICAgIDQKIAogLyogQ1IzNSAoNjYxIHNlcmllcyBvbmx5KQotCiAgICBbMF0gICAgMSA9IFBBTCwgMCA9IE5UU0MKICAgIFsxXSAgICAxID0gTlRTQy1KIChpZiBEMCA9IDApCiAgICBbMl0gICAgMSA9IFBBTE0gKGlmIEQwID0gMSkKICAgIFszXSAgICAxID0gUEFMTiAoaWYgRDAgPSAxKQogICAgWzRdICAgIDEgPSBPdmVyc2NhbiAoQ2hyb250ZWwgb25seSkKICAgIFs3OjVdICAob25seSBpZiBEMiBpbiBDUjM4IGlzIHNldCkKLSAgICAgICAgICAwMDAgIDUyNWkKLSAJICAwMDEgIDUyNXAKKwkgIDAwMCAgNTI1aQorCSAgMDAxICA1MjVwCiAJICAwMTAgIDc1MHAKIAkgIDAxMSAgMTA4MGkgKG9yIEhpVmlzaW9uIG9uIDMwMSwgMzAxQikKLQotICAgVGhlc2UgYml0cyBhcmUgYmVpbmcgdHJhbnNsYXRlZCB0byBUVk1vZGUgZmxhZy4KLQogKi8KIAotLyoKLSAgIENSMzcKLQorLyogQ1IzNwogICAgWzBdICAgU2V0IDI0LzE4IGJpdCAoMC8xKSBSR0IgdG8gTFZEUy9UTURTIHRyYW5zbWl0dGVyIChzZXQgYnkgQklPUykKICAgIFszOjFdIEV4dGVybmFsIGNoaXAKICAgICAgICAgIDMwMCBzZXJpZXM6CkBAIC0yNjAsNyArMjcxLDcgQEAKIAkgICAgMDEwICAgTFZEUwogCSAgICAwMTEgICBMVkRTICsgQ2hyb250ZWwgNzAxOQogCSAgNjYwIHNlcmllcyBbMjoxXSBvbmx5OgotCSAgICAgcmVzZXJ2ZWQgKG5vdyBpbiBDUjM4KQorCSAgICAgcmVzZXJ2ZWQgKGNoaXAgdHlwZSBub3cgaW4gQ1IzOCkKIAkgIEFsbCBvdGhlciBjb21iaW5hdGlvbnMgcmVzZXJ2ZWQKICAgIFszXSAgICA2NjEgb25seTogUGFzcyAxOjEgZGF0YQogICAgWzRdICAgIExWRFM6IDA6IFBhbmVsIExpbmsgZXhwYW5kcyAvIDE6IFBhbmVsIExpbmsgZG9lcyBub3QgZXhwYW5kCkBAIC0zMjAsNiArMzMxLDcgQEAKICNkZWZpbmUgRW5hYmxlMzAyTFZfRHVhbExpbmsgICAgMHgwNCAgIC8qIDMwMkxWIG9ubHk7IGVuYWJsZSBkdWFsIGxpbmsgKi8KIAogLyogQ1IzOSAoNjYxIGFuZCBsYXRlcikKKyAgIERbN10gICBMVkRTIChTaVMgb3IgdGhpcmQgcGFydHkpCiAgICBEWzE6MF0gWVBiUHIgQXNwZWN0IFJhdGlvCiAgICAgICAgICAgMDAgNDozIGxldHRlcmJveAogCSAgMDEgNDozCkBAIC0zNDEsNyArMzUzLDcgQEAKIAkgMDEwMSBTZXQgQ29udHJhc3QgZXZlbnQKIAkgMDExMCBTZXQgTXV0ZSBldmVudAogCSAwMTExIFNldCBWb2x1bWUgVXAvRG93biBldmVudAotICAgWzRdICAgRW5hYmxlIEJhY2tsaWdodCBDb250cm9sIGJ5IEJJT1MvZHJpdmVyIAorICAgWzRdICAgRW5hYmxlIEJhY2tsaWdodCBDb250cm9sIGJ5IEJJT1MvZHJpdmVyCiAgICAgICAgICAoc2V0IGJ5IGRyaXZlcjsgc2V0IG1lYW5zIHRoYXQgdGhlIEJJT1Mgc2hvdWxkCiAJIG5vdCB0b3VjaCB0aGUgYmFja2xpZ2h0IHJlZ2lzdGVycyBiZWNhdXNlIGVnLgogCSB0aGUgZHJpdmVyIGFscmVhZHkgc3dpdGNoZWQgb2ZmIHRoZSBiYWNrbGlnaHQpCkBAIC0zNTAsNiArMzYyLDI2IEBACiAgICBbN10gICBUViBVbmRlclNjYW4vT3ZlclNjYW4gKHNldCBieSBCSU9TKQogKi8KIAorLyogQ1I3QyAtIDY2MSBhbmQgbGF0ZXIKKyAgIFs3XSAgIER1YWxFZGdlIGVuYWJsZWQgKG9yOiB0byBiZSBlbmFibGVkKQorICAgWzZdICAgQ1JUMiA9IFRWL0xDRC9WR0EgZW5hYmxlZCAob3I6IHRvIGJlIGVuYWJsZWQpCisgICBbNV0gICBJbml0IGRvbmUgKHNldCBhdCBlbmQgb2YgU2lTX0luaXQpCisgICB7NF0gICBMVkRTIExDRCBjYXBhYmlsaXRpZXMKKyAgIFszXSAgIExWRFMgTENEIGNhcGFiaWxpdGllcworICAgWzJdICAgTFZEUyBMQ0QgY2FwYWJpbGl0aWVzIChQV0QpCisgICBbMV0gICBMVkRTIExDRCBjYXBhYmlsaXRpZXMgKFBXRCkKKyAgIFswXSAgIExWRFM9MSwgVE1EUz0wIChTaVMgb3IgdGhpcmQgcGFydHkpCisqLworCisvKiBDUjdFIC0gNjYxIGFuZCBsYXRlcgorICAgVkJUeXBlOgorICAgWzddIExWRFMgKHRoaXJkIHBhcnR5KQorICAgWzNdIDMwMUMKKyAgIFsyXSAzMDJMVgorICAgWzFdIDMwMUxWCisgICBbMF0gMzAxQgorKi8KKwogLyogTENEUmVzSW5mbyAqLwogI2RlZmluZSBQYW5lbDMwMF84MDB4NjAwICAgICAgICAweDAxCS8qIENSMzYgKi8KICNkZWZpbmUgUGFuZWwzMDBfMTAyNHg3NjggICAgICAgMHgwMgpAQCAtMzU5LDcgKzM5MSw2IEBACiAjZGVmaW5lIFBhbmVsMzAwXzEwMjR4NjAwICAgICAgIDB4MDYKICNkZWZpbmUgUGFuZWwzMDBfMTE1Mng3NjggICAgICAgMHgwNwogI2RlZmluZSBQYW5lbDMwMF8xMjgweDc2OCAgICAgICAweDBhCi0jZGVmaW5lIFBhbmVsMzAwXzMyMHg0ODAgICAgICAgIDB4MGUgCS8qIGZzdG4gLSBUaGlzIGlzIGZha2UsIGNhbiBiZSBhbnkgKi8KICNkZWZpbmUgUGFuZWwzMDBfQ3VzdG9tCQkweDBmCiAjZGVmaW5lIFBhbmVsMzAwX0JhcmNvMTM2NiAgICAgIDB4MTAKIApAQCAtMzc0LDkgKzQwNSw5IEBACiAjZGVmaW5lIFBhbmVsMzEwXzE0MDB4MTA1MCAgICAgIDB4MDkKICNkZWZpbmUgUGFuZWwzMTBfMTI4MHg3NjggICAgICAgMHgwYQogI2RlZmluZSBQYW5lbDMxMF8xNjAweDEyMDAgICAgICAweDBiCi0jZGVmaW5lIFBhbmVsMzEwXzY0MHg0ODBfMiAgICAgIDB4MGMKLSNkZWZpbmUgUGFuZWwzMTBfNjQweDQ4MF8zICAgICAgMHgwZAotI2RlZmluZSBQYW5lbDMxMF8zMjB4NDgwICAgICAgICAweDBlICAgIC8qIGZzdG4gLSBUVzogVGhpcyBpcyBmYWtlLCBjYW4gYmUgYW55ICovCisjZGVmaW5lIFBhbmVsMzEwXzMyMHgyNDBfMiAgICAgIDB4MGMgICAgLyogeFNUTiAqLworI2RlZmluZSBQYW5lbDMxMF8zMjB4MjQwXzMgICAgICAweDBkICAgIC8qIHhTVE4gKi8KKyNkZWZpbmUgUGFuZWwzMTBfMzIweDI0MF8xICAgICAgMHgwZSAgICAvKiB4U1ROIC0gVGhpcyBpcyBmYWtlLCBjYW4gYmUgYW55ICovCiAjZGVmaW5lIFBhbmVsMzEwX0N1c3RvbQkJMHgwZgogCiAjZGVmaW5lIFBhbmVsNjYxXzgwMHg2MDAgICAgICAgIDB4MDEKQEAgLTM4Niw3ICs0MTcsNyBAQAogI2RlZmluZSBQYW5lbDY2MV8xMDI0eDYwMCAgICAgICAweDA1CiAjZGVmaW5lIFBhbmVsNjYxXzExNTJ4ODY0ICAgICAgIDB4MDYKICNkZWZpbmUgUGFuZWw2NjFfMTI4MHg5NjAgICAgICAgMHgwNwotI2RlZmluZSBQYW5lbDY2MV8xMTUyeDc2OCAgICAgICAweDA4CisjZGVmaW5lIFBhbmVsNjYxXzEyODB4ODU0ICAgICAgIDB4MDgKICNkZWZpbmUgUGFuZWw2NjFfMTQwMHgxMDUwICAgICAgMHgwOQogI2RlZmluZSBQYW5lbDY2MV8xMjgweDc2OCAgICAgICAweDBhCiAjZGVmaW5lIFBhbmVsNjYxXzE2MDB4MTIwMCAgICAgIDB4MGIKQEAgLTQxMCwxNCArNDQxLDE2IEBACiAjZGVmaW5lIFBhbmVsXzE2ODB4MTA1MCAgICAgICAgIDB4MGQgICAgLyogNjYxZXRjICAqLwogI2RlZmluZSBQYW5lbF8xMjgweDcyMAkJMHgwZSAgICAvKiA2NjFldGMgICovCiAjZGVmaW5lIFBhbmVsX0N1c3RvbQkJMHgwZgkvKiBNVVNUIEJFIDB4MGYgKGZvciBEVkkgRERDIGRldGVjdGlvbikgKi8KLSNkZWZpbmUgUGFuZWxfMzIweDQ4MCAgICAgICAgICAgMHgxMCAgICAvKiBTaVMgNTUwIGZzdG4gLSBUVzogVGhpcyBpcyBmYWtlLCBjYW4gYmUgYW55ICovCisjZGVmaW5lIFBhbmVsXzMyMHgyNDBfMSAgICAgICAgIDB4MTAgICAgLyogU2lTIDU1MCB4U1ROICovCiAjZGVmaW5lIFBhbmVsX0JhcmNvMTM2NiAgICAgICAgIDB4MTEKICNkZWZpbmUgUGFuZWxfODQ4eDQ4MAkJMHgxMgotI2RlZmluZSBQYW5lbF82NDB4NDgwXzIJCTB4MTMgICAgLyogU2lTIDU1MCAqLwotI2RlZmluZSBQYW5lbF82NDB4NDgwXzMJCTB4MTQgICAgLyogU2lTIDU1MCAqLworI2RlZmluZSBQYW5lbF8zMjB4MjQwXzIJCTB4MTMgICAgLyogU2lTIDU1MCB4U1ROICovCisjZGVmaW5lIFBhbmVsXzMyMHgyNDBfMwkJMHgxNCAgICAvKiBTaVMgNTUwIHhTVE4gKi8KICNkZWZpbmUgUGFuZWxfMTI4MHg3NjhfMiAgICAgICAgMHgxNQkvKiAzMHhMViAqLwogI2RlZmluZSBQYW5lbF8xMjgweDc2OF8zICAgICAgICAweDE2ICAgIC8qICh1bnVzZWQpICovCiAjZGVmaW5lIFBhbmVsXzEyODB4ODAwXzIJMHgxNyAgICAvKiAzMHhMViAqLworI2RlZmluZSBQYW5lbF84NTZ4NDgwCQkweDE4CisjZGVmaW5lIFBhbmVsXzEyODB4ODU0CQkweDE5CS8qIDY2MWV0YyAqLwogCiAvKiBJbmRleCBpbiBNb2RlUmVzSW5mbyB0YWJsZSAqLwogI2RlZmluZSBTSVNfUklfMzIweDIwMCAgICAwCkBAIC00NTQsNiArNDg3LDcgQEAKICNkZWZpbmUgU0lTX1JJXzE5MjB4MTA4MCAzMQogI2RlZmluZSBTSVNfUklfOTYweDU0MCAgIDMyCiAjZGVmaW5lIFNJU19SSV85NjB4NjAwICAgMzMKKyNkZWZpbmUgU0lTX1JJXzEyODB4ODU0ICAzNAogCiAvKiBDUjVGICovCiAjZGVmaW5lIElzTTY1MCAgICAgICAgICAgICAgICAgIDB4ODAKQEAgLTQ4MiwxNiArNTE2LDE4IEBACiAjZGVmaW5lIFZDTEsxMDBfMzAwICAgICAgICAgICAgIDB4NDMgICAvKiBJbmRleCBpbiBWQ0xLRGF0YSB0YWJsZSAoMzAwKSAqLwogI2RlZmluZSBWQ0xLMzRfMzAwICAgICAgICAgICAgICAweDNkICAgLyogSW5kZXggaW4gVkNMS0RhdGEgdGFibGUgKDMwMCkgKi8KICNkZWZpbmUgVkNMS19DVVNUT01fMzAwCQkweDQ3Ci0jZGVmaW5lIFZDTEs2NV8zMTUgICAgICAgICAgICAgIDB4MGIgICAvKiBJbmRleCBpbiAoVkIpVkNMS0RhdGEgdGFibGUgKDMxNSkgKi8KLSNkZWZpbmUgVkNMSzEwOF8yXzMxNSAgICAgICAgICAgMHgxOSAgIC8qIEluZGV4IGluIChWQilWQ0xLRGF0YSB0YWJsZSAoMzE1KSAqLwotI2RlZmluZSBWQ0xLODFfMzE1CQkweDViICAgLyogSW5kZXggaW4gKFZCKVZDTEtEYXRhIHRhYmxlICgzMTUpICovCi0jZGVmaW5lIFZDTEsxNjJfMzE1ICAgICAgICAgICAgIDB4NWUgICAvKiBJbmRleCBpbiAoVkIpVkNMS0RhdGEgdGFibGUgKDMxNSkgKi8KLSNkZWZpbmUgVkNMSzEwOF8zXzMxNSAgICAgICAgICAgMHg0NSAgIC8qIEluZGV4IGluIFZCVkNMS0RhdGEgdGFibGUgKDMxNSkgKi8KLSNkZWZpbmUgVkNMSzEwMF8zMTUgICAgICAgICAgICAgMHg0NiAgIC8qIEluZGV4IGluIFZCVkNMS0RhdGEgdGFibGUgKDMxNSkgKi8KKworI2RlZmluZSBWQ0xLNjVfMzE1ICAgICAgICAgICAgICAweDBiICAgLyogSW5kaWNlcyBpbiAoVkIpVkNMS0RhdGEgdGFibGUgKDMxNSkgKi8KKyNkZWZpbmUgVkNMSzEwOF8yXzMxNSAgICAgICAgICAgMHgxOQorI2RlZmluZSBWQ0xLODFfMzE1CQkweDViCisjZGVmaW5lIFZDTEsxNjJfMzE1ICAgICAgICAgICAgIDB4NWUKKyNkZWZpbmUgVkNMSzEwOF8zXzMxNSAgICAgICAgICAgMHg0NQorI2RlZmluZSBWQ0xLMTAwXzMxNSAgICAgICAgICAgICAweDQ2CiAjZGVmaW5lIFZDTEszNF8zMTUgICAgICAgICAgICAgIDB4NTUKICNkZWZpbmUgVkNMSzY4XzMxNQkJMHgwZAotI2RlZmluZSBWQ0xLXzEyODB4ODAwXzMxNV8yCTB4NWMgICAvKiBJbmRleCBpbiBWQlZDTEtEYXRhIHRhYmxlICgzMTUpICovCi0jZGVmaW5lIFZDTEsxMjFfMzE1CQkweDVkICAgLyogSW5kZXggaW4gVkJWQ0xLRGF0YSB0YWJsZSAoMzE1KSAqLworI2RlZmluZSBWQ0xLXzEyODB4ODAwXzMxNV8yCTB4NWMKKyNkZWZpbmUgVkNMSzEyMV8zMTUJCTB4NWQKKyNkZWZpbmUgVkNMSzEzMF8zMTUJCTB4NzIKICNkZWZpbmUgVkNMS18xMjgweDcyMAkJMHg1ZgogI2RlZmluZSBWQ0xLXzEyODB4NzY4XzIJCTB4NjAKICNkZWZpbmUgVkNMS18xMjgweDc2OF8zCQkweDYxICAgLyogKHVudXNlZD8pICovCkBAIC01MDcsNiArNTQzLDcgQEAKICNkZWZpbmUgVkNMS18xMTUyeDg2NAkJMHg2NAogI2RlZmluZSBWQ0xLXzEzNjB4NzY4CQkweDU4CiAjZGVmaW5lIFZDTEtfMTI4MHg4MDBfMzE1CTB4NmMKKyNkZWZpbmUgVkNMS18xMjgweDg1NAkJMHg3NgogCiAjZGVmaW5lIFRWQ0xLQkFTRV8zMDAJCTB4MjEgICAvKiBJbmRpY2VzIG9uIFRWIGNsb2NrcyBpbiBWQ0xLRGF0YSB0YWJsZSAoMzAwKSAqLwogI2RlZmluZSBUVkNMS0JBU0VfMzE1CSAgICAgICAgMHgzYSAgIC8qIEluZGljZXMgb24gVFYgY2xvY2tzIGluIChWQilWQ0xLRGF0YSB0YWJsZSAoMzE1KSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvaW5pdGV4dGxmYi5jIGIvZHJpdmVycy92aWRlby9zaXMvaW5pdGV4dGxmYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjODU2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0ZXh0bGZiLmMKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBTaVMgMzAwLzU0MC82MzBbU10vNzMwW1NdCisgKiBTaVMgMzE1W0V8UFJPXS81NTAvW01dNjV4L1tNXTY2eFtGfE18R11YL1tNXTc0eFtHWF0vMzMwL1tNXTc2eFtHWF0KKyAqIFhHSSBWM1hUL1Y1L1Y4LCBaNworICogZnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgTGludXgga2VybmVscyA+PSAyLjQuMTQgYW5kID49Mi42LjMKKyAqCisgKiBMaW51eCBrZXJuZWwgc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBpbml0LmMvaW5pdDMwMS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgbmFtZWQgTGljZW5zZSwKKyAqIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIEF1dGhvcjoJVGhvbWFzIFdpbmlzY2hob2ZlciA8dGhvbWFzQHdpbmlzY2hob2Zlci5uZXQ+CisgKi8KKworI2luY2x1ZGUgIm9zZGVmLmgiCisjaW5jbHVkZSAiaW5pdGRlZi5oIgorI2luY2x1ZGUgInZnYXR5cGVzLmgiCisjaW5jbHVkZSAidnN0cnVjdC5oIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKK2ludAkJc2lzZmJfbW9kZV9yYXRlX3RvX2RjbG9jayhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwKKwkJCXVuc2lnbmVkIGNoYXIgbW9kZW5vLCB1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCk7CitpbnQJCXNpc2ZiX21vZGVfcmF0ZV90b19kZGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgY2hhciBtb2Rlbm8sCisJCQl1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCwgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpOworI2VuZGlmCitCT09MRUFOCQlzaXNmYl9nZXR0b3RhbGZyb21tb2RlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBjaGFyIG1vZGVubywKKwkJCWludCAqaHRvdGFsLCBpbnQgKnZ0b3RhbCwgdW5zaWduZWQgY2hhciByYXRlaW5kZXgpOworCitleHRlcm4gQk9PTEVBTglTaVNJbml0UHRyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK2V4dGVybiBCT09MRUFOCVNpU19TZWFyY2hNb2RlSUQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0ICpNb2RlTm8sCisJCQl1bnNpZ25lZCBzaG9ydCAqTW9kZUlkSW5kZXgpOworZXh0ZXJuIHZvaWQJU2lTX0dlbmVyaWNfQ29udmVydENSRGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgY2hhciAqY3JkYXRhLAorCQkJaW50IHhyZXMsIGludCB5cmVzLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgQk9PTEVBTiB3cml0ZXJlcyk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCitpbnQKK3Npc2ZiX21vZGVfcmF0ZV90b19kY2xvY2soc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGNoYXIgbW9kZW5vLAorCQkJdW5zaWduZWQgY2hhciByYXRlaW5kZXgpCit7CisgICAgdW5zaWduZWQgc2hvcnQgTW9kZU5vID0gbW9kZW5vOworICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4ID0gMCwgQ2xvY2tJbmRleCA9IDA7CisgICAgdW5zaWduZWQgc2hvcnQgUlJUSSA9IDA7CisgICAgaW50IENsb2NrOworCisgICAgaWYoIVNpU0luaXRQdHIoU2lTX1ByKSkgcmV0dXJuIDY1MDAwOworCisgICAgaWYocmF0ZWluZGV4ID4gMCkgcmF0ZWluZGV4LS07CisKKyNpZmRlZiBTSVMzMTVICisgICAgc3dpdGNoKE1vZGVObykgeworICAgIGNhc2UgMHg1YTogTW9kZU5vID0gMHg1MDsgYnJlYWs7CisgICAgY2FzZSAweDViOiBNb2RlTm8gPSAweDU2OworICAgIH0KKyNlbmRpZgorCisgICAgaWYoIShTaVNfU2VhcmNoTW9kZUlEKFNpU19QciwgJk1vZGVObywgJk1vZGVJZEluZGV4KSkpIHs7CisgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBtb2RlICV4XG4iLCBNb2RlTm8pOworICAgICAgIHJldHVybiA2NTAwMDsKKyAgICB9CisKKyAgICBSUlRJID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5SRUZpbmRleDsKKworICAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9JbmZvRmxhZyAmIEhhdmVXaWRlVGltaW5nKSB7CisgICAgICAgaWYoU2lTX1ByLT5TaVNfVXNlV2lkZSA9PSAxKSB7CisJICAvKiBXaWRlIHNjcmVlbjogSWdub3JlIHJhdGVpbmRleCAqLworCSAgQ2xvY2tJbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9DUlRWQ0xLX1dJREU7CisgICAgICAgfSBlbHNlIHsKKwkgIFJSVEkgKz0gcmF0ZWluZGV4OworCSAgQ2xvY2tJbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9DUlRWQ0xLX05PUk07CisgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgUlJUSSArPSByYXRlaW5kZXg7CisgICAgICAgQ2xvY2tJbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9DUlRWQ0xLOworICAgIH0KKworICAgIENsb2NrID0gU2lTX1ByLT5TaVNfVkNMS0RhdGFbQ2xvY2tJbmRleF0uQ0xPQ0sgKiAxMDAwOworCisgICAgcmV0dXJuIENsb2NrOworfQorCitpbnQKK3Npc2ZiX21vZGVfcmF0ZV90b19kZGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgY2hhciBtb2Rlbm8sCisJCQl1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCwgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCit7CisgICAgdW5zaWduZWQgc2hvcnQgTW9kZU5vID0gbW9kZW5vOworICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4ID0gMCwgaW5kZXggPSAwLCBSUlRJID0gMDsKKyAgICBpbnQgICAgICAgICAgICBqOworCisgICAgaWYoIVNpU0luaXRQdHIoU2lTX1ByKSkgcmV0dXJuIDA7CisKKyAgICBpZihyYXRlaW5kZXggPiAwKSByYXRlaW5kZXgtLTsKKworI2lmZGVmIFNJUzMxNUgKKyAgICBzd2l0Y2goTW9kZU5vKSB7CisgICAgICAgY2FzZSAweDVhOiBNb2RlTm8gPSAweDUwOyBicmVhazsKKyAgICAgICBjYXNlIDB4NWI6IE1vZGVObyA9IDB4NTY7CisgICAgfQorI2VuZGlmCisKKyAgICBpZighKFNpU19TZWFyY2hNb2RlSUQoU2lTX1ByLCAmTW9kZU5vLCAmTW9kZUlkSW5kZXgpKSkgcmV0dXJuIDA7CisKKyAgICBSUlRJID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5SRUZpbmRleDsKKyAgICBpZihTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJXS5FeHRfSW5mb0ZsYWcgJiBIYXZlV2lkZVRpbWluZykgeworICAgICAgIGlmKFNpU19Qci0+U2lTX1VzZVdpZGUgPT0gMSkgeworCSAgLyogV2lkZSBzY3JlZW46IElnbm9yZSByYXRlaW5kZXggKi8KKwkgIGluZGV4ID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0NSVDFDUlRDX1dJREU7CisgICAgICAgfSBlbHNlIHsKKwkgIFJSVEkgKz0gcmF0ZWluZGV4OworCSAgaW5kZXggPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJXS5FeHRfQ1JUMUNSVENfTk9STTsKKyAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICBSUlRJICs9IHJhdGVpbmRleDsKKyAgICAgICBpbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9DUlQxQ1JUQzsKKyAgICB9CisKKyAgICBTaVNfR2VuZXJpY19Db252ZXJ0Q1JEYXRhKFNpU19QciwKKwkJCSh1bnNpZ25lZCBjaGFyICopJlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMF0sCisJCQlTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJXS5YUmVzLAorCQkJU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uWVJlcywKKwkJCXZhciwgRkFMU0UpOworCisgICAgaWYoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0luZm9GbGFnICYgMHg4MDAwKQorICAgICAgIHZhci0+c3luYyAmPSB+RkJfU1lOQ19WRVJUX0hJR0hfQUNUOworICAgIGVsc2UKKyAgICAgICB2YXItPnN5bmMgfD0gRkJfU1lOQ19WRVJUX0hJR0hfQUNUOworCisgICAgaWYoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0luZm9GbGFnICYgMHg0MDAwKQorICAgICAgIHZhci0+c3luYyAmPSB+RkJfU1lOQ19IT1JfSElHSF9BQ1Q7CisgICAgZWxzZQorICAgICAgIHZhci0+c3luYyB8PSBGQl9TWU5DX0hPUl9ISUdIX0FDVDsKKworICAgIHZhci0+dm1vZGUgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworICAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9JbmZvRmxhZyAmIDB4MDA4MCkKKyAgICAgICB2YXItPnZtb2RlID0gRkJfVk1PREVfSU5URVJMQUNFRDsKKyAgICBlbHNlIHsKKyAgICAgICBqID0gMDsKKyAgICAgICB3aGlsZShTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbal0uRXh0X01vZGVJRCAhPSAweGZmKSB7CisJICBpZihTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbal0uRXh0X01vZGVJRCA9PQorCSAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLk1vZGVJRCkgeworCSAgICAgIGlmKFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtqXS5FeHRfTW9kZUZsYWcgJiBEb3VibGVTY2FuTW9kZSkgeworCSAgICAgIAkgIHZhci0+dm1vZGUgPSBGQl9WTU9ERV9ET1VCTEU7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgfQorCSAgaisrOworICAgICAgIH0KKyAgICB9CisKKyAgICBpZigodmFyLT52bW9kZSAmIEZCX1ZNT0RFX01BU0spID09IEZCX1ZNT0RFX0lOVEVSTEFDRUQpIHsKKyNpZiAwICAvKiBEbyB0aGlzPyAqLworICAgICAgIHZhci0+dXBwZXJfbWFyZ2luIDw8PSAxOworICAgICAgIHZhci0+bG93ZXJfbWFyZ2luIDw8PSAxOworICAgICAgIHZhci0+dnN5bmNfbGVuIDw8PSAxOworI2VuZGlmCisgICAgfSBlbHNlIGlmKCh2YXItPnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfRE9VQkxFKSB7CisgICAgICAgdmFyLT51cHBlcl9tYXJnaW4gPj49IDE7CisgICAgICAgdmFyLT5sb3dlcl9tYXJnaW4gPj49IDE7CisgICAgICAgdmFyLT52c3luY19sZW4gPj49IDE7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogTGludXggPj0gMi41ICovCisKK0JPT0xFQU4KK3Npc2ZiX2dldHRvdGFsZnJvbW1vZGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGNoYXIgbW9kZW5vLCBpbnQgKmh0b3RhbCwKKwkJCWludCAqdnRvdGFsLCB1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCkKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8gPSBtb2Rlbm87CisgICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXggPSAwLCBDUlQxSW5kZXggPSAwOworICAgIHVuc2lnbmVkIHNob3J0IFJSVEkgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgIHNyX2RhdGEsIGNyX2RhdGEsIGNyX2RhdGEyOworCisgICAgaWYoIVNpU0luaXRQdHIoU2lTX1ByKSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYocmF0ZWluZGV4ID4gMCkgcmF0ZWluZGV4LS07CisKKyNpZmRlZiBTSVMzMTVICisgICAgc3dpdGNoKE1vZGVObykgeworICAgICAgIGNhc2UgMHg1YTogTW9kZU5vID0gMHg1MDsgYnJlYWs7CisgICAgICAgY2FzZSAweDViOiBNb2RlTm8gPSAweDU2OworICAgIH0KKyNlbmRpZgorCisgICAgaWYoIShTaVNfU2VhcmNoTW9kZUlEKFNpU19QciwgJk1vZGVObywgJk1vZGVJZEluZGV4KSkpIHJldHVybiBGQUxTRTsKKworICAgIFJSVEkgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlJFRmluZGV4OworICAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9JbmZvRmxhZyAmIEhhdmVXaWRlVGltaW5nKSB7CisgICAgICAgaWYoU2lTX1ByLT5TaVNfVXNlV2lkZSA9PSAxKSB7CisJICAvKiBXaWRlIHNjcmVlbjogSWdub3JlIHJhdGVpbmRleCAqLworCSAgQ1JUMUluZGV4ID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0NSVDFDUlRDX1dJREU7CisgICAgICAgfSBlbHNlIHsKKwkgIFJSVEkgKz0gcmF0ZWluZGV4OworCSAgQ1JUMUluZGV4ID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0NSVDFDUlRDX05PUk07CisgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgUlJUSSArPSByYXRlaW5kZXg7CisgICAgICAgQ1JUMUluZGV4ID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0NSVDFDUlRDOworICAgIH0KKworICAgIHNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbQ1JUMUluZGV4XS5DUlsxNF07CisgICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzBdOworICAgICpodG90YWwgPSAoKChjcl9kYXRhICYgMHhmZikgfCAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MDMpIDw8IDgpKSArIDUpICogODsKKworICAgIHNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbQ1JUMUluZGV4XS5DUlsxM107CisgICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzZdOworICAgIGNyX2RhdGEyID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW0NSVDFJbmRleF0uQ1JbN107CisgICAgKnZ0b3RhbCA9ICgoY3JfZGF0YSAmIDB4RkYpIHwKKwkgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkoY3JfZGF0YTIgJiAweDAxKSA8PCAgOCkgfAorCSAgICAgICAoKHVuc2lnbmVkIHNob3J0KShjcl9kYXRhMiAmIDB4MjApIDw8ICA0KSB8CisJICAgICAgICgodW5zaWduZWQgc2hvcnQpKHNyX2RhdGEgICYgMHgwMSkgPDwgMTApKSArIDI7CisKKyAgICBpZihTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJXS5FeHRfSW5mb0ZsYWcgJiBJbnRlcmxhY2VNb2RlKQorICAgICAgICp2dG90YWwgKj0gMjsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvb2VtMzAwLmggYi9kcml2ZXJzL3ZpZGVvL3Npcy9vZW0zMDAuaAppbmRleCBiMTM1OGI3Li5iNzNmMjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9vZW0zMDAuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9vZW0zMDAuaApAQCAtMyw3ICszLDcgQEAKIC8qCiAgKiBPRU0gRGF0YSBmb3IgMzAwIHNlcmllcwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCiAgKgogICogSWYgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgdGVybXMKICAqIGFwcGx5OgpAQCAtNTAsNyArNTAsNyBAQAogICoKICAqLwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX09FTVRWRGVsYXkzMDFbOF1bNF0gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzAwX09FTVRWRGVsYXkzMDFbOF1bNF0gPQogewogCXsweDA4LDB4MDgsMHgwOCwweDA4fSwKIAl7MHgwOCwweDA4LDB4MDgsMHgwOH0sCkBAIC02Miw3ICs2Miw3IEBACiAJezB4MjAsMHgyMCwweDIwLDB4MjB9CiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX09FTVRWRGVsYXlMVkRTWzhdWzRdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMwMF9PRU1UVkRlbGF5TFZEU1s4XVs0XSA9CiB7CiAJezB4MjAsMHgyMCwweDIwLDB4MjB9LAogCXsweDIwLDB4MjAsMHgyMCwweDIwfSwKQEAgLTc0LDcgKzc0LDcgQEAKIAl7MHgyMCwweDIwLDB4MjAsMHgyMH0KIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfT0VNVFZGbGlja2VyWzhdWzRdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMwMF9PRU1UVkZsaWNrZXJbOF1bNF0gPQogewogCXsweDAwLDB4MDAsMHgwMCwweDAwfSwKIAl7MHgwMCwweDAwLDB4MDAsMHgwMH0sCkBAIC04NiwyNSArODYsNyBAQAogCXsweDAwLDB4MDAsMHgwMCwweDAwfQogfTsKIAotI2lmIDAgICAvKiBUVzogTm90IHVzZWQgKi8KLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfT0VNTENERGVsYXkxWzEyXVs0XT17Ci0JezB4MmMsMHgyYywweDJjLDB4MmN9LAotCXsweDIwLDB4MjAsMHgyMCwweDIwfSwKLQl7MHgyMCwweDIwLDB4MjAsMHgyMH0sCi0JezB4MmMsMHgyYywweDJjLDB4MmN9LAotCXsweDJjLDB4MmMsMHgyYywweDJjfSwKLQl7MHgyMCwweDIwLDB4MjAsMHgyMH0sCi0JezB4MjAsMHgyMCwweDIwLDB4MjB9LAotCXsweDI0LDB4MjQsMHgyNCwweDI0fSwKLQl7MHgyNCwweDI0LDB4MjQsMHgyNH0sCi0JezB4MjAsMHgyMCwweDIwLDB4MjB9LAotCXsweDIwLDB4MjAsMHgyMCwweDIwfSwKLQl7MHgyNCwweDI0LDB4MjQsMHgyNH0KLX07Ci0jZW5kaWYKLQotLyogRnJvbSA2MzAvMzAxQiBCSU9TICovCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX09FTUxDRERlbGF5Mls2NF1bNF0gPQkJIC8qIGZvciAzMDEvMzAxYi8zMDJiLzMwMUxWLzMwMkxWICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfT0VNTENERGVsYXkyWzY0XVs0XSA9CQkgLyogZm9yIDMwMS8zMDFiLzMwMmIvMzAxTFYvMzAyTFYgKi8KIHsKIAl7MHgyMCwweDIwLDB4MjAsMHgyMH0sCiAJezB4MjAsMHgyMCwweDIwLDB4MjB9LApAQCAtMTcyLDggKzE1NCw3IEBACiAJezB4MjAsMHgyMCwweDIwLDB4MjB9CiB9OwogCi0vKiBGcm9tIDMwMC8zMDFMViBCSU9TICovCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX09FTUxDRERlbGF5NFsxMl1bNF0gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzAwX09FTUxDRERlbGF5NFsxMl1bNF0gPQogewogCXsweDJjLDB4MmMsMHgyYywweDJjfSwKIAl7MHgyMCwweDIwLDB4MjAsMHgyMH0sCkBAIC0xODksOCArMTcwLDcgQEAKIAl7MHgyNCwweDI0LDB4MjQsMHgyNH0KIH07CiAKLS8qIEZyb20gMzAwLzMwMUxWIEJJT1MgKi8KLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfT0VNTENERGVsYXk1WzMyXVs0XSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfT0VNTENERGVsYXk1WzMyXVs0XSA9CiB7CiAJezB4MjAsMHgyMCwweDIwLDB4MjB9LAogCXsweDIwLDB4MjAsMHgyMCwweDIwfSwKQEAgLTIyNiw4ICsyMDYsOCBAQAogCXsweDIwLDB4MjAsMHgyMCwweDIwfSwKIH07CiAKLS8qIEFkZGVkIGZvciBMVkRTICovCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX09FTUxDRERlbGF5M1s2NF1bNF0gPSB7CS8qIEZvciBMVkRTICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfT0VNTENERGVsYXkzWzY0XVs0XSA9CQkvKiBGb3IgTFZEUyAqLworewogCXsweDIwLDB4MjAsMHgyMCwweDIwfSwKIAl7MHgyMCwweDIwLDB4MjAsMHgyMH0sCiAJezB4MjAsMHgyMCwweDIwLDB4MjB9LApAQCAtMjk0LDcgKzI3NCw3IEBACiAJezB4MjAsMHgyMCwweDIwLDB4MjB9CiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX1BoYXNlMVs4XVs1XVs0XSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfUGhhc2UxWzhdWzVdWzRdID0KIHsKICAgICB7CiAJezB4MjEsMHhlZCwweDAwLDB4MDh9LApAQCAtMzU0LDExICszMzQsMTAgQEAKICAgICB9CiB9OwogCi0KLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfUGhhc2UyWzhdWzVdWzRdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMwMF9QaGFzZTJbOF1bNV1bNF0gPQogewogICAgIHsKLSAgICAgICAgezB4MjEsMHhlZCwweDAwLDB4MDh9LAorCXsweDIxLDB4ZWQsMHgwMCwweDA4fSwKIAl7MHgyMSwweGVkLDB4OGEsMHgwOH0sCiAJezB4MjEsMHhlZCwweDhhLDB4MDh9LAogCXsweDIxLDB4ZWQsMHg4YSwweDA4fSwKQEAgLTM3Miw0MiArMzUxLDQyIEBACiAJezB4MmEsMHgwNSwweGQzLDB4MDB9CiAgICAgfSwKICAgICB7Ci0gICAgICAgIHsweDJhLDB4MDUsMHhkMywweDAwfSwKKwl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfSwKIAl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9CiAgICAgfSwKICAgICB7Ci0gICAgICAgIHsweDJhLDB4MDUsMHhkMywweDAwfSwKKwl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfSwKIAl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9CiAgICAgfSwKICAgICB7Ci0gICAgICAgIHsweDIxLDB4ZWQsMHgwMCwweDA4fSwKKwl7MHgyMSwweGVkLDB4MDAsMHgwOH0sCiAJezB4MjEsMHhlZCwweDhhLDB4MDh9LAogCXsweDIxLDB4ZWQsMHg4YSwweDA4fSwKIAl7MHgyMSwweGVkLDB4OGEsMHgwOH0sCiAJezB4MjEsMHhlZCwweDhhLDB4MDh9CiAgICAgfSwKICAgICB7Ci0gICAgICAgIHsweDJhLDB4MDUsMHhkMywweDAwfSwKKwl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfSwKIAl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9CiAgICAgfSwKICAgICB7Ci0gICAgICAgIHsweDJhLDB4MDUsMHhkMywweDAwfSwKKwl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfSwKIAl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9CiAgICAgfSwKICAgICB7Ci0gICAgICAgIHsweDJhLDB4MDUsMHhkMywweDAwfSwKKwl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfSwKIAl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCkBAIC00MTUsNyArMzk0LDcgQEAKICAgICB9CiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX0ZpbHRlcjFbMTBdWzE2XVs0XSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfRmlsdGVyMVsxMF1bMTZdWzRdID0KIHsKICAgICB7CiAJezB4MDAsMHhmNCwweDEwLDB4Mzh9LApAQCAtNTk5LDcgKzU3OCw3IEBACiAgICAgfSwKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfRmlsdGVyMlsxMF1bOV1bN10gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzAwX0ZpbHRlcjJbMTBdWzldWzddID0KIHsKICAgICB7CiAJezB4RkYsMHgwMywweDAyLDB4RjYsMHhGQywweDI3LDB4NDZ9LApAQCAtNzE0LDE0MiArNjkzLDE0NCBAQAogfTsKIAogLyogQ3VzdG9tIGRhdGEgZm9yIEJhcmNvIGlRIFBybyBSMzAwICovCi1zdGF0aWMgY29uc3QgVUNIQVIgYmFyY29fcDFbMl1bOV1bN11bM10gPSB7Ci0gICAgewotCXsgIHsgMHgxNiwgMHhjZiwgMHgwMCB9LAotCSAgIHsgMHgxOCwgMHgwMCwgMHgwMCB9LAotCSAgIHsgMHgxYSwgMHhlNywgMHgwMCB9LAotCSAgIHsgMHgxYiwgMHgyNiwgMHgwMCB9LAotCSAgIHsgMHgxYywgMHhmZiwgMHgwMCB9LAotCSAgIHsgMHgxZCwgMHgxYywgMHgwMCB9LAotCSAgIHsgMHgxZSwgMHgxOSwgMHgwMCB9Ci0JfSwKLQl7Ci0JICAgeyAweDE2LCAweGNmLCAweDAwIH0sCi0JICAgeyAweDE4LCAweDAwLCAweDAwIH0sCi0JICAgeyAweDFhLCAweGU3LCAweDAwIH0sCi0JICAgeyAweDFiLCAweDFlLCAweDAwIH0sCi0JICAgeyAweDFjLCAweGZmLCAweDAwIH0sCi0JICAgeyAweDFkLCAweDFjLCAweDAwIH0sCi0JICAgeyAweDFlLCAweDE2LCAweDAwIH0KLQl9LAotCXsKLQkgICB7IDB4MTYsIDB4Y2YsIDB4MDAgfSwKLQkgICB7IDB4MWEsIDB4ZTcsIDB4MDAgfSwKLQkgICB7IDB4MWIsIDB4MjYsIDB4MDAgfSwKLQkgICB7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKLQkgICB7IDB4MWQsIDB4MWMsIDB4MDAgfSwKLQkgICB7IDB4MWUsIDB4MTksIDB4MDAgfSwKLQkgICB7ICAgIDAsICAgIDAsICAgIDAgfQotCX0sCi0JewotCSAgIHsgICAgMCwgICAgMCwgICAgMCB9Ci0JfSwKLQl7Ci0JICAgeyAweDE2LCAweGNmLCAweDAwIH0sCi0JICAgeyAweDFhLCAweGU3LCAweDAwIH0sCi0JICAgeyAweDFiLCAweDI2LCAweDAwIH0sCi0JICAgeyAweDFjLCAweGZmLCAweDAwIH0sCi0JICAgeyAweDFkLCAweDFjLCAweDAwIH0sCi0JICAgeyAweDFlLCAweDFlLCAweDAwIH0sCi0JICAgeyAgICAwLCAgICAwLCAgICAwIH0KLQl9LAotCXsKLQkgICB7IDB4MTYsIDB4ZDEsIDB4MDAgfSwKLQkgICB7IDB4MTgsIDB4MDAsIDB4MDAgfSwKLQkgICB7IDB4MWEsIDB4ZTcsIDB4MDAgfSwKLQkgICB7IDB4MWIsIDB4MTEsIDB4MDAgfSwKLQkgICB7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKLQkgICB7IDB4MWQsIDB4MWMsIDB4MDAgfSwKLQkgICB7IDB4MWUsIDB4MjYsIDB4MDAgfQotCX0sCi0JewotCSAgIHsgMHgxNiwgMHhkMSwgMHgwMCB9LAotCSAgIHsgMHgxYSwgMHhlNywgMHgwMCB9LAotCSAgIHsgMHgxYiwgMHgyNiwgMHgwMCB9LAotCSAgIHsgMHgxYywgMHhmZiwgMHgwMCB9LAotCSAgIHsgMHgxZCwgMHgxYywgMHgwMCB9LAotCSAgIHsgMHgxZSwgMHgzMCwgMHgwMCB9LAotCSAgIHsgICAgMCwgICAgMCwgICAgMCB9Ci0JfSwKLQl7Ci0JICAgeyAweDE2LCAweDAwLCAweDAwIH0sCi0JICAgeyAweDE3LCAweGEwLCAweDAwIH0sCi0JICAgeyAweDFhLCAweGEwLCAweDAwIH0sCi0JICAgeyAweDFiLCAweDJhLCAweDAwIH0sCi0JICAgeyAweDFjLCAweGZmLCAweDAwIH0sCi0JICAgeyAweDFkLCAweDFjLCAweDAwIH0sCi0JICAgeyAgICAwLCAgICAwLCAgICAwIH0KLQl9LAotCXsKLQkgICB7IDB4MTYsIDB4MDAsIDB4MDAgfSwKLQkgICB7IDB4MTcsIDB4YWEsIDB4MDAgfSwKLQkgICB7IDB4MWEsIDB4YTAsIDB4MDAgfSwKLQkgICB7IDB4MWIsIDB4MmEsIDB4MDAgfSwKLQkgICB7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKLQkgICB7IDB4MWQsIDB4MWMsIDB4MDAgfSwKLQkgICB7ICAgIDAsICAgIDAsICAgIDAgfQotCX0KLSAgICB9LAotICAgIHsKLQl7Ci0JICAgeyAweDE2LCAweGNmLCAweDAwIH0sCi0JICAgeyAweDE4LCAweDAwLCAweDAwIH0sCi0JICAgeyAweDFhLCAweGU3LCAweDAwIH0sCi0JICAgeyAweDFiLCAweDI2LCAweDAwIH0sCi0JICAgeyAweDFjLCAweGZmLCAweDAwIH0sCi0JICAgeyAweDFkLCAweDFjLCAweDAwIH0sCi0JICAgeyAweDFlLCAweDE5LCAweDAwIH0KLQl9LAotCXsKLQkgICB7ICAgIDAsICAgIDAsICAgIDAgfQotCX0sCi0JewotCSAgIHsgMHgxNiwgMHhjZiwgMHgwMCB9LAotCSAgIHsgMHgxOCwgMHgwMCwgMHgwMCB9LAotCSAgIHsgMHgxYSwgMHhlNywgMHgwMCB9LAotCSAgIHsgMHgxYiwgMHgyNiwgMHgwMCB9LAotCSAgIHsgMHgxYywgMHhmZiwgMHgwMCB9LAotCSAgIHsgMHgxZCwgMHgxYywgMHgwMCB9LAotCSAgIHsgMHgxZSwgMHgxOSwgMHgwMCB9LAotCX0sCi0JewotCSAgIHsgICAgMCwgICAgMCwgICAgMCB9Ci0JfSwKLQl7Ci0JICAgeyAweDE2LCAweGNmLCAweDAwIH0sCi0JICAgeyAweDE4LCAweDAwLCAweDAwIH0sCi0JICAgeyAweDFhLCAweGU3LCAweDAwIH0sCi0JICAgeyAweDFiLCAweDI2LCAweDAwIH0sCi0JICAgeyAweDFjLCAweGZmLCAweDAwIH0sCi0JICAgeyAweDFkLCAweDFjLCAweDAwIH0sCi0JICAgeyAweDFlLCAweDFlLCAweDAwIH0KLQl9LAotCXsKLQkgICB7IDB4MTYsIDB4ZDEsIDB4MDAgfSwKLQkgICB7IDB4MTgsIDB4MDAsIDB4MDAgfSwKLQkgICB7IDB4MWEsIDB4ZTYsIDB4MDAgfSwKLQkgICB7IDB4MWIsIDB4MTEsIDB4MDAgfSwKLQkgICB7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKLQkgICB7IDB4MWQsIDB4MWMsIDB4MDAgfSwKLQkgICB7IDB4MWUsIDB4MjYsIDB4MDAgfQotCX0sCi0JewotCSAgIHsgMHgxOCwgMHgwMCwgMHgwMCB9LAotCSAgIHsgMHgxYSwgMHhlMCwgMHgwMCB9LAotCSAgIHsgMHgxYiwgMHgyNiwgMHgwMCB9LAotCSAgIHsgMHgxYywgMHhmZiwgMHgwMCB9LAotCSAgIHsgMHgxZCwgMHgxYywgMHgwMCB9LAotCSAgIHsgMHgxZSwgMHgzMCwgMHgwMCB9LAotCSAgIHsgICAgMCwgICAgMCwgICAgMCB9Ci0JfSwKLQl7Ci0JICAgeyAgICAwLCAgICAwLCAgICAwIH0KLQl9LAotCXsKLQkgICB7ICAgIDAsICAgIDAsICAgIDAgfQotCX0KLSAgICB9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBiYXJjb19wMVsyXVs5XVs3XVszXSA9Cit7CisgIHsKKyAgICAgeworCXsgMHgxNiwgMHhjZiwgMHgwMCB9LAorCXsgMHgxOCwgMHgwMCwgMHgwMCB9LAorCXsgMHgxYSwgMHhlNywgMHgwMCB9LAorCXsgMHgxYiwgMHgyNiwgMHgwMCB9LAorCXsgMHgxYywgMHhmZiwgMHgwMCB9LAorCXsgMHgxZCwgMHgxYywgMHgwMCB9LAorCXsgMHgxZSwgMHgxOSwgMHgwMCB9CisgICAgIH0sCisgICAgIHsKKwl7IDB4MTYsIDB4Y2YsIDB4MDAgfSwKKwl7IDB4MTgsIDB4MDAsIDB4MDAgfSwKKwl7IDB4MWEsIDB4ZTcsIDB4MDAgfSwKKwl7IDB4MWIsIDB4MWUsIDB4MDAgfSwKKwl7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKKwl7IDB4MWQsIDB4MWMsIDB4MDAgfSwKKwl7IDB4MWUsIDB4MTYsIDB4MDAgfQorICAgICB9LAorICAgICB7CisJeyAweDE2LCAweGNmLCAweDAwIH0sCisJeyAweDFhLCAweGU3LCAweDAwIH0sCisJeyAweDFiLCAweDI2LCAweDAwIH0sCisJeyAweDFjLCAweGZmLCAweDAwIH0sCisJeyAweDFkLCAweDFjLCAweDAwIH0sCisJeyAweDFlLCAweDE5LCAweDAwIH0sCisJeyAgICAwLCAgICAwLCAgICAwIH0KKyAgICAgfSwKKyAgICAgeworCXsgICAgMCwgICAgMCwgICAgMCB9CisgICAgIH0sCisgICAgIHsKKwl7IDB4MTYsIDB4Y2YsIDB4MDAgfSwKKwl7IDB4MWEsIDB4ZTcsIDB4MDAgfSwKKwl7IDB4MWIsIDB4MjYsIDB4MDAgfSwKKwl7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKKwl7IDB4MWQsIDB4MWMsIDB4MDAgfSwKKwl7IDB4MWUsIDB4MWUsIDB4MDAgfSwKKwl7ICAgIDAsICAgIDAsICAgIDAgfQorICAgICB9LAorICAgICB7CisJeyAweDE2LCAweGQxLCAweDAwIH0sCisJeyAweDE4LCAweDAwLCAweDAwIH0sCisJeyAweDFhLCAweGU3LCAweDAwIH0sCisJeyAweDFiLCAweDExLCAweDAwIH0sCisJeyAweDFjLCAweGZmLCAweDAwIH0sCisJeyAweDFkLCAweDFjLCAweDAwIH0sCisJeyAweDFlLCAweDI2LCAweDAwIH0KKyAgICAgfSwKKyAgICAgeworCXsgMHgxNiwgMHhkMSwgMHgwMCB9LAorCXsgMHgxYSwgMHhlNywgMHgwMCB9LAorCXsgMHgxYiwgMHgyNiwgMHgwMCB9LAorCXsgMHgxYywgMHhmZiwgMHgwMCB9LAorCXsgMHgxZCwgMHgxYywgMHgwMCB9LAorCXsgMHgxZSwgMHgzMCwgMHgwMCB9LAorCXsgICAgMCwgICAgMCwgICAgMCB9CisgICAgIH0sCisgICAgIHsKKwl7IDB4MTYsIDB4MDAsIDB4MDAgfSwKKwl7IDB4MTcsIDB4YTAsIDB4MDAgfSwKKwl7IDB4MWEsIDB4YTAsIDB4MDAgfSwKKwl7IDB4MWIsIDB4MmEsIDB4MDAgfSwKKwl7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKKwl7IDB4MWQsIDB4MWMsIDB4MDAgfSwKKwl7ICAgIDAsICAgIDAsICAgIDAgfQorICAgICB9LAorICAgICB7CisJeyAweDE2LCAweDAwLCAweDAwIH0sCisJeyAweDE3LCAweGFhLCAweDAwIH0sCisJeyAweDFhLCAweGEwLCAweDAwIH0sCisJeyAweDFiLCAweDJhLCAweDAwIH0sCisJeyAweDFjLCAweGZmLCAweDAwIH0sCisJeyAweDFkLCAweDFjLCAweDAwIH0sCisJeyAgICAwLCAgICAwLCAgICAwIH0KKyAgICAgfQorICB9LAorICB7CisgICAgIHsKKwl7IDB4MTYsIDB4Y2YsIDB4MDAgfSwKKwl7IDB4MTgsIDB4MDAsIDB4MDAgfSwKKwl7IDB4MWEsIDB4ZTcsIDB4MDAgfSwKKwl7IDB4MWIsIDB4MjYsIDB4MDAgfSwKKwl7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKKwl7IDB4MWQsIDB4MWMsIDB4MDAgfSwKKwl7IDB4MWUsIDB4MTksIDB4MDAgfQorICAgICB9LAorICAgICB7CisJeyAgICAwLCAgICAwLCAgICAwIH0KKyAgICAgfSwKKyAgICAgeworCXsgMHgxNiwgMHhjZiwgMHgwMCB9LAorCXsgMHgxOCwgMHgwMCwgMHgwMCB9LAorCXsgMHgxYSwgMHhlNywgMHgwMCB9LAorCXsgMHgxYiwgMHgyNiwgMHgwMCB9LAorCXsgMHgxYywgMHhmZiwgMHgwMCB9LAorCXsgMHgxZCwgMHgxYywgMHgwMCB9LAorCXsgMHgxZSwgMHgxOSwgMHgwMCB9LAorICAgICB9LAorICAgICB7CisJeyAgICAwLCAgICAwLCAgICAwIH0KKyAgICAgfSwKKyAgICAgeworCXsgMHgxNiwgMHhjZiwgMHgwMCB9LAorCXsgMHgxOCwgMHgwMCwgMHgwMCB9LAorCXsgMHgxYSwgMHhlNywgMHgwMCB9LAorCXsgMHgxYiwgMHgyNiwgMHgwMCB9LAorCXsgMHgxYywgMHhmZiwgMHgwMCB9LAorCXsgMHgxZCwgMHgxYywgMHgwMCB9LAorCXsgMHgxZSwgMHgxZSwgMHgwMCB9CisgICAgIH0sCisgICAgIHsKKwl7IDB4MTYsIDB4ZDEsIDB4MDAgfSwKKwl7IDB4MTgsIDB4MDAsIDB4MDAgfSwKKwl7IDB4MWEsIDB4ZTYsIDB4MDAgfSwKKwl7IDB4MWIsIDB4MTEsIDB4MDAgfSwKKwl7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKKwl7IDB4MWQsIDB4MWMsIDB4MDAgfSwKKwl7IDB4MWUsIDB4MjYsIDB4MDAgfQorICAgICB9LAorICAgICB7CisJeyAweDE4LCAweDAwLCAweDAwIH0sCisJeyAweDFhLCAweGUwLCAweDAwIH0sCisJeyAweDFiLCAweDI2LCAweDAwIH0sCisJeyAweDFjLCAweGZmLCAweDAwIH0sCisJeyAweDFkLCAweDFjLCAweDAwIH0sCisJeyAweDFlLCAweDMwLCAweDAwIH0sCisJeyAgICAwLCAgICAwLCAgICAwIH0KKyAgICAgfSwKKyAgICAgeworCXsgICAgMCwgICAgMCwgICAgMCB9CisgICAgIH0sCisgICAgIHsKKwl7ICAgIDAsICAgIDAsICAgIDAgfQorICAgICB9CisgIH0KIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvb2VtMzEwLmggYi9kcml2ZXJzL3ZpZGVvL3Npcy9vZW0zMTAuaAppbmRleCAyYjdkYjkxLi44ZmNlNTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9vZW0zMTAuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9vZW0zMTAuaApAQCAtMSw5ICsxLDkgQEAKIC8qICRYRnJlZTg2JCAqLwogLyogJFhkb3RPcmckICovCiAvKgotICogT0VNIERhdGEgZm9yIDMxNS8zMzAgc2VyaWVzCisgKiBPRU0gRGF0YSBmb3IgMzE1LzMzMC8zNDAgc2VyaWVzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKICAqCiAgKiBJZiBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIHRoZSBmb2xsb3dpbmcgbGljZW5zZSB0ZXJtcwogICogYXBwbHk6CkBAIC01MCwyMDYgKzUwLDIwNiBAQAogICoKICAqLwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX0xDRERlbGF5Q29tcGVuc2F0aW9uXzMwMVtdID0JICAgIAkJLyogMzAxICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fMzAxW10gPQkgICAgCQkvKiAzMDEgKi8KIHsKLQkJIDB4MDAsMHgwMCwweDAwLCAgICAvKiAgIDgwMHg2MDAgKi8KLQkJIDB4MGIsMHgwYiwweDBiLCAgICAvKiAgMTAyNHg3NjggKi8KLQkJIDB4MDgsMHgwOCwweDA4LCAgICAvKiAxMjgweDEwMjQgKi8KLQkJIDB4MDAsMHgwMCwweDAwLCAgICAvKiAgIDY0MHg0ODAgKHVua25vd24pICovCi0JCSAweDAwLDB4MDAsMHgwMCwgICAgLyogIDEwMjR4NjAwICh1bmtub3duKSAqLwotCQkgMHgwMCwweDAwLDB4MDAsICAgIC8qICAxMTUyeDg2NCAodW5rbm93bikgKi8KLQkJIDB4MDgsMHgwOCwweDA4LCAgICAvKiAgMTI4MHg5NjAgKGd1ZXNzZWQpICovCi0JCSAweDAwLDB4MDAsMHgwMCwgICAgLyogIDExNTJ4NzY4ICh1bmtub3duKSAqLwotCQkgMHgwOCwweDA4LDB4MDgsICAgIC8qIDE0MDB4MTA1MCAqLwotCQkgMHgwOCwweDA4LDB4MDgsICAgIC8qICAxMjgweDc2OCAgKGd1ZXNzZWQpICovCi0JCSAweDAwLDB4MDAsMHgwMCwgICAgLyogMTYwMHgxMjAwICovCi0JCSAweDAwLDB4MDAsMHgwMCwgICAgLyogICAzMjB4NDgwICh1bmtub3duKSAqLwotCQkgMHgwMCwweDAwLDB4MDAsCi0JCSAweDAwLDB4MDAsMHgwMCwKLQkJIDB4MDAsMHgwMCwweDAwCisJMHgwMCwweDAwLDB4MDAsICAgIC8qICAgODAweDYwMCAqLworCTB4MGIsMHgwYiwweDBiLCAgICAvKiAgMTAyNHg3NjggKi8KKwkweDA4LDB4MDgsMHgwOCwgICAgLyogMTI4MHgxMDI0ICovCisJMHgwMCwweDAwLDB4MDAsICAgIC8qICAgNjQweDQ4MCAodW5rbm93bikgKi8KKwkweDAwLDB4MDAsMHgwMCwgICAgLyogIDEwMjR4NjAwICh1bmtub3duKSAqLworCTB4MDAsMHgwMCwweDAwLCAgICAvKiAgMTE1Mng4NjQgKHVua25vd24pICovCisJMHgwOCwweDA4LDB4MDgsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KKwkweDAwLDB4MDAsMHgwMCwgICAgLyogIDExNTJ4NzY4ICh1bmtub3duKSAqLworCTB4MDgsMHgwOCwweDA4LCAgICAvKiAxNDAweDEwNTAgKi8KKwkweDA4LDB4MDgsMHgwOCwgICAgLyogIDEyODB4NzY4ICAoZ3Vlc3NlZCkgKi8KKwkweDAwLDB4MDAsMHgwMCwgICAgLyogMTYwMHgxMjAwICovCisJMHgwMCwweDAwLDB4MDAsICAgIC8qICAgMzIweDQ4MCAodW5rbm93bikgKi8KKwkweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMAogfTsKIAogLyogVGhpcyBpcyBjb250YWluZWQgaW4gNjUwKzMwMUIgQklPU2VzLCBidXQgaXQgaXMgd3JvbmcgLSBzbyB3ZSBkb24ndCB1c2UgaXQgKi8KLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fNjUwMzAxTFZbXSA9CSAgIAkvKiA2NTAgKyAzMHhMViAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX0xDRERlbGF5Q29tcGVuc2F0aW9uXzY1MDMwMUxWW10gPQkgICAJLyogNjUwICsgMzB4TFYgKi8KIHsKLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAgIDgwMHg2MDAgKi8KLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAgMTAyNHg3NjggKi8KLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAxMjgweDEwMjQgKi8KLSAgICAgICAgICAgICAgICAgMHgwMSwweDAxLDB4MDEsICAgIC8qICAgNjQweDQ4MCAodW5rbm93bikgKi8KLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAgMTAyNHg2MDAgKHVua25vd24pICovCi0JCSAweDAxLDB4MDEsMHgwMSwgICAgLyogIDExNTJ4ODY0ICh1bmtub3duKSAqLwotCQkgMHgwMSwweDAxLDB4MDEsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAgMTE1Mng3NjggKHVua25vd24pICovCi0JCSAweDAxLDB4MDEsMHgwMSwgICAgLyogMTQwMHgxMDUwICovCi0JCSAweDAxLDB4MDEsMHgwMSwgICAgLyogIDEyODB4NzY4ICAoZ3Vlc3NlZCkgKi8KLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAxNjAweDEyMDAgKi8KLQkJIDB4MDIsMHgwMiwweDAyLAotCQkgMHgwMiwweDAyLDB4MDIsCi0JCSAweDAyLDB4MDIsMHgwMiwKLQkJIDB4MDIsMHgwMiwweDAyCisJMHgwMSwweDAxLDB4MDEsICAgIC8qICAgODAweDYwMCAqLworCTB4MDEsMHgwMSwweDAxLCAgICAvKiAgMTAyNHg3NjggKi8KKwkweDAxLDB4MDEsMHgwMSwgICAgLyogMTI4MHgxMDI0ICovCisJMHgwMSwweDAxLDB4MDEsICAgIC8qICAgNjQweDQ4MCAodW5rbm93bikgKi8KKwkweDAxLDB4MDEsMHgwMSwgICAgLyogIDEwMjR4NjAwICh1bmtub3duKSAqLworCTB4MDEsMHgwMSwweDAxLCAgICAvKiAgMTE1Mng4NjQgKHVua25vd24pICovCisJMHgwMSwweDAxLDB4MDEsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KKwkweDAxLDB4MDEsMHgwMSwgICAgLyogIDExNTJ4NzY4ICh1bmtub3duKSAqLworCTB4MDEsMHgwMSwweDAxLCAgICAvKiAxNDAweDEwNTAgKi8KKwkweDAxLDB4MDEsMHgwMSwgICAgLyogIDEyODB4NzY4ICAoZ3Vlc3NlZCkgKi8KKwkweDAxLDB4MDEsMHgwMSwgICAgLyogMTYwMHgxMjAwICovCisJMHgwMiwweDAyLDB4MDIsCisJMHgwMiwweDAyLDB4MDIsCisJMHgwMiwweDAyLDB4MDIsCisJMHgwMiwweDAyLDB4MDIKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fNjUxMzAxTFZbXSA9CSAgCS8qIE02NTAvNjUxIDMwMUxWICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fNjUxMzAxTFZbXSA9CSAgCS8qIE02NTAvNjUxIDMwMUxWICovCiB7Ci0gICAgICAgICAgICAgICAgIDB4MzMsMHgzMywweDMzLCAgICAvKiAgIDgwMHg2MDAgKGd1ZXNzZWQpIC0gbmV3OiBQYW5lbFR5cGUsIG5vdCBQYW5lbFJlcyAhICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogIDEwMjR4NzY4ICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogMTI4MHgxMDI0ICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogICA2NDB4NDgwICh1bmtub3duKSAqLwotCQkgMHgzMywweDMzLDB4MzMsICAgIC8qICAxMDI0eDYwMCAodW5rbm93bikgKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAgMTE1Mng4NjQgKHVua25vd24pICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogIDEyODB4OTYwIChndWVzc2VkKSAqLwotCQkgMHgzMywweDMzLDB4MzMsICAgIC8qICAxMTUyeDc2OCAodW5rbm93bikgKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAxNDAweDEwNTAgKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAgMTI4MHg3NjggIChndWVzc2VkKSAqLwotCQkgMHgzMywweDMzLDB4MzMsICAgIC8qIDE2MDB4MTIwMCAqLwotCQkgMHgzMywweDMzLDB4MzMsCi0JCSAweDMzLDB4MzMsMHgzMywKLQkJIDB4MzMsMHgzMywweDMzLAotCQkgMHgzMywweDMzLDB4MzMKKwkweDMzLDB4MzMsMHgzMywgICAgLyogICA4MDB4NjAwIChndWVzc2VkKSAtIG5ldzogUGFuZWxUeXBlLCBub3QgUGFuZWxSZXMgISAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAgMTAyNHg3NjggKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogMTI4MHgxMDI0ICovCisJMHgzMywweDMzLDB4MzMsICAgIC8qICAgNjQweDQ4MCAodW5rbm93bikgKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogIDEwMjR4NjAwICh1bmtub3duKSAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAgMTE1Mng4NjQgKHVua25vd24pICovCisJMHgzMywweDMzLDB4MzMsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogIDExNTJ4NzY4ICh1bmtub3duKSAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAxNDAweDEwNTAgKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogIDEyODB4NzY4ICAoZ3Vlc3NlZCkgKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogMTYwMHgxMjAwICovCisJMHgzMywweDMzLDB4MzMsCisJMHgzMywweDMzLDB4MzMsCisJMHgzMywweDMzLDB4MzMsCisJMHgzMywweDMzLDB4MzMKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fNjUxMzAyTFZbXSA9CSAgIAkvKiBNNjUwLzY1MSAzMDJMViAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX0xDRERlbGF5Q29tcGVuc2F0aW9uXzY1MTMwMkxWW10gPQkgICAJLyogTTY1MC82NTEgMzAyTFYgKi8KIHsKLSAgICAgICAgICAgICAgICAgMHgzMywweDMzLDB4MzMsICAgIC8qICAgODAweDYwMCAoZ3Vlc3NlZCkgKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAgMTAyNHg3NjggKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAxMjgweDEwMjQgKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAgIDY0MHg0ODAgKHVua25vd24pICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogIDEwMjR4NjAwICh1bmtub3duKSAqLwotCQkgMHgzMywweDMzLDB4MzMsICAgIC8qICAxMTUyeDg2NCAodW5rbm93bikgKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAgMTI4MHg5NjAgKGd1ZXNzZWQpICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogIDExNTJ4NzY4ICh1bmtub3duKSAqLwotCQkgMHgzMywweDMzLDB4MzMsICAgIC8qIDE0MDB4MTA1MCAqLwotCQkgMHgzMywweDMzLDB4MzMsICAgIC8qICAxMjgweDc2OCAgKGd1ZXNzZWQpICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogMTYwMHgxMjAwICovCi0JCSAweDMzLDB4MzMsMHgzMywKLQkJIDB4MzMsMHgzMywweDMzLAotCQkgMHgzMywweDMzLDB4MzMsCi0JCSAweDMzLDB4MzMsMHgzMworCTB4MzMsMHgzMywweDMzLCAgICAvKiAgIDgwMHg2MDAgKGd1ZXNzZWQpICovCisJMHgzMywweDMzLDB4MzMsICAgIC8qICAxMDI0eDc2OCAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAxMjgweDEwMjQgKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogICA2NDB4NDgwICh1bmtub3duKSAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAgMTAyNHg2MDAgKHVua25vd24pICovCisJMHgzMywweDMzLDB4MzMsICAgIC8qICAxMTUyeDg2NCAodW5rbm93bikgKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogIDEyODB4OTYwIChndWVzc2VkKSAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAgMTE1Mng3NjggKHVua25vd24pICovCisJMHgzMywweDMzLDB4MzMsICAgIC8qIDE0MDB4MTA1MCAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAgMTI4MHg3NjggIChndWVzc2VkKSAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAxNjAweDEyMDAgKi8KKwkweDMzLDB4MzMsMHgzMywKKwkweDMzLDB4MzMsMHgzMywKKwkweDMzLDB4MzMsMHgzMywKKwkweDMzLDB4MzMsMHgzMwogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9MQ0REZWxheUNvbXBlbnNhdGlvbl8zeHgzMDFCW10gPQkgICAJLyogMzB4QiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX0xDRERlbGF5Q29tcGVuc2F0aW9uXzN4eDMwMUJbXSA9CSAgIAkvKiAzMHhCICovCiB7Ci0JCSAweDAxLDB4MDEsMHgwMSwgICAgLyogICA4MDB4NjAwICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogIDEwMjR4NzY4ICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogMTI4MHgxMDI0ICovCi0gICAgICAgICAgICAgICAgIDB4MDgsMHgwOCwweDA4LCAgICAvKiAgIDY0MHg0ODAgKi8KLQkJIDB4MEMsMHgwQywweDBDLCAgICAvKiAgMTAyNHg2MDAgKGd1ZXNzZWQpICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogIDExNTJ4ODY0IChndWVzc2VkKSAqLwotCQkgMHgwQywweDBDLDB4MEMsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KLQkJIDB4MEMsMHgwQywweDBDLCAgICAvKiAgMTE1Mng3NjggKGd1ZXNzZWQpICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogMTQwMHgxMDUwIChndWVzc2VkKSAqLwotCQkgMHgwQywweDBDLDB4MEMsICAgIC8qICAxMjgweDc2OCAoZ3Vlc3NlZCkgKi8KLQkJIDB4MEMsMHgwQywweDBDLCAgICAvKiAxNjAweDEyMDAgKGd1ZXNzZWQpICovCi0JCSAweDAyLDB4MDIsMHgwMiwKLQkJIDB4MDIsMHgwMiwweDAyLAotCQkgMHgwMiwweDAyLDB4MDIsCi0JCSAweDAyLDB4MDIsMHgwMgorCTB4MDEsMHgwMSwweDAxLCAgICAvKiAgIDgwMHg2MDAgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogIDEwMjR4NzY4ICovCisJMHgwQywweDBDLDB4MEMsICAgIC8qIDEyODB4MTAyNCAqLworCTB4MDgsMHgwOCwweDA4LCAgICAvKiAgIDY0MHg0ODAgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogIDEwMjR4NjAwIChndWVzc2VkKSAqLworCTB4MEMsMHgwQywweDBDLCAgICAvKiAgMTE1Mng4NjQgKGd1ZXNzZWQpICovCisJMHgwQywweDBDLDB4MEMsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogIDExNTJ4NzY4IChndWVzc2VkKSAqLworCTB4MEMsMHgwQywweDBDLCAgICAvKiAxNDAweDEwNTAgKGd1ZXNzZWQpICovCisJMHgwQywweDBDLDB4MEMsICAgIC8qICAxMjgweDc2OCAoZ3Vlc3NlZCkgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogMTYwMHgxMjAwIChndWVzc2VkKSAqLworCTB4MDIsMHgwMiwweDAyLAorCTB4MDIsMHgwMiwweDAyLAorCTB4MDIsMHgwMiwweDAyLAorCTB4MDIsMHgwMiwweDAyCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX0xDRERlbGF5Q29tcGVuc2F0aW9uXzN4eDMwMUxWW10gPQkgICAJLyogMzE1KzMweExWICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fM3h4MzAxTFZbXSA9CSAgIAkvKiAzMTUrMzB4TFYgKi8KIHsKLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAgIDgwMHg2MDAgKi8KLQkJIDB4MDQsMHgwNCwweDA0LCAgICAvKiAgMTAyNHg3NjggKEE1MzEvQklPUyAxLjE0LjA1ZjogNCAtIHdvcmtzIHdpdGggNiAqLwotCQkgMHgwQywweDBDLDB4MEMsICAgIC8qIDEyODB4MTAyNCAqLwotICAgICAgICAgICAgICAgICAweDA4LDB4MDgsMHgwOCwgICAgLyogICA2NDB4NDgwICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogIDEwMjR4NjAwIChndWVzc2VkKSAqLwotCQkgMHgwQywweDBDLDB4MEMsICAgIC8qICAxMTUyeDg2NCAoZ3Vlc3NlZCkgKi8KLQkJIDB4MEMsMHgwQywweDBDLCAgICAvKiAgMTI4MHg5NjAgKGd1ZXNzZWQpICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogIDExNTJ4NzY4IChndWVzc2VkKSAqLwotCQkgMHgwQywweDBDLDB4MEMsICAgIC8qIDE0MDB4MTA1MCAoZ3Vlc3NlZCkgKi8KLQkJIDB4MEMsMHgwQywweDBDLCAgICAvKiAgMTI4MHg3NjggKGd1ZXNzZWQpICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogMTYwMHgxMjAwIChndWVzc2VkKSAqLwotCQkgMHgwMiwweDAyLDB4MDIsCi0JCSAweDAyLDB4MDIsMHgwMiwKLQkJIDB4MDIsMHgwMiwweDAyLAotCQkgMHgwMiwweDAyLDB4MDIKKwkweDAxLDB4MDEsMHgwMSwgICAgLyogICA4MDB4NjAwICovCisJMHgwNCwweDA0LDB4MDQsICAgIC8qICAxMDI0eDc2OCAoQTUzMS9CSU9TIDEuMTQuMDVmOiA0IC0gd29ya3Mgd2l0aCA2ICovCisJMHgwQywweDBDLDB4MEMsICAgIC8qIDEyODB4MTAyNCAqLworCTB4MDgsMHgwOCwweDA4LCAgICAvKiAgIDY0MHg0ODAgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogIDEwMjR4NjAwIChndWVzc2VkKSAqLworCTB4MEMsMHgwQywweDBDLCAgICAvKiAgMTE1Mng4NjQgKGd1ZXNzZWQpICovCisJMHgwQywweDBDLDB4MEMsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogIDExNTJ4NzY4IChndWVzc2VkKSAqLworCTB4MEMsMHgwQywweDBDLCAgICAvKiAxNDAweDEwNTAgKGd1ZXNzZWQpICovCisJMHgwQywweDBDLDB4MEMsICAgIC8qICAxMjgweDc2OCAoZ3Vlc3NlZCkgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogMTYwMHgxMjAwIChndWVzc2VkKSAqLworCTB4MDIsMHgwMiwweDAyLAorCTB4MDIsMHgwMiwweDAyLAorCTB4MDIsMHgwMiwweDAyLAorCTB4MDIsMHgwMiwweDAyCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX1RWRGVsYXlDb21wZW5zYXRpb25fMzAxW10gPSAJCS8qIDMwMSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX1RWRGVsYXlDb21wZW5zYXRpb25fMzAxW10gPSAJCS8qIDMwMSAqLwogewotCQkgMHgwMiwweDAyLCAgICAvKiBOVFNDIEVuaGFuY2VkLCBTdGFuZGFyZCAqLwotICAgICAgICAgICAgICAgICAweDAyLDB4MDIsICAgIC8qIFBBTCAqLwotCQkgMHgwOCwweDBiICAgICAvKiBIaVZpc2lvbiAqLworCTB4MDIsMHgwMiwgICAgLyogTlRTQyBFbmhhbmNlZCwgU3RhbmRhcmQgKi8KKwkweDAyLDB4MDIsICAgIC8qIFBBTCAqLworCTB4MDgsMHgwYiAgICAgLyogSGlWaXNpb24gKi8KIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl8zMDFCW10gPQkJLyogMzB4QiwgMzB4TFYgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9UVkRlbGF5Q29tcGVuc2F0aW9uXzMwMUJbXSA9CQkvKiAzMHhCLCAzMHhMViAqLwogewotCQkgMHgwMywweDAzLAotCQkgMHgwMywweDAzLAotCQkgMHgwMywweDAzCisJMHgwMywweDAzLAorCTB4MDMsMHgwMywKKwkweDAzLDB4MDMKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl83NDAzMDFCW10gPQkvKiA3NDAgKyAzMHhCICgzMHhMVj8pICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl83NDAzMDFCW10gPQkvKiA3NDAgKyAzMHhCICgzMHhMVj8pICovCiB7Ci0JCSAweDA1LDB4MDUsCi0JCSAweDA1LDB4MDUsCi0JCSAweDA1LDB4MDUKKwkweDA1LDB4MDUsCisJMHgwNSwweDA1LAorCTB4MDUsMHgwNQogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9UVkRlbGF5Q29tcGVuc2F0aW9uXzY1MTMwMUxWW10gPQkvKiBNNjUwLCA2NTEsIDMwMUxWICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl82NTEzMDFMVltdID0JLyogTTY1MCwgNjUxLCAzMDFMViAqLwogewotCQkgMHgzMywweDMzLAotCQkgMHgzMywweDMzLAotCQkgMHgzMywweDMzCisJMHgzMywweDMzLAorCTB4MzMsMHgzMywKKwkweDMzLDB4MzMKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl82NTEzMDJMVltdID0JLyogTTY1MCwgNjUxLCAzMDJMViAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX1RWRGVsYXlDb21wZW5zYXRpb25fNjUxMzAyTFZbXSA9CS8qIE02NTAsIDY1MSwgMzAyTFYgKi8KIHsKLQkJIDB4MzMsMHgzMywKLQkJIDB4MzMsMHgzMywKLQkJIDB4MzMsMHgzMworCTB4MzMsMHgzMywKKwkweDMzLDB4MzMsCisJMHgzMywweDMzCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1RWRGVsYXk2NjFfMzAxW10gPQkJCS8qIDY2MSwgMzAxICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfVFZEZWxheTY2MV8zMDFbXSA9CQkJLyogNjYxLCAzMDEgKi8KIHsKLQkJIDB4NDQsMHg0NCwKLQkJIDB4NDQsMHg0NCwKLQkJIDB4MDAsMHgwMCwKLQkJIDB4NDQsMHg0NCwKLQkJIDB4NDQsMHg0NCwKLQkJIDB4NDQsMHg0NAorCTB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsCisJMHgwMCwweDAwLAorCTB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsCisJMHg0NCwweDQ0CiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1RWRGVsYXk2NjFfMzAxQltdID0JCQkvKiA2NjEsIDMwMUIgZXQgYWwgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19UVkRlbGF5NjYxXzMwMUJbXSA9CQkJLyogNjYxLCAzMDFCIGV0IGFsICovCiB7Ci0JCSAweDQ0LDB4NDQsCi0JCSAweDQ0LDB4NDQsCi0JCSAweDAwLDB4MDAsCi0JCSAweDQ0LDB4NDQsCi0JCSAweDQ0LDB4NDQsCi0JCSAweDQ0LDB4NDQKKwkweDQ0LDB4NDQsCisJMHg0NCwweDQ0LAorCTB4MDAsMHgwMCwKKwkweDQ0LDB4NDQsCisJMHg0NCwweDQ0LAorCTB4NDQsMHg0NAogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9UVkRlbGF5Q29tcGVuc2F0aW9uX0xWRFNbXSA9CQkvKiBMVkRTICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl9MVkRTW10gPQkJLyogTFZEUyAqLwogewotCQkgMHgwYSwweDBhLAotCQkgMHgwYSwweDBhLAotCQkgMHgwYSwweDBhCisJMHgwYSwweDBhLAorCTB4MGEsMHgwYSwKKwkweDBhLDB4MGEKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZBbnRpRmxpY2sxWzZdWzJdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9UVkFudGlGbGljazFbNl1bMl0gPQogewotICAgICAgICAgICAgezB4NCwweDB9LAotCSAgICB7MHg0LDB4OH0sCi0JICAgIHsweDAsMHgwfSwKLQkgICAgezB4MCwweDB9LAotCSAgICB7MHgwLDB4MH0sCi0JICAgIHsweDAsMHgwfQorCXsweDQsMHgwfSwKKwl7MHg0LDB4OH0sCisJezB4MCwweDB9LAorCXsweDAsMHgwfSwKKwl7MHgwLDB4MH0sCisJezB4MCwweDB9CiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX1RWRWRnZTFbNl1bMl0gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX1RWRWRnZTFbNl1bMl0gPQogewotICAgICAgICAgICAgezB4MCwweDR9LAotCSAgICB7MHgwLDB4NH0sCi0JICAgIHsweDAsMHgwfSwKLQkgICAgezB4MCwweDB9LAotCSAgICB7MHgwLDB4MH0sCi0JICAgIHsweDAsMHgwfQorCXsweDAsMHg0fSwKKwl7MHgwLDB4NH0sCisJezB4MCwweDB9LAorCXsweDAsMHgwfSwKKwl7MHgwLDB4MH0sCisJezB4MCwweDB9CiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX1RWWUZpbHRlcjFbNV1bOF1bNF0gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX1RWWUZpbHRlcjFbNV1bOF1bNF0gPQogewotIHsKKyAgIHsKIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCS8qIE5UU0MgKi8KIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCiAJezB4ZWIsMHgwNCwweDI1LDB4MTh9LApAQCAtMjU4LDggKzI1OCw4IEBACiAJezB4ZWIsMHgwNCwweDI1LDB4MTh9LAogCXsweGVlLDB4MGMsMHgyMiwweDA4fSwKIAl7MHhlYiwweDE1LDB4MjUsMHhmNn0KLSB9LAotIHsKKyAgIH0sCisgICB7CiAJezB4MDAsMHhmNCwweDEwLDB4Mzh9LAkvKiBQQUwgKi8KIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCiAJezB4ZjEsMHhmNywweDFmLDB4MzJ9LApAQCAtMjY4LDggKzI2OCw4IEBACiAJezB4ZjEsMHhmNywweDFmLDB4MzJ9LAogCXsweGYzLDB4MDAsMHgxZCwweDIwfSwKIAl7MHhmYywweGZiLDB4MTQsMHgyYX0KLSB9LAotIHsKKyAgIH0sCisgICB7CiAJezB4MDAsMHgwMCwweDAwLDB4MDB9LAkvKiBIaVZpc2lvbiAqLwogCXsweDAwLDB4ZjQsMHgxMCwweDM4fSwKIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCkBAIC0yNzgsOSArMjc4LDkgQEAKIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCiAJezB4ZWIsMHgwNCwweDI1LDB4MTh9LAogCXsweGVlLDB4MGMsMHgyMiwweDA4fQotIH0sCi0gewotIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCS8qIFBBTC1NICovCisgICB9LAorICAgeworCXsweDAwLDB4ZjQsMHgxMCwweDM4fSwJLyogUEFMLU0gKi8KIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCiAJezB4ZWIsMHgwNCwweDEwLDB4MTh9LAogCXsweGY3LDB4MDYsMHgxOSwweDE0fSwKQEAgLTI4OCw5ICsyODgsOSBAQAogCXsweGViLDB4MDQsMHgyNSwweDE4fSwKIAl7MHhlYiwweDA0LDB4MjUsMHgxOH0sCiAJezB4ZWIsMHgxNSwweDI1LDB4ZjZ9Ci0gfSwKLSB7Ci0gCXsweDAwLDB4ZjQsMHgxMCwweDM4fSwJLyogUEFMLU4gKi8KKyAgIH0sCisgICB7CisJezB4MDAsMHhmNCwweDEwLDB4Mzh9LAkvKiBQQUwtTiAqLwogCXsweDAwLDB4ZjQsMHgxMCwweDM4fSwKIAl7MHhlYiwweDA0LDB4MTAsMHgxOH0sCiAJezB4ZjcsMHgwNiwweDE5LDB4MTR9LApAQCAtMjk4LDEyICsyOTgsMTIgQEAKIAl7MHhlYiwweDA0LDB4MjUsMHgxOH0sCiAJezB4ZWIsMHgwNCwweDI1LDB4MTh9LAogCXsweGViLDB4MTUsMHgyNSwweGY2fQotIH0KKyAgIH0KIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZZRmlsdGVyMls1XVs5XVs3XSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfVFZZRmlsdGVyMls1XVs5XVs3XSA9CiB7Ci0geworICAgewogCXsweEZGLDB4MDMsMHgwMiwweEY2LDB4RkMsMHgyNywweDQ2fSwJLyogTlRTQyAqLwogCXsweDAxLDB4MDIsMHhGRSwweEY3LDB4MDMsMHgyNywweDNDfSwKIAl7MHhGRiwweDAzLDB4MDIsMHhGNiwweEZDLDB4MjcsMHg0Nn0sCkBAIC0zMTMsOCArMzEzLDggQEAKIAl7MHgwMSwweDAyLDB4RkUsMHhGNywweDAzLDB4MjcsMHgzQ30sCiAJezB4MDEsMHgwMSwweEZDLDB4RjgsMHgwOCwweDI2LDB4Mzh9LAogCXsweEZGLDB4RkYsMHhGQywweDAwLDB4MEYsMHgyMiwweDI4fQotIH0sCi0geworICAgfSwKKyAgIHsKIAl7MHhGRiwweDAzLDB4MDIsMHhGNiwweEZDLDB4MjcsMHg0Nn0sICAgLyogUEFMICovCiAJezB4MDEsMHgwMiwweEZFLDB4RjcsMHgwMywweDI3LDB4M0N9LAogCXsweEZGLDB4MDMsMHgwMiwweEY2LDB4RkMsMHgyNywweDQ2fSwKQEAgLTMyNCw4ICszMjQsOCBAQAogCXsweDAxLDB4MDIsMHhGRSwweEY3LDB4MDMsMHgyNywweDNDfSwKIAl7MHgwMSwweDAxLDB4RkMsMHhGOCwweDA4LDB4MjYsMHgzOH0sCiAJezB4RkYsMHhGRiwweEZDLDB4MDAsMHgwRiwweDIyLDB4Mjh9Ci0gfSwKLSB7CisgICB9LAorICAgewogCXsweDAwLDB4MDAsMHgwMCwweEY0LDB4RkYsMHgxQywweDIyfSwJLyogSGlWaXNpb24gKi8KIAl7MHgwMCwweDAwLDB4MDAsMHhGNCwweEZGLDB4MUMsMHgyMn0sCiAJezB4MDAsMHgwMCwweDAwLDB4RjQsMHhGRiwweDFDLDB4MjJ9LApAQCAtMzM1LDkgKzMzNSw5IEBACiAJezB4MDAsMHgwMCwweDAwLDB4RjQsMHhGRiwweDFDLDB4MjJ9LAogCXsweDAwLDB4MDAsMHgwMCwweEY0LDB4RkYsMHgxQywweDIyfSwKIAl7MHgwMCwweDAwLDB4MDAsMHhGNCwweEZGLDB4MUMsMHgyMn0KLSB9LAotIHsKLSAJezB4RkYsMHgwMywweDAyLDB4RjYsMHhGQywweDI3LDB4NDZ9LCAJLyogUEFMLU0gKi8KKyAgIH0sCisgICB7CisJezB4RkYsMHgwMywweDAyLDB4RjYsMHhGQywweDI3LDB4NDZ9LCAJLyogUEFMLU0gKi8KIAl7MHgwMSwweDAyLDB4RkUsMHhGNywweDAzLDB4MjcsMHgzQ30sCiAJezB4RkYsMHgwMywweDAyLDB4RjYsMHhGQywweDI3LDB4NDZ9LAogCXsweDAxLDB4MDIsMHhGRSwweEY3LDB4MDMsMHgyNywweDNDfSwKQEAgLTM0Niw5ICszNDYsOSBAQAogCXsweDAxLDB4MDIsMHhGRSwweEY3LDB4MDMsMHgyNywweDNDfSwKIAl7MHgwMSwweDAxLDB4RkMsMHhGOCwweDA4LDB4MjYsMHgzOH0sCiAJezB4RkYsMHhGRiwweEZDLDB4MDAsMHgwRiwweDIyLDB4Mjh9Ci0gfSwKLSB7Ci0gCXsweEZGLDB4MDMsMHgwMiwweEY2LDB4RkMsMHgyNywweDQ2fSwJLyogUEFMLU4gKi8KKyAgIH0sCisgICB7CisJezB4RkYsMHgwMywweDAyLDB4RjYsMHhGQywweDI3LDB4NDZ9LAkvKiBQQUwtTiAqLwogCXsweDAxLDB4MDIsMHhGRSwweEY3LDB4MDMsMHgyNywweDNDfSwKIAl7MHhGRiwweDAzLDB4MDIsMHhGNiwweEZDLDB4MjcsMHg0Nn0sCiAJezB4MDEsMHgwMiwweEZFLDB4RjcsMHgwMywweDI3LDB4M0N9LApAQCAtMzU3LDU4ICszNTcsMzkgQEAKIAl7MHgwMSwweDAyLDB4RkUsMHhGNywweDAzLDB4MjcsMHgzQ30sCiAJezB4MDEsMHgwMSwweEZDLDB4RjgsMHgwOCwweDI2LDB4Mzh9LAogCXsweEZGLDB4RkYsMHhGQywweDAwLDB4MEYsMHgyMiwweDI4fQotIH0KKyAgIH0KIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZQaGFzZUluY3IxWzNdWzJdWzRdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9UVlBoYXNlSW5jcjFbM11bMl1bNF0gPQogewotIHsKKyAgIHsKIAl7MHgyMSwweGVkLDB4YmEsMHgwOH0sCiAJezB4MjEsMHhlZCwweGJhLDB4MDh9Ci0gfSwKLSB7CisgICB9LAorICAgewogCXsweDJhLDB4MDUsMHhlMywweDAwfSwKIAl7MHgyYSwweDA1LDB4ZTMsMHgwMH0KLSB9LAotIHsKKyAgIH0sCisgICB7CiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfQotIH0KKyAgIH0KIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZQaGFzZUluY3IyWzNdWzJdWzRdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9UVlBoYXNlSW5jcjJbM11bMl1bNF0gPQogewotIHsKKyAgIHsKIAl7MHgyMSwweGYwLDB4N2IsMHhkNn0sCiAJezB4MjEsMHhmMCwweDdiLDB4ZDZ9Ci0gfSwKLSB7CisgICB9LAorICAgewogCXsweDJhLDB4MGEsMHg0MSwweGU5fSwKIAl7MHgyYSwweDBhLDB4NDEsMHhlOX0KLSB9LAotIHsKKyAgIH0sCisgICB7CiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfQotIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVM2NjFfVFZQaGFzZVtdID0gewotICAgIDB4MjEsMHhFRCwweEJBLDB4MDgsCi0gICAgMHgyQSwweDA1LDB4RTMsMHgwMCwKLSAgICAweDIxLDB4RTQsMHgyRSwweDlCLAotICAgIDB4MjEsMHhGNCwweDNFLDB4QkEsCi0gICAgMHgxRSwweDhCLDB4QTIsMHhBNywKLSAgICAweDFFLDB4ODMsMHgwQSwweEUwLAotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAweDIxLDB4RjAsMHg3QiwweEQ2LAotICAgIDB4MkEsMHgwOSwweDg2LDB4RTksCi0gICAgMHgyMSwweEU2LDB4RUYsMHhBNCwKLSAgICAweDIxLDB4RjYsMHg5NCwweDQ2LAotICAgIDB4MUUsMHg4QiwweEEyLDB4QTcsCi0gICAgMHgxRSwweDgzLDB4MEEsMHhFMCwKLSAgICAweDAwLDB4MDAsMHgwMCwweDAwLAotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAKKyAgIH0KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQxNyw3ICszOTgsNyBAQAogCiAvKiBJbnZlbnRlYyAvIENvbXBhcSBQcmVzYXJpbyAzMDQ1VVMsIDMwMTcgKi8KIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVMzMTBfRXh0Q29tcGFxMTI4MHgxMDI0RGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTMzEwX0V4dENvbXBhcTEyODB4MTAyNERhdGFbXSA9CiB7CiAJeyAgMjExLCAgNjAsMTAyNCwgNTAxLDE2ODgsMTA2Nn0sCiAJeyAgMjExLCAgNjAsMTAyNCwgNTA4LDE2ODgsMTA2Nn0sCkBAIC00MzEsMTcgKzQxMiwxNyBAQAogCiAvKiBBc3VzIEEyeHh4SCBfMiAqLwogCi1zdGF0aWMgY29uc3QgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCBTaVMzMTBfQ1JUMlBhcnQyX0FzdXMxMDI0eDc2OF8zW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfUGFydDJQb3J0VGJsIFNpUzMxMF9DUlQyUGFydDJfQXN1czEwMjR4NzY4XzNbXSA9CiB7Ci0ge3sweDI1LDB4MTMsMHhjOSwweDI1LDB4ZmYsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAotIHt7MHgyYywweDEzLDB4OWEsMHgyNSwweGZmLDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fSwKLSB7ezB4MjUsMHgxMywweGM5LDB4MjUsMHhmZiwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0sCi0ge3sweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH19LAotIHt7MHgzOCwweDEzLDB4MTMsMHgyNSwweGZmLDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fSwKLSB7ezB4MzgsMHgxMywweDE2LDB4MjUsMHhmZiwweDVhLDB4NDUsMHgwYSwweDA3LDB4ZmEsMHgwYSwweDI0fX0sCi0ge3sweDM2LDB4MTMsMHgxMywweDI1LDB4ZmYsMHg1YSwweDQ1LDB4MGEsMHgwNywweGZhLDB4MGEsMHgyNH19LAotIHt7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fSwKLSB7ezB4MjUsMHgxMywweGM5LDB4MjUsMHhmZiwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0KKwl7ezB4MjUsMHgxMywweGM5LDB4MjUsMHhmZiwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0sCisJe3sweDJjLDB4MTMsMHg5YSwweDI1LDB4ZmYsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAorCXt7MHgyNSwweDEzLDB4YzksMHgyNSwweGZmLDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fSwKKwl7ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfX0sCisJe3sweDM4LDB4MTMsMHgxMywweDI1LDB4ZmYsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAorCXt7MHgzOCwweDEzLDB4MTYsMHgyNSwweGZmLDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fSwKKwl7ezB4MzYsMHgxMywweDEzLDB4MjUsMHhmZiwweDVhLDB4NDUsMHgwYSwweDA3LDB4ZmEsMHgwYSwweDI0fX0sCisJe3sweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH19LAorCXt7MHgyNSwweDEzLDB4YzksMHgyNSwweGZmLDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fQogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9vc2RlZi5oIGIvZHJpdmVycy92aWRlby9zaXMvb3NkZWYuaAppbmRleCAxNTkzOWIwLi44NDFjYTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9vc2RlZi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL29zZGVmLmgKQEAgLTMsNyArMyw3IEBACiAvKgogICogT1MgZGVwZW5kaW5nIGRlZmluZXMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQogICoKICAqIElmIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgdGhlIGZvbGxvd2luZyBsaWNlbnNlIHRlcm1zCiAgKiBhcHBseToKQEAgLTU1LDggKzU1LDExIEBACiAjZGVmaW5lIF9TSVNfT1NERUZfSF8KIAogLyogVGhlIGNob2ljZXMgYXJlOiAqLwotI2RlZmluZSBMSU5VWF9LRVJORUwJICAgLyogTGludXgga2VybmVsIGZyYW1lYnVmZmVyICovCi0vKiAjZGVmaW5lIExJTlVYX1hGODYgKi8gICAvKiBYRnJlZTg2L1gub3JnICovCisjZGVmaW5lIFNJU19MSU5VWF9LRVJORUwJCS8qIExpbnV4IGtlcm5lbCBmcmFtZWJ1ZmZlciAqLworI3VuZGVmICBTSVNfWE9SR19YRjg2CQkJLyogWEZyZWU4Ni9YLm9yZyAqLworCisjdW5kZWYgU0lTX0xJTlVYX0tFUk5FTF8yNAorI3VuZGVmIFNJU19MSU5VWF9LRVJORUxfMjYKIAogI2lmZGVmIE91dFBvcnRCeXRlCiAjdW5kZWYgT3V0UG9ydEJ5dGUKQEAgLTg2LDggKzg5LDkgQEAKIC8qICBMSU5VWCBLRVJORUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKICNkZWZpbmUgU0lTMzAwCkBAIC05Nyw2ICsxMDEsMTIgQEAKICNkZWZpbmUgU0lTMzE1SAogI2VuZGlmCiAKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjZGVmaW5lIFNJU19MSU5VWF9LRVJORUxfMjYKKyNlbHNlCisjZGVmaW5lIFNJU19MSU5VWF9LRVJORUxfMjQKKyNlbmRpZgorCiAjaWYgIWRlZmluZWQoU0lTMzAwKSAmJiAhZGVmaW5lZChTSVMzMTVIKQogI3dhcm5pbmcgTmVpdGhlciBDT05GSUdfRkJfU0lTXzMwMCBub3IgQ09ORklHX0ZCX1NJU18zMTUgaXMgc2V0CiAjd2FybmluZyBzaXNmYiB3aWxsIG5vdCB3b3JrIQpAQCAtMTA5LDEzICsxMTksMTUgQEAKICNkZWZpbmUgSW5Qb3J0V29yZChwKSAgICBpbncoKFNJU0lPQUREUkVTUykocCkpCiAjZGVmaW5lIEluUG9ydExvbmcocCkgICAgaW5sKChTSVNJT0FERFJFU1MpKHApKQogI2RlZmluZSBTaVNfU2V0TWVtb3J5KE1lbW9yeUFkZHJlc3MsTWVtb3J5U2l6ZSx2YWx1ZSkgbWVtc2V0X2lvKE1lbW9yeUFkZHJlc3MsIHZhbHVlLCBNZW1vcnlTaXplKQotI2VuZGlmCisKKyNlbmRpZiAvKiBMSU5VWF9LRVJORUwgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgWEZyZWU4Ni9YLm9yZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9YRjg2CisjaWZkZWYgU0lTX1hPUkdfWEY4NgorCiAjZGVmaW5lIFNJUzMwMAogI2RlZmluZSBTSVMzMTVICiAKQEAgLTEyNiw2ICsxMzgsNyBAQAogI2RlZmluZSBJblBvcnRXb3JkKHApICAgIGluU0lTUkVHVygoSU9BRERSRVNTKShwKSkKICNkZWZpbmUgSW5Qb3J0TG9uZyhwKSAgICBpblNJU1JFR0woKElPQUREUkVTUykocCkpCiAjZGVmaW5lIFNpU19TZXRNZW1vcnkoTWVtb3J5QWRkcmVzcyxNZW1vcnlTaXplLHZhbHVlKSBtZW1zZXQoTWVtb3J5QWRkcmVzcywgdmFsdWUsIE1lbW9yeVNpemUpCi0jZW5kaWYKKworI2VuZGlmIC8qIFhGODYgKi8KIAogI2VuZGlmICAvKiBfT1NERUZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npcy5oIGIvZHJpdmVycy92aWRlby9zaXMvc2lzLmgKaW5kZXggZDAxMDNjMS4uMGI2ZTYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvc2lzLmgKKysrIGIvZHJpdmVycy92aWRlby9zaXMvc2lzLmgKQEAgLTEsOCArMSwxMCBAQAogLyoKLSAqIFNpUyAzMDAvNjMwLzczMC81NDAvMzE1LzU1MC9bTV02NTAvNjUxL1tNXTY2MVtGTV1YLzc0MC9bTV03NDFbR1hdLzMzMC9bTV03NjBbR1hdCisgKiBTaVMgMzAwLzU0MC82MzBbU10vNzMwW1NdLAorICogU2lTIDMxNVtFfFBST10vNTUwL1tNXTY1eC9bTV02NjFbRnxNXVgvNzQwL1tNXTc0MVtHWF0vMzMwL1tNXTc2eFtHWF0sCisgKiBYR0kgVjNYVC9WNS9WOCwgWjcKICAqIGZyYW1lIGJ1ZmZlciBkcml2ZXIgZm9yIExpbnV4IGtlcm5lbHMgPj0yLjQuMTQgYW5kID49Mi42LjMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xOSw4ICsyMSw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKICAqLwogCi0jaWZuZGVmIF9TSVNfSAotI2RlZmluZSBfU0lTX0gKKyNpZm5kZWYgX1NJU19IXworI2RlZmluZSBfU0lTX0hfCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CkBAIC0zNSwyNiArMzcsMzcgQEAKICNpbmNsdWRlICJ2Z2F0eXBlcy5oIgogI2luY2x1ZGUgInZzdHJ1Y3QuaCIKIAotI2RlZmluZSBWRVJfTUFKT1IgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVkVSX01JTk9SICAgICAgICAgICAgICAgICA3Ci0jZGVmaW5lIFZFUl9MRVZFTCAgICAgICAgICAgICAgICAgMTcKLQotI3VuZGVmIFNJU19DT05GSUdfQ09NUEFUCisjZGVmaW5lIFZFUl9NQUpPUgkJMQorI2RlZmluZSBWRVJfTUlOT1IJCTgKKyNkZWZpbmUgVkVSX0xFVkVMCQk5CiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNkZWZpbmUgU0lTX1BDSV9HRVRfQ0xBU1MoYSwgYikgcGNpX2dldF9jbGFzcyhhLCBiKQorI2RlZmluZSBTSVNfUENJX0dFVF9ERVZJQ0UoYSxiLGMpIHBjaV9nZXRfZGV2aWNlKGEsYixjKQorI2RlZmluZSBTSVNfUENJX0dFVF9TTE9UKGEsYikgcGNpX2dldF9zbG90KGEsYikKKyNkZWZpbmUgU0lTX1BDSV9QVVRfREVWSUNFKGEpIHBjaV9kZXZfcHV0KGEpCiAjaWZkZWYgQ09ORklHX0NPTVBBVAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCiAjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgotI2RlZmluZSBTSVNfQ09ORklHX0NPTVBBVAorI2RlZmluZSBTSVNfT0xEX0NPTkZJR19DT01QQVQKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNkZWZpbmUgU0lTX05FV19DT05GSUdfQ09NUEFUCiAjZW5kaWYKLSNlbGlmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMTkpCi0jaWZkZWYgX194ODZfNjRfXwotLyogU2hvdWxkbid0IHdlIGNoZWNrIGZvciBDT05GSUdfSUEzMl9FTVVMQVRJT04gaGVyZT8gKi8KKyNlbmRpZgkvKiBDT05GSUdfQ09NUEFUICovCisjZWxzZSAgLyogMi40ICovCisjZGVmaW5lIFNJU19QQ0lfR0VUX0NMQVNTKGEsIGIpIHBjaV9maW5kX2NsYXNzKGEsIGIpCisjZGVmaW5lIFNJU19QQ0lfR0VUX0RFVklDRShhLGIsYykgcGNpX2ZpbmRfZGV2aWNlKGEsYixjKQorI2RlZmluZSBTSVNfUENJX0dFVF9TTE9UKGEsYikgcGNpX2ZpbmRfc2xvdChhLGIpCisjZGVmaW5lIFNJU19QQ0lfUFVUX0RFVklDRShhKQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMTkpCisjaWZkZWYgX194ODZfNjRfXwkvKiBTaG91bGRuJ3Qgd2UgY2hlY2sgZm9yIENPTkZJR19JQTMyX0VNVUxBVElPTiBoZXJlPyAqLwogI2luY2x1ZGUgPGFzbS9pb2N0bDMyLmg+Ci0jZGVmaW5lIFNJU19DT05GSUdfQ09NUEFUCisjZGVmaW5lIFNJU19PTERfQ09ORklHX0NPTVBBVAogI2VuZGlmCiAjZW5kaWYKLQorI2VuZGlmIC8qIDIuNCAqLwogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiw4KQogI2RlZmluZSBTSVNfSU9UWVBFMSB2b2lkIF9faW9tZW0KICNkZWZpbmUgU0lTX0lPVFlQRTIgX19pb21lbQpAQCAtNzksMjI4ICs5MiwzMTIgQEAKIAogLyogVG8gYmUgaW5jbHVkZWQgaW4gcGNpX2lkcy5oICovCiAjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU0lfNjUwX1ZHQQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY1MF9WR0EgIDB4NjMyNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY1MF9WR0EJMHg2MzI1CiAjZW5kaWYKICNpZm5kZWYgUENJX0RFVklDRV9JRF9TSV82NTAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82NTAgICAgICAweDA2NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82NTAJCTB4MDY1MAogI2VuZGlmCiAjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU0lfNjUxCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNjUxICAgICAgMHgwNjUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNjUxCQkweDA2NTEKICNlbmRpZgogI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1NJXzc0MAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzc0MCAgICAgIDB4MDc0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzc0MAkJMHgwNzQwCiAjZW5kaWYKICNpZm5kZWYgUENJX0RFVklDRV9JRF9TSV8zMzAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV8zMzAgICAgICAweDAzMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV8zMzAJCTB4MDMzMAogI2VuZGlmCiAjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU0lfNjYwX1ZHQQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY2MF9WR0EgIDB4NjMzMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY2MF9WR0EJMHg2MzMwCiAjZW5kaWYKICNpZm5kZWYgUENJX0RFVklDRV9JRF9TSV82NjEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82NjEgICAgICAweDA2NjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82NjEJCTB4MDY2MQogI2VuZGlmCiAjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU0lfNzQxCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzQxICAgICAgMHgwNzQxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzQxCQkweDA3NDEKICNlbmRpZgogI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1NJXzY2MAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY2MCAgICAgIDB4MDY2MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY2MAkJMHgwNjYwCiAjZW5kaWYKICNpZm5kZWYgUENJX0RFVklDRV9JRF9TSV83NjAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV83NjAgICAgICAweDA3NjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV83NjAJCTB4MDc2MAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU0lfNzYxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzYxCQkweDA3NjEKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfWEdJCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfWEdJCQkweDE4Y2EKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfWEdJXzIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWEdJXzIwCQkweDAwMjAKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfWEdJXzQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWEdJXzQwCQkweDAwNDAKICNlbmRpZgogCiAvKiBUbyBiZSBpbmNsdWRlZCBpbiBmYi5oICovCiAjaWZuZGVmIEZCX0FDQ0VMX1NJU19HTEFNT1VSXzIKLSNkZWZpbmUgRkJfQUNDRUxfU0lTX0dMQU1PVVJfMgkgIDQwCS8qIFNpUyAzMTUsIDY1eCwgNzQwLCA2NjEsIDc0MSAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0lTX0dMQU1PVVJfMgk0MAkvKiBTaVMgMzE1LCA2NXgsIDc0MCwgNjYxLCA3NDEgICovCiAjZW5kaWYKICNpZm5kZWYgRkJfQUNDRUxfU0lTX1hBQlJFCi0jZGVmaW5lIEZCX0FDQ0VMX1NJU19YQUJSRSAgICAgICAgNDEJLyogU2lTIDMzMCAoIlhhYnJlIiksIDc2MCAJKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0lTX1hBQlJFCTQxCS8qIFNpUyAzMzAgKCJYYWJyZSIpLCA3NnggCSovCisjZW5kaWYKKyNpZm5kZWYgRkJfQUNDRUxfWEdJX1ZPTEFSSV9WCisjZGVmaW5lIEZCX0FDQ0VMX1hHSV9WT0xBUklfVgk0NwkvKiBYR0kgVm9sYXJpIFZ4IChWM1hULCBWNSwgVjgpCSovCisjZW5kaWYKKyNpZm5kZWYgRkJfQUNDRUxfWEdJX1ZPTEFSSV9aCisjZGVmaW5lIEZCX0FDQ0VMX1hHSV9WT0xBUklfWgk0OAkvKiBYR0kgVm9sYXJpIFo3CQkqLwogI2VuZGlmCiAKLSNkZWZpbmUgTUFYX1JPTV9TQ0FOICAgICAgICAgICAgICAweDEwMDAwCi0KIC8qIGl2aWRlby0+Y2FwcyAqLwotI2RlZmluZSBIV19DVVJTT1JfQ0FQICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgVFVSQk9fUVVFVUVfQ0FQICAgICAgICAgICAweDQwCi0jZGVmaW5lIEFHUF9DTURfUVVFVUVfQ0FQICAgICAgICAgMHgyMAotI2RlZmluZSBWTV9DTURfUVVFVUVfQ0FQICAgICAgICAgIDB4MTAKLSNkZWZpbmUgTU1JT19DTURfUVVFVUVfQ0FQICAgICAgICAweDA4CisjZGVmaW5lIEhXX0NVUlNPUl9DQVAJCTB4ODAKKyNkZWZpbmUgVFVSQk9fUVVFVUVfQ0FQCQkweDQwCisjZGVmaW5lIEFHUF9DTURfUVVFVUVfQ0FQCTB4MjAKKyNkZWZpbmUgVk1fQ01EX1FVRVVFX0NBUAkweDEwCisjZGVmaW5lIE1NSU9fQ01EX1FVRVVFX0NBUAkweDA4CiAKIC8qIEZvciAzMDAgc2VyaWVzICovCi0jZGVmaW5lIFRVUkJPX1FVRVVFX0FSRUFfU0laRSAgICAgMHg4MDAwMCAvKiA1MTJLICovCi0jZGVmaW5lIEhXX0NVUlNPUl9BUkVBX1NJWkVfMzAwICAgMHgxMDAwICAvKiA0SyAqLworI2RlZmluZSBUVVJCT19RVUVVRV9BUkVBX1NJWkUJKDUxMiAqIDEwMjQpCS8qIDUxMksgKi8KKyNkZWZpbmUgSFdfQ1VSU09SX0FSRUFfU0laRV8zMDAJNDA5NgkJLyogNEsgKi8KIAogLyogRm9yIDMxNS9YYWJyZSBzZXJpZXMgKi8KLSNkZWZpbmUgQ09NTUFORF9RVUVVRV9BUkVBX1NJWkUgICAweDgwMDAwIC8qIDUxMksgKi8KLSNkZWZpbmUgQ09NTUFORF9RVUVVRV9USFJFU0hPTEQgICAweDFGCi0jZGVmaW5lIEhXX0NVUlNPUl9BUkVBX1NJWkVfMzE1ICAgMHg0MDAwICAvKiAxNksgKi8KKyNkZWZpbmUgQ09NTUFORF9RVUVVRV9BUkVBX1NJWkUJKDUxMiAqIDEwMjQpCS8qIDUxMksgKi8KKyNkZWZpbmUgQ09NTUFORF9RVUVVRV9BUkVBX1NJWkVfWjcgKDEyOCAqIDEwMjQpCS8qIDEyOGsgZm9yIFhHSSBaNyAqLworI2RlZmluZSBIV19DVVJTT1JfQVJFQV9TSVpFXzMxNQkxNjM4NAkJLyogMTZLICovCisjZGVmaW5lIENPTU1BTkRfUVVFVUVfVEhSRVNIT0xECTB4MUYKIAotI2RlZmluZSBTSVNfT0hfQUxMT0NfU0laRSAgICAgICAgIDQwMDAKLSNkZWZpbmUgU0VOVElORUwgICAgICAgICAgICAgICAgICAweDdmZmZmZmZmCisjZGVmaW5lIFNJU19PSF9BTExPQ19TSVpFCTQwMDAKKyNkZWZpbmUgU0VOVElORUwJCTB4N2ZmZmZmZmYKIAotI2RlZmluZSBTRVFfQURSICAgICAgICAgICAgICAgICAgIDB4MTQKLSNkZWZpbmUgU0VRX0RBVEEgICAgICAgICAgICAgICAgICAweDE1Ci0jZGVmaW5lIERBQ19BRFIgICAgICAgICAgICAgICAgICAgMHgxOAotI2RlZmluZSBEQUNfREFUQSAgICAgICAgICAgICAgICAgIDB4MTkKLSNkZWZpbmUgQ1JUQ19BRFIgICAgICAgICAgICAgICAgICAweDI0Ci0jZGVmaW5lIENSVENfREFUQSAgICAgICAgICAgICAgICAgMHgyNQotI2RlZmluZSBEQUMyX0FEUiAgICAgICAgICAgICAgICAgICgweDE2LTB4MzApCi0jZGVmaW5lIERBQzJfREFUQSAgICAgICAgICAgICAgICAgKDB4MTctMHgzMCkKLSNkZWZpbmUgVkJfUEFSVDFfQURSICAgICAgICAgICAgICAoMHgwNC0weDMwKQotI2RlZmluZSBWQl9QQVJUMV9EQVRBICAgICAgICAgICAgICgweDA1LTB4MzApCi0jZGVmaW5lIFZCX1BBUlQyX0FEUiAgICAgICAgICAgICAgKDB4MTAtMHgzMCkKLSNkZWZpbmUgVkJfUEFSVDJfREFUQSAgICAgICAgICAgICAoMHgxMS0weDMwKQotI2RlZmluZSBWQl9QQVJUM19BRFIgICAgICAgICAgICAgICgweDEyLTB4MzApCi0jZGVmaW5lIFZCX1BBUlQzX0RBVEEgICAgICAgICAgICAgKDB4MTMtMHgzMCkKLSNkZWZpbmUgVkJfUEFSVDRfQURSICAgICAgICAgICAgICAoMHgxNC0weDMwKQotI2RlZmluZSBWQl9QQVJUNF9EQVRBICAgICAgICAgICAgICgweDE1LTB4MzApCisjZGVmaW5lIFNFUV9BRFIJCQkweDE0CisjZGVmaW5lIFNFUV9EQVRBCQkweDE1CisjZGVmaW5lIERBQ19BRFIJCQkweDE4CisjZGVmaW5lIERBQ19EQVRBCQkweDE5CisjZGVmaW5lIENSVENfQURSCQkweDI0CisjZGVmaW5lIENSVENfREFUQQkJMHgyNQorI2RlZmluZSBEQUMyX0FEUgkJKDB4MTYtMHgzMCkKKyNkZWZpbmUgREFDMl9EQVRBCQkoMHgxNy0weDMwKQorI2RlZmluZSBWQl9QQVJUMV9BRFIJCSgweDA0LTB4MzApCisjZGVmaW5lIFZCX1BBUlQxX0RBVEEJCSgweDA1LTB4MzApCisjZGVmaW5lIFZCX1BBUlQyX0FEUgkJKDB4MTAtMHgzMCkKKyNkZWZpbmUgVkJfUEFSVDJfREFUQQkJKDB4MTEtMHgzMCkKKyNkZWZpbmUgVkJfUEFSVDNfQURSCQkoMHgxMi0weDMwKQorI2RlZmluZSBWQl9QQVJUM19EQVRBCQkoMHgxMy0weDMwKQorI2RlZmluZSBWQl9QQVJUNF9BRFIJCSgweDE0LTB4MzApCisjZGVmaW5lIFZCX1BBUlQ0X0RBVEEJCSgweDE1LTB4MzApCiAKLSNkZWZpbmUgU0lTU1IJCQkgIGl2aWRlby0+U2lTX1ByLlNpU19QM2M0Ci0jZGVmaW5lIFNJU0NSICAgICAgICAgICAgICAgICAgICAgaXZpZGVvLT5TaVNfUHIuU2lTX1AzZDQKLSNkZWZpbmUgU0lTREFDQSAgICAgICAgICAgICAgICAgICBpdmlkZW8tPlNpU19Qci5TaVNfUDNjOAotI2RlZmluZSBTSVNEQUNEICAgICAgICAgICAgICAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19QM2M5Ci0jZGVmaW5lIFNJU1BBUlQxICAgICAgICAgICAgICAgICAgaXZpZGVvLT5TaVNfUHIuU2lTX1BhcnQxUG9ydAotI2RlZmluZSBTSVNQQVJUMiAgICAgICAgICAgICAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19QYXJ0MlBvcnQKLSNkZWZpbmUgU0lTUEFSVDMgICAgICAgICAgICAgICAgICBpdmlkZW8tPlNpU19Qci5TaVNfUGFydDNQb3J0Ci0jZGVmaW5lIFNJU1BBUlQ0ICAgICAgICAgICAgICAgICAgaXZpZGVvLT5TaVNfUHIuU2lTX1BhcnQ0UG9ydAotI2RlZmluZSBTSVNQQVJUNSAgICAgICAgICAgICAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19QYXJ0NVBvcnQKLSNkZWZpbmUgU0lTREFDMkEgICAgICAgICAgICAgICAgICBTSVNQQVJUNQotI2RlZmluZSBTSVNEQUMyRCAgICAgICAgICAgICAgICAgIChTSVNQQVJUNSArIDEpCi0jZGVmaW5lIFNJU01JU0NSICAgICAgICAgICAgICAgICAgKGl2aWRlby0+U2lTX1ByLlJlbElPICsgMHgxYykKLSNkZWZpbmUgU0lTTUlTQ1cgICAgICAgICAgICAgICAgICBpdmlkZW8tPlNpU19Qci5TaVNfUDNjMgotI2RlZmluZSBTSVNJTlBTVEFUCQkgIChpdmlkZW8tPlNpU19Qci5SZWxJTyArIDB4MmEpCi0jZGVmaW5lIFNJU1BFTAkJCSAgaXZpZGVvLT5TaVNfUHIuU2lTX1AzYzYKKyNkZWZpbmUgU0lTU1IJCQlpdmlkZW8tPlNpU19Qci5TaVNfUDNjNAorI2RlZmluZSBTSVNDUgkJCWl2aWRlby0+U2lTX1ByLlNpU19QM2Q0CisjZGVmaW5lIFNJU0RBQ0EJCQlpdmlkZW8tPlNpU19Qci5TaVNfUDNjOAorI2RlZmluZSBTSVNEQUNECQkJaXZpZGVvLT5TaVNfUHIuU2lTX1AzYzkKKyNkZWZpbmUgU0lTUEFSVDEJCWl2aWRlby0+U2lTX1ByLlNpU19QYXJ0MVBvcnQKKyNkZWZpbmUgU0lTUEFSVDIJCWl2aWRlby0+U2lTX1ByLlNpU19QYXJ0MlBvcnQKKyNkZWZpbmUgU0lTUEFSVDMJCWl2aWRlby0+U2lTX1ByLlNpU19QYXJ0M1BvcnQKKyNkZWZpbmUgU0lTUEFSVDQJCWl2aWRlby0+U2lTX1ByLlNpU19QYXJ0NFBvcnQKKyNkZWZpbmUgU0lTUEFSVDUJCWl2aWRlby0+U2lTX1ByLlNpU19QYXJ0NVBvcnQKKyNkZWZpbmUgU0lTREFDMkEJCVNJU1BBUlQ1CisjZGVmaW5lIFNJU0RBQzJECQkoU0lTUEFSVDUgKyAxKQorI2RlZmluZSBTSVNNSVNDUgkJKGl2aWRlby0+U2lTX1ByLlJlbElPICsgMHgxYykKKyNkZWZpbmUgU0lTTUlTQ1cJCWl2aWRlby0+U2lTX1ByLlNpU19QM2MyCisjZGVmaW5lIFNJU0lOUFNUQVQJCShpdmlkZW8tPlNpU19Qci5SZWxJTyArIDB4MmEpCisjZGVmaW5lIFNJU1BFTAkJCWl2aWRlby0+U2lTX1ByLlNpU19QM2M2CisjZGVmaW5lIFNJU1ZHQUVOQUJMRQkJKGl2aWRlby0+U2lTX1ByLlJlbElPICsgMHgxMykKKyNkZWZpbmUgU0lTVklECQkJKGl2aWRlby0+U2lTX1ByLlJlbElPICsgMHgwMiAtIDB4MzApCisjZGVmaW5lIFNJU0NBUAkJCShpdmlkZW8tPlNpU19Qci5SZWxJTyArIDB4MDAgLSAweDMwKQogCi0jZGVmaW5lIElORF9TSVNfUEFTU1dPUkQgICAgICAgICAgMHgwNSAgLyogU1JzICovCi0jZGVmaW5lIElORF9TSVNfQ09MT1JfTU9ERSAgICAgICAgMHgwNgotI2RlZmluZSBJTkRfU0lTX1JBTURBQ19DT05UUk9MICAgIDB4MDcKLSNkZWZpbmUgSU5EX1NJU19EUkFNX1NJWkUgICAgICAgICAweDE0Ci0jZGVmaW5lIElORF9TSVNfTU9EVUxFX0VOQUJMRSAgICAgMHgxRQotI2RlZmluZSBJTkRfU0lTX1BDSV9BRERSRVNTX1NFVCAgIDB4MjAKLSNkZWZpbmUgSU5EX1NJU19UVVJCT1FVRVVFX0FEUiAgICAweDI2Ci0jZGVmaW5lIElORF9TSVNfVFVSQk9RVUVVRV9TRVQgICAgMHgyNwotI2RlZmluZSBJTkRfU0lTX1BPV0VSX09OX1RSQVAgICAgIDB4MzgKLSNkZWZpbmUgSU5EX1NJU19QT1dFUl9PTl9UUkFQMiAgICAweDM5Ci0jZGVmaW5lIElORF9TSVNfQ01EUVVFVUVfU0VUICAgICAgMHgyNgotI2RlZmluZSBJTkRfU0lTX0NNRFFVRVVFX1RIUkVTSE9MRCAgMHgyNworI2RlZmluZSBJTkRfU0lTX1BBU1NXT1JECQkweDA1ICAvKiBTUnMgKi8KKyNkZWZpbmUgSU5EX1NJU19DT0xPUl9NT0RFCQkweDA2CisjZGVmaW5lIElORF9TSVNfUkFNREFDX0NPTlRST0wJCTB4MDcKKyNkZWZpbmUgSU5EX1NJU19EUkFNX1NJWkUJCTB4MTQKKyNkZWZpbmUgSU5EX1NJU19NT0RVTEVfRU5BQkxFCQkweDFFCisjZGVmaW5lIElORF9TSVNfUENJX0FERFJFU1NfU0VUCQkweDIwCisjZGVmaW5lIElORF9TSVNfVFVSQk9RVUVVRV9BRFIJCTB4MjYKKyNkZWZpbmUgSU5EX1NJU19UVVJCT1FVRVVFX1NFVAkJMHgyNworI2RlZmluZSBJTkRfU0lTX1BPV0VSX09OX1RSQVAJCTB4MzgKKyNkZWZpbmUgSU5EX1NJU19QT1dFUl9PTl9UUkFQMgkJMHgzOQorI2RlZmluZSBJTkRfU0lTX0NNRFFVRVVFX1NFVAkJMHgyNgorI2RlZmluZSBJTkRfU0lTX0NNRFFVRVVFX1RIUkVTSE9MRAkweDI3CiAKLSNkZWZpbmUgSU5EX1NJU19BR1BfSU9fUEFEICAgICAgICAweDQ4CisjZGVmaW5lIElORF9TSVNfQUdQX0lPX1BBRAkweDQ4CiAKLSNkZWZpbmUgU0lTX0NSVDJfV0VOQUJMRV8zMDAgCSAgMHgyNCAgLyogUGFydDEgKi8KLSNkZWZpbmUgU0lTX0NSVDJfV0VOQUJMRV8zMTUgCSAgMHgyRgorI2RlZmluZSBTSVNfQ1JUMl9XRU5BQkxFXzMwMAkweDI0ICAvKiBQYXJ0MSAqLworI2RlZmluZSBTSVNfQ1JUMl9XRU5BQkxFXzMxNQkweDJGCiAKLSNkZWZpbmUgU0lTX1BBU1NXT1JEICAgICAgICAgICAgICAweDg2ICAvKiBTUjA1ICovCisjZGVmaW5lIFNJU19QQVNTV09SRAkJMHg4NiAgLyogU1IwNSAqLwogCi0jZGVmaW5lIFNJU19JTlRFUkxBQ0VEX01PREUgICAgICAgMHgyMCAgLyogU1IwNiAqLwotI2RlZmluZSBTSVNfOEJQUF9DT0xPUl9NT0RFICAgICAgIDB4MAotI2RlZmluZSBTSVNfMTVCUFBfQ09MT1JfTU9ERSAgICAgIDB4MQotI2RlZmluZSBTSVNfMTZCUFBfQ09MT1JfTU9ERSAgICAgIDB4MgotI2RlZmluZSBTSVNfMzJCUFBfQ09MT1JfTU9ERSAgICAgIDB4NAorI2RlZmluZSBTSVNfSU5URVJMQUNFRF9NT0RFCTB4MjAgIC8qIFNSMDYgKi8KKyNkZWZpbmUgU0lTXzhCUFBfQ09MT1JfTU9ERQkweDAKKyNkZWZpbmUgU0lTXzE1QlBQX0NPTE9SX01PREUJMHgxCisjZGVmaW5lIFNJU18xNkJQUF9DT0xPUl9NT0RFCTB4MgorI2RlZmluZSBTSVNfMzJCUFBfQ09MT1JfTU9ERQkweDQKIAotI2RlZmluZSBTSVNfRU5BQkxFXzJEICAgICAgICAgICAgIDB4NDAgIC8qIFNSMUUgKi8KKyNkZWZpbmUgU0lTX0VOQUJMRV8yRAkJMHg0MCAgLyogU1IxRSAqLwogCi0jZGVmaW5lIFNJU19NRU1fTUFQX0lPX0VOQUJMRSAgICAgMHgwMSAgLyogU1IyMCAqLwotI2RlZmluZSBTSVNfUENJX0FERFJfRU5BQkxFICAgICAgIDB4ODAKKyNkZWZpbmUgU0lTX01FTV9NQVBfSU9fRU5BQkxFCTB4MDEgIC8qIFNSMjAgKi8KKyNkZWZpbmUgU0lTX1BDSV9BRERSX0VOQUJMRQkweDgwCiAKLSNkZWZpbmUgU0lTX0FHUF9DTURRVUVVRV9FTkFCTEUgICAweDgwICAvKiAzMTUvMzMwIHNlcmllcyBTUjI2ICovCi0jZGVmaW5lIFNJU19WUkFNX0NNRFFVRVVFX0VOQUJMRSAgMHg0MAotI2RlZmluZSBTSVNfTU1JT19DTURfRU5BQkxFICAgICAgIDB4MjAKLSNkZWZpbmUgU0lTX0NNRF9RVUVVRV9TSVpFXzUxMmsgICAweDAwCi0jZGVmaW5lIFNJU19DTURfUVVFVUVfU0laRV8xTSAgICAgMHgwNAotI2RlZmluZSBTSVNfQ01EX1FVRVVFX1NJWkVfMk0gICAgIDB4MDgKLSNkZWZpbmUgU0lTX0NNRF9RVUVVRV9TSVpFXzRNICAgICAweDBDCi0jZGVmaW5lIFNJU19DTURfUVVFVUVfUkVTRVQgICAgICAgMHgwMQotI2RlZmluZSBTSVNfQ01EX0FVVE9fQ09SUgkgIDB4MDIKKyNkZWZpbmUgU0lTX0FHUF9DTURRVUVVRV9FTkFCTEUJCTB4ODAgIC8qIDMxNS8zMzAvMzQwIHNlcmllcyBTUjI2ICovCisjZGVmaW5lIFNJU19WUkFNX0NNRFFVRVVFX0VOQUJMRQkweDQwCisjZGVmaW5lIFNJU19NTUlPX0NNRF9FTkFCTEUJCTB4MjAKKyNkZWZpbmUgU0lTX0NNRF9RVUVVRV9TSVpFXzUxMmsJCTB4MDAKKyNkZWZpbmUgU0lTX0NNRF9RVUVVRV9TSVpFXzFNCQkweDA0CisjZGVmaW5lIFNJU19DTURfUVVFVUVfU0laRV8yTQkJMHgwOAorI2RlZmluZSBTSVNfQ01EX1FVRVVFX1NJWkVfNE0JCTB4MEMKKyNkZWZpbmUgU0lTX0NNRF9RVUVVRV9SRVNFVAkJMHgwMQorI2RlZmluZSBTSVNfQ01EX0FVVE9fQ09SUgkJMHgwMgogCi0jZGVmaW5lIFNJU19TSU1VTFRBTkVPVVNfVklFV19FTkFCTEUgIDB4MDEgIC8qIENSMzAgKi8KLSNkZWZpbmUgU0lTX01PREVfU0VMRUNUX0NSVDIgICAgICAweDAyCi0jZGVmaW5lIFNJU19WQl9PVVRQVVRfQ09NUE9TSVRFICAgMHgwNAotI2RlZmluZSBTSVNfVkJfT1VUUFVUX1NWSURFTyAgICAgIDB4MDgKLSNkZWZpbmUgU0lTX1ZCX09VVFBVVF9TQ0FSVCAgICAgICAweDEwCi0jZGVmaW5lIFNJU19WQl9PVVRQVVRfTENEICAgICAgICAgMHgyMAotI2RlZmluZSBTSVNfVkJfT1VUUFVUX0NSVDIgICAgICAgIDB4NDAKLSNkZWZpbmUgU0lTX1ZCX09VVFBVVF9ISVZJU0lPTiAgICAweDgwCisjZGVmaW5lIFNJU19DTURfUVVFVUVfU0laRV9aN182NGsJMHgwMCAvKiBYR0kgWjcgKi8KKyNkZWZpbmUgU0lTX0NNRF9RVUVVRV9TSVpFX1o3XzEyOGsJMHgwNAogCi0jZGVmaW5lIFNJU19WQl9PVVRQVVRfRElTQUJMRSAgICAgMHgyMCAgLyogQ1IzMSAqLwotI2RlZmluZSBTSVNfRFJJVkVSX01PREUgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgU0lTX1NJTVVMVEFORU9VU19WSUVXX0VOQUJMRQkweDAxICAvKiBDUjMwICovCisjZGVmaW5lIFNJU19NT0RFX1NFTEVDVF9DUlQyCQkweDAyCisjZGVmaW5lIFNJU19WQl9PVVRQVVRfQ09NUE9TSVRFCQkweDA0CisjZGVmaW5lIFNJU19WQl9PVVRQVVRfU1ZJREVPCQkweDA4CisjZGVmaW5lIFNJU19WQl9PVVRQVVRfU0NBUlQJCTB4MTAKKyNkZWZpbmUgU0lTX1ZCX09VVFBVVF9MQ0QJCTB4MjAKKyNkZWZpbmUgU0lTX1ZCX09VVFBVVF9DUlQyCQkweDQwCisjZGVmaW5lIFNJU19WQl9PVVRQVVRfSElWSVNJT04JCTB4ODAKIAotI2RlZmluZSBTSVNfVkJfQ09NUE9TSVRFICAgICAgICAgIDB4MDEgIC8qIENSMzIgKi8KLSNkZWZpbmUgU0lTX1ZCX1NWSURFTyAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIFNJU19WQl9TQ0FSVCAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBTSVNfVkJfTENEICAgICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgU0lTX1ZCX0NSVDIgICAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIFNJU19DUlQxICAgICAgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBTSVNfVkJfSElWSVNJT04gICAgICAgICAgIDB4NDAKLSNkZWZpbmUgU0lTX1ZCX1lQQlBSICAgICAgICAgICAgICAweDgwCi0jZGVmaW5lIFNJU19WQl9UViAgICAgICAgICAgICAgICAgKFNJU19WQl9DT01QT1NJVEUgfCBTSVNfVkJfU1ZJREVPIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVNfVkJfU0NBUlQgfCBTSVNfVkJfSElWSVNJT04gfCBTSVNfVkJfWVBCUFIpCisjZGVmaW5lIFNJU19WQl9PVVRQVVRfRElTQUJMRQkweDIwICAvKiBDUjMxICovCisjZGVmaW5lIFNJU19EUklWRVJfTU9ERQkJMHg0MAogCi0jZGVmaW5lIFNJU19FWFRFUk5BTF9DSElQX01BU0sgICAgCSAgIDB4MEUgIC8qIENSMzcgKDwgU2lTIDY2MCkgKi8KLSNkZWZpbmUgU0lTX0VYVEVSTkFMX0NISVBfU0lTMzAxICAgICAgICAgICAweDAxICAvKiBpbiBDUjM3IDw8IDEgISAqLwotI2RlZmluZSBTSVNfRVhURVJOQUxfQ0hJUF9MVkRTICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgU0lTX0VYVEVSTkFMX0NISVBfVFJVTVBJT04gICAgICAgICAweDAzCi0jZGVmaW5lIFNJU19FWFRFUk5BTF9DSElQX0xWRFNfQ0hST05URUwgICAgMHgwNAotI2RlZmluZSBTSVNfRVhURVJOQUxfQ0hJUF9DSFJPTlRFTCAgICAgICAgIDB4MDUKLSNkZWZpbmUgU0lTMzEwX0VYVEVSTkFMX0NISVBfTFZEUyAgICAgICAgICAweDAyCi0jZGVmaW5lIFNJUzMxMF9FWFRFUk5BTF9DSElQX0xWRFNfQ0hST05URUwgMHgwMworI2RlZmluZSBTSVNfVkJfQ09NUE9TSVRFCTB4MDEgIC8qIENSMzIgKi8KKyNkZWZpbmUgU0lTX1ZCX1NWSURFTwkJMHgwMgorI2RlZmluZSBTSVNfVkJfU0NBUlQJCTB4MDQKKyNkZWZpbmUgU0lTX1ZCX0xDRAkJMHgwOAorI2RlZmluZSBTSVNfVkJfQ1JUMgkJMHgxMAorI2RlZmluZSBTSVNfQ1JUMQkJMHgyMAorI2RlZmluZSBTSVNfVkJfSElWSVNJT04JCTB4NDAKKyNkZWZpbmUgU0lTX1ZCX1lQQlBSCQkweDgwCisjZGVmaW5lIFNJU19WQl9UVgkJKFNJU19WQl9DT01QT1NJVEUgfCBTSVNfVkJfU1ZJREVPIHwgXAorCQkJCVNJU19WQl9TQ0FSVCB8IFNJU19WQl9ISVZJU0lPTiB8IFNJU19WQl9ZUEJQUikKIAotI2RlZmluZSBTSVNfQUdQXzJYICAgICAgICAgICAgICAgIDB4MjAgIC8qIENSNDggKi8KKyNkZWZpbmUgU0lTX0VYVEVSTkFMX0NISVBfTUFTSwkJCTB4MEUgIC8qIENSMzcgKDwgU2lTIDY2MCkgKi8KKyNkZWZpbmUgU0lTX0VYVEVSTkFMX0NISVBfU0lTMzAxCQkweDAxICAvKiBpbiBDUjM3IDw8IDEgISAqLworI2RlZmluZSBTSVNfRVhURVJOQUxfQ0hJUF9MVkRTCQkJMHgwMgorI2RlZmluZSBTSVNfRVhURVJOQUxfQ0hJUF9UUlVNUElPTgkJMHgwMworI2RlZmluZSBTSVNfRVhURVJOQUxfQ0hJUF9MVkRTX0NIUk9OVEVMCQkweDA0CisjZGVmaW5lIFNJU19FWFRFUk5BTF9DSElQX0NIUk9OVEVMCQkweDA1CisjZGVmaW5lIFNJUzMxMF9FWFRFUk5BTF9DSElQX0xWRFMJCTB4MDIKKyNkZWZpbmUgU0lTMzEwX0VYVEVSTkFMX0NISVBfTFZEU19DSFJPTlRFTAkweDAzCiAKLSNkZWZpbmUgSFdfREVWSUNFX0VYVEVOU0lPTgkgIFNJU19IV19JTkZPCi0jZGVmaW5lIFBIV19ERVZJQ0VfRVhURU5TSU9OICAgICAgUFNJU19IV19JTkZPCisjZGVmaW5lIFNJU19BR1BfMlgJCTB4MjAgIC8qIENSNDggKi8KKworLyogdmJmbGFncywgcHJpdmF0ZSBlbnRyaWVzIChvdGhlcnMgaW4gc2lzZmIuaCkgKi8KKyNkZWZpbmUgVkJfQ09ORVhBTlQJCTB4MDAwMDA4MDAJLyogNjYxIHNlcmllcyBvbmx5ICovCisjZGVmaW5lIFZCX1RSVU1QSU9OCQlWQl9DT05FWEFOVAkvKiAzMDAgc2VyaWVzIG9ubHkgKi8KKyNkZWZpbmUgVkJfMzAyRUxWCQkweDAwMDA0MDAwCisjZGVmaW5lIFZCXzMwMQkJCTB4MDAxMDAwMDAJLyogVmlkZW8gYnJpZGdlIHR5cGUgKi8KKyNkZWZpbmUgVkJfMzAxQgkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgVkJfMzAyQgkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgVkJfMzB4QkRICQkweDAwODAwMDAwCS8qIDMweEIgREggdmVyc2lvbiAody9vIExDRCBzdXBwb3J0KSAqLworI2RlZmluZSBWQl9MVkRTCQkJMHgwMTAwMDAwMAorI2RlZmluZSBWQl9DSFJPTlRFTAkJMHgwMjAwMDAwMAorI2RlZmluZSBWQl8zMDFMVgkJMHgwNDAwMDAwMAorI2RlZmluZSBWQl8zMDJMVgkJMHgwODAwMDAwMAorI2RlZmluZSBWQl8zMDFDCQkJMHgxMDAwMDAwMAorCisjZGVmaW5lIFZCX1NJU0JSSURHRQkJKFZCXzMwMXxWQl8zMDFCfFZCXzMwMUN8VkJfMzAyQnxWQl8zMDFMVnxWQl8zMDJMVnxWQl8zMDJFTFYpCisjZGVmaW5lIFZCX1ZJREVPQlJJREdFCQkoVkJfU0lTQlJJREdFIHwgVkJfTFZEUyB8IFZCX0NIUk9OVEVMIHwgVkJfQ09ORVhBTlQpCisKKy8qIHZiZmxhZ3MyIChzdGF0aWMgc3R1ZmYgb25seSEpICovCisjZGVmaW5lIFZCMl9TSVNVTUMJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVkIyXzMwMQkJCTB4MDAwMDAwMDIJLyogVmlkZW8gYnJpZGdlIHR5cGUgKi8KKyNkZWZpbmUgVkIyXzMwMUIJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVkIyXzMwMUMJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVkIyXzMwN1QJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVkIyXzMwMkIJCTB4MDAwMDA4MDAKKyNkZWZpbmUgVkIyXzMwMUxWCQkweDAwMDAxMDAwCisjZGVmaW5lIFZCMl8zMDJMVgkJMHgwMDAwMjAwMAorI2RlZmluZSBWQjJfMzAyRUxWCQkweDAwMDA0MDAwCisjZGVmaW5lIFZCMl8zMDdMVgkJMHgwMDAwODAwMAorI2RlZmluZSBWQjJfMzB4QkRICQkweDA4MDAwMDAwICAgICAgLyogMzB4QiBESCB2ZXJzaW9uICh3L28gTENEIHN1cHBvcnQpICovCisjZGVmaW5lIFZCMl9DT05FWEFOVAkJMHgxMDAwMDAwMAorI2RlZmluZSBWQjJfVFJVTVBJT04JCTB4MjAwMDAwMDAKKyNkZWZpbmUgVkIyX0xWRFMJCTB4NDAwMDAwMDAKKyNkZWZpbmUgVkIyX0NIUk9OVEVMCQkweDgwMDAwMDAwCisKKyNkZWZpbmUgVkIyX1NJU0xWRFNCUklER0UJKFZCMl8zMDFMViB8IFZCMl8zMDJMViB8IFZCMl8zMDJFTFYgfCBWQjJfMzA3TFYpCisjZGVmaW5lIFZCMl9TSVNUTURTQlJJREdFCShWQjJfMzAxICAgfCBWQjJfMzAxQiAgfCBWQjJfMzAxQyAgIHwgVkIyXzMwMkIgfCBWQjJfMzA3VCkKKyNkZWZpbmUgVkIyX1NJU0JSSURHRQkJKFZCMl9TSVNMVkRTQlJJREdFIHwgVkIyX1NJU1RNRFNCUklER0UpCisKKyNkZWZpbmUgVkIyX1NJU1RNRFNMQ0RBQlJJREdFCShWQjJfMzAxQyB8IFZCMl8zMDdUKQorI2RlZmluZSBWQjJfU0lTTENEQUJSSURHRQkoVkIyX1NJU1RNRFNMQ0RBQlJJREdFIHwgVkIyXzMwMUxWIHwgVkIyXzMwMkxWIHwgVkIyXzMwMkVMViB8IFZCMl8zMDdMVikKKworI2RlZmluZSBWQjJfU0lTSElWSVNJT05CUklER0UJKFZCMl8zMDEgIHwgVkIyXzMwMUIgfCBWQjJfMzAyQikKKyNkZWZpbmUgVkIyX1NJU1lQQlBSQlJJREdFCShWQjJfMzAxQyB8IFZCMl8zMDdUIHwgVkIyX1NJU0xWRFNCUklER0UpCisjZGVmaW5lIFZCMl9TSVNZUEJQUkFSQlJJREdFCShWQjJfMzAxQyB8IFZCMl8zMDdUIHwgVkIyXzMwN0xWKQorI2RlZmluZSBWQjJfU0lTVEFQNFNDQUxFUgkoVkIyXzMwMUMgfCBWQjJfMzA3VCB8IFZCMl8zMDJFTFYgfCBWQjJfMzA3TFYpCisjZGVmaW5lIFZCMl9TSVNUVkJSSURHRQkJKFZCMl9TSVNISVZJU0lPTkJSSURHRSB8IFZCMl9TSVNZUEJQUkJSSURHRSkKKworI2RlZmluZSBWQjJfU0lTVkdBMkJSSURHRQkoVkIyXzMwMSB8IFZCMl8zMDFCIHwgVkIyXzMwMUMgfCBWQjJfMzAyQiB8IFZCMl8zMDdUKQorCisjZGVmaW5lIFZCMl9WSURFT0JSSURHRQkJKFZCMl9TSVNCUklER0UgfCBWQjJfTFZEUyB8IFZCMl9DSFJPTlRFTCB8IFZCMl9DT05FWEFOVCkKKworI2RlZmluZSBWQjJfMzB4QgkJKFZCMl8zMDFCICB8IFZCMl8zMDFDICAgfCBWQjJfMzAyQiAgfCBWQjJfMzA3VCkKKyNkZWZpbmUgVkIyXzMweEJMVgkJKFZCMl8zMHhCICB8IFZCMl9TSVNMVkRTQlJJREdFKQorI2RlZmluZSBWQjJfMzB4QwkJKFZCMl8zMDFDICB8IFZCMl8zMDdUKQorI2RlZmluZSBWQjJfMzB4Q0xWCQkoVkIyXzMwMUMgIHwgVkIyXzMwN1QgICB8IFZCMl8zMDJFTFZ8IFZCMl8zMDdMVikKKyNkZWZpbmUgVkIyX1NJU0VNSUJSSURHRQkoVkIyXzMwMkxWIHwgVkIyXzMwMkVMViB8IFZCMl8zMDdMVikKKyNkZWZpbmUgVkIyX0xDRDE2Mk1IWkJSSURHRQkoVkIyXzMwMUMgIHwgVkIyXzMwN1QpCisjZGVmaW5lIFZCMl9MQ0RPVkVSMTI4MEJSSURHRQkoVkIyXzMwMUMgIHwgVkIyXzMwN1QgICB8IFZCMl8zMDJMViB8IFZCMl8zMDJFTFYgfCBWQjJfMzA3TFYpCisjZGVmaW5lIFZCMl9MQ0RPVkVSMTYwMEJSSURHRQkoVkIyXzMwN1QgIHwgVkIyXzMwN0xWKQorI2RlZmluZSBWQjJfUkFNREFDMjAyTUhaQlJJREdFCShWQjJfMzAxQyAgfCBWQjJfMzA3VCkKIAogLyogSS9PIHBvcnQgYWNjZXNzIG1hY3JvcyAqLwotI2RlZmluZSBpblNJU1JFRyhiYXNlKSAgICAgICAgICBpbmIoYmFzZSkKKyNkZWZpbmUgaW5TSVNSRUcoYmFzZSkJCWluYihiYXNlKQogCi0jZGVmaW5lIG91dFNJU1JFRyhiYXNlLHZhbCkgICAgIG91dGIodmFsLGJhc2UpCisjZGVmaW5lIG91dFNJU1JFRyhiYXNlLHZhbCkJb3V0Yih2YWwsYmFzZSkKIAogI2RlZmluZSBvclNJU1JFRyhiYXNlLHZhbCkgICAgICAJCQlcCi0JCSAgICBkbyB7IAkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgdTggX19UZW1wID0gaW5TSVNSRUcoYmFzZSk7IAlcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0U0lTUkVHKGJhc2UsIF9fVGVtcCB8ICh2YWwpKTsgCVwKLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMCkKKwkJZG8gewkJCQkJXAorCQkJdTggX19UZW1wID0gaW5TSVNSRUcoYmFzZSk7IAlcCisJCQlvdXRTSVNSRUcoYmFzZSwgX19UZW1wIHwgKHZhbCkpO1wKKwkJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBhbmRTSVNSRUcoYmFzZSx2YWwpICAgICAJCQlcCi0JCSAgICBkbyB7IAkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgdTggX19UZW1wID0gaW5TSVNSRUcoYmFzZSk7IAlcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0U0lTUkVHKGJhc2UsIF9fVGVtcCAmICh2YWwpKTsgCVwKLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMCkKKwkJZG8gewkJCQkJXAorCQkJdTggX19UZW1wID0gaW5TSVNSRUcoYmFzZSk7IAlcCisJCQlvdXRTSVNSRUcoYmFzZSwgX19UZW1wICYgKHZhbCkpO1wKKwkJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBpblNJU0lEWFJFRyhiYXNlLGlkeCx2YXIpICAgCQlcCi0JCSAgICBkbyB7IAkJCVwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRTSVNSRUcoYmFzZSwgaWR4KTsgCVwKLQkJICAgICAgdmFyID0gaW5TSVNSRUcoKGJhc2UpKzEpOwlcCi0gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIGluU0lTSURYUkVHKGJhc2UsaWR4LHZhcikJCQlcCisJCWRvIHsJCQkJCVwKKwkJCW91dFNJU1JFRyhiYXNlLCBpZHgpOyAJCVwKKwkJCXZhciA9IGluU0lTUkVHKChiYXNlKSsxKTsJXAorCQl9IHdoaWxlICgwKQogCi0jZGVmaW5lIG91dFNJU0lEWFJFRyhiYXNlLGlkeCx2YWwpICAJCVwKLQkJICAgIGRvIHsgCQkJXAotICAgICAgICAgICAgICAgICAgICAgIG91dFNJU1JFRyhiYXNlLCBpZHgpOyAJXAotCQkgICAgICBvdXRTSVNSRUcoKGJhc2UpKzEsIHZhbCk7IFwKLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgb3V0U0lTSURYUkVHKGJhc2UsaWR4LHZhbCkJCQlcCisJCWRvIHsJCQkJCVwKKwkJCW91dFNJU1JFRyhiYXNlLCBpZHgpOwkJXAorCQkJb3V0U0lTUkVHKChiYXNlKSsxLCB2YWwpOwlcCisJCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgb3JTSVNJRFhSRUcoYmFzZSxpZHgsdmFsKSAgIAkJCQlcCi0JCSAgICBkbyB7IAkJCQkJXAotICAgICAgICAgICAgICAgICAgICAgIHU4IF9fVGVtcDsgCQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRTSVNSRUcoYmFzZSwgaWR4KTsgICAJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgX19UZW1wID0gaW5TSVNSRUcoKGJhc2UpKzEpIHwgKHZhbCk7IAlcCi0JCSAgICAgIG91dFNJU1JFRygoYmFzZSkrMSwgX19UZW1wKTsJCVwKLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgb3JTSVNJRFhSRUcoYmFzZSxpZHgsdmFsKQkJCQlcCisJCWRvIHsJCQkJCQlcCisJCQl1OCBfX1RlbXA7IAkJCQlcCisJCQlvdXRTSVNSRUcoYmFzZSwgaWR4KTsgICAJCVwKKwkJCV9fVGVtcCA9IGluU0lTUkVHKChiYXNlKSsxKSB8ICh2YWwpOyAJXAorCQkJb3V0U0lTUkVHKChiYXNlKSsxLCBfX1RlbXApOwkJXAorCQl9IHdoaWxlICgwKQogCi0jZGVmaW5lIGFuZFNJU0lEWFJFRyhiYXNlLGlkeCxhbmQpICAJCQkJXAotCQkgICAgZG8geyAJCQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICB1OCBfX1RlbXA7IAkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0U0lTUkVHKGJhc2UsIGlkeCk7ICAgCQkJXAotICAgICAgICAgICAgICAgICAgICAgIF9fVGVtcCA9IGluU0lTUkVHKChiYXNlKSsxKSAmIChhbmQpOyAJXAotCQkgICAgICBvdXRTSVNSRUcoKGJhc2UpKzEsIF9fVGVtcCk7CQlcCi0gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIGFuZFNJU0lEWFJFRyhiYXNlLGlkeCxhbmQpCQkJCVwKKwkJZG8gewkJCQkJCVwKKwkJCXU4IF9fVGVtcDsgCQkJCVwKKwkJCW91dFNJU1JFRyhiYXNlLCBpZHgpOyAgIAkJXAorCQkJX19UZW1wID0gaW5TSVNSRUcoKGJhc2UpKzEpICYgKGFuZCk7IAlcCisJCQlvdXRTSVNSRUcoKGJhc2UpKzEsIF9fVGVtcCk7CQlcCisJCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgc2V0U0lTSURYUkVHKGJhc2UsaWR4LGFuZCxvcikgICAJCSAgIAkJXAotCQkgICAgZG8geyAJCQkJICAgCQlcCi0gICAgICAgICAgICAgICAgICAgICAgdTggX19UZW1wOyAJCSAgIAkJCVwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRTSVNSRUcoYmFzZSwgaWR4KTsgICAJCSAgIAkJXAotICAgICAgICAgICAgICAgICAgICAgIF9fVGVtcCA9IChpblNJU1JFRygoYmFzZSkrMSkgJiAoYW5kKSkgfCAob3IpOyAJXAotCQkgICAgICBvdXRTSVNSRUcoKGJhc2UpKzEsIF9fVGVtcCk7CQkJXAotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBzZXRTSVNJRFhSRUcoYmFzZSxpZHgsYW5kLG9yKSAgIAkJCQlcCisJCWRvIHsJCQkJCQkJXAorCQkJdTggX19UZW1wOyAJCQkJCVwKKwkJCW91dFNJU1JFRyhiYXNlLCBpZHgpOwkJCQlcCisJCQlfX1RlbXAgPSAoaW5TSVNSRUcoKGJhc2UpKzEpICYgKGFuZCkpIHwgKG9yKTsgCVwKKwkJCW91dFNJU1JFRygoYmFzZSkrMSwgX19UZW1wKTsJCQlcCisJCX0gd2hpbGUgKDApCiAKIC8qIE1NSU8gYWNjZXNzIG1hY3JvcyAqLwogI2RlZmluZSBNTUlPX0lOOChiYXNlLCBvZmZzZXQpICByZWFkYigoYmFzZStvZmZzZXQpKQpAQCAtMzIyLDE5ICs0MTksMTkgQEAKICNkZWZpbmUgTU1JT19RVUVVRV9SRUFEUE9SVCAgICAgUV9SRUFEX1BUUgogCiAjaWZuZGVmIEZCX0JMQU5LX1VOQkxBTksKLSNkZWZpbmUgRkJfQkxBTktfVU5CTEFOSyAJMAorI2RlZmluZSBGQl9CTEFOS19VTkJMQU5LCTAKICNlbmRpZgogI2lmbmRlZiBGQl9CTEFOS19OT1JNQUwKLSNkZWZpbmUgRkJfQkxBTktfTk9STUFMICAJMQorI2RlZmluZSBGQl9CTEFOS19OT1JNQUwJCTEKICNlbmRpZgogI2lmbmRlZiBGQl9CTEFOS19WU1lOQ19TVVNQRU5ECi0jZGVmaW5lIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQgCTIKKyNkZWZpbmUgRkJfQkxBTktfVlNZTkNfU1VTUEVORAkyCiAjZW5kaWYKICNpZm5kZWYgRkJfQkxBTktfSFNZTkNfU1VTUEVORAotI2RlZmluZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EIAkzCisjZGVmaW5lIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQJMwogI2VuZGlmCiAjaWZuZGVmIEZCX0JMQU5LX1BPV0VSRE9XTgotI2RlZmluZSBGQl9CTEFOS19QT1dFUkRPV04gCTQKKyNkZWZpbmUgRkJfQkxBTktfUE9XRVJET1dOCTQKICNlbmRpZgogCiBlbnVtIF9TSVNfTENEX1RZUEUgewpAQCAtMzQ3LDE4ICs0NDQsMTkgQEAKICAgICBMQ0RfMTYwMHgxMjAwLAogICAgIExDRF8xOTIweDE0NDAsCiAgICAgTENEXzIwNDh4MTUzNiwKLSAgICBMQ0RfMzIweDQ4MCwgICAgICAgLyogRlNUTiAqLworICAgIExDRF8zMjB4MjQwLAkvKiBGU1ROICovCiAgICAgTENEXzE0MDB4MTA1MCwKICAgICBMQ0RfMTE1Mng4NjQsCiAgICAgTENEXzExNTJ4NzY4LAogICAgIExDRF8xMjgweDc2OCwKICAgICBMQ0RfMTAyNHg2MDAsCi0gICAgTENEXzY0MHg0ODBfMiwgICAgIC8qIERTVE4gKi8KLSAgICBMQ0RfNjQweDQ4MF8zLCAgICAgLyogRFNUTiAqLworICAgIExDRF8zMjB4MjQwXzIsCS8qIERTVE4gKi8KKyAgICBMQ0RfMzIweDI0MF8zLAkvKiBEU1ROICovCiAgICAgTENEXzg0OHg0ODAsCiAgICAgTENEXzEyODB4ODAwLAogICAgIExDRF8xNjgweDEwNTAsCiAgICAgTENEXzEyODB4NzIwLAorICAgIExDRF8xMjgweDg1NCwKICAgICBMQ0RfQ1VTVE9NLAogICAgIExDRF9VTktOT1dOCiB9OwpAQCAtMzY4LDMxICs0NjYsNTAgQEAKICAgICBBR1BfQ01EX1FVRVVFLAogICAgIFZNX0NNRF9RVUVVRSwKIH07Ci10eXBlZGVmIHVuc2lnbmVkIGludCBTSVNfQ01EVFlQRTsKKworc3RydWN0IFNJU19PSCB7CisJc3RydWN0IFNJU19PSCAqcG9oX25leHQ7CisJc3RydWN0IFNJU19PSCAqcG9oX3ByZXY7CisJdTMyICAgICAgICAgICAgb2Zmc2V0OworCXUzMiAgICAgICAgICAgIHNpemU7Cit9OworCitzdHJ1Y3QgU0lTX09IQUxMT0MgeworCXN0cnVjdCBTSVNfT0hBTExPQyAqcG9oYV9uZXh0OworCXN0cnVjdCBTSVNfT0ggYW9oWzFdOworfTsKKworc3RydWN0IFNJU19IRUFQIHsKKwlzdHJ1Y3QgU0lTX09ICW9oX2ZyZWU7CisJc3RydWN0IFNJU19PSAlvaF91c2VkOworCXN0cnVjdCBTSVNfT0gJKnBvaF9mcmVlbGlzdDsKKwlzdHJ1Y3QgU0lTX09IQUxMT0MgKnBvaGFfY2hhaW47CisJdTMyCQltYXhfZnJlZXNpemU7CisJc3RydWN0IHNpc192aWRlb19pbmZvICp2aW5mbzsKK307CiAKIC8qIE91ciAicGFyIiAqLwogc3RydWN0IHNpc192aWRlb19pbmZvIHsKIAlpbnQJCWNhcmRudW1iZXI7CiAJc3RydWN0IGZiX2luZm8gICptZW15c2VsZmFuZGk7CiAKLQlTSVNfSFdfSU5GTyAJc2lzaHdfZXh0OwotCVNpU19Qcml2YXRlICAJU2lTX1ByOworCXN0cnVjdCBTaVNfUHJpdmF0ZSBTaVNfUHI7CiAKLQlzaXNmYl9pbmZvIAlzaXNmYmluZm87CS8qIEZvciBpb2N0bCBTSVNGQl9HRVRfSU5GTyAqLworCXN0cnVjdCBzaXNmYl9pbmZvIHNpc2ZiaW5mbzsJLyogRm9yIGlvY3RsIFNJU0ZCX0dFVF9JTkZPICovCiAKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gZGVmYXVsdF92YXI7CiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHNpc2ZiX2ZpeDsKLQl1MzIgCQlwc2V1ZG9fcGFsZXR0ZVsxN107CisJdTMyCQlwc2V1ZG9fcGFsZXR0ZVsxN107CiAjZW5kaWYKIAogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXN0cnVjdCBkaXNwbGF5IAkJIHNpc19kaXNwOworCXN0cnVjdCBkaXNwbGF5CQkgc2lzX2Rpc3A7CiAJc3RydWN0IGRpc3BsYXlfc3dpdGNoIAkgc2lzZmJfc3c7CiAJc3RydWN0IHsKIAkJdTE2IHJlZCwgZ3JlZW4sIGJsdWUsIHBhZDsKLQl9IAkJc2lzX3BhbGV0dGVbMjU2XTsKKwl9CQlzaXNfcGFsZXR0ZVsyNTZdOwogCXVuaW9uIHsKICNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKIAkJdTE2IGNmYjE2WzE2XTsKQEAgLTQwMCwxMCArNTE3LDEwIEBACiAjaWZkZWYgRkJDT05fSEFTX0NGQjMyCiAJCXUzMiBjZmIzMlsxNl07CiAjZW5kaWYKLQl9IAkJc2lzX2ZiY29uX2NtYXA7CisJfQkJc2lzX2ZiY29uX2NtYXA7CiAjZW5kaWYKIAotICAgICAgICBzdHJ1Y3Qgc2lzZmJfbW9uaXRvciB7CisJc3RydWN0IHNpc2ZiX21vbml0b3IgewogCQl1MTYgaG1pbjsKIAkJdTE2IGhtYXg7CiAJCXUxNiB2bWluOwpAQCAtNDExLDE2MyArNTI4LDE2NiBAQAogCQl1MzIgZGNsb2NrbWF4OwogCQl1OCAgZmVhdHVyZTsKIAkJQk9PTEVBTiBkYXRhdmFsaWQ7Ci0JfSAJCXNpc2ZiX3RoaXNtb25pdG9yOworCX0JCXNpc2ZiX3RoaXNtb25pdG9yOwogCi0JaW50ICAgICAgICAgICAJY2hpcF9pZDsKKwl1bnNpZ25lZCBzaG9ydAljaGlwX2lkOwkvKiBQQ0kgSUQgb2YgY2hpcCAqLworCXVuc2lnbmVkIHNob3J0CWNoaXBfdmVuZG9yOwkvKiBQQ0kgSUQgb2YgdmVuZG9yICovCiAJY2hhcgkJbXlpZFs0MF07CiAKIAlzdHJ1Y3QgcGNpX2RldiAgKm5icmlkZ2U7CisJc3RydWN0IHBjaV9kZXYgICpscGNkZXY7CiAKIAlpbnQJCW1uaTsJLyogTW9kZSBudW1iZXIgaW5kZXggKi8KIAogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCWludCAgCQljdXJyY29uOworCWludAkJY3VycmNvbjsKICNlbmRpZgogCiAJdW5zaWduZWQgbG9uZwl2aWRlb19zaXplOwotCXVuc2lnbmVkIGxvbmcgCXZpZGVvX2Jhc2U7CisJdW5zaWduZWQgbG9uZwl2aWRlb19iYXNlOwogCXVuc2lnbmVkIGxvbmcJbW1pb19zaXplOwotCXVuc2lnbmVkIGxvbmcgCW1taW9fYmFzZTsKLQl1bnNpZ25lZCBsb25nIAl2Z2FfYmFzZTsKKwl1bnNpZ25lZCBsb25nCW1taW9fYmFzZTsKKwl1bnNpZ25lZCBsb25nCXZnYV9iYXNlOwogCi0JU0lTX0lPVFlQRTEgIAkqdmlkZW9fdmJhc2U7Ci0JU0lTX0lPVFlQRTEgCSptbWlvX3ZiYXNlOworCXVuc2lnbmVkIGxvbmcJdmlkZW9fb2Zmc2V0OwogCi0JdW5zaWduZWQgY2hhciAgICpiaW9zX2FiYXNlOworCXVuc2lnbmVkIGxvbmcJVU1Bc2l6ZSwgTEZCc2l6ZTsKIAotCWludCAJCW10cnI7CisJU0lTX0lPVFlQRTEJKnZpZGVvX3ZiYXNlOworCVNJU19JT1RZUEUxCSptbWlvX3ZiYXNlOworCisJdW5zaWduZWQgY2hhcgkqYmlvc19hYmFzZTsKKworCWludAkJbXRycjsKIAogCXUzMgkJc2lzZmJfbWVtOwogCi0JdTMyIAkJc2lzZmJfcGFybV9tZW07Ci0JaW50IAkgICAJc2lzZmJfYWNjZWw7Ci0JaW50IAkJc2lzZmJfeXBhbjsKLQlpbnQgCQlzaXNmYl9tYXg7Ci0JaW50IAkJc2lzZmJfdXNlcm9tOwotCWludCAJCXNpc2ZiX3VzZW9lbTsKKwl1MzIJCXNpc2ZiX3Bhcm1fbWVtOworCWludAkJc2lzZmJfYWNjZWw7CisJaW50CQlzaXNmYl95cGFuOworCWludAkJc2lzZmJfbWF4OworCWludAkJc2lzZmJfdXNlcm9tOworCWludAkJc2lzZmJfdXNlb2VtOwogCWludAkJc2lzZmJfbW9kZV9pZHg7CiAJaW50CQlzaXNmYl9wYXJtX3JhdGU7CiAJaW50CQlzaXNmYl9jcnQxb2ZmOwogCWludAkJc2lzZmJfZm9yY2VjcnQxOwogCWludAkJc2lzZmJfY3J0MnR5cGU7CiAJaW50CQlzaXNmYl9jcnQyZmxhZ3M7Ci0JaW50IAkJc2lzZmJfZHN0bjsKLQlpbnQgCQlzaXNmYl9mc3RuOworCWludAkJc2lzZmJfZHN0bjsKKwlpbnQJCXNpc2ZiX2ZzdG47CiAJaW50CQlzaXNmYl90dnBsdWc7CiAJaW50CQlzaXNmYl90dnN0ZDsKLQlpbnQJCXNpc2ZiX2ZpbHRlcjsKIAlpbnQJCXNpc2ZiX25vY3J0MnJhdGU7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJaW50CQlzaXNmYl9pbnZlcnNlOwogI2VuZGlmCiAKLQl1MzIgCQloZWFwc3RhcnQ7ICAgICAgICAJLyogb2Zmc2V0ICAqLwotCVNJU19JT1RZUEUxICAJKnNpc2ZiX2hlYXBfc3RhcnQ7IAkvKiBhZGRyZXNzICovCi0JU0lTX0lPVFlQRTEgIAkqc2lzZmJfaGVhcF9lbmQ7ICAgCS8qIGFkZHJlc3MgKi8KLQl1MzIgCSAgICAgIAlzaXNmYl9oZWFwX3NpemU7CisJdTMyCQloZWFwc3RhcnQ7CQkvKiBvZmZzZXQgICovCisJU0lTX0lPVFlQRTEJKnNpc2ZiX2hlYXBfc3RhcnQ7CS8qIGFkZHJlc3MgKi8KKwlTSVNfSU9UWVBFMQkqc2lzZmJfaGVhcF9lbmQ7CS8qIGFkZHJlc3MgKi8KKwl1MzIJCXNpc2ZiX2hlYXBfc2l6ZTsKIAlpbnQJCWhhdmVub2hlYXA7Ci0jaWYgMAotCVNJU19IRUFQICAgICAgIAlzaXNmYl9oZWFwOwotI2VuZGlmCiAKKwlzdHJ1Y3QgU0lTX0hFQVAJc2lzZmJfaGVhcDsJCS8qIFRoaXMgY2FyZCdzIHZyYW0gaGVhcCAqLwogCi0JaW50ICAgIAkJdmlkZW9fYnBwOwotCWludCAgICAJCXZpZGVvX2NtYXBfbGVuOwotCWludCAgICAJCXZpZGVvX3dpZHRoOwotCWludCAgICAJCXZpZGVvX2hlaWdodDsKLQl1bnNpZ25lZCBpbnQgCXJlZnJlc2hfcmF0ZTsKKwlpbnQJCXZpZGVvX2JwcDsKKwlpbnQJCXZpZGVvX2NtYXBfbGVuOworCWludAkJdmlkZW9fd2lkdGg7CisJaW50CQl2aWRlb19oZWlnaHQ7CisJdW5zaWduZWQgaW50CXJlZnJlc2hfcmF0ZTsKIAotCXVuc2lnbmVkIGludCAJY2hpcDsKLQl1OCAgIAkJcmV2aXNpb25faWQ7CisJdW5zaWduZWQgaW50CWNoaXA7CisJdTgJCXJldmlzaW9uX2lkOworCWludAkJc2lzdmdhX2VuYWJsZWQ7CQkvKiBQQ0kgZGV2aWNlIHdhcyBlbmFibGVkICovCiAKLQlpbnQgICAgCQl2aWRlb19saW5lbGVuZ3RoOwkvKiByZWFsIHBpdGNoICovCisJaW50CQl2aWRlb19saW5lbGVuZ3RoOwkvKiByZWFsIHBpdGNoICovCiAJaW50CQlzY3JucGl0Y2hDUlQxOwkJLyogcGl0Y2ggcmVnYXJkaW5nIGludGVybGFjZSAqLwogCi0gICAgICAgIHUxNiAJCURzdENvbG9yOwkJLyogRm9yIDJkIGFjY2VsZXJhdGlvbiAqLwotCXUzMiAgCQlTaVMzMTBfQWNjZWxEZXB0aDsKLQl1MzIgIAkJQ29tbWFuZFJlZzsKLQlpbnQJCWNtZHF1ZXVlbGVuZ3RoOworCXUxNgkJRHN0Q29sb3I7CQkvKiBGb3IgMmQgYWNjZWxlcmF0aW9uICovCisJdTMyCQlTaVMzMTBfQWNjZWxEZXB0aDsKKwl1MzIJCUNvbW1hbmRSZWc7CisJaW50CQljbWRxdWV1ZWxlbmd0aDsJCS8qIEN1cnJlbnQgKGZvciBhY2NlbCkgKi8KKwl1MzIJCWNtZFF1ZXVlU2l6ZTsJCS8qIFRvdGFsIHNpemUgaW4gS0IgKi8KIAotCXNwaW5sb2NrX3QgICAgIAlsb2NrYWNjZWw7CQkvKiBEbyBub3QgdXNlIG91dHNpZGUgb2Yga2VybmVsISAqLworCXNwaW5sb2NrX3QJbG9ja2FjY2VsOwkJLyogRG8gbm90IHVzZSBvdXRzaWRlIG9mIGtlcm5lbCEgKi8KIAotICAgICAgICB1bnNpZ25lZCBpbnQgICAJcGNpYnVzOwotCXVuc2lnbmVkIGludCAgIAlwY2lzbG90OwotCXVuc2lnbmVkIGludCAgIAlwY2lmdW5jOworCXVuc2lnbmVkIGludAlwY2lidXM7CisJdW5zaWduZWQgaW50CXBjaXNsb3Q7CisJdW5zaWduZWQgaW50CXBjaWZ1bmM7CiAKLQlpbnQgCSAgICAgICAJYWNjZWw7CisJaW50CQlhY2NlbDsKKwlpbnQJCWVuZ2luZW9rOwogCi0JdTE2IAkJc3Vic3lzdmVuZG9yOwotCXUxNiAJCXN1YnN5c2RldmljZTsKKwl1MTYJCXN1YnN5c3ZlbmRvcjsKKwl1MTYJCXN1YnN5c2RldmljZTsKIAotCXUzMiAgCQl2YmZsYWdzOwkJLyogUmVwbGFjaW5nIGRlcHJlY2F0ZWQgc3R1ZmYgZnJvbSBhYm92ZSAqLwotCXUzMiAgCQljdXJyZW50dmJmbGFnczsKKwl1MzIJCXZiZmxhZ3M7CQkvKiBSZXBsYWNpbmcgZGVwcmVjYXRlZCBzdHVmZiBmcm9tIGFib3ZlICovCisJdTMyCQljdXJyZW50dmJmbGFnczsKKwl1MzIJCXZiZmxhZ3MyOwogCiAJaW50CQlsY2R4cmVzLCBsY2R5cmVzOwogCWludAkJbGNkZGVmbW9kZWlkeCwgdHZkZWZtb2RlaWR4LCBkZWZtb2RlaWR4OwotCXUzMiAgCQlDUlQyTENEVHlwZTsgICAgICAgIAkvKiBkZWZpbmVkIGluICJTSVNfTENEX1RZUEUiICovCisJdTMyCQlDUlQyTENEVHlwZTsJCS8qIGRlZmluZWQgaW4gIlNJU19MQ0RfVFlQRSIgKi8KKwl1MzIJCWN1ckZTVE4sIGN1ckRTVE47CiAKLQlpbnQgICAgCQljdXJyZW50X2JwcDsKLQlpbnQgICAgCQljdXJyZW50X3dpZHRoOwotCWludCAgICAJCWN1cnJlbnRfaGVpZ2h0OwotCWludCAgICAJCWN1cnJlbnRfaHRvdGFsOwotCWludCAgICAJCWN1cnJlbnRfdnRvdGFsOworCWludAkJY3VycmVudF9icHA7CisJaW50CQljdXJyZW50X3dpZHRoOworCWludAkJY3VycmVudF9oZWlnaHQ7CisJaW50CQljdXJyZW50X2h0b3RhbDsKKwlpbnQJCWN1cnJlbnRfdnRvdGFsOwogCWludAkJY3VycmVudF9saW5lbGVuZ3RoOwotCV9fdTMyICAJCWN1cnJlbnRfcGl4Y2xvY2s7Ci0JaW50ICAgIAkJY3VycmVudF9yZWZyZXNoX3JhdGU7CisJX191MzIJCWN1cnJlbnRfcGl4Y2xvY2s7CisJaW50CQljdXJyZW50X3JlZnJlc2hfcmF0ZTsKIAotCXU4ICAJCW1vZGVfbm87Ci0JdTggIAkJcmF0ZV9pZHg7Ci0JaW50ICAgIAkJbW9kZWNoYW5nZWQ7Ci0JdW5zaWduZWQgY2hhciAJbW9kZXByZWNoYW5nZTsKKwl1bnNpZ25lZCBpbnQJY3VycmVudF9iYXNlOworCisJdTgJCW1vZGVfbm87CisJdTgJCXJhdGVfaWR4OworCWludAkJbW9kZWNoYW5nZWQ7CisJdW5zaWduZWQgY2hhcgltb2RlcHJlY2hhbmdlOwogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXU4IAkJc2lzZmJfbGFzdHJhdGVzWzEyOF07CisJdTgJCXNpc2ZiX2xhc3RyYXRlc1sxMjhdOwogI2VuZGlmCiAKLQlpbnQgIAkJbmV3cm9tOwotCWludCAgCQlyZWdpc3RlcmVkOworCWludAkJbmV3cm9tOworCWludAkJaGF2ZVhHSVJPTTsKKwlpbnQJCXJlZ2lzdGVyZWQ7CiAJaW50CQl3YXJuY291bnQ7CisjaWZkZWYgU0lTX09MRF9DT05GSUdfQ09NUEFUCisJaW50CQlpb2N0bDMycmVnaXN0ZXJlZDsKKyNlbmRpZgogCi0JaW50IAkJc2lzdmdhX2VuZ2luZTsKLQlpbnQgCQlod2N1cnNvcl9zaXplOwotCWludCAJCUNSVDJfd3JpdGVfZW5hYmxlOwotCXU4ICAgICAgICAgICAgCWNhcHM7CisJaW50CQlzaXN2Z2FfZW5naW5lOworCWludAkJaHdjdXJzb3Jfc2l6ZTsKKwlpbnQJCUNSVDJfd3JpdGVfZW5hYmxlOworCXU4CQljYXBzOwogCi0JdTggCQlkZXRlY3RlZHBkYzsKLQl1OCAJCWRldGVjdGVkcGRjYTsKLQl1OCAJCWRldGVjdGVkbGNkYTsKKwl1OAkJZGV0ZWN0ZWRwZGM7CisJdTgJCWRldGVjdGVkcGRjYTsKKwl1OAkJZGV0ZWN0ZWRsY2RhOwogCi0JU0lTX0lPVFlQRTEgCSpod2N1cnNvcl92YmFzZTsKKwlTSVNfSU9UWVBFMQkqaHdjdXJzb3JfdmJhc2U7CiAKLQlpbnQgCQljaHJvbnRlbHR5cGU7Ci0JaW50ICAgIAkJdHZ4cG9zLCB0dnlwb3M7Ci0JdTggICAgICAgICAgICAgIHAyXzFmLHAyXzIwLHAyXzJiLHAyXzQyLHAyXzQzLHAyXzAxLHAyXzAyOworCWludAkJY2hyb250ZWx0eXBlOworCWludAkJdHZ4cG9zLCB0dnlwb3M7CisJdTgJCXAyXzFmLHAyXzIwLHAyXzJiLHAyXzQyLHAyXzQzLHAyXzAxLHAyXzAyOwogCWludAkJdHZ4LCB0dnk7CiAKLQl1OCAJCXNpc2ZibG9ja2VkOworCXU4CQlzaXNmYmxvY2tlZDsKKworCXN0cnVjdCBzaXNmYl9pbmZvIHNpc2ZiX2luZm9ibG9jazsKKworCXN0cnVjdCBzaXNmYl9jbWQgc2lzZmJfY29tbWFuZDsKKworCXUzMgkJc2lzZmJfaWQ7CisKKwl1OAkJc2lzZmJfY2FuX3Bvc3Q7CisJdTgJCXNpc2ZiX2NhcmRfcG9zdGVkOworCXU4CQlzaXNmYl93YXNfYm9vdF9kZXZpY2U7CiAKIAlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKm5leHQ7CiB9OwogCi10eXBlZGVmIHN0cnVjdCBfU0lTX09IIHsKLQlzdHJ1Y3QgX1NJU19PSCAqcG9oX25leHQ7Ci0Jc3RydWN0IF9TSVNfT0ggKnBvaF9wcmV2OwotCXUzMiAgICAgICAgICAgIG9mZnNldDsKLQl1MzIgICAgICAgICAgICBzaXplOwotfSBTSVNfT0g7Ci0KLXR5cGVkZWYgc3RydWN0IF9TSVNfT0hBTExPQyB7Ci0Jc3RydWN0IF9TSVNfT0hBTExPQyAqcG9oYV9uZXh0OwotCVNJU19PSCBhb2hbMV07Ci19IFNJU19PSEFMTE9DOwotCi10eXBlZGVmIHN0cnVjdCBfU0lTX0hFQVAgewotCVNJU19PSCAgICAgIG9oX2ZyZWU7Ci0JU0lTX09IICAgICAgb2hfdXNlZDsKLQlTSVNfT0ggICAgICAqcG9oX2ZyZWVsaXN0OwotCVNJU19PSEFMTE9DICpwb2hhX2NoYWluOwotCXUzMiAgICAgICAgIG1heF9mcmVlc2l6ZTsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKnZpbmZvOwotfSBTSVNfSEVBUDsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfYWNjZWwuYyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19hY2NlbC5jCmluZGV4IDMwZTkwYTUuLmJhYjkzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19hY2NlbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19hY2NlbC5jCkBAIC0xLDYgKzEsOCBAQAogLyoKLSAqIFNpUyAzMDAvNjMwLzczMC81NDAvMzE1LzU1MC82NXgvNzR4LzMzMC83NjAgZnJhbWUgYnVmZmVyIGRyaXZlcgotICogZm9yIExpbnV4IGtlcm5lbHMgMi40LnggYW5kIDIuNi54CisgKiBTaVMgMzAwLzU0MC82MzBbU10vNzMwW1NdLAorICogU2lTIDMxNVtFfFBST10vNTUwL1tNXTY1MC82NTEvW01dNjYxW0Z8TV1YLzc0MC9bTV03NDFbR1hdLzMzMC9bTV03NjBbR1hdLAorICogWEdJIFYzWFQvVjUvVjgsIFo3CisgKiBmcmFtZSBidWZmZXIgZHJpdmVyIGZvciBMaW51eCBrZXJuZWxzID49IDIuNC4xNCBhbmQgPj0yLjYuMwogICoKICAqIDJEIGFjY2VsZXJhdGlvbiBwYXJ0CiAgKgpAQCAtMTksNyArMjEsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCiAgKgogICogQmFzZWQgb24gdGhlIFhGcmVlODYvWC5vcmcgZHJpdmVyIHdoaWNoIGlzCi0gKiAgICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCisgKiAgICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCiAgKgogICogQXV0aG9yOiBUaG9tYXMgV2luaXNjaGhvZmVyIDx0aG9tYXNAd2luaXNjaGhvZmVyLm5ldD4KICAqCQkJKHNlZSBodHRwOi8vd3d3LndpbmlzY2hob2Zlci5uZXQvCkBAIC0zMCwxMyArMzIsMTEgQEAKICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZWxlY3Rpb24uaD4KKyNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTE4OCw3ICsxODgsNyBAQAogfQogI2VuZGlmCiAKLS8qIDMxNS8zMzAgc2VyaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIDMxNS8zMzAvMzQwIHNlcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQogc3RhdGljIHZvaWQKQEAgLTIwMiw3ICsyMDIsNyBAQAogewogCVNpUzMxMFNldHVwRFNUQ29sb3JEZXB0aChpdmlkZW8tPkRzdENvbG9yKTsKIAlTaVMzMTBTZXR1cFNSQ1BpdGNoKGl2aWRlby0+dmlkZW9fbGluZWxlbmd0aCkKLQlTaVMzMTBTZXR1cERTVFJlY3QoaXZpZGVvLT52aWRlb19saW5lbGVuZ3RoLCAweGZmZmYpCisJU2lTMzEwU2V0dXBEU1RSZWN0KGl2aWRlby0+dmlkZW9fbGluZWxlbmd0aCwgMHgwZmZmKQogCWlmKHRyYW5zX2NvbG9yICE9IC0xKSB7CiAJCVNpUzMxMFNldHVwUk9QKDB4MEEpCiAJCVNpUzMxMFNldHVwU1JDVHJhbnModHJhbnNfY29sb3IpCkBAIC0yMTMsNyArMjEzLDcgQEAKIAkJLyogU2lTU2V0dXBDTURGbGFnKEJJVEJMVCB8IFNSQ1ZJREVPKSAqLwogCX0KIAlTaVMzMTBTZXR1cENNREZsYWcoaXZpZGVvLT5TaVMzMTBfQWNjZWxEZXB0aCkKLQkvKiBUaGUgMzE1IHNlcmllcyBpcyBzbWFydCBlbm91Z2ggdG8ga25vdyB0aGUgZGlyZWN0aW9uICovCisJLyogVGhlIGNoaXAgaXMgc21hcnQgZW5vdWdoIHRvIGtub3cgdGhlIGRpcmVjdGlvbiAqLwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjIzLDM1ICsyMjMsMzggQEAKIAl1MzIgc3JjYmFzZSA9IDAsIGRzdGJhc2UgPSAwOwogCWludCBteW1pbiA9IG1pbihzcmNfeSwgZHN0X3kpOwogCWludCBteW1heCA9IG1heChzcmNfeSwgZHN0X3kpOwotCQorCiAJLyogQWx0aG91Z2ggdGhlIGNoaXAga25vd3MgdGhlIGRpcmVjdGlvbiB0byB1c2UKLQkgKiBpZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmVhcyBvdmVybGFwLCAKKwkgKiBpZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmVhcyBvdmVybGFwLAogCSAqIHRoYXQgbG9naWMgZmFpbHMgaWYgd2UgZmlkZGxlIHdpdGggdGhlIGJpdG1hcAogCSAqIGFkZHJlc3Nlcy4gVGhlcmVmb3JlLCB3ZSBjaGVjayBpZiB0aGUgc291cmNlCi0JICogYW5kIGRlc3RpbmF0aW9uIGJsaXR0aW5nIGFyZWFzIG92ZXJsYXAgYW5kIAotCSAqIGFkYXB0IHRoZSBiaXRtYXAgYWRkcmVzc2VzIHN5bmNocm9ub3VzbHkgCisJICogYW5kIGRlc3RpbmF0aW9uIGJsaXR0aW5nIGFyZWFzIG92ZXJsYXAgYW5kCisJICogYWRhcHQgdGhlIGJpdG1hcCBhZGRyZXNzZXMgc3luY2hyb25vdXNseQogCSAqIGlmIHRoZSBjb29yZGluYXRlcyBleGNlZWQgdGhlIHZhbGlkIHJhbmdlLgotCSAqIFRoZSB0aGUgYXJlYXMgZG8gbm90IG92ZXJsYXAsIHdlIGRvIG91ciAKKwkgKiBUaGUgdGhlIGFyZWFzIGRvIG5vdCBvdmVybGFwLCB3ZSBkbyBvdXIKIAkgKiBub3JtYWwgY2hlY2suCiAJICovCi0JaWYoKG15bWF4IC0gbXltaW4pIDwgaGVpZ2h0KSB7IAotCSAgIGlmKChzcmNfeSA+PSAyMDQ4KSB8fCAoZHN0X3kgPj0gMjA0OCkpIHsJICAgICAgCi0JICAgICAgc3JjYmFzZSA9IGl2aWRlby0+dmlkZW9fbGluZWxlbmd0aCAqIG15bWluOwotCSAgICAgIGRzdGJhc2UgPSBpdmlkZW8tPnZpZGVvX2xpbmVsZW5ndGggKiBteW1pbjsKLQkgICAgICBzcmNfeSAtPSBteW1pbjsKLQkgICAgICBkc3RfeSAtPSBteW1pbjsKLQkgICB9CisJaWYoKG15bWF4IC0gbXltaW4pIDwgaGVpZ2h0KSB7CisJCWlmKChzcmNfeSA+PSAyMDQ4KSB8fCAoZHN0X3kgPj0gMjA0OCkpIHsKKwkJCXNyY2Jhc2UgPSBpdmlkZW8tPnZpZGVvX2xpbmVsZW5ndGggKiBteW1pbjsKKwkJCWRzdGJhc2UgPSBpdmlkZW8tPnZpZGVvX2xpbmVsZW5ndGggKiBteW1pbjsKKwkJCXNyY195IC09IG15bWluOworCQkJZHN0X3kgLT0gbXltaW47CisJCX0KIAl9IGVsc2UgewotCSAgIGlmKHNyY195ID49IDIwNDgpIHsKLQkgICAgICBzcmNiYXNlID0gaXZpZGVvLT52aWRlb19saW5lbGVuZ3RoICogc3JjX3k7Ci0JICAgICAgc3JjX3kgPSAwOwotCSAgIH0KLQkgICBpZihkc3RfeSA+PSAyMDQ4KSB7Ci0JICAgICAgZHN0YmFzZSA9IGl2aWRlby0+dmlkZW9fbGluZWxlbmd0aCAqIGRzdF95OwotCSAgICAgIGRzdF95ID0gMDsKLQkgICB9CisJCWlmKHNyY195ID49IDIwNDgpIHsKKwkJCXNyY2Jhc2UgPSBpdmlkZW8tPnZpZGVvX2xpbmVsZW5ndGggKiBzcmNfeTsKKwkJCXNyY195ID0gMDsKKwkJfQorCQlpZihkc3RfeSA+PSAyMDQ4KSB7CisJCQlkc3RiYXNlID0gaXZpZGVvLT52aWRlb19saW5lbGVuZ3RoICogZHN0X3k7CisJCQlkc3RfeSA9IDA7CisJCX0KIAl9CiAKKwlzcmNiYXNlICs9IGl2aWRlby0+dmlkZW9fb2Zmc2V0OworCWRzdGJhc2UgKz0gaXZpZGVvLT52aWRlb19vZmZzZXQ7CisKIAlTaVMzMTBTZXR1cFNSQ0Jhc2Uoc3JjYmFzZSk7CiAJU2lTMzEwU2V0dXBEU1RCYXNlKGRzdGJhc2UpOwogCVNpUzMxMFNldHVwUmVjdCh3aWR0aCwgaGVpZ2h0KQpAQCAtMjY0LDcgKzI2Nyw3IEBACiBTaVMzMTBTZXR1cEZvclNvbGlkRmlsbChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgdTMyIGNvbG9yLCBpbnQgcm9wKQogewogCVNpUzMxMFNldHVwUEFURkcoY29sb3IpCi0JU2lTMzEwU2V0dXBEU1RSZWN0KGl2aWRlby0+dmlkZW9fbGluZWxlbmd0aCwgMHhmZmZmKQorCVNpUzMxMFNldHVwRFNUUmVjdChpdmlkZW8tPnZpZGVvX2xpbmVsZW5ndGgsIDB4MGZmZikKIAlTaVMzMTBTZXR1cERTVENvbG9yRGVwdGgoaXZpZGVvLT5Ec3RDb2xvcik7CiAJU2lTMzEwU2V0dXBST1Aoc2lzUGF0QUxVQ29udltyb3BdKQogCVNpUzMxMFNldHVwQ01ERmxhZyhQQVRGRyB8IGl2aWRlby0+U2lTMzEwX0FjY2VsRGVwdGgpCkBAIC0yNzksNiArMjgyLDcgQEAKIAkJZHN0YmFzZSA9IGl2aWRlby0+dmlkZW9fbGluZWxlbmd0aCAqIHk7CiAJCXkgPSAwOwogCX0KKwlkc3RiYXNlICs9IGl2aWRlby0+dmlkZW9fb2Zmc2V0OwogCVNpUzMxMFNldHVwRFNUQmFzZShkc3RiYXNlKQogCVNpUzMxMFNldHVwRFNUWFkoeCx5KQogCVNpUzMxMFNldHVwUmVjdCh3LGgpCkBAIC0yOTQsMzg0ICsyOTgsMTUzIEBACiBpbnQgc2lzZmJfaW5pdGFjY2VsKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewogI2lmZGVmIFNJU0ZCX1VTRV9TUElOTE9DS1MKLSAgICBzcGluX2xvY2tfaW5pdCgmaXZpZGVvLT5sb2NrYWNjZWwpOworCXNwaW5fbG9ja19pbml0KCZpdmlkZW8tPmxvY2thY2NlbCk7CiAjZW5kaWYKLSAgICByZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgc2lzZmJfc3luY2FjY2VsKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewotICAgIGlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0gICAgCVNpUzMwMFN5bmMoaXZpZGVvKTsKKwkJU2lTMzAwU3luYyhpdmlkZW8pOwogI2VuZGlmCi0gICAgfSBlbHNlIHsKKwl9IGVsc2UgewogI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Ci0gICAgCVNpUzMxMFN5bmMoaXZpZGVvKTsKKwkJU2lTMzEwU3luYyhpdmlkZW8pOwogI2VuZGlmCi0gICAgfQorCX0KIH0KIAogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkgIC8qIC0tLS0tLS0tLS0tLS0tLSAyLjUgLS0tLS0tLS0tLS0tLS0tICovCiAKIGludCBmYmNvbl9zaXNfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLSAgIHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLSAgIENSSVRGTEFHUworCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKKwlDUklURkxBR1MKIAotICAgaWYoIWl2aWRlby0+YWNjZWwpCi0gICAJcmV0dXJuIDA7CisJaWYoKCFpdmlkZW8tPmFjY2VsKSB8fCAoIWl2aWRlby0+ZW5naW5lb2spKQorCQlyZXR1cm4gMDsKIAotICAgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0jaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKLSAgICAgIFNpUzMwMFN5bmMoaXZpZGVvKTsKLSNlbmRpZgotICAgfSBlbHNlIHsKLSNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotICAgICAgU2lTMzEwU3luYyhpdmlkZW8pOwotI2VuZGlmCi0gICB9Ci0gICBDUklURU5ECi0gICByZXR1cm4gMDsKKwlDUklUQkVHSU4KKwlzaXNmYl9zeW5jYWNjZWwoaXZpZGVvKTsKKwlDUklURU5ECisKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBmYmNvbl9zaXNfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkKIHsKLSAgIHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLSAgIHUzMiBjb2wgPSAwOwotICAgdTMyIHZ4cmVzID0gaW5mby0+dmFyLnhyZXNfdmlydHVhbDsKLSAgIHUzMiB2eXJlcyA9IGluZm8tPnZhci55cmVzX3ZpcnR1YWw7Ci0gICBpbnQgd2lkdGgsIGhlaWdodDsKLSAgIENSSVRGTEFHUworCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKKwl1MzIgY29sID0gMDsKKwl1MzIgdnhyZXMgPSBpbmZvLT52YXIueHJlc192aXJ0dWFsOworCXUzMiB2eXJlcyA9IGluZm8tPnZhci55cmVzX3ZpcnR1YWw7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJQ1JJVEZMQUdTCiAKLSAgIGlmKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKSB7Ci0JcmV0dXJuOwotICAgfQorCWlmKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm47CiAKLSAgIGlmKCFpdmlkZW8tPmFjY2VsKSB7Ci0JY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOwotCXJldHVybjsKLSAgIH0KLSAgIAotICAgaWYoIXJlY3QtPndpZHRoIHx8ICFyZWN0LT5oZWlnaHQgfHwgcmVjdC0+ZHggPj0gdnhyZXMgfHwgcmVjdC0+ZHkgPj0gdnlyZXMpIHsKLQlyZXR1cm47Ci0gICB9CisJaWYoKCFpdmlkZW8tPmFjY2VsKSB8fCAoIWl2aWRlby0+ZW5naW5lb2spKSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkJcmV0dXJuOworCX0KIAotICAgLyogQ2xpcHBpbmcgKi8KLSAgIHdpZHRoID0gKChyZWN0LT5keCArIHJlY3QtPndpZHRoKSA+IHZ4cmVzKSA/ICh2eHJlcyAtIHJlY3QtPmR4KSA6IHJlY3QtPndpZHRoOwotICAgaGVpZ2h0ID0gKChyZWN0LT5keSArIHJlY3QtPmhlaWdodCkgPiB2eXJlcykgPyAodnlyZXMgLSByZWN0LT5keSkgOiByZWN0LT5oZWlnaHQ7CisJaWYoIXJlY3QtPndpZHRoIHx8ICFyZWN0LT5oZWlnaHQgfHwgcmVjdC0+ZHggPj0gdnhyZXMgfHwgcmVjdC0+ZHkgPj0gdnlyZXMpCisJCXJldHVybjsKIAotICAgc3dpdGNoKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCS8qIENsaXBwaW5nICovCisJd2lkdGggPSAoKHJlY3QtPmR4ICsgcmVjdC0+d2lkdGgpID4gdnhyZXMpID8gKHZ4cmVzIC0gcmVjdC0+ZHgpIDogcmVjdC0+d2lkdGg7CisJaGVpZ2h0ID0gKChyZWN0LT5keSArIHJlY3QtPmhlaWdodCkgPiB2eXJlcykgPyAodnlyZXMgLSByZWN0LT5keSkgOiByZWN0LT5oZWlnaHQ7CisKKwlzd2l0Y2goaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSA4OiAgY29sID0gcmVjdC0+Y29sb3I7CiAJCSBicmVhazsKIAljYXNlIDE2OgogCWNhc2UgMzI6IGNvbCA9ICgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVjdC0+Y29sb3JdOwogCQkgYnJlYWs7Ci0gICB9CisJfQogCi0gICBpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKwlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMwMAotICAgICAgQ1JJVEJFR0lOCi0gICAgICBTaVMzMDBTZXR1cEZvclNvbGlkRmlsbChpdmlkZW8sIGNvbCwgbXlyb3BzW3JlY3QtPnJvcF0pOwotICAgICAgU2lTMzAwU3Vic2VxdWVudFNvbGlkRmlsbFJlY3QoaXZpZGVvLCByZWN0LT5keCwgcmVjdC0+ZHksIHdpZHRoLCBoZWlnaHQpOwotICAgICAgQ1JJVEVORAotICAgICAgU2lTMzAwU3luYyhpdmlkZW8pOworCQlDUklUQkVHSU4KKwkJU2lTMzAwU2V0dXBGb3JTb2xpZEZpbGwoaXZpZGVvLCBjb2wsIG15cm9wc1tyZWN0LT5yb3BdKTsKKwkJU2lTMzAwU3Vic2VxdWVudFNvbGlkRmlsbFJlY3QoaXZpZGVvLCByZWN0LT5keCwgcmVjdC0+ZHksIHdpZHRoLCBoZWlnaHQpOworCQlDUklURU5ECiAjZW5kaWYKLSAgIH0gZWxzZSB7CisJfSBlbHNlIHsKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotICAgICAgQ1JJVEJFR0lOCi0gICAgICBTaVMzMTBTZXR1cEZvclNvbGlkRmlsbChpdmlkZW8sIGNvbCwgbXlyb3BzW3JlY3QtPnJvcF0pOwotICAgICAgU2lTMzEwU3Vic2VxdWVudFNvbGlkRmlsbFJlY3QoaXZpZGVvLCByZWN0LT5keCwgcmVjdC0+ZHksIHdpZHRoLCBoZWlnaHQpOwotICAgICAgQ1JJVEVORAotICAgICAgU2lTMzEwU3luYyhpdmlkZW8pOworCQlDUklUQkVHSU4KKwkJU2lTMzEwU2V0dXBGb3JTb2xpZEZpbGwoaXZpZGVvLCBjb2wsIG15cm9wc1tyZWN0LT5yb3BdKTsKKwkJU2lTMzEwU3Vic2VxdWVudFNvbGlkRmlsbFJlY3QoaXZpZGVvLCByZWN0LT5keCwgcmVjdC0+ZHksIHdpZHRoLCBoZWlnaHQpOworCQlDUklURU5ECiAjZW5kaWYKLSAgIH0KKwl9CiAKKwlzaXNmYl9zeW5jYWNjZWwoaXZpZGVvKTsKIH0KIAogdm9pZCBmYmNvbl9zaXNfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqYXJlYSkKIHsKLSAgIHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLSAgIHUzMiB2eHJlcyA9IGluZm8tPnZhci54cmVzX3ZpcnR1YWw7Ci0gICB1MzIgdnlyZXMgPSBpbmZvLT52YXIueXJlc192aXJ0dWFsOwotICAgaW50IHdpZHRoID0gYXJlYS0+d2lkdGg7Ci0gICBpbnQgaGVpZ2h0ID0gYXJlYS0+aGVpZ2h0OwotICAgQ1JJVEZMQUdTCisJc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopaW5mby0+cGFyOworCXUzMiB2eHJlcyA9IGluZm8tPnZhci54cmVzX3ZpcnR1YWw7CisJdTMyIHZ5cmVzID0gaW5mby0+dmFyLnlyZXNfdmlydHVhbDsKKwlpbnQgd2lkdGggPSBhcmVhLT53aWR0aDsKKwlpbnQgaGVpZ2h0ID0gYXJlYS0+aGVpZ2h0OworCUNSSVRGTEFHUwogCi0gICBpZihpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykgewotCXJldHVybjsKLSAgIH0KKwlpZihpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKKwkJcmV0dXJuOwogCi0gICBpZighaXZpZGVvLT5hY2NlbCkgewotICAgCWNmYl9jb3B5YXJlYShpbmZvLCBhcmVhKTsKLQlyZXR1cm47Ci0gICB9CisJaWYoKCFpdmlkZW8tPmFjY2VsKSB8fCAoIWl2aWRlby0+ZW5naW5lb2spKSB7CisJCWNmYl9jb3B5YXJlYShpbmZvLCBhcmVhKTsKKwkJcmV0dXJuOworCX0KIAotICAgaWYoIXdpZHRoIHx8ICFoZWlnaHQgfHwKLSAgICAgIGFyZWEtPnN4ID49IHZ4cmVzIHx8IGFyZWEtPnN5ID49IHZ5cmVzIHx8Ci0gICAgICBhcmVhLT5keCA+PSB2eHJlcyB8fCBhcmVhLT5keSA+PSB2eXJlcykgewotICAgCXJldHVybjsKLSAgIH0KKwlpZighd2lkdGggfHwgIWhlaWdodCB8fAorCSAgIGFyZWEtPnN4ID49IHZ4cmVzIHx8IGFyZWEtPnN5ID49IHZ5cmVzIHx8CisJICAgYXJlYS0+ZHggPj0gdnhyZXMgfHwgYXJlYS0+ZHkgPj0gdnlyZXMpCisJCXJldHVybjsKIAotICAgLyogQ2xpcHBpbmcgKi8KLSAgIGlmKChhcmVhLT5zeCArIHdpZHRoKSA+IHZ4cmVzKSB3aWR0aCA9IHZ4cmVzIC0gYXJlYS0+c3g7Ci0gICBpZigoYXJlYS0+ZHggKyB3aWR0aCkgPiB2eHJlcykgd2lkdGggPSB2eHJlcyAtIGFyZWEtPmR4OwotICAgaWYoKGFyZWEtPnN5ICsgaGVpZ2h0KSA+IHZ5cmVzKSBoZWlnaHQgPSB2eXJlcyAtIGFyZWEtPnN5OwotICAgaWYoKGFyZWEtPmR5ICsgaGVpZ2h0KSA+IHZ5cmVzKSBoZWlnaHQgPSB2eXJlcyAtIGFyZWEtPmR5OworCS8qIENsaXBwaW5nICovCisJaWYoKGFyZWEtPnN4ICsgd2lkdGgpID4gdnhyZXMpIHdpZHRoID0gdnhyZXMgLSBhcmVhLT5zeDsKKwlpZigoYXJlYS0+ZHggKyB3aWR0aCkgPiB2eHJlcykgd2lkdGggPSB2eHJlcyAtIGFyZWEtPmR4OworCWlmKChhcmVhLT5zeSArIGhlaWdodCkgPiB2eXJlcykgaGVpZ2h0ID0gdnlyZXMgLSBhcmVhLT5zeTsKKwlpZigoYXJlYS0+ZHkgKyBoZWlnaHQpID4gdnlyZXMpIGhlaWdodCA9IHZ5cmVzIC0gYXJlYS0+ZHk7CiAKLSAgIGlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0gICAgICBpbnQgeGRpciwgeWRpcjsKKwkJaW50IHhkaXIsIHlkaXI7CiAKLSAgICAgIGlmKGFyZWEtPnN4IDwgYXJlYS0+ZHgpIHhkaXIgPSAwOwotICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgeGRpciA9IDE7Ci0gICAgICBpZihhcmVhLT5zeSA8IGFyZWEtPmR5KSB5ZGlyID0gMDsKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIHlkaXIgPSAxOworCQlpZihhcmVhLT5zeCA8IGFyZWEtPmR4KSB4ZGlyID0gMDsKKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgeGRpciA9IDE7CisJCWlmKGFyZWEtPnN5IDwgYXJlYS0+ZHkpIHlkaXIgPSAwOworCQllbHNlICAgICAgICAgICAgICAgICAgICB5ZGlyID0gMTsKIAotICAgICAgQ1JJVEJFR0lOCi0gICAgICBTaVMzMDBTZXR1cEZvclNjcmVlblRvU2NyZWVuQ29weShpdmlkZW8sIHhkaXIsIHlkaXIsIDMsIC0xKTsKLSAgICAgIFNpUzMwMFN1YnNlcXVlbnRTY3JlZW5Ub1NjcmVlbkNvcHkoaXZpZGVvLCBhcmVhLT5zeCwgYXJlYS0+c3ksIGFyZWEtPmR4LCBhcmVhLT5keSwKLSAgICAgIAkJCQkJIHdpZHRoLCBoZWlnaHQpOwotICAgICAgQ1JJVEVORAotICAgICAgU2lTMzAwU3luYyhpdmlkZW8pOworCQlDUklUQkVHSU4KKwkJU2lTMzAwU2V0dXBGb3JTY3JlZW5Ub1NjcmVlbkNvcHkoaXZpZGVvLCB4ZGlyLCB5ZGlyLCAzLCAtMSk7CisJCVNpUzMwMFN1YnNlcXVlbnRTY3JlZW5Ub1NjcmVlbkNvcHkoaXZpZGVvLCBhcmVhLT5zeCwgYXJlYS0+c3ksCisJCQkJCWFyZWEtPmR4LCBhcmVhLT5keSwgd2lkdGgsIGhlaWdodCk7CisJCUNSSVRFTkQKICNlbmRpZgotICAgfSBlbHNlIHsKKwl9IGVsc2UgewogI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Ci0gICAgICBDUklUQkVHSU4KLSAgICAgIFNpUzMxMFNldHVwRm9yU2NyZWVuVG9TY3JlZW5Db3B5KGl2aWRlbywgMywgLTEpOwotICAgICAgU2lTMzEwU3Vic2VxdWVudFNjcmVlblRvU2NyZWVuQ29weShpdmlkZW8sIGFyZWEtPnN4LCBhcmVhLT5zeSwgYXJlYS0+ZHgsIGFyZWEtPmR5LAotICAgICAgCQkJCQkgd2lkdGgsIGhlaWdodCk7Ci0gICAgICBDUklURU5ECi0gICAgICBTaVMzMTBTeW5jKGl2aWRlbyk7CisJCUNSSVRCRUdJTgorCQlTaVMzMTBTZXR1cEZvclNjcmVlblRvU2NyZWVuQ29weShpdmlkZW8sIDMsIC0xKTsKKwkJU2lTMzEwU3Vic2VxdWVudFNjcmVlblRvU2NyZWVuQ29weShpdmlkZW8sIGFyZWEtPnN4LCBhcmVhLT5zeSwKKwkJCQkJYXJlYS0+ZHgsIGFyZWEtPmR5LCB3aWR0aCwgaGVpZ2h0KTsKKwkJQ1JJVEVORAogI2VuZGlmCi0gICB9CisJfQorCisJc2lzZmJfc3luY2FjY2VsKGl2aWRlbyk7CiB9CiAKICNlbmRpZgogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApICAvKiAtLS0tLS0tLS0tLS0tLSAyLjQgLS0tLS0tLS0tLS0tLS0tICovCiAKLXZvaWQgZmJjb25fc2lzX2Jtb3ZlKHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgc3JjeSwgaW50IHNyY3gsCi0JCQkgICAgaW50IGRzdHksIGludCBkc3R4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCi17Ci0Jc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopcC0+ZmJfaW5mby0+cGFyOwotCi0JQ1JJVEZMQUdTCi0KLQlpZighaXZpZGVvLT5hY2NlbCkgewotCSAgICBzd2l0Y2goaXZpZGVvLT52aWRlb19icHApIHsKLQkgICAgY2FzZSA4OgotI2lmZGVmIEZCQ09OX0hBU19DRkI4Ci0JICAgICAgIGZiY29uX2NmYjhfYm1vdmUocCwgc3JjeSwgc3JjeCwgZHN0eSwgZHN0eCwgaGVpZ2h0LCB3aWR0aCk7Ci0jZW5kaWYKLQkgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTY6Ci0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci0JICAgICAgIGZiY29uX2NmYjE2X2Jtb3ZlKHAsIHNyY3ksIHNyY3gsIGRzdHksIGRzdHgsIGhlaWdodCwgd2lkdGgpOwotI2VuZGlmCi0JICAgICAgIGJyZWFrOwotCSAgICBjYXNlIDMyOgotI2lmZGVmIEZCQ09OX0hBU19DRkIzMgotCSAgICAgICBmYmNvbl9jZmIzMl9ibW92ZShwLCBzcmN5LCBzcmN4LCBkc3R5LCBkc3R4LCBoZWlnaHQsIHdpZHRoKTsKLSNlbmRpZgotCSAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQkgICAgcmV0dXJuOwotCX0KLQotCXNyY3ggKj0gZm9udHdpZHRoKHApOwotCXNyY3kgKj0gZm9udGhlaWdodChwKTsKLQlkc3R4ICo9IGZvbnR3aWR0aChwKTsKLQlkc3R5ICo9IGZvbnRoZWlnaHQocCk7Ci0Jd2lkdGggKj0gZm9udHdpZHRoKHApOwotCWhlaWdodCAqPSBmb250aGVpZ2h0KHApOwotCi0JaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0jaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKLQkgICBpbnQgeGRpciwgeWRpcjsKLQotCSAgIGlmKHNyY3ggPCBkc3R4KSB4ZGlyID0gMDsKLQkgICBlbHNlICAgICAgICAgICAgeGRpciA9IDE7Ci0JICAgaWYoc3JjeSA8IGRzdHkpIHlkaXIgPSAwOwotCSAgIGVsc2UgICAgICAgICAgICB5ZGlyID0gMTsKLQotCSAgIENSSVRCRUdJTgotCSAgIFNpUzMwMFNldHVwRm9yU2NyZWVuVG9TY3JlZW5Db3B5KGl2aWRlbywgeGRpciwgeWRpciwgMywgLTEpOwotCSAgIFNpUzMwMFN1YnNlcXVlbnRTY3JlZW5Ub1NjcmVlbkNvcHkoaXZpZGVvLCBzcmN4LCBzcmN5LCBkc3R4LCBkc3R5LCB3aWR0aCwgaGVpZ2h0KTsKLQkgICBDUklURU5ECi0JICAgU2lTMzAwU3luYyhpdmlkZW8pOwotI2VuZGlmCi0JfSBlbHNlIHsKLSNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotCSAgIENSSVRCRUdJTgotCSAgIFNpUzMxMFNldHVwRm9yU2NyZWVuVG9TY3JlZW5Db3B5KGl2aWRlbywgMywgLTEpOwotCSAgIFNpUzMxMFN1YnNlcXVlbnRTY3JlZW5Ub1NjcmVlbkNvcHkoaXZpZGVvLCBzcmN4LCBzcmN5LCBkc3R4LCBkc3R5LCB3aWR0aCwgaGVpZ2h0KTsKLQkgICBDUklURU5ECi0JICAgU2lTMzEwU3luYyhpdmlkZW8pOwotI2VuZGlmCi0JfQotfQotCi1zdGF0aWMgdm9pZCBmYmNvbl9zaXNfY2xlYXIoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLAotCQkJaW50IHNyY3ksIGludCBzcmN4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBjb2xvcikKLXsKLSAgICAgICAgc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopcC0+ZmJfaW5mby0+cGFyOwotCUNSSVRGTEFHUwotCi0Jc3JjeCAqPSBmb250d2lkdGgocCk7Ci0Jc3JjeSAqPSBmb250aGVpZ2h0KHApOwotCXdpZHRoICo9IGZvbnR3aWR0aChwKTsKLQloZWlnaHQgKj0gZm9udGhlaWdodChwKTsKLQotCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0JICAgQ1JJVEJFR0lOCi0JICAgU2lTMzAwU2V0dXBGb3JTb2xpZEZpbGwoaXZpZGVvLCBjb2xvciwgMyk7Ci0JICAgU2lTMzAwU3Vic2VxdWVudFNvbGlkRmlsbFJlY3QoaXZpZGVvLCBzcmN4LCBzcmN5LCB3aWR0aCwgaGVpZ2h0KTsKLQkgICBDUklURU5ECi0JICAgU2lTMzAwU3luYyhpdmlkZW8pOwotI2VuZGlmCi0JfSBlbHNlIHsKLSNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotCSAgIENSSVRCRUdJTgotCSAgIFNpUzMxMFNldHVwRm9yU29saWRGaWxsKGl2aWRlbywgY29sb3IsIDMpOwotCSAgIFNpUzMxMFN1YnNlcXVlbnRTb2xpZEZpbGxSZWN0KGl2aWRlbywgc3JjeCwgc3JjeSwgd2lkdGgsIGhlaWdodCk7Ci0JICAgQ1JJVEVORAotCSAgIFNpUzMxMFN5bmMoaXZpZGVvKTsKLSNlbmRpZgotCX0KLX0KLQotdm9pZCBmYmNvbl9zaXNfY2xlYXI4KHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKLQkJCWludCBzcmN5LCBpbnQgc3JjeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQotewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKXAtPmZiX2luZm8tPnBhcjsKLQl1MzIgYmd4OwotCi0JaWYoIWl2aWRlby0+YWNjZWwpIHsKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCOAotCSAgICBmYmNvbl9jZmI4X2NsZWFyKGNvbnAsIHAsIHNyY3ksIHNyY3gsIGhlaWdodCwgd2lkdGgpOwotI2VuZGlmCi0JICAgIHJldHVybjsKLQl9Ci0KLQliZ3ggPSBhdHRyX2JnY29sX2VjKHAsIGNvbnApOwotCWZiY29uX3Npc19jbGVhcihjb25wLCBwLCBzcmN5LCBzcmN4LCBoZWlnaHQsIHdpZHRoLCBiZ3gpOwotfQotCi12b2lkIGZiY29uX3Npc19jbGVhcjE2KHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKLQkJCWludCBzcmN5LCBpbnQgc3JjeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQotewotICAgICAgICBzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilwLT5mYl9pbmZvLT5wYXI7Ci0JdTMyIGJneDsKLQotCWlmKCFpdmlkZW8tPmFjY2VsKSB7Ci0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci0JICAgIGZiY29uX2NmYjE2X2NsZWFyKGNvbnAsIHAsIHNyY3ksIHNyY3gsIGhlaWdodCwgd2lkdGgpOwotI2VuZGlmCi0JICAgIHJldHVybjsKLQl9Ci0KLQliZ3ggPSAoKHVfaW50MTZfdCopcC0+ZGlzcHN3X2RhdGEpW2F0dHJfYmdjb2xfZWMocCwgY29ucCldOwotCWZiY29uX3Npc19jbGVhcihjb25wLCBwLCBzcmN5LCBzcmN4LCBoZWlnaHQsIHdpZHRoLCBiZ3gpOwotfQotCi12b2lkIGZiY29uX3Npc19jbGVhcjMyKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKLQkJCWludCBzcmN5LCBpbnQgc3JjeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQotewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKXAtPmZiX2luZm8tPnBhcjsKLQl1MzIgYmd4OwotCi0JaWYoIWl2aWRlby0+YWNjZWwpIHsKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKLQkgICAgZmJjb25fY2ZiMzJfY2xlYXIoY29ucCwgcCwgc3JjeSwgc3JjeCwgaGVpZ2h0LCB3aWR0aCk7Ci0jZW5kaWYKLQkgICAgcmV0dXJuOwotCX0KLQotCWJneCA9ICgodV9pbnQzMl90KilwLT5kaXNwc3dfZGF0YSlbYXR0cl9iZ2NvbF9lYyhwLCBjb25wKV07Ci0JZmJjb25fc2lzX2NsZWFyKGNvbnAsIHAsIHNyY3ksIHNyY3gsIGhlaWdodCwgd2lkdGgsIGJneCk7Ci19Ci0KLXZvaWQgZmJjb25fc2lzX3JldmMoc3RydWN0IGRpc3BsYXkgKnAsIGludCBzcmN4LCBpbnQgc3JjeSkKLXsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilwLT5mYl9pbmZvLT5wYXI7Ci0JQ1JJVEZMQUdTCi0KLQlpZighaXZpZGVvLT5hY2NlbCkgewotCSAgICBzd2l0Y2goaXZpZGVvLT52aWRlb19icHApIHsKLQkgICAgY2FzZSAxNjoKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKLQkgICAgICAgZmJjb25fY2ZiMTZfcmV2YyhwLCBzcmN4LCBzcmN5KTsKLSNlbmRpZgotCSAgICAgICBicmVhazsKLQkgICAgY2FzZSAzMjoKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKLQkgICAgICAgZmJjb25fY2ZiMzJfcmV2YyhwLCBzcmN4LCBzcmN5KTsKLSNlbmRpZgotCSAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQkgICAgcmV0dXJuOwotCX0KLQotCXNyY3ggKj0gZm9udHdpZHRoKHApOwotCXNyY3kgKj0gZm9udGhlaWdodChwKTsKLQotCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0JICAgQ1JJVEJFR0lOCi0JICAgU2lTMzAwU2V0dXBGb3JTb2xpZEZpbGwoaXZpZGVvLCAwLCAweDBhKTsKLQkgICBTaVMzMDBTdWJzZXF1ZW50U29saWRGaWxsUmVjdChpdmlkZW8sIHNyY3gsIHNyY3ksIGZvbnR3aWR0aChwKSwgZm9udGhlaWdodChwKSk7Ci0JICAgQ1JJVEVORAotCSAgIFNpUzMwMFN5bmMoaXZpZGVvKTsKLSNlbmRpZgotCX0gZWxzZSB7Ci0jaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKLQkgICBDUklUQkVHSU4KLQkgICBTaVMzMTBTZXR1cEZvclNvbGlkRmlsbChpdmlkZW8sIDAsIDB4MGEpOwotCSAgIFNpUzMxMFN1YnNlcXVlbnRTb2xpZEZpbGxSZWN0KGl2aWRlbywgc3JjeCwgc3JjeSwgZm9udHdpZHRoKHApLCBmb250aGVpZ2h0KHApKTsKLQkgICBDUklURU5ECi0JICAgU2lTMzEwU3luYyhpdmlkZW8pOwotI2VuZGlmCi0JfQotfQotCi0jaWZkZWYgRkJDT05fSEFTX0NGQjgKLXN0cnVjdCBkaXNwbGF5X3N3aXRjaCBmYmNvbl9zaXM4ID0gewotCS5zZXR1cAkJPSBmYmNvbl9jZmI4X3NldHVwLAotCS5ibW92ZQkJPSBmYmNvbl9zaXNfYm1vdmUsCi0JLmNsZWFyCQk9IGZiY29uX3Npc19jbGVhcjgsCi0JLnB1dGMJCT0gZmJjb25fY2ZiOF9wdXRjLAotCS5wdXRjcwkJPSBmYmNvbl9jZmI4X3B1dGNzLAotCS5yZXZjCQk9IGZiY29uX2NmYjhfcmV2YywKLQkuY2xlYXJfbWFyZ2lucwk9IGZiY29uX2NmYjhfY2xlYXJfbWFyZ2lucywKLQkuZm9udHdpZHRobWFzawk9IEZPTlRXSURUSCg0KXxGT05UV0lEVEgoOCl8Rk9OVFdJRFRIKDEyKXxGT05UV0lEVEgoMTYpCi19OwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci1zdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggZmJjb25fc2lzMTYgPSB7Ci0JLnNldHVwCQk9IGZiY29uX2NmYjE2X3NldHVwLAotCS5ibW92ZQkJPSBmYmNvbl9zaXNfYm1vdmUsCi0JLmNsZWFyCQk9IGZiY29uX3Npc19jbGVhcjE2LAotCS5wdXRjCQk9IGZiY29uX2NmYjE2X3B1dGMsCi0JLnB1dGNzCQk9IGZiY29uX2NmYjE2X3B1dGNzLAotCS5yZXZjCQk9IGZiY29uX3Npc19yZXZjLAotCS5jbGVhcl9tYXJnaW5zCT0gZmJjb25fY2ZiMTZfY2xlYXJfbWFyZ2lucywKLQkuZm9udHdpZHRobWFzawk9IEZPTlRXSURUSCg0KXxGT05UV0lEVEgoOCl8Rk9OVFdJRFRIKDEyKXxGT05UV0lEVEgoMTYpCi19OwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjMyCi1zdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggZmJjb25fc2lzMzIgPSB7Ci0JLnNldHVwCQk9IGZiY29uX2NmYjMyX3NldHVwLAotCS5ibW92ZQkJPSBmYmNvbl9zaXNfYm1vdmUsCi0JLmNsZWFyCQk9IGZiY29uX3Npc19jbGVhcjMyLAotCS5wdXRjCQk9IGZiY29uX2NmYjMyX3B1dGMsCi0JLnB1dGNzCQk9IGZiY29uX2NmYjMyX3B1dGNzLAotCS5yZXZjCQk9IGZiY29uX3Npc19yZXZjLAotCS5jbGVhcl9tYXJnaW5zCT0gZmJjb25fY2ZiMzJfY2xlYXJfbWFyZ2lucywKLQkuZm9udHdpZHRobWFzawk9IEZPTlRXSURUSCg0KXxGT05UV0lEVEgoOCl8Rk9OVFdJRFRIKDEyKXxGT05UV0lEVEgoMTYpCi19OwotI2VuZGlmCisjaW5jbHVkZSAic2lzZmJfYWNjZWxfMl80LmgiCiAKICNlbmRpZiAvKiBLRVJORUwgVkVSU0lPTiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfYWNjZWwuaCBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19hY2NlbC5oCmluZGV4IGJiMjhmMzMuLjA0NmUyYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19hY2NlbC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19hY2NlbC5oCkBAIC0xLDYgKzEsOCBAQAogLyoKLSAqIFNpUyAzMDAvNjMwLzczMC81NDAvMzE1LzU1MC82NTAvNzQwIGZyYW1lIGJ1ZmZlciBkcml2ZXIKLSAqIGZvciBMaW51eCBrZXJuZWxzIDIuNC54IGFuZCAyLjUueAorICogU2lTIDMwMC81NDAvNjMwW1NdLzczMFtTXSwKKyAqIFNpUyAzMTVbRXxQUk9dLzU1MC9bTV02NTAvNjUxL1tNXTY2MVtGfE1dWC83NDAvW01dNzQxW0dYXS8zMzAvW01dNzYwW0dYXSwKKyAqIFhHSSBWM1hUL1Y1L1Y4LCBaNworICogZnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgTGludXgga2VybmVscyA+PSAyLjQuMTQgYW5kID49Mi42LjMKICAqCiAgKiAyRCBhY2NlbGVyYXRpb24gcGFydAogICoKQEAgLTI4Myw2ICsyODUsOCBAQAogICB7IFwKICAgCXdoaWxlKCAoTU1JT19JTjE2KGl2aWRlby0+bW1pb192YmFzZSwgUV9TVEFUVVMrMikgJiAweDgwMDApICE9IDB4ODAwMCl7fTsgXAogICAJd2hpbGUoIChNTUlPX0lOMTYoaXZpZGVvLT5tbWlvX3ZiYXNlLCBRX1NUQVRVUysyKSAmIDB4ODAwMCkgIT0gMHg4MDAwKXt9OyBcCisJd2hpbGUoIChNTUlPX0lOMTYoaXZpZGVvLT5tbWlvX3ZiYXNlLCBRX1NUQVRVUysyKSAmIDB4ODAwMCkgIT0gMHg4MDAwKXt9OyBcCisgIAl3aGlsZSggKE1NSU9fSU4xNihpdmlkZW8tPm1taW9fdmJhc2UsIFFfU1RBVFVTKzIpICYgMHg4MDAwKSAhPSAweDgwMDApe307IFwKICAgCUNtZFF1ZUxlbiA9IDA7IFwKICAgfQogCkBAIC00MDIsNiArNDA2LDcgQEAKIAkJCWludCBzcmN4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOwogI2VuZGlmCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwzNCkKK2ludCAgZmJjb25fc2lzX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pOwogdm9pZCBmYmNvbl9zaXNfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCk7CiB2b2lkIGZiY29uX3Npc19jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICphcmVhKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMKaW5kZXggNjk4MjY2MC4uNDJjNTRiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYworKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jCkBAIC0xLDkgKzEsMTAgQEAKIC8qCi0gKiBTaVMgMzAwLzMwNS81NDAvNjMwKFMpLzczMChTKQotICogU2lTIDMxNShIL1BSTykvNTV4LyhNKTY1eC8oTSk2NjEoRi9NKVgvNzQwLzc0MShHWCkvMzMwLyhNKTc2MAorICogU2lTIDMwMC81NDAvNjMwW1NdLzczMFtTXSwKKyAqIFNpUyAzMTVbRXxQUk9dLzU1MC9bTV02NXgvW01dNjZ4W0Z8TXxHXVgvW01dNzR4W0dYXS8zMzAvW01dNzZ4W0dYXSwKKyAqIFhHSSBWM1hUL1Y1L1Y4LCBaNwogICogZnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgTGludXgga2VybmVscyA+PSAyLjQuMTQgYW5kID49Mi42LjMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xOSwxMSArMjAsMTEgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKICAqCi0gKiBBdXRob3I6ICAgCVRob21hcyBXaW5pc2NoaG9mZXIgPHRob21hc0B3aW5pc2NoaG9mZXIubmV0PgorICogQXV0aG9yOglUaG9tYXMgV2luaXNjaGhvZmVyIDx0aG9tYXNAd2luaXNjaGhvZmVyLm5ldD4KICAqCiAgKiBBdXRob3Igb2YgKHByYWN0aWNhbGx5IHdpcGVkKSBjb2RlIGJhc2U6CiAgKgkJU2lTICh3d3cuc2lzLmNvbSkKLSAqCSAJQ29weXJpZ2h0IChDKSAxOTk5IFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zLCBJbmMuCisgKgkJQ29weXJpZ2h0IChDKSAxOTk5IFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zLCBJbmMuCiAgKgogICogU2VlIGh0dHA6Ly93d3cud2luaXNjaGhvZmVyLm5ldC8gZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIHVwZGF0ZXMKICAqCkBAIC00NiwxNiArNDcsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbGVjdGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CisjZW5kaWYKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtOTQsNzEgKzk0LDc1IEBACiAjZW5kaWYKICNlbmRpZgogCitzdGF0aWMgdm9pZCBzaXNmYl9oYW5kbGVfY29tbWFuZChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywKKwkJCQkgc3RydWN0IHNpc2ZiX2NtZCAqc2lzZmJfY29tbWFuZCk7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcm5hbCBoZWxwZXIgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIHZvaWQgX19pbml0CiBzaXNmYl9zZXRkZWZhdWx0cGFybXModm9pZCkKIHsKLQlzaXNmYl9vZmYgCQk9IDA7Ci0Jc2lzZmJfcGFybV9tZW0gCQk9IDA7Ci0Jc2lzZmJfYWNjZWwgCQk9IC0xOwotCXNpc2ZiX3lwYW4gICAgICAJPSAtMTsKLQlzaXNmYl9tYXggCQk9IC0xOwotCXNpc2ZiX3VzZXJvbSAgICAJPSAtMTsKLSAgICAgICAgc2lzZmJfdXNlb2VtICAgIAk9IC0xOworCXNpc2ZiX29mZgkJPSAwOworCXNpc2ZiX3Bhcm1fbWVtCQk9IDA7CisJc2lzZmJfYWNjZWwJCT0gLTE7CisJc2lzZmJfeXBhbgkJPSAtMTsKKwlzaXNmYl9tYXgJCT0gLTE7CisJc2lzZmJfdXNlcm9tCQk9IC0xOworCXNpc2ZiX3VzZW9lbQkJPSAtMTsKICNpZmRlZiBNT0RVTEUKIAkvKiBNb2R1bGU6ICJOb25lIiBmb3IgMi40LCBkZWZhdWx0IG1vZGUgZm9yIDIuNSsgKi8KICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0Jc2lzZmJfbW9kZV9pZHggCQk9IC0xOworCXNpc2ZiX21vZGVfaWR4CQk9IC0xOwogI2Vsc2UKLQlzaXNmYl9tb2RlX2lkeCAgCT0gTU9ERV9JTkRFWF9OT05FOworCXNpc2ZiX21vZGVfaWR4CQk9IE1PREVfSU5ERVhfTk9ORTsKICNlbmRpZgogI2Vsc2UKIAkvKiBTdGF0aWM6IERlZmF1bHQgbW9kZSAqLwotCXNpc2ZiX21vZGVfaWR4ICAJPSAtMTsKKwlzaXNmYl9tb2RlX2lkeAkJPSAtMTsKICNlbmRpZgotCXNpc2ZiX3Bhcm1fcmF0ZSAJPSAtMTsKLQlzaXNmYl9jcnQxb2ZmIAkJPSAwOwotCXNpc2ZiX2ZvcmNlY3J0MSAJPSAtMTsKLQlzaXNmYl9jcnQydHlwZSAgCT0gLTE7Ci0Jc2lzZmJfY3J0MmZsYWdzIAk9IDA7Ci0Jc2lzZmJfcGRjIAkJPSAweGZmOwotCXNpc2ZiX3BkY2EgCQk9IDB4ZmY7Ci0Jc2lzZmJfc2NhbGVsY2QgIAk9IC0xOworCXNpc2ZiX3Bhcm1fcmF0ZQkJPSAtMTsKKwlzaXNmYl9jcnQxb2ZmCQk9IDA7CisJc2lzZmJfZm9yY2VjcnQxCQk9IC0xOworCXNpc2ZiX2NydDJ0eXBlCQk9IC0xOworCXNpc2ZiX2NydDJmbGFncwkJPSAwOworCXNpc2ZiX3BkYwkJPSAweGZmOworCXNpc2ZiX3BkY2EJCT0gMHhmZjsKKwlzaXNmYl9zY2FsZWxjZAkJPSAtMTsKIAlzaXNmYl9zcGVjaWFsdGltaW5nIAk9IENVVF9OT05FOwotCXNpc2ZiX2x2ZHNobCAJCT0gLTE7Ci0Jc2lzZmJfZHN0biAgICAgCQk9IDA7Ci0Jc2lzZmJfZnN0biAJCT0gMDsKLQlzaXNmYl90dnBsdWcgICAgCT0gLTE7Ci0Jc2lzZmJfdHZzdGQgICAgIAk9IC0xOwotCXNpc2ZiX3R2eHBvc29mZnNldCAJPSAwOwotCXNpc2ZiX3R2eXBvc29mZnNldCAJPSAwOwotCXNpc2ZiX2ZpbHRlciAJCT0gLTE7Ci0Jc2lzZmJfbm9jcnQycmF0ZSAJPSAwOworCXNpc2ZiX2x2ZHNobAkJPSAtMTsKKwlzaXNmYl9kc3RuCQk9IDA7CisJc2lzZmJfZnN0bgkJPSAwOworCXNpc2ZiX3R2cGx1ZwkJPSAtMTsKKwlzaXNmYl90dnN0ZAkJPSAtMTsKKwlzaXNmYl90dnhwb3NvZmZzZXQJPSAwOworCXNpc2ZiX3R2eXBvc29mZnNldAk9IDA7CisJc2lzZmJfbm9jcnQycmF0ZQk9IDA7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0Jc2lzZmJfaW52ZXJzZSAgIAk9IDA7Ci0Jc2lzZmJfZm9udG5hbWVbMF0gCT0gMDsKKwlzaXNmYl9pbnZlcnNlCQk9IDA7CisJc2lzZmJfZm9udG5hbWVbMF0JPSAwOwogI2VuZGlmCiAjaWYgIWRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCi0Jc2lzZmJfcmVzZXRjYXJkIAk9IDA7Ci0Jc2lzZmJfdmlkZW9yYW0gIAk9IDA7CisJc2lzZmJfcmVzZXRjYXJkCQk9IDA7CisJc2lzZmJfdmlkZW9yYW0JCT0gMDsKICNlbmRpZgogfQogCisvKiAtLS0tLS0tLS0tLS0tIFBhcmFtZXRlciBwYXJzaW5nIC0tLS0tLS0tLS0tLS0tICovCisKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdAogc2lzZmJfc2VhcmNoX3Zlc2Ftb2RlKHVuc2lnbmVkIGludCB2ZXNhbW9kZSwgQk9PTEVBTiBxdWlldCkKIHsKIAlpbnQgaSA9IDAsIGogPSAwOwogCi0JLyogQkVXQVJFOiBXZSBkb24ndCBrbm93IHRoZSBoYXJkd2FyZSBzcGVjcyB5ZXQgYW5kIHRoZXJlIGlzIG5vIGl2aWRlbyAqLworCS8qIFdlIGRvbid0IGtub3cgdGhlIGhhcmR3YXJlIHNwZWNzIHlldCBhbmQgdGhlcmUgaXMgbm8gaXZpZGVvICovCiAKIAlpZih2ZXNhbW9kZSA9PSAwKSB7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJCXNpc2ZiX21vZGVfaWR4ID0gTU9ERV9JTkRFWF9OT05FOwogI2Vsc2UKLQkJaWYoIXF1aWV0KSB7Ci0JCSAgIHByaW50ayhLRVJOX0VSUiAic2lzZmI6IEludmFsaWQgbW9kZS4gVXNpbmcgZGVmYXVsdC5cbiIpOwotCQl9CisJCWlmKCFxdWlldCkKKwkJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEludmFsaWQgbW9kZS4gVXNpbmcgZGVmYXVsdC5cbiIpOworCiAJCXNpc2ZiX21vZGVfaWR4ID0gREVGQVVMVF9NT0RFOwogI2VuZGlmCiAJCXJldHVybjsKQEAgLTE2OSw5NSArMTczLDEwMiBAQAogCXdoaWxlKHNpc2Jpb3NfbW9kZVtpKytdLm1vZGVfbm9bMF0gIT0gMCkgewogCQlpZiggKHNpc2Jpb3NfbW9kZVtpLTFdLnZlc2FfbW9kZV9ub18xID09IHZlc2Ftb2RlKSB8fAogCQkgICAgKHNpc2Jpb3NfbW9kZVtpLTFdLnZlc2FfbW9kZV9ub18yID09IHZlc2Ftb2RlKSApIHsKLQkJICAgIGlmKHNpc2ZiX2ZzdG4pIHsKLQkJICAgICAgIGlmKHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1MCB8fAotCQkgICAgICAgICAgc2lzYmlvc19tb2RlW2ktMV0ubW9kZV9ub1sxXSA9PSAweDU2IHx8Ci0JCSAgICAgICAgICBzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NTMpIGNvbnRpbnVlOwotCSAgICAgICAgICAgIH0gZWxzZSB7Ci0JCSAgICAgICBpZihzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NWEgfHwKLQkJICAgICAgICAgIHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1YikgY29udGludWU7Ci0JCSAgICB9Ci0JCSAgICBzaXNmYl9tb2RlX2lkeCA9IGkgLSAxOwotCQkgICAgaiA9IDE7Ci0JCSAgICBicmVhazsKKwkJCWlmKHNpc2ZiX2ZzdG4pIHsKKwkJCQlpZihzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NTAgfHwKKwkJCQkgICBzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NTYgfHwKKwkJCQkgICBzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NTMpCisJCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlpZihzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NWEgfHwKKwkJCQkgICBzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NWIpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc2lzZmJfbW9kZV9pZHggPSBpIC0gMTsKKwkJCWogPSAxOworCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYoKCFqKSAmJiAhcXVpZXQpIHByaW50ayhLRVJOX0VSUiAic2lzZmI6IEludmFsaWQgVkVTQSBtb2RlIDB4JXgnXG4iLCB2ZXNhbW9kZSk7CisJaWYoKCFqKSAmJiAhcXVpZXQpCisJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEludmFsaWQgVkVTQSBtb2RlIDB4JXgnXG4iLCB2ZXNhbW9kZSk7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgdm9pZCBfX2RldmluaXQKIHNpc2ZiX3NlYXJjaF9tb2RlKGNoYXIgKm5hbWUsIEJPT0xFQU4gcXVpZXQpCiB7Ci0JaW50IGkgPSAwOwogCXVuc2lnbmVkIGludCBqID0gMCwgeHJlcyA9IDAsIHlyZXMgPSAwLCBkZXB0aCA9IDAsIHJhdGUgPSAwOworCWludCBpID0gMDsKIAljaGFyIHN0cmJ1ZlsxNl0sIHN0cmJ1ZjFbMjBdOwogCWNoYXIgKm5hbWVwdHIgPSBuYW1lOwogCi0JLyogQkVXQVJFOiBXZSBkb24ndCBrbm93IHRoZSBoYXJkd2FyZSBzcGVjcyB5ZXQgYW5kIHRoZXJlIGlzIG5vIGl2aWRlbyAqLworCS8qIFdlIGRvbid0IGtub3cgdGhlIGhhcmR3YXJlIHNwZWNzIHlldCBhbmQgdGhlcmUgaXMgbm8gaXZpZGVvICovCiAKIAlpZihuYW1lID09IE5VTEwpIHsKLQkgICBpZighcXVpZXQpIHsKLQkgICAgICBwcmludGsoS0VSTl9FUlIgInNpc2ZiOiBJbnRlcm5hbCBlcnJvciwgdXNpbmcgZGVmYXVsdCBtb2RlLlxuIik7Ci0JICAgfQotCSAgIHNpc2ZiX21vZGVfaWR4ID0gREVGQVVMVF9NT0RFOwotCSAgIHJldHVybjsKKwkJaWYoIXF1aWV0KQorCQkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogSW50ZXJuYWwgZXJyb3IsIHVzaW5nIGRlZmF1bHQgbW9kZS5cbiIpOworCisJCXNpc2ZiX21vZGVfaWR4ID0gREVGQVVMVF9NT0RFOworCQlyZXR1cm47CiAJfQogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotICAgICAgICBpZighc3RybmljbXAobmFtZSwgc2lzYmlvc19tb2RlW01PREVfSU5ERVhfTk9ORV0ubmFtZSwgc3RybGVuKG5hbWUpKSkgewotCSAgIGlmKCFxdWlldCkgewotCSAgICAgIHByaW50ayhLRVJOX0VSUiAic2lzZmI6IE1vZGUgJ25vbmUnIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gVXNpbmcgZGVmYXVsdC5cbiIpOwotCSAgIH0KLQkgICBzaXNmYl9tb2RlX2lkeCA9IERFRkFVTFRfTU9ERTsKLQkgICByZXR1cm47CisJaWYoIXN0cm5pY21wKG5hbWUsIHNpc2Jpb3NfbW9kZVtNT0RFX0lOREVYX05PTkVdLm5hbWUsIHN0cmxlbihuYW1lKSkpIHsKKwkJaWYoIXF1aWV0KQorCQkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogTW9kZSAnbm9uZScgbm90IHN1cHBvcnRlZCBhbnltb3JlLiBVc2luZyBkZWZhdWx0LlxuIik7CisKKwkJc2lzZmJfbW9kZV9pZHggPSBERUZBVUxUX01PREU7CisJCXJldHVybjsKIAl9CiAjZW5kaWYKIAlpZihzdHJsZW4obmFtZSkgPD0gMTkpIHsKLQkgICBzdHJjcHkoc3RyYnVmMSwgbmFtZSk7Ci0JICAgZm9yKGk9MDsgaTxzdHJsZW4oc3RyYnVmMSk7IGkrKykgewotCSAgICAgIGlmKHN0cmJ1ZjFbaV0gPCAnMCcgfHwgc3RyYnVmMVtpXSA+ICc5Jykgc3RyYnVmMVtpXSA9ICcgJzsKLQkgICB9CisJCXN0cmNweShzdHJidWYxLCBuYW1lKTsKKwkJZm9yKGkgPSAwOyBpIDwgc3RybGVuKHN0cmJ1ZjEpOyBpKyspIHsKKwkJCWlmKHN0cmJ1ZjFbaV0gPCAnMCcgfHwgc3RyYnVmMVtpXSA+ICc5Jykgc3RyYnVmMVtpXSA9ICcgJzsKKwkJfQogCi0JICAgLyogVGhpcyBkb2VzIHNvbWUgZnV6enkgbW9kZSBuYW1pbmcgZGV0ZWN0aW9uICovCi0JICAgaWYoc3NjYW5mKHN0cmJ1ZjEsICIldSAldSAldSAldSIsICZ4cmVzLCAmeXJlcywgJmRlcHRoLCAmcmF0ZSkgPT0gNCkgewotCSAgICAgIGlmKChyYXRlIDw9IDMyKSB8fCAoZGVwdGggPiAzMikpIHsKLQkgICAgICAgICBqID0gcmF0ZTsgcmF0ZSA9IGRlcHRoOyBkZXB0aCA9IGo7Ci0JICAgICAgfQotCSAgICAgIHNwcmludGYoc3RyYnVmLCAiJXV4JXV4JXUiLCB4cmVzLCB5cmVzLCBkZXB0aCk7Ci0JICAgICAgbmFtZXB0ciA9IHN0cmJ1ZjsKLQkgICAgICBzaXNmYl9wYXJtX3JhdGUgPSByYXRlOwotCSAgIH0gZWxzZSBpZihzc2NhbmYoc3RyYnVmMSwgIiV1ICV1ICV1IiwgJnhyZXMsICZ5cmVzLCAmZGVwdGgpID09IDMpIHsKLQkgICAgICBzcHJpbnRmKHN0cmJ1ZiwgIiV1eCV1eCV1IiwgeHJlcywgeXJlcywgZGVwdGgpOwotCSAgICAgIG5hbWVwdHIgPSBzdHJidWY7Ci0JICAgfSBlbHNlIHsKLQkgICAgICB4cmVzID0gMDsKLQkgICAgICBpZigoc3NjYW5mKHN0cmJ1ZjEsICIldSAldSIsICZ4cmVzLCAmeXJlcykgPT0gMikgJiYgKHhyZXMgIT0gMCkpIHsKLQkgICAgICAgICBzcHJpbnRmKHN0cmJ1ZiwgIiV1eCV1eDgiLCB4cmVzLCB5cmVzKTsKLQkgICAgICAgICBuYW1lcHRyID0gc3RyYnVmOwotCSAgICAgIH0gZWxzZSB7Ci0JICAgICAgICAgc2lzZmJfc2VhcmNoX3Zlc2Ftb2RlKHNpbXBsZV9zdHJ0b3VsKG5hbWUsIE5VTEwsIDApLCBxdWlldCk7Ci0JICAgICAgICAgcmV0dXJuOwotCSAgICAgIH0KLQkgICB9CisJCS8qIFRoaXMgZG9lcyBzb21lIGZ1enp5IG1vZGUgbmFtaW5nIGRldGVjdGlvbiAqLworCQlpZihzc2NhbmYoc3RyYnVmMSwgIiV1ICV1ICV1ICV1IiwgJnhyZXMsICZ5cmVzLCAmZGVwdGgsICZyYXRlKSA9PSA0KSB7CisJCQlpZigocmF0ZSA8PSAzMikgfHwgKGRlcHRoID4gMzIpKSB7CisJCQkJaiA9IHJhdGU7IHJhdGUgPSBkZXB0aDsgZGVwdGggPSBqOworCQkJfQorCQkJc3ByaW50ZihzdHJidWYsICIldXgldXgldSIsIHhyZXMsIHlyZXMsIGRlcHRoKTsKKwkJCW5hbWVwdHIgPSBzdHJidWY7CisJCQlzaXNmYl9wYXJtX3JhdGUgPSByYXRlOworCQl9IGVsc2UgaWYoc3NjYW5mKHN0cmJ1ZjEsICIldSAldSAldSIsICZ4cmVzLCAmeXJlcywgJmRlcHRoKSA9PSAzKSB7CisJCQlzcHJpbnRmKHN0cmJ1ZiwgIiV1eCV1eCV1IiwgeHJlcywgeXJlcywgZGVwdGgpOworCQkJbmFtZXB0ciA9IHN0cmJ1ZjsKKwkJfSBlbHNlIHsKKwkJCXhyZXMgPSAwOworCQkJaWYoKHNzY2FuZihzdHJidWYxLCAiJXUgJXUiLCAmeHJlcywgJnlyZXMpID09IDIpICYmICh4cmVzICE9IDApKSB7CisJCQkJc3ByaW50ZihzdHJidWYsICIldXgldXg4IiwgeHJlcywgeXJlcyk7CisJCQkJbmFtZXB0ciA9IHN0cmJ1ZjsKKwkJCX0gZWxzZSB7CisJCQkJc2lzZmJfc2VhcmNoX3Zlc2Ftb2RlKHNpbXBsZV9zdHJ0b3VsKG5hbWUsIE5VTEwsIDApLCBxdWlldCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CiAJfQogCiAJaSA9IDA7IGogPSAwOwogCXdoaWxlKHNpc2Jpb3NfbW9kZVtpXS5tb2RlX25vWzBdICE9IDApIHsKIAkJaWYoIXN0cm5pY21wKG5hbWVwdHIsIHNpc2Jpb3NfbW9kZVtpKytdLm5hbWUsIHN0cmxlbihuYW1lcHRyKSkpIHsKLQkJICAgCWlmKHNpc2ZiX2ZzdG4pIHsKLQkJICAgICAgCQlpZihzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NTAgfHwKLQkJICAgICAgICAgCSAgIHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1NiB8fAotCQkgICAgICAgICAJICAgc2lzYmlvc19tb2RlW2ktMV0ubW9kZV9ub1sxXSA9PSAweDUzKSBjb250aW51ZTsKLQkgICAgICAgICAgIAl9IGVsc2UgewotCQkgICAgICAJCWlmKHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1YSB8fAotCQkgICAgICAgICAJICAgc2lzYmlvc19tb2RlW2ktMV0ubW9kZV9ub1sxXSA9PSAweDViKSBjb250aW51ZTsKLQkJICAgCX0KLQkJICAgCXNpc2ZiX21vZGVfaWR4ID0gaSAtIDE7Ci0JCSAgIAlqID0gMTsKLQkJICAgCWJyZWFrOworCQkJaWYoc2lzZmJfZnN0bikgeworCQkJCWlmKHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1MCB8fAorCQkJCSAgIHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1NiB8fAorCQkJCSAgIHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1MykKKwkJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCWlmKHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1YSB8fAorCQkJCSAgIHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1YikKKwkJCQkJY29udGludWU7CisJCQl9CisJCQlzaXNmYl9tb2RlX2lkeCA9IGkgLSAxOworCQkJaiA9IDE7CisJCQlicmVhazsKIAkJfQogCX0KLQlpZigoIWopICYmICFxdWlldCkgcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogSW52YWxpZCBtb2RlICclcydcbiIsIG5hbWVwdHIpOworCisJaWYoKCFqKSAmJiAhcXVpZXQpCisJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEludmFsaWQgbW9kZSAnJXMnXG4iLCBuYW1lcHRyKTsKIH0KIAogI2lmbmRlZiBNT0RVTEUKQEAgLTI2NSw3ICsyNzYsNyBAQAogc2lzZmJfZ2V0X3ZnYV9tb2RlX2Zyb21fa2VybmVsKHZvaWQpCiB7CiAjaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpICYmIGRlZmluZWQoQ09ORklHX1ZJREVPX1NFTEVDVCkKLSAgIAljaGFyIG15bW9kZVszMl07CisJY2hhciBteW1vZGVbMzJdOwogCWludCAgbXlkZXB0aCA9IHNjcmVlbl9pbmZvLmxmYl9kZXB0aDsKIAogCWlmKHNjcmVlbl9pbmZvLm9yaWdfdmlkZW9faXNWR0EgIT0gVklERU9fVFlQRV9WTEZCKSByZXR1cm47CkBAIC0yNzQsMTUgKzI4NSwxNyBAQAogCSAgICAoc2NyZWVuX2luZm8ubGZiX2hlaWdodCA+PSAyMDApICYmIChzY3JlZW5faW5mby5sZmJfaGVpZ2h0IDw9IDE1MzYpICYmCiAJICAgIChteWRlcHRoID49IDgpICYmIChteWRlcHRoIDw9IDMyKSApIHsKIAotCSAgICBpZihteWRlcHRoID09IDI0KSBteWRlcHRoID0gMzI7CisJCWlmKG15ZGVwdGggPT0gMjQpIG15ZGVwdGggPSAzMjsKIAotCSAgICBzcHJpbnRmKG15bW9kZSwgIiV1eCV1eCV1Iiwgc2NyZWVuX2luZm8ubGZiX3dpZHRoLAotCSAgICAJCQkJc2NyZWVuX2luZm8ubGZiX2hlaWdodCwKKwkJc3ByaW50ZihteW1vZGUsICIldXgldXgldSIsIHNjcmVlbl9pbmZvLmxmYl93aWR0aCwKKwkJCQkJc2NyZWVuX2luZm8ubGZiX2hlaWdodCwKIAkJCQkJbXlkZXB0aCk7CiAKLQkgICAgcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiBVc2luZyB2Z2EgbW9kZSAlcyBwcmUtc2V0IGJ5IGtlcm5lbCBhcyBkZWZhdWx0XG4iLCBteW1vZGUpOworCQlwcmludGsoS0VSTl9ERUJVRworCQkJInNpc2ZiOiBVc2luZyB2Z2EgbW9kZSAlcyBwcmUtc2V0IGJ5IGtlcm5lbCBhcyBkZWZhdWx0XG4iLAorCQkJbXltb2RlKTsKIAotCSAgICBzaXNmYl9zZWFyY2hfbW9kZShteW1vZGUsIFRSVUUpOworCQlzaXNmYl9zZWFyY2hfbW9kZShteW1vZGUsIFRSVUUpOwogCX0KICNlbmRpZgogCXJldHVybjsKQEAgLTI5NCwyNiArMzA3LDI1IEBACiB7CiAJaW50IGkgPSAwOwogCi0JLyogQkVXQVJFOiBXZSBkb24ndCBrbm93IHRoZSBoYXJkd2FyZSBzcGVjcyB5ZXQgYW5kIHRoZXJlIGlzIG5vIGl2aWRlbyAqLworCS8qIFdlIGRvbid0IGtub3cgdGhlIGhhcmR3YXJlIHNwZWNzIHlldCBhbmQgdGhlcmUgaXMgbm8gaXZpZGVvICovCiAKIAlpZihuYW1lID09IE5VTEwpIHJldHVybjsKIAogCXdoaWxlKHNpc19jcnQydHlwZVtpXS50eXBlX25vICE9IC0xKSB7Ci0JICAgCWlmKCFzdHJuaWNtcChuYW1lLCBzaXNfY3J0MnR5cGVbaV0ubmFtZSwgc3RybGVuKHNpc19jcnQydHlwZVtpXS5uYW1lKSkpIHsKLQkgICAgICAJCXNpc2ZiX2NydDJ0eXBlID0gc2lzX2NydDJ0eXBlW2ldLnR5cGVfbm87Ci0JICAgICAgCQlzaXNmYl90dnBsdWcgPSBzaXNfY3J0MnR5cGVbaV0udHZwbHVnX25vOwotCSAgICAgIAkJc2lzZmJfY3J0MmZsYWdzID0gc2lzX2NydDJ0eXBlW2ldLmZsYWdzOwotCSAgICAgIAkJYnJlYWs7Ci0JICAgCX0KLQkgICAJaSsrOworCQlpZighc3RybmljbXAobmFtZSwgc2lzX2NydDJ0eXBlW2ldLm5hbWUsIHN0cmxlbihzaXNfY3J0MnR5cGVbaV0ubmFtZSkpKSB7CisJCQlzaXNmYl9jcnQydHlwZSA9IHNpc19jcnQydHlwZVtpXS50eXBlX25vOworCQkJc2lzZmJfdHZwbHVnID0gc2lzX2NydDJ0eXBlW2ldLnR2cGx1Z19ubzsKKwkJCXNpc2ZiX2NydDJmbGFncyA9IHNpc19jcnQydHlwZVtpXS5mbGFnczsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKIAl9CiAKIAlzaXNmYl9kc3RuID0gKHNpc2ZiX2NydDJmbGFncyAmIEZMXzU1MF9EU1ROKSA/IDEgOiAwOwogCXNpc2ZiX2ZzdG4gPSAoc2lzZmJfY3J0MmZsYWdzICYgRkxfNTUwX0ZTVE4pID8gMSA6IDA7CiAKLQlpZihzaXNmYl9jcnQydHlwZSA8IDApIHsKKwlpZihzaXNmYl9jcnQydHlwZSA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEludmFsaWQgQ1JUMiB0eXBlOiAlc1xuIiwgbmFtZSk7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQKQEAgLTMyMSwxNiArMzMzLDE3IEBACiB7CiAJaW50IGkgPSAwOwogCi0JLyogQkVXQVJFOiBXZSBkb24ndCBrbm93IHRoZSBoYXJkd2FyZSBzcGVjcyB5ZXQgYW5kIHRoZXJlIGlzIG5vIGl2aWRlbyAqLworCS8qIFdlIGRvbid0IGtub3cgdGhlIGhhcmR3YXJlIHNwZWNzIHlldCBhbmQgdGhlcmUgaXMgbm8gaXZpZGVvICovCiAKLQlpZihuYW1lID09IE5VTEwpIHJldHVybjsKKwlpZihuYW1lID09IE5VTEwpCisJCXJldHVybjsKIAogCXdoaWxlKHNpc190dnR5cGVbaV0udHlwZV9ubyAhPSAtMSkgewotCSAgIAlpZighc3RybmljbXAobmFtZSwgc2lzX3R2dHlwZVtpXS5uYW1lLCBzdHJsZW4oc2lzX3R2dHlwZVtpXS5uYW1lKSkpIHsKLQkgICAgICAJCXNpc2ZiX3R2c3RkID0gc2lzX3R2dHlwZVtpXS50eXBlX25vOwotCSAgICAgIAkJYnJlYWs7Ci0JICAgCX0KLQkgICAJaSsrOworCQlpZighc3RybmljbXAobmFtZSwgc2lzX3R2dHlwZVtpXS5uYW1lLCBzdHJsZW4oc2lzX3R2dHlwZVtpXS5uYW1lKSkpIHsKKwkJCXNpc2ZiX3R2c3RkID0gc2lzX3R2dHlwZVtpXS50eXBlX25vOworCQkJYnJlYWs7CisJCX0KKwkJaSsrOwogCX0KIH0KIApAQCAtMzQwLDM4ICszNTMsMTAxIEBACiAJaW50IGkgPSAwOwogCUJPT0xFQU4gZm91bmQgPSBGQUxTRTsKIAotCS8qIEJFV0FSRTogV2UgZG9uJ3Qga25vdyB0aGUgaGFyZHdhcmUgc3BlY3MgeWV0IGFuZCB0aGVyZSBpcyBubyBpdmlkZW8gKi8KKwkvKiBXZSBkb24ndCBrbm93IHRoZSBoYXJkd2FyZSBzcGVjcyB5ZXQgYW5kIHRoZXJlIGlzIG5vIGl2aWRlbyAqLwogCi0JaWYobmFtZSA9PSBOVUxMKSByZXR1cm47CisJaWYobmFtZSA9PSBOVUxMKQorCQlyZXR1cm47CiAKIAlpZighc3RybmljbXAobmFtZSwgIm5vbmUiLCA0KSkgewotCSAgICAgICAgc2lzZmJfc3BlY2lhbHRpbWluZyA9IENVVF9GT1JDRU5PTkU7CisJCXNpc2ZiX3NwZWNpYWx0aW1pbmcgPSBDVVRfRk9SQ0VOT05FOwogCQlwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IFNwZWNpYWwgdGltaW5nIGRpc2FibGVkXG4iKTsKIAl9IGVsc2UgewotCSAgIHdoaWxlKG15Y3VzdG9tdHRhYmxlW2ldLmNoaXBJRCAhPSAwKSB7Ci0JICAgICAgaWYoIXN0cm5pY21wKG5hbWUsbXljdXN0b210dGFibGVbaV0ub3B0aW9uTmFtZSwgc3RybGVuKG15Y3VzdG9tdHRhYmxlW2ldLm9wdGlvbk5hbWUpKSkgewotCQkgc2lzZmJfc3BlY2lhbHRpbWluZyA9IG15Y3VzdG9tdHRhYmxlW2ldLlNwZWNpYWxJRDsKLQkJIGZvdW5kID0gVFJVRTsKLQkJIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBTcGVjaWFsIHRpbWluZyBmb3IgJXMgJXMgZm9yY2VkIChcIiVzXCIpXG4iLAotCQkgCW15Y3VzdG9tdHRhYmxlW2ldLnZlbmRvck5hbWUsIG15Y3VzdG9tdHRhYmxlW2ldLmNhcmROYW1lLAotCQkgCW15Y3VzdG9tdHRhYmxlW2ldLm9wdGlvbk5hbWUpOwotCQkgYnJlYWs7Ci0JICAgICAgfQotCSAgICAgIGkrKzsKLQkgICB9Ci0JICAgaWYoIWZvdW5kKSB7Ci0JICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAic2lzZmI6IEludmFsaWQgU3BlY2lhbFRpbWluZyBwYXJhbWV0ZXIsIHZhbGlkIGFyZToiKTsKLQkgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJcdFwibm9uZVwiICh0byBkaXNhYmxlIHNwZWNpYWwgdGltaW5ncylcbiIpOwotCSAgICAgIGkgPSAwOwotCSAgICAgIHdoaWxlKG15Y3VzdG9tdHRhYmxlW2ldLmNoaXBJRCAhPSAwKSB7Ci0JCSBwcmludGsoS0VSTl9XQVJOSU5HICJcdFwiJXNcIiAoZm9yICVzICVzKVxuIiwKLQkJICAgICBteWN1c3RvbXR0YWJsZVtpXS5vcHRpb25OYW1lLAotCQkgICAgIG15Y3VzdG9tdHRhYmxlW2ldLnZlbmRvck5hbWUsCi0JCSAgICAgbXljdXN0b210dGFibGVbaV0uY2FyZE5hbWUpOwotCQkgaSsrOwotCSAgICAgIH0KLSAgICAgICAgICAgfQotIAl9CisJCXdoaWxlKG15Y3VzdG9tdHRhYmxlW2ldLmNoaXBJRCAhPSAwKSB7CisJCQlpZighc3RybmljbXAobmFtZSxteWN1c3RvbXR0YWJsZVtpXS5vcHRpb25OYW1lLAorCQkJICAgc3RybGVuKG15Y3VzdG9tdHRhYmxlW2ldLm9wdGlvbk5hbWUpKSkgeworCQkJCXNpc2ZiX3NwZWNpYWx0aW1pbmcgPSBteWN1c3RvbXR0YWJsZVtpXS5TcGVjaWFsSUQ7CisJCQkJZm91bmQgPSBUUlVFOworCQkJCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBTcGVjaWFsIHRpbWluZyBmb3IgJXMgJXMgZm9yY2VkIChcIiVzXCIpXG4iLAorCQkJCQlteWN1c3RvbXR0YWJsZVtpXS52ZW5kb3JOYW1lLAorCQkJCQlteWN1c3RvbXR0YWJsZVtpXS5jYXJkTmFtZSwKKwkJCQkJbXljdXN0b210dGFibGVbaV0ub3B0aW9uTmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpKys7CisJCX0KKwkJaWYoIWZvdW5kKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzaXNmYjogSW52YWxpZCBTcGVjaWFsVGltaW5nIHBhcmFtZXRlciwgdmFsaWQgYXJlOiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiXHRcIm5vbmVcIiAodG8gZGlzYWJsZSBzcGVjaWFsIHRpbWluZ3MpXG4iKTsKKwkJCWkgPSAwOworCQkJd2hpbGUobXljdXN0b210dGFibGVbaV0uY2hpcElEICE9IDApIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJcdFwiJXNcIiAoZm9yICVzICVzKVxuIiwKKwkJCQkJbXljdXN0b210dGFibGVbaV0ub3B0aW9uTmFtZSwKKwkJCQkJbXljdXN0b210dGFibGVbaV0udmVuZG9yTmFtZSwKKwkJCQkJbXljdXN0b210dGFibGVbaV0uY2FyZE5hbWUpOworCQkJCWkrKzsKKwkJCX0KKwkJfQorCX0KK30KKworLyogLS0tLS0tLS0tLS0gVmFyaW91cyBkZXRlY3Rpb24gcm91dGluZXMgLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0CitzaXNmYl9kZXRlY3RfY3VzdG9tX3RpbWluZyhzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKK3sKKwl1bnNpZ25lZCBjaGFyICpiaW9zdmVyID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICpiaW9zZGF0ZSA9IE5VTEw7CisJQk9PTEVBTiBmb290cHJpbnQ7CisJdTMyIGNoa3N1bSA9IDA7CisJaW50IGksIGo7CisKKwlpZihpdmlkZW8tPlNpU19Qci5Vc2VST00pIHsKKwkJYmlvc3ZlciA9IGl2aWRlby0+U2lTX1ByLlZpcnR1YWxSb21CYXNlICsgMHgwNjsKKwkJYmlvc2RhdGUgPSBpdmlkZW8tPlNpU19Qci5WaXJ0dWFsUm9tQmFzZSArIDB4MmM7CisJCWZvcihpID0gMDsgaSA8IDMyNzY4OyBpKyspCisJCQljaGtzdW0gKz0gaXZpZGVvLT5TaVNfUHIuVmlydHVhbFJvbUJhc2VbaV07CisJfQorCisJaSA9IDA7CisJZG8geworCQlpZiggKG15Y3VzdG9tdHRhYmxlW2ldLmNoaXBJRCA9PSBpdmlkZW8tPmNoaXApCQkJJiYKKwkJICAgICgoIXN0cmxlbihteWN1c3RvbXR0YWJsZVtpXS5iaW9zdmVyc2lvbikpIHx8CisJCSAgICAgKGl2aWRlby0+U2lTX1ByLlVzZVJPTSAmJgorCQkgICAgICAoIXN0cm5jbXAobXljdXN0b210dGFibGVbaV0uYmlvc3ZlcnNpb24sIGJpb3N2ZXIsCisJCQkJc3RybGVuKG15Y3VzdG9tdHRhYmxlW2ldLmJpb3N2ZXJzaW9uKSkpKSkJJiYKKwkJICAgICgoIXN0cmxlbihteWN1c3RvbXR0YWJsZVtpXS5iaW9zZGF0ZSkpIHx8CisJCSAgICAgKGl2aWRlby0+U2lTX1ByLlVzZVJPTSAmJgorCQkgICAgICAoIXN0cm5jbXAobXljdXN0b210dGFibGVbaV0uYmlvc2RhdGUsIGJpb3NkYXRlLAorCQkJCXN0cmxlbihteWN1c3RvbXR0YWJsZVtpXS5iaW9zZGF0ZSkpKSkpCQkmJgorCQkgICAgKCghbXljdXN0b210dGFibGVbaV0uYmlvc2Noa3N1bSkgfHwKKwkJICAgICAoaXZpZGVvLT5TaVNfUHIuVXNlUk9NICYmCisJCSAgICAgIChteWN1c3RvbXR0YWJsZVtpXS5iaW9zY2hrc3VtID09IGNoa3N1bSkpKQkJJiYKKwkJICAgIChteWN1c3RvbXR0YWJsZVtpXS5wY2lzdWJzeXN2ZW5kb3IgPT0gaXZpZGVvLT5zdWJzeXN2ZW5kb3IpICYmCisJCSAgICAobXljdXN0b210dGFibGVbaV0ucGNpc3Vic3lzY2FyZCA9PSBpdmlkZW8tPnN1YnN5c2RldmljZSkgKSB7CisJCQlmb290cHJpbnQgPSBUUlVFOworCQkJZm9yKGogPSAwOyBqIDwgNTsgaisrKSB7CisJCQkJaWYobXljdXN0b210dGFibGVbaV0uYmlvc0Zvb3RwcmludEFkZHJbal0pIHsKKwkJCQkJaWYoaXZpZGVvLT5TaVNfUHIuVXNlUk9NKSB7CisJCQkJCQlpZihpdmlkZW8tPlNpU19Qci5WaXJ0dWFsUm9tQmFzZVtteWN1c3RvbXR0YWJsZVtpXS5iaW9zRm9vdHByaW50QWRkcltqXV0gIT0KKwkJCQkJCQlteWN1c3RvbXR0YWJsZVtpXS5iaW9zRm9vdHByaW50RGF0YVtqXSkgeworCQkJCQkJCWZvb3RwcmludCA9IEZBTFNFOworCQkJCQkJfQorCQkJCQl9IGVsc2UKKwkJCQkJCWZvb3RwcmludCA9IEZBTFNFOworCQkJCX0KKwkJCX0KKwkJCWlmKGZvb3RwcmludCkgeworCQkJCWl2aWRlby0+U2lTX1ByLlNpU19DdXN0b21UID0gbXljdXN0b210dGFibGVbaV0uU3BlY2lhbElEOworCQkJCXByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogSWRlbnRpZmllZCBbJXMgJXNdLCBzcGVjaWFsIHRpbWluZyBhcHBsaWVzXG4iLAorCQkJCQlteWN1c3RvbXR0YWJsZVtpXS52ZW5kb3JOYW1lLAorCQkJCW15Y3VzdG9tdHRhYmxlW2ldLmNhcmROYW1lKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IFtzcGVjaWFsdGltaW5nIHBhcmFtZXRlciBuYW1lOiAlc11cbiIsCisJCQkJCW15Y3VzdG9tdHRhYmxlW2ldLm9wdGlvbk5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWkrKzsKKwl9IHdoaWxlKG15Y3VzdG9tdHRhYmxlW2ldLmNoaXBJRCk7CiB9CiAKIHN0YXRpYyBCT09MRUFOIF9fZGV2aW5pdApAQCAtMzg0LDIyICs0NjAsMjMgQEAKIAkgICBidWZmZXJbMl0gIT0gMHhmZiB8fCBidWZmZXJbM10gIT0gMHhmZiB8fAogCSAgIGJ1ZmZlcls0XSAhPSAweGZmIHx8IGJ1ZmZlcls1XSAhPSAweGZmIHx8CiAJICAgYnVmZmVyWzZdICE9IDB4ZmYgfHwgYnVmZmVyWzddICE9IDB4MDApIHsKLQkgICBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IEJhZCBFRElEIGhlYWRlclxuIik7Ci0JICAgcmV0dXJuIEZBTFNFOworCQlwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IEJhZCBFRElEIGhlYWRlclxuIik7CisJCXJldHVybiBGQUxTRTsKIAl9CiAKIAlpZihidWZmZXJbMHgxMl0gIT0gMHgwMSkgewotCSAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBFRElEIHZlcnNpb24gJWQgbm90IHN1cHBvcnRlZFxuIiwKLQkgICAJYnVmZmVyWzB4MTJdKTsKLQkgICByZXR1cm4gRkFMU0U7CisJCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBFRElEIHZlcnNpb24gJWQgbm90IHN1cHBvcnRlZFxuIiwKKwkJCWJ1ZmZlclsweDEyXSk7CisJCXJldHVybiBGQUxTRTsKIAl9CiAKIAltb25pdG9yLT5mZWF0dXJlID0gYnVmZmVyWzB4MThdOwogCiAJaWYoIWJ1ZmZlclsweDE0XSAmIDB4ODApIHsKLQkgICBpZighKGJ1ZmZlclsweDE0XSAmIDB4MDgpKSB7Ci0JICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFdBUk5JTkc6IE1vbml0b3IgZG9lcyBub3Qgc3VwcG9ydCBzZXBhcmF0ZSBzeW5jc1xuIik7Ci0JICAgfQorCQlpZighKGJ1ZmZlclsweDE0XSAmIDB4MDgpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJInNpc2ZiOiBXQVJOSU5HOiBNb25pdG9yIGRvZXMgbm90IHN1cHBvcnQgc2VwYXJhdGUgc3luY3NcbiIpOworCQl9CiAJfQogCiAJaWYoYnVmZmVyWzB4MTNdID49IDB4MDEpIHsKQEAgLTQwOSw3ICs0ODYsNyBAQAogCSAgICBqID0gMHgzNjsKIAkgICAgZm9yKGk9MDsgaTw0OyBpKyspIHsKIAkgICAgICAgaWYoYnVmZmVyW2pdICAgICA9PSAweDAwICYmIGJ1ZmZlcltqICsgMV0gPT0gMHgwMCAmJgotCSAgICAgICAgICBidWZmZXJbaiArIDJdID09IDB4MDAgJiYgYnVmZmVyW2ogKyAzXSA9PSAweGZkICYmCisJCSAgYnVmZmVyW2ogKyAyXSA9PSAweDAwICYmIGJ1ZmZlcltqICsgM10gPT0gMHhmZCAmJgogCQkgIGJ1ZmZlcltqICsgNF0gPT0gMHgwMCkgewogCQkgIG1vbml0b3ItPmhtaW4gPSBidWZmZXJbaiArIDddOwogCQkgIG1vbml0b3ItPmhtYXggPSBidWZmZXJbaiArIDhdOwpAQCAtNDM1LDcgKzUxMiw3IEBACiAJICAgZW1vZGVzID0gYnVmZmVyWzB4MjNdIHwgKGJ1ZmZlclsweDI0XSA8PCA4KSB8IChidWZmZXJbMHgyNV0gPDwgMTYpOwogCSAgIGZvcihpID0gMDsgaSA8IDEzOyBpKyspIHsKIAkgICAgICBpZihlbW9kZXMgJiBzaXNmYl9kZGNzbW9kZXNbaV0ubWFzaykgewotCSAgICAgICAgIGlmKG1vbml0b3ItPmhtaW4gPiBzaXNmYl9kZGNzbW9kZXNbaV0uaCkgbW9uaXRvci0+aG1pbiA9IHNpc2ZiX2RkY3Ntb2Rlc1tpXS5oOworCQkgaWYobW9uaXRvci0+aG1pbiA+IHNpc2ZiX2RkY3Ntb2Rlc1tpXS5oKSBtb25pdG9yLT5obWluID0gc2lzZmJfZGRjc21vZGVzW2ldLmg7CiAJCSBpZihtb25pdG9yLT5obWF4IDwgc2lzZmJfZGRjc21vZGVzW2ldLmgpIG1vbml0b3ItPmhtYXggPSBzaXNmYl9kZGNzbW9kZXNbaV0uaCArIDE7CiAJCSBpZihtb25pdG9yLT52bWluID4gc2lzZmJfZGRjc21vZGVzW2ldLnYpIG1vbml0b3ItPnZtaW4gPSBzaXNmYl9kZGNzbW9kZXNbaV0udjsKIAkJIGlmKG1vbml0b3ItPnZtYXggPCBzaXNmYl9kZGNzbW9kZXNbaV0udikgbW9uaXRvci0+dm1heCA9IHNpc2ZiX2RkY3Ntb2Rlc1tpXS52OwpAQCAtNDQ2LDgwICs1MjMsODEgQEAKIAkgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkgICAgICB4cmVzID0gKGJ1ZmZlcltpbmRleF0gKyAzMSkgKiA4OwogCSAgICAgIHN3aXRjaChidWZmZXJbaW5kZXggKyAxXSAmIDB4YzApIHsKLQkgICAgICAgICBjYXNlIDB4YzA6IHlyZXMgPSAoeHJlcyAqIDkpIC8gMTY7IGJyZWFrOwotCSAgICAgICAgIGNhc2UgMHg4MDogeXJlcyA9ICh4cmVzICogNCkgLyAgNTsgYnJlYWs7Ci0JICAgICAgICAgY2FzZSAweDQwOiB5cmVzID0gKHhyZXMgKiAzKSAvICA0OyBicmVhazsKLQkgICAgICAgICBkZWZhdWx0OiAgIHlyZXMgPSB4cmVzOwkgICAgYnJlYWs7CisJCSBjYXNlIDB4YzA6IHlyZXMgPSAoeHJlcyAqIDkpIC8gMTY7IGJyZWFrOworCQkgY2FzZSAweDgwOiB5cmVzID0gKHhyZXMgKiA0KSAvICA1OyBicmVhazsKKwkJIGNhc2UgMHg0MDogeXJlcyA9ICh4cmVzICogMykgLyAgNDsgYnJlYWs7CisJCSBkZWZhdWx0OiAgIHlyZXMgPSB4cmVzOwkgICAgYnJlYWs7CiAJICAgICAgfQogCSAgICAgIHJlZnJlc2ggPSAoYnVmZmVyW2luZGV4ICsgMV0gJiAweDNmKSArIDYwOwogCSAgICAgIGlmKCh4cmVzID49IDY0MCkgJiYgKHlyZXMgPj0gNDgwKSkgewotICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCA4OyBqKyspIHsKLQkgICAgICAgICAgICBpZigoeHJlcyA9PSBzaXNmYl9kZGNmbW9kZXNbal0ueCkgJiYKLQkgICAgICAgICAgICAgICAoeXJlcyA9PSBzaXNmYl9kZGNmbW9kZXNbal0ueSkgJiYKKwkJIGZvcihqID0gMDsgaiA8IDg7IGorKykgeworCQkgICAgaWYoKHhyZXMgPT0gc2lzZmJfZGRjZm1vZGVzW2pdLngpICYmCisJCSAgICAgICAoeXJlcyA9PSBzaXNmYl9kZGNmbW9kZXNbal0ueSkgJiYKIAkJICAgICAgIChyZWZyZXNoID09IHNpc2ZiX2RkY2Ztb2Rlc1tqXS52KSkgewogCQkgICAgICBpZihtb25pdG9yLT5obWluID4gc2lzZmJfZGRjZm1vZGVzW2pdLmgpIG1vbml0b3ItPmhtaW4gPSBzaXNmYl9kZGNmbW9kZXNbal0uaDsKIAkJICAgICAgaWYobW9uaXRvci0+aG1heCA8IHNpc2ZiX2RkY2Ztb2Rlc1tqXS5oKSBtb25pdG9yLT5obWF4ID0gc2lzZmJfZGRjZm1vZGVzW2pdLmggKyAxOwogCQkgICAgICBpZihtb25pdG9yLT52bWluID4gc2lzZmJfZGRjc21vZGVzW2pdLnYpIG1vbml0b3ItPnZtaW4gPSBzaXNmYl9kZGNzbW9kZXNbal0udjsKIAkJICAgICAgaWYobW9uaXRvci0+dm1heCA8IHNpc2ZiX2RkY3Ntb2Rlc1tqXS52KSBtb25pdG9yLT52bWF4ID0gc2lzZmJfZGRjc21vZGVzW2pdLnY7Ci0JCSAgICAgIGlmKG1vbml0b3ItPmRjbG9ja21heCA8IHNpc2ZiX2RkY3Ntb2Rlc1tqXS5kKSBtb25pdG9yLT5kY2xvY2ttYXggPSBzaXNmYl9kZGNzbW9kZXNbaV0uZDsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgfQorCQkgICAgICBpZihtb25pdG9yLT5kY2xvY2ttYXggPCBzaXNmYl9kZGNzbW9kZXNbal0uZCkgbW9uaXRvci0+ZGNsb2NrbWF4ID0gc2lzZmJfZGRjc21vZGVzW2pdLmQ7CisJCSAgICB9CisJCSB9CiAJICAgICAgfQogCSAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgIH0KKwkgICB9CiAJICAgaWYoKG1vbml0b3ItPmhtaW4gPD0gbW9uaXRvci0+aG1heCkgJiYgKG1vbml0b3ItPnZtaW4gPD0gbW9uaXRvci0+dm1heCkpIHsKIAkgICAgICBtb25pdG9yLT5kYXRhdmFsaWQgPSBUUlVFOwogCSAgIH0KIAl9CiAKLSAJcmV0dXJuKG1vbml0b3ItPmRhdGF2YWxpZCk7CisJcmV0dXJuIG1vbml0b3ItPmRhdGF2YWxpZDsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZpbml0CiBzaXNmYl9oYW5kbGVfZGRjKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBzdHJ1Y3Qgc2lzZmJfbW9uaXRvciAqbW9uaXRvciwgaW50IGNydG5vKQogewotCVVTSE9SVCAgdGVtcCwgaSwgcmVhbGNydG5vID0gY3J0bm87Ci0gICAJdTggICAgICBidWZmZXJbMjU2XTsKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wLCBpLCByZWFsY3J0bm8gPSBjcnRubzsKKwl1bnNpZ25lZCBjaGFyICBidWZmZXJbMjU2XTsKIAogCW1vbml0b3ItPmRhdGF2YWxpZCA9IEZBTFNFOwogCiAJaWYoY3J0bm8pIHsKLSAgICAgICAJICAgaWYoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9MQ0QpICAgICAgcmVhbGNydG5vID0gMTsKLSAgICAgIAkgICBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIENSVDJfVkdBKSByZWFsY3J0bm8gPSAyOwotICAgICAgCSAgIGVsc2UgcmV0dXJuOwotICAgCX0KKwkgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBDUlQyX0xDRCkgICAgICByZWFsY3J0bm8gPSAxOworCSAgIGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9WR0EpIHJlYWxjcnRubyA9IDI7CisJICAgZWxzZSByZXR1cm47CisJfQogCi0JaWYoKGl2aWRlby0+c2lzZmJfY3J0MW9mZikgJiYgKCFjcnRubykpIHJldHVybjsKKwlpZigoaXZpZGVvLT5zaXNmYl9jcnQxb2ZmKSAmJiAoIWNydG5vKSkKKwkJcmV0dXJuOwogCi0gICAgCXRlbXAgPSBTaVNfSGFuZGxlRERDKCZpdmlkZW8tPlNpU19QciwgaXZpZGVvLT52YmZsYWdzLCBpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsCi0JCQkJcmVhbGNydG5vLCAwLCAmYnVmZmVyWzBdKTsKLSAgIAlpZigoIXRlbXApIHx8ICh0ZW1wID09IDB4ZmZmZikpIHsKLSAgICAgIAkgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogQ1JUJWQgRERDIHByb2JpbmcgZmFpbGVkXG4iLCBjcnRubyArIDEpOworCXRlbXAgPSBTaVNfSGFuZGxlRERDKCZpdmlkZW8tPlNpU19QciwgaXZpZGVvLT52YmZsYWdzLCBpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsCisJCQkJcmVhbGNydG5vLCAwLCAmYnVmZmVyWzBdLCBpdmlkZW8tPnZiZmxhZ3MyKTsKKwlpZigoIXRlbXApIHx8ICh0ZW1wID09IDB4ZmZmZikpIHsKKwkgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogQ1JUJWQgRERDIHByb2JpbmcgZmFpbGVkXG4iLCBjcnRubyArIDEpOwogCSAgIHJldHVybjsKLSAgIAl9IGVsc2UgewotICAgICAgCSAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBDUlQlZCBEREMgc3VwcG9ydGVkXG4iLCBjcnRubyArIDEpOwotICAgICAgCSAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBDUlQlZCBEREMgbGV2ZWw6ICVzJXMlcyVzXG4iLAotCSAgIAljcnRubyArIDEsCi0JICAgCSh0ZW1wICYgMHgxYSkgPyAiIiA6ICJbbm9uZSBvZiB0aGUgc3VwcG9ydGVkXSIsCi0JICAgCSh0ZW1wICYgMHgwMikgPyAiMiAiIDogIiIsCi0JICAgCSh0ZW1wICYgMHgwOCkgPyAiRCZQIiA6ICIiLAotICAgICAgICAgICAJKHRlbXAgJiAweDEwKSA/ICJGUERJLTIiIDogIiIpOwotICAgICAgCSAgIGlmKHRlbXAgJiAweDAyKSB7CisJfSBlbHNlIHsKKwkgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogQ1JUJWQgRERDIHN1cHBvcnRlZFxuIiwgY3J0bm8gKyAxKTsKKwkgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogQ1JUJWQgRERDIGxldmVsOiAlcyVzJXMlc1xuIiwKKwkJY3J0bm8gKyAxLAorCQkodGVtcCAmIDB4MWEpID8gIiIgOiAiW25vbmUgb2YgdGhlIHN1cHBvcnRlZF0iLAorCQkodGVtcCAmIDB4MDIpID8gIjIgIiA6ICIiLAorCQkodGVtcCAmIDB4MDgpID8gIkQmUCIgOiAiIiwKKwkJKHRlbXAgJiAweDEwKSA/ICJGUERJLTIiIDogIiIpOworCSAgIGlmKHRlbXAgJiAweDAyKSB7CiAJICAgICAgaSA9IDM7ICAvKiBOdW1iZXIgb2YgcmV0cnlzICovCiAJICAgICAgZG8gewotCSAgICAJIHRlbXAgPSBTaVNfSGFuZGxlRERDKCZpdmlkZW8tPlNpU19QciwgaXZpZGVvLT52YmZsYWdzLCBpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsCi0JCQkJICAgICByZWFsY3J0bm8sIDEsICZidWZmZXJbMF0pOworCQkgdGVtcCA9IFNpU19IYW5kbGVEREMoJml2aWRlby0+U2lTX1ByLCBpdmlkZW8tPnZiZmxhZ3MsIGl2aWRlby0+c2lzdmdhX2VuZ2luZSwKKwkJCQkgICAgIHJlYWxjcnRubywgMSwgJmJ1ZmZlclswXSwgaXZpZGVvLT52YmZsYWdzMik7CiAJICAgICAgfSB3aGlsZSgodGVtcCkgJiYgaS0tKTsKLSAgICAgICAgICAgICAgaWYoIXRlbXApIHsKLQkgICAgCSBpZihzaXNmYl9pbnRlcnByZXRfZWRpZChtb25pdG9yLCAmYnVmZmVyWzBdKSkgeworCSAgICAgIGlmKCF0ZW1wKSB7CisJCSBpZihzaXNmYl9pbnRlcnByZXRfZWRpZChtb25pdG9yLCAmYnVmZmVyWzBdKSkgewogCQkgICAgcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IE1vbml0b3IgcmFuZ2UgSCAlZC0lZEtIeiwgViAlZC0lZEh6LCBNYXguIGRvdGNsb2NrICVkTUh6XG4iLAotCQkgICAgCW1vbml0b3ItPmhtaW4sIG1vbml0b3ItPmhtYXgsIG1vbml0b3ItPnZtaW4sIG1vbml0b3ItPnZtYXgsCisJCQltb25pdG9yLT5obWluLCBtb25pdG9yLT5obWF4LCBtb25pdG9yLT52bWluLCBtb25pdG9yLT52bWF4LAogCQkJbW9uaXRvci0+ZGNsb2NrbWF4IC8gMTAwMCk7CiAJCSB9IGVsc2UgewotCSAgICAgICAJICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBDUlQlZCBEREMgRURJRCBjb3JydXB0XG4iLCBjcnRubyArIDEpOwotCSAgICAJIH0KKwkJICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBDUlQlZCBEREMgRURJRCBjb3JydXB0XG4iLCBjcnRubyArIDEpOworCQkgfQogCSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAJIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBDUlQlZCBEREMgcmVhZGluZyBmYWlsZWRcbiIsIGNydG5vICsgMSk7CisJCSBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogQ1JUJWQgRERDIHJlYWRpbmcgZmFpbGVkXG4iLCBjcnRubyArIDEpOwogCSAgICAgIH0KIAkgICB9IGVsc2UgewogCSAgICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBWRVNBIEQmUCBhbmQgRlBESS0yIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKQEAgLTUyNyw2ICs2MDUsOCBAQAogCX0KIH0KIAorLyogLS0tLS0tLS0tLS0tLS0gTW9kZSB2YWxpZGF0aW9uIC0tLS0tLS0tLS0tLS0tLSAqLworCiBzdGF0aWMgQk9PTEVBTgogc2lzZmJfdmVyaWZ5X3JhdGUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHN0cnVjdCBzaXNmYl9tb25pdG9yICptb25pdG9yLAogCQlpbnQgbW9kZV9pZHgsIGludCByYXRlX2lkeCwgaW50IHJhdGUpCkBAIC01MzQsNDIgKzYxNCw0OSBAQAogCWludCBodG90YWwsIHZ0b3RhbDsKIAl1bnNpZ25lZCBpbnQgZGNsb2NrLCBoc3luYzsKIAotCWlmKCFtb25pdG9yLT5kYXRhdmFsaWQpIHJldHVybiBUUlVFOworCWlmKCFtb25pdG9yLT5kYXRhdmFsaWQpCisJCXJldHVybiBUUlVFOwogCi0JaWYobW9kZV9pZHggPCAwKSByZXR1cm4gRkFMU0U7CisJaWYobW9kZV9pZHggPCAwKQorCQlyZXR1cm4gRkFMU0U7CiAKIAkvKiBTa2lwIGZvciAzMjB4MjAwLCAzMjB4MjQwLCA2NDB4NDAwICovCi0gICAgCXN3aXRjaChzaXNiaW9zX21vZGVbbW9kZV9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldKSB7Ci0gICAgCWNhc2UgMHg1OToKLSAgICAJY2FzZSAweDQxOgotICAgIAljYXNlIDB4NGY6Ci0gICAgCWNhc2UgMHg1MDoKLSAgICAJY2FzZSAweDU2OgotICAgIAljYXNlIDB4NTM6Ci0gICAgCWNhc2UgMHgyZjoKLSAgICAJY2FzZSAweDVkOgotICAgIAljYXNlIDB4NWU6Ci0gICAgCQlyZXR1cm4gVFJVRTsKKwlzd2l0Y2goc2lzYmlvc19tb2RlW21vZGVfaWR4XS5tb2RlX25vW2l2aWRlby0+bW5pXSkgeworCWNhc2UgMHg1OToKKwljYXNlIDB4NDE6CisJY2FzZSAweDRmOgorCWNhc2UgMHg1MDoKKwljYXNlIDB4NTY6CisJY2FzZSAweDUzOgorCWNhc2UgMHgyZjoKKwljYXNlIDB4NWQ6CisJY2FzZSAweDVlOgorCQlyZXR1cm4gVFJVRTsKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQogCWNhc2UgMHg1YToKIAljYXNlIDB4NWI6CiAJCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgcmV0dXJuIFRSVUU7CiAjZW5kaWYKLSAgICAJfQorCX0KIAotCWlmKHJhdGUgPCAobW9uaXRvci0+dm1pbiAtIDEpKSByZXR1cm4gRkFMU0U7Ci0JaWYocmF0ZSA+IChtb25pdG9yLT52bWF4ICsgMSkpIHJldHVybiBGQUxTRTsKKwlpZihyYXRlIDwgKG1vbml0b3ItPnZtaW4gLSAxKSkKKwkJcmV0dXJuIEZBTFNFOworCWlmKHJhdGUgPiAobW9uaXRvci0+dm1heCArIDEpKQorCQlyZXR1cm4gRkFMU0U7CiAKLQlpZihzaXNmYl9nZXR0b3RhbGZyb21tb2RlKCZpdmlkZW8tPlNpU19QciwgJml2aWRlby0+c2lzaHdfZXh0LAorCWlmKHNpc2ZiX2dldHRvdGFsZnJvbW1vZGUoJml2aWRlby0+U2lTX1ByLAogCQkJCSAgc2lzYmlvc19tb2RlW21vZGVfaWR4XS5tb2RlX25vW2l2aWRlby0+bW5pXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZodG90YWwsICZ2dG90YWwsIHJhdGVfaWR4KSkgeworCQkJCSAgJmh0b3RhbCwgJnZ0b3RhbCwgcmF0ZV9pZHgpKSB7CiAJCWRjbG9jayA9IChodG90YWwgKiB2dG90YWwgKiByYXRlKSAvIDEwMDA7Ci0JCWlmKGRjbG9jayA+IChtb25pdG9yLT5kY2xvY2ttYXggKyAxMDAwKSkgcmV0dXJuIEZBTFNFOworCQlpZihkY2xvY2sgPiAobW9uaXRvci0+ZGNsb2NrbWF4ICsgMTAwMCkpCisJCQlyZXR1cm4gRkFMU0U7CiAJCWhzeW5jID0gZGNsb2NrIC8gaHRvdGFsOwotCQlpZihoc3luYyA8IChtb25pdG9yLT5obWluIC0gMSkpIHJldHVybiBGQUxTRTsKLQkJaWYoaHN5bmMgPiAobW9uaXRvci0+aG1heCArIDEpKSByZXR1cm4gRkFMU0U7CisJCWlmKGhzeW5jIDwgKG1vbml0b3ItPmhtaW4gLSAxKSkKKwkJCXJldHVybiBGQUxTRTsKKwkJaWYoaHN5bmMgPiAobW9uaXRvci0+aG1heCArIDEpKQorCQkJcmV0dXJuIEZBTFNFOwogICAgICAgICB9IGVsc2UgewotCSAgCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIEZBTFNFOwogCX0KIAlyZXR1cm4gVFJVRTsKIH0KQEAgLTU3Nyw4MiArNjY0LDc5IEBACiBzdGF0aWMgaW50CiBzaXNmYl92YWxpZGF0ZV9tb2RlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBpbnQgbXlpbmRleCwgdTMyIHZiZmxhZ3MpCiB7Ci0gICB1MTYgeHJlcz0wLCB5cmVzLCBteXJlczsKKwl1MTYgeHJlcz0wLCB5cmVzLCBteXJlczsKIAogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0gICBpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLSAgICAgIGlmKCEoc2lzYmlvc19tb2RlW215aW5kZXhdLmNoaXBzZXQgJiBNRF9TSVMzMDApKSByZXR1cm4oLTEpOwotICAgfQorCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCQlpZighKHNpc2Jpb3NfbW9kZVtteWluZGV4XS5jaGlwc2V0ICYgTURfU0lTMzAwKSkKKwkJCXJldHVybiAtMSA7CisJfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKLSAgIGlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotICAgICAgaWYoIShzaXNiaW9zX21vZGVbbXlpbmRleF0uY2hpcHNldCAmIE1EX1NJUzMxNSkpIHJldHVybigtMSk7Ci0gICB9CisJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7CisJCWlmKCEoc2lzYmlvc19tb2RlW215aW5kZXhdLmNoaXBzZXQgJiBNRF9TSVMzMTUpKQorCQkJcmV0dXJuIC0xOworCX0KICNlbmRpZgogCi0gICBteXJlcyA9IHNpc2Jpb3NfbW9kZVtteWluZGV4XS55cmVzOworCW15cmVzID0gc2lzYmlvc19tb2RlW215aW5kZXhdLnlyZXM7CiAKLSAgIHN3aXRjaCh2YmZsYWdzICYgVkJfRElTUFRZUEVfRElTUDIpIHsKKwlzd2l0Y2godmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AyKSB7CiAKLSAgICAgY2FzZSBDUlQyX0xDRDoKKwljYXNlIENSVDJfTENEOgorCQl4cmVzID0gaXZpZGVvLT5sY2R4cmVzOyB5cmVzID0gaXZpZGVvLT5sY2R5cmVzOwogCi0gICAgICAgIHhyZXMgPSBpdmlkZW8tPmxjZHhyZXM7IHlyZXMgPSBpdmlkZW8tPmxjZHlyZXM7CisJCWlmKChpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCAhPSBDVVRfUEFORUw4NDgpICYmCisJCSAgIChpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCAhPSBDVVRfUEFORUw4NTYpKSB7CisJCQlpZihzaXNiaW9zX21vZGVbbXlpbmRleF0ueHJlcyA+IHhyZXMpCisJCQkJcmV0dXJuIC0xOworCQkJaWYobXlyZXMgPiB5cmVzKQorCQkJCXJldHVybiAtMTsKKwkJfQogCi0JaWYoaXZpZGVvLT5TaVNfUHIuU2lTX0N1c3RvbVQgIT0gQ1VUX1BBTkVMODQ4KSB7Ci0JICAgCWlmKHNpc2Jpb3NfbW9kZVtteWluZGV4XS54cmVzID4geHJlcykgcmV0dXJuKC0xKTsKLSAgICAgICAgICAgCWlmKG15cmVzID4geXJlcykgcmV0dXJuKC0xKTsKKwkJaWYoaXZpZGVvLT5zaXNmYl9mc3RuKSB7CisJCQlpZihzaXNiaW9zX21vZGVbbXlpbmRleF0ueHJlcyA9PSAzMjApIHsKKwkJCQlpZihteXJlcyA9PSAyNDApIHsKKwkJCQkJc3dpdGNoKHNpc2Jpb3NfbW9kZVtteWluZGV4XS5tb2RlX25vWzFdKSB7CisJCQkJCQljYXNlIDB4NTA6IG15aW5kZXggPSBNT0RFX0ZTVE5fODsgIGJyZWFrOworCQkJCQkJY2FzZSAweDU2OiBteWluZGV4ID0gTU9ERV9GU1ROXzE2OyBicmVhazsKKwkJCQkJCWNhc2UgMHg1MzogcmV0dXJuIC0xOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYoU2lTX0dldE1vZGVJRF9MQ0QoaXZpZGVvLT5zaXN2Z2FfZW5naW5lLCB2YmZsYWdzLCBzaXNiaW9zX21vZGVbbXlpbmRleF0ueHJlcywKKwkJCSAJc2lzYmlvc19tb2RlW215aW5kZXhdLnlyZXMsIDAsIGl2aWRlby0+c2lzZmJfZnN0biwKKwkJCSAJaXZpZGVvLT5TaVNfUHIuU2lTX0N1c3RvbVQsIHhyZXMsIHlyZXMsIGl2aWRlby0+dmJmbGFnczIpIDwgMHgxNCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDUlQyX1RWOgorCQlpZihTaVNfR2V0TW9kZUlEX1RWKGl2aWRlby0+c2lzdmdhX2VuZ2luZSwgdmJmbGFncywgc2lzYmlvc19tb2RlW215aW5kZXhdLnhyZXMsCisJCQkJc2lzYmlvc19tb2RlW215aW5kZXhdLnlyZXMsIDAsIGl2aWRlby0+dmJmbGFnczIpIDwgMHgxNCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDUlQyX1ZHQToKKwkJaWYoU2lTX0dldE1vZGVJRF9WR0EyKGl2aWRlby0+c2lzdmdhX2VuZ2luZSwgdmJmbGFncywgc2lzYmlvc19tb2RlW215aW5kZXhdLnhyZXMsCisJCQkJc2lzYmlvc19tb2RlW215aW5kZXhdLnlyZXMsIDAsIGl2aWRlby0+dmJmbGFnczIpIDwgMHgxNCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWJyZWFrOwogCX0KIAotCWlmKHZiZmxhZ3MgJiAoVkJfTFZEUyB8IFZCXzMweEJESCkpIHsKLQkgICBpZihzaXNiaW9zX21vZGVbbXlpbmRleF0ueHJlcyA9PSAzMjApIHsKLQkgICAgICBpZigobXlyZXMgPT0gMjQwKSB8fCAobXlyZXMgPT0gNDgwKSkgewotCQkgaWYoIWl2aWRlby0+c2lzZmJfZnN0bikgewotCQkgICAgaWYoc2lzYmlvc19tb2RlW215aW5kZXhdLm1vZGVfbm9bMV0gPT0gMHg1YSB8fAotCQkgICAgICAgc2lzYmlvc19tb2RlW215aW5kZXhdLm1vZGVfbm9bMV0gPT0gMHg1YikKLQkJICAgICAgIHJldHVybigtMSk7Ci0JCSB9IGVsc2UgewotCQkgICAgaWYoc2lzYmlvc19tb2RlW215aW5kZXhdLm1vZGVfbm9bMV0gPT0gMHg1MCB8fAotCQkgICAgICAgc2lzYmlvc19tb2RlW215aW5kZXhdLm1vZGVfbm9bMV0gPT0gMHg1NiB8fAotCQkgICAgICAgc2lzYmlvc19tb2RlW215aW5kZXhdLm1vZGVfbm9bMV0gPT0gMHg1MykKLQkJICAgICAgIHJldHVybigtMSk7Ci0JCSB9Ci0JICAgICAgfQotCSAgIH0KLQl9Ci0KLQlpZihTaVNfR2V0TW9kZUlEX0xDRChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsIHZiZmxhZ3MsIHNpc2Jpb3NfbW9kZVtteWluZGV4XS54cmVzLAotCQkJICAgICBzaXNiaW9zX21vZGVbbXlpbmRleF0ueXJlcywgMCwgaXZpZGVvLT5zaXNmYl9mc3RuLAotCQkJICAgICBpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCwgeHJlcywgeXJlcykgPCAweDE0KSB7Ci0JICAgCXJldHVybigtMSk7Ci0JfQotCWJyZWFrOwotCi0gICAgIGNhc2UgQ1JUMl9UVjoKLQlpZihTaVNfR2V0TW9kZUlEX1RWKGl2aWRlby0+c2lzdmdhX2VuZ2luZSwgdmJmbGFncywgc2lzYmlvc19tb2RlW215aW5kZXhdLnhyZXMsCi0JICAgICAgICAgICAgICAgICAgICBzaXNiaW9zX21vZGVbbXlpbmRleF0ueXJlcywgMCkgPCAweDE0KSB7Ci0JICAgCXJldHVybigtMSk7Ci0JfQotCWJyZWFrOwotCi0gICAgIGNhc2UgQ1JUMl9WR0E6Ci0gICAgICAgIGlmKFNpU19HZXRNb2RlSURfVkdBMihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsIHZiZmxhZ3MsIHNpc2Jpb3NfbW9kZVtteWluZGV4XS54cmVzLAotCSAgICAgICAgICAgICAgICAgICAgICBzaXNiaW9zX21vZGVbbXlpbmRleF0ueXJlcywgMCkgPCAweDE0KSB7Ci0JICAgCXJldHVybigtMSk7Ci0JfQotCWJyZWFrOwotICAgICB9Ci0KLSAgICAgcmV0dXJuKG15aW5kZXgpOworCXJldHVybiBteWluZGV4OwogfQogCiBzdGF0aWMgdTgKIHNpc2ZiX3NlYXJjaF9yZWZyZXNoX3JhdGUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHVuc2lnbmVkIGludCByYXRlLCBpbnQgbW9kZV9pZHgpCiB7Ci0JdTE2IHhyZXMsIHlyZXM7CiAJaW50IGkgPSAwOwotCi0JeHJlcyA9IHNpc2Jpb3NfbW9kZVttb2RlX2lkeF0ueHJlczsKLQl5cmVzID0gc2lzYmlvc19tb2RlW21vZGVfaWR4XS55cmVzOworCXUxNiB4cmVzID0gc2lzYmlvc19tb2RlW21vZGVfaWR4XS54cmVzOworCXUxNiB5cmVzID0gc2lzYmlvc19tb2RlW21vZGVfaWR4XS55cmVzOwogCiAJaXZpZGVvLT5yYXRlX2lkeCA9IDA7CiAJd2hpbGUoKHNpc2ZiX3ZyYXRlW2ldLmlkeCAhPSAwKSAmJiAoc2lzZmJfdnJhdGVbaV0ueHJlcyA8PSB4cmVzKSkgewpAQCAtNjcyLDE0ICs3NTYsMTQgQEAKIAkJCQkJCXJhdGUsIHNpc2ZiX3ZyYXRlW2ktMV0ucmVmcmVzaCk7CiAJCQkJCWl2aWRlby0+cmF0ZV9pZHggPSBzaXNmYl92cmF0ZVtpLTFdLmlkeDsKIAkJCQkJaXZpZGVvLT5yZWZyZXNoX3JhdGUgPSBzaXNmYl92cmF0ZVtpLTFdLnJlZnJlc2g7Ci0JCQkJfSAKKwkJCQl9CiAJCQkJYnJlYWs7CiAJCQl9IGVsc2UgaWYoKHJhdGUgLSBzaXNmYl92cmF0ZVtpXS5yZWZyZXNoKSA8PSAyKSB7CiAJCQkJRFBSSU5USygic2lzZmI6IEFkanVzdGluZyByYXRlIGZyb20gJWQgZG93biB0byAlZFxuIiwKIAkJCQkJCXJhdGUsIHNpc2ZiX3ZyYXRlW2ldLnJlZnJlc2gpOwotCSAgICAgICAgICAgCQlpdmlkZW8tPnJhdGVfaWR4ID0gc2lzZmJfdnJhdGVbaV0uaWR4OwotCQkgICAJCWJyZWFrOwotCSAgICAgICAJCX0KKwkJCQlpdmlkZW8tPnJhdGVfaWR4ID0gc2lzZmJfdnJhdGVbaV0uaWR4OworCQkJCWJyZWFrOworCQkJfQogCQl9CiAJCWkrKzsKIAl9CkBAIC02OTUsMjUyICs3NzksMzIxIEBACiBzdGF0aWMgQk9PTEVBTgogc2lzZmJfYnJpZGdlaXNzbGF2ZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKLSAgIHVuc2lnbmVkIGNoYXIgUDFfMDA7CisJdW5zaWduZWQgY2hhciBQMV8wMDsKIAotICAgaWYoIShpdmlkZW8tPnZiZmxhZ3MgJiBWQl9WSURFT0JSSURHRSkpIHJldHVybiBGQUxTRTsKKwlpZighKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfVklERU9CUklER0UpKQorCQlyZXR1cm4gRkFMU0U7CiAKLSAgIGluU0lTSURYUkVHKFNJU1BBUlQxLDB4MDAsUDFfMDApOwotICAgaWYoICgoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSAmJiAoUDFfMDAgJiAweGEwKSA9PSAweDIwKSB8fAotICAgICAgICgoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSAmJiAoUDFfMDAgJiAweDUwKSA9PSAweDEwKSApIHsKLQkgICByZXR1cm4gVFJVRTsKLSAgIH0gZWxzZSB7Ci0gICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgIH0KKwlpblNJU0lEWFJFRyhTSVNQQVJUMSwweDAwLFAxXzAwKTsKKwlpZiggKChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpICYmIChQMV8wMCAmIDB4YTApID09IDB4MjApIHx8CisJICAgICgoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSAmJiAoUDFfMDAgJiAweDUwKSA9PSAweDEwKSApIHsKKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KIH0KIAogc3RhdGljIEJPT0xFQU4KIHNpc2ZiYWxsb3dyZXRyYWNlY3J0MShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKLSAgIHU4IHRlbXA7CisJdTggdGVtcDsKIAotICAgaW5TSVNJRFhSRUcoU0lTQ1IsMHgxNyx0ZW1wKTsKLSAgIGlmKCEodGVtcCAmIDB4ODApKSByZXR1cm4gRkFMU0U7CisJaW5TSVNJRFhSRUcoU0lTQ1IsMHgxNyx0ZW1wKTsKKwlpZighKHRlbXAgJiAweDgwKSkKKwkJcmV0dXJuIEZBTFNFOwogCi0gICBpblNJU0lEWFJFRyhTSVNTUiwweDFmLHRlbXApOwotICAgaWYodGVtcCAmIDB4YzApIHJldHVybiBGQUxTRTsKKwlpblNJU0lEWFJFRyhTSVNTUiwweDFmLHRlbXApOworCWlmKHRlbXAgJiAweGMwKQorCQlyZXR1cm4gRkFMU0U7CiAKLSAgIHJldHVybiBUUlVFOworCXJldHVybiBUUlVFOwogfQogCiBzdGF0aWMgQk9PTEVBTgogc2lzZmJjaGVja3ZyZXRyYWNlY3J0MShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKLSAgIGlmKCFzaXNmYmFsbG93cmV0cmFjZWNydDEoaXZpZGVvKSkgcmV0dXJuIEZBTFNFOworCWlmKCFzaXNmYmFsbG93cmV0cmFjZWNydDEoaXZpZGVvKSkKKwkJcmV0dXJuIEZBTFNFOwogCi0gICBpZihpblNJU1JFRyhTSVNJTlBTVEFUKSAmIDB4MDgpIHJldHVybiBUUlVFOwotICAgZWxzZSAJCQkgICByZXR1cm4gRkFMU0U7CisJaWYoaW5TSVNSRUcoU0lTSU5QU1RBVCkgJiAweDA4KQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKIH0KIAogc3RhdGljIHZvaWQKIHNpc2Zid2FpdHJldHJhY2VjcnQxKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewotICAgaW50IHdhdGNoZG9nOworCWludCB3YXRjaGRvZzsKIAotICAgaWYoIXNpc2ZiYWxsb3dyZXRyYWNlY3J0MShpdmlkZW8pKSByZXR1cm47CisJaWYoIXNpc2ZiYWxsb3dyZXRyYWNlY3J0MShpdmlkZW8pKQorCQlyZXR1cm47CiAKLSAgIHdhdGNoZG9nID0gNjU1MzY7Ci0gICB3aGlsZSgoIShpblNJU1JFRyhTSVNJTlBTVEFUKSAmIDB4MDgpKSAmJiAtLXdhdGNoZG9nKTsKLSAgIHdhdGNoZG9nID0gNjU1MzY7Ci0gICB3aGlsZSgoaW5TSVNSRUcoU0lTSU5QU1RBVCkgJiAweDA4KSAmJiAtLXdhdGNoZG9nKTsKKwl3YXRjaGRvZyA9IDY1NTM2OworCXdoaWxlKCghKGluU0lTUkVHKFNJU0lOUFNUQVQpICYgMHgwOCkpICYmIC0td2F0Y2hkb2cpOworCXdhdGNoZG9nID0gNjU1MzY7CisJd2hpbGUoKGluU0lTUkVHKFNJU0lOUFNUQVQpICYgMHgwOCkgJiYgLS13YXRjaGRvZyk7CiB9CiAKIHN0YXRpYyBCT09MRUFOCiBzaXNmYmNoZWNrdnJldHJhY2VjcnQyKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewotICAgdW5zaWduZWQgY2hhciB0ZW1wLCByZWc7CisJdW5zaWduZWQgY2hhciB0ZW1wLCByZWc7CiAKLSAgIHN3aXRjaChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUpIHsKLSAgIGNhc2UgU0lTXzMwMF9WR0E6IHJlZyA9IDB4MjU7IGJyZWFrOwotICAgY2FzZSBTSVNfMzE1X1ZHQTogcmVnID0gMHgzMDsgYnJlYWs7Ci0gICBkZWZhdWx0OiAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICB9CisJc3dpdGNoKGl2aWRlby0+c2lzdmdhX2VuZ2luZSkgeworCWNhc2UgU0lTXzMwMF9WR0E6IHJlZyA9IDB4MjU7IGJyZWFrOworCWNhc2UgU0lTXzMxNV9WR0E6IHJlZyA9IDB4MzA7IGJyZWFrOworCWRlZmF1bHQ6CSAgcmV0dXJuIEZBTFNFOworCX0KIAotICAgaW5TSVNJRFhSRUcoU0lTUEFSVDEsIHJlZywgdGVtcCk7Ci0gICBpZih0ZW1wICYgMHgwMikgcmV0dXJuIFRSVUU7Ci0gICBlbHNlIAkgICByZXR1cm4gRkFMU0U7CisJaW5TSVNJRFhSRUcoU0lTUEFSVDEsIHJlZywgdGVtcCk7CisJaWYodGVtcCAmIDB4MDIpCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOwogfQogCiBzdGF0aWMgQk9PTEVBTgogc2lzZmJfQ2hlY2tWQlJldHJhY2Uoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCiB7Ci0gICBpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgVkJfRElTUFRZUEVfRElTUDIpIHsKLSAgICAgIGlmKHNpc2ZiX2JyaWRnZWlzc2xhdmUoaXZpZGVvKSkgewotICAgICAgICAgcmV0dXJuKHNpc2ZiY2hlY2t2cmV0cmFjZWNydDEoaXZpZGVvKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgcmV0dXJuKHNpc2ZiY2hlY2t2cmV0cmFjZWNydDIoaXZpZGVvKSk7Ci0gICAgICB9Ci0gICB9IAotICAgcmV0dXJuKHNpc2ZiY2hlY2t2cmV0cmFjZWNydDEoaXZpZGVvKSk7CisJaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AyKSB7CisJCWlmKCFzaXNmYl9icmlkZ2Vpc3NsYXZlKGl2aWRlbykpIHsKKwkJCXJldHVybiBzaXNmYmNoZWNrdnJldHJhY2VjcnQyKGl2aWRlbyk7CisJCX0KKwl9CisJcmV0dXJuIHNpc2ZiY2hlY2t2cmV0cmFjZWNydDEoaXZpZGVvKTsKIH0KIAogc3RhdGljIHUzMgogc2lzZmJfc2V0dXB2YmJsYW5rZmxhZ3Moc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHUzMiAqdmNvdW50LCB1MzIgKmhjb3VudCkKIHsKLSAgIHU4IGlkeCwgcmVnMSwgcmVnMiwgcmVnMywgcmVnNDsKLSAgIHUzMiByZXQgPSAwOworCXU4IGlkeCwgcmVnMSwgcmVnMiwgcmVnMywgcmVnNDsKKwl1MzIgcmV0ID0gMDsKIAotICAgKCp2Y291bnQpID0gKCpoY291bnQpID0gMDsKKwkoKnZjb3VudCkgPSAoKmhjb3VudCkgPSAwOwogCi0gICBpZigoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AyKSAmJiAoIShzaXNmYl9icmlkZ2Vpc3NsYXZlKGl2aWRlbykpKSkgewotICAgICAgcmV0IHw9IChGQl9WQkxBTktfSEFWRV9WU1lOQyAgfAotICAgICAgCSAgICAgIEZCX1ZCTEFOS19IQVZFX0hCTEFOSyB8Ci0gICAgICAgICAgICAgIEZCX1ZCTEFOS19IQVZFX1ZCTEFOSyB8Ci0JICAgICAgRkJfVkJMQU5LX0hBVkVfVkNPVU5UIHwKLQkgICAgICBGQl9WQkxBTktfSEFWRV9IQ09VTlQpOwotICAgICAgc3dpdGNoKGl2aWRlby0+c2lzdmdhX2VuZ2luZSkgewotICAgICAgICAgY2FzZSBTSVNfMzAwX1ZHQTogaWR4ID0gMHgyNTsgYnJlYWs7Ci0JIGRlZmF1bHQ6Ci0gICAgICAgICBjYXNlIFNJU18zMTVfVkdBOiBpZHggPSAweDMwOyBicmVhazsKLSAgICAgIH0KLSAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQxLChpZHgrMCkscmVnMSk7IC8qIDMwICovCi0gICAgICBpblNJU0lEWFJFRyhTSVNQQVJUMSwoaWR4KzEpLHJlZzIpOyAvKiAzMSAqLwotICAgICAgaW5TSVNJRFhSRUcoU0lTUEFSVDEsKGlkeCsyKSxyZWczKTsgLyogMzIgKi8KLSAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQxLChpZHgrMykscmVnNCk7IC8qIDMzICovCi0gICAgICBpZihyZWcxICYgMHgwMSkgcmV0IHw9IEZCX1ZCTEFOS19WQkxBTktJTkc7Ci0gICAgICBpZihyZWcxICYgMHgwMikgcmV0IHw9IEZCX1ZCTEFOS19WU1lOQ0lORzsKLSAgICAgIGlmKHJlZzQgJiAweDgwKSByZXQgfD0gRkJfVkJMQU5LX0hCTEFOS0lORzsKLSAgICAgICgqdmNvdW50KSA9IHJlZzMgfCAoKHJlZzQgJiAweDcwKSA8PCA0KTsKLSAgICAgICgqaGNvdW50KSA9IHJlZzIgfCAoKHJlZzQgJiAweDBmKSA8PCA4KTsKLSAgIH0gZWxzZSBpZihzaXNmYmFsbG93cmV0cmFjZWNydDEoaXZpZGVvKSkgewotICAgICAgcmV0IHw9IChGQl9WQkxBTktfSEFWRV9WU1lOQyAgfAotICAgICAgICAgICAgICBGQl9WQkxBTktfSEFWRV9WQkxBTksgfAotCSAgICAgIEZCX1ZCTEFOS19IQVZFX1ZDT1VOVCB8Ci0JICAgICAgRkJfVkJMQU5LX0hBVkVfSENPVU5UKTsKLSAgICAgIHJlZzEgPSBpblNJU1JFRyhTSVNJTlBTVEFUKTsKLSAgICAgIGlmKHJlZzEgJiAweDA4KSByZXQgfD0gRkJfVkJMQU5LX1ZTWU5DSU5HOwotICAgICAgaWYocmVnMSAmIDB4MDEpIHJldCB8PSBGQl9WQkxBTktfVkJMQU5LSU5HOwotICAgICAgaW5TSVNJRFhSRUcoU0lTQ1IsMHgyMCxyZWcxKTsKLSAgICAgIGluU0lTSURYUkVHKFNJU0NSLDB4MWIscmVnMSk7Ci0gICAgICBpblNJU0lEWFJFRyhTSVNDUiwweDFjLHJlZzIpOwotICAgICAgaW5TSVNJRFhSRUcoU0lTQ1IsMHgxZCxyZWczKTsKLSAgICAgICgqdmNvdW50KSA9IHJlZzIgfCAoKHJlZzMgJiAweDA3KSA8PCA4KTsKLSAgICAgICgqaGNvdW50KSA9IChyZWcxIHwgKChyZWczICYgMHgxMCkgPDwgNCkpIDw8IDM7Ci0gICB9Ci0gICByZXR1cm4gcmV0OworCWlmKChpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgVkJfRElTUFRZUEVfRElTUDIpICYmICghKHNpc2ZiX2JyaWRnZWlzc2xhdmUoaXZpZGVvKSkpKSB7CisKKwkJcmV0IHw9IChGQl9WQkxBTktfSEFWRV9WU1lOQyAgfAorCQkJRkJfVkJMQU5LX0hBVkVfSEJMQU5LIHwKKwkJCUZCX1ZCTEFOS19IQVZFX1ZCTEFOSyB8CisJCQlGQl9WQkxBTktfSEFWRV9WQ09VTlQgfAorCQkJRkJfVkJMQU5LX0hBVkVfSENPVU5UKTsKKwkJc3dpdGNoKGl2aWRlby0+c2lzdmdhX2VuZ2luZSkgeworCQkJY2FzZSBTSVNfMzAwX1ZHQTogaWR4ID0gMHgyNTsgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJY2FzZSBTSVNfMzE1X1ZHQTogaWR4ID0gMHgzMDsgYnJlYWs7CisJCX0KKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDEsKGlkeCswKSxyZWcxKTsgLyogMzAgKi8KKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDEsKGlkeCsxKSxyZWcyKTsgLyogMzEgKi8KKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDEsKGlkeCsyKSxyZWczKTsgLyogMzIgKi8KKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDEsKGlkeCszKSxyZWc0KTsgLyogMzMgKi8KKwkJaWYocmVnMSAmIDB4MDEpIHJldCB8PSBGQl9WQkxBTktfVkJMQU5LSU5HOworCQlpZihyZWcxICYgMHgwMikgcmV0IHw9IEZCX1ZCTEFOS19WU1lOQ0lORzsKKwkJaWYocmVnNCAmIDB4ODApIHJldCB8PSBGQl9WQkxBTktfSEJMQU5LSU5HOworCQkoKnZjb3VudCkgPSByZWczIHwgKChyZWc0ICYgMHg3MCkgPDwgNCk7CisJCSgqaGNvdW50KSA9IHJlZzIgfCAoKHJlZzQgJiAweDBmKSA8PCA4KTsKKworCX0gZWxzZSBpZihzaXNmYmFsbG93cmV0cmFjZWNydDEoaXZpZGVvKSkgeworCisJCXJldCB8PSAoRkJfVkJMQU5LX0hBVkVfVlNZTkMgIHwKKwkJCUZCX1ZCTEFOS19IQVZFX1ZCTEFOSyB8CisJCQlGQl9WQkxBTktfSEFWRV9WQ09VTlQgfAorCQkJRkJfVkJMQU5LX0hBVkVfSENPVU5UKTsKKwkJcmVnMSA9IGluU0lTUkVHKFNJU0lOUFNUQVQpOworCQlpZihyZWcxICYgMHgwOCkgcmV0IHw9IEZCX1ZCTEFOS19WU1lOQ0lORzsKKwkJaWYocmVnMSAmIDB4MDEpIHJldCB8PSBGQl9WQkxBTktfVkJMQU5LSU5HOworCQlpblNJU0lEWFJFRyhTSVNDUiwweDIwLHJlZzEpOworCQlpblNJU0lEWFJFRyhTSVNDUiwweDFiLHJlZzEpOworCQlpblNJU0lEWFJFRyhTSVNDUiwweDFjLHJlZzIpOworCQlpblNJU0lEWFJFRyhTSVNDUiwweDFkLHJlZzMpOworCQkoKnZjb3VudCkgPSByZWcyIHwgKChyZWczICYgMHgwNykgPDwgOCk7CisJCSgqaGNvdW50KSA9IChyZWcxIHwgKChyZWczICYgMHgxMCkgPDwgNCkpIDw8IDM7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludAogc2lzZmJfbXlibGFuayhzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IGJsYW5rKQogewotICAgdTggc3IwMSwgc3IxMSwgc3IxZiwgY3I2Mz0wLCBwMl8wLCBwMV8xMzsKLSAgIEJPT0xFQU4gYmFja2xpZ2h0ID0gVFJVRTsKKwl1OCBzcjAxLCBzcjExLCBzcjFmLCBjcjYzPTAsIHAyXzAsIHAxXzEzOworCUJPT0xFQU4gYmFja2xpZ2h0ID0gVFJVRTsKIAotICAgc3dpdGNoKGJsYW5rKSB7Ci0gICBjYXNlIEZCX0JMQU5LX1VOQkxBTks6CS8qIG9uICovCi0gICAgICBzcjAxICA9IDB4MDA7Ci0gICAgICBzcjExICA9IDB4MDA7Ci0gICAgICBzcjFmICA9IDB4MDA7Ci0gICAgICBjcjYzICA9IDB4MDA7Ci0gICAgICBwMl8wICA9IDB4MjA7Ci0gICAgICBwMV8xMyA9IDB4MDA7Ci0gICAgICBiYWNrbGlnaHQgPSBUUlVFOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEZCX0JMQU5LX05PUk1BTDoJLyogYmxhbmsgKi8KLSAgICAgIHNyMDEgID0gMHgyMDsKLSAgICAgIHNyMTEgID0gMHgwMDsKLSAgICAgIHNyMWYgID0gMHgwMDsKLSAgICAgIGNyNjMgID0gMHgwMDsKLSAgICAgIHAyXzAgID0gMHgyMDsKLSAgICAgIHAxXzEzID0gMHgwMDsKLSAgICAgIGJhY2tsaWdodCA9IFRSVUU7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoJLyogbm8gdnN5bmMgKi8KLSAgICAgIHNyMDEgID0gMHgyMDsKLSAgICAgIHNyMTEgID0gMHgwODsKLSAgICAgIHNyMWYgID0gMHg4MDsKLSAgICAgIGNyNjMgID0gMHg0MDsKLSAgICAgIHAyXzAgID0gMHg0MDsKLSAgICAgIHAxXzEzID0gMHg4MDsKLSAgICAgIGJhY2tsaWdodCA9IEZBTFNFOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6CS8qIG5vIGhzeW5jICovCi0gICAgICBzcjAxICA9IDB4MjA7Ci0gICAgICBzcjExICA9IDB4MDg7Ci0gICAgICBzcjFmICA9IDB4NDA7Ci0gICAgICBjcjYzICA9IDB4NDA7Ci0gICAgICBwMl8wICA9IDB4ODA7Ci0gICAgICBwMV8xMyA9IDB4NDA7Ci0gICAgICBiYWNrbGlnaHQgPSBGQUxTRTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBGQl9CTEFOS19QT1dFUkRPV046CS8qIG9mZiAqLwotICAgICAgc3IwMSAgPSAweDIwOwotICAgICAgc3IxMSAgPSAweDA4OwotICAgICAgc3IxZiAgPSAweGMwOwotICAgICAgY3I2MyAgPSAweDQwOwotICAgICAgcDJfMCAgPSAweGMwOwotICAgICAgcDFfMTMgPSAweGMwOwotICAgICAgYmFja2xpZ2h0ID0gRkFMU0U7Ci0gICAgICBicmVhazsKLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KKwlzd2l0Y2goYmxhbmspIHsKKwkJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgkvKiBvbiAqLworCQkJc3IwMSAgPSAweDAwOworCQkJc3IxMSAgPSAweDAwOworCQkJc3IxZiAgPSAweDAwOworCQkJY3I2MyAgPSAweDAwOworCQkJcDJfMCAgPSAweDIwOworCQkJcDFfMTMgPSAweDAwOworCQkJYmFja2xpZ2h0ID0gVFJVRTsKKwkJCWJyZWFrOworCQljYXNlIEZCX0JMQU5LX05PUk1BTDoJLyogYmxhbmsgKi8KKwkJCXNyMDEgID0gMHgyMDsKKwkJCXNyMTEgID0gMHgwMDsKKwkJCXNyMWYgID0gMHgwMDsKKwkJCWNyNjMgID0gMHgwMDsKKwkJCXAyXzAgID0gMHgyMDsKKwkJCXAxXzEzID0gMHgwMDsKKwkJCWJhY2tsaWdodCA9IFRSVUU7CisJCQlicmVhazsKKwkJY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOgkvKiBubyB2c3luYyAqLworCQkJc3IwMSAgPSAweDIwOworCQkJc3IxMSAgPSAweDA4OworCQkJc3IxZiAgPSAweDgwOworCQkJY3I2MyAgPSAweDQwOworCQkJcDJfMCAgPSAweDQwOworCQkJcDFfMTMgPSAweDgwOworCQkJYmFja2xpZ2h0ID0gRkFMU0U7CisJCQlicmVhazsKKwkJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgkvKiBubyBoc3luYyAqLworCQkJc3IwMSAgPSAweDIwOworCQkJc3IxMSAgPSAweDA4OworCQkJc3IxZiAgPSAweDQwOworCQkJY3I2MyAgPSAweDQwOworCQkJcDJfMCAgPSAweDgwOworCQkJcDFfMTMgPSAweDQwOworCQkJYmFja2xpZ2h0ID0gRkFMU0U7CisJCQlicmVhazsKKwkJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046CS8qIG9mZiAqLworCQkJc3IwMSAgPSAweDIwOworCQkJc3IxMSAgPSAweDA4OworCQkJc3IxZiAgPSAweGMwOworCQkJY3I2MyAgPSAweDQwOworCQkJcDJfMCAgPSAweGMwOworCQkJcDFfMTMgPSAweGMwOworCQkJYmFja2xpZ2h0ID0gRkFMU0U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAxOworCX0KIAotICAgaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0NSVDEpIHsKKwlpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgVkJfRElTUFRZUEVfQ1JUMSkgewogCi0gICAgICBpZiggKCFpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLmRhdGF2YWxpZCkgfHwKLSAgICAgICAgICAoKGl2aWRlby0+c2lzZmJfdGhpc21vbml0b3IuZGF0YXZhbGlkKSAmJgotICAgICAgICAgICAoaXZpZGVvLT5zaXNmYl90aGlzbW9uaXRvci5mZWF0dXJlICYgMHhlMCkpKSB7CisJCWlmKCAoIWl2aWRlby0+c2lzZmJfdGhpc21vbml0b3IuZGF0YXZhbGlkKSB8fAorCQkgICAgKChpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLmRhdGF2YWxpZCkgJiYKKwkJICAgICAoaXZpZGVvLT5zaXNmYl90aGlzbW9uaXRvci5mZWF0dXJlICYgMHhlMCkpKSB7CiAKLQkgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgIHNldFNJU0lEWFJFRyhTSVNDUiwgaXZpZGVvLT5TaVNfUHIuU2lTX015Q1I2MywgMHhiZiwgY3I2Myk7Ci0JIH0KKwkJCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQkJCXNldFNJU0lEWFJFRyhTSVNDUiwgaXZpZGVvLT5TaVNfUHIuU2lTX015Q1I2MywgMHhiZiwgY3I2Myk7CisJCQl9CiAKLQkgaWYoIShzaXNmYl9icmlkZ2Vpc3NsYXZlKGl2aWRlbykpKSB7Ci0JICAgIHNldFNJU0lEWFJFRyhTSVNTUiwgMHgwMSwgfjB4MjAsIHNyMDEpOwotCSAgICBzZXRTSVNJRFhSRUcoU0lTU1IsIDB4MWYsIDB4M2YsIHNyMWYpOwotCSB9Ci0gICAgICB9CisJCQlpZighKHNpc2ZiX2JyaWRnZWlzc2xhdmUoaXZpZGVvKSkpIHsKKwkJCQlzZXRTSVNJRFhSRUcoU0lTU1IsIDB4MDEsIH4weDIwLCBzcjAxKTsKKwkJCQlzZXRTSVNJRFhSRUcoU0lTU1IsIDB4MWYsIDB4M2YsIHNyMWYpOworCQkJfQorCQl9CiAKLSAgIH0KKwl9CiAKLSAgIGlmKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBDUlQyX0xDRCkgeworCWlmKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBDUlQyX0xDRCkgewogCi0gICAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiAoVkJfMzAxTFZ8VkJfMzAyTFZ8VkJfMzAyRUxWKSkgewotCSBpZihiYWNrbGlnaHQpIHsKLQkgICAgU2lTX1NpUzMweEJMT24oJml2aWRlby0+U2lTX1ByLCAmaXZpZGVvLT5zaXNod19leHQpOwotCSB9IGVsc2UgewotCSAgICBTaVNfU2lTMzB4QkxPZmYoJml2aWRlby0+U2lTX1ByLCAmaXZpZGVvLT5zaXNod19leHQpOwotCSB9Ci0gICAgICB9IGVsc2UgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JIGlmKGl2aWRlby0+dmJmbGFncyAmIFZCX0NIUk9OVEVMKSB7Ci0JICAgIGlmKGJhY2tsaWdodCkgewotCSAgICAgICBTaVNfQ2hyb250ZWw3MDF4QkxPbigmaXZpZGVvLT5TaVNfUHIsJml2aWRlby0+c2lzaHdfZXh0KTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgU2lTX0Nocm9udGVsNzAxeEJMT2ZmKCZpdmlkZW8tPlNpU19Qcik7Ci0JICAgIH0KLQkgfQotICAgICAgfQorCQlpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU0xWRFNCUklER0UpIHsKKwkJCWlmKGJhY2tsaWdodCkgeworCQkJCVNpU19TaVMzMHhCTE9uKCZpdmlkZW8tPlNpU19Qcik7CisJCQl9IGVsc2UgeworCQkJCVNpU19TaVMzMHhCTE9mZigmaXZpZGVvLT5TaVNfUHIpOworCQkJfQorCQl9IGVsc2UgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7CisjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKKwkJCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfQ0hST05URUwpIHsKKwkJCQlpZihiYWNrbGlnaHQpIHsKKwkJCQkJU2lTX0Nocm9udGVsNzAxeEJMT24oJml2aWRlby0+U2lTX1ByKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTaVNfQ2hyb250ZWw3MDF4QkxPZmYoJml2aWRlby0+U2lTX1ByKTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJfQogCi0gICAgICBpZigoKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgJiYKLSAgICAgICAgICAoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMXxWQl8zMHhCREh8VkJfTFZEUykpKSB8fAotICAgICAgICAgKChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpICYmCi0gICAgICAgICAgKChpdmlkZW8tPnZiZmxhZ3MgJiAoVkJfTFZEUyB8IFZCX0NIUk9OVEVMKSkgPT0gVkJfTFZEUykpKSB7Ci0gICAgICAgICAgc2V0U0lTSURYUkVHKFNJU1NSLCAweDExLCB+MHgwYywgc3IxMSk7Ci0gICAgICB9CisJCWlmKCgoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSAmJgorCQkgICAgKGl2aWRlby0+dmJmbGFnczIgJiAoVkIyXzMwMXxWQjJfMzB4QkRIfFZCMl9MVkRTKSkpIHx8CisJCSAgICgoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSAmJgorCQkgICAgKChpdmlkZW8tPnZiZmxhZ3MyICYgKFZCMl9MVkRTIHwgVkIyX0NIUk9OVEVMKSkgPT0gVkIyX0xWRFMpKSkgeworCQkJc2V0U0lTSURYUkVHKFNJU1NSLCAweDExLCB+MHgwYywgc3IxMSk7CisJCX0KIAotICAgICAgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0gICAgICAgICBpZigoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUJ8VkJfMzAxQ3xWQl8zMDJCKSkgJiYKLSAgICAgICAgICAgICghKGl2aWRlby0+dmJmbGFncyAmIFZCXzMweEJESCkpKSB7Ci0JICAgIHNldFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgxMywgMHgzZiwgcDFfMTMpOwotCSB9Ci0gICAgICB9IGVsc2UgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0gICAgICAgICBpZigoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUJ8VkJfMzAxQ3xWQl8zMDJCKSkgJiYKLSAgICAgICAgICAgICghKGl2aWRlby0+dmJmbGFncyAmIFZCXzMweEJESCkpKSB7Ci0JICAgIHNldFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgwMCwgMHgxZiwgcDJfMCk7Ci0JIH0KLSAgICAgIH0KKwkJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7CisJCQlpZigoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhCKSAmJgorCQkJICAgKCEoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhCREgpKSkgeworCQkJCXNldFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgxMywgMHgzZiwgcDFfMTMpOworCQkJfQorCQl9IGVsc2UgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7CisJCQlpZigoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhCKSAmJgorCQkJICAgKCEoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhCREgpKSkgeworCQkJCXNldFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgwMCwgMHgxZiwgcDJfMCk7CisJCQl9CisJCX0KIAotICAgfSBlbHNlIGlmKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBDUlQyX1ZHQSkgeworCX0gZWxzZSBpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgQ1JUMl9WR0EpIHsKIAotICAgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUJ8VkJfMzAxQ3xWQl8zMDJCKSkgewotICAgICAgICAgc2V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDAwLCAweDFmLCBwMl8wKTsKLSAgICAgIH0KKwkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhCKSB7CisJCQlzZXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MDAsIDB4MWYsIHAyXzApOworCQl9CiAKLSAgIH0KKwl9CiAKLSAgIHJldHVybigwKTsKKwlyZXR1cm4gMDsKIH0KIAorLyogLS0tLS0tLS0tLS0tLSBDYWxsYmFja3MgZnJvbSBpbml0LmMvaW5pdDMwMS5jICAtLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKK3Vuc2lnbmVkIGludAorc2lzZmJfcmVhZF9uYnJpZGdlX3BjaV9kd29yZChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IHJlZykKK3sKKyAgIHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKVNpU19Qci0+aXZpZGVvOworICAgdTMyIHZhbCA9IDA7CisKKyAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChpdmlkZW8tPm5icmlkZ2UsIHJlZywgJnZhbCk7CisgICByZXR1cm4gKHVuc2lnbmVkIGludCl2YWw7Cit9CisKK3ZvaWQKK3Npc2ZiX3dyaXRlX25icmlkZ2VfcGNpX2R3b3JkKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworICAgc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopU2lTX1ByLT5pdmlkZW87CisKKyAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoaXZpZGVvLT5uYnJpZGdlLCByZWcsICh1MzIpdmFsKTsKK30KKwordW5zaWduZWQgaW50CitzaXNmYl9yZWFkX2xwY19wY2lfZHdvcmQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcpCit7CisgICBzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilTaVNfUHItPml2aWRlbzsKKyAgIHUzMiB2YWwgPSAwOworCisgICBpZighaXZpZGVvLT5scGNkZXYpIHJldHVybiAwOworCisgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoaXZpZGVvLT5scGNkZXYsIHJlZywgJnZhbCk7CisgICByZXR1cm4gKHVuc2lnbmVkIGludCl2YWw7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Cit2b2lkCitzaXNmYl93cml0ZV9uYnJpZGdlX3BjaV9ieXRlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKyAgIHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKVNpU19Qci0+aXZpZGVvOworCisgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXZpZGVvLT5uYnJpZGdlLCByZWcsICh1OCl2YWwpOworfQorCit1bnNpZ25lZCBpbnQKK3Npc2ZiX3JlYWRfbWlvX3BjaV93b3JkKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgcmVnKQoreworICAgc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopU2lTX1ByLT5pdmlkZW87CisgICB1MTYgdmFsID0gMDsKKworICAgaWYoIWl2aWRlby0+bHBjZGV2KSByZXR1cm4gMDsKKworICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoaXZpZGVvLT5scGNkZXYsIHJlZywgJnZhbCk7CisgICByZXR1cm4gKHVuc2lnbmVkIGludCl2YWw7Cit9CisjZW5kaWYKKwogLyogLS0tLS0tLS0tLS0gRkJEZXYgcmVsYXRlZCByb3V0aW5lcyBmb3IgYWxsIHNlcmllcyAtLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgaW50CkBAIC05NTIsNyArMTEwNSw3IEBACiBzdGF0aWMgdm9pZAogc2lzZmJfc2V0X3ZwYXJtcyhzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKLSAgIAlzd2l0Y2goaXZpZGVvLT52aWRlb19icHApIHsKKwlzd2l0Y2goaXZpZGVvLT52aWRlb19icHApIHsKIAljYXNlIDg6CiAJCWl2aWRlby0+RHN0Q29sb3IgPSAweDAwMDA7CiAJCWl2aWRlby0+U2lTMzEwX0FjY2VsRGVwdGggPSAweDAwMDAwMDAwOwpAQCAtOTcyLDE0ICsxMTI1LDEzIEBACiAJCWl2aWRlby0+dmlkZW9fY21hcF9sZW4gPSAxNjsKIAkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogVW5zdXBwb3J0ZWQgZGVwdGggJWQiLCBpdmlkZW8tPnZpZGVvX2JwcCk7CiAJCWl2aWRlby0+YWNjZWwgPSAwOwotCQlicmVhazsKLSAgIAl9CisJfQogfQogCiBzdGF0aWMgaW50CiBzaXNmYl9jYWxjX21heHlyZXMoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewotCWludCBtYXh5cmVzID0gaXZpZGVvLT5oZWFwc3RhcnQgLyAodmFyLT54cmVzX3ZpcnR1YWwgKiAodmFyLT5iaXRzX3Blcl9waXhlbCA+PiAzKSk7CisJaW50IG1heHlyZXMgPSBpdmlkZW8tPnNpc2ZiX21lbSAvICh2YXItPnhyZXNfdmlydHVhbCAqICh2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpKTsKIAogCWlmKG1heHlyZXMgPiAzMjc2NykgbWF4eXJlcyA9IDMyNzY3OwogCkBAIC05OTYsMzAgKzExNDgsMjkgQEAKIAkJCWl2aWRlby0+c2NybnBpdGNoQ1JUMSA8PD0gMTsKIAkJfQogCX0KLQogfQogCiBzdGF0aWMgdm9pZAogc2lzZmJfc2V0X3BpdGNoKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewotICAgCUJPT0xFQU4gaXNzbGF2ZW1vZGUgPSBGQUxTRTsKKwlCT09MRUFOIGlzc2xhdmVtb2RlID0gRkFMU0U7CiAJdW5zaWduZWQgc2hvcnQgSERpc3BsYXkxID0gaXZpZGVvLT5zY3JucGl0Y2hDUlQxID4+IDM7CiAJdW5zaWduZWQgc2hvcnQgSERpc3BsYXkyID0gaXZpZGVvLT52aWRlb19saW5lbGVuZ3RoID4+IDM7CiAKLSAgIAlpZihzaXNmYl9icmlkZ2Vpc3NsYXZlKGl2aWRlbykpIGlzc2xhdmVtb2RlID0gVFJVRTsKKwlpZihzaXNmYl9icmlkZ2Vpc3NsYXZlKGl2aWRlbykpIGlzc2xhdmVtb2RlID0gVFJVRTsKIAotICAgCS8qIFdlIG5lZWQgdG8gc2V0IHBpdGNoIGZvciBDUlQxIGlmIGJyaWRnZSBpcyBpbiBzbGF2ZSBtb2RlLCB0b28gKi8KLSAgIAlpZigoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AxKSB8fCAoaXNzbGF2ZW1vZGUpKSB7Ci0gICAJCW91dFNJU0lEWFJFRyhTSVNDUiwweDEzLChIRGlzcGxheTEgJiAweEZGKSk7Ci0gICAJCXNldFNJU0lEWFJFRyhTSVNTUiwweDBFLDB4RjAsKEhEaXNwbGF5MSA+PiA4KSk7CisJLyogV2UgbmVlZCB0byBzZXQgcGl0Y2ggZm9yIENSVDEgaWYgYnJpZGdlIGlzIGluIHNsYXZlIG1vZGUsIHRvbyAqLworCWlmKChpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgVkJfRElTUFRZUEVfRElTUDEpIHx8IChpc3NsYXZlbW9kZSkpIHsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLDB4MTMsKEhEaXNwbGF5MSAmIDB4RkYpKTsKKwkJc2V0U0lTSURYUkVHKFNJU1NSLDB4MEUsMHhGMCwoSERpc3BsYXkxID4+IDgpKTsKIAl9CiAKLSAgIAkvKiBXZSBtdXN0IG5vdCBzZXQgdGhlIHBpdGNoIGZvciBDUlQyIGlmIGJyaWRnZSBpcyBpbiBzbGF2ZSBtb2RlICovCi0gICAJaWYoKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBWQl9ESVNQVFlQRV9ESVNQMikgJiYgKCFpc3NsYXZlbW9kZSkpIHsKKwkvKiBXZSBtdXN0IG5vdCBzZXQgdGhlIHBpdGNoIGZvciBDUlQyIGlmIGJyaWRnZSBpcyBpbiBzbGF2ZSBtb2RlICovCisJaWYoKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBWQl9ESVNQVFlQRV9ESVNQMikgJiYgKCFpc3NsYXZlbW9kZSkpIHsKIAkJb3JTSVNJRFhSRUcoU0lTUEFSVDEsaXZpZGVvLT5DUlQyX3dyaXRlX2VuYWJsZSwweDAxKTsKLSAgIAkJb3V0U0lTSURYUkVHKFNJU1BBUlQxLDB4MDcsKEhEaXNwbGF5MiAmIDB4RkYpKTsKLSAgIAkJc2V0U0lTSURYUkVHKFNJU1BBUlQxLDB4MDksMHhGMCwoSERpc3BsYXkyID4+IDgpKTsKLSAgIAl9CisJCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwweDA3LChIRGlzcGxheTIgJiAweEZGKSk7CisJCXNldFNJU0lEWFJFRyhTSVNQQVJUMSwweDA5LDB4RjAsKEhEaXNwbGF5MiA+PiA4KSk7CisJfQogfQogCiBzdGF0aWMgdm9pZApAQCAtMTA1NiwxMiArMTIwNyw0MSBAQAogfQogCiBzdGF0aWMgaW50CitzaXNmYl9zZXRfbW9kZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IGNscnNjcm4pCit7CisJdW5zaWduZWQgc2hvcnQgbW9kZW5vID0gaXZpZGVvLT5tb2RlX25vOworCisJLyogPj0yLjYuMTIncyBmYmNvbiBjbGVhcnMgdGhlIHNjcmVlbiBhbnl3YXkgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTIpCisJaWYoIWNscnNjcm4pIG1vZGVubyB8PSAweDgwOworI2Vsc2UKKwltb2Rlbm8gfD0gMHg4MDsKKyNlbmRpZgorCisJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1BBU1NXT1JELCBTSVNfUEFTU1dPUkQpOworCisJc2lzZmJfcHJlX3NldG1vZGUoaXZpZGVvKTsKKworCWlmKFNpU1NldE1vZGUoJml2aWRlby0+U2lTX1ByLCBtb2Rlbm8pID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogU2V0dGluZyBtb2RlWzB4JXhdIGZhaWxlZFxuIiwgaXZpZGVvLT5tb2RlX25vKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1BBU1NXT1JELCBTSVNfUEFTU1dPUkQpOworCisJc2lzZmJfcG9zdF9zZXRtb2RlKGl2aWRlbyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CiBzaXNmYl9kb19zZXRfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgaXNhY3RpdmUsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKIAl1bnNpZ25lZCBpbnQgaHRvdGFsID0gMCwgdnRvdGFsID0gMDsKIAl1bnNpZ25lZCBpbnQgZHJhdGUgPSAwLCBocmF0ZSA9IDA7Ci0JaW50IGZvdW5kX21vZGUgPSAwOworCWludCBmb3VuZF9tb2RlID0gMCwgcmV0OwogCWludCBvbGRfbW9kZTsKIAl1MzIgcGl4Y2xvY2s7CiAKQEAgLTEwODgsMTEgKzEyNjgsMTEgQEAKIAl9CiAKIAlpZihwaXhjbG9jayAmJiBodG90YWwgJiYgdnRvdGFsKSB7Ci0JICAgCWRyYXRlID0gMTAwMDAwMDAwMCAvIHBpeGNsb2NrOwotCSAgIAlocmF0ZSA9IChkcmF0ZSAqIDEwMDApIC8gaHRvdGFsOwotCSAgIAlpdmlkZW8tPnJlZnJlc2hfcmF0ZSA9ICh1bnNpZ25lZCBpbnQpIChocmF0ZSAqIDIgLyB2dG90YWwpOworCQlkcmF0ZSA9IDEwMDAwMDAwMDAgLyBwaXhjbG9jazsKKwkJaHJhdGUgPSAoZHJhdGUgKiAxMDAwKSAvIGh0b3RhbDsKKwkJaXZpZGVvLT5yZWZyZXNoX3JhdGUgPSAodW5zaWduZWQgaW50KSAoaHJhdGUgKiAyIC8gdnRvdGFsKTsKIAl9IGVsc2UgewotCSAgIAlpdmlkZW8tPnJlZnJlc2hfcmF0ZSA9IDYwOworCQlpdmlkZW8tPnJlZnJlc2hfcmF0ZSA9IDYwOwogCX0KIAogCW9sZF9tb2RlID0gaXZpZGVvLT5zaXNmYl9tb2RlX2lkeDsKQEAgLTExMTMsNiArMTI5Myw3IEBACiAJaWYoZm91bmRfbW9kZSkgewogCQlpdmlkZW8tPnNpc2ZiX21vZGVfaWR4ID0gc2lzZmJfdmFsaWRhdGVfbW9kZShpdmlkZW8sCiAJCQkJaXZpZGVvLT5zaXNmYl9tb2RlX2lkeCwgaXZpZGVvLT5jdXJyZW50dmJmbGFncyk7CisJCWl2aWRlby0+bW9kZV9ubyA9IHNpc2Jpb3NfbW9kZVtpdmlkZW8tPnNpc2ZiX21vZGVfaWR4XS5tb2RlX25vW2l2aWRlby0+bW5pXTsKIAl9IGVsc2UgewogCQlpdmlkZW8tPnNpc2ZiX21vZGVfaWR4ID0gLTE7CiAJfQpAQCAtMTEzMSwxMCArMTMxMiwxMCBAQAogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJaWYoaXZpZGVvLT5zaXNmYl90aGlzbW9uaXRvci5kYXRhdmFsaWQpIHsKLQkgICBpZighc2lzZmJfdmVyaWZ5X3JhdGUoaXZpZGVvLCAmaXZpZGVvLT5zaXNmYl90aGlzbW9uaXRvciwgaXZpZGVvLT5zaXNmYl9tb2RlX2lkeCwKKwkJaWYoIXNpc2ZiX3ZlcmlmeV9yYXRlKGl2aWRlbywgJml2aWRlby0+c2lzZmJfdGhpc21vbml0b3IsIGl2aWRlby0+c2lzZmJfbW9kZV9pZHgsCiAJICAgICAgICAgICAgICAgICAgICAgICAgIGl2aWRlby0+cmF0ZV9pZHgsIGl2aWRlby0+cmVmcmVzaF9yYXRlKSkgewotCSAgICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBXQVJOSU5HOiBSZWZyZXNoIHJhdGUgZXhjZWVkcyBtb25pdG9yIHNwZWNzIVxuIik7Ci0JICAgfQorCQkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFdBUk5JTkc6IFJlZnJlc2ggcmF0ZSBleGNlZWRzIG1vbml0b3Igc3BlY3MhXG4iKTsKKwkJfQogCX0KICNlbmRpZgogCkBAIC0xMTQzLDI0ICsxMzI0LDkgQEAKICNlbHNlCiAJaWYoaXNhY3RpdmUpIHsKICNlbmRpZgotCQlzaXNmYl9wcmVfc2V0bW9kZShpdmlkZW8pOwotCi0JCWlmKFNpU1NldE1vZGUoJml2aWRlby0+U2lTX1ByLCAmaXZpZGVvLT5zaXNod19leHQsIGl2aWRlby0+bW9kZV9ubykgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogU2V0dGluZyBtb2RlWzB4JXhdIGZhaWxlZFxuIiwgaXZpZGVvLT5tb2RlX25vKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1BBU1NXT1JELCBTSVNfUEFTU1dPUkQpOwotCi0JCXNpc2ZiX3Bvc3Rfc2V0bW9kZShpdmlkZW8pOwotCi0JCWl2aWRlby0+dmlkZW9fYnBwICAgID0gc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLmJwcDsKLQkJaXZpZGVvLT52aWRlb193aWR0aCAgPSBzaXNiaW9zX21vZGVbaXZpZGVvLT5zaXNmYl9tb2RlX2lkeF0ueHJlczsKLQkJaXZpZGVvLT52aWRlb19oZWlnaHQgPSBzaXNiaW9zX21vZGVbaXZpZGVvLT5zaXNmYl9tb2RlX2lkeF0ueXJlczsKLQotCQlzaXNmYl9jYWxjX3BpdGNoKGl2aWRlbywgdmFyKTsKLQkJc2lzZmJfc2V0X3BpdGNoKGl2aWRlbyk7Ci0KKwkJLyogSWYgYWNjZWxlcmF0aW9uIHRvIGJlIHVzZWQ/IE5lZWQgdG8ga25vdworCQkgKiBiZWZvcmUgcHJlL3Bvc3Rfc2V0X21vZGUoKQorCQkgKi8KIAkJaXZpZGVvLT5hY2NlbCA9IDA7CiAjaWYgZGVmaW5lZChGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgJiYgZGVmaW5lZChGQklORk9fSFdBQ0NFTF9YUEFOKQogI2lmZGVmIFNUVVBJRF9BQ0NFTEZfVEVYVF9TSElUCkBAIC0xMTc1LDYgKzEzNDEsMTcgQEAKIAkJaWYodmFyLT5hY2NlbF9mbGFncyAmIEZCX0FDQ0VMRl9URVhUKSBpdmlkZW8tPmFjY2VsID0gLTE7CiAjZW5kaWYKIAorCQlpZigocmV0ID0gc2lzZmJfc2V0X21vZGUoaXZpZGVvLCAxKSkpIHsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpdmlkZW8tPnZpZGVvX2JwcCAgICA9IHNpc2Jpb3NfbW9kZVtpdmlkZW8tPnNpc2ZiX21vZGVfaWR4XS5icHA7CisJCWl2aWRlby0+dmlkZW9fd2lkdGggID0gc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLnhyZXM7CisJCWl2aWRlby0+dmlkZW9faGVpZ2h0ID0gc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLnlyZXM7CisKKwkJc2lzZmJfY2FsY19waXRjaChpdmlkZW8sIHZhcik7CisJCXNpc2ZiX3NldF9waXRjaChpdmlkZW8pOworCiAJCXNpc2ZiX3NldF92cGFybXMoaXZpZGVvKTsKIAogCQlpdmlkZW8tPmN1cnJlbnRfd2lkdGggPSBpdmlkZW8tPnZpZGVvX3dpZHRoOwpAQCAtMTE4NiwxOCArMTM2Myw0MyBAQAogCQlpdmlkZW8tPmN1cnJlbnRfcGl4Y2xvY2sgPSB2YXItPnBpeGNsb2NrOwogCQlpdmlkZW8tPmN1cnJlbnRfcmVmcmVzaF9yYXRlID0gaXZpZGVvLT5yZWZyZXNoX3JhdGU7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotICAgICAgICAgICAgICAgIGl2aWRlby0+c2lzZmJfbGFzdHJhdGVzW2l2aWRlby0+bW9kZV9ub10gPSBpdmlkZW8tPnJlZnJlc2hfcmF0ZTsKKwkJaXZpZGVvLT5zaXNmYl9sYXN0cmF0ZXNbaXZpZGVvLT5tb2RlX25vXSA9IGl2aWRlby0+cmVmcmVzaF9yYXRlOwogI2VuZGlmCiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkCitzaXNmYl9zZXRfYmFzZV9DUlQxKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCB1bnNpZ25lZCBpbnQgYmFzZSkKK3sKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfUEFTU1dPUkQsIFNJU19QQVNTV09SRCk7CisKKwlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4MEQsIGJhc2UgJiAweEZGKTsKKwlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4MEMsIChiYXNlID4+IDgpICYgMHhGRik7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDBELCAoYmFzZSA+PiAxNikgJiAweEZGKTsKKwlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJc2V0U0lTSURYUkVHKFNJU1NSLCAweDM3LCAweEZFLCAoYmFzZSA+PiAyNCkgJiAweDAxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzaXNmYl9zZXRfYmFzZV9DUlQyKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCB1bnNpZ25lZCBpbnQgYmFzZSkKK3sKKwlpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgVkJfRElTUFRZUEVfRElTUDIpIHsKKwkJb3JTSVNJRFhSRUcoU0lTUEFSVDEsIGl2aWRlby0+Q1JUMl93cml0ZV9lbmFibGUsIDB4MDEpOworCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDEsIDB4MDYsIChiYXNlICYgMHhGRikpOworCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDEsIDB4MDUsICgoYmFzZSA+PiA4KSAmIDB4RkYpKTsKKwkJb3V0U0lTSURYUkVHKFNJU1BBUlQxLCAweDA0LCAoKGJhc2UgPj4gMTYpICYgMHhGRikpOworCQlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJCXNldFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgwMiwgMHg3RiwgKChiYXNlID4+IDI0KSAmIDB4MDEpIDw8IDcpOworCQl9CisJfQorfQorCiBzdGF0aWMgaW50CiBzaXNmYl9wYW5fdmFyKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKIHsKLQl1bnNpZ25lZCBpbnQgYmFzZTsKLQogCWlmKHZhci0+eG9mZnNldCA+ICh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTIwNSwzOCArMTQwNywyNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQliYXNlID0gKHZhci0+eW9mZnNldCAqIHZhci0+eHJlc192aXJ0dWFsKSArIHZhci0+eG9mZnNldDsKKwlpdmlkZW8tPmN1cnJlbnRfYmFzZSA9ICh2YXItPnlvZmZzZXQgKiB2YXItPnhyZXNfdmlydHVhbCkgKyB2YXItPnhvZmZzZXQ7CiAKLSAgICAgICAgLyogY2FsY3VsYXRlIGJhc2UgYnBwIGRlcC4gKi8KLSAgICAgICAgc3dpdGNoKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKKwkvKiBjYWxjdWxhdGUgYmFzZSBicHAgZGVwLiAqLworCXN3aXRjaCh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSAzMjoKLSAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgCWJhc2UgPj49IDE7Ci0gICAgICAgIAlicmVhazsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJaXZpZGVvLT5jdXJyZW50X2Jhc2UgPj49IDE7CisJCWJyZWFrOwogCWNhc2UgODoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgCWJhc2UgPj49IDI7Ci0gICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgIH0KLQkKLQlvdXRTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfUEFTU1dPUkQsIFNJU19QQVNTV09SRCk7Ci0KLSAgICAgICAgb3V0U0lTSURYUkVHKFNJU0NSLCAweDBELCBiYXNlICYgMHhGRik7Ci0Jb3V0U0lTSURYUkVHKFNJU0NSLCAweDBDLCAoYmFzZSA+PiA4KSAmIDB4RkYpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgwRCwgKGJhc2UgPj4gMTYpICYgMHhGRik7Ci0JaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JCXNldFNJU0lEWFJFRyhTSVNTUiwgMHgzNywgMHhGRSwgKGJhc2UgPj4gMjQpICYgMHgwMSk7CisJZGVmYXVsdDoKKwkJaXZpZGVvLT5jdXJyZW50X2Jhc2UgPj49IDI7CisJCWJyZWFrOwogCX0KLSAgICAgICAgaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AyKSB7Ci0JCW9yU0lTSURYUkVHKFNJU1BBUlQxLCBpdmlkZW8tPkNSVDJfd3JpdGVfZW5hYmxlLCAweDAxKTsKLSAgICAgICAgCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgwNiwgKGJhc2UgJiAweEZGKSk7Ci0gICAgICAgIAlvdXRTSVNJRFhSRUcoU0lTUEFSVDEsIDB4MDUsICgoYmFzZSA+PiA4KSAmIDB4RkYpKTsKLSAgICAgICAgCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgwNCwgKChiYXNlID4+IDE2KSAmIDB4RkYpKTsKLQkJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JCQlzZXRTSVNJRFhSRUcoU0lTUEFSVDEsIDB4MDIsIDB4N0YsICgoYmFzZSA+PiAyNCkgJiAweDAxKSA8PCA3KTsKLQkJfQotICAgICAgICB9CisKKwlpdmlkZW8tPmN1cnJlbnRfYmFzZSArPSAoaXZpZGVvLT52aWRlb19vZmZzZXQgPj4gMik7CisKKwlzaXNmYl9zZXRfYmFzZV9DUlQxKGl2aWRlbywgaXZpZGVvLT5jdXJyZW50X2Jhc2UpOworCXNpc2ZiX3NldF9iYXNlX0NSVDIoaXZpZGVvLCBpdmlkZW8tPmN1cnJlbnRfYmFzZSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI0NCw1MTQgKzE0MzQsOCBAQAogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAKLXN0YXRpYyB2b2lkCi1zaXNmYl9jcnRjX3RvX3ZhcihzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCi17Ci0JdTE2IFZSRSwgVkJFLCBWUlMsIFZCUywgVkRFLCBWVDsKLQl1MTYgSFJFLCBIQkUsIEhSUywgSEJTLCBIREUsIEhUOwotCXU4ICBzcl9kYXRhLCBjcl9kYXRhLCBjcl9kYXRhMiwgY3JfZGF0YTMsIG1yX2RhdGE7Ci0JaW50IEEsIEIsIEMsIEQsIEUsIEYsIHRlbXA7Ci0JdW5zaWduZWQgaW50IGhyYXRlLCBkcmF0ZSwgbWF4eXJlczsKLQotCWluU0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX0NPTE9SX01PREUsIHNyX2RhdGEpOwotCi0JaWYoc3JfZGF0YSAmIFNJU19JTlRFUkxBQ0VEX01PREUpCi0JICAgdmFyLT52bW9kZSA9IEZCX1ZNT0RFX0lOVEVSTEFDRUQ7Ci0JZWxzZQotCSAgIHZhci0+dm1vZGUgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOwotCi0Jc3dpdGNoKChzcl9kYXRhICYgMHgxQykgPj4gMikgewotCWNhc2UgU0lTXzhCUFBfQ09MT1JfTU9ERToKLQkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDg7Ci0JCWJyZWFrOwotCWNhc2UgU0lTXzE2QlBQX0NPTE9SX01PREU6Ci0JCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKLQkJYnJlYWs7Ci0JY2FzZSBTSVNfMzJCUFBfQ09MT1JfTU9ERToKLQkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDMyOwotCQlicmVhazsKLQl9Ci0KLQlzaXNmYl9icHBfdG9fdmFyKGl2aWRlbywgdmFyKTsKLQkKLQlpblNJU0lEWFJFRyhTSVNTUiwgMHgwQSwgc3JfZGF0YSk7Ci0gICAgICAgIGluU0lTSURYUkVHKFNJU0NSLCAweDA2LCBjcl9kYXRhKTsKLSAgICAgICAgaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDcsIGNyX2RhdGEyKTsKLQotCVZUID0gKGNyX2RhdGEgJiAweEZGKSB8Ci0JICAgICAoKHUxNikgKGNyX2RhdGEyICYgMHgwMSkgPDwgOCkgfAotCSAgICAgKCh1MTYpIChjcl9kYXRhMiAmIDB4MjApIDw8IDQpIHwKLQkgICAgICgodTE2KSAoc3JfZGF0YSAgJiAweDAxKSA8PCAxMCk7Ci0JQSA9IFZUICsgMjsKLQotCWluU0lTSURYUkVHKFNJU0NSLCAweDEyLCBjcl9kYXRhKTsKLQotCVZERSA9IChjcl9kYXRhICYgMHhmZikgfAotCSAgICAgICgodTE2KSAoY3JfZGF0YTIgJiAweDAyKSA8PCA3KSB8Ci0JICAgICAgKCh1MTYpIChjcl9kYXRhMiAmIDB4NDApIDw8IDMpIHwKLQkgICAgICAoKHUxNikgKHNyX2RhdGEgICYgMHgwMikgPDwgOSk7Ci0JRSA9IFZERSArIDE7Ci0KLQlpblNJU0lEWFJFRyhTSVNDUiwgMHgxMCwgY3JfZGF0YSk7Ci0KLQlWUlMgPSAoY3JfZGF0YSAmIDB4ZmYpIHwKLQkgICAgICAoKHUxNikgKGNyX2RhdGEyICYgMHgwNCkgPDwgNikgfAotCSAgICAgICgodTE2KSAoY3JfZGF0YTIgJiAweDgwKSA8PCAyKSB8Ci0JICAgICAgKCh1MTYpIChzcl9kYXRhICAmIDB4MDgpIDw8IDcpOwotCUYgPSBWUlMgKyAxIC0gRTsKLQotCWluU0lTSURYUkVHKFNJU0NSLCAweDE1LCBjcl9kYXRhKTsKLQlpblNJU0lEWFJFRyhTSVNDUiwgMHgwOSwgY3JfZGF0YTMpOwotCi0JaWYoY3JfZGF0YTMgJiAweDgwKSB2YXItPnZtb2RlID0gRkJfVk1PREVfRE9VQkxFOwotCi0JVkJTID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0JICAgICAgKCh1MTYpIChjcl9kYXRhMiAmIDB4MDgpIDw8IDUpIHwKLQkgICAgICAoKHUxNikgKGNyX2RhdGEzICYgMHgyMCkgPDwgNCkgfAotCSAgICAgICgodTE2KSAoc3JfZGF0YSAmIDB4MDQpIDw8IDgpOwotCi0JaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MTYsIGNyX2RhdGEpOwotCi0JVkJFID0gKGNyX2RhdGEgJiAweGZmKSB8ICgodTE2KSAoc3JfZGF0YSAmIDB4MTApIDw8IDQpOwotCXRlbXAgPSBWQkUgLSAoKEUgLSAxKSAmIDUxMSk7Ci0JQiA9ICh0ZW1wID4gMCkgPyB0ZW1wIDogKHRlbXAgKyA1MTIpOwotCi0JaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MTEsIGNyX2RhdGEpOwotCi0JVlJFID0gKGNyX2RhdGEgJiAweDBmKSB8ICgoc3JfZGF0YSAmIDB4MjApID4+IDEpOwotCXRlbXAgPSBWUkUgLSAoKEUgKyBGIC0gMSkgJiAzMSk7Ci0JQyA9ICh0ZW1wID4gMCkgPyB0ZW1wIDogKHRlbXAgKyAzMik7Ci0KLQlEID0gQiAtIEYgLSBDOwotCi0gICAgICAgIHZhci0+eXJlcyA9IEU7Ci0JdmFyLT51cHBlcl9tYXJnaW4gPSBEOwotCXZhci0+bG93ZXJfbWFyZ2luID0gRjsKLQl2YXItPnZzeW5jX2xlbiA9IEM7Ci0KLQlpZigodmFyLT52bW9kZSAmIEZCX1ZNT0RFX01BU0spID09IEZCX1ZNT0RFX0lOVEVSTEFDRUQpIHsKLQkgICB2YXItPnlyZXMgPDw9IDE7Ci0JICAgdmFyLT51cHBlcl9tYXJnaW4gPDw9IDE7Ci0JICAgdmFyLT5sb3dlcl9tYXJnaW4gPDw9IDE7Ci0JICAgdmFyLT52c3luY19sZW4gPDw9IDE7Ci0JfSBlbHNlIGlmKCh2YXItPnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfRE9VQkxFKSB7Ci0JICAgdmFyLT55cmVzID4+PSAxOwotCSAgIHZhci0+dXBwZXJfbWFyZ2luID4+PSAxOwotCSAgIHZhci0+bG93ZXJfbWFyZ2luID4+PSAxOwotCSAgIHZhci0+dnN5bmNfbGVuID4+PSAxOwotCX0KLQotCWluU0lTSURYUkVHKFNJU1NSLCAweDBiLCBzcl9kYXRhKTsKLQlpblNJU0lEWFJFRyhTSVNDUiwgMHgwMCwgY3JfZGF0YSk7Ci0KLQlIVCA9IChjcl9kYXRhICYgMHhmZikgfCAoKHUxNikgKHNyX2RhdGEgJiAweDAzKSA8PCA4KTsKLQlBID0gSFQgKyA1OwotCi0JaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDEsIGNyX2RhdGEpOwotCi0JSERFID0gKGNyX2RhdGEgJiAweGZmKSB8ICgodTE2KSAoc3JfZGF0YSAmIDB4MEMpIDw8IDYpOwotCUUgPSBIREUgKyAxOwotCi0JaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDQsIGNyX2RhdGEpOwotCi0JSFJTID0gKGNyX2RhdGEgJiAweGZmKSB8ICgodTE2KSAoc3JfZGF0YSAmIDB4QzApIDw8IDIpOwotCUYgPSBIUlMgLSBFIC0gMzsKLQotCWluU0lTSURYUkVHKFNJU0NSLCAweDAyLCBjcl9kYXRhKTsKLQotCUhCUyA9IChjcl9kYXRhICYgMHhmZikgfCAoKHUxNikgKHNyX2RhdGEgJiAweDMwKSA8PCA0KTsKLQotCWluU0lTSURYUkVHKFNJU1NSLCAweDBjLCBzcl9kYXRhKTsKLQlpblNJU0lEWFJFRyhTSVNDUiwgMHgwMywgY3JfZGF0YSk7Ci0JaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDUsIGNyX2RhdGEyKTsKLQotCUhCRSA9IChjcl9kYXRhICYgMHgxZikgfAotCSAgICAgICgodTE2KSAoY3JfZGF0YTIgJiAweDgwKSA+PiAyKSB8Ci0JICAgICAgKCh1MTYpIChzcl9kYXRhICAmIDB4MDMpIDw8IDYpOwotCUhSRSA9IChjcl9kYXRhMiAmIDB4MWYpIHwgKChzcl9kYXRhICYgMHgwNCkgPDwgMyk7Ci0KLQl0ZW1wID0gSEJFIC0gKChFIC0gMSkgJiAyNTUpOwotCUIgPSAodGVtcCA+IDApID8gdGVtcCA6ICh0ZW1wICsgMjU2KTsKLQotCXRlbXAgPSBIUkUgLSAoKEUgKyBGICsgMykgJiA2Myk7Ci0JQyA9ICh0ZW1wID4gMCkgPyB0ZW1wIDogKHRlbXAgKyA2NCk7Ci0KLQlEID0gQiAtIEYgLSBDOwotCi0JdmFyLT54cmVzID0gRSAqIDg7Ci0JaWYodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpIHsKLQkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7Ci0JfQotCi0JaWYoKHZhci0+eHJlcyA9PSAzMjApICYmCi0JICAgKHZhci0+eXJlcyA9PSAyMDAgfHwgdmFyLT55cmVzID09IDI0MCkpIHsKLQkJLyogVGVycmlibGUgaGFjaywgYnV0IHRoZSBjb3JyZWN0IENSVEMgZGF0YSBmb3IKLQkgIAkgKiB0aGVzZSBtb2RlcyBvbmx5IHByb2R1Y2VzIGEgYmxhY2sgc2NyZWVuLi4uCi0JICAJICovCi0gICAgICAgCQl2YXItPmxlZnRfbWFyZ2luID0gKDQwMCAtIDM3Nik7Ci0gICAgICAgCQl2YXItPnJpZ2h0X21hcmdpbiA9ICgzMjggLSAzMjApOwotICAgICAgIAkJdmFyLT5oc3luY19sZW4gPSAoMzc2IC0gMzI4KTsKLQl9IGVsc2UgewotCSAgIAl2YXItPmxlZnRfbWFyZ2luID0gRCAqIDg7Ci0JICAgCXZhci0+cmlnaHRfbWFyZ2luID0gRiAqIDg7Ci0JICAgCXZhci0+aHN5bmNfbGVuID0gQyAqIDg7Ci0JfQotCXZhci0+YWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7Ci0KLQl2YXItPnN5bmMgPSAwOwotCi0JbXJfZGF0YSA9IGluU0lTUkVHKFNJU01JU0NSKTsKLQlpZihtcl9kYXRhICYgMHg4MCkKLQkgICB2YXItPnN5bmMgJj0gfkZCX1NZTkNfVkVSVF9ISUdIX0FDVDsKLQllbHNlCi0JICAgdmFyLT5zeW5jIHw9IEZCX1NZTkNfVkVSVF9ISUdIX0FDVDsKLQotCWlmKG1yX2RhdGEgJiAweDQwKQotCSAgIHZhci0+c3luYyAmPSB+RkJfU1lOQ19IT1JfSElHSF9BQ1Q7Ci0JZWxzZQotCSAgIHZhci0+c3luYyB8PSBGQl9TWU5DX0hPUl9ISUdIX0FDVDsKLQotCVZUICs9IDI7Ci0JVlQgPDw9IDE7Ci0JSFQgPSAoSFQgKyA1KSAqIDg7Ci0KLQlpZigodmFyLT52bW9kZSAmIEZCX1ZNT0RFX01BU0spID09IEZCX1ZNT0RFX0lOVEVSTEFDRUQpIHsKLQkgICBWVCA8PD0gMTsKLQl9Ci0JaHJhdGUgPSBpdmlkZW8tPnJlZnJlc2hfcmF0ZSAqIFZUIC8gMjsKLQlkcmF0ZSA9IChocmF0ZSAqIEhUKSAvIDEwMDA7Ci0JdmFyLT5waXhjbG9jayA9ICh1MzIpICgxMDAwMDAwMDAwIC8gZHJhdGUpOwotCi0JaWYoaXZpZGVvLT5zaXNmYl95cGFuKSB7Ci0JICAgbWF4eXJlcyA9IHNpc2ZiX2NhbGNfbWF4eXJlcyhpdmlkZW8sIHZhcik7Ci0JICAgaWYoaXZpZGVvLT5zaXNmYl9tYXgpIHsKLQkgICAgICB2YXItPnlyZXNfdmlydHVhbCA9IG1heHlyZXM7Ci0JICAgfSBlbHNlIHsKLQkgICAgICBpZih2YXItPnlyZXNfdmlydHVhbCA+IG1heHlyZXMpIHsKLQkgICAgICAgICB2YXItPnlyZXNfdmlydHVhbCA9IG1heHlyZXM7Ci0JICAgICAgfQotCSAgIH0KLQkgICBpZih2YXItPnlyZXNfdmlydHVhbCA8PSB2YXItPnlyZXMpIHsKLQkgICAgICB2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKLQkgICB9Ci0JfSBlbHNlIHsKLQkgICB2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKLQl9Ci0KLX0KLQotc3RhdGljIGludAotc2lzX2dldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgKnJlZCwgdW5zaWduZWQgKmdyZWVuLCB1bnNpZ25lZCAqYmx1ZSwKLQkJCSB1bnNpZ25lZCAqdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7Ci0KLQlpZihyZWdubyA+PSBpdmlkZW8tPnZpZGVvX2NtYXBfbGVuKSByZXR1cm4gMTsKLQotCSpyZWQgICA9IGl2aWRlby0+c2lzX3BhbGV0dGVbcmVnbm9dLnJlZDsKLQkqZ3JlZW4gPSBpdmlkZW8tPnNpc19wYWxldHRlW3JlZ25vXS5ncmVlbjsKLQkqYmx1ZSAgPSBpdmlkZW8tPnNpc19wYWxldHRlW3JlZ25vXS5ibHVlOwotCSp0cmFuc3AgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXNpc2ZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwgdW5zaWduZWQgYmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopaW5mby0+cGFyOwotCi0JaWYocmVnbm8gPj0gaXZpZGVvLT52aWRlb19jbWFwX2xlbikgcmV0dXJuIDE7Ci0KLQlpdmlkZW8tPnNpc19wYWxldHRlW3JlZ25vXS5yZWQgICA9IHJlZDsKLQlpdmlkZW8tPnNpc19wYWxldHRlW3JlZ25vXS5ncmVlbiA9IGdyZWVuOwotCWl2aWRlby0+c2lzX3BhbGV0dGVbcmVnbm9dLmJsdWUgID0gYmx1ZTsKLQotCXN3aXRjaChpdmlkZW8tPnZpZGVvX2JwcCkgewotI2lmZGVmIEZCQ09OX0hBU19DRkI4Ci0JY2FzZSA4OgotCSAgICAgICAgb3V0U0lTUkVHKFNJU0RBQ0EsIHJlZ25vKTsKLQkJb3V0U0lTUkVHKFNJU0RBQ0QsIChyZWQgPj4gMTApKTsKLQkJb3V0U0lTUkVHKFNJU0RBQ0QsIChncmVlbiA+PiAxMCkpOwotCQlvdXRTSVNSRUcoU0lTREFDRCwgKGJsdWUgPj4gMTApKTsKLQkJaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AyKSB7Ci0JCSAgICAgICAgb3V0U0lTUkVHKFNJU0RBQzJBLCByZWdubyk7Ci0JCQlvdXRTSVNSRUcoU0lTREFDMkQsIChyZWQgPj4gOCkpOwotCQkJb3V0U0lTUkVHKFNJU0RBQzJELCAoZ3JlZW4gPj4gOCkpOwotCQkJb3V0U0lTUkVHKFNJU0RBQzJELCAoYmx1ZSA+PiA4KSk7Ci0JCX0KLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKLQljYXNlIDE2OgotCQlpdmlkZW8tPnNpc19mYmNvbl9jbWFwLmNmYjE2W3JlZ25vXSA9Ci0JCSAgICAoKHJlZCAmIDB4ZjgwMCkpIHwgKChncmVlbiAmIDB4ZmMwMCkgPj4gNSkgfCAoKGJsdWUgJiAweGY4MDApID4+IDExKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKLQljYXNlIDMyOgotCQlyZWQgICA+Pj0gODsKLQkJZ3JlZW4gPj49IDg7Ci0JCWJsdWUgID4+PSA4OwotCQlpdmlkZW8tPnNpc19mYmNvbl9jbWFwLmNmYjMyW3JlZ25vXSA9IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgKGJsdWUpOwotCQlicmVhazsKLSNlbmRpZgotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotc2lzZmJfc2V0X2Rpc3AoaW50IGNvbiwgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAgICAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLQlzdHJ1Y3QgZGlzcGxheSAgICAgICAgICAgKmRpc3BsYXk7Ci0Jc3RydWN0IGRpc3BsYXlfc3dpdGNoICAgICpzdzsKLQlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gZml4OwotCWxvbmcgICBmbGFnczsKLQotCWRpc3BsYXkgPSAoY29uID49IDApID8gJmZiX2Rpc3BsYXlbY29uXSA6ICZpdmlkZW8tPnNpc19kaXNwOwotCi0Jc2lzZmJfZ2V0X2ZpeCgmZml4LCBjb24sIGluZm8pOwotCi0JZGlzcGxheS0+dmFyID0gKnZhcjsKLQlkaXNwbGF5LT5zY3JlZW5fYmFzZSA9IChjaGFyICopaXZpZGVvLT52aWRlb192YmFzZTsKLQlkaXNwbGF5LT52aXN1YWwgPSBmaXgudmlzdWFsOwotCWRpc3BsYXktPnR5cGUgPSBmaXgudHlwZTsKLQlkaXNwbGF5LT50eXBlX2F1eCA9IGZpeC50eXBlX2F1eDsKLQlkaXNwbGF5LT55cGFuc3RlcCA9IGZpeC55cGFuc3RlcDsKLQlkaXNwbGF5LT55d3JhcHN0ZXAgPSBmaXgueXdyYXBzdGVwOwotCWRpc3BsYXktPmxpbmVfbGVuZ3RoID0gZml4LmxpbmVfbGVuZ3RoOwotCWRpc3BsYXktPmNhbl9zb2Z0X2JsYW5rID0gMTsKLQlkaXNwbGF5LT5pbnZlcnNlID0gaXZpZGVvLT5zaXNmYl9pbnZlcnNlOwotCWRpc3BsYXktPm5leHRfbGluZSA9IGZpeC5saW5lX2xlbmd0aDsKLQotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCi0Jc3dpdGNoKGl2aWRlby0+dmlkZW9fYnBwKSB7Ci0jaWZkZWYgRkJDT05fSEFTX0NGQjgKLQljYXNlIDg6CXN3ID0gaXZpZGVvLT5hY2NlbCA/ICZmYmNvbl9zaXM4IDogJmZiY29uX2NmYjg7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci0JY2FzZSAxNjpzdyA9IGl2aWRlby0+YWNjZWwgPyAmZmJjb25fc2lzMTYgOiAmZmJjb25fY2ZiMTY7Ci0JCWRpc3BsYXktPmRpc3Bzd19kYXRhID0gJml2aWRlby0+c2lzX2ZiY29uX2NtYXAuY2ZiMTY7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjMyCi0JY2FzZSAzMjpzdyA9IGl2aWRlby0+YWNjZWwgPyAmZmJjb25fc2lzMzIgOiAmZmJjb25fY2ZiMzI7Ci0JCWRpc3BsYXktPmRpc3Bzd19kYXRhID0gJml2aWRlby0+c2lzX2ZiY29uX2NtYXAuY2ZiMzI7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDpzdyA9ICZmYmNvbl9kdW1teTsKLQkJYnJlYWs7Ci0JfQotCW1lbWNweSgmaXZpZGVvLT5zaXNmYl9zdywgc3csIHNpemVvZigqc3cpKTsKLQlkaXNwbGF5LT5kaXNwc3cgPSAmaXZpZGVvLT5zaXNmYl9zdzsKLQotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCi0gICAgICAgIGlmKGl2aWRlby0+c2lzZmJfeXBhbikgewotICAJICAgIC8qIGRpc3BsYXktPnNjcm9sbG1vZGUgPSAwOyAgKi8KLQl9IGVsc2UgewotCSAgICBkaXNwbGF5LT5zY3JvbGxtb2RlID0gU0NST0xMX1lSRURSQVc7Ci0JICAgIGl2aWRlby0+c2lzZmJfc3cuYm1vdmUgPSBmYmNvbl9yZWRyYXdfYm1vdmU7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotc2lzZmJfZG9faW5zdGFsbF9jbWFwKGludCBjb24sIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLQotICAgICAgICBpZihjb24gIT0gaXZpZGVvLT5jdXJyY29uKSByZXR1cm47Ci0KLSAgICAgICAgaWYoZmJfZGlzcGxheVtjb25dLmNtYXAubGVuKSB7Ci0JCWZiX3NldF9jbWFwKCZmYl9kaXNwbGF5W2Nvbl0uY21hcCwgMSwgc2lzZmJfc2V0Y29scmVnLCBpbmZvKTsKLSAgICAgICAgfSBlbHNlIHsKLQkJaW50IHNpemUgPSBzaXNmYl9nZXRfY21hcF9sZW4oJmZiX2Rpc3BsYXlbY29uXS52YXIpOwotCQlmYl9zZXRfY21hcChmYl9kZWZhdWx0X2NtYXAoc2l6ZSksIDEsIHNpc2ZiX3NldGNvbHJlZywgaW5mbyk7Ci0JfQotfQotCi1zdGF0aWMgaW50Ci1zaXNmYl9nZXRfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7Ci0KLQlpZihjb24gPT0gLTEpIHsKLQkJbWVtY3B5KHZhciwgJml2aWRlby0+ZGVmYXVsdF92YXIsIHNpemVvZihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8pKTsKLQl9IGVsc2UgewotCQkqdmFyID0gZmJfZGlzcGxheVtjb25dLnZhcjsKLQl9Ci0KLQlpZihpdmlkZW8tPnNpc2ZiX2ZzdG4pIHsKLQkgICAJaWYodmFyLT54cmVzID09IDMyMCAmJiB2YXItPnlyZXMgPT0gNDgwKSB2YXItPnlyZXMgPSAyNDA7Ci0gICAgICAgIH0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1zaXNmYl9zZXRfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7Ci0JaW50IGVycjsKLQotCWZiX2Rpc3BsYXlbY29uXS52YXIuYWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7Ci0KLSAgICAgICAgaWYoc2lzZmJfZG9fc2V0X3Zhcih2YXIsIGNvbiA9PSBpdmlkZW8tPmN1cnJjb24sIGluZm8pKSB7Ci0JCXNpc2ZiX2NydGNfdG9fdmFyKGl2aWRlbywgdmFyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc2lzZmJfY3J0Y190b192YXIoaXZpZGVvLCB2YXIpOwotCi0Jc2lzZmJfc2V0X2Rpc3AoY29uLCB2YXIsIGluZm8pOwotCi0JaWYoaW5mby0+Y2hhbmdldmFyKSB7Ci0JCSgqaW5mby0+Y2hhbmdldmFyKShjb24pOwotCX0KLQotCWlmKChlcnIgPSBmYl9hbGxvY19jbWFwKCZmYl9kaXNwbGF5W2Nvbl0uY21hcCwgMCwgMCkpKSB7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0Jc2lzZmJfZG9faW5zdGFsbF9jbWFwKGNvbiwgaW5mbyk7Ci0KLSNpZiAwCS8qIFdoeSB3YXMgdGhpcyBjYWxsZWQgaGVyZT8gKi8KLQl1bnNpZ25lZCBpbnQgY29scywgcm93czsKLQljb2xzID0gc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLmNvbHM7Ci0Jcm93cyA9IHNpc2Jpb3NfbW9kZVtpdmlkZW8tPnNpc2ZiX21vZGVfaWR4XS5yb3dzOwotIAl2Y19yZXNpemVfY29uKHJvd3MsIGNvbHMsIGZiX2Rpc3BsYXlbY29uXS5jb25wLT52Y19udW0pOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXNpc2ZiX2dldF9jbWFwKHN0cnVjdCBmYl9jbWFwICpjbWFwLCBpbnQga3NwYywgaW50IGNvbiwgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopaW5mby0+cGFyOwotCXN0cnVjdCBkaXNwbGF5ICpkaXNwbGF5OwotCi0JZGlzcGxheSA9IChjb24gPj0gMCkgPyAmZmJfZGlzcGxheVtjb25dIDogJml2aWRlby0+c2lzX2Rpc3A7Ci0KLSAgICAgICAgaWYoY29uID09IGl2aWRlby0+Y3VycmNvbikgewotCi0JCXJldHVybiBmYl9nZXRfY21hcChjbWFwLCBrc3BjLCBzaXNfZ2V0Y29scmVnLCBpbmZvKTsKLQotCX0gZWxzZSBpZihkaXNwbGF5LT5jbWFwLmxlbikgewotCi0JCWZiX2NvcHlfY21hcCgmZGlzcGxheS0+Y21hcCwgY21hcCwga3NwYyA/IDAgOiAyKTsKLQotCX0gZWxzZSB7Ci0KLQkJaW50IHNpemUgPSBzaXNmYl9nZXRfY21hcF9sZW4oJmRpc3BsYXktPnZhcik7Ci0JCWZiX2NvcHlfY21hcChmYl9kZWZhdWx0X2NtYXAoc2l6ZSksIGNtYXAsIGtzcGMgPyAwIDogMik7Ci0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc2lzZmJfc2V0X2NtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIGludCBrc3BjLCBpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7Ci0Jc3RydWN0IGRpc3BsYXkgKmRpc3BsYXk7Ci0JaW50IGVyciwgc2l6ZTsKLQotCWRpc3BsYXkgPSAoY29uID49IDApID8gJmZiX2Rpc3BsYXlbY29uXSA6ICZpdmlkZW8tPnNpc19kaXNwOwotCi0Jc2l6ZSA9IHNpc2ZiX2dldF9jbWFwX2xlbigmZGlzcGxheS0+dmFyKTsKLQlpZihkaXNwbGF5LT5jbWFwLmxlbiAhPSBzaXplKSB7Ci0JCWVyciA9IGZiX2FsbG9jX2NtYXAoJmRpc3BsYXktPmNtYXAsIHNpemUsIDApOwotCQlpZihlcnIpCXJldHVybiBlcnI7Ci0JfQotICAgICAgICAKLQlpZihjb24gPT0gaXZpZGVvLT5jdXJyY29uKSB7Ci0JCXJldHVybiBmYl9zZXRfY21hcChjbWFwLCBrc3BjLCBzaXNmYl9zZXRjb2xyZWcsIGluZm8pOwotCX0gZWxzZSB7Ci0JCWZiX2NvcHlfY21hcChjbWFwLCAmZGlzcGxheS0+Y21hcCwga3NwYyA/IDAgOiAxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc2lzZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBjb24sIHN0cnVjdCBmYl9pbmZvKiBpbmZvKQotewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLQlpbnQgZXJyOwotCi0JaWYodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSByZXR1cm4gLUVJTlZBTDsKLQotCWlmKCh2YXItPnhvZmZzZXQrZmJfZGlzcGxheVtjb25dLnZhci54cmVzID4gZmJfZGlzcGxheVtjb25dLnZhci54cmVzX3ZpcnR1YWwpIHx8Ci0JICAgKHZhci0+eW9mZnNldCtmYl9kaXNwbGF5W2Nvbl0udmFyLnlyZXMgPiBmYl9kaXNwbGF5W2Nvbl0udmFyLnlyZXNfdmlydHVhbCkpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0gICAgICAgIGlmKGNvbiA9PSBpdmlkZW8tPmN1cnJjb24pIHsKLQkgICAJaWYoKGVyciA9IHNpc2ZiX3Bhbl92YXIoaXZpZGVvLCB2YXIpKSA8IDApIHJldHVybiBlcnI7Ci0JfQotCi0JZmJfZGlzcGxheVtjb25dLnZhci54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OwotCWZiX2Rpc3BsYXlbY29uXS52YXIueW9mZnNldCA9IHZhci0+eW9mZnNldDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1zaXNmYl91cGRhdGVfdmFyKGludCBjb24sIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLQotICAgICAgICByZXR1cm4oc2lzZmJfcGFuX3ZhcihpdmlkZW8sICZmYl9kaXNwbGF5W2Nvbl0udmFyKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNpc2ZiX3N3aXRjaChpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7Ci0JaW50IGNvbHMsIHJvd3M7Ci0KLSAgICAgICAgaWYoZmJfZGlzcGxheVtpdmlkZW8tPmN1cnJjb25dLmNtYXAubGVuKSB7Ci0JCWZiX2dldF9jbWFwKCZmYl9kaXNwbGF5W2l2aWRlby0+Y3VycmNvbl0uY21hcCwgMSwgc2lzX2dldGNvbHJlZywgaW5mbyk7Ci0JfQotCi0JZmJfZGlzcGxheVtjb25dLnZhci5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX05PVzsKLQotCWlmKCFtZW1jbXAoJmZiX2Rpc3BsYXlbY29uXS52YXIsICZmYl9kaXNwbGF5W2l2aWRlby0+Y3VycmNvbl0udmFyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIAlzaXplb2Yoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKSkpIHsKLQkJaXZpZGVvLT5jdXJyY29uID0gY29uOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpdmlkZW8tPmN1cnJjb24gPSBjb247Ci0KLQlzaXNmYl9kb19zZXRfdmFyKCZmYl9kaXNwbGF5W2Nvbl0udmFyLCAxLCBpbmZvKTsKLQotCXNpc2ZiX3NldF9kaXNwKGNvbiwgJmZiX2Rpc3BsYXlbY29uXS52YXIsIGluZm8pOwotCi0Jc2lzZmJfZG9faW5zdGFsbF9jbWFwKGNvbiwgaW5mbyk7Ci0KLQljb2xzID0gc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLmNvbHM7Ci0Jcm93cyA9IHNpc2Jpb3NfbW9kZVtpdmlkZW8tPnNpc2ZiX21vZGVfaWR4XS5yb3dzOwotCXZjX3Jlc2l6ZV9jb24ocm93cywgY29scywgZmJfZGlzcGxheVtjb25dLmNvbnAtPnZjX251bSk7Ci0KLQlzaXNmYl91cGRhdGVfdmFyKGNvbiwgaW5mbyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXNpc2ZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopaW5mby0+cGFyOworI2luY2x1ZGUgInNpc2ZiX2ZiZGV2XzJfNC5oIgogCi0Jc2lzZmJfbXlibGFuayhpdmlkZW8sIGJsYW5rKTsKLX0KICNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0gRkJEZXYgcmVsYXRlZCByb3V0aW5lcyBmb3IgMi42IHNlcmllcyAtLS0tLS0tLS0tLSAqLwpAQCAtMTc2MSwxMyArMTQ0NSwxMyBAQAogc3RhdGljIGludAogc2lzZmJfb3BlbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCiB7Ci0gICAgCXJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBzaXNmYl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKIHsKLSAgICAJcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE3NzYsMTYgKzE0NjAsMTcgQEAKIHsKIAlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7CiAKLQlpZihyZWdubyA+PSBzaXNmYl9nZXRfY21hcF9sZW4oJmluZm8tPnZhcikpIHJldHVybiAxOworCWlmKHJlZ25vID49IHNpc2ZiX2dldF9jbWFwX2xlbigmaW5mby0+dmFyKSkKKwkJcmV0dXJuIDE7CiAKIAlzd2l0Y2goaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSA4OgotCSAgICAgICAgb3V0U0lTUkVHKFNJU0RBQ0EsIHJlZ25vKTsKKwkJb3V0U0lTUkVHKFNJU0RBQ0EsIHJlZ25vKTsKIAkJb3V0U0lTUkVHKFNJU0RBQ0QsIChyZWQgPj4gMTApKTsKIAkJb3V0U0lTUkVHKFNJU0RBQ0QsIChncmVlbiA+PiAxMCkpOwogCQlvdXRTSVNSRUcoU0lTREFDRCwgKGJsdWUgPj4gMTApKTsKIAkJaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AyKSB7Ci0JCSAgICAgICAgb3V0U0lTUkVHKFNJU0RBQzJBLCByZWdubyk7CisJCQlvdXRTSVNSRUcoU0lTREFDMkEsIHJlZ25vKTsKIAkJCW91dFNJU1JFRyhTSVNEQUMyRCwgKHJlZCA+PiA4KSk7CiAJCQlvdXRTSVNSRUcoU0lTREFDMkQsIChncmVlbiA+PiA4KSk7CiAJCQlvdXRTSVNSRUcoU0lTREFDMkQsIChibHVlID4+IDgpKTsKQEAgLTE3OTMsNyArMTQ3OCw5IEBACiAJCWJyZWFrOwogCWNhc2UgMTY6CiAJCSgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KLQkJICAgICgocmVkICYgMHhmODAwKSkgfCAoKGdyZWVuICYgMHhmYzAwKSA+PiA1KSB8ICgoYmx1ZSAmIDB4ZjgwMCkgPj4gMTEpOworCQkJCShyZWQgJiAweGY4MDApICAgICAgICAgIHwKKwkJCQkoKGdyZWVuICYgMHhmYzAwKSA+PiA1KSB8CisJCQkJKChibHVlICYgMHhmODAwKSA+PiAxMSk7CiAJCWJyZWFrOwogCWNhc2UgMzI6CiAJCXJlZCA+Pj0gODsKQEAgLTE4MTEsMTMgKzE0OTgsMTMgQEAKIHsKIAlpbnQgZXJyOwogCi0gICAgICAgIGlmKChlcnIgPSBzaXNmYl9kb19zZXRfdmFyKCZpbmZvLT52YXIsIDEsIGluZm8pKSkgeworCWlmKChlcnIgPSBzaXNmYl9kb19zZXRfdmFyKCZpbmZvLT52YXIsIDEsIGluZm8pKSkKIAkJcmV0dXJuIGVycjsKLQl9CisKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTApCiAJc2lzZmJfZ2V0X2ZpeCgmaW5mby0+Zml4LCBpbmZvLT5jdXJyY29uLCBpbmZvKTsKICNlbHNlCi0gICAgICAJc2lzZmJfZ2V0X2ZpeCgmaW5mby0+Zml4LCAtMSwgaW5mbyk7CisJc2lzZmJfZ2V0X2ZpeCgmaW5mby0+Zml4LCAtMSwgaW5mbyk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KQEAgLTE4MjksNyArMTUxNiw3IEBACiAJdW5zaWduZWQgaW50IGh0b3RhbCA9IDAsIHZ0b3RhbCA9IDAsIG15cmF0ZWluZGV4ID0gMDsKIAl1bnNpZ25lZCBpbnQgZHJhdGUgPSAwLCBocmF0ZSA9IDAsIG1heHlyZXM7CiAJaW50IGZvdW5kX21vZGUgPSAwOwotCWludCByZWZyZXNoX3JhdGUsIHNlYXJjaF9pZHg7CisJaW50IHJlZnJlc2hfcmF0ZSwgc2VhcmNoX2lkeCwgdGlkeDsKIAlCT09MRUFOIHJlY2FsY19jbG9jayA9IEZBTFNFOwogCXUzMiBwaXhjbG9jazsKIApAQCAtMTg0OCw3ICsxNTM1LDggQEAKIAl9IGVsc2UgaWYoKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PSBGQl9WTU9ERV9JTlRFUkxBQ0VEKSB7CiAJCXZ0b3RhbCArPSB2YXItPnlyZXM7CiAJCXZ0b3RhbCA8PD0gMTsKLQl9IGVsc2UgCXZ0b3RhbCArPSB2YXItPnlyZXM7CisJfSBlbHNlCisJCXZ0b3RhbCArPSB2YXItPnlyZXM7CiAKIAlpZighKGh0b3RhbCkgfHwgISh2dG90YWwpKSB7CiAJCVNJU0ZBSUwoInNpc2ZiOiBubyB2YWxpZCB0aW1pbmcgZGF0YSIpOwpAQCAtMTg2MCw2MCArMTU0OCw2OCBAQAogCQlpZiggKHNpc2Jpb3NfbW9kZVtzZWFyY2hfaWR4XS54cmVzID09IHZhci0+eHJlcykgJiYKIAkJICAgIChzaXNiaW9zX21vZGVbc2VhcmNoX2lkeF0ueXJlcyA9PSB2YXItPnlyZXMpICYmCiAJCSAgICAoc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLmJwcCA9PSB2YXItPmJpdHNfcGVyX3BpeGVsKSkgewotCQkgICAgICAgIGlmKHNpc2ZiX3ZhbGlkYXRlX21vZGUoaXZpZGVvLCBzZWFyY2hfaWR4LCBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzKSA+IDApIHsKLQkJCSAgIGZvdW5kX21vZGUgPSAxOwotCQkJICAgYnJlYWs7CisJCQlpZigodGlkeCA9IHNpc2ZiX3ZhbGlkYXRlX21vZGUoaXZpZGVvLCBzZWFyY2hfaWR4LAorCQkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncykpID4gMCkgeworCQkJCWZvdW5kX21vZGUgPSAxOworCQkJCXNlYXJjaF9pZHggPSB0aWR4OworCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJCXNlYXJjaF9pZHgrKzsKIAl9CiAKIAlpZighZm91bmRfbW9kZSkgewotICAgICAgICAgICAgICAgIHNlYXJjaF9pZHggPSAwOworCQlzZWFyY2hfaWR4ID0gMDsKIAkJd2hpbGUoc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLm1vZGVfbm9bMF0gIT0gMCkgewogCQkgICBpZiggKHZhci0+eHJlcyA8PSBzaXNiaW9zX21vZGVbc2VhcmNoX2lkeF0ueHJlcykgJiYKIAkJICAgICAgICh2YXItPnlyZXMgPD0gc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLnlyZXMpICYmCiAJCSAgICAgICAodmFyLT5iaXRzX3Blcl9waXhlbCA9PSBzaXNiaW9zX21vZGVbc2VhcmNoX2lkeF0uYnBwKSApIHsKLQkJICAgICAgICAgIGlmKHNpc2ZiX3ZhbGlkYXRlX21vZGUoaXZpZGVvLHNlYXJjaF9pZHgsIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MpID4gMCkgewotCQkJICAgICBmb3VuZF9tb2RlID0gMTsKLQkJCSAgICAgYnJlYWs7Ci0JCQkgIH0KKwkJCWlmKCh0aWR4ID0gc2lzZmJfdmFsaWRhdGVfbW9kZShpdmlkZW8sc2VhcmNoX2lkeCwKKwkJCQkJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MpKSA+IDApIHsKKwkJCQlmb3VuZF9tb2RlID0gMTsKKwkJCQlzZWFyY2hfaWR4ID0gdGlkeDsKKwkJCQlicmVhazsKKwkJCX0KIAkJICAgfQogCQkgICBzZWFyY2hfaWR4Kys7Ci0JICAgICAgICB9CisJCX0KIAkJaWYoZm91bmRfbW9kZSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiBBZGFwdGVkIGZyb20gJWR4JWR4JWQgdG8gJWR4JWR4JWRcbiIsCi0JCSAgIAkJdmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwsCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSJzaXNmYjogQWRhcHRlZCBmcm9tICVkeCVkeCVkIHRvICVkeCVkeCVkXG4iLAorCQkJCXZhci0+eHJlcywgdmFyLT55cmVzLCB2YXItPmJpdHNfcGVyX3BpeGVsLAogCQkJCXNpc2Jpb3NfbW9kZVtzZWFyY2hfaWR4XS54cmVzLAogCQkJCXNpc2Jpb3NfbW9kZVtzZWFyY2hfaWR4XS55cmVzLAogCQkJCXZhci0+Yml0c19wZXJfcGl4ZWwpOwogCQkJdmFyLT54cmVzID0gc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLnhyZXM7Ci0JCSAgICAgIAl2YXItPnlyZXMgPSBzaXNiaW9zX21vZGVbc2VhcmNoX2lkeF0ueXJlczsKLQotCisJCQl2YXItPnlyZXMgPSBzaXNiaW9zX21vZGVbc2VhcmNoX2lkeF0ueXJlczsKIAkJfSBlbHNlIHsKLQkJICAgCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEZhaWxlZCB0byBmaW5kIHN1cHBvcnRlZCBtb2RlIG5lYXIgJWR4JWR4JWRcbiIsCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkic2lzZmI6IEZhaWxlZCB0byBmaW5kIHN1cHBvcnRlZCBtb2RlIG5lYXIgJWR4JWR4JWRcbiIsCiAJCQkJdmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwotCQkgICAJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAotCWlmKCAoKGl2aWRlby0+dmJmbGFncyAmIFZCX0xWRFMpIHx8CQkJLyogU2xhdmUgbW9kZXMgb24gTFZEUyBhbmQgMzAxQi1ESCAqLwotCSAgICAgKChpdmlkZW8tPnZiZmxhZ3MgJiBWQl8zMHhCREgpICYmIChpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgQ1JUMl9MQ0QpKSkgJiYKKwlpZiggKChpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX0xWRFMpIHx8CisJICAgICAoKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfMzB4QkRIKSAmJiAoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIENSVDJfTENEKSkpICYmCiAJICAgICh2YXItPmJpdHNfcGVyX3BpeGVsID09IDgpICkgewotCSAgICAJcmVmcmVzaF9yYXRlID0gNjA7CisJCS8qIFNsYXZlIG1vZGVzIG9uIExWRFMgYW5kIDMwMUItREggKi8KKwkJcmVmcmVzaF9yYXRlID0gNjA7CiAJCXJlY2FsY19jbG9jayA9IFRSVUU7Ci0JfSBlbHNlIGlmKCAoaXZpZGVvLT5jdXJyZW50X2h0b3RhbCA9PSBodG90YWwpICYmCS8qIHg9eCAmIHk9eSAmIGM9YyAtPiBhc3N1bWUgZGVwdGggY2hhbmdlICovCi0JICAgIAkgICAoaXZpZGVvLT5jdXJyZW50X3Z0b3RhbCA9PSB2dG90YWwpICYmCi0JICAgIAkgICAoaXZpZGVvLT5jdXJyZW50X3BpeGNsb2NrID09IHBpeGNsb2NrKSApIHsKKwl9IGVsc2UgaWYoIChpdmlkZW8tPmN1cnJlbnRfaHRvdGFsID09IGh0b3RhbCkgJiYKKwkJICAgKGl2aWRlby0+Y3VycmVudF92dG90YWwgPT0gdnRvdGFsKSAmJgorCQkgICAoaXZpZGVvLT5jdXJyZW50X3BpeGNsb2NrID09IHBpeGNsb2NrKSApIHsKKwkJLyogeD14ICYgeT15ICYgYz1jIC0+IGFzc3VtZSBkZXB0aCBjaGFuZ2UgKi8KIAkJZHJhdGUgPSAxMDAwMDAwMDAwIC8gcGl4Y2xvY2s7Ci0JICAgICAgICBocmF0ZSA9IChkcmF0ZSAqIDEwMDApIC8gaHRvdGFsOwotCSAgICAgICAgcmVmcmVzaF9yYXRlID0gKHVuc2lnbmVkIGludCkgKGhyYXRlICogMiAvIHZ0b3RhbCk7Ci0JfSBlbHNlIGlmKCAoIChpdmlkZW8tPmN1cnJlbnRfaHRvdGFsICE9IGh0b3RhbCkgfHwJLyogeCE9eCB8IHkhPXkgJiBjPWMgLT4gaW52YWxpZCBwaXhjbG9jayAqLwotCSAgICAJICAgICAoaXZpZGVvLT5jdXJyZW50X3Z0b3RhbCAhPSB2dG90YWwpICkgJiYKLQkgICAgCSAgIChpdmlkZW8tPmN1cnJlbnRfcGl4Y2xvY2sgPT0gdmFyLT5waXhjbG9jaykgKSB7CisJCWhyYXRlID0gKGRyYXRlICogMTAwMCkgLyBodG90YWw7CisJCXJlZnJlc2hfcmF0ZSA9ICh1bnNpZ25lZCBpbnQpIChocmF0ZSAqIDIgLyB2dG90YWwpOworCX0gZWxzZSBpZiggKCAoaXZpZGVvLT5jdXJyZW50X2h0b3RhbCAhPSBodG90YWwpIHx8CisJCSAgICAgKGl2aWRlby0+Y3VycmVudF92dG90YWwgIT0gdnRvdGFsKSApICYmCisJCSAgIChpdmlkZW8tPmN1cnJlbnRfcGl4Y2xvY2sgPT0gdmFyLT5waXhjbG9jaykgKSB7CisJCS8qIHghPXggfCB5IT15ICYgYz1jIC0+IGludmFsaWQgcGl4Y2xvY2sgKi8KIAkJaWYoaXZpZGVvLT5zaXNmYl9sYXN0cmF0ZXNbc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldXSkgewotCQkJcmVmcmVzaF9yYXRlID0gaXZpZGVvLT5zaXNmYl9sYXN0cmF0ZXNbc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldXTsKKwkJCXJlZnJlc2hfcmF0ZSA9CisJCQkJaXZpZGVvLT5zaXNmYl9sYXN0cmF0ZXNbc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldXTsKIAkJfSBlbHNlIGlmKGl2aWRlby0+c2lzZmJfcGFybV9yYXRlICE9IC0xKSB7CiAJCQkvKiBTaWMsIHNpc2ZiX3Bhcm1fcmF0ZSAtIHdhbnQgdG8ga25vdyBvcmlnaW5hbGx5IGRlc2lyZWQgcmF0ZSBoZXJlICovCiAJCQlyZWZyZXNoX3JhdGUgPSBpdmlkZW8tPnNpc2ZiX3Bhcm1fcmF0ZTsKQEAgLTE5MjMsOCArMTYxOSw4IEBACiAJCXJlY2FsY19jbG9jayA9IFRSVUU7CiAJfSBlbHNlIGlmKChwaXhjbG9jaykgJiYgKGh0b3RhbCkgJiYgKHZ0b3RhbCkpIHsKIAkJZHJhdGUgPSAxMDAwMDAwMDAwIC8gcGl4Y2xvY2s7Ci0JICAgCWhyYXRlID0gKGRyYXRlICogMTAwMCkgLyBodG90YWw7Ci0JICAgCXJlZnJlc2hfcmF0ZSA9ICh1bnNpZ25lZCBpbnQpIChocmF0ZSAqIDIgLyB2dG90YWwpOworCQlocmF0ZSA9IChkcmF0ZSAqIDEwMDApIC8gaHRvdGFsOworCQlyZWZyZXNoX3JhdGUgPSAodW5zaWduZWQgaW50KSAoaHJhdGUgKiAyIC8gdnRvdGFsKTsKIAl9IGVsc2UgaWYoaXZpZGVvLT5jdXJyZW50X3JlZnJlc2hfcmF0ZSkgewogCQlyZWZyZXNoX3JhdGUgPSBpdmlkZW8tPmN1cnJlbnRfcmVmcmVzaF9yYXRlOwogCQlyZWNhbGNfY2xvY2sgPSBUUlVFOwpAQCAtMTkzNyw3MiArMTYzMyw3MiBAQAogCiAJLyogRXZlbnR1YWxseSByZWNhbGN1bGF0ZSB0aW1pbmcgYW5kIGNsb2NrICovCiAJaWYocmVjYWxjX2Nsb2NrKSB7Ci0JICAgaWYoIW15cmF0ZWluZGV4KSBteXJhdGVpbmRleCA9IHNpc2Jpb3NfbW9kZVtzZWFyY2hfaWR4XS5yYXRlX2lkeDsKLQkgICB2YXItPnBpeGNsb2NrID0gKHUzMikgKDEwMDAwMDAwMDAgLyBzaXNmYl9tb2RlX3JhdGVfdG9fZGNsb2NrKCZpdmlkZW8tPlNpU19QciwKLQkgICAJCQkJCSZpdmlkZW8tPnNpc2h3X2V4dCwKKwkJaWYoIW15cmF0ZWluZGV4KSBteXJhdGVpbmRleCA9IHNpc2Jpb3NfbW9kZVtzZWFyY2hfaWR4XS5yYXRlX2lkeDsKKwkJdmFyLT5waXhjbG9jayA9ICh1MzIpICgxMDAwMDAwMDAwIC8gc2lzZmJfbW9kZV9yYXRlX3RvX2RjbG9jaygmaXZpZGVvLT5TaVNfUHIsCiAJCQkJCQlzaXNiaW9zX21vZGVbc2VhcmNoX2lkeF0ubW9kZV9ub1tpdmlkZW8tPm1uaV0sCiAJCQkJCQlteXJhdGVpbmRleCkpOwotCSAgIHNpc2ZiX21vZGVfcmF0ZV90b19kZGF0YSgmaXZpZGVvLT5TaVNfUHIsICZpdmlkZW8tPnNpc2h3X2V4dCwKLQkJIAkJICAgIHNpc2Jpb3NfbW9kZVtzZWFyY2hfaWR4XS5tb2RlX25vW2l2aWRlby0+bW5pXSwgbXlyYXRlaW5kZXgsCXZhcik7Ci0JICAgaWYoKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PSBGQl9WTU9ERV9ET1VCTEUpIHsKLQkgICAgICB2YXItPnBpeGNsb2NrIDw8PSAxOwotCSAgIH0KKwkJc2lzZmJfbW9kZV9yYXRlX3RvX2RkYXRhKCZpdmlkZW8tPlNpU19QciwKKwkJCQkJc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldLAorCQkJCQlteXJhdGVpbmRleCwgdmFyKTsKKwkJaWYoKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PSBGQl9WTU9ERV9ET1VCTEUpIHsKKwkJCXZhci0+cGl4Y2xvY2sgPDw9IDE7CisJCX0KIAl9CiAKIAlpZihpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLmRhdGF2YWxpZCkgewotCSAgIGlmKCFzaXNmYl92ZXJpZnlfcmF0ZShpdmlkZW8sICZpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLCBzZWFyY2hfaWR4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBteXJhdGVpbmRleCwgcmVmcmVzaF9yYXRlKSkgewotCSAgICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBXQVJOSU5HOiBSZWZyZXNoIHJhdGUgZXhjZWVkcyBtb25pdG9yIHNwZWNzIVxuIik7Ci0JICAgfQorCQlpZighc2lzZmJfdmVyaWZ5X3JhdGUoaXZpZGVvLCAmaXZpZGVvLT5zaXNmYl90aGlzbW9uaXRvciwgc2VhcmNoX2lkeCwKKwkJCQlteXJhdGVpbmRleCwgcmVmcmVzaF9yYXRlKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJzaXNmYjogV0FSTklORzogUmVmcmVzaCByYXRlIGV4Y2VlZHMgbW9uaXRvciBzcGVjcyFcbiIpOworCQl9CiAJfQogCiAJLyogQWRhcHQgUkdCIHNldHRpbmdzICovCiAJc2lzZmJfYnBwX3RvX3ZhcihpdmlkZW8sIHZhcik7Ci0JCisKIAkvKiBTYW5pdHkgY2hlY2sgZm9yIG9mZnNldHMgKi8KIAlpZih2YXItPnhvZmZzZXQgPCAwKSB2YXItPnhvZmZzZXQgPSAwOwogCWlmKHZhci0+eW9mZnNldCA8IDApIHZhci0+eW9mZnNldCA9IDA7CiAKLQlpZih2YXItPnhyZXMgPiB2YXItPnhyZXNfdmlydHVhbCkgewotCSAgIHZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOwotCX0KKwlpZih2YXItPnhyZXMgPiB2YXItPnhyZXNfdmlydHVhbCkKKwkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CiAKIAlpZihpdmlkZW8tPnNpc2ZiX3lwYW4pIHsKLQkgICBtYXh5cmVzID0gc2lzZmJfY2FsY19tYXh5cmVzKGl2aWRlbywgdmFyKTsKLQkgICBpZihpdmlkZW8tPnNpc2ZiX21heCkgewotCSAgICAgIHZhci0+eXJlc192aXJ0dWFsID0gbWF4eXJlczsKLQkgICB9IGVsc2UgewotCSAgICAgIGlmKHZhci0+eXJlc192aXJ0dWFsID4gbWF4eXJlcykgewotCSAgICAgICAgIHZhci0+eXJlc192aXJ0dWFsID0gbWF4eXJlczsKLQkgICAgICB9Ci0JICAgfQotCSAgIGlmKHZhci0+eXJlc192aXJ0dWFsIDw9IHZhci0+eXJlcykgewotCSAgICAgIHZhci0+eXJlc192aXJ0dWFsID0gdmFyLT55cmVzOwotCSAgIH0KKwkJbWF4eXJlcyA9IHNpc2ZiX2NhbGNfbWF4eXJlcyhpdmlkZW8sIHZhcik7CisJCWlmKGl2aWRlby0+c2lzZmJfbWF4KSB7CisJCQl2YXItPnlyZXNfdmlydHVhbCA9IG1heHlyZXM7CisJCX0gZWxzZSB7CisJCQlpZih2YXItPnlyZXNfdmlydHVhbCA+IG1heHlyZXMpIHsKKwkJCQl2YXItPnlyZXNfdmlydHVhbCA9IG1heHlyZXM7CisJCQl9CisJCX0KKwkJaWYodmFyLT55cmVzX3ZpcnR1YWwgPD0gdmFyLT55cmVzKSB7CisJCQl2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKKwkJfQogCX0gZWxzZSB7Ci0JICAgaWYodmFyLT55cmVzICE9IHZhci0+eXJlc192aXJ0dWFsKSB7Ci0JICAgICAgdmFyLT55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXM7Ci0JICAgfQotCSAgIHZhci0+eG9mZnNldCA9IDA7Ci0JICAgdmFyLT55b2Zmc2V0ID0gMDsKKwkJaWYodmFyLT55cmVzICE9IHZhci0+eXJlc192aXJ0dWFsKSB7CisJCQl2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKKwkJfQorCQl2YXItPnhvZmZzZXQgPSAwOworCQl2YXItPnlvZmZzZXQgPSAwOwogCX0KLQkKKwogCS8qIFRydW5jYXRlIG9mZnNldHMgdG8gbWF4aW11bSBpZiB0b28gaGlnaCAqLwogCWlmKHZhci0+eG9mZnNldCA+IHZhci0+eHJlc192aXJ0dWFsIC0gdmFyLT54cmVzKSB7Ci0JICAgdmFyLT54b2Zmc2V0ID0gdmFyLT54cmVzX3ZpcnR1YWwgLSB2YXItPnhyZXMgLSAxOworCQl2YXItPnhvZmZzZXQgPSB2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcyAtIDE7CiAJfQogCiAJaWYodmFyLT55b2Zmc2V0ID4gdmFyLT55cmVzX3ZpcnR1YWwgLSB2YXItPnlyZXMpIHsKLQkgICB2YXItPnlvZmZzZXQgPSB2YXItPnlyZXNfdmlydHVhbCAtIHZhci0+eXJlcyAtIDE7CisJCXZhci0+eW9mZnNldCA9IHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzIC0gMTsKIAl9Ci0JCisKIAkvKiBTZXQgZXZlcnl0aGluZyBlbHNlIHRvIDAgKi8KLQl2YXItPnJlZC5tc2JfcmlnaHQgPSAKLQl2YXItPmdyZWVuLm1zYl9yaWdodCA9Ci0JdmFyLT5ibHVlLm1zYl9yaWdodCA9Ci0JdmFyLT50cmFuc3Aub2Zmc2V0ID0KLQl2YXItPnRyYW5zcC5sZW5ndGggPQotCXZhci0+dHJhbnNwLm1zYl9yaWdodCA9IDA7CisJdmFyLT5yZWQubXNiX3JpZ2h0ID0KKwkJdmFyLT5ncmVlbi5tc2JfcmlnaHQgPQorCQl2YXItPmJsdWUubXNiX3JpZ2h0ID0KKwkJdmFyLT50cmFuc3Aub2Zmc2V0ID0KKwkJdmFyLT50cmFuc3AubGVuZ3RoID0KKwkJdmFyLT50cmFuc3AubXNiX3JpZ2h0ID0gMDsKIAogCXJldHVybiAwOwogfQpAQCAtMjAxMywyMSArMTcwOSwyMSBAQAogCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKIAlpbnQgZXJyOwogCi0JaWYodmFyLT54b2Zmc2V0ID4gKHZhci0+eHJlc192aXJ0dWFsIC0gdmFyLT54cmVzKSkgeworCWlmKHZhci0+eG9mZnNldCA+ICh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykpCiAJCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZih2YXItPnlvZmZzZXQgPiAodmFyLT55cmVzX3ZpcnR1YWwgLSB2YXItPnlyZXMpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KIAotCWlmKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9ZV1JBUCkgcmV0dXJuIC1FSU5WQUw7CisJaWYodmFyLT55b2Zmc2V0ID4gKHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZih2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYodmFyLT54b2Zmc2V0ICsgaW5mby0+dmFyLnhyZXMgPiBpbmZvLT52YXIueHJlc192aXJ0dWFsIHx8Ci0JICAgdmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKSB7CisJICAgdmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKLQlpZigoZXJyID0gc2lzZmJfcGFuX3ZhcihpdmlkZW8sIHZhcikpIDwgMCkgcmV0dXJuIGVycjsKKwlpZigoZXJyID0gc2lzZmJfcGFuX3ZhcihpdmlkZW8sIHZhcikpIDwgMCkKKwkJcmV0dXJuIGVycjsKIAogCWluZm8tPnZhci54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OwogCWluZm8tPnZhci55b2Zmc2V0ID0gdmFyLT55b2Zmc2V0OwpAQCAtMjA0MCw3ICsxNzM2LDcgQEAKIHsKIAlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7CiAKLQlyZXR1cm4oc2lzZmJfbXlibGFuayhpdmlkZW8sIGJsYW5rKSk7CisJcmV0dXJuIHNpc2ZiX215YmxhbmsoaXZpZGVvLCBibGFuayk7CiB9CiAKICNlbmRpZgpAQCAtMjA1NiwxNTMgKzE3NTIsMTg0IEBACiAJICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBzaXNfdmlkZW9faW5mbwkqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLQlzdHJ1Y3Qgc2lzX21lbXJlcSAJc2lzbWVtcmVxOwotCXN0cnVjdCBmYl92YmxhbmsgIAlzaXN2YmJsYW5rOwotCXNpc2ZiX2luZm8gICAgICAgIAl4OworCXN0cnVjdCBzaXNfbWVtcmVxCXNpc21lbXJlcTsKKwlzdHJ1Y3QgZmJfdmJsYW5rCXNpc3ZiYmxhbms7CiAJdTMyCQkJZ3B1MzIgPSAwOwogI2lmbmRlZiBfX3VzZXIKICNkZWZpbmUgX191c2VyCiAjZW5kaWYKIAl1MzIgX191c2VyIAkJKmFyZ3AgPSAodTMyIF9fdXNlciAqKWFyZzsKIAotCXN3aXRjaCAoY21kKSB7CisJc3dpdGNoKGNtZCkgewogCSAgIGNhc2UgRkJJT19BTExPQzoKLQkJaWYoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpIHsKKwkJaWYoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCiAJCQlyZXR1cm4gLUVQRVJNOwotCQl9Ci0JCWlmKGNvcHlfZnJvbV91c2VyKCZzaXNtZW1yZXEsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHNpc21lbXJlcSkpKSB7Ci0JCSAgIAlyZXR1cm4gLUVGQVVMVDsKLQkJfQorCisJCWlmKGNvcHlfZnJvbV91c2VyKCZzaXNtZW1yZXEsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHNpc21lbXJlcSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAkJc2lzX21hbGxvYygmc2lzbWVtcmVxKTsKKwogCQlpZihjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmc2lzbWVtcmVxLCBzaXplb2Yoc2lzbWVtcmVxKSkpIHsKIAkJCXNpc19mcmVlKCh1MzIpc2lzbWVtcmVxLm9mZnNldCk7Ci0JCSAgICAJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCQlicmVhazsKIAogCSAgIGNhc2UgRkJJT19GUkVFOgotCQlpZighY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkgeworCQlpZighY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKIAkJCXJldHVybiAtRVBFUk07Ci0JCX0KLQkJaWYoZ2V0X3VzZXIoZ3B1MzIsIGFyZ3ApKSB7CisKKwkJaWYoZ2V0X3VzZXIoZ3B1MzIsIGFyZ3ApKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwogCQlzaXNfZnJlZShncHUzMik7CiAJCWJyZWFrOwogCiAJICAgY2FzZSBGQklPR0VUX1ZCTEFOSzoKIAkJc2lzdmJibGFuay5jb3VudCA9IDA7CiAJCXNpc3ZiYmxhbmsuZmxhZ3MgPSBzaXNmYl9zZXR1cHZiYmxhbmtmbGFncyhpdmlkZW8sICZzaXN2YmJsYW5rLnZjb3VudCwgJnNpc3ZiYmxhbmsuaGNvdW50KTsKLQkJaWYoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnNpc3ZiYmxhbmssIHNpemVvZihzaXN2YmJsYW5rKSkpIHsKKworCQlpZihjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmc2lzdmJibGFuaywgc2l6ZW9mKHNpc3ZiYmxhbmspKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQl9CisKIAkJYnJlYWs7CiAKIAkgICBjYXNlIFNJU0ZCX0dFVF9JTkZPX1NJWkU6Ci0JICAgICAgICByZXR1cm4gcHV0X3VzZXIoc2l6ZW9mKHNpc2ZiX2luZm8pLCBhcmdwKTsKKwkJcmV0dXJuIHB1dF91c2VyKHNpemVvZihzdHJ1Y3Qgc2lzZmJfaW5mbyksIGFyZ3ApOwogCiAJICAgY2FzZSBTSVNGQl9HRVRfSU5GT19PTEQ6Ci0JICAgICAgICBpZihpdmlkZW8tPndhcm5jb3VudCsrIDwgNTApIHsKLQkgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBEZXByZWNhdGVkIGlvY3RsIGNhbGwgcmVjZWl2ZWQgLSB1cGRhdGUgeW91ciBhcHBsaWNhdGlvbiFcbiIpOwotCQl9CisJCWlmKGl2aWRlby0+d2FybmNvdW50KysgPCAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkic2lzZmI6IERlcHJlY2F0ZWQgaW9jdGwgY2FsbCByZWNlaXZlZCAtIHVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIVxuIik7CiAJICAgY2FzZSBTSVNGQl9HRVRfSU5GTzogIC8qIEZvciBjb21tdW5pY2F0aW9uIHdpdGggWCBkcml2ZXIgKi8KLQkJeC5zaXNmYl9pZCAgICAgICAgID0gU0lTRkJfSUQ7Ci0JCXguc2lzZmJfdmVyc2lvbiAgICA9IFZFUl9NQUpPUjsKLQkJeC5zaXNmYl9yZXZpc2lvbiAgID0gVkVSX01JTk9SOwotCQl4LnNpc2ZiX3BhdGNobGV2ZWwgPSBWRVJfTEVWRUw7Ci0JCXguY2hpcF9pZCA9IGl2aWRlby0+Y2hpcF9pZDsKLQkJeC5tZW1vcnkgPSBpdmlkZW8tPnZpZGVvX3NpemUgLyAxMDI0OwotCQl4LmhlYXBzdGFydCA9IGl2aWRlby0+aGVhcHN0YXJ0IC8gMTAyNDsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfaWQgICAgICAgICA9IFNJU0ZCX0lEOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl92ZXJzaW9uICAgID0gVkVSX01BSk9SOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl9yZXZpc2lvbiAgID0gVkVSX01JTk9SOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl9wYXRjaGxldmVsID0gVkVSX0xFVkVMOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5jaGlwX2lkID0gaXZpZGVvLT5jaGlwX2lkOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl9wY2lfdmVuZG9yID0gaXZpZGVvLT5jaGlwX3ZlbmRvcjsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2subWVtb3J5ID0gaXZpZGVvLT52aWRlb19zaXplIC8gMTAyNDsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suaGVhcHN0YXJ0ID0gaXZpZGVvLT5oZWFwc3RhcnQgLyAxMDI0OwogCQlpZihpdmlkZW8tPm1vZGVjaGFuZ2VkKSB7Ci0JCSAgIHguZmJ2aWRtb2RlID0gaXZpZGVvLT5tb2RlX25vOworCQkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suZmJ2aWRtb2RlID0gaXZpZGVvLT5tb2RlX25vOwogCQl9IGVsc2UgewotCQkgICB4LmZidmlkbW9kZSA9IGl2aWRlby0+bW9kZXByZWNoYW5nZTsKKwkJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLmZidmlkbW9kZSA9IGl2aWRlby0+bW9kZXByZWNoYW5nZTsKIAkJfQotCQl4LnNpc2ZiX2NhcHMgPSBpdmlkZW8tPmNhcHM7Ci0JCXguc2lzZmJfdHFsZW4gPSA1MTI7IC8qIHlldCBmaXhlZCAqLwotCQl4LnNpc2ZiX3BjaWJ1cyA9IGl2aWRlby0+cGNpYnVzOwotCQl4LnNpc2ZiX3BjaXNsb3QgPSBpdmlkZW8tPnBjaXNsb3Q7Ci0JCXguc2lzZmJfcGNpZnVuYyA9IGl2aWRlby0+cGNpZnVuYzsKLQkJeC5zaXNmYl9sY2RwZGMgPSBpdmlkZW8tPmRldGVjdGVkcGRjOwotCQl4LnNpc2ZiX2xjZHBkY2EgPSBpdmlkZW8tPmRldGVjdGVkcGRjYTsKLQkJeC5zaXNmYl9sY2RhID0gaXZpZGVvLT5kZXRlY3RlZGxjZGE7Ci0JCXguc2lzZmJfdmJmbGFncyA9IGl2aWRlby0+dmJmbGFnczsKLQkJeC5zaXNmYl9jdXJyZW50dmJmbGFncyA9IGl2aWRlby0+Y3VycmVudHZiZmxhZ3M7Ci0JCXguc2lzZmJfc2NhbGVsY2QgPSBpdmlkZW8tPlNpU19Qci5Vc2VQYW5lbFNjYWxlcjsKLQkJeC5zaXNmYl9zcGVjaWFsdGltaW5nID0gaXZpZGVvLT5TaVNfUHIuU2lTX0N1c3RvbVQ7Ci0JCXguc2lzZmJfaGF2ZWVtaSA9IGl2aWRlby0+U2lTX1ByLkhhdmVFTUkgPyAxIDogMDsKLQkJeC5zaXNmYl9oYXZlZW1pbGNkID0gaXZpZGVvLT5TaVNfUHIuSGF2ZUVNSUxDRCA/IDEgOiAwOwotCQl4LnNpc2ZiX2VtaTMwID0gaXZpZGVvLT5TaVNfUHIuRU1JXzMwOwotCQl4LnNpc2ZiX2VtaTMxID0gaXZpZGVvLT5TaVNfUHIuRU1JXzMxOwotCQl4LnNpc2ZiX2VtaTMyID0gaXZpZGVvLT5TaVNfUHIuRU1JXzMyOwotCQl4LnNpc2ZiX2VtaTMzID0gaXZpZGVvLT5TaVNfUHIuRU1JXzMzOwotCQl4LnNpc2ZiX3R2eHBvcyA9ICh1MTYpKGl2aWRlby0+dHZ4cG9zICsgMzIpOwotCQl4LnNpc2ZiX3R2eXBvcyA9ICh1MTYpKGl2aWRlby0+dHZ5cG9zICsgMzIpOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl9jYXBzID0gaXZpZGVvLT5jYXBzOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl90cWxlbiA9IGl2aWRlby0+Y21kUXVldWVTaXplIC8gMTAyNDsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfcGNpYnVzID0gaXZpZGVvLT5wY2lidXM7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3BjaXNsb3QgPSBpdmlkZW8tPnBjaXNsb3Q7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3BjaWZ1bmMgPSBpdmlkZW8tPnBjaWZ1bmM7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX2xjZHBkYyA9IGl2aWRlby0+ZGV0ZWN0ZWRwZGM7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX2xjZHBkY2EgPSBpdmlkZW8tPmRldGVjdGVkcGRjYTsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfbGNkYSA9IGl2aWRlby0+ZGV0ZWN0ZWRsY2RhOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl92YmZsYWdzID0gaXZpZGVvLT52YmZsYWdzOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl9jdXJyZW50dmJmbGFncyA9IGl2aWRlby0+Y3VycmVudHZiZmxhZ3M7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3NjYWxlbGNkID0gaXZpZGVvLT5TaVNfUHIuVXNlUGFuZWxTY2FsZXI7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3NwZWNpYWx0aW1pbmcgPSBpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVDsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfaGF2ZWVtaSA9IGl2aWRlby0+U2lTX1ByLkhhdmVFTUkgPyAxIDogMDsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfaGF2ZWVtaWxjZCA9IGl2aWRlby0+U2lTX1ByLkhhdmVFTUlMQ0QgPyAxIDogMDsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfZW1pMzAgPSBpdmlkZW8tPlNpU19Qci5FTUlfMzA7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX2VtaTMxID0gaXZpZGVvLT5TaVNfUHIuRU1JXzMxOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl9lbWkzMiA9IGl2aWRlby0+U2lTX1ByLkVNSV8zMjsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfZW1pMzMgPSBpdmlkZW8tPlNpU19Qci5FTUlfMzM7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3R2eHBvcyA9ICh1MTYpKGl2aWRlby0+dHZ4cG9zICsgMzIpOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl90dnlwb3MgPSAodTE2KShpdmlkZW8tPnR2eXBvcyArIDMyKTsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfaGVhcHNpemUgPSBpdmlkZW8tPnNpc2ZiX2hlYXBfc2l6ZSAvIDEwMjQ7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3ZpZGVvb2Zmc2V0ID0gaXZpZGVvLT52aWRlb19vZmZzZXQ7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX2N1cmZzdG4gPSBpdmlkZW8tPmN1ckZTVE47CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX2N1cmRzdG4gPSBpdmlkZW8tPmN1ckRTVE47CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3ZiZmxhZ3MyID0gaXZpZGVvLT52YmZsYWdzMjsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfY2FuX3Bvc3QgPSBpdmlkZW8tPnNpc2ZiX2Nhbl9wb3N0ID8gMSA6IDA7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX2NhcmRfcG9zdGVkID0gaXZpZGVvLT5zaXNmYl9jYXJkX3Bvc3RlZCA/IDEgOiAwOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl93YXNfYm9vdF9kZXZpY2UgPSBpdmlkZW8tPnNpc2ZiX3dhc19ib290X2RldmljZSA/IDEgOiAwOwogCi0JCWlmKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ4LCBzaXplb2YoeCkpKSB7CisJCWlmKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpdmlkZW8tPnNpc2ZiX2luZm9ibG9jaywKKwkJCQkJCXNpemVvZihpdmlkZW8tPnNpc2ZiX2luZm9ibG9jaykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwogCSAgICAgICAgYnJlYWs7CiAKIAkgICBjYXNlIFNJU0ZCX0dFVF9WQlJTVEFUVVNfT0xEOgotCSAgIAlpZihpdmlkZW8tPndhcm5jb3VudCsrIDwgNTApIHsKLQkgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBEZXByZWNhdGVkIGlvY3RsIGNhbGwgcmVjZWl2ZWQgLSB1cGRhdGUgeW91ciBhcHBsaWNhdGlvbiFcbiIpOwotCQl9CisJCWlmKGl2aWRlby0+d2FybmNvdW50KysgPCAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkic2lzZmI6IERlcHJlY2F0ZWQgaW9jdGwgY2FsbCByZWNlaXZlZCAtIHVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIVxuIik7CiAJICAgY2FzZSBTSVNGQl9HRVRfVkJSU1RBVFVTOgotCSAgICAgICAgaWYoc2lzZmJfQ2hlY2tWQlJldHJhY2UoaXZpZGVvKSkgeworCQlpZihzaXNmYl9DaGVja1ZCUmV0cmFjZShpdmlkZW8pKQogCQkJcmV0dXJuIHB1dF91c2VyKCh1MzIpMSwgYXJncCk7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCXJldHVybiBwdXRfdXNlcigodTMyKTAsIGFyZ3ApOwotCQl9CiAKIAkgICBjYXNlIFNJU0ZCX0dFVF9BVVRPTUFYSU1JWkVfT0xEOgotCSAgIAlpZihpdmlkZW8tPndhcm5jb3VudCsrIDwgNTApIHsKLQkgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBEZXByZWNhdGVkIGlvY3RsIGNhbGwgcmVjZWl2ZWQgLSB1cGRhdGUgeW91ciBhcHBsaWNhdGlvbiFcbiIpOwotCQl9CisJCWlmKGl2aWRlby0+d2FybmNvdW50KysgPCAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkic2lzZmI6IERlcHJlY2F0ZWQgaW9jdGwgY2FsbCByZWNlaXZlZCAtIHVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIVxuIik7CiAJICAgY2FzZSBTSVNGQl9HRVRfQVVUT01BWElNSVpFOgotCSAgICAgICAgaWYoaXZpZGVvLT5zaXNmYl9tYXgpCXJldHVybiBwdXRfdXNlcigodTMyKTEsIGFyZ3ApOwotCQllbHNlCQkJcmV0dXJuIHB1dF91c2VyKCh1MzIpMCwgYXJncCk7CisJCWlmKGl2aWRlby0+c2lzZmJfbWF4KQorCQkJcmV0dXJuIHB1dF91c2VyKCh1MzIpMSwgYXJncCk7CisJCWVsc2UKKwkJCXJldHVybiBwdXRfdXNlcigodTMyKTAsIGFyZ3ApOwogCiAJICAgY2FzZSBTSVNGQl9TRVRfQVVUT01BWElNSVpFX09MRDoKLQkgICAJaWYoaXZpZGVvLT53YXJuY291bnQrKyA8IDUwKSB7Ci0JCSAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBEZXByZWNhdGVkIGlvY3RsIGNhbGwgcmVjZWl2ZWQgLSB1cGRhdGUgeW91ciBhcHBsaWNhdGlvbiFcbiIpOwotCQl9CisJCWlmKGl2aWRlby0+d2FybmNvdW50KysgPCAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkic2lzZmI6IERlcHJlY2F0ZWQgaW9jdGwgY2FsbCByZWNlaXZlZCAtIHVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIVxuIik7CiAJICAgY2FzZSBTSVNGQl9TRVRfQVVUT01BWElNSVpFOgotCQlpZihjb3B5X2Zyb21fdXNlcigmZ3B1MzIsIGFyZ3AsIHNpemVvZihncHUzMikpKSB7CisJCWlmKGdldF91c2VyKGdwdTMyLCBhcmdwKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQl9CisKIAkJaXZpZGVvLT5zaXNmYl9tYXggPSAoZ3B1MzIpID8gMSA6IDA7CiAJCWJyZWFrOwogCiAJICAgY2FzZSBTSVNGQl9TRVRfVFZQT1NPRkZTRVQ6Ci0JCWlmKGNvcHlfZnJvbV91c2VyKCZncHUzMiwgYXJncCwgc2l6ZW9mKGdwdTMyKSkpIHsKKwkJaWYoZ2V0X3VzZXIoZ3B1MzIsIGFyZ3ApKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwogCQlzaXNmYl9zZXRfVFZ4cG9zb2Zmc2V0KGl2aWRlbywgKChpbnQpKGdwdTMyID4+IDE2KSkgLSAzMik7CiAJCXNpc2ZiX3NldF9UVnlwb3NvZmZzZXQoaXZpZGVvLCAoKGludCkoZ3B1MzIgJiAweGZmZmYpKSAtIDMyKTsKIAkJYnJlYWs7CiAKIAkgICBjYXNlIFNJU0ZCX0dFVF9UVlBPU09GRlNFVDoKLQkgICAgICAgIHJldHVybiBwdXRfdXNlcigodTMyKSgoKGl2aWRlby0+dHZ4cG9zKzMyKTw8MTYpfCgoaXZpZGVvLT50dnlwb3MrMzIpJjB4ZmZmZikpLAotCQkJCWFyZ3ApOworCQlyZXR1cm4gcHV0X3VzZXIoKHUzMikoKChpdmlkZW8tPnR2eHBvcyszMik8PDE2KXwoKGl2aWRlby0+dHZ5cG9zKzMyKSYweGZmZmYpKSwKKwkJCQkJCQlhcmdwKTsKKworCSAgIGNhc2UgU0lTRkJfQ09NTUFORDoKKwkJaWYoY29weV9mcm9tX3VzZXIoJml2aWRlby0+c2lzZmJfY29tbWFuZCwgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkJCXNpemVvZihzdHJ1Y3Qgc2lzZmJfY21kKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzaXNmYl9oYW5kbGVfY29tbWFuZChpdmlkZW8sICZpdmlkZW8tPnNpc2ZiX2NvbW1hbmQpOworCisJCWlmKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpdmlkZW8tPnNpc2ZiX2NvbW1hbmQsCisJCQkJCQkJc2l6ZW9mKHN0cnVjdCBzaXNmYl9jbWQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWJyZWFrOwogCiAJICAgY2FzZSBTSVNGQl9TRVRfTE9DSzoKLQkJaWYoY29weV9mcm9tX3VzZXIoJmdwdTMyLCBhcmdwLCBzaXplb2YoZ3B1MzIpKSkgeworCQlpZihnZXRfdXNlcihncHUzMiwgYXJncCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQorCiAJCWl2aWRlby0+c2lzZmJsb2NrZWQgPSAoZ3B1MzIpID8gMSA6IDA7CiAJCWJyZWFrOwogCiAJICAgZGVmYXVsdDoKKyNpZmRlZiBTSVNfTkVXX0NPTkZJR19DT01QQVQKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKyNlbHNlCisJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCiAJfQogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3RhdGljIGxvbmcgc2lzZmJfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKKyNpZmRlZiBTSVNfTkVXX0NPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nCitzaXNmYl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlpbnQgcmV0OworCiAJbG9ja19rZXJuZWwoKTsKIAlyZXQgPSBzaXNmYl9pb2N0bChOVUxMLCBmLCBjbWQsIGFyZywgaW5mbyk7CiAJdW5sb2NrX2tlcm5lbCgpOwpAQCAtMjIxOSw3ICsxOTQ2LDcgQEAKIAogCXN0cmNweShmaXgtPmlkLCBpdmlkZW8tPm15aWQpOwogCi0JZml4LT5zbWVtX3N0YXJ0ICA9IGl2aWRlby0+dmlkZW9fYmFzZTsKKwlmaXgtPnNtZW1fc3RhcnQgID0gaXZpZGVvLT52aWRlb19iYXNlICsgaXZpZGVvLT52aWRlb19vZmZzZXQ7CiAJZml4LT5zbWVtX2xlbiAgICA9IGl2aWRlby0+c2lzZmJfbWVtOwogCWZpeC0+dHlwZSAgICAgICAgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CiAJZml4LT50eXBlX2F1eCAgICA9IDA7CkBAIC0yMjMxLDExICsxOTU4LDE3IEBACiAJZml4LT5tbWlvX3N0YXJ0ICA9IGl2aWRlby0+bW1pb19iYXNlOwogCWZpeC0+bW1pb19sZW4gICAgPSBpdmlkZW8tPm1taW9fc2l6ZTsKIAlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLQkgICBmaXgtPmFjY2VsICAgID0gRkJfQUNDRUxfU0lTX0dMQU1PVVI7Ci0JfSBlbHNlIGlmKChpdmlkZW8tPmNoaXAgPT0gU0lTXzMzMCkgfHwgKGl2aWRlby0+Y2hpcCA9PSBTSVNfNzYwKSkgewotCSAgIGZpeC0+YWNjZWwgICAgPSBGQl9BQ0NFTF9TSVNfWEFCUkU7CisJCWZpeC0+YWNjZWwgPSBGQl9BQ0NFTF9TSVNfR0xBTU9VUjsKKwl9IGVsc2UgaWYoKGl2aWRlby0+Y2hpcCA9PSBTSVNfMzMwKSB8fAorCQkgIChpdmlkZW8tPmNoaXAgPT0gU0lTXzc2MCkgfHwKKwkJICAoaXZpZGVvLT5jaGlwID09IFNJU183NjEpKSB7CisJCWZpeC0+YWNjZWwgPSBGQl9BQ0NFTF9TSVNfWEFCUkU7CisJfSBlbHNlIGlmKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApIHsKKwkJZml4LT5hY2NlbCA9IEZCX0FDQ0VMX1hHSV9WT0xBUklfWjsKKwl9IGVsc2UgaWYoaXZpZGVvLT5jaGlwID49IFhHSV80MCkgeworCQlmaXgtPmFjY2VsID0gRkJfQUNDRUxfWEdJX1ZPTEFSSV9WOwogCX0gZWxzZSB7Ci0JICAgZml4LT5hY2NlbCAgICA9IEZCX0FDQ0VMX1NJU19HTEFNT1VSXzI7CisJCWZpeC0+YWNjZWwgPSBGQl9BQ0NFTF9TSVNfR0xBTU9VUl8yOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjI1MSw0MCArMTk4NCw0MSBAQAogCS5mYl9zZXRfdmFyCT0gc2lzZmJfc2V0X3ZhciwKIAkuZmJfZ2V0X2NtYXAJPSBzaXNmYl9nZXRfY21hcCwKIAkuZmJfc2V0X2NtYXAJPSBzaXNmYl9zZXRfY21hcCwKLSAgICAgICAgLmZiX3Bhbl9kaXNwbGF5ID0gc2lzZmJfcGFuX2Rpc3BsYXksCisJLmZiX3Bhbl9kaXNwbGF5ID0gc2lzZmJfcGFuX2Rpc3BsYXksCiAJLmZiX2lvY3RsCT0gc2lzZmJfaW9jdGwKIH07CiAjZW5kaWYKIAogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHNpc2ZiX29wcyA9IHsKLQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQkuZmJfb3BlbiAgICAgICAgPSBzaXNmYl9vcGVuLAotCS5mYl9yZWxlYXNlICAgICA9IHNpc2ZiX3JlbGVhc2UsCi0JLmZiX2NoZWNrX3ZhciAgID0gc2lzZmJfY2hlY2tfdmFyLAotCS5mYl9zZXRfcGFyICAgICA9IHNpc2ZiX3NldF9wYXIsCi0JLmZiX3NldGNvbHJlZyAgID0gc2lzZmJfc2V0Y29scmVnLAotICAgICAgICAuZmJfcGFuX2Rpc3BsYXkgPSBzaXNmYl9wYW5fZGlzcGxheSwKLSAgICAgICAgLmZiX2JsYW5rICAgICAgID0gc2lzZmJfYmxhbmssCi0JLmZiX2ZpbGxyZWN0ICAgID0gZmJjb25fc2lzX2ZpbGxyZWN0LAotCS5mYl9jb3B5YXJlYSAgICA9IGZiY29uX3Npc19jb3B5YXJlYSwKLQkuZmJfaW1hZ2VibGl0ICAgPSBjZmJfaW1hZ2VibGl0LAotCS5mYl9jdXJzb3IgICAgICA9IHNvZnRfY3Vyc29yLAotCS5mYl9zeW5jICAgICAgICA9IGZiY29uX3Npc19zeW5jLAotCS5mYl9pb2N0bCAgICAgICA9IHNpc2ZiX2lvY3RsLAotI2lmZGVmIENPTkZJR19DT01QQVQKLQkuZmJfY29tcGF0X2lvY3RsID0gc2lzZmJfY29tcGF0X2lvY3RsLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZmJfb3Blbgk9IHNpc2ZiX29wZW4sCisJLmZiX3JlbGVhc2UJPSBzaXNmYl9yZWxlYXNlLAorCS5mYl9jaGVja192YXIJPSBzaXNmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIJPSBzaXNmYl9zZXRfcGFyLAorCS5mYl9zZXRjb2xyZWcJPSBzaXNmYl9zZXRjb2xyZWcsCisJLmZiX3Bhbl9kaXNwbGF5CT0gc2lzZmJfcGFuX2Rpc3BsYXksCisJLmZiX2JsYW5rCT0gc2lzZmJfYmxhbmssCisJLmZiX2ZpbGxyZWN0CT0gZmJjb25fc2lzX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYQk9IGZiY29uX3Npc19jb3B5YXJlYSwKKwkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfY3Vyc29yCT0gc29mdF9jdXJzb3IsCisJLmZiX3N5bmMJPSBmYmNvbl9zaXNfc3luYywKKyNpZmRlZiBTSVNfTkVXX0NPTkZJR19DT01QQVQKKwkuZmJfY29tcGF0X2lvY3RsPSBzaXNmYl9jb21wYXRfaW9jdGwsCiAjZW5kaWYKKwkuZmJfaW9jdGwJPSBzaXNmYl9pb2N0bAogfTsKICNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tIENoaXAgZ2VuZXJhdGlvbiBkZXBlbmRlbnQgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKiBzaXNmYl9nZXRfbm9ydGhicmlkZ2UoaW50IGJhc2VjaGlwaWQpCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKiBfX2RldmluaXQKK3Npc2ZiX2dldF9ub3J0aGJyaWRnZShpbnQgYmFzZWNoaXBpZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CiAJaW50IG5icmlkZ2VudW0sIG5icmlkZ2VpZHgsIGk7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgbmJyaWRnZWlkc1tdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBuYnJpZGdlaWRzW10gPSB7CiAJCVBDSV9ERVZJQ0VfSURfU0lfNTQwLAkvKiBmb3IgU2lTIDU0MCBWR0EgKi8KIAkJUENJX0RFVklDRV9JRF9TSV82MzAsCS8qIGZvciBTaVMgNjMwLzczMCBWR0EgKi8KIAkJUENJX0RFVklDRV9JRF9TSV83MzAsCkBAIC0yMjkyLDEzICsyMDI2LDE0IEBACiAJCVBDSV9ERVZJQ0VfSURfU0lfNjUwLCAgIC8qIGZvciBTaVMgNjUwLzY1MS83NDAgVkdBICovCiAJCVBDSV9ERVZJQ0VfSURfU0lfNjUxLAogCQlQQ0lfREVWSUNFX0lEX1NJXzc0MCwKLQkJUENJX0RFVklDRV9JRF9TSV82NjEsCS8qIGZvciBTaVMgNjYxLzc0MS82NjAvNzYwIFZHQSAqLworCQlQQ0lfREVWSUNFX0lEX1NJXzY2MSwJLyogZm9yIFNpUyA2NjEvNzQxLzY2MC83NjAvNzYxIFZHQSAqLwogCQlQQ0lfREVWSUNFX0lEX1NJXzc0MSwKIAkJUENJX0RFVklDRV9JRF9TSV82NjAsCi0JCVBDSV9ERVZJQ0VfSURfU0lfNzYwCisJCVBDSV9ERVZJQ0VfSURfU0lfNzYwLAorCQlQQ0lfREVWSUNFX0lEX1NJXzc2MQogCX07CiAKLSAgICAJc3dpdGNoKGJhc2VjaGlwaWQpIHsKKwlzd2l0Y2goYmFzZWNoaXBpZCkgewogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCiAJY2FzZSBTSVNfNTQwOgluYnJpZGdlaWR4ID0gMDsgbmJyaWRnZW51bSA9IDE7IGJyZWFrOwogCWNhc2UgU0lTXzYzMDoJbmJyaWRnZWlkeCA9IDE7IG5icmlkZ2VudW0gPSAyOyBicmVhazsKQEAgLTIzMDYsMzUgKzIwNDEsNDAgQEAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQogCWNhc2UgU0lTXzU1MDogICBuYnJpZGdlaWR4ID0gMzsgbmJyaWRnZW51bSA9IDE7IGJyZWFrOwogCWNhc2UgU0lTXzY1MDoJbmJyaWRnZWlkeCA9IDQ7IG5icmlkZ2VudW0gPSAzOyBicmVhazsKLQljYXNlIFNJU182NjA6CW5icmlkZ2VpZHggPSA3OyBuYnJpZGdlbnVtID0gNDsgYnJlYWs7CisJY2FzZSBTSVNfNjYwOgluYnJpZGdlaWR4ID0gNzsgbmJyaWRnZW51bSA9IDU7IGJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoJcmV0dXJuIE5VTEw7CiAJfQogCWZvcihpID0gMDsgaSA8IG5icmlkZ2VudW07IGkrKykgewotCQlpZigocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1NJLCBuYnJpZGdlaWRzW25icmlkZ2VpZHgraV0sIE5VTEwpKSkgYnJlYWs7CisJCWlmKChwZGV2ID0gU0lTX1BDSV9HRVRfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksCisJCQkJbmJyaWRnZWlkc1tuYnJpZGdlaWR4K2ldLCBOVUxMKSkpCisJCQlicmVhazsKIAl9CiAJcmV0dXJuIHBkZXY7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNpc2ZiX2dldF9kcmFtX3NpemUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc2lzZmJfZ2V0X2RyYW1fc2l6ZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKICNpZiBkZWZpbmVkKENPTkZJR19GQl9TSVNfMzAwKSB8fCBkZWZpbmVkKENPTkZJR19GQl9TSVNfMzE1KQogCXU4IHJlZzsKICNlbmRpZgogCiAJaXZpZGVvLT52aWRlb19zaXplID0gMDsKKwlpdmlkZW8tPlVNQXNpemUgPSBpdmlkZW8tPkxGQnNpemUgPSAwOwogCiAJc3dpdGNoKGl2aWRlby0+Y2hpcCkgewogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCiAJY2FzZSBTSVNfMzAwOgotCSAgICAgICAgaW5TSVNJRFhSRUcoU0lTU1IsIDB4MTQsIHJlZyk7CisJCWluU0lTSURYUkVHKFNJU1NSLCAweDE0LCByZWcpOwogCQlpdmlkZW8tPnZpZGVvX3NpemUgPSAoKHJlZyAmIDB4M0YpICsgMSkgPDwgMjA7CiAJCWJyZWFrOwogCWNhc2UgU0lTXzU0MDoKIAljYXNlIFNJU182MzA6CiAJY2FzZSBTSVNfNzMwOgotCSAgIAlpZighaXZpZGVvLT5uYnJpZGdlKSByZXR1cm4gLTE7Ci0JICAgCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGl2aWRlby0+bmJyaWRnZSwgMHg2MywgJnJlZyk7CisJCWlmKCFpdmlkZW8tPm5icmlkZ2UpCisJCQlyZXR1cm4gLTE7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGl2aWRlby0+bmJyaWRnZSwgMHg2MywgJnJlZyk7CiAJCWl2aWRlby0+dmlkZW9fc2l6ZSA9IDEgPDwgKCgocmVnICYgMHg3MCkgPj4gNCkgKyAyMSk7CiAJCWJyZWFrOwogI2VuZGlmCkBAIC0yMzQyLDQ1ICsyMDgyLDY4IEBACiAJY2FzZSBTSVNfMzE1SDoKIAljYXNlIFNJU18zMTVQUk86CiAJY2FzZSBTSVNfMzE1OgotCSAgIAlpblNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgcmVnKTsKKwkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4MTQsIHJlZyk7CiAJCWl2aWRlby0+dmlkZW9fc2l6ZSA9ICgxIDw8ICgocmVnICYgMHhmMCkgPj4gNCkpIDw8IDIwOwogCQlzd2l0Y2goKHJlZyA+PiAyKSAmIDB4MDMpIHsKIAkJY2FzZSAweDAxOgogCQljYXNlIDB4MDM6Ci0JCSAgIGl2aWRlby0+dmlkZW9fc2l6ZSA8PD0gMTsKLQkJICAgYnJlYWs7CisJCQlpdmlkZW8tPnZpZGVvX3NpemUgPDw9IDE7CisJCQlicmVhazsKIAkJY2FzZSAweDAyOgotCQkgICBpdmlkZW8tPnZpZGVvX3NpemUgKz0gKGl2aWRlby0+dmlkZW9fc2l6ZS8yKTsKKwkJCWl2aWRlby0+dmlkZW9fc2l6ZSArPSAoaXZpZGVvLT52aWRlb19zaXplLzIpOwogCQl9Ci0JICAgCWJyZWFrOworCQlicmVhazsKIAljYXNlIFNJU18zMzA6Ci0JICAgCWluU0lTSURYUkVHKFNJU1NSLCAweDE0LCByZWcpOworCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgcmVnKTsKIAkJaXZpZGVvLT52aWRlb19zaXplID0gKDEgPDwgKChyZWcgJiAweGYwKSA+PiA0KSkgPDwgMjA7CiAJCWlmKHJlZyAmIDB4MGMpIGl2aWRlby0+dmlkZW9fc2l6ZSA8PD0gMTsKLQkgICAJYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgU0lTXzU1MDoKIAljYXNlIFNJU182NTA6CiAJY2FzZSBTSVNfNzQwOgotCSAgICAJaW5TSVNJRFhSRUcoU0lTU1IsIDB4MTQsIHJlZyk7CisJCWluU0lTSURYUkVHKFNJU1NSLCAweDE0LCByZWcpOwogCQlpdmlkZW8tPnZpZGVvX3NpemUgPSAoKChyZWcgJiAweDNmKSArIDEpIDw8IDIpIDw8IDIwOwogCQlicmVhazsKIAljYXNlIFNJU182NjE6CiAJY2FzZSBTSVNfNzQxOgotCSAgICAgCWluU0lTSURYUkVHKFNJU0NSLCAweDc5LCByZWcpOworCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg3OSwgcmVnKTsKIAkJaXZpZGVvLT52aWRlb19zaXplID0gKDEgPDwgKChyZWcgJiAweGYwKSA+PiA0KSkgPDwgMjA7Ci0JICAgCWJyZWFrOworCQlicmVhazsKIAljYXNlIFNJU182NjA6CiAJY2FzZSBTSVNfNzYwOgorCWNhc2UgU0lTXzc2MToKIAkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4NzksIHJlZyk7CiAJCXJlZyA9IChyZWcgJiAweGYwKSA+PiA0OwotCQlpZihyZWcpCWl2aWRlby0+dmlkZW9fc2l6ZSA9ICgxIDw8IHJlZykgPDwgMjA7CisJCWlmKHJlZykJeworCQkJaXZpZGVvLT52aWRlb19zaXplID0gKDEgPDwgcmVnKSA8PCAyMDsKKwkJCWl2aWRlby0+VU1Bc2l6ZSA9IGl2aWRlby0+dmlkZW9fc2l6ZTsKKwkJfQogCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg3OCwgcmVnKTsKIAkJcmVnICY9IDB4MzA7CiAJCWlmKHJlZykgewotCQkgICBpZihyZWcgPT0gMHgxMCkgaXZpZGVvLT52aWRlb19zaXplICs9ICgzMiA8PCAyMCk7Ci0JCSAgIGVsc2UJCSAgIGl2aWRlby0+dmlkZW9fc2l6ZSArPSAoNjQgPDwgMjApOworCQkJaWYocmVnID09IDB4MTApIHsKKwkJCQlpdmlkZW8tPkxGQnNpemUgPSAoMzIgPDwgMjApOworCQkJfSBlbHNlIHsKKwkJCQlpdmlkZW8tPkxGQnNpemUgPSAoNjQgPDwgMjApOworCQkJfQorCQkJaXZpZGVvLT52aWRlb19zaXplICs9IGl2aWRlby0+TEZCc2l6ZTsKIAkJfQotCSAgIAlicmVhazsKKwkJYnJlYWs7CisJY2FzZSBTSVNfMzQwOgorCWNhc2UgWEdJXzIwOgorCWNhc2UgWEdJXzQwOgorCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgcmVnKTsKKwkJaXZpZGVvLT52aWRlb19zaXplID0gKDEgPDwgKChyZWcgJiAweGYwKSA+PiA0KSkgPDwgMjA7CisJCWlmKGl2aWRlby0+Y2hpcCAhPSBYR0lfMjApIHsKKwkJCXJlZyA9IChyZWcgJiAweDBjKSA+PiAyOworCQkJaWYoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSB7CisJCQkJaWYocmVnICYgMHgwMSkgcmVnID0gMHgwMjsKKwkJCQllbHNlCSAgICAgICByZWcgPSAweDAwOworCQkJfQorCQkJaWYocmVnID09IDB4MDIpCQlpdmlkZW8tPnZpZGVvX3NpemUgPDw9IDE7CisJCQllbHNlIGlmKHJlZyA9PSAweDAzKQlpdmlkZW8tPnZpZGVvX3NpemUgPDw9IDI7CisJCX0KKwkJYnJlYWs7CiAjZW5kaWYKIAlkZWZhdWx0OgogCQlyZXR1cm4gLTE7CkBAIC0yMzkwLDE3ICsyMTUzLDI0IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tIHZpZGVvIGJyaWRnZSBkZXZpY2UgZGV0ZWN0aW9uIC0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgc2lzZmJfZGV0ZWN0X1ZCX2Nvbm5lY3Qoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK3Npc2ZiX2RldGVjdF9WQl9jb25uZWN0KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewogCXU4IGNyMzIsIHRlbXA7CiAKKwkvKiBObyBDUlQyIG9uIFhHSSBaNyAqLworCWlmKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApIHsKKwkJaXZpZGVvLT5zaXNmYl9jcnQxb2ZmID0gMDsKKwkJcmV0dXJuOworCX0KKwogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCiAJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7CiAJCWluU0lTSURYUkVHKFNJU1NSLCAweDE3LCB0ZW1wKTsKIAkJaWYoKHRlbXAgJiAweDBGKSAmJiAoaXZpZGVvLT5jaGlwICE9IFNJU18zMDApKSB7CiAJCQkvKiBQQUwvTlRTQyBpcyBzdG9yZWQgb24gU1IxNiBvbiBzdWNoIG1hY2hpbmVzICovCiAJCQlpZighKGl2aWRlby0+dmJmbGFncyAmIChUVl9QQUwgfCBUVl9OVFNDIHwgVFZfUEFMTSB8IFRWX1BBTE4pKSkgewotCQkgICAJCWluU0lTSURYUkVHKFNJU1NSLCAweDE2LCB0ZW1wKTsKKwkJCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgdGVtcCk7CiAJCQkJaWYodGVtcCAmIDB4MjApCiAJCQkJCWl2aWRlby0+dmJmbGFncyB8PSBUVl9QQUw7CiAJCQkJZWxzZQpAQCAtMjQzNSwyOCArMjIwNSwyOSBAQAogCiAJaWYoaXZpZGVvLT5zaXNmYl90dnBsdWcgIT0gLTEpIHsKIAkgICBpZiggKGl2aWRlby0+c2lzdmdhX2VuZ2luZSAhPSBTSVNfMzE1X1ZHQSkgfHwKLQkgICAgICAgKCEoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUN8VkJfMzAxTFZ8VkJfMzAyTFYpKSkgKSB7CisJICAgICAgICghKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTWVBCUFJCUklER0UpKSApIHsKIAkgICAgICBpZihpdmlkZW8tPnNpc2ZiX3R2cGx1ZyAmIFRWX1lQQlBSKSB7Ci0JICAgICAgICAgaXZpZGVvLT5zaXNmYl90dnBsdWcgPSAtMTsKKwkJIGl2aWRlby0+c2lzZmJfdHZwbHVnID0gLTE7CiAJCSBwcmludGsoS0VSTl9FUlIgInNpc2ZiOiBZUGJQciBub3Qgc3VwcG9ydGVkXG4iKTsKIAkgICAgICB9CiAJICAgfQogCX0KIAlpZihpdmlkZW8tPnNpc2ZiX3R2cGx1ZyAhPSAtMSkgewogCSAgIGlmKCAoaXZpZGVvLT5zaXN2Z2FfZW5naW5lICE9IFNJU18zMTVfVkdBKSB8fAotCSAgICAgICAoIShpdmlkZW8tPnZiZmxhZ3MgJiAoVkJfMzAxfFZCXzMwMUJ8VkJfMzAyQikpKSApIHsKKwkgICAgICAgKCEoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9TSVNISVZJU0lPTkJSSURHRSkpICkgewogCSAgICAgIGlmKGl2aWRlby0+c2lzZmJfdHZwbHVnICYgVFZfSElWSVNJT04pIHsKLQkgICAgICAgICBpdmlkZW8tPnNpc2ZiX3R2cGx1ZyA9IC0xOworCQkgaXZpZGVvLT5zaXNmYl90dnBsdWcgPSAtMTsKIAkJIHByaW50ayhLRVJOX0VSUiAic2lzZmI6IEhpVmlzaW9uIG5vdCBzdXBwb3J0ZWRcbiIpOwogCSAgICAgIH0KIAkgICB9CiAJfQogCWlmKGl2aWRlby0+c2lzZmJfdHZzdGQgIT0gLTEpIHsKLQkgICBpZiggKCEoaXZpZGVvLT52YmZsYWdzICYgVkJfU0lTQlJJREdFKSkgJiYKLQkgICAgICAgKCEoKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgJiYgKGl2aWRlby0+dmJmbGFncyAmIFZCX0NIUk9OVEVMKSkpICkgeworCSAgIGlmKCAoIShpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU0JSSURHRSkpICYmCisJICAgICAgICghKChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpICYmCisJCQkoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9DSFJPTlRFTCkpKSApIHsKIAkgICAgICBpZihpdmlkZW8tPnNpc2ZiX3R2c3RkICYgKFRWX1BBTE4gfCBUVl9QQUxOIHwgVFZfTlRTQ0opKSB7Ci0JICAgICAgICAgaXZpZGVvLT5zaXNmYl90dnN0ZCA9IC0xOwotCSAgICAgICAgIHByaW50ayhLRVJOX0VSUiAic2lzZmI6IFBBTE0vUEFMTi9OVFNDSiBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJIGl2aWRlby0+c2lzZmJfdHZzdGQgPSAtMTsKKwkJIHByaW50ayhLRVJOX0VSUiAic2lzZmI6IFBBTE0vUEFMTi9OVFNDSiBub3Qgc3VwcG9ydGVkXG4iKTsKIAkgICAgICB9CiAJICAgfQogCX0KQEAgLTI0NjgsNyArMjIzOSw3IEBACiAJCWlmKGNyMzIgJiBTSVNfVkJfWVBCUFIpICAgICAJIGl2aWRlby0+dmJmbGFncyB8PSAoVFZfWVBCUFJ8VFZfWVBCUFI1MjVJKTsgLyogZGVmYXVsdDogNDgwaSAqLwogCQllbHNlIGlmKGNyMzIgJiBTSVNfVkJfSElWSVNJT04pICBpdmlkZW8tPnZiZmxhZ3MgfD0gVFZfSElWSVNJT047CiAJCWVsc2UgaWYoY3IzMiAmIFNJU19WQl9TQ0FSVCkgICAgIGl2aWRlby0+dmJmbGFncyB8PSBUVl9TQ0FSVDsKLQkgCWVsc2UgeworCQllbHNlIHsKIAkJCWlmKGNyMzIgJiBTSVNfVkJfU1ZJREVPKSAgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVFZfU1ZJREVPOwogCQkJaWYoY3IzMiAmIFNJU19WQl9DT01QT1NJVEUpIGl2aWRlby0+dmJmbGFncyB8PSBUVl9BVklERU87CiAJCX0KQEAgLTI0ODUsMTY1ICsyMjU2LDQ0IEBACiAJICAgIH0KIAkgICAgaWYoIShpdmlkZW8tPnZiZmxhZ3MgJiAoVFZfUEFMIHwgVFZfTlRTQyB8IFRWX1BBTE0gfCBUVl9QQUxOIHwgVFZfTlRTQ0opKSkgewogCQlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLQkgICAgICAgIAlpblNJU0lEWFJFRyhTSVNTUiwgMHgzOCwgdGVtcCk7CisJCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgzOCwgdGVtcCk7CiAJCQlpZih0ZW1wICYgMHgwMSkgaXZpZGVvLT52YmZsYWdzIHw9IFRWX1BBTDsKIAkJCWVsc2UJCWl2aWRlby0+dmJmbGFncyB8PSBUVl9OVFNDOwogCQl9IGVsc2UgaWYoKGl2aWRlby0+Y2hpcCA8PSBTSVNfMzE1UFJPKSB8fCAoaXZpZGVvLT5jaGlwID49IFNJU18zMzApKSB7Ci0gICAgICAgICAgICAgICAgCWluU0lTSURYUkVHKFNJU1NSLCAweDM4LCB0ZW1wKTsKKwkJCWluU0lTSURYUkVHKFNJU1NSLCAweDM4LCB0ZW1wKTsKIAkJCWlmKHRlbXAgJiAweDAxKSBpdmlkZW8tPnZiZmxhZ3MgfD0gVFZfUEFMOwogCQkJZWxzZQkJaXZpZGVvLT52YmZsYWdzIHw9IFRWX05UU0M7Ci0JICAgIAl9IGVsc2UgewotCSAgICAgICAgCWluU0lTSURYUkVHKFNJU0NSLCAweDc5LCB0ZW1wKTsKKwkJfSBlbHNlIHsKKwkJCWluU0lTSURYUkVHKFNJU0NSLCAweDc5LCB0ZW1wKTsKIAkJCWlmKHRlbXAgJiAweDIwKQlpdmlkZW8tPnZiZmxhZ3MgfD0gVFZfUEFMOwogCQkJZWxzZQkJaXZpZGVvLT52YmZsYWdzIHw9IFRWX05UU0M7Ci0JICAgIAl9CisJCX0KIAkgICAgfQogCX0KIAogCS8qIENvcHkgZm9yY2VDUlQxIG9wdGlvbiB0byBDUlQxb2ZmIGlmIG9wdGlvbiBpcyBnaXZlbiAqLwotICAgIAlpZihpdmlkZW8tPnNpc2ZiX2ZvcmNlY3J0MSAhPSAtMSkgewotICAgIAkgICBpdmlkZW8tPnNpc2ZiX2NydDFvZmYgPSAoaXZpZGVvLT5zaXNmYl9mb3JjZWNydDEpID8gMCA6IDE7Ci0gICAgCX0KLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHNpc2ZiX2dldF9WQl90eXBlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQotewotCWNoYXIgc3Rkc3RyW10gICAgPSAic2lzZmI6IERldGVjdGVkIjsKLQljaGFyIGJyaWRnZXN0cltdID0gInZpZGVvIGJyaWRnZSI7Ci0JdTggdmJfY2hpcGlkOwotCXU4IHJlZzsKLQotCWluU0lTSURYUkVHKFNJU1BBUlQ0LCAweDAwLCB2Yl9jaGlwaWQpOwotCXN3aXRjaCh2Yl9jaGlwaWQpIHsKLQljYXNlIDB4MDE6Ci0JCWluU0lTSURYUkVHKFNJU1BBUlQ0LCAweDAxLCByZWcpOwotCQlpZihyZWcgPCAweGIwKSB7Ci0JCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAxOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAxICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7Ci0JCX0gZWxzZSBpZihyZWcgPCAweGMwKSB7Ci0JCSAJaXZpZGVvLT52YmZsYWdzIHw9IFZCXzMwMUI7Ci0JCQlpblNJU0lEWFJFRyhTSVNQQVJUNCwweDIzLHJlZyk7Ci0JCQlpZighKHJlZyAmIDB4MDIpKSB7Ci0JCQkgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzB4QkRIOwotCQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAxQi1ESCAlc1xuIiwgc3Rkc3RyLCBicmlkZ2VzdHIpOwotCQkJfSBlbHNlIHsKLQkJCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMUIgJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKLQkJCX0KLQkJfSBlbHNlIGlmKHJlZyA8IDB4ZDApIHsKLQkJIAlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAxQzsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMUMgJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKLQkJfSBlbHNlIGlmKHJlZyA8IDB4ZTApIHsKLQkJCWl2aWRlby0+dmJmbGFncyB8PSBWQl8zMDFMVjsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMUxWICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7Ci0JCX0gZWxzZSBpZihyZWcgPD0gMHhlMSkgewotCQkgICAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MzkscmVnKTsKLQkJCWlmKHJlZyA9PSAweGZmKSB7Ci0JCQkgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAyTFY7Ci0JCQkgICBwcmludGsoS0VSTl9JTkZPICIlcyBTaVMzMDJMViAlc1xuIiwgc3Rkc3RyLCBicmlkZ2VzdHIpOwotCQkJfSBlbHNlIHsKLQkJCSAgIGl2aWRlby0+dmJmbGFncyB8PSBWQl8zMDFDOwotCQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAxQyhQNCkgJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKLSNpZiAwCi0JCQkgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAyRUxWOwotCQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAyRUxWICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7Ci0jZW5kaWYKLQkJCX0KLQkJfQotCQlicmVhazsKLQljYXNlIDB4MDI6Ci0JCWl2aWRlby0+dmJmbGFncyB8PSBWQl8zMDJCOwotCQlwcmludGsoS0VSTl9JTkZPICIlcyBTaVMzMDJCICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7Ci0JCWJyZWFrOwotCX0KLQotCWlmKCghKGl2aWRlby0+dmJmbGFncyAmIFZCX1ZJREVPQlJJREdFKSkgJiYgKGl2aWRlby0+Y2hpcCAhPSBTSVNfMzAwKSkgewotCQlpblNJU0lEWFJFRyhTSVNDUiwgMHgzNywgcmVnKTsKLQkJcmVnICY9IFNJU19FWFRFUk5BTF9DSElQX01BU0s7Ci0JCXJlZyA+Pj0gMTsKLQkJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0jaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKLQkJCXN3aXRjaChyZWcpIHsKLQkJCSAgIGNhc2UgU0lTX0VYVEVSTkFMX0NISVBfTFZEUzoKLQkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfTFZEUzsKLQkJCQlicmVhazsKLQkJCSAgIGNhc2UgU0lTX0VYVEVSTkFMX0NISVBfVFJVTVBJT046Ci0JCQkJaXZpZGVvLT52YmZsYWdzIHw9IFZCX1RSVU1QSU9OOwotCQkJCWJyZWFrOwotCQkJICAgY2FzZSBTSVNfRVhURVJOQUxfQ0hJUF9DSFJPTlRFTDoKLQkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfQ0hST05URUw7Ci0JCQkJYnJlYWs7Ci0JCQkgICBjYXNlIFNJU19FWFRFUk5BTF9DSElQX0xWRFNfQ0hST05URUw6Ci0JCQkJaXZpZGVvLT52YmZsYWdzIHw9IChWQl9MVkRTIHwgVkJfQ0hST05URUwpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfQ0hST05URUwpIGl2aWRlby0+Y2hyb250ZWx0eXBlID0gMTsKLSNlbmRpZgotCQl9IGVsc2UgaWYoaXZpZGVvLT5jaGlwIDwgU0lTXzY2MSkgewotI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Ci0JCQlzd2l0Y2ggKHJlZykgewotCSAJICAgCSAgIGNhc2UgU0lTMzEwX0VYVEVSTkFMX0NISVBfTFZEUzoKLQkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfTFZEUzsKLQkJCQlicmVhazsKLQkJICAgCSAgIGNhc2UgU0lTMzEwX0VYVEVSTkFMX0NISVBfTFZEU19DSFJPTlRFTDoKLQkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gKFZCX0xWRFMgfCBWQl9DSFJPTlRFTCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZihpdmlkZW8tPnZiZmxhZ3MgJiBWQl9DSFJPTlRFTCkgaXZpZGVvLT5jaHJvbnRlbHR5cGUgPSAyOwotI2VuZGlmCi0JCX0gZWxzZSBpZihpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgewotI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Ci0JCQlpblNJU0lEWFJFRyhTSVNDUiwgMHgzOCwgcmVnKTsKLQkJCXJlZyA+Pj0gNTsKLQkJCXN3aXRjaChyZWcpIHsKLQkJCSAgIGNhc2UgMHgwMjoKLQkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfTFZEUzsKLQkJCQlicmVhazsKLQkJCSAgIGNhc2UgMHgwMzoKLQkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gKFZCX0xWRFMgfCBWQl9DSFJPTlRFTCk7Ci0JCQkJYnJlYWs7Ci0JCQkgICBjYXNlIDB4MDQ6Ci0JCQkJaXZpZGVvLT52YmZsYWdzIHw9IChWQl9MVkRTIHwgVkJfQ09ORVhBTlQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfQ0hST05URUwpIGl2aWRlby0+Y2hyb250ZWx0eXBlID0gMjsKLSNlbmRpZgotCQl9Ci0JCWlmKGl2aWRlby0+dmJmbGFncyAmIFZCX0xWRFMpIHsKLQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgTFZEUyB0cmFuc21pdHRlclxuIiwgc3Rkc3RyKTsKLQkJfQotCQlpZihpdmlkZW8tPnZiZmxhZ3MgJiBWQl9UUlVNUElPTikgewotCQkgICBwcmludGsoS0VSTl9JTkZPICIlcyBUcnVtcGlvbiBadXJhYyBMQ0Qgc2NhbGVyXG4iLCBzdGRzdHIpOwotCQl9Ci0JCWlmKGl2aWRlby0+dmJmbGFncyAmIFZCX0NIUk9OVEVMKSB7Ci0JCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIENocm9udGVsIFRWIGVuY29kZXJcbiIsIHN0ZHN0cik7Ci0JCX0KLQkJaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfQ09ORVhBTlQpIHsKLQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgQ29uZXhhbnQgZXh0ZXJuYWwgZGV2aWNlXG4iLCBzdGRzdHIpOwotCQl9Ci0JfQotCi0JaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfU0lTQlJJREdFKSB7Ci0JCVNpU19TZW5zZTMweChpdmlkZW8pOwotCX0gZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MgJiBWQl9DSFJPTlRFTCkgewotCQlTaVNfU2Vuc2VDaChpdmlkZW8pOworCWlmKGl2aWRlby0+c2lzZmJfZm9yY2VjcnQxICE9IC0xKSB7CisJICAgaXZpZGVvLT5zaXNmYl9jcnQxb2ZmID0gKGl2aWRlby0+c2lzZmJfZm9yY2VjcnQxKSA/IDAgOiAxOwogCX0KIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIFNlbnNpbmcgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBCT09MRUFOIF9fZGV2aW5pdCBzaXNmYl90ZXN0X0REQzEoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCitzdGF0aWMgQk9PTEVBTiBfX2RldmluaXQKK3Npc2ZiX3Rlc3RfRERDMShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKICAgICB1bnNpZ25lZCBzaG9ydCBvbGQ7CiAgICAgaW50IGNvdW50ID0gNDg7CiAKICAgICBvbGQgPSBTaVNfUmVhZEREQzFCaXQoJml2aWRlby0+U2lTX1ByKTsKICAgICBkbyB7Ci0gICAgICAgCWlmKG9sZCAhPSBTaVNfUmVhZEREQzFCaXQoJml2aWRlby0+U2lTX1ByKSkgYnJlYWs7CisJaWYob2xkICE9IFNpU19SZWFkRERDMUJpdCgmaXZpZGVvLT5TaVNfUHIpKSBicmVhazsKICAgICB9IHdoaWxlKGNvdW50LS0pOwogICAgIHJldHVybiAoY291bnQgPT0gLTEpID8gRkFMU0UgOiBUUlVFOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgc2lzZmJfc2Vuc2VfY3J0MShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc2lzZmJfc2Vuc2VfY3J0MShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKICAgICBCT09MRUFOIG11c3R3YWl0ID0gRkFMU0U7CiAgICAgdTggIHNyMUYsIGNyMTc7CkBAIC0yNjk5LDcgKzIzNDksOCBAQAogICAgIGlmKHRlbXAgPT0gMHhmZmZmKSB7CiAgICAgICAgaSA9IDM7CiAgICAgICAgZG8gewotICAgICAgICAgIHRlbXAgPSBTaVNfSGFuZGxlRERDKCZpdmlkZW8tPlNpU19QciwgaXZpZGVvLT52YmZsYWdzLCBpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsIDAsIDAsIE5VTEwpOworCSAgdGVtcCA9IFNpU19IYW5kbGVEREMoJml2aWRlby0+U2lTX1ByLCBpdmlkZW8tPnZiZmxhZ3MsCisJCWl2aWRlby0+c2lzdmdhX2VuZ2luZSwgMCwgMCwgTlVMTCwgaXZpZGVvLT52YmZsYWdzMik7CiAgICAgICAgfSB3aGlsZSgoKHRlbXAgPT0gMCkgfHwgKHRlbXAgPT0gMHhmZmZmKSkgJiYgaS0tKTsKIAogICAgICAgIGlmKCh0ZW1wID09IDApIHx8ICh0ZW1wID09IDB4ZmZmZikpIHsKQEAgLTI3MjMsNyArMjM3NCw5NiBAQAogfQogCiAvKiBEZXRlcm1pbmUgYW5kIGRldGVjdCBhdHRhY2hlZCBkZXZpY2VzIG9uIFNpUzMweCAqLwotc3RhdGljIGludCBfX2RldmluaXQgU0lTRG9TZW5zZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgdTE2IHR5cGUsIHUxNiB0ZXN0KQorc3RhdGljIHZvaWQgX19kZXZpbml0CitTaVNfU2Vuc2VMQ0Qoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbMjU2XTsKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wLCByZWFsY3J0bm8sIGk7CisJdTggcmVnLCBjcjM3ID0gMCwgcGFuZWx0eXBlID0gMDsKKwl1MTYgeHJlcywgeXJlczsKKworCWl2aWRlby0+U2lTX1ByLlBhbmVsU2VsZkRldGVjdGVkID0gRkFMU0U7CisKKwkvKiBMQ0QgZGV0ZWN0aW9uIG9ubHkgZm9yIFRNRFMgYnJpZGdlcyAqLworCWlmKCEoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9TSVNUTURTQlJJREdFKSkKKwkJcmV0dXJuOworCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfMzB4QkRIKQorCQlyZXR1cm47CisKKwkvKiBJZiBMQ0QgYWxyZWFkeSBzZXQgdXAgYnkgQklPUywgc2tpcCBpdCAqLworCWluU0lTSURYUkVHKFNJU0NSLCAweDMyLCByZWcpOworCWlmKHJlZyAmIDB4MDgpCisJCXJldHVybjsKKworCXJlYWxjcnRubyA9IDE7CisJaWYoaXZpZGVvLT5TaVNfUHIuRERDUG9ydE1peHVwKQorCQlyZWFsY3J0bm8gPSAwOworCisJLyogQ2hlY2sgRERDIGNhcGFiaWxpdGllcyAqLworCXRlbXAgPSBTaVNfSGFuZGxlRERDKCZpdmlkZW8tPlNpU19QciwgaXZpZGVvLT52YmZsYWdzLCBpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsCisJCQkJcmVhbGNydG5vLCAwLCAmYnVmZmVyWzBdLCBpdmlkZW8tPnZiZmxhZ3MyKTsKKworCWlmKCghdGVtcCkgfHwgKHRlbXAgPT0gMHhmZmZmKSB8fCAoISh0ZW1wICYgMHgwMikpKQorCQlyZXR1cm47CisKKwkvKiBSZWFkIEREQyBkYXRhICovCisJaSA9IDM7ICAvKiBOdW1iZXIgb2YgcmV0cnlzICovCisJZG8geworCQl0ZW1wID0gU2lTX0hhbmRsZUREQygmaXZpZGVvLT5TaVNfUHIsIGl2aWRlby0+dmJmbGFncywKKwkJCQlpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsIHJlYWxjcnRubywgMSwKKwkJCQkmYnVmZmVyWzBdLCBpdmlkZW8tPnZiZmxhZ3MyKTsKKwl9IHdoaWxlKCh0ZW1wKSAmJiBpLS0pOworCisJaWYodGVtcCkKKwkJcmV0dXJuOworCisJLyogTm8gZGlnaXRhbCBkZXZpY2UgKi8KKwlpZighKGJ1ZmZlclsweDE0XSAmIDB4ODApKQorCQlyZXR1cm47CisKKwkvKiBGaXJzdCBkZXRhaWxlZCB0aW1pbmcgcHJlZmVycmVkIHRpbWluZz8gKi8KKwlpZighKGJ1ZmZlclsweDE4XSAmIDB4MDIpKQorCQlyZXR1cm47CisKKwl4cmVzID0gYnVmZmVyWzB4MzhdIHwgKChidWZmZXJbMHgzYV0gJiAweGYwKSA8PCA0KTsKKwl5cmVzID0gYnVmZmVyWzB4M2JdIHwgKChidWZmZXJbMHgzZF0gJiAweGYwKSA8PCA0KTsKKworCXN3aXRjaCh4cmVzKSB7CisJCWNhc2UgMTAyNDoKKwkJCWlmKHlyZXMgPT0gNzY4KQorCQkJCXBhbmVsdHlwZSA9IDB4MDI7CisJCQlicmVhazsKKwkJY2FzZSAxMjgwOgorCQkJaWYoeXJlcyA9PSAxMDI0KQorCQkJCXBhbmVsdHlwZSA9IDB4MDM7CisJCQlicmVhazsKKwkJY2FzZSAxNjAwOgorCQkJaWYoKHlyZXMgPT0gMTIwMCkgJiYgKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfMzB4QykpCisJCQkJcGFuZWx0eXBlID0gMHgwYjsKKwkJCWJyZWFrOworCX0KKworCWlmKCFwYW5lbHR5cGUpCisJCXJldHVybjsKKworCWlmKGJ1ZmZlclsweDIzXSkKKwkJY3IzNyB8PSAweDEwOworCisJaWYoKGJ1ZmZlclsweDQ3XSAmIDB4MTgpID09IDB4MTgpCisJCWNyMzcgfD0gKCgoKGJ1ZmZlclsweDQ3XSAmIDB4MDYpIF4gMHgwNikgPDwgNSkgfCAweDIwKTsKKwllbHNlCisJCWNyMzcgfD0gMHhjMDsKKworCW91dFNJU0lEWFJFRyhTSVNDUiwgMHgzNiwgcGFuZWx0eXBlKTsKKwljcjM3ICY9IDB4ZjE7CisJc2V0U0lTSURYUkVHKFNJU0NSLCAweDM3LCAweDBjLCBjcjM3KTsKKwlvclNJU0lEWFJFRyhTSVNDUiwgMHgzMiwgMHgwOCk7CisKKwlpdmlkZW8tPlNpU19Qci5QYW5lbFNlbGZEZXRlY3RlZCA9IFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitTSVNEb1NlbnNlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCB1MTYgdHlwZSwgdTE2IHRlc3QpCiB7CiAgICAgaW50IHRlbXAsIG15dGVzdCwgcmVzdWx0LCBpLCBqOwogCkBAIC0yNzQ5LDEwICsyNDg5LDExIEBACiAgICAgICAgfQogICAgICAgIGlmKChyZXN1bHQgPT0gMCkgfHwgKHJlc3VsdCA+PSAyKSkgYnJlYWs7CiAgICAgfQotICAgIHJldHVybihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBTaVNfU2Vuc2UzMHgoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK1NpU19TZW5zZTMweChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKICAgICB1OCAgYmFja3VwUDRfMGQsYmFja3VwUDJfMDAsYmFja3VwUDJfNGQsYmFja3VwU1JfMWUsYmlvc2ZsYWc9MDsKICAgICB1MTYgc3Zocz0wLCBzdmhzX2M9MDsKQEAgLTI3NjIsMzYgKzI1MDMsNTEgQEAKICAgICBjaGFyIHN0ZHN0cltdID0gInNpc2ZiOiBEZXRlY3RlZCI7CiAgICAgY2hhciB0dnN0cltdICA9ICJUViBjb25uZWN0ZWQgdG8iOwogCi0gICAgaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfMzAxKSB7CisgICAgaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMDEpIHsKICAgICAgICBzdmhzID0gMHgwMGI5OyBjdmJzID0gMHgwMGIzOyB2Z2EyID0gMHgwMGQxOwogICAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MDEsbXlmbGFnKTsKICAgICAgICBpZihteWZsYWcgJiAweDA0KSB7CiAJICBzdmhzID0gMHgwMGRkOyBjdmJzID0gMHgwMGVlOyB2Z2EyID0gMHgwMGZkOwogICAgICAgIH0KLSAgICB9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUIgfCBWQl8zMDJCKSkgeworICAgIH0gZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MyICYgKFZCMl8zMDFCIHwgVkIyXzMwMkIpKSB7CiAgICAgICAgc3ZocyA9IDB4MDE2YjsgY3ZicyA9IDB4MDE3NDsgdmdhMiA9IDB4MDE5MDsKLSAgICB9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUxWIHwgVkJfMzAyTFYpKSB7CisgICAgfSBlbHNlIGlmKGl2aWRlby0+dmJmbGFnczIgJiAoVkIyXzMwMUxWIHwgVkIyXzMwMkxWKSkgewogICAgICAgIHN2aHMgPSAweDAyMDA7IGN2YnMgPSAweDAxMDA7Ci0gICAgfSBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIChWQl8zMDFDIHwgVkJfMzAyRUxWKSkgeworICAgIH0gZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MyICYgKFZCMl8zMDFDIHwgVkIyXzMwMkVMViB8IFZCMl8zMDdUIHwgVkIyXzMwN0xWKSkgewogICAgICAgIHN2aHMgPSAweDAxNmI7IGN2YnMgPSAweDAxMTA7IHZnYTIgPSAweDAxOTA7Ci0gICAgfSBlbHNlIHJldHVybjsKKyAgICB9IGVsc2UKKyAgICAgICByZXR1cm47CiAKICAgICB2Z2EyX2MgPSAweDBlMDg7IHN2aHNfYyA9IDB4MDQwNDsgY3Zic19jID0gMHgwODA0OwotICAgIGlmKGl2aWRlby0+dmJmbGFncyAmIChWQl8zMDFMVnxWQl8zMDJMVnxWQl8zMDJFTFYpKSB7CisgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCMl8zMDFMVnxWQjJfMzAyTFZ8VkIyXzMwMkVMVnxWQjJfMzA3TFYpKSB7CiAgICAgICAgc3Zoc19jID0gMHgwNDA4OyBjdmJzX2MgPSAweDA4MDg7CiAgICAgfQorCiAgICAgYmlvc2ZsYWcgPSAyOworICAgIGlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworICAgICAgIGJpb3NmbGFnID0gaXZpZGVvLT5iaW9zX2FiYXNlWzB4NThdICYgMHgwMzsKKyAgICB9IGVsc2UgaWYoaXZpZGVvLT5uZXdyb20pIHsKKyAgICAgICBpZihpdmlkZW8tPmJpb3NfYWJhc2VbMHg1ZF0gJiAweDA0KSBiaW9zZmxhZyB8PSAweDAxOworICAgIH0gZWxzZSBpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKyAgICAgICBpZihpdmlkZW8tPmJpb3NfYWJhc2UpIHsKKyAgICAgICAgICBiaW9zZmxhZyA9IGl2aWRlby0+Ymlvc19hYmFzZVsweGZlXSAmIDB4MDM7CisgICAgICAgfQorICAgIH0KIAogICAgIGlmKGl2aWRlby0+Y2hpcCA9PSBTSVNfMzAwKSB7CiAgICAgICAgaW5TSVNJRFhSRUcoU0lTU1IsMHgzYixteWZsYWcpOwogICAgICAgIGlmKCEobXlmbGFnICYgMHgwMSkpIHZnYTIgPSB2Z2EyX2MgPSAwOwogICAgIH0KIAorICAgIGlmKCEoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9TSVNWR0EyQlJJREdFKSkgeworICAgICAgIHZnYTIgPSB2Z2EyX2MgPSAwOworICAgIH0KKwogICAgIGluU0lTSURYUkVHKFNJU1NSLDB4MWUsYmFja3VwU1JfMWUpOwogICAgIG9yU0lTSURYUkVHKFNJU1NSLDB4MWUsMHgyMCk7CiAKICAgICBpblNJU0lEWFJFRyhTSVNQQVJUNCwweDBkLGJhY2t1cFA0XzBkKTsKLSAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBWQl8zMDFDKSB7CisgICAgaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhDKSB7CiAgICAgICAgc2V0U0lTSURYUkVHKFNJU1BBUlQ0LDB4MGQsfjB4MDcsMHgwMSk7CiAgICAgfSBlbHNlIHsKICAgICAgICBvclNJU0lEWFJFRyhTSVNQQVJUNCwweDBkLDB4MDQpOwpAQCAtMjgwMiwxMSArMjU1OCwxMSBAQAogICAgIG91dFNJU0lEWFJFRyhTSVNQQVJUMiwweDAwLCgoYmFja3VwUDJfMDAgfCAweDFjKSAmIDB4ZmMpKTsKIAogICAgIGluU0lTSURYUkVHKFNJU1BBUlQyLDB4NGQsYmFja3VwUDJfNGQpOwotICAgIGlmKGl2aWRlby0+dmJmbGFncyAmIChWQl8zMDFDfFZCXzMwMUxWfFZCXzMwMkxWfFZCXzMwMkVMVikpIHsKKyAgICBpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU1lQQlBSQlJJREdFKSB7CiAgICAgICAgb3V0U0lTSURYUkVHKFNJU1BBUlQyLDB4NGQsKGJhY2t1cFAyXzRkICYgfjB4MTApKTsKICAgICB9CiAKLSAgICBpZighKGl2aWRlby0+dmJmbGFncyAmIFZCXzMwMUMpKSB7CisgICAgaWYoIShpdmlkZW8tPnZiZmxhZ3MyICYgVkIyXzMweENMVikpIHsKICAgICAgICBTSVNEb1NlbnNlKGl2aWRlbywgMCwgMCk7CiAgICAgfQogCkBAIC0yODI2LDEyICsyNTgyLDExIEBACiAKICAgICBhbmRTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIDB4M2YpOwogCi0gICAgaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfMzAxQykgeworICAgIGlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfMzB4Q0xWKSB7CiAgICAgICAgb3JTSVNJRFhSRUcoU0lTUEFSVDQsMHgwZCwweDA0KTsKICAgICB9CiAKLSAgICBpZigoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSAmJgotICAgICAgIChpdmlkZW8tPnZiZmxhZ3MgJiAoVkJfMzAxQ3xWQl8zMDFMVnxWQl8zMDJMVnxWQl8zMDJFTFYpKSkgeworICAgIGlmKChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpICYmIChpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU1lQQlBSQlJJREdFKSkgewogICAgICAgIG91dFNJU0lEWFJFRyhTSVNQQVJUMiwweDRkLChiYWNrdXBQMl80ZCB8IDB4MTApKTsKICAgICAgICBTaVNfRERDMkRlbGF5KCZpdmlkZW8tPlNpU19QciwgMHgyMDAwKTsKICAgICAgICBpZigocmVzdWx0ID0gU0lTRG9TZW5zZShpdmlkZW8sIHN2aHMsIDB4MDYwNCkpKSB7CkBAIC0yODY0LDcgKzI2MTksNyBAQAogICAgIG91dFNJU0lEWFJFRyhTSVNQQVJUNCwweDBkLGJhY2t1cFA0XzBkKTsKICAgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgxZSxiYWNrdXBTUl8xZSk7CiAKLSAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBWQl8zMDFDKSB7CisgICAgaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhDTFYpIHsKICAgICAgICBpblNJU0lEWFJFRyhTSVNQQVJUMiwweDAwLGJpb3NmbGFnKTsKICAgICAgICBpZihiaW9zZmxhZyAmIDB4MjApIHsKICAgICAgICAgICBmb3IobXlmbGFnID0gMjsgbXlmbGFnID4gMDsgbXlmbGFnLS0pIHsKQEAgLTI4NzgsNyArMjYzMyw4IEBACiB9CiAKIC8qIERldGVybWluZSBhbmQgZGV0ZWN0IGF0dGFjaGVkIFRWJ3Mgb24gQ2hyb250ZWwgKi8KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBTaVNfU2Vuc2VDaChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorU2lTX1NlbnNlQ2goc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfRkJfU0lTXzMwMCkgfHwgZGVmaW5lZChDT05GSUdfRkJfU0lTXzMxNSkKICAgICB1OCB0ZW1wMSwgdGVtcDI7CkBAIC0yODk5LDcgKzI2NTUsNyBAQAogICAgICAgIC8qIFNlZSBDaHJvbnRlbCBUQjMxIGZvciBleHBsYW5hdGlvbiAqLwogICAgICAgIHRlbXAyID0gU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGUpOwogICAgICAgIGlmKCgodGVtcDIgJiAweDA3KSA9PSAweDAxKSB8fCAodGVtcDIgJiAweDA0KSkgewotCSAgU2lTX1NldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGIwZSk7CisJICBTaVNfU2V0Q0g3MDB4KCZpdmlkZW8tPlNpU19QciwgMHgwZSwgMHgwYik7CiAJICBTaVNfRERDMkRlbGF5KCZpdmlkZW8tPlNpU19QciwgMzAwKTsKICAgICAgICB9CiAgICAgICAgdGVtcDIgPSBTaVNfR2V0Q0g3MDB4KCZpdmlkZW8tPlNpU19QciwgMHgyNSk7CkBAIC0yOTA5LDE1ICsyNjY1LDE1IEBACiAJICAgLyogUmVhZCBwb3dlciBzdGF0dXMgKi8KIAkgICB0ZW1wMSA9IFNpU19HZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDBlKTsKIAkgICBpZigodGVtcDEgJiAweDAzKSAhPSAweDAzKSB7Ci0gICAgIAkgICAgICAgIC8qIFBvd2VyIGFsbCBvdXRwdXRzICovCi0JCVNpU19TZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDBCMEUpOworCQkvKiBQb3dlciBhbGwgb3V0cHV0cyAqLworCQlTaVNfU2V0Q0g3MDB4KCZpdmlkZW8tPlNpU19QciwgMHgwZSwweDBiKTsKIAkJU2lTX0REQzJEZWxheSgmaXZpZGVvLT5TaVNfUHIsIDMwMCk7CiAJICAgfQogCSAgIC8qIFNlbnNlIGNvbm5lY3RlZCBUViBkZXZpY2VzICovCiAJICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JICAgICAgIFNpU19TZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDAxMTApOworCSAgICAgICBTaVNfU2V0Q0g3MDB4KCZpdmlkZW8tPlNpU19QciwgMHgxMCwgMHgwMSk7CiAJICAgICAgIFNpU19EREMyRGVsYXkoJml2aWRlby0+U2lTX1ByLCAweDk2KTsKLQkgICAgICAgU2lTX1NldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MDAxMCk7CisJICAgICAgIFNpU19TZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDEwLCAweDAwKTsKIAkgICAgICAgU2lTX0REQzJEZWxheSgmaXZpZGVvLT5TaVNfUHIsIDB4OTYpOwogCSAgICAgICB0ZW1wMSA9IFNpU19HZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDEwKTsKIAkgICAgICAgaWYoISh0ZW1wMSAmIDB4MDgpKSAgICAgICB0ZXN0W2ldID0gMHgwMjsKQEAgLTI5MzAsNyArMjY4Niw3IEBACiAJICAgZWxzZSBpZih0ZXN0WzBdID09IHRlc3RbMl0pIHRlbXAxID0gdGVzdFswXTsKIAkgICBlbHNlIGlmKHRlc3RbMV0gPT0gdGVzdFsyXSkgdGVtcDEgPSB0ZXN0WzFdOwogCSAgIGVsc2UgewotCSAgIAlwcmludGsoS0VSTl9JTkZPCisJCXByaW50ayhLRVJOX0lORk8KIAkJCSJzaXNmYjogVFYgZGV0ZWN0aW9uIHVucmVsaWFibGUgLSB0ZXN0IHJlc3VsdHMgdmFyaWVkXG4iKTsKIAkJdGVtcDEgPSB0ZXN0WzJdOwogCSAgIH0KQEAgLTI5NDUsMTEgKzI3MDEsMTEgQEAKIAkJb3JTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIDB4MDEpOwogCQlhbmRTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIH4weDA2KTsKIAkgICB9IGVsc2UgewotIAkJU2lTX1NldENINzB4eEFORE9SKCZpdmlkZW8tPlNpU19QciwgMHgwMTBFLDB4RjgpOworCQlTaVNfU2V0Q0g3MHh4QU5ET1IoJml2aWRlby0+U2lTX1ByLCAweDBlLCAweDAxLCAweEY4KTsKIAkJYW5kU0lTSURYUkVHKFNJU0NSLCAweDMyLCB+MHgwNyk7CiAJICAgfQogICAgICAgIH0gZWxzZSBpZih0ZW1wMSA9PSAwKSB7Ci0JICBTaVNfU2V0Q0g3MHh4QU5ET1IoJml2aWRlby0+U2lTX1ByLCAweDAxMEUsMHhGOCk7CisJICBTaVNfU2V0Q0g3MHh4QU5ET1IoJml2aWRlby0+U2lTX1ByLCAweDBlLCAweDAxLCAweEY4KTsKIAkgIGFuZFNJU0lEWFJFRyhTSVNDUiwgMHgzMiwgfjB4MDcpOwogICAgICAgIH0KICAgICAgICAvKiBTZXQgZ2VuZXJhbCBwdXJwb3NlIElPIGZvciBDaHJvbnRlbCBjb21tdW5pY2F0aW9uICovCkBAIC0yOTYwLDE5ICsyNzE2LDE5IEBACiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQogCWl2aWRlby0+U2lTX1ByLlNpU19JRl9ERUZfQ0g3MHh4ID0gMjsJCS8qIENocm9udGVsIDcwMTkgKi8KLSAgICAgICAgdGVtcDEgPSBTaVNfR2V0Q0g3MDF4KCZpdmlkZW8tPlNpU19QciwgMHg0OSk7Ci0JU2lTX1NldENINzAxeCgmaXZpZGVvLT5TaVNfUHIsIDB4MjA0OSk7CisJdGVtcDEgPSBTaVNfR2V0Q0g3MDF4KCZpdmlkZW8tPlNpU19QciwgMHg0OSk7CisJU2lTX1NldENINzAxeCgmaXZpZGVvLT5TaVNfUHIsIDB4NDksIDB4MjApOwogCVNpU19EREMyRGVsYXkoJml2aWRlby0+U2lTX1ByLCAweDk2KTsKIAl0ZW1wMiA9IFNpU19HZXRDSDcwMXgoJml2aWRlby0+U2lTX1ByLCAweDIwKTsKIAl0ZW1wMiB8PSAweDAxOwotCVNpU19TZXRDSDcwMXgoJml2aWRlby0+U2lTX1ByLCAodGVtcDIgPDwgOCkgfCAweDIwKTsKKwlTaVNfU2V0Q0g3MDF4KCZpdmlkZW8tPlNpU19QciwgMHgyMCwgdGVtcDIpOwogCVNpU19EREMyRGVsYXkoJml2aWRlby0+U2lTX1ByLCAweDk2KTsKIAl0ZW1wMiBePSAweDAxOwotCVNpU19TZXRDSDcwMXgoJml2aWRlby0+U2lTX1ByLCAodGVtcDIgPDwgOCkgfCAweDIwKTsKKwlTaVNfU2V0Q0g3MDF4KCZpdmlkZW8tPlNpU19QciwgMHgyMCwgdGVtcDIpOwogCVNpU19EREMyRGVsYXkoJml2aWRlby0+U2lTX1ByLCAweDk2KTsKIAl0ZW1wMiA9IFNpU19HZXRDSDcwMXgoJml2aWRlby0+U2lTX1ByLCAweDIwKTsKLQlTaVNfU2V0Q0g3MDF4KCZpdmlkZW8tPlNpU19QciwgKHRlbXAxIDw8IDgpIHwgMHg0OSk7Ci0gICAgICAgIHRlbXAxID0gMDsKKwlTaVNfU2V0Q0g3MDF4KCZpdmlkZW8tPlNpU19QciwgMHg0OSwgdGVtcDEpOworCXRlbXAxID0gMDsKIAlpZih0ZW1wMiAmIDB4MDIpIHRlbXAxIHw9IDB4MDE7CiAJaWYodGVtcDIgJiAweDEwKSB0ZW1wMSB8PSAweDAxOwogCWlmKHRlbXAyICYgMHgwNCkgdGVtcDEgfD0gMHgwMjsKQEAgLTI5ODMsMTggKzI3MzksMTggQEAKIAkgICAgIGl2aWRlby0+dmJmbGFncyB8PSBUVl9BVklERU87CiAJICAgICBvclNJU0lEWFJFRyhTSVNDUiwgMHgzMiwgMHgwMSk7CiAJICAgICBhbmRTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIH4weDA2KTsKLSAgICAgICAgICAgICBicmVhazsKKwkgICAgIGJyZWFrOwogCWNhc2UgMHgwMjoKIAkgICAgIHByaW50ayhLRVJOX0lORk8gIiVzIFNWSURFTyBvdXRwdXRcbiIsIHN0ZHN0cik7CiAJICAgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVFZfU1ZJREVPOwogCSAgICAgb3JTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIDB4MDIpOwogCSAgICAgYW5kU0lTSURYUkVHKFNJU0NSLCAweDMyLCB+MHgwNSk7Ci0gICAgICAgICAgICAgYnJlYWs7CisJICAgICBicmVhazsKIAljYXNlIDB4MDQ6CiAJICAgICBwcmludGsoS0VSTl9JTkZPICIlcyBTQ0FSVCBvdXRwdXRcbiIsIHN0ZHN0cik7CiAJICAgICBvclNJU0lEWFJFRyhTSVNDUiwgMHgzMiwgMHgwNCk7CiAJICAgICBhbmRTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIH4weDAzKTsKLSAgICAgICAgICAgICBicmVhazsKKwkgICAgIGJyZWFrOwogCWRlZmF1bHQ6CiAJICAgICBhbmRTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIH4weDA3KTsKIAl9CkBAIC0zMDAyLDEzICsyNzU4LDQ0OSBAQAogICAgIH0KIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhlYXAgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc2lzZmJfZ2V0X1ZCX3R5cGUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCit7CisJY2hhciBzdGRzdHJbXSAgICA9ICJzaXNmYjogRGV0ZWN0ZWQiOworCWNoYXIgYnJpZGdlc3RyW10gPSAidmlkZW8gYnJpZGdlIjsKKwl1OCB2Yl9jaGlwaWQ7CisJdTggcmVnOworCisJLyogTm8gQ1JUMiBvbiBYR0kgWjcgKi8KKwlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKQorCQlyZXR1cm47CisKKwlpblNJU0lEWFJFRyhTSVNQQVJUNCwgMHgwMCwgdmJfY2hpcGlkKTsKKwlzd2l0Y2godmJfY2hpcGlkKSB7CisJY2FzZSAweDAxOgorCQlpblNJU0lEWFJFRyhTSVNQQVJUNCwgMHgwMSwgcmVnKTsKKwkJaWYocmVnIDwgMHhiMCkgeworCQkJaXZpZGVvLT52YmZsYWdzIHw9IFZCXzMwMTsJLyogRGVwcmVjYXRlZCAqLworCQkJaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfMzAxOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAxICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7CisJCX0gZWxzZSBpZihyZWcgPCAweGMwKSB7CisJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAxQjsJLyogRGVwcmVjYXRlZCAqLworCQkJaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfMzAxQjsKKwkJCWluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MjMscmVnKTsKKwkJCWlmKCEocmVnICYgMHgwMikpIHsKKwkJCSAgIGl2aWRlby0+dmJmbGFncyB8PSBWQl8zMHhCREg7CS8qIERlcHJlY2F0ZWQgKi8KKwkJCSAgIGl2aWRlby0+dmJmbGFnczIgfD0gVkIyXzMweEJESDsKKwkJCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMUItREggJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKKwkJCX0gZWxzZSB7CisJCQkgICBwcmludGsoS0VSTl9JTkZPICIlcyBTaVMzMDFCICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7CisJCQl9CisJCX0gZWxzZSBpZihyZWcgPCAweGQwKSB7CisJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAxQzsJLyogRGVwcmVjYXRlZCAqLworCQkJaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfMzAxQzsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMUMgJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKKwkJfSBlbHNlIGlmKHJlZyA8IDB4ZTApIHsKKwkJCWl2aWRlby0+dmJmbGFncyB8PSBWQl8zMDFMVjsJLyogRGVwcmVjYXRlZCAqLworCQkJaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfMzAxTFY7CisJCQlwcmludGsoS0VSTl9JTkZPICIlcyBTaVMzMDFMViAlc1xuIiwgc3Rkc3RyLCBicmlkZ2VzdHIpOworCQl9IGVsc2UgaWYocmVnIDw9IDB4ZTEpIHsKKwkJCWluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MzkscmVnKTsKKwkJCWlmKHJlZyA9PSAweGZmKSB7CisJCQkgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAyTFY7CS8qIERlcHJlY2F0ZWQgKi8KKwkJCSAgIGl2aWRlby0+dmJmbGFnczIgfD0gVkIyXzMwMkxWOworCQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAyTFYgJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKKwkJCX0gZWxzZSB7CisJCQkgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAxQzsJLyogRGVwcmVjYXRlZCAqLworCQkJICAgaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfMzAxQzsKKwkJCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMUMoUDQpICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7CisjaWYgMAorCQkJICAgaXZpZGVvLT52YmZsYWdzIHw9IFZCXzMwMkVMVjsJLyogRGVwcmVjYXRlZCAqLworCQkJICAgaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfMzAyRUxWOworCQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAyRUxWICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7CisjZW5kaWYKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIDB4MDI6CisJCWl2aWRlby0+dmJmbGFncyB8PSBWQl8zMDJCOwkvKiBEZXByZWNhdGVkICovCisJCWl2aWRlby0+dmJmbGFnczIgfD0gVkIyXzMwMkI7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMkIgJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKKwkJYnJlYWs7CisJfQorCisJaWYoKCEoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9WSURFT0JSSURHRSkpICYmIChpdmlkZW8tPmNoaXAgIT0gU0lTXzMwMCkpIHsKKwkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MzcsIHJlZyk7CisJCXJlZyAmPSBTSVNfRVhURVJOQUxfQ0hJUF9NQVNLOworCQlyZWcgPj49IDE7CisJCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCisJCQlzd2l0Y2gocmVnKSB7CisJCQkgICBjYXNlIFNJU19FWFRFUk5BTF9DSElQX0xWRFM6CisJCQkJaXZpZGVvLT52YmZsYWdzIHw9IFZCX0xWRFM7CS8qIERlcHJlY2F0ZWQgKi8KKwkJCQlpdmlkZW8tPnZiZmxhZ3MyIHw9IFZCMl9MVkRTOworCQkJCWJyZWFrOworCQkJICAgY2FzZSBTSVNfRVhURVJOQUxfQ0hJUF9UUlVNUElPTjoKKwkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gKFZCX0xWRFMgfCBWQl9UUlVNUElPTik7CS8qIERlcHJlY2F0ZWQgKi8KKwkJCQlpdmlkZW8tPnZiZmxhZ3MyIHw9IChWQjJfTFZEUyB8IFZCMl9UUlVNUElPTik7CisJCQkJYnJlYWs7CisJCQkgICBjYXNlIFNJU19FWFRFUk5BTF9DSElQX0NIUk9OVEVMOgorCQkJCWl2aWRlby0+dmJmbGFncyB8PSBWQl9DSFJPTlRFTDsJLyogRGVwcmVjYXRlZCAqLworCQkJCWl2aWRlby0+dmJmbGFnczIgfD0gVkIyX0NIUk9OVEVMOworCQkJCWJyZWFrOworCQkJICAgY2FzZSBTSVNfRVhURVJOQUxfQ0hJUF9MVkRTX0NIUk9OVEVMOgorCQkJCWl2aWRlby0+dmJmbGFncyB8PSAoVkJfTFZEUyB8IFZCX0NIUk9OVEVMKTsJLyogRGVwcmVjYXRlZCAqLworCQkJCWl2aWRlby0+dmJmbGFnczIgfD0gKFZCMl9MVkRTIHwgVkIyX0NIUk9OVEVMKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfQ0hST05URUwpIGl2aWRlby0+Y2hyb250ZWx0eXBlID0gMTsKKyNlbmRpZgorCQl9IGVsc2UgaWYoaXZpZGVvLT5jaGlwIDwgU0lTXzY2MSkgeworI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CisJCQlzd2l0Y2ggKHJlZykgeworCQkJICAgY2FzZSBTSVMzMTBfRVhURVJOQUxfQ0hJUF9MVkRTOgorCQkJCWl2aWRlby0+dmJmbGFncyB8PSBWQl9MVkRTOwkvKiBEZXByZWNhdGVkICovCisJCQkJaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfTFZEUzsKKwkJCQlicmVhazsKKwkJCSAgIGNhc2UgU0lTMzEwX0VYVEVSTkFMX0NISVBfTFZEU19DSFJPTlRFTDoKKwkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gKFZCX0xWRFMgfCBWQl9DSFJPTlRFTCk7CS8qIERlcHJlY2F0ZWQgKi8KKwkJCQlpdmlkZW8tPnZiZmxhZ3MyIHw9IChWQjJfTFZEUyB8IFZCMl9DSFJPTlRFTCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX0NIUk9OVEVMKSBpdmlkZW8tPmNocm9udGVsdHlwZSA9IDI7CisjZW5kaWYKKwkJfSBlbHNlIGlmKGl2aWRlby0+Y2hpcCA+PSBTSVNfNjYxKSB7CisjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKKwkJCWluU0lTSURYUkVHKFNJU0NSLCAweDM4LCByZWcpOworCQkJcmVnID4+PSA1OworCQkJc3dpdGNoKHJlZykgeworCQkJICAgY2FzZSAweDAyOgorCQkJCWl2aWRlby0+dmJmbGFncyB8PSBWQl9MVkRTOwkvKiBEZXByZWNhdGVkICovCisJCQkJaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfTFZEUzsKKwkJCQlicmVhazsKKwkJCSAgIGNhc2UgMHgwMzoKKwkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gKFZCX0xWRFMgfCBWQl9DSFJPTlRFTCk7CS8qIERlcHJlY2F0ZWQgKi8KKwkJCQlpdmlkZW8tPnZiZmxhZ3MyIHw9IChWQjJfTFZEUyB8IFZCMl9DSFJPTlRFTCk7CisJCQkJYnJlYWs7CisJCQkgICBjYXNlIDB4MDQ6CisJCQkJaXZpZGVvLT52YmZsYWdzIHw9IChWQl9MVkRTIHwgVkJfQ09ORVhBTlQpOwkvKiBEZXByZWNhdGVkICovCisJCQkJaXZpZGVvLT52YmZsYWdzMiB8PSAoVkIyX0xWRFMgfCBWQjJfQ09ORVhBTlQpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9DSFJPTlRFTCkgaXZpZGVvLT5jaHJvbnRlbHR5cGUgPSAyOworI2VuZGlmCisJCX0KKwkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9MVkRTKSB7CisJCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIExWRFMgdHJhbnNtaXR0ZXJcbiIsIHN0ZHN0cik7CisJCX0KKwkJaWYoKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgJiYgKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfVFJVTVBJT04pKSB7CisJCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIFRydW1waW9uIFp1cmFjIExDRCBzY2FsZXJcbiIsIHN0ZHN0cik7CisJCX0KKwkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9DSFJPTlRFTCkgeworCQkgICBwcmludGsoS0VSTl9JTkZPICIlcyBDaHJvbnRlbCBUViBlbmNvZGVyXG4iLCBzdGRzdHIpOworCQl9CisJCWlmKChpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgJiYgKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfQ09ORVhBTlQpKSB7CisJCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIENvbmV4YW50IGV4dGVybmFsIGRldmljZVxuIiwgc3Rkc3RyKTsKKwkJfQorCX0KKworCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTQlJJREdFKSB7CisJCVNpU19TZW5zZUxDRChpdmlkZW8pOworCQlTaVNfU2Vuc2UzMHgoaXZpZGVvKTsKKwl9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9DSFJPTlRFTCkgeworCQlTaVNfU2Vuc2VDaChpdmlkZW8pOworCX0KK30KKworLyogLS0tLS0tLS0tLSBFbmdpbmUgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitzaXNmYl9lbmdpbmVfaW5pdChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKK3sKKworCS8qIEluaXRpYWxpemUgY29tbWFuZCBxdWV1ZSAod2UgdXNlIE1NSU8gb25seSkgKi8KKworCS8qIEJFRk9SRSBUSElTIElTIENBTExFRCwgVEhFIEVOR0lORVMgKk1VU1QqIEJFIFNZTkMnRUQgKi8KKworCWl2aWRlby0+Y2FwcyAmPSB+KFRVUkJPX1FVRVVFX0NBUCAgICB8CisJCQkgIE1NSU9fQ01EX1FVRVVFX0NBUCB8CisJCQkgIFZNX0NNRF9RVUVVRV9DQVAgICB8CisJCQkgIEFHUF9DTURfUVVFVUVfQ0FQKTsKKworI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCisJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7CisJCXUzMiB0cXVldWVfcG9zOworCQl1OCB0cV9zdGF0ZTsKKworCQl0cXVldWVfcG9zID0gKGl2aWRlby0+dmlkZW9fc2l6ZSAtIGl2aWRlby0+Y21kUXVldWVTaXplKSAvICg2NCAqIDEwMjQpOworCisJCWluU0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1RVUkJPUVVFVUVfU0VULCB0cV9zdGF0ZSk7CisJCXRxX3N0YXRlIHw9IDB4ZjA7CisJCXRxX3N0YXRlICY9IDB4ZmM7CisJCXRxX3N0YXRlIHw9ICh1OCkodHF1ZXVlX3BvcyA+PiA4KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1RVUkJPUVVFVUVfU0VULCB0cV9zdGF0ZSk7CisKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1RVUkJPUVVFVUVfQURSLCAodTgpKHRxdWV1ZV9wb3MgJiAweGZmKSk7CisKKwkJaXZpZGVvLT5jYXBzIHw9IFRVUkJPX1FVRVVFX0NBUDsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CisJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7CisJCXUzMiB0ZW1wcSA9IDAsIHRlbXBsOworCQl1OCAgdGVtcDsKKworCQlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSB7CisJCQlzd2l0Y2goaXZpZGVvLT5jbWRRdWV1ZVNpemUpIHsKKwkJCWNhc2UgKDY0ICogMTAyNCk6CisJCQkJdGVtcCA9IFNJU19DTURfUVVFVUVfU0laRV9aN182NGs7CisJCQkJYnJlYWs7CisJCQljYXNlICgxMjggKiAxMDI0KToKKwkJCWRlZmF1bHQ6CisJCQkJdGVtcCA9IFNJU19DTURfUVVFVUVfU0laRV9aN18xMjhrOworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoKGl2aWRlby0+Y21kUXVldWVTaXplKSB7CisJCQljYXNlICg0ICogMTAyNCAqIDEwMjQpOgorCQkJCXRlbXAgPSBTSVNfQ01EX1FVRVVFX1NJWkVfNE07CisJCQkJYnJlYWs7CisJCQljYXNlICgyICogMTAyNCAqIDEwMjQpOgorCQkJCXRlbXAgPSBTSVNfQ01EX1FVRVVFX1NJWkVfMk07CisJCQkJYnJlYWs7CisJCQljYXNlICgxICogMTAyNCAqIDEwMjQpOgorCQkJCXRlbXAgPSBTSVNfQ01EX1FVRVVFX1NJWkVfMU07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJY2FzZSAoNTEyICogMTAyNCk6CisJCQkJdGVtcCA9IFNJU19DTURfUVVFVUVfU0laRV81MTJrOworCQkJfQorCQl9CisKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX0NNRFFVRVVFX1RIUkVTSE9MRCwgQ09NTUFORF9RVUVVRV9USFJFU0hPTEQpOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfQ01EUVVFVUVfU0VULCBTSVNfQ01EX1FVRVVFX1JFU0VUKTsKKworCQlpZigoaXZpZGVvLT5jaGlwID49IFhHSV80MCkgJiYgaXZpZGVvLT5tb2RlY2hhbmdlZCkgeworCQkJLyogTXVzdCBkaXNhYmxlIGR1YWwgcGlwZSBvbiBYR0lfNDAuIENhbid0IGRvCisJCQkgKiB0aGlzIGluIE1NSU8gbW9kZSwgYmVjYXVzZSBpdCByZXF1aXJlcworCQkJICogc2V0dGluZy9jbGVhcmluZyBhIGJpdCBpbiB0aGUgTU1JTyBmaXJlIHRyaWdnZXIKKwkJCSAqIHJlZ2lzdGVyLgorCQkJICovCisJCQlpZighKCh0ZW1wbCA9IE1NSU9fSU4zMihpdmlkZW8tPm1taW9fdmJhc2UsIDB4ODI0MCkpICYgKDEgPDwgMTApKSkgeworCisJCQkJTU1JT19PVVQzMihpdmlkZW8tPm1taW9fdmJhc2UsIFFfV1JJVEVfUFRSLCAwKTsKKworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgSU5EX1NJU19DTURRVUVVRV9TRVQsICh0ZW1wIHwgU0lTX1ZSQU1fQ01EUVVFVUVfRU5BQkxFKSk7CisKKwkJCQl0ZW1wcSA9IE1NSU9fSU4zMihpdmlkZW8tPm1taW9fdmJhc2UsIFFfUkVBRF9QVFIpOworCQkJCU1NSU9fT1VUMzIoaXZpZGVvLT5tbWlvX3ZiYXNlLCBRX1dSSVRFX1BUUiwgdGVtcHEpOworCisJCQkJdGVtcHEgPSAodTMyKShpdmlkZW8tPnZpZGVvX3NpemUgLSBpdmlkZW8tPmNtZFF1ZXVlU2l6ZSk7CisJCQkJTU1JT19PVVQzMihpdmlkZW8tPm1taW9fdmJhc2UsIFFfQkFTRV9BRERSLCB0ZW1wcSk7CisKKwkJCQl3cml0ZWwoMHgxNjgwMDAwMCArIDB4ODI0MCwgaXZpZGVvLT52aWRlb192YmFzZSArIHRlbXBxKTsKKwkJCQl3cml0ZWwodGVtcGwgfCAoMSA8PCAxMCksIGl2aWRlby0+dmlkZW9fdmJhc2UgKyB0ZW1wcSArIDQpOworCQkJCXdyaXRlbCgweDE2OEYwMDAwLCBpdmlkZW8tPnZpZGVvX3ZiYXNlICsgdGVtcHEgKyA4KTsKKwkJCQl3cml0ZWwoMHgxNjhGMDAwMCwgaXZpZGVvLT52aWRlb192YmFzZSArIHRlbXBxICsgMTIpOworCisJCQkJTU1JT19PVVQzMihpdmlkZW8tPm1taW9fdmJhc2UsIFFfV1JJVEVfUFRSLCAodGVtcHEgKyAxNikpOworCisJCQkJc2lzZmJfc3luY2FjY2VsKGl2aWRlbyk7CisKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfQ01EUVVFVUVfU0VULCBTSVNfQ01EX1FVRVVFX1JFU0VUKTsKKworCQkJfQorCQl9CisKKwkJdGVtcHEgPSBNTUlPX0lOMzIoaXZpZGVvLT5tbWlvX3ZiYXNlLCBNTUlPX1FVRVVFX1JFQURQT1JUKTsKKwkJTU1JT19PVVQzMihpdmlkZW8tPm1taW9fdmJhc2UsIE1NSU9fUVVFVUVfV1JJVEVQT1JULCB0ZW1wcSk7CisKKwkJdGVtcCB8PSAoU0lTX01NSU9fQ01EX0VOQUJMRSB8IFNJU19DTURfQVVUT19DT1JSKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX0NNRFFVRVVFX1NFVCwgdGVtcCk7CisKKwkJdGVtcHEgPSAodTMyKShpdmlkZW8tPnZpZGVvX3NpemUgLSBpdmlkZW8tPmNtZFF1ZXVlU2l6ZSk7CisJCU1NSU9fT1VUMzIoaXZpZGVvLT5tbWlvX3ZiYXNlLCBNTUlPX1FVRVVFX1BIWUJBU0UsIHRlbXBxKTsKKworCQlpdmlkZW8tPmNhcHMgfD0gTU1JT19DTURfUVVFVUVfQ0FQOworCX0KKyNlbmRpZgorCisJaXZpZGVvLT5lbmdpbmVvayA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc2lzZmJfZGV0ZWN0X2xjZF90eXBlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQoreworCXU4IHJlZzsKKwlpbnQgaTsKKworCWluU0lTSURYUkVHKFNJU0NSLCAweDM2LCByZWcpOworCXJlZyAmPSAweDBmOworCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCQlpdmlkZW8tPkNSVDJMQ0RUeXBlID0gc2lzMzAwcGFuZWx0eXBlW3JlZ107CisJfSBlbHNlIGlmKGl2aWRlby0+Y2hpcCA+PSBTSVNfNjYxKSB7CisJCWl2aWRlby0+Q1JUMkxDRFR5cGUgPSBzaXM2NjFwYW5lbHR5cGVbcmVnXTsKKwl9IGVsc2UgeworCQlpdmlkZW8tPkNSVDJMQ0RUeXBlID0gc2lzMzEwcGFuZWx0eXBlW3JlZ107CisJCWlmKChpdmlkZW8tPmNoaXAgPT0gU0lTXzU1MCkgJiYgKHNpc2ZiX2ZzdG4pKSB7CisJCQlpZigoaXZpZGVvLT5DUlQyTENEVHlwZSAhPSBMQ0RfMzIweDI0MF8yKSAmJgorCQkJICAgKGl2aWRlby0+Q1JUMkxDRFR5cGUgIT0gTENEXzMyMHgyNDBfMykpIHsKKwkJCQlpdmlkZW8tPkNSVDJMQ0RUeXBlID0gTENEXzMyMHgyNDA7CisJCQl9CisJCX0KKwl9CisKKwlpZihpdmlkZW8tPkNSVDJMQ0RUeXBlID09IExDRF9VTktOT1dOKSB7CisJCS8qIEZvciBicm9rZW4gQklPU2VzOiBBc3N1bWUgMTAyNHg3NjgsIFJHQjE4ICovCisJCWl2aWRlby0+Q1JUMkxDRFR5cGUgPSBMQ0RfMTAyNHg3Njg7CisJCXNldFNJU0lEWFJFRyhTSVNDUiwweDM2LDB4ZjAsMHgwMik7CisJCXNldFNJU0lEWFJFRyhTSVNDUiwweDM3LDB4ZWUsMHgwMSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogSW52YWxpZCBwYW5lbCBJRCAoJTAyeCksIGFzc3VtaW5nIDEwMjR4NzY4LCBSR0IxOFxuIiwgcmVnKTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBTSVNfTENEX05VTUJFUjsgaSsrKSB7CisJCWlmKGl2aWRlby0+Q1JUMkxDRFR5cGUgPT0gc2lzX2xjZF9kYXRhW2ldLmxjZHR5cGUpIHsKKwkJCWl2aWRlby0+bGNkeHJlcyA9IHNpc19sY2RfZGF0YVtpXS54cmVzOworCQkJaXZpZGVvLT5sY2R5cmVzID0gc2lzX2xjZF9kYXRhW2ldLnlyZXM7CisJCQlpdmlkZW8tPmxjZGRlZm1vZGVpZHggPSBzaXNfbGNkX2RhdGFbaV0uZGVmYXVsdF9tb2RlX2lkeDsKKwkJCWJyZWFrOworCQl9CisJfQorCisjaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKKwlpZihpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB7CisJCWl2aWRlby0+bGNkeHJlcyA9IDEzNjA7IGl2aWRlby0+bGNkeXJlcyA9IDEwMjQ7CisJCWl2aWRlby0+bGNkZGVmbW9kZWlkeCA9IERFRkFVTFRfTU9ERV8xMzYwOworCX0gZWxzZSBpZihpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCA9PSBDVVRfUEFORUw4NDgpIHsKKwkJaXZpZGVvLT5sY2R4cmVzID0gIDg0ODsgaXZpZGVvLT5sY2R5cmVzID0gIDQ4MDsKKwkJaXZpZGVvLT5sY2RkZWZtb2RlaWR4ID0gREVGQVVMVF9NT0RFXzg0ODsKKwl9IGVsc2UgaWYoaXZpZGVvLT5TaVNfUHIuU2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODU2KSB7CisJCWl2aWRlby0+bGNkeHJlcyA9ICA4NTY7IGl2aWRlby0+bGNkeXJlcyA9ICA0ODA7CisJCWl2aWRlby0+bGNkZGVmbW9kZWlkeCA9IERFRkFVTFRfTU9ERV84NTY7CisJfQorI2VuZGlmCisKKwlwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IERldGVjdGVkICVkeCVkIGZsYXQgcGFuZWxcbiIsCisJCQlpdmlkZW8tPmxjZHhyZXMsIGl2aWRlby0+bGNkeXJlcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc2lzZmJfc2F2ZV9wZGNfZW1pKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQoreworI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCisJLyogU2F2ZSB0aGUgY3VycmVudCBQYW5lbERlbGF5Q29tcGVuc2F0aW9uIGlmIHRoZSBMQ0QgaXMgY3VycmVudGx5IHVzZWQgKi8KKwlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKwkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIChWQjJfTFZEUyB8IFZCMl8zMHhCREgpKSB7CisJCQlpbnQgdG1wOworCQkJaW5TSVNJRFhSRUcoU0lTQ1IsMHgzMCx0bXApOworCQkJaWYodG1wICYgMHgyMCkgeworCQkJCS8qIEN1cnJlbnRseSBvbiBMQ0Q/IElmIHllcywgcmVhZCBjdXJyZW50IHBkYyAqLworCQkJCWluU0lTSURYUkVHKFNJU1BBUlQxLDB4MTMsaXZpZGVvLT5kZXRlY3RlZHBkYyk7CisJCQkJaXZpZGVvLT5kZXRlY3RlZHBkYyAmPSAweDNjOworCQkJCWlmKGl2aWRlby0+U2lTX1ByLlBEQyA9PSAtMSkgeworCQkJCQkvKiBMZXQgb3B0aW9uIG92ZXJyaWRlIGRldGVjdGlvbiAqLworCQkJCQlpdmlkZW8tPlNpU19Qci5QREMgPSBpdmlkZW8tPmRldGVjdGVkcGRjOworCQkJCX0KKwkJCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogRGV0ZWN0ZWQgTENEIFBEQyAweCUwMnhcbiIsCisJCQkJCWl2aWRlby0+ZGV0ZWN0ZWRwZGMpOworCQkJfQorCQkJaWYoKGl2aWRlby0+U2lTX1ByLlBEQyAhPSAtMSkgJiYKKwkJCSAgIChpdmlkZW8tPlNpU19Qci5QREMgIT0gaXZpZGVvLT5kZXRlY3RlZHBkYykpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogVXNpbmcgTENEIFBEQyAweCUwMnhcbiIsCisJCQkJCWl2aWRlby0+U2lTX1ByLlBEQyk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CisJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7CisKKwkJLyogVHJ5IHRvIGZpbmQgYWJvdXQgTENEQSAqLworCQlpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU0xDREFCUklER0UpIHsKKwkJCWludCB0bXA7CisJCQlpblNJU0lEWFJFRyhTSVNQQVJUMSwweDEzLHRtcCk7CisJCQlpZih0bXAgJiAweDA0KSB7CisJCQkJaXZpZGVvLT5TaVNfUHIuU2lTX1VzZUxDREEgPSBUUlVFOworCQkJCWl2aWRlby0+ZGV0ZWN0ZWRsY2RhID0gMHgwMzsKKwkJCX0KKwkJfQorCisJCS8qIFNhdmUgUERDICovCisJCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTTFZEU0JSSURHRSkgeworCQkJaW50IHRtcDsKKwkJCWluU0lTSURYUkVHKFNJU0NSLDB4MzAsdG1wKTsKKwkJCWlmKCh0bXAgJiAweDIwKSB8fCAoaXZpZGVvLT5kZXRlY3RlZGxjZGEgIT0gMHhmZikpIHsKKwkJCQkvKiBDdXJyZW50bHkgb24gTENEPyBJZiB5ZXMsIHJlYWQgY3VycmVudCBwZGMgKi8KKwkJCQl1OCBwZGM7CisJCQkJaW5TSVNJRFhSRUcoU0lTUEFSVDEsMHgyRCxwZGMpOworCQkJCWl2aWRlby0+ZGV0ZWN0ZWRwZGMgID0gKHBkYyAmIDB4MGYpIDw8IDE7CisJCQkJaXZpZGVvLT5kZXRlY3RlZHBkY2EgPSAocGRjICYgMHhmMCkgPj4gMzsKKwkJCQlpblNJU0lEWFJFRyhTSVNQQVJUMSwweDM1LHBkYyk7CisJCQkJaXZpZGVvLT5kZXRlY3RlZHBkYyB8PSAoKHBkYyA+PiA3KSAmIDB4MDEpOworCQkJCWluU0lTSURYUkVHKFNJU1BBUlQxLDB4MjAscGRjKTsKKwkJCQlpdmlkZW8tPmRldGVjdGVkcGRjYSB8PSAoKHBkYyA+PiA2KSAmIDB4MDEpOworCQkJCWlmKGl2aWRlby0+bmV3cm9tKSB7CisJCQkJCS8qIE5ldyBST00gaW52YWxpZGF0ZXMgb3RoZXIgUERDIHJlc3AuICovCisJCQkJCWlmKGl2aWRlby0+ZGV0ZWN0ZWRsY2RhICE9IDB4ZmYpIHsKKwkJCQkJCWl2aWRlby0+ZGV0ZWN0ZWRwZGMgPSAweGZmOworCQkJCQl9IGVsc2UgeworCQkJCQkJaXZpZGVvLT5kZXRlY3RlZHBkY2EgPSAweGZmOworCQkJCQl9CisJCQkJfQorCQkJCWlmKGl2aWRlby0+U2lTX1ByLlBEQyA9PSAtMSkgeworCQkJCQlpZihpdmlkZW8tPmRldGVjdGVkcGRjICE9IDB4ZmYpIHsKKwkJCQkJCWl2aWRlby0+U2lTX1ByLlBEQyA9IGl2aWRlby0+ZGV0ZWN0ZWRwZGM7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYoaXZpZGVvLT5TaVNfUHIuUERDQSA9PSAtMSkgeworCQkJCQlpZihpdmlkZW8tPmRldGVjdGVkcGRjYSAhPSAweGZmKSB7CisJCQkJCQlpdmlkZW8tPlNpU19Qci5QRENBID0gaXZpZGVvLT5kZXRlY3RlZHBkY2E7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYoaXZpZGVvLT5kZXRlY3RlZHBkYyAhPSAweGZmKSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJCSJzaXNmYjogRGV0ZWN0ZWQgTENEIFBEQyAweCUwMnggKGZvciBMQ0Q9Q1JUMilcbiIsCisJCQkJCQlpdmlkZW8tPmRldGVjdGVkcGRjKTsKKwkJCQl9CisJCQkJaWYoaXZpZGVvLT5kZXRlY3RlZHBkY2EgIT0gMHhmZikgeworCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCQkic2lzZmI6IERldGVjdGVkIExDRCBQREMxIDB4JTAyeCAoZm9yIExDRD1DUlQxKVxuIiwKKwkJCQkJCWl2aWRlby0+ZGV0ZWN0ZWRwZGNhKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIFNhdmUgRU1JICovCisJCQlpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU0VNSUJSSURHRSkgeworCQkJCWluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MzAsaXZpZGVvLT5TaVNfUHIuRU1JXzMwKTsKKwkJCQlpblNJU0lEWFJFRyhTSVNQQVJUNCwweDMxLGl2aWRlby0+U2lTX1ByLkVNSV8zMSk7CisJCQkJaW5TSVNJRFhSRUcoU0lTUEFSVDQsMHgzMixpdmlkZW8tPlNpU19Qci5FTUlfMzIpOworCQkJCWluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MzMsaXZpZGVvLT5TaVNfUHIuRU1JXzMzKTsKKwkJCQlpdmlkZW8tPlNpU19Qci5IYXZlRU1JID0gVFJVRTsKKwkJCQlpZigodG1wICYgMHgyMCkgfHwgKGl2aWRlby0+ZGV0ZWN0ZWRsY2RhICE9IDB4ZmYpKSB7CisJCQkJCWl2aWRlby0+U2lTX1ByLkhhdmVFTUlMQ0QgPSBUUlVFOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIExldCB1c2VyIG92ZXJyaWRlIGRldGVjdGVkIFBEQ3MgKGFsbCBicmlkZ2VzKSAqLworCQlpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyXzMweEJMVikgeworCQkJaWYoKGl2aWRlby0+U2lTX1ByLlBEQyAhPSAtMSkgJiYKKwkJCSAgIChpdmlkZW8tPlNpU19Qci5QREMgIT0gaXZpZGVvLT5kZXRlY3RlZHBkYykpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogVXNpbmcgTENEIFBEQyAweCUwMnggKGZvciBMQ0Q9Q1JUMilcbiIsCisJCQkJCWl2aWRlby0+U2lTX1ByLlBEQyk7CisJCQl9CisJCQlpZigoaXZpZGVvLT5TaVNfUHIuUERDQSAhPSAtMSkgJiYKKwkJCSAgIChpdmlkZW8tPlNpU19Qci5QRENBICE9IGl2aWRlby0+ZGV0ZWN0ZWRwZGNhKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBVc2luZyBMQ0QgUERDMSAweCUwMnggKGZvciBMQ0Q9Q1JUMSlcbiIsCisJCQkJIGl2aWRlby0+U2lTX1ByLlBEQ0EpOworCQkJfQorCQl9CisKKwl9CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWVtb3J5IG1hbmFnZXIgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgdTMyIF9fZGV2aW5pdAogc2lzZmJfZ2V0aGVhcHN0YXJ0KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewogCXUzMiByZXQgPSBpdmlkZW8tPnNpc2ZiX3Bhcm1fbWVtICogMTAyNDsKLQl1MzIgbWF4ID0gaXZpZGVvLT52aWRlb19zaXplIC0gaXZpZGVvLT5od2N1cnNvcl9zaXplOworCXUzMiBtYXhvZmZzID0gaXZpZGVvLT52aWRlb19zaXplIC0gaXZpZGVvLT5od2N1cnNvcl9zaXplIC0gaXZpZGVvLT5jbWRRdWV1ZVNpemU7CiAJdTMyIGRlZjsKIAogCS8qIENhbGN1bGF0ZSBoZWFwIHN0YXJ0ID0gZW5kIG9mIG1lbW9yeSBmb3IgY29uc29sZQpAQCAtMzAxNiwzMSArMzIwOCw2MyBAQAogCSAqIENDQ0NDQ0NDREREREREREREREREREREREREREREREREREREREhISEhRUVFRUVFRUVFRCiAJICogQyA9IGNvbnNvbGUsIEQgPSBoZWFwLCBIID0gSFdDdXJzb3IsIFEgPSBjbWQtcXVldWUKIAkgKgorCSAqIE9uIDc2eCBpbiBVTUErTEZCIG1vZGUsIHRoZSBsYXlvdXQgaXMgYXMgZm9sbG93czoKKwkgKiBERERERERERERERENDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0hISEhRUVFRUVFRUVFRUQorCSAqIHdoZXJlIHRoZSBoZWFwIGlzIHRoZSBlbnRpcmUgVU1BIGFyZWEsIGV2ZW50dWFsbHkKKwkgKiBpbnRvIHRoZSBMRkIgYXJlYSBpZiB0aGUgZ2l2ZW4gbWVtIHBhcmFtZXRlciBpcworCSAqIGhpZ2hlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBVTUEgbWVtb3J5LgorCSAqCiAJICogQmFzaWNhbGx5IGdpdmVuIGJ5ICJtZW0iIHBhcmFtZXRlcgogCSAqCiAJICogbWF4aW11bSA9IHZpZGVvc2l6ZSAtIGNtZF9xdWV1ZSAtIGh3Y3Vyc29yCiAJICogICAgICAgICAgIChyZXN1bHRzIGluIGEgaGVhcCBvZiBzaXplIDApCiAJICogZGVmYXVsdCA9IFNpUyAzMDA6IGRlcGVuZHMgb24gdmlkZW9zaXplCi0JICogICAgICAgICAgIFNpUyAzMTUvMzMwOiAzMmsgYmVsb3cgbWF4CisJICogICAgICAgICAgIFNpUyAzMTUvMzMwLzM0MC9YR0k6IDMyayBiZWxvdyBtYXgKIAkgKi8KIAogCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotCSAgIG1heCAtPSBUVVJCT19RVUVVRV9BUkVBX1NJWkU7Ci0JICAgaWYoaXZpZGVvLT52aWRlb19zaXplID4gMHgxMDAwMDAwKSB7Ci0JICAgICAgZGVmID0gMHhjMDAwMDA7Ci0JICAgfSBlbHNlIGlmKGl2aWRlby0+dmlkZW9fc2l6ZSA+IDB4ODAwMDAwKSB7Ci0JICAgICAgZGVmID0gMHg4MDAwMDA7Ci0JICAgfSBlbHNlIHsKLQkgICAgICBkZWYgPSAweDQwMDAwMDsKLQkgICB9CisJCWlmKGl2aWRlby0+dmlkZW9fc2l6ZSA+IDB4MTAwMDAwMCkgeworCQkJZGVmID0gMHhjMDAwMDA7CisJCX0gZWxzZSBpZihpdmlkZW8tPnZpZGVvX3NpemUgPiAweDgwMDAwMCkgeworCQkJZGVmID0gMHg4MDAwMDA7CisJCX0gZWxzZSB7CisJCQlkZWYgPSAweDQwMDAwMDsKKwkJfQorCX0gZWxzZSBpZihpdmlkZW8tPlVNQXNpemUgJiYgaXZpZGVvLT5MRkJzaXplKSB7CisJCXJldCA9IGRlZiA9IDA7CiAJfSBlbHNlIHsKLQkgICBtYXggLT0gQ09NTUFORF9RVUVVRV9BUkVBX1NJWkU7Ci0JICAgZGVmID0gbWF4IC0gMHg4MDAwOworCQlkZWYgPSBtYXhvZmZzIC0gMHg4MDAwOwogCX0KIAotICAgICAgICBpZigoIXJldCkgfHwgKHJldCA+IG1heCkgfHwgKGl2aWRlby0+Y2FyZG51bWJlciAhPSAwKSkgewotCSAgIHJldCA9IGRlZjsKLSAgICAgICAgfQorCS8qIFVzZSBkZWZhdWx0IGZvciBzZWNvbmRhcnkgY2FyZCBmb3Igbm93IChGSVhNRSkgKi8KKwlpZigoIXJldCkgfHwgKHJldCA+IG1heG9mZnMpIHx8IChpdmlkZW8tPmNhcmRudW1iZXIgIT0gMCkpCisJCXJldCA9IGRlZjsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgX19kZXZpbml0CitzaXNmYl9nZXRoZWFwc2l6ZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKK3sKKwl1MzIgbWF4ID0gaXZpZGVvLT52aWRlb19zaXplIC0gaXZpZGVvLT5od2N1cnNvcl9zaXplIC0gaXZpZGVvLT5jbWRRdWV1ZVNpemU7CisJdTMyIHJldCA9IDA7CisKKwlpZihpdmlkZW8tPlVNQXNpemUgJiYgaXZpZGVvLT5MRkJzaXplKSB7CisJCWlmKCAoIWl2aWRlby0+c2lzZmJfcGFybV9tZW0pCQkJfHwKKwkJICAgICgoaXZpZGVvLT5zaXNmYl9wYXJtX21lbSAqIDEwMjQpID4gbWF4KQl8fAorCQkgICAgKChtYXggLSAoaXZpZGVvLT5zaXNmYl9wYXJtX21lbSAqIDEwMjQpKSA8IGl2aWRlby0+VU1Bc2l6ZSkgKSB7CisJCQlyZXQgPSBpdmlkZW8tPlVNQXNpemU7CisJCQltYXggLT0gaXZpZGVvLT5VTUFzaXplOworCQl9IGVsc2UgeworCQkJcmV0ID0gbWF4IC0gKGl2aWRlby0+c2lzZmJfcGFybV9tZW0gKiAxMDI0KTsKKwkJCW1heCA9IGl2aWRlby0+c2lzZmJfcGFybV9tZW0gKiAxMDI0OworCQl9CisJCWl2aWRlby0+dmlkZW9fb2Zmc2V0ID0gcmV0OworCQlpdmlkZW8tPnNpc2ZiX21lbSA9IG1heDsKKwl9IGVsc2UgeworCQlyZXQgPSBtYXggLSBpdmlkZW8tPmhlYXBzdGFydDsKKwkJaXZpZGVvLT5zaXNmYl9tZW0gPSBpdmlkZW8tPmhlYXBzdGFydDsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzA0OCwxMTkgKzMyNzIsNzUgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0CiBzaXNmYl9oZWFwX2luaXQoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCiB7Ci0gICAgIFNJU19PSCAqcG9oOworCXN0cnVjdCBTSVNfT0ggKnBvaDsKIAotICAgICBpdmlkZW8tPmhlYXBzdGFydCA9IGl2aWRlby0+c2lzZmJfbWVtID0gc2lzZmJfZ2V0aGVhcHN0YXJ0KGl2aWRlbyk7CisJaXZpZGVvLT52aWRlb19vZmZzZXQgPSAwOworCWlmKGl2aWRlby0+c2lzZmJfcGFybV9tZW0pIHsKKwkJaWYoIChpdmlkZW8tPnNpc2ZiX3Bhcm1fbWVtIDwgKDIgKiAxMDI0ICogMTAyNCkpIHx8CisJCSAgICAoaXZpZGVvLT5zaXNmYl9wYXJtX21lbSA+IGl2aWRlby0+dmlkZW9fc2l6ZSkgKSB7CisJCQlpdmlkZW8tPnNpc2ZiX3Bhcm1fbWVtID0gMDsKKwkJfQorCX0KIAotICAgICBpdmlkZW8tPnNpc2ZiX2hlYXBfc3RhcnQgPSBpdmlkZW8tPnZpZGVvX3ZiYXNlICsgaXZpZGVvLT5oZWFwc3RhcnQ7Ci0gICAgIGl2aWRlby0+c2lzZmJfaGVhcF9lbmQgICA9IGl2aWRlby0+dmlkZW9fdmJhc2UgKyBpdmlkZW8tPnZpZGVvX3NpemU7CisJaXZpZGVvLT5oZWFwc3RhcnQgPSBzaXNmYl9nZXRoZWFwc3RhcnQoaXZpZGVvKTsKKwlpdmlkZW8tPnNpc2ZiX2hlYXBfc2l6ZSA9IHNpc2ZiX2dldGhlYXBzaXplKGl2aWRlbyk7CiAKLSAgICAgLyogSW5pdGlhbGl6ZSBjb21tYW5kIHF1ZXVlIChXZSB1c2UgTU1JTyBvbmx5KSAqLworCWl2aWRlby0+c2lzZmJfaGVhcF9zdGFydCA9IGl2aWRlby0+dmlkZW9fdmJhc2UgKyBpdmlkZW8tPmhlYXBzdGFydDsKKwlpdmlkZW8tPnNpc2ZiX2hlYXBfZW5kICAgPSBpdmlkZW8tPnNpc2ZiX2hlYXBfc3RhcnQgKyBpdmlkZW8tPnNpc2ZiX2hlYXBfc2l6ZTsKIAotI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Ci0gICAgIGlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotICAgICAgICB1MzIgdGVtcHEgPSAwOwotCXU4ICB0ZW1wID0gMDsKKwlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogTWVtb3J5IGhlYXAgc3RhcnRpbmcgYXQgJWRLLCBzaXplICVkS1xuIiwKKwkJKGludCkoaXZpZGVvLT5oZWFwc3RhcnQgLyAxMDI0KSwgKGludCkoaXZpZGVvLT5zaXNmYl9oZWFwX3NpemUgLyAxMDI0KSk7CiAKLSAgICAgICAgaXZpZGVvLT5zaXNmYl9oZWFwX2VuZCAtPSBDT01NQU5EX1FVRVVFX0FSRUFfU0laRTsKKwlpdmlkZW8tPnNpc2ZiX2hlYXAudmluZm8gPSBpdmlkZW87CiAKLQlvdXRTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfQ01EUVVFVUVfVEhSRVNIT0xELCBDT01NQU5EX1FVRVVFX1RIUkVTSE9MRCk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX0NNRFFVRVVFX1NFVCwgU0lTX0NNRF9RVUVVRV9SRVNFVCk7CisJaXZpZGVvLT5zaXNmYl9oZWFwLnBvaGFfY2hhaW4gPSBOVUxMOworCWl2aWRlby0+c2lzZmJfaGVhcC5wb2hfZnJlZWxpc3QgPSBOVUxMOwogCi0JdGVtcHEgPSBNTUlPX0lOMzIoaXZpZGVvLT5tbWlvX3ZiYXNlLCBNTUlPX1FVRVVFX1JFQURQT1JUKTsKLQlNTUlPX09VVDMyKGl2aWRlby0+bW1pb192YmFzZSwgTU1JT19RVUVVRV9XUklURVBPUlQsIHRlbXBxKTsKKwlwb2ggPSBzaXNmYl9wb2hfbmV3X25vZGUoJml2aWRlby0+c2lzZmJfaGVhcCk7CisJaWYocG9oID09IE5VTEwpCisJCXJldHVybiAxOwogCi0JdGVtcCA9IFNJU19DTURfUVVFVUVfU0laRV81MTJrOwotCXRlbXAgfD0gKFNJU19NTUlPX0NNRF9FTkFCTEUgfCBTSVNfQ01EX0FVVE9fQ09SUik7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX0NNRFFVRVVFX1NFVCwgdGVtcCk7CisJcG9oLT5wb2hfbmV4dCA9ICZpdmlkZW8tPnNpc2ZiX2hlYXAub2hfZnJlZTsKKwlwb2gtPnBvaF9wcmV2ID0gJml2aWRlby0+c2lzZmJfaGVhcC5vaF9mcmVlOworCXBvaC0+c2l6ZSA9IGl2aWRlby0+c2lzZmJfaGVhcF9zaXplOworCXBvaC0+b2Zmc2V0ID0gaXZpZGVvLT5oZWFwc3RhcnQ7CiAKLQl0ZW1wcSA9ICh1MzIpKGl2aWRlby0+dmlkZW9fc2l6ZSAtIENPTU1BTkRfUVVFVUVfQVJFQV9TSVpFKTsKLQlNTUlPX09VVDMyKGl2aWRlby0+bW1pb192YmFzZSwgTU1JT19RVUVVRV9QSFlCQVNFLCB0ZW1wcSk7CisJaXZpZGVvLT5zaXNmYl9oZWFwLm9oX2ZyZWUucG9oX25leHQgPSBwb2g7CisJaXZpZGVvLT5zaXNmYl9oZWFwLm9oX2ZyZWUucG9oX3ByZXYgPSBwb2g7CisJaXZpZGVvLT5zaXNmYl9oZWFwLm9oX2ZyZWUuc2l6ZSA9IDA7CisJaXZpZGVvLT5zaXNmYl9oZWFwLm1heF9mcmVlc2l6ZSA9IHBvaC0+c2l6ZTsKIAotCWl2aWRlby0+Y2FwcyB8PSBNTUlPX0NNRF9RVUVVRV9DQVA7Ci0gICAgIH0KLSNlbmRpZgorCWl2aWRlby0+c2lzZmJfaGVhcC5vaF91c2VkLnBvaF9uZXh0ID0gJml2aWRlby0+c2lzZmJfaGVhcC5vaF91c2VkOworCWl2aWRlby0+c2lzZmJfaGVhcC5vaF91c2VkLnBvaF9wcmV2ID0gJml2aWRlby0+c2lzZmJfaGVhcC5vaF91c2VkOworCWl2aWRlby0+c2lzZmJfaGVhcC5vaF91c2VkLnNpemUgPSBTRU5USU5FTDsKIAotI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0gICAgIGlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotICAgICAJdW5zaWduZWQgbG9uZyB0cXVldWVfcG9zOwotCXU4IHRxX3N0YXRlOworCWlmKGl2aWRlby0+Y2FyZG51bWJlciA9PSAwKSB7CisJCS8qIEZvciB0aGUgZmlyc3QgY2FyZCwgbWFrZSB0aGlzIGhlYXAgdGhlICJnbG9iYWwiIG9uZQorCQkgKiBmb3Igb2xkIERSTSAod2hpY2ggY291bGQgaGFuZGxlIG9ubHkgb25lIGNhcmQpCisJCSAqLworCQlzaXNmYl9oZWFwID0gJml2aWRlby0+c2lzZmJfaGVhcDsKKwl9CiAKLQlpdmlkZW8tPnNpc2ZiX2hlYXBfZW5kIC09IFRVUkJPX1FVRVVFX0FSRUFfU0laRTsKLQotCXRxdWV1ZV9wb3MgPSAoaXZpZGVvLT52aWRlb19zaXplIC0gVFVSQk9fUVVFVUVfQVJFQV9TSVpFKSAvICg2NCAqIDEwMjQpOwotCi0JaW5TSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfVFVSQk9RVUVVRV9TRVQsIHRxX3N0YXRlKTsKLQl0cV9zdGF0ZSB8PSAweGYwOwotCXRxX3N0YXRlICY9IDB4ZmM7Ci0JdHFfc3RhdGUgfD0gKHU4KSh0cXVldWVfcG9zID4+IDgpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwgSU5EX1NJU19UVVJCT1FVRVVFX1NFVCwgdHFfc3RhdGUpOwotCi0Jb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1RVUkJPUVVFVUVfQURSLCAodTgpKHRxdWV1ZV9wb3MgJiAweGZmKSk7Ci0KLQlpdmlkZW8tPmNhcHMgfD0gVFVSQk9fUVVFVUVfQ0FQOwotICAgICB9Ci0jZW5kaWYKLQotICAgICAvKiBSZXNlcnZlIG1lbW9yeSBmb3IgdGhlIEhXQ3Vyc29yICovCi0gICAgIGl2aWRlby0+c2lzZmJfaGVhcF9lbmQgLT0gaXZpZGVvLT5od2N1cnNvcl9zaXplOwotICAgICBpdmlkZW8tPmh3Y3Vyc29yX3ZiYXNlID0gaXZpZGVvLT5zaXNmYl9oZWFwX2VuZDsKLSAgICAgaXZpZGVvLT5jYXBzIHw9IEhXX0NVUlNPUl9DQVA7Ci0KLSAgICAgaXZpZGVvLT5zaXNmYl9oZWFwX3NpemUgPSBpdmlkZW8tPnNpc2ZiX2hlYXBfZW5kIC0gaXZpZGVvLT5zaXNmYl9oZWFwX3N0YXJ0OwotCi0gICAgIGlmKGl2aWRlby0+Y2FyZG51bWJlciA9PSAwKSB7Ci0KLSAgICAgCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBNZW1vcnkgaGVhcCBzdGFydGluZyBhdCAlZEssIHNpemUgJWRLXG4iLAotICAgICAJCShpbnQpKGl2aWRlby0+aGVhcHN0YXJ0IC8gMTAyNCksIChpbnQpKGl2aWRlby0+c2lzZmJfaGVhcF9zaXplIC8gMTAyNCkpOwotCi0Jc2lzZmJfaGVhcC52aW5mbyA9IGl2aWRlbzsKLQotICAgICAJc2lzZmJfaGVhcC5wb2hhX2NoYWluID0gTlVMTDsKLSAgICAgCXNpc2ZiX2hlYXAucG9oX2ZyZWVsaXN0ID0gTlVMTDsKLQotICAgICAJcG9oID0gc2lzZmJfcG9oX25ld19ub2RlKCk7Ci0gICAgIAlpZihwb2ggPT0gTlVMTCkgcmV0dXJuIDE7Ci0KLSAgICAgCXBvaC0+cG9oX25leHQgPSAmc2lzZmJfaGVhcC5vaF9mcmVlOwotICAgICAJcG9oLT5wb2hfcHJldiA9ICZzaXNmYl9oZWFwLm9oX2ZyZWU7Ci0gICAgIAlwb2gtPnNpemUgPSBpdmlkZW8tPnNpc2ZiX2hlYXBfc2l6ZTsKLSAgICAgCXBvaC0+b2Zmc2V0ID0gaXZpZGVvLT5oZWFwc3RhcnQ7Ci0KLSAgICAgCXNpc2ZiX2hlYXAub2hfZnJlZS5wb2hfbmV4dCA9IHBvaDsKLSAgICAgCXNpc2ZiX2hlYXAub2hfZnJlZS5wb2hfcHJldiA9IHBvaDsKLSAgICAgCXNpc2ZiX2hlYXAub2hfZnJlZS5zaXplID0gMDsKLSAgICAgCXNpc2ZiX2hlYXAubWF4X2ZyZWVzaXplID0gcG9oLT5zaXplOwotCi0gICAgIAlzaXNmYl9oZWFwLm9oX3VzZWQucG9oX25leHQgPSAmc2lzZmJfaGVhcC5vaF91c2VkOwotICAgICAJc2lzZmJfaGVhcC5vaF91c2VkLnBvaF9wcmV2ID0gJnNpc2ZiX2hlYXAub2hfdXNlZDsKLSAgICAgCXNpc2ZiX2hlYXAub2hfdXNlZC5zaXplID0gU0VOVElORUw7Ci0KLSAgICAgfSBlbHNlIHsKLQotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJTa2lwcGVkIGhlYXAgaW5pdGlhbGl6YXRpb24gZm9yIHNlY29uZGFyeSBjYXJkc1xuIik7Ci0KLSAgICAgfQotCi0gICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgU0lTX09IICoKLXNpc2ZiX3BvaF9uZXdfbm9kZSh2b2lkKQorc3RhdGljIHN0cnVjdCBTSVNfT0ggKgorc2lzZmJfcG9oX25ld19ub2RlKHN0cnVjdCBTSVNfSEVBUCAqbWVtaGVhcCkKIHsKLQlpbnQgICAgICAgICAgIGk7Ci0JdW5zaWduZWQgbG9uZyBjT2hzOwotCVNJU19PSEFMTE9DICAgKnBvaGE7Ci0JU0lTX09IICAgICAgICAqcG9oOworCXN0cnVjdCBTSVNfT0hBTExPQwkqcG9oYTsKKwlzdHJ1Y3QgU0lTX09ICQkqcG9oOworCXVuc2lnbmVkIGxvbmcJCWNPaHM7CisJaW50CQkJaTsKIAotCWlmKHNpc2ZiX2hlYXAucG9oX2ZyZWVsaXN0ID09IE5VTEwpIHsKKwlpZihtZW1oZWFwLT5wb2hfZnJlZWxpc3QgPT0gTlVMTCkgewogCQlwb2hhID0ga21hbGxvYyhTSVNfT0hfQUxMT0NfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCWlmKCFwb2hhKSByZXR1cm4gTlVMTDsKKwkJaWYoIXBvaGEpCisJCQlyZXR1cm4gTlVMTDsKIAotCQlwb2hhLT5wb2hhX25leHQgPSBzaXNmYl9oZWFwLnBvaGFfY2hhaW47Ci0JCXNpc2ZiX2hlYXAucG9oYV9jaGFpbiA9IHBvaGE7CisJCXBvaGEtPnBvaGFfbmV4dCA9IG1lbWhlYXAtPnBvaGFfY2hhaW47CisJCW1lbWhlYXAtPnBvaGFfY2hhaW4gPSBwb2hhOwogCi0JCWNPaHMgPSAoU0lTX09IX0FMTE9DX1NJWkUgLSBzaXplb2YoU0lTX09IQUxMT0MpKSAvIHNpemVvZihTSVNfT0gpICsgMTsKKwkJY09ocyA9IChTSVNfT0hfQUxMT0NfU0laRSAtIHNpemVvZihzdHJ1Y3QgU0lTX09IQUxMT0MpKSAvIHNpemVvZihzdHJ1Y3QgU0lTX09IKSArIDE7CiAKIAkJcG9oID0gJnBvaGEtPmFvaFswXTsKIAkJZm9yKGkgPSBjT2hzIC0gMTsgaSAhPSAwOyBpLS0pIHsKQEAgLTMxNjksMzIgKzMzNDksMzIgQEAKIAkJfQogCiAJCXBvaC0+cG9oX25leHQgPSBOVUxMOwotCQlzaXNmYl9oZWFwLnBvaF9mcmVlbGlzdCA9ICZwb2hhLT5hb2hbMF07CisJCW1lbWhlYXAtPnBvaF9mcmVlbGlzdCA9ICZwb2hhLT5hb2hbMF07CiAJfQogCi0JcG9oID0gc2lzZmJfaGVhcC5wb2hfZnJlZWxpc3Q7Ci0Jc2lzZmJfaGVhcC5wb2hfZnJlZWxpc3QgPSBwb2gtPnBvaF9uZXh0OworCXBvaCA9IG1lbWhlYXAtPnBvaF9mcmVlbGlzdDsKKwltZW1oZWFwLT5wb2hfZnJlZWxpc3QgPSBwb2gtPnBvaF9uZXh0OwogCi0JcmV0dXJuIChwb2gpOworCXJldHVybiBwb2g7CiB9CiAKLXN0YXRpYyBTSVNfT0ggKgotc2lzZmJfcG9oX2FsbG9jYXRlKHUzMiBzaXplKQorc3RhdGljIHN0cnVjdCBTSVNfT0ggKgorc2lzZmJfcG9oX2FsbG9jYXRlKHN0cnVjdCBTSVNfSEVBUCAqbWVtaGVhcCwgdTMyIHNpemUpCiB7Ci0JU0lTX09IICpwb2hUaGlzOwotCVNJU19PSCAqcG9oUm9vdDsKLQlpbnQgICAgIGJBbGxvY2F0ZWQgPSAwOworCXN0cnVjdCBTSVNfT0gJKnBvaFRoaXM7CisJc3RydWN0IFNJU19PSAkqcG9oUm9vdDsKKwlpbnQJCWJBbGxvY2F0ZWQgPSAwOwogCi0JaWYoc2l6ZSA+IHNpc2ZiX2hlYXAubWF4X2ZyZWVzaXplKSB7CisJaWYoc2l6ZSA+IG1lbWhlYXAtPm1heF9mcmVlc2l6ZSkgewogCQlEUFJJTlRLKCJzaXNmYjogQ2FuJ3QgYWxsb2NhdGUgJWRrIHZpZGVvIG1lbW9yeVxuIiwKIAkJCSh1bnNpZ25lZCBpbnQpIHNpemUgLyAxMDI0KTsKLQkJcmV0dXJuIChOVUxMKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCi0JcG9oVGhpcyA9IHNpc2ZiX2hlYXAub2hfZnJlZS5wb2hfbmV4dDsKKwlwb2hUaGlzID0gbWVtaGVhcC0+b2hfZnJlZS5wb2hfbmV4dDsKIAotCXdoaWxlKHBvaFRoaXMgIT0gJnNpc2ZiX2hlYXAub2hfZnJlZSkgewotCQlpZiAoc2l6ZSA8PSBwb2hUaGlzLT5zaXplKSB7CisJd2hpbGUocG9oVGhpcyAhPSAmbWVtaGVhcC0+b2hfZnJlZSkgeworCQlpZihzaXplIDw9IHBvaFRoaXMtPnNpemUpIHsKIAkJCWJBbGxvY2F0ZWQgPSAxOwogCQkJYnJlYWs7CiAJCX0KQEAgLTMyMDQsMTggKzMzODQsMTYgQEAKIAlpZighYkFsbG9jYXRlZCkgewogCQlEUFJJTlRLKCJzaXNmYjogQ2FuJ3QgYWxsb2NhdGUgJWRrIHZpZGVvIG1lbW9yeVxuIiwKIAkJCSh1bnNpZ25lZCBpbnQpIHNpemUgLyAxMDI0KTsKLQkJcmV0dXJuIChOVUxMKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCiAJaWYoc2l6ZSA9PSBwb2hUaGlzLT5zaXplKSB7CiAJCXBvaFJvb3QgPSBwb2hUaGlzOwogCQlzaXNmYl9kZWxldGVfbm9kZShwb2hUaGlzKTsKIAl9IGVsc2UgewotCQlwb2hSb290ID0gc2lzZmJfcG9oX25ld19ub2RlKCk7Ci0KLQkJaWYocG9oUm9vdCA9PSBOVUxMKSB7Ci0JCQlyZXR1cm4gKE5VTEwpOwotCQl9CisJCXBvaFJvb3QgPSBzaXNmYl9wb2hfbmV3X25vZGUobWVtaGVhcCk7CisJCWlmKHBvaFJvb3QgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOwogCiAJCXBvaFJvb3QtPm9mZnNldCA9IHBvaFRoaXMtPm9mZnNldDsKIAkJcG9oUm9vdC0+c2l6ZSA9IHNpemU7CkBAIC0zMjI0LDMzICszNDAyLDI1IEBACiAJCXBvaFRoaXMtPnNpemUgLT0gc2l6ZTsKIAl9CiAKLQlzaXNmYl9oZWFwLm1heF9mcmVlc2l6ZSAtPSBzaXplOworCW1lbWhlYXAtPm1heF9mcmVlc2l6ZSAtPSBzaXplOwogCi0JcG9oVGhpcyA9ICZzaXNmYl9oZWFwLm9oX3VzZWQ7CisJcG9oVGhpcyA9ICZtZW1oZWFwLT5vaF91c2VkOwogCXNpc2ZiX2luc2VydF9ub2RlKHBvaFRoaXMsIHBvaFJvb3QpOwogCi0JcmV0dXJuIChwb2hSb290KTsKKwlyZXR1cm4gcG9oUm9vdDsKIH0KIAogc3RhdGljIHZvaWQKLXNpc2ZiX2RlbGV0ZV9ub2RlKFNJU19PSCAqcG9oKQorc2lzZmJfZGVsZXRlX25vZGUoc3RydWN0IFNJU19PSCAqcG9oKQogewotCVNJU19PSCAqcG9oX3ByZXY7Ci0JU0lTX09IICpwb2hfbmV4dDsKLQotCXBvaF9wcmV2ID0gcG9oLT5wb2hfcHJldjsKLQlwb2hfbmV4dCA9IHBvaC0+cG9oX25leHQ7Ci0KLQlwb2hfcHJldi0+cG9oX25leHQgPSBwb2hfbmV4dDsKLQlwb2hfbmV4dC0+cG9oX3ByZXYgPSBwb2hfcHJldjsKKwlwb2gtPnBvaF9wcmV2LT5wb2hfbmV4dCA9IHBvaC0+cG9oX25leHQ7CisJcG9oLT5wb2hfbmV4dC0+cG9oX3ByZXYgPSBwb2gtPnBvaF9wcmV2OwogfQogCiBzdGF0aWMgdm9pZAotc2lzZmJfaW5zZXJ0X25vZGUoU0lTX09IICpwb2hMaXN0LCBTSVNfT0ggKnBvaCkKK3Npc2ZiX2luc2VydF9ub2RlKHN0cnVjdCBTSVNfT0ggKnBvaExpc3QsIHN0cnVjdCBTSVNfT0ggKnBvaCkKIHsKLQlTSVNfT0ggKnBvaFRlbXA7Ci0KLQlwb2hUZW1wID0gcG9oTGlzdC0+cG9oX25leHQ7CisJc3RydWN0IFNJU19PSCAqcG9oVGVtcCA9IHBvaExpc3QtPnBvaF9uZXh0OwogCiAJcG9oTGlzdC0+cG9oX25leHQgPSBwb2g7CiAJcG9oVGVtcC0+cG9oX3ByZXYgPSBwb2g7CkBAIC0zMjU5LDIwICszNDI5LDIwIEBACiAJcG9oLT5wb2hfbmV4dCA9IHBvaFRlbXA7CiB9CiAKLXN0YXRpYyBTSVNfT0ggKgotc2lzZmJfcG9oX2ZyZWUodTMyIGJhc2UpCitzdGF0aWMgc3RydWN0IFNJU19PSCAqCitzaXNmYl9wb2hfZnJlZShzdHJ1Y3QgU0lTX0hFQVAgKm1lbWhlYXAsIHUzMiBiYXNlKQogewotCVNJU19PSCAqcG9oVGhpczsKLQlTSVNfT0ggKnBvaF9mcmVlZDsKLQlTSVNfT0ggKnBvaF9wcmV2OwotCVNJU19PSCAqcG9oX25leHQ7Ci0JdTMyICAgICB1bFVwcGVyOwotCXUzMiAgICAgdWxMb3dlcjsKLQlpbnQgICAgIGZvdW5kTm9kZSA9IDA7CisJc3RydWN0IFNJU19PSCAqcG9oVGhpczsKKwlzdHJ1Y3QgU0lTX09IICpwb2hfZnJlZWQ7CisJc3RydWN0IFNJU19PSCAqcG9oX3ByZXY7CisJc3RydWN0IFNJU19PSCAqcG9oX25leHQ7CisJdTMyICAgIHVsVXBwZXI7CisJdTMyICAgIHVsTG93ZXI7CisJaW50ICAgIGZvdW5kTm9kZSA9IDA7CiAKLQlwb2hfZnJlZWQgPSBzaXNmYl9oZWFwLm9oX3VzZWQucG9oX25leHQ7CisJcG9oX2ZyZWVkID0gbWVtaGVhcC0+b2hfdXNlZC5wb2hfbmV4dDsKIAotCXdoaWxlKHBvaF9mcmVlZCAhPSAmc2lzZmJfaGVhcC5vaF91c2VkKSB7CisJd2hpbGUocG9oX2ZyZWVkICE9ICZtZW1oZWFwLT5vaF91c2VkKSB7CiAJCWlmKHBvaF9mcmVlZC0+b2Zmc2V0ID09IGJhc2UpIHsKIAkJCWZvdW5kTm9kZSA9IDE7CiAJCQlicmVhazsKQEAgLTMyODEsMTcgKzM0NTEsMTggQEAKIAkJcG9oX2ZyZWVkID0gcG9oX2ZyZWVkLT5wb2hfbmV4dDsKIAl9CiAKLQlpZighZm91bmROb2RlKSByZXR1cm4oTlVMTCk7CisJaWYoIWZvdW5kTm9kZSkKKwkJcmV0dXJuIE5VTEw7CiAKLQlzaXNmYl9oZWFwLm1heF9mcmVlc2l6ZSArPSBwb2hfZnJlZWQtPnNpemU7CisJbWVtaGVhcC0+bWF4X2ZyZWVzaXplICs9IHBvaF9mcmVlZC0+c2l6ZTsKIAogCXBvaF9wcmV2ID0gcG9oX25leHQgPSBOVUxMOwogCXVsVXBwZXIgPSBwb2hfZnJlZWQtPm9mZnNldCArIHBvaF9mcmVlZC0+c2l6ZTsKIAl1bExvd2VyID0gcG9oX2ZyZWVkLT5vZmZzZXQ7CiAKLQlwb2hUaGlzID0gc2lzZmJfaGVhcC5vaF9mcmVlLnBvaF9uZXh0OworCXBvaFRoaXMgPSBtZW1oZWFwLT5vaF9mcmVlLnBvaF9uZXh0OwogCi0Jd2hpbGUocG9oVGhpcyAhPSAmc2lzZmJfaGVhcC5vaF9mcmVlKSB7CisJd2hpbGUocG9oVGhpcyAhPSAmbWVtaGVhcC0+b2hfZnJlZSkgewogCQlpZihwb2hUaGlzLT5vZmZzZXQgPT0gdWxVcHBlcikgewogCQkJcG9oX25leHQgPSBwb2hUaGlzOwogCQl9IGVsc2UgaWYoKHBvaFRoaXMtPm9mZnNldCArIHBvaFRoaXMtPnNpemUpID09IHVsTG93ZXIpIHsKQEAgLTMzMDUsNzAgKzM0NzYsODggQEAKIAlpZihwb2hfcHJldiAmJiBwb2hfbmV4dCkgewogCQlwb2hfcHJldi0+c2l6ZSArPSAocG9oX2ZyZWVkLT5zaXplICsgcG9oX25leHQtPnNpemUpOwogCQlzaXNmYl9kZWxldGVfbm9kZShwb2hfbmV4dCk7Ci0JCXNpc2ZiX2ZyZWVfbm9kZShwb2hfZnJlZWQpOwotCQlzaXNmYl9mcmVlX25vZGUocG9oX25leHQpOwotCQlyZXR1cm4ocG9oX3ByZXYpOworCQlzaXNmYl9mcmVlX25vZGUobWVtaGVhcCwgcG9oX2ZyZWVkKTsKKwkJc2lzZmJfZnJlZV9ub2RlKG1lbWhlYXAsIHBvaF9uZXh0KTsKKwkJcmV0dXJuIHBvaF9wcmV2OwogCX0KIAogCWlmKHBvaF9wcmV2KSB7CiAJCXBvaF9wcmV2LT5zaXplICs9IHBvaF9mcmVlZC0+c2l6ZTsKLQkJc2lzZmJfZnJlZV9ub2RlKHBvaF9mcmVlZCk7Ci0JCXJldHVybihwb2hfcHJldik7CisJCXNpc2ZiX2ZyZWVfbm9kZShtZW1oZWFwLCBwb2hfZnJlZWQpOworCQlyZXR1cm4gcG9oX3ByZXY7CiAJfQogCiAJaWYocG9oX25leHQpIHsKIAkJcG9oX25leHQtPnNpemUgKz0gcG9oX2ZyZWVkLT5zaXplOwogCQlwb2hfbmV4dC0+b2Zmc2V0ID0gcG9oX2ZyZWVkLT5vZmZzZXQ7Ci0JCXNpc2ZiX2ZyZWVfbm9kZShwb2hfZnJlZWQpOwotCQlyZXR1cm4ocG9oX25leHQpOworCQlzaXNmYl9mcmVlX25vZGUobWVtaGVhcCwgcG9oX2ZyZWVkKTsKKwkJcmV0dXJuIHBvaF9uZXh0OwogCX0KIAotCXNpc2ZiX2luc2VydF9ub2RlKCZzaXNmYl9oZWFwLm9oX2ZyZWUsIHBvaF9mcmVlZCk7CisJc2lzZmJfaW5zZXJ0X25vZGUoJm1lbWhlYXAtPm9oX2ZyZWUsIHBvaF9mcmVlZCk7CiAKLQlyZXR1cm4ocG9oX2ZyZWVkKTsKKwlyZXR1cm4gcG9oX2ZyZWVkOwogfQogCiBzdGF0aWMgdm9pZAotc2lzZmJfZnJlZV9ub2RlKFNJU19PSCAqcG9oKQorc2lzZmJfZnJlZV9ub2RlKHN0cnVjdCBTSVNfSEVBUCAqbWVtaGVhcCwgc3RydWN0IFNJU19PSCAqcG9oKQogewotCWlmKHBvaCA9PSBOVUxMKSByZXR1cm47CisJaWYocG9oID09IE5VTEwpCisJCXJldHVybjsKIAotCXBvaC0+cG9oX25leHQgPSBzaXNmYl9oZWFwLnBvaF9mcmVlbGlzdDsKLQlzaXNmYl9oZWFwLnBvaF9mcmVlbGlzdCA9IHBvaDsKKwlwb2gtPnBvaF9uZXh0ID0gbWVtaGVhcC0+cG9oX2ZyZWVsaXN0OworCW1lbWhlYXAtPnBvaF9mcmVlbGlzdCA9IHBvaDsKK30KKworc3RhdGljIHZvaWQKK3Npc19pbnRfbWFsbG9jKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBzdHJ1Y3Qgc2lzX21lbXJlcSAqcmVxKQoreworCXN0cnVjdCBTSVNfT0ggKnBvaCA9IE5VTEw7CisKKwlpZigoaXZpZGVvKSAmJiAoaXZpZGVvLT5zaXNmYl9pZCA9PSBTSVNGQl9JRCkgJiYgKCFpdmlkZW8tPmhhdmVub2hlYXApKQorCQlwb2ggPSBzaXNmYl9wb2hfYWxsb2NhdGUoJml2aWRlby0+c2lzZmJfaGVhcCwgKHUzMilyZXEtPnNpemUpOworCisJaWYocG9oID09IE5VTEwpIHsKKwkJcmVxLT5vZmZzZXQgPSByZXEtPnNpemUgPSAwOworCQlEUFJJTlRLKCJzaXNmYjogVmlkZW8gUkFNIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwl9IGVsc2UgeworCQlyZXEtPm9mZnNldCA9IHBvaC0+b2Zmc2V0OworCQlyZXEtPnNpemUgPSBwb2gtPnNpemU7CisJCURQUklOVEsoInNpc2ZiOiBWaWRlbyBSQU0gYWxsb2NhdGlvbiBzdWNjZWVkZWQ6IDB4JWx4XG4iLAorCQkJKHBvaC0+b2Zmc2V0ICsgaXZpZGVvLT52aWRlb192YmFzZSkpOworCX0KIH0KIAogdm9pZAogc2lzX21hbGxvYyhzdHJ1Y3Qgc2lzX21lbXJlcSAqcmVxKQogewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gc2lzZmJfaGVhcC52aW5mbzsKLQlTSVNfT0ggKnBvaCA9IE5VTEw7CisJc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSBzaXNmYl9oZWFwLT52aW5mbzsKIAotCWlmKChpdmlkZW8pICYmICghaXZpZGVvLT5oYXZlbm9oZWFwKSkgewotCSAgIHBvaCA9IHNpc2ZiX3BvaF9hbGxvY2F0ZSgodTMyKXJlcS0+c2l6ZSk7Ci0JfQorCWlmKCZpdmlkZW8tPnNpc2ZiX2hlYXAgPT0gc2lzZmJfaGVhcCkKKwkJc2lzX2ludF9tYWxsb2MoaXZpZGVvLCByZXEpOworCWVsc2UKKwkJcmVxLT5vZmZzZXQgPSByZXEtPnNpemUgPSAwOworfQogCi0JaWYocG9oID09IE5VTEwpIHsKLQkgICByZXEtPm9mZnNldCA9IHJlcS0+c2l6ZSA9IDA7Ci0JICAgRFBSSU5USygic2lzZmI6IFZpZGVvIFJBTSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JfSBlbHNlIHsKLQkgICByZXEtPm9mZnNldCA9IHBvaC0+b2Zmc2V0OwotCSAgIHJlcS0+c2l6ZSA9IHBvaC0+c2l6ZTsKLQkgICBEUFJJTlRLKCJzaXNmYjogVmlkZW8gUkFNIGFsbG9jYXRpb24gc3VjY2VlZGVkOiAweCVseFxuIiwKLQkgICAJICAgIChwb2gtPm9mZnNldCArIGl2aWRlby0+dmlkZW9fdmJhc2UpKTsKLQl9Cit2b2lkCitzaXNfbWFsbG9jX25ldyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHNpc19tZW1yZXEgKnJlcSkKK3sKKwlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNpc19pbnRfbWFsbG9jKGl2aWRlbywgcmVxKTsKIH0KIAogLyogc2lzX2ZyZWU6IHUzMiBiZWNhdXNlICJiYXNlIiBpcyBvZmZzZXQgaW5zaWRlIHZpZGVvIHJhbSwgY2FuIG5ldmVyIGJlID40R0IgKi8KIAotdm9pZAotc2lzX2ZyZWUodTMyIGJhc2UpCitzdGF0aWMgdm9pZAorc2lzX2ludF9mcmVlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCB1MzIgYmFzZSkKIHsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IHNpc2ZiX2hlYXAudmluZm87Ci0JU0lTX09IICpwb2g7CisJc3RydWN0IFNJU19PSCAqcG9oOwogCi0JaWYoKCFpdmlkZW8pIHx8IChpdmlkZW8tPmhhdmVub2hlYXApKSByZXR1cm47CisJaWYoKCFpdmlkZW8pIHx8IChpdmlkZW8tPnNpc2ZiX2lkICE9IFNJU0ZCX0lEKSB8fCAoaXZpZGVvLT5oYXZlbm9oZWFwKSkKKwkJcmV0dXJuOwogCi0JcG9oID0gc2lzZmJfcG9oX2ZyZWUoKHUzMiliYXNlKTsKKwlwb2ggPSBzaXNmYl9wb2hfZnJlZSgmaXZpZGVvLT5zaXNmYl9oZWFwLCBiYXNlKTsKIAogCWlmKHBvaCA9PSBOVUxMKSB7CiAJCURQUklOVEsoInNpc2ZiOiBzaXNmYl9wb2hfZnJlZSgpIGZhaWxlZCBhdCBiYXNlIDB4JXhcbiIsCkBAIC0zMzc2LDkgKzM1NjUsNjMgQEAKIAl9CiB9CiAKK3ZvaWQKK3Npc19mcmVlKHUzMiBiYXNlKQoreworCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gc2lzZmJfaGVhcC0+dmluZm87CisKKwlzaXNfaW50X2ZyZWUoaXZpZGVvLCBiYXNlKTsKK30KKwordm9pZAorc2lzX2ZyZWVfbmV3KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgYmFzZSkKK3sKKwlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNpc19pbnRfZnJlZShpdmlkZW8sIGJhc2UpOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0TW9kZSByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyB2b2lkCitzaXNmYl9jaGVja19lbmdpbmVfYW5kX3N5bmMoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCit7CisJdTggY3IzMCwgY3IzMTsKKworCS8qIENoZWNrIGlmIE1NSU8gYW5kIGVuZ2luZXMgYXJlIGVuYWJsZWQsCisJICogYW5kIHN5bmMgaW4gY2FzZSB0aGV5IGFyZS4gQ2FuJ3QgdXNlCisJICogaXZpZGVvLT5hY2NlbCBoZXJlLCBhcyB0aGlzIG1pZ2h0IGhhdmUKKwkgKiBiZWVuIGNoYW5nZWQgYmVmb3JlIHRoaXMgaXMgY2FsbGVkLgorCSAqLworCWluU0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1BDSV9BRERSRVNTX1NFVCwgY3IzMCk7CisJaW5TSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfTU9EVUxFX0VOQUJMRSwgY3IzMSk7CisJLyogTU1JTyBhbmQgMkQvM0QgZW5naW5lIGVuYWJsZWQ/ICovCisJaWYoKGNyMzAgJiBTSVNfTUVNX01BUF9JT19FTkFCTEUpICYmIChjcjMxICYgMHg0MikpIHsKKyNpZmRlZiBDT05GSUdfRkJfU0lTXzMwMAorCQlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKwkJCS8qIERvbid0IGNhcmUgYWJvdXQgVHVyYm9RdWV1ZS4gSXQncworCQkJICogZW5vdWdoIHRvIGtub3cgdGhhdCB0aGUgZW5naW5lcworCQkJICogYXJlIGVuYWJsZWQKKwkJCSAqLworCQkJc2lzZmJfc3luY2FjY2VsKGl2aWRlbyk7CisJCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CisJCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQkJLyogQ2hlY2sgdGhhdCBhbnkgcXVldWUgbW9kZSBpcworCQkJICogZW5hYmxlZCwgYW5kIHRoYXQgdGhlIHF1ZXVlCisJCQkgKiBpcyBub3QgaW4gdGhlIHN0YXRlIG9mICJyZXNldCIKKwkJCSAqLworCQkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4MjYsIGNyMzApOworCQkJaWYoKGNyMzAgJiAweGUwKSAmJiAoIShjcjMwICYgMHgwMSkpKSB7CisJCQkJc2lzZmJfc3luY2FjY2VsKGl2aWRlbyk7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KK30KKworc3RhdGljIHZvaWQKIHNpc2ZiX3ByZV9zZXRtb2RlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewogCXU4IGNyMzAgPSAwLCBjcjMxID0gMCwgY3IzMyA9IDAsIGNyMzUgPSAwLCBjcjM4ID0gMDsKQEAgLTMzODYsNiArMzYyOSw4IEBACiAKIAlpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICY9IChWQl9WSURFT0JSSURHRSB8IFZCX0RJU1BUWVBFX0RJU1AyKTsKIAorCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgMHg4Nik7CisKIAlpblNJU0lEWFJFRyhTSVNDUiwgMHgzMSwgY3IzMSk7CiAJY3IzMSAmPSB+MHg2MDsKIAljcjMxIHw9IDB4MDQ7CkBAIC0zNDEzLDQxICszNjU4LDQzIEBACiAKIAlTaVNfU2V0RW5hYmxlRHN0bigmaXZpZGVvLT5TaVNfUHIsIEZBTFNFKTsKIAlTaVNfU2V0RW5hYmxlRnN0bigmaXZpZGVvLT5TaVNfUHIsIEZBTFNFKTsKKwlpdmlkZW8tPmN1ckZTVE4gPSBpdmlkZW8tPmN1ckRTVE4gPSAwOwogCiAJc3dpdGNoKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBWQl9ESVNQVFlQRV9ESVNQMikgewogCiAJICAgY2FzZSBDUlQyX1RWOgogCSAgICAgIGNyMzggJj0gfjB4YzA7ICAgLyogQ2xlYXIgUEFMLU0gLyBQQUwtTiBiaXRzICovCi0JICAgICAgaWYoKGl2aWRlby0+dmJmbGFncyAmIFRWX1lQQlBSKSAmJiAoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUN8VkJfMzAxTFZ8VkJfMzAyTFYpKSkgeworCSAgICAgIGlmKChpdmlkZW8tPnZiZmxhZ3MgJiBUVl9ZUEJQUikgJiYgKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTWVBCUFJCUklER0UpKSB7CiAjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKLQkgICAgICAgICBpZihpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgewotCSAgICAgICAgICAgIGNyMzggfD0gMHgwNDsKLQkgICAgICAgICAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBUVl9ZUEJQUjUyNVApICAgICAgIGNyMzUgfD0gMHgyMDsKKwkJIGlmKGl2aWRlby0+Y2hpcCA+PSBTSVNfNjYxKSB7CisJCSAgICBjcjM4IHw9IDB4MDQ7CisJCSAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBUVl9ZUEJQUjUyNVApICAgICAgIGNyMzUgfD0gMHgyMDsKIAkJICAgIGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgVFZfWVBCUFI3NTBQKSAgY3IzNSB8PSAweDQwOwogCQkgICAgZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MgJiBUVl9ZUEJQUjEwODBJKSBjcjM1IHw9IDB4NjA7CiAJCSAgICBjcjMwIHw9IFNJU19TSU1VTFRBTkVPVVNfVklFV19FTkFCTEU7CiAJCSAgICBjcjM1ICY9IH4weDAxOwogCQkgICAgaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSAoVFZfWVBCUFIgfCAoaXZpZGVvLT52YmZsYWdzICYgVFZfWVBCUFJBTEwpKTsKLQkgICAgICAgICB9IGVsc2UgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICAgICAgY3IzMCB8PSAoMHg4MCB8IFNJU19TSU1VTFRBTkVPVVNfVklFV19FTkFCTEUpOworCQkgfSBlbHNlIGlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQkgICAgY3IzMCB8PSAoMHg4MCB8IFNJU19TSU1VTFRBTkVPVVNfVklFV19FTkFCTEUpOwogCQkgICAgY3IzOCB8PSAweDA4OwotCSAgICAgICAgICAgIGlmKGl2aWRlby0+dmJmbGFncyAmIFRWX1lQQlBSNTI1UCkgICAgICAgY3IzOCB8PSAweDEwOworCQkgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgVFZfWVBCUFI1MjVQKSAgICAgICBjcjM4IHw9IDB4MTA7CiAJCSAgICBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIFRWX1lQQlBSNzUwUCkgIGNyMzggfD0gMHgyMDsKIAkJICAgIGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgVFZfWVBCUFIxMDgwSSkgY3IzOCB8PSAweDMwOwogCQkgICAgY3IzMSAmPSB+MHgwMTsKIAkJICAgIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gKFRWX1lQQlBSIHwgKGl2aWRlby0+dmJmbGFncyAmIFRWX1lQQlBSQUxMKSk7Ci0JICAgICAgICAgfQorCQkgfQogI2VuZGlmCi0JICAgICAgfSBlbHNlIGlmKChpdmlkZW8tPnZiZmxhZ3MgJiBUVl9ISVZJU0lPTikgJiYgKGl2aWRlby0+dmJmbGFncyAmIChWQl8zMDF8VkJfMzAxQnxWQl8zMDJCKSkpIHsKLQkgICAgICAgICBpZihpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgewotCSAgICAgICAgICAgIGNyMzggfD0gMHgwNDsKLQkgICAgICAgICAgICBjcjM1IHw9IDB4NjA7Ci0JICAgICAgICAgfSBlbHNlIHsKLQkgICAgICAgICAgICBjcjMwIHw9IDB4ODA7Ci0JICAgICAgICAgfQorCSAgICAgIH0gZWxzZSBpZigoaXZpZGVvLT52YmZsYWdzICYgVFZfSElWSVNJT04pICYmCisJCQkJKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTSElWSVNJT05CUklER0UpKSB7CisJCSBpZihpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgeworCQkgICAgY3IzOCB8PSAweDA0OworCQkgICAgY3IzNSB8PSAweDYwOworCQkgfSBlbHNlIHsKKwkJICAgIGNyMzAgfD0gMHg4MDsKKwkJIH0KIAkJIGNyMzAgfD0gU0lTX1NJTVVMVEFORU9VU19WSUVXX0VOQUJMRTsKLQkgICAgICAgICBjcjMxIHw9IDB4MDE7Ci0JICAgICAgICAgY3IzNSB8PSAweDAxOworCQkgY3IzMSB8PSAweDAxOworCQkgY3IzNSB8PSAweDAxOwogCQkgaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBUVl9ISVZJU0lPTjsKIAkgICAgICB9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgVFZfU0NBUlQpIHsKIAkJIGNyMzAgPSAoU0lTX1ZCX09VVFBVVF9TQ0FSVCB8IFNJU19TSU1VTFRBTkVPVVNfVklFV19FTkFCTEUpOwpAQCAtMzQ2Niw4ICszNzEzLDggQEAKIAkgICAgICB9CiAJICAgICAgY3IzMSB8PSBTSVNfRFJJVkVSX01PREU7CiAKLQkgICAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiAoVFZfQVZJREVPfFRWX1NWSURFTykpIHsKLQkgICAgICAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBUVl9QQUwpIHsKKwkgICAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiAoVFZfQVZJREVPIHwgVFZfU1ZJREVPKSkgeworCQkgaWYoaXZpZGVvLT52YmZsYWdzICYgVFZfUEFMKSB7CiAJCSAgICBjcjMxIHw9IDB4MDE7IGNyMzUgfD0gMHgwMTsKIAkJICAgIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gVFZfUEFMOwogCQkgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgVFZfUEFMTSkgewpAQCAtMzQ3NiwxNCArMzcyMywxNCBAQAogCQkgICAgfSBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIFRWX1BBTE4pIHsKIAkJICAgICAgIGNyMzggfD0gMHg4MDsgY3IzNSB8PSAweDA4OwogCQkgICAgICAgaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBUVl9QQUxOOwotCSAgCSAgICB9Ci0gICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCSAgICB9CisJCSB9IGVsc2UgewogCQkgICAgY3IzMSAmPSB+MHgwMTsgY3IzNSAmPSB+MHgwMTsKIAkJICAgIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gVFZfTlRTQzsKIAkJICAgIGlmKGl2aWRlby0+dmJmbGFncyAmIFRWX05UU0NKKSB7CiAJCSAgICAgICBjcjM4IHw9IDB4NDA7IGNyMzUgfD0gMHgwMjsKIAkJICAgICAgIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gVFZfTlRTQ0o7Ci0JIAkgICAgfQorCQkgICAgfQogCQkgfQogCSAgICAgIH0KIAkgICAgICBicmVhazsKQEAgLTM0OTMsNiArMzc0MCw4IEBACiAJICAgICAgY3IzMSB8PSBTSVNfRFJJVkVSX01PREU7CiAJICAgICAgU2lTX1NldEVuYWJsZURzdG4oJml2aWRlby0+U2lTX1ByLCBpdmlkZW8tPnNpc2ZiX2RzdG4pOwogCSAgICAgIFNpU19TZXRFbmFibGVGc3RuKCZpdmlkZW8tPlNpU19QciwgaXZpZGVvLT5zaXNmYl9mc3RuKTsKKwkgICAgICBpdmlkZW8tPmN1ckZTVE4gPSBpdmlkZW8tPnNpc2ZiX2ZzdG47CisJICAgICAgaXZpZGVvLT5jdXJEU1ROID0gaXZpZGVvLT5zaXNmYl9kc3RuOwogCSAgICAgIGJyZWFrOwogCiAJICAgY2FzZSBDUlQyX1ZHQToKQEAgLTM1MjUsOSArMzc3NCw5IEBACiAJfQogCW91dFNJU0lEWFJFRyhTSVNDUiwgMHgzMSwgY3IzMSk7CiAKLQlpZihpdmlkZW8tPmFjY2VsKSBzaXNmYl9zeW5jYWNjZWwoaXZpZGVvKTsKLQogCWl2aWRlby0+U2lTX1ByLlNpU19Vc2VPRU0gPSBpdmlkZW8tPnNpc2ZiX3VzZW9lbTsKKworCXNpc2ZiX2NoZWNrX2VuZ2luZV9hbmRfc3luYyhpdmlkZW8pOwogfQogCiAvKiBGaXggU1IxMSBmb3IgNjYxIGFuZCBsYXRlciAqLwpAQCAtMzUzNSwxMjUgKzM3ODQsMTI5IEBACiBzdGF0aWMgdm9pZAogc2lzZmJfZml4dXBfU1IxMShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKLSAgICB1OCAgdG1wcmVnOworCXU4ICB0bXByZWc7CiAKLSAgICBpZihpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgewotICAgICAgIGluU0lTSURYUkVHKFNJU1NSLDB4MTEsdG1wcmVnKTsKLSAgICAgICBpZih0bXByZWcgJiAweDIwKSB7Ci0gICAgICAgICAgaW5TSVNJRFhSRUcoU0lTU1IsMHgzZSx0bXByZWcpOwotCSAgdG1wcmVnID0gKHRtcHJlZyArIDEpICYgMHhmZjsKLQkgIG91dFNJU0lEWFJFRyhTSVNTUiwweDNlLHRtcHJlZyk7Ci0JICBpblNJU0lEWFJFRyhTSVNTUiwweDExLHRtcHJlZyk7Ci0gICAgICAgfQotICAgICAgIGlmKHRtcHJlZyAmIDB4ZjApIHsKLSAgICAgICAgICBhbmRTSVNJRFhSRUcoU0lTU1IsMHgxMSwweDBmKTsKLSAgICAgICB9Ci0gICAgfQorCWlmKGl2aWRlby0+Y2hpcCA+PSBTSVNfNjYxKSB7CisJCWluU0lTSURYUkVHKFNJU1NSLDB4MTEsdG1wcmVnKTsKKwkJaWYodG1wcmVnICYgMHgyMCkgeworCQkJaW5TSVNJRFhSRUcoU0lTU1IsMHgzZSx0bXByZWcpOworCQkJdG1wcmVnID0gKHRtcHJlZyArIDEpICYgMHhmZjsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwweDNlLHRtcHJlZyk7CisJCQlpblNJU0lEWFJFRyhTSVNTUiwweDExLHRtcHJlZyk7CisJCX0KKwkJaWYodG1wcmVnICYgMHhmMCkgeworCQkJYW5kU0lTSURYUkVHKFNJU1NSLDB4MTEsMHgwZik7CisJCX0KKwl9CiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgc2lzZmJfc2V0X1RWeHBvc29mZnNldChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IHZhbCkKK3N0YXRpYyB2b2lkCitzaXNmYl9zZXRfVFZ4cG9zb2Zmc2V0KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBpbnQgdmFsKQogewotICAgaWYodmFsID4gMzIpIHZhbCA9IDMyOwotICAgaWYodmFsIDwgLTMyKSB2YWwgPSAtMzI7Ci0gICBpdmlkZW8tPnR2eHBvcyA9IHZhbDsKKwlpZih2YWwgPiAzMikgdmFsID0gMzI7CisJaWYodmFsIDwgLTMyKSB2YWwgPSAtMzI7CisJaXZpZGVvLT50dnhwb3MgPSB2YWw7CiAKLSAgIGlmKGl2aWRlby0+c2lzZmJsb2NrZWQpIHJldHVybjsKLSAgIGlmKCFpdmlkZW8tPm1vZGVjaGFuZ2VkKSByZXR1cm47CisJaWYoaXZpZGVvLT5zaXNmYmxvY2tlZCkgcmV0dXJuOworCWlmKCFpdmlkZW8tPm1vZGVjaGFuZ2VkKSByZXR1cm47CiAKLSAgIGlmKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBDUlQyX1RWKSB7CisJaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIENSVDJfVFYpIHsKIAotICAgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfQ0hST05URUwpIHsKKwkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9DSFJPTlRFTCkgewogCi0JIGludCB4ID0gaXZpZGVvLT50dng7CisJCQlpbnQgeCA9IGl2aWRlby0+dHZ4OwogCi0JIHN3aXRjaChpdmlkZW8tPmNocm9udGVsdHlwZSkgewotCSBjYXNlIDE6Ci0JICAgICB4ICs9IHZhbDsKLQkgICAgIGlmKHggPCAwKSB4ID0gMDsKLQkgICAgIG91dFNJU0lEWFJFRyhTSVNTUiwweDA1LDB4ODYpOwotCSAgICAgU2lTX1NldENINzAweCgmaXZpZGVvLT5TaVNfUHIsICgoKHggJiAweGZmKSA8PCA4KSB8IDB4MGEpKTsKLQkgICAgIFNpU19TZXRDSDcweHhBTkRPUigmaXZpZGVvLT5TaVNfUHIsICgoKHggJiAweDAxMDApIDw8IDEpIHwgMHgwOCksMHhGRCk7Ci0JICAgICBicmVhazsKLQkgY2FzZSAyOgotCSAgICAgLyogTm90IHN1cHBvcnRlZCBieSBoYXJkd2FyZSAqLwotCSAgICAgYnJlYWs7Ci0JIH0KKwkJCXN3aXRjaChpdmlkZW8tPmNocm9udGVsdHlwZSkgeworCQkJY2FzZSAxOgorCQkJCXggKz0gdmFsOworCQkJCWlmKHggPCAwKSB4ID0gMDsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgwNSwweDg2KTsKKwkJCQlTaVNfU2V0Q0g3MDB4KCZpdmlkZW8tPlNpU19QciwgMHgwYSwgKHggJiAweGZmKSk7CisJCQkJU2lTX1NldENINzB4eEFORE9SKCZpdmlkZW8tPlNpU19QciwgMHgwOCwgKCh4ICYgMHgwMTAwKSA+PiA3KSwgMHhGRCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJLyogTm90IHN1cHBvcnRlZCBieSBoYXJkd2FyZSAqLworCQkJCWJyZWFrOworCQkJfQogCi0gICAgICB9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfU0lTQlJJREdFKSB7CisJCX0gZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU0JSSURHRSkgewogCi0JIHU4IHAyXzFmLHAyXzIwLHAyXzJiLHAyXzQyLHAyXzQzOwotCSB1bnNpZ25lZCBzaG9ydCB0ZW1wOworCQkJdTggcDJfMWYscDJfMjAscDJfMmIscDJfNDIscDJfNDM7CisJCQl1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCi0JIHAyXzFmID0gaXZpZGVvLT5wMl8xZjsKLQkgcDJfMjAgPSBpdmlkZW8tPnAyXzIwOwotCSBwMl8yYiA9IGl2aWRlby0+cDJfMmI7Ci0JIHAyXzQyID0gaXZpZGVvLT5wMl80MjsKLQkgcDJfNDMgPSBpdmlkZW8tPnAyXzQzOworCQkJcDJfMWYgPSBpdmlkZW8tPnAyXzFmOworCQkJcDJfMjAgPSBpdmlkZW8tPnAyXzIwOworCQkJcDJfMmIgPSBpdmlkZW8tPnAyXzJiOworCQkJcDJfNDIgPSBpdmlkZW8tPnAyXzQyOworCQkJcDJfNDMgPSBpdmlkZW8tPnAyXzQzOwogCi0JIHRlbXAgPSBwMl8xZiB8ICgocDJfMjAgJiAweGYwKSA8PCA0KTsKLQkgdGVtcCArPSAodmFsICogMik7Ci0JIHAyXzFmID0gdGVtcCAmIDB4ZmY7Ci0JIHAyXzIwID0gKHRlbXAgJiAweGYwMCkgPj4gNDsKLQkgcDJfMmIgPSAoKHAyXzJiICYgMHgwZikgKyAodmFsICogMikpICYgMHgwZjsKLQkgdGVtcCA9IHAyXzQzIHwgKChwMl80MiAmIDB4ZjApIDw8IDQpOwotCSB0ZW1wICs9ICh2YWwgKiAyKTsKLQkgcDJfNDMgPSB0ZW1wICYgMHhmZjsKLQkgcDJfNDIgPSAodGVtcCAmIDB4ZjAwKSA+PiA0OwotCSBvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgxZixwMl8xZik7Ci0JIHNldFNJU0lEWFJFRyhTSVNQQVJUMiwweDIwLDB4MEYscDJfMjApOwotCSBzZXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgyYiwweEYwLHAyXzJiKTsKLQkgc2V0U0lTSURYUkVHKFNJU1BBUlQyLDB4NDIsMHgwRixwMl80Mik7Ci0JIG91dFNJU0lEWFJFRyhTSVNQQVJUMiwweDQzLHAyXzQzKTsKLSAgICAgIH0KLSAgIH0KKwkJCXRlbXAgPSBwMl8xZiB8ICgocDJfMjAgJiAweGYwKSA8PCA0KTsKKwkJCXRlbXAgKz0gKHZhbCAqIDIpOworCQkJcDJfMWYgPSB0ZW1wICYgMHhmZjsKKwkJCXAyXzIwID0gKHRlbXAgJiAweGYwMCkgPj4gNDsKKwkJCXAyXzJiID0gKChwMl8yYiAmIDB4MGYpICsgKHZhbCAqIDIpKSAmIDB4MGY7CisJCQl0ZW1wID0gcDJfNDMgfCAoKHAyXzQyICYgMHhmMCkgPDwgNCk7CisJCQl0ZW1wICs9ICh2YWwgKiAyKTsKKwkJCXAyXzQzID0gdGVtcCAmIDB4ZmY7CisJCQlwMl80MiA9ICh0ZW1wICYgMHhmMDApID4+IDQ7CisJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgxZixwMl8xZik7CisJCQlzZXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgyMCwweDBGLHAyXzIwKTsKKwkJCXNldFNJU0lEWFJFRyhTSVNQQVJUMiwweDJiLDB4RjAscDJfMmIpOworCQkJc2V0U0lTSURYUkVHKFNJU1BBUlQyLDB4NDIsMHgwRixwMl80Mik7CisJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHg0MyxwMl80Myk7CisJCX0KKwl9CiB9CiAKLXN0YXRpYyB2b2lkIHNpc2ZiX3NldF9UVnlwb3NvZmZzZXQoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIGludCB2YWwpCitzdGF0aWMgdm9pZAorc2lzZmJfc2V0X1RWeXBvc29mZnNldChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IHZhbCkKIHsKLSAgIGlmKHZhbCA+IDMyKSB2YWwgPSAzMjsKLSAgIGlmKHZhbCA8IC0zMikgdmFsID0gLTMyOwotICAgaXZpZGVvLT50dnlwb3MgPSB2YWw7CisJaWYodmFsID4gMzIpIHZhbCA9IDMyOworCWlmKHZhbCA8IC0zMikgdmFsID0gLTMyOworCWl2aWRlby0+dHZ5cG9zID0gdmFsOwogCi0gICBpZihpdmlkZW8tPnNpc2ZibG9ja2VkKSByZXR1cm47Ci0gICBpZighaXZpZGVvLT5tb2RlY2hhbmdlZCkgcmV0dXJuOworCWlmKGl2aWRlby0+c2lzZmJsb2NrZWQpIHJldHVybjsKKwlpZighaXZpZGVvLT5tb2RlY2hhbmdlZCkgcmV0dXJuOwogCi0gICBpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgQ1JUMl9UVikgeworCWlmKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBDUlQyX1RWKSB7CiAKLSAgICAgIGlmKGl2aWRlby0+dmJmbGFncyAmIFZCX0NIUk9OVEVMKSB7CisJCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfQ0hST05URUwpIHsKIAotCSBpbnQgeSA9IGl2aWRlby0+dHZ5OworCQkJaW50IHkgPSBpdmlkZW8tPnR2eTsKIAotCSBzd2l0Y2goaXZpZGVvLT5jaHJvbnRlbHR5cGUpIHsKLQkgY2FzZSAxOgotCSAgICB5IC09IHZhbDsKLQkgICAgaWYoeSA8IDApIHkgPSAwOwotCSAgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgwNSwweDg2KTsKLQkgICAgU2lTX1NldENINzAweCgmaXZpZGVvLT5TaVNfUHIsICgoKHkgJiAweGZmKSA8PCA4KSB8IDB4MGIpKTsKLQkgICAgU2lTX1NldENINzB4eEFORE9SKCZpdmlkZW8tPlNpU19QciwgKCh5ICYgMHgwMTAwKSB8IDB4MDgpLDB4RkUpOwotCSAgICBicmVhazsKLQkgY2FzZSAyOgotCSAgICAvKiBOb3Qgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlICovCi0JICAgIGJyZWFrOwotCSB9CisJCQlzd2l0Y2goaXZpZGVvLT5jaHJvbnRlbHR5cGUpIHsKKwkJCWNhc2UgMToKKwkJCQl5IC09IHZhbDsKKwkJCQlpZih5IDwgMCkgeSA9IDA7CisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLDB4MDUsMHg4Nik7CisJCQkJU2lTX1NldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGIsICh5ICYgMHhmZikpOworCQkJCVNpU19TZXRDSDcweHhBTkRPUigmaXZpZGVvLT5TaVNfUHIsIDB4MDgsICgoeSAmIDB4MDEwMCkgPj4gOCksIDB4RkUpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCS8qIE5vdCBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUgKi8KKwkJCQlicmVhazsKKwkJCX0KIAotICAgICAgfSBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIFZCX1NJU0JSSURHRSkgeworCQl9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9TSVNCUklER0UpIHsKIAotCSBjaGFyIHAyXzAxLCBwMl8wMjsKLQkgdmFsIC89IDI7Ci0JIHAyXzAxID0gaXZpZGVvLT5wMl8wMTsKLQkgcDJfMDIgPSBpdmlkZW8tPnAyXzAyOworCQkJY2hhciBwMl8wMSwgcDJfMDI7CisJCQl2YWwgLz0gMjsKKwkJCXAyXzAxID0gaXZpZGVvLT5wMl8wMTsKKwkJCXAyXzAyID0gaXZpZGVvLT5wMl8wMjsKIAotCSBwMl8wMSArPSB2YWw7Ci0JIHAyXzAyICs9IHZhbDsKLQkgd2hpbGUoKHAyXzAxIDw9IDApIHx8IChwMl8wMiA8PSAwKSkgewotCSAgICBwMl8wMSArPSAyOwotCSAgICBwMl8wMiArPSAyOwotCSB9Ci0JIG91dFNJU0lEWFJFRyhTSVNQQVJUMiwweDAxLHAyXzAxKTsKLQkgb3V0U0lTSURYUkVHKFNJU1BBUlQyLDB4MDIscDJfMDIpOwotICAgICAgfQotICAgfQorCQkJcDJfMDEgKz0gdmFsOworCQkJcDJfMDIgKz0gdmFsOworCQkJaWYoIShpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgKFRWX0hJVklTSU9OIHwgVFZfWVBCUFIpKSkgeworCQkJCXdoaWxlKChwMl8wMSA8PSAwKSB8fCAocDJfMDIgPD0gMCkpIHsKKwkJCQkJcDJfMDEgKz0gMjsKKwkJCQkJcDJfMDIgKz0gMjsKKwkJCQl9CisJCQl9CisJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgwMSxwMl8wMSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgwMixwMl8wMik7CisJCX0KKwl9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0zNjY4LDIwNyArMzkyMSwxNzIgQEAKIAl1OCByZWcxOwogI2VuZGlmCiAKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgwNSwweDg2KTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MDUsIDB4ODYpOwogCiAjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKIAlzaXNmYl9maXh1cF9TUjExKGl2aWRlbyk7CiAjZW5kaWYKIAogCS8qIE5vdyB3ZSBhY3R1YWxseSBIQVZFIGNoYW5nZWQgdGhlIGRpc3BsYXkgbW9kZSAqLwotICAgICAgICBpdmlkZW8tPm1vZGVjaGFuZ2VkID0gMTsKKwlpdmlkZW8tPm1vZGVjaGFuZ2VkID0gMTsKIAogCS8qIFdlIGNhbid0IHN3aXRjaCBvZmYgQ1JUMSBpZiBicmlkZ2UgaXMgaW4gc2xhdmUgbW9kZSAqLwotCWlmKGl2aWRlby0+dmJmbGFncyAmIFZCX1ZJREVPQlJJREdFKSB7CisJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9WSURFT0JSSURHRSkgewogCQlpZihzaXNmYl9icmlkZ2Vpc3NsYXZlKGl2aWRlbykpIGRvaXQgPSBGQUxTRTsKLQl9IGVsc2UgaXZpZGVvLT5zaXNmYl9jcnQxb2ZmID0gMDsKKwl9IGVsc2UKKwkJaXZpZGVvLT5zaXNmYl9jcnQxb2ZmID0gMDsKIAogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCiAJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JICAgaWYoKGl2aWRlby0+c2lzZmJfY3J0MW9mZikgJiYgKGRvaXQpKSB7Ci0JICAgICAgICBjcnQxaXNvZmYgPSBUUlVFOwotCQlyZWcgPSAweDAwOwotCSAgIH0gZWxzZSB7Ci0JICAgICAgICBjcnQxaXNvZmYgPSBGQUxTRTsKLQkJcmVnID0gMHg4MDsKLQkgICB9Ci0JICAgc2V0U0lTSURYUkVHKFNJU0NSLCAweDE3LCAweDdmLCByZWcpOworCQlpZigoaXZpZGVvLT5zaXNmYl9jcnQxb2ZmKSAmJiAoZG9pdCkpIHsKKwkJCWNydDFpc29mZiA9IFRSVUU7CisJCQlyZWcgPSAweDAwOworCQl9IGVsc2UgeworCQkJY3J0MWlzb2ZmID0gRkFMU0U7CisJCQlyZWcgPSAweDgwOworCQl9CisJCXNldFNJU0lEWFJFRyhTSVNDUiwgMHgxNywgMHg3ZiwgcmVnKTsKIAl9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQogCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgIGlmKChpdmlkZW8tPnNpc2ZiX2NydDFvZmYpICYmIChkb2l0KSkgewotCSAgICAgICAgY3J0MWlzb2ZmID0gVFJVRTsKLQkJcmVnICA9IDB4NDA7Ci0JCXJlZzEgPSAweGMwOwotCSAgIH0gZWxzZSB7Ci0JICAgICAgICBjcnQxaXNvZmYgPSBGQUxTRTsKLQkJcmVnICA9IDB4MDA7Ci0JCXJlZzEgPSAweDAwOwotCi0JICAgfQotCSAgIHNldFNJU0lEWFJFRyhTSVNDUiwgaXZpZGVvLT5TaVNfUHIuU2lTX015Q1I2MywgfjB4NDAsIHJlZyk7Ci0JICAgc2V0U0lTSURYUkVHKFNJU1NSLCAweDFmLCB+MHhjMCwgcmVnMSk7CisJCWlmKChpdmlkZW8tPnNpc2ZiX2NydDFvZmYpICYmIChkb2l0KSkgeworCQkJY3J0MWlzb2ZmID0gVFJVRTsKKwkJCXJlZyAgPSAweDQwOworCQkJcmVnMSA9IDB4YzA7CisJCX0gZWxzZSB7CisJCQljcnQxaXNvZmYgPSBGQUxTRTsKKwkJCXJlZyAgPSAweDAwOworCQkJcmVnMSA9IDB4MDA7CisJCX0KKwkJc2V0U0lTSURYUkVHKFNJU0NSLCBpdmlkZW8tPlNpU19Qci5TaVNfTXlDUjYzLCB+MHg0MCwgcmVnKTsKKwkJc2V0U0lTSURYUkVHKFNJU1NSLCAweDFmLCB+MHhjMCwgcmVnMSk7CiAJfQogI2VuZGlmCiAKIAlpZihjcnQxaXNvZmYpIHsKLQkgICBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICY9IH5WQl9ESVNQVFlQRV9DUlQxOwotCSAgIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gVkJfU0lOR0xFX01PREU7CisJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJj0gflZCX0RJU1BUWVBFX0NSVDE7CisJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gVkJfU0lOR0xFX01PREU7CiAJfSBlbHNlIHsKLQkgICBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IFZCX0RJU1BUWVBFX0NSVDE7Ci0JICAgaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0NSVDIpIHsKLQkgIAlpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IFZCX01JUlJPUl9NT0RFOwotCSAgIH0gZWxzZSB7Ci0JIAlpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IFZCX1NJTkdMRV9NT0RFOwotCSAgIH0KKwkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBWQl9ESVNQVFlQRV9DUlQxOworCQlpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgVkJfRElTUFRZUEVfQ1JUMikgeworCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBWQl9NSVJST1JfTU9ERTsKKwkJfSBlbHNlIHsKKwkJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gVkJfU0lOR0xFX01PREU7CisJCX0KIAl9CiAKLSAgICAgICAgYW5kU0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1JBTURBQ19DT05UUk9MLCB+MHgwNCk7CisJYW5kU0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1JBTURBQ19DT05UUk9MLCB+MHgwNCk7CiAKIAlpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgQ1JUMl9UVikgewotCSAgIGlmKGl2aWRlby0+dmJmbGFncyAmIFZCX1NJU0JSSURHRSkgewotCSAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQyLDB4MWYsaXZpZGVvLT5wMl8xZik7Ci0JICAgICAgaW5TSVNJRFhSRUcoU0lTUEFSVDIsMHgyMCxpdmlkZW8tPnAyXzIwKTsKLQkgICAgICBpblNJU0lEWFJFRyhTSVNQQVJUMiwweDJiLGl2aWRlby0+cDJfMmIpOwotCSAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQyLDB4NDIsaXZpZGVvLT5wMl80Mik7Ci0JICAgICAgaW5TSVNJRFhSRUcoU0lTUEFSVDIsMHg0MyxpdmlkZW8tPnAyXzQzKTsKLQkgICAgICBpblNJU0lEWFJFRyhTSVNQQVJUMiwweDAxLGl2aWRlby0+cDJfMDEpOwotCSAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQyLDB4MDIsaXZpZGVvLT5wMl8wMik7Ci0JICAgfSBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIFZCX0NIUk9OVEVMKSB7Ci0JICAgICAgaWYoaXZpZGVvLT5jaHJvbnRlbHR5cGUgPT0gMSkgewotCSAgICAgICAgIGl2aWRlby0+dHZ4ID0gU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGEpOwotCSAgICAgICAgIGl2aWRlby0+dHZ4IHw9ICgoKFNpU19HZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDA4KSAmIDB4MDIpID4+IDEpIDw8IDgpOwotCSAgICAgICAgIGl2aWRlby0+dHZ5ID0gU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGIpOwotCSAgICAgICAgIGl2aWRlby0+dHZ5IHw9ICgoU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MDgpICYgMHgwMSkgPDwgOCk7Ci0gCSAgICAgIH0KLQkgICB9CisJCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTQlJJREdFKSB7CisJCQlpblNJU0lEWFJFRyhTSVNQQVJUMiwweDFmLGl2aWRlby0+cDJfMWYpOworCQkJaW5TSVNJRFhSRUcoU0lTUEFSVDIsMHgyMCxpdmlkZW8tPnAyXzIwKTsKKwkJCWluU0lTSURYUkVHKFNJU1BBUlQyLDB4MmIsaXZpZGVvLT5wMl8yYik7CisJCQlpblNJU0lEWFJFRyhTSVNQQVJUMiwweDQyLGl2aWRlby0+cDJfNDIpOworCQkJaW5TSVNJRFhSRUcoU0lTUEFSVDIsMHg0MyxpdmlkZW8tPnAyXzQzKTsKKwkJCWluU0lTSURYUkVHKFNJU1BBUlQyLDB4MDEsaXZpZGVvLT5wMl8wMSk7CisJCQlpblNJU0lEWFJFRyhTSVNQQVJUMiwweDAyLGl2aWRlby0+cDJfMDIpOworCQl9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9DSFJPTlRFTCkgeworCQkJaWYoaXZpZGVvLT5jaHJvbnRlbHR5cGUgPT0gMSkgeworCQkJCWl2aWRlby0+dHZ4ID0gU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGEpOworCQkJCWl2aWRlby0+dHZ4IHw9ICgoKFNpU19HZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDA4KSAmIDB4MDIpID4+IDEpIDw8IDgpOworCQkJCWl2aWRlby0+dHZ5ID0gU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGIpOworCQkJCWl2aWRlby0+dHZ5IHw9ICgoU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MDgpICYgMHgwMSkgPDwgOCk7CisJCQl9CisJCX0KIAl9CiAKIAlpZihpdmlkZW8tPnR2eHBvcykgewotICAgCSAgIHNpc2ZiX3NldF9UVnhwb3NvZmZzZXQoaXZpZGVvLCBpdmlkZW8tPnR2eHBvcyk7CisJCXNpc2ZiX3NldF9UVnhwb3NvZmZzZXQoaXZpZGVvLCBpdmlkZW8tPnR2eHBvcyk7CiAJfQogCWlmKGl2aWRlby0+dHZ5cG9zKSB7Ci0gICAJICAgc2lzZmJfc2V0X1RWeXBvc29mZnNldChpdmlkZW8sIGl2aWRlby0+dHZ5cG9zKTsKKwkJc2lzZmJfc2V0X1RWeXBvc29mZnNldChpdmlkZW8sIGl2aWRlby0+dHZ5cG9zKTsKIAl9CiAKLQlpZigoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIENSVDJfVFYpICYmIChpdmlkZW8tPnZiZmxhZ3MgJiBWQl8zMDEpKSB7ICAvKiBTZXQgZmlsdGVyIGZvciBTaVMzMDEgKi8KKwkvKiBFdmVudHVhbGx5IHN5bmMgZW5naW5lcyAqLworCXNpc2ZiX2NoZWNrX2VuZ2luZV9hbmRfc3luYyhpdmlkZW8pOwogCi0JICAgCXVuc2lnbmVkIGNoYXIgZmlsdGVyX3RiID0gMDsKKwkvKiAoUmUtKUluaXRpYWxpemUgY2hpcCBlbmdpbmVzICovCisJaWYoaXZpZGVvLT5hY2NlbCkgeworCQlzaXNmYl9lbmdpbmVfaW5pdChpdmlkZW8pOworCX0gZWxzZSB7CisJCWl2aWRlby0+ZW5naW5lb2sgPSAwOworCX0KK30KIAotCQlzd2l0Y2ggKGl2aWRlby0+dmlkZW9fd2lkdGgpIHsKLQkJICAgY2FzZSAzMjA6Ci0JCQlmaWx0ZXJfdGIgPSAoaXZpZGVvLT52YmZsYWdzICYgVFZfTlRTQykgPyA0IDogMTI7Ci0JCQlicmVhazsKLQkJICAgY2FzZSA2NDA6Ci0JCQlmaWx0ZXJfdGIgPSAoaXZpZGVvLT52YmZsYWdzICYgVFZfTlRTQykgPyA1IDogMTM7Ci0JCQlicmVhazsKLQkJICAgY2FzZSA3MjA6Ci0JCQlmaWx0ZXJfdGIgPSAoaXZpZGVvLT52YmZsYWdzICYgVFZfTlRTQykgPyA2IDogMTQ7Ci0JCQlicmVhazsKLQkJICAgY2FzZSA0MDA6Ci0JCSAgIGNhc2UgODAwOgotCQkJZmlsdGVyX3RiID0gKGl2aWRlby0+dmJmbGFncyAmIFRWX05UU0MpID8gNyA6IDE1OwotCQkJYnJlYWs7Ci0JCSAgIGRlZmF1bHQ6Ci0JCQlpdmlkZW8tPnNpc2ZiX2ZpbHRlciA9IC0xOwotCQkJYnJlYWs7CitzdGF0aWMgaW50CitzaXNmYl9yZXNldF9tb2RlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQoreworCWlmKHNpc2ZiX3NldF9tb2RlKGl2aWRlbywgMCkpCisJCXJldHVybiAxOworCisJc2lzZmJfc2V0X3BpdGNoKGl2aWRlbyk7CisJc2lzZmJfc2V0X2Jhc2VfQ1JUMShpdmlkZW8sIGl2aWRlby0+Y3VycmVudF9iYXNlKTsKKwlzaXNmYl9zZXRfYmFzZV9DUlQyKGl2aWRlbywgaXZpZGVvLT5jdXJyZW50X2Jhc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzaXNmYl9oYW5kbGVfY29tbWFuZChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgc3RydWN0IHNpc2ZiX2NtZCAqc2lzZmJfY29tbWFuZCkKK3sKKwlpbnQgbXljcnQxb2ZmOworCisJc3dpdGNoKHNpc2ZiX2NvbW1hbmQtPnNpc2ZiX2NtZCkgeworCWNhc2UgU0lTRkJfQ01EX0dFVFZCRkxBR1M6CisJCWlmKCFpdmlkZW8tPm1vZGVjaGFuZ2VkKSB7CisJCQlzaXNmYl9jb21tYW5kLT5zaXNmYl9yZXN1bHRbMF0gPSBTSVNGQl9DTURfRVJSX0VBUkxZOworCQl9IGVsc2UgeworCQkJc2lzZmJfY29tbWFuZC0+c2lzZmJfcmVzdWx0WzBdID0gU0lTRkJfQ01EX0VSUl9PSzsKKwkJCXNpc2ZiX2NvbW1hbmQtPnNpc2ZiX3Jlc3VsdFsxXSA9IGl2aWRlby0+Y3VycmVudHZiZmxhZ3M7CisJCQlzaXNmYl9jb21tYW5kLT5zaXNmYl9yZXN1bHRbMl0gPSBpdmlkZW8tPnZiZmxhZ3MyOwogCQl9Ci0KLQkJb3JTSVNJRFhSRUcoU0lTUEFSVDEsIGl2aWRlby0+Q1JUMl93cml0ZV9lbmFibGUsIDB4MDEpOwotCi0JCWlmKGl2aWRlby0+dmJmbGFncyAmIFRWX05UU0MpIHsKLQotCQkgICAgICAgIGFuZFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzYSwgMHgxZik7Ci0KLQkJCWlmIChpdmlkZW8tPnZiZmxhZ3MgJiBUVl9TVklERU8pIHsKLQotCQkJICAgICAgICBhbmRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzAsIDB4ZGYpOwotCi0JCQl9IGVsc2UgaWYgKGl2aWRlby0+dmJmbGFncyAmIFRWX0FWSURFTykgewotCi0JCQkgICAgICAgIG9yU0lTSURYUkVHKFNJU1BBUlQyLCAweDMwLCAweDIwKTsKLQotCQkJCXN3aXRjaCAoaXZpZGVvLT52aWRlb193aWR0aCkgewotCQkJCWNhc2UgNjQwOgotCQkJCSAgICAgICAgb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM1LCAweEVCKTsKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM2LCAweDA0KTsKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM3LCAweDI1KTsKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM4LCAweDE4KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA3MjA6Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzNSwgMHhFRSk7Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzNiwgMHgwQyk7Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzNywgMHgyMik7Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzOCwgMHgwOCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDAwOgotCQkJCWNhc2UgODAwOgotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzUsIDB4RUIpOwotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzYsIDB4MTUpOwotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzcsIDB4MjUpOwotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzgsIDB4RjYpOwotCQkJCQlicmVhazsKKwkJYnJlYWs7CisJY2FzZSBTSVNGQl9DTURfU1dJVENIQ1JUMToKKwkJLyogYXJnWzBdOiAwID0gb2ZmLCAxID0gb24sIDk5ID0gcXVlcnkgKi8KKwkJaWYoIWl2aWRlby0+bW9kZWNoYW5nZWQpIHsKKwkJCXNpc2ZiX2NvbW1hbmQtPnNpc2ZiX3Jlc3VsdFswXSA9IFNJU0ZCX0NNRF9FUlJfRUFSTFk7CisJCX0gZWxzZSBpZihzaXNmYl9jb21tYW5kLT5zaXNmYl9hcmdbMF0gPT0gOTkpIHsKKwkJCS8qIFF1ZXJ5ICovCisJCQlzaXNmYl9jb21tYW5kLT5zaXNmYl9yZXN1bHRbMV0gPSBpdmlkZW8tPnNpc2ZiX2NydDFvZmYgPyAwIDogMTsKKwkJCXNpc2ZiX2NvbW1hbmQtPnNpc2ZiX3Jlc3VsdFswXSA9IFNJU0ZCX0NNRF9FUlJfT0s7CisJCX0gZWxzZSBpZihpdmlkZW8tPnNpc2ZibG9ja2VkKSB7CisJCQlzaXNmYl9jb21tYW5kLT5zaXNmYl9yZXN1bHRbMF0gPSBTSVNGQl9DTURfRVJSX0xPQ0tFRDsKKwkJfSBlbHNlIGlmKCghKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBDUlQyX0VOQUJMRSkpICYmCisJCQkJCShzaXNmYl9jb21tYW5kLT5zaXNmYl9hcmdbMF0gPT0gMCkpIHsKKwkJCXNpc2ZiX2NvbW1hbmQtPnNpc2ZiX3Jlc3VsdFswXSA9IFNJU0ZCX0NNRF9FUlJfTk9DUlQyOworCQl9IGVsc2UgeworCQkJc2lzZmJfY29tbWFuZC0+c2lzZmJfcmVzdWx0WzBdID0gU0lTRkJfQ01EX0VSUl9PSzsKKwkJCW15Y3J0MW9mZiA9IHNpc2ZiX2NvbW1hbmQtPnNpc2ZiX2FyZ1swXSA/IDAgOiAxOworCQkJaWYoICgoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0NSVDEpICYmIG15Y3J0MW9mZikgfHwKKwkJCSAgICAoKCEoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0NSVDEpKSAmJiAhbXljcnQxb2ZmKSApIHsKKwkJCQlpdmlkZW8tPnNpc2ZiX2NydDFvZmYgPSBteWNydDFvZmY7CisJCQkJaWYoc2lzZmJfcmVzZXRfbW9kZShpdmlkZW8pKSB7CisJCQkJCXNpc2ZiX2NvbW1hbmQtPnNpc2ZiX3Jlc3VsdFswXSA9IFNJU0ZCX0NNRF9FUlJfT1RIRVI7CiAJCQkJfQogCQkJfQotCi0JCX0gZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MgJiBUVl9QQUwpIHsKLQotCQkJYW5kU0lTSURYUkVHKFNJU1BBUlQyLCAweDNBLCAweDFGKTsKLQotCQkJaWYgKGl2aWRlby0+dmJmbGFncyAmIFRWX1NWSURFTykgewotCi0JCQkgICAgICAgIGFuZFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzMCwgMHhERik7Ci0KLQkJCX0gZWxzZSBpZiAoaXZpZGVvLT52YmZsYWdzICYgVFZfQVZJREVPKSB7Ci0KLQkJCSAgICAgICAgb3JTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzAsIDB4MjApOwotCi0JCQkJc3dpdGNoIChpdmlkZW8tPnZpZGVvX3dpZHRoKSB7Ci0JCQkJY2FzZSA2NDA6Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzNSwgMHhGMSk7Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzNiwgMHhGNyk7Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzNywgMHgxRik7Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzOCwgMHgzMik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNzIwOgotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzUsIDB4RjMpOwotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzYsIDB4MDApOwotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzcsIDB4MUQpOwotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzgsIDB4MjApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDQwMDoKLQkJCQljYXNlIDgwMDoKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM1LCAweEZDKTsKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM2LCAweEZCKTsKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM3LCAweDE0KTsKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM4LCAweDJBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQorCQkJc2lzZmJfY29tbWFuZC0+c2lzZmJfcmVzdWx0WzFdID0gaXZpZGVvLT5zaXNmYl9jcnQxb2ZmID8gMCA6IDE7CiAJCX0KLQotCQlpZigoaXZpZGVvLT5zaXNmYl9maWx0ZXIgPj0gMCkgJiYgKGl2aWRlby0+c2lzZmJfZmlsdGVyIDw9IDcpKSB7Ci0JCSAgIG91dFNJU0lEWFJFRyhTSVNQQVJUMiwweDM1LChzaXNfVFZfZmlsdGVyW2ZpbHRlcl90Yl0uZmlsdGVyW2l2aWRlby0+c2lzZmJfZmlsdGVyXVswXSkpOwotCQkgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgzNiwoc2lzX1RWX2ZpbHRlcltmaWx0ZXJfdGJdLmZpbHRlcltpdmlkZW8tPnNpc2ZiX2ZpbHRlcl1bMV0pKTsKLQkJICAgb3V0U0lTSURYUkVHKFNJU1BBUlQyLDB4MzcsKHNpc19UVl9maWx0ZXJbZmlsdGVyX3RiXS5maWx0ZXJbaXZpZGVvLT5zaXNmYl9maWx0ZXJdWzJdKSk7Ci0JCSAgIG91dFNJU0lEWFJFRyhTSVNQQVJUMiwweDM4LChzaXNfVFZfZmlsdGVyW2ZpbHRlcl90Yl0uZmlsdGVyW2l2aWRlby0+c2lzZmJfZmlsdGVyXVszXSkpOwotCQl9Ci0JICAKKwkJYnJlYWs7CisJLyogbW9yZSB0byBjb21lICovCisJZGVmYXVsdDoKKwkJc2lzZmJfY29tbWFuZC0+c2lzZmJfcmVzdWx0WzBdID0gU0lTRkJfQ01EX0VSUl9VTktOT1dOOworCQlwcmludGsoS0VSTl9FUlIgInNpc2ZiOiBVbmtub3duIGNvbW1hbmQgMHgleFxuIiwKKwkJCXNpc2ZiX2NvbW1hbmQtPnNpc2ZiX2NtZCk7CiAJfQogfQogCiAjaWZuZGVmIE1PRFVMRQotU0lTSU5JVFNUQVRJQyBpbnQgX19pbml0IHNpc2ZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCitTSVNJTklUU1RBVElDIGludCBfX2luaXQKK3Npc2ZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCiB7CiAJY2hhciAqdGhpc19vcHQ7Ci0JCisKIAlzaXNmYl9zZXRkZWZhdWx0cGFybXMoKTsKIAotICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IE9wdGlvbnMgJXNcbiIsIG9wdGlvbnMpOwotCi0JaWYoIW9wdGlvbnMgfHwgISgqb3B0aW9ucykpIHsKKwlpZighb3B0aW9ucyB8fCAhKCpvcHRpb25zKSkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJd2hpbGUoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CiAKQEAgLTM4ODAsOSArNDA5OCw5IEBACiAJCQkvKiBOZWVkIHRvIGNoZWNrIGNydDIgdHlwZSBmaXJzdCBmb3IgZnN0bi9kc3RuICovCiAJCQlzaXNmYl9zZWFyY2hfY3J0MnR5cGUodGhpc19vcHQgKyAxNCk7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJ0dm1vZGU6Iiw3KSkgewotCQkgICAgICAgIHNpc2ZiX3NlYXJjaF90dnN0ZCh0aGlzX29wdCArIDcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJ0dnN0YW5kYXJkOiIsMTEpKSB7CiAJCQlzaXNmYl9zZWFyY2hfdHZzdGQodGhpc19vcHQgKyA3KTsKKwkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgInR2c3RhbmRhcmQ6IiwxMSkpIHsKKwkJCXNpc2ZiX3NlYXJjaF90dnN0ZCh0aGlzX29wdCArIDExKTsKIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgIm1vZGU6IiwgNSkpIHsKIAkJCXNpc2ZiX3NlYXJjaF9tb2RlKHRoaXNfb3B0ICsgNSwgRkFMU0UpOwogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAidmVzYToiLCA1KSkgewpAQCAtMzg5Miw3NCArNDExMCw3MiBAQAogCQkJc2lzZmJfaW52ZXJzZSA9IDE7CiAJCQkvKiBmYl9pbnZlcnRfY21hcHMoKTsgKi8KIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgImZvbnQ6IiwgNSkpIHsKLQkJICAgICAgICBpZihzdHJsZW4odGhpc19vcHQgKyA1KSA8IDQwKSB7CisJCQlpZihzdHJsZW4odGhpc19vcHQgKyA1KSA8IDQwKSB7CiAJCQkgICBzdHJuY3B5KHNpc2ZiX2ZvbnRuYW1lLCB0aGlzX29wdCArIDUsIHNpemVvZihzaXNmYl9mb250bmFtZSkgLSAxKTsKIAkJCSAgIHNpc2ZiX2ZvbnRuYW1lW3NpemVvZihzaXNmYl9mb250bmFtZSkgLSAxXSA9ICdcMCc7CiAJCQl9CiAjZW5kaWYKIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgInJhdGU6IiwgNSkpIHsKIAkJCXNpc2ZiX3Bhcm1fcmF0ZSA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7Ci0JCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJmaWx0ZXI6IiwgNykpIHsKLQkJCXNpc2ZiX2ZpbHRlciA9IChpbnQpc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA3LCBOVUxMLCAwKTsKIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgImZvcmNlY3J0MToiLCAxMCkpIHsKIAkJCXNpc2ZiX2ZvcmNlY3J0MSA9IChpbnQpc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyAxMCwgTlVMTCwgMCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgIm1lbToiLDQpKSB7Ci0JCSAgICAgICAgc2lzZmJfcGFybV9tZW0gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDQsIE5VTEwsIDApOworCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAibWVtOiIsNCkpIHsKKwkJCXNpc2ZiX3Bhcm1fbWVtID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA0LCBOVUxMLCAwKTsKIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgInBkYzoiLCA0KSkgewotCQkgICAgICAgIHNpc2ZiX3BkYyA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNCwgTlVMTCwgMCk7CisJCQlzaXNmYl9wZGMgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDQsIE5VTEwsIDApOwogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAicGRjMToiLCA1KSkgewotCQkgICAgICAgIHNpc2ZiX3BkY2EgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDUsIE5VTEwsIDApOworCQkJc2lzZmJfcGRjYSA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJub2FjY2VsIiwgNykpIHsKIAkJCXNpc2ZiX2FjY2VsID0gMDsKIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgImFjY2VsIiwgNSkpIHsKIAkJCXNpc2ZiX2FjY2VsID0gLTE7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJub3lwYW4iLCA2KSkgewotCQkgICAgICAgIHNpc2ZiX3lwYW4gPSAwOworCQkJc2lzZmJfeXBhbiA9IDA7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJ5cGFuIiwgNCkpIHsKLQkJICAgICAgICBzaXNmYl95cGFuID0gLTE7CisJCQlzaXNmYl95cGFuID0gLTE7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJub21heCIsIDUpKSB7Ci0JCSAgICAgICAgc2lzZmJfbWF4ID0gMDsKKwkJCXNpc2ZiX21heCA9IDA7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJtYXgiLCAzKSkgewotCQkgICAgICAgIHNpc2ZiX21heCA9IC0xOworCQkJc2lzZmJfbWF4ID0gLTE7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJ1c2Vyb206IiwgNykpIHsKIAkJCXNpc2ZiX3VzZXJvbSA9IChpbnQpc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA3LCBOVUxMLCAwKTsKIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgInVzZW9lbToiLCA3KSkgewogCQkJc2lzZmJfdXNlb2VtID0gKGludClzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDcsIE5VTEwsIDApOwogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAibm9jcnQycmF0ZSIsIDEwKSkgewogCQkJc2lzZmJfbm9jcnQycmF0ZSA9IDE7Ci0JIAl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAic2NhbGVsY2Q6IiwgOSkpIHsKLQkJICAgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAyOwotCQkgICAgICAgIHRlbXAgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDksIE5VTEwsIDApOwotCQkgICAgICAgIGlmKCh0ZW1wID09IDApIHx8ICh0ZW1wID09IDEpKSB7CisJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJzY2FsZWxjZDoiLCA5KSkgeworCQkJdW5zaWduZWQgbG9uZyB0ZW1wID0gMjsKKwkJCXRlbXAgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDksIE5VTEwsIDApOworCQkJaWYoKHRlbXAgPT0gMCkgfHwgKHRlbXAgPT0gMSkpIHsKIAkJCSAgIHNpc2ZiX3NjYWxlbGNkID0gdGVtcCBeIDE7Ci0JCSAgICAgICAgfQorCQkJfQogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAidHZ4cG9zb2Zmc2V0OiIsIDEzKSkgewotCQkgICAgICAgIGludCB0ZW1wID0gMDsKLQkJICAgICAgICB0ZW1wID0gKGludClzaW1wbGVfc3RydG9sKHRoaXNfb3B0ICsgMTMsIE5VTEwsIDApOwotCQkgICAgICAgIGlmKCh0ZW1wID49IC0zMikgJiYgKHRlbXAgPD0gMzIpKSB7CisJCQlpbnQgdGVtcCA9IDA7CisJCQl0ZW1wID0gKGludClzaW1wbGVfc3RydG9sKHRoaXNfb3B0ICsgMTMsIE5VTEwsIDApOworCQkJaWYoKHRlbXAgPj0gLTMyKSAmJiAodGVtcCA8PSAzMikpIHsKIAkJCSAgIHNpc2ZiX3R2eHBvc29mZnNldCA9IHRlbXA7Ci0JCSAgICAgICAgfQorCQkJfQogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAidHZ5cG9zb2Zmc2V0OiIsIDEzKSkgewotCQkgICAgICAgIGludCB0ZW1wID0gMDsKLQkJICAgICAgICB0ZW1wID0gKGludClzaW1wbGVfc3RydG9sKHRoaXNfb3B0ICsgMTMsIE5VTEwsIDApOwotCQkgICAgICAgIGlmKCh0ZW1wID49IC0zMikgJiYgKHRlbXAgPD0gMzIpKSB7CisJCQlpbnQgdGVtcCA9IDA7CisJCQl0ZW1wID0gKGludClzaW1wbGVfc3RydG9sKHRoaXNfb3B0ICsgMTMsIE5VTEwsIDApOworCQkJaWYoKHRlbXAgPj0gLTMyKSAmJiAodGVtcCA8PSAzMikpIHsKIAkJCSAgIHNpc2ZiX3R2eXBvc29mZnNldCA9IHRlbXA7Ci0JCSAgICAgICAgfQorCQkJfQogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAic3BlY2lhbHRpbWluZzoiLCAxNCkpIHsKIAkJCXNpc2ZiX3NlYXJjaF9zcGVjaWFsdGltaW5nKHRoaXNfb3B0ICsgMTQpOwogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAibHZkc2hsOiIsIDcpKSB7Ci0JCSAgICAgICAgaW50IHRlbXAgPSA0OwotCQkgICAgICAgIHRlbXAgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDcsIE5VTEwsIDApOwotCQkgICAgICAgIGlmKCh0ZW1wID49IDApICYmICh0ZW1wIDw9IDMpKSB7CisJCQlpbnQgdGVtcCA9IDQ7CisJCQl0ZW1wID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA3LCBOVUxMLCAwKTsKKwkJCWlmKCh0ZW1wID49IDApICYmICh0ZW1wIDw9IDMpKSB7CiAJCQkgICBzaXNmYl9sdmRzaGwgPSB0ZW1wOwotCQkgICAgICAgIH0KKwkJCX0KIAkJfSBlbHNlIGlmKHRoaXNfb3B0WzBdID49ICcwJyAmJiB0aGlzX29wdFswXSA8PSAnOScpIHsKIAkJCXNpc2ZiX3NlYXJjaF9tb2RlKHRoaXNfb3B0LCBUUlVFKTsKICNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKLQkgICAgICAgIH0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJyZXNldGNhcmQiLCA5KSkgewotCQkgIAlzaXNmYl9yZXNldGNhcmQgPSAxOworCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAicmVzZXRjYXJkIiwgOSkpIHsKKwkJCXNpc2ZiX3Jlc2V0Y2FyZCA9IDE7CiAJICAgICAgICB9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAidmlkZW9yYW06IiwgOSkpIHsKLQkJICAJc2lzZmJfdmlkZW9yYW0gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDksIE5VTEwsIDApOworCQkJc2lzZmJfdmlkZW9yYW0gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDksIE5VTEwsIDApOwogI2VuZGlmCiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogSW52YWxpZCBvcHRpb24gJXNcbiIsIHRoaXNfb3B0KTsKQEAgLTM5NjcsNjMgKzQxODMsOTkgQEAKIAogCX0KIAotCi0KIAlyZXR1cm4gMDsKIH0KICNlbmRpZgogCi1zdGF0aWMgVUNIQVIgKiBfX2RldmluaXQgc2lzX2ZpbmRfcm9tKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQKK3Npc2ZiX2NoZWNrX3JvbShTSVNfSU9UWVBFMSAqcm9tX2Jhc2UsIHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQoreworCVNJU19JT1RZUEUxICpyb207CisJaW50IHJvbXB0cjsKKworCWlmKChyZWFkYihyb21fYmFzZSkgIT0gMHg1NSkgfHwgKHJlYWRiKHJvbV9iYXNlICsgMSkgIT0gMHhhYSkpCisJCXJldHVybiAwOworCisJcm9tcHRyID0gKHJlYWRiKHJvbV9iYXNlICsgMHgxOCkgfCAocmVhZGIocm9tX2Jhc2UgKyAweDE5KSA8PCA4KSk7CisJaWYocm9tcHRyID4gKDB4MTAwMDAgLSA4KSkKKwkJcmV0dXJuIDA7CisKKwlyb20gPSByb21fYmFzZSArIHJvbXB0cjsKKworCWlmKChyZWFkYihyb20pICAgICAhPSAnUCcpIHx8IChyZWFkYihyb20gKyAxKSAhPSAnQycpIHx8CisJICAgKHJlYWRiKHJvbSArIDIpICE9ICdJJykgfHwgKHJlYWRiKHJvbSArIDMpICE9ICdSJykpCisJCXJldHVybiAwOworCisJaWYoKHJlYWRiKHJvbSArIDQpIHwgKHJlYWRiKHJvbSArIDUpIDw8IDgpKSAhPSBpdmlkZW8tPmNoaXBfdmVuZG9yKQorCQlyZXR1cm4gMDsKKworCWlmKChyZWFkYihyb20gKyA2KSB8IChyZWFkYihyb20gKyA3KSA8PCA4KSkgIT0gaXZpZGVvLT5jaGlwX2lkKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqIF9fZGV2aW5pdAorc2lzZmJfZmluZF9yb20oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JVVNIT1JUIHBjaWlkOwotCWludCAgICByb21wdHI7Ci0JVUNIQVIgICpteXJvbWJhc2U7Ci0JdTMyICAgIHRlbXA7Ci0JU0lTX0lPVFlQRTEgKnJvbV9iYXNlLCAqcm9tOworCVNJU19JT1RZUEUxICpyb21fYmFzZTsKKwl1bnNpZ25lZCBjaGFyICpteXJvbWJhc2UgPSBOVUxMOworCXUzMiB0ZW1wOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTEpCisJc2l6ZV90IHJvbXNpemU7CiAKLQlpZighKG15cm9tYmFzZSA9IHZtYWxsb2MoNjU1MzYpKSkgcmV0dXJuIE5VTEw7CisJLyogRmlyc3QsIHRyeSB0aGUgb2ZmaWNpYWwgcGNpIFJPTSBmdW5jdGlvbnMgKGV4Y2VwdAorCSAqIG9uIGludGVncmF0ZWQgY2hpcHNldHMgd2hpY2ggaGF2ZSBubyBST00pLgorCSAqLworCisJaWYoIWl2aWRlby0+bmJyaWRnZSkgeworCisJCWlmKChyb21fYmFzZSA9IHBjaV9tYXBfcm9tKHBkZXYsICZyb21zaXplKSkpIHsKKworCQkJaWYoc2lzZmJfY2hlY2tfcm9tKHJvbV9iYXNlLCBpdmlkZW8pKSB7CisKKwkJCQlpZigobXlyb21iYXNlID0gdm1hbGxvYyg2NTUzNikpKSB7CisKKwkJCQkJLyogV29yayBhcm91bmQgYnVnIGluIHBjaS9yb20uYzogRm9sa3MgZm9yZ290IHRvIGNoZWNrCisJCQkJCSAqIHdoZXRoZXIgdGhlIHNpemUgcmV0cmlldmVkIGZyb20gdGhlIEJJT1MgaW1hZ2UgZXZlbnR1YWxseQorCQkJCQkgKiBpcyBsYXJnZXIgdGhhbiB0aGUgbWFwcGVkIHNpemUKKwkJCQkJICovCisJCQkJCWlmKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgUENJX1JPTV9SRVNPVVJDRSkgPCByb21zaXplKQorCQkJCQkJcm9tc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgUENJX1JPTV9SRVNPVVJDRSk7CisKKwkJCQkJbWVtY3B5X2Zyb21pbyhteXJvbWJhc2UsIHJvbV9iYXNlLAorCQkJCQkJCShyb21zaXplID4gNjU1MzYpID8gNjU1MzYgOiByb21zaXplKTsKKwkJCQl9CisJCQl9CisJCQlwY2lfdW5tYXBfcm9tKHBkZXYsIHJvbV9iYXNlKTsKKwkJfQorCX0KKworCWlmKG15cm9tYmFzZSkgcmV0dXJuIG15cm9tYmFzZTsKKyNlbmRpZgorCisJLyogT3RoZXJ3aXNlIGRvIGl0IHRoZSBjb252ZW50aW9uYWwgd2F5LiAqLwogCiAjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQogCi0gICAgICAgIGZvcih0ZW1wID0gMHgwMDBjMDAwMDsgdGVtcCA8IDB4MDAwZjAwMDA7IHRlbXAgKz0gMHgwMDAwMTAwMCkgeworCWZvcih0ZW1wID0gMHgwMDBjMDAwMDsgdGVtcCA8IDB4MDAwZjAwMDA7IHRlbXAgKz0gMHgwMDAwMTAwMCkgewogCi0gICAgICAgICAgICByb21fYmFzZSA9IGlvcmVtYXAodGVtcCwgMHgxMDAwMCk7Ci0JICAgIGlmKCFyb21fYmFzZSkgY29udGludWU7CisJCXJvbV9iYXNlID0gaW9yZW1hcCh0ZW1wLCA2NTUzNik7CisJCWlmKCFyb21fYmFzZSkKKwkJCWNvbnRpbnVlOwogCi0JICAgIGlmKChyZWFkYihyb21fYmFzZSkgIT0gMHg1NSkgfHwgKHJlYWRiKHJvbV9iYXNlICsgMSkgIT0gMHhhYSkpIHsKLQkgICAgICAgaW91bm1hcChyb21fYmFzZSk7Ci0gICAgICAgICAgICAgICBjb250aW51ZTsKLQkgICAgfQorCQlpZighc2lzZmJfY2hlY2tfcm9tKHJvbV9iYXNlLCBpdmlkZW8pKSB7CisJCQlpb3VubWFwKHJvbV9iYXNlKTsKKwkJCWNvbnRpbnVlOworCQl9CiAKLQkgICAgcm9tcHRyID0gKHVuc2lnbmVkIHNob3J0KShyZWFkYihyb21fYmFzZSArIDB4MTgpIHwgKHJlYWRiKHJvbV9iYXNlICsgMHgxOSkgPDwgOCkpOwotCSAgICBpZihyb21wdHIgPiAoMHgxMDAwMCAtIDgpKSB7Ci0JICAgICAgIGlvdW5tYXAocm9tX2Jhc2UpOwotCSAgICAgICBjb250aW51ZTsKLQkgICAgfQorCQlpZigobXlyb21iYXNlID0gdm1hbGxvYyg2NTUzNikpKQorCQkJbWVtY3B5X2Zyb21pbyhteXJvbWJhc2UsIHJvbV9iYXNlLCA2NTUzNik7CiAKLQkgICAgcm9tID0gcm9tX2Jhc2UgKyByb21wdHI7CisJCWlvdW5tYXAocm9tX2Jhc2UpOworCQlicmVhazsKIAotCSAgICBpZigocmVhZGIocm9tKSAgICAgIT0gJ1AnKSB8fCAocmVhZGIocm9tICsgMSkgIT0gJ0MnKSB8fAotCSAgICAgICAocmVhZGIocm9tICsgMikgIT0gJ0knKSB8fCAocmVhZGIocm9tICsgMykgIT0gJ1InKSkgewotCSAgICAgICBpb3VubWFwKHJvbV9iYXNlKTsKLQkgICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgICBwY2lpZCA9IHJlYWRiKHJvbSArIDQpIHwgKHJlYWRiKHJvbSArIDUpIDw8IDgpOwotCSAgICBpZihwY2lpZCAhPSAweDEwMzkpIHsKLQkgICAgICAgaW91bm1hcChyb21fYmFzZSk7Ci0JICAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgICAgcGNpaWQgPSByZWFkYihyb20gKyA2KSB8IChyZWFkYihyb20gKyA3KSA8PCA4KTsKLQkgICAgaWYocGNpaWQgPT0gaXZpZGVvLT5jaGlwX2lkKSB7Ci0JICAgICAgIG1lbWNweV9mcm9taW8obXlyb21iYXNlLCByb21fYmFzZSwgNjU1MzYpOwotCSAgICAgICBpb3VubWFwKHJvbV9iYXNlKTsKLQkgICAgICAgcmV0dXJuIG15cm9tYmFzZTsKLQkgICAgfQotCi0JICAgIGlvdW5tYXAocm9tX2Jhc2UpOwogICAgICAgICB9CiAKICNlbHNlCkBAIC00MDM0LDc1MiArNDI4NiwxNjAzIEBACiAKIAlyb21fYmFzZSA9IGlvcmVtYXAoaXZpZGVvLT52aWRlb19iYXNlLCA2NTUzNik7CiAJaWYocm9tX2Jhc2UpIHsKLQkgICBpZigocmVhZGIocm9tX2Jhc2UpID09IDB4NTUpICYmIChyZWFkYihyb21fYmFzZSArIDEpID09IDB4YWEpKSB7Ci0JICAgICAgcm9tcHRyID0gKHUxNikocmVhZGIocm9tX2Jhc2UgKyAweDE4KSB8IChyZWFkYihyb21fYmFzZSArIDB4MTkpIDw8IDgpKTsKLQkgICAgICBpZihyb21wdHIgPD0gKDB4MTAwMDAgLSA4KSkgewotCSAgICAgICAgIHJvbSA9IHJvbV9iYXNlICsgcm9tcHRyOwotCQkgaWYoKHJlYWRiKHJvbSkgICAgID09ICdQJykgJiYgKHJlYWRiKHJvbSArIDEpID09ICdDJykgJiYKLQkJICAgIChyZWFkYihyb20gKyAyKSA9PSAnSScpICYmIChyZWFkYihyb20gKyAzKSA9PSAnUicpKSB7Ci0JCSAgICBwY2lpZCA9IHJlYWRiKHJvbSArIDQpIHwgKHJlYWRiKHJvbSArIDUpIDw8IDgpOwotCQkgICAgaWYocGNpaWQgPT0gMHgxMDM5KSB7Ci0JCSAgICAgICBwY2lpZCA9IHJlYWRiKHJvbSArIDYpIHwgKHJlYWRiKHJvbSArIDcpIDw8IDgpOwotCQkgICAgICAgaWYocGNpaWQgPT0gaXZpZGVvLT5jaGlwX2lkKSB7Ci0JCQkgIG1lbWNweV9mcm9taW8obXlyb21iYXNlLCByb21fYmFzZSwgNjU1MzYpOwotCQkJICBpb3VubWFwKHJvbV9iYXNlKTsKLQkJCSAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfUk9NX0FERFJFU1MsIHRlbXApOwotCQkJICByZXR1cm4gbXlyb21iYXNlOwotCQkgICAgICAgfQotCQkgICAgfQotCQkgfQotCSAgICAgIH0KLQkgICB9Ci0JICAgaW91bm1hcChyb21fYmFzZSk7CisJCWlmKHNpc2ZiX2NoZWNrX3JvbShyb21fYmFzZSwgaXZpZGVvKSkgeworCQkJaWYoKG15cm9tYmFzZSA9IHZtYWxsb2MoNjU1MzYpKSkKKwkJCQltZW1jcHlfZnJvbWlvKG15cm9tYmFzZSwgcm9tX2Jhc2UsIDY1NTM2KTsKKwkJfQorCQlpb3VubWFwKHJvbV9iYXNlKTsKIAl9Ci0gICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJX1JPTV9BRERSRVNTLCB0ZW1wKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJX1JPTV9BRERSRVNTLCB0ZW1wKTsKIAogI2VuZGlmCiAKLSAgICAgICAJdmZyZWUobXlyb21iYXNlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisJcmV0dXJuIG15cm9tYmFzZTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0CitzaXNmYl9wb3N0X21hcF92cmFtKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCB1bnNpZ25lZCBpbnQgKm1hcHNpemUsCisJCQl1bnNpZ25lZCBpbnQgbWluKQoreworCWl2aWRlby0+dmlkZW9fdmJhc2UgPSBpb3JlbWFwKGl2aWRlby0+dmlkZW9fYmFzZSwgKCptYXBzaXplKSk7CisKKwlpZighaXZpZGVvLT52aWRlb192YmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJzaXNmYjogVW5hYmxlIHRvIG1hcCBtYXhpbXVtIHZpZGVvIFJBTSBmb3Igc2l6ZSBkZXRlY3Rpb25cbiIpOworCQkoKm1hcHNpemUpID4+PSAxOworCQl3aGlsZSgoIShpdmlkZW8tPnZpZGVvX3ZiYXNlID0gaW9yZW1hcChpdmlkZW8tPnZpZGVvX2Jhc2UsICgqbWFwc2l6ZSkpKSkpIHsKKwkJCSgqbWFwc2l6ZSkgPj49IDE7CisJCQlpZigoKm1hcHNpemUpIDwgKG1pbiA8PCAyMCkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYoaXZpZGVvLT52aWRlb192YmFzZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJInNpc2ZiOiBWaWRlbyBSQU0gc2l6ZSBkZXRlY3Rpb24gbGltaXRlZCB0byAlZE1CXG4iLAorCQkJCShpbnQpKCgqbWFwc2l6ZSkgPj4gMjApKTsKKwkJfQorCX0KIH0KIAogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCiBzdGF0aWMgaW50IF9fZGV2aW5pdAotc2lzZmJfY2hrYnVzd2lkdGgzMDAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIFNJU19JT1RZUEUxICpGQkFkZHJlc3MpCitzaXNmYl9wb3N0XzMwMF9idXN3aWR0aChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlTSVNfSU9UWVBFMSAqRkJBZGRyZXNzID0gaXZpZGVvLT52aWRlb192YmFzZTsKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wOworCXVuc2lnbmVkIGNoYXIgcmVnOwogCWludCBpLCBqOwotCVVTSE9SVCB0ZW1wOwotCVVDSEFSIHJlZzsKIAotCWFuZFNJU0lEWFJFRyhTSVNTUiwweDE1LDB4RkIpOwotCW9yU0lTSURYUkVHKFNJU1NSLDB4MTUsMHgwNCk7Ci0gICAJb3V0U0lTSURYUkVHKFNJU1NSLDB4MTMsMHgwMCk7Ci0gICAJb3V0U0lTSURYUkVHKFNJU1NSLDB4MTQsMHhCRik7CisJYW5kU0lTSURYUkVHKFNJU1NSLCAweDE1LCAweEZCKTsKKwlvclNJU0lEWFJFRyhTSVNTUiwgMHgxNSwgMHgwNCk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweDAwKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4QkYpOwogCi0JZm9yKGk9MDsgaTwyOyBpKyspIHsKLQkgICB0ZW1wID0gMHgxMjM0OwotCSAgIGZvcihqPTA7IGo8NDsgaisrKSB7Ci0JICAgICAgd3JpdGV3KHRlbXAsIEZCQWRkcmVzcyk7Ci0JICAgICAgaWYocmVhZHcoRkJBZGRyZXNzKSA9PSB0ZW1wKSBicmVhazsKLQkgICAgICBvclNJU0lEWFJFRyhTSVNTUiwweDNjLDB4MDEpOwotCSAgICAgIGluU0lTSURYUkVHKFNJU1NSLDB4MDUscmVnKTsKLQkgICAgICBpblNJU0lEWFJFRyhTSVNTUiwweDA1LHJlZyk7Ci0JICAgICAgYW5kU0lTSURYUkVHKFNJU1NSLDB4M2MsMHhmZSk7Ci0JICAgICAgaW5TSVNJRFhSRUcoU0lTU1IsMHgwNSxyZWcpOwotCSAgICAgIGluU0lTSURYUkVHKFNJU1NSLDB4MDUscmVnKTsKLQkgICAgICB0ZW1wKys7Ci0JICAgfQorCWZvcihpID0gMDsgaSA8IDI7IGkrKykgeworCQl0ZW1wID0gMHgxMjM0OworCQlmb3IoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCXdyaXRldyh0ZW1wLCBGQkFkZHJlc3MpOworCQkJaWYocmVhZHcoRkJBZGRyZXNzKSA9PSB0ZW1wKQorCQkJCWJyZWFrOworCQkJb3JTSVNJRFhSRUcoU0lTU1IsIDB4M2MsIDB4MDEpOworCQkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4MDUsIHJlZyk7CisJCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgcmVnKTsKKwkJCWFuZFNJU0lEWFJFRyhTSVNTUiwgMHgzYywgMHhmZSk7CisJCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgcmVnKTsKKwkJCWluU0lTSURYUkVHKFNJU1NSLCAweDA1LCByZWcpOworCQkJdGVtcCsrOworCQl9CiAJfQogCiAJd3JpdGVsKDB4MDEyMzQ1NjdMLCBGQkFkZHJlc3MpOwotCXdyaXRlbCgweDQ1Njc4OUFCTCwgKEZCQWRkcmVzcys0KSk7Ci0Jd3JpdGVsKDB4ODlBQkNERUZMLCAoRkJBZGRyZXNzKzgpKTsKLQl3cml0ZWwoMHhDREVGMDEyM0wsIChGQkFkZHJlc3MrMTIpKTsKLQlpblNJU0lEWFJFRyhTSVNTUiwweDNiLHJlZyk7CisJd3JpdGVsKDB4NDU2Nzg5QUJMLCAoRkJBZGRyZXNzICsgNCkpOworCXdyaXRlbCgweDg5QUJDREVGTCwgKEZCQWRkcmVzcyArIDgpKTsKKwl3cml0ZWwoMHhDREVGMDEyM0wsIChGQkFkZHJlc3MgKyAxMikpOworCisJaW5TSVNJRFhSRUcoU0lTU1IsIDB4M2IsIHJlZyk7CiAJaWYocmVnICYgMHgwMSkgewotCSAgIGlmKHJlYWRsKChGQkFkZHJlc3MrMTIpKSA9PSAweENERUYwMTIzTCkgcmV0dXJuKDQpOyAgLyogQ2hhbm5lbCBBIDEyOGJpdCAqLworCQlpZihyZWFkbCgoRkJBZGRyZXNzICsgMTIpKSA9PSAweENERUYwMTIzTCkKKwkJCXJldHVybiA0OwkvKiBDaGFubmVsIEEgMTI4Yml0ICovCiAJfQotCWlmKHJlYWRsKChGQkFkZHJlc3MrNCkpID09IDB4NDU2Nzg5QUJMKSAgICAgcmV0dXJuKDIpOyAgLyogQ2hhbm5lbCBCIDY0Yml0ICovCi0JcmV0dXJuKDEpOwkJCQkJCS8qIDMyYml0ICovCisKKwlpZihyZWFkbCgoRkJBZGRyZXNzICsgNCkpID09IDB4NDU2Nzg5QUJMKQorCQlyZXR1cm4gMjsJCS8qIENoYW5uZWwgQiA2NGJpdCAqLworCisJcmV0dXJuIDE7CQkJLyogMzJiaXQgKi8KK30KKworc3RhdGljIGludCBfX2RldmluaXQKK3Npc2ZiX3Bvc3RfMzAwX3J3dGVzdChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IGl0ZXJhdGlvbiwgaW50IGJ1c3dpZHRoLAorCQkJaW50IFBzZXVkb1JhbmtDYXBhY2l0eSwgaW50IFBzZXVkb0FkclBpbkNvdW50LAorCQkJdW5zaWduZWQgaW50IG1hcHNpemUpCit7CisJU0lTX0lPVFlQRTEgKkZCQWRkciA9IGl2aWRlby0+dmlkZW9fdmJhc2U7CisJdW5zaWduZWQgc2hvcnQgc3IxNDsKKwl1bnNpZ25lZCBpbnQgaywgUmFua0NhcGFjaXR5LCBQYWdlQ2FwYWNpdHksIEJhbmtOdW1IaWdoLCBCYW5rTnVtTWlkOworCXVuc2lnbmVkIGludCBQaHlzaWNhbEFkck90aGVyUGFnZSwgUGh5c2ljYWxBZHJIaWdoLCBQaHlzaWNhbEFkckhhbGZQYWdlOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBTaVNfRFJBTVR5cGVbMTddWzVdID0geworCQl7MHgwQywweDBBLDB4MDIsMHg0MCwweDM5fSwKKwkJezB4MEQsMHgwQSwweDAxLDB4NDAsMHg0OH0sCisJCXsweDBDLDB4MDksMHgwMiwweDIwLDB4MzV9LAorCQl7MHgwRCwweDA5LDB4MDEsMHgyMCwweDQ0fSwKKwkJezB4MEMsMHgwOCwweDAyLDB4MTAsMHgzMX0sCisJCXsweDBELDB4MDgsMHgwMSwweDEwLDB4NDB9LAorCQl7MHgwQywweDBBLDB4MDEsMHgyMCwweDM0fSwKKwkJezB4MEMsMHgwOSwweDAxLDB4MDgsMHgzMn0sCisJCXsweDBCLDB4MDgsMHgwMiwweDA4LDB4MjF9LAorCQl7MHgwQywweDA4LDB4MDEsMHgwOCwweDMwfSwKKwkJezB4MEEsMHgwOCwweDAyLDB4MDQsMHgxMX0sCisJCXsweDBCLDB4MEEsMHgwMSwweDEwLDB4Mjh9LAorCQl7MHgwOSwweDA4LDB4MDIsMHgwMiwweDAxfSwKKwkJezB4MEIsMHgwOSwweDAxLDB4MDgsMHgyNH0sCisJCXsweDBCLDB4MDgsMHgwMSwweDA0LDB4MjB9LAorCQl7MHgwQSwweDA4LDB4MDEsMHgwMiwweDEwfSwKKwkJezB4MDksMHgwOCwweDAxLDB4MDEsMHgwMH0KKwl9OworCisJIGZvcihrID0gMDsgayA8PSAxNjsgaysrKSB7CisKKwkJUmFua0NhcGFjaXR5ID0gYnVzd2lkdGggKiBTaVNfRFJBTVR5cGVba11bM107CisKKwkJaWYoUmFua0NhcGFjaXR5ICE9IFBzZXVkb1JhbmtDYXBhY2l0eSkKKwkJCWNvbnRpbnVlOworCisJCWlmKChTaVNfRFJBTVR5cGVba11bMl0gKyBTaVNfRFJBTVR5cGVba11bMF0pID4gUHNldWRvQWRyUGluQ291bnQpCisJCQljb250aW51ZTsKKworCQlCYW5rTnVtSGlnaCA9IFJhbmtDYXBhY2l0eSAqIDE2ICogaXRlcmF0aW9uIC0gMTsKKwkJaWYoaXRlcmF0aW9uID09IDMpIHsgICAgICAgICAgICAgLyogUmFuayBObyAqLworCQkJQmFua051bU1pZCAgPSBSYW5rQ2FwYWNpdHkgKiAxNiAtIDE7CisJCX0gZWxzZSB7CisJCQlCYW5rTnVtTWlkICA9IFJhbmtDYXBhY2l0eSAqIDE2ICogaXRlcmF0aW9uIC8gMiAtIDE7CisJCX0KKworCQlQYWdlQ2FwYWNpdHkgPSAoMSA8PCBTaVNfRFJBTVR5cGVba11bMV0pICogYnVzd2lkdGggKiA0OworCQlQaHlzaWNhbEFkckhpZ2ggPSBCYW5rTnVtSGlnaDsKKwkJUGh5c2ljYWxBZHJIYWxmUGFnZSA9IChQYWdlQ2FwYWNpdHkgLyAyICsgUGh5c2ljYWxBZHJIaWdoKSAlIFBhZ2VDYXBhY2l0eTsKKwkJUGh5c2ljYWxBZHJPdGhlclBhZ2UgPSBQYWdlQ2FwYWNpdHkgKiBTaVNfRFJBTVR5cGVba11bMl0gKyBQaHlzaWNhbEFkckhpZ2g7CisKKwkJYW5kU0lTSURYUkVHKFNJU1NSLCAweDE1LCAweEZCKTsgLyogVGVzdCAqLworCQlvclNJU0lEWFJFRyhTSVNTUiwgMHgxNSwgMHgwNCk7ICAvKiBUZXN0ICovCisJCXNyMTQgPSAoU2lTX0RSQU1UeXBlW2tdWzNdICogYnVzd2lkdGgpIC0gMTsKKwkJaWYoYnVzd2lkdGggPT0gNCkgICAgICBzcjE0IHw9IDB4ODA7CisJCWVsc2UgaWYoYnVzd2lkdGggPT0gMikgc3IxNCB8PSAweDQwOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIFNpU19EUkFNVHlwZVtrXVs0XSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgc3IxNCk7CisKKwkJQmFua051bUhpZ2ggPDw9IDE2OworCQlCYW5rTnVtTWlkIDw8PSAxNjsKKworCQlpZigoQmFua051bUhpZ2ggKyBQaHlzaWNhbEFkckhpZ2ggICAgICA+PSBtYXBzaXplKSB8fAorCQkgICAoQmFua051bU1pZCAgKyBQaHlzaWNhbEFkckhpZ2ggICAgICA+PSBtYXBzaXplKSB8fAorCQkgICAoQmFua051bUhpZ2ggKyBQaHlzaWNhbEFkckhhbGZQYWdlICA+PSBtYXBzaXplKSB8fAorCQkgICAoQmFua051bUhpZ2ggKyBQaHlzaWNhbEFkck90aGVyUGFnZSA+PSBtYXBzaXplKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFdyaXRlIGRhdGEgKi8KKwkJd3JpdGV3KCgodW5zaWduZWQgc2hvcnQpUGh5c2ljYWxBZHJIaWdoKSwKKwkJCQkoRkJBZGRyICsgQmFua051bUhpZ2ggKyBQaHlzaWNhbEFkckhpZ2gpKTsKKwkJd3JpdGV3KCgodW5zaWduZWQgc2hvcnQpQmFua051bU1pZCksCisJCQkJKEZCQWRkciArIEJhbmtOdW1NaWQgICsgUGh5c2ljYWxBZHJIaWdoKSk7CisJCXdyaXRldygoKHVuc2lnbmVkIHNob3J0KVBoeXNpY2FsQWRySGFsZlBhZ2UpLAorCQkJCShGQkFkZHIgKyBCYW5rTnVtSGlnaCArIFBoeXNpY2FsQWRySGFsZlBhZ2UpKTsKKwkJd3JpdGV3KCgodW5zaWduZWQgc2hvcnQpUGh5c2ljYWxBZHJPdGhlclBhZ2UpLAorCQkJCShGQkFkZHIgKyBCYW5rTnVtSGlnaCArIFBoeXNpY2FsQWRyT3RoZXJQYWdlKSk7CisKKwkJLyogUmVhZCBkYXRhICovCisJCWlmKHJlYWR3KEZCQWRkciArIEJhbmtOdW1IaWdoICsgUGh5c2ljYWxBZHJIaWdoKSA9PSBQaHlzaWNhbEFkckhpZ2gpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZpbml0Ci1zaXNmYl9zZXRyYW1zaXplMzAwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc2lzZmJfcG9zdF8zMDBfcmFtc2l6ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IG1hcHNpemUpCiB7Ci0Jc3RydWN0ICBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotICAJU0lTX0lPVFlQRTEgKkZCQWRkciA9IGl2aWRlby0+dmlkZW9fdmJhc2U7Ci0JU0lTX0lPVFlQRTEgKkFkZHI7Ci0JVVNIT1JUIAlzcjEzLCBzcjE0PTAsIGJ1c3dpZHRoLCBEb25lLCBkYXRhLCBUb3RhbENhcGFjaXR5LCBQaHlzaWNhbEFkck90aGVyUGFnZT0wOwotCWludCAgICAgUHNldWRvUmFua0NhcGFjaXR5LCBQc2V1ZG9Ub3RhbENhcGFjaXR5LCBQc2V1ZG9BZHJQaW5Db3VudDsKLSAgIAlpbnQgICAgIFJhbmtDYXBhY2l0eSwgQWRyUGluQ291bnQsIEJhbmtOdW1IaWdoLCBCYW5rTnVtTWlkLCBNQjJCYW5rOwotICAgCWludCAgICAgUGFnZUNhcGFjaXR5LCBQaHlzaWNhbEFkckhpZ2gsIFBoeXNpY2FsQWRySGFsZlBhZ2UsIGksIGosIGs7Ci0JY29uc3QgCVVTSE9SVCBTaVNfRFJBTVR5cGVbMTddWzVdID0gewotCQkJezB4MEMsMHgwQSwweDAyLDB4NDAsMHgzOX0sCi0JCQl7MHgwRCwweDBBLDB4MDEsMHg0MCwweDQ4fSwKLQkJCXsweDBDLDB4MDksMHgwMiwweDIwLDB4MzV9LAotCQkJezB4MEQsMHgwOSwweDAxLDB4MjAsMHg0NH0sCi0JCQl7MHgwQywweDA4LDB4MDIsMHgxMCwweDMxfSwKLQkJCXsweDBELDB4MDgsMHgwMSwweDEwLDB4NDB9LAotCQkJezB4MEMsMHgwQSwweDAxLDB4MjAsMHgzNH0sCi0JCQl7MHgwQywweDA5LDB4MDEsMHgwOCwweDMyfSwKLQkJCXsweDBCLDB4MDgsMHgwMiwweDA4LDB4MjF9LAotCQkJezB4MEMsMHgwOCwweDAxLDB4MDgsMHgzMH0sCi0JCQl7MHgwQSwweDA4LDB4MDIsMHgwNCwweDExfSwKLQkJCXsweDBCLDB4MEEsMHgwMSwweDEwLDB4Mjh9LAotCQkJezB4MDksMHgwOCwweDAyLDB4MDIsMHgwMX0sCi0JCQl7MHgwQiwweDA5LDB4MDEsMHgwOCwweDI0fSwKLQkJCXsweDBCLDB4MDgsMHgwMSwweDA0LDB4MjB9LAotCQkJezB4MEEsMHgwOCwweDAxLDB4MDIsMHgxMH0sCi0JCQl7MHgwOSwweDA4LDB4MDEsMHgwMSwweDAwfQotCQl9OworCXN0cnVjdAlzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWludAlpLCBqLCBidXN3aWR0aDsKKwlpbnQJUHNldWRvUmFua0NhcGFjaXR5LCBQc2V1ZG9BZHJQaW5Db3VudDsKIAotICAgICAgICBidXN3aWR0aCA9IHNpc2ZiX2Noa2J1c3dpZHRoMzAwKHBkZXYsIEZCQWRkcik7CisJYnVzd2lkdGggPSBzaXNmYl9wb3N0XzMwMF9idXN3aWR0aChpdmlkZW8pOwogCi0gICAJTUIyQmFuayA9IDE2OwotICAgCURvbmUgPSAwOwotICAgCWZvcihpID0gNjsgaSA+PSAwOyBpLS0pIHsKLSAgICAgIAkgICBpZihEb25lKSBicmVhazsKLSAgICAgIAkgICBQc2V1ZG9SYW5rQ2FwYWNpdHkgPSAxIDw8IGk7Ci0gICAgICAJICAgZm9yKGogPSA0OyBqID49IDE7IGotLSkgewotICAgICAgICAgICAgICBpZihEb25lKSBicmVhazsKLSAgICAgICAgICAgICAgUHNldWRvVG90YWxDYXBhY2l0eSA9IFBzZXVkb1JhbmtDYXBhY2l0eSAqIGo7Ci0gICAgICAgICAgICAgIFBzZXVkb0FkclBpbkNvdW50ID0gMTUgLSBqOwotICAgICAgICAgICAgICBpZihQc2V1ZG9Ub3RhbENhcGFjaXR5IDw9IDY0KSB7Ci0gICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8PSAxNjsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKERvbmUpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBSYW5rQ2FwYWNpdHkgPSBidXN3aWR0aCAqIFNpU19EUkFNVHlwZVtrXVszXTsKLSAgICAgICAgICAgICAgICAgICAgQWRyUGluQ291bnQgPSBTaVNfRFJBTVR5cGVba11bMl0gKyBTaVNfRFJBTVR5cGVba11bMF07Ci0gICAgICAgICAgICAgICAgICAgIGlmKFJhbmtDYXBhY2l0eSA9PSBQc2V1ZG9SYW5rQ2FwYWNpdHkpCi0gICAgICAgICAgICAgICAgICAgICAgIGlmKEFkclBpbkNvdW50IDw9IFBzZXVkb0FkclBpbkNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGogPT0gMykgeyAgICAgICAgICAgICAvKiBSYW5rIE5vICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmtOdW1IaWdoID0gUmFua0NhcGFjaXR5ICogTUIyQmFuayAqIDMgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5rTnVtTWlkICA9IFJhbmtDYXBhY2l0eSAqIE1CMkJhbmsgKiAxIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFua051bUhpZ2ggPSBSYW5rQ2FwYWNpdHkgKiBNQjJCYW5rICogaiAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmtOdW1NaWQgID0gUmFua0NhcGFjaXR5ICogTUIyQmFuayAqIGogLyAyIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlQ2FwYWNpdHkgPSAoMSA8PCBTaVNfRFJBTVR5cGVba11bMV0pICogYnVzd2lkdGggKiA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBQaHlzaWNhbEFkckhpZ2ggPSBCYW5rTnVtSGlnaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5c2ljYWxBZHJIYWxmUGFnZSA9IChQYWdlQ2FwYWNpdHkgLyAyICsgUGh5c2ljYWxBZHJIaWdoKSAlIFBhZ2VDYXBhY2l0eTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5c2ljYWxBZHJPdGhlclBhZ2UgPSBQYWdlQ2FwYWNpdHkgKiBTaVNfRFJBTVR5cGVba11bMl0gKyBQaHlzaWNhbEFkckhpZ2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kU0lTSURYUkVHKFNJU1NSLDB4MTUsMHhGQik7IC8qIFRlc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JTSVNJRFhSRUcoU0lTU1IsMHgxNSwweDA0KTsgIC8qIFRlc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxDYXBhY2l0eSA9IFNpU19EUkFNVHlwZVtrXVszXSAqIGJ1c3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzcjEzID0gU2lTX0RSQU1UeXBlW2tdWzRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZihidXN3aWR0aCA9PSA0KSBzcjE0ID0gKFRvdGFsQ2FwYWNpdHkgLSAxKSB8IDB4ODA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJ1c3dpZHRoID09IDIpIHNyMTQgPSAoVG90YWxDYXBhY2l0eSAtIDEpIHwgMHg0MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYnVzd2lkdGggPT0gMSkgc3IxNCA9IChUb3RhbENhcGFjaXR5IC0gMSkgfCAweDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgxMyxzcjEzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U0lTSURYUkVHKFNJU1NSLDB4MTQsc3IxNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHIgPSBGQkFkZHIgKyBCYW5rTnVtSGlnaCAqIDY0ICogMTAyNCArIFBoeXNpY2FsQWRySGlnaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKigoVVNIT1JUICopKEFkZHIpKSA9IChVU0hPUlQpUGh5c2ljYWxBZHJIaWdoOyAqLwotCQkJICB3cml0ZXcoKChVU0hPUlQpUGh5c2ljYWxBZHJIaWdoKSwgQWRkcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHIgPSBGQkFkZHIgKyBCYW5rTnVtTWlkICogNjQgKiAxMDI0ICsgUGh5c2ljYWxBZHJIaWdoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAqKChVU0hPUlQgKikoQWRkcikpID0gKFVTSE9SVClCYW5rTnVtTWlkOyAqLwotCQkJICB3cml0ZXcoKChVU0hPUlQpQmFua051bU1pZCksIEFkZHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyID0gRkJBZGRyICsgQmFua051bUhpZ2ggKiA2NCAqIDEwMjQgKyBQaHlzaWNhbEFkckhhbGZQYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAqKChVU0hPUlQgKikoQWRkcikpID0gKFVTSE9SVClQaHlzaWNhbEFkckhhbGZQYWdlOyAqLwotCQkJICB3cml0ZXcoKChVU0hPUlQpUGh5c2ljYWxBZHJIYWxmUGFnZSksIEFkZHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyID0gRkJBZGRyICsgQmFua051bUhpZ2ggKiA2NCAqIDEwMjQgKyBQaHlzaWNhbEFkck90aGVyUGFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKigoVVNIT1JUICopKEFkZHIpKSA9IFBoeXNpY2FsQWRyT3RoZXJQYWdlOyAqLwotCQkJICB3cml0ZXcoKChVU0hPUlQpUGh5c2ljYWxBZHJPdGhlclBhZ2UpLCBBZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHIgPSBGQkFkZHIgKyBCYW5rTnVtSGlnaCAqIDY0ICogMTAyNCArIFBoeXNpY2FsQWRySGlnaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWR3KEFkZHIpOyAvKiAqKChVU0hPUlQgKikoQWRkcikpOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhID09IFBoeXNpY2FsQWRySGlnaCkgRG9uZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0gIC8qIGlmICovCi0gICAgICAgICAgICAgICAgIH0gIC8qIGZvciBrICovCi0gICAgICAgICAgICAgIH0gIC8qIGlmICovCi0gICAgICAJICAgfSAgLyogZm9yIGogKi8KLSAgIAl9ICAvKiBmb3IgaSAqLworCWZvcihpID0gNjsgaSA+PSAwOyBpLS0pIHsKKwkJUHNldWRvUmFua0NhcGFjaXR5ID0gMSA8PCBpOworCQlmb3IoaiA9IDQ7IGogPj0gMTsgai0tKSB7CisJCQlQc2V1ZG9BZHJQaW5Db3VudCA9IDE1IC0gajsKKwkJCWlmKChQc2V1ZG9SYW5rQ2FwYWNpdHkgKiBqKSA8PSA2NCkgeworCQkJCWlmKHNpc2ZiX3Bvc3RfMzAwX3J3dGVzdChpdmlkZW8sCisJCQkJCQlqLAorCQkJCQkJYnVzd2lkdGgsCisJCQkJCQlQc2V1ZG9SYW5rQ2FwYWNpdHksCisJCQkJCQlQc2V1ZG9BZHJQaW5Db3VudCwKKwkJCQkJCW1hcHNpemUpKQorCQkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBzaXNmYl9wb3N0X3NpczMwMChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc2lzZmJfcG9zdF9zaXMzMDAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgY2hhciAqYmlvcyA9IGl2aWRlby0+U2lTX1ByLlZpcnR1YWxSb21CYXNlOwogCXU4ICByZWcsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2ODsKIAl1MTYgaW5kZXgsIHJpbmRleCwgbWVtdHlwZSA9IDA7CisJdW5zaWduZWQgaW50IG1hcHNpemU7CiAKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgwNSwweDg2KTsKKwlpZighaXZpZGVvLT5TaVNfUHIuVXNlUk9NKQorCQliaW9zID0gTlVMTDsKIAotCWlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgewotCSAgIGlmKGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHg1Ml0gJiAweDgwKSB7Ci0JICAgICAgbWVtdHlwZSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHg1Ml07Ci0gCSAgIH0gZWxzZSB7Ci0JICAgICAgaW5TSVNJRFhSRUcoU0lTU1IsMHgzYSxtZW10eXBlKTsKLQkgICB9Ci0JICAgbWVtdHlwZSAmPSAweDA3OworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgMHg4Nik7CisKKwlpZihiaW9zKSB7CisJCWlmKGJpb3NbMHg1Ml0gJiAweDgwKSB7CisJCQltZW10eXBlID0gYmlvc1sweDUyXTsKKwkJfSBlbHNlIHsKKwkJCWluU0lTSURYUkVHKFNJU1NSLCAweDNhLCBtZW10eXBlKTsKKwkJfQorCQltZW10eXBlICY9IDB4MDc7CiAJfQogCisJdjMgPSAweDgwOyB2NiA9IDB4ODA7CiAJaWYoaXZpZGVvLT5yZXZpc2lvbl9pZCA8PSAweDEzKSB7Ci0JICAgdjEgPSAweDQ0OyB2MiA9IDB4NDI7IHYzID0gMHg4MDsKLQkgICB2NCA9IDB4NDQ7IHY1ID0gMHg0MjsgdjYgPSAweDgwOworCQl2MSA9IDB4NDQ7IHYyID0gMHg0MjsKKwkJdjQgPSAweDQ0OyB2NSA9IDB4NDI7CiAJfSBlbHNlIHsKLQkgICB2MSA9IDB4Njg7IHYyID0gMHg0MzsgdjMgPSAweDgwOyAgLyogQXNzdW1lIDEyNU1oeiBNQ0xLICovCi0JICAgdjQgPSAweDY4OyB2NSA9IDB4NDM7IHY2ID0gMHg4MDsgIC8qIEFzc3VtZSAxMjVNaHogRUNMSyAqLwotCSAgIGlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgewotCSAgICAgIGluZGV4ID0gbWVtdHlwZSAqIDU7Ci0JICAgICAgcmluZGV4ID0gaW5kZXggKyAweDU0OwotCSAgICAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtyaW5kZXgrK107Ci0JICAgICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW3JpbmRleCsrXTsKLQkgICAgICB2MyA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbcmluZGV4KytdOwotCSAgICAgIHJpbmRleCA9IGluZGV4ICsgMHg3YzsKLQkgICAgICB2NCA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbcmluZGV4KytdOwotCSAgICAgIHY1ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtyaW5kZXgrK107Ci0JICAgICAgdjYgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW3JpbmRleCsrXTsKLQkgICB9CisJCXYxID0gMHg2ODsgdjIgPSAweDQzOyAvKiBBc3N1bWUgMTI1TWh6IE1DTEsgKi8KKwkJdjQgPSAweDY4OyB2NSA9IDB4NDM7IC8qIEFzc3VtZSAxMjVNaHogRUNMSyAqLworCQlpZihiaW9zKSB7CisJCQlpbmRleCA9IG1lbXR5cGUgKiA1OworCQkJcmluZGV4ID0gaW5kZXggKyAweDU0OworCQkJdjEgPSBiaW9zW3JpbmRleCsrXTsKKwkJCXYyID0gYmlvc1tyaW5kZXgrK107CisJCQl2MyA9IGJpb3NbcmluZGV4KytdOworCQkJcmluZGV4ID0gaW5kZXggKyAweDdjOworCQkJdjQgPSBiaW9zW3JpbmRleCsrXTsKKwkJCXY1ID0gYmlvc1tyaW5kZXgrK107CisJCQl2NiA9IGJpb3NbcmluZGV4KytdOworCQl9CiAJfQotCW91dFNJU0lEWFJFRyhTSVNTUiwweDI4LHYxKTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyOSx2Mik7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MmEsdjMpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJlLHY0KTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyZix2NSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MzAsdjYpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyOCwgdjEpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyOSwgdjIpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyYSwgdjMpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyZSwgdjQpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyZiwgdjUpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgzMCwgdjYpOworCiAJdjEgPSAweDEwOwotCWlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4YTRdOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDA3LHYxKTsgICAgICAgLyogREFDIHNwZWVkICovCi0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MTEsMHgwZik7ICAgICAvKiBEREMsIHBvd2VyIHNhdmUgKi8KKwlpZihiaW9zKQorCQl2MSA9IGJpb3NbMHhhNF07CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDA3LCB2MSk7ICAgICAgIC8qIERBQyBzcGVlZCAqLworCisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDExLCAweDBmKTsgICAgIC8qIEREQywgcG93ZXIgc2F2ZSAqLworCiAJdjEgPSAweDAxOyB2MiA9IDB4NDM7IHYzID0gMHgxZTsgdjQgPSAweDJhOwogCXY1ID0gMHgwNjsgdjYgPSAweDAwOyB2NyA9IDB4MDA7IHY4ID0gMHgwMDsKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICBtZW10eXBlICs9IDB4YTU7Ci0JICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGVdOwotCSAgIHYyID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVttZW10eXBlICsgOF07Ci0JICAgdjMgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGUgKyAxNl07Ci0JICAgdjQgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGUgKyAyNF07Ci0JICAgdjUgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGUgKyAzMl07Ci0JICAgdjYgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGUgKyA0MF07Ci0JICAgdjcgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGUgKyA0OF07Ci0JICAgdjggPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGUgKyA1Nl07CisJaWYoYmlvcykgeworCQltZW10eXBlICs9IDB4YTU7CisJCXYxID0gYmlvc1ttZW10eXBlXTsKKwkJdjIgPSBiaW9zW21lbXR5cGUgKyA4XTsKKwkJdjMgPSBiaW9zW21lbXR5cGUgKyAxNl07CisJCXY0ID0gYmlvc1ttZW10eXBlICsgMjRdOworCQl2NSA9IGJpb3NbbWVtdHlwZSArIDMyXTsKKwkJdjYgPSBiaW9zW21lbXR5cGUgKyA0MF07CisJCXY3ID0gYmlvc1ttZW10eXBlICsgNDhdOworCQl2OCA9IGJpb3NbbWVtdHlwZSArIDU2XTsKIAl9Ci0JaWYoaXZpZGVvLT5yZXZpc2lvbl9pZCA+PSAweDgwKSB2MyAmPSAweGZkOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDE1LHYxKTsgICAgICAgLyogUmFtIHR5cGUgKGFzc3VtaW5nIDAsIEJJT1MgMHhhNSBzdGVwIDgpICovCi0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MTYsdjIpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDE3LHYzKTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxOCx2NCk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MTksdjUpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDFhLHY2KTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxYix2Nyk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MWMsdjgpOwkgICAvKiAtLS0tICovCi0JYW5kU0lTSURYUkVHKFNJU1NSLDB4MTUsMHhmYik7Ci0Jb3JTSVNJRFhSRUcoU0lTU1IsMHgxNSwweDA0KTsKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4NTNdICYgMHgwMikgewotCSAgICAgIG9yU0lTSURYUkVHKFNJU1NSLDB4MTksMHgyMCk7Ci0JICAgfQorCWlmKGl2aWRlby0+cmV2aXNpb25faWQgPj0gMHg4MCkKKwkJdjMgJj0gMHhmZDsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTUsIHYxKTsgICAgICAgLyogUmFtIHR5cGUgKGFzc3VtaW5nIDAsIEJJT1MgMHhhNSBzdGVwIDgpICovCisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCB2Mik7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE3LCB2Myk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCB2NCk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCB2NSk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFhLCB2Nik7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFiLCB2Nyk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFjLCB2OCk7CSAgIC8qIC0tLS0gKi8KKwlhbmRTSVNJRFhSRUcoU0lTU1IsIDB4MTUgLDB4ZmIpOworCW9yU0lTSURYUkVHKFNJU1NSLCAweDE1LCAweDA0KTsKKwlpZihiaW9zKSB7CisJCWlmKGJpb3NbMHg1M10gJiAweDAyKSB7CisJCQlvclNJU0lEWFJFRyhTSVNTUiwgMHgxOSwgMHgyMCk7CisJCX0KIAl9CiAJdjEgPSAweDA0OwkJCSAgIC8qIERBQyBwZWRlc3RhbCAoQklPUyAweGU1KSAqLwotCWlmKGl2aWRlby0+cmV2aXNpb25faWQgPj0gMHg4MCkgdjEgfD0gMHgwMTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxZix2MSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjAsMHhhMCk7ICAgICAvKiBsaW5lYXIgJiByZWxvY2F0ZWQgaW8gKi8KKwlpZihpdmlkZW8tPnJldmlzaW9uX2lkID49IDB4ODApCisJCXYxIHw9IDB4MDE7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFmLCB2MSk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDIwLCAweGE0KTsgICAgIC8qIGxpbmVhciAmIHJlbG9jYXRlZCBpbyAmIGRpc2FibGUgYTAwMDAgKi8KIAl2MSA9IDB4ZjY7IHYyID0gMHgwZDsgdjMgPSAweDAwOwotCWlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgewotCSAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweGU4XTsKLQkgICB2MiA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhlOV07Ci0JICAgdjMgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4ZWFdOworCWlmKGJpb3MpIHsKKwkJdjEgPSBiaW9zWzB4ZThdOworCQl2MiA9IGJpb3NbMHhlOV07CisJCXYzID0gYmlvc1sweGVhXTsKIAl9Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjMsdjEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDI0LHYyKTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyNSx2Myk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjEsMHg4NCk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjIsMHgwMCk7Ci0Jb3V0U0lTSURYUkVHKFNJU0NSLDB4MzcsMHgwMCk7Ci0Jb3JTSVNJRFhSRUcoU0lTUEFSVDEsMHgyNCwweDAxKTsgICAvKiB1bmxvY2sgY3J0MiAqLwotCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwweDAwLDB4MDApOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyMywgdjEpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyNCwgdjIpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyNSwgdjMpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyMSwgMHg4NCk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDIyLCAweDAwKTsKKwlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4MzcsIDB4MDApOworCW9yU0lTSURYUkVHKFNJU1BBUlQxLCAweDI0LCAweDAxKTsgICAvKiB1bmxvY2sgY3J0MiAqLworCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgwMCwgMHgwMCk7CiAJdjEgPSAweDQwOyB2MiA9IDB4MTE7Ci0JaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4ZWNdOwotCSAgIHYyID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweGViXTsKKwlpZihiaW9zKSB7CisJCXYxID0gYmlvc1sweGVjXTsKKwkJdjIgPSBiaW9zWzB4ZWJdOwogCX0KLQlvdXRTSVNJRFhSRUcoU0lTUEFSVDEsMHgwMix2MSk7Ci0JaWYoaXZpZGVvLT5yZXZpc2lvbl9pZCA+PSAweDgwKSB2MiAmPSB+MHgwMTsKLQlpblNJU0lEWFJFRyhTSVNQQVJUNCwweDAwLHJlZyk7CisJb3V0U0lTSURYUkVHKFNJU1BBUlQxLCAweDAyLCB2MSk7CisKKwlpZihpdmlkZW8tPnJldmlzaW9uX2lkID49IDB4ODApCisJCXYyICY9IH4weDAxOworCisJaW5TSVNJRFhSRUcoU0lTUEFSVDQsIDB4MDAsIHJlZyk7CiAJaWYoKHJlZyA9PSAxKSB8fCAocmVnID09IDIpKSB7Ci0JICAgb3V0U0lTSURYUkVHKFNJU0NSLDB4MzcsMHgwMik7Ci0JICAgb3V0U0lTSURYUkVHKFNJU1BBUlQyLDB4MDAsMHgxYyk7Ci0JICAgdjQgPSAweDAwOyB2NSA9IDB4MDA7IHY2ID0gMHgxMDsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICB2NCA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhmNV07Ci0JICAgICAgdjUgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4ZjZdOwotCSAgICAgIHY2ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweGY3XTsKLQkgICB9Ci0JICAgb3V0U0lTSURYUkVHKFNJU1BBUlQ0LDB4MGQsdjQpOwotCSAgIG91dFNJU0lEWFJFRyhTSVNQQVJUNCwweDBlLHY1KTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDQsMHgxMCx2Nik7Ci0JICAgb3V0U0lTSURYUkVHKFNJU1BBUlQ0LDB4MGYsMHgzZik7Ci0JICAgaW5TSVNJRFhSRUcoU0lTUEFSVDQsMHgwMSxyZWcpOwotCSAgIGlmKHJlZyA+PSAweGIwKSB7Ci0JICAgICAgaW5TSVNJRFhSRUcoU0lTUEFSVDQsMHgyMyxyZWcpOwotCSAgICAgIHJlZyAmPSAweDIwOwotCSAgICAgIHJlZyA8PD0gMTsKLQkgICAgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDQsMHgyMyxyZWcpOwotCSAgIH0KKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDM3LCAweDAyKTsKKwkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDAwLCAweDFjKTsKKwkJdjQgPSAweDAwOyB2NSA9IDB4MDA7IHY2ID0gMHgxMDsKKwkJaWYoaXZpZGVvLT5TaVNfUHIuVXNlUk9NKSB7CisJCQl2NCA9IGJpb3NbMHhmNV07CisJCQl2NSA9IGJpb3NbMHhmNl07CisJCQl2NiA9IGJpb3NbMHhmN107CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU1BBUlQ0LCAweDBkLCB2NCk7CisJCW91dFNJU0lEWFJFRyhTSVNQQVJUNCwgMHgwZSwgdjUpOworCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDQsIDB4MTAsIHY2KTsKKwkJb3V0U0lTSURYUkVHKFNJU1BBUlQ0LCAweDBmLCAweDNmKTsKKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDQsIDB4MDEsIHJlZyk7CisJCWlmKHJlZyA+PSAweGIwKSB7CisJCQlpblNJU0lEWFJFRyhTSVNQQVJUNCwgMHgyMywgcmVnKTsKKwkJCXJlZyAmPSAweDIwOworCQkJcmVnIDw8PSAxOworCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQ0LCAweDIzLCByZWcpOworCQl9CiAJfSBlbHNlIHsKLQkgICB2MiAmPSB+MHgxMDsKKwkJdjIgJj0gfjB4MTA7CiAJfQotCW91dFNJU0lEWFJFRyhTSVNTUiwweDMyLHYyKTsKLQlhbmRTSVNJRFhSRUcoU0lTUEFSVDEsMHgyNCwweGZlKTsgIC8qIExvY2sgQ1JUMiAqLwotCWluU0lTSURYUkVHKFNJU1NSLDB4MTYscmVnKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MzIsIHYyKTsKKworCWFuZFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgyNCwgMHhmZSk7ICAvKiBMb2NrIENSVDIgKi8KKworCWluU0lTSURYUkVHKFNJU1NSLCAweDE2LCByZWcpOwogCXJlZyAmPSAweGMzOwotCW91dFNJU0lEWFJFRyhTSVNDUiwweDM1LHJlZyk7Ci0Jb3V0U0lTSURYUkVHKFNJU0NSLDB4ODMsMHgwMCk7CisJb3V0U0lTSURYUkVHKFNJU0NSLCAweDM1LCByZWcpOworCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4MywgMHgwMCk7CiAjaWYgIWRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCiAJaWYoc2lzZmJfdmlkZW9yYW0pIHsKLQkgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgxMywweDI4KTsgIC8qID8gKi8KLQkgICByZWcgPSAoKHNpc2ZiX3ZpZGVvcmFtID4+IDEwKSAtIDEpIHwgMHg0MDsKLQkgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgxNCxyZWcpOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4MjgpOyAgLyogPyAqLworCQlyZWcgPSAoKHNpc2ZiX3ZpZGVvcmFtID4+IDEwKSAtIDEpIHwgMHg0MDsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCByZWcpOwogCX0gZWxzZSB7CiAjZW5kaWYKLQkgICAvKiBOZWVkIHRvIG1hcCBtYXggRkIgc2l6ZSBmb3IgZmluZGluZyBvdXQgYWJvdXQgUkFNIHNpemUgKi8KLQkgICBpdmlkZW8tPnZpZGVvX3ZiYXNlID0gaW9yZW1hcChpdmlkZW8tPnZpZGVvX2Jhc2UsIDB4NDAwMDAwMCk7Ci0JICAgaWYoaXZpZGVvLT52aWRlb192YmFzZSkgewotCSAgICAgIHNpc2ZiX3NldHJhbXNpemUzMDAocGRldik7Ci0JICAgICAgaW91bm1hcChpdmlkZW8tPnZpZGVvX3ZiYXNlKTsKLQkgICB9IGVsc2UgewotCSAgICAgIHByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogRmFpbGVkIHRvIG1hcCBtZW1vcnkgZm9yIHNpemUgZGV0ZWN0aW9uLCBhc3N1bWluZyA4TUJcbiIpOwotCSAgICAgIG91dFNJU0lEWFJFRyhTSVNTUiwweDEzLDB4MjgpOyAgLyogPyAqLwotCSAgICAgIG91dFNJU0lEWFJFRyhTSVNTUiwweDE0LDB4NDcpOyAgLyogOE1CLCA2NGJpdCBkZWZhdWx0ICovCi0JICAgfQorCQkvKiBOZWVkIHRvIG1hcCBtYXggRkIgc2l6ZSBmb3IgZmluZGluZyBvdXQgYWJvdXQgUkFNIHNpemUgKi8KKwkJbWFwc2l6ZSA9IDY0IDw8IDIwOworCQlzaXNmYl9wb3N0X21hcF92cmFtKGl2aWRlbywgJm1hcHNpemUsIDQpOworCisJCWlmKGl2aWRlby0+dmlkZW9fdmJhc2UpIHsKKwkJCXNpc2ZiX3Bvc3RfMzAwX3JhbXNpemUocGRldiwgbWFwc2l6ZSk7CisJCQlpb3VubWFwKGl2aWRlby0+dmlkZW9fdmJhc2UpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkic2lzZmI6IEZhaWxlZCB0byBtYXAgbWVtb3J5IGZvciBzaXplIGRldGVjdGlvbiwgYXNzdW1pbmcgOE1CXG4iKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHgyOCk7ICAvKiA/ICovCisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4NDcpOyAgLyogOE1CLCA2NGJpdCBkZWZhdWx0ICovCisJCX0KICNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKIAl9CiAjZW5kaWYKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhlNl07Ci0JICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4ZTddOworCWlmKGJpb3MpIHsKKwkJdjEgPSBiaW9zWzB4ZTZdOworCQl2MiA9IGJpb3NbMHhlN107CiAJfSBlbHNlIHsKLQkgICBpblNJU0lEWFJFRyhTSVNTUiwweDNhLHJlZyk7Ci0JICAgaWYoKHJlZyAmIDB4MzApID09IDB4MzApIHsKLQkgICAgICB2MSA9IDB4MDQ7IC8qIFBDSSAqLwotCSAgICAgIHYyID0gMHg5MjsKLQkgICB9IGVsc2UgewotCSAgICAgIHYxID0gMHgxNDsgLyogQUdQICovCi0JICAgICAgdjIgPSAweGIyOwotCSAgIH0KKwkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4M2EsIHJlZyk7CisJCWlmKChyZWcgJiAweDMwKSA9PSAweDMwKSB7CisJCQl2MSA9IDB4MDQ7IC8qIFBDSSAqLworCQkJdjIgPSAweDkyOworCQl9IGVsc2UgeworCQkJdjEgPSAweDE0OyAvKiBBR1AgKi8KKwkJCXYyID0gMHhiMjsKKwkJfQogCX0KLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyMSx2MSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjIsdjIpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyMSwgdjEpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyMiwgdjIpOworCisJLyogU2Vuc2UgQ1JUMSAqLworCXNpc2ZiX3NlbnNlX2NydDEoaXZpZGVvKTsKKworCS8qIFNldCBkZWZhdWx0IG1vZGUsIGRvbid0IGNsZWFyIHNjcmVlbiAqLworCWl2aWRlby0+U2lTX1ByLlNpU19Vc2VPRU0gPSBGQUxTRTsKKwlTaVNfU2V0RW5hYmxlRHN0bigmaXZpZGVvLT5TaVNfUHIsIEZBTFNFKTsKKwlTaVNfU2V0RW5hYmxlRnN0bigmaXZpZGVvLT5TaVNfUHIsIEZBTFNFKTsKKwlpdmlkZW8tPmN1ckZTVE4gPSBpdmlkZW8tPmN1ckRTVE4gPSAwOworCWl2aWRlby0+U2lTX1ByLlZpZGVvTWVtb3J5U2l6ZSA9IDggPDwgMjA7CisJU2lTU2V0TW9kZSgmaXZpZGVvLT5TaVNfUHIsIDB4MmUgfCAweDgwKTsKKworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgMHg4Nik7CisKKwkvKiBEaXNwbGF5IG9mZiAqLworCW9yU0lTSURYUkVHKFNJU1NSLCAweDAxLCAweDIwKTsKKworCS8qIFNhdmUgbW9kZSBudW1iZXIgaW4gQ1IzNCAqLworCW91dFNJU0lEWFJFRyhTSVNDUiwgMHgzNCwgMHgyZSk7CisKKwkvKiBMZXQgZXZlcnlvbmUga25vdyB3aGF0IHRoZSBjdXJyZW50IG1vZGUgaXMgKi8KKwlpdmlkZW8tPm1vZGVwcmVjaGFuZ2UgPSAweDJlOwogfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotc3RhdGljIHZvaWQgX19kZXZpbml0IHNpc2ZiX3Bvc3Rfc2lzMzE1MzMwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorI2lmIDAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc2lzZmJfcG9zdF9zaXMzMTUzMzAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0jaWZkZWYgWUVUX1RPX0JFX0RPTkUKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQl1OCAgcmVnLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2Nywgdjg7Ci0JdTE2IGluZGV4LCByaW5kZXgsIG1lbXR5cGUgPSAwOwotCXUzMiByZWcxXzMyLCByZWcyXzMyLCByZWczXzMyOwotCWludCBpOwotCi0JLyogVW5sb2NrICovCi0JLyogb3V0U0lTSURYUkVHKDB4M2M0LDB4MDUsMHg4Nik7ICovCi0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MDUsMHg4Nik7Ci0KLQkvKiBFbmFibGUgcmVsb2NhdGVkIGkvbyBwb3J0cyAqLwotCS8qIHNldFNJU0lEWFJFRygweDNjNCwweDIwLH4weDEwLDB4MjApOyAqLwotCXNldFNJU0lEWFJFRyhTSVNTUiwweDIwLH4weDEwLDB4MjApOwotCi0JLyogQ2xlYXIgcmVncyAqLwotCWZvcihpID0gMDsgaSA8IDB4MjI7IGkrKykgewotCSAgIG91dFNJU0lEWFJFRyhTSVNTUiwoMHgwNiArIGkpLDB4MDApOwotCX0KLQl2MSA9IDB4MGQ7Ci0JaWYoIGlzIDMzMCkgdjEgPSAweDBiOwotCWZvcihpID0gMDsgaSA8IHYxOyBpKyspIHsKLQkgICBvdXRTSVNJRFhSRUcoU0lTU1IsKDB4MzEgKyBpKSwweDAwKTsKLQl9Ci0JZm9yKGkgPSAwOyBpIDwgMHgxMDsgaSsrKSB7Ci0JICAgb3V0U0lTSURYUkVHKFNJU0NSLCgweDMwICsgaSksMHgwMCk7Ci0JfQotCi0JLyogUmVzZXQgY2xvY2tzICovCi0JcmVnID0gaW5TSVNSRUcoU0lTTUlTQ1IpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDI4LDB4ODEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJBLDB4MDApOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDI5LDB4RTEpOwotCW91dFNJU1JFRyhTSVNNSVNDVywocmVnIHwgMHgwYykpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJCLDB4ODEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJELDB4MDApOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJDLDB4RTEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJFLDB4ODEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDMwLDB4MDApOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJGLDB4RTEpOwotCVNpU19EREMyRGVsYXkoLi4uLik7Ci0Jb3V0U0lTUkVHKFNJU01JU0NXLHJlZyk7Ci0KLQkvKiBHZXQgbWVtb3J5IHR5cGUgKi8KLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4NTJdICYgMHg4MCkpIHsKLQkgICAgICBtZW10eXBlID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweDUyXTsKLSAJICAgfSBlbHNlIHsKLQkgICAgICBpblNJU0lEWFJFRyhTSVNTUiwweDNhLG1lbXR5cGUpOwotCSAgIH0KLQkgICBtZW10eXBlICY9IDB4MDM7Ci0JICAgaWYoIGlzIDMzMCApIHsKLQkgICAgICBpZihtZW10eXBlIDw9IDEpIG1lbXR5cGUgPSAwOwotCSAgICAgIGVsc2UgewotCSAgICAgICAgIGluU0lTSURYUkVHKFNJU0NSLDB4NUYscmVnKTsKLQkJIHJlZyAmPSAweDMwOwotCQkgc3dpdGNoKHJlZykgewotCQkgY2FzZSAweDAwOiBtZW10eXBlID0gMTsgYnJlYWs7Ci0JCSBjYXNlIDB4MTA6IG1lbXR5cGUgPSAzOyBicmVhazsKLQkJIGNhc2UgMHgyMDogbWVtdHlwZSA9IDM7IGJyZWFrOwotCQkgZGVmYXVsdDogICBtZW10eXBlID0gMjsKLQkJIH0KLQkgICAgICB9Ci0JICAgfQotCX0KLQotCS8qIFNldCBjbG9ja3MgKi8KLQl2MSA9IDB4M2I7IHYyID0gMHgyMjsgdjMgPSAweDAxOyAgLyogQXNzdW1lIDE0M01oeiBNQ0xLICovCi0JdjQgPSAweDVjOyB2NSA9IDB4MjM7IHY2ID0gMHgwMTsgIC8qIEFzc3VtZSAxNjZNaHogRUNMSyAqLwotCWlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgewotCSAgIGluZGV4ID0gbWVtdHlwZSAqIDU7Ci0JICAgcmluZGV4ID0gaW5kZXggKyAweDU0OwotCSAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtyaW5kZXgrK107Ci0JICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW3JpbmRleCsrXTsKLQkgICB2MyA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbcmluZGV4KytdOwotCSAgIHJpbmRleCA9IGluZGV4ICsgMHg2ODsKLQkgICB2NCA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbcmluZGV4KytdOwotCSAgIHY1ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtyaW5kZXgrK107Ci0JICAgdjYgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW3JpbmRleCsrXTsKLQl9Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjgsdjEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDI5LHYyKTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyYSx2Myk7Ci0JaWYoIGlzIDMzMCApIHsKLQkgICBpblNJU0lEWFJFRyhTSVNTUiwweDNhLHJlZyk7Ci0JICAgcmVnICY9IDB4MDM7Ci0JICAgaWYocmVnID49IDIpIHsKLQkgICAgICAuLi4KLQkgICB9Ci0JfQotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJlLHY0KTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyZix2NSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MzAsdjYpOwotCi0JLyogRW5kIG9mIGNvbXAgd2l0aCAzMzAgKi8KLQotCXYxID0gMHgxODsKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweDdjXTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgwNyx2MSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MTEsMHgwZik7Ci0KLQl2MSA9IDB4MDA7IHYyID0gMHgwZjsgdjMgPSAweGJhOyB2NCA9IDB4YTk7Ci0JdjUgPSAweGEwOyB2NiA9IDB4MDA7IHY3ID0gMHgzMDsKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICBpbmRleCA9IG1lbXR5cGUgKyAweDdkOwotCSAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleF07Ci0JICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgNF07Ci0JICAgdjMgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgOF07Ci0JICAgdjQgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgMTJdOwotCSAgIHY1ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleCArIDE2XTsKLQkgICB2NiA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbaW5kZXggKyAyMF07Ci0JICAgdjcgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgMjRdOwotCX0KLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxNSx2MSk7ICAgICAgIC8qIFJhbSB0eXBlIChhc3N1bWluZyAwLCBCSU9TIDB4N2Qgc3RlcCA0KSAqLwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDE2LHYyKTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxNyx2Myk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MTgsdjQpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDE5LHY1KTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxYSx2Nik7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MWIsdjcpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDFjLHY4KTsJICAgLyogLS0tLSAqLwotCi0JdjEgPSAweDc3OyB2MiA9IDB4Nzc7IHYzID0gMHgwMDsgdjQgPSAweDViOyB2NSA9IDB4MDA7Ci0JaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgaW5kZXggPSBtZW10eXBlICsgMHhhMjsKLQkgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbaW5kZXhdOwotCSAgIHYyID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleCArIDRdOwotCSAgIHYzID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleCArIDhdOwotCSAgIHY0ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleCArIDEyXTsKLQkgICB2NSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbaW5kZXggKyAxNl07Ci0JfQotCW91dFNJU0lEWFJFRyhTSVNDUiwweDQwLHYxKTsKLQlvdXRTSVNJRFhSRUcoU0lTQ1IsMHg0MSx2Mik7Ci0Jb3V0U0lTSURYUkVHKFNJU0NSLDB4NDIsdjMpOwotCW91dFNJU0lEWFJFRyhTSVNDUiwweDQzLHY0KTsKLQlvdXRTSVNJRFhSRUcoU0lTQ1IsMHg0NCx2NSk7Ci0KLQlpZiggaXMgMzMwICkgewotCi0JICAgdjEgPSAweDsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhCQV07Ci0JICAgfQotCSAgIG91dFNJU0lEWFJFRyhTSVNDUiwweDU5LHYxKTsKLQotCSAgIHYxID0gMHg7IHYyID0gMHg7IHYzID0gMHg7IHY0ID0gMHg7Ci0JICAgdjUgPSAweDsgdjYgPSAweDsgdjcgPSAweDsgdjggPSAweDsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICBpbmRleCA9IG1lbXR5cGUgKyAweGJlOwotCSAgICAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleF07Ci0JICAgICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgNF07Ci0JICAgICAgdjMgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgOF07Ci0JICAgICAgdjQgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgMTJdOwotCSAgICAgIHY1ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleCArIDE2XTsKLQkgICAgICB2NiA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbaW5kZXggKyAyMF07Ci0JICAgICAgdjcgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgMjRdOwotCSAgICAgIHY4ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleCArIDI4XTsKLQkgICB9Ci0JICAgb3V0U0lTSURYUkVHKFNJU0NSLDB4NjgsdjEpOwotCSAgIG91dFNJU0lEWFJFRyhTSVNDUiwweDY5LHYyKTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTQ1IsMHg2YSx2Myk7Ci0JICAgb3V0U0lTSURYUkVHKFNJU0NSLDB4NmIsdjQpOwotCSAgIG91dFNJU0lEWFJFRyhTSVNDUiwweDZjLHY1KTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTQ1IsMHg2ZCx2Nik7Ci0JICAgb3V0U0lTSURYUkVHKFNJU0NSLDB4NmUsdjcpOwotCSAgIG91dFNJU0lEWFJFRyhTSVNDUiwweDZmLHY4KTsKLQotCSAgIHYxID0gMHgyMDsKLQkgICBpblNJU0lEWFJFRyhTSVNTUiwweDNiLHJlZyk7Ci0KLQkgICBpZighKHJlZyAmIDB4MDQpKSB7Ci0JICAgICAgaW5TSVNJRFhSRUcoU0lTQ1IsMHg1RixyZWcpOwotCSAgICAgIHJlZyAmPSAweDMwOwotCSAgICAgIGlmKHJlZykgdjEgPSAweDIzOwotCSAgIH0KLQkgICBvdXRTSVNJRFhSRUcoU0lTQ1IsMHg0OCx2MSk7Ci0JICAgb3V0U0lTSURYUkVHKFNJU0NSLDB4NGMsMHgyMCk7Ci0KLQkgICB4eD0geHh4KCk7Ci0JICAgaWYoeHggPj0gMSkgewotCSAgICAgIHYxID0gMHg7Ci0JICAgICAgaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgICAgICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4QkFdOwotCSAgICAgIH0KLQkgICAgICBvdXRTSVNJRFhSRUcoU0lTQ1IsMHg1OSx2MSk7Ci0JICAgfQotCi0KLQotCX0gZWxzZSB7Ci0KLQkgICBvdXRTSVNJRFhSRUcoU0lTQ1IsMHg0OCwweDIzKTsKLQotCSAgIGFuZFNJU0lEWFJFRyhTSVNTUiwweDE2LDB4MGYpOwotCSAgIGlmKG1lbXR5cGUgPD0gMSkgewotCSAgICAgIG9yU0lTSURYUkVHKFNJU1NSLDB4MTYsMHg4MCk7Ci0JICAgfSBlbHNlIHsKLQkgICAgICB2MSA9IDB4MGY7Ci0JICAgICAgaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgICAgICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4ODEgKyBtZW10eXBlXTsKLQkgICAgICB9Ci0JICAgICAgaWYoISh2MSAmIDB4MTApKSB2MiA9IDB4YzA7Ci0JICAgICAgZWxzZSAgICAgICAgICAgICB2MiA9IDB4ZDA7Ci0JICAgICAgb3JTSVNJRFhSRUcoU0lTU1IsMHgxNix2Mik7Ci0JICAgICAgYW5kU0lTSURYUkVHKFNJU1NSLDB4MTYsMHgwZik7Ci0JICAgICAgaWYoISh2MSAmIDB4MTApKSB2MiA9IDB4ODA7Ci0JICAgICAgZWxzZSAgICAgICAgICAgICB2MiA9IDB4QTA7Ci0JICAgICAgb3JTSVNJRFhSRUcoU0lTU1IsMHgxNix2Mik7Ci0gCSAgIH0KLQotCSAgIGlmKG1lbXR5cGUgPj0gMikgewotCSAgICAgIGNvbnN0IHU4IHNyM2NzZXExW10gPSB7IDB4YzAsMHhlMCwweGYwLDB4ZTAsMHhmMCwweGEwLDB4YjAsMHhhMCwweGIwLDB4OTAsMHhkMCB9OwotCSAgICAgIGNvbnN0IHU4IHNyM2NzZXEyW10gPSB7IDB4YzAsMHhhMCwweGIwLDB4YTAsMHhiMCwweGUwLDB4ZjAsMHhhMCwweGIwLDB4OTAsMHhkMCB9OwotCSAgICAgIGZvcihpID0gMDsgaSA8IDExOyBpKyspIHsKLQkgICAgICAgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgzYyxzcjNjc2VxMVtpXSk7Ci0JICAgICAgfQotCSAgICAgIG91dFNJU0lEWFJFRyhTSVNTUiwweDNkLDB4MDApOwotCSAgICAgIG91dFNJU0lEWFJFRyhTSVNTUiwweDNkLDB4MDQpOwotCSAgICAgIFNpU19EREMyRGVsYXkoMHgyMDApOwotCSAgICAgIHYxID0gaW5TSVNJRFhSRUcoU0lTQ1IsMHhFQyk7Ci0JICAgICAgdjIgPSBpblNJU0lEWFJFRyhTSVNDUiwweEVEKTsKLQkgICAgICByZWcxXzMyID0gKHYyIDw8IDgpIHwgdjE7Ci0JICAgICAgb3V0U0lTSURYUkVHKFNJU1NSLDB4M0QsMHgwMCk7Ci0JICAgICAgZm9yKGkgPSAwOyBpIDwgMTE7IGkrKykgewotCSAgICAgICAgIG91dFNJU0lEWFJFRyhTSVNTUiwweDNjLHNyM2NzZXEyW2ldKTsKLQkgICAgICB9Ci0JICAgICAgb3V0U0lTSURYUkVHKFNJU1NSLDB4M2QsMHgwMCk7Ci0JICAgICAgb3V0U0lTSURYUkVHKFNJU1NSLDB4M2QsMHgwNCk7Ci0JICAgICAgU2lTX0REQzJEZWxheSgweDIwMCk7Ci0JICAgICAgdjEgPSBpblNJU0lEWFJFRyhTSVNDUiwweEVDKTsKLQkgICAgICB2MiA9IGluU0lTSURYUkVHKFNJU0NSLDB4RUQpOwotCSAgICAgIHJlZzJfMzIgPSAodjIgPDwgOCkgfCB2MTsKLQkgICAgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgzRCwweDAwKTsKLQkgICAgICByZWczXzMyID0gcmVnMl8zMiA8PCAxOwotCSAgICAgIHJlZzJfMzIgPj49IDE7Ci0JICAgICAgcmVnM18zMiArPSByZWcyXzMyOwotCSAgICAgIHYxID0gMHg0MDsKLQkgICAgICBpZihyZWczXzMyID4gcmVnMV8zMikgdjEgPSAweDEwOwotCSAgICAgICAgIG91dFNJU0lEWFJFRyhTSVNDUiwweDU5LHYxKTsKLQkgICB9Ci0KLQl9Ci0KLQl2MSA9IDB4MDA7Ci0JaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4OTldOwotCX0KLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxZix2MSk7Ci0KLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyMCwweDIwKTsKLQotCXYxID0gMHhmNjsgdjIgPSAweDBkOyB2MyA9IDB4MzM7Ci0JaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4OWNdOwotCSAgIHYyID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweDlkXTsKLQkgICB2MyA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHg5ZV07Ci0JfQotCW91dFNJU0lEWFJFRyhTSVNTUiwweDIzLHYxKTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyNCx2Mik7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjUsdjMpOwotCi0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjEsMHg4NCk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjIsMHgwMCk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjcsMHgxZik7Ci0KLQl2MSA9IDB4MDA7IHYyID0gMHgwMDsKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHg5Rl07Ci0JICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4QTFdOwotCX0KLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgzMSx2MSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MzMsdjIpOwotCi0JdjEgPSAweDExOwotCWlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgewotCSAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweEEwXTsKLQl9Ci0JdjIgPSBpblNJU0lEWFJFRyhTSVNQQVJUNCwweDAwKTsKLQlpZigodjIgIT0gMSkgJiYgKHYyICE9IDIpKSB2MSAmPSAweGVmOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDMyLHYxKTsKLQotCS8qIEFHUCAqLwotCXBjaV9yZWFkX2NvbmZpZ19sb25nKHBkZXYsIDB4NTAsICZyZWcxXzMyKTsKLQlyZWcxXzMyID4+PSAyMDsKLQlyZWcxXzMyICY9IDB4MGY7Ci0JaWYocmVnMV8zMiA9PSAxKSB7Ci0JICAgdjEgPSAweEFBOyB2MiA9IDB4MzM7Ci0JICAgaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4RjddOwotCSAgICAgIHYyID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweDlFXTsKLQkgICB9Ci0JfSBlbHNlIHsKLQkgICB2MSA9IDB4ODg7IHYyID0gMHgwMzsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhGOF07Ci0JICAgICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4RjZdOwotCSAgIH0KLQl9Ci0Jb3V0U0lTSURYUkVHKFNJU0NSLDB4NDksdjEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDI1LHYyKTsKLQotCXYxID0gaW5TSVNJRFhSRUcoU0lTUEFSVDQsMHgwMCk7Ci0JaWYoKHYxID09IDEpIHx8ICh2MSA9PSAyKSkgewotCSAgIG9yU0lTSURYUkVHKFNJU1BBUlQxLDB4MkYsMHgwMSk7ICAvKiBVbmxvY2sgQ1JUMiAqLwotCSAgIG91dFNJU0lEWFJFRyhTSVNQQVJUMSwweDAwLDB4MDApOwotCSAgIHYxID0gMHgwMDsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhiNl07Ci0JICAgfQotCSAgIG91dFNJU0lEWFJFRyhTSVNQQVJUMSwweDAyLHYxKTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDEsMHgyRSwweDA4KTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgwMCwweDFjKTsKLQkgICB2MSA9IDB4NDA7IHYyID0gMHgwMDsgdjMgPSAweDgwOwotCSAgIGlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgewotCSAgICAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweGI3XTsKLQkgICAgICB2MiA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhiOF07Ci0JICAgICAgdjMgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4YmJdOwotCSAgIH0KLQkgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDQsMHgwZCx2MSk7Ci0JICAgb3V0U0lTSURYUkVHKFNJU1BBUlQ0LDB4MGUsdjIpOwotCSAgIG91dFNJU0lEWFJFRyhTSVNQQVJUNCwweDEwLHYzKTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDQsMHgwRiwweDNGKTsKLQotCSAgIGluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MDEscmVnKTsKLQkgICBpZihyZWcgPj0gMHhiMCkgewotCSAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MjMscmVnKTsKLQkgICAgICByZWcgJj0gMHgyMDsKLQkgICAgICByZWcgPDw9IDE7Ci0JICAgICAgb3V0U0lTSURYUkVHKFNJU1BBUlQ0LDB4MjMscmVnKTsKLQkgICB9Ci0JfQotCW91dFNJU0lEWFJFRyhTSVNDUiwweDM3LDB4MDIpOyAvKiBXaHk/ICovCi0KLQlvdXRTSVNJRFhSRUcoU0lTQ1IsMHg4MywweDAwKTsKLQlvdXRTSVNJRFhSRUcoU0lTQ1IsMHg5MCwweDAwKTsKLQlhbmRTSVNJRFhSRUcoU0lTU1IsMHg1QiwweERGKTsKLQlvdXRTSVNJRFhSRUcoU0lTVklELDB4MDAsMHg4Nik7Ci0Jb3V0U0lTSURYUkVHKFNJU1ZJRCwweDMyLDB4MDApOwotCW91dFNJU0lEWFJFRyhTSVNWSUQsMHgzMCwweDAwKTsKLQlvdXRTSVNJRFhSRUcoU0lTVklELDB4MzIsMHgwMSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1ZJRCwweDMwLDB4MDApOwotCW9yU0lTSURYUkVHKFNJU0NSLDB4NjMsMHg4MCk7Ci0JLyogRW5kIG9mIEluaXQxICovCi0KLQkvKiBTZXQgTW9kZSAweDJlICovCi0KLQkvKiBSYW1zaXplICovCi0Jb3JTSVNJRFhSRUcoU0lTU1IsMHgxNiwweDBmKTsKLQlvclNJU0lEWFJFRyhTSVNTUiwweDE4LDB4QTkpOwotCW9yU0lTSURYUkVHKFNJU1NSLDB4MTksMHhBMCk7Ci0Jb3JTSVNJRFhSRUcoU0lTU1IsMHgxQiwweDMwKTsKLQlhbmRTSVNJRFhSRUcoU0lTU1IsMHgxNywweEY4KTsKLQlvclNJU0lEWFJFRyhTSVNTUiwweDE5LDB4MDMpOwotCWFuZFNJRElEWFJFRyhTSVNTUiwweDEzLDB4MDApOwotCi0JLyogTmVlZCB0byBtYXAgbWF4IEZCIHNpemUgZm9yIGZpbmRpbmcgb3V0IGFib3V0IFJBTSBzaXplICovCi0JaXZpZGVvLT52aWRlb192YmFzZSA9IGlvcmVtYXAoaXZpZGVvLT52aWRlb19iYXNlLCAweDQwMDAwMDApOwotCWlmKGl2aWRlby0+dmlkZW9fdmJhc2UpIHsKLQkgICAvKiBGaW5kIG91dCBhYm91dCBidXMgd2lkdGggKi8KLQkgICBpZihtZW10eXBlIDw9IDEpIHsKLQkgICAgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgxNCwweDAyKTsKLQkgICAgICBhbmRTSVNJRFhSRUcoU0lTU1IsMHgxNiwweDBGKTsKLQkgICAgICBvclNJU0lEWFJFRyhTSVNTUiwweDE2LDB4ODApOwotCi0JICAgICAgLi4uCi0KLQkgICB9IGVsc2UgewotCi0JICAgICAgLi4uCi0KLQkgICB9Ci0KLQkgICAvKiBGaW5kIG91dCBhYm91dCBzaXplICovCi0KLQotCSAgIGlvdW5tYXAoaXZpZGVvLT52aWRlb192YmFzZSk7Ci0JfSBlbHNlIHsKLQkgICBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IEZhaWxlZCB0byBtYXAgbWVtb3J5IGZvciBzaXplIGRldGVjdGlvbiwgYXNzdW1pbmcgOE1CXG4iKTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgxNCwweD8/KTsgIC8qIDhNQiwgNjRiaXQgZGVmYXVsdCAqLwotCX0KLQotCS8qIEFHUCAoTWlzc2luZzogQ2hlY2tzIGZvciBWSUEgYW5kIEFNRCBob3N0cykgKi8KLQl2MSA9IDB4QTU7IHYyID0gMHhGQjsKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHg5QV07Ci0JICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4OUJdOwotCX0KLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyMSx2MSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjIsdjIpOwotCi0jZW5kaWYKLQlyZXR1cm47CisJLyogVE9ETyAqLwogfQogI2VuZGlmCiAKLQotc3RhdGljIGludCBfX2RldmluaXQgc2lzZmJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK3Npc2ZiX3Bvc3RfeGdpX2RlbGF5KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBpbnQgZGVsYXkpCiB7Ci0Jc3RydWN0IHNpc2ZiX2NoaXBfaW5mbyAJKmNoaXBpbmZvID0gJnNpc2ZiX2NoaXBfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXTsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gCSppdmlkZW8gPSBOVUxMOwotCXN0cnVjdCBmYl9pbmZvIAkJKnNpc19mYl9pbmZvID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1OCByZWc7CisKKwlmb3IoaSA9IDA7IGkgPD0gKGRlbGF5ICogMTAgKiAzNik7IGkrKykgeworCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgcmVnKTsKKwkJcmVnKys7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc2lzZmJfZmluZF9ob3N0X2JyaWRnZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgc3RydWN0IHBjaV9kZXYgKm15cGRldiwKKwkJCQl1bnNpZ25lZCBzaG9ydCBwY2l2ZW5kb3IpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCXVuc2lnbmVkIHNob3J0IHRlbXA7CisJaW50IHJldCA9IDA7CisKKwl3aGlsZSgocGRldiA9IFNJU19QQ0lfR0VUX0NMQVNTKFBDSV9DTEFTU19CUklER0VfSE9TVCwgcGRldikpKSB7CisJCXRlbXAgPSBwZGV2LT52ZW5kb3I7CisJCVNJU19QQ0lfUFVUX0RFVklDRShwZGV2KTsKKwkJaWYodGVtcCA9PSBwY2l2ZW5kb3IpIHsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzaXNmYl9wb3N0X3hnaV9yd3Rlc3Qoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIGludCBzdGFydGEsCisJCQl1bnNpZ25lZCBpbnQgZW5kYSwgdW5zaWduZWQgaW50IG1hcHNpemUpCit7CisJdW5zaWduZWQgaW50IHBvczsKKwlpbnQgaTsKKworCXdyaXRlbCgwLCBpdmlkZW8tPnZpZGVvX3ZiYXNlKTsKKworCWZvcihpID0gc3RhcnRhOyBpIDw9IGVuZGE7IGkrKykgeworCQlwb3MgPSAxIDw8IGk7CisJCWlmKHBvcyA8IG1hcHNpemUpCisJCQl3cml0ZWwocG9zLCBpdmlkZW8tPnZpZGVvX3ZiYXNlICsgcG9zKTsKKwl9CisKKwlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDE1MCk7CisKKwlpZihyZWFkbChpdmlkZW8tPnZpZGVvX3ZiYXNlKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCWZvcihpID0gc3RhcnRhOyBpIDw9IGVuZGE7IGkrKykgeworCQlwb3MgPSAxIDw8IGk7CisJCWlmKHBvcyA8IG1hcHNpemUpIHsKKwkJCWlmKHJlYWRsKGl2aWRlby0+dmlkZW9fdmJhc2UgKyBwb3MpICE9IHBvcykKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0CitzaXNmYl9wb3N0X3hnaV9yYW1zaXplKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQoreworCXVuc2lnbmVkIGludCBidXN3aWR0aCwgcmFua3NpemUsIGNoYW5uZWxhYiwgbWFwc2l6ZTsKKwlpbnQgaSwgaiwgaywgbDsKKwl1OCByZWcsIHNyMTQ7CisJc3RhdGljIGNvbnN0IHU4IGRyYW1zcjEzWzEyICogNV0gPSB7CisJCTB4MDIsIDB4MGUsIDB4MGIsIDB4ODAsIDB4NWQsCisJCTB4MDIsIDB4MGUsIDB4MGEsIDB4NDAsIDB4NTksCisJCTB4MDIsIDB4MGQsIDB4MGIsIDB4NDAsIDB4NGQsCisJCTB4MDIsIDB4MGUsIDB4MDksIDB4MjAsIDB4NTUsCisJCTB4MDIsIDB4MGQsIDB4MGEsIDB4MjAsIDB4NDksCisJCTB4MDIsIDB4MGMsIDB4MGIsIDB4MjAsIDB4M2QsCisJCTB4MDIsIDB4MGUsIDB4MDgsIDB4MTAsIDB4NTEsCisJCTB4MDIsIDB4MGQsIDB4MDksIDB4MTAsIDB4NDUsCisJCTB4MDIsIDB4MGMsIDB4MGEsIDB4MTAsIDB4MzksCisJCTB4MDIsIDB4MGQsIDB4MDgsIDB4MDgsIDB4NDEsCisJCTB4MDIsIDB4MGMsIDB4MDksIDB4MDgsIDB4MzUsCisJCTB4MDIsIDB4MGMsIDB4MDgsIDB4MDQsIDB4MzEKKwl9OworCXN0YXRpYyBjb25zdCB1OCBkcmFtc3IxM180WzQgKiA1XSA9IHsKKwkJMHgwMiwgMHgwZCwgMHgwOSwgMHg0MCwgMHg0NSwKKwkJMHgwMiwgMHgwYywgMHgwOSwgMHgyMCwgMHgzNSwKKwkJMHgwMiwgMHgwYywgMHgwOCwgMHgxMCwgMHgzMSwKKwkJMHgwMiwgMHgwYiwgMHgwOCwgMHgwOCwgMHgyMQorCX07CisKKwkvKiBFbmFibGUgbGluZWFyIG1vZGUsIGRpc2FibGUgMHhhMDAwMCBhZGRyZXNzIGRlY29kaW5nICovCisJLyogV2UgZGlzYWJsZSBhMDAwMCBhZGRyZXNzIGRlY29kaW5nLCBiZWNhdXNlCisJICogLSBpZiBydW5uaW5nIG9uIHg4NiwgaWYgdGhlIGNhcmQgaXMgZGlzYWJsZWQsIGl0IG1lYW5zCisJICogICB0aGF0IGFub3RoZXIgY2FyZCBpcyBpbiB0aGUgc3lzdGVtLiBXZSBkb24ndCB3YW50CisJICogICB0byBpbnRlcnBoZXJlIHdpdGggdGhhdCBwcmltYXJ5IGNhcmQncyB0ZXh0bW9kZS4KKwkgKiAtIGlmIHJ1bm5pbmcgb24gbm9uLXg4NiwgdGhlcmUgdXN1YWxseSBpcyBubyBWR0Egd2luZG93CisJICogICBhdCBhMDAwMC4KKwkgKi8KKwlvclNJU0lEWFJFRyhTSVNTUiwgMHgyMCwgKDB4ODAgfCAweDA0KSk7CisKKwkvKiBOZWVkIHRvIG1hcCBtYXggRkIgc2l6ZSBmb3IgZmluZGluZyBvdXQgYWJvdXQgUkFNIHNpemUgKi8KKwltYXBzaXplID0gMjU2IDw8IDIwOworCXNpc2ZiX3Bvc3RfbWFwX3ZyYW0oaXZpZGVvLCAmbWFwc2l6ZSwgMzIpOworCisJaWYoIWl2aWRlby0+dmlkZW9fdmJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogVW5hYmxlIHRvIGRldGVjdCBSQU0gc2l6ZS4gU2V0dGluZyBkZWZhdWx0LlxuIik7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHgzNSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHg0MSk7CisJCS8qIFRPRE8gKi8KKwkJcmV0dXJuOworCX0KKworCS8qIE5vbi1pbnRlcmxlYXZpbmcgKi8KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTUsIDB4MDApOworCS8qIE5vIHRpbGluZyAqLworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxYywgMHgwMCk7CisKKwlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSB7CisKKwkJY2hhbm5lbGFiID0gMTsKKwkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4OTcsIHJlZyk7CisJCWlmKCEocmVnICYgMHgwMSkpIHsJLyogU2luZ2xlIDMyLzE2ICovCisJCQlidXN3aWR0aCA9IDMyOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweGIxKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHg1Mik7CisJCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDEpOworCQkJc3IxNCA9IDB4MDI7CisJCQlpZihzaXNmYl9wb3N0X3hnaV9yd3Rlc3QoaXZpZGVvLCAyMywgMjQsIG1hcHNpemUpKQorCQkJCWdvdG8gYmFpbF9vdXQ7CisKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHgzMSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4NDIpOworCQkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJCWlmKHNpc2ZiX3Bvc3RfeGdpX3J3dGVzdChpdmlkZW8sIDIzLCAyMywgbWFwc2l6ZSkpCisJCQkJZ290byBiYWlsX291dDsKKworCQkJYnVzd2lkdGggPSAxNjsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHhiMSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4NDEpOworCQkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJCXNyMTQgPSAweDAxOworCQkJaWYoc2lzZmJfcG9zdF94Z2lfcnd0ZXN0KGl2aWRlbywgMjIsIDIzLCBtYXBzaXplKSkKKwkJCQlnb3RvIGJhaWxfb3V0OworCQkJZWxzZQorCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHgzMSk7CisJCX0gZWxzZSB7CQkvKiBEdWFsIDE2LzggKi8KKwkJCWJ1c3dpZHRoID0gMTY7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4YjEpOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweDQxKTsKKwkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMSk7CisJCQlzcjE0ID0gMHgwMTsKKwkJCWlmKHNpc2ZiX3Bvc3RfeGdpX3J3dGVzdChpdmlkZW8sIDIyLCAyMywgbWFwc2l6ZSkpCisJCQkJZ290byBiYWlsX291dDsKKworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweDMxKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHgzMSk7CisJCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDEpOworCQkJaWYoc2lzZmJfcG9zdF94Z2lfcnd0ZXN0KGl2aWRlbywgMjIsIDIyLCBtYXBzaXplKSkKKwkJCQlnb3RvIGJhaWxfb3V0OworCisJCQlidXN3aWR0aCA9IDg7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4YjEpOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweDMwKTsKKwkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMSk7CisJCQlzcjE0ID0gMHgwMDsKKwkJCWlmKHNpc2ZiX3Bvc3RfeGdpX3J3dGVzdChpdmlkZW8sIDIxLCAyMiwgbWFwc2l6ZSkpCisJCQkJZ290byBiYWlsX291dDsKKwkJCWVsc2UKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4MzEpOworCQl9CisKKwl9IGVsc2UgewkvKiBYR0lfNDAgKi8KKworCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg5NywgcmVnKTsKKwkJaWYoIShyZWcgJiAweDEwKSkgeworCQkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4MzksIHJlZyk7CisJCQlyZWcgPj49IDE7CisJCX0KKworCQlpZihyZWcgJiAweDAxKSB7CS8qIEREUklJICovCisJCQlidXN3aWR0aCA9IDMyOworCQkJaWYoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSB7CisJCQkJY2hhbm5lbGFiID0gMjsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4YTEpOworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHg0NCk7CisJCQkJc3IxNCA9IDB4MDQ7CisJCQkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJCQlpZihzaXNmYl9wb3N0X3hnaV9yd3Rlc3QoaXZpZGVvLCAyMywgMjQsIG1hcHNpemUpKQorCQkJCQlnb3RvIGJhaWxfb3V0OworCisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweDIxKTsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4MzQpOworCQkJCWlmKHNpc2ZiX3Bvc3RfeGdpX3J3dGVzdChpdmlkZW8sIDIyLCAyMywgbWFwc2l6ZSkpCisJCQkJCWdvdG8gYmFpbF9vdXQ7CisKKwkJCQljaGFubmVsYWIgPSAxOworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHhhMSk7CisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweDQwKTsKKwkJCQlzcjE0ID0gMHgwMDsKKwkJCQlpZihzaXNmYl9wb3N0X3hnaV9yd3Rlc3QoaXZpZGVvLCAyMiwgMjMsIG1hcHNpemUpKQorCQkJCQlnb3RvIGJhaWxfb3V0OworCisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweDIxKTsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4MzApOworCQkJfSBlbHNlIHsKKwkJCQljaGFubmVsYWIgPSAzOworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHhhMSk7CisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweDRjKTsKKwkJCQlzcjE0ID0gMHgwYzsKKwkJCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDEpOworCQkJCWlmKHNpc2ZiX3Bvc3RfeGdpX3J3dGVzdChpdmlkZW8sIDIzLCAyNSwgbWFwc2l6ZSkpCisJCQkJCWdvdG8gYmFpbF9vdXQ7CisKKwkJCQljaGFubmVsYWIgPSAyOworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHg0OCk7CisJCQkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJCQlzcjE0ID0gMHgwODsKKwkJCQlpZihzaXNmYl9wb3N0X3hnaV9yd3Rlc3QoaXZpZGVvLCAyMywgMjQsIG1hcHNpemUpKQorCQkJCQlnb3RvIGJhaWxfb3V0OworCisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweDIxKTsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4M2MpOworCQkJCXNyMTQgPSAweDBjOworCisJCQkJaWYoc2lzZmJfcG9zdF94Z2lfcnd0ZXN0KGl2aWRlbywgMjMsIDI0LCBtYXBzaXplKSkgeworCQkJCQljaGFubmVsYWIgPSAzOworCQkJCX0gZWxzZSB7CisJCQkJCWNoYW5uZWxhYiA9IDI7CisJCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHgzOCk7CisJCQkJCXNyMTQgPSAweDA4OworCQkJCX0KKwkJCX0KKwkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMSk7CisKKwkJfSBlbHNlIHsJLyogRERSICovCisKKwkJCWJ1c3dpZHRoID0gNjQ7CisJCQlpZihpdmlkZW8tPnJldmlzaW9uX2lkID09IDIpIHsKKwkJCQljaGFubmVsYWIgPSAxOworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHhhMSk7CisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweDUyKTsKKwkJCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDEpOworCQkJCXNyMTQgPSAweDAyOworCQkJCWlmKHNpc2ZiX3Bvc3RfeGdpX3J3dGVzdChpdmlkZW8sIDIzLCAyNCwgbWFwc2l6ZSkpCisJCQkJCWdvdG8gYmFpbF9vdXQ7CisKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4MjEpOworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHg0Mik7CisJCQl9IGVsc2UgeworCQkJCWNoYW5uZWxhYiA9IDI7CisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweGExKTsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4NWEpOworCQkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMSk7CisJCQkJc3IxNCA9IDB4MGE7CisJCQkJaWYoc2lzZmJfcG9zdF94Z2lfcnd0ZXN0KGl2aWRlbywgMjQsIDI1LCBtYXBzaXplKSkKKwkJCQkJZ290byBiYWlsX291dDsKKworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHgyMSk7CisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweDRhKTsKKwkJCX0KKwkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMSk7CisKKwkJfQorCX0KKworYmFpbF9vdXQ6CisJc2V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweGYwLCBzcjE0KTsKKwlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDEpOworCisJaiA9IChpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSA/IDUgOiA5OworCWsgPSAoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgPyAxMiA6IDQ7CisKKwlmb3IoaSA9IDA7IGkgPCBrOyBpKyspIHsKKworCQlyZWcgPSAoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgPworCQkJCWRyYW1zcjEzWyhpICogNSkgKyA0XSA6IGRyYW1zcjEzXzRbKGkgKiA1KSArIDRdOworCQlzZXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4ODAsIHJlZyk7CisJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgNTApOworCisJCXJhbmtzaXplID0gKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApID8KKwkJCQlkcmFtc3IxM1soaSAqIDUpICsgM10gOiBkcmFtc3IxM180WyhpICogNSkgKyAzXTsKKworCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgxMywgcmVnKTsKKwkJaWYocmVnICYgMHg4MCkgcmFua3NpemUgPDw9IDE7CisKKwkJaWYoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgeworCQkJaWYoYnVzd2lkdGggPT0gMTYpICAgICAgcmFua3NpemUgPDw9IDE7CisJCQllbHNlIGlmKGJ1c3dpZHRoID09IDMyKSByYW5rc2l6ZSA8PD0gMjsKKwkJfSBlbHNlIHsKKwkJCWlmKGJ1c3dpZHRoID09IDY0KSAgICAgIHJhbmtzaXplIDw8PSAxOworCQl9CisKKwkJcmVnID0gMDsKKwkJbCA9IGNoYW5uZWxhYjsKKwkJaWYobCA9PSAzKSBsID0gNDsKKwkJaWYoKHJhbmtzaXplICogbCkgPD0gMjU2KSB7CisJCQl3aGlsZSgocmFua3NpemUgPj49IDEpKSByZWcgKz0gMHgxMDsKKwkJfQorCisJCWlmKCFyZWcpIGNvbnRpbnVlOworCisJCXNldFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHgwZiwgKHJlZyAmIDB4ZjApKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKworCQlpZihzaXNmYl9wb3N0X3hnaV9yd3Rlc3QoaXZpZGVvLCBqLCAoKHJlZyA+PiA0KSArIGNoYW5uZWxhYiAtIDIgKyAyMCksIG1hcHNpemUpKQorCQkJYnJlYWs7CisJfQorCisJaW91bm1hcChpdmlkZW8tPnZpZGVvX3ZiYXNlKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0CitzaXNmYl9wb3N0X3hnaV9zZXRjbG9ja3Moc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHU4IHJlZ2IpCit7CisJdTggdjEsIHYyLCB2MzsKKwlpbnQgaW5kZXg7CisJc3RhdGljIGNvbnN0IHU4IGNzOTBbOCAqIDNdID0geworCQkweDE2LCAweDAxLCAweDAxLAorCQkweDNlLCAweDAzLCAweDAxLAorCQkweDdjLCAweDA4LCAweDAxLAorCQkweDc5LCAweDA2LCAweDAxLAorCQkweDI5LCAweDAxLCAweDgxLAorCQkweDVjLCAweDIzLCAweDAxLAorCQkweDVjLCAweDIzLCAweDAxLAorCQkweDVjLCAweDIzLCAweDAxCisJfTsKKwlzdGF0aWMgY29uc3QgdTggY3NiOFs4ICogM10gPSB7CisJCTB4NWMsIDB4MjMsIDB4MDEsCisJCTB4MjksIDB4MDEsIDB4MDEsCisJCTB4N2MsIDB4MDgsIDB4MDEsCisJCTB4NzksIDB4MDYsIDB4MDEsCisJCTB4MjksIDB4MDEsIDB4ODEsCisJCTB4NWMsIDB4MjMsIDB4MDEsCisJCTB4NWMsIDB4MjMsIDB4MDEsCisJCTB4NWMsIDB4MjMsIDB4MDEKKwl9OworCisJcmVnYiA9IDA7ICAvKiAhICovCisKKwlpbmRleCA9IHJlZ2IgKiAzOworCXYxID0gY3M5MFtpbmRleF07IHYyID0gY3M5MFtpbmRleCArIDFdOyB2MyA9IGNzOTBbaW5kZXggKyAyXTsKKwlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJdjEgPSBpdmlkZW8tPmJpb3NfYWJhc2VbMHg5MCArIGluZGV4XTsKKwkJdjIgPSBpdmlkZW8tPmJpb3NfYWJhc2VbMHg5MCArIGluZGV4ICsgMV07CisJCXYzID0gaXZpZGVvLT5iaW9zX2FiYXNlWzB4OTAgKyBpbmRleCArIDJdOworCX0KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MjgsIHYxKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MjksIHYyKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MmEsIHYzKTsKKwlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDB4NDMpOworCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMHg0Myk7CisJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDQzKTsKKwlpbmRleCA9IHJlZ2IgKiAzOworCXYxID0gY3NiOFtpbmRleF07IHYyID0gY3NiOFtpbmRleCArIDFdOyB2MyA9IGNzYjhbaW5kZXggKyAyXTsKKwlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJdjEgPSBpdmlkZW8tPmJpb3NfYWJhc2VbMHhiOCArIGluZGV4XTsKKwkJdjIgPSBpdmlkZW8tPmJpb3NfYWJhc2VbMHhiOCArIGluZGV4ICsgMV07CisJCXYzID0gaXZpZGVvLT5iaW9zX2FiYXNlWzB4YjggKyBpbmRleCArIDJdOworCX0KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MmUsIHYxKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MmYsIHYyKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MzAsIHYzKTsKKwlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDB4NDMpOworCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMHg0Myk7CisJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDQzKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK3Npc2ZiX3Bvc3RfeGdpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGNoYXIgKmJpb3MgPSBpdmlkZW8tPmJpb3NfYWJhc2U7CisJc3RydWN0IHBjaV9kZXYgKm15cGRldiA9IE5VTEw7CisJY29uc3QgdTggKnB0ciwgKnB0cjI7CisJdTggdjEsIHYyLCB2MywgdjQsIHY1LCByZWcsIHJhbXR5cGU7CisJdTMyIHJlZ2EsIHJlZ2IsIHJlZ2Q7CisJaW50IGksIGosIGssIGluZGV4OworCXN0YXRpYyBjb25zdCB1OCBjczc4WzNdID0geyAweGY2LCAweDBkLCAweDAwIH07CisJc3RhdGljIGNvbnN0IHU4IGNzNzZbMl0gPSB7IDB4YTMsIDB4ZmIgfTsKKwlzdGF0aWMgY29uc3QgdTggY3M3YlszXSA9IHsgMHhjMCwgMHgxMSwgMHgwMCB9OworCXN0YXRpYyBjb25zdCB1OCBjczE1OFs4XSA9IHsKKwkJMHg4OCwgMHhhYSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorCX07CisJc3RhdGljIGNvbnN0IHU4IGNzMTYwWzhdID0geworCQkweDQ0LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCisJfTsKKwlzdGF0aWMgY29uc3QgdTggY3MxNjhbOF0gPSB7CisJCTB4NDgsIDB4NzgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczEyOFszICogOF0gPSB7CisJCTB4OTAsIDB4MjgsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4NzcsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4NzcsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczE0OFsyICogOF0gPSB7CisJCTB4NTUsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczMxYVs4ICogNF0gPSB7CisJCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczMzYVs4ICogNF0gPSB7CisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczQ1YVs4ICogMl0gPSB7CisJCTB4MDAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczE3MFs3ICogOF0gPSB7CisJCTB4NTQsIDB4MzIsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4NTQsIDB4NDMsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MGEsIDB4MDUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4NDQsIDB4MzQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MTAsIDB4MGEsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MTEsIDB4MGMsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDUsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczFhOFszICogOF0gPSB7CisJCTB4ZjAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczEwMFsyICogOF0gPSB7CisJCTB4YzQsIDB4MDQsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4YzQsIDB4MDQsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCisJLyogVkdBIGVuYWJsZSAqLworCXJlZyA9IGluU0lTUkVHKFNJU1ZHQUVOQUJMRSkgfCAweDAxOworCW91dFNJU1JFRyhTSVNWR0FFTkFCTEUsIHJlZyk7CisKKwkvKiBNaXNjICovCisJcmVnID0gaW5TSVNSRUcoU0lTTUlTQ1IpIHwgMHgwMTsKKwlvdXRTSVNSRUcoU0lTTUlTQ1csIHJlZyk7CisKKwkvKiBVbmxvY2sgU1IgKi8KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MDUsIDB4ODYpOworCWluU0lTSURYUkVHKFNJU1NSLCAweDA1LCByZWcpOworCWlmKHJlZyAhPSAweGExKQorCQlyZXR1cm4gMDsKKworCS8qIENsZWFyIHNvbWUgcmVncyAqLworCWZvcihpID0gMDsgaSA8IDB4MjI7IGkrKykgeworCQlpZigweDA2ICsgaSA9PSAweDIwKSBjb250aW51ZTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDA2ICsgaSwgMHgwMCk7CisJfQorCWZvcihpID0gMDsgaSA8IDB4MGI7IGkrKykgeworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MzEgKyBpLCAweDAwKTsKKwl9CisJZm9yKGkgPSAwOyBpIDwgMHgxMDsgaSsrKSB7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHgzMCArIGksIDB4MDApOworCX0KKworCXB0ciA9IGNzNzg7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXB0ciA9IChjb25zdCB1OCAqKSZiaW9zWzB4NzhdOworCX0KKwlmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDIzICsgaSwgcHRyW2ldKTsKKwl9CisKKwlwdHIgPSBjczc2OworCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQlwdHIgPSAoY29uc3QgdTggKikmYmlvc1sweDc2XTsKKwl9CisJZm9yKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyMSArIGksIHB0cltpXSk7CisJfQorCisJdjEgPSAweDE4OyB2MiA9IDB4MDA7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXYxID0gYmlvc1sweDc0XTsKKwkJdjIgPSBiaW9zWzB4NzVdOworCX0KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MDcsIHYxKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTEsIDB4MGYpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxZiwgdjIpOworCS8qIFBDSSBsaW5lYXIgbW9kZSwgUmVsSU8gZW5hYmxlZCwgQTAwMDAgZGVjb2RpbmcgZGlzYWJsZWQgKi8KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MjAsIDB4ODAgfCAweDIwIHwgMHgwNCk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDI3LCAweDc0KTsKKworCXB0ciA9IGNzN2I7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXB0ciA9IChjb25zdCB1OCAqKSZiaW9zWzB4N2JdOworCX0KKwlmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDMxICsgaSwgcHRyW2ldKTsKKwl9CisKKwlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSB7CisJCWlmKGl2aWRlby0+cmV2aXNpb25faWQgPT0gMikgeworCQkJc2V0U0lTSURYUkVHKFNJU1NSLCAweDNiLCAweDNmLCAweGMwKTsKKwkJfQorCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4N2QsIDB4ZmUpOworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4N2UsIDB4MGYpOworCX0KKwlpZihpdmlkZW8tPnJldmlzaW9uX2lkID09IDApIHsJLyogNDAgKmFuZCogMjA/ICovCisJCWFuZFNJU0lEWFJFRyhTSVNDUiwgMHg1OCwgMHhkNyk7CisJCWluU0lTSURYUkVHKFNJU0NSLCAweGNiLCByZWcpOworCQlpZihyZWcgJiAweDIwKSB7CisJCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NTgsIDB4ZDcsIChyZWcgJiAweDEwKSA/IDB4MDggOiAweDIwKTsgLyogPTB4MjggWjcgPyAqLworCQl9CisJfQorCisJcmVnID0gKGl2aWRlby0+Y2hpcCA9PSBYR0lfNDApID8gMHgyMCA6IDB4MDA7CisJc2V0U0lTSURYUkVHKFNJU0NSLCAweDM4LCAweDFmLCByZWcpOworCisJaWYoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgeworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MzYsIDB4NzApOworCX0gZWxzZSB7CisJCW91dFNJU0lEWFJFRyhTSVNWSUQsIDB4MDAsIDB4ODYpOworCQlvdXRTSVNJRFhSRUcoU0lTVklELCAweDMyLCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1ZJRCwgMHgzMCwgMHgwMCk7CisJCW91dFNJU0lEWFJFRyhTSVNWSUQsIDB4MzIsIDB4MDEpOworCQlvdXRTSVNJRFhSRUcoU0lTVklELCAweDMwLCAweDAwKTsKKwkJYW5kU0lTSURYUkVHKFNJU1ZJRCwgMHgyZiwgMHhkZik7CisJCWFuZFNJU0lEWFJFRyhTSVNDQVAsIDB4MDAsIDB4M2YpOworCisJCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgyZiwgMHgwMSk7CisJCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgwMCwgMHgwMCk7CisJCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgwMiwgYmlvc1sweDdlXSk7CisJCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgyZSwgMHgwOCk7CisJCWFuZFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgzNSwgMHg3Zik7CisJCWFuZFNJU0lEWFJFRyhTSVNQQVJUMSwgMHg1MCwgMHhmZSk7CisKKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDQsIDB4MDAsIHJlZyk7CisJCWlmKHJlZyA9PSAxIHx8IHJlZyA9PSAyKSB7CisJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MDAsIDB4MWMpOworCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQ0LCAweDBkLCBiaW9zWzB4N2ZdKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNQQVJUNCwgMHgwZSwgYmlvc1sweDgwXSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDQsIDB4MTAsIGJpb3NbMHg4MV0pOworCQkJYW5kU0lTSURYUkVHKFNJU1BBUlQ0LCAweDBmLCAweDNmKTsKKworCQkJaW5TSVNJRFhSRUcoU0lTUEFSVDQsIDB4MDEsIHJlZyk7CisJCQlpZigocmVnICYgMHhmMCkgPj0gMHhiMCkgeworCQkJCWluU0lTSURYUkVHKFNJU1BBUlQ0LCAweDIzLCByZWcpOworCQkJCWlmKHJlZyAmIDB4MjApIHJlZyB8PSAweDQwOworCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUNCwgMHgyMywgcmVnKTsKKwkJCQlyZWcgPSAocmVnICYgMHgyMCkgPyAweDAyIDogMHgwMDsKKwkJCQlzZXRTSVNJRFhSRUcoU0lTUEFSVDEsIDB4MWUsIDB4ZmQsIHJlZyk7CisJCQl9CisJCX0KKworCQl2MSA9IGJpb3NbMHg3N107CisKKwkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4M2IsIHJlZyk7CisJCWlmKHJlZyAmIDB4MDIpIHsKKwkJCWluU0lTSURYUkVHKFNJU1NSLCAweDNhLCByZWcpOworCQkJdjIgPSAocmVnICYgMHgzMCkgPj4gMzsKKwkJCWlmKCEodjIgJiAweDA0KSkgdjIgXj0gMHgwMjsKKwkJCWluU0lTSURYUkVHKFNJU1NSLCAweDM5LCByZWcpOworCQkJaWYocmVnICYgMHg4MCkgdjIgfD0gMHg4MDsKKwkJCXYyIHw9IDB4MDE7CisKKwkJCWlmKChteXBkZXYgPSBTSVNfUENJX0dFVF9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TSSwgMHgwNzMwLCBOVUxMKSkpIHsKKwkJCQlTSVNfUENJX1BVVF9ERVZJQ0UobXlwZGV2KTsKKwkJCQlpZigoKHYyICYgMHgwNikgPT0gMikgfHwgKCh2MiAmIDB4MDYpID09IDQpKQorCQkJCQl2MiAmPSAweGY5OworCQkJCXYyIHw9IDB4MDg7CisJCQkJdjEgJj0gMHhmZTsKKwkJCX0gZWxzZSB7CisJCQkJbXlwZGV2ID0gU0lTX1BDSV9HRVRfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIDB4MDczNSwgTlVMTCk7CisJCQkJaWYoIW15cGRldikKKwkJCQkJbXlwZGV2ID0gU0lTX1BDSV9HRVRfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIDB4MDY0NSwgTlVMTCk7CisJCQkJaWYoIW15cGRldikKKwkJCQkJbXlwZGV2ID0gU0lTX1BDSV9HRVRfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIDB4MDY1MCwgTlVMTCk7CisJCQkJaWYobXlwZGV2KSB7CisJCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChteXBkZXYsIDB4OTQsICZyZWdkKTsKKwkJCQkJcmVnZCAmPSAweGZmZmZmZWZmOworCQkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG15cGRldiwgMHg5NCwgcmVnZCk7CisJCQkJCXYxICY9IDB4ZmU7CisJCQkJCVNJU19QQ0lfUFVUX0RFVklDRShteXBkZXYpOworCQkJCX0gZWxzZSBpZihzaXNmYl9maW5kX2hvc3RfYnJpZGdlKGl2aWRlbywgcGRldiwgUENJX1ZFTkRPUl9JRF9TSSkpIHsKKwkJCQkJdjEgJj0gMHhmZTsKKwkJCQl9IGVsc2UgaWYoc2lzZmJfZmluZF9ob3N0X2JyaWRnZShpdmlkZW8sIHBkZXYsIDB4MTEwNikgfHwKKwkJCQkJICBzaXNmYl9maW5kX2hvc3RfYnJpZGdlKGl2aWRlbywgcGRldiwgMHgxMDIyKSB8fAorCQkJCQkgIHNpc2ZiX2ZpbmRfaG9zdF9icmlkZ2UoaXZpZGVvLCBwZGV2LCAweDcwMGUpIHx8CisJCQkJCSAgc2lzZmJfZmluZF9ob3N0X2JyaWRnZShpdmlkZW8sIHBkZXYsIDB4MTBkZSkpIHsKKwkJCQkJaWYoKHYyICYgMHgwNikgPT0gNCkKKwkJCQkJCXYyIF49IDB4MDY7CisJCQkJCXYyIHw9IDB4MDg7CisJCQkJfQorCQkJfQorCQkJc2V0U0lTSURYUkVHKFNJU0NSLCAweDVmLCAweGYwLCB2Mik7CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDIyLCB2MSk7CisKKwkJaWYoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSB7CisJCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgzYiwgdjEpOworCQkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4M2EsIHYyKTsKKwkJCXJlZ2QgPSBiaW9zWzB4OTAgKyAzXSB8IChiaW9zWzB4OTAgKyA0XSA8PCA4KTsKKwkJCWlmKCAoISh2MSAmIDB4MDIpKSAmJiAodjIgJiAweDMwKSAmJiAocmVnZCA8IDB4Y2YpICkKKwkJCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NWYsIDB4ZjEsIDB4MDEpOworCisJCQlpZigobXlwZGV2ID0gU0lTX1BDSV9HRVRfREVWSUNFKDB4MTBkZSwgMHgwMWUwLCBOVUxMKSkpIHsKKwkJCQkvKiBUT0RPOiBzZXQgQ1I1ZiAmMHhmMSB8IDB4MDEgZm9yIHZlcnNpb24gNjU3MAorCQkJCSAqIG9mIG5mb3JjZSAyIFJPTQorCQkJCSAqLworCQkJCWlmKDApCisJCQkJCXNldFNJU0lEWFJFRyhTSVNDUiwgMHg1ZiwgMHhmMSwgMHgwMSk7CisJCQkJU0lTX1BDSV9QVVRfREVWSUNFKG15cGRldik7CisJCQl9CisJCX0KKworCQl2MSA9IDB4MzA7CisJCWluU0lTSURYUkVHKFNJU1NSLCAweDNiLCByZWcpOworCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg1ZiwgdjIpOworCQlpZigoIShyZWcgJiAweDAyKSkgJiYgKHYyICYgMHgwZSkpCisJCQl2MSB8PSAweDA4OworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MjcsIHYxKTsKKworCQlpZihiaW9zWzB4NjRdICYgMHgwMSkgeworCQkJc2V0U0lTSURYUkVHKFNJU0NSLCAweDVmLCAweGYwLCBiaW9zWzB4NjRdKTsKKwkJfQorCisJCXYxID0gYmlvc1sweDRmN107CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCAmcmVnZCk7CisJCXJlZ2QgPSAocmVnZCA+PiAyMCkgJiAweDBmOworCQlpZihyZWdkID09IDEpIHsKKwkJCXYxICY9IDB4ZmM7CisJCQlvclNJU0lEWFJFRyhTSVNDUiwgMHg1ZiwgMHgwOCk7CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDQ4LCB2MSk7CisKKwkJc2V0U0lTSURYUkVHKFNJU0NSLCAweDQ3LCAweDA0LCBiaW9zWzB4NGY2XSAmIDB4ZmIpOworCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NDksIDB4ZjAsIGJpb3NbMHg0ZjhdICYgMHgwZik7CisJCXNldFNJU0lEWFJFRyhTSVNDUiwgMHg0YSwgMHg2MCwgYmlvc1sweDRmOV0gJiAweDlmKTsKKwkJc2V0U0lTSURYUkVHKFNJU0NSLCAweDRiLCAweDA4LCBiaW9zWzB4NGZhXSAmIDB4ZjcpOworCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NGMsIDB4ODAsIGJpb3NbMHg0ZmJdICYgMHg3Zik7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg3MCwgYmlvc1sweDRmY10pOworCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NzEsIDB4ZjAsIGJpb3NbMHg0ZmRdICYgMHgwZik7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg3NCwgMHhkMCk7CisJCXNldFNJU0lEWFJFRyhTSVNDUiwgMHg3NCwgMHhjZiwgYmlvc1sweDRmZV0gJiAweDMwKTsKKwkJc2V0U0lTSURYUkVHKFNJU0NSLCAweDc1LCAweGUwLCBiaW9zWzB4NGZmXSAmIDB4MWYpOworCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NzYsIDB4ZTAsIGJpb3NbMHg1MDBdICYgMHgxZik7CisJCXYxID0gYmlvc1sweDUwMV07CisJCWlmKChteXBkZXYgPSBTSVNfUENJX0dFVF9ERVZJQ0UoMHg4MDg2LCAweDI1MzAsIE5VTEwpKSkgeworCQkJdjEgPSAweGYwOworCQkJU0lTX1BDSV9QVVRfREVWSUNFKG15cGRldik7CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDc3LCB2MSk7CisJfQorCisJLyogUkFNIHR5cGUgKi8KKworCXJlZ2IgPSAwOwkvKiAhICovCisKKwl2MSA9IDB4ZmY7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXYxID0gYmlvc1sweDE0MCArIHJlZ2JdOworCX0KKwlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4NmQsIHYxKTsKKworCXB0ciA9IGNzMTI4OworCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQlwdHIgPSAoY29uc3QgdTggKikmYmlvc1sweDEyOF07CisJfQorCWZvcihpID0gMCwgaiA9IDA7IGkgPCAzOyBpKyssIGogKz0gOCkgeworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4NjggKyBpLCBwdHJbaiArIHJlZ2JdKTsKKwl9CisKKwlwdHIgID0gY3MzMWE7CisJcHRyMiA9IGNzMzNhOworCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQlpbmRleCA9IChpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSA/IDB4MzFhIDogMHgzYTY7CisJCXB0ciAgPSAoY29uc3QgdTggKikmYmlvc1tpbmRleF07CisJCXB0cjIgPSAoY29uc3QgdTggKikmYmlvc1tpbmRleCArIDB4MjBdOworCX0KKwlmb3IoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaWYoaSA9PSAwKSB7CisJCQlyZWdkID0gbGUzMl90b19jcHUoKCh1MzIgKilwdHIpW3JlZ2JdKTsKKwkJCXJlZ2EgPSAweDZiOworCQl9IGVsc2UgeworCQkJcmVnZCA9IGxlMzJfdG9fY3B1KCgodTMyICopcHRyMilbcmVnYl0pOworCQkJcmVnYSA9IDB4NmU7CisJCX0KKwkJcmVnID0gMHgwMDsKKwkJZm9yKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJcmVnICY9IDB4ZjM7CisJCQlpZihyZWdkICYgMHgwMSkgcmVnIHw9IDB4MDQ7CisJCQlpZihyZWdkICYgMHgwMikgcmVnIHw9IDB4MDg7CisJCQlyZWdkID4+PSAyOworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCByZWdhLCByZWcpOworCQkJaW5TSVNJRFhSRUcoU0lTQ1IsIHJlZ2EsIHJlZyk7CisJCQlpblNJU0lEWFJFRyhTSVNDUiwgcmVnYSwgcmVnKTsKKwkJCXJlZyArPSAweDEwOworCQl9CisJfQorCisJYW5kU0lTSURYUkVHKFNJU0NSLCAweDZlLCAweGZjKTsKKworCXB0ciAgPSBOVUxMOworCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQlpbmRleCA9IChpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSA/IDB4MzVhIDogMHgzZTY7CisJCXB0ciAgPSAoY29uc3QgdTggKikmYmlvc1tpbmRleF07CisJfQorCWZvcihpID0gMDsgaSA8IDQ7IGkrKykgeworCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NmUsIDB4ZmMsIGkpOworCQlyZWcgPSAweDAwOworCQlmb3IoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCXJlZ2QgPSAwOworCQkJaWYocHRyKSB7CisJCQkJcmVnZCA9IGxlMzJfdG9fY3B1KCgodTMyICopcHRyKVtyZWdiICogOF0pOworCQkJCXB0ciArPSA0OworCQkJfQorCQkJLyogcmVnID0gMHgwMDsgKi8KKwkJCWZvcihrID0gMDsgayA8IDE2OyBrKyspIHsKKwkJCQlyZWcgJj0gMHhmYzsKKwkJCQlpZihyZWdkICYgMHgwMSkgcmVnIHw9IDB4MDE7CisJCQkJaWYocmVnZCAmIDB4MDIpIHJlZyB8PSAweDAyOworCQkJCXJlZ2QgPj49IDI7CisJCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDZmLCByZWcpOworCQkJCWluU0lTSURYUkVHKFNJU0NSLCAweDZmLCByZWcpOworCQkJCWluU0lTSURYUkVHKFNJU0NSLCAweDZmLCByZWcpOworCQkJCXJlZyArPSAweDA4OworCQkJfQorCQl9CisJfQorCisJcHRyICA9IGNzMTQ4OworCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQlwdHIgID0gKGNvbnN0IHU4ICopJmJpb3NbMHgxNDhdOworCX0KKwlmb3IoaSA9IDAsIGogPSAwOyBpIDwgMjsgaSsrLCBqICs9IDgpIHsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDgwICsgaSwgcHRyW2ogKyByZWdiXSk7CisJfQorCisJYW5kU0lTSURYUkVHKFNJU0NSLCAweDg5LCAweDhmKTsKKworCXB0ciAgPSBjczQ1YTsKKwlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJaW5kZXggPSAoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgPyAweDQ1YSA6IDB4NGU2OworCQlwdHIgID0gKGNvbnN0IHU4ICopJmJpb3NbaW5kZXhdOworCX0KKwlyZWdkID0gbGUxNl90b19jcHUoKChjb25zdCB1MTYgKilwdHIpW3JlZ2JdKTsKKwlyZWcgPSAweDgwOworCWZvcihpID0gMDsgaSA8IDU7IGkrKykgeworCQlyZWcgJj0gMHhmYzsKKwkJaWYocmVnZCAmIDB4MDEpIHJlZyB8PSAweDAxOworCQlpZihyZWdkICYgMHgwMikgcmVnIHw9IDB4MDI7CisJCXJlZ2QgPj49IDI7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4OSwgcmVnKTsKKwkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4ODksIHJlZyk7CisJCWluU0lTSURYUkVHKFNJU0NSLCAweDg5LCByZWcpOworCQlyZWcgKz0gMHgxMDsKKwl9CisKKwl2MSA9IDB4YjU7IHYyID0gMHgyMDsgdjMgPSAweGYwOyB2NCA9IDB4MTM7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXYxID0gYmlvc1sweDExOCArIHJlZ2JdOworCQl2MiA9IGJpb3NbMHhmOCArIHJlZ2JdOworCQl2MyA9IGJpb3NbMHgxMjAgKyByZWdiXTsKKwkJdjQgPSBiaW9zWzB4MWNhXTsKKwl9CisJb3V0U0lTSURYUkVHKFNJU0NSLCAweDQ1LCB2MSAmIDB4MGYpOworCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg5OSwgKHYxID4+IDQpICYgMHgwNyk7CisJb3JTSVNJRFhSRUcoU0lTQ1IsIDB4NDAsIHYxICYgMHg4MCk7CisJb3V0U0lTSURYUkVHKFNJU0NSLCAweDQxLCB2Mik7CisKKwlwdHIgID0gY3MxNzA7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXB0ciAgPSAoY29uc3QgdTggKikmYmlvc1sweDE3MF07CisJfQorCWZvcihpID0gMCwgaiA9IDA7IGkgPCA3OyBpKyssIGogKz0gOCkgeworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4OTAgKyBpLCBwdHJbaiArIHJlZ2JdKTsKKwl9CisKKwlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4NTksIHYzKTsKKworCXB0ciAgPSBjczFhODsKKwlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJcHRyICA9IChjb25zdCB1OCAqKSZiaW9zWzB4MWE4XTsKKwl9CisJZm9yKGkgPSAwLCBqID0gMDsgaSA8IDM7IGkrKywgaiArPSA4KSB7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHhjMyArIGksIHB0cltqICsgcmVnYl0pOworCX0KKworCXB0ciAgPSBjczEwMDsKKwlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJcHRyICA9IChjb25zdCB1OCAqKSZiaW9zWzB4MTAwXTsKKwl9CisJZm9yKGkgPSAwLCBqID0gMDsgaSA8IDI7IGkrKywgaiArPSA4KSB7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4YSArIGksIHB0cltqICsgcmVnYl0pOworCX0KKworCW91dFNJU0lEWFJFRyhTSVNDUiwgMHhjZiwgdjQpOworCisJb3V0U0lTSURYUkVHKFNJU0NSLCAweDgzLCAweDA5KTsKKwlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODcsIDB4MDApOworCisJaWYoaXZpZGVvLT5jaGlwID09IFhHSV80MCkgeworCQlpZiggKGl2aWRlby0+cmV2aXNpb25faWQgPT0gMSkgfHwKKwkJICAgIChpdmlkZW8tPnJldmlzaW9uX2lkID09IDIpICkgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDhjLCAweDg3KTsKKwkJfQorCX0KKworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNywgMHgwMCk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFhLCAweDg3KTsKKworCWlmKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApIHsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE1LCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFjLCAweDAwKTsKKwl9CisKKwlyYW10eXBlID0gMHgwMDsgdjEgPSAweDEwOworCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQlyYW10eXBlID0gYmlvc1sweDYyXTsKKwkJdjEgPSBiaW9zWzB4MWQyXTsKKwl9CisJaWYoIShyYW10eXBlICYgMHg4MCkpIHsKKwkJaWYoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDk3LCB2MSk7CisJCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg5NywgcmVnKTsKKwkJCWlmKHJlZyAmIDB4MTApIHsKKwkJCQlyYW10eXBlID0gKHJlZyAmIDB4MDEpIDw8IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgzOSwgcmVnKTsKKwkJCXJhbXR5cGUgPSByZWcgJiAweDAyOworCQkJaWYoIShyYW10eXBlKSkgeworCQkJCWluU0lTSURYUkVHKFNJU1NSLCAweDNhLCByZWcpOworCQkJCXJhbXR5cGUgPSAocmVnID4+IDEpICYgMHgwMTsKKwkJCX0KKwkJfQorCX0KKwlyYW10eXBlICY9IDB4MDc7CisKKwlyZWdiID0gMDsJLyogISAqLworCisJc3dpdGNoKHJhbXR5cGUpIHsKKwljYXNlIDA6CisJCXNpc2ZiX3Bvc3RfeGdpX3NldGNsb2NrcyhpdmlkZW8sIHJlZ2IpOworCQlpZigoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgfHwKKwkJICAgKGl2aWRlby0+cmV2aXNpb25faWQgPT0gMSkgICB8fAorCQkgICAoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSkgeworCQkJdjEgPSBjczE1OFtyZWdiXTsgdjIgPSBjczE2MFtyZWdiXTsgdjMgPSBjczE2OFtyZWdiXTsKKwkJCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQkJCXYxID0gYmlvc1tyZWdiICsgMHgxNThdOworCQkJCXYyID0gYmlvc1tyZWdiICsgMHgxNjBdOworCQkJCXYzID0gYmlvc1tyZWdiICsgMHgxNjhdOworCQkJfQorCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDgyLCB2MSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIHYyKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgdjMpOworCQl9IGVsc2UgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDgyLCAweDg4KTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgMHgwMCk7CisJCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgcmVnKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgMHg4OCk7CisJCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgcmVnKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgYmlvc1tyZWdiICsgMHgxNjhdKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4MiwgMHg3Nyk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIDB4MDApOworCQkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIHJlZyk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIDB4ODgpOworCQkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIHJlZyk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIGJpb3NbcmVnYiArIDB4MTYwXSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODIsIGJpb3NbcmVnYiArIDB4MTU4XSk7CisJCX0KKwkJaWYoaXZpZGVvLT5jaGlwID09IFhHSV80MCkgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDk3LCAweDAwKTsKKwkJfQorCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4OTgsIDB4MDEpOworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4OWEsIDB4MDIpOworCisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxOCwgMHgwMSk7CisJCWlmKChpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSB8fAorCQkgICAoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSkgeworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDQwKTsKKwkJfSBlbHNlIHsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxOSwgMHgyMCk7CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDgwKTsKKwkJaWYoKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApIHx8IChiaW9zWzB4MWNiXSAhPSAweDBjKSkgeworCQkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDQzKTsKKwkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMHg0Myk7CisJCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDB4NDMpOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCAweDAwKTsKKwkJCWlmKChpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSB8fAorCQkJICAgKGl2aWRlby0+cmV2aXNpb25faWQgPT0gMikpIHsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTksIDB4NDApOworCQkJfSBlbHNlIHsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTksIDB4MjApOworCQkJfQorCQl9IGVsc2UgaWYoKGl2aWRlby0+Y2hpcCA9PSBYR0lfNDApICYmIChiaW9zWzB4MWNiXSA9PSAweDBjKSkgeworCQkJLyogb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDBjKTsgKi8gLyogPyAqLworCQl9CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgMHgwMCk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgMHg4MCk7CisJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgNCk7CisJCXYxID0gMHgzMTsgdjIgPSAweDAzOyB2MyA9IDB4ODM7IHY0ID0gMHgwMzsgdjUgPSAweDgzOworCQlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJCXYxID0gYmlvc1sweGYwXTsKKwkJCWluZGV4ID0gKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApID8gMHg0YjIgOiAweDUzZTsKKwkJCXYyID0gYmlvc1tpbmRleF07CisJCQl2MyA9IGJpb3NbaW5kZXggKyAxXTsKKwkJCXY0ID0gYmlvc1tpbmRleCArIDJdOworCQkJdjUgPSBiaW9zW2luZGV4ICsgM107CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCB2MSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxOSwgKChpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSA/IDB4MDIgOiAweDAxKSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgdjIpOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIHYzKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDQzKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFiLCAweDAzKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDIyKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCB2MSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxOSwgMHgwMCk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgdjQpOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIHY1KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFiLCAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODIsIDB4NzcpOworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODYsIDB4MDApOworCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgcmVnKTsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg2LCAweDg4KTsKKwkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4ODYsIHJlZyk7CisJCXYxID0gY3MxNjhbcmVnYl07IHYyID0gY3MxNjBbcmVnYl07IHYzID0gY3MxNThbcmVnYl07CisJCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQkJdjEgPSBiaW9zW3JlZ2IgKyAweDE2OF07CisJCQl2MiA9IGJpb3NbcmVnYiArIDB4MTYwXTsKKwkJCXYzID0gYmlvc1tyZWdiICsgMHgxNThdOworCQl9CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgdjEpOworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODIsIDB4NzcpOworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIDB4MDApOworCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg4NSwgcmVnKTsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg1LCAweDg4KTsKKwkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIHJlZyk7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NSwgdjIpOworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODIsIHYzKTsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDk4LCAweDAxKTsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDlhLCAweDAyKTsKKworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MjgsIDB4NjQpOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MjksIDB4NjMpOworCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDE1KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDIwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDgwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCAweGM1KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDIzKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDgwKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDk3LDB4MTEpOworCQlzaXNmYl9wb3N0X3hnaV9zZXRjbG9ja3MoaXZpZGVvLCByZWdiKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDQ2KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCAweGM1KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDIzKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDgwKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFiLCAweDA0KTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFiLCAweDAwKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJdjEgPSAweDMxOworCQlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJCXYxID0gYmlvc1sweGYwXTsKKwkJfQorCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTgsIHYxKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDA2KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDA0KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDg0KTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2lzZmJfcG9zdF94Z2lfc2V0Y2xvY2tzKGl2aWRlbywgcmVnYik7CisJCWlmKChpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSAmJgorCQkgICAoKGl2aWRlby0+cmV2aXNpb25faWQgPT0gMSkgfHwKKwkJICAgIChpdmlkZW8tPnJldmlzaW9uX2lkID09IDIpKSkgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDgyLCBiaW9zW3JlZ2IgKyAweDE1OF0pOworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg1LCBiaW9zW3JlZ2IgKyAweDE2MF0pOworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg2LCBiaW9zW3JlZ2IgKyAweDE2OF0pOworCQl9IGVsc2UgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDgyLCAweDg4KTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgMHgwMCk7CisJCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgcmVnKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgMHg4OCk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODIsIDB4NzcpOworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg1LCAweDAwKTsKKwkJCWluU0lTSURYUkVHKFNJU0NSLCAweDg1LCByZWcpOworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg1LCAweDg4KTsKKwkJCWluU0lTSURYUkVHKFNJU0NSLCAweDg1LCByZWcpOworCQkJdjEgPSBjczE2MFtyZWdiXTsgdjIgPSBjczE1OFtyZWdiXTsKKwkJCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQkJCXYxID0gYmlvc1tyZWdiICsgMHgxNjBdOworCQkJCXYyID0gYmlvc1tyZWdiICsgMHgxNThdOworCQkJfQorCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg1LCB2MSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODIsIHYyKTsKKwkJfQorCQlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSB7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4OTcsIDB4MTEpOworCQl9CisJCWlmKChpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSAmJiAoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSkgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDk4LCAweDAxKTsKKwkJfSBlbHNlIHsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg5OCwgMHgwMyk7CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDlhLCAweDAyKTsKKworCQlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSB7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTgsIDB4MDEpOworCQl9IGVsc2UgeworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCAweDAwKTsKKwkJfQorCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTksIDB4NDApOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIDB4MDApOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIDB4ODApOworCQlpZigoaXZpZGVvLT5jaGlwID09IFhHSV80MCkgJiYgKGJpb3NbMHgxY2JdICE9IDB4MGMpKSB7CisJCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDB4NDMpOworCQkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDQzKTsKKwkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMHg0Myk7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTgsIDB4MDApOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDQwKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgMHgwMCk7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIDB4ODApOworCQl9CisJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgNCk7CisJCXYxID0gMHgzMTsKKwkJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCQl2MSA9IGJpb3NbMHhmMF07CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCB2MSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxOSwgMHgwMSk7CisJCWlmKGl2aWRlby0+Y2hpcCA9PSBYR0lfNDApIHsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgYmlvc1sweDUzZV0pOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCBiaW9zWzB4NTNmXSk7CisJCX0gZWxzZSB7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIDB4MDUpOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDg1KTsKKwkJfQorCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDB4NDMpOworCQlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSB7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MWIsIDB4MDEpOworCQl9IGVsc2UgeworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFiLCAweDAzKTsKKwkJfQorCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDB4MjIpOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTgsIHYxKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDAwKTsKKwkJaWYoaXZpZGVvLT5jaGlwID09IFhHSV80MCkgeworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCBiaW9zWzB4NTQwXSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIGJpb3NbMHg1NDFdKTsKKwkJfSBlbHNlIHsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgMHgwNSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIDB4ODUpOworCQl9CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxYiwgMHgwMCk7CisJfQorCisJcmVnYiA9IDA7CS8qICEgKi8KKwl2MSA9IDB4MDM7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXYxID0gYmlvc1sweDExMCArIHJlZ2JdOworCX0KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MWIsIHYxKTsKKworCS8qIFJBTSBzaXplICovCisJdjEgPSAweDAwOyB2MiA9IDB4MDA7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXYxID0gYmlvc1sweDYyXTsKKwkJdjIgPSBiaW9zWzB4NjNdOworCX0KKwlyZWdiID0gMDsJLyogISAqLworCXJlZ2QgPSAxIDw8IHJlZ2I7CisJaWYoKHYxICYgMHg0MCkgJiYgKHYyICYgcmVnZCkgJiYgaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCBiaW9zW3JlZ2IgKyAweGUwXSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgYmlvc1tyZWdiICsgMHhlMCArIDhdKTsKKworCX0gZWxzZSB7CisKKwkJLyogU2V0IGRlZmF1bHQgbW9kZSwgZG9uJ3QgY2xlYXIgc2NyZWVuICovCisJCWl2aWRlby0+U2lTX1ByLlNpU19Vc2VPRU0gPSBGQUxTRTsKKwkJU2lTX1NldEVuYWJsZURzdG4oJml2aWRlby0+U2lTX1ByLCBGQUxTRSk7CisJCVNpU19TZXRFbmFibGVGc3RuKCZpdmlkZW8tPlNpU19QciwgRkFMU0UpOworCQlpdmlkZW8tPmN1ckZTVE4gPSBpdmlkZW8tPmN1ckRTVE4gPSAwOworCQlpdmlkZW8tPlNpU19Qci5WaWRlb01lbW9yeVNpemUgPSA4IDw8IDIwOworCQlTaVNTZXRNb2RlKCZpdmlkZW8tPlNpU19QciwgMHgyZSB8IDB4ODApOworCisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgMHg4Nik7CisKKwkJLyogRGlzYWJsZSByZWFkLWNhY2hlICovCisJCWFuZFNJU0lEWFJFRyhTSVNTUiwgMHgyMSwgMHhkZik7CisJCXNpc2ZiX3Bvc3RfeGdpX3JhbXNpemUoaXZpZGVvKTsKKwkJLyogRW5hYmxlIHJlYWQtY2FjaGUgKi8KKwkJb3JTSVNJRFhSRUcoU0lTU1IsIDB4MjEsIDB4MjApOworCisJfQorCisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICItLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJZm9yKGkgPSAwOyBpIDwgMHhmZjsgaSsrKSB7CisJCWluU0lTSURYUkVHKFNJU0NSLCBpLCByZWcpOworCQlwcmludGsoS0VSTl9ERUJVRyAiQ1IlMDJ4KCV4KSA9IDB4JTAyeFxuIiwgaSwgU0lTQ1IsIHJlZyk7CisJfQorCWZvcihpID0gMDsgaSA8IDB4NDA7IGkrKykgeworCQlpblNJU0lEWFJFRyhTSVNTUiwgaSwgcmVnKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlNSJTAyeCgleCkgPSAweCUwMnhcbiIsIGksIFNJU1NSLCByZWcpOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworI2VuZGlmCisKKwkvKiBTZW5zZSBDUlQxICovCisJaWYoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgeworCQlvclNJU0lEWFJFRyhTSVNDUiwgMHgzMiwgMHgyMCk7CisJfSBlbHNlIHsKKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDQsIDB4MDAsIHJlZyk7CisJCWlmKChyZWcgPT0gMSkgfHwgKHJlZyA9PSAyKSkgeworCQkJc2lzZmJfc2Vuc2VfY3J0MShpdmlkZW8pOworCQl9IGVsc2UgeworCQkJb3JTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIDB4MjApOworCQl9CisJfQorCisJLyogU2V0IGRlZmF1bHQgbW9kZSwgZG9uJ3QgY2xlYXIgc2NyZWVuICovCisJaXZpZGVvLT5TaVNfUHIuU2lTX1VzZU9FTSA9IEZBTFNFOworCVNpU19TZXRFbmFibGVEc3RuKCZpdmlkZW8tPlNpU19QciwgRkFMU0UpOworCVNpU19TZXRFbmFibGVGc3RuKCZpdmlkZW8tPlNpU19QciwgRkFMU0UpOworCWl2aWRlby0+Y3VyRlNUTiA9IGl2aWRlby0+Y3VyRFNUTiA9IDA7CisJU2lTU2V0TW9kZSgmaXZpZGVvLT5TaVNfUHIsIDB4MmUgfCAweDgwKTsKKworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgMHg4Nik7CisKKwkvKiBEaXNwbGF5IG9mZiAqLworCW9yU0lTSURYUkVHKFNJU1NSLCAweDAxLCAweDIwKTsKKworCS8qIFNhdmUgbW9kZSBudW1iZXIgaW4gQ1IzNCAqLworCW91dFNJU0lEWFJFRyhTSVNDUiwgMHgzNCwgMHgyZSk7CisKKwkvKiBMZXQgZXZlcnlvbmUga25vdyB3aGF0IHRoZSBjdXJyZW50IG1vZGUgaXMgKi8KKwlpdmlkZW8tPm1vZGVwcmVjaGFuZ2UgPSAweDJlOworCisJaWYoaXZpZGVvLT5jaGlwID09IFhHSV80MCkgeworCQlpblNJU0lEWFJFRyhTSVNDUiwgMHhjYSwgcmVnKTsKKwkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4Y2MsIHYxKTsKKwkJaWYoKHJlZyAmIDB4MTApICYmICghKHYxICYgMHgwNCkpKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkic2lzZmI6IFBsZWFzZSBjb25uZWN0IHBvd2VyIHRvIHRoZSBjYXJkLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzaXNmYl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3Qgc2lzZmJfY2hpcF9pbmZvCSpjaGlwaW5mbyA9ICZzaXNmYl9jaGlwX2luZm9bZW50LT5kcml2ZXJfZGF0YV07CisJc3RydWN0IHNpc192aWRlb19pbmZvCSppdmlkZW8gPSBOVUxMOworCXN0cnVjdCBmYl9pbmZvCQkqc2lzX2ZiX2luZm8gPSBOVUxMOwogCXUxNiByZWcxNjsKIAl1OCAgcmVnOwotCWludCBzaXN2Z2FfZW5hYmxlZCA9IDAsIGk7CisJaW50IGksIHJldDsKIAotCWlmKHNpc2ZiX29mZikgcmV0dXJuIC1FTlhJTzsKKwlpZihzaXNmYl9vZmYpCisJCXJldHVybiAtRU5YSU87CiAKICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzKSkKIAlzaXNfZmJfaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZigqaXZpZGVvKSwgJnBkZXYtPmRldik7Ci0JaWYoIXNpc19mYl9pbmZvKSByZXR1cm4gLUVOT01FTTsKKwlpZighc2lzX2ZiX2luZm8pCisJCXJldHVybiAtRU5PTUVNOwogI2Vsc2UKIAlzaXNfZmJfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpzaXNfZmJfaW5mbykgKyBzaXplb2YoKml2aWRlbyksIEdGUF9LRVJORUwpOwotCWlmKCFzaXNfZmJfaW5mbykgcmV0dXJuIC1FTk9NRU07CisJaWYoIXNpc19mYl9pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQoc2lzX2ZiX2luZm8sIDAsIHNpemVvZigqc2lzX2ZiX2luZm8pICsgc2l6ZW9mKCppdmlkZW8pKTsKIAlzaXNfZmJfaW5mby0+cGFyID0gKChjaGFyICopc2lzX2ZiX2luZm8gKyBzaXplb2YoKnNpc19mYl9pbmZvKSk7CiAjZW5kaWYKQEAgLTQ3ODcsMjcgKzU4OTAsMzQgQEAKIAlpdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopc2lzX2ZiX2luZm8tPnBhcjsKIAlpdmlkZW8tPm1lbXlzZWxmYW5kaSA9IHNpc19mYl9pbmZvOwogCisJaXZpZGVvLT5zaXNmYl9pZCA9IFNJU0ZCX0lEOworCiAJaWYoY2FyZF9saXN0ID09IE5VTEwpIHsKLQkgICBpdmlkZW8tPmNhcmRudW1iZXIgPSAwOworCQlpdmlkZW8tPmNhcmRudW1iZXIgPSAwOwogCX0gZWxzZSB7Ci0JICAgc3RydWN0IHNpc192aWRlb19pbmZvICpjb3VudHZpZGVvID0gY2FyZF9saXN0OwotCSAgIGl2aWRlby0+Y2FyZG51bWJlciA9IDE7Ci0JICAgd2hpbGUoKGNvdW50dmlkZW8gPSBjb3VudHZpZGVvLT5uZXh0KSAhPSBOVUxMKSBpdmlkZW8tPmNhcmRudW1iZXIrKzsKKwkJc3RydWN0IHNpc192aWRlb19pbmZvICpjb3VudHZpZGVvID0gY2FyZF9saXN0OworCQlpdmlkZW8tPmNhcmRudW1iZXIgPSAxOworCQl3aGlsZSgoY291bnR2aWRlbyA9IGNvdW50dmlkZW8tPm5leHQpICE9IDApCisJCQlpdmlkZW8tPmNhcmRudW1iZXIrKzsKIAl9CiAKIAlzdHJuY3B5KGl2aWRlby0+bXlpZCwgY2hpcGluZm8tPmNoaXBfbmFtZSwgMzApOwogCiAJaXZpZGVvLT53YXJuY291bnQgPSAwOwogCWl2aWRlby0+Y2hpcF9pZCA9IHBkZXYtPmRldmljZTsKKwlpdmlkZW8tPmNoaXBfdmVuZG9yID0gcGRldi0+dmVuZG9yOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJml2aWRlby0+cmV2aXNpb25faWQpOwotCWl2aWRlby0+c2lzaHdfZXh0LmpDaGlwUmV2aXNpb24gPSBpdmlkZW8tPnJldmlzaW9uX2lkOworCWl2aWRlby0+U2lTX1ByLkNoaXBSZXZpc2lvbiA9IGl2aWRlby0+cmV2aXNpb25faWQ7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZyZWcxNik7Ci0Jc2lzdmdhX2VuYWJsZWQgPSByZWcxNiAmIDB4MDE7CisJaXZpZGVvLT5zaXN2Z2FfZW5hYmxlZCA9IHJlZzE2ICYgMHgwMTsKIAlpdmlkZW8tPnBjaWJ1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOwogCWl2aWRlby0+cGNpc2xvdCA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKIAlpdmlkZW8tPnBjaWZ1bmMgPSBQQ0lfRlVOQyhwZGV2LT5kZXZmbik7CiAJaXZpZGVvLT5zdWJzeXN2ZW5kb3IgPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOwogCWl2aWRlby0+c3Vic3lzZGV2aWNlID0gcGRldi0+c3Vic3lzdGVtX2RldmljZTsKKyNpZmRlZiBTSVNfT0xEX0NPTkZJR19DT01QQVQKKwlpdmlkZW8tPmlvY3RsMzJyZWdpc3RlcmVkID0gMDsKKyNlbmRpZgogCiAjaWZuZGVmIE1PRFVMRQogCWlmKHNpc2ZiX21vZGVfaWR4ID09IC0xKSB7CkBAIC00ODI3LDYgKzU5MzcsMjQgQEAKIAogCWl2aWRlby0+c2lzZmJfdGhpc21vbml0b3IuZGF0YXZhbGlkID0gRkFMU0U7CiAKKwlpdmlkZW8tPmN1cnJlbnRfYmFzZSA9IDA7CisKKwlpdmlkZW8tPmVuZ2luZW9rID0gMDsKKworCWl2aWRlby0+c2lzZmJfd2FzX2Jvb3RfZGV2aWNlID0gMDsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxMikpCisJaWYocGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9TSEFET1cpIHsKKwkJaWYoaXZpZGVvLT5zaXN2Z2FfZW5hYmxlZCkKKwkJCWl2aWRlby0+c2lzZmJfd2FzX2Jvb3RfZGV2aWNlID0gMTsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IFBDSSBkZXZpY2UgaXMgZGlzYWJsZWQsICIKKwkJCQkiYnV0IG1hcmtlZCBhcyBib290IHZpZGVvIGRldmljZSA/Pz9cbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiBJIHdpbGwgbm90IGFjY2VwdCB0aGlzICIKKwkJCQkiYXMgdGhlIHByaW1hcnkgVkdBIGRldmljZVxuIik7CisJCX0KKwl9CisjZW5kaWYKKwogCWl2aWRlby0+c2lzZmJfcGFybV9tZW0gPSBzaXNmYl9wYXJtX21lbTsKIAlpdmlkZW8tPnNpc2ZiX2FjY2VsID0gc2lzZmJfYWNjZWw7CiAJaXZpZGVvLT5zaXNmYl95cGFuID0gc2lzZmJfeXBhbjsKQEAgLTQ4NDYsNyArNTk3NCw2IEBACiAJaXZpZGVvLT5zaXNmYl90dnN0ZCA9IHNpc2ZiX3R2c3RkOwogCWl2aWRlby0+dHZ4cG9zID0gc2lzZmJfdHZ4cG9zb2Zmc2V0OwogCWl2aWRlby0+dHZ5cG9zID0gc2lzZmJfdHZ5cG9zb2Zmc2V0OwotCWl2aWRlby0+c2lzZmJfZmlsdGVyID0gc2lzZmJfZmlsdGVyOwogCWl2aWRlby0+c2lzZmJfbm9jcnQycmF0ZSA9IHNpc2ZiX25vY3J0MnJhdGU7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCWl2aWRlby0+c2lzZmJfaW52ZXJzZSA9IHNpc2ZiX2ludmVyc2U7CkBAIC00ODU0LDcgKzU5ODEsNyBAQAogCiAJaXZpZGVvLT5yZWZyZXNoX3JhdGUgPSAwOwogCWlmKGl2aWRlby0+c2lzZmJfcGFybV9yYXRlICE9IC0xKSB7Ci0JICAgaXZpZGVvLT5yZWZyZXNoX3JhdGUgPSBpdmlkZW8tPnNpc2ZiX3Bhcm1fcmF0ZTsKKwkJaXZpZGVvLT5yZWZyZXNoX3JhdGUgPSBpdmlkZW8tPnNpc2ZiX3Bhcm1fcmF0ZTsKIAl9CiAKIAlpdmlkZW8tPlNpU19Qci5Vc2VQYW5lbFNjYWxlciA9IHNpc2ZiX3NjYWxlbGNkOwpAQCAtNDg2Myw4ICs1OTkwLDggQEAKIAlpdmlkZW8tPlNpU19Qci5MVkRTSEwgPSBzaXNmYl9sdmRzaGw7CiAKIAlpdmlkZW8tPlNpU19Qci5TaVNfQmFja3VwNzB4eCA9IDB4ZmY7Ci0gICAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19DSE92ZXJTY2FuID0gLTE7Ci0gICAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19DaFNXID0gRkFMU0U7CisJaXZpZGVvLT5TaVNfUHIuU2lTX0NIT3ZlclNjYW4gPSAtMTsKKwlpdmlkZW8tPlNpU19Qci5TaVNfQ2hTVyA9IEZBTFNFOwogCWl2aWRlby0+U2lTX1ByLlNpU19Vc2VMQ0RBID0gRkFMU0U7CiAJaXZpZGVvLT5TaVNfUHIuSGF2ZUVNSSA9IEZBTFNFOwogCWl2aWRlby0+U2lTX1ByLkhhdmVFTUlMQ0QgPSBGQUxTRTsKQEAgLTQ4NzMsMTIgKzYwMDAsMTMgQEAKIAlpdmlkZW8tPlNpU19Qci5TaVNfTXlDUjYzID0gMHg2MzsKIAlpdmlkZW8tPlNpU19Qci5QREMgID0gLTE7CiAJaXZpZGVvLT5TaVNfUHIuUERDQSA9IC0xOworCWl2aWRlby0+U2lTX1ByLkREQ1BvcnRNaXh1cCA9IEZBTFNFOwogI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CiAJaWYoaXZpZGVvLT5jaGlwID49IFNJU18zMzApIHsKLQkgICBpdmlkZW8tPlNpU19Qci5TaVNfTXlDUjYzID0gMHg1MzsKLQkgICBpZihpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgewotCSAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19TZW5zaWJsZVNSMTEgPSBUUlVFOwotCSAgIH0KKwkJaXZpZGVvLT5TaVNfUHIuU2lTX015Q1I2MyA9IDB4NTM7CisJCWlmKGl2aWRlby0+Y2hpcCA+PSBTSVNfNjYxKSB7CisJCQlpdmlkZW8tPlNpU19Qci5TaVNfU2Vuc2libGVTUjExID0gVFJVRTsKKwkJfQogCX0KICNlbmRpZgogCkBAIC00ODkxLDkgKzYwMTksOSBAQAogCQlzd2l0Y2goaXZpZGVvLT5uYnJpZGdlLT5kZXZpY2UpIHsKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMwMAogCQljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzMwOgotCQkgICAJaXZpZGVvLT5jaGlwID0gU0lTXzczMDsKKwkJCWl2aWRlby0+Y2hpcCA9IFNJU183MzA7CiAJCQlzdHJjcHkoaXZpZGVvLT5teWlkLCAiU2lTIDczMCIpOwotCQkgICAJYnJlYWs7CisJCQlicmVhazsKICNlbmRpZgogI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CiAJCWNhc2UgUENJX0RFVklDRV9JRF9TSV82NTE6CkBAIC00OTAxLDIyICs2MDI5LDI4IEBACiAJCQlzdHJjcHkoaXZpZGVvLT5teWlkLCAiU2lTIDY1MSIpOwogCQkJYnJlYWs7CiAJCWNhc2UgUENJX0RFVklDRV9JRF9TSV83NDA6Ci0JCSAgIAlpdmlkZW8tPmNoaXAgPSBTSVNfNzQwOworCQkJaXZpZGVvLT5jaGlwID0gU0lTXzc0MDsKIAkJCXN0cmNweShpdmlkZW8tPm15aWQsICJTaVMgNzQwIik7CiAJCQlicmVhazsKIAkJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzY2MToKLQkJICAgCWl2aWRlby0+Y2hpcCA9IFNJU182NjE7CisJCQlpdmlkZW8tPmNoaXAgPSBTSVNfNjYxOwogCQkJc3RyY3B5KGl2aWRlby0+bXlpZCwgIlNpUyA2NjEiKTsKIAkJCWJyZWFrOwogCQljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzQxOgotCQkgICAJaXZpZGVvLT5jaGlwID0gU0lTXzc0MTsKKwkJCWl2aWRlby0+Y2hpcCA9IFNJU183NDE7CiAJCQlzdHJjcHkoaXZpZGVvLT5teWlkLCAiU2lTIDc0MSIpOwogCQkJYnJlYWs7CiAJCWNhc2UgUENJX0RFVklDRV9JRF9TSV83NjA6Ci0JCSAgIAlpdmlkZW8tPmNoaXAgPSBTSVNfNzYwOworCQkJaXZpZGVvLT5jaGlwID0gU0lTXzc2MDsKIAkJCXN0cmNweShpdmlkZW8tPm15aWQsICJTaVMgNzYwIik7CiAJCQlicmVhazsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzc2MToKKwkJCWl2aWRlby0+Y2hpcCA9IFNJU183NjE7CisJCQlzdHJjcHkoaXZpZGVvLT5teWlkLCAiU2lTIDc2MSIpOworCQkJYnJlYWs7CiAjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwogCQl9CiAJfQogCkBAIC00OTI0LDcxICs2MDU4LDgzIEBACiAJc3RyY3B5KHNpc19mYl9pbmZvLT5tb2RlbmFtZSwgaXZpZGVvLT5teWlkKTsKICNlbmRpZgogCi0JaXZpZGVvLT5zaXNod19leHQuakNoaXBUeXBlID0gaXZpZGVvLT5jaGlwOworCWl2aWRlby0+U2lTX1ByLkNoaXBUeXBlID0gaXZpZGVvLT5jaGlwOworCisJaXZpZGVvLT5TaVNfUHIuaXZpZGVvID0gKHZvaWQgKilpdmlkZW87CiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotCWlmKChpdmlkZW8tPnNpc2h3X2V4dC5qQ2hpcFR5cGUgPT0gU0lTXzMxNVBSTykgfHwKLQkgICAoaXZpZGVvLT5zaXNod19leHQuakNoaXBUeXBlID09IFNJU18zMTUpKSB7Ci0JCWl2aWRlby0+c2lzaHdfZXh0LmpDaGlwVHlwZSA9IFNJU18zMTVIOworCWlmKChpdmlkZW8tPlNpU19Qci5DaGlwVHlwZSA9PSBTSVNfMzE1UFJPKSB8fAorCSAgIChpdmlkZW8tPlNpU19Qci5DaGlwVHlwZSA9PSBTSVNfMzE1KSkgeworCQlpdmlkZW8tPlNpU19Qci5DaGlwVHlwZSA9IFNJU18zMTVIOwogCX0KICNlbmRpZgogCisJaWYoIWl2aWRlby0+c2lzdmdhX2VuYWJsZWQpIHsKKwkJaWYocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJCWlmKGl2aWRlby0+bmJyaWRnZSkgU0lTX1BDSV9QVVRfREVWSUNFKGl2aWRlby0+bmJyaWRnZSk7CisJCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJCQlrZnJlZShzaXNfZmJfaW5mbyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwogCWl2aWRlby0+dmlkZW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAlpdmlkZW8tPm1taW9fYmFzZSAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CiAJaXZpZGVvLT5tbWlvX3NpemUgID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKTsKIAlpdmlkZW8tPlNpU19Qci5SZWxJTyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSArIDB4MzA7Ci0JaXZpZGVvLT5zaXNod19leHQudWxJT0FkZHJlc3MgPSBpdmlkZW8tPnZnYV9iYXNlID0gaXZpZGVvLT5TaVNfUHIuUmVsSU87CisJaXZpZGVvLT5TaVNfUHIuSU9BZGRyZXNzID0gaXZpZGVvLT52Z2FfYmFzZSA9IGl2aWRlby0+U2lTX1ByLlJlbElPOwogCi0JaWYoIXNpc3ZnYV9lbmFibGVkKSB7Ci0JICAgCWlmKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7Ci0JICAgICAgCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JICAgICAgCQlrZnJlZShzaXNfZmJfaW5mbyk7Ci0JICAgICAgCQlyZXR1cm4gLUVJTzsKLQkgICAJfQotCX0KLQotCVNpU1JlZ0luaXQoJml2aWRlby0+U2lTX1ByLCBpdmlkZW8tPnNpc2h3X2V4dC51bElPQWRkcmVzcyk7CisJU2lTUmVnSW5pdCgmaXZpZGVvLT5TaVNfUHIsIGl2aWRlby0+U2lTX1ByLklPQWRkcmVzcyk7CiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMwMAogCS8qIEZpbmQgUENJIHN5c3RlbXMgZm9yIENocm9udGVsL0dQSU8gY29tbXVuaWNhdGlvbiBzZXR1cCAqLwogCWlmKGl2aWRlby0+Y2hpcCA9PSBTSVNfNjMwKSB7Ci0JICAgaT0wOwotICAgICAgICAgICBkbyB7Ci0JICAgICAgaWYobXljaHN3dGFibGVbaV0uc3Vic3lzVmVuZG9yID09IGl2aWRlby0+c3Vic3lzdmVuZG9yICYmCi0JICAgICAgICAgbXljaHN3dGFibGVbaV0uc3Vic3lzQ2FyZCAgID09IGl2aWRlby0+c3Vic3lzZGV2aWNlKSB7Ci0JCSBpdmlkZW8tPlNpU19Qci5TaVNfQ2hTVyA9IFRSVUU7Ci0JCSBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IElkZW50aWZpZWQgWyVzICVzXSByZXF1aXJpbmcgQ2hyb250ZWwvR1BJTyBzZXR1cFxuIiwKLQkJICAgICAgICBteWNoc3d0YWJsZVtpXS52ZW5kb3JOYW1lLCBteWNoc3d0YWJsZVtpXS5jYXJkTmFtZSk7Ci0JCSBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgIH0gd2hpbGUobXljaHN3dGFibGVbaV0uc3Vic3lzVmVuZG9yICE9IDApOworCQlpID0gMDsKKyAgICAgICAgCWRvIHsKKwkJCWlmKG15Y2hzd3RhYmxlW2ldLnN1YnN5c1ZlbmRvciA9PSBpdmlkZW8tPnN1YnN5c3ZlbmRvciAmJgorCQkJICAgbXljaHN3dGFibGVbaV0uc3Vic3lzQ2FyZCAgID09IGl2aWRlby0+c3Vic3lzZGV2aWNlKSB7CisJCQkJaXZpZGVvLT5TaVNfUHIuU2lTX0NoU1cgPSBUUlVFOworCQkJCXByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogSWRlbnRpZmllZCBbJXMgJXNdICIKKwkJCQkJInJlcXVpcmluZyBDaHJvbnRlbC9HUElPIHNldHVwXG4iLAorCQkJCQlteWNoc3d0YWJsZVtpXS52ZW5kb3JOYW1lLAorCQkJCQlteWNoc3d0YWJsZVtpXS5jYXJkTmFtZSk7CisJCQkJaXZpZGVvLT5scGNkZXYgPSBTSVNfUENJX0dFVF9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TSSwgMHgwMDA4LCBOVUxMKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWkrKzsKKwkJfSB3aGlsZShteWNoc3d0YWJsZVtpXS5zdWJzeXNWZW5kb3IgIT0gMCk7CiAJfQogI2VuZGlmCiAKLSAgICAgICAgb3V0U0lTSURYUkVHKFNJU1NSLCAweDA1LCAweDg2KTsKLQotCWlmKCAoIXNpc3ZnYV9lbmFibGVkKQotI2lmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKQotCQkgIAkgICAgICB8fCAoc2lzZmJfcmVzZXRjYXJkKQorI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CisJaWYoKGl2aWRlby0+Y2hpcCA9PSBTSVNfNzYwKSAmJiAoaXZpZGVvLT5uYnJpZGdlKSkgeworCQlpdmlkZW8tPmxwY2RldiA9IFNJU19QQ0lfR0VUX1NMT1QoaXZpZGVvLT5uYnJpZGdlLT5idXMsICgyIDw8IDMpKTsKKwl9CiAjZW5kaWYKLQkJCSAgICAgIAkJCSAgICkgewotCSAgIAlmb3IoaSA9IDB4MzA7IGkgPD0gMHgzZjsgaSsrKSB7Ci0JICAgICAgCQlvdXRTSVNJRFhSRUcoU0lTQ1IsaSwweDAwKTsKLQkgICAJfQorCisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDA1LCAweDg2KTsKKworCWlmKCAoIWl2aWRlby0+c2lzdmdhX2VuYWJsZWQpCisjaWYgIWRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCisJCQkgICAgICB8fCAoc2lzZmJfcmVzZXRjYXJkKQorI2VuZGlmCisJCQkJCQkgICApIHsKKwkJZm9yKGkgPSAweDMwOyBpIDw9IDB4M2Y7IGkrKykgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCBpLCAweDAwKTsKKwkJfQogCX0KIAogCS8qIEZpbmQgb3V0IGFib3V0IGN1cnJlbnQgdmlkZW8gbW9kZSAqLwogCWl2aWRlby0+bW9kZXByZWNoYW5nZSA9IDB4MDM7Ci0JaW5TSVNJRFhSRUcoU0lTQ1IsMHgzNCxyZWcpOworCWluU0lTSURYUkVHKFNJU0NSLCAweDM0LCByZWcpOwogCWlmKHJlZyAmIDB4N2YpIHsKIAkJaXZpZGVvLT5tb2RlcHJlY2hhbmdlID0gcmVnICYgMHg3ZjsKLQl9IGVsc2UgaWYoc2lzdmdhX2VuYWJsZWQpIHsKKwl9IGVsc2UgaWYoaXZpZGVvLT5zaXN2Z2FfZW5hYmxlZCkgewogI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKLQkJdW5zaWduZWQgY2hhciBTSVNfSU9UWVBFMiAqdHQgPSBpb3JlbWFwKDAsIDB4MTAwMCk7CisJCXVuc2lnbmVkIGNoYXIgU0lTX0lPVFlQRTIgKnR0ID0gaW9yZW1hcCgweDQwMCwgMHgxMDApOwogCQlpZih0dCkgewotCQkgICAJaXZpZGVvLT5tb2RlcHJlY2hhbmdlID0gcmVhZGIodHQgKyAweDQ0OSk7Ci0JCSAgIAlpb3VubWFwKHR0KTsKKwkJCWl2aWRlby0+bW9kZXByZWNoYW5nZSA9IHJlYWRiKHR0ICsgMHg0OSk7CisJCQlpb3VubWFwKHR0KTsKIAkJfQogI2VuZGlmCiAJfQpAQCAtNDk5NiwyMTkgKzYxNDIsMjIxIEBACiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAjaWZkZWYgTU9EVUxFCiAJaWYoKHJlZyAmIDB4ODApICYmIChyZWcgIT0gMHhmZikpIHsKLQkgICBpZigoc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldKSAhPSAweEZGKSB7Ci0JICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IENhbm5vdCBpbml0aWFsaXplIGRpc3BsYXkgbW9kZSwgWCBzZXJ2ZXIgaXMgYWN0aXZlXG4iKTsKLQkgICAgICBwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JICAgICAga2ZyZWUoc2lzX2ZiX2luZm8pOwotCSAgICAgIHJldHVybiAtRUJVU1k7Ci0JICAgfQotCX0KLSNlbmRpZgkKLSNlbmRpZgotCi0JaXZpZGVvLT5zaXNod19leHQuYkludGVncmF0ZWRNTUVuYWJsZWQgPSBUUlVFOwotI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0JaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JICAgaWYoaXZpZGVvLT5jaGlwICE9IFNJU18zMDApIHsKLQkgICAgICBpblNJU0lEWFJFRyhTSVNTUiwgMHgxYSwgcmVnKTsKLQkgICAgICBpZighKHJlZyAmIDB4MTApKSB7Ci0JCSBpdmlkZW8tPnNpc2h3X2V4dC5iSW50ZWdyYXRlZE1NRW5hYmxlZCA9IEZBTFNFOwotCSAgICAgIH0KLQkgICB9Ci0JfQotI2VuZGlmCi0KLQlpdmlkZW8tPmJpb3NfYWJhc2UgPSBOVUxMOwotCWlmKGl2aWRlby0+c2lzZmJfdXNlcm9tKSB7Ci0JICAgIGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2UgPSBzaXNfZmluZF9yb20ocGRldik7Ci0JICAgIGl2aWRlby0+Ymlvc19hYmFzZSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2U7Ci0JICAgIGlmKGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2UpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFZpZGVvIFJPTSBmb3VuZCBhbmQgY29waWVkXG4iKTsKLQkJaXZpZGVvLT5zaXNod19leHQuVXNlUk9NID0gVFJVRTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSA9IEZBTFNFOwotCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFZpZGVvIFJPTSBub3QgZm91bmRcbiIpOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZSA9IE5VTEw7Ci0JICAgIGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSA9IEZBTFNFOwotCSAgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogVmlkZW8gUk9NIHVzYWdlIGRpc2FibGVkXG4iKTsKLQl9Ci0KLSAgICAgICAgLyogRmluZCBzeXN0ZW1zIGZvciBzcGVjaWFsIGN1c3RvbSB0aW1pbmcgKi8KLQlpZihpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCA9PSBDVVRfTk9ORSkgewotCSAgIGludCBqOwotCSAgIHVuc2lnbmVkIGNoYXIgKmJpb3N2ZXIgPSBOVUxMOwotICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpiaW9zZGF0ZSA9IE5VTEw7Ci0JICAgQk9PTEVBTiBmb290cHJpbnQ7Ci0JICAgdTMyIGNoa3N1bSA9IDA7Ci0KLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICBiaW9zdmVyID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZSArIDB4MDY7Ci0JICAgICAgYmlvc2RhdGUgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlICsgMHgyYzsKLSAgICAgICAgICAgICAgZm9yKGk9MDsgaTwzMjc2ODsgaSsrKSBjaGtzdW0gKz0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpXTsKLQkgICB9Ci0KLQkgICBpPTA7Ci0gICAgICAgICAgIGRvIHsKLQkgICAgICBpZiggKG15Y3VzdG9tdHRhYmxlW2ldLmNoaXBJRCA9PSBpdmlkZW8tPmNoaXApICYmCi0JICAgICAgICAgICgoIXN0cmxlbihteWN1c3RvbXR0YWJsZVtpXS5iaW9zdmVyc2lvbikpIHx8Ci0JCSAgIChpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00gJiYKLQkJICAgKCFzdHJuY21wKG15Y3VzdG9tdHRhYmxlW2ldLmJpb3N2ZXJzaW9uLCBiaW9zdmVyLCBzdHJsZW4obXljdXN0b210dGFibGVbaV0uYmlvc3ZlcnNpb24pKSkpKSAmJgotCSAgICAgICAgICAoKCFzdHJsZW4obXljdXN0b210dGFibGVbaV0uYmlvc2RhdGUpKSB8fAotCQkgICAoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NICYmCi0JCSAgICghc3RybmNtcChteWN1c3RvbXR0YWJsZVtpXS5iaW9zZGF0ZSwgYmlvc2RhdGUsIHN0cmxlbihteWN1c3RvbXR0YWJsZVtpXS5iaW9zZGF0ZSkpKSkpICYmCi0JCSAgKCghbXljdXN0b210dGFibGVbaV0uYmlvc2Noa3N1bSkgfHwKLQkJICAgKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSAmJgotCSAgICAgICAgICAgKG15Y3VzdG9tdHRhYmxlW2ldLmJpb3NjaGtzdW0gPT0gY2hrc3VtKSkpCSYmCi0JCSAgKG15Y3VzdG9tdHRhYmxlW2ldLnBjaXN1YnN5c3ZlbmRvciA9PSBpdmlkZW8tPnN1YnN5c3ZlbmRvcikgJiYKLQkJICAobXljdXN0b210dGFibGVbaV0ucGNpc3Vic3lzY2FyZCA9PSBpdmlkZW8tPnN1YnN5c2RldmljZSkgKSB7Ci0JCSBmb290cHJpbnQgPSBUUlVFOwotCSAgICAgICAgIGZvcihqID0gMDsgaiA8IDU7IGorKykgewotCSAgICAgICAgICAgIGlmKG15Y3VzdG9tdHRhYmxlW2ldLmJpb3NGb290cHJpbnRBZGRyW2pdKSB7Ci0JCSAgICAgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICAgICAgICAgICAgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW215Y3VzdG9tdHRhYmxlW2ldLmJpb3NGb290cHJpbnRBZGRyW2pdXSAhPQotCQkgICAgICAJCW15Y3VzdG9tdHRhYmxlW2ldLmJpb3NGb290cHJpbnREYXRhW2pdKSB7Ci0JCSAgICAgICAgICAgICBmb290cHJpbnQgPSBGQUxTRTsKLQkJCSAgfQotCQkgICAgICAgfSBlbHNlIGZvb3RwcmludCA9IEZBTFNFOwotCQkgICAgfQotCSAgICAgICAgIH0KLQkgICAgICAgICBpZihmb290cHJpbnQpIHsKLQkgCSAgICBpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCA9IG15Y3VzdG9tdHRhYmxlW2ldLlNwZWNpYWxJRDsKLQkJICAgIHByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogSWRlbnRpZmllZCBbJXMgJXNdLCBzcGVjaWFsIHRpbWluZyBhcHBsaWVzXG4iLAotCQkgICAgICAgIG15Y3VzdG9tdHRhYmxlW2ldLnZlbmRvck5hbWUsCi0JCQlteWN1c3RvbXR0YWJsZVtpXS5jYXJkTmFtZSk7Ci0JCSAgICBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IFtzcGVjaWFsdGltaW5nIHBhcmFtZXRlciBuYW1lOiAlc11cbiIsCi0JCSAgICAJbXljdXN0b210dGFibGVbaV0ub3B0aW9uTmFtZSk7Ci0JICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIH0KLQkgICAgICB9Ci0gICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgfSB3aGlsZShteWN1c3RvbXR0YWJsZVtpXS5jaGlwSUQpOwotCX0KLQotI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0JaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JCWlmKCAoIXNpc3ZnYV9lbmFibGVkKQotI2lmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKQotCQkgICAgCQkgICAgICB8fCAoc2lzZmJfcmVzZXRjYXJkKQotI2VuZGlmCi0JCSAgCQkJCQkgICApIHsKLQkJCWlmKGl2aWRlby0+Y2hpcCA9PSBTSVNfMzAwKSB7Ci0JCQkJc2lzZmJfcG9zdF9zaXMzMDAocGRldik7Ci0JCQl9CisJCWlmKChzaXNiaW9zX21vZGVbaXZpZGVvLT5zaXNmYl9tb2RlX2lkeF0ubW9kZV9ub1tpdmlkZW8tPm1uaV0pCisJCQkJCQkJCQkhPSAweEZGKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogQ2Fubm90IGluaXRpYWxpemUgZGlzcGxheSBtb2RlLCAiCisJCQkJCSAiWCBzZXJ2ZXIgaXMgYWN0aXZlXG4iKTsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gZXJyb3JfNDsKIAkJfQogCX0KICNlbmRpZgorI2VuZGlmCisKKwkvKiBTZWFyY2ggYW5kIGNvcHkgUk9NIGltYWdlICovCisJaXZpZGVvLT5iaW9zX2FiYXNlID0gTlVMTDsKKwlpdmlkZW8tPlNpU19Qci5WaXJ0dWFsUm9tQmFzZSA9IE5VTEw7CisJaXZpZGVvLT5TaVNfUHIuVXNlUk9NID0gRkFMU0U7CisJaXZpZGVvLT5oYXZlWEdJUk9NID0gaXZpZGVvLT5TaVNfUHIuU2lTX1hHSVJPTSA9IEZBTFNFOworCWlmKGl2aWRlby0+c2lzZmJfdXNlcm9tKSB7CisJCWl2aWRlby0+U2lTX1ByLlZpcnR1YWxSb21CYXNlID0gc2lzZmJfZmluZF9yb20ocGRldik7CisJCWl2aWRlby0+Ymlvc19hYmFzZSA9IGl2aWRlby0+U2lTX1ByLlZpcnR1YWxSb21CYXNlOworCQlpdmlkZW8tPlNpU19Qci5Vc2VST00gPSAoaXZpZGVvLT5TaVNfUHIuVmlydHVhbFJvbUJhc2UpID8gVFJVRSA6IEZBTFNFOworCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogVmlkZW8gUk9NICVzZm91bmRcbiIsCisJCQlpdmlkZW8tPlNpU19Qci5Vc2VST00gPyAiIiA6ICJub3QgIik7CisJCWlmKChpdmlkZW8tPlNpU19Qci5Vc2VST00pICYmIChpdmlkZW8tPmNoaXAgPj0gWEdJXzIwKSkgeworCQkgICBpdmlkZW8tPlNpU19Qci5Vc2VST00gPSBGQUxTRTsKKwkJICAgaXZpZGVvLT5oYXZlWEdJUk9NID0gaXZpZGVvLT5TaVNfUHIuU2lTX1hHSVJPTSA9IFRSVUU7CisJCSAgIGlmKCAoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSAmJgorCQkgICAgICAgKCEoaXZpZGVvLT5iaW9zX2FiYXNlWzB4MWQxXSAmIDB4MDEpKSApIHsKKwkJCWl2aWRlby0+U2lTX1ByLkREQ1BvcnRNaXh1cCA9IFRSVUU7CisJCSAgIH0KKwkJfQorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBWaWRlbyBST00gdXNhZ2UgZGlzYWJsZWRcbiIpOworCX0KKworCS8qIEZpbmQgc3lzdGVtcyBmb3Igc3BlY2lhbCBjdXN0b20gdGltaW5nICovCisJaWYoaXZpZGVvLT5TaVNfUHIuU2lTX0N1c3RvbVQgPT0gQ1VUX05PTkUpIHsKKwkJc2lzZmJfZGV0ZWN0X2N1c3RvbV90aW1pbmcoaXZpZGVvKTsKKwl9CisKKwkvKiBQT1NUIGNhcmQgaW4gY2FzZSB0aGlzIGhhcyBub3QgYmVlbiBkb25lIGJ5IHRoZSBCSU9TICovCisJaWYoICghaXZpZGVvLT5zaXN2Z2FfZW5hYmxlZCkKKyNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKKwkJCSAgICAgfHwgKHNpc2ZiX3Jlc2V0Y2FyZCkKKyNlbmRpZgorCQkJCQkJICkgeworI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCisJCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCQkJaWYoaXZpZGVvLT5jaGlwID09IFNJU18zMDApIHsKKwkJCQlzaXNmYl9wb3N0X3NpczMwMChwZGV2KTsKKwkJCQlpdmlkZW8tPnNpc2ZiX2Nhbl9wb3N0ID0gMTsKKwkJCX0KKwkJfQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCQlpZiggKCFzaXN2Z2FfZW5hYmxlZCkKLSNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKLQkJICAgIAkJICAgICB8fCAoc2lzZmJfcmVzZXRjYXJkKQotI2VuZGlmCi0JCSAgCQkJCQkgICkgewotCQkJaWYoKGl2aWRlby0+Y2hpcCA9PSBTSVNfMzE1SCkgICB8fAorCQlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJCWludCByZXN1bHQgPSAxOworCQkvKglpZigoaXZpZGVvLT5jaGlwID09IFNJU18zMTVIKSAgIHx8CiAJCQkgICAoaXZpZGVvLT5jaGlwID09IFNJU18zMTUpICAgIHx8CiAJCQkgICAoaXZpZGVvLT5jaGlwID09IFNJU18zMTVQUk8pIHx8CiAJCQkgICAoaXZpZGVvLT5jaGlwID09IFNJU18zMzApKSB7CiAJCQkJc2lzZmJfcG9zdF9zaXMzMTUzMzAocGRldik7CisJCQl9IGVsc2UgKi8gaWYoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgeworCQkJCXJlc3VsdCA9IHNpc2ZiX3Bvc3RfeGdpKHBkZXYpOworCQkJCWl2aWRlby0+c2lzZmJfY2FuX3Bvc3QgPSAxOworCQkJfSBlbHNlIGlmKChpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSAmJiBpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJCQlyZXN1bHQgPSBzaXNmYl9wb3N0X3hnaShwZGV2KTsKKwkJCQlpdmlkZW8tPnNpc2ZiX2Nhbl9wb3N0ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IENhcmQgaXMgbm90ICIKKwkJCQkJIlBPU1RlZCBhbmQgc2lzZmIgY2FuJ3QgZG8gdGhpcyBlaXRoZXIuXG4iKTsKKwkJCX0KKwkJCWlmKCFyZXN1bHQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInNpc2ZiOiBGYWlsZWQgdG8gUE9TVCBjYXJkXG4iKTsKKwkJCQlyZXQgPSAtRU5PREVWOworCQkJCWdvdG8gZXJyb3JfMzsKIAkJCX0KIAkJfQotCX0KICNlbmRpZgotCi0JaWYoc2lzZmJfZ2V0X2RyYW1fc2l6ZShpdmlkZW8pKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBGYXRhbCBlcnJvcjogVW5hYmxlIHRvIGRldGVybWluZSBSQU0gc2l6ZS5cbiIpOwotCQlpZihpdmlkZW8tPmJpb3NfYWJhc2UpIHZmcmVlKGl2aWRlby0+Ymlvc19hYmFzZSk7Ci0JCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQkJa2ZyZWUoc2lzX2ZiX2luZm8pOwotCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlpdmlkZW8tPnNpc2ZiX2NhcmRfcG9zdGVkID0gMTsKKworCS8qIEZpbmQgb3V0IGFib3V0IFJBTSBzaXplICovCisJaWYoc2lzZmJfZ2V0X2RyYW1fc2l6ZShpdmlkZW8pKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBGYXRhbCBlcnJvcjogVW5hYmxlIHRvIGRldGVybWluZSBWUkFNIHNpemUuXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl8zOworCX0KKworCisJLyogRW5hYmxlIFBDSSBhZGRyZXNzaW5nIGFuZCBNTUlPICovCiAJaWYoKGl2aWRlby0+c2lzZmJfbW9kZV9pZHggPCAwKSB8fAogCSAgICgoc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldKSAhPSAweEZGKSkgewotCSAgICAgICAgLyogRW5hYmxlIFBDSV9MSU5FQVJfQUREUkVTU0lORyBhbmQgTU1JT19FTkFCTEUgICovCi0JICAgICAgICBvclNJU0lEWFJFRyhTSVNTUiwgSU5EX1NJU19QQ0lfQUREUkVTU19TRVQsIChTSVNfUENJX0FERFJfRU5BQkxFIHwgU0lTX01FTV9NQVBfSU9fRU5BQkxFKSk7Ci0gICAgICAgICAgICAgICAgLyogRW5hYmxlIDJEIGFjY2VsZXJhdG9yIGVuZ2luZSAqLwotCSAgICAgICAgb3JTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfTU9EVUxFX0VOQUJMRSwgU0lTX0VOQUJMRV8yRCk7CisJCS8qIEVuYWJsZSBQQ0lfTElORUFSX0FERFJFU1NJTkcgYW5kIE1NSU9fRU5BQkxFICAqLworCQlvclNJU0lEWFJFRyhTSVNTUiwgSU5EX1NJU19QQ0lfQUREUkVTU19TRVQsIChTSVNfUENJX0FERFJfRU5BQkxFIHwgU0lTX01FTV9NQVBfSU9fRU5BQkxFKSk7CisJCS8qIEVuYWJsZSAyRCBhY2NlbGVyYXRvciBlbmdpbmUgKi8KKwkJb3JTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfTU9EVUxFX0VOQUJMRSwgU0lTX0VOQUJMRV8yRCk7CiAJfQogCiAJaWYoc2lzZmJfcGRjICE9IDB4ZmYpIHsKLQkgICBpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHNpc2ZiX3BkYyAmPSAweDNjOwotCSAgIGVsc2UJCQkJICAgICAgICAgICAgc2lzZmJfcGRjICY9IDB4MWY7Ci0JICAgaXZpZGVvLT5TaVNfUHIuUERDID0gc2lzZmJfcGRjOworCQlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpCisJCQlzaXNmYl9wZGMgJj0gMHgzYzsKKwkJZWxzZQorCQkJc2lzZmJfcGRjICY9IDB4MWY7CisJCWl2aWRlby0+U2lTX1ByLlBEQyA9IHNpc2ZiX3BkYzsKIAl9CiAjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKIAlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICBpZihzaXNmYl9wZGNhICE9IDB4ZmYpIGl2aWRlby0+U2lTX1ByLlBEQ0EgPSBzaXNmYl9wZGNhICYgMHgxZjsKKwkJaWYoc2lzZmJfcGRjYSAhPSAweGZmKQorCQkJaXZpZGVvLT5TaVNfUHIuUERDQSA9IHNpc2ZiX3BkY2EgJiAweDFmOwogCX0KICNlbmRpZgogCiAJaWYoIXJlcXVlc3RfbWVtX3JlZ2lvbihpdmlkZW8tPnZpZGVvX2Jhc2UsIGl2aWRlby0+dmlkZW9fc2l6ZSwgInNpc2ZiIEZCIikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogRmF0YWwgZXJyb3I6IFVuYWJsZSB0byByZXNlcnZlIGZyYW1lIGJ1ZmZlciBtZW1vcnlcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInNpc2ZiOiBGYXRhbCBlcnJvcjogVW5hYmxlIHRvIHJlc2VydmUgJWRNQiBmcmFtZWJ1ZmZlciBtZW1vcnlcbiIsCisJCQkJKGludCkoaXZpZGVvLT52aWRlb19zaXplID4+IDIwKSk7CiAJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IElzIHRoZXJlIGFub3RoZXIgZnJhbWVidWZmZXIgZHJpdmVyIGFjdGl2ZT9cbiIpOwotCQlpZihpdmlkZW8tPmJpb3NfYWJhc2UpIHZmcmVlKGl2aWRlby0+Ymlvc19hYmFzZSk7Ci0JCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQkJa2ZyZWUoc2lzX2ZiX2luZm8pOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl8zOwogCX0KIAogCWlmKCFyZXF1ZXN0X21lbV9yZWdpb24oaXZpZGVvLT5tbWlvX2Jhc2UsIGl2aWRlby0+bW1pb19zaXplLCAic2lzZmIgTU1JTyIpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEZhdGFsIGVycm9yOiBVbmFibGUgdG8gcmVzZXJ2ZSBNTUlPIHJlZ2lvblxuIik7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihpdmlkZW8tPnZpZGVvX2Jhc2UsIGl2aWRlby0+dmlkZW9fc2l6ZSk7Ci0JCWlmKGl2aWRlby0+Ymlvc19hYmFzZSkgdmZyZWUoaXZpZGVvLT5iaW9zX2FiYXNlKTsKLQkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCQlrZnJlZShzaXNfZmJfaW5mbyk7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycm9yXzI7CiAJfQogCiAJaXZpZGVvLT52aWRlb192YmFzZSA9IGlvcmVtYXAoaXZpZGVvLT52aWRlb19iYXNlLCBpdmlkZW8tPnZpZGVvX3NpemUpOwotCWl2aWRlby0+c2lzaHdfZXh0LnBqVmlkZW9NZW1vcnlBZGRyZXNzID0gaXZpZGVvLT52aWRlb192YmFzZTsKKwlpdmlkZW8tPlNpU19Qci5WaWRlb01lbW9yeUFkZHJlc3MgPSBpdmlkZW8tPnZpZGVvX3ZiYXNlOwogCWlmKCFpdmlkZW8tPnZpZGVvX3ZiYXNlKSB7Ci0JICAgCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEZhdGFsIGVycm9yOiBVbmFibGUgdG8gbWFwIGZyYW1lIGJ1ZmZlciBtZW1vcnlcbiIpOwotCSAgIAlyZWxlYXNlX21lbV9yZWdpb24oaXZpZGVvLT52aWRlb19iYXNlLCBpdmlkZW8tPnZpZGVvX3NpemUpOwotCSAgIAlyZWxlYXNlX21lbV9yZWdpb24oaXZpZGVvLT5tbWlvX2Jhc2UsIGl2aWRlby0+bW1pb19zaXplKTsKLQkJaWYoaXZpZGVvLT5iaW9zX2FiYXNlKSB2ZnJlZShpdmlkZW8tPmJpb3NfYWJhc2UpOwotCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JICAgCWtmcmVlKHNpc19mYl9pbmZvKTsKLQkgICAJcmV0dXJuIC1FTk9ERVY7CisJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEZhdGFsIGVycm9yOiBVbmFibGUgdG8gbWFwIGZyYW1lYnVmZmVyIG1lbW9yeVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3JfMTsKIAl9CiAKIAlpdmlkZW8tPm1taW9fdmJhc2UgPSBpb3JlbWFwKGl2aWRlby0+bW1pb19iYXNlLCBpdmlkZW8tPm1taW9fc2l6ZSk7CiAJaWYoIWl2aWRlby0+bW1pb192YmFzZSkgewotCSAgIAlwcmludGsoS0VSTl9FUlIgInNpc2ZiOiBGYXRhbCBlcnJvcjogVW5hYmxlIHRvIG1hcCBNTUlPIHJlZ2lvblxuIik7Ci0JICAgCWlvdW5tYXAoaXZpZGVvLT52aWRlb192YmFzZSk7Ci0JICAgCXJlbGVhc2VfbWVtX3JlZ2lvbihpdmlkZW8tPnZpZGVvX2Jhc2UsIGl2aWRlby0+dmlkZW9fc2l6ZSk7Ci0JICAgCXJlbGVhc2VfbWVtX3JlZ2lvbihpdmlkZW8tPm1taW9fYmFzZSwgaXZpZGVvLT5tbWlvX3NpemUpOwotCQlpZihpdmlkZW8tPmJpb3NfYWJhc2UpIHZmcmVlKGl2aWRlby0+Ymlvc19hYmFzZSk7CisJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEZhdGFsIGVycm9yOiBVbmFibGUgdG8gbWFwIE1NSU8gcmVnaW9uXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKK2Vycm9yXzA6CWlvdW5tYXAoaXZpZGVvLT52aWRlb192YmFzZSk7CitlcnJvcl8xOglyZWxlYXNlX21lbV9yZWdpb24oaXZpZGVvLT52aWRlb19iYXNlLCBpdmlkZW8tPnZpZGVvX3NpemUpOworZXJyb3JfMjoJcmVsZWFzZV9tZW1fcmVnaW9uKGl2aWRlby0+bW1pb19iYXNlLCBpdmlkZW8tPm1taW9fc2l6ZSk7CitlcnJvcl8zOgl2ZnJlZShpdmlkZW8tPmJpb3NfYWJhc2UpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorZXJyb3JfNDoKKyNlbmRpZgorCQlpZihpdmlkZW8tPmxwY2RldikKKwkJCVNJU19QQ0lfUFVUX0RFVklDRShpdmlkZW8tPmxwY2Rldik7CisJCWlmKGl2aWRlby0+bmJyaWRnZSkKKwkJCVNJU19QQ0lfUFVUX0RFVklDRShpdmlkZW8tPm5icmlkZ2UpOwogCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JICAgCWtmcmVlKHNpc19mYl9pbmZvKTsKLQkgICAJcmV0dXJuIC1FTk9ERVY7CisJCWlmKCFpdmlkZW8tPnNpc3ZnYV9lbmFibGVkKQorCQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlrZnJlZShzaXNfZmJfaW5mbyk7CisJCXJldHVybiByZXQ7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IEZyYW1lYnVmZmVyIGF0IDB4JWx4LCBtYXBwZWQgdG8gMHglbHgsIHNpemUgJWxka1xuIiwKLQkgICAgICAgCWl2aWRlby0+dmlkZW9fYmFzZSwgKFVMT05HKWl2aWRlby0+dmlkZW9fdmJhc2UsIGl2aWRlby0+dmlkZW9fc2l6ZSAvIDEwMjQpOworCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBWaWRlbyBSQU0gYXQgMHglbHgsIG1hcHBlZCB0byAweCVseCwgc2l6ZSAlbGRrXG4iLAorCQlpdmlkZW8tPnZpZGVvX2Jhc2UsICh1bnNpZ25lZCBsb25nKWl2aWRlby0+dmlkZW9fdmJhc2UsIGl2aWRlby0+dmlkZW9fc2l6ZSAvIDEwMjQpOworCisJaWYoaXZpZGVvLT52aWRlb19vZmZzZXQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFZpZXdwb3J0IG9mZnNldCAlbGRrXG4iLAorCQkJaXZpZGVvLT52aWRlb19vZmZzZXQgLyAxMDI0KTsKKwl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogTU1JTyBhdCAweCVseCwgbWFwcGVkIHRvIDB4JWx4LCBzaXplICVsZGtcbiIsCi0JICAgICAgIAlpdmlkZW8tPm1taW9fYmFzZSwgKFVMT05HKWl2aWRlby0+bW1pb192YmFzZSwgaXZpZGVvLT5tbWlvX3NpemUgLyAxMDI0KTsKKwkJaXZpZGVvLT5tbWlvX2Jhc2UsICh1bnNpZ25lZCBsb25nKWl2aWRlby0+bW1pb192YmFzZSwgaXZpZGVvLT5tbWlvX3NpemUgLyAxMDI0KTsKIAorCisJLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBjb21tYW5kIHF1ZXVlICovCisJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7CisJCWl2aWRlby0+Y21kUXVldWVTaXplID0gVFVSQk9fUVVFVUVfQVJFQV9TSVpFOworCX0gZWxzZSB7CisJCWlmKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApIHsKKwkJCWl2aWRlby0+Y21kUXVldWVTaXplID0gQ09NTUFORF9RVUVVRV9BUkVBX1NJWkVfWjc7CisJCX0gZWxzZSB7CisJCQlpdmlkZW8tPmNtZFF1ZXVlU2l6ZSA9IENPTU1BTkRfUVVFVUVfQVJFQV9TSVpFOworCQl9CisJfQorCisJLyogRW5naW5lcyBhcmUgbm8gbG9uZ2VyIGluaXRpYWxpemVkIGhlcmU7IHRoaXMgaXMKKwkgKiBub3cgZG9uZSBhZnRlciB0aGUgZmlyc3QgbW9kZS1zd2l0Y2ggKGlmIHRoZQorCSAqIHN1Ym1pdHRlZCB2YXIgaGFzIGl0cyBhY2NlbGVyYXRpb24gZmxhZ3Mgc2V0KS4KKwkgKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgYmFzZSBvZiB0aGUgKHVudXNlZCkgaHcgY3Vyc29yICovCisJaXZpZGVvLT5od2N1cnNvcl92YmFzZSA9IGl2aWRlby0+dmlkZW9fdmJhc2UKKwkJCQkgKyBpdmlkZW8tPnZpZGVvX3NpemUKKwkJCQkgLSBpdmlkZW8tPmNtZFF1ZXVlU2l6ZQorCQkJCSAtIGl2aWRlby0+aHdjdXJzb3Jfc2l6ZTsKKwlpdmlkZW8tPmNhcHMgfD0gSFdfQ1VSU09SX0NBUDsKKworCS8qIEluaXRpYWxpemUgb2Zmc2NyZWVuIG1lbW9yeSBtYW5hZ2VyICovCiAJaWYoKGl2aWRlby0+aGF2ZW5vaGVhcCA9IHNpc2ZiX2hlYXBfaW5pdChpdmlkZW8pKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJzaXNmYjogRmFpbGVkIHRvIGluaXRpYWxpemUgb2Zmc2NyZWVuIG1lbW9yeSBoZWFwXG4iKTsKIAl9CiAKIAkvKiBVc2VkIGZvciBjbGVhcmluZyB0aGUgc2NyZWVuIG9ubHksIHRoZXJlZm9yZSByZXNwZWN0IG91ciBtZW0gbGltaXQgKi8KLQlpdmlkZW8tPnNpc2h3X2V4dC51bFZpZGVvTWVtb3J5U2l6ZSA9IGl2aWRlby0+c2lzZmJfbWVtOworCWl2aWRlby0+U2lTX1ByLlZpZGVvTWVtb3J5QWRkcmVzcyArPSBpdmlkZW8tPnZpZGVvX29mZnNldDsKKwlpdmlkZW8tPlNpU19Qci5WaWRlb01lbW9yeVNpemUgPSBpdmlkZW8tPnNpc2ZiX21lbTsKIAotCWl2aWRlby0+bXRyciA9IDA7CisJaXZpZGVvLT5tdHJyID0gLTE7CiAKIAlpdmlkZW8tPnZiZmxhZ3MgPSAwOwogCWl2aWRlby0+bGNkZGVmbW9kZWlkeCA9IERFRkFVTFRfTENETU9ERTsKIAlpdmlkZW8tPnR2ZGVmbW9kZWlkeCAgPSBERUZBVUxUX1RWTU9ERTsKIAlpdmlkZW8tPmRlZm1vZGVpZHggICAgPSBERUZBVUxUX01PREU7CiAKLQlpdmlkZW8tPm5ld3JvbSA9IFNpU0RldGVybWluZVJPTUxheW91dDY2MSgmaXZpZGVvLT5TaVNfUHIsICZpdmlkZW8tPnNpc2h3X2V4dCk7CisJaXZpZGVvLT5uZXdyb20gPSAwOworCWlmKGl2aWRlby0+Y2hpcCA8IFhHSV8yMCkgeworCQlpZihpdmlkZW8tPmJpb3NfYWJhc2UpIHsKKwkJCWl2aWRlby0+bmV3cm9tID0gU2lTRGV0ZXJtaW5lUk9NTGF5b3V0NjYxKCZpdmlkZW8tPlNpU19Qcik7CisJCX0KKwl9CiAKIAlpZigoaXZpZGVvLT5zaXNmYl9tb2RlX2lkeCA8IDApIHx8CiAJICAgKChzaXNiaW9zX21vZGVbaXZpZGVvLT5zaXNmYl9tb2RlX2lkeF0ubW9kZV9ub1tpdmlkZW8tPm1uaV0pICE9IDB4RkYpKSB7CkBAIC01MjE3LDE5MiArNjM2NSw1NyBAQAogCiAJCXNpc2ZiX2dldF9WQl90eXBlKGl2aWRlbyk7CiAKLQkJaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfVklERU9CUklER0UpIHsKKwkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9WSURFT0JSSURHRSkgewogCQkJc2lzZmJfZGV0ZWN0X1ZCX2Nvbm5lY3QoaXZpZGVvKTsKIAkJfQogCiAJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MgPSBpdmlkZW8tPnZiZmxhZ3MgJiAoVkJfVklERU9CUklER0UgfCBUVl9TVEFOREFSRCk7CiAKLQkJaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfVklERU9CUklER0UpIHsKLQkJICAgaWYoaXZpZGVvLT5zaXNmYl9jcnQydHlwZSAhPSAtMSkgewotCQkgICAgICBpZigoaXZpZGVvLT5zaXNmYl9jcnQydHlwZSA9PSBDUlQyX0xDRCkgJiYgKGl2aWRlby0+dmJmbGFncyAmIENSVDJfTENEKSkgewotCQkgICAgICAgICBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IENSVDJfTENEOwotCQkgICAgICB9IGVsc2UgaWYoaXZpZGVvLT5zaXNmYl9jcnQydHlwZSAhPSBDUlQyX0xDRCkgewotCQkgICAgICAgICBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IGl2aWRlby0+c2lzZmJfY3J0MnR5cGU7Ci0JCSAgICAgIH0KLQkJICAgfSBlbHNlIHsKLQkJICAgICAgLyogQ2hyb250ZWwgNzAweCBUViBkZXRlY3Rpb24gb2Z0ZW4gdW5yZWxpYWJsZSwgdGhlcmVmb3JlIHVzZSBhCi0JCSAgICAgICAqIGRpZmZlcmVudCBkZWZhdWx0IG9yZGVyIG9uIHN1Y2ggbWFjaGluZXMKLQkJICAgICAgICovCi0JCSAgICAgIGlmKChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpICYmIChpdmlkZW8tPnZiZmxhZ3MgJiBWQl9DSFJPTlRFTCkpIHsKLQkJICAgICAgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9MQ0QpICAgICAgaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX0xDRDsKLQkJICAgICAgICAgZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MgJiBDUlQyX1RWKSAgaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX1RWOwotCQkgICAgICAgICBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIENSVDJfVkdBKSBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IENSVDJfVkdBOwotCQkgICAgICB9IGVsc2UgewotCQkgICAgICAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBDUlQyX1RWKSAgICAgICBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IENSVDJfVFY7Ci0JCSAgICAgICAgIGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9MQ0QpIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gQ1JUMl9MQ0Q7Ci0JCSAgICAgICAgIGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9WR0EpIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gQ1JUMl9WR0E7Ci0JCSAgICAgIH0KLQkJICAgfQorCQkvKiBEZWNpZGUgb24gd2hpY2ggQ1JUMiBkZXZpY2UgdG8gdXNlICovCisJCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfVklERU9CUklER0UpIHsKKwkJCWlmKGl2aWRlby0+c2lzZmJfY3J0MnR5cGUgIT0gLTEpIHsKKwkJCQlpZigoaXZpZGVvLT5zaXNmYl9jcnQydHlwZSA9PSBDUlQyX0xDRCkgJiYKKwkJCQkgICAoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9MQ0QpKSB7CisJCQkJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gQ1JUMl9MQ0Q7CisJCQkJfSBlbHNlIGlmKGl2aWRlby0+c2lzZmJfY3J0MnR5cGUgIT0gQ1JUMl9MQ0QpIHsKKwkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBpdmlkZW8tPnNpc2ZiX2NydDJ0eXBlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogQ2hyb250ZWwgNzAweCBUViBkZXRlY3Rpb24gb2Z0ZW4gdW5yZWxpYWJsZSwgdGhlcmVmb3JlCisJCQkJICogdXNlIGEgZGlmZmVyZW50IGRlZmF1bHQgb3JkZXIgb24gc3VjaCBtYWNoaW5lcworCQkJCSAqLworCQkJCWlmKChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpICYmCisJCQkJICAgKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfQ0hST05URUwpKSB7CisJCQkJCWlmKGl2aWRlby0+dmJmbGFncyAmIENSVDJfTENEKQorCQkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX0xDRDsKKwkJCQkJZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MgJiBDUlQyX1RWKQorCQkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX1RWOworCQkJCQllbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIENSVDJfVkdBKQorCQkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX1ZHQTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZihpdmlkZW8tPnZiZmxhZ3MgJiBDUlQyX1RWKQorCQkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX1RWOworCQkJCQllbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIENSVDJfTENEKQorCQkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX0xDRDsKKwkJCQkJZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MgJiBDUlQyX1ZHQSkKKwkJCQkJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gQ1JUMl9WR0E7CisJCQkJfQorCQkJfQogCQl9CiAKIAkJaWYoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9MQ0QpIHsKLQkJICAgaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MzYsIHJlZyk7Ci0JCSAgIHJlZyAmPSAweDBmOwotCQkgICBpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLQkJICAgICAgaXZpZGVvLT5DUlQyTENEVHlwZSA9IHNpczMwMHBhbmVsdHlwZVtyZWddOwotCQkgICB9IGVsc2UgaWYoaXZpZGVvLT5jaGlwID49IFNJU182NjEpIHsKLQkJICAgICAgaXZpZGVvLT5DUlQyTENEVHlwZSA9IHNpczY2MXBhbmVsdHlwZVtyZWddOwotCQkgICB9IGVsc2UgewotCQkgICAgICBpdmlkZW8tPkNSVDJMQ0RUeXBlID0gc2lzMzEwcGFuZWx0eXBlW3JlZ107Ci0JCSAgICAgIGlmKChpdmlkZW8tPmNoaXAgPT0gU0lTXzU1MCkgJiYgKHNpc2ZiX2ZzdG4pKSB7Ci0JCSAgICAgICAgIGlmKChpdmlkZW8tPkNSVDJMQ0RUeXBlICE9IExDRF82NDB4NDgwXzIpICYmCi0JCQkgICAgKGl2aWRlby0+Q1JUMkxDRFR5cGUgIT0gTENEXzY0MHg0ODBfMykpIHsKLQkJICAgICAgCSAgICBpdmlkZW8tPkNSVDJMQ0RUeXBlID0gTENEXzMyMHg0ODA7Ci0JCQkgfQotCQkgICAgICB9Ci0JCSAgIH0KLQkJICAgaWYoaXZpZGVvLT5DUlQyTENEVHlwZSA9PSBMQ0RfVU5LTk9XTikgewotCQkgICAgICAvKiBGb3IgYnJva2VuIEJJT1NlczogQXNzdW1lIDEwMjR4NzY4LCBSR0IxOCAqLwotCQkgICAgICBpdmlkZW8tPkNSVDJMQ0RUeXBlID0gTENEXzEwMjR4NzY4OwotCQkgICAgICBzZXRTSVNJRFhSRUcoU0lTQ1IsMHgzNiwweGYwLDB4MDIpOwotCQkgICAgICBzZXRTSVNJRFhSRUcoU0lTQ1IsMHgzNywweGVlLDB4MDEpOwotCQkgICAgICBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IEludmFsaWQgcGFuZWwgSUQgKCUwMngpLCBhc3N1bWluZyAxMDI0eDc2OCwgUkdCMThcbiIsIHJlZyk7Ci0JCSAgIH0KLQkJICAgZm9yKGkgPSAwOyBpIDwgU0lTX0xDRF9OVU1CRVI7IGkrKykgewotCQkgICAgICBpZihpdmlkZW8tPkNSVDJMQ0RUeXBlID09IHNpc19sY2RfZGF0YVtpXS5sY2R0eXBlKSB7Ci0JCSAgICAgICAgIGl2aWRlby0+bGNkeHJlcyA9IHNpc19sY2RfZGF0YVtpXS54cmVzOwotCQkJIGl2aWRlby0+bGNkeXJlcyA9IHNpc19sY2RfZGF0YVtpXS55cmVzOwotCQkJIGl2aWRlby0+bGNkZGVmbW9kZWlkeCA9IHNpc19sY2RfZGF0YVtpXS5kZWZhdWx0X21vZGVfaWR4OwotCQkJIGJyZWFrOwotCQkgICAgICB9Ci0JCSAgIH0KLQkJICAgaWYoaXZpZGVvLT5TaVNfUHIuU2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTM2NikgewotCSAgIAkJaXZpZGVvLT5sY2R4cmVzID0gMTM2MDsgaXZpZGVvLT5sY2R5cmVzID0gMTAyNDsgaXZpZGVvLT5sY2RkZWZtb2RlaWR4ID0gOTk7Ci0JCSAgIH0gZWxzZSBpZihpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCA9PSBDVVRfUEFORUw4NDgpIHsKLQkgICAJCWl2aWRlby0+bGNkeHJlcyA9ICA4NDg7IGl2aWRlby0+bGNkeXJlcyA9ICA0ODA7IGl2aWRlby0+bGNkZGVmbW9kZWlkeCA9IDQ3OwotCQkgICB9Ci0JCSAgIHByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogRGV0ZWN0ZWQgJWR4JWQgZmxhdCBwYW5lbFxuIiwKLQkJICAgCQlpdmlkZW8tPmxjZHhyZXMsIGl2aWRlby0+bGNkeXJlcyk7CisJCQlzaXNmYl9kZXRlY3RfbGNkX3R5cGUoaXZpZGVvKTsKIAkJfQogCi0jaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKLSAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSBjdXJyZW50IFBhbmVsRGVsYXlDb21wZW5zYXRpb24gaWYgdGhlIExDRCBpcyBjdXJyZW50bHkgdXNlZCAqLwotCQlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLQkgICAgICAgICAgIGlmKGl2aWRlby0+dmJmbGFncyAmIChWQl9MVkRTIHwgVkJfMzB4QkRIKSkgewotCQkgICAgICAgaW50IHRtcDsKLQkJICAgICAgIGluU0lTSURYUkVHKFNJU0NSLDB4MzAsdG1wKTsKLQkJICAgICAgIGlmKHRtcCAmIDB4MjApIHsKLQkJICAgICAgICAgIC8qIEN1cnJlbnRseSBvbiBMQ0Q/IElmIHllcywgcmVhZCBjdXJyZW50IHBkYyAqLwotCQkgICAgICAgICAgaW5TSVNJRFhSRUcoU0lTUEFSVDEsMHgxMyxpdmlkZW8tPmRldGVjdGVkcGRjKTsKLQkJCSAgaXZpZGVvLT5kZXRlY3RlZHBkYyAmPSAweDNjOwotCQkJICBpZihpdmlkZW8tPlNpU19Qci5QREMgPT0gLTEpIHsKLQkJCSAgICAgLyogTGV0IG9wdGlvbiBvdmVycmlkZSBkZXRlY3Rpb24gKi8KLQkJCSAgICAgaXZpZGVvLT5TaVNfUHIuUERDID0gaXZpZGVvLT5kZXRlY3RlZHBkYzsKLQkJCSAgfQotCQkJICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogRGV0ZWN0ZWQgTENEIFBEQyAweCUwMnhcbiIsCi0gIAkJCSAgICAgICAgIGl2aWRlby0+ZGV0ZWN0ZWRwZGMpOwotCQkgICAgICAgfQotCQkgICAgICAgaWYoKGl2aWRlby0+U2lTX1ByLlBEQyAhPSAtMSkgJiYgKGl2aWRlby0+U2lTX1ByLlBEQyAhPSBpdmlkZW8tPmRldGVjdGVkcGRjKSkgewotCQkgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFVzaW5nIExDRCBQREMgMHglMDJ4XG4iLAotCQkJCSBpdmlkZW8tPlNpU19Qci5QREMpOwotCQkgICAgICAgfQotCSAgICAgICAgICAgfQotCQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Ci0JCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCi0JCSAgIC8qIFRyeSB0byBmaW5kIGFib3V0IExDREEgKi8KLQkJICAgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUMgfCBWQl8zMDJCIHwgVkJfMzAxTFYgfCBWQl8zMDJMViB8IFZCXzMwMkVMVikpIHsKLQkJICAgICAgaW50IHRtcDsKLQkJICAgICAgaW5TSVNJRFhSRUcoU0lTUEFSVDEsMHgxMyx0bXApOwotCQkgICAgICBpZih0bXAgJiAweDA0KSB7Ci0JCSAgICAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19Vc2VMQ0RBID0gVFJVRTsKLQkJICAgICAgICAgaXZpZGVvLT5kZXRlY3RlZGxjZGEgPSAweDAzOwotCQkgICAgICB9Ci0JICAgICAgICAgICB9Ci0KLQkJICAgLyogU2F2ZSBQREMgKi8KLQkJICAgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUxWIHwgVkJfMzAyTFYgfCBWQl8zMDJFTFYpKSB7Ci0JCSAgICAgIGludCB0bXA7Ci0JCSAgICAgIGluU0lTSURYUkVHKFNJU0NSLDB4MzAsdG1wKTsKLQkJICAgICAgaWYoKHRtcCAmIDB4MjApIHx8IChpdmlkZW8tPmRldGVjdGVkbGNkYSAhPSAweGZmKSkgewotCQkgICAgICAgICAvKiBDdXJyZW50bHkgb24gTENEPyBJZiB5ZXMsIHJlYWQgY3VycmVudCBwZGMgKi8KLQkJCSB1OCBwZGM7Ci0JCSAgICAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQxLDB4MkQscGRjKTsKLQkJCSBpdmlkZW8tPmRldGVjdGVkcGRjICA9IChwZGMgJiAweDBmKSA8PCAxOwotCQkJIGl2aWRlby0+ZGV0ZWN0ZWRwZGNhID0gKHBkYyAmIDB4ZjApID4+IDM7Ci0JCQkgaW5TSVNJRFhSRUcoU0lTUEFSVDEsMHgzNSxwZGMpOwotCQkJIGl2aWRlby0+ZGV0ZWN0ZWRwZGMgfD0gKChwZGMgPj4gNykgJiAweDAxKTsKLQkJCSBpblNJU0lEWFJFRyhTSVNQQVJUMSwweDIwLHBkYyk7Ci0JCQkgaXZpZGVvLT5kZXRlY3RlZHBkY2EgfD0gKChwZGMgPj4gNikgJiAweDAxKTsKLQkJCSBpZihpdmlkZW8tPm5ld3JvbSkgewotCQkJICAgIC8qIE5ldyBST00gaW52YWxpZGF0ZXMgb3RoZXIgUERDIHJlc3AuICovCi0JCQkgICAgaWYoaXZpZGVvLT5kZXRlY3RlZGxjZGEgIT0gMHhmZikgewotCQkJICAgICAgIGl2aWRlby0+ZGV0ZWN0ZWRwZGMgPSAweGZmOwotCQkJICAgIH0gZWxzZSB7Ci0JCQkgICAgICAgaXZpZGVvLT5kZXRlY3RlZHBkY2EgPSAweGZmOwotCQkJICAgIH0KLQkJCSB9Ci0JCQkgaWYoaXZpZGVvLT5TaVNfUHIuUERDID09IC0xKSB7Ci0JCQkgICAgaWYoaXZpZGVvLT5kZXRlY3RlZHBkYyAhPSAweGZmKSB7Ci0JCQkgICAgICAgaXZpZGVvLT5TaVNfUHIuUERDID0gaXZpZGVvLT5kZXRlY3RlZHBkYzsKLQkJCSAgICB9Ci0JCQkgfQotCQkJIGlmKGl2aWRlby0+U2lTX1ByLlBEQ0EgPT0gLTEpIHsKLQkJCSAgICBpZihpdmlkZW8tPmRldGVjdGVkcGRjYSAhPSAweGZmKSB7Ci0JCQkgICAgICAgaXZpZGVvLT5TaVNfUHIuUERDQSA9IGl2aWRlby0+ZGV0ZWN0ZWRwZGNhOwotCQkJICAgIH0KLQkJCSB9Ci0JCQkgaWYoaXZpZGVvLT5kZXRlY3RlZHBkYyAhPSAweGZmKSB7Ci0JCQkgICAgcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICAgInNpc2ZiOiBEZXRlY3RlZCBMQ0QgUERDIDB4JTAyeCAoZm9yIExDRD1DUlQyKVxuIiwKLSAgCQkJICAgICAgICAgIGl2aWRlby0+ZGV0ZWN0ZWRwZGMpOwotCQkJIH0KLQkJCSBpZihpdmlkZW8tPmRldGVjdGVkcGRjYSAhPSAweGZmKSB7Ci0JCQkgICAgcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICAgInNpc2ZiOiBEZXRlY3RlZCBMQ0QgUERDMSAweCUwMnggKGZvciBMQ0Q9Q1JUMSlcbiIsCi0gIAkJCSAgICAgICAgICBpdmlkZW8tPmRldGVjdGVkcGRjYSk7Ci0JCQkgfQotCQkgICAgICB9Ci0KLQkJICAgICAgLyogU2F2ZSBFTUkgKi8KLQkJICAgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMkxWIHwgVkJfMzAyRUxWKSkgewotCQkgICAgICAgICBpblNJU0lEWFJFRyhTSVNQQVJUNCwweDMwLGl2aWRlby0+U2lTX1ByLkVNSV8zMCk7Ci0JCQkgaW5TSVNJRFhSRUcoU0lTUEFSVDQsMHgzMSxpdmlkZW8tPlNpU19Qci5FTUlfMzEpOwotCQkJIGluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MzIsaXZpZGVvLT5TaVNfUHIuRU1JXzMyKTsKLQkJCSBpblNJU0lEWFJFRyhTSVNQQVJUNCwweDMzLGl2aWRlby0+U2lTX1ByLkVNSV8zMyk7Ci0JCQkgaXZpZGVvLT5TaVNfUHIuSGF2ZUVNSSA9IFRSVUU7Ci0JCQkgaWYoKHRtcCAmIDB4MjApIHx8IChpdmlkZW8tPmRldGVjdGVkbGNkYSAhPSAweGZmKSkgewotCQkJICAJaXZpZGVvLT5TaVNfUHIuSGF2ZUVNSUxDRCA9IFRSVUU7Ci0JCQkgfQotCQkgICAgICB9Ci0JCSAgIH0KLQotCQkgICAvKiBMZXQgdXNlciBvdmVycmlkZSBkZXRlY3RlZCBQRENzIChhbGwgYnJpZGdlcykgKi8KLQkJICAgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUIgfCBWQl8zMDFDIHwgVkJfMzAxTFYgfCBWQl8zMDJMViB8IFZCXzMwMkVMVikpIHsKLQkJICAgICAgaWYoKGl2aWRlby0+U2lTX1ByLlBEQyAhPSAtMSkgJiYgKGl2aWRlby0+U2lTX1ByLlBEQyAhPSBpdmlkZW8tPmRldGVjdGVkcGRjKSkgewotCQkgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogVXNpbmcgTENEIFBEQyAweCUwMnggKGZvciBMQ0Q9Q1JUMilcbiIsCi0JCQkJIGl2aWRlby0+U2lTX1ByLlBEQyk7Ci0JCSAgICAgIH0KLQkJICAgICAgaWYoKGl2aWRlby0+U2lTX1ByLlBEQ0EgIT0gLTEpICYmIChpdmlkZW8tPlNpU19Qci5QRENBICE9IGl2aWRlby0+ZGV0ZWN0ZWRwZGNhKSkgewotCQkgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogVXNpbmcgTENEIFBEQzEgMHglMDJ4IChmb3IgTENEPUNSVDEpXG4iLAotCQkJCSBpdmlkZW8tPlNpU19Qci5QRENBKTsKLQkJICAgICAgfQotCQkgICB9Ci0KLQkJfQotI2VuZGlmCisJCXNpc2ZiX3NhdmVfcGRjX2VtaShpdmlkZW8pOwogCiAJCWlmKCFpdmlkZW8tPnNpc2ZiX2NydDFvZmYpIHsKLQkJICAgCXNpc2ZiX2hhbmRsZV9kZGMoaXZpZGVvLCAmaXZpZGVvLT5zaXNmYl90aGlzbW9uaXRvciwgMCk7CisJCQlzaXNmYl9oYW5kbGVfZGRjKGl2aWRlbywgJml2aWRlby0+c2lzZmJfdGhpc21vbml0b3IsIDApOwogCQl9IGVsc2UgewotCQkgICAJaWYoKGl2aWRlby0+dmJmbGFncyAmIChWQl8zMDF8VkJfMzAxQnxWQl8zMDFDfFZCXzMwMkIpKSAmJgotCQkgICAgICAJICAgKGl2aWRlby0+dmJmbGFncyAmIChDUlQyX1ZHQSB8IENSVDJfTENEKSkpIHsKLQkJICAgICAgCQlzaXNmYl9oYW5kbGVfZGRjKGl2aWRlbywgJml2aWRlby0+c2lzZmJfdGhpc21vbml0b3IsIDEpOwotCQkgICAJfQorCQkJaWYoKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTVE1EU0JSSURHRSkgJiYKKwkJCSAgIChpdmlkZW8tPnZiZmxhZ3MgJiAoQ1JUMl9WR0EgfCBDUlQyX0xDRCkpKSB7CisJCQkJc2lzZmJfaGFuZGxlX2RkYyhpdmlkZW8sICZpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLCAxKTsKKwkJCX0KIAkJfQogCiAJCWlmKGl2aWRlby0+c2lzZmJfbW9kZV9pZHggPj0gMCkgewpAQCAtNTQzNCw3ICs2NDQ3LDggQEAKIAkJaXZpZGVvLT5tb2RlX25vID0gc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldOwogCiAJCWlmKGl2aWRlby0+cmVmcmVzaF9yYXRlICE9IDApIHsKLQkJCXNpc2ZiX3NlYXJjaF9yZWZyZXNoX3JhdGUoaXZpZGVvLCBpdmlkZW8tPnJlZnJlc2hfcmF0ZSwgaXZpZGVvLT5zaXNmYl9tb2RlX2lkeCk7CisJCQlzaXNmYl9zZWFyY2hfcmVmcmVzaF9yYXRlKGl2aWRlbywgaXZpZGVvLT5yZWZyZXNoX3JhdGUsCisJCQkJCQlpdmlkZW8tPnNpc2ZiX21vZGVfaWR4KTsKIAkJfQogCiAJCWlmKGl2aWRlby0+cmF0ZV9pZHggPT0gMCkgewpAQCAtNTQ0Myw5ICs2NDU3LDEyIEBACiAJCX0KIAogCQlpZihpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLmRhdGF2YWxpZCkgewotCQkJaWYoIXNpc2ZiX3ZlcmlmeV9yYXRlKGl2aWRlbywgJml2aWRlby0+c2lzZmJfdGhpc21vbml0b3IsIGl2aWRlby0+c2lzZmJfbW9kZV9pZHgsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgaXZpZGVvLT5yYXRlX2lkeCwgaXZpZGVvLT5yZWZyZXNoX3JhdGUpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFdBUk5JTkc6IFJlZnJlc2ggcmF0ZSBleGNlZWRzIG1vbml0b3Igc3BlY3MhXG4iKTsKKwkJCWlmKCFzaXNmYl92ZXJpZnlfcmF0ZShpdmlkZW8sICZpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLAorCQkJCQkJaXZpZGVvLT5zaXNmYl9tb2RlX2lkeCwKKwkJCQkJCWl2aWRlby0+cmF0ZV9pZHgsCisJCQkJCQlpdmlkZW8tPnJlZnJlc2hfcmF0ZSkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogV0FSTklORzogUmVmcmVzaCByYXRlICIKKwkJCQkJCQkiZXhjZWVkcyBtb25pdG9yIHNwZWNzIVxuIik7CiAJCQl9CiAJCX0KIApAQCAtNTQ1NCwyOCArNjQ3MSwzNCBAQAogCQlpdmlkZW8tPnZpZGVvX2hlaWdodCA9IHNpc2Jpb3NfbW9kZVtpdmlkZW8tPnNpc2ZiX21vZGVfaWR4XS55cmVzOwogCiAJCXNpc2ZiX3NldF92cGFybXMoaXZpZGVvKTsKLQkJCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCQogCi0JCS8qIC0tLS0tLS0tLS0tLS0tLS0gRm9yIDIuNDogTm93IHN3aXRjaCB0aGUgbW9kZSAtLS0tLS0tLS0tLS0tLS0tLS0gKi8JCQotCQkKLQkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IE1vZGUgaXMgJWR4JWR4JWQgKCVkSHopXG4iLAotCSAgICAgICAJCWl2aWRlby0+dmlkZW9fd2lkdGgsIGl2aWRlby0+dmlkZW9faGVpZ2h0LCBpdmlkZW8tPnZpZGVvX2JwcCwKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tIEZvciAyLjQ6IE5vdyBzd2l0Y2ggdGhlIG1vZGUgLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFNldHRpbmcgbW9kZSAlZHglZHglZCAoJWRIeilcbiIsCisJCQlpdmlkZW8tPnZpZGVvX3dpZHRoLCBpdmlkZW8tPnZpZGVvX2hlaWdodCwgaXZpZGVvLT52aWRlb19icHAsCiAJCQlpdmlkZW8tPnJlZnJlc2hfcmF0ZSk7CiAKKwkJLyogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGFjY2VsZXJhdGlvbiBpcyB0byBiZQorCQkgKiB1c2VkLiBOZWVkIHRvIGtub3cgYmVmb3JlIHByZS9wb3N0X3NldF9tb2RlKCkKKwkJICovCisJCWl2aWRlby0+YWNjZWwgPSAwOworCQlpdmlkZW8tPmRlZmF1bHRfdmFyLmFjY2VsX2ZsYWdzICY9IH5GQl9BQ0NFTEZfVEVYVDsKKwkJaWYoaXZpZGVvLT5zaXNmYl9hY2NlbCkgeworCQkJaXZpZGVvLT5hY2NlbCA9IC0xOworCQkJaXZpZGVvLT5kZWZhdWx0X3Zhci5hY2NlbF9mbGFncyB8PSBGQl9BQ0NFTEZfVEVYVDsKKwkJfQorCisJCS8qIE5vdyBzd2l0Y2ggdGhlIG1vZGUgKi8KIAkJc2lzZmJfcHJlX3NldG1vZGUoaXZpZGVvKTsKIAotCQlpZihTaVNTZXRNb2RlKCZpdmlkZW8tPlNpU19QciwgJml2aWRlby0+c2lzaHdfZXh0LCBpdmlkZW8tPm1vZGVfbm8pID09IDApIHsKKwkJaWYoU2lTU2V0TW9kZSgmaXZpZGVvLT5TaVNfUHIsIGl2aWRlby0+bW9kZV9ubykgPT0gMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogRmF0YWwgZXJyb3I6IFNldHRpbmcgbW9kZVsweCV4XSBmYWlsZWRcbiIsCiAJCQkJCQkJCQlpdmlkZW8tPm1vZGVfbm8pOwotCQkJaW91bm1hcChpdmlkZW8tPnZpZGVvX3ZiYXNlKTsKKwkJCXJldCA9IC1FSU5WQUw7CiAJCQlpb3VubWFwKGl2aWRlby0+bW1pb192YmFzZSk7Ci0JCQlyZWxlYXNlX21lbV9yZWdpb24oaXZpZGVvLT52aWRlb19iYXNlLCBpdmlkZW8tPnZpZGVvX3NpemUpOwotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGl2aWRlby0+bW1pb19iYXNlLCBpdmlkZW8tPm1taW9fc2l6ZSk7Ci0JCQlpZihpdmlkZW8tPmJpb3NfYWJhc2UpIHZmcmVlKGl2aWRlby0+Ymlvc19hYmFzZSk7Ci0JCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JCQlrZnJlZShzaXNfZmJfaW5mbyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3JfMDsKIAkJfQogCiAJCW91dFNJU0lEWFJFRyhTSVNTUiwgSU5EX1NJU19QQVNTV09SRCwgU0lTX1BBU1NXT1JEKTsKQEAgLTU0ODgsMTggKzY1MTEsMTcgQEAKIAkJLyogRm9yY2UgcmVzZXQgb2YgeCB2aXJ0dWFsIGluIGNydGNfdG9fdmFyICovCiAJCWl2aWRlby0+ZGVmYXVsdF92YXIueHJlc192aXJ0dWFsID0gMDsKIAorCQkvKiBDb3B5IG1vZGUgdGltaW5nIHRvIHZhciAqLwogCQlzaXNmYl9jcnRjX3RvX3ZhcihpdmlkZW8sICZpdmlkZW8tPmRlZmF1bHRfdmFyKTsKIAorCQkvKiBGaW5kIG91dCBhYm91dCBzY3JlZW4gcGl0Y2ggKi8KIAkJc2lzZmJfY2FsY19waXRjaChpdmlkZW8sICZpdmlkZW8tPmRlZmF1bHRfdmFyKTsKIAkJc2lzZmJfc2V0X3BpdGNoKGl2aWRlbyk7CiAKLQkJaXZpZGVvLT5hY2NlbCA9IDA7Ci0JCWlmKGl2aWRlby0+c2lzZmJfYWNjZWwpIHsKLQkJICAgaXZpZGVvLT5hY2NlbCA9IC0xOwotCQkgICBpdmlkZW8tPmRlZmF1bHRfdmFyLmFjY2VsX2ZsYWdzIHw9IEZCX0FDQ0VMRl9URVhUOwotCQl9CisJCS8qIEluaXQgdGhlIGFjY2VsZXJhdG9yIChkb2VzIG5vdGhpbmcgY3VycmVudGx5KSAqLwogCQlzaXNmYl9pbml0YWNjZWwoaXZpZGVvKTsKLQkJCisKKwkJLyogSW5pdCBzb21lIGZiaW5mbyBlbnRyaWVzICovCiAJCXNpc19mYl9pbmZvLT5ub2RlICA9IC0xOwogCQlzaXNfZmJfaW5mby0+ZmxhZ3MgPSBGQklORk9fRkxBR19ERUZBVUxUOwogCQlzaXNfZmJfaW5mby0+ZmJvcHMgPSAmc2lzZmJfb3BzOwpAQCAtNTUxNSw0MSArNjUzNyw0MiBAQAogI2Vsc2UJCS8qIC0tLS0tLS0tLSBGb3IgMi42OiBTZXR1cCBhIHNvbWV3aGF0IHNhbmUgZGVmYXVsdCB2YXIgLS0tLS0tLS0tLS0tICovCiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IERlZmF1bHQgbW9kZSBpcyAlZHglZHglZCAoJWRIeilcbiIsCi0JICAgICAgIAkJaXZpZGVvLT52aWRlb193aWR0aCwgaXZpZGVvLT52aWRlb19oZWlnaHQsIGl2aWRlby0+dmlkZW9fYnBwLAorCQkJaXZpZGVvLT52aWRlb193aWR0aCwgaXZpZGVvLT52aWRlb19oZWlnaHQsIGl2aWRlby0+dmlkZW9fYnBwLAogCQkJaXZpZGVvLT5yZWZyZXNoX3JhdGUpOwogCisJCS8qIFNldCB1cCB0aGUgZGVmYXVsdCB2YXIgYWNjb3JkaW5nIHRvIGNob3NlbiBkZWZhdWx0IGRpc3BsYXkgbW9kZSAqLwogCQlpdmlkZW8tPmRlZmF1bHRfdmFyLnhyZXMgPSBpdmlkZW8tPmRlZmF1bHRfdmFyLnhyZXNfdmlydHVhbCA9IGl2aWRlby0+dmlkZW9fd2lkdGg7CiAJCWl2aWRlby0+ZGVmYXVsdF92YXIueXJlcyA9IGl2aWRlby0+ZGVmYXVsdF92YXIueXJlc192aXJ0dWFsID0gaXZpZGVvLT52aWRlb19oZWlnaHQ7CiAJCWl2aWRlby0+ZGVmYXVsdF92YXIuYml0c19wZXJfcGl4ZWwgPSBpdmlkZW8tPnZpZGVvX2JwcDsKIAogCQlzaXNmYl9icHBfdG9fdmFyKGl2aWRlbywgJml2aWRlby0+ZGVmYXVsdF92YXIpOwotCQkKKwogCQlpdmlkZW8tPmRlZmF1bHRfdmFyLnBpeGNsb2NrID0gKHUzMikgKDEwMDAwMDAwMDAgLwotCQkJCXNpc2ZiX21vZGVfcmF0ZV90b19kY2xvY2soJml2aWRlby0+U2lTX1ByLCAmaXZpZGVvLT5zaXNod19leHQsCi0JCQkJCQlpdmlkZW8tPm1vZGVfbm8sIGl2aWRlby0+cmF0ZV9pZHgpKTsKLQkJCQkJCQotCQlpZihzaXNmYl9tb2RlX3JhdGVfdG9fZGRhdGEoJml2aWRlby0+U2lTX1ByLCAmaXZpZGVvLT5zaXNod19leHQsCi0JCQkgCWl2aWRlby0+bW9kZV9ubywgaXZpZGVvLT5yYXRlX2lkeCwgJml2aWRlby0+ZGVmYXVsdF92YXIpKSB7Ci0JCSAgIGlmKChpdmlkZW8tPmRlZmF1bHRfdmFyLnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfRE9VQkxFKSB7Ci0JCSAgICAgIGl2aWRlby0+ZGVmYXVsdF92YXIucGl4Y2xvY2sgPDw9IDE7Ci0JICAgCSAgIH0KLQkgICAgICAgIH0KKwkJCXNpc2ZiX21vZGVfcmF0ZV90b19kY2xvY2soJml2aWRlby0+U2lTX1ByLCBpdmlkZW8tPm1vZGVfbm8sIGl2aWRlby0+cmF0ZV9pZHgpKTsKKworCQlpZihzaXNmYl9tb2RlX3JhdGVfdG9fZGRhdGEoJml2aWRlby0+U2lTX1ByLCBpdmlkZW8tPm1vZGVfbm8sCisJCQkJCQlpdmlkZW8tPnJhdGVfaWR4LCAmaXZpZGVvLT5kZWZhdWx0X3ZhcikpIHsKKwkJCWlmKChpdmlkZW8tPmRlZmF1bHRfdmFyLnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfRE9VQkxFKSB7CisJCQkJaXZpZGVvLT5kZWZhdWx0X3Zhci5waXhjbG9jayA8PD0gMTsKKwkJCX0KKwkJfQogCiAJCWlmKGl2aWRlby0+c2lzZmJfeXBhbikgewotCQkgICAvKiBNYXhpbWl6ZSByZWdhcmRsZXNzIG9mIHNpc2ZiX21heCBhdCBzdGFydHVwICovCi0JICAgIAkgICBpdmlkZW8tPmRlZmF1bHRfdmFyLnlyZXNfdmlydHVhbCA9IHNpc2ZiX2NhbGNfbWF4eXJlcyhpdmlkZW8sICZpdmlkZW8tPmRlZmF1bHRfdmFyKTsKLQkgICAgCSAgIGlmKGl2aWRlby0+ZGVmYXVsdF92YXIueXJlc192aXJ0dWFsIDwgaXZpZGVvLT5kZWZhdWx0X3Zhci55cmVzKSB7Ci0JICAgICAgICAgICAgICBpdmlkZW8tPmRlZmF1bHRfdmFyLnlyZXNfdmlydHVhbCA9IGl2aWRlby0+ZGVmYXVsdF92YXIueXJlczsKLQkgICAgCSAgIH0KKwkJCS8qIE1heGltaXplIHJlZ2FyZGxlc3Mgb2Ygc2lzZmJfbWF4IGF0IHN0YXJ0dXAgKi8KKwkJCWl2aWRlby0+ZGVmYXVsdF92YXIueXJlc192aXJ0dWFsID0KKwkJCQlzaXNmYl9jYWxjX21heHlyZXMoaXZpZGVvLCAmaXZpZGVvLT5kZWZhdWx0X3Zhcik7CisJCQlpZihpdmlkZW8tPmRlZmF1bHRfdmFyLnlyZXNfdmlydHVhbCA8IGl2aWRlby0+ZGVmYXVsdF92YXIueXJlcykgeworCQkJCWl2aWRlby0+ZGVmYXVsdF92YXIueXJlc192aXJ0dWFsID0gaXZpZGVvLT5kZWZhdWx0X3Zhci55cmVzOworCQkJfQogCQl9CiAKIAkJc2lzZmJfY2FsY19waXRjaChpdmlkZW8sICZpdmlkZW8tPmRlZmF1bHRfdmFyKTsKIAogCQlpdmlkZW8tPmFjY2VsID0gMDsKIAkJaWYoaXZpZGVvLT5zaXNmYl9hY2NlbCkgewotCQkgICBpdmlkZW8tPmFjY2VsID0gLTE7CisJCQlpdmlkZW8tPmFjY2VsID0gLTE7CiAjaWZkZWYgU1RVUElEX0FDQ0VMRl9URVhUX1NISVQKLQkJICAgaXZpZGVvLT5kZWZhdWx0X3Zhci5hY2NlbF9mbGFncyB8PSBGQl9BQ0NFTEZfVEVYVDsKKwkJCWl2aWRlby0+ZGVmYXVsdF92YXIuYWNjZWxfZmxhZ3MgfD0gRkJfQUNDRUxGX1RFWFQ7CiAjZW5kaWYKIAkJfQogCQlzaXNmYl9pbml0YWNjZWwoaXZpZGVvKTsKQEAgLTU1NjYsMjEgKzY1ODksMjEgQEAKICNlbmRpZgogCQlzaXNfZmJfaW5mby0+dmFyID0gaXZpZGVvLT5kZWZhdWx0X3ZhcjsKIAkJc2lzX2ZiX2luZm8tPmZpeCA9IGl2aWRlby0+c2lzZmJfZml4OwotCQlzaXNfZmJfaW5mby0+c2NyZWVuX2Jhc2UgPSBpdmlkZW8tPnZpZGVvX3ZiYXNlOworCQlzaXNfZmJfaW5mby0+c2NyZWVuX2Jhc2UgPSBpdmlkZW8tPnZpZGVvX3ZiYXNlICsgaXZpZGVvLT52aWRlb19vZmZzZXQ7CiAJCXNpc19mYl9pbmZvLT5mYm9wcyA9ICZzaXNmYl9vcHM7CiAKIAkJc2lzZmJfZ2V0X2ZpeCgmc2lzX2ZiX2luZm8tPmZpeCwgLTEsIHNpc19mYl9pbmZvKTsKIAkJc2lzX2ZiX2luZm8tPnBzZXVkb19wYWxldHRlID0gaXZpZGVvLT5wc2V1ZG9fcGFsZXR0ZTsKLQkJCisKIAkJZmJfYWxsb2NfY21hcCgmc2lzX2ZiX2luZm8tPmNtYXAsIDI1NiAsIDApOwogI2VuZGlmCQkvKiAyLjYgKi8KIAotCQlwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IEluaXRpYWwgdmJmbGFncyAweCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpaXZpZGVvLT52YmZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiBJbml0aWFsIHZiZmxhZ3MgMHgleFxuIiwgKGludClpdmlkZW8tPnZiZmxhZ3MpOwogCiAjaWZkZWYgQ09ORklHX01UUlIKIAkJaXZpZGVvLT5tdHJyID0gbXRycl9hZGQoaXZpZGVvLT52aWRlb19iYXNlLCBpdmlkZW8tPnZpZGVvX3NpemUsCiAJCQkJCU1UUlJfVFlQRV9XUkNPTUIsIDEpOwotCQlpZighaXZpZGVvLT5tdHJyKSB7CisJCWlmKGl2aWRlby0+bXRyciA8IDApIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogRmFpbGVkIHRvIGFkZCBNVFJSc1xuIik7CiAJCX0KICNlbmRpZgpAQCAtNTU5MSwxNCArNjYxNCw5IEBACiAKIAkJaWYocmVnaXN0ZXJfZnJhbWVidWZmZXIoc2lzX2ZiX2luZm8pIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogRmF0YWwgZXJyb3I6IEZhaWxlZCB0byByZWdpc3RlciBmcmFtZWJ1ZmZlclxuIik7Ci0JCQlpb3VubWFwKGl2aWRlby0+dmlkZW9fdmJhc2UpOworCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWlvdW5tYXAoaXZpZGVvLT5tbWlvX3ZiYXNlKTsKLQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihpdmlkZW8tPnZpZGVvX2Jhc2UsIGl2aWRlby0+dmlkZW9fc2l6ZSk7Ci0JCQlyZWxlYXNlX21lbV9yZWdpb24oaXZpZGVvLT5tbWlvX2Jhc2UsIGl2aWRlby0+bW1pb19zaXplKTsKLQkJCWlmKGl2aWRlby0+Ymlvc19hYmFzZSkgdmZyZWUoaXZpZGVvLT5iaW9zX2FiYXNlKTsKLQkJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQkJCWtmcmVlKHNpc19mYl9pbmZvKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJZ290byBlcnJvcl8wOwogCQl9CiAKIAkJaXZpZGVvLT5yZWdpc3RlcmVkID0gMTsKQEAgLTU2MDcsMjEgKzY2MjUsNDcgQEAKIAkJaXZpZGVvLT5uZXh0ID0gY2FyZF9saXN0OwogCQljYXJkX2xpc3QgPSBpdmlkZW87CiAKKyNpZmRlZiBTSVNfT0xEX0NPTkZJR19DT01QQVQKKwkJeworCQlpbnQgcmV0OworCQkvKiBPdXIgaW9jdGxzIGFyZSBhbGwgIjMyLzY0Yml0IGNvbXBhdGlibGUiICovCisJCXJldCA9ICByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oRkJJT19BTExPQywgICAgICAgICAgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oRkJJT19GUkVFLCAgICAgICAgICAgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oRkJJT0dFVF9WQkxBTkssICAgICAgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX0lORk9fU0laRSwgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX0lORk8sICAgICAgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX1RWUE9TT0ZGU0VULCAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfU0VUX1RWUE9TT0ZGU0VULCAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfU0VUX0xPQ0ssICAgICAgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX1ZCUlNUQVRVUywgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX0FVVE9NQVhJTUlaRSwgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfU0VUX0FVVE9NQVhJTUlaRSwgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfQ09NTUFORCwgICAgICAgICAgTlVMTCk7CisJCWlmKHJldCkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJzaXNmYjogRXJyb3IgcmVnaXN0ZXJpbmcgaW9jdGwzMiB0cmFuc2xhdGlvbnNcbiIpOworCQllbHNlCisJCQlpdmlkZW8tPmlvY3RsMzJyZWdpc3RlcmVkID0gMTsKKwkJfQorI2VuZGlmCisKIAkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IDJEIGFjY2VsZXJhdGlvbiBpcyAlcywgeS1wYW5uaW5nICVzXG4iLAotCQkgICAgIGl2aWRlby0+c2lzZmJfYWNjZWwgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAotCQkgICAgIGl2aWRlby0+c2lzZmJfeXBhbiAgPwotCQkgICAgIAkoaXZpZGVvLT5zaXNmYl9tYXggPyAiZW5hYmxlZCAoYXV0by1tYXgpIiA6ICJlbmFibGVkIChubyBhdXRvLW1heCkiKSA6ICJkaXNhYmxlZCIpOworCQkJaXZpZGVvLT5zaXNmYl9hY2NlbCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsCisJCQlpdmlkZW8tPnNpc2ZiX3lwYW4gID8KKwkJCQkoaXZpZGVvLT5zaXNmYl9tYXggPyAiZW5hYmxlZCAoYXV0by1tYXgpIiA6CisJCQkJCQkiZW5hYmxlZCAobm8gYXV0by1tYXgpIikgOgorCQkJCQkJCQkJImRpc2FibGVkIik7CiAKIAotCQlwcmludGsoS0VSTl9JTkZPICJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlLCBWZXJzaW9uICVkLiVkLiVkXG4iLAorCQlwcmludGsoS0VSTl9JTkZPICJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlIHZlcnNpb24gJWQuJWQuJWRcbiIsCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0JICAgICAgIAkJR0VUX0ZCX0lEWChzaXNfZmJfaW5mby0+bm9kZSksCisJCQlHRVRfRkJfSURYKHNpc19mYl9pbmZvLT5ub2RlKSwKICNlbHNlCi0JICAgICAgIAkJc2lzX2ZiX2luZm8tPm5vZGUsCisJCQlzaXNfZmJfaW5mby0+bm9kZSwKICNlbmRpZgogCQkJaXZpZGVvLT5teWlkLCBWRVJfTUFKT1IsIFZFUl9NSU5PUiwgVkVSX0xFVkVMKTsKIAotCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogKEMpIDIwMDEtMjAwNCBUaG9tYXMgV2luaXNjaGhvZmVyLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBUaG9tYXMgV2luaXNjaGhvZmVyXG4iKTsKIAogCX0JLyogaWYgbW9kZSA9ICJub25lIiAqLwogCkBAIC01NjM0LDI2ICs2Njc4LDYyIEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzaXNmYl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGZiX2luZm8gICAgICAgICpzaXNfZmJfaW5mbyA9IGl2aWRlby0+bWVteXNlbGZhbmRpOwotCWludCAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkID0gaXZpZGVvLT5yZWdpc3RlcmVkOworCXN0cnVjdCBzaXNfdmlkZW9faW5mbwkqaXZpZGVvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBmYl9pbmZvCQkqc2lzX2ZiX2luZm8gPSBpdmlkZW8tPm1lbXlzZWxmYW5kaTsKKwlpbnQJCQlyZWdpc3RlcmVkID0gaXZpZGVvLT5yZWdpc3RlcmVkOworCWludAkJCW1vZGVjaGFuZ2VkID0gaXZpZGVvLT5tb2RlY2hhbmdlZDsKKworI2lmZGVmIFNJU19PTERfQ09ORklHX0NPTVBBVAorCWlmKGl2aWRlby0+aW9jdGwzMnJlZ2lzdGVyZWQpIHsKKwkJaW50IHJldDsKKwkJcmV0ID0gIHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKEZCSU9fQUxMT0MpOworCQlyZXQgfD0gdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oRkJJT19GUkVFKTsKKwkJcmV0IHw9IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKEZCSU9HRVRfVkJMQU5LKTsKKwkJcmV0IHw9IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKFNJU0ZCX0dFVF9JTkZPX1NJWkUpOworCQlyZXQgfD0gdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX0lORk8pOworCQlyZXQgfD0gdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX1RWUE9TT0ZGU0VUKTsKKwkJcmV0IHw9IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKFNJU0ZCX1NFVF9UVlBPU09GRlNFVCk7CisJCXJldCB8PSB1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbihTSVNGQl9TRVRfTE9DSyk7CisJCXJldCB8PSB1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbihTSVNGQl9HRVRfVkJSU1RBVFVTKTsKKwkJcmV0IHw9IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKFNJU0ZCX0dFVF9BVVRPTUFYSU1JWkUpOworCQlyZXQgfD0gdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfU0VUX0FVVE9NQVhJTUlaRSk7CisJCXJldCB8PSB1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbihTSVNGQl9DT01NQU5EKTsKKwkJaWYocmV0KQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICJzaXNmYjogRXJyb3IgdW5yZWdpc3RlcmluZyBpb2N0bDMyIHRyYW5zbGF0aW9uc1xuIik7CisJfQorI2VuZGlmCiAKIAkvKiBVbm1hcCAqLwotCWlvdW5tYXAoaXZpZGVvLT52aWRlb192YmFzZSk7CiAJaW91bm1hcChpdmlkZW8tPm1taW9fdmJhc2UpOwotCXZmcmVlKGl2aWRlby0+Ymlvc19hYmFzZSk7CisJaW91bm1hcChpdmlkZW8tPnZpZGVvX3ZiYXNlKTsKIAogCS8qIFJlbGVhc2UgbWVtIHJlZ2lvbnMgKi8KIAlyZWxlYXNlX21lbV9yZWdpb24oaXZpZGVvLT52aWRlb19iYXNlLCBpdmlkZW8tPnZpZGVvX3NpemUpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihpdmlkZW8tPm1taW9fYmFzZSwgaXZpZGVvLT5tbWlvX3NpemUpOwogCisJdmZyZWUoaXZpZGVvLT5iaW9zX2FiYXNlKTsKKworCWlmKGl2aWRlby0+bHBjZGV2KQorCQlTSVNfUENJX1BVVF9ERVZJQ0UoaXZpZGVvLT5scGNkZXYpOworCisJaWYoaXZpZGVvLT5uYnJpZGdlKQorCQlTSVNfUENJX1BVVF9ERVZJQ0UoaXZpZGVvLT5uYnJpZGdlKTsKKwogI2lmZGVmIENPTkZJR19NVFJSCiAJLyogUmVsZWFzZSBNVFJSIHJlZ2lvbiAqLwotCWlmKGl2aWRlby0+bXRycikgeworCWlmKGl2aWRlby0+bXRyciA+PSAwKQogCQltdHJyX2RlbChpdmlkZW8tPm10cnIsIGl2aWRlby0+dmlkZW9fYmFzZSwgaXZpZGVvLT52aWRlb19zaXplKTsKLQl9CiAjZW5kaWYKIAorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCS8qIElmIGRldmljZSB3YXMgZGlzYWJsZWQgd2hlbiBzdGFydGluZywgZGlzYWJsZQorCSAqIGl0IHdoZW4gcXVpdHRpbmcuCisJICovCisJaWYoIWl2aWRlby0+c2lzdmdhX2VuYWJsZWQpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwogCS8qIFVucmVnaXN0ZXIgdGhlIGZyYW1lYnVmZmVyICovCiAJaWYoaXZpZGVvLT5yZWdpc3RlcmVkKSB7CiAJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoc2lzX2ZiX2luZm8pOwpAQCAtNTY2NCw3ICs2NzQ0LDcgQEAKICNlbmRpZgogCX0KIAotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwkvKiBPSywgb3VyIGl2aWRlbyBpcyBnb25lIGZvciBnb29kIGZyb20gaGVyZS4gKi8KIAogCS8qIFRPRE86IFJlc3RvcmUgdGhlIGluaXRpYWwgbW9kZQogCSAqIFRoaXMgc291bmRzIGVhc3kgYnV0IGlzIGFzIGdvb2QgYXMgaW1wb3NzaWJsZQpAQCAtNTY3MywxNSArNjc1MywxNSBAQAogCSAqIGZyb20gbWFjaGluZSB0byBtYWNoaW5lLiBEZXBlbmRzIG9uIHRoZSB0eXBlCiAJICogb2YgaW50ZWdyYXRpb24gYmV0d2VlbiBjaGlwc2V0IGFuZCBicmlkZ2UuCiAJICovCi0JaWYocmVnaXN0ZXJlZCkgewotCSAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBSZXN0b3Jpbmcgb2YgdGV4dCBtb2RlIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKLQl9CisJaWYocmVnaXN0ZXJlZCAmJiBtb2RlY2hhbmdlZCkKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJInNpc2ZiOiBSZXN0b3Jpbmcgb2YgdGV4dCBtb2RlIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzaXNmYl9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gInNpc2ZiIiwKIAkuaWRfdGFibGUgCT0gc2lzZmJfcGNpX3RhYmxlLAotCS5wcm9iZSAJCT0gc2lzZmJfcHJvYmUsCisJLnByb2JlCQk9IHNpc2ZiX3Byb2JlLAogCS5yZW1vdmUgCT0gX19kZXZleGl0X3Aoc2lzZmJfcmVtb3ZlKQogfTsKIApAQCAtNTY5MywxMCArNjc3MywxMSBAQAogCiAJaWYoZmJfZ2V0X29wdGlvbnMoInNpc2ZiIiwgJm9wdGlvbnMpKQogCQlyZXR1cm4gLUVOT0RFVjsKKwogCXNpc2ZiX3NldHVwKG9wdGlvbnMpOwogI2VuZGlmCiAjZW5kaWYKLQlyZXR1cm4ocGNpX3JlZ2lzdGVyX2RyaXZlcigmc2lzZmJfZHJpdmVyKSk7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNpc2ZiX2RyaXZlcik7CiB9CiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsOCkKQEAgLTU3MTEsMzYgKzY3OTIsMTI5IEBACiAKICNpZmRlZiBNT0RVTEUKIAotc3RhdGljIGNoYXIgICAgICAgICAqbW9kZSA9IE5VTEw7Ci1zdGF0aWMgaW50ICAgICAgICAgIHZlc2EgPSAtMTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZSA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNydDFvZmYgPSAxOwotc3RhdGljIHVuc2lnbmVkIGludCBtZW0gPSAwOwotc3RhdGljIGNoYXIgICAgICAgICAqZm9yY2VjcnQydHlwZSA9IE5VTEw7Ci1zdGF0aWMgaW50ICAgICAgICAgIGZvcmNlY3J0MSA9IC0xOwotc3RhdGljIGludCAgICAgICAgICBwZGMgPSAtMTsKLXN0YXRpYyBpbnQgICAgICAgICAgcGRjMSA9IC0xOwotc3RhdGljIGludCAgICAgICAgICBub2FjY2VsID0gLTE7Ci1zdGF0aWMgaW50ICAgICAgICAgIG5veXBhbiAgPSAtMTsKLXN0YXRpYyBpbnQJICAgIG5vbWF4ID0gLTE7CitzdGF0aWMgY2hhcgkJKm1vZGUgPSBOVUxMOworc3RhdGljIGludAkJdmVzYSA9IC0xOworc3RhdGljIHVuc2lnbmVkIGludAlyYXRlID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJY3J0MW9mZiA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50CW1lbSA9IDA7CitzdGF0aWMgY2hhcgkJKmZvcmNlY3J0MnR5cGUgPSBOVUxMOworc3RhdGljIGludAkJZm9yY2VjcnQxID0gLTE7CitzdGF0aWMgaW50CQlwZGMgPSAtMTsKK3N0YXRpYyBpbnQJCXBkYzEgPSAtMTsKK3N0YXRpYyBpbnQJCW5vYWNjZWwgPSAtMTsKK3N0YXRpYyBpbnQJCW5veXBhbiAgPSAtMTsKK3N0YXRpYyBpbnQJCW5vbWF4ID0gLTE7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi1zdGF0aWMgaW50ICAgICAgICAgIGludmVyc2UgPSAwOworc3RhdGljIGludAkJaW52ZXJzZSA9IDA7CiAjZW5kaWYKLXN0YXRpYyBpbnQgICAgICAgICAgdXNlcm9tID0gLTE7Ci1zdGF0aWMgaW50ICAgICAgICAgIHVzZW9lbSA9IC0xOwotc3RhdGljIGNoYXIgICAgICAgICAqdHZzdGFuZGFyZCA9IE5VTEw7Ci1zdGF0aWMgaW50CSAgICBub2NydDJyYXRlID0gMDsKLXN0YXRpYyBpbnQgICAgICAgICAgc2NhbGVsY2QgPSAtMTsKLXN0YXRpYyBjaGFyCSAgICAqc3BlY2lhbHRpbWluZyA9IE5VTEw7Ci1zdGF0aWMgaW50CSAgICBsdmRzaGwgPSAtMTsKLXN0YXRpYyBpbnQJICAgIHR2eHBvc29mZnNldCA9IDAsIHR2eXBvc29mZnNldCA9IDA7Ci1zdGF0aWMgaW50CSAgICBmaWx0ZXIgPSAtMTsKK3N0YXRpYyBpbnQJCXVzZXJvbSA9IC0xOworc3RhdGljIGludAkJdXNlb2VtID0gLTE7CitzdGF0aWMgY2hhcgkJKnR2c3RhbmRhcmQgPSBOVUxMOworc3RhdGljIGludAkJbm9jcnQycmF0ZSA9IDA7CitzdGF0aWMgaW50CQlzY2FsZWxjZCA9IC0xOworc3RhdGljIGNoYXIJCSpzcGVjaWFsdGltaW5nID0gTlVMTDsKK3N0YXRpYyBpbnQJCWx2ZHNobCA9IC0xOworc3RhdGljIGludAkJdHZ4cG9zb2Zmc2V0ID0gMCwgdHZ5cG9zb2Zmc2V0ID0gMDsKICNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKLXN0YXRpYyBpbnQJICAgIHJlc2V0Y2FyZCA9IDA7Ci1zdGF0aWMgaW50CSAgICB2aWRlb3JhbSA9IDA7CitzdGF0aWMgaW50CQlyZXNldGNhcmQgPSAwOworc3RhdGljIGludAkJdmlkZW9yYW0gPSAwOwogI2VuZGlmCiAKLU1PRFVMRV9ERVNDUklQVElPTigiU2lTIDMwMC81NDAvNjMwLzczMC8zMTUvNTUwLzY1eC82NjEvNzR4LzMzMC83NjAgZnJhbWVidWZmZXIgZGV2aWNlIGRyaXZlciIpOworc3RhdGljIGludCBfX2luaXQgc2lzZmJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzaXNmYl9zZXRkZWZhdWx0cGFybXMoKTsKKworCWlmKHJhdGUpCisJCXNpc2ZiX3Bhcm1fcmF0ZSA9IHJhdGU7CisKKwlpZigoc2NhbGVsY2QgPT0gMCkgfHwgKHNjYWxlbGNkID09IDEpKQorCQlzaXNmYl9zY2FsZWxjZCA9IHNjYWxlbGNkIF4gMTsKKworCS8qIE5lZWQgdG8gY2hlY2sgY3J0MiB0eXBlIGZpcnN0IGZvciBmc3RuL2RzdG4gKi8KKworCWlmKGZvcmNlY3J0MnR5cGUpCisJCXNpc2ZiX3NlYXJjaF9jcnQydHlwZShmb3JjZWNydDJ0eXBlKTsKKworCWlmKHR2c3RhbmRhcmQpCisJCXNpc2ZiX3NlYXJjaF90dnN0ZCh0dnN0YW5kYXJkKTsKKworCWlmKG1vZGUpCisJCXNpc2ZiX3NlYXJjaF9tb2RlKG1vZGUsIEZBTFNFKTsKKwllbHNlIGlmKHZlc2EgIT0gLTEpCisJCXNpc2ZiX3NlYXJjaF92ZXNhbW9kZSh2ZXNhLCBGQUxTRSk7CisKKwlzaXNmYl9jcnQxb2ZmID0gKGNydDFvZmYgPT0gMCkgPyAxIDogMDsKKworCXNpc2ZiX2ZvcmNlY3J0MSA9IGZvcmNlY3J0MTsKKwlpZihmb3JjZWNydDEgPT0gMSkKKwkJc2lzZmJfY3J0MW9mZiA9IDA7CisJZWxzZSBpZihmb3JjZWNydDEgPT0gMCkKKwkJc2lzZmJfY3J0MW9mZiA9IDE7CisKKwlpZihub2FjY2VsID09IDEpCisJCXNpc2ZiX2FjY2VsID0gMDsKKwllbHNlIGlmKG5vYWNjZWwgPT0gMCkKKwkJc2lzZmJfYWNjZWwgPSAxOworCisJaWYobm95cGFuID09IDEpCisJCXNpc2ZiX3lwYW4gPSAwOworCWVsc2UgaWYobm95cGFuID09IDApCisJCXNpc2ZiX3lwYW4gPSAxOworCisJaWYobm9tYXggPT0gMSkKKwkJc2lzZmJfbWF4ID0gMDsKKwllbHNlIGlmKG5vbWF4ID09IDApCisJCXNpc2ZiX21heCA9IDE7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlpZihpbnZlcnNlKSBzaXNmYl9pbnZlcnNlID0gMTsKKyNlbmRpZgorCisJaWYobWVtKQorCQlzaXNmYl9wYXJtX21lbSA9IG1lbTsKKworCWlmKHVzZXJvbSAhPSAtMSkKKwkJc2lzZmJfdXNlcm9tID0gdXNlcm9tOworCisJaWYodXNlb2VtICE9IC0xKQorCQlzaXNmYl91c2VvZW0gPSB1c2VvZW07CisKKyAgICAgICAgaWYocGRjICE9IC0xKQorCQlzaXNmYl9wZGMgID0gKHBkYyAgJiAweDdmKTsKKworCWlmKHBkYzEgIT0gLTEpCisJCXNpc2ZiX3BkY2EgPSAocGRjMSAmIDB4MWYpOworCisJc2lzZmJfbm9jcnQycmF0ZSA9IG5vY3J0MnJhdGU7CisKKwlpZihzcGVjaWFsdGltaW5nKQorCQlzaXNmYl9zZWFyY2hfc3BlY2lhbHRpbWluZyhzcGVjaWFsdGltaW5nKTsKKworCWlmKChsdmRzaGwgPj0gMCkgJiYgKGx2ZHNobCA8PSAzKSkKKwkJc2lzZmJfbHZkc2hsID0gbHZkc2hsOworCisJc2lzZmJfdHZ4cG9zb2Zmc2V0ID0gdHZ4cG9zb2Zmc2V0OworCXNpc2ZiX3R2eXBvc29mZnNldCA9IHR2eXBvc29mZnNldDsKKworI2lmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKQorCXNpc2ZiX3Jlc2V0Y2FyZCA9IChyZXNldGNhcmQpID8gMSA6IDA7CisJaWYodmlkZW9yYW0pCisJCXNpc2ZiX3ZpZGVvcmFtID0gdmlkZW9yYW07CisjZW5kaWYKKworCXJldHVybiBzaXNmYl9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaXNmYl9yZW1vdmVfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzaXNmYl9kcml2ZXIpOworCXByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogTW9kdWxlIHVubG9hZGVkXG4iKTsKK30KKworbW9kdWxlX2luaXQoc2lzZmJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoc2lzZmJfcmVtb3ZlX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2lTIDMwMC81NDAvNjMwLzczMC8zMTUvNTV4LzY1eC82NjEvNzR4LzMzMC83NngvMzR4LCBYR0kgVjNYVC9WNS9WOC9aNyBmcmFtZWJ1ZmZlciBkZXZpY2UgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJUaG9tYXMgV2luaXNjaGhvZmVyIDx0aG9tYXNAd2luaXNjaGhvZmVyLm5ldD4sIE90aGVycyIpOwogCkBAIC01NzY0LDcgKzY5MzgsNiBAQAogTU9EVUxFX1BBUk0odHZzdGFuZGFyZCwgInMiKTsKIE1PRFVMRV9QQVJNKHR2eHBvc29mZnNldCwgImkiKTsKIE1PRFVMRV9QQVJNKHR2eXBvc29mZnNldCwgImkiKTsKLU1PRFVMRV9QQVJNKGZpbHRlciwgImkiKTsKIE1PRFVMRV9QQVJNKG5vY3J0MnJhdGUsICJpIik7CiBNT0RVTEVfUEFSTShpbnZlcnNlLCAiaSIpOwogI2lmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKQpAQCAtNTc5Myw3ICs2OTY2LDYgQEAKIG1vZHVsZV9wYXJhbSh0dnN0YW5kYXJkLCBjaGFycCwgMCk7CiBtb2R1bGVfcGFyYW0odHZ4cG9zb2Zmc2V0LCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHR2eXBvc29mZnNldCwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShmaWx0ZXIsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0obm9jcnQycmF0ZSwgaW50LCAwKTsKICNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKIG1vZHVsZV9wYXJhbShyZXNldGNhcmQsIGludCwgMCk7CkBAIC01ODAxLDI1ICs2OTczLDM1IEBACiAjZW5kaWYKICNlbmRpZgogCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiBNT0RVTEVfUEFSTV9ERVNDKG1lbSwKIAkiXG5EZXRlcm1pbmVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZpZGVvIG1lbW9yeSBoZWFwIGluIEtCLiBUaGlzIGhlYXAgaXMgdXNlZFxuIgogCSAgImZvciB2aWRlbyBSQU0gbWFuYWdlbWVudCBmb3IgZWcuIERSTS9EUkkuIE9uIDMwMCBzZXJpZXMsIHRoZSBkZWZhdWx0IGRlcGVuZHNcbiIKIAkgICJvbiB0aGUgYW1vdW50IG9mIHZpZGVvIFJBTSBhdmFpbGFibGUuIElmIDhNQiBvZiB2aWRlbyBSQU0gb3IgbGVzcyBpcyBhdmFpbGFibGUsXG4iCiAJICAidGhlIGhlYXAgc3RhcnRzIGF0IDQwOTZLQiwgaWYgYmV0d2VlbiA4IGFuZCAxNk1CIGFyZSBhdmFpbGFibGUgYXQgODE5MktCLFxuIgotCSAgIm90aGVyd2lzZSBhdCAxMjI4OEtCLiBPbiAzMTUgYW5kIFhhYnJlIHNlcmllcywgdGhlIGhlYXAgc2l6ZSBpcyAzMktCIGJ5IGRlZmF1bHQuXG4iCisJICAib3RoZXJ3aXNlIGF0IDEyMjg4S0IuIE9uIDMxNS8zMzAvMzQwIHNlcmllcywgdGhlIGhlYXAgc2l6ZSBpcyAzMktCIGJ5IGRlZmF1bHQuXG4iCiAJICAiVGhlIHZhbHVlIGlzIHRvIGJlIHNwZWNpZmllZCB3aXRob3V0ICdLQicgYW5kIG11c3QgbWF0Y2ggdGhlIE1heFhGQk1lbSBzZXR0aW5nXG4iCiAJICAiZm9yIFhGcmVlODYgNC54L1gub3JnIDYuNyBhbmQgbGF0ZXIuXG4iKTsKKyNlbHNlCitNT0RVTEVfUEFSTV9ERVNDKG1lbSwKKwkiXG5EZXRlcm1pbmVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZpZGVvIG1lbW9yeSBoZWFwIGluIEtCLiBUaGlzIGhlYXAgaXMgdXNlZFxuIgorCSAgImZvciB2aWRlbyBSQU0gbWFuYWdlbWVudCBmb3IgZWcuIERSTS9EUkkuIE9uIDMwMCBzZXJpZXMsIHRoZSBkZWZhdWx0IGRlcGVuZHNcbiIKKwkgICJvbiB0aGUgYW1vdW50IG9mIHZpZGVvIFJBTSBhdmFpbGFibGUuIElmIDhNQiBvZiB2aWRlbyBSQU0gb3IgbGVzcyBpcyBhdmFpbGFibGUsXG4iCisJICAidGhlIGhlYXAgc3RhcnRzIGF0IDQwOTZLQiwgaWYgYmV0d2VlbiA4IGFuZCAxNk1CIGFyZSBhdmFpbGFibGUgYXQgODE5MktCLFxuIgorCSAgIm90aGVyd2lzZSBhdCAxMjI4OEtCLiBPbiAzMTUvMzMwLzM0MCBzZXJpZXMsIHRoZSBoZWFwIHNpemUgaXMgMzJLQiBieSBkZWZhdWx0LlxuIgorCSAgIlRoZSB2YWx1ZSBpcyB0byBiZSBzcGVjaWZpZWQgd2l0aG91dCAnS0InLlxuIik7CisjZW5kaWYKIAogTU9EVUxFX1BBUk1fREVTQyhub2FjY2VsLAotICAgICAgICAiXG5JZiBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiAwLCAyRCBhY2NlbGVyYXRpb24gd2lsbCBiZSBkaXNhYmxlZC5cbiIKKwkiXG5JZiBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiAwLCAyRCBhY2NlbGVyYXRpb24gd2lsbCBiZSBkaXNhYmxlZC5cbiIKIAkgICIoZGVmYXVsdDogMClcbiIpOwogCiBNT0RVTEVfUEFSTV9ERVNDKG5veXBhbiwKLSAgICAgICAgIlxuSWYgc2V0IHRvIGFueXRoaW5nIG90aGVyIHRoYW4gMCwgeS1wYW5uaW5nIHdpbGwgYmUgZGlzYWJsZWQgYW5kIHNjcm9sbGluZ1xuIgotIAkgICJ3aWxsIGJlIHBlcmZvcm1lZCBieSByZWRyYXdpbmcgdGhlIHNjcmVlbi4gKGRlZmF1bHQ6IDApXG4iKTsKKwkiXG5JZiBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiAwLCB5LXBhbm5pbmcgd2lsbCBiZSBkaXNhYmxlZCBhbmQgc2Nyb2xsaW5nXG4iCisJICAid2lsbCBiZSBwZXJmb3JtZWQgYnkgcmVkcmF3aW5nIHRoZSBzY3JlZW4uIChkZWZhdWx0OiAwKVxuIik7CiAKIE1PRFVMRV9QQVJNX0RFU0Mobm9tYXgsCi0gICAgICAgICJcbklmIHktcGFubmluZyBpcyBlbmFibGVkLCBzaXNmYiB3aWxsIGJ5IGRlZmF1bHQgdXNlIHRoZSBlbnRpcmUgYXZhaWxhYmxlIHZpZGVvXG4iCisJIlxuSWYgeS1wYW5uaW5nIGlzIGVuYWJsZWQsIHNpc2ZiIHdpbGwgYnkgZGVmYXVsdCB1c2UgdGhlIGVudGlyZSBhdmFpbGFibGUgdmlkZW9cbiIKIAkgICJtZW1vcnkgZm9yIHRoZSB2aXJ0dWFsIHNjcmVlbiBpbiBvcmRlciB0byBvcHRpbWl6ZSBzY3JvbGxpbmcgcGVyZm9ybWFuY2UuIElmXG4iCiAJICAidGhpcyBpcyBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiAwLCBzaXNmYiB3aWxsIG5vdCBkbyB0aGlzIGFuZCB0aGVyZWJ5IFxuIgogCSAgImVuYWJsZSB0aGUgdXNlciB0byBwb3NpdGl2ZWx5IHNwZWNpZnkgYSB2aXJ0dWFsIFkgc2l6ZSBvZiB0aGUgc2NyZWVuIHVzaW5nXG4iCkBAIC01ODI3LDMwICs3MDA5LDMwIEBACiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKIE1PRFVMRV9QQVJNX0RFU0MobW9kZSwKLSAgICAgICAgIlxuU2VsZWN0cyB0aGUgZGVzaXJlZCBkaXNwbGF5IG1vZGUgaW4gdGhlIGZvcm1hdCBbWF14W1ldeFtEZXB0aF0sIGVnLlxuIgotICAgICAgICAgICIxMDI0eDc2OHgxNi4gT3RoZXIgZm9ybWF0cyBzdXBwb3J0ZWQgaW5jbHVkZSBYeFktRGVwdGggYW5kXG4iCi0gCSAgIlh4WS1EZXB0aEBSYXRlLiBJZiB0aGUgcGFyYW1ldGVyIGlzIG9ubHkgb25lIChkZWNpbWFsIG9yIGhleGFkZWNpbWFsKVxuIgorCSJcblNlbGVjdHMgdGhlIGRlc2lyZWQgZGlzcGxheSBtb2RlIGluIHRoZSBmb3JtYXQgW1hdeFtZXXhbRGVwdGhdLCBlZy5cbiIKKwkgICIxMDI0eDc2OHgxNi4gT3RoZXIgZm9ybWF0cyBzdXBwb3J0ZWQgaW5jbHVkZSBYeFktRGVwdGggYW5kXG4iCisJICAiWHhZLURlcHRoQFJhdGUuIElmIHRoZSBwYXJhbWV0ZXIgaXMgb25seSBvbmUgKGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwpXG4iCiAJICAibnVtYmVyLCBpdCB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgVkVTQSBtb2RlIG51bWJlci4gKGRlZmF1bHQ6IG5vbmUgaWZcbiIKIAkgICJzaXNmYiBpcyBhIG1vZHVsZTsgdGhpcyBsZWF2ZXMgdGhlIGNvbnNvbGUgdW50b3VjaGVkIGFuZCB0aGUgZHJpdmVyIHdpbGxcbiIKIAkgICJvbmx5IGRvIHRoZSB2aWRlbyBtZW1vcnkgbWFuYWdlbWVudCBmb3IgZWcuIERSTS9EUkk7IDgwMHg2MDB4OCBpZiBzaXNmYlxuIgogCSAgImlzIGluIHRoZSBrZXJuZWwpXG4iKTsKIE1PRFVMRV9QQVJNX0RFU0ModmVzYSwKLSAgICAgICAgIlxuU2VsZWN0cyB0aGUgZGVzaXJlZCBkaXNwbGF5IG1vZGUgYnkgVkVTQSBkZWZpbmVkIG1vZGUgbnVtYmVyLCBlZy4gMHgxMTdcbiIKLSAgICAgICAgICAiKGRlZmF1bHQ6IDB4MDAwMCBpZiBzaXNmYiBpcyBhIG1vZHVsZTsgdGhpcyBsZWF2ZXMgdGhlIGNvbnNvbGUgdW50b3VjaGVkXG4iCisJIlxuU2VsZWN0cyB0aGUgZGVzaXJlZCBkaXNwbGF5IG1vZGUgYnkgVkVTQSBkZWZpbmVkIG1vZGUgbnVtYmVyLCBlZy4gMHgxMTdcbiIKKwkgICIoZGVmYXVsdDogMHgwMDAwIGlmIHNpc2ZiIGlzIGEgbW9kdWxlOyB0aGlzIGxlYXZlcyB0aGUgY29uc29sZSB1bnRvdWNoZWRcbiIKIAkgICJhbmQgdGhlIGRyaXZlciB3aWxsIG9ubHkgZG8gdGhlIHZpZGVvIG1lbW9yeSBtYW5hZ2VtZW50IGZvciBlZy4gRFJNL0RSSTtcbiIKIAkgICIweDAxMDMgaWYgc2lzZmIgaXMgaW4gdGhlIGtlcm5lbClcbiIpOwogI2VuZGlmCiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiBNT0RVTEVfUEFSTV9ERVNDKG1vZGUsCi0gICAgICAgIlxuU2VsZWN0cyB0aGUgZGVzaXJlZCBkZWZhdWx0IGRpc3BsYXkgbW9kZSBpbiB0aGUgZm9ybWF0IFh4WXhEZXB0aCxcbiIKLSAgICAgICAgICJlZy4gMTAyNHg3Njh4MTYuIE90aGVyIGZvcm1hdHMgc3VwcG9ydGVkIGluY2x1ZGUgWHhZLURlcHRoIGFuZFxuIgorCSJcblNlbGVjdHMgdGhlIGRlc2lyZWQgZGVmYXVsdCBkaXNwbGF5IG1vZGUgaW4gdGhlIGZvcm1hdCBYeFl4RGVwdGgsXG4iCisJICJlZy4gMTAyNHg3Njh4MTYuIE90aGVyIGZvcm1hdHMgc3VwcG9ydGVkIGluY2x1ZGUgWHhZLURlcHRoIGFuZFxuIgogCSAiWHhZLURlcHRoQFJhdGUuIElmIHRoZSBwYXJhbWV0ZXIgaXMgb25seSBvbmUgKGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwpXG4iCiAJICJudW1iZXIsIGl0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBWRVNBIG1vZGUgbnVtYmVyLiAoZGVmYXVsdDogODAweDYwMHg4KVxuIik7CiAKIE1PRFVMRV9QQVJNX0RFU0ModmVzYSwKLSAgICAgICAiXG5TZWxlY3RzIHRoZSBkZXNpcmVkIGRlZmF1bHQgZGlzcGxheSBtb2RlIGJ5IFZFU0EgZGVmaW5lZCBtb2RlIG51bWJlciwgZWcuXG4iCi0gICAgICAgICAiMHgxMTcgKGRlZmF1bHQ6IDB4MDEwMylcbiIpOworCSJcblNlbGVjdHMgdGhlIGRlc2lyZWQgZGVmYXVsdCBkaXNwbGF5IG1vZGUgYnkgVkVTQSBkZWZpbmVkIG1vZGUgbnVtYmVyLCBlZy5cbiIKKwkgIjB4MTE3IChkZWZhdWx0OiAweDAxMDMpXG4iKTsKICNlbmRpZgogCiBNT0RVTEVfUEFSTV9ERVNDKHJhdGUsCkBAIC01ODgwLDE2ICs3MDYyLDE2IEBACiAJICAidGhlbXNlbHZlcy4gRGVmYXVsdDogMSBvbiBMVkRTIHBhbmVscywgMCBvbiBUTURTIHBhbmVsc1xuIik7CiAKIE1PRFVMRV9QQVJNX0RFU0MocGRjLAotICAgICAgICAiXG5UaGlzIGlzIGZvciBtYW51YWxseSBzZWxlY3RpbmcgdGhlIExDRCBwYW5lbCBkZWxheSBjb21wZW5zYXRpb24uIFRoZSBkcml2ZXJcbiIKKwkiXG5UaGlzIGlzIGZvciBtYW51YWxseSBzZWxlY3RpbmcgdGhlIExDRCBwYW5lbCBkZWxheSBjb21wZW5zYXRpb24uIFRoZSBkcml2ZXJcbiIKIAkgICJzaG91bGQgZGV0ZWN0IHRoaXMgY29ycmVjdGx5IGluIG1vc3QgY2FzZXM7IGhvd2V2ZXIsIHNvbWV0aW1lcyB0aGlzIGlzIG5vdFxuIgogCSAgInBvc3NpYmxlLiBJZiB5b3Ugc2VlICdzbWFsbCB3YXZlcycgb24gdGhlIExDRCwgdHJ5IHNldHRpbmcgdGhpcyB0byA0LCAzMiBvciAyNFxuIgotCSAgIm9uIGEgMzAwIHNlcmllcyBjaGlwc2V0OyA2IG9uIGEgMzE1IHNlcmllcyBjaGlwc2V0LiBJZiB0aGUgcHJvYmxlbSBwZXJzaXN0cyxcbiIKLQkgICJ0cnkgb3RoZXIgdmFsdWVzIChvbiAzMDAgc2VyaWVzOiBiZXR3ZWVuIDQgYW5kIDYwIGluIHN0ZXBzIG9mIDQ7IG9uIDMxNSBzZXJpZXM6XG4iCi0JICAiYW55IHZhbHVlIGZyb20gMCB0byAzMSkuIChkZWZhdWx0OiBhdXRvZGV0ZWN0ZWQsIGlmIExDRCBpcyBhY3RpdmUgZHVyaW5nIHN0YXJ0KVxuIik7CisJICAib24gYSAzMDAgc2VyaWVzIGNoaXBzZXQ7IDYgb24gb3RoZXIgY2hpcHNldHMuIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCB0cnlcbiIKKwkgICJvdGhlciB2YWx1ZXMgKG9uIDMwMCBzZXJpZXM6IGJldHdlZW4gNCBhbmQgNjAgaW4gc3RlcHMgb2YgNDsgb3RoZXJ3aXNlOiBhbnlcbiIKKwkgICJ2YWx1ZSBmcm9tIDAgdG8gMzEpLiAoZGVmYXVsdDogYXV0b2RldGVjdGVkLCBpZiBMQ0QgaXMgYWN0aXZlIGR1cmluZyBzdGFydClcbiIpOwogCiAjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKIE1PRFVMRV9QQVJNX0RFU0MocGRjMSwKLSAgICAgICAgIlxuVGhpcyBpcyBzYW1lIGFzIHBkYywgYnV0IGZvciBMQ0QtdmlhIENSVDEuIEhlbmNlLCB0aGlzIGlzIGZvciB0aGUgMzE1LzMzMFxuIgorCSJcblRoaXMgaXMgc2FtZSBhcyBwZGMsIGJ1dCBmb3IgTENELXZpYSBDUlQxLiBIZW5jZSwgdGhpcyBpcyBmb3IgdGhlIDMxNS8zMzAvMzQwXG4iCiAJICAic2VyaWVzIG9ubHkuIChkZWZhdWx0OiBhdXRvZGV0ZWN0ZWQgaWYgTENEIGlzIGluIExDRC12aWEtQ1JUMSBtb2RlIGR1cmluZ1xuIgogCSAgInN0YXJ0dXApIC0gTm90ZTogY3VycmVudGx5LCB0aGlzIGhhcyBubyBlZmZlY3QgYmVjYXVzZSBMQ0QtdmlhLUNSVDEgaXMgbm90XG4iCiAJICAiaW1wbGVtZW50ZWQgeWV0LlxuIik7CkBAIC01OTEzLDE3ICs3MDk1LDEzIEBACiAJIlxuUmVsb2NhdGUgVFYgb3V0cHV0IHZlcnRpY2FsbHkuIFBvc3NpYmxlIHBhcmFtZXRlcnM6IC0zMiB0aHJvdWdoIDMyLlxuIgogCSAgIkRlZmF1bHQ6IDBcbiIpOwogCi1NT0RVTEVfUEFSTV9ERVNDKGZpbHRlciwKLQkiXG5TZWxlY3RzIFRWIGZsaWNrZXIgZmlsdGVyIHR5cGUgKG9ubHkgZm9yIHN5c3RlbXMgd2l0aCBhIFNpUzMwMSB2aWRlbyBicmlkZ2UpLlxuIgotCSAgIihQb3NzaWJsZSB2YWx1ZXMgMC03LCBkZWZhdWx0OiBbbm8gZmlsdGVyXSlcbiIpOwotCiBNT0RVTEVfUEFSTV9ERVNDKG5vY3J0MnJhdGUsCiAJIlxuU2V0dGluZyB0aGlzIHRvIDEgd2lsbCBmb3JjZSB0aGUgZHJpdmVyIHRvIHVzZSB0aGUgZGVmYXVsdCByZWZyZXNoIHJhdGUgZm9yXG4iCiAJICAiQ1JUMiBpZiBDUlQyIHR5cGUgaXMgVkdBLiAoZGVmYXVsdDogMCwgdXNlIHNhbWUgcmF0ZSBhcyBDUlQxKVxuIik7CiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKIE1PRFVMRV9QQVJNX0RFU0MoaW52ZXJzZSwKLSAgICAgICAgIlxuU2V0dGluZyB0aGlzIHRvIGFueXRoaW5nIGJ1dCAwIHNob3VsZCBpbnZlcnQgdGhlIGRpc3BsYXkgY29sb3JzLCBidXQgdGhpc1xuIgorCSJcblNldHRpbmcgdGhpcyB0byBhbnl0aGluZyBidXQgMCBzaG91bGQgaW52ZXJ0IHRoZSBkaXNwbGF5IGNvbG9ycywgYnV0IHRoaXNcbiIKIAkgICJkb2VzIG5vdCBzZWVtIHRvIHdvcmsuIChkZWZhdWx0OiAwKVxuIik7CiAjZW5kaWYKIApAQCAtNTkzMSw5OCArNzEwOSwyMyBAQAogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCiBNT0RVTEVfUEFSTV9ERVNDKHJlc2V0Y2FyZCwKIAkiXG5TZXQgdGhpcyB0byAxIGluIG9yZGVyIHRvIHJlc2V0IChQT1NUKSB0aGUgY2FyZCBvbiBub24teDg2IG1hY2hpbmVzIHdoZXJlXG4iCi0JICAidGhlIEJJT1MgZGlkIG5vdCBQT1NUIHRoZSBjYXJkIChvbmx5IHN1cHBvcnRlZCBmb3IgU2lTIDMwMC8zMDUgY3VycmVudGx5KS5cbiIKLQkgICJEZWZhdWx0OiAwXG4iKTsKKwkgICJ0aGUgQklPUyBkaWQgbm90IFBPU1QgdGhlIGNhcmQgKG9ubHkgc3VwcG9ydGVkIGZvciBTaVMgMzAwLzMwNSBhbmQgWEdJIGNhcmRzXG4iCisJICAiY3VycmVudGx5KS4gRGVmYXVsdDogMFxuIik7CiAKIE1PRFVMRV9QQVJNX0RFU0ModmlkZW9yYW0sCiAJIlxuU2V0IHRoaXMgdG8gdGhlIGFtb3VudCBvZiB2aWRlbyBSQU0gKGluIGtpbG9ieXRlKSB0aGUgY2FyZCBoYXMuIFJlcXVpcmVkIG9uXG4iCiAJICAic29tZSBub24teDg2IGFyY2hpdGVjdHVyZXMgd2hlcmUgdGhlIG1lbW9yeSBhdXRvIGRldGVjdGlvbiBmYWlscy4gT25seVxuIgotCSAgInJlbGV2YW50IGlmIHJlc2V0Y2FyZCBpcyBzZXQsIHRvby4gRGVmYXVsdDogW2F1dG8tZGV0ZWN0XVxuIik7CisJICAicmVsZXZhbnQgaWYgcmVzZXRjYXJkIGlzIHNldCwgdG9vLiBTaVMzMDAvMzA1IG9ubHkuIERlZmF1bHQ6IFthdXRvLWRldGVjdF1cbiIpOwogI2VuZGlmCiAjZW5kaWYKIAotc3RhdGljIGludCBfX2RldmluaXQgc2lzZmJfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlzaXNmYl9zZXRkZWZhdWx0cGFybXMoKTsKLQotCWlmKHJhdGUpIHNpc2ZiX3Bhcm1fcmF0ZSA9IHJhdGU7Ci0KLQlpZigoc2NhbGVsY2QgPT0gMCkgfHwgKHNjYWxlbGNkID09IDEpKSB7Ci0JICAgc2lzZmJfc2NhbGVsY2QgPSBzY2FsZWxjZCBeIDE7Ci0JfQotCi0JLyogTmVlZCB0byBjaGVjayBjcnQyIHR5cGUgZmlyc3QgZm9yIGZzdG4vZHN0biAqLwotCi0JaWYoZm9yY2VjcnQydHlwZSkKLQkJc2lzZmJfc2VhcmNoX2NydDJ0eXBlKGZvcmNlY3J0MnR5cGUpOwotCi0JaWYodHZzdGFuZGFyZCkKLQkJc2lzZmJfc2VhcmNoX3R2c3RkKHR2c3RhbmRhcmQpOwotCi0JaWYobW9kZSkKLQkJc2lzZmJfc2VhcmNoX21vZGUobW9kZSwgRkFMU0UpOwotCWVsc2UgaWYodmVzYSAhPSAtMSkKLQkJc2lzZmJfc2VhcmNoX3Zlc2Ftb2RlKHZlc2EsIEZBTFNFKTsKLQotCXNpc2ZiX2NydDFvZmYgPSAoY3J0MW9mZiA9PSAwKSA/IDEgOiAwOwotCi0Jc2lzZmJfZm9yY2VjcnQxID0gZm9yY2VjcnQxOwotCWlmKGZvcmNlY3J0MSA9PSAxKSAgICAgIHNpc2ZiX2NydDFvZmYgPSAwOwotCWVsc2UgaWYoZm9yY2VjcnQxID09IDApIHNpc2ZiX2NydDFvZmYgPSAxOwotCi0JaWYobm9hY2NlbCA9PSAxKSAgICAgIHNpc2ZiX2FjY2VsID0gMDsKLQllbHNlIGlmKG5vYWNjZWwgPT0gMCkgc2lzZmJfYWNjZWwgPSAxOwotCi0JaWYobm95cGFuID09IDEpICAgICAgIHNpc2ZiX3lwYW4gPSAwOwotCWVsc2UgaWYobm95cGFuID09IDApICBzaXNmYl95cGFuID0gMTsKLQotCWlmKG5vbWF4ID09IDEpICAgICAgICBzaXNmYl9tYXggPSAwOwotCWVsc2UgaWYobm9tYXggPT0gMCkgICBzaXNmYl9tYXggPSAxOwotCQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCWlmKGludmVyc2UpICAgICAgICAgICBzaXNmYl9pbnZlcnNlID0gMTsKLSNlbmRpZgotCi0JaWYobWVtKQkJICAgICAgc2lzZmJfcGFybV9tZW0gPSBtZW07Ci0KLQlpZih1c2Vyb20gIT0gLTEpICAgICAgc2lzZmJfdXNlcm9tID0gdXNlcm9tOwotCWlmKHVzZW9lbSAhPSAtMSkgICAgICBzaXNmYl91c2VvZW0gPSB1c2VvZW07Ci0KLSAgICAgICAgaWYocGRjICE9IC0xKSAgc2lzZmJfcGRjICA9IChwZGMgICYgMHg3Zik7Ci0JaWYocGRjMSAhPSAtMSkgc2lzZmJfcGRjYSA9IChwZGMxICYgMHgxZik7Ci0KLQlzaXNmYl9ub2NydDJyYXRlID0gbm9jcnQycmF0ZTsKLQotCWlmKHNwZWNpYWx0aW1pbmcpCi0JCXNpc2ZiX3NlYXJjaF9zcGVjaWFsdGltaW5nKHNwZWNpYWx0aW1pbmcpOwotCi0JaWYoKGx2ZHNobCA+PSAwKSAmJiAobHZkc2hsIDw9IDMpKSAgc2lzZmJfbHZkc2hsID0gbHZkc2hsOwotCi0JaWYoZmlsdGVyICE9IC0xKSBzaXNmYl9maWx0ZXIgPSBmaWx0ZXI7Ci0KLQlzaXNmYl90dnhwb3NvZmZzZXQgPSB0dnhwb3NvZmZzZXQ7Ci0Jc2lzZmJfdHZ5cG9zb2Zmc2V0ID0gdHZ5cG9zb2Zmc2V0OwotCi0jaWYgIWRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCi0gCXNpc2ZiX3Jlc2V0Y2FyZCA9IChyZXNldGNhcmQpID8gMSA6IDA7Ci0JaWYodmlkZW9yYW0pICAgIHNpc2ZiX3ZpZGVvcmFtID0gdmlkZW9yYW07Ci0jZW5kaWYKLQotICAgICAgICByZXR1cm4oc2lzZmJfaW5pdCgpKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHNpc2ZiX3JlbW92ZV9tb2R1bGUodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNpc2ZiX2RyaXZlcik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiBNb2R1bGUgdW5sb2FkZWRcbiIpOwotfQotCi1tb2R1bGVfaW5pdChzaXNmYl9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChzaXNmYl9yZW1vdmVfbW9kdWxlKTsKLQogI2VuZGlmIAkgICAvKiAgL01PRFVMRSAgKi8KIAorLyogX0dQTCBvbmx5IGZvciBuZXcgc3ltYm9scy4gKi8KIEVYUE9SVF9TWU1CT0woc2lzX21hbGxvYyk7CiBFWFBPUlRfU1lNQk9MKHNpc19mcmVlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNpc19tYWxsb2NfbmV3KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNpc19mcmVlX25ldyk7CisKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5oIGIvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uaAppbmRleCBhNjY3OGE3Li40NDViY2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmgKQEAgLTEsOSArMSwxMCBAQAogLyoKLSAqIFNpUyAzMDAvMzA1LzU0MC82MzAoUykvNzMwKFMpCi0gKiBTaVMgMzE1KEgvUFJPKS81NXgvKE0pNjV4LyhNKTY2MShGL00pWC83NDAvNzQxKEdYKS8zMzAvKE0pNzYwCisgKiBTaVMgMzAwLzMwNS81NDAvNjMwKFMpLzczMChTKSwKKyAqIFNpUyAzMTVbRXxQUk9dLzU1MC9bTV02NXgvW01dNjZ4W0Z8TXxHXVgvW01dNzR4W0dYXS8zMzAvW01dNzZ4W0dYXSwKKyAqIFhHSSBWM1hUL1Y1L1Y4LCBaNwogICogZnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgTGludXgga2VybmVscyA+PTIuNC4xNCBhbmQgPj0yLjYuMwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYS4KKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYS4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIzLDEzICsyNCw5IEBACiAjaWZuZGVmIF9TSVNGQl9NQUlOCiAjZGVmaW5lIF9TSVNGQl9NQUlOCiAKLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCiAjaW5jbHVkZSAidnN0cnVjdC5oIgogI2luY2x1ZGUgInNpcy5oIgogCi0jZGVmaW5lIE1PREVfSU5ERVhfTk9ORSAgICAgICAgICAgMCAgLyogaW5kZXggZm9yIG1vZGU9bm9uZSAqLwotCiAvKiBGYmNvbiBzdHVmZiAqLwogc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBteV9kZWZhdWx0X3ZhciA9IHsKIAkueHJlcyAgICAgICAgICAgID0gMCwKQEAgLTYwLDYgKzU3LDggQEAKIAkudm1vZGUgICAgICAgICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKIH07CiAKKyNkZWZpbmUgTU9ERV9JTkRFWF9OT05FICAgICAgICAgICAwICAvKiBpbmRleCBmb3IgbW9kZT1ub25lICovCisKIC8qIEJvb3QtdGltZSBwYXJhbWV0ZXJzICovCiBzdGF0aWMgaW50IHNpc2ZiX29mZiA9IDA7CiBzdGF0aWMgaW50IHNpc2ZiX3Bhcm1fbWVtID0gMDsKQEAgLTkzLDcgKzkyLDYgQEAKIHN0YXRpYyBpbnQgc2lzZmJfdHZzdGQgID0gLTE7CiBzdGF0aWMgaW50IHNpc2ZiX3R2eHBvc29mZnNldCA9IDA7CiBzdGF0aWMgaW50IHNpc2ZiX3R2eXBvc29mZnNldCA9IDA7Ci1zdGF0aWMgaW50IHNpc2ZiX2ZpbHRlciA9IC0xOwogc3RhdGljIGludCBzaXNmYl9ub2NydDJyYXRlID0gMDsKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKIHN0YXRpYyBpbnQgIHNpc2ZiX2ludmVyc2UgPSAwOwpAQCAtMTA2LDEyICsxMDQsMTIgQEAKIAogLyogTGlzdCBvZiBzdXBwb3J0ZWQgY2hpcHMgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2lzZmJfY2hpcF9pbmZvIHsKLSAgICAgICAgaW50IAkJY2hpcDsKLQlpbnQgCQl2Z2FlbmdpbmU7CisJaW50CQljaGlwOworCWludAkJdmdhZW5naW5lOwogCWludAkJbW5pOwotCWludCAJCWh3Y3Vyc29yX3NpemU7CisJaW50CQlod2N1cnNvcl9zaXplOwogCWludAkJQ1JUMl93cml0ZV9lbmFibGU7Ci0JY29uc3QgY2hhciAJKmNoaXBfbmFtZTsKKwljb25zdCBjaGFyCSpjaGlwX25hbWU7CiB9IHNpc2ZiX2NoaXBfaW5mb1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyBTSVNfMzAwLCAgICBTSVNfMzAwX1ZHQSwgMCwgSFdfQ1VSU09SX0FSRUFfU0laRV8zMDAgKiAyLCBTSVNfQ1JUMl9XRU5BQkxFXzMwMCwgIlNpUyAzMDAvMzA1IiB9LAogCXsgU0lTXzU0MCwgICAgU0lTXzMwMF9WR0EsIDAsIEhXX0NVUlNPUl9BUkVBX1NJWkVfMzAwICogMiwgU0lTX0NSVDJfV0VOQUJMRV8zMDAsICJTaVMgNTQwIiB9LApAQCAtMTIzLDYgKzEyMSw4IEBACiAJeyBTSVNfNjUwLCAgICBTSVNfMzE1X1ZHQSwgMSwgSFdfQ1VSU09SX0FSRUFfU0laRV8zMTUgKiA0LCBTSVNfQ1JUMl9XRU5BQkxFXzMxNSwgIlNpUyA2NTAiIH0sCiAJeyBTSVNfMzMwLCAgICBTSVNfMzE1X1ZHQSwgMSwgSFdfQ1VSU09SX0FSRUFfU0laRV8zMTUgKiA0LCBTSVNfQ1JUMl9XRU5BQkxFXzMxNSwgIlNpUyAzMzAiIH0sCiAJeyBTSVNfNjYwLCAgICBTSVNfMzE1X1ZHQSwgMSwgSFdfQ1VSU09SX0FSRUFfU0laRV8zMTUgKiA0LCBTSVNfQ1JUMl9XRU5BQkxFXzMxNSwgIlNpUyA2NjAiIH0sCisJeyBYR0lfMjAsICAgICBTSVNfMzE1X1ZHQSwgMSwgSFdfQ1VSU09SX0FSRUFfU0laRV8zMTUgKiA0LCBTSVNfQ1JUMl9XRU5BQkxFXzMxNSwgIlhHSSBaNyIgfSwKKwl7IFhHSV80MCwgICAgIFNJU18zMTVfVkdBLCAxLCBIV19DVVJTT1JfQVJFQV9TSVpFXzMxNSAqIDQsIFNJU19DUlQyX1dFTkFCTEVfMzE1LCAiWEdJIFYzWFQvVjUvVjgiIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgX19kZXZpbml0ZGF0YSBzaXNmYl9wY2lfdGFibGVbXSA9IHsKQEAgLTEzOSw2ICsxMzksOCBAQAogCXsgUENJX1ZFTkRPUl9JRF9TSSwgUENJX0RFVklDRV9JRF9TSV82NTBfVkdBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA3fSwKIAl7IFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfMzMwLCAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgOH0sCiAJeyBQQ0lfVkVORE9SX0lEX1NJLCBQQ0lfREVWSUNFX0lEX1NJXzY2MF9WR0EsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDl9LAorCXsgUENJX1ZFTkRPUl9JRF9YR0ksUENJX0RFVklDRV9JRF9YR0lfMjAsICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLDEwfSwKKwl7IFBDSV9WRU5ET1JfSURfWEdJLFBDSV9ERVZJQ0VfSURfWEdJXzQwLCAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwxMX0sCiAjZW5kaWYKIAl7IDAgfQogfTsKQEAgLTE0NywxMyArMTQ5LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKmNhcmRfbGlzdCA9IE5VTEw7CiAKLS8qIFRPRE86IFRoaXMgaXMgbm90IGhhbmRsZWQgY2FyZC13aXNlIGJlY2F1c2UgdGhlIERSTQotICAgZG9lcyBub3QgcmVmZXIgdG8gYSB1bmlxdWUgZmIgd2hlbiBjYWxsaW5nIHNpc19hbGxvYwotICAgb3Igc2lzX2ZyZWUuIFRoZXJlZm9yZSwgdGhpcyBpcyBoYW5kbGVkIGdsb2JhbGx5IGZvcgotICAgbm93IChob3BpbmcgdGhhdCBub2JvZHkgaXMgY3JhenkgZW5vdWdoIHRvIHJ1biB0d28KLSAgIFNpUyBjYXJkcyBhdCB0aGUgc2FtZSB0aW1lKS4KKy8qIFRoZSBtZW1vcnkgaGVhcCBpcyBub3cgaGFuZGxlZCBjYXJkLXdpc2UsIGJ5IHVzaW5nCisgICBzaXNfbWFsbG9jX25ldy9zaXNfZnJlZV9uZXcuIEhvd2V2ZXIsIHRoZSBEUk0gZG9lcworICAgbm90IGRvIHRoaXMgeWV0LiBVbnRpbCBpdCBkb2VzLCB3ZSBrZWVwIGEgImdsb2JhbCIKKyAgIGhlYXAgd2hpY2ggaXMgYWN0dWFsbHkgdGhlIGZpcnN0IGNhcmQncyBvbmUuCiAgKi8KLXN0YXRpYyBTSVNfSEVBUCAgICAgICAJc2lzZmJfaGVhcDsKK3N0YXRpYyBzdHJ1Y3QgU0lTX0hFQVAJKnNpc2ZiX2hlYXA7CiAKICNkZWZpbmUgTURfU0lTMzAwIDEKICNkZWZpbmUgTURfU0lTMzE1IDIKQEAgLTE4MSw4ICsxODIsMTAgQEAKIAl7IjMyMHgyNDB4MTYiLCAgIHsweDU2LDB4NTZ9LCAweDAxMzUsIDB4MDAwMCwgIDMyMCwgIDI0MCwgMTYsIDEsICA0MCwgMTUsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiMzIweDI0MHgyNCIsICAgezB4NTMsMHg1M30sIDB4MDAwMCwgMHgwMDAwLCAgMzIwLCAgMjQwLCAzMiwgMSwgIDQwLCAxNSwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyIzMjB4MjQweDMyIiwgICB7MHg1MywweDUzfSwgMHgwMDAwLCAweDAwMDAsICAzMjAsICAyNDAsIDMyLCAxLCAgNDAsIDE1LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKLQl7IjMyMHgyNDB4OCIsICAgIHsweDVhLDB4NWF9LCAweDAxMzIsIDB4MDAwMCwgIDMyMCwgIDQ4MCwgIDgsIDEsICA0MCwgMzAsICAgICAgICAgICBNRF9TSVMzMTV9LCAgLyogRlNUTiAqLwotLyoxMCovCXsiMzIweDI0MHgxNiIsICAgezB4NWIsMHg1Yn0sIDB4MDEzNSwgMHgwMDAwLCAgMzIwLCAgNDgwLCAxNiwgMSwgIDQwLCAzMCwgICAgICAgICAgIE1EX1NJUzMxNX0sICAvKiBGU1ROICovCisjZGVmaW5lIE1PREVfRlNUTl84CTkKKyNkZWZpbmUgTU9ERV9GU1ROXzE2CTEwCisJeyIzMjB4MjQweDgiLCAgICB7MHg1YSwweDVhfSwgMHgwMTMyLCAweDAwMDAsICAzMjAsICAyNDAsICA4LCAxLCAgNDAsIDE1LCAgICAgICAgICAgTURfU0lTMzE1fSwgIC8qIEZTVE4gKi8KKy8qMTAqLwl7IjMyMHgyNDB4MTYiLCAgIHsweDViLDB4NWJ9LCAweDAxMzUsIDB4MDAwMCwgIDMyMCwgIDI0MCwgMTYsIDEsICA0MCwgMTUsICAgICAgICAgICBNRF9TSVMzMTV9LCAgLyogRlNUTiAqLwogCXsiNDAweDMwMHg4IiwgICAgezB4NTEsMHg1MX0sIDB4MDEzMywgMHgwMDAwLCAgNDAwLCAgMzAwLCAgOCwgMSwgIDUwLCAxOCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyI0MDB4MzAweDE2IiwgICB7MHg1NywweDU3fSwgMHgwMTM2LCAweDAwMDAsICA0MDAsICAzMDAsIDE2LCAxLCAgNTAsIDE4LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjQwMHgzMDB4MjQiLCAgIHsweDU0LDB4NTR9LCAweDAwMDAsIDB4MDAwMCwgIDQwMCwgIDMwMCwgMzIsIDEsICA1MCwgMTgsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LApAQCAtMjE1LDE4ICsyMTgsMjAgQEAKIC8qNDAqLwl7IjgwMHg0ODB4MTYiLCAgIHsweDdhLDB4N2F9LCAweDAwMDAsIDB4MDAwMCwgIDgwMCwgIDQ4MCwgMTYsIDEsIDEwMCwgMzAsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiODAweDQ4MHgyNCIsICAgezB4NzYsMHg3Nn0sIDB4MDAwMCwgMHgwMDAwLCAgODAwLCAgNDgwLCAzMiwgMSwgMTAwLCAzMCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyI4MDB4NDgweDMyIiwgICB7MHg3NiwweDc2fSwgMHgwMDAwLCAweDAwMDAsICA4MDAsICA0ODAsIDMyLCAxLCAxMDAsIDMwLCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKLSNkZWZpbmUgREVGQVVMVF9NT0RFICAgICAgICAgICAgICA0MyAvKiBpbmRleCBmb3IgODAweDYwMHg4ICovCi0jZGVmaW5lIERFRkFVTFRfTENETU9ERSAgICAgICAgICAgNDMgLyogaW5kZXggZm9yIDgwMHg2MDB4OCAqLwotI2RlZmluZSBERUZBVUxUX1RWTU9ERSAgICAgICAgICAgIDQzIC8qIGluZGV4IGZvciA4MDB4NjAweDggKi8KKyNkZWZpbmUgREVGQVVMVF9NT0RFCQk0MyAvKiBpbmRleCBmb3IgODAweDYwMHg4ICovCisjZGVmaW5lIERFRkFVTFRfTENETU9ERQkJNDMgLyogaW5kZXggZm9yIDgwMHg2MDB4OCAqLworI2RlZmluZSBERUZBVUxUX1RWTU9ERQkJNDMgLyogaW5kZXggZm9yIDgwMHg2MDB4OCAqLwogCXsiODAweDYwMHg4IiwgICAgezB4MzAsMHgzMH0sIDB4MDEwMywgMHgwMTAzLCAgODAwLCAgNjAwLCAgOCwgMiwgMTAwLCAzNywgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyI4MDB4NjAweDE2IiwgICB7MHg0NywweDQ3fSwgMHgwMTE0LCAweDAxMTQsICA4MDAsICA2MDAsIDE2LCAyLCAxMDAsIDM3LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjgwMHg2MDB4MjQiLCAgIHsweDYzLDB4NjN9LCAweDAxM2IsIDB4MDExNSwgIDgwMCwgIDYwMCwgMzIsIDIsIDEwMCwgMzcsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiODAweDYwMHgzMiIsICAgezB4NjMsMHg2M30sIDB4MDEzYiwgMHgwMTE1LCAgODAwLCAgNjAwLCAzMiwgMiwgMTAwLCAzNywgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyI4NDh4NDgweDgiLCAgICB7MHgzOSwweDM5fSwgMHgwMDAwLCAweDAwMDAsICA4NDgsICA0ODAsICA4LCAyLCAxMDYsIDMwLCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKKyNkZWZpbmUgREVGQVVMVF9NT0RFXzg0OAk0OAogCXsiODQ4eDQ4MHgxNiIsICAgezB4M2IsMHgzYn0sIDB4MDAwMCwgMHgwMDAwLCAgODQ4LCAgNDgwLCAxNiwgMiwgMTA2LCAzMCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyI4NDh4NDgweDI0IiwgICB7MHgzZSwweDNlfSwgMHgwMDAwLCAweDAwMDAsICA4NDgsICA0ODAsIDMyLCAyLCAxMDYsIDMwLCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIC8qNTAqLwl7Ijg0OHg0ODB4MzIiLCAgIHsweDNlLDB4M2V9LCAweDAwMDAsIDB4MDAwMCwgIDg0OCwgIDQ4MCwgMzIsIDIsIDEwNiwgMzAsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiODU2eDQ4MHg4IiwgICAgezB4M2YsMHgzZn0sIDB4MDAwMCwgMHgwMDAwLCAgODU2LCAgNDgwLCAgOCwgMiwgMTA3LCAzMCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCisjZGVmaW5lIERFRkFVTFRfTU9ERV84NTYJNTIKIAl7Ijg1Nng0ODB4MTYiLCAgIHsweDQyLDB4NDJ9LCAweDAwMDAsIDB4MDAwMCwgIDg1NiwgIDQ4MCwgMTYsIDIsIDEwNywgMzAsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiODU2eDQ4MHgyNCIsICAgezB4NDUsMHg0NX0sIDB4MDAwMCwgMHgwMDAwLCAgODU2LCAgNDgwLCAzMiwgMiwgMTA3LCAzMCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyI4NTZ4NDgweDMyIiwgICB7MHg0NSwweDQ1fSwgMHgwMDAwLCAweDAwMDAsICA4NTYsICA0ODAsIDMyLCAyLCAxMDcsIDMwLCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKQEAgLTI3MCw0MiArMjc1LDQ3IEBACiAJeyIxMjgweDgwMHgxNiIsICB7MHgxNSwweDE1fSwgMHgwMDAwLCAweDAwMDAsIDEyODAsICA4MDAsIDE2LCAxLCAxNjAsIDUwLCAgICAgICAgICAgTURfU0lTMzE1fSwKIAl7IjEyODB4ODAweDI0IiwgIHsweDE2LDB4MTZ9LCAweDAwMDAsIDB4MDAwMCwgMTI4MCwgIDgwMCwgMzIsIDEsIDE2MCwgNTAsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMTI4MHg4MDB4MzIiLCAgezB4MTYsMHgxNn0sIDB4MDAwMCwgMHgwMDAwLCAxMjgwLCAgODAwLCAzMiwgMSwgMTYwLCA1MCwgICAgICAgICAgIE1EX1NJUzMxNX0sCisJeyIxMjgweDg1NHg4IiwgICB7MHgxNCwweDE0fSwgMHgwMDAwLCAweDAwMDAsIDEyODAsICA4NTQsICA4LCAxLCAxNjAsIDUzLCAgICAgICAgICAgTURfU0lTMzE1fSwKKwl7IjEyODB4ODU0eDE2IiwgIHsweDE1LDB4MTV9LCAweDAwMDAsIDB4MDAwMCwgMTI4MCwgIDg1NCwgMTYsIDEsIDE2MCwgNTMsICAgICAgICAgICBNRF9TSVMzMTV9LAorCXsiMTI4MHg4NTR4MjQiLCAgezB4MTYsMHgxNn0sIDB4MDAwMCwgMHgwMDAwLCAxMjgwLCAgODU0LCAzMiwgMSwgMTYwLCA1MywgICAgICAgICAgIE1EX1NJUzMxNX0sCisJeyIxMjgweDg1NHgzMiIsICB7MHgxNiwweDE2fSwgMHgwMDAwLCAweDAwMDAsIDEyODAsICA4NTQsIDMyLCAxLCAxNjAsIDUzLCAgICAgICAgICAgTURfU0lTMzE1fSwKIAl7IjEyODB4OTYweDgiLCAgIHsweDdjLDB4N2N9LCAweDAwMDAsIDB4MDAwMCwgMTI4MCwgIDk2MCwgIDgsIDEsIDE2MCwgNjAsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAotCXsiMTI4MHg5NjB4MTYiLCAgezB4N2QsMHg3ZH0sIDB4MDAwMCwgMHgwMDAwLCAxMjgwLCAgOTYwLCAxNiwgMSwgMTYwLCA2MCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCisvKjEwMCovCXsiMTI4MHg5NjB4MTYiLCAgezB4N2QsMHg3ZH0sIDB4MDAwMCwgMHgwMDAwLCAxMjgwLCAgOTYwLCAxNiwgMSwgMTYwLCA2MCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyIxMjgweDk2MHgyNCIsICB7MHg3ZSwweDdlfSwgMHgwMDAwLCAweDAwMDAsIDEyODAsICA5NjAsIDMyLCAxLCAxNjAsIDYwLCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjEyODB4OTYweDMyIiwgIHsweDdlLDB4N2V9LCAweDAwMDAsIDB4MDAwMCwgMTI4MCwgIDk2MCwgMzIsIDEsIDE2MCwgNjAsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiMTI4MHgxMDI0eDgiLCAgezB4M2EsMHgzYX0sIDB4MDEwNywgMHgwMTA3LCAxMjgwLCAxMDI0LCAgOCwgMiwgMTYwLCA2NCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCi0vKjEwMCovCXsiMTI4MHgxMDI0eDE2IiwgezB4NGQsMHg0ZH0sIDB4MDExYSwgMHgwMTFhLCAxMjgwLCAxMDI0LCAxNiwgMiwgMTYwLCA2NCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCisJeyIxMjgweDEwMjR4MTYiLCB7MHg0ZCwweDRkfSwgMHgwMTFhLCAweDAxMWEsIDEyODAsIDEwMjQsIDE2LCAyLCAxNjAsIDY0LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjEyODB4MTAyNHgyNCIsIHsweDY1LDB4NjV9LCAweDAxM2QsIDB4MDExYiwgMTI4MCwgMTAyNCwgMzIsIDIsIDE2MCwgNjQsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiMTI4MHgxMDI0eDMyIiwgezB4NjUsMHg2NX0sIDB4MDEzZCwgMHgwMTFiLCAxMjgwLCAxMDI0LCAzMiwgMiwgMTYwLCA2NCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyIxMzYweDc2OHg4IiwgICB7MHg0OCwweDQ4fSwgMHgwMDAwLCAweDAwMDAsIDEzNjAsICA3NjgsICA4LCAxLCAxNzAsIDQ4LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjEzNjB4NzY4eDE2IiwgIHsweDRiLDB4NGJ9LCAweDAwMDAsIDB4MDAwMCwgMTM2MCwgIDc2OCwgMTYsIDEsIDE3MCwgNDgsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiMTM2MHg3Njh4MjQiLCAgezB4NGUsMHg0ZX0sIDB4MDAwMCwgMHgwMDAwLCAxMzYwLCAgNzY4LCAzMiwgMSwgMTcwLCA0OCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCi0JeyIxMzYweDc2OHgzMiIsICB7MHg0ZSwweDRlfSwgMHgwMDAwLCAweDAwMDAsIDEzNjAsICA3NjgsIDMyLCAxLCAxNzAsIDQ4LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKKy8qMTEwKi8JeyIxMzYweDc2OHgzMiIsICB7MHg0ZSwweDRlfSwgMHgwMDAwLCAweDAwMDAsIDEzNjAsICA3NjgsIDMyLCAxLCAxNzAsIDQ4LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjEzNjB4MTAyNHg4IiwgIHsweDY3LDB4Njd9LCAweDAwMDAsIDB4MDAwMCwgMTM2MCwgMTAyNCwgIDgsIDEsIDE3MCwgNjQsIE1EX1NJUzMwMCAgICAgICAgICB9LAorI2RlZmluZSBERUZBVUxUX01PREVfMTM2MAkxMTIKIAl7IjEzNjB4MTAyNHgxNiIsIHsweDZmLDB4NmZ9LCAweDAwMDAsIDB4MDAwMCwgMTM2MCwgMTAyNCwgMTYsIDEsIDE3MCwgNjQsIE1EX1NJUzMwMCAgICAgICAgICB9LAogCXsiMTM2MHgxMDI0eDI0IiwgezB4NzIsMHg3Mn0sIDB4MDAwMCwgMHgwMDAwLCAxMzYwLCAxMDI0LCAzMiwgMSwgMTcwLCA2NCwgTURfU0lTMzAwICAgICAgICAgIH0sCi0vKjExMCovCXsiMTM2MHgxMDI0eDMyIiwgezB4NzIsMHg3Mn0sIDB4MDAwMCwgMHgwMDAwLCAxMzYwLCAxMDI0LCAzMiwgMSwgMTcwLCA2NCwgTURfU0lTMzAwICAgICAgICAgIH0sCisJeyIxMzYweDEwMjR4MzIiLCB7MHg3MiwweDcyfSwgMHgwMDAwLCAweDAwMDAsIDEzNjAsIDEwMjQsIDMyLCAxLCAxNzAsIDY0LCBNRF9TSVMzMDAgICAgICAgICAgfSwKIAl7IjE0MDB4MTA1MHg4IiwgIHsweDI2LDB4MjZ9LCAweDAwMDAsIDB4MDAwMCwgMTQwMCwgMTA1MCwgIDgsIDEsIDE3NSwgNjUsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMTQwMHgxMDUweDE2IiwgezB4MjcsMHgyN30sIDB4MDAwMCwgMHgwMDAwLCAxNDAwLCAxMDUwLCAxNiwgMSwgMTc1LCA2NSwgICAgICAgICAgIE1EX1NJUzMxNX0sCiAJeyIxNDAweDEwNTB4MjQiLCB7MHgyOCwweDI4fSwgMHgwMDAwLCAweDAwMDAsIDE0MDAsIDEwNTAsIDMyLCAxLCAxNzUsIDY1LCAgICAgICAgICAgTURfU0lTMzE1fSwKIAl7IjE0MDB4MTA1MHgzMiIsIHsweDI4LDB4Mjh9LCAweDAwMDAsIDB4MDAwMCwgMTQwMCwgMTA1MCwgMzIsIDEsIDE3NSwgNjUsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMTYwMHgxMjAweDgiLCAgezB4M2MsMHgzY30sIDB4MDEzMCwgMHgwMTFjLCAxNjAwLCAxMjAwLCAgOCwgMSwgMjAwLCA3NSwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCi0JeyIxNjAweDEyMDB4MTYiLCB7MHgzZCwweDNkfSwgMHgwMTMxLCAweDAxMWUsIDE2MDAsIDEyMDAsIDE2LCAxLCAyMDAsIDc1LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKKy8qMTIwKi8JeyIxNjAweDEyMDB4MTYiLCB7MHgzZCwweDNkfSwgMHgwMTMxLCAweDAxMWUsIDE2MDAsIDEyMDAsIDE2LCAxLCAyMDAsIDc1LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjE2MDB4MTIwMHgyNCIsIHsweDY2LDB4NjZ9LCAweDAxM2UsIDB4MDExZiwgMTYwMCwgMTIwMCwgMzIsIDEsIDIwMCwgNzUsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiMTYwMHgxMjAweDMyIiwgezB4NjYsMHg2Nn0sIDB4MDEzZSwgMHgwMTFmLCAxNjAwLCAxMjAwLCAzMiwgMSwgMjAwLCA3NSwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyIxNjgweDEwNTB4OCIsICB7MHgxNywweDE3fSwgMHgwMDAwLCAweDAwMDAsIDE2ODAsIDEwNTAsICA4LCAxLCAyMTAsIDY1LCAgICAgICAgICAgTURfU0lTMzE1fSwKLS8qMTIwKi8JeyIxNjgweDEwNTB4MTYiLCB7MHgxOCwweDE4fSwgMHgwMDAwLCAweDAwMDAsIDE2ODAsIDEwNTAsIDE2LCAxLCAyMTAsIDY1LCAgICAgICAgICAgTURfU0lTMzE1fSwKKwl7IjE2ODB4MTA1MHgxNiIsIHsweDE4LDB4MTh9LCAweDAwMDAsIDB4MDAwMCwgMTY4MCwgMTA1MCwgMTYsIDEsIDIxMCwgNjUsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMTY4MHgxMDUweDI0IiwgezB4MTksMHgxOX0sIDB4MDAwMCwgMHgwMDAwLCAxNjgwLCAxMDUwLCAzMiwgMSwgMjEwLCA2NSwgICAgICAgICAgIE1EX1NJUzMxNX0sCiAJeyIxNjgweDEwNTB4MzIiLCB7MHgxOSwweDE5fSwgMHgwMDAwLCAweDAwMDAsIDE2ODAsIDEwNTAsIDMyLCAxLCAyMTAsIDY1LCAgICAgICAgICAgTURfU0lTMzE1fSwKIAl7IjE5MjB4MTA4MHg4IiwgIHsweDJjLDB4MmN9LCAweDAwMDAsIDB4MDAwMCwgMTkyMCwgMTA4MCwgIDgsIDEsIDI0MCwgNjcsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMTkyMHgxMDgweDE2IiwgezB4MmQsMHgyZH0sIDB4MDAwMCwgMHgwMDAwLCAxOTIwLCAxMDgwLCAxNiwgMSwgMjQwLCA2NywgICAgICAgICAgIE1EX1NJUzMxNX0sCiAJeyIxOTIweDEwODB4MjQiLCB7MHg3MywweDczfSwgMHgwMDAwLCAweDAwMDAsIDE5MjAsIDEwODAsIDMyLCAxLCAyNDAsIDY3LCAgICAgICAgICAgTURfU0lTMzE1fSwKLQl7IjE5MjB4MTA4MHgzMiIsIHsweDczLDB4NzN9LCAweDAwMDAsIDB4MDAwMCwgMTkyMCwgMTA4MCwgMzIsIDEsIDI0MCwgNjcsICAgICAgICAgICBNRF9TSVMzMTV9LAorLyoxMzAqLwl7IjE5MjB4MTA4MHgzMiIsIHsweDczLDB4NzN9LCAweDAwMDAsIDB4MDAwMCwgMTkyMCwgMTA4MCwgMzIsIDEsIDI0MCwgNjcsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMTkyMHgxNDQweDgiLCAgezB4NjgsMHg2OH0sIDB4MDEzZiwgMHgwMDAwLCAxOTIwLCAxNDQwLCAgOCwgMSwgMjQwLCA3NSwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyIxOTIweDE0NDB4MTYiLCB7MHg2OSwweDY5fSwgMHgwMTQwLCAweDAwMDAsIDE5MjAsIDE0NDAsIDE2LCAxLCAyNDAsIDc1LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjE5MjB4MTQ0MHgyNCIsIHsweDZiLDB4NmJ9LCAweDAxNDEsIDB4MDAwMCwgMTkyMCwgMTQ0MCwgMzIsIDEsIDI0MCwgNzUsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAotLyoxMzAqLwl7IjE5MjB4MTQ0MHgzMiIsIHsweDZiLDB4NmJ9LCAweDAxNDEsIDB4MDAwMCwgMTkyMCwgMTQ0MCwgMzIsIDEsIDI0MCwgNzUsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAorCXsiMTkyMHgxNDQweDMyIiwgezB4NmIsMHg2Yn0sIDB4MDE0MSwgMHgwMDAwLCAxOTIwLCAxNDQwLCAzMiwgMSwgMjQwLCA3NSwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyIyMDQ4eDE1MzZ4OCIsICB7MHg2YywweDZjfSwgMHgwMDAwLCAweDAwMDAsIDIwNDgsIDE1MzYsICA4LCAxLCAyNTYsIDk2LCAgICAgICAgICAgTURfU0lTMzE1fSwKIAl7IjIwNDh4MTUzNngxNiIsIHsweDZkLDB4NmR9LCAweDAwMDAsIDB4MDAwMCwgMjA0OCwgMTUzNiwgMTYsIDEsIDI1NiwgOTYsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMjA0OHgxNTM2eDI0IiwgezB4NmUsMHg2ZX0sIDB4MDAwMCwgMHgwMDAwLCAyMDQ4LCAxNTM2LCAzMiwgMSwgMjU2LCA5NiwgICAgICAgICAgIE1EX1NJUzMxNX0sCkBAIC0zMTMsMTMgKzMyMywxMyBAQAogCXsiXDAiLCB7MHgwMCwweDAwfSwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KIH07CiAKLSNkZWZpbmUgU0lTX0xDRF9OVU1CRVIgMTcKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgX3Npc19sY2RfZGF0YSB7CisjZGVmaW5lIFNJU19MQ0RfTlVNQkVSIDE4CitzdGF0aWMgc3RydWN0IF9zaXNfbGNkX2RhdGEgewogCXUzMiBsY2R0eXBlOwogCXUxNiB4cmVzOwogCXUxNiB5cmVzOwogCXU4ICBkZWZhdWx0X21vZGVfaWR4OwotfSBzaXNfbGNkX2RhdGFbXSA9IHsKK30gc2lzX2xjZF9kYXRhW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7IExDRF82NDB4NDgwLCAgICA2NDAsICA0ODAsICAyMyB9LAogCXsgTENEXzgwMHg2MDAsICAgIDgwMCwgIDYwMCwgIDQzIH0sCiAJeyBMQ0RfMTAyNHg2MDAsICAxMDI0LCAgNjAwLCAgNjcgfSwKQEAgLTMyOSwzNCArMzM5LDM4IEBACiAJeyBMQ0RfMTI4MHg3MjAsICAxMjgwLCAgNzIwLCAgODMgfSwKIAl7IExDRF8xMjgweDc2OCwgIDEyODAsICA3NjgsICA4NyB9LAogCXsgTENEXzEyODB4ODAwLCAgMTI4MCwgIDgwMCwgIDkxIH0sCi0JeyBMQ0RfMTI4MHg5NjAsICAxMjgwLCAgOTYwLCAgOTUgfSwKLQl7IExDRF8xMjgweDEwMjQsIDEyODAsIDEwMjQsICA5OSB9LAotCXsgTENEXzE0MDB4MTA1MCwgMTQwMCwgMTA1MCwgMTExIH0sCi0JeyBMQ0RfMTY4MHgxMDUwLCAxNjgwLCAxMDUwLCAxMTkgfSwKLQl7IExDRF8xNjAweDEyMDAsIDE2MDAsIDEyMDAsIDExNSB9LAotCXsgTENEXzY0MHg0ODBfMiwgIDY0MCwgIDQ4MCwgIDIzIH0sCi0JeyBMQ0RfNjQweDQ4MF8zLCAgNjQwLCAgNDgwLCAgMjMgfSwKLQl7IExDRF8zMjB4NDgwLCAgICAzMjAsICA0ODAsICAgOSB9LAorCXsgTENEXzEyODB4ODU0LCAgMTI4MCwgIDg1NCwgIDk1IH0sCisJeyBMQ0RfMTI4MHg5NjAsICAxMjgwLCAgOTYwLCAgOTkgfSwKKwl7IExDRF8xMjgweDEwMjQsIDEyODAsIDEwMjQsIDEwMyB9LAorCXsgTENEXzE0MDB4MTA1MCwgMTQwMCwgMTA1MCwgMTE1IH0sCisJeyBMQ0RfMTY4MHgxMDUwLCAxNjgwLCAxMDUwLCAxMjMgfSwKKwl7IExDRF8xNjAweDEyMDAsIDE2MDAsIDEyMDAsIDExOSB9LAorCXsgTENEXzMyMHgyNDBfMiwgIDMyMCwgIDI0MCwgICA5IH0sCisJeyBMQ0RfMzIweDI0MF8zLCAgMzIwLCAgMjQwLCAgIDkgfSwKKwl7IExDRF8zMjB4MjQwLCAgICAzMjAsICAyNDAsICAgOSB9LAogfTsKIAogLyogQ1IzNiBldmFsdWF0aW9uICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIHNpczMwMHBhbmVsdHlwZVtdID0KLSAgICB7IExDRF9VTktOT1dOLCAgIExDRF84MDB4NjAwLCAgIExDRF8xMDI0eDc2OCwgIExDRF8xMjgweDEwMjQsCi0gICAgICBMQ0RfMTI4MHg5NjAsICBMQ0RfNjQweDQ4MCwgICBMQ0RfMTAyNHg2MDAsICBMQ0RfMTE1Mng3NjgsCi0gICAgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwKLSAgICAgIExDRF9VTktOT1dOLCAgIExDRF9VTktOT1dOLCAgIExDRF9VTktOT1dOLCAgIExDRF9VTktOT1dOIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2lzMzAwcGFuZWx0eXBlW10gX19kZXZpbml0ZGF0YSA9IHsKKwlMQ0RfVU5LTk9XTiwgICBMQ0RfODAweDYwMCwgICBMQ0RfMTAyNHg3NjgsICBMQ0RfMTI4MHgxMDI0LAorCUxDRF8xMjgweDk2MCwgIExDRF82NDB4NDgwLCAgIExDRF8xMDI0eDYwMCwgIExDRF8xMTUyeDc2OCwKKwlMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwKKwlMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTgorfTsKIAotc3RhdGljIGNvbnN0IFVTSE9SVCBzaXMzMTBwYW5lbHR5cGVbXSA9Ci0gICAgeyBMQ0RfVU5LTk9XTiwgICBMQ0RfODAweDYwMCwgICBMQ0RfMTAyNHg3NjgsICBMQ0RfMTI4MHgxMDI0LAotICAgICAgTENEXzY0MHg0ODAsICAgTENEXzEwMjR4NjAwLCAgTENEXzExNTJ4ODY0LCAgTENEXzEyODB4OTYwLAotICAgICAgTENEXzExNTJ4NzY4LCAgTENEXzE0MDB4MTA1MCwgTENEXzEyODB4NzY4LCAgTENEXzE2MDB4MTIwMCwKLSAgICAgIExDRF82NDB4NDgwXzIsIExDRF82NDB4NDgwXzMsIExDRF9VTktOT1dOLCAgIExDRF9VTktOT1dOIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2lzMzEwcGFuZWx0eXBlW10gX19kZXZpbml0ZGF0YSA9IHsKKwlMQ0RfVU5LTk9XTiwgICBMQ0RfODAweDYwMCwgICBMQ0RfMTAyNHg3NjgsICBMQ0RfMTI4MHgxMDI0LAorCUxDRF82NDB4NDgwLCAgIExDRF8xMDI0eDYwMCwgIExDRF8xMTUyeDg2NCwgIExDRF8xMjgweDk2MCwKKwlMQ0RfMTE1Mng3NjgsICBMQ0RfMTQwMHgxMDUwLCBMQ0RfMTI4MHg3NjgsICBMQ0RfMTYwMHgxMjAwLAorCUxDRF8zMjB4MjQwXzIsIExDRF8zMjB4MjQwXzMsIExDRF9VTktOT1dOLCAgIExDRF9VTktOT1dOCit9OwogCi1zdGF0aWMgY29uc3QgVVNIT1JUIHNpczY2MXBhbmVsdHlwZVtdID0KLSAgICB7IExDRF9VTktOT1dOLCAgIExDRF84MDB4NjAwLCAgIExDRF8xMDI0eDc2OCwgIExDRF8xMjgweDEwMjQsCi0gICAgICBMQ0RfNjQweDQ4MCwgICBMQ0RfMTAyNHg2MDAsICBMQ0RfMTE1Mng4NjQsICBMQ0RfMTI4MHg5NjAsCi0gICAgICBMQ0RfMTE1Mng3NjgsICBMQ0RfMTQwMHgxMDUwLCBMQ0RfMTI4MHg3NjgsICBMQ0RfMTYwMHgxMjAwLAotICAgICAgTENEXzEyODB4ODAwLCAgTENEXzE2ODB4MTA1MCwgTENEXzEyODB4NzIwLCAgTENEX1VOS05PV04gfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzaXM2NjFwYW5lbHR5cGVbXSBfX2RldmluaXRkYXRhID0geworCUxDRF9VTktOT1dOLCAgIExDRF84MDB4NjAwLCAgIExDRF8xMDI0eDc2OCwgIExDRF8xMjgweDEwMjQsCisJTENEXzY0MHg0ODAsICAgTENEXzEwMjR4NjAwLCAgTENEXzExNTJ4ODY0LCAgTENEXzEyODB4OTYwLAorCUxDRF8xMjgweDg1NCwgIExDRF8xNDAweDEwNTAsIExDRF8xMjgweDc2OCwgIExDRF8xNjAweDEyMDAsCisJTENEXzEyODB4ODAwLCAgTENEXzE2ODB4MTA1MCwgTENEXzEyODB4NzIwLCAgTENEX1VOS05PV04KK307CiAKICNkZWZpbmUgRkxfNTUwX0RTVE4gMHgwMQogI2RlZmluZSBGTF81NTBfRlNUTiAweDAyCkBAIC00MTMsNyArNDI3LDYgQEAKIH0gc2lzZmJfdnJhdGVbXSA9IHsKIAl7MSwgIDMyMCwgIDIwMCwgIDcwLCAgVFJVRX0sCiAJezEsICAzMjAsICAyNDAsICA2MCwgIFRSVUV9LAotCXsxLCAgMzIwLCAgNDgwLCAgNjAsICBUUlVFfSwKIAl7MSwgIDQwMCwgIDMwMCwgIDYwLCAgVFJVRX0sCiAJezEsICA1MTIsICAzODQsICA2MCwgIFRSVUV9LAogCXsxLCAgNjQwLCAgNDAwLCAgNzIsICBUUlVFfSwKQEAgLTQzNywxMCArNDUwLDExIEBACiAJezQsIDEwMjQsICA3NjgsICA3NSwgRkFMU0V9LCB7NSwgMTAyNCwgIDc2OCwgIDg1LCAgVFJVRX0sIHs2LCAxMDI0LCAgNzY4LCAxMDAsICBUUlVFfSwKIAl7NywgMTAyNCwgIDc2OCwgMTIwLCAgVFJVRX0sCiAJezEsIDExNTIsICA3NjgsICA2MCwgIFRSVUV9LAotCXsxLCAxMTUyLCAgODY0LCAgNjAsICBUUlVFfSwgezEsIDExNTIsICA4NjQsICA3NSwgIFRSVUV9LCB7MiwgMTE1MiwgIDg2NCwgIDg0LCAgVFJVRX0sCisJezEsIDExNTIsICA4NjQsICA2MCwgIFRSVUV9LCB7MiwgMTE1MiwgIDg2NCwgIDc1LCAgVFJVRX0sIHszLCAxMTUyLCAgODY0LCAgODQsICBUUlVFfSwKIAl7MSwgMTI4MCwgIDcyMCwgIDYwLCAgVFJVRX0sIHsyLCAxMjgwLCAgNzIwLCAgNzUsICBUUlVFfSwgezMsIDEyODAsICA3MjAsICA4NSwgIFRSVUV9LAogCXsxLCAxMjgwLCAgNzY4LCAgNjAsICBUUlVFfSwKIAl7MSwgMTI4MCwgIDgwMCwgIDYwLCAgVFJVRX0sCisJezEsIDEyODAsICA4NTQsICA2MCwgIFRSVUV9LAogCXsxLCAxMjgwLCAgOTYwLCAgNjAsICBUUlVFfSwgezIsIDEyODAsICA5NjAsICA4NSwgIFRSVUV9LAogCXsxLCAxMjgwLCAxMDI0LCAgNDMsICBUUlVFfSwgezIsIDEyODAsIDEwMjQsICA2MCwgIFRSVUV9LCB7MywgMTI4MCwgMTAyNCwgIDc1LCAgVFJVRX0sCiAJezQsIDEyODAsIDEwMjQsICA4NSwgIFRSVUV9LApAQCAtNDU5LDEyICs0NzMsMTIgQEAKIAl7MCwgICAgMCwgICAgMCwgICAwLCBGQUxTRX0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgX3Npc2ZiZGRjc21vZGVzIHsKK3N0YXRpYyBzdHJ1Y3QgX3Npc2ZiZGRjc21vZGVzIHsKIAl1MzIgbWFzazsKIAl1MTYgaDsKIAl1MTYgdjsKIAl1MzIgZDsKLX0gc2lzZmJfZGRjc21vZGVzW10gPSB7Cit9IHNpc2ZiX2RkY3Ntb2Rlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyAweDEwMDAwLCA2NywgNzUsIDEwODAwMH0sCiAJeyAweDA4MDAwLCA0OCwgNzIsICA1MDAwMH0sCiAJeyAweDA0MDAwLCA0NiwgNzUsICA0OTUwMH0sCkBAIC00ODAsNDkgKzQ5NCw0OSBAQAogCXsgMHgwMDAwMSwgMzgsIDYwLCAgNDAwMDB9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IF9zaXNmYmRkY2Ztb2RlcyB7CitzdGF0aWMgc3RydWN0IF9zaXNmYmRkY2Ztb2RlcyB7CiAJdTE2IHg7CiAJdTE2IHk7CiAJdTE2IHY7CiAJdTE2IGg7CiAJdTMyIGQ7Ci19IHNpc2ZiX2RkY2Ztb2Rlc1tdID0gewotICAgICAgIHsgMTI4MCwgMTAyNCwgODUsIDkyLCAxNTc1MDB9LAotICAgICAgIHsgMTYwMCwgMTIwMCwgNjAsIDc1LCAxNjIwMDB9LAotICAgICAgIHsgMTYwMCwgMTIwMCwgNjUsIDgyLCAxNzU1MDB9LAotICAgICAgIHsgMTYwMCwgMTIwMCwgNzAsIDg4LCAxODkwMDB9LAotICAgICAgIHsgMTYwMCwgMTIwMCwgNzUsIDk0LCAyMDI1MDB9LAotICAgICAgIHsgMTYwMCwgMTIwMCwgODUsIDEwNywyMjk1MDB9LAotICAgICAgIHsgMTkyMCwgMTQ0MCwgNjAsIDkwLCAyMzQwMDB9LAotICAgICAgIHsgMTkyMCwgMTQ0MCwgNzUsIDExMywyOTcwMDB9Cit9IHNpc2ZiX2RkY2Ztb2Rlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyAxMjgwLCAxMDI0LCA4NSwgOTIsIDE1NzUwMH0sCisJeyAxNjAwLCAxMjAwLCA2MCwgNzUsIDE2MjAwMH0sCisJeyAxNjAwLCAxMjAwLCA2NSwgODIsIDE3NTUwMH0sCisJeyAxNjAwLCAxMjAwLCA3MCwgODgsIDE4OTAwMH0sCisJeyAxNjAwLCAxMjAwLCA3NSwgOTQsIDIwMjUwMH0sCisJeyAxNjAwLCAxMjAwLCA4NSwgMTA3LDIyOTUwMH0sCisJeyAxOTIwLCAxNDQwLCA2MCwgOTAsIDIzNDAwMH0sCisJeyAxOTIwLCAxNDQwLCA3NSwgMTEzLDI5NzAwMH0KIH07CiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMwMAogc3RhdGljIHN0cnVjdCBfY2hzd3RhYmxlIHsKLSAgICB1MTYgIHN1YnN5c1ZlbmRvcjsKLSAgICB1MTYgIHN1YnN5c0NhcmQ7Ci0gICAgY2hhciAqdmVuZG9yTmFtZTsKLSAgICBjaGFyICpjYXJkTmFtZTsKKwl1MTYgIHN1YnN5c1ZlbmRvcjsKKwl1MTYgIHN1YnN5c0NhcmQ7CisJY2hhciAqdmVuZG9yTmFtZTsKKwljaGFyICpjYXJkTmFtZTsKIH0gbXljaHN3dGFibGVbXSBfX2RldmluaXRkYXRhID0gewotICAgICAgICB7IDB4MTYzMSwgMHgxMDAyLCAiTWl0YWNoaSIsICIweDEwMDIiIH0sCisJeyAweDE2MzEsIDB4MTAwMiwgIk1pdGFjaGkiLCAiMHgxMDAyIiB9LAogCXsgMHgxMDcxLCAweDc1MjEsICJNaXRhYyIgICwgIjc1MjFQIiAgfSwKIAl7IDAsICAgICAgMCwgICAgICAiIiAgICAgICAsICIiICAgICAgIH0KIH07CiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBfY3VzdG9tdHRhYmxlIHsKLSAgICB1MTYgICBjaGlwSUQ7Ci0gICAgY2hhciAgKmJpb3N2ZXJzaW9uOwotICAgIGNoYXIgICpiaW9zZGF0ZTsKLSAgICB1MzIgICBiaW9zY2hrc3VtOwotICAgIHUxNiAgIGJpb3NGb290cHJpbnRBZGRyWzVdOwotICAgIHU4ICAgIGJpb3NGb290cHJpbnREYXRhWzVdOwotICAgIHUxNiAgIHBjaXN1YnN5c3ZlbmRvcjsKLSAgICB1MTYgICBwY2lzdWJzeXNjYXJkOwotICAgIGNoYXIgICp2ZW5kb3JOYW1lOwotICAgIGNoYXIgICpjYXJkTmFtZTsKLSAgICB1MzIgICBTcGVjaWFsSUQ7Ci0gICAgY2hhciAgKm9wdGlvbk5hbWU7CisJdTE2ICAgY2hpcElEOworCWNoYXIgICpiaW9zdmVyc2lvbjsKKwljaGFyICAqYmlvc2RhdGU7CisJdTMyICAgYmlvc2Noa3N1bTsKKwl1MTYgICBiaW9zRm9vdHByaW50QWRkcls1XTsKKwl1OCAgICBiaW9zRm9vdHByaW50RGF0YVs1XTsKKwl1MTYgICBwY2lzdWJzeXN2ZW5kb3I7CisJdTE2ICAgcGNpc3Vic3lzY2FyZDsKKwljaGFyICAqdmVuZG9yTmFtZTsKKwljaGFyICAqY2FyZE5hbWU7CisJdTMyICAgU3BlY2lhbElEOworCWNoYXIgICpvcHRpb25OYW1lOwogfSBteWN1c3RvbXR0YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyBTSVNfNjMwLCAiMi4wMC4wNyIsICIwOS8yNy8yMDAyLTEzOjM4OjI1IiwKIAkgIDB4MzI0MEE4LApAQCAtNjQzLDYgKzY1NywxMyBAQAogCSAgMCwgMCwKIAkgICJHZW5lcmljIiwgIkxWRFMvUGFyYWxsZWwgODQ4eDQ4MCIsIENVVF9QQU5FTDg0OCwgIlBBTkVMODQ4eDQ4MCIKIAl9LAorCXsgNDMyMiwgIiIsICIiLAkJCS8qIG5ldmVyIGF1dG9kZXRlY3RlZCAqLworCSAgMCwKKwkgIHsgMCwgMCwgMCwgMCwgMCB9LAorCSAgeyAwLCAwLCAwLCAwLCAwIH0sCisJICAwLCAwLAorCSAgIkdlbmVyaWMiLCAiTFZEUy9QYXJhbGxlbCA4NTZ4NDgwIiwgQ1VUX1BBTkVMODU2LCAiUEFORUw4NTZ4NDgwIgorCX0sCiAJeyAwLCAiIiwgIiIsCiAJICAwLAogCSAgeyAwLCAwLCAwLCAwIH0sCkBAIC02NTIsMTU1ICs2NzMsNiBAQAogCX0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgX3Npc19UVl9maWx0ZXIgewotCXU4IGZpbHRlcls5XVs0XTsKLX0gc2lzX1RWX2ZpbHRlcltdID0gewotCXsge3sweDAwLDB4MDAsMHgwMCwweDQwfSwgIC8qIE5UU0NGaWx0ZXJfMCAqLwotCSAgIHsweDAwLDB4RTAsMHgxMCwweDYwfSwKLQkgICB7MHgwMCwweEVFLDB4MTAsMHg0NH0sCi0JICAgezB4MDAsMHhGNCwweDEwLDB4Mzh9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhGQywweEZCLDB4MTQsMHgyQX0sCi0JICAgezB4MDAsMHgwMCwweDEwLDB4MjB9LAotCSAgIHsweDAwLDB4MDQsMHgxMCwweDE4fSwgCi0JICAgezB4RkYsMHhGRiwweEZGLDB4RkZ9IH19LAotCXsge3sweDAwLDB4MDAsMHgwMCwweDQwfSwgIC8qIE5UU0NGaWx0ZXJfMSAqLwotCSAgIHsweDAwLDB4RTAsMHgxMCwweDYwfSwKLQkgICB7MHgwMCwweEVFLDB4MTAsMHg0NH0sCi0JICAgezB4MDAsMHhGNCwweDEwLDB4Mzh9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhGQywweEZCLDB4MTQsMHgyQX0sCi0JICAgezB4MDAsMHgwMCwweDEwLDB4MjB9LAotCSAgIHsweDAwLDB4MDQsMHgxMCwweDE4fSwKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogTlRTQ0ZpbHRlcl8yICovCi0JICAgezB4RjUsMHhFRSwweDFCLDB4NDR9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhFQiwweDA0LDB4MjUsMHgxOH0sCi0JICAgezB4RjEsMHgwNSwweDFGLDB4MTZ9LAotCSAgIHsweEY2LDB4MDYsMHgxQSwweDE0fSwKLQkgICB7MHhGQSwweDA2LDB4MTYsMHgxNH0sCi0JICAgezB4MDAsMHgwNCwweDEwLDB4MTh9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogTlRTQ0ZpbHRlcl8zICovCi0JICAgezB4RjEsMHgwNCwweDFGLDB4MTh9LAotCSAgIHsweEVFLDB4MEQsMHgyMiwweDA2fSwKLQkgICB7MHhGNywweDA2LDB4MTksMHgxNH0sCi0JICAgezB4RjQsMHgwQiwweDFDLDB4MEF9LAotCSAgIHsweEZBLDB4MDcsMHgxNiwweDEyfSwKLQkgICB7MHhGOSwweDBBLDB4MTcsMHgwQ30sCi0JICAgezB4MDAsMHgwNywweDEwLDB4MTJ9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogTlRTQ0ZpbHRlcl80IC0gMzIwICovCi0JICAgezB4MDAsMHhFMCwweDEwLDB4NjB9LAotCSAgIHsweDAwLDB4RUUsMHgxMCwweDQ0fSwKLQkgICB7MHgwMCwweEY0LDB4MTAsMHgzOH0sCi0JICAgezB4RjgsMHhGNCwweDE4LDB4Mzh9LAotCSAgIHsweEZDLDB4RkIsMHgxNCwweDJBfSwKLQkgICB7MHgwMCwweDAwLDB4MTAsMHgyMH0sCi0JICAgezB4MDAsMHgwNCwweDEwLDB4MTh9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogTlRTQ0ZpbHRlcl81IC0gNjQwICovCi0JICAgezB4RjUsMHhFRSwweDFCLDB4NDR9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhFQiwweDA0LDB4MjUsMHgxOH0sCi0JICAgezB4RjEsMHgwNSwweDFGLDB4MTZ9LAotCSAgIHsweEY2LDB4MDYsMHgxQSwweDE0fSwKLQkgICB7MHhGQSwweDA2LDB4MTYsMHgxNH0sCi0JICAgezB4MDAsMHgwNCwweDEwLDB4MTh9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogTlRTQ0ZpbHRlcl82IC0gNzIwICovCi0JICAgezB4RUIsMHgwNCwweDI1LDB4MTh9LAotCSAgIHsweEU3LDB4MEUsMHgyOSwweDA0fSwKLQkgICB7MHhFRSwweDBDLDB4MjIsMHgwOH0sCi0JICAgezB4RjYsMHgwQiwweDFBLDB4MEF9LAotCSAgIHsweEY5LDB4MEEsMHgxNywweDBDfSwKLQkgICB7MHhGQywweDBBLDB4MTQsMHgwQ30sCi0JICAgezB4MDAsMHgwOCwweDEwLDB4MTB9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogTlRTQ0ZpbHRlcl83IC0gODAwICovCi0JICAgezB4RUMsMHgwMiwweDI0LDB4MUN9LAotCSAgIHsweEYyLDB4MDQsMHgxRSwweDE4fSwKLQkgICB7MHhFQiwweDE1LDB4MjUsMHhGNn0sCi0JICAgezB4RjQsMHgxMCwweDFDLDB4MDB9LAotCSAgIHsweEY4LDB4MEYsMHgxOCwweDAyfSwKLQkgICB7MHgwMCwweDA0LDB4MTAsMHgxOH0sCi0JICAgezB4MDEsMHgwNiwweDBGLDB4MTR9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogUEFMRmlsdGVyXzAgKi8KLQkgICB7MHgwMCwweEUwLDB4MTAsMHg2MH0sCi0JICAgezB4MDAsMHhFRSwweDEwLDB4NDR9LAotCSAgIHsweDAwLDB4RjQsMHgxMCwweDM4fSwKLQkgICB7MHhGOCwweEY0LDB4MTgsMHgzOH0sCi0JICAgezB4RkMsMHhGQiwweDE0LDB4MkF9LAotCSAgIHsweDAwLDB4MDAsMHgxMCwweDIwfSwKLQkgICB7MHgwMCwweDA0LDB4MTAsMHgxOH0sIAotCSAgIHsweEZGLDB4RkYsMHhGRiwweEZGfSB9fSwKLQl7IHt7MHgwMCwweDAwLDB4MDAsMHg0MH0sICAvKiBQQUxGaWx0ZXJfMSAqLwotCSAgIHsweDAwLDB4RTAsMHgxMCwweDYwfSwKLQkgICB7MHgwMCwweEVFLDB4MTAsMHg0NH0sCi0JICAgezB4MDAsMHhGNCwweDEwLDB4Mzh9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhGQywweEZCLDB4MTQsMHgyQX0sCi0JICAgezB4MDAsMHgwMCwweDEwLDB4MjB9LAotCSAgIHsweDAwLDB4MDQsMHgxMCwweDE4fSwgCi0JICAgezB4RkYsMHhGRiwweEZGLDB4RkZ9IH19LAotCXsge3sweDAwLDB4MDAsMHgwMCwweDQwfSwgIC8qIFBBTEZpbHRlcl8yICovCi0JICAgezB4RjUsMHhFRSwweDFCLDB4NDR9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhGMSwweEY3LDB4MDEsMHgzMn0sCi0JICAgezB4RjUsMHhGQiwweDFCLDB4MkF9LAotCSAgIHsweEY5LDB4RkYsMHgxNywweDIyfSwKLQkgICB7MHhGQiwweDAxLDB4MTUsMHgxRX0sCi0JICAgezB4MDAsMHgwNCwweDEwLDB4MTh9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogUEFMRmlsdGVyXzMgKi8KLQkgICB7MHhGNSwweEZCLDB4MUIsMHgyQX0sCi0JICAgezB4RUUsMHhGRSwweDIyLDB4MjR9LAotCSAgIHsweEYzLDB4MDAsMHgxRCwweDIwfSwKLQkgICB7MHhGOSwweDAzLDB4MTcsMHgxQX0sCi0JICAgezB4RkIsMHgwMiwweDE0LDB4MUV9LAotCSAgIHsweEZCLDB4MDQsMHgxNSwweDE4fSwKLQkgICB7MHgwMCwweDA2LDB4MTAsMHgxNH0sIAotCSAgIHsweEZGLDB4RkYsMHhGRiwweEZGfSB9fSwKLQl7IHt7MHgwMCwweDAwLDB4MDAsMHg0MH0sICAvKiBQQUxGaWx0ZXJfNCAtIDMyMCAqLwotCSAgIHsweDAwLDB4RTAsMHgxMCwweDYwfSwKLQkgICB7MHgwMCwweEVFLDB4MTAsMHg0NH0sCi0JICAgezB4MDAsMHhGNCwweDEwLDB4Mzh9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhGQywweEZCLDB4MTQsMHgyQX0sCi0JICAgezB4MDAsMHgwMCwweDEwLDB4MjB9LAotCSAgIHsweDAwLDB4MDQsMHgxMCwweDE4fSwgCi0JICAgezB4RkYsMHhGRiwweEZGLDB4RkZ9IH19LAotCXsge3sweDAwLDB4MDAsMHgwMCwweDQwfSwgIC8qIFBBTEZpbHRlcl81IC0gNjQwICovCi0JICAgezB4RjUsMHhFRSwweDFCLDB4NDR9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhGMSwweEY3LDB4MUYsMHgzMn0sCi0JICAgezB4RjUsMHhGQiwweDFCLDB4MkF9LAotCSAgIHsweEY5LDB4RkYsMHgxNywweDIyfSwKLQkgICB7MHhGQiwweDAxLDB4MTUsMHgxRX0sCi0JICAgezB4MDAsMHgwNCwweDEwLDB4MTh9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogUEFMRmlsdGVyXzYgLSA3MjAgKi8KLQkgICB7MHhGNSwweEVFLDB4MUIsMHgyQX0sCi0JICAgezB4RUUsMHhGRSwweDIyLDB4MjR9LAotCSAgIHsweEYzLDB4MDAsMHgxRCwweDIwfSwKLQkgICB7MHhGOSwweDAzLDB4MTcsMHgxQX0sCi0JICAgezB4RkIsMHgwMiwweDE0LDB4MUV9LAotCSAgIHsweEZCLDB4MDQsMHgxNSwweDE4fSwKLQkgICB7MHgwMCwweDA2LDB4MTAsMHgxNH0sIAotCSAgIHsweEZGLDB4RkYsMHhGRiwweEZGfSB9fSwKLQl7IHt7MHgwMCwweDAwLDB4MDAsMHg0MH0sICAvKiBQQUxGaWx0ZXJfNyAtIDgwMCAqLwotCSAgIHsweEY1LDB4RUUsMHgxQiwweDQ0fSwKLQkgICB7MHhGOCwweEY0LDB4MTgsMHgzOH0sCi0JICAgezB4RkMsMHhGQiwweDE0LDB4MkF9LAotCSAgIHsweEVCLDB4MDUsMHgyNSwweDE2fSwKLQkgICB7MHhGMSwweDA1LDB4MUYsMHgxNn0sCi0JICAgezB4RkEsMHgwNywweDE2LDB4MTJ9LAotCSAgIHsweDAwLDB4MDcsMHgxMCwweDEyfSwgCi0JICAgezB4RkYsMHhGRiwweEZGLDB4RkZ9IH19Ci19OwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBJbnRlcmZhY2UgdXNlZCBieSB0aGUgd29ybGQgKi8KQEAgLTgxMSwxNDUgKzY4MywxNTkgQEAKIC8qIEludGVyZmFjZSB0byB0aGUgbG93IGxldmVsIGNvbnNvbGUgZHJpdmVyICovCiBTSVNJTklUU1RBVElDIGludCBzaXNmYl9pbml0KHZvaWQpOwogCi0KIC8qIGZiZGV2IHJvdXRpbmVzICovCi1zdGF0aWMgaW50ICAgICAgc2lzZmJfZ2V0X2ZpeChzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwgaW50IGNvbiwKLQkJCSAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzZmJfZ2V0X2ZpeChzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwgaW50IGNvbiwKKwkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLXN0YXRpYyBpbnQgICAgICBzaXNmYl9nZXRfZml4KHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4LCAKLQkJCSAgICAgIGludCBjb24sCi0JCQkgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50ICAgICAgc2lzZmJfZ2V0X3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgCi0JCQkgICAgICBpbnQgY29uLAotCQkJICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCAgICAgIHNpc2ZiX3NldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIAotCQkJICAgICAgaW50IGNvbiwKLQkJCSAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyB2b2lkICAgICBzaXNmYl9jcnRjX3RvX3ZhcihzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywKLQkJCSAgICAgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcik7Ci1zdGF0aWMgaW50ICAgICAgc2lzZmJfZ2V0X2NtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIAotCQkJICAgICAgIGludCBrc3BjLCAKLQkJCSAgICAgICBpbnQgY29uLAotCQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgICAgICBzaXNmYl9zZXRfY21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwgCi0JCQkgICAgICAgaW50IGtzcGMsIAotCQkJICAgICAgIGludCBjb24sCi0JCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwkJCQotc3RhdGljIGludCAgICAgIHNpc2ZiX3VwZGF0ZV92YXIoaW50IGNvbiwgCi0JCQkJIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgICAgICBzaXNmYl9zd2l0Y2goaW50IGNvbiwgCitzdGF0aWMgaW50CXNpc2ZiX2dldF9maXgoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsCisJCQkJaW50IGNvbiwKKwkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50CXNpc2ZiX2dldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJaW50IGNvbiwKKwkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50CXNpc2ZiX3NldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJaW50IGNvbiwKKwkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZAlzaXNmYl9jcnRjX3RvX3ZhcihzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywKKwkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcik7CitzdGF0aWMgaW50CXNpc2ZiX2dldF9jbWFwKHN0cnVjdCBmYl9jbWFwICpjbWFwLAorCQkJCWludCBrc3BjLAorCQkJCWludCBjb24sCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludAlzaXNmYl9zZXRfY21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwKKwkJCQlpbnQga3NwYywKKwkJCQlpbnQgY29uLAorCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzZmJfdXBkYXRlX3ZhcihpbnQgY29uLAorCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzZmJfc3dpdGNoKGludCBjb24sCiAJCQkgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyB2b2lkICAgICBzaXNmYl9ibGFuayhpbnQgYmxhbmssIAotCQkJICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyB2b2lkICAgICBzaXNmYl9zZXRfZGlzcChpbnQgY29uLCAKLQkJCSAgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCAgICAgIHNpc19nZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkICpyZWQsIHVuc2lnbmVkICpncmVlbiwKLQkJCSAgICAgIHVuc2lnbmVkICpibHVlLCB1bnNpZ25lZCAqdHJhbnNwLAotCQkJICAgICAgc3RydWN0IGZiX2luZm8gKmZiX2luZm8pOwotc3RhdGljIHZvaWQgICAgIHNpc2ZiX2RvX2luc3RhbGxfY21hcChpbnQgY29uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCAgICAgIHNpc2ZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgICAgCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IGNvbiwKLQkJICAgICAgIAkgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwkJICAgICAgCi0jZW5kaWYJCQkKK3N0YXRpYyB2b2lkCXNpc2ZiX2JsYW5rKGludCBibGFuaywKKwkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZAlzaXNmYl9zZXRfZGlzcChpbnQgY29uLAorCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzX2dldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgKnJlZCwgdW5zaWduZWQgKmdyZWVuLAorCQkJCXVuc2lnbmVkICpibHVlLCB1bnNpZ25lZCAqdHJhbnNwLAorCQkJCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKK3N0YXRpYyB2b2lkCXNpc2ZiX2RvX2luc3RhbGxfY21hcChpbnQgY29uLAorCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCBjb24sCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pOworI2VuZGlmCiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi1zdGF0aWMgaW50ICAgICAgc2lzZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgICAJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAotCQkgICAgICAgCSAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50ICAgICAgc2lzZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50ICAgICAgc2lzZmJfYmxhbmsoaW50IGJsYW5rLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CQkJCi1leHRlcm4gdm9pZCAgICAgZmJjb25fc2lzX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KTsKLWV4dGVybiB2b2lkICAgICBmYmNvbl9zaXNfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKmFyZWEpOwotZXh0ZXJuIGludCAgICAgIGZiY29uX3Npc19zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludAlzaXNmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzZmJfYmxhbmsoaW50IGJsYW5rLAorCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKK2V4dGVybiB2b2lkCWZiY29uX3Npc19maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQljb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpOworZXh0ZXJuIHZvaWQJZmJjb25fc2lzX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJCWNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqYXJlYSk7CitleHRlcm4gaW50CWZiY29uX3Npc19zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKICNlbmRpZgotCQkJCisKIC8qIEludGVybmFsIDJEIGFjY2VsZXJhdG9yIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIGludCAgICAgIHNpc2ZiX2luaXRhY2NlbChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7Ci1leHRlcm4gdm9pZCAgICAgc2lzZmJfc3luY2FjY2VsKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK2V4dGVybiBpbnQJc2lzZmJfaW5pdGFjY2VsKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK2V4dGVybiB2b2lkCXNpc2ZiX3N5bmNhY2NlbChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7CiAKIC8qIEludGVybmFsIGdlbmVyYWwgcm91dGluZXMgKi8KLXN0YXRpYyB2b2lkICAgICBzaXNmYl9zZWFyY2hfbW9kZShjaGFyICpuYW1lLCBCT09MRUFOIHF1aWV0KTsKLXN0YXRpYyBpbnQgICAgICBzaXNmYl92YWxpZGF0ZV9tb2RlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBpbnQgbW9kZWluZGV4LCB1MzIgdmJmbGFncyk7Ci1zdGF0aWMgdTggICAgICAgc2lzZmJfc2VhcmNoX3JlZnJlc2hfcmF0ZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgdW5zaWduZWQgaW50IHJhdGUsCi0JCQlpbnQgaW5kZXgpOwotc3RhdGljIGludCAgICAgIHNpc2ZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKLQkJCXVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwKLQkJCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKLXN0YXRpYyBpbnQgICAgICBzaXNmYl9kb19zZXRfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgaXNhY3RpdmUsCi0JCSAgICAgIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgdm9pZCAgICAgc2lzZmJfcHJlX3NldG1vZGUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOwotc3RhdGljIHZvaWQgICAgIHNpc2ZiX3Bvc3Rfc2V0bW9kZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7Ci1zdGF0aWMgQk9PTEVBTiAgc2lzZmJfQ2hlY2tWQlJldHJhY2Uoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOwotc3RhdGljIEJPT0xFQU4gIHNpc2ZiY2hlY2t2cmV0cmFjZWNydDIoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOwotc3RhdGljIEJPT0xFQU4gIHNpc2ZiY2hlY2t2cmV0cmFjZWNydDEoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOwotc3RhdGljIEJPT0xFQU4gIHNpc2ZiX2JyaWRnZWlzc2xhdmUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOwotc3RhdGljIHZvaWQgICAgIHNpc2ZiX2RldGVjdF9WQl9jb25uZWN0KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKLXN0YXRpYyB2b2lkICAgICBzaXNmYl9nZXRfVkJfdHlwZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7Ci1zdGF0aWMgdm9pZCAgICAgc2lzZmJfc2V0X1RWeHBvc29mZnNldChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IHZhbCk7Ci1zdGF0aWMgdm9pZCAgICAgc2lzZmJfc2V0X1RWeXBvc29mZnNldChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IHZhbCk7CitzdGF0aWMgdm9pZAlzaXNmYl9zZWFyY2hfbW9kZShjaGFyICpuYW1lLCBCT09MRUFOIHF1aWV0KTsKK3N0YXRpYyBpbnQJc2lzZmJfdmFsaWRhdGVfbW9kZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IG1vZGVpbmRleCwgdTMyIHZiZmxhZ3MpOworc3RhdGljIHU4CXNpc2ZiX3NlYXJjaF9yZWZyZXNoX3JhdGUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHVuc2lnbmVkIGludCByYXRlLAorCQkJCWludCBpbmRleCk7CitzdGF0aWMgaW50CXNpc2ZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKKwkJCQl1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCisJCQkJc3RydWN0IGZiX2luZm8gKmZiX2luZm8pOworc3RhdGljIGludAlzaXNmYl9kb19zZXRfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgaXNhY3RpdmUsCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIHZvaWQJc2lzZmJfcHJlX3NldG1vZGUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOworc3RhdGljIHZvaWQJc2lzZmJfcG9zdF9zZXRtb2RlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK3N0YXRpYyBCT09MRUFOCXNpc2ZiX0NoZWNrVkJSZXRyYWNlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK3N0YXRpYyBCT09MRUFOCXNpc2ZiY2hlY2t2cmV0cmFjZWNydDIoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOworc3RhdGljIEJPT0xFQU4Jc2lzZmJjaGVja3ZyZXRyYWNlY3J0MShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7CitzdGF0aWMgQk9PTEVBTglzaXNmYl9icmlkZ2Vpc3NsYXZlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK3N0YXRpYyB2b2lkCXNpc2ZiX2RldGVjdF9WQl9jb25uZWN0KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK3N0YXRpYyB2b2lkCXNpc2ZiX2dldF9WQl90eXBlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK3N0YXRpYyB2b2lkCXNpc2ZiX3NldF9UVnhwb3NvZmZzZXQoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIGludCB2YWwpOworc3RhdGljIHZvaWQJc2lzZmJfc2V0X1RWeXBvc29mZnNldChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IHZhbCk7CisjaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKK3Vuc2lnbmVkIGludAlzaXNmYl9yZWFkX25icmlkZ2VfcGNpX2R3b3JkKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgcmVnKTsKK3ZvaWQJCXNpc2ZiX3dyaXRlX25icmlkZ2VfcGNpX2R3b3JkKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3Vuc2lnbmVkIGludAlzaXNmYl9yZWFkX2xwY19wY2lfZHdvcmQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKK3ZvaWQJCXNpc2ZiX3dyaXRlX25icmlkZ2VfcGNpX2J5dGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK3Vuc2lnbmVkIGludAlzaXNmYl9yZWFkX21pb19wY2lfd29yZChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IHJlZyk7CisjZW5kaWYKIAogLyogU2lTLXNwZWNpZmljIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLwotdm9pZCAgICAgICAgICAgIHNpc19tYWxsb2Moc3RydWN0IHNpc19tZW1yZXEgKnJlcSk7Ci12b2lkICAgICAgICAgICAgc2lzX2ZyZWUodTMyIGJhc2UpOwordm9pZAkJCXNpc19tYWxsb2Moc3RydWN0IHNpc19tZW1yZXEgKnJlcSk7Cit2b2lkCQkJc2lzX21hbGxvY19uZXcoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzaXNfbWVtcmVxICpyZXEpOwordm9pZAkJCXNpc19mcmVlKHUzMiBiYXNlKTsKK3ZvaWQJCQlzaXNfZnJlZV9uZXcoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBiYXNlKTsKIAogLyogSW50ZXJuYWwgaGVhcCByb3V0aW5lcyAqLwotc3RhdGljIGludCAgICAgIHNpc2ZiX2hlYXBfaW5pdChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7Ci1zdGF0aWMgU0lTX09IICAgKnNpc2ZiX3BvaF9uZXdfbm9kZSh2b2lkKTsKLXN0YXRpYyBTSVNfT0ggICAqc2lzZmJfcG9oX2FsbG9jYXRlKHUzMiBzaXplKTsKLXN0YXRpYyB2b2lkICAgICBzaXNmYl9kZWxldGVfbm9kZShTSVNfT0ggKnBvaCk7Ci1zdGF0aWMgdm9pZCAgICAgc2lzZmJfaW5zZXJ0X25vZGUoU0lTX09IICpwb2hMaXN0LCBTSVNfT0ggKnBvaCk7Ci1zdGF0aWMgU0lTX09IICAgKnNpc2ZiX3BvaF9mcmVlKHUzMiBiYXNlKTsKLXN0YXRpYyB2b2lkICAgICBzaXNmYl9mcmVlX25vZGUoU0lTX09IICpwb2gpOwotCi0vKiBTZW5zaW5nIHJvdXRpbmVzICovCi1zdGF0aWMgdm9pZCAgICAgU2lTX1NlbnNlMzB4KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKLXN0YXRpYyB2b2lkICAgICBTaVNfU2Vuc2VDaChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7CitzdGF0aWMgaW50CQlzaXNmYl9oZWFwX2luaXQoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOworc3RhdGljIHN0cnVjdCBTSVNfT0ggKglzaXNmYl9wb2hfbmV3X25vZGUoc3RydWN0IFNJU19IRUFQICptZW1oZWFwKTsKK3N0YXRpYyBzdHJ1Y3QgU0lTX09IICoJc2lzZmJfcG9oX2FsbG9jYXRlKHN0cnVjdCBTSVNfSEVBUCAqbWVtaGVhcCwgdTMyIHNpemUpOworc3RhdGljIHZvaWQJCXNpc2ZiX2RlbGV0ZV9ub2RlKHN0cnVjdCBTSVNfT0ggKnBvaCk7CitzdGF0aWMgdm9pZAkJc2lzZmJfaW5zZXJ0X25vZGUoc3RydWN0IFNJU19PSCAqcG9oTGlzdCwgc3RydWN0IFNJU19PSCAqcG9oKTsKK3N0YXRpYyBzdHJ1Y3QgU0lTX09IICoJc2lzZmJfcG9oX2ZyZWUoc3RydWN0IFNJU19IRUFQICptZW1oZWFwLCB1MzIgYmFzZSk7CitzdGF0aWMgdm9pZAkJc2lzZmJfZnJlZV9ub2RlKHN0cnVjdCBTSVNfSEVBUCAqbWVtaGVhcCwgc3RydWN0IFNJU19PSCAqcG9oKTsKIAogLyogUm91dGluZXMgZnJvbSBpbml0LmMvaW5pdDMwMS5jICovCi1leHRlcm4gVVNIT1JUICAgU2lTX0dldE1vZGVJRF9MQ0QoaW50IFZHQUVuZ2luZSwgVUxPTkcgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksIGludCBEZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MRUFOIEZTVE4sIFVTSE9SVCBDdXN0b21ULCBpbnQgTENEd2l0aCwgaW50IExDRGhlaWdodCk7Ci1leHRlcm4gVVNIT1JUICAgU2lTX0dldE1vZGVJRF9UVihpbnQgVkdBRW5naW5lLCBVTE9ORyBWQkZsYWdzLCBpbnQgSERpc3BsYXksIGludCBWRGlzcGxheSwgaW50IERlcHRoKTsKLWV4dGVybiBVU0hPUlQgICBTaVNfR2V0TW9kZUlEX1ZHQTIoaW50IFZHQUVuZ2luZSwgVUxPTkcgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksIGludCBEZXB0aCk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQJU2lTX0dldE1vZGVJRF9MQ0QoaW50IFZHQUVuZ2luZSwgdW5zaWduZWQgaW50IFZCRmxhZ3MsIGludCBIRGlzcGxheSwKKwkJCQlpbnQgVkRpc3BsYXksIGludCBEZXB0aCwgQk9PTEVBTiBGU1ROLCB1bnNpZ25lZCBzaG9ydCBDdXN0b21ULAorCQkJCWludCBMQ0R3aXRoLCBpbnQgTENEaGVpZ2h0LCB1bnNpZ25lZCBpbnQgVkJGbGFnczIpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19HZXRNb2RlSURfVFYoaW50IFZHQUVuZ2luZSwgdW5zaWduZWQgaW50IFZCRmxhZ3MsIGludCBIRGlzcGxheSwKKwkJCQlpbnQgVkRpc3BsYXksIGludCBEZXB0aCwgdW5zaWduZWQgaW50IFZCRmxhZ3MyKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0TW9kZUlEX1ZHQTIoaW50IFZHQUVuZ2luZSwgdW5zaWduZWQgaW50IFZCRmxhZ3MsIGludCBIRGlzcGxheSwKKwkJCQlpbnQgVkRpc3BsYXksIGludCBEZXB0aCwgdW5zaWduZWQgaW50IFZCRmxhZ3MyKTsKK2V4dGVybiB2b2lkCQlTaVNSZWdJbml0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTSVNJT0FERFJFU1MgQmFzZUFkZHIpOworZXh0ZXJuIEJPT0xFQU4JCVNpU1NldE1vZGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObyk7CitleHRlcm4gdm9pZAkJU2lTX1NldEVuYWJsZURzdG4oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBlbmFibGUpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRFbmFibGVGc3RuKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgZW5hYmxlKTsKIAotZXh0ZXJuIHZvaWQgCVNpU1JlZ0luaXQoU2lTX1ByaXZhdGUgKlNpU19QciwgU0lTSU9BRERSRVNTIEJhc2VBZGRyKTsKLWV4dGVybiBCT09MRUFOICBTaVNTZXRNb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0RldmljZUluZm8sIFVTSE9SVCBNb2RlTm8pOwotZXh0ZXJuIHZvaWQgICAgIFNpU19TZXRFbmFibGVEc3RuKFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBlbmFibGUpOwotZXh0ZXJuIHZvaWQgICAgIFNpU19TZXRFbmFibGVGc3RuKFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBlbmFibGUpOworZXh0ZXJuIEJPT0xFQU4JCVNpU0RldGVybWluZVJPTUxheW91dDY2MShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CiAKLWV4dGVybiBCT09MRUFOICBTaVNEZXRlcm1pbmVST01MYXlvdXQ2NjEoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyk7Ci0KLWV4dGVybiBCT09MRUFOICBzaXNmYl9nZXR0b3RhbGZyb21tb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0RldmljZUV4dGVuc2lvbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgbW9kZW5vLCBpbnQgKmh0b3RhbCwgaW50ICp2dG90YWwsIHVuc2lnbmVkIGNoYXIgcmF0ZWluZGV4KTsKK2V4dGVybiBCT09MRUFOCQlzaXNmYl9nZXR0b3RhbGZyb21tb2RlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBjaGFyIG1vZGVubywKKwkJCQlpbnQgKmh0b3RhbCwgaW50ICp2dG90YWwsIHVuc2lnbmVkIGNoYXIgcmF0ZWluZGV4KTsKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi1leHRlcm4gaW50CXNpc2ZiX21vZGVfcmF0ZV90b19kY2xvY2soU2lTX1ByaXZhdGUgKlNpU19QciwKLQkJICAgIAlQU0lTX0hXX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sCi0JCQl1bnNpZ25lZCBjaGFyIG1vZGVubywgdW5zaWduZWQgY2hhciByYXRlaW5kZXgpOwotZXh0ZXJuIGludCAgICAgIHNpc2ZiX21vZGVfcmF0ZV90b19kZGF0YShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sCi0JCQl1bnNpZ25lZCBjaGFyIG1vZGVubywgdW5zaWduZWQgY2hhciByYXRlaW5kZXgsCi0JCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcik7CitleHRlcm4gaW50CQlzaXNmYl9tb2RlX3JhdGVfdG9fZGNsb2NrKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLAorCQkJCXVuc2lnbmVkIGNoYXIgbW9kZW5vLCB1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCk7CitleHRlcm4gaW50CQlzaXNmYl9tb2RlX3JhdGVfdG9fZGRhdGEoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGNoYXIgbW9kZW5vLAorCQkJCXVuc2lnbmVkIGNoYXIgcmF0ZWluZGV4LCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcik7CisjZW5kaWYKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKK2V4dGVybiB2b2lkCQlTaVNfR2VuZXJpY19Db252ZXJ0Q1JEYXRhKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBjaGFyICpjcmRhdGEsIGludCB4cmVzLAorCQkJCWludCB5cmVzLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgQk9PTEVBTiB3cml0ZXJlcyk7CiAjZW5kaWYKIAogLyogQ2hyb250ZWwgVFYsIEREQyBhbmQgRFBNUyBmdW5jdGlvbnMgKi8KLWV4dGVybiBVU0hPUlQgCVNpU19HZXRDSDcwMHgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBieCk7Ci1leHRlcm4gdm9pZCAJU2lTX1NldENINzAweChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4KTsKLWV4dGVybiBVU0hPUlQgCVNpU19HZXRDSDcwMXgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBieCk7Ci1leHRlcm4gdm9pZCAJU2lTX1NldENINzAxeChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4KTsKLWV4dGVybiB2b2lkICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBheCxVU0hPUlQgdGVtcGJoKTsKLWV4dGVybiB2b2lkICAgICBTaVNfRERDMkRlbGF5KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBkZWxheXRpbWUpOwotZXh0ZXJuIHZvaWQgICAgIFNpU19TZXRDaHJvbnRlbEdQSU8oU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIG15dmJpbmZvKTsKLWV4dGVybiBVU0hPUlQgICBTaVNfSGFuZGxlRERDKFNpU19Qcml2YXRlICpTaVNfUHIsIFVMT05HIFZCRmxhZ3MsIGludCBWR0FFbmdpbmUsCi0JCSAgICAgICAgICAgICAgVVNIT1JUIGFkYXB0bnVtLCBVU0hPUlQgRERDZGF0YXR5cGUsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcik7Ci1leHRlcm4gVVNIT1JUICAgU2lTX1JlYWREREMxQml0KFNpU19Qcml2YXRlICpTaVNfUHIpOwotZXh0ZXJuIHZvaWQgCVNpU19DaHJvbnRlbDcwMXhCTE9uKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0RldmljZUluZm8pOwotZXh0ZXJuIHZvaWQgCVNpU19DaHJvbnRlbDcwMXhCTE9mZihTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLWV4dGVybiB2b2lkIAlTaVNfU2lTMzB4QkxPbihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdEZXZpY2VJbmZvKTsKLWV4dGVybiB2b2lkIAlTaVNfU2lTMzB4QkxPZmYoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3RGV2aWNlSW5mbyk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQJU2lTX0dldENINzAweChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnKTsKK2V4dGVybiB2b2lkCQlTaVNfU2V0Q0g3MDB4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0Q0g3MDF4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCByZWcpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRDSDcwMXgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgY2hhciB2YWwpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRDSDcweHhBTkRPUihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCXVuc2lnbmVkIGNoYXIgbXlvciwgdW5zaWduZWQgY2hhciBteWFuZCk7CitleHRlcm4gdm9pZAkJU2lTX0REQzJEZWxheShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgaW50IGRlbGF5dGltZSk7CitleHRlcm4gdm9pZAkJU2lTX1NldENocm9udGVsR1BJTyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgbXl2YmluZm8pOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19IYW5kbGVEREMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGludCBWQkZsYWdzLCBpbnQgVkdBRW5naW5lLAorCQkJCXVuc2lnbmVkIHNob3J0IGFkYXB0bnVtLCB1bnNpZ25lZCBzaG9ydCBERENkYXRhdHlwZSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJCXVuc2lnbmVkIGludCBWQkZsYWdzMik7CitleHRlcm4gdW5zaWduZWQgc2hvcnQJU2lTX1JlYWREREMxQml0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKKyNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQorZXh0ZXJuIHZvaWQJCVNpU19DaHJvbnRlbDcwMXhCTE9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK2V4dGVybiB2b2lkCQlTaVNfQ2hyb250ZWw3MDF4QkxPZmYoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworI2VuZGlmCitleHRlcm4gdm9pZAkJU2lTX1NpUzMweEJMT24oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworZXh0ZXJuIHZvaWQJCVNpU19TaVMzMHhCTE9mZihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy92Z2F0eXBlcy5oIGIvZHJpdmVycy92aWRlby9zaXMvdmdhdHlwZXMuaAppbmRleCA1MDdiYmExLi44MzFiOWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy92Z2F0eXBlcy5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3ZnYXR5cGVzLmgKQEAgLTMsNyArMyw3IEBACiAvKgogICogR2VuZXJhbCB0eXBlIGRlZmluaXRpb25zIGZvciB1bml2ZXJzYWwgbW9kZSBzd2l0Y2hpbmcgbW9kdWxlcwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCiAgKgogICogSWYgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgdGVybXMKICAqIGFwcGx5OgpAQCAtNTAsMTEgKzUwLDEwIEBACiAgKgogICovCiAKLSNpZm5kZWYgX1ZHQVRZUEVTXwotI2RlZmluZSBfVkdBVFlQRVNfCisjaWZuZGVmIF9WR0FUWVBFU19IXworI2RlZmluZSBfVkdBVFlQRVNfSF8KIAotI2lmZGVmIExJTlVYX0tFUk5FTCAgLyogV2UgZG9uJ3Qgd2FudCB0aGUgWCBkcml2ZXIgdG8gZGVwZW5kIG9uIGtlcm5lbCBzb3VyY2UgKi8KLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjZW5kaWYKIApAQCAtNjYsNDEgKzY1LDEzIEBACiAjZGVmaW5lIFRSVUUgICAgMQogI2VuZGlmCiAKLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMICAgIDAKLSNlbmRpZgotCi0jaWZuZGVmIENIQVIKLXR5cGVkZWYgY2hhciBDSEFSOwotI2VuZGlmCi0KLSNpZm5kZWYgU0hPUlQKLXR5cGVkZWYgc2hvcnQgU0hPUlQ7Ci0jZW5kaWYKLQotI2lmbmRlZiBMT05HCi10eXBlZGVmIGxvbmcgIExPTkc7Ci0jZW5kaWYKLQotI2lmbmRlZiBVQ0hBUgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVDSEFSOwotI2VuZGlmCi0KLSNpZm5kZWYgVVNIT1JUCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTSE9SVDsKLSNlbmRpZgotCi0jaWZuZGVmIFVMT05HCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxPTkc7Ci0jZW5kaWYKLQogI2lmbmRlZiBCT09MRUFOCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgQk9PTEVBTjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEJPT0xFQU47CiAjZW5kaWYKIAogI2RlZmluZSBTSVNJT01FTVRZUEUKIAotI2lmZGVmIExJTlVYX0tFUk5FTAorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBTSVNJT0FERFJFU1M7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDgpCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4gIC8qIE5lZWQgX19pb21lbSAqLwpAQCAtMTA5LDcgKzgwLDcgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZmRlZiBMSU5VWF9YRjg2CisjaWZkZWYgU0lTX1hPUkdfWEY4NgogI2lmIFhGODZfVkVSU0lPTl9DVVJSRU5UIDwgWEY4Nl9WRVJTSU9OX05VTUVSSUMoNCwyLDAsMCwwKQogdHlwZWRlZiB1bnNpZ25lZCBsb25nIElPQUREUkVTUzsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBTSVNJT0FERFJFU1M7CkBAIC0xMTgsNyArODksNyBAQAogI2VuZGlmCiAjZW5kaWYKIAotZW51bSBfU0lTX0NISVBfVFlQRSB7Cit0eXBlZGVmIGVudW0gX1NJU19DSElQX1RZUEUgewogICAgIFNJU19WR0FMZWdhY3kgPSAwLAogICAgIFNJU181MzAsCiAgICAgU0lTX09MRCwKQEAgLTEyOCwxMTUgKzk5LDI3IEBACiAgICAgU0lTXzU0MCwKICAgICBTSVNfMzE1SCwgICAvKiBTaVMgMzEwICovCiAgICAgU0lTXzMxNSwKLSAgICBTSVNfMzE1UFJPLAorICAgIFNJU18zMTVQUk8sIC8qIFNpUyAzMjUgKi8KICAgICBTSVNfNTUwLAogICAgIFNJU182NTAsCiAgICAgU0lTXzc0MCwKICAgICBTSVNfMzMwLAogICAgIFNJU182NjEsCiAgICAgU0lTXzc0MSwKLSAgICBTSVNfNjYwLAorICAgIFNJU182NzAsCisgICAgU0lTXzY2MCA9IDM1LAogICAgIFNJU183NjAsCiAgICAgU0lTXzc2MSwKLSAgICBTSVNfMzQwLAorICAgIFNJU183NjIsCisgICAgU0lTXzc3MCwKKyAgICBTSVNfMzQwID0gNTUsCisgICAgU0lTXzM0MSwKKyAgICBTSVNfMzQyLAorICAgIFhHSV8yMCAgPSA3NSwKKyAgICBYR0lfNDAsCiAgICAgTUFYX1NJU19DSElQCi19OworfSBTSVNfQ0hJUF9UWVBFOwogCi0jaWZuZGVmIFNJU19IV19JTkZPCi10eXBlZGVmIHN0cnVjdCBfU0lTX0hXX0lORk8gIFNJU19IV19JTkZPLCAqUFNJU19IV19JTkZPOwotCi1zdHJ1Y3QgX1NJU19IV19JTkZPCi17Ci0jaWZkZWYgTElOVVhfWEY4NgotICAgIFBDSVRBRyBQY2lUYWc7CQkgLyogUENJIFRhZyAqLwotI2VuZGlmCi0KLSAgICBVQ0hBUiAqcGpWaXJ0dWFsUm9tQmFzZTsJIC8qIFJPTSBpbWFnZSAqLwotCi0gICAgQk9PTEVBTiBVc2VST007CQkgLyogVXNlIHRoZSBST00gaW1hZ2UgaWYgcHJvdmlkZWQgKi8KLQotI2lmZGVmIExJTlVYX0tFUk5FTAotICAgIFVDSEFSIFNJU0lPTUVNVFlQRSAqcGpWaWRlb01lbW9yeUFkZHJlc3M7Ci0gICAgCQkJCSAvKiBiYXNlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mIExpbmVhciBWR0EgbWVtb3J5ICovCi0KLSAgICBVTE9ORyAgdWxWaWRlb01lbW9yeVNpemU7ICAgIC8qIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgbWVtb3J5IG9uIHRoZSBib2FyZCAqLwotI2VuZGlmCi0KLSAgICBTSVNJT0FERFJFU1MgdWxJT0FkZHJlc3M7ICAgIC8qIGJhc2UgSS9PIGFkZHJlc3Mgb2YgVkdBIHBvcnRzICgweDNCMDsgcmVsb2NhdGVkKSAqLwotCi0gICAgVUNIQVIgIGpDaGlwVHlwZTsgICAgICAgICAgICAvKiBVc2VkIHRvIElkZW50aWZ5IFNpUyBHcmFwaGljcyBDaGlwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZpbmVkIGluIHRoZSBlbnVtICJTSVNfQ0hJUF9UWVBFIiAoYWJvdmUgb3Igc2lzZmIuaCkgKi8KLQotICAgIFVDSEFSICBqQ2hpcFJldmlzaW9uOyAgICAgICAgLyogVXNlZCB0byBJZGVudGlmeSBTaVMgR3JhcGhpY3MgQ2hpcCBSZXZpc2lvbiAqLwotCi0gICAgQk9PTEVBTiBiSW50ZWdyYXRlZE1NRW5hYmxlZDsvKiBzdXBwb3J0aW5nIGludGVncmF0aW9uIE1NIGVuYWJsZSAqLwotfTsKLSNlbmRpZgotCi0vKiBBZGR0aW9uYWwgSU9DVExzIGZvciBjb21tdW5pY2F0aW9uIHNpc2ZiIDw+IFggZHJpdmVyICAgICAgICAqLwotLyogSWYgY2hhbmdpbmcgdGhpcywgc2lzZmIuaCBtdXN0IGFsc28gYmUgY2hhbmdlZCAoZm9yIHNpc2ZiKSAqLwotCi0jaWZkZWYgTElOVVhfWEY4NiAgLyogV2UgZG9uJ3Qgd2FudCB0aGUgWCBkcml2ZXIgdG8gZGVwZW5kIG9uIHRoZSBrZXJuZWwgc291cmNlICovCi0KLS8qIGlvY3RsIGZvciBpZGVudGlmeWluZyBhbmQgZ2l2aW5nIHNvbWUgaW5mbyAoZXNwLiBtZW1vcnkgaGVhcCBzdGFydCkgKi8KLSNkZWZpbmUgU0lTRkJfR0VUX0lORk9fU0laRQkweDgwMDRmMzAwCi0jZGVmaW5lIFNJU0ZCX0dFVF9JTkZPCQkweDgwMDBmMzAxICAvKiBNdXN0IGJlIHBhdGNoZWQgd2l0aCByZXN1bHQgZnJvbSAuLi5fU0laRSBhdCBEWzI5OjE2XSAqLwotLyogZGVwcmVjYXRlZCBpb2N0bCBudW1iZXIgKGZvciBvbGRlciB2ZXJzaW9ucyBvZiBzaXNmYikgKi8KLSNkZWZpbmUgU0lTRkJfR0VUX0lORk9fT0xEICAgIAkweDgwMDQ2ZWY4Ci0KLS8qIGlvY3RscyBmb3IgdHYgcGFyYW1ldGVycyAocG9zaXRpb24pICovCi0jZGVmaW5lIFNJU0ZCX1NFVF9UVlBPU09GRlNFVCAgIDB4NDAwNGYzMDQKLQotLyogbG9jayBzaXNmYiBmcm9tIHJlZ2lzdGVyIGFjY2VzcyAqLwotI2RlZmluZSBTSVNGQl9TRVRfTE9DSwkJMHg0MDA0ZjMwNgotCi0vKiBTdHJ1Y3R1cmUgYXJndW1lbnQgZm9yIFNJU0ZCX0dFVF9JTkZPIGlvY3RsICAqLwotdHlwZWRlZiBzdHJ1Y3QgX1NJU0ZCX0lORk8gc2lzZmJfaW5mbywgKnBzaXNmYl9pbmZvOwotCi1zdHJ1Y3QgX1NJU0ZCX0lORk8gewotCUNBUkQzMiAJc2lzZmJfaWQ7ICAgICAgICAgCS8qIGZvciBpZGVudGlmeWluZyBzaXNmYiAqLwotI2lmbmRlZiBTSVNGQl9JRAotI2RlZmluZSBTSVNGQl9JRAkgIDB4NTM0OTUzNDYgICAgLyogSWRlbnRpZnkgbXlzZWxmIHdpdGggJ1NJU0YnICovCi0jZW5kaWYKLSAJQ0FSRDMyIAljaGlwX2lkOwkJLyogUENJIElEIG9mIGRldGVjdGVkIGNoaXAgKi8KLQlDQVJEMzIJbWVtb3J5OwkJCS8qIHZpZGVvIG1lbW9yeSBpbiBLQiB3aGljaCBzaXNmYiBtYW5hZ2VzICovCi0JQ0FSRDMyCWhlYXBzdGFydDsgICAgICAgICAgICAgCS8qIGhlYXAgc3RhcnQgKD0gc2lzZmIgIm1lbSIgYXJndW1lbnQpIGluIEtCICovCi0JQ0FSRDggCWZidmlkbW9kZTsJCS8qIGN1cnJlbnQgc2lzZmIgbW9kZSAqLwotCi0JQ0FSRDggCXNpc2ZiX3ZlcnNpb247Ci0JQ0FSRDgJc2lzZmJfcmV2aXNpb247Ci0JQ0FSRDggCXNpc2ZiX3BhdGNobGV2ZWw7Ci0KLQlDQVJEOCAJc2lzZmJfY2FwczsJCS8qIHNpc2ZiJ3MgY2FwYWJpbGl0aWVzICovCi0KLQlDQVJEMzIgCXNpc2ZiX3RxbGVuOwkJLyogdHVyYm8gcXVldWUgbGVuZ3RoIChpbiBLQikgKi8KLQotCUNBUkQzMiAJc2lzZmJfcGNpYnVzOyAgICAgIAkvKiBUaGUgY2FyZCdzIFBDSSBJRCAqLwotCUNBUkQzMiAJc2lzZmJfcGNpc2xvdDsKLQlDQVJEMzIgCXNpc2ZiX3BjaWZ1bmM7Ci0KLQlDQVJEOCAJc2lzZmJfbGNkcGRjOwotCi0JQ0FSRDgJc2lzZmJfbGNkYTsKLQotCUNBUkQzMglzaXNmYl92YmZsYWdzOwotCUNBUkQzMglzaXNmYl9jdXJyZW50dmJmbGFnczsKLQotCUNBUkQzMiAJc2lzZmJfc2NhbGVsY2Q7Ci0JQ0FSRDMyIAlzaXNmYl9zcGVjaWFsdGltaW5nOwotCi0JQ0FSRDggCXNpc2ZiX2hhdmVlbWk7Ci0JQ0FSRDggCXNpc2ZiX2VtaTMwLHNpc2ZiX2VtaTMxLHNpc2ZiX2VtaTMyLHNpc2ZiX2VtaTMzOwotCUNBUkQ4IAlzaXNmYl9oYXZlZW1pbGNkOwotCi0JQ0FSRDggCXNpc2ZiX2xjZHBkY2E7Ci0KLQlDQVJEMTYgIHNpc2ZiX3R2eHBvcywgc2lzZmJfdHZ5cG9zOyAgCS8qIFdhcm5pbmc6IFZhbHVlcyArIDMyICEgKi8KLQotCUNBUkQ4IHJlc2VydmVkWzIwOF07IAkJCS8qIGZvciBmdXR1cmUgdXNlICovCi19OwotI2VuZGlmCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy92c3RydWN0LmggYi9kcml2ZXJzL3ZpZGVvL3Npcy92c3RydWN0LmgKaW5kZXggZDRkNTVjOS4uOWFlMzI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvdnN0cnVjdC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3ZzdHJ1Y3QuaApAQCAtMyw3ICszLDcgQEAKIC8qCiAgKiBHZW5lcmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgdW5pdmVyc2FsIG1vZGUgc3dpdGNoaW5nIG1vZHVsZXMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQogICoKICAqIElmIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgdGhlIGZvbGxvd2luZyBsaWNlbnNlIHRlcm1zCiAgKiBhcHBseToKQEAgLTUwLDYyNyArNTAsNTE0IEBACiAgKgogICovCiAKLSNpZm5kZWYgX1ZTVFJVQ1RfCi0jZGVmaW5lIF9WU1RSVUNUXworI2lmbmRlZiBfVlNUUlVDVF9IXworI2RlZmluZSBfVlNUUlVDVF9IXwogCi10eXBlZGVmIHN0cnVjdCBfU2lTX1BhbmVsRGVsYXlUYmxTdHJ1Y3QKLXsKLSAJVUNIQVIgdGltZXJbMl07Ci19IFNpU19QYW5lbERlbGF5VGJsU3RydWN0Oworc3RydWN0IFNpU19QYW5lbERlbGF5VGJsIHsKKyAJdW5zaWduZWQgY2hhciB0aW1lclsyXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfTENERGF0YVN0cnVjdAotewotCVVTSE9SVCBSVkJIQ01BWDsKLQlVU0hPUlQgUlZCSENGQUNUOwotCVVTSE9SVCBWR0FIVDsKLQlVU0hPUlQgVkdBVlQ7Ci0JVVNIT1JUIExDREhUOwotCVVTSE9SVCBMQ0RWVDsKLX0gU2lTX0xDRERhdGFTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX0xDRERhdGEgeworCXVuc2lnbmVkIHNob3J0IFJWQkhDTUFYOworCXVuc2lnbmVkIHNob3J0IFJWQkhDRkFDVDsKKwl1bnNpZ25lZCBzaG9ydCBWR0FIVDsKKwl1bnNpZ25lZCBzaG9ydCBWR0FWVDsKKwl1bnNpZ25lZCBzaG9ydCBMQ0RIVDsKKwl1bnNpZ25lZCBzaG9ydCBMQ0RWVDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfVFZEYXRhU3RydWN0Ci17Ci0JVVNIT1JUIFJWQkhDTUFYOwotCVVTSE9SVCBSVkJIQ0ZBQ1Q7Ci0JVVNIT1JUIFZHQUhUOwotCVVTSE9SVCBWR0FWVDsKLQlVU0hPUlQgVFZIREU7Ci0JVVNIT1JUIFRWVkRFOwotCVVTSE9SVCBSVkJIUlM7Ci0JVUNIQVIgIEZsaWNrZXJNb2RlOwotCVVTSE9SVCBIQUxGUlZCSFJTOwotCVVDSEFSICBSWTFDT0U7Ci0JVUNIQVIgIFJZMkNPRTsKLQlVQ0hBUiAgUlkzQ09FOwotCVVDSEFSICBSWTRDT0U7Ci19IFNpU19UVkRhdGFTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX1RWRGF0YSB7CisJdW5zaWduZWQgc2hvcnQgUlZCSENNQVg7CisJdW5zaWduZWQgc2hvcnQgUlZCSENGQUNUOworCXVuc2lnbmVkIHNob3J0IFZHQUhUOworCXVuc2lnbmVkIHNob3J0IFZHQVZUOworCXVuc2lnbmVkIHNob3J0IFRWSERFOworCXVuc2lnbmVkIHNob3J0IFRWVkRFOworCXVuc2lnbmVkIHNob3J0IFJWQkhSUzsKKwl1bnNpZ25lZCBjaGFyICBGbGlja2VyTW9kZTsKKwl1bnNpZ25lZCBzaG9ydCBIQUxGUlZCSFJTOworCXVuc2lnbmVkIHNob3J0IFJWQkhSUzI7CisJdW5zaWduZWQgY2hhciAgUlkxQ09FOworCXVuc2lnbmVkIGNoYXIgIFJZMkNPRTsKKwl1bnNpZ25lZCBjaGFyICBSWTNDT0U7CisJdW5zaWduZWQgY2hhciAgUlk0Q09FOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19MVkRTRGF0YVN0cnVjdAotewotCVVTSE9SVCBWR0FIVDsKLQlVU0hPUlQgVkdBVlQ7Ci0JVVNIT1JUIExDREhUOwotCVVTSE9SVCBMQ0RWVDsKLX0gU2lTX0xWRFNEYXRhU3RydWN0Oworc3RydWN0IFNpU19MVkRTRGF0YSB7CisJdW5zaWduZWQgc2hvcnQgVkdBSFQ7CisJdW5zaWduZWQgc2hvcnQgVkdBVlQ7CisJdW5zaWduZWQgc2hvcnQgTENESFQ7CisJdW5zaWduZWQgc2hvcnQgTENEVlQ7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU2lTX0xWRFNEZXNTdHJ1Y3QKLXsKLQlVU0hPUlQgTENESERFUzsKLQlVU0hPUlQgTENEVkRFUzsKLX0gU2lTX0xWRFNEZXNTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX0xWRFNEZXMgeworCXVuc2lnbmVkIHNob3J0IExDREhERVM7CisJdW5zaWduZWQgc2hvcnQgTENEVkRFUzsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfTFZEU0NSVDFEYXRhU3RydWN0Ci17Ci0JVUNIQVIgIENSWzE1XTsKLX0gU2lTX0xWRFNDUlQxRGF0YVN0cnVjdDsKK3N0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIHsKKwl1bnNpZ25lZCBjaGFyICBDUlsxNV07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU2lTX0xDREFDUlQxRGF0YVN0cnVjdAotewotCVVDSEFSICBDUlsxN107Ci19IFNpU19MQ0RBQ1JUMURhdGFTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX0NIVFZSZWdEYXRhIHsKKwl1bnNpZ25lZCBjaGFyICBSZWdbMTZdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19DSFRWUmVnRGF0YVN0cnVjdAotewotCVVDSEFSICBSZWdbMTZdOwotfSBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX1N0IHsKKwl1bnNpZ25lZCBjaGFyICBTdF9Nb2RlSUQ7CisJdW5zaWduZWQgc2hvcnQgU3RfTW9kZUZsYWc7CisJdW5zaWduZWQgY2hhciAgU3RfU3RUYWJsZUluZGV4OworCXVuc2lnbmVkIGNoYXIgIFN0X0NSVDJDUlRDOworCXVuc2lnbmVkIGNoYXIgIFN0X1Jlc0luZm87CisJdW5zaWduZWQgY2hhciAgVkJfU3RUVkZsaWNrZXJJbmRleDsKKwl1bnNpZ25lZCBjaGFyICBWQl9TdFRWRWRnZUluZGV4OworCXVuc2lnbmVkIGNoYXIgIFZCX1N0VFZZRmlsdGVySW5kZXg7CisJdW5zaWduZWQgY2hhciAgU3RfUERDOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19TdFN0cnVjdAotewotCVVDSEFSICBTdF9Nb2RlSUQ7Ci0JVVNIT1JUIFN0X01vZGVGbGFnOwotCVVDSEFSICBTdF9TdFRhYmxlSW5kZXg7Ci0JVUNIQVIgIFN0X0NSVDJDUlRDOwotCVVDSEFSICBTdF9SZXNJbmZvOwotCVVDSEFSICBWQl9TdFRWRmxpY2tlckluZGV4OwotCVVDSEFSICBWQl9TdFRWRWRnZUluZGV4OwotCVVDSEFSICBWQl9TdFRWWUZpbHRlckluZGV4OwotCVVDSEFSICBTdF9QREM7Ci19IFNpU19TdFN0cnVjdDsKK3N0cnVjdCBTaVNfVkJNb2RlIHsKKwl1bnNpZ25lZCBjaGFyICBNb2RlSUQ7CisJdW5zaWduZWQgY2hhciAgVkJfVFZEZWxheUluZGV4OworCXVuc2lnbmVkIGNoYXIgIFZCX1RWRmxpY2tlckluZGV4OworCXVuc2lnbmVkIGNoYXIgIFZCX1RWUGhhc2VJbmRleDsKKwl1bnNpZ25lZCBjaGFyICBWQl9UVllGaWx0ZXJJbmRleDsKKwl1bnNpZ25lZCBjaGFyICBWQl9MQ0REZWxheUluZGV4OworCXVuc2lnbmVkIGNoYXIgIF9WQl9MQ0RISW5kZXg7CisJdW5zaWduZWQgY2hhciAgX1ZCX0xDRFZJbmRleDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfVkJNb2RlU3RydWN0Ci17Ci0JVUNIQVIgIE1vZGVJRDsKLQlVQ0hBUiAgVkJfVFZEZWxheUluZGV4OwotCVVDSEFSICBWQl9UVkZsaWNrZXJJbmRleDsKLQlVQ0hBUiAgVkJfVFZQaGFzZUluZGV4OwotCVVDSEFSICBWQl9UVllGaWx0ZXJJbmRleDsKLQlVQ0hBUiAgVkJfTENERGVsYXlJbmRleDsKLQlVQ0hBUiAgX1ZCX0xDREhJbmRleDsKLQlVQ0hBUiAgX1ZCX0xDRFZJbmRleDsKLX0gU2lTX1ZCTW9kZVN0cnVjdDsKK3N0cnVjdCBTaVNfU3RhbmRUYWJsZV9TIHsKKwl1bnNpZ25lZCBjaGFyICBDUlRfQ09MUzsKKwl1bnNpZ25lZCBjaGFyICBST1dTOworCXVuc2lnbmVkIGNoYXIgIENIQVJfSEVJR0hUOworCXVuc2lnbmVkIHNob3J0IENSVF9MRU47CisJdW5zaWduZWQgY2hhciAgU1JbNF07CisJdW5zaWduZWQgY2hhciAgTUlTQzsKKwl1bnNpZ25lZCBjaGFyICBDUlRDWzB4MTldOworCXVuc2lnbmVkIGNoYXIgIEFUVFJbMHgxNF07CisJdW5zaWduZWQgY2hhciAgR1JDWzldOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19TdGFuZFRhYmxlU3RydWN0Ci17Ci0JVUNIQVIgIENSVF9DT0xTOwotCVVDSEFSICBST1dTOwotCVVDSEFSICBDSEFSX0hFSUdIVDsKLQlVU0hPUlQgQ1JUX0xFTjsKLQlVQ0hBUiAgU1JbNF07Ci0JVUNIQVIgIE1JU0M7Ci0JVUNIQVIgIENSVENbMHgxOV07Ci0JVUNIQVIgIEFUVFJbMHgxNF07Ci0JVUNIQVIgIEdSQ1s5XTsKLX0gU2lTX1N0YW5kVGFibGVTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX0V4dCB7CisJdW5zaWduZWQgY2hhciAgRXh0X01vZGVJRDsKKwl1bnNpZ25lZCBzaG9ydCBFeHRfTW9kZUZsYWc7CisJdW5zaWduZWQgc2hvcnQgRXh0X1ZFU0FJRDsKKwl1bnNpZ25lZCBjaGFyICBFeHRfUkVTSU5GTzsKKwl1bnNpZ25lZCBjaGFyICBWQl9FeHRUVkZsaWNrZXJJbmRleDsKKwl1bnNpZ25lZCBjaGFyICBWQl9FeHRUVkVkZ2VJbmRleDsKKwl1bnNpZ25lZCBjaGFyICBWQl9FeHRUVllGaWx0ZXJJbmRleDsKKwl1bnNpZ25lZCBjaGFyICBWQl9FeHRUVllGaWx0ZXJJbmRleFJPTTY2MTsKKwl1bnNpZ25lZCBjaGFyICBSRUZpbmRleDsKKwljaGFyICAgICAgICAgICBST01NT0RFSURYNjYxOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19FeHRTdHJ1Y3QKLXsKLQlVQ0hBUiAgRXh0X01vZGVJRDsKLQlVU0hPUlQgRXh0X01vZGVGbGFnOwotCVVTSE9SVCBFeHRfVkVTQUlEOwotCVVDSEFSICBFeHRfUkVTSU5GTzsKLQlVQ0hBUiAgVkJfRXh0VFZGbGlja2VySW5kZXg7Ci0JVUNIQVIgIFZCX0V4dFRWRWRnZUluZGV4OwotCVVDSEFSICBWQl9FeHRUVllGaWx0ZXJJbmRleDsKLQlVQ0hBUiAgVkJfRXh0VFZZRmlsdGVySW5kZXhST002NjE7Ci0JVUNIQVIgIFJFRmluZGV4OwotCUNIQVIgICBST01NT0RFSURYNjYxOwotfSBTaVNfRXh0U3RydWN0Oworc3RydWN0IFNpU19FeHQyIHsKKwl1bnNpZ25lZCBzaG9ydCBFeHRfSW5mb0ZsYWc7CisJdW5zaWduZWQgY2hhciAgRXh0X0NSVDFDUlRDOworCXVuc2lnbmVkIGNoYXIgIEV4dF9DUlRWQ0xLOworCXVuc2lnbmVkIGNoYXIgIEV4dF9DUlQyQ1JUQzsKKwl1bnNpZ25lZCBjaGFyICBFeHRfQ1JUMkNSVENfTlM7CisJdW5zaWduZWQgY2hhciAgTW9kZUlEOworCXVuc2lnbmVkIHNob3J0IFhSZXM7CisJdW5zaWduZWQgc2hvcnQgWVJlczsKKwl1bnNpZ25lZCBjaGFyICBFeHRfUERDOworCXVuc2lnbmVkIGNoYXIgIEV4dF9GYWtlQ1JUMkNSVEM7CisJdW5zaWduZWQgY2hhciAgRXh0X0Zha2VDUlQyQ2xrOworCXVuc2lnbmVkIGNoYXIgIEV4dF9DUlQxQ1JUQ19OT1JNOworCXVuc2lnbmVkIGNoYXIgIEV4dF9DUlRWQ0xLX05PUk07CisJdW5zaWduZWQgY2hhciAgRXh0X0NSVDFDUlRDX1dJREU7CisJdW5zaWduZWQgY2hhciAgRXh0X0NSVFZDTEtfV0lERTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfRXh0MlN0cnVjdAotewotCVVTSE9SVCBFeHRfSW5mb0ZsYWc7Ci0JVUNIQVIgIEV4dF9DUlQxQ1JUQzsKLQlVQ0hBUiAgRXh0X0NSVFZDTEs7Ci0JVUNIQVIgIEV4dF9DUlQyQ1JUQzsKLQlVQ0hBUiAgRXh0X0NSVDJDUlRDX05TOwotCVVDSEFSICBNb2RlSUQ7Ci0JVVNIT1JUIFhSZXM7Ci0JVVNIT1JUIFlSZXM7Ci0JVUNIQVIgIEV4dF9QREM7Ci19IFNpU19FeHQyU3RydWN0Oworc3RydWN0IFNpU19QYXJ0MlBvcnRUYmwgeworIAl1bnNpZ25lZCBjaGFyICBDUlsxMl07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU2lTX1BhcnQyUG9ydFRibFN0cnVjdAotewotIAlVQ0hBUiAgQ1JbMTJdOwotfSBTaVNfUGFydDJQb3J0VGJsU3RydWN0Oworc3RydWN0IFNpU19DUlQxVGFibGUgeworCXVuc2lnbmVkIGNoYXIgIENSWzE3XTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfQ1JUMVRhYmxlU3RydWN0Ci17Ci0JVUNIQVIgIENSWzE3XTsKLX0gU2lTX0NSVDFUYWJsZVN0cnVjdDsKK3N0cnVjdCBTaVNfTUNMS0RhdGEgeworCXVuc2lnbmVkIGNoYXIgIFNSMjgsU1IyOSxTUjJBOworCXVuc2lnbmVkIHNob3J0IENMT0NLOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19NQ0xLRGF0YVN0cnVjdAotewotCVVDSEFSICBTUjI4LFNSMjksU1IyQTsKLQlVU0hPUlQgQ0xPQ0s7Ci19IFNpU19NQ0xLRGF0YVN0cnVjdDsKK3N0cnVjdCBTaVNfVkNMS0RhdGEgeworCXVuc2lnbmVkIGNoYXIgIFNSMkIsU1IyQzsKKwl1bnNpZ25lZCBzaG9ydCBDTE9DSzsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfVkNMS0RhdGFTdHJ1Y3QKLXsKLQlVQ0hBUiAgU1IyQixTUjJDOwotCVVTSE9SVCBDTE9DSzsKLX0gU2lTX1ZDTEtEYXRhU3RydWN0Oworc3RydWN0IFNpU19WQlZDTEtEYXRhIHsKKwl1bnNpZ25lZCBjaGFyICBQYXJ0NF9BLFBhcnQ0X0I7CisJdW5zaWduZWQgc2hvcnQgQ0xPQ0s7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU2lTX1ZCVkNMS0RhdGFTdHJ1Y3QKLXsKLQlVQ0hBUiAgUGFydDRfQSxQYXJ0NF9COwotCVVTSE9SVCBDTE9DSzsKLX0gU2lTX1ZCVkNMS0RhdGFTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX1N0UmVzSW5mb19TIHsKKwl1bnNpZ25lZCBzaG9ydCBIVG90YWw7CisJdW5zaWduZWQgc2hvcnQgVlRvdGFsOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19TdFJlc0luZm9TdHJ1Y3QKLXsKLQlVU0hPUlQgSFRvdGFsOwotCVVTSE9SVCBWVG90YWw7Ci19IFNpU19TdFJlc0luZm9TdHJ1Y3Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9TaVNfTW9kZVJlc0luZm9TdHJ1Y3QKLXsKLQlVU0hPUlQgSFRvdGFsOwotCVVTSE9SVCBWVG90YWw7Ci0JVUNIQVIgIFhDaGFyOwotCVVDSEFSICBZQ2hhcjsKLX0gU2lTX01vZGVSZXNJbmZvU3RydWN0OwotCi0KLQotdHlwZWRlZiBVQ0hBUiBEUkFNNFR5cGVbNF07CitzdHJ1Y3QgU2lTX01vZGVSZXNJbmZvX1MgeworCXVuc2lnbmVkIHNob3J0IEhUb3RhbDsKKwl1bnNpZ25lZCBzaG9ydCBWVG90YWw7CisJdW5zaWduZWQgY2hhciAgWENoYXI7CisJdW5zaWduZWQgY2hhciAgWUNoYXI7Cit9OwogCiAvKiBEZWZpbmVzIGZvciBTaVNfQ3VzdG9tVCAqLwogLyogTmV2ZXIgY2hhbmdlIHRoZXNlIGZvciBzaXNmYiBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIENVVF9OT05FICAgICAgICAgIDAKLSNkZWZpbmUgQ1VUX0ZPUkNFTk9ORSAgICAgMQotI2RlZmluZSBDVVRfQkFSQ08xMzY2ICAgICAyCi0jZGVmaW5lIENVVF9CQVJDTzEwMjQgICAgIDMKLSNkZWZpbmUgQ1VUX0NPTVBBUTEyODAgICAgNAotI2RlZmluZSBDVVRfQ09NUEFRMTI4MDIgICA1Ci0jZGVmaW5lIENVVF9QQU5FTDg0OCAgICAgIDYKLSNkZWZpbmUgQ1VUX0NMRVZPMTAyNCAgICAgNwotI2RlZmluZSBDVVRfQ0xFVk8xMDI0MiAgICA4Ci0jZGVmaW5lIENVVF9DTEVWTzE0MDAgICAgIDkKLSNkZWZpbmUgQ1VUX0NMRVZPMTQwMDIgICAgMTAKLSNkZWZpbmUgQ1VUX1VOSVdJTEwxMDI0ICAgMTEKLSNkZWZpbmUgQ1VUX0FTVVNMMzAwMEQgICAgMTIKLSNkZWZpbmUgQ1VUX1VOSVdJTEwxMDI0MiAgMTMKLSNkZWZpbmUgQ1VUX0FDRVIxMjgwICAgICAgMTQKLSNkZWZpbmUgQ1VUX0NPTVBBTDE0MDBfMSAgMTUKLSNkZWZpbmUgQ1VUX0NPTVBBTDE0MDBfMiAgMTYKLSNkZWZpbmUgQ1VUX0FTVVNBMkhfMSAgICAgMTcKLSNkZWZpbmUgQ1VUX0FTVVNBMkhfMiAgICAgMTgKKyNkZWZpbmUgQ1VUX05PTkUJCSAwCisjZGVmaW5lIENVVF9GT1JDRU5PTkUJCSAxCisjZGVmaW5lIENVVF9CQVJDTzEzNjYJCSAyCisjZGVmaW5lIENVVF9CQVJDTzEwMjQJCSAzCisjZGVmaW5lIENVVF9DT01QQVExMjgwCQkgNAorI2RlZmluZSBDVVRfQ09NUEFRMTI4MDIJCSA1CisjZGVmaW5lIENVVF9QQU5FTDg0OAkJIDYKKyNkZWZpbmUgQ1VUX0NMRVZPMTAyNAkJIDcKKyNkZWZpbmUgQ1VUX0NMRVZPMTAyNDIJCSA4CisjZGVmaW5lIENVVF9DTEVWTzE0MDAJCSA5CisjZGVmaW5lIENVVF9DTEVWTzE0MDAyCQkxMAorI2RlZmluZSBDVVRfVU5JV0lMTDEwMjQJCTExCisjZGVmaW5lIENVVF9BU1VTTDMwMDBECQkxMgorI2RlZmluZSBDVVRfVU5JV0lMTDEwMjQyCTEzCisjZGVmaW5lIENVVF9BQ0VSMTI4MAkJMTQKKyNkZWZpbmUgQ1VUX0NPTVBBTDE0MDBfMQkxNQorI2RlZmluZSBDVVRfQ09NUEFMMTQwMF8yCTE2CisjZGVmaW5lIENVVF9BU1VTQTJIXzEJCTE3CisjZGVmaW5lIENVVF9BU1VTQTJIXzIJCTE4CisjZGVmaW5lIENVVF9VTktOT1dOTENECQkxOQorI2RlZmluZSBDVVRfQU9QODA2MAkJMjAKKyNkZWZpbmUgQ1VUX1BBTkVMODU2CQkyMQogCi10eXBlZGVmIHN0cnVjdCBfU2lTX1ByaXZhdGUKK3N0cnVjdCBTaVNfUHJpdmF0ZQogewotI2lmZGVmIExJTlVYX0tFUk5FTAotICAgICAgICBTSVNJT0FERFJFU1MgUmVsSU87CisJdW5zaWduZWQgY2hhcgkJCUNoaXBUeXBlOworCXVuc2lnbmVkIGNoYXIJCQlDaGlwUmV2aXNpb247CisjaWZkZWYgU0lTX1hPUkdfWEY4NgorCVBDSVRBRwkJCQlQY2lUYWc7CiAjZW5kaWYKLQlTSVNJT0FERFJFU1MgU2lTX1AzYzQ7Ci0JU0lTSU9BRERSRVNTIFNpU19QM2Q0OwotCVNJU0lPQUREUkVTUyBTaVNfUDNjMDsKLQlTSVNJT0FERFJFU1MgU2lTX1AzY2U7Ci0JU0lTSU9BRERSRVNTIFNpU19QM2MyOwotCVNJU0lPQUREUkVTUyBTaVNfUDNjYTsKLQlTSVNJT0FERFJFU1MgU2lTX1AzYzY7Ci0JU0lTSU9BRERSRVNTIFNpU19QM2M3OwotCVNJU0lPQUREUkVTUyBTaVNfUDNjODsKLQlTSVNJT0FERFJFU1MgU2lTX1AzYzk7Ci0JU0lTSU9BRERSRVNTIFNpU19QM2NiOwotCVNJU0lPQUREUkVTUyBTaVNfUDNjZDsKLQlTSVNJT0FERFJFU1MgU2lTX1AzZGE7Ci0JU0lTSU9BRERSRVNTIFNpU19QYXJ0MVBvcnQ7Ci0JU0lTSU9BRERSRVNTIFNpU19QYXJ0MlBvcnQ7Ci0JU0lTSU9BRERSRVNTIFNpU19QYXJ0M1BvcnQ7Ci0JU0lTSU9BRERSRVNTIFNpU19QYXJ0NFBvcnQ7Ci0JU0lTSU9BRERSRVNTIFNpU19QYXJ0NVBvcnQ7Ci0JU0lTSU9BRERSRVNTIFNpU19WaWRDYXB0OwotCVNJU0lPQUREUkVTUyBTaVNfVmlkUGxheTsKLQlVU0hPUlQgU2lTX0lGX0RFRl9MVkRTOwotCVVTSE9SVCBTaVNfSUZfREVGX0NINzB4eDsKLQlVU0hPUlQgU2lTX0lGX0RFRl9DT05FWDsKLQlVU0hPUlQgU2lTX0lGX0RFRl9UUlVNUElPTjsKLQlVU0hPUlQgU2lTX0lGX0RFRl9EU1ROOwotCVVTSE9SVCBTaVNfSUZfREVGX0ZTVE47Ci0JVVNIT1JUIFNpU19TeXNGbGFnczsKLQlVQ0hBUiAgU2lTX1ZHQUlORk87Ci0jaWZkZWYgTElOVVhfWEY4NgotICAgICAgICBVU0hPUlQgU2lTX0NQMSwgU2lTX0NQMiwgU2lTX0NQMywgU2lTX0NQNDsKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisJdm9pZAkJCQkqaXZpZGVvOwogI2VuZGlmCi0JQk9PTEVBTiBTaVNfVXNlUk9NOwotCUJPT0xFQU4gU2lTX1JPTU5ldzsKLQlCT09MRUFOIFNpU19OZWVkUm9tTW9kZURhdGE7Ci0JQk9PTEVBTiBQYW5lbFNlbGZEZXRlY3RlZDsKLQlpbnQgICAgIFNpU19DSE92ZXJTY2FuOwotCUJPT0xFQU4gU2lTX0NIU092ZXJTY2FuOwotCUJPT0xFQU4gU2lTX0NoU1c7Ci0JQk9PTEVBTiBTaVNfVXNlTENEQTsKLQlpbnQgICAgIFNpU19Vc2VPRU07Ci0JVUxPTkcgICBTaVNfQ3VzdG9tVDsKLQlVU0hPUlQgIFNpU19CYWNrdXA3MHh4OwotCUJPT0xFQU4gSGF2ZUVNSTsKLQlCT09MRUFOIEhhdmVFTUlMQ0Q7Ci0JQk9PTEVBTiBPdmVycnVsZUVNSTsKLQlVQ0hBUiAgRU1JXzMwLEVNSV8zMSxFTUlfMzIsRU1JXzMzOwotCVVTSE9SVCBTaVNfRU1JT2Zmc2V0OwotCVNIT1JUICBQREMsIFBEQ0E7Ci0JVUNIQVIgIFNpU19NeUNSNjM7Ci0JVVNIT1JUIFNpU19DUlQxTW9kZTsKLQlVU0hPUlQgU2lTX2ZsYWdfY2xlYXJidWZmZXI7Ci0JaW50ICAgIFNpU19SQU1UeXBlOwotCVVDSEFSICBTaVNfQ2hhbm5lbEFCOwotCVVDSEFSICBTaVNfRGF0YUJ1c1dpZHRoOwotCVVTSE9SVCBTaVNfTW9kZVR5cGU7Ci0JVVNIT1JUIFNpU19WQkluZm87Ci0JVVNIT1JUIFNpU19UVk1vZGU7Ci0JVVNIT1JUIFNpU19MQ0RSZXNJbmZvOwotCVVTSE9SVCBTaVNfTENEVHlwZUluZm87Ci0JVVNIT1JUIFNpU19MQ0RJbmZvOwotCVVTSE9SVCBTaVNfTENESW5mbzY2MTsKLQlVU0hPUlQgU2lTX1ZCVHlwZTsKLQlVU0hPUlQgU2lTX1ZCRXh0SW5mbzsKLQlVU0hPUlQgU2lTX1lQYlByOwotCVVTSE9SVCBTaVNfU2VsZWN0Q1JUMlJhdGU7Ci0JVVNIT1JUIFNpU19TZXRGbGFnOwotCVVTSE9SVCBTaVNfUlZCSENGQUNUOwotCVVTSE9SVCBTaVNfUlZCSENNQVg7Ci0JVVNIT1JUIFNpU19SVkJIUlM7Ci0JVVNIT1JUIFNpU19WR0FWVDsKLQlVU0hPUlQgU2lTX1ZHQUhUOwotCVVTSE9SVCBTaVNfVlQ7Ci0JVVNIT1JUIFNpU19IVDsKLQlVU0hPUlQgU2lTX1ZHQVZERTsKLQlVU0hPUlQgU2lTX1ZHQUhERTsKLQlVU0hPUlQgU2lTX1ZERTsKLQlVU0hPUlQgU2lTX0hERTsKLQlVU0hPUlQgU2lTX05ld0ZsaWNrZXJNb2RlOwotCVVTSE9SVCBTaVNfUlkxQ09FOwotCVVTSE9SVCBTaVNfUlkyQ09FOwotCVVTSE9SVCBTaVNfUlkzQ09FOwotCVVTSE9SVCBTaVNfUlk0Q09FOwotCVVTSE9SVCBTaVNfTENESERFUzsKLQlVU0hPUlQgU2lTX0xDRFZERVM7Ci0JVVNIT1JUIFNpU19ERENfUG9ydDsKLQlVU0hPUlQgU2lTX0REQ19JbmRleDsKLQlVU0hPUlQgU2lTX0REQ19EYXRhOwotCVVTSE9SVCBTaVNfRERDX05EYXRhOwotCVVTSE9SVCBTaVNfRERDX0NsazsKLQlVU0hPUlQgU2lTX0REQ19OQ2xrOwotCVVTSE9SVCBTaVNfRERDX0RldmljZUFkZHI7Ci0JVVNIT1JUIFNpU19ERENfUmVhZEFkZHI7Ci0JVVNIT1JUIFNpU19ERENfU2VjQWRkcjsKLQlVU0hPUlQgU2lTX0Nocm9udGVsSW5pdDsKLQlCT09MRUFOIFNpU19TZW5zaWJsZVNSMTE7Ci0JVVNIT1JUIFNpUzY2MUxDRDJUYWJsZVNpemU7Ci0KLQlVU0hPUlQgU2lTX1BhbmVsTWluTFZEUzsKLQlVU0hPUlQgU2lTX1BhbmVsTWluMzAxOwotCi0JY29uc3QgU2lTX1N0U3RydWN0ICAgICAgICAgICpTaVNfU01vZGVJRFRhYmxlOwotCWNvbnN0IFNpU19TdGFuZFRhYmxlU3RydWN0ICAqU2lTX1N0YW5kVGFibGU7Ci0JY29uc3QgU2lTX0V4dFN0cnVjdCAgICAgICAgICpTaVNfRU1vZGVJRFRhYmxlOwotCWNvbnN0IFNpU19FeHQyU3RydWN0ICAgICAgICAqU2lTX1JlZkluZGV4OwotCWNvbnN0IFNpU19WQk1vZGVTdHJ1Y3QgICAgICAqU2lTX1ZCTW9kZUlEVGFibGU7Ci0JY29uc3QgU2lTX0NSVDFUYWJsZVN0cnVjdCAgICpTaVNfQ1JUMVRhYmxlOwotCWNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCAgICAqU2lTX01DTEtEYXRhXzA7Ci0JY29uc3QgU2lTX01DTEtEYXRhU3RydWN0ICAgICpTaVNfTUNMS0RhdGFfMTsKLQlTaVNfVkNMS0RhdGFTdHJ1Y3QgICAgCSAgICAqU2lTX1ZDTEtEYXRhOwotCVNpU19WQlZDTEtEYXRhU3RydWN0ICAgICAgICAqU2lTX1ZCVkNMS0RhdGE7Ci0JY29uc3QgU2lTX1N0UmVzSW5mb1N0cnVjdCAgICpTaVNfU3RSZXNJbmZvOwotCWNvbnN0IFNpU19Nb2RlUmVzSW5mb1N0cnVjdCAqU2lTX01vZGVSZXNJbmZvOwotCi0JY29uc3QgVUNIQVIgICAgICAgICAgICAgICAgICpwU2lTX091dHB1dFNlbGVjdDsKLQljb25zdCBVQ0hBUiAgICAgICAgICAgICAgICAgKnBTaVNfU29mdFNldHRpbmc7Ci0KLQljb25zdCBEUkFNNFR5cGUgKlNpU19TUjE1OyAvKiBwb2ludGVyIDogcG9pbnQgdG8gYXJyYXkgKi8KLSNpZmRlZiBMSU5VWF9LRVJORUwKLQlVQ0hBUiAqcFNpU19TUjA3OwotCWNvbnN0IERSQU00VHlwZSAqU2lTX0NSNDA7IC8qIHBvaW50ZXIgOiBwb2ludCB0byBhcnJheSAqLwotCVVDSEFSICpTaVNfQ1I0OTsKLQlVQ0hBUiAqU2lTX1NSMjU7Ci0JVUNIQVIgKnBTaVNfU1IxRjsKLQlVQ0hBUiAqcFNpU19TUjIxOwotCVVDSEFSICpwU2lTX1NSMjI7Ci0JVUNIQVIgKnBTaVNfU1IyMzsKLQlVQ0hBUiAqcFNpU19TUjI0OwotCVVDSEFSICpwU2lTX1NSMzE7Ci0JVUNIQVIgKnBTaVNfU1IzMjsKLQlVQ0hBUiAqcFNpU19TUjMzOwotCVVDSEFSICpwU2lTX0NSVDJEYXRhXzFfMjsKLQlVQ0hBUiAqcFNpU19DUlQyRGF0YV80X0Q7Ci0JVUNIQVIgKnBTaVNfQ1JUMkRhdGFfNF9FOwotCVVDSEFSICpwU2lTX0NSVDJEYXRhXzRfMTA7Ci0JY29uc3QgVVNIT1JUICpwU2lTX1JHQlNlbnNlRGF0YTsKLQljb25zdCBVU0hPUlQgKnBTaVNfVmlkZW9TZW5zZURhdGE7Ci0JY29uc3QgVVNIT1JUICpwU2lTX1lDU2Vuc2VEYXRhOwotCWNvbnN0IFVTSE9SVCAqcFNpU19SR0JTZW5zZURhdGEyOwotCWNvbnN0IFVTSE9SVCAqcFNpU19WaWRlb1NlbnNlRGF0YTI7Ci0JY29uc3QgVVNIT1JUICpwU2lTX1lDU2Vuc2VEYXRhMjsKKwl1bnNpZ25lZCBjaGFyIAkJCSpWaXJ0dWFsUm9tQmFzZTsKKwlCT09MRUFOCQkJCVVzZVJPTTsKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisJdW5zaWduZWQgY2hhciBTSVNJT01FTVRZUEUJKlZpZGVvTWVtb3J5QWRkcmVzczsKKwl1bnNpZ25lZCBpbnQJCQlWaWRlb01lbW9yeVNpemU7CiAjZW5kaWYKKwlTSVNJT0FERFJFU1MJCQlJT0FkZHJlc3M7CisJU0lTSU9BRERSRVNTCQkJSU9BZGRyZXNzMjsgIC8qIEZvciBkdWFsIGNoaXAgWEdJIHZvbGFyaSAqLwogCi0JY29uc3QgU2lTX1BhbmVsRGVsYXlUYmxTdHJ1Y3QgKlNpU19QYW5lbERlbGF5VGJsOwotCWNvbnN0IFNpU19QYW5lbERlbGF5VGJsU3RydWN0ICpTaVNfUGFuZWxEZWxheVRibExWRFM7CisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorCVNJU0lPQUREUkVTUwkJCVJlbElPOworI2VuZGlmCisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzQ7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzZDQ7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzA7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzY2U7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzI7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzY2E7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzY7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzc7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzg7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzk7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzY2I7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzY2M7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzY2Q7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzZGE7CisJU0lTSU9BRERSRVNTCQkJU2lTX1BhcnQxUG9ydDsKKwlTSVNJT0FERFJFU1MJCQlTaVNfUGFydDJQb3J0OworCVNJU0lPQUREUkVTUwkJCVNpU19QYXJ0M1BvcnQ7CisJU0lTSU9BRERSRVNTCQkJU2lTX1BhcnQ0UG9ydDsKKwlTSVNJT0FERFJFU1MJCQlTaVNfUGFydDVQb3J0OworCVNJU0lPQUREUkVTUwkJCVNpU19WaWRDYXB0OworCVNJU0lPQUREUkVTUwkJCVNpU19WaWRQbGF5OworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0lGX0RFRl9MVkRTOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0lGX0RFRl9DSDcweHg7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfSUZfREVGX0NPTkVYOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0lGX0RFRl9UUlVNUElPTjsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19JRl9ERUZfRFNUTjsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19JRl9ERUZfRlNUTjsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19TeXNGbGFnczsKKwl1bnNpZ25lZCBjaGFyCQkJU2lTX1ZHQUlORk87CisjaWZkZWYgU0lTX1hPUkdfWEY4NgorCXVuc2lnbmVkIHNob3J0CQkJU2lTX0NQMSwgU2lTX0NQMiwgU2lTX0NQMywgU2lTX0NQNDsKKyNlbmRpZgorCUJPT0xFQU4JCQkJU2lTX1VzZVJPTTsKKwlCT09MRUFOCQkJCVNpU19ST01OZXc7CisJQk9PTEVBTgkJCQlTaVNfWEdJUk9NOworCUJPT0xFQU4JCQkJU2lTX05lZWRSb21Nb2RlRGF0YTsKKwlCT09MRUFOCQkJCVBhbmVsU2VsZkRldGVjdGVkOworCUJPT0xFQU4JCQkJRERDUG9ydE1peHVwOworCWludAkJCQlTaVNfQ0hPdmVyU2NhbjsKKwlCT09MRUFOCQkJCVNpU19DSFNPdmVyU2NhbjsKKwlCT09MRUFOCQkJCVNpU19DaFNXOworCUJPT0xFQU4JCQkJU2lTX1VzZUxDREE7CisJaW50CQkJCVNpU19Vc2VPRU07CisJdW5zaWduZWQgaW50CQkJU2lTX0N1c3RvbVQ7CisJaW50CQkJCVNpU19Vc2VXaWRlLCBTaVNfVXNlV2lkZUNSVDI7CisJaW50CQkJCVNpU19UVkJsdWU7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfQmFja3VwNzB4eDsKKwlCT09MRUFOCQkJCUhhdmVFTUk7CisJQk9PTEVBTgkJCQlIYXZlRU1JTENEOworCUJPT0xFQU4JCQkJT3ZlcnJ1bGVFTUk7CisJdW5zaWduZWQgY2hhcgkJCUVNSV8zMCxFTUlfMzEsRU1JXzMyLEVNSV8zMzsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19FTUlPZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfUFdET2Zmc2V0OworCXNob3J0CQkJCVBEQywgUERDQTsKKwl1bnNpZ25lZCBjaGFyCQkJU2lTX015Q1I2MzsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19DUlQxTW9kZTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19mbGFnX2NsZWFyYnVmZmVyOworCWludAkJCQlTaVNfUkFNVHlwZTsKKwl1bnNpZ25lZCBjaGFyCQkJU2lTX0NoYW5uZWxBQjsKKwl1bnNpZ25lZCBjaGFyCQkJU2lTX0RhdGFCdXNXaWR0aDsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19Nb2RlVHlwZTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19WQkluZm87CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfVFZNb2RlOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0xDRFJlc0luZm87CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfTENEVHlwZUluZm87CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfTENESW5mbzsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19MQ0RJbmZvNjYxOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX1ZCVHlwZTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19WQkV4dEluZm87CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfWVBiUHI7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfU2VsZWN0Q1JUMlJhdGU7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfU2V0RmxhZzsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19SVkJIQ0ZBQ1Q7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfUlZCSENNQVg7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfUlZCSFJTOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX1JWQkhSUzI7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfVkdBVlQ7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfVkdBSFQ7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfVlQ7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfSFQ7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfVkdBVkRFOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX1ZHQUhERTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19WREU7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfSERFOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX05ld0ZsaWNrZXJNb2RlOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX1JZMUNPRTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19SWTJDT0U7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfUlkzQ09FOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX1JZNENPRTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19MQ0RIREVTOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0xDRFZERVM7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfRERDX1BvcnQ7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfRERDX0luZGV4OworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0REQ19EYXRhOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0REQ19ORGF0YTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19ERENfQ2xrOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0REQ19OQ2xrOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0REQ19EZXZpY2VBZGRyOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0REQ19SZWFkQWRkcjsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19ERENfU2VjQWRkcjsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19DaHJvbnRlbEluaXQ7CisJQk9PTEVBTgkJCQlTaVNfU2Vuc2libGVTUjExOworCXVuc2lnbmVkIHNob3J0CQkJU2lTNjYxTENEMlRhYmxlU2l6ZTsKKworCXVuc2lnbmVkIHNob3J0CQkJU2lTX1BhbmVsTWluTFZEUzsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19QYW5lbE1pbjMwMTsKKworCWNvbnN0IHN0cnVjdCBTaVNfU3QJCSpTaVNfU01vZGVJRFRhYmxlOworCWNvbnN0IHN0cnVjdCBTaVNfU3RhbmRUYWJsZV9TCSpTaVNfU3RhbmRUYWJsZTsKKwljb25zdCBzdHJ1Y3QgU2lTX0V4dAkJKlNpU19FTW9kZUlEVGFibGU7CisJY29uc3Qgc3RydWN0IFNpU19FeHQyCQkqU2lTX1JlZkluZGV4OworCWNvbnN0IHN0cnVjdCBTaVNfVkJNb2RlCQkqU2lTX1ZCTW9kZUlEVGFibGU7CisJY29uc3Qgc3RydWN0IFNpU19DUlQxVGFibGUJKlNpU19DUlQxVGFibGU7CisJY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YQkqU2lTX01DTEtEYXRhXzA7CisJY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YQkqU2lTX01DTEtEYXRhXzE7CisJc3RydWN0IFNpU19WQ0xLRGF0YQkJKlNpU19WQ0xLRGF0YTsKKwlzdHJ1Y3QgU2lTX1ZCVkNMS0RhdGEJCSpTaVNfVkJWQ0xLRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1N0UmVzSW5mb19TCSpTaVNfU3RSZXNJbmZvOworCWNvbnN0IHN0cnVjdCBTaVNfTW9kZVJlc0luZm9fUwkqU2lTX01vZGVSZXNJbmZvOworCisJY29uc3QgdW5zaWduZWQgY2hhcgkJKnBTaVNfT3V0cHV0U2VsZWN0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIJCSpwU2lTX1NvZnRTZXR0aW5nOworCisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19TUjE1OworCisJY29uc3Qgc3RydWN0IFNpU19QYW5lbERlbGF5VGJsCSpTaVNfUGFuZWxEZWxheVRibDsKKwljb25zdCBzdHJ1Y3QgU2lTX1BhbmVsRGVsYXlUYmwJKlNpU19QYW5lbERlbGF5VGJsTFZEUzsKIAogCS8qIFNpUyBicmlkZ2UgKi8KIAotCWNvbnN0IFVDSEFSICpTaVNfTlRTQ1BoYXNlOwotCWNvbnN0IFVDSEFSICpTaVNfUEFMUGhhc2U7Ci0JY29uc3QgVUNIQVIgKlNpU19OVFNDUGhhc2UyOwotCWNvbnN0IFVDSEFSICpTaVNfUEFMUGhhc2UyOwotCWNvbnN0IFVDSEFSICpTaVNfUEFMTVBoYXNlOwotCWNvbnN0IFVDSEFSICpTaVNfUEFMTlBoYXNlOwotCWNvbnN0IFVDSEFSICpTaVNfUEFMTVBoYXNlMjsKLQljb25zdCBVQ0hBUiAqU2lTX1BBTE5QaGFzZTI7Ci0JY29uc3QgVUNIQVIgKlNpU19TcGVjaWFsUGhhc2U7Ci0JY29uc3QgVUNIQVIgKlNpU19TcGVjaWFsUGhhc2VNOwotCWNvbnN0IFVDSEFSICpTaVNfU3BlY2lhbFBoYXNlSjsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19FeHRMQ0QxMDI0eDc2OERhdGE7Ci0JY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgICpTaVNfU3QyTENEMTAyNHg3NjhEYXRhOwotCWNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICAqU2lTX0xDRDEyODB4NzIwRGF0YTsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19TdExDRDEyODB4NzY4XzJEYXRhOwotCWNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICAqU2lTX0V4dExDRDEyODB4NzY4XzJEYXRhOwotCWNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICAqU2lTX0xDRDEyODB4ODAwRGF0YTsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19MQ0QxMjgweDgwMF8yRGF0YTsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19MQ0QxMjgweDk2MERhdGE7Ci0JY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgICpTaVNfRXh0TENEMTI4MHgxMDI0RGF0YTsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19TdDJMQ0QxMjgweDEwMjREYXRhOwotCWNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICAqU2lTX1N0TENEMTQwMHgxMDUwRGF0YTsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19FeHRMQ0QxNDAweDEwNTBEYXRhOwotCWNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICAqU2lTX1N0TENEMTYwMHgxMjAwRGF0YTsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19FeHRMQ0QxNjAweDEyMDBEYXRhOwotCWNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICAqU2lTX0xDRDE2ODB4MTA1MERhdGE7Ci0JY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgICpTaVNfTm9TY2FsZURhdGE7Ci0JY29uc3QgU2lTX1RWRGF0YVN0cnVjdCAgICpTaVNfU3RQQUxEYXRhOwotCWNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgICAqU2lTX0V4dFBBTERhdGE7Ci0JY29uc3QgU2lTX1RWRGF0YVN0cnVjdCAgICpTaVNfU3ROVFNDRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19FeHROVFNDRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19TdDFIaVRWRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19TdDJIaVRWRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19FeHRIaVRWRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19TdDUyNWlEYXRhOwotCWNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgICAqU2lTX1N0NTI1cERhdGE7Ci0JY29uc3QgU2lTX1RWRGF0YVN0cnVjdCAgICpTaVNfU3Q3NTBwRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19FeHQ1MjVpRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19FeHQ1MjVwRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19FeHQ3NTBwRGF0YTsKLQljb25zdCBVQ0hBUiAqU2lTX05UU0NUaW1pbmc7Ci0JY29uc3QgVUNIQVIgKlNpU19QQUxUaW1pbmc7Ci0JY29uc3QgVUNIQVIgKlNpU19IaVRWRXh0VGltaW5nOwotCWNvbnN0IFVDSEFSICpTaVNfSGlUVlN0MVRpbWluZzsKLQljb25zdCBVQ0hBUiAqU2lTX0hpVFZTdDJUaW1pbmc7Ci0JY29uc3QgVUNIQVIgKlNpU19IaVRWR3JvdXAzRGF0YTsKLQljb25zdCBVQ0hBUiAqU2lTX0hpVFZHcm91cDNTaW11OworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX0V4dExDRDEwMjR4NzY4RGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEJKlNpU19TdDJMQ0QxMDI0eDc2OERhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhCSpTaVNfTENEMTI4MHg3MjBEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX1N0TENEMTI4MHg3NjhfMkRhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhCSpTaVNfRXh0TENEMTI4MHg3NjhfMkRhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhCSpTaVNfTENEMTI4MHg4MDBEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX0xDRDEyODB4ODAwXzJEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX0xDRDEyODB4ODU0RGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEJKlNpU19MQ0QxMjgweDk2MERhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhCSpTaVNfRXh0TENEMTI4MHgxMDI0RGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEJKlNpU19TdDJMQ0QxMjgweDEwMjREYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX1N0TENEMTQwMHgxMDUwRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEJKlNpU19FeHRMQ0QxNDAweDEwNTBEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX1N0TENEMTYwMHgxMjAwRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEJKlNpU19FeHRMQ0QxNjAweDEyMDBEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX0xDRDE2ODB4MTA1MERhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhCSpTaVNfTm9TY2FsZURhdGE7CisJY29uc3Qgc3RydWN0IFNpU19UVkRhdGEJCSpTaVNfU3RQQUxEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfVFZEYXRhCQkqU2lTX0V4dFBBTERhdGE7CisJY29uc3Qgc3RydWN0IFNpU19UVkRhdGEJCSpTaVNfU3ROVFNDRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19FeHROVFNDRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19TdDFIaVRWRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19TdDJIaVRWRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19FeHRIaVRWRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19TdDUyNWlEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfVFZEYXRhCQkqU2lTX1N0NTI1cERhdGE7CisJY29uc3Qgc3RydWN0IFNpU19UVkRhdGEJCSpTaVNfU3Q3NTBwRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19FeHQ1MjVpRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19FeHQ1MjVwRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19FeHQ3NTBwRGF0YTsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX05UU0NUaW1pbmc7CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19QQUxUaW1pbmc7CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19IaVRWRXh0VGltaW5nOworCWNvbnN0IHVuc2lnbmVkIGNoYXIJCSpTaVNfSGlUVlN0MVRpbWluZzsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0hpVFZTdDJUaW1pbmc7CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19IaVRWR3JvdXAzRGF0YTsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0hpVFZHcm91cDNTaW11OwogI2lmIDAKLQljb25zdCBVQ0hBUiAqU2lTX0hpVFZUZXh0VGltaW5nOwotCWNvbnN0IFVDSEFSICpTaVNfSGlUVkdyb3VwM1RleHQ7CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19IaVRWVGV4dFRpbWluZzsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0hpVFZHcm91cDNUZXh0OwogI2VuZGlmCiAKLQljb25zdCBTaVNfUGFydDJQb3J0VGJsU3RydWN0ICpTaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzE7Ci0JY29uc3QgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCAqU2lTX0NSVDJQYXJ0Ml8xMjgweDEwMjRfMTsKLQljb25zdCBTaVNfUGFydDJQb3J0VGJsU3RydWN0ICpTaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzI7Ci0JY29uc3QgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCAqU2lTX0NSVDJQYXJ0Ml8xMjgweDEwMjRfMjsKLQljb25zdCBTaVNfUGFydDJQb3J0VGJsU3RydWN0ICpTaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzM7Ci0JY29uc3QgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCAqU2lTX0NSVDJQYXJ0Ml8xMjgweDEwMjRfMzsKKwljb25zdCBzdHJ1Y3QgU2lTX1BhcnQyUG9ydFRibAkqU2lTX0NSVDJQYXJ0Ml8xMDI0eDc2OF8xOworCWNvbnN0IHN0cnVjdCBTaVNfUGFydDJQb3J0VGJsCSpTaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzI7CisJY29uc3Qgc3RydWN0IFNpU19QYXJ0MlBvcnRUYmwJKlNpU19DUlQyUGFydDJfMTAyNHg3NjhfMzsKIAogCS8qIExWRFMsIENocm9udGVsICovCiAKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzgwMHg2MDBEYXRhXzE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFM4MDB4NjAwRGF0YV8yOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTMTAyNHg3NjhEYXRhXzE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxMDI0eDc2OERhdGFfMjsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzEyODB4MTAyNERhdGFfMTsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzEyODB4MTAyNERhdGFfMjsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzEyODB4OTYwRGF0YV8xOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTMTI4MHg5NjBEYXRhXzI7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxNDAweDEwNTBEYXRhXzE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxNDAweDEwNTBEYXRhXzI7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxNjAweDEyMDBEYXRhXzE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxNjAweDEyMDBEYXRhXzI7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxMjgweDc2OERhdGFfMTsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzEyODB4NzY4RGF0YV8yOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTMTAyNHg2MDBEYXRhXzE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxMDI0eDYwMERhdGFfMjsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzExNTJ4NzY4RGF0YV8xOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTMTE1Mng3NjhEYXRhXzI7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFM2NDB4NDgwRGF0YV8xOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTNjQweDQ4MERhdGFfMjsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzMyMHg0ODBEYXRhXzE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFNYWFh4WFhYRGF0YV8xOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTQkFSQ08xMzY2RGF0YV8xOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTQkFSQ08xMzY2RGF0YV8yOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTQkFSQ08xMDI0RGF0YV8xOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTQkFSQ08xMDI0RGF0YV8yOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTODQ4eDQ4MERhdGFfMTsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzg0OHg0ODBEYXRhXzI7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0NIVFZVTlRTQ0RhdGE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0NIVFZPTlRTQ0RhdGE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0NIVFZVUEFMRGF0YTsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfQ0hUVk9QQUxEYXRhOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19DSFRWVVBBTE1EYXRhOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19DSFRWT1BBTE1EYXRhOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19DSFRWVVBBTE5EYXRhOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19DSFRWT1BBTE5EYXRhOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19DSFRWU09QQUxEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEJKlNpU19MVkRTMzIweDI0MERhdGFfMTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhCSpTaVNfTFZEUzMyMHgyNDBEYXRhXzI7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0xWRFM2NDB4NDgwRGF0YV8xOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEJKlNpU19MVkRTODAweDYwMERhdGFfMTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhCSpTaVNfTFZEUzEwMjR4NjAwRGF0YV8xOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEJKlNpU19MVkRTMTAyNHg3NjhEYXRhXzE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0xWRFNCQVJDTzEzNjZEYXRhXzE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0xWRFNCQVJDTzEzNjZEYXRhXzI7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0xWRFNCQVJDTzEwMjREYXRhXzE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0xWRFM4NDh4NDgwRGF0YV8xOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEJKlNpU19MVkRTODQ4eDQ4MERhdGFfMjsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhCSpTaVNfQ0hUVlVOVFNDRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhCSpTaVNfQ0hUVk9OVFNDRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhCSpTaVNfQ0hUVlVQQUxEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEJKlNpU19DSFRWT1BBTERhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0NIVFZVUEFMTURhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0NIVFZPUEFMTURhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0NIVFZVUEFMTkRhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0NIVFZPUEFMTkRhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0NIVFZTT1BBTERhdGE7CiAKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwMF8xOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTAxXzE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDJfMTsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwM18xOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTA0XzE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDVfMTsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwNl8xOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTA3XzE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDhfMTsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwOV8xOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTBhXzE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMGJfMTsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwY18xOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTBkXzE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMGVfMTsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwZl8xOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZU5TXzE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDBfMjsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwMV8yOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTAyXzI7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDNfMjsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwNF8yOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTA1XzI7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDZfMjsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwN18yOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTA4XzI7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDlfMjsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwYV8yOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTBiXzI7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMGNfMjsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwZF8yOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTBlXzI7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMGZfMjsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGVOU18yOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX0NIVFZVTlRTQ0Rlc0RhdGE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfQ0hUVk9OVFNDRGVzRGF0YTsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19DSFRWVVBBTERlc0RhdGE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfQ0hUVk9QQUxEZXNEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcwkqU2lTX1BhbmVsVHlwZTA0XzFhOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcwkqU2lTX1BhbmVsVHlwZTA0XzJhOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcwkqU2lTX1BhbmVsVHlwZTA0XzFiOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcwkqU2lTX1BhbmVsVHlwZTA0XzJiOwogCi0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTgwMHg2MDBfMTsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTAyNHg3NjhfMTsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTI4MHgxMDI0XzE7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTE0MDB4MTA1MF8xOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMjgweDc2OF8xOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMDI0eDYwMF8xOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMTUyeDc2OF8xOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExNjAweDEyMDBfMTsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxODAweDYwMF8xX0g7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTEwMjR4NzY4XzFfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTI4MHgxMDI0XzFfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTQwMHgxMDUwXzFfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTI4MHg3NjhfMV9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMDI0eDYwMF8xX0g7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTExNTJ4NzY4XzFfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTYwMHgxMjAwXzFfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxODAweDYwMF8yOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMDI0eDc2OF8yOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMjgweDEwMjRfMjsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTQwMHgxMDUwXzI7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTEyODB4NzY4XzI7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTEwMjR4NjAwXzI7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTExNTJ4NzY4XzI7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTE2MDB4MTIwMF8yOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDE4MDB4NjAwXzJfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTAyNHg3NjhfMl9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMjgweDEwMjRfMl9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExNDAweDEwNTBfMl9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMjgweDc2OF8yX0g7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTEwMjR4NjAwXzJfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTE1Mng3NjhfMl9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExNjAweDEyMDBfMl9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDFYWFh4WFhYXzE7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMVhYWHhYWFhfMV9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDE2NDB4NDgwXzE7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTY0MHg0ODBfMV9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDE2NDB4NDgwXzI7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTY0MHg0ODBfMl9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDE2NDB4NDgwXzM7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTY0MHg0ODBfM19IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDEzMjB4NDgwXzE7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19DSFRWQ1JUMVVOVFNDOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfQ0hUVkNSVDFPTlRTQzsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0NIVFZDUlQxVVBBTDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0NIVFZDUlQxT1BBTDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0NIVFZDUlQxU09QQUw7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEJKlNpU19MVkRTQ1JUMTMyMHgyNDBfMTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YQkqU2lTX0xWRFNDUlQxMzIweDI0MF8yOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhCSpTaVNfTFZEU0NSVDEzMjB4MjQwXzJfSDsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YQkqU2lTX0xWRFNDUlQxMzIweDI0MF8zOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhCSpTaVNfTFZEU0NSVDEzMjB4MjQwXzNfSDsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YQkqU2lTX0xWRFNDUlQxNjQweDQ4MF8xOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhCSpTaVNfTFZEU0NSVDE2NDB4NDgwXzFfSDsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YQkqU2lTX0NIVFZDUlQxVU5UU0M7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEJKlNpU19DSFRWQ1JUMU9OVFNDOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhCSpTaVNfQ0hUVkNSVDFVUEFMOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhCSpTaVNfQ0hUVkNSVDFPUEFMOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhCSpTaVNfQ0hUVkNSVDFTT1BBTDsKIAotCWNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCAqU2lTX0NIVFZSZWdfVU5UU0M7Ci0JY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0ICpTaVNfQ0hUVlJlZ19PTlRTQzsKLQljb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgKlNpU19DSFRWUmVnX1VQQUw7Ci0JY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0ICpTaVNfQ0hUVlJlZ19PUEFMOwotCWNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCAqU2lTX0NIVFZSZWdfVVBBTE07Ci0JY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0ICpTaVNfQ0hUVlJlZ19PUEFMTTsKLQljb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgKlNpU19DSFRWUmVnX1VQQUxOOwotCWNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCAqU2lTX0NIVFZSZWdfT1BBTE47Ci0JY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0ICpTaVNfQ0hUVlJlZ19TT1BBTDsKKwljb25zdCBzdHJ1Y3QgU2lTX0NIVFZSZWdEYXRhCSpTaVNfQ0hUVlJlZ19VTlRTQzsKKwljb25zdCBzdHJ1Y3QgU2lTX0NIVFZSZWdEYXRhCSpTaVNfQ0hUVlJlZ19PTlRTQzsKKwljb25zdCBzdHJ1Y3QgU2lTX0NIVFZSZWdEYXRhCSpTaVNfQ0hUVlJlZ19VUEFMOworCWNvbnN0IHN0cnVjdCBTaVNfQ0hUVlJlZ0RhdGEJKlNpU19DSFRWUmVnX09QQUw7CisJY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YQkqU2lTX0NIVFZSZWdfVVBBTE07CisJY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YQkqU2lTX0NIVFZSZWdfT1BBTE07CisJY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YQkqU2lTX0NIVFZSZWdfVVBBTE47CisJY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YQkqU2lTX0NIVFZSZWdfT1BBTE47CisJY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YQkqU2lTX0NIVFZSZWdfU09QQUw7CiAKLQljb25zdCBVQ0hBUiAqU2lTX0NIVFZWQ0xLVU5UU0M7Ci0JY29uc3QgVUNIQVIgKlNpU19DSFRWVkNMS09OVFNDOwotCWNvbnN0IFVDSEFSICpTaVNfQ0hUVlZDTEtVUEFMOwotCWNvbnN0IFVDSEFSICpTaVNfQ0hUVlZDTEtPUEFMOwotCWNvbnN0IFVDSEFSICpTaVNfQ0hUVlZDTEtVUEFMTTsKLQljb25zdCBVQ0hBUiAqU2lTX0NIVFZWQ0xLT1BBTE07Ci0JY29uc3QgVUNIQVIgKlNpU19DSFRWVkNMS1VQQUxOOwotCWNvbnN0IFVDSEFSICpTaVNfQ0hUVlZDTEtPUEFMTjsKLQljb25zdCBVQ0hBUiAqU2lTX0NIVFZWQ0xLU09QQUw7CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19DSFRWVkNMS1VOVFNDOworCWNvbnN0IHVuc2lnbmVkIGNoYXIJCSpTaVNfQ0hUVlZDTEtPTlRTQzsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0NIVFZWQ0xLVVBBTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0NIVFZWQ0xLT1BBTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0NIVFZWQ0xLVVBBTE07CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19DSFRWVkNMS09QQUxNOworCWNvbnN0IHVuc2lnbmVkIGNoYXIJCSpTaVNfQ0hUVlZDTEtVUEFMTjsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0NIVFZWQ0xLT1BBTE47CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19DSFRWVkNMS1NPUEFMOwogCi0JVVNIT1JUICBQYW5lbFhSZXMsIFBhbmVsSFQ7Ci0JVVNIT1JUICBQYW5lbFlSZXMsIFBhbmVsVlQ7Ci0JVVNIT1JUICBQYW5lbEhSUywgIFBhbmVsSFJFOwotICAJVVNIT1JUIAlQYW5lbFZSUywgIFBhbmVsVlJFOwotCVVTSE9SVCAgUGFuZWxWQ0xLSWR4MzAwOwotCVVTSE9SVCAgUGFuZWxWQ0xLSWR4MzE1OworCXVuc2lnbmVkIHNob3J0CQkJUGFuZWxYUmVzLCBQYW5lbEhUOworCXVuc2lnbmVkIHNob3J0CQkJUGFuZWxZUmVzLCBQYW5lbFZUOworCXVuc2lnbmVkIHNob3J0CQkJUGFuZWxIUlMsICBQYW5lbEhSRTsKKwl1bnNpZ25lZCBzaG9ydAkJCVBhbmVsVlJTLCAgUGFuZWxWUkU7CisJdW5zaWduZWQgc2hvcnQJCQlQYW5lbFZDTEtJZHgzMDA7CisJdW5zaWduZWQgc2hvcnQJCQlQYW5lbFZDTEtJZHgzMTU7CisJQk9PTEVBTgkJCQlBbHRlcm5hdGUxNjAweDEyMDA7CiAKLQlCT09MRUFOIFVzZUN1c3RvbU1vZGU7Ci0JQk9PTEVBTiBDUlQxVXNlc0N1c3RvbU1vZGU7Ci0JVVNIT1JUICBDSERpc3BsYXk7Ci0JVVNIT1JUICBDSFN5bmNTdGFydDsKLQlVU0hPUlQgIENIU3luY0VuZDsKLQlVU0hPUlQgIENIVG90YWw7Ci0JVVNIT1JUICBDSEJsYW5rU3RhcnQ7Ci0JVVNIT1JUICBDSEJsYW5rRW5kOwotCVVTSE9SVCAgQ1ZEaXNwbGF5OwotCVVTSE9SVCAgQ1ZTeW5jU3RhcnQ7Ci0JVVNIT1JUICBDVlN5bmNFbmQ7Ci0JVVNIT1JUICBDVlRvdGFsOwotCVVTSE9SVCAgQ1ZCbGFua1N0YXJ0OwotCVVTSE9SVCAgQ1ZCbGFua0VuZDsKLQlVTE9ORyAgIENEQ2xvY2s7Ci0JVUxPTkcgICBDRmxhZ3M7ICAgCi0JVUNIQVIgICBDQ1JUMUNSVENbMTddOwotCVVDSEFSICAgQ1NSMkI7Ci0JVUNIQVIgICBDU1IyQzsKLQlVU0hPUlQgIENTUkNsb2NrOwotCVVTSE9SVCAgQ1NSQ2xvY2tfQ1JUMTsKLQlVU0hPUlQgIENNb2RlRmxhZzsKLQlVU0hPUlQgIENNb2RlRmxhZ19DUlQxOwotCVVTSE9SVCAgQ0luZm9GbGFnOworCUJPT0xFQU4JCQkJVXNlQ3VzdG9tTW9kZTsKKwlCT09MRUFOCQkJCUNSVDFVc2VzQ3VzdG9tTW9kZTsKKwl1bnNpZ25lZCBzaG9ydAkJCUNIRGlzcGxheTsKKwl1bnNpZ25lZCBzaG9ydAkJCUNIU3luY1N0YXJ0OworCXVuc2lnbmVkIHNob3J0CQkJQ0hTeW5jRW5kOworCXVuc2lnbmVkIHNob3J0CQkJQ0hUb3RhbDsKKwl1bnNpZ25lZCBzaG9ydAkJCUNIQmxhbmtTdGFydDsKKwl1bnNpZ25lZCBzaG9ydAkJCUNIQmxhbmtFbmQ7CisJdW5zaWduZWQgc2hvcnQJCQlDVkRpc3BsYXk7CisJdW5zaWduZWQgc2hvcnQJCQlDVlN5bmNTdGFydDsKKwl1bnNpZ25lZCBzaG9ydAkJCUNWU3luY0VuZDsKKwl1bnNpZ25lZCBzaG9ydAkJCUNWVG90YWw7CisJdW5zaWduZWQgc2hvcnQJCQlDVkJsYW5rU3RhcnQ7CisJdW5zaWduZWQgc2hvcnQJCQlDVkJsYW5rRW5kOworCXVuc2lnbmVkIGludAkJCUNEQ2xvY2s7CisJdW5zaWduZWQgaW50CQkJQ0ZsYWdzOworCXVuc2lnbmVkIGNoYXIJCQlDQ1JUMUNSVENbMTddOworCXVuc2lnbmVkIGNoYXIJCQlDU1IyQjsKKwl1bnNpZ25lZCBjaGFyCQkJQ1NSMkM7CisJdW5zaWduZWQgc2hvcnQJCQlDU1JDbG9jazsKKwl1bnNpZ25lZCBzaG9ydAkJCUNTUkNsb2NrX0NSVDE7CisJdW5zaWduZWQgc2hvcnQJCQlDTW9kZUZsYWc7CisJdW5zaWduZWQgc2hvcnQJCQlDTW9kZUZsYWdfQ1JUMTsKKwl1bnNpZ25lZCBzaG9ydAkJCUNJbmZvRmxhZzsKIAotCWludAlMVkRTSEw7Ci0JCi0JQk9PTEVBTiBCYWNrdXA7Ci0JVUNIQVIgQmFja3VwX01vZGU7Ci0JVUNIQVIgQmFja3VwXzE0OwotCVVDSEFSIEJhY2t1cF8xNTsKLQlVQ0hBUiBCYWNrdXBfMTY7Ci0JVUNIQVIgQmFja3VwXzE3OwotCVVDSEFSIEJhY2t1cF8xODsKLQlVQ0hBUiBCYWNrdXBfMTk7Ci0JVUNIQVIgQmFja3VwXzFhOwotCVVDSEFSIEJhY2t1cF8xYjsKLQlVQ0hBUiBCYWNrdXBfMWM7Ci0JVUNIQVIgQmFja3VwXzFkOwotCQotCWludCAgICAgVXNlUGFuZWxTY2FsZXI7Ci0JaW50CUNlbnRlclNjcmVlbjsKKwlpbnQJCQkJTFZEU0hMOwogCi0JVVNIT1JUICBDUF9WZW5kb3IsIENQX1Byb2R1Y3Q7Ci0JQk9PTEVBTiBDUF9IYXZlQ3VzdG9tRGF0YTsKLQlpbnQgICAgIENQX1ByZWZlcnJlZFgsIENQX1ByZWZlcnJlZFksIENQX1ByZWZlcnJlZEluZGV4OwotCWludAlDUF9NYXhYLCBDUF9NYXhZLCBDUF9NYXhDbG9jazsKLQlVQ0hBUiAgIENQX1ByZWZTUjJCLCBDUF9QcmVmU1IyQzsKLQlVU0hPUlQgIENQX1ByZWZDbG9jazsKLQlCT09MRUFOIENQX1N1cHBvcnRzNjQwNDgwNzU7Ci0JaW50ICAgICBDUF9IRGlzcGxheVs3XSwgQ1BfVkRpc3BsYXlbN107CS8qIEZvciBDdXN0b20gTENEIHBhbmVsIGRpbWVuc2lvbnMgKi8KLSAgICAJaW50ICAgICBDUF9IVG90YWxbN10sIENQX1ZUb3RhbFs3XTsKLSAgICAJaW50ICAgICBDUF9IU3luY1N0YXJ0WzddLCBDUF9WU3luY1N0YXJ0WzddOwotICAgIAlpbnQgICAgIENQX0hTeW5jRW5kWzddLCBDUF9WU3luY0VuZFs3XTsKLQlpbnQgICAgIENQX0hCbGFua1N0YXJ0WzddLCBDUF9WQmxhbmtTdGFydFs3XTsKLQlpbnQgICAgIENQX0hCbGFua0VuZFs3XSwgQ1BfVkJsYW5rRW5kWzddOwotICAgIAlpbnQgICAgIENQX0Nsb2NrWzddOwotCUJPT0xFQU4gQ1BfRGF0YVZhbGlkWzddOwotCUJPT0xFQU4gQ1BfSFN5bmNfUFs3XSwgQ1BfVlN5bmNfUFs3XSwgQ1BfU3luY1ZhbGlkWzddOwotfSBTaVNfUHJpdmF0ZTsKKwlCT09MRUFOCQkJCUJhY2t1cDsKKwl1bnNpZ25lZCBjaGFyCQkJQmFja3VwX01vZGU7CisJdW5zaWduZWQgY2hhcgkJCUJhY2t1cF8xNDsKKwl1bnNpZ25lZCBjaGFyCQkJQmFja3VwXzE1OworCXVuc2lnbmVkIGNoYXIJCQlCYWNrdXBfMTY7CisJdW5zaWduZWQgY2hhcgkJCUJhY2t1cF8xNzsKKwl1bnNpZ25lZCBjaGFyCQkJQmFja3VwXzE4OworCXVuc2lnbmVkIGNoYXIJCQlCYWNrdXBfMTk7CisJdW5zaWduZWQgY2hhcgkJCUJhY2t1cF8xYTsKKwl1bnNpZ25lZCBjaGFyCQkJQmFja3VwXzFiOworCXVuc2lnbmVkIGNoYXIJCQlCYWNrdXBfMWM7CisJdW5zaWduZWQgY2hhcgkJCUJhY2t1cF8xZDsKKworCXVuc2lnbmVkIGNoYXIJCQlJbml0X1A0XzBFOworCisJaW50CQkJCVVzZVBhbmVsU2NhbGVyOworCWludAkJCQlDZW50ZXJTY3JlZW47CisKKwl1bnNpZ25lZCBzaG9ydAkJCUNQX1ZlbmRvciwgQ1BfUHJvZHVjdDsKKwlCT09MRUFOCQkJCUNQX0hhdmVDdXN0b21EYXRhOworCWludAkJCQlDUF9QcmVmZXJyZWRYLCBDUF9QcmVmZXJyZWRZLCBDUF9QcmVmZXJyZWRJbmRleDsKKwlpbnQJCQkJQ1BfTWF4WCwgQ1BfTWF4WSwgQ1BfTWF4Q2xvY2s7CisJdW5zaWduZWQgY2hhcgkJCUNQX1ByZWZTUjJCLCBDUF9QcmVmU1IyQzsKKwl1bnNpZ25lZCBzaG9ydAkJCUNQX1ByZWZDbG9jazsKKwlCT09MRUFOCQkJCUNQX1N1cHBvcnRzNjQwNDgwNzU7CisJaW50CQkJCUNQX0hEaXNwbGF5WzddLCBDUF9WRGlzcGxheVs3XTsJLyogRm9yIEN1c3RvbSBMQ0QgcGFuZWwgZGltZW5zaW9ucyAqLworCWludAkJCQlDUF9IVG90YWxbN10sIENQX1ZUb3RhbFs3XTsKKwlpbnQJCQkJQ1BfSFN5bmNTdGFydFs3XSwgQ1BfVlN5bmNTdGFydFs3XTsKKwlpbnQJCQkJQ1BfSFN5bmNFbmRbN10sIENQX1ZTeW5jRW5kWzddOworCWludAkJCQlDUF9IQmxhbmtTdGFydFs3XSwgQ1BfVkJsYW5rU3RhcnRbN107CisJaW50CQkJCUNQX0hCbGFua0VuZFs3XSwgQ1BfVkJsYW5rRW5kWzddOworCWludAkJCQlDUF9DbG9ja1s3XTsKKwlCT09MRUFOCQkJCUNQX0RhdGFWYWxpZFs3XTsKKwlCT09MRUFOCQkJCUNQX0hTeW5jX1BbN10sIENQX1ZTeW5jX1BbN10sIENQX1N5bmNWYWxpZFs3XTsKK307CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jIGIvZHJpdmVycy92aWRlby90cmlkZW50ZmIuYwppbmRleCA2OThjYTkyLi44MWE2ZDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMKQEAgLTEwNjEsNiArMTA2MSwxMSBAQAogCiAJY2hpcF9pZCA9IGlkLT5kZXZpY2U7CiAKKwlpZihjaGlwX2lkID09IENZQkVSQkxBREVpMSkKKwkJb3V0cHV0KCIqKiogUGxlYXNlIGRvIHVzZSBjeWJsYWZiLCBDeWJlcmJsYWRlL2kxIHN1cHBvcnQgIgorCQkgICAgICAgIndpbGwgc29vbiBiZSByZW1vdmVkIGZyb20gdHJpZGVudGZiIVxuIik7CisKKwogCS8qIElmIFBDSSBpZCBpcyAweDk2NjAgdGhlbiBmdXJ0aGVyIGRldGVjdCBjaGlwIHR5cGUgKi8KIAkKIAlpZiAoY2hpcF9pZCA9PSBUR1VJOTY2MCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92ZXNhZmIuYyBiL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMKaW5kZXggYTI3MjU5Mi4uMWNhODAyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92ZXNhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3Zlc2FmYi5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8dmlkZW8vdmdhLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL210cnIuaD4KIApAQCAtNTQsNiArNTUsNyBAQAogc3RhdGljIHZvaWQgICAgICAgICAgICAoKnBtaV9zdGFydCkodm9pZCk7CiBzdGF0aWMgdm9pZCAgICAgICAgICAgICgqcG1pX3BhbCkodm9pZCk7CiBzdGF0aWMgaW50ICAgICAgICAgICAgIGRlcHRoOworc3RhdGljIGludCAgICAgICAgICAgICB2Z2FfY29tcGF0OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtODYsNiArODgsMzcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB2ZXNhZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgZXJyID0gMTsKKworCWlmICh2Z2FfY29tcGF0KSB7CisJCWludCBsb29wID0gMTAwMDA7CisJCXU4IHNlcSA9IDAsIGNydGMxNyA9IDA7CisKKwkJZXJyID0gMDsKKworCQlpZiAoYmxhbmspIHsKKwkJCXNlcSA9IDB4MjA7CisJCQljcnRjMTcgPSAweDAwOworCQl9IGVsc2UgeworCQkJc2VxID0gMHgwMDsKKwkJCWNydGMxNyA9IDB4ODA7CisJCX0KKworCQl2Z2Ffd3NlcShOVUxMLCAweDAwLCAweDAxKTsKKwkJc2VxIHw9IHZnYV9yc2VxKE5VTEwsIDB4MDEpICYgfjB4MjA7CisJCXZnYV93c2VxKE5VTEwsIDB4MDAsIHNlcSk7CisKKwkJY3J0YzE3IHw9IHZnYV9yY3J0KE5VTEwsIDB4MTcpICYgfjB4ODA7CisJCXdoaWxlIChsb29wLS0pOworCQl2Z2Ffd2NydChOVUxMLCAweDE3LCBjcnRjMTcpOworCQl2Z2Ffd3NlcShOVUxMLCAweDAwLCAweDAzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgdm9pZCB2ZXNhX3NldHBhbGV0dGUoaW50IHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAogCQkJICAgIHVuc2lnbmVkIGJsdWUpCiB7CkBAIC0xNzYsNiArMjA5LDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmZiX3NldGNvbHJlZwk9IHZlc2FmYl9zZXRjb2xyZWcsCiAJLmZiX3Bhbl9kaXNwbGF5CT0gdmVzYWZiX3Bhbl9kaXNwbGF5LAorCS5mYl9ibGFuayAgICAgICA9IHZlc2FmYl9ibGFuaywKIAkuZmJfZmlsbHJlY3QJPSBjZmJfZmlsbHJlY3QsCiAJLmZiX2NvcHlhcmVhCT0gY2ZiX2NvcHlhcmVhLAogCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LApAQCAtNDI5LDYgKzQ2MywxMCBAQAogCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVCB8CiAJCSh5cGFuKSA/IEZCSU5GT19IV0FDQ0VMX1lQQU4gOiAwOwogCisJdmdhX2NvbXBhdCA9IChzY3JlZW5faW5mby5jYXBhYmlsaXRpZXMgJiAyKSA/IDAgOiAxOworCXByaW50aygidmVzYWZiOiBNb2RlIGlzICVzVkdBIGNvbXBhdGlibGVcbiIsCisJICAgICAgICh2Z2FfY29tcGF0KSA/ICIiIDogIm5vdCAiKTsKKwogCWlmIChmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAyNTYsIDApIDwgMCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmdhc3RhdGUuYyBiL2RyaXZlcnMvdmlkZW8vdmdhc3RhdGUuYwppbmRleCAwZWE2MmQ4Li5jYTkyOTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZnYXN0YXRlLmMKKysrIGIvZHJpdmVycy92aWRlby92Z2FzdGF0ZS5jCkBAIC0zNDIsMTYgKzM0MiwxMSBAQAogCWlmIChzdGF0ZS0+dmlkc3RhdGUgIT0gTlVMTCkgewogCQlzdHJ1Y3QgcmVnc3RhdGUgKnNhdmVkID0gKHN0cnVjdCByZWdzdGF0ZSAqKSBzdGF0ZS0+dmlkc3RhdGU7CiAKLQkJaWYgKHNhdmVkLT52Z2FfZm9udDApIAotCQkJdmZyZWUoc2F2ZWQtPnZnYV9mb250MCk7Ci0JCWlmIChzYXZlZC0+dmdhX2ZvbnQxKSAKLQkJCXZmcmVlKHNhdmVkLT52Z2FfZm9udDEpOwotCQlpZiAoc2F2ZWQtPnZnYV90ZXh0KQotCQkJdmZyZWUoc2F2ZWQtPnZnYV90ZXh0KTsKLQkJaWYgKHNhdmVkLT52Z2FfY21hcCkKLQkJCXZmcmVlKHNhdmVkLT52Z2FfY21hcCk7Ci0JCWlmIChzYXZlZC0+YXR0cikKLQkJCXZmcmVlKHNhdmVkLT5hdHRyKTsKKwkJdmZyZWUoc2F2ZWQtPnZnYV9mb250MCk7CisJCXZmcmVlKHNhdmVkLT52Z2FfZm9udDEpOworCQl2ZnJlZShzYXZlZC0+dmdhX3RleHQpOworCQl2ZnJlZShzYXZlZC0+dmdhX2NtYXApOworCQl2ZnJlZShzYXZlZC0+YXR0cik7CiAJCWtmcmVlKHNhdmVkKTsKIAkJc3RhdGUtPnZpZHN0YXRlID0gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3cxMDBmYi5jIGIvZHJpdmVycy92aWRlby93MTAwZmIuYwppbmRleCBhZGNkYTY5Li4wMDMwYzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3cxMDBmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdzEwMGZiLmMKQEAgLTUsOSArNSwxNSBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiwgQVRJIENvcnAuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBSaWNoYXJkIFB1cmRpZQorICogQ29weXJpZ2h0IChjKSAyMDA1IElhbiBNb2x0b24KICAqCiAgKiBSZXdyaXR0ZW4gZm9yIDIuNiBieSBSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBycHN5cy5uZXQ+CiAgKgorICogR2VuZXJpYyBwbGF0Zm9ybSBzdXBwb3J0IGJ5IElhbiBNb2x0b24gPHNweXJvQGYycy5jb20+CisgKiBhbmQgUmljaGFyZCBQdXJkaWUgPHJwdXJkaWVAcnBzeXMubmV0PgorICoKKyAqIHczMnh4IHN1cHBvcnQgYnkgSWFuIE1vbHRvbgorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCkBAIC0yMSw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8dmlkZW8vdzEwMGZiLmg+CkBAIC0zMCwxMTQgKzM2LDc4IEBACiAvKgogICogUHJvdG90eXBlcwogICovCi1zdGF0aWMgdm9pZCB3MTAwZmJfc2F2ZV9idWZmZXIodm9pZCk7Ci1zdGF0aWMgdm9pZCB3MTAwZmJfY2xlYXJfYnVmZmVyKHZvaWQpOwotc3RhdGljIHZvaWQgdzEwMGZiX3Jlc3RvcmVfYnVmZmVyKHZvaWQpOwotc3RhdGljIHZvaWQgdzEwMGZiX2NsZWFyX3NjcmVlbih1MzIgbW9kZSwgbG9uZyBpbnQgb2Zmc2V0KTsKLXN0YXRpYyB2b2lkIHcxMDBfcmVzdW1lKHZvaWQpOwogc3RhdGljIHZvaWQgdzEwMF9zdXNwZW5kKHUzMiBtb2RlKTsKLXN0YXRpYyB2b2lkIHcxMDBfaW5pdF9xdmdhX3JvdGF0aW9uKHUxNiBkZWcpOwotc3RhdGljIHZvaWQgdzEwMF9pbml0X3ZnYV9yb3RhdGlvbih1MTYgZGVnKTsKIHN0YXRpYyB2b2lkIHcxMDBfdnN5bmModm9pZCk7Ci1zdGF0aWMgdm9pZCB3MTAwX2luaXRfc2hhcnBfbGNkKHUzMiBtb2RlKTsKLXN0YXRpYyB2b2lkIHcxMDBfcHdtX3NldHVwKHZvaWQpOwotc3RhdGljIHZvaWQgdzEwMF9Jbml0RXh0TWVtKHUzMiBtb2RlKTsKLXN0YXRpYyB2b2lkIHcxMDBfaHdfaW5pdCh2b2lkKTsKLXN0YXRpYyB1MTYgdzEwMF9zZXRfZmFzdHN5c2Nsayh1MTYgRnJlcSk7Ci0KLXN0YXRpYyB2b2lkIGxjZHRnX2h3X2luaXQodTMyIG1vZGUpOwotc3RhdGljIHZvaWQgbGNkdGdfbGNkX2NoYW5nZSh1MzIgbW9kZSk7Ci1zdGF0aWMgdm9pZCBsY2R0Z19yZXN1bWUodm9pZCk7Ci1zdGF0aWMgdm9pZCBsY2R0Z19zdXNwZW5kKHZvaWQpOwotCi0KLS8qIFJlZ2lzdGVyIG9mZnNldHMgJiBsZW5ndGhzICovCi0jZGVmaW5lIFJFTUFQUEVEX0ZCX0xFTiAgIDB4MTVmZmZmCi0KLSNkZWZpbmUgQklUU19QRVJfUElYRUwgICAgMTYKK3N0YXRpYyB2b2lkIHcxMDBfaHdfaW5pdChzdHJ1Y3QgdzEwMGZiX3BhciopOworc3RhdGljIHZvaWQgdzEwMF9wd21fc2V0dXAoc3RydWN0IHcxMDBmYl9wYXIqKTsKK3N0YXRpYyB2b2lkIHcxMDBfaW5pdF9jbG9ja3Moc3RydWN0IHcxMDBmYl9wYXIqKTsKK3N0YXRpYyB2b2lkIHcxMDBfc2V0dXBfbWVtb3J5KHN0cnVjdCB3MTAwZmJfcGFyKik7CitzdGF0aWMgdm9pZCB3MTAwX2luaXRfbGNkKHN0cnVjdCB3MTAwZmJfcGFyKik7CitzdGF0aWMgdm9pZCB3MTAwX3NldF9kaXNwcmVncyhzdHJ1Y3QgdzEwMGZiX3BhciopOworc3RhdGljIHZvaWQgdzEwMF91cGRhdGVfZW5hYmxlKHZvaWQpOworc3RhdGljIHZvaWQgdzEwMF91cGRhdGVfZGlzYWJsZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGNhbGNfaHN5bmMoc3RydWN0IHcxMDBmYl9wYXIgKnBhcik7CitzdHJ1Y3QgdzEwMF9wbGxfaW5mbyAqdzEwMF9nZXRfeHRhbF90YWJsZSh1bnNpZ25lZCBpbnQgZnJlcSk7CiAKIC8qIFBzZXVkbyBwYWxldHRlIHNpemUgKi8KICNkZWZpbmUgTUFYX1BBTEVUVEVTICAgICAgMTYKIAotLyogZm9yIHJlc29sdXRpb24gY2hhbmdlICovCi0jZGVmaW5lIExDRF9NT0RFX0lOSVQgKC0xKQotI2RlZmluZSBMQ0RfTU9ERV80ODAgICAgMAotI2RlZmluZSBMQ0RfTU9ERV8zMjAgICAgMQotI2RlZmluZSBMQ0RfTU9ERV8yNDAgICAgMgotI2RlZmluZSBMQ0RfTU9ERV82NDAgICAgMwotCi0jZGVmaW5lIExDRF9TSEFSUF9RVkdBIDAKLSNkZWZpbmUgTENEX1NIQVJQX1ZHQSAgMQotCi0jZGVmaW5lIExDRF9NT0RFX1BPUlRSQUlUCTAKLSNkZWZpbmUgTENEX01PREVfTEFORFNDQVBFCTEKLQogI2RlZmluZSBXMTAwX1NVU1BFTkRfRVhUTUVNIDAKICNkZWZpbmUgVzEwMF9TVVNQRU5EX0FMTCAgICAxCiAKLS8qIEdlbmVyYWwgZnJhbWUgYnVmZmVyIGRhdGEgc3RydWN0dXJlcyAqLwotc3RydWN0IHcxMDBmYl9wYXIgewotCXUzMiB4cmVzOwotCXUzMiB5cmVzOwotCWludCBmYXN0c3lzY2xrX21vZGU7Ci0JaW50IGxjZE1vZGU7Ci0JaW50IHJvdGF0aW9uX2ZsYWc7Ci0JaW50IGJsYW5raW5nX2ZsYWc7Ci0JaW50IGNvbWFkajsKLQlpbnQgcGhhZGFkajsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdzEwMGZiX3BhciAqY3VycmVudF9wYXI7CisjZGVmaW5lIEJJVFNfUEVSX1BJWEVMICAgIDE2CiAKIC8qIFJlbWFwcGVkIGFkZHJlc3NlcyBmb3IgYmFzZSBjZmcsIG1lbW1hcHBlZCByZWdzIGFuZCB0aGUgZnJhbWUgYnVmZmVyIGl0c2VsZiAqLwogc3RhdGljIHZvaWQgKnJlbWFwcGVkX2Jhc2U7CiBzdGF0aWMgdm9pZCAqcmVtYXBwZWRfcmVnczsKIHN0YXRpYyB2b2lkICpyZW1hcHBlZF9mYnVmOwogCi0vKiBFeHRlcm5hbCBGdW5jdGlvbiAqLwotc3RhdGljIHZvaWQoKncxMDBmYl9zc3Bfc2VuZCkodTggYWRycywgdTggZGF0YSk7CisjZGVmaW5lIFJFTUFQUEVEX0ZCX0xFTiAgIDB4MTVmZmZmCisKKy8qIFRoaXMgaXMgdGhlIG9mZnNldCBpbiB0aGUgdzEwMCdzIGFkZHJlc3Mgc3BhY2Ugd2UgbWFwIHRoZSBjdXJyZW50CisgICBmcmFtZWJ1ZmZlciBtZW1vcnkgdG8uIFdlIHVzZSB0aGUgcG9zaXRpb24gb2YgZXh0ZXJuYWwgbWVtb3J5IGFzCisgICB3ZSBjYW4gcmVtYXAgaW50ZXJuYWwgbWVtb3J5IHRvIHRoZXJlIGlmIGV4dGVybmFsIGlzbid0IHByZXNlbnQuICovCisjZGVmaW5lIFcxMDBfRkJfQkFTRSBNRU1fRVhUX0JBU0VfVkFMVUUKKwogCiAvKgogICogU3lzZnMgZnVuY3Rpb25zCiAgKi8KLQotc3RhdGljIHNzaXplX3Qgcm90YXRpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBmbGlwX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHcxMDBmYl9wYXIgKnBhcj1pbmZvLT5wYXI7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIixwYXItPnJvdGF0aW9uX2ZsYWcpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLHBhci0+ZmxpcCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHJvdGF0aW9uX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgZmxpcF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQl1bnNpZ25lZCBpbnQgcm90YXRlOworCXVuc2lnbmVkIGludCBmbGlwOwogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHcxMDBmYl9wYXIgKnBhcj1pbmZvLT5wYXI7CiAKLQlyb3RhdGUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlmbGlwID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAKLQlpZiAocm90YXRlID4gMCkgcGFyLT5yb3RhdGlvbl9mbGFnID0gMTsKLQllbHNlIHBhci0+cm90YXRpb25fZmxhZyA9IDA7CisJaWYgKGZsaXAgPiAwKQorCQlwYXItPmZsaXAgPSAxOworCWVsc2UKKwkJcGFyLT5mbGlwID0gMDsKIAotCWlmIChwYXItPmxjZE1vZGUgPT0gTENEX01PREVfMzIwKQotCQl3MTAwX2luaXRfcXZnYV9yb3RhdGlvbihwYXItPnJvdGF0aW9uX2ZsYWcgPyAyNzAgOiA5MCk7Ci0JZWxzZSBpZiAocGFyLT5sY2RNb2RlID09IExDRF9NT0RFXzI0MCkKLQkJdzEwMF9pbml0X3F2Z2Ffcm90YXRpb24ocGFyLT5yb3RhdGlvbl9mbGFnID8gMTgwIDogMCk7Ci0JZWxzZSBpZiAocGFyLT5sY2RNb2RlID09IExDRF9NT0RFXzY0MCkKLQkJdzEwMF9pbml0X3ZnYV9yb3RhdGlvbihwYXItPnJvdGF0aW9uX2ZsYWcgPyAyNzAgOiA5MCk7Ci0JZWxzZSBpZiAocGFyLT5sY2RNb2RlID09IExDRF9NT0RFXzQ4MCkKLQkJdzEwMF9pbml0X3ZnYV9yb3RhdGlvbihwYXItPnJvdGF0aW9uX2ZsYWcgPyAxODAgOiAwKTsKKwl3MTAwX3VwZGF0ZV9kaXNhYmxlKCk7CisJdzEwMF9zZXRfZGlzcHJlZ3MocGFyKTsKKwl3MTAwX3VwZGF0ZV9lbmFibGUoKTsKKworCWNhbGNfaHN5bmMocGFyKTsKIAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKHJvdGF0aW9uLCAwNjQ0LCByb3RhdGlvbl9zaG93LCByb3RhdGlvbl9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmxpcCwgMDY0NCwgZmxpcF9zaG93LCBmbGlwX3N0b3JlKTsKIAogc3RhdGljIHNzaXplX3QgdzEwMGZiX3JlZ19yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXVuc2lnbmVkIGxvbmcgcGFyYW07Ci0JdW5zaWduZWQgbG9uZyByZWdzOworCXVuc2lnbmVkIGxvbmcgcmVncywgcGFyYW07CiAJcmVncyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOwogCXBhcmFtID0gcmVhZGwocmVtYXBwZWRfcmVncyArIHJlZ3MpOwogCXByaW50aygiUmVhZCBSZWdpc3RlciAweCUwOGxYOiAweCUwOGxYXG4iLCByZWdzLCBwYXJhbSk7CkBAIC0xNDgsOCArMTE4LDcgQEAKIAogc3RhdGljIHNzaXplX3QgdzEwMGZiX3JlZ193cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQl1bnNpZ25lZCBsb25nIHJlZ3M7Ci0JdW5zaWduZWQgbG9uZyBwYXJhbTsKKwl1bnNpZ25lZCBsb25nIHJlZ3MsIHBhcmFtOwogCXNzY2FuZihidWYsICIlbHggJWx4IiwgJnJlZ3MsICZwYXJhbSk7CiAKIAlpZiAocmVncyA8PSAweDIwMDApIHsKQEAgLTE2Myw1NCArMTMyLDU2IEBACiBzdGF0aWMgREVWSUNFX0FUVFIocmVnX3dyaXRlLCAwMjAwLCBOVUxMLCB3MTAwZmJfcmVnX3dyaXRlKTsKIAogCi1zdGF0aWMgc3NpemVfdCBmYXN0c3lzY2xrX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgZmFzdHBsbGNsa19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB3MTAwZmJfcGFyICpwYXI9aW5mby0+cGFyOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIscGFyLT5mYXN0c3lzY2xrX21vZGUpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLHBhci0+ZmFzdHBsbF9tb2RlKTsKIH0KIAotc3RhdGljIHNzaXplX3QgZmFzdHN5c2Nsa19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGZhc3RwbGxjbGtfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JaW50IHBhcmFtOwogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHcxMDBmYl9wYXIgKnBhcj1pbmZvLT5wYXI7CiAKLQlwYXJhbSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwotCi0JaWYgKHBhcmFtID09IDc1KSB7Ci0JCXByaW50aygiU2V0IGZhc3RzeXNjbGsgJWRcbiIsIHBhcmFtKTsKLQkJcGFyLT5mYXN0c3lzY2xrX21vZGUgPSBwYXJhbTsKLQkJdzEwMF9zZXRfZmFzdHN5c2NsayhwYXItPmZhc3RzeXNjbGtfbW9kZSk7Ci0JfSBlbHNlIGlmIChwYXJhbSA9PSAxMDApIHsKLQkJcHJpbnRrKCJTZXQgZmFzdHN5c2NsayAlZFxuIiwgcGFyYW0pOwotCQlwYXItPmZhc3RzeXNjbGtfbW9kZSA9IHBhcmFtOwotCQl3MTAwX3NldF9mYXN0c3lzY2xrKHBhci0+ZmFzdHN5c2Nsa19tb2RlKTsKKwlpZiAoc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgPiAwKSB7CisJCXBhci0+ZmFzdHBsbF9tb2RlPTE7CisJCXByaW50aygidzEwMGZiOiBVc2luZyBmYXN0IHN5c3RlbSBjbG9jayAoaWYgcG9zc2libGUpXG4iKTsKKwl9IGVsc2UgeworCQlwYXItPmZhc3RwbGxfbW9kZT0wOworCQlwcmludGsoIncxMDBmYjogVXNpbmcgbm9ybWFsIHN5c3RlbSBjbG9ja1xuIik7CiAJfQorCisJdzEwMF9pbml0X2Nsb2NrcyhwYXIpOworCWNhbGNfaHN5bmMocGFyKTsKKwogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGZhc3RzeXNjbGssIDA2NDQsIGZhc3RzeXNjbGtfc2hvdywgZmFzdHN5c2Nsa19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFzdHBsbGNsaywgMDY0NCwgZmFzdHBsbGNsa19zaG93LCBmYXN0cGxsY2xrX3N0b3JlKTsKIAogLyoKLSAqIFRoZSB0b3VjaHNjcmVlbiBvbiB0aGlzIGRldmljZSBuZWVkcyBjZXJ0YWluIGluZm9ybWF0aW9uCi0gKiBmcm9tIHRoZSB2aWRlbyBkcml2ZXIgdG8gZnVuY3Rpb24gY29ycmVjdGx5LiBXZSBleHBvcnQgaXQgaGVyZS4KKyAqIFNvbWUgdG91Y2hzY3JlZW5zIG5lZWQgaHN5bmMgaW5mb3JtYXRpb24gZnJvbSB0aGUgdmlkZW8gZHJpdmVyIHRvCisgKiBmdW5jdGlvbiBjb3JyZWN0bHkuIFdlIGV4cG9ydCBpdCBoZXJlLgogICovCi1pbnQgdzEwMGZiX2dldF94cmVzKHZvaWQpIHsKLQlyZXR1cm4gY3VycmVudF9wYXItPnhyZXM7Ci19Cit1bnNpZ25lZCBsb25nIHcxMDBmYl9nZXRfaHN5bmNsZW4oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHcxMDBmYl9wYXIgKnBhcj1pbmZvLT5wYXI7CiAKLWludCB3MTAwZmJfZ2V0X2JsYW5raW5nKHZvaWQpIHsKLQlyZXR1cm4gY3VycmVudF9wYXItPmJsYW5raW5nX2ZsYWc7CisJLyogSWYgZGlzcGxheSBpcyBibGFua2VkL3N1c3BlbmRlZCwgaHN5bmMgaXNuJ3QgYWN0aXZlICovCisJaWYgKHBhci0+YmxhbmtlZCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gcGFyLT5oc3luY19sZW47CiB9CitFWFBPUlRfU1lNQk9MKHcxMDBmYl9nZXRfaHN5bmNsZW4pOwogCi1pbnQgdzEwMGZiX2dldF9mYXN0c3lzY2xrKHZvaWQpIHsKLQlyZXR1cm4gY3VycmVudF9wYXItPmZhc3RzeXNjbGtfbW9kZTsKK3N0YXRpYyB2b2lkIHcxMDBmYl9jbGVhcl9zY3JlZW4oc3RydWN0IHcxMDBmYl9wYXIgKnBhcikKK3sKKwltZW1zZXRfaW8ocmVtYXBwZWRfZmJ1ZiArIChXMTAwX0ZCX0JBU0UtTUVNX1dJTkRPV19CQVNFKSwgMCwgKHBhci0+eHJlcyAqIHBhci0+eXJlcyAqIEJJVFNfUEVSX1BJWEVMLzgpKTsKIH0KLUVYUE9SVF9TWU1CT0wodzEwMGZiX2dldF94cmVzKTsKLUVYUE9SVF9TWU1CT0wodzEwMGZiX2dldF9ibGFua2luZyk7Ci1FWFBPUlRfU1lNQk9MKHcxMDBmYl9nZXRfZmFzdHN5c2Nsayk7CiAKIAogLyoKQEAgLTIzNCw3ICsyMDUsNiBAQAogCSAqIGFjY29yZGluZyB0byB0aGUgUkdCIGJpdGZpZWxkIGluZm9ybWF0aW9uLgogCSAqLwogCWlmIChyZWdubyA8IE1BWF9QQUxFVFRFUykgewotCiAJCXUzMiAqcGFsID0gaW5mby0+cHNldWRvX3BhbGV0dGU7CiAKIAkJdmFsID0gKHJlZCAmIDB4ZjgwMCkgfCAoKGdyZWVuICYgMHhmYzAwKSA+PiA1KSB8ICgoYmx1ZSAmIDB4ZjgwMCkgPj4gMTEpOwpAQCAtMjUwLDExNSArMjIwLDkwIEBACiAgKi8KIHN0YXRpYyBpbnQgdzEwMGZiX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgdzEwMGZiX3BhciAqcGFyOwotCXBhcj1pbmZvLT5wYXI7CisJc3RydWN0IHcxMDBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgdzEwMF90Z19pbmZvICp0ZyA9IHBhci0+bWFjaC0+dGc7CiAKIAlzd2l0Y2goYmxhbmtfbW9kZSkgewogCi0gCWNhc2UgRkJfQkxBTktfTk9STUFMOiAvKiBOb3JtYWwgYmxhbmtpbmcgKi8KLQljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6IC8qIFZFU0EgYmxhbmsgKHZzeW5jIG9mZikgKi8KLQljYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6IC8qIFZFU0EgYmxhbmsgKGhzeW5jIG9mZikgKi8KLSAJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046IC8qIFBvd2Vyb2ZmICovCi0gIAkJaWYgKHBhci0+YmxhbmtpbmdfZmxhZyA9PSAwKSB7Ci0JCQl3MTAwZmJfc2F2ZV9idWZmZXIoKTsKLQkJCWxjZHRnX3N1c3BlbmQoKTsKLQkJCXBhci0+YmxhbmtpbmdfZmxhZyA9IDE7CisgCWNhc2UgRkJfQkxBTktfTk9STUFMOiAgICAgICAgIC8qIE5vcm1hbCBibGFua2luZyAqLworCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDogIC8qIFZFU0EgYmxhbmsgKHZzeW5jIG9mZikgKi8KKwljYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6ICAvKiBWRVNBIGJsYW5rIChoc3luYyBvZmYpICovCisgCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOiAgICAgIC8qIFBvd2Vyb2ZmICovCisgIAkJaWYgKHBhci0+YmxhbmtlZCA9PSAwKSB7CisJCQlpZih0ZyAmJiB0Zy0+c3VzcGVuZCkKKwkJCQl0Zy0+c3VzcGVuZChwYXIpOworCQkJcGFyLT5ibGFua2VkID0gMTsKICAgCQl9CiAgIAkJYnJlYWs7CiAKICAJY2FzZSBGQl9CTEFOS19VTkJMQU5LOiAvKiBVbmJsYW5raW5nICovCi0gIAkJaWYgKHBhci0+YmxhbmtpbmdfZmxhZyAhPSAwKSB7Ci0JCQl3MTAwZmJfcmVzdG9yZV9idWZmZXIoKTsKLQkJCWxjZHRnX3Jlc3VtZSgpOwotCQkJcGFyLT5ibGFua2luZ19mbGFnID0gMDsKKyAgCQlpZiAocGFyLT5ibGFua2VkICE9IDApIHsKKwkJCWlmKHRnICYmIHRnLT5yZXN1bWUpCisJCQkJdGctPnJlc3VtZShwYXIpOworCQkJcGFyLT5ibGFua2VkID0gMDsKICAgCQl9CiAgIAkJYnJlYWs7CiAgCX0KIAlyZXR1cm4gMDsKIH0KIAorCiAvKgogICogIENoYW5nZSB0aGUgcmVzb2x1dGlvbiBieSBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZSBoYXJkd2FyZSBmdW5jdGlvbnMKICAqLwotc3RhdGljIHZvaWQgdzEwMGZiX2NoYW5nZXJlcyhpbnQgcm90YXRlX21vZGUsIHUzMiBtb2RlKQorc3RhdGljIHZvaWQgdzEwMGZiX2FjdGl2YXRlX3ZhcihzdHJ1Y3QgdzEwMGZiX3BhciAqcGFyKQogewotCXUxNiByb3RhdGlvbj0wOworCXN0cnVjdCB3MTAwX3RnX2luZm8gKnRnID0gcGFyLT5tYWNoLT50ZzsKIAotCXN3aXRjaChyb3RhdGVfbW9kZSkgewotCWNhc2UgTENEX01PREVfTEFORFNDQVBFOgotCQlyb3RhdGlvbj0oY3VycmVudF9wYXItPnJvdGF0aW9uX2ZsYWcgPyAyNzAgOiA5MCk7Ci0JCWJyZWFrOwotCWNhc2UgTENEX01PREVfUE9SVFJBSVQ6Ci0JCXJvdGF0aW9uPShjdXJyZW50X3Bhci0+cm90YXRpb25fZmxhZyA/IDE4MCA6IDApOwotCQlicmVhazsKLQl9CisJdzEwMF9wd21fc2V0dXAocGFyKTsKKwl3MTAwX3NldHVwX21lbW9yeShwYXIpOworCXcxMDBfaW5pdF9jbG9ja3MocGFyKTsKKwl3MTAwZmJfY2xlYXJfc2NyZWVuKHBhcik7CisJdzEwMF92c3luYygpOwogCi0JdzEwMF9wd21fc2V0dXAoKTsKLQlzd2l0Y2gobW9kZSkgewotCWNhc2UgTENEX1NIQVJQX1FWR0E6Ci0JCXcxMDBfdnN5bmMoKTsKLQkJdzEwMF9zdXNwZW5kKFcxMDBfU1VTUEVORF9FWFRNRU0pOwotCQl3MTAwX2luaXRfc2hhcnBfbGNkKExDRF9TSEFSUF9RVkdBKTsKLQkJdzEwMF9pbml0X3F2Z2Ffcm90YXRpb24ocm90YXRpb24pOwotCQl3MTAwX0luaXRFeHRNZW0oTENEX1NIQVJQX1FWR0EpOwotCQl3MTAwZmJfY2xlYXJfc2NyZWVuKExDRF9TSEFSUF9RVkdBLCAwKTsKLQkJbGNkdGdfbGNkX2NoYW5nZShMQ0RfU0hBUlBfUVZHQSk7Ci0JCWJyZWFrOwotCWNhc2UgTENEX1NIQVJQX1ZHQToKLQkJdzEwMGZiX2NsZWFyX3NjcmVlbihMQ0RfU0hBUlBfUVZHQSwgMCk7Ci0JCXdyaXRlbCgweEJGRkZBMDAwLCByZW1hcHBlZF9yZWdzICsgbW1NQ19FWFRfTUVNX0xPQ0FUSU9OKTsKLQkJdzEwMF9Jbml0RXh0TWVtKExDRF9TSEFSUF9WR0EpOwotCQl3MTAwZmJfY2xlYXJfc2NyZWVuKExDRF9TSEFSUF9WR0EsIDB4MjAwMDAwKTsKLQkJdzEwMF92c3luYygpOwotCQl3MTAwX2luaXRfc2hhcnBfbGNkKExDRF9TSEFSUF9WR0EpOwotCQlpZiAocm90YXRpb24gIT0gMCkKLQkJCXcxMDBfaW5pdF92Z2Ffcm90YXRpb24ocm90YXRpb24pOwotCQlsY2R0Z19sY2RfY2hhbmdlKExDRF9TSEFSUF9WR0EpOwotCQlicmVhazsKLQl9CisJdzEwMF91cGRhdGVfZGlzYWJsZSgpOworCXcxMDBfaW5pdF9sY2QocGFyKTsKKwl3MTAwX3NldF9kaXNwcmVncyhwYXIpOworCXcxMDBfdXBkYXRlX2VuYWJsZSgpOworCisJY2FsY19oc3luYyhwYXIpOworCisJaWYgKCFwYXItPmJsYW5rZWQgJiYgdGcgJiYgdGctPmNoYW5nZSkKKwkJdGctPmNoYW5nZShwYXIpOwogfQogCi0vKgotICogU2V0IHVwIHRoZSBkaXNwbGF5IGZvciB0aGUgZmIgc3Vic3lzdGVtCisKKy8qIFNlbGVjdCB0aGUgc21hbGxlc3QgbW9kZSB0aGF0IGFsbG93cyB0aGUgZGVzaXJlZCByZXNvbHV0aW9uIHRvIGJlCisgKiBkaXNwbGF5ZWQuIElmIGRlc2lyZWQsIHRoZSB4IGFuZCB5IHBhcmFtZXRlcnMgY2FuIGJlIHJvdW5kZWQgdXAgdG8KKyAqIG1hdGNoIHRoZSBzZWxlY3RlZCBtb2RlLgogICovCi1zdGF0aWMgdm9pZCB3MTAwZmJfYWN0aXZhdGVfdmFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIHN0cnVjdCB3MTAwX21vZGUgKncxMDBmYl9nZXRfbW9kZShzdHJ1Y3QgdzEwMGZiX3BhciAqcGFyLCB1bnNpZ25lZCBpbnQgKngsIHVuc2lnbmVkIGludCAqeSwgaW50IHNhdmV2YWwpCiB7Ci0JdTMyIHRlbXAzMjsKLQlzdHJ1Y3QgdzEwMGZiX3BhciAqcGFyPWluZm8tPnBhcjsKLQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZpbmZvLT52YXI7CisJc3RydWN0IHcxMDBfbW9kZSAqbW9kZSA9IE5VTEw7CisJc3RydWN0IHcxMDBfbW9kZSAqbW9kZWxpc3QgPSBwYXItPm1hY2gtPm1vZGVsaXN0OworCXVuc2lnbmVkIGludCBiZXN0X3ggPSAweGZmZmZmZmZmLCBiZXN0X3kgPSAweGZmZmZmZmZmOworCXVuc2lnbmVkIGludCBpOwogCi0JLyogU2V0IHRoZSBoYXJkd2FyZSB0byA1NjUgKi8KLQl0ZW1wMzIgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1ESVNQX0RFQlVHMik7Ci0JdGVtcDMyICY9IDB4ZmY3ZmZmZmY7Ci0JdGVtcDMyIHw9IDB4MDA4MDAwMDA7Ci0Jd3JpdGVsKHRlbXAzMiwgcmVtYXBwZWRfcmVncyArIG1tRElTUF9ERUJVRzIpOworCWZvciAoaSA9IDAgOyBpIDwgcGFyLT5tYWNoLT5udW1fbW9kZXMgOyBpKyspIHsKKwkJaWYgKG1vZGVsaXN0W2ldLnhyZXMgPj0gKnggJiYgbW9kZWxpc3RbaV0ueXJlcyA+PSAqeSAmJgorCQkJCW1vZGVsaXN0W2ldLnhyZXMgPCBiZXN0X3ggJiYgbW9kZWxpc3RbaV0ueXJlcyA8IGJlc3RfeSkgeworCQkJYmVzdF94ID0gbW9kZWxpc3RbaV0ueHJlczsKKwkJCWJlc3RfeSA9IG1vZGVsaXN0W2ldLnlyZXM7CisJCQltb2RlID0gJm1vZGVsaXN0W2ldOworCQl9IGVsc2UgaWYobW9kZWxpc3RbaV0ueHJlcyA+PSAqeSAmJiBtb2RlbGlzdFtpXS55cmVzID49ICp4ICYmCisJCSAgICAgICAgbW9kZWxpc3RbaV0ueHJlcyA8IGJlc3RfeSAmJiBtb2RlbGlzdFtpXS55cmVzIDwgYmVzdF94KSB7CisJCQliZXN0X3ggPSBtb2RlbGlzdFtpXS55cmVzOworCQkJYmVzdF95ID0gbW9kZWxpc3RbaV0ueHJlczsKKwkJCW1vZGUgPSAmbW9kZWxpc3RbaV07CisJCX0KKwl9CiAKLQlpZiAocGFyLT5sY2RNb2RlID09IExDRF9NT0RFX0lOSVQpIHsKLQkJdzEwMF9pbml0X3NoYXJwX2xjZChMQ0RfU0hBUlBfVkdBKTsKLQkJdzEwMF9pbml0X3ZnYV9yb3RhdGlvbihwYXItPnJvdGF0aW9uX2ZsYWcgPyAyNzAgOiA5MCk7Ci0JCXBhci0+bGNkTW9kZSA9IExDRF9NT0RFXzY0MDsKLQkJbGNkdGdfaHdfaW5pdChMQ0RfU0hBUlBfVkdBKTsKLQl9IGVsc2UgaWYgKHZhci0+eHJlcyA9PSAzMjAgJiYgdmFyLT55cmVzID09IDI0MCkgewotCQlpZiAocGFyLT5sY2RNb2RlICE9IExDRF9NT0RFXzMyMCkgewotCQkJdzEwMGZiX2NoYW5nZXJlcyhMQ0RfTU9ERV9MQU5EU0NBUEUsIExDRF9TSEFSUF9RVkdBKTsKLQkJCXBhci0+bGNkTW9kZSA9IExDRF9NT0RFXzMyMDsKLQkJfQotCX0gZWxzZSBpZiAodmFyLT54cmVzID09IDI0MCAmJiB2YXItPnlyZXMgPT0gMzIwKSB7Ci0JCWlmIChwYXItPmxjZE1vZGUgIT0gTENEX01PREVfMjQwKSB7Ci0JCQl3MTAwZmJfY2hhbmdlcmVzKExDRF9NT0RFX1BPUlRSQUlULCBMQ0RfU0hBUlBfUVZHQSk7Ci0JCQlwYXItPmxjZE1vZGUgPSBMQ0RfTU9ERV8yNDA7Ci0JCX0KLQl9IGVsc2UgaWYgKHZhci0+eHJlcyA9PSA2NDAgJiYgdmFyLT55cmVzID09IDQ4MCkgewotCQlpZiAocGFyLT5sY2RNb2RlICE9IExDRF9NT0RFXzY0MCkgewotCQkJdzEwMGZiX2NoYW5nZXJlcyhMQ0RfTU9ERV9MQU5EU0NBUEUsIExDRF9TSEFSUF9WR0EpOwotCQkJcGFyLT5sY2RNb2RlID0gTENEX01PREVfNjQwOwotCQl9Ci0JfSBlbHNlIGlmICh2YXItPnhyZXMgPT0gNDgwICYmIHZhci0+eXJlcyA9PSA2NDApIHsKLQkJaWYgKHBhci0+bGNkTW9kZSAhPSBMQ0RfTU9ERV80ODApIHsKLQkJCXcxMDBmYl9jaGFuZ2VyZXMoTENEX01PREVfUE9SVFJBSVQsIExDRF9TSEFSUF9WR0EpOwotCQkJcGFyLT5sY2RNb2RlID0gTENEX01PREVfNDgwOwotCQl9Ci0JfSBlbHNlIHByaW50ayhLRVJOX0VSUiAiVzEwMEZCOiBSZXNvbHV0aW9uIGVycm9yIVxuIik7CisJaWYgKG1vZGUgJiYgc2F2ZXZhbCkgeworCQkqeCA9IGJlc3RfeDsKKwkJKnkgPSBiZXN0X3k7CisJfQorCisJcmV0dXJuIG1vZGU7CiB9CiAKIApAQCAtMzY2LDMxICszMTEsMTkgQEAKICAqICB3MTAwZmJfY2hlY2tfdmFyKCk6CiAgKiAgR2V0IHRoZSB2aWRlbyBwYXJhbXMgb3V0IG9mICd2YXInLiBJZiBhIHZhbHVlIGRvZXNuJ3QgZml0LCByb3VuZCBpdCB1cCwKICAqICBpZiBpdCdzIHRvbyBiaWcsIHJldHVybiAtRUlOVkFMLgotICoKICAqLwogc3RhdGljIGludCB3MTAwZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlpZiAodmFyLT54cmVzIDwgdmFyLT55cmVzKSB7IC8qIFBvcnRyYWl0IG1vZGUgKi8KLQkJaWYgKCh2YXItPnhyZXMgPiA0ODApIHx8ICh2YXItPnlyZXMgPiA2NDApKSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfSBlbHNlIGlmICgodmFyLT54cmVzID4gMjQwKSB8fCAodmFyLT55cmVzID4gMzIwKSkgewotCQkJdmFyLT54cmVzID0gNDgwOwotCQkJdmFyLT55cmVzID0gNjQwOwotCQl9IGVsc2UgewotCQkJdmFyLT54cmVzID0gMjQwOwotCQkJdmFyLT55cmVzID0gMzIwOwotCQl9Ci0JfSBlbHNlIHsgLyogTGFuZHNjYXBlIG1vZGUgKi8KLQkJaWYgKCh2YXItPnhyZXMgPiA2NDApIHx8ICh2YXItPnlyZXMgPiA0ODApKSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfSBlbHNlIGlmICgodmFyLT54cmVzID4gMzIwKSB8fCAodmFyLT55cmVzID4gMjQwKSkgewotCQkJdmFyLT54cmVzID0gNjQwOwotCQkJdmFyLT55cmVzID0gNDgwOwotCQl9IGVsc2UgewotCQkJdmFyLT54cmVzID0gMzIwOwotCQkJdmFyLT55cmVzID0gMjQwOwotCQl9Ci0JfQorCXN0cnVjdCB3MTAwZmJfcGFyICpwYXI9aW5mby0+cGFyOworCisJaWYoIXcxMDBmYl9nZXRfbW9kZShwYXIsICZ2YXItPnhyZXMsICZ2YXItPnlyZXMsIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwYXItPm1hY2gtPm1lbSAmJiAoKHZhci0+eHJlcyp2YXItPnlyZXMqQklUU19QRVJfUElYRUwvOCkgPiAocGFyLT5tYWNoLT5tZW0tPnNpemUrMSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcGFyLT5tYWNoLT5tZW0gJiYgKCh2YXItPnhyZXMqdmFyLT55cmVzKkJJVFNfUEVSX1BJWEVMLzgpID4gKE1FTV9JTlRfU0laRSsxKSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJdmFyLT54cmVzX3ZpcnR1YWwgPSBtYXgodmFyLT54cmVzX3ZpcnR1YWwsIHZhci0+eHJlcyk7CiAJdmFyLT55cmVzX3ZpcnR1YWwgPSBtYXgodmFyLT55cmVzX3ZpcnR1YWwsIHZhci0+eXJlcyk7CkBAIC00MDksMTMgKzM0MiwxMSBAQAogCXZhci0+dHJhbnNwLm9mZnNldCA9IHZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CiAKIAl2YXItPm5vbnN0ZCA9IDA7Ci0KIAl2YXItPmhlaWdodCA9IC0xOwogCXZhci0+d2lkdGggPSAtMTsKIAl2YXItPnZtb2RlID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKLQogCXZhci0+c3luYyA9IDA7Ci0JdmFyLT5waXhjbG9jayA9IDB4MDQ7CS8qIDE3MTUyMTsgKi8KKwl2YXItPnBpeGNsb2NrID0gMHgwNDsgIC8qIDE3MTUyMTsgKi8KIAogCXJldHVybiAwOwogfQpAQCAtNDMwLDI3NCArMzYxLDI4NiBAQAogewogCXN0cnVjdCB3MTAwZmJfcGFyICpwYXI9aW5mby0+cGFyOwogCi0JcGFyLT54cmVzID0gaW5mby0+dmFyLnhyZXM7Ci0JcGFyLT55cmVzID0gaW5mby0+dmFyLnlyZXM7CisJaWYgKHBhci0+eHJlcyAhPSBpbmZvLT52YXIueHJlcyB8fCBwYXItPnlyZXMgIT0gaW5mby0+dmFyLnlyZXMpCXsKKwkJcGFyLT54cmVzID0gaW5mby0+dmFyLnhyZXM7CisJCXBhci0+eXJlcyA9IGluZm8tPnZhci55cmVzOworCQlwYXItPm1vZGUgPSB3MTAwZmJfZ2V0X21vZGUocGFyLCAmcGFyLT54cmVzLCAmcGFyLT55cmVzLCAwKTsKIAotCWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOworCQlpbmZvLT5maXgudmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwkJaW5mby0+Zml4LnlwYW5zdGVwID0gMDsKKwkJaW5mby0+Zml4Lnl3cmFwc3RlcCA9IDA7CisJCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IHBhci0+eHJlcyAqIEJJVFNfUEVSX1BJWEVMIC8gODsKIAotCWluZm8tPmZpeC55cGFuc3RlcCA9IDA7Ci0JaW5mby0+Zml4Lnl3cmFwc3RlcCA9IDA7CisJCWlmICgocGFyLT54cmVzKnBhci0+eXJlcypCSVRTX1BFUl9QSVhFTC84KSA+IChNRU1fSU5UX1NJWkUrMSkpIHsKKwkJCXBhci0+ZXh0bWVtX2FjdGl2ZSA9IDE7CisJCQlpbmZvLT5maXguc21lbV9sZW4gPSBwYXItPm1hY2gtPm1lbS0+c2l6ZSsxOworCQl9IGVsc2UgeworCQkJcGFyLT5leHRtZW1fYWN0aXZlID0gMDsKKwkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IE1FTV9JTlRfU0laRSsxOworCQl9CiAKLQlpZiAocGFyLT5ibGFua2luZ19mbGFnKQotCQl3MTAwZmJfY2xlYXJfYnVmZmVyKCk7Ci0KLQl3MTAwZmJfYWN0aXZhdGVfdmFyKGluZm8pOwotCi0JaWYgKHBhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV80ODApIHsKLQkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gKDQ4MCAqIEJJVFNfUEVSX1BJWEVMKSAvIDg7Ci0JCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4MjAwMDAwOwotCX0gZWxzZSBpZiAocGFyLT5sY2RNb2RlID09IExDRF9NT0RFXzMyMCkgewotCQlpbmZvLT5maXgubGluZV9sZW5ndGggPSAoMzIwICogQklUU19QRVJfUElYRUwpIC8gODsKLQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg2MDAwMDsKLQl9IGVsc2UgaWYgKHBhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV8yNDApIHsKLQkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gKDI0MCAqIEJJVFNfUEVSX1BJWEVMKSAvIDg7Ci0JCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4NjAwMDA7Ci0JfSBlbHNlIGlmIChwYXItPmxjZE1vZGUgPT0gTENEX01PREVfSU5JVCB8fCBwYXItPmxjZE1vZGUgPT0gTENEX01PREVfNjQwKSB7Ci0JCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9ICg2NDAgKiBCSVRTX1BFUl9QSVhFTCkgLyA4OwotCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDIwMDAwMDsKKwkJdzEwMGZiX2FjdGl2YXRlX3ZhcihwYXIpOwogCX0KLQogCXJldHVybiAwOwogfQogCiAKIC8qCi0gKiAgICAgIEZyYW1lIGJ1ZmZlciBvcGVyYXRpb25zCisgKiAgRnJhbWUgYnVmZmVyIG9wZXJhdGlvbnMKICAqLwogc3RhdGljIHN0cnVjdCBmYl9vcHMgdzEwMGZiX29wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3duZXIgICAgICAgID0gVEhJU19NT0RVTEUsCiAJLmZiX2NoZWNrX3ZhciA9IHcxMDBmYl9jaGVja192YXIsCi0JLmZiX3NldF9wYXIgPSB3MTAwZmJfc2V0X3BhciwKKwkuZmJfc2V0X3BhciAgID0gdzEwMGZiX3NldF9wYXIsCiAJLmZiX3NldGNvbHJlZyA9IHcxMDBmYl9zZXRjb2xyZWcsCi0JLmZiX2JsYW5rID0gdzEwMGZiX2JsYW5rLAotCS5mYl9maWxscmVjdCA9IGNmYl9maWxscmVjdCwKLQkuZmJfY29weWFyZWEgPSBjZmJfY29weWFyZWEsCisJLmZiX2JsYW5rICAgICA9IHcxMDBmYl9ibGFuaywKKwkuZmJfZmlsbHJlY3QgID0gY2ZiX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYSAgPSBjZmJfY29weWFyZWEsCiAJLmZiX2ltYWdlYmxpdCA9IGNmYl9pbWFnZWJsaXQsCi0JLmZiX2N1cnNvciA9IHNvZnRfY3Vyc29yLAorCS5mYl9jdXJzb3IgICAgPSBzb2Z0X2N1cnNvciwKIH07CiAKLQotc3RhdGljIHZvaWQgdzEwMGZiX2NsZWFyX3NjcmVlbih1MzIgbW9kZSwgbG9uZyBpbnQgb2Zmc2V0KQotewotCWludCBpLCBudW1QaXggPSAwOwotCi0JaWYgKG1vZGUgPT0gTENEX1NIQVJQX1ZHQSkKLQkJbnVtUGl4ID0gNjQwICogNDgwOwotCWVsc2UgaWYgKG1vZGUgPT0gTENEX1NIQVJQX1FWR0EpCi0JCW51bVBpeCA9IDMyMCAqIDI0MDsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1QaXg7IGkrKykKLQkJd3JpdGV3KDB4ZmZmZiwgcmVtYXBwZWRfZmJ1ZiArIG9mZnNldCArICgyKmkpKTsKLX0KLQotCi0vKiBOZWVkIHRvIHNwbGl0IHVwIHRoZSBidWZmZXJzIHRvIHN0YXkgd2l0aGluIHRoZSBsaW1pdHMgb2Yga21hbGxvYyAqLwotI2RlZmluZSBXMTAwX0JVRl9OVU0JNgotc3RhdGljIHVpbnQzMl90ICpnU2F2ZUltYWdlUHRyW1cxMDBfQlVGX05VTV0gPSB7IE5VTEwgfTsKLQotc3RhdGljIHZvaWQgdzEwMGZiX3NhdmVfYnVmZmVyKHZvaWQpCi17Ci0JaW50IGksIGosIGJ1ZnNpemU7Ci0KLQlidWZzaXplPShjdXJyZW50X3Bhci0+eHJlcyAqIGN1cnJlbnRfcGFyLT55cmVzICogQklUU19QRVJfUElYRUwgLyA4KSAvIFcxMDBfQlVGX05VTTsKLQlmb3IgKGkgPSAwOyBpIDwgVzEwMF9CVUZfTlVNOyBpKyspIHsKLQkJaWYgKGdTYXZlSW1hZ2VQdHJbaV0gPT0gTlVMTCkKLQkJCWdTYXZlSW1hZ2VQdHJbaV0gPSBrbWFsbG9jKGJ1ZnNpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoZ1NhdmVJbWFnZVB0cltpXSA9PSBOVUxMKSB7Ci0JCQl3MTAwZmJfY2xlYXJfYnVmZmVyKCk7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBhbGxvYyBwcmUtb2ZmIGltYWdlIGJ1ZmZlciAlZFxuIiwgaSk7Ci0JCQlicmVhazsKLQkJfQotCQlmb3IgKGogPSAwOyBqIDwgYnVmc2l6ZS80OyBqKyspCi0JCQkqKGdTYXZlSW1hZ2VQdHJbaV0gKyBqKSA9IHJlYWRsKHJlbWFwcGVkX2ZidWYgKyAoYnVmc2l6ZSppKSArIGoqNCk7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIHcxMDBmYl9yZXN0b3JlX2J1ZmZlcih2b2lkKQotewotCWludCBpLCBqLCBidWZzaXplOwotCi0JYnVmc2l6ZT0oY3VycmVudF9wYXItPnhyZXMgKiBjdXJyZW50X3Bhci0+eXJlcyAqIEJJVFNfUEVSX1BJWEVMIC8gOCkgLyBXMTAwX0JVRl9OVU07Ci0JZm9yIChpID0gMDsgaSA8IFcxMDBfQlVGX05VTTsgaSsrKSB7Ci0JCWlmIChnU2F2ZUltYWdlUHRyW2ldID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNhbid0IGZpbmQgcHJlLW9mZiBpbWFnZSBidWZmZXIgJWRcbiIsIGkpOwotCQkJdzEwMGZiX2NsZWFyX2J1ZmZlcigpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChqID0gMDsgaiA8IChidWZzaXplLzQpOyBqKyspCi0JCQl3cml0ZWwoKihnU2F2ZUltYWdlUHRyW2ldICsgaikscmVtYXBwZWRfZmJ1ZiArIChidWZzaXplKmkpICsgKGoqNCkpOwotCQlrZnJlZShnU2F2ZUltYWdlUHRyW2ldKTsKLQkJZ1NhdmVJbWFnZVB0cltpXSA9IE5VTEw7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIHcxMDBmYl9jbGVhcl9idWZmZXIodm9pZCkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgVzEwMF9CVUZfTlVNOyBpKyspIHsKLQkJa2ZyZWUoZ1NhdmVJbWFnZVB0cltpXSk7Ci0JCWdTYXZlSW1hZ2VQdHJbaV0gPSBOVUxMOwotCX0KLX0KLQotCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHcxMDBmYl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCB1MzIgbGV2ZWwpCitzdGF0aWMgdm9pZCB3MTAwZmJfc2F2ZV92aWRtZW0oc3RydWN0IHcxMDBmYl9wYXIgKnBhcikKK3sKKwlpbnQgbWVtc2l6ZTsKKworCWlmIChwYXItPmV4dG1lbV9hY3RpdmUpIHsKKwkJbWVtc2l6ZT1wYXItPm1hY2gtPm1lbS0+c2l6ZTsKKwkJcGFyLT5zYXZlZF9leHRtZW0gPSB2bWFsbG9jKG1lbXNpemUpOworCQlpZiAocGFyLT5zYXZlZF9leHRtZW0pCisJCQltZW1jcHlfZnJvbWlvKHBhci0+c2F2ZWRfZXh0bWVtLCByZW1hcHBlZF9mYnVmICsgKFcxMDBfRkJfQkFTRS1NRU1fV0lORE9XX0JBU0UpLCBtZW1zaXplKTsKKwl9CisJbWVtc2l6ZT1NRU1fSU5UX1NJWkU7CisJcGFyLT5zYXZlZF9pbnRtZW0gPSB2bWFsbG9jKG1lbXNpemUpOworCWlmIChwYXItPnNhdmVkX2ludG1lbSAmJiBwYXItPmV4dG1lbV9hY3RpdmUpCisJCW1lbWNweV9mcm9taW8ocGFyLT5zYXZlZF9pbnRtZW0sIHJlbWFwcGVkX2ZidWYgKyAoVzEwMF9GQl9CQVNFLU1FTV9JTlRfQkFTRV9WQUxVRSksIG1lbXNpemUpOworCWVsc2UgaWYgKHBhci0+c2F2ZWRfaW50bWVtKQorCQltZW1jcHlfZnJvbWlvKHBhci0+c2F2ZWRfaW50bWVtLCByZW1hcHBlZF9mYnVmICsgKFcxMDBfRkJfQkFTRS1NRU1fV0lORE9XX0JBU0UpLCBtZW1zaXplKTsKK30KKworc3RhdGljIHZvaWQgdzEwMGZiX3Jlc3RvcmVfdmlkbWVtKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCit7CisJaW50IG1lbXNpemU7CisKKwlpZiAocGFyLT5leHRtZW1fYWN0aXZlICYmIHBhci0+c2F2ZWRfZXh0bWVtKSB7CisJCW1lbXNpemU9cGFyLT5tYWNoLT5tZW0tPnNpemU7CisJCW1lbWNweV90b2lvKHJlbWFwcGVkX2ZidWYgKyAoVzEwMF9GQl9CQVNFLU1FTV9XSU5ET1dfQkFTRSksIHBhci0+c2F2ZWRfZXh0bWVtLCBtZW1zaXplKTsKKwkJdmZyZWUocGFyLT5zYXZlZF9leHRtZW0pOworCX0KKwlpZiAocGFyLT5zYXZlZF9pbnRtZW0pIHsKKwkJbWVtc2l6ZT1NRU1fSU5UX1NJWkU7CisJCWlmIChwYXItPmV4dG1lbV9hY3RpdmUpCisJCQltZW1jcHlfdG9pbyhyZW1hcHBlZF9mYnVmICsgKFcxMDBfRkJfQkFTRS1NRU1fSU5UX0JBU0VfVkFMVUUpLCBwYXItPnNhdmVkX2ludG1lbSwgbWVtc2l6ZSk7CisJCWVsc2UKKwkJCW1lbWNweV90b2lvKHJlbWFwcGVkX2ZidWYgKyAoVzEwMF9GQl9CQVNFLU1FTV9XSU5ET1dfQkFTRSksIHBhci0+c2F2ZWRfaW50bWVtLCBtZW1zaXplKTsKKwkJdmZyZWUocGFyLT5zYXZlZF9pbnRtZW0pOworCX0KK30KKworc3RhdGljIGludCB3MTAwZmJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdWludDMyX3QgbGV2ZWwpCiB7CiAJaWYgKGxldmVsID09IFNVU1BFTkRfUE9XRVJfRE9XTikgewogCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCQlzdHJ1Y3QgdzEwMGZiX3BhciAqcGFyPWluZm8tPnBhcjsKKwkJc3RydWN0IHcxMDBfdGdfaW5mbyAqdGcgPSBwYXItPm1hY2gtPnRnOwogCi0JCXcxMDBmYl9zYXZlX2J1ZmZlcigpOwotCQlsY2R0Z19zdXNwZW5kKCk7CisJCXcxMDBmYl9zYXZlX3ZpZG1lbShwYXIpOworCQlpZih0ZyAmJiB0Zy0+c3VzcGVuZCkKKwkJCXRnLT5zdXNwZW5kKHBhcik7CiAJCXcxMDBfc3VzcGVuZChXMTAwX1NVU1BFTkRfQUxMKTsKLQkJcGFyLT5ibGFua2luZ19mbGFnID0gMTsKKwkJcGFyLT5ibGFua2VkID0gMTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdzEwMGZiX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3N0YXRpYyBpbnQgdzEwMGZiX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQzMl90IGxldmVsKQogewogCWlmIChsZXZlbCA9PSBSRVNVTUVfUE9XRVJfT04pIHsKIAkJc3RydWN0IGZiX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAkJc3RydWN0IHcxMDBmYl9wYXIgKnBhcj1pbmZvLT5wYXI7CisJCXN0cnVjdCB3MTAwX3RnX2luZm8gKnRnID0gcGFyLT5tYWNoLT50ZzsKIAotCQl3MTAwX3Jlc3VtZSgpOwotCQl3MTAwZmJfcmVzdG9yZV9idWZmZXIoKTsKLQkJbGNkdGdfcmVzdW1lKCk7Ci0JCXBhci0+YmxhbmtpbmdfZmxhZyA9IDA7CisJCXcxMDBfaHdfaW5pdChwYXIpOworCQl3MTAwZmJfYWN0aXZhdGVfdmFyKHBhcik7CisJCXcxMDBmYl9yZXN0b3JlX3ZpZG1lbShwYXIpOworCQlpZih0ZyAmJiB0Zy0+cmVzdW1lKQorCQkJdGctPnJlc3VtZShwYXIpOworCQlwYXItPmJsYW5rZWQgPSAwOwogCX0KIAlyZXR1cm4gMDsKIH0KICNlbHNlCi0jZGVmaW5lIHcxMDBmYl9zdXNwZW5kCU5VTEwKLSNkZWZpbmUgdzEwMGZiX3Jlc3VtZQlOVUxMCisjZGVmaW5lIHcxMDBmYl9zdXNwZW5kICBOVUxMCisjZGVmaW5lIHcxMDBmYl9yZXN1bWUgICBOVUxMCiAjZW5kaWYKIAogCiBpbnQgX19pbml0IHcxMDBmYl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJaW50IGVyciA9IC1FSU87CiAJc3RydWN0IHcxMDBmYl9tYWNoX2luZm8gKmluZjsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IE5VTEw7CiAJc3RydWN0IHcxMDBmYl9wYXIgKnBhcjsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJlc291cmNlICptZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXVuc2lnbmVkIGludCBjaGlwX2lkOwogCiAJaWYgKCFtZW0pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogcmVtYXAgdGhlIGFyZWFzIHdlJ3JlIGdvaW5nIHRvIHVzZSAqLworCS8qIFJlbWFwIHRoZSBjaGlwIGJhc2UgYWRkcmVzcyAqLwogCXJlbWFwcGVkX2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUobWVtLT5zdGFydCtXMTAwX0NGR19CQVNFLCBXMTAwX0NGR19MRU4pOwogCWlmIChyZW1hcHBlZF9iYXNlID09IE5VTEwpCi0JCXJldHVybiAtRUlPOworCQlnb3RvIG91dDsKIAorCS8qIE1hcCB0aGUgcmVnaXN0ZXIgc3BhY2UgKi8KIAlyZW1hcHBlZF9yZWdzID0gaW9yZW1hcF9ub2NhY2hlKG1lbS0+c3RhcnQrVzEwMF9SRUdfQkFTRSwgVzEwMF9SRUdfTEVOKTsKLQlpZiAocmVtYXBwZWRfcmVncyA9PSBOVUxMKSB7Ci0JCWlvdW5tYXAocmVtYXBwZWRfYmFzZSk7Ci0JCXJldHVybiAtRUlPOwotCX0KKwlpZiAocmVtYXBwZWRfcmVncyA9PSBOVUxMKQorCQlnb3RvIG91dDsKIAotCXJlbWFwcGVkX2ZidWYgPSBpb3JlbWFwX25vY2FjaGUobWVtLT5zdGFydCtNRU1fRVhUX0JBU0VfVkFMVUUsIFJFTUFQUEVEX0ZCX0xFTik7Ci0JaWYgKHJlbWFwcGVkX2ZidWYgPT0gTlVMTCkgewotCQlpb3VubWFwKHJlbWFwcGVkX2Jhc2UpOwotCQlpb3VubWFwKHJlbWFwcGVkX3JlZ3MpOwotCQlyZXR1cm4gLUVJTzsKKwkvKiBJZGVudGlmeSB0aGUgY2hpcCAqLworCXByaW50aygiRm91bmQgIik7CisJY2hpcF9pZCA9IHJlYWRsKHJlbWFwcGVkX3JlZ3MgKyBtbUNISVBfSUQpOworCXN3aXRjaChjaGlwX2lkKSB7CisJCWNhc2UgQ0hJUF9JRF9XMTAwOiAgcHJpbnRrKCJ3MTAwIik7ICBicmVhazsKKwkJY2FzZSBDSElQX0lEX1czMjAwOiBwcmludGsoInczMjAwIik7IGJyZWFrOworCQljYXNlIENISVBfSURfVzMyMjA6IHByaW50aygidzMyMjAiKTsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIlVua25vd24gaW1hZ2VvbiBjaGlwIElEXG4iKTsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDsKIAl9CisJcHJpbnRrKCIgYXQgMHglMDhseC5cbiIsIG1lbS0+c3RhcnQrVzEwMF9DRkdfQkFTRSk7CisKKwkvKiBSZW1hcCB0aGUgZnJhbWVidWZmZXIgKi8KKwlyZW1hcHBlZF9mYnVmID0gaW9yZW1hcF9ub2NhY2hlKG1lbS0+c3RhcnQrTUVNX1dJTkRPV19CQVNFLCBNRU1fV0lORE9XX1NJWkUpOworCWlmIChyZW1hcHBlZF9mYnVmID09IE5VTEwpCisJCWdvdG8gb3V0OwogCiAJaW5mbz1mcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IHcxMDBmYl9wYXIpLCBkZXYpOwogCWlmICghaW5mbykgewotCQlpb3VubWFwKHJlbWFwcGVkX2Jhc2UpOwotCQlpb3VubWFwKHJlbWFwcGVkX3JlZ3MpOwotCQlpb3VubWFwKHJlbWFwcGVkX2ZidWYpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CiAJfQogCi0JaW5mby0+ZGV2aWNlPWRldjsKIAlwYXIgPSBpbmZvLT5wYXI7Ci0JY3VycmVudF9wYXI9aW5mby0+cGFyOwogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGluZm8pOwogCiAJaW5mID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwotCXBhci0+cGhhZGFkaiA9IGluZi0+cGhhZGFkajsKLQlwYXItPmNvbWFkaiA9IGluZi0+Y29tYWRqOwotCXBhci0+ZmFzdHN5c2Nsa19tb2RlID0gNzU7Ci0JcGFyLT5sY2RNb2RlID0gTENEX01PREVfSU5JVDsKLQlwYXItPnJvdGF0aW9uX2ZsYWc9MDsKLQlwYXItPmJsYW5raW5nX2ZsYWc9MDsKLQl3MTAwZmJfc3NwX3NlbmQgPSBpbmYtPncxMDBmYl9zc3Bfc2VuZDsKKwlwYXItPmNoaXBfaWQgPSBjaGlwX2lkOworCXBhci0+bWFjaCA9IGluZjsKKwlwYXItPmZhc3RwbGxfbW9kZSA9IDA7CisJcGFyLT5ibGFua2VkID0gMDsKIAotCXcxMDBfaHdfaW5pdCgpOwotCXcxMDBfcHdtX3NldHVwKCk7CisJcGFyLT5wbGxfdGFibGU9dzEwMF9nZXRfeHRhbF90YWJsZShpbmYtPnh0YWxfZnJlcSk7CisJaWYgKCFwYXItPnBsbF90YWJsZSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIG1hdGNoaW5nIFh0YWwgZGVmaW5pdGlvbiBmb3VuZFxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KIAogCWluZm8tPnBzZXVkb19wYWxldHRlID0ga21hbGxvYyhzaXplb2YgKHUzMikgKiBNQVhfUEFMRVRURVMsIEdGUF9LRVJORUwpOwogCWlmICghaW5mby0+cHNldWRvX3BhbGV0dGUpIHsKLQkJaW91bm1hcChyZW1hcHBlZF9iYXNlKTsKLQkJaW91bm1hcChyZW1hcHBlZF9yZWdzKTsKLQkJaW91bm1hcChyZW1hcHBlZF9mYnVmKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OwogCX0KIAogCWluZm8tPmZib3BzID0gJncxMDBmYl9vcHM7CiAJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVDsKIAlpbmZvLT5ub2RlID0gLTE7Ci0JaW5mby0+c2NyZWVuX2Jhc2UgPSByZW1hcHBlZF9mYnVmOworCWluZm8tPnNjcmVlbl9iYXNlID0gcmVtYXBwZWRfZmJ1ZiArIChXMTAwX0ZCX0JBU0UtTUVNX1dJTkRPV19CQVNFKTsKIAlpbmZvLT5zY3JlZW5fc2l6ZSA9IFJFTUFQUEVEX0ZCX0xFTjsKIAotCWluZm8tPnZhci54cmVzID0gNjQwOworCXN0cmNweShpbmZvLT5maXguaWQsICJ3MTAwZmIiKTsKKwlpbmZvLT5maXgudHlwZSA9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKKwlpbmZvLT5maXgudHlwZV9hdXggPSAwOworCWluZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX05PTkU7CisJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBtZW0tPnN0YXJ0K1cxMDBfRkJfQkFTRTsKKwlpbmZvLT5maXgubW1pb19zdGFydCA9IG1lbS0+c3RhcnQrVzEwMF9SRUdfQkFTRTsKKwlpbmZvLT5maXgubW1pb19sZW4gPSBXMTAwX1JFR19MRU47CisKKwlpZiAoZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKSA8IDApIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcGFyLT5tb2RlID0gJmluZi0+bW9kZWxpc3RbMF07CisJaWYoaW5mLT5pbml0X21vZGUgJiBJTklUX01PREVfUk9UQVRFRCkgeworCQlpbmZvLT52YXIueHJlcyA9IHBhci0+bW9kZS0+eXJlczsKKwkJaW5mby0+dmFyLnlyZXMgPSBwYXItPm1vZGUtPnhyZXM7CisJfQorCWVsc2UgeworCQlpbmZvLT52YXIueHJlcyA9IHBhci0+bW9kZS0+eHJlczsKKwkJaW5mby0+dmFyLnlyZXMgPSBwYXItPm1vZGUtPnlyZXM7CisJfQorCisJaWYoaW5mLT5pbml0X21vZGUgJj0gSU5JVF9NT0RFX0ZMSVBQRUQpCisJCXBhci0+ZmxpcCA9IDE7CisJZWxzZQorCQlwYXItPmZsaXAgPSAwOworCiAJaW5mby0+dmFyLnhyZXNfdmlydHVhbCA9IGluZm8tPnZhci54cmVzOwotCWluZm8tPnZhci55cmVzID0gNDgwOwogCWluZm8tPnZhci55cmVzX3ZpcnR1YWwgPSBpbmZvLT52YXIueXJlczsKLQlpbmZvLT52YXIucGl4Y2xvY2sgPSAweDA0OwkvKiAxNzE1MjE7ICovCisJaW5mby0+dmFyLnBpeGNsb2NrID0gMHgwNDsgIC8qIDE3MTUyMTsgKi8KIAlpbmZvLT52YXIuc3luYyA9IDA7CiAJaW5mby0+dmFyLmdyYXlzY2FsZSA9IDA7CiAJaW5mby0+dmFyLnhvZmZzZXQgPSBpbmZvLT52YXIueW9mZnNldCA9IDA7CiAJaW5mby0+dmFyLmFjY2VsX2ZsYWdzID0gMDsKIAlpbmZvLT52YXIuYWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7CiAKLQlzdHJjcHkoaW5mby0+Zml4LmlkLCAidzEwMGZiIik7Ci0JaW5mby0+Zml4LnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7Ci0JaW5mby0+Zml4LnR5cGVfYXV4ID0gMDsKLQlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9OT05FOwotCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gbWVtLT5zdGFydCtNRU1fRVhUX0JBU0VfVkFMVUU7Ci0JaW5mby0+Zml4Lm1taW9fc3RhcnQgPSBtZW0tPnN0YXJ0K1cxMDBfUkVHX0JBU0U7Ci0JaW5mby0+Zml4Lm1taW9fbGVuID0gVzEwMF9SRUdfTEVOOworCXcxMDBfaHdfaW5pdChwYXIpOwogCi0JdzEwMGZiX2NoZWNrX3ZhcigmaW5mby0+dmFyLCBpbmZvKTsKKwlpZiAodzEwMGZiX2NoZWNrX3ZhcigmaW5mby0+dmFyLCBpbmZvKSA8IDApIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCiAJdzEwMGZiX3NldF9wYXIoaW5mbyk7CiAKIAlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKSB7Ci0JCWtmcmVlKGluZm8tPnBzZXVkb19wYWxldHRlKTsKLQkJaW91bm1hcChyZW1hcHBlZF9iYXNlKTsKLQkJaW91bm1hcChyZW1hcHBlZF9yZWdzKTsKLQkJaW91bm1hcChyZW1hcHBlZF9mYnVmKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OwogCX0KIAotCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9mYXN0c3lzY2xrKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZmFzdHBsbGNsayk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3JlZ19yZWFkKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVnX3dyaXRlKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcm90YXRpb24pOworCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9mbGlwKTsKIAogCXByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsIGluZm8tPm5vZGUsIGluZm8tPmZpeC5pZCk7CiAJcmV0dXJuIDA7CitvdXQ6CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKKwlrZnJlZShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSk7CisJaWYgKHJlbWFwcGVkX2ZidWYgIT0gTlVMTCkKKwkJaW91bm1hcChyZW1hcHBlZF9mYnVmKTsKKwlpZiAocmVtYXBwZWRfcmVncyAhPSBOVUxMKQorCQlpb3VubWFwKHJlbWFwcGVkX3JlZ3MpOworCWlmIChyZW1hcHBlZF9iYXNlICE9IE5VTEwpCisJCWlvdW5tYXAocmVtYXBwZWRfYmFzZSk7CisJaWYgKGluZm8pCisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisJcmV0dXJuIGVycjsKIH0KIAogCiBzdGF0aWMgaW50IHcxMDBmYl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHcxMDBmYl9wYXIgKnBhcj1pbmZvLT5wYXI7CiAKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZmFzdHN5c2Nsayk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2Zhc3RwbGxjbGspOwogCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9yZWdfcmVhZCk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3JlZ193cml0ZSk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3JvdGF0aW9uKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZmxpcCk7CiAKIAl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwogCi0JdzEwMGZiX2NsZWFyX2J1ZmZlcigpOworCXZmcmVlKHBhci0+c2F2ZWRfaW50bWVtKTsKKwl2ZnJlZShwYXItPnNhdmVkX2V4dG1lbSk7CiAJa2ZyZWUoaW5mby0+cHNldWRvX3BhbGV0dGUpOworCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAKIAlpb3VubWFwKHJlbWFwcGVkX2Jhc2UpOwogCWlvdW5tYXAocmVtYXBwZWRfcmVncyk7CkBAIC03MjEsMTAgKzY2NCw1NCBAQAogCXVkZWxheSgxMDApOwogfQogCitzdGF0aWMgdm9pZCB3MTAwX3VwZGF0ZV9kaXNhYmxlKHZvaWQpCit7CisJdW5pb24gZGlzcF9kYl9idWZfY250bF93cl91IGRpc3BfZGJfYnVmX3dyX2NudGw7CisKKwkvKiBQcmV2ZW50IGRpc3BsYXkgdXBkYXRlcyAqLworCWRpc3BfZGJfYnVmX3dyX2NudGwuZi5kYl9idWZfY250bCA9IDB4MWU7CisJZGlzcF9kYl9idWZfd3JfY250bC5mLnVwZGF0ZV9kYl9idWYgPSAwOworCWRpc3BfZGJfYnVmX3dyX2NudGwuZi5lbl9kYl9idWYgPSAwOworCXdyaXRlbCgodTMyKSAoZGlzcF9kYl9idWZfd3JfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1ESVNQX0RCX0JVRl9DTlRMKTsKK30KKworc3RhdGljIHZvaWQgdzEwMF91cGRhdGVfZW5hYmxlKHZvaWQpCit7CisJdW5pb24gZGlzcF9kYl9idWZfY250bF93cl91IGRpc3BfZGJfYnVmX3dyX2NudGw7CisKKwkvKiBFbmFibGUgZGlzcGxheSB1cGRhdGVzICovCisJZGlzcF9kYl9idWZfd3JfY250bC5mLmRiX2J1Zl9jbnRsID0gMHgxZTsKKwlkaXNwX2RiX2J1Zl93cl9jbnRsLmYudXBkYXRlX2RiX2J1ZiA9IDE7CisJZGlzcF9kYl9idWZfd3JfY250bC5mLmVuX2RiX2J1ZiA9IDE7CisJd3JpdGVsKCh1MzIpIChkaXNwX2RiX2J1Zl93cl9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbURJU1BfREJfQlVGX0NOVEwpOworfQorCit1bnNpZ25lZCBsb25nIHcxMDBmYl9ncGlvX3JlYWQoaW50IHBvcnQpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCWlmIChwb3J0PT1XMTAwX0dQSU9fUE9SVF9BKQorCQl2YWx1ZSA9IHJlYWRsKHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fREFUQSk7CisJZWxzZQorCQl2YWx1ZSA9IHJlYWRsKHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fREFUQTIpOworCisJcmV0dXJuIHZhbHVlOworfQorCit2b2lkIHcxMDBmYl9ncGlvX3dyaXRlKGludCBwb3J0LCB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCWlmIChwb3J0PT1XMTAwX0dQSU9fUE9SVF9BKQorCQl2YWx1ZSA9IHdyaXRlbCh2YWx1ZSwgcmVtYXBwZWRfcmVncyArIG1tR1BJT19EQVRBKTsKKwllbHNlCisJCXZhbHVlID0gd3JpdGVsKHZhbHVlLCByZW1hcHBlZF9yZWdzICsgbW1HUElPX0RBVEEyKTsKK30KK0VYUE9SVF9TWU1CT0wodzEwMGZiX2dwaW9fcmVhZCk7CitFWFBPUlRfU1lNQk9MKHcxMDBmYl9ncGlvX3dyaXRlKTsKKwogLyoKICAqIEluaXRpYWxpemF0aW9uIG9mIGNyaXRpY2FsIHcxMDAgaGFyZHdhcmUKICAqLwotc3RhdGljIHZvaWQgdzEwMF9od19pbml0KHZvaWQpCitzdGF0aWMgdm9pZCB3MTAwX2h3X2luaXQoc3RydWN0IHcxMDBmYl9wYXIgKnBhcikKIHsKIAl1MzIgdGVtcDMyOwogCXVuaW9uIGNpZl9jbnRsX3UgY2lmX2NudGw7CkBAIC03MzUsOCArNzIyLDggQEAKIAl1bmlvbiBjcHVfZGVmYXVsdHNfdSBjcHVfZGVmYXVsdDsKIAl1bmlvbiBjaWZfd3JpdGVfZGJnX3UgY2lmX3dyaXRlX2RiZzsKIAl1bmlvbiB3cmFwX3N0YXJ0X2Rpcl91IHdyYXBfc3RhcnRfZGlyOwotCXVuaW9uIG1jX2V4dF9tZW1fbG9jYXRpb25fdSBtY19leHRfbWVtX2xvYzsKIAl1bmlvbiBjaWZfaW9fdSBjaWZfaW87CisJc3RydWN0IHcxMDBfZ3Bpb19yZWdzICpncGlvID0gcGFyLT5tYWNoLT5ncGlvOwogCiAJdzEwMF9zb2Z0X3Jlc2V0KCk7CiAKQEAgLTc5MSwxOSArNzc4LDYgQEAKIAljZmdyZWdfYmFzZS5mLmNmZ3JlZ19iYXNlID0gVzEwMF9DRkdfQkFTRTsKIAl3cml0ZWwoKHUzMikgKGNmZ3JlZ19iYXNlLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbUNGR1JFR19CQVNFKTsKIAotCS8qIFRoaXMgbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gaW50ZXJuYWwgdzEwMCBhZGRyZXNzZXMgKi8KLQl3cml0ZWwoMHgxNUZGMTAwMCwgcmVtYXBwZWRfcmVncyArIG1tTUNfRkJfTE9DQVRJT04pOwotCi0JbWNfZXh0X21lbV9sb2MudmFsID0gZGVmTUNfRVhUX01FTV9MT0NBVElPTjsKLQltY19leHRfbWVtX2xvYy5mLm1jX2V4dF9tZW1fc3RhcnQgPSBNRU1fRVhUX0JBU0VfVkFMVUUgPj4gODsKLQltY19leHRfbWVtX2xvYy5mLm1jX2V4dF9tZW1fdG9wID0gTUVNX0VYVF9UT1BfVkFMVUUgPj4gODsKLQl3cml0ZWwoKHUzMikgKG1jX2V4dF9tZW1fbG9jLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbU1DX0VYVF9NRU1fTE9DQVRJT04pOwotCi0JaWYgKChjdXJyZW50X3Bhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV8yNDApIHx8IChjdXJyZW50X3Bhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV8zMjApKQotCQl3MTAwX0luaXRFeHRNZW0oTENEX1NIQVJQX1FWR0EpOwotCWVsc2UKLQkJdzEwMF9Jbml0RXh0TWVtKExDRF9TSEFSUF9WR0EpOwotCiAJd3JhcF9zdGFydF9kaXIudmFsID0gZGVmV1JBUF9TVEFSVF9ESVI7CiAJd3JhcF9zdGFydF9kaXIuZi5zdGFydF9hZGRyID0gV1JBUF9CVUZfQkFTRV9WQUxVRSA+PiAxOwogCXdyaXRlbCgodTMyKSAod3JhcF9zdGFydF9kaXIudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tV1JBUF9TVEFSVF9ESVIpOwpAQCAtODEzLDMzOSArNzg3LDMwMCBAQAogCXdyaXRlbCgodTMyKSAod3JhcF90b3BfZGlyLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVdSQVBfVE9QX0RJUik7CiAKIAl3cml0ZWwoKHUzMikgMHgyNDQwLCByZW1hcHBlZF9yZWdzICsgbW1SQkJNX0NOVEwpOworCisJLyogU2V0IHRoZSBoYXJkd2FyZSB0byA1NjUgY29sb3VyICovCisJdGVtcDMyID0gcmVhZGwocmVtYXBwZWRfcmVncyArIG1tRElTUF9ERUJVRzIpOworCXRlbXAzMiAmPSAweGZmN2ZmZmZmOworCXRlbXAzMiB8PSAweDAwODAwMDAwOworCXdyaXRlbCh0ZW1wMzIsIHJlbWFwcGVkX3JlZ3MgKyBtbURJU1BfREVCVUcyKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIEdQSU8gbGluZXMgKi8KKwlpZiAoZ3BpbykgeworCQl3cml0ZWwoZ3Bpby0+aW5pdF9kYXRhMSwgcmVtYXBwZWRfcmVncyArIG1tR1BJT19EQVRBKTsKKwkJd3JpdGVsKGdwaW8tPmluaXRfZGF0YTIsIHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fREFUQTIpOworCQl3cml0ZWwoZ3Bpby0+Z3Bpb19kaXIxLCAgcmVtYXBwZWRfcmVncyArIG1tR1BJT19DTlRMMSk7CisJCXdyaXRlbChncGlvLT5ncGlvX29lMSwgICByZW1hcHBlZF9yZWdzICsgbW1HUElPX0NOVEwyKTsKKwkJd3JpdGVsKGdwaW8tPmdwaW9fZGlyMiwgIHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fQ05UTDMpOworCQl3cml0ZWwoZ3Bpby0+Z3Bpb19vZTIsICAgcmVtYXBwZWRfcmVncyArIG1tR1BJT19DTlRMNCk7CisJfQogfQogCiAKLS8qCi0gKiBUeXBlcwotICovCi0KLXN0cnVjdCBwbGxfcGFybSB7Ci0JdTE2IGZyZXE7CQkvKiBkZXNpcmVkIEZvdXQgZm9yIFBMTCAqLwotCXU4IE07Ci0JdTggTl9pbnQ7Ci0JdTggTl9mYWM7Ci0JdTggdGZnb2FsOwotCXU4IGxvY2tfdGltZTsKLX07Ci0KIHN0cnVjdCBwb3dlcl9zdGF0ZSB7CiAJdW5pb24gY2xrX3Bpbl9jbnRsX3UgY2xrX3Bpbl9jbnRsOwogCXVuaW9uIHBsbF9yZWZfZmJfZGl2X3UgcGxsX3JlZl9mYl9kaXY7CiAJdW5pb24gcGxsX2NudGxfdSBwbGxfY250bDsKIAl1bmlvbiBzY2xrX2NudGxfdSBzY2xrX2NudGw7CiAJdW5pb24gcGNsa19jbnRsX3UgcGNsa19jbnRsOwotCXVuaW9uIGNsa190ZXN0X2NudGxfdSBjbGtfdGVzdF9jbnRsOwogCXVuaW9uIHB3cm1ndF9jbnRsX3UgcHdybWd0X2NudGw7Ci0JdTMyIGZyZXE7CQkvKiBGb3V0IGZvciBQTEwgY2FsaWJyYXRpb24gKi8KLQl1OCB0ZjEwMDsJCS8qIGZvciBwbGwgY2FsaWJyYXRpb24gKi8KLQl1OCB0ZjgwOwkJLyogZm9yIHBsbCBjYWxpYnJhdGlvbiAqLwotCXU4IHRmMjA7CQkvKiBmb3IgcGxsIGNhbGlicmF0aW9uICovCi0JdTggTTsJCQkvKiBmb3IgcGxsIGNhbGlicmF0aW9uICovCi0JdTggTl9pbnQ7CQkvKiBmb3IgcGxsIGNhbGlicmF0aW9uICovCi0JdTggTl9mYWM7CQkvKiBmb3IgcGxsIGNhbGlicmF0aW9uICovCi0JdTggbG9ja190aW1lOwkvKiBmb3IgcGxsIGNhbGlicmF0aW9uICovCi0JdTggdGZnb2FsOwkJLyogZm9yIHBsbCBjYWxpYnJhdGlvbiAqLwotCXU4IGF1dG9fbW9kZTsJLyogaGFyZHdhcmUgYXV0byBzd2l0Y2g/ICovCi0JdTggcHdtX21vZGU7CQkvKiAwIGZhc3QsIDEgbm9ybWFsL3Nsb3cgKi8KLQl1MTYgZmFzdF9zY2xrOwkvKiBmYXN0IGNsayBmcmVxICovCi0JdTE2IG5vcm1fc2NsazsJLyogc2xvdyBjbGsgZnJlcSAqLworCWludCBhdXRvX21vZGU7ICAvKiBzeXN0ZW0gY2xvY2sgYXV0byBjaGFuZ2luZz8gKi8KIH07CiAKIAotLyoKLSAqIEdsb2JhbCBzdGF0ZSB2YXJpYWJsZXMKLSAqLwotCiBzdGF0aWMgc3RydWN0IHBvd2VyX3N0YXRlIHcxMDBfcHdyX3N0YXRlOwogCi0vKiBUaGlzIHRhYmxlIGlzIHNwZWNpZmljIGZvciAxMi41TUh6IHJlZiBjcnlzdGFsLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcGxsX3Bhcm0gZ1BMTFRhYmxlW10gPSB7Ci0gICAgLypmcmVxICAgICBNICAgTl9pbnQgICAgTl9mYWMgIHRmZ29hbCAgbG9ja190aW1lICovCi0gICAgeyA1MCwgICAgICAwLCAgIDEsICAgICAgIDAsICAgICAweEUwLCAgICAgICAgNTZ9LCAvKiAgNTAuMDAgTUh6ICovCi0gICAgeyA3NSwgICAgICAwLCAgIDUsICAgICAgIDAsICAgICAweERFLAkgICAgIDM3fSwgLyogIDc1LjAwIE1IeiAqLwotICAgIHsxMDAsICAgICAgMCwgICA3LCAgICAgICAwLCAgICAgMHhFMCwgICAgICAgIDI4fSwgLyogMTAwLjAwIE1IeiAqLwotICAgIHsxMjUsICAgICAgMCwgICA5LCAgICAgICAwLCAgICAgMHhFMCwgICAgICAgIDIyfSwgLyogMTI1LjAwIE1IeiAqLwotICAgIHsxNTAsICAgICAgMCwgICAxMSwgICAgICAwLCAgICAgMHhFMCwgICAgICAgIDE3fSwgLyogMTUwLjAwIE1IeiAqLwotICAgIHsgIDAsICAgICAgMCwgICAwLCAgICAgICAwLCAgICAgICAgMCwgICAgICAgICAwfSAgLyogVGVybWluYXRvciAqLworLyogVGhlIFBMTCBGb3V0IGlzIGRldGVybWluZWQgYnkgKFh0YWxGcmVxLyhNKzEpKSAqICgoTl9pbnQrMSkgKyAoTl9mYWMvOCkpICovCisKKy8qIDEyLjVNSHogQ3J5c3RhbCBQTEwgVGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgdzEwMF9wbGxfaW5mbyB4dGFsXzEyNTAwMDAwW10gPSB7CisJLypmcmVxICAgICBNICAgTl9pbnQgICAgTl9mYWMgIHRmZ29hbCAgbG9ja190aW1lICovCisJeyA1MCwgICAgICAwLCAgIDEsICAgICAgIDAsICAgICAweGUwLCAgICAgICAgNTZ9LCAgLyogIDUwLjAwIE1IeiAqLworCXsgNzUsICAgICAgMCwgICA1LCAgICAgICAwLCAgICAgMHhkZSwgICAgICAgIDM3fSwgIC8qICA3NS4wMCBNSHogKi8KKwl7MTAwLCAgICAgIDAsICAgNywgICAgICAgMCwgICAgIDB4ZTAsICAgICAgICAyOH0sICAvKiAxMDAuMDAgTUh6ICovCisJezEyNSwgICAgICAwLCAgIDksICAgICAgIDAsICAgICAweGUwLCAgICAgICAgMjJ9LCAgLyogMTI1LjAwIE1IeiAqLworCXsxNTAsICAgICAgMCwgICAxMSwgICAgICAwLCAgICAgMHhlMCwgICAgICAgIDE3fSwgIC8qIDE1MC4wMCBNSHogKi8KKwl7ICAwLCAgICAgIDAsICAgMCwgICAgICAgMCwgICAgICAgIDAsICAgICAgICAgMH0sICAvKiBUZXJtaW5hdG9yICovCiB9OwogCisvKiAxNC4zMThNSHogQ3J5c3RhbCBQTEwgVGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgdzEwMF9wbGxfaW5mbyB4dGFsXzE0MzE4MDAwW10gPSB7CisJLypmcmVxICAgICBNICAgTl9pbnQgICAgTl9mYWMgIHRmZ29hbCAgbG9ja190aW1lICovCisJeyA0MCwgICAgICA0LCAgIDEzLCAgICAgIDAsICAgICAweGUwLCAgICAgICAgODB9LCAvKiB0ZmdvYWwgZ3Vlc3NlZCAqLworCXsgNTAsICAgICAgMSwgICA2LCAgICAgICAwLCAgICAgMHhlMCwJICAgICA2NH0sIC8qICA1MC4wNSBNSHogKi8KKwl7IDU3LCAgICAgIDIsICAgMTEsICAgICAgMCwgICAgIDB4ZTAsICAgICAgICA1M30sIC8qIHRmZ29hbCBndWVzc2VkICovCisJeyA3NSwgICAgICAwLCAgIDQsICAgICAgIDMsICAgICAweGUwLAkgICAgIDQzfSwgLyogIDc1LjA4IE1IeiAqLworCXsxMDAsICAgICAgMCwgICA2LCAgICAgICAwLCAgICAgMHhlMCwgICAgICAgIDMyfSwgLyogMTAwLjEwIE1IeiAqLworCXsgIDAsICAgICAgMCwgICAwLCAgICAgICAwLCAgICAgICAgMCwgICAgICAgICAwfSwKK307CiAKLXN0YXRpYyB1OCB3MTAwX3BsbF9nZXRfdGVzdGNvdW50KHU4IHRlc3RjbGtfc2VsKQorLyogMTZNSHogQ3J5c3RhbCBQTEwgVGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgdzEwMF9wbGxfaW5mbyB4dGFsXzE2MDAwMDAwW10gPSB7CisJLypmcmVxICAgICBNICAgTl9pbnQgICAgTl9mYWMgIHRmZ29hbCAgbG9ja190aW1lICovCisJeyA3MiwgICAgICAxLCAgIDgsICAgICAgIDAsICAgICAweGUwLCAgICAgICAgNDh9LCAvKiB0ZmdvYWwgZ3Vlc3NlZCAqLworCXsgOTUsICAgICAgMSwgICAxMCwgICAgICA3LCAgICAgMHhlMCwgICAgICAgIDM4fSwgLyogdGZnb2FsIGd1ZXNzZWQgKi8KKwl7IDk2LCAgICAgIDEsICAgMTEsICAgICAgMCwgICAgIDB4ZTAsICAgICAgICAzNn0sIC8qIHRmZ29hbCBndWVzc2VkICovCisJeyAgMCwgICAgICAwLCAgIDAsICAgICAgIDAsICAgICAgICAwLCAgICAgICAgIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGxfZW50cmllcyB7CisJaW50IHh0YWxfZnJlcTsKKwlzdHJ1Y3QgdzEwMF9wbGxfaW5mbyAqcGxsX3RhYmxlOworfSB3MTAwX3BsbF90YWJsZXNbXSA9IHsKKwl7IDEyNTAwMDAwLCAmeHRhbF8xMjUwMDAwMFswXSB9LAorCXsgMTQzMTgwMDAsICZ4dGFsXzE0MzE4MDAwWzBdIH0sCisJeyAxNjAwMDAwMCwgJnh0YWxfMTYwMDAwMDBbMF0gfSwKKwl7IDAgfSwKK307CisKK3N0cnVjdCB3MTAwX3BsbF9pbmZvICp3MTAwX2dldF94dGFsX3RhYmxlKHVuc2lnbmVkIGludCBmcmVxKQogewotCXVkZWxheSg1KTsKKwlzdHJ1Y3QgcGxsX2VudHJpZXMgKnBsbF9lbnRyeSA9IHcxMDBfcGxsX3RhYmxlczsKIAotCXcxMDBfcHdyX3N0YXRlLmNsa190ZXN0X2NudGwuZi5zdGFydF9jaGVja19mcmVxID0gMHgwOwotCXcxMDBfcHdyX3N0YXRlLmNsa190ZXN0X2NudGwuZi50ZXN0Y2xrX3NlbCA9IHRlc3RjbGtfc2VsOwotCXcxMDBfcHdyX3N0YXRlLmNsa190ZXN0X2NudGwuZi50c3Rjb3VudF9yc3QgPSAweDE7CS8qcmVzZXQgdGVzdCBjb3VudCAqLwotCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUuY2xrX3Rlc3RfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1DTEtfVEVTVF9DTlRMKTsKLQl3MTAwX3B3cl9zdGF0ZS5jbGtfdGVzdF9jbnRsLmYudHN0Y291bnRfcnN0ID0gMHgwOwotCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUuY2xrX3Rlc3RfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1DTEtfVEVTVF9DTlRMKTsKLQotCXcxMDBfcHdyX3N0YXRlLmNsa190ZXN0X2NudGwuZi5zdGFydF9jaGVja19mcmVxID0gMHgxOwotCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUuY2xrX3Rlc3RfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1DTEtfVEVTVF9DTlRMKTsKLQotCXVkZWxheSgyMCk7Ci0KLQl3MTAwX3B3cl9zdGF0ZS5jbGtfdGVzdF9jbnRsLnZhbCA9IHJlYWRsKHJlbWFwcGVkX3JlZ3MgKyBtbUNMS19URVNUX0NOVEwpOwotCXcxMDBfcHdyX3N0YXRlLmNsa190ZXN0X2NudGwuZi5zdGFydF9jaGVja19mcmVxID0gMHgwOwotCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUuY2xrX3Rlc3RfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1DTEtfVEVTVF9DTlRMKTsKLQotCXJldHVybiB3MTAwX3B3cl9zdGF0ZS5jbGtfdGVzdF9jbnRsLmYudGVzdF9jb3VudDsKKwlkbyB7CisJCWlmIChmcmVxID09IHBsbF9lbnRyeS0+eHRhbF9mcmVxKQorCQkJcmV0dXJuIHBsbF9lbnRyeS0+cGxsX3RhYmxlOworCQlwbGxfZW50cnkrKzsKKwl9IHdoaWxlIChwbGxfZW50cnktPnh0YWxfZnJlcSk7CisJcmV0dXJuIDA7CiB9CiAKIAotc3RhdGljIHU4IHcxMDBfcGxsX2FkanVzdCh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCB3MTAwX2dldF90ZXN0Y291bnQodW5zaWduZWQgaW50IHRlc3RjbGtfc2VsKQogeworCXVuaW9uIGNsa190ZXN0X2NudGxfdSBjbGtfdGVzdF9jbnRsOworCisJdWRlbGF5KDUpOworCisJLyogU2VsZWN0IHRoZSB0ZXN0IGNsb2NrIHNvdXJjZSBhbmQgcmVzZXQgKi8KKwljbGtfdGVzdF9jbnRsLmYuc3RhcnRfY2hlY2tfZnJlcSA9IDB4MDsKKwljbGtfdGVzdF9jbnRsLmYudGVzdGNsa19zZWwgPSB0ZXN0Y2xrX3NlbDsKKwljbGtfdGVzdF9jbnRsLmYudHN0Y291bnRfcnN0ID0gMHgxOyAvKiBzZXQgcmVzZXQgKi8KKwl3cml0ZWwoKHUzMikgKGNsa190ZXN0X2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tQ0xLX1RFU1RfQ05UTCk7CisKKwljbGtfdGVzdF9jbnRsLmYudHN0Y291bnRfcnN0ID0gMHgwOyAvKiBjbGVhciByZXNldCAqLworCXdyaXRlbCgodTMyKSAoY2xrX3Rlc3RfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1DTEtfVEVTVF9DTlRMKTsKKworCS8qIFJ1biBjbG9jayB0ZXN0ICovCisJY2xrX3Rlc3RfY250bC5mLnN0YXJ0X2NoZWNrX2ZyZXEgPSAweDE7CisJd3JpdGVsKCh1MzIpIChjbGtfdGVzdF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbUNMS19URVNUX0NOVEwpOworCisJLyogR2l2ZSB0aGUgdGVzdCB0aW1lIHRvIGNvbXBsZXRlICovCisJdWRlbGF5KDIwKTsKKworCS8qIFJldHVybiB0aGUgcmVzdWx0ICovCisJY2xrX3Rlc3RfY250bC52YWwgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1DTEtfVEVTVF9DTlRMKTsKKwljbGtfdGVzdF9jbnRsLmYuc3RhcnRfY2hlY2tfZnJlcSA9IDB4MDsKKwl3cml0ZWwoKHUzMikgKGNsa190ZXN0X2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tQ0xLX1RFU1RfQ05UTCk7CisKKwlyZXR1cm4gY2xrX3Rlc3RfY250bC5mLnRlc3RfY291bnQ7Cit9CisKKworc3RhdGljIGludCB3MTAwX3BsbF9hZGp1c3Qoc3RydWN0IHcxMDBfcGxsX2luZm8gKnBsbCkKK3sKKwl1bnNpZ25lZCBpbnQgdGY4MDsKKwl1bnNpZ25lZCBpbnQgdGYyMDsKKworCS8qIEluaXRpYWwgU2V0dGluZ3MgKi8KKwl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9wd2RuID0gMHgwOyAgICAgLyogcG93ZXIgZG93biAqLworCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3Jlc2V0ID0gMHgwOyAgICAvKiBub3QgcmVzZXQgKi8KKwl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF90Y3BvZmYgPSAweDE7ICAgLyogSGktWiAqLworCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3B2ZyA9IDB4MDsgICAgICAvKiBWQ08gZ2FpbiA9IDAgKi8KKwl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF92Y29mciA9IDB4MDsgICAgLyogVkNPIGZyZXF1ZW5jeSByYW5nZSBjb250cm9sID0gb2ZmICovCisJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfaW9mZnNldCA9IDB4MDsgIC8qIGN1cnJlbnQgb2Zmc2V0IGluc2lkZSBWQ08gPSAwICovCisJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcmluZ19vZmYgPSAweDA7CisKKwkvKiBXYWkgTWluZyA4MCBwZXJjZW50IG9mIFZERCAxLjNWIGdpdmVzIDEuMDRWLCBtaW5pbXVtIG9wZXJhdGluZyB2b2x0YWdlIGlzIDEuMDhWCisJICogdGhlcmVmb3JlLCBjb21tZW50ZWQgb3V0IHRoZSBmb2xsb3dpbmcgbGluZXMKKwkgKiB0ZjgwIG1lYW50IHRmMTAwCisJICovCiAJZG8gewotCQkvKiBXYWkgTWluZyA4MCBwZXJjZW50IG9mIFZERCAxLjNWIGdpdmVzIDEuMDRWLCBtaW5pbXVtIG9wZXJhdGluZyB2b2x0YWdlIGlzIDEuMDhWCi0JCSAqIHRoZXJlZm9yZSwgY29tbWVudGVkIG91dCB0aGUgZm9sbG93aW5nIGxpbmVzCi0JCSAqIHRmODAgbWVhbnQgdGYxMDAKLQkJICogc2V0IFZDTyBpbnB1dCA9IDAuOCAqIFZERAotCQkgKi8KKwkJLyogc2V0IFZDTyBpbnB1dCA9IDAuOCAqIFZERCAqLwogCQl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9kYWN0YWwgPSAweGQ7CiAJCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucGxsX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tUExMX0NOVEwpOwogCi0JCXcxMDBfcHdyX3N0YXRlLnRmODAgPSB3MTAwX3BsbF9nZXRfdGVzdGNvdW50KDB4MSk7CS8qIFBMTENMSyAqLwotCQlpZiAodzEwMF9wd3Jfc3RhdGUudGY4MCA+PSAodzEwMF9wd3Jfc3RhdGUudGZnb2FsKSkgeworCQl0ZjgwID0gdzEwMF9nZXRfdGVzdGNvdW50KFRFU1RDTEtfU1JDX1BMTCk7CisJCWlmICh0ZjgwID49IChwbGwtPnRmZ29hbCkpIHsKIAkJCS8qIHNldCBWQ08gaW5wdXQgPSAwLjIgKiBWREQgKi8KIAkJCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX2RhY3RhbCA9IDB4NzsKIAkJCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucGxsX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tUExMX0NOVEwpOwogCi0JCQl3MTAwX3B3cl9zdGF0ZS50ZjIwID0gdzEwMF9wbGxfZ2V0X3Rlc3Rjb3VudCgweDEpOwkvKiBQTExDTEsgKi8KLQkJCWlmICh3MTAwX3B3cl9zdGF0ZS50ZjIwIDw9ICh3MTAwX3B3cl9zdGF0ZS50ZmdvYWwpKQotCQkJCXJldHVybiAxOyAvLyBTdWNjZXNzCisJCQl0ZjIwID0gdzEwMF9nZXRfdGVzdGNvdW50KFRFU1RDTEtfU1JDX1BMTCk7CisJCQlpZiAodGYyMCA8PSAocGxsLT50ZmdvYWwpKQorCQkJCXJldHVybiAxOyAgLyogU3VjY2VzcyAqLwogCiAJCQlpZiAoKHcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3Zjb2ZyID09IDB4MCkgJiYKLQkJCSAgICAoKHcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3B2ZyA9PSAweDcpIHx8Ci0JCQkgICAgICh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9pb2Zmc2V0ID09IDB4MCkpKSB7CisJCQkJKCh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9wdmcgPT0gMHg3KSB8fAorCQkJCSh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9pb2Zmc2V0ID09IDB4MCkpKSB7CiAJCQkJLyogc2xvdyBWQ08gY29uZmlnICovCiAJCQkJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfdmNvZnIgPSAweDE7CiAJCQkJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcHZnID0gMHgwOwogCQkJCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX2lvZmZzZXQgPSAweDA7Ci0JCQkJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC52YWwpLAotCQkJCQlyZW1hcHBlZF9yZWdzICsgbW1QTExfQ05UTCk7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCX0KIAkJaWYgKCh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9pb2Zmc2V0KSA8IDB4MykgewogCQkJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfaW9mZnNldCArPSAweDE7Ci0JCQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBMTF9DTlRMKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICgodzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcHZnKSA8IDB4NykgeworCQl9IGVsc2UgaWYgKCh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9wdmcpIDwgMHg3KSB7CiAJCQl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9pb2Zmc2V0ID0gMHgwOwogCQkJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcHZnICs9IDB4MTsKLQkJCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucGxsX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tUExMX0NOVEwpOwotCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gMDsgIC8qIEVycm9yICovCiAJCX0KLQkJcmV0dXJuIDA7IC8vIGVycm9yCiAJfSB3aGlsZSgxKTsKIH0KIAogCiAvKgogICogdzEwMF9wbGxfY2FsaWJyYXRpb24KLSAqICAgICAgICAgICAgICAgIGZyZXEgPSB0YXJnZXQgZnJlcXVlbmN5IG9mIHRoZSBQTEwKLSAqICAgICAgICAgICAgICAgIChub3RlOiBjcnlzdGFsID0gMTQuM01IeikKICAqLwotc3RhdGljIHU4IHcxMDBfcGxsX2NhbGlicmF0aW9uKHUzMiBmcmVxKQorc3RhdGljIGludCB3MTAwX3BsbF9jYWxpYnJhdGlvbihzdHJ1Y3QgdzEwMF9wbGxfaW5mbyAqcGxsKQogewotCXU4IHN0YXR1czsKKwlpbnQgc3RhdHVzOwogCi0JLyogaW5pdGlhbCBzZXR0aW5nICovCi0JdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcHdkbiA9IDB4MDsJCS8qIHBvd2VyIGRvd24gKi8KLQl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9yZXNldCA9IDB4MDsJCS8qIG5vdCByZXNldCAqLwotCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3RjcG9mZiA9IDB4MTsJLyogSGktWiAqLwotCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3B2ZyA9IDB4MDsJCS8qIFZDTyBnYWluID0gMCAqLwotCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3Zjb2ZyID0gMHgwOwkJLyogVkNPIGZyZXF1ZW5jeSByYW5nZSBjb250cm9sID0gb2ZmICovCi0JdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfaW9mZnNldCA9IDB4MDsJLyogY3VycmVudCBvZmZzZXQgaW5zaWRlIFZDTyA9IDAgKi8KLQl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9yaW5nX29mZiA9IDB4MDsKLQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBMTF9DTlRMKTsKKwlzdGF0dXMgPSB3MTAwX3BsbF9hZGp1c3QocGxsKTsKIAotCS8qIGNoZWNrIGZvciAodGY4MCA+PSB0ZmdvYWwpICYmICh0ZjIwID08IHRmZ29hbCkgKi8KLQlpZiAoKHcxMDBfcHdyX3N0YXRlLnRmODAgPCB3MTAwX3B3cl9zdGF0ZS50ZmdvYWwpIHx8ICh3MTAwX3B3cl9zdGF0ZS50ZjIwID4gdzEwMF9wd3Jfc3RhdGUudGZnb2FsKSkgewotCQlzdGF0dXM9dzEwMF9wbGxfYWRqdXN0KCk7Ci0JfQogCS8qIFBMTCBSZXNldCBBbmQgTG9jayAqLwotCiAJLyogc2V0IFZDTyBpbnB1dCA9IDAuNSAqIFZERCAqLwogCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX2RhY3RhbCA9IDB4YTsKIAl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBMTF9DTlRMKTsKIAotCS8qIHJlc2V0IHRpbWUgKi8KLQl1ZGVsYXkoMSk7CisJdWRlbGF5KDEpOyAgLyogcmVzZXQgdGltZSAqLwogCiAJLyogZW5hYmxlIGNoYXJnZSBwdW1wICovCi0JdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfdGNwb2ZmID0gMHgwOwkvKiBub3JtYWwgKi8KKwl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF90Y3BvZmYgPSAweDA7ICAvKiBub3JtYWwgKi8KIAl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBMTF9DTlRMKTsKIAotCS8qIHNldCBWQ08gaW5wdXQgPSBIaS1aICovCi0JLyogZGlzYWJsZSBEQUMgKi8KKwkvKiBzZXQgVkNPIGlucHV0ID0gSGktWiwgZGlzYWJsZSBEQUMgKi8KIAl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9kYWN0YWwgPSAweDA7CiAJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1QTExfQ05UTCk7CiAKLQkvKiBsb2NrIHRpbWUgKi8KLQl1ZGVsYXkoNDAwKTsJLyogZGVsYXkgNDAwIHVzICovCisJdWRlbGF5KDQwMCk7ICAvKiBsb2NrIHRpbWUgKi8KIAogCS8qIFBMTCBsb2NrZWQgKi8KIAotCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfc3JjX3NlbCA9IDB4MTsJLyogUExMIGNsb2NrICovCi0Jd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tU0NMS19DTlRMKTsKLQotCXcxMDBfcHdyX3N0YXRlLnRmMTAwID0gdzEwMF9wbGxfZ2V0X3Rlc3Rjb3VudCgweDEpOwkvKiBQTExDTEsgKi8KLQogCXJldHVybiBzdGF0dXM7CiB9CiAKIAotc3RhdGljIHU4IHcxMDBfcGxsX3NldF9jbGsodm9pZCkKK3N0YXRpYyBpbnQgdzEwMF9wbGxfc2V0X2NsayhzdHJ1Y3QgdzEwMF9wbGxfaW5mbyAqcGxsKQogewotCXU4IHN0YXR1czsKKwlpbnQgc3RhdHVzOwogCi0JaWYgKHcxMDBfcHdyX3N0YXRlLmF1dG9fbW9kZSA9PSAxKQkvKiBhdXRvIG1vZGUgKi8KKwlpZiAodzEwMF9wd3Jfc3RhdGUuYXV0b19tb2RlID09IDEpICAvKiBhdXRvIG1vZGUgKi8KIAl7Ci0JCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX2Zhc3Rfbm9tbF9od19lbiA9IDB4MDsJLyogZGlzYWJsZSBmYXN0IHRvIG5vcm1hbCAqLwotCQl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9ub21sX2Zhc3RfaHdfZW4gPSAweDA7CS8qIGRpc2FibGUgbm9ybWFsIHRvIGZhc3QgKi8KKwkJdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fZmFzdF9ub21sX2h3X2VuID0gMHgwOyAgLyogZGlzYWJsZSBmYXN0IHRvIG5vcm1hbCAqLworCQl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9ub21sX2Zhc3RfaHdfZW4gPSAweDA7ICAvKiBkaXNhYmxlIG5vcm1hbCB0byBmYXN0ICovCiAJCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tUFdSTUdUX0NOVEwpOwogCX0KIAotCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfc3JjX3NlbCA9IDB4MDsJLyogY3J5c3RhbCBjbG9jayAqLworCS8qIFNldCBzeXN0ZW0gY2xvY2sgc291cmNlIHRvIFhUQUwgd2hpbHN0IGFkanVzdGluZyB0aGUgUExMISAqLworCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfc3JjX3NlbCA9IENMS19TUkNfWFRBTDsKIAl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1TQ0xLX0NOVEwpOwogCi0JdzEwMF9wd3Jfc3RhdGUucGxsX3JlZl9mYl9kaXYuZi5wbGxfcmVmX2RpdiA9IHcxMDBfcHdyX3N0YXRlLk07Ci0JdzEwMF9wd3Jfc3RhdGUucGxsX3JlZl9mYl9kaXYuZi5wbGxfZmJfZGl2X2ludCA9IHcxMDBfcHdyX3N0YXRlLk5faW50OwotCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX2ZiX2Rpdl9mcmFjID0gdzEwMF9wd3Jfc3RhdGUuTl9mYWM7Ci0JdzEwMF9wd3Jfc3RhdGUucGxsX3JlZl9mYl9kaXYuZi5wbGxfbG9ja190aW1lID0gdzEwMF9wd3Jfc3RhdGUubG9ja190aW1lOworCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX3JlZl9kaXYgPSBwbGwtPk07CisJdzEwMF9wd3Jfc3RhdGUucGxsX3JlZl9mYl9kaXYuZi5wbGxfZmJfZGl2X2ludCA9IHBsbC0+Tl9pbnQ7CisJdzEwMF9wd3Jfc3RhdGUucGxsX3JlZl9mYl9kaXYuZi5wbGxfZmJfZGl2X2ZyYWMgPSBwbGwtPk5fZmFjOworCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX2xvY2tfdGltZSA9IHBsbC0+bG9ja190aW1lOwogCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucGxsX3JlZl9mYl9kaXYudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tUExMX1JFRl9GQl9ESVYpOwogCiAJdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fbW9kZV9yZXEgPSAwOwogCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tUFdSTUdUX0NOVEwpOwogCi0Jc3RhdHVzID0gdzEwMF9wbGxfY2FsaWJyYXRpb24gKHcxMDBfcHdyX3N0YXRlLmZyZXEpOworCXN0YXR1cyA9IHcxMDBfcGxsX2NhbGlicmF0aW9uKHBsbCk7CiAKLQlpZiAodzEwMF9wd3Jfc3RhdGUuYXV0b19tb2RlID09IDEpCS8qIGF1dG8gbW9kZSAqLworCWlmICh3MTAwX3B3cl9zdGF0ZS5hdXRvX21vZGUgPT0gMSkgIC8qIGF1dG8gbW9kZSAqLwogCXsKLQkJdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fZmFzdF9ub21sX2h3X2VuID0gMHgxOwkvKiByZWVuYWJsZSBmYXN0IHRvIG5vcm1hbCAqLwotCQl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9ub21sX2Zhc3RfaHdfZW4gPSAweDE7CS8qIHJlZW5hYmxlIG5vcm1hbCB0byBmYXN0ICAqLworCQl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9mYXN0X25vbWxfaHdfZW4gPSAweDE7ICAvKiByZWVuYWJsZSBmYXN0IHRvIG5vcm1hbCAqLworCQl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9ub21sX2Zhc3RfaHdfZW4gPSAweDE7ICAvKiByZWVuYWJsZSBub3JtYWwgdG8gZmFzdCAgKi8KIAkJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1QV1JNR1RfQ05UTCk7CiAJfQogCXJldHVybiBzdGF0dXM7CiB9CiAKLQotLyogYXNzdW1lIHJlZmVyZW5jZSBjcnlzdGFsIGNsayBpcyAxMi41TUh6LAotICogYW5kIHRoYXQgZG91YmxpbmcgaXMgbm90IGVuYWJsZWQuCi0gKgotICogRnJlcSA9IDEyID09IDEyLjVNSHouCi0gKi8KLXN0YXRpYyB1MTYgdzEwMF9zZXRfc2xvd3N5c2Nsayh1MTYgZnJlcSkKKy8qIGZyZXEgPSB0YXJnZXQgZnJlcXVlbmN5IG9mIHRoZSBQTEwgKi8KK3N0YXRpYyBpbnQgdzEwMF9zZXRfcGxsX2ZyZXEoc3RydWN0IHcxMDBmYl9wYXIgKnBhciwgdW5zaWduZWQgaW50IGZyZXEpCiB7Ci0JaWYgKHcxMDBfcHdyX3N0YXRlLm5vcm1fc2NsayA9PSBmcmVxKQotCQlyZXR1cm4gZnJlcTsKKwlzdHJ1Y3QgdzEwMF9wbGxfaW5mbyAqcGxsID0gcGFyLT5wbGxfdGFibGU7CiAKLQlpZiAodzEwMF9wd3Jfc3RhdGUuYXV0b19tb2RlID09IDEpCS8qIGF1dG8gbW9kZSAqLwotCQlyZXR1cm4gMDsKLQotCWlmIChmcmVxID09IDEyKSB7Ci0JCXcxMDBfcHdyX3N0YXRlLm5vcm1fc2NsayA9IGZyZXE7Ci0JCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfcG9zdF9kaXZfc2xvdyA9IDB4MDsJLyogUHNsb3cgPSAxICovCi0JCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfc3JjX3NlbCA9IDB4MDsJLyogY3J5c3RhbCBzcmMgKi8KLQotCQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1TQ0xLX0NOVEwpOwotCi0JCXcxMDBfcHdyX3N0YXRlLmNsa19waW5fY250bC5mLnh0YWxpbl9wbV9lbiA9IDB4MTsKLQkJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5jbGtfcGluX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tQ0xLX1BJTl9DTlRMKTsKLQotCQl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9lbmFibGUgPSAweDE7Ci0JCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX21vZGVfcmVxID0gMHgxOwotCQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBXUk1HVF9DTlRMKTsKLQkJdzEwMF9wd3Jfc3RhdGUucHdtX21vZGUgPSAxOwkvKiBub3JtYWwgbW9kZSAqLwotCQlyZXR1cm4gZnJlcTsKLQl9IGVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHUxNiB3MTAwX3NldF9mYXN0c3lzY2xrKHUxNiBmcmVxKQotewotCXUxNiBwbGxfZnJlcTsKLQlpbnQgaTsKLQotCXdoaWxlKDEpIHsKLQkJcGxsX2ZyZXEgPSAodTE2KSAoZnJlcSAqICh3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3Bvc3RfZGl2X2Zhc3QgKyAxKSk7Ci0JCWkgPSAwOwotCQlkbyB7Ci0JCQlpZiAocGxsX2ZyZXEgPT0gZ1BMTFRhYmxlW2ldLmZyZXEpIHsKLQkJCQl3MTAwX3B3cl9zdGF0ZS5mcmVxID0gZ1BMTFRhYmxlW2ldLmZyZXEgKiAxMDAwMDAwOwotCQkJCXcxMDBfcHdyX3N0YXRlLk0gPSBnUExMVGFibGVbaV0uTTsKLQkJCQl3MTAwX3B3cl9zdGF0ZS5OX2ludCA9IGdQTExUYWJsZVtpXS5OX2ludDsKLQkJCQl3MTAwX3B3cl9zdGF0ZS5OX2ZhYyA9IGdQTExUYWJsZVtpXS5OX2ZhYzsKLQkJCQl3MTAwX3B3cl9zdGF0ZS50ZmdvYWwgPSBnUExMVGFibGVbaV0udGZnb2FsOwotCQkJCXcxMDBfcHdyX3N0YXRlLmxvY2tfdGltZSA9IGdQTExUYWJsZVtpXS5sb2NrX3RpbWU7Ci0JCQkJdzEwMF9wd3Jfc3RhdGUudGYyMCA9IDB4ZmY7CS8qIHNldCBoaWdoZXN0ICovCi0JCQkJdzEwMF9wd3Jfc3RhdGUudGY4MCA9IDB4MDA7CS8qIHNldCBsb3dlc3QgKi8KLQotCQkJCXcxMDBfcGxsX3NldF9jbGsoKTsKLQkJCQl3MTAwX3B3cl9zdGF0ZS5wd21fbW9kZSA9IDA7CS8qIGZhc3QgbW9kZSAqLwotCQkJCXcxMDBfcHdyX3N0YXRlLmZhc3Rfc2NsayA9IGZyZXE7Ci0JCQkJcmV0dXJuIGZyZXE7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0gd2hpbGUoZ1BMTFRhYmxlW2ldLmZyZXEpOwotCi0JCWlmICh3MTAwX3B3cl9zdGF0ZS5hdXRvX21vZGUgPT0gMSkKLQkJCWJyZWFrOwotCi0JCWlmICh3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3Bvc3RfZGl2X2Zhc3QgPT0gMCkKLQkJCWJyZWFrOwotCi0JCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfcG9zdF9kaXZfZmFzdCAtPSAxOwotCQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1TQ0xLX0NOVEwpOwotCX0KKwlkbyB7CisJCWlmIChmcmVxID09IHBsbC0+ZnJlcSkgeworCQkJcmV0dXJuIHcxMDBfcGxsX3NldF9jbGsocGxsKTsKKwkJfQorCQlwbGwrKzsKKwl9IHdoaWxlKHBsbC0+ZnJlcSk7CiAJcmV0dXJuIDA7CiB9CiAKLQogLyogU2V0IHVwIGFuIGluaXRpYWwgc3RhdGUuICBTb21lIHZhbHVlcy9maWVsZHMgc2V0CiAgICBoZXJlIHdpbGwgYmUgb3ZlcndyaXR0ZW4uICovCi1zdGF0aWMgdm9pZCB3MTAwX3B3bV9zZXR1cCh2b2lkKQorc3RhdGljIHZvaWQgdzEwMF9wd21fc2V0dXAoc3RydWN0IHcxMDBmYl9wYXIgKnBhcikKIHsKIAl3MTAwX3B3cl9zdGF0ZS5jbGtfcGluX2NudGwuZi5vc2NfZW4gPSAweDE7CiAJdzEwMF9wd3Jfc3RhdGUuY2xrX3Bpbl9jbnRsLmYub3NjX2dhaW4gPSAweDFmOwogCXcxMDBfcHdyX3N0YXRlLmNsa19waW5fY250bC5mLmRvbnRfdXNlX3h0YWxpbiA9IDB4MDsKIAl3MTAwX3B3cl9zdGF0ZS5jbGtfcGluX2NudGwuZi54dGFsaW5fcG1fZW4gPSAweDA7Ci0JdzEwMF9wd3Jfc3RhdGUuY2xrX3Bpbl9jbnRsLmYueHRhbGluX2RibF9lbiA9IDB4MDsJLyogbm8gZnJlcSBkb3VibGluZyAqLworCXcxMDBfcHdyX3N0YXRlLmNsa19waW5fY250bC5mLnh0YWxpbl9kYmxfZW4gPSBwYXItPm1hY2gtPnh0YWxfZGJsID8gMSA6IDA7CiAJdzEwMF9wd3Jfc3RhdGUuY2xrX3Bpbl9jbnRsLmYuY2dfZGVidWcgPSAweDA7CiAJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5jbGtfcGluX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tQ0xLX1BJTl9DTlRMKTsKIAotCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfc3JjX3NlbCA9IDB4MDsJLyogQ3J5c3RhbCBDbGsgKi8KLQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3Bvc3RfZGl2X2Zhc3QgPSAweDA7CS8qIFBmYXN0ID0gMSAqLworCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfc3JjX3NlbCA9IENMS19TUkNfWFRBTDsKKwl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3Bvc3RfZGl2X2Zhc3QgPSAweDA7ICAvKiBQZmFzdCA9IDEgKi8KIAl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2Nsa29uX2h5cyA9IDB4MzsKLQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3Bvc3RfZGl2X3Nsb3cgPSAweDA7CS8qIFBzbG93ID0gMSAqLworCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfcG9zdF9kaXZfc2xvdyA9IDB4MDsgIC8qIFBzbG93ID0gMSAqLwogCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLmRpc3BfY2dfb2syc3dpdGNoX2VuID0gMHgwOwotCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfZm9yY2VfcmVnID0gMHgwOwkvKiBEeW5hbWljICovCi0JdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19mb3JjZV9kaXNwID0gMHgwOwkvKiBEeW5hbWljICovCi0JdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19mb3JjZV9tYyA9IDB4MDsJLyogRHluYW1pYyAqLwotCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfZm9yY2VfZXh0bWMgPSAweDA7CS8qIER5bmFtaWMgKi8KLQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2ZvcmNlX2NwID0gMHgwOwkvKiBEeW5hbWljICovCi0JdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19mb3JjZV9lMiA9IDB4MDsJLyogRHluYW1pYyAqLwotCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfZm9yY2VfZTMgPSAweDA7CS8qIER5bmFtaWMgKi8KLQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2ZvcmNlX2lkY3QgPSAweDA7CS8qIER5bmFtaWMgKi8KLQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2ZvcmNlX2Jpc3QgPSAweDA7CS8qIER5bmFtaWMgKi8KKwl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2ZvcmNlX3JlZyA9IDB4MDsgICAgLyogRHluYW1pYyAqLworCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfZm9yY2VfZGlzcCA9IDB4MDsgICAvKiBEeW5hbWljICovCisJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19mb3JjZV9tYyA9IDB4MDsgICAgIC8qIER5bmFtaWMgKi8KKwl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2ZvcmNlX2V4dG1jID0gMHgwOyAgLyogRHluYW1pYyAqLworCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfZm9yY2VfY3AgPSAweDA7ICAgICAvKiBEeW5hbWljICovCisJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19mb3JjZV9lMiA9IDB4MDsgICAgIC8qIER5bmFtaWMgKi8KKwl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2ZvcmNlX2UzID0gMHgwOyAgICAgLyogRHluYW1pYyAqLworCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfZm9yY2VfaWRjdCA9IDB4MDsgICAvKiBEeW5hbWljICovCisJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19mb3JjZV9iaXN0ID0gMHgwOyAgIC8qIER5bmFtaWMgKi8KIAl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5idXN5X2V4dGVuZF9jcCA9IDB4MDsKIAl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5idXN5X2V4dGVuZF9lMiA9IDB4MDsKIAl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5idXN5X2V4dGVuZF9lMyA9IDB4MDsKIAl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5idXN5X2V4dGVuZF9pZGN0ID0gMHgwOwogCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVNDTEtfQ05UTCk7CiAKLQl3MTAwX3B3cl9zdGF0ZS5wY2xrX2NudGwuZi5wY2xrX3NyY19zZWwgPSAweDA7CS8qIENyeXN0YWwgQ2xrICovCi0JdzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLmYucGNsa19wb3N0X2RpdiA9IDB4MTsJLyogUCA9IDIgKi8KLQl3MTAwX3B3cl9zdGF0ZS5wY2xrX2NudGwuZi5wY2xrX2ZvcmNlX2Rpc3AgPSAweDA7CS8qIER5bmFtaWMgKi8KKwl3MTAwX3B3cl9zdGF0ZS5wY2xrX2NudGwuZi5wY2xrX3NyY19zZWwgPSBDTEtfU1JDX1hUQUw7CisJdzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLmYucGNsa19wb3N0X2RpdiA9IDB4MTsgICAgLyogUCA9IDIgKi8KKwl3MTAwX3B3cl9zdGF0ZS5wY2xrX2NudGwuZi5wY2xrX2ZvcmNlX2Rpc3AgPSAweDA7ICAvKiBEeW5hbWljICovCiAJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5wY2xrX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tUENMS19DTlRMKTsKIAotCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX3JlZl9kaXYgPSAweDA7CS8qIE0gPSAxICovCi0JdzEwMF9wd3Jfc3RhdGUucGxsX3JlZl9mYl9kaXYuZi5wbGxfZmJfZGl2X2ludCA9IDB4MDsJLyogTiA9IDEuMCAqLworCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX3JlZl9kaXYgPSAweDA7ICAgICAvKiBNID0gMSAqLworCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX2ZiX2Rpdl9pbnQgPSAweDA7ICAvKiBOID0gMS4wICovCiAJdzEwMF9wd3Jfc3RhdGUucGxsX3JlZl9mYl9kaXYuZi5wbGxfZmJfZGl2X2ZyYWMgPSAweDA7CiAJdzEwMF9wd3Jfc3RhdGUucGxsX3JlZl9mYl9kaXYuZi5wbGxfcmVzZXRfdGltZSA9IDB4NTsKIAl3MTAwX3B3cl9zdGF0ZS5wbGxfcmVmX2ZiX2Rpdi5mLnBsbF9sb2NrX3RpbWUgPSAweGZmOwpAQCAtMTE1NCw3ICsxMDg5LDcgQEAKIAl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9wd2RuID0gMHgxOwogCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3Jlc2V0ID0gMHgxOwogCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3BtX2VuID0gMHgwOwotCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX21vZGUgPSAweDA7CS8qIHVzZXMgVkNPIGNsb2NrICovCisJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfbW9kZSA9IDB4MDsgIC8qIHVzZXMgVkNPIGNsb2NrICovCiAJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcmVmY2xrX3NlbCA9IDB4MDsKIAl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9mYmNsa19zZWwgPSAweDA7CiAJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfdGNwb2ZmID0gMHgwOwpAQCAtMTE2NCwyMjEgKzEwOTksMjc2IEBACiAJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfaW9mZnNldCA9IDB4MDsKIAl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9wZWNjX21vZGUgPSAweDA7CiAJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcGVjY19zY29uID0gMHgwOwotCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX2RhY3RhbCA9IDB4MDsJLyogSGktWiAqLworCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX2RhY3RhbCA9IDB4MDsgIC8qIEhpLVogKi8KIAl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9jcF9jbGlwID0gMHgzOwogCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX2NvbmYgPSAweDI7CiAJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfbWJjdHJsID0gMHgyOwogCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3Jpbmdfb2ZmID0gMHgwOwogCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucGxsX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tUExMX0NOVEwpOwogCi0JdzEwMF9wd3Jfc3RhdGUuY2xrX3Rlc3RfY250bC5mLnRlc3RjbGtfc2VsID0gMHgxOwkvKiBQTExDTEsgKGZvciB0ZXN0aW5nKSAqLwotCXcxMDBfcHdyX3N0YXRlLmNsa190ZXN0X2NudGwuZi5zdGFydF9jaGVja19mcmVxID0gMHgwOwotCXcxMDBfcHdyX3N0YXRlLmNsa190ZXN0X2NudGwuZi50c3Rjb3VudF9yc3QgPSAweDA7Ci0Jd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5jbGtfdGVzdF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbUNMS19URVNUX0NOVEwpOwotCiAJdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fZW5hYmxlID0gMHgwOwotCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX21vZGVfcmVxID0gMHgxOwkvKiBub3JtYWwgbW9kZSAoMCwgMSwgMykgKi8KKwl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9tb2RlX3JlcSA9IDB4MTsgIC8qIG5vcm1hbCBtb2RlICgwLCAxLCAzKSAqLwogCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX3dha2V1cF9jb25kID0gMHgwOwogCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX2Zhc3Rfbm9tbF9od19lbiA9IDB4MDsKIAl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9ub21sX2Zhc3RfaHdfZW4gPSAweDA7Ci0JdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fZmFzdF9ub21sX2NvbmQgPSAweDE7CS8qIFBNNCxFTkcgKi8KLQl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9ub21sX2Zhc3RfY29uZCA9IDB4MTsJLyogUE00LEVORyAqLworCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX2Zhc3Rfbm9tbF9jb25kID0gMHgxOyAgLyogUE00LEVORyAqLworCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX25vbWxfZmFzdF9jb25kID0gMHgxOyAgLyogUE00LEVORyAqLwogCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX2lkbGVfdGltZXIgPSAweEZGOwogCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX2J1c3lfdGltZXIgPSAweEZGOwogCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tUFdSTUdUX0NOVEwpOwogCi0JdzEwMF9wd3Jfc3RhdGUuYXV0b19tb2RlID0gMDsJLyogbWFudWFsIG1vZGUgKi8KLQl3MTAwX3B3cl9zdGF0ZS5wd21fbW9kZSA9IDE7CS8qIG5vcm1hbCBtb2RlICgwLCAxLCAyKSAqLwotCXcxMDBfcHdyX3N0YXRlLmZyZXEgPSA1MDAwMDAwMDsJLyogNTAgTUh6ICovCi0JdzEwMF9wd3Jfc3RhdGUuTSA9IDM7CS8qIE0gPSA0ICovCi0JdzEwMF9wd3Jfc3RhdGUuTl9pbnQgPSA2OwkvKiBOID0gNy4wICovCi0JdzEwMF9wd3Jfc3RhdGUuTl9mYWMgPSAwOwotCXcxMDBfcHdyX3N0YXRlLnRmZ29hbCA9IDB4RTA7Ci0JdzEwMF9wd3Jfc3RhdGUubG9ja190aW1lID0gNTY7Ci0JdzEwMF9wd3Jfc3RhdGUudGYyMCA9IDB4ZmY7CS8qIHNldCBoaWdoZXN0ICovCi0JdzEwMF9wd3Jfc3RhdGUudGY4MCA9IDB4MDA7CS8qIHNldCBsb3dlc3QgKi8KLQl3MTAwX3B3cl9zdGF0ZS50ZjEwMCA9IDB4MDA7CS8qIHNldCBsb3dlc3QgKi8KLQl3MTAwX3B3cl9zdGF0ZS5mYXN0X3NjbGsgPSA1MDsJLyogNTAuMCBNSHogKi8KLQl3MTAwX3B3cl9zdGF0ZS5ub3JtX3NjbGsgPSAxMjsJLyogMTIuNSBNSHogKi8KKwl3MTAwX3B3cl9zdGF0ZS5hdXRvX21vZGUgPSAwOyAgLyogbWFudWFsIG1vZGUgKi8KIH0KIAogCi1zdGF0aWMgdm9pZCB3MTAwX2luaXRfc2hhcnBfbGNkKHUzMiBtb2RlKQorLyoKKyAqIFNldHVwIHRoZSB3MTAwIGNsb2NrcyBmb3IgdGhlIHNwZWNpZmllZCBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIHcxMDBfaW5pdF9jbG9ja3Moc3RydWN0IHcxMDBmYl9wYXIgKnBhcikKK3sKKwlzdHJ1Y3QgdzEwMF9tb2RlICptb2RlID0gcGFyLT5tb2RlOworCisJaWYgKG1vZGUtPnBpeGNsa19zcmMgPT0gQ0xLX1NSQ19QTEwgfHwgbW9kZS0+c3lzY2xrX3NyYyA9PSBDTEtfU1JDX1BMTCkKKwkJdzEwMF9zZXRfcGxsX2ZyZXEocGFyLCAocGFyLT5mYXN0cGxsX21vZGUgJiYgbW9kZS0+ZmFzdF9wbGxfZnJlcSkgPyBtb2RlLT5mYXN0X3BsbF9mcmVxIDogbW9kZS0+cGxsX2ZyZXEpOworCisJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19zcmNfc2VsID0gbW9kZS0+c3lzY2xrX3NyYzsKKwl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3Bvc3RfZGl2X2Zhc3QgPSBtb2RlLT5zeXNjbGtfZGl2aWRlcjsKKwl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3Bvc3RfZGl2X3Nsb3cgPSBtb2RlLT5zeXNjbGtfZGl2aWRlcjsKKwl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1TQ0xLX0NOVEwpOworfQorCitzdGF0aWMgdm9pZCB3MTAwX2luaXRfbGNkKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCiB7CiAJdTMyIHRlbXAzMjsKLQl1bmlvbiBkaXNwX2RiX2J1Zl9jbnRsX3dyX3UgZGlzcF9kYl9idWZfd3JfY250bDsKKwlzdHJ1Y3QgdzEwMF9tb2RlICptb2RlID0gcGFyLT5tb2RlOworCXN0cnVjdCB3MTAwX2dlbl9yZWdzICpyZWdzID0gcGFyLT5tYWNoLT5yZWdzOworCXVuaW9uIGFjdGl2ZV9oX2Rpc3BfdSBhY3RpdmVfaF9kaXNwOworCXVuaW9uIGFjdGl2ZV92X2Rpc3BfdSBhY3RpdmVfdl9kaXNwOworCXVuaW9uIGdyYXBoaWNfaF9kaXNwX3UgZ3JhcGhpY19oX2Rpc3A7CisJdW5pb24gZ3JhcGhpY192X2Rpc3BfdSBncmFwaGljX3ZfZGlzcDsKKwl1bmlvbiBjcnRjX3RvdGFsX3UgY3J0Y190b3RhbDsKIAotCS8qIFByZXZlbnQgZGlzcGxheSB1cGRhdGVzICovCi0JZGlzcF9kYl9idWZfd3JfY250bC5mLmRiX2J1Zl9jbnRsID0gMHgxZTsKLQlkaXNwX2RiX2J1Zl93cl9jbnRsLmYudXBkYXRlX2RiX2J1ZiA9IDA7Ci0JZGlzcF9kYl9idWZfd3JfY250bC5mLmVuX2RiX2J1ZiA9IDA7Ci0Jd3JpdGVsKCh1MzIpIChkaXNwX2RiX2J1Zl93cl9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbURJU1BfREJfQlVGX0NOVEwpOworCS8qIHczMjAwIGRvZXNudCBsaWtlIHVuZGVmaW5lZCBiaXRzIGJlaW5nIHNldCBzbyB6ZXJvIHJlZ2lzdGVyIHZhbHVlcyBmaXJzdCAqLwogCi0Jc3dpdGNoKG1vZGUpIHsKLQljYXNlIExDRF9TSEFSUF9RVkdBOgotCQl3MTAwX3NldF9zbG93c3lzY2xrKDEyKTsJLyogdXNlIGNyeXN0YWwgLS0gMTIuNU1IeiAqLwotCQkvKiBub3QgdXNlIFBMTCAqLworCWFjdGl2ZV9oX2Rpc3AudmFsID0gMDsKKwlhY3RpdmVfaF9kaXNwLmYuYWN0aXZlX2hfc3RhcnQ9bW9kZS0+bGVmdF9tYXJnaW47CisJYWN0aXZlX2hfZGlzcC5mLmFjdGl2ZV9oX2VuZD1tb2RlLT5sZWZ0X21hcmdpbiArIG1vZGUtPnhyZXM7CisJd3JpdGVsKGFjdGl2ZV9oX2Rpc3AudmFsLCByZW1hcHBlZF9yZWdzICsgbW1BQ1RJVkVfSF9ESVNQKTsKIAotCQl3cml0ZWwoMHg3RkZGODAwMCwgcmVtYXBwZWRfcmVncyArIG1tTUNfRVhUX01FTV9MT0NBVElPTik7Ci0JCXdyaXRlbCgweDg1RkY4MDAwLCByZW1hcHBlZF9yZWdzICsgbW1NQ19GQl9MT0NBVElPTik7Ci0JCXdyaXRlbCgweDAwMDAwMDAzLCByZW1hcHBlZF9yZWdzICsgbW1MQ0RfRk9STUFUKTsKLQkJd3JpdGVsKDB4MDBDRjFDMDYsIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfQ1RSTCk7Ci0JCXdyaXRlbCgweDAxNDEwMTQ1LCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX1RPVEFMKTsKLQkJd3JpdGVsKDB4MDExNzAwMjcsIHJlbWFwcGVkX3JlZ3MgKyBtbUFDVElWRV9IX0RJU1ApOwotCQl3cml0ZWwoMHgwMTQxMDAwMSwgcmVtYXBwZWRfcmVncyArIG1tQUNUSVZFX1ZfRElTUCk7Ci0JCXdyaXRlbCgweDAxMTcwMDI3LCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX0hfRElTUCk7Ci0JCXdyaXRlbCgweDAxNDEwMDAxLCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX1ZfRElTUCk7Ci0JCXdyaXRlbCgweDgxMTcwMDI3LCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX1NTKTsKLQkJd3JpdGVsKDB4QTAxNDAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfTFMpOwotCQl3cml0ZWwoMHgwMDQwMDAwOCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19SRVYpOwotCQl3cml0ZWwoMHhBMDAwMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19EQ0xLKTsKLQkJd3JpdGVsKDB4QzAxNDAwMTQsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfR1MpOwotCQl3cml0ZWwoMHgwMDAxMDE0MSwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19WUE9TX0dTKTsKLQkJd3JpdGVsKDB4ODAxNTAxMEYsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfR0NMSyk7Ci0JCXdyaXRlbCgweDgwMTAwMTEwLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0dPRSk7Ci0JCXdyaXRlbCgweDAwMDAwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0ZSQU1FKTsKLQkJd3JpdGVsKDB4MDAwMDAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfRlJBTUVfVlBPUyk7Ci0JCXdyaXRlbCgweDAxQ0MwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1MQ0REX0NOVEwxKTsKLQkJd3JpdGVsKDB4MDAwM0ZGRkYsIHJlbWFwcGVkX3JlZ3MgKyBtbUxDRERfQ05UTDIpOwotCQl3cml0ZWwoMHgwMEZGRkYwRCwgcmVtYXBwZWRfcmVncyArIG1tR0VOTENEX0NOVEwxKTsKLQkJd3JpdGVsKDB4MDAzRjMwMDMsIHJlbWFwcGVkX3JlZ3MgKyBtbUdFTkxDRF9DTlRMMik7Ci0JCXdyaXRlbCgweDAwMDAwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0RFRkFVTFRfQ09VTlQpOwotCQl3cml0ZWwoMHgwMDAwRkYwMCwgcmVtYXBwZWRfcmVncyArIG1tTENEX0JBQ0tHUk9VTkRfQ09MT1IpOwotCQl3cml0ZWwoMHgwMDAxMDJhYSwgcmVtYXBwZWRfcmVncyArIG1tR0VOTENEX0NOVEwzKTsKLQkJd3JpdGVsKDB4MDA4MDAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfT0ZGU0VUKTsKLQkJd3JpdGVsKDB4MDAwMDAxZTAsIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfUElUQ0gpOwotCQl3cml0ZWwoMHgwMDAwMDBiZiwgcmVtYXBwZWRfcmVncyArIG1tR1BJT19EQVRBKTsKLQkJd3JpdGVsKDB4MDNjMGZlZmYsIHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fQ05UTDIpOwotCQl3cml0ZWwoMHgwMDAwMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tR1BJT19DTlRMMSk7Ci0JCXdyaXRlbCgweDQxMDYwMDEwLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX1BTMV9BQ1RJVkUpOwotCQlicmVhazsKLQljYXNlIExDRF9TSEFSUF9WR0E6Ci0JCXcxMDBfc2V0X3Nsb3dzeXNjbGsoMTIpOwkvKiB1c2UgY3J5c3RhbCAtLSAxMi41TUh6ICovCi0JCXcxMDBfc2V0X2Zhc3RzeXNjbGsoY3VycmVudF9wYXItPmZhc3RzeXNjbGtfbW9kZSk7CS8qIHVzZSBQTEwgLS0gNzUuME1IeiAqLwotCQl3MTAwX3B3cl9zdGF0ZS5wY2xrX2NudGwuZi5wY2xrX3NyY19zZWwgPSAweDE7Ci0JCXcxMDBfcHdyX3N0YXRlLnBjbGtfY250bC5mLnBjbGtfcG9zdF9kaXYgPSAweDI7Ci0JCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBDTEtfQ05UTCk7Ci0JCXdyaXRlbCgweDE1RkYxMDAwLCByZW1hcHBlZF9yZWdzICsgbW1NQ19GQl9MT0NBVElPTik7Ci0JCXdyaXRlbCgweDlGRkY4MDAwLCByZW1hcHBlZF9yZWdzICsgbW1NQ19FWFRfTUVNX0xPQ0FUSU9OKTsKLQkJd3JpdGVsKDB4MDAwMDAwMDMsIHJlbWFwcGVkX3JlZ3MgKyBtbUxDRF9GT1JNQVQpOwotCQl3cml0ZWwoMHgwMERFMUQ2NiwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19DVFJMKTsKKwlhY3RpdmVfdl9kaXNwLnZhbCA9IDA7CisJYWN0aXZlX3ZfZGlzcC5mLmFjdGl2ZV92X3N0YXJ0PW1vZGUtPnVwcGVyX21hcmdpbjsKKwlhY3RpdmVfdl9kaXNwLmYuYWN0aXZlX3ZfZW5kPW1vZGUtPnVwcGVyX21hcmdpbiArIG1vZGUtPnlyZXM7CisJd3JpdGVsKGFjdGl2ZV92X2Rpc3AudmFsLCByZW1hcHBlZF9yZWdzICsgbW1BQ1RJVkVfVl9ESVNQKTsKIAotCQl3cml0ZWwoMHgwMjgzMDI4QiwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19UT1RBTCk7Ci0JCXdyaXRlbCgweDAyMzYwMDU2LCByZW1hcHBlZF9yZWdzICsgbW1BQ1RJVkVfSF9ESVNQKTsKLQkJd3JpdGVsKDB4MDI4MzAwMDMsIHJlbWFwcGVkX3JlZ3MgKyBtbUFDVElWRV9WX0RJU1ApOwotCQl3cml0ZWwoMHgwMjM2MDA1NiwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19IX0RJU1ApOwotCQl3cml0ZWwoMHgwMjgzMDAwMywgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19WX0RJU1ApOwotCQl3cml0ZWwoMHg4MjM2MDA1NiwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19TUyk7Ci0JCXdyaXRlbCgweEEwMjgwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0xTKTsKLQkJd3JpdGVsKDB4MDA0MDAwMDgsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfUkVWKTsKLQkJd3JpdGVsKDB4QTAwMDAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfRENMSyk7Ci0JCXdyaXRlbCgweDgwMjgwMDI4LCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0dTKTsKLQkJd3JpdGVsKDB4MDI4MzAwMDIsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfVlBPU19HUyk7Ci0JCXdyaXRlbCgweDgwMTUwMTBGLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0dDTEspOwotCQl3cml0ZWwoMHg4MDEwMDExMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19HT0UpOwotCQl3cml0ZWwoMHgwMDAwMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19GUkFNRSk7Ci0JCXdyaXRlbCgweDAwMDAwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0ZSQU1FX1ZQT1MpOwotCQl3cml0ZWwoMHgwMUNDMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tTENERF9DTlRMMSk7Ci0JCXdyaXRlbCgweDAwMDNGRkZGLCByZW1hcHBlZF9yZWdzICsgbW1MQ0REX0NOVEwyKTsKLQkJd3JpdGVsKDB4MDBGRkZGMEQsIHJlbWFwcGVkX3JlZ3MgKyBtbUdFTkxDRF9DTlRMMSk7Ci0JCXdyaXRlbCgweDAwM0YzMDAzLCByZW1hcHBlZF9yZWdzICsgbW1HRU5MQ0RfQ05UTDIpOwotCQl3cml0ZWwoMHgwMDAwMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19ERUZBVUxUX0NPVU5UKTsKLQkJd3JpdGVsKDB4MDAwMEZGMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUxDRF9CQUNLR1JPVU5EX0NPTE9SKTsKLQkJd3JpdGVsKDB4MDAwMTAyYWEsIHJlbWFwcGVkX3JlZ3MgKyBtbUdFTkxDRF9DTlRMMyk7Ci0JCXdyaXRlbCgweDAwODAwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX09GRlNFVCk7Ci0JCXdyaXRlbCgweDAwMDAwM0MwLCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX1BJVENIKTsKLQkJd3JpdGVsKDB4MDAwMDAwYmYsIHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fREFUQSk7Ci0JCXdyaXRlbCgweDAzYzBmZWZmLCByZW1hcHBlZF9yZWdzICsgbW1HUElPX0NOVEwyKTsKLQkJd3JpdGVsKDB4MDAwMDAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fQ05UTDEpOwotCQl3cml0ZWwoMHg0MTA2MDAxMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19QUzFfQUNUSVZFKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorCWdyYXBoaWNfaF9kaXNwLnZhbCA9IDA7CisJZ3JhcGhpY19oX2Rpc3AuZi5ncmFwaGljX2hfc3RhcnQ9bW9kZS0+bGVmdF9tYXJnaW47CisJZ3JhcGhpY19oX2Rpc3AuZi5ncmFwaGljX2hfZW5kPW1vZGUtPmxlZnRfbWFyZ2luICsgbW9kZS0+eHJlczsKKwl3cml0ZWwoZ3JhcGhpY19oX2Rpc3AudmFsLCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX0hfRElTUCk7CisKKwlncmFwaGljX3ZfZGlzcC52YWwgPSAwOworCWdyYXBoaWNfdl9kaXNwLmYuZ3JhcGhpY192X3N0YXJ0PW1vZGUtPnVwcGVyX21hcmdpbjsKKwlncmFwaGljX3ZfZGlzcC5mLmdyYXBoaWNfdl9lbmQ9bW9kZS0+dXBwZXJfbWFyZ2luICsgbW9kZS0+eXJlczsKKwl3cml0ZWwoZ3JhcGhpY192X2Rpc3AudmFsLCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX1ZfRElTUCk7CisKKwljcnRjX3RvdGFsLnZhbCA9IDA7CisJY3J0Y190b3RhbC5mLmNydGNfaF90b3RhbD1tb2RlLT5sZWZ0X21hcmdpbiAgKyBtb2RlLT54cmVzICsgbW9kZS0+cmlnaHRfbWFyZ2luOworCWNydGNfdG90YWwuZi5jcnRjX3ZfdG90YWw9bW9kZS0+dXBwZXJfbWFyZ2luICsgbW9kZS0+eXJlcyArIG1vZGUtPmxvd2VyX21hcmdpbjsKKwl3cml0ZWwoY3J0Y190b3RhbC52YWwsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfVE9UQUwpOworCisJd3JpdGVsKG1vZGUtPmNydGNfc3MsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfU1MpOworCXdyaXRlbChtb2RlLT5jcnRjX2xzLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0xTKTsKKwl3cml0ZWwobW9kZS0+Y3J0Y19ncywgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19HUyk7CisJd3JpdGVsKG1vZGUtPmNydGNfdnBvc19ncywgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19WUE9TX0dTKTsKKwl3cml0ZWwobW9kZS0+Y3J0Y19yZXYsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfUkVWKTsKKwl3cml0ZWwobW9kZS0+Y3J0Y19kY2xrLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0RDTEspOworCXdyaXRlbChtb2RlLT5jcnRjX2djbGssIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfR0NMSyk7CisJd3JpdGVsKG1vZGUtPmNydGNfZ29lLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0dPRSk7CisJd3JpdGVsKG1vZGUtPmNydGNfcHMxX2FjdGl2ZSwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19QUzFfQUNUSVZFKTsKKworCXdyaXRlbChyZWdzLT5sY2RfZm9ybWF0LCByZW1hcHBlZF9yZWdzICsgbW1MQ0RfRk9STUFUKTsKKwl3cml0ZWwocmVncy0+bGNkZF9jbnRsMSwgcmVtYXBwZWRfcmVncyArIG1tTENERF9DTlRMMSk7CisJd3JpdGVsKHJlZ3MtPmxjZGRfY250bDIsIHJlbWFwcGVkX3JlZ3MgKyBtbUxDRERfQ05UTDIpOworCXdyaXRlbChyZWdzLT5nZW5sY2RfY250bDEsIHJlbWFwcGVkX3JlZ3MgKyBtbUdFTkxDRF9DTlRMMSk7CisJd3JpdGVsKHJlZ3MtPmdlbmxjZF9jbnRsMiwgcmVtYXBwZWRfcmVncyArIG1tR0VOTENEX0NOVEwyKTsKKwl3cml0ZWwocmVncy0+Z2VubGNkX2NudGwzLCByZW1hcHBlZF9yZWdzICsgbW1HRU5MQ0RfQ05UTDMpOworCisJd3JpdGVsKDB4MDAwMDAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfRlJBTUUpOworCXdyaXRlbCgweDAwMDAwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0ZSQU1FX1ZQT1MpOworCXdyaXRlbCgweDAwMDAwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0RFRkFVTFRfQ09VTlQpOworCXdyaXRlbCgweDAwMDBGRjAwLCByZW1hcHBlZF9yZWdzICsgbW1MQ0RfQkFDS0dST1VORF9DT0xPUik7CiAKIAkvKiBIYWNrIGZvciBvdmVybGF5IGluIGV4dCBtZW1vcnkgKi8KIAl0ZW1wMzIgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1ESVNQX0RFQlVHMik7CiAJdGVtcDMyIHw9IDB4YzAwMDAwMDA7CiAJd3JpdGVsKHRlbXAzMiwgcmVtYXBwZWRfcmVncyArIG1tRElTUF9ERUJVRzIpOwotCi0JLyogUmUtZW5hYmxlIGRpc3BsYXkgdXBkYXRlcyAqLwotCWRpc3BfZGJfYnVmX3dyX2NudGwuZi5kYl9idWZfY250bCA9IDB4MWU7Ci0JZGlzcF9kYl9idWZfd3JfY250bC5mLnVwZGF0ZV9kYl9idWYgPSAxOwotCWRpc3BfZGJfYnVmX3dyX2NudGwuZi5lbl9kYl9idWYgPSAxOwotCXdyaXRlbCgodTMyKSAoZGlzcF9kYl9idWZfd3JfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1ESVNQX0RCX0JVRl9DTlRMKTsKIH0KIAogCi1zdGF0aWMgdm9pZCB3MTAwX3NldF92Z2Ffcm90YXRpb25fcmVncyh1MTYgZGl2aWRlciwgdW5zaWduZWQgbG9uZyBjdHJsLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBwaXRjaCkKK3N0YXRpYyB2b2lkIHcxMDBfc2V0dXBfbWVtb3J5KHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCiB7Ci0JdzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLmYucGNsa19zcmNfc2VsID0gMHgxOworCXVuaW9uIG1jX2V4dF9tZW1fbG9jYXRpb25fdSBleHRtZW1fbG9jYXRpb247CisJdW5pb24gbWNfZmJfbG9jYXRpb25fdSBpbnRtZW1fbG9jYXRpb247CisJc3RydWN0IHcxMDBfbWVtX2luZm8gKm1lbSA9IHBhci0+bWFjaC0+bWVtOworCXN0cnVjdCB3MTAwX2JtX21lbV9pbmZvICpibV9tZW0gPSBwYXItPm1hY2gtPmJtX21lbTsKKworCWlmICghcGFyLT5leHRtZW1fYWN0aXZlKSB7CisJCXcxMDBfc3VzcGVuZChXMTAwX1NVU1BFTkRfRVhUTUVNKTsKKworCQkvKiBNYXAgSW50ZXJuYWwgTWVtb3J5IGF0IEZCIEJhc2UgKi8KKwkJaW50bWVtX2xvY2F0aW9uLmYubWNfZmJfc3RhcnQgPSBXMTAwX0ZCX0JBU0UgPj4gODsKKwkJaW50bWVtX2xvY2F0aW9uLmYubWNfZmJfdG9wID0gKFcxMDBfRkJfQkFTRStNRU1fSU5UX1NJWkUpID4+IDg7CisJCXdyaXRlbCgodTMyKSAoaW50bWVtX2xvY2F0aW9uLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbU1DX0ZCX0xPQ0FUSU9OKTsKKworCQkvKiBVbm1hcCBFeHRlcm5hbCBNZW1vcnkgLSB2YWx1ZSBpcyAqcHJvYmFibHkqIGlycmVsZXZhbnQgYnV0IG1heSBoYXZlIG1lYW5pbmcKKwkJICAgdG8gYWNjZWxlcmF0aW9uIGxpYnJhcmllcyAqLworCQlleHRtZW1fbG9jYXRpb24uZi5tY19leHRfbWVtX3N0YXJ0ID0gTUVNX0VYVF9CQVNFX1ZBTFVFID4+IDg7CisJCWV4dG1lbV9sb2NhdGlvbi5mLm1jX2V4dF9tZW1fdG9wID0gKE1FTV9FWFRfQkFTRV9WQUxVRS0xKSA+PiA4OworCQl3cml0ZWwoKHUzMikgKGV4dG1lbV9sb2NhdGlvbi52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1NQ19FWFRfTUVNX0xPQ0FUSU9OKTsKKwl9IGVsc2UgeworCQkvKiBNYXAgSW50ZXJuYWwgTWVtb3J5IHRvIGl0cyBkZWZhdWx0IGxvY2F0aW9uICovCisJCWludG1lbV9sb2NhdGlvbi5mLm1jX2ZiX3N0YXJ0ID0gTUVNX0lOVF9CQVNFX1ZBTFVFID4+IDg7CisJCWludG1lbV9sb2NhdGlvbi5mLm1jX2ZiX3RvcCA9IChNRU1fSU5UX0JBU0VfVkFMVUUrTUVNX0lOVF9TSVpFKSA+PiA4OworCQl3cml0ZWwoKHUzMikgKGludG1lbV9sb2NhdGlvbi52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1NQ19GQl9MT0NBVElPTik7CisKKwkJLyogTWFwIEV4dGVybmFsIE1lbW9yeSBhdCBGQiBCYXNlICovCisJCWV4dG1lbV9sb2NhdGlvbi5mLm1jX2V4dF9tZW1fc3RhcnQgPSBXMTAwX0ZCX0JBU0UgPj4gODsKKwkJZXh0bWVtX2xvY2F0aW9uLmYubWNfZXh0X21lbV90b3AgPSAoVzEwMF9GQl9CQVNFK3Bhci0+bWFjaC0+bWVtLT5zaXplKSA+PiA4OworCQl3cml0ZWwoKHUzMikgKGV4dG1lbV9sb2NhdGlvbi52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1NQ19FWFRfTUVNX0xPQ0FUSU9OKTsKKworCQl3cml0ZWwoMHgwMDAwNzgwMCwgcmVtYXBwZWRfcmVncyArIG1tTUNfQklTVF9DVFJMKTsKKwkJd3JpdGVsKG1lbS0+ZXh0X2NudGwsIHJlbWFwcGVkX3JlZ3MgKyBtbU1FTV9FWFRfQ05UTCk7CisJCXdyaXRlbCgweDAwMjAwMDIxLCByZW1hcHBlZF9yZWdzICsgbW1NRU1fU0RSQU1fTU9ERV9SRUcpOworCQl1ZGVsYXkoMTAwKTsKKwkJd3JpdGVsKDB4ODAyMDAwMjEsIHJlbWFwcGVkX3JlZ3MgKyBtbU1FTV9TRFJBTV9NT0RFX1JFRyk7CisJCXVkZWxheSgxMDApOworCQl3cml0ZWwobWVtLT5zZHJhbV9tb2RlX3JlZywgcmVtYXBwZWRfcmVncyArIG1tTUVNX1NEUkFNX01PREVfUkVHKTsKKwkJdWRlbGF5KDEwMCk7CisJCXdyaXRlbChtZW0tPmV4dF90aW1pbmdfY250bCwgcmVtYXBwZWRfcmVncyArIG1tTUVNX0VYVF9USU1JTkdfQ05UTCk7CisJCXdyaXRlbChtZW0tPmlvX2NudGwsIHJlbWFwcGVkX3JlZ3MgKyBtbU1FTV9JT19DTlRMKTsKKwkJaWYgKGJtX21lbSkgeworCQkJd3JpdGVsKGJtX21lbS0+ZXh0X21lbV9idywgcmVtYXBwZWRfcmVncyArIG1tQk1fRVhUX01FTV9CQU5EV0lEVEgpOworCQkJd3JpdGVsKGJtX21lbS0+b2Zmc2V0LCByZW1hcHBlZF9yZWdzICsgbW1CTV9PRkZTRVQpOworCQkJd3JpdGVsKGJtX21lbS0+ZXh0X3RpbWluZ19jdGwsIHJlbWFwcGVkX3JlZ3MgKyBtbUJNX01FTV9FWFRfVElNSU5HX0NOVEwpOworCQkJd3JpdGVsKGJtX21lbS0+ZXh0X2NudGwsIHJlbWFwcGVkX3JlZ3MgKyBtbUJNX01FTV9FWFRfQ05UTCk7CisJCQl3cml0ZWwoYm1fbWVtLT5tb2RlX3JlZywgcmVtYXBwZWRfcmVncyArIG1tQk1fTUVNX01PREVfUkVHKTsKKwkJCXdyaXRlbChibV9tZW0tPmlvX2NudGwsIHJlbWFwcGVkX3JlZ3MgKyBtbUJNX01FTV9JT19DTlRMKTsKKwkJCXdyaXRlbChibV9tZW0tPmNvbmZpZywgcmVtYXBwZWRfcmVncyArIG1tQk1fQ09ORklHKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgdzEwMF9zZXRfZGlzcHJlZ3Moc3RydWN0IHcxMDBmYl9wYXIgKnBhcikKK3sKKwl1bnNpZ25lZCBsb25nIHJvdD0wLCBkaXZpZGVyLCBvZmZzZXQ9MDsKKwl1bmlvbiBncmFwaGljX2N0cmxfdSBncmFwaGljX2N0cmw7CisKKwkvKiBTZWUgaWYgdGhlIG1vZGUgaGFzIGJlZW4gcm90YXRlZCAqLworCWlmIChwYXItPnhyZXMgPT0gcGFyLT5tb2RlLT54cmVzKSB7CisJCWlmIChwYXItPmZsaXApIHsKKwkJCXJvdD0zOyAvKiAxODAgZGVncmVlICovCisJCQlvZmZzZXQ9KHBhci0+eHJlcyAqIHBhci0+eXJlcykgLSAxOworCQl9IC8qIGVsc2UgMCBkZWdyZWUgKi8KKwkJZGl2aWRlciA9IHBhci0+bW9kZS0+cGl4Y2xrX2RpdmlkZXI7CisJfSBlbHNlIHsKKwkJaWYgKHBhci0+ZmxpcCkgeworCQkJcm90PTI7IC8qIDI3MCBkZWdyZWUgKi8KKwkJCW9mZnNldD1wYXItPnhyZXMgLSAxOworCQl9IGVsc2UgeworCQkJcm90PTE7IC8qIDkwIGRlZ3JlZSAqLworCQkJb2Zmc2V0PXBhci0+eHJlcyAqIChwYXItPnlyZXMgLSAxKTsKKwkJfQorCQlkaXZpZGVyID0gcGFyLT5tb2RlLT5waXhjbGtfZGl2aWRlcl9yb3RhdGVkOworCX0KKworCWdyYXBoaWNfY3RybC52YWwgPSAwOyAvKiB3MzJ4eCBkb2Vzbid0IGxpa2UgdW5kZWZpbmVkIGJpdHMgKi8KKwlzd2l0Y2ggKHBhci0+Y2hpcF9pZCkgeworCQljYXNlIENISVBfSURfVzEwMDoKKwkJCWdyYXBoaWNfY3RybC5mX3cxMDAuY29sb3JfZGVwdGg9NjsKKwkJCWdyYXBoaWNfY3RybC5mX3cxMDAuZW5fY3J0Yz0xOworCQkJZ3JhcGhpY19jdHJsLmZfdzEwMC5lbl9ncmFwaGljX3JlcT0xOworCQkJZ3JhcGhpY19jdHJsLmZfdzEwMC5lbl9ncmFwaGljX2NydGM9MTsKKwkJCWdyYXBoaWNfY3RybC5mX3cxMDAubGNkX3BjbGtfb249MTsKKwkJCWdyYXBoaWNfY3RybC5mX3cxMDAubGNkX3NjbGtfb249MTsKKwkJCWdyYXBoaWNfY3RybC5mX3cxMDAubG93X3Bvd2VyX29uPTA7CisJCQlncmFwaGljX2N0cmwuZl93MTAwLnJlcV9mcmVxPTA7CisJCQlncmFwaGljX2N0cmwuZl93MTAwLnBvcnRyYWl0X21vZGU9cm90OworCisJCQkvKiBaYXVydXMgbmVlZHMgdGhpcyAqLworCQkJc3dpdGNoKHBhci0+eHJlcykgeworCQkJCWNhc2UgMjQwOgorCQkJCWNhc2UgMzIwOgorCQkJCWRlZmF1bHQ6CisJCQkJCWdyYXBoaWNfY3RybC5mX3cxMDAudG90YWxfcmVxX2dyYXBoaWM9MHhhMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0ODA6CisJCQkJY2FzZSA2NDA6CisJCQkJCXN3aXRjaChyb3QpIHsKKwkJCQkJCWNhc2UgMDogIC8qIDAgKi8KKwkJCQkJCWNhc2UgMzogIC8qIDE4MCAqLworCQkJCQkJCWdyYXBoaWNfY3RybC5mX3cxMDAubG93X3Bvd2VyX29uPTE7CisJCQkJCQkJZ3JhcGhpY19jdHJsLmZfdzEwMC5yZXFfZnJlcT01OworCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDE6ICAvKiA5MCAqLworCQkJCQkJY2FzZSAyOiAgLyogMjcwICovCisJCQkJCQkJZ3JhcGhpY19jdHJsLmZfdzEwMC5yZXFfZnJlcT00OworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlncmFwaGljX2N0cmwuZl93MTAwLnRvdGFsX3JlcV9ncmFwaGljPTB4ZjA7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ0hJUF9JRF9XMzIwMDoKKwkJY2FzZSBDSElQX0lEX1czMjIwOgorCQkJZ3JhcGhpY19jdHJsLmZfdzMyeHguY29sb3JfZGVwdGg9NjsKKwkJCWdyYXBoaWNfY3RybC5mX3czMnh4LmVuX2NydGM9MTsKKwkJCWdyYXBoaWNfY3RybC5mX3czMnh4LmVuX2dyYXBoaWNfcmVxPTE7CisJCQlncmFwaGljX2N0cmwuZl93MzJ4eC5lbl9ncmFwaGljX2NydGM9MTsKKwkJCWdyYXBoaWNfY3RybC5mX3czMnh4LmxjZF9wY2xrX29uPTE7CisJCQlncmFwaGljX2N0cmwuZl93MzJ4eC5sY2Rfc2Nsa19vbj0xOworCQkJZ3JhcGhpY19jdHJsLmZfdzMyeHgubG93X3Bvd2VyX29uPTA7CisJCQlncmFwaGljX2N0cmwuZl93MzJ4eC5yZXFfZnJlcT0wOworCQkJZ3JhcGhpY19jdHJsLmZfdzMyeHgudG90YWxfcmVxX2dyYXBoaWM9cGFyLT5tb2RlLT54cmVzID4+IDE7IC8qIHBhbmVsIHhyZXMsIG5vdCBtb2RlICovCisJCQlncmFwaGljX2N0cmwuZl93MzJ4eC5wb3J0cmFpdF9tb2RlPXJvdDsKKwkJCWJyZWFrOworCX0KKworCS8qIFNldCB0aGUgcGl4ZWwgY2xvY2sgc291cmNlIGFuZCBkaXZpZGVyICovCisJdzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLmYucGNsa19zcmNfc2VsID0gcGFyLT5tb2RlLT5waXhjbGtfc3JjOwogCXcxMDBfcHdyX3N0YXRlLnBjbGtfY250bC5mLnBjbGtfcG9zdF9kaXYgPSBkaXZpZGVyOwogCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBDTEtfQ05UTCk7CiAKLQl3cml0ZWwoY3RybCwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19DVFJMKTsKLQl3cml0ZWwob2Zmc2V0LCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX09GRlNFVCk7Ci0Jd3JpdGVsKHBpdGNoLCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX1BJVENIKTsKLQotCS8qIFJlLWVuYWJsZSBkaXNwbGF5IHVwZGF0ZXMgKi8KLQl3cml0ZWwoMHgwMDAwMDA3YiwgcmVtYXBwZWRfcmVncyArIG1tRElTUF9EQl9CVUZfQ05UTCk7CisJd3JpdGVsKGdyYXBoaWNfY3RybC52YWwsIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfQ1RSTCk7CisJd3JpdGVsKFcxMDBfRkJfQkFTRSArICgob2Zmc2V0ICogQklUU19QRVJfUElYRUwvOCkmfjB4MDNVTCksIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfT0ZGU0VUKTsKKwl3cml0ZWwoKHBhci0+eHJlcypCSVRTX1BFUl9QSVhFTC84KSwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19QSVRDSCk7CiB9CiAKIAotc3RhdGljIHZvaWQgdzEwMF9pbml0X3ZnYV9yb3RhdGlvbih1MTYgZGVnKQorLyoKKyAqIFdvcmsgb3V0IGhvdyBsb25nIHRoZSBzeW5jIHB1bHNlIGxhc3RzCisgKiBWYWx1ZSBpcyAxLyh0aW1lIGluIHNlY29uZHMpCisgKi8KK3N0YXRpYyB2b2lkIGNhbGNfaHN5bmMoc3RydWN0IHcxMDBmYl9wYXIgKnBhcikKIHsKLQlzd2l0Y2goZGVnKSB7Ci0JY2FzZSAwOgotCQl3MTAwX3NldF92Z2Ffcm90YXRpb25fcmVncygweDAyLCAweDAwREUxRDY2LCAweDAwODAwMDAwLCAweDAwMDAwM2MwKTsKLQkJYnJlYWs7Ci0JY2FzZSA5MDoKLQkJdzEwMF9zZXRfdmdhX3JvdGF0aW9uX3JlZ3MoMHgwNiwgMHgwMERFMUQwZSwgMHgwMDg5NWIwMCwgMHgwMDAwMDUwMCk7Ci0JCWJyZWFrOwotCWNhc2UgMTgwOgotCQl3MTAwX3NldF92Z2Ffcm90YXRpb25fcmVncygweDAyLCAweDAwREUxRDdlLCAweDAwODk1ZmZjLCAweDAwMDAwM2MwKTsKLQkJYnJlYWs7Ci0JY2FzZSAyNzA6Ci0JCXcxMDBfc2V0X3ZnYV9yb3RhdGlvbl9yZWdzKDB4MDYsIDB4MDBERTFEMTYsIDB4MDA4MDA0ZmMsIDB4MDAwMDA1MDApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBub3Qtc3VwcG9ydCAqLwotCQlicmVhazsKLQl9CisJdW5zaWduZWQgbG9uZyBoc3luYzsKKwlzdHJ1Y3QgdzEwMF9tb2RlICptb2RlID0gcGFyLT5tb2RlOworCXVuaW9uIGNydGNfc3NfdSBjcnRjX3NzOworCisJaWYgKG1vZGUtPnBpeGNsa19zcmMgPT0gQ0xLX1NSQ19YVEFMKQorCQloc3luYz1wYXItPm1hY2gtPnh0YWxfZnJlcTsKKwllbHNlCisJCWhzeW5jPSgocGFyLT5mYXN0cGxsX21vZGUgJiYgbW9kZS0+ZmFzdF9wbGxfZnJlcSkgPyBtb2RlLT5mYXN0X3BsbF9mcmVxIDogbW9kZS0+cGxsX2ZyZXEpKjEwMDAwMDsKKworCWhzeW5jIC89ICh3MTAwX3B3cl9zdGF0ZS5wY2xrX2NudGwuZi5wY2xrX3Bvc3RfZGl2ICsgMSk7CisKKwljcnRjX3NzLnZhbCA9IHJlYWRsKHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfU1MpOworCWlmIChjcnRjX3NzLnZhbCkKKwkJcGFyLT5oc3luY19sZW4gPSBoc3luYyAvIChjcnRjX3NzLmYuc3NfZW5kLWNydGNfc3MuZi5zc19zdGFydCk7CisJZWxzZQorCQlwYXItPmhzeW5jX2xlbiA9IDA7CiB9CiAKLQotc3RhdGljIHZvaWQgdzEwMF9zZXRfcXZnYV9yb3RhdGlvbl9yZWdzKHVuc2lnbmVkIGxvbmcgY3RybCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgcGl0Y2gpCi17Ci0Jd3JpdGVsKGN0cmwsIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfQ1RSTCk7Ci0Jd3JpdGVsKG9mZnNldCwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19PRkZTRVQpOwotCXdyaXRlbChwaXRjaCwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19QSVRDSCk7Ci0KLQkvKiBSZS1lbmFibGUgZGlzcGxheSB1cGRhdGVzICovCi0Jd3JpdGVsKDB4MDAwMDAwN2IsIHJlbWFwcGVkX3JlZ3MgKyBtbURJU1BfREJfQlVGX0NOVEwpOwotfQotCi0KLXN0YXRpYyB2b2lkIHcxMDBfaW5pdF9xdmdhX3JvdGF0aW9uKHUxNiBkZWcpCi17Ci0Jc3dpdGNoKGRlZykgewotCWNhc2UgMDoKLQkJdzEwMF9zZXRfcXZnYV9yb3RhdGlvbl9yZWdzKDB4MDBkNDFjMDYsIDB4MDA4MDAwMDAsIDB4MDAwMDAxZTApOwotCQlicmVhazsKLQljYXNlIDkwOgotCQl3MTAwX3NldF9xdmdhX3JvdGF0aW9uX3JlZ3MoMHgwMGQ0MWMwRSwgMHgwMDgyNTU4MCwgMHgwMDAwMDI4MCk7Ci0JCWJyZWFrOwotCWNhc2UgMTgwOgotCQl3MTAwX3NldF9xdmdhX3JvdGF0aW9uX3JlZ3MoMHgwMGQ0MWMxZSwgMHgwMDgyNTdmYywgMHgwMDAwMDFlMCk7Ci0JCWJyZWFrOwotCWNhc2UgMjcwOgotCQl3MTAwX3NldF9xdmdhX3JvdGF0aW9uX3JlZ3MoMHgwMGQ0MWMxNiwgMHgwMDgwMDI3YywgMHgwMDAwMDI4MCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIG5vdC1zdXBwb3J0ICovCi0JCWJyZWFrOwotCX0KLX0KLQotCiBzdGF0aWMgdm9pZCB3MTAwX3N1c3BlbmQodTMyIG1vZGUpCiB7CiAJdTMyIHZhbDsKQEAgLTEzODcsMzAgKzEzNzcsMjggQEAKIAl3cml0ZWwoMHgwMEZGMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tTUNfUEVSRl9NT05fQ05UTCk7CiAKIAl2YWwgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1NRU1fRVhUX1RJTUlOR19DTlRMKTsKLQl2YWwgJj0gfigweDAwMTAwMDAwKTsJLyogYml0MjA9MCAqLwotCXZhbCB8PSAweEZGMDAwMDAwOwkvKiBiaXQzMToyND0weGZmICovCisJdmFsICY9IH4oMHgwMDEwMDAwMCk7ICAvKiBiaXQyMD0wICovCisJdmFsIHw9IDB4RkYwMDAwMDA7ICAgICAvKiBiaXQzMToyND0weGZmICovCiAJd3JpdGVsKHZhbCwgcmVtYXBwZWRfcmVncyArIG1tTUVNX0VYVF9USU1JTkdfQ05UTCk7CiAKIAl2YWwgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1NRU1fRVhUX0NOVEwpOwotCXZhbCAmPSB+KDB4MDAwNDAwMDApOwkvKiBiaXQxOD0wICovCi0JdmFsIHw9IDB4MDAwODAwMDA7CS8qIGJpdDE5PTEgKi8KKwl2YWwgJj0gfigweDAwMDQwMDAwKTsgIC8qIGJpdDE4PTAgKi8KKwl2YWwgfD0gMHgwMDA4MDAwMDsgICAgIC8qIGJpdDE5PTEgKi8KIAl3cml0ZWwodmFsLCByZW1hcHBlZF9yZWdzICsgbW1NRU1fRVhUX0NOVEwpOwogCi0JdWRlbGF5KDEpOwkJLyogd2FpdCAxdXMgKi8KKwl1ZGVsYXkoMSk7ICAvKiB3YWl0IDF1cyAqLwogCiAJaWYgKG1vZGUgPT0gVzEwMF9TVVNQRU5EX0VYVE1FTSkgewotCiAJCS8qIENLRTogVHJpLVN0YXRlICovCiAJCXZhbCA9IHJlYWRsKHJlbWFwcGVkX3JlZ3MgKyBtbU1FTV9FWFRfQ05UTCk7Ci0JCXZhbCB8PSAweDQwMDAwMDAwOwkvKiBiaXQzMD0xICovCisJCXZhbCB8PSAweDQwMDAwMDAwOyAgLyogYml0MzA9MSAqLwogCQl3cml0ZWwodmFsLCByZW1hcHBlZF9yZWdzICsgbW1NRU1fRVhUX0NOVEwpOwogCiAJCS8qIENMSzogU3RvcCAqLwogCQl2YWwgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1NRU1fRVhUX0NOVEwpOwotCQl2YWwgJj0gfigweDAwMDAwMDAxKTsJLyogYml0MD0wICovCisJCXZhbCAmPSB+KDB4MDAwMDAwMDEpOyAgLyogYml0MD0wICovCiAJCXdyaXRlbCh2YWwsIHJlbWFwcGVkX3JlZ3MgKyBtbU1FTV9FWFRfQ05UTCk7CiAJfSBlbHNlIHsKLQogCQl3cml0ZWwoMHgwMDAwMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tU0NMS19DTlRMKTsKIAkJd3JpdGVsKDB4MDAwMDAwQkYsIHJlbWFwcGVkX3JlZ3MgKyBtbUNMS19QSU5fQ05UTCk7CiAJCXdyaXRlbCgweDAwMDAwMDE1LCByZW1hcHBlZF9yZWdzICsgbW1QV1JNR1RfQ05UTCk7CkBAIC0xNDE4LDQzICsxNDA2LDE2IEBACiAJCXVkZWxheSg1KTsKIAogCQl2YWwgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1QTExfQ05UTCk7Ci0JCXZhbCB8PSAweDAwMDAwMDA0OwkvKiBiaXQyPTEgKi8KKwkJdmFsIHw9IDB4MDAwMDAwMDQ7ICAvKiBiaXQyPTEgKi8KIAkJd3JpdGVsKHZhbCwgcmVtYXBwZWRfcmVncyArIG1tUExMX0NOVEwpOwogCQl3cml0ZWwoMHgwMDAwMDAxZCwgcmVtYXBwZWRfcmVncyArIG1tUFdSTUdUX0NOVEwpOwogCX0KIH0KIAotCi1zdGF0aWMgdm9pZCB3MTAwX3Jlc3VtZSh2b2lkKQotewotCXUzMiB0ZW1wMzI7Ci0KLQl3MTAwX2h3X2luaXQoKTsKLQl3MTAwX3B3bV9zZXR1cCgpOwotCi0JdGVtcDMyID0gcmVhZGwocmVtYXBwZWRfcmVncyArIG1tRElTUF9ERUJVRzIpOwotCXRlbXAzMiAmPSAweGZmN2ZmZmZmOwotCXRlbXAzMiB8PSAweDAwODAwMDAwOwotCXdyaXRlbCh0ZW1wMzIsIHJlbWFwcGVkX3JlZ3MgKyBtbURJU1BfREVCVUcyKTsKLQotCWlmIChjdXJyZW50X3Bhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV80ODAgfHwgY3VycmVudF9wYXItPmxjZE1vZGUgPT0gTENEX01PREVfNjQwKSB7Ci0JCXcxMDBfaW5pdF9zaGFycF9sY2QoTENEX1NIQVJQX1ZHQSk7Ci0JCWlmIChjdXJyZW50X3Bhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV82NDApIHsKLQkJCXcxMDBfaW5pdF92Z2Ffcm90YXRpb24oY3VycmVudF9wYXItPnJvdGF0aW9uX2ZsYWcgPyAyNzAgOiA5MCk7Ci0JCX0KLQl9IGVsc2UgewotCQl3MTAwX2luaXRfc2hhcnBfbGNkKExDRF9TSEFSUF9RVkdBKTsKLQkJaWYgKGN1cnJlbnRfcGFyLT5sY2RNb2RlID09IExDRF9NT0RFXzMyMCkgewotCQkJdzEwMF9pbml0X3F2Z2Ffcm90YXRpb24oY3VycmVudF9wYXItPnJvdGF0aW9uX2ZsYWcgPyAyNzAgOiA5MCk7Ci0JCX0KLQl9Ci19Ci0KLQogc3RhdGljIHZvaWQgdzEwMF92c3luYyh2b2lkKQogewogCXUzMiB0bXA7Ci0JaW50IHRpbWVvdXQgPSAzMDAwMDsgLyogVlN5bmMgdGltZW91dCA9IDMwW21zXSA+IDE2LjhbbXNdICovCisJaW50IHRpbWVvdXQgPSAzMDAwMDsgIC8qIFZTeW5jIHRpbWVvdXQgPSAzMFttc10gPiAxNi44W21zXSAqLwogCiAJdG1wID0gcmVhZGwocmVtYXBwZWRfcmVncyArIG1tQUNUSVZFX1ZfRElTUCk7CiAKQEAgLTE0OTAsMzYzICsxNDUxLDYgQEAKIAl3cml0ZWwoMHgwMDAwMDAwMiwgcmVtYXBwZWRfcmVncyArIG1tR0VOX0lOVF9TVEFUVVMpOwogfQogCi0KLXN0YXRpYyB2b2lkIHcxMDBfSW5pdEV4dE1lbSh1MzIgbW9kZSkKLXsKLQlzd2l0Y2gobW9kZSkgewotCWNhc2UgTENEX1NIQVJQX1FWR0E6Ci0JCS8qIFFWR0EgZG9lc24ndCB1c2UgZXh0ZXJuYWwgbWVtb3J5Ci0JCSAgIG5vdGhpbmcgdG8gZG8sIHJlYWxseS4gKi8KLQkJYnJlYWs7Ci0JY2FzZSBMQ0RfU0hBUlBfVkdBOgotCQl3cml0ZWwoMHgwMDAwNzgwMCwgcmVtYXBwZWRfcmVncyArIG1tTUNfQklTVF9DVFJMKTsKLQkJd3JpdGVsKDB4MDAwNDAwMDMsIHJlbWFwcGVkX3JlZ3MgKyBtbU1FTV9FWFRfQ05UTCk7Ci0JCXdyaXRlbCgweDAwMjAwMDIxLCByZW1hcHBlZF9yZWdzICsgbW1NRU1fU0RSQU1fTU9ERV9SRUcpOwotCQl1ZGVsYXkoMTAwKTsKLQkJd3JpdGVsKDB4ODAyMDAwMjEsIHJlbWFwcGVkX3JlZ3MgKyBtbU1FTV9TRFJBTV9NT0RFX1JFRyk7Ci0JCXVkZWxheSgxMDApOwotCQl3cml0ZWwoMHgwMDY1MDAyMSwgcmVtYXBwZWRfcmVncyArIG1tTUVNX1NEUkFNX01PREVfUkVHKTsKLQkJdWRlbGF5KDEwMCk7Ci0JCXdyaXRlbCgweDEwMDAyYTRhLCByZW1hcHBlZF9yZWdzICsgbW1NRU1fRVhUX1RJTUlOR19DTlRMKTsKLQkJd3JpdGVsKDB4N2ZmODcwMTIsIHJlbWFwcGVkX3JlZ3MgKyBtbU1FTV9JT19DTlRMKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi0KLSNkZWZpbmUgUkVTQ1RMX0FEUlMgICAgIDB4MDAKLSNkZWZpbmUgUEhBQ1RSTF9BRFJTCTB4MDEKLSNkZWZpbmUgRFVUWUNUUkxfQURSUwkweDAyCi0jZGVmaW5lIFBPV0VSUkVHMF9BRFJTCTB4MDMKLSNkZWZpbmUgUE9XRVJSRUcxX0FEUlMJMHgwNAotI2RlZmluZSBHUE9SM19BRFJTCQkweDA1Ci0jZGVmaW5lIFBJQ1RSTF9BRFJTICAgICAweDA2Ci0jZGVmaW5lIFBPTENUUkxfQURSUyAgICAweDA3Ci0KLSNkZWZpbmUgUkVTQ1RMX1FWR0EgICAgIDB4MDEKLSNkZWZpbmUgUkVTQ1RMX1ZHQSAgICAgIDB4MDAKLQotI2RlZmluZSBQT1dFUjFfVldfT04JMHgwMQkvKiBWVyBTdXBwbHkgRkVUIE9OICovCi0jZGVmaW5lIFBPV0VSMV9HVlNTX09OCTB4MDIJLyogR1ZTUygtOFYpIFBvd2VyIFN1cHBseSBPTiAqLwotI2RlZmluZSBQT1dFUjFfVkREX09OCTB4MDQJLyogVkREKDhWKSxTVlNTKC00VikgUG93ZXIgU3VwcGx5IE9OICovCi0KLSNkZWZpbmUgUE9XRVIxX1ZXX09GRgkweDAwCS8qIFZXIFN1cHBseSBGRVQgT0ZGICovCi0jZGVmaW5lIFBPV0VSMV9HVlNTX09GRgkweDAwCS8qIEdWU1MoLThWKSBQb3dlciBTdXBwbHkgT0ZGICovCi0jZGVmaW5lIFBPV0VSMV9WRERfT0ZGCTB4MDAJLyogVkREKDhWKSxTVlNTKC00VikgUG93ZXIgU3VwcGx5IE9GRiAqLwotCi0jZGVmaW5lIFBPV0VSMF9DT01fRENMSwkweDAxCS8qIENPTSBWb2x0YWdlIERDIEJpYXMgREFDIFNlcmlhbCBEYXRhIENsb2NrICovCi0jZGVmaW5lIFBPV0VSMF9DT01fRE9VVAkweDAyCS8qIENPTSBWb2x0YWdlIERDIEJpYXMgREFDIFNlcmlhbCBEYXRhIE91dCAqLwotI2RlZmluZSBQT1dFUjBfREFDX09OCTB4MDQJLyogREFDIFBvd2VyIFN1cHBseSBPTiAqLwotI2RlZmluZSBQT1dFUjBfQ09NX09OCTB4MDgJLyogQ09NIFBvd2V3ciBTdXBwbHkgT04gKi8KLSNkZWZpbmUgUE9XRVIwX1ZDQzVfT04JMHgxMAkvKiBWQ0M1IFBvd2VyIFN1cHBseSBPTiAqLwotCi0jZGVmaW5lIFBPV0VSMF9EQUNfT0ZGCTB4MDAJLyogREFDIFBvd2VyIFN1cHBseSBPRkYgKi8KLSNkZWZpbmUgUE9XRVIwX0NPTV9PRkYJMHgwMAkvKiBDT00gUG93ZXdyIFN1cHBseSBPRkYgKi8KLSNkZWZpbmUgUE9XRVIwX1ZDQzVfT0ZGCTB4MDAJLyogVkNDNSBQb3dlciBTdXBwbHkgT0ZGICovCi0KLSNkZWZpbmUgUElDVFJMX0lOSVRfU1RBVEUJMHgwMQotI2RlZmluZSBQSUNUUkxfSU5JT0ZGCQkweDAyCi0jZGVmaW5lIFBJQ1RSTF9QT1dFUl9ET1dOCTB4MDQKLSNkZWZpbmUgUElDVFJMX0NPTV9TSUdOQUxfT0ZGCTB4MDgKLSNkZWZpbmUgUElDVFJMX0RBQ19TSUdOQUxfT0ZGCTB4MTAKLQotI2RlZmluZSBQSUNUUkxfUE9XRVJfQUNUSVZFCSgwKQotCi0jZGVmaW5lIFBPTENUUkxfU1lOQ19QT0xfRkFMTAkweDAxCi0jZGVmaW5lIFBPTENUUkxfRU5fUE9MX0ZBTEwJMHgwMgotI2RlZmluZSBQT0xDVFJMX0RBVEFfUE9MX0ZBTEwJMHgwNAotI2RlZmluZSBQT0xDVFJMX1NZTkNfQUNUX0gJMHgwOAotI2RlZmluZSBQT0xDVFJMX0VOX0FDVF9MCTB4MTAKLQotI2RlZmluZSBQT0xDVFJMX1NZTkNfUE9MX1JJU0UJMHgwMAotI2RlZmluZSBQT0xDVFJMX0VOX1BPTF9SSVNFCTB4MDAKLSNkZWZpbmUgUE9MQ1RSTF9EQVRBX1BPTF9SSVNFCTB4MDAKLSNkZWZpbmUgUE9MQ1RSTF9TWU5DX0FDVF9MCTB4MDAKLSNkZWZpbmUgUE9MQ1RSTF9FTl9BQ1RfSAkweDAwCi0KLSNkZWZpbmUgUEhBQ1RSTF9QSEFTRV9NQU5VQUwJMHgwMQotCi0jZGVmaW5lIFBIQURfUVZHQV9ERUZBVUxUX1ZBTCAoOSkKLSNkZWZpbmUgQ09NQURKX0RFRkFVTFQgICAgICAgICgxMjUpCi0KLXN0YXRpYyB2b2lkIGxjZHRnX3NzcF9zZW5kKHU4IGFkcnMsIHU4IGRhdGEpCi17Ci0JdzEwMGZiX3NzcF9zZW5kKGFkcnMsZGF0YSk7Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIG9ubHkgYSBwc3VlZG8gSTJDIGludGVyZmFjZS4gV2UgY2FuJ3QgdXNlIHRoZSBzdGFuZGFyZCBrZXJuZWwKLSAqIHJvdXRpbmVzIGFzIHRoZSBpbnRlcmZhY2UgaXMgd3JpdGUgb25seS4gV2UganVzdCBhc3N1bWUgdGhlIGRhdGEgaXMgYWNrZWQuLi4KLSAqLwotc3RhdGljIHZvaWQgbGNkdGdfc3NwX2kyY19zZW5kKHU4IGRhdGEpCi17Ci0JbGNkdGdfc3NwX3NlbmQoUE9XRVJSRUcwX0FEUlMsIGRhdGEpOwotCXVkZWxheSgxMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxjZHRnX2kyY19zZW5kX2JpdCh1OCBkYXRhKQotewotCWxjZHRnX3NzcF9pMmNfc2VuZChkYXRhKTsKLQlsY2R0Z19zc3BfaTJjX3NlbmQoZGF0YSB8IFBPV0VSMF9DT01fRENMSyk7Ci0JbGNkdGdfc3NwX2kyY19zZW5kKGRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBsY2R0Z19pMmNfc2VuZF9zdGFydCh1OCBiYXNlKQotewotCWxjZHRnX3NzcF9pMmNfc2VuZChiYXNlIHwgUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUKTsKLQlsY2R0Z19zc3BfaTJjX3NlbmQoYmFzZSB8IFBPV0VSMF9DT01fRENMSyk7Ci0JbGNkdGdfc3NwX2kyY19zZW5kKGJhc2UpOwotfQotCi1zdGF0aWMgdm9pZCBsY2R0Z19pMmNfc2VuZF9zdG9wKHU4IGJhc2UpCi17Ci0JbGNkdGdfc3NwX2kyY19zZW5kKGJhc2UpOwotCWxjZHRnX3NzcF9pMmNfc2VuZChiYXNlIHwgUE9XRVIwX0NPTV9EQ0xLKTsKLQlsY2R0Z19zc3BfaTJjX3NlbmQoYmFzZSB8IFBPV0VSMF9DT01fRENMSyB8IFBPV0VSMF9DT01fRE9VVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxjZHRnX2kyY19zZW5kX2J5dGUodTggYmFzZSwgdTggZGF0YSkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmIChkYXRhICYgMHg4MCkKLQkJCWxjZHRnX2kyY19zZW5kX2JpdChiYXNlIHwgUE9XRVIwX0NPTV9ET1VUKTsKLQkJZWxzZQotCQkJbGNkdGdfaTJjX3NlbmRfYml0KGJhc2UpOwotCQlkYXRhIDw8PSAxOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbGNkdGdfaTJjX3dhaXRfYWNrKHU4IGJhc2UpCi17Ci0JbGNkdGdfaTJjX3NlbmRfYml0KGJhc2UpOwotfQotCi1zdGF0aWMgdm9pZCBsY2R0Z19zZXRfY29tbW9uX3ZvbHRhZ2UodTggYmFzZV9kYXRhLCB1OCBkYXRhKQotewotCS8qIFNldCBDb21tb24gVm9sdGFnZSB0byBNNjIzMzJGUCB2aWEgSTJDICovCi0JbGNkdGdfaTJjX3NlbmRfc3RhcnQoYmFzZV9kYXRhKTsKLQlsY2R0Z19pMmNfc2VuZF9ieXRlKGJhc2VfZGF0YSwgMHg5Yyk7Ci0JbGNkdGdfaTJjX3dhaXRfYWNrKGJhc2VfZGF0YSk7Ci0JbGNkdGdfaTJjX3NlbmRfYnl0ZShiYXNlX2RhdGEsIDB4MDApOwotCWxjZHRnX2kyY193YWl0X2FjayhiYXNlX2RhdGEpOwotCWxjZHRnX2kyY19zZW5kX2J5dGUoYmFzZV9kYXRhLCBkYXRhKTsKLQlsY2R0Z19pMmNfd2FpdF9hY2soYmFzZV9kYXRhKTsKLQlsY2R0Z19pMmNfc2VuZF9zdG9wKGJhc2VfZGF0YSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbGNkdGdfcmVnaXN0ZXJfc2V0dGluZyB7Ci0JdTggYWRyczsKLQl1OCBkYXRhOwotCXUzMiB3YWl0OwotfSBsY2R0Z19wb3dlcl9vbl90YWJsZVtdID0gewotCi0gICAgLyogSW5pdGlhbGl6ZSBJbnRlcm5hbCBMb2dpYyAmIFBvcnQgKi8KLSAgICB7IFBJQ1RSTF9BRFJTLAotICAgICAgUElDVFJMX1BPV0VSX0RPV04gfCBQSUNUUkxfSU5JT0ZGIHwgUElDVFJMX0lOSVRfU1RBVEUgfAotICAgICAgUElDVFJMX0NPTV9TSUdOQUxfT0ZGIHwgUElDVFJMX0RBQ19TSUdOQUxfT0ZGLAotICAgICAgMCB9LAotCi0gICAgeyBQT1dFUlJFRzBfQURSUywKLSAgICAgIFBPV0VSMF9DT01fRENMSyB8IFBPV0VSMF9DT01fRE9VVCB8IFBPV0VSMF9EQUNfT0ZGIHwgUE9XRVIwX0NPTV9PRkYgfAotICAgICAgUE9XRVIwX1ZDQzVfT0ZGLAotICAgICAgMCB9LAotCi0gICAgeyBQT1dFUlJFRzFfQURSUywKLSAgICAgIFBPV0VSMV9WV19PRkYgfCBQT1dFUjFfR1ZTU19PRkYgfCBQT1dFUjFfVkREX09GRiwKLSAgICAgIDAgfSwKLQotICAgIC8qIFZERCgrOFYpLFNWU1MoLTRWKSBPTiAqLwotICAgIHsgUE9XRVJSRUcxX0FEUlMsCi0gICAgICBQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT0ZGIHwgUE9XRVIxX1ZERF9PTiAvKiBWREQgT04gKi8sCi0gICAgICAzMDAwIH0sCi0KLSAgICAvKiBEQUMgT04gKi8KLSAgICB7IFBPV0VSUkVHMF9BRFJTLAotICAgICAgUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUIHwgUE9XRVIwX0RBQ19PTiAvKiBEQUMgT04gKi8gfAotICAgICAgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PRkYsCi0gICAgICAwIH0sCi0KLSAgICAvKiBJTklCID0gSCwgSU5JID0gTCAgKi8KLSAgICB7IFBJQ1RSTF9BRFJTLAotICAgICAgLyogUElDVExbMF0gPSBIICwgUElDVExbMV0gPSBQSUNUTFsyXSA9IFBJQ1RMWzRdID0gTCAqLwotICAgICAgUElDVFJMX0lOSVRfU1RBVEUgfCBQSUNUUkxfQ09NX1NJR05BTF9PRkYsCi0gICAgICAwIH0sCi0KLSAgICAvKiBTZXQgQ29tbW9uIFZvbHRhZ2UgKi8KLSAgICB7IDB4ZmUsIDAsIDAgfSwKLQotICAgIC8qIFZDQzUgT04gKi8KLSAgICB7IFBPV0VSUkVHMF9BRFJTLAotICAgICAgUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUIHwgUE9XRVIwX0RBQ19PTiAvKiBEQUMgT04gKi8gfAotICAgICAgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PTiAvKiBWQ0M1IE9OICovLAotICAgICAgMCB9LAotCi0gICAgLyogR1ZTUygtOFYpIE9OICovCi0gICAgeyBQT1dFUlJFRzFfQURSUywKLSAgICAgIFBPV0VSMV9WV19PRkYgfCBQT1dFUjFfR1ZTU19PTiAvKiBHVlNTIE9OICovIHwKLSAgICAgIFBPV0VSMV9WRERfT04gLyogVkREIE9OICovLAotICAgICAgMjAwMCB9LAotCi0gICAgLyogQ09NIFNJR05BTCBPTiAoUElDVExbM10gPSBMKSAqLwotICAgIHsgUElDVFJMX0FEUlMsCi0gICAgICBQSUNUUkxfSU5JVF9TVEFURSwKLSAgICAgIDAgfSwKLQotICAgIC8qIENPTSBPTiAqLwotICAgIHsgUE9XRVJSRUcwX0FEUlMsCi0gICAgICBQT1dFUjBfQ09NX0RDTEsgfCBQT1dFUjBfQ09NX0RPVVQgfCBQT1dFUjBfREFDX09OIC8qIERBQyBPTiAqLyB8Ci0gICAgICBQT1dFUjBfQ09NX09OIC8qIENPTSBPTiAqLyB8IFBPV0VSMF9WQ0M1X09OIC8qIFZDQzVfT04gKi8sCi0gICAgICAwIH0sCi0KLSAgICAvKiBWVyBPTiAqLwotICAgIHsgUE9XRVJSRUcxX0FEUlMsCi0gICAgICBQT1dFUjFfVldfT04gLyogVlcgT04gKi8gfCBQT1dFUjFfR1ZTU19PTiAvKiBHVlNTIE9OICovIHwKLSAgICAgIFBPV0VSMV9WRERfT04gLyogVkREIE9OICovLAotICAgICAgMCAvKiBXYWl0IDEwMG1zICovIH0sCi0KLSAgICAvKiBTaWduYWxzIG91dHB1dCBlbmFibGUgKi8KLSAgICB7IFBJQ1RSTF9BRFJTLAotICAgICAgMCAvKiBTaWduYWxzIG91dHB1dCBlbmFibGUgKi8sCi0gICAgICAwIH0sCi0KLSAgICB7IFBIQUNUUkxfQURSUywKLSAgICAgIFBIQUNUUkxfUEhBU0VfTUFOVUFMLAotICAgICAgMCB9LAotCi0gICAgLyogSW5pdGlhbGl6ZSBmb3IgSW5wdXQgU2lnbmFscyBmcm9tIEFUSSAqLwotICAgIHsgUE9MQ1RSTF9BRFJTLAotICAgICAgUE9MQ1RSTF9TWU5DX1BPTF9SSVNFIHwgUE9MQ1RSTF9FTl9QT0xfUklTRSB8IFBPTENUUkxfREFUQV9QT0xfUklTRSB8Ci0gICAgICBQT0xDVFJMX1NZTkNfQUNUX0wgfCBQT0xDVFJMX0VOX0FDVF9ILAotICAgICAgMTAwMCAvKjEwMDAwMCovIC8qIFdhaXQgMTAwbXMgKi8gfSwKLQotICAgIC8qIGVuZCBtYXJrICovCi0gICAgeyAweGZmLCAwLCAwIH0KLX07Ci0KLXN0YXRpYyB2b2lkIGxjZHRnX3Jlc3VtZSh2b2lkKQotewotCWlmIChjdXJyZW50X3Bhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV80ODAgfHwgY3VycmVudF9wYXItPmxjZE1vZGUgPT0gTENEX01PREVfNjQwKSB7Ci0JCWxjZHRnX2h3X2luaXQoTENEX1NIQVJQX1ZHQSk7Ci0JfSBlbHNlIHsKLQkJbGNkdGdfaHdfaW5pdChMQ0RfU0hBUlBfUVZHQSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBsY2R0Z19zdXNwZW5kKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKGN1cnJlbnRfcGFyLT54cmVzICogY3VycmVudF9wYXItPnlyZXMpOyBpKyspIHsKLQkJd3JpdGV3KDB4ZmZmZiwgcmVtYXBwZWRfZmJ1ZiArICgyKmkpKTsKLQl9Ci0KLQkvKiA2MEh6IHggMiBmcmFtZSA9IDE2Ljdtc2VjIHggMiA9IDMzLjQgbXNlYyAqLwotCW1kZWxheSgzNCk7Ci0KLQkvKiAoMSlWVyBPRkYgKi8KLQlsY2R0Z19zc3Bfc2VuZChQT1dFUlJFRzFfQURSUywgUE9XRVIxX1ZXX09GRiB8IFBPV0VSMV9HVlNTX09OIHwgUE9XRVIxX1ZERF9PTik7Ci0KLQkvKiAoMilDT00gT0ZGICovCi0JbGNkdGdfc3NwX3NlbmQoUElDVFJMX0FEUlMsIFBJQ1RSTF9DT01fU0lHTkFMX09GRik7Ci0JbGNkdGdfc3NwX3NlbmQoUE9XRVJSRUcwX0FEUlMsIFBPV0VSMF9EQUNfT04gfCBQT1dFUjBfQ09NX09GRiB8IFBPV0VSMF9WQ0M1X09OKTsKLQotCS8qICgzKVNldCBDb21tb24gVm9sdGFnZSBCaWFzIDBWICovCi0JbGNkdGdfc2V0X2NvbW1vbl92b2x0YWdlKFBPV0VSMF9EQUNfT04gfCBQT1dFUjBfQ09NX09GRiB8IFBPV0VSMF9WQ0M1X09OLCAwKTsKLQotCS8qICg0KUdWU1MgT0ZGICovCi0JbGNkdGdfc3NwX3NlbmQoUE9XRVJSRUcxX0FEUlMsIFBPV0VSMV9WV19PRkYgfCBQT1dFUjFfR1ZTU19PRkYgfCBQT1dFUjFfVkREX09OKTsKLQotCS8qICg1KVZDQzUgT0ZGICovCi0JbGNkdGdfc3NwX3NlbmQoUE9XRVJSRUcwX0FEUlMsIFBPV0VSMF9EQUNfT04gfCBQT1dFUjBfQ09NX09GRiB8IFBPV0VSMF9WQ0M1X09GRik7Ci0KLQkvKiAoNilTZXQgUERXTiwgSU5JT0ZGLCBEQUNPRkYgKi8KLQlsY2R0Z19zc3Bfc2VuZChQSUNUUkxfQURSUywgUElDVFJMX0lOSU9GRiB8IFBJQ1RSTF9EQUNfU0lHTkFMX09GRiB8Ci0JCQlQSUNUUkxfUE9XRVJfRE9XTiB8IFBJQ1RSTF9DT01fU0lHTkFMX09GRik7Ci0KLQkvKiAoNylEQUMgT0ZGICovCi0JbGNkdGdfc3NwX3NlbmQoUE9XRVJSRUcwX0FEUlMsIFBPV0VSMF9EQUNfT0ZGIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PRkYpOwotCi0JLyogKDgpVkREIE9GRiAqLwotCWxjZHRnX3NzcF9zZW5kKFBPV0VSUkVHMV9BRFJTLCBQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT0ZGIHwgUE9XRVIxX1ZERF9PRkYpOwotCi19Ci0KLXN0YXRpYyB2b2lkIGxjZHRnX3NldF9waGFkYWRqKHUzMiBtb2RlKQotewotCWludCBhZGo7Ci0KLQlpZiAobW9kZSA9PSBMQ0RfU0hBUlBfVkdBKSB7Ci0JCS8qIFNldHRpbmcgZm9yIFZHQSAqLwotCQlhZGogPSBjdXJyZW50X3Bhci0+cGhhZGFkajsKLQkJaWYgKGFkaiA8IDApIHsKLQkJCWFkaiA9IFBIQUNUUkxfUEhBU0VfTUFOVUFMOwotCQl9IGVsc2UgewotCQkJYWRqID0gKChhZGogJiAweDBmKSA8PCAxKSB8IFBIQUNUUkxfUEhBU0VfTUFOVUFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogU2V0dGluZyBmb3IgUVZHQSAqLwotCQlhZGogPSAoUEhBRF9RVkdBX0RFRkFVTFRfVkFMIDw8IDEpIHwgUEhBQ1RSTF9QSEFTRV9NQU5VQUw7Ci0JfQotCWxjZHRnX3NzcF9zZW5kKFBIQUNUUkxfQURSUywgYWRqKTsKLX0KLQotc3RhdGljIHZvaWQgbGNkdGdfaHdfaW5pdCh1MzIgbW9kZSkKLXsKLQlpbnQgaTsKLQlpbnQgY29tYWRqOwotCi0JaSA9IDA7Ci0Jd2hpbGUobGNkdGdfcG93ZXJfb25fdGFibGVbaV0uYWRycyAhPSAweGZmKSB7Ci0JCWlmIChsY2R0Z19wb3dlcl9vbl90YWJsZVtpXS5hZHJzID09IDB4ZmUpIHsKLQkJCS8qIFNldCBDb21tb24gVm9sdGFnZSAqLwotCQkJY29tYWRqID0gY3VycmVudF9wYXItPmNvbWFkajsKLQkJCWlmIChjb21hZGogPCAwKSB7Ci0JCQkJY29tYWRqID0gQ09NQURKX0RFRkFVTFQ7Ci0JCQl9Ci0JCQlsY2R0Z19zZXRfY29tbW9uX3ZvbHRhZ2UoKFBPV0VSMF9EQUNfT04gfCBQT1dFUjBfQ09NX09GRiB8IFBPV0VSMF9WQ0M1X09GRiksIGNvbWFkaik7Ci0JCX0gZWxzZSBpZiAobGNkdGdfcG93ZXJfb25fdGFibGVbaV0uYWRycyA9PSBQSEFDVFJMX0FEUlMpIHsKLQkJCS8qIFNldCBQaGFzZSBBZGp1Y3QgKi8KLQkJCWxjZHRnX3NldF9waGFkYWRqKG1vZGUpOwotCQl9IGVsc2UgewotCQkJLyogT3RoZXIgKi8KLQkJCWxjZHRnX3NzcF9zZW5kKGxjZHRnX3Bvd2VyX29uX3RhYmxlW2ldLmFkcnMsIGxjZHRnX3Bvd2VyX29uX3RhYmxlW2ldLmRhdGEpOwotCQl9Ci0JCWlmIChsY2R0Z19wb3dlcl9vbl90YWJsZVtpXS53YWl0ICE9IDApCi0JCQl1ZGVsYXkobGNkdGdfcG93ZXJfb25fdGFibGVbaV0ud2FpdCk7Ci0JCWkrKzsKLQl9Ci0KLQlzd2l0Y2gobW9kZSkgewotCWNhc2UgTENEX1NIQVJQX1FWR0E6Ci0JCS8qIFNldCBMY2QgUmVzb2x1dGlvbiAoUVZHQSkgKi8KLQkJbGNkdGdfc3NwX3NlbmQoUkVTQ1RMX0FEUlMsIFJFU0NUTF9RVkdBKTsKLQkJYnJlYWs7Ci0JY2FzZSBMQ0RfU0hBUlBfVkdBOgotCQkvKiBTZXQgTGNkIFJlc29sdXRpb24gKFZHQSkgKi8KLQkJbGNkdGdfc3NwX3NlbmQoUkVTQ1RMX0FEUlMsIFJFU0NUTF9WR0EpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGxjZHRnX2xjZF9jaGFuZ2UodTMyIG1vZGUpCi17Ci0JLyogU2V0IFBoYXNlIEFkanVjdCAqLwotCWxjZHRnX3NldF9waGFkYWRqKG1vZGUpOwotCi0JaWYgKG1vZGUgPT0gTENEX1NIQVJQX1ZHQSkKLQkJLyogU2V0IExjZCBSZXNvbHV0aW9uIChWR0EpICovCi0JCWxjZHRnX3NzcF9zZW5kKFJFU0NUTF9BRFJTLCBSRVNDVExfVkdBKTsKLQllbHNlIGlmIChtb2RlID09IExDRF9TSEFSUF9RVkdBKQotCQkvKiBTZXQgTGNkIFJlc29sdXRpb24gKFFWR0EpICovCi0JCWxjZHRnX3NzcF9zZW5kKFJFU0NUTF9BRFJTLCBSRVNDVExfUVZHQSk7Ci19Ci0KLQogc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHcxMDBmYl9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIncxMDBmYiIsCiAJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCkBAIC0xODcwLDQgKzE0NzQsNCBAQAogbW9kdWxlX2V4aXQodzEwMGZiX2NsZWFudXApOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkFUSSBJbWFnZW9uIHcxMDAgZnJhbWVidWZmZXIgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMdjIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdzEwMGZiLmggYi9kcml2ZXJzL3ZpZGVvL3cxMDBmYi5oCmluZGV4IDQxNjI0ZjkuLjdhNThhMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdzEwMGZiLmgKKysrIGIvZHJpdmVycy92aWRlby93MTAwZmIuaApAQCAtNSw5ICs1LDEyIEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAyLCBBVEkgQ29ycC4KICAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IFJpY2hhcmQgUHVyZGllCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KICAqCiAgKiBNb2RpZmllZCB0byB3b3JrIHdpdGggMi42IGJ5IFJpY2hhcmQgUHVyZGllIDxycHVyZGllQHJwc3lzLm5ldD4KICAqCisgKiB3MzJ4eCBzdXBwb3J0IGJ5IElhbiBNb2x0b24KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgpAQCAtMTksNyArMjIsNyBAQAogCiAvKiBCbG9jayBDSUYgU3RhcnQ6ICovCiAjZGVmaW5lIG1tQ0hJUF9JRCAgICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIG1tUkVWSVNJT05fSUQJCTB4MDAwNAorI2RlZmluZSBtbVJFVklTSU9OX0lEICAgICAgIDB4MDAwNAogI2RlZmluZSBtbVdSQVBfQlVGX0EgICAgICAgIDB4MDAwOAogI2RlZmluZSBtbVdSQVBfQlVGX0IgICAgICAgIDB4MDAwQwogI2RlZmluZSBtbVdSQVBfVE9QX0RJUiAgICAgIDB4MDAxMApAQCAtODgsNyArOTEsNyBAQAogI2RlZmluZSBtbURJU1BfREVCVUcgICAgICAgIDB4MDRENAogI2RlZmluZSBtbURJU1BfREJfQlVGX0NOVEwgIDB4MDREOAogI2RlZmluZSBtbURJU1BfQ1JDX1NJRyAgICAgIDB4MDREQwotI2RlZmluZSBtbUNSVENfREVGQVVMVF9DT1VOVCAJMHgwNEUwCisjZGVmaW5lIG1tQ1JUQ19ERUZBVUxUX0NPVU5UICAgIDB4MDRFMAogI2RlZmluZSBtbUxDRF9CQUNLR1JPVU5EX0NPTE9SICAweDA0RTQKICNkZWZpbmUgbW1DUlRDX1BTMiAgICAgICAgICAweDA0RTgKICNkZWZpbmUgbW1DUlRDX1BTMl9WUE9TICAgICAweDA0RUMKQEAgLTExOSwxNyArMTIyLDE3IEBACiAvKiBCbG9jayBESVNQTEFZIEVuZDogKi8KIAogLyogQmxvY2sgR0ZYIFN0YXJ0OiAqLwotI2RlZmluZSBtbUJSVVNIX09GRlNFVCAgICAgIDB4MTA4QwotI2RlZmluZSBtbUJSVVNIX1lfWCAgICAgICAgIDB4MTA3NAotI2RlZmluZSBtbURFRkFVTFRfUElUQ0hfT0ZGU0VUCQkweDEwQTAKLSNkZWZpbmUgbW1ERUZBVUxUX1NDX0JPVFRPTV9SSUdIVAkweDEwQTgKLSNkZWZpbmUgbW1ERUZBVUxUMl9TQ19CT1RUT01fUklHSFQJMHgxMEFDCi0jZGVmaW5lIG1tR0xPQkFMX0FMUEhBICAgICAgMHgxMjEwCi0jZGVmaW5lIG1tRklMVEVSX0NPRUYgICAgICAgMHgxMjE0Ci0jZGVmaW5lIG1tTVZDX0NOVExfU1RBUlQgICAgMHgxMUUwCi0jZGVmaW5lIG1tRTJfQVJJVEhNRVRJQ19DTlRMCTB4MTIyMAotI2RlZmluZSBtbUVOR19DTlRMICAgICAgICAgIDB4MTNFOAotI2RlZmluZSBtbUVOR19QRVJGX0NOVCAgICAgIDB4MTNGMAorI2RlZmluZSBtbUJSVVNIX09GRlNFVCAgICAgICAgMHgxMDhDCisjZGVmaW5lIG1tQlJVU0hfWV9YICAgICAgICAgICAweDEwNzQKKyNkZWZpbmUgbW1ERUZBVUxUX1BJVENIX09GRlNFVCAgICAgIDB4MTBBMAorI2RlZmluZSBtbURFRkFVTFRfU0NfQk9UVE9NX1JJR0hUICAgMHgxMEE4CisjZGVmaW5lIG1tREVGQVVMVDJfU0NfQk9UVE9NX1JJR0hUICAweDEwQUMKKyNkZWZpbmUgbW1HTE9CQUxfQUxQSEEgICAgICAgIDB4MTIxMAorI2RlZmluZSBtbUZJTFRFUl9DT0VGICAgICAgICAgMHgxMjE0CisjZGVmaW5lIG1tTVZDX0NOVExfU1RBUlQgICAgICAweDExRTAKKyNkZWZpbmUgbW1FMl9BUklUSE1FVElDX0NOVEwgIDB4MTIyMAorI2RlZmluZSBtbUVOR19DTlRMICAgICAgICAgICAgMHgxM0U4CisjZGVmaW5lIG1tRU5HX1BFUkZfQ05UICAgICAgICAweDEzRjAKIC8qIEJsb2NrIEdGWCBFbmQ6ICovCiAKIC8qIEJsb2NrIElEQ1QgU3RhcnQ6ICovCkBAIC0xNDEsMjIgKzE0NCwzOCBAQAogLyogQmxvY2sgSURDVCBFbmQ6ICovCiAKIC8qIEJsb2NrIE1DIFN0YXJ0OiAqLwotI2RlZmluZSBtbU1FTV9DTlRMICAgICAgICAgIDB4MDE4MAotI2RlZmluZSBtbU1FTV9BUkIgICAgICAgICAgIDB4MDE4NAotI2RlZmluZSBtbU1DX0ZCX0xPQ0FUSU9OICAgIDB4MDE4OAotI2RlZmluZSBtbU1FTV9FWFRfQ05UTCAgICAgIDB4MDE4QwotI2RlZmluZSBtbU1DX0VYVF9NRU1fTE9DQVRJT04gICAweDAxOTAKLSNkZWZpbmUgbW1NRU1fRVhUX1RJTUlOR19DTlRMICAgMHgwMTk0Ci0jZGVmaW5lIG1tTUVNX1NEUkFNX01PREVfUkVHCTB4MDE5OAotI2RlZmluZSBtbU1FTV9JT19DTlRMICAgICAgIDB4MDE5QwotI2RlZmluZSBtbU1DX0RFQlVHICAgICAgICAgIDB4MDFBMAotI2RlZmluZSBtbU1DX0JJU1RfQ1RSTCAgICAgIDB4MDFBNAotI2RlZmluZSBtbU1DX0JJU1RfQ09MTEFSX1JFQUQgIAkweDAxQTgKLSNkZWZpbmUgbW1UQ19NSVNNQVRDSCAgICAgICAweDAxQUMKLSNkZWZpbmUgbW1NQ19QRVJGX01PTl9DTlRMICAweDAxQjAKLSNkZWZpbmUgbW1NQ19QRVJGX0NPVU5URVJTICAweDAxQjQKKyNkZWZpbmUgbW1NRU1fQ05UTCAgICAgICAgICAgICAweDAxODAKKyNkZWZpbmUgbW1NRU1fQVJCICAgICAgICAgICAgICAweDAxODQKKyNkZWZpbmUgbW1NQ19GQl9MT0NBVElPTiAgICAgICAweDAxODgKKyNkZWZpbmUgbW1NRU1fRVhUX0NOVEwgICAgICAgICAweDAxOEMKKyNkZWZpbmUgbW1NQ19FWFRfTUVNX0xPQ0FUSU9OICAweDAxOTAKKyNkZWZpbmUgbW1NRU1fRVhUX1RJTUlOR19DTlRMICAweDAxOTQKKyNkZWZpbmUgbW1NRU1fU0RSQU1fTU9ERV9SRUcgICAweDAxOTgKKyNkZWZpbmUgbW1NRU1fSU9fQ05UTCAgICAgICAgICAweDAxOUMKKyNkZWZpbmUgbW1NQ19ERUJVRyAgICAgICAgICAgICAweDAxQTAKKyNkZWZpbmUgbW1NQ19CSVNUX0NUUkwgICAgICAgICAweDAxQTQKKyNkZWZpbmUgbW1NQ19CSVNUX0NPTExBUl9SRUFEICAweDAxQTgKKyNkZWZpbmUgbW1UQ19NSVNNQVRDSCAgICAgICAgICAweDAxQUMKKyNkZWZpbmUgbW1NQ19QRVJGX01PTl9DTlRMICAgICAweDAxQjAKKyNkZWZpbmUgbW1NQ19QRVJGX0NPVU5URVJTICAgICAweDAxQjQKIC8qIEJsb2NrIE1DIEVuZDogKi8KIAorLyogQmxvY2sgQk0gU3RhcnQ6ICovCisjZGVmaW5lIG1tQk1fRVhUX01FTV9CQU5EV0lEVEggICAgMHgwQTAwCisjZGVmaW5lIG1tQk1fT0ZGU0VUICAgICAgICAgICAgICAgMHgwQTA0CisjZGVmaW5lIG1tQk1fTUVNX0VYVF9USU1JTkdfQ05UTCAgMHgwQTA4CisjZGVmaW5lIG1tQk1fTUVNX0VYVF9DTlRMICAgICAgICAgMHgwQTBDCisjZGVmaW5lIG1tQk1fTUVNX01PREVfUkVHICAgICAgICAgMHgwQTEwCisjZGVmaW5lIG1tQk1fTUVNX0lPX0NOVEwgICAgICAgICAgMHgwQTE4CisjZGVmaW5lIG1tQk1fQ09ORklHICAgICAgICAgICAgICAgMHgwQTFDCisjZGVmaW5lIG1tQk1fU1RBVFVTICAgICAgICAgICAgICAgMHgwQTIwCisjZGVmaW5lIG1tQk1fREVCVUcgICAgICAgICAgICAgICAgMHgwQTI0CisjZGVmaW5lIG1tQk1fUEVSRl9NT05fQ05UTCAgICAgICAgMHgwQTI4CisjZGVmaW5lIG1tQk1fUEVSRl9DT1VOVEVSUyAgICAgICAgMHgwQTJDCisjZGVmaW5lIG1tQk1fUEVSRjJfTU9OX0NOVEwgICAgICAgMHgwQTMwCisjZGVmaW5lIG1tQk1fUEVSRjJfQ09VTlRFUlMgICAgICAgMHgwQTM0CisvKiBCbG9jayBCTSBFbmQ6ICovCisKIC8qIEJsb2NrIFJCQk0gU3RhcnQ6ICovCiAjZGVmaW5lIG1tV0FJVF9VTlRJTCAgICAgICAgMHgxNDAwCiAjZGVmaW5lIG1tSVNZTkNfQ05UTCAgICAgICAgMHgxNDA0CkBAIC0xNzYsNDM5ICsxOTUsNTc1IEBACiAvKiBCbG9jayBDRyBFbmQ6ICovCiAKIC8qIGRlZmF1bHQgdmFsdWUgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgZGVmV1JBUF9UT1BfRElSICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIGRlZldSQVBfU1RBUlRfRElSCTB4MDAwMDAwMDAKLSNkZWZpbmUgZGVmQ0ZHUkVHX0JBU0UgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIGRlZkNJRl9JTyAgICAgICAgICAgMHgwMDBDMDkwMgotI2RlZmluZSBkZWZJTlRGX0NOVEwgICAgICAgIDB4MDAwMDAwMTEKLSNkZWZpbmUgZGVmQ1BVX0RFRkFVTFRTICAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIGRlZkhXX0lOVCAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBkZWZNQ19FWFRfTUVNX0xPQ0FUSU9OICAgICAgICAgICAgMHgwN2ZmMDAwMAotI2RlZmluZSBkZWZUQ19NSVNNQVRDSCAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgZGVmV1JBUF9UT1BfRElSICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIGRlZldSQVBfU1RBUlRfRElSICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBkZWZDRkdSRUdfQkFTRSAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgZGVmQ0lGX0lPICAgICAgICAgICAgICAweDAwMEMwOTAyCisjZGVmaW5lIGRlZklOVEZfQ05UTCAgICAgICAgICAgMHgwMDAwMDAxMQorI2RlZmluZSBkZWZDUFVfREVGQVVMVFMgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgZGVmSFdfSU5UICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIGRlZk1DX0VYVF9NRU1fTE9DQVRJT04gMHgwN2ZmMDAwMAorI2RlZmluZSBkZWZUQ19NSVNNQVRDSCAgICAgICAgIDB4MDAwMDAwMDAKIAogI2RlZmluZSBXMTAwX0NGR19CQVNFICAgICAgICAgIDB4MAogI2RlZmluZSBXMTAwX0NGR19MRU4gICAgICAgICAgIDB4MTAKICNkZWZpbmUgVzEwMF9SRUdfQkFTRSAgICAgICAgICAweDEwMDAwCiAjZGVmaW5lIFcxMDBfUkVHX0xFTiAgICAgICAgICAgMHgyMDAwCiAjZGVmaW5lIE1FTV9JTlRfQkFTRV9WQUxVRSAgICAgMHgxMDAwMDAKLSNkZWZpbmUgTUVNX0lOVF9UT1BfVkFMVUVfVzEwMCAweDE1ZmZmZgogI2RlZmluZSBNRU1fRVhUX0JBU0VfVkFMVUUgICAgIDB4ODAwMDAwCi0jZGVmaW5lIE1FTV9FWFRfVE9QX1ZBTFVFICAgICAgMHg5ZmZmZmYKKyNkZWZpbmUgTUVNX0lOVF9TSVpFICAgICAgICAgICAweDA1ZmZmZgorI2RlZmluZSBNRU1fV0lORE9XX0JBU0UgICAgICAgIDB4MTAwMDAwCisjZGVmaW5lIE1FTV9XSU5ET1dfU0laRSAgICAgICAgMHhmMDAwMDAKKwogI2RlZmluZSBXUkFQX0JVRl9CQVNFX1ZBTFVFICAgIDB4ODAwMDAKICNkZWZpbmUgV1JBUF9CVUZfVE9QX1ZBTFVFICAgICAweGJmZmZmCiAKKyNkZWZpbmUgQ0hJUF9JRF9XMTAwICAgICAgICAgICAweDU3NDExMDAyCisjZGVmaW5lIENISVBfSURfVzMyMDAgICAgICAgICAgMHg1NjQ0MTAwMgorI2RlZmluZSBDSElQX0lEX1czMjIwICAgICAgICAgIDB4NTc0NDEwMDIKIAotLyogZGF0YSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgKi8KKy8qIFJlZ2lzdGVyIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAqLwogCiBzdHJ1Y3Qgd3JhcF90b3BfZGlyX3QgewotICAgICB1bnNpZ25lZCBsb25nIHRvcF9hZGRyICAgICAgICAgOiAyMzsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJOiA5OworCXVuc2lnbmVkIGxvbmcgdG9wX2FkZHIgIDogMjM7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgOiA5OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gd3JhcF90b3BfZGlyX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3Qgd3JhcF90b3BfZGlyX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCB3cmFwX3RvcF9kaXJfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHdyYXBfc3RhcnRfZGlyX3QgewotICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIgICAgICAgOiAyMzsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJOiA5OworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciA6IDIzOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICA6IDk7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiB3cmFwX3N0YXJ0X2Rpcl91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IHdyYXBfc3RhcnRfZGlyX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCB3cmFwX3N0YXJ0X2Rpcl90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgY2lmX2NudGxfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3dhcF9yZWcgICAgICAgICAJCTogMjsKLSAgICAgdW5zaWduZWQgbG9uZyBzd2FwX2ZidWZfMSAgICAgIAkJOiAyOwotICAgICB1bnNpZ25lZCBsb25nIHN3YXBfZmJ1Zl8yICAgICAgCQk6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3dhcF9mYnVmXzMgICAgICAJCTogMjsKLSAgICAgdW5zaWduZWQgbG9uZyBwbWlfaW50X2Rpc2FibGUgIAkJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHBtaV9zY2htZW5fZGlzYWJsZSAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW50Yl9vZSAgICAgICAgICAJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbl93YWl0X3RvX2NvbXBlbnNhdGVfZHFfcHJvcF9kbHkgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGNvbXBlbnNhdGVfd2FpdF9yZF9zaXplICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgd2FpdF9hc3NlcnRlZF90aW1lb3V0X3ZhbCAgICAgIDogMjsKLSAgICAgdW5zaWduZWQgbG9uZyB3YWl0X21hc2tlZF92YWwgIAkJOiAyOwotICAgICB1bnNpZ25lZCBsb25nIGVuX3dhaXRfdGltZW91dCAgCQk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fb25lX2Nsa19zZXR1cF9iZWZvcmVfd2FpdCAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnRlcnJ1cHRfYWN0aXZlX2hpZ2ggICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVuX292ZXJ3cml0ZV9zdHJhcHMgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3RyYXBfd2FpdF9hY3RpdmVfaGkgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBsYXRfYnVzeV9jb3VudCAgIAkJOiAyOwotICAgICB1bnNpZ25lZCBsb25nIGxhdF9yZF9wbTRfc2Nsa19idXN5ICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX3N5c3RlbV9iaXRzICAJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfbXIgICAgICAgICAgIAkJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGNpZl9zcGFyZV8xICAgICAgCQk6IDQ7CisJdW5zaWduZWQgbG9uZyBzd2FwX3JlZyAgICAgICAgICAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgc3dhcF9mYnVmXzEgICAgICAgICAgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHN3YXBfZmJ1Zl8yICAgICAgICAgICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBzd2FwX2ZidWZfMyAgICAgICAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgcG1pX2ludF9kaXNhYmxlICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHBtaV9zY2htZW5fZGlzYWJsZSAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBpbnRiX29lICAgICAgICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZW5fd2FpdF90b19jb21wZW5zYXRlX2RxX3Byb3BfZGx5ICA6IDE7CisJdW5zaWduZWQgbG9uZyBjb21wZW5zYXRlX3dhaXRfcmRfc2l6ZSAgOiAyOworCXVuc2lnbmVkIGxvbmcgd2FpdF9hc3NlcnRlZF90aW1lb3V0X3ZhbCAgOiAyOworCXVuc2lnbmVkIGxvbmcgd2FpdF9tYXNrZWRfdmFsICAgICAgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIGVuX3dhaXRfdGltZW91dCAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl9vbmVfY2xrX3NldHVwX2JlZm9yZV93YWl0ICA6IDE7CisJdW5zaWduZWQgbG9uZyBpbnRlcnJ1cHRfYWN0aXZlX2hpZ2ggICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZW5fb3ZlcndyaXRlX3N0cmFwcyAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHN0cmFwX3dhaXRfYWN0aXZlX2hpICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBsYXRfYnVzeV9jb3VudCAgICAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgbGF0X3JkX3BtNF9zY2xrX2J1c3kgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGRpc19zeXN0ZW1fYml0cyAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfbXIgICAgICAgICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgY2lmX3NwYXJlXzEgICAgICAgICAgICAgIDogNDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIGNpZl9jbnRsX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3QgY2lmX2NudGxfdCBmOworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGNpZl9jbnRsX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBjZmdyZWdfYmFzZV90IHsKLSAgICAgdW5zaWduZWQgbG9uZyBjZmdyZWdfYmFzZSAgICAgIDogMjQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCTogODsKKwl1bnNpZ25lZCBsb25nIGNmZ3JlZ19iYXNlICA6IDI0OworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgIDogODsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIGNmZ3JlZ19iYXNlX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3QgY2ZncmVnX2Jhc2VfdCBmOworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGNmZ3JlZ19iYXNlX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBjaWZfaW9fdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZHFfc3JwICAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZHFfc3JuICAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZHFfc3AgICAgICAgICAgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZHFfc24gICAgICAgICAgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgd2FpdGJfc3JwICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgd2FpdGJfc3JuICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgd2FpdGJfc3AgICAgICAgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgd2FpdGJfc24gICAgICAgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW50Yl9zcnAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW50Yl9zcm4gICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW50Yl9zcCAgICAgICAgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW50Yl9zbiAgICAgICAgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCTogMjsKKwl1bnNpZ25lZCBsb25nIGRxX3NycCAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZHFfc3JuICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkcV9zcCAgICAgIDogNDsKKwl1bnNpZ25lZCBsb25nIGRxX3NuICAgICAgOiA0OworCXVuc2lnbmVkIGxvbmcgd2FpdGJfc3JwICA6IDE7CisJdW5zaWduZWQgbG9uZyB3YWl0Yl9zcm4gIDogMTsKKwl1bnNpZ25lZCBsb25nIHdhaXRiX3NwICAgOiA0OworCXVuc2lnbmVkIGxvbmcgd2FpdGJfc24gICA6IDQ7CisJdW5zaWduZWQgbG9uZyBpbnRiX3NycCAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGludGJfc3JuICAgOiAxOworCXVuc2lnbmVkIGxvbmcgaW50Yl9zcCAgICA6IDQ7CisJdW5zaWduZWQgbG9uZyBpbnRiX3NuICAgIDogNDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgOiAyOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gY2lmX2lvX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3QgY2lmX2lvX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBjaWZfaW9fdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGNpZl9yZWFkX2RiZ190IHsKLSAgICAgdW5zaWduZWQgbG9uZyB1bnBhY2tlcl9wcmVfZmV0Y2hfdHJpZ19nZW4gIDogMjsKLSAgICAgdW5zaWduZWQgbG9uZyBkbHlfc2Vjb25kX3JkX2ZldGNoX3RyaWcgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyByc3RfcmRfYnVyc3RfaWQgIAkJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfcmRfYnVyc3RfaWQgIAkJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbl9ibG9ja19yZF93aGVuX3BhY2tlcl9pc19ub3RfZW1wIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfcHJlX2ZldGNoX2NudGxfc20gICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyByYmJtX2Nocm5jeV9kaXMgIAkJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyByYmJtX3JkX2FmdGVyX3dyX2xhdCAgICAgICAgIDogMjsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfYmVfZHVyaW5nX3JkIAkJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBvbmVfY2xrX2ludmFsaWRhdGVfcHVsc2UgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfY2hubF9wcmlvcml0eQkJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyByc3RfcmVhZF9wYXRoX2FfcGxzICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyByc3RfcmVhZF9wYXRoX2JfcGxzICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfcmVnX3JkX2ZldGNoX3RyaWcgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfcmRfZmV0Y2hfdHJpZ19mcm9tX2luZF9hZGRyIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfcmRfc2FtZV9ieXRlX3RvX3RyaWdfZmV0Y2ggOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGRpc19kaXJfd3JhcCAgICAgCQkJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGRpc19yaW5nX2J1Zl90b19mb3JjZV9kZWMgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGRpc19hZGRyX2NvbXBfaW5fMTZiaXQgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGNscl93ICAgICAgICAgICAgCQkJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVycl9yZF90YWdfaXNfMyAgCQkJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVycl9sb2FkX3doZW5fZnVsX2EgICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVycl9sb2FkX3doZW5fZnVsX2IgICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nICAgIAkJCQkJCQk6IDc7CisJdW5zaWduZWQgbG9uZyB1bnBhY2tlcl9wcmVfZmV0Y2hfdHJpZ19nZW4gIDogMjsKKwl1bnNpZ25lZCBsb25nIGRseV9zZWNvbmRfcmRfZmV0Y2hfdHJpZyAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcnN0X3JkX2J1cnN0X2lkICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfcmRfYnVyc3RfaWQgICAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVuX2Jsb2NrX3JkX3doZW5fcGFja2VyX2lzX25vdF9lbXAgOiAxOworCXVuc2lnbmVkIGxvbmcgZGlzX3ByZV9mZXRjaF9jbnRsX3NtICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyByYmJtX2Nocm5jeV9kaXMgICAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHJiYm1fcmRfYWZ0ZXJfd3JfbGF0ICAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgZGlzX2JlX2R1cmluZ19yZCAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBvbmVfY2xrX2ludmFsaWRhdGVfcHVsc2UgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGRpc19jaG5sX3ByaW9yaXR5ICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcnN0X3JlYWRfcGF0aF9hX3BscyAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyByc3RfcmVhZF9wYXRoX2JfcGxzICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGRpc19yZWdfcmRfZmV0Y2hfdHJpZyAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZGlzX3JkX2ZldGNoX3RyaWdfZnJvbV9pbmRfYWRkciA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfcmRfc2FtZV9ieXRlX3RvX3RyaWdfZmV0Y2ggOiAxOworCXVuc2lnbmVkIGxvbmcgZGlzX2Rpcl93cmFwICAgICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfcmluZ19idWZfdG9fZm9yY2VfZGVjICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGRpc19hZGRyX2NvbXBfaW5fMTZiaXQgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgY2xyX3cgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlcnJfcmRfdGFnX2lzXzMgICAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVycl9sb2FkX3doZW5fZnVsX2EgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZXJyX2xvYWRfd2hlbl9mdWxfYiAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNzsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIGNpZl9yZWFkX2RiZ191IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IGNpZl9yZWFkX2RiZ190IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgY2lmX3JlYWRfZGJnX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBjaWZfd3JpdGVfZGJnX3QgewotICAgICB1bnNpZ25lZCBsb25nIHBhY2tlcl90aW1lb3V0X2NvdW50ICAgICAgICAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fdXBwZXJfbG9hZF9jb25kICAgICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbl9jaG5sX2NoYW5nZV9jb25kICAgICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGRpc19hZGRyX2NvbXBfY29uZCAgICAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX2xvYWRfc2FtZV9ieXRlX2FkZHJfY29uZCAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfdGltZW91dF9jb25kIAkJCSAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGRpc190aW1lb3V0X2R1cmluZ19yYmJtICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX3BhY2tlcl9mdWxfZHVyaW5nX3JiYm1fdGltZW91dCA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fZHdvcmRfc3BsaXRfdG9fcmJibSAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbl9kdW1teV92YWwgICAgIAkJCSAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGR1bW15X3ZhbF9zZWwgICAgCQkJICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFza19wbTRfd3JwdHJfZGVjICAgICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfbWNfY2xlYW5fY29uZAkJCSAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVycl90d29fcmVxaV9kdXJpbmdfZnVsICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZXJyX3JlcWlfZHVyaW5nX2lkbGVfY2xrICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlcnJfZ2xvYmFsICAgICAgIAkJCSAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVuX3dyX2J1Zl9kYmdfbG9hZCAgICAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fd3JfYnVmX2RiZ19wYXRoICAgICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBzZWxfd3JfYnVmX2J5dGUgIAkJCSAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nIGRpc19yZF9mbHVzaF93ciAgCQkJICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX3BhY2tlcl9mdWxfY29uZCAgICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfaW52YWxpZGF0ZV9ieV9vcHNfY2hubCAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVuX2hhbHRfd2hlbl9yZXFpX2VyciAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY2lmX3NwYXJlXzIgICAgICAJCQkgIDogNTsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJCQkJICA6IDE7CisJdW5zaWduZWQgbG9uZyBwYWNrZXJfdGltZW91dF9jb3VudCAgICAgICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBlbl91cHBlcl9sb2FkX2NvbmQgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl9jaG5sX2NoYW5nZV9jb25kICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfYWRkcl9jb21wX2NvbmQgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfbG9hZF9zYW1lX2J5dGVfYWRkcl9jb25kICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfdGltZW91dF9jb25kICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfdGltZW91dF9kdXJpbmdfcmJibSAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfcGFja2VyX2Z1bF9kdXJpbmdfcmJibV90aW1lb3V0IDogMTsKKwl1bnNpZ25lZCBsb25nIGVuX2R3b3JkX3NwbGl0X3RvX3JiYm0gICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVuX2R1bW15X3ZhbCAgICAgICAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGR1bW15X3ZhbF9zZWwgICAgICAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIG1hc2tfcG00X3dycHRyX2RlYyAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGRpc19tY19jbGVhbl9jb25kICAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVycl90d29fcmVxaV9kdXJpbmdfZnVsICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVycl9yZXFpX2R1cmluZ19pZGxlX2NsayAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVycl9nbG9iYWwgICAgICAgICAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVuX3dyX2J1Zl9kYmdfbG9hZCAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVuX3dyX2J1Zl9kYmdfcGF0aCAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNlbF93cl9idWZfYnl0ZSAgICAgICAgICAgICAgIDogMzsKKwl1bnNpZ25lZCBsb25nIGRpc19yZF9mbHVzaF93ciAgICAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGRpc19wYWNrZXJfZnVsX2NvbmQgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGRpc19pbnZhbGlkYXRlX2J5X29wc19jaG5sICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVuX2hhbHRfd2hlbl9yZXFpX2VyciAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGNpZl9zcGFyZV8yICAgICAgICAgICAgICAgICAgIDogNTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIGNpZl93cml0ZV9kYmdfdSB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsIDogMzI7Ci0gICAgIHN0cnVjdCBjaWZfd3JpdGVfZGJnX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBjaWZfd3JpdGVfZGJnX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIAogc3RydWN0IGludGZfY250bF90IHsKLSAgICAgdW5zaWduZWQgY2hhciBhZF9pbmNfYSAgICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgY2hhciByaW5nX2J1Zl9hICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgY2hhciByZF9mZXRjaF90cmlnZ2VyX2EgIDogMTsKLSAgICAgdW5zaWduZWQgY2hhciByZF9kYXRhX3JkeV9hICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgY2hhciBhZF9pbmNfYiAgICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgY2hhciByaW5nX2J1Zl9iICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgY2hhciByZF9mZXRjaF90cmlnZ2VyX2IgIDogMTsKLSAgICAgdW5zaWduZWQgY2hhciByZF9kYXRhX3JkeV9iICAgICAgIDogMTsKKwl1bnNpZ25lZCBjaGFyIGFkX2luY19hICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGNoYXIgcmluZ19idWZfYSAgICAgICAgICA6IDE7CisJdW5zaWduZWQgY2hhciByZF9mZXRjaF90cmlnZ2VyX2EgIDogMTsKKwl1bnNpZ25lZCBjaGFyIHJkX2RhdGFfcmR5X2EgICAgICAgOiAxOworCXVuc2lnbmVkIGNoYXIgYWRfaW5jX2IgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgY2hhciByaW5nX2J1Zl9iICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBjaGFyIHJkX2ZldGNoX3RyaWdnZXJfYiAgOiAxOworCXVuc2lnbmVkIGNoYXIgcmRfZGF0YV9yZHlfYiAgICAgICA6IDE7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBpbnRmX2NudGxfdSB7Ci0gICAgIHVuc2lnbmVkIGNoYXIgdmFsIDogODsKLSAgICAgc3RydWN0IGludGZfY250bF90IGY7CisJdW5zaWduZWQgY2hhciB2YWwgOiA4OworCXN0cnVjdCBpbnRmX2NudGxfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGNwdV9kZWZhdWx0c190IHsKLSAgICAgdW5zaWduZWQgY2hhciB1bnBhY2tfcmRfZGF0YSAgIDogMTsKLSAgICAgdW5zaWduZWQgY2hhciBhY2Nlc3NfaW5kX2FkZHJfYTogMTsKLSAgICAgdW5zaWduZWQgY2hhciBhY2Nlc3NfaW5kX2FkZHJfYjogMTsKLSAgICAgdW5zaWduZWQgY2hhciBhY2Nlc3Nfc2NyYXRjaF9yZWcgICAgICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBjaGFyIHBhY2tfd3JfZGF0YSAgICAgOiAxOwotICAgICB1bnNpZ25lZCBjaGFyIHRyYW5zaXRpb25fc2l6ZSAgOiAxOwotICAgICB1bnNpZ25lZCBjaGFyIGVuX3JlYWRfYnVmX21vZGUgOiAxOwotICAgICB1bnNpZ25lZCBjaGFyIHJkX2ZldGNoX3NjcmF0Y2ggOiAxOworCXVuc2lnbmVkIGNoYXIgdW5wYWNrX3JkX2RhdGEgICAgIDogMTsKKwl1bnNpZ25lZCBjaGFyIGFjY2Vzc19pbmRfYWRkcl9hICA6IDE7CisJdW5zaWduZWQgY2hhciBhY2Nlc3NfaW5kX2FkZHJfYiAgOiAxOworCXVuc2lnbmVkIGNoYXIgYWNjZXNzX3NjcmF0Y2hfcmVnIDogMTsKKwl1bnNpZ25lZCBjaGFyIHBhY2tfd3JfZGF0YSAgICAgICA6IDE7CisJdW5zaWduZWQgY2hhciB0cmFuc2l0aW9uX3NpemUgICAgOiAxOworCXVuc2lnbmVkIGNoYXIgZW5fcmVhZF9idWZfbW9kZSAgIDogMTsKKwl1bnNpZ25lZCBjaGFyIHJkX2ZldGNoX3NjcmF0Y2ggICA6IDE7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBjcHVfZGVmYXVsdHNfdSB7Ci0gICAgIHVuc2lnbmVkIGNoYXIgdmFsIDogODsKLSAgICAgc3RydWN0IGNwdV9kZWZhdWx0c190IGY7CisJdW5zaWduZWQgY2hhciB2YWwgOiA4OworCXN0cnVjdCBjcHVfZGVmYXVsdHNfdCBmOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGNydGNfdG90YWxfdCB7CisJdW5zaWduZWQgbG9uZyBjcnRjX2hfdG90YWwgOiAxMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICA6IDY7CisJdW5zaWduZWQgbG9uZyBjcnRjX3ZfdG90YWwgOiAxMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICA6IDY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit1bmlvbiBjcnRjX3RvdGFsX3UgeworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGNydGNfdG90YWxfdCBmOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGNydGNfc3NfdCB7CisJdW5zaWduZWQgbG9uZyBzc19zdGFydCAgICA6IDEwOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgOiA2OworCXVuc2lnbmVkIGxvbmcgc3NfZW5kICAgICAgOiAxMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHNzX2FsaWduICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNzX3BvbCAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNzX3J1bl9tb2RlIDogMTsKKwl1bnNpZ25lZCBsb25nIHNzX2VuICAgICAgIDogMTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3VuaW9uIGNydGNfc3NfdSB7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgY3J0Y19zc190IGY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgYWN0aXZlX2hfZGlzcF90IHsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV9oX3N0YXJ0ICA6IDEwOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgIDogNjsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV9oX2VuZCAgICA6IDEwOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgIDogNjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3VuaW9uIGFjdGl2ZV9oX2Rpc3BfdSB7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgYWN0aXZlX2hfZGlzcF90IGY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgYWN0aXZlX3ZfZGlzcF90IHsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV92X3N0YXJ0ICA6IDEwOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgIDogNjsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV92X2VuZCAgICA6IDEwOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgIDogNjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3VuaW9uIGFjdGl2ZV92X2Rpc3BfdSB7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgYWN0aXZlX3ZfZGlzcF90IGY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZ3JhcGhpY19oX2Rpc3BfdCB7CisJdW5zaWduZWQgbG9uZyBncmFwaGljX2hfc3RhcnQgOiAxMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICA6IDY7CisJdW5zaWduZWQgbG9uZyBncmFwaGljX2hfZW5kICAgOiAxMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICA6IDY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit1bmlvbiBncmFwaGljX2hfZGlzcF91IHsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBncmFwaGljX2hfZGlzcF90IGY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZ3JhcGhpY192X2Rpc3BfdCB7CisJdW5zaWduZWQgbG9uZyBncmFwaGljX3Zfc3RhcnQgOiAxMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICA6IDY7CisJdW5zaWduZWQgbG9uZyBncmFwaGljX3ZfZW5kICAgOiAxMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICA6IDY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit1bmlvbiBncmFwaGljX3ZfZGlzcF91eworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGdyYXBoaWNfdl9kaXNwX3QgZjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBncmFwaGljX2N0cmxfdF93MTAwIHsKKwl1bnNpZ25lZCBsb25nIGNvbG9yX2RlcHRoICAgICAgIDogMzsKKwl1bnNpZ25lZCBsb25nIHBvcnRyYWl0X21vZGUgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIGxvd19wb3dlcl9vbiAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHJlcV9mcmVxICAgICAgICAgIDogNDsKKwl1bnNpZ25lZCBsb25nIGVuX2NydGMgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVuX2dyYXBoaWNfcmVxICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVuX2dyYXBoaWNfY3J0YyAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3JlcV9ncmFwaGljIDogOTsKKwl1bnNpZ25lZCBsb25nIGxjZF9wY2xrX29uICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGxjZF9zY2xrX29uICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHBjbGtfcnVubmluZyAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNjbGtfcnVubmluZyAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgIDogNjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBncmFwaGljX2N0cmxfdF93MzJ4eCB7CisJdW5zaWduZWQgbG9uZyBjb2xvcl9kZXB0aCAgICAgICA6IDM7CisJdW5zaWduZWQgbG9uZyBwb3J0cmFpdF9tb2RlICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBsb3dfcG93ZXJfb24gICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyByZXFfZnJlcSAgICAgICAgICA6IDQ7CisJdW5zaWduZWQgbG9uZyBlbl9jcnRjICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl9ncmFwaGljX3JlcSAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl9ncmFwaGljX2NydGMgICA6IDE7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9yZXFfZ3JhcGhpYyA6IDEwOworCXVuc2lnbmVkIGxvbmcgbGNkX3BjbGtfb24gICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgbGNkX3NjbGtfb24gICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcGNsa19ydW5uaW5nICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgc2Nsa19ydW5uaW5nICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICAgOiA1OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordW5pb24gZ3JhcGhpY19jdHJsX3UgeworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGdyYXBoaWNfY3RybF90X3cxMDAgZl93MTAwOworCXN0cnVjdCBncmFwaGljX2N0cmxfdF93MzJ4eCBmX3czMnh4OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHZpZGVvX2N0cmxfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9fbW9kZSAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcga2V5ZXJfZW4gICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fdmlkZW9fcmVxICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fZ3JhcGhpY19yZXFfdmlkZW8gICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbl92aWRlb19jcnRjICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyB2aWRlb19ob3JfZXhwICAgIDogMjsKLSAgICAgdW5zaWduZWQgbG9uZyB2aWRlb192ZXJfZXhwICAgIDogMjsKLSAgICAgdW5zaWduZWQgbG9uZyB1dl9jb21iaW5lICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyB0b3RhbF9yZXFfdmlkZW8gIDogOTsKLSAgICAgdW5zaWduZWQgbG9uZyB2aWRlb19jaF9zZWwgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyB2aWRlb19wb3J0cmFpdCAgIDogMjsKLSAgICAgdW5zaWduZWQgbG9uZyB5dXYycmdiX2VuICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyB5dXYycmdiX29wdGlvbiAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyB2aWRlb19pbnZfaG9yICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyB2aWRlb19pbnZfdmVyICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBnYW1tYV9zZWwgICAgICAgIDogMjsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfbGltaXQgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbl91dl9oYmxlbmQgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyByZ2JfZ2FtbWFfc2VsICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHZpZGVvX21vZGUgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcga2V5ZXJfZW4gICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl92aWRlb19yZXEgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVuX2dyYXBoaWNfcmVxX3ZpZGVvICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl92aWRlb19jcnRjICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHZpZGVvX2hvcl9leHAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgdmlkZW9fdmVyX2V4cCAgICA6IDI7CisJdW5zaWduZWQgbG9uZyB1dl9jb21iaW5lICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3JlcV92aWRlbyAgOiA5OworCXVuc2lnbmVkIGxvbmcgdmlkZW9fY2hfc2VsICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyB2aWRlb19wb3J0cmFpdCAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHl1djJyZ2JfZW4gICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgeXV2MnJnYl9vcHRpb24gICA6IDE7CisJdW5zaWduZWQgbG9uZyB2aWRlb19pbnZfaG9yICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHZpZGVvX2ludl92ZXIgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZ2FtbWFfc2VsICAgICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBkaXNfbGltaXQgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVuX3V2X2hibGVuZCAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcmdiX2dhbW1hX3NlbCAgICA6IDI7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiB2aWRlb19jdHJsX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3QgdmlkZW9fY3RybF90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgdmlkZW9fY3RybF90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgZGlzcF9kYl9idWZfY250bF9yZF90IHsKLSAgICAgdW5zaWduZWQgbG9uZyBlbl9kYl9idWYgICAgICAgIAk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdXBkYXRlX2RiX2J1Zl9kb25lICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGRiX2J1Zl9jbnRsICAgICAgCTogNjsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJCTogMjQ7CisJdW5zaWduZWQgbG9uZyBlbl9kYl9idWYgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHVwZGF0ZV9kYl9idWZfZG9uZSAgOiAxOworCXVuc2lnbmVkIGxvbmcgZGJfYnVmX2NudGwgICAgICAgICA6IDY7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICAgIDogMjQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBkaXNwX2RiX2J1Zl9jbnRsX3JkX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3QgZGlzcF9kYl9idWZfY250bF9yZF90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgZGlzcF9kYl9idWZfY250bF9yZF90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgZGlzcF9kYl9idWZfY250bF93cl90IHsKLSAgICAgdW5zaWduZWQgbG9uZyBlbl9kYl9idWYgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyB1cGRhdGVfZGJfYnVmICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkYl9idWZfY250bCAgICAgIDogNjsKLSAgICAgdW5zaWduZWQgbG9uZyAgICA6IDI0OworCXVuc2lnbmVkIGxvbmcgZW5fZGJfYnVmICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgdXBkYXRlX2RiX2J1ZiAgOiAxOworCXVuc2lnbmVkIGxvbmcgZGJfYnVmX2NudGwgICAgOiA2OworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgOiAyNDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIGRpc3BfZGJfYnVmX2NudGxfd3JfdSB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsIDogMzI7Ci0gICAgIHN0cnVjdCBkaXNwX2RiX2J1Zl9jbnRsX3dyX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBkaXNwX2RiX2J1Zl9jbnRsX3dyX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBnYW1tYV92YWx1ZTFfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZ2FtbWExICAgICAgICAgICA6IDg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZ2FtbWEyICAgICAgICAgICA6IDg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZ2FtbWEzICAgICAgICAgICA6IDg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZ2FtbWE0ICAgICAgICAgICA6IDg7CisJdW5zaWduZWQgbG9uZyBnYW1tYTEgICA6IDg7CisJdW5zaWduZWQgbG9uZyBnYW1tYTIgICA6IDg7CisJdW5zaWduZWQgbG9uZyBnYW1tYTMgICA6IDg7CisJdW5zaWduZWQgbG9uZyBnYW1tYTQgICA6IDg7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBnYW1tYV92YWx1ZTFfdSB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsIDogMzI7Ci0gICAgIHN0cnVjdCBnYW1tYV92YWx1ZTFfdCBmOworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGdhbW1hX3ZhbHVlMV90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgZ2FtbWFfdmFsdWUyX3QgewotICAgICB1bnNpZ25lZCBsb25nIGdhbW1hNSAgICAgICAgICAgOiA4OwotICAgICB1bnNpZ25lZCBsb25nIGdhbW1hNiAgICAgICAgICAgOiA4OwotICAgICB1bnNpZ25lZCBsb25nIGdhbW1hNyAgICAgICAgICAgOiA4OwotICAgICB1bnNpZ25lZCBsb25nIGdhbW1hOCAgICAgICAgICAgOiA4OworCXVuc2lnbmVkIGxvbmcgZ2FtbWE1ICAgOiA4OworCXVuc2lnbmVkIGxvbmcgZ2FtbWE2ICAgOiA4OworCXVuc2lnbmVkIGxvbmcgZ2FtbWE3ICAgOiA4OworCXVuc2lnbmVkIGxvbmcgZ2FtbWE4ICAgOiA4OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gZ2FtbWFfdmFsdWUyX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3QgZ2FtbWFfdmFsdWUyX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBnYW1tYV92YWx1ZTJfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGdhbW1hX3Nsb3BlX3QgewotICAgICB1bnNpZ25lZCBsb25nIHNsb3BlMSAgICAgICAgICAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nIHNsb3BlMiAgICAgICAgICAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nIHNsb3BlMyAgICAgICAgICAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nIHNsb3BlNCAgICAgICAgICAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nIHNsb3BlNSAgICAgICAgICAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nIHNsb3BlNiAgICAgICAgICAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nIHNsb3BlNyAgICAgICAgICAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nIHNsb3BlOCAgICAgICAgICAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nICAgIAkJCQk6IDg7CisJdW5zaWduZWQgbG9uZyBzbG9wZTEgICA6IDM7CisJdW5zaWduZWQgbG9uZyBzbG9wZTIgICA6IDM7CisJdW5zaWduZWQgbG9uZyBzbG9wZTMgICA6IDM7CisJdW5zaWduZWQgbG9uZyBzbG9wZTQgICA6IDM7CisJdW5zaWduZWQgbG9uZyBzbG9wZTUgICA6IDM7CisJdW5zaWduZWQgbG9uZyBzbG9wZTYgICA6IDM7CisJdW5zaWduZWQgbG9uZyBzbG9wZTcgICA6IDM7CisJdW5zaWduZWQgbG9uZyBzbG9wZTggICA6IDM7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICA6IDg7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBnYW1tYV9zbG9wZV91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IGdhbW1hX3Nsb3BlX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBnYW1tYV9zbG9wZV90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgbWNfZXh0X21lbV9sb2NhdGlvbl90IHsKLSAgICAgdW5zaWduZWQgbG9uZyBtY19leHRfbWVtX3N0YXJ0IDogMTY7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWNfZXh0X21lbV90b3AgICA6IDE2OworCXVuc2lnbmVkIGxvbmcgbWNfZXh0X21lbV9zdGFydCA6IDE2OworCXVuc2lnbmVkIGxvbmcgbWNfZXh0X21lbV90b3AgICA6IDE2OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gbWNfZXh0X21lbV9sb2NhdGlvbl91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IG1jX2V4dF9tZW1fbG9jYXRpb25fdCBmOworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IG1jX2V4dF9tZW1fbG9jYXRpb25fdCBmOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IG1jX2ZiX2xvY2F0aW9uX3QgeworCXVuc2lnbmVkIGxvbmcgbWNfZmJfc3RhcnQgICAgICA6IDE2OworCXVuc2lnbmVkIGxvbmcgbWNfZmJfdG9wICAgICAgICA6IDE2OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordW5pb24gbWNfZmJfbG9jYXRpb25fdSB7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgbWNfZmJfbG9jYXRpb25fdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGNsa19waW5fY250bF90IHsKLSAgICAgdW5zaWduZWQgbG9uZyBvc2NfZW4gICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBvc2NfZ2FpbiAgICAgICAgIDogNTsKLSAgICAgdW5zaWduZWQgbG9uZyBkb250X3VzZV94dGFsaW4gIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyB4dGFsaW5fcG1fZW4gICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyB4dGFsaW5fZGJsX2VuICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJOiA3OwotICAgICB1bnNpZ25lZCBsb25nIGNnX2RlYnVnICAgICAgICAgOiAxNjsKKwl1bnNpZ25lZCBsb25nIG9zY19lbiAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgb3NjX2dhaW4gICAgICAgICA6IDU7CisJdW5zaWduZWQgbG9uZyBkb250X3VzZV94dGFsaW4gIDogMTsKKwl1bnNpZ25lZCBsb25nIHh0YWxpbl9wbV9lbiAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgeHRhbGluX2RibF9lbiAgICA6IDE7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgIDogNzsKKwl1bnNpZ25lZCBsb25nIGNnX2RlYnVnICAgICAgICAgOiAxNjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIGNsa19waW5fY250bF91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IGNsa19waW5fY250bF90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgY2xrX3Bpbl9jbnRsX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBwbGxfcmVmX2ZiX2Rpdl90IHsKLSAgICAgdW5zaWduZWQgbG9uZyBwbGxfcmVmX2RpdiAgICAgIDogNDsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJOiA0OwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9mYl9kaXZfaW50ICAgOiA2OwotICAgICB1bnNpZ25lZCBsb25nICAgIAkJCQk6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX2ZiX2Rpdl9mcmFjICA6IDM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBwbGxfcmVzZXRfdGltZSAgIDogNDsKLSAgICAgdW5zaWduZWQgbG9uZyBwbGxfbG9ja190aW1lICAgIDogODsKKwl1bnNpZ25lZCBsb25nIHBsbF9yZWZfZGl2ICAgICAgOiA0OworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICA6IDQ7CisJdW5zaWduZWQgbG9uZyBwbGxfZmJfZGl2X2ludCAgIDogNjsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgcGxsX2ZiX2Rpdl9mcmFjICA6IDM7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHBsbF9yZXNldF90aW1lICAgOiA0OworCXVuc2lnbmVkIGxvbmcgcGxsX2xvY2tfdGltZSAgICA6IDg7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBwbGxfcmVmX2ZiX2Rpdl91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IHBsbF9yZWZfZmJfZGl2X3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBwbGxfcmVmX2ZiX2Rpdl90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgcGxsX2NudGxfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3B3ZG4gICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3Jlc2V0ICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3BtX2VuICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX21vZGUgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3JlZmNsa19zZWwgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX2ZiY2xrX3NlbCAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3RjcG9mZiAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3BjcCAgICAgICAgICA6IDM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3B2ZyAgICAgICAgICA6IDM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3Zjb2ZyICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX2lvZmZzZXQgICAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3BlY2NfbW9kZSAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3BlY2Nfc2NvbiAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX2RhY3RhbCAgICAgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX2NwX2NsaXAgICAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX2NvbmYgICAgICAgICA6IDM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX21iY3RybCAgICAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3Jpbmdfb2ZmICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBwbGxfcHdkbiAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcGxsX3Jlc2V0ICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHBsbF9wbV9lbiAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBwbGxfbW9kZSAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcGxsX3JlZmNsa19zZWwgIDogMTsKKwl1bnNpZ25lZCBsb25nIHBsbF9mYmNsa19zZWwgICA6IDE7CisJdW5zaWduZWQgbG9uZyBwbGxfdGNwb2ZmICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcGxsX3BjcCAgICAgICAgIDogMzsKKwl1bnNpZ25lZCBsb25nIHBsbF9wdmcgICAgICAgICA6IDM7CisJdW5zaWduZWQgbG9uZyBwbGxfdmNvZnIgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcGxsX2lvZmZzZXQgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHBsbF9wZWNjX21vZGUgICA6IDI7CisJdW5zaWduZWQgbG9uZyBwbGxfcGVjY19zY29uICAgOiAyOworCXVuc2lnbmVkIGxvbmcgcGxsX2RhY3RhbCAgICAgIDogNDsKKwl1bnNpZ25lZCBsb25nIHBsbF9jcF9jbGlwICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBwbGxfY29uZiAgICAgICAgOiAzOworCXVuc2lnbmVkIGxvbmcgcGxsX21iY3RybCAgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHBsbF9yaW5nX29mZiAgICA6IDE7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBwbGxfY250bF91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IHBsbF9jbnRsX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBwbGxfY250bF90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgc2Nsa19jbnRsX3QgewotICAgICB1bnNpZ25lZCBsb25nIHNjbGtfc3JjX3NlbCAgICAgCTogMjsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJCTogMjsKLSAgICAgdW5zaWduZWQgbG9uZyBzY2xrX3Bvc3RfZGl2X2Zhc3QgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2Nsa19jbGtvbl9oeXMgICAJOiAzOwotICAgICB1bnNpZ25lZCBsb25nIHNjbGtfcG9zdF9kaXZfc2xvdyAgIDogNDsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNwX2NnX29rMnN3aXRjaF9lbiA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9yZWcgICAJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfZGlzcCAgCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBzY2xrX2ZvcmNlX21jICAgIAk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9leHRtYyAJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfY3AgICAgCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBzY2xrX2ZvcmNlX2UyICAgIAk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9lMyAgICAJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfaWRjdCAgCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBzY2xrX2ZvcmNlX2Jpc3QgIAk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgYnVzeV9leHRlbmRfY3AgICAJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGJ1c3lfZXh0ZW5kX2UyICAgCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBidXN5X2V4dGVuZF9lMyAgIAk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgYnVzeV9leHRlbmRfaWRjdCAJOiAxOwotICAgICB1bnNpZ25lZCBsb25nICAgIAkJCQkJOiAzOworCXVuc2lnbmVkIGxvbmcgc2Nsa19zcmNfc2VsICAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgc2Nsa19wb3N0X2Rpdl9mYXN0ICAgOiA0OworCXVuc2lnbmVkIGxvbmcgc2Nsa19jbGtvbl9oeXMgICAgICAgOiAzOworCXVuc2lnbmVkIGxvbmcgc2Nsa19wb3N0X2Rpdl9zbG93ICAgOiA0OworCXVuc2lnbmVkIGxvbmcgZGlzcF9jZ19vazJzd2l0Y2hfZW4gOiAxOworCXVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9yZWcgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9kaXNwICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9tYyAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9leHRtYyAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9jcCAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9lMiAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9lMyAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9pZGN0ICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9iaXN0ICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgYnVzeV9leHRlbmRfY3AgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgYnVzeV9leHRlbmRfZTIgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgYnVzeV9leHRlbmRfZTMgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgYnVzeV9leHRlbmRfaWRjdCAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICAgICAgOiAzOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gc2Nsa19jbnRsX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3Qgc2Nsa19jbnRsX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBzY2xrX2NudGxfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHBjbGtfY250bF90IHsKLSAgICAgdW5zaWduZWQgbG9uZyBwY2xrX3NyY19zZWwgICAgIDogMjsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJOiAyOwotICAgICB1bnNpZ25lZCBsb25nIHBjbGtfcG9zdF9kaXYgICAgOiA0OwotICAgICB1bnNpZ25lZCBsb25nICAgIAkJCQk6IDg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGNsa19mb3JjZV9kaXNwICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCTogMTU7CisJdW5zaWduZWQgbG9uZyBwY2xrX3NyY19zZWwgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgcGNsa19wb3N0X2RpdiAgICA6IDQ7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgIDogODsKKwl1bnNpZ25lZCBsb25nIHBjbGtfZm9yY2VfZGlzcCAgOiAxOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICA6IDE1OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gcGNsa19jbnRsX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3QgcGNsa19jbnRsX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBwY2xrX2NudGxfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAorCisjZGVmaW5lIFRFU1RDTEtfU1JDX1BMTCAgIDB4MDEKKyNkZWZpbmUgVEVTVENMS19TUkNfU0NMSyAgMHgwMgorI2RlZmluZSBURVNUQ0xLX1NSQ19QQ0xLICAweDAzCisvKiA0IGFuZCA1IHNlZW0gdG8gYnkgWFRBTC9NICovCisjZGVmaW5lIFRFU1RDTEtfU1JDX1hUQUwgIDB4MDYKKwogc3RydWN0IGNsa190ZXN0X2NudGxfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdGVzdGNsa19zZWwgICAgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCTogMzsKLSAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9jaGVja19mcmVxIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyB0c3Rjb3VudF9yc3QgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJOiAxNTsKLSAgICAgdW5zaWduZWQgbG9uZyB0ZXN0X2NvdW50ICAgICAgIDogODsKKwl1bnNpZ25lZCBsb25nIHRlc3RjbGtfc2VsICAgICAgOiA0OworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICA6IDM7CisJdW5zaWduZWQgbG9uZyBzdGFydF9jaGVja19mcmVxIDogMTsKKwl1bnNpZ25lZCBsb25nIHRzdGNvdW50X3JzdCAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICA6IDE1OworCXVuc2lnbmVkIGxvbmcgdGVzdF9jb3VudCAgICAgICA6IDg7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBjbGtfdGVzdF9jbnRsX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3QgY2xrX3Rlc3RfY250bF90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgY2xrX3Rlc3RfY250bF90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgcHdybWd0X2NudGxfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcHdtX2VuYWJsZSAgICAgICAJOiAxOwotICAgICB1bnNpZ25lZCBsb25nICAgIAkJCQkJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHB3bV9tb2RlX3JlcSAgICAgICAgIDogMjsKLSAgICAgdW5zaWduZWQgbG9uZyBwd21fd2FrZXVwX2NvbmQgICAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcHdtX2Zhc3Rfbm9tbF9od19lbiAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHB3bV9ub21sX2Zhc3RfaHdfZW4gIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBwd21fZmFzdF9ub21sX2NvbmQgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcHdtX25vbWxfZmFzdF9jb25kICAgOiA0OwotICAgICB1bnNpZ25lZCBsb25nIHB3bV9pZGxlX3RpbWVyICAgCTogODsKLSAgICAgdW5zaWduZWQgbG9uZyBwd21fYnVzeV90aW1lciAgIAk6IDg7CisJdW5zaWduZWQgbG9uZyBwd21fZW5hYmxlICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBwd21fbW9kZV9yZXEgICAgICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBwd21fd2FrZXVwX2NvbmQgICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBwd21fZmFzdF9ub21sX2h3X2VuICA6IDE7CisJdW5zaWduZWQgbG9uZyBwd21fbm9tbF9mYXN0X2h3X2VuICA6IDE7CisJdW5zaWduZWQgbG9uZyBwd21fZmFzdF9ub21sX2NvbmQgICA6IDQ7CisJdW5zaWduZWQgbG9uZyBwd21fbm9tbF9mYXN0X2NvbmQgICA6IDQ7CisJdW5zaWduZWQgbG9uZyBwd21faWRsZV90aW1lciAgICAgICA6IDg7CisJdW5zaWduZWQgbG9uZyBwd21fYnVzeV90aW1lciAgICAgICA6IDg7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBwd3JtZ3RfY250bF91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IHB3cm1ndF9jbnRsX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBwd3JtZ3RfY250bF90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvS2NvbmZpZyBiL2RyaXZlcnMvdzEvS2NvbmZpZwppbmRleCA3MTFiOTA5Li45YTFlMDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL0tjb25maWcKKysrIGIvZHJpdmVycy93MS9LY29uZmlnCkBAIC01NCw0ICs1NCwyMCBAQAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IDEtd2lyZQogCSAgc2ltcGxlIDY0Yml0IG1lbW9yeSByb20oZHMyNDAxL2RzMjQxMS9kczE5OTAqKSB0byB5b3Ugd2lyZS4KIAorY29uZmlnIFcxX0RTMjQzMworCXRyaXN0YXRlICI0a2IgRUVQUk9NIGZhbWlseSBzdXBwb3J0IChEUzI0MzMpIgorCWRlcGVuZHMgb24gVzEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIDEtd2lyZQorCSAgNGtiIEVFUFJPTSBmYW1pbHkgZGV2aWNlIChEUzI0MzMpLgorCitjb25maWcgVzFfRFMyNDMzX0NSQworCWJvb2wgIlByb3RlY3QgRFMyNDMzIGRhdGEgd2l0aCBhIENSQzE2IgorCWRlcGVuZHMgb24gVzFfRFMyNDMzCisJc2VsZWN0IENSQzE2CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBwcm90ZWN0IERTMjQzMyBkYXRhIHdpdGggYSBDUkMxNi4KKwkgIEVhY2ggYmxvY2sgaGFzIDMwIGJ5dGVzIG9mIGRhdGEgYW5kIGEgdHdvIGJ5dGUgQ1JDMTYuCisJICBGdWxsIGJsb2NrIHdyaXRlcyBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBDUkMgaXMgdmFsaWQuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvTWFrZWZpbGUgYi9kcml2ZXJzL3cxL01ha2VmaWxlCmluZGV4IDgwNzI1YzMuLjAxZmI1NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy93MS9NYWtlZmlsZQpAQCAtNiw2ICs2LDEwIEBACiBFWFRSQV9DRkxBR1MJKz0gLURORVRMSU5LX0RJU0FCTEVECiBlbmRpZgogCitpZmVxICgkKENPTkZJR19XMV9EUzI0MzNfQ1JDKSwgeSkKK0VYVFJBX0NGTEFHUwkrPSAtRENPTkZJR19XMV9GMjNfQ1JDCitlbmRpZgorCiBvYmotJChDT05GSUdfVzEpCSs9IHdpcmUubwogd2lyZS1vYmpzCQk6PSB3MS5vIHcxX2ludC5vIHcxX2ZhbWlseS5vIHcxX25ldGxpbmsubyB3MV9pby5vCiAKQEAgLTEzLDggKzE3LDkgQEAKIG9iai0kKENPTkZJR19XMV9USEVSTSkJCSs9IHcxX3RoZXJtLm8KIG9iai0kKENPTkZJR19XMV9TTUVNKQkJKz0gdzFfc21lbS5vCiAKLW9iai0kKENPTkZJR19XMV9EUzk0OTApCQkrPSBkczk0OTByLm8gCitvYmotJChDT05GSUdfVzFfRFM5NDkwKQkJKz0gZHM5NDkwci5vCiBkczk0OTByLW9ianMgICAgOj0gZHNjb3JlLm8KIAogb2JqLSQoQ09ORklHX1cxX0RTOTQ5MF9CUklER0UpCSs9IGRzX3cxX2JyaWRnZS5vCiAKK29iai0kKENPTkZJR19XMV9EUzI0MzMpCQkrPSB3MV9kczI0MzMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9kc193MV9icmlkZ2UuYyBiL2RyaXZlcnMvdzEvZHNfdzFfYnJpZGdlLmMKaW5kZXggN2JkZGQ4YS4uYTc5ZDE2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9kc193MV9icmlkZ2UuYworKysgYi9kcml2ZXJzL3cxL2RzX3cxX2JyaWRnZS5jCkBAIC0xLDggKzEsOCBAQAogLyoKLSAqIAlkc193MV9icmlkZ2UuYworICoJZHNfdzFfYnJpZGdlLmMKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXZnZW5peSBQb2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4KLSAqIAorICoKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlICIuLi93MS93MS5oIgogI2luY2x1ZGUgIi4uL3cxL3cxX2ludC5oIgogI2luY2x1ZGUgImRzY29yZS5oIgotCQorCiBzdGF0aWMgc3RydWN0IGRzX2RldmljZSAqZHNfZGV2Owogc3RhdGljIHN0cnVjdCB3MV9idXNfbWFzdGVyICpkc19idXNfbWFzdGVyOwogCkBAIC0xMjAsNyArMTIwLDcgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGRzX3cxX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwotCQorCiAJZHNfYnVzX21hc3RlciA9IGttYWxsb2Moc2l6ZW9mKCpkc19idXNfbWFzdGVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkc19idXNfbWFzdGVyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGFsbG9jYXRlIERTOTQ5MFIgVVNCPC0+VzEgYnVzX21hc3RlciBzdHJ1Y3R1cmUuXG4iKTsKQEAgLTEzNiwxNCArMTM2LDE0IEBACiAKIAltZW1zZXQoZHNfYnVzX21hc3RlciwgMCwgc2l6ZW9mKCpkc19idXNfbWFzdGVyKSk7CiAKLQlkc19idXNfbWFzdGVyLT5kYXRhIAkJPSAodW5zaWduZWQgbG9uZylkc19kZXY7Ci0JZHNfYnVzX21hc3Rlci0+dG91Y2hfYml0IAk9ICZkczk0OTByX3RvdWNoX2JpdDsKLQlkc19idXNfbWFzdGVyLT5yZWFkX2JpdCAJPSAmZHM5NDkwcl9yZWFkX2JpdDsKLQlkc19idXNfbWFzdGVyLT53cml0ZV9iaXQgCT0gJmRzOTQ5MHJfd3JpdGVfYml0OwotCWRzX2J1c19tYXN0ZXItPnJlYWRfYnl0ZSAJPSAmZHM5NDkwcl9yZWFkX2J5dGU7Ci0JZHNfYnVzX21hc3Rlci0+d3JpdGVfYnl0ZSAJPSAmZHM5NDkwcl93cml0ZV9ieXRlOwotCWRzX2J1c19tYXN0ZXItPnJlYWRfYmxvY2sgCT0gJmRzOTQ5MHJfcmVhZF9ibG9jazsKLQlkc19idXNfbWFzdGVyLT53cml0ZV9ibG9jayAJPSAmZHM5NDkwcl93cml0ZV9ibG9jazsKKwlkc19idXNfbWFzdGVyLT5kYXRhCQk9ICh1bnNpZ25lZCBsb25nKWRzX2RldjsKKwlkc19idXNfbWFzdGVyLT50b3VjaF9iaXQJPSAmZHM5NDkwcl90b3VjaF9iaXQ7CisJZHNfYnVzX21hc3Rlci0+cmVhZF9iaXQJCT0gJmRzOTQ5MHJfcmVhZF9iaXQ7CisJZHNfYnVzX21hc3Rlci0+d3JpdGVfYml0CT0gJmRzOTQ5MHJfd3JpdGVfYml0OworCWRzX2J1c19tYXN0ZXItPnJlYWRfYnl0ZQk9ICZkczk0OTByX3JlYWRfYnl0ZTsKKwlkc19idXNfbWFzdGVyLT53cml0ZV9ieXRlCT0gJmRzOTQ5MHJfd3JpdGVfYnl0ZTsKKwlkc19idXNfbWFzdGVyLT5yZWFkX2Jsb2NrCT0gJmRzOTQ5MHJfcmVhZF9ibG9jazsKKwlkc19idXNfbWFzdGVyLT53cml0ZV9ibG9jawk9ICZkczk0OTByX3dyaXRlX2Jsb2NrOwogCWRzX2J1c19tYXN0ZXItPnJlc2V0X2J1cwk9ICZkczk0OTByX3Jlc2V0OwogCiAJZXJyID0gdzFfYWRkX21hc3Rlcl9kZXZpY2UoZHNfYnVzX21hc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL2RzY29yZS5jIGIvZHJpdmVycy93MS9kc2NvcmUuYwppbmRleCBlZWU2NjQ0Li4xNWZiMjUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL2RzY29yZS5jCisrKyBiL2RyaXZlcnMvdzEvZHNjb3JlLmMKQEAgLTEsOCArMSw4IEBACiAvKgotICogCWRzY29yZS5jCisgKglkc2NvcmUuYwogICoKICAqIENvcHlyaWdodCAoYykgMjAwNCBFdmdlbml5IFBvbHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1PgotICogCisgKgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzIsMTkgKzMyLDE2IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRzX2lkX3RhYmxlKTsKIAotaW50IGRzX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICosIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICopOwotdm9pZCBkc19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOworc3RhdGljIGludCBkc19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqKTsKK3N0YXRpYyB2b2lkIGRzX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKik7CiAKIGludCBkc190b3VjaF9iaXQoc3RydWN0IGRzX2RldmljZSAqLCB1OCwgdTggKik7CiBpbnQgZHNfcmVhZF9ieXRlKHN0cnVjdCBkc19kZXZpY2UgKiwgdTggKik7CiBpbnQgZHNfcmVhZF9iaXQoc3RydWN0IGRzX2RldmljZSAqLCB1OCAqKTsKIGludCBkc193cml0ZV9ieXRlKHN0cnVjdCBkc19kZXZpY2UgKiwgdTgpOwogaW50IGRzX3dyaXRlX2JpdChzdHJ1Y3QgZHNfZGV2aWNlICosIHU4KTsKLWludCBkc19zdGFydF9wdWxzZShzdHJ1Y3QgZHNfZGV2aWNlICosIGludCk7Ci1pbnQgZHNfc2V0X3NwZWVkKHN0cnVjdCBkc19kZXZpY2UgKiwgaW50KTsKK3N0YXRpYyBpbnQgZHNfc3RhcnRfcHVsc2Uoc3RydWN0IGRzX2RldmljZSAqLCBpbnQpOwogaW50IGRzX3Jlc2V0KHN0cnVjdCBkc19kZXZpY2UgKiwgc3RydWN0IGRzX3N0YXR1cyAqKTsKLWludCBkc19kZXRlY3Qoc3RydWN0IGRzX2RldmljZSAqLCBzdHJ1Y3QgZHNfc3RhdHVzICopOwotaW50IGRzX3N0b3BfcHVsc2Uoc3RydWN0IGRzX2RldmljZSAqLCBpbnQpOwogc3RydWN0IGRzX2RldmljZSAqIGRzX2dldF9kZXZpY2Uodm9pZCk7CiB2b2lkIGRzX3B1dF9kZXZpY2Uoc3RydWN0IGRzX2RldmljZSAqKTsKIApAQCAtNzksMTEgKzc2LDExIEBACiBzdGF0aWMgaW50IGRzX3NlbmRfY29udHJvbF9jbWQoc3RydWN0IGRzX2RldmljZSAqZGV2LCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKIHsKIAlpbnQgZXJyOwotCQotCWVyciA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfQ09OVFJPTF0pLCAKKworCWVyciA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfQ09OVFJPTF0pLAogCQkJQ09OVFJPTF9DTUQsIDB4NDAsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgMTAwMCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2VuZCBjb21tYW5kIGNvbnRyb2wgbWVzc2FnZSAleC4leDogZXJyPSVkLlxuIiwgCisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNlbmQgY29tbWFuZCBjb250cm9sIG1lc3NhZ2UgJXguJXg6IGVycj0lZC5cbiIsCiAJCQkJdmFsdWUsIGluZGV4LCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTk0LDExICs5MSwxMSBAQAogc3RhdGljIGludCBkc19zZW5kX2NvbnRyb2xfbW9kZShzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQogewogCWludCBlcnI7Ci0JCi0JZXJyID0gdXNiX2NvbnRyb2xfbXNnKGRldi0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgZGV2LT5lcFtFUF9DT05UUk9MXSksIAorCisJZXJyID0gdXNiX2NvbnRyb2xfbXNnKGRldi0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgZGV2LT5lcFtFUF9DT05UUk9MXSksCiAJCQlNT0RFX0NNRCwgMHg0MCwgdmFsdWUsIGluZGV4LCBOVUxMLCAwLCAxMDAwKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBzZW5kIG1vZGUgY29udHJvbCBtZXNzYWdlICV4LiV4OiBlcnI9JWQuXG4iLCAKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2VuZCBtb2RlIGNvbnRyb2wgbWVzc2FnZSAleC4leDogZXJyPSVkLlxuIiwKIAkJCQl2YWx1ZSwgaW5kZXgsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMTA5LDExICsxMDYsMTEgQEAKIHN0YXRpYyBpbnQgZHNfc2VuZF9jb250cm9sKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCiB7CiAJaW50IGVycjsKLQkKLQllcnIgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCBkZXYtPmVwW0VQX0NPTlRST0xdKSwgCisKKwllcnIgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCBkZXYtPmVwW0VQX0NPTlRST0xdKSwKIAkJCUNPTU1fQ01ELCAweDQwLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNlbmQgY29udHJvbCBtZXNzYWdlICV4LiV4OiBlcnI9JWQuXG4iLCAKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2VuZCBjb250cm9sIG1lc3NhZ2UgJXguJXg6IGVycj0lZC5cbiIsCiAJCQkJdmFsdWUsIGluZGV4LCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTEyNiwxOSArMTIzLDIwIEBACiAJcHJpbnRrKCIlNDVzOiAlOHhcbiIsIHN0ciwgYnVmW29mZl0pOwogfQogCi1pbnQgZHNfcmVjdl9zdGF0dXNfbm9kdW1wKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgc3RydWN0IGRzX3N0YXR1cyAqc3QsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCitzdGF0aWMgaW50IGRzX3JlY3Zfc3RhdHVzX25vZHVtcChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHN0cnVjdCBkc19zdGF0dXMgKnN0LAorCQkJCSB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKQogewogCWludCBjb3VudCwgZXJyOwotCQkKKwogCW1lbXNldChzdCwgMCwgc2l6ZW9mKHN0KSk7Ci0JCisKIAljb3VudCA9IDA7CiAJZXJyID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwgdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwgZGV2LT5lcFtFUF9TVEFUVVNdKSwgYnVmLCBzaXplLCAmY291bnQsIDEwMCk7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVhZCAxLXdpcmUgZGF0YSBmcm9tIDB4JXg6IGVycj0lZC5cbiIsIGRldi0+ZXBbRVBfU1RBVFVTXSwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0JCisKIAlpZiAoY291bnQgPj0gc2l6ZW9mKCpzdCkpCiAJCW1lbWNweShzdCwgYnVmLCBzaXplb2YoKnN0KSk7CiAKQEAgLTE0OSwxMyArMTQ3LDEzIEBACiB7CiAJdW5zaWduZWQgY2hhciBidWZbNjRdOwogCWludCBjb3VudCwgZXJyID0gMCwgaTsKLQkKKwogCW1lbWNweShzdCwgYnVmLCBzaXplb2YoKnN0KSk7Ci0JCQorCiAJY291bnQgPSBkc19yZWN2X3N0YXR1c19ub2R1bXAoZGV2LCBzdCwgYnVmLCBzaXplb2YoYnVmKSk7CiAJaWYgKGNvdW50IDwgMCkKIAkJcmV0dXJuIGVycjsKLQkKKwogCXByaW50aygiMHgleDogY291bnQ9JWQsIHN0YXR1czogIiwgZGV2LT5lcFtFUF9TVEFUVVNdLCBjb3VudCk7CiAJZm9yIChpPTA7IGk8Y291bnQ7ICsraSkKIAkJcHJpbnRrKCIlMDJ4ICIsIGJ1ZltpXSk7CkBAIC0xOTksNyArMTk3LDcgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogI2VuZGlmCi0JCisKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMDcsOSArMjA1LDkgQEAKIHsKIAlpbnQgY291bnQsIGVycjsKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwotCQorCiAJY291bnQgPSAwOwotCWVyciA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfREFUQV9JTl0pLCAKKwllcnIgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LCB1c2JfcmN2YnVsa3BpcGUoZGV2LT51ZGV2LCBkZXYtPmVwW0VQX0RBVEFfSU5dKSwKIAkJCQlidWYsIHNpemUsICZjb3VudCwgMTAwMCk7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiQ2xlYXJpbmcgZXAweCV4LlxuIiwgZGV2LT5lcFtFUF9EQVRBX0lOXSk7CkBAIC0yMzQsNyArMjMyLDcgQEAKIHN0YXRpYyBpbnQgZHNfc2VuZF9kYXRhKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQogewogCWludCBjb3VudCwgZXJyOwotCQorCiAJY291bnQgPSAwOwogCWVyciA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsIHVzYl9zbmRidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfREFUQV9PVVRdKSwgYnVmLCBsZW4sICZjb3VudCwgMTAwMCk7CiAJaWYgKGVyciA8IDApIHsKQEAgLTI0NSwxMiArMjQzLDE0IEBACiAJcmV0dXJuIGVycjsKIH0KIAorI2lmIDAKKwogaW50IGRzX3N0b3BfcHVsc2Uoc3RydWN0IGRzX2RldmljZSAqZGV2LCBpbnQgbGltaXQpCiB7CiAJc3RydWN0IGRzX3N0YXR1cyBzdDsKIAlpbnQgY291bnQgPSAwLCBlcnIgPSAwOwogCXU4IGJ1ZlsweDIwXTsKLQkKKwogCWRvIHsKIAkJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ1RMX0hBTFRfRVhFX0lETEUsIDApOwogCQlpZiAoZXJyKQpAQCAtMjc1LDcgKzI3NSw3IEBACiBpbnQgZHNfZGV0ZWN0KHN0cnVjdCBkc19kZXZpY2UgKmRldiwgc3RydWN0IGRzX3N0YXR1cyAqc3QpCiB7CiAJaW50IGVycjsKLQkKKwogCWVyciA9IGRzX3NlbmRfY29udHJvbF9jbWQoZGV2LCBDVExfUkVTRVRfREVWSUNFLCAwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtMjgzLDExICsyODMsMTEgQEAKIAllcnIgPSBkc19zZW5kX2NvbnRyb2woZGV2LCBDT01NX1NFVF9EVVJBVElPTiB8IENPTU1fSU0sIDApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JCisKIAllcnIgPSBkc19zZW5kX2NvbnRyb2woZGV2LCBDT01NX1NFVF9EVVJBVElPTiB8IENPTU1fSU0gfCBDT01NX1RZUEUsIDB4NDApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JCisKIAllcnIgPSBkc19zZW5kX2NvbnRyb2xfbW9kZShkZXYsIE1PRF9QVUxTRV9FTiwgUFVMU0VfUFJPRyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTI5Nyw3ICsyOTcsOSBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBkc193YWl0X3N0YXR1cyhzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHN0cnVjdCBkc19zdGF0dXMgKnN0KQorI2VuZGlmICAvKiAgMCAgKi8KKworc3RhdGljIGludCBkc193YWl0X3N0YXR1cyhzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHN0cnVjdCBkc19zdGF0dXMgKnN0KQogewogCXU4IGJ1ZlsweDIwXTsKIAlpbnQgZXJyLCBjb3VudCA9IDA7CkBAIC0zMDUsNyArMzA3LDcgQEAKIAlkbyB7CiAJCWVyciA9IGRzX3JlY3Zfc3RhdHVzX25vZHVtcChkZXYsIHN0LCBidWYsIHNpemVvZihidWYpKTsKICNpZiAwCi0JCWlmIChlcnIgPj0gMCkgewkKKwkJaWYgKGVyciA+PSAwKSB7CiAJCQlpbnQgaTsKIAkJCXByaW50aygiMHgleDogY291bnQ9JWQsIHN0YXR1czogIiwgZGV2LT5lcFtFUF9TVEFUVVNdLCBlcnIpOwogCQkJZm9yIChpPTA7IGk8ZXJyOyArK2kpCkBAIC0zMTksMTAgKzMyMSw4IEBACiAJaWYgKCgoZXJyID4gMTYpICYmIChidWZbMHgxMF0gJiAweDAxKSkgfHwgY291bnQgPj0gMTAwIHx8IGVyciA8IDApIHsKIAkJZHNfcmVjdl9zdGF0dXMoZGV2LCBzdCk7CiAJCXJldHVybiAtMTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlCiAJCXJldHVybiAwOwotCX0KIH0KIAogaW50IGRzX3Jlc2V0KHN0cnVjdCBkc19kZXZpY2UgKmRldiwgc3RydWN0IGRzX3N0YXR1cyAqc3QpCkBAIC0zNDUsNiArMzQ1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIDAKIGludCBkc19zZXRfc3BlZWQoc3RydWN0IGRzX2RldmljZSAqZGV2LCBpbnQgc3BlZWQpCiB7CiAJaW50IGVycjsKQEAgLTM1NiwyMCArMzU3LDIxIEBACiAJCXNwZWVkID0gU1BFRURfRkxFWElCTEU7CiAKIAlzcGVlZCAmPSAweGZmOwotCQorCiAJZXJyID0gZHNfc2VuZF9jb250cm9sX21vZGUoZGV2LCBNT0RfMVdJUkVfU1BFRUQsIHNwZWVkKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJcmV0dXJuIGVycjsKIH0KKyNlbmRpZiAgLyogIDAgICovCiAKLWludCBkc19zdGFydF9wdWxzZShzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIGludCBkZWxheSkKK3N0YXRpYyBpbnQgZHNfc3RhcnRfcHVsc2Uoc3RydWN0IGRzX2RldmljZSAqZGV2LCBpbnQgZGVsYXkpCiB7CiAJaW50IGVycjsKIAl1OCBkZWwgPSAxICsgKHU4KShkZWxheSA+PiA0KTsKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwotCQorCiAjaWYgMAogCWVyciA9IGRzX3N0b3BfcHVsc2UoZGV2LCAxMCk7CiAJaWYgKGVycikKQEAgLTM5MCw3ICszOTIsNyBAQAogCW1kZWxheShkZWxheSk7CiAKIAlkc193YWl0X3N0YXR1cyhkZXYsICZzdCk7Ci0JCisKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00MDAsNyArNDAyLDcgQEAKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwogCXUxNiB2YWx1ZSA9IChDT01NX0JJVF9JTyB8IENPTU1fSU0pIHwgKChiaXQpID8gQ09NTV9EIDogMCk7CiAJdTE2IGNtZDsKLQkKKwogCWVyciA9IGRzX3NlbmRfY29udHJvbChkZXYsIHZhbHVlLCAwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtNDMwLDcgKzQzMiw3IEBACiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwotCQorCiAJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV9CSVRfSU8gfCBDT01NX0lNIHwgKGJpdCkgPyBDT01NX0QgOiAwLCAwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtNDQ1LDcgKzQ0Nyw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwogCXU4IHJieXRlOwotCQorCiAJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV9CWVRFX0lPIHwgQ09NTV9JTSB8IENPTU1fU1BVLCBieXRlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtNDUzLDExICs0NTUsMTEgQEAKIAllcnIgPSBkc193YWl0X3N0YXR1cyhkZXYsICZzdCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQkJCisKIAllcnIgPSBkc19yZWN2X2RhdGEoZGV2LCAmcmJ5dGUsIHNpemVvZihyYnl0ZSkpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCQorCiAJZHNfc3RhcnRfcHVsc2UoZGV2LCBQVUxMVVBfUFVMU0VfRFVSQVRJT04pOwogCiAJcmV0dXJuICEoYnl0ZSA9PSByYnl0ZSk7CkBAIC00NzAsMTEgKzQ3MiwxMSBAQAogCWVyciA9IGRzX3NlbmRfY29udHJvbF9tb2RlKGRldiwgTU9EX1BVTFNFX0VOLCBQVUxTRV9TUFVFKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCQorCiAJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV9CSVRfSU8gfCBDT01NX0lNIHwgQ09NTV9TUFUgfCBDT01NX0QsIDApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JCisKIAllcnIgPSBkc19yZWN2X2RhdGEoZGV2LCBiaXQsIHNpemVvZigqYml0KSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC00OTIsNyArNDk0LDcgQEAKIAkJcmV0dXJuIGVycjsKIAogCWRzX3dhaXRfc3RhdHVzKGRldiwgJnN0KTsKLQkKKwogCWVyciA9IGRzX3JlY3ZfZGF0YShkZXYsIGJ5dGUsIHNpemVvZigqYnl0ZSkpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtNTA5LDE3ICs1MTEsMTcgQEAKIAkJcmV0dXJuIC1FMkJJRzsKIAogCW1lbXNldChidWYsIDB4RkYsIGxlbik7Ci0JCisKIAllcnIgPSBkc19zZW5kX2RhdGEoZGV2LCBidWYsIGxlbik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JCisKIAllcnIgPSBkc19zZW5kX2NvbnRyb2woZGV2LCBDT01NX0JMT0NLX0lPIHwgQ09NTV9JTSB8IENPTU1fU1BVLCBsZW4pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAlkc193YWl0X3N0YXR1cyhkZXYsICZzdCk7Ci0JCisKIAltZW1zZXQoYnVmLCAweDAwLCBsZW4pOwogCWVyciA9IGRzX3JlY3ZfZGF0YShkZXYsIGJ1ZiwgbGVuKTsKIApAQCAtNTMwLDExICs1MzIsMTEgQEAKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBkc19zdGF0dXMgc3Q7Ci0JCisKIAllcnIgPSBkc19zZW5kX2RhdGEoZGV2LCBidWYsIGxlbik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JCisKIAlkc193YWl0X3N0YXR1cyhkZXYsICZzdCk7CiAKIAllcnIgPSBkc19zZW5kX2NvbnRyb2woZGV2LCBDT01NX0JMT0NLX0lPIHwgQ09NTV9JTSB8IENPTU1fU1BVLCBsZW4pOwpAQCAtNTQ4LDEwICs1NTAsMTIgQEAKIAkJcmV0dXJuIGVycjsKIAogCWRzX3N0YXJ0X3B1bHNlKGRldiwgUFVMTFVQX1BVTFNFX0RVUkFUSU9OKTsKLQkKKwogCXJldHVybiAhKGVyciA9PSBsZW4pOwogfQogCisjaWYgMAorCiBpbnQgZHNfc2VhcmNoKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTY0IGluaXQsIHU2NCAqYnVmLCB1OCBpZF9udW1iZXIsIGludCBjb25kaXRpb25hbF9zZWFyY2gpCiB7CiAJaW50IGVycjsKQEAgLTU1OSwxMSArNTYzLDExIEBACiAJc3RydWN0IGRzX3N0YXR1cyBzdDsKIAogCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQkKKwogCWVyciA9IGRzX3NlbmRfZGF0YShkc19kZXYsICh1bnNpZ25lZCBjaGFyICopJmluaXQsIDgpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JCisKIAlkc193YWl0X3N0YXR1cyhkc19kZXYsICZzdCk7CiAKIAl2YWx1ZSA9IENPTU1fU0VBUkNIX0FDQ0VTUyB8IENPTU1fSU0gfCBDT01NX1NNIHwgQ09NTV9GIHwgQ09NTV9SVFM7CkBAIC01ODksNyArNTkzLDcgQEAKIAllcnIgPSBkc19zZW5kX2RhdGEoZGV2LCAodW5zaWduZWQgY2hhciAqKSZpbml0LCBzaXplb2YoaW5pdCkpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JCisKIAlkc193YWl0X3N0YXR1cyhkZXYsICZzdCk7CiAKIAllcnIgPSBkc19zZW5kX2NvbnRyb2woZGV2LCBDT01NX01BVENIX0FDQ0VTUyB8IENPTU1fSU0gfCBDT01NX1JTVCwgMHgwMDU1KTsKQEAgLTYwOSwxMSArNjEzLDExIEBACiAKIAltZW1jcHkoYnVmLCAmaW5pdCwgOCk7CiAJYnVmWzhdID0gQlJBTkNIX01BSU47Ci0JCisKIAllcnIgPSBkc19zZW5kX2RhdGEoZGV2LCBidWYsIHNpemVvZihidWYpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCQorCiAJZHNfd2FpdF9zdGF0dXMoZGV2LCAmc3QpOwogCiAJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV9TRVRfUEFUSCB8IENPTU1fSU0gfCBDT01NX1JTVCwgMCk7CkBAIC02MjUsNyArNjI5LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkc19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKnVkZXZfaWQpCisjZW5kaWYgIC8qICAwICAqLworCitzdGF0aWMgaW50IGRzX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKnVkZXZfaWQpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CkBAIC02NTMsNyArNjYwLDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVzZXQgY29uZmlndXJhdGlvbjogZXJyPSVkLlxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0JCisKIAlpZmFjZV9kZXNjID0gJmludGYtPmFsdHNldHRpbmdbMF07CiAJaWYgKGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cyAhPSBOVU1fRVAtMSkgewogCQlwcmludGsoS0VSTl9JTkZPICJOdW0gZW5kcG9pbnRzPSVkLiBJdCBpcyBub3QgRFM5NDkwUi5cbiIsIGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cyk7CkBAIC02NjIsMzcgKzY2OSwzNyBAQAogCiAJYXRvbWljX3NldCgmZHNfZGV2LT5yZWZjbnQsIDApOwogCW1lbXNldChkc19kZXYtPmVwLCAwLCBzaXplb2YoZHNfZGV2LT5lcCkpOwotCQorCiAJLyoKLQkgKiBUaGlzIGxvb3AgZG9lc24nZCBzaG93IGNvbnRyb2wgMCBlbmRwb2ludCwgCisJICogVGhpcyBsb29wIGRvZXNuJ2Qgc2hvdyBjb250cm9sIDAgZW5kcG9pbnQsCiAJICogc28gd2Ugd2lsbCBmaWxsIG9ubHkgMS0zIGVuZHBvaW50cyBlbnRyeS4KIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKIAkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKIAogCQlkc19kZXYtPmVwW2krMV0gPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLQkJCisKIAkJcHJpbnRrKCIlZDogYWRkcj0leCwgc2l6ZT0lZCwgZGlyPSVzLCB0eXBlPSV4XG4iLAogCQkJaSwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MsIGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSksCiAJCQkoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKT8iSU4iOiJPVVQiLAogCQkJZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKTsKIAl9Ci0JCisKICNpZiAwCiAJewogCQlpbnQgZXJyLCBpOwogCQl1NjQgYnVmWzNdOwogCQl1NjQgaW5pdD0weGIzMDAwMDAwMjA3OGVlODF1bGw7CiAJCXN0cnVjdCBkc19zdGF0dXMgc3Q7Ci0JCQorCiAJCWRzX3Jlc2V0KGRzX2RldiwgJnN0KTsKIAkJZXJyID0gZHNfc2VhcmNoKGRzX2RldiwgaW5pdCwgYnVmLCAzLCAwKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQlmb3IgKGk9MDsgaTxlcnI7ICsraSkKIAkJCXByaW50aygiJWQ6ICVsbHhcbiIsIGksIGJ1ZltpXSk7Ci0JCQotCQlwcmludGsoIlJlc2V0dGluZy4uLlxuIik7CQorCisJCXByaW50aygiUmVzZXR0aW5nLi4uXG4iKTsKIAkJZHNfcmVzZXQoZHNfZGV2LCAmc3QpOwogCQlwcmludGsoIlNldHRpbmcgcGF0aCBmb3IgJWxseC5cbiIsIGluaXQpOwogCQllcnIgPSBkc19zZXRfcGF0aChkc19kZXYsIGluaXQpOwpAQCAtNzA3LDEyICs3MTQsMTIgQEAKIAkJZXJyID0gZHNfc2VhcmNoKGRzX2RldiwgaW5pdCwgYnVmLCAzLCAwKTsKIAogCQlwcmludGsoImRzX3NlYXJjaCgpIHJldHVybmVkICVkXG4iLCBlcnIpOwotCQkKKwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCWZvciAoaT0wOyBpPGVycjsgKytpKQogCQkJcHJpbnRrKCIlZDogJWxseFxuIiwgaSwgYnVmW2ldKTsKLQkJCisKIAkJcmV0dXJuIDA7CiAJfQogI2VuZGlmCkBAIC03MjAsMTAgKzcyNywxMCBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGRzX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgdm9pZCBkc19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCBkc19kZXZpY2UgKmRldjsKLQkKKwogCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIApAQCAtNzQwLDcgKzc0Nyw3IEBACiAJZHNfZGV2ID0gTlVMTDsKIH0KIAotaW50IGRzX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgZHNfaW5pdCh2b2lkKQogewogCWludCBlcnI7CiAKQEAgLTc1Myw3ICs3NjAsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGRzX2Zpbmkodm9pZCkKK3N0YXRpYyB2b2lkIGRzX2Zpbmkodm9pZCkKIHsKIAl1c2JfZGVyZWdpc3RlcigmZHNfZHJpdmVyKTsKIH0KQEAgLTc3Niw4ICs3ODMsOCBAQAogRVhQT1JUX1NZTUJPTChkc19wdXRfZGV2aWNlKTsKIAogLyoKLSAqIFRoaXMgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGZvciBFRVBST00gcHJvZ3JhbW1pbmcsIAotICogd2hlbiBkcml2ZXIgd2lsbCBiZSBpbmNsdWRlZCBpbnRvIG1haW5saW5lIHRoaXMgd2lsbCAKKyAqIFRoaXMgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGZvciBFRVBST00gcHJvZ3JhbW1pbmcsCisgKiB3aGVuIGRyaXZlciB3aWxsIGJlIGluY2x1ZGVkIGludG8gbWFpbmxpbmUgdGhpcyB3aWxsCiAgKiByZXF1aXJlIHVuY29tbWVudGluZy4KICAqLwogI2lmIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvZHNjb3JlLmggYi9kcml2ZXJzL3cxL2RzY29yZS5oCmluZGV4IDljNzY3ZWYuLjZjZjU2NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvZHNjb3JlLmgKKysrIGIvZHJpdmVycy93MS9kc2NvcmUuaApAQCAtMSw4ICsxLDggQEAKIC8qCi0gKiAJZHNjb3JlLmgKKyAqCWRzY29yZS5oCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkgUG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+Ci0gKiAKKyAqCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xMjIsNyArMTIyLDcgQEAKIAogc3RydWN0IGRzX2RldmljZQogewotCXN0cnVjdCB1c2JfZGV2aWNlIAkqdWRldjsKKwlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkqaW50ZjsKIAogCWludAkJCWVwW05VTV9FUF07CkBAIC0xNTYsMTEgKzE1Niw3IEBACiBpbnQgZHNfcmVhZF9iaXQoc3RydWN0IGRzX2RldmljZSAqLCB1OCAqKTsKIGludCBkc193cml0ZV9ieXRlKHN0cnVjdCBkc19kZXZpY2UgKiwgdTgpOwogaW50IGRzX3dyaXRlX2JpdChzdHJ1Y3QgZHNfZGV2aWNlICosIHU4KTsKLWludCBkc19zdGFydF9wdWxzZShzdHJ1Y3QgZHNfZGV2aWNlICosIGludCk7Ci1pbnQgZHNfc2V0X3NwZWVkKHN0cnVjdCBkc19kZXZpY2UgKiwgaW50KTsKIGludCBkc19yZXNldChzdHJ1Y3QgZHNfZGV2aWNlICosIHN0cnVjdCBkc19zdGF0dXMgKik7Ci1pbnQgZHNfZGV0ZWN0KHN0cnVjdCBkc19kZXZpY2UgKiwgc3RydWN0IGRzX3N0YXR1cyAqKTsKLWludCBkc19zdG9wX3B1bHNlKHN0cnVjdCBkc19kZXZpY2UgKiwgaW50KTsKIHN0cnVjdCBkc19kZXZpY2UgKiBkc19nZXRfZGV2aWNlKHZvaWQpOwogdm9pZCBkc19wdXRfZGV2aWNlKHN0cnVjdCBkc19kZXZpY2UgKik7CiBpbnQgZHNfd3JpdGVfYmxvY2soc3RydWN0IGRzX2RldmljZSAqLCB1OCAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MS5jIGIvZHJpdmVycy93MS93MS5jCmluZGV4IDBiYmYwMjkuLjFiNmI3NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzEuYworKysgYi9kcml2ZXJzL3cxL3cxLmMKQEAgLTQ1LDEwICs0NSwxMiBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIDEtd2lyZSBEYWxsYXMgbmV0d29yayBwcm90b2NvbC4iKTsKIAogc3RhdGljIGludCB3MV90aW1lb3V0ID0gMTA7CitzdGF0aWMgaW50IHcxX2NvbnRyb2xfdGltZW91dCA9IDE7CiBpbnQgdzFfbWF4X3NsYXZlX2NvdW50ID0gMTA7CiBpbnQgdzFfbWF4X3NsYXZlX3R0bCA9IDEwOwogCiBtb2R1bGVfcGFyYW1fbmFtZWQodGltZW91dCwgdzFfdGltZW91dCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChjb250cm9sX3RpbWVvdXQsIHcxX2NvbnRyb2xfdGltZW91dCwgaW50LCAwKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChtYXhfc2xhdmVfY291bnQsIHcxX21heF9zbGF2ZV9jb3VudCwgaW50LCAwKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChzbGF2ZV90dGwsIHcxX21heF9zbGF2ZV90dGwsIGludCwgMCk7CiAKQEAgLTU5LDE5ICs2MSw2IEBACiBzdGF0aWMgaW50IGNvbnRyb2xfbmVlZHNfZXhpdDsKIHN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04odzFfY29udHJvbF9jb21wbGV0ZSk7CiAKLS8qIHN0dWZmIGZvciB0aGUgZGVmYXVsdCBmYW1pbHkgKi8KLXN0YXRpYyBzc2l6ZV90IHcxX2ZhbWRlZmF1bHRfcmVhZF9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX3NsYXZlLCBkZXYpOwotCXJldHVybihzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzbC0+bmFtZSkpOwotfQotc3RhdGljIHN0cnVjdCB3MV9mYW1pbHlfb3BzIHcxX2RlZmF1bHRfZm9wcyA9IHsKLQkucm5hbWUgPSAmdzFfZmFtZGVmYXVsdF9yZWFkX25hbWUsCi19Owotc3RhdGljIHN0cnVjdCB3MV9mYW1pbHkgdzFfZGVmYXVsdF9mYW1pbHkgPSB7Ci0JLmZvcHMgPSAmdzFfZGVmYXVsdF9mb3BzLAotfTsKLQogc3RhdGljIGludCB3MV9tYXN0ZXJfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewogCXJldHVybiAxOwpAQCAtODIsNzMgKzcxLDExNiBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgaW50IHcxX21hc3Rlcl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCB3MV9tYXN0ZXJfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHcxX21hc3RlciAqbWQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdzFfbWFzdGVyLCBkZXYpOworCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCi0JY29tcGxldGUoJm1kLT5kZXZfcmVsZWFzZWQpOworCWRldl9kYmcoZGV2LCAiJXM6IFJlbGVhc2luZyAlcy5cbiIsIF9fZnVuY19fLCBtZC0+bmFtZSk7CisKKwlpZiAobWQtPm5scyAmJiBtZC0+bmxzLT5za19zb2NrZXQpCisJCXNvY2tfcmVsZWFzZShtZC0+bmxzLT5za19zb2NrZXQpOworCW1lbXNldChtZCwgMCwgc2l6ZW9mKHN0cnVjdCB3MV9tYXN0ZXIpICsgc2l6ZW9mKHN0cnVjdCB3MV9idXNfbWFzdGVyKSk7CisJa2ZyZWUobWQpOwogfQogCiBzdGF0aWMgdm9pZCB3MV9zbGF2ZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX3NsYXZlLCBkZXYpOworCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBkZXZfdG9fdzFfc2xhdmUoZGV2KTsKIAotCWNvbXBsZXRlKCZzbC0+ZGV2X3JlbGVhc2VkKTsKKwlkZXZfZGJnKGRldiwgIiVzOiBSZWxlYXNpbmcgJXMuXG4iLCBfX2Z1bmNfXywgc2wtPm5hbWUpOworCisJd2hpbGUgKGF0b21pY19yZWFkKCZzbC0+cmVmY250KSkgeworCQlkZXZfZGJnKGRldiwgIldhaXRpbmcgZm9yICVzIHRvIGJlY29tZSBmcmVlOiByZWZjbnQ9JWQuXG4iLAorCQkJCXNsLT5uYW1lLCBhdG9taWNfcmVhZCgmc2wtPnJlZmNudCkpOworCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCkpCisJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCX0KKworCXcxX2ZhbWlseV9wdXQoc2wtPmZhbWlseSk7CisJc2wtPm1hc3Rlci0+c2xhdmVfY291bnQtLTsKKworCWNvbXBsZXRlKCZzbC0+cmVsZWFzZWQpOwogfQogCi1zdGF0aWMgc3NpemVfdCB3MV9kZWZhdWx0X3JlYWRfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB3MV9zbGF2ZV9yZWFkX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIk5vIGZhbWlseSByZWdpc3RlcmVkLlxuIik7CisJc3RydWN0IHcxX3NsYXZlICpzbCA9IGRldl90b193MV9zbGF2ZShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHNsLT5uYW1lKTsKIH0KIAotc3RhdGljIHNzaXplX3QgdzFfZGVmYXVsdF9yZWFkX2JpbihzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLAotCQkgICAgIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHcxX3NsYXZlX3JlYWRfaWQoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIk5vIGZhbWlseSByZWdpc3RlcmVkLlxuIik7CisJc3RydWN0IHcxX3NsYXZlICpzbCA9IGtvYmpfdG9fdzFfc2xhdmUoa29iaik7CisKKwlhdG9taWNfaW5jKCZzbC0+cmVmY250KTsKKwlpZiAob2ZmID4gOCkgeworCQljb3VudCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKG9mZiArIGNvdW50ID4gOCkKKwkJCWNvdW50ID0gOCAtIG9mZjsKKworCQltZW1jcHkoYnVmLCAodTggKikmc2wtPnJlZ19udW0sIGNvdW50KTsKKwl9CisJYXRvbWljX2RlYygmc2wtPnJlZmNudCk7CisKKwlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB3MV9zbGF2ZV9hdHRyaWJ1dGUgPQotCV9fQVRUUihuYW1lLCBTX0lSVUdPLCB3MV9kZWZhdWx0X3JlYWRfbmFtZSwgTlVMTCk7CitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgdzFfc2xhdmVfYXR0cl9uYW1lID0KKwlfX0FUVFIobmFtZSwgU19JUlVHTywgdzFfc2xhdmVfcmVhZF9uYW1lLCBOVUxMKTsKIAotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHcxX3NsYXZlX2Jpbl9hdHRyaWJ1dGUgPSB7Ci0JLmF0dHIgPSB7Ci0JCS5uYW1lID0gIncxX3NsYXZlIiwKLQkJLm1vZGUgPSBTX0lSVUdPLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5zaXplID0gVzFfU0xBVkVfREFUQV9TSVpFLAotCS5yZWFkID0gJncxX2RlZmF1bHRfcmVhZF9iaW4sCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgdzFfc2xhdmVfYXR0cl9iaW5faWQgPSB7CisgICAgICAuYXR0ciA9IHsKKyAgICAgICAgICAgICAgLm5hbWUgPSAiaWQiLAorICAgICAgICAgICAgICAubW9kZSA9IFNfSVJVR08sCisgICAgICAgICAgICAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorICAgICAgfSwKKyAgICAgIC5zaXplID0gOCwKKyAgICAgIC5yZWFkID0gdzFfc2xhdmVfcmVhZF9pZCwKIH07CiAKKy8qIERlZmF1bHQgZmFtaWx5ICovCitzdGF0aWMgc3RydWN0IHcxX2ZhbWlseSB3MV9kZWZhdWx0X2ZhbWlseTsKKworc3RhdGljIGludCB3MV9ob3RwbHVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpOwogCiBzdGF0aWMgc3RydWN0IGJ1c190eXBlIHcxX2J1c190eXBlID0gewogCS5uYW1lID0gIncxIiwKIAkubWF0Y2ggPSB3MV9tYXN0ZXJfbWF0Y2gsCisJLmhvdHBsdWcgPSB3MV9ob3RwbHVnLAogfTsKIAotc3RydWN0IGRldmljZV9kcml2ZXIgdzFfZHJpdmVyID0gewotCS5uYW1lID0gIncxX2RyaXZlciIsCitzdHJ1Y3QgZGV2aWNlX2RyaXZlciB3MV9tYXN0ZXJfZHJpdmVyID0geworCS5uYW1lID0gIncxX21hc3Rlcl9kcml2ZXIiLAogCS5idXMgPSAmdzFfYnVzX3R5cGUsCiAJLnByb2JlID0gdzFfbWFzdGVyX3Byb2JlLAotCS5yZW1vdmUgPSB3MV9tYXN0ZXJfcmVtb3ZlLAogfTsKIAotc3RydWN0IGRldmljZSB3MV9kZXZpY2UgPSB7CitzdHJ1Y3QgZGV2aWNlIHcxX21hc3Rlcl9kZXZpY2UgPSB7CiAJLnBhcmVudCA9IE5VTEwsCiAJLmJ1cyA9ICZ3MV9idXNfdHlwZSwKIAkuYnVzX2lkID0gIncxIGJ1cyBtYXN0ZXIiLAotCS5kcml2ZXIgPSAmdzFfZHJpdmVyLAorCS5kcml2ZXIgPSAmdzFfbWFzdGVyX2RyaXZlciwKIAkucmVsZWFzZSA9ICZ3MV9tYXN0ZXJfcmVsZWFzZQogfTsKIAorc3RydWN0IGRldmljZV9kcml2ZXIgdzFfc2xhdmVfZHJpdmVyID0geworCS5uYW1lID0gIncxX3NsYXZlX2RyaXZlciIsCisJLmJ1cyA9ICZ3MV9idXNfdHlwZSwKK307CisKK3N0cnVjdCBkZXZpY2UgdzFfc2xhdmVfZGV2aWNlID0geworCS5wYXJlbnQgPSBOVUxMLAorCS5idXMgPSAmdzFfYnVzX3R5cGUsCisJLmJ1c19pZCA9ICJ3MSBidXMgc2xhdmUiLAorCS5kcml2ZXIgPSAmdzFfc2xhdmVfZHJpdmVyLAorCS5yZWxlYXNlID0gJncxX3NsYXZlX3JlbGVhc2UKK307CisKIHN0YXRpYyBzc2l6ZV90IHcxX21hc3Rlcl9hdHRyaWJ1dGVfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9tYXN0ZXIsIGRldik7CisJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CiAJc3NpemVfdCBjb3VudDsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZtZC0+bXV0ZXgpKQpAQCAtMTY1LDcgKzE5Nyw3IEBACiAJCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJCWNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9tYXN0ZXIsIGRldik7CisJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmbWQtPm11dGV4KSkKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTE4MSw3ICsyMTMsNyBAQAogCQkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCSAgICAgICBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHcxX21hc3RlciAqbWQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdzFfbWFzdGVyLCBkZXYpOworCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCXNzaXplX3QgY291bnQ7CiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmbWQtPm11dGV4KSkKQEAgLTE5Niw3ICsyMjgsNyBAQAogCiBzdGF0aWMgc3NpemVfdCB3MV9tYXN0ZXJfYXR0cmlidXRlX3Nob3dfcG9pbnRlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHcxX21hc3RlciAqbWQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdzFfbWFzdGVyLCBkZXYpOworCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCXNzaXplX3QgY291bnQ7CiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZtZC0+bXV0ZXgpKQpAQCAtMjE3LDcgKzI0OSw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IHcxX21hc3Rlcl9hdHRyaWJ1dGVfc2hvd19tYXhfc2xhdmVfY291bnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX21hc3RlciwgZGV2KTsKKwlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGRldl90b193MV9tYXN0ZXIoZGV2KTsKIAlzc2l6ZV90IGNvdW50OwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbWQtPm11dGV4KSkKQEAgLTIzMSw3ICsyNjMsNyBAQAogCiBzdGF0aWMgc3NpemVfdCB3MV9tYXN0ZXJfYXR0cmlidXRlX3Nob3dfYXR0ZW1wdHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX21hc3RlciwgZGV2KTsKKwlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGRldl90b193MV9tYXN0ZXIoZGV2KTsKIAlzc2l6ZV90IGNvdW50OwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbWQtPm11dGV4KSkKQEAgLTI0NSw3ICsyNzcsNyBAQAogCiBzdGF0aWMgc3NpemVfdCB3MV9tYXN0ZXJfYXR0cmlidXRlX3Nob3dfc2xhdmVfY291bnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX21hc3RlciwgZGV2KTsKKwlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGRldl90b193MV9tYXN0ZXIoZGV2KTsKIAlzc2l6ZV90IGNvdW50OwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbWQtPm11dGV4KSkKQEAgLTI1OSw3ICsyOTEsNyBAQAogCiBzdGF0aWMgc3NpemVfdCB3MV9tYXN0ZXJfYXR0cmlidXRlX3Nob3dfc2xhdmVzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9tYXN0ZXIsIGRldik7CisJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CiAJaW50IGMgPSBQQUdFX1NJWkU7CiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZtZC0+bXV0ZXgpKQpAQCAtMzI5LDEyICszNjEsNTUgQEAKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJm1hc3Rlci0+ZGV2LmtvYmosICZ3MV9tYXN0ZXJfZGVmYXR0cl9ncm91cCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVRworc3RhdGljIGludCB3MV9ob3RwbHVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IHcxX21hc3RlciAqbWQgPSBOVUxMOworCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBOVUxMOworCWNoYXIgKmV2ZW50X293bmVyLCAqbmFtZTsKKwlpbnQgZXJyLCBjdXJfaW5kZXg9MCwgY3VyX2xlbj0wOworCisJaWYgKGRldi0+ZHJpdmVyID09ICZ3MV9tYXN0ZXJfZHJpdmVyKSB7CisJCW1kID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX21hc3RlciwgZGV2KTsKKwkJZXZlbnRfb3duZXIgPSAibWFzdGVyIjsKKwkJbmFtZSA9IG1kLT5uYW1lOworCX0gZWxzZSBpZiAoZGV2LT5kcml2ZXIgPT0gJncxX3NsYXZlX2RyaXZlcikgeworCQlzbCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9zbGF2ZSwgZGV2KTsKKwkJZXZlbnRfb3duZXIgPSAic2xhdmUiOworCQluYW1lID0gc2wtPm5hbWU7CisJfSBlbHNlIHsKKwkJZGV2X2RiZyhkZXYsICJVbmtub3duIGhvdHBsdWcgZXZlbnQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyhkZXYsICJIb3RwbHVnIGV2ZW50IGZvciAlcyAlcywgYnVzX2lkPSVzLlxuIiwgZXZlbnRfb3duZXIsIG5hbWUsIGRldi0+YnVzX2lkKTsKKworCWlmIChkZXYtPmRyaXZlciAhPSAmdzFfc2xhdmVfZHJpdmVyIHx8ICFzbCkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSBhZGRfaG90cGx1Z19lbnZfdmFyKGVudnAsIG51bV9lbnZwLCAmY3VyX2luZGV4LCBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmY3VyX2xlbiwgIlcxX0ZJRD0lMDJYIiwgc2wtPnJlZ19udW0uZmFtaWx5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYWRkX2hvdHBsdWdfZW52X3ZhcihlbnZwLCBudW1fZW52cCwgJmN1cl9pbmRleCwgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmN1cl9sZW4sICJXMV9TTEFWRV9JRD0lMDI0TFgiLCAodTY0KXNsLT5yZWdfbnVtLmlkKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9OworI2Vsc2UKK3N0YXRpYyBpbnQgdzFfaG90cGx1ZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgX193MV9hdHRhY2hfc2xhdmVfZGV2aWNlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCiB7CiAJaW50IGVycjsKIAogCXNsLT5kZXYucGFyZW50ID0gJnNsLT5tYXN0ZXItPmRldjsKLQlzbC0+ZGV2LmRyaXZlciA9IHNsLT5tYXN0ZXItPmRyaXZlcjsKKwlzbC0+ZGV2LmRyaXZlciA9ICZ3MV9zbGF2ZV9kcml2ZXI7CiAJc2wtPmRldi5idXMgPSAmdzFfYnVzX3R5cGU7CiAJc2wtPmRldi5yZWxlYXNlID0gJncxX3NsYXZlX3JlbGVhc2U7CiAKQEAgLTM0Nyw4ICs0MjIsNyBAQAogCQkgKHVuc2lnbmVkIGludCkgc2wtPnJlZ19udW0uZmFtaWx5LAogCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2wtPnJlZ19udW0uaWQpOwogCi0JZGV2X2RiZygmc2wtPmRldiwgIiVzOiByZWdpc3RlcmluZyAlcy5cbiIsIF9fZnVuY19fLAotCQkmc2wtPmRldi5idXNfaWRbMF0pOworCWRldl9kYmcoJnNsLT5kZXYsICIlczogcmVnaXN0ZXJpbmcgJXMgYXMgJXAuXG4iLCBfX2Z1bmNfXywgJnNsLT5kZXYuYnVzX2lkWzBdKTsKIAogCWVyciA9IGRldmljZV9yZWdpc3Rlcigmc2wtPmRldik7CiAJaWYgKGVyciA8IDApIHsKQEAgLTM1OCwzNiArNDMyLDQ0IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JbWVtY3B5KCZzbC0+YXR0cl9iaW4sICZ3MV9zbGF2ZV9iaW5fYXR0cmlidXRlLCBzaXplb2Yoc2wtPmF0dHJfYmluKSk7Ci0JbWVtY3B5KCZzbC0+YXR0cl9uYW1lLCAmdzFfc2xhdmVfYXR0cmlidXRlLCBzaXplb2Yoc2wtPmF0dHJfbmFtZSkpOwotCi0Jc2wtPmF0dHJfYmluLnJlYWQgPSBzbC0+ZmFtaWx5LT5mb3BzLT5yYmluOwotCXNsLT5hdHRyX25hbWUuc2hvdyA9IHNsLT5mYW1pbHktPmZvcHMtPnJuYW1lOwotCi0JZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzbC0+ZGV2LCAmc2wtPmF0dHJfbmFtZSk7CisJLyogQ3JlYXRlICJuYW1lIiBlbnRyeSAqLworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2wtPmRldiwgJncxX3NsYXZlX2F0dHJfbmFtZSk7CiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2Vycigmc2wtPmRldiwKIAkJCSJzeXNmcyBmaWxlIGNyZWF0aW9uIGZvciBbJXNdIGZhaWxlZC4gZXJyPSVkXG4iLAogCQkJc2wtPmRldi5idXNfaWQsIGVycik7Ci0JCWRldmljZV91bnJlZ2lzdGVyKCZzbC0+ZGV2KTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXRfdW5yZWc7CiAJfQogCi0JaWYgKCBzbC0+YXR0cl9iaW4ucmVhZCApIHsKLQkJZXJyID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZzbC0+YXR0cl9iaW4pOwotCQlpZiAoZXJyIDwgMCkgewotCQkJZGV2X2Vycigmc2wtPmRldiwKLQkJCQkic3lzZnMgZmlsZSBjcmVhdGlvbiBmb3IgWyVzXSBmYWlsZWQuIGVycj0lZFxuIiwKLQkJCQlzbC0+ZGV2LmJ1c19pZCwgZXJyKTsKLQkJCWRldmljZV9yZW1vdmVfZmlsZSgmc2wtPmRldiwgJnNsLT5hdHRyX25hbWUpOwotCQkJZGV2aWNlX3VucmVnaXN0ZXIoJnNsLT5kZXYpOwotCQkJcmV0dXJuIGVycjsKLQkJfQorCS8qIENyZWF0ZSAiaWQiIGVudHJ5ICovCisJZXJyID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZ3MV9zbGF2ZV9hdHRyX2Jpbl9pZCk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2Vycigmc2wtPmRldiwKKwkJCSJzeXNmcyBmaWxlIGNyZWF0aW9uIGZvciBbJXNdIGZhaWxlZC4gZXJyPSVkXG4iLAorCQkJc2wtPmRldi5idXNfaWQsIGVycik7CisJCWdvdG8gb3V0X3JlbTE7CisJfQorCisJLyogaWYgdGhlIGZhbWlseSBkcml2ZXIgbmVlZHMgdG8gaW5pdGlhbGl6ZSBzb21ldGhpbmcuLi4gKi8KKwlpZiAoc2wtPmZhbWlseS0+Zm9wcyAmJiBzbC0+ZmFtaWx5LT5mb3BzLT5hZGRfc2xhdmUgJiYKKwkgICAgKChlcnIgPSBzbC0+ZmFtaWx5LT5mb3BzLT5hZGRfc2xhdmUoc2wpKSA8IDApKSB7CisJCWRldl9lcnIoJnNsLT5kZXYsCisJCQkic3lzZnMgZmlsZSBjcmVhdGlvbiBmb3IgWyVzXSBmYWlsZWQuIGVycj0lZFxuIiwKKwkJCXNsLT5kZXYuYnVzX2lkLCBlcnIpOworCQlnb3RvIG91dF9yZW0yOwogCX0KIAogCWxpc3RfYWRkX3RhaWwoJnNsLT53MV9zbGF2ZV9lbnRyeSwgJnNsLT5tYXN0ZXItPnNsaXN0KTsKIAogCXJldHVybiAwOworCitvdXRfcmVtMjoKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnNsLT5kZXYua29iaiwgJncxX3NsYXZlX2F0dHJfYmluX2lkKTsKK291dF9yZW0xOgorCWRldmljZV9yZW1vdmVfZmlsZSgmc2wtPmRldiwgJncxX3NsYXZlX2F0dHJfbmFtZSk7CitvdXRfdW5yZWc6CisJZGV2aWNlX3VucmVnaXN0ZXIoJnNsLT5kZXYpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgdzFfYXR0YWNoX3NsYXZlX2RldmljZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCB3MV9yZWdfbnVtICpybikKQEAgLTQxMyw3ICs0OTUsNyBAQAogCiAJbWVtY3B5KCZzbC0+cmVnX251bSwgcm4sIHNpemVvZihzbC0+cmVnX251bSkpOwogCWF0b21pY19zZXQoJnNsLT5yZWZjbnQsIDApOwotCWluaXRfY29tcGxldGlvbigmc2wtPmRldl9yZWxlYXNlZCk7CisJaW5pdF9jb21wbGV0aW9uKCZzbC0+cmVsZWFzZWQpOwogCiAJc3Bpbl9sb2NrKCZ3MV9mbG9jayk7CiAJZiA9IHcxX2ZhbWlseV9yZWdpc3RlcmVkKHJuLT5mYW1pbHkpOwpAQCAtNDUyLDI4ICs1MzQsMjMgQEAKIHsKIAlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgbXNnOwogCi0JZGV2X2luZm8oJnNsLT5kZXYsICIlczogZGV0YWNoaW5nICVzLlxuIiwgX19mdW5jX18sIHNsLT5uYW1lKTsKKwlkZXZfZGJnKCZzbC0+ZGV2LCAiJXM6IGRldGFjaGluZyAlcyBbJXBdLlxuIiwgX19mdW5jX18sIHNsLT5uYW1lLCBzbCk7CiAKLQl3aGlsZSAoYXRvbWljX3JlYWQoJnNsLT5yZWZjbnQpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIldhaXRpbmcgZm9yICVzIHRvIGJlY29tZSBmcmVlOiByZWZjbnQ9JWQuXG4iLAotCQkJCXNsLT5uYW1lLCBhdG9taWNfcmVhZCgmc2wtPnJlZmNudCkpOworCWxpc3RfZGVsKCZzbC0+dzFfc2xhdmVfZW50cnkpOwogCi0JCWlmIChtc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKSkKLQkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7Ci0JfQotCi0JaWYgKCBzbC0+YXR0cl9iaW4ucmVhZCApIHsKLQkJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlICgmc2wtPmRldi5rb2JqLCAmc2wtPmF0dHJfYmluKTsKLQl9Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZzbC0+ZGV2LCAmc2wtPmF0dHJfbmFtZSk7Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJnNsLT5kZXYpOwotCXcxX2ZhbWlseV9wdXQoc2wtPmZhbWlseSk7Ci0KLQlzbC0+bWFzdGVyLT5zbGF2ZV9jb3VudC0tOworCWlmIChzbC0+ZmFtaWx5LT5mb3BzICYmIHNsLT5mYW1pbHktPmZvcHMtPnJlbW92ZV9zbGF2ZSkKKwkJc2wtPmZhbWlseS0+Zm9wcy0+cmVtb3ZlX3NsYXZlKHNsKTsKIAogCW1lbWNweSgmbXNnLmlkLmlkLCAmc2wtPnJlZ19udW0sIHNpemVvZihtc2cuaWQuaWQpKTsKIAltc2cudHlwZSA9IFcxX1NMQVZFX1JFTU9WRTsKIAl3MV9uZXRsaW5rX3NlbmQoc2wtPm1hc3RlciwgJm1zZyk7CisKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnNsLT5kZXYua29iaiwgJncxX3NsYXZlX2F0dHJfYmluX2lkKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNsLT5kZXYsICZ3MV9zbGF2ZV9hdHRyX25hbWUpOworCWRldmljZV91bnJlZ2lzdGVyKCZzbC0+ZGV2KTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnNsLT5yZWxlYXNlZCk7CisJa2ZyZWUoc2wpOwogfQogCiBzdGF0aWMgc3RydWN0IHcxX21hc3RlciAqdzFfc2VhcmNoX21hc3Rlcih1bnNpZ25lZCBsb25nIGRhdGEpCkBAIC01MDAsMTQgKzU3NywxMyBAQAogCiAJc3Bpbl9sb2NrX2JoKCZ3MV9tbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ3MV9tYXN0ZXJzLCB3MV9tYXN0ZXJfZW50cnkpIHsKLQkJZGV2X2luZm8oJmRldi0+ZGV2LCAiUmVjb25uZWN0aW5nIHNsYXZlcyBpbiAlcyBpbnRvIG5ldyBmYW1pbHkgJTAyeC5cbiIsCisJCWRldl9kYmcoJmRldi0+ZGV2LCAiUmVjb25uZWN0aW5nIHNsYXZlcyBpbiAlcyBpbnRvIG5ldyBmYW1pbHkgJTAyeC5cbiIsCiAJCQkJZGV2LT5uYW1lLCBmLT5maWQpOwogCQlzZXRfYml0KFcxX01BU1RFUl9ORUVEX1JFQ09OTkVDVCwgJmRldi0+ZmxhZ3MpOwogCX0KIAlzcGluX3VubG9ja19iaCgmdzFfbWxvY2spOwogfQogCi0KIHN0YXRpYyB2b2lkIHcxX3NsYXZlX2ZvdW5kKHVuc2lnbmVkIGxvbmcgZGF0YSwgdTY0IHJuKQogewogCWludCBzbGF2ZV9jb3VudDsKQEAgLTY0Niw3ICs3MjIsNyBAQAogCQloYXZlX3RvX3dhaXQgPSAwOwogCiAJCXRyeV90b19mcmVlemUoKTsKLQkJbXNsZWVwX2ludGVycnVwdGlibGUodzFfdGltZW91dCAqIDEwMDApOworCQltc2xlZXBfaW50ZXJydXB0aWJsZSh3MV9jb250cm9sX3RpbWVvdXQgKiAxMDAwKTsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwpAQCAtNjc5LDMzICs3NTUsMzAgQEAKIAkJCQlsaXN0X2RlbCgmZGV2LT53MV9tYXN0ZXJfZW50cnkpOwogCQkJCXNwaW5fdW5sb2NrX2JoKCZ3MV9tbG9jayk7CiAKKwkJCQlkb3duKCZkZXYtPm11dGV4KTsKIAkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2wsIHNsbiwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KSB7Ci0JCQkJCWxpc3RfZGVsKCZzbC0+dzFfc2xhdmVfZW50cnkpOwotCiAJCQkJCXcxX3NsYXZlX2RldGFjaChzbCk7Ci0JCQkJCWtmcmVlKHNsKTsKIAkJCQl9CiAJCQkJdzFfZGVzdHJveV9tYXN0ZXJfYXR0cmlidXRlcyhkZXYpOworCQkJCXVwKCZkZXYtPm11dGV4KTsKIAkJCQlhdG9taWNfZGVjKCZkZXYtPnJlZmNudCk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCWlmICh0ZXN0X2JpdChXMV9NQVNURVJfTkVFRF9SRUNPTk5FQ1QsICZkZXYtPmZsYWdzKSkgewotCQkJCWRldl9pbmZvKCZkZXYtPmRldiwgIlJlY29ubmVjdGluZyBzbGF2ZXMgaW4gZGV2aWNlICVzLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlkZXZfZGJnKCZkZXYtPmRldiwgIlJlY29ubmVjdGluZyBzbGF2ZXMgaW4gZGV2aWNlICVzLlxuIiwgZGV2LT5uYW1lKTsKIAkJCQlkb3duKCZkZXYtPm11dGV4KTsKLQkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNsLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpIHsKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2wsIHNsbiwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KSB7CiAJCQkJCWlmIChzbC0+ZmFtaWx5LT5maWQgPT0gVzFfRkFNSUxZX0RFRkFVTFQpIHsKIAkJCQkJCXN0cnVjdCB3MV9yZWdfbnVtIHJuOwotCQkJCQkJbGlzdF9kZWwoJnNsLT53MV9zbGF2ZV9lbnRyeSk7Ci0JCQkJCQl3MV9zbGF2ZV9kZXRhY2goc2wpOwogCiAJCQkJCQltZW1jcHkoJnJuLCAmc2wtPnJlZ19udW0sIHNpemVvZihybikpOwotCi0JCQkJCQlrZnJlZShzbCk7CisJCQkJCQl3MV9zbGF2ZV9kZXRhY2goc2wpOwogCiAJCQkJCQl3MV9hdHRhY2hfc2xhdmVfZGV2aWNlKGRldiwgJnJuKTsKIAkJCQkJfQogCQkJCX0KKwkJCQlkZXZfZGJnKCZkZXYtPmRldiwgIlJlY29ubmVjdGluZyBzbGF2ZXMgaW4gZGV2aWNlICVzIGhhcyBiZWVuIGZpbmlzaGVkLlxuIiwgZGV2LT5uYW1lKTsKIAkJCQljbGVhcl9iaXQoVzFfTUFTVEVSX05FRURfUkVDT05ORUNULCAmZGV2LT5mbGFncyk7CiAJCQkJdXAoJmRldi0+bXV0ZXgpOwogCQkJfQpAQCAtNzQ5LDEwICs4MjIsNyBAQAogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbCwgc2xuLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpIHsKIAkJCWlmICghdGVzdF9iaXQoVzFfU0xBVkVfQUNUSVZFLCAodW5zaWduZWQgbG9uZyAqKSZzbC0+ZmxhZ3MpICYmICEtLXNsLT50dGwpIHsKLQkJCQlsaXN0X2RlbCAoJnNsLT53MV9zbGF2ZV9lbnRyeSk7Ci0KLQkJCQl3MV9zbGF2ZV9kZXRhY2ggKHNsKTsKLQkJCQlrZnJlZSAoc2wpOworCQkJCXcxX3NsYXZlX2RldGFjaChzbCk7CiAKIAkJCQlkZXYtPnNsYXZlX2NvdW50LS07CiAJCQl9IGVsc2UgaWYgKHRlc3RfYml0KFcxX1NMQVZFX0FDVElWRSwgKHVuc2lnbmVkIGxvbmcgKikmc2wtPmZsYWdzKSkKQEAgLTc4Myw3ICs4NTMsNyBAQAogCQlnb3RvIGVycl9vdXRfZXhpdF9pbml0OwogCX0KIAotCXJldHZhbCA9IGRyaXZlcl9yZWdpc3RlcigmdzFfZHJpdmVyKTsKKwlyZXR2YWwgPSBkcml2ZXJfcmVnaXN0ZXIoJncxX21hc3Rlcl9kcml2ZXIpOwogCWlmIChyZXR2YWwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCQkiRmFpbGVkIHRvIHJlZ2lzdGVyIG1hc3RlciBkcml2ZXIuIGVycj0lZC5cbiIsCkBAIC03OTEsMTggKzg2MSwyOSBAQAogCQlnb3RvIGVycl9vdXRfYnVzX3VucmVnaXN0ZXI7CiAJfQogCisJcmV0dmFsID0gZHJpdmVyX3JlZ2lzdGVyKCZ3MV9zbGF2ZV9kcml2ZXIpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiRmFpbGVkIHRvIHJlZ2lzdGVyIG1hc3RlciBkcml2ZXIuIGVycj0lZC5cbiIsCisJCQlyZXR2YWwpOworCQlnb3RvIGVycl9vdXRfbWFzdGVyX3VucmVnaXN0ZXI7CisJfQorCiAJY29udHJvbF90aHJlYWQgPSBrZXJuZWxfdGhyZWFkKCZ3MV9jb250cm9sLCBOVUxMLCAwKTsKIAlpZiAoY29udHJvbF90aHJlYWQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGNyZWF0ZSBjb250cm9sIHRocmVhZC4gZXJyPSVkXG4iLAogCQkJY29udHJvbF90aHJlYWQpOwogCQlyZXR2YWwgPSBjb250cm9sX3RocmVhZDsKLQkJZ290byBlcnJfb3V0X2RyaXZlcl91bnJlZ2lzdGVyOworCQlnb3RvIGVycl9vdXRfc2xhdmVfdW5yZWdpc3RlcjsKIAl9CiAKIAlyZXR1cm4gMDsKIAotZXJyX291dF9kcml2ZXJfdW5yZWdpc3RlcjoKLQlkcml2ZXJfdW5yZWdpc3RlcigmdzFfZHJpdmVyKTsKK2Vycl9vdXRfc2xhdmVfdW5yZWdpc3RlcjoKKwlkcml2ZXJfdW5yZWdpc3RlcigmdzFfc2xhdmVfZHJpdmVyKTsKKworZXJyX291dF9tYXN0ZXJfdW5yZWdpc3RlcjoKKwlkcml2ZXJfdW5yZWdpc3RlcigmdzFfbWFzdGVyX2RyaXZlcik7CiAKIGVycl9vdXRfYnVzX3VucmVnaXN0ZXI6CiAJYnVzX3VucmVnaXN0ZXIoJncxX2J1c190eXBlKTsKQEAgLTgyMSw3ICs5MDIsOCBAQAogCWNvbnRyb2xfbmVlZHNfZXhpdCA9IDE7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmdzFfY29udHJvbF9jb21wbGV0ZSk7CiAKLQlkcml2ZXJfdW5yZWdpc3RlcigmdzFfZHJpdmVyKTsKKwlkcml2ZXJfdW5yZWdpc3RlcigmdzFfc2xhdmVfZHJpdmVyKTsKKwlkcml2ZXJfdW5yZWdpc3RlcigmdzFfbWFzdGVyX2RyaXZlcik7CiAJYnVzX3VucmVnaXN0ZXIoJncxX2J1c190eXBlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MS5oIGIvZHJpdmVycy93MS93MS5oCmluZGV4IDRmMGE5ODYuLmQ4OTAwNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzEuaAorKysgYi9kcml2ZXJzL3cxL3cxLmgKQEAgLTc1LDExICs3NSw5IEBACiAKIAlzdHJ1Y3QgdzFfbWFzdGVyCSptYXN0ZXI7CiAJc3RydWN0IHcxX2ZhbWlseQkqZmFtaWx5OworCXZvaWQJCQkqZmFtaWx5X2RhdGE7CiAJc3RydWN0IGRldmljZQkJZGV2OwotCXN0cnVjdCBjb21wbGV0aW9uCWRldl9yZWxlYXNlZDsKLQotCXN0cnVjdCBiaW5fYXR0cmlidXRlCWF0dHJfYmluOwotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCWF0dHJfbmFtZTsKKwlzdHJ1Y3QgY29tcGxldGlvbglyZWxlYXNlZDsKIH07CiAKIHR5cGVkZWYgdm9pZCAoKiB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjaykodW5zaWduZWQgbG9uZywgdTY0KTsKQEAgLTE3OSw3ICsxNzcsNiBAQAogCiAJc3RydWN0IGRldmljZV9kcml2ZXIJKmRyaXZlcjsKIAlzdHJ1Y3QgZGV2aWNlCQlkZXY7Ci0Jc3RydWN0IGNvbXBsZXRpb24JZGV2X3JlbGVhc2VkOwogCXN0cnVjdCBjb21wbGV0aW9uCWRldl9leGl0ZWQ7CiAKIAlzdHJ1Y3QgdzFfYnVzX21hc3RlcgkqYnVzX21hc3RlcjsKQEAgLTE5MSw2ICsxODgsMjEgQEAKIGludCB3MV9jcmVhdGVfbWFzdGVyX2F0dHJpYnV0ZXMoc3RydWN0IHcxX21hc3RlciAqKTsKIHZvaWQgdzFfc2VhcmNoKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdzFfc2xhdmVfZm91bmRfY2FsbGJhY2sgY2IpOwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCB3MV9zbGF2ZSogZGV2X3RvX3cxX3NsYXZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX3NsYXZlLCBkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB3MV9zbGF2ZSoga29ial90b193MV9zbGF2ZShzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlyZXR1cm4gZGV2X3RvX3cxX3NsYXZlKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHcxX21hc3RlciogZGV2X3RvX3cxX21hc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9tYXN0ZXIsIGRldik7Cit9CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfX1cxX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfZHMyNDMzLmMgYi9kcml2ZXJzL3cxL3cxX2RzMjQzMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzI0YjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3cxL3cxX2RzMjQzMy5jCkBAIC0wLDAgKzEsMzI3IEBACisvKgorICoJdzFfZHMyNDMzLmMgLSB3MSBmYW1pbHkgMjMgKERTMjQzMykgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEJlbiBHYXJkbmVyIDxiZ2FyZG5lckB3YWJ0ZWMuY29tPgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpZmRlZiBDT05GSUdfVzFfRjIzX0NSQworI2luY2x1ZGUgPGxpbnV4L2NyYzE2Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgIncxLmgiCisjaW5jbHVkZSAidzFfaW8uaCIKKyNpbmNsdWRlICJ3MV9pbnQuaCIKKyNpbmNsdWRlICJ3MV9mYW1pbHkuaCIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQmVuIEdhcmRuZXIgPGJnYXJkbmVyQHdhYnRlYy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIncxIGZhbWlseSAyMyBkcml2ZXIgZm9yIERTMjQzMywgNGtiIEVFUFJPTSIpOworCisjZGVmaW5lIFcxX0VFUFJPTV9TSVpFCQk1MTIKKyNkZWZpbmUgVzFfUEFHRV9DT1VOVAkJMTYKKyNkZWZpbmUgVzFfUEFHRV9TSVpFCQkzMgorI2RlZmluZSBXMV9QQUdFX0JJVFMJCTUKKyNkZWZpbmUgVzFfUEFHRV9NQVNLCQkweDFGCisKKyNkZWZpbmUgVzFfRjIzX1RJTUUJCTMwMAorCisjZGVmaW5lIFcxX0YyM19SRUFEX0VFUFJPTQkweEYwCisjZGVmaW5lIFcxX0YyM19XUklURV9TQ1JBVENICTB4MEYKKyNkZWZpbmUgVzFfRjIzX1JFQURfU0NSQVRDSAkweEFBCisjZGVmaW5lIFcxX0YyM19DT1BZX1NDUkFUQ0gJMHg1NQorCitzdHJ1Y3QgdzFfZjIzX2RhdGEgeworCXU4CW1lbW9yeVtXMV9FRVBST01fU0laRV07CisJdTMyCXZhbGlkY3JjOworfTsKKworLyoqCisgKiBDaGVjayB0aGUgZmlsZSBzaXplIGJvdW5kcyBhbmQgYWRqdXN0cyBjb3VudCBhcyBuZWVkZWQuCisgKiBUaGlzIHdvdWxkIG5vdCBiZSBuZWVkZWQgaWYgdGhlIGZpbGUgc2l6ZSBkaWRuJ3QgcmVzZXQgdG8gMCBhZnRlciBhIHdyaXRlLgorICovCitzdGF0aWMgaW5saW5lIHNpemVfdCB3MV9mMjNfZml4X2NvdW50KGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCwgc2l6ZV90IHNpemUpCit7CisJaWYgKG9mZiA+IHNpemUpCisJCXJldHVybiAwOworCisJaWYgKChvZmYgKyBjb3VudCkgPiBzaXplKQorCQlyZXR1cm4gKHNpemUgLSBvZmYpOworCisJcmV0dXJuIGNvdW50OworfQorCisjaWZkZWYgQ09ORklHX1cxX0YyM19DUkMKK3N0YXRpYyBpbnQgdzFfZjIzX3JlZnJlc2hfYmxvY2soc3RydWN0IHcxX3NsYXZlICpzbCwgc3RydWN0IHcxX2YyM19kYXRhICpkYXRhLAorCQkJCWludCBibG9jaykKK3sKKwl1OAl3cmJ1ZlszXTsKKwlpbnQJb2ZmID0gYmxvY2sgKiBXMV9QQUdFX1NJWkU7CisKKwlpZiAoZGF0YS0+dmFsaWRjcmMgJiAoMSA8PCBibG9jaykpCisJCXJldHVybiAwOworCisJaWYgKHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpIHsKKwkJZGF0YS0+dmFsaWRjcmMgPSAwOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl3cmJ1ZlswXSA9IFcxX0YyM19SRUFEX0VFUFJPTTsKKwl3cmJ1ZlsxXSA9IG9mZiAmIDB4ZmY7CisJd3JidWZbMl0gPSBvZmYgPj4gODsKKwl3MV93cml0ZV9ibG9jayhzbC0+bWFzdGVyLCB3cmJ1ZiwgMyk7CisJdzFfcmVhZF9ibG9jayhzbC0+bWFzdGVyLCAmZGF0YS0+bWVtb3J5W29mZl0sIFcxX1BBR0VfU0laRSk7CisKKwkvKiBjYWNoZSB0aGUgYmxvY2sgaWYgdGhlIENSQyBpcyB2YWxpZCAqLworCWlmIChjcmMxNihDUkMxNl9JTklULCAmZGF0YS0+bWVtb3J5W29mZl0sIFcxX1BBR0VfU0laRSkgPT0gQ1JDMTZfVkFMSUQpCisJCWRhdGEtPnZhbGlkY3JjIHw9ICgxIDw8IGJsb2NrKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCS8qIENPTkZJR19XMV9GMjNfQ1JDICovCisKK3N0YXRpYyBzc2l6ZV90IHcxX2YyM19yZWFkX2JpbihzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLAorCQkJICAgICAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0ga29ial90b193MV9zbGF2ZShrb2JqKTsKKyNpZmRlZiBDT05GSUdfVzFfRjIzX0NSQworCXN0cnVjdCB3MV9mMjNfZGF0YSAqZGF0YSA9IHNsLT5mYW1pbHlfZGF0YTsKKwlpbnQgaSwgbWluX3BhZ2UsIG1heF9wYWdlOworI2Vsc2UKKwl1OCB3cmJ1ZlszXTsKKyNlbmRpZgorCisJaWYgKChjb3VudCA9IHcxX2YyM19maXhfY291bnQob2ZmLCBjb3VudCwgVzFfRUVQUk9NX1NJWkUpKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWF0b21pY19pbmMoJnNsLT5yZWZjbnQpOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNsLT5tYXN0ZXItPm11dGV4KSkgeworCQljb3VudCA9IDA7CisJCWdvdG8gb3V0X2RlYzsKKwl9CisKKyNpZmRlZiBDT05GSUdfVzFfRjIzX0NSQworCisJbWluX3BhZ2UgPSAob2ZmID4+IFcxX1BBR0VfQklUUyk7CisJbWF4X3BhZ2UgPSAob2ZmICsgY291bnQgLSAxKSA+PiBXMV9QQUdFX0JJVFM7CisJZm9yIChpID0gbWluX3BhZ2U7IGkgPD0gbWF4X3BhZ2U7IGkrKykgeworCQlpZiAodzFfZjIzX3JlZnJlc2hfYmxvY2soc2wsIGRhdGEsIGkpKSB7CisJCQljb3VudCA9IC1FSU87CisJCQlnb3RvIG91dF91cDsKKwkJfQorCX0KKwltZW1jcHkoYnVmLCAmZGF0YS0+bWVtb3J5W29mZl0sIGNvdW50KTsKKworI2Vsc2UgCS8qIENPTkZJR19XMV9GMjNfQ1JDICovCisKKwkvKiByZWFkIGRpcmVjdGx5IGZyb20gdGhlIEVFUFJPTSAqLworCWlmICh3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc2wpKSB7CisJCWNvdW50ID0gLUVJTzsKKwkJZ290byBvdXRfdXA7CisJfQorCisJd3JidWZbMF0gPSBXMV9GMjNfUkVBRF9FRVBST007CisJd3JidWZbMV0gPSBvZmYgJiAweGZmOworCXdyYnVmWzJdID0gb2ZmID4+IDg7CisJdzFfd3JpdGVfYmxvY2soc2wtPm1hc3Rlciwgd3JidWYsIDMpOworCXcxX3JlYWRfYmxvY2soc2wtPm1hc3RlciwgYnVmLCBjb3VudCk7CisKKyNlbmRpZgkvKiBDT05GSUdfVzFfRjIzX0NSQyAqLworCitvdXRfdXA6CisJdXAoJnNsLT5tYXN0ZXItPm11dGV4KTsKK291dF9kZWM6CisJYXRvbWljX2RlYygmc2wtPnJlZmNudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogV3JpdGVzIHRvIHRoZSBzY3JhdGNocGFkIGFuZCByZWFkcyBpdCBiYWNrIGZvciB2ZXJpZmljYXRpb24uCisgKiBUaGVuIGNvcGllcyB0aGUgc2NyYXRjaHBhZCB0byBFRVBST00uCisgKiBUaGUgZGF0YSBtdXN0IGJlIG9uIG9uZSBwYWdlLgorICogVGhlIG1hc3RlciBtdXN0IGJlIGxvY2tlZC4KKyAqCisgKiBAcGFyYW0gc2wJVGhlIHNsYXZlIHN0cnVjdHVyZQorICogQHBhcmFtIGFkZHIJQWRkcmVzcyBmb3IgdGhlIHdyaXRlCisgKiBAcGFyYW0gbGVuICAgbGVuZ3RoIG11c3QgYmUgPD0gKFcxX1BBR0VfU0laRSAtIChhZGRyICYgVzFfUEFHRV9NQVNLKSkKKyAqIEBwYXJhbSBkYXRhCVRoZSBkYXRhIHRvIHdyaXRlCisgKiBAcmV0dXJuCTA9U3VjY2VzcyAtMT1mYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgdzFfZjIzX3dyaXRlKHN0cnVjdCB3MV9zbGF2ZSAqc2wsIGludCBhZGRyLCBpbnQgbGVuLCBjb25zdCB1OCAqZGF0YSkKK3sKKwl1OCB3cmJ1Zls0XTsKKwl1OCByZGJ1ZltXMV9QQUdFX1NJWkUgKyAzXTsKKwl1OCBlcyA9IChhZGRyICsgbGVuIC0gMSkgJiAweDFmOworCisJLyogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIHNjcmF0Y2hwYWQgKi8KKwlpZiAodzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSkKKwkJcmV0dXJuIC0xOworCisJd3JidWZbMF0gPSBXMV9GMjNfV1JJVEVfU0NSQVRDSDsKKwl3cmJ1ZlsxXSA9IGFkZHIgJiAweGZmOworCXdyYnVmWzJdID0gYWRkciA+PiA4OworCisJdzFfd3JpdGVfYmxvY2soc2wtPm1hc3Rlciwgd3JidWYsIDMpOworCXcxX3dyaXRlX2Jsb2NrKHNsLT5tYXN0ZXIsIGRhdGEsIGxlbik7CisKKwkvKiBSZWFkIHRoZSBzY3JhdGNocGFkIGFuZCB2ZXJpZnkgKi8KKwlpZiAodzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSkKKwkJcmV0dXJuIC0xOworCisJdzFfd3JpdGVfOChzbC0+bWFzdGVyLCBXMV9GMjNfUkVBRF9TQ1JBVENIKTsKKwl3MV9yZWFkX2Jsb2NrKHNsLT5tYXN0ZXIsIHJkYnVmLCBsZW4gKyAzKTsKKworCS8qIENvbXBhcmUgd2hhdCB3YXMgcmVhZCBhZ2FpbnN0IHRoZSBkYXRhIHdyaXR0ZW4gKi8KKwlpZiAoKHJkYnVmWzBdICE9IHdyYnVmWzFdKSB8fCAocmRidWZbMV0gIT0gd3JidWZbMl0pIHx8CisJICAgIChyZGJ1ZlsyXSAhPSBlcykgfHwgKG1lbWNtcChkYXRhLCAmcmRidWZbM10sIGxlbikgIT0gMCkpCisJCXJldHVybiAtMTsKKworCS8qIENvcHkgdGhlIHNjcmF0Y2hwYWQgdG8gRUVQUk9NICovCisJaWYgKHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpCisJCXJldHVybiAtMTsKKworCXdyYnVmWzBdID0gVzFfRjIzX0NPUFlfU0NSQVRDSDsKKwl3cmJ1ZlszXSA9IGVzOworCXcxX3dyaXRlX2Jsb2NrKHNsLT5tYXN0ZXIsIHdyYnVmLCA0KTsKKworCS8qIFNsZWVwIGZvciA1IG1zIHRvIHdhaXQgZm9yIHRoZSB3cml0ZSB0byBjb21wbGV0ZSAqLworCW1zbGVlcCg1KTsKKworCS8qIFJlc2V0IHRoZSBidXMgdG8gd2FrZSB1cCB0aGUgRUVQUk9NICh0aGlzIG1heSBub3QgYmUgbmVlZGVkKSAqLworCXcxX3Jlc2V0X2J1cyhzbC0+bWFzdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCB3MV9mMjNfd3JpdGVfYmluKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsCisJCQkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBrb2JqX3RvX3cxX3NsYXZlKGtvYmopOworCWludCBhZGRyLCBsZW4sIGlkeDsKKworCWlmICgoY291bnQgPSB3MV9mMjNfZml4X2NvdW50KG9mZiwgY291bnQsIFcxX0VFUFJPTV9TSVpFKSkgPT0gMCkKKwkJcmV0dXJuIDA7CisKKyNpZmRlZiBDT05GSUdfVzFfRjIzX0NSQworCS8qIGNhbiBvbmx5IHdyaXRlIGZ1bGwgYmxvY2tzIGluIGNhY2hlZCBtb2RlICovCisJaWYgKChvZmYgJiBXMV9QQUdFX01BU0spIHx8IChjb3VudCAmIFcxX1BBR0VfTUFTSykpIHsKKwkJZGV2X2Vycigmc2wtPmRldiwgImludmFsaWQgb2Zmc2V0L2NvdW50IG9mZj0lZCBjbnQ9JWRcbiIsCisJCQkoaW50KW9mZiwgY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBtYWtlIHN1cmUgdGhlIGJsb2NrIENSQ3MgYXJlIHZhbGlkICovCisJZm9yIChpZHggPSAwOyBpZHggPCBjb3VudDsgaWR4ICs9IFcxX1BBR0VfU0laRSkgeworCQlpZiAoY3JjMTYoQ1JDMTZfSU5JVCwgJmJ1ZltpZHhdLCBXMV9QQUdFX1NJWkUpICE9IENSQzE2X1ZBTElEKSB7CisJCQlkZXZfZXJyKCZzbC0+ZGV2LCAiYmFkIENSQyBhdCBvZmZzZXQgJWRcbiIsIChpbnQpb2ZmKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorI2VuZGlmCS8qIENPTkZJR19XMV9GMjNfQ1JDICovCisKKwlhdG9taWNfaW5jKCZzbC0+cmVmY250KTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzbC0+bWFzdGVyLT5tdXRleCkpIHsKKwkJY291bnQgPSAwOworCQlnb3RvIG91dF9kZWM7CisJfQorCisJLyogQ2FuIG9ubHkgd3JpdGUgZGF0YSB0byBvbmUgcGFnZSBhdCBhIHRpbWUgKi8KKwlpZHggPSAwOworCXdoaWxlIChpZHggPCBjb3VudCkgeworCQlhZGRyID0gb2ZmICsgaWR4OworCQlsZW4gPSBXMV9QQUdFX1NJWkUgLSAoYWRkciAmIFcxX1BBR0VfTUFTSyk7CisJCWlmIChsZW4gPiAoY291bnQgLSBpZHgpKQorCQkJbGVuID0gY291bnQgLSBpZHg7CisKKwkJaWYgKHcxX2YyM193cml0ZShzbCwgYWRkciwgbGVuLCAmYnVmW2lkeF0pIDwgMCkgeworCQkJY291bnQgPSAtRUlPOworCQkJZ290byBvdXRfdXA7CisJCX0KKwkJaWR4ICs9IGxlbjsKKwl9CisKK291dF91cDoKKwl1cCgmc2wtPm1hc3Rlci0+bXV0ZXgpOworb3V0X2RlYzoKKwlhdG9taWNfZGVjKCZzbC0+cmVmY250KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHcxX2YyM19iaW5fYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAiZWVwcm9tIiwKKwkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkuc2l6ZSA9IFcxX0VFUFJPTV9TSVpFLAorCS5yZWFkID0gdzFfZjIzX3JlYWRfYmluLAorCS53cml0ZSA9IHcxX2YyM193cml0ZV9iaW4sCit9OworCitzdGF0aWMgaW50IHcxX2YyM19hZGRfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKK3sKKwlpbnQgZXJyOworI2lmZGVmIENPTkZJR19XMV9GMjNfQ1JDCisJc3RydWN0IHcxX2YyM19kYXRhICpkYXRhOworCisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3MV9mMjNfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgdzFfZjIzX2RhdGEpKTsKKwlzbC0+ZmFtaWx5X2RhdGEgPSBkYXRhOworCisjZW5kaWYJLyogQ09ORklHX1cxX0YyM19DUkMgKi8KKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmc2wtPmRldi5rb2JqLCAmdzFfZjIzX2Jpbl9hdHRyKTsKKworI2lmZGVmIENPTkZJR19XMV9GMjNfQ1JDCisJaWYgKGVycikKKwkJa2ZyZWUoZGF0YSk7CisjZW5kaWYJLyogQ09ORklHX1cxX0YyM19DUkMgKi8KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHcxX2YyM19yZW1vdmVfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKK3sKKyNpZmRlZiBDT05GSUdfVzFfRjIzX0NSQworCWlmIChzbC0+ZmFtaWx5X2RhdGEpIHsKKwkJa2ZyZWUoc2wtPmZhbWlseV9kYXRhKTsKKwkJc2wtPmZhbWlseV9kYXRhID0gTlVMTDsKKwl9CisjZW5kaWYJLyogQ09ORklHX1cxX0YyM19DUkMgKi8KKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnNsLT5kZXYua29iaiwgJncxX2YyM19iaW5fYXR0cik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdzFfZmFtaWx5X29wcyB3MV9mMjNfZm9wcyA9IHsKKwkuYWRkX3NsYXZlICAgICAgPSB3MV9mMjNfYWRkX3NsYXZlLAorCS5yZW1vdmVfc2xhdmUgICA9IHcxX2YyM19yZW1vdmVfc2xhdmUsCit9OworCitzdGF0aWMgc3RydWN0IHcxX2ZhbWlseSB3MV9mYW1pbHlfMjMgPSB7CisJLmZpZCA9IFcxX0VFUFJPTV9EUzI0MzMsCisJLmZvcHMgPSAmdzFfZjIzX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3MV9mMjNfaW5pdCh2b2lkKQoreworCXJldHVybiB3MV9yZWdpc3Rlcl9mYW1pbHkoJncxX2ZhbWlseV8yMyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3MV9mMjNfZmluaSh2b2lkKQoreworCXcxX3VucmVnaXN0ZXJfZmFtaWx5KCZ3MV9mYW1pbHlfMjMpOworfQorCittb2R1bGVfaW5pdCh3MV9mMjNfaW5pdCk7Cittb2R1bGVfZXhpdCh3MV9mMjNfZmluaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jIGIvZHJpdmVycy93MS93MV9mYW1pbHkuYwppbmRleCAwMmVlZTU3Li44OGM1MTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jCisrKyBiL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmMKQEAgLTI5LDIzICsyOSwxMiBAQAogc3RhdGljIExJU1RfSEVBRCh3MV9mYW1pbGllcyk7CiBleHRlcm4gdm9pZCB3MV9yZWNvbm5lY3Rfc2xhdmVzKHN0cnVjdCB3MV9mYW1pbHkgKmYpOwogCi1zdGF0aWMgaW50IHcxX2NoZWNrX2ZhbWlseShzdHJ1Y3QgdzFfZmFtaWx5ICpmKQotewotCWlmICghZi0+Zm9wcy0+cm5hbWUgfHwgIWYtPmZvcHMtPnJiaW4pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KIGludCB3MV9yZWdpc3Rlcl9mYW1pbHkoc3RydWN0IHcxX2ZhbWlseSAqbmV3ZikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbnQsICpuOwogCXN0cnVjdCB3MV9mYW1pbHkgKmY7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAodzFfY2hlY2tfZmFtaWx5KG5ld2YpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXNwaW5fbG9jaygmdzFfZmxvY2spOwogCWxpc3RfZm9yX2VhY2hfc2FmZShlbnQsIG4sICZ3MV9mYW1pbGllcykgewogCQlmID0gbGlzdF9lbnRyeShlbnQsIHN0cnVjdCB3MV9mYW1pbHksIGZhbWlseV9lbnRyeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5oIGIvZHJpdmVycy93MS93MV9mYW1pbHkuaAppbmRleCBiMjZkYTAxLi4yY2EwNDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5oCisrKyBiL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmgKQEAgLTMxLDE0ICszMSwxNyBAQAogI2RlZmluZSBXMV9GQU1JTFlfU01FTV84MQkweDgxCiAjZGVmaW5lIFcxX1RIRVJNX0RTMThTMjAgCTB4MTAKICNkZWZpbmUgVzFfVEhFUk1fRFMxODIyICAJMHgyMgorI2RlZmluZSBXMV9FRVBST01fRFMyNDMzICAJMHgyMwogI2RlZmluZSBXMV9USEVSTV9EUzE4QjIwIAkweDI4CiAKICNkZWZpbmUgTUFYTkFNRUxFTgkJMzIKIAorc3RydWN0IHcxX3NsYXZlOworCiBzdHJ1Y3QgdzFfZmFtaWx5X29wcwogewotCXNzaXplX3QgKCogcm5hbWUpKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiwgY2hhciAqKTsKLQlzc2l6ZV90ICgqIHJiaW4pKHN0cnVjdCBrb2JqZWN0ICosIGNoYXIgKiwgbG9mZl90LCBzaXplX3QpOworCWludCAgKCogYWRkX3NsYXZlKShzdHJ1Y3QgdzFfc2xhdmUgKik7CisJdm9pZCAoKiByZW1vdmVfc2xhdmUpKHN0cnVjdCB3MV9zbGF2ZSAqKTsKIH07CiAKIHN0cnVjdCB3MV9mYW1pbHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfaW50LmMgYi9kcml2ZXJzL3cxL3cxX2ludC5jCmluZGV4IDQ5OGFkNTA1Li5jM2Y2N2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ludC5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW50LmMKQEAgLTI5LDkgKzI5LDkgQEAKIAogc3RhdGljIHUzMiB3MV9pZHMgPSAxOwogCi1leHRlcm4gc3RydWN0IGRldmljZV9kcml2ZXIgdzFfZHJpdmVyOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHcxX21hc3Rlcl9kcml2ZXI7CiBleHRlcm4gc3RydWN0IGJ1c190eXBlIHcxX2J1c190eXBlOwotZXh0ZXJuIHN0cnVjdCBkZXZpY2UgdzFfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBkZXZpY2UgdzFfbWFzdGVyX2RldmljZTsKIGV4dGVybiBpbnQgdzFfbWF4X3NsYXZlX2NvdW50OwogZXh0ZXJuIGludCB3MV9tYXhfc2xhdmVfdHRsOwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgdzFfbWFzdGVyczsKQEAgLTc2LDcgKzc2LDYgQEAKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5zbGlzdCk7CiAJaW5pdF9NVVRFWCgmZGV2LT5tdXRleCk7CiAKLQlpbml0X2NvbXBsZXRpb24oJmRldi0+ZGV2X3JlbGVhc2VkKTsKIAlpbml0X2NvbXBsZXRpb24oJmRldi0+ZGV2X2V4aXRlZCk7CiAKIAltZW1jcHkoJmRldi0+ZGV2LCBkZXZpY2UsIHNpemVvZihzdHJ1Y3QgZGV2aWNlKSk7CkBAIC04OCwxNyArODcsMTQgQEAKIAogCWRldi0+Z3JvdXBzID0gMTsKIAlkZXYtPnNlcSA9IDE7Ci0JZGV2LT5ubHMgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19XMSwgMSwgTlVMTCwgVEhJU19NT0RVTEUpOwotCWlmICghZGV2LT5ubHMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gY3JlYXRlIG5ldyBuZXRsaW5rIHNvY2tldCgldSkgZm9yIHcxIG1hc3RlciAlcy5cbiIsCi0JCQlORVRMSU5LX05GTE9HLCBkZXYtPmRldi5idXNfaWQpOwotCX0KKwlkZXZfaW5pdF9uZXRsaW5rKGRldik7CiAKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJmRldi0+ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIG1hc3RlciBkZXZpY2UuIGVycj0lZFxuIiwgZXJyKTsKLQkJaWYgKGRldi0+bmxzICYmIGRldi0+bmxzLT5za19zb2NrZXQpCi0JCQlzb2NrX3JlbGVhc2UoZGV2LT5ubHMtPnNrX3NvY2tldCk7CisKKwkJZGV2X2ZpbmlfbmV0bGluayhkZXYpOworCiAJCW1lbXNldChkZXYsIDAsIHNpemVvZihzdHJ1Y3QgdzFfbWFzdGVyKSk7CiAJCWtmcmVlKGRldik7CiAJCWRldiA9IE5VTEw7CkBAIC0xMDcsMTMgKzEwMyw5IEBACiAJcmV0dXJuIGRldjsKIH0KIAotc3RhdGljIHZvaWQgdzFfZnJlZV9kZXYoc3RydWN0IHcxX21hc3RlciAqZGV2KQordm9pZCB3MV9mcmVlX2RldihzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCiB7CiAJZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ZGV2KTsKLQlpZiAoZGV2LT5ubHMgJiYgZGV2LT5ubHMtPnNrX3NvY2tldCkKLQkJc29ja19yZWxlYXNlKGRldi0+bmxzLT5za19zb2NrZXQpOwotCW1lbXNldChkZXYsIDAsIHNpemVvZihzdHJ1Y3QgdzFfbWFzdGVyKSArIHNpemVvZihzdHJ1Y3QgdzFfYnVzX21hc3RlcikpOwotCWtmcmVlKGRldik7CiB9CiAKIGludCB3MV9hZGRfbWFzdGVyX2RldmljZShzdHJ1Y3QgdzFfYnVzX21hc3RlciAqbWFzdGVyKQpAQCAtMTI5LDcgKzEyMSw3IEBACiAJCXJldHVybigtRUlOVkFMKTsKICAgICAgICAgfQogCi0JZGV2ID0gdzFfYWxsb2NfZGV2KHcxX2lkcysrLCB3MV9tYXhfc2xhdmVfY291bnQsIHcxX21heF9zbGF2ZV90dGwsICZ3MV9kcml2ZXIsICZ3MV9kZXZpY2UpOworCWRldiA9IHcxX2FsbG9jX2Rldih3MV9pZHMrKywgdzFfbWF4X3NsYXZlX2NvdW50LCB3MV9tYXhfc2xhdmVfdHRsLCAmdzFfbWFzdGVyX2RyaXZlciwgJncxX21hc3Rlcl9kZXZpY2UpOwogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTg4LDcgKzE4MCw3IEBACiAJCQkgX19mdW5jX18sIGRldi0+a3BpZCk7CiAKIAl3aGlsZSAoYXRvbWljX3JlYWQoJmRldi0+cmVmY250KSkgewotCQlwcmludGsoS0VSTl9JTkZPICJXYWl0aW5nIGZvciAlcyB0byBiZWNvbWUgZnJlZTogcmVmY250PSVkLlxuIiwKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJXYWl0aW5nIGZvciAlcyB0byBiZWNvbWUgZnJlZTogcmVmY250PSVkLlxuIiwKIAkJCQlkZXYtPm5hbWUsIGF0b21pY19yZWFkKCZkZXYtPnJlZmNudCkpOwogCiAJCWlmIChtc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfaW8uYyBiL2RyaXZlcnMvdzEvdzFfaW8uYwppbmRleCAwMGYwMzIyLi5lMmEwNDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2lvLmMKKysrIGIvZHJpdmVycy93MS93MV9pby5jCkBAIC0yNzcsNiArMjc3LDI5IEBACiAJCXcxX3NlYXJjaChkZXYsIGNiKTsKIH0KIAorLyoqCisgKiBSZXNldHMgdGhlIGJ1cyBhbmQgdGhlbiBzZWxlY3RzIHRoZSBzbGF2ZSBieSBzZW5kaW5nIGVpdGhlciBhIHNraXAgcm9tCisgKiBvciBhIHJvbSBtYXRjaC4KKyAqIFRoZSB3MSBtYXN0ZXIgbG9jayBtdXN0IGJlIGhlbGQuCisgKgorICogQHBhcmFtIHNsCXRoZSBzbGF2ZSB0byBzZWxlY3QKKyAqIEByZXR1cm4gCTA9c3VjY2VzcywgYW55dGhpbmcgZWxzZT1lcnJvcgorICovCitpbnQgdzFfcmVzZXRfc2VsZWN0X3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCit7CisJaWYgKHcxX3Jlc2V0X2J1cyhzbC0+bWFzdGVyKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHNsLT5tYXN0ZXItPnNsYXZlX2NvdW50ID09IDEpCisJCXcxX3dyaXRlXzgoc2wtPm1hc3RlciwgVzFfU0tJUF9ST00pOworCWVsc2UgeworCQl1OCBtYXRjaFs5XSA9IHtXMV9NQVRDSF9ST00sIH07CisJCW1lbWNweSgmbWF0Y2hbMV0sICh1OCAqKSZzbC0+cmVnX251bSwgOCk7CisJCXcxX3dyaXRlX2Jsb2NrKHNsLT5tYXN0ZXIsIG1hdGNoLCA5KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIEVYUE9SVF9TWU1CT0wodzFfdG91Y2hfYml0KTsKIEVYUE9SVF9TWU1CT0wodzFfd3JpdGVfOCk7CiBFWFBPUlRfU1lNQk9MKHcxX3JlYWRfOCk7CkBAIC0yODYsMyArMzA5LDQgQEAKIEVYUE9SVF9TWU1CT0wodzFfcmVhZF9ibG9jayk7CiBFWFBPUlRfU1lNQk9MKHcxX3dyaXRlX2Jsb2NrKTsKIEVYUE9SVF9TWU1CT0wodzFfc2VhcmNoX2RldmljZXMpOworRVhQT1JUX1NZTUJPTCh3MV9yZXNldF9zZWxlY3Rfc2xhdmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9pby5oIGIvZHJpdmVycy93MS93MV9pby5oCmluZGV4IGFmNTgyOTcuLjIzMjg2MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfaW8uaAorKysgYi9kcml2ZXJzL3cxL3cxX2lvLmgKQEAgLTM0LDUgKzM0LDYgQEAKIHZvaWQgdzFfd3JpdGVfYmxvY2soc3RydWN0IHcxX21hc3RlciAqLCBjb25zdCB1OCAqLCBpbnQpOwogdTggdzFfcmVhZF9ibG9jayhzdHJ1Y3QgdzFfbWFzdGVyICosIHU4ICosIGludCk7CiB2b2lkIHcxX3NlYXJjaF9kZXZpY2VzKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdzFfc2xhdmVfZm91bmRfY2FsbGJhY2sgY2IpOworaW50IHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKTsKIAogI2VuZGlmIC8qIF9fVzFfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9uZXRsaW5rLmMgYi9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYwppbmRleCBlN2I3NzQ0Li4zMjg2NDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYworKysgYi9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYwpAQCAtNTcsMTAgKzU3LDM2IEBACiBubG1zZ19mYWlsdXJlOgogCXJldHVybjsKIH0KKworaW50IGRldl9pbml0X25ldGxpbmsoc3RydWN0IHcxX21hc3RlciAqZGV2KQoreworCWRldi0+bmxzID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfVzEsIDEsIE5VTEwsIFRISVNfTU9EVUxFKTsKKwlpZiAoIWRldi0+bmxzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGNyZWF0ZSBuZXcgbmV0bGluayBzb2NrZXQoJXUpIGZvciB3MSBtYXN0ZXIgJXMuXG4iLAorCQkJTkVUTElOS19XMSwgZGV2LT5kZXYuYnVzX2lkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkZXZfZmluaV9uZXRsaW5rKHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKK3sKKwlpZiAoZGV2LT5ubHMgJiYgZGV2LT5ubHMtPnNrX3NvY2tldCkKKwkJc29ja19yZWxlYXNlKGRldi0+bmxzLT5za19zb2NrZXQpOworfQogI2Vsc2UKICN3YXJuaW5nIE5ldGxpbmsgc3VwcG9ydCBpcyBkaXNhYmxlZC4gUGxlYXNlIGNvbXBpbGUgd2l0aCBORVQgc3VwcG9ydCBlbmFibGVkLgogCiB2b2lkIHcxX25ldGxpbmtfc2VuZChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqbXNnKQogewogfQorCitpbnQgZGV2X2luaXRfbmV0bGluayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZGV2X2ZpbmlfbmV0bGluayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCit7Cit9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oIGIvZHJpdmVycy93MS93MV9uZXRsaW5rLmgKaW5kZXggODYxNTc1Ni4uZWIwYzhiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9uZXRsaW5rLmgKKysrIGIvZHJpdmVycy93MS93MV9uZXRsaW5rLmgKQEAgLTUyLDYgKzUyLDggQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKIHZvaWQgdzFfbmV0bGlua19zZW5kKHN0cnVjdCB3MV9tYXN0ZXIgKiwgc3RydWN0IHcxX25ldGxpbmtfbXNnICopOworaW50IGRldl9pbml0X25ldGxpbmsoc3RydWN0IHcxX21hc3RlciAqZGV2KTsKK3ZvaWQgZGV2X2ZpbmlfbmV0bGluayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fVzFfTkVUTElOS19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX3NtZW0uYyBiL2RyaXZlcnMvdzEvdzFfc21lbS5jCmluZGV4IDcwZDJkNDYuLmUzMjA5ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfc21lbS5jCisrKyBiL2RyaXZlcnMvdzEvdzFfc21lbS5jCkBAIC0zNiw2MSArMzYsMTIgQEAKIE1PRFVMRV9BVVRIT1IoIkV2Z2VuaXkgUG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgMS13aXJlIERhbGxhcyBuZXR3b3JrIHByb3RvY29sLCA2NGJpdCBtZW1vcnkgZmFtaWx5LiIpOwogCi1zdGF0aWMgc3NpemVfdCB3MV9zbWVtX3JlYWRfbmFtZShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICopOwotc3RhdGljIHNzaXplX3QgdzFfc21lbV9yZWFkX2JpbihzdHJ1Y3Qga29iamVjdCAqLCBjaGFyICosIGxvZmZfdCwgc2l6ZV90KTsKLQotc3RhdGljIHN0cnVjdCB3MV9mYW1pbHlfb3BzIHcxX3NtZW1fZm9wcyA9IHsKLQkucm5hbWUgPSAmdzFfc21lbV9yZWFkX25hbWUsCi0JLnJiaW4gPSAmdzFfc21lbV9yZWFkX2JpbiwKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IHcxX3NtZW1fcmVhZF9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX3NsYXZlLCBkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHNsLT5uYW1lKTsKLX0KLQotc3RhdGljIHNzaXplX3QgdzFfc21lbV9yZWFkX2JpbihzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHcxX3NsYXZlICpzbCA9IGNvbnRhaW5lcl9vZihjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiksCi0JCQkJCSAgIHN0cnVjdCB3MV9zbGF2ZSwgZGV2KTsKLQlpbnQgaTsKLQotCWF0b21pY19pbmMoJnNsLT5yZWZjbnQpOwotCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNsLT5tYXN0ZXItPm11dGV4KSkgewotCQljb3VudCA9IDA7Ci0JCWdvdG8gb3V0X2RlYzsKLQl9Ci0KLQlpZiAob2ZmID4gVzFfU0xBVkVfREFUQV9TSVpFKSB7Ci0JCWNvdW50ID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChvZmYgKyBjb3VudCA+IFcxX1NMQVZFX0RBVEFfU0laRSkgewotCQljb3VudCA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQotCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiJTAyeCAiLCAoKHU4ICopJnNsLT5yZWdfbnVtKVtpXSk7Ci0JY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIlxuIik7Ci0KLW91dDoKLQl1cCgmc2wtPm1hc3Rlci0+bXV0ZXgpOwotb3V0X2RlYzoKLQlhdG9taWNfZGVjKCZzbC0+cmVmY250KTsKLQotCXJldHVybiBjb3VudDsKLX0KLQogc3RhdGljIHN0cnVjdCB3MV9mYW1pbHkgdzFfc21lbV9mYW1pbHlfMDEgPSB7CiAJLmZpZCA9IFcxX0ZBTUlMWV9TTUVNXzAxLAotCS5mb3BzID0gJncxX3NtZW1fZm9wcywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdzFfZmFtaWx5IHcxX3NtZW1fZmFtaWx5XzgxID0gewogCS5maWQgPSBXMV9GQU1JTFlfU01FTV84MSwKLQkuZm9wcyA9ICZ3MV9zbWVtX2ZvcHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB3MV9zbWVtX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfdGhlcm0uYyBiL2RyaXZlcnMvdzEvdzFfdGhlcm0uYwppbmRleCAxNjU1MjZjLi40NTc3ZGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX3RoZXJtLmMKKysrIGIvZHJpdmVycy93MS93MV90aGVybS5jCkBAIC00MiwxMiArNDIsMzEgQEAKIAkJCQl7fQogCQkJfTsKIAotc3RhdGljIHNzaXplX3QgdzFfdGhlcm1fcmVhZF9uYW1lKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKik7CiBzdGF0aWMgc3NpemVfdCB3MV90aGVybV9yZWFkX2JpbihzdHJ1Y3Qga29iamVjdCAqLCBjaGFyICosIGxvZmZfdCwgc2l6ZV90KTsKIAorc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHcxX3RoZXJtX2Jpbl9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJ3MV9zbGF2ZSIsCisJCS5tb2RlID0gU19JUlVHTywKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkuc2l6ZSA9IFcxX1NMQVZFX0RBVEFfU0laRSwKKwkucmVhZCA9IHcxX3RoZXJtX3JlYWRfYmluLAorfTsKKworc3RhdGljIGludCB3MV90aGVybV9hZGRfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKK3sKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZ3MV90aGVybV9iaW5fYXR0cik7Cit9CisKK3N0YXRpYyB2b2lkIHcxX3RoZXJtX3JlbW92ZV9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQoreworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmc2wtPmRldi5rb2JqLCAmdzFfdGhlcm1fYmluX2F0dHIpOworfQorCiBzdGF0aWMgc3RydWN0IHcxX2ZhbWlseV9vcHMgdzFfdGhlcm1fZm9wcyA9IHsKLQkucm5hbWUgPSAmdzFfdGhlcm1fcmVhZF9uYW1lLAotCS5yYmluID0gJncxX3RoZXJtX3JlYWRfYmluLAorCS5hZGRfc2xhdmUJPSB3MV90aGVybV9hZGRfc2xhdmUsCisJLnJlbW92ZV9zbGF2ZQk9IHcxX3RoZXJtX3JlbW92ZV9zbGF2ZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdzFfZmFtaWx5IHcxX3RoZXJtX2ZhbWlseV9EUzE4UzIwID0gewpAQCAtNTksNiArNzgsNyBAQAogCS5maWQgPSBXMV9USEVSTV9EUzE4QjIwLAogCS5mb3BzID0gJncxX3RoZXJtX2ZvcHMsCiB9OworCiBzdGF0aWMgc3RydWN0IHcxX2ZhbWlseSB3MV90aGVybV9mYW1pbHlfRFMxODIyID0gewogCS5maWQgPSBXMV9USEVSTV9EUzE4MjIsCiAJLmZvcHMgPSAmdzFfdGhlcm1fZm9wcywKQEAgLTkwLDEzICsxMTAsNiBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3NpemVfdCB3MV90aGVybV9yZWFkX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdzFfc2xhdmUsIGRldik7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc2wtPm5hbWUpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCB3MV9EUzE4QjIwX2NvbnZlcnRfdGVtcCh1OCByb21bOV0pCiB7CiAJaW50IHQgPSAocm9tWzFdIDw8IDgpIHwgcm9tWzBdOwpAQCAtMTQ4LDggKzE2MSw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IHcxX3RoZXJtX3JlYWRfYmluKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0gY29udGFpbmVyX29mKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSwKLQkJCQkJICAgc3RydWN0IHcxX3NsYXZlLCBkZXYpOworCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBrb2JqX3RvX3cxX3NsYXZlKGtvYmopOwogCXN0cnVjdCB3MV9tYXN0ZXIgKmRldiA9IHNsLT5tYXN0ZXI7CiAJdTggcm9tWzldLCBjcmMsIHZlcmRpY3Q7CiAJaW50IGksIG1heF90cnlpbmcgPSAxMDsKQEAgLTE3OCwxNSArMTkwLDEwIEBACiAJY3JjID0gMDsKIAogCXdoaWxlIChtYXhfdHJ5aW5nLS0pIHsKLQkJaWYgKCF3MV9yZXNldF9idXMgKGRldikpIHsKKwkJaWYgKCF3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc2wpKSB7CiAJCQlpbnQgY291bnQgPSAwOwotCQkJdTggbWF0Y2hbOV0gPSB7VzFfTUFUQ0hfUk9NLCB9OwogCQkJdW5zaWduZWQgaW50IHRtID0gNzUwOwogCi0JCQltZW1jcHkoJm1hdGNoWzFdLCAodTY0ICopICYgc2wtPnJlZ19udW0sIDgpOwotCi0JCQl3MV93cml0ZV9ibG9jayhkZXYsIG1hdGNoLCA5KTsKLQogCQkJdzFfd3JpdGVfOChkZXYsIFcxX0NPTlZFUlRfVEVNUCk7CiAKIAkJCXdoaWxlICh0bSkgewpAQCAtMTk1LDggKzIwMiw3IEBACiAJCQkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAJCQl9CiAKLQkJCWlmICghdzFfcmVzZXRfYnVzIChkZXYpKSB7Ci0JCQkJdzFfd3JpdGVfYmxvY2soZGV2LCBtYXRjaCwgOSk7CisJCQlpZiAoIXcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpIHsKIAogCQkJCXcxX3dyaXRlXzgoZGV2LCBXMV9SRUFEX1NDUkFUQ0hQQUQpOwogCQkJCWlmICgoY291bnQgPSB3MV9yZWFkX2Jsb2NrKGRldiwgcm9tLCA5KSkgIT0gOSkgewpAQCAtMjA3LDcgKzIxMyw2IEBACiAKIAkJCQlpZiAocm9tWzhdID09IGNyYyAmJiByb21bMF0pCiAJCQkJCXZlcmRpY3QgPSAxOwotCiAJCQl9CiAJCX0KIApkaWZmIC0tZ2l0IGEvZnMvOXAvOXAuYyBiL2ZzLzlwLzlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0N2Y1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwLzlwLmMKQEAgLTAsMCArMSwzNTkgQEAKKy8qCisgKiAgbGludXgvZnMvOXAvOXAuYworICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIDlQMjAwMCBmdW5jdGlvbnMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIGJ5IFJvbiBNaW5uaWNoIDxybWlubmljaEBsYW5sLmdvdj4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInY5ZnMuaCIKKyNpbmNsdWRlICI5cC5oIgorI2luY2x1ZGUgIm11eC5oIgorCisvKioKKyAqIHY5ZnNfdF92ZXJzaW9uIC0gbmVnb3RpYXRlIHByb3RvY29sIHBhcmFtZXRlcnMgd2l0aCBzZXZlcgorICogQHY5c2VzOiA5UDIwMDAgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQG1zaXplOiByZXF1ZXN0ZWQgbWF4IHNpemUgcGFja2V0CisgKiBAdmVyc2lvbjogcmVxdWVzdGVkIHZlcnNpb24uZXh0ZW5zaW9uIHN0cmluZworICogQGZjYWxsOiBwb2ludGVyIHRvIHJlc3BvbnNlIGZjYWxsIHBvaW50ZXIKKyAqCisgKi8KKworaW50Cit2OWZzX3RfdmVyc2lvbihzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgbXNpemUsCisJICAgICAgIGNoYXIgKnZlcnNpb24sIHN0cnVjdCB2OWZzX2ZjYWxsICoqZmNhbGwpCit7CisJc3RydWN0IHY5ZnNfZmNhbGwgbXNnOworCisJZHByaW50ayhERUJVR185UCwgIm1zaXplOiAlZCB2ZXJzaW9uOiAlc1xuIiwgbXNpemUsIHZlcnNpb24pOworCW1zZy5pZCA9IFRWRVJTSU9OOworCW1zZy5wYXJhbXMudHZlcnNpb24ubXNpemUgPSBtc2l6ZTsKKwltc2cucGFyYW1zLnR2ZXJzaW9uLnZlcnNpb24gPSB2ZXJzaW9uOworCisJcmV0dXJuIHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgZmNhbGwpOworfQorCisvKioKKyAqIHY5ZnNfdF9hdHRhY2ggLSBtb3VudCB0aGUgc2VydmVyCisgKiBAdjlzZXM6IDlQMjAwMCBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAdW5hbWU6IHVzZXIgbmFtZSBkb2luZyB0aGUgYXR0YWNoCisgKiBAYW5hbWU6IHJlbW90ZSBuYW1lIGJlaW5nIGF0dGFjaGVkIHRvCisgKiBAZmlkOiBtb3VudCBmaWQgdG8gYXR0YXRjaCB0byByb290IG5vZGUKKyAqIEBhZmlkOiBhdXRoZW50aWNhdGlvbiBmaWQgKGluIHRoaXMgY2FzZSByZXN1bHQga2V5KQorICogQGZjYWxsOiBwb2ludGVyIHRvIHJlc3BvbnNlIGZjYWxsIHBvaW50ZXIKKyAqCisgKi8KKworaW50Cit2OWZzX3RfYXR0YWNoKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIGNoYXIgKnVuYW1lLCBjaGFyICphbmFtZSwKKwkgICAgICB1MzIgZmlkLCB1MzIgYWZpZCwgc3RydWN0IHY5ZnNfZmNhbGwgKipmY2FsbCkKK3sKKwlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisKKwlkcHJpbnRrKERFQlVHXzlQLCAidW5hbWUgJyVzJyBhbmFtZSAnJXMnIGZpZCAlZCBhZmlkICVkXG4iLCB1bmFtZSwKKwkJYW5hbWUsIGZpZCwgYWZpZCk7CisJbXNnLmlkID0gVEFUVEFDSDsKKwltc2cucGFyYW1zLnRhdHRhY2guZmlkID0gZmlkOworCW1zZy5wYXJhbXMudGF0dGFjaC5hZmlkID0gYWZpZDsKKwltc2cucGFyYW1zLnRhdHRhY2gudW5hbWUgPSB1bmFtZTsKKwltc2cucGFyYW1zLnRhdHRhY2guYW5hbWUgPSBhbmFtZTsKKworCXJldHVybiB2OWZzX211eF9ycGModjlzZXMsICZtc2csIGZjYWxsKTsKK30KKworLyoqCisgKiB2OWZzX3RfY2x1bmsgLSByZWxlYXNlIGEgZmlkIChmaW5pc2ggYSB0cmFuc2FjdGlvbikKKyAqIEB2OXNlczogOVAyMDAwIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBmaWQ6IGZpZCB0byByZWxlYXNlCisgKiBAZmNhbGw6IHBvaW50ZXIgdG8gcmVzcG9uc2UgZmNhbGwgcG9pbnRlcgorICoKKyAqLworCitpbnQKK3Y5ZnNfdF9jbHVuayhzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLAorCSAgICAgc3RydWN0IHY5ZnNfZmNhbGwgKipmY2FsbCkKK3sKKwlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisKKwlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkXG4iLCBmaWQpOworCW1zZy5pZCA9IFRDTFVOSzsKKwltc2cucGFyYW1zLnRjbHVuay5maWQgPSBmaWQ7CisKKwlyZXR1cm4gdjlmc19tdXhfcnBjKHY5c2VzLCAmbXNnLCBmY2FsbCk7Cit9CisKKy8qKgorICogdjlmc192OWZzX3RfZmx1c2ggLSBmbHVzaCBhIHBlbmRpbmcgdHJhbnNhY3Rpb24KKyAqIEB2OXNlczogOVAyMDAwIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEB0YWc6IHRpZCB0byByZWxlYXNlCisgKgorICovCisKK2ludCB2OWZzX3RfZmx1c2goc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTE2IHRhZykKK3sKKwlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisKKwlkcHJpbnRrKERFQlVHXzlQLCAib2xkdGFnICVkXG4iLCB0YWcpOworCW1zZy5pZCA9IFRGTFVTSDsKKwltc2cucGFyYW1zLnRmbHVzaC5vbGR0YWcgPSB0YWc7CisJcmV0dXJuIHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgTlVMTCk7Cit9CisKKy8qKgorICogdjlmc190X3N0YXQgLSByZWFkIGEgZmlsZSdzIG1ldGEtZGF0YQorICogQHY5c2VzOiA5UDIwMDAgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQGZpZDogZmlkIHBvaW50aW5nIHRvIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGdldCBpbmZvIGFib3V0CisgKiBAZmNhbGw6IHBvaW50ZXIgdG8gcmVzcG9uc2UgZmNhbGwKKyAqCisgKi8KKworaW50Cit2OWZzX3Rfc3RhdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQoreworCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKKworCWRwcmludGsoREVCVUdfOVAsICJmaWQgJWRcbiIsIGZpZCk7CisJaWYgKGZjYWxsKQorCQkqZmNhbGwgPSBOVUxMOworCisJbXNnLmlkID0gVFNUQVQ7CisJbXNnLnBhcmFtcy50c3RhdC5maWQgPSBmaWQ7CisJcmV0dXJuIHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgZmNhbGwpOworfQorCisvKioKKyAqIHY5ZnNfdF93c3RhdCAtIHdyaXRlIGEgZmlsZSdzIG1ldGEtZGF0YQorICogQHY5c2VzOiA5UDIwMDAgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQGZpZDogZmlkIHBvaW50aW5nIHRvIGZpbGUgb3IgZGlyZWN0b3J5IHRvIHdyaXRlIGluZm8gYWJvdXQKKyAqIEBzdGF0OiBtZXRhZGF0YQorICogQGZjYWxsOiBwb2ludGVyIHRvIHJlc3BvbnNlIGZjYWxsCisgKgorICovCisKK2ludAordjlmc190X3dzdGF0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsCisJICAgICBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQoreworCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKKworCWRwcmludGsoREVCVUdfOVAsICJmaWQgJWQgbGVuZ3RoICVkXG4iLCBmaWQsIChpbnQpc3RhdC0+bGVuZ3RoKTsKKwltc2cuaWQgPSBUV1NUQVQ7CisJbXNnLnBhcmFtcy50d3N0YXQuZmlkID0gZmlkOworCW1zZy5wYXJhbXMudHdzdGF0LnN0YXQgPSBzdGF0OworCisJcmV0dXJuIHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgZmNhbGwpOworfQorCisvKioKKyAqIHY5ZnNfdF93YWxrIC0gd2FsayBhIGZpZCB0byBhIG5ldyBmaWxlIG9yIGRpcmVjdG9yeQorICogQHY5c2VzOiA5UDIwMDAgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQGZpZDogZmlkIHRvIHdhbGsKKyAqIEBuZXdmaWQ6IG5ldyBmaWQgKGZvciBjbG9uZSBvcGVyYXRpb25zKQorICogQG5hbWU6IHBhdGggdG8gd2FsayBmaWQgdG8KKyAqIEBmY2FsbDogcG9pbnRlciB0byByZXNwb25zZSBmY2FsbAorICoKKyAqLworCisvKiBUT0RPOiBzdXBwb3J0IG11bHRpcGxlIHdhbGsgKi8KKworaW50Cit2OWZzX3Rfd2FsayhzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLCB1MzIgbmV3ZmlkLAorCSAgICBjaGFyICpuYW1lLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQoreworCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKKworCWRwcmludGsoREVCVUdfOVAsICJmaWQgJWQgbmV3ZmlkICVkIHduYW1lICclcydcbiIsIGZpZCwgbmV3ZmlkLCBuYW1lKTsKKwltc2cuaWQgPSBUV0FMSzsKKwltc2cucGFyYW1zLnR3YWxrLmZpZCA9IGZpZDsKKwltc2cucGFyYW1zLnR3YWxrLm5ld2ZpZCA9IG5ld2ZpZDsKKworCWlmIChuYW1lKSB7CisJCW1zZy5wYXJhbXMudHdhbGsubnduYW1lID0gMTsKKwkJbXNnLnBhcmFtcy50d2Fsay53bmFtZXMgPSAmbmFtZTsKKwl9IGVsc2UgeworCQltc2cucGFyYW1zLnR3YWxrLm53bmFtZSA9IDA7CisJfQorCisJcmV0dXJuIHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgZmNhbGwpOworfQorCisvKioKKyAqIHY5ZnNfdF9vcGVuIC0gb3BlbiBhIGZpbGUKKyAqCisgKiBAdjlzZXMgLSA5UDIwMDAgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQGZpZCAtIGZpZCB0byBvcGVuCisgKiBAbW9kZSAtIG1vZGUgdG8gb3BlbiBmaWxlIChSLCBSVywgZXRjKQorICogQGZjYWxsIC0gcG9pbnRlciB0byByZXNwb25zZSBmY2FsbAorICoKKyAqLworCitpbnQKK3Y5ZnNfdF9vcGVuKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsIHU4IG1vZGUsCisJICAgIHN0cnVjdCB2OWZzX2ZjYWxsICoqZmNhbGwpCit7CisJc3RydWN0IHY5ZnNfZmNhbGwgbXNnOworCWxvbmcgZXJyb3JubyA9IC0xOworCisJZHByaW50ayhERUJVR185UCwgImZpZCAlZCBtb2RlICVkXG4iLCBmaWQsIG1vZGUpOworCW1zZy5pZCA9IFRPUEVOOworCW1zZy5wYXJhbXMudG9wZW4uZmlkID0gZmlkOworCW1zZy5wYXJhbXMudG9wZW4ubW9kZSA9IG1vZGU7CisKKwllcnJvcm5vID0gdjlmc19tdXhfcnBjKHY5c2VzLCAmbXNnLCBmY2FsbCk7CisKKwlyZXR1cm4gZXJyb3JubzsKK30KKworLyoqCisgKiB2OWZzX3RfcmVtb3ZlIC0gcmVtb3ZlIGEgZmlsZSBvciBkaXJlY3RvcnkKKyAqIEB2OXNlczogOVAyMDAwIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBmaWQ6IGZpZCB0byByZW1vdmUKKyAqIEBmY2FsbDogcG9pbnRlciB0byByZXNwb25zZSBmY2FsbAorICoKKyAqLworCitpbnQKK3Y5ZnNfdF9yZW1vdmUoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwKKwkgICAgICBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQoreworCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKKworCWRwcmludGsoREVCVUdfOVAsICJmaWQgJWRcbiIsIGZpZCk7CisJbXNnLmlkID0gVFJFTU9WRTsKKwltc2cucGFyYW1zLnRyZW1vdmUuZmlkID0gZmlkOworCXJldHVybiB2OWZzX211eF9ycGModjlzZXMsICZtc2csIGZjYWxsKTsKK30KKworLyoqCisgKiB2OWZzX3RfY3JlYXRlIC0gY3JlYXRlIGEgZmlsZSBvciBkaXJlY3RvcnkKKyAqIEB2OXNlczogOVAyMDAwIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBmaWQ6IGZpZCB0byBjcmVhdGUKKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB0byBjcmVhdGUKKyAqIEBwZXJtOiBwZXJtaXNzaW9ucyB0byBjcmVhdGUgd2l0aAorICogQG1vZGU6IG1vZGUgdG8gb3BlbiBmaWxlIChSLCBSVywgZXRjKQorICogQGZjYWxsOiBwb2ludGVyIHRvIHJlc3BvbnNlIGZjYWxsCisgKgorICovCisKK2ludAordjlmc190X2NyZWF0ZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLCBjaGFyICpuYW1lLAorCSAgICAgIHUzMiBwZXJtLCB1OCBtb2RlLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQoreworCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKKworCWRwcmludGsoREVCVUdfOVAsICJmaWQgJWQgbmFtZSAnJXMnIHBlcm0gJXggbW9kZSAlZFxuIiwKKwkJZmlkLCBuYW1lLCBwZXJtLCBtb2RlKTsKKworCW1zZy5pZCA9IFRDUkVBVEU7CisJbXNnLnBhcmFtcy50Y3JlYXRlLmZpZCA9IGZpZDsKKwltc2cucGFyYW1zLnRjcmVhdGUubmFtZSA9IG5hbWU7CisJbXNnLnBhcmFtcy50Y3JlYXRlLnBlcm0gPSBwZXJtOworCW1zZy5wYXJhbXMudGNyZWF0ZS5tb2RlID0gbW9kZTsKKworCXJldHVybiB2OWZzX211eF9ycGModjlzZXMsICZtc2csIGZjYWxsKTsKK30KKworLyoqCisgKiB2OWZzX3RfcmVhZCAtIHJlYWQgZGF0YQorICogQHY5c2VzOiA5UDIwMDAgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQGZpZDogZmlkIHRvIHJlYWQgZnJvbQorICogQG9mZnNldDogb2Zmc2V0IHRvIHN0YXJ0IHJlYWQgYXQKKyAqIEBjb3VudDogaG93IG1hbnkgYnl0ZXMgdG8gcmVhZAorICogQGZjYWxsOiBwb2ludGVyIHRvIHJlc3BvbnNlIGZjYWxsICh3aXRoIGRhdGEpCisgKgorICovCisKK2ludAordjlmc190X3JlYWQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwgdTY0IG9mZnNldCwKKwkgICAgdTMyIGNvdW50LCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQoreworCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqcmMgPSBOVUxMOworCWxvbmcgZXJyb3JubyA9IC0xOworCisJZHByaW50ayhERUJVR185UCwgImZpZCAlZCBvZmZzZXQgMHglbHggY291bnQgMHgleFxuIiwgZmlkLAorCQkobG9uZyB1bnNpZ25lZCBpbnQpb2Zmc2V0LCBjb3VudCk7CisJbXNnLmlkID0gVFJFQUQ7CisJbXNnLnBhcmFtcy50cmVhZC5maWQgPSBmaWQ7CisJbXNnLnBhcmFtcy50cmVhZC5vZmZzZXQgPSBvZmZzZXQ7CisJbXNnLnBhcmFtcy50cmVhZC5jb3VudCA9IGNvdW50OworCWVycm9ybm8gPSB2OWZzX211eF9ycGModjlzZXMsICZtc2csICZyYyk7CisKKwlpZiAoIWVycm9ybm8pIHsKKwkJZXJyb3JubyA9IHJjLT5wYXJhbXMucnJlYWQuY291bnQ7CisJCWR1bXBfZGF0YShyYy0+cGFyYW1zLnJyZWFkLmRhdGEsIHJjLT5wYXJhbXMucnJlYWQuY291bnQpOworCX0KKworCWlmIChmY2FsbCkKKwkJKmZjYWxsID0gcmM7CisJZWxzZQorCQlrZnJlZShyYyk7CisKKwlyZXR1cm4gZXJyb3JubzsKK30KKworLyoqCisgKiB2OWZzX3Rfd3JpdGUgLSB3cml0ZSBkYXRhCisgKiBAdjlzZXM6IDlQMjAwMCBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAZmlkOiBmaWQgdG8gd3JpdGUgdG8KKyAqIEBvZmZzZXQ6IG9mZnNldCB0byBzdGFydCB3cml0ZSBhdAorICogQGNvdW50OiBob3cgbWFueSBieXRlcyB0byB3cml0ZQorICogQGZjYWxsOiBwb2ludGVyIHRvIHJlc3BvbnNlIGZjYWxsCisgKgorICovCisKK2ludAordjlmc190X3dyaXRlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsCisJICAgICB1NjQgb2Zmc2V0LCB1MzIgY291bnQsIHZvaWQgKmRhdGEsIHN0cnVjdCB2OWZzX2ZjYWxsICoqZmNhbGwpCit7CisJc3RydWN0IHY5ZnNfZmNhbGwgbXNnOworCXN0cnVjdCB2OWZzX2ZjYWxsICpyYyA9IE5VTEw7CisJbG9uZyBlcnJvcm5vID0gLTE7CisKKwlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkIG9mZnNldCAweCVsbHggY291bnQgMHgleFxuIiwgZmlkLAorCQkodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCwgY291bnQpOworCWR1bXBfZGF0YShkYXRhLCBjb3VudCk7CisKKwltc2cuaWQgPSBUV1JJVEU7CisJbXNnLnBhcmFtcy50d3JpdGUuZmlkID0gZmlkOworCW1zZy5wYXJhbXMudHdyaXRlLm9mZnNldCA9IG9mZnNldDsKKwltc2cucGFyYW1zLnR3cml0ZS5jb3VudCA9IGNvdW50OworCW1zZy5wYXJhbXMudHdyaXRlLmRhdGEgPSBkYXRhOworCisJZXJyb3JubyA9IHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgJnJjKTsKKworCWlmICghZXJyb3JubykKKwkJZXJyb3JubyA9IHJjLT5wYXJhbXMucndyaXRlLmNvdW50OworCisJaWYgKGZjYWxsKQorCQkqZmNhbGwgPSByYzsKKwllbHNlCisJCWtmcmVlKHJjKTsKKworCXJldHVybiBlcnJvcm5vOworfQpkaWZmIC0tZ2l0IGEvZnMvOXAvOXAuaCBiL2ZzLzlwLzlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1NDI0MgotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwLzlwLmgKQEAgLTAsMCArMSwzNDEgQEAKKy8qCisgKiBsaW51eC9mcy85cC85cC5oCisgKgorICogOVAgcHJvdG9jb2wgZGVmaW5pdGlvbnMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisvKiBNZXNzYWdlIFR5cGVzICovCitlbnVtIHsKKwlUVkVSU0lPTiA9IDEwMCwKKwlSVkVSU0lPTiwKKwlUQVVUSCA9IDEwMiwKKwlSQVVUSCwKKwlUQVRUQUNIID0gMTA0LAorCVJBVFRBQ0gsCisJVEVSUk9SID0gMTA2LAorCVJFUlJPUiwKKwlURkxVU0ggPSAxMDgsCisJUkZMVVNILAorCVRXQUxLID0gMTEwLAorCVJXQUxLLAorCVRPUEVOID0gMTEyLAorCVJPUEVOLAorCVRDUkVBVEUgPSAxMTQsCisJUkNSRUFURSwKKwlUUkVBRCA9IDExNiwKKwlSUkVBRCwKKwlUV1JJVEUgPSAxMTgsCisJUldSSVRFLAorCVRDTFVOSyA9IDEyMCwKKwlSQ0xVTkssCisJVFJFTU9WRSA9IDEyMiwKKwlSUkVNT1ZFLAorCVRTVEFUID0gMTI0LAorCVJTVEFULAorCVRXU1RBVCA9IDEyNiwKKwlSV1NUQVQsCit9OworCisvKiBtb2RlcyAqLworZW51bSB7CisJVjlGU19PUkVBRCA9IDB4MDAsCisJVjlGU19PV1JJVEUgPSAweDAxLAorCVY5RlNfT1JEV1IgPSAweDAyLAorCVY5RlNfT0VYRUMgPSAweDAzLAorCVY5RlNfT0VYQ0wgPSAweDA0LAorCVY5RlNfT1RSVU5DID0gMHgxMCwKKwlWOUZTX09SRVhFQyA9IDB4MjAsCisJVjlGU19PUkNMT1NFID0gMHg0MCwKKwlWOUZTX09BUFBFTkQgPSAweDgwLAorfTsKKworLyogcGVybWlzc2lvbnMgKi8KK2VudW0geworCVY5RlNfRE1ESVIgPSAweDgwMDAwMDAwLAorCVY5RlNfRE1BUFBFTkQgPSAweDQwMDAwMDAwLAorCVY5RlNfRE1FWENMID0gMHgyMDAwMDAwMCwKKwlWOUZTX0RNTU9VTlQgPSAweDEwMDAwMDAwLAorCVY5RlNfRE1BVVRIID0gMHgwODAwMDAwMCwKKwlWOUZTX0RNVE1QID0gMHgwNDAwMDAwMCwKKwlWOUZTX0RNU1lNTElOSyA9IDB4MDIwMDAwMDAsCisJVjlGU19ETUxJTksgPSAweDAxMDAwMDAwLAorCS8qIDlQMjAwMC51IGV4dGVuc2lvbnMgKi8KKwlWOUZTX0RNREVWSUNFID0gMHgwMDgwMDAwMCwKKwlWOUZTX0RNTkFNRURQSVBFID0gMHgwMDIwMDAwMCwKKwlWOUZTX0RNU09DS0VUID0gMHgwMDEwMDAwMCwKKwlWOUZTX0RNU0VUVUlEID0gMHgwMDA4MDAwMCwKKwlWOUZTX0RNU0VUR0lEID0gMHgwMDA0MDAwMCwKK307CisKKy8qIHFpZC50eXBlcyAqLworZW51bSB7CisJVjlGU19RVERJUiA9IDB4ODAsCisJVjlGU19RVEFQUEVORCA9IDB4NDAsCisJVjlGU19RVEVYQ0wgPSAweDIwLAorCVY5RlNfUVRNT1VOVCA9IDB4MTAsCisJVjlGU19RVEFVVEggPSAweDA4LAorCVY5RlNfUVRUTVAgPSAweDA0LAorCVY5RlNfUVRTWU1MSU5LID0gMHgwMiwKKwlWOUZTX1FUTElOSyA9IDB4MDEsCisJVjlGU19RVEZJTEUgPSAweDAwLAorfTsKKworLyogYW1wbGUgcm9vbSBmb3IgVHdyaXRlL1JyZWFkIGhlYWRlciAoaW91bml0KSAqLworI2RlZmluZSBWOUZTX0lPSERSU1oJMjQKKworLyogcWlkcyBhcmUgdGhlIHVuaXF1ZSBJRCBmb3IgYSBmaWxlIChsaWtlIGFuIGlub2RlICovCitzdHJ1Y3Qgdjlmc19xaWQgeworCXU4IHR5cGU7CisJdTMyIHZlcnNpb247CisJdTY0IHBhdGg7Cit9OworCisvKiBQbGFuIDkgZmlsZSBtZXRhZGF0YSAoc3RhdCkgc3RydWN0dXJlICovCitzdHJ1Y3Qgdjlmc19zdGF0IHsKKwl1MTYgc2l6ZTsKKwl1MTYgdHlwZTsKKwl1MzIgZGV2OworCXN0cnVjdCB2OWZzX3FpZCBxaWQ7CisJdTMyIG1vZGU7CisJdTMyIGF0aW1lOworCXUzMiBtdGltZTsKKwl1NjQgbGVuZ3RoOworCWNoYXIgKm5hbWU7CisJY2hhciAqdWlkOworCWNoYXIgKmdpZDsKKwljaGFyICptdWlkOworCWNoYXIgKmV4dGVuc2lvbjsJLyogOXAyMDAwLnUgZXh0ZW5zaW9ucyAqLworCXUzMiBuX3VpZDsJCS8qIDlwMjAwMC51IGV4dGVuc2lvbnMgKi8KKwl1MzIgbl9naWQ7CQkvKiA5cDIwMDAudSBleHRlbnNpb25zICovCisJdTMyIG5fbXVpZDsJCS8qIDlwMjAwMC51IGV4dGVuc2lvbnMgKi8KKwljaGFyIGRhdGFbMF07Cit9OworCisvKiBTdHJ1Y3R1cmVzIGZvciBQcm90b2NvbCBPcGVyYXRpb25zICovCisKK3N0cnVjdCBUdmVyc2lvbiB7CisJdTMyIG1zaXplOworCWNoYXIgKnZlcnNpb247Cit9OworCitzdHJ1Y3QgUnZlcnNpb24geworCXUzMiBtc2l6ZTsKKwljaGFyICp2ZXJzaW9uOworfTsKKworc3RydWN0IFRhdXRoIHsKKwl1MzIgYWZpZDsKKwljaGFyICp1bmFtZTsKKwljaGFyICphbmFtZTsKK307CisKK3N0cnVjdCBSYXV0aCB7CisJc3RydWN0IHY5ZnNfcWlkIHFpZDsKK307CisKK3N0cnVjdCBSZXJyb3IgeworCWNoYXIgKmVycm9yOworCXUzMiBlcnJubzsJCS8qIDlwMjAwMC51IGV4dGVuc2lvbiAqLworfTsKKworc3RydWN0IFRmbHVzaCB7CisJdTMyIG9sZHRhZzsKK307CisKK3N0cnVjdCBSZmx1c2ggeworfTsKKworc3RydWN0IFRhdHRhY2ggeworCXUzMiBmaWQ7CisJdTMyIGFmaWQ7CisJY2hhciAqdW5hbWU7CisJY2hhciAqYW5hbWU7Cit9OworCitzdHJ1Y3QgUmF0dGFjaCB7CisJc3RydWN0IHY5ZnNfcWlkIHFpZDsKK307CisKK3N0cnVjdCBUd2FsayB7CisJdTMyIGZpZDsKKwl1MzIgbmV3ZmlkOworCXUzMiBud25hbWU7CisJY2hhciAqKnduYW1lczsKK307CisKK3N0cnVjdCBSd2FsayB7CisJdTMyIG53cWlkOworCXN0cnVjdCB2OWZzX3FpZCAqd3FpZHM7Cit9OworCitzdHJ1Y3QgVG9wZW4geworCXUzMiBmaWQ7CisJdTggbW9kZTsKK307CisKK3N0cnVjdCBSb3BlbiB7CisJc3RydWN0IHY5ZnNfcWlkIHFpZDsKKwl1MzIgaW91bml0OworfTsKKworc3RydWN0IFRjcmVhdGUgeworCXUzMiBmaWQ7CisJY2hhciAqbmFtZTsKKwl1MzIgcGVybTsKKwl1OCBtb2RlOworfTsKKworc3RydWN0IFJjcmVhdGUgeworCXN0cnVjdCB2OWZzX3FpZCBxaWQ7CisJdTMyIGlvdW5pdDsKK307CisKK3N0cnVjdCBUcmVhZCB7CisJdTMyIGZpZDsKKwl1NjQgb2Zmc2V0OworCXUzMiBjb3VudDsKK307CisKK3N0cnVjdCBScmVhZCB7CisJdTMyIGNvdW50OworCXU4ICpkYXRhOworfTsKKworc3RydWN0IFR3cml0ZSB7CisJdTMyIGZpZDsKKwl1NjQgb2Zmc2V0OworCXUzMiBjb3VudDsKKwl1OCAqZGF0YTsKK307CisKK3N0cnVjdCBSd3JpdGUgeworCXUzMiBjb3VudDsKK307CisKK3N0cnVjdCBUY2x1bmsgeworCXUzMiBmaWQ7Cit9OworCitzdHJ1Y3QgUmNsdW5rIHsKK307CisKK3N0cnVjdCBUcmVtb3ZlIHsKKwl1MzIgZmlkOworfTsKKworc3RydWN0IFJyZW1vdmUgeworfTsKKworc3RydWN0IFRzdGF0IHsKKwl1MzIgZmlkOworfTsKKworc3RydWN0IFJzdGF0IHsKKwlzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0OworfTsKKworc3RydWN0IFR3c3RhdCB7CisJdTMyIGZpZDsKKwlzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0OworfTsKKworc3RydWN0IFJ3c3RhdCB7Cit9OworCisvKgorICAqIGZjYWxsIGlzIHRoZSBwcmltYXJ5IHBhY2tldCBzdHJ1Y3R1cmUKKyAgKgorICAqLworCitzdHJ1Y3Qgdjlmc19mY2FsbCB7CisJdTMyIHNpemU7CisJdTggaWQ7CisJdTE2IHRhZzsKKworCXVuaW9uIHsKKwkJc3RydWN0IFR2ZXJzaW9uIHR2ZXJzaW9uOworCQlzdHJ1Y3QgUnZlcnNpb24gcnZlcnNpb247CisJCXN0cnVjdCBUYXV0aCB0YXV0aDsKKwkJc3RydWN0IFJhdXRoIHJhdXRoOworCQlzdHJ1Y3QgUmVycm9yIHJlcnJvcjsKKwkJc3RydWN0IFRmbHVzaCB0Zmx1c2g7CisJCXN0cnVjdCBSZmx1c2ggcmZsdXNoOworCQlzdHJ1Y3QgVGF0dGFjaCB0YXR0YWNoOworCQlzdHJ1Y3QgUmF0dGFjaCByYXR0YWNoOworCQlzdHJ1Y3QgVHdhbGsgdHdhbGs7CisJCXN0cnVjdCBSd2FsayByd2FsazsKKwkJc3RydWN0IFRvcGVuIHRvcGVuOworCQlzdHJ1Y3QgUm9wZW4gcm9wZW47CisJCXN0cnVjdCBUY3JlYXRlIHRjcmVhdGU7CisJCXN0cnVjdCBSY3JlYXRlIHJjcmVhdGU7CisJCXN0cnVjdCBUcmVhZCB0cmVhZDsKKwkJc3RydWN0IFJyZWFkIHJyZWFkOworCQlzdHJ1Y3QgVHdyaXRlIHR3cml0ZTsKKwkJc3RydWN0IFJ3cml0ZSByd3JpdGU7CisJCXN0cnVjdCBUY2x1bmsgdGNsdW5rOworCQlzdHJ1Y3QgUmNsdW5rIHJjbHVuazsKKwkJc3RydWN0IFRyZW1vdmUgdHJlbW92ZTsKKwkJc3RydWN0IFJyZW1vdmUgcnJlbW92ZTsKKwkJc3RydWN0IFRzdGF0IHRzdGF0OworCQlzdHJ1Y3QgUnN0YXQgcnN0YXQ7CisJCXN0cnVjdCBUd3N0YXQgdHdzdGF0OworCQlzdHJ1Y3QgUndzdGF0IHJ3c3RhdDsKKwl9IHBhcmFtczsKK307CisKKyNkZWZpbmUgRkNBTExfRVJST1IoZmNhbGwpIChmY2FsbCA/IGZjYWxsLT5wYXJhbXMucmVycm9yLmVycm9yIDogIiIpCisKK2ludCB2OWZzX3RfdmVyc2lvbihzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgbXNpemUsCisJCSAgIGNoYXIgKnZlcnNpb24sIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNhbGwpOworCitpbnQgdjlmc190X2F0dGFjaChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBjaGFyICp1bmFtZSwgY2hhciAqYW5hbWUsCisJCSAgdTMyIGZpZCwgdTMyIGFmaWQsIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNhbGwpOworCitpbnQgdjlmc190X2NsdW5rKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsCisJCSBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKKworaW50IHY5ZnNfdF9mbHVzaChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MTYgb2xkdGFnKTsKKworaW50IHY5ZnNfdF9zdGF0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsCisJCXN0cnVjdCB2OWZzX2ZjYWxsICoqcmNhbGwpOworCitpbnQgdjlmc190X3dzdGF0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsCisJCSBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKKworaW50IHY5ZnNfdF93YWxrKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsIHUzMiBuZXdmaWQsCisJCWNoYXIgKm5hbWUsIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNhbGwpOworCitpbnQgdjlmc190X29wZW4oc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwgdTggbW9kZSwKKwkJc3RydWN0IHY5ZnNfZmNhbGwgKipyY2FsbCk7CisKK2ludCB2OWZzX3RfcmVtb3ZlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsCisJCSAgc3RydWN0IHY5ZnNfZmNhbGwgKipyY2FsbCk7CisKK2ludCB2OWZzX3RfY3JlYXRlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsIGNoYXIgKm5hbWUsCisJCSAgdTMyIHBlcm0sIHU4IG1vZGUsIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNhbGwpOworCitpbnQgdjlmc190X3JlYWQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwKKwkJdTY0IG9mZnNldCwgdTMyIGNvdW50LCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKKworaW50IHY5ZnNfdF93cml0ZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLCB1NjQgb2Zmc2V0LAorCQkgdTMyIGNvdW50LCB2b2lkICpkYXRhLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL01ha2VmaWxlIGIvZnMvOXAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlNGZmZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKK29iai0kKENPTkZJR185UF9GUykgOj0gOXAyMDAwLm8KKworOXAyMDAwLW9ianMgOj0gXAorCXZmc19zdXBlci5vIFwKKwl2ZnNfaW5vZGUubyBcCisJdmZzX2ZpbGUubyBcCisJdmZzX2Rpci5vIFwKKwl2ZnNfZGVudHJ5Lm8gXAorCWVycm9yLm8gXAorCW11eC5vIFwKKwl0cmFuc19mZC5vIFwKKwl0cmFuc19zb2NrLm8gXAorCTlwLm8gXAorCWNvbnYubyBcCisJdjlmcy5vIFwKKwlmaWQubworCmRpZmYgLS1naXQgYS9mcy85cC9jb252LmMgYi9mcy85cC9jb252LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1NDczMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL2NvbnYuYwpAQCAtMCwwICsxLDY5MyBAQAorLyoKKyAqIGxpbnV4L2ZzLzlwL2NvbnYuYworICoKKyAqIDlQIHByb3RvY29sIGNvbnZlcnNpb24gZnVuY3Rpb25zCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAiOXAuaCIKKyNpbmNsdWRlICJjb252LmgiCisKKy8qCisgKiBCdWZmZXIgdG8gaGVscCB3aXRoIHN0cmluZyBwYXJzaW5nCisgKi8KK3N0cnVjdCBjYnVmIHsKKwl1bnNpZ25lZCBjaGFyICpzcDsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgKmVwOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGJ1Zl9pbml0KHN0cnVjdCBjYnVmICpidWYsIHZvaWQgKmRhdGEsIGludCBkYXRhbGVuKQoreworCWJ1Zi0+c3AgPSBidWYtPnAgPSBkYXRhOworCWJ1Zi0+ZXAgPSBkYXRhICsgZGF0YWxlbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgYnVmX2NoZWNrX292ZXJmbG93KHN0cnVjdCBjYnVmICpidWYpCit7CisJcmV0dXJuIGJ1Zi0+cCA+IGJ1Zi0+ZXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWZfY2hlY2tfc2l6ZShzdHJ1Y3QgY2J1ZiAqYnVmLCBpbnQgbGVuKQoreworCWlmIChidWYtPnArbGVuID4gYnVmLT5lcCkgeworCQlpZiAoYnVmLT5wIDwgYnVmLT5lcCkgeworCQkJZXByaW50ayhLRVJOX0VSUiwgImJ1ZmZlciBvdmVyZmxvd1xuIik7CisJCQlidWYtPnAgPSBidWYtPmVwICsgMTsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkICpidWZfYWxsb2Moc3RydWN0IGNidWYgKmJ1ZiwgaW50IGxlbikKK3sKKwl2b2lkICpyZXQgPSBOVUxMOworCisJYnVmX2NoZWNrX3NpemUoYnVmLCBsZW4pOworCXJldCA9IGJ1Zi0+cDsKKwlidWYtPnAgKz0gbGVuOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ1Zl9wdXRfaW50OChzdHJ1Y3QgY2J1ZiAqYnVmLCB1OCB2YWwpCit7CisJYnVmX2NoZWNrX3NpemUoYnVmLCAxKTsKKworCWJ1Zi0+cFswXSA9IHZhbDsKKwlidWYtPnArKzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ1Zl9wdXRfaW50MTYoc3RydWN0IGNidWYgKmJ1ZiwgdTE2IHZhbCkKK3sKKwlidWZfY2hlY2tfc2l6ZShidWYsIDIpOworCisJKihfX2xlMTYgKikgYnVmLT5wID0gY3B1X3RvX2xlMTYodmFsKTsKKwlidWYtPnAgKz0gMjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ1Zl9wdXRfaW50MzIoc3RydWN0IGNidWYgKmJ1ZiwgdTMyIHZhbCkKK3sKKwlidWZfY2hlY2tfc2l6ZShidWYsIDQpOworCisJKihfX2xlMzIgKilidWYtPnAgPSBjcHVfdG9fbGUzMih2YWwpOworCWJ1Zi0+cCArPSA0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnVmX3B1dF9pbnQ2NChzdHJ1Y3QgY2J1ZiAqYnVmLCB1NjQgdmFsKQoreworCWJ1Zl9jaGVja19zaXplKGJ1ZiwgOCk7CisKKwkqKF9fbGU2NCAqKWJ1Zi0+cCA9IGNwdV90b19sZTY0KHZhbCk7CisJYnVmLT5wICs9IDg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWZfcHV0X3N0cmluZ24oc3RydWN0IGNidWYgKmJ1ZiwgY29uc3QgY2hhciAqcywgdTE2IHNsZW4pCit7CisJYnVmX2NoZWNrX3NpemUoYnVmLCBzbGVuICsgMik7CisKKwlidWZfcHV0X2ludDE2KGJ1Ziwgc2xlbik7CisJbWVtY3B5KGJ1Zi0+cCwgcywgc2xlbik7CisJYnVmLT5wICs9IHNsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWZfcHV0X3N0cmluZyhzdHJ1Y3QgY2J1ZiAqYnVmLCBjb25zdCBjaGFyICpzKQoreworCWJ1Zl9wdXRfc3RyaW5nbihidWYsIHMsIHN0cmxlbihzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWZfcHV0X2RhdGEoc3RydWN0IGNidWYgKmJ1Ziwgdm9pZCAqZGF0YSwgdTMyIGRhdGFsZW4pCit7CisJYnVmX2NoZWNrX3NpemUoYnVmLCBkYXRhbGVuKTsKKworCW1lbWNweShidWYtPnAsIGRhdGEsIGRhdGFsZW4pOworCWJ1Zi0+cCArPSBkYXRhbGVuOworfQorCitzdGF0aWMgaW5saW5lIHU4IGJ1Zl9nZXRfaW50OChzdHJ1Y3QgY2J1ZiAqYnVmKQoreworCXU4IHJldCA9IDA7CisKKwlidWZfY2hlY2tfc2l6ZShidWYsIDEpOworCXJldCA9IGJ1Zi0+cFswXTsKKworCWJ1Zi0+cCsrOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB1MTYgYnVmX2dldF9pbnQxNihzdHJ1Y3QgY2J1ZiAqYnVmKQoreworCXUxNiByZXQgPSAwOworCisJYnVmX2NoZWNrX3NpemUoYnVmLCAyKTsKKwlyZXQgPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKWJ1Zi0+cCk7CisKKwlidWYtPnAgKz0gMjsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGJ1Zl9nZXRfaW50MzIoc3RydWN0IGNidWYgKmJ1ZikKK3sKKwl1MzIgcmV0ID0gMDsKKworCWJ1Zl9jaGVja19zaXplKGJ1ZiwgNCk7CisJcmV0ID0gbGUzMl90b19jcHUoKihfX2xlMzIgKilidWYtPnApOworCisJYnVmLT5wICs9IDQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHU2NCBidWZfZ2V0X2ludDY0KHN0cnVjdCBjYnVmICpidWYpCit7CisJdTY0IHJldCA9IDA7CisKKwlidWZfY2hlY2tfc2l6ZShidWYsIDgpOworCXJldCA9IGxlNjRfdG9fY3B1KCooX19sZTY0ICopYnVmLT5wKTsKKworCWJ1Zi0+cCArPSA4OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2J1Zl9nZXRfc3RyaW5nKHN0cnVjdCBjYnVmICpidWYsIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCisJdTE2IGxlbiA9IGJ1Zl9nZXRfaW50MTYoYnVmKTsKKwlidWZfY2hlY2tfc2l6ZShidWYsIGxlbik7CisJaWYgKGxlbiArIDEgPiBkYXRhbGVuKQorCQlyZXR1cm4gMDsKKworCW1lbWNweShkYXRhLCBidWYtPnAsIGxlbik7CisJZGF0YVtsZW5dID0gMDsKKwlidWYtPnAgKz0gbGVuOworCisJcmV0dXJuIGxlbiArIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqYnVmX2dldF9zdHJpbmdiKHN0cnVjdCBjYnVmICpidWYsIHN0cnVjdCBjYnVmICpzYnVmKQoreworCWNoYXIgKnJldCA9IE5VTEw7CisJaW50IG4gPSBidWZfZ2V0X3N0cmluZyhidWYsIHNidWYtPnAsIHNidWYtPmVwIC0gc2J1Zi0+cCk7CisKKwlpZiAobiA+IDApIHsKKwkJcmV0ID0gc2J1Zi0+cDsKKwkJc2J1Zi0+cCArPSBuOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJ1Zl9nZXRfZGF0YShzdHJ1Y3QgY2J1ZiAqYnVmLCB2b2lkICpkYXRhLCBpbnQgZGF0YWxlbikKK3sKKwlidWZfY2hlY2tfc2l6ZShidWYsIGRhdGFsZW4pOworCisJbWVtY3B5KGRhdGEsIGJ1Zi0+cCwgZGF0YWxlbik7CisJYnVmLT5wICs9IGRhdGFsZW47CisKKwlyZXR1cm4gZGF0YWxlbjsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpidWZfZ2V0X2RhdGFiKHN0cnVjdCBjYnVmICpidWYsIHN0cnVjdCBjYnVmICpkYnVmLAorCQkJCSAgaW50IGRhdGFsZW4pCit7CisJY2hhciAqcmV0ID0gTlVMTDsKKwlpbnQgbiA9IDA7CisKKwlidWZfY2hlY2tfc2l6ZShkYnVmLCBkYXRhbGVuKTsKKworCW4gPSBidWZfZ2V0X2RhdGEoYnVmLCBkYnVmLT5wLCBkYXRhbGVuKTsKKworCWlmIChuID4gMCkgeworCQlyZXQgPSBkYnVmLT5wOworCQlkYnVmLT5wICs9IG47CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB2OWZzX3NpemVfc3RhdCAtIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBhIHZhcmlhYmxlIGxlbmd0aCBzdGF0IHN0cnVjdAorICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAc3RhdDogbWV0YWRhdGEgKHN0YXQpIHN0cnVjdHVyZQorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfc2l6ZV9zdGF0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsCisJCQkgIHN0cnVjdCB2OWZzX3N0YXQgKnN0YXQpCit7CisJaW50IHNpemUgPSAwOworCisJaWYgKHN0YXQgPT0gTlVMTCkgeworCQllcHJpbnRrKEtFUk5fRVJSLCAidjlmc19zaXplX3N0YXQ6IGdvdCBhIE5VTEwgc3RhdCBwb2ludGVyXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2l6ZSA9CQkJLyogMiArICovLyogc2l6ZVsyXSAqLworCSAgICAyICsJCQkvKiB0eXBlWzJdICovCisJICAgIDQgKwkJCS8qIGRldls0XSAqLworCSAgICAxICsJCQkvKiBxaWQudHlwZVsxXSAqLworCSAgICA0ICsJCQkvKiBxaWQudmVyc1s0XSAqLworCSAgICA4ICsJCQkvKiBxaWQucGF0aFs4XSAqLworCSAgICA0ICsJCQkvKiBtb2RlWzRdICovCisJICAgIDQgKwkJCS8qIGF0aW1lWzRdICovCisJICAgIDQgKwkJCS8qIG10aW1lWzRdICovCisJICAgIDggKwkJCS8qIGxlbmd0aFs4XSAqLworCSAgICA4OwkJCS8qIG1pbmltdW0gc3VtIG9mIHN0cmluZyBsZW5ndGhzICovCisKKwlpZiAoc3RhdC0+bmFtZSkKKwkJc2l6ZSArPSBzdHJsZW4oc3RhdC0+bmFtZSk7CisJaWYgKHN0YXQtPnVpZCkKKwkJc2l6ZSArPSBzdHJsZW4oc3RhdC0+dWlkKTsKKwlpZiAoc3RhdC0+Z2lkKQorCQlzaXplICs9IHN0cmxlbihzdGF0LT5naWQpOworCWlmIChzdGF0LT5tdWlkKQorCQlzaXplICs9IHN0cmxlbihzdGF0LT5tdWlkKTsKKworCWlmICh2OXNlcy0+ZXh0ZW5kZWQpIHsKKwkJc2l6ZSArPSA0ICsJLyogbl91aWRbNF0gKi8KKwkJICAgIDQgKwkJLyogbl9naWRbNF0gKi8KKwkJICAgIDQgKwkJLyogbl9tdWlkWzRdICovCisJCSAgICAyOwkJLyogc3RyaW5nIGxlbmd0aCBvZiBleHRlbnNpb25bNF0gKi8KKwkJaWYgKHN0YXQtPmV4dGVuc2lvbikKKwkJCXNpemUgKz0gc3RybGVuKHN0YXQtPmV4dGVuc2lvbik7CisJfQorCisJcmV0dXJuIHNpemU7Cit9CisKKy8qKgorICogc2VyaWFsaXplX3N0YXQgLSBzYWZlbHkgZm9ybWF0IGEgc3RhdCBzdHJ1Y3R1cmUgZm9yIHRyYW5zbWlzc2lvbgorICogQHY5c2VzOiBzZXNzaW9uIGluZm8KKyAqIEBzdGF0OiBtZXRhZGF0YSAoc3RhdCkgc3RydWN0dXJlCisgKiBAYnVmcDogYnVmZmVyIHRvIHNlcmlhbGl6ZSBzdHJ1Y3R1cmUgaW50bworICoKKyAqLworCitzdGF0aWMgaW50CitzZXJpYWxpemVfc3RhdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LAorCSAgICAgICBzdHJ1Y3QgY2J1ZiAqYnVmcCkKK3sKKwlidWZfcHV0X2ludDE2KGJ1ZnAsIHN0YXQtPnNpemUpOworCWJ1Zl9wdXRfaW50MTYoYnVmcCwgc3RhdC0+dHlwZSk7CisJYnVmX3B1dF9pbnQzMihidWZwLCBzdGF0LT5kZXYpOworCWJ1Zl9wdXRfaW50OChidWZwLCBzdGF0LT5xaWQudHlwZSk7CisJYnVmX3B1dF9pbnQzMihidWZwLCBzdGF0LT5xaWQudmVyc2lvbik7CisJYnVmX3B1dF9pbnQ2NChidWZwLCBzdGF0LT5xaWQucGF0aCk7CisJYnVmX3B1dF9pbnQzMihidWZwLCBzdGF0LT5tb2RlKTsKKwlidWZfcHV0X2ludDMyKGJ1ZnAsIHN0YXQtPmF0aW1lKTsKKwlidWZfcHV0X2ludDMyKGJ1ZnAsIHN0YXQtPm10aW1lKTsKKwlidWZfcHV0X2ludDY0KGJ1ZnAsIHN0YXQtPmxlbmd0aCk7CisKKwlidWZfcHV0X3N0cmluZyhidWZwLCBzdGF0LT5uYW1lKTsKKwlidWZfcHV0X3N0cmluZyhidWZwLCBzdGF0LT51aWQpOworCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIHN0YXQtPmdpZCk7CisJYnVmX3B1dF9zdHJpbmcoYnVmcCwgc3RhdC0+bXVpZCk7CisKKwlpZiAodjlzZXMtPmV4dGVuZGVkKSB7CisJCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIHN0YXQtPmV4dGVuc2lvbik7CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgc3RhdC0+bl91aWQpOworCQlidWZfcHV0X2ludDMyKGJ1ZnAsIHN0YXQtPm5fZ2lkKTsKKwkJYnVmX3B1dF9pbnQzMihidWZwLCBzdGF0LT5uX211aWQpOworCX0KKworCWlmIChidWZfY2hlY2tfb3ZlcmZsb3coYnVmcCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHN0YXQtPnNpemU7Cit9CisKKy8qKgorICogZGVzZXJpYWxpemVfc3RhdCAtIHNhZmVseSBkZWNvZGUgYSByZWNpZXZlZCBtZXRhZGF0YSAoc3RhdCkgc3RydWN0dXJlCisgKiBAdjlzZXM6IHNlc3Npb24gaW5mbworICogQGJ1ZnA6IGJ1ZmZlciB0byBkZXNlcmlhbGl6ZQorICogQHN0YXQ6IG1ldGFkYXRhIChzdGF0KSBzdHJ1Y3R1cmUKKyAqIEBkYnVmcDogYnVmZmVyIHRvIGRlc2VyaWFsaXplIHZhcmlhYmxlIHN0cmluZ3MgaW50bworICoKKyAqLworCitzdGF0aWMgaW5saW5lIGludAorZGVzZXJpYWxpemVfc3RhdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3QgY2J1ZiAqYnVmcCwKKwkJIHN0cnVjdCB2OWZzX3N0YXQgKnN0YXQsIHN0cnVjdCBjYnVmICpkYnVmcCkKK3sKKworCXN0YXQtPnNpemUgPSBidWZfZ2V0X2ludDE2KGJ1ZnApOworCXN0YXQtPnR5cGUgPSBidWZfZ2V0X2ludDE2KGJ1ZnApOworCXN0YXQtPmRldiA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJc3RhdC0+cWlkLnR5cGUgPSBidWZfZ2V0X2ludDgoYnVmcCk7CisJc3RhdC0+cWlkLnZlcnNpb24gPSBidWZfZ2V0X2ludDMyKGJ1ZnApOworCXN0YXQtPnFpZC5wYXRoID0gYnVmX2dldF9pbnQ2NChidWZwKTsKKwlzdGF0LT5tb2RlID0gYnVmX2dldF9pbnQzMihidWZwKTsKKwlzdGF0LT5hdGltZSA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJc3RhdC0+bXRpbWUgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOworCXN0YXQtPmxlbmd0aCA9IGJ1Zl9nZXRfaW50NjQoYnVmcCk7CisJc3RhdC0+bmFtZSA9IGJ1Zl9nZXRfc3RyaW5nYihidWZwLCBkYnVmcCk7CisJc3RhdC0+dWlkID0gYnVmX2dldF9zdHJpbmdiKGJ1ZnAsIGRidWZwKTsKKwlzdGF0LT5naWQgPSBidWZfZ2V0X3N0cmluZ2IoYnVmcCwgZGJ1ZnApOworCXN0YXQtPm11aWQgPSBidWZfZ2V0X3N0cmluZ2IoYnVmcCwgZGJ1ZnApOworCisJaWYgKHY5c2VzLT5leHRlbmRlZCkgeworCQlzdGF0LT5leHRlbnNpb24gPSBidWZfZ2V0X3N0cmluZ2IoYnVmcCwgZGJ1ZnApOworCQlzdGF0LT5uX3VpZCA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJCXN0YXQtPm5fZ2lkID0gYnVmX2dldF9pbnQzMihidWZwKTsKKwkJc3RhdC0+bl9tdWlkID0gYnVmX2dldF9pbnQzMihidWZwKTsKKwl9CisKKwlpZiAoYnVmX2NoZWNrX292ZXJmbG93KGJ1ZnApIHx8IGJ1Zl9jaGVja19vdmVyZmxvdyhkYnVmcCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHN0YXQtPnNpemUgKyAyOworfQorCisvKioKKyAqIGRlc2VyaWFsaXplX3N0YXRiIC0gd3JhcHBlciBmb3IgZGVjb2RpbmcgYSByZWNlaXZlZCBtZXRhZGF0YSBzdHJ1Y3R1cmUKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvCisgKiBAYnVmcDogYnVmZmVyIHRvIGRlc2VyaWFsaXplCisgKiBAZGJ1ZnA6IGJ1ZmZlciB0byBkZXNlcmlhbGl6ZSB2YXJpYWJsZSBzdHJpbmdzIGludG8KKyAqCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgdjlmc19zdGF0ICpkZXNlcmlhbGl6ZV9zdGF0YihzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8KKwkJCQkJCSAgKnY5c2VzLCBzdHJ1Y3QgY2J1ZiAqYnVmcCwKKwkJCQkJCSAgc3RydWN0IGNidWYgKmRidWZwKQoreworCXN0cnVjdCB2OWZzX3N0YXQgKnJldCA9IGJ1Zl9hbGxvYyhkYnVmcCwgc2l6ZW9mKHN0cnVjdCB2OWZzX3N0YXQpKTsKKworCWlmIChyZXQpIHsKKwkJaW50IG4gPSBkZXNlcmlhbGl6ZV9zdGF0KHY5c2VzLCBidWZwLCByZXQsIGRidWZwKTsKKwkJaWYgKG4gPD0gMCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdjlmc19kZXNlcmlhbGl6ZV9zdGF0IC0gZGVjb2RlIGEgcmVjZWl2ZWQgbWV0YWRhdGEgc3RydWN0dXJlCisgKiBAdjlzZXM6IHNlc3Npb24gaW5mbworICogQGJ1ZjogYnVmZmVyIHRvIGRlc2VyaWFsaXplCisgKiBAYnVmbGVuOiBsZW5ndGggb2YgcmVjZWl2ZWQgYnVmZmVyCisgKiBAc3RhdDogbWV0YWRhdGEgc3RydWN0dXJlIHRvIGRlY29kZSBpbnRvCisgKiBAc3RhdGxlbjogbGVuZ3RoIG9mIGRlc3RpbmF0aW9uIG1ldGFkYXRhIHN0cnVjdHVyZQorICoKKyAqLworCitpbnQKK3Y5ZnNfZGVzZXJpYWxpemVfc3RhdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB2b2lkICpidWYsCisJCSAgICAgIHUzMiBidWZsZW4sIHN0cnVjdCB2OWZzX3N0YXQgKnN0YXQsIHUzMiBzdGF0bGVuKQoreworCXN0cnVjdCBjYnVmIGJ1ZmZlcjsKKwlzdHJ1Y3QgY2J1ZiAqYnVmcCA9ICZidWZmZXI7CisJc3RydWN0IGNidWYgZGJ1ZmZlcjsKKwlzdHJ1Y3QgY2J1ZiAqZGJ1ZnAgPSAmZGJ1ZmZlcjsKKworCWJ1Zl9pbml0KGJ1ZnAsIGJ1ZiwgYnVmbGVuKTsKKwlidWZfaW5pdChkYnVmcCwgKGNoYXIgKilzdGF0ICsgc2l6ZW9mKHN0cnVjdCB2OWZzX3N0YXQpLAorCQkgc3RhdGxlbiAtIHNpemVvZihzdHJ1Y3Qgdjlmc19zdGF0KSk7CisKKwlyZXR1cm4gZGVzZXJpYWxpemVfc3RhdCh2OXNlcywgYnVmcCwgc3RhdCwgZGJ1ZnApOworfQorCitzdGF0aWMgaW5saW5lIGludAordjlmc19zaXplX2ZjYWxsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCkKK3sKKwlpbnQgc2l6ZSA9IDQgKyAxICsgMjsJLyogc2l6ZVs0XSBtc2dbMV0gdGFnWzJdICovCisJaW50IGkgPSAwOworCisJc3dpdGNoIChmY2FsbC0+aWQpIHsKKwlkZWZhdWx0OgorCQllcHJpbnRrKEtFUk5fRVJSLCAiYmFkIG1zZyB0eXBlICVkXG4iLCBmY2FsbC0+aWQpOworCQlyZXR1cm4gMDsKKwljYXNlIFRWRVJTSU9OOgkJLyogbXNpemVbNF0gdmVyc2lvbltzXSAqLworCQlzaXplICs9IDQgKyAyICsgc3RybGVuKGZjYWxsLT5wYXJhbXMudHZlcnNpb24udmVyc2lvbik7CisJCWJyZWFrOworCWNhc2UgVEFVVEg6CQkvKiBhZmlkWzRdIHVuYW1lW3NdIGFuYW1lW3NdICovCisJCXNpemUgKz0gNCArIDIgKyBzdHJsZW4oZmNhbGwtPnBhcmFtcy50YXV0aC51bmFtZSkgKworCQkgICAgMiArIHN0cmxlbihmY2FsbC0+cGFyYW1zLnRhdXRoLmFuYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBURkxVU0g6CQkvKiBvbGR0YWdbMl0gKi8KKwkJc2l6ZSArPSAyOworCQlicmVhazsKKwljYXNlIFRBVFRBQ0g6CQkvKiBmaWRbNF0gYWZpZFs0XSB1bmFtZVtzXSBhbmFtZVtzXSAqLworCQlzaXplICs9IDQgKyA0ICsgMiArIHN0cmxlbihmY2FsbC0+cGFyYW1zLnRhdHRhY2gudW5hbWUpICsKKwkJICAgIDIgKyBzdHJsZW4oZmNhbGwtPnBhcmFtcy50YXR0YWNoLmFuYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBUV0FMSzoJCS8qIGZpZFs0XSBuZXdmaWRbNF0gbnduYW1lWzJdIG53bmFtZSood25hbWVbc10pICovCisJCXNpemUgKz0gNCArIDQgKyAyOworCQkvKiBub3cgY29tcHV0ZSB0b3RhbCBmb3IgdGhlIGFycmF5IG9mIG5hbWVzICovCisJCWZvciAoaSA9IDA7IGkgPCBmY2FsbC0+cGFyYW1zLnR3YWxrLm53bmFtZTsgaSsrKQorCQkJc2l6ZSArPSAyICsgc3RybGVuKGZjYWxsLT5wYXJhbXMudHdhbGsud25hbWVzW2ldKTsKKwkJYnJlYWs7CisJY2FzZSBUT1BFTjoJCS8qIGZpZFs0XSBtb2RlWzFdICovCisJCXNpemUgKz0gNCArIDE7CisJCWJyZWFrOworCWNhc2UgVENSRUFURToJCS8qIGZpZFs0XSBuYW1lW3NdIHBlcm1bNF0gbW9kZVsxXSAqLworCQlzaXplICs9IDQgKyAyICsgc3RybGVuKGZjYWxsLT5wYXJhbXMudGNyZWF0ZS5uYW1lKSArIDQgKyAxOworCQlicmVhazsKKwljYXNlIFRSRUFEOgkJLyogZmlkWzRdIG9mZnNldFs4XSBjb3VudFs0XSAqLworCQlzaXplICs9IDQgKyA4ICsgNDsKKwkJYnJlYWs7CisJY2FzZSBUV1JJVEU6CQkvKiBmaWRbNF0gb2Zmc2V0WzhdIGNvdW50WzRdIGRhdGFbY291bnRdICovCisJCXNpemUgKz0gNCArIDggKyA0ICsgZmNhbGwtPnBhcmFtcy50d3JpdGUuY291bnQ7CisJCWJyZWFrOworCWNhc2UgVENMVU5LOgkJLyogZmlkWzRdICovCisJCXNpemUgKz0gNDsKKwkJYnJlYWs7CisJY2FzZSBUUkVNT1ZFOgkJLyogZmlkWzRdICovCisJCXNpemUgKz0gNDsKKwkJYnJlYWs7CisJY2FzZSBUU1RBVDoJCS8qIGZpZFs0XSAqLworCQlzaXplICs9IDQ7CisJCWJyZWFrOworCWNhc2UgVFdTVEFUOgkJLyogZmlkWzRdIHN0YXRbbl0gKi8KKwkJZmNhbGwtPnBhcmFtcy50d3N0YXQuc3RhdC0+c2l6ZSA9CisJCSAgICB2OWZzX3NpemVfc3RhdCh2OXNlcywgZmNhbGwtPnBhcmFtcy50d3N0YXQuc3RhdCk7CisJCXNpemUgKz0gNCArIDIgKyAyICsgZmNhbGwtPnBhcmFtcy50d3N0YXQuc3RhdC0+c2l6ZTsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKKy8qCisgKiB2OWZzX3NlcmlhbGl6ZV9mY2FsbCAtIG1hcnNoYWxsIGZjYWxsIHN0cnVjdCBpbnRvIGEgcGFja2V0CisgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBmY2FsbDogc3RydWN0dXJlIHRvIGNvbnZlcnQKKyAqIEBkYXRhOiBidWZmZXIgdG8gc2VyaWFsaXplIGZjYWxsIGludG8KKyAqIEBkYXRhbGVuOiBsZW5ndGggb2YgYnVmZmVyIHRvIHNlcmlhbGl6ZSBmY2FsbCBpbnRvCisgKgorICovCisKK2ludAordjlmc19zZXJpYWxpemVfZmNhbGwoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsLAorCQkgICAgIHZvaWQgKmRhdGEsIHUzMiBkYXRhbGVuKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0ID0gTlVMTDsKKwlzdHJ1Y3QgY2J1ZiBidWZmZXI7CisJc3RydWN0IGNidWYgKmJ1ZnAgPSAmYnVmZmVyOworCisJYnVmX2luaXQoYnVmcCwgZGF0YSwgZGF0YWxlbik7CisKKwlpZiAoIWZjYWxsKSB7CisJCWVwcmludGsoS0VSTl9FUlIsICJubyBmY2FsbFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZjYWxsLT5zaXplID0gdjlmc19zaXplX2ZjYWxsKHY5c2VzLCBmY2FsbCk7CisKKwlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5zaXplKTsKKwlidWZfcHV0X2ludDgoYnVmcCwgZmNhbGwtPmlkKTsKKwlidWZfcHV0X2ludDE2KGJ1ZnAsIGZjYWxsLT50YWcpOworCisJZHByaW50ayhERUJVR19DT05WLCAic2l6ZSAlZCBpZCAlZCB0YWcgJWRcbiIsIGZjYWxsLT5zaXplLCBmY2FsbC0+aWQsCisJCWZjYWxsLT50YWcpOworCisJLyogbm93IGVuY29kZSBpdCAqLworCXN3aXRjaCAoZmNhbGwtPmlkKSB7CisJZGVmYXVsdDoKKwkJZXByaW50ayhLRVJOX0VSUiwgImJhZCBtc2cgdHlwZTogJWRcbiIsIGZjYWxsLT5pZCk7CisJCXJldHVybiAtRVBST1RPOworCWNhc2UgVFZFUlNJT046CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50dmVyc2lvbi5tc2l6ZSk7CisJCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHZlcnNpb24udmVyc2lvbik7CisJCWJyZWFrOworCWNhc2UgVEFVVEg6CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50YXV0aC5hZmlkKTsKKwkJYnVmX3B1dF9zdHJpbmcoYnVmcCwgZmNhbGwtPnBhcmFtcy50YXV0aC51bmFtZSk7CisJCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudGF1dGguYW5hbWUpOworCQlicmVhazsKKwljYXNlIFRGTFVTSDoKKwkJYnVmX3B1dF9pbnQxNihidWZwLCBmY2FsbC0+cGFyYW1zLnRmbHVzaC5vbGR0YWcpOworCQlicmVhazsKKwljYXNlIFRBVFRBQ0g6CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50YXR0YWNoLmZpZCk7CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50YXR0YWNoLmFmaWQpOworCQlidWZfcHV0X3N0cmluZyhidWZwLCBmY2FsbC0+cGFyYW1zLnRhdHRhY2gudW5hbWUpOworCQlidWZfcHV0X3N0cmluZyhidWZwLCBmY2FsbC0+cGFyYW1zLnRhdHRhY2guYW5hbWUpOworCQlicmVhazsKKwljYXNlIFRXQUxLOgorCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHdhbGsuZmlkKTsKKwkJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+cGFyYW1zLnR3YWxrLm5ld2ZpZCk7CisJCWJ1Zl9wdXRfaW50MTYoYnVmcCwgZmNhbGwtPnBhcmFtcy50d2Fsay5ud25hbWUpOworCQlmb3IgKGkgPSAwOyBpIDwgZmNhbGwtPnBhcmFtcy50d2Fsay5ud25hbWU7IGkrKykKKwkJCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHdhbGsud25hbWVzW2ldKTsKKwkJYnJlYWs7CisJY2FzZSBUT1BFTjoKKwkJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+cGFyYW1zLnRvcGVuLmZpZCk7CisJCWJ1Zl9wdXRfaW50OChidWZwLCBmY2FsbC0+cGFyYW1zLnRvcGVuLm1vZGUpOworCQlicmVhazsKKwljYXNlIFRDUkVBVEU6CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50Y3JlYXRlLmZpZCk7CisJCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudGNyZWF0ZS5uYW1lKTsKKwkJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+cGFyYW1zLnRjcmVhdGUucGVybSk7CisJCWJ1Zl9wdXRfaW50OChidWZwLCBmY2FsbC0+cGFyYW1zLnRjcmVhdGUubW9kZSk7CisJCWJyZWFrOworCWNhc2UgVFJFQUQ6CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50cmVhZC5maWQpOworCQlidWZfcHV0X2ludDY0KGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHJlYWQub2Zmc2V0KTsKKwkJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+cGFyYW1zLnRyZWFkLmNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBUV1JJVEU6CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50d3JpdGUuZmlkKTsKKwkJYnVmX3B1dF9pbnQ2NChidWZwLCBmY2FsbC0+cGFyYW1zLnR3cml0ZS5vZmZzZXQpOworCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHdyaXRlLmNvdW50KTsKKwkJYnVmX3B1dF9kYXRhKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHdyaXRlLmRhdGEsCisJCQkgICAgIGZjYWxsLT5wYXJhbXMudHdyaXRlLmNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBUQ0xVTks6CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50Y2x1bmsuZmlkKTsKKwkJYnJlYWs7CisJY2FzZSBUUkVNT1ZFOgorCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHJlbW92ZS5maWQpOworCQlicmVhazsKKwljYXNlIFRTVEFUOgorCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHN0YXQuZmlkKTsKKwkJYnJlYWs7CisJY2FzZSBUV1NUQVQ6CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50d3N0YXQuZmlkKTsKKwkJc3RhdCA9IGZjYWxsLT5wYXJhbXMudHdzdGF0LnN0YXQ7CisKKwkJYnVmX3B1dF9pbnQxNihidWZwLCBzdGF0LT5zaXplICsgMik7CisJCXNlcmlhbGl6ZV9zdGF0KHY5c2VzLCBzdGF0LCBidWZwKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGJ1Zl9jaGVja19vdmVyZmxvdyhidWZwKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gZmNhbGwtPnNpemU7Cit9CisKKy8qKgorICogZGVzZXJpYWxpemVfZmNhbGwgLSB1bm1hcnNoYWwgYSByZXNwb25zZQorICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAbXNnc2l6ZTogc2l6ZSBvZiByY2FsbCBtZXNzYWdlCisgKiBAYnVmOiByZWNpZXZlZCBidWZmZXIKKyAqIEBidWZsZW46IGxlbmd0aCBvZiByZWNlaXZlZCBidWZmZXIKKyAqIEByY2FsbDogZmNhbGwgc3RydWN0dXJlIHRvIHBvcHVsYXRlCisgKiBAcmNhbGxsZW46IGxlbmd0aCBvZiBmY2FsbCBzdHJ1Y3R1cmUgdG8gcG9wdWxhdGUKKyAqCisgKi8KKworaW50Cit2OWZzX2Rlc2VyaWFsaXplX2ZjYWxsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBtc2dzaXplLAorCQkgICAgICAgdm9pZCAqYnVmLCB1MzIgYnVmbGVuLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqcmNhbGwsCisJCSAgICAgICBpbnQgcmNhbGxsZW4pCit7CisKKwlzdHJ1Y3QgY2J1ZiBidWZmZXI7CisJc3RydWN0IGNidWYgKmJ1ZnAgPSAmYnVmZmVyOworCXN0cnVjdCBjYnVmIGRidWZmZXI7CisJc3RydWN0IGNidWYgKmRidWZwID0gJmRidWZmZXI7CisJaW50IGkgPSAwOworCisJYnVmX2luaXQoYnVmcCwgYnVmLCBidWZsZW4pOworCWJ1Zl9pbml0KGRidWZwLCAoY2hhciAqKXJjYWxsICsgc2l6ZW9mKHN0cnVjdCB2OWZzX2ZjYWxsKSwKKwkJIHJjYWxsbGVuIC0gc2l6ZW9mKHN0cnVjdCB2OWZzX2ZjYWxsKSk7CisKKwlyY2FsbC0+c2l6ZSA9IG1zZ3NpemU7CisJcmNhbGwtPmlkID0gYnVmX2dldF9pbnQ4KGJ1ZnApOworCXJjYWxsLT50YWcgPSBidWZfZ2V0X2ludDE2KGJ1ZnApOworCisJZHByaW50ayhERUJVR19DT05WLCAic2l6ZSAlZCBpZCAlZCB0YWcgJWRcbiIsIHJjYWxsLT5zaXplLCByY2FsbC0+aWQsCisJCXJjYWxsLT50YWcpOworCXN3aXRjaCAocmNhbGwtPmlkKSB7CisJZGVmYXVsdDoKKwkJZXByaW50ayhLRVJOX0VSUiwgInVua25vd24gbWVzc2FnZSB0eXBlOiAlZFxuIiwgcmNhbGwtPmlkKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJY2FzZSBSVkVSU0lPTjoKKwkJcmNhbGwtPnBhcmFtcy5ydmVyc2lvbi5tc2l6ZSA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJCXJjYWxsLT5wYXJhbXMucnZlcnNpb24udmVyc2lvbiA9IGJ1Zl9nZXRfc3RyaW5nYihidWZwLCBkYnVmcCk7CisJCWJyZWFrOworCWNhc2UgUkZMVVNIOgorCQlicmVhazsKKwljYXNlIFJBVFRBQ0g6CisJCXJjYWxsLT5wYXJhbXMucmF0dGFjaC5xaWQudHlwZSA9IGJ1Zl9nZXRfaW50OChidWZwKTsKKwkJcmNhbGwtPnBhcmFtcy5yYXR0YWNoLnFpZC52ZXJzaW9uID0gYnVmX2dldF9pbnQzMihidWZwKTsKKwkJcmNhbGwtPnBhcmFtcy5yYXR0YWNoLnFpZC5wYXRoID0gYnVmX2dldF9pbnQ2NChidWZwKTsKKwkJYnJlYWs7CisJY2FzZSBSV0FMSzoKKwkJcmNhbGwtPnBhcmFtcy5yd2Fsay5ud3FpZCA9IGJ1Zl9nZXRfaW50MTYoYnVmcCk7CisJCXJjYWxsLT5wYXJhbXMucndhbGsud3FpZHMgPSBidWZfYWxsb2MoYnVmcCwKKwkJICAgICAgcmNhbGwtPnBhcmFtcy5yd2Fsay5ud3FpZCAqIHNpemVvZihzdHJ1Y3Qgdjlmc19xaWQpKTsKKwkJaWYgKHJjYWxsLT5wYXJhbXMucndhbGsud3FpZHMpCisJCQlmb3IgKGkgPSAwOyBpIDwgcmNhbGwtPnBhcmFtcy5yd2Fsay5ud3FpZDsgaSsrKSB7CisJCQkJcmNhbGwtPnBhcmFtcy5yd2Fsay53cWlkc1tpXS50eXBlID0KKwkJCQkgICAgYnVmX2dldF9pbnQ4KGJ1ZnApOworCQkJCXJjYWxsLT5wYXJhbXMucndhbGsud3FpZHNbaV0udmVyc2lvbiA9CisJCQkJICAgIGJ1Zl9nZXRfaW50MTYoYnVmcCk7CisJCQkJcmNhbGwtPnBhcmFtcy5yd2Fsay53cWlkc1tpXS5wYXRoID0KKwkJCQkgICAgYnVmX2dldF9pbnQ2NChidWZwKTsKKwkJCX0KKwkJYnJlYWs7CisJY2FzZSBST1BFTjoKKwkJcmNhbGwtPnBhcmFtcy5yb3Blbi5xaWQudHlwZSA9IGJ1Zl9nZXRfaW50OChidWZwKTsKKwkJcmNhbGwtPnBhcmFtcy5yb3Blbi5xaWQudmVyc2lvbiA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJCXJjYWxsLT5wYXJhbXMucm9wZW4ucWlkLnBhdGggPSBidWZfZ2V0X2ludDY0KGJ1ZnApOworCQlyY2FsbC0+cGFyYW1zLnJvcGVuLmlvdW5pdCA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJCWJyZWFrOworCWNhc2UgUkNSRUFURToKKwkJcmNhbGwtPnBhcmFtcy5yY3JlYXRlLnFpZC50eXBlID0gYnVmX2dldF9pbnQ4KGJ1ZnApOworCQlyY2FsbC0+cGFyYW1zLnJjcmVhdGUucWlkLnZlcnNpb24gPSBidWZfZ2V0X2ludDMyKGJ1ZnApOworCQlyY2FsbC0+cGFyYW1zLnJjcmVhdGUucWlkLnBhdGggPSBidWZfZ2V0X2ludDY0KGJ1ZnApOworCQlyY2FsbC0+cGFyYW1zLnJjcmVhdGUuaW91bml0ID0gYnVmX2dldF9pbnQzMihidWZwKTsKKwkJYnJlYWs7CisJY2FzZSBSUkVBRDoKKwkJcmNhbGwtPnBhcmFtcy5ycmVhZC5jb3VudCA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJCXJjYWxsLT5wYXJhbXMucnJlYWQuZGF0YSA9IGJ1Zl9nZXRfZGF0YWIoYnVmcCwgZGJ1ZnAsCisJCQlyY2FsbC0+cGFyYW1zLnJyZWFkLmNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBSV1JJVEU6CisJCXJjYWxsLT5wYXJhbXMucndyaXRlLmNvdW50ID0gYnVmX2dldF9pbnQzMihidWZwKTsKKwkJYnJlYWs7CisJY2FzZSBSQ0xVTks6CisJCWJyZWFrOworCWNhc2UgUlJFTU9WRToKKwkJYnJlYWs7CisJY2FzZSBSU1RBVDoKKwkJYnVmX2dldF9pbnQxNihidWZwKTsKKwkJcmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0ID0KKwkJICAgIGRlc2VyaWFsaXplX3N0YXRiKHY5c2VzLCBidWZwLCBkYnVmcCk7CisJCWJyZWFrOworCWNhc2UgUldTVEFUOgorCQlicmVhazsKKwljYXNlIFJFUlJPUjoKKwkJcmNhbGwtPnBhcmFtcy5yZXJyb3IuZXJyb3IgPSBidWZfZ2V0X3N0cmluZ2IoYnVmcCwgZGJ1ZnApOworCQlpZiAodjlzZXMtPmV4dGVuZGVkKQorCQkJcmNhbGwtPnBhcmFtcy5yZXJyb3IuZXJybm8gPSBidWZfZ2V0X2ludDE2KGJ1ZnApOworCQlicmVhazsKKwl9CisKKwlpZiAoYnVmX2NoZWNrX292ZXJmbG93KGJ1ZnApIHx8IGJ1Zl9jaGVja19vdmVyZmxvdyhkYnVmcCkpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJjYWxsLT5zaXplOworfQpkaWZmIC0tZ2l0IGEvZnMvOXAvY29udi5oIGIvZnMvOXAvY29udi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlODQ5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC9jb252LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIGxpbnV4L2ZzLzlwL2NvbnYuaAorICoKKyAqIDlQIHByb3RvY29sIGNvbnZlcnNpb24gZGVmaW5pdGlvbnMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIGJ5IFJvbiBNaW5uaWNoIDxybWlubmljaEBsYW5sLmdvdj4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKK2ludCB2OWZzX2Rlc2VyaWFsaXplX3N0YXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICosIHZvaWQgKmJ1ZiwKKwkJCSAgdTMyIGJ1Zmxlbiwgc3RydWN0IHY5ZnNfc3RhdCAqc3RhdCwgdTMyIHN0YXRsZW4pOworaW50IHY5ZnNfc2VyaWFsaXplX2ZjYWxsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqdGNhbGwsCisJCQkgdm9pZCAqYnVmLCB1MzIgYnVmbGVuKTsKK2ludCB2OWZzX2Rlc2VyaWFsaXplX2ZjYWxsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqLCB1MzIgbXNnbGVuLAorCQkJICAgdm9pZCAqYnVmLCB1MzIgYnVmbGVuLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqcmNhbGwsCisJCQkgICBpbnQgcmNhbGxsZW4pOworCisvKiB0aGlzIG9uZSBpcyBhY3R1YWxseSBpbiBlcnJvci5jIHJpZ2h0IG5vdyAqLworaW50IHY5ZnNfZXJyc3RyMmVycm5vKGNoYXIgKmVycnN0cik7CmRpZmYgLS1naXQgYS9mcy85cC9kZWJ1Zy5oIGIvZnMvOXAvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDQ1ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvOXAvZGVidWcuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogIGxpbnV4L2ZzLzlwL2RlYnVnLmggLSBWOUZTIERlYnVnIERlZmluaXRpb25zCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjZGVmaW5lIERFQlVHX0VSUk9SCQkoMTw8MCkKKyNkZWZpbmUgREVCVUdfQ1VSUkVOVAkJKDE8PDEpCisjZGVmaW5lIERFQlVHXzlQCSAgICAgICAgKDE8PDIpCisjZGVmaW5lIERFQlVHX1ZGUwkgICAgICAgICgxPDwzKQorI2RlZmluZSBERUJVR19DT05WCQkoMTw8NCkKKyNkZWZpbmUgREVCVUdfTVVYCQkoMTw8NSkKKyNkZWZpbmUgREVCVUdfVFJBTlMJCSgxPDw2KQorI2RlZmluZSBERUJVR19TTEFCUwkgICAgICAJKDE8PDcpCisKKyNkZWZpbmUgREVCVUdfRFVNUF9QS1QJCTAKKworZXh0ZXJuIGludCB2OWZzX2RlYnVnX2xldmVsOworCisjZGVmaW5lIGRwcmludGsobGV2ZWwsIGZvcm1hdCwgYXJnLi4uKSBcCitkbyB7ICBcCisJaWYoKHY5ZnNfZGVidWdfbGV2ZWwgJiBsZXZlbCk9PWxldmVsKSBcCisJCXByaW50ayhLRVJOX05PVElDRSAiLS0gJXMgKCVkKTogIiBcCisJCWZvcm1hdCAsIF9fRlVOQ1RJT05fXywgY3VycmVudC0+cGlkICwgIyMgYXJnKTsgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIGVwcmludGsobGV2ZWwsIGZvcm1hdCwgYXJnLi4uKSBcCitkbyB7IFwKKwlwcmludGsobGV2ZWwgInY5ZnM6ICVzICglZCk6ICIgXAorCQlmb3JtYXQgLCBfX0ZVTkNUSU9OX18sIGN1cnJlbnQtPnBpZCAsICMjIGFyZyk7IFwKK30gd2hpbGUoMCkKKworI2lmIERFQlVHX0RVTVBfUEtUCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9kYXRhKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCWludCBpLCBqOworCWludCBsZW4gPSBkYXRhbGVuOworCisJcHJpbnRrKEtFUk5fREVCVUcgImRhdGEgIik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7CisJCWZvciAoaiA9IDA7IChqIDwgNCkgJiYgKGkgKyBqIDwgbGVuKTsgaisrKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiUwMngiLCBkYXRhW2kgKyBqXSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgIik7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOworfQorI2Vsc2UJCQkJLyogREVCVUdfRFVNUF9QS1QgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2RhdGEoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisKK30KKyNlbmRpZgkJCQkvKiBERUJVR19EVU1QX1BLVCAqLwpkaWZmIC0tZ2l0IGEvZnMvOXAvZXJyb3IuYyBiL2ZzLzlwL2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlNWQxOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL2Vycm9yLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIGxpbnV4L2ZzLzlwL2Vycm9yLmMKKyAqCisgKiBFcnJvciBzdHJpbmcgaGFuZGxpbmcKKyAqCisgKiBQbGFuIDkgdXNlcyBlcnJvciBzdHJpbmdzLCBVbml4IHVzZXMgZXJyb3IgbnVtYmVycy4gIFRoZXNlIGZ1bmN0aW9ucworICogdHJ5IHRvIGhlbHAgbWFuYWdlIHRoYXQgYW5kIHByb3ZpZGUgZm9yIGR5bmFtaWNhbGx5IGFkZGluZyBlcnJvcgorICogbWFwcGluZ3MuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKworLyoqCisgKiB2OWZzX2Vycm9yX2luaXQgLSBwcmVsb2FkCisgKiBAZXJyc3RyOiBlcnJvciBzdHJpbmcKKyAqCisgKi8KKworaW50IHY5ZnNfZXJyb3JfaW5pdCh2b2lkKQoreworCXN0cnVjdCBlcnJvcm1hcCAqYzsKKwlpbnQgYnVja2V0OworCisJLyogaW5pdGlhbGl6ZSBoYXNoIHRhYmxlICovCisJZm9yIChidWNrZXQgPSAwOyBidWNrZXQgPCBFUlJIQVNIU1o7IGJ1Y2tldCsrKQorCQlJTklUX0hMSVNUX0hFQUQoJmhhc2hfZXJybWFwW2J1Y2tldF0pOworCisJLyogbG9hZCBpbml0aWFsIGVycm9yIG1hcCBpbnRvIGhhc2ggdGFibGUgKi8KKwlmb3IgKGMgPSBlcnJtYXA7IGMtPm5hbWUgIT0gTlVMTDsgYysrKSB7CisJCWJ1Y2tldCA9IGpoYXNoKGMtPm5hbWUsIHN0cmxlbihjLT5uYW1lKSwgMCkgJSBFUlJIQVNIU1o7CisJCUlOSVRfSExJU1RfTk9ERSgmYy0+bGlzdCk7CisJCWhsaXN0X2FkZF9oZWFkKCZjLT5saXN0LCAmaGFzaF9lcnJtYXBbYnVja2V0XSk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogZXJyc3RyMmVycm5vIC0gY29udmVydCBlcnJvciBzdHJpbmcgdG8gZXJyb3IgbnVtYmVyCisgKiBAZXJyc3RyOiBlcnJvciBzdHJpbmcKKyAqCisgKi8KKworaW50IHY5ZnNfZXJyc3RyMmVycm5vKGNoYXIgKmVycnN0cikKK3sKKwlpbnQgZXJybm8gPSAwOworCXN0cnVjdCBobGlzdF9ub2RlICpwID0gTlVMTDsKKwlzdHJ1Y3QgZXJyb3JtYXAgKmMgPSBOVUxMOworCWludCBidWNrZXQgPSBqaGFzaChlcnJzdHIsIHN0cmxlbihlcnJzdHIpLCAwKSAlIEVSUkhBU0hTWjsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsIHAsICZoYXNoX2Vycm1hcFtidWNrZXRdLCBsaXN0KSB7CisJCWlmICghc3RyY21wKGMtPm5hbWUsIGVycnN0cikpIHsKKwkJCWVycm5vID0gYy0+dmFsOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZXJybm8gPT0gMCkgeworCQkvKiBUT0RPOiBpZiBlcnJvciBpc24ndCBmb3VuZCwgYWRkIGl0IGR5bmFtaWNhbGx5ICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycnN0ciA6JXM6IG5vdCBmb3VuZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICAgICAgZXJyc3RyKTsKKwkJZXJybm8gPSAxOworCX0KKworCXJldHVybiAtZXJybm87Cit9CmRpZmYgLS1naXQgYS9mcy85cC9lcnJvci5oIGIvZnMvOXAvZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGY4OWFjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvOXAvZXJyb3IuaApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIGxpbnV4L2ZzLzlwL2Vycm9yLmgKKyAqCisgKiBIdWdlIE5hc3R5IEVycm9yIFRhYmxlCisgKgorICogUGxhbiA5IHVzZXMgZXJyb3Igc3RyaW5ncywgVW5peCB1c2VzIGVycm9yIG51bWJlcnMuICBUaGlzIHRhYmxlIHRyaWVzIHRvCisgKiBtYXRjaCBVTklYIHN0cmluZ3MgYW5kIFBsYW4gOSBzdHJpbmdzIHRvIHVuaXggZXJyb3IgbnVtYmVycy4gIEl0IGlzIHVzZWQKKyAqIHRvIHByZWxvYWQgdGhlIGR5bmFtaWMgZXJyb3IgdGFibGUgd2hpY2ggY2FuIGFsc28gdHJhY2sgdXNlci1zcGVjaWZpYyBlcnJvcgorICogc3RyaW5ncy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIGJ5IFJvbiBNaW5uaWNoIDxybWlubmljaEBsYW5sLmdvdj4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCitzdHJ1Y3QgZXJyb3JtYXAgeworCWNoYXIgKm5hbWU7CisJaW50IHZhbDsKKworCXN0cnVjdCBobGlzdF9ub2RlIGxpc3Q7Cit9OworCisjZGVmaW5lIEVSUkhBU0hTWgkJMzIKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBoYXNoX2Vycm1hcFtFUlJIQVNIU1pdOworCisvKiBGaXhNZSAtIHJlZHVjZSB0byBhIHJlYXNvbmFibGUgc2l6ZSAqLworc3RhdGljIHN0cnVjdCBlcnJvcm1hcCBlcnJtYXBbXSA9IHsKKwl7Ik9wZXJhdGlvbiBub3QgcGVybWl0dGVkIiwgRVBFUk19LAorCXsid3N0YXQgcHJvaGliaXRlZCIsIEVQRVJNfSwKKwl7Ik5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiLCBFTk9FTlR9LAorCXsiZGlyZWN0b3J5IGVudHJ5IG5vdCBmb3VuZCIsIEVOT0VOVH0sCisJeyJmaWxlIG5vdCBmb3VuZCIsIEVOT0VOVH0sCisJeyJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCIsIEVJTlRSfSwKKwl7IklucHV0L291dHB1dCBlcnJvciIsIEVJT30sCisJeyJObyBzdWNoIGRldmljZSBvciBhZGRyZXNzIiwgRU5YSU99LAorCXsiQXJndW1lbnQgbGlzdCB0b28gbG9uZyIsIEUyQklHfSwKKwl7IkJhZCBmaWxlIGRlc2NyaXB0b3IiLCBFQkFERn0sCisJeyJSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSIsIEVBR0FJTn0sCisJeyJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IiwgRU5PTUVNfSwKKwl7IlBlcm1pc3Npb24gZGVuaWVkIiwgRUFDQ0VTfSwKKwl7IkJhZCBhZGRyZXNzIiwgRUZBVUxUfSwKKwl7IkJsb2NrIGRldmljZSByZXF1aXJlZCIsIEVOT1RCTEt9LAorCXsiRGV2aWNlIG9yIHJlc291cmNlIGJ1c3kiLCBFQlVTWX0sCisJeyJGaWxlIGV4aXN0cyIsIEVFWElTVH0sCisJeyJJbnZhbGlkIGNyb3NzLWRldmljZSBsaW5rIiwgRVhERVZ9LAorCXsiTm8gc3VjaCBkZXZpY2UiLCBFTk9ERVZ9LAorCXsiTm90IGEgZGlyZWN0b3J5IiwgRU5PVERJUn0sCisJeyJJcyBhIGRpcmVjdG9yeSIsIEVJU0RJUn0sCisJeyJJbnZhbGlkIGFyZ3VtZW50IiwgRUlOVkFMfSwKKwl7IlRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtIiwgRU5GSUxFfSwKKwl7IlRvbyBtYW55IG9wZW4gZmlsZXMiLCBFTUZJTEV9LAorCXsiVGV4dCBmaWxlIGJ1c3kiLCBFVFhUQlNZfSwKKwl7IkZpbGUgdG9vIGxhcmdlIiwgRUZCSUd9LAorCXsiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UiLCBFTk9TUEN9LAorCXsiSWxsZWdhbCBzZWVrIiwgRVNQSVBFfSwKKwl7IlJlYWQtb25seSBmaWxlIHN5c3RlbSIsIEVST0ZTfSwKKwl7IlRvbyBtYW55IGxpbmtzIiwgRU1MSU5LfSwKKwl7IkJyb2tlbiBwaXBlIiwgRVBJUEV9LAorCXsiTnVtZXJpY2FsIGFyZ3VtZW50IG91dCBvZiBkb21haW4iLCBFRE9NfSwKKwl7Ik51bWVyaWNhbCByZXN1bHQgb3V0IG9mIHJhbmdlIiwgRVJBTkdFfSwKKwl7IlJlc291cmNlIGRlYWRsb2NrIGF2b2lkZWQiLCBFREVBRExLfSwKKwl7IkZpbGUgbmFtZSB0b28gbG9uZyIsIEVOQU1FVE9PTE9OR30sCisJeyJObyBsb2NrcyBhdmFpbGFibGUiLCBFTk9MQ0t9LAorCXsiRnVuY3Rpb24gbm90IGltcGxlbWVudGVkIiwgRU5PU1lTfSwKKwl7IkRpcmVjdG9yeSBub3QgZW1wdHkiLCBFTk9URU1QVFl9LAorCXsiVG9vIG1hbnkgbGV2ZWxzIG9mIHN5bWJvbGljIGxpbmtzIiwgRUxPT1B9LAorCXsiTm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUiLCBFTk9NU0d9LAorCXsiSWRlbnRpZmllciByZW1vdmVkIiwgRUlEUk19LAorCXsiTm8gZGF0YSBhdmFpbGFibGUiLCBFTk9EQVRBfSwKKwl7Ik1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrIiwgRU5PTkVUfSwKKwl7IlBhY2thZ2Ugbm90IGluc3RhbGxlZCIsIEVOT1BLR30sCisJeyJPYmplY3QgaXMgcmVtb3RlIiwgRVJFTU9URX0sCisJeyJMaW5rIGhhcyBiZWVuIHNldmVyZWQiLCBFTk9MSU5LfSwKKwl7IkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCIsIEVDT01NfSwKKwl7IlByb3RvY29sIGVycm9yIiwgRVBST1RPfSwKKwl7IkJhZCBtZXNzYWdlIiwgRUJBRE1TR30sCisJeyJGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlIiwgRUJBREZEfSwKKwl7IlN0cmVhbXMgcGlwZSBlcnJvciIsIEVTVFJQSVBFfSwKKwl7IlRvbyBtYW55IHVzZXJzIiwgRVVTRVJTfSwKKwl7IlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIsIEVOT1RTT0NLfSwKKwl7Ik1lc3NhZ2UgdG9vIGxvbmciLCBFTVNHU0laRX0sCisJeyJQcm90b2NvbCBub3QgYXZhaWxhYmxlIiwgRU5PUFJPVE9PUFR9LAorCXsiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIsIEVQUk9UT05PU1VQUE9SVH0sCisJeyJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIiwgRVNPQ0tUTk9TVVBQT1JUfSwKKwl7Ik9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIiwgRU9QTk9UU1VQUH0sCisJeyJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCIsIEVQRk5PU1VQUE9SVH0sCisJeyJOZXR3b3JrIGlzIGRvd24iLCBFTkVURE9XTn0sCisJeyJOZXR3b3JrIGlzIHVucmVhY2hhYmxlIiwgRU5FVFVOUkVBQ0h9LAorCXsiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gb24gcmVzZXQiLCBFTkVUUkVTRVR9LAorCXsiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiLCBFQ09OTkFCT1JURUR9LAorCXsiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIiwgRUNPTk5SRVNFVH0sCisJeyJObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlIiwgRU5PQlVGU30sCisJeyJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiLCBFSVNDT05OfSwKKwl7IlRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkIiwgRU5PVENPTk59LAorCXsiQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duIiwgRVNIVVRET1dOfSwKKwl7IkNvbm5lY3Rpb24gdGltZWQgb3V0IiwgRVRJTUVET1VUfSwKKwl7IkNvbm5lY3Rpb24gcmVmdXNlZCIsIEVDT05OUkVGVVNFRH0sCisJeyJIb3N0IGlzIGRvd24iLCBFSE9TVERPV059LAorCXsiTm8gcm91dGUgdG8gaG9zdCIsIEVIT1NUVU5SRUFDSH0sCisJeyJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIsIEVBTFJFQURZfSwKKwl7Ik9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MiLCBFSU5QUk9HUkVTU30sCisJeyJJcyBhIG5hbWVkIHR5cGUgZmlsZSIsIEVJU05BTX0sCisJeyJSZW1vdGUgSS9PIGVycm9yIiwgRVJFTU9URUlPfSwKKwl7IkRpc2sgcXVvdGEgZXhjZWVkZWQiLCBFRFFVT1R9LAorLyogZXJyb3JzIGZyb20gZm9zc2lsLCB2YWNmcywgYW5kIHU5ZnMgKi8KKwl7ImZpZCB1bmtub3duIG9yIG91dCBvZiByYW5nZSIsIEVCQURGfSwKKwl7InBlcm1pc3Npb24gZGVuaWVkIiwgRUFDQ0VTfSwKKwl7ImZpbGUgZG9lcyBub3QgZXhpc3QiLCBFTk9FTlR9LAorCXsiYXV0aGVudGljYXRpb24gZmFpbGVkIiwgRUNPTk5SRUZVU0VEfSwKKwl7ImJhZCBvZmZzZXQgaW4gZGlyZWN0b3J5IHJlYWQiLCBFU1BJUEV9LAorCXsiYmFkIHVzZSBvZiBmaWQiLCBFQkFERn0sCisJeyJ3c3RhdCBjYW4ndCBjb252ZXJ0IGJldHdlZW4gZmlsZXMgYW5kIGRpcmVjdG9yaWVzIiwgRVBFUk19LAorCXsiZGlyZWN0b3J5IGlzIG5vdCBlbXB0eSIsIEVOT1RFTVBUWX0sCisJeyJmaWxlIGV4aXN0cyIsIEVFWElTVH0sCisJeyJmaWxlIGFscmVhZHkgZXhpc3RzIiwgRUVYSVNUfSwKKwl7ImZpbGUgb3IgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIiwgRUVYSVNUfSwKKwl7ImZpZCBhbHJlYWR5IGluIHVzZSIsIEVCQURGfSwKKwl7ImZpbGUgaW4gdXNlIiwgRVRYVEJTWX0sCisJeyJpL28gZXJyb3IiLCBFSU99LAorCXsiZmlsZSBhbHJlYWR5IG9wZW4gZm9yIEkvTyIsIEVUWFRCU1l9LAorCXsiaWxsZWdhbCBtb2RlIiwgRUlOVkFMfSwKKwl7ImlsbGVnYWwgbmFtZSIsIEVOQU1FVE9PTE9OR30sCisJeyJub3QgYSBkaXJlY3RvcnkiLCBFTk9URElSfSwKKwl7Im5vdCBhIG1lbWJlciBvZiBwcm9wb3NlZCBncm91cCIsIEVQRVJNfSwKKwl7Im5vdCBvd25lciIsIEVBQ0NFU30sCisJeyJvbmx5IG93bmVyIGNhbiBjaGFuZ2UgZ3JvdXAgaW4gd3N0YXQiLCBFQUNDRVN9LAorCXsicmVhZCBvbmx5IGZpbGUgc3lzdGVtIiwgRVJPRlN9LAorCXsibm8gYWNjZXNzIHRvIHNwZWNpYWwgZmlsZSIsIEVQRVJNfSwKKwl7ImkvbyBjb3VudCB0b28gbGFyZ2UiLCBFSU99LAorCXsidW5rbm93biBncm91cCIsIEVJTlZBTH0sCisJeyJ1bmtub3duIHVzZXIiLCBFSU5WQUx9LAorCXsiYm9ndXMgd3N0YXQgYnVmZmVyIiwgRVBST1RPfSwKKwl7ImV4Y2x1c2l2ZSB1c2UgZmlsZSBhbHJlYWR5IG9wZW4iLCBFQUdBSU59LAorCXsiY29ycnVwdGVkIGRpcmVjdG9yeSBlbnRyeSIsIEVJT30sCisJeyJjb3JydXB0ZWQgZmlsZSBlbnRyeSIsIEVJT30sCisJeyJjb3JydXB0ZWQgYmxvY2sgbGFiZWwiLCBFSU99LAorCXsiY29ycnVwdGVkIG1ldGEgZGF0YSIsIEVJT30sCisJeyJpbGxlZ2FsIG9mZnNldCIsIEVJTlZBTH0sCisJeyJpbGxlZ2FsIHBhdGggZWxlbWVudCIsIEVOT0VOVH0sCisJeyJyb290IG9mIGZpbGUgc3lzdGVtIGlzIGNvcnJ1cHRlZCIsIEVJT30sCisJeyJjb3JydXB0ZWQgc3VwZXIgYmxvY2siLCBFSU99LAorCXsicHJvdG9jb2wgYm90Y2giLCBFUFJPVE99LAorCXsiZmlsZSBzeXN0ZW0gaXMgZnVsbCIsIEVOT1NQQ30sCisJeyJmaWxlIGlzIGluIHVzZSIsIEVBR0FJTn0sCisJeyJkaXJlY3RvcnkgZW50cnkgaXMgbm90IGFsbG9jYXRlZCIsIEVOT0VOVH0sCisJeyJmaWxlIGlzIHJlYWQgb25seSIsIEVST0ZTfSwKKwl7ImZpbGUgaGFzIGJlZW4gcmVtb3ZlZCIsIEVJRFJNfSwKKwl7Im9ubHkgc3VwcG9ydCB0cnVuY2F0aW9uIHRvIHplcm8gbGVuZ3RoIiwgRVBFUk19LAorCXsiY2Fubm90IHJlbW92ZSByb290IiwgRVBFUk19LAorCXsiZmlsZSB0b28gYmlnIiwgRUZCSUd9LAorCXsidmVudGkgaS9vIGVycm9yIiwgRUlPfSwKKwkvKiB0aGVzZSBhcmUgbm90IGVycm9ycyAqLworCXsidTlmcyByaG9zdHNhdXRoOiBubyBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCIsIDB9LAorCXsidTlmcyBhdXRobm9uZTogbm8gYXV0aGVudGljYXRpb24gcmVxdWlyZWQiLCAwfSwKKwl7TlVMTCwgLTF9Cit9OworCitleHRlcm4gaW50IHY5ZnNfZXJyb3JfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgdjlmc19lcnJzdHIyZXJybm8oY2hhciAqZXJyc3RyKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL2ZpZC5jIGIvZnMvOXAvZmlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIxYzljNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL2ZpZC5jCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogVjlGUyBGSUQgTWFuYWdlbWVudAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInY5ZnMuaCIKKyNpbmNsdWRlICI5cC5oIgorI2luY2x1ZGUgInY5ZnNfdmZzLmgiCisjaW5jbHVkZSAidHJhbnNwb3J0LmgiCisjaW5jbHVkZSAibXV4LmgiCisjaW5jbHVkZSAiY29udi5oIgorI2luY2x1ZGUgImZpZC5oIgorCisvKioKKyAqIHY5ZnNfZmlkX2luc2VydCAtIGFkZCBhIGZpZCB0byBhIGRlbnRyeQorICogQGZpZDogZmlkIHRvIGFkZAorICogQGRlbnRyeTogZGVudHJ5IHRoYXQgaXQgaXMgYmVpbmcgYWRkZWQgdG8KKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX2ZpZF9pbnNlcnQoc3RydWN0IHY5ZnNfZmlkICpmaWQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpmaWRfbGlzdCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopZGVudHJ5LT5kX2ZzZGF0YTsKKwlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkICglcCkgZGVudHJ5ICVzICglcClcbiIsIGZpZC0+ZmlkLCBmaWQsCisJCWRlbnRyeS0+ZF9pbmFtZSwgZGVudHJ5KTsKKwlpZiAoZGVudHJ5LT5kX2ZzZGF0YSA9PSBOVUxMKSB7CisJCWRlbnRyeS0+ZF9mc2RhdGEgPQorCQkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksIEdGUF9LRVJORUwpOworCQlpZiAoZGVudHJ5LT5kX2ZzZGF0YSA9PSBOVUxMKSB7CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlmaWRfbGlzdCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopZGVudHJ5LT5kX2ZzZGF0YTsKKwkJSU5JVF9MSVNUX0hFQUQoZmlkX2xpc3QpOwkvKiBJbml0aWFsaXplIGxpc3QgaGVhZCAqLworCX0KKworCWZpZC0+dWlkID0gY3VycmVudC0+dWlkOworCWZpZC0+cGlkID0gY3VycmVudC0+cGlkOworCWxpc3RfYWRkKCZmaWQtPmxpc3QsIGZpZF9saXN0KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2OWZzX2ZpZF9jcmVhdGUgLSBhbGxvY2F0ZSBhIEZJRCBzdHJ1Y3R1cmUKKyAqIEBkZW50cnkgLSBkZW50cnkgdG8gbGluayBuZXdseSBjcmVhdGVkIGZpZCB0bworICoKKyAqLworCitzdHJ1Y3Qgdjlmc19maWQgKnY5ZnNfZmlkX2NyZWF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHY5ZnNfZmlkICpuZXc7CisKKwluZXcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdjlmc19maWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAobmV3ID09IE5VTEwpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIk91dCBvZiBNZW1vcnlcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwluZXctPmZpZCA9IC0xOworCW5ldy0+Zmlkb3BlbiA9IDA7CisJbmV3LT5maWRjcmVhdGUgPSAwOworCW5ldy0+ZmlkY2x1bmtlZCA9IDA7CisJbmV3LT5pb3VuaXQgPSAwOworCisJaWYgKHY5ZnNfZmlkX2luc2VydChuZXcsIGRlbnRyeSkgPT0gMCkKKwkJcmV0dXJuIG5ldzsKKwllbHNlIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIlByb2JsZW1zIGluc2VydGluZyB0byBkZW50cnlcbiIpOworCQlrZnJlZShuZXcpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8qKgorICogdjlmc19maWRfZGVzdHJveSAtIGRlYWxsb2NhdGUgYSBGSUQgc3RydWN0dXJlCisgKiBAZmlkOiBmaWQgdG8gZGVzdHJveQorICoKKyAqLworCit2b2lkIHY5ZnNfZmlkX2Rlc3Ryb3koc3RydWN0IHY5ZnNfZmlkICpmaWQpCit7CisJbGlzdF9kZWwoJmZpZC0+bGlzdCk7CisJa2ZyZWUoZmlkKTsKK30KKworLyoqCisgKiB2OWZzX2ZpZF9sb29rdXAgLSByZXRyaWV2ZSB0aGUgcmlnaHQgZmlkIGZyb20gYSAgcGFydGljdWxhciBkZW50cnkKKyAqIEBkZW50cnk6IGRlbnRyeSB0byBsb29rIGZvciBmaWQgaW4KKyAqIEB0eXBlOiBpbnRlbnQgb2YgbG9va3VwIChvcGVyYXRpb24gb3IgdHJhdmVyc2FsKQorICoKKyAqIHNlYXJjaCBsaXN0IG9mIGZpZHMgYXNzb2NpYXRlZCB3aXRoIGEgZGVudHJ5IGZvciBhIGZpZCB3aXRoIGEgbWF0Y2hpbmcKKyAqIHRocmVhZCBpZCBvciB1aWQuICBJZiB0aGF0IGZhaWxzLCBsb29rIHVwIHRoZSBkZW50cnkncyBwYXJlbnRzIHRvIHNlZSBpZiB5b3UKKyAqIGNhbiBmaW5kIGEgbWF0Y2hpbmcgZmlkLgorICoKKyAqLworCitzdHJ1Y3Qgdjlmc19maWQgKnY5ZnNfZmlkX2xvb2t1cChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCB0eXBlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmZpZF9saXN0ID0gKHN0cnVjdCBsaXN0X2hlYWQgKilkZW50cnktPmRfZnNkYXRhOworCXN0cnVjdCB2OWZzX2ZpZCAqY3VycmVudF9maWQgPSBOVUxMOworCXN0cnVjdCB2OWZzX2ZpZCAqdGVtcCA9IE5VTEw7CisJc3RydWN0IHY5ZnNfZmlkICpyZXR1cm5fZmlkID0gTlVMTDsKKwlpbnQgZm91bmRfcGFyZW50ID0gMDsKKwlpbnQgZm91bmRfdXNlciA9IDA7CisKKwlkcHJpbnRrKERFQlVHXzlQLCAiIGRlbnRyeTogJXMgKCVwKSB0eXBlICVkXG4iLCBkZW50cnktPmRfaW5hbWUsIGRlbnRyeSwKKwkJdHlwZSk7CisKKwlpZiAoZmlkX2xpc3QgJiYgIWxpc3RfZW1wdHkoZmlkX2xpc3QpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdXJyZW50X2ZpZCwgdGVtcCwgZmlkX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChjdXJyZW50X2ZpZC0+dWlkID09IGN1cnJlbnQtPnVpZCkgeworCQkJCWlmIChyZXR1cm5fZmlkID09IE5VTEwpIHsKKwkJCQkJaWYgKCh0eXBlID09IEZJRF9PUCkKKwkJCQkJICAgIHx8ICghY3VycmVudF9maWQtPmZpZG9wZW4pKSB7CisJCQkJCQlyZXR1cm5fZmlkID0gY3VycmVudF9maWQ7CisJCQkJCQlmb3VuZF91c2VyID0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChjdXJyZW50X2ZpZC0+cGlkID09IGN1cnJlbnQtPnJlYWxfcGFyZW50LT5waWQpIHsKKwkJCQlpZiAoKHJldHVybl9maWQgPT0gTlVMTCkgfHwgKGZvdW5kX3BhcmVudCkKKwkJCQkgICAgfHwgKGZvdW5kX3VzZXIpKSB7CisJCQkJCWlmICgodHlwZSA9PSBGSURfT1ApCisJCQkJCSAgICB8fCAoIWN1cnJlbnRfZmlkLT5maWRvcGVuKSkgeworCQkJCQkJcmV0dXJuX2ZpZCA9IGN1cnJlbnRfZmlkOworCQkJCQkJZm91bmRfcGFyZW50ID0gMTsKKwkJCQkJCWZvdW5kX3VzZXIgPSAwOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGN1cnJlbnRfZmlkLT5waWQgPT0gY3VycmVudC0+cGlkKSB7CisJCQkJaWYgKCh0eXBlID09IEZJRF9PUCkgfHwKKwkJCQkgICAgKCFjdXJyZW50X2ZpZC0+Zmlkb3BlbikpIHsKKwkJCQkJcmV0dXJuX2ZpZCA9IGN1cnJlbnRfZmlkOworCQkJCQlmb3VuZF9wYXJlbnQgPSAwOworCQkJCQlmb3VuZF91c2VyID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiB3ZSBhcmUgYXQgdGhlIHJvb3QgYnV0IGRpZG4ndCBtYXRjaCAqLworCWlmICgoIXJldHVybl9maWQpICYmIChkZW50cnktPmRfcGFyZW50ID09IGRlbnRyeSkpIHsKKwkJLyogVE9ETzogY2xvbmUgYXR0YWNoIHdpdGggbmV3IHVpZCAqLworCQlyZXR1cm5fZmlkID0gY3VycmVudF9maWQ7CisJfQorCisJaWYgKCFyZXR1cm5fZmlkKSB7CisJCXN0cnVjdCBkZW50cnkgKnBhciA9IGN1cnJlbnQtPmZzLT5wd2QtPmRfcGFyZW50OworCQlpbnQgY291bnQgPSAxOworCQl3aGlsZSAocGFyICE9IE5VTEwpIHsKKwkJCWlmIChwYXIgPT0gZGVudHJ5KQorCQkJCWJyZWFrOworCQkJY291bnQrKzsKKwkJCWlmIChwYXIgPT0gcGFyLT5kX3BhcmVudCkgeworCQkJCWRwcmludGsoREVCVUdfRVJST1IsCisJCQkJCSJnb3QgdG8gcm9vdCB3aXRob3V0IGZpbmRpbmcgZGVudHJ5XG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBhciA9IHBhci0+ZF9wYXJlbnQ7CisJCX0KKworLyogWFhYIC0gdGhlcmUgbWF5IGJlIHNvbWUgZHVwbGljYXRpb24gd2UgY2FuIGdldCByaWQgb2YgKi8KKwkJaWYgKHBhciA9PSBkZW50cnkpIHsKKwkJCS8qIHdlIG5lZWQgdG8gZmlkX2xvb2t1cCB0aGUgc3RhcnRpbmcgcG9pbnQgKi8KKwkJCWludCBmaWRudW0gPSAtMTsKKwkJCWludCBvbGRmaWQgPSAtMTsKKwkJCWludCByZXN1bHQgPSAtMTsKKwkJCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPQorCQkJICAgIHY5ZnNfaW5vZGUydjlzZXMoY3VycmVudC0+ZnMtPnB3ZC0+ZF9pbm9kZSk7CisKKwkJCWN1cnJlbnRfZmlkID0KKwkJCSAgICB2OWZzX2ZpZF9sb29rdXAoY3VycmVudC0+ZnMtPnB3ZCwgRklEX1dBTEspOworCQkJaWYgKGN1cnJlbnRfZmlkID09IE5VTEwpIHsKKwkJCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJCQkicHJvY2VzcyBjd2QgZG9lc24ndCBoYXZlIGEgZmlkXG4iKTsKKwkJCQlyZXR1cm4gcmV0dXJuX2ZpZDsKKwkJCX0KKwkJCW9sZGZpZCA9IGN1cnJlbnRfZmlkLT5maWQ7CisJCQlwYXIgPSBjdXJyZW50LT5mcy0+cHdkOworCQkJLyogVE9ETzogdGFrZSBhZHZhbnRhZ2Ugb2YgbXVsdGl3YWxrICovCisKKwkJCWZpZG51bSA9IHY5ZnNfZ2V0X2lkcG9vbCgmdjlzZXMtPmZpZHBvb2wpOworCQkJaWYgKGZpZG51bSA8IDApIHsKKwkJCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJCQkiY291bGQgbm90IGdldCBhIG5ldyBmaWQgbnVtXG4iKTsKKwkJCQlyZXR1cm4gcmV0dXJuX2ZpZDsKKwkJCX0KKworCQkJd2hpbGUgKHBhciAhPSBkZW50cnkpIHsKKwkJCQlyZXN1bHQgPQorCQkJCSAgICB2OWZzX3Rfd2Fsayh2OXNlcywgb2xkZmlkLCBmaWRudW0sICIuLiIsCisJCQkJCQlOVUxMKTsKKwkJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJCQkJInByb2JsZW0gd2Fsa2luZyB0byBwYXJlbnRcbiIpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlvbGRmaWQgPSBmaWRudW07CisJCQkJaWYgKHBhciA9PSBwYXItPmRfcGFyZW50KSB7CisJCQkJCWRwcmludGsoREVCVUdfRVJST1IsCisJCQkJCQkiY2FuJ3QgZmluZCBkZW50cnlcbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcGFyID0gcGFyLT5kX3BhcmVudDsKKwkJCX0KKwkJCWlmIChwYXIgPT0gZGVudHJ5KSB7CisJCQkJcmV0dXJuX2ZpZCA9IHY5ZnNfZmlkX2NyZWF0ZShkZW50cnkpOworCQkJCXJldHVybl9maWQtPmZpZCA9IGZpZG51bTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXR1cm5fZmlkOworfQpkaWZmIC0tZ2l0IGEvZnMvOXAvZmlkLmggYi9mcy85cC9maWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGI0NzhjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvOXAvZmlkLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIFY5RlMgRklEIE1hbmFnZW1lbnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjZGVmaW5lIEZJRF9PUCAgIDAKKyNkZWZpbmUgRklEX1dBTEsgMQorCitzdHJ1Y3Qgdjlmc19maWQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJIC8qIGxpc3Qgb2YgZmlkcyBhc3NvY2lhdGVkIHdpdGggYSBkZW50cnkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZTsgLyogWFhYIC0gZGVidWcgKi8KKworCXUzMiBmaWQ7CisJdW5zaWduZWQgY2hhciBmaWRvcGVuOwkgIC8qIHNldCB3aGVuIGZpZCBpcyBvcGVuZWQgKi8KKwl1bnNpZ25lZCBjaGFyIGZpZGNyZWF0ZTsgIC8qIHNldCB3aGVuIGZpZCB3YXMganVzdCBjcmVhdGVkICovCisJdW5zaWduZWQgY2hhciBmaWRjbHVua2VkOyAvKiBzZXQgd2hlbiBmaWQgaGFzIGFscmVhZHkgYmVlbiBjbHVua2VkICovCisKKwlzdHJ1Y3Qgdjlmc19xaWQgcWlkOworCXUzMiBpb3VuaXQ7CisKKwkvKiByZWFkZGlyIHN0dWZmICovCisJaW50IHJkaXJfZnBvczsKKwlsb2ZmX3QgcmRpcl9wb3M7CisJc3RydWN0IHY5ZnNfZmNhbGwgKnJkaXJfZmNhbGw7CisKKwkvKiBtYW5hZ2VtZW50IHN0dWZmICovCisJcGlkX3QgcGlkOwkJLyogdGhyZWFkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpZCAqLworCXVpZF90IHVpZDsJCS8qIHVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlkICovCisKKwkvKiBwcml2YXRlIGRhdGEgKi8KKwlzdHJ1Y3QgZmlsZSAqZmlscDsJLyogYmFja3BvaW50ZXIgdG8gRmlsZSBzdHJ1Y3QgZm9yIG9wZW4gZmlsZXMgKi8KKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOwkvKiBzZXNzaW9uIGluZm8gZm9yIHRoaXMgRklEICovCit9OworCitzdHJ1Y3Qgdjlmc19maWQgKnY5ZnNfZmlkX2xvb2t1cChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCB0eXBlKTsKK3ZvaWQgdjlmc19maWRfZGVzdHJveShzdHJ1Y3Qgdjlmc19maWQgKmZpZCk7CitzdHJ1Y3Qgdjlmc19maWQgKnY5ZnNfZmlkX2NyZWF0ZShzdHJ1Y3QgZGVudHJ5ICopOwpkaWZmIC0tZ2l0IGEvZnMvOXAvbXV4LmMgYi9mcy85cC9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODM1YjU3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvOXAvbXV4LmMKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiBsaW51eC9mcy85cC9tdXguYworICoKKyAqIFByb3RvY29sIE11bHRpcGxleGVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBMYXRjaGVzYXIgSW9ua292IDxsdWNob0Bpb25rb3YubmV0PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInY5ZnMuaCIKKyNpbmNsdWRlICI5cC5oIgorI2luY2x1ZGUgInRyYW5zcG9ydC5oIgorI2luY2x1ZGUgImNvbnYuaCIKKyNpbmNsdWRlICJtdXguaCIKKworLyoqCisgKiBkcHJpbnRjb25kIC0gcHJpbnQgY29uZGl0aW9uIG9mIHNlc3Npb24gaW5mbworICogQHY5c2VzOiBzZXNzaW9uIGluZm8gc3RydWN0dXJlCisgKiBAcmVxOiBSUEMgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqCisgKi8KKworc3RhdGljIGlubGluZSBpbnQKK2RwcmludGNvbmQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHY5ZnNfcnBjcmVxICpyZXEpCit7CisJZHByaW50ayhERUJVR19NVVgsICJjb25kaXRpb246ICVkLCAlcFxuIiwgdjlzZXMtPnRyYW5zcG9ydC0+c3RhdHVzLAorCQlyZXEtPnJjYWxsKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB4cmVhZCAtIGZvcmNlIHJlYWQgb2YgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcworICogQHY5c2VzOiBzZXNzaW9uIGluZm8gc3RydWN0dXJlCisgKiBAcHRyOiBwb2ludGVyIHRvIGJ1ZmZlcgorICogQHN6OiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICoKKyAqIENodWNrIENyYW5vciBDUy01MzMgcHJvamVjdDEKKyAqLworCitzdGF0aWMgaW50IHhyZWFkKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBzeikKK3sKKwlpbnQgcmQgPSAwOworCWludCByZXQgPSAwOworCXdoaWxlIChyZCA8IHN6KSB7CisJCXJldCA9IHY5c2VzLT50cmFuc3BvcnQtPnJlYWQodjlzZXMtPnRyYW5zcG9ydCwgcHRyLCBzeiAtIHJkKTsKKwkJaWYgKHJldCA8PSAwKSB7CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAieHJlYWQgZXJybm8gJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJkICs9IHJldDsKKwkJcHRyICs9IHJldDsKKwl9CisJcmV0dXJuIChyZCk7Cit9CisKKy8qKgorICogcmVhZF9tZXNzYWdlIC0gcmVhZCBhIGZ1bGwgOVAyMDAwIGZjYWxsIHBhY2tldAorICogQHY5c2VzOiBzZXNzaW9uIGluZm8gc3RydWN0dXJlCisgKiBAcmNhbGw6IGZjYWxsIHN0cnVjdHVyZSB0byByZWFkIGludG8KKyAqIEByY2FsbGxlbjogc2l6ZSBvZiBmY2FsbCBidWZmZXIKKyAqCisgKi8KKworc3RhdGljIGludAorcmVhZF9tZXNzYWdlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsCisJICAgICBzdHJ1Y3Qgdjlmc19mY2FsbCAqcmNhbGwsIGludCByY2FsbGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKwl2b2lkICpkYXRhOworCWludCBzaXplID0gMDsKKwlpbnQgcmVzID0gMDsKKworCXJlcyA9IHhyZWFkKHY5c2VzLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAocmVzIDwgMCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJIlJlYWRpbmcgb2YgY291bnQgZmllbGQgZmFpbGVkIHJldHVybmVkOiAlZFxuIiwgcmVzKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlpZiAocmVzIDwgNCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJIlJlYWRpbmcgb2YgY291bnQgZmllbGQgZmFpbGVkIHJldHVybmVkOiAlZFxuIiwgcmVzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc2l6ZSA9IGJ1ZlswXSB8IChidWZbMV0gPDwgOCkgfCAoYnVmWzJdIDw8IDE2KSB8IChidWZbM10gPDwgMjQpOworCWRwcmludGsoREVCVUdfTVVYLCAiZ290IGEgcGFja2V0IGNvdW50OiAlZFxuIiwgc2l6ZSk7CisKKwkvKiBhZGp1c3QgZm9yIHRoZSBmb3VyIGJ5dGVzIG9mIHNpemUgKi8KKwlzaXplIC09IDQ7CisKKwlpZiAoc2l6ZSA+IHY5c2VzLT5tYXhkYXRhKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJwYWNrZXQgdG9vIGJpZzogJWRcbiIsIHNpemUpOworCQlyZXR1cm4gLUUyQklHOworCX0KKworCWRhdGEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQllcHJpbnRrKEtFUk5fV0FSTklORywgIm91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXMgPSB4cmVhZCh2OXNlcywgZGF0YSwgc2l6ZSk7CisJaWYgKHJlcyA8IHNpemUpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIlJlYWRpbmcgb2YgZmNhbGwgZmFpbGVkIHJldHVybmVkOiAlZFxuIiwKKwkJCXJlcyk7CisJCWtmcmVlKGRhdGEpOworCQlyZXR1cm4gcmVzOworCX0KKworCS8qIHdlIG5vdyBoYXZlIGFuIGluLW1lbW9yeSBzdHJpbmcgdGhhdCBpcyB0aGUgcmVwbHkuCisJICogZGVzZXJpYWxpemUgaXQuIFRoZXJlIGlzIHZlcnkgbGl0dGxlIHRvIGdvIHdyb25nIGF0IHRoaXMgcG9pbnQKKwkgKiBzYXZlIGZvciB2OWZzX2FsbG9jIGVycm9ycy4KKwkgKi8KKwlyZXMgPSB2OWZzX2Rlc2VyaWFsaXplX2ZjYWxsKHY5c2VzLCBzaXplLCBkYXRhLCB2OXNlcy0+bWF4ZGF0YSwKKwkJCQkgICAgIHJjYWxsLCByY2FsbGxlbik7CisKKwlrZnJlZShkYXRhKTsKKworCWlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdjlmc19yZWN2IC0gcmVjZWl2ZSBhbiBSUEMgcmVzcG9uc2UgZm9yIGEgcGFydGljdWxhciB0YWcKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvIHN0cnVjdHVyZQorICogQHJlcTogUlBDIHJlcXVlc3Qgc3RydWN0dXJlCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc19yZWN2KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCB2OWZzX3JwY3JlcSAqcmVxKQoreworCWludCByZXQgPSAwOworCisJZHByaW50ayhERUJVR19NVVgsICJ3YWl0aW5nIGZvciByZXNwb25zZTogJWRcbiIsIHJlcS0+dGNhbGwtPnRhZyk7CisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHY5c2VzLT5yZWFkX3dhaXQsCisJCSAgICAgICAoKHY5c2VzLT50cmFuc3BvcnQtPnN0YXR1cyAhPSBDb25uZWN0ZWQpIHx8CisJCQkocmVxLT5yY2FsbCAhPSAwKSB8fCAocmVxLT5lcnIgPCAwKSB8fAorCQkJZHByaW50Y29uZCh2OXNlcywgcmVxKSkpOworCisJZHByaW50ayhERUJVR19NVVgsICJnb3QgaXQ6IHJjYWxsICVwXG4iLCByZXEtPnJjYWxsKTsKKworCXNwaW5fbG9jaygmdjlzZXMtPm11eGxvY2spOworCWxpc3RfZGVsKCZyZXEtPm5leHQpOworCXNwaW5fdW5sb2NrKCZ2OXNlcy0+bXV4bG9jayk7CisKKwlpZiAocmVxLT5lcnIgPCAwKQorCQlyZXR1cm4gcmVxLT5lcnI7CisKKwlpZiAodjlzZXMtPnRyYW5zcG9ydC0+c3RhdHVzID09IERpc2Nvbm5lY3RlZCkKKwkJcmV0dXJuIC1FQ09OTlJFU0VUOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB2OWZzX3NlbmQgLSBzZW5kIGEgOVAgcmVxdWVzdAorICogQHY5c2VzOiBzZXNzaW9uIGluZm8gc3RydWN0dXJlCisgKiBAcmVxOiBSUEMgcmVxdWVzdCB0byBzZW5kCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc19zZW5kKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCB2OWZzX3JwY3JlcSAqcmVxKQoreworCWludCByZXQgPSAtMTsKKwl2b2lkICpkYXRhID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqdGNhbGwgPSByZXEtPnRjYWxsOworCisJZGF0YSA9IGttYWxsb2ModjlzZXMtPm1heGRhdGEgKyBWOUZTX0lPSERSU1osIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0Y2FsbC0+c2l6ZSA9IDA7CS8qIGVuZm9yY2Ugc2l6ZSByZWNhbGN1bGF0aW9uICovCisJcmV0ID0KKwkgICAgdjlmc19zZXJpYWxpemVfZmNhbGwodjlzZXMsIHRjYWxsLCBkYXRhLAorCQkJCSB2OXNlcy0+bWF4ZGF0YSArIFY5RlNfSU9IRFJTWik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZnJlZV9kYXRhOworCisJc3Bpbl9sb2NrKCZ2OXNlcy0+bXV4bG9jayk7CisJbGlzdF9hZGQoJnJlcS0+bmV4dCwgJnY5c2VzLT5tdXhfZmNhbGxzKTsKKwlzcGluX3VubG9jaygmdjlzZXMtPm11eGxvY2spOworCisJZHByaW50ayhERUJVR19NVVgsICJzZW5kaW5nIG1lc3NhZ2U6IHRhZyAlZCBzaXplICVkXG4iLCB0Y2FsbC0+dGFnLAorCQl0Y2FsbC0+c2l6ZSk7CisJcmV0ID0gdjlzZXMtPnRyYW5zcG9ydC0+d3JpdGUodjlzZXMtPnRyYW5zcG9ydCwgZGF0YSwgdGNhbGwtPnNpemUpOworCisJaWYgKHJldCAhPSB0Y2FsbC0+c2l6ZSkgeworCQlzcGluX2xvY2soJnY5c2VzLT5tdXhsb2NrKTsKKwkJbGlzdF9kZWwoJnJlcS0+bmV4dCk7CisJCWtmcmVlKHJlcS0+cmNhbGwpOworCisJCXNwaW5fdW5sb2NrKCZ2OXNlcy0+bXV4bG9jayk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IC1FUkVNT1RFSU87CisJfSBlbHNlCisJCXJldCA9IDA7CisKKyAgICAgIGZyZWVfZGF0YToKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHY5ZnNfbXV4X3JwYyAtIHNlbmQgYSByZXF1ZXN0LCByZWNlaXZlIGEgcmVzcG9uc2UKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvIHN0cnVjdHVyZQorICogQHRjYWxsOiBmY2FsbCB0byBzZW5kCisgKiBAcmNhbGw6IGJ1ZmZlciB0byBwbGFjZSByZXNwb25zZSBpbnRvCisgKgorICovCisKK2xvbmcKK3Y5ZnNfbXV4X3JwYyhzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqdGNhbGwsCisJICAgICBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKQoreworCWludCB0aWQgPSAtMTsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOworCXN0cnVjdCB2OWZzX3JwY3JlcSByZXE7CisJaW50IHJldCA9IC0xOworCisJaWYgKCF2OXNlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXY5c2VzLT50cmFuc3BvcnQgfHwgdjlzZXMtPnRyYW5zcG9ydC0+c3RhdHVzICE9IENvbm5lY3RlZCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAocmNhbGwpCisJCSpyY2FsbCA9IE5VTEw7CisKKwlpZiAodGNhbGwtPmlkICE9IFRWRVJTSU9OKSB7CisJCXRpZCA9IHY5ZnNfZ2V0X2lkcG9vbCgmdjlzZXMtPnRpZHBvb2wpOworCQlpZiAodGlkIDwgMCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXRjYWxsLT50YWcgPSB0aWQ7CisKKwlyZXEudGNhbGwgPSB0Y2FsbDsKKwlyZXEuZXJyID0gMDsKKwlyZXEucmNhbGwgPSBOVUxMOworCisJcmV0ID0gdjlmc19zZW5kKHY5c2VzLCAmcmVxKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWlmICh0Y2FsbC0+aWQgIT0gVFZFUlNJT04pCisJCQl2OWZzX3B1dF9pZHBvb2wodGlkLCAmdjlzZXMtPnRpZHBvb2wpOworCQlkcHJpbnRrKERFQlVHX01VWCwgImVycm9yICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHY5ZnNfcmVjdih2OXNlcywgJnJlcSk7CisKKwlmY2FsbCA9IHJlcS5yY2FsbDsKKworCWRwcmludGsoREVCVUdfTVVYLCAicmVjZWl2ZWQ6IHRhZz0leCwgcmV0PSVkXG4iLCB0Y2FsbC0+dGFnLCByZXQpOworCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKSB7CisJCWlmICh2OXNlcy0+dHJhbnNwb3J0LT5zdGF0dXMgIT0gRGlzY29ubmVjdGVkCisJCSAgICAmJiB0Y2FsbC0+aWQgIT0gVEZMVVNIKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCQlkcHJpbnRrKERFQlVHX01VWCwgImZsdXNoaW5nIHRoZSB0YWc6ICVkXG4iLAorCQkJCXRjYWxsLT50YWcpOworCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NJR1BFTkRJTkcpOworCQkJdjlmc190X2ZsdXNoKHY5c2VzLCB0Y2FsbC0+dGFnKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCQlyZWNhbGNfc2lncGVuZGluZygpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywKKwkJCQkJICAgICAgIGZsYWdzKTsKKwkJCWRwcmludGsoREVCVUdfTVVYLCAiZmx1c2hpbmcgZG9uZVxuIik7CisJCX0KKworCQlnb3RvIHJlbGVhc2VfcmVxOworCX0gZWxzZSBpZiAocmV0IDwgMCkKKwkJZ290byByZWxlYXNlX3JlcTsKKworCWlmICghZmNhbGwpCisJCXJldCA9IC1FSU87CisJZWxzZSB7CisJCWlmIChmY2FsbC0+aWQgPT0gUkVSUk9SKSB7CisJCQlyZXQgPSB2OWZzX2VycnN0cjJlcnJubyhmY2FsbC0+cGFyYW1zLnJlcnJvci5lcnJvcik7CisJCQlpZiAocmV0ID09IDApIHsJLyogc3RyaW5nIG1hdGNoIGZhaWxlZCAqLworCQkJCWlmIChmY2FsbC0+cGFyYW1zLnJlcnJvci5lcnJubykKKwkJCQkJcmV0ID0gLShmY2FsbC0+cGFyYW1zLnJlcnJvci5lcnJubyk7CisJCQkJZWxzZQorCQkJCQlyZXQgPSAtRVNFUlZFUkZBVUxUOworCQkJfQorCQl9IGVsc2UgaWYgKGZjYWxsLT5pZCAhPSB0Y2FsbC0+aWQgKyAxKSB7CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJCSJmY2FsbCBtaXNtYXRjaDogZXhwZWN0ZWQgJWQsIGdvdCAlZFxuIiwKKwkJCQl0Y2FsbC0+aWQgKyAxLCBmY2FsbC0+aWQpOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCX0KKworICAgICAgcmVsZWFzZV9yZXE6CisJaWYgKHRjYWxsLT5pZCAhPSBUVkVSU0lPTikKKwkJdjlmc19wdXRfaWRwb29sKHRpZCwgJnY5c2VzLT50aWRwb29sKTsKKwlpZiAocmNhbGwpCisJCSpyY2FsbCA9IGZjYWxsOworCWVsc2UKKwkJa2ZyZWUoZmNhbGwpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB2OWZzX211eF9jYW5jZWxfcmVxdWVzdHMgLSBjYW5jZWxzIGFsbCBwZW5kaW5nIHJlcXVlc3RzCisgKgorICogQHY5c2VzOiBzZXNzaW9uIGluZm8gc3RydWN0dXJlCisgKiBAZXJyOiBlcnJvciBjb2RlIHRvIHJldHVybiB0byB0aGUgcmVxdWVzdHMKKyAqLwordm9pZCB2OWZzX211eF9jYW5jZWxfcmVxdWVzdHMoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgaW50IGVycikKK3sKKwlzdHJ1Y3Qgdjlmc19ycGNyZXEgKnJwdHI7CisJc3RydWN0IHY5ZnNfcnBjcmVxICpycmVxOworCisJZHByaW50ayhERUJVR19NVVgsICIgJWRcbiIsIGVycik7CisJc3Bpbl9sb2NrKCZ2OXNlcy0+bXV4bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJyZXEsIHJwdHIsICZ2OXNlcy0+bXV4X2ZjYWxscywgbmV4dCkgeworCQlycmVxLT5lcnIgPSBlcnI7CisJfQorCXNwaW5fdW5sb2NrKCZ2OXNlcy0+bXV4bG9jayk7CisJd2FrZV91cF9hbGwoJnY5c2VzLT5yZWFkX3dhaXQpOworfQorCisvKioKKyAqIHY5ZnNfcmVjdnByb2MgLSBrcHJvYyB0byBoYW5kbGUgZGVtdWx0aXBsZXhpbmcgcmVzcG9uc2VzCisgKiBAZGF0YTogc2Vzc2lvbiBpbmZvIHN0cnVjdHVyZQorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfcmVjdnByb2Modm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqKWRhdGE7CisJc3RydWN0IHY5ZnNfZmNhbGwgKnJjYWxsID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19ycGNyZXEgKnJwdHI7CisJc3RydWN0IHY5ZnNfcnBjcmVxICpyZXE7CisJc3RydWN0IHY5ZnNfcnBjcmVxICpycmVxOworCWludCBlcnIgPSAwOworCisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJY29tcGxldGUoJnY5c2VzLT5wcm9jY21wbCk7CisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgZXJyID49IDApIHsKKwkJcmVxID0gcnB0ciA9IHJyZXEgPSBOVUxMOworCisJCXJjYWxsID0ga21hbGxvYyh2OXNlcy0+bWF4ZGF0YSArIFY5RlNfSU9IRFJTWiwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmNhbGwpIHsKKwkJCWVwcmludGsoS0VSTl9FUlIsICJubyBtZW1vcnkgZm9yIGJ1ZmZlcnNcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQllcnIgPSByZWFkX21lc3NhZ2UodjlzZXMsIHJjYWxsLCB2OXNlcy0+bWF4ZGF0YSArIFY5RlNfSU9IRFJTWik7CisJCXNwaW5fbG9jaygmdjlzZXMtPm11eGxvY2spOworCQlpZiAoZXJyIDwgMCkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJyZXEsIHJwdHIsICZ2OXNlcy0+bXV4X2ZjYWxscywgbmV4dCkgeworCQkJCXJyZXEtPmVyciA9IGVycjsKKwkJCX0KKwkJCWlmKGVyciAhPSAtRVJFU1RBUlRTWVMpCisJCQkJZXByaW50ayhLRVJOX0VSUiwKKwkJCQkJIlRyYW5zcG9ydCBlcnJvciB3aGlsZSByZWFkaW5nIG1lc3NhZ2UgJWRcbiIsIGVycik7CisJCX0gZWxzZSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnJlcSwgcnB0ciwgJnY5c2VzLT5tdXhfZmNhbGxzLCBuZXh0KSB7CisJCQkJaWYgKHJyZXEtPnRjYWxsLT50YWcgPT0gcmNhbGwtPnRhZykgeworCQkJCQlyZXEgPSBycmVxOworCQkJCQlyZXEtPnJjYWxsID0gcmNhbGw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChyZXEgJiYgKHJlcS0+dGNhbGwtPmlkID09IFRGTFVTSCkpIHsKKwkJCXN0cnVjdCB2OWZzX3JwY3JlcSAqdHJlcSA9IE5VTEw7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHJlcSwgcnB0ciwgJnY5c2VzLT5tdXhfZmNhbGxzLCBuZXh0KSB7CisJCQkJaWYgKHRyZXEtPnRjYWxsLT50YWcgPT0KKwkJCQkgICAgcmVxLT50Y2FsbC0+cGFyYW1zLnRmbHVzaC5vbGR0YWcpIHsKKwkJCQkJbGlzdF9kZWwoJnJwdHItPm5leHQpOworCQkJCQlrZnJlZSh0cmVxLT5yY2FsbCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXNwaW5fdW5sb2NrKCZ2OXNlcy0+bXV4bG9jayk7CisKKwkJaWYgKCFyZXEpIHsKKwkJCWlmIChlcnIgPj0gMCkKKwkJCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJCQkidW5leHBlY3RlZCByZXNwb25zZTogaWQgJWQgdGFnICVkXG4iLAorCQkJCQlyY2FsbC0+aWQsIHJjYWxsLT50YWcpOworCisJCQlrZnJlZShyY2FsbCk7CisJCX0KKworCQl3YWtlX3VwX2FsbCgmdjlzZXMtPnJlYWRfd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJfQorCisJdjlzZXMtPnRyYW5zcG9ydC0+Y2xvc2UodjlzZXMtPnRyYW5zcG9ydCk7CisKKwkvKiBJbmZvcm0gYWxsIHBlbmRpbmcgcHJvY2Vzc2VzIGFib3V0IHRoZSBmYWlsdXJlICovCisJd2FrZV91cF9hbGwoJnY5c2VzLT5yZWFkX3dhaXQpOworCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQljb21wbGV0ZSgmdjlzZXMtPnByb2NjbXBsKTsKKworCWRwcmludGsoREVCVUdfTVVYLCAicmVjdnByb2M6IGVuZFxuIik7CisJdjlzZXMtPnJlY3Zwcm9jID0gTlVMTDsKKworCXJldHVybiBlcnIgPj0gMDsKK30KKworLyoqCisgKiB2OWZzX211eF9pbml0IC0gaW5pdGlhbGl6ZSBtdWx0aXBsZXhlciAoc3Bhd24ga3Byb2MpCisgKiBAdjlzZXM6IHNlc3Npb24gaW5mbyBzdHJ1Y3R1cmUKKyAqIEBkZXZfbmFtZTogbW91bnQgZGV2aWNlIGluZm9ybWF0aW9uICh0byBjcmVhdGUgdW5pcXVlIGtwcm9jKQorICoKKyAqLworCitpbnQgdjlmc19tdXhfaW5pdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBjb25zdCBjaGFyICpkZXZfbmFtZSkKK3sKKwljaGFyIHByb2NuYW1lWzYwXTsKKworCXN0cm5jcHkocHJvY25hbWUsIGRldl9uYW1lLCBzaXplb2YocHJvY25hbWUpKTsKKwlwcm9jbmFtZVtzaXplb2YocHJvY25hbWUpIC0gMV0gPSAwOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmdjlzZXMtPnJlYWRfd2FpdCk7CisJaW5pdF9jb21wbGV0aW9uKCZ2OXNlcy0+ZmNyZWFkKTsKKwlpbml0X2NvbXBsZXRpb24oJnY5c2VzLT5wcm9jY21wbCk7CisJc3Bpbl9sb2NrX2luaXQoJnY5c2VzLT5tdXhsb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmdjlzZXMtPm11eF9mY2FsbHMpOworCXY5c2VzLT5yZWN2cHJvYyA9IE5VTEw7CisJdjlzZXMtPmN1cmZjYWxsID0gTlVMTDsKKworCXY5c2VzLT5yZWN2cHJvYyA9IGt0aHJlYWRfY3JlYXRlKHY5ZnNfcmVjdnByb2MsIHY5c2VzLAorCQkJCQkgInY5ZnNfcmVjdnByb2MgJXMiLCBwcm9jbmFtZSk7CisKKwlpZiAoSVNfRVJSKHY5c2VzLT5yZWN2cHJvYykpIHsKKwkJZXByaW50ayhLRVJOX0VSUiwgImNhbm5vdCBjcmVhdGUgcmVjZWl2aW5nIHRocmVhZFxuIik7CisJCXY5ZnNfc2Vzc2lvbl9jbG9zZSh2OXNlcyk7CisJCXJldHVybiAtRUNPTk5BQk9SVEVEOworCX0KKworCXdha2VfdXBfcHJvY2Vzcyh2OXNlcy0+cmVjdnByb2MpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnY5c2VzLT5wcm9jY21wbCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzLzlwL211eC5oIGIvZnMvOXAvbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5NGNiMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL211eC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBsaW51eC9mcy85cC9tdXguaAorICoKKyAqIE11bHRpcGxleGVyIERlZmluaXRpb25zCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworLyogc3RydWN0dXJlIHRvIG1hbmFnZSBlYWNoIFJQQyB0cmFuc2FjdGlvbiAqLworCitzdHJ1Y3Qgdjlmc19ycGNyZXEgeworCXN0cnVjdCB2OWZzX2ZjYWxsICp0Y2FsbDsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqcmNhbGw7CisJaW50IGVycjsJLyogZXJyb3IgY29kZSBpZiByZXNwb25zZSBmYWlsZWQgKi8KKworCS8qIFhYWCAtIGNvdWxkIHdlIHB1dCBzY2F0dGVyL2dhdGhlciBidWZmZXJzIGhlcmU/ICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7Cit9OworCitpbnQgdjlmc19tdXhfaW5pdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBjb25zdCBjaGFyICpkZXZfbmFtZSk7Citsb25nIHY5ZnNfbXV4X3JwYyhzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLAorCQkgIHN0cnVjdCB2OWZzX2ZjYWxsICp0Y2FsbCwgc3RydWN0IHY5ZnNfZmNhbGwgKipyY2FsbCk7Cit2b2lkIHY5ZnNfbXV4X2NhbmNlbF9yZXF1ZXN0cyhzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBpbnQgZXJyKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3RyYW5zX2ZkLmMgYi9mcy85cC90cmFuc19mZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYjU4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC90cmFuc19mZC5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogbGludXgvZnMvOXAvdHJhbnNfZmQuYworICoKKyAqIEZpbGUgRGVzY3JpcHRvciBUcmFuc3BvcnQgTGF5ZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdW4uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInY5ZnMuaCIKKyNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKKworc3RydWN0IHY5ZnNfdHJhbnNfZmQgeworCXN0cnVjdCBmaWxlICppbl9maWxlOworCXN0cnVjdCBmaWxlICpvdXRfZmlsZTsKK307CisKKy8qKgorICogdjlmc19mZF9yZWN2IC0gcmVjZWl2ZSBmcm9tIGEgc29ja2V0CisgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEB2OiBidWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGludG8KKyAqIEBsZW46IHNpemUgb2YgcmVjZWl2ZSBidWZmZXIKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX2ZkX3JlY3Yoc3RydWN0IHY5ZnNfdHJhbnNwb3J0ICp0cmFucywgdm9pZCAqdiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgdjlmc190cmFuc19mZCAqdHMgPSB0cmFucyA/IHRyYW5zLT5wcml2IDogTlVMTDsKKworCWlmICghdHJhbnMgfHwgdHJhbnMtPnN0YXR1cyAhPSBDb25uZWN0ZWQgfHwgIXRzKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBrZXJuZWxfcmVhZCh0cy0+aW5fZmlsZSwgdHMtPmluX2ZpbGUtPmZfcG9zLCB2LCBsZW4pOworfQorCisvKioKKyAqIHY5ZnNfZmRfc2VuZCAtIHNlbmQgdG8gYSBzb2NrZXQKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQHY6IGJ1ZmZlciB0byBzZW5kIGRhdGEgZnJvbQorICogQGxlbjogc2l6ZSBvZiBzZW5kIGJ1ZmZlcgorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfZmRfc2VuZChzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zLCB2b2lkICp2LCBpbnQgbGVuKQoreworCXN0cnVjdCB2OWZzX3RyYW5zX2ZkICp0cyA9IHRyYW5zID8gdHJhbnMtPnByaXYgOiBOVUxMOworCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOworCWludCByZXQgPSAwOworCisJaWYgKCF0cmFucyB8fCB0cmFucy0+c3RhdHVzICE9IENvbm5lY3RlZCB8fCAhdHMpCisJCXJldHVybiAtRUlPOworCisJc2V0X2ZzKGdldF9kcygpKTsKKwkvKiBUaGUgY2FzdCB0byBhIHVzZXIgcG9pbnRlciBpcyB2YWxpZCBkdWUgdG8gdGhlIHNldF9mcygpICovCisJcmV0ID0gdmZzX3dyaXRlKHRzLT5vdXRfZmlsZSwgKHZvaWQgX191c2VyICopdiwgbGVuLCAmdHMtPm91dF9maWxlLT5mX3Bvcyk7CisJc2V0X2ZzKG9sZGZzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdjlmc19mZF9pbml0IC0gaW5pdGlhbGl6ZSBmaWxlIGRlc2NyaXB0b3IgdHJhbnNwb3J0CisgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBhZGRyOiBhZGRyZXNzIG9mIHNlcnZlciB0byBtb3VudAorICogQGRhdGE6IG1vdW50IG9wdGlvbnMKKyAqCisgKi8KKworc3RhdGljIGludAordjlmc19mZF9pbml0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIGNvbnN0IGNoYXIgKmFkZHIsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IHY5ZnNfdHJhbnNfZmQgKnRzID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zID0gdjlzZXMtPnRyYW5zcG9ydDsKKworCWlmKCh2OXNlcy0+d2Zkbm8gPT0gfjApIHx8ICh2OXNlcy0+cmZkbm8gPT0gfjApKSB7CisJCXByaW50ayhLRVJOX0VSUiAidjlmczogSW5zdWZmaWNpZW50IG9wdGlvbnMgZm9yIHByb3RvPWZkXG4iKTsKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwl9CisKKwlzZW1hX2luaXQoJnRyYW5zLT53cml0ZWxvY2ssIDEpOworCXNlbWFfaW5pdCgmdHJhbnMtPnJlYWRsb2NrLCAxKTsKKworCXRzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHY5ZnNfdHJhbnNfZmQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghdHMpCisJCXJldHVybiAtRU5PTUVNOworCisJdHMtPmluX2ZpbGUgPSBmZ2V0KCB2OXNlcy0+cmZkbm8gKTsKKwl0cy0+b3V0X2ZpbGUgPSBmZ2V0KCB2OXNlcy0+d2Zkbm8gKTsKKworCWlmICghdHMtPmluX2ZpbGUgfHwgIXRzLT5vdXRfZmlsZSkgeworCQlpZiAodHMtPmluX2ZpbGUpCisJCQlmcHV0KHRzLT5pbl9maWxlKTsKKworCQlpZiAodHMtPm91dF9maWxlKQorCQkJZnB1dCh0cy0+b3V0X2ZpbGUpOworCisJCWtmcmVlKHRzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJdHJhbnMtPnByaXYgPSB0czsKKwl0cmFucy0+c3RhdHVzID0gQ29ubmVjdGVkOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiB2OWZzX2ZkX2Nsb3NlIC0gc2h1dGRvd24gZmlsZSBkZXNjcmlwdG9yCisgKiBAdHJhbnM6IHByaXZhdGUgc29ja2V0IHN0cnVjdHVyZQorICoKKyAqLworCitzdGF0aWMgdm9pZCB2OWZzX2ZkX2Nsb3NlKHN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqdHJhbnMpCit7CisJc3RydWN0IHY5ZnNfdHJhbnNfZmQgKnRzOworCisJaWYgKCF0cmFucykKKwkJcmV0dXJuOworCisJdHJhbnMtPnN0YXR1cyA9IERpc2Nvbm5lY3RlZDsKKwl0cyA9IHRyYW5zLT5wcml2OworCisJaWYgKCF0cykKKwkJcmV0dXJuOworCisJaWYgKHRzLT5pbl9maWxlKQorCQlmcHV0KHRzLT5pbl9maWxlKTsKKworCWlmICh0cy0+b3V0X2ZpbGUpCisJCWZwdXQodHMtPm91dF9maWxlKTsKKworCWtmcmVlKHRzKTsKK30KKworc3RydWN0IHY5ZnNfdHJhbnNwb3J0IHY5ZnNfdHJhbnNfZmQgPSB7CisJLmluaXQgPSB2OWZzX2ZkX2luaXQsCisJLndyaXRlID0gdjlmc19mZF9zZW5kLAorCS5yZWFkID0gdjlmc19mZF9yZWN2LAorCS5jbG9zZSA9IHY5ZnNfZmRfY2xvc2UsCit9OworCmRpZmYgLS1naXQgYS9mcy85cC90cmFuc19zb2NrLmMgYi9mcy85cC90cmFuc19zb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMjZmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL3RyYW5zX3NvY2suYwpAQCAtMCwwICsxLDI5MCBAQAorLyoKKyAqIGxpbnV4L2ZzLzlwL3RyYW5zX3NvY2tldC5jCisgKgorICogU29ja2V0IFRyYW5zcG9ydCBMYXllcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAc2Fybm9mZi5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IGJ5IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VuLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInY5ZnMuaCIKKyNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKKworI2RlZmluZSBWOUZTX1BPUlQgNTY0CisKK3N0cnVjdCB2OWZzX3RyYW5zX3NvY2sgeworCXN0cnVjdCBzb2NrZXQgKnM7Cit9OworCisvKioKKyAqIHY5ZnNfc29ja19yZWN2IC0gcmVjZWl2ZSBmcm9tIGEgc29ja2V0CisgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEB2OiBidWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGludG8KKyAqIEBsZW46IHNpemUgb2YgcmVjZWl2ZSBidWZmZXIKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX3NvY2tfcmVjdihzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zLCB2b2lkICp2LCBpbnQgbGVuKQoreworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdjsKKwlpbnQgcmVzdWx0OworCW1tX3NlZ21lbnRfdCBvbGRmczsKKwlzdHJ1Y3Qgdjlmc190cmFuc19zb2NrICp0cyA9IHRyYW5zID8gdHJhbnMtPnByaXYgOiBOVUxMOworCisJaWYgKHRyYW5zLT5zdGF0dXMgPT0gRGlzY29ubmVjdGVkKQorCQlyZXR1cm4gLUVSRU1PVEVJTzsKKworCXJlc3VsdCA9IC1FSU5WQUw7CisKKwlvbGRmcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisKKwlpb3YuaW92X2Jhc2UgPSB2OworCWlvdi5pb3ZfbGVuID0gbGVuOworCW1zZy5tc2dfbmFtZSA9IE5VTEw7CisJbXNnLm1zZ19uYW1lbGVuID0gMDsKKwltc2cubXNnX2lvdmxlbiA9IDE7CisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfbmFtZWxlbiA9IDA7CisJbXNnLm1zZ19mbGFncyA9IE1TR19OT1NJR05BTDsKKworCXJlc3VsdCA9IGtlcm5lbF9yZWN2bXNnKHRzLT5zLCAmbXNnLCAmaW92LCAxLCBsZW4sIDApOworCisJZHByaW50ayhERUJVR19UUkFOUywgInNvY2tldCBzdGF0ZSAlZFxuIiwgdHMtPnMtPnN0YXRlKTsKKwlzZXRfZnMob2xkZnMpOworCisJaWYgKHJlc3VsdCA8PSAwKSB7CisJCWlmIChyZXN1bHQgIT0gLUVSRVNUQVJUU1lTKQorCQkJdHJhbnMtPnN0YXR1cyA9IERpc2Nvbm5lY3RlZDsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHY5ZnNfc29ja19zZW5kIC0gc2VuZCB0byBhIHNvY2tldAorICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAdjogYnVmZmVyIHRvIHNlbmQgZGF0YSBmcm9tCisgKiBAbGVuOiBzaXplIG9mIHNlbmQgYnVmZmVyCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc19zb2NrX3NlbmQoc3RydWN0IHY5ZnNfdHJhbnNwb3J0ICp0cmFucywgdm9pZCAqdiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJaW50IHJlc3VsdCA9IC0xOworCW1tX3NlZ21lbnRfdCBvbGRmczsKKwlzdHJ1Y3Qgdjlmc190cmFuc19zb2NrICp0cyA9IHRyYW5zID8gdHJhbnMtPnByaXYgOiBOVUxMOworCisJZHByaW50ayhERUJVR19UUkFOUywgIlNlbmRpbmcgcGFja2V0IHNpemUgJWQgKCV4KVxuIiwgbGVuLCBsZW4pOworCWR1bXBfZGF0YSh2LCBsZW4pOworCisJZG93bigmdHJhbnMtPndyaXRlbG9jayk7CisKKwlvbGRmcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisJaW92Lmlvdl9iYXNlID0gdjsKKwlpb3YuaW92X2xlbiA9IGxlbjsKKwltc2cubXNnX25hbWUgPSBOVUxMOworCW1zZy5tc2dfbmFtZWxlbiA9IDA7CisJbXNnLm1zZ19pb3ZsZW4gPSAxOworCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwltc2cubXNnX25hbWVsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MgPSBNU0dfTk9TSUdOQUw7CisJcmVzdWx0ID0ga2VybmVsX3NlbmRtc2codHMtPnMsICZtc2csICZpb3YsIDEsIGxlbik7CisJc2V0X2ZzKG9sZGZzKTsKKworCWlmIChyZXN1bHQgPCAwKSB7CisJCWlmIChyZXN1bHQgIT0gLUVSRVNUQVJUU1lTKQorCQkJdHJhbnMtPnN0YXR1cyA9IERpc2Nvbm5lY3RlZDsKKwl9CisKKwl1cCgmdHJhbnMtPndyaXRlbG9jayk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiB2OWZzX3RjcF9pbml0IC0gaW5pdGlhbGl6ZSBUQ1Agc29ja2V0CisgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBhZGRyOiBhZGRyZXNzIG9mIHNlcnZlciB0byBtb3VudAorICogQGRhdGE6IG1vdW50IG9wdGlvbnMKKyAqCisgKi8KKworc3RhdGljIGludAordjlmc190Y3BfaW5pdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBjb25zdCBjaGFyICphZGRyLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBzb2NrZXQgKmNzb2NrZXQgPSBOVUxMOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW5fc2VydmVyOworCWludCByYyA9IDA7CisJc3RydWN0IHY5ZnNfdHJhbnNfc29jayAqdHMgPSBOVUxMOworCXN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqdHJhbnMgPSB2OXNlcy0+dHJhbnNwb3J0OworCisJc2VtYV9pbml0KCZ0cmFucy0+d3JpdGVsb2NrLCAxKTsKKwlzZW1hX2luaXQoJnRyYW5zLT5yZWFkbG9jaywgMSk7CisKKwl0cyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2OWZzX3RyYW5zX3NvY2spLCBHRlBfS0VSTkVMKTsKKworCWlmICghdHMpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJhbnMtPnByaXYgPSB0czsKKwl0cy0+cyA9IE5VTEw7CisKKwlpZiAoIWFkZHIpCisJCXJldHVybiAtRUlOVkFMOworCisJZHByaW50ayhERUJVR19UUkFOUywgIkNvbm5lY3RpbmcgdG8gJXNcbiIsIGFkZHIpOworCisJc2luX3NlcnZlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzaW5fc2VydmVyLnNpbl9hZGRyLnNfYWRkciA9IGluX2F0b24oYWRkcik7CisJc2luX3NlcnZlci5zaW5fcG9ydCA9IGh0b25zKHY5c2VzLT5wb3J0KTsKKwlzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgJmNzb2NrZXQpOworCXJjID0gY3NvY2tldC0+b3BzLT5jb25uZWN0KGNzb2NrZXQsCisJCQkJICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW5fc2VydmVyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLCAwKTsKKwlpZiAocmMgPCAwKSB7CisJCWVwcmludGsoS0VSTl9FUlIsCisJCQkidjlmc190cmFuc190Y3A6IHByb2JsZW0gY29ubmVjdGluZyBzb2NrZXQgdG8gJXNcbiIsCisJCQlhZGRyKTsKKwkJcmV0dXJuIHJjOworCX0KKwljc29ja2V0LT5zay0+c2tfYWxsb2NhdGlvbiA9IEdGUF9OT0lPOworCXRzLT5zID0gY3NvY2tldDsKKwl0cmFucy0+c3RhdHVzID0gQ29ubmVjdGVkOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdjlmc191bml4X2luaXQgLSBpbml0aWFsaXplIFVOSVggZG9tYWluIHNvY2tldAorICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAZGV2X25hbWU6IHBhdGggdG8gbmFtZWQgcGlwZQorICogQGRhdGE6IG1vdW50IG9wdGlvbnMKKyAqCisgKi8KKworc3RhdGljIGludAordjlmc191bml4X2luaXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJICAgICAgIGNoYXIgKmRhdGEpCit7CisJaW50IHJjOworCXN0cnVjdCBzb2NrZXQgKmNzb2NrZXQ7CisJc3RydWN0IHNvY2thZGRyX3VuIHN1bl9zZXJ2ZXI7CisJc3RydWN0IHY5ZnNfdHJhbnNwb3J0ICp0cmFuczsKKwlzdHJ1Y3Qgdjlmc190cmFuc19zb2NrICp0czsKKworCXJjID0gMDsKKwljc29ja2V0ID0gTlVMTDsKKwl0cmFucyA9IHY5c2VzLT50cmFuc3BvcnQ7CisKKwlpZiAoc3RybGVuKGRldl9uYW1lKSA+IFVOSVhfUEFUSF9NQVgpIHsKKwkJZXByaW50ayhLRVJOX0VSUiwgInY5ZnNfdHJhbnNfdW5peDogYWRkcmVzcyB0b28gbG9uZzogJXNcbiIsCisJCQlkZXZfbmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXRzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHY5ZnNfdHJhbnNfc29jayksIEdGUF9LRVJORUwpOworCWlmICghdHMpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJhbnMtPnByaXYgPSB0czsKKwl0cy0+cyA9IE5VTEw7CisKKwlzZW1hX2luaXQoJnRyYW5zLT53cml0ZWxvY2ssIDEpOworCXNlbWFfaW5pdCgmdHJhbnMtPnJlYWRsb2NrLCAxKTsKKworCXN1bl9zZXJ2ZXIuc3VuX2ZhbWlseSA9IFBGX1VOSVg7CisJc3RyY3B5KHN1bl9zZXJ2ZXIuc3VuX3BhdGgsIGRldl9uYW1lKTsKKwlzb2NrX2NyZWF0ZV9rZXJuKFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCAmY3NvY2tldCk7CisJcmMgPSBjc29ja2V0LT5vcHMtPmNvbm5lY3QoY3NvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzdW5fc2VydmVyLAorCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSAtIDEsIDApOwkvKiAtMSAqaXMqIGltcG9ydGFudCAqLworCWlmIChyYyA8IDApIHsKKwkJZXByaW50ayhLRVJOX0VSUiwKKwkJCSJ2OWZzX3RyYW5zX3VuaXg6IHByb2JsZW0gY29ubmVjdGluZyBzb2NrZXQ6ICVzOiAlZFxuIiwKKwkJCWRldl9uYW1lLCByYyk7CisJCXJldHVybiByYzsKKwl9CisJY3NvY2tldC0+c2stPnNrX2FsbG9jYXRpb24gPSBHRlBfTk9JTzsKKwl0cy0+cyA9IGNzb2NrZXQ7CisJdHJhbnMtPnN0YXR1cyA9IENvbm5lY3RlZDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHY5ZnNfc29ja19jbG9zZSAtIHNodXRkb3duIHNvY2tldAorICogQHRyYW5zOiBwcml2YXRlIHNvY2tldCBzdHJ1Y3R1cmUKKyAqCisgKi8KKworc3RhdGljIHZvaWQgdjlmc19zb2NrX2Nsb3NlKHN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqdHJhbnMpCit7CisJc3RydWN0IHY5ZnNfdHJhbnNfc29jayAqdHM7CisKKwlpZiAoIXRyYW5zKQorCQlyZXR1cm47CisKKwl0cyA9IHRyYW5zLT5wcml2OworCisJaWYgKCh0cykgJiYgKHRzLT5zKSkgeworCQlkcHJpbnRrKERFQlVHX1RSQU5TLCAiY2xvc2luZyB0aGUgc29ja2V0ICVwXG4iLCB0cy0+cyk7CisJCXNvY2tfcmVsZWFzZSh0cy0+cyk7CisJCXRzLT5zID0gTlVMTDsKKwkJdHJhbnMtPnN0YXR1cyA9IERpc2Nvbm5lY3RlZDsKKwkJZHByaW50ayhERUJVR19UUkFOUywgInNvY2tldCBjbG9zZWRcbiIpOworCX0KKworCWlmICh0cykKKwkJa2ZyZWUodHMpOworCisJdHJhbnMtPnByaXYgPSBOVUxMOworfQorCitzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgdjlmc190cmFuc190Y3AgPSB7CisJLmluaXQgPSB2OWZzX3RjcF9pbml0LAorCS53cml0ZSA9IHY5ZnNfc29ja19zZW5kLAorCS5yZWFkID0gdjlmc19zb2NrX3JlY3YsCisJLmNsb3NlID0gdjlmc19zb2NrX2Nsb3NlLAorfTsKKworc3RydWN0IHY5ZnNfdHJhbnNwb3J0IHY5ZnNfdHJhbnNfdW5peCA9IHsKKwkuaW5pdCA9IHY5ZnNfdW5peF9pbml0LAorCS53cml0ZSA9IHY5ZnNfc29ja19zZW5kLAorCS5yZWFkID0gdjlmc19zb2NrX3JlY3YsCisJLmNsb3NlID0gdjlmc19zb2NrX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3RyYW5zcG9ydC5oIGIvZnMvOXAvdHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5Y2Q0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBsaW51eC9mcy85cC90cmFuc3BvcnQuaAorICoKKyAqIFRyYW5zcG9ydCBEZWZpbml0aW9uCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworZW51bSB2OWZzX3RyYW5zcG9ydF9zdGF0dXMgeworCUNvbm5lY3RlZCwKKwlEaXNjb25uZWN0ZWQsCisJSHVuZywKK307CisKK3N0cnVjdCB2OWZzX3RyYW5zcG9ydCB7CisJZW51bSB2OWZzX3RyYW5zcG9ydF9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBzZW1hcGhvcmUgd3JpdGVsb2NrOworCXN0cnVjdCBzZW1hcGhvcmUgcmVhZGxvY2s7CisJdm9pZCAqcHJpdjsKKworCWludCAoKmluaXQpIChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKiwgY29uc3QgY2hhciAqLCBjaGFyICopOworCWludCAoKndyaXRlKSAoc3RydWN0IHY5ZnNfdHJhbnNwb3J0ICosIHZvaWQgKiwgaW50KTsKKwlpbnQgKCpyZWFkKSAoc3RydWN0IHY5ZnNfdHJhbnNwb3J0ICosIHZvaWQgKiwgaW50KTsKKwl2b2lkICgqY2xvc2UpIChzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKik7Cit9OworCitleHRlcm4gc3RydWN0IHY5ZnNfdHJhbnNwb3J0IHY5ZnNfdHJhbnNfdGNwOworZXh0ZXJuIHN0cnVjdCB2OWZzX3RyYW5zcG9ydCB2OWZzX3RyYW5zX3VuaXg7CitleHRlcm4gc3RydWN0IHY5ZnNfdHJhbnNwb3J0IHY5ZnNfdHJhbnNfZmQ7CmRpZmYgLS1naXQgYS9mcy85cC92OWZzLmMgYi9mcy85cC92OWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiZGJiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL3Y5ZnMuYwpAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyAqICBsaW51eC9mcy85cC92OWZzLmMKKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBhc3Npc3RpbmcgaW4gbWFwcGluZyBWRlMgdG8gOVAyMDAwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAiOXAuaCIKKyNpbmNsdWRlICJ2OWZzX3Zmcy5oIgorI2luY2x1ZGUgInRyYW5zcG9ydC5oIgorI2luY2x1ZGUgIm11eC5oIgorI2luY2x1ZGUgImNvbnYuaCIKKworLyogVE9ETzogc3lzZnMgb3IgZGVidWdmcyBpbnRlcmZhY2UgKi8KK2ludCB2OWZzX2RlYnVnX2xldmVsID0gMDsJLyogZmVhdHVyZS1yaWZpYyBnbG9iYWwgZGVidWcgbGV2ZWwgICovCisKKy8qCisgICogT3B0aW9uIFBhcnNpbmcgKGNvZGUgaW5zcGlyZWQgYnkgTkZTIGNvZGUpCisgICoKKyAgKi8KKworZW51bSB7CisJLyogT3B0aW9ucyB0aGF0IHRha2UgaW50ZWdlciBhcmd1bWVudHMgKi8KKwlPcHRfcG9ydCwgT3B0X21zaXplLCBPcHRfdWlkLCBPcHRfZ2lkLCBPcHRfYWZpZCwgT3B0X2RlYnVnLAorCU9wdF9yZmRubywgT3B0X3dmZG5vLAorCS8qIFN0cmluZyBvcHRpb25zICovCisJT3B0X25hbWUsIE9wdF9yZW1vdGVuYW1lLAorCS8qIE9wdGlvbnMgdGhhdCB0YWtlIG5vIGFyZ3VtZW50cyAqLworCU9wdF9sZWdhY3ksIE9wdF9ub2Rldm1hcCwgT3B0X3VuaXgsIE9wdF90Y3AsIE9wdF9mZCwKKwkvKiBFcnJvciB0b2tlbiAqLworCU9wdF9lcnIKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X3BvcnQsICJwb3J0PSV1In0sCisJe09wdF9tc2l6ZSwgIm1zaXplPSV1In0sCisJe09wdF91aWQsICJ1aWQ9JXUifSwKKwl7T3B0X2dpZCwgImdpZD0ldSJ9LAorCXtPcHRfYWZpZCwgImFmaWQ9JXUifSwKKwl7T3B0X3JmZG5vLCAicmZkbm89JXUifSwKKwl7T3B0X3dmZG5vLCAid2Zkbm89JXUifSwKKwl7T3B0X2RlYnVnLCAiZGVidWc9JXUifSwKKwl7T3B0X25hbWUsICJuYW1lPSVzIn0sCisJe09wdF9yZW1vdGVuYW1lLCAiYW5hbWU9JXMifSwKKwl7T3B0X3VuaXgsICJwcm90bz11bml4In0sCisJe09wdF90Y3AsICJwcm90bz10Y3AifSwKKwl7T3B0X2ZkLCAicHJvdG89ZmQifSwKKwl7T3B0X3RjcCwgInRjcCJ9LAorCXtPcHRfdW5peCwgInVuaXgifSwKKwl7T3B0X2ZkLCAiZmQifSwKKwl7T3B0X2xlZ2FjeSwgIm5vZXh0ZW5kIn0sCisJe09wdF9ub2Rldm1hcCwgIm5vZGV2bWFwIn0sCisJe09wdF9lcnIsIE5VTEx9Cit9OworCisvKgorICogIFBhcnNlIG9wdGlvbiBzdHJpbmcuCisgKi8KKworLyoqCisgKiB2OWZzX3BhcnNlX29wdGlvbnMgLSBwYXJzZSBtb3VudCBvcHRpb25zIGludG8gc2Vzc2lvbiBzdHJ1Y3R1cmUKKyAqIEBvcHRpb25zOiBvcHRpb25zIHN0cmluZyBwYXNzZWQgZnJvbSBtb3VudAorICogQHY5c2VzOiBleGlzdGluZyB2OWZzIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqCisgKi8KKworc3RhdGljIHZvaWQgdjlmc19wYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpCit7CisJY2hhciAqcDsKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJaW50IG9wdGlvbjsKKwlpbnQgcmV0OworCisJLyogc2V0dXAgZGVmYXVsdHMgKi8KKwl2OXNlcy0+cG9ydCA9IFY5RlNfUE9SVDsKKwl2OXNlcy0+bWF4ZGF0YSA9IDkwMDA7CisJdjlzZXMtPnByb3RvID0gUFJPVE9fVENQOworCXY5c2VzLT5leHRlbmRlZCA9IDE7CisJdjlzZXMtPmFmaWQgPSB+MDsKKwl2OXNlcy0+ZGVidWcgPSAwOworCXY5c2VzLT5yZmRubyA9IH4wOworCXY5c2VzLT53ZmRubyA9IH4wOworCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm47CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaW50IHRva2VuOworCQlpZiAoISpwKQorCQkJY29udGludWU7CisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKKwkJaWYgKHRva2VuIDwgT3B0X25hbWUpIHsKKwkJCWlmICgocmV0ID0gbWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkgPCAwKSB7CisJCQkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCQkJImludGVnZXIgZmllbGQsIGJ1dCBubyBpbnRlZ2VyP1xuIik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJfQorCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2UgT3B0X3BvcnQ6CisJCQl2OXNlcy0+cG9ydCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9tc2l6ZToKKwkJCXY5c2VzLT5tYXhkYXRhID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VpZDoKKwkJCXY5c2VzLT51aWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZ2lkOgorCQkJdjlzZXMtPmdpZCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9hZmlkOgorCQkJdjlzZXMtPmFmaWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcmZkbm86CisJCQl2OXNlcy0+cmZkbm8gPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfd2Zkbm86CisJCQl2OXNlcy0+d2Zkbm8gPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGVidWc6CisJCQl2OXNlcy0+ZGVidWcgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdGNwOgorCQkJdjlzZXMtPnByb3RvID0gUFJPVE9fVENQOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VuaXg6CisJCQl2OXNlcy0+cHJvdG8gPSBQUk9UT19VTklYOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2ZkOgorCQkJdjlzZXMtPnByb3RvID0gUFJPVE9fRkQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbmFtZToKKwkJCW1hdGNoX3N0cmNweSh2OXNlcy0+bmFtZSwgJmFyZ3NbMF0pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3JlbW90ZW5hbWU6CisJCQltYXRjaF9zdHJjcHkodjlzZXMtPnJlbW90ZW5hbWUsICZhcmdzWzBdKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9sZWdhY3k6CisJCQl2OXNlcy0+ZXh0ZW5kZWQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vZGV2bWFwOgorCQkJdjlzZXMtPm5vZGV2ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY29udGludWU7CisJCX0KKwl9Cit9CisKKy8qKgorICogdjlmc19pbm9kZTJ2OXNlcyAtIHNhZmVseSBleHRyYWN0IHY5ZnMgc2Vzc2lvbiBpbmZvIGZyb20gc3VwZXIgYmxvY2sKKyAqIEBpbm9kZTogaW5vZGUgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tCisgKgorICogUGFyYW5vaWQgZnVuY3Rpb24gdG8gZXh0cmFjdCB2OXNlcyBpbmZvcm1hdGlvbiBmcm9tIHN1cGVyYmxvY2ssCisgKiBpZiBhbnl0aGluZyBpcyBtaXNzaW5nIGl0IHdpbGwgcmVwb3J0IGFuIGVycm9yLgorICoKKyAqLworCitzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5ZnNfaW5vZGUydjlzZXMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKGlub2RlLT5pX3NiLT5zX2ZzX2luZm8pOworfQorCisvKioKKyAqIHY5ZnNfZ2V0X2lkcG9vbCAtIGFsbG9jYXRlIG51bWVyaWMgaWQgZnJvbSBwb29sCisgKiBAcCAtIHBvb2wgdG8gYWxsb2NhdGUgZnJvbQorICoKKyAqIFhYWCAtIFRoaXMgc2VlbXMgdG8gYmUgYW4gYXdmdWwgZ2VuZXJpYyBmdW5jdGlvbiwgc2hvdWxkIGl0IGJlIGluIGlkci5jIHdpdGgKKyAqICAgICAgICAgICAgdGhlIGxvY2sgaW5jbHVkZWQgaW4gc3RydWN0IGlkcj8KKyAqLworCitpbnQgdjlmc19nZXRfaWRwb29sKHN0cnVjdCB2OWZzX2lkcG9vbCAqcCkKK3sKKwlpbnQgaSA9IDA7CisJaW50IGVycm9yOworCityZXRyeToKKwlpZiAoaWRyX3ByZV9nZXQoJnAtPnBvb2wsIEdGUF9LRVJORUwpID09IDApCisJCXJldHVybiAwOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmcC0+bG9jaykgPT0gLUVJTlRSKSB7CisJCWVwcmludGsoS0VSTl9XQVJOSU5HLCAiSW50ZXJydXB0ZWQgd2hpbGUgbG9ja2luZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwllcnJvciA9IGlkcl9nZXRfbmV3KCZwLT5wb29sLCBOVUxMLCAmaSk7CisJdXAoJnAtPmxvY2spOworCisJaWYgKGVycm9yID09IC1FQUdBSU4pCisJCWdvdG8gcmV0cnk7CisJZWxzZSBpZiAoZXJyb3IpCisJCXJldHVybiAtMTsKKworCXJldHVybiBpOworfQorCisvKioKKyAqIHY5ZnNfcHV0X2lkcG9vbCAtIHJlbGVhc2UgbnVtZXJpYyBpZCBmcm9tIHBvb2wKKyAqIEBwIC0gcG9vbCB0byBhbGxvY2F0ZSBmcm9tCisgKgorICogWFhYIC0gVGhpcyBzZWVtcyB0byBiZSBhbiBhd2Z1bCBnZW5lcmljIGZ1bmN0aW9uLCBzaG91bGQgaXQgYmUgaW4gaWRyLmMgd2l0aAorICogICAgICAgICAgICB0aGUgbG9jayBpbmNsdWRlZCBpbiBzdHJ1Y3QgaWRyPworICovCisKK3ZvaWQgdjlmc19wdXRfaWRwb29sKGludCBpZCwgc3RydWN0IHY5ZnNfaWRwb29sICpwKQoreworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnAtPmxvY2spID09IC1FSU5UUikgeworCQllcHJpbnRrKEtFUk5fV0FSTklORywgIkludGVycnVwdGVkIHdoaWxlIGxvY2tpbmdcbiIpOworCQlyZXR1cm47CisJfQorCWlkcl9yZW1vdmUoJnAtPnBvb2wsIGlkKTsKKwl1cCgmcC0+bG9jayk7Cit9CisKKy8qKgorICogdjlmc19zZXNzaW9uX2luaXQgLSBpbml0aWFsaXplIHNlc3Npb24KKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqIEBkZXZfbmFtZTogZGV2aWNlIGJlaW5nIG1vdW50ZWQKKyAqIEBkYXRhOiBvcHRpb25zCisgKgorICovCisKK2ludAordjlmc19zZXNzaW9uX2luaXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywKKwkJICBjb25zdCBjaGFyICpkZXZfbmFtZSwgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOworCXN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqdHJhbnNfcHJvdG87CisJaW50IG4gPSAwOworCWludCBuZXdmaWQgPSAtMTsKKwlpbnQgcmV0dmFsID0gLUVJTlZBTDsKKworCXY5c2VzLT5uYW1lID0gX19nZXRuYW1lKCk7CisJaWYgKCF2OXNlcy0+bmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2OXNlcy0+cmVtb3RlbmFtZSA9IF9fZ2V0bmFtZSgpOworCWlmICghdjlzZXMtPnJlbW90ZW5hbWUpIHsKKwkJcHV0bmFtZSh2OXNlcy0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXN0cmNweSh2OXNlcy0+bmFtZSwgVjlGU19ERUZVU0VSKTsKKwlzdHJjcHkodjlzZXMtPnJlbW90ZW5hbWUsIFY5RlNfREVGQU5BTUUpOworCisJdjlmc19wYXJzZV9vcHRpb25zKGRhdGEsIHY5c2VzKTsKKworCS8qIHNldCBnbG9iYWwgZGVidWcgbGV2ZWwgKi8KKwl2OWZzX2RlYnVnX2xldmVsID0gdjlzZXMtPmRlYnVnOworCisJLyogaWQgcG9vbHMgdGhhdCBhcmUgc2Vzc2lvbi1kZXBlbmRlbnQ6IEZJRHMgYW5kIFRJRHMgKi8KKwlpZHJfaW5pdCgmdjlzZXMtPmZpZHBvb2wucG9vbCk7CisJaW5pdF9NVVRFWCgmdjlzZXMtPmZpZHBvb2wubG9jayk7CisJaWRyX2luaXQoJnY5c2VzLT50aWRwb29sLnBvb2wpOworCWluaXRfTVVURVgoJnY5c2VzLT50aWRwb29sLmxvY2spOworCisKKwlzd2l0Y2ggKHY5c2VzLT5wcm90bykgeworCWNhc2UgUFJPVE9fVENQOgorCQl0cmFuc19wcm90byA9ICZ2OWZzX3RyYW5zX3RjcDsKKwkJYnJlYWs7CisJY2FzZSBQUk9UT19VTklYOgorCQl0cmFuc19wcm90byA9ICZ2OWZzX3RyYW5zX3VuaXg7CisJCSp2OXNlcy0+cmVtb3RlbmFtZSA9IDA7CisJCWJyZWFrOworCWNhc2UgUFJPVE9fRkQ6CisJCXRyYW5zX3Byb3RvID0gJnY5ZnNfdHJhbnNfZmQ7CisJCSp2OXNlcy0+cmVtb3RlbmFtZSA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAidjlmczogQmFkIG1vdW50IHByb3RvY29sICVkXG4iLCB2OXNlcy0+cHJvdG8pOworCQlyZXR2YWwgPSAtRU5PUFJPVE9PUFQ7CisJCWdvdG8gU2Vzc0NsZWFuVXA7CisJfTsKKworCXY5c2VzLT50cmFuc3BvcnQgPSB0cmFuc19wcm90bzsKKworCWlmICgocmV0dmFsID0gdjlzZXMtPnRyYW5zcG9ydC0+aW5pdCh2OXNlcywgZGV2X25hbWUsIGRhdGEpKSA8IDApIHsKKwkJZXByaW50ayhLRVJOX0VSUiwgInByb2JsZW0gaW5pdGlhbGl6aW5nIHRyYW5zcG9ydFxuIik7CisJCWdvdG8gU2Vzc0NsZWFuVXA7CisJfQorCisJdjlzZXMtPmlucHJvZ3Jlc3MgPSAwOworCXY5c2VzLT5zaHV0ZG93biA9IDA7CisJdjlzZXMtPnNlc3Npb25faHVuZyA9IDA7CisKKwlpZiAoKHJldHZhbCA9IHY5ZnNfbXV4X2luaXQodjlzZXMsIGRldl9uYW1lKSkgPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJwcm9ibGVtIGluaXRpYWxpemluZyBtdXhcbiIpOworCQlnb3RvIFNlc3NDbGVhblVwOworCX0KKworCWlmICh2OXNlcy0+YWZpZCA9PSB+MCkgeworCQlpZiAodjlzZXMtPmV4dGVuZGVkKQorCQkJcmV0dmFsID0KKwkJCSAgICB2OWZzX3RfdmVyc2lvbih2OXNlcywgdjlzZXMtPm1heGRhdGEsICI5UDIwMDAudSIsCisJCQkJCSAgICZmY2FsbCk7CisJCWVsc2UKKwkJCXJldHZhbCA9IHY5ZnNfdF92ZXJzaW9uKHY5c2VzLCB2OXNlcy0+bWF4ZGF0YSwgIjlQMjAwMCIsCisJCQkJCQkmZmNhbGwpOworCisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAidjlmc190X3ZlcnNpb24gZmFpbGVkXG4iKTsKKwkJCWdvdG8gRnJlZUZjYWxsOworCQl9CisKKwkJLyogUmVhbGx5IHNob3VsZCBjaGVjayBmb3IgOVAxIGFuZCByZXBvcnQgZXJyb3IgKi8KKwkJaWYgKCFzdHJjbXAoZmNhbGwtPnBhcmFtcy5ydmVyc2lvbi52ZXJzaW9uLCAiOVAyMDAwLnUiKSkgeworCQkJZHByaW50ayhERUJVR185UCwgIjlQMjAwMCBVTklYIGV4dGVuc2lvbnMgZW5hYmxlZFxuIik7CisJCQl2OXNlcy0+ZXh0ZW5kZWQgPSAxOworCQl9IGVsc2UgeworCQkJZHByaW50ayhERUJVR185UCwgIjlQMjAwMCBsZWdhY3kgbW9kZSBlbmFibGVkXG4iKTsKKwkJCXY5c2VzLT5leHRlbmRlZCA9IDA7CisJCX0KKworCQluID0gZmNhbGwtPnBhcmFtcy5ydmVyc2lvbi5tc2l6ZTsKKwkJa2ZyZWUoZmNhbGwpOworCisJCWlmIChuIDwgdjlzZXMtPm1heGRhdGEpCisJCQl2OXNlcy0+bWF4ZGF0YSA9IG47CisJfQorCisJbmV3ZmlkID0gdjlmc19nZXRfaWRwb29sKCZ2OXNlcy0+ZmlkcG9vbCk7CisJaWYgKG5ld2ZpZCA8IDApIHsKKwkJZXByaW50ayhLRVJOX1dBUk5JTkcsICJjb3VsZG4ndCBhbGxvY2F0ZSBGSURcbiIpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIFNlc3NDbGVhblVwOworCX0KKwkvKiBpdCBpcyBhIGxpdHRsZSBiaXQgdWdseSwgYnV0IHdlIGhhdmUgdG8gcHJldmVudCBuZXdmaWQgKi8KKwkvKiBiZWluZyB0aGUgc2FtZSBhcyBhZmlkLCBzbyBpZiBpdCBpcywgZ2V0IGEgbmV3IGZpZCAgICAgKi8KKwlpZiAodjlzZXMtPmFmaWQgIT0gfjAgJiYgbmV3ZmlkID09IHY5c2VzLT5hZmlkKSB7CisJCW5ld2ZpZCA9IHY5ZnNfZ2V0X2lkcG9vbCgmdjlzZXMtPmZpZHBvb2wpOworCQlpZiAobmV3ZmlkIDwgMCkgeworCQkJZXByaW50ayhLRVJOX1dBUk5JTkcsICJjb3VsZG4ndCBhbGxvY2F0ZSBGSURcbiIpOworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gU2Vzc0NsZWFuVXA7CisJCX0KKwl9CisKKwlpZiAoKHJldHZhbCA9CisJICAgICB2OWZzX3RfYXR0YWNoKHY5c2VzLCB2OXNlcy0+bmFtZSwgdjlzZXMtPnJlbW90ZW5hbWUsIG5ld2ZpZCwKKwkJCSAgIHY5c2VzLT5hZmlkLCBOVUxMKSkKKwkgICAgPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJjYW5ub3QgYXR0YWNoXG4iKTsKKwkJZ290byBTZXNzQ2xlYW5VcDsKKwl9CisKKwlpZiAodjlzZXMtPmFmaWQgIT0gfjApIHsKKwkJaWYgKHY5ZnNfdF9jbHVuayh2OXNlcywgdjlzZXMtPmFmaWQsIE5VTEwpKQorCQkJZHByaW50ayhERUJVR19FUlJPUiwgImNsdW5rIGZhaWxlZFxuIik7CisJfQorCisJcmV0dXJuIG5ld2ZpZDsKKworICAgICAgRnJlZUZjYWxsOgorCWtmcmVlKGZjYWxsKTsKKworICAgICAgU2Vzc0NsZWFuVXA6CisJdjlmc19zZXNzaW9uX2Nsb3NlKHY5c2VzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHY5ZnNfc2Vzc2lvbl9jbG9zZSAtIHNodXRkb3duIGEgc2Vzc2lvbgorICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICoKKyAqLworCit2b2lkIHY5ZnNfc2Vzc2lvbl9jbG9zZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzKQoreworCWlmICh2OXNlcy0+cmVjdnByb2MpIHsKKwkJc2VuZF9zaWcoU0lHS0lMTCwgdjlzZXMtPnJlY3Zwcm9jLCAxKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmdjlzZXMtPnByb2NjbXBsKTsKKwl9CisKKwlpZiAodjlzZXMtPnRyYW5zcG9ydCkKKwkJdjlzZXMtPnRyYW5zcG9ydC0+Y2xvc2UodjlzZXMtPnRyYW5zcG9ydCk7CisKKwlwdXRuYW1lKHY5c2VzLT5uYW1lKTsKKwlwdXRuYW1lKHY5c2VzLT5yZW1vdGVuYW1lKTsKK30KKworLyoqCisgKiB2OWZzX3Nlc3Npb25fY2FuY2VsIC0gbWFyayB0cmFuc3BvcnQgYXMgZGlzY29ubmVjdGVkCisgKiAJYW5kIGNhbmNlbCBhbGwgcGVuZGluZyByZXF1ZXN0cy4KKyAqLwordm9pZCB2OWZzX3Nlc3Npb25fY2FuY2VsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpIHsKKwl2OXNlcy0+dHJhbnNwb3J0LT5zdGF0dXMgPSBEaXNjb25uZWN0ZWQ7CisJdjlmc19tdXhfY2FuY2VsX3JlcXVlc3RzKHY5c2VzLCAtRUlPKTsKK30KKworZXh0ZXJuIGludCB2OWZzX2Vycm9yX2luaXQodm9pZCk7CisKKy8qKgorICogdjlmc19pbml0IC0gSW5pdGlhbGl6ZSBtb2R1bGUKKyAqCisgKi8KKworc3RhdGljIGludCBfX2luaXQgaW5pdF92OWZzKHZvaWQpCit7CisJdjlmc19lcnJvcl9pbml0KCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJJbnN0YWxsaW5nIHY5ZnMgOVAyMDAwIGZpbGUgc3lzdGVtIHN1cHBvcnRcbiIpOworCisJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnY5ZnNfZnNfdHlwZSk7Cit9CisKKy8qKgorICogdjlmc19pbml0IC0gc2h1dGRvd24gbW9kdWxlCisgKgorICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3Y5ZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnY5ZnNfZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdjlmcykKK21vZHVsZV9leGl0KGV4aXRfdjlmcykKKworTU9EVUxFX0FVVEhPUigiRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlJvbiBNaW5uaWNoIDxybWlubmljaEBsYW5sLmdvdj4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Y5ZnMuaCBiL2ZzLzlwL3Y5ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWRjZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvOXAvdjlmcy5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogVjlGUyBkZWZpbml0aW9ucy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIGJ5IFJvbiBNaW5uaWNoIDxybWlubmljaEBsYW5sLmdvdj4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKy8qCisgICogSWRwb29sIHN0cnVjdHVyZSBwcm92aWRlcyBsb2NrIGFuZCBpZCBtYW5hZ2VtZW50CisgICoKKyAgKi8KKworc3RydWN0IHY5ZnNfaWRwb29sIHsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJc3RydWN0IGlkciBwb29sOworfTsKKworLyoKKyAgKiBTZXNzaW9uIHN0cnVjdHVyZSBwcm92aWRlcyBpbmZvcm1hdGlvbiBmb3IgYW4gb3BlbmVkIHNlc3Npb24KKyAgKgorICAqLworCitzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8geworCS8qIG9wdGlvbnMgKi8KKwl1bnNpZ25lZCBpbnQgbWF4ZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGV4dGVuZGVkOwkvKiBzZXQgdG8gMSBpZiB3ZSBhcmUgdXNpbmcgVU5JWCBleHRlbnNpb25zICovCisJdW5zaWduZWQgY2hhciBub2RldjsJLyogc2V0IHRvIDEgaWYgbm8gZGlzYWJsZSBkZXZpY2UgbWFwcGluZyAqLworCXVuc2lnbmVkIHNob3J0IHBvcnQ7CS8qIHBvcnQgdG8gY29ubmVjdCB0byAqLworCXVuc2lnbmVkIHNob3J0IGRlYnVnOwkvKiBkZWJ1ZyBsZXZlbCAqLworCXVuc2lnbmVkIHNob3J0IHByb3RvOwkvKiBwcm90b2NvbCB0byB1c2UgKi8KKwl1bnNpZ25lZCBpbnQgYWZpZDsJLyogYXV0aGVudGljYXRpb24gZmlkICovCisJdW5zaWduZWQgaW50IHJmZG5vOwkvKiByZWFkIGZpbGUgZGVzY3JpcHRvciBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgd2Zkbm87CS8qIHdyaXRlIGZpbGUgZGVzY3JpcHRvciBudW1iZXIgKi8KKworCisJY2hhciAqbmFtZTsJCS8qIHVzZXIgbmFtZSB0byBtb3VudCBhcyAqLworCWNoYXIgKnJlbW90ZW5hbWU7CS8qIG5hbWUgb2YgcmVtb3RlIGhpZXJhcmNoeSBiZWluZyBtb3VudGVkICovCisJdW5zaWduZWQgaW50IHVpZDsJLyogZGVmYXVsdCB1aWQvbXVpZCBmb3IgbGVnYWN5IHN1cHBvcnQgKi8KKwl1bnNpZ25lZCBpbnQgZ2lkOwkvKiBkZWZhdWx0IGdpZCBmb3IgbGVnYWN5IHN1cHBvcnQgKi8KKworCS8qIGJvb2sga2VlcGluZyAqLworCXN0cnVjdCB2OWZzX2lkcG9vbCBmaWRwb29sOwkvKiBUaGUgRklEIHBvb2wgZm9yIGZpbGUgZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3Qgdjlmc19pZHBvb2wgdGlkcG9vbDsJLyogVGhlIFRJRCBwb29sIGZvciB0cmFuc2FjdGlvbnMgaWRzICovCisKKwkvKiB0cmFuc3BvcnQgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zcG9ydDsKKworCWludCBpbnByb2dyZXNzOwkJLyogc2Vzc2lvbiBpbiBwcm9ncmVzcyA9PiB0cnVlICovCisJaW50IHNodXRkb3duOwkJLyogc2Vzc2lvbiBzaHV0dGluZyBkb3duLiBubyBtb3JlIGF0dGFjaGVzLiAqLworCXVuc2lnbmVkIGNoYXIgc2Vzc2lvbl9odW5nOworCisJLyogbXV4IHByaXZhdGUgZGF0YSAqLworCXN0cnVjdCB2OWZzX2ZjYWxsICpjdXJmY2FsbDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXQ7CisJc3RydWN0IGNvbXBsZXRpb24gZmNyZWFkOworCXN0cnVjdCBjb21wbGV0aW9uIHByb2NjbXBsOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcmVjdnByb2M7CisKKwlzcGlubG9ja190IG11eGxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBtdXhfZmNhbGxzOworfTsKKworLyogcG9zc2libGUgdmFsdWVzIG9mIC0+cHJvdG8gKi8KK2VudW0geworCVBST1RPX1RDUCwKKwlQUk9UT19VTklYLAorCVBST1RPX0ZELAorfTsKKworaW50IHY5ZnNfc2Vzc2lvbl9pbml0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqLCBjb25zdCBjaGFyICosIGNoYXIgKik7CitzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5ZnNfaW5vZGUydjlzZXMoc3RydWN0IGlub2RlICopOwordm9pZCB2OWZzX3Nlc3Npb25fY2xvc2Uoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyk7CitpbnQgdjlmc19nZXRfaWRwb29sKHN0cnVjdCB2OWZzX2lkcG9vbCAqcCk7Cit2b2lkIHY5ZnNfcHV0X2lkcG9vbChpbnQgaWQsIHN0cnVjdCB2OWZzX2lkcG9vbCAqcCk7Cit2b2lkIHY5ZnNfc2Vzc2lvbl9jYW5jZWwoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyk7CisKKyNkZWZpbmUgVjlGU19NQUdJQyAweDAxMDIxOTk3CisKKy8qIG90aGVyIGRlZmF1bHQgZ2xvYmFscyAqLworI2RlZmluZSBWOUZTX1BPUlQJCTU2NAorI2RlZmluZSBWOUZTX0RFRlVTRVIJIm5vYm9keSIKKyNkZWZpbmUgVjlGU19ERUZBTkFNRQkiIgorCisvKiBpbml0YWwgcG9vbCBzaXplcyBmb3IgZmlkcyBhbmQgdGFncyAqLworI2RlZmluZSBWOUZTX1NUQVJUX0ZJRFMgODE5MgorI2RlZmluZSBWOUZTX1NUQVJUX1RJRFMgMjU2CmRpZmYgLS1naXQgYS9mcy85cC92OWZzX3Zmcy5oIGIvZnMvOXAvdjlmc192ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjJjZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvOXAvdjlmc192ZnMuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogVjlGUyBWRlMgZXh0ZW5zaW9ucy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIGJ5IFJvbiBNaW5uaWNoIDxybWlubmljaEBsYW5sLmdvdj4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKy8qIHBsYW45IHNlbWFudGljcyBhcmUgdGhhdCBjcmVhdGVkIGZpbGVzIGFyZSBpbXBsaWNpdGx5IG9wZW5lZC4KKyAqIEJ1dCBsaW51eCBzZW1hbnRpY3MgYXJlIHRoYXQgeW91IGNhbGwgY3JlYXRlLCB0aGVuIG9wZW4uCisgKiB0aGUgcGxhbjkgYXBwcm9hY2ggaXMgc3VwZXJpb3IgYXMgaXQgcHJvdmlkZXMgYW4gYXRvbWljCisgKiBvcGVuLgorICogd2UgdHJhY2sgdGhlIGNyZWF0ZSBmaWQgaGVyZS4gV2hlbiB0aGUgZmlsZSBpcyBvcGVuZWQsIGlmIGZpZG9wZW4gaXMKKyAqIG5vbi16ZXJvLCB3ZSB1c2UgdGhlIGZpZCBhbmQgY2FuIHNraXAgc29tZSBzdGVwcy4KKyAqIHRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgYnV0IEkgZG9uJ3Qga25vdyBpdC4KKyAqIG9uZSBCQUQgd2F5IGlzIHRvIGNsdW5rIHRoZSBmaWQgb24gY3JlYXRlLCB0aGVuIG9wZW4gaXQgYWdhaW46CisgKiB5b3UgbG9zZSB0aGUgYXRvbWljaXR5IG9mIGZpbGUgb3BlbgorICovCisKKy8qIHNwZWNpYWwgY2FzZToKKyAqIHVubGluayBjYWxscyByZW1vdmUsIHdoaWNoIGlzIGFuIGltcGxpY2l0IGNsdW5rLiBTbyB3ZSBoYXZlIHRvIHRyYWNrCisgKiB0aGF0IGtpbmQgb2YgdGhpbmcgc28gdGhhdCB3ZSBkb24ndCB0cnkgdG8gY2x1bmsgYSBkZWFkIGZpZC4KKyAqLworCitleHRlcm4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgdjlmc19mc190eXBlOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdjlmc19maWxlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyB2OWZzX2RlbnRyeV9vcGVyYXRpb25zOworCitzdHJ1Y3QgaW5vZGUgKnY5ZnNfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlKTsKK2lub190IHY5ZnNfcWlkMmlubyhzdHJ1Y3Qgdjlmc19xaWQgKnFpZCk7Cit2b2lkIHY5ZnNfbWlzdGF0Mmlub2RlKHN0cnVjdCB2OWZzX3N0YXQgKiwgc3RydWN0IGlub2RlICosCisJCSAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitpbnQgdjlmc19kaXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitpbnQgdjlmc19maWxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwordm9pZCB2OWZzX2lub2RlMm1pc3RhdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgdjlmc19zdGF0ICptaXN0YXQpOwordm9pZCB2OWZzX2RlbnRyeV9yZWxlYXNlKHN0cnVjdCBkZW50cnkgKik7CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfZGVudHJ5LmMgYi9mcy85cC92ZnNfZGVudHJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2Yzk2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL3Zmc19kZW50cnkuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqICBsaW51eC9mcy85cC92ZnNfZGVudHJ5LmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGlhbnMgdmZzIGRlbnRyeSBvcHMgZm9yIHRoZSA5UDIwMDAgcHJvdG9jb2wuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInY5ZnMuaCIKKyNpbmNsdWRlICI5cC5oIgorI2luY2x1ZGUgInY5ZnNfdmZzLmgiCisjaW5jbHVkZSAiY29udi5oIgorI2luY2x1ZGUgImZpZC5oIgorCisvKioKKyAqIHY5ZnNfZGVudHJ5X3ZhbGlkYXRlIC0gVkZTIGRjYWNoZSBob29rIHRvIHZhbGlkYXRlIGNhY2hlCisgKiBAZGVudHJ5OiAgZGVudHJ5IHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkCisgKiBAbmQ6IHBhdGggZGF0YQorICoKKyAqIGRjYWNoZSByZWFsbHkgc2hvdWxkbid0IGJlIHVzZWQgZm9yIDlQMjAwMCBhcyBhdCBhbGwgZHVlIHRvCisgKiBwb3RlbnRpYWwgYXR0YWNoZWQgc2VtYW50aWNzIHRvIGRpcmVjdG9yeSB0cmF2ZXJzYWwgKHdhbGspLgorICoKKyAqIEZVVFVSRTogbG9vayBpbnRvIGhvdyB0byB1c2UgZGNhY2hlIHRvIGFsbG93IG11bHRpLXN0YWdlCisgKiB3YWxrcyBpbiBQbGFuIDkgJiBwb3RlbnRpYWwgZm9yIGJldHRlciBkY2FjaGUgb3BlcmF0aW9uIHdoaWNoCisgKiB3b3VsZCByZW1haW4gdmFsaWQgZm9yIFBsYW4gOSBzZW1hbnRpY3MuICBPbGRlciB2ZXJzaW9ucworICogaGFkIHZhbGlkYXRpb24gdmlhIHN0YXQgZm9yIHRob3NlIGludGVyZXN0ZWQuICBIb3dldmVyLCBzaW5jZQorICogc3RhdCBoYXMgdGhlIHNhbWUgYXBwcm94aW1hdGUgb3ZlcmhlYWQgYXMgd2FsayB0aGVyZSByZWFsbHkKKyAqIGlzIG5vIGRpZmZlcmVuY2UuICBUaGUgb25seSBpbXByb3ZlbWVudCB3b3VsZCBiZSBmcm9tIGEKKyAqIHRpbWUtZGVjYXkgY2FjaGUgbGlrZSBORlMgaGFzIGFuZCB0aGF0IHVuZGVybWluZXMgdGhlCisgKiBzeW5jaHJvbm91cyBuYXR1cmUgb2YgOVAyMDAwLgorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfZGVudHJ5X3ZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGRlbnRyeSAqZGMgPSBjdXJyZW50LT5mcy0+cHdkOworCisJZHByaW50ayhERUJVR19WRlMsICJkZW50cnk6ICVzICglcClcbiIsIGRlbnRyeS0+ZF9pbmFtZSwgZGVudHJ5KTsKKwlpZiAodjlmc19maWRfbG9va3VwKGRlbnRyeSwgRklEX09QKSkgeworCQlkcHJpbnRrKERFQlVHX1ZGUywgIlZBTElEXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKGRjICE9IE5VTEwpIHsKKwkJaWYgKGRjID09IGRlbnRyeSkgeworCQkJZHByaW50ayhERUJVR19WRlMsICJWQUxJRFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoZGMgPT0gZGMtPmRfcGFyZW50KQorCQkJYnJlYWs7CisKKwkJZGMgPSBkYy0+ZF9wYXJlbnQ7CisJfQorCisJZHByaW50ayhERUJVR19WRlMsICJJTlZBTElEXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2OWZzX2RlbnRyeV9yZWxlYXNlIC0gY2FsbGVkIHdoZW4gZGVudHJ5IGlzIGdvaW5nIHRvIGJlIGZyZWVkCisgKiBAZGVudHJ5OiAgZGVudHJ5IHRoYXQgaXMgYmVpbmcgcmVsZWFzZQorICoKKyAqLworCit2b2lkIHY5ZnNfZGVudHJ5X3JlbGVhc2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWRwcmludGsoREVCVUdfVkZTLCAiIGRlbnRyeTogJXMgKCVwKVxuIiwgZGVudHJ5LT5kX2luYW1lLCBkZW50cnkpOworCisJaWYgKGRlbnRyeS0+ZF9mc2RhdGEgIT0gTlVMTCkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpmaWRfbGlzdCA9IGRlbnRyeS0+ZF9mc2RhdGE7CisJCXN0cnVjdCB2OWZzX2ZpZCAqdGVtcCA9IE5VTEw7CisJCXN0cnVjdCB2OWZzX2ZpZCAqY3VycmVudF9maWQgPSBOVUxMOworCQlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdXJyZW50X2ZpZCwgdGVtcCwgZmlkX2xpc3QsIGxpc3QpIHsKKwkJCWlmICh2OWZzX3RfY2x1bmsKKwkJCSAgICAoY3VycmVudF9maWQtPnY5c2VzLCBjdXJyZW50X2ZpZC0+ZmlkLCAmZmNhbGwpKQorCQkJCWRwcmludGsoREVCVUdfRVJST1IsICJjbHVuayBmYWlsZWQ6ICVzXG4iLAorCQkJCQlGQ0FMTF9FUlJPUihmY2FsbCkpOworCisJCQl2OWZzX3B1dF9pZHBvb2woY3VycmVudF9maWQtPmZpZCwKKwkJCQkJJmN1cnJlbnRfZmlkLT52OXNlcy0+ZmlkcG9vbCk7CisKKwkJCWtmcmVlKGZjYWxsKTsKKwkJCXY5ZnNfZmlkX2Rlc3Ryb3koY3VycmVudF9maWQpOworCQl9CisKKwkJa2ZyZWUoZGVudHJ5LT5kX2ZzZGF0YSk7CS8qIGZyZWUgdGhlIGxpc3RfaGVhZCAqLworCX0KK30KKworc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHY5ZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CisJLmRfcmV2YWxpZGF0ZSA9IHY5ZnNfZGVudHJ5X3ZhbGlkYXRlLAorCS5kX3JlbGVhc2UgPSB2OWZzX2RlbnRyeV9yZWxlYXNlLAorfTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19kaXIuYyBiL2ZzLzlwL3Zmc19kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDc4YTczCi0tLSAvZGV2L251bGwKKysrIGIvZnMvOXAvdmZzX2Rpci5jCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogbGludXgvZnMvOXAvdmZzX2Rpci5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHZmcyBkaXJlY3Rvcnkgb3BzIGZvciB0aGUgOVAyMDAwIHByb3RvY29sLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAiOXAuaCIKKyNpbmNsdWRlICJ2OWZzX3Zmcy5oIgorI2luY2x1ZGUgImNvbnYuaCIKKyNpbmNsdWRlICJmaWQuaCIKKworLyoqCisgKiBkdF90eXBlIC0gcmV0dXJuIGZpbGUgdHlwZQorICogQG1pc3RhdDogbWlzdGF0IHN0cnVjdHVyZQorICoKKyAqLworCitzdGF0aWMgaW5saW5lIGludCBkdF90eXBlKHN0cnVjdCB2OWZzX3N0YXQgKm1pc3RhdCkKK3sKKwl1bnNpZ25lZCBsb25nIHBlcm0gPSBtaXN0YXQtPm1vZGU7CisJaW50IHJldHR5cGUgPSBEVF9SRUc7CisKKwlpZiAocGVybSAmIFY5RlNfRE1ESVIpCisJCXJldHR5cGUgPSBEVF9ESVI7CisJaWYgKHBlcm0gJiBWOUZTX0RNU1lNTElOSykKKwkJcmV0dHlwZSA9IERUX0xOSzsKKworCXJldHVybiByZXR0eXBlOworfQorCisvKioKKyAqIHY5ZnNfZGlyX3JlYWRkaXIgLSByZWFkIGEgZGlyZWN0b3J5CisgKiBAZmlsZXA6IG9wZW5lZCBmaWxlIHN0cnVjdHVyZQorICogQGRpcmVudDogZGlyZWN0b3J5IHN0cnVjdHVyZSA/Pz8KKyAqIEBmaWxsZGlyOiBmdW5jdGlvbiB0byBwb3B1bGF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlID8/PworICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfZGlyX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoaW5vZGUpOworCXN0cnVjdCB2OWZzX2ZpZCAqZmlsZSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaSwgbjsKKwlpbnQgZmlkID0gLTE7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHY5ZnNfc3RhdCAqbWkgPSBOVUxMOworCWludCBvdmVyID0gMDsKKworCWRwcmludGsoREVCVUdfVkZTLCAibmFtZSAlc1xuIiwgZmlscC0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWZpZCA9IGZpbGUtPmZpZDsKKworCW1pID0ga21hbGxvYyh2OXNlcy0+bWF4ZGF0YSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtaSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoZmlsZS0+cmRpcl9mY2FsbCAmJiAoZmlscC0+Zl9wb3MgIT0gZmlsZS0+cmRpcl9wb3MpKSB7CisJCWtmcmVlKGZpbGUtPnJkaXJfZmNhbGwpOworCQlmaWxlLT5yZGlyX2ZjYWxsID0gTlVMTDsKKwl9CisKKwlpZiAoZmlsZS0+cmRpcl9mY2FsbCkgeworCQluID0gZmlsZS0+cmRpcl9mY2FsbC0+cGFyYW1zLnJyZWFkLmNvdW50OworCQlpID0gZmlsZS0+cmRpcl9mcG9zOworCQl3aGlsZSAoaSA8IG4pIHsKKwkJCWludCBzID0gdjlmc19kZXNlcmlhbGl6ZV9zdGF0KHY5c2VzLAorCQkJCSAgZmlsZS0+cmRpcl9mY2FsbC0+cGFyYW1zLnJyZWFkLmRhdGEgKyBpLAorCQkJICAgICAgICAgIG4gLSBpLCBtaSwgdjlzZXMtPm1heGRhdGEpOworCisJCQlpZiAocyA9PSAwKSB7CisJCQkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCQkJImVycm9yIHdoaWxlIGRlc2VyaWFsaXppbmcgbWlzdGF0XG4iKTsKKwkJCQlyZXQgPSAtRUlPOworCQkJCWdvdG8gRnJlZVN0cnVjdHM7CisJCQl9CisKKwkJCW92ZXIgPSBmaWxsZGlyKGRpcmVudCwgbWktPm5hbWUsIHN0cmxlbihtaS0+bmFtZSksCisJCQkJICAgIGZpbHAtPmZfcG9zLCB2OWZzX3FpZDJpbm8oJm1pLT5xaWQpLAorCQkJCSAgICBkdF90eXBlKG1pKSk7CisKKwkJCWlmIChvdmVyKSB7CisJCQkJZmlsZS0+cmRpcl9mcG9zID0gaTsKKwkJCQlmaWxlLT5yZGlyX3BvcyA9IGZpbHAtPmZfcG9zOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpICs9IHM7CisJCQlmaWxwLT5mX3BvcyArPSBzOworCQl9CisKKwkJaWYgKCFvdmVyKSB7CisJCQlrZnJlZShmaWxlLT5yZGlyX2ZjYWxsKTsKKwkJCWZpbGUtPnJkaXJfZmNhbGwgPSBOVUxMOworCQl9CisJfQorCisJd2hpbGUgKCFvdmVyKSB7CisJCXJldCA9IHY5ZnNfdF9yZWFkKHY5c2VzLCBmaWQsIGZpbHAtPmZfcG9zLAorCQkJCQkgICAgdjlzZXMtPm1heGRhdGEtVjlGU19JT0hEUlNaLCAmZmNhbGwpOworCQlpZiAocmV0IDwgMCkgeworCQkJZHByaW50ayhERUJVR19FUlJPUiwgImVycm9yIHdoaWxlIHJlYWRpbmc6ICVkOiAlcFxuIiwKKwkJCQlyZXQsIGZjYWxsKTsKKwkJCWdvdG8gRnJlZVN0cnVjdHM7CisJCX0gZWxzZSBpZiAocmV0ID09IDApCisJCQlicmVhazsKKworCQluID0gcmV0OworCQlpID0gMDsKKwkJd2hpbGUgKGkgPCBuKSB7CisJCQlpbnQgcyA9IHY5ZnNfZGVzZXJpYWxpemVfc3RhdCh2OXNlcywKKwkJCSAgICAgICAgICBmY2FsbC0+cGFyYW1zLnJyZWFkLmRhdGEgKyBpLCBuIC0gaSwgbWksCisJCQkgICAgICAgICAgdjlzZXMtPm1heGRhdGEpOworCisJCQlpZiAocyA9PSAwKSB7CisJCQkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCQkJImVycm9yIHdoaWxlIGRlc2VyaWFsaXppbmcgbWlzdGF0XG4iKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKworCQkJb3ZlciA9IGZpbGxkaXIoZGlyZW50LCBtaS0+bmFtZSwgc3RybGVuKG1pLT5uYW1lKSwKKwkJCQkgICAgZmlscC0+Zl9wb3MsIHY5ZnNfcWlkMmlubygmbWktPnFpZCksCisJCQkJICAgIGR0X3R5cGUobWkpKTsKKworCQkJaWYgKG92ZXIpIHsKKwkJCQlmaWxlLT5yZGlyX2ZjYWxsID0gZmNhbGw7CisJCQkJZmlsZS0+cmRpcl9mcG9zID0gaTsKKwkJCQlmaWxlLT5yZGlyX3BvcyA9IGZpbHAtPmZfcG9zOworCQkJCWZjYWxsID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaSArPSBzOworCQkJZmlscC0+Zl9wb3MgKz0gczsKKwkJfQorCisJCWtmcmVlKGZjYWxsKTsKKwl9CisKKyAgICAgIEZyZWVTdHJ1Y3RzOgorCWtmcmVlKGZjYWxsKTsKKwlrZnJlZShtaSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB2OWZzX2Rpcl9yZWxlYXNlIC0gY2xvc2UgYSBkaXJlY3RvcnkKKyAqIEBpbm9kZTogaW5vZGUgb2YgdGhlIGRpcmVjdG9yeQorICogQGZpbHA6IGZpbGUgcG9pbnRlciB0byBhIGRpcmVjdG9yeQorICoKKyAqLworCitpbnQgdjlmc19kaXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhpbm9kZSk7CisJc3RydWN0IHY5ZnNfZmlkICpmaWQgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IGZpZG51bSA9IC0xOworCisJZHByaW50ayhERUJVR19WRlMsICJpbm9kZTogJXAgZmlscDogJXAgZmlkOiAlZFxuIiwgaW5vZGUsIGZpbHAsCisJCWZpZC0+ZmlkKTsKKwlmaWRudW0gPSBmaWQtPmZpZDsKKworCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKKwlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKworCWlmIChmaWRudW0gPj0gMCkgeworCQlmaWQtPmZpZG9wZW4tLTsKKwkJZHByaW50ayhERUJVR19WRlMsICJmaWRvcGVuOiAlZCB2OWYtPmZpZDogJWRcbiIsIGZpZC0+Zmlkb3BlbiwKKwkJCWZpZC0+ZmlkKTsKKworCQlpZiAoZmlkLT5maWRvcGVuID09IDApIHsKKwkJCWlmICh2OWZzX3RfY2x1bmsodjlzZXMsIGZpZG51bSwgTlVMTCkpCisJCQkJZHByaW50ayhERUJVR19FUlJPUiwgImNsdW5rIGZhaWxlZFxuIik7CisKKwkJCXY5ZnNfcHV0X2lkcG9vbChmaWQtPmZpZCwgJnY5c2VzLT5maWRwb29sKTsKKwkJfQorCisJCWtmcmVlKGZpZC0+cmRpcl9mY2FsbCk7CisKKwkJZmlscC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwkJdjlmc19maWRfZGVzdHJveShmaWQpOworCX0KKworCWRfZHJvcChmaWxwLT5mX2RlbnRyeSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgdjlmc19kaXJfb3BlcmF0aW9ucyA9IHsKKwkucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIgPSB2OWZzX2Rpcl9yZWFkZGlyLAorCS5vcGVuID0gdjlmc19maWxlX29wZW4sCisJLnJlbGVhc2UgPSB2OWZzX2Rpcl9yZWxlYXNlLAorfTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19maWxlLmMgYi9mcy85cC92ZnNfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOGFlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC92ZnNfZmlsZS5jCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogIGxpbnV4L2ZzLzlwL3Zmc19maWxlLmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGlhbnMgdmZzIGZpbGUgb3BzIGZvciA5UDIwMDAuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAiOXAuaCIKKyNpbmNsdWRlICJ2OWZzX3Zmcy5oIgorI2luY2x1ZGUgImZpZC5oIgorCisvKioKKyAqIHY5ZnNfZmlsZV9vcGVuIC0gb3BlbiBhIGZpbGUgKG9yIGRpcmVjdG9yeSkKKyAqIEBpbm9kZTogaW5vZGUgdG8gYmUgb3BlbmVkCisgKiBAZmlsZTogZmlsZSBiZWluZyBvcGVuZWQKKyAqCisgKi8KKworaW50IHY5ZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGlub2RlKTsKKwlzdHJ1Y3Qgdjlmc19maWQgKnY5ZmlkID0gdjlmc19maWRfbG9va3VwKGZpbGUtPmZfZGVudHJ5LCBGSURfV0FMSyk7CisJc3RydWN0IHY5ZnNfZmlkICp2OW5ld2ZpZCA9IE5VTEw7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlpbnQgb3Blbl9tb2RlID0gMDsKKwl1bnNpZ25lZCBpbnQgaW91bml0ID0gMDsKKwlpbnQgbmV3ZmlkID0gLTE7CisJbG9uZyByZXN1bHQgPSAtMTsKKworCWRwcmludGsoREVCVUdfVkZTLCAiaW5vZGU6ICVwIGZpbGU6ICVwIHY5ZmlkPSAlcFxuIiwgaW5vZGUsIGZpbGUsCisJCXY5ZmlkKTsKKworCWlmICghdjlmaWQpIHsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJDb3VsZG4ndCByZXNvbHZlIGZpZCBmcm9tIGRlbnRyeVxuIik7CisKKwkJLyogWFhYIC0gc29tZSBkdXBsaWNhdGlvbiBmcm9tIGxvb2t1cCwgZ2VuZXJhbGl6ZSBsYXRlciAqLworCQkvKiBiYXNpY2FsbHkgdmZzX2xvb2t1cCBpcyB0b28gaGVhdnkgd2VpZ2h0ICovCisJCXY5ZmlkID0gdjlmc19maWRfbG9va3VwKGZpbGUtPmZfZGVudHJ5LCBGSURfT1ApOworCQlpZiAoIXY5ZmlkKQorCQkJcmV0dXJuIC1FQkFERjsKKworCQl2OWZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnktPmRfcGFyZW50LCBGSURfV0FMSyk7CisJCWlmICghdjlmaWQpCisJCQlyZXR1cm4gLUVCQURGOworCisJCW5ld2ZpZCA9IHY5ZnNfZ2V0X2lkcG9vbCgmdjlzZXMtPmZpZHBvb2wpOworCQlpZiAobmV3ZmlkIDwgMCkgeworCQkJZXByaW50ayhLRVJOX1dBUk5JTkcsICJuZXdmaWQgZmFpbHMhXG4iKTsKKwkJCXJldHVybiAtRU5PU1BDOworCQl9CisKKwkJcmVzdWx0ID0KKwkJICAgIHY5ZnNfdF93YWxrKHY5c2VzLCB2OWZpZC0+ZmlkLCBuZXdmaWQsCisJCQkJKGNoYXIgKilmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIE5VTEwpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJdjlmc19wdXRfaWRwb29sKG5ld2ZpZCwgJnY5c2VzLT5maWRwb29sKTsKKwkJCWRwcmludGsoREVCVUdfRVJST1IsICJyZXdhbGsgZGlkbid0IHdvcmtcbiIpOworCQkJcmV0dXJuIC1FQkFERjsKKwkJfQorCisJCXY5ZmlkID0gdjlmc19maWRfY3JlYXRlKGRlbnRyeSk7CisJCWlmICh2OWZpZCA9PSBOVUxMKSB7CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY291bGRuJ3QgaW5zZXJ0XG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXY5ZmlkLT5maWQgPSBuZXdmaWQ7CisJfQorCisJaWYgKHY5ZmlkLT5maWRjcmVhdGUpIHsKKwkJLyogY3JlYXRlIGNhc2UgKi8KKwkJbmV3ZmlkID0gdjlmaWQtPmZpZDsKKwkJaW91bml0ID0gdjlmaWQtPmlvdW5pdDsKKwkJdjlmaWQtPmZpZGNyZWF0ZSA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQkJbmV3ZmlkID0gdjlmaWQtPmZpZDsKKwkJZWxzZSB7CisJCQluZXdmaWQgPSB2OWZzX2dldF9pZHBvb2woJnY5c2VzLT5maWRwb29sKTsKKwkJCWlmIChuZXdmaWQgPCAwKSB7CisJCQkJZXByaW50ayhLRVJOX1dBUk5JTkcsICJhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQl9CisJCQkvKiBUaGlzIHdvdWxkIGJlIGEgc29tZXdoYXQgY3JpdGljYWwgY2xvbmUgKi8KKwkJCXJlc3VsdCA9CisJCQkgICAgdjlmc190X3dhbGsodjlzZXMsIHY5ZmlkLT5maWQsIG5ld2ZpZCwgTlVMTCwKKwkJCQkJJmZjYWxsKTsKKwkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJZHByaW50ayhERUJVR19FUlJPUiwgImNsb25lIGVycm9yOiAlc1xuIiwKKwkJCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKKwkJCQlrZnJlZShmY2FsbCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJdjluZXdmaWQgPSB2OWZzX2ZpZF9jcmVhdGUoZmlsZS0+Zl9kZW50cnkpOworCQkJdjluZXdmaWQtPmZpZCA9IG5ld2ZpZDsKKwkJCXY5bmV3ZmlkLT5xaWQgPSB2OWZpZC0+cWlkOworCQkJdjluZXdmaWQtPmlvdW5pdCA9IHY5ZmlkLT5pb3VuaXQ7CisJCQl2OW5ld2ZpZC0+Zmlkb3BlbiA9IDA7CisJCQl2OW5ld2ZpZC0+ZmlkY2x1bmtlZCA9IDA7CisJCQl2OW5ld2ZpZC0+djlzZXMgPSB2OXNlczsKKwkJCXY5ZmlkID0gdjluZXdmaWQ7CisJCQlrZnJlZShmY2FsbCk7CisJCX0KKworCQkvKiBUT0RPOiBkbyBzcGVjaWFsIHRoaW5ncyBmb3IgT19FWENMLCBPX05PRk9MTE9XLCBPX1NZTkMgKi8KKwkJLyogdHJhbnNsYXRlIG9wZW4gbW9kZSBhcHByb3ByaWF0ZWx5ICovCisJCW9wZW5fbW9kZSA9IGZpbGUtPmZfZmxhZ3MgJiAweDM7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0VYQ0wpCisJCQlvcGVuX21vZGUgfD0gVjlGU19PRVhDTDsKKworCQlpZiAodjlzZXMtPmV4dGVuZGVkKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fVFJVTkMpCisJCQkJb3Blbl9tb2RlIHw9IFY5RlNfT1RSVU5DOworCisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKQorCQkJCW9wZW5fbW9kZSB8PSBWOUZTX09BUFBFTkQ7CisJCX0KKworCQlyZXN1bHQgPSB2OWZzX3Rfb3Blbih2OXNlcywgbmV3ZmlkLCBvcGVuX21vZGUsICZmY2FsbCk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJCSJvcGVuIGZhaWxlZCwgb3Blbl9tb2RlIDB4JXg6ICVzXG4iLCBvcGVuX21vZGUsCisJCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKKwkJCWtmcmVlKGZjYWxsKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlpb3VuaXQgPSBmY2FsbC0+cGFyYW1zLnJvcGVuLmlvdW5pdDsKKwkJa2ZyZWUoZmNhbGwpOworCX0KKworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gdjlmaWQ7CisKKwl2OWZpZC0+cmRpcl9wb3MgPSAwOworCXY5ZmlkLT5yZGlyX2ZjYWxsID0gTlVMTDsKKwl2OWZpZC0+Zmlkb3BlbiA9IDE7CisJdjlmaWQtPmZpbHAgPSBmaWxlOworCXY5ZmlkLT5pb3VuaXQgPSBpb3VuaXQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2OWZzX2ZpbGVfbG9jayAtIGxvY2sgYSBmaWxlIChvciBkaXJlY3RvcnkpCisgKiBAaW5vZGU6IGlub2RlIHRvIGJlIG9wZW5lZAorICogQGZpbGU6IGZpbGUgYmVpbmcgb3BlbmVkCisgKgorICogWFhYIC0gdGhpcyBsb29rcyBsaWtlIGEgbG9jYWwgb25seSBsb2NrLCB3ZSBzaG91bGQgZXh0ZW5kIGludG8gOVAKKyAqICAgICAgIGJ5IHVzaW5nIG9wZW4gZXhjbHVzaXZlCisgKi8KKworc3RhdGljIGludCB2OWZzX2ZpbGVfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJaW50IHJlcyA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCisJZHByaW50ayhERUJVR19WRlMsICJmaWxwOiAlcCBsb2NrOiAlcFxuIiwgZmlscCwgZmwpOworCisJLyogTm8gbWFuZGF0b3J5IGxvY2tzICovCisJaWYgKChpbm9kZS0+aV9tb2RlICYgKFNfSVNHSUQgfCBTX0lYR1JQKSkgPT0gU19JU0dJRCkKKwkJcmV0dXJuIC1FTk9MQ0s7CisKKwlpZiAoKElTX1NFVExLKGNtZCkgfHwgSVNfU0VUTEtXKGNtZCkpICYmIGZsLT5mbF90eXBlICE9IEZfVU5MQ0spIHsKKwkJZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpOworCQlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSk7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiB2OWZzX3JlYWQgLSByZWFkIGZyb20gYSBmaWxlIChpbnRlcm5hbCkKKyAqIEBmaWxlcDogZmlsZSBwb2ludGVyIHRvIHJlYWQKKyAqIEBkYXRhOiBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgaW50bworICogQGNvdW50OiBzaXplIG9mIGJ1ZmZlcgorICogQG9mZnNldDogb2Zmc2V0IGF0IHdoaWNoIHRvIHJlYWQgZGF0YQorICoKKyAqLworCitzdGF0aWMgc3NpemVfdAordjlmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogb2Zmc2V0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhpbm9kZSk7CisJc3RydWN0IHY5ZnNfZmlkICp2OWYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlpbnQgZmlkID0gdjlmLT5maWQ7CisJaW50IHJzaXplID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgdG90YWwgPSAwOworCisJZHByaW50ayhERUJVR19WRlMsICJcbiIpOworCisJcnNpemUgPSB2OXNlcy0+bWF4ZGF0YSAtIFY5RlNfSU9IRFJTWjsKKwlpZiAodjlmLT5pb3VuaXQgIT0gMCAmJiByc2l6ZSA+IHY5Zi0+aW91bml0KQorCQlyc2l6ZSA9IHY5Zi0+aW91bml0OworCisJZG8geworCQlpZiAoY291bnQgPCByc2l6ZSkKKwkJCXJzaXplID0gY291bnQ7CisKKwkJcmVzdWx0ID0gdjlmc190X3JlYWQodjlzZXMsIGZpZCwgKm9mZnNldCwgcnNpemUsICZmY2FsbCk7CisKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiOVAyMDAwOiB2OWZzX3RfcmVhZCByZXR1cm5lZCAlZFxuIiwKKwkJCSAgICAgICByZXN1bHQpOworCisJCQlrZnJlZShmY2FsbCk7CisJCQlyZXR1cm4gdG90YWw7CisJCX0gZWxzZQorCQkJKm9mZnNldCArPSByZXN1bHQ7CisKKwkJLyogWFhYIC0gZXh0cmEgY29weSAqLworCQltZW1jcHkoYnVmZmVyLCBmY2FsbC0+cGFyYW1zLnJyZWFkLmRhdGEsIHJlc3VsdCk7CisJCWNvdW50IC09IHJlc3VsdDsKKwkJYnVmZmVyICs9IHJlc3VsdDsKKwkJdG90YWwgKz0gcmVzdWx0OworCisJCWtmcmVlKGZjYWxsKTsKKworCQlpZiAocmVzdWx0IDwgcnNpemUpCisJCQlicmVhazsKKwl9IHdoaWxlIChjb3VudCk7CisKKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qKgorICogdjlmc19maWxlX3JlYWQgLSByZWFkIGZyb20gYSBmaWxlCisgKiBAZmlsZXA6IGZpbGUgcG9pbnRlciB0byByZWFkCisgKiBAZGF0YTogZGF0YSBidWZmZXIgdG8gcmVhZCBkYXRhIGludG8KKyAqIEBjb3VudDogc2l6ZSBvZiBidWZmZXIKKyAqIEBvZmZzZXQ6IG9mZnNldCBhdCB3aGljaCB0byByZWFkIGRhdGEKKyAqCisgKi8KKworc3RhdGljIHNzaXplX3QKK3Y5ZnNfZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqIGRhdGEsIHNpemVfdCBjb3VudCwKKwkgICAgICAgbG9mZl90ICogb2Zmc2V0KQoreworCWludCByZXR2YWwgPSAtMTsKKwlpbnQgcmV0ID0gMDsKKwljaGFyICpidWZmZXI7CisKKwlidWZmZXIgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR2YWwgPSB2OWZzX3JlYWQoZmlscCwgYnVmZmVyLCBjb3VudCwgb2Zmc2V0KTsKKwlpZiAocmV0dmFsID4gMCkgeworCQlpZiAoKHJldCA9IGNvcHlfdG9fdXNlcihkYXRhLCBidWZmZXIsIHJldHZhbCkpICE9IDApIHsKKwkJCWRwcmludGsoREVCVUdfRVJST1IsICJQcm9ibGVtIGNvcHlpbmcgdG8gdXNlciAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dmFsID0gcmV0OworCQl9CisJfQorCisJa2ZyZWUoYnVmZmVyKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogdjlmc193cml0ZSAtIHdyaXRlIHRvIGEgZmlsZQorICogQGZpbGVwOiBmaWxlIHBvaW50ZXIgdG8gd3JpdGUKKyAqIEBkYXRhOiBkYXRhIGJ1ZmZlciB0byB3cml0ZSBkYXRhIGZyb20KKyAqIEBjb3VudDogc2l6ZSBvZiBidWZmZXIKKyAqIEBvZmZzZXQ6IG9mZnNldCBhdCB3aGljaCB0byB3cml0ZSBkYXRhCisgKgorICovCisKK3N0YXRpYyBzc2l6ZV90Cit2OWZzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogb2Zmc2V0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhpbm9kZSk7CisJc3RydWN0IHY5ZnNfZmlkICp2OWZpZCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGw7CisJaW50IGZpZCA9IHY5ZmlkLT5maWQ7CisJaW50IHJlc3VsdCA9IC1FSU87CisJaW50IHJzaXplID0gMDsKKwlpbnQgdG90YWwgPSAwOworCisJZHByaW50ayhERUJVR19WRlMsICJkYXRhICVwIGNvdW50ICVkIG9mZnNldCAleFxuIiwgYnVmZmVyLCAoaW50KWNvdW50LAorCQkoaW50KSpvZmZzZXQpOworCXJzaXplID0gdjlzZXMtPm1heGRhdGEgLSBWOUZTX0lPSERSU1o7CisJaWYgKHY5ZmlkLT5pb3VuaXQgIT0gMCAmJiByc2l6ZSA+IHY5ZmlkLT5pb3VuaXQpCisJCXJzaXplID0gdjlmaWQtPmlvdW5pdDsKKworCWR1bXBfZGF0YShidWZmZXIsIGNvdW50KTsKKworCWRvIHsKKwkJaWYgKGNvdW50IDwgcnNpemUpCisJCQlyc2l6ZSA9IGNvdW50OworCisJCXJlc3VsdCA9CisJCSAgICB2OWZzX3Rfd3JpdGUodjlzZXMsIGZpZCwgKm9mZnNldCwgcnNpemUsIGJ1ZmZlciwgJmZjYWxsKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWVwcmludGsoS0VSTl9FUlIsICJlcnJvciB3aGlsZSB3cml0aW5nOiAlcyglZClcbiIsCisJCQkJRkNBTExfRVJST1IoZmNhbGwpLCByZXN1bHQpOworCQkJa2ZyZWUoZmNhbGwpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBlbHNlCisJCQkqb2Zmc2V0ICs9IHJlc3VsdDsKKworCQlrZnJlZShmY2FsbCk7CisKKwkJaWYgKHJlc3VsdCAhPSByc2l6ZSkgeworCQkJZXByaW50ayhLRVJOX0VSUiwKKwkJCQkic2hvcnQgd3JpdGU6IHY5ZnNfdF93cml0ZSByZXR1cm5lZCAlZFxuIiwKKwkJCQlyZXN1bHQpOworCQkJYnJlYWs7CisJCX0KKworCQljb3VudCAtPSByZXN1bHQ7CisJCWJ1ZmZlciArPSByZXN1bHQ7CisJCXRvdGFsICs9IHJlc3VsdDsKKwl9IHdoaWxlIChjb3VudCk7CisKKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qKgorICogdjlmc19maWxlX3dyaXRlIC0gd3JpdGUgdG8gYSBmaWxlCisgKiBAZmlsZXA6IGZpbGUgcG9pbnRlciB0byB3cml0ZQorICogQGRhdGE6IGRhdGEgYnVmZmVyIHRvIHdyaXRlIGRhdGEgZnJvbQorICogQGNvdW50OiBzaXplIG9mIGJ1ZmZlcgorICogQG9mZnNldDogb2Zmc2V0IGF0IHdoaWNoIHRvIHdyaXRlIGRhdGEKKyAqCisgKi8KKworc3RhdGljIHNzaXplX3QKK3Y5ZnNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKiBkYXRhLAorCQlzaXplX3QgY291bnQsIGxvZmZfdCAqIG9mZnNldCkKK3sKKwlpbnQgcmV0ID0gLTE7CisJY2hhciAqYnVmZmVyOworCisJYnVmZmVyID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGNvcHlfZnJvbV91c2VyKGJ1ZmZlciwgZGF0YSwgY291bnQpOworCWlmIChyZXQpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIlByb2JsZW0gY29weWluZyBmcm9tIHVzZXJcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCX0gZWxzZSB7CisJCXJldCA9IHY5ZnNfd3JpdGUoZmlscCwgYnVmZmVyLCBjb3VudCwgb2Zmc2V0KTsKKwl9CisKKwlrZnJlZShidWZmZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2OWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZCA9IHY5ZnNfZmlsZV9yZWFkLAorCS53cml0ZSA9IHY5ZnNfZmlsZV93cml0ZSwKKwkub3BlbiA9IHY5ZnNfZmlsZV9vcGVuLAorCS5yZWxlYXNlID0gdjlmc19kaXJfcmVsZWFzZSwKKwkubG9jayA9IHY5ZnNfZmlsZV9sb2NrLAorfTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19pbm9kZS5jIGIvZnMvOXAvdmZzX2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxM2ZjNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL3Zmc19pbm9kZS5jCkBAIC0wLDAgKzEsMTMzOCBAQAorLyoKKyAqICBsaW51eC9mcy85cC92ZnNfaW5vZGUuYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB2ZnMgaW5vZGUgb3BzIGZvciB0aGUgOVAyMDAwIHByb3RvY29sLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAiOXAuaCIKKyNpbmNsdWRlICJ2OWZzX3Zmcy5oIgorI2luY2x1ZGUgImNvbnYuaCIKKyNpbmNsdWRlICJmaWQuaCIKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19kaXJfaW5vZGVfb3BlcmF0aW9uc19leHQ7CitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisKKy8qKgorICogdW5peG1vZGUycDltb2RlIC0gY29udmVydCB1bml4IG1vZGUgYml0cyB0byBwbGFuIDkKKyAqIEB2OXNlczogdjlmcyBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAbW9kZTogbW9kZSB0byBjb252ZXJ0CisgKgorICovCisKK3N0YXRpYyBpbnQgdW5peG1vZGUycDltb2RlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIGludCBtb2RlKQoreworCWludCByZXM7CisJcmVzID0gbW9kZSAmIDA3Nzc7CisJaWYgKFNfSVNESVIobW9kZSkpCisJCXJlcyB8PSBWOUZTX0RNRElSOworCWlmICh2OXNlcy0+ZXh0ZW5kZWQpIHsKKwkJaWYgKFNfSVNMTksobW9kZSkpCisJCQlyZXMgfD0gVjlGU19ETVNZTUxJTks7CisJCWlmICh2OXNlcy0+bm9kZXYgPT0gMCkgeworCQkJaWYgKFNfSVNTT0NLKG1vZGUpKQorCQkJCXJlcyB8PSBWOUZTX0RNU09DS0VUOworCQkJaWYgKFNfSVNGSUZPKG1vZGUpKQorCQkJCXJlcyB8PSBWOUZTX0RNTkFNRURQSVBFOworCQkJaWYgKFNfSVNCTEsobW9kZSkpCisJCQkJcmVzIHw9IFY5RlNfRE1ERVZJQ0U7CisJCQlpZiAoU19JU0NIUihtb2RlKSkKKwkJCQlyZXMgfD0gVjlGU19ETURFVklDRTsKKwkJfQorCisJCWlmICgobW9kZSAmIFNfSVNVSUQpID09IFNfSVNVSUQpCisJCQlyZXMgfD0gVjlGU19ETVNFVFVJRDsKKwkJaWYgKChtb2RlICYgU19JU0dJRCkgPT0gU19JU0dJRCkKKwkJCXJlcyB8PSBWOUZTX0RNU0VUR0lEOworCQlpZiAoKG1vZGUgJiBWOUZTX0RNTElOSykpCisJCQlyZXMgfD0gVjlGU19ETUxJTks7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBwOW1vZGUydW5peG1vZGUtIGNvbnZlcnQgcGxhbjkgbW9kZSBiaXRzIHRvIHVuaXggbW9kZSBiaXRzCisgKiBAdjlzZXM6IHY5ZnMgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQG1vZGU6IG1vZGUgdG8gY29udmVydAorICoKKyAqLworCitzdGF0aWMgaW50IHA5bW9kZTJ1bml4bW9kZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBpbnQgbW9kZSkKK3sKKwlpbnQgcmVzOworCisJcmVzID0gbW9kZSAmIDA3Nzc7CisKKwlpZiAoKG1vZGUgJiBWOUZTX0RNRElSKSA9PSBWOUZTX0RNRElSKQorCQlyZXMgfD0gU19JRkRJUjsKKwllbHNlIGlmICgobW9kZSAmIFY5RlNfRE1TWU1MSU5LKSAmJiAodjlzZXMtPmV4dGVuZGVkKSkKKwkJcmVzIHw9IFNfSUZMTks7CisJZWxzZSBpZiAoKG1vZGUgJiBWOUZTX0RNU09DS0VUKSAmJiAodjlzZXMtPmV4dGVuZGVkKQorCQkgJiYgKHY5c2VzLT5ub2RldiA9PSAwKSkKKwkJcmVzIHw9IFNfSUZTT0NLOworCWVsc2UgaWYgKChtb2RlICYgVjlGU19ETU5BTUVEUElQRSkgJiYgKHY5c2VzLT5leHRlbmRlZCkKKwkJICYmICh2OXNlcy0+bm9kZXYgPT0gMCkpCisJCXJlcyB8PSBTX0lGSUZPOworCWVsc2UgaWYgKChtb2RlICYgVjlGU19ETURFVklDRSkgJiYgKHY5c2VzLT5leHRlbmRlZCkKKwkJICYmICh2OXNlcy0+bm9kZXYgPT0gMCkpCisJCXJlcyB8PSBTX0lGQkxLOworCWVsc2UKKwkJcmVzIHw9IFNfSUZSRUc7CisKKwlpZiAodjlzZXMtPmV4dGVuZGVkKSB7CisJCWlmICgobW9kZSAmIFY5RlNfRE1TRVRVSUQpID09IFY5RlNfRE1TRVRVSUQpCisJCQlyZXMgfD0gU19JU1VJRDsKKworCQlpZiAoKG1vZGUgJiBWOUZTX0RNU0VUR0lEKSA9PSBWOUZTX0RNU0VUR0lEKQorCQkJcmVzIHw9IFNfSVNHSUQ7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiB2OWZzX2JsYW5rX21pc3RhdCAtIGhlbHBlciBmdW5jdGlvbiB0byBzZXR1cCBhIDlQIHN0YXQgc3RydWN0dXJlCisgKiBAdjlzZXM6IDlQIHNlc3Npb24gaW5mbyAoZm9yIGRldGVybWluaW5nIGV4dGVuZGVkIG1vZGUpCisgKiBAbWlzdGF0OiBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZQorICoKKyAqLworCitzdGF0aWMgdm9pZAordjlmc19ibGFua19taXN0YXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHY5ZnNfc3RhdCAqbWlzdGF0KQoreworCW1pc3RhdC0+dHlwZSA9IH4wOworCW1pc3RhdC0+ZGV2ID0gfjA7CisJbWlzdGF0LT5xaWQudHlwZSA9IH4wOworCW1pc3RhdC0+cWlkLnZlcnNpb24gPSB+MDsKKwkqKChsb25nIGxvbmcgKikmbWlzdGF0LT5xaWQucGF0aCkgPSB+MDsKKwltaXN0YXQtPm1vZGUgPSB+MDsKKwltaXN0YXQtPmF0aW1lID0gfjA7CisJbWlzdGF0LT5tdGltZSA9IH4wOworCW1pc3RhdC0+bGVuZ3RoID0gfjA7CisJbWlzdGF0LT5uYW1lID0gbWlzdGF0LT5kYXRhOworCW1pc3RhdC0+dWlkID0gbWlzdGF0LT5kYXRhOworCW1pc3RhdC0+Z2lkID0gbWlzdGF0LT5kYXRhOworCW1pc3RhdC0+bXVpZCA9IG1pc3RhdC0+ZGF0YTsKKwlpZiAodjlzZXMtPmV4dGVuZGVkKSB7CisJCW1pc3RhdC0+bl91aWQgPSB+MDsKKwkJbWlzdGF0LT5uX2dpZCA9IH4wOworCQltaXN0YXQtPm5fbXVpZCA9IH4wOworCQltaXN0YXQtPmV4dGVuc2lvbiA9IG1pc3RhdC0+ZGF0YTsKKwl9CisJKm1pc3RhdC0+ZGF0YSA9IDA7Cit9CisKKy8qKgorICogdjlmc19taXN0YXQydW5peCAtIGNvbnZlcnQgbWlzdGF0IHRvIHVuaXggc3RhdAorICogQG1pc3RhdDogUGxhbiA5IG1ldGFkYXRhIChtaXN0YXQpIHN0cnVjdHVyZQorICogQGJ1ZjogdW5peCBtZXRhZGF0YSAoc3RhdCkgc3RydWN0dXJlIHRvIHBvcHVsYXRlCisgKiBAc2I6IHN1cGVyYmxvY2sKKyAqCisgKi8KKworc3RhdGljIHZvaWQKK3Y5ZnNfbWlzdGF0MnVuaXgoc3RydWN0IHY5ZnNfc3RhdCAqbWlzdGF0LCBzdHJ1Y3Qgc3RhdCAqYnVmLAorCQkgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gc2IgPyBzYi0+c19mc19pbmZvIDogTlVMTDsKKworCWJ1Zi0+c3RfbmxpbmsgPSAxOworCisJYnVmLT5zdF9hdGltZSA9IG1pc3RhdC0+YXRpbWU7CisJYnVmLT5zdF9tdGltZSA9IG1pc3RhdC0+bXRpbWU7CisJYnVmLT5zdF9jdGltZSA9IG1pc3RhdC0+bXRpbWU7CisKKwlidWYtPnN0X3VpZCA9ICh1bnNpZ25lZCBzaG9ydCktMTsKKwlidWYtPnN0X2dpZCA9ICh1bnNpZ25lZCBzaG9ydCktMTsKKworCWlmICh2OXNlcyAmJiB2OXNlcy0+ZXh0ZW5kZWQpIHsKKwkJLyogVE9ETzogc3RyaW5nIHRvIHVpZCBtYXBwaW5nIHZpYSB1c2VyLXNwYWNlIGRhZW1vbiAqLworCQlpZiAobWlzdGF0LT5uX3VpZCAhPSAtMSkKKwkJCXNzY2FuZihtaXN0YXQtPnVpZCwgIiV4IiwgKHVuc2lnbmVkIGludCAqKSZidWYtPnN0X3VpZCk7CisKKwkJaWYgKG1pc3RhdC0+bl9naWQgIT0gLTEpCisJCQlzc2NhbmYobWlzdGF0LT5naWQsICIleCIsICh1bnNpZ25lZCBpbnQgKikmYnVmLT5zdF9naWQpOworCX0KKworCWlmIChidWYtPnN0X3VpZCA9PSAodW5zaWduZWQgc2hvcnQpLTEpCisJCWJ1Zi0+c3RfdWlkID0gdjlzZXMtPnVpZDsKKwlpZiAoYnVmLT5zdF9naWQgPT0gKHVuc2lnbmVkIHNob3J0KS0xKQorCQlidWYtPnN0X2dpZCA9IHY5c2VzLT5naWQ7CisKKwlidWYtPnN0X21vZGUgPSBwOW1vZGUydW5peG1vZGUodjlzZXMsIG1pc3RhdC0+bW9kZSk7CisJaWYgKChTX0lTQkxLKGJ1Zi0+c3RfbW9kZSkpIHx8IChTX0lTQ0hSKGJ1Zi0+c3RfbW9kZSkpKSB7CisJCWNoYXIgdHlwZSA9IDA7CisJCWludCBtYWpvciA9IC0xOworCQlpbnQgbWlub3IgPSAtMTsKKwkJc3NjYW5mKG1pc3RhdC0+ZXh0ZW5zaW9uLCAiJWMgJXUgJXUiLCAmdHlwZSwgJm1ham9yLCAmbWlub3IpOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSAnYyc6CisJCQlidWYtPnN0X21vZGUgJj0gflNfSUZCTEs7CisJCQlidWYtPnN0X21vZGUgfD0gU19JRkNIUjsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50ayhERUJVR19FUlJPUiwgIlVua25vd24gc3BlY2lhbCB0eXBlICVjICglcylcbiIsCisJCQkJdHlwZSwgbWlzdGF0LT5leHRlbnNpb24pOworCQl9OworCQlidWYtPnN0X3JkZXYgPSBNS0RFVihtYWpvciwgbWlub3IpOworCX0gZWxzZQorCQlidWYtPnN0X3JkZXYgPSAwOworCisJYnVmLT5zdF9zaXplID0gbWlzdGF0LT5sZW5ndGg7CisKKwlidWYtPnN0X2Jsa3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJYnVmLT5zdF9ibG9ja3MgPQorCSAgICAoYnVmLT5zdF9zaXplICsgYnVmLT5zdF9ibGtzaXplIC0gMSkgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7Cit9CisKKy8qKgorICogdjlmc19nZXRfaW5vZGUgLSBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0dXAgYW4gaW5vZGUKKyAqIEBzYjogc3VwZXJibG9jaworICogQG1vZGU6IG1vZGUgdG8gc2V0dXAgaW5vZGUgd2l0aAorICoKKyAqLworCitzdHJ1Y3QgaW5vZGUgKnY5ZnNfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSBzYi0+c19mc19pbmZvOworCisJZHByaW50ayhERUJVR19WRlMsICJzdXBlciBibG9jazogJXAgbW9kZTogJW9cbiIsIHNiLCBtb2RlKTsKKworCWlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoaW5vZGUpIHsKKwkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKKwkJaW5vZGUtPmlfYmxrc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwkJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwkJaW5vZGUtPmlfcmRldiA9IDA7CisJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKworCQlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKKwkJY2FzZSBTX0lGSUZPOgorCQljYXNlIFNfSUZCTEs6CisJCWNhc2UgU19JRkNIUjoKKwkJY2FzZSBTX0lGU09DSzoKKwkJCWlmKCF2OXNlcy0+ZXh0ZW5kZWQpIHsKKwkJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAic3BlY2lhbCBmaWxlcyB3aXRob3V0IGV4dGVuZGVkIG1vZGVcbiIpOworCQkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQkJfQorCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAorCQkJCQkgICBpbm9kZS0+aV9yZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZSRUc6CisJCQlpbm9kZS0+aV9vcCA9ICZ2OWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZ2OWZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZMTks6CisJCQlpZighdjlzZXMtPmV4dGVuZGVkKSB7CisJCQkJZHByaW50ayhERUJVR19FUlJPUiwgImV4dGVuZGVkIG1vZGVzIHVzZWQgdy9vIDlQMjAwMC51XG4iKTsKKwkJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwkJCX0KKwkJCWlub2RlLT5pX29wID0gJnY5ZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJYnJlYWs7CisJCWNhc2UgU19JRkRJUjoKKwkJCWlub2RlLT5pX25saW5rKys7CisJCQlpZih2OXNlcy0+ZXh0ZW5kZWQpCisJCQkJaW5vZGUtPmlfb3AgPSAmdjlmc19kaXJfaW5vZGVfb3BlcmF0aW9uc19leHQ7CisJCQllbHNlCisJCQkJaW5vZGUtPmlfb3AgPSAmdjlmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZ2OWZzX2Rpcl9vcGVyYXRpb25zOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiQkFEIG1vZGUgMHgleCBTX0lGTVQgMHgleFxuIiwKKwkJCQltb2RlLCBtb2RlICYgU19JRk1UKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQl9CisJfSBlbHNlIHsKKwkJZXByaW50ayhLRVJOX1dBUk5JTkcsICJQcm9ibGVtIGFsbG9jYXRpbmcgaW5vZGVcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJcmV0dXJuIGlub2RlOworfQorCisvKioKKyAqIHY5ZnNfY3JlYXRlIC0gaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKKyAqIEBkaXI6IGRpcmVjdG9yeSBpbm9kZSBmaWxlIGlzIGJlaW5nIGNyZWF0ZWQgaW4KKyAqIEBmaWxlX2RlbnRyeTogZGVudHJ5IGZpbGUgaXMgYmVpbmcgY3JlYXRlZCBpbgorICogQHBlcm06IHBlcm1pc3Npb25zIGZpbGUgaXMgYmVpbmcgY3JlYXRlZCB3aXRoCisgKiBAb3Blbl9tb2RlOiByZXN1bHRpbmcgb3BlbiBtb2RlIGZvciBmaWxlCisgKgorICovCisKK3N0YXRpYyBpbnQKK3Y5ZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLAorCSAgICBzdHJ1Y3QgZGVudHJ5ICpmaWxlX2RlbnRyeSwKKwkgICAgdW5zaWduZWQgaW50IHBlcm0sIHVuc2lnbmVkIGludCBvcGVuX21vZGUpCit7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGlyKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCB2OWZzX2ZpZCAqZGlyZmlkID0KKwkgICAgdjlmc19maWRfbG9va3VwKGZpbGVfZGVudHJ5LT5kX3BhcmVudCwgRklEX1dBTEspOworCXN0cnVjdCB2OWZzX2ZpZCAqZmlkID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmZpbGVfaW5vZGUgPSBOVUxMOworCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7CisJc3RydWN0IHY5ZnNfcWlkIHFpZDsKKwlzdHJ1Y3Qgc3RhdCBuZXdzdGF0OworCWludCBkaXJmaWRudW0gPSAtMTsKKwlsb25nIG5ld2ZpZCA9IC0xOworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCBpb3VuaXQgPSAwOworCisJcGVybSA9IHVuaXhtb2RlMnA5bW9kZSh2OXNlcywgcGVybSk7CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgImRpcjogJXAgZGVudHJ5OiAlcCBwZXJtOiAlbyBtb2RlOiAlb1xuIiwgZGlyLAorCQlmaWxlX2RlbnRyeSwgcGVybSwgb3Blbl9tb2RlKTsKKworCWlmICghZGlyZmlkKQorCQlyZXR1cm4gLUVCQURGOworCisJZGlyZmlkbnVtID0gZGlyZmlkLT5maWQ7CisJaWYgKGRpcmZpZG51bSA8IDApIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIk5vIGZpZCBmb3IgdGhlIGRpcmVjdG9yeSAjJWx1XG4iLAorCQkJZGlyLT5pX2lubyk7CisJCXJldHVybiAtRUJBREY7CisJfQorCisJaWYgKGZpbGVfZGVudHJ5LT5kX2lub2RlKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsCisJCQkiT2RkLiBUaGVyZSBpcyBhbiBpbm9kZSBmb3IgZGlyICVsdSwgbmFtZSA6JXM6XG4iLAorCQkJZGlyLT5pX2lubywgZmlsZV9kZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJbmV3ZmlkID0gdjlmc19nZXRfaWRwb29sKCZ2OXNlcy0+ZmlkcG9vbCk7CisJaWYgKG5ld2ZpZCA8IDApIHsKKwkJZXByaW50ayhLRVJOX1dBUk5JTkcsICJubyBmcmVlIGZpZHMgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJcmVzdWx0ID0gdjlmc190X3dhbGsodjlzZXMsIGRpcmZpZG51bSwgbmV3ZmlkLCBOVUxMLCAmZmNhbGwpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJjbG9uZSBlcnJvcjogJXNcbiIsIEZDQUxMX0VSUk9SKGZjYWxsKSk7CisJCXY5ZnNfcHV0X2lkcG9vbChuZXdmaWQsICZ2OXNlcy0+ZmlkcG9vbCk7CisJCW5ld2ZpZCA9IDA7CisJCWdvdG8gQ2xlYW5VcEZpZDsKKwl9CisKKwlrZnJlZShmY2FsbCk7CisKKwlyZXN1bHQgPSB2OWZzX3RfY3JlYXRlKHY5c2VzLCBuZXdmaWQsIChjaGFyICopZmlsZV9kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgICAgIHBlcm0sIG9wZW5fbW9kZSwgJmZjYWxsKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY3JlYXRlIGZhaWxzOiAlcyglZClcbiIsCisJCQlGQ0FMTF9FUlJPUihmY2FsbCksIHJlc3VsdCk7CisKKwkJZ290byBDbGVhblVwRmlkOworCX0KKworCWlvdW5pdCA9IGZjYWxsLT5wYXJhbXMucmNyZWF0ZS5pb3VuaXQ7CisJcWlkID0gZmNhbGwtPnBhcmFtcy5yY3JlYXRlLnFpZDsKKwlrZnJlZShmY2FsbCk7CisKKwlmaWQgPSB2OWZzX2ZpZF9jcmVhdGUoZmlsZV9kZW50cnkpOworCWlmICghZmlkKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gQ2xlYW5VcEZpZDsKKwl9CisKKwlmaWQtPmZpZCA9IG5ld2ZpZDsKKwlmaWQtPmZpZG9wZW4gPSAwOworCWZpZC0+ZmlkY3JlYXRlID0gMTsKKwlmaWQtPnFpZCA9IHFpZDsKKwlmaWQtPmlvdW5pdCA9IGlvdW5pdDsKKwlmaWQtPnJkaXJfcG9zID0gMDsKKwlmaWQtPnJkaXJfZmNhbGwgPSBOVUxMOworCWZpZC0+djlzZXMgPSB2OXNlczsKKworCWlmICgocGVybSAmIFY5RlNfRE1TWU1MSU5LKSB8fCAocGVybSAmIFY5RlNfRE1MSU5LKSB8fAorCSAgICAocGVybSAmIFY5RlNfRE1OQU1FRFBJUEUpIHx8IChwZXJtICYgVjlGU19ETVNPQ0tFVCkgfHwKKwkgICAgKHBlcm0gJiBWOUZTX0RNREVWSUNFKSkKKwkJcmV0dXJuIDA7CisKKwlyZXN1bHQgPSB2OWZzX3Rfc3RhdCh2OXNlcywgbmV3ZmlkLCAmZmNhbGwpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJzdGF0IGVycm9yOiAlcyglZClcbiIsIEZDQUxMX0VSUk9SKGZjYWxsKSwKKwkJCXJlc3VsdCk7CisJCWdvdG8gQ2xlYW5VcEZpZDsKKwl9CisKKwl2OWZzX21pc3RhdDJ1bml4KGZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdCwgJm5ld3N0YXQsIHNiKTsKKworCWZpbGVfaW5vZGUgPSB2OWZzX2dldF9pbm9kZShzYiwgbmV3c3RhdC5zdF9tb2RlKTsKKwlpZiAoKCFmaWxlX2lub2RlKSB8fCBJU19FUlIoZmlsZV9pbm9kZSkpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgImNyZWF0ZSBpbm9kZSBmYWlsZWRcbiIpOworCQlyZXN1bHQgPSAtRUJBREY7CisJCWdvdG8gQ2xlYW5VcEZpZDsKKwl9CisKKwl2OWZzX21pc3RhdDJpbm9kZShmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQsIGZpbGVfaW5vZGUsIHNiKTsKKwlrZnJlZShmY2FsbCk7CisJZF9pbnN0YW50aWF0ZShmaWxlX2RlbnRyeSwgZmlsZV9pbm9kZSk7CisKKwlpZiAocGVybSAmIFY5RlNfRE1ESVIpIHsKKwkJaWYgKHY5ZnNfdF9jbHVuayh2OXNlcywgbmV3ZmlkLCAmZmNhbGwpKQorCQkJZHByaW50ayhERUJVR19FUlJPUiwgImNsdW5rIGZvciBta2RpciBmYWlsZWQ6ICVzXG4iLAorCQkJCUZDQUxMX0VSUk9SKGZjYWxsKSk7CisKKwkJdjlmc19wdXRfaWRwb29sKG5ld2ZpZCwgJnY5c2VzLT5maWRwb29sKTsKKwkJa2ZyZWUoZmNhbGwpOworCQlmaWQtPmZpZG9wZW4gPSAwOworCQlmaWQtPmZpZGNyZWF0ZSA9IDA7CisJCWRfZHJvcChmaWxlX2RlbnRyeSk7CisJfQorCisJcmV0dXJuIDA7CisKKyAgICAgIENsZWFuVXBGaWQ6CisJa2ZyZWUoZmNhbGwpOworCisJaWYgKG5ld2ZpZCkgeworCQlpZiAodjlmc190X2NsdW5rKHY5c2VzLCBuZXdmaWQsICZmY2FsbCkpCisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY2x1bmsgZmFpbGVkOiAlc1xuIiwKKwkJCQlGQ0FMTF9FUlJPUihmY2FsbCkpOworCisJCXY5ZnNfcHV0X2lkcG9vbChuZXdmaWQsICZ2OXNlcy0+ZmlkcG9vbCk7CisJCWtmcmVlKGZjYWxsKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiB2OWZzX3JlbW92ZSAtIGhlbHBlciBmdW5jdGlvbiB0byByZW1vdmUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisgKiBAZGlyOiBkaXJlY3RvcnkgaW5vZGUgdGhhdCBpcyBiZWluZyBkZWxldGVkCisgKiBAZmlsZTogIGRlbnRyeSB0aGF0IGlzIGJlaW5nIGRlbGV0ZWQKKyAqIEBybWRpcjogcmVtb3ZpbmcgYSBkaXJlY3RvcnkKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX3JlbW92ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZmlsZSwgaW50IHJtZGlyKQoreworCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IE5VTEw7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IE5VTEw7CisJc3RydWN0IHY5ZnNfZmlkICp2OWZpZCA9IE5VTEw7CisJc3RydWN0IGlub2RlICpmaWxlX2lub2RlID0gTlVMTDsKKwlpbnQgZmlkID0gLTE7CisJaW50IHJlc3VsdCA9IDA7CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgImlub2RlOiAlcCBkZW50cnk6ICVwIHJtZGlyOiAlZFxuIiwgZGlyLCBmaWxlLAorCQlybWRpcik7CisKKwlmaWxlX2lub2RlID0gZmlsZS0+ZF9pbm9kZTsKKwlzYiA9IGZpbGVfaW5vZGUtPmlfc2I7CisJdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGZpbGVfaW5vZGUpOworCXY5ZmlkID0gdjlmc19maWRfbG9va3VwKGZpbGUsIEZJRF9PUCk7CisKKwlpZiAoIXY5ZmlkKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsCisJCQkibm8gdjlmc19maWRcbiIpOworCQlyZXR1cm4gLUVCQURGOworCX0KKworCWZpZCA9IHY5ZmlkLT5maWQ7CisJaWYgKGZpZCA8IDApIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgImlub2RlICMlbHUsIG5vIGZpZCFcbiIsCisJCQlmaWxlX2lub2RlLT5pX2lubyk7CisJCXJldHVybiAtRUJBREY7CisJfQorCisJcmVzdWx0ID0gdjlmc190X3JlbW92ZSh2OXNlcywgZmlkLCAmZmNhbGwpOworCWlmIChyZXN1bHQgPCAwKQorCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAicmVtb3ZlIG9mIGZpbGUgZmFpbHM6ICVzKCVkKVxuIiwKKwkJCUZDQUxMX0VSUk9SKGZjYWxsKSwgcmVzdWx0KTsKKwllbHNlIHsKKwkJdjlmc19wdXRfaWRwb29sKGZpZCwgJnY5c2VzLT5maWRwb29sKTsKKwkJdjlmc19maWRfZGVzdHJveSh2OWZpZCk7CisJfQorCisJa2ZyZWUoZmNhbGwpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogdjlmc192ZnNfY3JlYXRlIC0gVkZTIGhvb2sgdG8gY3JlYXRlIGZpbGVzCisgKiBAaW5vZGU6IGRpcmVjdG9yeSBpbm9kZSB0aGF0IGlzIGJlaW5nIGRlbGV0ZWQKKyAqIEBkZW50cnk6ICBkZW50cnkgdGhhdCBpcyBiZWluZyBkZWxldGVkCisgKiBAcGVybTogY3JlYXRlIHBlcm1pc3Npb25zCisgKiBAbmQ6IHBhdGggaW5mb3JtYXRpb24KKyAqCisgKi8KKworc3RhdGljIGludAordjlmc192ZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IHBlcm0sCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXJldHVybiB2OWZzX2NyZWF0ZShpbm9kZSwgZGVudHJ5LCBwZXJtLCBPX1JEV1IpOworfQorCisvKioKKyAqIHY5ZnNfdmZzX21rZGlyIC0gVkZTIG1rZGlyIGhvb2sgdG8gY3JlYXRlIGEgZGlyZWN0b3J5CisgKiBAaW5vZGU6ICBpbm9kZSB0aGF0IGlzIGJlaW5nIHVubGlua2VkCisgKiBAZGVudHJ5OiBkZW50cnkgdGhhdCBpcyBiZWluZyB1bmxpbmtlZAorICogQG1vZGU6IG1vZGUgZm9yIG5ldyBkaXJlY3RvcnkKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX3Zmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCXJldHVybiB2OWZzX2NyZWF0ZShpbm9kZSwgZGVudHJ5LCBtb2RlIHwgU19JRkRJUiwgT19SRE9OTFkpOworfQorCisvKioKKyAqIHY5ZnNfdmZzX2xvb2t1cCAtIFZGUyBsb29rdXAgaG9vayB0byAid2FsayIgdG8gYSBuZXcgaW5vZGUKKyAqIEBkaXI6ICBpbm9kZSB0aGF0IGlzIGJlaW5nIHdhbGtlZCBmcm9tCisgKiBAZGVudHJ5OiBkZW50cnkgdGhhdCBpcyBiZWluZyB3YWxrZWQgdG8/CisgKiBAbmFtZWlkYXRhOiBwYXRoIGRhdGEKKyAqCisgKi8KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnY5ZnNfdmZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5hbWVpZGF0YSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7CisJc3RydWN0IHY5ZnNfZmlkICpkaXJmaWQ7CisJc3RydWN0IHY5ZnNfZmlkICpmaWQ7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOworCXN0cnVjdCBzdGF0IG5ld3N0YXQ7CisJaW50IGRpcmZpZG51bSA9IC0xOworCWludCBuZXdmaWQgPSAtMTsKKwlpbnQgcmVzdWx0ID0gMDsKKworCWRwcmludGsoREVCVUdfVkZTLCAiZGlyOiAlcCBkZW50cnk6ICglcykgJXAgbmFtZWlkYXRhOiAlcFxuIiwKKwkJZGlyLCBkZW50cnktPmRfaW5hbWUsIGRlbnRyeSwgbmFtZWlkYXRhKTsKKworCXNiID0gZGlyLT5pX3NiOworCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOworCWRpcmZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnktPmRfcGFyZW50LCBGSURfV0FMSyk7CisKKwlpZiAoIWRpcmZpZCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAibm8gZGlyZmlkXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJZGlyZmlkbnVtID0gZGlyZmlkLT5maWQ7CisKKwlpZiAoZGlyZmlkbnVtIDwgMCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAibm8gZGlyZmlkIGZvciBpbm9kZSAlcCwgIyVsdVxuIiwKKwkJCWRpciwgZGlyLT5pX2lubyk7CisJCXJldHVybiBFUlJfUFRSKC1FQkFERik7CisJfQorCisJbmV3ZmlkID0gdjlmc19nZXRfaWRwb29sKCZ2OXNlcy0+ZmlkcG9vbCk7CisJaWYgKG5ld2ZpZCA8IDApIHsKKwkJZXByaW50ayhLRVJOX1dBUk5JTkcsICJuZXdmaWQgZmFpbHMhXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisJfQorCisJcmVzdWx0ID0KKwkgICAgdjlmc190X3dhbGsodjlzZXMsIGRpcmZpZG51bSwgbmV3ZmlkLCAoY2hhciAqKWRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQlOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQl2OWZzX3B1dF9pZHBvb2wobmV3ZmlkLCAmdjlzZXMtPmZpZHBvb2wpOworCQlpZiAocmVzdWx0ID09IC1FTk9FTlQpIHsKKwkJCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJCSJSZXR1cm4gbmVnYXRpdmUgZGVudHJ5ICVwIGNvdW50ICVkXG4iLAorCQkJCWRlbnRyeSwgYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZHByaW50ayhERUJVR19FUlJPUiwgIndhbGsgZXJyb3I6JWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gRnJlZUZjYWxsOworCX0KKworCXJlc3VsdCA9IHY5ZnNfdF9zdGF0KHY5c2VzLCBuZXdmaWQsICZmY2FsbCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgInN0YXQgZXJyb3JcbiIpOworCQlnb3RvIEZyZWVGY2FsbDsKKwl9CisKKwl2OWZzX21pc3RhdDJ1bml4KGZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdCwgJm5ld3N0YXQsIHNiKTsKKwlpbm9kZSA9IHY5ZnNfZ2V0X2lub2RlKHNiLCBuZXdzdGF0LnN0X21vZGUpOworCisJaWYgKElTX0VSUihpbm9kZSkgJiYgKFBUUl9FUlIoaW5vZGUpID09IC1FTk9TUEMpKSB7CisJCWVwcmludGsoS0VSTl9XQVJOSU5HLCAiaW5vZGUgYWxsb2MgZmFpbGVzLCByZXR1cm5zICVsZFxuIiwKKwkJCVBUUl9FUlIoaW5vZGUpKTsKKworCQlyZXN1bHQgPSAtRU5PU1BDOworCQlnb3RvIEZyZWVGY2FsbDsKKwl9CisKKwlpbm9kZS0+aV9pbm8gPSB2OWZzX3FpZDJpbm8oJmZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdC0+cWlkKTsKKworCWZpZCA9IHY5ZnNfZmlkX2NyZWF0ZShkZW50cnkpOworCWlmIChmaWQgPT0gTlVMTCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY291bGRuJ3QgaW5zZXJ0XG4iKTsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBGcmVlRmNhbGw7CisJfQorCisJZmlkLT5maWQgPSBuZXdmaWQ7CisJZmlkLT5maWRvcGVuID0gMDsKKwlmaWQtPnY5c2VzID0gdjlzZXM7CisJZmlkLT5xaWQgPSBmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQtPnFpZDsKKworCWRlbnRyeS0+ZF9vcCA9ICZ2OWZzX2RlbnRyeV9vcGVyYXRpb25zOworCXY5ZnNfbWlzdGF0Mmlub2RlKGZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdCwgaW5vZGUsIGlub2RlLT5pX3NiKTsKKworCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCWtmcmVlKGZjYWxsKTsKKworCXJldHVybiBOVUxMOworCisgICAgICBGcmVlRmNhbGw6CisJa2ZyZWUoZmNhbGwpOworCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7Cit9CisKKy8qKgorICogdjlmc192ZnNfdW5saW5rIC0gVkZTIHVubGluayBob29rIHRvIGRlbGV0ZSBhbiBpbm9kZQorICogQGk6ICBpbm9kZSB0aGF0IGlzIGJlaW5nIHVubGlua2VkCisgKiBAZDogZGVudHJ5IHRoYXQgaXMgYmVpbmcgdW5saW5rZWQKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX3Zmc191bmxpbmsoc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZGVudHJ5ICpkKQoreworCXJldHVybiB2OWZzX3JlbW92ZShpLCBkLCAwKTsKK30KKworLyoqCisgKiB2OWZzX3Zmc19ybWRpciAtIFZGUyB1bmxpbmsgaG9vayB0byBkZWxldGUgYSBkaXJlY3RvcnkKKyAqIEBpOiAgaW5vZGUgdGhhdCBpcyBiZWluZyB1bmxpbmtlZAorICogQGQ6IGRlbnRyeSB0aGF0IGlzIGJlaW5nIHVubGlua2VkCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc192ZnNfcm1kaXIoc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZGVudHJ5ICpkKQoreworCXJldHVybiB2OWZzX3JlbW92ZShpLCBkLCAxKTsKK30KKworLyoqCisgKiB2OWZzX3Zmc19yZW5hbWUgLSBWRlMgaG9vayB0byByZW5hbWUgYW4gaW5vZGUKKyAqIEBvbGRfZGlyOiAgb2xkIGRpciBpbm9kZQorICogQG9sZF9kZW50cnk6IG9sZCBkZW50cnkKKyAqIEBuZXdfZGlyOiBuZXcgZGlyIGlub2RlCisgKiBAbmV3X2RlbnRyeTogbmV3IGRlbnRyeQorICoKKyAqLworCitzdGF0aWMgaW50Cit2OWZzX3Zmc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCQlzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IGlub2RlICpvbGRfaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKG9sZF9pbm9kZSk7CisJc3RydWN0IHY5ZnNfZmlkICpvbGRmaWQgPSB2OWZzX2ZpZF9sb29rdXAob2xkX2RlbnRyeSwgRklEX1dBTEspOworCXN0cnVjdCB2OWZzX2ZpZCAqb2xkZGlyZmlkID0KKwkgICAgdjlmc19maWRfbG9va3VwKG9sZF9kZW50cnktPmRfcGFyZW50LCBGSURfV0FMSyk7CisJc3RydWN0IHY5ZnNfZmlkICpuZXdkaXJmaWQgPQorCSAgICB2OWZzX2ZpZF9sb29rdXAobmV3X2RlbnRyeS0+ZF9wYXJlbnQsIEZJRF9XQUxLKTsKKwlzdHJ1Y3Qgdjlmc19zdGF0ICptaXN0YXQgPSBrbWFsbG9jKHY5c2VzLT5tYXhkYXRhLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOworCWludCBmaWQgPSAtMTsKKwlpbnQgb2xkZGlyZmlkbnVtID0gLTE7CisJaW50IG5ld2RpcmZpZG51bSA9IC0xOworCWludCByZXR2YWwgPSAwOworCisJZHByaW50ayhERUJVR19WRlMsICJcbiIpOworCisJaWYgKCFtaXN0YXQpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCghb2xkZmlkKSB8fCAoIW9sZGRpcmZpZCkgfHwgKCFuZXdkaXJmaWQpKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJwcm9ibGVtIHdpdGggYXJndW1lbnRzXG4iKTsKKwkJcmV0dXJuIC1FQkFERjsKKwl9CisKKwkvKiA5UCBjYW4gb25seSBoYW5kbGUgZmlsZSByZW5hbWUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5ICovCisJaWYgKG1lbWNtcCgmb2xkZGlyZmlkLT5xaWQsICZuZXdkaXJmaWQtPnFpZCwgc2l6ZW9mKG5ld2RpcmZpZC0+cWlkKSkpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIm9sZCBkaXIgYW5kIG5ldyBkaXIgYXJlIGRpZmZlcmVudFxuIik7CisJCXJldHZhbCA9IC1FUEVSTTsKKwkJZ290byBGcmVlRmNhbGxuQmFpbDsKKwl9CisKKwlmaWQgPSBvbGRmaWQtPmZpZDsKKwlvbGRkaXJmaWRudW0gPSBvbGRkaXJmaWQtPmZpZDsKKwluZXdkaXJmaWRudW0gPSBuZXdkaXJmaWQtPmZpZDsKKworCWlmIChmaWQgPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJubyBmaWQgZm9yIG9sZCBmaWxlICMlbHVcbiIsCisJCQlvbGRfaW5vZGUtPmlfaW5vKTsKKwkJcmV0dmFsID0gLUVCQURGOworCQlnb3RvIEZyZWVGY2FsbG5CYWlsOworCX0KKworCXY5ZnNfYmxhbmtfbWlzdGF0KHY5c2VzLCBtaXN0YXQpOworCisJc3RyY3B5KG1pc3RhdC0+ZGF0YSArIDEsIHY5c2VzLT5uYW1lKTsKKwltaXN0YXQtPm5hbWUgPSBtaXN0YXQtPmRhdGEgKyAxICsgc3RybGVuKHY5c2VzLT5uYW1lKTsKKworCWlmIChuZXdfZGVudHJ5LT5kX25hbWUubGVuID4KKwkgICAgKHY5c2VzLT5tYXhkYXRhIC0gc3RybGVuKHY5c2VzLT5uYW1lKSAtIHNpemVvZihzdHJ1Y3Qgdjlmc19zdGF0KSkpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIm5ldyBuYW1lIHRvbyBsb25nXG4iKTsKKwkJZ290byBGcmVlRmNhbGxuQmFpbDsKKwl9CisKKwlzdHJjcHkobWlzdGF0LT5uYW1lLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJcmV0dmFsID0gdjlmc190X3dzdGF0KHY5c2VzLCBmaWQsIG1pc3RhdCwgJmZjYWxsKTsKKworICAgICAgRnJlZUZjYWxsbkJhaWw6CisJa2ZyZWUobWlzdGF0KTsKKworCWlmIChyZXR2YWwgPCAwKQorCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAidjlmc190X3dzdGF0IGVycm9yOiAlc1xuIiwKKwkJCUZDQUxMX0VSUk9SKGZjYWxsKSk7CisKKwlrZnJlZShmY2FsbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiB2OWZzX3Zmc19nZXRhdHRyIC0gcmV0cmVpdmUgZmlsZSBtZXRhZGF0YQorICogQG1udCAtIG1vdW50IGluZm9ybWF0aW9uCisgKiBAZGVudHJ5IC0gZmlsZSB0byBnZXQgYXR0cmlidXRlcyBvbgorICogQHN0YXQgLSBtZXRhZGF0YSBzdHJ1Y3R1cmUgdG8gcG9wdWxhdGUKKyAqCisgKi8KKworc3RhdGljIGludAordjlmc192ZnNfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3Qgdjlmc19maWQgKmZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnksIEZJRF9PUCk7CisJaW50IGVyciA9IC1FUEVSTTsKKworCWRwcmludGsoREVCVUdfVkZTLCAiZGVudHJ5OiAlcFxuIiwgZGVudHJ5KTsKKwlpZiAoIWZpZCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJImNvdWxkbid0IGZpbmQgZmlkIGFzc29jaWF0ZWQgd2l0aCBkZW50cnlcbiIpOworCQlyZXR1cm4gLUVCQURGOworCX0KKworCWVyciA9IHY5ZnNfdF9zdGF0KHY5c2VzLCBmaWQtPmZpZCwgJmZjYWxsKTsKKworCWlmIChlcnIgPCAwKQorCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAic3RhdCBlcnJvclxuIik7CisJZWxzZSB7CisJCXY5ZnNfbWlzdGF0Mmlub2RlKGZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdCwgZGVudHJ5LT5kX2lub2RlLAorCQkJCSAgZGVudHJ5LT5kX2lub2RlLT5pX3NiKTsKKwkJZ2VuZXJpY19maWxsYXR0cihkZW50cnktPmRfaW5vZGUsIHN0YXQpOworCX0KKworCWtmcmVlKGZjYWxsKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHY5ZnNfdmZzX3NldGF0dHIgLSBzZXQgZmlsZSBtZXRhZGF0YQorICogQGRlbnRyeTogZmlsZSB3aG9zZSBtZXRhZGF0YSB0byBzZXQKKyAqIEBpYXR0cjogbWV0YWRhdGEgYXNzaWdubWVudCBzdHJ1Y3R1cmUKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX3Zmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICppYXR0cikKK3sKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCB2OWZzX2ZpZCAqZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeSwgRklEX09QKTsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOworCXN0cnVjdCB2OWZzX3N0YXQgKm1pc3RhdCA9IGttYWxsb2ModjlzZXMtPm1heGRhdGEsIEdGUF9LRVJORUwpOworCWludCByZXMgPSAtRVBFUk07CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgIlxuIik7CisKKwlpZiAoIW1pc3RhdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIWZpZCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJIkNvdWxkbid0IGZpbmQgZmlkIGFzc29jaWF0ZWQgd2l0aCBkZW50cnlcbiIpOworCQlyZXR1cm4gLUVCQURGOworCX0KKworCXY5ZnNfYmxhbmtfbWlzdGF0KHY5c2VzLCBtaXN0YXQpOworCWlmIChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpCisJCW1pc3RhdC0+bW9kZSA9IHVuaXhtb2RlMnA5bW9kZSh2OXNlcywgaWF0dHItPmlhX21vZGUpOworCisJaWYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpCisJCW1pc3RhdC0+bXRpbWUgPSBpYXR0ci0+aWFfbXRpbWUudHZfc2VjOworCisJaWYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpCisJCW1pc3RhdC0+YXRpbWUgPSBpYXR0ci0+aWFfYXRpbWUudHZfc2VjOworCisJaWYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkKKwkJbWlzdGF0LT5sZW5ndGggPSBpYXR0ci0+aWFfc2l6ZTsKKworCWlmICh2OXNlcy0+ZXh0ZW5kZWQpIHsKKwkJY2hhciAqcHRyID0gbWlzdGF0LT5kYXRhKzE7CisKKwkJaWYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSB7CisJCQltaXN0YXQtPnVpZCA9IHB0cjsKKwkJCXB0ciArPSAxK3NwcmludGYocHRyLCAiJTA4eCIsIGlhdHRyLT5pYV91aWQpOworCQkJbWlzdGF0LT5uX3VpZCA9IGlhdHRyLT5pYV91aWQ7CisJCX0KKworCQlpZiAoaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpIHsKKwkJCW1pc3RhdC0+Z2lkID0gcHRyOworCQkJcHRyICs9IDErc3ByaW50ZihwdHIsICIlMDh4IiwgaWF0dHItPmlhX2dpZCk7CisJCQltaXN0YXQtPm5fZ2lkID0gaWF0dHItPmlhX2dpZDsKKwkJfQorCX0KKworCXJlcyA9IHY5ZnNfdF93c3RhdCh2OXNlcywgZmlkLT5maWQsIG1pc3RhdCwgJmZjYWxsKTsKKworCWlmIChyZXMgPCAwKQorCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAid3N0YXQgZXJyb3I6ICVzXG4iLCBGQ0FMTF9FUlJPUihmY2FsbCkpOworCisJa2ZyZWUobWlzdGF0KTsKKwlrZnJlZShmY2FsbCk7CisKKwlpZiAocmVzID49IDApCisJCXJlcyA9IGlub2RlX3NldGF0dHIoZGVudHJ5LT5kX2lub2RlLCBpYXR0cik7CisKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHY5ZnNfbWlzdGF0Mmlub2RlIC0gcG9wdWxhdGUgYW4gaW5vZGUgc3RydWN0dXJlIHdpdGggbWlzdGF0IGluZm8KKyAqIEBtaXN0YXQ6IFBsYW4gOSBtZXRhZGF0YSAobWlzdGF0KSBzdHJ1Y3R1cmUKKyAqIEBpbm9kZTogaW5vZGUgdG8gcG9wdWxhdGUKKyAqIEBzYjogc3VwZXJibG9jayBvZiBmaWxlc3lzdGVtCisgKgorICovCisKK3ZvaWQKK3Y5ZnNfbWlzdGF0Mmlub2RlKHN0cnVjdCB2OWZzX3N0YXQgKm1pc3RhdCwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSBzYi0+c19mc19pbmZvOworCisJaW5vZGUtPmlfbmxpbmsgPSAxOworCisJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gbWlzdGF0LT5hdGltZTsKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBtaXN0YXQtPm10aW1lOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IG1pc3RhdC0+bXRpbWU7CisKKwlpbm9kZS0+aV91aWQgPSAtMTsKKwlpbm9kZS0+aV9naWQgPSAtMTsKKworCWlmICh2OXNlcy0+ZXh0ZW5kZWQpIHsKKwkJLyogVE9ETzogc3RyaW5nIHRvIHVpZCBtYXBwaW5nIHZpYSB1c2VyLXNwYWNlIGRhZW1vbiAqLworCQlpbm9kZS0+aV91aWQgPSBtaXN0YXQtPm5fdWlkOworCQlpbm9kZS0+aV9naWQgPSBtaXN0YXQtPm5fZ2lkOworCisJCWlmIChtaXN0YXQtPm5fdWlkID09IC0xKQorCQkJc3NjYW5mKG1pc3RhdC0+dWlkLCAiJXgiLCAmaW5vZGUtPmlfdWlkKTsKKworCQlpZiAobWlzdGF0LT5uX2dpZCA9PSAtMSkKKwkJCXNzY2FuZihtaXN0YXQtPmdpZCwgIiV4IiwgJmlub2RlLT5pX2dpZCk7CisJfQorCisJaWYgKGlub2RlLT5pX3VpZCA9PSAtMSkKKwkJaW5vZGUtPmlfdWlkID0gdjlzZXMtPnVpZDsKKwlpZiAoaW5vZGUtPmlfZ2lkID09IC0xKQorCQlpbm9kZS0+aV9naWQgPSB2OXNlcy0+Z2lkOworCisJaW5vZGUtPmlfbW9kZSA9IHA5bW9kZTJ1bml4bW9kZSh2OXNlcywgbWlzdGF0LT5tb2RlKTsKKwlpZiAoKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHx8IChTX0lTQ0hSKGlub2RlLT5pX21vZGUpKSkgeworCQljaGFyIHR5cGUgPSAwOworCQlpbnQgbWFqb3IgPSAtMTsKKwkJaW50IG1pbm9yID0gLTE7CisJCXNzY2FuZihtaXN0YXQtPmV4dGVuc2lvbiwgIiVjICV1ICV1IiwgJnR5cGUsICZtYWpvciwgJm1pbm9yKTsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgJ2MnOgorCQkJaW5vZGUtPmlfbW9kZSAmPSB+U19JRkJMSzsKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JRkNIUjsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50ayhERUJVR19FUlJPUiwgIlVua25vd24gc3BlY2lhbCB0eXBlICVjICglcylcbiIsCisJCQkJdHlwZSwgbWlzdGF0LT5leHRlbnNpb24pOworCQl9OworCQlpbm9kZS0+aV9yZGV2ID0gTUtERVYobWFqb3IsIG1pbm9yKTsKKwl9IGVsc2UKKwkJaW5vZGUtPmlfcmRldiA9IDA7CisKKwlpbm9kZS0+aV9zaXplID0gbWlzdGF0LT5sZW5ndGg7CisKKwlpbm9kZS0+aV9ibGtzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWlub2RlLT5pX2Jsb2NrcyA9CisJICAgIChpbm9kZS0+aV9zaXplICsgaW5vZGUtPmlfYmxrc2l6ZSAtIDEpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworfQorCisvKioKKyAqIHY5ZnNfcWlkMmlubyAtIGNvbnZlcnQgcWlkIGludG8gaW5vZGUgbnVtYmVyCisgKiBAcWlkOiBxaWQgdG8gaGFzaAorICoKKyAqIEJVRzogcG90ZW50aWFsIGZvciBpbm9kZSBudW1iZXIgY29sbGlzaW9ucz8KKyAqLworCitpbm9fdCB2OWZzX3FpZDJpbm8oc3RydWN0IHY5ZnNfcWlkICpxaWQpCit7CisJdTY0IHBhdGggPSBxaWQtPnBhdGggKyAyOworCWlub190IGkgPSAwOworCisJaWYgKHNpemVvZihpbm9fdCkgPT0gc2l6ZW9mKHBhdGgpKQorCQltZW1jcHkoJmksICZwYXRoLCBzaXplb2YoaW5vX3QpKTsKKwllbHNlCisJCWkgPSAoaW5vX3QpIChwYXRoIF4gKHBhdGggPj4gMzIpKTsKKworCXJldHVybiBpOworfQorCisvKioKKyAqIHY5ZnNfdmZzX3N5bWxpbmsgLSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHN5bWxpbmtzCisgKiBAZGlyOiBkaXJlY3RvcnkgaW5vZGUgY29udGFpbmluZyBzeW1saW5rCisgKiBAZGVudHJ5OiBkZW50cnkgZm9yIHN5bWxpbmsKKyAqIEBzeW1uYW1lOiBzeW1saW5rIGRhdGEKKyAqCisgKiBTZWUgOVAyMDAwLnUgUkZDIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKgorICovCisKK3N0YXRpYyBpbnQKK3Y5ZnNfdmZzX3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlpbnQgcmV0dmFsID0gLUVQRVJNOworCXN0cnVjdCB2OWZzX2ZpZCAqbmV3ZmlkOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19zdGF0ICptaXN0YXQgPSBrbWFsbG9jKHY5c2VzLT5tYXhkYXRhLCBHRlBfS0VSTkVMKTsKKworCWRwcmludGsoREVCVUdfVkZTLCAiICVsdSwlcywlc1xuIiwgZGlyLT5pX2lubywgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJc3ltbmFtZSk7CisKKwlpZiAoIW1pc3RhdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIXY5c2VzLT5leHRlbmRlZCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAibm90IGV4dGVuZGVkXG4iKTsKKwkJZ290byBGcmVlRmNhbGw7CisJfQorCisJLyogaXNzdWUgYSBjcmVhdGUgKi8KKwlyZXR2YWwgPSB2OWZzX2NyZWF0ZShkaXIsIGRlbnRyeSwgU19JRkxOSywgMCk7CisJaWYgKHJldHZhbCAhPSAwKQorCQlnb3RvIEZyZWVGY2FsbDsKKworCW5ld2ZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnksIEZJRF9PUCk7CisKKwkvKiBpc3N1ZSBhIHR3c3RhdCAqLworCXY5ZnNfYmxhbmtfbWlzdGF0KHY5c2VzLCBtaXN0YXQpOworCXN0cmNweShtaXN0YXQtPmRhdGEgKyAxLCBzeW1uYW1lKTsKKwltaXN0YXQtPmV4dGVuc2lvbiA9IG1pc3RhdC0+ZGF0YSArIDE7CisJcmV0dmFsID0gdjlmc190X3dzdGF0KHY5c2VzLCBuZXdmaWQtPmZpZCwgbWlzdGF0LCAmZmNhbGwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJ2OWZzX3Rfd3N0YXQgZXJyb3I6ICVzXG4iLAorCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKKwkJZ290byBGcmVlRmNhbGw7CisJfQorCisJa2ZyZWUoZmNhbGwpOworCisJaWYgKHY5ZnNfdF9jbHVuayh2OXNlcywgbmV3ZmlkLT5maWQsICZmY2FsbCkpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgImNsdW5rIGZvciBzeW1saW5rIGZhaWxlZDogJXNcbiIsCisJCQlGQ0FMTF9FUlJPUihmY2FsbCkpOworCQlnb3RvIEZyZWVGY2FsbDsKKwl9CisKKwlkX2Ryb3AoZGVudHJ5KTsJCS8qIEZJRCAtIHdpbGwgdGhpcyBhbHNvIGNsdW5rPyAqLworCisgICAgICBGcmVlRmNhbGw6CisJa2ZyZWUobWlzdGF0KTsKKwlrZnJlZShmY2FsbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHY5ZnNfcmVhZGxpbmsgLSByZWFkIGEgc3ltbGluaydzIGxvY2F0aW9uIChpbnRlcm5hbCB2ZXJzaW9uKQorICogQGRlbnRyeTogZGVudHJ5IGZvciBzeW1saW5rCisgKiBAYnVmZmVyOiBidWZmZXIgdG8gbG9hZCBzeW1saW5rIGxvY2F0aW9uIGludG8KKyAqIEBidWZsZW46IGxlbmd0aCBvZiBidWZmZXIKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBpbnQgYnVmbGVuKQoreworCWludCByZXR2YWwgPSAtRVBFUk07CisKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHY5ZnNfZmlkICpmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LCBGSURfT1ApOworCisJaWYgKCFmaWQpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgImNvdWxkIG5vdCByZXNvbHZlIGZpZCBmcm9tIGRlbnRyeVxuIik7CisJCXJldHZhbCA9IC1FQkFERjsKKwkJZ290byBGcmVlRmNhbGw7CisJfQorCisJaWYgKCF2OXNlcy0+ZXh0ZW5kZWQpIHsKKwkJcmV0dmFsID0gLUVCQURGOworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAibm90IGV4dGVuZGVkXG4iKTsKKwkJZ290byBGcmVlRmNhbGw7CisJfQorCisJZHByaW50ayhERUJVR19WRlMsICIgJXNcbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCXJldHZhbCA9IHY5ZnNfdF9zdGF0KHY5c2VzLCBmaWQtPmZpZCwgJmZjYWxsKTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJzdGF0IGVycm9yXG4iKTsKKwkJZ290byBGcmVlRmNhbGw7CisJfQorCisJaWYgKCFmY2FsbCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIShmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQtPm1vZGUgJiBWOUZTX0RNU1lNTElOSykpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBGcmVlRmNhbGw7CisJfQorCisJLyogY29weSBleHRlbnNpb24gYnVmZmVyIGludG8gYnVmZmVyICovCisJaWYgKHN0cmxlbihmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQtPmV4dGVuc2lvbikgPCBidWZsZW4pCisJCWJ1ZmxlbiA9IHN0cmxlbihmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQtPmV4dGVuc2lvbik7CisKKwltZW1jcHkoYnVmZmVyLCBmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQtPmV4dGVuc2lvbiwgYnVmbGVuICsgMSk7CisKKwlyZXR2YWwgPSBidWZsZW47CisKKyAgICAgIEZyZWVGY2FsbDoKKwlrZnJlZShmY2FsbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHY5ZnNfdmZzX3JlYWRsaW5rIC0gcmVhZCBhIHN5bWxpbmsncyBsb2NhdGlvbgorICogQGRlbnRyeTogZGVudHJ5IGZvciBzeW1saW5rCisgKiBAYnVmOiBidWZmZXIgdG8gbG9hZCBzeW1saW5rIGxvY2F0aW9uIGludG8KKyAqIEBidWZsZW46IGxlbmd0aCBvZiBidWZmZXIKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX3Zmc19yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJICAgICBpbnQgYnVmbGVuKQoreworCWludCByZXR2YWw7CisJaW50IHJldDsKKwljaGFyICpsaW5rID0gX19nZXRuYW1lKCk7CisKKwlpZiAoc3RybGVuKGxpbmspIDwgYnVmbGVuKQorCQlidWZsZW4gPSBzdHJsZW4obGluayk7CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgIiBkZW50cnk6ICVzICglcClcbiIsIGRlbnRyeS0+ZF9pbmFtZSwgZGVudHJ5KTsKKworCXJldHZhbCA9IHY5ZnNfcmVhZGxpbmsoZGVudHJ5LCBsaW5rLCBidWZsZW4pOworCisJaWYgKHJldHZhbCA+IDApIHsKKwkJaWYgKChyZXQgPSBjb3B5X3RvX3VzZXIoYnVmZmVyLCBsaW5rLCByZXR2YWwpKSAhPSAwKSB7CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAicHJvYmxlbSBjb3B5aW5nIHRvIHVzZXI6ICVkXG4iLAorCQkJCXJldCk7CisJCQlyZXR2YWwgPSByZXQ7CisJCX0KKwl9CisKKwlwdXRuYW1lKGxpbmspOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogdjlmc192ZnNfZm9sbG93X2xpbmsgLSBmb2xsb3cgYSBzeW1saW5rIHBhdGgKKyAqIEBkZW50cnk6IGRlbnRyeSBmb3Igc3ltbGluaworICogQG5kOiBuYW1laWRhdGEKKyAqCisgKi8KKworc3RhdGljIHZvaWQgKnY5ZnNfdmZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IGxlbiA9IDA7CisJY2hhciAqbGluayA9IF9fZ2V0bmFtZSgpOworCisJZHByaW50ayhERUJVR19WRlMsICIlcyBuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoIWxpbmspCisJCWxpbmsgPSBFUlJfUFRSKC1FTk9NRU0pOworCWVsc2UgeworCQlsZW4gPSB2OWZzX3JlYWRsaW5rKGRlbnRyeSwgbGluaywgc3RybGVuKGxpbmspKTsKKworCQlpZiAobGVuIDwgMCkgeworCQkJcHV0bmFtZShsaW5rKTsKKwkJCWxpbmsgPSBFUlJfUFRSKGxlbik7CisJCX0gZWxzZQorCQkJbGlua1tsZW5dID0gMDsKKwl9CisJbmRfc2V0X2xpbmsobmQsIGxpbmspOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogdjlmc192ZnNfcHV0X2xpbmsgLSByZWxlYXNlIGEgc3ltbGluayBwYXRoCisgKiBAZGVudHJ5OiBkZW50cnkgZm9yIHN5bWxpbmsKKyAqIEBuZDogbmFtZWlkYXRhCisgKgorICovCisKK3N0YXRpYyB2b2lkIHY5ZnNfdmZzX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQsIHZvaWQgKnApCit7CisJY2hhciAqcyA9IG5kX2dldF9saW5rKG5kKTsKKworCWRwcmludGsoREVCVUdfVkZTLCAiICVzICVzXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lLCBzKTsKKwlpZiAoIUlTX0VSUihzKSkKKwkJcHV0bmFtZShzKTsKK30KKworLyoqCisgKiB2OWZzX3Zmc19saW5rIC0gY3JlYXRlIGEgaGFyZGxpbmsKKyAqIEBvbGRfZGVudHJ5OiBkZW50cnkgZm9yIGZpbGUgdG8gbGluayB0bworICogQGRpcjogaW5vZGUgZGVzdGluYXRpb24gZm9yIG5ldyBsaW5rCisgKiBAZGVudHJ5OiBkZW50cnkgZm9yIGxpbmsKKyAqCisgKi8KKworLyogWFhYIC0gbG90cyBvZiBjb2RlIGR1cCdkIGZyb20gc3ltbGluayBhbmQgY3JlYXRlcywKKyAqIGZpZ3VyZSBvdXQgYSBiZXR0ZXIgcmV1c2Ugc3RyYXRlZ3kKKyAqLworCitzdGF0aWMgaW50Cit2OWZzX3Zmc19saW5rKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLAorCSAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgcmV0dmFsID0gLUVQRVJNOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19zdGF0ICptaXN0YXQgPSBrbWFsbG9jKHY5c2VzLT5tYXhkYXRhLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3Qgdjlmc19maWQgKm9sZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChvbGRfZGVudHJ5LCBGSURfT1ApOworCXN0cnVjdCB2OWZzX2ZpZCAqbmV3ZmlkID0gTlVMTDsKKwljaGFyICpzeW1uYW1lID0gX19nZXRuYW1lKCk7CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgIiAlbHUsJXMsJXNcbiIsIGRpci0+aV9pbm8sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCW9sZF9kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWlmICghdjlzZXMtPmV4dGVuZGVkKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJub3QgZXh0ZW5kZWRcbiIpOworCQlnb3RvIEZyZWVNZW07CisJfQorCisJLyogZ2V0IGZpZCBvZiBvbGRfZGVudHJ5ICovCisJc3ByaW50ZihzeW1uYW1lLCAiaGFyZGxpbmsoJWQpXG4iLCBvbGRmaWQtPmZpZCk7CisKKwkvKiBpc3N1ZSBhIGNyZWF0ZSAqLworCXJldHZhbCA9IHY5ZnNfY3JlYXRlKGRpciwgZGVudHJ5LCBWOUZTX0RNTElOSywgMCk7CisJaWYgKHJldHZhbCAhPSAwKQorCQlnb3RvIEZyZWVNZW07CisKKwluZXdmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LCBGSURfT1ApOworCWlmICghbmV3ZmlkKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJjb3VsZG4ndCByZXNvbHZlIGZpZCBmcm9tIGRlbnRyeVxuIik7CisJCWdvdG8gRnJlZU1lbTsKKwl9CisKKwkvKiBpc3N1ZSBhIHR3c3RhdCAqLworCXY5ZnNfYmxhbmtfbWlzdGF0KHY5c2VzLCBtaXN0YXQpOworCXN0cmNweShtaXN0YXQtPmRhdGEgKyAxLCBzeW1uYW1lKTsKKwltaXN0YXQtPmV4dGVuc2lvbiA9IG1pc3RhdC0+ZGF0YSArIDE7CisJcmV0dmFsID0gdjlmc190X3dzdGF0KHY5c2VzLCBuZXdmaWQtPmZpZCwgbWlzdGF0LCAmZmNhbGwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJ2OWZzX3Rfd3N0YXQgZXJyb3I6ICVzXG4iLAorCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKKwkJZ290byBGcmVlTWVtOworCX0KKworCWtmcmVlKGZjYWxsKTsKKworCWlmICh2OWZzX3RfY2x1bmsodjlzZXMsIG5ld2ZpZC0+ZmlkLCAmZmNhbGwpKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJjbHVuayBmb3Igc3ltbGluayBmYWlsZWQ6ICVzXG4iLAorCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKKwkJZ290byBGcmVlTWVtOworCX0KKworCWRfZHJvcChkZW50cnkpOwkJLyogRklEIC0gd2lsbCB0aGlzIGFsc28gY2x1bms/ICovCisKKwlrZnJlZShmY2FsbCk7CisJZmNhbGwgPSBOVUxMOworCisgICAgICBGcmVlTWVtOgorCWtmcmVlKG1pc3RhdCk7CisJa2ZyZWUoZmNhbGwpOworCXB1dG5hbWUoc3ltbmFtZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiB2OWZzX3Zmc19ta25vZCAtIGNyZWF0ZSBhIHNwZWNpYWwgZmlsZQorICogQGRpcjogaW5vZGUgZGVzdGluYXRpb24gZm9yIG5ldyBsaW5rCisgKiBAZGVudHJ5OiBkZW50cnkgZm9yIGZpbGUKKyAqIEBtb2RlOiBtb2RlIGZvciBjcmVhdGlvbgorICogQGRldl90OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNwZWNpYWwgZmlsZQorICoKKyAqLworCitzdGF0aWMgaW50Cit2OWZzX3Zmc19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgZGV2X3QgcmRldikKK3sKKwlpbnQgcmV0dmFsID0gLUVQRVJNOworCXN0cnVjdCB2OWZzX2ZpZCAqbmV3ZmlkOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19zdGF0ICptaXN0YXQgPSBrbWFsbG9jKHY5c2VzLT5tYXhkYXRhLCBHRlBfS0VSTkVMKTsKKwljaGFyICpzeW1uYW1lID0gX19nZXRuYW1lKCk7CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgIiAlbHUsJXMgbW9kZTogJXggTUFKT1I6ICV1IE1JTk9SOiAldVxuIiwgZGlyLT5pX2lubywKKwkJZGVudHJ5LT5kX25hbWUubmFtZSwgbW9kZSwgTUFKT1IocmRldiksIE1JTk9SKHJkZXYpKTsKKworCWlmICghbWlzdGF0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIEZyZWVNZW07CisJfQorCisJaWYgKCF2OXNlcy0+ZXh0ZW5kZWQpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIm5vdCBleHRlbmRlZFxuIik7CisJCWdvdG8gRnJlZU1lbTsKKwl9CisKKwkvKiBpc3N1ZSBhIGNyZWF0ZSAqLworCXJldHZhbCA9IHY5ZnNfY3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlLCAwKTsKKworCWlmIChyZXR2YWwgIT0gMCkKKwkJZ290byBGcmVlTWVtOworCisJbmV3ZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeSwgRklEX09QKTsKKwlpZiAoIW5ld2ZpZCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY291ZG4ndCByZXNvdmUgZmlkIGZyb20gZGVudHJ5XG4iKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBGcmVlTWVtOworCX0KKworCS8qIGJ1aWxkIGV4dGVuc2lvbiAqLworCWlmIChTX0lTQkxLKG1vZGUpKQorCQlzcHJpbnRmKHN5bW5hbWUsICJiICV1ICV1IiwgTUFKT1IocmRldiksIE1JTk9SKHJkZXYpKTsKKwllbHNlIGlmIChTX0lTQ0hSKG1vZGUpKQorCQlzcHJpbnRmKHN5bW5hbWUsICJjICV1ICV1IiwgTUFKT1IocmRldiksIE1JTk9SKHJkZXYpKTsKKwllbHNlIGlmIChTX0lTRklGTyhtb2RlKSkKKwkJOwkvKiBETyBOT1RISU5HICovCisJZWxzZSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gRnJlZU1lbTsKKwl9CisKKwlpZiAoIVNfSVNGSUZPKG1vZGUpKSB7CisJCS8qIGlzc3VlIGEgdHdzdGF0ICovCisJCXY5ZnNfYmxhbmtfbWlzdGF0KHY5c2VzLCBtaXN0YXQpOworCQlzdHJjcHkobWlzdGF0LT5kYXRhICsgMSwgc3ltbmFtZSk7CisJCW1pc3RhdC0+ZXh0ZW5zaW9uID0gbWlzdGF0LT5kYXRhICsgMTsKKwkJcmV0dmFsID0gdjlmc190X3dzdGF0KHY5c2VzLCBuZXdmaWQtPmZpZCwgbWlzdGF0LCAmZmNhbGwpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZHByaW50ayhERUJVR19FUlJPUiwgInY5ZnNfdF93c3RhdCBlcnJvcjogJXNcbiIsCisJCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKKwkJCWdvdG8gRnJlZU1lbTsKKwkJfQorCX0KKworCS8qIG5lZWQgdG8gdXBkYXRlIGRjYWNoZSBzbyB3ZSBzaG93IHVwICovCisJa2ZyZWUoZmNhbGwpOworCisJaWYgKHY5ZnNfdF9jbHVuayh2OXNlcywgbmV3ZmlkLT5maWQsICZmY2FsbCkpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgImNsdW5rIGZvciBzeW1saW5rIGZhaWxlZDogJXNcbiIsCisJCQlGQ0FMTF9FUlJPUihmY2FsbCkpOworCQlnb3RvIEZyZWVNZW07CisJfQorCisJZF9kcm9wKGRlbnRyeSk7CQkvKiBGSUQgLSB3aWxsIHRoaXMgYWxzbyBjbHVuaz8gKi8KKworICAgICAgRnJlZU1lbToKKwlrZnJlZShtaXN0YXQpOworCWtmcmVlKGZjYWxsKTsKKwlwdXRuYW1lKHN5bW5hbWUpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnNfZXh0ID0geworCS5jcmVhdGUgPSB2OWZzX3Zmc19jcmVhdGUsCisJLmxvb2t1cCA9IHY5ZnNfdmZzX2xvb2t1cCwKKwkuc3ltbGluayA9IHY5ZnNfdmZzX3N5bWxpbmssCisJLmxpbmsgPSB2OWZzX3Zmc19saW5rLAorCS51bmxpbmsgPSB2OWZzX3Zmc191bmxpbmssCisJLm1rZGlyID0gdjlmc192ZnNfbWtkaXIsCisJLnJtZGlyID0gdjlmc192ZnNfcm1kaXIsCisJLm1rbm9kID0gdjlmc192ZnNfbWtub2QsCisJLnJlbmFtZSA9IHY5ZnNfdmZzX3JlbmFtZSwKKwkucmVhZGxpbmsgPSB2OWZzX3Zmc19yZWFkbGluaywKKwkuZ2V0YXR0ciA9IHY5ZnNfdmZzX2dldGF0dHIsCisJLnNldGF0dHIgPSB2OWZzX3Zmc19zZXRhdHRyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZSA9IHY5ZnNfdmZzX2NyZWF0ZSwKKwkubG9va3VwID0gdjlmc192ZnNfbG9va3VwLAorCS51bmxpbmsgPSB2OWZzX3Zmc191bmxpbmssCisJLm1rZGlyID0gdjlmc192ZnNfbWtkaXIsCisJLnJtZGlyID0gdjlmc192ZnNfcm1kaXIsCisJLm1rbm9kID0gdjlmc192ZnNfbWtub2QsCisJLnJlbmFtZSA9IHY5ZnNfdmZzX3JlbmFtZSwKKwkuZ2V0YXR0ciA9IHY5ZnNfdmZzX2dldGF0dHIsCisJLnNldGF0dHIgPSB2OWZzX3Zmc19zZXRhdHRyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS5nZXRhdHRyID0gdjlmc192ZnNfZ2V0YXR0ciwKKwkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHIsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rID0gdjlmc192ZnNfcmVhZGxpbmssCisJLmZvbGxvd19saW5rID0gdjlmc192ZnNfZm9sbG93X2xpbmssCisJLnB1dF9saW5rID0gdjlmc192ZnNfcHV0X2xpbmssCisJLmdldGF0dHIgPSB2OWZzX3Zmc19nZXRhdHRyLAorCS5zZXRhdHRyID0gdjlmc192ZnNfc2V0YXR0ciwKK307CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfc3VwZXIuYyBiL2ZzLzlwL3Zmc19zdXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OGYzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC92ZnNfc3VwZXIuYwpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqICBsaW51eC9mcy85cC92ZnNfc3VwZXIuYworICoKKyAqIFRoaXMgZmlsZSBjb250aWFucyBzdXBlcmJsb2NrIG9wcyBmb3IgOVAyMDAwLiBJdCBpcyBpbnRlbmRlZCB0aGF0CisgKiB5b3UgbW91bnQgdGhpcyBmaWxlIHN5c3RlbSBvbiBkaXJlY3Rvcmllcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIGJ5IFJvbiBNaW5uaWNoIDxybWlubmljaEBsYW5sLmdvdj4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAiOXAuaCIKKyNpbmNsdWRlICJ2OWZzX3Zmcy5oIgorI2luY2x1ZGUgImNvbnYuaCIKKyNpbmNsdWRlICJmaWQuaCIKKworc3RhdGljIHZvaWQgdjlmc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdjlmc19zdXBlcl9vcHM7CisKKy8qKgorICogdjlmc19jbGVhcl9pbm9kZSAtIHJlbGVhc2UgYW4gaW5vZGUKKyAqIEBpbm9kZTogaW5vZGUgdG8gcmVsZWFzZQorICoKKyAqLworCitzdGF0aWMgdm9pZCB2OWZzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpOworfQorCisvKioKKyAqIHY5ZnNfc2V0X3N1cGVyIC0gc2V0IHRoZSBzdXBlcmJsb2NrCisgKiBAczogc3VwZXIgYmxvY2sKKyAqIEBkYXRhOiBmaWxlIHN5c3RlbSBzcGVjaWZpYyBkYXRhCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc19zZXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhKQoreworCXMtPnNfZnNfaW5mbyA9IGRhdGE7CisJcmV0dXJuIHNldF9hbm9uX3N1cGVyKHMsIGRhdGEpOworfQorCisvKioKKyAqIHY5ZnNfZmlsbF9zdXBlciAtIHBvcHVsYXRlIHN1cGVyYmxvY2sgd2l0aCBpbmZvCisgKiBAc2I6IHN1cGVyYmxvY2sKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvcm1hdGlvbgorICoKKyAqLworCitzdGF0aWMgdm9pZAordjlmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsCisJCWludCBmbGFncykKK3sKKwlzYi0+c19tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBmbHModjlzZXMtPm1heGRhdGEgLSAxKTsKKwlzYi0+c19ibG9ja3NpemUgPSAxIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCXNiLT5zX21hZ2ljID0gVjlGU19NQUdJQzsKKwlzYi0+c19vcCA9ICZ2OWZzX3N1cGVyX29wczsKKworCXNiLT5zX2ZsYWdzID0gZmxhZ3MgfCBNU19BQ1RJVkUgfCBNU19TWU5DSFJPTk9VUyB8IE1TX0RJUlNZTkMgfAorCSAgICBNU19OT0RJUkFUSU1FIHwgTVNfTk9BVElNRTsKK30KKworLyoqCisgKiB2OWZzX2dldF9zYiAtIG1vdW50IGEgc3VwZXJibG9jaworICogQGZzX3R5cGU6IGZpbGUgc3lzdGVtIHR5cGUKKyAqIEBmbGFnczogbW91bnQgZmxhZ3MKKyAqIEBkZXZfbmFtZTogZGV2aWNlIG5hbWUgdGhhdCB3YXMgbW91bnRlZAorICogQGRhdGE6IG1vdW50IG9wdGlvbnMKKyAqCisgKi8KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqdjlmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUKKwkJCQkgICAgICAgKmZzX3R5cGUsIGludCBmbGFncywKKwkJCQkgICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IE5VTEw7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19maWQgKnJvb3RfZmlkID0gTlVMTDsKKwlpbnQgbW9kZSA9IFNfSVJXWFVHTyB8IFNfSVNWVFg7CisJdWlkX3QgdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJZ2lkX3QgZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJaW50IHN0YXRfcmVzdWx0ID0gMDsKKwlpbnQgbmV3ZmlkID0gMDsKKwlpbnQgcmV0dmFsID0gMDsKKworCWRwcmludGsoREVCVUdfVkZTLCAiIFxuIik7CisKKwl2OXNlcyA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyksIEdGUF9LRVJORUwpOworCWlmICghdjlzZXMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKChuZXdmaWQgPSB2OWZzX3Nlc3Npb25faW5pdCh2OXNlcywgZGV2X25hbWUsIGRhdGEpKSA8IDApIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgInByb2JsZW0gaW5pdGlhdGluZyBzZXNzaW9uXG4iKTsKKwkJcmV0dmFsID0gbmV3ZmlkOworCQlnb3RvIGZyZWVfc2Vzc2lvbjsKKwl9CisKKwlzYiA9IHNnZXQoZnNfdHlwZSwgTlVMTCwgdjlmc19zZXRfc3VwZXIsIHY5c2VzKTsKKworCXY5ZnNfZmlsbF9zdXBlcihzYiwgdjlzZXMsIGZsYWdzKTsKKworCWlub2RlID0gdjlmc19nZXRfaW5vZGUoc2IsIFNfSUZESVIgfCBtb2RlKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKGlub2RlKTsKKwkJZ290byBwdXRfYmFja19zYjsKKwl9CisKKwlpbm9kZS0+aV91aWQgPSB1aWQ7CisJaW5vZGUtPmlfZ2lkID0gZ2lkOworCisJcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CisKKwlpZiAoIXJvb3QpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byByZWxlYXNlX2lub2RlOworCX0KKworCXNiLT5zX3Jvb3QgPSByb290OworCisJLyogU2V0dXAgdGhlIFJvb3QgSW5vZGUgKi8KKwlyb290X2ZpZCA9IHY5ZnNfZmlkX2NyZWF0ZShyb290KTsKKwlpZiAocm9vdF9maWQgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2VfZGVudHJ5OworCX0KKworCXJvb3RfZmlkLT5maWRvcGVuID0gMDsKKwlyb290X2ZpZC0+djlzZXMgPSB2OXNlczsKKworCXN0YXRfcmVzdWx0ID0gdjlmc190X3N0YXQodjlzZXMsIG5ld2ZpZCwgJmZjYWxsKTsKKwlpZiAoc3RhdF9yZXN1bHQgPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJzdGF0IGVycm9yXG4iKTsKKwkJdjlmc190X2NsdW5rKHY5c2VzLCBuZXdmaWQsIE5VTEwpOworCQl2OWZzX3B1dF9pZHBvb2wobmV3ZmlkLCAmdjlzZXMtPmZpZHBvb2wpOworCX0gZWxzZSB7CisJCXJvb3RfZmlkLT5maWQgPSBuZXdmaWQ7CisJCXJvb3RfZmlkLT5xaWQgPSBmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQtPnFpZDsKKwkJcm9vdC0+ZF9pbm9kZS0+aV9pbm8gPQorCQkgICAgdjlmc19xaWQyaW5vKCZmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQtPnFpZCk7CisJCXY5ZnNfbWlzdGF0Mmlub2RlKGZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdCwgcm9vdC0+ZF9pbm9kZSwgc2IpOworCX0KKworCWtmcmVlKGZjYWxsKTsKKworCWlmIChzdGF0X3Jlc3VsdCA8IDApIHsKKwkJcmV0dmFsID0gc3RhdF9yZXN1bHQ7CisJCWdvdG8gcmVsZWFzZV9kZW50cnk7CisJfQorCisJcmV0dXJuIHNiOworCisgICAgICByZWxlYXNlX2RlbnRyeToKKwlkcHV0KHNiLT5zX3Jvb3QpOworCisgICAgICByZWxlYXNlX2lub2RlOgorCWlwdXQoaW5vZGUpOworCisgICAgICBwdXRfYmFja19zYjoKKwl1cF93cml0ZSgmc2ItPnNfdW1vdW50KTsKKwlkZWFjdGl2YXRlX3N1cGVyKHNiKTsKKwl2OWZzX3Nlc3Npb25fY2xvc2UodjlzZXMpOworCisgICAgICBmcmVlX3Nlc3Npb246CisJa2ZyZWUodjlzZXMpOworCisJcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKK30KKworLyoqCisgKiB2OWZzX2tpbGxfc3VwZXIgLSBLaWxsIFN1cGVyYmxvY2sKKyAqIEBzOiBzdXBlcmJsb2NrCisgKgorICovCisKK3N0YXRpYyB2b2lkIHY5ZnNfa2lsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHMtPnNfZnNfaW5mbzsKKworCWRwcmludGsoREVCVUdfVkZTLCAiICVwXG4iLCBzKTsKKworCXY5ZnNfZGVudHJ5X3JlbGVhc2Uocy0+c19yb290KTsJLyogY2x1bmsgcm9vdCAqLworCisJa2lsbF9hbm9uX3N1cGVyKHMpOworCisJdjlmc19zZXNzaW9uX2Nsb3NlKHY5c2VzKTsKKwlrZnJlZSh2OXNlcyk7CisJZHByaW50ayhERUJVR19WRlMsICJleGl0aW5nIGtpbGxfc3VwZXJcbiIpOworfQorCisvKioKKyAqIHY5ZnNfc2hvd19vcHRpb25zIC0gU2hvdyBtb3VudCBvcHRpb25zIGluIC9wcm9jL21vdW50cworICogQG06IHNlcV9maWxlIHRvIHdyaXRlIHRvCisgKiBAbW50OiBtb3VudCBkZXNjcmlwdG9yCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc19zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gbW50LT5tbnRfc2ItPnNfZnNfaW5mbzsKKworCWlmICh2OXNlcy0+ZGVidWcgIT0gMCkKKwkJc2VxX3ByaW50ZihtLCAiLGRlYnVnPSV1IiwgdjlzZXMtPmRlYnVnKTsKKwlpZiAodjlzZXMtPnBvcnQgIT0gVjlGU19QT1JUKQorCQlzZXFfcHJpbnRmKG0sICIscG9ydD0ldSIsIHY5c2VzLT5wb3J0KTsKKwlpZiAodjlzZXMtPm1heGRhdGEgIT0gOTAwMCkKKwkJc2VxX3ByaW50ZihtLCAiLG1zaXplPSV1IiwgdjlzZXMtPm1heGRhdGEpOworCWlmICh2OXNlcy0+YWZpZCAhPSB+MCkKKwkJc2VxX3ByaW50ZihtLCAiLGFmaWQ9JXUiLCB2OXNlcy0+YWZpZCk7CisJaWYgKHY5c2VzLT5wcm90byA9PSBQUk9UT19VTklYKQorCQlzZXFfcHV0cyhtLCAiLHByb3RvPXVuaXgiKTsKKwlpZiAodjlzZXMtPmV4dGVuZGVkID09IDApCisJCXNlcV9wdXRzKG0sICIsbm9leHRlbmQiKTsKKwlpZiAodjlzZXMtPm5vZGV2ID09IDEpCisJCXNlcV9wdXRzKG0sICIsbm9kZXZtYXAiKTsKKwlzZXFfcHJpbnRmKG0sICIsbmFtZT0lcyIsIHY5c2VzLT5uYW1lKTsKKwlzZXFfcHJpbnRmKG0sICIsYW5hbWU9JXMiLCB2OXNlcy0+cmVtb3RlbmFtZSk7CisJc2VxX3ByaW50ZihtLCAiLHVpZD0ldSIsIHY5c2VzLT51aWQpOworCXNlcV9wcmludGYobSwgIixnaWQ9JXUiLCB2OXNlcy0+Z2lkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3Y5ZnNfdW1vdW50X2JlZ2luKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHNiLT5zX2ZzX2luZm87CisKKwl2OWZzX3Nlc3Npb25fY2FuY2VsKHY5c2VzKTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHY5ZnNfc3VwZXJfb3BzID0geworCS5zdGF0ZnMgPSBzaW1wbGVfc3RhdGZzLAorCS5jbGVhcl9pbm9kZSA9IHY5ZnNfY2xlYXJfaW5vZGUsCisJLnNob3dfb3B0aW9ucyA9IHY5ZnNfc2hvd19vcHRpb25zLAorCS51bW91bnRfYmVnaW4gPSB2OWZzX3Vtb3VudF9iZWdpbiwKK307CisKK3N0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHY5ZnNfZnNfdHlwZSA9IHsKKwkubmFtZSA9ICI5UCIsCisJLmdldF9zYiA9IHY5ZnNfZ2V0X3NiLAorCS5raWxsX3NiID0gdjlmc19raWxsX3N1cGVyLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCmluZGV4IGU1NGJlNzAuLjA2OGNjZWEgMTAwNjQ0Ci0tLSBhL2ZzL0tjb25maWcKKysrIGIvZnMvS2NvbmZpZwpAQCAtMzgyLDEwICszODIsOCBAQAogCSAgdXNhZ2UgKGFsc28gY2FsbGVkIGRpc2sgcXVvdGFzKS4gQ3VycmVudGx5LCBpdCB3b3JrcyBmb3IgdGhlCiAJICBleHQyLCBleHQzLCBhbmQgcmVpc2VyZnMgZmlsZSBzeXN0ZW0uIGV4dDMgYWxzbyBzdXBwb3J0cyBqb3VybmFsbGVkCiAJICBxdW90YXMgZm9yIHdoaWNoIHlvdSBkb24ndCBuZWVkIHRvIHJ1biBxdW90YWNoZWNrKDgpIGFmdGVyIGFuIHVuY2xlYW4KLQkgIHNodXRkb3duLiBZb3UgbmVlZCBhZGRpdGlvbmFsIHNvZnR3YXJlIGluIG9yZGVyIHRvIHVzZSBxdW90YSBzdXBwb3J0Ci0JICAoeW91IGNhbiBkb3dubG9hZCBzb3VyY2VzIGZyb20KLQkgIDxodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9saW51eHF1b3RhLz4pLiBGb3IgZnVydGhlciBkZXRhaWxzLCByZWFkCi0JICB0aGUgUXVvdGEgbWluaS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIHNodXRkb3duLgorCSAgRm9yIGZ1cnRoZXIgZGV0YWlscywgcmVhZCB0aGUgUXVvdGEgbWluaS1IT1dUTywgYXZhaWxhYmxlIGZyb20KIAkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4sIG9yIHRoZSBkb2N1bWVudGF0aW9uIHByb3ZpZGVkCiAJICB3aXRoIHRoZSBxdW90YSB0b29scy4gUHJvYmFibHkgdGhlIHF1b3RhIHN1cHBvcnQgaXMgb25seSB1c2VmdWwgZm9yCiAJICBtdWx0aSB1c2VyIHN5c3RlbXMuIElmIHVuc3VyZSwgc2F5IE4uCkBAIC00MDMsOCArNDAxLDcgQEAKIAlkZXBlbmRzIG9uIFFVT1RBCiAJaGVscAogCSAgVGhpcyBxdW90YSBmb3JtYXQgYWxsb3dzIHVzaW5nIHF1b3RhcyB3aXRoIDMyLWJpdCBVSURzL0dJRHMuIElmIHlvdQotCSAgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkgc2F5IFkgaGVyZS4gTm90ZSB0aGF0IHlvdSB3aWxsIG5lZWQgcmVjZW50Ci0JICBxdW90YSB1dGlsaXRpZXMgKD49IDMuMDEpIGZvciBuZXcgcXVvdGEgZm9ybWF0IHdpdGggdGhpcyBrZXJuZWwuCisJICBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eSBzYXkgWSBoZXJlLgogCiBjb25maWcgUVVPVEFDVEwKIAlib29sCkBAIC00NjUsNiArNDYyLDE5IEBACiAJICBsb2NhbCBuZXR3b3JrLCB5b3UgcHJvYmFibHkgZG8gbm90IG5lZWQgYW4gYXV0b21vdW50ZXIsIGFuZCBjYW4gc2F5CiAJICBOIGhlcmUuCiAKK2NvbmZpZyBGVVNFX0ZTCisJdHJpc3RhdGUgIkZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlIHN1cHBvcnQiCisJaGVscAorCSAgV2l0aCBGVVNFIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCBhIGZ1bGx5IGZ1bmN0aW9uYWwgZmlsZXN5c3RlbQorCSAgaW4gYSB1c2Vyc3BhY2UgcHJvZ3JhbS4KKworCSAgVGhlcmUncyBhbHNvIGNvbXBhbmlvbiBsaWJyYXJ5OiBsaWJmdXNlLiAgVGhpcyBsaWJyYXJ5IGFsb25nIHdpdGgKKwkgIHV0aWxpdGllcyBpcyBhdmFpbGFibGUgZnJvbSB0aGUgRlVTRSBob21lcGFnZToKKwkgIDxodHRwOi8vZnVzZS5zb3VyY2Vmb3JnZS5uZXQvPgorCisJICBJZiB5b3Ugd2FudCB0byBkZXZlbG9wIGEgdXNlcnNwYWNlIEZTLCBvciBpZiB5b3Ugd2FudCB0byB1c2UKKwkgIGEgZmlsZXN5c3RlbSBiYXNlZCBvbiBGVVNFLCBhbnN3ZXIgWSBvciBNLgorCiBtZW51ICJDRC1ST00vRFZEIEZpbGVzeXN0ZW1zIgogCiBjb25maWcgSVNPOTY2MF9GUwpAQCAtNzgzLDI4ICs3OTMsNiBAQAogCiAJRGVzaWduZXJzIG9mIGVtYmVkZGVkIHN5c3RlbXMgbWF5IHdpc2ggdG8gc2F5IE4gaGVyZSB0byBjb25zZXJ2ZSBzcGFjZS4KIAotY29uZmlnIERFVlBUU19GU19YQVRUUgotCWJvb2wgIi9kZXYvcHRzIEV4dGVuZGVkIEF0dHJpYnV0ZXMiCi0JZGVwZW5kcyBvbiBVTklYOThfUFRZUwotCWhlbHAKLQkgIEV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIG5hbWU6dmFsdWUgcGFpcnMgYXNzb2NpYXRlZCB3aXRoIGlub2RlcyBieQotCSAgdGhlIGtlcm5lbCBvciBieSB1c2VycyAoc2VlIHRoZSBhdHRyKDUpIG1hbnVhbCBwYWdlLCBvciB2aXNpdAotCSAgPGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvPiBmb3IgZGV0YWlscykuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBERVZQVFNfRlNfU0VDVVJJVFkKLQlib29sICIvZGV2L3B0cyBTZWN1cml0eSBMYWJlbHMiCi0JZGVwZW5kcyBvbiBERVZQVFNfRlNfWEFUVFIKLQloZWxwCi0JICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKLQkgIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IG1vZHVsZXMgbGlrZSBTRUxpbnV4LiAgVGhpcyBvcHRpb24KLQkgIGVuYWJsZXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGhhbmRsZXIgZm9yIGZpbGUgc2VjdXJpdHkKLQkgIGxhYmVscyBpbiB0aGUgL2Rldi9wdHMgZmlsZXN5c3RlbS4KLQotCSAgSWYgeW91IGFyZSBub3QgdXNpbmcgYSBzZWN1cml0eSBtb2R1bGUgdGhhdCByZXF1aXJlcyB1c2luZwotCSAgZXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgZmlsZSBzZWN1cml0eSBsYWJlbHMsIHNheSBOLgotCiBjb25maWcgVE1QRlMKIAlib29sICJWaXJ0dWFsIG1lbW9yeSBmaWxlIHN5c3RlbSBzdXBwb3J0IChmb3JtZXIgc2htIGZzKSIKIAloZWxwCkBAIC04MTcsMjcgKzgwNSw2IEBACiAKIAkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3RtcGZzLnR4dD4gZm9yIGRldGFpbHMuCiAKLWNvbmZpZyBUTVBGU19YQVRUUgotCWJvb2wgInRtcGZzIEV4dGVuZGVkIEF0dHJpYnV0ZXMiCi0JZGVwZW5kcyBvbiBUTVBGUwotCWhlbHAKLQkgIEV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIG5hbWU6dmFsdWUgcGFpcnMgYXNzb2NpYXRlZCB3aXRoIGlub2RlcyBieQotCSAgdGhlIGtlcm5lbCBvciBieSB1c2VycyAoc2VlIHRoZSBhdHRyKDUpIG1hbnVhbCBwYWdlLCBvciB2aXNpdAotCSAgPGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvPiBmb3IgZGV0YWlscykuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBUTVBGU19TRUNVUklUWQotCWJvb2wgInRtcGZzIFNlY3VyaXR5IExhYmVscyIKLQlkZXBlbmRzIG9uIFRNUEZTX1hBVFRSCi0JaGVscAotCSAgU2VjdXJpdHkgbGFiZWxzIHN1cHBvcnQgYWx0ZXJuYXRpdmUgYWNjZXNzIGNvbnRyb2wgbW9kZWxzCi0JICBpbXBsZW1lbnRlZCBieSBzZWN1cml0eSBtb2R1bGVzIGxpa2UgU0VMaW51eC4gIFRoaXMgb3B0aW9uCi0JICBlbmFibGVzIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBoYW5kbGVyIGZvciBmaWxlIHNlY3VyaXR5Ci0JICBsYWJlbHMgaW4gdGhlIHRtcGZzIGZpbGVzeXN0ZW0uCi0JICBJZiB5b3UgYXJlIG5vdCB1c2luZyBhIHNlY3VyaXR5IG1vZHVsZSB0aGF0IHJlcXVpcmVzIHVzaW5nCi0JICBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBmaWxlIHNlY3VyaXR5IGxhYmVscywgc2F5IE4uCi0KIGNvbmZpZyBIVUdFVExCRlMKIAlib29sICJIdWdlVExCIGZpbGUgc3lzdGVtIHN1cHBvcnQiCiAJZGVwZW5kcyBYODYgfHwgSUE2NCB8fCBQUEM2NCB8fCBTUEFSQzY0IHx8IFNVUEVSSCB8fCBYODZfNjQgfHwgQlJPS0VOCkBAIC04NTksNiArODI2LDE4IEBACiAJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKIAkgIHJhbWZzLgogCitjb25maWcgUkVMQVlGU19GUworCXRyaXN0YXRlICJSZWxheWZzIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgUmVsYXlmcyBpcyBhIGhpZ2gtc3BlZWQgZGF0YSByZWxheSBmaWxlc3lzdGVtIGRlc2lnbmVkIHRvIHByb3ZpZGUKKwkgIGFuIGVmZmljaWVudCBtZWNoYW5pc20gZm9yIHRvb2xzIGFuZCBmYWNpbGl0aWVzIHRvIHJlbGF5IGxhcmdlCisJICBhbW91bnRzIG9mIGRhdGEgZnJvbSBrZXJuZWwgc3BhY2UgdG8gdXNlciBzcGFjZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHJlbGF5ZnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGVuZG1lbnUKIAogbWVudSAiTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcyIKQEAgLTE3MzcsNiArMTcxNiwxNyBAQAogY29uZmlnIFJYUlBDCiAJdHJpc3RhdGUKIAorY29uZmlnIDlQX0ZTCisJdHJpc3RhdGUgIlBsYW4gOSBSZXNvdXJjZSBTaGFyaW5nIFN1cHBvcnQgKDlQMjAwMCkgKEV4cGVyaW1lbnRhbCkiCisJZGVwZW5kcyBvbiBJTkVUICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBnZXQgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yCisJICBQbGFuIDkgcmVzb3VyY2Ugc2hhcmluZyB2aWEgdGhlIDlQMjAwMCBwcm90b2NvbC4KKworCSAgU2VlIDxodHRwOi8vdjlmcy5zZi5uZXQ+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBlbmRtZW51CiAKIG1lbnUgIlBhcnRpdGlvbiBUeXBlcyIKZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGUKaW5kZXggY2Y5NWViOC4uMTk3MmRhMSAxMDA2NDQKLS0tIGEvZnMvTWFrZWZpbGUKKysrIGIvZnMvTWFrZWZpbGUKQEAgLTg5LDEwICs4OSwxMyBAQAogb2JqLSQoQ09ORklHX0FVVE9GU19GUykJCSs9IGF1dG9mcy8KIG9iai0kKENPTkZJR19BVVRPRlM0X0ZTKQkrPSBhdXRvZnM0Lwogb2JqLSQoQ09ORklHX0FERlNfRlMpCQkrPSBhZGZzLworb2JqLSQoQ09ORklHX0ZVU0VfRlMpCQkrPSBmdXNlLwogb2JqLSQoQ09ORklHX1VERl9GUykJCSs9IHVkZi8KK29iai0kKENPTkZJR19SRUxBWUZTX0ZTKQkrPSByZWxheWZzLwogb2JqLSQoQ09ORklHX1NVTl9PUEVOUFJPTUZTKQkrPSBvcGVucHJvbWZzLwogb2JqLSQoQ09ORklHX0pGU19GUykJCSs9IGpmcy8KIG9iai0kKENPTkZJR19YRlNfRlMpCQkrPSB4ZnMvCitvYmotJChDT05GSUdfOVBfRlMpCQkrPSA5cC8KIG9iai0kKENPTkZJR19BRlNfRlMpCQkrPSBhZnMvCiBvYmotJChDT05GSUdfQkVGU19GUykJCSs9IGJlZnMvCiBvYmotJChDT05GSUdfSE9TVEZTKQkJKz0gaG9zdGZzLwpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9pbm9kZS5jIGIvZnMvYWZmcy9pbm9kZS5jCmluZGV4IDdhYTZmMjAuLjllYmU4ODEgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvaW5vZGUuYworKysgYi9mcy9hZmZzL2lub2RlLmMKQEAgLTI1NSw2ICsyNTUsNyBAQAogYWZmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlwcl9kZWJ1ZygiQUZGUzogZGVsZXRlX2lub2RlKGlubz0lbHUsIG5saW5rPSV1KVxuIiwgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCWlub2RlLT5pX3NpemUgPSAwOwogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlhZmZzX3RydW5jYXRlKGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2Fpby5jIGIvZnMvYWlvLmMKaW5kZXggMDZkN2Q0My4uMzhmNjI2OCAxMDA2NDQKLS0tIGEvZnMvYWlvLmMKKysrIGIvZnMvYWlvLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VyZWYuaD4KIAogI2luY2x1ZGUgPGFzbS9rbWFwX3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQ5OSw3ICs1MDAsNyBAQAogCS8qIE11c3QgYmUgZG9uZSB1bmRlciB0aGUgbG9jayB0byBzZXJpYWxpc2UgYWdhaW5zdCBjYW5jZWxsYXRpb24uCiAJICogQ2FsbCB0aGlzIGFpb19mcHV0IGFzIGl0IGR1cGxpY2F0ZXMgZnB1dCB2aWEgdGhlIGZwdXRfd29yay4KIAkgKi8KLQlpZiAodW5saWtlbHkoYXRvbWljX2RlY19hbmRfdGVzdCgmcmVxLT5raV9maWxwLT5mX2NvdW50KSkpIHsKKwlpZiAodW5saWtlbHkocmN1cmVmX2RlY19hbmRfdGVzdCgmcmVxLT5raV9maWxwLT5mX2NvdW50KSkpIHsKIAkJZ2V0X2lvY3R4KGN0eCk7CiAJCXNwaW5fbG9jaygmZnB1dF9sb2NrKTsKIAkJbGlzdF9hZGQoJnJlcS0+a2lfbGlzdCwgJmZwdXRfaGVhZCk7CkBAIC01NDYsNiArNTQ3LDI0IEBACiAJcmV0dXJuIGlvY3R4OwogfQogCitzdGF0aWMgaW50IGxvY2tfa2lvY2JfYWN0aW9uKHZvaWQgKnBhcmFtKQoreworCXNjaGVkdWxlKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2NrX2tpb2NiKHN0cnVjdCBraW9jYiAqaW9jYikKK3sKKwl3YWl0X29uX2JpdF9sb2NrKCZpb2NiLT5raV9mbGFncywgS0lGX0xPQ0tFRCwgbG9ja19raW9jYl9hY3Rpb24sCisJCQkgVEFTS19VTklOVEVSUlVQVElCTEUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW5sb2NrX2tpb2NiKHN0cnVjdCBraW9jYiAqaW9jYikKK3sKKwlraW9jYkNsZWFyTG9ja2VkKGlvY2IpOworCXdha2VfdXBfYml0KCZpb2NiLT5raV9mbGFncywgS0lGX0xPQ0tFRCk7Cit9CisKIC8qCiAgKiB1c2VfbW0KICAqCU1ha2VzIHRoZSBjYWxsaW5nIGtlcm5lbCB0aHJlYWQgdGFrZSBvbiB0aGUgc3BlY2lmaWVkCkBAIC01NjcsNiArNTg2LDEwIEBACiAJYXRvbWljX2luYygmbW0tPm1tX2NvdW50KTsKIAl0c2stPm1tID0gbW07CiAJdHNrLT5hY3RpdmVfbW0gPSBtbTsKKwkvKgorCSAqIE5vdGUgdGhhdCBvbiBVTUwgdGhpcyAqcmVxdWlyZXMqIFBGX0JPUlJPV0VEX01NIHRvIGJlIHNldCwgb3RoZXJ3aXNlCisJICogaXQgd29uJ3Qgd29yay4gVXBkYXRlIGl0IGFjY29yZGluZ2x5IGlmIHlvdSBjaGFuZ2UgaXQgaGVyZQorCSAqLwogCWFjdGl2YXRlX21tKGFjdGl2ZV9tbSwgbW0pOwogCXRhc2tfdW5sb2NrKHRzayk7CiAKQEAgLTc4Miw3ICs4MDUsOSBAQAogCQkgKiBIb2xkIGFuIGV4dHJhIHJlZmVyZW5jZSB3aGlsZSByZXRyeWluZyBpL28uCiAJCSAqLwogCQlpb2NiLT5raV91c2VycysrOyAgICAgICAvKiBncmFiIGV4dHJhIHJlZmVyZW5jZSAqLworCQlsb2NrX2tpb2NiKGlvY2IpOwogCQlhaW9fcnVuX2lvY2IoaW9jYik7CisJCXVubG9ja19raW9jYihpb2NiKTsKIAkJaWYgKF9fYWlvX3B1dF9yZXEoY3R4LCBpb2NiKSkgIC8qIGRyb3AgZXh0cmEgcmVmICovCiAJCQlwdXRfaW9jdHgoY3R4KTsKICAJfQpAQCAtMTUyMywxMCArMTU0OCw5IEBACiAJCWdvdG8gb3V0X3B1dF9yZXE7CiAKIAlzcGluX2xvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKLQlpZiAobGlrZWx5KGxpc3RfZW1wdHkoJmN0eC0+cnVuX2xpc3QpKSkgewotCQlhaW9fcnVuX2lvY2IocmVxKTsKLQl9IGVsc2UgewotCQlsaXN0X2FkZF90YWlsKCZyZXEtPmtpX3J1bl9saXN0LCAmY3R4LT5ydW5fbGlzdCk7CisJYWlvX3J1bl9pb2NiKHJlcSk7CisJdW5sb2NrX2tpb2NiKHJlcSk7CisJaWYgKCFsaXN0X2VtcHR5KCZjdHgtPnJ1bl9saXN0KSkgewogCQkvKiBkcmFpbiB0aGUgcnVuIGxpc3QgKi8KIAkJd2hpbGUgKF9fYWlvX3J1bl9pb2NicyhjdHgpKQogCQkJOwpAQCAtMTY1Nyw2ICsxNjgxLDcgQEAKIAlpZiAoTlVMTCAhPSBjYW5jZWwpIHsKIAkJc3RydWN0IGlvX2V2ZW50IHRtcDsKIAkJcHJfZGVidWcoImNhbGxpbmcgY2FuY2VsXG4iKTsKKwkJbG9ja19raW9jYihraW9jYik7CiAJCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CiAJCXRtcC5vYmogPSAodTY0KSh1bnNpZ25lZCBsb25nKWtpb2NiLT5raV9vYmoudXNlcjsKIAkJdG1wLmRhdGEgPSBraW9jYi0+a2lfdXNlcl9kYXRhOwpAQCAtMTY2OCw4ICsxNjkzLDkgQEAKIAkJCWlmIChjb3B5X3RvX3VzZXIocmVzdWx0LCAmdG1wLCBzaXplb2YodG1wKSkpCiAJCQkJcmV0ID0gLUVGQVVMVDsKIAkJfQorCQl1bmxvY2tfa2lvY2Ioa2lvY2IpOwogCX0gZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAiaW9jYiBoYXMgbm8gY2FuY2VsIG9wZXJhdGlvblxuIik7CisJCXJldCA9IC1FSU5WQUw7CiAKIAlwdXRfaW9jdHgoY3R4KTsKIApkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzL2F1dG9mc19pLmggYi9mcy9hdXRvZnMvYXV0b2ZzX2kuaAppbmRleCA2MTcxNDMxLi45OTBjMjhkIDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvYXV0b2ZzX2kuaAorKysgYi9mcy9hdXRvZnMvYXV0b2ZzX2kuaApAQCAtMTA1LDYgKzEwNSw3IEBACiAJc3RydWN0IGZpbGUgKnBpcGU7CiAJcGlkX3Qgb3pfcGdycDsKIAlpbnQgY2F0YXRvbmljOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJdW5zaWduZWQgbG9uZyBleHBfdGltZW91dDsKIAlpbm9fdCBuZXh0X2Rpcl9pbm87CiAJc3RydWN0IGF1dG9mc193YWl0X3F1ZXVlICpxdWV1ZXM7IC8qIFdhaXQgcXVldWUgcG9pbnRlciAqLwpAQCAtMTM0LDcgKzEzNSw3IEBACiB2b2lkIGF1dG9mc19oYXNoX2RlbGV0ZShzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKik7CiBzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmF1dG9mc19oYXNoX2VudW0oY29uc3Qgc3RydWN0IGF1dG9mc19kaXJoYXNoICosb2ZmX3QgKixzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKik7CiB2b2lkIGF1dG9mc19oYXNoX2RwdXRhbGwoc3RydWN0IGF1dG9mc19kaXJoYXNoICopOwotdm9pZCBhdXRvZnNfaGFzaF9udWtlKHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqKTsKK3ZvaWQgYXV0b2ZzX2hhc2hfbnVrZShzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKik7CiAKIC8qIEV4cGlyYXRpb24taGFuZGxpbmcgZnVuY3Rpb25zICovCiAKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9kaXJoYXNoLmMgYi9mcy9hdXRvZnMvZGlyaGFzaC5jCmluZGV4IDQ0ODE0M2YuLjVjY2ZjZjIgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mcy9kaXJoYXNoLmMKKysrIGIvZnMvYXV0b2ZzL2Rpcmhhc2guYwpAQCAtMjMyLDEzICsyMzIsMTMgQEAKIAogLyogRGVsZXRlIGV2ZXJ5dGhpbmcuICBUaGlzIGlzIHVzZWQgb24gZmlsZXN5c3RlbSBkZXN0cnVjdGlvbiwgc28gd2UKICAgIG1ha2Ugbm8gYXR0ZW1wdCB0byBrZWVwIHRoZSBwb2ludGVycyB2YWxpZCAqLwotdm9pZCBhdXRvZnNfaGFzaF9udWtlKHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqZGgpCit2b2lkIGF1dG9mc19oYXNoX251a2Uoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkpCiB7CiAJaW50IGk7CiAJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQsICpuZW50OwogCiAJZm9yICggaSA9IDAgOyBpIDwgQVVUT0ZTX0hBU0hfU0laRSA7IGkrKyApIHsKLQkJZm9yICggZW50ID0gZGgtPmhbaV0gOyBlbnQgOyBlbnQgPSBuZW50ICkgeworCQlmb3IgKCBlbnQgPSBzYmktPmRpcmhhc2guaFtpXSA7IGVudCA7IGVudCA9IG5lbnQgKSB7CiAJCQluZW50ID0gZW50LT5uZXh0OwogCQkJaWYgKCBlbnQtPmRlbnRyeSApCiAJCQkJZHB1dChlbnQtPmRlbnRyeSk7CkBAIC0yNDYsNCArMjQ2LDUgQEAKIAkJCWtmcmVlKGVudCk7CiAJCX0KIAl9CisJc2hyaW5rX2RjYWNoZV9zYihzYmktPnNiKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9pbm9kZS5jIGIvZnMvYXV0b2ZzL2lub2RlLmMKaW5kZXggNDg4OGMxZi4uNjVlNWVkNCAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzL2lub2RlLmMKKysrIGIvZnMvYXV0b2ZzL2lub2RlLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAlpZiAoICFzYmktPmNhdGF0b25pYyApCiAJCWF1dG9mc19jYXRhdG9uaWNfbW9kZShzYmkpOyAvKiBGcmVlIHdhaXQgcXVldWVzLCBjbG9zZSBwaXBlICovCiAKLQlhdXRvZnNfaGFzaF9udWtlKCZzYmktPmRpcmhhc2gpOworCWF1dG9mc19oYXNoX251a2Uoc2JpKTsKIAlmb3IgKCBuID0gMCA7IG4gPCBBVVRPRlNfTUFYX1NZTUxJTktTIDsgbisrICkgewogCQlpZiAoIHRlc3RfYml0KG4sIHNiaS0+c3ltbGlua19iaXRtYXApICkKIAkJCWtmcmVlKHNiaS0+c3ltbGlua1tuXS5kYXRhKTsKQEAgLTE0OCw2ICsxNDgsNyBAQAogCXMtPnNfbWFnaWMgPSBBVVRPRlNfU1VQRVJfTUFHSUM7CiAJcy0+c19vcCA9ICZhdXRvZnNfc29wczsKIAlzLT5zX3RpbWVfZ3JhbiA9IDE7CisJc2JpLT5zYiA9IHM7CiAKIAlyb290X2lub2RlID0gaWdldChzLCBBVVRPRlNfUk9PVF9JTk8pOwogCXJvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9iZnMvYmZzLmggYi9mcy9iZnMvYmZzLmgKaW5kZXggMTAyMGRiYy4uMWZiYzUzZiAxMDA2NDQKLS0tIGEvZnMvYmZzL2Jmcy5oCisrKyBiL2ZzL2Jmcy9iZnMuaApAQCAtMjAsNyArMjAsNiBAQAogCXVuc2lnbmVkIGxvbmcgc2lfbGFzdGk7CiAJdW5zaWduZWQgbG9uZyAqIHNpX2ltYXA7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogc2lfc2JoOwkJLyogYnVmZmVyIGhlYWRlciB3L3N1cGVyYmxvY2sgKi8KLQlzdHJ1Y3QgYmZzX3N1cGVyX2Jsb2NrICogc2lfYmZzX3NiOwkvKiBzdXBlcmJsb2NrIGluIHNpX3NiaC0+Yl9kYXRhICovCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvYmZzL2Rpci5jIGIvZnMvYmZzL2Rpci5jCmluZGV4IDVhMWU1Y2UuLmUyNDBjMzMgMTAwNjQ0Ci0tLSBhL2ZzL2Jmcy9kaXIuYworKysgYi9mcy9iZnMvZGlyLmMKQEAgLTIsNiArMiw3IEBACiAgKglmcy9iZnMvZGlyLmMKICAqCUJGUyBkaXJlY3Rvcnkgb3BlcmF0aW9ucy4KICAqCUNvcHlyaWdodCAoQykgMTk5OSwyMDAwICBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqICAgICAgTWFkZSBlbmRpYW5uZXNzLWNsZWFuIGJ5IEFuZHJldyBTdHJpYmJsZWhpbGwgPGFkc0B3b21wb20ub3JnPiAyMDA1CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KQEAgLTIwLDkgKzIxLDkgQEAKICNkZWZpbmUgZHByaW50Zih4Li4uKQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgYmZzX2FkZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKiBkaXIsIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGlubyk7CitzdGF0aWMgaW50IGJmc19hZGRfZW50cnkoc3RydWN0IGlub2RlICogZGlyLCBjb25zdCB1bnNpZ25lZCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIGludCBpbm8pOwogc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqIGRpciwgCi0JY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgYmZzX2RpcmVudCAqKiByZXNfZGlyKTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIHN0cnVjdCBiZnNfZGlyZW50ICoqIHJlc19kaXIpOwogCiBzdGF0aWMgaW50IGJmc19yZWFkZGlyKHN0cnVjdCBmaWxlICogZiwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7CkBAIC01Myw3ICs1NCw3IEBACiAJCQlkZSA9IChzdHJ1Y3QgYmZzX2RpcmVudCAqKShiaC0+Yl9kYXRhICsgb2Zmc2V0KTsKIAkJCWlmIChkZS0+aW5vKSB7CiAJCQkJaW50IHNpemUgPSBzdHJubGVuKGRlLT5uYW1lLCBCRlNfTkFNRUxFTik7Ci0JCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBkZS0+bmFtZSwgc2l6ZSwgZi0+Zl9wb3MsIGRlLT5pbm8sIERUX1VOS05PV04pIDwgMCkgeworCQkJCWlmIChmaWxsZGlyKGRpcmVudCwgZGUtPm5hbWUsIHNpemUsIGYtPmZfcG9zLCBsZTE2X3RvX2NwdShkZS0+aW5vKSwgRFRfVU5LTk9XTikgPCAwKSB7CiAJCQkJCWJyZWxzZShiaCk7CiAJCQkJCXVubG9ja19rZXJuZWwoKTsKIAkJCQkJcmV0dXJuIDA7CkBAIC0xMDcsNyArMTA4LDcgQEAKIAlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZiZnNfYW9wczsKIAlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAlpbm9kZS0+aV9pbm8gPSBpbm87Ci0JQkZTX0koaW5vZGUpLT5pX2Rza19pbm8gPSBpbm87CisJQkZTX0koaW5vZGUpLT5pX2Rza19pbm8gPSBjcHVfdG9fbGUxNihpbm8pOwogCUJGU19JKGlub2RlKS0+aV9zYmxvY2sgPSAwOwogCUJGU19JKGlub2RlKS0+aV9lYmxvY2sgPSAwOwogCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKQEAgLTEzOSw3ICsxNDAsNyBAQAogCWxvY2tfa2VybmVsKCk7CiAJYmggPSBiZnNfZmluZF9lbnRyeShkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgJmRlKTsKIAlpZiAoYmgpIHsKLQkJdW5zaWduZWQgbG9uZyBpbm8gPSBsZTMyX3RvX2NwdShkZS0+aW5vKTsKKwkJdW5zaWduZWQgbG9uZyBpbm8gPSAodW5zaWduZWQgbG9uZylsZTE2X3RvX2NwdShkZS0+aW5vKTsKIAkJYnJlbHNlKGJoKTsKIAkJaW5vZGUgPSBpZ2V0KGRpci0+aV9zYiwgaW5vKTsKIAkJaWYgKCFpbm9kZSkgewpAQCAtMTgzLDcgKzE4NCw3IEBACiAJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJbG9ja19rZXJuZWwoKTsKIAliaCA9IGJmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAmZGUpOwotCWlmICghYmggfHwgZGUtPmlubyAhPSBpbm9kZS0+aV9pbm8pIAorCWlmICghYmggfHwgbGUxNl90b19jcHUoZGUtPmlubykgIT0gaW5vZGUtPmlfaW5vKQogCQlnb3RvIG91dF9icmVsc2U7CiAKIAlpZiAoIWlub2RlLT5pX25saW5rKSB7CkBAIC0yMjQsNyArMjI1LDcgQEAKIAkJCQlvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwgCiAJCQkJb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiwgJm9sZF9kZSk7CiAKLQlpZiAoIW9sZF9iaCB8fCBvbGRfZGUtPmlubyAhPSBvbGRfaW5vZGUtPmlfaW5vKQorCWlmICghb2xkX2JoIHx8IGxlMTZfdG9fY3B1KG9sZF9kZS0+aW5vKSAhPSBvbGRfaW5vZGUtPmlfaW5vKQogCQlnb3RvIGVuZF9yZW5hbWU7CiAKIAllcnJvciA9IC1FUEVSTTsKQEAgLTI3MCw3ICsyNzEsNyBAQAogCS5yZW5hbWUJCQk9IGJmc19yZW5hbWUsCiB9OwogCi1zdGF0aWMgaW50IGJmc19hZGRfZW50cnkoc3RydWN0IGlub2RlICogZGlyLCBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIGludCBpbm8pCitzdGF0aWMgaW50IGJmc19hZGRfZW50cnkoc3RydWN0IGlub2RlICogZGlyLCBjb25zdCB1bnNpZ25lZCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIGludCBpbm8pCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CiAJc3RydWN0IGJmc19kaXJlbnQgKiBkZTsKQEAgLTMwNCw3ICszMDUsNyBAQAogCQkJCX0KIAkJCQlkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCQkJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKLQkJCQlkZS0+aW5vID0gaW5vOworCQkJCWRlLT5pbm8gPSBjcHVfdG9fbGUxNigodTE2KWlubyk7CiAJCQkJZm9yIChpPTA7IGk8QkZTX05BTUVMRU47IGkrKykKIAkJCQkJZGUtPm5hbWVbaV0gPSAoaSA8IG5hbWVsZW4pID8gbmFtZVtpXSA6IDA7CiAJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOwpAQCAtMzE3LDcgKzMxOCw3IEBACiAJcmV0dXJuIC1FTk9TUEM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGJmc19uYW1lY21wKGludCBsZW4sIGNvbnN0IGNoYXIgKiBuYW1lLCBjb25zdCBjaGFyICogYnVmZmVyKQorc3RhdGljIGlubGluZSBpbnQgYmZzX25hbWVjbXAoaW50IGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqIG5hbWUsIGNvbnN0IGNoYXIgKiBidWZmZXIpCiB7CiAJaWYgKGxlbiA8IEJGU19OQU1FTEVOICYmIGJ1ZmZlcltsZW5dKQogCQlyZXR1cm4gMDsKQEAgLTMyNSw3ICszMjYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICogZGlyLCAKLQljb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIHN0cnVjdCBiZnNfZGlyZW50ICoqIHJlc19kaXIpCisJY29uc3QgdW5zaWduZWQgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgYmZzX2RpcmVudCAqKiByZXNfZGlyKQogewogCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKQEAgLTM0Niw3ICszNDcsNyBAQAogCQl9CiAJCWRlID0gKHN0cnVjdCBiZnNfZGlyZW50ICopKGJoLT5iX2RhdGEgKyBvZmZzZXQpOwogCQlvZmZzZXQgKz0gQkZTX0RJUkVOVF9TSVpFOwotCQlpZiAoZGUtPmlubyAmJiBiZnNfbmFtZWNtcChuYW1lbGVuLCBuYW1lLCBkZS0+bmFtZSkpIHsKKwkJaWYgKGxlMTZfdG9fY3B1KGRlLT5pbm8pICYmIGJmc19uYW1lY21wKG5hbWVsZW4sIG5hbWUsIGRlLT5uYW1lKSkgewogCQkJKnJlc19kaXIgPSBkZTsKIAkJCXJldHVybiBiaDsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvYmZzL2ZpbGUuYyBiL2ZzL2Jmcy9maWxlLmMKaW5kZXggNzQ3ZmQxZS4uODA3NzIzYiAxMDA2NDQKLS0tIGEvZnMvYmZzL2ZpbGUuYworKysgYi9mcy9iZnMvZmlsZS5jCkBAIC00MCw4ICs0MCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmZzX21vdmVfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCAKLQkJCQl1bnNpZ25lZCBsb25nIHdoZXJlKQorc3RhdGljIGludCBiZnNfbW92ZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCB1bnNpZ25lZCBsb25nIHdoZXJlKQogewogCXVuc2lnbmVkIGxvbmcgaTsKIApAQCAtNTcsMjAgKzU3LDIxIEBACiBzdGF0aWMgaW50IGJmc19nZXRfYmxvY2soc3RydWN0IGlub2RlICogaW5vZGUsIHNlY3Rvcl90IGJsb2NrLCAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF9yZXN1bHQsIGludCBjcmVhdGUpCiB7Ci0JbG9uZyBwaHlzOworCXVuc2lnbmVkIGxvbmcgcGh5czsKIAlpbnQgZXJyOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgYmZzX3NiX2luZm8gKmluZm8gPSBCRlNfU0Ioc2IpOwogCXN0cnVjdCBiZnNfaW5vZGVfaW5mbyAqYmkgPSBCRlNfSShpbm9kZSk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpzYmggPSBpbmZvLT5zaV9zYmg7CiAKLQlpZiAoYmxvY2sgPCAwIHx8IGJsb2NrID4gaW5mby0+c2lfYmxvY2tzKQorCWlmIChibG9jayA+IGluZm8tPnNpX2Jsb2NrcykKIAkJcmV0dXJuIC1FSU87CiAKIAlwaHlzID0gYmktPmlfc2Jsb2NrICsgYmxvY2s7CiAJaWYgKCFjcmVhdGUpIHsKIAkJaWYgKHBoeXMgPD0gYmktPmlfZWJsb2NrKSB7Ci0JCQlkcHJpbnRmKCJjPSVkLCBiPSUwOGx4LCBwaHlzPSUwOGx4IChncmFudGVkKVxuIiwgY3JlYXRlLCBibG9jaywgcGh5cyk7CisJCQlkcHJpbnRmKCJjPSVkLCBiPSUwOGx4LCBwaHlzPSUwOWx4IChncmFudGVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlLCAodW5zaWduZWQgbG9uZylibG9jaywgcGh5cyk7CiAJCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5cyk7CiAJCX0KIAkJcmV0dXJuIDA7CkBAIC04MCw3ICs4MSw3IEBACiAJICAgb2YgYmxvY2tzIGFsbG9jYXRlZCBmb3IgdGhpcyBmaWxlLCB3ZSBjYW4gZ3JhbnQgaXQgKi8KIAlpZiAoaW5vZGUtPmlfc2l6ZSAmJiBwaHlzIDw9IGJpLT5pX2VibG9jaykgewogCQlkcHJpbnRmKCJjPSVkLCBiPSUwOGx4LCBwaHlzPSUwOGx4IChpbnRlcmltIGJsb2NrIGdyYW50ZWQpXG4iLCAKLQkJCQljcmVhdGUsIGJsb2NrLCBwaHlzKTsKKwkJCQljcmVhdGUsICh1bnNpZ25lZCBsb25nKWJsb2NrLCBwaHlzKTsKIAkJbWFwX2JoKGJoX3Jlc3VsdCwgc2IsIHBoeXMpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC04OCwxMSArODksMTIgQEAKIAkvKiB0aGUgcmVzdCBoYXMgdG8gYmUgcHJvdGVjdGVkIGFnYWluc3QgaXRzZWxmICovCiAJbG9ja19rZXJuZWwoKTsKIAotCS8qIGlmIHRoZSBsYXN0IGRhdGEgYmxvY2sgZm9yIHRoaXMgZmlsZSBpcyB0aGUgbGFzdCBhbGxvY2F0ZWQgYmxvY2ssIHdlIGNhbgotCSAgIGV4dGVuZCB0aGUgZmlsZSB0cml2aWFsbHksIHdpdGhvdXQgbW92aW5nIGl0IGFueXdoZXJlICovCisJLyogaWYgdGhlIGxhc3QgZGF0YSBibG9jayBmb3IgdGhpcyBmaWxlIGlzIHRoZSBsYXN0IGFsbG9jYXRlZAorCSAgIGJsb2NrLCB3ZSBjYW4gZXh0ZW5kIHRoZSBmaWxlIHRyaXZpYWxseSwgd2l0aG91dCBtb3ZpbmcgaXQKKwkgICBhbnl3aGVyZSAqLwogCWlmIChiaS0+aV9lYmxvY2sgPT0gaW5mby0+c2lfbGZfZWJsaykgewogCQlkcHJpbnRmKCJjPSVkLCBiPSUwOGx4LCBwaHlzPSUwOGx4IChzaW1wbGUgZXh0ZW5zaW9uKVxuIiwgCi0JCQkJY3JlYXRlLCBibG9jaywgcGh5cyk7CisJCQkJY3JlYXRlLCAodW5zaWduZWQgbG9uZylibG9jaywgcGh5cyk7CiAJCW1hcF9iaChiaF9yZXN1bHQsIHNiLCBwaHlzKTsKIAkJaW5mby0+c2lfZnJlZWIgLT0gcGh5cyAtIGJpLT5pX2VibG9jazsKIAkJaW5mby0+c2lfbGZfZWJsayA9IGJpLT5pX2VibG9jayA9IHBoeXM7CkBAIC0xMTQsNyArMTE2LDggQEAKIAl9IGVsc2UKIAkJZXJyID0gMDsKIAotCWRwcmludGYoImM9JWQsIGI9JTA4bHgsIHBoeXM9JTA4bHggKG1vdmVkKVxuIiwgY3JlYXRlLCBibG9jaywgcGh5cyk7CisJZHByaW50ZigiYz0lZCwgYj0lMDhseCwgcGh5cz0lMDhseCAobW92ZWQpXG4iLAorICAgICAgICAgICAgICAgIGNyZWF0ZSwgKHVuc2lnbmVkIGxvbmcpYmxvY2ssIHBoeXMpOwogCWJpLT5pX3NibG9jayA9IHBoeXM7CiAJcGh5cyArPSBibG9jazsKIAlpbmZvLT5zaV9sZl9lYmxrID0gYmktPmlfZWJsb2NrID0gcGh5czsKZGlmZiAtLWdpdCBhL2ZzL2Jmcy9pbm9kZS5jIGIvZnMvYmZzL2lub2RlLmMKaW5kZXggNjRlMGZiMy4uYzdiMzlhYTIgMTAwNjQ0Ci0tLSBhL2ZzL2Jmcy9pbm9kZS5jCisrKyBiL2ZzL2Jmcy9pbm9kZS5jCkBAIC0zLDYgKzMsOCBAQAogICoJQkZTIHN1cGVyYmxvY2sgYW5kIGlub2RlIG9wZXJhdGlvbnMuCiAgKglDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KICAqCUZyb20gZnMvbWluaXgsIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcy4KKyAqCisgKiAgICAgIE1hZGUgZW5kaWFubmVzcy1jbGVhbiBieSBBbmRyZXcgU3RyaWJibGVoaWxsIDxhZHNAd29tcG9tLm9yZz4sIDIwMDUuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNTQsNDYgKzU2LDUwIEBACiAJb2ZmID0gKGlubyAtIEJGU19ST09UX0lOTykgJSBCRlNfSU5PREVTX1BFUl9CTE9DSzsKIAlkaSA9IChzdHJ1Y3QgYmZzX2lub2RlICopYmgtPmJfZGF0YSArIG9mZjsKIAotCWlub2RlLT5pX21vZGUgPSAweDAwMDBGRkZGICYgZGktPmlfbW9kZTsKLQlpZiAoZGktPmlfdnR5cGUgPT0gQkZTX1ZESVIpIHsKKwlpbm9kZS0+aV9tb2RlID0gMHgwMDAwRkZGRiAmICBsZTMyX3RvX2NwdShkaS0+aV9tb2RlKTsKKwlpZiAobGUzMl90b19jcHUoZGktPmlfdnR5cGUpID09IEJGU19WRElSKSB7CiAJCWlub2RlLT5pX21vZGUgfD0gU19JRkRJUjsKIAkJaW5vZGUtPmlfb3AgPSAmYmZzX2Rpcl9pbm9wczsKIAkJaW5vZGUtPmlfZm9wID0gJmJmc19kaXJfb3BlcmF0aW9uczsKLQl9IGVsc2UgaWYgKGRpLT5pX3Z0eXBlID09IEJGU19WUkVHKSB7CisJfSBlbHNlIGlmIChsZTMyX3RvX2NwdShkaS0+aV92dHlwZSkgPT0gQkZTX1ZSRUcpIHsKIAkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOwogCQlpbm9kZS0+aV9vcCA9ICZiZnNfZmlsZV9pbm9wczsKIAkJaW5vZGUtPmlfZm9wID0gJmJmc19maWxlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmJmc19hb3BzOwogCX0KIAotCWlub2RlLT5pX3VpZCA9IGRpLT5pX3VpZDsKLQlpbm9kZS0+aV9naWQgPSBkaS0+aV9naWQ7Ci0JaW5vZGUtPmlfbmxpbmsgPSBkaS0+aV9ubGluazsKKwlCRlNfSShpbm9kZSktPmlfc2Jsb2NrID0gIGxlMzJfdG9fY3B1KGRpLT5pX3NibG9jayk7CisJQkZTX0koaW5vZGUpLT5pX2VibG9jayA9ICBsZTMyX3RvX2NwdShkaS0+aV9lYmxvY2spOworCWlub2RlLT5pX3VpZCA9ICBsZTMyX3RvX2NwdShkaS0+aV91aWQpOworCWlub2RlLT5pX2dpZCA9ICBsZTMyX3RvX2NwdShkaS0+aV9naWQpOworCWlub2RlLT5pX25saW5rID0gIGxlMzJfdG9fY3B1KGRpLT5pX25saW5rKTsKIAlpbm9kZS0+aV9zaXplID0gQkZTX0ZJTEVTSVpFKGRpKTsKIAlpbm9kZS0+aV9ibG9ja3MgPSBCRlNfRklMRUJMT0NLUyhkaSk7CisgICAgICAgIGlmIChpbm9kZS0+aV9zaXplIHx8IGlub2RlLT5pX2Jsb2NrcykgZHByaW50ZigiUmVnaXN0ZXJlZCBpbm9kZSB3aXRoICVsbGQgc2l6ZSwgJWxkIGJsb2Nrc1xuIiwgaW5vZGUtPmlfc2l6ZSwgaW5vZGUtPmlfYmxvY2tzKTsKIAlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwotCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGRpLT5pX2F0aW1lOwotCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGRpLT5pX210aW1lOwotCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGRpLT5pX2N0aW1lOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9ICBsZTMyX3RvX2NwdShkaS0+aV9hdGltZSk7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gIGxlMzJfdG9fY3B1KGRpLT5pX210aW1lKTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSAgbGUzMl90b19jcHUoZGktPmlfY3RpbWUpOwogCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOwogCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOwogCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOwotCUJGU19JKGlub2RlKS0+aV9kc2tfaW5vID0gZGktPmlfaW5vOyAvKiBjYW4gYmUgMCBzbyB3ZSBzdG9yZSBhIGNvcHkgKi8KLQlCRlNfSShpbm9kZSktPmlfc2Jsb2NrID0gZGktPmlfc2Jsb2NrOwotCUJGU19JKGlub2RlKS0+aV9lYmxvY2sgPSBkaS0+aV9lYmxvY2s7CisJQkZTX0koaW5vZGUpLT5pX2Rza19pbm8gPSBsZTE2X3RvX2NwdShkaS0+aV9pbm8pOyAvKiBjYW4gYmUgMCBzbyB3ZSBzdG9yZSBhIGNvcHkgKi8KIAogCWJyZWxzZShiaCk7CiB9CiAKIHN0YXRpYyBpbnQgYmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgdW51c2VkKQogewotCXVuc2lnbmVkIGxvbmcgaW5vID0gaW5vZGUtPmlfaW5vOworCXVuc2lnbmVkIGludCBpbm8gPSAodTE2KWlub2RlLT5pX2lubzsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBpX3NibG9jazsKIAlzdHJ1Y3QgYmZzX2lub2RlICogZGk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CiAJaW50IGJsb2NrLCBvZmY7CiAKKyAgICAgICAgZHByaW50ZigiaW5vPSUwOHhcbiIsIGlubyk7CisKIAlpZiAoaW5vIDwgQkZTX1JPT1RfSU5PIHx8IGlubyA+IEJGU19TQihpbm9kZS0+aV9zYiktPnNpX2xhc3RpKSB7Ci0JCXByaW50ZigiQmFkIGlub2RlIG51bWJlciAlczolMDhseFxuIiwgaW5vZGUtPmlfc2ItPnNfaWQsIGlubyk7CisJCXByaW50ZigiQmFkIGlub2RlIG51bWJlciAlczolMDh4XG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xMDEsNyArMTA3LDcgQEAKIAlibG9jayA9IChpbm8gLSBCRlNfUk9PVF9JTk8pL0JGU19JTk9ERVNfUEVSX0JMT0NLICsgMTsKIAliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBibG9jayk7CiAJaWYgKCFiaCkgewotCQlwcmludGYoIlVuYWJsZSB0byByZWFkIGlub2RlICVzOiUwOGx4XG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vKTsKKwkJcHJpbnRmKCJVbmFibGUgdG8gcmVhZCBpbm9kZSAlczolMDh4XG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vKTsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMDksMjQgKzExNSwyNiBAQAogCW9mZiA9IChpbm8gLSBCRlNfUk9PVF9JTk8pJUJGU19JTk9ERVNfUEVSX0JMT0NLOwogCWRpID0gKHN0cnVjdCBiZnNfaW5vZGUgKiliaC0+Yl9kYXRhICsgb2ZmOwogCi0JaWYgKGlub2RlLT5pX2lubyA9PSBCRlNfUk9PVF9JTk8pCi0JCWRpLT5pX3Z0eXBlID0gQkZTX1ZESVI7CisJaWYgKGlubyA9PSBCRlNfUk9PVF9JTk8pCisJCWRpLT5pX3Z0eXBlID0gY3B1X3RvX2xlMzIoQkZTX1ZESVIpOwogCWVsc2UKLQkJZGktPmlfdnR5cGUgPSBCRlNfVlJFRzsKKwkJZGktPmlfdnR5cGUgPSBjcHVfdG9fbGUzMihCRlNfVlJFRyk7CiAKLQlkaS0+aV9pbm8gPSBpbm9kZS0+aV9pbm87Ci0JZGktPmlfbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JZGktPmlfdWlkID0gaW5vZGUtPmlfdWlkOwotCWRpLT5pX2dpZCA9IGlub2RlLT5pX2dpZDsKLQlkaS0+aV9ubGluayA9IGlub2RlLT5pX25saW5rOwotCWRpLT5pX2F0aW1lID0gaW5vZGUtPmlfYXRpbWUudHZfc2VjOwotCWRpLT5pX210aW1lID0gaW5vZGUtPmlfbXRpbWUudHZfc2VjOwotCWRpLT5pX2N0aW1lID0gaW5vZGUtPmlfY3RpbWUudHZfc2VjOwotCWRpLT5pX3NibG9jayA9IEJGU19JKGlub2RlKS0+aV9zYmxvY2s7Ci0JZGktPmlfZWJsb2NrID0gQkZTX0koaW5vZGUpLT5pX2VibG9jazsKLQlkaS0+aV9lb2Zmc2V0ID0gZGktPmlfc2Jsb2NrICogQkZTX0JTSVpFICsgaW5vZGUtPmlfc2l6ZSAtIDE7CisJZGktPmlfaW5vID0gY3B1X3RvX2xlMTYoaW5vKTsKKwlkaS0+aV9tb2RlID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfbW9kZSk7CisJZGktPmlfdWlkID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfdWlkKTsKKwlkaS0+aV9naWQgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9naWQpOworCWRpLT5pX25saW5rID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfbmxpbmspOworCWRpLT5pX2F0aW1lID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfYXRpbWUudHZfc2VjKTsKKwlkaS0+aV9tdGltZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX210aW1lLnR2X3NlYyk7CisJZGktPmlfY3RpbWUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9jdGltZS50dl9zZWMpOworICAgICAgICBpX3NibG9jayA9IEJGU19JKGlub2RlKS0+aV9zYmxvY2s7CisJZGktPmlfc2Jsb2NrID0gY3B1X3RvX2xlMzIoaV9zYmxvY2spOworCWRpLT5pX2VibG9jayA9IGNwdV90b19sZTMyKEJGU19JKGlub2RlKS0+aV9lYmxvY2spOworCWRpLT5pX2VvZmZzZXQgPSBjcHVfdG9fbGUzMihpX3NibG9jayAqIEJGU19CU0laRSArIGlub2RlLT5pX3NpemUgLSAxKTsKIAogCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKyAgICAgICAgZHByaW50ZigiV3JpdHRlbiBpbm89JWQgaW50byAlZDolZFxuIixsZTE2X3RvX2NwdShkaS0+aV9pbm8pLGJsb2NrLG9mZik7CiAJYnJlbHNlKGJoKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CkBAIC0xNDAsMTEgKzE0OCwxNCBAQAogCWludCBibG9jaywgb2ZmOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgYmZzX3NiX2luZm8gKiBpbmZvID0gQkZTX1NCKHMpOworCXN0cnVjdCBiZnNfaW5vZGVfaW5mbyAqIGJpID0gQkZTX0koaW5vZGUpOwogCi0JZHByaW50ZigiaW5vPSUwOGx4XG4iLCBpbm9kZS0+aV9pbm8pOworCWRwcmludGYoImlubz0lMDhseFxuIiwgaW5vKTsKIAotCWlmIChpbm9kZS0+aV9pbm8gPCBCRlNfUk9PVF9JTk8gfHwgaW5vZGUtPmlfaW5vID4gaW5mby0+c2lfbGFzdGkpIHsKLQkJcHJpbnRmKCJpbnZhbGlkIGlubz0lMDhseFxuIiwgaW5vZGUtPmlfaW5vKTsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CisKKwlpZiAoaW5vIDwgQkZTX1JPT1RfSU5PIHx8IGlubyA+IGluZm8tPnNpX2xhc3RpKSB7CisJCXByaW50ZigiaW52YWxpZCBpbm89JTA4bHhcbiIsIGlubyk7CiAJCXJldHVybjsKIAl9CiAJCkBAIC0xNjAsMTMgKzE3MSwxMyBAQAogCQlyZXR1cm47CiAJfQogCW9mZiA9IChpbm8gLSBCRlNfUk9PVF9JTk8pJUJGU19JTk9ERVNfUEVSX0JMT0NLOwotCWRpID0gKHN0cnVjdCBiZnNfaW5vZGUgKiliaC0+Yl9kYXRhICsgb2ZmOwotCWlmIChkaS0+aV9pbm8pIHsKLQkJaW5mby0+c2lfZnJlZWIgKz0gQkZTX0ZJTEVCTE9DS1MoZGkpOworCWRpID0gKHN0cnVjdCBiZnNfaW5vZGUgKikgYmgtPmJfZGF0YSArIG9mZjsKKyAgICAgICAgaWYgKGJpLT5pX2Rza19pbm8pIHsKKwkJaW5mby0+c2lfZnJlZWIgKz0gMSArIGJpLT5pX2VibG9jayAtIGJpLT5pX3NibG9jazsKIAkJaW5mby0+c2lfZnJlZWkrKzsKLQkJY2xlYXJfYml0KGRpLT5pX2lubywgaW5mby0+c2lfaW1hcCk7CisJCWNsZWFyX2JpdChpbm8sIGluZm8tPnNpX2ltYXApOwogCQlkdW1wX2ltYXAoImRlbGV0ZV9pbm9kZSIsIHMpOwotCX0KKyAgICAgICAgfQogCWRpLT5pX2lubyA9IDA7CiAJZGktPmlfc2Jsb2NrID0gMDsKIAltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CkBAIC0yNzIsMTQgKzI4MywxNCBAQAogCiB2b2lkIGR1bXBfaW1hcChjb25zdCBjaGFyICpwcmVmaXgsIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCiB7Ci0jaWYgMAorI2lmZGVmIERFQlVHCiAJaW50IGk7CiAJY2hhciAqdG1wYnVmID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXRtcGJ1ZikKIAkJcmV0dXJuOwogCWZvciAoaT1CRlNfU0IocyktPnNpX2xhc3RpOyBpPj0wOyBpLS0pIHsKLQkJaWYgKGk+UEFHRV9TSVpFLTEwMCkgYnJlYWs7CisJCWlmIChpID4gUEFHRV9TSVpFLTEwMCkgYnJlYWs7CiAJCWlmICh0ZXN0X2JpdChpLCBCRlNfU0IocyktPnNpX2ltYXApKQogCQkJc3RyY2F0KHRtcGJ1ZiwgIjEiKTsKIAkJZWxzZQpAQCAtMjk1LDcgKzMwNiw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CiAJc3RydWN0IGJmc19zdXBlcl9ibG9jayAqIGJmc19zYjsKIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLQlpbnQgaSwgaW1hcF9sZW47CisJdW5zaWduZWQgaSwgaW1hcF9sZW47CiAJc3RydWN0IGJmc19zYl9pbmZvICogaW5mbzsKIAogCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwpAQCAtMzEwLDE5ICszMjEsMTggQEAKIAlpZighYmgpCiAJCWdvdG8gb3V0OwogCWJmc19zYiA9IChzdHJ1Y3QgYmZzX3N1cGVyX2Jsb2NrICopYmgtPmJfZGF0YTsKLQlpZiAoYmZzX3NiLT5zX21hZ2ljICE9IEJGU19NQUdJQykgeworCWlmIChsZTMyX3RvX2NwdShiZnNfc2ItPnNfbWFnaWMpICE9IEJGU19NQUdJQykgewogCQlpZiAoIXNpbGVudCkKIAkJCXByaW50ZigiTm8gQkZTIGZpbGVzeXN0ZW0gb24gJXMgKG1hZ2ljPSUwOHgpXG4iLCAKLQkJCQlzLT5zX2lkLCBiZnNfc2ItPnNfbWFnaWMpOworCQkJCXMtPnNfaWQsICBsZTMyX3RvX2NwdShiZnNfc2ItPnNfbWFnaWMpKTsKIAkJZ290byBvdXQ7CiAJfQogCWlmIChCRlNfVU5DTEVBTihiZnNfc2IsIHMpICYmICFzaWxlbnQpCiAJCXByaW50ZigiJXMgaXMgdW5jbGVhbiwgY29udGludWluZ1xuIiwgcy0+c19pZCk7CiAKIAlzLT5zX21hZ2ljID0gQkZTX01BR0lDOwotCWluZm8tPnNpX2Jmc19zYiA9IGJmc19zYjsKIAlpbmZvLT5zaV9zYmggPSBiaDsKLQlpbmZvLT5zaV9sYXN0aSA9IChiZnNfc2ItPnNfc3RhcnQgLSBCRlNfQlNJWkUpL3NpemVvZihzdHJ1Y3QgYmZzX2lub2RlKSAKKwlpbmZvLT5zaV9sYXN0aSA9IChsZTMyX3RvX2NwdShiZnNfc2ItPnNfc3RhcnQpIC0gQkZTX0JTSVpFKS9zaXplb2Yoc3RydWN0IGJmc19pbm9kZSkKIAkJCSsgQkZTX1JPT1RfSU5PIC0gMTsKIAogCWltYXBfbGVuID0gaW5mby0+c2lfbGFzdGkvOCArIDE7CkBAIC0zNDYsOCArMzU2LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaW5mby0+c2lfYmxvY2tzID0gKGJmc19zYi0+c19lbmQgKyAxKT4+QkZTX0JTSVpFX0JJVFM7IC8qIGZvciBzdGF0ZnMoMikgKi8KLQlpbmZvLT5zaV9mcmVlYiA9IChiZnNfc2ItPnNfZW5kICsgMSAtIGJmc19zYi0+c19zdGFydCk+PkJGU19CU0laRV9CSVRTOworCWluZm8tPnNpX2Jsb2NrcyA9IChsZTMyX3RvX2NwdShiZnNfc2ItPnNfZW5kKSArIDEpPj5CRlNfQlNJWkVfQklUUzsgLyogZm9yIHN0YXRmcygyKSAqLworCWluZm8tPnNpX2ZyZWViID0gKGxlMzJfdG9fY3B1KGJmc19zYi0+c19lbmQpICsgMSAtICBjcHVfdG9fbGUzMihiZnNfc2ItPnNfc3RhcnQpKT4+QkZTX0JTSVpFX0JJVFM7CiAJaW5mby0+c2lfZnJlZWkgPSAwOwogCWluZm8tPnNpX2xmX2VibGsgPSAwOwogCWluZm8tPnNpX2xmX3NibGsgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2ZsYXQuYyBiL2ZzL2JpbmZtdF9mbGF0LmMKaW5kZXggYzg5OThkYy4uNzk3NGVmYSAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2ZsYXQuYworKysgYi9mcy9iaW5mbXRfZmxhdC5jCkBAIC01MjAsNyArNTIwLDcgQEAKIAkJREJHX0ZMVCgiQklORk1UX0ZMQVQ6IFJPTSBtYXBwaW5nIG9mIGZpbGUgKHdlIGhvcGUpXG4iKTsKIAogCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCQl0ZXh0cG9zID0gZG9fbW1hcChicHJtLT5maWxlLCAwLCB0ZXh0X2xlbiwgUFJPVF9SRUFEfFBST1RfRVhFQywgTUFQX1NIQVJFRCwgMCk7CisJCXRleHRwb3MgPSBkb19tbWFwKGJwcm0tPmZpbGUsIDAsIHRleHRfbGVuLCBQUk9UX1JFQUR8UFJPVF9FWEVDLCBNQVBfUFJJVkFURSwgMCk7CiAJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCQlpZiAoIXRleHRwb3MgIHx8IHRleHRwb3MgPj0gKHVuc2lnbmVkIGxvbmcpIC00MDk2KSB7CiAJCQlpZiAoIXRleHRwb3MpCmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCmluZGV4IDFmMmQ0NjQuLjgzYTM0OTUgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby5jCisrKyBiL2ZzL2Jpby5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPHNjc2kvc2cuaD4JCS8qIGZvciBzdHJ1Y3Qgc2dfaW92ZWMgKi8KIAogI2RlZmluZSBCSU9fUE9PTF9TSVpFIDI1NgogCkBAIC0xMDQsMTggKzEwNSwyMiBAQAogCXJldHVybiBidmw7CiB9CiAKLS8qCi0gKiBkZWZhdWx0IGRlc3RydWN0b3IgZm9yIGEgYmlvIGFsbG9jYXRlZCB3aXRoIGJpb19hbGxvY19iaW9zZXQoKQotICovCi1zdGF0aWMgdm9pZCBiaW9fZGVzdHJ1Y3RvcihzdHJ1Y3QgYmlvICpiaW8pCit2b2lkIGJpb19mcmVlKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpb19zZXQgKmJpb19zZXQpCiB7CiAJY29uc3QgaW50IHBvb2xfaWR4ID0gQklPX1BPT0xfSURYKGJpbyk7Ci0Jc3RydWN0IGJpb19zZXQgKmJzID0gYmlvLT5iaV9zZXQ7CiAKIAlCSU9fQlVHX09OKHBvb2xfaWR4ID49IEJJT1ZFQ19OUl9QT09MUyk7CiAKLQltZW1wb29sX2ZyZWUoYmlvLT5iaV9pb192ZWMsIGJzLT5idmVjX3Bvb2xzW3Bvb2xfaWR4XSk7Ci0JbWVtcG9vbF9mcmVlKGJpbywgYnMtPmJpb19wb29sKTsKKwltZW1wb29sX2ZyZWUoYmlvLT5iaV9pb192ZWMsIGJpb19zZXQtPmJ2ZWNfcG9vbHNbcG9vbF9pZHhdKTsKKwltZW1wb29sX2ZyZWUoYmlvLCBiaW9fc2V0LT5iaW9fcG9vbCk7Cit9CisKKy8qCisgKiBkZWZhdWx0IGRlc3RydWN0b3IgZm9yIGEgYmlvIGFsbG9jYXRlZCB3aXRoIGJpb19hbGxvY19iaW9zZXQoKQorICovCitzdGF0aWMgdm9pZCBiaW9fZnNfZGVzdHJ1Y3RvcihzdHJ1Y3QgYmlvICpiaW8pCit7CisJYmlvX2ZyZWUoYmlvLCBmc19iaW9fc2V0KTsKIH0KIAogaW5saW5lIHZvaWQgYmlvX2luaXQoc3RydWN0IGJpbyAqYmlvKQpAQCAtMTcxLDggKzE3Niw2IEBACiAJCQliaW8tPmJpX21heF92ZWNzID0gYnZlY19zbGFic1tpZHhdLm5yX3ZlY3M7CiAJCX0KIAkJYmlvLT5iaV9pb192ZWMgPSBidmw7Ci0JCWJpby0+YmlfZGVzdHJ1Y3RvciA9IGJpb19kZXN0cnVjdG9yOwotCQliaW8tPmJpX3NldCA9IGJzOwogCX0KIG91dDoKIAlyZXR1cm4gYmlvOwpAQCAtMTgwLDcgKzE4MywxMiBAQAogCiBzdHJ1Y3QgYmlvICpiaW9fYWxsb2ModW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrLCBpbnQgbnJfaW92ZWNzKQogewotCXJldHVybiBiaW9fYWxsb2NfYmlvc2V0KGdmcF9tYXNrLCBucl9pb3ZlY3MsIGZzX2Jpb19zZXQpOworCXN0cnVjdCBiaW8gKmJpbyA9IGJpb19hbGxvY19iaW9zZXQoZ2ZwX21hc2ssIG5yX2lvdmVjcywgZnNfYmlvX3NldCk7CisKKwlpZiAoYmlvKQorCQliaW8tPmJpX2Rlc3RydWN0b3IgPSBiaW9fZnNfZGVzdHJ1Y3RvcjsKKworCXJldHVybiBiaW87CiB9CiAKIHZvaWQgemVyb19maWxsX2JpbyhzdHJ1Y3QgYmlvICpiaW8pCkBAIC0yNzMsOCArMjgxLDEwIEBACiB7CiAJc3RydWN0IGJpbyAqYiA9IGJpb19hbGxvY19iaW9zZXQoZ2ZwX21hc2ssIGJpby0+YmlfbWF4X3ZlY3MsIGZzX2Jpb19zZXQpOwogCi0JaWYgKGIpCisJaWYgKGIpIHsKKwkJYi0+YmlfZGVzdHJ1Y3RvciA9IGJpb19mc19kZXN0cnVjdG9yOwogCQlfX2Jpb19jbG9uZShiLCBiaW8pOworCX0KIAogCXJldHVybiBiOwogfQpAQCAtNTQ2LDIyICs1NTYsMzQgQEAKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCi1zdGF0aWMgc3RydWN0IGJpbyAqX19iaW9fbWFwX3VzZXIocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAotCQkJCSAgdW5zaWduZWQgbG9uZyB1YWRkciwgdW5zaWduZWQgaW50IGxlbiwKLQkJCQkgIGludCB3cml0ZV90b192bSkKK3N0YXRpYyBzdHJ1Y3QgYmlvICpfX2Jpb19tYXBfdXNlcl9pb3YocmVxdWVzdF9xdWV1ZV90ICpxLAorCQkJCSAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQkJICAgICAgc3RydWN0IHNnX2lvdmVjICppb3YsIGludCBpb3ZfY291bnQsCisJCQkJICAgICAgaW50IHdyaXRlX3RvX3ZtKQogewotCXVuc2lnbmVkIGxvbmcgZW5kID0gKHVhZGRyICsgbGVuICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdWFkZHIgPj4gUEFHRV9TSElGVDsKLQljb25zdCBpbnQgbnJfcGFnZXMgPSBlbmQgLSBzdGFydDsKLQlpbnQgcmV0LCBvZmZzZXQsIGk7CisJaW50IGksIGo7CisJaW50IG5yX3BhZ2VzID0gMDsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwogCXN0cnVjdCBiaW8gKmJpbzsKKwlpbnQgY3VyX3BhZ2UgPSAwOworCWludCByZXQsIG9mZnNldDsKIAotCS8qCi0JICogdHJhbnNmZXIgYW5kIGJ1ZmZlciBtdXN0IGJlIGFsaWduZWQgdG8gYXQgbGVhc3QgaGFyZHNlY3RvcgotCSAqIHNpemUgZm9yIG5vdywgaW4gdGhlIGZ1dHVyZSB3ZSBjYW4gcmVsYXggdGhpcyByZXN0cmljdGlvbgotCSAqLwotCWlmICgodWFkZHIgJiBxdWV1ZV9kbWFfYWxpZ25tZW50KHEpKSB8fCAobGVuICYgcXVldWVfZG1hX2FsaWdubWVudChxKSkpCisJZm9yIChpID0gMDsgaSA8IGlvdl9jb3VudDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgdWFkZHIgPSAodW5zaWduZWQgbG9uZylpb3ZbaV0uaW92X2Jhc2U7CisJCXVuc2lnbmVkIGxvbmcgbGVuID0gaW92W2ldLmlvdl9sZW47CisJCXVuc2lnbmVkIGxvbmcgZW5kID0gKHVhZGRyICsgbGVuICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCA9IHVhZGRyID4+IFBBR0VfU0hJRlQ7CisKKwkJbnJfcGFnZXMgKz0gZW5kIC0gc3RhcnQ7CisJCS8qCisJCSAqIHRyYW5zZmVyIGFuZCBidWZmZXIgbXVzdCBiZSBhbGlnbmVkIHRvIGF0IGxlYXN0IGhhcmRzZWN0b3IKKwkJICogc2l6ZSBmb3Igbm93LCBpbiB0aGUgZnV0dXJlIHdlIGNhbiByZWxheCB0aGlzIHJlc3RyaWN0aW9uCisJCSAqLworCQlpZiAoKHVhZGRyICYgcXVldWVfZG1hX2FsaWdubWVudChxKSkgfHwgKGxlbiAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkpKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJaWYgKCFucl9wYWdlcykKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAliaW8gPSBiaW9fYWxsb2MoR0ZQX0tFUk5FTCwgbnJfcGFnZXMpOwpAQCAtNTczLDQyICs1OTUsNTQgQEAKIAlpZiAoIXBhZ2VzKQogCQlnb3RvIG91dDsKIAotCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQlyZXQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgdWFkZHIsIG5yX3BhZ2VzLAotCQkJCQkJd3JpdGVfdG9fdm0sIDAsIHBhZ2VzLCBOVUxMKTsKLQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCW1lbXNldChwYWdlcywgMCwgbnJfcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKikpOwogCi0JaWYgKHJldCA8IG5yX3BhZ2VzKQotCQlnb3RvIG91dDsKKwlmb3IgKGkgPSAwOyBpIDwgaW92X2NvdW50OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyB1YWRkciA9ICh1bnNpZ25lZCBsb25nKWlvdltpXS5pb3ZfYmFzZTsKKwkJdW5zaWduZWQgbG9uZyBsZW4gPSBpb3ZbaV0uaW92X2xlbjsKKwkJdW5zaWduZWQgbG9uZyBlbmQgPSAodWFkZHIgKyBsZW4gKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdWFkZHIgPj4gUEFHRV9TSElGVDsKKwkJY29uc3QgaW50IGxvY2FsX25yX3BhZ2VzID0gZW5kIC0gc3RhcnQ7CisJCWNvbnN0IGludCBwYWdlX2xpbWl0ID0gY3VyX3BhZ2UgKyBsb2NhbF9ucl9wYWdlczsKKwkJCisJCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIHVhZGRyLAorCQkJCSAgICAgbG9jYWxfbnJfcGFnZXMsCisJCQkJICAgICB3cml0ZV90b192bSwgMCwgJnBhZ2VzW2N1cl9wYWdlXSwgTlVMTCk7CisJCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKLQliaW8tPmJpX2JkZXYgPSBiZGV2OworCQlpZiAocmV0IDwgbG9jYWxfbnJfcGFnZXMpCisJCQlnb3RvIG91dF91bm1hcDsKIAotCW9mZnNldCA9IHVhZGRyICYgflBBR0VfTUFTSzsKLQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewotCQl1bnNpZ25lZCBpbnQgYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CiAKLQkJaWYgKGxlbiA8PSAwKQotCQkJYnJlYWs7CisJCW9mZnNldCA9IHVhZGRyICYgflBBR0VfTUFTSzsKKwkJZm9yIChqID0gY3VyX3BhZ2U7IGogPCBwYWdlX2xpbWl0OyBqKyspIHsKKwkJCXVuc2lnbmVkIGludCBieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDsKIAotCQlpZiAoYnl0ZXMgPiBsZW4pCi0JCQlieXRlcyA9IGxlbjsKKwkJCWlmIChsZW4gPD0gMCkKKwkJCQlicmVhazsKKwkJCQorCQkJaWYgKGJ5dGVzID4gbGVuKQorCQkJCWJ5dGVzID0gbGVuOwogCisJCQkvKgorCQkJICogc29ycnkuLi4KKwkJCSAqLworCQkJaWYgKF9fYmlvX2FkZF9wYWdlKHEsIGJpbywgcGFnZXNbal0sIGJ5dGVzLCBvZmZzZXQpIDwgYnl0ZXMpCisJCQkJYnJlYWs7CisKKwkJCWxlbiAtPSBieXRlczsKKwkJCW9mZnNldCA9IDA7CisJCX0KKworCQljdXJfcGFnZSA9IGo7CiAJCS8qCi0JCSAqIHNvcnJ5Li4uCisJCSAqIHJlbGVhc2UgdGhlIHBhZ2VzIHdlIGRpZG4ndCBtYXAgaW50byB0aGUgYmlvLCBpZiBhbnkKIAkJICovCi0JCWlmIChfX2Jpb19hZGRfcGFnZShxLCBiaW8sIHBhZ2VzW2ldLCBieXRlcywgb2Zmc2V0KSA8IGJ5dGVzKQotCQkJYnJlYWs7Ci0KLQkJbGVuIC09IGJ5dGVzOwotCQlvZmZzZXQgPSAwOworCQl3aGlsZSAoaiA8IHBhZ2VfbGltaXQpCisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbaisrXSk7CiAJfQogCi0JLyoKLQkgKiByZWxlYXNlIHRoZSBwYWdlcyB3ZSBkaWRuJ3QgbWFwIGludG8gdGhlIGJpbywgaWYgYW55Ci0JICovCi0Jd2hpbGUgKGkgPCBucl9wYWdlcykKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2krK10pOwotCiAJa2ZyZWUocGFnZXMpOwogCiAJLyoKQEAgLTYxNyw5ICs2NTEsMTcgQEAKIAlpZiAoIXdyaXRlX3RvX3ZtKQogCQliaW8tPmJpX3J3IHw9ICgxIDw8IEJJT19SVyk7CiAKKwliaW8tPmJpX2JkZXYgPSBiZGV2OwogCWJpby0+YmlfZmxhZ3MgfD0gKDEgPDwgQklPX1VTRVJfTUFQUEVEKTsKIAlyZXR1cm4gYmlvOwotb3V0OgorCisgb3V0X3VubWFwOgorCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7CisJCWlmKCFwYWdlc1tpXSkKKwkJCWJyZWFrOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbaV0pOworCX0KKyBvdXQ6CiAJa2ZyZWUocGFnZXMpOwogCWJpb19wdXQoYmlvKTsKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwpAQCAtNjM5LDkgKzY4MSwzMyBAQAogc3RydWN0IGJpbyAqYmlvX21hcF91c2VyKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJCSB1bnNpZ25lZCBsb25nIHVhZGRyLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgd3JpdGVfdG9fdm0pCiB7Ci0Jc3RydWN0IGJpbyAqYmlvOworCXN0cnVjdCBzZ19pb3ZlYyBpb3Y7CiAKLQliaW8gPSBfX2Jpb19tYXBfdXNlcihxLCBiZGV2LCB1YWRkciwgbGVuLCB3cml0ZV90b192bSk7CisJaW92Lmlvdl9iYXNlID0gKHZvaWQgX191c2VyICopdWFkZHI7CisJaW92Lmlvdl9sZW4gPSBsZW47CisKKwlyZXR1cm4gYmlvX21hcF91c2VyX2lvdihxLCBiZGV2LCAmaW92LCAxLCB3cml0ZV90b192bSk7Cit9CisKKy8qKgorICoJYmlvX21hcF91c2VyX2lvdiAtIG1hcCB1c2VyIHNnX2lvdmVjIHRhYmxlIGludG8gYmlvCisgKglAcTogdGhlIHJlcXVlc3RfcXVldWVfdCBmb3IgdGhlIGJpbworICoJQGJkZXY6IGRlc3RpbmF0aW9uIGJsb2NrIGRldmljZQorICoJQGlvdjoJdGhlIGlvdmVjLgorICoJQGlvdl9jb3VudDogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpb3ZlYworICoJQHdyaXRlX3RvX3ZtOiBib29sIGluZGljYXRpbmcgd3JpdGluZyB0byBwYWdlcyBvciBub3QKKyAqCisgKglNYXAgdGhlIHVzZXIgc3BhY2UgYWRkcmVzcyBpbnRvIGEgYmlvIHN1aXRhYmxlIGZvciBpbyB0byBhIGJsb2NrCisgKglkZXZpY2UuIFJldHVybnMgYW4gZXJyb3IgcG9pbnRlciBpbiBjYXNlIG9mIGVycm9yLgorICovCitzdHJ1Y3QgYmlvICpiaW9fbWFwX3VzZXJfaW92KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCSAgICAgc3RydWN0IHNnX2lvdmVjICppb3YsIGludCBpb3ZfY291bnQsCisJCQkgICAgIGludCB3cml0ZV90b192bSkKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisJaW50IGxlbiA9IDAsIGk7CisKKwliaW8gPSBfX2Jpb19tYXBfdXNlcl9pb3YocSwgYmRldiwgaW92LCBpb3ZfY291bnQsIHdyaXRlX3RvX3ZtKTsKIAogCWlmIChJU19FUlIoYmlvKSkKIAkJcmV0dXJuIGJpbzsKQEAgLTY1NCw2ICs3MjAsOSBAQAogCSAqLwogCWJpb19nZXQoYmlvKTsKIAorCWZvciAoaSA9IDA7IGkgPCBpb3ZfY291bnQ7IGkrKykKKwkJbGVuICs9IGlvdltpXS5pb3ZfbGVuOworCiAJaWYgKGJpby0+Ymlfc2l6ZSA9PSBsZW4pCiAJCXJldHVybiBiaW87CiAKQEAgLTY5OCw2ICs3NjcsODIgQEAKIAliaW9fcHV0KGJpbyk7CiB9CiAKK3N0YXRpYyBpbnQgYmlvX21hcF9rZXJuX2VuZGlvKHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgaW50IGJ5dGVzX2RvbmUsIGludCBlcnIpCit7CisJaWYgKGJpby0+Ymlfc2l6ZSkKKwkJcmV0dXJuIDE7CisKKwliaW9fcHV0KGJpbyk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBiaW8gKl9fYmlvX21hcF9rZXJuKHJlcXVlc3RfcXVldWVfdCAqcSwgdm9pZCAqZGF0YSwKKwkJCQkgIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBnZnBfbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIGthZGRyID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IChrYWRkciArIGxlbiArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IGthZGRyID4+IFBBR0VfU0hJRlQ7CisJY29uc3QgaW50IG5yX3BhZ2VzID0gZW5kIC0gc3RhcnQ7CisJaW50IG9mZnNldCwgaTsKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwliaW8gPSBiaW9fYWxsb2MoZ2ZwX21hc2ssIG5yX3BhZ2VzKTsKKwlpZiAoIWJpbykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlvZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShrYWRkcik7CisJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGJ5dGVzID0gUEFHRV9TSVpFIC0gb2Zmc2V0OworCisJCWlmIChsZW4gPD0gMCkKKwkJCWJyZWFrOworCisJCWlmIChieXRlcyA+IGxlbikKKwkJCWJ5dGVzID0gbGVuOworCisJCWlmIChfX2Jpb19hZGRfcGFnZShxLCBiaW8sIHZpcnRfdG9fcGFnZShkYXRhKSwgYnl0ZXMsCisJCQkJICAgb2Zmc2V0KSA8IGJ5dGVzKQorCQkJYnJlYWs7CisKKwkJZGF0YSArPSBieXRlczsKKwkJbGVuIC09IGJ5dGVzOworCQlvZmZzZXQgPSAwOworCX0KKworCWJpby0+YmlfZW5kX2lvID0gYmlvX21hcF9rZXJuX2VuZGlvOworCXJldHVybiBiaW87Cit9CisKKy8qKgorICoJYmlvX21hcF9rZXJuCS0JbWFwIGtlcm5lbCBhZGRyZXNzIGludG8gYmlvCisgKglAcTogdGhlIHJlcXVlc3RfcXVldWVfdCBmb3IgdGhlIGJpbworICoJQGRhdGE6IHBvaW50ZXIgdG8gYnVmZmVyIHRvIG1hcAorICoJQGxlbjogbGVuZ3RoIGluIGJ5dGVzCisgKglAZ2ZwX21hc2s6IGFsbG9jYXRpb24gZmxhZ3MgZm9yIGJpbyBhbGxvY2F0aW9uCisgKgorICoJTWFwIHRoZSBrZXJuZWwgYWRkcmVzcyBpbnRvIGEgYmlvIHN1aXRhYmxlIGZvciBpbyB0byBhIGJsb2NrCisgKglkZXZpY2UuIFJldHVybnMgYW4gZXJyb3IgcG9pbnRlciBpbiBjYXNlIG9mIGVycm9yLgorICovCitzdHJ1Y3QgYmlvICpiaW9fbWFwX2tlcm4ocmVxdWVzdF9xdWV1ZV90ICpxLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJIHVuc2lnbmVkIGludCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwliaW8gPSBfX2Jpb19tYXBfa2VybihxLCBkYXRhLCBsZW4sIGdmcF9tYXNrKTsKKwlpZiAoSVNfRVJSKGJpbykpCisJCXJldHVybiBiaW87CisKKwlpZiAoYmlvLT5iaV9zaXplID09IGxlbikKKwkJcmV0dXJuIGJpbzsKKworCS8qCisJICogRG9uJ3Qgc3VwcG9ydCBwYXJ0aWFsIG1hcHBpbmdzLgorCSAqLworCWJpb19wdXQoYmlvKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KKwogLyoKICAqIGJpb19zZXRfcGFnZXNfZGlydHkoKSBhbmQgYmlvX2NoZWNrX3BhZ2VzX2RpcnR5KCkgYXJlIHN1cHBvcnQgZnVuY3Rpb25zCiAgKiBmb3IgcGVyZm9ybWluZyBkaXJlY3QtSU8gaW4gQklPcy4KQEAgLTEwNzUsNiArMTIyMCw3IEBACiAKIEVYUE9SVF9TWU1CT0woYmlvX2FsbG9jKTsKIEVYUE9SVF9TWU1CT0woYmlvX3B1dCk7CitFWFBPUlRfU1lNQk9MKGJpb19mcmVlKTsKIEVYUE9SVF9TWU1CT0woYmlvX2VuZGlvKTsKIEVYUE9SVF9TWU1CT0woYmlvX2luaXQpOwogRVhQT1JUX1NZTUJPTChfX2Jpb19jbG9uZSk7CkBAIC0xMDg1LDYgKzEyMzEsNyBAQAogRVhQT1JUX1NZTUJPTChiaW9fZ2V0X25yX3ZlY3MpOwogRVhQT1JUX1NZTUJPTChiaW9fbWFwX3VzZXIpOwogRVhQT1JUX1NZTUJPTChiaW9fdW5tYXBfdXNlcik7CitFWFBPUlRfU1lNQk9MKGJpb19tYXBfa2Vybik7CiBFWFBPUlRfU1lNQk9MKGJpb19wYWlyX3JlbGVhc2UpOwogRVhQT1JUX1NZTUJPTChiaW9fc3BsaXQpOwogRVhQT1JUX1NZTUJPTChiaW9fc3BsaXRfcG9vbCk7CmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IDZhMjVkN2QuLjZjYmZjZWEgMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRfc3BpbmxvY2suaD4KIAogc3RhdGljIGludCBmc3luY19idWZmZXJzX2xpc3Qoc3BpbmxvY2tfdCAqbG9jaywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCk7CiBzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX2JoX2xydXModm9pZCk7CkBAIC05MTcsOCArOTE4LDcgQEAKIAkJCQkgKiBjb250ZW50cyAtIGl0IGlzIGEgbm9vcCBpZiBJL08gaXMgc3RpbGwgaW4KIAkJCQkgKiBmbGlnaHQgb24gcG90ZW50aWFsbHkgb2xkZXIgY29udGVudHMuCiAJCQkJICovCi0JCQkJd2FpdF9vbl9idWZmZXIoYmgpOwotCQkJCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmYmgpOworCQkJCWxsX3J3X2Jsb2NrKFNXUklURSwgMSwgJmJoKTsKIAkJCQlicmVsc2UoYmgpOwogCQkJCXNwaW5fbG9jayhsb2NrKTsKIAkJCX0KQEAgLTI3OTMsMjEgKzI3OTMsMjIgQEAKIAogLyoqCiAgKiBsbF9yd19ibG9jazogbG93LWxldmVsIGFjY2VzcyB0byBibG9jayBkZXZpY2VzIChERVBSRUNBVEVEKQotICogQHJ3OiB3aGV0aGVyIHRvICVSRUFEIG9yICVXUklURSBvciBtYXliZSAlUkVBREEgKHJlYWRhaGVhZCkKKyAqIEBydzogd2hldGhlciB0byAlUkVBRCBvciAlV1JJVEUgb3IgJVNXUklURSBvciBtYXliZSAlUkVBREEgKHJlYWRhaGVhZCkKICAqIEBucjogbnVtYmVyIG9mICZzdHJ1Y3QgYnVmZmVyX2hlYWRzIGluIHRoZSBhcnJheQogICogQGJoczogYXJyYXkgb2YgcG9pbnRlcnMgdG8gJnN0cnVjdCBidWZmZXJfaGVhZAogICoKLSAqIGxsX3J3X2Jsb2NrKCkgdGFrZXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gJnN0cnVjdCBidWZmZXJfaGVhZHMsCi0gKiBhbmQgcmVxdWVzdHMgYW4gSS9PIG9wZXJhdGlvbiBvbiB0aGVtLCBlaXRoZXIgYSAlUkVBRCBvciBhICVXUklURS4KLSAqIFRoZSB0aGlyZCAlUkVBREEgb3B0aW9uIGlzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKLSAqIGdlbmVyaWNfbWFrZV9yZXF1ZXN0KCkgd2hpY2ggbGxfcndfYmxvY2soKSBjYWxscy4KKyAqIGxsX3J3X2Jsb2NrKCkgdGFrZXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gJnN0cnVjdCBidWZmZXJfaGVhZHMsIGFuZAorICogcmVxdWVzdHMgYW4gSS9PIG9wZXJhdGlvbiBvbiB0aGVtLCBlaXRoZXIgYSAlUkVBRCBvciBhICVXUklURS4gIFRoZSB0aGlyZAorICogJVNXUklURSBpcyBsaWtlICVXUklURSBvbmx5IHdlIG1ha2Ugc3VyZSB0aGF0IHRoZSAqY3VycmVudCogZGF0YSBpbiBidWZmZXJzCisgKiBhcmUgc2VudCB0byBkaXNrLiBUaGUgZm91cnRoICVSRUFEQSBvcHRpb24gaXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiBmb3IgZ2VuZXJpY19tYWtlX3JlcXVlc3QoKSB3aGljaCBsbF9yd19ibG9jaygpIGNhbGxzLgogICoKICAqIFRoaXMgZnVuY3Rpb24gZHJvcHMgYW55IGJ1ZmZlciB0aGF0IGl0IGNhbm5vdCBnZXQgYSBsb2NrIG9uICh3aXRoIHRoZQotICogQkhfTG9jayBzdGF0ZSBiaXQpLCBhbnkgYnVmZmVyIHRoYXQgYXBwZWFycyB0byBiZSBjbGVhbiB3aGVuIGRvaW5nIGEKLSAqIHdyaXRlIHJlcXVlc3QsIGFuZCBhbnkgYnVmZmVyIHRoYXQgYXBwZWFycyB0byBiZSB1cC10by1kYXRlIHdoZW4gZG9pbmcKLSAqIHJlYWQgcmVxdWVzdC4gIEZ1cnRoZXIgaXQgbWFya3MgYXMgY2xlYW4gYnVmZmVycyB0aGF0IGFyZSBwcm9jZXNzZWQgZm9yCi0gKiB3cml0aW5nICh0aGUgYnVmZmVyIGNhY2hlIHdvbid0IGFzc3VtZSB0aGF0IHRoZXkgYXJlIGFjdHVhbGx5IGNsZWFuIHVudGlsCi0gKiB0aGUgYnVmZmVyIGdldHMgdW5sb2NrZWQpLgorICogQkhfTG9jayBzdGF0ZSBiaXQpIHVubGVzcyBTV1JJVEUgaXMgcmVxdWlyZWQsIGFueSBidWZmZXIgdGhhdCBhcHBlYXJzIHRvIGJlCisgKiBjbGVhbiB3aGVuIGRvaW5nIGEgd3JpdGUgcmVxdWVzdCwgYW5kIGFueSBidWZmZXIgdGhhdCBhcHBlYXJzIHRvIGJlCisgKiB1cC10by1kYXRlIHdoZW4gZG9pbmcgcmVhZCByZXF1ZXN0LiAgRnVydGhlciBpdCBtYXJrcyBhcyBjbGVhbiBidWZmZXJzIHRoYXQKKyAqIGFyZSBwcm9jZXNzZWQgZm9yIHdyaXRpbmcgKHRoZSBidWZmZXIgY2FjaGUgd29uJ3QgYXNzdW1lIHRoYXQgdGhleSBhcmUKKyAqIGFjdHVhbGx5IGNsZWFuIHVudGlsIHRoZSBidWZmZXIgZ2V0cyB1bmxvY2tlZCkuCiAgKgogICogbGxfcndfYmxvY2sgc2V0cyBiX2VuZF9pbyB0byBzaW1wbGUgY29tcGxldGlvbiBoYW5kbGVyIHRoYXQgbWFya3MKICAqIHRoZSBidWZmZXIgdXAtdG8tZGF0ZSAoaWYgYXBwcm9yaWF0ZSksIHVubG9ja3MgdGhlIGJ1ZmZlciBhbmQgd2FrZXMKQEAgLTI4MjMsMTEgKzI4MjQsMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgewogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gYmhzW2ldOwogCi0JCWlmICh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKGJoKSkKKwkJaWYgKHJ3ID09IFNXUklURSkKKwkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJZWxzZSBpZiAodGVzdF9zZXRfYnVmZmVyX2xvY2tlZChiaCkpCiAJCQljb250aW51ZTsKIAogCQlnZXRfYmgoYmgpOwotCQlpZiAocncgPT0gV1JJVEUpIHsKKwkJaWYgKHJ3ID09IFdSSVRFIHx8IHJ3ID09IFNXUklURSkgewogCQkJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSkgewogCQkJCWJoLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfd3JpdGVfc3luYzsKIAkJCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKQEAgLTMwNDYsMTAgKzMwNDksOSBAQAogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhiaF9jYWNoZXAsIGdmcF9mbGFncyk7CiAJaWYgKHJldCkgewotCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJX19nZXRfY3B1X3ZhcihiaF9hY2NvdW50aW5nKS5ucisrOworCQlnZXRfY3B1X3ZhcihiaF9hY2NvdW50aW5nKS5ucisrOwogCQlyZWNhbGNfYmhfc3RhdGUoKTsKLQkJcHJlZW1wdF9lbmFibGUoKTsKKwkJcHV0X2NwdV92YXIoYmhfYWNjb3VudGluZyk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0zMDU5LDEwICszMDYxLDkgQEAKIHsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpKTsKIAlrbWVtX2NhY2hlX2ZyZWUoYmhfY2FjaGVwLCBiaCk7Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JX19nZXRfY3B1X3ZhcihiaF9hY2NvdW50aW5nKS5uci0tOworCWdldF9jcHVfdmFyKGJoX2FjY291bnRpbmcpLm5yLS07CiAJcmVjYWxjX2JoX3N0YXRlKCk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKKwlwdXRfY3B1X3ZhcihiaF9hY2NvdW50aW5nKTsKIH0KIEVYUE9SVF9TWU1CT0woZnJlZV9idWZmZXJfaGVhZCk7CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY29ubmVjdC5jIGIvZnMvY2lmcy9jb25uZWN0LmMKaW5kZXggZTU2OGNjNC4uMjMzNWYxNCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jb25uZWN0LmMKKysrIGIvZnMvY2lmcy9jb25uZWN0LmMKQEAgLTgzNiw3ICs4MzYsNyBAQAogCQkJCS8qIGdvIGZyb20gdmFsdWUgdG8gdmFsdWUgKyB0ZW1wX2xlbiBjb25kZW5zaW5nIAogCQkJCWRvdWJsZSBjb21tYXMgdG8gc2luZ2xlcy4gTm90ZSB0aGF0IHRoaXMgZW5kcyB1cAogCQkJCWFsbG9jYXRpbmcgYSBmZXcgYnl0ZXMgdG9vIG1hbnksIHdoaWNoIGlzIG9rICovCi0JCQkJdm9sLT5wYXNzd29yZCA9IGtjYWxsb2MoMSwgdGVtcF9sZW4sIEdGUF9LRVJORUwpOworCQkJCXZvbC0+cGFzc3dvcmQgPSBremFsbG9jKHRlbXBfbGVuLCBHRlBfS0VSTkVMKTsKIAkJCQlpZih2b2wtPnBhc3N3b3JkID09IE5VTEwpIHsKIAkJCQkJcHJpbnRrKCJDSUZTOiBubyBtZW1vcnkgZm9yIHBhc3NcbiIpOwogCQkJCQlyZXR1cm4gMTsKQEAgLTg1MSw3ICs4NTEsNyBAQAogCQkJCX0KIAkJCQl2b2wtPnBhc3N3b3JkW2pdID0gMDsKIAkJCX0gZWxzZSB7Ci0JCQkJdm9sLT5wYXNzd29yZCA9IGtjYWxsb2MoMSwgdGVtcF9sZW4rMSwgR0ZQX0tFUk5FTCk7CisJCQkJdm9sLT5wYXNzd29yZCA9IGt6YWxsb2ModGVtcF9sZW4rMSwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYodm9sLT5wYXNzd29yZCA9PSBOVUxMKSB7CiAJCQkJCXByaW50aygiQ0lGUzogbm8gbWVtb3J5IGZvciBwYXNzXG4iKTsKIAkJCQkJcmV0dXJuIDE7CkBAIC0xMzE3LDcgKzEzMTcsNyBAQAogCQlzZXNzaW5pdCBpcyBzZW50IGJ1dCBubyBzZWNvbmQgbmVncHJvdCAqLwogCQlzdHJ1Y3QgcmZjMTAwMl9zZXNzaW9uX3BhY2tldCAqIHNlc19pbml0X2J1ZjsKIAkJc3RydWN0IHNtYl9oZHIgKiBzbWJfYnVmOwotCQlzZXNfaW5pdF9idWYgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcmZjMTAwMl9zZXNzaW9uX3BhY2tldCksIEdGUF9LRVJORUwpOworCQlzZXNfaW5pdF9idWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmZjMTAwMl9zZXNzaW9uX3BhY2tldCksIEdGUF9LRVJORUwpOwogCQlpZihzZXNfaW5pdF9idWYpIHsKIAkJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5jYWxsZWRfbGVuID0gMzI7CiAJCQlyZmMxMDAybWFuZ2xlKHNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5jYWxsZWRfbmFtZSwKQEAgLTE5NjQsNyArMTk2NCw3IEBACiAvKiBXZSBsb29rIGZvciBvYnZpb3VzIG1lc3NlZCB1cCBiY2Mgb3Igc3RyaW5ncyBpbiByZXNwb25zZSBzbyB3ZSBkbyBub3QgZ28gb2ZmCiAgICB0aGUgZW5kIHNpbmNlIChhdCBsZWFzdCkgV0lOMksgYW5kIFdpbmRvd3MgWFAgaGF2ZSBhIG1ham9yIGJ1ZyBpbiBub3QgbnVsbAogICAgdGVybWluYXRpbmcgbGFzdCBVbmljb2RlIHN0cmluZyBpbiByZXNwb25zZSAgKi8KLQkJCQlzZXMtPnNlcnZlck9TID0ga2NhbGxvYygxLCAyICogKGxlbiArIDEpLCBHRlBfS0VSTkVMKTsKKwkJCQlzZXMtPnNlcnZlck9TID0ga3phbGxvYygyICogKGxlbiArIDEpLCBHRlBfS0VSTkVMKTsKIAkJCQlpZihzZXMtPnNlcnZlck9TID09IE5VTEwpCiAJCQkJCWdvdG8gc2Vzc3NldHVwX25vbWVtOwogCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPnNlcnZlck9TLApAQCAtMTk3Niw3ICsxOTc2LDcgQEAKIAkJCQlpZiAocmVtYWluaW5nX3dvcmRzID4gMCkgewogCQkJCQlsZW4gPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopYmNjX3B0ciwKIAkJCQkJCQkgcmVtYWluaW5nX3dvcmRzLTEpOwotCQkJCQlzZXMtPnNlcnZlck5PUyA9IGtjYWxsb2MoMSwgMiAqIChsZW4gKyAxKSxHRlBfS0VSTkVMKTsKKwkJCQkJc2VzLT5zZXJ2ZXJOT1MgPSBremFsbG9jKDIgKiAobGVuICsgMSksR0ZQX0tFUk5FTCk7CiAJCQkJCWlmKHNlcy0+c2VydmVyTk9TID09IE5VTEwpCiAJCQkJCQlnb3RvIHNlc3NzZXR1cF9ub21lbTsKIAkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHNlcy0+c2VydmVyTk9TLApAQCAtMTk5NCw3ICsxOTk0LDcgQEAKIAkJCQkJCWxlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikgYmNjX3B0ciwgcmVtYWluaW5nX3dvcmRzKTsKICAgICAgICAgICAvKiBsYXN0IHN0cmluZyBpcyBub3QgYWx3YXlzIG51bGwgdGVybWluYXRlZCAoZm9yIGUuZy4gZm9yIFdpbmRvd3MgWFAgJiAyMDAwKSAqLwogCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQotCQkJCQkJICAgIGtjYWxsb2MoMSwgMioobGVuKzEpLEdGUF9LRVJORUwpOworCQkJCQkJICAgIGt6YWxsb2MoMioobGVuKzEpLEdGUF9LRVJORUwpOwogCQkJCQkJaWYoc2VzLT5zZXJ2ZXJEb21haW4gPT0gTlVMTCkKIAkJCQkJCQlnb3RvIHNlc3NzZXR1cF9ub21lbTsKIAkJCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPnNlcnZlckRvbWFpbiwKQEAgLTIwMDUsMjIgKzIwMDUsMjIgQEAKIAkJCQkJfSAvKiBlbHNlIG5vIG1vcmUgcm9vbSBzbyBjcmVhdGUgZHVtbXkgZG9tYWluIHN0cmluZyAqLwogCQkJCQllbHNlCiAJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IAotCQkJCQkJCWtjYWxsb2MoMSwgMiwgR0ZQX0tFUk5FTCk7CisJCQkJCQkJa3phbGxvYygyLCBHRlBfS0VSTkVMKTsKIAkJCQl9IGVsc2UgewkvKiBubyByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gYW5kIE5PUyBzdHJpbmcgKi8KIAkJCQkJLyogaWYgdGhlc2Uga2NhbGxvY3MgZmFpbCBub3QgbXVjaCB3ZQogCQkJCQkgICBjYW4gZG8sIGJ1dCBiZXR0ZXIgdG8gbm90IGZhaWwgdGhlCiAJCQkJCSAgIHNlc3NzZXR1cCBpdHNlbGYgKi8KIAkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQotCQkJCQkgICAga2NhbGxvYygxLCAyLCBHRlBfS0VSTkVMKTsKKwkJCQkJICAgIGt6YWxsb2MoMiwgR0ZQX0tFUk5FTCk7CiAJCQkJCXNlcy0+c2VydmVyTk9TID0KLQkJCQkJICAgIGtjYWxsb2MoMSwgMiwgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICBremFsbG9jKDIsIEdGUF9LRVJORUwpOwogCQkJCX0KIAkJCX0gZWxzZSB7CS8qIEFTQ0lJICovCiAJCQkJbGVuID0gc3RybmxlbihiY2NfcHRyLCAxMDI0KTsKIAkJCQlpZiAoKChsb25nKSBiY2NfcHRyICsgbGVuKSAtIChsb25nKQogCQkJCSAgICBwQnl0ZUFyZWEoc21iX2J1ZmZlcl9yZXNwb25zZSkKIAkJCQkJICAgIDw9IEJDQyhzbWJfYnVmZmVyX3Jlc3BvbnNlKSkgewotCQkJCQlzZXMtPnNlcnZlck9TID0ga2NhbGxvYygxLCBsZW4gKyAxLEdGUF9LRVJORUwpOworCQkJCQlzZXMtPnNlcnZlck9TID0ga3phbGxvYyhsZW4gKyAxLEdGUF9LRVJORUwpOwogCQkJCQlpZihzZXMtPnNlcnZlck9TID09IE5VTEwpCiAJCQkJCQlnb3RvIHNlc3NzZXR1cF9ub21lbTsKIAkJCQkJc3RybmNweShzZXMtPnNlcnZlck9TLGJjY19wdHIsIGxlbik7CkBAIC0yMDMwLDcgKzIwMzAsNyBAQAogCQkJCQliY2NfcHRyKys7CiAKIAkJCQkJbGVuID0gc3RybmxlbihiY2NfcHRyLCAxMDI0KTsKLQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPSBrY2FsbG9jKDEsIGxlbiArIDEsR0ZQX0tFUk5FTCk7CisJCQkJCXNlcy0+c2VydmVyTk9TID0ga3phbGxvYyhsZW4gKyAxLEdGUF9LRVJORUwpOwogCQkJCQlpZihzZXMtPnNlcnZlck5PUyA9PSBOVUxMKQogCQkJCQkJZ290byBzZXNzc2V0dXBfbm9tZW07CiAJCQkJCXN0cm5jcHkoc2VzLT5zZXJ2ZXJOT1MsIGJjY19wdHIsIGxlbik7CkBAIC0yMDM5LDcgKzIwMzksNyBAQAogCQkJCQliY2NfcHRyKys7CiAKIAkJCQkJbGVuID0gc3RybmxlbihiY2NfcHRyLCAxMDI0KTsKLQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBrY2FsbG9jKDEsIGxlbiArIDEsR0ZQX0tFUk5FTCk7CisJCQkJCXNlcy0+c2VydmVyRG9tYWluID0ga3phbGxvYyhsZW4gKyAxLEdGUF9LRVJORUwpOwogCQkJCQlpZihzZXMtPnNlcnZlckRvbWFpbiA9PSBOVUxMKQogCQkJCQkJZ290byBzZXNzc2V0dXBfbm9tZW07CiAJCQkJCXN0cm5jcHkoc2VzLT5zZXJ2ZXJEb21haW4sIGJjY19wdHIsIGxlbik7CkBAIC0yMjQwLDcgKzIyNDAsNyBAQAogICAgdGhlIGVuZCBzaW5jZSAoYXQgbGVhc3QpIFdJTjJLIGFuZCBXaW5kb3dzIFhQIGhhdmUgYSBtYWpvciBidWcgaW4gbm90IG51bGwKICAgIHRlcm1pbmF0aW5nIGxhc3QgVW5pY29kZSBzdHJpbmcgaW4gcmVzcG9uc2UgICovCiAJCQkJCXNlcy0+c2VydmVyT1MgPQotCQkJCQkgICAga2NhbGxvYygxLCAyICogKGxlbiArIDEpLCBHRlBfS0VSTkVMKTsKKwkJCQkJICAgIGt6YWxsb2MoMiAqIChsZW4gKyAxKSwgR0ZQX0tFUk5FTCk7CiAJCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPnNlcnZlck9TLAogCQkJCQkJCSAgICh3Y2hhcl90ICopCiAJCQkJCQkJICAgYmNjX3B0ciwgbGVuLApAQCAtMjI1NCw3ICsyMjU0LDcgQEAKIAkJCQkJCQkJIHJlbWFpbmluZ193b3JkcwogCQkJCQkJCQkgLSAxKTsKIAkJCQkJCXNlcy0+c2VydmVyTk9TID0KLQkJCQkJCSAgICBrY2FsbG9jKDEsIDIgKiAobGVuICsgMSksCisJCQkJCQkgICAga3phbGxvYygyICogKGxlbiArIDEpLAogCQkJCQkJCSAgICBHRlBfS0VSTkVMKTsKIAkJCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPnNlcnZlck5PUywKIAkJCQkJCQkJICAgKHdjaGFyX3QgKiliY2NfcHRyLApAQCAtMjI2Nyw3ICsyMjY3LDcgQEAKIAkJCQkJCWlmIChyZW1haW5pbmdfd29yZHMgPiAwKSB7CiAJCQkJCQkJbGVuID0gVW5pU3Rybmxlbigod2NoYXJfdCAqKSBiY2NfcHRyLCByZW1haW5pbmdfd29yZHMpOwkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsYXN0IHN0cmluZyBpcyBub3QgYWx3YXlzIG51bGwgdGVybWluYXRlZCAoZm9yIGUuZy4gZm9yIFdpbmRvd3MgWFAgJiAyMDAwKSAqLwotCQkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0ga2NhbGxvYygxLCAyKihsZW4rMSksR0ZQX0tFUk5FTCk7CisJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBremFsbG9jKDIqKGxlbisxKSxHRlBfS0VSTkVMKTsKIAkJCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT5zZXJ2ZXJEb21haW4sCiAJCQkJCQkJICAgICAod2NoYXJfdCAqKWJjY19wdHIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLApAQCAtMjI3OCwxMCArMjI3OCwxMCBAQAogCQkJCQkJfSAvKiBlbHNlIG5vIG1vcmUgcm9vbSBzbyBjcmVhdGUgZHVtbXkgZG9tYWluIHN0cmluZyAqLwogCQkJCQkJZWxzZQogCQkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0KLQkJCQkJCQkgICAga2NhbGxvYygxLCAyLEdGUF9LRVJORUwpOworCQkJCQkJCSAgICBremFsbG9jKDIsR0ZQX0tFUk5FTCk7CiAJCQkJCX0gZWxzZSB7CS8qIG5vIHJvb20gc28gY3JlYXRlIGR1bW15IGRvbWFpbiBhbmQgTk9TIHN0cmluZyAqLwotCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBrY2FsbG9jKDEsIDIsIEdGUF9LRVJORUwpOwotCQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPSBrY2FsbG9jKDEsIDIsIEdGUF9LRVJORUwpOworCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBremFsbG9jKDIsIEdGUF9LRVJORUwpOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPSBremFsbG9jKDIsIEdGUF9LRVJORUwpOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsJLyogQVNDSUkgKi8KIApAQCAtMjI4OSw3ICsyMjg5LDcgQEAKIAkJCQkJaWYgKCgobG9uZykgYmNjX3B0ciArIGxlbikgLSAobG9uZykKIAkJCQkJICAgIHBCeXRlQXJlYShzbWJfYnVmZmVyX3Jlc3BvbnNlKQogCQkJCQkgICAgPD0gQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpKSB7Ci0JCQkJCQlzZXMtPnNlcnZlck9TID0ga2NhbGxvYygxLCBsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJCQkJCXNlcy0+c2VydmVyT1MgPSBremFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwogCQkJCQkJc3RybmNweShzZXMtPnNlcnZlck9TLCBiY2NfcHRyLCBsZW4pOwogCiAJCQkJCQliY2NfcHRyICs9IGxlbjsKQEAgLTIyOTcsMTQgKzIyOTcsMTQgQEAKIAkJCQkJCWJjY19wdHIrKzsKIAogCQkJCQkJbGVuID0gc3RybmxlbihiY2NfcHRyLCAxMDI0KTsKLQkJCQkJCXNlcy0+c2VydmVyTk9TID0ga2NhbGxvYygxLCBsZW4gKyAxLEdGUF9LRVJORUwpOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPSBremFsbG9jKGxlbiArIDEsR0ZQX0tFUk5FTCk7CiAJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyTk9TLCBiY2NfcHRyLCBsZW4pOwogCQkJCQkJYmNjX3B0ciArPSBsZW47CiAJCQkJCQliY2NfcHRyWzBdID0gMDsKIAkJCQkJCWJjY19wdHIrKzsKIAogCQkJCQkJbGVuID0gc3RybmxlbihiY2NfcHRyLCAxMDI0KTsKLQkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0ga2NhbGxvYygxLCBsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0ga3phbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAkJCQkJCXN0cm5jcHkoc2VzLT5zZXJ2ZXJEb21haW4sIGJjY19wdHIsIGxlbik7CiAJCQkJCQliY2NfcHRyICs9IGxlbjsKIAkJCQkJCWJjY19wdHJbMF0gPSAwOwpAQCAtMjU1NCw3ICsyNTU0LDcgQEAKICAgIHRoZSBlbmQgc2luY2UgKGF0IGxlYXN0KSBXSU4ySyBhbmQgV2luZG93cyBYUCBoYXZlIGEgbWFqb3IgYnVnIGluIG5vdCBudWxsCiAgICB0ZXJtaW5hdGluZyBsYXN0IFVuaWNvZGUgc3RyaW5nIGluIHJlc3BvbnNlICAqLwogCQkJCQlzZXMtPnNlcnZlck9TID0KLQkJCQkJICAgIGtjYWxsb2MoMSwgMiAqIChsZW4gKyAxKSwgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICBremFsbG9jKDIgKiAobGVuICsgMSksIEdGUF9LRVJORUwpOwogCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT5zZXJ2ZXJPUywKIAkJCQkJCQkgICAod2NoYXJfdCAqKQogCQkJCQkJCSAgIGJjY19wdHIsIGxlbiwKQEAgLTI1NjksNyArMjU2OSw3IEBACiAJCQkJCQkJCSByZW1haW5pbmdfd29yZHMKIAkJCQkJCQkJIC0gMSk7CiAJCQkJCQlzZXMtPnNlcnZlck5PUyA9Ci0JCQkJCQkgICAga2NhbGxvYygxLCAyICogKGxlbiArIDEpLAorCQkJCQkJICAgIGt6YWxsb2MoMiAqIChsZW4gKyAxKSwKIAkJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT4KIAkJCQkJCQkJICAgc2VydmVyTk9TLApAQCAtMjU4Niw3ICsyNTg2LDcgQEAKIAkJCQkJCQlsZW4gPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopIGJjY19wdHIsIHJlbWFpbmluZ193b3Jkcyk7CQogICAgICAgICAgICAvKiBsYXN0IHN0cmluZyBpcyBub3QgYWx3YXlzIG51bGwgdGVybWluYXRlZCAoZm9yIGUuZy4gZm9yIFdpbmRvd3MgWFAgJiAyMDAwKSAqLwogCQkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0KLQkJCQkJCQkgICAga2NhbGxvYygxLCAyICoKKwkJCQkJCQkgICAga3phbGxvYygyICoKIAkJCQkJCQkJICAgIChsZW4gKwogCQkJCQkJCQkgICAgIDEpLAogCQkJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CkBAIC0yNjEyLDEzICsyNjEyLDEzIEBACiAJCQkJCQl9IC8qIGVsc2Ugbm8gbW9yZSByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gc3RyaW5nICovCiAJCQkJCQllbHNlCiAJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQotCQkJCQkJCSAgICBrY2FsbG9jKDEsIDIsCisJCQkJCQkJICAgIGt6YWxsb2MoMiwKIAkJCQkJCQkJICAgIEdGUF9LRVJORUwpOwogCQkJCQl9IGVsc2UgewkvKiBubyByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gYW5kIE5PUyBzdHJpbmcgKi8KIAkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0KLQkJCQkJCSAgICBrY2FsbG9jKDEsIDIsIEdGUF9LRVJORUwpOworCQkJCQkJICAgIGt6YWxsb2MoMiwgR0ZQX0tFUk5FTCk7CiAJCQkJCQlzZXMtPnNlcnZlck5PUyA9Ci0JCQkJCQkgICAga2NhbGxvYygxLCAyLCBHRlBfS0VSTkVMKTsKKwkJCQkJCSAgICBremFsbG9jKDIsIEdGUF9LRVJORUwpOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsJLyogQVNDSUkgKi8KIAkJCQkJbGVuID0gc3RybmxlbihiY2NfcHRyLCAxMDI0KTsKQEAgLTI2MjYsNyArMjYyNiw3IEBACiAJCQkJCSAgICBwQnl0ZUFyZWEoc21iX2J1ZmZlcl9yZXNwb25zZSkKIAkJCQkJICAgIDw9IEJDQyhzbWJfYnVmZmVyX3Jlc3BvbnNlKSkgewogCQkJCQkJc2VzLT5zZXJ2ZXJPUyA9Ci0JCQkJCQkgICAga2NhbGxvYygxLCBsZW4gKyAxLAorCQkJCQkJICAgIGt6YWxsb2MobGVuICsgMSwKIAkJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyT1MsCiAJCQkJCQkJYmNjX3B0ciwgbGVuKTsKQEAgLTI2MzcsNyArMjYzNyw3IEBACiAKIAkJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CiAJCQkJCQlzZXMtPnNlcnZlck5PUyA9Ci0JCQkJCQkgICAga2NhbGxvYygxLCBsZW4gKyAxLAorCQkJCQkJICAgIGt6YWxsb2MobGVuICsgMSwKIAkJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyTk9TLCBiY2NfcHRyLCBsZW4pOwogCQkJCQkJYmNjX3B0ciArPSBsZW47CkBAIC0yNjQ2LDcgKzI2NDYsNyBAQAogCiAJCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOwogCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQotCQkJCQkJICAgIGtjYWxsb2MoMSwgbGVuICsgMSwKKwkJCQkJCSAgICBremFsbG9jKGxlbiArIDEsCiAJCQkJCQkJICAgIEdGUF9LRVJORUwpOwogCQkJCQkJc3RybmNweShzZXMtPnNlcnZlckRvbWFpbiwgYmNjX3B0ciwgbGVuKTsJCiAJCQkJCQliY2NfcHRyICs9IGxlbjsKQEAgLTI5NDgsNyArMjk0OCw3IEBACiAgIHRoZSBlbmQgc2luY2UgKGF0IGxlYXN0KSBXSU4ySyBhbmQgV2luZG93cyBYUCBoYXZlIGEgbWFqb3IgYnVnIGluIG5vdCBudWxsCiAgIHRlcm1pbmF0aW5nIGxhc3QgVW5pY29kZSBzdHJpbmcgaW4gcmVzcG9uc2UgICovCiAJCQkJCXNlcy0+c2VydmVyT1MgPQotCQkJCQkgICAga2NhbGxvYygxLCAyICogKGxlbiArIDEpLCBHRlBfS0VSTkVMKTsKKwkJCQkJICAgIGt6YWxsb2MoMiAqIChsZW4gKyAxKSwgR0ZQX0tFUk5FTCk7CiAJCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPnNlcnZlck9TLAogCQkJCQkJCSAgICh3Y2hhcl90ICopCiAJCQkJCQkJICAgYmNjX3B0ciwgbGVuLApAQCAtMjk2Myw3ICsyOTYzLDcgQEAKIAkJCQkJCQkJIHJlbWFpbmluZ193b3JkcwogCQkJCQkJCQkgLSAxKTsKIAkJCQkJCXNlcy0+c2VydmVyTk9TID0KLQkJCQkJCSAgICBrY2FsbG9jKDEsIDIgKiAobGVuICsgMSksCisJCQkJCQkgICAga3phbGxvYygyICogKGxlbiArIDEpLAogCQkJCQkJCSAgICBHRlBfS0VSTkVMKTsKIAkJCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPgogCQkJCQkJCQkgICBzZXJ2ZXJOT1MsCkBAIC0yOTc5LDcgKzI5NzksNyBAQAogCQkJCQkJCWxlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikgYmNjX3B0ciwgcmVtYWluaW5nX3dvcmRzKTsJCiAgICAgIC8qIGxhc3Qgc3RyaW5nIG5vdCBhbHdheXMgbnVsbCB0ZXJtaW5hdGVkIChlLmcuIGZvciBXaW5kb3dzIFhQICYgMjAwMCkgKi8KIAkJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9Ci0JCQkJCQkJICAgIGtjYWxsb2MoMSwgMiAqCisJCQkJCQkJICAgIGt6YWxsb2MoMiAqCiAJCQkJCQkJCSAgICAobGVuICsKIAkJCQkJCQkJICAgICAxKSwKIAkJCQkJCQkJICAgIEdGUF9LRVJORUwpOwpAQCAtMzAwNCwxNyArMzAwNCwxNyBAQAogCQkJCQkJCSAgICA9IDA7CiAJCQkJCQl9IC8qIGVsc2Ugbm8gbW9yZSByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gc3RyaW5nICovCiAJCQkJCQllbHNlCi0JCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBrY2FsbG9jKDEsIDIsR0ZQX0tFUk5FTCk7CisJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBremFsbG9jKDIsR0ZQX0tFUk5FTCk7CiAJCQkJCX0gZWxzZSB7ICAvKiBubyByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gYW5kIE5PUyBzdHJpbmcgKi8KLQkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0ga2NhbGxvYygxLCAyLCBHRlBfS0VSTkVMKTsKLQkJCQkJCXNlcy0+c2VydmVyTk9TID0ga2NhbGxvYygxLCAyLCBHRlBfS0VSTkVMKTsKKwkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0ga3phbGxvYygyLCBHRlBfS0VSTkVMKTsKKwkJCQkJCXNlcy0+c2VydmVyTk9TID0ga3phbGxvYygyLCBHRlBfS0VSTkVMKTsKIAkJCQkJfQogCQkJCX0gZWxzZSB7CS8qIEFTQ0lJICovCiAJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CiAJCQkJCWlmICgoKGxvbmcpIGJjY19wdHIgKyBsZW4pIC0gCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IEJDQyhzbWJfYnVmZmVyX3Jlc3BvbnNlKSkgewotCQkJCQkJc2VzLT5zZXJ2ZXJPUyA9IGtjYWxsb2MoMSwgbGVuICsgMSxHRlBfS0VSTkVMKTsKKwkJCQkJCXNlcy0+c2VydmVyT1MgPSBremFsbG9jKGxlbiArIDEsR0ZQX0tFUk5FTCk7CiAJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyT1MsYmNjX3B0ciwgbGVuKTsKIAogCQkJCQkJYmNjX3B0ciArPSBsZW47CkBAIC0zMDIyLDE0ICszMDIyLDE0IEBACiAJCQkJCQliY2NfcHRyKys7CiAKIAkJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7Ci0JCQkJCQlzZXMtPnNlcnZlck5PUyA9IGtjYWxsb2MoMSwgbGVuKzEsR0ZQX0tFUk5FTCk7CisJCQkJCQlzZXMtPnNlcnZlck5PUyA9IGt6YWxsb2MobGVuKzEsR0ZQX0tFUk5FTCk7CiAJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyTk9TLCBiY2NfcHRyLCBsZW4pOwkKIAkJCQkJCWJjY19wdHIgKz0gbGVuOwogCQkJCQkJYmNjX3B0clswXSA9IDA7CiAJCQkJCQliY2NfcHRyKys7CiAKIAkJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7Ci0JCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IGtjYWxsb2MoMSwgbGVuKzEsR0ZQX0tFUk5FTCk7CisJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IGt6YWxsb2MobGVuKzEsR0ZQX0tFUk5FTCk7CiAJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyRG9tYWluLCBiY2NfcHRyLCBsZW4pOwogCQkJCQkJYmNjX3B0ciArPSBsZW47CiAJCQkJCQliY2NfcHRyWzBdID0gMDsKQEAgLTMxNDEsNyArMzE0MSw3IEBACiAJCQkJaWYodGNvbi0+bmF0aXZlRmlsZVN5c3RlbSkKIAkJCQkJa2ZyZWUodGNvbi0+bmF0aXZlRmlsZVN5c3RlbSk7CiAJCQkJdGNvbi0+bmF0aXZlRmlsZVN5c3RlbSA9Ci0JCQkJICAgIGtjYWxsb2MoMSwgbGVuZ3RoICsgMiwgR0ZQX0tFUk5FTCk7CisJCQkJICAgIGt6YWxsb2MobGVuZ3RoICsgMiwgR0ZQX0tFUk5FTCk7CiAJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHRjb24tPm5hdGl2ZUZpbGVTeXN0ZW0sCiAJCQkJCQkgICAod2NoYXJfdCAqKSBiY2NfcHRyLAogCQkJCQkJICAgbGVuZ3RoLCBubHNfY29kZXBhZ2UpOwpAQCAtMzE1OSw3ICszMTU5LDcgQEAKIAkJCQlpZih0Y29uLT5uYXRpdmVGaWxlU3lzdGVtKQogCQkJCQlrZnJlZSh0Y29uLT5uYXRpdmVGaWxlU3lzdGVtKTsKIAkJCQl0Y29uLT5uYXRpdmVGaWxlU3lzdGVtID0KLQkJCQkgICAga2NhbGxvYygxLCBsZW5ndGggKyAxLCBHRlBfS0VSTkVMKTsKKwkJCQkgICAga3phbGxvYyhsZW5ndGggKyAxLCBHRlBfS0VSTkVMKTsKIAkJCQlzdHJuY3B5KHRjb24tPm5hdGl2ZUZpbGVTeXN0ZW0sIGJjY19wdHIsCiAJCQkJCWxlbmd0aCk7CiAJCQl9CkBAIC0zMjE1LDEwICszMjE1LDggQEAKIAl9CiAJCiAJY2lmc19zYi0+dGNvbiA9IE5VTEw7Ci0JaWYgKHNlcykgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KEhaIC8gMik7Ci0JfQorCWlmIChzZXMpCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKDUwMCkpOwogCWlmIChzZXMpCiAJCXNlc0luZm9GcmVlKHNlcyk7CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZGlyLmMgYi9mcy9jaWZzL2Rpci5jCmluZGV4IDNmMzUzOGQuLmQzMzUyNjkgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZGlyLmMKKysrIGIvZnMvY2lmcy9kaXIuYwpAQCAtMTQ1LDI0ICsxNDUsMjMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaWYobmQpIHsKLQkJaWYgKChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKQotCQkJZGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfUkVBRDsKLQkJZWxzZSBpZiAoKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19XUk9OTFkpIHsKLQkJCWRlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1dSSVRFOwotCQkJd3JpdGVfb25seSA9IFRSVUU7Ci0JCX0gZWxzZSBpZiAoKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRFdSKSB7Ci0JCQkvKiBHRU5FUklDX0FMTCBpcyB0b28gbXVjaCBwZXJtaXNzaW9uIHRvIHJlcXVlc3QgKi8KLQkJCS8qIGNhbiBjYXVzZSB1bm5lY2Vzc2FyeSBhY2Nlc3MgZGVuaWVkIG9uIGNyZWF0ZSAqLwotCQkJLyogZGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfQUxMOyAqLwotCQkJZGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEU7CisJaWYobmQgJiYgKG5kLT5mbGFncyAmIExPT0tVUF9PUEVOKSkgeworCQlpbnQgb2ZsYWdzID0gbmQtPmludGVudC5vcGVuLmZsYWdzOworCisJCWRlc2lyZWRBY2Nlc3MgPSAwOworCQlpZiAob2ZsYWdzICYgRk1PREVfUkVBRCkKKwkJCWRlc2lyZWRBY2Nlc3MgfD0gR0VORVJJQ19SRUFEOworCQlpZiAob2ZsYWdzICYgRk1PREVfV1JJVEUpIHsKKwkJCWRlc2lyZWRBY2Nlc3MgfD0gR0VORVJJQ19XUklURTsKKwkJCWlmICghKG9mbGFncyAmIEZNT0RFX1JFQUQpKQorCQkJCXdyaXRlX29ubHkgPSBUUlVFOwogCQl9CiAKLQkJaWYoKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIChPX0NSRUFUIHwgT19FWENMKSkgPT0gKE9fQ1JFQVQgfCBPX0VYQ0wpKQorCQlpZigob2ZsYWdzICYgKE9fQ1JFQVQgfCBPX0VYQ0wpKSA9PSAoT19DUkVBVCB8IE9fRVhDTCkpCiAJCQlkaXNwb3NpdGlvbiA9IEZJTEVfQ1JFQVRFOwotCQllbHNlIGlmKChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiAoT19DUkVBVCB8IE9fVFJVTkMpKSA9PSAoT19DUkVBVCB8IE9fVFJVTkMpKQorCQllbHNlIGlmKChvZmxhZ3MgJiAoT19DUkVBVCB8IE9fVFJVTkMpKSA9PSAoT19DUkVBVCB8IE9fVFJVTkMpKQogCQkJZGlzcG9zaXRpb24gPSBGSUxFX09WRVJXUklURV9JRjsKLQkJZWxzZSBpZigobmQtPmludGVudC5vcGVuLmZsYWdzICYgT19DUkVBVCkgPT0gT19DUkVBVCkKKwkJZWxzZSBpZigob2ZsYWdzICYgT19DUkVBVCkgPT0gT19DUkVBVCkKIAkJCWRpc3Bvc2l0aW9uID0gRklMRV9PUEVOX0lGOwogCQllbHNlIHsKIAkJCWNGWUkoMSwoIkNyZWF0ZSBmbGFnIG5vdCBzZXQgaW4gY3JlYXRlIGZ1bmN0aW9uIikpOwpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0LmMgYi9mcy9jb21wYXQuYwppbmRleCA2YjA2YjZiLi5hYzNmYjllIDEwMDY0NAotLS0gYS9mcy9jb21wYXQuYworKysgYi9mcy9jb21wYXQuYwpAQCAtMzEwLDk2ICszMTAsNiBAQAogCiBfX2luaXRjYWxsKGluaXRfc3lzMzJfaW9jdGwpOwogCi1pbnQgcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKHVuc2lnbmVkIGludCBjbWQsCi0JCQkJaW9jdGxfdHJhbnNfaGFuZGxlcl90IGhhbmRsZXIpCi17Ci0Jc3RydWN0IGlvY3RsX3RyYW5zICp0OwotCXN0cnVjdCBpb2N0bF90cmFucyAqbmV3X3Q7Ci0JdW5zaWduZWQgbG9uZyBoYXNoID0gaW9jdGwzMl9oYXNoKGNtZCk7Ci0KLQluZXdfdCA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfdCksIEdGUF9LRVJORUwpOwotCWlmICghbmV3X3QpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZG93bl93cml0ZSgmaW9jdGwzMl9zZW0pOwotCWZvciAodCA9IGlvY3RsMzJfaGFzaF90YWJsZVtoYXNoXTsgdDsgdCA9IHQtPm5leHQpIHsKLQkJaWYgKHQtPmNtZCA9PSBjbWQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVHJ5aW5nIHRvIHJlZ2lzdGVyIGR1cGxpY2F0ZWQgaW9jdGwzMiAiCi0JCQkJCSJoYW5kbGVyICV4XG4iLCBjbWQpOwotCQkJdXBfd3JpdGUoJmlvY3RsMzJfc2VtKTsKLQkJCWtmcmVlKG5ld190KTsKLQkJCXJldHVybiAtRUlOVkFMOyAKLQkJfQotCX0KLQluZXdfdC0+bmV4dCA9IE5VTEw7Ci0JbmV3X3QtPmNtZCA9IGNtZDsKLQluZXdfdC0+aGFuZGxlciA9IGhhbmRsZXI7Ci0JaW9jdGwzMl9pbnNlcnRfdHJhbnNsYXRpb24obmV3X3QpOwotCi0JdXBfd3JpdGUoJmlvY3RsMzJfc2VtKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKTsKLQotc3RhdGljIGlubGluZSBpbnQgYnVpbHRpbl9pb2N0bChzdHJ1Y3QgaW9jdGxfdHJhbnMgKnQpCi17IAotCXJldHVybiB0ID49IGlvY3RsX3N0YXJ0ICYmIHQgPCAoaW9jdGxfc3RhcnQgKyBpb2N0bF90YWJsZV9zaXplKTsKLX0gCi0KLS8qIFByb2JsZW06IAotICAgVGhpcyBmdW5jdGlvbiBjYW5ub3QgdW5yZWdpc3RlciBkdXBsaWNhdGUgaW9jdGxzLCBiZWNhdXNlIHRoZXkgYXJlIG5vdAotICAgdW5pcXVlLgotICAgV2hlbiB0aGV5IGhhcHBlbiB3ZSBuZWVkIHRvIGV4dGVuZCB0aGUgcHJvdG90eXBlIHRvIHBhc3MgdGhlIGhhbmRsZXIgdG9vLiAqLwotCi1pbnQgdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24odW5zaWduZWQgaW50IGNtZCkKLXsKLQl1bnNpZ25lZCBsb25nIGhhc2ggPSBpb2N0bDMyX2hhc2goY21kKTsKLQlzdHJ1Y3QgaW9jdGxfdHJhbnMgKnQsICp0MTsKLQotCWRvd25fd3JpdGUoJmlvY3RsMzJfc2VtKTsKLQotCXQgPSBpb2N0bDMyX2hhc2hfdGFibGVbaGFzaF07Ci0JaWYgKCF0KSB7IAotCQl1cF93cml0ZSgmaW9jdGwzMl9zZW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9IAotCi0JaWYgKHQtPmNtZCA9PSBjbWQpIHsgCi0JCWlmIChidWlsdGluX2lvY3RsKHQpKSB7Ci0JCQlwcmludGsoIiVwIHRyaWVkIHRvIHVucmVnaXN0ZXIgYnVpbHRpbiBpb2N0bCAleFxuIiwKLQkJCSAgICAgICBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksIGNtZCk7Ci0JCX0gZWxzZSB7IAotCQkJaW9jdGwzMl9oYXNoX3RhYmxlW2hhc2hdID0gdC0+bmV4dDsKLQkJCXVwX3dyaXRlKCZpb2N0bDMyX3NlbSk7Ci0JCQlrZnJlZSh0KTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfSAKLQl3aGlsZSAodC0+bmV4dCkgewotCQl0MSA9IHQtPm5leHQ7Ci0JCWlmICh0MS0+Y21kID09IGNtZCkgeyAKLQkJCWlmIChidWlsdGluX2lvY3RsKHQxKSkgewotCQkJCXByaW50aygiJXAgdHJpZWQgdG8gdW5yZWdpc3RlciBidWlsdGluICIKLQkJCQkJImlvY3RsICV4XG4iLAotCQkJCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksIGNtZCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9IGVsc2UgeyAKLQkJCQl0LT5uZXh0ID0gdDEtPm5leHQ7Ci0JCQkJdXBfd3JpdGUoJmlvY3RsMzJfc2VtKTsKLQkJCQlrZnJlZSh0MSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJdCA9IHQxOwotCX0KLQlwcmludGsoS0VSTl9FUlIgIlRyeWluZyB0byBmcmVlIHVua25vd24gMzJiaXQgaW9jdGwgaGFuZGxlciAleFxuIiwKLQkJCQljbWQpOwotb3V0OgotCXVwX3dyaXRlKCZpb2N0bDMyX3NlbSk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci1FWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKTsgCi0KIHN0YXRpYyB2b2lkIGNvbXBhdF9pb2N0bF9lcnJvcihzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGZkLAogCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKQEAgLTcyMCwxNCArNjMwLDE0IEBACiBzdHJ1Y3QgY29tcGF0X25jcF9tb3VudF9kYXRhIHsKIAljb21wYXRfaW50X3QgdmVyc2lvbjsKIAljb21wYXRfdWludF90IG5jcF9mZDsKLQljb21wYXRfdWlkX3QgbW91bnRlZF91aWQ7CisJX19jb21wYXRfdWlkX3QgbW91bnRlZF91aWQ7CiAJY29tcGF0X3BpZF90IHdkb2dfcGlkOwogCXVuc2lnbmVkIGNoYXIgbW91bnRlZF92b2xbTkNQX1ZPTE5BTUVfTEVOICsgMV07CiAJY29tcGF0X3VpbnRfdCB0aW1lX291dDsKIAljb21wYXRfdWludF90IHJldHJ5X2NvdW50OwogCWNvbXBhdF91aW50X3QgZmxhZ3M7Ci0JY29tcGF0X3VpZF90IHVpZDsKLQljb21wYXRfZ2lkX3QgZ2lkOworCV9fY29tcGF0X3VpZF90IHVpZDsKKwlfX2NvbXBhdF9naWRfdCBnaWQ7CiAJY29tcGF0X21vZGVfdCBmaWxlX21vZGU7CiAJY29tcGF0X21vZGVfdCBkaXJfbW9kZTsKIH07CkBAIC03ODQsOSArNjk0LDkgQEAKIAogc3RydWN0IGNvbXBhdF9zbWJfbW91bnRfZGF0YSB7CiAJY29tcGF0X2ludF90IHZlcnNpb247Ci0JY29tcGF0X3VpZF90IG1vdW50ZWRfdWlkOwotCWNvbXBhdF91aWRfdCB1aWQ7Ci0JY29tcGF0X2dpZF90IGdpZDsKKwlfX2NvbXBhdF91aWRfdCBtb3VudGVkX3VpZDsKKwlfX2NvbXBhdF91aWRfdCB1aWQ7CisJX19jb21wYXRfZ2lkX3QgZ2lkOwogCWNvbXBhdF9tb2RlX3QgZmlsZV9tb2RlOwogCWNvbXBhdF9tb2RlX3QgZGlyX21vZGU7CiB9OwpAQCAtMTM2NSw2ICsxMjc1LDE2IEBACiB9CiAKIC8qCisgKiBFeGFjdGx5IGxpa2UgZnMvb3Blbi5jOnN5c19vcGVuKCksIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3Qgc2V0IHRoZQorICogT19MQVJHRUZJTEUgZmxhZy4KKyAqLworYXNtbGlua2FnZSBsb25nCitjb21wYXRfc3lzX29wZW4oY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQoreworCXJldHVybiBkb19zeXNfb3BlbihmaWxlbmFtZSwgZmxhZ3MsIG1vZGUpOworfQorCisvKgogICogY29tcGF0X2NvdW50KCkgY291bnRzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzL2VudmVsb3Blcy4gSXQgaXMgYmFzaWNhbGx5CiAgKiBhIGNvcHkgb2YgY291bnQoKSBmcm9tIGZzL2V4ZWMuYywgZXhjZXB0IHRoYXQgaXQgd29ya3Mgd2l0aCAzMiBiaXQgYXJndgogICogYW5kIGVudnAgcG9pbnRlcnMuCkBAIC0xNjk5LDYgKzE2MTksNyBAQAogCWNoYXIgKmJpdHM7CiAJbG9uZyB0aW1lb3V0OwogCWludCBzaXplLCBtYXhfZmRzZXQsIHJldCA9IC1FSU5WQUw7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAogCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKIAlpZiAodHZwKSB7CkBAIC0xNzI0LDcgKzE2NDUsMTAgQEAKIAkJZ290byBvdXRfbm9mZHM7CiAKIAkvKiBtYXhfZmRzZXQgY2FuIGluY3JlYXNlLCBzbyBncmFiIGl0IG9uY2UgdG8gYXZvaWQgcmFjZSAqLwotCW1heF9mZHNldCA9IGN1cnJlbnQtPmZpbGVzLT5tYXhfZmRzZXQ7CisJcmN1X3JlYWRfbG9jaygpOworCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOworCW1heF9mZHNldCA9IGZkdC0+bWF4X2Zkc2V0OworCXJjdV9yZWFkX3VubG9jaygpOwogCWlmIChuID4gbWF4X2Zkc2V0KQogCQluID0gbWF4X2Zkc2V0OwogCkBAIC0xODA4LDggKzE3MzIsOCBAQAogCWNvbXBhdF9kZXZfdAlleDMyX2RldjsKIAljb21wYXRfaW5vX3QJZXgzMl9pbm87CiAJY29tcGF0X2ludF90CWV4MzJfZmxhZ3M7Ci0JY29tcGF0X3VpZF90CWV4MzJfYW5vbl91aWQ7Ci0JY29tcGF0X2dpZF90CWV4MzJfYW5vbl9naWQ7CisJX19jb21wYXRfdWlkX3QJZXgzMl9hbm9uX3VpZDsKKwlfX2NvbXBhdF9naWRfdAlleDMyX2Fub25fZ2lkOwogfTsKIAogc3RydWN0IGNvbXBhdF9uZnNjdGxfZmRwYXJtIHsKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdF9pb2N0bC5jIGIvZnMvY29tcGF0X2lvY3RsLmMKaW5kZXggMTU1ZTYxMi4uZTI4YTc0MiAxMDA2NDQKLS0tIGEvZnMvY29tcGF0X2lvY3RsLmMKKysrIGIvZnMvY29tcGF0X2lvY3RsLmMKQEAgLTc5OCwxMyArNzk4LDE2IEBACiAJCXIgPSAodm9pZCAqKSAmcjQ7CiAJfQogCi0JaWYgKHJldCkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CiAKIAlzZXRfZnMgKEtFUk5FTF9EUyk7CiAJcmV0ID0gc3lzX2lvY3RsIChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgcik7CiAJc2V0X2ZzIChvbGRfZnMpOwogCitvdXQ6CiAJaWYgKG15c29jaykKIAkJc29ja2ZkX3B1dChteXNvY2spOwogCmRpZmYgLS1naXQgYS9mcy9jcmFtZnMvaW5vZGUuYyBiL2ZzL2NyYW1mcy9pbm9kZS5jCmluZGV4IDZjMjg1ZWZhLi43ZmU4NTQxNSAxMDA2NDQKLS0tIGEvZnMvY3JhbWZzL2lub2RlLmMKKysrIGIvZnMvY3JhbWZzL2lub2RlLmMKQEAgLTM5LDEyICszOSw0NyBAQAogI2RlZmluZSBDUkFNSU5PKHgpCSgoeCktPm9mZnNldD8oeCktPm9mZnNldDw8MjoxKQogI2RlZmluZSBPRkZTRVQoeCkJKCh4KS0+aV9pbm8pCiAKLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmdldF9jcmFtZnNfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGNyYW1mc19pbm9kZSAqIGNyYW1mc19pbm9kZSkKKworc3RhdGljIGludCBjcmFtZnNfaWdldDVfdGVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpvcGFxdWUpCiB7Ci0Jc3RydWN0IGlub2RlICogaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCXN0cnVjdCBjcmFtZnNfaW5vZGUgKmNyYW1mc19pbm9kZSA9IG9wYXF1ZTsKKworCWlmIChpbm9kZS0+aV9pbm8gIT0gQ1JBTUlOTyhjcmFtZnNfaW5vZGUpKQorCQlyZXR1cm4gMDsgLyogZG9lcyBub3QgbWF0Y2ggKi8KKworCWlmIChpbm9kZS0+aV9pbm8gIT0gMSkKKwkJcmV0dXJuIDE7CisKKwkvKiBhbGwgZW1wdHkgZGlyZWN0b3JpZXMsIGNoYXIsIGJsb2NrLCBwaXBlLCBhbmQgc29jaywgc2hhcmUgaW5vZGUgIzEgKi8KKworCWlmICgoaW5vZGUtPmlfbW9kZSAhPSBjcmFtZnNfaW5vZGUtPm1vZGUpIHx8CisJICAgIChpbm9kZS0+aV9naWQgIT0gY3JhbWZzX2lub2RlLT5naWQpIHx8CisJICAgIChpbm9kZS0+aV91aWQgIT0gY3JhbWZzX2lub2RlLT51aWQpKQorCQlyZXR1cm4gMDsgLyogZG9lcyBub3QgbWF0Y2ggKi8KKworCWlmICgoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKSAmJgorCSAgICAoaW5vZGUtPmlfcmRldiAhPSBvbGRfZGVjb2RlX2RldihjcmFtZnNfaW5vZGUtPnNpemUpKSkKKwkJcmV0dXJuIDA7IC8qIGRvZXMgbm90IG1hdGNoICovCisKKwlyZXR1cm4gMTsgLyogbWF0Y2hlcyAqLworfQorCitzdGF0aWMgaW50IGNyYW1mc19pZ2V0NV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQoreworCXN0cnVjdCBjcmFtZnNfaW5vZGUgKmNyYW1mc19pbm9kZSA9IG9wYXF1ZTsKKwlpbm9kZS0+aV9pbm8gPSBDUkFNSU5PKGNyYW1mc19pbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmdldF9jcmFtZnNfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzdHJ1Y3QgY3JhbWZzX2lub2RlICogY3JhbWZzX2lub2RlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpZ2V0NV9sb2NrZWQoc2IsIENSQU1JTk8oY3JhbWZzX2lub2RlKSwKKwkJCQkJICAgIGNyYW1mc19pZ2V0NV90ZXN0LCBjcmFtZnNfaWdldDVfc2V0LAorCQkJCQkgICAgY3JhbWZzX2lub2RlKTsKIAlzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHplcm90aW1lOwogCi0JaWYgKGlub2RlKSB7CisJaWYgKGlub2RlICYmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkgewogCQlpbm9kZS0+aV9tb2RlID0gY3JhbWZzX2lub2RlLT5tb2RlOwogCQlpbm9kZS0+aV91aWQgPSBjcmFtZnNfaW5vZGUtPnVpZDsKIAkJaW5vZGUtPmlfc2l6ZSA9IGNyYW1mc19pbm9kZS0+c2l6ZTsKQEAgLTU4LDcgKzkzLDYgQEAKIAkJICAgYnV0IGl0J3MgdGhlIGJlc3Qgd2UgY2FuIGRvIHdpdGhvdXQgcmVhZGluZyB0aGUgZGlyZWN0b3J5CiAJICAgICAgICAgICBjb250ZW50cy4gIDEgeWllbGRzIHRoZSByaWdodCByZXN1bHQgaW4gR05VIGZpbmQsIGV2ZW4KIAkJICAgd2l0aG91dCAtbm9sZWFmIG9wdGlvbi4gKi8KLQkJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOwogCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQkJaW5vZGUtPmlfZm9wID0gJmdlbmVyaWNfcm9fZm9wczsKIAkJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmY3JhbWZzX2FvcHM7CkBAIC03NCw2ICsxMDgsNyBAQAogCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAogCQkJCW9sZF9kZWNvZGVfZGV2KGNyYW1mc19pbm9kZS0+c2l6ZSkpOwogCQl9CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwogCX0KIAlyZXR1cm4gaW5vZGU7CiB9CmRpZmYgLS1naXQgYS9mcy9jcmFtZnMvdW5jb21wcmVzcy5jIGIvZnMvY3JhbWZzL3VuY29tcHJlc3MuYwppbmRleCA1MDM0MzY1Li44ZGVmODlmIDEwMDY0NAotLS0gYS9mcy9jcmFtZnMvdW5jb21wcmVzcy5jCisrKyBiL2ZzL2NyYW1mcy91bmNvbXByZXNzLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC96bGliLmg+CisjaW5jbHVkZSA8bGludXgvY3JhbWZzX2ZzLmg+CiAKIHN0YXRpYyB6X3N0cmVhbSBzdHJlYW07CiBzdGF0aWMgaW50IGluaXRpYWxpemVkOwpkaWZmIC0tZ2l0IGEvZnMvZGNhY2hlLmMgYi9mcy9kY2FjaGUuYwppbmRleCBhMTVhMmUxLi43Mzc2YjYxMiAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTMzNywxMiArMzM3LDEwIEBACiAgKi8KIHZvaWQgZF9wcnVuZV9hbGlhc2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqaGVhZCA9ICZpbm9kZS0+aV9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogcmVzdGFydDoKIAlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKLQl0bXAgPSBoZWFkOwotCXdoaWxlICgodG1wID0gdG1wLT5uZXh0KSAhPSBoZWFkKSB7Ci0JCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZGVudHJ5LCBkX2FsaWFzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlbnRyeSwgJmlub2RlLT5pX2RlbnRyeSwgZF9hbGlhcykgewogCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAkJaWYgKCFhdG9taWNfcmVhZCgmZGVudHJ5LT5kX2NvdW50KSkgewogCQkJX19kZ2V0X2xvY2tlZChkZW50cnkpOwpAQCAtNDYzLDEwICs0NjEsNyBAQAogCSAqIHN1cGVyYmxvY2sgdG8gdGhlIG1vc3QgcmVjZW50IGVuZCBvZiB0aGUgdW51c2VkIGxpc3QuCiAJICovCiAJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7Ci0JbmV4dCA9IGRlbnRyeV91bnVzZWQubmV4dDsKLQl3aGlsZSAobmV4dCAhPSAmZGVudHJ5X3VudXNlZCkgewotCQl0bXAgPSBuZXh0OwotCQluZXh0ID0gdG1wLT5uZXh0OworCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIG5leHQsICZkZW50cnlfdW51c2VkKSB7CiAJCWRlbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZGVudHJ5LCBkX2xydSk7CiAJCWlmIChkZW50cnktPmRfc2IgIT0gc2IpCiAJCQljb250aW51ZTsKQEAgLTQ3OCwxMCArNDczLDcgQEAKIAkgKiBQYXNzIHR3byAuLi4gZnJlZSB0aGUgZGVudHJpZXMgZm9yIHRoaXMgc3VwZXJibG9jay4KIAkgKi8KIHJlcGVhdDoKLQluZXh0ID0gZGVudHJ5X3VudXNlZC5uZXh0OwotCXdoaWxlIChuZXh0ICE9ICZkZW50cnlfdW51c2VkKSB7Ci0JCXRtcCA9IG5leHQ7Ci0JCW5leHQgPSB0bXAtPm5leHQ7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgbmV4dCwgJmRlbnRyeV91bnVzZWQpIHsKIAkJZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfbHJ1KTsKIAkJaWYgKGRlbnRyeS0+ZF9zYiAhPSBzYikKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZnMvZGV2cHRzL01ha2VmaWxlIGIvZnMvZGV2cHRzL01ha2VmaWxlCmluZGV4IDU4MDBkZjIuLjIzNjY5NmUgMTAwNjQ0Ci0tLSBhL2ZzL2RldnB0cy9NYWtlZmlsZQorKysgYi9mcy9kZXZwdHMvTWFrZWZpbGUKQEAgLTUsNCArNSwzIEBACiBvYmotJChDT05GSUdfVU5JWDk4X1BUWVMpCQkrPSBkZXZwdHMubwogCiBkZXZwdHMtJChDT05GSUdfVU5JWDk4X1BUWVMpCQk6PSBpbm9kZS5vCi1kZXZwdHMtJChDT05GSUdfREVWUFRTX0ZTX1NFQ1VSSVRZKQkrPSB4YXR0cl9zZWN1cml0eS5vCmRpZmYgLS1naXQgYS9mcy9kZXZwdHMvaW5vZGUuYyBiL2ZzL2RldnB0cy9pbm9kZS5jCmluZGV4IDE1NzFjOGQuLmYyYmU0NGQgMTAwNjQ0Ci0tLSBhL2ZzL2RldnB0cy9pbm9kZS5jCisrKyBiL2ZzL2RldnB0cy9pbm9kZS5jCkBAIC0xOCwyOCArMTgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2cHRzX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgveGF0dHIuaD4KIAogI2RlZmluZSBERVZQVFNfU1VQRVJfTUFHSUMgMHgxY2QxCiAKLWV4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBkZXZwdHNfeGF0dHJfc2VjdXJpdHlfaGFuZGxlcjsKLQotc3RhdGljIHN0cnVjdCB4YXR0cl9oYW5kbGVyICpkZXZwdHNfeGF0dHJfaGFuZGxlcnNbXSA9IHsKLSNpZmRlZiBDT05GSUdfREVWUFRTX0ZTX1NFQ1VSSVRZCi0JJmRldnB0c194YXR0cl9zZWN1cml0eV9oYW5kbGVyLAotI2VuZGlmCi0JTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGRldnB0c19maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0jaWZkZWYgQ09ORklHX0RFVlBUU19GU19YQVRUUgotCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCi0JLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKLQkubGlzdHhhdHRyCT0gZ2VuZXJpY19saXN0eGF0dHIsCi0JLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKLSNlbmRpZgotfTsKLQogc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqZGV2cHRzX21udDsKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZXZwdHNfcm9vdDsKIApAQCAtMTAyLDcgKzgzLDYgQEAKIAlzLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CiAJcy0+c19tYWdpYyA9IERFVlBUU19TVVBFUl9NQUdJQzsKIAlzLT5zX29wID0gJmRldnB0c19zb3BzOwotCXMtPnNfeGF0dHIgPSBkZXZwdHNfeGF0dHJfaGFuZGxlcnM7CiAJcy0+c190aW1lX2dyYW4gPSAxOwogCiAJaW5vZGUgPSBuZXdfaW5vZGUocyk7CkBAIC0xNzUsNyArMTU1LDYgQEAKIAlpbm9kZS0+aV9naWQgPSBjb25maWcuc2V0Z2lkID8gY29uZmlnLmdpZCA6IGN1cnJlbnQtPmZzZ2lkOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIFNfSUZDSFJ8Y29uZmlnLm1vZGUsIGRldmljZSk7Ci0JaW5vZGUtPmlfb3AgPSAmZGV2cHRzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+dS5nZW5lcmljX2lwID0gdHR5OwogCiAJZGVudHJ5ID0gZ2V0X25vZGUobnVtYmVyKTsKZGlmZiAtLWdpdCBhL2ZzL2RldnB0cy94YXR0cl9zZWN1cml0eS5jIGIvZnMvZGV2cHRzL3hhdHRyX3NlY3VyaXR5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NGNiNWMuLjAwMDAwMDAKLS0tIGEvZnMvZGV2cHRzL3hhdHRyX3NlY3VyaXR5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogU2VjdXJpdHkgeGF0dHIgc3VwcG9ydCBmb3IgZGV2cHRzLgotICoKLSAqIEF1dGhvcjogU3RlcGhlbiBTbWFsbGV5IDxzZHNAZXBvY2gubmNzYy5taWw+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgUmVkIEhhdCwgSW5jLiwgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgotCi1zdGF0aWMgc2l6ZV90Ci1kZXZwdHNfeGF0dHJfc2VjdXJpdHlfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9sZW4sCi0JCQkgICBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW4pCi17Ci0JcmV0dXJuIHNlY3VyaXR5X2lub2RlX2xpc3RzZWN1cml0eShpbm9kZSwgbGlzdCwgbGlzdF9sZW4pOwotfQotCi1zdGF0aWMgaW50Ci1kZXZwdHNfeGF0dHJfc2VjdXJpdHlfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCi17Ci0JaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIHNlY3VyaXR5X2lub2RlX2dldHNlY3VyaXR5KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOwotfQotCi1zdGF0aWMgaW50Ci1kZXZwdHNfeGF0dHJfc2VjdXJpdHlfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQotewotCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiBzZWN1cml0eV9pbm9kZV9zZXRzZWN1cml0eShpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKLX0KLQotc3RydWN0IHhhdHRyX2hhbmRsZXIgZGV2cHRzX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIgPSB7Ci0JLnByZWZpeAk9IFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwKLQkubGlzdAk9IGRldnB0c194YXR0cl9zZWN1cml0eV9saXN0LAotCS5nZXQJPSBkZXZwdHNfeGF0dHJfc2VjdXJpdHlfZ2V0LAotCS5zZXQJPSBkZXZwdHNfeGF0dHJfc2VjdXJpdHlfc2V0LAotfTsKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCAyMjJhYjFjLi4xNGRkMDM5IDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC03OTgsNiArNzk4LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9vbGRfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKQogewogCWxvbmcgaiA9IC0xOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOwogCWZvciAoOzspIHsKQEAgLTgwNSwxMiArODA2LDEzIEBACiAKIAkJaisrOwogCQlpID0gaiAqIF9fTkZEQklUUzsKLQkJaWYgKGkgPj0gZmlsZXMtPm1heF9mZHMgfHwgaSA+PSBmaWxlcy0+bWF4X2Zkc2V0KQorCQlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwkJaWYgKGkgPj0gZmR0LT5tYXhfZmRzIHx8IGkgPj0gZmR0LT5tYXhfZmRzZXQpCiAJCQlicmVhazsKLQkJc2V0ID0gZmlsZXMtPmNsb3NlX29uX2V4ZWMtPmZkc19iaXRzW2pdOworCQlzZXQgPSBmZHQtPmNsb3NlX29uX2V4ZWMtPmZkc19iaXRzW2pdOwogCQlpZiAoIXNldCkKIAkJCWNvbnRpbnVlOwotCQlmaWxlcy0+Y2xvc2Vfb25fZXhlYy0+ZmRzX2JpdHNbal0gPSAwOworCQlmZHQtPmNsb3NlX29uX2V4ZWMtPmZkc19iaXRzW2pdID0gMDsKIAkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwogCQlmb3IgKCA7IHNldCA7IGkrKyxzZXQgPj49IDEpIHsKIAkJCWlmIChzZXQgJiAxKSB7CmRpZmYgLS1naXQgYS9mcy9leHQyL2lhbGxvYy5jIGIvZnMvZXh0Mi9pYWxsb2MuYwppbmRleCAxNjFmMTU2Li5jOGQwNzAzIDEwMDY0NAotLS0gYS9mcy9leHQyL2lhbGxvYy5jCisrKyBiL2ZzL2V4dDIvaWFsbG9jLmMKQEAgLTYxNSw2ICs2MTUsMTEgQEAKIAkJRFFVT1RfRFJPUChpbm9kZSk7CiAJCWdvdG8gZmFpbDI7CiAJfQorCWVyciA9IGV4dDJfaW5pdF9zZWN1cml0eShpbm9kZSxkaXIpOworCWlmIChlcnIpIHsKKwkJRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7CisJCWdvdG8gZmFpbDI7CisJfQogCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCWV4dDJfZGVidWcoImFsbG9jYXRpbmcgaW5vZGUgJWx1XG4iLCBpbm9kZS0+aV9pbm8pOwogCWV4dDJfcHJlcmVhZF9pbm9kZShpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9leHQyL2lub2RlLmMgYi9mcy9leHQyL2lub2RlLmMKaW5kZXggNTNkY2ViMC4uZmRiYTRkMSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pbm9kZS5jCisrKyBiL2ZzL2V4dDIvaW5vZGUuYwpAQCAtNzEsNiArNzEsOCBAQAogICovCiB2b2lkIGV4dDJfZGVsZXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKIHsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CisKIAlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkKIAkJZ290byBub19kZWxldGU7CiAJRVhUMl9JKGlub2RlKS0+aV9kdGltZQk9IGdldF9zZWNvbmRzKCk7CmRpZmYgLS1naXQgYS9mcy9leHQyL3N1cGVyLmMgYi9mcy9leHQyL3N1cGVyLmMKaW5kZXggZGNmZTMzMS4uM2MwYzdjNiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9zdXBlci5jCisrKyBiL2ZzL2V4dDIvc3VwZXIuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KQEAgLTI3LDYgKzI4LDggQEAKICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiZXh0Mi5oIgogI2luY2x1ZGUgInhhdHRyLmgiCkBAIC0yMDEsNiArMjA0LDI2IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIGludCBleHQyX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHZmc21vdW50ICp2ZnMpCit7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQih2ZnMtPm1udF9zYik7CisKKwlpZiAoc2JpLT5zX21vdW50X29wdCAmIEVYVDJfTU9VTlRfR1JQSUQpCisJCXNlcV9wdXRzKHNlcSwgIixncnBpZCIpOworCWVsc2UKKwkJc2VxX3B1dHMoc2VxLCAiLG5vZ3JwaWQiKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1FVT1RBKQorCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUMl9NT1VOVF9VU1JRVU9UQSkKKwkJc2VxX3B1dHMoc2VxLCAiLHVzcnF1b3RhIik7CisKKwlpZiAoc2JpLT5zX21vdW50X29wdCAmIEVYVDJfTU9VTlRfR1JQUVVPVEEpCisJCXNlcV9wdXRzKHNlcSwgIixncnBxdW90YSIpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwogI2lmZGVmIENPTkZJR19RVU9UQQogc3RhdGljIHNzaXplX3QgZXh0Ml9xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKTsKIHN0YXRpYyBzc2l6ZV90IGV4dDJfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpOwpAQCAtMjE4LDYgKzI0MSw3IEBACiAJLnN0YXRmcwkJPSBleHQyX3N0YXRmcywKIAkucmVtb3VudF9mcwk9IGV4dDJfcmVtb3VudCwKIAkuY2xlYXJfaW5vZGUJPSBleHQyX2NsZWFyX2lub2RlLAorCS5zaG93X29wdGlvbnMJPSBleHQyX3Nob3dfb3B0aW9ucywKICNpZmRlZiBDT05GSUdfUVVPVEEKIAkucXVvdGFfcmVhZAk9IGV4dDJfcXVvdGFfcmVhZCwKIAkucXVvdGFfd3JpdGUJPSBleHQyX3F1b3RhX3dyaXRlLApAQCAtMjU2LDEwICsyODAsMTEgQEAKIAogZW51bSB7CiAJT3B0X2JzZF9kZiwgT3B0X21pbml4X2RmLCBPcHRfZ3JwaWQsIE9wdF9ub2dycGlkLAotCU9wdF9yZXNnaWQsIE9wdF9yZXN1aWQsIE9wdF9zYiwgT3B0X2Vycl9jb250LCBPcHRfZXJyX3BhbmljLCBPcHRfZXJyX3JvLAotCU9wdF9ub3VpZDMyLCBPcHRfY2hlY2ssIE9wdF9ub2NoZWNrLCBPcHRfZGVidWcsIE9wdF9vbGRhbGxvYywgT3B0X29ybG92LCBPcHRfbm9iaCwKLQlPcHRfdXNlcl94YXR0ciwgT3B0X25vdXNlcl94YXR0ciwgT3B0X2FjbCwgT3B0X25vYWNsLCBPcHRfeGlwLAotCU9wdF9pZ25vcmUsIE9wdF9lcnIsCisJT3B0X3Jlc2dpZCwgT3B0X3Jlc3VpZCwgT3B0X3NiLCBPcHRfZXJyX2NvbnQsIE9wdF9lcnJfcGFuaWMsCisJT3B0X2Vycl9ybywgT3B0X25vdWlkMzIsIE9wdF9jaGVjaywgT3B0X25vY2hlY2ssIE9wdF9kZWJ1ZywKKwlPcHRfb2xkYWxsb2MsIE9wdF9vcmxvdiwgT3B0X25vYmgsIE9wdF91c2VyX3hhdHRyLCBPcHRfbm91c2VyX3hhdHRyLAorCU9wdF9hY2wsIE9wdF9ub2FjbCwgT3B0X3hpcCwgT3B0X2lnbm9yZSwgT3B0X2VyciwgT3B0X3F1b3RhLAorCU9wdF91c3JxdW90YSwgT3B0X2dycHF1b3RhCiB9OwogCiBzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CkBAIC0yODgsMTAgKzMxMywxMCBAQAogCXtPcHRfYWNsLCAiYWNsIn0sCiAJe09wdF9ub2FjbCwgIm5vYWNsIn0sCiAJe09wdF94aXAsICJ4aXAifSwKLQl7T3B0X2lnbm9yZSwgImdycHF1b3RhIn0sCisJe09wdF9ncnBxdW90YSwgImdycHF1b3RhIn0sCiAJe09wdF9pZ25vcmUsICJub3F1b3RhIn0sCi0Je09wdF9pZ25vcmUsICJxdW90YSJ9LAotCXtPcHRfaWdub3JlLCAidXNycXVvdGEifSwKKwl7T3B0X3F1b3RhLCAicXVvdGEifSwKKwl7T3B0X3VzcnF1b3RhLCAidXNycXVvdGEifSwKIAl7T3B0X2VyciwgTlVMTH0KIH07CiAKQEAgLTQwNiw2ICs0MzEsMjYgQEAKIAkJCXByaW50aygiRVhUMiB4aXAgb3B0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOwogI2VuZGlmCiAJCQlicmVhazsKKworI2lmIGRlZmluZWQoQ09ORklHX1FVT1RBKQorCQljYXNlIE9wdF9xdW90YToKKwkJY2FzZSBPcHRfdXNycXVvdGE6CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFVTUlFVT1RBKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT3B0X2dycHF1b3RhOgorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBHUlBRVU9UQSk7CisJCQlicmVhazsKKyNlbHNlCisJCWNhc2UgT3B0X3F1b3RhOgorCQljYXNlIE9wdF91c3JxdW90YToKKwkJY2FzZSBPcHRfZ3JwcXVvdGE6CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiRVhUMi1mczogcXVvdGEgb3BlcmF0aW9ucyBub3Qgc3VwcG9ydGVkLlxuIik7CisKKwkJCWJyZWFrOworI2VuZGlmCisKIAkJY2FzZSBPcHRfaWdub3JlOgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9mcy9leHQyL3hhdHRyLmggYi9mcy9leHQyL3hhdHRyLmgKaW5kZXggNWYzYmZkZS4uNjdjZmViNiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi94YXR0ci5oCisrKyBiL2ZzL2V4dDIveGF0dHIuaApAQCAtMTE2LDMgKzExNiwxMSBAQAogCiAjIGVuZGlmICAvKiBDT05GSUdfRVhUMl9GU19YQVRUUiAqLwogCisjaWZkZWYgQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkKK2V4dGVybiBpbnQgZXh0Ml9pbml0X3NlY3VyaXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBleHQyX2luaXRfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDIveGF0dHJfc2VjdXJpdHkuYyBiL2ZzL2V4dDIveGF0dHJfc2VjdXJpdHkuYwppbmRleCA2YTZjNTlmLi5hMjY2MTI3IDEwMDY0NAotLS0gYS9mcy9leHQyL3hhdHRyX3NlY3VyaXR5LmMKKysrIGIvZnMvZXh0Mi94YXR0cl9zZWN1cml0eS5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlICJ4YXR0ci5oIgogCiBzdGF0aWMgc2l6ZV90CkBAIC00NSw2ICs0NiwyNyBAQAogCQkJICAgICAgdmFsdWUsIHNpemUsIGZsYWdzKTsKIH0KIAoraW50CitleHQyX2luaXRfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJaW50IGVycjsKKwlzaXplX3QgbGVuOworCXZvaWQgKnZhbHVlOworCWNoYXIgKm5hbWU7CisKKwllcnIgPSBzZWN1cml0eV9pbm9kZV9pbml0X3NlY3VyaXR5KGlub2RlLCBkaXIsICZuYW1lLCAmdmFsdWUsICZsZW4pOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSBleHQyX3hhdHRyX3NldChpbm9kZSwgRVhUMl9YQVRUUl9JTkRFWF9TRUNVUklUWSwKKwkJCSAgICAgbmFtZSwgdmFsdWUsIGxlbiwgMCk7CisJa2ZyZWUobmFtZSk7CisJa2ZyZWUodmFsdWUpOworCXJldHVybiBlcnI7Cit9CisKIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDJfeGF0dHJfc2VjdXJpdHlfaGFuZGxlciA9IHsKIAkucHJlZml4CT0gWEFUVFJfU0VDVVJJVFlfUFJFRklYLAogCS5saXN0CT0gZXh0Ml94YXR0cl9zZWN1cml0eV9saXN0LApkaWZmIC0tZ2l0IGEvZnMvZXh0My9pYWxsb2MuYyBiL2ZzL2V4dDMvaWFsbG9jLmMKaW5kZXggNjk4MWJkMC4uOTY1NTI3NiAxMDA2NDQKLS0tIGEvZnMvZXh0My9pYWxsb2MuYworKysgYi9mcy9leHQzL2lhbGxvYy5jCkBAIC02MDcsNiArNjA3LDExIEBACiAJCURRVU9UX0RST1AoaW5vZGUpOwogCQlnb3RvIGZhaWwyOwogICAJfQorCWVyciA9IGV4dDNfaW5pdF9zZWN1cml0eShoYW5kbGUsaW5vZGUsIGRpcik7CisJaWYgKGVycikgeworCQlEUVVPVF9GUkVFX0lOT0RFKGlub2RlKTsKKwkJZ290byBmYWlsMjsKKwl9CiAJZXJyID0gZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwogCWlmIChlcnIpIHsKIAkJZXh0M19zdGRfZXJyb3Ioc2IsIGVycik7CmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggOTk4OWZkYy4uYjUxNzdjOSAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtMTg3LDYgKzE4Nyw4IEBACiB7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAorCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKwogCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKQogCQlnb3RvIG5vX2RlbGV0ZTsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IDNjM2M2ZTMuLmE5M2MzNjAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAieGF0dHIuaCIKICNpbmNsdWRlICJhY2wuaCIKQEAgLTUwOSw4ICs1MTAsNDEgQEAKIAlrZnJlZShyc3YpOwogfQogCi0jaWZkZWYgQ09ORklHX1FVT1RBCitzdGF0aWMgaW50IGV4dDNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgdmZzbW91bnQgKnZmcykKK3sKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHZmcy0+bW50X3NiKTsKIAorCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9KT1VSTkFMX0RBVEEpCisJCXNlcV9wdXRzKHNlcSwgIixkYXRhPWpvdXJuYWwiKTsKKworCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9PUkRFUkVEX0RBVEEpCisJCXNlcV9wdXRzKHNlcSwgIixkYXRhPW9yZGVyZWQiKTsKKworCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9XUklURUJBQ0tfREFUQSkKKwkJc2VxX3B1dHMoc2VxLCAiLGRhdGE9d3JpdGViYWNrIik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19RVU9UQSkKKwlpZiAoc2JpLT5zX2pxdW90YV9mbXQpCisJCXNlcV9wcmludGYoc2VxLCAiLGpxZm10PSVzIiwKKwkJKHNiaS0+c19qcXVvdGFfZm10ID09IFFGTVRfVkZTX09MRCkgPyAidmZzb2xkIjogInZmc3YwIik7CisKKwlpZiAoc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSkKKwkJc2VxX3ByaW50ZihzZXEsICIsdXNyanF1b3RhPSVzIiwgc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSk7CisKKwlpZiAoc2JpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkKKwkJc2VxX3ByaW50ZihzZXEsICIsZ3JwanF1b3RhPSVzIiwgc2JpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSk7CisKKwlpZiAoc2JpLT5zX21vdW50X29wdCAmIEVYVDNfTU9VTlRfVVNSUVVPVEEpCisJCXNlcV9wdXRzKHNlcSwgIix1c3JxdW90YSIpOworCisJaWYgKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX0dSUFFVT1RBKQorCQlzZXFfcHV0cyhzZXEsICIsZ3JwcXVvdGEiKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUVVPVEEKICNkZWZpbmUgUVRZUEUyTkFNRSh0KSAoKHQpPT1VU1JRVU9UQT8idXNlciI6Imdyb3VwIikKICNkZWZpbmUgUVRZUEUyTU9QVChvbiwgdCkgKCh0KT09VVNSUVVPVEE/KChvbikjI1VTUkpRVU9UQSk6KChvbikjI0dSUEpRVU9UQSkpCiAKQEAgLTU2OSw2ICs2MDMsNyBAQAogCS5zdGF0ZnMJCT0gZXh0M19zdGF0ZnMsCiAJLnJlbW91bnRfZnMJPSBleHQzX3JlbW91bnQsCiAJLmNsZWFyX2lub2RlCT0gZXh0M19jbGVhcl9pbm9kZSwKKwkuc2hvd19vcHRpb25zCT0gZXh0M19zaG93X29wdGlvbnMsCiAjaWZkZWYgQ09ORklHX1FVT1RBCiAJLnF1b3RhX3JlYWQJPSBleHQzX3F1b3RhX3JlYWQsCiAJLnF1b3RhX3dyaXRlCT0gZXh0M19xdW90YV93cml0ZSwKQEAgLTU5MCw3ICs2MjUsOCBAQAogCU9wdF9hYm9ydCwgT3B0X2RhdGFfam91cm5hbCwgT3B0X2RhdGFfb3JkZXJlZCwgT3B0X2RhdGFfd3JpdGViYWNrLAogCU9wdF91c3JqcXVvdGEsIE9wdF9ncnBqcXVvdGEsIE9wdF9vZmZ1c3JqcXVvdGEsIE9wdF9vZmZncnBqcXVvdGEsCiAJT3B0X2pxZm10X3Zmc29sZCwgT3B0X2pxZm10X3Zmc3YwLCBPcHRfcXVvdGEsIE9wdF9ub3F1b3RhLAotCU9wdF9pZ25vcmUsIE9wdF9iYXJyaWVyLCBPcHRfZXJyLCBPcHRfcmVzaXplLAorCU9wdF9pZ25vcmUsIE9wdF9iYXJyaWVyLCBPcHRfZXJyLCBPcHRfcmVzaXplLCBPcHRfdXNycXVvdGEsCisJT3B0X2dycHF1b3RhCiB9OwogCiBzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CkBAIC02MzQsMTAgKzY3MCwxMCBAQAogCXtPcHRfZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSVzIn0sCiAJe09wdF9qcWZtdF92ZnNvbGQsICJqcWZtdD12ZnNvbGQifSwKIAl7T3B0X2pxZm10X3Zmc3YwLCAianFmbXQ9dmZzdjAifSwKLQl7T3B0X3F1b3RhLCAiZ3JwcXVvdGEifSwKKwl7T3B0X2dycHF1b3RhLCAiZ3JwcXVvdGEifSwKIAl7T3B0X25vcXVvdGEsICJub3F1b3RhIn0sCiAJe09wdF9xdW90YSwgInF1b3RhIn0sCi0Je09wdF9xdW90YSwgInVzcnF1b3RhIn0sCisJe09wdF91c3JxdW90YSwgInVzcnF1b3RhIn0sCiAJe09wdF9iYXJyaWVyLCAiYmFycmllcj0ldSJ9LAogCXtPcHRfZXJyLCBOVUxMfSwKIAl7T3B0X3Jlc2l6ZSwgInJlc2l6ZSJ9LApAQCAtOTAzLDcgKzkzOSwxMyBAQAogCQkJc2JpLT5zX2pxdW90YV9mbXQgPSBRRk1UX1ZGU19WMDsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9xdW90YToKKwkJY2FzZSBPcHRfdXNycXVvdGE6CiAJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFFVT1RBKTsKKwkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgVVNSUVVPVEEpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dycHF1b3RhOgorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBRVU9UQSk7CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEdSUFFVT1RBKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub3F1b3RhOgogCQkJaWYgKHNiX2FueV9xdW90YV9lbmFibGVkKHNiKSkgewpAQCAtOTEyLDggKzk1NCwxMyBAQAogCQkJCXJldHVybiAwOwogCQkJfQogCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIFFVT1RBKTsKKwkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBVU1JRVU9UQSk7CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQUVVPVEEpOwogCQkJYnJlYWs7CiAjZWxzZQorCQljYXNlIE9wdF9xdW90YToKKwkJY2FzZSBPcHRfdXNycXVvdGE6CisJCWNhc2UgT3B0X2dycHF1b3RhOgogCQljYXNlIE9wdF91c3JqcXVvdGE6CiAJCWNhc2UgT3B0X2dycGpxdW90YToKIAkJY2FzZSBPcHRfb2ZmdXNyanF1b3RhOgpAQCAtOTI0LDcgKzk3MSw2IEBACiAJCQkJIkVYVDMtZnM6IGpvdXJuYWxsZWQgcXVvdGEgb3B0aW9ucyBub3QgIgogCQkJCSJzdXBwb3J0ZWQuXG4iKTsKIAkJCWJyZWFrOwotCQljYXNlIE9wdF9xdW90YToKIAkJY2FzZSBPcHRfbm9xdW90YToKIAkJCWJyZWFrOwogI2VuZGlmCkBAIC05NjIsMTQgKzEwMDgsMzggQEAKIAkJfQogCX0KICNpZmRlZiBDT05GSUdfUVVPVEEKLQlpZiAoIXNiaS0+c19qcXVvdGFfZm10ICYmIChzYmktPnNfcWZfbmFtZXNbVVNSUVVPVEFdIHx8Ci0JICAgIHNiaS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkJIkVYVDMtZnM6IGpvdXJuYWxsZWQgcXVvdGEgZm9ybWF0IG5vdCBzcGVjaWZpZWQuXG4iKTsKLQkJcmV0dXJuIDA7CisJaWYgKHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gfHwgc2JpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkgeworCQlpZiAoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX1VTUlFVT1RBKSAmJgorCQkgICAgIHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0pCisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgVVNSUVVPVEEpOworCisJCWlmICgoc2JpLT5zX21vdW50X29wdCAmIEVYVDNfTU9VTlRfR1JQUVVPVEEpICYmCisJCSAgICAgc2JpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkKKwkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBHUlBRVU9UQSk7CisKKwkJaWYgKChzYmktPnNfcWZfbmFtZXNbVVNSUVVPVEFdICYmCisJCQkJKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX0dSUFFVT1RBKSkgfHwKKwkJICAgIChzYmktPnNfcWZfbmFtZXNbR1JQUVVPVEFdICYmCisJCQkJKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX1VTUlFVT1RBKSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogb2xkIGFuZCBuZXcgcXVvdGEgIgorCQkJCQkiZm9ybWF0IG1peGluZy5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIXNiaS0+c19qcXVvdGFfZm10KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGpvdXJuYWxsZWQgcXVvdGEgZm9ybWF0ICIKKwkJCQkJIm5vdCBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHNiaS0+c19qcXVvdGFfZm10KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGpvdXJuYWxsZWQgcXVvdGEgZm9ybWF0ICIKKwkJCQkJInNwZWNpZmllZCB3aXRoIG5vIGpvdXJuYWxsaW5nICIKKwkJCQkJImVuYWJsZWQuXG4iKTsKKwkJCXJldHVybiAwOworCQl9CiAJfQogI2VuZGlmCi0KIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0My94YXR0ci5oIGIvZnMvZXh0My94YXR0ci5oCmluZGV4IGViMzFhNjkuLjJjZWFlMzggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMveGF0dHIuaAorKysgYi9mcy9leHQzL3hhdHRyLmgKQEAgLTEzMywzICsxMzMsMTQgQEAKICNkZWZpbmUgZXh0M194YXR0cl9oYW5kbGVycwlOVUxMCiAKICMgZW5kaWYgIC8qIENPTkZJR19FWFQzX0ZTX1hBVFRSICovCisKKyNpZmRlZiBDT05GSUdfRVhUM19GU19TRUNVUklUWQorZXh0ZXJuIGludCBleHQzX2luaXRfc2VjdXJpdHkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgaW5vZGUgKmRpcik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZXh0M19pbml0X3NlY3VyaXR5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGlub2RlICpkaXIpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDMveGF0dHJfc2VjdXJpdHkuYyBiL2ZzL2V4dDMveGF0dHJfc2VjdXJpdHkuYwppbmRleCBkZGMxYzQxLi5iOWM0MGMxIDEwMDY0NAotLS0gYS9mcy9leHQzL3hhdHRyX3NlY3VyaXR5LmMKKysrIGIvZnMvZXh0My94YXR0cl9zZWN1cml0eS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KICNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlICJ4YXR0ci5oIgogCiBzdGF0aWMgc2l6ZV90CkBAIC00Nyw2ICs0OCwyNyBAQAogCQkJICAgICAgdmFsdWUsIHNpemUsIGZsYWdzKTsKIH0KIAoraW50CitleHQzX2luaXRfc2VjdXJpdHkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJaW50IGVycjsKKwlzaXplX3QgbGVuOworCXZvaWQgKnZhbHVlOworCWNoYXIgKm5hbWU7CisKKwllcnIgPSBzZWN1cml0eV9pbm9kZV9pbml0X3NlY3VyaXR5KGlub2RlLCBkaXIsICZuYW1lLCAmdmFsdWUsICZsZW4pOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSBleHQzX3hhdHRyX3NldF9oYW5kbGUoaGFuZGxlLCBpbm9kZSwgRVhUM19YQVRUUl9JTkRFWF9TRUNVUklUWSwKKwkJCQkgICAgbmFtZSwgdmFsdWUsIGxlbiwgMCk7CisJa2ZyZWUobmFtZSk7CisJa2ZyZWUodmFsdWUpOworCXJldHVybiBlcnI7Cit9CisKIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDNfeGF0dHJfc2VjdXJpdHlfaGFuZGxlciA9IHsKIAkucHJlZml4CT0gWEFUVFJfU0VDVVJJVFlfUFJFRklYLAogCS5saXN0CT0gZXh0M194YXR0cl9zZWN1cml0eV9saXN0LApkaWZmIC0tZ2l0IGEvZnMvZmF0L2Rpci5jIGIvZnMvZmF0L2Rpci5jCmluZGV4IGU1YWUxYjcuLjg5NTA0OWIgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9kaXIuYworKysgYi9mcy9mYXQvZGlyLmMKQEAgLTMwLDYgKzMwLDI5IEBACiAJCXwgKGRlIC0gKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKiliaC0+Yl9kYXRhKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGZhdF9kaXJfcmVhZGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCBzZWN0b3JfdCBpYmxvY2ssCisJCQkJICAgICBzZWN0b3JfdCBwaHlzKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBzZWM7CisKKwkvKiBUaGlzIGlzIG5vdCBhIGZpcnN0IHNlY3RvciBvZiBjbHVzdGVyLCBvciBzZWNfcGVyX2NsdXMgPT0gMSAqLworCWlmICgoaWJsb2NrICYgKHNiaS0+c2VjX3Blcl9jbHVzIC0gMSkpIHx8IHNiaS0+c2VjX3Blcl9jbHVzID09IDEpCisJCXJldHVybjsKKwkvKiByb290IGRpciBvZiBGQVQxMi9GQVQxNiAqLworCWlmICgoc2JpLT5mYXRfYml0cyAhPSAzMikgJiYgKGRpci0+aV9pbm8gPT0gTVNET1NfUk9PVF9JTk8pKQorCQlyZXR1cm47CisKKwliaCA9IHNiX2dldGJsayhzYiwgcGh5cyk7CisJaWYgKGJoICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCWZvciAoc2VjID0gMDsgc2VjIDwgc2JpLT5zZWNfcGVyX2NsdXM7IHNlYysrKQorCQkJc2JfYnJlYWRhaGVhZChzYiwgcGh5cyArIHNlYyk7CisJfQorCWJyZWxzZShiaCk7Cit9CisKIC8qIFJldHVybnMgdGhlIGlub2RlIG51bWJlciBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5IGF0IG9mZnNldCBwb3MuIElmIGJoIGlzCiAgICBub24tTlVMTCwgaXQgaXMgYnJlbHNlJ2QgYmVmb3JlLiBQb3MgaXMgaW5jcmVtZW50ZWQuIFRoZSBidWZmZXIgaGVhZGVyIGlzCiAgICByZXR1cm5lZCBpbiBiaC4KQEAgLTU4LDYgKzgxLDggQEAKIAlpZiAoZXJyIHx8ICFwaHlzKQogCQlyZXR1cm4gLTE7CS8qIGJleW9uZCBFT0Ygb3IgZXJyb3IgKi8KIAorCWZhdF9kaXJfcmVhZGFoZWFkKGRpciwgaWJsb2NrLCBwaHlzKTsKKwogCSpiaCA9IHNiX2JyZWFkKHNiLCBwaHlzKTsKIAlpZiAoKmJoID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IERpcmVjdG9yeSBicmVhZChibG9jayAlbGx1KSBmYWlsZWRcbiIsCkBAIC02MzUsOCArNjYwLDcgQEAKIEVPRGlyOgogCWZpbHAtPmZfcG9zID0gY3BvczsKIEZpbGxGYWlsZWQ6Ci0JaWYgKGJoKQotCQlicmVsc2UoYmgpOworCWJyZWxzZShiaCk7CiAJaWYgKHVuaWNvZGUpCiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl1bmljb2RlKTsKIG91dDoKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9pbm9kZS5jIGIvZnMvZmF0L2lub2RlLmMKaW5kZXggOTZhZTg1Yi4uYTdjYmU2OCAxMDA2NDQKLS0tIGEvZnMvZmF0L2lub2RlLmMKKysrIGIvZnMvZmF0L2lub2RlLmMKQEAgLTMzNSw2ICszMzUsOCBAQAogCiBzdGF0aWMgdm9pZCBmYXRfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOworCiAJaWYgKCFpc19iYWRfaW5vZGUoaW5vZGUpKSB7CiAJCWlub2RlLT5pX3NpemUgPSAwOwogCQlmYXRfdHJ1bmNhdGUoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvZmNudGwuYyBiL2ZzL2ZjbnRsLmMKaW5kZXggNmZiYzlkOC4uODYzYjQ2ZSAxMDA2NDQKLS0tIGEvZnMvZmNudGwuYworKysgYi9mcy9mY250bC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogCiAjaW5jbHVkZSA8YXNtL3BvbGwuaD4KICNpbmNsdWRlIDxhc20vc2lnaW5mby5oPgpAQCAtMjQsMjEgKzI1LDI1IEBACiB2b2lkIGZhc3RjYWxsIHNldF9jbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCwgaW50IGZsYWcpCiB7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CiAJaWYgKGZsYWcpCi0JCUZEX1NFVChmZCwgZmlsZXMtPmNsb3NlX29uX2V4ZWMpOworCQlGRF9TRVQoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CiAJZWxzZQotCQlGRF9DTFIoZmQsIGZpbGVzLT5jbG9zZV9vbl9leGVjKTsKKwkJRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOwogCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZ2V0X2Nsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkKQogewogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gY3VycmVudC0+ZmlsZXM7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAlpbnQgcmVzOwotCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JcmVzID0gRkRfSVNTRVQoZmQsIGZpbGVzLT5jbG9zZV9vbl9leGVjKTsKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOworCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOworCXJlcyA9IEZEX0lTU0VUKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOworCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTU0LDI0ICs1OSwyNiBAQAogCXVuc2lnbmVkIGludCBuZXdmZDsKIAl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAJaW50IGVycm9yOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAllcnJvciA9IC1FSU5WQUw7CiAJaWYgKG9yaWdfc3RhcnQgPj0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9OT0ZJTEVdLnJsaW1fY3VyKQogCQlnb3RvIG91dDsKIAogcmVwZWF0OgorCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOwogCS8qCiAJICogU29tZW9uZSBtaWdodCBoYXZlIGNsb3NlZCBmZCdzIGluIHRoZSByYW5nZQotCSAqIG9yaWdfc3RhcnQuLmZpbGVzLT5uZXh0X2ZkCisJICogb3JpZ19zdGFydC4uZmR0LT5uZXh0X2ZkCiAJICovCiAJc3RhcnQgPSBvcmlnX3N0YXJ0OwotCWlmIChzdGFydCA8IGZpbGVzLT5uZXh0X2ZkKQotCQlzdGFydCA9IGZpbGVzLT5uZXh0X2ZkOworCWlmIChzdGFydCA8IGZkdC0+bmV4dF9mZCkKKwkJc3RhcnQgPSBmZHQtPm5leHRfZmQ7CiAKIAluZXdmZCA9IHN0YXJ0OwotCWlmIChzdGFydCA8IGZpbGVzLT5tYXhfZmRzZXQpIHsKLQkJbmV3ZmQgPSBmaW5kX25leHRfemVyb19iaXQoZmlsZXMtPm9wZW5fZmRzLT5mZHNfYml0cywKLQkJCWZpbGVzLT5tYXhfZmRzZXQsIHN0YXJ0KTsKKwlpZiAoc3RhcnQgPCBmZHQtPm1heF9mZHNldCkgeworCQluZXdmZCA9IGZpbmRfbmV4dF96ZXJvX2JpdChmZHQtPm9wZW5fZmRzLT5mZHNfYml0cywKKwkJCWZkdC0+bWF4X2Zkc2V0LCBzdGFydCk7CiAJfQogCQogCWVycm9yID0gLUVNRklMRTsKQEAgLTg5LDkgKzk2LDE1IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIHJlcGVhdDsKIAotCWlmIChzdGFydCA8PSBmaWxlcy0+bmV4dF9mZCkKLQkJZmlsZXMtPm5leHRfZmQgPSBuZXdmZCArIDE7Ci0JCisJLyoKKwkgKiBXZSByZWFjcXVpcmVkIGZpbGVzX2xvY2ssIHNvIHdlIGFyZSBzYWZlIGFzIGxvbmcgYXMKKwkgKiB3ZSByZWFjcXVpcmUgdGhlIGZkdGFibGUgcG9pbnRlciBhbmQgdXNlIGl0IHdoaWxlIGhvbGRpbmcKKwkgKiB0aGUgbG9jaywgbm8gb25lIGNhbiBmcmVlIGl0IGR1cmluZyB0aGF0IHRpbWUuCisJICovCisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJaWYgKHN0YXJ0IDw9IGZkdC0+bmV4dF9mZCkKKwkJZmR0LT5uZXh0X2ZkID0gbmV3ZmQgKyAxOworCiAJZXJyb3IgPSBuZXdmZDsKIAkKIG91dDoKQEAgLTEwMSwxMyArMTE0LDE2IEBACiBzdGF0aWMgaW50IGR1cGZkKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgc3RhcnQpCiB7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzID0gY3VycmVudC0+ZmlsZXM7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAlpbnQgZmQ7CiAKIAlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOwogCWZkID0gbG9jYXRlX2ZkKGZpbGVzLCBmaWxlLCBzdGFydCk7CiAJaWYgKGZkID49IDApIHsKLQkJRkRfU0VUKGZkLCBmaWxlcy0+b3Blbl9mZHMpOwotCQlGRF9DTFIoZmQsIGZpbGVzLT5jbG9zZV9vbl9leGVjKTsKKwkJLyogbG9jYXRlX2ZkKCkgbWF5IGhhdmUgZXhwYW5kZWQgZmR0YWJsZSwgbG9hZCB0aGUgcHRyICovCisJCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOworCQlGRF9TRVQoZmQsIGZkdC0+b3Blbl9mZHMpOworCQlGRF9DTFIoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CiAJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKIAkJZmRfaW5zdGFsbChmZCwgZmlsZSk7CiAJfSBlbHNlIHsKQEAgLTEyMyw2ICsxMzksNyBAQAogCWludCBlcnIgPSAtRUJBREY7CiAJc3RydWN0IGZpbGUgKiBmaWxlLCAqdG9mcmVlOwogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOwogCWlmICghKGZpbGUgPSBmY2hlY2sob2xkZmQpKSkKQEAgLTE0OCwxMyArMTY1LDE0IEBACiAKIAkvKiBZZXMuIEl0J3MgYSByYWNlLiBJbiB1c2VyIHNwYWNlLiBOb3RoaW5nIHNhbmUgdG8gZG8gKi8KIAllcnIgPSAtRUJVU1k7Ci0JdG9mcmVlID0gZmlsZXMtPmZkW25ld2ZkXTsKLQlpZiAoIXRvZnJlZSAmJiBGRF9JU1NFVChuZXdmZCwgZmlsZXMtPm9wZW5fZmRzKSkKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwl0b2ZyZWUgPSBmZHQtPmZkW25ld2ZkXTsKKwlpZiAoIXRvZnJlZSAmJiBGRF9JU1NFVChuZXdmZCwgZmR0LT5vcGVuX2ZkcykpCiAJCWdvdG8gb3V0X2ZwdXQ7CiAKLQlmaWxlcy0+ZmRbbmV3ZmRdID0gZmlsZTsKLQlGRF9TRVQobmV3ZmQsIGZpbGVzLT5vcGVuX2Zkcyk7Ci0JRkRfQ0xSKG5ld2ZkLCBmaWxlcy0+Y2xvc2Vfb25fZXhlYyk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGZkdC0+ZmRbbmV3ZmRdLCBmaWxlKTsKKwlGRF9TRVQobmV3ZmQsIGZkdC0+b3Blbl9mZHMpOworCUZEX0NMUihuZXdmZCwgZmR0LT5jbG9zZV9vbl9leGVjKTsKIAlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CiAKIAlpZiAodG9mcmVlKQpkaWZmIC0tZ2l0IGEvZnMvZmlsZS5jIGIvZnMvZmlsZS5jCmluZGV4IDkyYjVmMjUuLjIxMjdhN2IgMTAwNjQ0Ci0tLSBhL2ZzL2ZpbGUuYworKysgYi9mcy9maWxlLmMKQEAgLTEzLDYgKzEzLDI1IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKK3N0cnVjdCBmZHRhYmxlX2RlZmVyIHsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHdvcmtfc3RydWN0IHdxOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXN0cnVjdCBmZHRhYmxlICpuZXh0OworfTsKKworLyoKKyAqIFdlIHVzZSB0aGlzIGxpc3QgdG8gZGVmZXIgZnJlZSBmZHRhYmxlcyB0aGF0IGhhdmUgdm1hbGxvY2VkCisgKiBzZXRzL2FycmF5cy4gQnkga2VlcGluZyBhIHBlci1jcHUgbGlzdCwgd2UgYXZvaWQgaGF2aW5nIHRvIGVtYmVkCisgKiB0aGUgd29ya19zdHJ1Y3QgaW4gZmR0YWJsZSBpdHNlbGYgd2hpY2ggYXZvaWRzIGEgNjQgYnl0ZSAoaTM4NikgaW5jcmVhc2UgaW4KKyAqIHRoaXMgcGVyLXRhc2sgc3RydWN0dXJlLgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGZkdGFibGVfZGVmZXIsIGZkdGFibGVfZGVmZXJfbGlzdCk7CiAKIAogLyoKQEAgLTQ4LDgyICs2NywxNDMgQEAKIAkJdmZyZWUoYXJyYXkpOwogfQogCi0vKgotICogRXhwYW5kIHRoZSBmZCBhcnJheSBpbiB0aGUgZmlsZXNfc3RydWN0LiAgQ2FsbGVkIHdpdGggdGhlIGZpbGVzCi0gKiBzcGlubG9jayBoZWxkIGZvciB3cml0ZS4KLSAqLwotCi1zdGF0aWMgaW50IGV4cGFuZF9mZF9hcnJheShzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcywgaW50IG5yKQotCV9fcmVsZWFzZXMoZmlsZXMtPmZpbGVfbG9jaykKLQlfX2FjcXVpcmVzKGZpbGVzLT5maWxlX2xvY2spCitzdGF0aWMgdm9pZCBfX2ZyZWVfZmR0YWJsZShzdHJ1Y3QgZmR0YWJsZSAqZmR0KQogewotCXN0cnVjdCBmaWxlICoqbmV3X2ZkczsKLQlpbnQgZXJyb3IsIG5mZHM7CisJaW50IGZkc2V0X3NpemUsIGZkYXJyYXlfc2l6ZTsKIAotCQotCWVycm9yID0gLUVNRklMRTsKLQlpZiAoZmlsZXMtPm1heF9mZHMgPj0gTlJfT1BFTiB8fCBuciA+PSBOUl9PUEVOKQotCQlnb3RvIG91dDsKKwlmZHNldF9zaXplID0gZmR0LT5tYXhfZmRzZXQgLyA4OworCWZkYXJyYXlfc2l6ZSA9IGZkdC0+bWF4X2ZkcyAqIHNpemVvZihzdHJ1Y3QgZmlsZSAqKTsKKwlmcmVlX2Zkc2V0KGZkdC0+b3Blbl9mZHMsIGZkc2V0X3NpemUpOworCWZyZWVfZmRzZXQoZmR0LT5jbG9zZV9vbl9leGVjLCBmZHNldF9zaXplKTsKKwlmcmVlX2ZkX2FycmF5KGZkdC0+ZmQsIGZkYXJyYXlfc2l6ZSk7CisJa2ZyZWUoZmR0KTsKK30KIAotCW5mZHMgPSBmaWxlcy0+bWF4X2ZkczsKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CitzdGF0aWMgdm9pZCBmZHRhYmxlX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZmR0YWJsZV9kZWZlciAqZmRkZWYgPSAoc3RydWN0IGZkdGFibGVfZGVmZXIgKilkYXRhOwogCi0JLyogCi0JICogRXhwYW5kIHRvIHRoZSBtYXggaW4gZWFzeSBzdGVwcywgYW5kIGtlZXAgZXhwYW5kaW5nIGl0IHVudGlsCi0JICogd2UgaGF2ZSBlbm91Z2ggZm9yIHRoZSByZXF1ZXN0ZWQgZmQgYXJyYXkgc2l6ZS4gCisJc3Bpbl9sb2NrKCZmZGRlZi0+bG9jayk7CisJLyoKKwkgKiBJZiBzb21lb25lIGFscmVhZHkgZW1wdGllZCB0aGUgcXVldWUgcmV0dXJuLgogCSAqLwotCi0JZG8gewotI2lmIE5SX09QRU5fREVGQVVMVCA8IDI1NgotCQlpZiAobmZkcyA8IDI1NikKLQkJCW5mZHMgPSAyNTY7Ci0JCWVsc2UgCi0jZW5kaWYKLQkJaWYgKG5mZHMgPCAoUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBmaWxlICopKSkKLQkJCW5mZHMgPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGZpbGUgKik7Ci0JCWVsc2UgewotCQkJbmZkcyA9IG5mZHMgKiAyOwotCQkJaWYgKG5mZHMgPiBOUl9PUEVOKQotCQkJCW5mZHMgPSBOUl9PUEVOOwotCQl9Ci0JfSB3aGlsZSAobmZkcyA8PSBucik7Ci0KLQllcnJvciA9IC1FTk9NRU07Ci0JbmV3X2ZkcyA9IGFsbG9jX2ZkX2FycmF5KG5mZHMpOwotCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JaWYgKCFuZXdfZmRzKQorCWlmICghZmRkZWYtPm5leHQpCiAJCWdvdG8gb3V0OwotCi0JLyogQ29weSB0aGUgZXhpc3RpbmcgYXJyYXkgYW5kIGluc3RhbGwgdGhlIG5ldyBwb2ludGVyICovCi0KLQlpZiAobmZkcyA+IGZpbGVzLT5tYXhfZmRzKSB7Ci0JCXN0cnVjdCBmaWxlICoqb2xkX2ZkczsKLQkJaW50IGk7Ci0JCQotCQlvbGRfZmRzID0geGNoZygmZmlsZXMtPmZkLCBuZXdfZmRzKTsKLQkJaSA9IHhjaGcoJmZpbGVzLT5tYXhfZmRzLCBuZmRzKTsKLQotCQkvKiBEb24ndCBjb3B5L2NsZWFyIHRoZSBhcnJheSBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcKLQkJICAgZmQgYXJyYXkgZm9yIGZvcmsoKSAqLwotCQlpZiAoaSkgewotCQkJbWVtY3B5KG5ld19mZHMsIG9sZF9mZHMsIGkgKiBzaXplb2Yoc3RydWN0IGZpbGUgKikpOwotCQkJLyogY2xlYXIgdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJyYXkgKi8KLQkJCW1lbXNldCgmbmV3X2Zkc1tpXSwgMCwKLQkJCSAgICAgICAobmZkcy1pKSAqIHNpemVvZihzdHJ1Y3QgZmlsZSAqKSk7IAotCi0JCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JCQlmcmVlX2ZkX2FycmF5KG9sZF9mZHMsIGkpOwotCQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFNvbWVib2R5IGV4cGFuZGVkIHRoZSBhcnJheSB3aGlsZSB3ZSBzbGVwdCAuLi4gKi8KLQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCQlmcmVlX2ZkX2FycmF5KG5ld19mZHMsIG5mZHMpOwotCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCX0KLQllcnJvciA9IDA7CisJaWYgKCFzY2hlZHVsZV93b3JrKCZmZGRlZi0+d3EpKQorCQltb2RfdGltZXIoJmZkZGVmLT50aW1lciwgNSk7CiBvdXQ6Ci0JcmV0dXJuIGVycm9yOworCXNwaW5fdW5sb2NrKCZmZGRlZi0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZmR0YWJsZV93b3JrKHN0cnVjdCBmZHRhYmxlX2RlZmVyICpmKQoreworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisKKwlzcGluX2xvY2tfYmgoJmYtPmxvY2spOworCWZkdCA9IGYtPm5leHQ7CisJZi0+bmV4dCA9IE5VTEw7CisJc3Bpbl91bmxvY2tfYmgoJmYtPmxvY2spOworCXdoaWxlKGZkdCkgeworCQlzdHJ1Y3QgZmR0YWJsZSAqbmV4dCA9IGZkdC0+bmV4dDsKKwkJX19mcmVlX2ZkdGFibGUoZmR0KTsKKwkJZmR0ID0gbmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZmR0YWJsZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IGZkdGFibGUgKmZkdCA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBmZHRhYmxlLCByY3UpOworCWludCBmZHNldF9zaXplLCBmZGFycmF5X3NpemU7CisJc3RydWN0IGZkdGFibGVfZGVmZXIgKmZkZGVmOworCisJQlVHX09OKCFmZHQpOworCWZkc2V0X3NpemUgPSBmZHQtPm1heF9mZHNldCAvIDg7CisJZmRhcnJheV9zaXplID0gZmR0LT5tYXhfZmRzICogc2l6ZW9mKHN0cnVjdCBmaWxlICopOworCisJaWYgKGZkdC0+ZnJlZV9maWxlcykgeworCQkvKgorCQkgKiBUaGUgdGhpcyBmZHRhYmxlIHdhcyBlbWJlZGRlZCBpbiB0aGUgZmlsZXMgc3RydWN0dXJlCisJCSAqIGFuZCB0aGUgZmlsZXMgc3RydWN0dXJlIGl0c2VsZiB3YXMgZ2V0dGluZyBkZXN0cm95ZWQuCisJCSAqIEl0IGlzIG5vdyBzYWZlIHRvIGZyZWUgdGhlIGZpbGVzIHN0cnVjdHVyZS4KKwkJICovCisJCWttZW1fY2FjaGVfZnJlZShmaWxlc19jYWNoZXAsIGZkdC0+ZnJlZV9maWxlcyk7CisJCXJldHVybjsKKwl9CisJaWYgKGZkdC0+bWF4X2Zkc2V0IDw9IF9fRkRfU0VUU0laRSAmJiBmZHQtPm1heF9mZHMgPD0gTlJfT1BFTl9ERUZBVUxUKSB7CisJCS8qCisJCSAqIFRoZSBmZHRhYmxlIHdhcyBlbWJlZGRlZAorCQkgKi8KKwkJcmV0dXJuOworCX0KKwlpZiAoZmRzZXRfc2l6ZSA8PSBQQUdFX1NJWkUgJiYgZmRhcnJheV9zaXplIDw9IFBBR0VfU0laRSkgeworCQlrZnJlZShmZHQtPm9wZW5fZmRzKTsKKwkJa2ZyZWUoZmR0LT5jbG9zZV9vbl9leGVjKTsKKwkJa2ZyZWUoZmR0LT5mZCk7CisJCWtmcmVlKGZkdCk7CisJfSBlbHNlIHsKKwkJZmRkZWYgPSAmZ2V0X2NwdV92YXIoZmR0YWJsZV9kZWZlcl9saXN0KTsKKwkJc3Bpbl9sb2NrKCZmZGRlZi0+bG9jayk7CisJCWZkdC0+bmV4dCA9IGZkZGVmLT5uZXh0OworCQlmZGRlZi0+bmV4dCA9IGZkdDsKKwkJLyoKKwkJICogdm1hbGxvY3MgYXJlIGhhbmRsZWQgZnJvbSB0aGUgd29ya3F1ZXVlIGNvbnRleHQuCisJCSAqIElmIHRoZSBwZXItY3B1IHdvcmtxdWV1ZSBpcyBydW5uaW5nLCB0aGVuIHdlCisJCSAqIGRlZmVyIHdvcmsgc2NoZWR1bGluZyB0aHJvdWdoIGEgdGltZXIuCisJCSAqLworCQlpZiAoIXNjaGVkdWxlX3dvcmsoJmZkZGVmLT53cSkpCisJCQltb2RfdGltZXIoJmZkZGVmLT50aW1lciwgNSk7CisJCXNwaW5fdW5sb2NrKCZmZGRlZi0+bG9jayk7CisJCXB1dF9jcHVfdmFyKGZkdGFibGVfZGVmZXJfbGlzdCk7CisJfQorfQorCit2b2lkIGZyZWVfZmR0YWJsZShzdHJ1Y3QgZmR0YWJsZSAqZmR0KQoreworCWlmIChmZHQtPmZyZWVfZmlsZXMgfHwgZmR0LT5tYXhfZmRzZXQgPiBfX0ZEX1NFVFNJWkUgfHwKKwkJCQkJZmR0LT5tYXhfZmRzID4gTlJfT1BFTl9ERUZBVUxUKQorCQljYWxsX3JjdSgmZmR0LT5yY3UsIGZyZWVfZmR0YWJsZV9yY3UpOworfQorCisvKgorICogRXhwYW5kIHRoZSBmZHNldCBpbiB0aGUgZmlsZXNfc3RydWN0LiAgQ2FsbGVkIHdpdGggdGhlIGZpbGVzIHNwaW5sb2NrCisgKiBoZWxkIGZvciB3cml0ZS4KKyAqLworc3RhdGljIHZvaWQgY29weV9mZHRhYmxlKHN0cnVjdCBmZHRhYmxlICpuZmR0LCBzdHJ1Y3QgZmR0YWJsZSAqZmR0KQoreworCWludCBpOworCWludCBjb3VudDsKKworCUJVR19PTihuZmR0LT5tYXhfZmRzZXQgPCBmZHQtPm1heF9mZHNldCk7CisJQlVHX09OKG5mZHQtPm1heF9mZHMgPCBmZHQtPm1heF9mZHMpOworCS8qIENvcHkgdGhlIGV4aXN0aW5nIHRhYmxlcyBhbmQgaW5zdGFsbCB0aGUgbmV3IHBvaW50ZXJzICovCisKKwlpID0gZmR0LT5tYXhfZmRzZXQgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCk7CisJY291bnQgPSAobmZkdC0+bWF4X2Zkc2V0IC0gZmR0LT5tYXhfZmRzZXQpIC8gODsKKworCS8qCisJICogRG9uJ3QgY29weSB0aGUgZW50aXJlIGFycmF5IGlmIHRoZSBjdXJyZW50IGZkc2V0IGlzCisJICogbm90IHlldCBpbml0aWFsaXNlZC4KKwkgKi8KKwlpZiAoaSkgeworCQltZW1jcHkgKG5mZHQtPm9wZW5fZmRzLCBmZHQtPm9wZW5fZmRzLAorCQkJCQkJZmR0LT5tYXhfZmRzZXQvOCk7CisJCW1lbWNweSAobmZkdC0+Y2xvc2Vfb25fZXhlYywgZmR0LT5jbG9zZV9vbl9leGVjLAorCQkJCQkJZmR0LT5tYXhfZmRzZXQvOCk7CisJCW1lbXNldCAoJm5mZHQtPm9wZW5fZmRzLT5mZHNfYml0c1tpXSwgMCwgY291bnQpOworCQltZW1zZXQgKCZuZmR0LT5jbG9zZV9vbl9leGVjLT5mZHNfYml0c1tpXSwgMCwgY291bnQpOworCX0KKworCS8qIERvbid0IGNvcHkvY2xlYXIgdGhlIGFycmF5IGlmIHdlIGFyZSBjcmVhdGluZyBhIG5ldworCSAgIGZkIGFycmF5IGZvciBmb3JrKCkgKi8KKwlpZiAoZmR0LT5tYXhfZmRzKSB7CisJCW1lbWNweShuZmR0LT5mZCwgZmR0LT5mZCwKKwkJCWZkdC0+bWF4X2ZkcyAqIHNpemVvZihzdHJ1Y3QgZmlsZSAqKSk7CisJCS8qIGNsZWFyIHRoZSByZW1haW5kZXIgb2YgdGhlIGFycmF5ICovCisJCW1lbXNldCgmbmZkdC0+ZmRbZmR0LT5tYXhfZmRzXSwgMCwKKwkJICAgICAgIChuZmR0LT5tYXhfZmRzIC0gZmR0LT5tYXhfZmRzKSAqCisJCQkJCXNpemVvZihzdHJ1Y3QgZmlsZSAqKSk7CisJfQorCW5mZHQtPm5leHRfZmQgPSBmZHQtPm5leHRfZmQ7CiB9CiAKIC8qCkBAIC0xNTQsMjYgKzIzNCwyMSBAQAogCQl2ZnJlZShhcnJheSk7CiB9CiAKLS8qCi0gKiBFeHBhbmQgdGhlIGZkc2V0IGluIHRoZSBmaWxlc19zdHJ1Y3QuICBDYWxsZWQgd2l0aCB0aGUgZmlsZXMgc3BpbmxvY2sKLSAqIGhlbGQgZm9yIHdyaXRlLgotICovCi1zdGF0aWMgaW50IGV4cGFuZF9mZHNldChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcywgaW50IG5yKQotCV9fcmVsZWFzZXMoZmlsZS0+ZmlsZV9sb2NrKQotCV9fYWNxdWlyZXMoZmlsZS0+ZmlsZV9sb2NrKQorc3RhdGljIHN0cnVjdCBmZHRhYmxlICphbGxvY19mZHRhYmxlKGludCBucikKIHsKLQlmZF9zZXQgKm5ld19vcGVuc2V0ID0gTlVMTCwgKm5ld19leGVjc2V0ID0gTlVMTDsKLQlpbnQgZXJyb3IsIG5mZHMgPSAwOworCXN0cnVjdCBmZHRhYmxlICpmZHQgPSBOVUxMOworCWludCBuZmRzID0gMDsKKyAgCWZkX3NldCAqbmV3X29wZW5zZXQgPSBOVUxMLCAqbmV3X2V4ZWNzZXQgPSBOVUxMOworCXN0cnVjdCBmaWxlICoqbmV3X2ZkczsKIAotCWVycm9yID0gLUVNRklMRTsKLQlpZiAoZmlsZXMtPm1heF9mZHNldCA+PSBOUl9PUEVOIHx8IG5yID49IE5SX09QRU4pCi0JCWdvdG8gb3V0OworCWZkdCA9IGttYWxsb2Moc2l6ZW9mKCpmZHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZkdCkKKyAgCQlnb3RvIG91dDsKKwltZW1zZXQoZmR0LCAwLCBzaXplb2YoKmZkdCkpOwogCi0JbmZkcyA9IGZpbGVzLT5tYXhfZmRzZXQ7Ci0Jc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCi0JLyogRXhwYW5kIHRvIHRoZSBtYXggaW4gZWFzeSBzdGVwcyAqLwotCWRvIHsKKwluZmRzID0gX19GRF9TRVRTSVpFOworICAJLyogRXhwYW5kIHRvIHRoZSBtYXggaW4gZWFzeSBzdGVwcyAqLworICAJZG8gewogCQlpZiAobmZkcyA8IChQQUdFX1NJWkUgKiA4KSkKIAkJCW5mZHMgPSBQQUdFX1NJWkUgKiA4OwogCQllbHNlIHsKQEAgLTE4Myw0OSArMjU4LDg4IEBACiAJCX0KIAl9IHdoaWxlIChuZmRzIDw9IG5yKTsKIAotCWVycm9yID0gLUVOT01FTTsKLQluZXdfb3BlbnNldCA9IGFsbG9jX2Zkc2V0KG5mZHMpOwotCW5ld19leGVjc2V0ID0gYWxsb2NfZmRzZXQobmZkcyk7Ci0Jc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQlpZiAoIW5ld19vcGVuc2V0IHx8ICFuZXdfZXhlY3NldCkKKyAgCW5ld19vcGVuc2V0ID0gYWxsb2NfZmRzZXQobmZkcyk7CisgIAluZXdfZXhlY3NldCA9IGFsbG9jX2Zkc2V0KG5mZHMpOworICAJaWYgKCFuZXdfb3BlbnNldCB8fCAhbmV3X2V4ZWNzZXQpCisgIAkJZ290byBvdXQ7CisJZmR0LT5vcGVuX2ZkcyA9IG5ld19vcGVuc2V0OworCWZkdC0+Y2xvc2Vfb25fZXhlYyA9IG5ld19leGVjc2V0OworCWZkdC0+bWF4X2Zkc2V0ID0gbmZkczsKKworCW5mZHMgPSBOUl9PUEVOX0RFRkFVTFQ7CisJLyoKKwkgKiBFeHBhbmQgdG8gdGhlIG1heCBpbiBlYXN5IHN0ZXBzLCBhbmQga2VlcCBleHBhbmRpbmcgaXQgdW50aWwKKwkgKiB3ZSBoYXZlIGVub3VnaCBmb3IgdGhlIHJlcXVlc3RlZCBmZCBhcnJheSBzaXplLgorCSAqLworCWRvIHsKKyNpZiBOUl9PUEVOX0RFRkFVTFQgPCAyNTYKKwkJaWYgKG5mZHMgPCAyNTYpCisJCQluZmRzID0gMjU2OworCQllbHNlCisjZW5kaWYKKwkJaWYgKG5mZHMgPCAoUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBmaWxlICopKSkKKwkJCW5mZHMgPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGZpbGUgKik7CisJCWVsc2UgeworCQkJbmZkcyA9IG5mZHMgKiAyOworCQkJaWYgKG5mZHMgPiBOUl9PUEVOKQorCQkJCW5mZHMgPSBOUl9PUEVOOworICAJCX0KKwl9IHdoaWxlIChuZmRzIDw9IG5yKTsKKwluZXdfZmRzID0gYWxsb2NfZmRfYXJyYXkobmZkcyk7CisJaWYgKCFuZXdfZmRzKQogCQlnb3RvIG91dDsKLQotCWVycm9yID0gMDsKLQkKLQkvKiBDb3B5IHRoZSBleGlzdGluZyB0YWJsZXMgYW5kIGluc3RhbGwgdGhlIG5ldyBwb2ludGVycyAqLwotCWlmIChuZmRzID4gZmlsZXMtPm1heF9mZHNldCkgewotCQlpbnQgaSA9IGZpbGVzLT5tYXhfZmRzZXQgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCk7Ci0JCWludCBjb3VudCA9IChuZmRzIC0gZmlsZXMtPm1heF9mZHNldCkgLyA4OwotCQkKLQkJLyogCi0JCSAqIERvbid0IGNvcHkgdGhlIGVudGlyZSBhcnJheSBpZiB0aGUgY3VycmVudCBmZHNldCBpcwotCQkgKiBub3QgeWV0IGluaXRpYWxpc2VkLiAgCi0JCSAqLwotCQlpZiAoaSkgewotCQkJbWVtY3B5IChuZXdfb3BlbnNldCwgZmlsZXMtPm9wZW5fZmRzLCBmaWxlcy0+bWF4X2Zkc2V0LzgpOwotCQkJbWVtY3B5IChuZXdfZXhlY3NldCwgZmlsZXMtPmNsb3NlX29uX2V4ZWMsIGZpbGVzLT5tYXhfZmRzZXQvOCk7Ci0JCQltZW1zZXQgKCZuZXdfb3BlbnNldC0+ZmRzX2JpdHNbaV0sIDAsIGNvdW50KTsKLQkJCW1lbXNldCAoJm5ld19leGVjc2V0LT5mZHNfYml0c1tpXSwgMCwgY291bnQpOwotCQl9Ci0JCQotCQluZmRzID0geGNoZygmZmlsZXMtPm1heF9mZHNldCwgbmZkcyk7Ci0JCW5ld19vcGVuc2V0ID0geGNoZygmZmlsZXMtPm9wZW5fZmRzLCBuZXdfb3BlbnNldCk7Ci0JCW5ld19leGVjc2V0ID0geGNoZygmZmlsZXMtPmNsb3NlX29uX2V4ZWMsIG5ld19leGVjc2V0KTsKLQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCQlmcmVlX2Zkc2V0IChuZXdfb3BlbnNldCwgbmZkcyk7Ci0JCWZyZWVfZmRzZXQgKG5ld19leGVjc2V0LCBuZmRzKTsKLQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfSAKLQkvKiBTb21lYm9keSBleHBhbmRlZCB0aGUgYXJyYXkgd2hpbGUgd2Ugc2xlcHQgLi4uICovCi0KKwlmZHQtPmZkID0gbmV3X2ZkczsKKwlmZHQtPm1heF9mZHMgPSBuZmRzOworCWZkdC0+ZnJlZV9maWxlcyA9IE5VTEw7CisJcmV0dXJuIGZkdDsKIG91dDoKKyAgCWlmIChuZXdfb3BlbnNldCkKKyAgCQlmcmVlX2Zkc2V0KG5ld19vcGVuc2V0LCBuZmRzKTsKKyAgCWlmIChuZXdfZXhlY3NldCkKKyAgCQlmcmVlX2Zkc2V0KG5ld19leGVjc2V0LCBuZmRzKTsKKwlrZnJlZShmZHQpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogRXhwYW5kcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIC0gaXQgd2lsbCBhbGxvY2F0ZSBhIG5ldyBmZHRhYmxlIGFuZAorICogYm90aCBmZCBhcnJheSBhbmQgZmRzZXQuIEl0IGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCB3aXRoIHRoZQorICogZmlsZXNfbG9jayBoZWxkLgorICovCitzdGF0aWMgaW50IGV4cGFuZF9mZHRhYmxlKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCBpbnQgbnIpCisJX19yZWxlYXNlcyhmaWxlcy0+ZmlsZV9sb2NrKQorCV9fYWNxdWlyZXMoZmlsZXMtPmZpbGVfbG9jaykKK3sKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisJc3RydWN0IGZkdGFibGUgKm5mZHQgPSBOVUxMOworCiAJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCWlmIChuZXdfb3BlbnNldCkKLQkJZnJlZV9mZHNldChuZXdfb3BlbnNldCwgbmZkcyk7Ci0JaWYgKG5ld19leGVjc2V0KQotCQlmcmVlX2Zkc2V0KG5ld19leGVjc2V0LCBuZmRzKTsKKwluZmR0ID0gYWxsb2NfZmR0YWJsZShucik7CisJaWYgKCFuZmR0KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCiAJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwkvKgorCSAqIENoZWNrIGFnYWluIHNpbmNlIGFub3RoZXIgdGFzayBtYXkgaGF2ZSBleHBhbmRlZCB0aGUKKwkgKiBmZCB0YWJsZSB3aGlsZSB3ZSBkcm9wcGVkIHRoZSBsb2NrCisJICovCisJaWYgKG5yID49IGZkdC0+bWF4X2ZkcyB8fCBuciA+PSBmZHQtPm1heF9mZHNldCkgeworCQljb3B5X2ZkdGFibGUobmZkdCwgZmR0KTsKKwl9IGVsc2UgeworCQkvKiBTb21lYm9keSBleHBhbmRlZCB3aGlsZSB3ZSBkcm9wcGVkIGZpbGVfbG9jayAqLworCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCV9fZnJlZV9mZHRhYmxlKG5mZHQpOworCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQlnb3RvIG91dDsKKwl9CisJcmN1X2Fzc2lnbl9wb2ludGVyKGZpbGVzLT5mZHQsIG5mZHQpOworCWZyZWVfZmR0YWJsZShmZHQpOworb3V0OgogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjM3LDE4ICszNTEsMzkgQEAKIGludCBleHBhbmRfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIGludCBucikKIHsKIAlpbnQgZXJyLCBleHBhbmQgPSAwOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKLQlpZiAobnIgPj0gZmlsZXMtPm1heF9mZHNldCkgewotCQlleHBhbmQgPSAxOwotCQlpZiAoKGVyciA9IGV4cGFuZF9mZHNldChmaWxlcywgbnIpKSkKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwlpZiAobnIgPj0gZmR0LT5tYXhfZmRzZXQgfHwgbnIgPj0gZmR0LT5tYXhfZmRzKSB7CisJCWlmIChmZHQtPm1heF9mZHNldCA+PSBOUl9PUEVOIHx8CisJCQlmZHQtPm1heF9mZHMgPj0gTlJfT1BFTiB8fCBuciA+PSBOUl9PUEVOKSB7CisJCQllcnIgPSAtRU1GSUxFOwogCQkJZ290byBvdXQ7Ci0JfQotCWlmIChuciA+PSBmaWxlcy0+bWF4X2ZkcykgeworCQl9CiAJCWV4cGFuZCA9IDE7Ci0JCWlmICgoZXJyID0gZXhwYW5kX2ZkX2FycmF5KGZpbGVzLCBucikpKQorCQlpZiAoKGVyciA9IGV4cGFuZF9mZHRhYmxlKGZpbGVzLCBucikpKQogCQkJZ290byBvdXQ7CiAJfQogCWVyciA9IGV4cGFuZDsKIG91dDoKIAlyZXR1cm4gZXJyOwogfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZmR0YWJsZV9kZWZlcl9saXN0X2luaXQoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgZmR0YWJsZV9kZWZlciAqZmRkZWYgPSAmcGVyX2NwdShmZHRhYmxlX2RlZmVyX2xpc3QsIGNwdSk7CisJc3Bpbl9sb2NrX2luaXQoJmZkZGVmLT5sb2NrKTsKKwlJTklUX1dPUksoJmZkZGVmLT53cSwgKHZvaWQgKCopKHZvaWQgKikpZnJlZV9mZHRhYmxlX3dvcmssIGZkZGVmKTsKKwlpbml0X3RpbWVyKCZmZGRlZi0+dGltZXIpOworCWZkZGVmLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZmRkZWY7CisJZmRkZWYtPnRpbWVyLmZ1bmN0aW9uID0gZmR0YWJsZV90aW1lcjsKKwlmZGRlZi0+bmV4dCA9IE5VTEw7Cit9CisKK3ZvaWQgX19pbml0IGZpbGVzX2RlZmVyX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwkvKiBSZWFsbHkgZWFybHkgLSBjYW4ndCB1c2UgZm9yX2VhY2hfY3B1ICovCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKKwkJZmR0YWJsZV9kZWZlcl9saXN0X2luaXQoaSk7Cit9CmRpZmYgLS1naXQgYS9mcy9maWxlX3RhYmxlLmMgYi9mcy9maWxlX3RhYmxlLmMKaW5kZXggMWQzZGU3OC4uODZlYzhhZSAxMDA2NDQKLS0tIGEvZnMvZmlsZV90YWJsZS5jCisrKyBiL2ZzL2ZpbGVfdGFibGUuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9ldmVudHBvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CkBAIC01Myw5ICs1NCwxNSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbHBfY291bnRfbG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsZV9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGZpbGUgKmYgPSAgY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBmaWxlLCBmX3JjdWhlYWQpOworCWttZW1fY2FjaGVfZnJlZShmaWxwX2NhY2hlcCwgZik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWxlX2ZyZWUoc3RydWN0IGZpbGUgKmYpCiB7Ci0Ja21lbV9jYWNoZV9mcmVlKGZpbHBfY2FjaGVwLCBmKTsKKwljYWxsX3JjdSgmZi0+Zl9yY3VoZWFkLCBmaWxlX2ZyZWVfcmN1KTsKIH0KIAogLyogRmluZCBhbiB1bnVzZWQgZmlsZSBzdHJ1Y3R1cmUgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCkBAIC04OSw3ICs5Niw2IEBACiAJcndsb2NrX2luaXQoJmYtPmZfb3duZXIubG9jayk7CiAJLyogZi0+Zl92ZXJzaW9uOiAwICovCiAJSU5JVF9MSVNUX0hFQUQoJmYtPmZfbGlzdCk7Ci0JZi0+Zl9tYXhjb3VudCA9IElOVF9NQVg7CiAJcmV0dXJuIGY7CiAKIG92ZXI6CkBAIC0xMTEsNyArMTE3LDcgQEAKIAogdm9pZCBmYXN0Y2FsbCBmcHV0KHN0cnVjdCBmaWxlICpmaWxlKQogewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZmaWxlLT5mX2NvdW50KSkKKwlpZiAocmN1cmVmX2RlY19hbmRfdGVzdCgmZmlsZS0+Zl9jb3VudCkpCiAJCV9fZnB1dChmaWxlKTsKIH0KIApAQCAtMTU3LDExICsxNjMsMTcgQEAKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwogCi0Jc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZmlsZSA9IGZjaGVja19maWxlcyhmaWxlcywgZmQpOwotCWlmIChmaWxlKQotCQlnZXRfZmlsZShmaWxlKTsKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJaWYgKGZpbGUpIHsKKwkJaWYgKCFyY3VyZWZfaW5jX2xmKCZmaWxlLT5mX2NvdW50KSkgeworCQkJLyogRmlsZSBvYmplY3QgcmVmIGNvdWxkbid0IGJlIHRha2VuICovCisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCiAJcmV0dXJuIGZpbGU7CiB9CiAKQEAgLTE4MywyMSArMTk1LDI1IEBACiAJaWYgKGxpa2VseSgoYXRvbWljX3JlYWQoJmZpbGVzLT5jb3VudCkgPT0gMSkpKSB7CiAJCWZpbGUgPSBmY2hlY2tfZmlsZXMoZmlsZXMsIGZkKTsKIAl9IGVsc2UgewotCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQlyY3VfcmVhZF9sb2NrKCk7CiAJCWZpbGUgPSBmY2hlY2tfZmlsZXMoZmlsZXMsIGZkKTsKIAkJaWYgKGZpbGUpIHsKLQkJCWdldF9maWxlKGZpbGUpOwotCQkJKmZwdXRfbmVlZGVkID0gMTsKKwkJCWlmIChyY3VyZWZfaW5jX2xmKCZmaWxlLT5mX2NvdW50KSkKKwkJCQkqZnB1dF9uZWVkZWQgPSAxOworCQkJZWxzZQorCQkJCS8qIERpZG4ndCBnZXQgdGhlIHJlZmVyZW5jZSwgc29tZW9uZSdzIGZyZWVkICovCisJCQkJZmlsZSA9IE5VTEw7CiAJCX0KLQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CisKIAlyZXR1cm4gZmlsZTsKIH0KIAogCiB2b2lkIHB1dF9maWxwKHN0cnVjdCBmaWxlICpmaWxlKQogewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZmaWxlLT5mX2NvdW50KSkgeworCWlmIChyY3VyZWZfZGVjX2FuZF90ZXN0KCZmaWxlLT5mX2NvdW50KSkgewogCQlzZWN1cml0eV9maWxlX2ZyZWUoZmlsZSk7CiAJCWZpbGVfa2lsbChmaWxlKTsKIAkJZmlsZV9mcmVlKGZpbGUpOwpAQCAtMjU4LDQgKzI3NCw1IEBACiAJZmlsZXNfc3RhdC5tYXhfZmlsZXMgPSBuOyAKIAlpZiAoZmlsZXNfc3RhdC5tYXhfZmlsZXMgPCBOUl9GSUxFKQogCQlmaWxlc19zdGF0Lm1heF9maWxlcyA9IE5SX0ZJTEU7CisJZmlsZXNfZGVmZXJfaW5pdCgpOwogfSAKZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYwppbmRleCAyN2Y2NmQzLi42YWE2ZmJlIDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIAogCXNicC0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAKLQlpbmZwID0ga2NhbGxvYygxLCBzaXplb2YoKmluZnApLCBHRlBfS0VSTkVMKTsKKwlpbmZwID0ga3phbGxvYyhzaXplb2YoKmluZnApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZnApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAidnhmczogdW5hYmxlIHRvIGFsbG9jYXRlIGluY29yZSBzdXBlcmJsb2NrXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9mcy9mdXNlL01ha2VmaWxlIGIvZnMvZnVzZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2UxZjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZnVzZS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBGVVNFIGZpbGVzeXN0ZW0uCisjCisKK29iai0kKENPTkZJR19GVVNFX0ZTKSArPSBmdXNlLm8KKworZnVzZS1vYmpzIDo9IGRldi5vIGRpci5vIGZpbGUubyBpbm9kZS5vCmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rldi5jIGIvZnMvZnVzZS9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGM4NjljCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZnVzZS9kZXYuYwpAQCAtMCwwICsxLDg3NyBAQAorLyoKKyAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKworICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KKyAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCisqLworCisjaW5jbHVkZSAiZnVzZV9pLmgiCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworTU9EVUxFX0FMSUFTX01JU0NERVYoRlVTRV9NSU5PUik7CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmZ1c2VfcmVxX2NhY2hlcDsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZnVzZV9jb25uICpmdXNlX2dldF9jb25uKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOworCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKKwlmYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoZmMgJiYgIWZjLT5tb3VudGVkKQorCQlmYyA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisJcmV0dXJuIGZjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnVzZV9yZXF1ZXN0X2luaXQoc3RydWN0IGZ1c2VfcmVxICpyZXEpCit7CisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKKwlJTklUX0xJU1RfSEVBRCgmcmVxLT5saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyZXEtPndhaXRxKTsKKwlhdG9taWNfc2V0KCZyZXEtPmNvdW50LCAxKTsKK30KKworc3RydWN0IGZ1c2VfcmVxICpmdXNlX3JlcXVlc3RfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGttZW1fY2FjaGVfYWxsb2MoZnVzZV9yZXFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKHJlcSkKKwkJZnVzZV9yZXF1ZXN0X2luaXQocmVxKTsKKwlyZXR1cm4gcmVxOworfQorCit2b2lkIGZ1c2VfcmVxdWVzdF9mcmVlKHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCWttZW1fY2FjaGVfZnJlZShmdXNlX3JlcV9jYWNoZXAsIHJlcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibG9ja19zaWdzKHNpZ3NldF90ICpvbGRzZXQpCit7CisJc2lnc2V0X3QgbWFzazsKKworCXNpZ2luaXRzZXRpbnYoJm1hc2ssIHNpZ21hc2soU0lHS0lMTCkpOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJm1hc2ssIG9sZHNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX3NpZ3Moc2lnc2V0X3QgKm9sZHNldCkKK3sKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgb2xkc2V0LCBOVUxMKTsKK30KKwordm9pZCBmdXNlX3Jlc2V0X3JlcXVlc3Qoc3RydWN0IGZ1c2VfcmVxICpyZXEpCit7CisJaW50IHByZWFsbG9jYXRlZCA9IHJlcS0+cHJlYWxsb2NhdGVkOworCUJVR19PTihhdG9taWNfcmVhZCgmcmVxLT5jb3VudCkgIT0gMSk7CisJZnVzZV9yZXF1ZXN0X2luaXQocmVxKTsKKwlyZXEtPnByZWFsbG9jYXRlZCA9IHByZWFsbG9jYXRlZDsKK30KKworc3RhdGljIHZvaWQgX19mdXNlX2dldF9yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCWF0b21pY19pbmMoJnJlcS0+Y291bnQpOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoID4gMSByZWZjb3VudCAqLworc3RhdGljIHZvaWQgX19mdXNlX3B1dF9yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCUJVR19PTihhdG9taWNfcmVhZCgmcmVxLT5jb3VudCkgPCAyKTsKKwlhdG9taWNfZGVjKCZyZXEtPmNvdW50KTsKK30KKworc3RhdGljIHN0cnVjdCBmdXNlX3JlcSAqZG9fZ2V0X3JlcXVlc3Qoc3RydWN0IGZ1c2VfY29ubiAqZmMpCit7CisJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJQlVHX09OKGxpc3RfZW1wdHkoJmZjLT51bnVzZWRfbGlzdCkpOworCXJlcSA9IGxpc3RfZW50cnkoZmMtPnVudXNlZF9saXN0Lm5leHQsIHN0cnVjdCBmdXNlX3JlcSwgbGlzdCk7CisJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKKwlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwlmdXNlX3JlcXVlc3RfaW5pdChyZXEpOworCXJlcS0+cHJlYWxsb2NhdGVkID0gMTsKKwlyZXEtPmluLmgudWlkID0gY3VycmVudC0+ZnN1aWQ7CisJcmVxLT5pbi5oLmdpZCA9IGN1cnJlbnQtPmZzZ2lkOworCXJlcS0+aW4uaC5waWQgPSBjdXJyZW50LT5waWQ7CisJcmV0dXJuIHJlcTsKK30KKworLyogVGhpcyBjYW4gcmV0dXJuIE5VTEwsIGJ1dCBvbmx5IGluIGNhc2UgaXQncyBpbnRlcnJ1cHRlZCBieSBhIFNJR0tJTEwgKi8KK3N0cnVjdCBmdXNlX3JlcSAqZnVzZV9nZXRfcmVxdWVzdChzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlpbnQgaW50cjsKKwlzaWdzZXRfdCBvbGRzZXQ7CisKKwlibG9ja19zaWdzKCZvbGRzZXQpOworCWludHIgPSBkb3duX2ludGVycnVwdGlibGUoJmZjLT5vdXRzdGFuZGluZ19zZW0pOworCXJlc3RvcmVfc2lncygmb2xkc2V0KTsKKwlyZXR1cm4gaW50ciA/IE5VTEwgOiBkb19nZXRfcmVxdWVzdChmYyk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1c2VfcHV0YmFja19yZXF1ZXN0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3sKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJaWYgKHJlcS0+cHJlYWxsb2NhdGVkKQorCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZmMtPnVudXNlZF9saXN0KTsKKwllbHNlCisJCWZ1c2VfcmVxdWVzdF9mcmVlKHJlcSk7CisKKwkvKiBJZiB3ZSBhcmUgaW4gZGVidCBkZWNyZWFzZSB0aGF0IGZpcnN0ICovCisJaWYgKGZjLT5vdXRzdGFuZGluZ19kZWJ0KQorCQlmYy0+b3V0c3RhbmRpbmdfZGVidC0tOworCWVsc2UKKwkJdXAoJmZjLT5vdXRzdGFuZGluZ19zZW0pOworCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworfQorCit2b2lkIGZ1c2VfcHV0X3JlcXVlc3Qoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyZXEtPmNvdW50KSkKKwkJZnVzZV9wdXRiYWNrX3JlcXVlc3QoZmMsIHJlcSk7Cit9CisKK3ZvaWQgZnVzZV9yZWxlYXNlX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfcmVxICpyZXEpCit7CisJaXB1dChyZXEtPmlub2RlKTsKKwlpcHV0KHJlcS0+aW5vZGUyKTsKKwlpZiAocmVxLT5maWxlKQorCQlmcHV0KHJlcS0+ZmlsZSk7CisJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCWxpc3RfZGVsKCZyZXEtPmJnX2VudHJ5KTsKKwlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSByZXF1ZXN0IGlzIGZpbmlzaGVkLiAgRWl0aGVyIGEgcmVwbHkKKyAqIGhhcyBhcnJpdmVkIG9yIGl0IHdhcyBpbnRlcnJ1cHRlZCAoYW5kIG5vdCB5ZXQgc2VudCkgb3Igc29tZSBlcnJvcgorICogb2NjdXJlZCBkdXJpbmcgY29tbXVuaWNhdGlvbiB3aXRoIHVzZXJzcGFjZSwgb3IgdGhlIGRldmljZSBmaWxlIHdhcworICogY2xvc2VkLiAgSXQgZGVjcmVhc2VzIHRoZSByZWZlcmVjZSBjb3VudCBmb3IgdGhlIHJlcXVlc3QuICBJbiBjYXNlCisgKiBvZiBhIGJhY2tncm91bmQgcmVxdWVzdCB0aGUgcmVmZXJlY2UgdG8gdGhlIHN0b3JlZCBvYmplY3RzIGFyZQorICogcmVsZWFzZWQuICBUaGUgcmVxdWVzdGVyIHRocmVhZCBpcyB3b2tlbiB1cCAoaWYgc3RpbGwgd2FpdGluZyksIGFuZAorICogZmluYWxseSB0aGUgcmVxdWVzdCBpcyBlaXRoZXIgZnJlZWQgb3IgcHV0IG9uIHRoZSB1bnVzZWRfbGlzdAorICoKKyAqIENhbGxlZCB3aXRoIGZ1c2VfbG9jaywgdW5sb2NrcyBpdAorICovCitzdGF0aWMgdm9pZCByZXF1ZXN0X2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit7CisJaW50IHB1dGJhY2s7CisJcmVxLT5maW5pc2hlZCA9IDE7CisJcHV0YmFjayA9IGF0b21pY19kZWNfYW5kX3Rlc3QoJnJlcS0+Y291bnQpOworCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCWlmIChyZXEtPmJhY2tncm91bmQpIHsKKwkJZG93bl9yZWFkKCZmYy0+c2JwdXRfc2VtKTsKKwkJaWYgKGZjLT5tb3VudGVkKQorCQkJZnVzZV9yZWxlYXNlX2JhY2tncm91bmQocmVxKTsKKwkJdXBfcmVhZCgmZmMtPnNicHV0X3NlbSk7CisJfQorCXdha2VfdXAoJnJlcS0+d2FpdHEpOworCWlmIChyZXEtPmluLmgub3Bjb2RlID09IEZVU0VfSU5JVCkgeworCQlpbnQgaTsKKworCQlpZiAocmVxLT5taXNjLmluaXRfaW5fb3V0Lm1ham9yICE9IEZVU0VfS0VSTkVMX1ZFUlNJT04pCisJCQlmYy0+Y29ubl9lcnJvciA9IDE7CisKKwkJLyogQWZ0ZXIgSU5JVCByZXBseSBpcyByZWNlaXZlZCBvdGhlciByZXF1ZXN0cyBjYW4gZ28KKwkJICAgb3V0LiAgU28gZG8gKEZVU0VfTUFYX09VVFNUQU5ESU5HIC0gMSkgbnVtYmVyIG9mCisJCSAgIHVwKClzIG9uIG91dHN0YW5kaW5nX3NlbS4gIFRoZSBsYXN0IHVwKCkgaXMgZG9uZSBpbgorCQkgICBmdXNlX3B1dGJhY2tfcmVxdWVzdCgpICovCisJCWZvciAoaSA9IDE7IGkgPCBGVVNFX01BWF9PVVRTVEFORElORzsgaSsrKQorCQkJdXAoJmZjLT5vdXRzdGFuZGluZ19zZW0pOworCX0KKwlpZiAocHV0YmFjaykKKwkJZnVzZV9wdXRiYWNrX3JlcXVlc3QoZmMsIHJlcSk7Cit9CisKKy8qCisgKiBVbmZvcnR1bmF0ZWx5IHJlcXVlc3QgaW50ZXJydXB0aW9uIG5vdCBqdXN0IHNvbHZlcyB0aGUgZGVhZGxvY2sKKyAqIHByb2JsZW0sIGl0IGNhdXNlcyBwcm9ibGVtcyB0b28uICBUaGVzZSBzdGVtIGZyb20gdGhlIGZhY3QsIHRoYXQgYW4KKyAqIGludGVycnVwdGVkIHJlcXVlc3QgaXMgY29udGludWVkIHRvIGJlIHByb2Nlc3NlZCBpbiB1c2Vyc3BhY2UsCisgKiB3aGlsZSBhbGwgdGhlIGxvY2tzIGFuZCBvYmplY3QgcmVmZXJlbmNlcyAoaW5vZGUgYW5kIGZpbGUpIGhlbGQKKyAqIGR1cmluZyB0aGUgb3BlcmF0aW9uIGFyZSByZWxlYXNlZC4KKyAqCisgKiBUbyByZWxlYXNlIHRoZSBsb2NrcyBpcyBleGFjdGx5IHdoeSB0aGVyZSdzIGEgbmVlZCB0byBpbnRlcnJ1cHQgdGhlCisgKiByZXF1ZXN0LCBzbyB0aGVyZSdzIG5vdCBhIGxvdCB0aGF0IGNhbiBiZSBkb25lIGFib3V0IHRoaXMsIGV4Y2VwdAorICogaW50cm9kdWNlIGFkZGl0aW9uYWwgbG9ja2luZyBpbiB1c2Vyc3BhY2UuCisgKgorICogTW9yZSBpbXBvcnRhbnQgaXMgdG8ga2VlcCBpbm9kZSBhbmQgZmlsZSByZWZlcmVuY2VzIHVudGlsIHVzZXJzcGFjZQorICogaGFzIHJlcGxpZWQsIG90aGVyd2lzZSBGT1JHRVQgYW5kIFJFTEVBU0UgY291bGQgYmUgc2VudCB3aGlsZSB0aGUKKyAqIGlub2RlL2ZpbGUgaXMgc3RpbGwgdXNlZCBieSB0aGUgZmlsZXN5c3RlbS4KKyAqCisgKiBGb3IgdGhpcyByZWFzb24gdGhlIGNvbmNlcHQgb2YgImJhY2tncm91bmQiIHJlcXVlc3QgaXMgaW50cm9kdWNlZC4KKyAqIEFuIGludGVycnVwdGVkIHJlcXVlc3QgaXMgYmFja2dyb3VuZGVkIGlmIGl0IGhhcyBiZWVuIGFscmVhZHkgc2VudAorICogdG8gdXNlcnNwYWNlLiAgQmFja2dyb3VuZGluZyBpbnZvbHZlcyBnZXR0aW5nIGFuIGV4dHJhIHJlZmVyZW5jZSB0bworICogaW5vZGUocykgb3IgZmlsZSB1c2VkIGluIHRoZSByZXF1ZXN0LCBhbmQgYWRkaW5nIHRoZSByZXF1ZXN0IHRvCisgKiBmYy0+YmFja2dyb3VuZCBsaXN0LiAgV2hlbiBhIHJlcGx5IGlzIHJlY2VpdmVkIGZvciBhIGJhY2tncm91bmQKKyAqIHJlcXVlc3QsIHRoZSBvYmplY3QgcmVmZXJlbmNlcyBhcmUgcmVsZWFzZWQsIGFuZCB0aGUgcmVxdWVzdCBpcworICogcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiAgSWYgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIHdoaWxlIHRoZXJlCisgKiBhcmUgc3RpbGwgYmFja2dyb3VuZCByZXF1ZXN0cywgdGhlIGxpc3QgaXMgd2Fsa2VkIGFuZCByZWZlcmVuY2VzCisgKiBhcmUgcmVsZWFzZWQgYXMgaWYgYSByZXBseSB3YXMgcmVjZWl2ZWQuCisgKgorICogVGhlcmUncyBvbmUgbW9yZSB1c2UgZm9yIGEgYmFja2dyb3VuZCByZXF1ZXN0LiAgVGhlIFJFTEVBU0UgbWVzc2FnZSBpcworICogYWx3YXlzIHNlbnQgYXMgYmFja2dyb3VuZCwgc2luY2UgaXQgZG9lc24ndCByZXR1cm4gYW4gZXJyb3Igb3IKKyAqIGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIGJhY2tncm91bmRfcmVxdWVzdChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit7CisJcmVxLT5iYWNrZ3JvdW5kID0gMTsKKwlsaXN0X2FkZCgmcmVxLT5iZ19lbnRyeSwgJmZjLT5iYWNrZ3JvdW5kKTsKKwlpZiAocmVxLT5pbm9kZSkKKwkJcmVxLT5pbm9kZSA9IGlncmFiKHJlcS0+aW5vZGUpOworCWlmIChyZXEtPmlub2RlMikKKwkJcmVxLT5pbm9kZTIgPSBpZ3JhYihyZXEtPmlub2RlMik7CisJaWYgKHJlcS0+ZmlsZSkKKwkJZ2V0X2ZpbGUocmVxLT5maWxlKTsKK30KKworLyogQ2FsbGVkIHdpdGggZnVzZV9sb2NrIGhlbGQuICBSZWxlYXNlcywgYW5kIHRoZW4gcmVhY3F1aXJlcyBpdC4gKi8KK3N0YXRpYyB2b2lkIHJlcXVlc3Rfd2FpdF9hbnN3ZXIoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCXNpZ3NldF90IG9sZHNldDsKKworCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCWJsb2NrX3NpZ3MoJm9sZHNldCk7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJlcS0+d2FpdHEsIHJlcS0+ZmluaXNoZWQpOworCXJlc3RvcmVfc2lncygmb2xkc2V0KTsKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJaWYgKHJlcS0+ZmluaXNoZWQpCisJCXJldHVybjsKKworCXJlcS0+b3V0LmguZXJyb3IgPSAtRUlOVFI7CisJcmVxLT5pbnRlcnJ1cHRlZCA9IDE7CisJaWYgKHJlcS0+bG9ja2VkKSB7CisJCS8qIFRoaXMgaXMgdW5pbnRlcnJ1cHRpYmxlIHNsZWVwLCBiZWNhdXNlIGRhdGEgaXMKKwkJICAgYmVpbmcgY29waWVkIHRvL2Zyb20gdGhlIGJ1ZmZlcnMgb2YgcmVxLiAgRHVyaW5nCisJCSAgIGxvY2tlZCBzdGF0ZSwgdGhlcmUgbXVzdG4ndCBiZSBhbnkgZmlsZXN5c3RlbQorCQkgICBvcGVyYXRpb24gKGUuZy4gcGFnZSBmYXVsdCksIHNpbmNlIHRoYXQgY291bGQgbGVhZAorCQkgICB0byBkZWFkbG9jayAqLworCQlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwkJd2FpdF9ldmVudChyZXEtPndhaXRxLCAhcmVxLT5sb2NrZWQpOworCQlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJfQorCWlmICghcmVxLT5zZW50ICYmICFsaXN0X2VtcHR5KCZyZXEtPmxpc3QpKSB7CisJCWxpc3RfZGVsKCZyZXEtPmxpc3QpOworCQlfX2Z1c2VfcHV0X3JlcXVlc3QocmVxKTsKKwl9IGVsc2UgaWYgKCFyZXEtPmZpbmlzaGVkICYmIHJlcS0+c2VudCkKKwkJYmFja2dyb3VuZF9yZXF1ZXN0KGZjLCByZXEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbGVuX2FyZ3ModW5zaWduZWQgbnVtYXJncywgc3RydWN0IGZ1c2VfYXJnICphcmdzKQoreworCXVuc2lnbmVkIG5ieXRlcyA9IDA7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1hcmdzOyBpKyspCisJCW5ieXRlcyArPSBhcmdzW2ldLnNpemU7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9yZXF1ZXN0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3sKKwlmYy0+cmVxY3RyKys7CisJLyogemVybyBpcyBzcGVjaWFsICovCisJaWYgKGZjLT5yZXFjdHIgPT0gMCkKKwkJZmMtPnJlcWN0ciA9IDE7CisJcmVxLT5pbi5oLnVuaXF1ZSA9IGZjLT5yZXFjdHI7CisJcmVxLT5pbi5oLmxlbiA9IHNpemVvZihzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIpICsKKwkJbGVuX2FyZ3MocmVxLT5pbi5udW1hcmdzLCAoc3RydWN0IGZ1c2VfYXJnICopIHJlcS0+aW4uYXJncyk7CisJaWYgKCFyZXEtPnByZWFsbG9jYXRlZCkgeworCQkvKiBJZiByZXF1ZXN0IGlzIG5vdCBwcmVhbGxvY2F0ZWQgKGVpdGhlciBGT1JHRVQgb3IKKwkJICAgUkVMRUFTRSksIHRoZW4gc3RpbGwgZGVjcmVhc2Ugb3V0c3RhbmRpbmdfc2VtLCBzbworCQkgICB1c2VyIGNhbid0IG9wZW4gaW5maW5pdGUgbnVtYmVyIG9mIGZpbGVzIHdoaWxlIG5vdAorCQkgICBwcm9jZXNzaW5nIHRoZSBSRUxFQVNFIHJlcXVlc3RzLiAgSG93ZXZlciBmb3IKKwkJICAgZWZmaWNpZW5jeSBkbyBpdCB3aXRob3V0IGJsb2NraW5nLCBzbyBpZiBkb3duKCkKKwkJICAgd291bGQgYmxvY2ssIGp1c3QgaW5jcmVhc2UgdGhlIGRlYnQgaW5zdGVhZCAqLworCQlpZiAoZG93bl90cnlsb2NrKCZmYy0+b3V0c3RhbmRpbmdfc2VtKSkKKwkJCWZjLT5vdXRzdGFuZGluZ19kZWJ0Kys7CisJfQorCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJmZjLT5wZW5kaW5nKTsKKwl3YWtlX3VwKCZmYy0+d2FpdHEpOworfQorCisvKgorICogVGhpcyBjYW4gb25seSBiZSBpbnRlcnJ1cHRlZCBieSBhIFNJR0tJTEwKKyAqLwordm9pZCByZXF1ZXN0X3NlbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCXJlcS0+aXNyZXBseSA9IDE7CisJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCWlmICghZmMtPmNvbm5lY3RlZCkKKwkJcmVxLT5vdXQuaC5lcnJvciA9IC1FTk9UQ09OTjsKKwllbHNlIGlmIChmYy0+Y29ubl9lcnJvcikKKwkJcmVxLT5vdXQuaC5lcnJvciA9IC1FQ09OTlJFRlVTRUQ7CisJZWxzZSB7CisJCXF1ZXVlX3JlcXVlc3QoZmMsIHJlcSk7CisJCS8qIGFjcXVpcmUgZXh0cmEgcmVmZXJlbmNlLCBzaW5jZSByZXF1ZXN0IGlzIHN0aWxsIG5lZWRlZAorCQkgICBhZnRlciByZXF1ZXN0X2VuZCgpICovCisJCV9fZnVzZV9nZXRfcmVxdWVzdChyZXEpOworCisJCXJlcXVlc3Rfd2FpdF9hbnN3ZXIoZmMsIHJlcSk7CisJfQorCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworfQorCitzdGF0aWMgdm9pZCByZXF1ZXN0X3NlbmRfbm93YWl0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3sKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJaWYgKGZjLT5jb25uZWN0ZWQpIHsKKwkJcXVldWVfcmVxdWVzdChmYywgcmVxKTsKKwkJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisJfSBlbHNlIHsKKwkJcmVxLT5vdXQuaC5lcnJvciA9IC1FTk9UQ09OTjsKKwkJcmVxdWVzdF9lbmQoZmMsIHJlcSk7CisJfQorfQorCit2b2lkIHJlcXVlc3Rfc2VuZF9ub3JlcGx5KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3sKKwlyZXEtPmlzcmVwbHkgPSAwOworCXJlcXVlc3Rfc2VuZF9ub3dhaXQoZmMsIHJlcSk7Cit9CisKK3ZvaWQgcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCXJlcS0+aXNyZXBseSA9IDE7CisJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCWJhY2tncm91bmRfcmVxdWVzdChmYywgcmVxKTsKKwlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwlyZXF1ZXN0X3NlbmRfbm93YWl0KGZjLCByZXEpOworfQorCit2b2lkIGZ1c2Vfc2VuZF9pbml0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQoreworCS8qIFRoaXMgaXMgY2FsbGVkIGZyb20gZnVzZV9yZWFkX3N1cGVyKCkgc28gdGhlcmUncyBndWFyYW50ZWVkCisJICAgdG8gYmUgYSByZXF1ZXN0IGF2YWlsYWJsZSAqLworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZG9fZ2V0X3JlcXVlc3QoZmMpOworCXN0cnVjdCBmdXNlX2luaXRfaW5fb3V0ICphcmcgPSAmcmVxLT5taXNjLmluaXRfaW5fb3V0OworCWFyZy0+bWFqb3IgPSBGVVNFX0tFUk5FTF9WRVJTSU9OOworCWFyZy0+bWlub3IgPSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OOworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0lOSVQ7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZigqYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBhcmc7CisJcmVxLT5vdXQubnVtYXJncyA9IDE7CisJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKCphcmcpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSBhcmc7CisJcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoZmMsIHJlcSk7Cit9CisKKy8qCisgKiBMb2NrIHRoZSByZXF1ZXN0LiAgVXAgdG8gdGhlIG5leHQgdW5sb2NrX3JlcXVlc3QoKSB0aGVyZSBtdXN0bid0IGJlCisgKiBhbnl0aGluZyB0aGF0IGNvdWxkIGNhdXNlIGEgcGFnZS1mYXVsdC4gIElmIHRoZSByZXF1ZXN0IHdhcyBhbHJlYWR5CisgKiBpbnRlcnJ1cHRlZCBiYWlsIG91dC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbG9ja19yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCWludCBlcnIgPSAwOworCWlmIChyZXEpIHsKKwkJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCQlpZiAocmVxLT5pbnRlcnJ1cHRlZCkKKwkJCWVyciA9IC1FTk9FTlQ7CisJCWVsc2UKKwkJCXJlcS0+bG9ja2VkID0gMTsKKwkJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBVbmxvY2sgcmVxdWVzdC4gIElmIGl0IHdhcyBpbnRlcnJ1cHRlZCBkdXJpbmcgYmVpbmcgbG9ja2VkLCB0aGUKKyAqIHJlcXVlc3RlciB0aHJlYWQgaXMgY3VycmVudGx5IHdhaXRpbmcgZm9yIGl0IHRvIGJlIHVubG9ja2VkLCBzbworICogd2FrZSBpdCB1cC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVubG9ja19yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCWlmIChyZXEpIHsKKwkJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCQlyZXEtPmxvY2tlZCA9IDA7CisJCWlmIChyZXEtPmludGVycnVwdGVkKQorCQkJd2FrZV91cCgmcmVxLT53YWl0cSk7CisJCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCX0KK30KKworc3RydWN0IGZ1c2VfY29weV9zdGF0ZSB7CisJaW50IHdyaXRlOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92OworCXVuc2lnbmVkIGxvbmcgbnJfc2VnczsKKwl1bnNpZ25lZCBsb25nIHNlZ2xlbjsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJc3RydWN0IHBhZ2UgKnBnOworCXZvaWQgKm1hcGFkZHI7CisJdm9pZCAqYnVmOworCXVuc2lnbmVkIGxlbjsKK307CisKK3N0YXRpYyB2b2lkIGZ1c2VfY29weV9pbml0KHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzLCBpbnQgd3JpdGUsCisJCQkgICBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCQkgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCit7CisJbWVtc2V0KGNzLCAwLCBzaXplb2YoKmNzKSk7CisJY3MtPndyaXRlID0gd3JpdGU7CisJY3MtPnJlcSA9IHJlcTsKKwljcy0+aW92ID0gaW92OworCWNzLT5ucl9zZWdzID0gbnJfc2VnczsKK30KKworLyogVW5tYXAgYW5kIHB1dCBwcmV2aW91cyBwYWdlIG9mIHVzZXJzcGFjZSBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmdXNlX2NvcHlfZmluaXNoKHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzKQoreworCWlmIChjcy0+bWFwYWRkcikgeworCQlrdW5tYXBfYXRvbWljKGNzLT5tYXBhZGRyLCBLTV9VU0VSMCk7CisJCWlmIChjcy0+d3JpdGUpIHsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKGNzLT5wZyk7CisJCQlzZXRfcGFnZV9kaXJ0eV9sb2NrKGNzLT5wZyk7CisJCX0KKwkJcHV0X3BhZ2UoY3MtPnBnKTsKKwkJY3MtPm1hcGFkZHIgPSBOVUxMOworCX0KK30KKworLyoKKyAqIEdldCBhbm90aGVyIHBhZ2VmdWxsIG9mIHVzZXJzcGFjZSBidWZmZXIsIGFuZCBtYXAgaXQgdG8ga2VybmVsCisgKiBhZGRyZXNzIHNwYWNlLCBhbmQgbG9jayByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgZnVzZV9jb3B5X2ZpbGwoc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJaW50IGVycjsKKworCXVubG9ja19yZXF1ZXN0KGNzLT5yZXEpOworCWZ1c2VfY29weV9maW5pc2goY3MpOworCWlmICghY3MtPnNlZ2xlbikgeworCQlCVUdfT04oIWNzLT5ucl9zZWdzKTsKKwkJY3MtPnNlZ2xlbiA9IGNzLT5pb3ZbMF0uaW92X2xlbjsKKwkJY3MtPmFkZHIgPSAodW5zaWduZWQgbG9uZykgY3MtPmlvdlswXS5pb3ZfYmFzZTsKKwkJY3MtPmlvdiArKzsKKwkJY3MtPm5yX3NlZ3MgLS07CisJfQorCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwllcnIgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgY3MtPmFkZHIsIDEsIGNzLT53cml0ZSwgMCwKKwkJCSAgICAgJmNzLT5wZywgTlVMTCk7CisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlCVUdfT04oZXJyICE9IDEpOworCW9mZnNldCA9IGNzLT5hZGRyICUgUEFHRV9TSVpFOworCWNzLT5tYXBhZGRyID0ga21hcF9hdG9taWMoY3MtPnBnLCBLTV9VU0VSMCk7CisJY3MtPmJ1ZiA9IGNzLT5tYXBhZGRyICsgb2Zmc2V0OworCWNzLT5sZW4gPSBtaW4oUEFHRV9TSVpFIC0gb2Zmc2V0LCBjcy0+c2VnbGVuKTsKKwljcy0+c2VnbGVuIC09IGNzLT5sZW47CisJY3MtPmFkZHIgKz0gY3MtPmxlbjsKKworCXJldHVybiBsb2NrX3JlcXVlc3QoY3MtPnJlcSk7Cit9CisKKy8qIERvIGFzIG11Y2ggY29weSB0by9mcm9tIHVzZXJzcGFjZSBidWZmZXIgYXMgd2UgY2FuICovCitzdGF0aWMgaW5saW5lIGludCBmdXNlX2NvcHlfZG8oc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsIHZvaWQgKip2YWwsCisJCQkgICAgICAgdW5zaWduZWQgKnNpemUpCit7CisJdW5zaWduZWQgbmNweSA9IG1pbigqc2l6ZSwgY3MtPmxlbik7CisJaWYgKHZhbCkgeworCQlpZiAoY3MtPndyaXRlKQorCQkJbWVtY3B5KGNzLT5idWYsICp2YWwsIG5jcHkpOworCQllbHNlCisJCQltZW1jcHkoKnZhbCwgY3MtPmJ1ZiwgbmNweSk7CisJCSp2YWwgKz0gbmNweTsKKwl9CisJKnNpemUgLT0gbmNweTsKKwljcy0+bGVuIC09IG5jcHk7CisJY3MtPmJ1ZiArPSBuY3B5OworCXJldHVybiBuY3B5OworfQorCisvKgorICogQ29weSBhIHBhZ2UgaW4gdGhlIHJlcXVlc3QgdG8vZnJvbSB0aGUgdXNlcnNwYWNlIGJ1ZmZlci4gIE11c3QgYmUKKyAqIGRvbmUgYXRvbWljYWxseQorICovCitzdGF0aWMgaW5saW5lIGludCBmdXNlX2NvcHlfcGFnZShzdHJ1Y3QgZnVzZV9jb3B5X3N0YXRlICpjcywgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgY291bnQsIGludCB6ZXJvaW5nKQoreworCWlmIChwYWdlICYmIHplcm9pbmcgJiYgY291bnQgPCBQQUdFX1NJWkUpIHsKKwkJdm9pZCAqbWFwYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIxKTsKKwkJbWVtc2V0KG1hcGFkZHIsIDAsIFBBR0VfU0laRSk7CisJCWt1bm1hcF9hdG9taWMobWFwYWRkciwgS01fVVNFUjEpOworCX0KKwl3aGlsZSAoY291bnQpIHsKKwkJaW50IGVycjsKKwkJaWYgKCFjcy0+bGVuICYmIChlcnIgPSBmdXNlX2NvcHlfZmlsbChjcykpKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKHBhZ2UpIHsKKwkJCXZvaWQgKm1hcGFkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMSk7CisJCQl2b2lkICpidWYgPSBtYXBhZGRyICsgb2Zmc2V0OworCQkJb2Zmc2V0ICs9IGZ1c2VfY29weV9kbyhjcywgJmJ1ZiwgJmNvdW50KTsKKwkJCWt1bm1hcF9hdG9taWMobWFwYWRkciwgS01fVVNFUjEpOworCQl9IGVsc2UKKwkJCW9mZnNldCArPSBmdXNlX2NvcHlfZG8oY3MsIE5VTEwsICZjb3VudCk7CisJfQorCWlmIChwYWdlICYmICFjcy0+d3JpdGUpCisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCXJldHVybiAwOworfQorCisvKiBDb3B5IHBhZ2VzIGluIHRoZSByZXF1ZXN0IHRvL2Zyb20gdXNlcnNwYWNlIGJ1ZmZlciAqLworc3RhdGljIGludCBmdXNlX2NvcHlfcGFnZXMoc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsIHVuc2lnbmVkIG5ieXRlcywKKwkJCSAgIGludCB6ZXJvaW5nKQoreworCXVuc2lnbmVkIGk7CisJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBjcy0+cmVxOworCXVuc2lnbmVkIG9mZnNldCA9IHJlcS0+cGFnZV9vZmZzZXQ7CisJdW5zaWduZWQgY291bnQgPSBtaW4obmJ5dGVzLCAodW5zaWduZWQpIFBBR0VfU0laRSAtIG9mZnNldCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVxLT5udW1fcGFnZXMgJiYgKG5ieXRlcyB8fCB6ZXJvaW5nKTsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcmVxLT5wYWdlc1tpXTsKKwkJaW50IGVyciA9IGZ1c2VfY29weV9wYWdlKGNzLCBwYWdlLCBvZmZzZXQsIGNvdW50LCB6ZXJvaW5nKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJbmJ5dGVzIC09IGNvdW50OworCQljb3VudCA9IG1pbihuYnl0ZXMsICh1bnNpZ25lZCkgUEFHRV9TSVpFKTsKKwkJb2Zmc2V0ID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENvcHkgYSBzaW5nbGUgYXJndW1lbnQgaW4gdGhlIHJlcXVlc3QgdG8vZnJvbSB1c2Vyc3BhY2UgYnVmZmVyICovCitzdGF0aWMgaW50IGZ1c2VfY29weV9vbmUoc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsIHZvaWQgKnZhbCwgdW5zaWduZWQgc2l6ZSkKK3sKKwl3aGlsZSAoc2l6ZSkgeworCQlpbnQgZXJyOworCQlpZiAoIWNzLT5sZW4gJiYgKGVyciA9IGZ1c2VfY29weV9maWxsKGNzKSkpCisJCQlyZXR1cm4gZXJyOworCQlmdXNlX2NvcHlfZG8oY3MsICZ2YWwsICZzaXplKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENvcHkgcmVxdWVzdCBhcmd1bWVudHMgdG8vZnJvbSB1c2Vyc3BhY2UgYnVmZmVyICovCitzdGF0aWMgaW50IGZ1c2VfY29weV9hcmdzKHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzLCB1bnNpZ25lZCBudW1hcmdzLAorCQkJICB1bnNpZ25lZCBhcmdwYWdlcywgc3RydWN0IGZ1c2VfYXJnICphcmdzLAorCQkJICBpbnQgemVyb2luZykKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgIWVyciAmJiBpIDwgbnVtYXJnczsgaSsrKSAgeworCQlzdHJ1Y3QgZnVzZV9hcmcgKmFyZyA9ICZhcmdzW2ldOworCQlpZiAoaSA9PSBudW1hcmdzIC0gMSAmJiBhcmdwYWdlcykKKwkJCWVyciA9IGZ1c2VfY29weV9wYWdlcyhjcywgYXJnLT5zaXplLCB6ZXJvaW5nKTsKKwkJZWxzZQorCQkJZXJyID0gZnVzZV9jb3B5X29uZShjcywgYXJnLT52YWx1ZSwgYXJnLT5zaXplKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogV2FpdCB1bnRpbCBhIHJlcXVlc3QgaXMgYXZhaWxhYmxlIG9uIHRoZSBwZW5kaW5nIGxpc3QgKi8KK3N0YXRpYyB2b2lkIHJlcXVlc3Rfd2FpdChzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSgmZmMtPndhaXRxLCAmd2FpdCk7CisJd2hpbGUgKGZjLT5tb3VudGVkICYmIGxpc3RfZW1wdHkoJmZjLT5wZW5kaW5nKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKworCQlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZmYy0+d2FpdHEsICZ3YWl0KTsKK30KKworLyoKKyAqIFJlYWQgYSBzaW5nbGUgcmVxdWVzdCBpbnRvIHRoZSB1c2Vyc3BhY2UgZmlsZXN5c3RlbSdzIGJ1ZmZlci4gIFRoaXMKKyAqIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGEgcmVxdWVzdCBpcyBhdmFpbGFibGUsIHRoZW4gcmVtb3ZlcyBpdCBmcm9tCisgKiB0aGUgcGVuZGluZyBsaXN0IGFuZCBjb3BpZXMgcmVxdWVzdCBkYXRhIHRvIHVzZXJzcGFjZSBidWZmZXIuICBJZgorICogbm8gcmVwbHkgaXMgbmVlZGVkIChGT1JHRVQpIG9yIHJlcXVlc3QgaGFzIGJlZW4gaW50ZXJydXB0ZWQgb3IKKyAqIHRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgdGhlIGNvcHlpbmcgdGhlbiBpdCdzIGZpbmlzaGVkIGJ5IGNhbGxpbmcKKyAqIHJlcXVlc3RfZW5kKCkuICBPdGhlcndpc2UgYWRkIGl0IHRvIHRoZSBwcm9jZXNzaW5nIGxpc3QsIGFuZCBzZXQKKyAqIHRoZSAnc2VudCcgZmxhZy4KKyAqLworc3RhdGljIHNzaXplX3QgZnVzZV9kZXZfcmVhZHYoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgKm9mZikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCXN0cnVjdCBmdXNlX2luICppbjsKKwlzdHJ1Y3QgZnVzZV9jb3B5X3N0YXRlIGNzOworCXVuc2lnbmVkIHJlcXNpemU7CisKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJZmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJZXJyID0gLUVQRVJNOworCWlmICghZmMpCisJCWdvdG8gZXJyX3VubG9jazsKKwlyZXF1ZXN0X3dhaXQoZmMpOworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFmYy0+bW91bnRlZCkKKwkJZ290byBlcnJfdW5sb2NrOworCWVyciA9IC1FUkVTVEFSVFNZUzsKKwlpZiAobGlzdF9lbXB0eSgmZmMtPnBlbmRpbmcpKQorCQlnb3RvIGVycl91bmxvY2s7CisKKwlyZXEgPSBsaXN0X2VudHJ5KGZjLT5wZW5kaW5nLm5leHQsIHN0cnVjdCBmdXNlX3JlcSwgbGlzdCk7CisJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKKwlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKworCWluID0gJnJlcS0+aW47CisJcmVxc2l6ZSA9IHJlcS0+aW4uaC5sZW47CisJZnVzZV9jb3B5X2luaXQoJmNzLCAxLCByZXEsIGlvdiwgbnJfc2Vncyk7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpID49IHJlcXNpemUpIHsKKwkJZXJyID0gZnVzZV9jb3B5X29uZSgmY3MsICZpbi0+aCwgc2l6ZW9mKGluLT5oKSk7CisJCWlmICghZXJyKQorCQkJZXJyID0gZnVzZV9jb3B5X2FyZ3MoJmNzLCBpbi0+bnVtYXJncywgaW4tPmFyZ3BhZ2VzLAorCQkJCQkgICAgIChzdHJ1Y3QgZnVzZV9hcmcgKikgaW4tPmFyZ3MsIDApOworCX0KKwlmdXNlX2NvcHlfZmluaXNoKCZjcyk7CisKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJcmVxLT5sb2NrZWQgPSAwOworCWlmICghZXJyICYmIHJlcS0+aW50ZXJydXB0ZWQpCisJCWVyciA9IC1FTk9FTlQ7CisJaWYgKGVycikgeworCQlpZiAoIXJlcS0+aW50ZXJydXB0ZWQpCisJCQlyZXEtPm91dC5oLmVycm9yID0gLUVJTzsKKwkJcmVxdWVzdF9lbmQoZmMsIHJlcSk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICghcmVxLT5pc3JlcGx5KQorCQlyZXF1ZXN0X2VuZChmYywgcmVxKTsKKwllbHNlIHsKKwkJcmVxLT5zZW50ID0gMTsKKwkJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmZmMtPnByb2Nlc3NpbmcpOworCQlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwl9CisJcmV0dXJuIHJlcXNpemU7CisKKyBlcnJfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZGV2X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqb2ZmKQoreworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJaW92Lmlvdl9sZW4gPSBuYnl0ZXM7CisJaW92Lmlvdl9iYXNlID0gYnVmOworCXJldHVybiBmdXNlX2Rldl9yZWFkdihmaWxlLCAmaW92LCAxLCBvZmYpOworfQorCisvKiBMb29rIHVwIHJlcXVlc3Qgb24gcHJvY2Vzc2luZyBsaXN0IGJ5IHVuaXF1ZSBJRCAqLworc3RhdGljIHN0cnVjdCBmdXNlX3JlcSAqcmVxdWVzdF9maW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCB1NjQgdW5pcXVlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmZjLT5wcm9jZXNzaW5nKSB7CisJCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCQlyZXEgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZnVzZV9yZXEsIGxpc3QpOworCQlpZiAocmVxLT5pbi5oLnVuaXF1ZSA9PSB1bmlxdWUpCisJCQlyZXR1cm4gcmVxOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBjb3B5X291dF9hcmdzKHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzLCBzdHJ1Y3QgZnVzZV9vdXQgKm91dCwKKwkJCSB1bnNpZ25lZCBuYnl0ZXMpCit7CisJdW5zaWduZWQgcmVxc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9vdXRfaGVhZGVyKTsKKworCWlmIChvdXQtPmguZXJyb3IpCisJCXJldHVybiBuYnl0ZXMgIT0gcmVxc2l6ZSA/IC1FSU5WQUwgOiAwOworCisJcmVxc2l6ZSArPSBsZW5fYXJncyhvdXQtPm51bWFyZ3MsIG91dC0+YXJncyk7CisKKwlpZiAocmVxc2l6ZSA8IG5ieXRlcyB8fCAocmVxc2l6ZSA+IG5ieXRlcyAmJiAhb3V0LT5hcmd2YXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmIChyZXFzaXplID4gbmJ5dGVzKSB7CisJCXN0cnVjdCBmdXNlX2FyZyAqbGFzdGFyZyA9ICZvdXQtPmFyZ3Nbb3V0LT5udW1hcmdzLTFdOworCQl1bnNpZ25lZCBkaWZmc2l6ZSA9IHJlcXNpemUgLSBuYnl0ZXM7CisJCWlmIChkaWZmc2l6ZSA+IGxhc3RhcmctPnNpemUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbGFzdGFyZy0+c2l6ZSAtPSBkaWZmc2l6ZTsKKwl9CisJcmV0dXJuIGZ1c2VfY29weV9hcmdzKGNzLCBvdXQtPm51bWFyZ3MsIG91dC0+YXJncGFnZXMsIG91dC0+YXJncywKKwkJCSAgICAgIG91dC0+cGFnZV96ZXJvaW5nKTsKK30KKworLyoKKyAqIFdyaXRlIGEgc2luZ2xlIHJlcGx5IHRvIGEgcmVxdWVzdC4gIEZpcnN0IHRoZSBoZWFkZXIgaXMgY29waWVkIGZyb20KKyAqIHRoZSB3cml0ZSBidWZmZXIuICBUaGUgcmVxdWVzdCBpcyB0aGVuIHNlYXJjaGVkIG9uIHRoZSBwcm9jZXNzaW5nCisgKiBsaXN0IGJ5IHRoZSB1bmlxdWUgSUQgZm91bmQgaW4gdGhlIGhlYWRlci4gIElmIGZvdW5kLCB0aGVuIHJlbW92ZQorICogaXQgZnJvbSB0aGUgbGlzdCBhbmQgY29weSB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyIHRvIHRoZSByZXF1ZXN0LgorICogVGhlIHJlcXVlc3QgaXMgZmluaXNoZWQgYnkgY2FsbGluZyByZXF1ZXN0X2VuZCgpCisgKi8KK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZGV2X3dyaXRldihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgKm9mZikKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIG5ieXRlcyA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKwlzdHJ1Y3QgZnVzZV9vdXRfaGVhZGVyIG9oOworCXN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgY3M7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBmdXNlX2dldF9jb25uKGZpbGUpOworCWlmICghZmMpCisJCXJldHVybiAtRU5PREVWOworCisJZnVzZV9jb3B5X2luaXQoJmNzLCAwLCBOVUxMLCBpb3YsIG5yX3NlZ3MpOworCWlmIChuYnl0ZXMgPCBzaXplb2Yoc3RydWN0IGZ1c2Vfb3V0X2hlYWRlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gZnVzZV9jb3B5X29uZSgmY3MsICZvaCwgc2l6ZW9mKG9oKSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZmluaXNoOworCWVyciA9IC1FSU5WQUw7CisJaWYgKCFvaC51bmlxdWUgfHwgb2guZXJyb3IgPD0gLTEwMDAgfHwgb2guZXJyb3IgPiAwIHx8CisJICAgIG9oLmxlbiAhPSBuYnl0ZXMpCisJCWdvdG8gZXJyX2ZpbmlzaDsKKworCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKKwlyZXEgPSByZXF1ZXN0X2ZpbmQoZmMsIG9oLnVuaXF1ZSk7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIXJlcSkKKwkJZ290byBlcnJfdW5sb2NrOworCisJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKKwlpZiAocmVxLT5pbnRlcnJ1cHRlZCkgeworCQlyZXF1ZXN0X2VuZChmYywgcmVxKTsKKwkJZnVzZV9jb3B5X2ZpbmlzaCgmY3MpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJcmVxLT5vdXQuaCA9IG9oOworCXJlcS0+bG9ja2VkID0gMTsKKwljcy5yZXEgPSByZXE7CisJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisKKwllcnIgPSBjb3B5X291dF9hcmdzKCZjcywgJnJlcS0+b3V0LCBuYnl0ZXMpOworCWZ1c2VfY29weV9maW5pc2goJmNzKTsKKworCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKKwlyZXEtPmxvY2tlZCA9IDA7CisJaWYgKCFlcnIpIHsKKwkJaWYgKHJlcS0+aW50ZXJydXB0ZWQpCisJCQllcnIgPSAtRU5PRU5UOworCX0gZWxzZSBpZiAoIXJlcS0+aW50ZXJydXB0ZWQpCisJCXJlcS0+b3V0LmguZXJyb3IgPSAtRUlPOworCXJlcXVlc3RfZW5kKGZjLCByZXEpOworCisJcmV0dXJuIGVyciA/IGVyciA6IG5ieXRlczsKKworIGVycl91bmxvY2s6CisJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisgZXJyX2ZpbmlzaDoKKwlmdXNlX2NvcHlfZmluaXNoKCZjcyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNzaXplX3QgZnVzZV9kZXZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKm9mZikKK3sKKwlzdHJ1Y3QgaW92ZWMgaW92OworCWlvdi5pb3ZfbGVuID0gbmJ5dGVzOworCWlvdi5pb3ZfYmFzZSA9IChjaGFyIF9fdXNlciAqKSBidWY7CisJcmV0dXJuIGZ1c2VfZGV2X3dyaXRldihmaWxlLCAmaW92LCAxLCBvZmYpOworfQorCitzdGF0aWMgdW5zaWduZWQgZnVzZV9kZXZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGZ1c2VfZ2V0X2Nvbm4oZmlsZSk7CisJdW5zaWduZWQgbWFzayA9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisJaWYgKCFmYykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmZjLT53YWl0cSwgd2FpdCk7CisKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZmYy0+cGVuZGluZykpCisgICAgICAgICAgICAgICAgbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qIEFib3J0IGFsbCByZXF1ZXN0cyBvbiB0aGUgZ2l2ZW4gbGlzdCAocGVuZGluZyBvciBwcm9jZXNzaW5nKSAqLworc3RhdGljIHZvaWQgZW5kX3JlcXVlc3RzKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgeworCQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKwkJcmVxID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgZnVzZV9yZXEsIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOworCQlyZXEtPm91dC5oLmVycm9yID0gLUVDT05OQUJPUlRFRDsKKwkJcmVxdWVzdF9lbmQoZmMsIHJlcSk7CisJCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9kZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYzsKKworCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKKwlmYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoZmMpIHsKKwkJZmMtPmNvbm5lY3RlZCA9IDA7CisJCWVuZF9yZXF1ZXN0cyhmYywgJmZjLT5wZW5kaW5nKTsKKwkJZW5kX3JlcXVlc3RzKGZjLCAmZmMtPnByb2Nlc3NpbmcpOworCQlmdXNlX3JlbGVhc2VfY29ubihmYyk7CisJfQorCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGV2X29wZXJhdGlvbnMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGZ1c2VfZGV2X3JlYWQsCisJLnJlYWR2CQk9IGZ1c2VfZGV2X3JlYWR2LAorCS53cml0ZQkJPSBmdXNlX2Rldl93cml0ZSwKKwkud3JpdGV2CQk9IGZ1c2VfZGV2X3dyaXRldiwKKwkucG9sbAkJPSBmdXNlX2Rldl9wb2xsLAorCS5yZWxlYXNlCT0gZnVzZV9kZXZfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBmdXNlX21pc2NkZXZpY2UgPSB7CisJLm1pbm9yID0gRlVTRV9NSU5PUiwKKwkubmFtZSAgPSAiZnVzZSIsCisJLmZvcHMgPSAmZnVzZV9kZXZfb3BlcmF0aW9ucywKK307CisKK2ludCBfX2luaXQgZnVzZV9kZXZfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSAtRU5PTUVNOworCWZ1c2VfcmVxX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJmdXNlX3JlcXVlc3QiLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBmdXNlX3JlcSksCisJCQkJCSAgICAwLCAwLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWZ1c2VfcmVxX2NhY2hlcCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBtaXNjX3JlZ2lzdGVyKCZmdXNlX21pc2NkZXZpY2UpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2NhY2hlX2NsZWFuOworCisJcmV0dXJuIDA7CisKKyBvdXRfY2FjaGVfY2xlYW46CisJa21lbV9jYWNoZV9kZXN0cm95KGZ1c2VfcmVxX2NhY2hlcCk7Cisgb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgZnVzZV9kZXZfY2xlYW51cCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmZnVzZV9taXNjZGV2aWNlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koZnVzZV9yZXFfY2FjaGVwKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGlyLmMgYi9mcy9mdXNlL2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OWU0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mdXNlL2Rpci5jCkBAIC0wLDAgKzEsOTgyIEBACisvKgorICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQorICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorCisgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgorICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KKyovCisKKyNpbmNsdWRlICJmdXNlX2kuaCIKKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdGltZV90b19qaWZmaWVzKHVuc2lnbmVkIGxvbmcgc2VjLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBuc2VjKQoreworCXN0cnVjdCB0aW1lc3BlYyB0cyA9IHtzZWMsIG5zZWN9OworCXJldHVybiBqaWZmaWVzICsgdGltZXNwZWNfdG9famlmZmllcygmdHMpOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2xvb2t1cF9pbml0KHN0cnVjdCBmdXNlX3JlcSAqcmVxLCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCSAgICAgc3RydWN0IGRlbnRyeSAqZW50cnksCisJCQkgICAgIHN0cnVjdCBmdXNlX2VudHJ5X291dCAqb3V0YXJnKQoreworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0xPT0tVUDsKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoZGlyKTsKKwlyZXEtPmlub2RlID0gZGlyOworCXJlcS0+aW4ubnVtYXJncyA9IDE7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBlbnRyeS0+ZF9uYW1lLmxlbiArIDE7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gZW50cnktPmRfbmFtZS5uYW1lOworCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSBvdXRhcmc7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9kZW50cnlfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaWYgKCFlbnRyeS0+ZF9pbm9kZSB8fCBpc19iYWRfaW5vZGUoZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGVudHJ5LT5kX3RpbWUpKSB7CisJCWludCBlcnI7CisJCXN0cnVjdCBmdXNlX2VudHJ5X291dCBvdXRhcmc7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKwkJc3RydWN0IGZ1c2VfaW5vZGUgKmZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOworCQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCQlpZiAoIXJlcSkKKwkJCXJldHVybiAwOworCisJCWZ1c2VfbG9va3VwX2luaXQocmVxLCBlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUsIGVudHJ5LCAmb3V0YXJnKTsKKwkJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCQllcnIgPSByZXEtPm91dC5oLmVycm9yOworCQlpZiAoIWVycikgeworCQkJaWYgKG91dGFyZy5ub2RlaWQgIT0gZ2V0X25vZGVfaWQoaW5vZGUpKSB7CisJCQkJZnVzZV9zZW5kX2ZvcmdldChmYywgcmVxLCBvdXRhcmcubm9kZWlkLCAxKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWZpLT5ubG9va3VwICsrOworCQl9CisJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJCWlmIChlcnIgfHwgKG91dGFyZy5hdHRyLm1vZGUgXiBpbm9kZS0+aV9tb2RlKSAmIFNfSUZNVCkKKwkJCXJldHVybiAwOworCisJCWZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXMoaW5vZGUsICZvdXRhcmcuYXR0cik7CisJCWVudHJ5LT5kX3RpbWUgPSB0aW1lX3RvX2ppZmZpZXMob3V0YXJnLmVudHJ5X3ZhbGlkLAorCQkJCQkJb3V0YXJnLmVudHJ5X3ZhbGlkX25zZWMpOworCQlmaS0+aV90aW1lID0gdGltZV90b19qaWZmaWVzKG91dGFyZy5hdHRyX3ZhbGlkLAorCQkJCQkgICAgIG91dGFyZy5hdHRyX3ZhbGlkX25zZWMpOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBmdXNlX2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX3JldmFsaWRhdGUJPSBmdXNlX2RlbnRyeV9yZXZhbGlkYXRlLAorfTsKKworc3RhdGljIGludCBmdXNlX2xvb2t1cF9pZ2V0KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwKKwkJCSAgICBzdHJ1Y3QgaW5vZGUgKippbm9kZXApCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgb3V0YXJnOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihkaXIpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCisJaWYgKGVudHJ5LT5kX25hbWUubGVuID4gRlVTRV9OQU1FX01BWCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwlyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCWZ1c2VfbG9va3VwX2luaXQocmVxLCBkaXIsIGVudHJ5LCAmb3V0YXJnKTsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlpZiAoIWVycikgeworCQlpbm9kZSA9IGZ1c2VfaWdldChkaXItPmlfc2IsIG91dGFyZy5ub2RlaWQsIG91dGFyZy5nZW5lcmF0aW9uLAorCQkJCSAgJm91dGFyZy5hdHRyKTsKKwkJaWYgKCFpbm9kZSkgeworCQkJZnVzZV9zZW5kX2ZvcmdldChmYywgcmVxLCBvdXRhcmcubm9kZWlkLCAxKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0VOVCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChpbm9kZSkgeworCQlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShpbm9kZSk7CisJCWVudHJ5LT5kX3RpbWUgPQl0aW1lX3RvX2ppZmZpZXMob3V0YXJnLmVudHJ5X3ZhbGlkLAorCQkJCQkJb3V0YXJnLmVudHJ5X3ZhbGlkX25zZWMpOworCQlmaS0+aV90aW1lID0gdGltZV90b19qaWZmaWVzKG91dGFyZy5hdHRyX3ZhbGlkLAorCQkJCQkgICAgIG91dGFyZy5hdHRyX3ZhbGlkX25zZWMpOworCX0KKworCWVudHJ5LT5kX29wID0gJmZ1c2VfZGVudHJ5X29wZXJhdGlvbnM7CisJKmlub2RlcCA9IGlub2RlOworCXJldHVybiAwOworfQorCit2b2lkIGZ1c2VfaW52YWxpZGF0ZV9hdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpLT5pX3RpbWUgPSBqaWZmaWVzIC0gMTsKK30KKworc3RhdGljIHZvaWQgZnVzZV9pbnZhbGlkYXRlX2VudHJ5KHN0cnVjdCBkZW50cnkgKmVudHJ5KQoreworCWRfaW52YWxpZGF0ZShlbnRyeSk7CisJZW50cnktPmRfdGltZSA9IGppZmZpZXMgLSAxOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9uZXdfZW50cnkoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxLAorCQkJICAgIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwKKwkJCSAgICBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgb3V0YXJnOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGZ1c2VfaW5vZGUgKmZpOworCWludCBlcnI7CisKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoZGlyKTsKKwlyZXEtPmlub2RlID0gZGlyOworCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCWlmIChlcnIpIHsKKwkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaW5vZGUgPSBmdXNlX2lnZXQoZGlyLT5pX3NiLCBvdXRhcmcubm9kZWlkLCBvdXRhcmcuZ2VuZXJhdGlvbiwKKwkJCSAgJm91dGFyZy5hdHRyKTsKKwlpZiAoIWlub2RlKSB7CisJCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIHJlcSwgb3V0YXJnLm5vZGVpZCwgMSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCisJLyogRG9uJ3QgYWxsb3cgdXNlcnNwYWNlIHRvIGRvIHJlYWxseSBzdHVwaWQgdGhpbmdzLi4uICovCisJaWYgKChpbm9kZS0+aV9tb2RlIF4gbW9kZSkgJiBTX0lGTVQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWVudHJ5LT5kX3RpbWUgPSB0aW1lX3RvX2ppZmZpZXMob3V0YXJnLmVudHJ5X3ZhbGlkLAorCQkJCQlvdXRhcmcuZW50cnlfdmFsaWRfbnNlYyk7CisKKwlmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwlmaS0+aV90aW1lID0gdGltZV90b19qaWZmaWVzKG91dGFyZy5hdHRyX3ZhbGlkLAorCQkJCSAgICAgb3V0YXJnLmF0dHJfdmFsaWRfbnNlYyk7CisKKwlkX2luc3RhbnRpYXRlKGVudHJ5LCBpbm9kZSk7CisJZnVzZV9pbnZhbGlkYXRlX2F0dHIoZGlyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdXNlX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgaW50IG1vZGUsCisJCSAgICAgIGRldl90IHJkZXYpCit7CisJc3RydWN0IGZ1c2VfbWtub2RfaW4gaW5hcmc7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGRpcik7CisJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOworCWluYXJnLm1vZGUgPSBtb2RlOworCWluYXJnLnJkZXYgPSBuZXdfZW5jb2RlX2RldihyZGV2KTsKKwlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9NS05PRDsKKwlyZXEtPmluLm51bWFyZ3MgPSAyOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJcmVxLT5pbi5hcmdzWzFdLnNpemUgPSBlbnRyeS0+ZF9uYW1lLmxlbiArIDE7CisJcmVxLT5pbi5hcmdzWzFdLnZhbHVlID0gZW50cnktPmRfbmFtZS5uYW1lOworCXJldHVybiBjcmVhdGVfbmV3X2VudHJ5KGZjLCByZXEsIGRpciwgZW50cnksIG1vZGUpOworfQorCitzdGF0aWMgaW50IGZ1c2VfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgaW50IG1vZGUsCisJCSAgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gZnVzZV9ta25vZChkaXIsIGVudHJ5LCBtb2RlLCAwKTsKK30KKworc3RhdGljIGludCBmdXNlX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGZ1c2VfbWtkaXJfaW4gaW5hcmc7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGRpcik7CisJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOworCWluYXJnLm1vZGUgPSBtb2RlOworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX01LRElSOworCXJlcS0+aW4ubnVtYXJncyA9IDI7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKKwlyZXEtPmluLmFyZ3NbMV0uc2l6ZSA9IGVudHJ5LT5kX25hbWUubGVuICsgMTsKKwlyZXEtPmluLmFyZ3NbMV0udmFsdWUgPSBlbnRyeS0+ZF9uYW1lLm5hbWU7CisJcmV0dXJuIGNyZWF0ZV9uZXdfZW50cnkoZmMsIHJlcSwgZGlyLCBlbnRyeSwgU19JRkRJUik7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwKKwkJCWNvbnN0IGNoYXIgKmxpbmspCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGRpcik7CisJdW5zaWduZWQgbGVuID0gc3RybGVuKGxpbmspICsgMTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKworCWlmIChsZW4gPiBGVVNFX1NZTUxJTktfTUFYKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfU1lNTElOSzsKKwlyZXEtPmluLm51bWFyZ3MgPSAyOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gZW50cnktPmRfbmFtZS5sZW4gKyAxOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGVudHJ5LT5kX25hbWUubmFtZTsKKwlyZXEtPmluLmFyZ3NbMV0uc2l6ZSA9IGxlbjsKKwlyZXEtPmluLmFyZ3NbMV0udmFsdWUgPSBsaW5rOworCXJldHVybiBjcmVhdGVfbmV3X2VudHJ5KGZjLCByZXEsIGRpciwgZW50cnksIFNfSUZMTkspOworfQorCitzdGF0aWMgaW50IGZ1c2VfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihkaXIpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRUlOVFI7CisKKwlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9VTkxJTks7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGRpcik7CisJcmVxLT5pbm9kZSA9IGRpcjsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gZW50cnktPmRfbmFtZS5sZW4gKyAxOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGVudHJ5LT5kX25hbWUubmFtZTsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKworCQkvKiBTZXQgbmxpbmsgdG8gemVybyBzbyB0aGUgaW5vZGUgY2FuIGJlIGNsZWFyZWQsIGlmCisgICAgICAgICAgICAgICAgICAgdGhlIGlub2RlIGRvZXMgaGF2ZSBtb3JlIGxpbmtzIHRoaXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyZWQgYXQgdGhlIG5leHQgbG9va3VwL2dldGF0dHIgKi8KKwkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQlmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7CisJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGRpcik7CisJfSBlbHNlIGlmIChlcnIgPT0gLUVJTlRSKQorCQlmdXNlX2ludmFsaWRhdGVfZW50cnkoZW50cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZW50cnkpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oZGlyKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfUk1ESVI7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGRpcik7CisJcmVxLT5pbm9kZSA9IGRpcjsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gZW50cnktPmRfbmFtZS5sZW4gKyAxOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGVudHJ5LT5kX25hbWUubmFtZTsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyKSB7CisJCWVudHJ5LT5kX2lub2RlLT5pX25saW5rID0gMDsKKwkJZnVzZV9pbnZhbGlkYXRlX2F0dHIoZGlyKTsKKwl9IGVsc2UgaWYgKGVyciA9PSAtRUlOVFIpCisJCWZ1c2VfaW52YWxpZGF0ZV9lbnRyeShlbnRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmdXNlX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZGRpciwgc3RydWN0IGRlbnRyeSAqb2xkZW50LAorCQkgICAgICAgc3RydWN0IGlub2RlICpuZXdkaXIsIHN0cnVjdCBkZW50cnkgKm5ld2VudCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBmdXNlX3JlbmFtZV9pbiBpbmFyZzsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4ob2xkZGlyKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7CisJaW5hcmcubmV3ZGlyID0gZ2V0X25vZGVfaWQobmV3ZGlyKTsKKwlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9SRU5BTUU7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKG9sZGRpcik7CisJcmVxLT5pbm9kZSA9IG9sZGRpcjsKKwlyZXEtPmlub2RlMiA9IG5ld2RpcjsKKwlyZXEtPmluLm51bWFyZ3MgPSAzOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJcmVxLT5pbi5hcmdzWzFdLnNpemUgPSBvbGRlbnQtPmRfbmFtZS5sZW4gKyAxOworCXJlcS0+aW4uYXJnc1sxXS52YWx1ZSA9IG9sZGVudC0+ZF9uYW1lLm5hbWU7CisJcmVxLT5pbi5hcmdzWzJdLnNpemUgPSBuZXdlbnQtPmRfbmFtZS5sZW4gKyAxOworCXJlcS0+aW4uYXJnc1syXS52YWx1ZSA9IG5ld2VudC0+ZF9uYW1lLm5hbWU7CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlpZiAoIWVycikgeworCQlmdXNlX2ludmFsaWRhdGVfYXR0cihvbGRkaXIpOworCQlpZiAob2xkZGlyICE9IG5ld2RpcikKKwkJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKG5ld2Rpcik7CisJfSBlbHNlIGlmIChlcnIgPT0gLUVJTlRSKSB7CisJCS8qIElmIHJlcXVlc3Qgd2FzIGludGVycnVwdGVkLCBERUlUWSBvbmx5IGtub3dzIGlmIHRoZQorCQkgICByZW5hbWUgYWN0dWFsbHkgdG9vayBwbGFjZS4gIElmIHRoZSBpbnZhbGlkYXRpb24KKwkJICAgZmFpbHMgKGUuZy4gc29tZSBwcm9jZXNzIGhhcyBDV0QgdW5kZXIgdGhlIHJlbmFtZWQKKwkJICAgZGlyZWN0b3J5KSwgdGhlbiB0aGVyZSBjYW4gYmUgaW5jb25zaXN0ZW5jeSBiZXR3ZWVuCisJCSAgIHRoZSBkY2FjaGUgYW5kIHRoZSByZWFsIGZpbGVzeXN0ZW0uICBUb3VnaCBsdWNrLiAqLworCQlmdXNlX2ludmFsaWRhdGVfZW50cnkob2xkZW50KTsKKwkJaWYgKG5ld2VudC0+ZF9pbm9kZSkKKwkJCWZ1c2VfaW52YWxpZGF0ZV9lbnRyeShuZXdlbnQpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9saW5rKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBzdHJ1Y3QgaW5vZGUgKm5ld2RpciwKKwkJICAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdlbnQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnVzZV9saW5rX2luIGluYXJnOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRUlOVFI7CisKKwltZW1zZXQoJmluYXJnLCAwLCBzaXplb2YoaW5hcmcpKTsKKwlpbmFyZy5vbGRub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfTElOSzsKKwlyZXEtPmlub2RlMiA9IGlub2RlOworCXJlcS0+aW4ubnVtYXJncyA9IDI7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKKwlyZXEtPmluLmFyZ3NbMV0uc2l6ZSA9IG5ld2VudC0+ZF9uYW1lLmxlbiArIDE7CisJcmVxLT5pbi5hcmdzWzFdLnZhbHVlID0gbmV3ZW50LT5kX25hbWUubmFtZTsKKwllcnIgPSBjcmVhdGVfbmV3X2VudHJ5KGZjLCByZXEsIG5ld2RpciwgbmV3ZW50LCBpbm9kZS0+aV9tb2RlKTsKKwkvKiBDb250cmFyeSB0byAibm9ybWFsIiBmaWxlc3lzdGVtcyBpdCBjYW4gaGFwcGVuIHRoYXQgbGluaworCSAgIG1ha2VzIHR3byAibG9naWNhbCIgaW5vZGVzIHBvaW50IHRvIHRoZSBzYW1lICJwaHlzaWNhbCIKKwkgICBpbm9kZS4gIFdlIGludmFsaWRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG9sZCBvbmUsIHNvIGl0CisJICAgd2lsbCByZWZsZWN0IGNoYW5nZXMgaW4gdGhlIGJhY2tpbmcgaW5vZGUgKGxpbmsgY291bnQsCisJICAgZXRjLikKKwkqLworCWlmICghZXJyIHx8IGVyciA9PSAtRUlOVFIpCisJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZnVzZV9kb19nZXRhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnVzZV9hdHRyX291dCBhcmc7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfR0VUQVRUUjsKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOworCXJlcS0+aW5vZGUgPSBpbm9kZTsKKwlyZXEtPm91dC5udW1hcmdzID0gMTsKKwlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2YoYXJnKTsKKwlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJmFyZzsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyKSB7CisJCWlmICgoaW5vZGUtPmlfbW9kZSBeIGFyZy5hdHRyLm1vZGUpICYgU19JRk1UKSB7CisJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCQllcnIgPSAtRUlPOworCQl9IGVsc2UgeworCQkJc3RydWN0IGZ1c2VfaW5vZGUgKmZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOworCQkJZnVzZV9jaGFuZ2VfYXR0cmlidXRlcyhpbm9kZSwgJmFyZy5hdHRyKTsKKwkJCWZpLT5pX3RpbWUgPSB0aW1lX3RvX2ppZmZpZXMoYXJnLmF0dHJfdmFsaWQsCisJCQkJCQkgICAgIGFyZy5hdHRyX3ZhbGlkX25zZWMpOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDYWxsaW5nIGludG8gYSB1c2VyLWNvbnRyb2xsZWQgZmlsZXN5c3RlbSBnaXZlcyB0aGUgZmlsZXN5c3RlbQorICogZGFlbW9uIHB0cmFjZS1saWtlIGNhcGFiaWxpdGllcyBvdmVyIHRoZSByZXF1ZXN0ZXIgcHJvY2Vzcy4gIFRoaXMKKyAqIG1lYW5zLCB0aGF0IHRoZSBmaWxlc3lzdGVtIGRhZW1vbiBpcyBhYmxlIHRvIHJlY29yZCB0aGUgZXhhY3QKKyAqIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBwZXJmb3JtZWQsIGFuZCBjYW4gYWxzbyBjb250cm9sIHRoZSBiZWhhdmlvcgorICogb2YgdGhlIHJlcXVlc3RlciBwcm9jZXNzIGluIG90aGVyd2lzZSBpbXBvc3NpYmxlIHdheXMuICBGb3IgZXhhbXBsZQorICogaXQgY2FuIGRlbGF5IHRoZSBvcGVyYXRpb24gZm9yIGFyYml0cmFyeSBsZW5ndGggb2YgdGltZSBhbGxvd2luZworICogRG9TIGFnYWluc3QgdGhlIHJlcXVlc3Rlci4KKyAqCisgKiBGb3IgdGhpcyByZWFzb24gb25seSB0aG9zZSBwcm9jZXNzZXMgY2FuIGNhbGwgaW50byB0aGUgZmlsZXN5c3RlbSwKKyAqIGZvciB3aGljaCB0aGUgb3duZXIgb2YgdGhlIG1vdW50IGhhcyBwdHJhY2UgcHJpdmlsZWdlLiAgVGhpcworICogZXhjbHVkZXMgcHJvY2Vzc2VzIHN0YXJ0ZWQgYnkgb3RoZXIgdXNlcnMsIHN1aWQgb3Igc2dpZCBwcm9jZXNzZXMuCisgKi8KK3N0YXRpYyBpbnQgZnVzZV9hbGxvd190YXNrKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJaWYgKGZjLT5mbGFncyAmIEZVU0VfQUxMT1dfT1RIRVIpCisJCXJldHVybiAxOworCisJaWYgKHRhc2stPmV1aWQgPT0gZmMtPnVzZXJfaWQgJiYKKwkgICAgdGFzay0+c3VpZCA9PSBmYy0+dXNlcl9pZCAmJgorCSAgICB0YXNrLT51aWQgPT0gZmMtPnVzZXJfaWQgJiYKKwkgICAgdGFzay0+ZWdpZCA9PSBmYy0+Z3JvdXBfaWQgJiYKKwkgICAgdGFzay0+c2dpZCA9PSBmYy0+Z3JvdXBfaWQgJiYKKwkgICAgdGFzay0+Z2lkID09IGZjLT5ncm91cF9pZCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdXNlX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCisJaWYgKCFmdXNlX2FsbG93X3Rhc2soZmMsIGN1cnJlbnQpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwlpZiAoZ2V0X25vZGVfaWQoaW5vZGUpICE9IEZVU0VfUk9PVF9JRCAmJgorCSAgICB0aW1lX2JlZm9yZV9lcShqaWZmaWVzLCBmaS0+aV90aW1lKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZnVzZV9kb19nZXRhdHRyKGlub2RlKTsKK30KKworc3RhdGljIGludCBmdXNlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisKKwlpZiAoIWZ1c2VfYWxsb3dfdGFzayhmYywgY3VycmVudCkpCisJCXJldHVybiAtRUFDQ0VTOworCWVsc2UgaWYgKGZjLT5mbGFncyAmIEZVU0VfREVGQVVMVF9QRVJNSVNTSU9OUykgeworCQlpbnQgZXJyID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKKworCQkvKiBJZiBwZXJtaXNzaW9uIGlzIGRlbmllZCwgdHJ5IHRvIHJlZnJlc2ggZmlsZQorCQkgICBhdHRyaWJ1dGVzLiAgVGhpcyBpcyBhbHNvIG5lZWRlZCwgYmVjYXVzZSB0aGUgcm9vdAorCQkgICBub2RlIHdpbGwgYXQgZmlyc3QgaGF2ZSBubyBwZXJtaXNzaW9ucyAqLworCQlpZiAoZXJyID09IC1FQUNDRVMpIHsKKwkJIAllcnIgPSBmdXNlX2RvX2dldGF0dHIoaW5vZGUpOworCQkJaWYgKCFlcnIpCisJCQkJZXJyID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKKwkJfQorCisJCS8qIEZJWE1FOiBOZWVkIHNvbWUgbWVjaGFuaXNtIHRvIHJldm9rZSBwZXJtaXNzaW9uczoKKwkJICAgY3VycmVudGx5IGlmIHRoZSBmaWxlc3lzdGVtIHN1ZGRlbmx5IGNoYW5nZXMgdGhlCisJCSAgIGZpbGUgbW9kZSwgd2Ugd2lsbCBub3QgYmUgaW5mb3JtZWQgYWJvdXQgaXQsIGFuZAorCQkgICBjb250aW51ZSB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlIGZpbGUvZGlyZWN0b3J5LgorCisJCSAgIFRoaXMgaXMgYWN0dWFsbHkgbm90IHNvIGdyYXZlLCBzaW5jZSB0aGUgdXNlciBjYW4KKwkJICAgc2ltcGx5IGtlZXAgYWNjZXNzIHRvIHRoZSBmaWxlL2RpcmVjdG9yeSBhbnl3YXkgYnkKKwkJICAga2VlcGluZyBpdCBvcGVuLi4uICovCisKKwkJcmV0dXJuIGVycjsKKwl9IGVsc2UgeworCQlpbnQgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCWlmICgobWFzayAmIE1BWV9XUklURSkgJiYgSVNfUkRPTkxZKGlub2RlKSAmJgorICAgICAgICAgICAgICAgICAgICAoU19JU1JFRyhtb2RlKSB8fCBTX0lTRElSKG1vZGUpIHx8IFNfSVNMTksobW9kZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FUk9GUzsKKwkJaWYgKChtYXNrICYgTUFZX0VYRUMpICYmICFTX0lTRElSKG1vZGUpICYmICEobW9kZSAmIFNfSVhVR08pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBwYXJzZV9kaXJmaWxlKGNoYXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdm9pZCAqZHN0YnVmLCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwl3aGlsZSAobmJ5dGVzID49IEZVU0VfTkFNRV9PRkZTRVQpIHsKKwkJc3RydWN0IGZ1c2VfZGlyZW50ICpkaXJlbnQgPSAoc3RydWN0IGZ1c2VfZGlyZW50ICopIGJ1ZjsKKwkJc2l6ZV90IHJlY2xlbiA9IEZVU0VfRElSRU5UX1NJWkUoZGlyZW50KTsKKwkJaW50IG92ZXI7CisJCWlmICghZGlyZW50LT5uYW1lbGVuIHx8IGRpcmVudC0+bmFtZWxlbiA+IEZVU0VfTkFNRV9NQVgpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKHJlY2xlbiA+IG5ieXRlcykKKwkJCWJyZWFrOworCisJCW92ZXIgPSBmaWxsZGlyKGRzdGJ1ZiwgZGlyZW50LT5uYW1lLCBkaXJlbnQtPm5hbWVsZW4sCisJCQkgICAgICAgZmlsZS0+Zl9wb3MsIGRpcmVudC0+aW5vLCBkaXJlbnQtPnR5cGUpOworCQlpZiAob3ZlcikKKwkJCWJyZWFrOworCisJCWJ1ZiArPSByZWNsZW47CisJCW5ieXRlcyAtPSByZWNsZW47CisJCWZpbGUtPmZfcG9zID0gZGlyZW50LT5vZmY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGZ1c2Vfc2VuZF9yZWFkZGlyKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywKKwkJCQkgICAgICAgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBmdXNlX3NlbmRfcmVhZF9jb21tb24ocmVxLCBmaWxlLCBpbm9kZSwgcG9zLCBjb3VudCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpkc3RidWYsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCWludCBlcnI7CisJc2l6ZV90IG5ieXRlczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlKSB7CisJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXEtPm51bV9wYWdlcyA9IDE7CisJcmVxLT5wYWdlc1swXSA9IHBhZ2U7CisJbmJ5dGVzID0gZnVzZV9zZW5kX3JlYWRkaXIocmVxLCBmaWxlLCBpbm9kZSwgZmlsZS0+Zl9wb3MsIFBBR0VfU0laRSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyKQorCQllcnIgPSBwYXJzZV9kaXJmaWxlKHBhZ2VfYWRkcmVzcyhwYWdlKSwgbmJ5dGVzLCBmaWxlLCBkc3RidWYsCisJCQkJICAgIGZpbGxkaXIpOworCisJX19mcmVlX3BhZ2UocGFnZSk7CisJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOyAvKiBhdGltZSBjaGFuZ2VkICovCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNoYXIgKnJlYWRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJY2hhciAqbGluazsKKworCWlmICghcmVxKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOworCisJbGluayA9IChjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWxpbmspIHsKKwkJbGluayA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0OworCX0KKwlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9SRUFETElOSzsKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOworCXJlcS0+aW5vZGUgPSBpbm9kZTsKKwlyZXEtPm91dC5hcmd2YXIgPSAxOworCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IFBBR0VfU0laRSAtIDE7CisJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9IGxpbms7CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWlmIChyZXEtPm91dC5oLmVycm9yKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgbGluayk7CisJCWxpbmsgPSBFUlJfUFRSKHJlcS0+b3V0LmguZXJyb3IpOworCX0gZWxzZQorCQlsaW5rW3JlcS0+b3V0LmFyZ3NbMF0uc2l6ZV0gPSAnXDAnOworIG91dDoKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsgLyogYXRpbWUgY2hhbmdlZCAqLworCXJldHVybiBsaW5rOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2xpbmsoY2hhciAqbGluaykKK3sKKwlpZiAoIUlTX0VSUihsaW5rKSkKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBsaW5rKTsKK30KKworc3RhdGljIHZvaWQgKmZ1c2VfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwluZF9zZXRfbGluayhuZCwgcmVhZF9saW5rKGRlbnRyeSkpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBmdXNlX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQsIHZvaWQgKmMpCit7CisJZnJlZV9saW5rKG5kX2dldF9saW5rKG5kKSk7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gZnVzZV9vcGVuX2NvbW1vbihpbm9kZSwgZmlsZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9kaXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gZnVzZV9yZWxlYXNlX2NvbW1vbihpbm9kZSwgZmlsZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9kaXJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlLCBpbnQgZGF0YXN5bmMpCit7CisJLyogbmZzZCBjYW4gY2FsbCB0aGlzIHdpdGggbm8gZmlsZSAqLworCXJldHVybiBmaWxlID8gZnVzZV9mc3luY19jb21tb24oZmlsZSwgZGUsIGRhdGFzeW5jLCAxKSA6IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpYXR0cl90b19mYXR0cihzdHJ1Y3QgaWF0dHIgKmlhdHRyLCBzdHJ1Y3QgZnVzZV9hdHRyICpmYXR0cikKK3sKKwl1bnNpZ25lZCBpdmFsaWQgPSBpYXR0ci0+aWFfdmFsaWQ7CisJdW5zaWduZWQgZnZhbGlkID0gMDsKKworCW1lbXNldChmYXR0ciwgMCwgc2l6ZW9mKCpmYXR0cikpOworCisJaWYgKGl2YWxpZCAmIEFUVFJfTU9ERSkKKwkJZnZhbGlkIHw9IEZBVFRSX01PREUsICAgZmF0dHItPm1vZGUgPSBpYXR0ci0+aWFfbW9kZTsKKwlpZiAoaXZhbGlkICYgQVRUUl9VSUQpCisJCWZ2YWxpZCB8PSBGQVRUUl9VSUQsICAgIGZhdHRyLT51aWQgPSBpYXR0ci0+aWFfdWlkOworCWlmIChpdmFsaWQgJiBBVFRSX0dJRCkKKwkJZnZhbGlkIHw9IEZBVFRSX0dJRCwgICAgZmF0dHItPmdpZCA9IGlhdHRyLT5pYV9naWQ7CisJaWYgKGl2YWxpZCAmIEFUVFJfU0laRSkKKwkJZnZhbGlkIHw9IEZBVFRSX1NJWkUsICAgZmF0dHItPnNpemUgPSBpYXR0ci0+aWFfc2l6ZTsKKwkvKiBZb3UgY2FuIG9ubHkgX3NldF8gdGhlc2UgdG9nZXRoZXIgKHRoZXkgbWF5IGNoYW5nZSBieSB0aGVtc2VsdmVzKSAqLworCWlmICgoaXZhbGlkICYgKEFUVFJfQVRJTUUgfCBBVFRSX01USU1FKSkgPT0gKEFUVFJfQVRJTUUgfCBBVFRSX01USU1FKSkgeworCQlmdmFsaWQgfD0gRkFUVFJfQVRJTUUgfCBGQVRUUl9NVElNRTsKKwkJZmF0dHItPmF0aW1lID0gaWF0dHItPmlhX2F0aW1lLnR2X3NlYzsKKwkJZmF0dHItPm10aW1lID0gaWF0dHItPmlhX210aW1lLnR2X3NlYzsKKwl9CisKKwlyZXR1cm4gZnZhbGlkOworfQorCitzdGF0aWMgaW50IGZ1c2Vfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKwlzdHJ1Y3QgZnVzZV9zZXRhdHRyX2luIGluYXJnOworCXN0cnVjdCBmdXNlX2F0dHJfb3V0IG91dGFyZzsKKwlpbnQgZXJyOworCWludCBpc190cnVuY2F0ZSA9IDA7CisKKwlpZiAoZmMtPmZsYWdzICYgRlVTRV9ERUZBVUxUX1BFUk1JU1NJT05TKSB7CisJCWVyciA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgYXR0cik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgeworCQl1bnNpZ25lZCBsb25nIGxpbWl0OworCQlpc190cnVuY2F0ZSA9IDE7CisJCWxpbWl0ID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9GU0laRV0ucmxpbV9jdXI7CisJCWlmIChsaW1pdCAhPSBSTElNX0lORklOSVRZICYmIGF0dHItPmlhX3NpemUgPiAobG9mZl90KSBsaW1pdCkgeworCQkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CisJCQlyZXR1cm4gLUVGQklHOworCQl9CisJfQorCisJcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRUlOVFI7CisKKwltZW1zZXQoJmluYXJnLCAwLCBzaXplb2YoaW5hcmcpKTsKKwlpbmFyZy52YWxpZCA9IGlhdHRyX3RvX2ZhdHRyKGF0dHIsICZpbmFyZy5hdHRyKTsKKwlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9TRVRBVFRSOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbm9kZSA9IGlub2RlOworCXJlcS0+aW4ubnVtYXJncyA9IDE7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKKwlyZXEtPm91dC5udW1hcmdzID0gMTsKKwlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKKwlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyKSB7CisJCWlmICgoaW5vZGUtPmlfbW9kZSBeIG91dGFyZy5hdHRyLm1vZGUpICYgU19JRk1UKSB7CisJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCQllcnIgPSAtRUlPOworCQl9IGVsc2UgeworCQkJaWYgKGlzX3RydW5jYXRlKSB7CisJCQkJbG9mZl90IG9yaWdzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgb3V0YXJnLmF0dHIuc2l6ZSk7CisJCQkJaWYgKG9yaWdzaXplID4gb3V0YXJnLmF0dHIuc2l6ZSkKKwkJCQkJdm10cnVuY2F0ZShpbm9kZSwgb3V0YXJnLmF0dHIuc2l6ZSk7CisJCQl9CisJCQlmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzKGlub2RlLCAmb3V0YXJnLmF0dHIpOworCQkJZmktPmlfdGltZSA9IHRpbWVfdG9famlmZmllcyhvdXRhcmcuYXR0cl92YWxpZCwKKwkJCQkJCSAgICAgb3V0YXJnLmF0dHJfdmFsaWRfbnNlYyk7CisJCX0KKwl9IGVsc2UgaWYgKGVyciA9PSAtRUlOVFIpCisJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwKKwkJCXN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZW50cnktPmRfaW5vZGU7CisJaW50IGVyciA9IGZ1c2VfcmV2YWxpZGF0ZShlbnRyeSk7CisJaWYgKCFlcnIpCisJCWdlbmVyaWNfZmlsbGF0dHIoaW5vZGUsIHN0YXQpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmZ1c2VfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwKKwkJCQkgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVyciA9IGZ1c2VfbG9va3VwX2lnZXQoZGlyLCBlbnRyeSwgJmlub2RlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCS8qIERvbid0IGFsbG93IGNyZWF0aW5nIGFuIGFsaWFzIHRvIGEgZGlyZWN0b3J5ICAqLworCQlzdHJ1Y3QgZGVudHJ5ICphbGlhcyA9IGRfZmluZF9hbGlhcyhpbm9kZSk7CisJCWlmIChhbGlhcyAmJiAhKGFsaWFzLT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkpIHsKKwkJCWRwdXQoYWxpYXMpOworCQkJaXB1dChpbm9kZSk7CisJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwkJfQorCX0KKwlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGVudHJ5KTsKK30KKworc3RhdGljIGludCBmdXNlX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBjb25zdCBjaGFyICpuYW1lLAorCQkJIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCXN0cnVjdCBmdXNlX3NldHhhdHRyX2luIGluYXJnOworCWludCBlcnI7CisKKwlpZiAoc2l6ZSA+IEZVU0VfWEFUVFJfU0laRV9NQVgpCisJCXJldHVybiAtRTJCSUc7CisKKwlpZiAoZmMtPm5vX3NldHhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOworCWluYXJnLnNpemUgPSBzaXplOworCWluYXJnLmZsYWdzID0gZmxhZ3M7CisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfU0VUWEFUVFI7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlyZXEtPmlub2RlID0gaW5vZGU7CisJcmVxLT5pbi5udW1hcmdzID0gMzsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCXJlcS0+aW4uYXJnc1sxXS5zaXplID0gc3RybGVuKG5hbWUpICsgMTsKKwlyZXEtPmluLmFyZ3NbMV0udmFsdWUgPSBuYW1lOworCXJlcS0+aW4uYXJnc1syXS5zaXplID0gc2l6ZTsKKwlyZXEtPmluLmFyZ3NbMl0udmFsdWUgPSB2YWx1ZTsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmIChlcnIgPT0gLUVOT1NZUykgeworCQlmYy0+bm9fc2V0eGF0dHIgPSAxOworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNzaXplX3QgZnVzZV9nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCXN0cnVjdCBmdXNlX2dldHhhdHRyX2luIGluYXJnOworCXN0cnVjdCBmdXNlX2dldHhhdHRyX291dCBvdXRhcmc7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoZmMtPm5vX2dldHhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOworCWluYXJnLnNpemUgPSBzaXplOworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0dFVFhBVFRSOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbm9kZSA9IGlub2RlOworCXJlcS0+aW4ubnVtYXJncyA9IDI7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKKwlyZXEtPmluLmFyZ3NbMV0uc2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7CisJcmVxLT5pbi5hcmdzWzFdLnZhbHVlID0gbmFtZTsKKwkvKiBUaGlzIGlzIHJlYWxseSB0d28gZGlmZmVyZW50IG9wZXJhdGlvbnMgcm9sbGVkIGludG8gb25lICovCisJcmVxLT5vdXQubnVtYXJncyA9IDE7CisJaWYgKHNpemUpIHsKKwkJcmVxLT5vdXQuYXJndmFyID0gMTsKKwkJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZTsKKwkJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9IHZhbHVlOworCX0gZWxzZSB7CisJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCQlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKKwl9CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCXJldCA9IHJlcS0+b3V0LmguZXJyb3I7CisJaWYgKCFyZXQpCisJCXJldCA9IHNpemUgPyByZXEtPm91dC5hcmdzWzBdLnNpemUgOiBvdXRhcmcuc2l6ZTsKKwllbHNlIHsKKwkJaWYgKHJldCA9PSAtRU5PU1lTKSB7CisJCQlmYy0+bm9fZ2V0eGF0dHIgPSAxOworCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCX0KKwl9CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBmdXNlX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgY2hhciAqbGlzdCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisJc3RydWN0IGZ1c2VfZ2V0eGF0dHJfaW4gaW5hcmc7CisJc3RydWN0IGZ1c2VfZ2V0eGF0dHJfb3V0IG91dGFyZzsKKwlzc2l6ZV90IHJldDsKKworCWlmIChmYy0+bm9fbGlzdHhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOworCWluYXJnLnNpemUgPSBzaXplOworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0xJU1RYQVRUUjsKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOworCXJlcS0+aW5vZGUgPSBpbm9kZTsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJLyogVGhpcyBpcyByZWFsbHkgdHdvIGRpZmZlcmVudCBvcGVyYXRpb25zIHJvbGxlZCBpbnRvIG9uZSAqLworCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOworCWlmIChzaXplKSB7CisJCXJlcS0+b3V0LmFyZ3ZhciA9IDE7CisJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemU7CisJCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSBsaXN0OworCX0gZWxzZSB7CisJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCQlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKKwl9CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCXJldCA9IHJlcS0+b3V0LmguZXJyb3I7CisJaWYgKCFyZXQpCisJCXJldCA9IHNpemUgPyByZXEtPm91dC5hcmdzWzBdLnNpemUgOiBvdXRhcmcuc2l6ZTsKKwllbHNlIHsKKwkJaWYgKHJldCA9PSAtRU5PU1lTKSB7CisJCQlmYy0+bm9fbGlzdHhhdHRyID0gMTsKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCQl9CisJfQorCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdXNlX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCWludCBlcnI7CisKKwlpZiAoZmMtPm5vX3JlbW92ZXhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX1JFTU9WRVhBVFRSOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbm9kZSA9IGlub2RlOworCXJlcS0+aW4ubnVtYXJncyA9IDE7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzdHJsZW4obmFtZSkgKyAxOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IG5hbWU7CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlpZiAoZXJyID09IC1FTk9TWVMpIHsKKwkJZmMtPm5vX3JlbW92ZXhhdHRyID0gMTsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBmdXNlX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gZnVzZV9sb29rdXAsCisJLm1rZGlyCQk9IGZ1c2VfbWtkaXIsCisJLnN5bWxpbmsJPSBmdXNlX3N5bWxpbmssCisJLnVubGluawkJPSBmdXNlX3VubGluaywKKwkucm1kaXIJCT0gZnVzZV9ybWRpciwKKwkucmVuYW1lCQk9IGZ1c2VfcmVuYW1lLAorCS5saW5rCQk9IGZ1c2VfbGluaywKKwkuc2V0YXR0cgk9IGZ1c2Vfc2V0YXR0ciwKKwkuY3JlYXRlCQk9IGZ1c2VfY3JlYXRlLAorCS5ta25vZAkJPSBmdXNlX21rbm9kLAorCS5wZXJtaXNzaW9uCT0gZnVzZV9wZXJtaXNzaW9uLAorCS5nZXRhdHRyCT0gZnVzZV9nZXRhdHRyLAorCS5zZXR4YXR0cgk9IGZ1c2Vfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZnVzZV9nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gZnVzZV9saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZnVzZV9yZW1vdmV4YXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGlyX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBmdXNlX3JlYWRkaXIsCisJLm9wZW4JCT0gZnVzZV9kaXJfb3BlbiwKKwkucmVsZWFzZQk9IGZ1c2VfZGlyX3JlbGVhc2UsCisJLmZzeW5jCQk9IGZ1c2VfZGlyX2ZzeW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGZ1c2VfY29tbW9uX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnNldGF0dHIJPSBmdXNlX3NldGF0dHIsCisJLnBlcm1pc3Npb24JPSBmdXNlX3Blcm1pc3Npb24sCisJLmdldGF0dHIJPSBmdXNlX2dldGF0dHIsCisJLnNldHhhdHRyCT0gZnVzZV9zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBmdXNlX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBmdXNlX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBmdXNlX3JlbW92ZXhhdHRyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGZ1c2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0geworCS5zZXRhdHRyCT0gZnVzZV9zZXRhdHRyLAorCS5mb2xsb3dfbGluawk9IGZ1c2VfZm9sbG93X2xpbmssCisJLnB1dF9saW5rCT0gZnVzZV9wdXRfbGluaywKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5nZXRhdHRyCT0gZnVzZV9nZXRhdHRyLAorCS5zZXR4YXR0cgk9IGZ1c2Vfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZnVzZV9nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gZnVzZV9saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZnVzZV9yZW1vdmV4YXR0ciwKK307CisKK3ZvaWQgZnVzZV9pbml0X2NvbW1vbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX29wID0gJmZ1c2VfY29tbW9uX2lub2RlX29wZXJhdGlvbnM7Cit9CisKK3ZvaWQgZnVzZV9pbml0X2RpcihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX29wID0gJmZ1c2VfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJmZ1c2VfZGlyX29wZXJhdGlvbnM7Cit9CisKK3ZvaWQgZnVzZV9pbml0X3N5bWxpbmsoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbm9kZS0+aV9vcCA9ICZmdXNlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKK30KZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZmlsZS5jIGIvZnMvZnVzZS9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ1NDAyMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Z1c2UvZmlsZS5jCkBAIC0wLDAgKzEsNTU1IEBACisvKgorICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQorICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorCisgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgorICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KKyovCisKKyNpbmNsdWRlICJmdXNlX2kuaCIKKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGlyZWN0X2lvX2ZpbGVfb3BlcmF0aW9uczsKKworaW50IGZ1c2Vfb3Blbl9jb21tb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBpc2RpcikKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCXN0cnVjdCBmdXNlX29wZW5faW4gaW5hcmc7CisJc3RydWN0IGZ1c2Vfb3Blbl9vdXQgb3V0YXJnOworCXN0cnVjdCBmdXNlX2ZpbGUgKmZmOworCWludCBlcnI7CisKKwllcnIgPSBnZW5lcmljX2ZpbGVfb3Blbihpbm9kZSwgZmlsZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIElmIG9wZW5pbmcgdGhlIHJvb3Qgbm9kZSwgbm8gbG9va3VwIGhhcyBiZWVuIHBlcmZvcm1lZCBvbgorCSAgIGl0LCBzbyB0aGUgYXR0cmlidXRlcyBtdXN0IGJlIHJlZnJlc2hlZCAqLworCWlmIChnZXRfbm9kZV9pZChpbm9kZSkgPT0gRlVTRV9ST09UX0lEKSB7CisJCWludCBlcnIgPSBmdXNlX2RvX2dldGF0dHIoaW5vZGUpOworCQlpZiAoZXJyKQorCQkgCXJldHVybiBlcnI7CisJfQorCisJcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRUlOVFI7CisKKwllcnIgPSAtRU5PTUVNOworCWZmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZ1c2VfZmlsZSksIEdGUF9LRVJORUwpOworCWlmICghZmYpCisJCWdvdG8gb3V0X3B1dF9yZXF1ZXN0OworCisJZmYtPnJlbGVhc2VfcmVxID0gZnVzZV9yZXF1ZXN0X2FsbG9jKCk7CisJaWYgKCFmZi0+cmVsZWFzZV9yZXEpIHsKKwkJa2ZyZWUoZmYpOworCQlnb3RvIG91dF9wdXRfcmVxdWVzdDsKKwl9CisKKwltZW1zZXQoJmluYXJnLCAwLCBzaXplb2YoaW5hcmcpKTsKKwlpbmFyZy5mbGFncyA9IGZpbGUtPmZfZmxhZ3MgJiB+KE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX05PQ1RUWSB8IE9fVFJVTkMpOworCXJlcS0+aW4uaC5vcGNvZGUgPSBpc2RpciA/IEZVU0VfT1BFTkRJUiA6IEZVU0VfT1BFTjsKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOworCXJlcS0+aW5vZGUgPSBpbm9kZTsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJcmVxLT5vdXQubnVtYXJncyA9IDE7CisJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CisJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CisJaWYgKGVycikgeworCQlmdXNlX3JlcXVlc3RfZnJlZShmZi0+cmVsZWFzZV9yZXEpOworCQlrZnJlZShmZik7CisJfSBlbHNlIHsKKwkJaWYgKCFpc2RpciAmJiAob3V0YXJnLm9wZW5fZmxhZ3MgJiBGT1BFTl9ESVJFQ1RfSU8pKQorCQkJZmlsZS0+Zl9vcCA9ICZmdXNlX2RpcmVjdF9pb19maWxlX29wZXJhdGlvbnM7CisJCWlmICghKG91dGFyZy5vcGVuX2ZsYWdzICYgRk9QRU5fS0VFUF9DQUNIRSkpCisJCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcpOworCQlmZi0+ZmggPSBvdXRhcmcuZmg7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZmOworCX0KKworIG91dF9wdXRfcmVxdWVzdDoKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBmdXNlX3JlbGVhc2VfY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgaXNkaXIpCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZmLT5yZWxlYXNlX3JlcTsKKwlzdHJ1Y3QgZnVzZV9yZWxlYXNlX2luICppbmFyZyA9ICZyZXEtPm1pc2MucmVsZWFzZV9pbjsKKworCWluYXJnLT5maCA9IGZmLT5maDsKKwlpbmFyZy0+ZmxhZ3MgPSBmaWxlLT5mX2ZsYWdzICYgfk9fRVhDTDsKKwlyZXEtPmluLmgub3Bjb2RlID0gaXNkaXIgPyBGVVNFX1JFTEVBU0VESVIgOiBGVVNFX1JFTEVBU0U7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlyZXEtPmlub2RlID0gaW5vZGU7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9yZWxlYXNlX2luKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBpbmFyZzsKKwlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChmYywgcmVxKTsKKwlrZnJlZShmZik7CisKKwkvKiBSZXR1cm4gdmFsdWUgaXMgaWdub3JlZCBieSBWRlMgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIGZ1c2Vfb3Blbl9jb21tb24oaW5vZGUsIGZpbGUsIDApOworfQorCitzdGF0aWMgaW50IGZ1c2VfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gZnVzZV9yZWxlYXNlX2NvbW1vbihpbm9kZSwgZmlsZSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKwlzdHJ1Y3QgZnVzZV9mbHVzaF9pbiBpbmFyZzsKKwlpbnQgZXJyOworCisJaWYgKGZjLT5ub19mbHVzaCkKKwkJcmV0dXJuIDA7CisKKwlyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOworCWluYXJnLmZoID0gZmYtPmZoOworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0ZMVVNIOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbm9kZSA9IGlub2RlOworCXJlcS0+ZmlsZSA9IGZpbGU7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKGVyciA9PSAtRU5PU1lTKSB7CisJCWZjLT5ub19mbHVzaCA9IDE7CisJCWVyciA9IDA7CisJfQorCXJldHVybiBlcnI7Cit9CisKK2ludCBmdXNlX2ZzeW5jX2NvbW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGUsIGludCBkYXRhc3luYywKKwkJICAgICAgaW50IGlzZGlyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCXN0cnVjdCBmdXNlX2ZzeW5jX2luIGluYXJnOworCWludCBlcnI7CisKKwlpZiAoKCFpc2RpciAmJiBmYy0+bm9fZnN5bmMpIHx8IChpc2RpciAmJiBmYy0+bm9fZnN5bmNkaXIpKQorCQlyZXR1cm4gMDsKKworCXJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7CisJaW5hcmcuZmggPSBmZi0+Zmg7CisJaW5hcmcuZnN5bmNfZmxhZ3MgPSBkYXRhc3luYyA/IDEgOiAwOworCXJlcS0+aW4uaC5vcGNvZGUgPSBpc2RpciA/IEZVU0VfRlNZTkNESVIgOiBGVVNFX0ZTWU5DOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbm9kZSA9IGlub2RlOworCXJlcS0+ZmlsZSA9IGZpbGU7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKGVyciA9PSAtRU5PU1lTKSB7CisJCWlmIChpc2RpcikKKwkJCWZjLT5ub19mc3luY2RpciA9IDE7CisJCWVsc2UKKwkJCWZjLT5ub19mc3luYyA9IDE7CisJCWVyciA9IDA7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGUsIGludCBkYXRhc3luYykKK3sKKwlyZXR1cm4gZnVzZV9mc3luY19jb21tb24oZmlsZSwgZGUsIGRhdGFzeW5jLCAwKTsKK30KKworc2l6ZV90IGZ1c2Vfc2VuZF9yZWFkX2NvbW1vbihzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCwKKwkJCSAgICAgaW50IGlzZGlyKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGZ1c2VfcmVhZF9pbiBpbmFyZzsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihzdHJ1Y3QgZnVzZV9yZWFkX2luKSk7CisJaW5hcmcuZmggPSBmZi0+Zmg7CisJaW5hcmcub2Zmc2V0ID0gcG9zOworCWluYXJnLnNpemUgPSBjb3VudDsKKwlyZXEtPmluLmgub3Bjb2RlID0gaXNkaXIgPyBGVVNFX1JFQURESVIgOiBGVVNFX1JFQUQ7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlyZXEtPmlub2RlID0gaW5vZGU7CisJcmVxLT5maWxlID0gZmlsZTsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKHN0cnVjdCBmdXNlX3JlYWRfaW4pOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKKwlyZXEtPm91dC5hcmdwYWdlcyA9IDE7CisJcmVxLT5vdXQuYXJndmFyID0gMTsKKwlyZXEtPm91dC5udW1hcmdzID0gMTsKKwlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBjb3VudDsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJcmV0dXJuIHJlcS0+b3V0LmFyZ3NbMF0uc2l6ZTsKK30KKworc3RhdGljIGlubGluZSBzaXplX3QgZnVzZV9zZW5kX3JlYWQoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgcG9zLAorCQkJCSAgICBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGZ1c2Vfc2VuZF9yZWFkX2NvbW1vbihyZXEsIGZpbGUsIGlub2RlLCBwb3MsIGNvdW50LCAwKTsKK30KKworc3RhdGljIGludCBmdXNlX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCWxvZmZfdCBwb3MgPSAobG9mZl90KSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJaW50IGVyciA9IC1FSU5UUjsKKwlpZiAoIXJlcSkKKwkJZ290byBvdXQ7CisKKwlyZXEtPm91dC5wYWdlX3plcm9pbmcgPSAxOworCXJlcS0+bnVtX3BhZ2VzID0gMTsKKwlyZXEtPnBhZ2VzWzBdID0gcGFnZTsKKwlmdXNlX3NlbmRfcmVhZChyZXEsIGZpbGUsIGlub2RlLCBwb3MsIFBBR0VfQ0FDSEVfU0laRSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOyAvKiBhdGltZSBjaGFuZ2VkICovCisgb3V0OgorCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9zZW5kX3JlYWRwYWdlcyhzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlsb2ZmX3QgcG9zID0gKGxvZmZfdCkgcmVxLT5wYWdlc1swXS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwlzaXplX3QgY291bnQgPSByZXEtPm51bV9wYWdlcyA8PCBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGk7CisJcmVxLT5vdXQucGFnZV96ZXJvaW5nID0gMTsKKwlmdXNlX3NlbmRfcmVhZChyZXEsIGZpbGUsIGlub2RlLCBwb3MsIGNvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVxLT5udW1fcGFnZXM7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlcS0+cGFnZXNbaV07CisJCWlmICghcmVxLT5vdXQuaC5lcnJvcikKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJfQorCXJldHVybiByZXEtPm91dC5oLmVycm9yOworfQorCitzdHJ1Y3QgZnVzZV9yZWFkcGFnZXNfZGF0YSB7CisJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKK307CisKK3N0YXRpYyBpbnQgZnVzZV9yZWFkcGFnZXNfZmlsbCh2b2lkICpfZGF0YSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGZ1c2VfcmVhZHBhZ2VzX2RhdGEgKmRhdGEgPSBfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGRhdGEtPnJlcTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGF0YS0+aW5vZGU7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKworCWlmIChyZXEtPm51bV9wYWdlcyAmJgorCSAgICAocmVxLT5udW1fcGFnZXMgPT0gRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSB8fAorCSAgICAgKHJlcS0+bnVtX3BhZ2VzICsgMSkgKiBQQUdFX0NBQ0hFX1NJWkUgPiBmYy0+bWF4X3JlYWQgfHwKKwkgICAgIHJlcS0+cGFnZXNbcmVxLT5udW1fcGFnZXMgLSAxXS0+aW5kZXggKyAxICE9IHBhZ2UtPmluZGV4KSkgeworCQlpbnQgZXJyID0gZnVzZV9zZW5kX3JlYWRwYWdlcyhyZXEsIGRhdGEtPmZpbGUsIGlub2RlKTsKKwkJaWYgKGVycikgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWZ1c2VfcmVzZXRfcmVxdWVzdChyZXEpOworCX0KKwlyZXEtPnBhZ2VzW3JlcS0+bnVtX3BhZ2VzXSA9IHBhZ2U7CisJcmVxLT5udW1fcGFnZXMgKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9yZWFkcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywgdW5zaWduZWQgbnJfcGFnZXMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9yZWFkcGFnZXNfZGF0YSBkYXRhOworCWludCBlcnI7CisJZGF0YS5maWxlID0gZmlsZTsKKwlkYXRhLmlub2RlID0gaW5vZGU7CisJZGF0YS5yZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIWRhdGEucmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJZXJyID0gcmVhZF9jYWNoZV9wYWdlcyhtYXBwaW5nLCBwYWdlcywgZnVzZV9yZWFkcGFnZXNfZmlsbCwgJmRhdGEpOworCWlmICghZXJyICYmIGRhdGEucmVxLT5udW1fcGFnZXMpCisJCWVyciA9IGZ1c2Vfc2VuZF9yZWFkcGFnZXMoZGF0YS5yZXEsIGZpbGUsIGlub2RlKTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBkYXRhLnJlcSk7CisJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOyAvKiBhdGltZSBjaGFuZ2VkICovCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNpemVfdCBmdXNlX3NlbmRfd3JpdGUoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGZ1c2Vfd3JpdGVfaW4gaW5hcmc7CisJc3RydWN0IGZ1c2Vfd3JpdGVfb3V0IG91dGFyZzsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihzdHJ1Y3QgZnVzZV93cml0ZV9pbikpOworCWluYXJnLmZoID0gZmYtPmZoOworCWluYXJnLm9mZnNldCA9IHBvczsKKwlpbmFyZy5zaXplID0gY291bnQ7CisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfV1JJVEU7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlyZXEtPmlub2RlID0gaW5vZGU7CisJcmVxLT5maWxlID0gZmlsZTsKKwlyZXEtPmluLmFyZ3BhZ2VzID0gMTsKKwlyZXEtPmluLm51bWFyZ3MgPSAyOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKHN0cnVjdCBmdXNlX3dyaXRlX2luKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJcmVxLT5pbi5hcmdzWzFdLnNpemUgPSBjb3VudDsKKwlyZXEtPm91dC5udW1hcmdzID0gMTsKKwlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2Vfd3JpdGVfb3V0KTsKKwlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJcmV0dXJuIG91dGFyZy5zaXplOworfQorCitzdGF0aWMgaW50IGZ1c2VfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHRvKQoreworCS8qIE5vIG9wICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHRvKQoreworCWludCBlcnI7CisJc2l6ZV90IG5yZXM7CisJdW5zaWduZWQgY291bnQgPSB0byAtIG9mZnNldDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCWxvZmZfdCBwb3MgPSAoKGxvZmZfdCkgcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyBvZmZzZXQ7CisJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCXJlcS0+bnVtX3BhZ2VzID0gMTsKKwlyZXEtPnBhZ2VzWzBdID0gcGFnZTsKKwlyZXEtPnBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0OworCW5yZXMgPSBmdXNlX3NlbmRfd3JpdGUocmVxLCBmaWxlLCBpbm9kZSwgcG9zLCBjb3VudCk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyICYmIG5yZXMgIT0gY291bnQpCisJCWVyciA9IC1FSU87CisJaWYgKCFlcnIpIHsKKwkJcG9zICs9IGNvdW50OworCQlpZiAocG9zID4gaV9zaXplX3JlYWQoaW5vZGUpKQorCQkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3MpOworCisJCWlmIChvZmZzZXQgPT0gMCAmJiB0byA9PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJCWNsZWFyX3BhZ2VfZGlydHkocGFnZSk7CisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCX0KKwl9CisJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGZ1c2VfcmVsZWFzZV91c2VyX3BhZ2VzKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCBpbnQgd3JpdGUpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCByZXEtPm51bV9wYWdlczsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcmVxLT5wYWdlc1tpXTsKKwkJaWYgKHdyaXRlKQorCQkJc2V0X3BhZ2VfZGlydHlfbG9jayhwYWdlKTsKKwkJcHV0X3BhZ2UocGFnZSk7CisJfQorfQorCitzdGF0aWMgaW50IGZ1c2VfZ2V0X3VzZXJfcGFnZXMoc3RydWN0IGZ1c2VfcmVxICpyZXEsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICAgdW5zaWduZWQgbmJ5dGVzLCBpbnQgd3JpdGUpCit7CisJdW5zaWduZWQgbG9uZyB1c2VyX2FkZHIgPSAodW5zaWduZWQgbG9uZykgYnVmOworCXVuc2lnbmVkIG9mZnNldCA9IHVzZXJfYWRkciAmIH5QQUdFX01BU0s7CisJaW50IG5wYWdlczsKKworCS8qIFRoaXMgZG9lc24ndCB3b3JrIHdpdGggbmZzZCAqLworCWlmICghY3VycmVudC0+bW0pCisJCXJldHVybiAtRVBFUk07CisKKwluYnl0ZXMgPSBtaW4obmJ5dGVzLCAodW5zaWduZWQpIEZVU0VfTUFYX1BBR0VTX1BFUl9SRVEgPDwgUEFHRV9TSElGVCk7CisJbnBhZ2VzID0gKG5ieXRlcyArIG9mZnNldCArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJbnBhZ2VzID0gbWluKG5wYWdlcywgRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSk7CisJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCW5wYWdlcyA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCB1c2VyX2FkZHIsIG5wYWdlcywgd3JpdGUsCisJCQkJMCwgcmVxLT5wYWdlcywgTlVMTCk7CisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlpZiAobnBhZ2VzIDwgMCkKKwkJcmV0dXJuIG5wYWdlczsKKworCXJlcS0+bnVtX3BhZ2VzID0gbnBhZ2VzOworCXJlcS0+cGFnZV9vZmZzZXQgPSBvZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZGlyZWN0X2lvKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MsIGludCB3cml0ZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzaXplX3Qgbm1heCA9IHdyaXRlID8gZmMtPm1heF93cml0ZSA6IGZjLT5tYXhfcmVhZDsKKwlsb2ZmX3QgcG9zID0gKnBwb3M7CisJc3NpemVfdCByZXMgPSAwOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRUlOVFI7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJc2l6ZV90IHRtcDsKKwkJc2l6ZV90IG5yZXM7CisJCXNpemVfdCBuYnl0ZXMgPSBtaW4oY291bnQsIG5tYXgpOworCQlpbnQgZXJyID0gZnVzZV9nZXRfdXNlcl9wYWdlcyhyZXEsIGJ1ZiwgbmJ5dGVzLCAhd3JpdGUpOworCQlpZiAoZXJyKSB7CisJCQlyZXMgPSBlcnI7CisJCQlicmVhazsKKwkJfQorCQl0bXAgPSAocmVxLT5udW1fcGFnZXMgPDwgUEFHRV9TSElGVCkgLSByZXEtPnBhZ2Vfb2Zmc2V0OworCQluYnl0ZXMgPSBtaW4obmJ5dGVzLCB0bXApOworCQlpZiAod3JpdGUpCisJCQlucmVzID0gZnVzZV9zZW5kX3dyaXRlKHJlcSwgZmlsZSwgaW5vZGUsIHBvcywgbmJ5dGVzKTsKKwkJZWxzZQorCQkJbnJlcyA9IGZ1c2Vfc2VuZF9yZWFkKHJlcSwgZmlsZSwgaW5vZGUsIHBvcywgbmJ5dGVzKTsKKwkJZnVzZV9yZWxlYXNlX3VzZXJfcGFnZXMocmVxLCAhd3JpdGUpOworCQlpZiAocmVxLT5vdXQuaC5lcnJvcikgeworCQkJaWYgKCFyZXMpCisJCQkJcmVzID0gcmVxLT5vdXQuaC5lcnJvcjsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKG5yZXMgPiBuYnl0ZXMpIHsKKwkJCXJlcyA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQljb3VudCAtPSBucmVzOworCQlyZXMgKz0gbnJlczsKKwkJcG9zICs9IG5yZXM7CisJCWJ1ZiArPSBucmVzOworCQlpZiAobnJlcyAhPSBuYnl0ZXMpCisJCQlicmVhazsKKwkJaWYgKGNvdW50KQorCQkJZnVzZV9yZXNldF9yZXF1ZXN0KHJlcSk7CisJfQorCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKHJlcyA+IDApIHsKKwkJaWYgKHdyaXRlICYmIHBvcyA+IGlfc2l6ZV9yZWFkKGlub2RlKSkKKwkJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zKTsKKwkJKnBwb3MgPSBwb3M7CisJfQorCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZGlyZWN0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gZnVzZV9kaXJlY3RfaW8oZmlsZSwgYnVmLCBjb3VudCwgcHBvcywgMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZGlyZWN0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3NpemVfdCByZXM7CisJLyogRG9uJ3QgYWxsb3cgcGFyYWxsZWwgd3JpdGVzIHRvIHRoZSBzYW1lIGZpbGUgKi8KKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCXJlcyA9IGZ1c2VfZGlyZWN0X2lvKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MsIDEpOworCXVwKCZpbm9kZS0+aV9zZW0pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9maWxlX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWlmICgodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpIHsKKwkJaWYgKCh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWVsc2UKKwkJCXZtYS0+dm1fZmxhZ3MgJj0gflZNX01BWVdSSVRFOworCX0KKwlyZXR1cm4gZ2VuZXJpY19maWxlX21tYXAoZmlsZSwgdm1hKTsKK30KKworc3RhdGljIGludCBmdXNlX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlKQoreworCXByaW50aygiZnVzZV9zZXRfcGFnZV9kaXJ0eTogc2hvdWxkIG5vdCBoYXBwZW5cbiIpOworCWR1bXBfc3RhY2soKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnVzZV9maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLm1tYXAJCT0gZnVzZV9maWxlX21tYXAsCisJLm9wZW4JCT0gZnVzZV9vcGVuLAorCS5mbHVzaAkJPSBmdXNlX2ZsdXNoLAorCS5yZWxlYXNlCT0gZnVzZV9yZWxlYXNlLAorCS5mc3luYwkJPSBmdXNlX2ZzeW5jLAorCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGlyZWN0X2lvX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZnVzZV9kaXJlY3RfcmVhZCwKKwkud3JpdGUJCT0gZnVzZV9kaXJlY3Rfd3JpdGUsCisJLm9wZW4JCT0gZnVzZV9vcGVuLAorCS5mbHVzaAkJPSBmdXNlX2ZsdXNoLAorCS5yZWxlYXNlCT0gZnVzZV9yZWxlYXNlLAorCS5mc3luYwkJPSBmdXNlX2ZzeW5jLAorCS8qIG5vIG1tYXAgYW5kIHNlbmRmaWxlICovCit9OworCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBmdXNlX2ZpbGVfYW9wcyAgPSB7CisJLnJlYWRwYWdlCT0gZnVzZV9yZWFkcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IGZ1c2VfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZnVzZV9jb21taXRfd3JpdGUsCisJLnJlYWRwYWdlcwk9IGZ1c2VfcmVhZHBhZ2VzLAorCS5zZXRfcGFnZV9kaXJ0eQk9IGZ1c2Vfc2V0X3BhZ2VfZGlydHksCit9OworCit2b2lkIGZ1c2VfaW5pdF9maWxlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vZGUtPmlfZm9wID0gJmZ1c2VfZmlsZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmZnVzZV9maWxlX2FvcHM7Cit9CmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGQ3NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKworICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KKyAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCisqLworCisjaW5jbHVkZSA8bGludXgvZnVzZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKy8qKiBNYXggbnVtYmVyIG9mIHBhZ2VzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBzaW5nbGUgcmVhZCByZXF1ZXN0ICovCisjZGVmaW5lIEZVU0VfTUFYX1BBR0VTX1BFUl9SRVEgMzIKKworLyoqIElmIG1vcmUgcmVxdWVzdHMgYXJlIG91dHN0YW5kaW5nLCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBibG9jayAqLworI2RlZmluZSBGVVNFX01BWF9PVVRTVEFORElORyAxMAorCisvKiogSWYgdGhlIEZVU0VfREVGQVVMVF9QRVJNSVNTSU9OUyBmbGFnIGlzIGdpdmVuLCB0aGUgZmlsZXN5c3RlbQorICAgIG1vZHVsZSB3aWxsIGNoZWNrIHBlcm1pc3Npb25zIGJhc2VkIG9uIHRoZSBmaWxlIG1vZGUuICBPdGhlcndpc2Ugbm8KKyAgICBwZXJtaXNzaW9uIGNoZWNraW5nIGlzIGRvbmUgaW4gdGhlIGtlcm5lbCAqLworI2RlZmluZSBGVVNFX0RFRkFVTFRfUEVSTUlTU0lPTlMgKDEgPDwgMCkKKworLyoqIElmIHRoZSBGVVNFX0FMTE9XX09USEVSIGZsYWcgaXMgZ2l2ZW4sIHRoZW4gbm90IG9ubHkgdGhlIHVzZXIKKyAgICBkb2luZyB0aGUgbW91bnQgd2lsbCBiZSBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgZmlsZXN5c3RlbSAqLworI2RlZmluZSBGVVNFX0FMTE9XX09USEVSICAgICAgICAgKDEgPDwgMSkKKworCisvKiogRlVTRSBpbm9kZSAqLworc3RydWN0IGZ1c2VfaW5vZGUgeworCS8qKiBJbm9kZSBkYXRhICovCisJc3RydWN0IGlub2RlIGlub2RlOworCisJLyoqIFVuaXF1ZSBJRCwgd2hpY2ggaWRlbnRpZmllcyB0aGUgaW5vZGUgYmV0d2VlbiB1c2Vyc3BhY2UKKwkgKiBhbmQga2VybmVsICovCisJdTY0IG5vZGVpZDsKKworCS8qKiBOdW1iZXIgb2YgbG9va3VwcyBvbiB0aGlzIGlub2RlICovCisJdTY0IG5sb29rdXA7CisKKwkvKiogVGhlIHJlcXVlc3QgdXNlZCBmb3Igc2VuZGluZyB0aGUgRk9SR0VUIG1lc3NhZ2UgKi8KKwlzdHJ1Y3QgZnVzZV9yZXEgKmZvcmdldF9yZXE7CisKKwkvKiogVGltZSBpbiBqaWZmaWVzIHVudGlsIHRoZSBmaWxlIGF0dHJpYnV0ZXMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBpX3RpbWU7Cit9OworCisvKiogRlVTRSBzcGVjaWZpYyBmaWxlIGRhdGEgKi8KK3N0cnVjdCBmdXNlX2ZpbGUgeworCS8qKiBSZXF1ZXN0IHJlc2VydmVkIGZvciBmbHVzaCBhbmQgcmVsZWFzZSAqLworCXN0cnVjdCBmdXNlX3JlcSAqcmVsZWFzZV9yZXE7CisKKwkvKiogRmlsZSBoYW5kbGUgdXNlZCBieSB1c2Vyc3BhY2UgKi8KKwl1NjQgZmg7Cit9OworCisvKiogT25lIGlucHV0IGFyZ3VtZW50IG9mIGEgcmVxdWVzdCAqLworc3RydWN0IGZ1c2VfaW5fYXJnIHsKKwl1bnNpZ25lZCBzaXplOworCWNvbnN0IHZvaWQgKnZhbHVlOworfTsKKworLyoqIFRoZSByZXF1ZXN0IGlucHV0ICovCitzdHJ1Y3QgZnVzZV9pbiB7CisJLyoqIFRoZSByZXF1ZXN0IGhlYWRlciAqLworCXN0cnVjdCBmdXNlX2luX2hlYWRlciBoOworCisJLyoqIFRydWUgaWYgdGhlIGRhdGEgZm9yIHRoZSBsYXN0IGFyZ3VtZW50IGlzIGluIHJlcS0+cGFnZXMgKi8KKwl1bnNpZ25lZCBhcmdwYWdlczoxOworCisJLyoqIE51bWJlciBvZiBhcmd1bWVudHMgKi8KKwl1bnNpZ25lZCBudW1hcmdzOworCisJLyoqIEFycmF5IG9mIGFyZ3VtZW50cyAqLworCXN0cnVjdCBmdXNlX2luX2FyZyBhcmdzWzNdOworfTsKKworLyoqIE9uZSBvdXRwdXQgYXJndW1lbnQgb2YgYSByZXF1ZXN0ICovCitzdHJ1Y3QgZnVzZV9hcmcgeworCXVuc2lnbmVkIHNpemU7CisJdm9pZCAqdmFsdWU7Cit9OworCisvKiogVGhlIHJlcXVlc3Qgb3V0cHV0ICovCitzdHJ1Y3QgZnVzZV9vdXQgeworCS8qKiBIZWFkZXIgcmV0dXJuZWQgZnJvbSB1c2Vyc3BhY2UgKi8KKwlzdHJ1Y3QgZnVzZV9vdXRfaGVhZGVyIGg7CisKKwkvKiogTGFzdCBhcmd1bWVudCBpcyB2YXJpYWJsZSBsZW5ndGggKGNhbiBiZSBzaG9ydGVyIHRoYW4KKwkgICAgYXJnLT5zaXplKSAqLworCXVuc2lnbmVkIGFyZ3ZhcjoxOworCisJLyoqIExhc3QgYXJndW1lbnQgaXMgYSBsaXN0IG9mIHBhZ2VzIHRvIGNvcHkgZGF0YSB0byAqLworCXVuc2lnbmVkIGFyZ3BhZ2VzOjE7CisKKwkvKiogWmVybyBwYXJ0aWFsbHkgb3Igbm90IGNvcGllZCBwYWdlcyAqLworCXVuc2lnbmVkIHBhZ2VfemVyb2luZzoxOworCisJLyoqIE51bWJlciBvciBhcmd1bWVudHMgKi8KKwl1bnNpZ25lZCBudW1hcmdzOworCisJLyoqIEFycmF5IG9mIGFyZ3VtZW50cyAqLworCXN0cnVjdCBmdXNlX2FyZyBhcmdzWzNdOworfTsKKworc3RydWN0IGZ1c2VfcmVxOworc3RydWN0IGZ1c2VfY29ubjsKKworLyoqCisgKiBBIHJlcXVlc3QgdG8gdGhlIGNsaWVudAorICovCitzdHJ1Y3QgZnVzZV9yZXEgeworCS8qKiBUaGlzIGNhbiBiZSBvbiBlaXRoZXIgdW51c2VkX2xpc3QsIHBlbmRpbmcgb3IgcHJvY2Vzc2luZworCSAgICBsaXN0cyBpbiBmdXNlX2Nvbm4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiogRW50cnkgb24gdGhlIGJhY2tncm91bmQgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgYmdfZW50cnk7CisKKwkvKiogcmVmY291bnQgKi8KKwlhdG9taWNfdCBjb3VudDsKKworCS8qKiBUcnVlIGlmIHRoZSByZXF1ZXN0IGhhcyByZXBseSAqLworCXVuc2lnbmVkIGlzcmVwbHk6MTsKKworCS8qKiBUaGUgcmVxdWVzdCBpcyBwcmVhbGxvY2F0ZWQgKi8KKwl1bnNpZ25lZCBwcmVhbGxvY2F0ZWQ6MTsKKworCS8qKiBUaGUgcmVxdWVzdCB3YXMgaW50ZXJydXB0ZWQgKi8KKwl1bnNpZ25lZCBpbnRlcnJ1cHRlZDoxOworCisJLyoqIFJlcXVlc3QgaXMgc2VudCBpbiB0aGUgYmFja2dyb3VuZCAqLworCXVuc2lnbmVkIGJhY2tncm91bmQ6MTsKKworCS8qKiBEYXRhIGlzIGJlaW5nIGNvcGllZCB0by9mcm9tIHRoZSByZXF1ZXN0ICovCisJdW5zaWduZWQgbG9ja2VkOjE7CisKKwkvKiogUmVxdWVzdCBoYXMgYmVlbiBzZW50IHRvIHVzZXJzcGFjZSAqLworCXVuc2lnbmVkIHNlbnQ6MTsKKworCS8qKiBUaGUgcmVxdWVzdCBpcyBmaW5pc2hlZCAqLworCXVuc2lnbmVkIGZpbmlzaGVkOjE7CisKKwkvKiogVGhlIHJlcXVlc3QgaW5wdXQgKi8KKwlzdHJ1Y3QgZnVzZV9pbiBpbjsKKworCS8qKiBUaGUgcmVxdWVzdCBvdXRwdXQgKi8KKwlzdHJ1Y3QgZnVzZV9vdXQgb3V0OworCisJLyoqIFVzZWQgdG8gd2FrZSB1cCB0aGUgdGFzayB3YWl0aW5nIGZvciBjb21wbGV0aW9uIG9mIHJlcXVlc3QqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCisJLyoqIERhdGEgZm9yIGFzeW5jaHJvbm91cyByZXF1ZXN0cyAqLworCXVuaW9uIHsKKwkJc3RydWN0IGZ1c2VfZm9yZ2V0X2luIGZvcmdldF9pbjsKKwkJc3RydWN0IGZ1c2VfcmVsZWFzZV9pbiByZWxlYXNlX2luOworCQlzdHJ1Y3QgZnVzZV9pbml0X2luX291dCBpbml0X2luX291dDsKKwl9IG1pc2M7CisKKwkvKiogcGFnZSB2ZWN0b3IgKi8KKwlzdHJ1Y3QgcGFnZSAqcGFnZXNbRlVTRV9NQVhfUEFHRVNfUEVSX1JFUV07CisKKwkvKiogbnVtYmVyIG9mIHBhZ2VzIGluIHZlY3RvciAqLworCXVuc2lnbmVkIG51bV9wYWdlczsKKworCS8qKiBvZmZzZXQgb2YgZGF0YSBvbiBmaXJzdCBwYWdlICovCisJdW5zaWduZWQgcGFnZV9vZmZzZXQ7CisKKwkvKiogSW5vZGUgdXNlZCBpbiB0aGUgcmVxdWVzdCAqLworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwkvKiogU2Vjb25kIGlub2RlIHVzZWQgaW4gdGhlIHJlcXVlc3QgKG9yIE5VTEwpICovCisJc3RydWN0IGlub2RlICppbm9kZTI7CisKKwkvKiogRmlsZSB1c2VkIGluIHRoZSByZXF1ZXN0IChvciBOVUxMKSAqLworCXN0cnVjdCBmaWxlICpmaWxlOworfTsKKworLyoqCisgKiBBIEZ1c2UgY29ubmVjdGlvbi4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBjcmVhdGVkLCB3aGVuIHRoZSBmaWxlc3lzdGVtIGlzIG1vdW50ZWQsIGFuZCBpcworICogZGVzdHJveWVkLCB3aGVuIHRoZSBjbGllbnQgZGV2aWNlIGlzIGNsb3NlZCBhbmQgdGhlIGZpbGVzeXN0ZW0gaXMKKyAqIHVubW91bnRlZC4KKyAqLworc3RydWN0IGZ1c2VfY29ubiB7CisJLyoqIFJlZmVyZW5jZSBjb3VudCAqLworCWludCBjb3VudDsKKworCS8qKiBUaGUgdXNlciBpZCBmb3IgdGhpcyBtb3VudCAqLworCXVpZF90IHVzZXJfaWQ7CisKKwkvKiogVGhlIGdyb3VwIGlkIGZvciB0aGlzIG1vdW50ICovCisJZ2lkX3QgZ3JvdXBfaWQ7CisKKwkvKiogVGhlIGZ1c2UgbW91bnQgZmxhZ3MgZm9yIHRoaXMgbW91bnQgKi8KKwl1bnNpZ25lZCBmbGFnczsKKworCS8qKiBNYXhpbXVtIHJlYWQgc2l6ZSAqLworCXVuc2lnbmVkIG1heF9yZWFkOworCisJLyoqIE1heGltdW0gd3JpdGUgc2l6ZSAqLworCXVuc2lnbmVkIG1heF93cml0ZTsKKworCS8qKiBSZWFkZXJzIG9mIHRoZSBjb25uZWN0aW9uIGFyZSB3YWl0aW5nIG9uIHRoaXMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKKworCS8qKiBUaGUgbGlzdCBvZiBwZW5kaW5nIHJlcXVlc3RzICovCisJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nOworCisJLyoqIFRoZSBsaXN0IG9mIHJlcXVlc3RzIGJlaW5nIHByb2Nlc3NlZCAqLworCXN0cnVjdCBsaXN0X2hlYWQgcHJvY2Vzc2luZzsKKworCS8qKiBSZXF1ZXN0cyBwdXQgaW4gdGhlIGJhY2tncm91bmQgKFJFTEVBU0Ugb3IgYW55IG90aGVyCisJICAgIGludGVycnVwdGVkIHJlcXVlc3QpICovCisJc3RydWN0IGxpc3RfaGVhZCBiYWNrZ3JvdW5kOworCisJLyoqIENvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRzdGFuZGluZyByZXF1ZXN0cyAqLworCXN0cnVjdCBzZW1hcGhvcmUgb3V0c3RhbmRpbmdfc2VtOworCisJLyoqIFRoaXMgY291bnRzIHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVxdWVzdHMgaWYKKwkgICAgb3V0c3RhbmRpbmdfc2VtIHdvdWxkIGdvIG5lZ2F0aXZlICovCisJdW5zaWduZWQgb3V0c3RhbmRpbmdfZGVidDsKKworCS8qKiBSVyBzZW1hcGhvcmUgZm9yIGV4Y2x1c2lvbiB3aXRoIGZ1c2VfcHV0X3N1cGVyKCkgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIHNicHV0X3NlbTsKKworCS8qKiBUaGUgbGlzdCBvZiB1bnVzZWQgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHVudXNlZF9saXN0OworCisJLyoqIFRoZSBuZXh0IHVuaXF1ZSByZXF1ZXN0IGlkICovCisJdTY0IHJlcWN0cjsKKworCS8qKiBNb3VudCBpcyBhY3RpdmUgKi8KKwl1bnNpZ25lZCBtb3VudGVkIDogMTsKKworCS8qKiBDb25uZWN0aW9uIGVzdGFibGlzaGVkICovCisJdW5zaWduZWQgY29ubmVjdGVkIDogMTsKKworCS8qKiBDb25uZWN0aW9uIGZhaWxlZCAodmVyc2lvbiBtaXNtYXRjaCkgKi8KKwl1bnNpZ25lZCBjb25uX2Vycm9yIDogMTsKKworCS8qKiBJcyBmc3luYyBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCisJdW5zaWduZWQgbm9fZnN5bmMgOiAxOworCisJLyoqIElzIGZzeW5jZGlyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KKwl1bnNpZ25lZCBub19mc3luY2RpciA6IDE7CisKKwkvKiogSXMgZmx1c2ggbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLworCXVuc2lnbmVkIG5vX2ZsdXNoIDogMTsKKworCS8qKiBJcyBzZXR4YXR0ciBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCisJdW5zaWduZWQgbm9fc2V0eGF0dHIgOiAxOworCisJLyoqIElzIGdldHhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KKwl1bnNpZ25lZCBub19nZXR4YXR0ciA6IDE7CisKKwkvKiogSXMgbGlzdHhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KKwl1bnNpZ25lZCBub19saXN0eGF0dHIgOiAxOworCisJLyoqIElzIHJlbW92ZXhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KKwl1bnNpZ25lZCBub19yZW1vdmV4YXR0ciA6IDE7CisKKwkvKiogQmFja2luZyBkZXYgaW5mbyAqLworCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvIGJkaTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZ1c2VfY29ubiAqKmdldF9mdXNlX2Nvbm5fc3VwZXJfcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiAoc3RydWN0IGZ1c2VfY29ubiAqKikgJnNiLT5zX2ZzX2luZm87Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZ1c2VfY29ubiAqZ2V0X2Z1c2VfY29ubl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiAqZ2V0X2Z1c2VfY29ubl9zdXBlcl9wKHNiKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZnVzZV9jb25uICpnZXRfZnVzZV9jb25uKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGdldF9mdXNlX2Nvbm5fc3VwZXIoaW5vZGUtPmlfc2IpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmdXNlX2lub2RlICpnZXRfZnVzZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBmdXNlX2lub2RlLCBpbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IGdldF9ub2RlX2lkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGdldF9mdXNlX2lub2RlKGlub2RlKS0+bm9kZWlkOworfQorCisvKiogRGV2aWNlIG9wZXJhdGlvbnMgKi8KK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGV2X29wZXJhdGlvbnM7CisKKy8qKgorICogVGhpcyBpcyB0aGUgc2luZ2xlIGdsb2JhbCBzcGlubG9jayB3aGljaCBwcm90ZWN0cyBGVVNFJ3Mgc3RydWN0dXJlcworICoKKyAqIFRoZSBmb2xsb3dpbmcgZGF0YSBpcyBwcm90ZWN0ZWQgYnkgdGhpcyBsb2NrOgorICoKKyAqICAtIHRoZSBwcml2YXRlX2RhdGEgZmllbGQgb2YgdGhlIGRldmljZSBmaWxlCisgKiAgLSB0aGUgc19mc19pbmZvIGZpZWxkIG9mIHRoZSBzdXBlciBibG9jaworICogIC0gdW51c2VkX2xpc3QsIHBlbmRpbmcsIHByb2Nlc3NpbmcgbGlzdHMgaW4gZnVzZV9jb25uCisgKiAgLSBiYWNrZ3JvdW5kIGxpc3QgaW4gZnVzZV9jb25uCisgKiAgLSB0aGUgdW5pcXVlIHJlcXVlc3QgSUQgY291bnRlciByZXFjdHIgaW4gZnVzZV9jb25uCisgKiAgLSB0aGUgc2IgKHN1cGVyX2Jsb2NrKSBmaWVsZCBpbiBmdXNlX2Nvbm4KKyAqICAtIHRoZSBmaWxlIChkZXZpY2UgZmlsZSkgZmllbGQgaW4gZnVzZV9jb25uCisgKi8KK2V4dGVybiBzcGlubG9ja190IGZ1c2VfbG9jazsKKworLyoqCisgKiBHZXQgYSBmaWxsZWQgaW4gaW5vZGUKKyAqLworc3RydWN0IGlub2RlICpmdXNlX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBub2RlaWQsCisJCQlpbnQgZ2VuZXJhdGlvbiwgc3RydWN0IGZ1c2VfYXR0ciAqYXR0cik7CisKKy8qKgorICogU2VuZCBGT1JHRVQgY29tbWFuZAorICovCit2b2lkIGZ1c2Vfc2VuZF9mb3JnZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxLAorCQkgICAgICB1bnNpZ25lZCBsb25nIG5vZGVpZCwgdTY0IG5sb29rdXApOworCisvKioKKyAqIFNlbmQgUkVBRCBvciBSRUFERElSIHJlcXVlc3QKKyAqLworc2l6ZV90IGZ1c2Vfc2VuZF9yZWFkX2NvbW1vbihzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCwKKwkJCSAgICAgaW50IGlzZGlyKTsKKworLyoqCisgKiBTZW5kIE9QRU4gb3IgT1BFTkRJUiByZXF1ZXN0CisgKi8KK2ludCBmdXNlX29wZW5fY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgaXNkaXIpOworCisvKioKKyAqIFNlbmQgUkVMRUFTRSBvciBSRUxFQVNFRElSIHJlcXVlc3QKKyAqLworaW50IGZ1c2VfcmVsZWFzZV9jb21tb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBpc2Rpcik7CisKKy8qKgorICogU2VuZCBGU1lOQyBvciBGU1lOQ0RJUiByZXF1ZXN0CisgKi8KK2ludCBmdXNlX2ZzeW5jX2NvbW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGUsIGludCBkYXRhc3luYywKKwkJICAgICAgaW50IGlzZGlyKTsKKworLyoqCisgKiBJbml0aWFsaXNlIGZpbGUgb3BlcmF0aW9ucyBvbiBhIHJlZ3VsYXIgZmlsZQorICovCit2b2lkIGZ1c2VfaW5pdF9maWxlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCisvKioKKyAqIEluaXRpYWxpc2UgaW5vZGUgb3BlcmF0aW9ucyBvbiByZWd1bGFyIGZpbGVzIGFuZCBzcGVjaWFsIGZpbGVzCisgKi8KK3ZvaWQgZnVzZV9pbml0X2NvbW1vbihzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoqCisgKiBJbml0aWFsaXNlIGlub2RlIGFuZCBmaWxlIG9wZXJhdGlvbnMgb24gYSBkaXJlY3RvcnkKKyAqLwordm9pZCBmdXNlX2luaXRfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCisvKioKKyAqIEluaXRpYWxpc2UgaW5vZGUgb3BlcmF0aW9ucyBvbiBhIHN5bWxpbmsKKyAqLwordm9pZCBmdXNlX2luaXRfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoqCisgKiBDaGFuZ2UgYXR0cmlidXRlcyBvZiBhbiBpbm9kZQorICovCit2b2lkIGZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZ1c2VfYXR0ciAqYXR0cik7CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gY2FuIGJlIHJlbGVhc2VkLCBhbmQgaWYgeWVzLCB0aGVuIGZyZWUgdGhlCisgKiBjb25uZWN0aW9uIHN0cnVjdHVyZQorICovCit2b2lkIGZ1c2VfcmVsZWFzZV9jb25uKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKTsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBjbGllbnQgZGV2aWNlCisgKi8KK2ludCBmdXNlX2Rldl9pbml0KHZvaWQpOworCisvKioKKyAqIENsZWFudXAgdGhlIGNsaWVudCBkZXZpY2UKKyAqLwordm9pZCBmdXNlX2Rldl9jbGVhbnVwKHZvaWQpOworCisvKioKKyAqIEFsbG9jYXRlIGEgcmVxdWVzdAorICovCitzdHJ1Y3QgZnVzZV9yZXEgKmZ1c2VfcmVxdWVzdF9hbGxvYyh2b2lkKTsKKworLyoqCisgKiBGcmVlIGEgcmVxdWVzdAorICovCit2b2lkIGZ1c2VfcmVxdWVzdF9mcmVlKHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKKworLyoqCisgKiBSZWluaXRpYWxpemUgYSByZXF1ZXN0LCB0aGUgcHJlYWxsb2NhdGVkIGZsYWcgaXMgbGVmdCB1bm1vZGlmaWVkCisgKi8KK3ZvaWQgZnVzZV9yZXNldF9yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKKworLyoqCisgKiBSZXNlcnZlIGEgcHJlYWxsb2NhdGVkIHJlcXVlc3QKKyAqLworc3RydWN0IGZ1c2VfcmVxICpmdXNlX2dldF9yZXF1ZXN0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKTsKKworLyoqCisgKiBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9mIGEgcmVxdWVzdC4gIElmIGNvdW50IGdvZXMgdG8gemVybyBwdXQKKyAqIG9uIHVudXNlZCBsaXN0IChwcmVhbGxvY2F0ZWQpIG9yIGZyZWUgcmVxZXN0IChub3QgcHJlYWxsb2NhdGVkKS4KKyAqLwordm9pZCBmdXNlX3B1dF9yZXF1ZXN0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSk7CisKKy8qKgorICogU2VuZCBhIHJlcXVlc3QgKHN5bmNocm9ub3VzKQorICovCit2b2lkIHJlcXVlc3Rfc2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOworCisvKioKKyAqIFNlbmQgYSByZXF1ZXN0IHdpdGggbm8gcmVwbHkKKyAqLwordm9pZCByZXF1ZXN0X3NlbmRfbm9yZXBseShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOworCisvKioKKyAqIFNlbmQgYSByZXF1ZXN0IGluIHRoZSBiYWNrZ3JvdW5kCisgKi8KK3ZvaWQgcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKKworLyoqCisgKiBSZWxlYXNlIGlub2RlcyBhbmQgZmlsZSBhc3NpY2lhdGVkIHdpdGggYmFja2dyb3VuZCByZXF1ZXN0CisgKi8KK3ZvaWQgZnVzZV9yZWxlYXNlX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfcmVxICpyZXEpOworCisvKioKKyAqIEdldCB0aGUgYXR0cmlidXRlcyBvZiBhIGZpbGUKKyAqLworaW50IGZ1c2VfZG9fZ2V0YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoqCisgKiBJbnZhbGlkYXRlIGlub2RlIGF0dHJpYnV0ZXMKKyAqLwordm9pZCBmdXNlX2ludmFsaWRhdGVfYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoqCisgKiBTZW5kIHRoZSBJTklUIG1lc3NhZ2UKKyAqLwordm9pZCBmdXNlX3NlbmRfaW5pdChzdHJ1Y3QgZnVzZV9jb25uICpmYyk7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5YTU0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtMCwwICsxLDU5MSBAQAorLyoKKyAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKworICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KKyAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCisqLworCisjaW5jbHVkZSAiZnVzZV9pLmgiCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXRmcy5oPgorCitNT0RVTEVfQVVUSE9SKCJNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3NwaW5sb2NrX3QgZnVzZV9sb2NrOworc3RhdGljIGttZW1fY2FjaGVfdCAqZnVzZV9pbm9kZV9jYWNoZXA7CisKKyNkZWZpbmUgRlVTRV9TVVBFUl9NQUdJQyAweDY1NzM1NTQ2CisKK3N0cnVjdCBmdXNlX21vdW50X2RhdGEgeworCWludCBmZDsKKwl1bnNpZ25lZCByb290bW9kZTsKKwl1bnNpZ25lZCB1c2VyX2lkOworCXVuc2lnbmVkIGdyb3VwX2lkOworCXVuc2lnbmVkIGZkX3ByZXNlbnQgOiAxOworCXVuc2lnbmVkIHJvb3Rtb2RlX3ByZXNlbnQgOiAxOworCXVuc2lnbmVkIHVzZXJfaWRfcHJlc2VudCA6IDE7CisJdW5zaWduZWQgZ3JvdXBfaWRfcHJlc2VudCA6IDE7CisJdW5zaWduZWQgZmxhZ3M7CisJdW5zaWduZWQgbWF4X3JlYWQ7Cit9OworCitzdGF0aWMgc3RydWN0IGlub2RlICpmdXNlX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmk7CisKKwlpbm9kZSA9IGttZW1fY2FjaGVfYWxsb2MoZnVzZV9pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCWZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOworCWZpLT5pX3RpbWUgPSBqaWZmaWVzIC0gMTsKKwlmaS0+bm9kZWlkID0gMDsKKwlmaS0+bmxvb2t1cCA9IDA7CisJZmktPmZvcmdldF9yZXEgPSBmdXNlX3JlcXVlc3RfYWxsb2MoKTsKKwlpZiAoIWZpLT5mb3JnZXRfcmVxKSB7CisJCWttZW1fY2FjaGVfZnJlZShmdXNlX2lub2RlX2NhY2hlcCwgaW5vZGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGZ1c2VfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwlpZiAoZmktPmZvcmdldF9yZXEpCisJCWZ1c2VfcmVxdWVzdF9mcmVlKGZpLT5mb3JnZXRfcmVxKTsKKwlrbWVtX2NhY2hlX2ZyZWUoZnVzZV9pbm9kZV9jYWNoZXAsIGlub2RlKTsKK30KKworc3RhdGljIHZvaWQgZnVzZV9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJLyogTm8gb3AgKi8KK30KKwordm9pZCBmdXNlX3NlbmRfZm9yZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBub2RlaWQsIHU2NCBubG9va3VwKQoreworCXN0cnVjdCBmdXNlX2ZvcmdldF9pbiAqaW5hcmcgPSAmcmVxLT5taXNjLmZvcmdldF9pbjsKKwlpbmFyZy0+bmxvb2t1cCA9IG5sb29rdXA7CisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfRk9SR0VUOworCXJlcS0+aW4uaC5ub2RlaWQgPSBub2RlaWQ7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9mb3JnZXRfaW4pOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGluYXJnOworCXJlcXVlc3Rfc2VuZF9ub3JlcGx5KGZjLCByZXEpOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfQUNUSVZFKSB7CisJCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwkJZnVzZV9zZW5kX2ZvcmdldChmYywgZmktPmZvcmdldF9yZXEsIGZpLT5ub2RlaWQsIGZpLT5ubG9va3VwKTsKKwkJZmktPmZvcmdldF9yZXEgPSBOVUxMOworCX0KK30KKwordm9pZCBmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmdXNlX2F0dHIgKmF0dHIpCit7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgaV9zaXplX3JlYWQoaW5vZGUpICE9IGF0dHItPnNpemUpCisJCWludmFsaWRhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZyk7CisKKwlpbm9kZS0+aV9pbm8gICAgID0gYXR0ci0+aW5vOworCWlub2RlLT5pX21vZGUgICAgPSAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgKyAoYXR0ci0+bW9kZSAmIDA3Nzc3KTsKKwlpbm9kZS0+aV9ubGluayAgID0gYXR0ci0+bmxpbms7CisJaW5vZGUtPmlfdWlkICAgICA9IGF0dHItPnVpZDsKKwlpbm9kZS0+aV9naWQgICAgID0gYXR0ci0+Z2lkOworCWlfc2l6ZV93cml0ZShpbm9kZSwgYXR0ci0+c2l6ZSk7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlpbm9kZS0+aV9ibG9ja3MgID0gYXR0ci0+YmxvY2tzOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyAgID0gYXR0ci0+YXRpbWU7CisJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyAgPSBhdHRyLT5hdGltZW5zZWM7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjICAgPSBhdHRyLT5tdGltZTsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjICA9IGF0dHItPm10aW1lbnNlYzsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgICA9IGF0dHItPmN0aW1lOworCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgID0gYXR0ci0+Y3RpbWVuc2VjOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2luaXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZ1c2VfYXR0ciAqYXR0cikKK3sKKwlpbm9kZS0+aV9tb2RlID0gYXR0ci0+bW9kZSAmIFNfSUZNVDsKKwlpX3NpemVfd3JpdGUoaW5vZGUsIGF0dHItPnNpemUpOworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWZ1c2VfaW5pdF9jb21tb24oaW5vZGUpOworCQlmdXNlX2luaXRfZmlsZV9pbm9kZShpbm9kZSk7CisJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlmdXNlX2luaXRfZGlyKGlub2RlKTsKKwllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQlmdXNlX2luaXRfc3ltbGluayhpbm9kZSk7CisJZWxzZSBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpIHx8CisJCSBTX0lTRklGTyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSkgeworCQlmdXNlX2luaXRfY29tbW9uKGlub2RlKTsKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAorCQkJCSAgIG5ld19kZWNvZGVfZGV2KGF0dHItPnJkZXYpKTsKKwl9IGVsc2UgeworCQkvKiBEb24ndCBsZXQgdXNlciBjcmVhdGUgd2VpcmQgZmlsZXMgKi8KKwkJaW5vZGUtPmlfbW9kZSA9IFNfSUZSRUc7CisJCWZ1c2VfaW5pdF9jb21tb24oaW5vZGUpOworCQlmdXNlX2luaXRfZmlsZV9pbm9kZShpbm9kZSk7CisJfQorfQorCitzdGF0aWMgaW50IGZ1c2VfaW5vZGVfZXEoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqX25vZGVpZHApCit7CisJdW5zaWduZWQgbG9uZyBub2RlaWQgPSAqKHVuc2lnbmVkIGxvbmcgKikgX25vZGVpZHA7CisJaWYgKGdldF9ub2RlX2lkKGlub2RlKSA9PSBub2RlaWQpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9pbm9kZV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqX25vZGVpZHApCit7CisJdW5zaWduZWQgbG9uZyBub2RlaWQgPSAqKHVuc2lnbmVkIGxvbmcgKikgX25vZGVpZHA7CisJZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpLT5ub2RlaWQgPSBub2RlaWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpbm9kZSAqZnVzZV9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgbm9kZWlkLAorCQkJaW50IGdlbmVyYXRpb24sIHN0cnVjdCBmdXNlX2F0dHIgKmF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmk7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uX3N1cGVyKHNiKTsKKwlpbnQgcmV0cmllZCA9IDA7CisKKyByZXRyeToKKwlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzYiwgbm9kZWlkLCBmdXNlX2lub2RlX2VxLCBmdXNlX2lub2RlX3NldCwgJm5vZGVpZCk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKSB7CisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRXxTX05PQ01USU1FOworCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKwkJaW5vZGUtPmlfZGF0YS5iYWNraW5nX2Rldl9pbmZvID0gJmZjLT5iZGk7CisJCWZ1c2VfaW5pdF9pbm9kZShpbm9kZSwgYXR0cik7CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCX0gZWxzZSBpZiAoKGlub2RlLT5pX21vZGUgXiBhdHRyLT5tb2RlKSAmIFNfSUZNVCkgeworCQlCVUdfT04ocmV0cmllZCk7CisJCS8qIElub2RlIGhhcyBjaGFuZ2VkIHR5cGUsIGFueSBJL08gb24gdGhlIG9sZCBzaG91bGQgZmFpbCAqLworCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlyZXRyaWVkID0gMTsKKwkJZ290byByZXRyeTsKKwl9CisKKwlmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwlmaS0+bmxvb2t1cCArKzsKKwlmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzKGlub2RlLCBhdHRyKTsKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGZ1c2VfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uX3N1cGVyKHNiKTsKKworCWRvd25fd3JpdGUoJmZjLT5zYnB1dF9zZW0pOworCXdoaWxlICghbGlzdF9lbXB0eSgmZmMtPmJhY2tncm91bmQpKQorCQlmdXNlX3JlbGVhc2VfYmFja2dyb3VuZChsaXN0X2VudHJ5KGZjLT5iYWNrZ3JvdW5kLm5leHQsCisJCQkJCQkgICBzdHJ1Y3QgZnVzZV9yZXEsIGJnX2VudHJ5KSk7CisKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJZmMtPm1vdW50ZWQgPSAwOworCWZjLT51c2VyX2lkID0gMDsKKwlmYy0+Z3JvdXBfaWQgPSAwOworCWZjLT5mbGFncyA9IDA7CisJLyogRmx1c2ggYWxsIHJlYWRlcnMgb24gdGhpcyBmcyAqLworCXdha2VfdXBfYWxsKCZmYy0+d2FpdHEpOworCXVwX3dyaXRlKCZmYy0+c2JwdXRfc2VtKTsKKwlmdXNlX3JlbGVhc2VfY29ubihmYyk7CisJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfZnVzZV9zdGF0ZnMoc3RydWN0IGtzdGF0ZnMgKnN0YnVmLCBzdHJ1Y3QgZnVzZV9rc3RhdGZzICphdHRyKQoreworCXN0YnVmLT5mX3R5cGUgICAgPSBGVVNFX1NVUEVSX01BR0lDOworCXN0YnVmLT5mX2JzaXplICAgPSBhdHRyLT5ic2l6ZTsKKwlzdGJ1Zi0+Zl9ibG9ja3MgID0gYXR0ci0+YmxvY2tzOworCXN0YnVmLT5mX2JmcmVlICAgPSBhdHRyLT5iZnJlZTsKKwlzdGJ1Zi0+Zl9iYXZhaWwgID0gYXR0ci0+YmF2YWlsOworCXN0YnVmLT5mX2ZpbGVzICAgPSBhdHRyLT5maWxlczsKKwlzdGJ1Zi0+Zl9mZnJlZSAgID0gYXR0ci0+ZmZyZWU7CisJc3RidWYtPmZfbmFtZWxlbiA9IGF0dHItPm5hbWVsZW47CisJLyogZnNpZCBpcyBsZWZ0IHplcm8gKi8KK30KKworc3RhdGljIGludCBmdXNlX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubl9zdXBlcihzYik7CisJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisJc3RydWN0IGZ1c2Vfc3RhdGZzX291dCBvdXRhcmc7CisJaW50IGVycjsKKworICAgICAgICByZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCXJlcS0+aW4ubnVtYXJncyA9IDA7CisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfU1RBVEZTOworCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCWlmICghZXJyKQorCQljb252ZXJ0X2Z1c2Vfc3RhdGZzKGJ1ZiwgJm91dGFyZy5zdCk7CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlyZXR1cm4gZXJyOworfQorCitlbnVtIHsKKwlPUFRfRkQsCisJT1BUX1JPT1RNT0RFLAorCU9QVF9VU0VSX0lELAorCU9QVF9HUk9VUF9JRCwKKwlPUFRfREVGQVVMVF9QRVJNSVNTSU9OUywKKwlPUFRfQUxMT1dfT1RIRVIsCisJT1BUX01BWF9SRUFELAorCU9QVF9FUlIKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T1BUX0ZELAkJCSJmZD0ldSJ9LAorCXtPUFRfUk9PVE1PREUsCQkJInJvb3Rtb2RlPSVvIn0sCisJe09QVF9VU0VSX0lELAkJCSJ1c2VyX2lkPSV1In0sCisJe09QVF9HUk9VUF9JRCwJCQkiZ3JvdXBfaWQ9JXUifSwKKwl7T1BUX0RFRkFVTFRfUEVSTUlTU0lPTlMsCSJkZWZhdWx0X3Blcm1pc3Npb25zIn0sCisJe09QVF9BTExPV19PVEhFUiwJCSJhbGxvd19vdGhlciJ9LAorCXtPUFRfTUFYX1JFQUQsCQkJIm1heF9yZWFkPSV1In0sCisJe09QVF9FUlIsCQkJTlVMTH0KK307CisKK3N0YXRpYyBpbnQgcGFyc2VfZnVzZV9vcHQoY2hhciAqb3B0LCBzdHJ1Y3QgZnVzZV9tb3VudF9kYXRhICpkKQoreworCWNoYXIgKnA7CisJbWVtc2V0KGQsIDAsIHNpemVvZihzdHJ1Y3QgZnVzZV9tb3VudF9kYXRhKSk7CisJZC0+bWF4X3JlYWQgPSB+MDsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0LCAiLCIpKSAhPSBOVUxMKSB7CisJCWludCB0b2tlbjsKKwkJaW50IHZhbHVlOworCQlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPUFRfRkQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmdmFsdWUpKQorCQkJCXJldHVybiAwOworCQkJZC0+ZmQgPSB2YWx1ZTsKKwkJCWQtPmZkX3ByZXNlbnQgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBPUFRfUk9PVE1PREU6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZ2YWx1ZSkpCisJCQkJcmV0dXJuIDA7CisJCQlkLT5yb290bW9kZSA9IHZhbHVlOworCQkJZC0+cm9vdG1vZGVfcHJlc2VudCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIE9QVF9VU0VSX0lEOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJnZhbHVlKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWQtPnVzZXJfaWQgPSB2YWx1ZTsKKwkJCWQtPnVzZXJfaWRfcHJlc2VudCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIE9QVF9HUk9VUF9JRDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZ2YWx1ZSkpCisJCQkJcmV0dXJuIDA7CisJCQlkLT5ncm91cF9pZCA9IHZhbHVlOworCQkJZC0+Z3JvdXBfaWRfcHJlc2VudCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIE9QVF9ERUZBVUxUX1BFUk1JU1NJT05TOgorCQkJZC0+ZmxhZ3MgfD0gRlVTRV9ERUZBVUxUX1BFUk1JU1NJT05TOworCQkJYnJlYWs7CisKKwkJY2FzZSBPUFRfQUxMT1dfT1RIRVI6CisJCQlkLT5mbGFncyB8PSBGVVNFX0FMTE9XX09USEVSOworCQkJYnJlYWs7CisKKwkJY2FzZSBPUFRfTUFYX1JFQUQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmdmFsdWUpKQorCQkJCXJldHVybiAwOworCQkJZC0+bWF4X3JlYWQgPSB2YWx1ZTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICghZC0+ZmRfcHJlc2VudCB8fCAhZC0+cm9vdG1vZGVfcHJlc2VudCB8fAorCSAgICAhZC0+dXNlcl9pZF9wcmVzZW50IHx8ICFkLT5ncm91cF9pZF9wcmVzZW50KQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZ1c2Vfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uX3N1cGVyKG1udC0+bW50X3NiKTsKKworCXNlcV9wcmludGYobSwgIix1c2VyX2lkPSV1IiwgZmMtPnVzZXJfaWQpOworCXNlcV9wcmludGYobSwgIixncm91cF9pZD0ldSIsIGZjLT5ncm91cF9pZCk7CisJaWYgKGZjLT5mbGFncyAmIEZVU0VfREVGQVVMVF9QRVJNSVNTSU9OUykKKwkJc2VxX3B1dHMobSwgIixkZWZhdWx0X3Blcm1pc3Npb25zIik7CisJaWYgKGZjLT5mbGFncyAmIEZVU0VfQUxMT1dfT1RIRVIpCisJCXNlcV9wdXRzKG0sICIsYWxsb3dfb3RoZXIiKTsKKwlpZiAoZmMtPm1heF9yZWFkICE9IH4wKQorCQlzZXFfcHJpbnRmKG0sICIsbWF4X3JlYWQ9JXUiLCBmYy0+bWF4X3JlYWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2Nvbm4oc3RydWN0IGZ1c2VfY29ubiAqZmMpCit7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZmYy0+dW51c2VkX2xpc3QpKSB7CisJCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCQlyZXEgPSBsaXN0X2VudHJ5KGZjLT51bnVzZWRfbGlzdC5uZXh0LCBzdHJ1Y3QgZnVzZV9yZXEsIGxpc3QpOworCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwkJZnVzZV9yZXF1ZXN0X2ZyZWUocmVxKTsKKwl9CisJa2ZyZWUoZmMpOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBmdXNlIGxvY2sgaGVsZCAqLwordm9pZCBmdXNlX3JlbGVhc2VfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlmYy0+Y291bnQtLTsKKwlpZiAoIWZjLT5jb3VudCkKKwkJZnJlZV9jb25uKGZjKTsKK30KKworc3RhdGljIHN0cnVjdCBmdXNlX2Nvbm4gKm5ld19jb25uKHZvaWQpCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmM7CisKKwlmYyA9IGttYWxsb2Moc2l6ZW9mKCpmYyksIEdGUF9LRVJORUwpOworCWlmIChmYyAhPSBOVUxMKSB7CisJCWludCBpOworCQltZW1zZXQoZmMsIDAsIHNpemVvZigqZmMpKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPndhaXRxKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZjLT5wZW5kaW5nKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZjLT5wcm9jZXNzaW5nKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZjLT51bnVzZWRfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZmYy0+YmFja2dyb3VuZCk7CisJCXNlbWFfaW5pdCgmZmMtPm91dHN0YW5kaW5nX3NlbSwgMCk7CisJCWluaXRfcndzZW0oJmZjLT5zYnB1dF9zZW0pOworCQlmb3IgKGkgPSAwOyBpIDwgRlVTRV9NQVhfT1VUU1RBTkRJTkc7IGkrKykgeworCQkJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBmdXNlX3JlcXVlc3RfYWxsb2MoKTsKKwkJCWlmICghcmVxKSB7CisJCQkJZnJlZV9jb25uKGZjKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZmYy0+dW51c2VkX2xpc3QpOworCQl9CisJCWZjLT5iZGkucmFfcGFnZXMgPSAoVk1fTUFYX1JFQURBSEVBRCAqIDEwMjQpIC8gUEFHRV9DQUNIRV9TSVpFOworCQlmYy0+YmRpLnVucGx1Z19pb19mbiA9IGRlZmF1bHRfdW5wbHVnX2lvX2ZuOworCQlmYy0+cmVxY3RyID0gMDsKKwl9CisJcmV0dXJuIGZjOworfQorCitzdGF0aWMgc3RydWN0IGZ1c2VfY29ubiAqZ2V0X2Nvbm4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmM7CisKKwlpZiAoZmlsZS0+Zl9vcCAhPSAmZnVzZV9kZXZfb3BlcmF0aW9ucykKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJZmMgPSBuZXdfY29ubigpOworCWlmIChmYyA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSkgeworCQlmcmVlX2Nvbm4oZmMpOworCQlmYyA9IEVSUl9QVFIoLUVJTlZBTCk7CisJfSBlbHNlIHsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmM7CisJCSpnZXRfZnVzZV9jb25uX3N1cGVyX3Aoc2IpID0gZmM7CisJCWZjLT5tb3VudGVkID0gMTsKKwkJZmMtPmNvbm5lY3RlZCA9IDE7CisJCWZjLT5jb3VudCA9IDI7CisJfQorCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCXJldHVybiBmYzsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2V0X3Jvb3RfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbW9kZSkKK3sKKwlzdHJ1Y3QgZnVzZV9hdHRyIGF0dHI7CisJbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXR0cikpOworCisJYXR0ci5tb2RlID0gbW9kZTsKKwlhdHRyLmlubyA9IEZVU0VfUk9PVF9JRDsKKwlyZXR1cm4gZnVzZV9pZ2V0KHNiLCAxLCAwLCAmYXR0cik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBmdXNlX3N1cGVyX29wZXJhdGlvbnMgPSB7CisJLmFsbG9jX2lub2RlICAgID0gZnVzZV9hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZSAgPSBmdXNlX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBmdXNlX3JlYWRfaW5vZGUsCisJLmNsZWFyX2lub2RlCT0gZnVzZV9jbGVhcl9pbm9kZSwKKwkucHV0X3N1cGVyCT0gZnVzZV9wdXRfc3VwZXIsCisJLnN0YXRmcwkJPSBmdXNlX3N0YXRmcywKKwkuc2hvd19vcHRpb25zCT0gZnVzZV9zaG93X29wdGlvbnMsCit9OworCitzdGF0aWMgaW50IGZ1c2VfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOworCXN0cnVjdCBpbm9kZSAqcm9vdDsKKwlzdHJ1Y3QgZnVzZV9tb3VudF9kYXRhIGQ7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGVycjsKKworCWlmICghcGFyc2VfZnVzZV9vcHQoKGNoYXIgKikgZGF0YSwgJmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNiLT5zX2Jsb2Nrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc2ItPnNfbWFnaWMgPSBGVVNFX1NVUEVSX01BR0lDOworCXNiLT5zX29wID0gJmZ1c2Vfc3VwZXJfb3BlcmF0aW9uczsKKwlzYi0+c19tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7CisKKwlmaWxlID0gZmdldChkLmZkKTsKKwlpZiAoIWZpbGUpCisJCXJldHVybiAtRUlOVkFMOworCisJZmMgPSBnZXRfY29ubihmaWxlLCBzYik7CisJZnB1dChmaWxlKTsKKwlpZiAoSVNfRVJSKGZjKSkKKwkJcmV0dXJuIFBUUl9FUlIoZmMpOworCisJZmMtPmZsYWdzID0gZC5mbGFnczsKKwlmYy0+dXNlcl9pZCA9IGQudXNlcl9pZDsKKwlmYy0+Z3JvdXBfaWQgPSBkLmdyb3VwX2lkOworCWZjLT5tYXhfcmVhZCA9IGQubWF4X3JlYWQ7CisJaWYgKGZjLT5tYXhfcmVhZCAvIFBBR0VfQ0FDSEVfU0laRSA8IGZjLT5iZGkucmFfcGFnZXMpCisJCWZjLT5iZGkucmFfcGFnZXMgPSBmYy0+bWF4X3JlYWQgLyBQQUdFX0NBQ0hFX1NJWkU7CisJZmMtPm1heF93cml0ZSA9IEZVU0VfTUFYX0lOIC8gMjsKKworCWVyciA9IC1FTk9NRU07CisJcm9vdCA9IGdldF9yb290X2lub2RlKHNiLCBkLnJvb3Rtb2RlKTsKKwlpZiAocm9vdCA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCWlwdXQocm9vdCk7CisJCWdvdG8gZXJyOworCX0KKwlmdXNlX3NlbmRfaW5pdChmYyk7CisJcmV0dXJuIDA7CisKKyBlcnI6CisJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCWZ1c2VfcmVsZWFzZV9jb25uKGZjKTsKKwlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpmdXNlX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJCQkgICAgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkgICAgICAgdm9pZCAqcmF3X2RhdGEpCit7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgcmF3X2RhdGEsIGZ1c2VfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBmdXNlX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJmdXNlIiwKKwkuZ2V0X3NiCQk9IGZ1c2VfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorfTsKKworc3RhdGljIHZvaWQgZnVzZV9pbm9kZV9pbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwKKwkJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZShpbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGZ1c2VfZnNfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZmdXNlX2ZzX3R5cGUpOworCWlmIChlcnIpCisJCXByaW50aygiZnVzZTogZmFpbGVkIHRvIHJlZ2lzdGVyIGZpbGVzeXN0ZW1cbiIpOworCWVsc2UgeworCQlmdXNlX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJmdXNlX2lub2RlIiwKKwkJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgZnVzZV9pbm9kZSksCisJCQkJCQkgICAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCQkgICAgICBmdXNlX2lub2RlX2luaXRfb25jZSwgTlVMTCk7CisJCWlmICghZnVzZV9pbm9kZV9jYWNoZXApIHsKKwkJCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZnVzZV9mc190eXBlKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2ZzX2NsZWFudXAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmZ1c2VfZnNfdHlwZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGZ1c2VfaW5vZGVfY2FjaGVwKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZnVzZV9pbml0KHZvaWQpCit7CisJaW50IHJlczsKKworCXByaW50aygiZnVzZSBpbml0IChBUEkgdmVyc2lvbiAlaS4laSlcbiIsCisJICAgICAgIEZVU0VfS0VSTkVMX1ZFUlNJT04sIEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT04pOworCisJc3Bpbl9sb2NrX2luaXQoJmZ1c2VfbG9jayk7CisJcmVzID0gZnVzZV9mc19pbml0KCk7CisJaWYgKHJlcykKKwkJZ290byBlcnI7CisKKwlyZXMgPSBmdXNlX2Rldl9pbml0KCk7CisJaWYgKHJlcykKKwkJZ290byBlcnJfZnNfY2xlYW51cDsKKworCXJldHVybiAwOworCisgZXJyX2ZzX2NsZWFudXA6CisJZnVzZV9mc19jbGVhbnVwKCk7CisgZXJyOgorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmdXNlX2V4aXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiZnVzZSBleGl0XG4iKTsKKworCWZ1c2VfZnNfY2xlYW51cCgpOworCWZ1c2VfZGV2X2NsZWFudXAoKTsKK30KKworbW9kdWxlX2luaXQoZnVzZV9pbml0KTsKK21vZHVsZV9leGl0KGZ1c2VfZXhpdCk7CmRpZmYgLS1naXQgYS9mcy9oZnMvYm5vZGUuYyBiL2ZzL2hmcy9ibm9kZS5jCmluZGV4IGEwOTZjNWEuLjNkNWNkYzYgMTAwNjQ0Ci0tLSBhL2ZzL2hmcy9ibm9kZS5jCisrKyBiL2ZzL2hmcy9ibm9kZS5jCkBAIC0xMyw4ICsxMyw2IEBACiAKICNpbmNsdWRlICJidHJlZS5oIgogCi0jZGVmaW5lIFJFRl9QQUdFUwkwCi0KIHZvaWQgaGZzX2Jub2RlX3JlYWQoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdm9pZCAqYnVmLAogCQlpbnQgb2ZmLCBpbnQgbGVuKQogewpAQCAtMjg5LDkgKzI4Nyw3IEBACiAJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KLSNpZiAhUkVGX1BBR0VTCiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLSNlbmRpZgogCQlub2RlLT5wYWdlW2ldID0gcGFnZTsKIAl9CiAKQEAgLTQ0OSwxMyArNDQ1LDYgQEAKIHsKIAlpZiAobm9kZSkgewogCQlhdG9taWNfaW5jKCZub2RlLT5yZWZjbnQpOwotI2lmIFJFRl9QQUdFUwotCQl7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+dHJlZS0+cGFnZXNfcGVyX2Jub2RlOyBpKyspCi0JCQlnZXRfcGFnZShub2RlLT5wYWdlW2ldKTsKLQkJfQotI2VuZGlmCiAJCWRwcmludChEQkdfQk5PREVfUkVGUywgImdldF9ub2RlKCVkOiVkKTogJWRcbiIsCiAJCSAgICAgICBub2RlLT50cmVlLT5jbmlkLCBub2RlLT50aGlzLCBhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSk7CiAJfQpAQCAtNDcyLDIwICs0NjEsMTIgQEAKIAkJICAgICAgIG5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMsIGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKTsKIAkJaWYgKCFhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSkKIAkJCUJVRygpOwotCQlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJm5vZGUtPnJlZmNudCwgJnRyZWUtPmhhc2hfbG9jaykpIHsKLSNpZiBSRUZfUEFHRVMKLQkJCWZvciAoaSA9IDA7IGkgPCB0cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykKLQkJCQlwdXRfcGFnZShub2RlLT5wYWdlW2ldKTsKLSNlbmRpZgorCQlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJm5vZGUtPnJlZmNudCwgJnRyZWUtPmhhc2hfbG9jaykpCiAJCQlyZXR1cm47Ci0JCX0KIAkJZm9yIChpID0gMDsgaSA8IHRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKSB7CiAJCQlpZiAoIW5vZGUtPnBhZ2VbaV0pCiAJCQkJY29udGludWU7CiAJCQltYXJrX3BhZ2VfYWNjZXNzZWQobm9kZS0+cGFnZVtpXSk7Ci0jaWYgUkVGX1BBR0VTCi0JCQlwdXRfcGFnZShub2RlLT5wYWdlW2ldKTsKLSNlbmRpZgogCQl9CiAKIAkJaWYgKHRlc3RfYml0KEhGU19CTk9ERV9ERUxFVEVELCAmbm9kZS0+ZmxhZ3MpKSB7CmRpZmYgLS1naXQgYS9mcy9oZnMvY2F0YWxvZy5jIGIvZnMvaGZzL2NhdGFsb2cuYwppbmRleCA2NWRlZGVmLi4yZmNkNjc5IDEwMDY0NAotLS0gYS9mcy9oZnMvY2F0YWxvZy5jCisrKyBiL2ZzL2hmcy9jYXRhbG9nLmMKQEAgLTIwLDEyICsyMCwxMiBAQAogICoKICAqIEdpdmVuIHRoZSBJRCBvZiB0aGUgcGFyZW50IGFuZCB0aGUgbmFtZSBidWlsZCBhIHNlYXJjaCBrZXkuCiAgKi8KLXZvaWQgaGZzX2NhdF9idWlsZF9rZXkoYnRyZWVfa2V5ICprZXksIHUzMiBwYXJlbnQsIHN0cnVjdCBxc3RyICpuYW1lKQordm9pZCBoZnNfY2F0X2J1aWxkX2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBidHJlZV9rZXkgKmtleSwgdTMyIHBhcmVudCwgc3RydWN0IHFzdHIgKm5hbWUpCiB7CiAJa2V5LT5jYXQucmVzZXJ2ZWQgPSAwOwogCWtleS0+Y2F0LlBhcklEID0gY3B1X3RvX2JlMzIocGFyZW50KTsKIAlpZiAobmFtZSkgewotCQloZnNfdHJpdjJtYWMoJmtleS0+Y2F0LkNOYW1lLCBuYW1lKTsKKwkJaGZzX2FzYzJtYWMoc2IsICZrZXktPmNhdC5DTmFtZSwgbmFtZSk7CiAJCWtleS0+a2V5X2xlbiA9IDYgKyBrZXktPmNhdC5DTmFtZS5sZW47CiAJfSBlbHNlIHsKIAkJbWVtc2V0KCZrZXktPmNhdC5DTmFtZSwgMCwgc2l6ZW9mKHN0cnVjdCBoZnNfbmFtZSkpOwpAQCAtNjIsMTMgKzYyLDE0IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGhmc19jYXRfYnVpbGRfdGhyZWFkKGhmc19jYXRfcmVjICpyZWMsIGludCB0eXBlLAorc3RhdGljIGludCBoZnNfY2F0X2J1aWxkX3RocmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCWhmc19jYXRfcmVjICpyZWMsIGludCB0eXBlLAogCQkJCXUzMiBwYXJlbnRpZCwgc3RydWN0IHFzdHIgKm5hbWUpCiB7CiAJcmVjLT50eXBlID0gdHlwZTsKIAltZW1zZXQocmVjLT50aHJlYWQucmVzZXJ2ZWQsIDAsIHNpemVvZihyZWMtPnRocmVhZC5yZXNlcnZlZCkpOwogCXJlYy0+dGhyZWFkLlBhcklEID0gY3B1X3RvX2JlMzIocGFyZW50aWQpOwotCWhmc190cml2Mm1hYygmcmVjLT50aHJlYWQuQ05hbWUsIG5hbWUpOworCWhmc19hc2MybWFjKHNiLCAmcmVjLT50aHJlYWQuQ05hbWUsIG5hbWUpOwogCXJldHVybiBzaXplb2Yoc3RydWN0IGhmc19jYXRfdGhyZWFkKTsKIH0KIApAQCAtOTMsOCArOTQsOCBAQAogCXNiID0gZGlyLT5pX3NiOwogCWhmc19maW5kX2luaXQoSEZTX1NCKHNiKS0+Y2F0X3RyZWUsICZmZCk7CiAKLQloZnNfY2F0X2J1aWxkX2tleShmZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKLQllbnRyeV9zaXplID0gaGZzX2NhdF9idWlsZF90aHJlYWQoJmVudHJ5LCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8KKwloZnNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJZW50cnlfc2l6ZSA9IGhmc19jYXRfYnVpbGRfdGhyZWFkKHNiLCAmZW50cnksIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgPwogCQkJSEZTX0NEUl9USEQgOiBIRlNfQ0RSX0ZUSCwKIAkJCWRpci0+aV9pbm8sIHN0cik7CiAJZXJyID0gaGZzX2JyZWNfZmluZCgmZmQpOwpAQCAtMTA3LDcgKzEwOCw3IEBACiAJaWYgKGVycikKIAkJZ290byBlcnIyOwogCi0JaGZzX2NhdF9idWlsZF9rZXkoZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgc3RyKTsKKwloZnNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgc3RyKTsKIAllbnRyeV9zaXplID0gaGZzX2NhdF9idWlsZF9yZWNvcmQoJmVudHJ5LCBjbmlkLCBpbm9kZSk7CiAJZXJyID0gaGZzX2JyZWNfZmluZCgmZmQpOwogCWlmIChlcnIgIT0gLUVOT0VOVCkgewpAQCAtMTI3LDcgKzEyOCw3IEBACiAJcmV0dXJuIDA7CiAKIGVycjE6Ci0JaGZzX2NhdF9idWlsZF9rZXkoZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJaGZzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOwogCWlmICghaGZzX2JyZWNfZmluZCgmZmQpKQogCQloZnNfYnJlY19yZW1vdmUoJmZkKTsKIGVycjI6CkBAIC0xNzYsNyArMTc3LDcgQEAKIAloZnNfY2F0X3JlYyByZWM7CiAJaW50IHJlcywgbGVuLCB0eXBlOwogCi0JaGZzX2NhdF9idWlsZF9rZXkoZmQtPnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWhmc19jYXRfYnVpbGRfa2V5KHNiLCBmZC0+c2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CiAJcmVzID0gaGZzX2JyZWNfcmVhZChmZCwgJnJlYywgc2l6ZW9mKHJlYykpOwogCWlmIChyZXMpCiAJCXJldHVybiByZXM7CkBAIC0yMTEsNyArMjEyLDcgQEAKIAlzYiA9IGRpci0+aV9zYjsKIAloZnNfZmluZF9pbml0KEhGU19TQihzYiktPmNhdF90cmVlLCAmZmQpOwogCi0JaGZzX2NhdF9idWlsZF9rZXkoZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgc3RyKTsKKwloZnNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgc3RyKTsKIAlyZXMgPSBoZnNfYnJlY19maW5kKCZmZCk7CiAJaWYgKHJlcykKIAkJZ290byBvdXQ7CkBAIC0yMzksNyArMjQwLDcgQEAKIAlpZiAocmVzKQogCQlnb3RvIG91dDsKIAotCWhmc19jYXRfYnVpbGRfa2V5KGZkLnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWhmc19jYXRfYnVpbGRfa2V5KHNiLCBmZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKIAlyZXMgPSBoZnNfYnJlY19maW5kKCZmZCk7CiAJaWYgKCFyZXMpIHsKIAkJcmVzID0gaGZzX2JyZWNfcmVtb3ZlKCZmZCk7CkBAIC0yODAsNyArMjgxLDcgQEAKIAlkc3RfZmQgPSBzcmNfZmQ7CiAKIAkvKiBmaW5kIHRoZSBvbGQgZGlyIGVudHJ5IGFuZCByZWFkIHRoZSBkYXRhICovCi0JaGZzX2NhdF9idWlsZF9rZXkoc3JjX2ZkLnNlYXJjaF9rZXksIHNyY19kaXItPmlfaW5vLCBzcmNfbmFtZSk7CisJaGZzX2NhdF9idWlsZF9rZXkoc2IsIHNyY19mZC5zZWFyY2hfa2V5LCBzcmNfZGlyLT5pX2lubywgc3JjX25hbWUpOwogCWVyciA9IGhmc19icmVjX2ZpbmQoJnNyY19mZCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CkBAIC0yODksNyArMjkwLDcgQEAKIAkJCSAgICBzcmNfZmQuZW50cnlsZW5ndGgpOwogCiAJLyogY3JlYXRlIG5ldyBkaXIgZW50cnkgd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBvbGQgZW50cnkgKi8KLQloZnNfY2F0X2J1aWxkX2tleShkc3RfZmQuc2VhcmNoX2tleSwgZHN0X2Rpci0+aV9pbm8sIGRzdF9uYW1lKTsKKwloZnNfY2F0X2J1aWxkX2tleShzYiwgZHN0X2ZkLnNlYXJjaF9rZXksIGRzdF9kaXItPmlfaW5vLCBkc3RfbmFtZSk7CiAJZXJyID0gaGZzX2JyZWNfZmluZCgmZHN0X2ZkKTsKIAlpZiAoZXJyICE9IC1FTk9FTlQpIHsKIAkJaWYgKCFlcnIpCkBAIC0zMDUsNyArMzA2LDcgQEAKIAltYXJrX2lub2RlX2RpcnR5KGRzdF9kaXIpOwogCiAJLyogZmluYWxseSByZW1vdmUgdGhlIG9sZCBlbnRyeSAqLwotCWhmc19jYXRfYnVpbGRfa2V5KHNyY19mZC5zZWFyY2hfa2V5LCBzcmNfZGlyLT5pX2lubywgc3JjX25hbWUpOworCWhmc19jYXRfYnVpbGRfa2V5KHNiLCBzcmNfZmQuc2VhcmNoX2tleSwgc3JjX2Rpci0+aV9pbm8sIHNyY19uYW1lKTsKIAllcnIgPSBoZnNfYnJlY19maW5kKCZzcmNfZmQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpAQCAtMzIxLDcgKzMyMiw3IEBACiAJCWdvdG8gb3V0OwogCiAJLyogcmVtb3ZlIG9sZCB0aHJlYWQgZW50cnkgKi8KLQloZnNfY2F0X2J1aWxkX2tleShzcmNfZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJaGZzX2NhdF9idWlsZF9rZXkoc2IsIHNyY19mZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKIAllcnIgPSBoZnNfYnJlY19maW5kKCZzcmNfZmQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpAQCAtMzMwLDggKzMzMSw4IEBACiAJCWdvdG8gb3V0OwogCiAJLyogY3JlYXRlIG5ldyB0aHJlYWQgZW50cnkgKi8KLQloZnNfY2F0X2J1aWxkX2tleShkc3RfZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7Ci0JZW50cnlfc2l6ZSA9IGhmc19jYXRfYnVpbGRfdGhyZWFkKCZlbnRyeSwgdHlwZSA9PSBIRlNfQ0RSX0ZJTCA/IEhGU19DRFJfRlRIIDogSEZTX0NEUl9USEQsCisJaGZzX2NhdF9idWlsZF9rZXkoc2IsIGRzdF9mZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKKwllbnRyeV9zaXplID0gaGZzX2NhdF9idWlsZF90aHJlYWQoc2IsICZlbnRyeSwgdHlwZSA9PSBIRlNfQ0RSX0ZJTCA/IEhGU19DRFJfRlRIIDogSEZTX0NEUl9USEQsCiAJCQkJCWRzdF9kaXItPmlfaW5vLCBkc3RfbmFtZSk7CiAJZXJyID0gaGZzX2JyZWNfZmluZCgmZHN0X2ZkKTsKIAlpZiAoZXJyICE9IC1FTk9FTlQpIHsKZGlmZiAtLWdpdCBhL2ZzL2hmcy9kaXIuYyBiL2ZzL2hmcy9kaXIuYwppbmRleCBjNTU5OTgyLi5lMWYyNGJlIDEwMDY0NAotLS0gYS9mcy9oZnMvZGlyLmMKKysrIGIvZnMvaGZzL2Rpci5jCkBAIC0yOCw3ICsyOCw3IEBACiAJZGVudHJ5LT5kX29wID0gJmhmc19kZW50cnlfb3BlcmF0aW9uczsKIAogCWhmc19maW5kX2luaXQoSEZTX1NCKGRpci0+aV9zYiktPmNhdF90cmVlLCAmZmQpOwotCWhmc19jYXRfYnVpbGRfa2V5KGZkLnNlYXJjaF9rZXksIGRpci0+aV9pbm8sICZkZW50cnktPmRfbmFtZSk7CisJaGZzX2NhdF9idWlsZF9rZXkoZGlyLT5pX3NiLCBmZC5zZWFyY2hfa2V5LCBkaXItPmlfaW5vLCAmZGVudHJ5LT5kX25hbWUpOwogCXJlcyA9IGhmc19icmVjX3JlYWQoJmZkLCAmcmVjLCBzaXplb2YocmVjKSk7CiAJaWYgKHJlcykgewogCQloZnNfZmluZF9leGl0KCZmZCk7CkBAIC01Niw3ICs1Niw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlpbnQgbGVuLCBlcnI7Ci0JY2hhciBzdHJidWZbSEZTX05BTUVMRU4gKyAxXTsKKwljaGFyIHN0cmJ1ZltIRlNfTUFYX05BTUVMRU5dOwogCXVuaW9uIGhmc19jYXRfcmVjIGVudHJ5OwogCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOwogCXN0cnVjdCBoZnNfcmVhZGRpcl9kYXRhICpyZDsKQEAgLTY2LDcgKzY2LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAloZnNfZmluZF9pbml0KEhGU19TQihzYiktPmNhdF90cmVlLCAmZmQpOwotCWhmc19jYXRfYnVpbGRfa2V5KGZkLnNlYXJjaF9rZXksIGlub2RlLT5pX2lubywgTlVMTCk7CisJaGZzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGlub2RlLT5pX2lubywgTlVMTCk7CiAJZXJyID0gaGZzX2JyZWNfZmluZCgmZmQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpAQCAtMTExLDcgKzExMSw3IEBACiAJCX0KIAkJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZlbnRyeSwgZmQuZW50cnlvZmZzZXQsIGZkLmVudHJ5bGVuZ3RoKTsKIAkJdHlwZSA9IGVudHJ5LnR5cGU7Ci0JCWxlbiA9IGhmc19tYWMydHJpdihzdHJidWYsICZmZC5rZXktPmNhdC5DTmFtZSk7CisJCWxlbiA9IGhmc19tYWMyYXNjKHNiLCBzdHJidWYsICZmZC5rZXktPmNhdC5DTmFtZSk7CiAJCWlmICh0eXBlID09IEhGU19DRFJfRElSKSB7CiAJCQlpZiAoZmQuZW50cnlsZW5ndGggPCBzaXplb2Yoc3RydWN0IGhmc19jYXRfZGlyKSkgewogCQkJCXByaW50aygiSEZTOiBzbWFsbCBkaXIgZW50cnlcbiIpOwpAQCAtMzA3LDcgKzMwNyw4IEBACiAJCQkgICBvbGRfZGlyLCAmb2xkX2RlbnRyeS0+ZF9uYW1lLAogCQkJICAgbmV3X2RpciwgJm5ld19kZW50cnktPmRfbmFtZSk7CiAJaWYgKCFyZXMpCi0JCWhmc19jYXRfYnVpbGRfa2V5KChidHJlZV9rZXkgKikmSEZTX0kob2xkX2RlbnRyeS0+ZF9pbm9kZSktPmNhdF9rZXksCisJCWhmc19jYXRfYnVpbGRfa2V5KG9sZF9kaXItPmlfc2IsCisJCQkJICAoYnRyZWVfa2V5ICopJkhGU19JKG9sZF9kZW50cnktPmRfaW5vZGUpLT5jYXRfa2V5LAogCQkJCSAgbmV3X2Rpci0+aV9pbm8sICZuZXdfZGVudHJ5LT5kX25hbWUpOwogCXJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9mcy9oZnMvaGZzLmggYi9mcy9oZnMvaGZzLmgKaW5kZXggZGY2YjMzYS4uODgwOTlhYiAxMDA2NDQKLS0tIGEvZnMvaGZzL2hmcy5oCisrKyBiL2ZzL2hmcy9oZnMuaApAQCAtMjUsNiArMjUsNyBAQAogI2RlZmluZSBIRlNfU0VDVE9SX1NJWkUJCTUxMiAgICAvKiBzaXplIG9mIGFuIEhGUyBzZWN0b3IgKi8KICNkZWZpbmUgSEZTX1NFQ1RPUl9TSVpFX0JJVFMJOSAgICAgIC8qIGxvZ18yKEhGU19TRUNUT1JfU0laRSkgKi8KICNkZWZpbmUgSEZTX05BTUVMRU4JCTMxICAgICAvKiBtYXhpbXVtIGxlbmd0aCBvZiBhbiBIRlMgZmlsZW5hbWUgKi8KKyNkZWZpbmUgSEZTX01BWF9OQU1FTEVOCQkxMjgKICNkZWZpbmUgSEZTX01BWF9WQUxFTkNFCQkzMjc2N1UKIAogLyogTWVhbmluZ3Mgb2YgdGhlIGRyQXRyYiBmaWVsZCBvZiB0aGUgTURCLApkaWZmIC0tZ2l0IGEvZnMvaGZzL2hmc19mcy5oIGIvZnMvaGZzL2hmc19mcy5oCmluZGV4IDBkYzhlZjguLmFhZTAxOWEgMTAwNjQ0Ci0tLSBhL2ZzL2hmcy9oZnNfZnMuaAorKysgYi9mcy9oZnMvaGZzX2ZzLmgKQEAgLTE0MSw2ICsxNDEsOCBAQAogCiAJaW50IHNlc3Npb24sIHBhcnQ7CiAKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfaW8sICpubHNfZGlzazsKKwogCXN0cnVjdCBzZW1hcGhvcmUgYml0bWFwX2xvY2s7CiAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTY4LDcgKzE3MCw3IEBACiBleHRlcm4gaW50IGhmc19jYXRfZGVsZXRlKHUzMiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBxc3RyICopOwogZXh0ZXJuIGludCBoZnNfY2F0X21vdmUodTMyLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHFzdHIgKiwKIAkJCXN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcXN0ciAqKTsKLWV4dGVybiB2b2lkIGhmc19jYXRfYnVpbGRfa2V5KGJ0cmVlX2tleSAqLCB1MzIsIHN0cnVjdCBxc3RyICopOworZXh0ZXJuIHZvaWQgaGZzX2NhdF9idWlsZF9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGJ0cmVlX2tleSAqLCB1MzIsIHN0cnVjdCBxc3RyICopOwogCiAvKiBkaXIuYyAqLwogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGZzX2Rpcl9vcGVyYXRpb25zOwpAQCAtMjIyLDggKzIyNCw4IEBACiBleHRlcm4gaW50IGhmc19jb21wYXJlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICosIHN0cnVjdCBxc3RyICopOwogCiAvKiB0cmFucy5jICovCi1leHRlcm4gdm9pZCBoZnNfdHJpdjJtYWMoc3RydWN0IGhmc19uYW1lICosIHN0cnVjdCBxc3RyICopOwotZXh0ZXJuIGludCBoZnNfbWFjMnRyaXYoY2hhciAqLCBjb25zdCBzdHJ1Y3QgaGZzX25hbWUgKik7CitleHRlcm4gdm9pZCBoZnNfYXNjMm1hYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGhmc19uYW1lICosIHN0cnVjdCBxc3RyICopOworZXh0ZXJuIGludCBoZnNfbWFjMmFzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY2hhciAqLCBjb25zdCBzdHJ1Y3QgaGZzX25hbWUgKik7CiAKIGV4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OwogCmRpZmYgLS1naXQgYS9mcy9oZnMvaW5vZGUuYyBiL2ZzL2hmcy9pbm9kZS5jCmluZGV4IDc1MTkxMjMuLmYxNTcwYjkgMTAwNjQ0Ci0tLSBhL2ZzL2hmcy9pbm9kZS5jCisrKyBiL2ZzL2hmcy9pbm9kZS5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAogCWluaXRfTVVURVgoJkhGU19JKGlub2RlKS0+ZXh0ZW50c19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmSEZTX0koaW5vZGUpLT5vcGVuX2Rpcl9saXN0KTsKLQloZnNfY2F0X2J1aWxkX2tleSgoYnRyZWVfa2V5ICopJkhGU19JKGlub2RlKS0+Y2F0X2tleSwgZGlyLT5pX2lubywgbmFtZSk7CisJaGZzX2NhdF9idWlsZF9rZXkoc2IsIChidHJlZV9rZXkgKikmSEZTX0koaW5vZGUpLT5jYXRfa2V5LCBkaXItPmlfaW5vLCBuYW1lKTsKIAlpbm9kZS0+aV9pbm8gPSBIRlNfU0Ioc2IpLT5uZXh0X2lkKys7CiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CmRpZmYgLS1naXQgYS9mcy9oZnMvbWRiLmMgYi9mcy9oZnMvbWRiLmMKaW5kZXggMjE3ZTMyZi4uMGE0NzNmNyAxMDA2NDQKLS0tIGEvZnMvaGZzL21kYi5jCisrKyBiL2ZzL2hmcy9tZGIuYwpAQCAtMTAsNiArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KICNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgogCiAjaW5jbHVkZSAiaGZzX2ZzLmgiCiAjaW5jbHVkZSAiYnRyZWUuaCIKQEAgLTM0Myw2ICszNDQsMTEgQEAKIAlicmVsc2UoSEZTX1NCKHNiKS0+bWRiX2JoKTsKIAlicmVsc2UoSEZTX1NCKHNiKS0+YWx0X21kYl9iaCk7CiAKKwlpZiAoSEZTX1NCKHNiKS0+bmxzX2lvKQorCQl1bmxvYWRfbmxzKEhGU19TQihzYiktPm5sc19pbyk7CisJaWYgKEhGU19TQihzYiktPm5sc19kaXNrKQorCQl1bmxvYWRfbmxzKEhGU19TQihzYiktPm5sc19kaXNrKTsKKwogCWtmcmVlKEhGU19TQihzYikpOwogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL3N1cGVyLmMgYi9mcy9oZnMvc3VwZXIuYwppbmRleCBhYjc4M2Y2Li5jNTA3NGFlIDEwMDY0NAotLS0gYS9mcy9oZnMvc3VwZXIuYworKysgYi9mcy9oZnMvc3VwZXIuYwpAQCAtMTUsOCArMTUsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogCiAjaW5jbHVkZSAiaGZzX2ZzLmgiCkBAIC0xMTEsNiArMTE0LDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaGZzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RydWN0IGhmc19zYl9pbmZvICpzYmkgPSBIRlNfU0IobW50LT5tbnRfc2IpOworCisJaWYgKHNiaS0+c19jcmVhdG9yICE9IGNwdV90b19iZTMyKDB4M2YzZjNmM2YpKQorCQlzZXFfcHJpbnRmKHNlcSwgIixjcmVhdG9yPSUuNHMiLCAoY2hhciAqKSZzYmktPnNfY3JlYXRvcik7CisJaWYgKHNiaS0+c190eXBlICE9IGNwdV90b19iZTMyKDB4M2YzZjNmM2YpKQorCQlzZXFfcHJpbnRmKHNlcSwgIix0eXBlPSUuNHMiLCAoY2hhciAqKSZzYmktPnNfdHlwZSk7CisJc2VxX3ByaW50ZihzZXEsICIsdWlkPSV1LGdpZD0ldSIsIHNiaS0+c191aWQsIHNiaS0+c19naWQpOworCWlmIChzYmktPnNfZmlsZV91bWFzayAhPSAwMTMzKQorCQlzZXFfcHJpbnRmKHNlcSwgIixmaWxlX3VtYXNrPSVvIiwgc2JpLT5zX2ZpbGVfdW1hc2spOworCWlmIChzYmktPnNfZGlyX3VtYXNrICE9IDAwMjIpCisJCXNlcV9wcmludGYoc2VxLCAiLGRpcl91bWFzaz0lbyIsIHNiaS0+c19kaXJfdW1hc2spOworCWlmIChzYmktPnBhcnQgPj0gMCkKKwkJc2VxX3ByaW50ZihzZXEsICIscGFydD0ldSIsIHNiaS0+cGFydCk7CisJaWYgKHNiaS0+c2Vzc2lvbiA+PSAwKQorCQlzZXFfcHJpbnRmKHNlcSwgIixzZXNzaW9uPSV1Iiwgc2JpLT5zZXNzaW9uKTsKKwlpZiAoc2JpLT5ubHNfZGlzaykKKwkJc2VxX3ByaW50ZihzZXEsICIsY29kZXBhZ2U9JXMiLCBzYmktPm5sc19kaXNrLT5jaGFyc2V0KTsKKwlpZiAoc2JpLT5ubHNfaW8pCisJCXNlcV9wcmludGYoc2VxLCAiLGlvY2hhcnNldD0lcyIsIHNiaS0+bmxzX2lvLT5jaGFyc2V0KTsKKwlpZiAoc2JpLT5zX3F1aWV0KQorCQlzZXFfcHJpbnRmKHNlcSwgIixxdWlldCIpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGlub2RlICpoZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgaGZzX2lub2RlX2luZm8gKmk7CkBAIC0xMzMsMTEgKzE2MiwxMyBAQAogCS53cml0ZV9zdXBlcgk9IGhmc193cml0ZV9zdXBlciwKIAkuc3RhdGZzCQk9IGhmc19zdGF0ZnMsCiAJLnJlbW91bnRfZnMgICAgID0gaGZzX3JlbW91bnQsCisJLnNob3dfb3B0aW9ucwk9IGhmc19zaG93X29wdGlvbnMsCiB9OwogCiBlbnVtIHsKIAlvcHRfdWlkLCBvcHRfZ2lkLCBvcHRfdW1hc2ssIG9wdF9maWxlX3VtYXNrLCBvcHRfZGlyX3VtYXNrLAogCW9wdF9wYXJ0LCBvcHRfc2Vzc2lvbiwgb3B0X3R5cGUsIG9wdF9jcmVhdG9yLCBvcHRfcXVpZXQsCisJb3B0X2NvZGVwYWdlLCBvcHRfaW9jaGFyc2V0LAogCW9wdF9lcnIKIH07CiAKQEAgLTE1Miw2ICsxODMsOCBAQAogCXsgb3B0X3R5cGUsICJ0eXBlPSVzIiB9LAogCXsgb3B0X2NyZWF0b3IsICJjcmVhdG9yPSVzIiB9LAogCXsgb3B0X3F1aWV0LCAicXVpZXQiIH0sCisJeyBvcHRfY29kZXBhZ2UsICJjb2RlcGFnZT0lcyIgfSwKKwl7IG9wdF9pb2NoYXJzZXQsICJpb2NoYXJzZXQ9JXMiIH0sCiAJeyBvcHRfZXJyLCBOVUxMIH0KIH07CiAKQEAgLTI1NywxMSArMjkwLDQ2IEBACiAJCWNhc2Ugb3B0X3F1aWV0OgogCQkJaHNiLT5zX3F1aWV0ID0gMTsKIAkJCWJyZWFrOworCQljYXNlIG9wdF9jb2RlcGFnZToKKwkJCWlmIChoc2ItPm5sc19kaXNrKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiB1bmFibGUgdG8gY2hhbmdlIGNvZGVwYWdlXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXAgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJaHNiLT5ubHNfZGlzayA9IGxvYWRfbmxzKHApOworCQkJaWYgKCFoc2ItPm5sc19kaXNrKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiB1bmFibGUgdG8gbG9hZCBjb2RlcGFnZSBcIiVzXCJcbiIsIHApOworCQkJCWtmcmVlKHApOworCQkJCXJldHVybiAwOworCQkJfQorCQkJa2ZyZWUocCk7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfaW9jaGFyc2V0OgorCQkJaWYgKGhzYi0+bmxzX2lvKSB7CisJCQkJcHJpbnRrKCJIRlM6IHVuYWJsZSB0byBjaGFuZ2UgaW9jaGFyc2V0XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXAgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJaHNiLT5ubHNfaW8gPSBsb2FkX25scyhwKTsKKwkJCWlmICghaHNiLT5ubHNfaW8pIHsKKwkJCQlwcmludGsoIkhGUzogdW5hYmxlIHRvIGxvYWQgaW9jaGFyc2V0IFwiJXNcIlxuIiwgcCk7CisJCQkJa2ZyZWUocCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlrZnJlZShwKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKKwlpZiAoaHNiLT5ubHNfZGlzayAmJiAhaHNiLT5ubHNfaW8pIHsKKwkJaHNiLT5ubHNfaW8gPSBsb2FkX25sc19kZWZhdWx0KCk7CisJCWlmICghaHNiLT5ubHNfaW8pIHsKKwkJCXByaW50aygiSEZTOiB1bmFibGUgdG8gbG9hZCBkZWZhdWx0IGlvY2hhcnNldFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KIAloc2ItPnNfZGlyX3VtYXNrICY9IDA3Nzc7CiAJaHNiLT5zX2ZpbGVfdW1hc2sgJj0gMDU3NzsKIApkaWZmIC0tZ2l0IGEvZnMvaGZzL3RyYW5zLmMgYi9mcy9oZnMvdHJhbnMuYwppbmRleCBmYjk3MjBhLi5lNjczYTg4IDEwMDY0NAotLS0gYS9mcy9oZnMvdHJhbnMuYworKysgYi9mcy9oZnMvdHJhbnMuYwpAQCAtOSwxMiArOSwxNSBAQAogICogd2l0aCAnOicgdnMuICcvJyBhcyB0aGUgcGF0aC1lbGVtZW50IHNlcGFyYXRvci4KICAqLwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKwogI2luY2x1ZGUgImhmc19mcy5oIgogCiAvKj09PT09PT09PT09PT09PT0gR2xvYmFsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09Ki8KIAogLyoKLSAqIGhmc19tYWMydHJpdigpCisgKiBoZnNfbWFjMmFzYygpCiAgKgogICogR2l2ZW4gYSAnUGFzY2FsIFN0cmluZycgKGEgc3RyaW5nIHByZWNlZGVkIGJ5IGEgbGVuZ3RoIGJ5dGUpIGluCiAgKiB0aGUgTWFjaW50b3NoIGNoYXJhY3RlciBzZXQgcHJvZHVjZSB0aGUgY29ycmVzcG9uZGluZyBmaWxlbmFtZSB1c2luZwpAQCAtMjcsMjMgKzMwLDU4IEBACiAgKiBieSAnOicgd2hpY2ggbmV2ZXIgYXBwZWFycyBpbiBIRlMgZmlsZW5hbWVzLgkgQWxsIG90aGVyIGNoYXJhY3RlcnMKICAqIGFyZSBwYXNzZWQgdW5jaGFuZ2VkIGZyb20gaW5wdXQgdG8gb3V0cHV0LgogICovCi1pbnQgaGZzX21hYzJ0cml2KGNoYXIgKm91dCwgY29uc3Qgc3RydWN0IGhmc19uYW1lICppbikKK2ludCBoZnNfbWFjMmFzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpvdXQsIGNvbnN0IHN0cnVjdCBoZnNfbmFtZSAqaW4pCiB7Ci0JY29uc3QgY2hhciAqcDsKLQljaGFyIGM7Ci0JaW50IGksIGxlbjsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfZGlzayA9IEhGU19TQihzYiktPm5sc19kaXNrOworCXN0cnVjdCBubHNfdGFibGUgKm5sc19pbyA9IEhGU19TQihzYiktPm5sc19pbzsKKwljb25zdCBjaGFyICpzcmM7CisJY2hhciAqZHN0OworCWludCBzcmNsZW4sIGRzdGxlbiwgc2l6ZTsKIAotCWxlbiA9IGluLT5sZW47Ci0JcCA9IGluLT5uYW1lOwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQljID0gKnArKzsKLQkJKm91dCsrID0gYyA9PSAnLycgPyAnOicgOiBjOworCXNyYyA9IGluLT5uYW1lOworCXNyY2xlbiA9IGluLT5sZW47CisJZHN0ID0gb3V0OworCWRzdGxlbiA9IEhGU19NQVhfTkFNRUxFTjsKKwlpZiAobmxzX2lvKSB7CisJCXdjaGFyX3QgY2g7CisKKwkJd2hpbGUgKHNyY2xlbiA+IDApIHsKKwkJCWlmIChubHNfZGlzaykgeworCQkJCXNpemUgPSBubHNfZGlzay0+Y2hhcjJ1bmkoc3JjLCBzcmNsZW4sICZjaCk7CisJCQkJaWYgKHNpemUgPD0gMCkgeworCQkJCQljaCA9ICc/JzsKKwkJCQkJc2l6ZSA9IDE7CisJCQkJfQorCQkJCXNyYyArPSBzaXplOworCQkJCXNyY2xlbiAtPSBzaXplOworCQkJfSBlbHNlIHsKKwkJCQljaCA9ICpzcmMrKzsKKwkJCQlzcmNsZW4tLTsKKwkJCX0KKwkJCWlmIChjaCA9PSAnLycpCisJCQkJY2ggPSAnOic7CisJCQlzaXplID0gbmxzX2lvLT51bmkyY2hhcihjaCwgZHN0LCBkc3RsZW4pOworCQkJaWYgKHNpemUgPCAwKSB7CisJCQkJaWYgKHNpemUgPT0gLUVOQU1FVE9PTE9ORykKKwkJCQkJZ290byBvdXQ7CisJCQkJKmRzdCA9ICc/JzsKKwkJCQlzaXplID0gMTsKKwkJCX0KKwkJCWRzdCArPSBzaXplOworCQkJZHN0bGVuIC09IHNpemU7CisJCX0KKwl9IGVsc2UgeworCQljaGFyIGNoOworCisJCXdoaWxlICgtLXNyY2xlbiA+PSAwKQorCQkJKmRzdCsrID0gKGNoID0gKnNyYysrKSA9PSAnLycgPyAnOicgOiBjaDsKIAl9Ci0JcmV0dXJuIGk7CitvdXQ6CisJcmV0dXJuIGRzdCAtIG91dDsKIH0KIAogLyoKLSAqIGhmc190cml2Mm1hYygpCisgKiBoZnNfYXNjMm1hYygpCiAgKgogICogR2l2ZW4gYW4gQVNDSUkgc3RyaW5nIChub3QgbnVsbC10ZXJtaW5hdGVkKSBhbmQgaXRzIGxlbmd0aCwKICAqIGdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVuYW1lIGluIHRoZSBNYWNpbnRvc2ggY2hhcmFjdGVyIHNldApAQCAtNTQsMTkgKzkyLDU3IEBACiAgKiBUaGlzIHJvdXRpbmUgaXMgYSBpbnZlcnNlIHRvIGhmc19tYWMydHJpdigpLgogICogQSAnOicgaXMgcmVwbGFjZWQgYnkgYSAnLycuCiAgKi8KLXZvaWQgaGZzX3RyaXYybWFjKHN0cnVjdCBoZnNfbmFtZSAqb3V0LCBzdHJ1Y3QgcXN0ciAqaW4pCit2b2lkIGhmc19hc2MybWFjKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBoZnNfbmFtZSAqb3V0LCBzdHJ1Y3QgcXN0ciAqaW4pCiB7CisJc3RydWN0IG5sc190YWJsZSAqbmxzX2Rpc2sgPSBIRlNfU0Ioc2IpLT5ubHNfZGlzazsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfaW8gPSBIRlNfU0Ioc2IpLT5ubHNfaW87CiAJY29uc3QgY2hhciAqc3JjOwotCWNoYXIgKmRzdCwgYzsKLQlpbnQgaSwgbGVuOworCWNoYXIgKmRzdDsKKwlpbnQgc3JjbGVuLCBkc3RsZW4sIHNpemU7CiAKLQlvdXQtPmxlbiA9IGxlbiA9IG1pbigodW5zaWduZWQgaW50KUhGU19OQU1FTEVOLCBpbi0+bGVuKTsKIAlzcmMgPSBpbi0+bmFtZTsKKwlzcmNsZW4gPSBpbi0+bGVuOwogCWRzdCA9IG91dC0+bmFtZTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJYyA9ICpzcmMrKzsKLQkJKmRzdCsrID0gYyA9PSAnOicgPyAnLycgOiBjOworCWRzdGxlbiA9IEhGU19OQU1FTEVOOworCWlmIChubHNfaW8pIHsKKwkJd2NoYXJfdCBjaDsKKworCQl3aGlsZSAoc3JjbGVuID4gMCkgeworCQkJc2l6ZSA9IG5sc19pby0+Y2hhcjJ1bmkoc3JjLCBzcmNsZW4sICZjaCk7CisJCQlpZiAoc2l6ZSA8IDApIHsKKwkJCQljaCA9ICc/JzsKKwkJCQlzaXplID0gMTsKKwkJCX0KKwkJCXNyYyArPSBzaXplOworCQkJc3JjbGVuIC09IHNpemU7CisJCQlpZiAoY2ggPT0gJzonKQorCQkJCWNoID0gJy8nOworCQkJaWYgKG5sc19kaXNrKSB7CisJCQkJc2l6ZSA9IG5sc19kaXNrLT51bmkyY2hhcihjaCwgZHN0LCBkc3RsZW4pOworCQkJCWlmIChzaXplIDwgMCkgeworCQkJCQlpZiAoc2l6ZSA9PSAtRU5BTUVUT09MT05HKQorCQkJCQkJZ290byBvdXQ7CisJCQkJCSpkc3QgPSAnPyc7CisJCQkJCXNpemUgPSAxOworCQkJCX0KKwkJCQlkc3QgKz0gc2l6ZTsKKwkJCQlkc3RsZW4gLT0gc2l6ZTsKKwkJCX0gZWxzZSB7CisJCQkJKmRzdCsrID0gY2ggPiAweGZmID8gJz8nIDogY2g7CisJCQkJZHN0bGVuLS07CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQljaGFyIGNoOworCisJCWlmIChkc3RsZW4gPiBzcmNsZW4pCisJCQlkc3RsZW4gPSBzcmNsZW47CisJCXdoaWxlICgtLWRzdGxlbiA+PSAwKQorCQkJKmRzdCsrID0gKGNoID0gKnNyYysrKSA9PSAnOicgPyAnLycgOiBjaDsKIAl9Ci0JZm9yICg7IGkgPCBIRlNfTkFNRUxFTjsgaSsrKQorb3V0OgorCW91dC0+bGVuID0gZHN0IC0gKGNoYXIgKilvdXQtPm5hbWU7CisJZHN0bGVuID0gSEZTX05BTUVMRU4gLSBvdXQtPmxlbjsKKwl3aGlsZSAoLS1kc3RsZW4gPj0gMCkKIAkJKmRzdCsrID0gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvYm5vZGUuYyBiL2ZzL2hmc3BsdXMvYm5vZGUuYwppbmRleCA4ODY4ZDNiLi5iODVhYmM2IDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2Jub2RlLmMKKysrIGIvZnMvaGZzcGx1cy9ibm9kZS5jCkBAIC0xOCw4ICsxOCw2IEBACiAjaW5jbHVkZSAiaGZzcGx1c19mcy5oIgogI2luY2x1ZGUgImhmc3BsdXNfcmF3LmgiCiAKLSNkZWZpbmUgUkVGX1BBR0VTCTAKLQogLyogQ29weSBhIHNwZWNpZmllZCByYW5nZSBvZiBieXRlcyBmcm9tIHRoZSByYXcgZGF0YSBvZiBhIG5vZGUgKi8KIHZvaWQgaGZzX2Jub2RlX3JlYWQoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdm9pZCAqYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQogewpAQCAtNDUwLDkgKzQ0OCw3IEBACiAJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KLSNpZiAhUkVGX1BBR0VTCiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLSNlbmRpZgogCQlub2RlLT5wYWdlW2ldID0gcGFnZTsKIAl9CiAKQEAgLTYxMiwxMyArNjA4LDYgQEAKIHsKIAlpZiAobm9kZSkgewogCQlhdG9taWNfaW5jKCZub2RlLT5yZWZjbnQpOwotI2lmIFJFRl9QQUdFUwotCQl7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+dHJlZS0+cGFnZXNfcGVyX2Jub2RlOyBpKyspCi0JCQlnZXRfcGFnZShub2RlLT5wYWdlW2ldKTsKLQkJfQotI2VuZGlmCiAJCWRwcmludChEQkdfQk5PREVfUkVGUywgImdldF9ub2RlKCVkOiVkKTogJWRcbiIsCiAJCSAgICAgICBub2RlLT50cmVlLT5jbmlkLCBub2RlLT50aGlzLCBhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSk7CiAJfQpAQCAtNjM1LDIwICs2MjQsMTIgQEAKIAkJICAgICAgIG5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMsIGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKTsKIAkJaWYgKCFhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSkKIAkJCUJVRygpOwotCQlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJm5vZGUtPnJlZmNudCwgJnRyZWUtPmhhc2hfbG9jaykpIHsKLSNpZiBSRUZfUEFHRVMKLQkJCWZvciAoaSA9IDA7IGkgPCB0cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykKLQkJCQlwdXRfcGFnZShub2RlLT5wYWdlW2ldKTsKLSNlbmRpZgorCQlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJm5vZGUtPnJlZmNudCwgJnRyZWUtPmhhc2hfbG9jaykpCiAJCQlyZXR1cm47Ci0JCX0KIAkJZm9yIChpID0gMDsgaSA8IHRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKSB7CiAJCQlpZiAoIW5vZGUtPnBhZ2VbaV0pCiAJCQkJY29udGludWU7CiAJCQltYXJrX3BhZ2VfYWNjZXNzZWQobm9kZS0+cGFnZVtpXSk7Ci0jaWYgUkVGX1BBR0VTCi0JCQlwdXRfcGFnZShub2RlLT5wYWdlW2ldKTsKLSNlbmRpZgogCQl9CiAKIAkJaWYgKHRlc3RfYml0KEhGU19CTk9ERV9ERUxFVEVELCAmbm9kZS0+ZmxhZ3MpKSB7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2hmc3BsdXNfZnMuaCBiL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oCmluZGV4IDUzMzA5NGEuLjJiYzBjZGQgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oCisrKyBiL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oCkBAIC0zNDMsOCArMzQzLDkgQEAKIHNzaXplX3QgaGZzcGx1c19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKTsKIAogLyogb3B0aW9ucy5jICovCi1pbnQgcGFyc2Vfb3B0aW9ucyhjaGFyICosIHN0cnVjdCBoZnNwbHVzX3NiX2luZm8gKik7Ci12b2lkIGZpbGxfZGVmYXVsdHMoc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqKTsKK2ludCBoZnNwbHVzX3BhcnNlX29wdGlvbnMoY2hhciAqLCBzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICopOwordm9pZCBoZnNwbHVzX2ZpbGxfZGVmYXVsdHMoc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqKTsKK2ludCBoZnNwbHVzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHZmc21vdW50ICopOwogCiAvKiB0YWJsZXMuYyAqLwogZXh0ZXJuIHUxNiBoZnNwbHVzX2Nhc2VfZm9sZF90YWJsZVtdOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9vcHRpb25zLmMgYi9mcy9oZnNwbHVzL29wdGlvbnMuYwppbmRleCAxY2NhMDEwLi5jY2EwODE4IDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL29wdGlvbnMuYworKysgYi9mcy9oZnNwbHVzL29wdGlvbnMuYwpAQCAtMTMsNiArMTMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKIAogZW51bSB7CkBAIC0zOCw3ICs0MCw3IEBACiB9OwogCiAvKiBJbml0aWFsaXplIGFuIG9wdGlvbnMgb2JqZWN0IHRvIHJlYXNvbmFibGUgZGVmYXVsdHMgKi8KLXZvaWQgZmlsbF9kZWZhdWx0cyhzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICpvcHRzKQordm9pZCBoZnNwbHVzX2ZpbGxfZGVmYXVsdHMoc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqb3B0cykKIHsKIAlpZiAoIW9wdHMpCiAJCXJldHVybjsKQEAgLTYzLDcgKzY1LDcgQEAKIAogLyogUGFyc2Ugb3B0aW9ucyBmcm9tIG1vdW50LiBSZXR1cm5zIDAgb24gZmFpbHVyZSAqLwogLyogaW5wdXQgaXMgdGhlIG9wdGlvbnMgcGFzc2VkIHRvIG1vdW50KCkgYXMgYSBzdHJpbmcgKi8KLWludCBwYXJzZV9vcHRpb25zKGNoYXIgKmlucHV0LCBzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICpzYmkpCitpbnQgaGZzcGx1c19wYXJzZV9vcHRpb25zKGNoYXIgKmlucHV0LCBzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICpzYmkpCiB7CiAJY2hhciAqcDsKIAlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CkBAIC0xNjAsMyArMTYyLDIzIEBACiAKIAlyZXR1cm4gMTsKIH0KKworaW50IGhmc3BsdXNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICpzYmkgPSAmSEZTUExVU19TQihtbnQtPm1udF9zYik7CisKKwlpZiAoc2JpLT5jcmVhdG9yICE9IEhGU1BMVVNfREVGX0NSX1RZUEUpCisJCXNlcV9wcmludGYoc2VxLCAiLGNyZWF0b3I9JS40cyIsIChjaGFyICopJnNiaS0+Y3JlYXRvcik7CisJaWYgKHNiaS0+dHlwZSAhPSBIRlNQTFVTX0RFRl9DUl9UWVBFKQorCQlzZXFfcHJpbnRmKHNlcSwgIix0eXBlPSUuNHMiLCAoY2hhciAqKSZzYmktPnR5cGUpOworCXNlcV9wcmludGYoc2VxLCAiLHVtYXNrPSVvLHVpZD0ldSxnaWQ9JXUiLCBzYmktPnVtYXNrLCBzYmktPnVpZCwgc2JpLT5naWQpOworCWlmIChzYmktPnBhcnQgPj0gMCkKKwkJc2VxX3ByaW50ZihzZXEsICIscGFydD0ldSIsIHNiaS0+cGFydCk7CisJaWYgKHNiaS0+c2Vzc2lvbiA+PSAwKQorCQlzZXFfcHJpbnRmKHNlcSwgIixzZXNzaW9uPSV1Iiwgc2JpLT5zZXNzaW9uKTsKKwlpZiAoc2JpLT5ubHMpCisJCXNlcV9wcmludGYoc2VxLCAiLG5scz0lcyIsIHNiaS0+bmxzLT5jaGFyc2V0KTsKKwlpZiAoc2JpLT5mbGFncyAmIEhGU1BMVVNfU0JfTk9ERUNPTVBPU0UpCisJCXNlcV9wcmludGYoc2VxLCAiLG5vZGVjb21wb3NlIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3N1cGVyLmMgYi9mcy9oZnNwbHVzL3N1cGVyLmMKaW5kZXggZDU1YWQ2Ny4uZmQwZjBmMCAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9zdXBlci5jCisrKyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwpAQCAtMjE3LDggKzIxNyw3IEBACiAJCXZoZHItPmF0dHJpYnV0ZXMgfD0gY3B1X3RvX2JlMzIoSEZTUExVU19WT0xfVU5NTlQpOwogCQl2aGRyLT5hdHRyaWJ1dGVzICY9IGNwdV90b19iZTMyKH5IRlNQTFVTX1ZPTF9JTkNOU1ROVCk7CiAJCW1hcmtfYnVmZmVyX2RpcnR5KEhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7Ci0JCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmSEZTUExVU19TQihzYikuc192aGJoKTsKLQkJd2FpdF9vbl9idWZmZXIoSEZTUExVU19TQihzYikuc192aGJoKTsKKwkJc3luY19kaXJ0eV9idWZmZXIoSEZTUExVU19TQihzYikuc192aGJoKTsKIAl9CiAKIAloZnNfYnRyZWVfY2xvc2UoSEZTUExVU19TQihzYikuY2F0X3RyZWUpOwpAQCAtMjc3LDYgKzI3Niw3IEBACiAJLndyaXRlX3N1cGVyCT0gaGZzcGx1c193cml0ZV9zdXBlciwKIAkuc3RhdGZzCQk9IGhmc3BsdXNfc3RhdGZzLAogCS5yZW1vdW50X2ZzCT0gaGZzcGx1c19yZW1vdW50LAorCS5zaG93X29wdGlvbnMJPSBoZnNwbHVzX3Nob3dfb3B0aW9ucywKIH07CiAKIHN0YXRpYyBpbnQgaGZzcGx1c19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCkBAIC0yOTcsOCArMjk3LDggQEAKIAltZW1zZXQoc2JpLCAwLCBzaXplb2YoSEZTUExVU19TQihzYikpKTsKIAlzYi0+c19mc19pbmZvID0gc2JpOwogCUlOSVRfSExJU1RfSEVBRCgmc2JpLT5yc3JjX2lub2Rlcyk7Ci0JZmlsbF9kZWZhdWx0cyhzYmkpOwotCWlmICghcGFyc2Vfb3B0aW9ucyhkYXRhLCBzYmkpKSB7CisJaGZzcGx1c19maWxsX2RlZmF1bHRzKHNiaSk7CisJaWYgKCFoZnNwbHVzX3BhcnNlX29wdGlvbnMoZGF0YSwgc2JpKSkgewogCQlpZiAoIXNpbGVudCkKIAkJCXByaW50aygiSEZTKy1mczogdW5hYmxlIHRvIHBhcnNlIG1vdW50IG9wdGlvbnNcbiIpOwogCQllcnIgPSAtRUlOVkFMOwpAQCAtNDE1LDggKzQxNSw3IEBACiAJdmhkci0+YXR0cmlidXRlcyAmPSBjcHVfdG9fYmUzMih+SEZTUExVU19WT0xfVU5NTlQpOwogCXZoZHItPmF0dHJpYnV0ZXMgfD0gY3B1X3RvX2JlMzIoSEZTUExVU19WT0xfSU5DTlNUTlQpOwogCW1hcmtfYnVmZmVyX2RpcnR5KEhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7Ci0JbGxfcndfYmxvY2soV1JJVEUsIDEsICZIRlNQTFVTX1NCKHNiKS5zX3ZoYmgpOwotCXdhaXRfb25fYnVmZmVyKEhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7CisJc3luY19kaXJ0eV9idWZmZXIoSEZTUExVU19TQihzYikuc192aGJoKTsKIAogCWlmICghSEZTUExVU19TQihzYikuaGlkZGVuX2RpcikgewogCQlwcmludGsoIkhGUys6IGNyZWF0ZSBoaWRkZW4gZGlyLi4uXG4iKTsKZGlmZiAtLWdpdCBhL2ZzL2hvc3Rmcy9ob3N0ZnMuaCBiL2ZzL2hvc3Rmcy9ob3N0ZnMuaAppbmRleCA2N2JjYTBkLi5jY2EzZmI2IDEwMDY0NAotLS0gYS9mcy9ob3N0ZnMvaG9zdGZzLmgKKysrIGIvZnMvaG9zdGZzL2hvc3Rmcy5oCkBAIC00OSw3ICs0OSw2IEBACiAJc3RydWN0IHRpbWVzcGVjCWlhX2F0aW1lOwogCXN0cnVjdCB0aW1lc3BlYwlpYV9tdGltZTsKIAlzdHJ1Y3QgdGltZXNwZWMJaWFfY3RpbWU7Ci0JdW5zaWduZWQgaW50CWlhX2F0dHJfZmxhZ3M7CiB9OwogCiBleHRlcm4gaW50IHN0YXRfZmlsZShjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBsb25nIGxvbmcgKmlub2RlX291dCwKZGlmZiAtLWdpdCBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKaW5kZXggYjJkMTgyMC4uNTljNTA2MiAxMDA2NDQKLS0tIGEvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKKysrIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKQEAgLTI4NCw2ICsyODQsNyBAQAogCiBzdGF0aWMgdm9pZCBob3N0ZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCWlmKEhPU1RGU19JKGlub2RlKS0+ZmQgIT0gLTEpIHsKIAkJY2xvc2VfZmlsZSgmSE9TVEZTX0koaW5vZGUpLT5mZCk7CiAJCUhPU1RGU19JKGlub2RlKS0+ZmQgPSAtMTsKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvaW5vZGUuYyBiL2ZzL2hwZnMvaW5vZGUuYwppbmRleCAzOGIxNzQxLi5lM2QxN2U5IDEwMDY0NAotLS0gYS9mcy9ocGZzL2lub2RlLmMKKysrIGIvZnMvaHBmcy9pbm9kZS5jCkBAIC0yODQsNiArMjg0LDcgQEAKIAogdm9pZCBocGZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKIAlsb2NrX2tlcm5lbCgpOwogCWhwZnNfcmVtb3ZlX2Zub2RlKGlub2RlLT5pX3NiLCBpbm9kZS0+aV9pbm8pOwogCXVubG9ja19rZXJuZWwoKTsKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCmluZGV4IGU1N2YxNzIuLmY4MGE3OWYgMTAwNjQ0Ci0tLSBhL2ZzL2lub2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtMTAzNCwxOSArMTAzNCwyMSBAQAogCWlub2Rlc19zdGF0Lm5yX2lub2Rlcy0tOwogCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKIAotCWlmIChpbm9kZS0+aV9kYXRhLm5ycGFnZXMpCi0JCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKLQogCXNlY3VyaXR5X2lub2RlX2RlbGV0ZShpbm9kZSk7CiAKIAlpZiAob3AtPmRlbGV0ZV9pbm9kZSkgewogCQl2b2lkICgqZGVsZXRlKShzdHJ1Y3QgaW5vZGUgKikgPSBvcC0+ZGVsZXRlX2lub2RlOwogCQlpZiAoIWlzX2JhZF9pbm9kZShpbm9kZSkpCiAJCQlEUVVPVF9JTklUKGlub2RlKTsKLQkJLyogc19vcC0+ZGVsZXRlX2lub2RlIGludGVybmFsbHkgcmVjYWxscyBjbGVhcl9pbm9kZSgpICovCisJCS8qIEZpbGVzeXN0ZW1zIGltcGxlbWVudGluZyB0aGVpciBvd24KKwkJICogc19vcC0+ZGVsZXRlX2lub2RlIGFyZSByZXF1aXJlZCB0byBjYWxsCisJCSAqIHRydW5jYXRlX2lub2RlX3BhZ2VzIGFuZCBjbGVhcl9pbm9kZSgpCisJCSAqIGludGVybmFsbHkgKi8KIAkJZGVsZXRlKGlub2RlKTsKLQl9IGVsc2UKKwl9IGVsc2UgeworCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAJCWNsZWFyX2lub2RlKGlub2RlKTsKKwl9CiAJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKIAlobGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfaGFzaCk7CiAJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOwpAQCAtMTE5NSw5ICsxMTk3LDYgQEAKIAlpZiAoIXRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9hdGltZSwgJm5vdykpIHsKIAkJaW5vZGUtPmlfYXRpbWUgPSBub3c7CiAJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7Ci0JfSBlbHNlIHsKLQkJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfYXRpbWUsICZub3cpKQotCQkJaW5vZGUtPmlfYXRpbWUgPSBub3c7CiAJfQogfQogCmRpZmYgLS1naXQgYS9mcy9pbm90aWZ5LmMgYi9mcy9pbm90aWZ5LmMKaW5kZXggMmU0ZTJhNS4uYTM3ZTlmYiAxMDA2NDQKLS0tIGEvZnMvaW5vdGlmeS5jCisrKyBiL2ZzL2lub3RpZnkuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KIAogc3RhdGljIGF0b21pY190IGlub3RpZnlfY29va2llOworc3RhdGljIGF0b21pY190IGlub3RpZnlfd2F0Y2hlczsKIAogc3RhdGljIGttZW1fY2FjaGVfdCAqd2F0Y2hfY2FjaGVwOwogc3RhdGljIGttZW1fY2FjaGVfdCAqZXZlbnRfY2FjaGVwOwpAQCAtNDIyLDYgKzQyMyw3IEBACiAJZ2V0X2lub3RpZnlfd2F0Y2god2F0Y2gpOwogCiAJYXRvbWljX2luYygmZGV2LT51c2VyLT5pbm90aWZ5X3dhdGNoZXMpOworCWF0b21pY19pbmMoJmlub3RpZnlfd2F0Y2hlcyk7CiAKIAlyZXR1cm4gd2F0Y2g7CiB9CkBAIC00NTQsNiArNDU2LDcgQEAKIAlsaXN0X2RlbCgmd2F0Y2gtPmRfbGlzdCk7CiAKIAlhdG9taWNfZGVjKCZkZXYtPnVzZXItPmlub3RpZnlfd2F0Y2hlcyk7CisJYXRvbWljX2RlYygmaW5vdGlmeV93YXRjaGVzKTsKIAlpZHJfcmVtb3ZlKCZkZXYtPmlkciwgd2F0Y2gtPndkKTsKIAlwdXRfaW5vdGlmeV93YXRjaCh3YXRjaCk7CiB9CkBAIC01MzIsNiArNTM1LDkgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAorCWlmICghYXRvbWljX3JlYWQgKCZpbm90aWZ5X3dhdGNoZXMpKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OwogCWlub2RlID0gcGFyZW50LT5kX2lub2RlOwpAQCAtOTI1LDYgKzkzMSw3IEBACiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKIAlpbnQgcmV0LCBmcHV0X25lZWRlZDsKKwlpbnQgbWFza19hZGQgPSAwOwogCiAJZmlscCA9IGZnZXRfbGlnaHQoZmQsICZmcHV0X25lZWRlZCk7CiAJaWYgKHVubGlrZWx5KCFmaWxwKSkKQEAgLTk0Nyw2ICs5NTQsOSBAQAogCWRvd24oJmlub2RlLT5pbm90aWZ5X3NlbSk7CiAJZG93bigmZGV2LT5zZW0pOwogCisJaWYgKG1hc2sgJiBJTl9NQVNLX0FERCkKKwkJbWFza19hZGQgPSAxOworCiAJLyogZG9uJ3QgbGV0IHVzZXItc3BhY2Ugc2V0IGludmFsaWQgYml0czogd2UgZG9uJ3Qgd2FudCBmbGFncyBzZXQgKi8KIAltYXNrICY9IElOX0FMTF9FVkVOVFM7CiAJaWYgKHVubGlrZWx5KCFtYXNrKSkgewpAQCAtOTYwLDcgKzk3MCwxMCBAQAogCSAqLwogCW9sZCA9IGlub2RlX2ZpbmRfZGV2KGlub2RlLCBkZXYpOwogCWlmICh1bmxpa2VseShvbGQpKSB7Ci0JCW9sZC0+bWFzayA9IG1hc2s7CisJCWlmIChtYXNrX2FkZCkKKwkJCW9sZC0+bWFzayB8PSBtYXNrOworCQllbHNlCisJCQlvbGQtPm1hc2sgPSBtYXNrOwogCQlyZXQgPSBvbGQtPndkOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMDQzLDYgKzEwNTYsNyBAQAogCWlub3RpZnlfbWF4X3VzZXJfd2F0Y2hlcyA9IDgxOTI7CiAKIAlhdG9taWNfc2V0KCZpbm90aWZ5X2Nvb2tpZSwgMCk7CisJYXRvbWljX3NldCgmaW5vdGlmeV93YXRjaGVzLCAwKTsKIAogCXdhdGNoX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpbm90aWZ5X3dhdGNoX2NhY2hlIiwKIAkJCQkJIHNpemVvZihzdHJ1Y3QgaW5vdGlmeV93YXRjaCksCmRpZmYgLS1naXQgYS9mcy9qYmQvY2hlY2twb2ludC5jIGIvZnMvamJkL2NoZWNrcG9pbnQuYwppbmRleCA1YTk3ZTM0Li4wMTRhNTFmIDEwMDY0NAotLS0gYS9mcy9qYmQvY2hlY2twb2ludC5jCisrKyBiL2ZzL2piZC9jaGVja3BvaW50LmMKQEAgLTIwNCw3ICsyMDQsNyBAQAogCWludCBpOwogCiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKLQlsbF9yd19ibG9jayhXUklURSwgKmJhdGNoX2NvdW50LCBiaHMpOworCWxsX3J3X2Jsb2NrKFNXUklURSwgKmJhdGNoX2NvdW50LCBiaHMpOwogCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCWZvciAoaSA9IDA7IGkgPCAqYmF0Y2hfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gYmhzW2ldOwpkaWZmIC0tZ2l0IGEvZnMvamJkL2NvbW1pdC5jIGIvZnMvamJkL2NvbW1pdC5jCmluZGV4IGRhYzcyMGMuLjJhM2UzMTAgMTAwNjQ0Ci0tLSBhL2ZzL2piZC9jb21taXQuYworKysgYi9mcy9qYmQvY29tbWl0LmMKQEAgLTM1OCw3ICszNTgsNyBAQAogCQkJCQlqYmRfZGVidWcoMiwgInN1Ym1pdCAlZCB3cml0ZXNcbiIsCiAJCQkJCQkJYnVmcyk7CiAJCQkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7Ci0JCQkJCWxsX3J3X2Jsb2NrKFdSSVRFLCBidWZzLCB3YnVmKTsKKwkJCQkJbGxfcndfYmxvY2soU1dSSVRFLCBidWZzLCB3YnVmKTsKIAkJCQkJam91cm5hbF9icmVsc2VfYXJyYXkod2J1ZiwgYnVmcyk7CiAJCQkJCWJ1ZnMgPSAwOwogCQkJCQlnb3RvIHdyaXRlX291dF9kYXRhOwpAQCAtMzgxLDcgKzM4MSw3IEBACiAKIAlpZiAoYnVmcykgewogCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwotCQlsbF9yd19ibG9jayhXUklURSwgYnVmcywgd2J1Zik7CisJCWxsX3J3X2Jsb2NrKFNXUklURSwgYnVmcywgd2J1Zik7CiAJCWpvdXJuYWxfYnJlbHNlX2FycmF5KHdidWYsIGJ1ZnMpOwogCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAl9CkBAIC03MjAsMTEgKzcyMCwxNyBAQAogCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9sb2dfbGlzdCA9PSBOVUxMKTsKIAogcmVzdGFydF9sb29wOgorCS8qCisJICogQXMgdGhlcmUgYXJlIG90aGVyIHBsYWNlcyAoam91cm5hbF91bm1hcF9idWZmZXIoKSkgYWRkaW5nIGJ1ZmZlcnMKKwkgKiB0byB0aGlzIGxpc3Qgd2UgaGF2ZSB0byBiZSBjYXJlZnVsIGFuZCBob2xkIHRoZSBqX2xpc3RfbG9jay4KKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2ZvcmdldCkgewogCQl0cmFuc2FjdGlvbl90ICpjcF90cmFuc2FjdGlvbjsKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAogCQlqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9mb3JnZXQ7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJCWJoID0gamgyYmgoamgpOwogCQlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CiAJCUpfQVNTRVJUX0pIKGpoLAlqaC0+Yl90cmFuc2FjdGlvbiA9PSBjb21taXRfdHJhbnNhY3Rpb24gfHwKQEAgLTc5Miw5ICs3OTgsMjUgQEAKIAkJCWpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7ICAvKiBuZWVkcyBhIGJyZWxzZSAqLwogCQkJcmVsZWFzZV9idWZmZXJfcGFnZShiaCk7CiAJCX0KKwkJY29uZF9yZXNjaGVkX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkvKgorCSAqIFRoaXMgaXMgYSBiaXQgc2xlYXp5LiAgV2UgYm9ycm93IGpfbGlzdF9sb2NrIHRvIHByb3RlY3QKKwkgKiBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gaW4gX19qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50LgorCSAqIFJlYWxseSwgX19qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50IHNob3VsZCBiZSB1c2luZyBqX3N0YXRlX2xvY2sgYnV0CisJICogaXQncyBhIGJpdCBoYXNzbGUgdG8gaG9sZCB0aGF0IGFjcm9zcyBfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQKKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJLyoKKwkgKiBOb3cgcmVjaGVjayBpZiBzb21lIGJ1ZmZlcnMgZGlkIG5vdCBnZXQgYXR0YWNoZWQgdG8gdGhlIHRyYW5zYWN0aW9uCisJICogd2hpbGUgdGhlIGxvY2sgd2FzIGRyb3BwZWQuLi4KKwkgKi8KKwlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2ZvcmdldCkgewogCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwotCQlpZiAoY29uZF9yZXNjaGVkKCkpCi0JCQlnb3RvIHJlc3RhcnRfbG9vcDsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCWdvdG8gcmVzdGFydF9sb29wOwogCX0KIAogCS8qIERvbmUgd2l0aCB0aGlzIHRyYW5zYWN0aW9uISAqLwpAQCAtODAzLDE0ICs4MjUsNiBAQAogCiAJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfQ09NTUlUKTsKIAotCS8qCi0JICogVGhpcyBpcyBhIGJpdCBzbGVhenkuICBXZSBib3Jyb3cgal9saXN0X2xvY2sgdG8gcHJvdGVjdAotCSAqIGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiBpbiBfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQuCi0JICogUmVhbGx5LCBfX2pvcm5hbF9yZW1vdmVfY2hlY2twb2ludCBzaG91bGQgYmUgdXNpbmcgal9zdGF0ZV9sb2NrIGJ1dAotCSAqIGl0J3MgYSBiaXQgaGFzc2xlIHRvIGhvbGQgdGhhdCBhY3Jvc3MgX19qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50Ci0JICovCi0Jc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwotCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfRklOSVNIRUQ7CiAJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uID09IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7CiAJam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UgPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkOwpkaWZmIC0tZ2l0IGEvZnMvamJkL2pvdXJuYWwuYyBiL2ZzL2piZC9qb3VybmFsLmMKaW5kZXggNWU3YjQzOS4uN2FlMmM0ZiAxMDA2NDQKLS0tIGEvZnMvamJkL2pvdXJuYWwuYworKysgYi9mcy9qYmQvam91cm5hbC5jCkBAIC02NSw3ICs2NSw2IEBACiBFWFBPUlRfU1lNQk9MKGpvdXJuYWxfY3JlYXRlKTsKIEVYUE9SVF9TWU1CT0woam91cm5hbF9sb2FkKTsKIEVYUE9SVF9TWU1CT0woam91cm5hbF9kZXN0cm95KTsKLUVYUE9SVF9TWU1CT0woam91cm5hbF9yZWNvdmVyKTsKIEVYUE9SVF9TWU1CT0woam91cm5hbF91cGRhdGVfc3VwZXJibG9jayk7CiBFWFBPUlRfU1lNQk9MKGpvdXJuYWxfYWJvcnQpOwogRVhQT1JUX1NZTUJPTChqb3VybmFsX2Vycm5vKTsKQEAgLTgxLDYgKzgwLDcgQEAKIEVYUE9SVF9TWU1CT0woam91cm5hbF9mb3JjZV9jb21taXQpOwogCiBzdGF0aWMgaW50IGpvdXJuYWxfY29udmVydF9zdXBlcmJsb2NrX3YxKGpvdXJuYWxfdCAqLCBqb3VybmFsX3N1cGVyYmxvY2tfdCAqKTsKK3N0YXRpYyB2b2lkIF9fam91cm5hbF9hYm9ydF9zb2Z0IChqb3VybmFsX3QgKmpvdXJuYWwsIGludCBlcnJubyk7CiAKIC8qCiAgKiBIZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBtYW5hZ2UgY29tbWl0IHRpbWVvdXRzCkBAIC05MywxNiArOTMsNiBAQAogCXdha2VfdXBfcHJvY2VzcyhwKTsKIH0KIAotLyogU3RhdGljIGNoZWNrIGZvciBkYXRhIHN0cnVjdHVyZSBjb25zaXN0ZW5jeS4gIFRoZXJlJ3Mgbm8gY29kZQotICogaW52b2tlZCAtLS0gd2UnbGwganVzdCBnZXQgYSBsaW5rZXIgZmFpbHVyZSBpZiB0aGluZ3MgYXJlbid0IHJpZ2h0LgotICovCi12b2lkIF9fam91cm5hbF9pbnRlcm5hbF9jaGVjayh2b2lkKQotewotCWV4dGVybiB2b2lkIGpvdXJuYWxfYmFkX3N1cGVyYmxvY2tfc2l6ZSh2b2lkKTsKLQlpZiAoc2l6ZW9mKHN0cnVjdCBqb3VybmFsX3N1cGVyYmxvY2tfcykgIT0gMTAyNCkKLQkJam91cm5hbF9iYWRfc3VwZXJibG9ja19zaXplKCk7Ci19Ci0KIC8qCiAgKiBram91cm5hbGQ6IFRoZSBtYWluIHRocmVhZCBmdW5jdGlvbiB1c2VkIHRvIG1hbmFnZSBhIGxvZ2dpbmcgZGV2aWNlCiAgKiBqb3VybmFsLgpAQCAtMTE5LDE2ICsxMDksMTIgQEAKICAqICAgIGtub3duIGFzIGNoZWNrcG9pbnRpbmcsIGFuZCB0aGlzIHRocmVhZCBpcyByZXNwb25zaWJsZSBmb3IgdGhhdCBqb2IuCiAgKi8KIAotam91cm5hbF90ICpjdXJyZW50X2pvdXJuYWw7CQkvLyBBS1BNOiBkZWJ1ZwotCi1pbnQga2pvdXJuYWxkKHZvaWQgKmFyZykKK3N0YXRpYyBpbnQga2pvdXJuYWxkKHZvaWQgKmFyZykKIHsKIAlqb3VybmFsX3QgKmpvdXJuYWwgPSAoam91cm5hbF90ICopIGFyZzsKIAl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAotCWN1cnJlbnRfam91cm5hbCA9IGpvdXJuYWw7Ci0KIAlkYWVtb25pemUoImtqb3VybmFsZCIpOwogCiAJLyogU2V0IHVwIGFuIGludGVydmFsIHRpbWVyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHRyaWdnZXIgYQpAQCAtMTkzLDYgKzE3OSw4IEBACiAJCWlmICh0cmFuc2FjdGlvbiAmJiB0aW1lX2FmdGVyX2VxKGppZmZpZXMsCiAJCQkJCQl0cmFuc2FjdGlvbi0+dF9leHBpcmVzKSkKIAkJCXNob3VsZF9zbGVlcCA9IDA7CisJCWlmIChqb3VybmFsLT5qX2ZsYWdzICYgSkZTX1VOTU9VTlQpCisgCQkJc2hvdWxkX3NsZWVwID0gMDsKIAkJaWYgKHNob3VsZF9zbGVlcCkgewogCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAJCQlzY2hlZHVsZSgpOwpAQCAtOTY5LDcgKzk1Nyw3IEBACiAJaWYgKHdhaXQpCiAJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKIAllbHNlCi0JCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmYmgpOworCQlsbF9yd19ibG9jayhTV1JJVEUsIDEsICZiaCk7CiAKIG91dDoKIAkvKiBJZiB3ZSBoYXZlIGp1c3QgZmx1c2hlZCB0aGUgbG9nIChieSBtYXJraW5nIHNfc3RhcnQ9PTApLCB0aGVuCkBAIC0xNDM5LDcgKzE0MjcsNyBAQAogICogZGV2aWNlIHRoaXMgam91cm5hbCBpcyBwcmVzZW50LgogICovCiAKLWNvbnN0IGNoYXIgKmpvdXJuYWxfZGV2X25hbWUoam91cm5hbF90ICpqb3VybmFsLCBjaGFyICpidWZmZXIpCitzdGF0aWMgY29uc3QgY2hhciAqam91cm5hbF9kZXZfbmFtZShqb3VybmFsX3QgKmpvdXJuYWwsIGNoYXIgKmJ1ZmZlcikKIHsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCkBAIC0xNDg1LDcgKzE0NzMsNyBAQAogCiAvKiBTb2Z0IGFib3J0OiByZWNvcmQgdGhlIGFib3J0IGVycm9yIHN0YXR1cyBpbiB0aGUgam91cm5hbCBzdXBlcmJsb2NrLAogICogYnV0IGRvbid0IGRvIGFueSBvdGhlciBJTy4gKi8KLXZvaWQgX19qb3VybmFsX2Fib3J0X3NvZnQgKGpvdXJuYWxfdCAqam91cm5hbCwgaW50IGVycm5vKQorc3RhdGljIHZvaWQgX19qb3VybmFsX2Fib3J0X3NvZnQgKGpvdXJuYWxfdCAqam91cm5hbCwgaW50IGVycm5vKQogewogCWlmIChqb3VybmFsLT5qX2ZsYWdzICYgSkZTX0FCT1JUKQogCQlyZXR1cm47CkBAIC0xODgwLDcgKzE4NjgsNyBAQAogCiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2piZF9kZWJ1ZzsKIAotaW50IHJlYWRfamJkX2RlYnVnKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorc3RhdGljIGludCByZWFkX2piZF9kZWJ1ZyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKIAkJCSAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKIAlpbnQgcmV0OwpAQCAtMTg5MCw3ICsxODc4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd3JpdGVfamJkX2RlYnVnKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorc3RhdGljIGludCB3cml0ZV9qYmRfZGVidWcoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewogCWNoYXIgYnVmWzMyXTsKQEAgLTE5NzksNiArMTk2NywxNCBAQAogewogCWludCByZXQ7CiAKKy8qIFN0YXRpYyBjaGVjayBmb3IgZGF0YSBzdHJ1Y3R1cmUgY29uc2lzdGVuY3kuICBUaGVyZSdzIG5vIGNvZGUKKyAqIGludm9rZWQgLS0tIHdlJ2xsIGp1c3QgZ2V0IGEgbGlua2VyIGZhaWx1cmUgaWYgdGhpbmdzIGFyZW4ndCByaWdodC4KKyAqLworCWV4dGVybiB2b2lkIGpvdXJuYWxfYmFkX3N1cGVyYmxvY2tfc2l6ZSh2b2lkKTsKKwlpZiAoc2l6ZW9mKHN0cnVjdCBqb3VybmFsX3N1cGVyYmxvY2tfcykgIT0gMTAyNCkKKwkJam91cm5hbF9iYWRfc3VwZXJibG9ja19zaXplKCk7CisKKwogCXJldCA9IGpvdXJuYWxfaW5pdF9jYWNoZXMoKTsKIAlpZiAocmV0ICE9IDApCiAJCWpvdXJuYWxfZGVzdHJveV9jYWNoZXMoKTsKZGlmZiAtLWdpdCBhL2ZzL2piZC9yZXZva2UuYyBiL2ZzL2piZC9yZXZva2UuYwppbmRleCBkMzI3YTU5Li5hNTYxNDQxIDEwMDY0NAotLS0gYS9mcy9qYmQvcmV2b2tlLmMKKysrIGIvZnMvamJkL3Jldm9rZS5jCkBAIC0xMTYsNyArMTE2LDggQEAKIAkJKGJsb2NrIDw8IChoYXNoX3NoaWZ0IC0gMTIpKSkgJiAodGFibGUtPmhhc2hfc2l6ZSAtIDEpOwogfQogCi1pbnQgaW5zZXJ0X3Jldm9rZV9oYXNoKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBibG9ja25yLCB0aWRfdCBzZXEpCitzdGF0aWMgaW50IGluc2VydF9yZXZva2VfaGFzaChqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgYmxvY2tuciwKKwkJCSAgICAgIHRpZF90IHNlcSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CiAJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKQEAgLTYxMyw3ICs2MTQsNyBAQAogCXNldF9idWZmZXJfandyaXRlKGJoKTsKIAlCVUZGRVJfVFJBQ0UoYmgsICJ3cml0ZSIpOwogCXNldF9idWZmZXJfZGlydHkoYmgpOwotCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmYmgpOworCWxsX3J3X2Jsb2NrKFNXUklURSwgMSwgJmJoKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9mcy9qYmQvdHJhbnNhY3Rpb24uYyBiL2ZzL2piZC90cmFuc2FjdGlvbi5jCmluZGV4IDc3Yjc2NjIuLjQ5YmJjMmIgMTAwNjQ0Ci0tLSBhL2ZzL2piZC90cmFuc2FjdGlvbi5jCisrKyBiL2ZzL2piZC90cmFuc2FjdGlvbi5jCkBAIC00OTAsMjMgKzQ5MCwyMSBAQAogICovCiBzdGF0aWMgdm9pZCBqYmRfdW5leHBlY3RlZF9kaXJ0eV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKIAlpbnQgamxpc3Q7CiAKLQlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgewotCQkvKiBJZiB0aGlzIGJ1ZmZlciBpcyBvbmUgd2hpY2ggbWlnaHQgcmVhc29uYWJseSBiZSBkaXJ0eQotCQkgKiAtLS0gaWUuIGRhdGEsIG9yIG5vdCBwYXJ0IG9mIHRoaXMgam91cm5hbCAtLS0gdGhlbgotCQkgKiB3ZSdyZSBPSyB0byBsZWF2ZSBpdCBhbG9uZSwgYnV0IG90aGVyd2lzZSB3ZSBuZWVkIHRvCi0JCSAqIG1vdmUgdGhlIGRpcnR5IGJpdCB0byB0aGUgam91cm5hbCdzIG93biBpbnRlcm5hbAotCQkgKiBKQkREaXJ0eSBiaXQuICovCi0JCWpsaXN0ID0gamgtPmJfamxpc3Q7CisJLyogSWYgdGhpcyBidWZmZXIgaXMgb25lIHdoaWNoIG1pZ2h0IHJlYXNvbmFibHkgYmUgZGlydHkKKwkgKiAtLS0gaWUuIGRhdGEsIG9yIG5vdCBwYXJ0IG9mIHRoaXMgam91cm5hbCAtLS0gdGhlbgorCSAqIHdlJ3JlIE9LIHRvIGxlYXZlIGl0IGFsb25lLCBidXQgb3RoZXJ3aXNlIHdlIG5lZWQgdG8KKwkgKiBtb3ZlIHRoZSBkaXJ0eSBiaXQgdG8gdGhlIGpvdXJuYWwncyBvd24gaW50ZXJuYWwKKwkgKiBKQkREaXJ0eSBiaXQuICovCisJamxpc3QgPSBqaC0+Yl9qbGlzdDsKIAotCQlpZiAoamxpc3QgPT0gQkpfTWV0YWRhdGEgfHwgamxpc3QgPT0gQkpfUmVzZXJ2ZWQgfHwgCi0JCSAgICBqbGlzdCA9PSBCSl9TaGFkb3cgfHwgamxpc3QgPT0gQkpfRm9yZ2V0KSB7Ci0JCQlpZiAodGVzdF9jbGVhcl9idWZmZXJfZGlydHkoamgyYmgoamgpKSkgewotCQkJCXNldF9iaXQoQkhfSkJERGlydHksICZqaDJiaChqaCktPmJfc3RhdGUpOwotCQkJfQotCQl9CisJaWYgKGpsaXN0ID09IEJKX01ldGFkYXRhIHx8IGpsaXN0ID09IEJKX1Jlc2VydmVkIHx8CisJICAgIGpsaXN0ID09IEJKX1NoYWRvdyB8fCBqbGlzdCA9PSBCSl9Gb3JnZXQpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCQlpZiAodGVzdF9jbGVhcl9idWZmZXJfZGlydHkoYmgpKQorCQkJc2V0X2J1ZmZlcl9qYmRkaXJ0eShiaCk7CiAJfQogfQogCkBAIC01NzQsOSArNTcyLDE0IEBACiAJCQlpZiAoamgtPmJfbmV4dF90cmFuc2FjdGlvbikKIAkJCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PQogCQkJCQkJCXRyYW5zYWN0aW9uKTsKLQkJCUpCVUZGRVJfVFJBQ0UoamgsICJVbmV4cGVjdGVkIGRpcnR5IGJ1ZmZlciIpOwotCQkJamJkX3VuZXhwZWN0ZWRfZGlydHlfYnVmZmVyKGpoKTsKLSAJCX0KKwkJfQorCQkvKgorCQkgKiBJbiBhbnkgY2FzZSB3ZSBuZWVkIHRvIGNsZWFuIHRoZSBkaXJ0eSBmbGFnIGFuZCB3ZSBtdXN0CisJCSAqIGRvIGl0IHVuZGVyIHRoZSBidWZmZXIgbG9jayB0byBiZSBzdXJlIHdlIGRvbid0IHJhY2UKKwkJICogd2l0aCBydW5uaW5nIHdyaXRlLW91dC4KKwkJICovCisJCUpCVUZGRVJfVFJBQ0UoamgsICJVbmV4cGVjdGVkIGRpcnR5IGJ1ZmZlciIpOworCQlqYmRfdW5leHBlY3RlZF9kaXJ0eV9idWZmZXIoamgpOwogIAl9CiAKIAl1bmxvY2tfYnVmZmVyKGJoKTsKQEAgLTEzMzcsOCArMTM0MCw3IEBACiAJaWYgKGhhbmRsZS0+aF9zeW5jKSB7CiAJCWRvIHsKIAkJCW9sZF9oYW5kbGVfY291bnQgPSB0cmFuc2FjdGlvbi0+dF9oYW5kbGVfY291bnQ7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJCX0gd2hpbGUgKG9sZF9oYW5kbGVfY291bnQgIT0gdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2NvdW50KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2pmZnMvaW5vZGUtdjIzLmMgYi9mcy9qZmZzL2lub2RlLXYyMy5jCmluZGV4IGJmYmViNGMuLjNkY2M2ZDIgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMvaW5vZGUtdjIzLmMKKysrIGIvZnMvamZmcy9pbm9kZS12MjMuYwpAQCAtMTYyOSw5ICsxNjI5LDYgQEAKIH0KIAogCi1leHRlcm4gaW50IGdlbmVyaWNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7Ci1leHRlcm4gbG9mZl90IGdlbmVyaWNfZmlsZV9sbHNlZWsoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBpbnQpIF9fYXR0cmlidXRlX18oKHdlYWspKTsKLQogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZmc19maWxlX29wZXJhdGlvbnMgPQogewogCS5vcGVuCQk9IGdlbmVyaWNfZmlsZV9vcGVuLApAQCAtMTc0Nyw2ICsxNzQ0LDcgQEAKIAlEMyhwcmludGsoImpmZnNfZGVsZXRlX2lub2RlKCk6IGlub2RlLT5pX2lubyA9PSAlbHVcbiIsCiAJCSAgaW5vZGUtPmlfaW5vKSk7CiAKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAJbG9ja19rZXJuZWwoKTsKIAlpbm9kZS0+aV9zaXplID0gMDsKIAlpbm9kZS0+aV9ibG9ja3MgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvamZmcy9pbnRyZXAuYyBiL2ZzL2pmZnMvaW50cmVwLmMKaW5kZXggNDU2ZDdlNi4uMjdmMTk5ZSAxMDA2NDQKLS0tIGEvZnMvamZmcy9pbnRyZXAuYworKysgYi9mcy9qZmZzL2ludHJlcC5jCkBAIC0xNzAxLDEyICsxNzAxLDEwIEBACiB7CiAJc3RydWN0IGpmZnNfZmlsZSAqZjsKIAlpbnQgaSA9IGlubyAlIGMtPmhhc2hfbGVuOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAogCUQzKHByaW50aygiamZmc19maW5kX2ZpbGUoKTogaW5vOiAldVxuIiwgaW5vKSk7CiAKLQlmb3IgKHRtcCA9IGMtPmhhc2hbaV0ubmV4dDsgdG1wICE9ICZjLT5oYXNoW2ldOyB0bXAgPSB0bXAtPm5leHQpIHsKLQkJZiA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgamZmc19maWxlLCBoYXNoKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZjLT5oYXNoW2ldLCBoYXNoKSB7CiAJCWlmIChpbm8gIT0gZi0+aW5vKQogCQkJY29udGludWU7CiAJCUQzKHByaW50aygiamZmc19maW5kX2ZpbGUoKTogRm91bmQgZmlsZSB3aXRoIGlubyAiCkBAIC0yMTAyLDEzICsyMTAwLDEyIEBACiAJaW50IHJlc3VsdCA9IDA7CiAKIAlmb3IgKHBvcyA9IDA7IHBvcyA8IGMtPmhhc2hfbGVuOyBwb3MrKykgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbmV4dDsKLQkJZm9yIChwID0gYy0+aGFzaFtwb3NdLm5leHQ7IHAgIT0gJmMtPmhhc2hbcG9zXTsgcCA9IG5leHQpIHsKLQkJCS8qIFdlIG5lZWQgYSByZWZlcmVuY2UgdG8gdGhlIG5leHQgZmlsZSBpbiB0aGUKLQkJCSAgIGxpc3QgYmVjYXVzZSBgZnVuYycgbWlnaHQgcmVtb3ZlIHRoZSBjdXJyZW50Ci0JCQkgICBmaWxlIGBmJy4gICovCi0JCQluZXh0ID0gcC0+bmV4dDsKLQkJCXIgPSBmdW5jKGxpc3RfZW50cnkocCwgc3RydWN0IGpmZnNfZmlsZSwgaGFzaCkpOworCQlzdHJ1Y3QgamZmc19maWxlICpmLCAqbmV4dDsKKworCQkvKiBXZSBtdXN0IGRvIF9zYWZlLCBiZWNhdXNlICdmdW5jJyBtaWdodCByZW1vdmUgdGhlCisJCSAgIGN1cnJlbnQgZmlsZSAnZicgZnJvbSB0aGUgbGlzdC4gICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmLCBuZXh0LCAmYy0+aGFzaFtwb3NdLCBoYXNoKSB7CisJCQlyID0gZnVuYyhmKTsKIAkJCWlmIChyIDwgMCkKIAkJCQlyZXR1cm4gcjsKIAkJCXJlc3VsdCArPSByOwpAQCAtMjYxMyw5ICsyNjEwLDggQEAKIAogCXByaW50aygiSkZGUzogRHVtcGluZyB0aGUgZmlsZSBzeXN0ZW0ncyBoYXNoIHRhYmxlLi4uXG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgYy0+aGFzaF9sZW47IGkrKykgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCQlmb3IgKHAgPSBjLT5oYXNoW2ldLm5leHQ7IHAgIT0gJmMtPmhhc2hbaV07IHAgPSBwLT5uZXh0KSB7Ci0JCQlzdHJ1Y3QgamZmc19maWxlICpmPWxpc3RfZW50cnkocCxzdHJ1Y3QgamZmc19maWxlLGhhc2gpOworCQlzdHJ1Y3QgamZmc19maWxlICpmOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZjLT5oYXNoW2ldLCBoYXNoKSB7CiAJCQlwcmludGsoIioqKiBjLT5oYXNoWyV1XTogXCIlc1wiICIKIAkJCSAgICAgICAiKGlubzogJXUsIHBpbm86ICV1KVxuIiwKIAkJCSAgICAgICBpLCAoZi0+bmFtZSA/IGYtPm5hbWUgOiAiIiksCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9maWxlLmMgYi9mcy9qZmZzMi9maWxlLmMKaW5kZXggYmQ5ZWQ5Yi4uODI3OWJmMCAxMDA2NDQKLS0tIGEvZnMvamZmczIvZmlsZS5jCisrKyBiL2ZzL2pmZnMyL2ZpbGUuYwpAQCAtMjEsOSArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2pmZnMyLmg+CiAjaW5jbHVkZSAibm9kZWxpc3QuaCIKIAotZXh0ZXJuIGludCBnZW5lcmljX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKikgX19hdHRyaWJ1dGVfXygod2VhaykpOwotZXh0ZXJuIGxvZmZfdCBnZW5lcmljX2ZpbGVfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7Ci0KIHN0YXRpYyBpbnQgamZmczJfY29tbWl0X3dyaXRlIChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBhZ2UgKnBnLAogCQkJICAgICAgIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQpOwogc3RhdGljIGludCBqZmZzMl9wcmVwYXJlX3dyaXRlIChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBhZ2UgKnBnLApkaWZmIC0tZ2l0IGEvZnMvamZzL2FjbC5jIGIvZnMvamZzL2FjbC5jCmluZGV4IGU4OTJkYWIuLjQ2MWU0OTMgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9hY2wuYworKysgYi9mcy9qZnMvYWNsLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgogI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfdHhubWdyLmgiCiAjaW5jbHVkZSAiamZzX3hhdHRyLmgiCiAjaW5jbHVkZSAiamZzX2FjbC5oIgogCkBAIC03NSw3ICs3Niw4IEBACiAJcmV0dXJuIGFjbDsKIH0KIAotc3RhdGljIGludCBqZnNfc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgc3RydWN0IHBvc2l4X2FjbCAqYWNsKQorc3RhdGljIGludCBqZnNfc2V0X2FjbCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLAorCQkgICAgICAgc3RydWN0IHBvc2l4X2FjbCAqYWNsKQogewogCWNoYXIgKmVhX25hbWU7CiAJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpbm9kZSk7CkBAIC0xMTAsNyArMTEyLDcgQEAKIAkJaWYgKHJjIDwgMCkKIAkJCWdvdG8gb3V0OwogCX0KLQlyYyA9IF9famZzX3NldHhhdHRyKGlub2RlLCBlYV9uYW1lLCB2YWx1ZSwgc2l6ZSwgMCk7CisJcmMgPSBfX2pmc19zZXR4YXR0cih0aWQsIGlub2RlLCBlYV9uYW1lLCB2YWx1ZSwgc2l6ZSwgMCk7CiBvdXQ6CiAJa2ZyZWUodmFsdWUpOwogCkBAIC0xNDMsNyArMTQ1LDcgQEAKIAlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBqZnNfY2hlY2tfYWNsKTsKIH0KIAotaW50IGpmc19pbml0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcikKK2ludCBqZnNfaW5pdF9hY2wodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcikKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBOVUxMOwogCXN0cnVjdCBwb3NpeF9hY2wgKmNsb25lOwpAQCAtMTU5LDcgKzE2MSw3IEBACiAKIAlpZiAoYWNsKSB7CiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCQlyYyA9IGpmc19zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBhY2wpOworCQkJcmMgPSBqZnNfc2V0X2FjbCh0aWQsIGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBhY2wpOwogCQkJaWYgKHJjKQogCQkJCWdvdG8gY2xlYW51cDsKIAkJfQpAQCAtMTczLDcgKzE3NSw4IEBACiAJCWlmIChyYyA+PSAwKSB7CiAJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJCWlmIChyYyA+IDApCi0JCQkJcmMgPSBqZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisJCQkJcmMgPSBqZnNfc2V0X2FjbCh0aWQsIGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsCisJCQkJCQkgY2xvbmUpOwogCQl9CiAJCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKIGNsZWFudXA6CkBAIC0yMDIsOCArMjA1LDE1IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJcmMgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7Ci0JaWYgKCFyYykKLQkJcmMgPSBqZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisJaWYgKCFyYykgeworCQl0aWRfdCB0aWQgPSB0eEJlZ2luKGlub2RlLT5pX3NiLCAwKTsKKwkJZG93bigmSkZTX0lQKGlub2RlKS0+Y29tbWl0X3NlbSk7CisJCXJjID0gamZzX3NldF9hY2wodGlkLCBpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisJCWlmICghcmMpCisJCQlyYyA9IHR4Q29tbWl0KHRpZCwgMSwgJmlub2RlLCAwKTsKKwkJdHhFbmQodGlkKTsKKwkJdXAoJkpGU19JUChpbm9kZSktPmNvbW1pdF9zZW0pOworCX0KIAogCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9mcy9qZnMvaW5vZGUuYyBiL2ZzL2pmcy9pbm9kZS5jCmluZGV4IDc2N2M3ZWMuLjBlYzYyZDUgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9pbm9kZS5jCisrKyBiL2ZzL2pmcy9pbm9kZS5jCkBAIC0xMjgsMjEgKzEyOCwyMyBAQAogewogCWpmc19pbmZvKCJJbiBqZnNfZGVsZXRlX2lub2RlLCBpbm9kZSA9IDB4JXAiLCBpbm9kZSk7CiAKLQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSB8fAotCSAgICAoSkZTX0lQKGlub2RlKS0+ZmlsZXNldCAhPSBjcHVfdG9fbGUzMihGSUxFU1lTVEVNX0kpKSkKLQkJCXJldHVybjsKKwlpZiAoIWlzX2JhZF9pbm9kZShpbm9kZSkgJiYKKwkgICAgKEpGU19JUChpbm9kZSktPmZpbGVzZXQgPT0gY3B1X3RvX2xlMzIoRklMRVNZU1RFTV9JKSkpIHsKIAotCWlmICh0ZXN0X2NmbGFnKENPTU1JVF9GcmVld21hcCwgaW5vZGUpKQotCQlqZnNfZnJlZV96ZXJvX2xpbmsoaW5vZGUpOworCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAKLQlkaUZyZWUoaW5vZGUpOworCQlpZiAodGVzdF9jZmxhZyhDT01NSVRfRnJlZXdtYXAsIGlub2RlKSkKKwkJCWpmc19mcmVlX3plcm9fbGluayhpbm9kZSk7CiAKLQkvKgotCSAqIEZyZWUgdGhlIGlub2RlIGZyb20gdGhlIHF1b3RhIGFsbG9jYXRpb24uCi0JICovCi0JRFFVT1RfSU5JVChpbm9kZSk7Ci0JRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7Ci0JRFFVT1RfRFJPUChpbm9kZSk7CisJCWRpRnJlZShpbm9kZSk7CisKKwkJLyoKKwkJICogRnJlZSB0aGUgaW5vZGUgZnJvbSB0aGUgcXVvdGEgYWxsb2NhdGlvbi4KKwkJICovCisJCURRVU9UX0lOSVQoaW5vZGUpOworCQlEUVVPVF9GUkVFX0lOT0RFKGlub2RlKTsKKwkJRFFVT1RfRFJPUChpbm9kZSk7CisJfQogCiAJY2xlYXJfaW5vZGUoaW5vZGUpOwogfQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19hY2wuaCBiL2ZzL2pmcy9qZnNfYWNsLmgKaW5kZXggYTNhY2QzZS4uYTc2MjkzNzYgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfYWNsLmgKKysrIGIvZnMvamZzL2pmc19hY2wuaApAQCAtMjEsOCArMjEsMTYgQEAKICNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAogCiBpbnQgamZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICosIGludCwgc3RydWN0IG5hbWVpZGF0YSAqKTsKLWludCBqZnNfaW5pdF9hY2woc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKK2ludCBqZnNfaW5pdF9hY2wodGlkX3QsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CiBpbnQgamZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7CiAKLSNlbmRpZgkJLyogQ09ORklHX0pGU19QT1NJWF9BQ0wgKi8KKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IGpmc19pbml0X2FjbCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgc3RydWN0IGlub2RlICpkaXIpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgogI2VuZGlmCQkvKiBfSF9KRlNfQUNMICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2ZpbHN5cy5oIGIvZnMvamZzL2pmc19maWxzeXMuaAppbmRleCA4NmNjYWM4Li43MmE1NTg4IDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2ZpbHN5cy5oCisrKyBiL2ZzL2pmcy9qZnNfZmlsc3lzLmgKQEAgLTM3LDYgKzM3LDkgQEAKICNkZWZpbmUgSkZTX0VSUl9DT05USU5VRSAgIDB4MDAwMDAwMDQgICAvKiBjb250aW51ZSAqLwogI2RlZmluZSBKRlNfRVJSX1BBTklDICAgICAgMHgwMDAwMDAwOCAgIC8qIHBhbmljICovCiAKKyNkZWZpbmUJSkZTX1VTUlFVT1RBCTB4MDAwMDAwMTAKKyNkZWZpbmUJSkZTX0dSUFFVT1RBCTB4MDAwMDAwMjAKKwogLyogcGxhdGZvcm0gb3B0aW9uIChjb25kaXRpb25hbCBjb21waWxhdGlvbikgKi8KICNkZWZpbmUgSkZTX0FJWAkJMHg4MDAwMDAwMAkvKiBBSVggc3VwcG9ydCAqLwogLyoJUE9TSVggbmFtZS9kaXJlY3RvcnkgIHN1cHBvcnQgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfeGF0dHIuaCBiL2ZzL2pmcy9qZnNfeGF0dHIuaAppbmRleCBhMTA1MmYzLi4yNWU5OTkwIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX3hhdHRyLmgKKysrIGIvZnMvamZzL2pmc194YXR0ci5oCkBAIC01Miw4ICs1Miw4IEBACiAjZGVmaW5lCUVORF9FQUxJU1QoZWFsaXN0KSBcCiAJKChzdHJ1Y3QgamZzX2VhICopICgoKGNoYXIgKikgKGVhbGlzdCkpICsgRUFMSVNUX1NJWkUoZWFsaXN0KSkpCiAKLWV4dGVybiBpbnQgX19qZnNfc2V0eGF0dHIoc3RydWN0IGlub2RlICosIGNvbnN0IGNoYXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsCi0JCQkgIGludCk7CitleHRlcm4gaW50IF9famZzX3NldHhhdHRyKHRpZF90LCBzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosCisJCQkgIHNpemVfdCwgaW50KTsKIGV4dGVybiBpbnQgamZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosIHNpemVfdCwKIAkJCWludCk7CiBleHRlcm4gc3NpemVfdCBfX2pmc19nZXR4YXR0cihzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqLCB2b2lkICosIHNpemVfdCk7CkBAIC02MSw0ICs2MSwxNCBAQAogZXh0ZXJuIHNzaXplX3QgamZzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKIGV4dGVybiBpbnQgamZzX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKIAorI2lmZGVmIENPTkZJR19KRlNfU0VDVVJJVFkKK2V4dGVybiBpbnQgamZzX2luaXRfc2VjdXJpdHkodGlkX3QsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgamZzX2luaXRfc2VjdXJpdHkodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiAjZW5kaWYJLyogSF9KRlNfWEFUVFIgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9uYW1laS5jIGIvZnMvamZzL25hbWVpLmMKaW5kZXggMWNhZTE0ZS4uMWFiZTczNCAxMDA2NDQKLS0tIGEvZnMvamZzL25hbWVpLmMKKysrIGIvZnMvamZzL25hbWVpLmMKQEAgLTM5LDYgKzM5LDI0IEBACiBzdGF0aWMgczY0IGNvbW1pdFplcm9MaW5rKHRpZF90LCBzdHJ1Y3QgaW5vZGUgKik7CiAKIC8qCisgKiBOQU1FOglmcmVlX2VhX3dtYXAoaW5vZGUpCisgKgorICogRlVOQ1RJT046CWZyZWUgdW5jb21taXR0ZWQgZXh0ZW5kZWQgYXR0cmlidXRlcyBmcm9tIHdvcmtpbmcgbWFwIAorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfZWFfd21hcChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWR4ZF90ICplYSA9ICZKRlNfSVAoaW5vZGUpLT5lYTsKKworCWlmIChlYS0+ZmxhZyAmIERYRF9FWFRFTlQpIHsKKwkJLyogZnJlZSBFQSBwYWdlcyBmcm9tIGNhY2hlICovCisJCWludmFsaWRhdGVfZHhkX21ldGFwYWdlcyhpbm9kZSwgKmVhKTsKKwkJZGJGcmVlKGlub2RlLCBhZGRyZXNzRFhEKGVhKSwgbGVuZ3RoRFhEKGVhKSk7CisJfQorCWVhLT5mbGFnID0gMDsKK30KKworLyoKICAqIE5BTUU6CWpmc19jcmVhdGUoZGlwLCBkZW50cnksIG1vZGUpCiAgKgogICogRlVOQ1RJT046CWNyZWF0ZSBhIHJlZ3VsYXIgZmlsZSBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSA8ZGlwPgpAQCAtODksOCArMTA3LDE5IEBACiAJZG93bigmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOwogCWRvd24oJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOwogCisJcmMgPSBqZnNfaW5pdF9hY2wodGlkLCBpcCwgZGlwKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0MzsKKworCXJjID0gamZzX2luaXRfc2VjdXJpdHkodGlkLCBpcCwgZGlwKTsKKwlpZiAocmMpIHsKKwkJdHhBYm9ydCh0aWQsIDApOworCQlnb3RvIG91dDM7CisJfQorCiAJaWYgKChyYyA9IGR0U2VhcmNoKGRpcCwgJmRuYW1lLCAmaW5vLCAmYnRzdGFjaywgSkZTX0NSRUFURSkpKSB7CiAJCWpmc19lcnIoImpmc19jcmVhdGU6IGR0U2VhcmNoIHJldHVybmVkICVkIiwgcmMpOworCQl0eEFib3J0KHRpZCwgMCk7CiAJCWdvdG8gb3V0MzsKIAl9CiAKQEAgLTEzOSw2ICsxNjgsNyBAQAogCXVwKCZKRlNfSVAoZGlwKS0+Y29tbWl0X3NlbSk7CiAJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOwogCWlmIChyYykgeworCQlmcmVlX2VhX3dtYXAoaXApOwogCQlpcC0+aV9ubGluayA9IDA7CiAJCWlwdXQoaXApOwogCX0gZWxzZQpAQCAtMTQ3LDExICsxNzcsNiBAQAogICAgICAgb3V0MjoKIAlmcmVlX1VDU25hbWUoJmRuYW1lKTsKIAotI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCi0JaWYgKHJjID09IDApCi0JCWpmc19pbml0X2FjbChpcCwgZGlwKTsKLSNlbmRpZgotCiAgICAgICBvdXQxOgogCiAJamZzX2luZm8oImpmc19jcmVhdGU6IHJjOiVkIiwgcmMpOwpAQCAtMjE2LDggKzI0MSwxOSBAQAogCWRvd24oJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKIAlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKIAorCXJjID0gamZzX2luaXRfYWNsKHRpZCwgaXAsIGRpcCk7CisJaWYgKHJjKQorCQlnb3RvIG91dDM7CisKKwlyYyA9IGpmc19pbml0X3NlY3VyaXR5KHRpZCwgaXAsIGRpcCk7CisJaWYgKHJjKSB7CisJCXR4QWJvcnQodGlkLCAwKTsKKwkJZ290byBvdXQzOworCX0KKwogCWlmICgocmMgPSBkdFNlYXJjaChkaXAsICZkbmFtZSwgJmlubywgJmJ0c3RhY2ssIEpGU19DUkVBVEUpKSkgewogCQlqZnNfZXJyKCJqZnNfbWtkaXI6IGR0U2VhcmNoIHJldHVybmVkICVkIiwgcmMpOworCQl0eEFib3J0KHRpZCwgMCk7CiAJCWdvdG8gb3V0MzsKIAl9CiAKQEAgLTI2Nyw2ICszMDMsNyBAQAogCXVwKCZKRlNfSVAoZGlwKS0+Y29tbWl0X3NlbSk7CiAJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOwogCWlmIChyYykgeworCQlmcmVlX2VhX3dtYXAoaXApOwogCQlpcC0+aV9ubGluayA9IDA7CiAJCWlwdXQoaXApOwogCX0gZWxzZQpAQCAtMjc1LDEwICszMTIsNiBAQAogICAgICAgb3V0MjoKIAlmcmVlX1VDU25hbWUoJmRuYW1lKTsKIAotI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCi0JaWYgKHJjID09IDApCi0JCWpmc19pbml0X2FjbChpcCwgZGlwKTsKLSNlbmRpZgogCiAgICAgICBvdXQxOgogCkBAIC04ODUsNiArOTE4LDEwIEBACiAJZG93bigmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOwogCWRvd24oJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOwogCisJcmMgPSBqZnNfaW5pdF9zZWN1cml0eSh0aWQsIGlwLCBkaXApOworCWlmIChyYykKKwkJZ290byBvdXQzOworCiAJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKIAl0YmxrLT54ZmxhZyB8PSBDT01NSVRfQ1JFQVRFOwogCXRibGstPmlubyA9IGlwLT5pX2lubzsKQEAgLTEwMDAsNiArMTAzNyw3IEBACiAJdXAoJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKIAl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CiAJaWYgKHJjKSB7CisJCWZyZWVfZWFfd21hcChpcCk7CiAJCWlwLT5pX25saW5rID0gMDsKIAkJaXB1dChpcCk7CiAJfSBlbHNlCkBAIC0xMDA4LDExICsxMDQ2LDYgQEAKICAgICAgIG91dDI6CiAJZnJlZV9VQ1NuYW1lKCZkbmFtZSk7CiAKLSNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAotCWlmIChyYyA9PSAwKQotCQlqZnNfaW5pdF9hY2woaXAsIGRpcCk7Ci0jZW5kaWYKLQogICAgICAgb3V0MToKIAlqZnNfaW5mbygiamZzX3N5bWxpbms6IHJjOiVkIiwgcmMpOwogCXJldHVybiByYzsKQEAgLTEzMjgsMTcgKzEzNjEsMzEgQEAKIAlkb3duKCZKRlNfSVAoZGlyKS0+Y29tbWl0X3NlbSk7CiAJZG93bigmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CiAKLQlpZiAoKHJjID0gZHRTZWFyY2goZGlyLCAmZG5hbWUsICZpbm8sICZidHN0YWNrLCBKRlNfQ1JFQVRFKSkpCisJcmMgPSBqZnNfaW5pdF9hY2wodGlkLCBpcCwgZGlyKTsKKwlpZiAocmMpCiAJCWdvdG8gb3V0MzsKIAorCXJjID0gamZzX2luaXRfc2VjdXJpdHkodGlkLCBpcCwgZGlyKTsKKwlpZiAocmMpIHsKKwkJdHhBYm9ydCh0aWQsIDApOworCQlnb3RvIG91dDM7CisJfQorCisJaWYgKChyYyA9IGR0U2VhcmNoKGRpciwgJmRuYW1lLCAmaW5vLCAmYnRzdGFjaywgSkZTX0NSRUFURSkpKSB7CisJCXR4QWJvcnQodGlkLCAwKTsKKwkJZ290byBvdXQzOworCX0KKwogCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CiAJdGJsay0+eGZsYWcgfD0gQ09NTUlUX0NSRUFURTsKIAl0YmxrLT5pbm8gPSBpcC0+aV9pbm87CiAJdGJsay0+dS5peHB4ZCA9IEpGU19JUChpcCktPml4cHhkOwogCiAJaW5vID0gaXAtPmlfaW5vOwotCWlmICgocmMgPSBkdEluc2VydCh0aWQsIGRpciwgJmRuYW1lLCAmaW5vLCAmYnRzdGFjaykpKQorCWlmICgocmMgPSBkdEluc2VydCh0aWQsIGRpciwgJmRuYW1lLCAmaW5vLCAmYnRzdGFjaykpKSB7CisJCXR4QWJvcnQodGlkLCAwKTsKIAkJZ290byBvdXQzOworCX0KIAogCWlwLT5pX29wID0gJmpmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJamZzX2lwLT5kZXYgPSBuZXdfZW5jb2RlX2RldihyZGV2KTsKQEAgLTEzNjAsNiArMTQwNyw3IEBACiAJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOwogCXVwKCZKRlNfSVAoZGlyKS0+Y29tbWl0X3NlbSk7CiAJaWYgKHJjKSB7CisJCWZyZWVfZWFfd21hcChpcCk7CiAJCWlwLT5pX25saW5rID0gMDsKIAkJaXB1dChpcCk7CiAJfSBlbHNlCkBAIC0xMzY4LDExICsxNDE2LDYgQEAKICAgICAgIG91dDE6CiAJZnJlZV9VQ1NuYW1lKCZkbmFtZSk7CiAKLSNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAotCWlmIChyYyA9PSAwKQotCQlqZnNfaW5pdF9hY2woaXAsIGRpcik7Ci0jZW5kaWYKLQogICAgICAgb3V0OgogCWpmc19pbmZvKCJqZnNfbWtub2Q6IHJldHVybmluZyAlZCIsIHJjKTsKIAlyZXR1cm4gcmM7CkBAIC0xMzkwLDYgKzE0MzMsOCBAQAogCiAJamZzX2luZm8oImpmc19sb29rdXA6IG5hbWUgPSAlcyIsIG5hbWUpOwogCisJaWYgKEpGU19TQkkoZGlwLT5pX3NiKS0+bW50ZmxhZyAmIEpGU19PUzIpCisJCWRlbnRyeS0+ZF9vcCA9ICZqZnNfY2lfZGVudHJ5X29wZXJhdGlvbnM7CiAKIAlpZiAoKG5hbWVbMF0gPT0gJy4nKSAmJiAobGVuID09IDEpKQogCQlpbnVtID0gZGlwLT5pX2lubzsKQEAgLTE0MTcsOSArMTQ2Miw2IEBACiAJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCX0KIAotCWlmIChKRlNfU0JJKGRpcC0+aV9zYiktPm1udGZsYWcgJiBKRlNfT1MyKQotCQlkZW50cnktPmRfb3AgPSAmamZzX2NpX2RlbnRyeV9vcGVyYXRpb25zOwotCiAJZGVudHJ5ID0gZF9zcGxpY2VfYWxpYXMoaXAsIGRlbnRyeSk7CiAKIAlpZiAoZGVudHJ5ICYmIChKRlNfU0JJKGRpcC0+aV9zYiktPm1udGZsYWcgJiBKRlNfT1MyKSkKZGlmZiAtLWdpdCBhL2ZzL2pmcy9zdXBlci5jIGIvZnMvamZzL3N1cGVyLmMKaW5kZXggOWZmODk3Mi4uNzFiYzM0YiAxMDA2NDQKLS0tIGEvZnMvamZzL3N1cGVyLmMKKysrIGIvZnMvamZzL3N1cGVyLmMKQEAgLTIzLDkgKzIzLDExIEBACiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCiAjaW5jbHVkZSAiamZzX2ZpbHN5cy5oIgpAQCAtMTkyLDcgKzE5NCw4IEBACiAKIGVudW0gewogCU9wdF9pbnRlZ3JpdHksIE9wdF9ub2ludGVncml0eSwgT3B0X2lvY2hhcnNldCwgT3B0X3Jlc2l6ZSwKLQlPcHRfcmVzaXplX25vc2l6ZSwgT3B0X2Vycm9ycywgT3B0X2lnbm9yZSwgT3B0X2VyciwKKwlPcHRfcmVzaXplX25vc2l6ZSwgT3B0X2Vycm9ycywgT3B0X2lnbm9yZSwgT3B0X2VyciwgT3B0X3F1b3RhLAorCU9wdF91c3JxdW90YSwgT3B0X2dycHF1b3RhCiB9OwogCiBzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CkBAIC0yMDQsOCArMjA3LDggQEAKIAl7T3B0X2Vycm9ycywgImVycm9ycz0lcyJ9LAogCXtPcHRfaWdub3JlLCAibm9xdW90YSJ9LAogCXtPcHRfaWdub3JlLCAicXVvdGEifSwKLQl7T3B0X2lnbm9yZSwgInVzcnF1b3RhIn0sCi0Je09wdF9pZ25vcmUsICJncnBxdW90YSJ9LAorCXtPcHRfdXNycXVvdGEsICJ1c3JxdW90YSJ9LAorCXtPcHRfZ3JwcXVvdGEsICJncnBxdW90YSJ9LAogCXtPcHRfZXJyLCBOVUxMfQogfTsKIApAQCAtMjkzLDYgKzI5NiwyNCBAQAogCQkJfQogCQkJYnJlYWs7CiAJCX0KKworI2lmIGRlZmluZWQoQ09ORklHX1FVT1RBKQorCQljYXNlIE9wdF9xdW90YToKKwkJY2FzZSBPcHRfdXNycXVvdGE6CisJCQkqZmxhZyB8PSBKRlNfVVNSUVVPVEE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZ3JwcXVvdGE6CisJCQkqZmxhZyB8PSBKRlNfR1JQUVVPVEE7CisJCQlicmVhazsKKyNlbHNlCisJCWNhc2UgT3B0X3VzcnF1b3RhOgorCQljYXNlIE9wdF9ncnBxdW90YToKKwkJY2FzZSBPcHRfcXVvdGE6CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiSkZTOiBxdW90YSBvcGVyYXRpb25zIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJYnJlYWs7CisjZW5kaWYKKwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKCJqZnM6IFVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKIAkJCQkJIiBvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKQEAgLTUzOSw2ICs1NjAsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBqZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgdmZzbW91bnQgKnZmcykKK3sKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkodmZzLT5tbnRfc2IpOworCisJaWYgKHNiaS0+ZmxhZyAmIEpGU19OT0lOVEVHUklUWSkKKwkJc2VxX3B1dHMoc2VxLCAiLG5vaW50ZWdyaXR5Iik7CisJZWxzZQorCQlzZXFfcHV0cyhzZXEsICIsaW50ZWdyaXR5Iik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19RVU9UQSkKKwlpZiAoc2JpLT5mbGFnICYgSkZTX1VTUlFVT1RBKQorCQlzZXFfcHV0cyhzZXEsICIsdXNycXVvdGEiKTsKKworCWlmIChzYmktPmZsYWcgJiBKRlNfR1JQUVVPVEEpCisJCXNlcV9wdXRzKHNlcSwgIixncnBxdW90YSIpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmc19zdXBlcl9vcGVyYXRpb25zID0gewogCS5hbGxvY19pbm9kZQk9IGpmc19hbGxvY19pbm9kZSwKIAkuZGVzdHJveV9pbm9kZQk9IGpmc19kZXN0cm95X2lub2RlLApAQCAtNTUyLDYgKzU5Myw3IEBACiAJLnVubG9ja2ZzICAgICAgID0gamZzX3VubG9ja2ZzLAogCS5zdGF0ZnMJCT0gamZzX3N0YXRmcywKIAkucmVtb3VudF9mcwk9IGpmc19yZW1vdW50LAorCS5zaG93X29wdGlvbnMJPSBqZnNfc2hvd19vcHRpb25zCiB9OwogCiBzdGF0aWMgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGpmc19leHBvcnRfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2pmcy94YXR0ci5jIGIvZnMvamZzL3hhdHRyLmMKaW5kZXggNTU0ZWM3My4uMjNhYTUwNiAxMDA2NDQKLS0tIGEvZnMvamZzL3hhdHRyLmMKKysrIGIvZnMvamZzL3hhdHRyLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCiAjaW5jbHVkZSAiamZzX3N1cGVyYmxvY2suaCIKICNpbmNsdWRlICJqZnNfZG1hcC5oIgpAQCAtNjMzLDEyICs2MzQsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgZWFfcHV0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBlYV9idWZmZXIgKmVhX2J1ZiwgaW50IG5ld19zaXplKQorc3RhdGljIGludCBlYV9wdXQodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZWFfYnVmZmVyICplYV9idWYsCisJCSAgaW50IG5ld19zaXplKQogewogCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaW5vZGUpOwogCXVuc2lnbmVkIGxvbmcgb2xkX2Jsb2NrcywgbmV3X2Jsb2NrczsKIAlpbnQgcmMgPSAwOwotCXRpZF90IHRpZDsKIAogCWlmIChuZXdfc2l6ZSA9PSAwKSB7CiAJCWVhX3JlbGVhc2UoaW5vZGUsIGVhX2J1Zik7CkBAIC02NjQsOSArNjY1LDYgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXRpZCA9IHR4QmVnaW4oaW5vZGUtPmlfc2IsIDApOwotCWRvd24oJmppLT5jb21taXRfc2VtKTsKLQogCW9sZF9ibG9ja3MgPSBuZXdfYmxvY2tzID0gMDsKIAogCWlmIChqaS0+ZWEuZmxhZyAmIERYRF9FWFRFTlQpIHsKQEAgLTY5NSwxMSArNjkzLDggQEAKIAkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgb2xkX2Jsb2Nrcyk7CiAKIAlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKLQlyYyA9IHR4Q29tbWl0KHRpZCwgMSwgJmlub2RlLCAwKTsKLQl0eEVuZCh0aWQpOwotCXVwKCZqaS0+Y29tbWl0X3NlbSk7CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC04MTAsOCArODA1LDggQEAKIAlyZXR1cm4gcGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKIH0KIAotaW50IF9famZzX3NldHhhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAotCQkgICBzaXplX3QgdmFsdWVfbGVuLCBpbnQgZmxhZ3MpCitpbnQgX19qZnNfc2V0eGF0dHIodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHZhbHVlX2xlbiwgaW50IGZsYWdzKQogewogCXN0cnVjdCBqZnNfZWFfbGlzdCAqZWFsaXN0OwogCXN0cnVjdCBqZnNfZWEgKmVhLCAqb2xkX2VhID0gTlVMTCwgKm5leHRfZWEgPSBOVUxMOwpAQCAtODI1LDkgKzgyMCw2IEBACiAJaW50IHJjOwogCWludCBsZW5ndGg7CiAKLQlpZiAoKHJjID0gY2FuX3NldF94YXR0cihpbm9kZSwgbmFtZSwgdmFsdWUsIHZhbHVlX2xlbikpKQotCQlyZXR1cm4gcmM7Ci0KIAlpZiAoc3RybmNtcChuYW1lLCBYQVRUUl9PUzJfUFJFRklYLCBYQVRUUl9PUzJfUFJFRklYX0xFTikgPT0gMCkgewogCQlvczJuYW1lID0ga21hbGxvYyhuYW1lbGVuIC0gWEFUVFJfT1MyX1BSRUZJWF9MRU4gKyAxLAogCQkJCSAgR0ZQX0tFUk5FTCk7CkBAIC05MzksNyArOTMxLDcgQEAKIAogCWVhbGlzdC0+c2l6ZSA9IGNwdV90b19sZTMyKG5ld19zaXplKTsKIAotCXJjID0gZWFfcHV0KGlub2RlLCAmZWFfYnVmLCBuZXdfc2l6ZSk7CisJcmMgPSBlYV9wdXQodGlkLCBpbm9kZSwgJmVhX2J1ZiwgbmV3X3NpemUpOwogCiAJZ290byBvdXQ7CiAgICAgICByZWxlYXNlOgpAQCAtOTU1LDEyICs5NDcsMjkgQEAKIGludCBqZnNfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKIAkJIHNpemVfdCB2YWx1ZV9sZW4sIGludCBmbGFncykKIHsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaW5vZGUpOworCWludCByYzsKKwl0aWRfdCB0aWQ7CisKKwlpZiAoKHJjID0gY2FuX3NldF94YXR0cihpbm9kZSwgbmFtZSwgdmFsdWUsIHZhbHVlX2xlbikpKQorCQlyZXR1cm4gcmM7CisKIAlpZiAodmFsdWUgPT0gTlVMTCkgewkvKiBlbXB0eSBFQSwgZG8gbm90IHJlbW92ZSAqLwogCQl2YWx1ZSA9ICIiOwogCQl2YWx1ZV9sZW4gPSAwOwogCX0KIAotCXJldHVybiBfX2pmc19zZXR4YXR0cihkZW50cnktPmRfaW5vZGUsIG5hbWUsIHZhbHVlLCB2YWx1ZV9sZW4sIGZsYWdzKTsKKwl0aWQgPSB0eEJlZ2luKGlub2RlLT5pX3NiLCAwKTsKKwlkb3duKCZqaS0+Y29tbWl0X3NlbSk7CisJcmMgPSBfX2pmc19zZXR4YXR0cih0aWQsIGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwgdmFsdWUsIHZhbHVlX2xlbiwKKwkJCSAgICBmbGFncyk7CisJaWYgKCFyYykKKwkJcmMgPSB0eENvbW1pdCh0aWQsIDEsICZpbm9kZSwgMCk7CisJdHhFbmQodGlkKTsKKwl1cCgmamktPmNvbW1pdF9zZW0pOworCisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IGNhbl9nZXRfeGF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKQEAgLTExMjIsNSArMTEzMSw1NiBAQAogCiBpbnQgamZzX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gX19qZnNfc2V0eGF0dHIoZGVudHJ5LT5kX2lub2RlLCBuYW1lLCBOVUxMLCAwLCBYQVRUUl9SRVBMQUNFKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaW5vZGUpOworCWludCByYzsKKwl0aWRfdCB0aWQ7CisKKwlpZiAoKHJjID0gY2FuX3NldF94YXR0cihpbm9kZSwgbmFtZSwgTlVMTCwgMCkpKQorCQlyZXR1cm4gcmM7CisKKwl0aWQgPSB0eEJlZ2luKGlub2RlLT5pX3NiLCAwKTsKKwlkb3duKCZqaS0+Y29tbWl0X3NlbSk7CisJcmMgPSBfX2pmc19zZXR4YXR0cih0aWQsIGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwgTlVMTCwgMCwgWEFUVFJfUkVQTEFDRSk7CisJaWYgKCFyYykKKwkJcmMgPSB0eENvbW1pdCh0aWQsIDEsICZpbm9kZSwgMCk7CisJdHhFbmQodGlkKTsKKwl1cCgmamktPmNvbW1pdF9zZW0pOworCisJcmV0dXJuIHJjOwogfQorCisjaWZkZWYgQ09ORklHX0pGU19TRUNVUklUWQoraW50IGpmc19pbml0X3NlY3VyaXR5KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJaW50IHJjOworCXNpemVfdCBsZW47CisJdm9pZCAqdmFsdWU7CisJY2hhciAqc3VmZml4OworCWNoYXIgKm5hbWU7CisKKwlyYyA9IHNlY3VyaXR5X2lub2RlX2luaXRfc2VjdXJpdHkoaW5vZGUsIGRpciwgJnN1ZmZpeCwgJnZhbHVlLCAmbGVuKTsKKwlpZiAocmMpIHsKKwkJaWYgKHJjID09IC1FT1BOT1RTVVBQKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiByYzsKKwl9CisJbmFtZSA9IGttYWxsb2MoWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTiArIDEgKyBzdHJsZW4oc3VmZml4KSwKKwkJICAgICAgIEdGUF9OT0ZTKTsKKwlpZiAoIW5hbWUpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGttYWxsb2NfZmFpbGVkOworCX0KKwlzdHJjcHkobmFtZSwgWEFUVFJfU0VDVVJJVFlfUFJFRklYKTsKKwlzdHJjcHkobmFtZSArIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWF9MRU4sIHN1ZmZpeCk7CisKKwlyYyA9IF9famZzX3NldHhhdHRyKHRpZCwgaW5vZGUsIG5hbWUsIHZhbHVlLCBsZW4sIDApOworCisJa2ZyZWUobmFtZSk7CitrbWFsbG9jX2ZhaWxlZDoKKwlrZnJlZShzdWZmaXgpOworCWtmcmVlKHZhbHVlKTsKKworCXJldHVybiByYzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudHByb2MuYyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKaW5kZXggMTRiM2NlOC4uODczMzJmMyAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvY2xudHByb2MuYworKysgYi9mcy9sb2NrZC9jbG50cHJvYy5jCkBAIC0yOTksOCArMjk5LDcgQEAKIAkJCXJldHVybiBjYWxsOwogCQl9CiAJCXByaW50aygibmxtY2xudF9hbGxvY19jYWxsOiBmYWlsZWQsIHdhaXRpbmcgZm9yIG1lbW9yeVxuIik7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZV90aW1lb3V0KDUqSFopOworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoNSpIWik7CiAJfQogCXJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvZnMvbG9ja3MuYyBiL2ZzL2xvY2tzLmMKaW5kZXggMTE5NTZiNi4uYzJjMDliNCAxMDA2NDQKLS0tIGEvZnMvbG9ja3MuYworKysgYi9mcy9sb2Nrcy5jCkBAIC0yMTk4LDIxICsyMTk4LDIzIEBACiB7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKIAlpbnQgaSwgajsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCiAJaWYgKGZyb20gPT0gZmlsZXMpCiAJCXJldHVybjsKIAogCWxvY2tfa2VybmVsKCk7CiAJaiA9IDA7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CiAJZm9yICg7OykgewogCQl1bnNpZ25lZCBsb25nIHNldDsKIAkJaSA9IGogKiBfX05GREJJVFM7Ci0JCWlmIChpID49IGZpbGVzLT5tYXhfZmRzZXQgfHwgaSA+PSBmaWxlcy0+bWF4X2ZkcykKKwkJaWYgKGkgPj0gZmR0LT5tYXhfZmRzZXQgfHwgaSA+PSBmZHQtPm1heF9mZHMpCiAJCQlicmVhazsKLQkJc2V0ID0gZmlsZXMtPm9wZW5fZmRzLT5mZHNfYml0c1tqKytdOworCQlzZXQgPSBmZHQtPm9wZW5fZmRzLT5mZHNfYml0c1tqKytdOwogCQl3aGlsZSAoc2V0KSB7CiAJCQlpZiAoc2V0ICYgMSkgewotCQkJCXN0cnVjdCBmaWxlICpmaWxlID0gZmlsZXMtPmZkW2ldOworCQkJCXN0cnVjdCBmaWxlICpmaWxlID0gZmR0LT5mZFtpXTsKIAkJCQlpZiAoZmlsZSkKIAkJCQkJX19zdGVhbF9sb2NrcyhmaWxlLCBmcm9tKTsKIAkJCX0KZGlmZiAtLWdpdCBhL2ZzL21pbml4L2lub2RlLmMgYi9mcy9taW5peC9pbm9kZS5jCmluZGV4IDNmMThjMjEuLjc5MGNjMGQgMTAwNjQ0Ci0tLSBhL2ZzL21pbml4L2lub2RlLmMKKysrIGIvZnMvbWluaXgvaW5vZGUuYwpAQCAtMjQsNiArMjQsNyBAQAogCiBzdGF0aWMgdm9pZCBtaW5peF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAJaW5vZGUtPmlfc2l6ZSA9IDA7CiAJbWluaXhfdHJ1bmNhdGUoaW5vZGUpOwogCW1pbml4X2ZyZWVfaW5vZGUoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvbmFtZWkuYyBiL2ZzL25hbWVpLmMKaW5kZXggNmVjMWYwZi4uMjFkODVmMSAxMDA2NDQKLS0tIGEvZnMvbmFtZWkuYworKysgYi9mcy9uYW1laS5jCkBAIC01MjUsNiArNTI1LDIyIEBACiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZHB1dF9wYXRoKHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlkcHV0KHBhdGgtPmRlbnRyeSk7CisJaWYgKHBhdGgtPm1udCAhPSBuZC0+bW50KQorCQltbnRwdXQocGF0aC0+bW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBhdGhfdG9fbmFtZWlkYXRhKHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlkcHV0KG5kLT5kZW50cnkpOworCWlmIChuZC0+bW50ICE9IHBhdGgtPm1udCkKKwkJbW50cHV0KG5kLT5tbnQpOworCW5kLT5tbnQgPSBwYXRoLT5tbnQ7CisJbmQtPmRlbnRyeSA9IHBhdGgtPmRlbnRyeTsKK30KKwogLyoKICAqIFRoaXMgbGltaXRzIHJlY3Vyc2l2ZSBzeW1saW5rIGZvbGxvd3MgdG8gOCwgd2hpbGUKICAqIGxpbWl0aW5nIGNvbnNlY3V0aXZlIHN5bWxpbmtzIHRvIDQwLgpAQCAtNTUyLDkgKzU2OCw3IEBACiAJbmQtPmRlcHRoLS07CiAJcmV0dXJuIGVycjsKIGxvb3A6Ci0JZHB1dChwYXRoLT5kZW50cnkpOwotCWlmIChwYXRoLT5tbnQgIT0gbmQtPm1udCkKLQkJbW50cHV0KHBhdGgtPm1udCk7CisJZHB1dF9wYXRoKHBhdGgsIG5kKTsKIAlwYXRoX3JlbGVhc2UobmQpOwogCXJldHVybiBlcnI7CiB9CkBAIC04MTMsMTMgKzgyNyw4IEBACiAJCQllcnIgPSAtRU5PVERJUjsgCiAJCQlpZiAoIWlub2RlLT5pX29wKQogCQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJZHB1dChuZC0+ZGVudHJ5KTsKLQkJCWlmIChuZC0+bW50ICE9IG5leHQubW50KQotCQkJCW1udHB1dChuZC0+bW50KTsKLQkJCW5kLT5tbnQgPSBuZXh0Lm1udDsKLQkJCW5kLT5kZW50cnkgPSBuZXh0LmRlbnRyeTsKLQkJfQorCQl9IGVsc2UKKwkJCXBhdGhfdG9fbmFtZWlkYXRhKCZuZXh0LCBuZCk7CiAJCWVyciA9IC1FTk9URElSOyAKIAkJaWYgKCFpbm9kZS0+aV9vcC0+bG9va3VwKQogCQkJYnJlYWs7CkBAIC04NTksMTMgKzg2OCw4IEBACiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gcmV0dXJuX2VycjsKIAkJCWlub2RlID0gbmQtPmRlbnRyeS0+ZF9pbm9kZTsKLQkJfSBlbHNlIHsKLQkJCWRwdXQobmQtPmRlbnRyeSk7Ci0JCQlpZiAobmQtPm1udCAhPSBuZXh0Lm1udCkKLQkJCQltbnRwdXQobmQtPm1udCk7Ci0JCQluZC0+bW50ID0gbmV4dC5tbnQ7Ci0JCQluZC0+ZGVudHJ5ID0gbmV4dC5kZW50cnk7Ci0JCX0KKwkJfSBlbHNlCisJCQlwYXRoX3RvX25hbWVpZGF0YSgmbmV4dCwgbmQpOwogCQllcnIgPSAtRU5PRU5UOwogCQlpZiAoIWlub2RlKQogCQkJYnJlYWs7CkBAIC05MDEsOSArOTA1LDcgQEAKIHJldHVybl9iYXNlOgogCQlyZXR1cm4gMDsKIG91dF9kcHV0OgotCQlkcHV0KG5leHQuZGVudHJ5KTsKLQkJaWYgKG5kLT5tbnQgIT0gbmV4dC5tbnQpCi0JCQltbnRwdXQobmV4dC5tbnQpOworCQlkcHV0X3BhdGgoJm5leHQsIG5kKTsKIAkJYnJlYWs7CiAJfQogCXBhdGhfcmVsZWFzZShuZCk7CkBAIC0xMzE0LDEwICsxMzE2LDggQEAKIAkJcmV0dXJuIGVycm9yOwogCURRVU9UX0lOSVQoZGlyKTsKIAllcnJvciA9IGRpci0+aV9vcC0+Y3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlLCBuZCk7Ci0JaWYgKCFlcnJvcikgeworCWlmICghZXJyb3IpCiAJCWZzbm90aWZ5X2NyZWF0ZShkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCQlzZWN1cml0eV9pbm9kZV9wb3N0X2NyZWF0ZShkaXIsIGRlbnRyeSwgbW9kZSk7Ci0JfQogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTUwNywxMSArMTUwNyw3IEBACiAJaWYgKHBhdGguZGVudHJ5LT5kX2lub2RlLT5pX29wICYmIHBhdGguZGVudHJ5LT5kX2lub2RlLT5pX29wLT5mb2xsb3dfbGluaykKIAkJZ290byBkb19saW5rOwogCi0JZHB1dChuZC0+ZGVudHJ5KTsKLQluZC0+ZGVudHJ5ID0gcGF0aC5kZW50cnk7Ci0JaWYgKG5kLT5tbnQgIT0gcGF0aC5tbnQpCi0JCW1udHB1dChuZC0+bW50KTsKLQluZC0+bW50ID0gcGF0aC5tbnQ7CisJcGF0aF90b19uYW1laWRhdGEoJnBhdGgsIG5kKTsKIAllcnJvciA9IC1FSVNESVI7CiAJaWYgKHBhdGguZGVudHJ5LT5kX2lub2RlICYmIFNfSVNESVIocGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCiAJCWdvdG8gZXhpdDsKQEAgLTE1MjIsOSArMTUxOCw3IEBACiAJcmV0dXJuIDA7CiAKIGV4aXRfZHB1dDoKLQlkcHV0KHBhdGguZGVudHJ5KTsKLQlpZiAobmQtPm1udCAhPSBwYXRoLm1udCkKLQkJbW50cHV0KHBhdGgubW50KTsKKwlkcHV0X3BhdGgoJnBhdGgsIG5kKTsKIGV4aXQ6CiAJcGF0aF9yZWxlYXNlKG5kKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC0xNjM5LDEwICsxNjMzLDggQEAKIAogCURRVU9UX0lOSVQoZGlyKTsKIAllcnJvciA9IGRpci0+aV9vcC0+bWtub2QoZGlyLCBkZW50cnksIG1vZGUsIGRldik7Ci0JaWYgKCFlcnJvcikgeworCWlmICghZXJyb3IpCiAJCWZzbm90aWZ5X2NyZWF0ZShkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCQlzZWN1cml0eV9pbm9kZV9wb3N0X21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOwotCX0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE3MTIsMTAgKzE3MDQsOCBAQAogCiAJRFFVT1RfSU5JVChkaXIpOwogCWVycm9yID0gZGlyLT5pX29wLT5ta2RpcihkaXIsIGRlbnRyeSwgbW9kZSk7Ci0JaWYgKCFlcnJvcikgeworCWlmICghZXJyb3IpCiAJCWZzbm90aWZ5X21rZGlyKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0JCXNlY3VyaXR5X2lub2RlX3Bvc3RfbWtkaXIoZGlyLGRlbnRyeSwgbW9kZSk7Ci0JfQogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTk1MSwxMCArMTk0MSw4IEBACiAKIAlEUVVPVF9JTklUKGRpcik7CiAJZXJyb3IgPSBkaXItPmlfb3AtPnN5bWxpbmsoZGlyLCBkZW50cnksIG9sZG5hbWUpOwotCWlmICghZXJyb3IpIHsKKwlpZiAoIWVycm9yKQogCQlmc25vdGlmeV9jcmVhdGUoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKLQkJc2VjdXJpdHlfaW5vZGVfcG9zdF9zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKLQl9CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0yMDI0LDEwICsyMDEyLDggQEAKIAlEUVVPVF9JTklUKGRpcik7CiAJZXJyb3IgPSBkaXItPmlfb3AtPmxpbmsob2xkX2RlbnRyeSwgZGlyLCBuZXdfZGVudHJ5KTsKIAl1cCgmb2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOwotCWlmICghZXJyb3IpIHsKKwlpZiAoIWVycm9yKQogCQlmc25vdGlmeV9jcmVhdGUoZGlyLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0JCXNlY3VyaXR5X2lub2RlX3Bvc3RfbGluayhvbGRfZGVudHJ5LCBkaXIsIG5ld19kZW50cnkpOwotCX0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTIxNDYsMTEgKzIxMzIsOCBAQAogCQkJZF9yZWhhc2gobmV3X2RlbnRyeSk7CiAJCWRwdXQobmV3X2RlbnRyeSk7CiAJfQotCWlmICghZXJyb3IpIHsKKwlpZiAoIWVycm9yKQogCQlkX21vdmUob2xkX2RlbnRyeSxuZXdfZGVudHJ5KTsKLQkJc2VjdXJpdHlfaW5vZGVfcG9zdF9yZW5hbWUob2xkX2Rpciwgb2xkX2RlbnRyeSwKLQkJCQkJICAgbmV3X2RpciwgbmV3X2RlbnRyeSk7Ci0JfQogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjE3Niw3ICsyMTU5LDYgQEAKIAkJLyogVGhlIGZvbGxvd2luZyBkX21vdmUoKSBzaG91bGQgYmVjb21lIHVuY29uZGl0aW9uYWwgKi8KIAkJaWYgKCEob2xkX2Rpci0+aV9zYi0+c190eXBlLT5mc19mbGFncyAmIEZTX09ERF9SRU5BTUUpKQogCQkJZF9tb3ZlKG9sZF9kZW50cnksIG5ld19kZW50cnkpOwotCQlzZWN1cml0eV9pbm9kZV9wb3N0X3JlbmFtZShvbGRfZGlyLCBvbGRfZGVudHJ5LCBuZXdfZGlyLCBuZXdfZGVudHJ5KTsKIAl9CiAJaWYgKHRhcmdldCkKIAkJdXAoJnRhcmdldC0+aV9zZW0pOwpkaWZmIC0tZ2l0IGEvZnMvbmFtZXNwYWNlLmMgYi9mcy9uYW1lc3BhY2UuYwppbmRleCA3OWJkOGE0Li4yZmE5ZmRmIDEwMDY0NAotLS0gYS9mcy9uYW1lc3BhY2UuYworKysgYi9mcy9uYW1lc3BhY2UuYwpAQCAtNDAsNyArNDAsNyBAQAogIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wIERFRklORV9TUElOTE9DSyh2ZnNtb3VudF9sb2NrKTsKIAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50X2hhc2h0YWJsZTsKLXN0YXRpYyBpbnQgaGFzaF9tYXNrLCBoYXNoX2JpdHM7CitzdGF0aWMgaW50IGhhc2hfbWFzayBfX3JlYWRfbW9zdGx5LCBoYXNoX2JpdHMgX19yZWFkX21vc3RseTsKIHN0YXRpYyBrbWVtX2NhY2hlX3QgKm1udF9jYWNoZTsgCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoYXNoKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCkBAIC01MzcsNyArNTM3LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmNvcHlfdHJlZShzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCB2ZnNtb3VudCAqcmVzLCAqcCwgKnEsICpyLCAqczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoOwogCXN0cnVjdCBuYW1laWRhdGEgbmQ7CiAKIAlyZXMgPSBxID0gY2xvbmVfbW50KG1udCwgZGVudHJ5KTsKQEAgLTU0Niw4ICs1NDUsNyBAQAogCXEtPm1udF9tb3VudHBvaW50ID0gbW50LT5tbnRfbW91bnRwb2ludDsKIAogCXAgPSBtbnQ7Ci0JZm9yIChoID0gbW50LT5tbnRfbW91bnRzLm5leHQ7IGggIT0gJm1udC0+bW50X21vdW50czsgaCA9IGgtPm5leHQpIHsKLQkJciA9IGxpc3RfZW50cnkoaCwgc3RydWN0IHZmc21vdW50LCBtbnRfY2hpbGQpOworCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJm1udC0+bW50X21vdW50cywgbW50X2NoaWxkKSB7CiAJCWlmICghbGl2ZXNfYmVsb3dfaW5fc2FtZV9mcyhyLT5tbnRfbW91bnRwb2ludCwgZGVudHJ5KSkKIAkJCWNvbnRpbnVlOwogCkBAIC0xMzM0LDggKzEzMzIsMTIgQEAKIAllcnJvciA9IC1FSU5WQUw7CiAJaWYgKHVzZXJfbmQubW50LT5tbnRfcm9vdCAhPSB1c2VyX25kLmRlbnRyeSkKIAkJZ290byBvdXQyOyAvKiBub3QgYSBtb3VudHBvaW50ICovCisJaWYgKHVzZXJfbmQubW50LT5tbnRfcGFyZW50ID09IHVzZXJfbmQubW50KQorCQlnb3RvIG91dDI7IC8qIG5vdCBhdHRhY2hlZCAqLwogCWlmIChuZXdfbmQubW50LT5tbnRfcm9vdCAhPSBuZXdfbmQuZGVudHJ5KQogCQlnb3RvIG91dDI7IC8qIG5vdCBhIG1vdW50cG9pbnQgKi8KKwlpZiAobmV3X25kLm1udC0+bW50X3BhcmVudCA9PSBuZXdfbmQubW50KQorCQlnb3RvIG91dDI7IC8qIG5vdCBhdHRhY2hlZCAqLwogCXRtcCA9IG9sZF9uZC5tbnQ7IC8qIG1ha2Ugc3VyZSB3ZSBjYW4gcmVhY2ggcHV0X29sZCBmcm9tIG5ld19yb290ICovCiAJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAlpZiAodG1wICE9IG5ld19uZC5tbnQpIHsKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2lub2RlLmMgYi9mcy9uY3Bmcy9pbm9kZS5jCmluZGV4IDQ0Nzk1ZDIuLjhjODgzOTIgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL2lub2RlLmMKKysrIGIvZnMvbmNwZnMvaW5vZGUuYwpAQCAtMjg2LDYgKzI4Niw4IEBACiBzdGF0aWMgdm9pZAogbmNwX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKwogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCUREUFJJTlRLKCJuY3BfZGVsZXRlX2lub2RlOiBwdXQgZGlyZWN0b3J5ICVsZFxuIiwgaW5vZGUtPmlfaW5vKTsKIAl9CmRpZmYgLS1naXQgYS9mcy9uZnMvaW5vZGUuYyBiL2ZzL25mcy9pbm9kZS5jCmluZGV4IDU0MWI0MTguLjY5MjI0NjkgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pbm9kZS5jCisrKyBiL2ZzL25mcy9pbm9kZS5jCkBAIC0xNDYsNiArMTQ2LDggQEAKIHsKIAlkcHJpbnRrKCJORlM6IGRlbGV0ZV9pbm9kZSglcy8lbGQpXG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKIAorCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKwogCW5mc193Yl9hbGwoaW5vZGUpOwogCS8qCiAJICogVGhlIGZvbGxvd2luZyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzM3Byb2MuYyBiL2ZzL25mcy9uZnMzcHJvYy5jCmluZGV4IDI2ODE0ODUuLmVkYzk1NTEgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMzcHJvYy5jCisrKyBiL2ZzL25mcy9uZnMzcHJvYy5jCkBAIC0zNCw4ICszNCw3IEBACiAJCXJlcyA9IHJwY19jYWxsX3N5bmMoY2xudCwgbXNnLCBmbGFncyk7CiAJCWlmIChyZXMgIT0gLUVKVUtFQk9YKQogCQkJYnJlYWs7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoTkZTX0pVS0VCT1hfUkVUUllfVElNRSk7CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShORlNfSlVLRUJPWF9SRVRSWV9USU1FKTsKIAkJcmVzID0gLUVSRVNUQVJUU1lTOwogCX0gd2hpbGUgKCFzaWduYWxsZWQoKSk7CiAJcnBjX2NsbnRfc2lndW5tYXNrKGNsbnQsICZvbGRzZXQpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRwcm9jLmMgYi9mcy9uZnMvbmZzNHByb2MuYwppbmRleCAwYzVhMzA4Li45NzAxY2E4IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHByb2MuYworKysgYi9mcy9uZnMvbmZzNHByb2MuYwpAQCAtMjQxOCwxNCArMjQxOCwxMSBAQAogCQkqdGltZW91dCA9IE5GUzRfUE9MTF9SRVRSWV9NQVg7CiAJcnBjX2NsbnRfc2lnbWFzayhjbG50LCAmb2xkc2V0KTsKIAlpZiAoY2xudC0+Y2xfaW50cikgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KCp0aW1lb3V0KTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKCp0aW1lb3V0KTsKIAkJaWYgKHNpZ25hbGxlZCgpKQogCQkJcmVzID0gLUVSRVNUQVJUU1lTOwotCX0gZWxzZSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgqdGltZW91dCk7Ci0JfQorCX0gZWxzZQorCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgqdGltZW91dCk7CiAJcnBjX2NsbnRfc2lndW5tYXNrKGNsbnQsICZvbGRzZXQpOwogCSp0aW1lb3V0IDw8PSAxOwogCXJldHVybiByZXM7CkBAIC0yNTc4LDggKzI1NzUsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcKIG5mczRfc2V0X2xvY2tfdGFza19yZXRyeSh1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0Jc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7CiAJdGltZW91dCA8PD0gMTsKIAlpZiAodGltZW91dCA+IE5GUzRfTE9DS19NQVhUSU1FT1VUKQogCQlyZXR1cm4gTkZTNF9MT0NLX01BWFRJTUVPVVQ7CmRpZmYgLS1naXQgYS9mcy9uZnNkL2V4cG9ydC5jIGIvZnMvbmZzZC9leHBvcnQuYwppbmRleCA5YTExYWEzLi4wNTdhZmY3IDEwMDY0NAotLS0gYS9mcy9uZnNkL2V4cG9ydC5jCisrKyBiL2ZzL25mc2QvZXhwb3J0LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgpAQCAtMjIxLDYgKzIyMiw3IEBACiB9CiAJCiBzdHJ1Y3QgY2FjaGVfZGV0YWlsIHN2Y19leHBrZXlfY2FjaGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5oYXNoX3NpemUJPSBFWFBLRVlfSEFTSE1BWCwKIAkuaGFzaF90YWJsZQk9IGV4cGtleV90YWJsZSwKIAkubmFtZQkJPSAibmZzZC5maCIsCkBAIC00NTYsNiArNDU4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIHN0cnVjdCBjYWNoZV9kZXRhaWwgc3ZjX2V4cG9ydF9jYWNoZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmhhc2hfc2l6ZQk9IEVYUE9SVF9IQVNITUFYLAogCS5oYXNoX3RhYmxlCT0gZXhwb3J0X3RhYmxlLAogCS5uYW1lCQk9ICJuZnNkLmV4cG9ydCIsCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRpZG1hcC5jIGIvZnMvbmZzZC9uZnM0aWRtYXAuYwppbmRleCA1NjA1YTI2Li4xMzM2OTY1IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRpZG1hcC5jCisrKyBiL2ZzL25mc2QvbmZzNGlkbWFwLmMKQEAgLTE4Nyw2ICsxODcsNyBAQAogc3RhdGljIHN0cnVjdCBlbnQgKmlkdG9uYW1lX2xvb2t1cChzdHJ1Y3QgZW50ICosIGludCk7CiAKIHN0YXRpYyBzdHJ1Y3QgY2FjaGVfZGV0YWlsIGlkdG9uYW1lX2NhY2hlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuaGFzaF9zaXplCT0gRU5UX0hBU0hNQVgsCiAJLmhhc2hfdGFibGUJPSBpZHRvbmFtZV90YWJsZSwKIAkubmFtZQkJPSAibmZzNC5pZHRvbmFtZSIsCkBAIC0zMjAsNiArMzIxLDcgQEAKIHN0YXRpYyBpbnQgICAgICAgICBuYW1ldG9pZF9wYXJzZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICosIGNoYXIgKiwgaW50KTsKIAogc3RhdGljIHN0cnVjdCBjYWNoZV9kZXRhaWwgbmFtZXRvaWRfY2FjaGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5oYXNoX3NpemUJPSBFTlRfSEFTSE1BWCwKIAkuaGFzaF90YWJsZQk9IG5hbWV0b2lkX3RhYmxlLAogCS5uYW1lCQk9ICJuZnM0Lm5hbWV0b2lkIiwKQEAgLTQwNCw4ICs0MDYsMTAgQEAKIHZvaWQKIG5mc2RfaWRtYXBfc2h1dGRvd24odm9pZCkKIHsKLQljYWNoZV91bnJlZ2lzdGVyKCZpZHRvbmFtZV9jYWNoZSk7Ci0JY2FjaGVfdW5yZWdpc3RlcigmbmFtZXRvaWRfY2FjaGUpOworCWlmIChjYWNoZV91bnJlZ2lzdGVyKCZpZHRvbmFtZV9jYWNoZSkpCisJCXByaW50ayhLRVJOX0VSUiAibmZzZDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgaWR0b25hbWUgY2FjaGVcbiIpOworCWlmIChjYWNoZV91bnJlZ2lzdGVyKCZuYW1ldG9pZF9jYWNoZSkpCisJCXByaW50ayhLRVJOX0VSUiAibmZzZDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgbmFtZXRvaWQgY2FjaGVcbiIpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0cmVjb3Zlci5jIGIvZnMvbmZzZC9uZnM0cmVjb3Zlci5jCmluZGV4IDU3ZWQ1MGYuLjk1NGNmODkgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHJlY292ZXIuYworKysgYi9mcy9uZnNkL25mczRyZWNvdmVyLmMKQEAgLTkzLDcgKzkzLDcgQEAKIAogCWRwcmludGsoIk5GU0Q6IG5mczRfbWFrZV9yZWNfY2xpZG5hbWUgZm9yICUuKnNcbiIsCiAJCQljbG5hbWUtPmxlbiwgY2xuYW1lLT5kYXRhKTsKLQl0Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKCJtZDUiLCAwKTsKKwl0Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKCJtZDUiLCBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVApOwogCWlmICh0Zm0gPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAJY2tzdW0ubGVuID0gY3J5cHRvX3RmbV9hbGdfZGlnZXN0c2l6ZSh0Zm0pOwpAQCAtMTE0LDggKzExNCw3IEBACiAJa2ZyZWUoY2tzdW0uZGF0YSk7CiAJc3RhdHVzID0gbmZzX29rOwogb3V0OgotCWlmICh0Zm0pCi0JCWNyeXB0b19mcmVlX3RmbSh0Zm0pOworCWNyeXB0b19mcmVlX3RmbSh0Zm0pOwogCXJldHVybiBzdGF0dXM7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL250ZnMvQ2hhbmdlTG9nIGIvZnMvbnRmcy9DaGFuZ2VMb2cKaW5kZXggOWVlY2M5OS4uZTRmZDYxMyAxMDA2NDQKLS0tIGEvZnMvbnRmcy9DaGFuZ2VMb2cKKysrIGIvZnMvbnRmcy9DaGFuZ2VMb2cKQEAgLTIyLDYgKzIyLDc2IEBACiAJLSBFbmFibGUgdGhlIGNvZGUgZm9yIHNldHRpbmcgdGhlIE5UNCBjb21wYXRpYmlsaXR5IGZsYWcgd2hlbiB3ZSBzdGFydAogCSAgbWFraW5nIE5URlMgMS4yIHNwZWNpZmljIG1vZGlmaWNhdGlvbnMuCiAKKzIuMS4yNCAtIExvdHMgb2YgYnVnIGZpeGVzIGFuZCBzdXBwb3J0IG1vcmUgY2xlYW4gam91cm5hbCBzdGF0ZXMuCisKKwktIFN1cHBvcnQgam91cm5hbHMgKCRMb2dGaWxlKSB3aGljaCBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgY2hrZHNrLiAgVGhpcworCSAgbWVhbnMgdXNlcnMgY2FuIGJvb3QgaW50byBXaW5kb3dzIGFmdGVyIHdlIG1hcmtlZCB0aGUgdm9sdW1lIGRpcnR5LgorCSAgVGhlIFdpbmRvd3MgYm9vdCB3aWxsIHJ1biBjaGtkc2sgYW5kIHRoZW4gcmVib290LiAgVGhlIHVzZXIgY2FuIHRoZW4KKwkgIGltbWVkaWF0ZWx5IGJvb3QgaW50byBMaW51eCByYXRoZXIgdGhhbiBoYXZpbmcgdG8gZG8gYSBmdWxsIFdpbmRvd3MKKwkgIGJvb3QgZmlyc3QgYmVmb3JlIHJlYm9vdGluZyBpbnRvIExpbnV4IGFuZCB3ZSB3aWxsIHJlY29nbml6ZSBzdWNoIGEKKwkgIGpvdXJuYWwgYW5kIGVtcHR5IGl0IGFzIGl0IGlzIGNsZWFuIGJ5IGRlZmluaXRpb24uCisJLSBTdXBwb3J0IGpvdXJuYWxzICgkTG9nRmlsZSkgd2l0aCBvbmx5IG9uZSByZXN0YXJ0IHBhZ2UgYXMgd2VsbCBhcworCSAgam91cm5hbHMgd2l0aCB0d28gZGlmZmVyZW50IHJlc3RhcnQgcGFnZXMuICBXZSBzYW5pdHkgY2hlY2sgYm90aCBhbmQKKwkgIGVpdGhlciB1c2UgdGhlIG9ubHkgc2FuZSBvbmUgb3IgdGhlIG1vcmUgcmVjZW50IG9uZSBvZiB0aGUgdHdvIGluIHRoZQorCSAgY2FzZSB0aGF0IGJvdGggYXJlIHZhbGlkLgorCS0gTW9kaWZ5IGZzL250ZnMvbWFsbG9jLmg6Om50ZnNfbWFsbG9jX25vZnMoKSB0byBkbyB0aGUga21hbGxvYygpIGJhc2VkCisJICBhbGxvY2F0aW9ucyB3aXRoIF9fR0ZQX0hJR0hNRU0sIGFuYWxvZ291cyB0byBob3cgdGhlIHZtYWxsb2MoKSBiYXNlZAorCSAgYWxsb2NhdGlvbnMgYXJlIGRvbmUuCisJLSBBZGQgZnMvbnRmcy9tYWxsb2MuaDo6bnRmc19tYWxsb2Nfbm9mc19ub2ZhaWwoKSB3aGljaCBpcyBhbmFsb2dvdXMgdG8KKwkgIG50ZnNfbWFsbG9jX25vZnMoKSBidXQgaXQgcGVyZm9ybXMgYWxsb2NhdGlvbnMgd2l0aCBfX0dGUF9OT0ZBSUwgYW5kCisJICBoZW5jZSBjYW5ub3QgZmFpbC4KKwktIFVzZSBudGZzX21hbGxvY19ub2ZzX25vZmFpbCgpIGluIHRoZSB0d28gY3JpdGljYWwgcmVnaW9ucyBpbgorCSAgZnMvbnRmcy9ydW5saXN0LmM6Om50ZnNfcnVubGlzdHNfbWVyZ2UoKS4gIFRoaXMgbWVhbnMgd2Ugbm8gbG9uZ2VyCisJICBuZWVkIHRvIHBhbmljKCkgaWYgdGhlIGFsbG9jYXRpb24gZmFpbHMgYXMgaXQgbm93IGNhbm5vdCBmYWlsLgorCS0gRml4IHR3byBuYXN0eSBydW5saXN0IG1lcmdpbmcgYnVncyB0aGF0IGhhZCBnb25lIHVubm90aWNlZCBzbyBmYXIuCisJICBUaGFua3MgdG8gU3RlZmFubyBQaWNlcm5vIGZvciB0aGUgYnVnIHJlcG9ydC4KKwktIFJlbW92ZSB0d28gYm9ndXMgQlVHX09OKClzIGZyb20gZnMvbnRmcy9tZnQuYy4KKwktIEZpeCBoYW5kbGluZyBvZiB2YWxpZCBidXQgZW1wdHkgbWFwcGluZyBwYWlycyBhcnJheSBpbgorCSAgZnMvbnRmcy9ydW5saXN0LmM6Om50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKCkuCisJLSBSZXBvcnQgdW5yZXByZXNlbnRhYmxlIGlub2RlcyBkdXJpbmcgbnRmc19yZWFkZGlyKCkgYXMgS0VSTl9XQVJOSU5HCisJICBtZXNzYWdlcyBhbmQgaW5jbHVkZSB0aGUgaW5vZGUgbnVtYmVyLiAgVGhhbmtzIHRvIFl1cmEgUGFraHVjaGl5IGZvcgorCSAgcG9pbnRpbmcgdGhpcyBvdXQuCisJLSBDaGFuZ2UgbnRmc19ybF90cnVuY2F0ZV9ub2xvY2soKSB0byB0aHJvdyBhd2F5IHRoZSBydW5saXN0IGlmIHRoZSBuZXcKKwkgIGxlbmd0aCBpcyB6ZXJvLgorCS0gQWRkIHJ1bmxpc3QuW2hjXTo6bnRmc19ybF9wdW5jaF9ub2xvY2soKSB3aGljaCBwdW5jaGVzIGEgY2FsbGVyCisJICBzcGVjaWZpZWQgaG9sZSBpbnRvIGEgcnVubGlzdC4KKwktIEZpeCBhIGJ1ZyBpbiBmcy9udGZzL2luZGV4LmM6Om50ZnNfaW5kZXhfbG9va3VwKCkuICBXaGVuIHRoZSByZXR1cm5lZAorCSAgaW5kZXggZW50cnkgaXMgaW4gdGhlIGluZGV4IHJvb3QsIHdlIGZvcmdvdCB0byBzZXQgdGhlIEBpciBwb2ludGVyIGluCisJICB0aGUgaW5kZXggY29udGV4dC4gIFRoYW5rcyB0byBZdXJhIFBha2h1Y2hpeSBmb3IgZmluZGluZyB0aGlzIGJ1Zy4KKwktIFJlbW92ZSBib2d1cyBzZXR0aW5nIG9mIFBhZ2VFcnJvciBpbiBudGZzX3JlYWRfY29tcHJlc3NlZF9ibG9jaygpLgorCS0gQWRkIGZzL250ZnMvYXR0cmliLltoY106Om50ZnNfcmVzaWRlbnRfYXR0cl92YWx1ZV9yZXNpemUoKS4KKwktIEZpeCBhIGJ1ZyBpbiBudGZzX21hcF9ydW5saXN0X25vbG9jaygpIHdoZXJlIHdlIGZvcmdvdCB0byBwcm90ZWN0CisJICBhY2Nlc3MgdG8gdGhlIGFsbG9jYXRlZCBzaXplIGluIHRoZSBudGZzIGlub2RlIHdpdGggdGhlIHNpemUgbG9jay4KKwktIEZpeCBudGZzX2F0dHJfdmNuX3RvX2xjbl9ub2xvY2soKSBhbmQgbnRmc19hdHRyX2ZpbmRfdmNuX25vbG9jaygpIHRvCisJICByZXR1cm4gTENOX0VOT0VOVCB3aGVuIHRoZXJlIGlzIG5vIHJ1bmxpc3QgYW5kIHRoZSBhbGxvY2F0ZWQgc2l6ZSBpcworCSAgemVyby4KKwktIEZpeCBsb2FkX2F0dHJpYnV0ZV9saXN0KCkgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIGEgTlVMTCBydW5saXN0LgorCS0gRml4IGhhbmRsaW5nIG9mIHNwYXJzZSBhdHRyaWJ1dGVzIGluIG50ZnNfYXR0cl9tYWtlX25vbl9yZXNpZGVudCgpLgorCS0gQWRkIEJVRygpIGNoZWNrcyB0byBudGZzX2F0dHJfbWFrZV9ub25fcmVzaWRlbnQoKSBhbmQgbnRmc19hdHRyX3NldCgpCisJICB0byBlbnN1cmUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIG5ldmVyIGNhbGxlZCBmb3IgY29tcHJlc3NlZCBvcgorCSAgZW5jcnlwdGVkIGF0dHJpYnV0ZXMuCisJLSBGaXggY2x1c3RlciAoZGUpYWxsb2NhdG9ycyB0byB3b3JrIHdoZW4gdGhlIHJ1bmxpc3QgaXMgTlVMTCBhbmQgbW9yZQorCSAgaW1wb3J0YW50bHkgdG8gdGFrZSBhIGxvY2tlZCBydW5saXN0IHJhdGhlciB0aGFuIHRoZW0gbG9ja2luZyBpdAorCSAgd2hpY2ggbGVhZHMgdG8gbG9jayByZXZlcnNhbC4KKwktIFRydW5jYXRlIHthLGMsbX10aW1lIHRvIHRoZSBudGZzIHN1cHBvcnRlZCB0aW1lIGdyYW51bGFyaXR5IHdoZW4KKwkgIHVwZGF0aW5nIHRoZSB0aW1lcyBpbiB0aGUgaW5vZGUgaW4gbnRmc19zZXRhdHRyKCkuCisJLSBGaXh1cCBoYW5kbGluZyBvZiBzcGFyc2UsIGNvbXByZXNzZWQsIGFuZCBlbmNyeXB0ZWQgYXR0cmlidXRlcyBpbgorCSAgZnMvbnRmcy9pbm9kZS5jOjpudGZzX3JlYWRfbG9ja2VkX3ssYXR0cl8saW5kZXhffWlub2RlKCksCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc197cmVhZCx3cml0ZX1wYWdlKCkuCisJLSBNYWtlIG50ZnNfd3JpdGVfYmxvY2soKSBub3QgaW5zdGFudGlhdGUgc3BhcnNlIGJsb2NrcyBpZiB0aGV5IGNvbnRhaW4KKwkgIG9ubHkgemVyb2VzLgorCS0gT3B0aW1pemUgZnMvbnRmcy9hb3BzLmM6Om50ZnNfd3JpdGVfYmxvY2soKSBieSBleHRlbmRpbmcgdGhlIHBhZ2UKKwkgIGxvY2sgcHJvdGVjdGlvbiBvdmVyIHRoZSBidWZmZXIgc3VibWlzc2lvbiBmb3IgaS9vIHdoaWNoIGFsbG93cyB0aGUKKwkgIHJlbW92YWwgb2YgdGhlIGdldF9iaCgpL3B1dF9iaCgpIHBhaXJzIGZvciBlYWNoIGJ1ZmZlci4KKwktIEZpeCBmcy9udGZzL2FvcHMuYzo6bnRmc197cmVhZCx3cml0ZX1fYmxvY2soKSB0byBoYW5kbGUgdGhlIGNhc2UKKwkgIHdoZXJlIGEgY29uY3VycmVudCB0cnVuY2F0ZSBoYXMgdHJ1bmNhdGVkIHRoZSBydW5saXN0IHVuZGVyIG91ciBmZWV0LgorCS0gRml4IHBhZ2VfaGFzX2J1ZmZlcnMoKS9wYWdlX2J1ZmZlcnMoKSBoYW5kbGluZyBpbiBmcy9udGZzL2FvcHMuYy4KKwktIEluIGZzL250ZnMvYW9wcy5jOjpudGZzX2VuZF9idWZmZXJfYXN5bmNfcmVhZCgpLCB1c2UgYSBiaXQgc3BpbiBsb2NrCisJICBpbiB0aGUgZmlyc3QgYnVmZmVyIGhlYWQgaW5zdGVhZCBvZiBhIGRyaXZlciBnbG9iYWwgc3BpbiBsb2NrIHRvCisJICBpbXByb3ZlIHNjYWxhYmlsaXR5LgorCS0gTWlub3IgZml4IHRvIGVycm9yIGhhbmRsaW5nIGFuZCBlcnJvciBtZXNzYWdlIGRpc3BsYXkgaW4KKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX3ByZXBhcmVfbm9ucmVzaWRlbnRfd3JpdGUoKS4gCisKIDIuMS4yMyAtIEltcGxlbWVudCBleHRlbnNpb24gb2YgcmVzaWRlbnQgZmlsZXMgYW5kIG1ha2Ugd3JpdGluZyBzYWZlIGFzIHdlbGwgYXMKIAkgbWFueSBidWcgZml4ZXMsIGNsZWFudXBzLCBhbmQgZW5oYW5jZW1lbnRzLi4uCiAKZGlmZiAtLWdpdCBhL2ZzL250ZnMvTWFrZWZpbGUgYi9mcy9udGZzL01ha2VmaWxlCmluZGV4IGYwODNmMjcuLjg5NGIyYjggMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvTWFrZWZpbGUKKysrIGIvZnMvbnRmcy9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAKIAkgICAgIGluZGV4Lm8gaW5vZGUubyBtZnQubyBtc3QubyBuYW1laS5vIHJ1bmxpc3QubyBzdXBlci5vIHN5c2N0bC5vIFwKIAkgICAgIHVuaXN0ci5vIHVwY2FzZS5vCiAKLUVYVFJBX0NGTEFHUyA9IC1ETlRGU19WRVJTSU9OPVwiMi4xLjIzXCIKK0VYVFJBX0NGTEFHUyA9IC1ETlRGU19WRVJTSU9OPVwiMi4xLjI0XCIKIAogaWZlcSAoJChDT05GSUdfTlRGU19ERUJVRykseSkKIEVYVFJBX0NGTEFHUyArPSAtRERFQlVHCmRpZmYgLS1naXQgYS9mcy9udGZzL2FvcHMuYyBiL2ZzL250ZnMvYW9wcy5jCmluZGV4IDc4YWRhZDcuLmI2Y2M4Y2YgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvYW9wcy5jCisrKyBiL2ZzL250ZnMvYW9wcy5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvYml0X3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlICJhb3BzLmgiCiAjaW5jbHVkZSAiYXR0cmliLmgiCkBAIC01NSw5ICs1Niw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIG50ZnNfZW5kX2J1ZmZlcl9hc3luY19yZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKIHsKLQlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhZ2VfdXB0b2RhdGVfbG9jayk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZpcnN0LCAqdG1wOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCW50ZnNfaW5vZGUgKm5pOwogCWludCBwYWdlX3VwdG9kYXRlID0gMTsKQEAgLTg5LDExICs4OSwxMyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCQludGZzX2Vycm9yKG5pLT52b2wtPnNiLCAiQnVmZmVyIEkvTyBlcnJvciwgbG9naWNhbCBibG9jayAlbGx1LiIsCiAJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKLQkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCX0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGFnZV91cHRvZGF0ZV9sb2NrLCBmbGFncyk7CisJZmlyc3QgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWJpdF9zcGluX2xvY2soQkhfVXB0b2RhdGVfTG9jaywgJmZpcnN0LT5iX3N0YXRlKTsKIAljbGVhcl9idWZmZXJfYXN5bmNfcmVhZChiaCk7CiAJdW5sb2NrX2J1ZmZlcihiaCk7CiAJdG1wID0gYmg7CkBAIC0xMDgsNyArMTEwLDggQEAKIAkJfQogCQl0bXAgPSB0bXAtPmJfdGhpc19wYWdlOwogCX0gd2hpbGUgKHRtcCAhPSBiaCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGFnZV91cHRvZGF0ZV9sb2NrLCBmbGFncyk7CisJYml0X3NwaW5fdW5sb2NrKEJIX1VwdG9kYXRlX0xvY2ssICZmaXJzdC0+Yl9zdGF0ZSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCS8qCiAJICogSWYgbm9uZSBvZiB0aGUgYnVmZmVycyBoYWQgZXJyb3JzIHRoZW4gd2UgY2FuIHNldCB0aGUgcGFnZSB1cHRvZGF0ZSwKIAkgKiBidXQgd2UgZmlyc3QgaGF2ZSB0byBwZXJmb3JtIHRoZSBwb3N0IHJlYWQgbXN0IGZpeHVwcywgaWYgdGhlCkBAIC0xNDEsNyArMTQ0LDggQEAKIAl1bmxvY2tfcGFnZShwYWdlKTsKIAlyZXR1cm47CiBzdGlsbF9idXN5OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCWJpdF9zcGluX3VubG9jayhCSF9VcHRvZGF0ZV9Mb2NrLCAmZmlyc3QtPmJfc3RhdGUpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm47CiB9CiAKQEAgLTE4NSwxMyArMTg5LDE1IEBACiAJYmxvY2tzaXplX2JpdHMgPSBWRlNfSShuaSktPmlfYmxrYml0czsKIAlibG9ja3NpemUgPSAxIDw8IGJsb2Nrc2l6ZV9iaXRzOwogCi0JaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgewogCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBibG9ja3NpemUsIDApOwotCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKLQlpZiAodW5saWtlbHkoIWJoKSkgewotCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWlmICh1bmxpa2VseSghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkpIHsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAl9CisJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCUJVR19PTighYmgpOwogCiAJaWJsb2NrID0gKHM2NClwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGJsb2Nrc2l6ZV9iaXRzKTsKIAlyZWFkX2xvY2tfaXJxc2F2ZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOwpAQCAtMjA0LDYgKzIxMCw3IEBACiAJbnIgPSBpID0gMDsKIAlkbyB7CiAJCXU4ICprYWRkcjsKKwkJaW50IGVycjsKIAogCQlpZiAodW5saWtlbHkoYnVmZmVyX3VwdG9kYXRlKGJoKSkpCiAJCQljb250aW51ZTsKQEAgLTIxMSw2ICsyMTgsNyBAQAogCQkJYXJyW25yKytdID0gYmg7CiAJCQljb250aW51ZTsKIAkJfQorCQllcnIgPSAwOwogCQliaC0+Yl9iZGV2ID0gdm9sLT5zYi0+c19iZGV2OwogCQkvKiBJcyB0aGUgYmxvY2sgd2l0aGluIHRoZSBhbGxvd2VkIGxpbWl0cz8gKi8KIAkJaWYgKGlibG9jayA8IGxibG9jaykgewpAQCAtMjUyLDcgKzI2MCw2IEBACiAJCQkJZ290byBoYW5kbGVfaG9sZTsKIAkJCS8qIElmIGZpcnN0IHRyeSBhbmQgcnVubGlzdCB1bm1hcHBlZCwgbWFwIGFuZCByZXRyeS4gKi8KIAkJCWlmICghaXNfcmV0cnkgJiYgbGNuID09IExDTl9STF9OT1RfTUFQUEVEKSB7Ci0JCQkJaW50IGVycjsKIAkJCQlpc19yZXRyeSA9IFRSVUU7CiAJCQkJLyoKIAkJCQkgKiBBdHRlbXB0IHRvIG1hcCBydW5saXN0LCBkcm9wcGluZyBsb2NrIGZvcgpAQCAtMjYzLDIwICsyNzAsMzAgQEAKIAkJCQlpZiAobGlrZWx5KCFlcnIpKQogCQkJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CiAJCQkJcmwgPSBOVUxMOwotCQkJCWxjbiA9IGVycjsKIAkJCX0gZWxzZSBpZiAoIXJsKQogCQkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJLyoKKwkJCSAqIElmIGJ1ZmZlciBpcyBvdXRzaWRlIHRoZSBydW5saXN0LCB0cmVhdCBpdCBhcyBhCisJCQkgKiBob2xlLiAgVGhpcyBjYW4gaGFwcGVuIGR1ZSB0byBjb25jdXJyZW50IHRydW5jYXRlCisJCQkgKiBmb3IgZXhhbXBsZS4KKwkJCSAqLworCQkJaWYgKGVyciA9PSAtRU5PRU5UIHx8IGxjbiA9PSBMQ05fRU5PRU5UKSB7CisJCQkJZXJyID0gMDsKKwkJCQlnb3RvIGhhbmRsZV9ob2xlOworCQkJfQogCQkJLyogSGFyZCBlcnJvciwgemVybyBvdXQgcmVnaW9uLiAqLworCQkJaWYgKCFlcnIpCisJCQkJZXJyID0gLUVJTzsKIAkJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKIAkJCVNldFBhZ2VFcnJvcihwYWdlKTsKIAkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZWFkIGZyb20gaW5vZGUgMHglbHgsICIKIAkJCQkJImF0dHJpYnV0ZSB0eXBlIDB4JXgsIHZjbiAweCVsbHgsICIKIAkJCQkJIm9mZnNldCAweCV4IGJlY2F1c2UgaXRzIGxvY2F0aW9uIG9uICIKIAkJCQkJImRpc2sgY291bGQgbm90IGJlIGRldGVybWluZWQlcyAiCi0JCQkJCSIoZXJyb3IgY29kZSAlbGxpKS4iLCBuaS0+bWZ0X25vLAorCQkJCQkiKGVycm9yIGNvZGUgJWkpLiIsIG5pLT5tZnRfbm8sCiAJCQkJCW5pLT50eXBlLCAodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKIAkJCQkJdmNuX29mcywgaXNfcmV0cnkgPyAiIGV2ZW4gYWZ0ZXIgIgotCQkJCQkicmV0cnlpbmciIDogIiIsIChsb25nIGxvbmcpbGNuKTsKKwkJCQkJInJldHJ5aW5nIiA6ICIiLCBlcnIpOwogCQl9CiAJCS8qCiAJCSAqIEVpdGhlciBpYmxvY2sgd2FzIG91dHNpZGUgbGJsb2NrIGxpbWl0cyBvcgpAQCAtMjg5LDkgKzMwNiwxMCBAQAogaGFuZGxlX3pibG9jazoKIAkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CiAJCW1lbXNldChrYWRkciArIGkgKiBibG9ja3NpemUsIDAsIGJsb2Nrc2l6ZSk7Ci0JCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7Ci0JCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJaWYgKGxpa2VseSghZXJyKSkKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCX0gd2hpbGUgKGkrKywgaWJsb2NrKyssIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CiAKIAkvKiBSZWxlYXNlIHRoZSBsb2NrIGlmIHdlIHRvb2sgaXQuICovCkBAIC0zNjcsMzEgKzM4NSwzOCBAQAogCQlyZXR1cm4gMDsKIAl9CiAJbmkgPSBOVEZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCk7Ci0KKwkvKgorCSAqIE9ubHkgJERBVEEgYXR0cmlidXRlcyBjYW4gYmUgZW5jcnlwdGVkIGFuZCBvbmx5IHVubmFtZWQgJERBVEEKKwkgKiBhdHRyaWJ1dGVzIGNhbiBiZSBjb21wcmVzc2VkLiAgSW5kZXggcm9vdCBjYW4gaGF2ZSB0aGUgZmxhZ3Mgc2V0IGJ1dAorCSAqIHRoaXMgbWVhbnMgdG8gY3JlYXRlIGNvbXByZXNzZWQvZW5jcnlwdGVkIGZpbGVzLCBub3QgdGhhdCB0aGUKKwkgKiBhdHRyaWJ1dGUgaXMgY29tcHJlc3NlZC9lbmNyeXB0ZWQuCisJICovCisJaWYgKG5pLT50eXBlICE9IEFUX0lOREVYX1JPT1QpIHsKKwkJLyogSWYgYXR0cmlidXRlIGlzIGVuY3J5cHRlZCwgZGVueSBhY2Nlc3MsIGp1c3QgbGlrZSBOVDQuICovCisJCWlmIChOSW5vRW5jcnlwdGVkKG5pKSkgeworCQkJQlVHX09OKG5pLT50eXBlICE9IEFUX0RBVEEpOworCQkJZXJyID0gLUVBQ0NFUzsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQkvKiBDb21wcmVzc2VkIGRhdGEgc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBjb21wcmVzcy5jLiAqLworCQlpZiAoTklub05vblJlc2lkZW50KG5pKSAmJiBOSW5vQ29tcHJlc3NlZChuaSkpIHsKKwkJCUJVR19PTihuaS0+dHlwZSAhPSBBVF9EQVRBKTsKKwkJCUJVR19PTihuaS0+bmFtZV9sZW4pOworCQkJcmV0dXJuIG50ZnNfcmVhZF9jb21wcmVzc2VkX2Jsb2NrKHBhZ2UpOworCQl9CisJfQogCS8qIE5Jbm9Ob25SZXNpZGVudCgpID09IE5Jbm9JbmRleEFsbG9jUHJlc2VudCgpICovCiAJaWYgKE5Jbm9Ob25SZXNpZGVudChuaSkpIHsKLQkJLyoKLQkJICogT25seSB1bm5hbWVkICREQVRBIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbXByZXNzZWQgb3IKLQkJICogZW5jcnlwdGVkLgotCQkgKi8KLQkJaWYgKG5pLT50eXBlID09IEFUX0RBVEEgJiYgIW5pLT5uYW1lX2xlbikgewotCQkJLyogSWYgZmlsZSBpcyBlbmNyeXB0ZWQsIGRlbnkgYWNjZXNzLCBqdXN0IGxpa2UgTlQ0LiAqLwotCQkJaWYgKE5Jbm9FbmNyeXB0ZWQobmkpKSB7Ci0JCQkJZXJyID0gLUVBQ0NFUzsKLQkJCQlnb3RvIGVycl9vdXQ7Ci0JCQl9Ci0JCQkvKiBDb21wcmVzc2VkIGRhdGEgc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBjb21wcmVzcy5jLiAqLwotCQkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkKLQkJCQlyZXR1cm4gbnRmc19yZWFkX2NvbXByZXNzZWRfYmxvY2socGFnZSk7Ci0JCX0KLQkJLyogTm9ybWFsIGRhdGEgc3RyZWFtLiAqLworCQkvKiBOb3JtYWwsIG5vbi1yZXNpZGVudCBkYXRhIHN0cmVhbS4gKi8KIAkJcmV0dXJuIG50ZnNfcmVhZF9ibG9jayhwYWdlKTsKIAl9CiAJLyoKIAkgKiBBdHRyaWJ1dGUgaXMgcmVzaWRlbnQsIGltcGx5aW5nIGl0IGlzIG5vdCBjb21wcmVzc2VkIG9yIGVuY3J5cHRlZC4KIAkgKiBUaGlzIGFsc28gbWVhbnMgdGhlIGF0dHJpYnV0ZSBpcyBzbWFsbGVyIHRoYW4gYW4gbWZ0IHJlY29yZCBhbmQKIAkgKiBoZW5jZSBzbWFsbGVyIHRoYW4gYSBwYWdlLCBzbyBjYW4gc2ltcGx5IHplcm8gb3V0IGFueSBwYWdlcyB3aXRoCi0JICogaW5kZXggYWJvdmUgMC4KKwkgKiBpbmRleCBhYm92ZSAwLiAgTm90ZSB0aGUgYXR0cmlidXRlIGNhbiBhY3R1YWxseSBiZSBtYXJrZWQgY29tcHJlc3NlZAorCSAqIGJ1dCBpZiBpdCBpcyByZXNpZGVudCB0aGUgYWN0dWFsIGRhdGEgaXMgbm90IGNvbXByZXNzZWQgc28gd2UgYXJlCisJICogb2sgdG8gaWdub3JlIHRoZSBjb21wcmVzc2VkIGZsYWcgaGVyZS4KIAkgKi8KIAlpZiAodW5saWtlbHkocGFnZS0+aW5kZXggPiAwKSkgewogCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKQEAgLTUxMSwxOSArNTM2LDIxIEBACiAJCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKIAkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLAogCQkJCSgxIDw8IEJIX1VwdG9kYXRlKSB8ICgxIDw8IEJIX0RpcnR5KSk7CisJCWlmICh1bmxpa2VseSghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkpIHsKKwkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiRXJyb3IgYWxsb2NhdGluZyBwYWdlICIKKwkJCQkJImJ1ZmZlcnMuICBSZWRpcnR5aW5nIHBhZ2Ugc28gd2UgdHJ5ICIKKwkJCQkJImFnYWluIGxhdGVyLiIpOworCQkJLyoKKwkJCSAqIFB1dCB0aGUgcGFnZSBiYWNrIG9uIG1hcHBpbmctPmRpcnR5X3BhZ2VzLCBidXQgbGVhdmUKKwkJCSAqIGl0cyBidWZmZXJzJyBkaXJ0eSBzdGF0ZSBhcy1pcy4KKwkJCSAqLworCQkJcmVkaXJ0eV9wYWdlX2Zvcl93cml0ZXBhZ2Uod2JjLCBwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcmV0dXJuIDA7CisJCX0KIAl9CiAJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwotCWlmICh1bmxpa2VseSghYmgpKSB7Ci0JCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiRXJyb3IgYWxsb2NhdGluZyBwYWdlIGJ1ZmZlcnMuICIKLQkJCQkiUmVkaXJ0eWluZyBwYWdlIHNvIHdlIHRyeSBhZ2FpbiBsYXRlci4iKTsKLQkJLyoKLQkJICogUHV0IHRoZSBwYWdlIGJhY2sgb24gbWFwcGluZy0+ZGlydHlfcGFnZXMsIGJ1dCBsZWF2ZSBpdHMKLQkJICogYnVmZmVyJ3MgZGlydHkgc3RhdGUgYXMtaXMuCi0JCSAqLwotCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOwotCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJcmV0dXJuIDA7Ci0JfQorCUJVR19PTighYmgpOwogCiAJLyogTk9URTogRGlmZmVyZW50IG5hbWluZyBzY2hlbWUgdG8gbnRmc19yZWFkX2Jsb2NrKCkhICovCiAKQEAgLTY3MCw2ICs2OTcsMjcgQEAKIAkJfQogCQkvKiBJdCBpcyBhIGhvbGUsIG5lZWQgdG8gaW5zdGFudGlhdGUgaXQuICovCiAJCWlmIChsY24gPT0gTENOX0hPTEUpIHsKKwkJCXU4ICprYWRkcjsKKwkJCXVuc2lnbmVkIGxvbmcgKmJwb3MsICpiZW5kOworCisJCQkvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGlzIHplcm8uICovCisJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCWJwb3MgPSAodW5zaWduZWQgbG9uZyAqKShrYWRkciArIGJoX29mZnNldChiaCkpOworCQkJYmVuZCA9ICh1bnNpZ25lZCBsb25nICopKCh1OCopYnBvcyArIGJsb2Nrc2l6ZSk7CisJCQlkbyB7CisJCQkJaWYgKHVubGlrZWx5KCpicG9zKSkKKwkJCQkJYnJlYWs7CisJCQl9IHdoaWxlIChsaWtlbHkoKyticG9zIDwgYmVuZCkpOworCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQkJaWYgKGJwb3MgPT0gYmVuZCkgeworCQkJCS8qCisJCQkJICogQnVmZmVyIGlzIHplcm8gYW5kIHNwYXJzZSwgbm8gbmVlZCB0byB3cml0ZQorCQkJCSAqIGl0LgorCQkJCSAqLworCQkJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKKwkJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQkJCWNvbnRpbnVlOworCQkJfQogCQkJLy8gVE9ETzogSW5zdGFudGlhdGUgdGhlIGhvbGUuCiAJCQkvLyBjbGVhcl9idWZmZXJfbmV3KGJoKTsKIAkJCS8vIHVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoYmgtPmJfYmRldiwgYmgtPmJfYmxvY2tucik7CkBAIC02OTAsMjAgKzczOCwzNyBAQAogCQkJaWYgKGxpa2VseSghZXJyKSkKIAkJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CiAJCQlybCA9IE5VTEw7Ci0JCQlsY24gPSBlcnI7CiAJCX0gZWxzZSBpZiAoIXJsKQogCQkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJCS8qCisJCSAqIElmIGJ1ZmZlciBpcyBvdXRzaWRlIHRoZSBydW5saXN0LCB0cnVuY2F0ZSBoYXMgY3V0IGl0IG91dAorCQkgKiBvZiB0aGUgcnVubGlzdC4gIEp1c3QgY2xlYW4gYW5kIGNsZWFyIHRoZSBidWZmZXIgYW5kIHNldCBpdAorCQkgKiB1cHRvZGF0ZSBzbyBpdCBjYW4gZ2V0IGRpc2NhcmRlZCBieSB0aGUgVk0uCisJCSAqLworCQlpZiAoZXJyID09IC1FTk9FTlQgfHwgbGNuID09IExDTl9FTk9FTlQpIHsKKwkJCXU4ICprYWRkcjsKKworCQkJYmgtPmJfYmxvY2tuciA9IC0xOworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJbWVtc2V0KGthZGRyICsgYmhfb2Zmc2V0KGJoKSwgMCwgYmxvY2tzaXplKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQllcnIgPSAwOworCQkJY29udGludWU7CisJCX0KIAkJLyogRmFpbGVkIHRvIG1hcCB0aGUgYnVmZmVyLCBldmVuIGFmdGVyIHJldHJ5aW5nLiAqLworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FSU87CiAJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHdyaXRlIHRvIGlub2RlIDB4JWx4LCAiCiAJCQkJImF0dHJpYnV0ZSB0eXBlIDB4JXgsIHZjbiAweCVsbHgsIG9mZnNldCAweCV4ICIKIAkJCQkiYmVjYXVzZSBpdHMgbG9jYXRpb24gb24gZGlzayBjb3VsZCBub3QgYmUgIgotCQkJCSJkZXRlcm1pbmVkJXMgKGVycm9yIGNvZGUgJWxsaSkuIiwgbmktPm1mdF9ubywKKwkJCQkiZGV0ZXJtaW5lZCVzIChlcnJvciBjb2RlICVpKS4iLCBuaS0+bWZ0X25vLAogCQkJCW5pLT50eXBlLCAodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKIAkJCQl2Y25fb2ZzLCBpc19yZXRyeSA/ICIgZXZlbiBhZnRlciAiCi0JCQkJInJldHJ5aW5nIiA6ICIiLCAobG9uZyBsb25nKWxjbik7Ci0JCWlmICghZXJyKQotCQkJZXJyID0gLUVJTzsKKwkJCQkicmV0cnlpbmciIDogIiIsIGVycik7CiAJCWJyZWFrOwogCX0gd2hpbGUgKGJsb2NrKyssIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CiAKQEAgLTcxNCw3ICs3NzksNyBAQAogCS8qIEZvciB0aGUgZXJyb3IgY2FzZSwgbmVlZCB0byByZXNldCBiaCB0byB0aGUgYmVnaW5uaW5nLiAqLwogCWJoID0gaGVhZDsKIAotCS8qIEp1c3QgYW4gb3B0aW1pemF0aW9uLCBzbyAtPnJlYWRwYWdlKCkgaXNuJ3QgY2FsbGVkIGxhdGVyLiAqLworCS8qIEp1c3QgYW4gb3B0aW1pemF0aW9uLCBzbyAtPnJlYWRwYWdlKCkgaXMgbm90IGNhbGxlZCBsYXRlci4gKi8KIAlpZiAodW5saWtlbHkoIVBhZ2VVcHRvZGF0ZShwYWdlKSkpIHsKIAkJaW50IHVwdG9kYXRlID0gMTsKIAkJZG8gewpAQCAtNzMwLDcgKzc5NSw2IEBACiAKIAkvKiBTZXR1cCBhbGwgbWFwcGVkLCBkaXJ0eSBidWZmZXJzIGZvciBhc3luYyB3cml0ZSBpL28uICovCiAJZG8gewotCQlnZXRfYmgoYmgpOwogCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYnVmZmVyX2RpcnR5KGJoKSkgewogCQkJbG9ja19idWZmZXIoYmgpOwogCQkJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSkgewpAQCAtNzY4LDE0ICs4MzIsOCBAQAogCiAJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOwogCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsJLyogS2VlcHMgdHJ5X3RvX2ZyZWVfYnVmZmVycygpIGF3YXkuICovCi0JdW5sb2NrX3BhZ2UocGFnZSk7CiAKLQkvKgotCSAqIFN1Ym1pdCB0aGUgcHJlcGFyZWQgYnVmZmVycyBmb3IgaS9vLiBOb3RlIHRoZSBwYWdlIGlzIHVubG9ja2VkLAotCSAqIGFuZCB0aGUgYXN5bmMgd3JpdGUgaS9vIGNvbXBsZXRpb24gaGFuZGxlciBjYW4gZW5kX3BhZ2Vfd3JpdGViYWNrKCkKLQkgKiBhdCBhbnkgdGltZSBhZnRlciB0aGUgKmZpcnN0KiBzdWJtaXRfYmgoKS4gU28gdGhlIGJ1ZmZlcnMgY2FuIHRoZW4KLQkgKiBkaXNhcHBlYXIuLi4KLQkgKi8KKwkvKiBTdWJtaXQgdGhlIHByZXBhcmVkIGJ1ZmZlcnMgZm9yIGkvby4gKi8KIAluZWVkX2VuZF93cml0ZWJhY2sgPSBUUlVFOwogCWRvIHsKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0ID0gYmgtPmJfdGhpc19wYWdlOwpAQCAtNzgzLDkgKzg0MSw5IEBACiAJCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKIAkJCW5lZWRfZW5kX3dyaXRlYmFjayA9IEZBTFNFOwogCQl9Ci0JCXB1dF9iaChiaCk7CiAJCWJoID0gbmV4dDsKIAl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKIAogCS8qIElmIG5vIGkvbyB3YXMgc3RhcnRlZCwgbmVlZCB0byBlbmRfcGFnZV93cml0ZWJhY2soKS4gKi8KIAlpZiAodW5saWtlbHkobmVlZF9lbmRfd3JpdGViYWNrKSkKQEAgLTg2MCw3ICs5MTgsNiBAQAogCXN5bmMgPSAod2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEwpOwogCiAJLyogTWFrZSBzdXJlIHdlIGhhdmUgbWFwcGVkIGJ1ZmZlcnMuICovCi0JQlVHX09OKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKTsKIAliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CiAJQlVHX09OKCFiaCk7CiAKQEAgLTEyODAsMzggKzEzMzcsNDIgQEAKIAkJbnRmc19kZWJ1ZygiV3JpdGUgb3V0c2lkZSBpX3NpemUgLSB0cnVuY2F0ZWQ/Iik7CiAJCXJldHVybiAwOwogCX0KKwkvKgorCSAqIE9ubHkgJERBVEEgYXR0cmlidXRlcyBjYW4gYmUgZW5jcnlwdGVkIGFuZCBvbmx5IHVubmFtZWQgJERBVEEKKwkgKiBhdHRyaWJ1dGVzIGNhbiBiZSBjb21wcmVzc2VkLiAgSW5kZXggcm9vdCBjYW4gaGF2ZSB0aGUgZmxhZ3Mgc2V0IGJ1dAorCSAqIHRoaXMgbWVhbnMgdG8gY3JlYXRlIGNvbXByZXNzZWQvZW5jcnlwdGVkIGZpbGVzLCBub3QgdGhhdCB0aGUKKwkgKiBhdHRyaWJ1dGUgaXMgY29tcHJlc3NlZC9lbmNyeXB0ZWQuCisJICovCisJaWYgKG5pLT50eXBlICE9IEFUX0lOREVYX1JPT1QpIHsKKwkJLyogSWYgZmlsZSBpcyBlbmNyeXB0ZWQsIGRlbnkgYWNjZXNzLCBqdXN0IGxpa2UgTlQ0LiAqLworCQlpZiAoTklub0VuY3J5cHRlZChuaSkpIHsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJQlVHX09OKG5pLT50eXBlICE9IEFUX0RBVEEpOworCQkJbnRmc19kZWJ1ZygiRGVueWluZyB3cml0ZSBhY2Nlc3MgdG8gZW5jcnlwdGVkICIKKwkJCQkJImZpbGUuIik7CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJfQorCQkvKiBDb21wcmVzc2VkIGRhdGEgc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBjb21wcmVzcy5jLiAqLworCQlpZiAoTklub05vblJlc2lkZW50KG5pKSAmJiBOSW5vQ29tcHJlc3NlZChuaSkpIHsKKwkJCUJVR19PTihuaS0+dHlwZSAhPSBBVF9EQVRBKTsKKwkJCUJVR19PTihuaS0+bmFtZV9sZW4pOworCQkJLy8gVE9ETzogSW1wbGVtZW50IGFuZCByZXBsYWNlIHRoaXMgd2l0aAorCQkJLy8gcmV0dXJuIG50ZnNfd3JpdGVfY29tcHJlc3NlZF9ibG9jayhwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIldyaXRpbmcgdG8gY29tcHJlc3NlZCBmaWxlcyBpcyAiCisJCQkJCSJub3Qgc3VwcG9ydGVkIHlldC4gIFNvcnJ5LiIpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJCS8vIFRPRE86IEltcGxlbWVudCBhbmQgcmVtb3ZlIHRoaXMgY2hlY2suCisJCWlmIChOSW5vTm9uUmVzaWRlbnQobmkpICYmIE5Jbm9TcGFyc2UobmkpKSB7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJXcml0aW5nIHRvIHNwYXJzZSBmaWxlcyBpcyBub3QgIgorCQkJCQkic3VwcG9ydGVkIHlldC4gIFNvcnJ5LiIpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJfQogCS8qIE5Jbm9Ob25SZXNpZGVudCgpID09IE5Jbm9JbmRleEFsbG9jUHJlc2VudCgpICovCiAJaWYgKE5Jbm9Ob25SZXNpZGVudChuaSkpIHsKLQkJLyoKLQkJICogT25seSB1bm5hbWVkICREQVRBIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbXByZXNzZWQsIGVuY3J5cHRlZCwKLQkJICogYW5kL29yIHNwYXJzZS4KLQkJICovCi0JCWlmIChuaS0+dHlwZSA9PSBBVF9EQVRBICYmICFuaS0+bmFtZV9sZW4pIHsKLQkJCS8qIElmIGZpbGUgaXMgZW5jcnlwdGVkLCBkZW55IGFjY2VzcywganVzdCBsaWtlIE5UNC4gKi8KLQkJCWlmIChOSW5vRW5jcnlwdGVkKG5pKSkgewotCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCW50ZnNfZGVidWcoIkRlbnlpbmcgd3JpdGUgYWNjZXNzIHRvIGVuY3J5cHRlZCAiCi0JCQkJCQkiZmlsZS4iKTsKLQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCX0KLQkJCS8qIENvbXByZXNzZWQgZGF0YSBzdHJlYW1zIGFyZSBoYW5kbGVkIGluIGNvbXByZXNzLmMuICovCi0JCQlpZiAoTklub0NvbXByZXNzZWQobmkpKSB7Ci0JCQkJLy8gVE9ETzogSW1wbGVtZW50IGFuZCByZXBsYWNlIHRoaXMgY2hlY2sgd2l0aAotCQkJCS8vIHJldHVybiBudGZzX3dyaXRlX2NvbXByZXNzZWRfYmxvY2socGFnZSk7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIldyaXRpbmcgdG8gY29tcHJlc3NlZCAiCi0JCQkJCQkiZmlsZXMgaXMgbm90IHN1cHBvcnRlZCB5ZXQuICIKLQkJCQkJCSJTb3JyeS4iKTsKLQkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCQl9Ci0JCQkvLyBUT0RPOiBJbXBsZW1lbnQgYW5kIHJlbW92ZSB0aGlzIGNoZWNrLgotCQkJaWYgKE5Jbm9TcGFyc2UobmkpKSB7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIldyaXRpbmcgdG8gc3BhcnNlIGZpbGVzICIKLQkJCQkJCSJpcyBub3Qgc3VwcG9ydGVkIHlldC4gU29ycnkuIik7Ci0JCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQkJfQotCQl9CiAJCS8qIFdlIGhhdmUgdG8gemVybyBldmVyeSB0aW1lIGR1ZSB0byBtbWFwLWF0LWVuZC1vZi1maWxlLiAqLwogCQlpZiAocGFnZS0+aW5kZXggPj0gKGlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkgewogCQkJLyogVGhlIHBhZ2Ugc3RyYWRkbGVzIGlfc2l6ZS4gKi8KQEAgLTEzMjQsMTQgKzEzODUsMTYgQEAKIAkJLyogSGFuZGxlIG1zdCBwcm90ZWN0ZWQgYXR0cmlidXRlcy4gKi8KIAkJaWYgKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpKQogCQkJcmV0dXJuIG50ZnNfd3JpdGVfbXN0X2Jsb2NrKHBhZ2UsIHdiYyk7Ci0JCS8qIE5vcm1hbCBkYXRhIHN0cmVhbS4gKi8KKwkJLyogTm9ybWFsLCBub24tcmVzaWRlbnQgZGF0YSBzdHJlYW0uICovCiAJCXJldHVybiBudGZzX3dyaXRlX2Jsb2NrKHBhZ2UsIHdiYyk7CiAJfQogCS8qCi0JICogQXR0cmlidXRlIGlzIHJlc2lkZW50LCBpbXBseWluZyBpdCBpcyBub3QgY29tcHJlc3NlZCwgZW5jcnlwdGVkLAotCSAqIHNwYXJzZSwgb3IgbXN0IHByb3RlY3RlZC4gIFRoaXMgYWxzbyBtZWFucyB0aGUgYXR0cmlidXRlIGlzIHNtYWxsZXIKLQkgKiB0aGFuIGFuIG1mdCByZWNvcmQgYW5kIGhlbmNlIHNtYWxsZXIgdGhhbiBhIHBhZ2UsIHNvIGNhbiBzaW1wbHkKLQkgKiByZXR1cm4gZXJyb3Igb24gYW55IHBhZ2VzIHdpdGggaW5kZXggYWJvdmUgMC4KKwkgKiBBdHRyaWJ1dGUgaXMgcmVzaWRlbnQsIGltcGx5aW5nIGl0IGlzIG5vdCBjb21wcmVzc2VkLCBlbmNyeXB0ZWQsIG9yCisJICogbXN0IHByb3RlY3RlZC4gIFRoaXMgYWxzbyBtZWFucyB0aGUgYXR0cmlidXRlIGlzIHNtYWxsZXIgdGhhbiBhbiBtZnQKKwkgKiByZWNvcmQgYW5kIGhlbmNlIHNtYWxsZXIgdGhhbiBhIHBhZ2UsIHNvIGNhbiBzaW1wbHkgcmV0dXJuIGVycm9yIG9uCisJICogYW55IHBhZ2VzIHdpdGggaW5kZXggYWJvdmUgMC4gIE5vdGUgdGhlIGF0dHJpYnV0ZSBjYW4gYWN0dWFsbHkgYmUKKwkgKiBtYXJrZWQgY29tcHJlc3NlZCBidXQgaWYgaXQgaXMgcmVzaWRlbnQgdGhlIGFjdHVhbCBkYXRhIGlzIG5vdAorCSAqIGNvbXByZXNzZWQgc28gd2UgYXJlIG9rIHRvIGlnbm9yZSB0aGUgY29tcHJlc3NlZCBmbGFnIGhlcmUuCiAJICovCiAJQlVHX09OKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpOwogCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKQEAgLTEzODAsMzAgKzE0NDMsMTQgQEAKIAlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CiAJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCXVubG9ja19wYWdlKHBhZ2UpOwotCiAJLyoKLQkgKiBIZXJlLCB3ZSBkb24ndCBuZWVkIHRvIHplcm8gdGhlIG91dCBvZiBib3VuZHMgYXJlYSBldmVyeXRpbWUgYmVjYXVzZQotCSAqIHRoZSBiZWxvdyBtZW1jcHkoKSBhbHJlYWR5IHRha2VzIGNhcmUgb2YgdGhlIG1tYXAtYXQtZW5kLW9mLWZpbGUKLQkgKiByZXF1aXJlbWVudHMuIElmIHRoZSBmaWxlIGlzIGNvbnZlcnRlZCB0byBhIG5vbi1yZXNpZGVudCBvbmUsIHRoZW4KLQkgKiB0aGUgY29kZSBwYXRoIHVzZSBpcyBzd2l0Y2hlZCB0byB0aGUgbm9uLXJlc2lkZW50IG9uZSB3aGVyZSB0aGUKLQkgKiB6ZXJvaW5nIGhhcHBlbnMgb24gZWFjaCBudGZzX3dyaXRlcGFnZSgpIGludm9jYXRpb24uCi0JICoKLQkgKiBUaGUgYWJvdmUgYWxzbyBhcHBsaWVzIG5pY2VseSB3aGVuIGlfc2l6ZSBpcyBkZWNyZWFzZWQuCi0JICoKLQkgKiBXaGVuIGlfc2l6ZSBpcyBpbmNyZWFzZWQsIHRoZSBtZW1vcnkgYmV0d2VlbiB0aGUgb2xkIGFuZCBuZXcgaV9zaXplCi0JICogX211c3RfIGJlIHplcm9lZCAob3Igb3ZlcndyaXR0ZW4gd2l0aCBuZXcgZGF0YSkuIE90aGVyd2lzZSB3ZSB3aWxsCi0JICogZXhwb3NlIGRhdGEgdG8gdXNlcnNwYWNlL2Rpc2sgd2hpY2ggc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiBleHBvc2VkLgotCSAqCi0JICogRklYTUU6IEVuc3VyZSB0aGF0IGlfc2l6ZSBpbmNyZWFzZXMgZG8gdGhlIHplcm9pbmcvb3ZlcndyaXRpbmcgYW5kCi0JICogaWYgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0LCB0aGVuIGVuYWJsZSB0aGUgemVyb2luZyBiZWxvdy4gIElmIHRoZQotCSAqIHplcm9pbmcgYmVsb3cgaXMgZW5hYmxlZCwgd2UgTVVTVCBtb3ZlIHRoZSB1bmxvY2tfcGFnZSgpIGZyb20gYWJvdmUKLQkgKiB0byBhZnRlciB0aGUga3VubWFwX2F0b21pYygpLCBpLmUuIGp1c3QgYmVmb3JlIHRoZQotCSAqIGVuZF9wYWdlX3dyaXRlYmFjaygpLgotCSAqIFVQREFURTogbnRmc19wcmVwYXJlL2NvbW1pdF93cml0ZSgpIGRvIHRoZSB6ZXJvaW5nIG9uIGlfc2l6ZQotCSAqIGluY3JlYXNlcyBmb3IgcmVzaWRlbnQgYXR0cmlidXRlcyBzbyB0aG9zZSBhcmUgb2suCi0JICogVE9ETzogbnRmc190cnVuY2F0ZSgpLCBvdGhlcnM/CisJICogSGVyZSwgd2UgZG8gbm90IG5lZWQgdG8gemVybyB0aGUgb3V0IG9mIGJvdW5kcyBhcmVhIGV2ZXJ5dGltZQorCSAqIGJlY2F1c2UgdGhlIGJlbG93IG1lbWNweSgpIGFscmVhZHkgdGFrZXMgY2FyZSBvZiB0aGUKKwkgKiBtbWFwLWF0LWVuZC1vZi1maWxlIHJlcXVpcmVtZW50cy4gIElmIHRoZSBmaWxlIGlzIGNvbnZlcnRlZCB0byBhCisJICogbm9uLXJlc2lkZW50IG9uZSwgdGhlbiB0aGUgY29kZSBwYXRoIHVzZSBpcyBzd2l0Y2hlZCB0byB0aGUKKwkgKiBub24tcmVzaWRlbnQgb25lIHdoZXJlIHRoZSB6ZXJvaW5nIGhhcHBlbnMgb24gZWFjaCBudGZzX3dyaXRlcGFnZSgpCisJICogaW52b2NhdGlvbi4KIAkgKi8KLQogCWF0dHJfbGVuID0gbGUzMl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CiAJaV9zaXplID0gaV9zaXplX3JlYWQodmkpOwogCWlmICh1bmxpa2VseShhdHRyX2xlbiA+IGlfc2l6ZSkpIHsKQEAgLTE2ODEsMjcgKzE3MjgsMjUgQEAKIAkJCQkJaWYgKGxpa2VseSghZXJyKSkKIAkJCQkJCWdvdG8gbG9ja19yZXRyeV9yZW1hcDsKIAkJCQkJcmwgPSBOVUxMOwotCQkJCQlsY24gPSBlcnI7CiAJCQkJfSBlbHNlIGlmICghcmwpCiAJCQkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOwogCQkJCS8qCiAJCQkJICogRmFpbGVkIHRvIG1hcCB0aGUgYnVmZmVyLCBldmVuIGFmdGVyCiAJCQkJICogcmV0cnlpbmcuCiAJCQkJICovCisJCQkJaWYgKCFlcnIpCisJCQkJCWVyciA9IC1FSU87CiAJCQkJYmgtPmJfYmxvY2tuciA9IC0xOwogCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byB3cml0ZSB0byBpbm9kZSAiCiAJCQkJCQkiMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsICIKIAkJCQkJCSJ2Y24gMHglbGx4LCBvZmZzZXQgMHgleCAiCiAJCQkJCQkiYmVjYXVzZSBpdHMgbG9jYXRpb24gb24gZGlzayAiCiAJCQkJCQkiY291bGQgbm90IGJlIGRldGVybWluZWQlcyAiCi0JCQkJCQkiKGVycm9yIGNvZGUgJWxsaSkuIiwKKwkJCQkJCSIoZXJyb3IgY29kZSAlaSkuIiwKIAkJCQkJCW5pLT5tZnRfbm8sIG5pLT50eXBlLAogCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sCiAJCQkJCQl2Y25fb2ZzLCBpc19yZXRyeSA/ICIgZXZlbiAiCi0JCQkJCQkiYWZ0ZXIgcmV0cnlpbmciIDogIiIsCi0JCQkJCQkobG9uZyBsb25nKWxjbik7Ci0JCQkJaWYgKCFlcnIpCi0JCQkJCWVyciA9IC1FSU87CisJCQkJCQkiYWZ0ZXIgcmV0cnlpbmciIDogIiIsIGVycik7CiAJCQkJZ290byBlcnJfb3V0OwogCQkJfQogCQkJLyogV2Ugbm93IGhhdmUgYSBzdWNjZXNzZnVsIHJlbWFwLCBpLmUuIGxjbiA+PSAwLiAqLwpAQCAtMjM1Nyw2ICsyNDAyLDcgQEAKIAkJCWJ1ZmZlcnNfdG9fZnJlZSA9IGJoOwogCX0KIAliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJQlVHX09OKCFiaCk7CiAJZG8gewogCQliaF9vZnMgPSBiaF9vZmZzZXQoYmgpOwogCQlpZiAoYmhfb2ZzICsgYmhfc2l6ZSA8PSBvZnMpCmRpZmYgLS1naXQgYS9mcy9udGZzL2F0dHJpYi5jIGIvZnMvbnRmcy9hdHRyaWIuYwppbmRleCBjZDBmOWU3Li4zZjlhNGZmIDEwMDY0NAotLS0gYS9mcy9udGZzL2F0dHJpYi5jCisrKyBiL2ZzL250ZnMvYXR0cmliLmMKQEAgLTQzLDYgKzQzLDkgQEAKICAqIHdoaWNoIGlzIG5vdCBhbiBlcnJvciBhcyBzdWNoLiAgVGhpcyBpcyAtRU5PRU5ULiAgSXQgbWVhbnMgdGhhdCBAdmNuIGlzIG91dAogICogb2YgYm91bmRzIG9mIHRoZSBydW5saXN0LgogICoKKyAqIE5vdGUgdGhlIHJ1bmxpc3QgY2FuIGJlIE5VTEwgYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGlmIEB2Y24gaXMgemVybyBhbmQKKyAqIHRoZSBhdHRyaWJ1dGUgaGFzIHplcm8gYWxsb2NhdGVkIHNpemUsIGkuZS4gdGhlcmUgc2ltcGx5IGlzIG5vIHJ1bmxpc3QuCisgKgogICogTG9ja2luZzogLSBUaGUgcnVubGlzdCBtdXN0IGJlIGxvY2tlZCBmb3Igd3JpdGluZy4KICAqCSAgICAtIFRoaXMgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIHJ1bmxpc3QuCiAgKi8KQEAgLTU0LDYgKzU3LDcgQEAKIAlBVFRSX1JFQ09SRCAqYTsKIAludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OwogCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyID0gMDsKIAogCW50ZnNfZGVidWcoIk1hcHBpbmcgcnVubGlzdCBwYXJ0IGNvbnRhaW5pbmcgdmNuIDB4JWxseC4iLApAQCAtODUsOCArODksMTEgQEAKIAkgKiBudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcygpIGZhaWxzLgogCSAqLwogCWVuZF92Y24gPSBzbGU2NF90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQuaGlnaGVzdF92Y24pICsgMTsKLQlpZiAodW5saWtlbHkoIWEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24gJiYgZW5kX3ZjbiA8PSAxKSkKKwlpZiAodW5saWtlbHkoIWEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24gJiYgZW5kX3ZjbiA8PSAxKSkgeworCQlyZWFkX2xvY2tfaXJxc2F2ZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCQllbmRfdmNuID0gbmktPmFsbG9jYXRlZF9zaXplID4+IG5pLT52b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzOworCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJfQogCWlmICh1bmxpa2VseSh2Y24gPj0gZW5kX3ZjbikpIHsKIAkJZXJyID0gLUVOT0VOVDsKIAkJZ290byBlcnJfb3V0OwpAQCAtMTY1LDYgKzE3Miw3IEBACiAJCWNvbnN0IEJPT0wgd3JpdGVfbG9ja2VkKQogewogCUxDTiBsY247CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlCT09MIGlzX3JldHJ5ID0gRkFMU0U7CiAKIAludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaV9pbm8gMHglbHgsIHZjbiAweCVsbHgsICVzX2xvY2tlZC4iLApAQCAtMTczLDYgKzE4MSwxNCBAQAogCUJVR19PTighbmkpOwogCUJVR19PTighTklub05vblJlc2lkZW50KG5pKSk7CiAJQlVHX09OKHZjbiA8IDApOworCWlmICghbmktPnJ1bmxpc3QucmwpIHsKKwkJcmVhZF9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwkJaWYgKCFuaS0+YWxsb2NhdGVkX3NpemUpIHsKKwkJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiBMQ05fRU5PRU5UOworCQl9CisJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwl9CiByZXRyeV9yZW1hcDoKIAkvKiBDb252ZXJ0IHZjbiB0byBsY24uICBJZiB0aGF0IGZhaWxzIG1hcCB0aGUgcnVubGlzdCBhbmQgcmV0cnkgb25jZS4gKi8KIAlsY24gPSBudGZzX3JsX3Zjbl90b19sY24obmktPnJ1bmxpc3QucmwsIHZjbik7CkBAIC0yNTUsNiArMjcxLDcgQEAKIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19hdHRyX2ZpbmRfdmNuX25vbG9jayhudGZzX2lub2RlICpuaSwgY29uc3QgVkNOIHZjbiwKIAkJY29uc3QgQk9PTCB3cml0ZV9sb2NrZWQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlydW5saXN0X2VsZW1lbnQgKnJsOwogCWludCBlcnIgPSAwOwogCUJPT0wgaXNfcmV0cnkgPSBGQUxTRTsKQEAgLTI2NSw2ICsyODIsMTQgQEAKIAlCVUdfT04oIW5pKTsKIAlCVUdfT04oIU5Jbm9Ob25SZXNpZGVudChuaSkpOwogCUJVR19PTih2Y24gPCAwKTsKKwlpZiAoIW5pLT5ydW5saXN0LnJsKSB7CisJCXJlYWRfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJCWlmICghbmktPmFsbG9jYXRlZF9zaXplKSB7CisJCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwkJfQorCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJfQogcmV0cnlfcmVtYXA6CiAJcmwgPSBuaS0+cnVubGlzdC5ybDsKIAlpZiAobGlrZWx5KHJsICYmIHZjbiA+PSBybFswXS52Y24pKSB7CkBAIC01MjgsNiArNTUzLDExIEBACiAJYmxvY2tfc2l6ZV9iaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CiAJZG93bl9yZWFkKCZydW5saXN0LT5sb2NrKTsKIAlybCA9IHJ1bmxpc3QtPnJsOworCWlmICghcmwpIHsKKwkJbnRmc19lcnJvcihzYiwgIkNhbm5vdCByZWFkIGF0dHJpYnV0ZSBsaXN0IHNpbmNlIHJ1bmxpc3QgaXMgIgorCQkJCSJtaXNzaW5nLiIpOworCQlnb3RvIGVycl9vdXQ7CQorCX0KIAkvKiBSZWFkIGFsbCBjbHVzdGVycyBzcGVjaWZpZWQgYnkgdGhlIHJ1bmxpc3Qgb25lIHJ1biBhdCBhIHRpbWUuICovCiAJd2hpbGUgKHJsLT5sZW5ndGgpIHsKIAkJbGNuID0gbnRmc19ybF92Y25fdG9fbGNuKHJsLCBybC0+dmNuKTsKQEAgLTEyNDcsNiArMTI3Nyw0NiBAQAogfQogCiAvKioKKyAqIG50ZnNfcmVzaWRlbnRfYXR0cl92YWx1ZV9yZXNpemUgLSByZXNpemUgdGhlIHZhbHVlIG9mIGEgcmVzaWRlbnQgYXR0cmlidXRlCisgKiBAbToJCW1mdCByZWNvcmQgY29udGFpbmluZyBhdHRyaWJ1dGUgcmVjb3JkCisgKiBAYToJCWF0dHJpYnV0ZSByZWNvcmQgd2hvc2UgdmFsdWUgdG8gcmVzaXplCisgKiBAbmV3X3NpemU6CW5ldyBzaXplIGluIGJ5dGVzIHRvIHdoaWNoIHRvIHJlc2l6ZSB0aGUgYXR0cmlidXRlIHZhbHVlIG9mIEBhCisgKgorICogUmVzaXplIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIEBhIGluIHRoZSBtZnQgcmVjb3JkIEBtIHRvIEBuZXdfc2l6ZSBieXRlcy4KKyAqIElmIHRoZSB2YWx1ZSBpcyBtYWRlIGJpZ2dlciwgdGhlIG5ld2x5IGFsbG9jYXRlZCBzcGFjZSBpcyBjbGVhcmVkLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4gIFRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgYXJlCisgKiBkZWZpbmVkOgorICoJLUVOT1NQQwktIE5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIG1mdCByZWNvcmQgQG0gdG8gcGVyZm9ybSB0aGUgcmVzaXplLgorICoKKyAqIE5vdGU6IE9uIGVycm9yLCBubyBtb2RpZmljYXRpb25zIGhhdmUgYmVlbiBwZXJmb3JtZWQgd2hhdHNvZXZlci4KKyAqCisgKiBXYXJuaW5nOiBJZiB5b3UgbWFrZSBhIHJlY29yZCBzbWFsbGVyIHdpdGhvdXQgaGF2aW5nIGNvcGllZCBhbGwgdGhlIGRhdGEgeW91CisgKgkgICAgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRhdGEgbWF5IGJlIG92ZXJ3cml0dGVuLgorICovCitpbnQgbnRmc19yZXNpZGVudF9hdHRyX3ZhbHVlX3Jlc2l6ZShNRlRfUkVDT1JEICptLCBBVFRSX1JFQ09SRCAqYSwKKwkJY29uc3QgdTMyIG5ld19zaXplKQoreworCXUzMiBvbGRfc2l6ZTsKKworCS8qIFJlc2l6ZSB0aGUgcmVzaWRlbnQgcGFydCBvZiB0aGUgYXR0cmlidXRlIHJlY29yZC4gKi8KKwlpZiAobnRmc19hdHRyX3JlY29yZF9yZXNpemUobSwgYSwKKwkJCWxlMTZfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSArIG5ld19zaXplKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisJLyoKKwkgKiBUaGUgcmVzaXplIHN1Y2NlZWRlZCEgIElmIHdlIG1hZGUgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBiaWdnZXIsIGNsZWFyCisJICogdGhlIGFyZWEgYmV0d2VlbiB0aGUgb2xkIHNpemUgYW5kIEBuZXdfc2l6ZS4KKwkgKi8KKwlvbGRfc2l6ZSA9IGxlMzJfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwlpZiAobmV3X3NpemUgPiBvbGRfc2l6ZSkKKwkJbWVtc2V0KCh1OCopYSArIGxlMTZfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSArCisJCQkJb2xkX3NpemUsIDAsIG5ld19zaXplIC0gb2xkX3NpemUpOworCS8qIEZpbmFsbHkgdXBkYXRlIHRoZSBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gKi8KKwlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCA9IGNwdV90b19sZTMyKG5ld19zaXplKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBudGZzX2F0dHJfbWFrZV9ub25fcmVzaWRlbnQgLSBjb252ZXJ0IGEgcmVzaWRlbnQgdG8gYSBub24tcmVzaWRlbnQgYXR0cmlidXRlCiAgKiBAbmk6CQludGZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIGF0dHJpYnV0ZSB0byBjb252ZXJ0CiAgKgpAQCAtMTMwMiw2ICsxMzcyLDEyIEBACiAJCXJldHVybiBlcnI7CiAJfQogCS8qCisJICogRklYTUU6IENvbXByZXNzZWQgYW5kIGVuY3J5cHRlZCBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkIHdoZW4KKwkgKiB3cml0aW5nIGFuZCB3ZSBzaG91bGQgbmV2ZXIgaGF2ZSBnb3R0ZW4gaGVyZSBmb3IgdGhlbS4KKwkgKi8KKwlCVUdfT04oTklub0NvbXByZXNzZWQobmkpKTsKKwlCVUdfT04oTklub0VuY3J5cHRlZChuaSkpOworCS8qCiAJICogVGhlIHNpemUgbmVlZHMgdG8gYmUgYWxpZ25lZCB0byBhIGNsdXN0ZXIgYm91bmRhcnkgZm9yIGFsbG9jYXRpb24KIAkgKiBwdXJwb3Nlcy4KIAkgKi8KQEAgLTEzNzcsMTAgKzE0NTMsMTUgQEAKIAlCVUdfT04oYS0+bm9uX3Jlc2lkZW50KTsKIAkvKgogCSAqIENhbGN1bGF0ZSBuZXcgb2Zmc2V0cyBmb3IgdGhlIG5hbWUgYW5kIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5LgotCSAqIFdlIGFzc3VtZSB0aGUgYXR0cmlidXRlIGlzIG5vdCBjb21wcmVzc2VkIG9yIHNwYXJzZS4KIAkgKi8KLQluYW1lX29mcyA9IChvZmZzZXRvZihBVFRSX1JFQywKLQkJCWRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzZWRfc2l6ZSkgKyA3KSAmIH43OworCWlmIChOSW5vU3BhcnNlKG5pKSB8fCBOSW5vQ29tcHJlc3NlZChuaSkpCisJCW5hbWVfb2ZzID0gKG9mZnNldG9mKEFUVFJfUkVDLAorCQkJCWRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzZWRfc2l6ZSkgKworCQkJCXNpemVvZihhLT5kYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2VkX3NpemUpICsKKwkJCQk3KSAmIH43OworCWVsc2UKKwkJbmFtZV9vZnMgPSAob2Zmc2V0b2YoQVRUUl9SRUMsCisJCQkJZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3NlZF9zaXplKSArIDcpICYgfjc7CiAJbXBfb2ZzID0gKG5hbWVfb2ZzICsgYS0+bmFtZV9sZW5ndGggKiBzaXplb2YobnRmc2NoYXIpICsgNykgJiB+NzsKIAkvKgogCSAqIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgcmVzaWRlbnQgcGFydCBvZiB0aGUgbm93IG5vbi1yZXNpZGVudApAQCAtMTQxOSwyNCArMTUwMCwyMyBAQAogCQltZW1tb3ZlKCh1OCopYSArIG5hbWVfb2ZzLCAodTgqKWEgKyBsZTE2X3RvX2NwdShhLT5uYW1lX29mZnNldCksCiAJCQkJYS0+bmFtZV9sZW5ndGggKiBzaXplb2YobnRmc2NoYXIpKTsKIAlhLT5uYW1lX29mZnNldCA9IGNwdV90b19sZTE2KG5hbWVfb2ZzKTsKLQkvKgotCSAqIEZJWE1FOiBGb3Igbm93IGp1c3QgY2xlYXIgYWxsIG9mIHRoZXNlIGFzIHdlIGRvIG5vdCBzdXBwb3J0IHRoZW0KLQkgKiB3aGVuIHdyaXRpbmcuCi0JICovCi0JYS0+ZmxhZ3MgJj0gY3B1X3RvX2xlMTYoMHhmZmZmICYgfmxlMTZfdG9fY3B1KEFUVFJfSVNfU1BBUlNFIHwKLQkJCUFUVFJfSVNfRU5DUllQVEVEIHwgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSk7CiAJLyogU2V0dXAgdGhlIGZpZWxkcyBzcGVjaWZpYyB0byBub24tcmVzaWRlbnQgYXR0cmlidXRlcy4gKi8KIAlhLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuID0gMDsKIAlhLT5kYXRhLm5vbl9yZXNpZGVudC5oaWdoZXN0X3ZjbiA9IGNwdV90b19zbGU2NCgobmV3X3NpemUgLSAxKSA+PgogCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cyk7CiAJYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQgPSBjcHVfdG9fbGUxNihtcF9vZnMpOwotCWEtPmRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzaW9uX3VuaXQgPSAwOwogCW1lbXNldCgmYS0+ZGF0YS5ub25fcmVzaWRlbnQucmVzZXJ2ZWQsIDAsCiAJCQlzaXplb2YoYS0+ZGF0YS5ub25fcmVzaWRlbnQucmVzZXJ2ZWQpKTsKIAlhLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSA9IGNwdV90b19zbGU2NChuZXdfc2l6ZSk7CiAJYS0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplID0KIAkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUgPQogCQkJY3B1X3RvX3NsZTY0KGF0dHJfc2l6ZSk7CisJaWYgKE5Jbm9TcGFyc2UobmkpIHx8IE5Jbm9Db21wcmVzc2VkKG5pKSkgeworCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2lvbl91bml0ID0gNDsKKwkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3NlZF9zaXplID0KKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZTsKKwl9IGVsc2UKKwkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3Npb25fdW5pdCA9IDA7CiAJLyogR2VuZXJhdGUgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkgaW50byB0aGUgYXR0cmlidXRlIHJlY29yZC4gKi8KIAllcnIgPSBudGZzX21hcHBpbmdfcGFpcnNfYnVpbGQodm9sLCAodTgqKWEgKyBtcF9vZnMsCiAJCQlhcmVjX3NpemUgLSBtcF9vZnMsIHJsLCAwLCAtMSwgTlVMTCk7CkBAIC0xNDQ2LDE2ICsxNTI2LDE5IEBACiAJCWdvdG8gdW5kb19lcnJfb3V0OwogCX0KIAkvKiBTZXR1cCB0aGUgaW4tbWVtb3J5IGF0dHJpYnV0ZSBzdHJ1Y3R1cmUgdG8gYmUgbm9uLXJlc2lkZW50LiAqLwotCS8qCi0JICogRklYTUU6IEZvciBub3cganVzdCBjbGVhciBhbGwgb2YgdGhlc2UgYXMgd2UgZG8gbm90IHN1cHBvcnQgdGhlbQotCSAqIHdoZW4gd3JpdGluZy4KLQkgKi8KLQlOSW5vQ2xlYXJTcGFyc2UobmkpOwotCU5Jbm9DbGVhckVuY3J5cHRlZChuaSk7Ci0JTklub0NsZWFyQ29tcHJlc3NlZChuaSk7CiAJbmktPnJ1bmxpc3QucmwgPSBybDsKIAl3cml0ZV9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAluaS0+YWxsb2NhdGVkX3NpemUgPSBuZXdfc2l6ZTsKKwlpZiAoTklub1NwYXJzZShuaSkgfHwgTklub0NvbXByZXNzZWQobmkpKSB7CisJCW5pLT5pdHlwZS5jb21wcmVzc2VkLnNpemUgPSBuaS0+YWxsb2NhdGVkX3NpemU7CisJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemUgPSAxVSA8PAorCQkJCShhLT5kYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2lvbl91bml0ICsKKwkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKTsKKwkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZV9iaXRzID0KKwkJCQlmZnMobmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZSkgLSAxOworCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19jbHVzdGVycyA9IDFVIDw8CisJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3Npb25fdW5pdDsKKwl9CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkvKgogCSAqIFRoaXMgbmVlZHMgdG8gYmUgbGFzdCBzaW5jZSB0aGUgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIC0+cmVhZHBhZ2UKQEAgLTE2MDMsNiArMTY4NiwxMiBAQAogCUJVR19PTihjbnQgPCAwKTsKIAlpZiAoIWNudCkKIAkJZ290byBkb25lOworCS8qCisJICogRklYTUU6IENvbXByZXNzZWQgYW5kIGVuY3J5cHRlZCBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkIHdoZW4KKwkgKiB3cml0aW5nIGFuZCB3ZSBzaG91bGQgbmV2ZXIgaGF2ZSBnb3R0ZW4gaGVyZSBmb3IgdGhlbS4KKwkgKi8KKwlCVUdfT04oTklub0NvbXByZXNzZWQobmkpKTsKKwlCVUdfT04oTklub0VuY3J5cHRlZChuaSkpOwogCW1hcHBpbmcgPSBWRlNfSShuaSktPmlfbWFwcGluZzsKIAkvKiBXb3JrIG91dCB0aGUgc3RhcnRpbmcgaW5kZXggYW5kIHBhZ2Ugb2Zmc2V0LiAqLwogCWlkeCA9IG9mcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9hdHRyaWIuaCBiL2ZzL250ZnMvYXR0cmliLmgKaW5kZXggMGU0YWM2ZC4uMDYxOGVkNiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9hdHRyaWIuaAorKysgYi9mcy9udGZzL2F0dHJpYi5oCkBAIC05OSw2ICs5OSw4IEBACiAJCWNvbnN0IEFUVFJfVFlQRSB0eXBlKTsKIAogZXh0ZXJuIGludCBudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZShNRlRfUkVDT1JEICptLCBBVFRSX1JFQ09SRCAqYSwgdTMyIG5ld19zaXplKTsKK2V4dGVybiBpbnQgbnRmc19yZXNpZGVudF9hdHRyX3ZhbHVlX3Jlc2l6ZShNRlRfUkVDT1JEICptLCBBVFRSX1JFQ09SRCAqYSwKKwkJY29uc3QgdTMyIG5ld19zaXplKTsKIAogZXh0ZXJuIGludCBudGZzX2F0dHJfbWFrZV9ub25fcmVzaWRlbnQobnRmc19pbm9kZSAqbmkpOwogCmRpZmYgLS1naXQgYS9mcy9udGZzL2NvbXByZXNzLmMgYi9mcy9udGZzL2NvbXByZXNzLmMKaW5kZXggNmQyNjVjZi4uMjVkMjQxMCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9jb21wcmVzcy5jCisrKyBiL2ZzL250ZnMvY29tcHJlc3MuYwpAQCAtNTM5LDcgKzUzOSw2IEBACiAJaWYgKHVubGlrZWx5KCFwYWdlcyB8fCAhYmhzKSkgewogCQlrZnJlZShiaHMpOwogCQlrZnJlZShwYWdlcyk7Ci0JCVNldFBhZ2VFcnJvcihwYWdlKTsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXJzLiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTg3MSw5ICs4NzAsNiBAQAogCQkJZm9yICg7IHByZXZfY3VyX3BhZ2UgPCBjdXJfcGFnZTsgcHJldl9jdXJfcGFnZSsrKSB7CiAJCQkJcGFnZSA9IHBhZ2VzW3ByZXZfY3VyX3BhZ2VdOwogCQkJCWlmIChwYWdlKSB7Ci0JCQkJCWlmIChwcmV2X2N1cl9wYWdlID09IHhwYWdlICYmCi0JCQkJCQkJIXhwYWdlX2RvbmUpCi0JCQkJCQlTZXRQYWdlRXJyb3IocGFnZSk7CiAJCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCQkJCQlrdW5tYXAocGFnZSk7CiAJCQkJCXVubG9ja19wYWdlKHBhZ2UpOwpAQCAtOTA0LDggKzkwMCw2IEBACiAJCQkJCSJUZXJtaW5hdGluZyB0aGVtIHdpdGggZXh0cmVtZSAiCiAJCQkJCSJwcmVqdWRpY2UuICBJbm9kZSAweCVseCwgcGFnZSBpbmRleCAiCiAJCQkJCSIweCVseC4iLCBuaS0+bWZ0X25vLCBwYWdlLT5pbmRleCk7Ci0JCQlpZiAoY3VyX3BhZ2UgPT0geHBhZ2UgJiYgIXhwYWdlX2RvbmUpCi0JCQkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAJCQlrdW5tYXAocGFnZSk7CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKQEAgLTk1Myw4ICs5NDcsNiBAQAogCWZvciAoaSA9IGN1cl9wYWdlOyBpIDwgbWF4X3BhZ2U7IGkrKykgewogCQlwYWdlID0gcGFnZXNbaV07CiAJCWlmIChwYWdlKSB7Ci0JCQlpZiAoaSA9PSB4cGFnZSAmJiAheHBhZ2VfZG9uZSkKLQkJCQlTZXRQYWdlRXJyb3IocGFnZSk7CiAJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKIAkJCWt1bm1hcChwYWdlKTsKIAkJCXVubG9ja19wYWdlKHBhZ2UpOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9kaXIuYyBiL2ZzL250ZnMvZGlyLmMKaW5kZXggNDY3Nzk0Ny4uNzk1YzNkMSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9kaXIuYworKysgYi9mcy9udGZzL2Rpci5jCkBAIC0xMDUxLDcgKzEwNTEsOCBAQAogCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgJm5hbWUsCiAJCQlOVEZTX01BWF9OQU1FX0xFTiAqIE5MU19NQVhfQ0hBUlNFVF9TSVpFICsgMSk7CiAJaWYgKG5hbWVfbGVuIDw9IDApIHsKLQkJbnRmc19kZWJ1ZygiU2tpcHBpbmcgdW5yZXByZXNlbnRhYmxlIGZpbGUuIik7CisJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiU2tpcHBpbmcgdW5yZXByZXNlbnRhYmxlIGlub2RlIDB4JWxseC4iLAorCQkJCShsb25nIGxvbmcpTVJFRl9MRShpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKSk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoaWUtPmtleS5maWxlX25hbWUuZmlsZV9hdHRyaWJ1dGVzICYKZGlmZiAtLWdpdCBhL2ZzL250ZnMvZmlsZS5jIGIvZnMvbnRmcy9maWxlLmMKaW5kZXggZTBmNTMwYy4uYmU5ZmQxZCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9maWxlLmMKKysrIGIvZnMvbnRmcy9maWxlLmMKQEAgLTEsNyArMSw3IEBACiAvKgotICogZmlsZS5jIC0gTlRGUyBrZXJuZWwgZmlsZSBvcGVyYXRpb25zLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKiBmaWxlLmMgLSBOVEZTIGtlcm5lbCBmaWxlIG9wZXJhdGlvbnMuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCkBAIC05NCw2ICs5NCwxMSBAQAogCWlmICghZGF0YXN5bmMgfHwgIU5Jbm9Ob25SZXNpZGVudChOVEZTX0kodmkpKSkKIAkJcmV0ID0gbnRmc193cml0ZV9pbm9kZSh2aSwgMSk7CiAJd3JpdGVfaW5vZGVfbm93KHZpLCAhZGF0YXN5bmMpOworCS8qCisJICogTk9URTogSWYgd2Ugd2VyZSB0byB1c2UgbWFwcGluZy0+cHJpdmF0ZV9saXN0IChzZWUgZXh0MiBhbmQKKwkgKiBmcy9idWZmZXIuYykgZm9yIGRpcnR5IGJsb2NrcyB0aGVuIHdlIGNvdWxkIG9wdGltaXplIHRoZSBiZWxvdyB0byBiZQorCSAqIHN5bmNfbWFwcGluZ19idWZmZXJzKHZpLT5pX21hcHBpbmcpLgorCSAqLwogCWVyciA9IHN5bmNfYmxvY2tkZXYodmktPmlfc2ItPnNfYmRldik7CiAJaWYgKHVubGlrZWx5KGVyciAmJiAhcmV0KSkKIAkJcmV0ID0gZXJyOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9pbmRleC5jIGIvZnMvbnRmcy9pbmRleC5jCmluZGV4IDExZmQ1MzAuLjhmMmQ1NzIgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvaW5kZXguYworKysgYi9mcy9udGZzL2luZGV4LmMKQEAgLTIwNSw2ICsyMDUsNyBAQAogCQkJCSZpZS0+a2V5LCBrZXlfbGVuKSkgewogaXJfZG9uZToKIAkJCWljdHgtPmlzX2luX3Jvb3QgPSBUUlVFOworCQkJaWN0eC0+aXIgPSBpcjsKIAkJCWljdHgtPmFjdHggPSBhY3R4OwogCQkJaWN0eC0+YmFzZV9uaSA9IGJhc2Vfbmk7CiAJCQlpY3R4LT5pYSA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9udGZzL2lub2RlLmMgYi9mcy9udGZzL2lub2RlLmMKaW5kZXggODg2MjE0YS4uZGM0YmJlMyAxMDA2NDQKLS0tIGEvZnMvbnRmcy9pbm9kZS5jCisrKyBiL2ZzL250ZnMvaW5vZGUuYwpAQCAtMTAxMyw0MSArMTAxMyw1MCBAQAogCQl9CiAJCWEgPSBjdHgtPmF0dHI7CiAJCS8qIFNldHVwIHRoZSBzdGF0ZS4gKi8KLQkJaWYgKGEtPm5vbl9yZXNpZGVudCkgewotCQkJTklub1NldE5vblJlc2lkZW50KG5pKTsKLQkJCWlmIChhLT5mbGFncyAmIChBVFRSX0NPTVBSRVNTSU9OX01BU0sgfAotCQkJCQlBVFRSX0lTX1NQQVJTRSkpIHsKLQkJCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKLQkJCQkJTklub1NldENvbXByZXNzZWQobmkpOwotCQkJCQlpZiAodm9sLT5jbHVzdGVyX3NpemUgPiA0MDk2KSB7Ci0JCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgorCQlpZiAoYS0+ZmxhZ3MgJiAoQVRUUl9DT01QUkVTU0lPTl9NQVNLIHwgQVRUUl9JU19TUEFSU0UpKSB7CisJCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCQlOSW5vU2V0Q29tcHJlc3NlZChuaSk7CisJCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplID4gNDA5NikgeworCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgogCQkJCQkJCSJjb21wcmVzc2VkIGRhdGEgYnV0ICIKIAkJCQkJCQkiY29tcHJlc3Npb24gaXMgIgogCQkJCQkJCSJkaXNhYmxlZCBkdWUgdG8gIgogCQkJCQkJCSJjbHVzdGVyIHNpemUgKCVpKSA+ICIKIAkJCQkJCQkiNGtpQi4iLAogCQkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplKTsKLQkJCQkJCWdvdG8gdW5tX2Vycl9vdXQ7Ci0JCQkJCX0KLQkJCQkJaWYgKChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykKLQkJCQkJCQkhPSBBVFRSX0lTX0NPTVBSRVNTRUQpIHsKLQkJCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCAiCi0JCQkJCQkJInVua25vd24gY29tcHJlc3Npb24gIgotCQkJCQkJCSJtZXRob2Qgb3IgY29ycnVwdCAiCi0JCQkJCQkJImZpbGUuIik7Ci0JCQkJCQlnb3RvIHVubV9lcnJfb3V0OwotCQkJCQl9CisJCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCQkJfQotCQkJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKQotCQkJCQlOSW5vU2V0U3BhcnNlKG5pKTsKKwkJCQlpZiAoKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKQorCQkJCQkJIT0gQVRUUl9JU19DT01QUkVTU0VEKSB7CisJCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCB1bmtub3duICIKKwkJCQkJCQkiY29tcHJlc3Npb24gbWV0aG9kICIKKwkJCQkJCQkib3IgY29ycnVwdCBmaWxlLiIpOworCQkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJCX0KKwkJCX0KKwkJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKQorCQkJCU5Jbm9TZXRTcGFyc2UobmkpOworCQl9CisJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CisJCQlpZiAoTklub0NvbXByZXNzZWQobmkpKSB7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGVuY3J5cHRlZCBhbmQgIgorCQkJCQkJImNvbXByZXNzZWQgZGF0YS4iKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJTklub1NldEVuY3J5cHRlZChuaSk7CisJCX0KKwkJaWYgKGEtPm5vbl9yZXNpZGVudCkgeworCQkJTklub1NldE5vblJlc2lkZW50KG5pKTsKKwkJCWlmIChOSW5vQ29tcHJlc3NlZChuaSkgfHwgTklub1NwYXJzZShuaSkpIHsKIAkJCQlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3Npb25fdW5pdCAhPQogCQkJCQkJNCkgewogCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgotCQkJCQkJIm5vbnN0YW5kYXJkIGNvbXByZXNzaW9uIHVuaXQgIgotCQkJCQkJIigldSBpbnN0ZWFkIG9mIDQpLiAgQ2Fubm90ICIKLQkJCQkJCSJoYW5kbGUgdGhpcy4iLAotCQkJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuCi0JCQkJCQljb21wcmVzc2lvbl91bml0KTsKKwkJCQkJCQkibm9uc3RhbmRhcmQgIgorCQkJCQkJCSJjb21wcmVzc2lvbiB1bml0ICgldSAiCisJCQkJCQkJImluc3RlYWQgb2YgNCkuICAiCisJCQkJCQkJIkNhbm5vdCBoYW5kbGUgdGhpcy4iLAorCQkJCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQkJCWNvbXByZXNzaW9uX3VuaXQpOwogCQkJCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJCQkJZ290byB1bm1fZXJyX291dDsKIAkJCQl9CkBAIC0xMDY1LDE0ICsxMDc0LDYgQEAKIAkJCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LgogCQkJCQkJY29tcHJlc3NlZF9zaXplKTsKIAkJCX0KLQkJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7Ci0JCQkJaWYgKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7Ci0JCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBlbmNyeXB0ZWQgIgotCQkJCQkJCSJhbmQgY29tcHJlc3NlZCBkYXRhLiIpOwotCQkJCQlnb3RvIHVubV9lcnJfb3V0OwotCQkJCX0KLQkJCQlOSW5vU2V0RW5jcnlwdGVkKG5pKTsKLQkJCX0KIAkJCWlmIChhLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CiAJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZpcnN0IGV4dGVudCBvZiAkREFUQSAiCiAJCQkJCQkiYXR0cmlidXRlIGhhcyBub24gemVybyAiCkBAIC0xMjEyLDYgKzEyMTMsNzUgQEAKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJZ290byB1bm1fZXJyX291dDsKIAlhID0gY3R4LT5hdHRyOworCWlmIChhLT5mbGFncyAmIChBVFRSX0NPTVBSRVNTSU9OX01BU0sgfCBBVFRSX0lTX1NQQVJTRSkpIHsKKwkJaWYgKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCQlOSW5vU2V0Q29tcHJlc3NlZChuaSk7CisJCQlpZiAoKG5pLT50eXBlICE9IEFUX0RBVEEpIHx8IChuaS0+dHlwZSA9PSBBVF9EQVRBICYmCisJCQkJCW5pLT5uYW1lX2xlbikpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZCAiCisJCQkJCQkibm9uLWRhdGEgb3IgbmFtZWQgZGF0YSAiCisJCQkJCQkiYXR0cmlidXRlLiAgUGxlYXNlIHJlcG9ydCAiCisJCQkJCQkieW91IHNhdyB0aGlzIG1lc3NhZ2UgdG8gIgorCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKKwkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplID4gNDA5NikgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBjb21wcmVzc2VkICIKKwkJCQkJCSJhdHRyaWJ1dGUgYnV0IGNvbXByZXNzaW9uIGlzICIKKwkJCQkJCSJkaXNhYmxlZCBkdWUgdG8gY2x1c3RlciBzaXplICIKKwkJCQkJCSIoJWkpID4gNGtpQi4iLAorCQkJCQkJdm9sLT5jbHVzdGVyX3NpemUpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQlpZiAoKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSAhPQorCQkJCQlBVFRSX0lTX0NPTVBSRVNTRUQpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgdW5rbm93biAiCisJCQkJCQkiY29tcHJlc3Npb24gbWV0aG9kLiIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCX0KKwkJLyoKKwkJICogVGhlIGVuY3J5cHRpb24gZmxhZyBzZXQgaW4gYW4gaW5kZXggcm9vdCBqdXN0IG1lYW5zIHRvCisJCSAqIGNvbXByZXNzIGFsbCBmaWxlcy4KKwkJICovCisJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSAmJiBuaS0+dHlwZSAhPSBBVF9JTkRFWF9ST09UKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbXN0IHByb3RlY3RlZCBhdHRyaWJ1dGUgIgorCQkJCQkiYnV0IHRoZSBhdHRyaWJ1dGUgaXMgJXMuICBQbGVhc2UgIgorCQkJCQkicmVwb3J0IHlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldCIsCisJCQkJCU5Jbm9Db21wcmVzc2VkKG5pKSA/ICJjb21wcmVzc2VkIiA6CisJCQkJCSJzcGFyc2UiKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKGEtPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpCisJCQlOSW5vU2V0U3BhcnNlKG5pKTsKKwl9CisJaWYgKGEtPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQpIHsKKwkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGVuY3J5cHRlZCBhbmQgY29tcHJlc3NlZCAiCisJCQkJCSJkYXRhLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBUaGUgZW5jcnlwdGlvbiBmbGFnIHNldCBpbiBhbiBpbmRleCByb290IGp1c3QgbWVhbnMgdG8KKwkJICogZW5jcnlwdCBhbGwgZmlsZXMuCisJCSAqLworCQlpZiAoTklub01zdFByb3RlY3RlZChuaSkgJiYgbmktPnR5cGUgIT0gQVRfSU5ERVhfUk9PVCkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIG1zdCBwcm90ZWN0ZWQgYXR0cmlidXRlICIKKwkJCQkJImJ1dCB0aGUgYXR0cmlidXRlIGlzIGVuY3J5cHRlZC4gICIKKwkJCQkJIlBsZWFzZSByZXBvcnQgeW91IHNhdyB0aGlzIG1lc3NhZ2UgIgorCQkJCQkidG8gbGludXgtbnRmcy1kZXZAbGlzdHMuc291cmNlZm9yZ2UuIgorCQkJCQkibmV0Iik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChuaS0+dHlwZSAhPSBBVF9EQVRBKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgZW5jcnlwdGVkIG5vbi1kYXRhICIKKwkJCQkJImF0dHJpYnV0ZS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJTklub1NldEVuY3J5cHRlZChuaSk7CisJfQogCWlmICghYS0+bm9uX3Jlc2lkZW50KSB7CiAJCS8qIEVuc3VyZSB0aGUgYXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkIGJlZm9yZSB0aGUgdmFsdWUuICovCiAJCWlmICh1bmxpa2VseShhLT5uYW1lX2xlbmd0aCAmJiAobGUxNl90b19jcHUoYS0+bmFtZV9vZmZzZXQpID49CkBAIC0xMjIwLDExICsxMjkwLDEwIEBACiAJCQkJCSJ0aGUgYXR0cmlidXRlIHZhbHVlLiIpOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQotCQlpZiAoTklub01zdFByb3RlY3RlZChuaSkgfHwgYS0+ZmxhZ3MpIHsKKwkJaWYgKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpKSB7CiAJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbXN0IHByb3RlY3RlZCBhdHRyaWJ1dGUgIgotCQkJCQkib3IgYXR0cmlidXRlIHdpdGggbm9uLXplcm8gZmxhZ3MgYnV0ICIKLQkJCQkJInRoZSBhdHRyaWJ1dGUgaXMgcmVzaWRlbnQuICBQbGVhc2UgIgotCQkJCQkicmVwb3J0IHlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJImJ1dCB0aGUgYXR0cmlidXRlIGlzIHJlc2lkZW50LiAgIgorCQkJCQkiUGxlYXNlIHJlcG9ydCB5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCiAJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQiKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KQEAgLTEyNTAsNTAgKzEzMTksOCBAQAogCQkJCQkidGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkuIik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9Ci0JCWlmIChhLT5mbGFncyAmIChBVFRSX0NPTVBSRVNTSU9OX01BU0sgfCBBVFRSX0lTX1NQQVJTRSkpIHsKLQkJCWlmIChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgewotCQkJCU5Jbm9TZXRDb21wcmVzc2VkKG5pKTsKLQkJCQlpZiAoKG5pLT50eXBlICE9IEFUX0RBVEEpIHx8IChuaS0+dHlwZSA9PQotCQkJCQkJQVRfREFUQSAmJiBuaS0+bmFtZV9sZW4pKSB7Ci0JCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBjb21wcmVzc2VkICIKLQkJCQkJCQkibm9uLWRhdGEgb3IgbmFtZWQgIgotCQkJCQkJCSJkYXRhIGF0dHJpYnV0ZS4gICIKLQkJCQkJCQkiUGxlYXNlIHJlcG9ydCB5b3UgIgotCQkJCQkJCSJzYXcgdGhpcyBtZXNzYWdlIHRvICIKLQkJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgotCQkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiKTsKLQkJCQkJZ290byB1bm1fZXJyX291dDsKLQkJCQl9Ci0JCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplID4gNDA5NikgewotCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZCAiCi0JCQkJCQkJImF0dHJpYnV0ZSBidXQgIgotCQkJCQkJCSJjb21wcmVzc2lvbiBpcyAiCi0JCQkJCQkJImRpc2FibGVkIGR1ZSB0byAiCi0JCQkJCQkJImNsdXN0ZXIgc2l6ZSAoJWkpID4gIgotCQkJCQkJCSI0a2lCLiIsCi0JCQkJCQkJdm9sLT5jbHVzdGVyX3NpemUpOwotCQkJCQlnb3RvIHVubV9lcnJfb3V0OwotCQkJCX0KLQkJCQlpZiAoKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSAhPQotCQkJCQkJQVRUUl9JU19DT01QUkVTU0VEKSB7Ci0JCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCB1bmtub3duICIKLQkJCQkJCQkiY29tcHJlc3Npb24gbWV0aG9kLiIpOwotCQkJCQlnb3RvIHVubV9lcnJfb3V0OwotCQkJCX0KLQkJCX0KLQkJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkgewotCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBtc3QgcHJvdGVjdGVkICIKLQkJCQkJCSJhdHRyaWJ1dGUgYnV0IHRoZSBhdHRyaWJ1dGUgIgotCQkJCQkJImlzICVzLiAgUGxlYXNlIHJlcG9ydCB5b3UgIgotCQkJCQkJInNhdyB0aGlzIG1lc3NhZ2UgdG8gIgotCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKLQkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiLAotCQkJCQkJTklub0NvbXByZXNzZWQobmkpID8KLQkJCQkJCSJjb21wcmVzc2VkIiA6ICJzcGFyc2UiKTsKLQkJCQlnb3RvIHVubV9lcnJfb3V0OwotCQkJfQotCQkJaWYgKGEtPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpCi0JCQkJTklub1NldFNwYXJzZShuaSk7CisJCWlmICgoTklub0NvbXByZXNzZWQobmkpIHx8IE5Jbm9TcGFyc2UobmkpKSAmJgorCQkJCW5pLT50eXBlICE9IEFUX0lOREVYX1JPT1QpIHsKIAkJCWlmIChhLT5kYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2lvbl91bml0ICE9IDQpIHsKIAkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbm9uc3RhbmRhcmQgIgogCQkJCQkJImNvbXByZXNzaW9uIHVuaXQgKCV1IGluc3RlYWQgIgpAQCAtMTMxMywyMyArMTM0MCw2IEBACiAJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5zaXplID0gc2xlNjRfdG9fY3B1KAogCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2VkX3NpemUpOwogCQl9Ci0JCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7Ci0JCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKLQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgZW5jcnlwdGVkIGFuZCAiCi0JCQkJCQkiY29tcHJlc3NlZCBkYXRhLiIpOwotCQkJCWdvdG8gdW5tX2Vycl9vdXQ7Ci0JCQl9Ci0JCQlpZiAoTklub01zdFByb3RlY3RlZChuaSkpIHsKLQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbXN0IHByb3RlY3RlZCAiCi0JCQkJCQkiYXR0cmlidXRlIGJ1dCB0aGUgYXR0cmlidXRlICIKLQkJCQkJCSJpcyBlbmNyeXB0ZWQuICBQbGVhc2UgcmVwb3J0ICIKLQkJCQkJCSJ5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCi0JCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgotCQkJCQkJInNvdXJjZWZvcmdlLm5ldCIpOwotCQkJCWdvdG8gdW5tX2Vycl9vdXQ7Ci0JCQl9Ci0JCQlOSW5vU2V0RW5jcnlwdGVkKG5pKTsKLQkJfQogCQlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgewogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZpcnN0IGV4dGVudCBvZiBhdHRyaWJ1dGUgaGFzICIKIAkJCQkJIm5vbi16ZXJvIGxvd2VzdF92Y24uIik7CkBAIC0xMzQ4LDEyICsxMzU4LDEyIEBACiAJCXZpLT5pX21hcHBpbmctPmFfb3BzID0gJm50ZnNfbXN0X2FvcHM7CiAJZWxzZQogCQl2aS0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX2FvcHM7Ci0JaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSB8fCBOSW5vU3BhcnNlKG5pKSkKKwlpZiAoKE5Jbm9Db21wcmVzc2VkKG5pKSB8fCBOSW5vU3BhcnNlKG5pKSkgJiYgbmktPnR5cGUgIT0gQVRfSU5ERVhfUk9PVCkKIAkJdmktPmlfYmxvY2tzID0gbmktPml0eXBlLmNvbXByZXNzZWQuc2l6ZSA+PiA5OwogCWVsc2UKIAkJdmktPmlfYmxvY2tzID0gbmktPmFsbG9jYXRlZF9zaXplID4+IDk7CiAJLyoKLQkgKiBNYWtlIHN1cmUgdGhlIGJhc2UgaW5vZGUgZG9lc24ndCBnbyBhd2F5IGFuZCBhdHRhY2ggaXQgdG8gdGhlCisJICogTWFrZSBzdXJlIHRoZSBiYXNlIGlub2RlIGRvZXMgbm90IGdvIGF3YXkgYW5kIGF0dGFjaCBpdCB0byB0aGUKIAkgKiBhdHRyaWJ1dGUgaW5vZGUuCiAJICovCiAJaWdyYWIoYmFzZV92aSk7CkBAIC0xNDgwLDcgKzE0OTAsMTAgQEAKIAkJCQkiYWZ0ZXIgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4iKTsKIAkJZ290byB1bm1fZXJyX291dDsKIAl9Ci0JLyogQ29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlIGluZGV4IHJvb3QgaXMgbm90IGFsbG93ZWQuICovCisJLyoKKwkgKiBDb21wcmVzc2VkL2VuY3J5cHRlZC9zcGFyc2UgaW5kZXggcm9vdCBpcyBub3QgYWxsb3dlZCwgZXhjZXB0IGZvcgorCSAqIGRpcmVjdG9yaWVzIG9mIGNvdXJzZSBidXQgdGhvc2UgYXJlIG5vdCBkZWFsdCB3aXRoIGhlcmUuCisJICovCiAJaWYgKGEtPmZsYWdzICYgKEFUVFJfQ09NUFJFU1NJT05fTUFTSyB8IEFUVFJfSVNfRU5DUllQVEVEIHwKIAkJCUFUVFJfSVNfU1BBUlNFKSkgewogCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlIGluZGV4ICIKQEAgLTI0MzAsMTYgKzI0NDMsMTggQEAKIAkJCSAqIFdlIHNraXBwZWQgdGhlIHRydW5jYXRlIGJ1dCBtdXN0IHN0aWxsIHVwZGF0ZQogCQkJICogdGltZXN0YW1wcy4KIAkJCSAqLwotCQkJaWFfdmFsaWQgfD0gQVRUUl9NVElNRXxBVFRSX0NUSU1FOworCQkJaWFfdmFsaWQgfD0gQVRUUl9NVElNRSB8IEFUVFJfQ1RJTUU7CiAJCX0KIAl9Ci0KIAlpZiAoaWFfdmFsaWQgJiBBVFRSX0FUSU1FKQotCQl2aS0+aV9hdGltZSA9IGF0dHItPmlhX2F0aW1lOworCQl2aS0+aV9hdGltZSA9IHRpbWVzcGVjX3RydW5jKGF0dHItPmlhX2F0aW1lLAorCQkJCXZpLT5pX3NiLT5zX3RpbWVfZ3Jhbik7CiAJaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRSkKLQkJdmktPmlfbXRpbWUgPSBhdHRyLT5pYV9tdGltZTsKKwkJdmktPmlfbXRpbWUgPSB0aW1lc3BlY190cnVuYyhhdHRyLT5pYV9tdGltZSwKKwkJCQl2aS0+aV9zYi0+c190aW1lX2dyYW4pOwogCWlmIChpYV92YWxpZCAmIEFUVFJfQ1RJTUUpCi0JCXZpLT5pX2N0aW1lID0gYXR0ci0+aWFfY3RpbWU7CisJCXZpLT5pX2N0aW1lID0gdGltZXNwZWNfdHJ1bmMoYXR0ci0+aWFfY3RpbWUsCisJCQkJdmktPmlfc2ItPnNfdGltZV9ncmFuKTsKIAltYXJrX2lub2RlX2RpcnR5KHZpKTsKIG91dDoKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9sY25hbGxvYy5jIGIvZnMvbnRmcy9sY25hbGxvYy5jCmluZGV4IGE0YmMwNzYuLjdiNTkzNDIgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvbGNuYWxsb2MuYworKysgYi9mcy9udGZzL2xjbmFsbG9jLmMKQEAgLTU0LDYgKzU0LDggQEAKIAlpbnQgcmV0ID0gMDsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCWlmICghcmwpCisJCXJldHVybiAwOwogCWZvciAoOyBybC0+bGVuZ3RoOyBybCsrKSB7CiAJCWludCBlcnI7CiAKQEAgLTE2MywxNyArMTY1LDkgQEAKIAlCVUdfT04oem9uZSA8IEZJUlNUX1pPTkUpOwogCUJVR19PTih6b25lID4gTEFTVF9aT05FKTsKIAotCS8qIFJldHVybiBlbXB0eSBydW5saXN0IGlmIEBjb3VudCA9PSAwICovCi0JLy8gRklYTUU6IERvIHdlIHdhbnQgdG8ganVzdCByZXR1cm4gTlVMTCBpbnN0ZWFkPyAoQUlBKQotCWlmICghY291bnQpIHsKLQkJcmwgPSBudGZzX21hbGxvY19ub2ZzKFBBR0VfU0laRSk7Ci0JCWlmICghcmwpCi0JCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQkJcmxbMF0udmNuID0gc3RhcnRfdmNuOwotCQlybFswXS5sY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKLQkJcmxbMF0ubGVuZ3RoID0gMDsKLQkJcmV0dXJuIHJsOwotCX0KKwkvKiBSZXR1cm4gTlVMTCBpZiBAY291bnQgaXMgemVyby4gKi8KKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gTlVMTDsKIAkvKiBUYWtlIHRoZSBsY25ibXAgbG9jayBmb3Igd3JpdGluZy4gKi8KIAlkb3duX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKIAkvKgpAQCAtNzg4LDcgKzc4Miw4IEBACiAgKiBAdmk6CQl2ZnMgaW5vZGUgd2hvc2UgcnVubGlzdCBkZXNjcmliZXMgdGhlIGNsdXN0ZXJzIHRvIGZyZWUKICAqIEBzdGFydF92Y246CXZjbiBpbiB0aGUgcnVubGlzdCBvZiBAdmkgYXQgd2hpY2ggdG8gc3RhcnQgZnJlZWluZyBjbHVzdGVycwogICogQGNvdW50OgludW1iZXIgb2YgY2x1c3RlcnMgdG8gZnJlZSBvciAtMSBmb3IgYWxsIGNsdXN0ZXJzCi0gKiBAaXNfcm9sbGJhY2s6CWlmIFRSVUUgdGhpcyBpcyBhIHJvbGxiYWNrIG9wZXJhdGlvbgorICogQHdyaXRlX2xvY2tlZDoJdHJ1ZSBpZiB0aGUgcnVubGlzdCBpcyBsb2NrZWQgZm9yIHdyaXRpbmcKKyAqIEBpc19yb2xsYmFjazoJdHJ1ZSBpZiB0aGlzIGlzIGEgcm9sbGJhY2sgb3BlcmF0aW9uCiAgKgogICogRnJlZSBAY291bnQgY2x1c3RlcnMgc3RhcnRpbmcgYXQgdGhlIGNsdXN0ZXIgQHN0YXJ0X3ZjbiBpbiB0aGUgcnVubGlzdAogICogZGVzY3JpYmVkIGJ5IHRoZSB2ZnMgaW5vZGUgQHZpLgpAQCAtODA2LDE3ICs4MDEsMTcgQEAKICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGRlYWxsb2NhdGVkIGNsdXN0ZXJzIChub3QgY291bnRpbmcgc3BhcnNlIG9uZXMpIG9uCiAgKiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCiAgKgotICogTG9ja2luZzogLSBUaGUgcnVubGlzdCBkZXNjcmliZWQgYnkgQHZpIG11c3QgYmUgdW5sb2NrZWQgb24gZW50cnkgYW5kIGlzCi0gKgkgICAgICB1bmxvY2tlZCBvbiByZXR1cm4uCi0gKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBydW5saXN0IGxvY2sgb2YgQHZpIGZvciByZWFkaW5nIGFuZAotICoJICAgICAgc29tZXRpbWVzIGZvciB3cml0aW5nIGFuZCBzb21ldGltZXMgbW9kaWZpZXMgdGhlIHJ1bmxpc3QuCisgKiBMb2NraW5nOiAtIFRoZSBydW5saXN0IGRlc2NyaWJlZCBieSBAdmkgbXVzdCBiZSBsb2NrZWQgb24gZW50cnkgYW5kIGlzCisgKgkgICAgICBsb2NrZWQgb24gcmV0dXJuLiAgTm90ZSBpZiB0aGUgcnVubGlzdCBpcyBsb2NrZWQgZm9yIHJlYWRpbmcgdGhlCisgKgkgICAgICBsb2NrIG1heSBiZSBkcm9wcGVkIGFuZCByZWFjcXVpcmVkLiAgTm90ZSB0aGUgcnVubGlzdCBtYXkgYmUKKyAqCSAgICAgIG1vZGlmaWVkIHdoZW4gbmVlZGVkIHJ1bmxpc3QgZnJhZ21lbnRzIG5lZWQgdG8gYmUgbWFwcGVkLgogICoJICAgIC0gVGhlIHZvbHVtZSBsY24gYml0bWFwIG11c3QgYmUgdW5sb2NrZWQgb24gZW50cnkgYW5kIGlzIHVubG9ja2VkCiAgKgkgICAgICBvbiByZXR1cm4uCiAgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB2b2x1bWUgbGNuIGJpdG1hcCBsb2NrIGZvciB3cml0aW5nIGFuZAogICoJICAgICAgbW9kaWZpZXMgdGhlIGJpdG1hcCBjb250ZW50cy4KICAqLwogczY0IF9fbnRmc19jbHVzdGVyX2ZyZWUoc3RydWN0IGlub2RlICp2aSwgY29uc3QgVkNOIHN0YXJ0X3ZjbiwgczY0IGNvdW50LAotCQljb25zdCBCT09MIGlzX3JvbGxiYWNrKQorCQljb25zdCBCT09MIHdyaXRlX2xvY2tlZCwgY29uc3QgQk9PTCBpc19yb2xsYmFjaykKIHsKIAlzNjQgZGVsdGEsIHRvX2ZyZWUsIHRvdGFsX2ZyZWVkLCByZWFsX2ZyZWVkOwogCW50ZnNfaW5vZGUgKm5pOwpAQCAtODQ4LDggKzg0Myw3IEBACiAKIAl0b3RhbF9mcmVlZCA9IHJlYWxfZnJlZWQgPSAwOwogCi0JZG93bl9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKLQlybCA9IG50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2sobmksIHN0YXJ0X3ZjbiwgRkFMU0UpOworCXJsID0gbnRmc19hdHRyX2ZpbmRfdmNuX25vbG9jayhuaSwgc3RhcnRfdmNuLCB3cml0ZV9sb2NrZWQpOwogCWlmIChJU19FUlIocmwpKSB7CiAJCWlmICghaXNfcm9sbGJhY2spCiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBmaXJzdCBydW5saXN0ICIKQEAgLTkwMyw3ICs4OTcsNyBAQAogCiAJCQkvKiBBdHRlbXB0IHRvIG1hcCBydW5saXN0LiAqLwogCQkJdmNuID0gcmwtPnZjbjsKLQkJCXJsID0gbnRmc19hdHRyX2ZpbmRfdmNuX25vbG9jayhuaSwgdmNuLCBGQUxTRSk7CisJCQlybCA9IG50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2sobmksIHZjbiwgd3JpdGVfbG9ja2VkKTsKIAkJCWlmIChJU19FUlIocmwpKSB7CiAJCQkJZXJyID0gUFRSX0VSUihybCk7CiAJCQkJaWYgKCFpc19yb2xsYmFjaykKQEAgLTk1MCw3ICs5NDQsNiBAQAogCQkvKiBVcGRhdGUgdGhlIHRvdGFsIGRvbmUgY2x1c3RlcnMuICovCiAJCXRvdGFsX2ZyZWVkICs9IHRvX2ZyZWU7CiAJfQotCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOwogCWlmIChsaWtlbHkoIWlzX3JvbGxiYWNrKSkKIAkJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOwogCkBAIC05NjAsNyArOTUzLDYgQEAKIAludGZzX2RlYnVnKCJEb25lLiIpOwogCXJldHVybiByZWFsX2ZyZWVkOwogZXJyX291dDoKLQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKIAlpZiAoaXNfcm9sbGJhY2spCiAJCXJldHVybiBlcnI7CiAJLyogSWYgbm8gcmVhbCBjbHVzdGVycyB3ZXJlIGZyZWVkLCBubyBuZWVkIHRvIHJvbGxiYWNrLiAqLwpAQCAtOTczLDcgKzk2NSw4IEBACiAJICogSWYgcm9sbGJhY2sgZmFpbHMsIHNldCB0aGUgdm9sdW1lIGVycm9ycyBmbGFnLCBlbWl0IGFuIGVycm9yCiAJICogbWVzc2FnZSwgYW5kIHJldHVybiB0aGUgZXJyb3IgY29kZS4KIAkgKi8KLQlkZWx0YSA9IF9fbnRmc19jbHVzdGVyX2ZyZWUodmksIHN0YXJ0X3ZjbiwgdG90YWxfZnJlZWQsIFRSVUUpOworCWRlbHRhID0gX19udGZzX2NsdXN0ZXJfZnJlZSh2aSwgc3RhcnRfdmNuLCB0b3RhbF9mcmVlZCwgd3JpdGVfbG9ja2VkLAorCQkJVFJVRSk7CiAJaWYgKGRlbHRhIDwgMCkgewogCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcm9sbGJhY2sgKGVycm9yICVpKS4gIExlYXZpbmcgIgogCQkJCSJpbmNvbnNpc3RlbnQgbWV0YWRhdGEhICBVbm1vdW50IGFuZCBydW4gIgpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9sY25hbGxvYy5oIGIvZnMvbnRmcy9sY25hbGxvYy5oCmluZGV4IDRjYWMxYzAuLmU0ZDdmYjkgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvbGNuYWxsb2MuaAorKysgYi9mcy9udGZzL2xjbmFsbG9jLmgKQEAgLTQzLDEzICs0MywxNCBAQAogCQljb25zdCBOVEZTX0NMVVNURVJfQUxMT0NBVElPTl9aT05FUyB6b25lKTsKIAogZXh0ZXJuIHM2NCBfX250ZnNfY2x1c3Rlcl9mcmVlKHN0cnVjdCBpbm9kZSAqdmksIGNvbnN0IFZDTiBzdGFydF92Y24sCi0JCXM2NCBjb3VudCwgY29uc3QgQk9PTCBpc19yb2xsYmFjayk7CisJCXM2NCBjb3VudCwgY29uc3QgQk9PTCB3cml0ZV9sb2NrZWQsIGNvbnN0IEJPT0wgaXNfcm9sbGJhY2spOwogCiAvKioKICAqIG50ZnNfY2x1c3Rlcl9mcmVlIC0gZnJlZSBjbHVzdGVycyBvbiBhbiBudGZzIHZvbHVtZQogICogQHZpOgkJdmZzIGlub2RlIHdob3NlIHJ1bmxpc3QgZGVzY3JpYmVzIHRoZSBjbHVzdGVycyB0byBmcmVlCiAgKiBAc3RhcnRfdmNuOgl2Y24gaW4gdGhlIHJ1bmxpc3Qgb2YgQHZpIGF0IHdoaWNoIHRvIHN0YXJ0IGZyZWVpbmcgY2x1c3RlcnMKICAqIEBjb3VudDoJbnVtYmVyIG9mIGNsdXN0ZXJzIHRvIGZyZWUgb3IgLTEgZm9yIGFsbCBjbHVzdGVycworICogQHdyaXRlX2xvY2tlZDoJdHJ1ZSBpZiB0aGUgcnVubGlzdCBpcyBsb2NrZWQgZm9yIHdyaXRpbmcKICAqCiAgKiBGcmVlIEBjb3VudCBjbHVzdGVycyBzdGFydGluZyBhdCB0aGUgY2x1c3RlciBAc3RhcnRfdmNuIGluIHRoZSBydW5saXN0CiAgKiBkZXNjcmliZWQgYnkgdGhlIHZmcyBpbm9kZSBAdmkuCkBAIC02NCwxOSArNjUsMTkgQEAKICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGRlYWxsb2NhdGVkIGNsdXN0ZXJzIChub3QgY291bnRpbmcgc3BhcnNlIG9uZXMpIG9uCiAgKiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCiAgKgotICogTG9ja2luZzogLSBUaGUgcnVubGlzdCBkZXNjcmliZWQgYnkgQHZpIG11c3QgYmUgdW5sb2NrZWQgb24gZW50cnkgYW5kIGlzCi0gKgkgICAgICB1bmxvY2tlZCBvbiByZXR1cm4uCi0gKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBydW5saXN0IGxvY2sgb2YgQHZpIGZvciByZWFkaW5nIGFuZAotICoJICAgICAgc29tZXRpbWVzIGZvciB3cml0aW5nIGFuZCBzb21ldGltZXMgbW9kaWZpZXMgdGhlIHJ1bmxpc3QuCisgKiBMb2NraW5nOiAtIFRoZSBydW5saXN0IGRlc2NyaWJlZCBieSBAdmkgbXVzdCBiZSBsb2NrZWQgb24gZW50cnkgYW5kIGlzCisgKgkgICAgICBsb2NrZWQgb24gcmV0dXJuLiAgTm90ZSBpZiB0aGUgcnVubGlzdCBpcyBsb2NrZWQgZm9yIHJlYWRpbmcgdGhlCisgKgkgICAgICBsb2NrIG1heSBiZSBkcm9wcGVkIGFuZCByZWFjcXVpcmVkLiAgTm90ZSB0aGUgcnVubGlzdCBtYXkgYmUKKyAqCSAgICAgIG1vZGlmaWVkIHdoZW4gbmVlZGVkIHJ1bmxpc3QgZnJhZ21lbnRzIG5lZWQgdG8gYmUgbWFwcGVkLgogICoJICAgIC0gVGhlIHZvbHVtZSBsY24gYml0bWFwIG11c3QgYmUgdW5sb2NrZWQgb24gZW50cnkgYW5kIGlzIHVubG9ja2VkCiAgKgkgICAgICBvbiByZXR1cm4uCiAgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB2b2x1bWUgbGNuIGJpdG1hcCBsb2NrIGZvciB3cml0aW5nIGFuZAogICoJICAgICAgbW9kaWZpZXMgdGhlIGJpdG1hcCBjb250ZW50cy4KICAqLwogc3RhdGljIGlubGluZSBzNjQgbnRmc19jbHVzdGVyX2ZyZWUoc3RydWN0IGlub2RlICp2aSwgY29uc3QgVkNOIHN0YXJ0X3ZjbiwKLQkJczY0IGNvdW50KQorCQlzNjQgY291bnQsIGNvbnN0IEJPT0wgd3JpdGVfbG9ja2VkKQogewotCXJldHVybiBfX250ZnNfY2x1c3Rlcl9mcmVlKHZpLCBzdGFydF92Y24sIGNvdW50LCBGQUxTRSk7CisJcmV0dXJuIF9fbnRmc19jbHVzdGVyX2ZyZWUodmksIHN0YXJ0X3ZjbiwgY291bnQsIHdyaXRlX2xvY2tlZCwgRkFMU0UpOwogfQogCiBleHRlcm4gaW50IG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrKG50ZnNfdm9sdW1lICp2b2wsCkBAIC05Myw4ICs5NCwxMCBAQAogICoKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KICAqCi0gKiBMb2NraW5nOiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB2b2x1bWUgbGNuIGJpdG1hcCBsb2NrIGZvciB3cml0aW5nIGFuZAotICoJICAgIG1vZGlmaWVzIHRoZSBiaXRtYXAgY29udGVudHMuCisgKiBMb2NraW5nOiAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHZvbHVtZSBsY24gYml0bWFwIGxvY2sgZm9yIHdyaXRpbmcgYW5kCisgKgkgICAgICBtb2RpZmllcyB0aGUgYml0bWFwIGNvbnRlbnRzLgorICoJICAgIC0gVGhlIGNhbGxlciBtdXN0IGhhdmUgbG9ja2VkIHRoZSBydW5saXN0IEBybCBmb3IgcmVhZGluZyBvcgorICoJICAgICAgd3JpdGluZy4KICAqLwogc3RhdGljIGlubGluZSBpbnQgbnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybChudGZzX3ZvbHVtZSAqdm9sLAogCQljb25zdCBydW5saXN0X2VsZW1lbnQgKnJsKQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9sb2dmaWxlLmMgYi9mcy9udGZzL2xvZ2ZpbGUuYwppbmRleCA4ZWRiOGUyLi4wMTczZTk1IDEwMDY0NAotLS0gYS9mcy9udGZzL2xvZ2ZpbGUuYworKysgYi9mcy9udGZzL2xvZ2ZpbGUuYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAJICovCiAJaWYgKCFudGZzX2lzX2Noa2RfcmVjb3JkKHJwLT5tYWdpYykgJiYgc2xlNjRfdG9fY3B1KHJwLT5jaGtkc2tfbHNuKSkgewogCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJExvZ0ZpbGUgcmVzdGFydCBwYWdlIGlzIG5vdCBtb2RpZmllZCAiCi0JCQkJImNoa2RzayBidXQgYSBjaGtkc2sgTFNOIGlzIHNwZWNpZmllZC4iKTsKKwkJCQkiYnkgY2hrZHNrIGJ1dCBhIGNoa2RzayBMU04gaXMgc3BlY2lmaWVkLiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCW50ZnNfZGVidWcoIkRvbmUuIik7CkBAIC0zMTIsMTAgKzMxMiwxMiBAQAogICogQHZpOgkJJExvZ0ZpbGUgaW5vZGUgdG8gd2hpY2ggdGhlIHJlc3RhcnQgcGFnZSBiZWxvbmdzCiAgKiBAcnA6CQlyZXN0YXJ0IHBhZ2UgdG8gY2hlY2sKICAqIEBwb3M6CXBvc2l0aW9uIGluIEB2aSBhdCB3aGljaCB0aGUgcmVzdGFydCBwYWdlIHJlc2lkZXMKLSAqIEB3cnA6CWNvcHkgb2YgdGhlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3RlZCByZXN0YXJ0IHBhZ2UKKyAqIEB3cnA6CVtPVVRdIGNvcHkgb2YgdGhlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3RlZCByZXN0YXJ0IHBhZ2UKKyAqIEBsc246CVtPVVRdIHNldCB0byB0aGUgY3VycmVudCBsb2dmaWxlIGxzbiBvbiBzdWNjZXNzCiAgKgotICogQ2hlY2sgdGhlIHJlc3RhcnQgcGFnZSBAcnAgZm9yIGNvbnNpc3RlbmN5IGFuZCByZXR1cm4gVFJVRSBpZiBpdCBpcwotICogY29uc2lzdGVudCBhbmQgRkFMU0Ugb3RoZXJ3aXNlLgorICogQ2hlY2sgdGhlIHJlc3RhcnQgcGFnZSBAcnAgZm9yIGNvbnNpc3RlbmN5IGFuZCByZXR1cm4gMCBpZiBpdCBpcyBjb25zaXN0ZW50CisgKiBhbmQgLWVycm5vIG90aGVyd2lzZS4gIFRoZSByZXN0YXJ0IHBhZ2UgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBjaGtkc2sgaW4KKyAqIHdoaWNoIGNhc2UgaXRzIG1hZ2ljIGlzIENIS0QgaW5zdGVhZCBvZiBSU1RSLgogICoKICAqIFRoaXMgZnVuY3Rpb24gb25seSBuZWVkcyBOVEZTX0JMT0NLX1NJWkUgYnl0ZXMgaW4gQHJwLCBpLmUuIGl0IGRvZXMgbm90CiAgKiByZXF1aXJlIHRoZSBmdWxsIHJlc3RhcnQgcGFnZS4KQEAgLTMyMywyNSArMzI1LDMzIEBACiAgKiBJZiBAd3JwIGlzIG5vdCBOVUxMLCBvbiBzdWNjZXNzLCAqQHdycCB3aWxsIHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgYQogICogY29weSBvZiB0aGUgY29tcGxldGUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGRlcHJvdGVjdGVkIHBhZ2UuICBPbiBmYWlsdXJlLAogICogKkB3cnAgaXMgdW5kZWZpbmVkLgorICoKKyAqIFNpbWlsbGFybHksIGlmIEBsc24gaXMgbm90IE5VTEwsIG9uIHN1Y2NlcyAqQGxzbiB3aWxsIGJlIHNldCB0byB0aGUgY3VycmVudAorICogbG9nZmlsZSBsc24gYWNjb3JkaW5nIHRvIHRoaXMgcmVzdGFydCBwYWdlLiAgT24gZmFpbHVyZSwgKkBsc24gaXMgdW5kZWZpbmVkLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgYXJlIGRlZmluZWQ6CisgKgktRUlOVkFMCS0gVGhlIHJlc3RhcnQgcGFnZSBpcyBpbmNvbnNpc3RlbnQuCisgKgktRU5PTUVNCS0gTm90IGVub3VnaCBtZW1vcnkgdG8gbG9hZCB0aGUgcmVzdGFydCBwYWdlLgorICoJLUVJTwktIEZhaWxlZCB0byByZWFkaW5nIGZyb20gJExvZ0ZpbGUuCiAgKi8KLXN0YXRpYyBCT09MIG50ZnNfY2hlY2tfYW5kX2xvYWRfcmVzdGFydF9wYWdlKHN0cnVjdCBpbm9kZSAqdmksCi0JCVJFU1RBUlRfUEFHRV9IRUFERVIgKnJwLCBzNjQgcG9zLCBSRVNUQVJUX1BBR0VfSEVBREVSICoqd3JwKQorc3RhdGljIGludCBudGZzX2NoZWNrX2FuZF9sb2FkX3Jlc3RhcnRfcGFnZShzdHJ1Y3QgaW5vZGUgKnZpLAorCQlSRVNUQVJUX1BBR0VfSEVBREVSICpycCwgczY0IHBvcywgUkVTVEFSVF9QQUdFX0hFQURFUiAqKndycCwKKwkJTFNOICpsc24pCiB7CiAJUkVTVEFSVF9BUkVBICpyYTsKIAlSRVNUQVJUX1BBR0VfSEVBREVSICp0cnA7Ci0JaW50IHNpemU7Ci0JQk9PTCByZXQ7CisJaW50IHNpemUsIGVycjsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOwogCS8qIENoZWNrIHRoZSByZXN0YXJ0IHBhZ2UgaGVhZGVyIGZvciBjb25zaXN0ZW5jeS4gKi8KIAlpZiAoIW50ZnNfY2hlY2tfcmVzdGFydF9wYWdlX2hlYWRlcih2aSwgcnAsIHBvcykpIHsKIAkJLyogRXJyb3Igb3V0cHV0IGFscmVhZHkgZG9uZSBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAqLwotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKiBDaGVjayB0aGUgcmVzdGFydCBhcmVhIGZvciBjb25zaXN0ZW5jeS4gKi8KIAlpZiAoIW50ZnNfY2hlY2tfcmVzdGFydF9hcmVhKHZpLCBycCkpIHsKIAkJLyogRXJyb3Igb3V0cHV0IGFscmVhZHkgZG9uZSBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAqLwotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyYSA9IChSRVNUQVJUX0FSRUEqKSgodTgqKXJwICsgbGUxNl90b19jcHUocnAtPnJlc3RhcnRfYXJlYV9vZmZzZXQpKTsKIAkvKgpAQCAtMzUyLDcgKzM2Miw3IEBACiAJaWYgKCF0cnApIHsKIAkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICRMb2dGaWxlICIKIAkJCQkicmVzdGFydCBwYWdlIGJ1ZmZlci4iKTsKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJLyoKIAkgKiBSZWFkIHRoZSB3aG9sZSBvZiB0aGUgcmVzdGFydCBwYWdlIGludG8gdGhlIGJ1ZmZlci4gIElmIGl0IGZpdHMKQEAgLTM3OSw2ICszODksOSBAQAogCQkJaWYgKElTX0VSUihwYWdlKSkgewogCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJFcnJvciBtYXBwaW5nICRMb2dGaWxlICIKIAkJCQkJCSJwYWdlIChpbmRleCAlbHUpLiIsIGlkeCk7CisJCQkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJCQlpZiAoZXJyICE9IC1FSU8gJiYgZXJyICE9IC1FTk9NRU0pCisJCQkJCWVyciA9IC1FSU87CiAJCQkJZ290byBlcnJfb3V0OwogCQkJfQogCQkJc2l6ZSA9IG1pbl90KGludCwgdG9fcmVhZCwgUEFHRV9DQUNIRV9TSVpFKTsKQEAgLTM5MiwyOSArNDA1LDU3IEBACiAJLyogUGVyZm9ybSB0aGUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGRlcHJvdGVjdGlvbiBvbiB0aGUgYnVmZmVyLiAqLwogCWlmIChwb3N0X3JlYWRfbXN0X2ZpeHVwKChOVEZTX1JFQ09SRCopdHJwLAogCQkJbGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpKSkgewotCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiTXVsdGkgc2VjdG9yIHRyYW5zZmVyIGVycm9yIGRldGVjdGVkIGluICIKLQkJCQkiJExvZ0ZpbGUgcmVzdGFydCBwYWdlLiIpOwotCQlnb3RvIGVycl9vdXQ7CisJCS8qCisJCSAqIEEgbXVsdGkgc2VjdG9yIHRyYW5mZXIgZXJyb3Igd2FzIGRldGVjdGVkLiAgV2Ugb25seSBuZWVkIHRvCisJCSAqIGFib3J0IGlmIHRoZSByZXN0YXJ0IHBhZ2UgY29udGVudHMgZXhjZWVkIHRoZSBtdWx0aSBzZWN0b3IKKwkJICogdHJhbnNmZXIgZml4dXAgb2YgdGhlIGZpcnN0IHNlY3Rvci4KKwkJICovCisJCWlmIChsZTE2X3RvX2NwdShycC0+cmVzdGFydF9hcmVhX29mZnNldCkgKworCQkJCWxlMTZfdG9fY3B1KHJhLT5yZXN0YXJ0X2FyZWFfbGVuZ3RoKSA+CisJCQkJTlRGU19CTE9DS19TSVpFIC0gc2l6ZW9mKHUxNikpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJNdWx0aSBzZWN0b3IgdHJhbnNmZXIgZXJyb3IgIgorCQkJCQkiZGV0ZWN0ZWQgaW4gJExvZ0ZpbGUgcmVzdGFydCBwYWdlLiIpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQogCX0KLQkvKiBDaGVjayB0aGUgbG9nIGNsaWVudCByZWNvcmRzIGZvciBjb25zaXN0ZW5jeS4gKi8KLQlyZXQgPSBudGZzX2NoZWNrX2xvZ19jbGllbnRfYXJyYXkodmksIHRycCk7Ci0JaWYgKHJldCAmJiB3cnApCi0JCSp3cnAgPSB0cnA7Ci0JZWxzZQotCQludGZzX2ZyZWUodHJwKTsKKwkvKgorCSAqIElmIHRoZSByZXN0YXJ0IHBhZ2UgaXMgbW9kaWZpZWQgYnkgY2hrZHNrIG9yIHRoZXJlIGFyZSBubyBhY3RpdmUKKwkgKiBsb2dmaWxlIGNsaWVudHMsIHRoZSBsb2dmaWxlIGlzIGNvbnNpc3RlbnQuICBPdGhlcndpc2UsIG5lZWQgdG8KKwkgKiBjaGVjayB0aGUgbG9nIGNsaWVudCByZWNvcmRzIGZvciBjb25zaXN0ZW5jeSwgdG9vLgorCSAqLworCWVyciA9IDA7CisJaWYgKG50ZnNfaXNfcnN0cl9yZWNvcmQocnAtPm1hZ2ljKSAmJgorCQkJcmEtPmNsaWVudF9pbl91c2VfbGlzdCAhPSBMT0dGSUxFX05PX0NMSUVOVCkgeworCQlpZiAoIW50ZnNfY2hlY2tfbG9nX2NsaWVudF9hcnJheSh2aSwgdHJwKSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCX0KKwlpZiAobHNuKSB7CisJCWlmIChudGZzX2lzX3JzdHJfcmVjb3JkKHJwLT5tYWdpYykpCisJCQkqbHNuID0gc2xlNjRfdG9fY3B1KHJhLT5jdXJyZW50X2xzbik7CisJCWVsc2UgLyogaWYgKG50ZnNfaXNfY2hrZF9yZWNvcmQocnAtPm1hZ2ljKSkgKi8KKwkJCSpsc24gPSBzbGU2NF90b19jcHUocnAtPmNoa2Rza19sc24pOworCX0KIAludGZzX2RlYnVnKCJEb25lLiIpOwotCXJldHVybiByZXQ7CisJaWYgKHdycCkKKwkJKndycCA9IHRycDsKKwllbHNlIHsKIGVycl9vdXQ6Ci0JbnRmc19mcmVlKHRycCk7Ci0JcmV0dXJuIEZBTFNFOworCQludGZzX2ZyZWUodHJwKTsKKwl9CisJcmV0dXJuIGVycjsKIH0KIAogLyoqCiAgKiBudGZzX2NoZWNrX2xvZ2ZpbGUgLSBjaGVjayB0aGUgam91cm5hbCBmb3IgY29uc2lzdGVuY3kKICAqIEBsb2dfdmk6CXN0cnVjdCBpbm9kZSBvZiBsb2FkZWQgam91cm5hbCAkTG9nRmlsZSB0byBjaGVjaworICogQHJwOgkJW09VVF0gb24gc3VjY2VzcyB0aGlzIGlzIGEgY29weSBvZiB0aGUgY3VycmVudCByZXN0YXJ0IHBhZ2UKICAqCiAgKiBDaGVjayB0aGUgJExvZ0ZpbGUgam91cm5hbCBmb3IgY29uc2lzdGVuY3kgYW5kIHJldHVybiBUUlVFIGlmIGl0IGlzCi0gKiBjb25zaXN0ZW50IGFuZCBGQUxTRSBpZiBub3QuCisgKiBjb25zaXN0ZW50IGFuZCBGQUxTRSBpZiBub3QuICBPbiBzdWNjZXNzLCB0aGUgY3VycmVudCByZXN0YXJ0IHBhZ2UgaXMKKyAqIHJldHVybmVkIGluICpAcnAuICBDYWxsZXIgbXVzdCBjYWxsIG50ZnNfZnJlZSgqQHJwKSB3aGVuIGZpbmlzaGVkIHdpdGggaXQuCiAgKgogICogQXQgcHJlc2VudCB3ZSBvbmx5IGNoZWNrIHRoZSB0d28gcmVzdGFydCBwYWdlcyBhbmQgaWdub3JlIHRoZSBsb2cgcmVjb3JkCiAgKiBwYWdlcy4KQEAgLTQyNCwxOSArNDY1LDE4IEBACiAgKiBpZiB0aGUgJExvZ0ZpbGUgd2FzIGNyZWF0ZWQgb24gYSBzeXN0ZW0gd2l0aCBhIGRpZmZlcmVudCBwYWdlIHNpemUgdG8gb3VycwogICogeWV0IGFuZCBtc3QgZGVwcm90ZWN0aW9uIHdvdWxkIGZhaWwgaWYgb3VyIHBhZ2Ugc2l6ZSBpcyBzbWFsbGVyLgogICovCi1CT09MIG50ZnNfY2hlY2tfbG9nZmlsZShzdHJ1Y3QgaW5vZGUgKmxvZ192aSkKK0JPT0wgbnRmc19jaGVja19sb2dmaWxlKHN0cnVjdCBpbm9kZSAqbG9nX3ZpLCBSRVNUQVJUX1BBR0VfSEVBREVSICoqcnApCiB7Ci0JczY0IHNpemUsIHBvcywgcnN0cjFfcG9zLCByc3RyMl9wb3M7CisJczY0IHNpemUsIHBvczsKKwlMU04gcnN0cjFfbHNuLCByc3RyMl9sc247CiAJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IobG9nX3ZpLT5pX3NiKTsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGxvZ192aS0+aV9tYXBwaW5nOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAl1OCAqa2FkZHIgPSBOVUxMOwogCVJFU1RBUlRfUEFHRV9IRUFERVIgKnJzdHIxX3BoID0gTlVMTDsKIAlSRVNUQVJUX1BBR0VfSEVBREVSICpyc3RyMl9waCA9IE5VTEw7Ci0JaW50IGxvZ19wYWdlX3NpemUsIGxvZ19wYWdlX21hc2ssIG9mczsKKwlpbnQgbG9nX3BhZ2Vfc2l6ZSwgbG9nX3BhZ2VfbWFzaywgZXJyOwogCUJPT0wgbG9nZmlsZV9pc19lbXB0eSA9IFRSVUU7Ci0JQk9PTCByc3RyMV9mb3VuZCA9IEZBTFNFOwotCUJPT0wgcnN0cjJfZm91bmQgPSBGQUxTRTsKIAl1OCBsb2dfcGFnZV9iaXRzOwogCiAJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CkBAIC00OTEsNyArNTMxLDcgQEAKIAkJCWlmIChJU19FUlIocGFnZSkpIHsKIAkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJFcnJvciBtYXBwaW5nICRMb2dGaWxlICIKIAkJCQkJCSJwYWdlIChpbmRleCAlbHUpLiIsIGlkeCk7Ci0JCQkJcmV0dXJuIEZBTFNFOworCQkJCWdvdG8gZXJyX291dDsKIAkJCX0KIAkJfQogCQlrYWRkciA9ICh1OCopcGFnZV9hZGRyZXNzKHBhZ2UpICsgKHBvcyAmIH5QQUdFX0NBQ0hFX01BU0spOwpAQCAtNTEwLDk5ICs1NTAsOTUgQEAKIAkJICovCiAJCWlmIChudGZzX2lzX3JjcmRfcmVjb3JkcCgobGUzMiopa2FkZHIpKQogCQkJYnJlYWs7Ci0JCS8qCi0JCSAqIEEgbW9kaWZpZWQgYnkgY2hrZHNrIHJlc3RhcnQgcGFnZSBtZWFucyB3ZSBjYW5ub3QgaGFuZGxlCi0JCSAqIHRoaXMgbG9nIGZpbGUuCi0JCSAqLwotCQlpZiAobnRmc19pc19jaGtkX3JlY29yZHAoKGxlMzIqKWthZGRyKSkgewotCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiJExvZ0ZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgYnkgIgotCQkJCQkiY2hrZHNrLiAgTW91bnQgdGhpcyB2b2x1bWUgaW4gIgotCQkJCQkiV2luZG93cy4iKTsKLQkJCWdvdG8gZXJyX291dDsKLQkJfQotCQkvKiBJZiBub3QgYSByZXN0YXJ0IHBhZ2UsIGNvbnRpbnVlLiAqLwotCQlpZiAoIW50ZnNfaXNfcnN0cl9yZWNvcmRwKChsZTMyKilrYWRkcikpIHsKLQkJCS8qIFNraXAgdG8gdGhlIG1pbmltdW0gcGFnZSBzaXplIGZvciB0aGUgbmV4dCBvbmUuICovCisJCS8qIElmIG5vdCBhIChtb2RpZmllZCBieSBjaGtkc2spIHJlc3RhcnQgcGFnZSwgY29udGludWUuICovCisJCWlmICghbnRmc19pc19yc3RyX3JlY29yZHAoKGxlMzIqKWthZGRyKSAmJgorCQkJCSFudGZzX2lzX2Noa2RfcmVjb3JkcCgobGUzMiopa2FkZHIpKSB7CiAJCQlpZiAoIXBvcykKIAkJCQlwb3MgPSBOVEZTX0JMT0NLX1NJWkUgPj4gMTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCS8qIFdlIG5vdyBrbm93IHdlIGhhdmUgYSByZXN0YXJ0IHBhZ2UuICovCi0JCWlmICghcG9zKSB7Ci0JCQlyc3RyMV9mb3VuZCA9IFRSVUU7Ci0JCQlyc3RyMV9wb3MgPSBwb3M7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocnN0cjJfZm91bmQpIHsKLQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGb3VuZCBtb3JlIHRoYW4gdHdvICIKLQkJCQkJCSJyZXN0YXJ0IHBhZ2VzIGluICRMb2dGaWxlLiIpOwotCQkJCWdvdG8gZXJyX291dDsKKwkJLyoKKwkJICogQ2hlY2sgdGhlIChtb2RpZmllZCBieSBjaGtkc2spIHJlc3RhcnQgcGFnZSBmb3IgY29uc2lzdGVuY3kKKwkJICogYW5kIGdldCBhIGNvcHkgb2YgdGhlIGNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlcgorCQkgKiBkZXByb3RlY3RlZCByZXN0YXJ0IHBhZ2UuCisJCSAqLworCQllcnIgPSBudGZzX2NoZWNrX2FuZF9sb2FkX3Jlc3RhcnRfcGFnZShsb2dfdmksCisJCQkJKFJFU1RBUlRfUEFHRV9IRUFERVIqKWthZGRyLCBwb3MsCisJCQkJIXJzdHIxX3BoID8gJnJzdHIxX3BoIDogJnJzdHIyX3BoLAorCQkJCSFyc3RyMV9waCA/ICZyc3RyMV9sc24gOiAmcnN0cjJfbHNuKTsKKwkJaWYgKCFlcnIpIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSBoYXZlIG5vdyBmb3VuZCB0aGUgZmlyc3QgKG1vZGlmaWVkIGJ5IGNoa2RzaykKKwkJCSAqIHJlc3RhcnQgcGFnZSwgY29udGludWUgbG9va2luZyBmb3IgdGhlIHNlY29uZCBvbmUuCisJCQkgKi8KKwkJCWlmICghcG9zKSB7CisJCQkJcG9zID0gTlRGU19CTE9DS19TSVpFID4+IDE7CisJCQkJY29udGludWU7CiAJCQl9Ci0JCQlyc3RyMl9mb3VuZCA9IFRSVUU7Ci0JCQlyc3RyMl9wb3MgPSBwb3M7CisJCQkvKgorCQkJICogV2UgaGF2ZSBub3cgZm91bmQgdGhlIHNlY29uZCAobW9kaWZpZWQgYnkgY2hrZHNrKQorCQkJICogcmVzdGFydCBwYWdlLCBzbyB3ZSBjYW4gc3RvcCBsb29raW5nLgorCQkJICovCisJCQlicmVhazsKIAkJfQogCQkvKgotCQkgKiBDaGVjayB0aGUgcmVzdGFydCBwYWdlIGZvciBjb25zaXN0ZW5jeSBhbmQgZ2V0IGEgY29weSBvZiB0aGUKLQkJICogY29tcGxldGUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGRlcHJvdGVjdGVkIHJlc3RhcnQgcGFnZS4KKwkJICogRXJyb3Igb3V0cHV0IGFscmVhZHkgZG9uZSBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAgTm90ZSwgd2UgZG8KKwkJICogbm90IGFib3J0IGlmIHRoZSByZXN0YXJ0IHBhZ2Ugd2FzIGludmFsaWQgYXMgd2UgbWlnaHQgc3RpbGwKKwkJICogZmluZCBhIHZhbGlkIG9uZSBmdXJ0aGVyIGluIHRoZSBmaWxlLgogCQkgKi8KLQkJaWYgKCFudGZzX2NoZWNrX2FuZF9sb2FkX3Jlc3RhcnRfcGFnZShsb2dfdmksCi0JCQkJKFJFU1RBUlRfUEFHRV9IRUFERVIqKWthZGRyLCBwb3MsCi0JCQkJIXBvcyA/ICZyc3RyMV9waCA6ICZyc3RyMl9waCkpIHsKLQkJCS8qIEVycm9yIG91dHB1dCBhbHJlYWR5IGRvbmUgaW5zaWRlIHRoZSBmdW5jdGlvbi4gKi8KKwkJaWYgKGVyciAhPSAtRUlOVkFMKSB7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KLQkJLyoKLQkJICogV2UgaGF2ZSBhIHZhbGlkIHJlc3RhcnQgcGFnZS4gIFRoZSBuZXh0IG9uZSBtdXN0IGJlIGFmdGVyCi0JCSAqIGEgd2hvbGUgc3lzdGVtIHBhZ2Ugc2l6ZSBhcyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkIHJlc3RhcnQKLQkJICogcGFnZS4KLQkJICovCisJCS8qIENvbnRpbnVlIGxvb2tpbmcuICovCiAJCWlmICghcG9zKQotCQkJcG9zID0gbGUzMl90b19jcHUocnN0cjFfcGgtPnN5c3RlbV9wYWdlX3NpemUpID4+IDE7CisJCQlwb3MgPSBOVEZTX0JMT0NLX1NJWkUgPj4gMTsKIAl9Ci0JaWYgKHBhZ2UpIHsKKwlpZiAocGFnZSkKIAkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOwotCQlwYWdlID0gTlVMTDsKLQl9CiAJaWYgKGxvZ2ZpbGVfaXNfZW1wdHkpIHsKIAkJTlZvbFNldExvZ0ZpbGVFbXB0eSh2b2wpOwogaXNfZW1wdHk6CiAJCW50ZnNfZGVidWcoIkRvbmUuICAoJExvZ0ZpbGUgaXMgZW1wdHkuKSIpOwogCQlyZXR1cm4gVFJVRTsKIAl9Ci0JaWYgKCFyc3RyMV9mb3VuZCB8fCAhcnN0cjJfZm91bmQpIHsKLQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRGlkIG5vdCBmaW5kIHR3byByZXN0YXJ0IHBhZ2VzIGluICIKLQkJCQkiJExvZ0ZpbGUuIik7Ci0JCWdvdG8gZXJyX291dDsKKwlpZiAoIXJzdHIxX3BoKSB7CisJCUJVR19PTihyc3RyMl9waCk7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkRpZCBub3QgZmluZCBhbnkgcmVzdGFydCBwYWdlcyBpbiAiCisJCQkJIiRMb2dGaWxlIGFuZCBpdCB3YXMgbm90IGVtcHR5LiIpOworCQlyZXR1cm4gRkFMU0U7CiAJfQotCS8qCi0JICogVGhlIHR3byByZXN0YXJ0IGFyZWFzIG11c3QgYmUgaWRlbnRpY2FsIGV4Y2VwdCBmb3IgdGhlIHVwZGF0ZQotCSAqIHNlcXVlbmNlIG51bWJlci4KLQkgKi8KLQlvZnMgPSBsZTE2X3RvX2NwdShyc3RyMV9waC0+dXNhX29mcyk7Ci0JaWYgKG1lbWNtcChyc3RyMV9waCwgcnN0cjJfcGgsIG9mcykgfHwgKG9mcyArPSBzaXplb2YodTE2KSwKLQkJCW1lbWNtcCgodTgqKXJzdHIxX3BoICsgb2ZzLCAodTgqKXJzdHIyX3BoICsgb2ZzLAotCQkJbGUzMl90b19jcHUocnN0cjFfcGgtPnN5c3RlbV9wYWdlX3NpemUpIC0gb2ZzKSkpIHsKLQkJbnRmc19lcnJvcih2b2wtPnNiLCAiVGhlIHR3byByZXN0YXJ0IHBhZ2VzIGluICRMb2dGaWxlIGRvIG5vdCAiCi0JCQkJIm1hdGNoLiIpOwotCQlnb3RvIGVycl9vdXQ7CisJLyogSWYgYm90aCByZXN0YXJ0IHBhZ2VzIHdlcmUgZm91bmQsIHVzZSB0aGUgbW9yZSByZWNlbnQgb25lLiAqLworCWlmIChyc3RyMl9waCkgeworCQkvKgorCQkgKiBJZiB0aGUgc2Vjb25kIHJlc3RhcnQgYXJlYSBpcyBtb3JlIHJlY2VudCwgc3dpdGNoIHRvIGl0LgorCQkgKiBPdGhlcndpc2UganVzdCB0aHJvdyBpdCBhd2F5LgorCQkgKi8KKwkJaWYgKHJzdHIyX2xzbiA+IHJzdHIxX2xzbikgeworCQkJbnRmc19mcmVlKHJzdHIxX3BoKTsKKwkJCXJzdHIxX3BoID0gcnN0cjJfcGg7CisJCQkvKiByc3RyMV9sc24gPSByc3RyMl9sc247ICovCisJCX0gZWxzZQorCQkJbnRmc19mcmVlKHJzdHIyX3BoKTsKKwkJcnN0cjJfcGggPSBOVUxMOwogCX0KLQludGZzX2ZyZWUocnN0cjFfcGgpOwotCW50ZnNfZnJlZShyc3RyMl9waCk7CiAJLyogQWxsIGNvbnNpc3RlbmN5IGNoZWNrcyBwYXNzZWQuICovCisJaWYgKHJwKQorCQkqcnAgPSByc3RyMV9waDsKKwllbHNlCisJCW50ZnNfZnJlZShyc3RyMV9waCk7CiAJbnRmc19kZWJ1ZygiRG9uZS4iKTsKIAlyZXR1cm4gVFJVRTsKIGVycl9vdXQ6Ci0JaWYgKHBhZ2UpCi0JCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKIAlpZiAocnN0cjFfcGgpCiAJCW50ZnNfZnJlZShyc3RyMV9waCk7Ci0JaWYgKHJzdHIyX3BoKQotCQludGZzX2ZyZWUocnN0cjJfcGgpOwogCXJldHVybiBGQUxTRTsKIH0KIAogLyoqCiAgKiBudGZzX2lzX2xvZ2ZpbGVfY2xlYW4gLSBjaGVjayBpbiB0aGUgam91cm5hbCBpZiB0aGUgdm9sdW1lIGlzIGNsZWFuCiAgKiBAbG9nX3ZpOglzdHJ1Y3QgaW5vZGUgb2YgbG9hZGVkIGpvdXJuYWwgJExvZ0ZpbGUgdG8gY2hlY2sKKyAqIEBycDoJCWNvcHkgb2YgdGhlIGN1cnJlbnQgcmVzdGFydCBwYWdlCiAgKgogICogQW5hbHl6ZSB0aGUgJExvZ0ZpbGUgam91cm5hbCBhbmQgcmV0dXJuIFRSVUUgaWYgaXQgaW5kaWNhdGVzIHRoZSB2b2x1bWUgd2FzCiAgKiBzaHV0ZG93biBjbGVhbmx5IGFuZCBGQUxTRSBpZiBub3QuCkBAIC02MTksMTEgKzY1NSw5IEBACiAgKiBpcyBlbXB0eSB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgTlZvbExvZ0ZpbGVFbXB0eSgpIGlzIHRydWUgb3RoZXJ3aXNlIGFuCiAgKiBlbXB0eSB2b2x1bWUgd2lsbCBiZSByZXBvcnRlZCBhcyBkaXJ0eS4KICAqLwotQk9PTCBudGZzX2lzX2xvZ2ZpbGVfY2xlYW4oc3RydWN0IGlub2RlICpsb2dfdmkpCitCT09MIG50ZnNfaXNfbG9nZmlsZV9jbGVhbihzdHJ1Y3QgaW5vZGUgKmxvZ192aSwgY29uc3QgUkVTVEFSVF9QQUdFX0hFQURFUiAqcnApCiB7CiAJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IobG9nX3ZpLT5pX3NiKTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlSRVNUQVJUX1BBR0VfSEVBREVSICpycDsKIAlSRVNUQVJUX0FSRUEgKnJhOwogCiAJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CkBAIC02MzIsMjQgKzY2NiwxNSBAQAogCQludGZzX2RlYnVnKCJEb25lLiAgKCRMb2dGaWxlIGlzIGVtcHR5LikiKTsKIAkJcmV0dXJuIFRSVUU7CiAJfQotCS8qCi0JICogUmVhZCB0aGUgZmlyc3QgcmVzdGFydCBwYWdlLiAgSXQgd2lsbCBiZSBwb3NzaWJseSBpbmNvbXBsZXRlIGFuZAotCSAqIHdpbGwgbm90IGJlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3RlZCBidXQgd2Ugb25seSBuZWVkIHRoZQotCSAqIGZpcnN0IE5URlNfQkxPQ0tfU0laRSBieXRlcyBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIuCi0JICovCi0JcGFnZSA9IG50ZnNfbWFwX3BhZ2UobG9nX3ZpLT5pX21hcHBpbmcsIDApOwotCWlmIChJU19FUlIocGFnZSkpIHsKLQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRXJyb3IgbWFwcGluZyAkTG9nRmlsZSBwYWdlIChpbmRleCAwKS4iKTsKKwlCVUdfT04oIXJwKTsKKwlpZiAoIW50ZnNfaXNfcnN0cl9yZWNvcmQocnAtPm1hZ2ljKSAmJgorCQkJIW50ZnNfaXNfY2hrZF9yZWNvcmQocnAtPm1hZ2ljKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJSZXN0YXJ0IHBhZ2UgYnVmZmVyIGlzIGludmFsaWQuICBUaGlzIGlzICIKKwkJCQkicHJvYmFibHkgYSBidWcgaW4gdGhhdCB0aGUgJExvZ0ZpbGUgc2hvdWxkICIKKwkJCQkiaGF2ZSBiZWVuIGNvbnNpc3RlbmN5IGNoZWNrZWQgYmVmb3JlIGNhbGxpbmcgIgorCQkJCSJ0aGlzIGZ1bmN0aW9uLiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQotCXJwID0gKFJFU1RBUlRfUEFHRV9IRUFERVIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKLQlpZiAoIW50ZnNfaXNfcnN0cl9yZWNvcmQocnAtPm1hZ2ljKSkgewotCQludGZzX2Vycm9yKHZvbC0+c2IsICJObyByZXN0YXJ0IHBhZ2UgZm91bmQgYXQgb2Zmc2V0IHplcm8gaW4gIgotCQkJCSIkTG9nRmlsZS4gIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gdGhhdCAiCi0JCQkJInRoZSAkTG9nRmlsZSBzaG91bGQgaGF2ZSBiZWVuIGNvbnNpc3RlbmN5ICIKLQkJCQkiY2hlY2tlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiIpOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQogCXJhID0gKFJFU1RBUlRfQVJFQSopKCh1OCopcnAgKyBsZTE2X3RvX2NwdShycC0+cmVzdGFydF9hcmVhX29mZnNldCkpOwogCS8qCiAJICogSWYgdGhlICRMb2dGaWxlIGhhcyBhY3RpdmUgY2xpZW50cywgaS5lLiBpdCBpcyBvcGVuLCBhbmQgd2UgZG8gbm90CkBAIC02NTksMTUgKzY4NCwxMSBAQAogCWlmIChyYS0+Y2xpZW50X2luX3VzZV9saXN0ICE9IExPR0ZJTEVfTk9fQ0xJRU5UICYmCiAJCQkhKHJhLT5mbGFncyAmIFJFU1RBUlRfVk9MVU1FX0lTX0NMRUFOKSkgewogCQludGZzX2RlYnVnKCJEb25lLiAgJExvZ0ZpbGUgaW5kaWNhdGVzIGEgZGlydHkgc2h1dGRvd24uIik7Ci0JCWdvdG8gZXJyX291dDsKKwkJcmV0dXJuIEZBTFNFOwogCX0KLQludGZzX3VubWFwX3BhZ2UocGFnZSk7CiAJLyogJExvZ0ZpbGUgaW5kaWNhdGVzIGEgY2xlYW4gc2h1dGRvd24uICovCiAJbnRmc19kZWJ1ZygiRG9uZS4gICRMb2dGaWxlIGluZGljYXRlcyBhIGNsZWFuIHNodXRkb3duLiIpOwogCXJldHVybiBUUlVFOwotZXJyX291dDoKLQludGZzX3VubWFwX3BhZ2UocGFnZSk7Ci0JcmV0dXJuIEZBTFNFOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL250ZnMvbG9nZmlsZS5oIGIvZnMvbnRmcy9sb2dmaWxlLmgKaW5kZXggNGVlNDM3OC4uNDIzODhmOSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9sb2dmaWxlLmgKKysrIGIvZnMvbnRmcy9sb2dmaWxlLmgKQEAgLTIsNyArMiw3IEBACiAgKiBsb2dmaWxlLmggLSBEZWZpbmVzIGZvciBOVEZTIGtlcm5lbCBqb3VybmFsICgkTG9nRmlsZSkgaGFuZGxpbmcuICBQYXJ0IG9mCiAgKgkgICAgICAgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKQEAgLTI5Niw5ICsyOTYsMTEgQEAKIC8qIHNpemVvZigpID0gMTYwICgweGEwKSBieXRlcyAqLwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIExPR19DTElFTlRfUkVDT1JEOwogCi1leHRlcm4gQk9PTCBudGZzX2NoZWNrX2xvZ2ZpbGUoc3RydWN0IGlub2RlICpsb2dfdmkpOworZXh0ZXJuIEJPT0wgbnRmc19jaGVja19sb2dmaWxlKHN0cnVjdCBpbm9kZSAqbG9nX3ZpLAorCQlSRVNUQVJUX1BBR0VfSEVBREVSICoqcnApOwogCi1leHRlcm4gQk9PTCBudGZzX2lzX2xvZ2ZpbGVfY2xlYW4oc3RydWN0IGlub2RlICpsb2dfdmkpOworZXh0ZXJuIEJPT0wgbnRmc19pc19sb2dmaWxlX2NsZWFuKHN0cnVjdCBpbm9kZSAqbG9nX3ZpLAorCQljb25zdCBSRVNUQVJUX1BBR0VfSEVBREVSICpycCk7CiAKIGV4dGVybiBCT09MIG50ZnNfZW1wdHlfbG9nZmlsZShzdHJ1Y3QgaW5vZGUgKmxvZ192aSk7CiAKZGlmZiAtLWdpdCBhL2ZzL250ZnMvbWFsbG9jLmggYi9mcy9udGZzL21hbGxvYy5oCmluZGV4IGZhYzU5NDQuLjk5OTRlMDEgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvbWFsbG9jLmgKKysrIGIvZnMvbnRmcy9tYWxsb2MuaApAQCAtMjcsOCArMjcsMzUgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAKIC8qKgorICogX19udGZzX21hbGxvYyAtIGFsbG9jYXRlIG1lbW9yeSBpbiBtdWx0aXBsZXMgb2YgcGFnZXMKKyAqIEBzaXplOgludW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKKyAqIEBnZnBfbWFzazoJZXh0cmEgZmxhZ3MgZm9yIHRoZSBhbGxvY2F0b3IKKyAqCisgKiBJbnRlcm5hbCBmdW5jdGlvbi4gIFlvdSBwcm9iYWJseSB3YW50IG50ZnNfbWFsbG9jX25vZnMoKS4uLgorICoKKyAqIEFsbG9jYXRlcyBAc2l6ZSBieXRlcyBvZiBtZW1vcnksIHJvdW5kZWQgdXAgdG8gbXVsdGlwbGVzIG9mIFBBR0VfU0laRSBhbmQKKyAqIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgorICoKKyAqIElmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0LCByZXR1cm4gTlVMTC4KKyAqIERlcGVuZGluZyBvbiBAZ2ZwX21hc2sgdGhlIGFsbG9jYXRpb24gbWF5IGJlIGd1YXJhbnRlZWQgdG8gc3VjY2VlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpfX250ZnNfbWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKQoreworCWlmIChsaWtlbHkoc2l6ZSA8PSBQQUdFX1NJWkUpKSB7CisJCUJVR19PTighc2l6ZSk7CisJCS8qIGttYWxsb2MoKSBoYXMgcGVyLUNQVSBjYWNoZXMgc28gaXMgZmFzdGVyIGZvciBub3cuICovCisJCXJldHVybiBrbWFsbG9jKFBBR0VfU0laRSwgZ2ZwX21hc2spOworCQkvKiByZXR1cm4gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoZ2ZwX21hc2spOyAqLworCX0KKwlpZiAobGlrZWx5KHNpemUgPj4gUEFHRV9TSElGVCA8IG51bV9waHlzcGFnZXMpKQorCQlyZXR1cm4gX192bWFsbG9jKHNpemUsIGdmcF9tYXNrLCBQQUdFX0tFUk5FTCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgogICogbnRmc19tYWxsb2Nfbm9mcyAtIGFsbG9jYXRlIG1lbW9yeSBpbiBtdWx0aXBsZXMgb2YgcGFnZXMKLSAqIEBzaXplCW51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorICogQHNpemU6CW51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQogICoKICAqIEFsbG9jYXRlcyBAc2l6ZSBieXRlcyBvZiBtZW1vcnksIHJvdW5kZWQgdXAgdG8gbXVsdGlwbGVzIG9mIFBBR0VfU0laRSBhbmQKICAqIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgpAQCAtMzcsMTUgKzY0LDI0IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqbnRmc19tYWxsb2Nfbm9mcyh1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JaWYgKGxpa2VseShzaXplIDw9IFBBR0VfU0laRSkpIHsKLQkJQlVHX09OKCFzaXplKTsKLQkJLyoga21hbGxvYygpIGhhcyBwZXItQ1BVIGNhY2hlcyBzbyBpcyBmYXN0ZXIgZm9yIG5vdy4gKi8KLQkJcmV0dXJuIGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfTk9GUyk7Ci0JCS8qIHJldHVybiAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfTk9GUyB8IF9fR0ZQX0hJR0hNRU0pOyAqLwotCX0KLQlpZiAobGlrZWx5KHNpemUgPj4gUEFHRV9TSElGVCA8IG51bV9waHlzcGFnZXMpKQotCQlyZXR1cm4gX192bWFsbG9jKHNpemUsIEdGUF9OT0ZTIHwgX19HRlBfSElHSE1FTSwgUEFHRV9LRVJORUwpOwotCXJldHVybiBOVUxMOworCXJldHVybiBfX250ZnNfbWFsbG9jKHNpemUsIEdGUF9OT0ZTIHwgX19HRlBfSElHSE1FTSk7Cit9CisKKy8qKgorICogbnRmc19tYWxsb2Nfbm9mc19ub2ZhaWwgLSBhbGxvY2F0ZSBtZW1vcnkgaW4gbXVsdGlwbGVzIG9mIHBhZ2VzCisgKiBAc2l6ZToJbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKgorICogQWxsb2NhdGVzIEBzaXplIGJ5dGVzIG9mIG1lbW9yeSwgcm91bmRlZCB1cCB0byBtdWx0aXBsZXMgb2YgUEFHRV9TSVpFIGFuZAorICogcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgKgorICogVGhpcyBmdW5jdGlvbiBndWFyYW50ZWVzIHRoYXQgdGhlIGFsbG9jYXRpb24gd2lsbCBzdWNjZWVkLiAgSXQgd2lsbCBzbGVlcAorICogZm9yIGFzIGxvbmcgYXMgaXQgdGFrZXMgdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24uCisgKgorICogSWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIHJlcXVlc3QsIHJldHVybiBOVUxMLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKm50ZnNfbWFsbG9jX25vZnNfbm9mYWlsKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlyZXR1cm4gX19udGZzX21hbGxvYyhzaXplLCBHRlBfTk9GUyB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9OT0ZBSUwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbnRmc19mcmVlKHZvaWQgKmFkZHIpCmRpZmYgLS1naXQgYS9mcy9udGZzL21mdC5jIGIvZnMvbnRmcy9tZnQuYwppbmRleCAzMTdmN2M2Li4yYzMyYjg0IDEwMDY0NAotLS0gYS9mcy9udGZzL21mdC5jCisrKyBiL2ZzL250ZnMvbWZ0LmMKQEAgLTUxMSw3ICs1MTEsNiBAQAogCQl9IHdoaWxlIChiaCk7CiAJCXRhaWwtPmJfdGhpc19wYWdlID0gaGVhZDsKIAkJYXR0YWNoX3BhZ2VfYnVmZmVycyhwYWdlLCBoZWFkKTsKLQkJQlVHX09OKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKTsKIAl9CiAJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCUJVR19PTighYmgpOwpAQCAtNjkyLDcgKzY5MSw2IEBACiAJICovCiAJaWYgKCFOSW5vVGVzdENsZWFyRGlydHkobmkpKQogCQlnb3RvIGRvbmU7Ci0JQlVHX09OKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKTsKIAliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CiAJQlVHX09OKCFiaCk7CiAJcmwgPSBOVUxMOwpAQCAtMTk1NSw3ICsxOTUzLDcgQEAKIAlhID0gY3R4LT5hdHRyOwogCWEtPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuID0gY3B1X3RvX3NsZTY0KG9sZF9sYXN0X3ZjbiAtIDEpOwogdW5kb19hbGxvYzoKLQlpZiAobnRmc19jbHVzdGVyX2ZyZWUodm9sLT5tZnRfaW5vLCBvbGRfbGFzdF92Y24sIC0xKSA8IDApIHsKKwlpZiAobnRmc19jbHVzdGVyX2ZyZWUodm9sLT5tZnRfaW5vLCBvbGRfbGFzdF92Y24sIC0xLCBUUlVFKSA8IDApIHsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZyZWUgY2x1c3RlcnMgZnJvbSBtZnQgZGF0YSAiCiAJCQkJImF0dHJpYnV0ZS4lcyIsIGVzKTsKIAkJTlZvbFNldEVycm9ycyh2b2wpOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9ydW5saXN0LmMgYi9mcy9udGZzL3J1bmxpc3QuYwppbmRleCA3NTg4NTViLi5mNWIyYWM5IDEwMDY0NAotLS0gYS9mcy9udGZzL3J1bmxpc3QuYworKysgYi9mcy9udGZzL3J1bmxpc3QuYwpAQCAtMzUsNyArMzUsNyBAQAogCQlpbnQgc2l6ZSkKIHsKIAlpZiAobGlrZWx5KChkc3QgIT0gc3JjKSAmJiAoc2l6ZSA+IDApKSkKLQkJbWVtbW92ZShiYXNlICsgZHN0LCBiYXNlICsgc3JjLCBzaXplICogc2l6ZW9mICgqYmFzZSkpOworCQltZW1tb3ZlKGJhc2UgKyBkc3QsIGJhc2UgKyBzcmMsIHNpemUgKiBzaXplb2YoKmJhc2UpKTsKIH0KIAogLyoqCkBAIC05NSw2ICs5NSw1MSBAQAogfQogCiAvKioKKyAqIG50ZnNfcmxfcmVhbGxvY19ub2ZhaWwgLSBSZWFsbG9jYXRlIG1lbW9yeSBmb3IgcnVubGlzdHMKKyAqIEBybDoJCW9yaWdpbmFsIHJ1bmxpc3QKKyAqIEBvbGRfc2l6ZToJbnVtYmVyIG9mIHJ1bmxpc3QgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIHJ1bmxpc3QgQHJsCisgKiBAbmV3X3NpemU6CW51bWJlciBvZiBydW5saXN0IGVsZW1lbnRzIHdlIG5lZWQgc3BhY2UgZm9yCisgKgorICogQXMgdGhlIHJ1bmxpc3RzIGdyb3csIG1vcmUgbWVtb3J5IHdpbGwgYmUgcmVxdWlyZWQuICBUbyBwcmV2ZW50IHRoZQorICoga2VybmVsIGhhdmluZyB0byBhbGxvY2F0ZSBhbmQgcmVhbGxvY2F0ZSBsYXJnZSBudW1iZXJzIG9mIHNtYWxsIGJpdHMgb2YKKyAqIG1lbW9yeSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVudGlyZSBwYWdlIG9mIG1lbW9yeS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGd1YXJhbnRlZXMgdGhhdCB0aGUgYWxsb2NhdGlvbiB3aWxsIHN1Y2NlZWQuICBJdCB3aWxsIHNsZWVwCisgKiBmb3IgYXMgbG9uZyBhcyBpdCB0YWtlcyB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbi4KKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHJ1bmxpc3QgQHJsLgorICoKKyAqIE4uQi4gIElmIHRoZSBuZXcgYWxsb2NhdGlvbiBkb2Vzbid0IHJlcXVpcmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHBhZ2VzIGluCisgKiAgICAgICBtZW1vcnksIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgcG9pbnRlci4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQsIG9yIHJlY3ljbGVkLCBtZW1vcnkuCisgKiBPbiBlcnJvciwgcmV0dXJuIC1lcnJuby4gVGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyBhcmUgZGVmaW5lZDoKKyAqCS1FTk9NRU0JLSBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBydW5saXN0IGFycmF5LgorICoJLUVJTlZBTAktIEludmFsaWQgcGFyYW1ldGVycyB3ZXJlIHBhc3NlZCBpbi4KKyAqLworc3RhdGljIGlubGluZSBydW5saXN0X2VsZW1lbnQgKm50ZnNfcmxfcmVhbGxvY19ub2ZhaWwocnVubGlzdF9lbGVtZW50ICpybCwKKwkJaW50IG9sZF9zaXplLCBpbnQgbmV3X3NpemUpCit7CisJcnVubGlzdF9lbGVtZW50ICpuZXdfcmw7CisKKwlvbGRfc2l6ZSA9IFBBR0VfQUxJR04ob2xkX3NpemUgKiBzaXplb2YoKnJsKSk7CisJbmV3X3NpemUgPSBQQUdFX0FMSUdOKG5ld19zaXplICogc2l6ZW9mKCpybCkpOworCWlmIChvbGRfc2l6ZSA9PSBuZXdfc2l6ZSkKKwkJcmV0dXJuIHJsOworCisJbmV3X3JsID0gbnRmc19tYWxsb2Nfbm9mc19ub2ZhaWwobmV3X3NpemUpOworCUJVR19PTighbmV3X3JsKTsKKworCWlmIChsaWtlbHkocmwgIT0gTlVMTCkpIHsKKwkJaWYgKHVubGlrZWx5KG9sZF9zaXplID4gbmV3X3NpemUpKQorCQkJb2xkX3NpemUgPSBuZXdfc2l6ZTsKKwkJbWVtY3B5KG5ld19ybCwgcmwsIG9sZF9zaXplKTsKKwkJbnRmc19mcmVlKHJsKTsKKwl9CisJcmV0dXJuIG5ld19ybDsKK30KKworLyoqCiAgKiBudGZzX2FyZV9ybF9tZXJnZWFibGUgLSB0ZXN0IGlmIHR3byBydW5saXN0cyBjYW4gYmUgam9pbmVkIHRvZ2V0aGVyCiAgKiBAZHN0OglvcmlnaW5hbCBydW5saXN0CiAgKiBAc3JjOgluZXcgcnVubGlzdCB0byB0ZXN0IGZvciBtZXJnZWFiaWxpdHkgd2l0aCBAZHN0CkBAIC00OTcsNiArNTQyLDcgQEAKIAkJCS8qIFNjYW4gdG8gdGhlIGVuZCBvZiB0aGUgc291cmNlIHJ1bmxpc3QuICovCiAJCQlmb3IgKGRlbmQgPSAwOyBsaWtlbHkoZHJsW2RlbmRdLmxlbmd0aCk7IGRlbmQrKykKIAkJCQk7CisJCQlkZW5kKys7CiAJCQlkcmwgPSBudGZzX3JsX3JlYWxsb2MoZHJsLCBkZW5kLCBkZW5kICsgMSk7CiAJCQlpZiAoSVNfRVJSKGRybCkpCiAJCQkJcmV0dXJuIGRybDsKQEAgLTU2Niw4ICs2MTIsOCBAQAogCQkgKChkcmxbZGluc10udmNuICsgZHJsW2RpbnNdLmxlbmd0aCkgPD0gICAgICAvKiBFbmQgb2YgaG9sZSAgICovCiAJCSAgKHNybFtzZW5kIC0gMV0udmNuICsgc3JsW3NlbmQgLSAxXS5sZW5ndGgpKSk7CiAKLQkvKiBPciB3ZSdsbCBsb3NlIGFuIGVuZCBtYXJrZXIgKi8KLQlpZiAoc3RhcnQgJiYgZmluaXNoICYmIChkcmxbZGluc10ubGVuZ3RoID09IDApKQorCS8qIE9yIHdlIHdpbGwgbG9zZSBhbiBlbmQgbWFya2VyLiAqLworCWlmIChmaW5pc2ggJiYgIWRybFtkaW5zXS5sZW5ndGgpCiAJCXNzKys7CiAJaWYgKG1hcmtlciAmJiAoZHJsW2RpbnNdLnZjbiArIGRybFtkaW5zXS5sZW5ndGggPiBzcmxbc2VuZCAtIDFdLnZjbikpCiAJCWZpbmlzaCA9IEZBTFNFOwpAQCAtNjIxLDExICs2NjcsOCBAQAogCQkJaWYgKGRybFtkc10ubGNuICE9IExDTl9STF9OT1RfTUFQUEVEKSB7CiAJCQkJLyogQWRkIGFuIHVubWFwcGVkIHJ1bmxpc3QgZWxlbWVudC4gKi8KIAkJCQlpZiAoIXNsb3RzKSB7Ci0JCQkJCS8qIEZJWE1FL1RPRE86IFdlIG5lZWQgdG8gaGF2ZSB0aGUKLQkJCQkJICogZXh0cmEgbWVtb3J5IGFscmVhZHkhIChBSUEpICovCi0JCQkJCWRybCA9IG50ZnNfcmxfcmVhbGxvYyhkcmwsIGRzLCBkcyArIDIpOwotCQkJCQlpZiAoIWRybCkKLQkJCQkJCWdvdG8gY3JpdGljYWxfZXJyb3I7CisJCQkJCWRybCA9IG50ZnNfcmxfcmVhbGxvY19ub2ZhaWwoZHJsLCBkcywKKwkJCQkJCQlkcyArIDIpOwogCQkJCQlzbG90cyA9IDI7CiAJCQkJfQogCQkJCWRzKys7CkBAIC02NDAsMTMgKzY4Myw4IEBACiAJCQlkcmxbZHNdLmxlbmd0aCA9IG1hcmtlcl92Y24gLSBkcmxbZHNdLnZjbjsKIAkJCS8qIEZpbmFsbHkgYWRkIHRoZSBFTk9FTlQgdGVybWluYXRvci4gKi8KIAkJCWRzKys7Ci0JCQlpZiAoIXNsb3RzKSB7Ci0JCQkJLyogRklYTUUvVE9ETzogV2UgbmVlZCB0byBoYXZlIHRoZSBleHRyYQotCQkJCSAqIG1lbW9yeSBhbHJlYWR5ISAoQUlBKSAqLwotCQkJCWRybCA9IG50ZnNfcmxfcmVhbGxvYyhkcmwsIGRzLCBkcyArIDEpOwotCQkJCWlmICghZHJsKQotCQkJCQlnb3RvIGNyaXRpY2FsX2Vycm9yOwotCQkJfQorCQkJaWYgKCFzbG90cykKKwkJCQlkcmwgPSBudGZzX3JsX3JlYWxsb2Nfbm9mYWlsKGRybCwgZHMsIGRzICsgMSk7CiAJCQlkcmxbZHNdLnZjbiA9IG1hcmtlcl92Y247CiAJCQlkcmxbZHNdLmxjbiA9IExDTl9FTk9FTlQ7CiAJCQlkcmxbZHNdLmxlbmd0aCA9IChzNjQpMDsKQEAgLTY1OSwxMSArNjk3LDYgQEAKIAludGZzX2RlYnVnKCJNZXJnZWQgcnVubGlzdDoiKTsKIAludGZzX2RlYnVnX2R1bXBfcnVubGlzdChkcmwpOwogCXJldHVybiBkcmw7Ci0KLWNyaXRpY2FsX2Vycm9yOgotCS8qIENyaXRpY2FsIGVycm9yISBXZSBjYW5ub3QgYWZmb3JkIHRvIGZhaWwgaGVyZS4gKi8KLQludGZzX2Vycm9yKE5VTEwsICJDcml0aWNhbCBlcnJvciEgTm90IGVub3VnaCBtZW1vcnkuIik7Ci0JcGFuaWMoIk5URlM6IENhbm5vdCBjb250aW51ZS4iKTsKIH0KIAogLyoqCkBAIC03MjcsNiArNzYwLDkgQEAKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiQ29ycnVwdCBhdHRyaWJ1dGUuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCX0KKwkvKiBJZiB0aGUgbWFwcGluZyBwYWlycyBhcnJheSBpcyB2YWxpZCBidXQgZW1wdHksIG5vdGhpbmcgdG8gZG8uICovCisJaWYgKCF2Y24gJiYgISpidWYpCisJCXJldHVybiBvbGRfcmw7CiAJLyogQ3VycmVudCBwb3NpdGlvbiBpbiBydW5saXN0IGFycmF5LiAqLwogCXJscG9zID0gMDsKIAkvKiBBbGxvY2F0ZSBmaXJzdCBwYWdlIGFuZCBzZXQgY3VycmVudCBydW5saXN0IHNpemUgdG8gb25lIHBhZ2UuICovCkBAIC0xNDE5LDYgKzE0NTUsNyBAQAogCiAvKioKICAqIG50ZnNfcmxfdHJ1bmNhdGVfbm9sb2NrIC0gdHJ1bmNhdGUgYSBydW5saXN0IHN0YXJ0aW5nIGF0IGEgc3BlY2lmaWVkIHZjbgorICogQHZvbDoJbnRmcyB2b2x1bWUgKG5lZWRlZCBmb3IgZXJyb3Igb3V0cHV0KQogICogQHJ1bmxpc3Q6CXJ1bmxpc3QgdG8gdHJ1bmNhdGUKICAqIEBuZXdfbGVuZ3RoOgl0aGUgbmV3IGxlbmd0aCBvZiB0aGUgcnVubGlzdCBpbiBWQ05zCiAgKgpAQCAtMTQyNiwxMiArMTQ2MywxNiBAQAogICogaG9sZGluZyB0aGUgcnVubGlzdCBlbGVtZW50cyB0byBhIGxlbmd0aCBvZiBAbmV3X2xlbmd0aCBWQ05zLgogICoKICAqIElmIEBuZXdfbGVuZ3RoIGxpZXMgd2l0aGluIHRoZSBydW5saXN0LCB0aGUgcnVubGlzdCBlbGVtZW50cyB3aXRoIFZDTnMgb2YKLSAqIEBuZXdfbGVuZ3RoIGFuZCBhYm92ZSBhcmUgZGlzY2FyZGVkLgorICogQG5ld19sZW5ndGggYW5kIGFib3ZlIGFyZSBkaXNjYXJkZWQuICBBcyBhIHNwZWNpYWwgY2FzZSBpZiBAbmV3X2xlbmd0aCBpcworICogemVybywgdGhlIHJ1bmxpc3QgaXMgZGlzY2FyZGVkIGFuZCBzZXQgdG8gTlVMTC4KICAqCiAgKiBJZiBAbmV3X2xlbmd0aCBsaWVzIGJleW9uZCB0aGUgcnVubGlzdCwgYSBzcGFyc2UgcnVubGlzdCBlbGVtZW50IGlzIGFkZGVkIHRvCiAgKiB0aGUgZW5kIG9mIHRoZSBydW5saXN0IEBydW5saXN0IG9yIGlmIHRoZSBsYXN0IHJ1bmxpc3QgZWxlbWVudCBpcyBhIHNwYXJzZQogICogb25lIGFscmVhZHksIHRoaXMgaXMgZXh0ZW5kZWQuCiAgKgorICogTm90ZSwgbm8gY2hlY2tpbmcgaXMgZG9uZSBmb3IgdW5tYXBwZWQgcnVubGlzdCBlbGVtZW50cy4gIEl0IGlzIGFzc3VtZWQgdGhhdAorICogdGhlIGNhbGxlciBoYXMgbWFwcGVkIGFueSBlbGVtZW50cyB0aGF0IG5lZWQgdG8gYmUgbWFwcGVkIGFscmVhZHkuCisgKgogICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgogICoKICAqIExvY2tpbmc6IFRoZSBjYWxsZXIgbXVzdCBob2xkIEBydW5saXN0LT5sb2NrIGZvciB3cml0aW5nLgpAQCAtMTQ0Niw2ICsxNDg3LDEzIEBACiAJQlVHX09OKCFydW5saXN0KTsKIAlCVUdfT04obmV3X2xlbmd0aCA8IDApOwogCXJsID0gcnVubGlzdC0+cmw7CisJaWYgKCFuZXdfbGVuZ3RoKSB7CisJCW50ZnNfZGVidWcoIkZyZWVpbmcgcnVubGlzdC4iKTsKKwkJcnVubGlzdC0+cmwgPSBOVUxMOworCQlpZiAocmwpCisJCQludGZzX2ZyZWUocmwpOworCQlyZXR1cm4gMDsKKwl9CiAJaWYgKHVubGlrZWx5KCFybCkpIHsKIAkJLyoKIAkJICogQ3JlYXRlIGEgcnVubGlzdCBjb25zaXN0aW5nIG9mIGEgc3BhcnNlIHJ1bmxpc3QgZWxlbWVudCBvZgpAQCAtMTU1Myw0ICsxNjAxLDI4OCBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIG50ZnNfcmxfcHVuY2hfbm9sb2NrIC0gcHVuY2ggYSBob2xlIGludG8gYSBydW5saXN0CisgKiBAdm9sOgludGZzIHZvbHVtZSAobmVlZGVkIGZvciBlcnJvciBvdXRwdXQpCisgKiBAcnVubGlzdDoJcnVubGlzdCB0byBwdW5jaCBhIGhvbGUgaW50bworICogQHN0YXJ0OglzdGFydGluZyBWQ04gb2YgdGhlIGhvbGUgdG8gYmUgY3JlYXRlZAorICogQGxlbmd0aDoJc2l6ZSBvZiB0aGUgaG9sZSB0byBiZSBjcmVhdGVkIGluIHVuaXRzIG9mIGNsdXN0ZXJzCisgKgorICogUHVuY2ggYSBob2xlIGludG8gdGhlIHJ1bmxpc3QgQHJ1bmxpc3Qgc3RhcnRpbmcgYXQgVkNOIEBzdGFydCBhbmQgb2Ygc2l6ZQorICogQGxlbmd0aCBjbHVzdGVycy4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IsIGluIHdoaWNoIGNhc2UgQHJ1bmxpc3QgaGFzIG5vdCBiZWVuCisgKiBtb2RpZmllZC4KKyAqCisgKiBJZiBAc3RhcnQgYW5kL29yIEBzdGFydCArIEBsZW5ndGggYXJlIG91dHNpZGUgdGhlIHJ1bmxpc3QgcmV0dXJuIGVycm9yIGNvZGUKKyAqIC1FTk9FTlQuCisgKgorICogSWYgdGhlIHJ1bmxpc3QgY29udGFpbnMgdW5tYXBwZWQgb3IgZXJyb3IgZWxlbWVudHMgYmV0d2VlbiBAc3RhcnQgYW5kIEBzdGFydAorICogKyBAbGVuZ3RoIHJldHVybiBlcnJvciBjb2RlIC1FSU5WQUwuCisgKgorICogTG9ja2luZzogVGhlIGNhbGxlciBtdXN0IGhvbGQgQHJ1bmxpc3QtPmxvY2sgZm9yIHdyaXRpbmcuCisgKi8KK2ludCBudGZzX3JsX3B1bmNoX25vbG9jayhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBydW5saXN0ICpjb25zdCBydW5saXN0LAorCQljb25zdCBWQ04gc3RhcnQsIGNvbnN0IHM2NCBsZW5ndGgpCit7CisJY29uc3QgVkNOIGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOworCXM2NCBkZWx0YTsKKwlydW5saXN0X2VsZW1lbnQgKnJsLCAqcmxfZW5kLCAqcmxfcmVhbF9lbmQsICp0cmw7CisJaW50IG9sZF9zaXplOworCUJPT0wgbGNuX2ZpeHVwID0gRkFMU0U7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3Igc3RhcnQgMHglbGx4LCBsZW5ndGggMHglbGx4LiIsCisJCQkobG9uZyBsb25nKXN0YXJ0LCAobG9uZyBsb25nKWxlbmd0aCk7CisJQlVHX09OKCFydW5saXN0KTsKKwlCVUdfT04oc3RhcnQgPCAwKTsKKwlCVUdfT04obGVuZ3RoIDwgMCk7CisJQlVHX09OKGVuZCA8IDApOworCXJsID0gcnVubGlzdC0+cmw7CisJaWYgKHVubGlrZWx5KCFybCkpIHsKKwkJaWYgKGxpa2VseSghc3RhcnQgJiYgIWxlbmd0aCkpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCS8qIEZpbmQgQHN0YXJ0IGluIHRoZSBydW5saXN0LiAqLworCXdoaWxlIChsaWtlbHkocmwtPmxlbmd0aCAmJiBzdGFydCA+PSBybFsxXS52Y24pKQorCQlybCsrOworCXJsX2VuZCA9IHJsOworCS8qIEZpbmQgQGVuZCBpbiB0aGUgcnVubGlzdC4gKi8KKwl3aGlsZSAobGlrZWx5KHJsX2VuZC0+bGVuZ3RoICYmIGVuZCA+PSBybF9lbmRbMV0udmNuKSkgeworCQkvKiBWZXJpZnkgdGhlcmUgYXJlIG5vIHVubWFwcGVkIG9yIGVycm9yIGVsZW1lbnRzLiAqLworCQlpZiAodW5saWtlbHkocmxfZW5kLT5sY24gPCBMQ05fSE9MRSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmxfZW5kKys7CisJfQorCS8qIENoZWNrIHRoZSBsYXN0IGVsZW1lbnQuICovCisJaWYgKHVubGlrZWx5KHJsX2VuZC0+bGVuZ3RoICYmIHJsX2VuZC0+bGNuIDwgTENOX0hPTEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBUaGlzIGNvdmVycyBAc3RhcnQgYmVpbmcgb3V0IG9mIGJvdW5kcywgdG9vLiAqLworCWlmICghcmxfZW5kLT5sZW5ndGggJiYgZW5kID4gcmxfZW5kLT52Y24pCisJCXJldHVybiAtRU5PRU5UOworCWlmICghbGVuZ3RoKQorCQlyZXR1cm4gMDsKKwlpZiAoIXJsLT5sZW5ndGgpCisJCXJldHVybiAtRU5PRU5UOworCXJsX3JlYWxfZW5kID0gcmxfZW5kOworCS8qIERldGVybWluZSB0aGUgcnVubGlzdCBzaXplLiAqLworCXdoaWxlIChsaWtlbHkocmxfcmVhbF9lbmQtPmxlbmd0aCkpCisJCXJsX3JlYWxfZW5kKys7CisJb2xkX3NpemUgPSBybF9yZWFsX2VuZCAtIHJ1bmxpc3QtPnJsICsgMTsKKwkvKiBJZiBAc3RhcnQgaXMgaW4gYSBob2xlIHNpbXBseSBleHRlbmQgdGhlIGhvbGUuICovCisJaWYgKHJsLT5sY24gPT0gTENOX0hPTEUpIHsKKwkJLyoKKwkJICogSWYgYm90aCBAc3RhcnQgYW5kIEBlbmQgYXJlIGluIHRoZSBzYW1lIHNwYXJzZSBydW4sIHdlIGFyZQorCQkgKiBkb25lLgorCQkgKi8KKwkJaWYgKGVuZCA8PSBybFsxXS52Y24pIHsKKwkJCW50ZnNfZGVidWcoIkRvbmUgKHJlcXVlc3RlZCBob2xlIGlzIGFscmVhZHkgc3BhcnNlKS4iKTsKKwkJCXJldHVybiAwOworCQl9CitleHRlbmRfaG9sZToKKwkJLyogRXh0ZW5kIHRoZSBob2xlLiAqLworCQlybC0+bGVuZ3RoID0gZW5kIC0gcmwtPnZjbjsKKwkJLyogSWYgQGVuZCBpcyBpbiBhIGhvbGUsIG1lcmdlIGl0IHdpdGggdGhlIGN1cnJlbnQgb25lLiAqLworCQlpZiAocmxfZW5kLT5sY24gPT0gTENOX0hPTEUpIHsKKwkJCXJsX2VuZCsrOworCQkJcmwtPmxlbmd0aCA9IHJsX2VuZC0+dmNuIC0gcmwtPnZjbjsKKwkJfQorCQkvKiBXZSBoYXZlIGRvbmUgdGhlIGhvbGUuICBOb3cgZGVhbCB3aXRoIHRoZSByZW1haW5pbmcgdGFpbC4gKi8KKwkJcmwrKzsKKwkJLyogQ3V0IG91dCBhbGwgcnVubGlzdCBlbGVtZW50cyB1cCB0byBAZW5kLiAqLworCQlpZiAocmwgPCBybF9lbmQpCisJCQltZW1tb3ZlKHJsLCBybF9lbmQsIChybF9yZWFsX2VuZCAtIHJsX2VuZCArIDEpICoKKwkJCQkJc2l6ZW9mKCpybCkpOworCQkvKiBBZGp1c3QgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFpbCBpZiBuZWNlc3NhcnkuICovCisJCWlmIChlbmQgPiBybC0+dmNuKSB7CisJCQlzNjQgZGVsdGEgPSBlbmQgLSBybC0+dmNuOworCQkJcmwtPnZjbiA9IGVuZDsKKwkJCXJsLT5sZW5ndGggLT0gZGVsdGE7CisJCQkvKiBPbmx5IGFkanVzdCB0aGUgbGNuIGlmIGl0IGlzIHJlYWwuICovCisJCQlpZiAocmwtPmxjbiA+PSAwKQorCQkJCXJsLT5sY24gKz0gZGVsdGE7CisJCX0KK3Nocmlua19hbGxvY2F0aW9uOgorCQkvKiBSZWFsbG9jYXRlIG1lbW9yeSBpZiB0aGUgYWxsb2NhdGlvbiBjaGFuZ2VkLiAqLworCQlpZiAocmwgPCBybF9lbmQpIHsKKwkJCXJsID0gbnRmc19ybF9yZWFsbG9jKHJ1bmxpc3QtPnJsLCBvbGRfc2l6ZSwKKwkJCQkJb2xkX3NpemUgLSAocmxfZW5kIC0gcmwpKTsKKwkJCWlmIChJU19FUlIocmwpKQorCQkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiRmFpbGVkIHRvIHNocmluayAiCisJCQkJCQkicnVubGlzdCBidWZmZXIuICBUaGlzIGp1c3QgIgorCQkJCQkJIndhc3RlcyBhIGJpdCBvZiBtZW1vcnkgIgorCQkJCQkJInRlbXBvcmFyaWx5IHNvIHdlIGlnbm9yZSBpdCAiCisJCQkJCQkiYW5kIHJldHVybiBzdWNjZXNzLiIpOworCQkJZWxzZQorCQkJCXJ1bmxpc3QtPnJsID0gcmw7CisJCX0KKwkJbnRmc19kZWJ1ZygiRG9uZSAoZXh0ZW5kIGhvbGUpLiIpOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBJZiBAc3RhcnQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHJ1biB0aGluZ3MgYXJlIGVhc2llciBhcyB0aGVyZSBpcworCSAqIG5vIG5lZWQgdG8gc3BsaXQgdGhlIGZpcnN0IHJ1bi4KKwkgKi8KKwlpZiAoc3RhcnQgPT0gcmwtPnZjbikgeworCQkvKgorCQkgKiBAc3RhcnQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHJ1bi4KKwkJICoKKwkJICogSWYgdGhlIHByZXZpb3VzIHJ1biBpcyBzcGFyc2UsIGV4dGVuZCBpdHMgaG9sZS4KKwkJICoKKwkJICogSWYgQGVuZCBpcyBub3QgaW4gdGhlIHNhbWUgcnVuLCBzd2l0Y2ggdGhlIHJ1biB0byBiZSBzcGFyc2UKKwkJICogYW5kIGV4dGVuZCB0aGUgbmV3bHkgY3JlYXRlZCBob2xlLgorCQkgKgorCQkgKiBUaHVzIGJvdGggb2YgdGhlc2UgY2FzZXMgcmVkdWNlIHRoZSBwcm9ibGVtIHRvIHRoZSBhYm92ZQorCQkgKiBjYXNlIG9mICJAc3RhcnQgaXMgaW4gYSBob2xlIi4KKwkJICovCisJCWlmIChybCA+IHJ1bmxpc3QtPnJsICYmIChybCAtIDEpLT5sY24gPT0gTENOX0hPTEUpIHsKKwkJCXJsLS07CisJCQlnb3RvIGV4dGVuZF9ob2xlOworCQl9CisJCWlmIChlbmQgPj0gcmxbMV0udmNuKSB7CisJCQlybC0+bGNuID0gTENOX0hPTEU7CisJCQlnb3RvIGV4dGVuZF9ob2xlOworCQl9CisJCS8qCisJCSAqIFRoZSBmaW5hbCBjYXNlIGlzIHdoZW4gQGVuZCBpcyBpbiB0aGUgc2FtZSBydW4gYXMgQHN0YXJ0LgorCQkgKiBGb3IgdGhpcyBuZWVkIHRvIHNwbGl0IHRoZSBydW4gaW50byB0d28uICBPbmUgcnVuIGZvciB0aGUKKwkJICogc3BhcnNlIHJlZ2lvbiBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9sZCBydW4sIGkuZS4KKwkJICogQHN0YXJ0LCBhbmQgQGVuZCBhbmQgb25lIGZvciB0aGUgcmVtYWluaW5nIG5vbi1zcGFyc2UKKwkJICogcmVnaW9uLCBpLmUuIGJldHdlZW4gQGVuZCBhbmQgdGhlIGVuZCBvZiB0aGUgb2xkIHJ1bi4KKwkJICovCisJCXRybCA9IG50ZnNfcmxfcmVhbGxvYyhydW5saXN0LT5ybCwgb2xkX3NpemUsIG9sZF9zaXplICsgMSk7CisJCWlmIChJU19FUlIodHJsKSkKKwkJCWdvdG8gZW5vbWVtX291dDsKKwkJb2xkX3NpemUrKzsKKwkJaWYgKHJ1bmxpc3QtPnJsICE9IHRybCkgeworCQkJcmwgPSB0cmwgKyAocmwgLSBydW5saXN0LT5ybCk7CisJCQlybF9lbmQgPSB0cmwgKyAocmxfZW5kIC0gcnVubGlzdC0+cmwpOworCQkJcmxfcmVhbF9lbmQgPSB0cmwgKyAocmxfcmVhbF9lbmQgLSBydW5saXN0LT5ybCk7CisJCQlydW5saXN0LT5ybCA9IHRybDsKKwkJfQorc3BsaXRfZW5kOgorCQkvKiBTaGlmdCBhbGwgdGhlIHJ1bnMgdXAgYnkgb25lLiAqLworCQltZW1tb3ZlKHJsICsgMSwgcmwsIChybF9yZWFsX2VuZCAtIHJsICsgMSkgKiBzaXplb2YoKnJsKSk7CisJCS8qIEZpbmFsbHksIHNldHVwIHRoZSB0d28gc3BsaXQgcnVucy4gKi8KKwkJcmwtPmxjbiA9IExDTl9IT0xFOworCQlybC0+bGVuZ3RoID0gbGVuZ3RoOworCQlybCsrOworCQlybC0+dmNuICs9IGxlbmd0aDsKKwkJLyogT25seSBhZGp1c3QgdGhlIGxjbiBpZiBpdCBpcyByZWFsLiAqLworCQlpZiAocmwtPmxjbiA+PSAwIHx8IGxjbl9maXh1cCkKKwkJCXJsLT5sY24gKz0gbGVuZ3RoOworCQlybC0+bGVuZ3RoIC09IGxlbmd0aDsKKwkJbnRmc19kZWJ1ZygiRG9uZSAoc3BsaXQgb25lKS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogQHN0YXJ0IGlzIG5laXRoZXIgaW4gYSBob2xlIG5vciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcnVuLgorCSAqCisJICogSWYgQGVuZCBpcyBpbiBhIGhvbGUsIHRoaW5ncyBhcmUgZWFzaWVyIGFzIHNpbXBseSB0cnVuY2F0aW5nIHRoZSBydW4KKwkgKiBAc3RhcnQgaXMgaW4gdG8gZW5kIGF0IEBzdGFydCAtIDEsIGRlbGV0aW5nIGFsbCBydW5zIGFmdGVyIHRoYXQgdXAKKwkgKiB0byBAZW5kLCBhbmQgZmluYWxseSBleHRlbmRpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgcnVuIEBlbmQgaXMgaW4KKwkgKiB0byBiZSBAc3RhcnQgaXMgYWxsIHRoYXQgaXMgbmVlZGVkLgorCSAqLworCWlmIChybF9lbmQtPmxjbiA9PSBMQ05fSE9MRSkgeworCQkvKiBUcnVuY2F0ZSB0aGUgcnVuIGNvbnRhaW5pbmcgQHN0YXJ0LiAqLworCQlybC0+bGVuZ3RoID0gc3RhcnQgLSBybC0+dmNuOworCQlybCsrOworCQkvKiBDdXQgb3V0IGFsbCBydW5saXN0IGVsZW1lbnRzIHVwIHRvIEBlbmQuICovCisJCWlmIChybCA8IHJsX2VuZCkKKwkJCW1lbW1vdmUocmwsIHJsX2VuZCwgKHJsX3JlYWxfZW5kIC0gcmxfZW5kICsgMSkgKgorCQkJCQlzaXplb2YoKnJsKSk7CisJCS8qIEV4dGVuZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBydW4gQGVuZCBpcyBpbiB0byBiZSBAc3RhcnQuICovCisJCXJsLT52Y24gPSBzdGFydDsKKwkJcmwtPmxlbmd0aCA9IHJsWzFdLnZjbiAtIHN0YXJ0OworCQlnb3RvIHNocmlua19hbGxvY2F0aW9uOworCX0KKwkvKiAKKwkgKiBJZiBAZW5kIGlzIG5vdCBpbiBhIGhvbGUgdGhlcmUgYXJlIHN0aWxsIHR3byBjYXNlcyB0byBkaXN0aW5ndWlzaC4KKwkgKiBFaXRoZXIgQGVuZCBpcyBvciBpcyBub3QgaW4gdGhlIHNhbWUgcnVuIGFzIEBzdGFydC4KKwkgKgorCSAqIFRoZSBzZWNvbmQgY2FzZSBpcyBlYXNpZXIgYXMgaXQgY2FuIGJlIHJlZHVjZWQgdG8gYW4gYWxyZWFkeSBzb2x2ZWQKKwkgKiBwcm9ibGVtIGJ5IHRydW5jYXRpbmcgdGhlIHJ1biBAc3RhcnQgaXMgaW4gdG8gZW5kIGF0IEBzdGFydCAtIDEuCisJICogVGhlbiwgaWYgQGVuZCBpcyBpbiB0aGUgbmV4dCBydW4gbmVlZCB0byBzcGxpdCB0aGUgcnVuIGludG8gYSBzcGFyc2UKKwkgKiBydW4gZm9sbG93ZWQgYnkgYSBub24tc3BhcnNlIHJ1biAoYWxyZWFkeSBjb3ZlcmVkIGFib3ZlKSBhbmQgaWYgQGVuZAorCSAqIGlzIG5vdCBpbiB0aGUgbmV4dCBydW4gc3dpdGNoaW5nIGl0IHRvIGJlIHNwYXJzZSwgYWdhaW4gcmVkdWNlcyB0aGUKKwkgKiBwcm9ibGVtIHRvIHRoZSBhbHJlYWR5IGNvdmVyZWQgY2FzZSBvZiAiQHN0YXJ0IGlzIGluIGEgaG9sZSIuCisJICovCisJaWYgKGVuZCA+PSBybFsxXS52Y24pIHsKKwkJLyoKKwkJICogSWYgQGVuZCBpcyBub3QgaW4gdGhlIG5leHQgcnVuLCByZWR1Y2UgdGhlIHByb2JsZW0gdG8gdGhlCisJCSAqIGNhc2Ugb2YgIkBzdGFydCBpcyBpbiBhIGhvbGUiLgorCQkgKi8KKwkJaWYgKHJsWzFdLmxlbmd0aCAmJiBlbmQgPj0gcmxbMl0udmNuKSB7CisJCQkvKiBUcnVuY2F0ZSB0aGUgcnVuIGNvbnRhaW5pbmcgQHN0YXJ0LiAqLworCQkJcmwtPmxlbmd0aCA9IHN0YXJ0IC0gcmwtPnZjbjsKKwkJCXJsKys7CisJCQlybC0+dmNuID0gc3RhcnQ7CisJCQlybC0+bGNuID0gTENOX0hPTEU7CisJCQlnb3RvIGV4dGVuZF9ob2xlOworCQl9CisJCXRybCA9IG50ZnNfcmxfcmVhbGxvYyhydW5saXN0LT5ybCwgb2xkX3NpemUsIG9sZF9zaXplICsgMSk7CisJCWlmIChJU19FUlIodHJsKSkKKwkJCWdvdG8gZW5vbWVtX291dDsKKwkJb2xkX3NpemUrKzsKKwkJaWYgKHJ1bmxpc3QtPnJsICE9IHRybCkgeworCQkJcmwgPSB0cmwgKyAocmwgLSBydW5saXN0LT5ybCk7CisJCQlybF9lbmQgPSB0cmwgKyAocmxfZW5kIC0gcnVubGlzdC0+cmwpOworCQkJcmxfcmVhbF9lbmQgPSB0cmwgKyAocmxfcmVhbF9lbmQgLSBydW5saXN0LT5ybCk7CisJCQlydW5saXN0LT5ybCA9IHRybDsKKwkJfQorCQkvKiBUcnVuY2F0ZSB0aGUgcnVuIGNvbnRhaW5pbmcgQHN0YXJ0LiAqLworCQlybC0+bGVuZ3RoID0gc3RhcnQgLSBybC0+dmNuOworCQlybCsrOworCQkvKgorCQkgKiBAZW5kIGlzIGluIHRoZSBuZXh0IHJ1biwgcmVkdWNlIHRoZSBwcm9ibGVtIHRvIHRoZSBjYXNlCisJCSAqIHdoZXJlICJAc3RhcnQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHJ1biBhbmQgQGVuZCBpcyBpbgorCQkgKiB0aGUgc2FtZSBydW4gYXMgQHN0YXJ0Ii4KKwkJICovCisJCWRlbHRhID0gcmwtPnZjbiAtIHN0YXJ0OworCQlybC0+dmNuID0gc3RhcnQ7CisJCWlmIChybC0+bGNuID49IDApIHsKKwkJCXJsLT5sY24gLT0gZGVsdGE7CisJCQkvKiBOZWVkIHRoaXMgaW4gY2FzZSB0aGUgbGNuIGp1c3QgYmVjYW1lIG5lZ2F0aXZlLiAqLworCQkJbGNuX2ZpeHVwID0gVFJVRTsKKwkJfQorCQlybC0+bGVuZ3RoICs9IGRlbHRhOworCQlnb3RvIHNwbGl0X2VuZDsKKwl9CisJLyoKKwkgKiBUaGUgZmlyc3QgY2FzZSBmcm9tIGFib3ZlLCBpLmUuIEBlbmQgaXMgaW4gdGhlIHNhbWUgcnVuIGFzIEBzdGFydC4KKwkgKiBXZSBuZWVkIHRvIHNwbGl0IHRoZSBydW4gaW50byB0aHJlZS4gIE9uZSBydW4gZm9yIHRoZSBub24tc3BhcnNlCisJICogcmVnaW9uIGJldHdlZW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgb2xkIHJ1biBhbmQgQHN0YXJ0LCBvbmUgZm9yIHRoZQorCSAqIHNwYXJzZSByZWdpb24gYmV0d2VlbiBAc3RhcnQgYW5kIEBlbmQsIGFuZCBvbmUgZm9yIHRoZSByZW1haW5pbmcKKwkgKiBub24tc3BhcnNlIHJlZ2lvbiwgaS5lLiBiZXR3ZWVuIEBlbmQgYW5kIHRoZSBlbmQgb2YgdGhlIG9sZCBydW4uCisJICovCisJdHJsID0gbnRmc19ybF9yZWFsbG9jKHJ1bmxpc3QtPnJsLCBvbGRfc2l6ZSwgb2xkX3NpemUgKyAyKTsKKwlpZiAoSVNfRVJSKHRybCkpCisJCWdvdG8gZW5vbWVtX291dDsKKwlvbGRfc2l6ZSArPSAyOworCWlmIChydW5saXN0LT5ybCAhPSB0cmwpIHsKKwkJcmwgPSB0cmwgKyAocmwgLSBydW5saXN0LT5ybCk7CisJCXJsX2VuZCA9IHRybCArIChybF9lbmQgLSBydW5saXN0LT5ybCk7CisJCXJsX3JlYWxfZW5kID0gdHJsICsgKHJsX3JlYWxfZW5kIC0gcnVubGlzdC0+cmwpOworCQlydW5saXN0LT5ybCA9IHRybDsKKwl9CisJLyogU2hpZnQgYWxsIHRoZSBydW5zIHVwIGJ5IHR3by4gKi8KKwltZW1tb3ZlKHJsICsgMiwgcmwsIChybF9yZWFsX2VuZCAtIHJsICsgMSkgKiBzaXplb2YoKnJsKSk7CisJLyogRmluYWxseSwgc2V0dXAgdGhlIHRocmVlIHNwbGl0IHJ1bnMuICovCisJcmwtPmxlbmd0aCA9IHN0YXJ0IC0gcmwtPnZjbjsKKwlybCsrOworCXJsLT52Y24gPSBzdGFydDsKKwlybC0+bGNuID0gTENOX0hPTEU7CisJcmwtPmxlbmd0aCA9IGxlbmd0aDsKKwlybCsrOworCWRlbHRhID0gZW5kIC0gcmwtPnZjbjsKKwlybC0+dmNuID0gZW5kOworCXJsLT5sY24gKz0gZGVsdGE7CisJcmwtPmxlbmd0aCAtPSBkZWx0YTsKKwludGZzX2RlYnVnKCJEb25lIChzcGxpdCBib3RoKS4iKTsKKwlyZXR1cm4gMDsKK2Vub21lbV9vdXQ6CisJbnRmc19lcnJvcih2b2wtPnNiLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZXh0ZW5kIHJ1bmxpc3QgYnVmZmVyLiIpOworCXJldHVybiAtRU5PTUVNOworfQorCiAjZW5kaWYgLyogTlRGU19SVyAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9ydW5saXN0LmggYi9mcy9udGZzL3J1bmxpc3QuaAppbmRleCBhYTBlZTY1Li40NzcyOGZiIDEwMDY0NAotLS0gYS9mcy9udGZzL3J1bmxpc3QuaAorKysgYi9mcy9udGZzL3J1bmxpc3QuaApAQCAtOTQsNiArOTQsOSBAQAogZXh0ZXJuIGludCBudGZzX3JsX3RydW5jYXRlX25vbG9jayhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAogCQlydW5saXN0ICpjb25zdCBydW5saXN0LCBjb25zdCBzNjQgbmV3X2xlbmd0aCk7CiAKK2ludCBudGZzX3JsX3B1bmNoX25vbG9jayhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBydW5saXN0ICpjb25zdCBydW5saXN0LAorCQljb25zdCBWQ04gc3RhcnQsIGNvbnN0IHM2NCBsZW5ndGgpOworCiAjZW5kaWYgLyogTlRGU19SVyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX05URlNfUlVOTElTVF9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL3N1cGVyLmMgYi9mcy9udGZzL3N1cGVyLmMKaW5kZXggNDFhYThlYi4uYjJiMzkyOSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9zdXBlci5jCisrKyBiL2ZzL250ZnMvc3VwZXIuYwpAQCAtMTEzMyw3ICsxMTMzLDggQEAKICAqCiAgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGVycm9yLgogICovCi1zdGF0aWMgQk9PTCBsb2FkX2FuZF9jaGVja19sb2dmaWxlKG50ZnNfdm9sdW1lICp2b2wpCitzdGF0aWMgQk9PTCBsb2FkX2FuZF9jaGVja19sb2dmaWxlKG50ZnNfdm9sdW1lICp2b2wsCisJCVJFU1RBUlRfUEFHRV9IRUFERVIgKipycCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKnRtcF9pbm87CiAKQEAgLTExNDUsNyArMTE0Niw3IEBACiAJCS8qIENhbGxlciB3aWxsIGRpc3BsYXkgZXJyb3IgbWVzc2FnZS4gKi8KIAkJcmV0dXJuIEZBTFNFOwogCX0KLQlpZiAoIW50ZnNfY2hlY2tfbG9nZmlsZSh0bXBfaW5vKSkgeworCWlmICghbnRmc19jaGVja19sb2dmaWxlKHRtcF9pbm8sIHJwKSkgewogCQlpcHV0KHRtcF9pbm8pOwogCQkvKiBudGZzX2NoZWNrX2xvZ2ZpbGUoKSB3aWxsIGhhdmUgZGlzcGxheWVkIGVycm9yIG91dHB1dC4gKi8KIAkJcmV0dXJuIEZBTFNFOwpAQCAtMTY4OSw2ICsxNjkwLDcgQEAKIAlWT0xVTUVfSU5GT1JNQVRJT04gKnZpOwogCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CiAjaWZkZWYgTlRGU19SVworCVJFU1RBUlRfUEFHRV9IRUFERVIgKnJwOwogCWludCBlcnI7CiAjZW5kaWYgLyogTlRGU19SVyAqLwogCkBAIC0xODQxLDggKzE4NDMsOSBAQAogCSAqIEdldCB0aGUgaW5vZGUgZm9yIHRoZSBsb2dmaWxlLCBjaGVjayBpdCBhbmQgZGV0ZXJtaW5lIGlmIHRoZSB2b2x1bWUKIAkgKiB3YXMgc2h1dGRvd24gY2xlYW5seS4KIAkgKi8KLQlpZiAoIWxvYWRfYW5kX2NoZWNrX2xvZ2ZpbGUodm9sKSB8fAotCQkJIW50ZnNfaXNfbG9nZmlsZV9jbGVhbih2b2wtPmxvZ2ZpbGVfaW5vKSkgeworCXJwID0gTlVMTDsKKwlpZiAoIWxvYWRfYW5kX2NoZWNrX2xvZ2ZpbGUodm9sLCAmcnApIHx8CisJCQkhbnRmc19pc19sb2dmaWxlX2NsZWFuKHZvbC0+bG9nZmlsZV9pbm8sIHJwKSkgewogCQlzdGF0aWMgY29uc3QgY2hhciAqZXMxYSA9ICJGYWlsZWQgdG8gbG9hZCAkTG9nRmlsZSI7CiAJCXN0YXRpYyBjb25zdCBjaGFyICplczFiID0gIiRMb2dGaWxlIGlzIG5vdCBjbGVhbiI7CiAJCXN0YXRpYyBjb25zdCBjaGFyICplczIgPSAiLiAgTW91bnQgaW4gV2luZG93cy4iOwpAQCAtMTg1Nyw2ICsxODYwLDEwIEBACiAJCQkJCQkiY29udGludWUgbm9yIG9uX2Vycm9ycz0iCiAJCQkJCQkicmVtb3VudC1ybyB3YXMgc3BlY2lmaWVkJXMiLAogCQkJCQkJZXMxLCBlczIpOworCQkJCWlmICh2b2wtPmxvZ2ZpbGVfaW5vKSB7CisJCQkJCUJVR19PTighcnApOworCQkJCQludGZzX2ZyZWUocnApOworCQkJCX0KIAkJCQlnb3RvIGlwdXRfbG9nZmlsZV9lcnJfb3V0OwogCQkJfQogCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CkBAIC0xODY3LDYgKzE4NzQsNyBAQAogCQkvKiBUaGlzIHdpbGwgcHJldmVudCBhIHJlYWQtd3JpdGUgcmVtb3VudC4gKi8KIAkJTlZvbFNldEVycm9ycyh2b2wpOwogCX0KKwludGZzX2ZyZWUocnApOwogI2VuZGlmIC8qIE5URlNfUlcgKi8KIAkvKiBHZXQgdGhlIHJvb3QgZGlyZWN0b3J5IGlub2RlIHNvIHdlIGNhbiBkbyBwYXRoIGxvb2t1cHMuICovCiAJdm9sLT5yb290X2lubyA9IG50ZnNfaWdldChzYiwgRklMRV9yb290KTsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvdW5pc3RyLmMgYi9mcy9udGZzL3VuaXN0ci5jCmluZGV4IDE5YzQyZTIuLmEzODlhNWEgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvdW5pc3RyLmMKKysrIGIvZnMvbnRmcy91bmlzdHIuYwpAQCAtMzcyLDcgKzM3Miw4IEBACiAJcmV0dXJuIC1FSU5WQUw7CiBjb252ZXJzaW9uX2VycjoKIAludGZzX2Vycm9yKHZvbC0+c2IsICJVbmljb2RlIG5hbWUgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IGNhbm5vdCBiZSAiCi0JCQkiY29udmVydGVkIHRvIGNoYXJhY3RlciBzZXQgJXMuIiwgbmxzLT5jaGFyc2V0KTsKKwkJCSJjb252ZXJ0ZWQgdG8gY2hhcmFjdGVyIHNldCAlcy4gIFlvdSBtaWdodCB3YW50IHRvICIKKwkJCSJ0cnkgdG8gdXNlIHRoZSBtb3VudCBvcHRpb24gbmxzPXV0ZjguIiwgbmxzLT5jaGFyc2V0KTsKIAlpZiAobnMgIT0gKm91dHMpCiAJCWtmcmVlKG5zKTsKIAlpZiAod2MgIT0gLUVOQU1FVE9PTE9ORykKZGlmZiAtLWdpdCBhL2ZzL29wZW4uYyBiL2ZzL29wZW4uYwppbmRleCAzMmJmMDVlLi4yZmFjNThjIDEwMDY0NAotLS0gYS9mcy9vcGVuLmMKKysrIGIvZnMvb3Blbi5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCkBAIC04NDIsMTQgKzg0MywxNiBAQAogewogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwogCWludCBmZCwgZXJyb3I7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAogICAJZXJyb3IgPSAtRU1GSUxFOwogCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CiAKIHJlcGVhdDoKLSAJZmQgPSBmaW5kX25leHRfemVyb19iaXQoZmlsZXMtPm9wZW5fZmRzLT5mZHNfYml0cywgCi0JCQkJZmlsZXMtPm1heF9mZHNldCwgCi0JCQkJZmlsZXMtPm5leHRfZmQpOworCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOworIAlmZCA9IGZpbmRfbmV4dF96ZXJvX2JpdChmZHQtPm9wZW5fZmRzLT5mZHNfYml0cywKKwkJCQlmZHQtPm1heF9mZHNldCwKKwkJCQlmZHQtPm5leHRfZmQpOwogCiAJLyoKIAkgKiBOLkIuIEZvciBjbG9uZSB0YXNrcyBzaGFyaW5nIGEgZmlsZXMgc3RydWN0dXJlLCB0aGlzIHRlc3QKQEAgLTg3MiwxNCArODc1LDE0IEBACiAJCWdvdG8gcmVwZWF0OwogCX0KIAotCUZEX1NFVChmZCwgZmlsZXMtPm9wZW5fZmRzKTsKLQlGRF9DTFIoZmQsIGZpbGVzLT5jbG9zZV9vbl9leGVjKTsKLQlmaWxlcy0+bmV4dF9mZCA9IGZkICsgMTsKKwlGRF9TRVQoZmQsIGZkdC0+b3Blbl9mZHMpOworCUZEX0NMUihmZCwgZmR0LT5jbG9zZV9vbl9leGVjKTsKKwlmZHQtPm5leHRfZmQgPSBmZCArIDE7CiAjaWYgMQogCS8qIFNhbml0eSBjaGVjayAqLwotCWlmIChmaWxlcy0+ZmRbZmRdICE9IE5VTEwpIHsKKwlpZiAoZmR0LT5mZFtmZF0gIT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJnZXRfdW51c2VkX2ZkOiBzbG90ICVkIG5vdCBOVUxMIVxuIiwgZmQpOwotCQlmaWxlcy0+ZmRbZmRdID0gTlVMTDsKKwkJZmR0LT5mZFtmZF0gPSBOVUxMOwogCX0KICNlbmRpZgogCWVycm9yID0gZmQ7CkBAIC04OTMsOSArODk2LDEwIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3B1dF91bnVzZWRfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIHVuc2lnbmVkIGludCBmZCkKIHsKLQlfX0ZEX0NMUihmZCwgZmlsZXMtPm9wZW5fZmRzKTsKLQlpZiAoZmQgPCBmaWxlcy0+bmV4dF9mZCkKLQkJZmlsZXMtPm5leHRfZmQgPSBmZDsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJX19GRF9DTFIoZmQsIGZkdC0+b3Blbl9mZHMpOworCWlmIChmZCA8IGZkdC0+bmV4dF9mZCkKKwkJZmR0LT5uZXh0X2ZkID0gZmQ7CiB9CiAKIHZvaWQgZmFzdGNhbGwgcHV0X3VudXNlZF9mZCh1bnNpZ25lZCBpbnQgZmQpCkBAIC05MjQsMjUgKzkyOCwyMSBAQAogdm9pZCBmYXN0Y2FsbCBmZF9pbnN0YWxsKHVuc2lnbmVkIGludCBmZCwgc3RydWN0IGZpbGUgKiBmaWxlKQogewogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gY3VycmVudC0+ZmlsZXM7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCWlmICh1bmxpa2VseShmaWxlcy0+ZmRbZmRdICE9IE5VTEwpKQotCQlCVUcoKTsKLQlmaWxlcy0+ZmRbZmRdID0gZmlsZTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwlCVUdfT04oZmR0LT5mZFtmZF0gIT0gTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGZkdC0+ZmRbZmRdLCBmaWxlKTsKIAlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CiB9CiAKIEVYUE9SVF9TWU1CT0woZmRfaW5zdGFsbCk7CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfb3Blbihjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQorbG9uZyBkb19zeXNfb3Blbihjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIGludCBmbGFncywgaW50IG1vZGUpCiB7Ci0JY2hhciAqIHRtcDsKLQlpbnQgZmQ7CisJY2hhciAqdG1wID0gZ2V0bmFtZShmaWxlbmFtZSk7CisJaW50IGZkID0gUFRSX0VSUih0bXApOwogCi0JaWYgKGZvcmNlX29fbGFyZ2VmaWxlKCkpCi0JCWZsYWdzIHw9IE9fTEFSR0VGSUxFOwotCi0JdG1wID0gZ2V0bmFtZShmaWxlbmFtZSk7Ci0JZmQgPSBQVFJfRVJSKHRtcCk7CiAJaWYgKCFJU19FUlIodG1wKSkgewogCQlmZCA9IGdldF91bnVzZWRfZmQoKTsKIAkJaWYgKGZkID49IDApIHsKQEAgLTk1OSw2ICs5NTksMTQgQEAKIAl9CiAJcmV0dXJuIGZkOwogfQorCithc21saW5rYWdlIGxvbmcgc3lzX29wZW4oY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQoreworCWlmIChmb3JjZV9vX2xhcmdlZmlsZSgpKQorCQlmbGFncyB8PSBPX0xBUkdFRklMRTsKKworCXJldHVybiBkb19zeXNfb3BlbihmaWxlbmFtZSwgZmxhZ3MsIG1vZGUpOworfQogRVhQT1JUX1NZTUJPTF9HUEwoc3lzX29wZW4pOwogCiAjaWZuZGVmIF9fYWxwaGFfXwpAQCAtMTAwNywxNSArMTAxNSwxNyBAQAogewogCXN0cnVjdCBmaWxlICogZmlscDsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCWlmIChmZCA+PSBmaWxlcy0+bWF4X2ZkcykKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwlpZiAoZmQgPj0gZmR0LT5tYXhfZmRzKQogCQlnb3RvIG91dF91bmxvY2s7Ci0JZmlscCA9IGZpbGVzLT5mZFtmZF07CisJZmlscCA9IGZkdC0+ZmRbZmRdOwogCWlmICghZmlscCkKIAkJZ290byBvdXRfdW5sb2NrOwotCWZpbGVzLT5mZFtmZF0gPSBOVUxMOwotCUZEX0NMUihmZCwgZmlsZXMtPmNsb3NlX29uX2V4ZWMpOworCXJjdV9hc3NpZ25fcG9pbnRlcihmZHQtPmZkW2ZkXSwgTlVMTCk7CisJRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOwogCV9fcHV0X3VudXNlZF9mZChmaWxlcywgZmQpOwogCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKIAlyZXR1cm4gZmlscF9jbG9zZShmaWxwLCBmaWxlcyk7CmRpZmYgLS1naXQgYS9mcy9waXBlLmMgYi9mcy9waXBlLmMKaW5kZXggMjVhYTA5Zi4uNjZhYTBiOSAxMDA2NDQKLS0tIGEvZnMvcGlwZS5jCisrKyBiL2ZzL3BpcGUuYwpAQCAtMzksNyArMzksMTEgQEAKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAotCXByZXBhcmVfdG9fd2FpdChQSVBFX1dBSVQoKmlub2RlKSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJLyoKKwkgKiBQaXBlcyBhcmUgc3lzdGVtLWxvY2FsIHJlc291cmNlcywgc28gc2xlZXBpbmcgb24gdGhlbQorCSAqIGlzIGNvbnNpZGVyZWQgYSBub25pbnRlcmFjdGl2ZSB3YWl0OgorCSAqLworCXByZXBhcmVfdG9fd2FpdChQSVBFX1dBSVQoKmlub2RlKSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRXxUQVNLX05PTklOVEVSQUNUSVZFKTsKIAl1cChQSVBFX1NFTSgqaW5vZGUpKTsKIAlzY2hlZHVsZSgpOwogCWZpbmlzaF93YWl0KFBJUEVfV0FJVCgqaW5vZGUpLCAmd2FpdCk7CkBAIC00MTUsNiArNDE5LDEwIEBACiAKIAlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKIAkJbWFzayB8PSAobnJidWZzIDwgUElQRV9CVUZGRVJTKSA/IFBPTExPVVQgfCBQT0xMV1JOT1JNIDogMDsKKwkJLyoKKwkJICogTW9zdCBVbmljZXMgZG8gbm90IHNldCBQT0xMRVJSIGZvciBGSUZPcyBidXQgb24gTGludXggdGhleQorCQkgKiBiZWhhdmUgZXhhY3RseSBsaWtlIHBpcGVzIGZvciBwb2xsKCkuCisJCSAqLwogCQlpZiAoIVBJUEVfUkVBREVSUygqaW5vZGUpKQogCQkJbWFzayB8PSBQT0xMRVJSOwogCX0KQEAgLTQyMiw5ICs0MzAsNiBAQAogCXJldHVybiBtYXNrOwogfQogCi0vKiBGSVhNRTogbW9zdCBVbmljZXMgZG8gbm90IHNldCBQT0xMRVJSIGZvciBmaWZvcyAqLwotI2RlZmluZSBmaWZvX3BvbGwgcGlwZV9wb2xsCi0KIHN0YXRpYyBpbnQKIHBpcGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZGVjciwgaW50IGRlY3cpCiB7CkBAIC01NjgsNyArNTczLDcgQEAKIAkucmVhZAkJPSBwaXBlX3JlYWQsCiAJLnJlYWR2CQk9IHBpcGVfcmVhZHYsCiAJLndyaXRlCQk9IGJhZF9waXBlX3csCi0JLnBvbGwJCT0gZmlmb19wb2xsLAorCS5wb2xsCQk9IHBpcGVfcG9sbCwKIAkuaW9jdGwJCT0gcGlwZV9pb2N0bCwKIAkub3BlbgkJPSBwaXBlX3JlYWRfb3BlbiwKIAkucmVsZWFzZQk9IHBpcGVfcmVhZF9yZWxlYXNlLApAQCAtNTgwLDcgKzU4NSw3IEBACiAJLnJlYWQJCT0gYmFkX3BpcGVfciwKIAkud3JpdGUJCT0gcGlwZV93cml0ZSwKIAkud3JpdGV2CQk9IHBpcGVfd3JpdGV2LAotCS5wb2xsCQk9IGZpZm9fcG9sbCwKKwkucG9sbAkJPSBwaXBlX3BvbGwsCiAJLmlvY3RsCQk9IHBpcGVfaW9jdGwsCiAJLm9wZW4JCT0gcGlwZV93cml0ZV9vcGVuLAogCS5yZWxlYXNlCT0gcGlwZV93cml0ZV9yZWxlYXNlLApAQCAtNTkzLDcgKzU5OCw3IEBACiAJLnJlYWR2CQk9IHBpcGVfcmVhZHYsCiAJLndyaXRlCQk9IHBpcGVfd3JpdGUsCiAJLndyaXRldgkJPSBwaXBlX3dyaXRldiwKLQkucG9sbAkJPSBmaWZvX3BvbGwsCisJLnBvbGwJCT0gcGlwZV9wb2xsLAogCS5pb2N0bAkJPSBwaXBlX2lvY3RsLAogCS5vcGVuCQk9IHBpcGVfcmR3cl9vcGVuLAogCS5yZWxlYXNlCT0gcGlwZV9yZHdyX3JlbGVhc2UsCmRpZmYgLS1naXQgYS9mcy9wcm9jL2FycmF5LmMgYi9mcy9wcm9jL2FycmF5LmMKaW5kZXggMzc2NjhmZS4uZDg4ZDUxOCAxMDA2NDQKLS0tIGEvZnMvcHJvYy9hcnJheS5jCisrKyBiL2ZzL3Byb2MvYXJyYXkuYwpAQCAtMTU5LDYgKzE1OSw3IEBACiB7CiAJc3RydWN0IGdyb3VwX2luZm8gKmdyb3VwX2luZm87CiAJaW50IGc7CisJc3RydWN0IGZkdGFibGUgKmZkdCA9IE5VTEw7CiAKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwKQEAgLTE3OSwxMCArMTgwLDEyIEBACiAJCXAtPmdpZCwgcC0+ZWdpZCwgcC0+c2dpZCwgcC0+ZnNnaWQpOwogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAl0YXNrX2xvY2socCk7CisJaWYgKHAtPmZpbGVzKQorCQlmZHQgPSBmaWxlc19mZHRhYmxlKHAtPmZpbGVzKTsKIAlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsCiAJCSJGRFNpemU6XHQlZFxuIgogCQkiR3JvdXBzOlx0IiwKLQkJcC0+ZmlsZXMgPyBwLT5maWxlcy0+bWF4X2ZkcyA6IDApOworCQlmZHQgPyBmZHQtPm1heF9mZHMgOiAwKTsKIAogCWdyb3VwX2luZm8gPSBwLT5ncm91cF9pbmZvOwogCWdldF9ncm91cF9pbmZvKGdyb3VwX2luZm8pOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuYwppbmRleCA0OTFmMmQ5Li4yM2RiNDUyIDEwMDY0NAotLS0gYS9mcy9wcm9jL2Jhc2UuYworKysgYi9mcy9wcm9jL2Jhc2UuYwpAQCAtMTEsNiArMTEsNDAgQEAKICAqICBnbyBpbnRvIGljYWNoZS4gV2UgY2FjaGUgdGhlIHJlZmVyZW5jZSB0byB0YXNrX3N0cnVjdCB1cG9uIGxvb2t1cCB0b28uCiAgKiAgRXZlbnR1YWxseSBpdCBzaG91bGQgYmVjb21lIGEgZmlsZXN5c3RlbSBpbiBpdHMgb3duLiBXZSBkb24ndCB1c2UgdGhlCiAgKiAgcmVzdCBvZiBwcm9jZnMgYW55bW9yZS4KKyAqCisgKgorICogIENoYW5nZWxvZzoKKyAqICAxNy1KYW4tMjAwNQorICogIEFsbGFuIEJlemVycmEKKyAqICBCcnVuYSBNb3JlaXJhIDxicnVuYS5tb3JlaXJhQGluZHQub3JnLmJyPgorICogIEVkamFyZCBNb3RhIDxlZGphcmQubW90YUBpbmR0Lm9yZy5icj4KKyAqICBJbGlhcyBCaXJpcyA8aWxpYXMuYmlyaXNAaW5kdC5vcmcuYnI+CisgKiAgTWF1cmljaW8gTGluIDxtYXVyaWNpby5saW5AaW5kdC5vcmcuYnI+CisgKgorICogIEVtYmVkZGVkIExpbnV4IExhYiAtIDEwTEUgSW5zdGl0dXRvIE5va2lhIGRlIFRlY25vbG9naWEgLSBJTmRUCisgKgorICogIEEgbmV3IHByb2Nlc3Mgc3BlY2lmaWMgZW50cnkgKHNtYXBzKSBpbmNsdWRlZCBpbiAvcHJvYy4gSXQgc2hvd3MgdGhlCisgKiAgc2l6ZSBvZiByc3MgZm9yIGVhY2ggbWVtb3J5IGFyZWEuIFRoZSBtYXBzIGVudHJ5IGxhY2tzIGluZm9ybWF0aW9uCisgKiAgYWJvdXQgcGh5c2ljYWwgbWVtb3J5IHNpemUgKHJzcykgZm9yIGVhY2ggbWFwcGVkIGZpbGUsIGkuZS4sCisgKiAgcnNzIGluZm9ybWF0aW9uIGZvciBleGVjdXRhYmxlcyBhbmQgbGlicmFyeSBmaWxlcy4KKyAqICBUaGlzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgdXNlZnVsIGZvciBhbnkgdG9vbHMgdGhhdCBuZWVkIHRvIGtub3cKKyAqICBhYm91dCBwaHlzaWNhbCBtZW1vcnkgY29uc3VtcHRpb24gZm9yIGEgcHJvY2VzcyBzcGVjaWZpYyBsaWJyYXJ5LgorICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgMjEtRmViLTIwMDUKKyAqICBFbWJlZGRlZCBMaW51eCBMYWIgLSAxMExFIEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhIC0gSU5kVAorICogIFB1ZCBpbmNsdXNpb24gaW4gdGhlIHBhZ2UgdGFibGUgd2Fsa2luZy4KKyAqCisgKiAgQ2hhbmdlTG9nOgorICogIDEwLU1hci0yMDA1CisgKiAgMTBMRSBJbnN0aXR1dG8gTm9raWEgZGUgVGVjbm9sb2dpYSAtIElOZFQ6CisgKiAgQSBiZXR0ZXIgd2F5IHRvIHdhbGtzIHRocm91Z2ggdGhlIHBhZ2UgdGFibGUgYXMgc3VnZ2VzdGVkIGJ5IEh1Z2ggRGlja2lucy4KKyAqCisgKiAgU2ltbyBQaWlyb2luZW4gPHNpbW8ucGlpcm9pbmVuQG5va2lhLmNvbT46CisgKiAgU21hcHMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBzaGFyZWQsIHByaXZhdGUsIGNsZWFuIGFuZCBkaXJ0eSBwYWdlcy4KKyAqCisgKiAgUGF1bCBNdW5kdCA8cGF1bC5tdW5kdEBub2tpYS5jb20+OgorICogIE92ZXJhbGwgcmV2aXNpb24gYWJvdXQgc21hcHMuCiAgKi8KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0yOCw2ICs2Miw3IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CkBAIC02NSw4ICsxMDAsMTAgQEAKIAlQUk9DX1RHSURfU1RBVCwKIAlQUk9DX1RHSURfU1RBVE0sCiAJUFJPQ19UR0lEX01BUFMsCisJUFJPQ19UR0lEX05VTUFfTUFQUywKIAlQUk9DX1RHSURfTU9VTlRTLAogCVBST0NfVEdJRF9XQ0hBTiwKKwlQUk9DX1RHSURfU01BUFMsCiAjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKIAlQUk9DX1RHSURfU0NIRURTVEFULAogI2VuZGlmCkBAIC04Myw3ICsxMjAsNiBAQAogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKIAlQUk9DX1RHSURfTE9HSU5VSUQsCiAjZW5kaWYKLQlQUk9DX1RHSURfRkRfRElSLAogCVBST0NfVEdJRF9PT01fU0NPUkUsCiAJUFJPQ19UR0lEX09PTV9BREpVU1QsCiAJUFJPQ19USURfSU5PLApAQCAtMTAyLDggKzEzOCwxMCBAQAogCVBST0NfVElEX1NUQVQsCiAJUFJPQ19USURfU1RBVE0sCiAJUFJPQ19USURfTUFQUywKKwlQUk9DX1RJRF9OVU1BX01BUFMsCiAJUFJPQ19USURfTU9VTlRTLAogCVBST0NfVElEX1dDSEFOLAorCVBST0NfVElEX1NNQVBTLAogI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCiAJUFJPQ19USURfU0NIRURTVEFULAogI2VuZGlmCkBAIC0xMjAsOSArMTU4LDExIEBACiAjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAogCVBST0NfVElEX0xPR0lOVUlELAogI2VuZGlmCi0JUFJPQ19USURfRkRfRElSID0gMHg4MDAwLAkvKiAweDgwMDAtMHhmZmZmICovCiAJUFJPQ19USURfT09NX1NDT1JFLAogCVBST0NfVElEX09PTV9BREpVU1QsCisKKwkvKiBBZGQgbmV3IGVudHJpZXMgYmVmb3JlIHRoaXMgKi8KKwlQUk9DX1RJRF9GRF9ESVIgPSAweDgwMDAsCS8qIDB4ODAwMC0weGZmZmYgKi8KIH07CiAKIHN0cnVjdCBwaWRfZW50cnkgewpAQCAtMTQ0LDYgKzE4NCw5IEBACiAJRShQUk9DX1RHSURfU1RBVCwgICAgICAic3RhdCIsICAgIFNfSUZSRUd8U19JUlVHTyksCiAJRShQUk9DX1RHSURfU1RBVE0sICAgICAic3RhdG0iLCAgIFNfSUZSRUd8U19JUlVHTyksCiAJRShQUk9DX1RHSURfTUFQUywgICAgICAibWFwcyIsICAgIFNfSUZSRUd8U19JUlVHTyksCisjaWZkZWYgQ09ORklHX05VTUEKKwlFKFBST0NfVEdJRF9OVU1BX01BUFMsICJudW1hX21hcHMiLCBTX0lGUkVHfFNfSVJVR08pLAorI2VuZGlmCiAJRShQUk9DX1RHSURfTUVNLCAgICAgICAibWVtIiwgICAgIFNfSUZSRUd8U19JUlVTUnxTX0lXVVNSKSwKICNpZmRlZiBDT05GSUdfU0VDQ09NUAogCUUoUFJPQ19UR0lEX1NFQ0NPTVAsICAgInNlY2NvbXAiLCBTX0lGUkVHfFNfSVJVU1J8U19JV1VTUiksCkBAIC0xNTIsNiArMTk1LDcgQEAKIAlFKFBST0NfVEdJRF9ST09ULCAgICAgICJyb290IiwgICAgU19JRkxOS3xTX0lSV1hVR08pLAogCUUoUFJPQ19UR0lEX0VYRSwgICAgICAgImV4ZSIsICAgICBTX0lGTE5LfFNfSVJXWFVHTyksCiAJRShQUk9DX1RHSURfTU9VTlRTLCAgICAibW91bnRzIiwgIFNfSUZSRUd8U19JUlVHTyksCisJRShQUk9DX1RHSURfU01BUFMsICAgICAic21hcHMiLCAgIFNfSUZSRUd8U19JUlVHTyksCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCiAJRShQUk9DX1RHSURfQVRUUiwgICAgICAiYXR0ciIsICAgIFNfSUZESVJ8U19JUlVHT3xTX0lYVUdPKSwKICNlbmRpZgpAQCAtMTgwLDYgKzIyNCw5IEBACiAJRShQUk9DX1RJRF9TVEFULCAgICAgICAic3RhdCIsICAgIFNfSUZSRUd8U19JUlVHTyksCiAJRShQUk9DX1RJRF9TVEFUTSwgICAgICAic3RhdG0iLCAgIFNfSUZSRUd8U19JUlVHTyksCiAJRShQUk9DX1RJRF9NQVBTLCAgICAgICAibWFwcyIsICAgIFNfSUZSRUd8U19JUlVHTyksCisjaWZkZWYgQ09ORklHX05VTUEKKwlFKFBST0NfVElEX05VTUFfTUFQUywgICJudW1hX21hcHMiLCAgICBTX0lGUkVHfFNfSVJVR08pLAorI2VuZGlmCiAJRShQUk9DX1RJRF9NRU0sICAgICAgICAibWVtIiwgICAgIFNfSUZSRUd8U19JUlVTUnxTX0lXVVNSKSwKICNpZmRlZiBDT05GSUdfU0VDQ09NUAogCUUoUFJPQ19USURfU0VDQ09NUCwgICAgInNlY2NvbXAiLCBTX0lGUkVHfFNfSVJVU1J8U19JV1VTUiksCkBAIC0xODgsNiArMjM1LDcgQEAKIAlFKFBST0NfVElEX1JPT1QsICAgICAgICJyb290IiwgICAgU19JRkxOS3xTX0lSV1hVR08pLAogCUUoUFJPQ19USURfRVhFLCAgICAgICAgImV4ZSIsICAgICBTX0lGTE5LfFNfSVJXWFVHTyksCiAJRShQUk9DX1RJRF9NT1VOVFMsICAgICAibW91bnRzIiwgIFNfSUZSRUd8U19JUlVHTyksCisJRShQUk9DX1RJRF9TTUFQUywgICAgICAic21hcHMiLCAgIFNfSUZSRUd8U19JUlVHTyksCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCiAJRShQUk9DX1RJRF9BVFRSLCAgICAgICAiYXR0ciIsICAgIFNfSUZESVJ8U19JUlVHT3xTX0lYVUdPKSwKICNlbmRpZgpAQCAtMjM2LDMwICsyODQsMzYgQEAKIAogCWZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0YXNrKTsKIAlpZiAoZmlsZXMpIHsKLQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJcmN1X3JlYWRfbG9jaygpOwogCQlmaWxlID0gZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCk7CiAJCWlmIChmaWxlKSB7CiAJCQkqbW50ID0gbW50Z2V0KGZpbGUtPmZfdmZzbW50KTsKIAkJCSpkZW50cnkgPSBkZ2V0KGZpbGUtPmZfZGVudHJ5KTsKLQkJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKIAl9CiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19jd2RfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5LCBzdHJ1Y3QgdmZzbW91bnQgKiptbnQpCitzdGF0aWMgc3RydWN0IGZzX3N0cnVjdCAqZ2V0X2ZzX3N0cnVjdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJc3RydWN0IGZzX3N0cnVjdCAqZnM7Ci0JaW50IHJlc3VsdCA9IC1FTk9FTlQ7Ci0JdGFza19sb2NrKHByb2NfdGFzayhpbm9kZSkpOwotCWZzID0gcHJvY190YXNrKGlub2RlKS0+ZnM7CisJdGFza19sb2NrKHRhc2spOworCWZzID0gdGFzay0+ZnM7CiAJaWYoZnMpCiAJCWF0b21pY19pbmMoJmZzLT5jb3VudCk7Ci0JdGFza191bmxvY2socHJvY190YXNrKGlub2RlKSk7CisJdGFza191bmxvY2sodGFzayk7CisJcmV0dXJuIGZzOworfQorCitzdGF0aWMgaW50IHByb2NfY3dkX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSwgc3RydWN0IHZmc21vdW50ICoqbW50KQoreworCXN0cnVjdCBmc19zdHJ1Y3QgKmZzID0gZ2V0X2ZzX3N0cnVjdChwcm9jX3Rhc2soaW5vZGUpKTsKKwlpbnQgcmVzdWx0ID0gLUVOT0VOVDsKIAlpZiAoZnMpIHsKIAkJcmVhZF9sb2NrKCZmcy0+bG9jayk7CiAJCSptbnQgPSBtbnRnZXQoZnMtPnB3ZG1udCk7CkBAIC0yNzMsMTMgKzMyNyw4IEBACiAKIHN0YXRpYyBpbnQgcHJvY19yb290X2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSwgc3RydWN0IHZmc21vdW50ICoqbW50KQogewotCXN0cnVjdCBmc19zdHJ1Y3QgKmZzOworCXN0cnVjdCBmc19zdHJ1Y3QgKmZzID0gZ2V0X2ZzX3N0cnVjdChwcm9jX3Rhc2soaW5vZGUpKTsKIAlpbnQgcmVzdWx0ID0gLUVOT0VOVDsKLQl0YXNrX2xvY2socHJvY190YXNrKGlub2RlKSk7Ci0JZnMgPSBwcm9jX3Rhc2soaW5vZGUpLT5mczsKLQlpZihmcykKLQkJYXRvbWljX2luYygmZnMtPmNvdW50KTsKLQl0YXNrX3VubG9jayhwcm9jX3Rhc2soaW5vZGUpKTsKIAlpZiAoZnMpIHsKIAkJcmVhZF9sb2NrKCZmcy0+bG9jayk7CiAJCSptbnQgPSBtbnRnZXQoZnMtPnJvb3RtbnQpOwpAQCAtMjk4LDMzICszNDcsNiBAQAogCSAodGFzay0+c3RhdGUgPT0gVEFTS19TVE9QUEVEIHx8IHRhc2stPnN0YXRlID09IFRBU0tfVFJBQ0VEKSAmJiBcCiAJIHNlY3VyaXR5X3B0cmFjZShjdXJyZW50LHRhc2spID09IDApKQogCi1zdGF0aWMgaW50IG1heV9wdHJhY2VfYXR0YWNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQotCXRhc2tfbG9jayh0YXNrKTsKLQotCWlmICghdGFzay0+bW0pCi0JCWdvdG8gb3V0OwotCWlmICgoKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT5ldWlkKSB8fAotCSAgICAgKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT5zdWlkKSB8fAotCSAgICAgKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT51aWQpIHx8Ci0JICAgICAoY3VycmVudC0+Z2lkICE9IHRhc2stPmVnaWQpIHx8Ci0JICAgICAoY3VycmVudC0+Z2lkICE9IHRhc2stPnNnaWQpIHx8Ci0JICAgICAoY3VycmVudC0+Z2lkICE9IHRhc2stPmdpZCkpICYmICFjYXBhYmxlKENBUF9TWVNfUFRSQUNFKSkKLQkJZ290byBvdXQ7Ci0Jcm1iKCk7Ci0JaWYgKHRhc2stPm1tLT5kdW1wYWJsZSAhPSAxICYmICFjYXBhYmxlKENBUF9TWVNfUFRSQUNFKSkKLQkJZ290byBvdXQ7Ci0JaWYgKHNlY3VyaXR5X3B0cmFjZShjdXJyZW50LCB0YXNrKSkKLQkJZ290byBvdXQ7Ci0KLQlyZXR2YWwgPSAxOwotb3V0OgotCXRhc2tfdW5sb2NrKHRhc2spOwotCXJldHVybiByZXR2YWw7Ci19Ci0KIHN0YXRpYyBpbnQgcHJvY19waWRfZW52aXJvbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKiBidWZmZXIpCiB7CiAJaW50IHJlcyA9IDA7CkBAIC0zMzQsNyArMzU2LDcgQEAKIAkJaWYgKGxlbiA+IFBBR0VfU0laRSkKIAkJCWxlbiA9IFBBR0VfU0laRTsKIAkJcmVzID0gYWNjZXNzX3Byb2Nlc3Nfdm0odGFzaywgbW0tPmVudl9zdGFydCwgYnVmZmVyLCBsZW4sIDApOwotCQlpZiAoIW1heV9wdHJhY2VfYXR0YWNoKHRhc2spKQorCQlpZiAoIXB0cmFjZV9tYXlfYXR0YWNoKHRhc2spKQogCQkJcmVzID0gLUVTUkNIOwogCQltbXB1dChtbSk7CiAJfQpAQCAtNTE1LDYgKzUzNyw0NiBAQAogCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCiB9OwogCisjaWZkZWYgQ09ORklHX05VTUEKK2V4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfbnVtYV9tYXBzX29wOworc3RhdGljIGludCBudW1hX21hcHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCWludCByZXQgPSBzZXFfb3BlbihmaWxlLCAmcHJvY19waWRfbnVtYV9tYXBzX29wKTsKKwlpZiAoIXJldCkgeworCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCW0tPnByaXZhdGUgPSB0YXNrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX251bWFfbWFwc19vcGVyYXRpb25zID0geworCS5vcGVuCQk9IG51bWFfbWFwc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfc21hcHNfb3A7CitzdGF0aWMgaW50IHNtYXBzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGlub2RlKTsKKwlpbnQgcmV0ID0gc2VxX29wZW4oZmlsZSwgJnByb2NfcGlkX3NtYXBzX29wKTsKKwlpZiAoIXJldCkgeworCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCW0tPnByaXZhdGUgPSB0YXNrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3NtYXBzX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gc21hcHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKwogZXh0ZXJuIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBtb3VudHNfb3A7CiBzdGF0aWMgaW50IG1vdW50c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewpAQCAtNTk3LDcgKzY1OSw3IEBACiAJaW50IHJldCA9IC1FU1JDSDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAotCWlmICghTUFZX1BUUkFDRSh0YXNrKSB8fCAhbWF5X3B0cmFjZV9hdHRhY2godGFzaykpCisJaWYgKCFNQVlfUFRSQUNFKHRhc2spIHx8ICFwdHJhY2VfbWF5X2F0dGFjaCh0YXNrKSkKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSAtRU5PTUVNOwpAQCAtNjIzLDcgKzY4NSw3IEBACiAKIAkJdGhpc19sZW4gPSAoY291bnQgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogY291bnQ7CiAJCXJldHZhbCA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRhc2ssIHNyYywgcGFnZSwgdGhpc19sZW4sIDApOwotCQlpZiAoIXJldHZhbCB8fCAhTUFZX1BUUkFDRSh0YXNrKSB8fCAhbWF5X3B0cmFjZV9hdHRhY2godGFzaykpIHsKKwkJaWYgKCFyZXR2YWwgfHwgIU1BWV9QVFJBQ0UodGFzaykgfHwgIXB0cmFjZV9tYXlfYXR0YWNoKHRhc2spKSB7CiAJCQlpZiAoIXJldCkKIAkJCQlyZXQgPSAtRUlPOwogCQkJYnJlYWs7CkBAIC02NjEsNyArNzIzLDcgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOwogCXVuc2lnbmVkIGxvbmcgZHN0ID0gKnBwb3M7CiAKLQlpZiAoIU1BWV9QVFJBQ0UodGFzaykgfHwgIW1heV9wdHJhY2VfYXR0YWNoKHRhc2spKQorCWlmICghTUFZX1BUUkFDRSh0YXNrKSB8fCAhcHRyYWNlX21heV9hdHRhY2godGFzaykpCiAJCXJldHVybiAtRVNSQ0g7CiAKIAlwYWdlID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX1VTRVIpOwpAQCAtOTc4LDYgKzEwNDAsNyBAQAogCWludCByZXR2YWw7CiAJY2hhciBidWZbTlVNQlVGXTsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXM7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAogCXJldHZhbCA9IC1FTk9FTlQ7CiAJaWYgKCFwaWRfYWxpdmUocCkpCkBAIC0xMDAwLDE1ICsxMDYzLDE2IEBACiAJCQlmaWxlcyA9IGdldF9maWxlc19zdHJ1Y3QocCk7CiAJCQlpZiAoIWZpbGVzKQogCQkJCWdvdG8gb3V0OwotCQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJCXJjdV9yZWFkX2xvY2soKTsKKwkJCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOwogCQkJZm9yIChmZCA9IGZpbHAtPmZfcG9zLTI7Ci0JCQkgICAgIGZkIDwgZmlsZXMtPm1heF9mZHM7CisJCQkgICAgIGZkIDwgZmR0LT5tYXhfZmRzOwogCQkJICAgICBmZCsrLCBmaWxwLT5mX3BvcysrKSB7CiAJCQkJdW5zaWduZWQgaW50IGksajsKIAogCQkJCWlmICghZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCkpCiAJCQkJCWNvbnRpbnVlOwotCQkJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJCQlyY3VfcmVhZF91bmxvY2soKTsKIAogCQkJCWogPSBOVU1CVUY7CiAJCQkJaSA9IGZkOwpAQCAtMTAyMCwxMiArMTA4NCwxMiBAQAogCiAJCQkJaW5vID0gZmFrZV9pbm8odGlkLCBQUk9DX1RJRF9GRF9ESVIgKyBmZCk7CiAJCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBidWYraiwgTlVNQlVGLWosIGZkKzIsIGlubywgRFRfTE5LKSA8IDApIHsKLQkJCQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJCQlyY3VfcmVhZF9sb2NrKCk7CiAJCQl9Ci0JCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOwogCX0KIG91dDoKQEAgLTEyMDAsOSArMTI2NCw5IEBACiAKIAlmaWxlcyA9IGdldF9maWxlc19zdHJ1Y3QodGFzayk7CiAJaWYgKGZpbGVzKSB7Ci0JCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCXJjdV9yZWFkX2xvY2soKTsKIAkJaWYgKGZjaGVja19maWxlcyhmaWxlcywgZmQpKSB7Ci0JCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOwogCQkJaWYgKHRhc2tfZHVtcGFibGUodGFzaykpIHsKIAkJCQlpbm9kZS0+aV91aWQgPSB0YXNrLT5ldWlkOwpAQCAtMTIxNCw3ICsxMjc4LDcgQEAKIAkJCXNlY3VyaXR5X3Rhc2tfdG9faW5vZGUodGFzaywgaW5vZGUpOwogCQkJcmV0dXJuIDE7CiAJCX0KLQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiAJfQogCWRfZHJvcChkZW50cnkpOwpAQCAtMTMwNiw3ICsxMzcwLDcgQEAKIAlpZiAoIWZpbGVzKQogCQlnb3RvIG91dF91bmxvY2s7CiAJaW5vZGUtPmlfbW9kZSA9IFNfSUZMTks7Ci0Jc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZmlsZSA9IGZjaGVja19maWxlcyhmaWxlcywgZmQpOwogCWlmICghZmlsZSkKIAkJZ290byBvdXRfdW5sb2NrMjsKQEAgLTEzMTQsNyArMTM3OCw3IEBACiAJCWlub2RlLT5pX21vZGUgfD0gU19JUlVTUiB8IFNfSVhVU1I7CiAJaWYgKGZpbGUtPmZfbW9kZSAmIDIpCiAJCWlub2RlLT5pX21vZGUgfD0gU19JV1VTUiB8IFNfSVhVU1I7Ci0Jc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOwogCWlub2RlLT5pX29wID0gJnByb2NfcGlkX2xpbmtfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9zaXplID0gNjQ7CkBAIC0xMzI0LDcgKzEzODgsNyBAQAogCXJldHVybiBOVUxMOwogCiBvdXRfdW5sb2NrMjoKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiBvdXRfdW5sb2NrOgogCWlwdXQoaW5vZGUpOwpAQCAtMTUyNCw2ICsxNTg4LDEyIEBACiAJCWNhc2UgUFJPQ19UR0lEX01BUFM6CiAJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19tYXBzX29wZXJhdGlvbnM7CiAJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfTlVNQQorCQljYXNlIFBST0NfVElEX05VTUFfTUFQUzoKKwkJY2FzZSBQUk9DX1RHSURfTlVNQV9NQVBTOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfbnVtYV9tYXBzX29wZXJhdGlvbnM7CisJCQlicmVhazsKKyNlbmRpZgogCQljYXNlIFBST0NfVElEX01FTToKIAkJY2FzZSBQUk9DX1RHSURfTUVNOgogCQkJaW5vZGUtPmlfb3AgPSAmcHJvY19tZW1faW5vZGVfb3BlcmF0aW9uczsKQEAgLTE1MzksNiArMTYwOSwxMCBAQAogCQljYXNlIFBST0NfVEdJRF9NT1VOVFM6CiAJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19tb3VudHNfb3BlcmF0aW9uczsKIAkJCWJyZWFrOworCQljYXNlIFBST0NfVElEX1NNQVBTOgorCQljYXNlIFBST0NfVEdJRF9TTUFQUzoKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3NtYXBzX29wZXJhdGlvbnM7CisJCQlicmVhazsKICNpZmRlZiBDT05GSUdfU0VDVVJJVFkKIAkJY2FzZSBQUk9DX1RJRF9BVFRSOgogCQkJaW5vZGUtPmlfbmxpbmsgPSAyOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9nZW5lcmljLmMgYi9mcy9wcm9jL2dlbmVyaWMuYwppbmRleCBhYmU4OTIwLi44YThjMzQ0IDEwMDY0NAotLS0gYS9mcy9wcm9jL2dlbmVyaWMuYworKysgYi9mcy9wcm9jL2dlbmVyaWMuYwpAQCAtMjQ5LDYgKzI0OSwxOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorc3RhdGljIGludCBwcm9jX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCXN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUgPSBQUk9DX0koaW5vZGUpLT5wZGU7CisJaWYgKGRlICYmIGRlLT5ubGluaykKKwkJaW5vZGUtPmlfbmxpbmsgPSBkZS0+bmxpbms7CisKKwlnZW5lcmljX2ZpbGxhdHRyKGlub2RlLCBzdGF0KTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0gewogCS5zZXRhdHRyCT0gcHJvY19ub3RpZnlfY2hhbmdlLAogfTsKQEAgLTQ3NSw2ICs0ODcsNyBAQAogICovCiBzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKIAkubG9va3VwCQk9IHByb2NfbG9va3VwLAorCS5nZXRhdHRyCT0gcHJvY19nZXRhdHRyLAogCS5zZXRhdHRyCT0gcHJvY19ub3RpZnlfY2hhbmdlLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbm9kZS5jIGIvZnMvcHJvYy9pbm9kZS5jCmluZGV4IDEzM2MyODYuLmVmZmE2YzAgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvaW5vZGUuYworKysgYi9mcy9wcm9jL2lub2RlLmMKQEAgLTYwLDYgKzYwLDggQEAKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOworCiAJLyogTGV0IGdvIG9mIGFueSBhc3NvY2lhdGVkIHByb2Nlc3MgKi8KIAl0c2sgPSBQUk9DX0koaW5vZGUpLT50YXNrOwogCWlmICh0c2spCmRpZmYgLS1naXQgYS9mcy9wcm9jL3Rhc2tfbW11LmMgYi9mcy9wcm9jL3Rhc2tfbW11LmMKaW5kZXggMjhiNGEwMi4uYzdlZjNlNCAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX21tdS5jCisrKyBiL2ZzL3Byb2MvdGFza19tbXUuYwpAQCAtMiw4ICsyLDEzIEBACiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvbGljeS5oPgorCiAjaW5jbHVkZSA8YXNtL2VsZi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogY2hhciAqdGFza19tZW0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIGNoYXIgKmJ1ZmZlcikKQEAgLTg3LDQ5ICs5Miw1OCBAQAogCXNlcV9wcmludGYobSwgIiUqYyIsIGxlbiwgJyAnKTsKIH0KIAotc3RhdGljIGludCBzaG93X21hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCitzdHJ1Y3QgbWVtX3NpemVfc3RhdHMKK3sKKwl1bnNpZ25lZCBsb25nIHJlc2lkZW50OworCXVuc2lnbmVkIGxvbmcgc2hhcmVkX2NsZWFuOworCXVuc2lnbmVkIGxvbmcgc2hhcmVkX2RpcnR5OworCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZV9jbGVhbjsKKwl1bnNpZ25lZCBsb25nIHByaXZhdGVfZGlydHk7Cit9OworCitzdGF0aWMgaW50IHNob3dfbWFwX2ludGVybmFsKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgc3RydWN0IG1lbV9zaXplX3N0YXRzICptc3MpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gbS0+cHJpdmF0ZTsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKm1hcCA9IHY7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBtYXAtPnZtX21tOwotCXN0cnVjdCBmaWxlICpmaWxlID0gbWFwLT52bV9maWxlOwotCWludCBmbGFncyA9IG1hcC0+dm1fZmxhZ3M7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB2OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHZtYS0+dm1fZmlsZTsKKwlpbnQgZmxhZ3MgPSB2bWEtPnZtX2ZsYWdzOwogCXVuc2lnbmVkIGxvbmcgaW5vID0gMDsKIAlkZXZfdCBkZXYgPSAwOwogCWludCBsZW47CiAKIAlpZiAoZmlsZSkgewotCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IHZtYS0+dm1fZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CiAJCWRldiA9IGlub2RlLT5pX3NiLT5zX2RldjsKIAkJaW5vID0gaW5vZGUtPmlfaW5vOwogCX0KIAogCXNlcV9wcmludGYobSwgIiUwOGx4LSUwOGx4ICVjJWMlYyVjICUwOGx4ICUwMng6JTAyeCAlbHUgJW4iLAotCQkJbWFwLT52bV9zdGFydCwKLQkJCW1hcC0+dm1fZW5kLAorCQkJdm1hLT52bV9zdGFydCwKKwkJCXZtYS0+dm1fZW5kLAogCQkJZmxhZ3MgJiBWTV9SRUFEID8gJ3InIDogJy0nLAogCQkJZmxhZ3MgJiBWTV9XUklURSA/ICd3JyA6ICctJywKIAkJCWZsYWdzICYgVk1fRVhFQyA/ICd4JyA6ICctJywKIAkJCWZsYWdzICYgVk1fTUFZU0hBUkUgPyAncycgOiAncCcsCi0JCQltYXAtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQsCisJCQl2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQsCiAJCQlNQUpPUihkZXYpLCBNSU5PUihkZXYpLCBpbm8sICZsZW4pOwogCiAJLyoKIAkgKiBQcmludCB0aGUgZGVudHJ5IG5hbWUgZm9yIG5hbWVkIG1hcHBpbmdzLCBhbmQgYQogCSAqIHNwZWNpYWwgW2hlYXBdIG1hcmtlciBmb3IgdGhlIGhlYXA6CiAJICovCi0JaWYgKG1hcC0+dm1fZmlsZSkgeworCWlmIChmaWxlKSB7CiAJCXBhZF9sZW5fc3BhY2VzKG0sIGxlbik7Ci0JCXNlcV9wYXRoKG0sIGZpbGUtPmZfdmZzbW50LCBmaWxlLT5mX2RlbnRyeSwgIiIpOworCQlzZXFfcGF0aChtLCBmaWxlLT5mX3Zmc21udCwgZmlsZS0+Zl9kZW50cnksICJcbiIpOwogCX0gZWxzZSB7CiAJCWlmIChtbSkgewotCQkJaWYgKG1hcC0+dm1fc3RhcnQgPD0gbW0tPnN0YXJ0X2JyayAmJgotCQkJCQkJbWFwLT52bV9lbmQgPj0gbW0tPmJyaykgeworCQkJaWYgKHZtYS0+dm1fc3RhcnQgPD0gbW0tPnN0YXJ0X2JyayAmJgorCQkJCQkJdm1hLT52bV9lbmQgPj0gbW0tPmJyaykgewogCQkJCXBhZF9sZW5fc3BhY2VzKG0sIGxlbik7CiAJCQkJc2VxX3B1dHMobSwgIltoZWFwXSIpOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAobWFwLT52bV9zdGFydCA8PSBtbS0+c3RhcnRfc3RhY2sgJiYKLQkJCQkJbWFwLT52bV9lbmQgPj0gbW0tPnN0YXJ0X3N0YWNrKSB7CisJCQkJaWYgKHZtYS0+dm1fc3RhcnQgPD0gbW0tPnN0YXJ0X3N0YWNrICYmCisJCQkJCXZtYS0+dm1fZW5kID49IG1tLT5zdGFydF9zdGFjaykgewogCiAJCQkJCXBhZF9sZW5fc3BhY2VzKG0sIGxlbik7CiAJCQkJCXNlcV9wdXRzKG0sICJbc3RhY2tdIik7CkBAIC0xNDEsMjQgKzE1NSwxNDYgQEAKIAkJfQogCX0KIAlzZXFfcHV0YyhtLCAnXG4nKTsKLQlpZiAobS0+Y291bnQgPCBtLT5zaXplKSAgLyogbWFwIGlzIGNvcGllZCBzdWNjZXNzZnVsbHkgKi8KLQkJbS0+dmVyc2lvbiA9IChtYXAgIT0gZ2V0X2dhdGVfdm1hKHRhc2spKT8gbWFwLT52bV9zdGFydDogMDsKKworCWlmIChtc3MpCisJCXNlcV9wcmludGYobSwKKwkJCSAgICJTaXplOiAgICAgICAgICAlOGx1IGtCXG4iCisJCQkgICAiUnNzOiAgICAgICAgICAgJThsdSBrQlxuIgorCQkJICAgIlNoYXJlZF9DbGVhbjogICU4bHUga0JcbiIKKwkJCSAgICJTaGFyZWRfRGlydHk6ICAlOGx1IGtCXG4iCisJCQkgICAiUHJpdmF0ZV9DbGVhbjogJThsdSBrQlxuIgorCQkJICAgIlByaXZhdGVfRGlydHk6ICU4bHUga0JcbiIsCisJCQkgICAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiAxMCwKKwkJCSAgIG1zcy0+cmVzaWRlbnQgPj4gMTAsCisJCQkgICBtc3MtPnNoYXJlZF9jbGVhbiAgPj4gMTAsCisJCQkgICBtc3MtPnNoYXJlZF9kaXJ0eSAgPj4gMTAsCisJCQkgICBtc3MtPnByaXZhdGVfY2xlYW4gPj4gMTAsCisJCQkgICBtc3MtPnByaXZhdGVfZGlydHkgPj4gMTApOworCisJaWYgKG0tPmNvdW50IDwgbS0+c2l6ZSkgIC8qIHZtYSBpcyBjb3BpZWQgc3VjY2Vzc2Z1bGx5ICovCisJCW0tPnZlcnNpb24gPSAodm1hICE9IGdldF9nYXRlX3ZtYSh0YXNrKSk/IHZtYS0+dm1fc3RhcnQ6IDA7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2hvd19tYXAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXJldHVybiBzaG93X21hcF9pbnRlcm5hbChtLCB2LCAwKTsKK30KKworc3RhdGljIHZvaWQgc21hcHNfcHRlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLAorCQkJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCisJCQkJc3RydWN0IG1lbV9zaXplX3N0YXRzICptc3MpCit7CisJcHRlX3QgKnB0ZSwgcHRlbnQ7CisJdW5zaWduZWQgbG9uZyBwZm47CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlwdGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHIpOworCWRvIHsKKwkJcHRlbnQgPSAqcHRlOworCQlpZiAocHRlX25vbmUocHRlbnQpIHx8ICFwdGVfcHJlc2VudChwdGVudCkpCisJCQljb250aW51ZTsKKworCQltc3MtPnJlc2lkZW50ICs9IFBBR0VfU0laRTsKKwkJcGZuID0gcHRlX3BmbihwdGVudCk7CisJCWlmICghcGZuX3ZhbGlkKHBmbikpCisJCQljb250aW51ZTsKKworCQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwkJaWYgKHBhZ2VfY291bnQocGFnZSkgPj0gMikgeworCQkJaWYgKHB0ZV9kaXJ0eShwdGVudCkpCisJCQkJbXNzLT5zaGFyZWRfZGlydHkgKz0gUEFHRV9TSVpFOworCQkJZWxzZQorCQkJCW1zcy0+c2hhcmVkX2NsZWFuICs9IFBBR0VfU0laRTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwdGVfZGlydHkocHRlbnQpKQorCQkJCW1zcy0+cHJpdmF0ZV9kaXJ0eSArPSBQQUdFX1NJWkU7CisJCQllbHNlCisJCQkJbXNzLT5wcml2YXRlX2NsZWFuICs9IFBBR0VfU0laRTsKKwkJfQorCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOworCXB0ZV91bm1hcChwdGUgLSAxKTsKKwljb25kX3Jlc2NoZWRfbG9jaygmdm1hLT52bV9tbS0+cGFnZV90YWJsZV9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNtYXBzX3BtZF9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcHVkX3QgKnB1ZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAorCQkJCXN0cnVjdCBtZW1fc2l6ZV9zdGF0cyAqbXNzKQoreworCXBtZF90ICpwbWQ7CisJdW5zaWduZWQgbG9uZyBuZXh0OworCisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOworCWRvIHsKKwkJbmV4dCA9IHBtZF9hZGRyX2VuZChhZGRyLCBlbmQpOworCQlpZiAocG1kX25vbmVfb3JfY2xlYXJfYmFkKHBtZCkpCisJCQljb250aW51ZTsKKwkJc21hcHNfcHRlX3JhbmdlKHZtYSwgcG1kLCBhZGRyLCBuZXh0LCBtc3MpOworCX0gd2hpbGUgKHBtZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc21hcHNfcHVkX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwZ2RfdCAqcGdkLAorCQkJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCisJCQkJc3RydWN0IG1lbV9zaXplX3N0YXRzICptc3MpCit7CisJcHVkX3QgKnB1ZDsKKwl1bnNpZ25lZCBsb25nIG5leHQ7CisKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7CisJZG8geworCQluZXh0ID0gcHVkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChwdWRfbm9uZV9vcl9jbGVhcl9iYWQocHVkKSkKKwkJCWNvbnRpbnVlOworCQlzbWFwc19wbWRfcmFuZ2Uodm1hLCBwdWQsIGFkZHIsIG5leHQsIG1zcyk7CisJfSB3aGlsZSAocHVkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbWFwc19wZ2RfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKKwkJCQlzdHJ1Y3QgbWVtX3NpemVfc3RhdHMgKm1zcykKK3sKKwlwZ2RfdCAqcGdkOworCXVuc2lnbmVkIGxvbmcgbmV4dDsKKworCXBnZCA9IHBnZF9vZmZzZXQodm1hLT52bV9tbSwgYWRkcik7CisJZG8geworCQluZXh0ID0gcGdkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChwZ2Rfbm9uZV9vcl9jbGVhcl9iYWQocGdkKSkKKwkJCWNvbnRpbnVlOworCQlzbWFwc19wdWRfcmFuZ2Uodm1hLCBwZ2QsIGFkZHIsIG5leHQsIG1zcyk7CisJfSB3aGlsZSAocGdkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19zbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IHY7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCXN0cnVjdCBtZW1fc2l6ZV9zdGF0cyBtc3M7CisKKwltZW1zZXQoJm1zcywgMCwgc2l6ZW9mIG1zcyk7CisKKwlpZiAobW0pIHsKKwkJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwkJc21hcHNfcGdkX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsICZtc3MpOworCQlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJfQorCisJcmV0dXJuIHNob3dfbWFwX2ludGVybmFsKG0sIHYsICZtc3MpOworfQorCiBzdGF0aWMgdm9pZCAqbV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IG0tPnByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBsYXN0X2FkZHIgPSBtLT52ZXJzaW9uOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbWFwLCAqdGFpbF9tYXA7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsICp0YWlsX3ZtYTsKIAlsb2ZmX3QgbCA9ICpwb3M7CiAKIAkvKgogCSAqIFdlIHJlbWVtYmVyIGxhc3RfYWRkciByYXRoZXIgdGhhbiBuZXh0X2FkZHIgdG8gaGl0IHdpdGgKIAkgKiBtbWFwX2NhY2hlIG1vc3Qgb2YgdGhlIHRpbWUuIFdlIGhhdmUgemVybyBsYXN0X2FkZHIgYXQKLQkgKiB0aGUgYmVnaW5pbmcgYW5kIGFsc28gYWZ0ZXIgbHNlZWsuIFdlIHdpbGwgaGF2ZSAtMSBsYXN0X2FkZHIKLQkgKiBhZnRlciB0aGUgZW5kIG9mIHRoZSBtYXBzLgorCSAqIHRoZSBiZWdpbm5pbmcgYW5kIGFsc28gYWZ0ZXIgbHNlZWsuIFdlIHdpbGwgaGF2ZSAtMSBsYXN0X2FkZHIKKwkgKiBhZnRlciB0aGUgZW5kIG9mIHRoZSB2bWFzLgogCSAqLwogCiAJaWYgKGxhc3RfYWRkciA9PSAtMVVMKQpAQCAtMTY4LDQ3ICszMDQsNDcgQEAKIAlpZiAoIW1tKQogCQlyZXR1cm4gTlVMTDsKIAotCXRhaWxfbWFwID0gZ2V0X2dhdGVfdm1hKHRhc2spOworCXRhaWxfdm1hID0gZ2V0X2dhdGVfdm1hKHRhc2spOwogCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAogCS8qIFN0YXJ0IHdpdGggbGFzdCBhZGRyIGhpbnQgKi8KLQlpZiAobGFzdF9hZGRyICYmIChtYXAgPSBmaW5kX3ZtYShtbSwgbGFzdF9hZGRyKSkpIHsKLQkJbWFwID0gbWFwLT52bV9uZXh0OworCWlmIChsYXN0X2FkZHIgJiYgKHZtYSA9IGZpbmRfdm1hKG1tLCBsYXN0X2FkZHIpKSkgeworCQl2bWEgPSB2bWEtPnZtX25leHQ7CiAJCWdvdG8gb3V0OwogCX0KIAogCS8qCi0JICogQ2hlY2sgdGhlIG1hcCBpbmRleCBpcyB3aXRoaW4gdGhlIHJhbmdlIGFuZCBkbworCSAqIENoZWNrIHRoZSB2bWEgaW5kZXggaXMgd2l0aGluIHRoZSByYW5nZSBhbmQgZG8KIAkgKiBzZXF1ZW50aWFsIHNjYW4gdW50aWwgbV9pbmRleC4KIAkgKi8KLQltYXAgPSBOVUxMOworCXZtYSA9IE5VTEw7CiAJaWYgKCh1bnNpZ25lZCBsb25nKWwgPCBtbS0+bWFwX2NvdW50KSB7Ci0JCW1hcCA9IG1tLT5tbWFwOwotCQl3aGlsZSAobC0tICYmIG1hcCkKLQkJCW1hcCA9IG1hcC0+dm1fbmV4dDsKKwkJdm1hID0gbW0tPm1tYXA7CisJCXdoaWxlIChsLS0gJiYgdm1hKQorCQkJdm1hID0gdm1hLT52bV9uZXh0OwogCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAobCAhPSBtbS0+bWFwX2NvdW50KQotCQl0YWlsX21hcCA9IE5VTEw7IC8qIEFmdGVyIGdhdGUgbWFwICovCisJCXRhaWxfdm1hID0gTlVMTDsgLyogQWZ0ZXIgZ2F0ZSB2bWEgKi8KIAogb3V0OgotCWlmIChtYXApCi0JCXJldHVybiBtYXA7CisJaWYgKHZtYSkKKwkJcmV0dXJuIHZtYTsKIAotCS8qIEVuZCBvZiBtYXBzIGhhcyByZWFjaGVkICovCi0JbS0+dmVyc2lvbiA9ICh0YWlsX21hcCAhPSBOVUxMKT8gMDogLTFVTDsKKwkvKiBFbmQgb2Ygdm1hcyBoYXMgYmVlbiByZWFjaGVkICovCisJbS0+dmVyc2lvbiA9ICh0YWlsX3ZtYSAhPSBOVUxMKT8gMDogLTFVTDsKIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCW1tcHV0KG1tKTsKLQlyZXR1cm4gdGFpbF9tYXA7CisJcmV0dXJuIHRhaWxfdm1hOwogfQogCiBzdGF0aWMgdm9pZCBtX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IG0tPnByaXZhdGU7Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICptYXAgPSB2OwotCWlmIChtYXAgJiYgbWFwICE9IGdldF9nYXRlX3ZtYSh0YXNrKSkgewotCQlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IG1hcC0+dm1fbW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB2OworCWlmICh2bWEgJiYgdm1hICE9IGdldF9nYXRlX3ZtYSh0YXNrKSkgeworCQlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CiAJCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAJCW1tcHV0KG1tKTsKIAl9CkBAIC0yMTcsMTQgKzM1MywxNCBAQAogc3RhdGljIHZvaWQgKm1fbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IG0tPnByaXZhdGU7Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICptYXAgPSB2OwotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdGFpbF9tYXAgPSBnZXRfZ2F0ZV92bWEodGFzayk7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB2OworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdGFpbF92bWEgPSBnZXRfZ2F0ZV92bWEodGFzayk7CiAKIAkoKnBvcykrKzsKLQlpZiAobWFwICYmIChtYXAgIT0gdGFpbF9tYXApICYmIG1hcC0+dm1fbmV4dCkKLQkJcmV0dXJuIG1hcC0+dm1fbmV4dDsKKwlpZiAodm1hICYmICh2bWEgIT0gdGFpbF92bWEpICYmIHZtYS0+dm1fbmV4dCkKKwkJcmV0dXJuIHZtYS0+dm1fbmV4dDsKIAltX3N0b3AobSwgdik7Ci0JcmV0dXJuIChtYXAgIT0gdGFpbF9tYXApPyB0YWlsX21hcDogTlVMTDsKKwlyZXR1cm4gKHZtYSAhPSB0YWlsX3ZtYSk/IHRhaWxfdm1hOiBOVUxMOwogfQogCiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfbWFwc19vcCA9IHsKQEAgLTIzMywzICszNjksMTQwIEBACiAJLnN0b3AJPSBtX3N0b3AsCiAJLnNob3cJPSBzaG93X21hcAogfTsKKworc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2NfcGlkX3NtYXBzX29wID0geworCS5zdGFydAk9IG1fc3RhcnQsCisJLm5leHQJPSBtX25leHQsCisJLnN0b3AJPSBtX3N0b3AsCisJLnNob3cJPSBzaG93X3NtYXAKK307CisKKyNpZmRlZiBDT05GSUdfTlVNQQorCitzdHJ1Y3QgbnVtYV9tYXBzIHsKKwl1bnNpZ25lZCBsb25nIHBhZ2VzOworCXVuc2lnbmVkIGxvbmcgYW5vbjsKKwl1bnNpZ25lZCBsb25nIG1hcHBlZDsKKwl1bnNpZ25lZCBsb25nIG1hcGNvdW50X21heDsKKwl1bnNpZ25lZCBsb25nIG5vZGVbTUFYX05VTU5PREVTXTsKK307CisKKy8qCisgKiBDYWxjdWxhdGUgbnVtYSBub2RlIG1hcHMgZm9yIGEgdm1hCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbnVtYV9tYXBzICpnZXRfbnVtYV9tYXBzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgdmFkZHI7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCWludCBpOworCXN0cnVjdCBudW1hX21hcHMgKm1kID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG51bWFfbWFwcyksIEdGUF9LRVJORUwpOworCisJaWYgKCFtZCkKKwkJcmV0dXJuIE5VTEw7CisJbWQtPnBhZ2VzID0gMDsKKwltZC0+YW5vbiA9IDA7CisJbWQtPm1hcHBlZCA9IDA7CisJbWQtPm1hcGNvdW50X21heCA9IDA7CisJZm9yX2VhY2hfbm9kZShpKQorCQltZC0+bm9kZVtpXSA9MDsKKworCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisgCWZvciAodmFkZHIgPSB2bWEtPnZtX3N0YXJ0OyB2YWRkciA8IHZtYS0+dm1fZW5kOyB2YWRkciArPSBQQUdFX1NJWkUpIHsKKwkJcGFnZSA9IGZvbGxvd19wYWdlKG1tLCB2YWRkciwgMCk7CisJCWlmIChwYWdlKSB7CisJCQlpbnQgY291bnQgPSBwYWdlX21hcGNvdW50KHBhZ2UpOworCisJCQlpZiAoY291bnQpCisJCQkJbWQtPm1hcHBlZCsrOworCQkJaWYgKGNvdW50ID4gbWQtPm1hcGNvdW50X21heCkKKwkJCQltZC0+bWFwY291bnRfbWF4ID0gY291bnQ7CisJCQltZC0+cGFnZXMrKzsKKwkJCWlmIChQYWdlQW5vbihwYWdlKSkKKwkJCQltZC0+YW5vbisrOworCQkJbWQtPm5vZGVbcGFnZV90b19uaWQocGFnZSldKys7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXJldHVybiBtZDsKK30KKworc3RhdGljIGludCBzaG93X251bWFfbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBtLT5wcml2YXRlOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gdjsKKwlzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7CisJc3RydWN0IG51bWFfbWFwcyAqbWQ7CisJc3RydWN0IHpvbmUgKip6OworCWludCBuOworCWludCBmaXJzdDsKKworCWlmICghdm1hLT52bV9tbSkKKwkJcmV0dXJuIDA7CisKKwltZCA9IGdldF9udW1hX21hcHModm1hKTsKKwlpZiAoIW1kKQorCQlyZXR1cm4gMDsKKworCXNlcV9wcmludGYobSwgIiUwOGx4Iiwgdm1hLT52bV9zdGFydCk7CisJcG9sID0gZ2V0X3ZtYV9wb2xpY3kodGFzaywgdm1hLCB2bWEtPnZtX3N0YXJ0KTsKKwkvKiBQcmludCBwb2xpY3kgKi8KKwlzd2l0Y2ggKHBvbC0+cG9saWN5KSB7CisJY2FzZSBNUE9MX1BSRUZFUlJFRDoKKwkJc2VxX3ByaW50ZihtLCAiIHByZWZlcj0lZCIsIHBvbC0+di5wcmVmZXJyZWRfbm9kZSk7CisJCWJyZWFrOworCWNhc2UgTVBPTF9CSU5EOgorCQlzZXFfcHJpbnRmKG0sICIgYmluZD17Iik7CisJCWZpcnN0ID0gMTsKKwkJZm9yICh6ID0gcG9sLT52LnpvbmVsaXN0LT56b25lczsgKno7IHorKykgeworCisJCQlpZiAoIWZpcnN0KQorCQkJCXNlcV9wdXRjKG0sICcsJyk7CisJCQllbHNlCisJCQkJZmlyc3QgPSAwOworCQkJc2VxX3ByaW50ZihtLCAiJWQvJXMiLCAoKnopLT56b25lX3BnZGF0LT5ub2RlX2lkLAorCQkJCQkoKnopLT5uYW1lKTsKKwkJfQorCQlzZXFfcHV0YyhtLCAnfScpOworCQlicmVhazsKKwljYXNlIE1QT0xfSU5URVJMRUFWRToKKwkJc2VxX3ByaW50ZihtLCAiIGludGVybGVhdmU9eyIpOworCQlmaXJzdCA9IDE7CisJCWZvcl9lYWNoX25vZGUobikgeworCQkJaWYgKHRlc3RfYml0KG4sIHBvbC0+di5ub2RlcykpIHsKKwkJCQlpZiAoIWZpcnN0KQorCQkJCQlzZXFfcHV0YyhtLCcsJyk7CisJCQkJZWxzZQorCQkJCQlmaXJzdCA9IDA7CisJCQkJc2VxX3ByaW50ZihtLCAiJWQiLG4pOworCQkJfQorCQl9CisJCXNlcV9wdXRjKG0sICd9Jyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNlcV9wcmludGYobSwiIGRlZmF1bHQiKTsKKwkJYnJlYWs7CisJfQorCXNlcV9wcmludGYobSwgIiBNYXhSZWY9JWx1IFBhZ2VzPSVsdSBNYXBwZWQ9JWx1IiwKKwkJCW1kLT5tYXBjb3VudF9tYXgsIG1kLT5wYWdlcywgbWQtPm1hcHBlZCk7CisJaWYgKG1kLT5hbm9uKQorCQlzZXFfcHJpbnRmKG0sIiBBbm9uPSVsdSIsbWQtPmFub24pOworCisJZm9yX2VhY2hfb25saW5lX25vZGUobikgeworCQlpZiAobWQtPm5vZGVbbl0pCisJCQlzZXFfcHJpbnRmKG0sICIgTiVkPSVsdSIsIG4sIG1kLT5ub2RlW25dKTsKKwl9CisJc2VxX3B1dGMobSwgJ1xuJyk7CisJa2ZyZWUobWQpOworCWlmIChtLT5jb3VudCA8IG0tPnNpemUpICAvKiB2bWEgaXMgY29waWVkIHN1Y2Nlc3NmdWxseSAqLworCQltLT52ZXJzaW9uID0gKHZtYSAhPSBnZXRfZ2F0ZV92bWEodGFzaykpID8gdm1hLT52bV9zdGFydCA6IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcm9jX3BpZF9udW1hX21hcHNfb3AgPSB7CisJLnN0YXJ0CT0gbV9zdGFydCwKKwkubmV4dAk9IG1fbmV4dCwKKwkuc3RvcAk9IG1fc3RvcCwKKwkuc2hvdwk9IHNob3dfbnVtYV9tYXAKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3FueDQvaW5vZGUuYyBiL2ZzL3FueDQvaW5vZGUuYwppbmRleCBiNzkxNjJhLi44MGYzMjkxIDEwMDY0NAotLS0gYS9mcy9xbng0L2lub2RlLmMKKysrIGIvZnMvcW54NC9pbm9kZS5jCkBAIC02Myw2ICs2Myw3IEBACiBzdGF0aWMgdm9pZCBxbng0X2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCVFOWDRERUJVRygoInFueDQ6IGRlbGV0aW5nIGlub2RlIFslbHVdXG4iLCAodW5zaWduZWQgbG9uZykgaW5vZGUtPmlfaW5vKSk7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCWlub2RlLT5pX3NpemUgPSAwOwogCXFueDRfdHJ1bmNhdGUoaW5vZGUpOwogCWxvY2tfa2VybmVsKCk7CmRpZmYgLS1naXQgYS9mcy9yZWFkX3dyaXRlLmMgYi9mcy9yZWFkX3dyaXRlLmMKaW5kZXggNTYzYWJkMC4uYjYwMzI0YSAxMDA2NDQKLS0tIGEvZnMvcmVhZF93cml0ZS5jCisrKyBiL2ZzL3JlYWRfd3JpdGUuYwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlsb2ZmX3QgcG9zOwogCi0JaWYgKHVubGlrZWx5KGNvdW50ID4gZmlsZS0+Zl9tYXhjb3VudCkpCisJaWYgKHVubGlrZWx5KGNvdW50ID4gSU5UX01BWCkpCiAJCWdvdG8gRWludmFsOwogCXBvcyA9ICpwcG9zOwogCWlmICh1bmxpa2VseSgocG9zIDwgMCkgfHwgKGxvZmZfdCkgKHBvcyArIGNvdW50KSA8IDApKQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaW5vZGUuYyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKaW5kZXggZmYyOTFjOS4uMWE4YTFiZiAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvaW5vZGUuYworKysgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCkBAIC0zMyw2ICszMyw4IEBACiAJICAgIDIgKiBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhpbm9kZS0+aV9zYik7CiAJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKIAorCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKwogCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwogCiAJLyogVGhlID0gMCBoYXBwZW5zIHdoZW4gd2UgYWJvcnQgY3JlYXRpbmcgYSBuZXcgaW5vZGUgZm9yIHNvbWUgcmVhc29uIGxpa2UgbGFjayBvZiBzcGFjZS4uICovCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9qb3VybmFsLmMgYi9mcy9yZWlzZXJmcy9qb3VybmFsLmMKaW5kZXggY2E3OTg5Yi4uNGIxNTc2MSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvam91cm5hbC5jCisrKyBiL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYwpAQCAtMTAzNCw3ICsxMDM0LDcgQEAKIAkJICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocyk7CiAJCXRiaCA9IGpvdXJuYWxfZmluZF9nZXRfYmxvY2socywgYm4pOwogCQlpZiAoYnVmZmVyX2RpcnR5KHRiaCkpCS8qIHJlZHVuZGFudCwgbGxfcndfYmxvY2soKSBjaGVja3MgKi8KLQkJCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmdGJoKTsKKwkJCWxsX3J3X2Jsb2NrKFNXUklURSwgMSwgJnRiaCk7CiAJCXB1dF9iaCh0YmgpOwogCX0KIAlhdG9taWNfZGVjKCZqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKTsKQEAgLTIxNzIsNyArMjE3Miw3IEBACiAJLyogZmx1c2ggb3V0IHRoZSByZWFsIGJsb2NrcyAqLwogCWZvciAoaSA9IDA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYyk7IGkrKykgewogCQlzZXRfYnVmZmVyX2RpcnR5KHJlYWxfYmxvY2tzW2ldKTsKLQkJbGxfcndfYmxvY2soV1JJVEUsIDEsIHJlYWxfYmxvY2tzICsgaSk7CisJCWxsX3J3X2Jsb2NrKFNXUklURSwgMSwgcmVhbF9ibG9ja3MgKyBpKTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKTsgaSsrKSB7CiAJCXdhaXRfb25fYnVmZmVyKHJlYWxfYmxvY2tzW2ldKTsKQEAgLTI4NjgsOCArMjg2OCw3IEBACiAJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHNiKTsKIAl1bnNpZ25lZCBsb25nIGJjb3VudCA9IGpvdXJuYWwtPmpfYmNvdW50OwogCXdoaWxlICgxKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJCWpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9zdGF0ZSB8PSBMSVNUX0NPTU1JVF9QRU5ESU5HOwogCQl3aGlsZSAoKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkgPiAwIHx8CiAJCQlhdG9taWNfcmVhZCgmam91cm5hbC0+al9qbG9jaykpICYmCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdXBlci5jIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwppbmRleCA2OTUxYzM1Li40NGIwMmZjIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9zdXBlci5jCisrKyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKQEAgLTE5MzQsOCArMTkzNCw3IEBACiAJCQlpZiAoU0JfQVBfQklUTUFQKHMpKQogCQkJCWJyZWxzZShTQl9BUF9CSVRNQVAocylbal0uYmgpOwogCQl9Ci0JCWlmIChTQl9BUF9CSVRNQVAocykpCi0JCQl2ZnJlZShTQl9BUF9CSVRNQVAocykpOworCQl2ZnJlZShTQl9BUF9CSVRNQVAocykpOwogCX0KIAlpZiAoU0JfQlVGRkVSX1dJVEhfU0IocykpCiAJCWJyZWxzZShTQl9CVUZGRVJfV0lUSF9TQihzKSk7CmRpZmYgLS1naXQgYS9mcy9yZWxheWZzL01ha2VmaWxlIGIvZnMvcmVsYXlmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzZlMTgyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVsYXlmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK29iai0kKENPTkZJR19SRUxBWUZTX0ZTKSArPSByZWxheWZzLm8KKworcmVsYXlmcy15IDo9IHJlbGF5Lm8gaW5vZGUubyBidWZmZXJzLm8KKwpkaWZmIC0tZ2l0IGEvZnMvcmVsYXlmcy9idWZmZXJzLmMgYi9mcy9yZWxheWZzL2J1ZmZlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWE4ZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVsYXlmcy9idWZmZXJzLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBSZWxheUZTIGJ1ZmZlciBtYW5hZ2VtZW50IGNvZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgLSBUb20gWmFudXNzaSAoemFudXNzaUB1cy5pYm0uY29tKSwgSUJNIENvcnAKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IC0gS2FyaW0gWWFnaG1vdXIgKGthcmltQG9wZXJzeXMuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWxheWZzX2ZzLmg+CisjaW5jbHVkZSAicmVsYXkuaCIKKyNpbmNsdWRlICJidWZmZXJzLmgiCisKKy8qCisgKiBjbG9zZSgpIHZtX29wIGltcGxlbWVudGF0aW9uIGZvciByZWxheWZzIGZpbGUgbWFwcGluZy4KKyAqLworc3RhdGljIHZvaWQgcmVsYXlfZmlsZV9tbWFwX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCWJ1Zi0+Y2hhbi0+Y2ItPmJ1Zl91bm1hcHBlZChidWYsIHZtYS0+dm1fZmlsZSk7Cit9CisKKy8qCisgKiBub3BhZ2UoKSB2bV9vcCBpbXBsZW1lbnRhdGlvbiBmb3IgcmVsYXlmcyBmaWxlIG1hcHBpbmcuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqcmVsYXlfYnVmX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICAgIGludCAqdHlwZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0OworCisJaWYgKGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkKKwkJcmV0dXJuIE5PUEFHRV9TSUdCVVM7IC8qIERpc2FsbG93IG1yZW1hcCAqLworCWlmICghYnVmKQorCQlyZXR1cm4gTk9QQUdFX09PTTsKKworCXBhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoYnVmLT5zdGFydCArIG9mZnNldCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gTk9QQUdFX09PTTsKKwlnZXRfcGFnZShwYWdlKTsKKworCWlmICh0eXBlKQorCQkqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCisJcmV0dXJuIHBhZ2U7Cit9CisKKy8qCisgKiB2bV9vcHMgZm9yIHJlbGF5IGZpbGUgbWFwcGluZ3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgcmVsYXlfZmlsZV9tbWFwX29wcyA9IHsKKwkubm9wYWdlID0gcmVsYXlfYnVmX25vcGFnZSwKKwkuY2xvc2UgPSByZWxheV9maWxlX21tYXBfY2xvc2UsCit9OworCisvKioKKyAqCXJlbGF5X21tYXBfYnVmOiAtIG1tYXAgY2hhbm5lbCBidWZmZXIgdG8gcHJvY2VzcyBhZGRyZXNzIHNwYWNlCisgKglAYnVmOiByZWxheSBjaGFubmVsIGJ1ZmZlcgorICoJQHZtYTogdm1fYXJlYV9zdHJ1Y3QgZGVzY3JpYmluZyBtZW1vcnkgdG8gYmUgbWFwcGVkCisgKgorICoJUmV0dXJucyAwIGlmIG9rLCBuZWdhdGl2ZSBvbiBlcnJvcgorICoKKyAqCUNhbGxlciBzaG91bGQgYWxyZWFkeSBoYXZlIGdyYWJiZWQgbW1hcF9zZW0uCisgKi8KK2ludCByZWxheV9tbWFwX2J1ZihzdHJ1Y3QgcmNoYW5fYnVmICpidWYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCXN0cnVjdCBmaWxlICpmaWxwID0gdm1hLT52bV9maWxlOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRUJBREY7CisKKwlpZiAobGVuZ3RoICE9ICh1bnNpZ25lZCBsb25nKWJ1Zi0+Y2hhbi0+YWxsb2Nfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2bWEtPnZtX29wcyA9ICZyZWxheV9maWxlX21tYXBfb3BzOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gYnVmOworCWJ1Zi0+Y2hhbi0+Y2ItPmJ1Zl9tYXBwZWQoYnVmLCBmaWxwKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXJlbGF5X2FsbG9jX2J1ZiAtIGFsbG9jYXRlIGEgY2hhbm5lbCBidWZmZXIKKyAqCUBidWY6IHRoZSBidWZmZXIgc3RydWN0CisgKglAc2l6ZTogdG90YWwgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKgorICoJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBidWZmZXIsIE5VTEwgaWYgdW5zdWNjZXNzZnVsCisgKi8KK3N0YXRpYyB2b2lkICpyZWxheV9hbGxvY19idWYoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqbWVtOworCXVuc2lnbmVkIGludCBpLCBqLCBuX3BhZ2VzOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJbl9wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKKworCWJ1Zi0+cGFnZV9hcnJheSA9IGtjYWxsb2Mobl9wYWdlcywgc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Zi0+cGFnZV9hcnJheSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9wYWdlczsgaSsrKSB7CisJCWJ1Zi0+cGFnZV9hcnJheVtpXSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICh1bmxpa2VseSghYnVmLT5wYWdlX2FycmF5W2ldKSkKKwkJCWdvdG8gZGVwb3B1bGF0ZTsKKwl9CisJbWVtID0gdm1hcChidWYtPnBhZ2VfYXJyYXksIG5fcGFnZXMsIEdGUF9LRVJORUwsIFBBR0VfS0VSTkVMKTsKKwlpZiAoIW1lbSkKKwkJZ290byBkZXBvcHVsYXRlOworCisJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7CisJYnVmLT5wYWdlX2NvdW50ID0gbl9wYWdlczsKKwlyZXR1cm4gbWVtOworCitkZXBvcHVsYXRlOgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCV9fZnJlZV9wYWdlKGJ1Zi0+cGFnZV9hcnJheVtqXSk7CisJa2ZyZWUoYnVmLT5wYWdlX2FycmF5KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKglyZWxheV9jcmVhdGVfYnVmIC0gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjaGFubmVsIGJ1ZmZlcgorICoJQGFsbG9jX3NpemU6IHNpemUgb2YgdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZQorICoJQG5fc3ViYnVmczogbnVtYmVyIG9mIHN1Yi1idWZmZXJzIGluIHRoZSBjaGFubmVsCisgKgorICoJUmV0dXJucyBjaGFubmVsIGJ1ZmZlciBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZQorICovCitzdHJ1Y3QgcmNoYW5fYnVmICpyZWxheV9jcmVhdGVfYnVmKHN0cnVjdCByY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWYgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcmNoYW5fYnVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiBOVUxMOworCisJYnVmLT5wYWRkaW5nID0ga21hbGxvYyhjaGFuLT5uX3N1YmJ1ZnMgKiBzaXplb2Yoc2l6ZV90ICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Zi0+cGFkZGluZykKKwkJZ290byBmcmVlX2J1ZjsKKworCWJ1Zi0+c3RhcnQgPSByZWxheV9hbGxvY19idWYoYnVmLCBjaGFuLT5hbGxvY19zaXplKTsKKwlpZiAoIWJ1Zi0+c3RhcnQpCisJCWdvdG8gZnJlZV9idWY7CisKKwlidWYtPmNoYW4gPSBjaGFuOworCWtyZWZfZ2V0KCZidWYtPmNoYW4tPmtyZWYpOworCXJldHVybiBidWY7CisKK2ZyZWVfYnVmOgorCWtmcmVlKGJ1Zi0+cGFkZGluZyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKglyZWxheV9kZXN0cm95X2J1ZiAtIGRlc3Ryb3kgYW4gcmNoYW5fYnVmIHN0cnVjdCBhbmQgYXNzb2NpYXRlZCBidWZmZXIKKyAqCUBidWY6IHRoZSBidWZmZXIgc3RydWN0CisgKi8KK3ZvaWQgcmVsYXlfZGVzdHJveV9idWYoc3RydWN0IHJjaGFuX2J1ZiAqYnVmKQoreworCXN0cnVjdCByY2hhbiAqY2hhbiA9IGJ1Zi0+Y2hhbjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChsaWtlbHkoYnVmLT5zdGFydCkpIHsKKwkJdnVubWFwKGJ1Zi0+c3RhcnQpOworCQlmb3IgKGkgPSAwOyBpIDwgYnVmLT5wYWdlX2NvdW50OyBpKyspCisJCQlfX2ZyZWVfcGFnZShidWYtPnBhZ2VfYXJyYXlbaV0pOworCQlrZnJlZShidWYtPnBhZ2VfYXJyYXkpOworCX0KKwlrZnJlZShidWYtPnBhZGRpbmcpOworCWtmcmVlKGJ1Zik7CisJa3JlZl9wdXQoJmNoYW4tPmtyZWYsIHJlbGF5X2Rlc3Ryb3lfY2hhbm5lbCk7Cit9CisKKy8qKgorICoJcmVsYXlfcmVtb3ZlX2J1ZiAtIHJlbW92ZSBhIGNoYW5uZWwgYnVmZmVyCisgKgorICoJUmVtb3ZlcyB0aGUgZmlsZSBmcm9tIHRoZSByZWxheWZzIGZpbGV5c3RlbSwgd2hpY2ggYWxzbyBmcmVlcyB0aGUKKyAqCXJjaGFuX2J1Zl9zdHJ1Y3QgYW5kIHRoZSBjaGFubmVsIGJ1ZmZlci4gIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tCisgKglrcmVmX3B1dCgpLgorICovCit2b2lkIHJlbGF5X3JlbW92ZV9idWYoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCByY2hhbl9idWYsIGtyZWYpOworCXJlbGF5ZnNfcmVtb3ZlKGJ1Zi0+ZGVudHJ5KTsKK30KZGlmZiAtLWdpdCBhL2ZzL3JlbGF5ZnMvYnVmZmVycy5oIGIvZnMvcmVsYXlmcy9idWZmZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhMTI0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlbGF5ZnMvYnVmZmVycy5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0JVRkZFUlNfSAorI2RlZmluZSBfQlVGRkVSU19ICisKKy8qIFRoaXMgaW5zcGlyZWQgYnkgcnRhaS9zaG1lbSAqLworI2RlZmluZSBGSVhfU0laRSh4KSAoKCh4KSAtIDEpICYgUEFHRV9NQVNLKSArIFBBR0VfU0laRQorCitleHRlcm4gaW50IHJlbGF5X21tYXBfYnVmKHN0cnVjdCByY2hhbl9idWYgKmJ1Ziwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIHN0cnVjdCByY2hhbl9idWYgKnJlbGF5X2NyZWF0ZV9idWYoc3RydWN0IHJjaGFuICpjaGFuKTsKK2V4dGVybiB2b2lkIHJlbGF5X2Rlc3Ryb3lfYnVmKHN0cnVjdCByY2hhbl9idWYgKmJ1Zik7CitleHRlcm4gdm9pZCByZWxheV9yZW1vdmVfYnVmKHN0cnVjdCBrcmVmICprcmVmKTsKKworI2VuZGlmLyogX0JVRkZFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvcmVsYXlmcy9pbm9kZS5jIGIvZnMvcmVsYXlmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmN2Y4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWxheWZzL2lub2RlLmMKQEAgLTAsMCArMSw2MDkgQEAKKy8qCisgKiBWRlMtcmVsYXRlZCBjb2RlIGZvciBSZWxheUZTLCBhIGhpZ2gtc3BlZWQgZGF0YSByZWxheSBmaWxlc3lzdGVtLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IC0gVG9tIFphbnVzc2kgPHphbnVzc2lAdXMuaWJtLmNvbT4sIElCTSBDb3JwCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAtIEthcmltIFlhZ2htb3VyIDxrYXJpbUBvcGVyc3lzLmNvbT4KKyAqCisgKiBCYXNlZCBvbiByYW1mcywgQ29weXJpZ2h0IChDKSAyMDAyIC0gTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWxheWZzX2ZzLmg+CisjaW5jbHVkZSAicmVsYXkuaCIKKyNpbmNsdWRlICJidWZmZXJzLmgiCisKKyNkZWZpbmUgUkVMQVlGU19NQUdJQwkJCTB4RjBCNEE5ODEKKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqCQlyZWxheWZzX21vdW50Oworc3RhdGljIGludAkJCQlyZWxheWZzX21vdW50X2NvdW50Oworc3RhdGljIGttZW1fY2FjaGVfdCAqCQkJcmVsYXlmc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbwkJcmVsYXlmc19iYWNraW5nX2Rldl9pbmZvID0geworCS5yYV9wYWdlcwk9IDAsCS8qIE5vIHJlYWRhaGVhZCAqLworCS5jYXBhYmlsaXRpZXMJPSBCRElfQ0FQX05PX0FDQ1RfRElSVFkgfCBCRElfQ0FQX05PX1dSSVRFQkFDSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKnJlbGF5ZnNfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlLAorCQkJCSAgICAgICBzdHJ1Y3QgcmNoYW4gKmNoYW4pCit7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaWYgKFNfSVNSRUcobW9kZSkpIHsKKwkJQlVHX09OKCFjaGFuKTsKKwkJYnVmID0gcmVsYXlfY3JlYXRlX2J1ZihjaGFuKTsKKwkJaWYgKCFidWYpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKCFpbm9kZSkgeworCQlyZWxheV9kZXN0cm95X2J1ZihidWYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwlpbm9kZS0+aV91aWQgPSAwOworCWlub2RlLT5pX2dpZCA9IDA7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmcmVsYXlmc19iYWNraW5nX2Rldl9pbmZvOworCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJCWlub2RlLT5pX2ZvcCA9ICZyZWxheWZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJUkVMQVlGU19JKGlub2RlKS0+YnVmID0gYnVmOworCQlicmVhazsKKwljYXNlIFNfSUZESVI6CisJCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKKworCQkvKiBkaXJlY3RvcnkgaW5vZGVzIHN0YXJ0IG9mZiB3aXRoIGlfbmxpbmsgPT0gMiAoZm9yICIuIiBlbnRyeSkgKi8KKwkJaW5vZGUtPmlfbmxpbmsrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGlub2RlOworfQorCisvKioKKyAqCXJlbGF5ZnNfY3JlYXRlX2VudHJ5IC0gY3JlYXRlIGEgcmVsYXlmcyBkaXJlY3Rvcnkgb3IgZmlsZQorICoJQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZQorICoJQHBhcmVudDogcGFyZW50IGRpcmVjdG9yeQorICoJQG1vZGU6IG1vZGUKKyAqCUBjaGFuOiByZWxheSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQorICoKKyAqCVJldHVybnMgdGhlIG5ldyBkZW50cnksIE5VTEwgb24gZmFpbHVyZQorICoKKyAqCUNyZWF0ZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZlZCBwZXJtaXNzaW9ucy4KKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKnJlbGF5ZnNfY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkJICAgaW50IG1vZGUsCisJCQkJCSAgIHN0cnVjdCByY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycm9yID0gMDsKKworCUJVR19PTighbmFtZSB8fCAhKFNfSVNSRUcobW9kZSkgfHwgU19JU0RJUihtb2RlKSkpOworCisJZXJyb3IgPSBzaW1wbGVfcGluX2ZzKCJyZWxheWZzIiwgJnJlbGF5ZnNfbW91bnQsICZyZWxheWZzX21vdW50X2NvdW50KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBtb3VudCByZWxheWZzOiBlcnJjb2RlICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghcGFyZW50ICYmIHJlbGF5ZnNfbW91bnQgJiYgcmVsYXlmc19tb3VudC0+bW50X3NiKQorCQlwYXJlbnQgPSByZWxheWZzX21vdW50LT5tbnRfc2ItPnNfcm9vdDsKKworCWlmICghcGFyZW50KSB7CisJCXNpbXBsZV9yZWxlYXNlX2ZzKCZyZWxheWZzX21vdW50LCAmcmVsYXlmc19tb3VudF9jb3VudCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBhcmVudCA9IGRnZXQocGFyZW50KTsKKwlkb3duKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwlkID0gbG9va3VwX29uZV9sZW4obmFtZSwgcGFyZW50LCBzdHJsZW4obmFtZSkpOworCWlmIChJU19FUlIoZCkpIHsKKwkJZCA9IE5VTEw7CisJCWdvdG8gcmVsZWFzZV9tb3VudDsKKwl9CisKKwlpZiAoZC0+ZF9pbm9kZSkgeworCQlkID0gTlVMTDsKKwkJZ290byByZWxlYXNlX21vdW50OworCX0KKworCWlub2RlID0gcmVsYXlmc19nZXRfaW5vZGUocGFyZW50LT5kX2lub2RlLT5pX3NiLCBtb2RlLCBjaGFuKTsKKwlpZiAoIWlub2RlKSB7CisJCWQgPSBOVUxMOworCQlnb3RvIHJlbGVhc2VfbW91bnQ7CisJfQorCisJZF9pbnN0YW50aWF0ZShkLCBpbm9kZSk7CisJZGdldChkKTsJLyogRXh0cmEgY291bnQgLSBwaW4gdGhlIGRlbnRyeSBpbiBjb3JlICovCisKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcGFyZW50LT5kX2lub2RlLT5pX25saW5rKys7CisKKwlnb3RvIGV4aXQ7CisKK3JlbGVhc2VfbW91bnQ6CisJc2ltcGxlX3JlbGVhc2VfZnMoJnJlbGF5ZnNfbW91bnQsICZyZWxheWZzX21vdW50X2NvdW50KTsKKworZXhpdDoKKwl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJZHB1dChwYXJlbnQpOworCXJldHVybiBkOworfQorCisvKioKKyAqCXJlbGF5ZnNfY3JlYXRlX2ZpbGUgLSBjcmVhdGUgYSBmaWxlIGluIHRoZSByZWxheSBmaWxlc3lzdGVtCisgKglAbmFtZTogdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlCisgKglAcGFyZW50OiBwYXJlbnQgZGlyZWN0b3J5CisgKglAbW9kZTogbW9kZSwgaWYgbm90IHNwZWNpZWQgdGhlIGRlZmF1bHQgcGVybXMgYXJlIHVzZWQKKyAqCUBjaGFuOiBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQorICoKKyAqCVJldHVybnMgZmlsZSBkZW50cnkgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBvdGhlcndpc2UuCisgKgorICoJVGhlIGZpbGUgd2lsbCBiZSBjcmVhdGVkIHVzZXIgciBvbiBiZWhhbGYgb2YgY3VycmVudCB1c2VyLgorICovCitzdHJ1Y3QgZGVudHJ5ICpyZWxheWZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkgICBpbnQgbW9kZSwgc3RydWN0IHJjaGFuICpjaGFuKQoreworCWlmICghbW9kZSkKKwkJbW9kZSA9IFNfSVJVU1I7CisJbW9kZSA9IChtb2RlICYgU19JQUxMVUdPKSB8IFNfSUZSRUc7CisKKwlyZXR1cm4gcmVsYXlmc19jcmVhdGVfZW50cnkobmFtZSwgcGFyZW50LCBtb2RlLCBjaGFuKTsKK30KKworLyoqCisgKglyZWxheWZzX2NyZWF0ZV9kaXIgLSBjcmVhdGUgYSBkaXJlY3RvcnkgaW4gdGhlIHJlbGF5IGZpbGVzeXN0ZW0KKyAqCUBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZQorICoJQHBhcmVudDogcGFyZW50IGRpcmVjdG9yeSwgTlVMTCBpZiBwYXJlbnQgc2hvdWxkIGJlIGZzIHJvb3QKKyAqCisgKglSZXR1cm5zIGRpcmVjdG9yeSBkZW50cnkgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBvdGhlcndpc2UuCisgKgorICoJVGhlIGRpcmVjdG9yeSB3aWxsIGJlIGNyZWF0ZWQgd29ybGQgcnd4IG9uIGJlaGFsZiBvZiBjdXJyZW50IHVzZXIuCisgKi8KK3N0cnVjdCBkZW50cnkgKnJlbGF5ZnNfY3JlYXRlX2Rpcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpCit7CisJaW50IG1vZGUgPSBTX0lGRElSIHwgU19JUldYVSB8IFNfSVJVR08gfCBTX0lYVUdPOworCXJldHVybiByZWxheWZzX2NyZWF0ZV9lbnRyeShuYW1lLCBwYXJlbnQsIG1vZGUsIE5VTEwpOworfQorCisvKioKKyAqCXJlbGF5ZnNfcmVtb3ZlIC0gcmVtb3ZlIGEgZmlsZSBvciBkaXJlY3RvcnkgaW4gdGhlIHJlbGF5IGZpbGVzeXN0ZW0KKyAqCUBkZW50cnk6IGZpbGUgb3IgZGlyZWN0b3J5IGRlbnRyeQorICoKKyAqCVJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBuZWdhdGl2ZSBvdGhlcndpc2UuCisgKi8KK2ludCByZWxheWZzX3JlbW92ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCWludCBlcnJvciA9IDA7CisKKwlpZiAoIWRlbnRyeSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKKwlpZiAoIXBhcmVudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYXJlbnQgPSBkZ2V0KHBhcmVudCk7CisJZG93bigmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCQllcnJvciA9IHNpbXBsZV9ybWRpcihwYXJlbnQtPmRfaW5vZGUsIGRlbnRyeSk7CisJCWVsc2UKKwkJCWVycm9yID0gc2ltcGxlX3VubGluayhwYXJlbnQtPmRfaW5vZGUsIGRlbnRyeSk7CisJCWlmICghZXJyb3IpCisJCQlkX2RlbGV0ZShkZW50cnkpOworCX0KKwlpZiAoIWVycm9yKQorCQlkcHV0KGRlbnRyeSk7CisJdXAoJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCWRwdXQocGFyZW50KTsKKworCWlmICghZXJyb3IpCisJCXNpbXBsZV9yZWxlYXNlX2ZzKCZyZWxheWZzX21vdW50LCAmcmVsYXlmc19tb3VudF9jb3VudCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJcmVsYXlmc19yZW1vdmVfZGlyIC0gcmVtb3ZlIGEgZGlyZWN0b3J5IGluIHRoZSByZWxheSBmaWxlc3lzdGVtCisgKglAZGVudHJ5OiBkaXJlY3RvcnkgZGVudHJ5CisgKgorICoJUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG5lZ2F0aXZlIG90aGVyd2lzZS4KKyAqLworaW50IHJlbGF5ZnNfcmVtb3ZlX2RpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0dXJuIHJlbGF5ZnNfcmVtb3ZlKGRlbnRyeSk7Cit9CisKKy8qKgorICoJcmVsYXlmc19vcGVuIC0gb3BlbiBmaWxlIG9wIGZvciByZWxheWZzIGZpbGVzCisgKglAaW5vZGU6IHRoZSBpbm9kZQorICoJQGZpbHA6IHRoZSBmaWxlCisgKgorICoJSW5jcmVtZW50cyB0aGUgY2hhbm5lbCBidWZmZXIgcmVmY291bnQuCisgKi8KK3N0YXRpYyBpbnQgcmVsYXlmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9IFJFTEFZRlNfSShpbm9kZSktPmJ1ZjsKKwlrcmVmX2dldCgmYnVmLT5rcmVmKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXJlbGF5ZnNfbW1hcCAtIG1tYXAgZmlsZSBvcCBmb3IgcmVsYXlmcyBmaWxlcworICoJQGZpbHA6IHRoZSBmaWxlCisgKglAdm1hOiB0aGUgdm1hIGRlc2NyaWJpbmcgd2hhdCB0byBtYXAKKyAqCisgKglDYWxscyB1cG9uIHJlbGF5X21tYXBfYnVmIHRvIG1hcCB0aGUgZmlsZSBpbnRvIHVzZXIgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgcmVsYXlmc19tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJcmV0dXJuIHJlbGF5X21tYXBfYnVmKFJFTEFZRlNfSShpbm9kZSktPmJ1Ziwgdm1hKTsKK30KKworLyoqCisgKglyZWxheWZzX3BvbGwgLSBwb2xsIGZpbGUgb3AgZm9yIHJlbGF5ZnMgZmlsZXMKKyAqCUBmaWxwOiB0aGUgZmlsZQorICoJQHdhaXQ6IHBvbGwgdGFibGUKKyAqCisgKglQb2xsIGltcGxlbWVudGlvbi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCByZWxheWZzX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKndhaXQpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWYgPSBSRUxBWUZTX0koaW5vZGUpLT5idWY7CisKKwlpZiAoYnVmLT5maW5hbGl6ZWQpCisJCXJldHVybiBQT0xMRVJSOworCisJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJcG9sbF93YWl0KGZpbHAsICZidWYtPnJlYWRfd2FpdCwgd2FpdCk7CisJCWlmICghcmVsYXlfYnVmX2VtcHR5KGJ1ZikpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICoJcmVsYXlmc19yZWxlYXNlIC0gcmVsZWFzZSBmaWxlIG9wIGZvciByZWxheWZzIGZpbGVzCisgKglAaW5vZGU6IHRoZSBpbm9kZQorICoJQGZpbHA6IHRoZSBmaWxlCisgKgorICoJRGVjcmVtZW50cyB0aGUgY2hhbm5lbCByZWZjb3VudCwgYXMgdGhlIGZpbGVzeXN0ZW0gaXMKKyAqCW5vIGxvbmdlciB1c2luZyBpdC4KKyAqLworc3RhdGljIGludCByZWxheWZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gUkVMQVlGU19JKGlub2RlKS0+YnVmOworCWtyZWZfcHV0KCZidWYtPmtyZWYsIHJlbGF5X3JlbW92ZV9idWYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJcmVsYXlmc19yZWFkX2NvbnN1bWUgLSB1cGRhdGUgdGhlIGNvbnN1bWVkIGNvdW50IGZvciB0aGUgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIHJlbGF5ZnNfcmVhZF9jb25zdW1lKHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKKwkJCQkgc2l6ZV90IHJlYWRfcG9zLAorCQkJCSBzaXplX3QgYnl0ZXNfY29uc3VtZWQpCit7CisJc2l6ZV90IHN1YmJ1Zl9zaXplID0gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZTsKKwlzaXplX3Qgbl9zdWJidWZzID0gYnVmLT5jaGFuLT5uX3N1YmJ1ZnM7CisJc2l6ZV90IHJlYWRfc3ViYnVmOworCisJaWYgKGJ1Zi0+Ynl0ZXNfY29uc3VtZWQgKyBieXRlc19jb25zdW1lZCA+IHN1YmJ1Zl9zaXplKSB7CisJCXJlbGF5X3N1YmJ1ZnNfY29uc3VtZWQoYnVmLT5jaGFuLCBidWYtPmNwdSwgMSk7CisJCWJ1Zi0+Ynl0ZXNfY29uc3VtZWQgPSAwOworCX0KKworCWJ1Zi0+Ynl0ZXNfY29uc3VtZWQgKz0gYnl0ZXNfY29uc3VtZWQ7CisJcmVhZF9zdWJidWYgPSByZWFkX3BvcyAvIGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemU7CisJaWYgKGJ1Zi0+Ynl0ZXNfY29uc3VtZWQgKyBidWYtPnBhZGRpbmdbcmVhZF9zdWJidWZdID09IHN1YmJ1Zl9zaXplKSB7CisJCWlmICgocmVhZF9zdWJidWYgPT0gYnVmLT5zdWJidWZzX3Byb2R1Y2VkICUgbl9zdWJidWZzKSAmJgorCQkgICAgKGJ1Zi0+b2Zmc2V0ID09IHN1YmJ1Zl9zaXplKSkKKwkJCXJldHVybjsKKwkJcmVsYXlfc3ViYnVmc19jb25zdW1lZChidWYtPmNoYW4sIGJ1Zi0+Y3B1LCAxKTsKKwkJYnVmLT5ieXRlc19jb25zdW1lZCA9IDA7CisJfQorfQorCisvKioKKyAqCXJlbGF5ZnNfcmVhZF9hdmFpbCAtIGJvb2xlYW4sIGFyZSB0aGVyZSB1bmNvbnN1bWVkIGJ5dGVzIGF2YWlsYWJsZT8KKyAqLworc3RhdGljIGludCByZWxheWZzX3JlYWRfYXZhaWwoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLCBzaXplX3QgcmVhZF9wb3MpCit7CisJc2l6ZV90IGJ5dGVzX3Byb2R1Y2VkLCBieXRlc19jb25zdW1lZCwgd3JpdGVfb2Zmc2V0OworCXNpemVfdCBzdWJidWZfc2l6ZSA9IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemU7CisJc2l6ZV90IG5fc3ViYnVmcyA9IGJ1Zi0+Y2hhbi0+bl9zdWJidWZzOworCXNpemVfdCBwcm9kdWNlZCA9IGJ1Zi0+c3ViYnVmc19wcm9kdWNlZCAlIG5fc3ViYnVmczsKKwlzaXplX3QgY29uc3VtZWQgPSBidWYtPnN1YmJ1ZnNfY29uc3VtZWQgJSBuX3N1YmJ1ZnM7CisKKwl3cml0ZV9vZmZzZXQgPSBidWYtPm9mZnNldCA+IHN1YmJ1Zl9zaXplID8gc3ViYnVmX3NpemUgOiBidWYtPm9mZnNldDsKKworCWlmIChjb25zdW1lZCA+IHByb2R1Y2VkKSB7CisJCWlmICgocHJvZHVjZWQgPiBuX3N1YmJ1ZnMpICYmCisJCSAgICAocHJvZHVjZWQgKyBuX3N1YmJ1ZnMgLSBjb25zdW1lZCA8PSBuX3N1YmJ1ZnMpKQorCQkJcHJvZHVjZWQgKz0gbl9zdWJidWZzOworCX0gZWxzZSBpZiAoY29uc3VtZWQgPT0gcHJvZHVjZWQpIHsKKwkJaWYgKGJ1Zi0+b2Zmc2V0ID4gc3ViYnVmX3NpemUpIHsKKwkJCXByb2R1Y2VkICs9IG5fc3ViYnVmczsKKwkJCWlmIChidWYtPnN1YmJ1ZnNfcHJvZHVjZWQgPT0gYnVmLT5zdWJidWZzX2NvbnN1bWVkKQorCQkJCWNvbnN1bWVkICs9IG5fc3ViYnVmczsKKwkJfQorCX0KKworCWlmIChidWYtPm9mZnNldCA+IHN1YmJ1Zl9zaXplKQorCQlieXRlc19wcm9kdWNlZCA9IChwcm9kdWNlZCAtIDEpICogc3ViYnVmX3NpemUgKyB3cml0ZV9vZmZzZXQ7CisJZWxzZQorCQlieXRlc19wcm9kdWNlZCA9IHByb2R1Y2VkICogc3ViYnVmX3NpemUgKyB3cml0ZV9vZmZzZXQ7CisJYnl0ZXNfY29uc3VtZWQgPSBjb25zdW1lZCAqIHN1YmJ1Zl9zaXplICsgYnVmLT5ieXRlc19jb25zdW1lZDsKKworCWlmIChieXRlc19wcm9kdWNlZCA9PSBieXRlc19jb25zdW1lZCkKKwkJcmV0dXJuIDA7CisKKwlyZWxheWZzX3JlYWRfY29uc3VtZShidWYsIHJlYWRfcG9zLCAwKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqCXJlbGF5ZnNfcmVhZF9zdWJidWZfYXZhaWwgLSByZXR1cm4gYnl0ZXMgYXZhaWxhYmxlIGluIHN1Yi1idWZmZXIKKyAqLworc3RhdGljIHNpemVfdCByZWxheWZzX3JlYWRfc3ViYnVmX2F2YWlsKHNpemVfdCByZWFkX3BvcywKKwkJCQkJc3RydWN0IHJjaGFuX2J1ZiAqYnVmKQoreworCXNpemVfdCBwYWRkaW5nLCBhdmFpbCA9IDA7CisJc2l6ZV90IHJlYWRfc3ViYnVmLCByZWFkX29mZnNldCwgd3JpdGVfc3ViYnVmLCB3cml0ZV9vZmZzZXQ7CisJc2l6ZV90IHN1YmJ1Zl9zaXplID0gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZTsKKworCXdyaXRlX3N1YmJ1ZiA9IChidWYtPmRhdGEgLSBidWYtPnN0YXJ0KSAvIHN1YmJ1Zl9zaXplOworCXdyaXRlX29mZnNldCA9IGJ1Zi0+b2Zmc2V0ID4gc3ViYnVmX3NpemUgPyBzdWJidWZfc2l6ZSA6IGJ1Zi0+b2Zmc2V0OworCXJlYWRfc3ViYnVmID0gcmVhZF9wb3MgLyBzdWJidWZfc2l6ZTsKKwlyZWFkX29mZnNldCA9IHJlYWRfcG9zICUgc3ViYnVmX3NpemU7CisJcGFkZGluZyA9IGJ1Zi0+cGFkZGluZ1tyZWFkX3N1YmJ1Zl07CisKKwlpZiAocmVhZF9zdWJidWYgPT0gd3JpdGVfc3ViYnVmKSB7CisJCWlmIChyZWFkX29mZnNldCArIHBhZGRpbmcgPCB3cml0ZV9vZmZzZXQpCisJCQlhdmFpbCA9IHdyaXRlX29mZnNldCAtIChyZWFkX29mZnNldCArIHBhZGRpbmcpOworCX0gZWxzZQorCQlhdmFpbCA9IChzdWJidWZfc2l6ZSAtIHBhZGRpbmcpIC0gcmVhZF9vZmZzZXQ7CisKKwlyZXR1cm4gYXZhaWw7Cit9CisKKy8qKgorICoJcmVsYXlmc19yZWFkX3N0YXJ0X3BvcyAtIGZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSBieXRlIHRvIHJlYWQKKyAqCisgKglJZiB0aGUgcmVhZF9wb3MgaXMgaW4gdGhlIG1pZGRsZSBvZiBwYWRkaW5nLCByZXR1cm4gdGhlCisgKglwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYWN0dWFsbHkgYXZhaWxhYmxlIGJ5dGUsIG90aGVyd2lzZQorICoJcmV0dXJuIHRoZSBvcmlnaW5hbCB2YWx1ZS4KKyAqLworc3RhdGljIHNpemVfdCByZWxheWZzX3JlYWRfc3RhcnRfcG9zKHNpemVfdCByZWFkX3BvcywKKwkJCQkgICAgIHN0cnVjdCByY2hhbl9idWYgKmJ1ZikKK3sKKwlzaXplX3QgcmVhZF9zdWJidWYsIHBhZGRpbmcsIHBhZGRpbmdfc3RhcnQsIHBhZGRpbmdfZW5kOworCXNpemVfdCBzdWJidWZfc2l6ZSA9IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemU7CisJc2l6ZV90IG5fc3ViYnVmcyA9IGJ1Zi0+Y2hhbi0+bl9zdWJidWZzOworCisJcmVhZF9zdWJidWYgPSByZWFkX3BvcyAvIHN1YmJ1Zl9zaXplOworCXBhZGRpbmcgPSBidWYtPnBhZGRpbmdbcmVhZF9zdWJidWZdOworCXBhZGRpbmdfc3RhcnQgPSAocmVhZF9zdWJidWYgKyAxKSAqIHN1YmJ1Zl9zaXplIC0gcGFkZGluZzsKKwlwYWRkaW5nX2VuZCA9IChyZWFkX3N1YmJ1ZiArIDEpICogc3ViYnVmX3NpemU7CisJaWYgKHJlYWRfcG9zID49IHBhZGRpbmdfc3RhcnQgJiYgcmVhZF9wb3MgPCBwYWRkaW5nX2VuZCkgeworCQlyZWFkX3N1YmJ1ZiA9IChyZWFkX3N1YmJ1ZiArIDEpICUgbl9zdWJidWZzOworCQlyZWFkX3BvcyA9IHJlYWRfc3ViYnVmICogc3ViYnVmX3NpemU7CisJfQorCisJcmV0dXJuIHJlYWRfcG9zOworfQorCisvKioKKyAqCXJlbGF5ZnNfcmVhZF9lbmRfcG9zIC0gcmV0dXJuIHRoZSBuZXcgcmVhZCBwb3NpdGlvbgorICovCitzdGF0aWMgc2l6ZV90IHJlbGF5ZnNfcmVhZF9lbmRfcG9zKHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKKwkJCQkgICBzaXplX3QgcmVhZF9wb3MsCisJCQkJICAgc2l6ZV90IGNvdW50KQoreworCXNpemVfdCByZWFkX3N1YmJ1ZiwgcGFkZGluZywgZW5kX3BvczsKKwlzaXplX3Qgc3ViYnVmX3NpemUgPSBidWYtPmNoYW4tPnN1YmJ1Zl9zaXplOworCXNpemVfdCBuX3N1YmJ1ZnMgPSBidWYtPmNoYW4tPm5fc3ViYnVmczsKKworCXJlYWRfc3ViYnVmID0gcmVhZF9wb3MgLyBzdWJidWZfc2l6ZTsKKwlwYWRkaW5nID0gYnVmLT5wYWRkaW5nW3JlYWRfc3ViYnVmXTsKKwlpZiAocmVhZF9wb3MgJSBzdWJidWZfc2l6ZSArIGNvdW50ICsgcGFkZGluZyA9PSBzdWJidWZfc2l6ZSkKKwkJZW5kX3BvcyA9IChyZWFkX3N1YmJ1ZiArIDEpICogc3ViYnVmX3NpemU7CisJZWxzZQorCQllbmRfcG9zID0gcmVhZF9wb3MgKyBjb3VudDsKKwlpZiAoZW5kX3BvcyA+PSBzdWJidWZfc2l6ZSAqIG5fc3ViYnVmcykKKwkJZW5kX3BvcyA9IDA7CisKKwlyZXR1cm4gZW5kX3BvczsKK30KKworLyoqCisgKglyZWxheWZzX3JlYWQgLSByZWFkIGZpbGUgb3AgZm9yIHJlbGF5ZnMgZmlsZXMKKyAqCUBmaWxwOiB0aGUgZmlsZQorICoJQGJ1ZmZlcjogdGhlIHVzZXJzcGFjZSBidWZmZXIKKyAqCUBjb3VudDogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqCUBwcG9zOiBwb3NpdGlvbiB0byByZWFkIGZyb20KKyAqCisgKglSZWFkcyBjb3VudCBieXRlcyBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUKKyAqCWN1cnJlbnQgc3ViLWJ1ZmZlciBiZWluZyByZWFkLCB3aGljaGV2ZXIgaXMgc21hbGxlci4KKyAqLworc3RhdGljIHNzaXplX3QgcmVsYXlmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgc2l6ZV90IGNvdW50LAorCQkJICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gUkVMQVlGU19JKGlub2RlKS0+YnVmOworCXNpemVfdCByZWFkX3N0YXJ0LCBhdmFpbDsKKwlzc2l6ZV90IHJldCA9IDA7CisJdm9pZCAqZnJvbTsKKworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJaWYoIXJlbGF5ZnNfcmVhZF9hdmFpbChidWYsICpwcG9zKSkKKwkJZ290byBvdXQ7CisKKwlyZWFkX3N0YXJ0ID0gcmVsYXlmc19yZWFkX3N0YXJ0X3BvcygqcHBvcywgYnVmKTsKKwlhdmFpbCA9IHJlbGF5ZnNfcmVhZF9zdWJidWZfYXZhaWwocmVhZF9zdGFydCwgYnVmKTsKKwlpZiAoIWF2YWlsKQorCQlnb3RvIG91dDsKKworCWZyb20gPSBidWYtPnN0YXJ0ICsgcmVhZF9zdGFydDsKKwlyZXQgPSBjb3VudCA9IG1pbihjb3VudCwgYXZhaWwpOworCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBmcm9tLCBjb3VudCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCXJlbGF5ZnNfcmVhZF9jb25zdW1lKGJ1ZiwgcmVhZF9zdGFydCwgY291bnQpOworCSpwcG9zID0gcmVsYXlmc19yZWFkX2VuZF9wb3MoYnVmLCByZWFkX3N0YXJ0LCBjb3VudCk7CitvdXQ6CisJdXAoJmlub2RlLT5pX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKglyZWxheWZzIGFsbG9jX2lub2RlKCkgaW1wbGVtZW50YXRpb24KKyAqLworc3RhdGljIHN0cnVjdCBpbm9kZSAqcmVsYXlmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCByZWxheWZzX2lub2RlX2luZm8gKnAgPSBrbWVtX2NhY2hlX2FsbG9jKHJlbGF5ZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm4gTlVMTDsKKwlwLT5idWYgPSBOVUxMOworCisJcmV0dXJuICZwLT52ZnNfaW5vZGU7Cit9CisKKy8qKgorICoJcmVsYXlmcyBkZXN0cm95X2lub2RlKCkgaW1wbGVtZW50YXRpb24KKyAqLworc3RhdGljIHZvaWQgcmVsYXlmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKFJFTEFZRlNfSShpbm9kZSktPmJ1ZikKKwkJcmVsYXlfZGVzdHJveV9idWYoUkVMQVlGU19JKGlub2RlKS0+YnVmKTsKKworCWttZW1fY2FjaGVfZnJlZShyZWxheWZzX2lub2RlX2NhY2hlcCwgUkVMQVlGU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpwLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgcmVsYXlmc19pbm9kZV9pbmZvICppID0gcDsKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRlkgfCBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PSBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZSgmaS0+dmZzX2lub2RlKTsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWxheWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSByZWxheWZzX29wZW4sCisJLnBvbGwJCT0gcmVsYXlmc19wb2xsLAorCS5tbWFwCQk9IHJlbGF5ZnNfbW1hcCwKKwkucmVhZAkJPSByZWxheWZzX3JlYWQsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlbGVhc2UJPSByZWxheWZzX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgcmVsYXlmc19vcHMgPSB7CisJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAorCS5kcm9wX2lub2RlCT0gZ2VuZXJpY19kZWxldGVfaW5vZGUsCisJLmFsbG9jX2lub2RlCT0gcmVsYXlmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IHJlbGF5ZnNfZGVzdHJveV9pbm9kZSwKK307CisKK3N0YXRpYyBpbnQgcmVsYXlmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCB2b2lkICogZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisJaW50IG1vZGUgPSBTX0lGRElSIHwgU19JUldYVSB8IFNfSVJVR08gfCBTX0lYVUdPOworCisJc2ItPnNfYmxvY2tzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gUEFHRV9DQUNIRV9TSElGVDsKKwlzYi0+c19tYWdpYyA9IFJFTEFZRlNfTUFHSUM7CisJc2ItPnNfb3AgPSAmcmVsYXlmc19vcHM7CisJaW5vZGUgPSByZWxheWZzX2dldF9pbm9kZShzYiwgbW9kZSwgTlVMTCk7CisKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOworCWlmICghcm9vdCkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNiLT5zX3Jvb3QgPSByb290OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiByZWxheWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJCQkJICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkJICAgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgcmVsYXlmc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHJlbGF5ZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInJlbGF5ZnMiLAorCS5nZXRfc2IJCT0gcmVsYXlmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcmVsYXlmc19mcyh2b2lkKQoreworCWludCBlcnI7CisKKwlyZWxheWZzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJyZWxheWZzX2lub2RlX2NhY2hlIiwKKwkJCQlzaXplb2Yoc3RydWN0IHJlbGF5ZnNfaW5vZGVfaW5mbyksIDAsCisJCQkJMCwgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAoIXJlbGF5ZnNfaW5vZGVfY2FjaGVwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJlbGF5ZnNfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJa21lbV9jYWNoZV9kZXN0cm95KHJlbGF5ZnNfaW5vZGVfY2FjaGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3JlbGF5ZnNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJlbGF5ZnNfZnNfdHlwZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHJlbGF5ZnNfaW5vZGVfY2FjaGVwKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9yZWxheWZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9yZWxheWZzX2ZzKQorCitFWFBPUlRfU1lNQk9MX0dQTChyZWxheWZzX2ZpbGVfb3BlcmF0aW9ucyk7CitFWFBPUlRfU1lNQk9MX0dQTChyZWxheWZzX2NyZWF0ZV9kaXIpOworRVhQT1JUX1NZTUJPTF9HUEwocmVsYXlmc19yZW1vdmVfZGlyKTsKKworTU9EVUxFX0FVVEhPUigiVG9tIFphbnVzc2kgPHphbnVzc2lAdXMuaWJtLmNvbT4gYW5kIEthcmltIFlhZ2htb3VyIDxrYXJpbUBvcGVyc3lzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVsYXkgRmlsZXN5c3RlbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9mcy9yZWxheWZzL3JlbGF5LmMgYi9mcy9yZWxheWZzL3JlbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0NDZhMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlbGF5ZnMvcmVsYXkuYwpAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIFB1YmxpYyBBUEkgYW5kIGNvbW1vbiBjb2RlIGZvciBSZWxheUZTLgorICoKKyAqIFNlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JlbGF5ZnMudHh0IGZvciBhbiBvdmVydmlldyBvZiByZWxheWZzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IC0gVG9tIFphbnVzc2kgKHphbnVzc2lAdXMuaWJtLmNvbSksIElCTSBDb3JwCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSAtIEthcmltIFlhZ2htb3VyIChrYXJpbUBvcGVyc3lzLmNvbSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcmVsYXlmc19mcy5oPgorI2luY2x1ZGUgInJlbGF5LmgiCisjaW5jbHVkZSAiYnVmZmVycy5oIgorCisvKioKKyAqCXJlbGF5X2J1Zl9lbXB0eSAtIGJvb2xlYW4sIGlzIHRoZSBjaGFubmVsIGJ1ZmZlciBlbXB0eT8KKyAqCUBidWY6IGNoYW5uZWwgYnVmZmVyCisgKgorICoJUmV0dXJucyAxIGlmIHRoZSBidWZmZXIgaXMgZW1wdHksIDAgb3RoZXJ3aXNlLgorICovCitpbnQgcmVsYXlfYnVmX2VtcHR5KHN0cnVjdCByY2hhbl9idWYgKmJ1ZikKK3sKKwlyZXR1cm4gKGJ1Zi0+c3ViYnVmc19wcm9kdWNlZCAtIGJ1Zi0+c3ViYnVmc19jb25zdW1lZCkgPyAwIDogMTsKK30KKworLyoqCisgKglyZWxheV9idWZfZnVsbCAtIGJvb2xlYW4sIGlzIHRoZSBjaGFubmVsIGJ1ZmZlciBmdWxsPworICoJQGJ1ZjogY2hhbm5lbCBidWZmZXIKKyAqCisgKglSZXR1cm5zIDEgaWYgdGhlIGJ1ZmZlciBpcyBmdWxsLCAwIG90aGVyd2lzZS4KKyAqLworaW50IHJlbGF5X2J1Zl9mdWxsKHN0cnVjdCByY2hhbl9idWYgKmJ1ZikKK3sKKwlzaXplX3QgcmVhZHkgPSBidWYtPnN1YmJ1ZnNfcHJvZHVjZWQgLSBidWYtPnN1YmJ1ZnNfY29uc3VtZWQ7CisJcmV0dXJuIChyZWFkeSA+PSBidWYtPmNoYW4tPm5fc3ViYnVmcykgPyAxIDogMDsKK30KKworLyoKKyAqIEhpZ2gtbGV2ZWwgcmVsYXlmcyBrZXJuZWwgQVBJIGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9ucy4KKyAqLworCisvKgorICogcmNoYW5fY2FsbGJhY2sgaW1wbGVtZW50YXRpb25zIGRlZmluaW5nIGRlZmF1bHQgY2hhbm5lbCBiZWhhdmlvci4gIFVzZWQKKyAqIGluIHBsYWNlIG9mIGNvcnJlc3BvbmRpbmcgTlVMTCB2YWx1ZXMgaW4gY2xpZW50IGNhbGxiYWNrIHN0cnVjdC4KKyAqLworCisvKgorICogc3ViYnVmX3N0YXJ0KCkgZGVmYXVsdCBjYWxsYmFjay4gIERvZXMgbm90aGluZy4KKyAqLworc3RhdGljIGludCBzdWJidWZfc3RhcnRfZGVmYXVsdF9jYWxsYmFjayAoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLAorCQkJCQkgIHZvaWQgKnN1YmJ1ZiwKKwkJCQkJICB2b2lkICpwcmV2X3N1YmJ1ZiwKKwkJCQkJICBzaXplX3QgcHJldl9wYWRkaW5nKQoreworCWlmIChyZWxheV9idWZfZnVsbChidWYpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKgorICogYnVmX21hcHBlZCgpIGRlZmF1bHQgY2FsbGJhY2suICBEb2VzIG5vdGhpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGJ1Zl9tYXBwZWRfZGVmYXVsdF9jYWxsYmFjayhzdHJ1Y3QgcmNoYW5fYnVmICpidWYsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxwKQoreworfQorCisvKgorICogYnVmX3VubWFwcGVkKCkgZGVmYXVsdCBjYWxsYmFjay4gIERvZXMgbm90aGluZy4KKyAqLworc3RhdGljIHZvaWQgYnVmX3VubWFwcGVkX2RlZmF1bHRfY2FsbGJhY2soc3RydWN0IHJjaGFuX2J1ZiAqYnVmLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxwKQoreworfQorCisvKiByZWxheSBjaGFubmVsIGRlZmF1bHQgY2FsbGJhY2tzICovCitzdGF0aWMgc3RydWN0IHJjaGFuX2NhbGxiYWNrcyBkZWZhdWx0X2NoYW5uZWxfY2FsbGJhY2tzID0geworCS5zdWJidWZfc3RhcnQgPSBzdWJidWZfc3RhcnRfZGVmYXVsdF9jYWxsYmFjaywKKwkuYnVmX21hcHBlZCA9IGJ1Zl9tYXBwZWRfZGVmYXVsdF9jYWxsYmFjaywKKwkuYnVmX3VubWFwcGVkID0gYnVmX3VubWFwcGVkX2RlZmF1bHRfY2FsbGJhY2ssCit9OworCisvKioKKyAqCXdha2V1cF9yZWFkZXJzIC0gd2FrZSB1cCByZWFkZXJzIHdhaXRpbmcgb24gYSBjaGFubmVsCisgKglAcHJpdmF0ZTogdGhlIGNoYW5uZWwgYnVmZmVyCisgKgorICoJVGhpcyBpcyB0aGUgd29yayBmdW5jdGlvbiB1c2VkIHRvIGRlZmVyIHJlYWRlciB3YWtpbmcuICBUaGUKKyAqCXJlYXNvbiB3YWtpbmcgaXMgZGVmZXJyZWQgaXMgdGhhdCBjYWxsaW5nIGRpcmVjdGx5IGZyb20gd3JpdGUKKyAqCWNhdXNlcyBwcm9ibGVtcyBpZiB5b3UncmUgd3JpdGluZyBmcm9tIHNheSB0aGUgc2NoZWR1bGVyLgorICovCitzdGF0aWMgdm9pZCB3YWtldXBfcmVhZGVycyh2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9IHByaXZhdGU7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZidWYtPnJlYWRfd2FpdCk7Cit9CisKKy8qKgorICoJX19yZWxheV9yZXNldCAtIHJlc2V0IGEgY2hhbm5lbCBidWZmZXIKKyAqCUBidWY6IHRoZSBjaGFubmVsIGJ1ZmZlcgorICoJQGluaXQ6IDEgaWYgdGhpcyBpcyBhIGZpcnN0LXRpbWUgaW5pdGlhbGl6YXRpb24KKyAqCisgKglTZWUgcmVsYXlfcmVzZXQgZm9yIGRlc2NyaXB0aW9uIG9mIGVmZmVjdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fcmVsYXlfcmVzZXQoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLCB1bnNpZ25lZCBpbnQgaW5pdCkKK3sKKwlzaXplX3QgaTsKKworCWlmIChpbml0KSB7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ1Zi0+cmVhZF93YWl0KTsKKwkJa3JlZl9pbml0KCZidWYtPmtyZWYpOworCQlJTklUX1dPUksoJmJ1Zi0+d2FrZV9yZWFkZXJzLCBOVUxMLCBOVUxMKTsKKwl9IGVsc2UgeworCQljYW5jZWxfZGVsYXllZF93b3JrKCZidWYtPndha2VfcmVhZGVycyk7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJfQorCisJYnVmLT5zdWJidWZzX3Byb2R1Y2VkID0gMDsKKwlidWYtPnN1YmJ1ZnNfY29uc3VtZWQgPSAwOworCWJ1Zi0+Ynl0ZXNfY29uc3VtZWQgPSAwOworCWJ1Zi0+ZmluYWxpemVkID0gMDsKKwlidWYtPmRhdGEgPSBidWYtPnN0YXJ0OworCWJ1Zi0+b2Zmc2V0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBidWYtPmNoYW4tPm5fc3ViYnVmczsgaSsrKQorCQlidWYtPnBhZGRpbmdbaV0gPSAwOworCisJYnVmLT5jaGFuLT5jYi0+c3ViYnVmX3N0YXJ0KGJ1ZiwgYnVmLT5kYXRhLCBOVUxMLCAwKTsKK30KKworLyoqCisgKglyZWxheV9yZXNldCAtIHJlc2V0IHRoZSBjaGFubmVsCisgKglAY2hhbjogdGhlIGNoYW5uZWwKKyAqCisgKglUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGVyYXNpbmcgYWxsIGRhdGEgZnJvbSBhbGwgY2hhbm5lbCBidWZmZXJzCisgKglhbmQgcmVzdGFydGluZyB0aGUgY2hhbm5lbCBpbiBpdHMgaW5pdGlhbCBzdGF0ZS4gIFRoZSBidWZmZXJzCisgKglhcmUgbm90IGZyZWVkLCBzbyBhbnkgbWFwcGluZ3MgYXJlIHN0aWxsIGluIGVmZmVjdC4KKyAqCisgKglOT1RFOiBDYXJlIHNob3VsZCBiZSB0YWtlbiB0aGF0IHRoZSBjaGFubmVsIGlzbid0IGFjdHVhbGx5CisgKgliZWluZyB1c2VkIGJ5IGFueXRoaW5nIHdoZW4gdGhpcyBjYWxsIGlzIG1hZGUuCisgKi8KK3ZvaWQgcmVsYXlfcmVzZXQoc3RydWN0IHJjaGFuICpjaGFuKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCFjaGFuKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCWlmICghY2hhbi0+YnVmW2ldKQorCQkJY29udGludWU7CisJCV9fcmVsYXlfcmVzZXQoY2hhbi0+YnVmW2ldLCAwKTsKKwl9Cit9CisKKy8qKgorICoJcmVsYXlfb3Blbl9idWYgLSBjcmVhdGUgYSBuZXcgY2hhbm5lbCBidWZmZXIgaW4gcmVsYXlmcworICoKKyAqCUludGVybmFsIC0gdXNlZCBieSByZWxheV9vcGVuKCkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmNoYW5fYnVmICpyZWxheV9vcGVuX2J1ZihzdHJ1Y3QgcmNoYW4gKmNoYW4sCisJCQkJCWNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpCit7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCS8qIENyZWF0ZSBmaWxlIGluIGZzICovCisJZGVudHJ5ID0gcmVsYXlmc19jcmVhdGVfZmlsZShmaWxlbmFtZSwgcGFyZW50LCBTX0lSVVNSLCBjaGFuKTsKKwlpZiAoIWRlbnRyeSkKKwkJcmV0dXJuIE5VTEw7CisKKwlidWYgPSBSRUxBWUZTX0koZGVudHJ5LT5kX2lub2RlKS0+YnVmOworCWJ1Zi0+ZGVudHJ5ID0gZGVudHJ5OworCV9fcmVsYXlfcmVzZXQoYnVmLCAxKTsKKworCXJldHVybiBidWY7Cit9CisKKy8qKgorICoJcmVsYXlfY2xvc2VfYnVmIC0gY2xvc2UgYSBjaGFubmVsIGJ1ZmZlcgorICoJQGJ1ZjogY2hhbm5lbCBidWZmZXIKKyAqCisgKglNYXJrcyB0aGUgYnVmZmVyIGZpbmFsaXplZCBhbmQgcmVzdG9yZXMgdGhlIGRlZmF1bHQgY2FsbGJhY2tzLgorICoJVGhlIGNoYW5uZWwgYnVmZmVyIGFuZCBjaGFubmVsIGJ1ZmZlciBkYXRhIHN0cnVjdHVyZSBhcmUgdGhlbiBmcmVlZAorICoJYXV0b21hdGljYWxseSB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBpcyBnaXZlbiB1cC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJlbGF5X2Nsb3NlX2J1ZihzdHJ1Y3QgcmNoYW5fYnVmICpidWYpCit7CisJYnVmLT5maW5hbGl6ZWQgPSAxOworCWJ1Zi0+Y2hhbi0+Y2IgPSAmZGVmYXVsdF9jaGFubmVsX2NhbGxiYWNrczsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZidWYtPndha2VfcmVhZGVycyk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlrcmVmX3B1dCgmYnVmLT5rcmVmLCByZWxheV9yZW1vdmVfYnVmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX2NhbGxiYWNrcyhzdHJ1Y3QgcmNoYW4gKmNoYW4sCisJCQkJICAgc3RydWN0IHJjaGFuX2NhbGxiYWNrcyAqY2IpCit7CisJaWYgKCFjYikgeworCQljaGFuLT5jYiA9ICZkZWZhdWx0X2NoYW5uZWxfY2FsbGJhY2tzOworCQlyZXR1cm47CisJfQorCisJaWYgKCFjYi0+c3ViYnVmX3N0YXJ0KQorCQljYi0+c3ViYnVmX3N0YXJ0ID0gc3ViYnVmX3N0YXJ0X2RlZmF1bHRfY2FsbGJhY2s7CisJaWYgKCFjYi0+YnVmX21hcHBlZCkKKwkJY2ItPmJ1Zl9tYXBwZWQgPSBidWZfbWFwcGVkX2RlZmF1bHRfY2FsbGJhY2s7CisJaWYgKCFjYi0+YnVmX3VubWFwcGVkKQorCQljYi0+YnVmX3VubWFwcGVkID0gYnVmX3VubWFwcGVkX2RlZmF1bHRfY2FsbGJhY2s7CisJY2hhbi0+Y2IgPSBjYjsKK30KKworLyoqCisgKglyZWxheV9vcGVuIC0gY3JlYXRlIGEgbmV3IHJlbGF5ZnMgY2hhbm5lbAorICoJQGJhc2VfZmlsZW5hbWU6IGJhc2UgbmFtZSBvZiBmaWxlcyB0byBjcmVhdGUKKyAqCUBwYXJlbnQ6IGRlbnRyeSBvZiBwYXJlbnQgZGlyZWN0b3J5LCBOVUxMIGZvciByb290IGRpcmVjdG9yeQorICoJQHN1YmJ1Zl9zaXplOiBzaXplIG9mIHN1Yi1idWZmZXJzCisgKglAbl9zdWJidWZzOiBudW1iZXIgb2Ygc3ViLWJ1ZmZlcnMKKyAqCUBjYjogY2xpZW50IGNhbGxiYWNrIGZ1bmN0aW9ucworICoKKyAqCVJldHVybnMgY2hhbm5lbCBwb2ludGVyIGlmIHN1Y2Nlc3NmdWwsIE5VTEwgb3RoZXJ3aXNlLgorICoKKyAqCUNyZWF0ZXMgYSBjaGFubmVsIGJ1ZmZlciBmb3IgZWFjaCBjcHUgdXNpbmcgdGhlIHNpemVzIGFuZAorICoJYXR0cmlidXRlcyBzcGVjaWZpZWQuICBUaGUgY3JlYXRlZCBjaGFubmVsIGJ1ZmZlciBmaWxlcworICoJd2lsbCBiZSBuYW1lZCBiYXNlX2ZpbGVuYW1lMC4uLmJhc2VfZmlsZW5hbWVOLTEuICBGaWxlCisgKglwZXJtaXNzaW9ucyB3aWxsIGJlIFNfSVJVU1IuCisgKi8KK3N0cnVjdCByY2hhbiAqcmVsYXlfb3Blbihjb25zdCBjaGFyICpiYXNlX2ZpbGVuYW1lLAorCQkJIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCSBzaXplX3Qgc3ViYnVmX3NpemUsCisJCQkgc2l6ZV90IG5fc3ViYnVmcywKKwkJCSBzdHJ1Y3QgcmNoYW5fY2FsbGJhY2tzICpjYikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgcmNoYW4gKmNoYW47CisJY2hhciAqdG1wbmFtZTsKKworCWlmICghYmFzZV9maWxlbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShzdWJidWZfc2l6ZSAmJiBuX3N1YmJ1ZnMpKQorCQlyZXR1cm4gTlVMTDsKKworCWNoYW4gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcmNoYW4pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW4pCisJCXJldHVybiBOVUxMOworCisJY2hhbi0+dmVyc2lvbiA9IFJFTEFZRlNfQ0hBTk5FTF9WRVJTSU9OOworCWNoYW4tPm5fc3ViYnVmcyA9IG5fc3ViYnVmczsKKwljaGFuLT5zdWJidWZfc2l6ZSA9IHN1YmJ1Zl9zaXplOworCWNoYW4tPmFsbG9jX3NpemUgPSBGSVhfU0laRShzdWJidWZfc2l6ZSAqIG5fc3ViYnVmcyk7CisJc2V0dXBfY2FsbGJhY2tzKGNoYW4sIGNiKTsKKwlrcmVmX2luaXQoJmNoYW4tPmtyZWYpOworCisJdG1wbmFtZSA9IGttYWxsb2MoTkFNRV9NQVggKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRtcG5hbWUpCisJCWdvdG8gZnJlZV9jaGFuOworCisJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CisJCXNwcmludGYodG1wbmFtZSwgIiVzJWQiLCBiYXNlX2ZpbGVuYW1lLCBpKTsKKwkJY2hhbi0+YnVmW2ldID0gcmVsYXlfb3Blbl9idWYoY2hhbiwgdG1wbmFtZSwgcGFyZW50KTsKKwkJY2hhbi0+YnVmW2ldLT5jcHUgPSBpOworCQlpZiAoIWNoYW4tPmJ1ZltpXSkKKwkJCWdvdG8gZnJlZV9idWZzOworCX0KKworCWtmcmVlKHRtcG5hbWUpOworCXJldHVybiBjaGFuOworCitmcmVlX2J1ZnM6CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoIWNoYW4tPmJ1ZltpXSkKKwkJCWJyZWFrOworCQlyZWxheV9jbG9zZV9idWYoY2hhbi0+YnVmW2ldKTsKKwl9CisJa2ZyZWUodG1wbmFtZSk7CisKK2ZyZWVfY2hhbjoKKwlrcmVmX3B1dCgmY2hhbi0+a3JlZiwgcmVsYXlfZGVzdHJveV9jaGFubmVsKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKglyZWxheV9zd2l0Y2hfc3ViYnVmIC0gc3dpdGNoIHRvIGEgbmV3IHN1Yi1idWZmZXIKKyAqCUBidWY6IGNoYW5uZWwgYnVmZmVyCisgKglAbGVuZ3RoOiBzaXplIG9mIGN1cnJlbnQgZXZlbnQKKyAqCisgKglSZXR1cm5zIGVpdGhlciB0aGUgbGVuZ3RoIHBhc3NlZCBpbiBvciAwIGlmIGZ1bGwuCisKKyAqCVBlcmZvcm1zIHN1Yi1idWZmZXItc3dpdGNoIHRhc2tzIHN1Y2ggYXMgaW52b2tpbmcgY2FsbGJhY2tzLAorICoJdXBkYXRpbmcgcGFkZGluZyBjb3VudHMsIHdha2luZyB1cCByZWFkZXJzLCBldGMuCisgKi8KK3NpemVfdCByZWxheV9zd2l0Y2hfc3ViYnVmKHN0cnVjdCByY2hhbl9idWYgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkKK3sKKwl2b2lkICpvbGQsICpuZXc7CisJc2l6ZV90IG9sZF9zdWJidWYsIG5ld19zdWJidWY7CisKKwlpZiAodW5saWtlbHkobGVuZ3RoID4gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZSkpCisJCWdvdG8gdG9vYmlnOworCisJaWYgKGJ1Zi0+b2Zmc2V0ICE9IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemUgKyAxKSB7CisJCWJ1Zi0+cHJldl9wYWRkaW5nID0gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZSAtIGJ1Zi0+b2Zmc2V0OworCQlvbGRfc3ViYnVmID0gYnVmLT5zdWJidWZzX3Byb2R1Y2VkICUgYnVmLT5jaGFuLT5uX3N1YmJ1ZnM7CisJCWJ1Zi0+cGFkZGluZ1tvbGRfc3ViYnVmXSA9IGJ1Zi0+cHJldl9wYWRkaW5nOworCQlidWYtPnN1YmJ1ZnNfcHJvZHVjZWQrKzsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmJ1Zi0+cmVhZF93YWl0KSkgeworCQkJUFJFUEFSRV9XT1JLKCZidWYtPndha2VfcmVhZGVycywgd2FrZXVwX3JlYWRlcnMsIGJ1Zik7CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJ1Zi0+d2FrZV9yZWFkZXJzLCAxKTsKKwkJfQorCX0KKworCW9sZCA9IGJ1Zi0+ZGF0YTsKKwluZXdfc3ViYnVmID0gYnVmLT5zdWJidWZzX3Byb2R1Y2VkICUgYnVmLT5jaGFuLT5uX3N1YmJ1ZnM7CisJbmV3ID0gYnVmLT5zdGFydCArIG5ld19zdWJidWYgKiBidWYtPmNoYW4tPnN1YmJ1Zl9zaXplOworCWJ1Zi0+b2Zmc2V0ID0gMDsKKwlpZiAoIWJ1Zi0+Y2hhbi0+Y2ItPnN1YmJ1Zl9zdGFydChidWYsIG5ldywgb2xkLCBidWYtPnByZXZfcGFkZGluZykpIHsKKwkJYnVmLT5vZmZzZXQgPSBidWYtPmNoYW4tPnN1YmJ1Zl9zaXplICsgMTsKKwkJcmV0dXJuIDA7CisJfQorCWJ1Zi0+ZGF0YSA9IG5ldzsKKwlidWYtPnBhZGRpbmdbbmV3X3N1YmJ1Zl0gPSAwOworCisJaWYgKHVubGlrZWx5KGxlbmd0aCArIGJ1Zi0+b2Zmc2V0ID4gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZSkpCisJCWdvdG8gdG9vYmlnOworCisJcmV0dXJuIGxlbmd0aDsKKwordG9vYmlnOgorCXByaW50ayhLRVJOX1dBUk5JTkcgInJlbGF5ZnM6IGV2ZW50IHRvbyBsYXJnZSAoJVpkKVxuIiwgbGVuZ3RoKTsKKwlXQVJOX09OKDEpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXJlbGF5X3N1YmJ1ZnNfY29uc3VtZWQgLSB1cGRhdGUgdGhlIGJ1ZmZlcidzIHN1Yi1idWZmZXJzLWNvbnN1bWVkIGNvdW50CisgKglAY2hhbjogdGhlIGNoYW5uZWwKKyAqCUBjcHU6IHRoZSBjcHUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGFubmVsIGJ1ZmZlciB0byB1cGRhdGUKKyAqCUBzdWJidWZzX2NvbnN1bWVkOiBudW1iZXIgb2Ygc3ViLWJ1ZmZlcnMgdG8gYWRkIHRvIGN1cnJlbnQgYnVmJ3MgY291bnQKKyAqCisgKglBZGRzIHRvIHRoZSBjaGFubmVsIGJ1ZmZlcidzIGNvbnN1bWVkIHN1Yi1idWZmZXIgY291bnQuCisgKglzdWJidWZzX2NvbnN1bWVkIHNob3VsZCBiZSB0aGUgbnVtYmVyIG9mIHN1Yi1idWZmZXJzIG5ld2x5IGNvbnN1bWVkLAorICoJbm90IHRoZSB0b3RhbCBjb25zdW1lZC4KKyAqCisgKglOT1RFOiBrZXJuZWwgY2xpZW50cyBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBpZiB0aGUgY2hhbm5lbAorICoJbW9kZSBpcyAnb3ZlcndyaXRlJy4KKyAqLwordm9pZCByZWxheV9zdWJidWZzX2NvbnN1bWVkKHN0cnVjdCByY2hhbiAqY2hhbiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY3B1LAorCQkJICAgIHNpemVfdCBzdWJidWZzX2NvbnN1bWVkKQoreworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKKworCWlmICghY2hhbikKKwkJcmV0dXJuOworCisJaWYgKGNwdSA+PSBOUl9DUFVTIHx8ICFjaGFuLT5idWZbY3B1XSkKKwkJcmV0dXJuOworCisJYnVmID0gY2hhbi0+YnVmW2NwdV07CisJYnVmLT5zdWJidWZzX2NvbnN1bWVkICs9IHN1YmJ1ZnNfY29uc3VtZWQ7CisJaWYgKGJ1Zi0+c3ViYnVmc19jb25zdW1lZCA+IGJ1Zi0+c3ViYnVmc19wcm9kdWNlZCkKKwkJYnVmLT5zdWJidWZzX2NvbnN1bWVkID0gYnVmLT5zdWJidWZzX3Byb2R1Y2VkOworfQorCisvKioKKyAqCXJlbGF5X2Rlc3Ryb3lfY2hhbm5lbCAtIGZyZWUgdGhlIGNoYW5uZWwgc3RydWN0CisgKgorICoJU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20ga3JlZl9wdXQoKS4KKyAqLwordm9pZCByZWxheV9kZXN0cm95X2NoYW5uZWwoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHJjaGFuICpjaGFuID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCByY2hhbiwga3JlZik7CisJa2ZyZWUoY2hhbik7Cit9CisKKy8qKgorICoJcmVsYXlfY2xvc2UgLSBjbG9zZSB0aGUgY2hhbm5lbAorICoJQGNoYW46IHRoZSBjaGFubmVsCisgKgorICoJQ2xvc2VzIGFsbCBjaGFubmVsIGJ1ZmZlcnMgYW5kIGZyZWVzIHRoZSBjaGFubmVsLgorICovCit2b2lkIHJlbGF5X2Nsb3NlKHN0cnVjdCByY2hhbiAqY2hhbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghY2hhbikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoIWNoYW4tPmJ1ZltpXSkKKwkJCWNvbnRpbnVlOworCQlyZWxheV9jbG9zZV9idWYoY2hhbi0+YnVmW2ldKTsKKwl9CisKKwlrcmVmX3B1dCgmY2hhbi0+a3JlZiwgcmVsYXlfZGVzdHJveV9jaGFubmVsKTsKK30KKworLyoqCisgKglyZWxheV9mbHVzaCAtIGNsb3NlIHRoZSBjaGFubmVsCisgKglAY2hhbjogdGhlIGNoYW5uZWwKKyAqCisgKglGbHVzaGVzIGFsbCBjaGFubmVsIGJ1ZmZlcnMgaS5lLiBmb3JjZXMgYnVmZmVyIHN3aXRjaC4KKyAqLwordm9pZCByZWxheV9mbHVzaChzdHJ1Y3QgcmNoYW4gKmNoYW4pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIWNoYW4pCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYgKCFjaGFuLT5idWZbaV0pCisJCQljb250aW51ZTsKKwkJcmVsYXlfc3dpdGNoX3N1YmJ1ZihjaGFuLT5idWZbaV0sIDApOworCX0KK30KKworRVhQT1JUX1NZTUJPTF9HUEwocmVsYXlfb3Blbik7CitFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9jbG9zZSk7CitFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9mbHVzaCk7CitFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9yZXNldCk7CitFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9zdWJidWZzX2NvbnN1bWVkKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHJlbGF5X3N3aXRjaF9zdWJidWYpOworRVhQT1JUX1NZTUJPTF9HUEwocmVsYXlfYnVmX2Z1bGwpOwpkaWZmIC0tZ2l0IGEvZnMvcmVsYXlmcy9yZWxheS5oIGIvZnMvcmVsYXlmcy9yZWxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMzUwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWxheWZzL3JlbGF5LmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfUkVMQVlfSAorI2RlZmluZSBfUkVMQVlfSAorCitzdHJ1Y3QgZGVudHJ5ICpyZWxheWZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJCSAgIGludCBtb2RlLAorCQkJCSAgIHN0cnVjdCByY2hhbiAqY2hhbik7CitleHRlcm4gaW50IHJlbGF5ZnNfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitleHRlcm4gaW50IHJlbGF5X2J1Zl9lbXB0eShzdHJ1Y3QgcmNoYW5fYnVmICpidWYpOworZXh0ZXJuIHZvaWQgcmVsYXlfZGVzdHJveV9jaGFubmVsKHN0cnVjdCBrcmVmICprcmVmKTsKKworI2VuZGlmIC8qIF9SRUxBWV9IICovCmRpZmYgLS1naXQgYS9mcy9zZWxlY3QuYyBiL2ZzL3NlbGVjdC5jCmluZGV4IGI4MGU3ZWIuLmYxMGExMDMgMTAwNjQ0Ci0tLSBhL2ZzL3NlbGVjdC5jCisrKyBiL2ZzL3NlbGVjdC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4gLyogZm9yIFNUSUNLWV9USU1FT1VUUyAqLwogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC0xMzIsMTEgKzEzMywxMyBAQAogCXVuc2lnbmVkIGxvbmcgKm9wZW5fZmRzOwogCXVuc2lnbmVkIGxvbmcgc2V0OwogCWludCBtYXg7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAogCS8qIGhhbmRsZSBsYXN0IGluLWNvbXBsZXRlIGxvbmctd29yZCBmaXJzdCAqLwogCXNldCA9IH4ofjBVTCA8PCAobiAmIChfX05GREJJVFMtMSkpKTsKIAluIC89IF9fTkZEQklUUzsKLQlvcGVuX2ZkcyA9IGN1cnJlbnQtPmZpbGVzLT5vcGVuX2Zkcy0+ZmRzX2JpdHMrbjsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKTsKKwlvcGVuX2ZkcyA9IGZkdC0+b3Blbl9mZHMtPmZkc19iaXRzK247CiAJbWF4ID0gMDsKIAlpZiAoc2V0KSB7CiAJCXNldCAmPSBCSVRTKGZkcywgbik7CkBAIC0xODMsOSArMTg2LDkgQEAKIAlpbnQgcmV0dmFsLCBpOwogCWxvbmcgX190aW1lb3V0ID0gKnRpbWVvdXQ7CiAKLSAJc3Bpbl9sb2NrKCZjdXJyZW50LT5maWxlcy0+ZmlsZV9sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CiAJcmV0dmFsID0gbWF4X3NlbGVjdF9mZChuLCBmZHMpOwotCXNwaW5fdW5sb2NrKCZjdXJyZW50LT5maWxlcy0+ZmlsZV9sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChyZXR2YWwgPCAwKQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtMjk5LDYgKzMwMiw3IEBACiAJY2hhciAqYml0czsKIAlsb25nIHRpbWVvdXQ7CiAJaW50IHJldCwgc2l6ZSwgbWF4X2Zkc2V0OworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAJaWYgKHR2cCkgewpAQCAtMzI2LDcgKzMzMCwxMCBAQAogCQlnb3RvIG91dF9ub2ZkczsKIAogCS8qIG1heF9mZHNldCBjYW4gaW5jcmVhc2UsIHNvIGdyYWIgaXQgb25jZSB0byBhdm9pZCByYWNlICovCi0JbWF4X2Zkc2V0ID0gY3VycmVudC0+ZmlsZXMtPm1heF9mZHNldDsKKwlyY3VfcmVhZF9sb2NrKCk7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShjdXJyZW50LT5maWxlcyk7CisJbWF4X2Zkc2V0ID0gZmR0LT5tYXhfZmRzZXQ7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJaWYgKG4gPiBtYXhfZmRzZXQpCiAJCW4gPSBtYXhfZmRzZXQ7CiAKQEAgLTQ2NCw5ICs0NzEsMTUgQEAKICAJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IHBvbGxfbGlzdCAqaGVhZDsKICAJc3RydWN0IHBvbGxfbGlzdCAqd2FsazsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCWludCBtYXhfZmRzZXQ7CiAKIAkvKiBEbyBhIHNhbml0eSBjaGVjayBvbiBuZmRzIC4uLiAqLwotCWlmIChuZmRzID4gY3VycmVudC0+ZmlsZXMtPm1heF9mZHNldCAmJiBuZmRzID4gT1BFTl9NQVgpCisJcmN1X3JlYWRfbG9jaygpOworCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOworCW1heF9mZHNldCA9IGZkdC0+bWF4X2Zkc2V0OworCXJjdV9yZWFkX3VubG9jaygpOworCWlmIChuZmRzID4gbWF4X2Zkc2V0ICYmIG5mZHMgPiBPUEVOX01BWCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodGltZW91dCkgewpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvaW5vZGUuYyBiL2ZzL3NtYmZzL2lub2RlLmMKaW5kZXggNDc2NWFhYS4uMTBiOTk0NCAxMDA2NDQKLS0tIGEvZnMvc21iZnMvaW5vZGUuYworKysgYi9mcy9zbWJmcy9pbm9kZS5jCkBAIC0zMzEsNiArMzMxLDcgQEAKIHNtYl9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm8pCiB7CiAJREVCVUcxKCJpbm89JWxkXG4iLCBpbm8tPmlfaW5vKTsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vLT5pX2RhdGEsIDApOwogCWxvY2tfa2VybmVsKCk7CiAJaWYgKHNtYl9jbG9zZShpbm8pKQogCQlQQVJBTk9JQSgiY291bGQgbm90IGNsb3NlIGlub2RlICVsZFxuIiwgaW5vLT5pX2lubyk7CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9wcm9jLmMgYi9mcy9zbWJmcy9wcm9jLmMKaW5kZXggMjIwYmFiZS4uMzhhYjU1OCAxMDA2NDQKLS0tIGEvZnMvc21iZnMvcHJvYy5jCisrKyBiL2ZzL3NtYmZzL3Byb2MuYwpAQCAtMjM5Nyw4ICsyMzk3LDcgQEAKIAkJaWYgKHJlcS0+cnFfcmNscyA9PSBFUlJTUlYgJiYgcmVxLT5ycV9lcnIgPT0gRVJSZXJyb3IpIHsKIAkJCS8qIGEgZGFtbiBXaW45NSBidWcgLSBzb21ldGltZXMgaXQgY2xhZ3MgaWYgeW91IAogCQkJICAgYXNrIGl0IHRvbyBmYXN0ICovCi0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoSFovNSk7CisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygyMDApKTsKIAkJCWNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZnMvc3lzdi9pbm9kZS5jIGIvZnMvc3lzdi9pbm9kZS5jCmluZGV4IDA1MzAwNzcuLmZhMzNlY2UgMTAwNjQ0Ci0tLSBhL2ZzL3N5c3YvaW5vZGUuYworKysgYi9mcy9zeXN2L2lub2RlLmMKQEAgLTI5Miw2ICsyOTIsNyBAQAogCiBzdGF0aWMgdm9pZCBzeXN2X2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKIAlpbm9kZS0+aV9zaXplID0gMDsKIAlzeXN2X3RydW5jYXRlKGlub2RlKTsKIAlsb2NrX2tlcm5lbCgpOwpkaWZmIC0tZ2l0IGEvZnMvdWRmL2lub2RlLmMgYi9mcy91ZGYvaW5vZGUuYwppbmRleCAzZDY4ZGUzLi5iODM4OTBiIDEwMDY0NAotLS0gYS9mcy91ZGYvaW5vZGUuYworKysgYi9mcy91ZGYvaW5vZGUuYwpAQCAtODcsNiArODcsOCBAQAogICovCiB2b2lkIHVkZl9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCiB7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOworCiAJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCiAJCWdvdG8gbm9fZGVsZXRlOwogCmRpZmYgLS1naXQgYS9mcy91ZnMvYmFsbG9jLmMgYi9mcy91ZnMvYmFsbG9jLmMKaW5kZXggOTk3NjQwYy4uZmFmMTUxMiAxMDA2NDQKLS0tIGEvZnMvdWZzL2JhbGxvYy5jCisrKyBiL2ZzL3Vmcy9iYWxsb2MuYwpAQCAtMTE0LDggKzExNCw3IEBACiAJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7CiAJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKLQkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7Ci0JCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKIAkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CiAJfQogCXNiLT5zX2RpcnQgPSAxOwpAQCAtMjAwLDggKzE5OSw3IEBACiAJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7CiAJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKLQkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7Ci0JCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKIAkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CiAJfQogCkBAIC00NTksOCArNDU3LDcgQEAKIAl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKIAl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgewotCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKLQkJdWJoX2xsX3J3X2Jsb2NrIChXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOworCQl1YmhfbGxfcndfYmxvY2sgKFNXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOwogCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKIAl9CiAJc2ItPnNfZGlydCA9IDE7CkBAIC01ODUsOCArNTgyLDcgQEAKIAl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKIAl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgewotCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKLQkJdWJoX2xsX3J3X2Jsb2NrIChXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOworCQl1YmhfbGxfcndfYmxvY2sgKFNXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOwogCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKIAl9CiAJc2ItPnNfZGlydCA9IDE7CmRpZmYgLS1naXQgYS9mcy91ZnMvaWFsbG9jLmMgYi9mcy91ZnMvaWFsbG9jLmMKaW5kZXggNjFhNmIxNS4uMDkzODk0NSAxMDA2NDQKLS0tIGEvZnMvdWZzL2lhbGxvYy5jCisrKyBiL2ZzL3Vmcy9pYWxsb2MuYwpAQCAtMTI0LDggKzEyNCw3IEBACiAJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7CiAJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKLQkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7Ci0JCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSAmdWNwaSk7CisJCXViaF9sbF9yd19ibG9jayAoU1dSSVRFLCAxLCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKikgJnVjcGkpOwogCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKIAl9CiAJCkBAIC0yNDksOCArMjQ4LDcgQEAKIAl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKIAl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgewotCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKLQkJdWJoX2xsX3J3X2Jsb2NrIChXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopICZ1Y3BpKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSAmdWNwaSk7CiAJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOwogCX0KIAlzYi0+c19kaXJ0ID0gMTsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9pbm9kZS5jIGIvZnMvdWZzL2lub2RlLmMKaW5kZXggNzE4NjI3Yy4uNTVmNGFhMSAxMDA2NDQKLS0tIGEvZnMvdWZzL2lub2RlLmMKKysrIGIvZnMvdWZzL2lub2RlLmMKQEAgLTgwNCw2ICs4MDQsNyBAQAogCiB2b2lkIHVmc19kZWxldGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQogeworCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKIAkvKlVGU19JKGlub2RlKS0+aV9kdGltZSA9IENVUlJFTlRfVElNRTsqLwogCWxvY2tfa2VybmVsKCk7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy91ZnMvdHJ1bmNhdGUuYyBiL2ZzL3Vmcy90cnVuY2F0ZS5jCmluZGV4IGUzMTJiZjguLjYxZDJlMzUgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy90cnVuY2F0ZS5jCisrKyBiL2ZzL3Vmcy90cnVuY2F0ZS5jCkBAIC0yODUsOCArMjg1LDcgQEAKIAkJfQogCX0KIAlpZiAoSVNfU1lOQyhpbm9kZSkgJiYgaW5kX3ViaCAmJiB1YmhfYnVmZmVyX2RpcnR5KGluZF91YmgpKSB7Ci0JCXViaF93YWl0X29uX2J1ZmZlciAoaW5kX3ViaCk7Ci0JCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsICZpbmRfdWJoKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsICZpbmRfdWJoKTsKIAkJdWJoX3dhaXRfb25fYnVmZmVyIChpbmRfdWJoKTsKIAl9CiAJdWJoX2JyZWxzZSAoaW5kX3ViaCk7CkBAIC0zNTMsOCArMzUyLDcgQEAKIAkJfQogCX0KIAlpZiAoSVNfU1lOQyhpbm9kZSkgJiYgZGluZF9iaCAmJiB1YmhfYnVmZmVyX2RpcnR5KGRpbmRfYmgpKSB7Ci0JCXViaF93YWl0X29uX2J1ZmZlciAoZGluZF9iaCk7Ci0JCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsICZkaW5kX2JoKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsICZkaW5kX2JoKTsKIAkJdWJoX3dhaXRfb25fYnVmZmVyIChkaW5kX2JoKTsKIAl9CiAJdWJoX2JyZWxzZSAoZGluZF9iaCk7CkBAIC00MTgsOCArNDE2LDcgQEAKIAkJfQogCX0KIAlpZiAoSVNfU1lOQyhpbm9kZSkgJiYgdGluZF9iaCAmJiB1YmhfYnVmZmVyX2RpcnR5KHRpbmRfYmgpKSB7Ci0JCXViaF93YWl0X29uX2J1ZmZlciAodGluZF9iaCk7Ci0JCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsICZ0aW5kX2JoKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsICZ0aW5kX2JoKTsKIAkJdWJoX3dhaXRfb25fYnVmZmVyICh0aW5kX2JoKTsKIAl9CiAJdWJoX2JyZWxzZSAodGluZF9iaCk7CmRpZmYgLS1naXQgYS9mcy91bXNkb3Mvbm90ZXMgYi9mcy91bXNkb3Mvbm90ZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDdkMWYuLjAwMDAwMDAKLS0tIGEvZnMvdW1zZG9zL25vdGVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotVGhpcyBmaWxlIGNvbnRhaW4gaWRlYSBhbmQgdGhpbmdzIEkgZG9uJ3Qgd2FudCB0byBmb3JnZXQKLQotUG9zc2libGUgYnVnIGluIGZzL3JlYWRfd3JpdGUuYwotRnVuY3Rpb24gc3lzX3JlYWRkaXIoKQotCi0JVGhlcmUgaXMgYSBjYWxsIHRoZSB2ZXJpZnlfYXJlYSB0aGF0IGRvZXMgbm90IHRha2UgaW4gYWNjb3VudAotCXRoZSBjb3VudCBwYXJhbWV0ZXIuIEkgZ3Vlc3MgaXQgc2hvdWxkIHJlYWQKLQotCWVycm9yID0gdmVyaWZ5X2FyZWEoVkVSSUZZX1dSSVRFLCBkaXJlbnQsIGNvdW50KnNpemVvZiAoKmRpcmVudCkpOwotCi0JaW5zdGVhZCBvZgotCi0JZXJyb3IgPSB2ZXJpZnlfYXJlYShWRVJJRllfV1JJVEUsIGRpcmVudCwgc2l6ZW9mICgqZGlyZW50KSk7Ci0KLQlPZiBjb3Vyc2UsIG5vdyAsIGNvdW50IGlzIGFsd2F5cyAxCi0KLQpkaWZmIC0tZ2l0IGEvZnMveGF0dHIuYyBiL2ZzL3hhdHRyLmMKaW5kZXggNmFjZDVjNi4uM2Y5YzY0YiAxMDA2NDQKLS0tIGEvZnMveGF0dHIuYworKysgYi9mcy94YXR0ci5jCkBAIC01MSwyMCArNTEsMjkgQEAKIAkJfQogCX0KIAorCWRvd24oJmQtPmRfaW5vZGUtPmlfc2VtKTsKKwllcnJvciA9IHNlY3VyaXR5X2lub2RlX3NldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsIHNpemUsIGZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OwogCWVycm9yID0gLUVPUE5PVFNVUFA7CiAJaWYgKGQtPmRfaW5vZGUtPmlfb3AgJiYgZC0+ZF9pbm9kZS0+aV9vcC0+c2V0eGF0dHIpIHsKLQkJZG93bigmZC0+ZF9pbm9kZS0+aV9zZW0pOwotCQllcnJvciA9IHNlY3VyaXR5X2lub2RlX3NldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsIHNpemUsIGZsYWdzKTsKLQkJaWYgKGVycm9yKQotCQkJZ290byBvdXQ7Ci0JCWVycm9yID0gZC0+ZF9pbm9kZS0+aV9vcC0+c2V0eGF0dHIoZCwga25hbWUsIGt2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworCQllcnJvciA9IGQtPmRfaW5vZGUtPmlfb3AtPnNldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsCisJCQkJCQkgICBzaXplLCBmbGFncyk7CiAJCWlmICghZXJyb3IpIHsKIAkJCWZzbm90aWZ5X3hhdHRyKGQpOwotCQkJc2VjdXJpdHlfaW5vZGVfcG9zdF9zZXR4YXR0cihkLCBrbmFtZSwga3ZhbHVlLCBzaXplLCBmbGFncyk7CisJCQlzZWN1cml0eV9pbm9kZV9wb3N0X3NldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsCisJCQkJCQkgICAgIHNpemUsIGZsYWdzKTsKIAkJfQotb3V0OgotCQl1cCgmZC0+ZF9pbm9kZS0+aV9zZW0pOworCX0gZWxzZSBpZiAoIXN0cm5jbXAoa25hbWUsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwKKwkJCSAgICBzaXplb2YgWEFUVFJfU0VDVVJJVFlfUFJFRklYIC0gMSkpIHsKKwkJY29uc3QgY2hhciAqc3VmZml4ID0ga25hbWUgKyBzaXplb2YgWEFUVFJfU0VDVVJJVFlfUFJFRklYIC0gMTsKKwkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9zZXRzZWN1cml0eShkLT5kX2lub2RlLCBzdWZmaXgsIGt2YWx1ZSwKKwkJCQkJCSAgIHNpemUsIGZsYWdzKTsKKwkJaWYgKCFlcnJvcikKKwkJCWZzbm90aWZ5X3hhdHRyKGQpOwogCX0KK291dDoKKwl1cCgmZC0+ZF9pbm9kZS0+aV9zZW0pOwogCWlmIChrdmFsdWUpCiAJCWtmcmVlKGt2YWx1ZSk7CiAJcmV0dXJuIGVycm9yOwpAQCAtMTM5LDIwICsxNDgsMjUgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfZ2V0eGF0dHIoZCwga25hbWUpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CiAJZXJyb3IgPSAtRU9QTk9UU1VQUDsKLQlpZiAoZC0+ZF9pbm9kZS0+aV9vcCAmJiBkLT5kX2lub2RlLT5pX29wLT5nZXR4YXR0cikgewotCQllcnJvciA9IHNlY3VyaXR5X2lub2RlX2dldHhhdHRyKGQsIGtuYW1lKTsKLQkJaWYgKGVycm9yKQotCQkJZ290byBvdXQ7CisJaWYgKGQtPmRfaW5vZGUtPmlfb3AgJiYgZC0+ZF9pbm9kZS0+aV9vcC0+Z2V0eGF0dHIpCiAJCWVycm9yID0gZC0+ZF9pbm9kZS0+aV9vcC0+Z2V0eGF0dHIoZCwga25hbWUsIGt2YWx1ZSwgc2l6ZSk7Ci0JCWlmIChlcnJvciA+IDApIHsKLQkJCWlmIChzaXplICYmIGNvcHlfdG9fdXNlcih2YWx1ZSwga3ZhbHVlLCBlcnJvcikpCi0JCQkJZXJyb3IgPSAtRUZBVUxUOwotCQl9IGVsc2UgaWYgKGVycm9yID09IC1FUkFOR0UgJiYgc2l6ZSA+PSBYQVRUUl9TSVpFX01BWCkgewotCQkJLyogVGhlIGZpbGUgc3lzdGVtIHRyaWVkIHRvIHJldHVybmVkIGEgdmFsdWUgYmlnZ2VyCi0JCQkgICB0aGFuIFhBVFRSX1NJWkVfTUFYIGJ5dGVzLiBOb3QgcG9zc2libGUuICovCi0JCQllcnJvciA9IC1FMkJJRzsKLQkJfQorCWVsc2UgaWYgKCFzdHJuY21wKGtuYW1lLCBYQVRUUl9TRUNVUklUWV9QUkVGSVgsCisJCQkgIHNpemVvZiBYQVRUUl9TRUNVUklUWV9QUkVGSVggLSAxKSkgeworCQljb25zdCBjaGFyICpzdWZmaXggPSBrbmFtZSArIHNpemVvZiBYQVRUUl9TRUNVUklUWV9QUkVGSVggLSAxOworCQllcnJvciA9IHNlY3VyaXR5X2lub2RlX2dldHNlY3VyaXR5KGQtPmRfaW5vZGUsIHN1ZmZpeCwga3ZhbHVlLAorCQkJCQkJICAgc2l6ZSk7CisJfQorCWlmIChlcnJvciA+IDApIHsKKwkJaWYgKHNpemUgJiYgY29weV90b191c2VyKHZhbHVlLCBrdmFsdWUsIGVycm9yKSkKKwkJCWVycm9yID0gLUVGQVVMVDsKKwl9IGVsc2UgaWYgKGVycm9yID09IC1FUkFOR0UgJiYgc2l6ZSA+PSBYQVRUUl9TSVpFX01BWCkgeworCQkvKiBUaGUgZmlsZSBzeXN0ZW0gdHJpZWQgdG8gcmV0dXJuZWQgYSB2YWx1ZSBiaWdnZXIKKwkJICAgdGhhbiBYQVRUUl9TSVpFX01BWCBieXRlcy4gTm90IHBvc3NpYmxlLiAqLworCQllcnJvciA9IC1FMkJJRzsKIAl9CiBvdXQ6CiAJaWYgKGt2YWx1ZSkKQEAgLTIyMSwyMCArMjM1LDI0IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwllcnJvciA9IHNlY3VyaXR5X2lub2RlX2xpc3R4YXR0cihkKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OwogCWVycm9yID0gLUVPUE5PVFNVUFA7CiAJaWYgKGQtPmRfaW5vZGUtPmlfb3AgJiYgZC0+ZF9pbm9kZS0+aV9vcC0+bGlzdHhhdHRyKSB7Ci0JCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfbGlzdHhhdHRyKGQpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dDsKIAkJZXJyb3IgPSBkLT5kX2lub2RlLT5pX29wLT5saXN0eGF0dHIoZCwga2xpc3QsIHNpemUpOwotCQlpZiAoZXJyb3IgPiAwKSB7Ci0JCQlpZiAoc2l6ZSAmJiBjb3B5X3RvX3VzZXIobGlzdCwga2xpc3QsIGVycm9yKSkKLQkJCQllcnJvciA9IC1FRkFVTFQ7Ci0JCX0gZWxzZSBpZiAoZXJyb3IgPT0gLUVSQU5HRSAmJiBzaXplID49IFhBVFRSX0xJU1RfTUFYKSB7Ci0JCQkvKiBUaGUgZmlsZSBzeXN0ZW0gdHJpZWQgdG8gcmV0dXJuZWQgYSBsaXN0IGJpZ2dlcgotCQkJICAgdGhhbiBYQVRUUl9MSVNUX01BWCBieXRlcy4gTm90IHBvc3NpYmxlLiAqLwotCQkJZXJyb3IgPSAtRTJCSUc7Ci0JCX0KKwl9IGVsc2UgeworCQllcnJvciA9IHNlY3VyaXR5X2lub2RlX2xpc3RzZWN1cml0eShkLT5kX2lub2RlLCBrbGlzdCwgc2l6ZSk7CisJCWlmIChzaXplICYmIGVycm9yID49IHNpemUpCisJCQllcnJvciA9IC1FUkFOR0U7CisJfQorCWlmIChlcnJvciA+IDApIHsKKwkJaWYgKHNpemUgJiYgY29weV90b191c2VyKGxpc3QsIGtsaXN0LCBlcnJvcikpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJfSBlbHNlIGlmIChlcnJvciA9PSAtRVJBTkdFICYmIHNpemUgPj0gWEFUVFJfTElTVF9NQVgpIHsKKwkJLyogVGhlIGZpbGUgc3lzdGVtIHRyaWVkIHRvIHJldHVybmVkIGEgbGlzdCBiaWdnZXIKKwkJICAgdGhhbiBYQVRUUl9MSVNUX01BWCBieXRlcy4gTm90IHBvc3NpYmxlLiAqLworCQllcnJvciA9IC1FMkJJRzsKIAl9CiBvdXQ6CiAJaWYgKGtsaXN0KQpAQCAtMzA3LDYgKzMyNSw4IEBACiAJCWRvd24oJmQtPmRfaW5vZGUtPmlfc2VtKTsKIAkJZXJyb3IgPSBkLT5kX2lub2RlLT5pX29wLT5yZW1vdmV4YXR0cihkLCBrbmFtZSk7CiAJCXVwKCZkLT5kX2lub2RlLT5pX3NlbSk7CisJCWlmICghZXJyb3IpCisJCQlmc25vdGlmeV94YXR0cihkKTsKIAl9CiBvdXQ6CiAJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvZnMveGZzL0tjb25maWcgYi9mcy94ZnMvS2NvbmZpZwppbmRleCBjOTIzMDZmLi44ZThmMzJkIDEwMDY0NAotLS0gYS9mcy94ZnMvS2NvbmZpZworKysgYi9mcy94ZnMvS2NvbmZpZwpAQCAtMSw1ICsxLDMgQEAKLW1lbnUgIlhGUyBzdXBwb3J0IgotCiBjb25maWcgWEZTX0ZTCiAJdHJpc3RhdGUgIlhGUyBmaWxlc3lzdGVtIHN1cHBvcnQiCiAJc2VsZWN0IEVYUE9SVEZTIGlmIE5GU0QhPW4KQEAgLTIyLDI3ICsyMCwxMSBAQAogCiBjb25maWcgWEZTX0VYUE9SVAogCWJvb2wKLQlkZWZhdWx0IHkgaWYgWEZTX0ZTICYmIEVYUE9SVEZTCi0KLWNvbmZpZyBYRlNfUlQKLQlib29sICJSZWFsdGltZSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gWEZTX0ZTICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGJlIGFibGUgdG8gbW91bnQgYW5kIHVzZSBYRlMgZmlsZXN5c3RlbXMKLQkgIHdoaWNoIGNvbnRhaW4gYSByZWFsdGltZSBzdWJ2b2x1bWUuIFRoZSByZWFsdGltZSBzdWJ2b2x1bWUgaXMgYQotCSAgc2VwYXJhdGUgYXJlYSBvZiBkaXNrIHNwYWNlIHdoZXJlIG9ubHkgZmlsZSBkYXRhIGlzIHN0b3JlZC4gVGhlCi0JICByZWFsdGltZSBzdWJ2b2x1bWUgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSB2ZXJ5IGRldGVybWluaXN0aWMKLQkgIGRhdGEgcmF0ZXMgc3VpdGFibGUgZm9yIG1lZGlhIHN0cmVhbWluZyBhcHBsaWNhdGlvbnMuCi0KLQkgIFNlZSB0aGUgeGZzIG1hbiBwYWdlIGluIHNlY3Rpb24gNSBmb3IgYSBiaXQgbW9yZSBpbmZvcm1hdGlvbi4KLQotCSAgVGhpcyBmZWF0dXJlIGlzIHVuc3VwcG9ydGVkIGF0IHRoaXMgdGltZSwgaXMgbm90IHlldCBmdWxseQotCSAgZnVuY3Rpb25hbCwgYW5kIG1heSBjYXVzZSBzZXJpb3VzIHByb2JsZW1zLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgorCWRlcGVuZHMgb24gWEZTX0ZTICYmIEVYUE9SVEZTCisJZGVmYXVsdCB5CiAKIGNvbmZpZyBYRlNfUVVPVEEKLQlib29sICJRdW90YSBzdXBwb3J0IgorCXRyaXN0YXRlICJYRlMgUXVvdGEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFhGU19GUwogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNldCBsaW1pdHMgZm9yIGRpc2sgdXNhZ2Ugb24KQEAgLTU5LDcgKzQxLDcgQEAKIAkgIHRoZXkgYXJlIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgc3Vic3lzdGVtcy4KIAogY29uZmlnIFhGU19TRUNVUklUWQotCWJvb2wgIlNlY3VyaXR5IExhYmVsIHN1cHBvcnQiCisJYm9vbCAiWEZTIFNlY3VyaXR5IExhYmVsIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBYRlNfRlMKIAloZWxwCiAJICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKQEAgLTcxLDcgKzUzLDcgQEAKIAkgIGV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIGlub2RlIHNlY3VyaXR5IGxhYmVscywgc2F5IE4uCiAKIGNvbmZpZyBYRlNfUE9TSVhfQUNMCi0JYm9vbCAiUE9TSVggQUNMIHN1cHBvcnQiCisJYm9vbCAiWEZTIFBPU0lYIEFDTCBzdXBwb3J0IgogCWRlcGVuZHMgb24gWEZTX0ZTCiAJaGVscAogCSAgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMgKEFDTHMpIHN1cHBvcnQgcGVybWlzc2lvbnMgZm9yIHVzZXJzIGFuZApAQCAtODIsNCArNjQsMTkgQEAKIAogCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCBBY2Nlc3MgQ29udHJvbCBMaXN0cyBhcmUsIHNheSBOLgogCi1lbmRtZW51Citjb25maWcgWEZTX1JUCisJYm9vbCAiWEZTIFJlYWx0aW1lIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBYRlNfRlMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgYmUgYWJsZSB0byBtb3VudCBhbmQgdXNlIFhGUyBmaWxlc3lzdGVtcworCSAgd2hpY2ggY29udGFpbiBhIHJlYWx0aW1lIHN1YnZvbHVtZS4gVGhlIHJlYWx0aW1lIHN1YnZvbHVtZSBpcyBhCisJICBzZXBhcmF0ZSBhcmVhIG9mIGRpc2sgc3BhY2Ugd2hlcmUgb25seSBmaWxlIGRhdGEgaXMgc3RvcmVkLiBUaGUKKwkgIHJlYWx0aW1lIHN1YnZvbHVtZSBpcyBkZXNpZ25lZCB0byBwcm92aWRlIHZlcnkgZGV0ZXJtaW5pc3RpYworCSAgZGF0YSByYXRlcyBzdWl0YWJsZSBmb3IgbWVkaWEgc3RyZWFtaW5nIGFwcGxpY2F0aW9ucy4KKworCSAgU2VlIHRoZSB4ZnMgbWFuIHBhZ2UgaW4gc2VjdGlvbiA1IGZvciBhIGJpdCBtb3JlIGluZm9ybWF0aW9uLgorCisJICBUaGlzIGZlYXR1cmUgaXMgdW5zdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLCBpcyBub3QgeWV0IGZ1bGx5CisJICBmdW5jdGlvbmFsLCBhbmQgbWF5IGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9mcy94ZnMvTWFrZWZpbGUgYi9mcy94ZnMvTWFrZWZpbGUKaW5kZXggZDNmZjc4My4uNDllM2U3ZSAxMDA2NDQKLS0tIGEvZnMveGZzL01ha2VmaWxlCisrKyBiL2ZzL3hmcy9NYWtlZmlsZQpAQCAtMSwxNTAgKzEgQEAKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotIwotIyBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSMgZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0jIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSMgb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotIyBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0jIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotIyBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0jIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0jCi0jIGh0dHA6Ly93d3cuc2dpLmNvbQotIwotIyBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSMKLSMgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLwotIwotCi1FWFRSQV9DRkxBR1MgKz0JIC1JZnMveGZzIC1JZnMveGZzL2xpbnV4LTIuNiAtZnVuc2lnbmVkLWNoYXIKLQotaWZlcSAoJChDT05GSUdfWEZTX0RFQlVHKSx5KQotCUVYVFJBX0NGTEFHUyArPSAtZyAtRFNUQVRJQz0iIiAtRERFQlVHCi0JRVhUUkFfQ0ZMQUdTICs9IC1EUEFHRUJVRl9MT0NLX1RSQUNLSU5HCi1lbmRpZgotaWZlcSAoJChDT05GSUdfWEZTX1RSQUNFKSx5KQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19BTExPQ19UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19BVFRSX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0JMSV9UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19CTUFQX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0JNQlRfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfRElSX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0RJUjJfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfRFFVT1RfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfSUxPQ0tfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfTE9HX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX1JXX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EUEFHRUJVRl9UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19WTk9ERV9UUkFDRQotZW5kaWYKLQotb2JqLSQoQ09ORklHX1hGU19GUykJCSs9IHhmcy5vCi0KLXhmcy0kKENPTkZJR19YRlNfUVVPVEEpCQkrPSAkKGFkZHByZWZpeCBxdW90YS8sIFwKLQkJCQkgICB4ZnNfZHF1b3QubyBcCi0JCQkJICAgeGZzX2RxdW90X2l0ZW0ubyBcCi0JCQkJICAgeGZzX3RyYW5zX2RxdW90Lm8gXAotCQkJCSAgIHhmc19xbV9zeXNjYWxscy5vIFwKLQkJCQkgICB4ZnNfcW1fYmh2Lm8gXAotCQkJCSAgIHhmc19xbS5vKQotaWZlcSAoJChDT05GSUdfWEZTX1FVT1RBKSx5KQoteGZzLSQoQ09ORklHX1BST0NfRlMpCQkrPSBxdW90YS94ZnNfcW1fc3RhdHMubwotZW5kaWYKLQoteGZzLSQoQ09ORklHX1hGU19SVCkJCSs9IHhmc19ydGFsbG9jLm8KLXhmcy0kKENPTkZJR19YRlNfUE9TSVhfQUNMKQkrPSB4ZnNfYWNsLm8KLXhmcy0kKENPTkZJR19QUk9DX0ZTKQkJKz0gbGludXgtMi42L3hmc19zdGF0cy5vCi14ZnMtJChDT05GSUdfU1lTQ1RMKQkJKz0gbGludXgtMi42L3hmc19zeXNjdGwubwoteGZzLSQoQ09ORklHX0NPTVBBVCkJCSs9IGxpbnV4LTIuNi94ZnNfaW9jdGwzMi5vCi14ZnMtJChDT05GSUdfWEZTX0VYUE9SVCkJKz0gbGludXgtMi42L3hmc19leHBvcnQubwotCi0KLXhmcy15CQkJCSs9IHhmc19hbGxvYy5vIFwKLQkJCQkgICB4ZnNfYWxsb2NfYnRyZWUubyBcCi0JCQkJICAgeGZzX2F0dHIubyBcCi0JCQkJICAgeGZzX2F0dHJfbGVhZi5vIFwKLQkJCQkgICB4ZnNfYmVoYXZpb3IubyBcCi0JCQkJICAgeGZzX2JpdC5vIFwKLQkJCQkgICB4ZnNfYm1hcC5vIFwKLQkJCQkgICB4ZnNfYm1hcF9idHJlZS5vIFwKLQkJCQkgICB4ZnNfYnRyZWUubyBcCi0JCQkJICAgeGZzX2J1Zl9pdGVtLm8gXAotCQkJCSAgIHhmc19kYV9idHJlZS5vIFwKLQkJCQkgICB4ZnNfZGlyLm8gXAotCQkJCSAgIHhmc19kaXIyLm8gXAotCQkJCSAgIHhmc19kaXIyX2Jsb2NrLm8gXAotCQkJCSAgIHhmc19kaXIyX2RhdGEubyBcCi0JCQkJICAgeGZzX2RpcjJfbGVhZi5vIFwKLQkJCQkgICB4ZnNfZGlyMl9ub2RlLm8gXAotCQkJCSAgIHhmc19kaXIyX3NmLm8gXAotCQkJCSAgIHhmc19kaXJfbGVhZi5vIFwKLQkJCQkgICB4ZnNfZXJyb3IubyBcCi0JCQkJICAgeGZzX2V4dGZyZWVfaXRlbS5vIFwKLQkJCQkgICB4ZnNfZnNvcHMubyBcCi0JCQkJICAgeGZzX2lhbGxvYy5vIFwKLQkJCQkgICB4ZnNfaWFsbG9jX2J0cmVlLm8gXAotCQkJCSAgIHhmc19pZ2V0Lm8gXAotCQkJCSAgIHhmc19pbm9kZS5vIFwKLQkJCQkgICB4ZnNfaW5vZGVfaXRlbS5vIFwKLQkJCQkgICB4ZnNfaW9jb3JlLm8gXAotCQkJCSAgIHhmc19pb21hcC5vIFwKLQkJCQkgICB4ZnNfaXRhYmxlLm8gXAotCQkJCSAgIHhmc19kZnJhZy5vIFwKLQkJCQkgICB4ZnNfbG9nLm8gXAotCQkJCSAgIHhmc19sb2dfcmVjb3Zlci5vIFwKLQkJCQkgICB4ZnNfbWFjcm9zLm8gXAotCQkJCSAgIHhmc19tb3VudC5vIFwKLQkJCQkgICB4ZnNfcmVuYW1lLm8gXAotCQkJCSAgIHhmc190cmFucy5vIFwKLQkJCQkgICB4ZnNfdHJhbnNfYWlsLm8gXAotCQkJCSAgIHhmc190cmFuc19idWYubyBcCi0JCQkJICAgeGZzX3RyYW5zX2V4dGZyZWUubyBcCi0JCQkJICAgeGZzX3RyYW5zX2lub2RlLm8gXAotCQkJCSAgIHhmc190cmFuc19pdGVtLm8gXAotCQkJCSAgIHhmc191dGlscy5vIFwKLQkJCQkgICB4ZnNfdmZzb3BzLm8gXAotCQkJCSAgIHhmc192bm9kZW9wcy5vIFwKLQkJCQkgICB4ZnNfcncubyBcCi0JCQkJICAgeGZzX2Rtb3BzLm8gXAotCQkJCSAgIHhmc19xbW9wcy5vCi0KLXhmcy0kKENPTkZJR19YRlNfVFJBQ0UpCQkrPSB4ZnNfZGlyMl90cmFjZS5vCi0KLSMgT2JqZWN0cyBpbiBsaW51eC0yLjYvCi14ZnMteQkJCQkrPSAkKGFkZHByZWZpeCBsaW51eC0yLjYvLCBcCi0JCQkJICAga21lbS5vIFwKLQkJCQkgICB4ZnNfYW9wcy5vIFwKLQkJCQkgICB4ZnNfYnVmLm8gXAotCQkJCSAgIHhmc19maWxlLm8gXAotCQkJCSAgIHhmc19mc19zdWJyLm8gXAotCQkJCSAgIHhmc19nbG9iYWxzLm8gXAotCQkJCSAgIHhmc19pb2N0bC5vIFwKLQkJCQkgICB4ZnNfaW9wcy5vIFwKLQkJCQkgICB4ZnNfbHJ3Lm8gXAotCQkJCSAgIHhmc19zdXBlci5vIFwKLQkJCQkgICB4ZnNfdmZzLm8gXAotCQkJCSAgIHhmc192bm9kZS5vKQotCi0jIE9iamVjdHMgaW4gc3VwcG9ydC8KLXhmcy15CQkJCSs9ICQoYWRkcHJlZml4IHN1cHBvcnQvLCBcCi0JCQkJICAgZGVidWcubyBcCi0JCQkJICAgbW92ZS5vIFwKLQkJCQkgICBxc29ydC5vIFwKLQkJCQkgICB1dWlkLm8pCi0KLXhmcy0kKENPTkZJR19YRlNfVFJBQ0UpCQkrPSBzdXBwb3J0L2t0cmFjZS5vCi0KK2luY2x1ZGUgJChUT1BESVIpL2ZzL3hmcy9NYWtlZmlsZS1saW51eC0kKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkKZGlmZiAtLWdpdCBhL2ZzL3hmcy9NYWtlZmlsZS1saW51eC0yLjYgYi9mcy94ZnMvTWFrZWZpbGUtbGludXgtMi42Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Yzg3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvTWFrZWZpbGUtbGludXgtMi42CkBAIC0wLDAgKzEsMTUyIEBACisjCisjIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyMKKyMgRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisjIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorIyBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisjIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyMgYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorIyBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyMgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorIyBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorIworIyBodHRwOi8vd3d3LnNnaS5jb20KKyMKKyMgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisjCisjIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyMKKworRVhUUkFfQ0ZMQUdTICs9CSAtSWZzL3hmcyAtSWZzL3hmcy9saW51eC0yLjYgLWZ1bnNpZ25lZC1jaGFyCisKK1hGU19MSU5VWCA6PSBsaW51eC0yLjYKKworaWZlcSAoJChDT05GSUdfWEZTX0RFQlVHKSx5KQorCUVYVFJBX0NGTEFHUyArPSAtZyAtRFNUQVRJQz0iIiAtRERFQlVHCisJRVhUUkFfQ0ZMQUdTICs9IC1EUEFHRUJVRl9MT0NLX1RSQUNLSU5HCitlbmRpZgoraWZlcSAoJChDT05GSUdfWEZTX1RSQUNFKSx5KQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19BTExPQ19UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19BVFRSX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0JMSV9UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19CTUFQX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0JNQlRfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfRElSX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0RJUjJfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfRFFVT1RfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfSUxPQ0tfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfTE9HX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX1JXX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EUEFHRUJVRl9UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19WTk9ERV9UUkFDRQorZW5kaWYKKworb2JqLSQoQ09ORklHX1hGU19GUykJCSs9IHhmcy5vCisKK3hmcy0kKENPTkZJR19YRlNfUVVPVEEpCQkrPSAkKGFkZHByZWZpeCBxdW90YS8sIFwKKwkJCQkgICB4ZnNfZHF1b3QubyBcCisJCQkJICAgeGZzX2RxdW90X2l0ZW0ubyBcCisJCQkJICAgeGZzX3RyYW5zX2RxdW90Lm8gXAorCQkJCSAgIHhmc19xbV9zeXNjYWxscy5vIFwKKwkJCQkgICB4ZnNfcW1fYmh2Lm8gXAorCQkJCSAgIHhmc19xbS5vKQorCitpZmVxICgkKENPTkZJR19YRlNfUVVPVEEpLHkpCit4ZnMtJChDT05GSUdfUFJPQ19GUykJCSs9IHF1b3RhL3hmc19xbV9zdGF0cy5vCitlbmRpZgorCit4ZnMtJChDT05GSUdfWEZTX1JUKQkJKz0geGZzX3J0YWxsb2MubworeGZzLSQoQ09ORklHX1hGU19QT1NJWF9BQ0wpCSs9IHhmc19hY2wubworeGZzLSQoQ09ORklHX1BST0NfRlMpCQkrPSAkKFhGU19MSU5VWCkveGZzX3N0YXRzLm8KK3hmcy0kKENPTkZJR19TWVNDVEwpCQkrPSAkKFhGU19MSU5VWCkveGZzX3N5c2N0bC5vCit4ZnMtJChDT05GSUdfQ09NUEFUKQkJKz0gJChYRlNfTElOVVgpL3hmc19pb2N0bDMyLm8KK3hmcy0kKENPTkZJR19YRlNfRVhQT1JUKQkrPSAkKFhGU19MSU5VWCkveGZzX2V4cG9ydC5vCisKKworeGZzLXkJCQkJKz0geGZzX2FsbG9jLm8gXAorCQkJCSAgIHhmc19hbGxvY19idHJlZS5vIFwKKwkJCQkgICB4ZnNfYXR0ci5vIFwKKwkJCQkgICB4ZnNfYXR0cl9sZWFmLm8gXAorCQkJCSAgIHhmc19iZWhhdmlvci5vIFwKKwkJCQkgICB4ZnNfYml0Lm8gXAorCQkJCSAgIHhmc19ibWFwLm8gXAorCQkJCSAgIHhmc19ibWFwX2J0cmVlLm8gXAorCQkJCSAgIHhmc19idHJlZS5vIFwKKwkJCQkgICB4ZnNfYnVmX2l0ZW0ubyBcCisJCQkJICAgeGZzX2RhX2J0cmVlLm8gXAorCQkJCSAgIHhmc19kaXIubyBcCisJCQkJICAgeGZzX2RpcjIubyBcCisJCQkJICAgeGZzX2RpcjJfYmxvY2subyBcCisJCQkJICAgeGZzX2RpcjJfZGF0YS5vIFwKKwkJCQkgICB4ZnNfZGlyMl9sZWFmLm8gXAorCQkJCSAgIHhmc19kaXIyX25vZGUubyBcCisJCQkJICAgeGZzX2RpcjJfc2YubyBcCisJCQkJICAgeGZzX2Rpcl9sZWFmLm8gXAorCQkJCSAgIHhmc19lcnJvci5vIFwKKwkJCQkgICB4ZnNfZXh0ZnJlZV9pdGVtLm8gXAorCQkJCSAgIHhmc19mc29wcy5vIFwKKwkJCQkgICB4ZnNfaWFsbG9jLm8gXAorCQkJCSAgIHhmc19pYWxsb2NfYnRyZWUubyBcCisJCQkJICAgeGZzX2lnZXQubyBcCisJCQkJICAgeGZzX2lub2RlLm8gXAorCQkJCSAgIHhmc19pbm9kZV9pdGVtLm8gXAorCQkJCSAgIHhmc19pb2NvcmUubyBcCisJCQkJICAgeGZzX2lvbWFwLm8gXAorCQkJCSAgIHhmc19pdGFibGUubyBcCisJCQkJICAgeGZzX2RmcmFnLm8gXAorCQkJCSAgIHhmc19sb2cubyBcCisJCQkJICAgeGZzX2xvZ19yZWNvdmVyLm8gXAorCQkJCSAgIHhmc19tYWNyb3MubyBcCisJCQkJICAgeGZzX21vdW50Lm8gXAorCQkJCSAgIHhmc19yZW5hbWUubyBcCisJCQkJICAgeGZzX3RyYW5zLm8gXAorCQkJCSAgIHhmc190cmFuc19haWwubyBcCisJCQkJICAgeGZzX3RyYW5zX2J1Zi5vIFwKKwkJCQkgICB4ZnNfdHJhbnNfZXh0ZnJlZS5vIFwKKwkJCQkgICB4ZnNfdHJhbnNfaW5vZGUubyBcCisJCQkJICAgeGZzX3RyYW5zX2l0ZW0ubyBcCisJCQkJICAgeGZzX3V0aWxzLm8gXAorCQkJCSAgIHhmc192ZnNvcHMubyBcCisJCQkJICAgeGZzX3Zub2Rlb3BzLm8gXAorCQkJCSAgIHhmc19ydy5vIFwKKwkJCQkgICB4ZnNfZG1vcHMubyBcCisJCQkJICAgeGZzX3Ftb3BzLm8KKworeGZzLSQoQ09ORklHX1hGU19UUkFDRSkJCSs9IHhmc19kaXIyX3RyYWNlLm8KKworIyBPYmplY3RzIGluIGxpbnV4LworeGZzLXkJCQkJKz0gJChhZGRwcmVmaXggJChYRlNfTElOVVgpLywgXAorCQkJCSAgIGttZW0ubyBcCisJCQkJICAgeGZzX2FvcHMubyBcCisJCQkJICAgeGZzX2J1Zi5vIFwKKwkJCQkgICB4ZnNfZmlsZS5vIFwKKwkJCQkgICB4ZnNfZnNfc3Vici5vIFwKKwkJCQkgICB4ZnNfZ2xvYmFscy5vIFwKKwkJCQkgICB4ZnNfaW9jdGwubyBcCisJCQkJICAgeGZzX2lvcHMubyBcCisJCQkJICAgeGZzX2xydy5vIFwKKwkJCQkgICB4ZnNfc3VwZXIubyBcCisJCQkJICAgeGZzX3Zmcy5vIFwKKwkJCQkgICB4ZnNfdm5vZGUubykKKworIyBPYmplY3RzIGluIHN1cHBvcnQvCit4ZnMteQkJCQkrPSAkKGFkZHByZWZpeCBzdXBwb3J0LywgXAorCQkJCSAgIGRlYnVnLm8gXAorCQkJCSAgIG1vdmUubyBcCisJCQkJICAgdXVpZC5vKQorCit4ZnMtJChDT05GSUdfWEZTX1RSQUNFKQkJKz0gc3VwcG9ydC9rdHJhY2UubworCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L2ttZW0uYyBiL2ZzL3hmcy9saW51eC0yLjYva21lbS5jCmluZGV4IDM2NGVhOGMuLjRiMTg0NTUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYva21lbS5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYva21lbS5jCkBAIC00NSwxMSArNDUsMTEgQEAKIAogCiB2b2lkICoKLWttZW1fYWxsb2Moc2l6ZV90IHNpemUsIGludCBmbGFncykKK2ttZW1fYWxsb2Moc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKIHsKLQlpbnQJcmV0cmllcyA9IDA7Ci0JaW50CWxmbGFncyA9IGttZW1fZmxhZ3NfY29udmVydChmbGFncyk7Ci0Jdm9pZAkqcHRyOworCWludAkJcmV0cmllcyA9IDA7CisJdW5zaWduZWQgaW50CWxmbGFncyA9IGttZW1fZmxhZ3NfY29udmVydChmbGFncyk7CisJdm9pZAkJKnB0cjsKIAogCWRvIHsKIAkJaWYgKHNpemUgPCBNQVhfU0xBQl9TSVpFIHx8IHJldHJpZXMgPiBNQVhfVk1BTExPQ1MpCkBAIC02Nyw3ICs2Nyw3IEBACiB9CiAKIHZvaWQgKgota21lbV96YWxsb2Moc2l6ZV90IHNpemUsIGludCBmbGFncykKK2ttZW1femFsbG9jKHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpCiB7CiAJdm9pZAkqcHRyOwogCkBAIC04OSw3ICs4OSw4IEBACiB9CiAKIHZvaWQgKgota21lbV9yZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IG5ld3NpemUsIHNpemVfdCBvbGRzaXplLCBpbnQgZmxhZ3MpCitrbWVtX3JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3QgbmV3c2l6ZSwgc2l6ZV90IG9sZHNpemUsCisJICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpCiB7CiAJdm9pZAkqbmV3OwogCkBAIC0xMDQsMTEgKzEwNSwxMSBAQAogfQogCiB2b2lkICoKLWttZW1fem9uZV9hbGxvYyhrbWVtX3pvbmVfdCAqem9uZSwgaW50IGZsYWdzKQora21lbV96b25lX2FsbG9jKGttZW1fem9uZV90ICp6b25lLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpCiB7Ci0JaW50CXJldHJpZXMgPSAwOwotCWludAlsZmxhZ3MgPSBrbWVtX2ZsYWdzX2NvbnZlcnQoZmxhZ3MpOwotCXZvaWQJKnB0cjsKKwlpbnQJCXJldHJpZXMgPSAwOworCXVuc2lnbmVkIGludAlsZmxhZ3MgPSBrbWVtX2ZsYWdzX2NvbnZlcnQoZmxhZ3MpOworCXZvaWQJCSpwdHI7CiAKIAlkbyB7CiAJCXB0ciA9IGttZW1fY2FjaGVfYWxsb2Moem9uZSwgbGZsYWdzKTsKQEAgLTEyMyw3ICsxMjQsNyBAQAogfQogCiB2b2lkICoKLWttZW1fem9uZV96YWxsb2Moa21lbV96b25lX3QgKnpvbmUsIGludCBmbGFncykKK2ttZW1fem9uZV96YWxsb2Moa21lbV96b25lX3QgKnpvbmUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKIHsKIAl2b2lkCSpwdHI7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYva21lbS5oIGIvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmgKaW5kZXggMTM5N2I2Ni4uMTA5ZmNmMiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmgKQEAgLTM5LDEwICszOSwxMCBAQAogLyoKICAqIG1lbW9yeSBtYW5hZ2VtZW50IHJvdXRpbmVzCiAgKi8KLSNkZWZpbmUgS01fU0xFRVAJMHgwMDAxCi0jZGVmaW5lIEtNX05PU0xFRVAJMHgwMDAyCi0jZGVmaW5lIEtNX05PRlMJCTB4MDAwNAotI2RlZmluZSBLTV9NQVlGQUlMCTB4MDAwOAorI2RlZmluZSBLTV9TTEVFUAkweDAwMDF1CisjZGVmaW5lIEtNX05PU0xFRVAJMHgwMDAydQorI2RlZmluZSBLTV9OT0ZTCQkweDAwMDR1CisjZGVmaW5lIEtNX01BWUZBSUwJMHgwMDA4dQogCiAjZGVmaW5lCWttZW1fem9uZQlrbWVtX2NhY2hlX3MKICNkZWZpbmUga21lbV96b25lX3QJa21lbV9jYWNoZV90CkBAIC04MSw5ICs4MSw5IEBACiAJKihOU1RBVEVQKSA9ICooT1NUQVRFUCk7CVwKIH0gd2hpbGUgKDApCiAKLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQga21lbV9mbGFnc19jb252ZXJ0KGludCBmbGFncykKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQga21lbV9mbGFnc19jb252ZXJ0KHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKIHsKLQlpbnQJbGZsYWdzID0gX19HRlBfTk9XQVJOOwkvKiB3ZSdsbCByZXBvcnQgcHJvYmxlbXMsIGlmIG5lZWQgYmUgKi8KKwl1bnNpZ25lZCBpbnQJbGZsYWdzID0gX19HRlBfTk9XQVJOOwkvKiB3ZSdsbCByZXBvcnQgcHJvYmxlbXMsIGlmIG5lZWQgYmUgKi8KIAogI2lmZGVmIERFQlVHCiAJaWYgKHVubGlrZWx5KGZsYWdzICYgfihLTV9TTEVFUHxLTV9OT1NMRUVQfEtNX05PRlN8S01fTUFZRkFJTCkpKSB7CkBAIC0xMjUsMTIgKzEyNSwxMyBAQAogCQlCVUcoKTsKIH0KIAotZXh0ZXJuIHZvaWQJICAgICprbWVtX3pvbmVfemFsbG9jKGttZW1fem9uZV90ICosIGludCk7Ci1leHRlcm4gdm9pZAkgICAgKmttZW1fem9uZV9hbGxvYyhrbWVtX3pvbmVfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQJICAgICprbWVtX3pvbmVfemFsbG9jKGttZW1fem9uZV90ICosIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CitleHRlcm4gdm9pZAkgICAgKmttZW1fem9uZV9hbGxvYyhrbWVtX3pvbmVfdCAqLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOwogCi1leHRlcm4gdm9pZAkgICAgKmttZW1fYWxsb2Moc2l6ZV90LCBpbnQpOwotZXh0ZXJuIHZvaWQJICAgICprbWVtX3JlYWxsb2Modm9pZCAqLCBzaXplX3QsIHNpemVfdCwgaW50KTsKLWV4dGVybiB2b2lkCSAgICAqa21lbV96YWxsb2Moc2l6ZV90LCBpbnQpOworZXh0ZXJuIHZvaWQJICAgICprbWVtX2FsbG9jKHNpemVfdCwgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKK2V4dGVybiB2b2lkCSAgICAqa21lbV9yZWFsbG9jKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsCisJCQkJICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOworZXh0ZXJuIHZvaWQJICAgICprbWVtX3phbGxvYyhzaXplX3QsIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CiBleHRlcm4gdm9pZCAgICAgICAgIGttZW1fZnJlZSh2b2lkICosIHNpemVfdCk7CiAKIHR5cGVkZWYgc3RydWN0IHNocmlua2VyICprbWVtX3NoYWtlcl90OwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9zcGluLmggYi9mcy94ZnMvbGludXgtMi42L3NwaW4uaAppbmRleCBiY2Y2MGEwLi4wMDM5NTA0IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3NwaW4uaAorKysgYi9mcy94ZnMvbGludXgtMi42L3NwaW4uaApAQCAtNDUsNiArNDUsOSBAQAogdHlwZWRlZiBzcGlubG9ja190IGxvY2tfdDsKIAogI2RlZmluZSBTUExERUNMKHMpCQkJdW5zaWduZWQgbG9uZyBzCisjaWZuZGVmIERFRklORV9TUElOTE9DSworI2RlZmluZSBERUZJTkVfU1BJTkxPQ0socykJCXNwaW5sb2NrX3QgcyA9IFNQSU5fTE9DS19VTkxPQ0tFRAorI2VuZGlmCiAKICNkZWZpbmUgc3BpbmxvY2tfaW5pdChsb2NrLCBuYW1lKQlzcGluX2xvY2tfaW5pdChsb2NrKQogI2RlZmluZQlzcGlubG9ja19kZXN0cm95KGxvY2spCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3RpbWUuaCBiL2ZzL3hmcy9saW51eC0yLjYvdGltZS5oCmluZGV4IDZjNmZkMGYuLmIwZDI4NzMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYvdGltZS5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYvdGltZS5oCkBAIC0zOSw4ICszOSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWxheShsb25nIHRpY2tzKQogewotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlzY2hlZHVsZV90aW1lb3V0KHRpY2tzKTsKKwlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSh0aWNrcyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuYW5vdGltZShzdHJ1Y3QgdGltZXNwZWMgKnR2cCkKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYwppbmRleCBhM2E0YjVhLi5jNmMwNzc5IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCkBAIC0xMDQsNjYgKzEwNCwxMTQgQEAKICNkZWZpbmUgeGZzX3BhZ2VfdHJhY2UodGFnLCBpbm9kZSwgcGFnZSwgbWFzaykKICNlbmRpZgogCisvKgorICogU2NoZWR1bGUgSU8gY29tcGxldGlvbiBoYW5kbGluZyBvbiBhIHhmc2RhdGFkIGlmIHRoaXMgd2FzCisgKiB0aGUgZmluYWwgaG9sZCBvbiB0aGlzIGlvZW5kLgorICovCitTVEFUSUMgdm9pZAoreGZzX2ZpbmlzaF9pb2VuZCgKKwl4ZnNfaW9lbmRfdAkJKmlvZW5kKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpb2VuZC0+aW9fcmVtYWluaW5nKSkKKwkJcXVldWVfd29yayh4ZnNkYXRhZF93b3JrcXVldWUsICZpb2VuZC0+aW9fd29yayk7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfZGVzdHJveV9pb2VuZCgKKwl4ZnNfaW9lbmRfdAkJKmlvZW5kKQoreworCXZuX2lvd2FrZShpb2VuZC0+aW9fdm5vZGUpOworCW1lbXBvb2xfZnJlZShpb2VuZCwgeGZzX2lvZW5kX3Bvb2wpOworfQorCisvKgorICogSXNzdWUgdHJhbnNhY3Rpb25zIHRvIGNvbnZlcnQgYSBidWZmZXIgcmFuZ2UgZnJvbSB1bndyaXR0ZW4KKyAqIHRvIHdyaXR0ZW4gZXh0ZW50cy4KKyAqLworU1RBVElDIHZvaWQKK3hmc19lbmRfYmlvX3Vud3JpdHRlbigKKwl2b2lkCQkJKmRhdGEpCit7CisJeGZzX2lvZW5kX3QJCSppb2VuZCA9IGRhdGE7CisJdm5vZGVfdAkJCSp2cCA9IGlvZW5kLT5pb192bm9kZTsKKwl4ZnNfb2ZmX3QJCW9mZnNldCA9IGlvZW5kLT5pb19vZmZzZXQ7CisJc2l6ZV90CQkJc2l6ZSA9IGlvZW5kLT5pb19zaXplOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpuZXh0OworCWludAkJCWVycm9yOworCisJaWYgKGlvZW5kLT5pb191cHRvZGF0ZSkKKwkJVk9QX0JNQVAodnAsIG9mZnNldCwgc2l6ZSwgQk1BUElfVU5XUklUVEVOLCBOVUxMLCBOVUxMLCBlcnJvcik7CisKKwkvKiBpb2VuZC0+aW9fYnVmZmVyX2hlYWQgaXMgb25seSBub24tTlVMTCBmb3IgYnVmZmVyZWQgSS9PICovCisJZm9yIChiaCA9IGlvZW5kLT5pb19idWZmZXJfaGVhZDsgYmg7IGJoID0gbmV4dCkgeworCQluZXh0ID0gYmgtPmJfcHJpdmF0ZTsKKworCQliaC0+Yl9lbmRfaW8gPSBOVUxMOworCQljbGVhcl9idWZmZXJfdW53cml0dGVuKGJoKTsKKwkJZW5kX2J1ZmZlcl9hc3luY193cml0ZShiaCwgaW9lbmQtPmlvX3VwdG9kYXRlKTsKKwl9CisKKwl4ZnNfZGVzdHJveV9pb2VuZChpb2VuZCk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhbiBJTyBjb21wbGV0aW9uIHN0cnVjdHVyZS4KKyAqIFdlIG5lZWQgdG8gdHJhY2sgdW53cml0dGVuIGV4dGVudCB3cml0ZSBjb21wbGV0aW9uIGhlcmUgaW5pdGlhbGx5LgorICogV2UnbGwgbmVlZCB0byBleHRlbmQgdGhpcyBmb3IgdXBkYXRpbmcgdGhlIG9uZGlzayBpbm9kZSBzaXplIGxhdGVyCisgKiAodnMuIGluY29yZSBzaXplKS4KKyAqLworU1RBVElDIHhmc19pb2VuZF90ICoKK3hmc19hbGxvY19pb2VuZCgKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSkKK3sKKwl4ZnNfaW9lbmRfdAkJKmlvZW5kOworCisJaW9lbmQgPSBtZW1wb29sX2FsbG9jKHhmc19pb2VuZF9wb29sLCBHRlBfTk9GUyk7CisKKwkvKgorCSAqIFNldCB0aGUgY291bnQgdG8gMSBpbml0aWFsbHksIHdoaWNoIHdpbGwgcHJldmVudCBhbiBJL08KKwkgKiBjb21wbGV0aW9uIGNhbGxiYWNrIGZyb20gaGFwcGVuaW5nIGJlZm9yZSB3ZSBoYXZlIHN0YXJ0ZWQKKwkgKiBhbGwgdGhlIEkvTyBmcm9tIGNhbGxpbmcgdGhlIGNvbXBsZXRpb24gcm91dGluZSB0b28gZWFybHkuCisJICovCisJYXRvbWljX3NldCgmaW9lbmQtPmlvX3JlbWFpbmluZywgMSk7CisJaW9lbmQtPmlvX3VwdG9kYXRlID0gMTsgLyogY2xlYXJlZCBpZiBhbnkgSS9PIGZhaWxzICovCisJaW9lbmQtPmlvX3Zub2RlID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJaW9lbmQtPmlvX2J1ZmZlcl9oZWFkID0gTlVMTDsKKwlhdG9taWNfaW5jKCZpb2VuZC0+aW9fdm5vZGUtPnZfaW9jb3VudCk7CisJaW9lbmQtPmlvX29mZnNldCA9IDA7CisJaW9lbmQtPmlvX3NpemUgPSAwOworCisJSU5JVF9XT1JLKCZpb2VuZC0+aW9fd29yaywgeGZzX2VuZF9iaW9fdW53cml0dGVuLCBpb2VuZCk7CisKKwlyZXR1cm4gaW9lbmQ7Cit9CisKIHZvaWQKIGxpbnZmc191bndyaXR0ZW5fZG9uZSgKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLAogCWludAkJCXVwdG9kYXRlKQogewotCXhmc19idWZfdAkJKnBiID0gKHhmc19idWZfdCAqKWJoLT5iX3ByaXZhdGU7CisJeGZzX2lvZW5kX3QJCSppb2VuZCA9IGJoLT5iX3ByaXZhdGU7CisJc3RhdGljIHNwaW5sb2NrX3QJdW53cml0dGVuX2RvbmVfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAogCUFTU0VSVChidWZmZXJfdW53cml0dGVuKGJoKSk7CiAJYmgtPmJfZW5kX2lvID0gTlVMTDsKLQljbGVhcl9idWZmZXJfdW53cml0dGVuKGJoKTsKKwogCWlmICghdXB0b2RhdGUpCi0JCXBhZ2VidWZfaW9lcnJvcihwYiwgRUlPKTsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGItPnBiX2lvX3JlbWFpbmluZykgPT0gMSkgewotCQlwYWdlYnVmX2lvZG9uZShwYiwgMSwgMSk7Ci0JfQotCWVuZF9idWZmZXJfYXN5bmNfd3JpdGUoYmgsIHVwdG9kYXRlKTsKLX0KKwkJaW9lbmQtPmlvX3VwdG9kYXRlID0gMDsKIAotLyoKLSAqIElzc3VlIHRyYW5zYWN0aW9ucyB0byBjb252ZXJ0IGEgYnVmZmVyIHJhbmdlIGZyb20gdW53cml0dGVuCi0gKiB0byB3cml0dGVuIGV4dGVudHMgKGJ1ZmZlcmVkIElPKS4KLSAqLwotU1RBVElDIHZvaWQKLWxpbnZmc191bndyaXR0ZW5fY29udmVydCgKLQl4ZnNfYnVmX3QJKmJwKQotewotCXZub2RlX3QJCSp2cCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB2bm9kZV90ICopOwotCWludAkJZXJyb3I7CisJLyoKKwkgKiBEZWVwIG1hZ2ljIGhlcmUuICBXZSByZXVzZSBiX3ByaXZhdGUgaW4gdGhlIGJ1ZmZlcl9oZWFkcyB0byBidWlsZAorCSAqIGEgY2hhaW4gZm9yIGNvbXBsZXRpbmcgdGhlIEkvTyBmcm9tIHVzZXIgY29udGV4dCBhZnRlciB3ZSd2ZSBpc3N1ZWQKKwkgKiBhIHRyYW5zYWN0aW9uIHRvIGNvbnZlcnQgdGhlIHVud3JpdHRlbiBleHRlbnQuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVud3JpdHRlbl9kb25lX2xvY2ssIGZsYWdzKTsKKwliaC0+Yl9wcml2YXRlID0gaW9lbmQtPmlvX2J1ZmZlcl9oZWFkOworCWlvZW5kLT5pb19idWZmZXJfaGVhZCA9IGJoOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVud3JpdHRlbl9kb25lX2xvY2ssIGZsYWdzKTsKIAotCUJVR19PTihhdG9taWNfcmVhZCgmYnAtPnBiX2hvbGQpIDwgMSk7Ci0JVk9QX0JNQVAodnAsIFhGU19CVUZfT0ZGU0VUKGJwKSwgWEZTX0JVRl9TSVpFKGJwKSwKLQkJCUJNQVBJX1VOV1JJVFRFTiwgTlVMTCwgTlVMTCwgZXJyb3IpOwotCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgTlVMTCk7Ci0JWEZTX0JVRl9DTFJfSU9ET05FX0ZVTkMoYnApOwotCVhGU19CVUZfVU5EQVRBSU8oYnApOwotCWlwdXQoTElOVkZTX0dFVF9JUCh2cCkpOwotCXBhZ2VidWZfaW9kb25lKGJwLCAwLCAwKTsKLX0KLQotLyoKLSAqIElzc3VlIHRyYW5zYWN0aW9ucyB0byBjb252ZXJ0IGEgYnVmZmVyIHJhbmdlIGZyb20gdW53cml0dGVuCi0gKiB0byB3cml0dGVuIGV4dGVudHMgKGRpcmVjdCBJTykuCi0gKi8KLVNUQVRJQyB2b2lkCi1saW52ZnNfdW53cml0dGVuX2NvbnZlcnRfZGlyZWN0KAotCXN0cnVjdCBraW9jYgkqaW9jYiwKLQlsb2ZmX3QJCW9mZnNldCwKLQlzc2l6ZV90CQlzaXplLAotCXZvaWQJCSpwcml2YXRlKQotewotCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBpb2NiLT5raV9maWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQlBU1NFUlQoIXByaXZhdGUgfHwgaW5vZGUgPT0gKHN0cnVjdCBpbm9kZSAqKXByaXZhdGUpOwotCi0JLyogcHJpdmF0ZSBpbmRpY2F0ZXMgYW4gdW53cml0dGVuIGV4dGVudCBsYXkgYmVuZWF0aCB0aGlzIElPICovCi0JaWYgKHByaXZhdGUgJiYgc2l6ZSA+IDApIHsKLQkJdm5vZGVfdAkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKLQkJaW50CWVycm9yOwotCi0JCVZPUF9CTUFQKHZwLCBvZmZzZXQsIHNpemUsIEJNQVBJX1VOV1JJVFRFTiwgTlVMTCwgTlVMTCwgZXJyb3IpOwotCX0KKwl4ZnNfZmluaXNoX2lvZW5kKGlvZW5kKTsKIH0KIAogU1RBVElDIGludApAQCAtMjU1LDcgKzMwMyw3IEBACiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcsCiAJcGdvZmZfdAkJCWluZGV4LAogCXhmc19pb21hcF90CQkqaW9tYXBwLAotCXhmc19idWZfdAkJKnBiLAorCXhmc19pb2VuZF90CQkqaW9lbmQsCiAJdW5zaWduZWQgbG9uZwkJbWF4X29mZnNldCwKIAl1bnNpZ25lZCBsb25nCQkqZnNicywKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICBiYml0cykKQEAgLTI4Myw3ICszMzEsNyBAQAogCQkJCWJyZWFrOwogCQkJeGZzX21hcF9hdF9vZmZzZXQocGFnZSwgYmgsIHBfb2Zmc2V0LCBiYml0cywgaW9tYXBwKTsKIAkJCXNldF9idWZmZXJfdW53cml0dGVuX2lvKGJoKTsKLQkJCWJoLT5iX3ByaXZhdGUgPSBwYjsKKwkJCWJoLT5iX3ByaXZhdGUgPSBpb2VuZDsKIAkJCXBfb2Zmc2V0ICs9IGJoLT5iX3NpemU7CiAJCQkoKmZzYnMpKys7CiAJCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CkBAIC00MzQsMzQgKzQ4MiwxNSBAQAogewogCXN0cnVjdCBidWZmZXJfaGVhZAkqYmggPSBjdXJyOwogCXhmc19pb21hcF90CQkqdG1wOwotCXhmc19idWZfdAkJKnBiOwotCWxvZmZfdAkJCW9mZnNldCwgc2l6ZTsKKwl4ZnNfaW9lbmRfdAkJKmlvZW5kOworCWxvZmZfdAkJCW9mZnNldDsKIAl1bnNpZ25lZCBsb25nCQluYmxvY2tzID0gMDsKIAogCW9mZnNldCA9IHN0YXJ0X3BhZ2UtPmluZGV4OwogCW9mZnNldCA8PD0gUEFHRV9DQUNIRV9TSElGVDsKIAlvZmZzZXQgKz0gcF9vZmZzZXQ7CiAKLQkvKiBnZXQgYW4gImVtcHR5IiBwYWdlYnVmIHRvIG1hbmFnZSBJTyBjb21wbGV0aW9uCi0JICogUHJvcGVyIHZhbHVlcyB3aWxsIGJlIHNldCBiZWZvcmUgcmV0dXJuaW5nICovCi0JcGIgPSBwYWdlYnVmX2xvb2t1cChpb21hcHAtPmlvbWFwX3RhcmdldCwgMCwgMCwgMCk7Ci0JaWYgKCFwYikKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQkvKiBUYWtlIGEgcmVmZXJlbmNlIHRvIHRoZSBpbm9kZSB0byBwcmV2ZW50IGl0IGZyb20KLQkgKiBiZWluZyByZWNsYWltZWQgd2hpbGUgd2UgaGF2ZSBvdXRzdGFuZGluZyB1bndyaXR0ZW4KLQkgKiBleHRlbnQgSU8gb24gaXQuCi0JICovCi0JaWYgKChpZ3JhYihpbm9kZSkpICE9IGlub2RlKSB7Ci0JCXBhZ2VidWZfZnJlZShwYik7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCS8qIFNldCB0aGUgY291bnQgdG8gMSBpbml0aWFsbHksIHRoaXMgd2lsbCBzdG9wIGFuIEkvTwotCSAqIGNvbXBsZXRpb24gY2FsbG91dCB3aGljaCBoYXBwZW5zIGJlZm9yZSB3ZSBoYXZlIHN0YXJ0ZWQKLQkgKiBhbGwgdGhlIEkvTyBmcm9tIGNhbGxpbmcgcGFnZWJ1Zl9pb2RvbmUgdG9vIGVhcmx5LgotCSAqLwotCWF0b21pY19zZXQoJnBiLT5wYl9pb19yZW1haW5pbmcsIDEpOworCWlvZW5kID0geGZzX2FsbG9jX2lvZW5kKGlub2RlKTsKIAogCS8qIEZpcnN0IG1hcCBmb3J3YXJkcyBpbiB0aGUgcGFnZSBjb25zZWN1dGl2ZSBidWZmZXJzCiAJICogY292ZXJpbmcgdGhpcyB1bndyaXR0ZW4gZXh0ZW50CkBAIC00NzQsMTIgKzUwMywxMiBAQAogCQkJYnJlYWs7CiAJCXhmc19tYXBfYXRfb2Zmc2V0KHN0YXJ0X3BhZ2UsIGJoLCBwX29mZnNldCwgYmxvY2tfYml0cywgaW9tYXBwKTsKIAkJc2V0X2J1ZmZlcl91bndyaXR0ZW5faW8oYmgpOwotCQliaC0+Yl9wcml2YXRlID0gcGI7CisJCWJoLT5iX3ByaXZhdGUgPSBpb2VuZDsKIAkJcF9vZmZzZXQgKz0gYmgtPmJfc2l6ZTsKIAkJbmJsb2NrcysrOwogCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CiAKLQlhdG9taWNfYWRkKG5ibG9ja3MsICZwYi0+cGJfaW9fcmVtYWluaW5nKTsKKwlhdG9taWNfYWRkKG5ibG9ja3MsICZpb2VuZC0+aW9fcmVtYWluaW5nKTsKIAogCS8qIElmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgcGFnZSwgbWFwIGZvcndhcmRzIGluIGFueQogCSAqIGZvbGxvd2luZyBwYWdlcyB3aGljaCBhcmUgYWxzbyBjb3ZlcmVkIGJ5IHRoaXMgZXh0ZW50LgpAQCAtNDk2LDEzICs1MjUsMTMgQEAKIAkJdGxvZmYgPSBtaW4odGxhc3QsIHRsb2ZmKTsKIAkJZm9yICh0aW5kZXggPSBzdGFydF9wYWdlLT5pbmRleCArIDE7IHRpbmRleCA8IHRsb2ZmOyB0aW5kZXgrKykgewogCQkJcGFnZSA9IHhmc19wcm9iZV91bndyaXR0ZW5fcGFnZShtYXBwaW5nLAotCQkJCQkJdGluZGV4LCBpb21hcHAsIHBiLAorCQkJCQkJdGluZGV4LCBpb21hcHAsIGlvZW5kLAogCQkJCQkJUEFHRV9DQUNIRV9TSVpFLCAmYnMsIGJiaXRzKTsKIAkJCWlmICghcGFnZSkKIAkJCQlicmVhazsKIAkJCW5ibG9ja3MgKz0gYnM7Ci0JCQlhdG9taWNfYWRkKGJzLCAmcGItPnBiX2lvX3JlbWFpbmluZyk7Ci0JCQl4ZnNfY29udmVydF9wYWdlKGlub2RlLCBwYWdlLCBpb21hcHAsIHdiYywgcGIsCisJCQlhdG9taWNfYWRkKGJzLCAmaW9lbmQtPmlvX3JlbWFpbmluZyk7CisJCQl4ZnNfY29udmVydF9wYWdlKGlub2RlLCBwYWdlLCBpb21hcHAsIHdiYywgaW9lbmQsCiAJCQkJCQkJc3RhcnRpbywgYWxsX2JoKTsKIAkJCS8qIHN0b3AgaWYgY29udmVydGluZyB0aGUgbmV4dCBwYWdlIG1pZ2h0IGFkZAogCQkJICogZW5vdWdoIGJsb2NrcyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGJ5dGUKQEAgLTUxNCwxMiArNTQzLDEyIEBACiAJCWlmICh0aW5kZXggPT0gdGxhc3QgJiYKIAkJICAgIChwZ19vZmZzZXQgPSAoaV9zaXplX3JlYWQoaW5vZGUpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSkpIHsKIAkJCXBhZ2UgPSB4ZnNfcHJvYmVfdW53cml0dGVuX3BhZ2UobWFwcGluZywKLQkJCQkJCQl0aW5kZXgsIGlvbWFwcCwgcGIsCisJCQkJCQkJdGluZGV4LCBpb21hcHAsIGlvZW5kLAogCQkJCQkJCXBnX29mZnNldCwgJmJzLCBiYml0cyk7CiAJCQlpZiAocGFnZSkgewogCQkJCW5ibG9ja3MgKz0gYnM7Ci0JCQkJYXRvbWljX2FkZChicywgJnBiLT5wYl9pb19yZW1haW5pbmcpOwotCQkJCXhmc19jb252ZXJ0X3BhZ2UoaW5vZGUsIHBhZ2UsIGlvbWFwcCwgd2JjLCBwYiwKKwkJCQlhdG9taWNfYWRkKGJzLCAmaW9lbmQtPmlvX3JlbWFpbmluZyk7CisJCQkJeGZzX2NvbnZlcnRfcGFnZShpbm9kZSwgcGFnZSwgaW9tYXBwLCB3YmMsIGlvZW5kLAogCQkJCQkJCXN0YXJ0aW8sIGFsbF9iaCk7CiAJCQkJaWYgKG5ibG9ja3MgPj0gKChVTE9OR19NQVggLSBQQUdFX1NJWkUpID4+IGJsb2NrX2JpdHMpKQogCQkJCQlnb3RvIGVub3VnaDsKQEAgLTUyOCwyMSArNTU3LDkgQEAKIAl9CiAKIGVub3VnaDoKLQlzaXplID0gbmJsb2NrczsJCS8qIE5COiB1c2luZyA2NGJpdCBudW1iZXIgaGVyZSAqLwotCXNpemUgPDw9IGJsb2NrX2JpdHM7CS8qIGNvbnZlcnQgZnNiJ3MgdG8gYnl0ZSByYW5nZSAqLwotCi0JWEZTX0JVRl9EQVRBSU8ocGIpOwotCVhGU19CVUZfQVNZTkMocGIpOwotCVhGU19CVUZfU0VUX1NJWkUocGIsIHNpemUpOwotCVhGU19CVUZfU0VUX0NPVU5UKHBiLCBzaXplKTsKLQlYRlNfQlVGX1NFVF9PRkZTRVQocGIsIG9mZnNldCk7Ci0JWEZTX0JVRl9TRVRfRlNQUklWQVRFKHBiLCBMSU5WRlNfR0VUX1ZQKGlub2RlKSk7Ci0JWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMocGIsIGxpbnZmc191bndyaXR0ZW5fY29udmVydCk7Ci0KLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGItPnBiX2lvX3JlbWFpbmluZykgPT0gMSkgewotCQlwYWdlYnVmX2lvZG9uZShwYiwgMSwgMSk7Ci0JfQotCisJaW9lbmQtPmlvX3NpemUgPSAoeGZzX29mZl90KW5ibG9ja3MgPDwgYmxvY2tfYml0czsKKwlpb2VuZC0+aW9fb2Zmc2V0ID0gb2Zmc2V0OworCXhmc19maW5pc2hfaW9lbmQoaW9lbmQpOwogCXJldHVybiAwOwogfQogCkBAIC03ODcsNyArODA0LDcgQEAKIAkJCQljb250aW51ZTsKIAkJCWlmICghaW9tcCkgewogCQkJCWVyciA9IHhmc19tYXBfYmxvY2tzKGlub2RlLCBvZmZzZXQsIGxlbiwgJmlvbWFwLAotCQkJCQkJQk1BUElfUkVBRHxCTUFQSV9JR05TVEFURSk7CisJCQkJCQlCTUFQSV9XUklURXxCTUFQSV9JR05TVEFURSk7CiAJCQkJaWYgKGVycikgewogCQkJCQlnb3RvIGVycm9yOwogCQkJCX0KQEAgLTEwMjgsNiArMTA0NSw0NCBAQAogCQkJCQljcmVhdGUsIDEsIEJNQVBJX1dSSVRFfEJNQVBJX0RJUkVDVCk7CiB9CiAKK1NUQVRJQyB2b2lkCitsaW52ZnNfZW5kX2lvX2RpcmVjdCgKKwlzdHJ1Y3Qga2lvY2IJKmlvY2IsCisJbG9mZl90CQlvZmZzZXQsCisJc3NpemVfdAkJc2l6ZSwKKwl2b2lkCQkqcHJpdmF0ZSkKK3sKKwl4ZnNfaW9lbmRfdAkqaW9lbmQgPSBpb2NiLT5wcml2YXRlOworCisJLyoKKwkgKiBOb24tTlVMTCBwcml2YXRlIGRhdGEgbWVhbnMgd2UgbmVlZCB0byBpc3N1ZSBhIHRyYW5zYWN0aW9uIHRvCisJICogY29udmVydCBhIHJhbmdlIGZyb20gdW53cml0dGVuIHRvIHdyaXR0ZW4gZXh0ZW50cy4gIFRoaXMgbmVlZHMKKwkgKiB0byBoYXBwZW4gZnJvbSBwcm9jZXNzIGNvbnRlY3QgYnV0IGFpbytkaW8gSS9PIGNvbXBsZXRpb24KKwkgKiBoYXBwZW5zIGZyb20gaXJxIGNvbnRleHQgc28gd2UgbmVlZCB0byBkZWZlciBpdCB0byBhIHdvcmtxdWV1ZS4KKwkgKiBUaGlzIGlzIG5vdCBuZXNzZWNhcnkgZm9yIHN5bmNocm9ub3VzIGRpcmVjdCBJL08sIGJ1dCB3ZSBkbworCSAqIGl0IGFueXdheSB0byBrZWVwIHRoZSBjb2RlIHVuaWZvcm0gYW5kIHNpbXBsZXIuCisJICoKKwkgKiBUaGUgY29yZSBkaXJlY3QgSS9PIGNvZGUgbWlnaHQgYmUgY2hhbmdlZCB0byBhbHdheXMgY2FsbCB0aGUKKwkgKiBjb21wbGV0aW9uIGhhbmRsZXIgaW4gdGhlIGZ1dHVyZSwgaW4gd2hpY2ggY2FzZSBhbGwgdGhpcyBjYW4KKwkgKiBnbyBhd2F5LgorCSAqLworCWlmIChwcml2YXRlICYmIHNpemUgPiAwKSB7CisJCWlvZW5kLT5pb19vZmZzZXQgPSBvZmZzZXQ7CisJCWlvZW5kLT5pb19zaXplID0gc2l6ZTsKKwkJeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCk7CisJfSBlbHNlIHsKKwkJQVNTRVJUKHNpemUgPj0gMCk7CisJCXhmc19kZXN0cm95X2lvZW5kKGlvZW5kKTsKKwl9CisKKwkvKgorCSAqIGJsb2NrZGV2X2RpcmVjdF9JTyBjYW4gcmV0dXJuIGFuIGVycm9yIGV2ZW4gYWZlciB0aGUgSS9PCisJICogY29tcGxldGlvbiBoYW5kbGVyIHdhcyBjYWxsZWQuICBUaHVzIHdlIG5lZWQgdG8gcHJvdGVjdAorCSAqIGFnYWluc3QgZG91YmxlLWZyZWVpbmcuCisJICovCisJaW9jYi0+cHJpdmF0ZSA9IE5VTEw7Cit9CisKIFNUQVRJQyBzc2l6ZV90CiBsaW52ZnNfZGlyZWN0X0lPKAogCWludAkJCXJ3LApAQCAtMTA0MiwxNiArMTA5NywyMyBAQAogCXhmc19pb21hcF90CWlvbWFwOwogCWludAkJbWFwcyA9IDE7CiAJaW50CQllcnJvcjsKKwlzc2l6ZV90CQlyZXQ7CiAKIAlWT1BfQk1BUCh2cCwgb2Zmc2V0LCAwLCBCTUFQSV9ERVZJQ0UsICZpb21hcCwgJm1hcHMsIGVycm9yKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiAtZXJyb3I7CiAKLQlyZXR1cm4gYmxvY2tkZXZfZGlyZWN0X0lPX293bl9sb2NraW5nKHJ3LCBpb2NiLCBpbm9kZSwKKwlpb2NiLT5wcml2YXRlID0geGZzX2FsbG9jX2lvZW5kKGlub2RlKTsKKworCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JT19vd25fbG9ja2luZyhydywgaW9jYiwgaW5vZGUsCiAJCWlvbWFwLmlvbWFwX3RhcmdldC0+cGJyX2JkZXYsCiAJCWlvdiwgb2Zmc2V0LCBucl9zZWdzLAogCQlsaW52ZnNfZ2V0X2Jsb2Nrc19kaXJlY3QsCi0JCWxpbnZmc191bndyaXR0ZW5fY29udmVydF9kaXJlY3QpOworCQlsaW52ZnNfZW5kX2lvX2RpcmVjdCk7CisKKwlpZiAodW5saWtlbHkocmV0IDw9IDAgJiYgaW9jYi0+cHJpdmF0ZSkpCisJCXhmc19kZXN0cm95X2lvZW5kKGlvY2ItPnByaXZhdGUpOworCXJldHVybiByZXQ7CiB9CiAKIApAQCAtMTIwMiw2ICsxMjY0LDE2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCitTVEFUSUMgaW50CitsaW52ZnNfaW52YWxpZGF0ZV9wYWdlKAorCXN0cnVjdCBwYWdlCQkqcGFnZSwKKwl1bnNpZ25lZCBsb25nCQlvZmZzZXQpCit7CisJeGZzX3BhZ2VfdHJhY2UoWEZTX0lOVkFMSURQQUdFX0VOVEVSLAorCQkJcGFnZS0+bWFwcGluZy0+aG9zdCwgcGFnZSwgb2Zmc2V0KTsKKwlyZXR1cm4gYmxvY2tfaW52YWxpZGF0ZXBhZ2UocGFnZSwgb2Zmc2V0KTsKK30KKwogLyoKICAqIENhbGxlZCB0byBtb3ZlIGEgcGFnZSBpbnRvIGNsZWFuYWJsZSBzdGF0ZSAtIGFuZCBmcm9tIHRoZXJlCiAgKiB0byBiZSByZWxlYXNlZC4gUG9zc2libHkgdGhlIHBhZ2UgaXMgYWxyZWFkeSBjbGVhbi4gV2UgYWx3YXlzCkBAIC0xMjc5LDYgKzEzNTEsNyBAQAogCS53cml0ZXBhZ2UJCT0gbGludmZzX3dyaXRlcGFnZSwKIAkuc3luY19wYWdlCQk9IGJsb2NrX3N5bmNfcGFnZSwKIAkucmVsZWFzZXBhZ2UJCT0gbGludmZzX3JlbGVhc2VfcGFnZSwKKwkuaW52YWxpZGF0ZXBhZ2UJCT0gbGludmZzX2ludmFsaWRhdGVfcGFnZSwKIAkucHJlcGFyZV93cml0ZQkJPSBsaW52ZnNfcHJlcGFyZV93cml0ZSwKIAkuY29tbWl0X3dyaXRlCQk9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAogCS5ibWFwCQkJPSBsaW52ZnNfYm1hcCwKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmE2Mjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19BT1BTX0hfXworI2RlZmluZSBfX1hGU19BT1BTX0hfXworCitleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnhmc2RhdGFkX3dvcmtxdWV1ZTsKK2V4dGVybiBtZW1wb29sX3QgKnhmc19pb2VuZF9wb29sOworCit0eXBlZGVmIHZvaWQgKCp4ZnNfaW9lbmRfZnVuY190KSh2b2lkICopOworCit0eXBlZGVmIHN0cnVjdCB4ZnNfaW9lbmQgeworCXVuc2lnbmVkIGludAkJaW9fdXB0b2RhdGU7CS8qIEkvTyBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlhdG9taWNfdAkJaW9fcmVtYWluaW5nOwkvKiBob2xkIGNvdW50ICovCisJc3RydWN0IHZub2RlCQkqaW9fdm5vZGU7CS8qIGZpbGUgYmVpbmcgd3JpdHRlbiB0byAqLworCXN0cnVjdCBidWZmZXJfaGVhZAkqaW9fYnVmZmVyX2hlYWQ7LyogYnVmZmVyIGxpbmtlZCBsaXN0IGhlYWQgKi8KKwlzaXplX3QJCQlpb19zaXplOwkvKiBzaXplIG9mIHRoZSBleHRlbnQgKi8KKwl4ZnNfb2ZmX3QJCWlvX29mZnNldDsJLyogb2Zmc2V0IGluIHRoZSBmaWxlICovCisJc3RydWN0IHdvcmtfc3RydWN0CWlvX3dvcms7CS8qIHhmc2RhdGFkIHdvcmsgcXVldWUgKi8KK30geGZzX2lvZW5kX3Q7CisKKyNlbmRpZiAvKiBfX1hGU19JT1BTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwppbmRleCBkZjBjYmEyLi5lODJjZjcyIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKQEAgLTU0LDYgKzU0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiAjaW5jbHVkZSAieGZzX2xpbnV4LmgiCiAKQEAgLTY3LDcgKzY4LDcgQEAKIFNUQVRJQyB2b2lkIHBhZ2VidWZfZGVsd3JpX3F1ZXVlKHhmc19idWZfdCAqLCBpbnQpOwogCiBTVEFUSUMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnhmc2xvZ2Rfd29ya3F1ZXVlOwotU1RBVElDIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4ZnNkYXRhZF93b3JrcXVldWU7CitzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzZGF0YWRfd29ya3F1ZXVlOwogCiAvKgogICogUGFnZWJ1ZiBkZWJ1Z2dpbmcKQEAgLTU5MCw4ICs1OTEsMTAgQEAKIAkJUEJfU0VUX09XTkVSKHBiKTsKIAl9CiAKLQlpZiAocGItPnBiX2ZsYWdzICYgUEJGX1NUQUxFKQorCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfU1RBTEUpIHsKKwkJQVNTRVJUKChwYi0+cGJfZmxhZ3MgJiBfUEJGX0RFTFdSSV9RKSA9PSAwKTsKIAkJcGItPnBiX2ZsYWdzICY9IFBCRl9NQVBQRUQ7CisJfQogCVBCX1RSQUNFKHBiLCAiZ290X2xvY2siLCAwKTsKIAlYRlNfU1RBVFNfSU5DKHBiX2dldF9sb2NrZWQpOwogCXJldHVybiAocGIpOwpAQCAtNzAwLDI1ICs3MDMsNiBAQAogfQogCiAvKgotICogQ3JlYXRlIGEgc2tlbGV0YWwgcGFnZWJ1ZiAobm8gcGFnZXMgYXNzb2NpYXRlZCB3aXRoIGl0KS4KLSAqLwoteGZzX2J1Zl90ICoKLXBhZ2VidWZfbG9va3VwKAotCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsCi0JbG9mZl90CQkJaW9mZiwKLQlzaXplX3QJCQlpc2l6ZSwKLQlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQotewotCXhmc19idWZfdAkJKnBiOwotCi0JcGIgPSBwYWdlYnVmX2FsbG9jYXRlKGZsYWdzKTsKLQlpZiAocGIpIHsKLQkJX3BhZ2VidWZfaW5pdGlhbGl6ZShwYiwgdGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MpOwotCX0KLQlyZXR1cm4gcGI7Ci19Ci0KLS8qCiAgKiBJZiB3ZSBhcmUgbm90IGxvdyBvbiBtZW1vcnkgdGhlbiBkbyB0aGUgcmVhZGFoZWFkIGluIGEgZGVhZGxvY2sKICAqIHNhZmUgbWFubmVyLgogICovCkBAIC05MTMsMjIgKzg5NywyMyBAQAogCQkJZG9fZnJlZSA9IDA7CiAJCX0KIAotCQlpZiAocGItPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSkgewotCQkJcGItPnBiX2ZsYWdzIHw9IFBCRl9BU1lOQzsKLQkJCWF0b21pY19pbmMoJnBiLT5wYl9ob2xkKTsKLQkJCXBhZ2VidWZfZGVsd3JpX3F1ZXVlKHBiLCAwKTsKLQkJCWRvX2ZyZWUgPSAwOwotCQl9IGVsc2UgaWYgKHBiLT5wYl9mbGFncyAmIFBCRl9GU19NQU5BR0VEKSB7CisJCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfRlNfTUFOQUdFRCkgewogCQkJZG9fZnJlZSA9IDA7CiAJCX0KIAogCQlpZiAoZG9fZnJlZSkgeworCQkJQVNTRVJUKChwYi0+cGJfZmxhZ3MgJiAoUEJGX0RFTFdSSXxfUEJGX0RFTFdSSV9RKSkgPT0gMCk7CiAJCQlsaXN0X2RlbF9pbml0KCZwYi0+cGJfaGFzaF9saXN0KTsKIAkJCXNwaW5fdW5sb2NrKCZoYXNoLT5iaF9sb2NrKTsKIAkJCXBhZ2VidWZfZnJlZShwYik7CiAJCX0gZWxzZSB7CiAJCQlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CiAJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBDYXRjaCByZWZlcmVuY2UgY291bnQgbGVha3MKKwkJICovCisJCUFTU0VSVChhdG9taWNfcmVhZCgmcGItPnBiX2hvbGQpID49IDApOwogCX0KIH0KIApAQCAtMTAwNiwxMyArOTkxLDI0IEBACiAgKglwYWdlYnVmX3VubG9jawogICoKICAqCXBhZ2VidWZfdW5sb2NrIHJlbGVhc2VzIHRoZSBsb2NrIG9uIHRoZSBidWZmZXIgb2JqZWN0IGNyZWF0ZWQgYnkKLSAqCXBhZ2VidWZfbG9jayBvciBwYWdlYnVmX2NvbmRfbG9jayAobm90IGFueQotICoJcGlubmluZyBvZiB1bmRlcmx5aW5nIHBhZ2VzIGNyZWF0ZWQgYnkgcGFnZWJ1Zl9waW4pLgorICoJcGFnZWJ1Zl9sb2NrIG9yIHBhZ2VidWZfY29uZF9sb2NrIChub3QgYW55IHBpbm5pbmcgb2YgdW5kZXJseWluZyBwYWdlcworICoJY3JlYXRlZCBieSBwYWdlYnVmX3BpbikuCisgKgorICoJSWYgdGhlIGJ1ZmZlciBpcyBtYXJrZWQgZGVsd3JpIGJ1dCBpcyBub3QgcXVldWVkLCBkbyBzbyBiZWZvcmUgd2UKKyAqCXVubG9jayB0aGUgYnVmZmVyIGFzIHdlIG5lZWQgdG8gc2V0IGZsYWdzIGNvcnJlY3RseS4gV2UgYWxzbyBuZWVkIHRvCisgKgl0YWtlIGEgcmVmZXJlbmNlIGZvciB0aGUgZGVsd3JpIHF1ZXVlIGJlY2F1c2UgdGhlIHVubG9ja2VyIGlzIGdvaW5nIHRvCisgKglkcm9wIHRoZWlyJ3MgYW5kIHRoZXkgZG9uJ3Qga25vdyB3ZSBqdXN0IHF1ZXVlZCBpdC4KICAqLwogdm9pZAogcGFnZWJ1Zl91bmxvY2soCQkJCS8qIHVubG9jayBidWZmZXIJCSovCiAJeGZzX2J1Zl90CQkqcGIpCS8qIGJ1ZmZlciB0byB1bmxvY2sJCSovCiB7CisJaWYgKChwYi0+cGJfZmxhZ3MgJiAoUEJGX0RFTFdSSXxfUEJGX0RFTFdSSV9RKSkgPT0gUEJGX0RFTFdSSSkgeworCQlhdG9taWNfaW5jKCZwYi0+cGJfaG9sZCk7CisJCXBiLT5wYl9mbGFncyB8PSBQQkZfQVNZTkM7CisJCXBhZ2VidWZfZGVsd3JpX3F1ZXVlKHBiLCAwKTsKKwl9CisKIAlQQl9DTEVBUl9PV05FUihwYik7CiAJdXAoJnBiLT5wYl9zZW1hKTsKIAlQQl9UUkFDRShwYiwgInVubG9jayIsIDApOwpAQCAtMTI0OSw4ICsxMjQ1LDggQEAKIAlpbnQJCQllcnJvcikKIHsKIAl4ZnNfYnVmX3QJCSpwYiA9ICh4ZnNfYnVmX3QgKiliaW8tPmJpX3ByaXZhdGU7Ci0JdW5zaWduZWQgaW50CQlpLCBibG9ja3NpemUgPSBwYi0+cGJfdGFyZ2V0LT5wYnJfYnNpemU7Ci0Jc3RydWN0IGJpb192ZWMJCSpidmVjID0gYmlvLT5iaV9pb192ZWM7CisJdW5zaWduZWQgaW50CQlibG9ja3NpemUgPSBwYi0+cGJfdGFyZ2V0LT5wYnJfYnNpemU7CisJc3RydWN0IGJpb192ZWMJCSpidmVjID0gYmlvLT5iaV9pb192ZWMgKyBiaW8tPmJpX3ZjbnQgLSAxOwogCiAJaWYgKGJpby0+Ymlfc2l6ZSkKIAkJcmV0dXJuIDE7CkBAIC0xMjU4LDEwICsxMjU0LDEyIEBACiAJaWYgKCF0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKSkKIAkJcGItPnBiX2Vycm9yID0gRUlPOwogCi0JZm9yIChpID0gMDsgaSA8IGJpby0+YmlfdmNudDsgaSsrLCBidmVjKyspIHsKKwlkbyB7CiAJCXN0cnVjdCBwYWdlCSpwYWdlID0gYnZlYy0+YnZfcGFnZTsKIAotCQlpZiAocGItPnBiX2Vycm9yKSB7CisJCWlmICh1bmxpa2VseShwYi0+cGJfZXJyb3IpKSB7CisJCQlpZiAocGItPnBiX2ZsYWdzICYgUEJGX1JFQUQpCisJCQkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CiAJCQlTZXRQYWdlRXJyb3IocGFnZSk7CiAJCX0gZWxzZSBpZiAoYmxvY2tzaXplID09IFBBR0VfQ0FDSEVfU0laRSkgewogCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwpAQCAtMTI3MCwxMCArMTI2OCwxMyBAQAogCQkJc2V0X3BhZ2VfcmVnaW9uKHBhZ2UsIGJ2ZWMtPmJ2X29mZnNldCwgYnZlYy0+YnZfbGVuKTsKIAkJfQogCisJCWlmICgtLWJ2ZWMgPj0gYmlvLT5iaV9pb192ZWMpCisJCQlwcmVmZXRjaHcoJmJ2ZWMtPmJ2X3BhZ2UtPmZsYWdzKTsKKwogCQlpZiAoX3BhZ2VidWZfaW9sb2NrZWQocGIpKSB7CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJfQotCX0KKwl9IHdoaWxlIChidmVjID49IGJpby0+YmlfaW9fdmVjKTsKIAogCV9wYWdlYnVmX2lvZG9uZShwYiwgMSk7CiAJYmlvX3B1dChiaW8pOwpAQCAtMTUxMSw2ICsxNTEyLDExIEBACiAJCQlBU1NFUlQoYnRwID09IGJwLT5wYl90YXJnZXQpOwogCQkJaWYgKCEoYnAtPnBiX2ZsYWdzICYgUEJGX0ZTX01BTkFHRUQpKSB7CiAJCQkJc3Bpbl91bmxvY2soJmhhc2gtPmJoX2xvY2spOworCQkJCS8qCisJCQkJICogQ2F0Y2ggc3VwZXJibG9jayByZWZlcmVuY2UgY291bnQgbGVha3MKKwkJCQkgKiBpbW1lZGlhdGVseQorCQkJCSAqLworCQkJCUJVR19PTihicC0+cGJfYm4gPT0gMCk7CiAJCQkJZGVsYXkoMTAwKTsKIAkJCQlnb3RvIGFnYWluOwogCQkJfQpAQCAtMTY4NiwxNyArMTY5MiwyMCBAQAogCWludAkJCXVubG9jaykKIHsKIAlQQl9UUkFDRShwYiwgImRlbHdyaV9xIiwgKGxvbmcpdW5sb2NrKTsKLQlBU1NFUlQocGItPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSk7CisJQVNTRVJUKChwYi0+cGJfZmxhZ3MgJiAoUEJGX0RFTFdSSXxQQkZfQVNZTkMpKSA9PQorCQkJCQkoUEJGX0RFTFdSSXxQQkZfQVNZTkMpKTsKIAogCXNwaW5fbG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOwogCS8qIElmIGFscmVhZHkgaW4gdGhlIHF1ZXVlLCBkZXF1ZXVlIGFuZCBwbGFjZSBhdCB0YWlsICovCiAJaWYgKCFsaXN0X2VtcHR5KCZwYi0+cGJfbGlzdCkpIHsKKwkJQVNTRVJUKHBiLT5wYl9mbGFncyAmIF9QQkZfREVMV1JJX1EpOwogCQlpZiAodW5sb2NrKSB7CiAJCQlhdG9taWNfZGVjKCZwYi0+cGJfaG9sZCk7CiAJCX0KIAkJbGlzdF9kZWwoJnBiLT5wYl9saXN0KTsKIAl9CiAKKwlwYi0+cGJfZmxhZ3MgfD0gX1BCRl9ERUxXUklfUTsKIAlsaXN0X2FkZF90YWlsKCZwYi0+cGJfbGlzdCwgJnBiZF9kZWx3cml0ZV9xdWV1ZSk7CiAJcGItPnBiX3F1ZXVldGltZSA9IGppZmZpZXM7CiAJc3Bpbl91bmxvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKQEAgLTE3MTMsMTAgKzE3MjIsMTEgQEAKIAogCXNwaW5fbG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOwogCWlmICgocGItPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSkgJiYgIWxpc3RfZW1wdHkoJnBiLT5wYl9saXN0KSkgeworCQlBU1NFUlQocGItPnBiX2ZsYWdzICYgX1BCRl9ERUxXUklfUSk7CiAJCWxpc3RfZGVsX2luaXQoJnBiLT5wYl9saXN0KTsKIAkJZGVxdWV1ZWQgPSAxOwogCX0KLQlwYi0+cGJfZmxhZ3MgJj0gflBCRl9ERUxXUkk7CisJcGItPnBiX2ZsYWdzICY9IH4oUEJGX0RFTFdSSXxfUEJGX0RFTFdSSV9RKTsKIAlzcGluX3VubG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOwogCiAJaWYgKGRlcXVldWVkKQpAQCAtMTczMyw5ICsxNzQzLDcgQEAKIH0KIAogLyogRGVmaW5lcyBmb3IgcGFnZWJ1ZiBkYWVtb24gKi8KLVNUQVRJQyBERUNMQVJFX0NPTVBMRVRJT04oeGZzYnVmZF9kb25lKTsKIFNUQVRJQyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnhmc2J1ZmRfdGFzazsKLVNUQVRJQyBpbnQgeGZzYnVmZF9hY3RpdmU7CiBTVEFUSUMgaW50IHhmc2J1ZmRfZm9yY2VfZmx1c2g7CiBTVEFUSUMgaW50IHhmc2J1ZmRfZm9yY2Vfc2xlZXA7CiAKQEAgLTE3NjEsMTQgKzE3NjksOCBAQAogCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQ7CiAJeGZzX2J1Zl90CQkqcGIsICpuOwogCi0JLyogIFNldCB1cCB0aGUgdGhyZWFkICAqLwotCWRhZW1vbml6ZSgieGZzYnVmZCIpOwogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DOwogCi0JeGZzYnVmZF90YXNrID0gY3VycmVudDsKLQl4ZnNidWZkX2FjdGl2ZSA9IDE7Ci0JYmFycmllcigpOwotCiAJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CiAJZG8gewogCQlpZiAodW5saWtlbHkoZnJlZXppbmcoY3VycmVudCkpKSB7CkBAIC0xNzc4LDEwICsxNzgwLDEwIEBACiAJCQl4ZnNidWZkX2ZvcmNlX3NsZWVwID0gMDsKIAkJfQogCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoKHhmc19idWZfdGltZXJfY2VudGlzZWNzICogSFopIC8gMTAwKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlCisJCQkoeGZzX2J1Zl90aW1lcl9jZW50aXNlY3MgKiBtc2Vjc190b19qaWZmaWVzKDEwKSk7CiAKLQkJYWdlID0gKHhmc19idWZfYWdlX2NlbnRpc2VjcyAqIEhaKSAvIDEwMDsKKwkJYWdlID0geGZzX2J1Zl9hZ2VfY2VudGlzZWNzICogbXNlY3NfdG9famlmZmllcygxMCk7CiAJCXNwaW5fbG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZwYmRfZGVsd3JpdGVfcXVldWUsIHBiX2xpc3QpIHsKIAkJCVBCX1RSQUNFKHBiLCAid2Fsa3ExIiwgKGxvbmcpcGFnZWJ1Zl9pc3BpbihwYikpOwpAQCAtMTc5NSw3ICsxNzk3LDcgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCi0JCQkJcGItPnBiX2ZsYWdzICY9IH5QQkZfREVMV1JJOworCQkJCXBiLT5wYl9mbGFncyAmPSB+KFBCRl9ERUxXUkl8X1BCRl9ERUxXUklfUSk7CiAJCQkJcGItPnBiX2ZsYWdzIHw9IFBCRl9XUklURTsKIAkJCQlsaXN0X21vdmUoJnBiLT5wYl9saXN0LCAmdG1wKTsKIAkJCX0KQEAgLTE4MTYsOSArMTgxOCw5IEBACiAJCQlwdXJnZV9hZGRyZXNzZXMoKTsKIAogCQl4ZnNidWZkX2ZvcmNlX2ZsdXNoID0gMDsKLQl9IHdoaWxlICh4ZnNidWZkX2FjdGl2ZSk7CisJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CiAKLQljb21wbGV0ZV9hbmRfZXhpdCgmeGZzYnVmZF9kb25lLCAwKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE4NDUsMTUgKzE4NDcsMTMgQEAKIAkJaWYgKHBiLT5wYl90YXJnZXQgIT0gdGFyZ2V0KQogCQkJY29udGludWU7CiAKLQkJQVNTRVJUKHBiLT5wYl9mbGFncyAmIFBCRl9ERUxXUkkpOworCQlBU1NFUlQocGItPnBiX2ZsYWdzICYgKFBCRl9ERUxXUkl8X1BCRl9ERUxXUklfUSkpOwogCQlQQl9UUkFDRShwYiwgIndhbGtxMiIsIChsb25nKXBhZ2VidWZfaXNwaW4ocGIpKTsKIAkJaWYgKHBhZ2VidWZfaXNwaW4ocGIpKSB7CiAJCQlwaW5jb3VudCsrOwogCQkJY29udGludWU7CiAJCX0KIAotCQlwYi0+cGJfZmxhZ3MgJj0gflBCRl9ERUxXUkk7Ci0JCXBiLT5wYl9mbGFncyB8PSBQQkZfV1JJVEU7CiAJCWxpc3RfbW92ZSgmcGItPnBiX2xpc3QsICZ0bXApOwogCX0KIAlzcGluX3VubG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOwpAQCAtMTg2MiwxMiArMTg2MiwxNCBAQAogCSAqIERyb3BwZWQgdGhlIGRlbGF5ZWQgd3JpdGUgbGlzdCBsb2NrLCBub3cgd2FsayB0aGUgdGVtcG9yYXJ5IGxpc3QKIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZ0bXAsIHBiX2xpc3QpIHsKKwkJcGFnZWJ1Zl9sb2NrKHBiKTsKKwkJcGItPnBiX2ZsYWdzICY9IH4oUEJGX0RFTFdSSXxfUEJGX0RFTFdSSV9RKTsKKwkJcGItPnBiX2ZsYWdzIHw9IFBCRl9XUklURTsKIAkJaWYgKHdhaXQpCiAJCQlwYi0+cGJfZmxhZ3MgJj0gflBCRl9BU1lOQzsKIAkJZWxzZQogCQkJbGlzdF9kZWxfaW5pdCgmcGItPnBiX2xpc3QpOwogCi0JCXBhZ2VidWZfbG9jayhwYik7CiAJCXBhZ2VidWZfaW9zdHJhdGVneShwYik7CiAJfQogCkBAIC0xOTAxLDkgKzE5MDMsMTEgQEAKIAlpZiAoIXhmc2RhdGFkX3dvcmtxdWV1ZSkKIAkJZ290byBvdXRfZGVzdHJveV94ZnNsb2dkX3dvcmtxdWV1ZTsKIAotCWVycm9yID0ga2VybmVsX3RocmVhZCh4ZnNidWZkLCBOVUxMLCBDTE9ORV9GU3xDTE9ORV9GSUxFUyk7Ci0JaWYgKGVycm9yIDwgMCkKKwl4ZnNidWZkX3Rhc2sgPSBrdGhyZWFkX3J1bih4ZnNidWZkLCBOVUxMLCAieGZzYnVmZCIpOworCWlmIChJU19FUlIoeGZzYnVmZF90YXNrKSkgeworCQllcnJvciA9IFBUUl9FUlIoeGZzYnVmZF90YXNrKTsKIAkJZ290byBvdXRfZGVzdHJveV94ZnNkYXRhZF93b3JrcXVldWU7CisJfQogCXJldHVybiAwOwogCiAgb3V0X2Rlc3Ryb3lfeGZzZGF0YWRfd29ya3F1ZXVlOgpAQCAtMTkyMCwxMCArMTkyNCw3IEBACiBTVEFUSUMgdm9pZAogeGZzX2J1Zl9kYWVtb25zX3N0b3Aodm9pZCkKIHsKLQl4ZnNidWZkX2FjdGl2ZSA9IDA7Ci0JYmFycmllcigpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJnhmc2J1ZmRfZG9uZSk7Ci0KKwlrdGhyZWFkX3N0b3AoeGZzYnVmZF90YXNrKTsKIAlkZXN0cm95X3dvcmtxdWV1ZSh4ZnNsb2dkX3dvcmtxdWV1ZSk7CiAJZGVzdHJveV93b3JrcXVldWUoeGZzZGF0YWRfd29ya3F1ZXVlKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKaW5kZXggM2Y4ZjY5YS4uNjdjMTlmNyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKQEAgLTg5LDYgKzg5LDcgQEAKIAlfUEJGX1BBR0VfQ0FDSEUgPSAoMSA8PCAxNyksLyogYmFja2VkIGJ5IHBhZ2VjYWNoZQkJICAgKi8KIAlfUEJGX0tNRU1fQUxMT0MgPSAoMSA8PCAxOCksLyogYmFja2VkIGJ5IGttZW1fYWxsb2MoKQkJICAgKi8KIAlfUEJGX1JVTl9RVUVVRVMgPSAoMSA8PCAxOSksLyogcnVuIGJsb2NrIGRldmljZSB0YXNrIHF1ZXVlCSAgICovCisJX1BCRl9ERUxXUklfUSA9ICgxIDw8IDIxKSwgICAvKiBidWZmZXIgb24gZGVsd3JpIHF1ZXVlCQkgICAqLwogfSBwYWdlX2J1Zl9mbGFnc190OwogCiAjZGVmaW5lIFBCRl9VUERBVEUgKFBCRl9SRUFEIHwgUEJGX1dSSVRFKQpAQCAtMjA2LDEzICsyMDcsNiBAQAogI2RlZmluZSB4ZnNfYnVmX3JlYWQodGFyZ2V0LCBibGtubywgbGVuLCBmbGFncykgXAogCXhmc19idWZfcmVhZF9mbGFncygodGFyZ2V0KSwgKGJsa25vKSwgKGxlbiksIFBCRl9MT0NLIHwgUEJGX01BUFBFRCkKIAotZXh0ZXJuIHhmc19idWZfdCAqcGFnZWJ1Zl9sb29rdXAoCi0JCXhmc19idWZ0YXJnX3QgKiwKLQkJbG9mZl90LAkJCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZQkqLwotCQlzaXplX3QsCQkJLyogbGVuZ3RoIG9mIHJhbmdlCQkqLwotCQlwYWdlX2J1Zl9mbGFnc190KTsJLyogUEJGX1JFQUQsIFBCRl9XUklURSwJCSovCi0JCQkJCS8qIFBCRl9GT1JDRUlPLCAJCSovCi0KIGV4dGVybiB4ZnNfYnVmX3QgKnBhZ2VidWZfZ2V0X2VtcHR5KAkvKiBhbGxvY2F0ZSBwYWdlYnVmIHN0cnVjdCB3aXRoCSovCiAJCQkJCS8qICBubyBtZW1vcnkgb3IgZGlzayBhZGRyZXNzCSovCiAJCXNpemVfdCBsZW4sCkBAIC0zNDQsOCArMzM4LDYgQEAKIAogCiAKLQotCiAvKiBUaGVzZSBhcmUganVzdCBmb3IgeGZzX3N5bmNzdWIuLi4gaXQgc2V0cyBhbiBpbnRlcm5hbCB2YXJpYWJsZQogICogdGhlbiBwYXNzZXMgaXQgdG8gVk9QX0ZMVVNIX1BBR0VTIG9yIGFkZHMgdGhlIGZsYWdzIHRvIGEgbmV3bHkgZ290dGVuIGJ1Zl90CiAgKi8KQEAgLTQ1Miw3ICs0NDQsNyBAQAogCiAjZGVmaW5lIFhGU19CVUZfUFRSKGJwKQkJKHhmc19jYWRkcl90KSgoYnApLT5wYl9hZGRyKQogCi1leHRlcm4gaW5saW5lIHhmc19jYWRkcl90IHhmc19idWZfb2Zmc2V0KHhmc19idWZfdCAqYnAsIHNpemVfdCBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHhmc19jYWRkcl90IHhmc19idWZfb2Zmc2V0KHhmc19idWZfdCAqYnAsIHNpemVfdCBvZmZzZXQpCiB7CiAJaWYgKGJwLT5wYl9mbGFncyAmIFBCRl9NQVBQRUQpCiAJCXJldHVybiBYRlNfQlVGX1BUUihicCkgKyBvZmZzZXQ7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKaW5kZXggZjFjZTQzMi4uMzg4MTYyMiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwpAQCAtMzExLDYgKzMxMSwzMSBAQAogCiAjZGVmaW5lIG5leHRkcChkcCkgICAgICAoKHN0cnVjdCB4ZnNfZGlyZW50ICopKChjaGFyICopKGRwKSArIChkcCktPmRfcmVjbGVuKSkKIAorI2lmZGVmIENPTkZJR19YRlNfRE1BUEkKKworU1RBVElDIHN0cnVjdCBwYWdlICoKK2xpbnZmc19maWxlbWFwX25vcGFnZSgKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QJKmFyZWEsCisJdW5zaWduZWQgbG9uZwkJYWRkcmVzcywKKwlpbnQJCQkqdHlwZSkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gYXJlYS0+dm1fZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJeGZzX21vdW50X3QJKm1wID0gWEZTX1ZGU1RPTSh2cC0+dl92ZnNwKTsKKwlpbnQJCWVycm9yOworCisJQVNTRVJUX0FMV0FZUyh2cC0+dl92ZnNwLT52ZnNfZmxhZyAmIFZGU19ETUkpOworCisJZXJyb3IgPSBYRlNfU0VORF9NTUFQKG1wLCBhcmVhLCAwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGZpbGVtYXBfbm9wYWdlKGFyZWEsIGFkZHJlc3MsIHR5cGUpOworfQorCisjZW5kaWYgLyogQ09ORklHX1hGU19ETUFQSSAqLworCisKIFNUQVRJQyBpbnQKIGxpbnZmc19yZWFkZGlyKAogCXN0cnVjdCBmaWxlCSpmaWxwLApAQCAtMzkwLDE0ICs0MTUsNiBAQAogCXJldHVybiAtZXJyb3I7CiB9CiAKLSNpZmRlZiBDT05GSUdfWEZTX0RNQVBJCi1TVEFUSUMgdm9pZAotbGludmZzX21tYXBfY2xvc2UoCi0Jc3RydWN0IHZtX2FyZWFfc3RydWN0CSp2bWEpCi17Ci0JeGZzX2RtX21tX3B1dCh2bWEpOwotfQotI2VuZGlmIC8qIENPTkZJR19YRlNfRE1BUEkgKi8KIAogU1RBVElDIGludAogbGludmZzX2ZpbGVfbW1hcCgKQEAgLTQxMSwxNiArNDI4LDExIEBACiAKIAl2bWEtPnZtX29wcyA9ICZsaW52ZnNfZmlsZV92bV9vcHM7CiAKLQlpZiAodnAtPnZfdmZzcC0+dmZzX2ZsYWcgJiBWRlNfRE1JKSB7Ci0JCXhmc19tb3VudF90CSptcCA9IFhGU19WRlNUT00odnAtPnZfdmZzcCk7Ci0KLQkJZXJyb3IgPSAtWEZTX1NFTkRfTU1BUChtcCwgdm1hLCAwKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwogI2lmZGVmIENPTkZJR19YRlNfRE1BUEkKKwlpZiAodnAtPnZfdmZzcC0+dmZzX2ZsYWcgJiBWRlNfRE1JKSB7CiAJCXZtYS0+dm1fb3BzID0gJmxpbnZmc19kbWFwaV9maWxlX3ZtX29wczsKLSNlbmRpZgogCX0KKyNlbmRpZiAvKiBDT05GSUdfWEZTX0RNQVBJICovCiAKIAlWT1BfU0VUQVRUUih2cCwgJnZhLCBYRlNfQVRfVVBEQVRJTUUsIE5VTEwsIGVycm9yKTsKIAlpZiAoIWVycm9yKQpAQCAtNDc0LDYgKzQ4Niw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCisjaWZkZWYgQ09ORklHX1hGU19ETUFQSQogI2lmZGVmIEhBVkVfVk1PUF9NUFJPVEVDVAogU1RBVElDIGludAogbGludmZzX21wcm90ZWN0KApAQCAtNDk0LDYgKzUwNyw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogI2VuZGlmIC8qIEhBVkVfVk1PUF9NUFJPVEVDVCAqLworI2VuZGlmIC8qIENPTkZJR19YRlNfRE1BUEkgKi8KIAogI2lmZGVmIEhBVkVfRk9QX09QRU5fRVhFQwogLyogSWYgdGhlIHVzZXIgaXMgYXR0ZW1wdGluZyB0byBleGVjdXRlIGEgZmlsZSB0aGF0IGlzIG9mZmxpbmUgdGhlbgpAQCAtNTI4LDQ5ICs1NDIsMTAgQEAKIH0KICNlbmRpZiAvKiBIQVZFX0ZPUF9PUEVOX0VYRUMgKi8KIAotLyoKLSAqIFRlbXBvcmFyeSB3b3JrYXJvdW5kIHRvIHRoZSBBSU8gZGlyZWN0IElPIHdyaXRlIHByb2JsZW0uCi0gKiBUaGlzIGNvZGUgY2FuIGdvIGFuZCB3ZSBjYW4gcmV2ZXJ0IHRvIGRvX3N5bmNfd3JpdGUgb25jZQotICogdGhlIHdyaXRlcGFnZShzKSByZXdvcmsgaXMgbWVyZ2VkLgotICovCi1TVEFUSUMgc3NpemVfdAotbGludmZzX3dyaXRlKAotCXN0cnVjdCBmaWxlCSpmaWxwLAotCWNvbnN0IGNoYXIJX191c2VyICpidWYsCi0Jc2l6ZV90CQlsZW4sCi0JbG9mZl90CQkqcHBvcykKLXsKLQlzdHJ1Y3Qga2lvY2IJa2lvY2I7Ci0Jc3NpemVfdAkJcmV0OwotCi0JaW5pdF9zeW5jX2tpb2NiKCZraW9jYiwgZmlscCk7Ci0Ja2lvY2Iua2lfcG9zID0gKnBwb3M7Ci0JcmV0ID0gX19saW52ZnNfd3JpdGUoJmtpb2NiLCBidWYsIDAsIGxlbiwga2lvY2Iua2lfcG9zKTsKLQkqcHBvcyA9IGtpb2NiLmtpX3BvczsKLQlyZXR1cm4gcmV0OwotfQotU1RBVElDIHNzaXplX3QKLWxpbnZmc193cml0ZV9pbnZpcygKLQlzdHJ1Y3QgZmlsZQkqZmlscCwKLQljb25zdCBjaGFyCV9fdXNlciAqYnVmLAotCXNpemVfdAkJbGVuLAotCWxvZmZfdAkJKnBwb3MpCi17Ci0Jc3RydWN0IGtpb2NiCWtpb2NiOwotCXNzaXplX3QJCXJldDsKLQotCWluaXRfc3luY19raW9jYigma2lvY2IsIGZpbHApOwotCWtpb2NiLmtpX3BvcyA9ICpwcG9zOwotCXJldCA9IF9fbGludmZzX3dyaXRlKCZraW9jYiwgYnVmLCBJT19JTlZJUywgbGVuLCBraW9jYi5raV9wb3MpOwotCSpwcG9zID0ga2lvY2Iua2lfcG9zOwotCXJldHVybiByZXQ7Ci19Ci0KLQogc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsaW52ZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIAkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLndyaXRlCQk9IGxpbnZmc193cml0ZSwKKwkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKIAkucmVhZHYJCT0gbGludmZzX3JlYWR2LAogCS53cml0ZXYJCT0gbGludmZzX3dyaXRldiwKIAkuYWlvX3JlYWQJPSBsaW52ZnNfYWlvX3JlYWQsCkBAIC01OTIsNyArNTY3LDcgQEAKIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGludmZzX2ludmlzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiAJLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS53cml0ZQkJPSBsaW52ZnNfd3JpdGVfaW52aXMsCisJLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCiAJLnJlYWR2CQk9IGxpbnZmc19yZWFkdl9pbnZpcywKIAkud3JpdGV2CQk9IGxpbnZmc193cml0ZXZfaW52aXMsCiAJLmFpb19yZWFkCT0gbGludmZzX2Fpb19yZWFkX2ludmlzLApAQCAtNjI2LDggKzYwMSw3IEBACiAKICNpZmRlZiBDT05GSUdfWEZTX0RNQVBJCiBzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGxpbnZmc19kbWFwaV9maWxlX3ZtX29wcyA9IHsKLQkuY2xvc2UJCT0gbGludmZzX21tYXBfY2xvc2UsCi0JLm5vcGFnZQkJPSBmaWxlbWFwX25vcGFnZSwKKwkubm9wYWdlCQk9IGxpbnZmc19maWxlbWFwX25vcGFnZSwKIAkucG9wdWxhdGUJPSBmaWxlbWFwX3BvcHVsYXRlLAogI2lmZGVmIEhBVkVfVk1PUF9NUFJPVEVDVAogCS5tcHJvdGVjdAk9IGxpbnZmc19tcHJvdGVjdCwKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCmluZGV4IDA1YTQ0N2UuLjZhMzMyNmIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYwpAQCAtMTQxLDEzICsxNDEsMTkgQEAKIAkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKIAl9CiAKLQkvKiB3ZSBuZWVkIHRoZSB2bm9kZSAqLwotCXZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7Ci0JaWYgKHZwLT52X3R5cGUgIT0gVlJFRyAmJiB2cC0+dl90eXBlICE9IFZESVIgJiYgdnAtPnZfdHlwZSAhPSBWTE5LKSB7CisJc3dpdGNoIChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGUkVHOgorCWNhc2UgU19JRkRJUjoKKwljYXNlIFNfSUZMTks6CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gLVhGU19FUlJPUihFQkFERik7CiAJfQogCisJLyogd2UgbmVlZCB0aGUgdm5vZGUgKi8KKwl2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCiAJLyogbm93IHdlIGNhbiBncmFiIHRoZSBmc2lkICovCiAJbWVtY3B5KCZoYW5kbGUuaGFfZnNpZCwgdnAtPnZfdmZzcC0+dmZzX2FsdGZzaWQsIHNpemVvZih4ZnNfZnNpZF90KSk7CiAJaHNpemUgPSBzaXplb2YoeGZzX2ZzaWRfdCk7CkBAIC0zODYsNyArMzkyLDcgQEAKIAkJcmV0dXJuIC1lcnJvcjsKIAogCS8qIFJlc3RyaWN0IHRoaXMgaGFuZGxlIG9wZXJhdGlvbiB0byBzeW1saW5rcyBvbmx5LiAqLwotCWlmICh2cC0+dl90eXBlICE9IFZMTkspIHsKKwlpZiAoIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKIAkJVk5fUkVMRSh2cCk7CiAJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CiAJfQpAQCAtOTgyLDEwICs5ODgsMTAgQEAKIAlpZiAodnAtPnZfaW5vZGUuaV9mbGFncyAmIChTX0lNTVVUQUJMRXxTX0FQUEVORCkpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVQRVJNKTsKIAotCWlmICghKGZpbHAtPmZfZmxhZ3MgJiBGTU9ERV9XUklURSkpCisJaWYgKCEoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQogCQlyZXR1cm4gLVhGU19FUlJPUihFQkFERik7CiAKLQlpZiAodnAtPnZfdHlwZSAhPSBWUkVHKQorCWlmICghVk5fSVNSRUcodnApKQogCQlyZXR1cm4gLVhGU19FUlJPUihFSU5WQUwpOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZiZiwgYXJnLCBzaXplb2YoYmYpKSkKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYwppbmRleCAwZjhmMTM4Li40NjM2YjdmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jCkBAIC00Nyw4ICs0Nyw1MiBAQAogI2luY2x1ZGUgInhmc192bm9kZS5oIgogI2luY2x1ZGUgInhmc19kZnJhZy5oIgogCisjZGVmaW5lICBfTkFUSVZFX0lPQyhjbWQsIHR5cGUpIFwKKwkgIF9JT0MoX0lPQ19ESVIoY21kKSwgX0lPQ19UWVBFKGNtZCksIF9JT0NfTlIoY21kKSwgc2l6ZW9mKHR5cGUpKQorCiAjaWYgZGVmaW5lZChDT05GSUdfSUE2NCkgfHwgZGVmaW5lZChDT05GSUdfWDg2XzY0KQogI2RlZmluZSBCUk9LRU5fWDg2X0FMSUdOTUVOVAorLyogb24gaWEzMiBsX3N0YXJ0IGlzIG9uIGEgMzItYml0IGJvdW5kYXJ5ICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZmxvY2s2NF8zMiB7CisJX19zMTYJCWxfdHlwZTsKKwlfX3MxNgkJbF93aGVuY2U7CisJX19zNjQJCWxfc3RhcnQJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisJCQkvKiBsZW4gPT0gMCBtZWFucyB1bnRpbCBlbmQgb2YgZmlsZSAqLworCV9fczY0CQlsX2xlbiBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwlfX3MzMgkJbF9zeXNpZDsKKwlfX3UzMgkJbF9waWQ7CisJX19zMzIJCWxfcGFkWzRdOwkvKiByZXNlcnZlIGFyZWEgKi8KK30geGZzX2Zsb2NrNjRfMzJfdDsKKworI2RlZmluZSBYRlNfSU9DX0FMTE9DU1BfMzIJX0lPVyAoJ1gnLCAxMCwgc3RydWN0IHhmc19mbG9jazY0XzMyKQorI2RlZmluZSBYRlNfSU9DX0ZSRUVTUF8zMglfSU9XICgnWCcsIDExLCBzdHJ1Y3QgeGZzX2Zsb2NrNjRfMzIpCisjZGVmaW5lIFhGU19JT0NfQUxMT0NTUDY0XzMyCV9JT1cgKCdYJywgMzYsIHN0cnVjdCB4ZnNfZmxvY2s2NF8zMikKKyNkZWZpbmUgWEZTX0lPQ19GUkVFU1A2NF8zMglfSU9XICgnWCcsIDM3LCBzdHJ1Y3QgeGZzX2Zsb2NrNjRfMzIpCisjZGVmaW5lIFhGU19JT0NfUkVTVlNQXzMyCV9JT1cgKCdYJywgNDAsIHN0cnVjdCB4ZnNfZmxvY2s2NF8zMikKKyNkZWZpbmUgWEZTX0lPQ19VTlJFU1ZTUF8zMglfSU9XICgnWCcsIDQxLCBzdHJ1Y3QgeGZzX2Zsb2NrNjRfMzIpCisjZGVmaW5lIFhGU19JT0NfUkVTVlNQNjRfMzIJX0lPVyAoJ1gnLCA0Miwgc3RydWN0IHhmc19mbG9jazY0XzMyKQorI2RlZmluZSBYRlNfSU9DX1VOUkVTVlNQNjRfMzIJX0lPVyAoJ1gnLCA0Mywgc3RydWN0IHhmc19mbG9jazY0XzMyKQorCisvKiBqdXN0IGFjY291bnQgZm9yIGRpZmZlcmVudCBhbGlnbm1lbnQgKi8KK1NUQVRJQyB1bnNpZ25lZCBsb25nCit4ZnNfaW9jdGwzMl9mbG9jaygKKwl1bnNpZ25lZCBsb25nCQlhcmcpCit7CisJeGZzX2Zsb2NrNjRfMzJfdAlfX3VzZXIgKnAzMiA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwl4ZnNfZmxvY2s2NF90CQlfX3VzZXIgKnAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKKworCWlmIChjb3B5X2luX3VzZXIoJnAtPmxfdHlwZSwJJnAzMi0+bF90eXBlLAlzaXplb2YoczE2KSkgfHwKKwkgICAgY29weV9pbl91c2VyKCZwLT5sX3doZW5jZSwJJnAzMi0+bF93aGVuY2UsIHNpemVvZihzMTYpKSB8fAorCSAgICBjb3B5X2luX3VzZXIoJnAtPmxfc3RhcnQsCSZwMzItPmxfc3RhcnQsCXNpemVvZihzNjQpKSB8fAorCSAgICBjb3B5X2luX3VzZXIoJnAtPmxfbGVuLAkmcDMyLT5sX2xlbiwJc2l6ZW9mKHM2NCkpIHx8CisJICAgIGNvcHlfaW5fdXNlcigmcC0+bF9zeXNpZCwJJnAzMi0+bF9zeXNpZCwJc2l6ZW9mKHMzMikpIHx8CisJICAgIGNvcHlfaW5fdXNlcigmcC0+bF9waWQsCSZwMzItPmxfcGlkLAlzaXplb2YodTMyKSkgfHwKKwkgICAgY29weV9pbl91c2VyKCZwLT5sX3BhZCwJJnAzMi0+bF9wYWQsCTQqc2l6ZW9mKHUzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcDsKK30KKwogI2Vsc2UKIAogdHlwZWRlZiBzdHJ1Y3QgeGZzX2Zzb3BfYnVsa3JlcTMyIHsKQEAgLTEwMyw3ICsxNDcsNiBAQAogLyogbm90IGhhbmRsZWQKIAljYXNlIFhGU19JT0NfRkRfVE9fSEFORExFOgogCWNhc2UgWEZTX0lPQ19QQVRIX1RPX0hBTkRMRToKLQljYXNlIFhGU19JT0NfUEFUSF9UT19IQU5ETEU6CiAJY2FzZSBYRlNfSU9DX1BBVEhfVE9fRlNIQU5ETEU6CiAJY2FzZSBYRlNfSU9DX09QRU5fQllfSEFORExFOgogCWNhc2UgWEZTX0lPQ19GU1NFVERNX0JZX0hBTkRMRToKQEAgLTEyNCw4ICsxNjcsMjEgQEAKIAljYXNlIFhGU19JT0NfRVJST1JfQ0xFQVJBTEw6CiAJCWJyZWFrOwogCi0jaWZuZGVmIEJST0tFTl9YODZfQUxJR05NRU5UCi0JLyogeGZzX2Zsb2NrX3QgYW5kIHhmc19ic3RhdF90IGhhdmUgd3JvbmcgdTMyIHZzIHU2NCBhbGlnbm1lbnQgKi8KKyNpZmRlZiBCUk9LRU5fWDg2X0FMSUdOTUVOVAorCS8qIHhmc19mbG9ja190IGhhcyB3cm9uZyB1MzIgdnMgdTY0IGFsaWdubWVudCAqLworCWNhc2UgWEZTX0lPQ19BTExPQ1NQXzMyOgorCWNhc2UgWEZTX0lPQ19GUkVFU1BfMzI6CisJY2FzZSBYRlNfSU9DX0FMTE9DU1A2NF8zMjoKKwljYXNlIFhGU19JT0NfRlJFRVNQNjRfMzI6CisJY2FzZSBYRlNfSU9DX1JFU1ZTUF8zMjoKKwljYXNlIFhGU19JT0NfVU5SRVNWU1BfMzI6CisJY2FzZSBYRlNfSU9DX1JFU1ZTUDY0XzMyOgorCWNhc2UgWEZTX0lPQ19VTlJFU1ZTUDY0XzMyOgorCQlhcmcgPSB4ZnNfaW9jdGwzMl9mbG9jayhhcmcpOworCQljbWQgPSBfTkFUSVZFX0lPQyhjbWQsIHN0cnVjdCB4ZnNfZmxvY2s2NCk7CisJCWJyZWFrOworCisjZWxzZSAvKiBUaGVzZSBhcmUgaGFuZGxlZCBmaW5lIGlmIG5vIGFsaWdubWVudCBpc3N1ZXMgKi8KIAljYXNlIFhGU19JT0NfQUxMT0NTUDoKIAljYXNlIFhGU19JT0NfRlJFRVNQOgogCWNhc2UgWEZTX0lPQ19SRVNWU1A6CkBAIC0xMzQsNiArMTkwLDkgQEAKIAljYXNlIFhGU19JT0NfRlJFRVNQNjQ6CiAJY2FzZSBYRlNfSU9DX1JFU1ZTUDY0OgogCWNhc2UgWEZTX0lPQ19VTlJFU1ZTUDY0OgorCQlicmVhazsKKworCS8qIHhmc19ic3RhdF90IHN0aWxsIGhhcyB3cm9uZyB1MzIgdnMgdTY0IGFsaWdubWVudCAqLwogCWNhc2UgWEZTX0lPQ19TV0FQRVhUOgogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCmluZGV4IGYyNTI2MDUuLjc3NzA4YTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKQEAgLTE0MCw3ICsxNDAsNiBAQAogCiAJbWVtc2V0KCZ2YSwgMCwgc2l6ZW9mKHZhKSk7CiAJdmEudmFfbWFzayA9IFhGU19BVF9UWVBFfFhGU19BVF9NT0RFOwotCXZhLnZhX3R5cGUgPSBJRlRPVlQobW9kZSk7CiAJdmEudmFfbW9kZSA9IG1vZGU7CiAKIAlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKQEAgLTMwOCwxNCArMzA3LDEzIEBACiAJY3ZwID0gTlVMTDsKIAogCW1lbXNldCgmdmEsIDAsIHNpemVvZih2YSkpOwotCXZhLnZhX3R5cGUgPSBWTE5LOwotCXZhLnZhX21vZGUgPSBpcml4X3N5bWxpbmtfbW9kZSA/IDA3NzcgJiB+Y3VycmVudC0+ZnMtPnVtYXNrIDogU19JUldYVUdPOworCXZhLnZhX21vZGUgPSBTX0lGTE5LIHwKKwkJKGlyaXhfc3ltbGlua19tb2RlID8gMDc3NyAmIH5jdXJyZW50LT5mcy0+dW1hc2sgOiBTX0lSV1hVR08pOwogCXZhLnZhX21hc2sgPSBYRlNfQVRfVFlQRXxYRlNfQVRfTU9ERTsKIAogCWVycm9yID0gMDsKIAlWT1BfU1lNTElOSyhkdnAsIGRlbnRyeSwgJnZhLCAoY2hhciAqKXN5bW5hbWUsICZjdnAsIE5VTEwsIGVycm9yKTsKIAlpZiAoIWVycm9yICYmIGN2cCkgewotCQlBU1NFUlQoY3ZwLT52X3R5cGUgPT0gVkxOSyk7CiAJCWlwID0gTElOVkZTX0dFVF9JUChjdnApOwogCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaXApOwogCQl2YWxpZGF0ZV9maWVsZHMoZGlyKTsKQEAgLTQyNSw5ICs0MjMsMTQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgbGludmZzX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQsIHZvaWQgKnApCitTVEFUSUMgdm9pZAorbGludmZzX3B1dF9saW5rKAorCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwKKwlzdHJ1Y3QgbmFtZWlkYXRhICpuZCwKKwl2b2lkCQkqcCkKIHsKLQljaGFyICpzID0gbmRfZ2V0X2xpbmsobmQpOworCWNoYXIJCSpzID0gbmRfZ2V0X2xpbmsobmQpOworCiAJaWYgKCFJU19FUlIocykpCiAJCWtmcmVlKHMpOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKaW5kZXggNDJkYzVlNC4uNjhjNWQ4OCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oCkBAIC02NCw3ICs2NCw2IEBACiAjaW5jbHVkZSA8c2VtYS5oPgogI2luY2x1ZGUgPHRpbWUuaD4KIAotI2luY2x1ZGUgPHN1cHBvcnQvcXNvcnQuaD4KICNpbmNsdWRlIDxzdXBwb3J0L2t0cmFjZS5oPgogI2luY2x1ZGUgPHN1cHBvcnQvZGVidWcuaD4KICNpbmNsdWRlIDxzdXBwb3J0L21vdmUuaD4KQEAgLTEwNCw2ICsxMDMsNyBAQAogI2luY2x1ZGUgPHhmc19zdGF0cy5oPgogI2luY2x1ZGUgPHhmc19zeXNjdGwuaD4KICNpbmNsdWRlIDx4ZnNfaW9wcy5oPgorI2luY2x1ZGUgPHhmc19hb3BzLmg+CiAjaW5jbHVkZSA8eGZzX3N1cGVyLmg+CiAjaW5jbHVkZSA8eGZzX2dsb2JhbHMuaD4KICNpbmNsdWRlIDx4ZnNfZnNfc3Vici5oPgpAQCAtMjU0LDExICsyNTQsMTggQEAKICNkZWZpbmUgTUFYKGEsYikJKG1heChhLGIpKQogI2RlZmluZSBob3dtYW55KHgsIHkpCSgoKHgpKygoeSktMSkpLyh5KSkKICNkZWZpbmUgcm91bmR1cCh4LCB5KQkoKCgoeCkrKCh5KS0xKSkvKHkpKSooeSkpCisjZGVmaW5lIHFzb3J0KGEsbixzLGZuKQlzb3J0KGEsbixzLGZuLE5VTEwpCiAKKy8qCisgKiBWYXJpb3VzIHBsYXRmb3JtIGRlcGVuZGVudCBjYWxscyB0aGF0IGRvbid0IGZpdCBhbnl3aGVyZSBlbHNlCisgKi8KICNkZWZpbmUgeGZzX3N0YWNrX3RyYWNlKCkJZHVtcF9zdGFjaygpCi0KICNkZWZpbmUgeGZzX2l0cnVuY2F0ZV9kYXRhKGlwLCBvZmYpCVwKIAkoLXZtdHJ1bmNhdGUoTElOVkZTX0dFVF9JUChYRlNfSVRPVihpcCkpLCAob2ZmKSkpCisjZGVmaW5lIHhmc19zdGF0dmZzX2ZzaWQoc3RhdHAsIG1wKQlcCisJKHsgdTY0IGlkID0gaHVnZV9lbmNvZGVfZGV2KChtcCktPm1fZGV2KTsJXAorCSAgIF9fa2VybmVsX2ZzaWRfdCAqZnNpZCA9ICYoc3RhdHApLT5mX2ZzaWQ7CVwKKwkoZnNpZC0+dmFsWzBdID0gKHUzMilpZCwgZnNpZC0+dmFsWzFdID0gKHUzMikoaWQgPj4gMzIpKTsgfSkKIAogCiAvKiBNb3ZlIHRoZSBrZXJuZWwgZG9fZGl2IGRlZmluaXRpb24gb2ZmIHRvIG9uZSBzaWRlICovCkBAIC0zNzEsNiArMzc4LDQgQEAKIAlyZXR1cm4oeCAqIHkpOwogfQogCi0jZGVmaW5lIHFzb3J0KGEsIG4sIHMsIGNtcCkgc29ydChhLCBuLCBzLCBjbXAsIE5VTEwpCi0KICNlbmRpZiAvKiBfX1hGU19MSU5VWF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19scncuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jCmluZGV4IGFjYWI1OGMuLjNiNWZhYmUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jCkBAIC02NjAsOSArNjYwLDYgQEAKIAkJCSh4aXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpID8KIAkJCQltcC0+bV9ydGRldl90YXJncCA6IG1wLT5tX2RkZXZfdGFyZ3A7CiAKLQkJaWYgKGlvZmxhZ3MgJiBJT19JU0FJTykKLQkJCXJldHVybiBYRlNfRVJST1IoLUVOT1NZUyk7Ci0KIAkJaWYgKChwb3MgJiB0YXJnZXQtPnBicl9zbWFzaykgfHwgKGNvdW50ICYgdGFyZ2V0LT5wYnJfc21hc2spKQogCQkJcmV0dXJuIFhGU19FUlJPUigtRUlOVkFMKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmggYi9mcy94ZnMvbGludXgtMi42L3hmc19scncuaAppbmRleCBmMTk3YTcyLi42Mjk0ZGNkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19scncuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19scncuaApAQCAtNzAsOSArNzAsMTAgQEAKICNkZWZpbmUJWEZTX1NFTkRGSUxFX0VOVEVSCTIxCiAjZGVmaW5lCVhGU19XUklURVBBR0VfRU5URVIJMjIKICNkZWZpbmUJWEZTX1JFTEVBU0VQQUdFX0VOVEVSCTIzCi0jZGVmaW5lCVhGU19JT01BUF9BTExPQ19FTlRFUgkyNAotI2RlZmluZQlYRlNfSU9NQVBfQUxMT0NfTUFQCTI1Ci0jZGVmaW5lCVhGU19JT01BUF9VTldSSVRURU4JMjYKKyNkZWZpbmUJWEZTX0lOVkFMSURQQUdFX0VOVEVSCTI0CisjZGVmaW5lCVhGU19JT01BUF9BTExPQ19FTlRFUgkyNQorI2RlZmluZQlYRlNfSU9NQVBfQUxMT0NfTUFQCTI2CisjZGVmaW5lCVhGU19JT01BUF9VTldSSVRURU4JMjcKIGV4dGVybiB2b2lkIHhmc19yd19lbnRlcl90cmFjZShpbnQsIHN0cnVjdCB4ZnNfaW9jb3JlICosCiAJCQkJdm9pZCAqLCBzaXplX3QsIGxvZmZfdCwgaW50KTsKIGV4dGVybiB2b2lkIHhmc19pbnZhbF9jYWNoZWRfdHJhY2Uoc3RydWN0IHhmc19pb2NvcmUgKiwKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCmluZGV4IGY2ZGQ3ZGUuLjIzMDI0NTQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwpAQCAtNzAsMTEgKzcwLDE1IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiBTVEFUSUMgc3RydWN0IHF1b3RhY3RsX29wcyBsaW52ZnNfcW9wczsKIFNUQVRJQyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBsaW52ZnNfc29wczsKLVNUQVRJQyBrbWVtX3pvbmVfdCAqbGludmZzX2lub2RlX3pvbmU7CitTVEFUSUMga21lbV96b25lX3QgKnhmc192bm9kZV96b25lOworU1RBVElDIGttZW1fem9uZV90ICp4ZnNfaW9lbmRfem9uZTsKK21lbXBvb2xfdCAqeGZzX2lvZW5kX3Bvb2w7CiAKIFNUQVRJQyBzdHJ1Y3QgeGZzX21vdW50X2FyZ3MgKgogeGZzX2FyZ3NfYWxsb2NhdGUoCkBAIC0xMzgsMjQgKzE0MiwyNSBAQAogeGZzX3NldF9pbm9kZW9wcygKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSkKIHsKLQl2bm9kZV90CQkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7Ci0KLQlpZiAodnAtPnZfdHlwZSA9PSBWTk9OKSB7Ci0JCXZuX21hcmtfYmFkKHZwKTsKLQl9IGVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwlzd2l0Y2ggKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CiAJCWlub2RlLT5pX29wID0gJmxpbnZmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZsaW52ZnNfZmlsZV9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZsaW52ZnNfYW9wczsKLQl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJYnJlYWs7CisJY2FzZSBTX0lGRElSOgogCQlpbm9kZS0+aV9vcCA9ICZsaW52ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZsaW52ZnNfZGlyX29wZXJhdGlvbnM7Ci0JfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWJyZWFrOworCWNhc2UgU19JRkxOSzoKIAkJaW5vZGUtPmlfb3AgPSAmbGludmZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKIAkJaWYgKGlub2RlLT5pX2Jsb2NrcykKIAkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmxpbnZmc19hb3BzOwotCX0gZWxzZSB7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCWlub2RlLT5pX29wID0gJmxpbnZmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfcmRldik7CisJCWJyZWFrOwogCX0KIH0KIApAQCAtMTY3LDE2ICsxNzIsMjMgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IExJTlZGU19HRVRfSVAodnApOwogCi0JaW5vZGUtPmlfbW9kZQk9IChpcC0+aV9kLmRpX21vZGUgJiBNT0RFTUFTSykgfCBWVFRPSUYodnAtPnZfdHlwZSk7CisJaW5vZGUtPmlfbW9kZQk9IGlwLT5pX2QuZGlfbW9kZTsKIAlpbm9kZS0+aV9ubGluawk9IGlwLT5pX2QuZGlfbmxpbms7CiAJaW5vZGUtPmlfdWlkCT0gaXAtPmlfZC5kaV91aWQ7CiAJaW5vZGUtPmlfZ2lkCT0gaXAtPmlfZC5kaV9naWQ7Ci0JaWYgKCgoMSA8PCB2cC0+dl90eXBlKSAmICgoMTw8VkJMSykgfCAoMTw8VkNIUikpKSA9PSAwKSB7CisKKwlzd2l0Y2ggKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZCTEs6CisJY2FzZSBTX0lGQ0hSOgorCQlpbm9kZS0+aV9yZGV2ID0KKwkJCU1LREVWKHN5c3ZfbWFqb3IoaXAtPmlfZGYuaWZfdTIuaWZfcmRldikgJiAweDFmZiwKKwkJCSAgICAgIHN5c3ZfbWlub3IoaXAtPmlfZGYuaWZfdTIuaWZfcmRldikpOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlpbm9kZS0+aV9yZGV2ID0gMDsKLQl9IGVsc2UgewotCQl4ZnNfZGV2X3QgZGV2ID0gaXAtPmlfZGYuaWZfdTIuaWZfcmRldjsKLQkJaW5vZGUtPmlfcmRldiA9IE1LREVWKHN5c3ZfbWFqb3IoZGV2KSAmIDB4MWZmLCBzeXN2X21pbm9yKGRldikpOworCQlicmVhazsKIAl9CisKIAlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCWlub2RlLT5pX2dlbmVyYXRpb24gPSBpcC0+aV9kLmRpX2dlbjsKIAlpX3NpemVfd3JpdGUoaW5vZGUsIGlwLT5pX2QuZGlfc2l6ZSk7CkBAIC0yMzEsNyArMjQzLDYgQEAKIAkgKiBmaW5pc2ggb3VyIHdvcmsuCiAJICovCiAJaWYgKGlwLT5pX2QuZGlfbW9kZSAhPSAwICYmIHVubG9jayAmJiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpIHsKLQkJdnAtPnZfdHlwZSA9IElGVE9WVChpcC0+aV9kLmRpX21vZGUpOwogCQl4ZnNfcmV2YWxpZGF0ZV9pbm9kZShYRlNfQkhWVE9NKGJkcCksIHZwLCBpcCk7CiAJCXhmc19zZXRfaW5vZGVvcHMoaW5vZGUpOwogCQpAQCAtMjc0LDggKzI4NSw3IEBACiB7CiAJdm5vZGVfdAkJCSp2cDsKIAotCXZwID0gKHZub2RlX3QgKilrbWVtX2NhY2hlX2FsbG9jKGxpbnZmc19pbm9kZV96b25lLCAKLSAgICAgICAgICAgICAgICBrbWVtX2ZsYWdzX2NvbnZlcnQoS01fU0xFRVApKTsKKwl2cCA9IGttZW1fY2FjaGVfYWxsb2MoeGZzX3Zub2RlX3pvbmUsIGttZW1fZmxhZ3NfY29udmVydChLTV9TTEVFUCkpOwogCWlmICghdnApCiAJCXJldHVybiBOVUxMOwogCXJldHVybiBMSU5WRlNfR0VUX0lQKHZwKTsKQEAgLTI4NSwxMSArMjk1LDExIEBACiBsaW52ZnNfZGVzdHJveV9pbm9kZSgKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSkKIHsKLQlrbWVtX2NhY2hlX2ZyZWUobGludmZzX2lub2RlX3pvbmUsIExJTlZGU19HRVRfVlAoaW5vZGUpKTsKKwlrbWVtX3pvbmVfZnJlZSh4ZnNfdm5vZGVfem9uZSwgTElOVkZTX0dFVF9WUChpbm9kZSkpOwogfQogCiBTVEFUSUMgdm9pZAotaW5pdF9vbmNlKAorbGludmZzX2lub2RlX2luaXRfb25jZSgKIAl2b2lkCQkJKmRhdGEsCiAJa21lbV9jYWNoZV90CQkqY2FjaGVwLAogCXVuc2lnbmVkIGxvbmcJCWZsYWdzKQpAQCAtMzAyLDIxICszMTIsNDEgQEAKIH0KIAogU1RBVElDIGludAotaW5pdF9pbm9kZWNhY2hlKCB2b2lkICkKK2xpbnZmc19pbml0X3pvbmVzKHZvaWQpCiB7Ci0JbGludmZzX2lub2RlX3pvbmUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibGludmZzX2ljYWNoZSIsCisJeGZzX3Zub2RlX3pvbmUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgieGZzX3Zub2RlIiwKIAkJCQlzaXplb2Yodm5vZGVfdCksIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAotCQkJCWluaXRfb25jZSwgTlVMTCk7Ci0JaWYgKGxpbnZmc19pbm9kZV96b25lID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCQkJCWxpbnZmc19pbm9kZV9pbml0X29uY2UsIE5VTEwpOworCWlmICgheGZzX3Zub2RlX3pvbmUpCisJCWdvdG8gb3V0OworCisJeGZzX2lvZW5kX3pvbmUgPSBrbWVtX3pvbmVfaW5pdChzaXplb2YoeGZzX2lvZW5kX3QpLCAieGZzX2lvZW5kIik7CisJaWYgKCF4ZnNfaW9lbmRfem9uZSkKKwkJZ290byBvdXRfZGVzdHJveV92bm9kZV96b25lOworCisJeGZzX2lvZW5kX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZSg0ICogTUFYX0JVRl9QRVJfUEFHRSwKKwkJCW1lbXBvb2xfYWxsb2Nfc2xhYiwgbWVtcG9vbF9mcmVlX3NsYWIsCisJCQl4ZnNfaW9lbmRfem9uZSk7CisJaWYgKCF4ZnNfaW9lbmRfcG9vbCkKKwkJZ290byBvdXRfZnJlZV9pb2VuZF96b25lOworCiAJcmV0dXJuIDA7CisKKworIG91dF9mcmVlX2lvZW5kX3pvbmU6CisJa21lbV96b25lX2Rlc3Ryb3koeGZzX2lvZW5kX3pvbmUpOworIG91dF9kZXN0cm95X3Zub2RlX3pvbmU6CisJa21lbV96b25lX2Rlc3Ryb3koeGZzX3Zub2RlX3pvbmUpOworIG91dDoKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogU1RBVElDIHZvaWQKLWRlc3Ryb3lfaW5vZGVjYWNoZSggdm9pZCApCitsaW52ZnNfZGVzdHJveV96b25lcyh2b2lkKQogewotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobGludmZzX2lub2RlX3pvbmUpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FjaGUgc3RpbGwgaW4gdXNlIVxuIiwgX19GVU5DVElPTl9fKTsKKwltZW1wb29sX2Rlc3Ryb3koeGZzX2lvZW5kX3Bvb2wpOworCWttZW1fem9uZV9kZXN0cm95KHhmc192bm9kZV96b25lKTsKKwlrbWVtX3pvbmVfZGVzdHJveSh4ZnNfaW9lbmRfem9uZSk7CiB9CiAKIC8qCkBAIC0zNTQsMTcgKzM4NCwzOCBAQAogCXN0cnVjdCBpbm9kZQkJKmlub2RlKQogewogCXZub2RlX3QJCQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwlpbnQJCQllcnJvciwgY2FjaGU7CiAKLQlpZiAodnApIHsKLQkJdm5fcmVsZSh2cCk7Ci0JCXZuX3RyYWNlX2VudHJ5KHZwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLQkJLyoKLQkJICogRG8gYWxsIG91ciBjbGVhbnVwLCBhbmQgcmVtb3ZlIHRoaXMgdm5vZGUuCi0JCSAqLwotCQl2bl9yZW1vdmUodnApOworCXZuX3RyYWNlX2VudHJ5KHZwLCAiY2xlYXJfaW5vZGUiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlYRlNfU1RBVFNfSU5DKHZuX3JlbGUpOworCVhGU19TVEFUU19JTkModm5fcmVtb3ZlKTsKKwlYRlNfU1RBVFNfSU5DKHZuX3JlY2xhaW0pOworCVhGU19TVEFUU19ERUModm5fYWN0aXZlKTsKKworCS8qCisJICogVGhpcyBjYW4gaGFwcGVuIGJlY2F1c2UgeGZzX2lnZXRfY29yZSBjYWxscyB4ZnNfaWRlc3Ryb3kgaWYgd2UKKwkgKiBmaW5kIGFuIGlub2RlIHdpdGggZGlfbW9kZSA9PSAwIGJ1dCB3aXRob3V0IElHRVRfQ1JFQVRFIHNldC4KKwkgKi8KKwlpZiAodnAtPnZfZmJodikKKwkJVk9QX0lOQUNUSVZFKHZwLCBOVUxMLCBjYWNoZSk7CisKKwlWTl9MT0NLKHZwKTsKKwl2cC0+dl9mbGFnICY9IH5WTU9ESUZJRUQ7CisJVk5fVU5MT0NLKHZwLCAwKTsKKworCWlmICh2cC0+dl9mYmh2KSB7CisJCVZPUF9SRUNMQUlNKHZwLCBlcnJvcik7CisJCWlmIChlcnJvcikKKwkJCXBhbmljKCJ2bl9wdXJnZTogY2Fubm90IHJlY2xhaW0iKTsKIAl9Ci19CiAKKwlBU1NFUlQodnAtPnZfZmJodiA9PSBOVUxMKTsKKworI2lmZGVmIFhGU19WTk9ERV9UUkFDRQorCWt0cmFjZV9mcmVlKHZwLT52X3RyYWNlKTsKKyNlbmRpZgorfQogCiAvKgogICogRW5xdWV1ZSBhIHdvcmsgaXRlbSB0byBiZSBwaWNrZWQgdXAgYnkgdGhlIHZmcyB4ZnNzeW5jZCB0aHJlYWQuCkBAIC00MTYsNyArNDY3LDcgQEAKIAogCWlncmFiKGlub2RlKTsKIAl4ZnNfc3luY2RfcXVldWVfd29yayh2ZnMsIGlub2RlLCB4ZnNfZmx1c2hfaW5vZGVfd29yayk7Ci0JZGVsYXkoSFovMik7CisJZGVsYXkobXNlY3NfdG9famlmZmllcyg1MDApKTsKIH0KIAogLyoKQEAgLTQ0MSw3ICs0OTIsNyBAQAogCiAJaWdyYWIoaW5vZGUpOwogCXhmc19zeW5jZF9xdWV1ZV93b3JrKHZmcywgaW5vZGUsIHhmc19mbHVzaF9kZXZpY2Vfd29yayk7Ci0JZGVsYXkoSFovMik7CisJZGVsYXkobXNlY3NfdG9famlmZmllcyg1MDApKTsKIAl4ZnNfbG9nX2ZvcmNlKGlwLT5pX21vdW50LCAoeGZzX2xzbl90KTAsIFhGU19MT0dfRk9SQ0V8WEZTX0xPR19TWU5DKTsKIH0KIApAQCAtNDY2LDI1ICs1MTcsMTUgQEAKIHsKIAlsb25nCQkJdGltZWxlZnQ7CiAJdmZzX3QJCQkqdmZzcCA9ICh2ZnNfdCAqKSBhcmc7Ci0Jc3RydWN0IGxpc3RfaGVhZAl0bXA7CiAJc3RydWN0IHZmc19zeW5jX3dvcmsJKndvcmssICpuOworCUxJU1RfSEVBRAkJKHRtcCk7CiAKLQlkYWVtb25pemUoInhmc3N5bmNkIik7Ci0KLQl2ZnNwLT52ZnNfc3luY193b3JrLndfdmZzID0gdmZzcDsKLQl2ZnNwLT52ZnNfc3luY193b3JrLndfc3luY2VyID0gdmZzX3N5bmNfd29ya2VyOwotCXZmc3AtPnZmc19zeW5jX3Rhc2sgPSBjdXJyZW50OwotCXdtYigpOwotCXdha2VfdXAoJnZmc3AtPnZmc193YWl0X3N5bmNfdGFzayk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmdG1wKTsKLQl0aW1lbGVmdCA9ICh4ZnNfc3luY2RfY2VudGlzZWNzICogSFopIC8gMTAwOworCXRpbWVsZWZ0ID0geGZzX3N5bmNkX2NlbnRpc2VjcyAqIG1zZWNzX3RvX2ppZmZpZXMoMTApOwogCWZvciAoOzspIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJdGltZWxlZnQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVsZWZ0KTsKKwkJdGltZWxlZnQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZWxlZnQpOwogCQkvKiBzd3N1c3AgKi8KIAkJdHJ5X3RvX2ZyZWV6ZSgpOwotCQlpZiAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfVU1PVU5UKQorCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQkJYnJlYWs7CiAKIAkJc3Bpbl9sb2NrKCZ2ZnNwLT52ZnNfc3luY19sb2NrKTsKQEAgLTQ5NSw3ICs1MzYsOCBAQAogCQkgKi8KIAkJaWYgKCF0aW1lbGVmdCB8fCBsaXN0X2VtcHR5KCZ2ZnNwLT52ZnNfc3luY19saXN0KSkgewogCQkJaWYgKCF0aW1lbGVmdCkKLQkJCQl0aW1lbGVmdCA9ICh4ZnNfc3luY2RfY2VudGlzZWNzICogSFopIC8gMTAwOworCQkJCXRpbWVsZWZ0ID0geGZzX3N5bmNkX2NlbnRpc2VjcyAqCisJCQkJCQkJbXNlY3NfdG9famlmZmllcygxMCk7CiAJCQlJTklUX0xJU1RfSEVBRCgmdmZzcC0+dmZzX3N5bmNfd29yay53X2xpc3QpOwogCQkJbGlzdF9hZGRfdGFpbCgmdmZzcC0+dmZzX3N5bmNfd29yay53X2xpc3QsCiAJCQkJCSZ2ZnNwLT52ZnNfc3luY19saXN0KTsKQEAgLTUxMywxMCArNTU1LDYgQEAKIAkJfQogCX0KIAotCXZmc3AtPnZmc19zeW5jX3Rhc2sgPSBOVUxMOwotCXdtYigpOwotCXdha2VfdXAoJnZmc3AtPnZmc193YWl0X3N5bmNfdGFzayk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTI0LDEzICs1NjIsMTEgQEAKIGxpbnZmc19zdGFydF9zeW5jZCgKIAl2ZnNfdAkJCSp2ZnNwKQogewotCWludAkJCXBpZDsKLQotCXBpZCA9IGtlcm5lbF90aHJlYWQoeGZzc3luY2QsICh2b2lkICopIHZmc3AsCi0JCQlDTE9ORV9WTSB8IENMT05FX0ZTIHwgQ0xPTkVfRklMRVMpOwotCWlmIChwaWQgPCAwKQotCQlyZXR1cm4gLXBpZDsKLQl3YWl0X2V2ZW50KHZmc3AtPnZmc193YWl0X3N5bmNfdGFzaywgdmZzcC0+dmZzX3N5bmNfdGFzayk7CisJdmZzcC0+dmZzX3N5bmNfd29yay53X3N5bmNlciA9IHZmc19zeW5jX3dvcmtlcjsKKwl2ZnNwLT52ZnNfc3luY193b3JrLndfdmZzID0gdmZzcDsKKwl2ZnNwLT52ZnNfc3luY190YXNrID0ga3RocmVhZF9ydW4oeGZzc3luY2QsIHZmc3AsICJ4ZnNzeW5jZCIpOworCWlmIChJU19FUlIodmZzcC0+dmZzX3N5bmNfdGFzaykpCisJCXJldHVybiAtUFRSX0VSUih2ZnNwLT52ZnNfc3luY190YXNrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTM4LDExICs1NzQsNyBAQAogbGludmZzX3N0b3Bfc3luY2QoCiAJdmZzX3QJCQkqdmZzcCkKIHsKLQl2ZnNwLT52ZnNfZmxhZyB8PSBWRlNfVU1PVU5UOwotCXdtYigpOwotCi0Jd2FrZV91cF9wcm9jZXNzKHZmc3AtPnZmc19zeW5jX3Rhc2spOwotCXdhaXRfZXZlbnQodmZzcC0+dmZzX3dhaXRfc3luY190YXNrLCAhdmZzcC0+dmZzX3N5bmNfdGFzayk7CisJa3RocmVhZF9zdG9wKHZmc3AtPnZmc19zeW5jX3Rhc2spOwogfQogCiBTVEFUSUMgdm9pZApAQCAtODY2LDkgKzg5OCw5IEBACiAKIAlrdHJhY2VfaW5pdCg2NCk7CiAKLQllcnJvciA9IGluaXRfaW5vZGVjYWNoZSgpOworCWVycm9yID0gbGludmZzX2luaXRfem9uZXMoKTsKIAlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIHVuZG9faW5vZGVjYWNoZTsKKwkJZ290byB1bmRvX3pvbmVzOwogCiAJZXJyb3IgPSBwYWdlYnVmX2luaXQoKTsKIAlpZiAoZXJyb3IgPCAwKQpAQCAtODg5LDkgKzkyMSw5IEBACiAJcGFnZWJ1Zl90ZXJtaW5hdGUoKTsKIAogdW5kb19wYWdlYnVmOgotCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworCWxpbnZmc19kZXN0cm95X3pvbmVzKCk7CiAKLXVuZG9faW5vZGVjYWNoZToKK3VuZG9fem9uZXM6CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC05MDMsNyArOTM1LDcgQEAKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnhmc19mc190eXBlKTsKIAl4ZnNfY2xlYW51cCgpOwogCXBhZ2VidWZfdGVybWluYXRlKCk7Ci0JZGVzdHJveV9pbm9kZWNhY2hlKCk7CisJbGludmZzX2Rlc3Ryb3lfem9uZXMoKTsKIAlrdHJhY2VfdW5pbml0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmMKaW5kZXggNjY5YzYxNi4uMzRjYzkwMiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmMKQEAgLTI1MSw3ICsyNTEsNiBAQAogCWJodl9oZWFkX2luaXQoVkZTX0JIVkhFQUQodmZzcCksICJ2ZnMiKTsKIAlJTklUX0xJU1RfSEVBRCgmdmZzcC0+dmZzX3N5bmNfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnZmc3AtPnZmc19zeW5jX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZmc3AtPnZmc193YWl0X3N5bmNfdGFzayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdmZzcC0+dmZzX3dhaXRfc2luZ2xlX3N5bmNfdGFzayk7CiAJcmV0dXJuIHZmc3A7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5oCmluZGV4IDdlZTFmNzEuLmYwYWI1NzRmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuaApAQCAtNjUsNyArNjUsNiBAQAogCXNwaW5sb2NrX3QJCXZmc19zeW5jX2xvY2s7CS8qIHdvcmsgaXRlbSBsaXN0IGxvY2sgKi8KIAlpbnQgCQkJdmZzX3N5bmNfc2VxOwkvKiBzeW5jIHRocmVhZCBnZW5lcmF0aW9uIG5vLiAqLwogCXdhaXRfcXVldWVfaGVhZF90CXZmc193YWl0X3NpbmdsZV9zeW5jX3Rhc2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJdmZzX3dhaXRfc3luY190YXNrOwogfSB2ZnNfdDsKIAogI2RlZmluZSB2ZnNfZmJodgkJdmZzX2JoLmJoX2ZpcnN0CS8qIDFzdCBvbiB2ZnMgYmVoYXZpb3IgY2hhaW4gKi8KQEAgLTk2LDcgKzk1LDYgQEAKICNkZWZpbmUgVkZTX1JET05MWQkJMHgwMDAxCS8qIHJlYWQtb25seSB2ZnMgKi8KICNkZWZpbmUgVkZTX0dSUElECQkweDAwMDIJLyogZ3JvdXAtSUQgYXNzaWduZWQgZnJvbSBkaXJlY3RvcnkgKi8KICNkZWZpbmUgVkZTX0RNSQkJCTB4MDAwNAkvKiBmaWxlc3lzdGVtIGhhcyB0aGUgRE1JIGVuYWJsZWQgKi8KLSNkZWZpbmUgVkZTX1VNT1VOVAkJMHgwMDA4CS8qIHVubW91bnQgaW4gcHJvZ3Jlc3MgKi8KICNkZWZpbmUgVkZTX0VORAkJCTB4MDAwOAkvKiBtYXggZmxhZyAqLwogCiAjZGVmaW5lIFNZTkNfQVRUUgkJMHgwMDAxCS8qIHN5bmMgYXR0cmlidXRlcyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmMKaW5kZXggMjUwY2FkNS4uMjY4ZjQ1YiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5jCkBAIC00Miw5MyArNDIsMzMgQEAKICAqLwogI2RlZmluZSBOVlNZTkMgICAgICAgICAgICAgICAgICAzNwogI2RlZmluZSB2cHRvc3luYyh2KSAgICAgICAgICAgICAoJnZzeW5jWygodW5zaWduZWQgbG9uZyl2KSAlIE5WU1lOQ10pCi1zdl90IHZzeW5jW05WU1lOQ107Ci0KLS8qCi0gKiBUcmFuc2xhdGUgc3RhdCgyKSBmaWxlIHR5cGVzIHRvIHZub2RlIHR5cGVzIGFuZCB2aWNlIHZlcnNhLgotICogQXdhcmUgb2YgbnVtZXJpYyBvcmRlciBvZiBTX0lGTVQgYW5kIHZub2RlIHR5cGUgdmFsdWVzLgotICovCi1lbnVtIHZ0eXBlIGlmdG92dF90YWJbXSA9IHsKLQlWTk9OLCBWRklGTywgVkNIUiwgVk5PTiwgVkRJUiwgVk5PTiwgVkJMSywgVk5PTiwKLQlWUkVHLCBWTk9OLCBWTE5LLCBWTk9OLCBWU09DSywgVk5PTiwgVk5PTiwgVk5PTgotfTsKLQotdV9zaG9ydCB2dHRvaWZfdGFiW10gPSB7Ci0JMCwgU19JRlJFRywgU19JRkRJUiwgU19JRkJMSywgU19JRkNIUiwgU19JRkxOSywgU19JRklGTywgMCwgU19JRlNPQ0sKLX07CitTVEFUSUMgd2FpdF9xdWV1ZV9oZWFkX3QgdnN5bmNbTlZTWU5DXTsKIAogCiB2b2lkCiB2bl9pbml0KHZvaWQpCiB7Ci0JcmVnaXN0ZXIgc3ZfdCAqc3ZwOwotCXJlZ2lzdGVyIGludCBpOworCWludCBpOwogCi0JZm9yIChzdnAgPSB2c3luYywgaSA9IDA7IGkgPCBOVlNZTkM7IGkrKywgc3ZwKyspCi0JCWluaXRfc3Yoc3ZwLCBTVl9ERUZBVUxULCAidnN5IiwgaSk7CisJZm9yIChpID0gMDsgaSA8IE5WU1lOQzsgaSsrKQorCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2c3luY1tpXSk7CiB9CiAKLS8qCi0gKiBDbGVhbiBhIHZub2RlIG9mIGZpbGVzeXN0ZW0tc3BlY2lmaWMgZGF0YSBhbmQgcHJlcGFyZSBpdCBmb3IgcmV1c2UuCi0gKi8KLVNUQVRJQyBpbnQKLXZuX3JlY2xhaW0oCit2b2lkCit2bl9pb3dhaXQoCiAJc3RydWN0IHZub2RlCSp2cCkKIHsKLQlpbnQJCWVycm9yOworCXdhaXRfcXVldWVfaGVhZF90ICp3cSA9IHZwdG9zeW5jKHZwKTsKIAotCVhGU19TVEFUU19JTkModm5fcmVjbGFpbSk7Ci0Jdm5fdHJhY2VfZW50cnkodnAsICJ2bl9yZWNsYWltIiwgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOwotCi0JLyoKLQkgKiBPbmx5IG1ha2UgdGhlIFZPUF9SRUNMQUlNIGNhbGwgaWYgdGhlcmUgYXJlIGJlaGF2aW9ycwotCSAqIHRvIGNhbGwuCi0JICovCi0JaWYgKHZwLT52X2ZiaHYpIHsKLQkJVk9QX1JFQ0xBSU0odnAsIGVycm9yKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIC1lcnJvcjsKLQl9Ci0JQVNTRVJUKHZwLT52X2ZiaHYgPT0gTlVMTCk7Ci0KLQlWTl9MT0NLKHZwKTsKLQl2cC0+dl9mbGFnICY9IChWUkVDTE18VldBSVQpOwotCVZOX1VOTE9DSyh2cCwgMCk7Ci0KLQl2cC0+dl90eXBlID0gVk5PTjsKLQl2cC0+dl9mYmh2ID0gTlVMTDsKLQotI2lmZGVmIFhGU19WTk9ERV9UUkFDRQotCWt0cmFjZV9mcmVlKHZwLT52X3RyYWNlKTsKLQl2cC0+dl90cmFjZSA9IE5VTEw7Ci0jZW5kaWYKLQotCXJldHVybiAwOworCXdhaXRfZXZlbnQoKndxLCAoYXRvbWljX3JlYWQoJnZwLT52X2lvY291bnQpID09IDApKTsKIH0KIAotU1RBVElDIHZvaWQKLXZuX3dha2V1cCgKK3ZvaWQKK3ZuX2lvd2FrZSgKIAlzdHJ1Y3Qgdm5vZGUJKnZwKQogewotCVZOX0xPQ0sodnApOwotCWlmICh2cC0+dl9mbGFnICYgVldBSVQpCi0JCXN2X2Jyb2FkY2FzdCh2cHRvc3luYyh2cCkpOwotCXZwLT52X2ZsYWcgJj0gfihWUkVDTE18VldBSVR8Vk1PRElGSUVEKTsKLQlWTl9VTkxPQ0sodnAsIDApOwotfQotCi1pbnQKLXZuX3dhaXQoCi0Jc3RydWN0IHZub2RlCSp2cCkKLXsKLQlWTl9MT0NLKHZwKTsKLQlpZiAodnAtPnZfZmxhZyAmIChWSU5BQ1QgfCBWUkVDTE0pKSB7Ci0JCXZwLT52X2ZsYWcgfD0gVldBSVQ7Ci0JCXN2X3dhaXQodnB0b3N5bmModnApLCBQSU5PRCwgJnZwLT52X2xvY2ssIDApOwotCQlyZXR1cm4gMTsKLQl9Ci0JVk5fVU5MT0NLKHZwLCAwKTsKLQlyZXR1cm4gMDsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdnAtPnZfaW9jb3VudCkpCisJCXdha2VfdXAodnB0b3N5bmModnApKTsKIH0KIAogc3RydWN0IHZub2RlICoKQEAgLTE1NCw2ICs5NCw4IEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmVoYXZpb3IgYW5kIHRoZSBiZWhhdmlvciBjaGFpbiBoZWFkLiAqLwogCXZuX2Jodl9oZWFkX2luaXQoVk5fQkhWX0hFQUQodnApLCAidm5vZGUiKTsKIAorCWF0b21pY19zZXQoJnZwLT52X2lvY291bnQsIDApOworCiAjaWZkZWYJWEZTX1ZOT0RFX1RSQUNFCiAJdnAtPnZfdHJhY2UgPSBrdHJhY2VfYWxsb2MoVk5PREVfVFJBQ0VfU0laRSwgS01fU0xFRVApOwogI2VuZGlmCS8qIFhGU19WTk9ERV9UUkFDRSAqLwpAQCAtMTYzLDMwICsxMDUsNiBAQAogfQogCiAvKgotICogR2V0IGEgcmVmZXJlbmNlIG9uIGEgdm5vZGUuCi0gKi8KLXZub2RlX3QgKgotdm5fZ2V0KAotCXN0cnVjdCB2bm9kZQkqdnAsCi0Jdm1hcF90CQkqdm1hcCkKLXsKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlOwotCi0JWEZTX1NUQVRTX0lOQyh2bl9nZXQpOwotCWlub2RlID0gTElOVkZTX0dFVF9JUCh2cCk7Ci0JaWYgKGlub2RlLT5pX3N0YXRlICYgSV9GUkVFSU5HKQotCQlyZXR1cm4gTlVMTDsKLQotCWlub2RlID0gaWxvb2t1cCh2bWFwLT52X3Zmc3AtPnZmc19zdXBlciwgdm1hcC0+dl9pbm8pOwotCWlmICghaW5vZGUpCS8qIElub2RlIG5vdCBwcmVzZW50ICovCi0JCXJldHVybiBOVUxMOwotCi0Jdm5fdHJhY2VfZXhpdCh2cCwgInZuX2dldCIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLQotCXJldHVybiB2cDsKLX0KLQotLyoKICAqIFJldmFsaWRhdGUgdGhlIExpbnV4IGlub2RlIGZyb20gdGhlIHZhdHRyLgogICogTm90ZTogaV9zaXplIF9ub3RfIHVwZGF0ZWQ7IHdlIG11c3QgaG9sZCB0aGUgaW5vZGUKICAqIHNlbWFwaG9yZSB3aGVuIGRvaW5nIHRoYXQgLSBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5LgpAQCAtMTk4LDcgKzExNiw3IEBACiB7CiAJc3RydWN0IGlub2RlCSppbm9kZSA9IExJTlZGU19HRVRfSVAodnApOwogCi0JaW5vZGUtPmlfbW9kZQkgICAgPSBWVFRPSUYodmFwLT52YV90eXBlKSB8IHZhcC0+dmFfbW9kZTsKKwlpbm9kZS0+aV9tb2RlCSAgICA9IHZhcC0+dmFfbW9kZTsKIAlpbm9kZS0+aV9ubGluawkgICAgPSB2YXAtPnZhX25saW5rOwogCWlub2RlLT5pX3VpZAkgICAgPSB2YXAtPnZhX3VpZDsKIAlpbm9kZS0+aV9naWQJICAgID0gdmFwLT52YV9naWQ7CkBAIC0yNDcsNzEgKzE2NSw2IEBACiB9CiAKIC8qCi0gKiBwdXJnZSBhIHZub2RlIGZyb20gdGhlIGNhY2hlCi0gKiBBdCB0aGlzIHBvaW50IHRoZSB2bm9kZSBpcyBndWFyYW50ZWVkIHRvIGhhdmUgbm8gcmVmZXJlbmNlcyAodm5fY291bnQgPT0gMCkKLSAqIFRoZSBjYWxsZXIgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubyB3YXlzIHNvbWVvbmUgY291bGQKLSAqIGdldCBhIGhhbmRsZSAodmlhIHZuX2dldCkgb24gdGhlIHZub2RlICh1c3VhbGx5IGRvbmUgdmlhIGEgbW91bnQvdmZzIGxvY2spLgotICovCi12b2lkCi12bl9wdXJnZSgKLQlzdHJ1Y3Qgdm5vZGUJKnZwLAotCXZtYXBfdAkJKnZtYXApCi17Ci0Jdm5fdHJhY2VfZW50cnkodnAsICJ2bl9wdXJnZSIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLQotYWdhaW46Ci0JLyoKLQkgKiBDaGVjayB3aGV0aGVyIHZwIGhhcyBhbHJlYWR5IGJlZW4gcmVjbGFpbWVkIHNpbmNlIG91ciBjYWxsZXIKLQkgKiBzYW1wbGVkIGl0cyB2ZXJzaW9uIHdoaWxlIGhvbGRpbmcgYSBmaWxlc3lzdGVtIGNhY2hlIGxvY2sgdGhhdAotCSAqIGl0cyBWT1BfUkVDTEFJTSBmdW5jdGlvbiBhY3F1aXJlcy4KLQkgKi8KLQlWTl9MT0NLKHZwKTsKLQlpZiAodnAtPnZfbnVtYmVyICE9IHZtYXAtPnZfbnVtYmVyKSB7Ci0JCVZOX1VOTE9DSyh2cCwgMCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIElmIHZwIGlzIGJlaW5nIHJlY2xhaW1lZCBvciBpbmFjdGl2YXRlZCwgd2FpdCB1bnRpbCBpdCBpcyBpbmVydCwKLQkgKiB0aGVuIHByb2NlZWQuICBDYW4ndCBhc3N1bWUgdGhhdCB2bm9kZSBpcyBhY3R1YWxseSByZWNsYWltZWQKLQkgKiBqdXN0IGJlY2F1c2UgdGhlIHJlY2xhaW1lZCBmbGFnIGlzIGFzc2VydGVkIC0tIGEgdm5fYWxsb2MKLQkgKiByZWNsYWltIGNhbiBmYWlsLgotCSAqLwotCWlmICh2cC0+dl9mbGFnICYgKFZJTkFDVCB8IFZSRUNMTSkpIHsKLQkJQVNTRVJUKHZuX2NvdW50KHZwKSA9PSAwKTsKLQkJdnAtPnZfZmxhZyB8PSBWV0FJVDsKLQkJc3Zfd2FpdCh2cHRvc3luYyh2cCksIFBJTk9ELCAmdnAtPnZfbG9jaywgMCk7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCi0JLyoKLQkgKiBBbm90aGVyIHByb2Nlc3MgY291bGQgaGF2ZSByYWNlZCBpbiBhbmQgZ290dGVuIHRoaXMgdm5vZGUuLi4KLQkgKi8KLQlpZiAodm5fY291bnQodnApID4gMCkgewotCQlWTl9VTkxPQ0sodnAsIDApOwotCQlyZXR1cm47Ci0JfQotCi0JWEZTX1NUQVRTX0RFQyh2bl9hY3RpdmUpOwotCXZwLT52X2ZsYWcgfD0gVlJFQ0xNOwotCVZOX1VOTE9DSyh2cCwgMCk7Ci0KLQkvKgotCSAqIENhbGwgVk9QX1JFQ0xBSU0gYW5kIGNsZWFuIHZwLiBUaGUgRlNZTkNfSU5WQUwgZmxhZyB0ZWxscwotCSAqIHZwJ3MgZmlsZXN5c3RlbSB0byBmbHVzaCBhbmQgaW52YWxpZGF0ZSBhbGwgY2FjaGVkIHJlc291cmNlcy4KLQkgKiBXaGVuIHZuX3JlY2xhaW0gcmV0dXJucywgdnAgc2hvdWxkIGhhdmUgbm8gcHJpdmF0ZSBkYXRhLAotCSAqIGVpdGhlciBpbiBhIHN5c3RlbSBjYWNoZSBvciBhdHRhY2hlZCB0byB2X2RhdGEuCi0JICovCi0JaWYgKHZuX3JlY2xhaW0odnApICE9IDApCi0JCXBhbmljKCJ2bl9wdXJnZTogY2Fubm90IHJlY2xhaW0iKTsKLQotCS8qCi0JICogV2FrZXVwIGFueW9uZSB3YWl0aW5nIGZvciB2cCB0byBiZSByZWNsYWltZWQuCi0JICovCi0Jdm5fd2FrZXVwKHZwKTsKLX0KLQotLyoKICAqIEFkZCBhIHJlZmVyZW5jZSB0byBhIHJlZmVyZW5jZWQgdm5vZGUuCiAgKi8KIHN0cnVjdCB2bm9kZSAqCkBAIC0zMzAsODAgKzE4Myw2IEBACiAJcmV0dXJuIHZwOwogfQogCi0vKgotICogIENhbGwgVk9QX0lOQUNUSVZFIG9uIGxhc3QgcmVmZXJlbmNlLgotICovCi12b2lkCi12bl9yZWxlKAotCXN0cnVjdCB2bm9kZQkqdnApCi17Ci0JaW50CQl2Y250OwotCWludAkJY2FjaGU7Ci0KLQlYRlNfU1RBVFNfSU5DKHZuX3JlbGUpOwotCi0JVk5fTE9DSyh2cCk7Ci0KLQl2bl90cmFjZV9lbnRyeSh2cCwgInZuX3JlbGUiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7Ci0JdmNudCA9IHZuX2NvdW50KHZwKTsKLQotCS8qCi0JICogU2luY2Ugd2UgYWx3YXlzIGdldCBjYWxsZWQgZnJvbSBwdXRfaW5vZGUgd2Uga25vdwotCSAqIHRoYXQgaV9jb3VudCB3b24ndCBiZSBkZWNyZW1lbnRlZCBhZnRlciB3ZQotCSAqIHJldHVybi4KLQkgKi8KLQlpZiAoIXZjbnQpIHsKLQkJLyoKLQkJICogQXMgc29vbiBhcyB3ZSB0dXJuIHRoaXMgb24sIG5vb25lIGNhbiBmaW5kIHVzIGluIHZuX2dldAotCQkgKiB1bnRpbCB3ZSB0dXJuIG9mZiBWSU5BQ1Qgb3IgVlJFQ0xNCi0JCSAqLwotCQl2cC0+dl9mbGFnIHw9IFZJTkFDVDsKLQkJVk5fVU5MT0NLKHZwLCAwKTsKLQotCQkvKgotCQkgKiBEbyBub3QgbWFrZSB0aGUgVk9QX0lOQUNUSVZFIGNhbGwgaWYgdGhlcmUKLQkJICogYXJlIG5vIGJlaGF2aW9ycyBhdHRhY2hlZCB0byB0aGUgdm5vZGUgdG8gY2FsbC4KLQkJICovCi0JCWlmICh2cC0+dl9mYmh2KQotCQkJVk9QX0lOQUNUSVZFKHZwLCBOVUxMLCBjYWNoZSk7Ci0KLQkJVk5fTE9DSyh2cCk7Ci0JCWlmICh2cC0+dl9mbGFnICYgVldBSVQpCi0JCQlzdl9icm9hZGNhc3QodnB0b3N5bmModnApKTsKLQotCQl2cC0+dl9mbGFnICY9IH4oVklOQUNUfFZXQUlUfFZSRUNMTXxWTU9ESUZJRUQpOwotCX0KLQotCVZOX1VOTE9DSyh2cCwgMCk7Ci0KLQl2bl90cmFjZV9leGl0KHZwLCAidm5fcmVsZSIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLX0KLQotLyoKLSAqIEZpbmlzaCB0aGUgcmVtb3ZhbCBvZiBhIHZub2RlLgotICovCi12b2lkCi12bl9yZW1vdmUoCi0Jc3RydWN0IHZub2RlCSp2cCkKLXsKLQl2bWFwX3QJCXZtYXA7Ci0KLQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZG8gdGhpcyB0byB0aGUgc2FtZSB2bm9kZSB0d2ljZSAqLwotCWlmICghKHZwLT52X2ZiaHYpKQotCQlyZXR1cm47Ci0KLQlYRlNfU1RBVFNfSU5DKHZuX3JlbW92ZSk7Ci0Jdm5fdHJhY2VfZXhpdCh2cCwgInZuX3JlbW92ZSIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLQotCS8qCi0JICogQWZ0ZXIgdGhlIGZvbGxvd2luZyBwdXJnZSB0aGUgdm5vZGUKLQkgKiB3aWxsIG5vIGxvbmdlciBleGlzdC4KLQkgKi8KLQlWTUFQKHZwLCB2bWFwKTsKLQl2bl9wdXJnZSh2cCwgJnZtYXApOwotfQotCi0KICNpZmRlZglYRlNfVk5PREVfVFJBQ0UKIAogI2RlZmluZSBLVFJBQ0VfRU5URVIodnAsIHZrLCBzLCBsaW5lLCByYSkJCQlcCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaAppbmRleCBhNmU1N2M2Li4zNWYzMDZjIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC02NSwxMCArNjUsNiBAQAogc3RydWN0IHhmc19pb21hcDsKIHN0cnVjdCBhdHRybGlzdF9jdXJzb3Jfa2VybjsKIAotLyoKLSAqIFZub2RlIHR5cGVzLiAgVk5PTiBtZWFucyBubyB0eXBlLgotICovCi1lbnVtIHZ0eXBlCXsgVk5PTiwgVlJFRywgVkRJUiwgVkJMSywgVkNIUiwgVkxOSywgVkZJRk8sIFZCQUQsIFZTT0NLIH07CiAKIHR5cGVkZWYgeGZzX2lub190IHZudW1iZXJfdDsKIHR5cGVkZWYgc3RydWN0IGRlbnRyeSB2bmFtZV90OwpAQCAtNzcsMTUgKzczLDE0IEBACiAvKgogICogTVAgbG9ja2luZyBwcm90b2NvbHM6CiAgKgl2X2ZsYWcsIHZfdmZzcAkJCQlWTl9MT0NLL1ZOX1VOTE9DSwotICoJdl90eXBlCQkJCQlyZWFkLW9ubHkgb3IgZnMtZGVwZW5kZW50CiAgKi8KIHR5cGVkZWYgc3RydWN0IHZub2RlIHsKIAlfX3UzMgkJdl9mbGFnOwkJCS8qIHZub2RlIGZsYWdzIChzZWUgYmVsb3cpICovCi0JZW51bSB2dHlwZQl2X3R5cGU7CQkJLyogdm5vZGUgdHlwZSAqLwogCXN0cnVjdCB2ZnMJKnZfdmZzcDsJCS8qIHB0ciB0byBjb250YWluaW5nIFZGUyAqLwogCXZudW1iZXJfdAl2X251bWJlcjsJCS8qIGluLWNvcmUgdm5vZGUgbnVtYmVyICovCiAJdm5fYmh2X2hlYWRfdAl2X2JoOwkJCS8qIGJlaGF2aW9yIGhlYWQgKi8KIAlzcGlubG9ja190CXZfbG9jazsJCQkvKiBWTl9MT0NLL1ZOX1VOTE9DSyAqLworCWF0b21pY190CXZfaW9jb3VudDsJCS8qIG91dHN0YW5kaW5nIEkvTyBjb3VudCAqLwogI2lmZGVmIFhGU19WTk9ERV9UUkFDRQogCXN0cnVjdCBrdHJhY2UJKnZfdHJhY2U7CQkvKiB0cmFjZSBoZWFkZXIgc3RydWN0dXJlICAgICovCiAjZW5kaWYKQEAgLTkzLDYgKzg4LDEyIEBACiAJLyogaW5vZGUgTVVTVCBiZSBsYXN0ICovCiB9IHZub2RlX3Q7CiAKKyNkZWZpbmUgVk5fSVNMTksodnApCVNfSVNMTksoKHZwKS0+dl9pbm9kZS5pX21vZGUpCisjZGVmaW5lIFZOX0lTUkVHKHZwKQlTX0lTUkVHKCh2cCktPnZfaW5vZGUuaV9tb2RlKQorI2RlZmluZSBWTl9JU0RJUih2cCkJU19JU0RJUigodnApLT52X2lub2RlLmlfbW9kZSkKKyNkZWZpbmUgVk5fSVNDSFIodnApCVNfSVNDSFIoKHZwKS0+dl9pbm9kZS5pX21vZGUpCisjZGVmaW5lIFZOX0lTQkxLKHZwKQlTX0lTQkxLKCh2cCktPnZfaW5vZGUuaV9tb2RlKQorCiAjZGVmaW5lIHZfZmJodgkJCXZfYmguYmhfZmlyc3QJICAgICAgIC8qIGZpcnN0IGJlaGF2aW9yICovCiAjZGVmaW5lIHZfZm9wcwkJCXZfYmguYmhfZmlyc3QtPmJkX29wcyAgLyogZmlyc3QgYmVoYXZpb3Igb3BzICovCiAKQEAgLTEzMywyMiArMTM0LDggQEAKICNkZWZpbmUgTElOVkZTX0dFVF9JUCh2cCkJKCYodnApLT52X2lub2RlKQogCiAvKgotICogQ29udmVydCBiZXR3ZWVuIHZub2RlIHR5cGVzIGFuZCBpbm9kZSBmb3JtYXRzIChzaW5jZSBQT1NJWC4xCi0gKiBkZWZpbmVzIG1vZGUgd29yZCBvZiBzdGF0IHN0cnVjdHVyZSBpbiB0ZXJtcyBvZiBpbm9kZSBmb3JtYXRzKS4KLSAqLwotZXh0ZXJuIGVudW0gdnR5cGUJaWZ0b3Z0X3RhYltdOwotZXh0ZXJuIHVfc2hvcnQJCXZ0dG9pZl90YWJbXTsKLSNkZWZpbmUgSUZUT1ZUKG1vZGUpCShpZnRvdnRfdGFiWygobW9kZSkgJiBTX0lGTVQpID4+IDEyXSkKLSNkZWZpbmUgVlRUT0lGKGluZHgpCSh2dHRvaWZfdGFiWyhpbnQpKGluZHgpXSkKLSNkZWZpbmUgTUFLRUlNT0RFKGluZHgsIG1vZGUpCShpbnQpKFZUVE9JRihpbmR4KSB8IChtb2RlKSkKLQotCi0vKgogICogVm5vZGUgZmxhZ3MuCiAgKi8KLSNkZWZpbmUgVklOQUNUCQkgICAgICAgMHgxCS8qIHZub2RlIGlzIGJlaW5nIGluYWN0aXZhdGVkCSovCi0jZGVmaW5lIFZSRUNMTQkJICAgICAgIDB4MgkvKiB2bm9kZSBpcyBiZWluZyByZWNsYWltZWQJKi8KLSNkZWZpbmUgVldBSVQJCSAgICAgICAweDQJLyogd2FpdGluZyBmb3IgVklOQUNUL1ZSRUNMTSB0byBlbmQgKi8KICNkZWZpbmUgVk1PRElGSUVECSAgICAgICAweDgJLyogWEZTIGlub2RlIHN0YXRlIHBvc3NpYmx5IGRpZmZlcnMgKi8KIAkJCQkJLyogdG8gdGhlIExpbnV4IGlub2RlIHN0YXRlLgkqLwogCkBAIC00MDgsNyArMzk1LDYgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgdmF0dHIgewogCWludAkJdmFfbWFzazsJLyogYml0LW1hc2sgb2YgYXR0cmlidXRlcyBwcmVzZW50ICovCi0JZW51bSB2dHlwZQl2YV90eXBlOwkvKiB2bm9kZSB0eXBlIChmb3IgY3JlYXRlKSAqLwogCW1vZGVfdAkJdmFfbW9kZTsJLyogZmlsZSBhY2Nlc3MgbW9kZSBhbmQgdHlwZSAqLwogCXhmc19ubGlua190CXZhX25saW5rOwkvKiBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byBmaWxlICovCiAJdWlkX3QJCXZhX3VpZDsJCS8qIG93bmVyIHVzZXIgaWQgKi8KQEAgLTQ5OCwyNyArNDg0LDEyIEBACiAgKiBDaGVjayB3aGV0aGVyIG1hbmRhdG9yeSBmaWxlIGxvY2tpbmcgaXMgZW5hYmxlZC4KICAqLwogI2RlZmluZSBNQU5ETE9DSyh2cCwgbW9kZSkJXAotCSgodnApLT52X3R5cGUgPT0gVlJFRyAmJiAoKG1vZGUpICYgKFZTR0lEfChWRVhFQz4+MykpKSA9PSBWU0dJRCkKKwkoVk5fSVNSRUcodnApICYmICgobW9kZSkgJiAoVlNHSUR8KFZFWEVDPj4zKSkpID09IFZTR0lEKQogCiBleHRlcm4gdm9pZAl2bl9pbml0KHZvaWQpOwotZXh0ZXJuIGludAl2bl93YWl0KHN0cnVjdCB2bm9kZSAqKTsKIGV4dGVybiB2bm9kZV90CSp2bl9pbml0aWFsaXplKHN0cnVjdCBpbm9kZSAqKTsKIAogLyoKLSAqIEFjcXVpcmluZyBhbmQgaW52YWxpZGF0aW5nIHZub2RlczoKLSAqCi0gKglpZiAodm5fZ2V0KHZwLCB2ZXJzaW9uLCAwKSkKLSAqCQkuLi47Ci0gKgl2bl9wdXJnZSh2cCwgdmVyc2lvbik7Ci0gKgotICogdm5fZ2V0IGFuZCB2bl9wdXJnZSBtdXN0IGJlIGNhbGxlZCB3aXRoIHZtYXBfdCBhcmd1bWVudHMsIHNhbXBsZWQKLSAqIHdoaWxlIGEgbG9jayB0aGF0IHRoZSB2bm9kZSdzIFZPUF9SRUNMQUlNIGZ1bmN0aW9uIGFjcXVpcmVzIGlzCi0gKiBoZWxkLCB0byBlbnN1cmUgdGhhdCB0aGUgdm5vZGUgc2FtcGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgaXNuJ3QKLSAqIHJlY3ljbGVkIChWT1BfUkVDTEFJTWVkKSBvciBkZWFsbG9jYXRlZCBiZXR3ZWVuIHRoZSByZWxlYXNlIG9mIHRoZSBsb2NrCi0gKiBhbmQgdGhlIHN1YnNlcXVlbnQgdm5fZ2V0IG9yIHZuX3B1cmdlLgotICovCi0KLS8qCiAgKiB2bm9kZV9tYXAgc3RydWN0dXJlcyBfbXVzdF8gbWF0Y2ggdm5fZXBvY2ggYW5kIHZub2RlIHN0cnVjdHVyZSBzaXplcy4KICAqLwogdHlwZWRlZiBzdHJ1Y3Qgdm5vZGVfbWFwIHsKQEAgLTUzMSwxMSArNTAyLDExIEBACiAJCQkgKHZtYXApLnZfbnVtYmVyID0gKHZwKS0+dl9udW1iZXIsCVwKIAkJCSAodm1hcCkudl9pbm8JID0gKHZwKS0+dl9pbm9kZS5pX2lubzsgfQogCi1leHRlcm4gdm9pZAl2bl9wdXJnZShzdHJ1Y3Qgdm5vZGUgKiwgdm1hcF90ICopOwotZXh0ZXJuIHZub2RlX3QJKnZuX2dldChzdHJ1Y3Qgdm5vZGUgKiwgdm1hcF90ICopOwogZXh0ZXJuIGludAl2bl9yZXZhbGlkYXRlKHN0cnVjdCB2bm9kZSAqKTsKIGV4dGVybiB2b2lkCXZuX3JldmFsaWRhdGVfY29yZShzdHJ1Y3Qgdm5vZGUgKiwgdmF0dHJfdCAqKTsKLWV4dGVybiB2b2lkCXZuX3JlbW92ZShzdHJ1Y3Qgdm5vZGUgKik7CisKK2V4dGVybiB2b2lkCXZuX2lvd2FpdChzdHJ1Y3Qgdm5vZGUgKnZwKTsKK2V4dGVybiB2b2lkCXZuX2lvd2FrZShzdHJ1Y3Qgdm5vZGUgKnZwKTsKIAogc3RhdGljIGlubGluZSBpbnQgdm5fY291bnQoc3RydWN0IHZub2RlICp2cCkKIHsKQEAgLTU0Niw3ICs1MTcsNiBAQAogICogVm5vZGUgcmVmZXJlbmNlIGNvdW50aW5nIGZ1bmN0aW9ucyAoYW5kIG1hY3JvcyBmb3IgY29tcGF0aWJpbGl0eSkuCiAgKi8KIGV4dGVybiB2bm9kZV90CSp2bl9ob2xkKHN0cnVjdCB2bm9kZSAqKTsKLWV4dGVybiB2b2lkCXZuX3JlbGUoc3RydWN0IHZub2RlICopOwogCiAjaWYgZGVmaW5lZChYRlNfVk5PREVfVFJBQ0UpCiAjZGVmaW5lIFZOX0hPTEQodnApCQlcCkBAIC01NjAsNiArNTMwLDEyIEBACiAjZGVmaW5lIFZOX1JFTEUodnApCQkoaXB1dChMSU5WRlNfR0VUX0lQKHZwKSkpCiAjZW5kaWYKIAorc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm5vZGUgKnZuX2dyYWIoc3RydWN0IHZub2RlICp2cCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gaWdyYWIoTElOVkZTX0dFVF9JUCh2cCkpOworCXJldHVybiBpbm9kZSA/IExJTlZGU19HRVRfVlAoaW5vZGUpIDogTlVMTDsKK30KKwogLyoKICAqIFZuYW1lIGhhbmRsaW5nIG1hY3Jvcy4KICAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL01ha2VmaWxlIGIvZnMveGZzL3F1b3RhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNGY3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvcXVvdGEvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAoraW5jbHVkZSAkKFRPUERJUikvZnMveGZzL3F1b3RhL01ha2VmaWxlLWxpbnV4LSQoVkVSU0lPTikuJChQQVRDSExFVkVMKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL01ha2VmaWxlLWxpbnV4LTIuNiBiL2ZzL3hmcy9xdW90YS9NYWtlZmlsZS1saW51eC0yLjYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlNjBlOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9xdW90YS9NYWtlZmlsZS1saW51eC0yLjYKQEAgLTAsMCArMSw1MyBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisjCisjIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworIyBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyMgb3IgdGhlIGxpa2UuCUFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisjIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyMgYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorIyBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyMgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorIyBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorIworIyBodHRwOi8vd3d3LnNnaS5jb20KKyMKKyMgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisjCisjIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyMKKworRVhUUkFfQ0ZMQUdTICs9IC1JICQoVE9QRElSKS9mcy94ZnMgLUkgJChUT1BESVIpL2ZzL3hmcy9saW51eC0yLjYKKworaWZlcSAoJChDT05GSUdfWEZTX0RFQlVHKSx5KQorCUVYVFJBX0NGTEFHUyArPSAtZyAtRERFQlVHCisJI0VYVFJBX0NGTEFHUyArPSAtRFFVT1RBREVCVUcKK2VuZGlmCitpZmVxICgkKENPTkZJR19YRlNfVFJBQ0UpLHkpCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0RRVU9UX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX1ZOT0RFX1RSQUNFCitlbmRpZgorCit4ZnMtJChDT05GSUdfWEZTX1FVT1RBKQkJKz0geGZzX2RxdW90Lm8gXAorCQkJCSAgIHhmc19kcXVvdF9pdGVtLm8gXAorCQkJCSAgIHhmc190cmFuc19kcXVvdC5vIFwKKwkJCQkgICB4ZnNfcW1fc3lzY2FsbHMubyBcCisJCQkJICAgeGZzX3FtX2Jodi5vIFwKKwkJCQkgICB4ZnNfcW0ubworCitpZmVxICgkKENPTkZJR19YRlNfUVVPVEEpLHkpCit4ZnMtJChDT05GSUdfUFJPQ19GUykJCSs9IHhmc19xbV9zdGF0cy5vCitlbmRpZgpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jCmluZGV4IDQ2Y2UxZTMuLmUyZThkMzUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMKQEAgLTQyMSw3ICs0MjEsNyBAQAogICovCiBTVEFUSUMgaW50CiB4ZnNfcW1fZHFhbGxvYygKLQl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX3RyYW5zX3QJKip0cHAsCiAJeGZzX21vdW50X3QJKm1wLAogCXhmc19kcXVvdF90CSpkcXAsCiAJeGZzX2lub2RlX3QJKnF1b3RpcCwKQEAgLTQzMyw2ICs0MzMsNyBAQAogCXhmc19ibWJ0X2lyZWNfdCBtYXA7CiAJaW50CQlubWFwcywgZXJyb3IsIGNvbW1pdHRlZDsKIAl4ZnNfYnVmX3QJKmJwOworCXhmc190cmFuc190CSp0cCA9ICp0cHA7CiAKIAlBU1NFUlQodHAgIT0gTlVMTCk7CiAJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFBTExPQyIpOwpAQCAtNDkyLDEwICs0OTMsMzIgQEAKIAl4ZnNfcW1faW5pdF9kcXVvdF9ibGsodHAsIG1wLCBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCksCiAJCQkgICAgICBkcXAtPmRxX2ZsYWdzICYgWEZTX0RRX0FMTFRZUEVTLCBicCk7CiAKLQlpZiAoKGVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZsaXN0LCBmaXJzdGJsb2NrLCAmY29tbWl0dGVkKSkpIHsKKwkvKgorCSAqIHhmc19ibWFwX2ZpbmlzaCgpIG1heSBjb21taXQgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gYW5kCisJICogc3RhcnQgYSBzZWNvbmQgdHJhbnNhY3Rpb24gaWYgdGhlIGZyZWVsaXN0IGlzIG5vdCBlbXB0eS4KKwkgKgorCSAqIFNpbmNlIHdlIHN0aWxsIHdhbnQgdG8gbW9kaWZ5IHRoaXMgYnVmZmVyLCB3ZSBuZWVkIHRvCisJICogZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBpcyBub3QgcmVsZWFzZWQgb24gY29tbWl0IG9mCisJICogdGhlIGZpcnN0IHRyYW5zYWN0aW9uIGFuZCBlbnN1cmUgdGhlIGJ1ZmZlciBpcyBhZGRlZCB0byB0aGUKKwkgKiBzZWNvbmQgdHJhbnNhY3Rpb24uCisJICoKKwkgKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB0cmFuc2FjdGlvbiB0aGVuIGRvbid0IHN0b3AgdGhlIGJ1ZmZlcgorCSAqIGZyb20gYmVpbmcgcmVsZWFzZWQgd2hlbiBpdCBjb21taXRzIGxhdGVyIG9uLgorCSAqLworCisJeGZzX3RyYW5zX2Job2xkKHRwLCBicCk7CisKKwlpZiAoKGVycm9yID0geGZzX2JtYXBfZmluaXNoKHRwcCwgJmZsaXN0LCBmaXJzdGJsb2NrLCAmY29tbWl0dGVkKSkpIHsKIAkJZ290byBlcnJvcjE7CiAJfQogCisJaWYgKGNvbW1pdHRlZCkgeworCQl0cCA9ICp0cHA7CisJCXhmc190cmFuc19iam9pbih0cCwgYnApOworCX0gZWxzZSB7CisJCXhmc190cmFuc19iaG9sZF9yZWxlYXNlKHRwLCBicCk7CisJfQorCiAJKk9fYnBwID0gYnA7CiAJcmV0dXJuIDA7CiAKQEAgLTUxNCw3ICs1MzcsNyBAQAogICovCiBTVEFUSUMgaW50CiB4ZnNfcW1fZHF0b2JwKAotCXhmc190cmFuc190CQkqdHAsCisJeGZzX3RyYW5zX3QJCSoqdHBwLAogCXhmc19kcXVvdF90CQkqZHFwLAogCXhmc19kaXNrX2RxdW90X3QJKipPX2RkcHAsCiAJeGZzX2J1Zl90CQkqKk9fYnBwLApAQCAtNTI4LDYgKzU1MSw3IEBACiAJeGZzX2Rpc2tfZHF1b3RfdCAqZGRxOwogCXhmc19kcWlkX3QJaWQ7CiAJYm9vbGVhbl90CW5ld2RxdW90OworCXhmc190cmFuc190CSp0cCA9ICh0cHAgPyAqdHBwIDogTlVMTCk7CiAKIAltcCA9IGRxcC0+cV9tb3VudDsKIAlpZCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKTsKQEAgLTU3OSw5ICs2MDMsMTAgQEAKIAkJCQlyZXR1cm4gKEVOT0VOVCk7CiAKIAkJCUFTU0VSVCh0cCk7Ci0JCQlpZiAoKGVycm9yID0geGZzX3FtX2RxYWxsb2ModHAsIG1wLCBkcXAsIHF1b3RpcCwKKwkJCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFhbGxvYyh0cHAsIG1wLCBkcXAsIHF1b3RpcCwKIAkJCQkJCWRxcC0+cV9maWxlb2Zmc2V0LCAmYnApKSkKIAkJCQlyZXR1cm4gKGVycm9yKTsKKwkJCXRwID0gKnRwcDsKIAkJCW5ld2RxdW90ID0gQl9UUlVFOwogCQl9IGVsc2UgewogCQkJLyoKQEAgLTY0NSw3ICs2NzAsNyBAQAogLyogQVJHU1VTRUQgKi8KIFNUQVRJQyBpbnQKIHhmc19xbV9kcXJlYWQoCi0JeGZzX3RyYW5zX3QJKnRwLAorCXhmc190cmFuc190CSoqdHBwLAogCXhmc19kcWlkX3QJaWQsCiAJeGZzX2RxdW90X3QJKmRxcCwJLyogZHF1b3QgdG8gZ2V0IGZpbGxlZCBpbiAqLwogCXVpbnQJCWZsYWdzKQpAQCAtNjUzLDE1ICs2NzgsMTkgQEAKIAl4ZnNfZGlza19kcXVvdF90ICpkZHFwOwogCXhmc19idWZfdAkgKmJwOwogCWludAkJIGVycm9yOworCXhmc190cmFuc190CSAqdHA7CisKKwlBU1NFUlQodHBwKTsKIAogCS8qCiAJICogZ2V0IGEgcG9pbnRlciB0byB0aGUgb24tZGlzayBkcXVvdCBhbmQgdGhlIGJ1ZmZlciBjb250YWluaW5nIGl0CiAJICogZHFwIGFscmVhZHkga25vd3MgaXRzIG93biB0eXBlIChHUk9VUC9VU0VSKS4KIAkgKi8KIAl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUVJFQUQiKTsKLQlpZiAoKGVycm9yID0geGZzX3FtX2RxdG9icCh0cCwgZHFwLCAmZGRxcCwgJmJwLCBmbGFncykpKSB7CisJaWYgKChlcnJvciA9IHhmc19xbV9kcXRvYnAodHBwLCBkcXAsICZkZHFwLCAmYnAsIGZsYWdzKSkpIHsKIAkJcmV0dXJuIChlcnJvcik7CiAJfQorCXRwID0gKnRwcDsKIAogCS8qIGNvcHkgZXZlcnl0aGluZyBmcm9tIGRpc2sgZHF1b3QgdG8gdGhlIGluY29yZSBkcXVvdCAqLwogCW1lbWNweSgmZHFwLT5xX2NvcmUsIGRkcXAsIHNpemVvZih4ZnNfZGlza19kcXVvdF90KSk7CkBAIC03NDAsNyArNzY5LDcgQEAKIAkgKiBSZWFkIGl0IGZyb20gZGlzazsgeGZzX2RxcmVhZCgpIHRha2VzIGNhcmUgb2YKIAkgKiBhbGwgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbiBvZiBkcXVvdCdzIGZpZWxkcyAobG9ja3MsIGV0YykKIAkgKi8KLQlpZiAoKGVycm9yID0geGZzX3FtX2RxcmVhZCh0cCwgaWQsIGRxcCwgZmxhZ3MpKSkgeworCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFyZWFkKCZ0cCwgaWQsIGRxcCwgZmxhZ3MpKSkgewogCQkvKgogCQkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgcXVvdGFzIGdvdCB0dXJuZWQgb2ZmIChFU1JDSCksCiAJCSAqIG9yIGlmIHRoZSBkcXVvdCBkaWRuJ3QgZXhpc3Qgb24gZGlzayBhbmQgd2UgYXNrIHRvCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmggYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmgKaW5kZXggMzkxNzUxMC4uOGViYzg3MSAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5oCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKQEAgLTExMywyMCArMTEzLDYgQEAKIAogI2RlZmluZSBYRlNfRFFIT0xEKGRxcCkJCSgoZHFwKS0+cV9ucmVmcysrKQogCi0vKgotICogUXVvdGEgQWNjb3VudGluZy9FbmZvcmNlbWVudCBmbGFncwotICovCi0jZGVmaW5lIFhGU19BTExfUVVPVEFfQUNDVAlcCi0JCShYRlNfVVFVT1RBX0FDQ1QgfCBYRlNfR1FVT1RBX0FDQ1QgfCBYRlNfUFFVT1RBX0FDQ1QpCi0jZGVmaW5lIFhGU19BTExfUVVPVEFfRU5GRAkoWEZTX1VRVU9UQV9FTkZEIHwgWEZTX09RVU9UQV9FTkZEKQotI2RlZmluZSBYRlNfQUxMX1FVT1RBX0NIS0QJKFhGU19VUVVPVEFfQ0hLRCB8IFhGU19PUVVPVEFfQ0hLRCkKLQotI2RlZmluZSBYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkJKChtcCktPm1fcWZsYWdzICYgWEZTX0FMTF9RVU9UQV9BQ0NUKQotI2RlZmluZSBYRlNfSVNfUVVPVEFfRU5GT1JDRUQobXApCSgobXApLT5tX3FmbGFncyAmIFhGU19BTExfUVVPVEFfRU5GRCkKLSNkZWZpbmUgWEZTX0lTX1VRVU9UQV9SVU5OSU5HKG1wKQkoKG1wKS0+bV9xZmxhZ3MgJiBYRlNfVVFVT1RBX0FDQ1QpCi0jZGVmaW5lIFhGU19JU19QUVVPVEFfUlVOTklORyhtcCkJKChtcCktPm1fcWZsYWdzICYgWEZTX1BRVU9UQV9BQ0NUKQotI2RlZmluZSBYRlNfSVNfR1FVT1RBX1JVTk5JTkcobXApCSgobXApLT5tX3FmbGFncyAmIFhGU19HUVVPVEFfQUNDVCkKLQogI2lmZGVmIERFQlVHCiBzdGF0aWMgaW5saW5lIGludAogWEZTX0RRX0lTX0xPQ0tFRCh4ZnNfZHF1b3RfdCAqZHFwKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmMgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYwppbmRleCBmNTI3MWI3Li5lNzRlYWE3IDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYworKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYwpAQCAtNTA5LDYgKzUwOSw3IEBACiAKIAlsb2dfdmVjdG9yLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJihxZi0+cXFsX2Zvcm1hdCk7CiAJbG9nX3ZlY3Rvci0+aV9sZW4gPSBzaXplb2YoeGZzX3FvZmZfbG9naXRlbV90KTsKKwlYTE9HX1ZFQ19TRVRfVFlQRShsb2dfdmVjdG9yLCBYTE9HX1JFR19UWVBFX1FVT1RBT0ZGKTsKIAlxZi0+cXFsX2Zvcm1hdC5xZl9zaXplID0gMTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbS5jIGIvZnMveGZzL3F1b3RhL3hmc19xbS5jCmluZGV4IGY2NjVjYThmLi5lZmRlMTZlIDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3FtLmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtMzY1LDE2ICszNjUsNiBAQAogCWludAkJZXJyb3IgPSAwOwogCXVpbnQJCXNiZjsKIAotCS8qCi0JICogSWYgYSBmaWxlIHN5c3RlbSBoYWQgcXVvdGFzIHJ1bm5pbmcgZWFybGllciwgYnV0IGRlY2lkZWQgdG8KLQkgKiBtb3VudCB3aXRob3V0IC1vIHVxdW90YS9wcXVvdGEvZ3F1b3RhIG9wdGlvbnMsIHJldm9rZSB0aGUKLQkgKiBxdW90YWNoZWNrZWQgbGljZW5zZSwgYW5kIGJhaWwgb3V0LgotCSAqLwotCWlmICghIFhGU19JU19RVU9UQV9PTihtcCkgJiYKLQkgICAgKG1wLT5tX3NiLnNiX3FmbGFncyAmIFhGU19BTExfUVVPVEFfQUNDVCkpIHsKLQkJbXAtPm1fcWZsYWdzID0gMDsKLQkJZ290byB3cml0ZV9jaGFuZ2VzOwotCX0KIAogCS8qCiAJICogSWYgcXVvdGFzIG9uIHJlYWx0aW1lIHZvbHVtZXMgaXMgbm90IHN1cHBvcnRlZCwgd2UgZGlzYWJsZQpAQCAtMzg4LDExICszNzgsOCBAQAogCQlnb3RvIHdyaXRlX2NoYW5nZXM7CiAJfQogCi0jaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChYRlNfTE9VRF9SRUNPVkVSWSkKLQljbW5fZXJyKENFX05PVEUsICJBdHRlbXB0aW5nIHRvIHR1cm4gb24gZGlzayBxdW90YXMuIik7Ci0jZW5kaWYKLQogCUFTU0VSVChYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkpOworCiAJLyoKIAkgKiBBbGxvY2F0ZSB0aGUgcXVvdGFpbmZvIHN0cnVjdHVyZSBpbnNpZGUgdGhlIG1vdW50IHN0cnVjdCwgYW5kCiAJICogY3JlYXRlIHF1b3RhaW5vZGUocyksIGFuZCBjaGFuZ2UvcmV2IHN1cGVyYmxvY2sgaWYgbmVjZXNzYXJ5LgpAQCAtNDEwLDE5ICszOTcsMTQgQEAKIAkgKi8KIAlpZiAoWEZTX1FNX05FRURfUVVPVEFDSEVDSyhtcCkgJiYKIAkJIShtZnNpX2ZsYWdzICYgWEZTX01GU0lfTk9fUVVPVEFDSEVDSykpIHsKLSNpZmRlZiBERUJVRwotCQljbW5fZXJyKENFX05PVEUsICJEb2luZyBhIHF1b3RhY2hlY2suIFBsZWFzZSB3YWl0LiIpOwotI2VuZGlmCiAJCWlmICgoZXJyb3IgPSB4ZnNfcW1fcXVvdGFjaGVjayhtcCkpKSB7CiAJCQkvKiBRdW90YWNoZWNrIGhhcyBmYWlsZWQgYW5kIHF1b3RhcyBoYXZlCiAJCQkgKiBiZWVuIGRpc2FibGVkLgogCQkJICovCiAJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKIAkJfQotI2lmZGVmIERFQlVHCi0JCWNtbl9lcnIoQ0VfTk9URSwgIkRvbmUgcXVvdGFjaGVjay4iKTsKLSNlbmRpZgogCX0KKwogIHdyaXRlX2NoYW5nZXM6CiAJLyoKIAkgKiBXZSBhY3R1YWxseSBkb24ndCBoYXZlIHRvIGFjcXVpcmUgdGhlIFNCX0xPQ0sgYXQgYWxsLgpAQCAtMjAxMCw3ICsxOTkyLDcgQEAKIAkJQVNTRVJUKG1wLT5tX3F1b3RhaW5mbyAhPSBOVUxMKTsKIAkJQVNTRVJUKHhmc19HcW0gIT0gTlVMTCk7CiAJCXhmc19xbV9kZXN0cm95X3F1b3RhaW5mbyhtcCk7Ci0JCXhmc19tb3VudF9yZXNldF9zYnFmbGFncyhtcCk7CisJCSh2b2lkKXhmc19tb3VudF9yZXNldF9zYnFmbGFncyhtcCk7CiAJfSBlbHNlIHsKIAkJY21uX2VycihDRV9OT1RFLCAiWEZTIHF1b3RhY2hlY2sgJXM6IERvbmUuIiwgbXAtPm1fZnNuYW1lKTsKIAl9CmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtLmggYi9mcy94ZnMvcXVvdGEveGZzX3FtLmgKaW5kZXggYjAzZWVjZi4uMGIwMGIzYyAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbS5oCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uaApAQCAtMTg0LDggKzE4NCw2IEBACiAjZGVmaW5lIFhGU19RTV9IT0xEKHhxbSkJKCh4cW0pLT5xbV9ucmVmcysrKQogI2RlZmluZSBYRlNfUU1fUkVMRSh4cW0pCSgoeHFtKS0+cW1fbnJlZnMtLSkKIAotZXh0ZXJuIHZvaWQJCXhmc19tb3VudF9yZXNldF9zYnFmbGFncyh4ZnNfbW91bnRfdCAqKTsKLQogZXh0ZXJuIHZvaWQJCXhmc19xbV9kZXN0cm95X3F1b3RhaW5mbyh4ZnNfbW91bnRfdCAqKTsKIGV4dGVybiBpbnQJCXhmc19xbV9tb3VudF9xdW90YXMoeGZzX21vdW50X3QgKiwgaW50KTsKIGV4dGVybiB2b2lkCQl4ZnNfcW1fbW91bnRfcXVvdGFpbml0KHhmc19tb3VudF90ICosIHVpbnQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9iaHYuYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fYmh2LmMKaW5kZXggZGMzYzM3YS4uODg5MGExOCAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbV9iaHYuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX2Jodi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtMjI5LDQ4ICsyMjksNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotLyoKLSAqIENsZWFyIHRoZSBxdW90YWZsYWdzIGluIG1lbW9yeSBhbmQgaW4gdGhlIHN1cGVyYmxvY2suCi0gKi8KLXZvaWQKLXhmc19tb3VudF9yZXNldF9zYnFmbGFncygKLQl4ZnNfbW91bnRfdAkJKm1wKQotewotCXhmc190cmFuc190CQkqdHA7Ci0JdW5zaWduZWQgbG9uZwkJczsKLQotCW1wLT5tX3FmbGFncyA9IDA7Ci0JLyoKLQkgKiBJdCBpcyBPSyB0byBsb29rIGF0IHNiX3FmbGFncyBoZXJlIGluIG1vdW50IHBhdGgsCi0JICogd2l0aG91dCBTQl9MT0NLLgotCSAqLwotCWlmIChtcC0+bV9zYi5zYl9xZmxhZ3MgPT0gMCkKLQkJcmV0dXJuOwotCXMgPSBYRlNfU0JfTE9DSyhtcCk7Ci0JbXAtPm1fc2Iuc2JfcWZsYWdzID0gMDsKLQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKLQotCS8qCi0JICogaWYgdGhlIGZzIGlzIHJlYWRvbmx5LCBsZXQgdGhlIGluY29yZSBzdXBlcmJsb2NrIHJ1bgotCSAqIHdpdGggcXVvdGFzIG9mZiBidXQgZG9uJ3QgZmx1c2ggdGhlIHVwZGF0ZSBvdXQgdG8gZGlzawotCSAqLwotCWlmIChYRlNfTVRPVkZTKG1wKS0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKQotCQlyZXR1cm47Ci0jaWZkZWYgUVVPVEFERUJVRwotCXhmc19mc19jbW5fZXJyKENFX05PVEUsIG1wLCAiV3JpdGluZyBzdXBlcmJsb2NrIHF1b3RhIGNoYW5nZXMiKTsKLSNlbmRpZgotCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfUU1fU0JDSEFOR0UpOwotCWlmICh4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgbXAtPm1fc2Iuc2Jfc2VjdHNpemUgKyAxMjgsIDAsIDAsCi0JCQkJICAgICAgWEZTX0RFRkFVTFRfTE9HX0NPVU5UKSkgewotCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKLQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAotCQkJInhmc19tb3VudF9yZXNldF9zYnFmbGFnczogU3VwZXJibG9jayB1cGRhdGUgZmFpbGVkISIpOwotCQlyZXR1cm47Ci0JfQotCXhmc19tb2Rfc2IodHAsIFhGU19TQl9RRkxBR1MpOwotCXhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOwotfQotCiBTVEFUSUMgaW50CiB4ZnNfcW1fbmV3bW91bnQoCiAJeGZzX21vdW50X3QJKm1wLApkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jIGIvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jCmluZGV4IDY4ZTk4OTYuLjE1ZTAyZTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3lzY2FsbHMuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMKQEAgLTEwNTMsNyArMTA1Myw2IEBACiAJc3RydWN0IHhmc19tb3VudCAqbXAsCiAJdWludAkJIGZsYWdzKQogewotCXZtYXBfdAkJdm1hcDsKIAl4ZnNfaW5vZGVfdAkqaXAsICp0b3Bpbm87CiAJdWludAkJaXJlY2xhaW1zOwogCXZub2RlX3QJCSp2cDsKQEAgLTEwNjEsOCArMTA2MCw4IEBACiAKIAlBU1NFUlQobXAtPm1fcXVvdGFpbmZvKTsKIAotYWdhaW46CiAJWEZTX01PVU5UX0lMT0NLKG1wKTsKK2FnYWluOgogCWlwID0gbXAtPm1faW5vZGVzOwogCWlmIChpcCA9PSBOVUxMKSB7CiAJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKQEAgLTEwOTAsMTggKzEwODksMTQgQEAKIAkJfQogCQl2bm9kZV9yZWZkID0gQl9GQUxTRTsKIAkJaWYgKHhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JTE9DS19FWENMKSA9PSAwKSB7Ci0JCQkvKgotCQkJICogU2FtcGxlIHZwIG1hcHBpbmcgd2hpbGUgaG9sZGluZyB0aGUgbXBsb2NrLCBsZXN0Ci0JCQkgKiB3ZSBjb21lIGFjcm9zcyBhIG5vbi1leGlzdGVudCB2bm9kZS4KLQkJCSAqLwotCQkJVk1BUCh2cCwgdm1hcCk7CiAJCQlpcmVjbGFpbXMgPSBtcC0+bV9pcmVjbGFpbXM7CiAJCQl0b3Bpbm8gPSBtcC0+bV9pbm9kZXM7Ci0JCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7Ci0KLQkJCS8qIFhYWCByZXN0YXJ0IGxpbWl0ID8gKi8KLQkJCWlmICggISAodnAgPSB2bl9nZXQodnAsICZ2bWFwKSkpCisJCQl2cCA9IHZuX2dyYWIodnApOworCQkJaWYgKCF2cCkKIAkJCQlnb3RvIGFnYWluOworCisJCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisJCQkvKiBYWFggcmVzdGFydCBsaW1pdCA/ICovCiAJCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKIAkJCXZub2RlX3JlZmQgPSBCX1RSVUU7CiAJCX0gZWxzZSB7CkBAIC0xMTM3LDcgKzExMzIsNiBAQAogCQkgKi8KIAkJaWYgKHRvcGlubyAhPSBtcC0+bV9pbm9kZXMgfHwgbXAtPm1faXJlY2xhaW1zICE9IGlyZWNsYWltcykgewogCQkJLyogWFhYIHVzZSBhIHNlbnRpbmVsICovCi0JCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CiAJCQlnb3RvIGFnYWluOwogCQl9CiAJCWlwID0gaXAtPmlfbW5leHQ7CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuYwppbmRleCA0ZWQ3YjY5Li40ZTFhNWVjIDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMKQEAgLTMxLDYgKzMxLDcgQEAKICAqLwogCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJzcGluLmgiCiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9rdHJhY2UuYyBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCmluZGV4IDNkYWUxNGMuLmZhODM5NGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIAl2b2lkICAgICAgICAgICAgKnZhbDE0LAogCXZvaWQgICAgICAgICAgICAqdmFsMTUpCiB7Ci0Jc3RhdGljIGxvY2tfdCAgIHdyYXBfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHdyYXBfbG9jayk7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAlpbnQgICAgICAgICAgICAgaW5kZXg7CiAJa3RyYWNlX2VudHJ5X3QgICprdGVwOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hY2wuYyBiL2ZzL3hmcy94ZnNfYWNsLmMKaW5kZXggOGQwMWRjZS4uOTJmZDFkNiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hY2wuYworKysgYi9mcy94ZnMveGZzX2FjbC5jCkBAIC04NSw3ICs4NSw3IEBACiB7CiAJaW50CQllcnJvcjsKIAotCWlmICh2cC0+dl90eXBlICE9IFZESVIpCisJaWYgKCFWTl9JU0RJUih2cCkpCiAJCXJldHVybiAwOwogCXhmc19hY2xfZ2V0X2F0dHIodnAsIE5VTEwsIF9BQ0xfVFlQRV9ERUZBVUxULCBBVFRSX0tFUk5PVkFMLCAmZXJyb3IpOwogCXJldHVybiAoZXJyb3IgPT0gMCk7CkBAIC0zODksNyArMzg5LDcgQEAKIAogCWlmICh2cC0+dl9pbm9kZS5pX2ZsYWdzICYgKFNfSU1NVVRBQkxFfFNfQVBQRU5EKSkKIAkJcmV0dXJuIEVQRVJNOwotCWlmIChraW5kID09IF9BQ0xfVFlQRV9ERUZBVUxUICYmIHZwLT52X3R5cGUgIT0gVkRJUikKKwlpZiAoa2luZCA9PSBfQUNMX1RZUEVfREVGQVVMVCAmJiAhVk5fSVNESVIodnApKQogCQlyZXR1cm4gRU5PVERJUjsKIAlpZiAodnAtPnZfdmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKQogCQlyZXR1cm4gRVJPRlM7CkBAIC03NTAsNyArNzUwLDcgQEAKIAkgKiBJZiB0aGUgbmV3IGZpbGUgaXMgYSBkaXJlY3RvcnksIGl0cyBkZWZhdWx0IEFDTCBpcyBhIGNvcHkgb2YKIAkgKiB0aGUgY29udGFpbmluZyBkaXJlY3RvcnkncyBkZWZhdWx0IEFDTC4KIAkgKi8KLQlpZiAodnAtPnZfdHlwZSA9PSBWRElSKQorCWlmIChWTl9JU0RJUih2cCkpCiAJCXhmc19hY2xfc2V0X2F0dHIodnAsIHBkYWNscCwgX0FDTF9UWVBFX0RFRkFVTFQsICZlcnJvcik7CiAJaWYgKCFlcnJvciAmJiAhYmFzaWNwZXJtcykKIAkJeGZzX2FjbF9zZXRfYXR0cih2cCwgY2FjbCwgX0FDTF9UWVBFX0FDQ0VTUywgJmVycm9yKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXJjaC5oIGIvZnMveGZzL3hmc19hcmNoLmgKaW5kZXggYWUzNTE4OS4uNWFiMGRkOCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hcmNoLmgKKysrIGIvZnMveGZzL3hmc19hcmNoLmgKQEAgLTQwLDIyICs0MCwyOCBAQAogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCi0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0jIGRlZmluZSBfX0JZVEVfT1JERVIJX19MSVRUTEVfRU5ESUFOCi0jZW5kaWYKICNpZmRlZiBfX0JJR19FTkRJQU4KLSMgZGVmaW5lIF9fQllURV9PUkRFUglfX0JJR19FTkRJQU4KKyNkZWZpbmUJWEZTX05BVElWRV9IT1NUCTEKKyNlbHNlCisjdW5kZWYgWEZTX05BVElWRV9IT1NUCisjZW5kaWYKKworI2Vsc2UgLyogX19LRVJORUxfXyAqLworCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorI2RlZmluZQlYRlNfTkFUSVZFX0hPU1QJMQorI2Vsc2UKKyN1bmRlZiBYRlNfTkFUSVZFX0hPU1QKICNlbmRpZgogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAvKiBkbyB3ZSBuZWVkIGNvbnZlcnNpb24/ICovCi0KICNkZWZpbmUgQVJDSF9OT0NPTlZFUlQgMQotI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KLSMgZGVmaW5lIEFSQ0hfQ09OVkVSVAkwCi0jZWxzZQorI2lmZGVmIFhGU19OQVRJVkVfSE9TVAogIyBkZWZpbmUgQVJDSF9DT05WRVJUCUFSQ0hfTk9DT05WRVJUCisjZWxzZQorIyBkZWZpbmUgQVJDSF9DT05WRVJUCTAKICNlbmRpZgogCiAvKiBnZW5lcmljIHN3YXBwaW5nIG1hY3JvcyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwLmMgYi9mcy94ZnMveGZzX2JtYXAuYwppbmRleCA2ZjVkMjgzLi4zZTc2ZGVmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXAuYworKysgYi9mcy94ZnMveGZzX2JtYXAuYwpAQCAtNDc1NCwxMCArNDc1NCwyMCBAQAogCQkJCQllcnJvciA9IHhmc19tb2RfaW5jb3JlX3NiKG1wLAogCQkJCQkJCVhGU19TQlNfRkRCTE9DS1MsCiAJCQkJCQkJLShhbGVuKSwgcnN2ZCk7Ci0JCQkJaWYgKCFlcnJvcikKKwkJCQlpZiAoIWVycm9yKSB7CiAJCQkJCWVycm9yID0geGZzX21vZF9pbmNvcmVfc2IobXAsCiAJCQkJCQkJWEZTX1NCU19GREJMT0NLUywKIAkJCQkJCQktKGluZGxlbiksIHJzdmQpOworCQkJCQlpZiAoZXJyb3IgJiYgcnQpIHsKKwkJCQkJCXhmc19tb2RfaW5jb3JlX3NiKGlwLT5pX21vdW50LAorCQkJCQkJCVhGU19TQlNfRlJFWFRFTlRTLAorCQkJCQkJCWV4dHN6LCByc3ZkKTsKKwkJCQkJfSBlbHNlIGlmIChlcnJvcikgeworCQkJCQkJeGZzX21vZF9pbmNvcmVfc2IoaXAtPmlfbW91bnQsCisJCQkJCQkJWEZTX1NCU19GREJMT0NLUywKKwkJCQkJCQlhbGVuLCByc3ZkKTsKKwkJCQkJfQorCQkJCX0KIAogCQkJCWlmIChlcnJvcikgewogCQkJCQlpZiAoWEZTX0lTX1FVT1RBX09OKGlwLT5pX21vdW50KSkKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKaW5kZXggMDljNDEzNS4uMDlhNzdiMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKQEAgLTIwMTcsNyArMjAxNyw3IEBACiAJCQkJZXh0X2ZsYWcpOwogfQogCi0jaWYgX19CWVRFX09SREVSICE9IF9fQklHX0VORElBTgorI2lmbmRlZiBYRlNfTkFUSVZFX0hPU1QKIC8qIEVuZGlhbiBmbGlwcGluZyB2ZXJzaW9ucyBvZiB0aGUgYm1idCBleHRyYWN0aW9uIGZ1bmN0aW9ucyAqLwogdm9pZAogeGZzX2JtYnRfZGlza19nZXRfYWxsKApAQCAtMjA4Nyw3ICsyMDg3LDcgQEAKIAlyZXR1cm4geGZzX2V4dGVudF9zdGF0ZSh4ZnNfYm1idF9kaXNrX2dldF9ibG9ja2NvdW50KHIpLAogCQkJCWV4dF9mbGFnKTsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIFhGU19OQVRJVkVfSE9TVCAqLwogCiAKIC8qCkBAIC0yNTMxLDcgKzI1MzEsNyBAQAogI2VuZGlmCS8qIFhGU19CSUdfQkxLTk9TICovCiB9CiAKLSNpZiBfX0JZVEVfT1JERVIgIT0gX19CSUdfRU5ESUFOCisjaWZuZGVmIFhGU19OQVRJVkVfSE9TVAogLyoKICAqIFNldCBhbGwgdGhlIGZpZWxkcyBpbiBhIGJtYXAgZXh0ZW50IHJlY29yZCBmcm9tIHRoZSB1bmNvbXByZXNzZWQgZm9ybS4KICAqLwpAQCAtMjYxNyw3ICsyNjE3LDcgQEAKIAl9CiAjZW5kaWYJLyogWEZTX0JJR19CTEtOT1MgKi8KIH0KLSNlbmRpZgorI2VuZGlmIC8qIFhGU19OQVRJVkVfSE9TVCAqLwogCiAvKgogICogU2V0IHRoZSBibG9ja2NvdW50IGZpZWxkIGluIGEgYm1hcCBleHRlbnQgcmVjb3JkLgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwX2J0cmVlLmggYi9mcy94ZnMveGZzX2JtYXBfYnRyZWUuaAppbmRleCAwYTQwY2YxLi4yY2Y0ZmU0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXBfYnRyZWUuaAorKysgYi9mcy94ZnMveGZzX2JtYXBfYnRyZWUuaApAQCAtNjIsNyArNjIsNyBAQAogICogIGwxOjAtMjAgYXJlIGJsb2NrY291bnQuCiAgKi8KIAotI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyNpZm5kZWYgWEZTX05BVElWRV9IT1NUCiAKICNkZWZpbmUgQk1CVF9UT1RBTF9CSVRMRU4JMTI4CS8qIDEyOCBiaXRzLCAxNiBieXRlcyAqLwogI2RlZmluZSBCTUJUX0VYTlRGTEFHX0JJVE9GRgkwCkBAIC04Nyw3ICs4Nyw3IEBACiAjZGVmaW5lIEJNQlRfQkxPQ0tDT1VOVF9CSVRPRkYJNjQgLyogU3RhcnQgb2Ygc2Vjb25kIDY0IGJpdCBjb250YWluZXIgKi8KICNkZWZpbmUgQk1CVF9CTE9DS0NPVU5UX0JJVExFTgkyMQogCi0jZW5kaWYKKyNlbmRpZiAvKiBYRlNfTkFUSVZFX0hPU1QgKi8KIAogCiAjZGVmaW5lIEJNQlRfVVNFXzY0CTEKQEAgLTUwNSw3ICs1MDUsNyBAQAogeGZzX2JtYnRfZ2V0X3N0YXRlKAogCXhmc19ibWJ0X3JlY190CSpyKTsKIAotI2lmIF9fQllURV9PUkRFUiAhPSBfX0JJR19FTkRJQU4KKyNpZm5kZWYgWEZTX05BVElWRV9IT1NUCiB2b2lkCiB4ZnNfYm1idF9kaXNrX2dldF9hbGwoCiAJeGZzX2JtYnRfcmVjX3QJKnIsCkBAIC01MzgsNyArNTM4LDcgQEAKIAl4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChyKQogI2RlZmluZSB4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZihyKSBcCiAJeGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmKHIpCi0jZW5kaWYKKyNlbmRpZiAvKiBYRlNfTkFUSVZFX0hPU1QgKi8KIAogaW50CiB4ZnNfYm1idF9pbmNyZW1lbnQoCkBAIC02MjMsNyArNjIzLDcgQEAKIAl4ZnNfYm1idF9yZWNfdAkqciwKIAl4ZnNfZXhudHN0X3QJdik7CiAKLSNpZiBfX0JZVEVfT1JERVIgIT0gX19CSUdfRU5ESUFOCisjaWZuZGVmIFhGU19OQVRJVkVfSE9TVAogdm9pZAogeGZzX2JtYnRfZGlza19zZXRfYWxsKAogCXhmc19ibWJ0X3JlY190CSpyLApAQCAtNjQxLDcgKzY0MSw3IEBACiAJeGZzX2JtYnRfc2V0X2FsbChyLCBzKQogI2RlZmluZSB4ZnNfYm1idF9kaXNrX3NldF9hbGxmKHIsIG8sIGIsIGMsIHYpIFwKIAl4ZnNfYm1idF9zZXRfYWxsZihyLCBvLCBiLCBjLCB2KQotI2VuZGlmCisjZW5kaWYgLyogWEZTX05BVElWRV9IT1NUICovCiAKIHZvaWQKIHhmc19ibWJ0X3RvX2JtZHIoCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmMgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKaW5kZXggMzBiODI4NS4uYTI2NDY1NyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idWZfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYwpAQCAtMjc0LDYgKzI3NCw3IEBACiAJCSAgICAgICAoKGJpcC0+YmxpX2Zvcm1hdC5ibGZfbWFwX3NpemUgLSAxKSAqIHNpemVvZih1aW50KSkpOwogCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmYmlwLT5ibGlfZm9ybWF0OwogCXZlY3AtPmlfbGVuID0gYmFzZV9zaXplOworCVhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIFhMT0dfUkVHX1RZUEVfQkZPUk1BVCk7CiAJdmVjcCsrOwogCW52ZWNzID0gMTsKIApAQCAtMzIwLDEyICszMjEsMTQgQEAKIAkJCWJ1ZmZlcl9vZmZzZXQgPSBmaXJzdF9iaXQgKiBYRlNfQkxJX0NIVU5LOwogCQkJdmVjcC0+aV9hZGRyID0geGZzX2J1Zl9vZmZzZXQoYnAsIGJ1ZmZlcl9vZmZzZXQpOwogCQkJdmVjcC0+aV9sZW4gPSBuYml0cyAqIFhGU19CTElfQ0hVTks7CisJCQlYTE9HX1ZFQ19TRVRfVFlQRSh2ZWNwLCBYTE9HX1JFR19UWVBFX0JDSFVOSyk7CiAJCQludmVjcysrOwogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAobmV4dF9iaXQgIT0gbGFzdF9iaXQgKyAxKSB7CiAJCQlidWZmZXJfb2Zmc2V0ID0gZmlyc3RfYml0ICogWEZTX0JMSV9DSFVOSzsKIAkJCXZlY3AtPmlfYWRkciA9IHhmc19idWZfb2Zmc2V0KGJwLCBidWZmZXJfb2Zmc2V0KTsKIAkJCXZlY3AtPmlfbGVuID0gbmJpdHMgKiBYRlNfQkxJX0NIVU5LOworCQkJWExPR19WRUNfU0VUX1RZUEUodmVjcCwgWExPR19SRUdfVFlQRV9CQ0hVTkspOwogCQkJbnZlY3MrKzsKIAkJCXZlY3ArKzsKIAkJCWZpcnN0X2JpdCA9IG5leHRfYml0OwpAQCAtMzM3LDYgKzM0MCw3IEBACiAJCQlidWZmZXJfb2Zmc2V0ID0gZmlyc3RfYml0ICogWEZTX0JMSV9DSFVOSzsKIAkJCXZlY3AtPmlfYWRkciA9IHhmc19idWZfb2Zmc2V0KGJwLCBidWZmZXJfb2Zmc2V0KTsKIAkJCXZlY3AtPmlfbGVuID0gbmJpdHMgKiBYRlNfQkxJX0NIVU5LOworCQkJWExPR19WRUNfU0VUX1RZUEUodmVjcCwgWExPR19SRUdfVFlQRV9CQ0hVTkspOwogLyogWW91IHdvdWxkIHRoaW5rIHdlIG5lZWQgdG8gYnVtcCB0aGUgbnZlY3MgaGVyZSB0b28sIGJ1dCB3ZSBkbyBub3QKICAqIHRoaXMgbnVtYmVyIGlzIHVzZWQgYnkgcmVjb3ZlcnksIGFuZCBpdCBnZXRzIGNvbmZ1c2VkIGJ5IHRoZSBib3VuZGFyeQogICogc3BsaXQgaGVyZQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXJfbGVhZi5oIGIvZnMveGZzL3hmc19kaXJfbGVhZi5oCmluZGV4IGRkNDIzY2UuLjQ4MGJmZmMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyX2xlYWYuaAorKysgYi9mcy94ZnMveGZzX2Rpcl9sZWFmLmgKQEAgLTEyNywxMyArMTI3LDEzIEBACiAJICogV2F0Y2ggdGhlIG9yZGVyIGhlcmUgKGVuZGlhbi1uZXNzIGRlcGVuZGVudCkuCiAJICovCiAJc3RydWN0IHsKLSNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjaWZuZGVmIFhGU19OQVRJVkVfSE9TVAogCQl4ZnNfZGFoYXNoX3QJaDsJLyogaGFzaCB2YWx1ZSAqLwogCQlfX3VpbnQzMl90CWJlOwkvKiBibG9jayBhbmQgZW50cnkgKi8KLSNlbHNlCS8qIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4gKi8KKyNlbHNlCiAJCV9fdWludDMyX3QJYmU7CS8qIGJsb2NrIGFuZCBlbnRyeSAqLwogCQl4ZnNfZGFoYXNoX3QJaDsJLyogaGFzaCB2YWx1ZSAqLwotI2VuZGlmCS8qIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4gKi8KKyNlbmRpZiAvKiBYRlNfTkFUSVZFX0hPU1QgKi8KIAl9IHM7CiB9IHhmc19kaXJjb29rX3Q7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZG1hcGkuaCBiL2ZzL3hmcy94ZnNfZG1hcGkuaAppbmRleCA1NWMxN2FkLi4xOWU4NzI4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RtYXBpLmgKKysrIGIvZnMveGZzL3hmc19kbWFwaS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMKaW5kZXggZGI3Y2JkMS4uY2M3ZDE0OSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5jCkBAIC0xMDcsNiArMTA3LDcgQEAKIAogCWxvZ192ZWN0b3ItPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmKGVmaXAtPmVmaV9mb3JtYXQpOwogCWxvZ192ZWN0b3ItPmlfbGVuID0gc2l6ZTsKKwlYTE9HX1ZFQ19TRVRfVFlQRShsb2dfdmVjdG9yLCBYTE9HX1JFR19UWVBFX0VGSV9GT1JNQVQpOwogCUFTU0VSVChzaXplID49IHNpemVvZih4ZnNfZWZpX2xvZ19mb3JtYXRfdCkpOwogfQogCkBAIC00MjYsNiArNDI3LDcgQEAKIAogCWxvZ192ZWN0b3ItPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmKGVmZHAtPmVmZF9mb3JtYXQpOwogCWxvZ192ZWN0b3ItPmlfbGVuID0gc2l6ZTsKKwlYTE9HX1ZFQ19TRVRfVFlQRShsb2dfdmVjdG9yLCBYTE9HX1JFR19UWVBFX0VGRF9GT1JNQVQpOwogCUFTU0VSVChzaXplID49IHNpemVvZih4ZnNfZWZkX2xvZ19mb3JtYXRfdCkpOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lnZXQuYyBiL2ZzL3hmcy94ZnNfaWdldC5jCmluZGV4IGQzZGEwMDAuLjBkOWFlOGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaWdldC5jCisrKyBiL2ZzL3hmcy94ZnNfaWdldC5jCkBAIC0zMCw2ICszMCw4IEBACiAgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKICNpbmNsdWRlICJ4ZnMuaCIKIAogI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKQEAgLTUwNSwxNyArNTA3LDE1IEBACiAJdm5vZGVfdAkJKnZwID0gTlVMTDsKIAlpbnQJCWVycm9yOwogCi1yZXRyeToKIAlYRlNfU1RBVFNfSU5DKHhzX2lnX2F0dGVtcHRzKTsKIAorcmV0cnk6CiAJaWYgKChpbm9kZSA9IGlnZXRfbG9ja2VkKFhGU19NVE9WRlMobXApLT52ZnNfc3VwZXIsIGlubykpKSB7CiAJCWJodl9kZXNjX3QJKmJkcDsKIAkJeGZzX2lub2RlX3QJKmlwOwotCQlpbnQJCW5ld25vZGU7CiAKIAkJdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKIAkJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKLWlub2RlX2FsbG9jYXRlOgogCQkJdm5faW5pdGlhbGl6ZShpbm9kZSk7CiAJCQllcnJvciA9IHhmc19pZ2V0X2NvcmUodnAsIG1wLCB0cCwgaW5vLCBmbGFncywKIAkJCQkJbG9ja19mbGFncywgaXBwLCBibm8pOwpAQCAtNTI2LDMyICs1MjYsMjUgQEAKIAkJCQlpcHV0KGlub2RlKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCS8qIFRoZXNlIGFyZSB0cnVlIGlmIHRoZSBpbm9kZSBpcyBpbiBpbmFjdGl2ZSBvcgotCQkJICogcmVjbGFpbS4gVGhlIGxpbnV4IGlub2RlIGlzIGFib3V0IHRvIGdvIGF3YXksCi0JCQkgKiB3YWl0IGZvciB0aGF0IHBhdGggdG8gZmluaXNoLCBhbmQgdHJ5IGFnYWluLgorCQkJLyoKKwkJCSAqIElmIHRoZSBpbm9kZSBpcyBub3QgZnVsbHkgY29uc3RydWN0ZWQgZHVlIHRvCisJCQkgKiBmaWxlaGFuZGxlIG1pc3RtYXRjaGVzIHdhaXQgZm9yIHRoZSBpbm9kZSB0byBnbworCQkJICogYXdheSBhbmQgdHJ5IGFnYWluLgorCQkJICoKKwkJCSAqIGlnZXRfbG9ja2VkIHdpbGwgY2FsbCBfX3dhaXRfb25fZnJlZWluZ19pbm9kZQorCQkJICogdG8gd2FpdCBmb3IgdGhlIGlub2RlIHRvIGdvIGF3YXkuCiAJCQkgKi8KLQkJCWlmICh2cC0+dl9mbGFnICYgKFZJTkFDVCB8IFZSRUNMTSkpIHsKLQkJCQl2bl93YWl0KHZwKTsKKwkJCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpIHx8CisJCQkgICAgKChiZHAgPSB2bl9iaHZfbG9va3VwKFZOX0JIVl9IRUFEKHZwKSwKKwkJCQkJCSAgJnhmc192bm9kZW9wcykpID09IE5VTEwpKSB7CiAJCQkJaXB1dChpbm9kZSk7CisJCQkJZGVsYXkoMSk7CiAJCQkJZ290byByZXRyeTsKIAkJCX0KIAotCQkJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKLQkJCQlpcHV0KGlub2RlKTsKLQkJCQlyZXR1cm4gRUlPOwotCQkJfQotCi0JCQliZHAgPSB2bl9iaHZfbG9va3VwKFZOX0JIVl9IRUFEKHZwKSwgJnhmc192bm9kZW9wcyk7Ci0JCQlpZiAoYmRwID09IE5VTEwpIHsKLQkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2R1cCk7Ci0JCQkJZ290byBpbm9kZV9hbGxvY2F0ZTsKLQkJCX0KIAkJCWlwID0gWEZTX0JIVlRPSShiZHApOwogCQkJaWYgKGxvY2tfZmxhZ3MgIT0gMCkKIAkJCQl4ZnNfaWxvY2soaXAsIGxvY2tfZmxhZ3MpOwotCQkJbmV3bm9kZSA9IChpcC0+aV9kLmRpX21vZGUgPT0gMCk7Ci0JCQlpZiAobmV3bm9kZSkKLQkJCQl4ZnNfaW9jb3JlX2lub2RlX3JlaW5pdChpcCk7CiAJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZvdW5kKTsKIAkJCSppcHAgPSBpcDsKIAkJCWVycm9yID0gMDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuYyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwppbmRleCAzNGJkZjU5Li5kYjQzMzA4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZS5jCkBAIC0xMTI4LDcgKzExMjgsNiBAQAogCUFTU0VSVChpcCAhPSBOVUxMKTsKIAogCXZwID0gWEZTX0lUT1YoaXApOwotCXZwLT52X3R5cGUgPSBJRlRPVlQobW9kZSk7CiAJaXAtPmlfZC5kaV9tb2RlID0gKF9fdWludDE2X3QpbW9kZTsKIAlpcC0+aV9kLmRpX29ubGluayA9IDA7CiAJaXAtPmlfZC5kaV9ubGluayA9IG5saW5rOwpAQCAtMTI1MCw3ICsxMjQ5LDcgQEAKIAkgKi8KIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgZmxhZ3MpOwogCi0JLyogbm93IHRoYXQgd2UgaGF2ZSBhIHZfdHlwZSB3ZSBjYW4gc2V0IExpbnV4IGlub2RlIG9wcyAoJiB1bmxvY2spICovCisJLyogbm93IHRoYXQgd2UgaGF2ZSBhbiBpX21vZGUgIHdlIGNhbiBzZXQgTGludXggaW5vZGUgb3BzICgmIHVubG9jaykgKi8KIAlWRlNfSU5JVF9WTk9ERShYRlNfTVRPVkZTKHRwLT50X21vdW50cCksIHZwLCBYRlNfSVRPQkhWKGlwKSwgMSk7CiAKIAkqaXBwID0gaXA7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCmluZGV4IDBlZWQzMGYuLjUwZTJjYWQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCkBAIC0yNDgsNiArMjQ4LDcgQEAKIAogCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmaWlwLT5pbGlfZm9ybWF0OwogCXZlY3AtPmlfbGVuICA9IHNpemVvZih4ZnNfaW5vZGVfbG9nX2Zvcm1hdF90KTsKKwlYTE9HX1ZFQ19TRVRfVFlQRSh2ZWNwLCBYTE9HX1JFR19UWVBFX0lGT1JNQVQpOwogCXZlY3ArKzsKIAludmVjcwkgICAgID0gMTsKIApAQCAtMjkyLDYgKzI5Myw3IEBACiAKIAl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJmlwLT5pX2Q7CiAJdmVjcC0+aV9sZW4gID0gc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90KTsKKwlYTE9HX1ZFQ19TRVRfVFlQRSh2ZWNwLCBYTE9HX1JFR19UWVBFX0lDT1JFKTsKIAl2ZWNwKys7CiAJbnZlY3MrKzsKIAlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyB8PSBYRlNfSUxPR19DT1JFOwpAQCAtMzM5LDcgKzM0MSw3IEBACiAJCQlucmVjcyA9IGlwLT5pX2RmLmlmX2J5dGVzIC8KIAkJCQkodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOwogCQkJQVNTRVJUKG5yZWNzID4gMCk7Ci0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorI2lmZGVmIFhGU19OQVRJVkVfSE9TVAogCQkJaWYgKG5yZWNzID09IGlwLT5pX2QuZGlfbmV4dGVudHMpIHsKIAkJCQkvKgogCQkJCSAqIFRoZXJlIGFyZSBubyBkZWxheWVkIGFsbG9jYXRpb24KQEAgLTM0OSw2ICszNTEsNyBAQAogCQkJCXZlY3AtPmlfYWRkciA9CiAJCQkJCShjaGFyICopKGlwLT5pX2RmLmlmX3UxLmlmX2V4dGVudHMpOwogCQkJCXZlY3AtPmlfbGVuID0gaXAtPmlfZGYuaWZfYnl0ZXM7CisJCQkJWExPR19WRUNfU0VUX1RZUEUodmVjcCwgWExPR19SRUdfVFlQRV9JRVhUKTsKIAkJCX0gZWxzZQogI2VuZGlmCiAJCQl7CkBAIC0zNjcsNiArMzcwLDcgQEAKIAkJCQl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpZXh0X2J1ZmZlcjsKIAkJCQl2ZWNwLT5pX2xlbiA9IHhmc19pZXh0ZW50c19jb3B5KGlwLCBleHRfYnVmZmVyLAogCQkJCQkJWEZTX0RBVEFfRk9SSyk7CisJCQkJWExPR19WRUNfU0VUX1RZUEUodmVjcCwgWExPR19SRUdfVFlQRV9JRVhUKTsKIAkJCX0KIAkJCUFTU0VSVCh2ZWNwLT5pX2xlbiA8PSBpcC0+aV9kZi5pZl9ieXRlcyk7CiAJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2RzaXplID0gdmVjcC0+aV9sZW47CkBAIC0zODQsNiArMzg4LDcgQEAKIAkJCUFTU0VSVChpcC0+aV9kZi5pZl9icm9vdCAhPSBOVUxMKTsKIAkJCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdClpcC0+aV9kZi5pZl9icm9vdDsKIAkJCXZlY3AtPmlfbGVuID0gaXAtPmlfZGYuaWZfYnJvb3RfYnl0ZXM7CisJCQlYTE9HX1ZFQ19TRVRfVFlQRSh2ZWNwLCBYTE9HX1JFR19UWVBFX0lCUk9PVCk7CiAJCQl2ZWNwKys7CiAJCQludmVjcysrOwogCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9kc2l6ZSA9IGlwLT5pX2RmLmlmX2Jyb290X2J5dGVzOwpAQCAtNDA5LDYgKzQxNCw3IEBACiAJCQlBU1NFUlQoKGlwLT5pX2RmLmlmX3JlYWxfYnl0ZXMgPT0gMCkgfHwKIAkJCSAgICAgICAoaXAtPmlfZGYuaWZfcmVhbF9ieXRlcyA9PSBkYXRhX2J5dGVzKSk7CiAJCQl2ZWNwLT5pX2xlbiA9IChpbnQpZGF0YV9ieXRlczsKKwkJCVhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIFhMT0dfUkVHX1RZUEVfSUxPQ0FMKTsKIAkJCXZlY3ArKzsKIAkJCW52ZWNzKys7CiAJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2RzaXplID0gKHVuc2lnbmVkKWRhdGFfYnl0ZXM7CkBAIC00NjcsNyArNDczLDcgQEAKICNlbmRpZgogCQkJQVNTRVJUKG5yZWNzID4gMCk7CiAJCQlBU1NFUlQobnJlY3MgPT0gaXAtPmlfZC5kaV9hbmV4dGVudHMpOwotI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNpZmRlZiBYRlNfTkFUSVZFX0hPU1QKIAkJCS8qCiAJCQkgKiBUaGVyZSBhcmUgbm90IGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnRzCiAJCQkgKiBmb3IgYXR0cmlidXRlcywgc28ganVzdCBwb2ludCBhdCB0aGUgYXJyYXkuCkBAIC00ODYsNiArNDkyLDcgQEAKIAkJCXZlY3AtPmlfbGVuID0geGZzX2lleHRlbnRzX2NvcHkoaXAsIGV4dF9idWZmZXIsCiAJCQkJCVhGU19BVFRSX0ZPUkspOwogI2VuZGlmCisJCQlYTE9HX1ZFQ19TRVRfVFlQRSh2ZWNwLCBYTE9HX1JFR19UWVBFX0lBVFRSX0VYVCk7CiAJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2FzaXplID0gdmVjcC0+aV9sZW47CiAJCQl2ZWNwKys7CiAJCQludmVjcysrOwpAQCAtNTAwLDYgKzUwNyw3IEBACiAJCQlBU1NFUlQoaXAtPmlfYWZwLT5pZl9icm9vdCAhPSBOVUxMKTsKIAkJCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdClpcC0+aV9hZnAtPmlmX2Jyb290OwogCQkJdmVjcC0+aV9sZW4gPSBpcC0+aV9hZnAtPmlmX2Jyb290X2J5dGVzOworCQkJWExPR19WRUNfU0VUX1RZUEUodmVjcCwgWExPR19SRUdfVFlQRV9JQVRUUl9CUk9PVCk7CiAJCQl2ZWNwKys7CiAJCQludmVjcysrOwogCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9hc2l6ZSA9IGlwLT5pX2FmcC0+aWZfYnJvb3RfYnl0ZXM7CkBAIC01MjMsNiArNTMxLDcgQEAKIAkJCUFTU0VSVCgoaXAtPmlfYWZwLT5pZl9yZWFsX2J5dGVzID09IDApIHx8CiAJCQkgICAgICAgKGlwLT5pX2FmcC0+aWZfcmVhbF9ieXRlcyA9PSBkYXRhX2J5dGVzKSk7CiAJCQl2ZWNwLT5pX2xlbiA9IChpbnQpZGF0YV9ieXRlczsKKwkJCVhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIFhMT0dfUkVHX1RZUEVfSUFUVFJfTE9DQUwpOwogCQkJdmVjcCsrOwogCQkJbnZlY3MrKzsKIAkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfYXNpemUgPSAodW5zaWduZWQpZGF0YV9ieXRlczsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW9tYXAuYyBiL2ZzL3hmcy94ZnNfaW9tYXAuYwppbmRleCAyZWRkNjc2Li5kMGY1YmU2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lvbWFwLmMKKysrIGIvZnMveGZzL3hmc19pb21hcC5jCkBAIC0yMjYsMTMgKzIyNiwxMiBAQAogCQl4ZnNfaW9tYXBfZW50ZXJfdHJhY2UoWEZTX0lPTUFQX1JFQURfRU5URVIsIGlvLCBvZmZzZXQsIGNvdW50KTsKIAkJbG9ja21vZGUgPSBYRlNfTENLX01BUF9TSEFSRUQobXAsIGlvKTsKIAkJYm1hcGlfZmxhZ3MgPSBYRlNfQk1BUElfRU5USVJFOwotCQlpZiAoZmxhZ3MgJiBCTUFQSV9JR05TVEFURSkKLQkJCWJtYXBpX2ZsYWdzIHw9IFhGU19CTUFQSV9JR1NUQVRFOwogCQlicmVhazsKIAljYXNlIEJNQVBJX1dSSVRFOgogCQl4ZnNfaW9tYXBfZW50ZXJfdHJhY2UoWEZTX0lPTUFQX1dSSVRFX0VOVEVSLCBpbywgb2Zmc2V0LCBjb3VudCk7CiAJCWxvY2ttb2RlID0gWEZTX0lMT0NLX0VYQ0x8WEZTX0VYVFNJWkVfV1I7Ci0JCWJtYXBpX2ZsYWdzID0gMDsKKwkJaWYgKGZsYWdzICYgQk1BUElfSUdOU1RBVEUpCisJCQlibWFwaV9mbGFncyB8PSBYRlNfQk1BUElfSUdTVEFURXxYRlNfQk1BUElfRU5USVJFOwogCQlYRlNfSUxPQ0sobXAsIGlvLCBsb2NrbW9kZSk7CiAJCWJyZWFrOwogCWNhc2UgQk1BUElfQUxMT0NBVEU6CkBAIC0zOTEsOSArMzkwLDkgQEAKIAl4ZnNfYm1idF9pcmVjX3QgaW1hcFtYRlNfV1JJVEVfSU1BUFNdLCAqaW1hcHA7CiAJeGZzX2JtYXBfZnJlZV90IGZyZWVfbGlzdDsKIAlpbnQJCWFlb2Y7Ci0JeGZzX2ZpbGJsa3NfdAlkYXRhYmxvY2tzLCBxYmxvY2tzLCByZXNibGtzOworCXhmc19maWxibGtzX3QJcWJsb2NrcywgcmVzYmxrczsKIAlpbnQJCWNvbW1pdHRlZDsKLQlpbnQJCW51bXJ0ZXh0ZW50czsKKwlpbnQJCXJlc3J0ZXh0ZW50czsKIAogCS8qCiAJICogTWFrZSBzdXJlIHRoYXQgdGhlIGRxdW90cyBhcmUgdGhlcmUuIFRoaXMgZG9lc24ndCBob2xkCkBAIC00MzQsMTQgKzQzMywxNCBAQAogCiAJCWlmICghKGV4dHN6ID0gaXAtPmlfZC5kaV9leHRzaXplKSkKIAkJCWV4dHN6ID0gbXAtPm1fc2Iuc2JfcmV4dHNpemU7Ci0JCW51bXJ0ZXh0ZW50cyA9IHFibG9ja3MgPSAoY291bnRfZnNiICsgZXh0c3ogLSAxKTsKLQkJZG9fZGl2KG51bXJ0ZXh0ZW50cywgbXAtPm1fc2Iuc2JfcmV4dHNpemUpOworCQlyZXNydGV4dGVudHMgPSBxYmxvY2tzID0gKGNvdW50X2ZzYiArIGV4dHN6IC0gMSk7CisJCWRvX2RpdihyZXNydGV4dGVudHMsIG1wLT5tX3NiLnNiX3JleHRzaXplKTsKKwkJcmVzYmxrcyA9IFhGU19ESU9TVFJBVF9TUEFDRV9SRVMobXAsIDApOwogCQlxdW90YV9mbGFnID0gWEZTX1FNT1BUX1JFU19SVEJMS1M7Ci0JCWRhdGFibG9ja3MgPSAwOwogCX0gZWxzZSB7Ci0JCWRhdGFibG9ja3MgPSBxYmxvY2tzID0gY291bnRfZnNiOworCQlyZXNydGV4dGVudHMgPSAwOworCQlyZXNibGtzID0gcWJsb2NrcyA9IFhGU19ESU9TVFJBVF9TUEFDRV9SRVMobXAsIGNvdW50X2ZzYik7CiAJCXF1b3RhX2ZsYWcgPSBYRlNfUU1PUFRfUkVTX1JFR0JMS1M7Ci0JCW51bXJ0ZXh0ZW50cyA9IDA7CiAJfQogCiAJLyoKQEAgLTQ0OSw5ICs0NDgsOCBAQAogCSAqLwogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19ESU9TVFJBVCk7Ci0JcmVzYmxrcyA9IFhGU19ESU9TVFJBVF9TUEFDRV9SRVMobXAsIGRhdGFibG9ja3MpOwogCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIHJlc2Jsa3MsCi0JCQlYRlNfV1JJVEVfTE9HX1JFUyhtcCksIG51bXJ0ZXh0ZW50cywKKwkJCVhGU19XUklURV9MT0dfUkVTKG1wKSwgcmVzcnRleHRlbnRzLAogCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKIAkJCVhGU19XUklURV9MT0dfQ09VTlQpOwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5jIGIvZnMveGZzL3hmc19sb2cuYwppbmRleCAxY2QyYWMxLi41NGE2ZjExIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmMKQEAgLTE1OSwxMSArMTU5LDE1IEBACiB2b2lkCiB4bG9nX3RyYWNlX2xvZ2dyYW50KHhsb2dfdCAqbG9nLCB4bG9nX3RpY2tldF90ICp0aWMsIHhmc19jYWRkcl90IHN0cmluZykKIHsKLQlpZiAoISBsb2ctPmxfZ3JhbnRfdHJhY2UpIHsKLQkJbG9nLT5sX2dyYW50X3RyYWNlID0ga3RyYWNlX2FsbG9jKDEwMjQsIEtNX05PU0xFRVApOwotCQlpZiAoISBsb2ctPmxfZ3JhbnRfdHJhY2UpCisJdW5zaWduZWQgbG9uZyBjbnRzOworCisJaWYgKCFsb2ctPmxfZ3JhbnRfdHJhY2UpIHsKKwkJbG9nLT5sX2dyYW50X3RyYWNlID0ga3RyYWNlX2FsbG9jKDIwNDgsIEtNX05PU0xFRVApOworCQlpZiAoIWxvZy0+bF9ncmFudF90cmFjZSkKIAkJCXJldHVybjsKIAl9CisJLyogdGlja2V0IGNvdW50cyBhcmUgMSBieXRlIGVhY2ggKi8KKwljbnRzID0gKCh1bnNpZ25lZCBsb25nKXRpYy0+dF9vY250KSB8ICgodW5zaWduZWQgbG9uZyl0aWMtPnRfY250KSA8PCA4OwogCiAJa3RyYWNlX2VudGVyKGxvZy0+bF9ncmFudF90cmFjZSwKIAkJICAgICAodm9pZCAqKXRpYywKQEAgLTE3OCwxMCArMTgyLDEwIEBACiAJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpQ1lDTEVfTFNOKGxvZy0+bF90YWlsX2xzbikpLAogCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKUJMT0NLX0xTTihsb2ctPmxfdGFpbF9sc24pKSwKIAkJICAgICAodm9pZCAqKXN0cmluZywKLQkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykxMyksCi0JCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpMTQpLAotCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKTE1KSwKLQkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykxNikpOworCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXRpYy0+dF90cmFuc190eXBlKSwKKwkJICAgICAodm9pZCAqKWNudHMsCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdGljLT50X2N1cnJfcmVzKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZyl0aWMtPnRfdW5pdF9yZXMpKTsKIH0KIAogdm9pZApAQCAtMjc0LDkgKzI3OCwxMSBAQAogCQkgKiBSZWxlYXNlIHRpY2tldCBpZiBub3QgcGVybWFuZW50IHJlc2VydmF0aW9uIG9yIGEgc3BlY2lmYwogCQkgKiByZXF1ZXN0IGhhcyBiZWVuIG1hZGUgdG8gcmVsZWFzZSBhIHBlcm1hbmVudCByZXNlcnZhdGlvbi4KIAkJICovCisJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsICJ4ZnNfbG9nX2RvbmU6IChub24tcGVybWFuZW50KSIpOwogCQl4bG9nX3VuZ3JhbnRfbG9nX3NwYWNlKGxvZywgdGlja2V0KTsKIAkJeGxvZ19zdGF0ZV9wdXRfdGlja2V0KGxvZywgdGlja2V0KTsKIAl9IGVsc2UgeworCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGlja2V0LCAieGZzX2xvZ19kb25lOiAocGVybWFuZW50KSIpOwogCQl4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2UobG9nLCB0aWNrZXQpOwogCX0KIApAQCAtMzk5LDcgKzQwNSw4IEBACiAJCWludAkJIGNudCwKIAkJeGZzX2xvZ190aWNrZXRfdCAqdGlja2V0LAogCQlfX3VpbnQ4X3QJIGNsaWVudCwKLQkJdWludAkJIGZsYWdzKQorCQl1aW50CQkgZmxhZ3MsCisJCXVpbnQJCSB0X3R5cGUpCiB7CiAJeGxvZ190CQkqbG9nID0gbXAtPm1fbG9nOwogCXhsb2dfdGlja2V0X3QJKmludGVybmFsX3RpY2tldDsKQEAgLTQyMSwxMyArNDI4LDE5IEBACiAJaWYgKCp0aWNrZXQgIT0gTlVMTCkgewogCQlBU1NFUlQoZmxhZ3MgJiBYRlNfTE9HX1BFUk1fUkVTRVJWKTsKIAkJaW50ZXJuYWxfdGlja2V0ID0gKHhsb2dfdGlja2V0X3QgKikqdGlja2V0OworCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgaW50ZXJuYWxfdGlja2V0LCAieGZzX2xvZ19yZXNlcnZlOiBleGlzdGluZyB0aWNrZXQgKHBlcm1hbmVudCB0cmFucykiKTsKIAkJeGxvZ19ncmFudF9wdXNoX2FpbChtcCwgaW50ZXJuYWxfdGlja2V0LT50X3VuaXRfcmVzKTsKIAkJcmV0dmFsID0geGxvZ19yZWdyYW50X3dyaXRlX2xvZ19zcGFjZShsb2csIGludGVybmFsX3RpY2tldCk7CiAJfSBlbHNlIHsKIAkJLyogbWF5IHNsZWVwIGlmIG5lZWQgdG8gYWxsb2NhdGUgbW9yZSB0aWNrZXRzICovCiAJCWludGVybmFsX3RpY2tldCA9IHhsb2dfdGlja2V0X2dldChsb2csIHVuaXRfYnl0ZXMsIGNudCwKIAkJCQkJCSAgY2xpZW50LCBmbGFncyk7CisJCWludGVybmFsX3RpY2tldC0+dF90cmFuc190eXBlID0gdF90eXBlOwogCQkqdGlja2V0ID0gaW50ZXJuYWxfdGlja2V0OworCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgaW50ZXJuYWxfdGlja2V0LCAKKwkJCShpbnRlcm5hbF90aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19QRVJNX1JFU0VSVikgPworCQkJInhmc19sb2dfcmVzZXJ2ZTogY3JlYXRlIG5ldyB0aWNrZXQgKHBlcm1hbmVudCB0cmFucykiIDoKKwkJCSJ4ZnNfbG9nX3Jlc2VydmU6IGNyZWF0ZSBuZXcgdGlja2V0Iik7CiAJCXhsb2dfZ3JhbnRfcHVzaF9haWwobXAsCiAJCQkJICAgIChpbnRlcm5hbF90aWNrZXQtPnRfdW5pdF9yZXMgKgogCQkJCSAgICAgaW50ZXJuYWxfdGlja2V0LT50X2NudCkpOwpAQCAtNjAxLDggKzYxNCw5IEBACiAJaWYgKCEgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpKSB7CiAJCXJlZ1swXS5pX2FkZHIgPSAodm9pZCopJm1hZ2ljOwogCQlyZWdbMF0uaV9sZW4gID0gc2l6ZW9mKG1hZ2ljKTsKKwkJWExPR19WRUNfU0VUX1RZUEUoJnJlZ1swXSwgWExPR19SRUdfVFlQRV9VTk1PVU5UKTsKIAotCQllcnJvciA9IHhmc19sb2dfcmVzZXJ2ZShtcCwgNjAwLCAxLCAmdGljLCBYRlNfTE9HLCAwKTsKKwkJZXJyb3IgPSB4ZnNfbG9nX3Jlc2VydmUobXAsIDYwMCwgMSwgJnRpYywgWEZTX0xPRywgMCwgMCk7CiAJCWlmICghZXJyb3IpIHsKIAkJCS8qIHJlbW92ZSBpbml0ZWQgZmxhZyAqLwogCQkJKCh4bG9nX3RpY2tldF90ICopdGljKS0+dF9mbGFncyA9IDA7CkBAIC0xMjcyLDYgKzEyODYsNyBAQAogCiAJcmVnWzBdLmlfYWRkciA9IE5VTEw7CiAJcmVnWzBdLmlfbGVuID0gMDsKKwlYTE9HX1ZFQ19TRVRfVFlQRSgmcmVnWzBdLCBYTE9HX1JFR19UWVBFX0NPTU1JVCk7CiAKIAlBU1NFUlRfQUxXQVlTKGljbG9nKTsKIAlpZiAoKGVycm9yID0geGxvZ193cml0ZShtcCwgcmVnLCAxLCB0aWNrZXQsIGNvbW1pdGxzbnAsCkBAIC0xNjA1LDYgKzE2MjAsMTE3IEBACiAKIAogLyoKKyAqIHByaW50IG91dCBpbmZvIHJlbGF0aW5nIHRvIHJlZ2lvbnMgd3JpdHRlbiB3aGljaCBjb25zdW1lCisgKiB0aGUgcmVzZXJ2YXRpb24KKyAqLworI2lmIGRlZmluZWQoWEZTX0xPR19SRVNfREVCVUcpCitTVEFUSUMgdm9pZAoreGxvZ19wcmludF90aWNfcmVzKHhmc19tb3VudF90ICptcCwgeGxvZ190aWNrZXRfdCAqdGlja2V0KQoreworCXVpbnQgaTsKKwl1aW50IG9waGRyX3NwYyA9IHRpY2tldC0+dF9yZXNfbnVtX29waGRycyAqICh1aW50KXNpemVvZih4bG9nX29wX2hlYWRlcl90KTsKKworCS8qIG1hdGNoIHdpdGggWExPR19SRUdfVFlQRV8qIGluIHhmc19sb2cuaCAqLworCXN0YXRpYyBjaGFyICpyZXNfdHlwZV9zdHJbWExPR19SRUdfVFlQRV9NQVhdID0geworCSAgICAiYmZvcm1hdCIsCisJICAgICJiY2h1bmsiLAorCSAgICAiZWZpX2Zvcm1hdCIsCisJICAgICJlZmRfZm9ybWF0IiwKKwkgICAgImlmb3JtYXQiLAorCSAgICAiaWNvcmUiLAorCSAgICAiaWV4dCIsCisJICAgICJpYnJvb3QiLAorCSAgICAiaWxvY2FsIiwKKwkgICAgImlhdHRyX2V4dCIsCisJICAgICJpYXR0cl9icm9vdCIsCisJICAgICJpYXR0cl9sb2NhbCIsCisJICAgICJxZm9ybWF0IiwKKwkgICAgImRxdW90IiwKKwkgICAgInF1b3Rhb2ZmIiwKKwkgICAgIkxSIGhlYWRlciIsCisJICAgICJ1bm1vdW50IiwKKwkgICAgImNvbW1pdCIsCisJICAgICJ0cmFucyBoZWFkZXIiCisJfTsKKwlzdGF0aWMgY2hhciAqdHJhbnNfdHlwZV9zdHJbWEZTX1RSQU5TX1RZUEVfTUFYXSA9IHsKKwkgICAgIlNFVEFUVFJfTk9UX1NJWkUiLAorCSAgICAiU0VUQVRUUl9TSVpFIiwKKwkgICAgIklOQUNUSVZFIiwKKwkgICAgIkNSRUFURSIsCisJICAgICJDUkVBVEVfVFJVTkMiLAorCSAgICAiVFJVTkNBVEVfRklMRSIsCisJICAgICJSRU1PVkUiLAorCSAgICAiTElOSyIsCisJICAgICJSRU5BTUUiLAorCSAgICAiTUtESVIiLAorCSAgICAiUk1ESVIiLAorCSAgICAiU1lNTElOSyIsCisJICAgICJTRVRfRE1BVFRSUyIsCisJICAgICJHUk9XRlMiLAorCSAgICAiU1RSQVRfV1JJVEUiLAorCSAgICAiRElPU1RSQVQiLAorCSAgICAiV1JJVEVfU1lOQyIsCisJICAgICJXUklURUlEIiwKKwkgICAgIkFEREFGT1JLIiwKKwkgICAgIkFUVFJJTlZBTCIsCisJICAgICJBVFJVTkNBVEUiLAorCSAgICAiQVRUUl9TRVQiLAorCSAgICAiQVRUUl9STSIsCisJICAgICJBVFRSX0ZMQUciLAorCSAgICAiQ0xFQVJfQUdJX0JVQ0tFVCIsCisJICAgICJRTV9TQkNIQU5HRSIsCisJICAgICJEVU1NWTEiLAorCSAgICAiRFVNTVkyIiwKKwkgICAgIlFNX1FVT1RBT0ZGIiwKKwkgICAgIlFNX0RRQUxMT0MiLAorCSAgICAiUU1fU0VUUUxJTSIsCisJICAgICJRTV9EUUNMVVNURVIiLAorCSAgICAiUU1fUUlOT0NSRUFURSIsCisJICAgICJRTV9RVU9UQU9GRl9FTkQiLAorCSAgICAiU0JfVU5JVCIsCisJICAgICJGU1lOQ19UUyIsCisJICAgICJHUk9XRlNSVF9BTExPQyIsCisJICAgICJHUk9XRlNSVF9aRVJPIiwKKwkgICAgIkdST1dGU1JUX0ZSRUUiLAorCSAgICAiU1dBUEVYVCIKKwl9OworCisJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsCisJCQkieGZzX2xvZ193cml0ZTogcmVzZXJ2YXRpb24gc3VtbWFyeTpcbiIKKwkJCSIgIHRyYW5zIHR5cGUgID0gJXMgKCV1KVxuIgorCQkJIiAgdW5pdCByZXMgICAgPSAlZCBieXRlc1xuIgorCQkJIiAgY3VycmVudCByZXMgPSAlZCBieXRlc1xuIgorCQkJIiAgdG90YWwgcmVnICAgPSAldSBieXRlcyAoby9mbG93ID0gJXUgYnl0ZXMpXG4iCisJCQkiICBvcGhkcnMgICAgICA9ICV1IChvcGhkciBzcGFjZSA9ICV1IGJ5dGVzKVxuIgorCQkJIiAgb3BoZHIgKyByZWcgPSAldSBieXRlc1xuIgorCQkJIiAgbnVtIHJlZ2lvbnMgPSAldVxuIiwKKwkJCSgodGlja2V0LT50X3RyYW5zX3R5cGUgPD0gMCB8fAorCQkJICB0aWNrZXQtPnRfdHJhbnNfdHlwZSA+IFhGU19UUkFOU19UWVBFX01BWCkgPworCQkJICAiYmFkLXRyYW5zLXR5cGUiIDogdHJhbnNfdHlwZV9zdHJbdGlja2V0LT50X3RyYW5zX3R5cGUtMV0pLAorCQkJdGlja2V0LT50X3RyYW5zX3R5cGUsCisJCQl0aWNrZXQtPnRfdW5pdF9yZXMsCisJCQl0aWNrZXQtPnRfY3Vycl9yZXMsCisJCQl0aWNrZXQtPnRfcmVzX2Fycl9zdW0sIHRpY2tldC0+dF9yZXNfb19mbG93LAorCQkJdGlja2V0LT50X3Jlc19udW1fb3BoZHJzLCBvcGhkcl9zcGMsCisJCQl0aWNrZXQtPnRfcmVzX2Fycl9zdW0gKyAKKwkJCSAgdGlja2V0LT50X3Jlc19vX2Zsb3cgKyBvcGhkcl9zcGMsCisJCQl0aWNrZXQtPnRfcmVzX251bSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGlja2V0LT50X3Jlc19udW07IGkrKykgeworCSAgIAl1aW50IHJfdHlwZSA9IHRpY2tldC0+dF9yZXNfYXJyW2ldLnJfdHlwZTsgCisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSAgICAicmVnaW9uWyV1XTogJXMgLSAldSBieXRlc1xuIiwKKwkJCSAgICBpLCAKKwkJCSAgICAoKHJfdHlwZSA8PSAwIHx8IHJfdHlwZSA+IFhMT0dfUkVHX1RZUEVfTUFYKSA/CisJCQkgICAgImJhZC1ydHlwZSIgOiByZXNfdHlwZV9zdHJbcl90eXBlLTFdKSwKKwkJCSAgICB0aWNrZXQtPnRfcmVzX2FycltpXS5yX2xlbik7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgeGxvZ19wcmludF90aWNfcmVzKG1wLCB0aWNrZXQpCisjZW5kaWYKKworLyoKICAqIFdyaXRlIHNvbWUgcmVnaW9uIG91dCB0byBpbi1jb3JlIGxvZwogICoKICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbiB3cml0aW5nIGV4dGVybmFsbHkgcHJvdmlkZWQgcmVnaW9ucyBvciB3aGVuCkBAIC0xNjc3LDE2ICsxODAzLDIxIEBACiAgICAgICogeGxvZ19vcF9oZWFkZXJfdCBhbmQgbWF5IG5lZWQgdG8gYmUgZG91YmxlIHdvcmQgYWxpZ25lZC4KICAgICAgKi8KICAgICBsZW4gPSAwOwotICAgIGlmICh0aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTklURUQpICAgICAvKiBhY2N0IGZvciBzdGFydCByZWMgb2YgeGFjdCAqLworICAgIGlmICh0aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTklURUQpIHsgICAgLyogYWNjdCBmb3Igc3RhcnQgcmVjIG9mIHhhY3QgKi8KIAlsZW4gKz0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpOworCVhMT0dfVElDX0FERF9PUEhEUih0aWNrZXQpOworICAgIH0KIAogICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5lbnRyaWVzOyBpbmRleCsrKSB7CiAJbGVuICs9IHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsJICAgIC8qIGVhY2ggcmVnaW9uIGdldHMgPj0gMSAqLworCVhMT0dfVElDX0FERF9PUEhEUih0aWNrZXQpOwogCWxlbiArPSByZWdbaW5kZXhdLmlfbGVuOworCVhMT0dfVElDX0FERF9SRUdJT04odGlja2V0LCByZWdbaW5kZXhdLmlfbGVuLCByZWdbaW5kZXhdLmlfdHlwZSk7CiAgICAgfQogICAgIGNvbnR3ciA9ICpzdGFydF9sc24gPSAwOwogCiAgICAgaWYgKHRpY2tldC0+dF9jdXJyX3JlcyA8IGxlbikgeworCXhsb2dfcHJpbnRfdGljX3JlcyhtcCwgdGlja2V0KTsKICNpZmRlZiBERUJVRwogCXhsb2dfcGFuaWMoCiAJCSJ4ZnNfbG9nX3dyaXRlOiByZXNlcnZhdGlvbiByYW4gb3V0LiBOZWVkIHRvIHVwIHJlc2VydmF0aW9uIik7CkBAIC0xNzkwLDYgKzE5MjEsNyBAQAogCQlsZW4gKz0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpOyAvKiBmcm9tIHNwbGl0dGluZyBvZiByZWdpb24gKi8KIAkJLyogYWNjb3VudCBmb3IgbmV3IGxvZyBvcCBoZWFkZXIgKi8KIAkJdGlja2V0LT50X2N1cnJfcmVzIC09IHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsKKwkJWExPR19USUNfQUREX09QSERSKHRpY2tldCk7CiAJICAgIH0KIAkgICAgeGxvZ192ZXJpZnlfZGVzdF9wdHIobG9nLCBwdHIpOwogCkBAIC0yMjgyLDYgKzI0MTQsOSBAQAogCSAqLwogCWlmIChsb2dfb2Zmc2V0ID09IDApIHsKIAkJdGlja2V0LT50X2N1cnJfcmVzIC09IGxvZy0+bF9pY2xvZ19oc2l6ZTsKKwkJWExPR19USUNfQUREX1JFR0lPTih0aWNrZXQsCisJCQkJICAgIGxvZy0+bF9pY2xvZ19oc2l6ZSwKKwkJCQkgICAgWExPR19SRUdfVFlQRV9MUkhFQURFUik7CiAJCUlOVF9TRVQoaGVhZC0+aF9jeWNsZSwgQVJDSF9DT05WRVJULCBsb2ctPmxfY3Vycl9jeWNsZSk7CiAJCUFTU0lHTl9MU04oaGVhZC0+aF9sc24sIGxvZyk7CiAJCUFTU0VSVChsb2ctPmxfY3Vycl9ibG9jayA+PSAwKTsKQEAgLTI0NjgsNiArMjYwMyw3IEBACiAjZW5kaWYKIAogCXRpYy0+dF9jdXJyX3JlcyA9IHRpYy0+dF91bml0X3JlczsKKwlYTE9HX1RJQ19SRVNFVF9SRVModGljKTsKIAogCWlmICh0aWMtPnRfY250ID4gMCkKIAkJcmV0dXJuICgwKTsKQEAgLTI2MDgsNiArMjc0NCw3IEBACiAJWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLCB0aWNrZXQtPnRfY3Vycl9yZXMsICd3Jyk7CiAJWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLCB0aWNrZXQtPnRfY3Vycl9yZXMsICdyJyk7CiAJdGlja2V0LT50X2N1cnJfcmVzID0gdGlja2V0LT50X3VuaXRfcmVzOworCVhMT0dfVElDX1JFU0VUX1JFUyh0aWNrZXQpOwogCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsCiAJCQkgICAgInhsb2dfcmVncmFudF9yZXNlcnZlX2xvZ19zcGFjZTogc3ViIGN1cnJlbnQgcmVzIik7CiAJeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChsb2csIDEpOwpAQCAtMjYyNCw2ICsyNzYxLDcgQEAKIAl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGxvZywgMCk7CiAJR1JBTlRfVU5MT0NLKGxvZywgcyk7CiAJdGlja2V0LT50X2N1cnJfcmVzID0gdGlja2V0LT50X3VuaXRfcmVzOworCVhMT0dfVElDX1JFU0VUX1JFUyh0aWNrZXQpOwogfQkvKiB4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2UgKi8KIAogCkBAIC0zMTc5LDI5ICszMzE3LDU3IEBACiAJICogYW5kIHRoZWlyIHVuaXQgYW1vdW50IGlzIHRoZSB0b3RhbCBhbW91bnQgb2Ygc3BhY2UgcmVxdWlyZWQuCiAJICoKIAkgKiBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIGNvZGUgYWNjb3VudCBmb3Igbm9uLXRyYW5zYWN0aW9uIGRhdGEKLQkgKiB3aGljaCBvY2N1cHkgc3BhY2UgaW4gdGhlIG9uLWRpc2sgbG9nLiAKKwkgKiB3aGljaCBvY2N1cHkgc3BhY2UgaW4gdGhlIG9uLWRpc2sgbG9nLgorCSAqCisJICogTm9ybWFsIGZvcm0gb2YgYSB0cmFuc2FjdGlvbiBpczoKKwkgKiA8b3BoPjx0cmFucy1oZHI+PHN0YXJ0LW9waD48cmVnMS1vcGg+PHJlZzE+PHJlZzItb3BoPi4uLjxjb21taXQtb3BoPgorCSAqIGFuZCB0aGVuIHRoZXJlIGFyZSBMUiBoZHJzLCBzcGxpdC1yZWNzIGFuZCByb3VuZG9mZiBhdCBlbmQgb2Ygc3luY3MuCisJICoKKwkgKiBXZSBuZWVkIHRvIGFjY291bnQgZm9yIGFsbCB0aGUgbGVhZHVwIGRhdGEgYW5kIHRyYWlsZXIgZGF0YQorCSAqIGFyb3VuZCB0aGUgdHJhbnNhY3Rpb24gZGF0YS4KKwkgKiBBbmQgdGhlbiB3ZSBuZWVkIHRvIGFjY291bnQgZm9yIHRoZSB3b3JzdCBjYXNlIGluIHRlcm1zIG9mIHVzaW5nCisJICogbW9yZSBzcGFjZS4KKwkgKiBUaGUgd29yc3QgY2FzZSB3aWxsIGhhcHBlbiBpZjoKKwkgKiAtIHRoZSBwbGFjZW1lbnQgb2YgdGhlIHRyYW5zYWN0aW9uIGhhcHBlbnMgdG8gYmUgc3VjaCB0aGF0IHRoZQorCSAqICAgcm91bmRvZmYgaXMgYXQgaXRzIG1heGltdW0KKwkgKiAtIHRoZSB0cmFuc2FjdGlvbiBkYXRhIGlzIHN5bmNlZCBiZWZvcmUgdGhlIGNvbW1pdCByZWNvcmQgaXMgc3luY2VkCisJICogICBpLmUuIDx0cmFuc2FjdGlvbi1kYXRhPjxyb3VuZG9mZj4gfCA8Y29tbWl0LXJlYz48cm91bmRvZmY+CisJICogICBUaGVyZWZvcmUgdGhlIGNvbW1pdCByZWNvcmQgaXMgaW4gaXRzIG93biBMb2cgUmVjb3JkLgorCSAqICAgVGhpcyBjYW4gaGFwcGVuIGFzIHRoZSBjb21taXQgcmVjb3JkIGlzIGNhbGxlZCB3aXRoIGl0cworCSAqICAgb3duIHJlZ2lvbiB0byB4bG9nX3dyaXRlKCkuCisJICogICBUaGlzIHRoZW4gbWVhbnMgdGhhdCBpbiB0aGUgd29yc3QgY2FzZSwgcm91bmRvZmYgY2FuIGhhcHBlbiBmb3IKKwkgKiAgIHRoZSBjb21taXQtcmVjIGFzIHdlbGwuCisJICogICBUaGUgY29tbWl0LXJlYyBpcyBzbWFsbGVyIHRoYW4gcGFkZGluZyBpbiB0aGlzIHNjZW5hcmlvIGFuZCBzbyBpdCBpcworCSAqICAgbm90IGFkZGVkIHNlcGFyYXRlbHkuCiAJICovCiAKLQkvKiBmb3Igc3RhcnQtcmVjICovCi0JdW5pdF9ieXRlcyArPSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCk7IAotCi0JLyogZm9yIHBhZGRpbmcgKi8KLQlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikgJiYKLQkJbG9nLT5sX21wLT5tX3NiLnNiX2xvZ3N1bml0ID4gMSkgewotCQkvKiBsb2cgc3Ugcm91bmRvZmYgKi8KLQkJdW5pdF9ieXRlcyArPSBsb2ctPmxfbXAtPm1fc2Iuc2JfbG9nc3VuaXQ7ICAKLQl9IGVsc2UgewotCQkvKiBCQiByb3VuZG9mZiAqLwotCQl1bml0X2J5dGVzICs9IEJCU0laRTsKLSAgICAgICAgfQotCi0JLyogZm9yIGNvbW1pdC1yZWMgKi8KKwkvKiBmb3IgdHJhbnMgaGVhZGVyICovCiAJdW5pdF9ieXRlcyArPSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCk7Ci0gCisJdW5pdF9ieXRlcyArPSBzaXplb2YoeGZzX3RyYW5zX2hlYWRlcl90KTsKKworCS8qIGZvciBzdGFydC1yZWMgKi8KKwl1bml0X2J5dGVzICs9IHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsKKwogCS8qIGZvciBMUiBoZWFkZXJzICovCiAJbnVtX2hlYWRlcnMgPSAoKHVuaXRfYnl0ZXMgKyBsb2ctPmxfaWNsb2dfc2l6ZS0xKSA+PiBsb2ctPmxfaWNsb2dfc2l6ZV9sb2cpOwogCXVuaXRfYnl0ZXMgKz0gbG9nLT5sX2ljbG9nX2hzaXplICogbnVtX2hlYWRlcnM7CiAKKwkvKiBmb3IgY29tbWl0LXJlYyBMUiBoZWFkZXIgLSBub3RlOiBwYWRkaW5nIHdpbGwgc3Vic3VtZSB0aGUgb3BoZHIgKi8KKwl1bml0X2J5dGVzICs9IGxvZy0+bF9pY2xvZ19oc2l6ZTsKKworCS8qIGZvciBzcGxpdC1yZWNzIC0gb3BoZHJzIGFkZGVkIHdoZW4gZGF0YSBzcGxpdCBvdmVyIExScyAqLworCXVuaXRfYnl0ZXMgKz0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpICogbnVtX2hlYWRlcnM7CisKKwkvKiBmb3Igcm91bmRvZmYgcGFkZGluZyBmb3IgdHJhbnNhY3Rpb24gZGF0YSBhbmQgb25lIGZvciBjb21taXQgcmVjb3JkICovCisJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpICYmCisJICAgIGxvZy0+bF9tcC0+bV9zYi5zYl9sb2dzdW5pdCA+IDEpIHsKKwkJLyogbG9nIHN1IHJvdW5kb2ZmICovCisJCXVuaXRfYnl0ZXMgKz0gMipsb2ctPmxfbXAtPm1fc2Iuc2JfbG9nc3VuaXQ7CisJfSBlbHNlIHsKKwkJLyogQkIgcm91bmRvZmYgKi8KKwkJdW5pdF9ieXRlcyArPSAyKkJCU0laRTsKKyAgICAgICAgfQorCiAJdGljLT50X3VuaXRfcmVzCQk9IHVuaXRfYnl0ZXM7CiAJdGljLT50X2N1cnJfcmVzCQk9IHVuaXRfYnl0ZXM7CiAJdGljLT50X2NudAkJPSBjbnQ7CkBAIC0zMjA5LDEwICszMzc1LDEzIEBACiAJdGljLT50X3RpZAkJPSAoeGxvZ190aWRfdCkoKF9fcHNpbnRfdCl0aWMgJiAweGZmZmZmZmZmKTsKIAl0aWMtPnRfY2xpZW50aWQJCT0gY2xpZW50OwogCXRpYy0+dF9mbGFncwkJPSBYTE9HX1RJQ19JTklURUQ7CisJdGljLT50X3RyYW5zX3R5cGUJPSAwOwogCWlmICh4ZmxhZ3MgJiBYRlNfTE9HX1BFUk1fUkVTRVJWKQogCQl0aWMtPnRfZmxhZ3MgfD0gWExPR19USUNfUEVSTV9SRVNFUlY7CiAJc3ZfaW5pdCgmKHRpYy0+dF9zZW1hKSwgU1ZfREVGQVVMVCwgImxvZ3RpY2siKTsKIAorCVhMT0dfVElDX1JFU0VUX1JFUyh0aWMpOworCiAJcmV0dXJuIHRpYzsKIH0JLyogeGxvZ190aWNrZXRfZ2V0ICovCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nLmggYi9mcy94ZnMveGZzX2xvZy5oCmluZGV4IDBkYjEyMmQuLjE4OTYxMTEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nLmgKKysrIGIvZnMveGZzL3hmc19sb2cuaApAQCAtMTE0LDkgKzExNCw0NCBAQAogI2RlZmluZSBYRlNfVk9MVU1FCQkweDIKICNkZWZpbmUgWEZTX0xPRwkJCTB4YWEKIAorCisvKiBSZWdpb24gdHlwZXMgZm9yIGlvdmVjJ3MgaV90eXBlICovCisjaWYgZGVmaW5lZChYRlNfTE9HX1JFU19ERUJVRykKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9CRk9STUFUCQkxCisjZGVmaW5lIFhMT0dfUkVHX1RZUEVfQkNIVU5LCQkyCisjZGVmaW5lIFhMT0dfUkVHX1RZUEVfRUZJX0ZPUk1BVAkzCisjZGVmaW5lIFhMT0dfUkVHX1RZUEVfRUZEX0ZPUk1BVAk0CisjZGVmaW5lIFhMT0dfUkVHX1RZUEVfSUZPUk1BVAkJNQorI2RlZmluZSBYTE9HX1JFR19UWVBFX0lDT1JFCQk2CisjZGVmaW5lIFhMT0dfUkVHX1RZUEVfSUVYVAkJNworI2RlZmluZSBYTE9HX1JFR19UWVBFX0lCUk9PVAkJOAorI2RlZmluZSBYTE9HX1JFR19UWVBFX0lMT0NBTAkJOQorI2RlZmluZSBYTE9HX1JFR19UWVBFX0lBVFRSX0VYVAkJMTAKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9JQVRUUl9CUk9PVAkxMQorI2RlZmluZSBYTE9HX1JFR19UWVBFX0lBVFRSX0xPQ0FMCTEyCisjZGVmaW5lIFhMT0dfUkVHX1RZUEVfUUZPUk1BVAkJMTMKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9EUVVPVAkJMTQKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9RVU9UQU9GRgkJMTUKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9MUkhFQURFUgkJMTYKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9VTk1PVU5UCQkxNworI2RlZmluZSBYTE9HX1JFR19UWVBFX0NPTU1JVAkJMTgKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9UUkFOU0hEUgkJMTkKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9NQVgJCTE5CisjZW5kaWYKKworI2lmIGRlZmluZWQoWEZTX0xPR19SRVNfREVCVUcpCisjZGVmaW5lIFhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIHQpICgodmVjcCktPmlfdHlwZSA9ICh0KSkKKyNlbHNlCisjZGVmaW5lIFhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIHQpCisjZW5kaWYKKworCiB0eXBlZGVmIHN0cnVjdCB4ZnNfbG9nX2lvdmVjIHsKIAl4ZnNfY2FkZHJfdAkJaV9hZGRyOwkJLyogYmVnaW5uaW5nIGFkZHJlc3Mgb2YgcmVnaW9uICovCiAJaW50CQlpX2xlbjsJCS8qIGxlbmd0aCBpbiBieXRlcyBvZiByZWdpb24gKi8KKyNpZiBkZWZpbmVkKFhGU19MT0dfUkVTX0RFQlVHKQorIAl1aW50CQlpX3R5cGU7CQkvKiB0eXBlIG9mIHJlZ2lvbiAqLworI2VuZGlmCiB9IHhmc19sb2dfaW92ZWNfdDsKIAogdHlwZWRlZiB2b2lkKiB4ZnNfbG9nX3RpY2tldF90OwpAQCAtMTU5LDcgKzE5NCw4IEBACiAJCQkgIGludAkJICAgY291bnQsCiAJCQkgIHhmc19sb2dfdGlja2V0X3QgKnRpY2tldCwKIAkJCSAgX191aW50OF90CSAgIGNsaWVudGlkLAotCQkJICB1aW50CQkgICBmbGFncyk7CisJCQkgIHVpbnQJCSAgIGZsYWdzLAorCQkJICB1aW50CQkgICB0X3R5cGUpOwogaW50CSAgeGZzX2xvZ193cml0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwKIAkJCXhmc19sb2dfaW92ZWNfdCAgcmVnaW9uW10sCiAJCQlpbnQJCSBuZW50cmllcywKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaCBiL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaAppbmRleCAxYTFkNDUyLi5hODg0Y2VhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZ19wcml2LmgKKysrIGIvZnMveGZzL3hmc19sb2dfcHJpdi5oCkBAIC0xMTIsNyArMTEyLDcgQEAKICAqIHRoaXMgaGFzIGVuZGlhbiBpc3N1ZXMsIG9mIGNvdXJzZS4KICAqLwogCi0jaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorI2lmbmRlZiBYRlNfTkFUSVZFX0hPU1QKICNkZWZpbmUgR0VUX0NMSUVOVF9JRChpLGFyY2gpIFwKICAgICAoKGkpICYgMHhmZikKICNlbHNlCkBAIC0zMzUsMTggKzMzNSw2NiBAQAogCiAjZGVmaW5lIFhMT0dfQ09WRVJfT1BTCQk1CiAKKworLyogVGlja2V0IHJlc2VydmF0aW9uIHJlZ2lvbiBhY2NvdW50aW5nICovIAorI2lmIGRlZmluZWQoWEZTX0xPR19SRVNfREVCVUcpCisjZGVmaW5lIFhMT0dfVElDX0xFTl9NQVgJMTUKKyNkZWZpbmUgWExPR19USUNfUkVTRVRfUkVTKHQpICgodCktPnRfcmVzX251bSA9IFwKKwkJCQkodCktPnRfcmVzX2Fycl9zdW0gPSAodCktPnRfcmVzX251bV9vcGhkcnMgPSAwKQorI2RlZmluZSBYTE9HX1RJQ19BRERfT1BIRFIodCkgKCh0KS0+dF9yZXNfbnVtX29waGRycysrKQorI2RlZmluZSBYTE9HX1RJQ19BRERfUkVHSU9OKHQsIGxlbiwgdHlwZSkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKCh0KS0+dF9yZXNfbnVtID09IFhMT0dfVElDX0xFTl9NQVgpIHsgCQlcCisJCQkvKiBhZGQgdG8gb3ZlcmZsb3cgYW5kIHN0YXJ0IGFnYWluICovCQlcCisJCQkodCktPnRfcmVzX29fZmxvdyArPSAodCktPnRfcmVzX2Fycl9zdW07CVwKKwkJCSh0KS0+dF9yZXNfbnVtID0gMDsJCQkJXAorCQkJKHQpLT50X3Jlc19hcnJfc3VtID0gMDsJCQkJXAorCQl9CQkJCQkJCVwKKwkJKHQpLT50X3Jlc19hcnJbKHQpLT50X3Jlc19udW1dLnJfbGVuID0gKGxlbik7CQlcCisJCSh0KS0+dF9yZXNfYXJyWyh0KS0+dF9yZXNfbnVtXS5yX3R5cGUgPSAodHlwZSk7CQlcCisJCSh0KS0+dF9yZXNfYXJyX3N1bSArPSAobGVuKTsJCQkJXAorCQkodCktPnRfcmVzX251bSsrOwkJCQkJXAorCX0gd2hpbGUgKDApCisKKy8qCisgKiBSZXNlcnZhdGlvbiByZWdpb24KKyAqIEFzIHdvdWxkIGJlIHN0b3JlZCBpbiB4ZnNfbG9nX2lvdmVjIGJ1dCB3aXRob3V0IHRoZSBpX2FkZHIgd2hpY2gKKyAqIHdlIGRvbid0IGNhcmUgYWJvdXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhsb2dfcmVzIHsKKwl1aW50CXJfbGVuOworCXVpbnQJcl90eXBlOworfSB4bG9nX3Jlc190OworI2Vsc2UKKyNkZWZpbmUgWExPR19USUNfUkVTRVRfUkVTKHQpCisjZGVmaW5lIFhMT0dfVElDX0FERF9PUEhEUih0KQorI2RlZmluZSBYTE9HX1RJQ19BRERfUkVHSU9OKHQsIGxlbiwgdHlwZSkKKyNlbmRpZgorCisKIHR5cGVkZWYgc3RydWN0IHhsb2dfdGlja2V0IHsKLQlzdl90CQkgICB0X3NlbWE7CSAvKiBzbGVlcCBvbiB0aGlzIHNlbWFwaG9yZQkgOjIwICovCi0Jc3RydWN0IHhsb2dfdGlja2V0ICp0X25leHQ7CSAvKgkJCSAgICAgICAgIDogNCAqLwotCXN0cnVjdCB4bG9nX3RpY2tldCAqdF9wcmV2OwkgLyoJCQkJIDogNCAqLwotCXhsb2dfdGlkX3QJICAgdF90aWQ7CSAvKiB0cmFuc2FjdGlvbiBpZGVudGlmaWVyCSA6IDQgKi8KLQlpbnQJCSAgIHRfY3Vycl9yZXM7CSAvKiBjdXJyZW50IHJlc2VydmF0aW9uIGluIGJ5dGVzIDogNCAqLwotCWludAkJICAgdF91bml0X3JlczsJIC8qIHVuaXQgcmVzZXJ2YXRpb24gaW4gYnl0ZXMgICAgOiA0ICovCi0JX191aW50OF90CSAgIHRfb2NudDsJIC8qIG9yaWdpbmFsIGNvdW50CQkgOiAxICovCi0JX191aW50OF90CSAgIHRfY250OwkgLyogY3VycmVudCBjb3VudAkJIDogMSAqLwotCV9fdWludDhfdAkgICB0X2NsaWVudGlkOwkgLyogd2hvIGRvZXMgdGhpcyBiZWxvbmcgdG87CSA6IDEgKi8KLQlfX3VpbnQ4X3QJICAgdF9mbGFnczsJIC8qIHByb3BlcnRpZXMgb2YgcmVzZXJ2YXRpb24JIDogMSAqLworCXN2X3QJCSAgIHRfc2VtYTsJIC8qIHNsZWVwIG9uIHRoaXMgc2VtYXBob3JlICAgICAgOiAyMCAqLworIAlzdHJ1Y3QgeGxvZ190aWNrZXQgKnRfbmV4dDsJIC8qCQkJICAgICAgICAgOjR8OCAqLworCXN0cnVjdCB4bG9nX3RpY2tldCAqdF9wcmV2OwkgLyoJCQkJIDo0fDggKi8KKwl4bG9nX3RpZF90CSAgIHRfdGlkOwkgLyogdHJhbnNhY3Rpb24gaWRlbnRpZmllcgkgOiA0ICAqLworCWludAkJICAgdF9jdXJyX3JlczsJIC8qIGN1cnJlbnQgcmVzZXJ2YXRpb24gaW4gYnl0ZXMgOiA0ICAqLworCWludAkJICAgdF91bml0X3JlczsJIC8qIHVuaXQgcmVzZXJ2YXRpb24gaW4gYnl0ZXMgICAgOiA0ICAqLworCWNoYXIJCSAgIHRfb2NudDsJIC8qIG9yaWdpbmFsIGNvdW50CQkgOiAxICAqLworCWNoYXIJCSAgIHRfY250OwkgLyogY3VycmVudCBjb3VudAkJIDogMSAgKi8KKwljaGFyCQkgICB0X2NsaWVudGlkOwkgLyogd2hvIGRvZXMgdGhpcyBiZWxvbmcgdG87CSA6IDEgICovCisJY2hhcgkJICAgdF9mbGFnczsJIC8qIHByb3BlcnRpZXMgb2YgcmVzZXJ2YXRpb24JIDogMSAgKi8KKwl1aW50CQkgICB0X3RyYW5zX3R5cGU7IC8qIHRyYW5zYWN0aW9uIHR5cGUgICAgICAgICAgICAgOiA0ICAqLworCisjaWYgZGVmaW5lZCAoWEZTX0xPR19SRVNfREVCVUcpCisgICAgICAgIC8qIHJlc2VydmF0aW9uIGFycmF5IGZpZWxkcyAqLworCXVpbnQJCSAgIHRfcmVzX251bTsgICAgICAgICAgICAgICAgICAgIC8qIG51bSBpbiBhcnJheSA6IDQgKi8KKwl4bG9nX3Jlc190CSAgIHRfcmVzX2FycltYTE9HX1RJQ19MRU5fTUFYXTsgIC8qIGFycmF5IG9mIHJlcyA6IFggKi8gCisJdWludAkJICAgdF9yZXNfbnVtX29waGRyczsJCSAvKiBudW0gb3AgaGRycyAgOiA0ICovCisJdWludAkJICAgdF9yZXNfYXJyX3N1bTsJCSAvKiBhcnJheSBzdW0gICAgOiA0ICovCisJdWludAkJICAgdF9yZXNfb19mbG93OwkJIC8qIHN1bSBvdmVyZmxvdyA6IDQgKi8KKyNlbmRpZgogfSB4bG9nX3RpY2tldF90OworCiAjZW5kaWYKIAogCkBAIC0zNjYsMTQgKzQxNCwxMCBAQAogI2RlZmluZSBYTE9HX0ZNVF9JUklYX0JFICAzCiAKIC8qIG91ciBmbXQgKi8KLSNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCi0jZGVmaW5lIFhMT0dfRk1UIFhMT0dfRk1UX0xJTlVYX0xFCi0jZWxzZQotI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNpZmRlZiBYRlNfTkFUSVZFX0hPU1QKICNkZWZpbmUgWExPR19GTVQgWExPR19GTVRfTElOVVhfQkUKICNlbHNlCi0jZXJyb3IgdW5rbm93biBieXRlIG9yZGVyCi0jZW5kaWYKKyNkZWZpbmUgWExPR19GTVQgWExPR19GTVRfTElOVVhfTEUKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB4bG9nX3JlY19oZWFkZXIgewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCmluZGV4IDBhYWMyOGQuLjE0ZmFhYmEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYworKysgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKQEAgLTEzODcsNyArMTM4Nyw3IEBACiAJb2xkX3B0ciA9IGl0ZW0tPnJpX2J1ZltpdGVtLT5yaV9jbnQtMV0uaV9hZGRyOwogCW9sZF9sZW4gPSBpdGVtLT5yaV9idWZbaXRlbS0+cmlfY250LTFdLmlfbGVuOwogCi0JcHRyID0ga21lbV9yZWFsbG9jKG9sZF9wdHIsIGxlbitvbGRfbGVuLCBvbGRfbGVuLCAwKTsKKwlwdHIgPSBrbWVtX3JlYWxsb2Mob2xkX3B0ciwgbGVuK29sZF9sZW4sIG9sZF9sZW4sIDB1KTsKIAltZW1jcHkoJnB0cltvbGRfbGVuXSwgZHAsIGxlbik7IC8qIGQsIHMsIGwgKi8KIAlpdGVtLT5yaV9idWZbaXRlbS0+cmlfY250LTFdLmlfbGVuICs9IGxlbjsKIAlpdGVtLT5yaV9idWZbaXRlbS0+cmlfY250LTFdLmlfYWRkciA9IHB0cjsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcW1vcHMuYyBiL2ZzL3hmcy94ZnNfcW1vcHMuYwppbmRleCA0ZjQwYzkyLi5hNmNkNjMyNCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19xbW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfcW1vcHMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKQEAgLTQyLDcgKzQyLDggQEAKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAKIFNUQVRJQyBzdHJ1Y3QgeGZzX2RxdW90ICoKIHhmc19kcXZvcGNob3duX2RlZmF1bHQoCkBAIC01NCw4ICs1NSw3OSBAQAogCXJldHVybiBOVUxMOwogfQogCisvKgorICogQ2xlYXIgdGhlIHF1b3RhZmxhZ3MgaW4gbWVtb3J5IGFuZCBpbiB0aGUgc3VwZXJibG9jay4KKyAqLworaW50Cit4ZnNfbW91bnRfcmVzZXRfc2JxZmxhZ3MoeGZzX21vdW50X3QgKm1wKQoreworCWludAkJCWVycm9yOworCXhmc190cmFuc190CQkqdHA7CisJdW5zaWduZWQgbG9uZwkJczsKKworCW1wLT5tX3FmbGFncyA9IDA7CisJLyoKKwkgKiBJdCBpcyBPSyB0byBsb29rIGF0IHNiX3FmbGFncyBoZXJlIGluIG1vdW50IHBhdGgsCisJICogd2l0aG91dCBTQl9MT0NLLgorCSAqLworCWlmIChtcC0+bV9zYi5zYl9xZmxhZ3MgPT0gMCkKKwkJcmV0dXJuIDA7CisJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwltcC0+bV9zYi5zYl9xZmxhZ3MgPSAwOworCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCisJLyoKKwkgKiBpZiB0aGUgZnMgaXMgcmVhZG9ubHksIGxldCB0aGUgaW5jb3JlIHN1cGVyYmxvY2sgcnVuCisJICogd2l0aCBxdW90YXMgb2ZmIGJ1dCBkb24ndCBmbHVzaCB0aGUgdXBkYXRlIG91dCB0byBkaXNrCisJICovCisJaWYgKFhGU19NVE9WRlMobXApLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpCisJCXJldHVybiAwOworI2lmZGVmIFFVT1RBREVCVUcKKwl4ZnNfZnNfY21uX2VycihDRV9OT1RFLCBtcCwgIldyaXRpbmcgc3VwZXJibG9jayBxdW90YSBjaGFuZ2VzIik7CisjZW5kaWYKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1FNX1NCQ0hBTkdFKTsKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIG1wLT5tX3NiLnNiX3NlY3RzaXplICsgMTI4LCAwLCAwLAorCQkJCSAgICAgIFhGU19ERUZBVUxUX0xPR19DT1VOVCkpKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkieGZzX21vdW50X3Jlc2V0X3NicWZsYWdzOiBTdXBlcmJsb2NrIHVwZGF0ZSBmYWlsZWQhIik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJeGZzX21vZF9zYih0cCwgWEZTX1NCX1FGTEFHUyk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19ub3F1b3RhX2luaXQoCisJeGZzX21vdW50X3QJKm1wLAorCXVpbnQJCSpuZWVkcXVvdGFtb3VudCwKKwl1aW50CQkqcXVvdGFmbGFncykKK3sKKwlpbnQJCWVycm9yID0gMDsKKworCSpxdW90YWZsYWdzID0gMDsKKwkqbmVlZHF1b3RhbW91bnQgPSBCX0ZBTFNFOworCisJQVNTRVJUKCFYRlNfSVNfUVVPVEFfT04obXApKTsKKworCS8qCisJICogSWYgYSBmaWxlIHN5c3RlbSBoYWQgcXVvdGFzIHJ1bm5pbmcgZWFybGllciwgYnV0IGRlY2lkZWQgdG8KKwkgKiBtb3VudCB3aXRob3V0IC1vIHVxdW90YS9wcXVvdGEvZ3F1b3RhIG9wdGlvbnMsIHJldm9rZSB0aGUKKwkgKiBxdW90YWNoZWNrZWQgbGljZW5zZS4KKwkgKi8KKwlpZiAobXAtPm1fc2Iuc2JfcWZsYWdzICYgWEZTX0FMTF9RVU9UQV9BQ0NUKSB7CisJCWNtbl9lcnIoQ0VfTk9URSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJYRlMgcmVzZXR0aW5nIHFmbGFncyBmb3IgZmlsZXN5c3RlbSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtcC0+bV9mc25hbWUpOworCisJCWVycm9yID0geGZzX21vdW50X3Jlc2V0X3NicWZsYWdzKG1wKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCiB4ZnNfcW1vcHNfdAl4ZnNfcW1jb3JlX3N0dWIgPSB7Ci0JLnhmc19xbWluaXQJCT0gKHhmc19xbWluaXRfdCkgZnNfbm9lcnIsCisJLnhmc19xbWluaXQJCT0gKHhmc19xbWluaXRfdCkgeGZzX25vcXVvdGFfaW5pdCwKIAkueGZzX3FtZG9uZQkJPSAoeGZzX3FtZG9uZV90KSBmc19ub2VyciwKIAkueGZzX3FtbW91bnQJCT0gKHhmc19xbW1vdW50X3QpIGZzX25vZXJyLAogCS54ZnNfcW11bm1vdW50CQk9ICh4ZnNfcW11bm1vdW50X3QpIGZzX25vZXJyLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19xdW90YS5oIGIvZnMveGZzL3hmc19xdW90YS5oCmluZGV4IDcxMzQ1NzYuLjMyY2I3OTcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcXVvdGEuaAorKysgYi9mcy94ZnMveGZzX3F1b3RhLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC0xNjAsNiArMTYwLDIwIEBACiAjZGVmaW5lIFhGU19HUVVPVEFfQUNDVAkweDAwNDAgIC8qIGdyb3VwIHF1b3RhIGFjY291bnRpbmcgT04gKi8KIAogLyoKKyAqIFF1b3RhIEFjY291bnRpbmcvRW5mb3JjZW1lbnQgZmxhZ3MKKyAqLworI2RlZmluZSBYRlNfQUxMX1FVT1RBX0FDQ1QJXAorCQkoWEZTX1VRVU9UQV9BQ0NUIHwgWEZTX0dRVU9UQV9BQ0NUIHwgWEZTX1BRVU9UQV9BQ0NUKQorI2RlZmluZSBYRlNfQUxMX1FVT1RBX0VORkQJKFhGU19VUVVPVEFfRU5GRCB8IFhGU19PUVVPVEFfRU5GRCkKKyNkZWZpbmUgWEZTX0FMTF9RVU9UQV9DSEtECShYRlNfVVFVT1RBX0NIS0QgfCBYRlNfT1FVT1RBX0NIS0QpCisKKyNkZWZpbmUgWEZTX0lTX1FVT1RBX1JVTk5JTkcobXApCSgobXApLT5tX3FmbGFncyAmIFhGU19BTExfUVVPVEFfQUNDVCkKKyNkZWZpbmUgWEZTX0lTX1FVT1RBX0VORk9SQ0VEKG1wKQkoKG1wKS0+bV9xZmxhZ3MgJiBYRlNfQUxMX1FVT1RBX0VORkQpCisjZGVmaW5lIFhGU19JU19VUVVPVEFfUlVOTklORyhtcCkJKChtcCktPm1fcWZsYWdzICYgWEZTX1VRVU9UQV9BQ0NUKQorI2RlZmluZSBYRlNfSVNfUFFVT1RBX1JVTk5JTkcobXApCSgobXApLT5tX3FmbGFncyAmIFhGU19QUVVPVEFfQUNDVCkKKyNkZWZpbmUgWEZTX0lTX0dRVU9UQV9SVU5OSU5HKG1wKQkoKG1wKS0+bV9xZmxhZ3MgJiBYRlNfR1FVT1RBX0FDQ1QpCisKKy8qCiAgKiBJbmNvcmUgb25seSBmbGFncyBmb3IgcXVvdGFvZmYgLSB0aGVzZSBiaXRzIGdldCBjbGVhcmVkIHdoZW4gcXVvdGEocykKICAqIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIHR1cm5lZCBvZmYuIFRoZXNlIGZsYWdzIGFyZSBpbiBtX3FmbGFncyBidXQKICAqIG5ldmVyIGluIHNiX3FmbGFncy4KQEAgLTM2Miw2ICszNzYsNyBAQAogCQkJCWYgfCBYRlNfUU1PUFRfUkVTX1JFR0JMS1MpCiAKIGV4dGVybiBpbnQgeGZzX3FtX2RxY2hlY2soeGZzX2Rpc2tfZHF1b3RfdCAqLCB4ZnNfZHFpZF90LCB1aW50LCB1aW50LCBjaGFyICopOworZXh0ZXJuIGludCB4ZnNfbW91bnRfcmVzZXRfc2JxZmxhZ3Moc3RydWN0IHhmc19tb3VudCAqKTsKIAogZXh0ZXJuIHN0cnVjdCBiaHZfdmZzb3BzIHhmc19xbW9wczsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFucy5jIGIvZnMveGZzL3hmc190cmFucy5jCmluZGV4IDA2ZGZjYTUuLjkyZWZlMjcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnMuYworKysgYi9mcy94ZnMveGZzX3RyYW5zLmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCiAJCWVycm9yID0geGZzX2xvZ19yZXNlcnZlKHRwLT50X21vdW50cCwgbG9nc3BhY2UsIGxvZ2NvdW50LAogCQkJCQkmdHAtPnRfdGlja2V0LAotCQkJCQlYRlNfVFJBTlNBQ1RJT04sIGxvZ19mbGFncyk7CisJCQkJCVhGU19UUkFOU0FDVElPTiwgbG9nX2ZsYWdzLCB0cC0+dF90eXBlKTsKIAkJaWYgKGVycm9yKSB7CiAJCQlnb3RvIHVuZG9fYmxvY2tzOwogCQl9CkBAIC0xMDMyLDYgKzEwMzIsNyBAQAogCXRwLT50X2hlYWRlci50aF9udW1faXRlbXMgPSBuaXRlbXM7CiAJbG9nX3ZlY3Rvci0+aV9hZGRyID0gKHhmc19jYWRkcl90KSZ0cC0+dF9oZWFkZXI7CiAJbG9nX3ZlY3Rvci0+aV9sZW4gPSBzaXplb2YoeGZzX3RyYW5zX2hlYWRlcl90KTsKKwlYTE9HX1ZFQ19TRVRfVFlQRShsb2dfdmVjdG9yLCBYTE9HX1JFR19UWVBFX1RSQU5TSERSKTsKIH0KIAogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zLmggYi9mcy94ZnMveGZzX3RyYW5zLmgKaW5kZXggZWM1NDFkNi4uYTI2M2FlYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFucy5oCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnMuaApAQCAtMTEyLDYgKzExMiw3IEBACiAjZGVmaW5lCVhGU19UUkFOU19HUk9XRlNSVF9aRVJPCQkzOAogI2RlZmluZQlYRlNfVFJBTlNfR1JPV0ZTUlRfRlJFRQkJMzkKICNkZWZpbmUJWEZTX1RSQU5TX1NXQVBFWFQJCTQwCisjZGVmaW5lCVhGU19UUkFOU19UWVBFX01BWAkJNDAKIC8qIG5ldyB0cmFuc2FjdGlvbiB0eXBlcyBuZWVkIHRvIGJlIHJlZmxlY3RlZCBpbiB4ZnNfbG9ncHJpbnQoOCkgKi8KIAogCkBAIC05OTgsNiArOTk5LDcgQEAKIHZvaWQJCXhmc190cmFuc19icmVsc2UoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CiB2b2lkCQl4ZnNfdHJhbnNfYmpvaW4oeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CiB2b2lkCQl4ZnNfdHJhbnNfYmhvbGQoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7Cit2b2lkCQl4ZnNfdHJhbnNfYmhvbGRfcmVsZWFzZSh4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKIHZvaWQJCXhmc190cmFuc19iaW52YWwoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CiB2b2lkCQl4ZnNfdHJhbnNfaW5vZGVfYnVmKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICopOwogdm9pZAkJeGZzX3RyYW5zX2lub2RlX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMgYi9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCmluZGV4IDdiYzVlYWIuLjJhNzFiNGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMKKysrIGIvZnMveGZzL3hmc190cmFuc19haWwuYwpAQCAtMzc5LDggKzM3OSw4IEBACiAJCWVsc2UgewogCQkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfQUlMREVMRVRFLCBDRV9BTEVSVCwgbXAsCiAJCQkJInhmc190cmFuc19kZWxldGVfYWlsOiBhdHRlbXB0aW5nIHRvIGRlbGV0ZSBhIGxvZyBpdGVtIHRoYXQgaXMgbm90IGluIHRoZSBBSUwiKTsKLQkJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX0NPUlJVUFRfSU5DT1JFKTsKIAkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfQ09SUlVQVF9JTkNPUkUpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19idWYuYyBiL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKaW5kZXggMTQ0ZGE3YS4uZTczMzI5MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19idWYuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jCkBAIC03MTQsNiArNzE0LDI5IEBACiB9CiAKIC8qCisgKiBDYW5jZWwgdGhlIHByZXZpb3VzIGJ1ZmZlciBob2xkIHJlcXVlc3QgbWFkZSBvbiB0aGlzIGJ1ZmZlcgorICogZm9yIHRoaXMgdHJhbnNhY3Rpb24uCisgKi8KK3ZvaWQKK3hmc190cmFuc19iaG9sZF9yZWxlYXNlKHhmc190cmFuc190CSp0cCwKKwkJCXhmc19idWZfdAkqYnApCit7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisKKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpOworCisJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKKwlBU1NFUlQoIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpKTsKKwlBU1NFUlQoIShiaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzICYgWEZTX0JMSV9DQU5DRUwpKTsKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCUFTU0VSVChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfSE9MRCk7CisJYmlwLT5ibGlfZmxhZ3MgJj0gflhGU19CTElfSE9MRDsKKwl4ZnNfYnVmX2l0ZW1fdHJhY2UoIkJIT0xEIFJFTEVBU0UiLCBiaXApOworfQorCisvKgogICogVGhpcyBpcyBjYWxsZWQgdG8gbWFyayBieXRlcyBmaXJzdCB0aHJvdWdoIGxhc3QgaW5jbHVzaXZlIG9mIHRoZSBnaXZlbgogICogYnVmZmVyIGFzIG5lZWRpbmcgdG8gYmUgbG9nZ2VkIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC4KICAqIFRoZSBidWZmZXIgbXVzdCBhbHJlYWR5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zmc29wcy5jIGIvZnMveGZzL3hmc192ZnNvcHMuYwppbmRleCA0MmJjYzAyLi5mMWE5MDRlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Zmc29wcy5jCisrKyBiL2ZzL3hmcy94ZnNfdmZzb3BzLmMKQEAgLTc5NSw3ICs3OTUsNiBAQAogCXhmc19tb3VudF90CSptcDsKIAl4ZnNfc2JfdAkqc2JwOwogCXVuc2lnbmVkIGxvbmcJczsKLQl1NjQgaWQ7CiAKIAltcCA9IFhGU19CSFZUT00oYmRwKTsKIAlzYnAgPSAmKG1wLT5tX3NiKTsKQEAgLTgyMyw5ICs4MjIsNyBAQAogCXN0YXRwLT5mX2ZmcmVlID0gc3RhdHAtPmZfZmlsZXMgLSAoc2JwLT5zYl9pY291bnQgLSBzYnAtPnNiX2lmcmVlKTsKIAlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKIAotCWlkID0gaHVnZV9lbmNvZGVfZGV2KG1wLT5tX2Rldik7Ci0Jc3RhdHAtPmZfZnNpZC52YWxbMF0gPSAodTMyKWlkOwotCXN0YXRwLT5mX2ZzaWQudmFsWzFdID0gKHUzMikoaWQgPj4gMzIpOworCXhmc19zdGF0dmZzX2ZzaWQoc3RhdHAsIG1wKTsKIAlzdGF0cC0+Zl9uYW1lbGVuID0gTUFYTkFNRUxFTiAtIDE7CiAKIAlyZXR1cm4gMDsKQEAgLTkwNiw3ICs5MDMsNiBAQAogCXhmc19pbm9kZV90CSppcF9uZXh0OwogCXhmc19idWZfdAkqYnA7CiAJdm5vZGVfdAkJKnZwID0gTlVMTDsKLQl2bWFwX3QJCXZtYXA7CiAJaW50CQllcnJvcjsKIAlpbnQJCWxhc3RfZXJyb3I7CiAJdWludDY0X3QJZmZsYWc7CkBAIC0xMTAxLDQ4ICsxMDk3LDIxIEBACiAJCSAqIGxvY2sgaW4geGZzX2lyZWNsYWltKCkgYWZ0ZXIgdGhlIGlub2RlIGlzIHB1bGxlZCBmcm9tCiAJCSAqIHRoZSBtb3VudCBsaXN0IHdpbGwgc2xlZXAgdW50aWwgd2UgcmVsZWFzZSBpdCBoZXJlLgogCQkgKiBUaGlzIGtlZXBzIHRoZSB2bm9kZSBmcm9tIGJlaW5nIGZyZWVkIHdoaWxlIHdlIHJlZmVyZW5jZQotCQkgKiBpdC4gIEl0IGlzIGFsc28gY2hlYXBlciBhbmQgc2ltcGxlciB0aGFuIGFjdHVhbGx5IGRvaW5nCi0JCSAqIGEgdm5fZ2V0KCkgZm9yIGV2ZXJ5IGlub2RlIHdlIHRvdWNoIGhlcmUuCisJCSAqIGl0LgogCQkgKi8KIAkJaWYgKHhmc19pbG9ja19ub3dhaXQoaXAsIGxvY2tfZmxhZ3MpID09IDApIHsKLQogCQkJaWYgKChmbGFncyAmIFNZTkNfQkRGTFVTSCkgfHwgKHZwID09IE5VTEwpKSB7CiAJCQkJaXAgPSBpcC0+aV9tbmV4dDsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJLyoKLQkJCSAqIFdlIG5lZWQgdG8gdW5sb2NrIHRoZSBpbm9kZSBsaXN0IGxvY2sgaW4gb3JkZXIKLQkJCSAqIHRvIGxvY2sgdGhlIGlub2RlLiBJbnNlcnQgYSBtYXJrZXIgcmVjb3JkIGludG8KLQkJCSAqIHRoZSBpbm9kZSBsaXN0IHRvIHJlbWVtYmVyIG91ciBwb3NpdGlvbiwgZHJvcHBpbmcKLQkJCSAqIHRoZSBsb2NrIGlzIG5vdyBkb25lIGluc2lkZSB0aGUgSVBPSU5URVJfSU5TRVJUCi0JCQkgKiBtYWNyby4KLQkJCSAqCi0JCQkgKiBXZSBhbHNvIHVzZSB0aGUgaW5vZGUgbGlzdCBsb2NrIHRvIHByb3RlY3QgdXMKLQkJCSAqIGluIHRha2luZyBhIHNuYXBzaG90IG9mIHRoZSB2bm9kZSB2ZXJzaW9uIG51bWJlcgotCQkJICogZm9yIHVzZSBpbiBjYWxsaW5nIHZuX2dldCgpLgotCQkJICovCi0JCQlWTUFQKHZwLCB2bWFwKTsKLQkJCUlQT0lOVEVSX0lOU0VSVChpcCwgbXApOwotCi0JCQl2cCA9IHZuX2dldCh2cCwgJnZtYXApOworCQkJdnAgPSB2bl9ncmFiKHZwKTsKIAkJCWlmICh2cCA9PSBOVUxMKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGUgdm5vZGUgd2FzIHJlY2xhaW1lZCBvbmNlIHdlIGxldCBnbwotCQkJCSAqIG9mIHRoZSBpbm9kZSBsaXN0IGxvY2suICBTa2lwIHRvIHRoZQotCQkJCSAqIG5leHQgbGlzdCBlbnRyeS4gUmVtb3ZlIHRoZSBtYXJrZXIuCi0JCQkJICovCi0KLQkJCQlYRlNfTU9VTlRfSUxPQ0sobXApOwotCi0JCQkJbW91bnRfbG9ja2VkID0gQl9UUlVFOwotCQkJCXZub2RlX3JlZmVkICA9IEJfRkFMU0U7Ci0KLQkJCQlJUE9JTlRFUl9SRU1PVkUoaXAsIG1wKTsKLQorCQkJCWlwID0gaXAtPmlfbW5leHQ7CiAJCQkJY29udGludWU7CiAJCQl9CiAKKwkJCUlQT0lOVEVSX0lOU0VSVChpcCwgbXApOwogCQkJeGZzX2lsb2NrKGlwLCBsb2NrX2ZsYWdzKTsKIAogCQkJQVNTRVJUKHZwID09IFhGU19JVE9WKGlwKSk7CkBAIC0xNTMzLDcgKzE1MDIsMTAgQEAKIAkgKiBldmVudHVhbGx5IGtpY2tlZCBvdXQgb2YgdGhlIGNhY2hlLgogCSAqLwogCWlmIChmbGFncyAmIFNZTkNfUkVGQ0FDSEUpIHsKLQkJeGZzX3JlZmNhY2hlX3B1cmdlX3NvbWUobXApOworCQlpZiAoZmxhZ3MgJiBTWU5DX1dBSVQpCisJCQl4ZnNfcmVmY2FjaGVfcHVyZ2VfbXAobXApOworCQllbHNlCisJCQl4ZnNfcmVmY2FjaGVfcHVyZ2Vfc29tZShtcCk7CiAJfQogCiAJLyoKQEAgLTE2NDksNiArMTYyMSwxMCBAQAogI2RlZmluZSBNTlRPUFRfU1dJRFRICSJzd2lkdGgiCS8qIGRhdGEgdm9sdW1lIHN0cmlwZSB3aWR0aCAqLwogI2RlZmluZSBNTlRPUFRfTk9VVUlECSJub3V1aWQiCS8qIGlnbm9yZSBmaWxlc3lzdGVtIFVVSUQgKi8KICNkZWZpbmUgTU5UT1BUX01UUFQJIm10cHQiCQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisjZGVmaW5lIE1OVE9QVF9HUlBJRAkiZ3JwaWQiCQkvKiBncm91cC1JRCBmcm9tIHBhcmVudCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgTU5UT1BUX05PR1JQSUQJIm5vZ3JwaWQiCS8qIGdyb3VwLUlEIGZyb20gY3VycmVudCBwcm9jZXNzICovCisjZGVmaW5lIE1OVE9QVF9CU0RHUk9VUFMgICAgImJzZGdyb3VwcyIgICAgLyogZ3JvdXAtSUQgZnJvbSBwYXJlbnQgZGlyZWN0b3J5ICovCisjZGVmaW5lIE1OVE9QVF9TWVNWR1JPVVBTICAgInN5c3Zncm91cHMiICAgLyogZ3JvdXAtSUQgZnJvbSBjdXJyZW50IHByb2Nlc3MgKi8KICNkZWZpbmUgTU5UT1BUX0FMTE9DU0laRSAgICAiYWxsb2NzaXplIiAgICAvKiBwcmVmZXJyZWQgYWxsb2NhdGlvbiBzaXplICovCiAjZGVmaW5lIE1OVE9QVF9JSEFTSFNJWkUgICAgImloYXNoc2l6ZSIgICAgLyogc2l6ZSBvZiBpbm9kZSBoYXNoIHRhYmxlICovCiAjZGVmaW5lIE1OVE9QVF9OT1JFQ09WRVJZICAgIm5vcmVjb3ZlcnkiICAgLyogZG9uJ3QgcnVuIFhGUyByZWNvdmVyeSAqLwpAQCAtMTc2OSw2ICsxNzQ1LDEyIEBACiAJCQl9CiAJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfSUhBU0hTSVpFOwogCQkJYXJncy0+aWhhc2hzaXplID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZlb3YsIDEwKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0dSUElEKSB8fAorCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9CU0RHUk9VUFMpKSB7CisJCQl2ZnNwLT52ZnNfZmxhZyB8PSBWRlNfR1JQSUQ7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT0dSUElEKSB8fAorCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9TWVNWR1JPVVBTKSkgeworCQkJdmZzcC0+dmZzX2ZsYWcgJj0gflZGU19HUlBJRDsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1dTWU5DKSkgewogCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1dTWU5DOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfT1NZTkNJU09TWU5DKSkgewpAQCAtMTg5MCw2ICsxODcyLDcgQEAKIAl9OwogCXN0cnVjdCBwcm9jX3hmc19pbmZvCSp4ZnNfaW5mb3A7CiAJc3RydWN0IHhmc19tb3VudAkqbXAgPSBYRlNfQkhWVE9NKGJodik7CisJc3RydWN0IHZmcwkJKnZmc3AgPSBYRlNfTVRPVkZTKG1wKTsKIAogCWZvciAoeGZzX2luZm9wID0geGZzX2luZm87IHhmc19pbmZvcC0+ZmxhZzsgeGZzX2luZm9wKyspIHsKIAkJaWYgKG1wLT5tX2ZsYWdzICYgeGZzX2luZm9wLT5mbGFnKQpAQCAtMTkyNiw3ICsxOTA5LDEwIEBACiAKIAlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF8zMkJJVElOT09QVCkpCiAJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF82NEJJVElOT0RFKTsKLQkKKworCWlmICh2ZnNwLT52ZnNfZmxhZyAmIFZGU19HUlBJRCkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0dSUElEKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKaW5kZXggMTM3N2M4Ni4uNThiZmU2MiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc192bm9kZW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJICogSWYgaXQncyBhIGRpcmVjdG9yeSB3aXRoIGFueSBibG9ja3MsIHJlYWQtYWhlYWQgYmxvY2sgMAogCSAqIGFzIHdlJ3JlIGFsbW9zdCBjZXJ0YWluIHRvIGhhdmUgdGhlIG5leHQgb3BlcmF0aW9uIGJlIGEgcmVhZCB0aGVyZS4KIAkgKi8KLQlpZiAodnAtPnZfdHlwZSA9PSBWRElSICYmIGlwLT5pX2QuZGlfbmV4dGVudHMgPiAwKSB7CisJaWYgKFZOX0lTRElSKHZwKSAmJiBpcC0+aV9kLmRpX25leHRlbnRzID4gMCkgewogCQltb2RlID0geGZzX2lsb2NrX21hcF9zaGFyZWQoaXApOwogCQlpZiAoaXAtPmlfZC5kaV9uZXh0ZW50cyA+IDApCiAJCQkodm9pZCl4ZnNfZGFfcmVhZGFfYnVmKE5VTEwsIGlwLCAwLCBYRlNfREFUQV9GT1JLKTsKQEAgLTE2MywxOCArMTYzLDIxIEBACiAJLyoKIAkgKiBDb3B5IGZyb20gaW4tY29yZSBpbm9kZS4KIAkgKi8KLQl2YXAtPnZhX3R5cGUgPSB2cC0+dl90eXBlOwotCXZhcC0+dmFfbW9kZSA9IGlwLT5pX2QuZGlfbW9kZSAmIE1PREVNQVNLOworCXZhcC0+dmFfbW9kZSA9IGlwLT5pX2QuZGlfbW9kZTsKIAl2YXAtPnZhX3VpZCA9IGlwLT5pX2QuZGlfdWlkOwogCXZhcC0+dmFfZ2lkID0gaXAtPmlfZC5kaV9naWQ7CiAJdmFwLT52YV9wcm9qaWQgPSBpcC0+aV9kLmRpX3Byb2ppZDsKIAogCS8qCiAJICogQ2hlY2sgdm5vZGUgdHlwZSBibG9jay9jaGFyIHZzLiBldmVyeXRoaW5nIGVsc2UuCi0JICogRG8gaXQgd2l0aCBiaXRtYXNrIGJlY2F1c2UgdGhhdCdzIGZhc3RlciB0aGFuIGxvb2tpbmcKLQkgKiBmb3IgbXVsdGlwbGUgdmFsdWVzIGluZGl2aWR1YWxseS4KIAkgKi8KLQlpZiAoKCgxIDw8IHZwLT52X3R5cGUpICYgKCgxPDxWQkxLKSB8ICgxPDxWQ0hSKSkpID09IDApIHsKKwlzd2l0Y2ggKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgeworCWNhc2UgU19JRkJMSzoKKwljYXNlIFNfSUZDSFI6CisJCXZhcC0+dmFfcmRldiA9IGlwLT5pX2RmLmlmX3UyLmlmX3JkZXY7CisJCXZhcC0+dmFfYmxvY2tzaXplID0gQkxLREVWX0lPU0laRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJdmFwLT52YV9yZGV2ID0gMDsKIAogCQlpZiAoIShpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkpIHsKQEAgLTIyNCw5ICsyMjcsNyBAQAogCQkJCShpcC0+aV9kLmRpX2V4dHNpemUgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpIDoKIAkJCQkobXAtPm1fc2Iuc2JfcmV4dHNpemUgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpOwogCQl9Ci0JfSBlbHNlIHsKLQkJdmFwLT52YV9yZGV2ID0gaXAtPmlfZGYuaWZfdTIuaWZfcmRldjsKLQkJdmFwLT52YV9ibG9ja3NpemUgPSBCTEtERVZfSU9TSVpFOworCQlicmVhazsKIAl9CiAKIAl2YXAtPnZhX2F0aW1lLnR2X3NlYyA9IGlwLT5pX2QuZGlfYXRpbWUudF9zZWM7CkBAIC00NjgsNyArNDY5LDcgQEAKIAkJCQltIHw9IFNfSVNHSUQ7CiAjaWYgMAogCQkJLyogTGludXggYWxsb3dzIHRoaXMsIElyaXggZG9lc24ndC4gKi8KLQkJCWlmICgodmFwLT52YV9tb2RlICYgU19JU1ZUWCkgJiYgdnAtPnZfdHlwZSAhPSBWRElSKQorCQkJaWYgKCh2YXAtPnZhX21vZGUgJiBTX0lTVlRYKSAmJiAhVk5fSVNESVIodnApKQogCQkJCW0gfD0gU19JU1ZUWDsKICNlbmRpZgogCQkJaWYgKG0gJiYgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpCkBAIC01NDYsMTAgKzU0NywxMCBAQAogCQkJZ290byBlcnJvcl9yZXR1cm47CiAJCX0KIAotCQlpZiAodnAtPnZfdHlwZSA9PSBWRElSKSB7CisJCWlmIChWTl9JU0RJUih2cCkpIHsKIAkJCWNvZGUgPSBYRlNfRVJST1IoRUlTRElSKTsKIAkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQl9IGVsc2UgaWYgKHZwLT52X3R5cGUgIT0gVlJFRykgeworCQl9IGVsc2UgaWYgKCFWTl9JU1JFRyh2cCkpIHsKIAkJCWNvZGUgPSBYRlNfRVJST1IoRUlOVkFMKTsKIAkJCWdvdG8gZXJyb3JfcmV0dXJuOwogCQl9CkBAIC0xNTY3LDcgKzE1NjgsNyBAQAogCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CiAJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CiAKLQlpZiAoKHZwLT52X3R5cGUgIT0gVlJFRykgfHwgKGlwLT5pX2QuZGlfbW9kZSA9PSAwKSkgeworCWlmICghVk5fSVNSRUcodnApIHx8IChpcC0+aV9kLmRpX21vZGUgPT0gMCkpIHsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xODk1LDcgKzE4OTYsNyBAQAogCWRwID0gWEZTX0JIVlRPSShkaXJfYmRwKTsKIAltcCA9IGRwLT5pX21vdW50OwogCi0JZG1fZGlfbW9kZSA9IHZhcC0+dmFfbW9kZXxWVFRPSUYodmFwLT52YV90eXBlKTsKKwlkbV9kaV9tb2RlID0gdmFwLT52YV9tb2RlOwogCW5hbWVsZW4gPSBWTkFNRUxFTihkZW50cnkpOwogCiAJaWYgKERNX0VWRU5UX0VOQUJMRUQoZGlyX3ZwLT52X3Zmc3AsIGRwLCBETV9FVkVOVF9DUkVBVEUpKSB7CkBAIC0xOTczLDggKzE5NzQsNyBAQAogCSAgICAoZXJyb3IgPSBYRlNfRElSX0NBTkVOVEVSKG1wLCB0cCwgZHAsIG5hbWUsIG5hbWVsZW4pKSkKIAkJZ290byBlcnJvcl9yZXR1cm47CiAJcmRldiA9ICh2YXAtPnZhX21hc2sgJiBYRlNfQVRfUkRFVikgPyB2YXAtPnZhX3JkZXYgOiAwOwotCWVycm9yID0geGZzX2Rpcl9pYWxsb2MoJnRwLCBkcCwKLQkJCU1BS0VJTU9ERSh2YXAtPnZhX3R5cGUsdmFwLT52YV9tb2RlKSwgMSwKKwllcnJvciA9IHhmc19kaXJfaWFsbG9jKCZ0cCwgZHAsIHZhcC0+dmFfbW9kZSwgMSwKIAkJCXJkZXYsIGNyZWRwLCBwcmlkLCByZXNibGtzID4gMCwKIAkJCSZpcCwgJmNvbW1pdHRlZCk7CiAJaWYgKGVycm9yKSB7CkBAIC0yNjIwLDcgKzI2MjAsNyBAQAogCXZuX3RyYWNlX2VudHJ5KHNyY192cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CiAKIAl0YXJnZXRfbmFtZWxlbiA9IFZOQU1FTEVOKGRlbnRyeSk7Ci0JaWYgKHNyY192cC0+dl90eXBlID09IFZESVIpCisJaWYgKFZOX0lTRElSKHNyY192cCkpCiAJCXJldHVybiBYRlNfRVJST1IoRVBFUk0pOwogCiAJc3JjX2JkcCA9IHZuX2Jodl9sb29rdXBfdW5sb2NrZWQoVk5fQkhWX0hFQUQoc3JjX3ZwKSwgJnhmc192bm9kZW9wcyk7CkBAIC0yODA1LDcgKzI4MDUsNyBAQAogCiAJdHAgPSBOVUxMOwogCWRwX2pvaW5lZF90b190cmFucyA9IEJfRkFMU0U7Ci0JZG1fZGlfbW9kZSA9IHZhcC0+dmFfbW9kZXxWVFRPSUYodmFwLT52YV90eXBlKTsKKwlkbV9kaV9tb2RlID0gdmFwLT52YV9tb2RlOwogCiAJaWYgKERNX0VWRU5UX0VOQUJMRUQoZGlyX3ZwLT52X3Zmc3AsIGRwLCBETV9FVkVOVF9DUkVBVEUpKSB7CiAJCWVycm9yID0gWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9DUkVBVEUsCkBAIC0yODc5LDggKzI4NzksNyBAQAogCS8qCiAJICogY3JlYXRlIHRoZSBkaXJlY3RvcnkgaW5vZGUuCiAJICovCi0JZXJyb3IgPSB4ZnNfZGlyX2lhbGxvYygmdHAsIGRwLAotCQkJTUFLRUlNT0RFKHZhcC0+dmFfdHlwZSx2YXAtPnZhX21vZGUpLCAyLAorCWVycm9yID0geGZzX2Rpcl9pYWxsb2MoJnRwLCBkcCwgdmFwLT52YV9tb2RlLCAyLAogCQkJMCwgY3JlZHAsIHByaWQsIHJlc2Jsa3MgPiAwLAogCQkmY2RwLCBOVUxMKTsKIAlpZiAoZXJyb3IpIHsKQEAgLTM2NTAsNyArMzY0OSw3IEBACiAJdm5vZGVfdAkJKnZwOwogCiAJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKLQlpZiAodnAtPnZfdHlwZSA9PSBWRElSKQorCWlmIChWTl9JU0RJUih2cCkpCiAJCXJldHVybiAxOwogCWlwID0gWEZTX0JIVlRPSShiZHApOwogCWlmIChsb2NrdHlwZSA9PSBWUldMT0NLX1dSSVRFKSB7CkBAIC0zNjgxLDcgKzM2ODAsNyBAQAogCXZub2RlX3QJCSp2cDsKIAogCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7Ci0JaWYgKHZwLT52X3R5cGUgPT0gVkRJUikKKwlpZiAoVk5fSVNESVIodnApKQogCQlyZXR1cm47CiAJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CiAJaWYgKGxvY2t0eXBlID09IFZSV0xPQ0tfV1JJVEUpIHsKQEAgLTM4NDcsNTEgKzM4NDYsMTAgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpIHsKLQkJaWYgKGlwLT5pX2QuZGlfc2l6ZSA+IDApIHsKLQkJCS8qCi0JCQkgKiBGbHVzaCBhbmQgaW52YWxpZGF0ZSBhbnkgZGF0YSBsZWZ0IGFyb3VuZCB0aGF0IGlzCi0JCQkgKiBhIHBhcnQgb2YgdGhpcyBmaWxlLgotCQkJICoKLQkJCSAqIEdldCB0aGUgaW5vZGUncyBpL28gbG9jayBzbyB0aGF0IGJ1ZmZlcnMgYXJlIHB1c2hlZAotCQkJICogb3V0IHdoaWxlIGhvbGRpbmcgdGhlIHByb3BlciBsb2NrLiAgV2UgY2FuJ3QgaG9sZAotCQkJICogdGhlIGlub2RlIGxvY2sgaGVyZSBzaW5jZSBmbHVzaGluZyBvdXQgYnVmZmVycyBtYXkKLQkJCSAqIGNhdXNlIHVzIHRvIHRyeSB0byBnZXQgdGhlIGxvY2sgaW4geGZzX3N0cmF0ZWd5KCkuCi0JCQkgKgotCQkJICogV2UgZG9uJ3QgaGF2ZSB0byBjYWxsIHJlbWFwZigpIGhlcmUsIGJlY2F1c2UgdGhlcmUKLQkJCSAqIGNhbm5vdCBiZSBhbnkgbWFwcGVkIGZpbGUgcmVmZXJlbmNlcyB0byB0aGlzIHZub2RlCi0JCQkgKiBzaW5jZSBpdCBpcyBiZWluZyByZWNsYWltZWQuCi0JCQkgKi8KLQkJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKwl2bl9pb3dhaXQodnApOwogCi0JCQkvKgotCQkJICogSWYgd2UgaGl0IGFuIElPIGVycm9yLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotCQkJICogYnVmZmVyIGFuZCBwYWdlIGNhY2hlcyBvZiBmaWxlIGRhdGEgZm9yCi0JCQkgKiB0aGUgZmlsZSBhcmUgdG9zc2VkIGF3YXkuIFdlIGRvbid0IHdhbnQgdG8gdXNlCi0JCQkgKiBWT1BfRkxVU0hJTlZBTF9QQUdFUyBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBkaXJ0eQotCQkJICogcGFnZXMgdG8gc3RheSBhdHRhY2hlZCB0byB0aGUgdm5vZGUsIGJ1dCBiZQotCQkJICogbWFya2VkIFBfQkFELiBwZGZsdXNoL3Zub2RlX3BhZ2ViYWQKLQkJCSAqIGhhdGVzIHRoYXQuCi0JCQkgKi8KLQkJCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpIHsKLQkJCQlWT1BfRkxVU0hJTlZBTF9QQUdFUyh2cCwgMCwgLTEsIEZJX05PTkUpOwotCQkJfSBlbHNlIHsKLQkJCQlWT1BfVE9TU19QQUdFUyh2cCwgMCwgLTEsIEZJX05PTkUpOwotCQkJfQotCi0JCQlBU1NFUlQoVk5fQ0FDSEVEKHZwKSA9PSAwKTsKLQkJCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSB8fAotCQkJICAgICAgIGlwLT5pX2RlbGF5ZWRfYmxrcyA9PSAwKTsKLQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOwotCQl9IGVsc2UgaWYgKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKSB7Ci0JCQkvKgotCQkJICogZGlfc2l6ZSBmaWVsZCBtYXkgbm90IGJlIHF1aXRlIGFjY3VyYXRlIGlmIHdlJ3JlCi0JCQkgKiBzaHV0dGluZyBkb3duLgotCQkJICovCi0JCQlWT1BfVE9TU19QQUdFUyh2cCwgMCwgLTEsIEZJX05PTkUpOwotCQkJQVNTRVJUKFZOX0NBQ0hFRCh2cCkgPT0gMCk7Ci0JCX0KLQl9CisJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpIHx8IGlwLT5pX2RlbGF5ZWRfYmxrcyA9PSAwKTsKKwlBU1NFUlQoVk5fQ0FDSEVEKHZwKSA9PSAwKTsKIAogCS8qIElmIHdlIGhhdmUgbm90aGluZyB0byBmbHVzaCB3aXRoIHRoaXMgaW5vZGUgdGhlbiBjb21wbGV0ZSB0aGUKIAkgKiB0ZWFyZG93biBub3csIG90aGVyd2lzZSBicmVhayB0aGUgbGluayBiZXR3ZWVuIHRoZSB4ZnMgaW5vZGUKQEAgLTQ1NjcsNyArNDUyNSw3IEBACiAJLyoKIAkgKiBtdXN0IGJlIGEgcmVndWxhciBmaWxlIGFuZCBoYXZlIHdyaXRlIHBlcm1pc3Npb24KIAkgKi8KLQlpZiAodnAtPnZfdHlwZSAhPSBWUkVHKQorCWlmICghVk5fSVNSRUcodnApKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CiAKIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmggYi9pbmNsdWRlL2FjcGkvYWNjb25maWcuaAppbmRleCAyZjZhYjE4Li40MjdjZmYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNjb25maWcuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNjb25maWcuaApAQCAtNDQsNyArNDQsNiBAQAogI2lmbmRlZiBfQUNDT05GSUdfSAogI2RlZmluZSBfQUNDT05GSUdfSAogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMKQEAgLTY0LDcgKzYzLDcgQEAKIAogLyogVmVyc2lvbiBzdHJpbmcgKi8KIAotI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAwNTA0MDgKKyNkZWZpbmUgQUNQSV9DQV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDIwMDUwOTAyCiAKIC8qCiAgKiBPUyBuYW1lLCB1c2VkIGZvciB0aGUgX09TIG9iamVjdC4gIFRoZSBfT1Mgb2JqZWN0IGlzIGVzc2VudGlhbGx5IG9ic29sZXRlLApAQCAtNzgsMTEgKzc3LDEwIEBACiAKIC8qIE1heGltdW0gb2JqZWN0cyBpbiB0aGUgdmFyaW91cyBvYmplY3QgY2FjaGVzICovCiAKLSNkZWZpbmUgQUNQSV9NQVhfU1RBVEVfQ0FDSEVfREVQVEggICAgICA2NCAgICAgICAgICAvKiBTdGF0ZSBvYmplY3RzICovCi0jZGVmaW5lIEFDUElfTUFYX1BBUlNFX0NBQ0hFX0RFUFRIICAgICAgOTYgICAgICAgICAgLyogUGFyc2UgdHJlZSBvYmplY3RzICovCi0jZGVmaW5lIEFDUElfTUFYX0VYVFBBUlNFX0NBQ0hFX0RFUFRIICAgNjQgICAgICAgICAgLyogUGFyc2UgdHJlZSBvYmplY3RzICovCi0jZGVmaW5lIEFDUElfTUFYX09CSkVDVF9DQUNIRV9ERVBUSCAgICAgNjQgICAgICAgICAgLyogSW50ZXJwcmV0ZXIgb3BlcmFuZCBvYmplY3RzICovCi0jZGVmaW5lIEFDUElfTUFYX1dBTEtfQ0FDSEVfREVQVEggICAgICAgNCAgICAgICAgICAgLyogT2JqZWN0cyBmb3IgcGFyc2UgdHJlZSB3YWxrcyAqLworI2RlZmluZSBBQ1BJX01BWF9TVEFURV9DQUNIRV9ERVBUSCAgICAgIDk2CS8qIFN0YXRlIG9iamVjdHMgKi8KKyNkZWZpbmUgQUNQSV9NQVhfUEFSU0VfQ0FDSEVfREVQVEggICAgICA5NgkvKiBQYXJzZSB0cmVlIG9iamVjdHMgKi8KKyNkZWZpbmUgQUNQSV9NQVhfRVhUUEFSU0VfQ0FDSEVfREVQVEggICA5NgkvKiBQYXJzZSB0cmVlIG9iamVjdHMgKi8KKyNkZWZpbmUgQUNQSV9NQVhfT0JKRUNUX0NBQ0hFX0RFUFRIICAgICA5NgkvKiBJbnRlcnByZXRlciBvcGVyYW5kIG9iamVjdHMgKi8KIAogLyoKICAqIFNob3VsZCB0aGUgc3VieXN0ZW0gYWJvcnQgdGhlIGxvYWRpbmcgb2YgYW4gQUNQSSB0YWJsZSBpZiB0aGUKQEAgLTkwLDcgKzg4LDYgQEAKICAqLwogI2RlZmluZSBBQ1BJX0NIRUNLU1VNX0FCT1JUICAgICAgICAgICAgIEZBTFNFCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFN1YnN5c3RlbSBDb25zdGFudHMKQEAgLTEwNCw3ICsxMDEsNyBAQAogLyogU3RyaW5nIHNpemUgY29uc3RhbnRzICovCiAKICNkZWZpbmUgQUNQSV9NQVhfU1RSSU5HX0xFTkdUSCAgICAgICAgICA1MTIKLSNkZWZpbmUgQUNQSV9QQVRITkFNRV9NQVggICAgICAgICAgICAgICAyNTYgICAgICAgICAvKiBBIGZ1bGwgbmFtZXNwYWNlIHBhdGhuYW1lICovCisjZGVmaW5lIEFDUElfUEFUSE5BTUVfTUFYICAgICAgICAgICAgICAgMjU2CS8qIEEgZnVsbCBuYW1lc3BhY2UgcGF0aG5hbWUgKi8KIAogLyogTWF4aW11bSBjb3VudCBmb3IgYSBzZW1hcGhvcmUgb2JqZWN0ICovCiAKQEAgLTExOCw3ICsxMTUsNiBAQAogCiAjZGVmaW5lIEFDUElfU1lTTUVNX1JFR0lPTl9XSU5ET1dfU0laRSAgNDA5NgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBBQ1BJIFNwZWNpZmljYXRpb24gY29uc3RhbnRzIChEbyBub3QgY2hhbmdlIHVubGVzcyB0aGUgc3BlY2lmaWNhdGlvbiBjaGFuZ2VzKQpAQCAtMTU2LDE1ICsxNTIsMTUgQEAKIC8qIE5hbWVzIHdpdGhpbiB0aGUgbmFtZXNwYWNlIGFyZSA0IGJ5dGVzIGxvbmcgKi8KIAogI2RlZmluZSBBQ1BJX05BTUVfU0laRSAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQUNQSV9QQVRIX1NFR01FTlRfTEVOR1RIICAgICAgICA1ICAgICAgICAgICAvKiA0IGNoYXJzIGZvciBuYW1lICsgMSBjaGFyIGZvciBzZXBhcmF0b3IgKi8KKyNkZWZpbmUgQUNQSV9QQVRIX1NFR01FTlRfTEVOR1RIICAgICAgICA1CS8qIDQgY2hhcnMgZm9yIG5hbWUgKyAxIGNoYXIgZm9yIHNlcGFyYXRvciAqLwogI2RlZmluZSBBQ1BJX1BBVEhfU0VQQVJBVE9SICAgICAgICAgICAgICcuJwogCiAvKiBDb25zdGFudHMgdXNlZCBpbiBzZWFyY2hpbmcgZm9yIHRoZSBSU0RQIGluIGxvdyBtZW1vcnkgKi8KIAotI2RlZmluZSBBQ1BJX0VCREFfUFRSX0xPQ0FUSU9OICAgICAgICAgIDB4MDAwMDA0MEUgICAgIC8qIFBoeXNpY2FsIEFkZHJlc3MgKi8KKyNkZWZpbmUgQUNQSV9FQkRBX1BUUl9MT0NBVElPTiAgICAgICAgICAweDAwMDAwNDBFCS8qIFBoeXNpY2FsIEFkZHJlc3MgKi8KICNkZWZpbmUgQUNQSV9FQkRBX1BUUl9MRU5HVEggICAgICAgICAgICAyCiAjZGVmaW5lIEFDUElfRUJEQV9XSU5ET1dfU0laRSAgICAgICAgICAgMTAyNAotI2RlZmluZSBBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UgICAgICAgIDB4MDAwRTAwMDAgICAgIC8qIFBoeXNpY2FsIEFkZHJlc3MgKi8KKyNkZWZpbmUgQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFICAgICAgICAweDAwMEUwMDAwCS8qIFBoeXNpY2FsIEFkZHJlc3MgKi8KICNkZWZpbmUgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFICAgICAgICAweDAwMDIwMDAwCiAjZGVmaW5lIEFDUElfUlNEUF9TQ0FOX1NURVAgICAgICAgICAgICAgMTYKIApAQCAtMTk5LDE4ICsxOTUsMTUgQEAKIAogI2RlZmluZSBBQ1BJX05VTV9PU0lfU1RSSU5HUyAgICAgICAgICAgIDEwCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEFDUEkgQU1MIERlYnVnZ2VyCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIEFDUElfREVCVUdHRVJfTUFYX0FSR1MgICAgICAgICAgOCAgLyogTXVzdCBiZSBtYXggbWV0aG9kIGFyZ3MgKyAxICovCisjZGVmaW5lIEFDUElfREVCVUdHRVJfTUFYX0FSR1MgICAgICAgICAgOAkvKiBNdXN0IGJlIG1heCBtZXRob2QgYXJncyArIDEgKi8KIAogI2RlZmluZSBBQ1BJX0RFQlVHR0VSX0NPTU1BTkRfUFJPTVBUICAgICctJwogI2RlZmluZSBBQ1BJX0RFQlVHR0VSX0VYRUNVVEVfUFJPTVBUICAgICclJwogCi0KLSNlbmRpZiAvKiBfQUNDT05GSUdfSCAqLwotCisjZW5kaWYJCQkJLyogX0FDQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2RlYnVnLmggYi9pbmNsdWRlL2FjcGkvYWNkZWJ1Zy5oCmluZGV4IDhiYTM3MmIuLjcwY2UzYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2RlYnVnLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZGVidWcuaApAQCAtNDQsMjIgKzQ0LDE3IEBACiAjaWZuZGVmIF9fQUNERUJVR19IX18KICNkZWZpbmUgX19BQ0RFQlVHX0hfXwogCi0KICNkZWZpbmUgQUNQSV9ERUJVR19CVUZGRVJfU0laRSAgNDE5NgogCi1zdHJ1Y3QgY29tbWFuZF9pbmZvCi17Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTsgICAgICAgICAgLyogQ29tbWFuZCBOYW1lICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYXJnczsgICAgICAgLyogTWluaW11bSBhcmd1bWVudHMgcmVxdWlyZWQgKi8KK3N0cnVjdCBjb21tYW5kX2luZm8geworCWNoYXIgKm5hbWU7CQkvKiBDb21tYW5kIE5hbWUgKi8KKwl1OCBtaW5fYXJnczsJCS8qIE1pbmltdW0gYXJndW1lbnRzIHJlcXVpcmVkICovCiB9OwogCi0KLXN0cnVjdCBhcmd1bWVudF9pbmZvCi17Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTsgICAgICAgICAgLyogQXJndW1lbnQgTmFtZSAqLworc3RydWN0IGFyZ3VtZW50X2luZm8geworCWNoYXIgKm5hbWU7CQkvKiBBcmd1bWVudCBOYW1lICovCiB9OwogCi0KICNkZWZpbmUgUEFSQU1fTElTVChwbCkgICAgICAgICAgICAgICAgICBwbAogI2RlZmluZSBEQlRFU1RfT1VUUFVUX0xFVkVMKGx2bCkgICAgICAgIGlmIChhY3BpX2dibF9kYl9vcHRfdmVyYm9zZSkKICNkZWZpbmUgVkVSQk9TRV9QUklOVChmcCkgICAgICAgICAgICAgICBEQlRFU1RfT1VUUFVUX0xFVkVMKGx2bCkge1wKQEAgLTY4LDI3NSArNjMsMTU1IEBACiAjZGVmaW5lIEVYX05PX1NJTkdMRV9TVEVQICAgICAgICAgICAgICAgMQogI2RlZmluZSBFWF9TSU5HTEVfU1RFUCAgICAgICAgICAgICAgICAgIDIKIAotCiAvKgogICogZGJ4ZmFjZSAtIGV4dGVybmFsIGRlYnVnZ2VyIGludGVyZmFjZXMKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfZGJfaW5pdGlhbGl6ZSAoCi0Jdm9pZCk7CithY3BpX3N0YXR1cyBhY3BpX2RiX2luaXRpYWxpemUodm9pZCk7CiAKLXZvaWQKLWFjcGlfZGJfdGVybWluYXRlICgKLQl2b2lkKTsKK3ZvaWQgYWNwaV9kYl90ZXJtaW5hdGUodm9pZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RiX3NpbmdsZV9zdGVwICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfdHlwZSk7Ci0KK2FjcGlfZGJfc2luZ2xlX3N0ZXAoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwgdTMyIG9wX3R5cGUpOwogCiAvKgogICogZGJjbWRzIC0gZGVidWcgY29tbWFuZHMgYW5kIG91dHB1dCByb3V0aW5lcwogICovCi1hY3BpX3N0YXR1cwotYWNwaV9kYl9kaXNhc3NlbWJsZV9tZXRob2QgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOworYWNwaV9zdGF0dXMgYWNwaV9kYl9kaXNhc3NlbWJsZV9tZXRob2QoY2hhciAqbmFtZSk7CisKK3ZvaWQgYWNwaV9kYl9kaXNwbGF5X3RhYmxlX2luZm8oY2hhciAqdGFibGVfYXJnKTsKKwordm9pZCBhY3BpX2RiX3VubG9hZF9hY3BpX3RhYmxlKGNoYXIgKnRhYmxlX2FyZywgY2hhciAqaW5zdGFuY2VfYXJnKTsKIAogdm9pZAotYWNwaV9kYl9kaXNwbGF5X3RhYmxlX2luZm8gKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhYmxlX2FyZyk7CithY3BpX2RiX3NldF9tZXRob2RfYnJlYWtwb2ludChjaGFyICpsb2NhdGlvbiwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi12b2lkCi1hY3BpX2RiX3VubG9hZF9hY3BpX3RhYmxlICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0YWJsZV9hcmcsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5zdGFuY2VfYXJnKTsKK3ZvaWQgYWNwaV9kYl9zZXRfbWV0aG9kX2NhbGxfYnJlYWtwb2ludCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi12b2lkCi1hY3BpX2RiX3NldF9tZXRob2RfYnJlYWtwb2ludCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9jYXRpb24sCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Cit2b2lkIGFjcGlfZGJfZ2V0X2J1c19pbmZvKHZvaWQpOwogCi12b2lkCi1hY3BpX2RiX3NldF9tZXRob2RfY2FsbF9icmVha3BvaW50ICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Cit2b2lkIGFjcGlfZGJfZGlzYXNzZW1ibGVfYW1sKGNoYXIgKnN0YXRlbWVudHMsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQKLWFjcGlfZGJfZGlzYXNzZW1ibGVfYW1sICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0ZW1lbnRzLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK3ZvaWQgYWNwaV9kYl9kdW1wX25hbWVzcGFjZShjaGFyICpzdGFydF9hcmcsIGNoYXIgKmRlcHRoX2FyZyk7CiAKLXZvaWQKLWFjcGlfZGJfZHVtcF9uYW1lc3BhY2UgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXJ0X2FyZywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXB0aF9hcmcpOwordm9pZCBhY3BpX2RiX2R1bXBfbmFtZXNwYWNlX2J5X293bmVyKGNoYXIgKm93bmVyX2FyZywgY2hhciAqZGVwdGhfYXJnKTsKIAotdm9pZAotYWNwaV9kYl9kdW1wX25hbWVzcGFjZV9ieV9vd25lciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3duZXJfYXJnLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlcHRoX2FyZyk7Cit2b2lkIGFjcGlfZGJfc2VuZF9ub3RpZnkoY2hhciAqbmFtZSwgdTMyIHZhbHVlKTsKIAotdm9pZAotYWNwaV9kYl9zZW5kX25vdGlmeSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQotdm9pZAotYWNwaV9kYl9zZXRfbWV0aG9kX2RhdGEgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR5cGVfYXJnLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmluZGV4X2FyZywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZV9hcmcpOwordm9pZCBhY3BpX2RiX3NldF9tZXRob2RfZGF0YShjaGFyICp0eXBlX2FyZywgY2hhciAqaW5kZXhfYXJnLCBjaGFyICp2YWx1ZV9hcmcpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kYl9kaXNwbGF5X29iamVjdHMgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9ial90eXBlX2FyZywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkaXNwbGF5X2NvdW50X2FyZyk7CithY3BpX2RiX2Rpc3BsYXlfb2JqZWN0cyhjaGFyICpvYmpfdHlwZV9hcmcsIGNoYXIgKmRpc3BsYXlfY291bnRfYXJnKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZGJfZmluZF9uYW1lX2luX25hbWVzcGFjZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9hcmcpOworYWNwaV9zdGF0dXMgYWNwaV9kYl9maW5kX25hbWVfaW5fbmFtZXNwYWNlKGNoYXIgKm5hbWVfYXJnKTsKIAotdm9pZAotYWNwaV9kYl9zZXRfc2NvcGUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwordm9pZCBhY3BpX2RiX3NldF9zY29wZShjaGFyICpuYW1lKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZGJfc2xlZXAgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdF9hcmcpOworYWNwaV9zdGF0dXMgYWNwaV9kYl9zbGVlcChjaGFyICpvYmplY3RfYXJnKTsKIAotdm9pZAotYWNwaV9kYl9maW5kX3JlZmVyZW5jZXMgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdF9hcmcpOwordm9pZCBhY3BpX2RiX2ZpbmRfcmVmZXJlbmNlcyhjaGFyICpvYmplY3RfYXJnKTsKIAotdm9pZAotYWNwaV9kYl9kaXNwbGF5X2xvY2tzICgKLQl2b2lkKTsKK3ZvaWQgYWNwaV9kYl9kaXNwbGF5X2xvY2tzKHZvaWQpOwogCi12b2lkCi1hY3BpX2RiX2Rpc3BsYXlfcmVzb3VyY2VzICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3RfYXJnKTsKK3ZvaWQgYWNwaV9kYl9kaXNwbGF5X3Jlc291cmNlcyhjaGFyICpvYmplY3RfYXJnKTsKIAotdm9pZAotYWNwaV9kYl9kaXNwbGF5X2dwZXMgKAotCXZvaWQpOwordm9pZCBhY3BpX2RiX2Rpc3BsYXlfZ3Blcyh2b2lkKTsKIAotdm9pZAotYWNwaV9kYl9jaGVja19pbnRlZ3JpdHkgKAotCXZvaWQpOwordm9pZCBhY3BpX2RiX2NoZWNrX2ludGVncml0eSh2b2lkKTsKIAotdm9pZAotYWNwaV9kYl9nZW5lcmF0ZV9ncGUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmdwZV9hcmcsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYmxvY2tfYXJnKTsKLQordm9pZCBhY3BpX2RiX2dlbmVyYXRlX2dwZShjaGFyICpncGVfYXJnLCBjaGFyICpibG9ja19hcmcpOwogCiAvKgogICogZGJkaXNwbHkgLSBkZWJ1ZyBkaXNwbGF5IGNvbW1hbmRzCiAgKi8KLXZvaWQKLWFjcGlfZGJfZGlzcGxheV9tZXRob2RfaW5mbyAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordm9pZCBhY3BpX2RiX2Rpc3BsYXlfbWV0aG9kX2luZm8odW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKKwordm9pZCBhY3BpX2RiX2RlY29kZV9hbmRfZGlzcGxheV9vYmplY3QoY2hhciAqdGFyZ2V0LCBjaGFyICpvdXRwdXRfdHlwZSk7CiAKIHZvaWQKLWFjcGlfZGJfZGVjb2RlX2FuZF9kaXNwbGF5X29iamVjdCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGFyZ2V0LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dF90eXBlKTsKK2FjcGlfZGJfZGlzcGxheV9yZXN1bHRfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZGJfZGlzcGxheV9hbGxfbWV0aG9kcyhjaGFyICpkaXNwbGF5X2NvdW50X2FyZyk7CisKK3ZvaWQgYWNwaV9kYl9kaXNwbGF5X2FyZ3VtZW50cyh2b2lkKTsKKwordm9pZCBhY3BpX2RiX2Rpc3BsYXlfbG9jYWxzKHZvaWQpOworCit2b2lkIGFjcGlfZGJfZGlzcGxheV9yZXN1bHRzKHZvaWQpOworCit2b2lkIGFjcGlfZGJfZGlzcGxheV9jYWxsaW5nX3RyZWUodm9pZCk7CisKK3ZvaWQgYWNwaV9kYl9kaXNwbGF5X29iamVjdF90eXBlKGNoYXIgKm9iamVjdF9hcmcpOwogCiB2b2lkCi1hY3BpX2RiX2Rpc3BsYXlfcmVzdWx0X29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RiX2Rpc3BsYXlfYWxsX21ldGhvZHMgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRpc3BsYXlfY291bnRfYXJnKTsKLQotdm9pZAotYWNwaV9kYl9kaXNwbGF5X2FyZ3VtZW50cyAoCi0Jdm9pZCk7Ci0KLXZvaWQKLWFjcGlfZGJfZGlzcGxheV9sb2NhbHMgKAotCXZvaWQpOwotCi12b2lkCi1hY3BpX2RiX2Rpc3BsYXlfcmVzdWx0cyAoCi0Jdm9pZCk7Ci0KLXZvaWQKLWFjcGlfZGJfZGlzcGxheV9jYWxsaW5nX3RyZWUgKAotCXZvaWQpOwotCi12b2lkCi1hY3BpX2RiX2Rpc3BsYXlfb2JqZWN0X3R5cGUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdF9hcmcpOwotCi12b2lkCi1hY3BpX2RiX2Rpc3BsYXlfYXJndW1lbnRfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9kYl9kaXNwbGF5X2FyZ3VtZW50X29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGRiZXhlYyAtIGRlYnVnZ2VyIGNvbnRyb2wgbWV0aG9kIGV4ZWN1dGlvbgogICovCi12b2lkCi1hY3BpX2RiX2V4ZWN1dGUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmFyZ3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Cit2b2lkIGFjcGlfZGJfZXhlY3V0ZShjaGFyICpuYW1lLCBjaGFyICoqYXJncywgdTMyIGZsYWdzKTsKIAogdm9pZAotYWNwaV9kYl9jcmVhdGVfZXhlY3V0aW9uX3RocmVhZHMgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm51bV90aHJlYWRzX2FyZywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpudW1fbG9vcHNfYXJnLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1ldGhvZF9uYW1lX2FyZyk7Ci0KK2FjcGlfZGJfY3JlYXRlX2V4ZWN1dGlvbl90aHJlYWRzKGNoYXIgKm51bV90aHJlYWRzX2FyZywKKwkJCQkgY2hhciAqbnVtX2xvb3BzX2FyZywgY2hhciAqbWV0aG9kX25hbWVfYXJnKTsKIAogLyoKICAqIGRiZmlsZWlvIC0gRGVidWdnZXIgZmlsZSBJL08gY29tbWFuZHMKICAqLwogYWNwaV9vYmplY3RfdHlwZQotYWNwaV9kYl9tYXRjaF9hcmd1bWVudCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9hcmd1bWVudCwKLQlzdHJ1Y3QgYXJndW1lbnRfaW5mbyAgICAgICAgICAgICphcmd1bWVudHMpOworYWNwaV9kYl9tYXRjaF9hcmd1bWVudChjaGFyICp1c2VyX2FyZ3VtZW50LCBzdHJ1Y3QgYXJndW1lbnRfaW5mbyAqYXJndW1lbnRzKTsKIAotdm9pZAotYWNwaV9kYl9jbG9zZV9kZWJ1Z19maWxlICgKLQl2b2lkKTsKK3ZvaWQgYWNwaV9kYl9jbG9zZV9kZWJ1Z19maWxlKHZvaWQpOwogCi12b2lkCi1hY3BpX2RiX29wZW5fZGVidWdfZmlsZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSk7Cit2b2lkIGFjcGlfZGJfb3Blbl9kZWJ1Z19maWxlKGNoYXIgKm5hbWUpOworCithY3BpX3N0YXR1cyBhY3BpX2RiX2xvYWRfYWNwaV90YWJsZShjaGFyICpmaWxlbmFtZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RiX2xvYWRfYWNwaV90YWJsZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmlsZW5hbWUpOworYWNwaV9kYl9nZXRfdGFibGVfZnJvbV9maWxlKGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKip0YWJsZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RiX2dldF90YWJsZV9mcm9tX2ZpbGUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZpbGVuYW1lLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKip0YWJsZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RiX3JlYWRfdGFibGVfZnJvbV9maWxlICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmaWxlbmFtZSwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICoqdGFibGUpOwotCithY3BpX2RiX3JlYWRfdGFibGVfZnJvbV9maWxlKGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKip0YWJsZSk7CiAKIC8qCiAgKiBkYmhpc3RyeSAtIGRlYnVnZ2VyIEhJU1RPUlkgY29tbWFuZAogICovCi12b2lkCi1hY3BpX2RiX2FkZF90b19oaXN0b3J5ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb21tYW5kX2xpbmUpOwordm9pZCBhY3BpX2RiX2FkZF90b19oaXN0b3J5KGNoYXIgKmNvbW1hbmRfbGluZSk7CiAKLXZvaWQKLWFjcGlfZGJfZGlzcGxheV9oaXN0b3J5ICgKLQl2b2lkKTsKK3ZvaWQgYWNwaV9kYl9kaXNwbGF5X2hpc3Rvcnkodm9pZCk7CiAKLWNoYXIgKgotYWNwaV9kYl9nZXRfZnJvbV9oaXN0b3J5ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb21tYW5kX251bV9hcmcpOwotCitjaGFyICphY3BpX2RiX2dldF9mcm9tX2hpc3RvcnkoY2hhciAqY29tbWFuZF9udW1fYXJnKTsKIAogLyoKICAqIGRiaW5wdXQgLSB1c2VyIGZyb250LWVuZCB0byB0aGUgQU1MIGRlYnVnZ2VyCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2RiX2NvbW1hbmRfZGlzcGF0Y2ggKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmlucHV0X2J1ZmZlciwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK2FjcGlfZGJfY29tbWFuZF9kaXNwYXRjaChjaGFyICppbnB1dF9idWZmZXIsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi12b2lkIEFDUElfU1lTVEVNX1hGQUNFCi1hY3BpX2RiX2V4ZWN1dGVfdGhyZWFkICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQordm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2RiX2V4ZWN1dGVfdGhyZWFkKHZvaWQgKmNvbnRleHQpOwogCiAvKgogICogZGJzdGF0cyAtIEdlbmVyYXRpb24gYW5kIGRpc3BsYXkgb2YgQUNQSSB0YWJsZSBzdGF0aXN0aWNzCiAgKi8KLXZvaWQKLWFjcGlfZGJfZ2VuZXJhdGVfc3RhdGlzdGljcyAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcm9vdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX21ldGhvZCk7Cit2b2lkIGFjcGlfZGJfZ2VuZXJhdGVfc3RhdGlzdGljcyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcm9vdCwgdTggaXNfbWV0aG9kKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZGJfZGlzcGxheV9zdGF0aXN0aWNzICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0eXBlX2FyZyk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfZGJfZGlzcGxheV9zdGF0aXN0aWNzKGNoYXIgKnR5cGVfYXJnKTsKIAogLyoKICAqIGRidXRpbHMgLSBBTUwgZGVidWdnZXIgdXRpbGl0aWVzCiAgKi8KLXZvaWQKLWFjcGlfZGJfc2V0X291dHB1dF9kZXN0aW5hdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7Cit2b2lkIGFjcGlfZGJfc2V0X291dHB1dF9kZXN0aW5hdGlvbih1MzIgd2hlcmUpOwogCi12b2lkCi1hY3BpX2RiX2R1bXBfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29iamVjdCAgICAgICAgICAgICAgICpvYmpfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK3ZvaWQgYWNwaV9kYl9kdW1wX2V4dGVybmFsX29iamVjdCh1bmlvbiBhY3BpX29iamVjdCAqb2JqX2Rlc2MsIHUzMiBsZXZlbCk7CiAKLXZvaWQKLWFjcGlfZGJfcHJlcF9uYW1lc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lKTsKK3ZvaWQgYWNwaV9kYl9wcmVwX25hbWVzdHJpbmcoY2hhciAqbmFtZSk7CiAKLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfZGJfbG9jYWxfbnNfbG9va3VwICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lKTsKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX2RiX2xvY2FsX25zX2xvb2t1cChjaGFyICpuYW1lKTsKIAotI2VuZGlmICAvKiBfX0FDREVCVUdfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZGlzYXNtLmggYi9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaAppbmRleCBkYmZhODc3Li4zZDk2ZGNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaAorKysgYi9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaApAQCAtNDYsMzI3ICs0NiwyMTkgQEAKIAogI2luY2x1ZGUgImFtbHJlc3JjLmgiCiAKLQogI2RlZmluZSBCTE9DS19OT05FICAgICAgICAgICAgICAwCiAjZGVmaW5lIEJMT0NLX1BBUkVOICAgICAgICAgICAgIDEKICNkZWZpbmUgQkxPQ0tfQlJBQ0UgICAgICAgICAgICAgMgogI2RlZmluZSBCTE9DS19DT01NQV9MSVNUICAgICAgICA0CiAKLXN0cnVjdCBhY3BpX2V4dGVybmFsX2xpc3QKLXsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aDsKLQlzdHJ1Y3QgYWNwaV9leHRlcm5hbF9saXN0ICAgICAgICAgICAqbmV4dDsKK3N0cnVjdCBhY3BpX2V4dGVybmFsX2xpc3QgeworCWNoYXIgKnBhdGg7CisJc3RydWN0IGFjcGlfZXh0ZXJuYWxfbGlzdCAqbmV4dDsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgYWNwaV9leHRlcm5hbF9saXN0ICAgICAgICAqYWNwaV9nYmxfZXh0ZXJuYWxfbGlzdDsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfaW9fZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF93b3JkX2RlY29kZVs0XTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfY29uc3VtZV9kZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX21pbl9kZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX21heF9kZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX0RFQ2RlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfUk5HZGVjb2RlWzRdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9NRU1kZWNvZGVbNF07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX1JXZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9pcnFfZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9IRWRlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfTExkZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX1NIUmRlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfVFlQZGVjb2RlWzRdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9CTWRlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfU0laZGVjb2RlWzRdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9UVFBkZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX01UUGRlY29kZVs0XTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfVFJTZGVjb2RlWzJdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2V4dGVybmFsX2xpc3QgKmFjcGlfZ2JsX2V4dGVybmFsX2xpc3Q7CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfaW9fZGVjb2RlWzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3dvcmRfZGVjb2RlWzRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2NvbnN1bWVfZGVjb2RlWzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX21pbl9kZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbWF4X2RlY29kZVsyXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9ERUNkZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfUk5HZGVjb2RlWzRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX01FTWRlY29kZVs0XTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9SV2RlY29kZVsyXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9pcnFfZGVjb2RlWzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX0hFZGVjb2RlWzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX0xMZGVjb2RlWzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX1NIUmRlY29kZVsyXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9UWVBkZWNvZGVbNF07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfQk1kZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfU0laZGVjb2RlWzRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX1RUUGRlY29kZVsyXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9NVFBkZWNvZGVbNF07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfVFJTZGVjb2RlWzJdOwogCitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbG9ja19ydWxlW0FDUElfTlVNX0xPQ0tfUlVMRVNdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2FjY2Vzc190eXBlc1tBQ1BJX05VTV9BQ0NFU1NfVFlQRVNdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3VwZGF0ZV9ydWxlc1tBQ1BJX05VTV9VUERBVEVfUlVMRVNdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX21hdGNoX29wc1tBQ1BJX05VTV9NQVRDSF9PUFNdOwogCi1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX2xvY2tfcnVsZVtBQ1BJX05VTV9MT0NLX1JVTEVTXTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfYWNjZXNzX3R5cGVzW0FDUElfTlVNX0FDQ0VTU19UWVBFU107Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX3VwZGF0ZV9ydWxlc1tBQ1BJX05VTV9VUERBVEVfUlVMRVNdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9tYXRjaF9vcHNbQUNQSV9OVU1fTUFUQ0hfT1BTXTsKLQotCi1zdHJ1Y3QgYWNwaV9vcF93YWxrX2luZm8KLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X29mZnNldDsKK3N0cnVjdCBhY3BpX29wX3dhbGtfaW5mbyB7CisJdTMyIGxldmVsOworCXUzMiBiaXRfb2Zmc2V0OworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CiB9OwogCiB0eXBlZGVmCi1hY3BpX3N0YXR1cyAoKmFzbF93YWxrX2NhbGxiYWNrKSAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQorYWNwaV9zdGF0dXMoKmFzbF93YWxrX2NhbGxiYWNrKSAodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiBvcCwKKwkJCQkgdTMyIGxldmVsLCB2b2lkICpjb250ZXh0KTsKIAogLyoKICAqIGRtd2FsawogICovCiB2b2lkCi1hY3BpX2RtX2Rpc2Fzc2VtYmxlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9yaWdpbiwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9vcGNvZGVzKTsKLQorYWNwaV9kbV9kaXNhc3NlbWJsZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9yaWdpbiwgdTMyIG51bV9vcGNvZGVzKTsKIAogLyoKICAqIGRtb3Bjb2RlCiAgKi8KIHZvaWQKLWFjcGlfZG1fZGlzYXNzZW1ibGVfb25lX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX29wX3dhbGtfaW5mbyAgICAgICAgKmluZm8sCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOworYWNwaV9kbV9kaXNhc3NlbWJsZV9vbmVfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgIHN0cnVjdCBhY3BpX29wX3dhbGtfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQKLWFjcGlfZG1fZGVjb2RlX2ludGVybmFsX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwordm9pZCBhY3BpX2RtX2RlY29kZV9pbnRlcm5hbF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwogCi11MzIKLWFjcGlfZG1fbGlzdF90eXBlICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Cit1MzIgYWNwaV9kbV9saXN0X3R5cGUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAotdm9pZAotYWNwaV9kbV9tZXRob2RfZmxhZ3MgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK3ZvaWQgYWNwaV9kbV9tZXRob2RfZmxhZ3ModW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAotdm9pZAotYWNwaV9kbV9maWVsZF9mbGFncyAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordm9pZCBhY3BpX2RtX2ZpZWxkX2ZsYWdzKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQKLWFjcGlfZG1fYWRkcmVzc19zcGFjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV9pZCk7Cit2b2lkIGFjcGlfZG1fYWRkcmVzc19zcGFjZSh1OCBzcGFjZV9pZCk7CiAKLXZvaWQKLWFjcGlfZG1fcmVnaW9uX2ZsYWdzICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Cit2b2lkIGFjcGlfZG1fcmVnaW9uX2ZsYWdzKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQKLWFjcGlfZG1fbWF0Y2hfb3AgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK3ZvaWQgYWNwaV9kbV9tYXRjaF9vcCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi11OAotYWNwaV9kbV9jb21tYV9pZl9saXN0X21lbWJlciAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordTggYWNwaV9kbV9jb21tYV9pZl9saXN0X21lbWJlcih1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi12b2lkCi1hY3BpX2RtX2NvbW1hX2lmX2ZpZWxkX21lbWJlciAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCit2b2lkIGFjcGlfZG1fY29tbWFfaWZfZmllbGRfbWVtYmVyKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKIC8qCiAgKiBkbW5hbWVzCiAgKi8KLXUzMgotYWNwaV9kbV9kdW1wX25hbWUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwordTMyIGFjcGlfZG1fZHVtcF9uYW1lKGNoYXIgKm5hbWUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9wc19kaXNwbGF5X29iamVjdF9wYXRobmFtZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CithY3BpX3BzX2Rpc3BsYXlfb2JqZWN0X3BhdGhuYW1lKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAotdm9pZAotYWNwaV9kbV9uYW1lc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lKTsKLQordm9pZCBhY3BpX2RtX25hbWVzdHJpbmcoY2hhciAqbmFtZSk7CiAKIC8qCiAgKiBkbW9iamVjdAogICovCiB2b2lkCi1hY3BpX2RtX2Rpc3BsYXlfaW50ZXJuYWxfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZG1fZGlzcGxheV9pbnRlcm5hbF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisKK3ZvaWQgYWNwaV9kbV9kaXNwbGF5X2FyZ3VtZW50cyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKKwordm9pZCBhY3BpX2RtX2Rpc3BsYXlfbG9jYWxzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiB2b2lkCi1hY3BpX2RtX2Rpc3BsYXlfYXJndW1lbnRzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotdm9pZAotYWNwaV9kbV9kaXNwbGF5X2xvY2FscyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLXZvaWQKLWFjcGlfZG1fZHVtcF9tZXRob2RfaW5mbyAoCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KK2FjcGlfZG1fZHVtcF9tZXRob2RfaW5mbyhhY3BpX3N0YXR1cyBzdGF0dXMsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiAvKgogICogZG1idWZmZXIKICAqLwotdm9pZAotYWNwaV9kbV9kaXNhc21fYnl0ZV9saXN0ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfZGF0YSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfY291bnQpOwordm9pZCBhY3BpX2RtX2Rpc2FzbV9ieXRlX2xpc3QodTMyIGxldmVsLCB1OCAqIGJ5dGVfZGF0YSwgdTMyIGJ5dGVfY291bnQpOwogCiB2b2lkCi1hY3BpX2RtX2J5dGVfbGlzdCAoCi0Jc3RydWN0IGFjcGlfb3Bfd2Fsa19pbmZvICAgICAgICAqaW5mbywKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CithY3BpX2RtX2J5dGVfbGlzdChzdHJ1Y3QgYWNwaV9vcF93YWxrX2luZm8gKmluZm8sIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQKLWFjcGlfaXNfZWlzYV9pZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordm9pZCBhY3BpX2RtX2lzX2Vpc2FfaWQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAotdm9pZAotYWNwaV9kbV9laXNhX2lkICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfaWQpOwordm9pZCBhY3BpX2RtX2Vpc2FfaWQodTMyIGVuY29kZWRfaWQpOwogCi11OAotYWNwaV9kbV9pc191bmljb2RlX2J1ZmZlciAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordTggYWNwaV9kbV9pc191bmljb2RlX2J1ZmZlcih1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi11OAotYWNwaV9kbV9pc19zdHJpbmdfYnVmZmVyICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KK3U4IGFjcGlfZG1faXNfc3RyaW5nX2J1ZmZlcih1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiAvKgogICogZG1yZXNyYwogICovCiB2b2lkCi1hY3BpX2RtX3Jlc291cmNlX2Rlc2NyaXB0b3IgKAotCXN0cnVjdCBhY3BpX29wX3dhbGtfaW5mbyAgICAgICAgKmluZm8sCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9kYXRhLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9jb3VudCk7CithY3BpX2RtX3Jlc291cmNlX2Rlc2NyaXB0b3Ioc3RydWN0IGFjcGlfb3Bfd2Fsa19pbmZvICppbmZvLAorCQkJICAgIHU4ICogYnl0ZV9kYXRhLCB1MzIgYnl0ZV9jb3VudCk7CiAKLXU4Ci1hY3BpX2RtX2lzX3Jlc291cmNlX2Rlc2NyaXB0b3IgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK3U4IGFjcGlfZG1faXNfcmVzb3VyY2VfZGVzY3JpcHRvcih1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi12b2lkCi1hY3BpX2RtX2luZGVudCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7Cit2b2lkIGFjcGlfZG1faW5kZW50KHUzMiBsZXZlbCk7CiAKLXZvaWQKLWFjcGlfZG1fYml0X2xpc3QgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzayk7Cit2b2lkIGFjcGlfZG1fYml0X2xpc3QodTE2IG1hc2spOwogCi12b2lkCi1hY3BpX2RtX2RlY29kZV9hdHRyaWJ1dGUgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKTsKLQordm9pZCBhY3BpX2RtX2RlY29kZV9hdHRyaWJ1dGUodTggYXR0cmlidXRlKTsKIAogLyoKICAqIGRtcmVzcmNsCiAgKi8KIHZvaWQKLWFjcGlfZG1fd29yZF9kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX3dvcmRfYWRkcmVzc19kZXNjICAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fd29yZF9kZXNjcmlwdG9yKHN0cnVjdCBhc2xfd29yZF9hZGRyZXNzX2Rlc2MgKnJlc291cmNlLAorCQkJdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9kd29yZF9kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX2R3b3JkX2FkZHJlc3NfZGVzYyAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fZHdvcmRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX2R3b3JkX2FkZHJlc3NfZGVzYyAqcmVzb3VyY2UsCisJCQkgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9leHRlbmRlZF9kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX2V4dGVuZGVkX2FkZHJlc3NfZGVzYyAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fZXh0ZW5kZWRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX2V4dGVuZGVkX2FkZHJlc3NfZGVzYyAqcmVzb3VyY2UsCisJCQkgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9xd29yZF9kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX3F3b3JkX2FkZHJlc3NfZGVzYyAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fcXdvcmRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX3F3b3JkX2FkZHJlc3NfZGVzYyAqcmVzb3VyY2UsCisJCQkgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9tZW1vcnkyNF9kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX21lbW9yeV8yNF9kZXNjICAgICAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fbWVtb3J5MjRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX21lbW9yeV8yNF9kZXNjICpyZXNvdXJjZSwKKwkJCSAgICB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwogCiB2b2lkCi1hY3BpX2RtX21lbW9yeTMyX2Rlc2NyaXB0b3IgKAotCXN0cnVjdCBhc2xfbWVtb3J5XzMyX2Rlc2MgICAgICAgKnJlc291cmNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOworYWNwaV9kbV9tZW1vcnkzMl9kZXNjcmlwdG9yKHN0cnVjdCBhc2xfbWVtb3J5XzMyX2Rlc2MgKnJlc291cmNlLAorCQkJICAgIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7CiAKIHZvaWQKLWFjcGlfZG1fZml4ZWRfbWVtMzJfZGVzY3JpcHRvciAoCi0Jc3RydWN0IGFzbF9maXhlZF9tZW1vcnlfMzJfZGVzYyAqcmVzb3VyY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7CithY3BpX2RtX2ZpeGVkX21lbTMyX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9maXhlZF9tZW1vcnlfMzJfZGVzYyAqcmVzb3VyY2UsCisJCQkgICAgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9nZW5lcmljX3JlZ2lzdGVyX2Rlc2NyaXB0b3IgKAotCXN0cnVjdCBhc2xfZ2VuZXJhbF9yZWdpc3Rlcl9kZXNjICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fZ2VuZXJpY19yZWdpc3Rlcl9kZXNjcmlwdG9yKHN0cnVjdCBhc2xfZ2VuZXJhbF9yZWdpc3Rlcl9kZXNjICpyZXNvdXJjZSwKKwkJCQkgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9pbnRlcnJ1cHRfZGVzY3JpcHRvciAoCi0Jc3RydWN0IGFzbF9leHRlbmRlZF94cnVwdF9kZXNjICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1faW50ZXJydXB0X2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9leHRlbmRlZF94cnVwdF9kZXNjICpyZXNvdXJjZSwKKwkJCSAgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV92ZW5kb3JfbGFyZ2VfZGVzY3JpcHRvciAoCi0Jc3RydWN0IGFzbF9sYXJnZV92ZW5kb3JfZGVzYyAgICAqcmVzb3VyY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7Ci0KK2FjcGlfZG1fdmVuZG9yX2xhcmdlX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9sYXJnZV92ZW5kb3JfZGVzYyAqcmVzb3VyY2UsCisJCQkJdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogLyoKICAqIGRtcmVzcmNzCiAgKi8KIHZvaWQKLWFjcGlfZG1faXJxX2Rlc2NyaXB0b3IgKAotCXN0cnVjdCBhc2xfaXJxX2Zvcm1hdF9kZXNjICAgICAgKnJlc291cmNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOworYWNwaV9kbV9pcnFfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX2lycV9mb3JtYXRfZGVzYyAqcmVzb3VyY2UsCisJCSAgICAgICB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwogCiB2b2lkCi1hY3BpX2RtX2RtYV9kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX2RtYV9mb3JtYXRfZGVzYyAgICAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fZG1hX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9kbWFfZm9ybWF0X2Rlc2MgKnJlc291cmNlLAorCQkgICAgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9pb19kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX2lvX3BvcnRfZGVzYyAgICAgICAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1faW9fZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX2lvX3BvcnRfZGVzYyAqcmVzb3VyY2UsIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7CiAKIHZvaWQKLWFjcGlfZG1fZml4ZWRfaW9fZGVzY3JpcHRvciAoCi0Jc3RydWN0IGFzbF9maXhlZF9pb19wb3J0X2Rlc2MgICAqcmVzb3VyY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7CithY3BpX2RtX2ZpeGVkX2lvX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9maXhlZF9pb19wb3J0X2Rlc2MgKnJlc291cmNlLAorCQkJICAgIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7CiAKIHZvaWQKLWFjcGlfZG1fc3RhcnRfZGVwZW5kZW50X2Rlc2NyaXB0b3IgKAotCXN0cnVjdCBhc2xfc3RhcnRfZGVwZW5kZW50X2Rlc2MgKnJlc291cmNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOworYWNwaV9kbV9zdGFydF9kZXBlbmRlbnRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX3N0YXJ0X2RlcGVuZGVudF9kZXNjICpyZXNvdXJjZSwKKwkJCQkgICB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwogCiB2b2lkCi1hY3BpX2RtX2VuZF9kZXBlbmRlbnRfZGVzY3JpcHRvciAoCi0Jc3RydWN0IGFzbF9zdGFydF9kZXBlbmRlbnRfZGVzYyAqcmVzb3VyY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7CithY3BpX2RtX2VuZF9kZXBlbmRlbnRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX3N0YXJ0X2RlcGVuZGVudF9kZXNjICpyZXNvdXJjZSwKKwkJCQkgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV92ZW5kb3Jfc21hbGxfZGVzY3JpcHRvciAoCi0Jc3RydWN0IGFzbF9zbWFsbF92ZW5kb3JfZGVzYyAgICAqcmVzb3VyY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7Ci0KK2FjcGlfZG1fdmVuZG9yX3NtYWxsX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9zbWFsbF92ZW5kb3JfZGVzYyAqcmVzb3VyY2UsCisJCQkJdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogLyoKICAqIGRtdXRpbHMKICAqLwotdm9pZAotYWNwaV9kbV9hZGRfdG9fZXh0ZXJuYWxfbGlzdCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCk7Cit2b2lkIGFjcGlfZG1fYWRkX3RvX2V4dGVybmFsX2xpc3QoY2hhciAqcGF0aCk7CiAKLSNlbmRpZiAgLyogX19BQ0RJU0FTTV9IX18gKi8KKyNlbmRpZgkJCQkvKiBfX0FDRElTQVNNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZGlzcGF0LmggYi9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaAppbmRleCA4ZjVmMmY3Li4wNjVmMjRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaApAQCAtNDEsNDE5ICs0MSwzMDQgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpZm5kZWYgX0FDRElTUEFUX0hfCiAjZGVmaW5lIF9BQ0RJU1BBVF9IXwogCi0KICNkZWZpbmUgTkFNRU9GX0xPQ0FMX05URSAgICAiX19MMCIKICNkZWZpbmUgTkFNRU9GX0FSR19OVEUgICAgICAiX19BMCIKIAotCiAvKgogICogZHNvcGNvZGUgLSBzdXBwb3J0IGZvciBsYXRlIGV2YWx1YXRpb24KICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKK2FjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOworCithY3BpX3N0YXR1cyBhY3BpX2RzX2dldF9yZWdpb25fYXJndW1lbnRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJnbl9kZXNjKTsKKworYWNwaV9zdGF0dXMgYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHMgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJnbl9kZXNjKTsKK2FjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCQkgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOworYWNwaV9kc19ldmFsX3JlZ2lvbl9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKK2FjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19ldmFsX2J1ZmZlcl9maWVsZF9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2V2YWxfcmVnaW9uX29wZXJhbmRzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRpYWxpemVfcmVnaW9uICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUpOwotCithY3BpX3N0YXR1cyBhY3BpX2RzX2luaXRpYWxpemVfcmVnaW9uKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUpOwogCiAvKgogICogZHNjdHJsIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSwgY29udHJvbCBzdGFjayByb3V0aW5lcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOworYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2V4ZWNfZW5kX2NvbnRyb2xfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCithY3BpX2RzX2V4ZWNfZW5kX2NvbnRyb2xfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiAvKgogICogZHNleGVjIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSwgbWV0aG9kIGV4ZWN1dGlvbiBjYWxsYmFja3MKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXN1bHRfb2JqKTsKK2FjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlc3VsdF9vYmopOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19leGVjX2JlZ2luX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKipvdXRfb3ApOworYWNwaV9kc19leGVjX2JlZ2luX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqb3V0X29wKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZXhlY19lbmRfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKnN0YXRlKTsKLQorYWNwaV9zdGF0dXMgYWNwaV9kc19leGVjX2VuZF9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICpzdGF0ZSk7CiAKIC8qCiAgKiBkc2ZpZWxkIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSBmb3IgQU1MIGZpZWxkcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9kc19jcmVhdGVfZmllbGQgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnJlZ2lvbl9ub2RlLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9kc19jcmVhdGVfZmllbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpb25fbm9kZSwKKwkJICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfY3JlYXRlX2JhbmtfZmllbGQgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnJlZ2lvbl9ub2RlLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9kc19jcmVhdGVfYmFua19maWVsZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpb25fbm9kZSwKKwkJCSAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9pbmRleF9maWVsZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcmVnaW9uX25vZGUsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX2NyZWF0ZV9pbmRleF9maWVsZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcmVnaW9uX25vZGUsCisJCQkgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfY3JlYXRlX2J1ZmZlcl9maWVsZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX2NyZWF0ZV9idWZmZXJfZmllbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X2ZpZWxkX29iamVjdHMgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCithY3BpX2RzX2luaXRfZmllbGRfb2JqZWN0cyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGRzbG9hZCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UsIG5hbWVzcGFjZSBsb2FkIGNhbGxiYWNrcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9kc19sb2FkMV9iZWdpbl9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICoqb3V0X29wKTsKK2FjcGlfZHNfbG9hZDFfYmVnaW5fb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqb3V0X29wKTsKKworYWNwaV9zdGF0dXMgYWNwaV9kc19sb2FkMV9lbmRfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2xvYWQxX2VuZF9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX2xvYWQyX2JlZ2luX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKm91dF9vcCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZHNfbG9hZDJfZW5kX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19sb2FkMl9iZWdpbl9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICoqb3V0X29wKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfbG9hZDJfZW5kX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9jYWxsYmFja3MgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzX251bWJlcik7Ci0KK2FjcGlfZHNfaW5pdF9jYWxsYmFja3Moc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwgdTMyIHBhc3NfbnVtYmVyKTsKIAogLyoKICAqIGRzbXRoZGF0IC0gbWV0aG9kIGRhdGEgKGxvY2Fscy9hcmdzKQogICovCiBhY3BpX3N0YXR1cwotYWNwaV9kc19zdG9yZV9vYmplY3RfdG9fbG9jYWwgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc3JjX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX3N0b3JlX29iamVjdF90b19sb2NhbCh1MTYgb3Bjb2RlLAorCQkJICAgICAgdTMyIGluZGV4LAorCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc3JjX2Rlc2MsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X2VudHJ5ICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKipub2RlKTsKK2FjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X2VudHJ5KHUxNiBvcGNvZGUsCisJCQkgICAgICB1MzIgaW5kZXgsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKipub2RlKTsKIAotdm9pZAotYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfYWxsICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK3ZvaWQgYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfYWxsKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi11OAotYWNwaV9kc19pc19tZXRob2RfdmFsdWUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKK3U4IGFjcGlfZHNfaXNfbWV0aG9kX3ZhbHVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRlc3RfZGVzYyk7CithY3BpX2RzX21ldGhvZF9kYXRhX2dldF92YWx1ZSh1MTYgb3Bjb2RlLAorCQkJICAgICAgdTMyIGluZGV4LAorCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZXN0X2Rlc2MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3MgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipwYXJhbXMsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcGFyYW1fY291bnQsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX21ldGhvZF9kYXRhX2luaXRfYXJncyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcGFyYW1zLAorCQkJICAgICAgdTMyIG1heF9wYXJhbV9jb3VudCwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKipub2RlKTsKK2FjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUodTE2IG9wY29kZSwKKwkJCSAgICAgdTMyIGluZGV4LAorCQkJICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKm5vZGUpOwogCi12b2lkCi1hY3BpX2RzX21ldGhvZF9kYXRhX2luaXQgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCit2b2lkIGFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGRzbWV0aG9kIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSAtIGNvbnRyb2wgbWV0aG9kIHBhcnNpbmcKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfZHNfcGFyc2VfbWV0aG9kICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUpOworYWNwaV9zdGF0dXMgYWNwaV9kc19wYXJzZV9tZXRob2Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19jYWxsX2NvbnRyb2xfbWV0aG9kICgKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CithY3BpX2RzX2NhbGxfY29udHJvbF9tZXRob2Qoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQsCisJCQkgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19yZXN0YXJ0X2NvbnRyb2xfbWV0aG9kICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjKTsKK2FjcGlfZHNfcmVzdGFydF9jb250cm9sX21ldGhvZChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjKTsKKwordm9pZCBhY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfdGVybWluYXRlX2NvbnRyb2xfbWV0aG9kICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbiAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbWV0aG9kX25vZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqY2FsbGluZ19tZXRob2Rfbm9kZSk7Ci0KK2FjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGUsCisJCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNhbGxpbmdfbWV0aG9kX25vZGUpOwogCiAvKgogICogZHNpbml0CiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRpYWxpemVfb2JqZWN0cyAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYywKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpzdGFydF9ub2RlKTsKLQorYWNwaV9kc19pbml0aWFsaXplX29iamVjdHMoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYywKKwkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzdGFydF9ub2RlKTsKIAogLyoKICAqIGRzb2JqZWN0IC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSAtIG9iamVjdCBpbml0aWFsaXphdGlvbiBhbmQgY29udmVyc2lvbgogICovCiBhY3BpX3N0YXR1cwotYWNwaV9kc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2xlbmd0aCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqX2Rlc2NfcHRyKTsKK2FjcGlfZHNfYnVpbGRfaW50ZXJuYWxfYnVmZmVyX29iaihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJCSAgdTMyIGJ1ZmZlcl9sZW5ndGgsCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2Rlc2NfcHRyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmogKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2xlbmd0aCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqX2Rlc2MpOworYWNwaV9kc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iaihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCQkgICB1MzIgcGFja2FnZV9sZW5ndGgsCisJCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9ial9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqX2Rlc2MpOworYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJICAgIHUxNiBvcGNvZGUsIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmpfZGVzYyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9ub2RlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCithY3BpX2RzX2NyZWF0ZV9ub2RlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKIC8qCiAgKiBkc3V0aWxzIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSB1dGlsaXR5IHJvdXRpbmVzCiAgKi8KLXZvaWQKLWFjcGlfZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK3ZvaWQgYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4oc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIHU4Ci1hY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybiAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9yZWZlcmVuY2UpOworYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MsCisJCQkgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgdTggYWRkX3JlZmVyZW5jZSk7CiAKIHU4Ci1hY3BpX2RzX2lzX3Jlc3VsdF91c2VkICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfaXNfcmVzdWx0X3VzZWQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIHZvaWQKLWFjcGlfZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVzdWx0X29iaiwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXN1bHRfb2JqLAorCQkJCSAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9vcGVyYW5kICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NfcmVtYWluaW5nKTsKK2FjcGlfZHNfY3JlYXRlX29wZXJhbmQoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcsIHUzMiBhcmdzX3JlbWFpbmluZyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpmaXJzdF9hcmcpOworYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpmaXJzdF9hcmcpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19yZXNvbHZlX29wZXJhbmRzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfZHNfcmVzb2x2ZV9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAotdm9pZAotYWNwaV9kc19jbGVhcl9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KK3ZvaWQgYWNwaV9kc19jbGVhcl9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGRzd3Njb3BlIC0gU2NvcGUgU3RhY2sgbWFuaXB1bGF0aW9uCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2ggKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9kc19zY29wZV9zdGFja19wdXNoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJCSBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAorYWNwaV9zdGF0dXMgYWNwaV9kc19zY29wZV9zdGFja19wb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RzX3Njb3BlX3N0YWNrX3BvcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLXZvaWQKLWFjcGlfZHNfc2NvcGVfc3RhY2tfY2xlYXIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCit2b2lkIGFjcGlfZHNfc2NvcGVfc3RhY2tfY2xlYXIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIC8qCiAgKiBkc3dzdGF0ZSAtIHBhcnNlciBXQUxLX1NUQVRFIG1hbmFnZW1lbnQgcm91dGluZXMKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3B1c2ggKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfb2JqX3N0YWNrX3B1c2godm9pZCAqb2JqZWN0LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3BvcCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BfY291bnQsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX29ial9zdGFja19wb3AodTMyIHBvcF9jb3VudCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKgotYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZSAoCi0JYWNwaV9vd25lcl9pZCAgICAgICAgICAgICAgICAgICBvd25lcl9pZCwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcmlnaW4sCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbXRoX2Rlc2MsCi0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkKTsKK3N0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKmFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUoYWNwaV9vd25lcl9pZCBvd25lcl9pZCwKKwkJCQkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QKKwkJCQkJCSAgKm9yaWdpbiwKKwkJCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorCQkJCQkJICAqbXRoX2Rlc2MsCisJCQkJCQkgIHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZQorCQkJCQkJICAqdGhyZWFkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9hbWxfd2FsayAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICptZXRob2Rfbm9kZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoLAotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8sCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzX251bWJlcik7CithY3BpX2RzX2luaXRfYW1sX3dhbGsoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkgICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGUsCisJCSAgICAgIHU4ICogYW1sX3N0YXJ0LAorCQkgICAgICB1MzIgYW1sX2xlbmd0aCwKKwkJICAgICAgc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8sIHU4IHBhc3NfbnVtYmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcF9jb3VudCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlKHUzMiBwb3BfY291bnQsCisJCQkJIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOworCit2b2lkIGFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisKK3N0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKmFjcGlfZHNfcG9wX3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlCisJCQkJCSAgICAgICAqdGhyZWFkKTsKIAogdm9pZAotYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX3B1c2hfd2Fsa19zdGF0ZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpOwogCi1zdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICoKLWFjcGlfZHNfcG9wX3dhbGtfc3RhdGUgKAotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgKnRocmVhZCk7CithY3BpX3N0YXR1cyBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLXZvaWQKLWFjcGlfZHNfcHVzaF93YWxrX3N0YXRlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgKnRocmVhZCk7CithY3BpX3N0YXR1cyBhY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfZHNfcmVzdWx0X3N0YWNrX2NsZWFyKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9zdGFja19jbGVhciAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKgotYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlICgKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpOworc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlKHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZQorCQkJCQkJICAgICAgICp0aHJlYWQpOwogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9yZW1vdmUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfcmVzdWx0X3JlbW92ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqZWN0LAorCQkgICAgICB1MzIgaW5kZXgsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogI2VuZGlmCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9wb3AgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX3Jlc3VsdF9wb3AodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9iamVjdCwKKwkJICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9wdXNoICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX3Jlc3VsdF9wdXNoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwKKwkJICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfcG9wX2Zyb21fYm90dG9tICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqZWN0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9kc19yZXN1bHRfcG9wX2Zyb21fYm90dG9tKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmplY3QsCisJCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLXZvaWQKLWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGVfY2FjaGUgKAotCXZvaWQpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfQUNESVNQQVRfSF8gKi8KKyNlbmRpZgkJCQkvKiBfQUNESVNQQVRfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2V2ZW50cy5oIGIvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKaW5kZXggNjFhMjdjOC4uYmZhNTQ2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKQEAgLTQ0LDI1MCArNDQsMTY3IEBACiAjaWZuZGVmIF9fQUNFVkVOVFNfSF9fCiAjZGVmaW5lIF9fQUNFVkVOVFNfSF9fCiAKLQogLyoKICAqIGV2ZXZlbnQKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdGlhbGl6ZV9ldmVudHMgKAotCXZvaWQpOworYWNwaV9zdGF0dXMgYWNwaV9ldl9pbml0aWFsaXplX2V2ZW50cyh2b2lkKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5zdGFsbF94cnVwdF9oYW5kbGVycyAoCi0Jdm9pZCk7CithY3BpX3N0YXR1cyBhY3BpX2V2X2luc3RhbGxfeHJ1cHRfaGFuZGxlcnModm9pZCk7CiAKLXUzMgotYWNwaV9ldl9maXhlZF9ldmVudF9kZXRlY3QgKAotCXZvaWQpOwotCit1MzIgYWNwaV9ldl9maXhlZF9ldmVudF9kZXRlY3Qodm9pZCk7CiAKIC8qCiAgKiBldm1pc2MKICAqLwotdTgKLWFjcGlfZXZfaXNfbm90aWZ5X29iamVjdCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7Cit1OCBhY3BpX2V2X2lzX25vdGlmeV9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOworCithY3BpX3N0YXR1cyBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2sodTE2IHRpbWVvdXQpOworCithY3BpX3N0YXR1cyBhY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2sodm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQpOworCit1MzIgYWNwaV9ldl9nZXRfZ3BlX251bWJlcl9pbmRleCh1MzIgZ3BlX251bWJlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2soCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jaygKLQl2b2lkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyICgKLQl2b2lkKTsKLQotdTMyCi1hY3BpX2V2X2dldF9ncGVfbnVtYmVyX2luZGV4ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeV92YWx1ZSk7Ci0KK2FjcGlfZXZfcXVldWVfbm90aWZ5X3JlcXVlc3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgIHUzMiBub3RpZnlfdmFsdWUpOwogCiAvKgogICogZXZncGUgLSBHUEUgaGFuZGxpbmcgYW5kIGRpc3BhdGNoCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOworYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyhzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8sCisJCQkJdTggdHlwZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2VuYWJsZV9ncGUgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfdG9faGFyZHdhcmUpOworYWNwaV9ldl9lbmFibGVfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywKKwkJICAgdTggd3JpdGVfdG9faGFyZHdhcmUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9kaXNhYmxlX2dwZSAoCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8pOworYWNwaV9zdGF0dXMgYWNwaV9ldl9kaXNhYmxlX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOwogCi1zdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqCi1hY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlcik7Ci0KK3N0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICphY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAorCQkJCQkJICAgICAgIHUzMiBncGVfbnVtYmVyKTsKIAogLyoKICAqIGV2Z3BlYmxrCiAgKi8KLXU4Ci1hY3BpX2V2X3ZhbGlkX2dwZV9ldmVudCAoCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8pOwordTggYWNwaV9ldl92YWxpZF9ncGVfZXZlbnQoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKKworYWNwaV9zdGF0dXMgYWNwaV9ldl93YWxrX2dwZV9saXN0KEFDUElfR1BFX0NBTExCQUNLIGdwZV93YWxrX2NhbGxiYWNrKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfd2Fsa19ncGVfbGlzdCAoCi0JQUNQSV9HUEVfQ0FMTEJBQ0sgICAgICAgZ3BlX3dhbGtfY2FsbGJhY2ssCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CithY3BpX2V2X2RlbGV0ZV9ncGVfaGFuZGxlcnMoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAorCQkJICAgIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9kZWxldGVfZ3BlX2hhbmRsZXJzICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOworYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpncGVfZGV2aWNlLAorCQkJIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ3BlX2Jsb2NrX2FkZHJlc3MsCisJCQkgdTMyIHJlZ2lzdGVyX2NvdW50LAorCQkJIHU4IGdwZV9ibG9ja19iYXNlX251bWJlciwKKwkJCSB1MzIgaW50ZXJydXB0X251bWJlciwKKwkJCSBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqKnJldHVybl9ncGVfYmxvY2spOwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpncGVfZGV2aWNlLAotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgKmdwZV9ibG9ja19hZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfYmxvY2tfYmFzZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWwsCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqKnJldHVybl9ncGVfYmxvY2spOwotCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOworYWNwaV9zdGF0dXMgYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOwogCiB1MzIKLWFjcGlfZXZfZ3BlX2Rpc3BhdGNoICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIpOworYWNwaV9ldl9ncGVfZGlzcGF0Y2goc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAorCQkgICAgIHUzMiBncGVfbnVtYmVyKTsKIAotdTMyCi1hY3BpX2V2X2dwZV9kZXRlY3QgKAotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9saXN0KTsKK3UzMiBhY3BpX2V2X2dwZV9kZXRlY3Qoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9saXN0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfc2V0X2dwZV90eXBlICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOworYWNwaV9ldl9zZXRfZ3BlX3R5cGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLCB1OCB0eXBlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKTsKK2FjcGlfZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfZ3BlX2luaXRpYWxpemUgKAotCXZvaWQpOwotCithY3BpX3N0YXR1cyBhY3BpX2V2X2dwZV9pbml0aWFsaXplKHZvaWQpOwogCiAvKgogICogZXZyZWdpb24gLSBBZGRyZXNzIFNwYWNlIGhhbmRsaW5nCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2luc3RhbGxfcmVnaW9uX2hhbmRsZXJzICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5zdGFsbF9yZWdpb25faGFuZGxlcnModm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zKHZvaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9pbml0aWFsaXplX29wX3JlZ2lvbnMgKAotCXZvaWQpOworYWNwaV9ldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmosCisJCQkgICAgICAgdTMyIGZ1bmN0aW9uLAorCQkJICAgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJICAgICAgIHUzMiBiaXRfd2lkdGgsIHZvaWQgKnZhbHVlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICpyZWdpb25fb2JqLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfYXR0YWNoX3JlZ2lvbiAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaGFuZGxlcl9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVnaW9uX29iaiwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfbnNfaXNfbG9ja2VkKTsKK2FjcGlfZXZfYXR0YWNoX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iaiwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKKwkJICAgICAgdTggYWNwaV9uc19pc19sb2NrZWQpOwogCiB2b2lkCi1hY3BpX2V2X2RldGFjaF9yZWdpb24gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAqcmVnaW9uX29iaiwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfbnNfaXNfbG9ja2VkKTsKK2FjcGlfZXZfZGV0YWNoX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLAorCQkgICAgICB1OCBhY3BpX25zX2lzX2xvY2tlZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2luc3RhbGxfc3BhY2VfaGFuZGxlciAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQlhY3BpX2Fkcl9zcGFjZV90eXBlICAgICAgICAgICAgIHNwYWNlX2lkLAotCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgICAgICAgICAgaGFuZGxlciwKLQlhY3BpX2Fkcl9zcGFjZV9zZXR1cCAgICAgICAgICAgIHNldHVwLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworYWNwaV9ldl9pbnN0YWxsX3NwYWNlX2hhbmRsZXIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgICBhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkLAorCQkJICAgICAgYWNwaV9hZHJfc3BhY2VfaGFuZGxlciBoYW5kbGVyLAorCQkJICAgICAgYWNwaV9hZHJfc3BhY2Vfc2V0dXAgc2V0dXAsIHZvaWQgKmNvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2RzICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfYWRyX3NwYWNlX3R5cGUgICAgICAgICAgICAgc3BhY2VfaWQpOworYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2RzKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIGFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAqcmVnaW9uX29iaiwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKTsKLQorYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwgdTMyIGZ1bmN0aW9uKTsKIAogLyoKICAqIGV2cmVnaW5pIC0gUmVnaW9uIGluaXRpYWxpemF0aW9uIGFuZCBzZXR1cAogICovCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9zeXN0ZW1fbWVtb3J5X3JlZ2lvbl9zZXR1cCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlZ2lvbl9jb250ZXh0KTsKK2FjcGlfZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJCSAgIHUzMiBmdW5jdGlvbiwKKwkJCQkgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsCisJCQkJICAgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW9fc3BhY2VfcmVnaW9uX3NldHVwICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVnaW9uX2NvbnRleHQpOworYWNwaV9ldl9pb19zcGFjZV9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICAgdTMyIGZ1bmN0aW9uLAorCQkJICAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9wY2lfY29uZmlnX3JlZ2lvbl9zZXR1cCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlZ2lvbl9jb250ZXh0KTsKK2FjcGlfZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJCXUzMiBmdW5jdGlvbiwKKwkJCQl2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2Ntb3NfcmVnaW9uX3NldHVwICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVnaW9uX2NvbnRleHQpOworYWNwaV9ldl9jbW9zX3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkgIHUzMiBmdW5jdGlvbiwKKwkJCSAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlZ2lvbl9jb250ZXh0KTsKK2FjcGlfZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICB1MzIgZnVuY3Rpb24sCisJCQkgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfZGVmYXVsdF9yZWdpb25fc2V0dXAgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZWdpb25fY29udGV4dCk7CithY3BpX2V2X2RlZmF1bHRfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCSAgICAgdTMyIGZ1bmN0aW9uLAorCQkJICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2luaXRpYWxpemVfcmVnaW9uICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZWdpb25fb2JqLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9uc19sb2NrZWQpOwotCithY3BpX2V2X2luaXRpYWxpemVfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmosCisJCQkgIHU4IGFjcGlfbnNfbG9ja2VkKTsKIAogLyoKICAqIGV2c2NpIC0gU0NJIChTeXN0ZW0gQ29udHJvbCBJbnRlcnJ1cHQpIGhhbmRsaW5nL2Rpc3BhdGNoCiAgKi8KLXUzMiBBQ1BJX1NZU1RFTV9YRkFDRQotYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlciAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Cit1MzIgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlcih2b2lkICpjb250ZXh0KTsKIAotdTMyCi1hY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIgKAotCXZvaWQpOwordTMyIGFjcGlfZXZfaW5zdGFsbF9zY2lfaGFuZGxlcih2b2lkKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfcmVtb3ZlX3NjaV9oYW5kbGVyICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfZXZfcmVtb3ZlX3NjaV9oYW5kbGVyKHZvaWQpOwogCi11MzIKLWFjcGlfZXZfaW5pdGlhbGl6ZV9zQ0kgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbV9zQ0kpOwordTMyIGFjcGlfZXZfaW5pdGlhbGl6ZV9zQ0kodTMyIHByb2dyYW1fc0NJKTsKIAotdm9pZAotYWNwaV9ldl90ZXJtaW5hdGUgKAotCXZvaWQpOwordm9pZCBhY3BpX2V2X3Rlcm1pbmF0ZSh2b2lkKTsKIAotCi0jZW5kaWYgIC8qIF9fQUNFVkVOVFNfSF9fICAqLworI2VuZGlmCQkJCS8qIF9fQUNFVkVOVFNfSF9fICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaCBiL2luY2x1ZGUvYWNwaS9hY2V4Y2VwLmgKaW5kZXggNjBkNzM3Yi4uNGYwMDVlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNleGNlcC5oCkBAIC00NCw3ICs0NCw2IEBACiAjaWZuZGVmIF9fQUNFWENFUF9IX18KICNkZWZpbmUgX19BQ0VYQ0VQX0hfXwogCi0KIC8qCiAgKiBFeGNlcHRpb25zIHJldHVybmVkIGJ5IGV4dGVybmFsIEFDUEkgaW50ZXJmYWNlcwogICovCkBAIC01NSwxMSArNTQsOSBAQAogI2RlZmluZSBBRV9DT0RFX0NPTlRST0wgICAgICAgICAgICAgICAgIDB4NDAwMAogI2RlZmluZSBBRV9DT0RFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RjAwMAogCi0KICNkZWZpbmUgQUNQSV9TVUNDRVNTKGEpICAgICAgICAgICAgICAgICAoIShhKSkKICNkZWZpbmUgQUNQSV9GQUlMVVJFKGEpICAgICAgICAgICAgICAgICAoYSkKIAotCiAjZGVmaW5lIEFFX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjcGlfc3RhdHVzKSAweDAwMDAKIAogLyoKQEAgLTk1LDkgKzkyLDkgQEAKICNkZWZpbmUgQUVfQUJPUlRfTUVUSE9EICAgICAgICAgICAgICAgICAoYWNwaV9zdGF0dXMpICgweDAwMUMgfCBBRV9DT0RFX0VOVklST05NRU5UQUwpCiAjZGVmaW5lIEFFX1NBTUVfSEFORExFUiAgICAgICAgICAgICAgICAgKGFjcGlfc3RhdHVzKSAoMHgwMDFEIHwgQUVfQ09ERV9FTlZJUk9OTUVOVEFMKQogI2RlZmluZSBBRV9XQUtFX09OTFlfR1BFICAgICAgICAgICAgICAgIChhY3BpX3N0YXR1cykgKDB4MDAxRSB8IEFFX0NPREVfRU5WSVJPTk1FTlRBTCkKKyNkZWZpbmUgQUVfT1dORVJfSURfTElNSVQgICAgICAgICAgICAgICAoYWNwaV9zdGF0dXMpICgweDAwMUYgfCBBRV9DT0RFX0VOVklST05NRU5UQUwpCiAKLSNkZWZpbmUgQUVfQ09ERV9FTlZfTUFYICAgICAgICAgICAgICAgICAweDAwMUUKLQorI2RlZmluZSBBRV9DT0RFX0VOVl9NQVggICAgICAgICAgICAgICAgIDB4MDAxRgogCiAvKgogICogUHJvZ3JhbW1lciBleGNlcHRpb25zCkBAIC0xMTQsNyArMTExLDYgQEAKIAogI2RlZmluZSBBRV9DT0RFX1BHTV9NQVggICAgICAgICAgICAgICAgIDB4MDAwOQogCi0KIC8qCiAgKiBBY3BpIHRhYmxlIGV4Y2VwdGlvbnMKICAqLwpAQCAtMTI3LDcgKzEyMyw2IEBACiAKICNkZWZpbmUgQUVfQ09ERV9UQkxfTUFYICAgICAgICAgICAgICAgICAweDAwMDYKIAotCiAvKgogICogQU1MIGV4Y2VwdGlvbnMuICBUaGVzZSBhcmUgY2F1c2VkIGJ5IHByb2JsZW1zIHdpdGgKICAqIHRoZSBhY3R1YWwgQU1MIGJ5dGUgc3RyZWFtCkBAIC0xNjgsNyArMTYzLDYgQEAKIAogI2RlZmluZSBBRV9DT0RFX0FNTF9NQVggICAgICAgICAgICAgICAgIDB4MDAyMQogCi0KIC8qCiAgKiBJbnRlcm5hbCBleGNlcHRpb25zIHVzZWQgZm9yIGNvbnRyb2wKICAqLwpAQCAtMTg2LDE2ICsxODAsMTMgQEAKIAogI2RlZmluZSBBRV9DT0RFX0NUUkxfTUFYICAgICAgICAgICAgICAgIDB4MDAwQgogCi0KICNpZmRlZiBERUZJTkVfQUNQSV9HTE9CQUxTCiAKLQogLyoKICAqIFN0cmluZyB2ZXJzaW9ucyBvZiB0aGUgZXhjZXB0aW9uIGNvZGVzIGFib3ZlCiAgKiBUaGVzZSBzdHJpbmdzIG11c3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgZGVmaW5lcyBleGFjdGx5CiAgKi8KLWNoYXIgY29uc3QgICAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2VudltdID0KLXsKK2NoYXIgY29uc3QgKmFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19lbnZbXSA9IHsKIAkiQUVfT0siLAogCSJBRV9FUlJPUiIsCiAJIkFFX05PX0FDUElfVEFCTEVTIiwKQEAgLTIyNiwxMSArMjE3LDExIEBACiAJIkFFX0xPR0lDQUxfQUREUkVTUyIsCiAJIkFFX0FCT1JUX01FVEhPRCIsCiAJIkFFX1NBTUVfSEFORExFUiIsCi0JIkFFX1dBS0VfT05MWV9HUEUiCisJIkFFX1dBS0VfT05MWV9HUEUiLAorCSJBRV9PV05FUl9JRF9MSU1JVCIKIH07CiAKLWNoYXIgY29uc3QgICAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3BnbVtdID0KLXsKK2NoYXIgY29uc3QgKmFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19wZ21bXSA9IHsKIAkiQUVfQkFEX1BBUkFNRVRFUiIsCiAJIkFFX0JBRF9DSEFSQUNURVIiLAogCSJBRV9CQURfUEFUSE5BTUUiLApAQCAtMjQyLDggKzIzMyw3IEBACiAJIkFFX0JBRF9ERUNJTUFMX0NPTlNUQU5UIgogfTsKIAotY2hhciBjb25zdCAgICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfdGJsW10gPQoteworY2hhciBjb25zdCAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3RibFtdID0gewogCSJBRV9CQURfU0lHTkFUVVJFIiwKIAkiQUVfQkFEX0hFQURFUiIsCiAJIkFFX0JBRF9DSEVDS1NVTSIsCkBAIC0yNTIsOCArMjQyLDcgQEAKIAkiQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEgiCiB9OwogCi1jaGFyIGNvbnN0ICAgKmFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19hbWxbXSA9Ci17CitjaGFyIGNvbnN0ICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfYW1sW10gPSB7CiAJIkFFX0FNTF9FUlJPUiIsCiAJIkFFX0FNTF9QQVJTRSIsCiAJIkFFX0FNTF9CQURfT1BDT0RFIiwKQEAgLTI4OSw4ICsyNzgsNyBAQAogCSJBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCIKIH07CiAKLWNoYXIgY29uc3QgICAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2N0cmxbXSA9Ci17CitjaGFyIGNvbnN0ICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfY3RybFtdID0gewogCSJBRV9DVFJMX1JFVFVSTl9WQUxVRSIsCiAJIkFFX0NUUkxfUEVORElORyIsCiAJIkFFX0NUUkxfVEVSTUlOQVRFIiwKQEAgLTMwNCw2ICsyOTIsNiBAQAogCSJBRV9DVFJMX1NLSVAiCiB9OwogCi0jZW5kaWYgLyogQUNQSSBHTE9CQUxTICovCisjZW5kaWYJCQkJLyogQUNQSSBHTE9CQUxTICovCiAKLSNlbmRpZiAvKiBfX0FDRVhDRVBfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ0VYQ0VQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmggYi9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaAppbmRleCA0OTQ2Njk2Li5lOWMyNzkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaApAQCAtNDQsNyArNDQsNiBAQAogI2lmbmRlZiBfX0FDR0xPQkFMX0hfXwogI2RlZmluZSBfX0FDR0xPQkFMX0hfXwogCi0KIC8qCiAgKiBFbnN1cmUgdGhhdCB0aGUgZ2xvYmFscyBhcmUgYWN0dWFsbHkgZGVmaW5lZCBhbmQgaW5pdGlhbGl6ZWQgb25seSBvbmNlLgogICoKQEAgLTYzLDkgKzYyLDggQEAKICAqIEtlZXAgbG9jYWwgY29waWVzIG9mIHRoZXNlIEZBRFQtYmFzZWQgcmVnaXN0ZXJzLiAgTk9URTogVGhlc2UgZ2xvYmFscwogICogYXJlIGZpcnN0IGluIHRoaXMgZmlsZSBmb3IgYWxpZ25tZW50IHJlYXNvbnMgb24gNjQtYml0IHN5c3RlbXMuCiAgKi8KLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgICAgIGFjcGlfZ2JsX3hwbTFhX2VuYWJsZTsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgICAgIGFjcGlfZ2JsX3hwbTFiX2VuYWJsZTsKLQorQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGFjcGlfZ2JsX3hwbTFhX2VuYWJsZTsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBhY3BpX2dibF94cG0xYl9lbmFibGU7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc1LDEzICs3MywxMiBAQAogCiAvKiBSdW50aW1lIGNvbmZpZ3VyYXRpb24gb2YgZGVidWcgcHJpbnQgbGV2ZWxzICovCiAKLWV4dGVybiAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZGJnX2xldmVsOwotZXh0ZXJuICAgICAgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9kYmdfbGF5ZXI7CitleHRlcm4gdTMyIGFjcGlfZGJnX2xldmVsOworZXh0ZXJuIHUzMiBhY3BpX2RiZ19sYXllcjsKIAogLyogUHJvY2VkdXJlIG5lc3RpbmcgbGV2ZWwgZm9yIGRlYnVnIG91dHB1dCAqLwogCi1leHRlcm4gICAgICB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9uZXN0aW5nX2xldmVsOwotCitleHRlcm4gdTMyIGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWw7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTk4LDcgKzk1LDcgQEAKICAqIDMpIEFsbG93IGFjY2VzcyB0byB1bmluaXRpYWxpemVkIGxvY2Fscy9hcmdzIChhdXRvLWluaXQgdG8gaW50ZWdlciAwKQogICogNCkgQWxsb3cgQU5ZIG9iamVjdCB0eXBlIHRvIGJlIGEgc291cmNlIG9wZXJhbmQgZm9yIHRoZSBTdG9yZSgpIG9wZXJhdG9yCiAgKi8KLUFDUElfRVhURVJOIHU4ICAgICAgIEFDUElfSU5JVF9HTE9CQUwgKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaywgRkFMU0UpOworQUNQSV9FWFRFUk4gdTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2ssIEZBTFNFKTsKIAogLyoKICAqIEF1dG9tYXRpY2FsbHkgc2VyaWFsaXplIEFMTCBjb250cm9sIG1ldGhvZHM/IERlZmF1bHQgaXMgRkFMU0UsIG1lYW5pbmcKQEAgLTEwNiwyMiArMTAzLDIxIEBACiAgKiBPbmx5IGNoYW5nZSB0aGlzIGlmIHRoZSBBU0wgY29kZSBpcyBwb29ybHkgd3JpdHRlbiBhbmQgY2Fubm90IGhhbmRsZQogICogcmVlbnRyYW5jeSBldmVuIHRob3VnaCBtZXRob2RzIGFyZSBtYXJrZWQgIm5vdF9zZXJpYWxpemVkIi4KICAqLwotQUNQSV9FWFRFUk4gdTggICAgICAgQUNQSV9JTklUX0dMT0JBTCAoYWNwaV9nYmxfYWxsX21ldGhvZHNfc2VyaWFsaXplZCwgRkFMU0UpOworQUNQSV9FWFRFUk4gdTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF9hbGxfbWV0aG9kc19zZXJpYWxpemVkLCBGQUxTRSk7CiAKIC8qCiAgKiBDcmVhdGUgdGhlIHByZWRlZmluZWQgX09TSSBtZXRob2QgaW4gdGhlIG5hbWVzcGFjZT8gRGVmYXVsdCBpcyBUUlVFCiAgKiBiZWNhdXNlIEFDUEkgQ0EgaXMgZnVsbHkgY29tcGF0aWJsZSB3aXRoIG90aGVyIEFDUEkgaW1wbGVtZW50YXRpb25zLgogICogQ2hhbmdpbmcgdGhpcyB3aWxsIHJldmVydCBBQ1BJIENBIChhbmQgbWFjaGluZSBBU0wpIHRvIHByZS1PU0kgYmVoYXZpb3IuCiAgKi8KLUFDUElfRVhURVJOIHU4ICAgICAgIEFDUElfSU5JVF9HTE9CQUwgKGFjcGlfZ2JsX2NyZWF0ZV9vc2lfbWV0aG9kLCBUUlVFKTsKK0FDUElfRVhURVJOIHU4IEFDUElfSU5JVF9HTE9CQUwoYWNwaV9nYmxfY3JlYXRlX29zaV9tZXRob2QsIFRSVUUpOwogCiAvKgogICogRGlzYWJsZSB3YWtldXAgR1BFcyBkdXJpbmcgcnVudGltZT8gRGVmYXVsdCBpcyBUUlVFIGJlY2F1c2UgV0FLRSBhbmQKICAqIFJVTlRJTUUgR1BFcyBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkLCBhbmQgV0FLRSBHUEVzIHNob3VsZCB0eXBpY2FsbHkgb25seQogICogYmUgZW5hYmxlZCBqdXN0IGJlZm9yZSBnb2luZyB0byBzbGVlcC4KICAqLwotQUNQSV9FWFRFUk4gdTggICAgICAgQUNQSV9JTklUX0dMT0JBTCAoYWNwaV9nYmxfbGVhdmVfd2FrZV9ncGVzX2Rpc2FibGVkLCBUUlVFKTsKLQorQUNQSV9FWFRFUk4gdTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF9sZWF2ZV93YWtlX2dwZXNfZGlzYWJsZWQsIFRSVUUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMzcsNDIgKzEzMyw0NiBAQAogICogVGhlc2UgdGFibGVzIGFyZSBzaW5nbGUtdGFibGUgb25seTsgbWVhbmluZyB0aGF0IHRoZXJlIGNhbiBiZSBhdCBtb3N0IG9uZQogICogb2YgZWFjaCBpbiB0aGUgc3lzdGVtLiAgRWFjaCBnbG9iYWwgcG9pbnRzIHRvIHRoZSBhY3R1YWwgdGFibGUuCiAgKi8KLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX3RhYmxlX2ZsYWdzOwotQUNQSV9FWFRFUk4gdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudDsKLUFDUElfRVhURVJOIHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgICAgICAgICAgICAgKmFjcGlfZ2JsX1JTRFA7Ci1BQ1BJX0VYVEVSTiBYU0RUX0RFU0NSSVBUT1IgICAgICAgICAgICAqYWNwaV9nYmxfWFNEVDsKLUFDUElfRVhURVJOIEZBRFRfREVTQ1JJUFRPUiAgICAgICAgICAgICphY3BpX2dibF9GQURUOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAgICAqYWNwaV9nYmxfRFNEVDsKLUFDUElfRVhURVJOIEZBQ1NfREVTQ1JJUFRPUiAgICAgICAgICAgICphY3BpX2dibF9GQUNTOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfY29tbW9uX2ZhY3MgICAgICAgICAgICAgYWNwaV9nYmxfY29tbW9uX2ZBQ1M7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfdGFibGVfZmxhZ3M7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudDsKK0FDUElfRVhURVJOIHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgKmFjcGlfZ2JsX1JTRFA7CitBQ1BJX0VYVEVSTiBYU0RUX0RFU0NSSVBUT1IgKmFjcGlfZ2JsX1hTRFQ7CitBQ1BJX0VYVEVSTiBGQURUX0RFU0NSSVBUT1IgKmFjcGlfZ2JsX0ZBRFQ7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmFjcGlfZ2JsX0RTRFQ7CitBQ1BJX0VYVEVSTiBGQUNTX0RFU0NSSVBUT1IgKmFjcGlfZ2JsX0ZBQ1M7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9jb21tb25fZmFjcyBhY3BpX2dibF9jb21tb25fZkFDUzsKIC8qCiAgKiBTaW5jZSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgU1NEVHMgYW5kIFBTRFRzLCBhIHNpbmdsZSBwb2ludGVyIGlzIG5vdAogICogc3VmZmljaWVudDsgVGhlcmVmb3JlLCB0aGVyZSBpc24ndCBvbmUhCiAgKi8KIAorLyogVGhlIHJvb3QgdGFibGUgY2FuIGJlIGVpdGhlciBhbiBSU0RUIG9yIGFuIFhTRFQgKi8KKworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfcm9vdF90YWJsZV90eXBlOworI2RlZmluZSAgICAgQUNQSV9UQUJMRV9UWVBFX1JTRFQgICAgICAgICdSJworI2RlZmluZSAgICAgQUNQSV9UQUJMRV9UWVBFX1hTRFQgICAgICAgICdYJwogCiAvKgogICogSGFuZGxlIGJvdGggQUNQSSAxLjAgYW5kIEFDUEkgMi4wIEludGVnZXIgd2lkdGhzOgogICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCB0aGF0IGV4aXN0cyBpbiBhIDMyLWJpdCBBQ1BJIHRhYmxlLAogICogdXNlIG9ubHkgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIChpbnRlcm5hbCkgNjQtYml0IEludGVnZXIuCiAgKi8KLUFDUElfRVhURVJOIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfaW50ZWdlcl9ueWJibGVfd2lkdGg7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9pbnRlZ2VyX2JpdF93aWR0aDsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aDsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2ludGVnZXJfbnliYmxlX3dpZHRoOwogCiAvKgogICogQUNQSSBUYWJsZSBpbmZvIGFycmF5cwogICovCi1leHRlcm4gICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9saXN0ICAgICAgICAgICAgICBhY3BpX2dibF90YWJsZV9saXN0c1tOVU1fQUNQSV9UQUJMRV9UWVBFU107Ci1leHRlcm4gICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9zdXBwb3J0ICAgICAgICAgICBhY3BpX2dibF90YWJsZV9kYXRhW05VTV9BQ1BJX1RBQkxFX1RZUEVTXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV90YWJsZV9saXN0IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW05VTV9BQ1BJX1RBQkxFX1RZUEVTXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV90YWJsZV9zdXBwb3J0IGFjcGlfZ2JsX3RhYmxlX2RhdGFbTlVNX0FDUElfVEFCTEVfVFlQRVNdOwogCiAvKgogICogUHJlZGVmaW5lZCBtdXRleCBvYmplY3RzLiAgVGhpcyBhcnJheSBjb250YWlucyB0aGUKICAqIGFjdHVhbCBPUyBtdXRleCBoYW5kbGVzLCBpbmRleGVkIGJ5IHRoZSBsb2NhbCBBQ1BJX01VVEVYX0hBTkRMRXMuCiAgKiAoVGhlIHRhYmxlIG1hcHMgbG9jYWwgaGFuZGxlcyB0byB0aGUgcmVhbCBPUyBoYW5kbGVzKQogICovCi1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9tdXRleF9pbmZvICAgICAgICAgICAgICBhY3BpX2dibF9tdXRleF9pbmZvW05VTV9NVVRFWF07Ci0KK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX211dGV4X2luZm8gYWNwaV9nYmxfbXV0ZXhfaW5mb1tOVU1fTVVURVhdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xODAsNDEgKzE4MCw1NiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKIAotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgICAgICAgICAgICAgYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTlVNX01FTV9MSVNUU107Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9vYmplY3Rfbm90aWZ5X2hhbmRsZXIgICBhY3BpX2dibF9kZXZpY2Vfbm90aWZ5OwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfb2JqZWN0X25vdGlmeV9oYW5kbGVyICAgYWNwaV9nYmxfc3lzdGVtX25vdGlmeTsKLUFDUElfRVhURVJOIGFjcGlfZXhjZXB0aW9uX2hhbmRsZXIgICAgICAgICAgICAgIGFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyOwotQUNQSV9FWFRFUk4gYWNwaV9pbml0X2hhbmRsZXIgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfaW5pdF9oYW5kbGVyOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAgICAqYWNwaV9nYmxfYnJlYWtwb2ludF93YWxrOwotQUNQSV9FWFRFUk4gYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlOworLyogTGlzdHMgZm9yIHRyYWNraW5nIG1lbW9yeSBhbGxvY2F0aW9ucyAqLwogCi1BQ1BJX0VYVEVSTiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9nbG9iYWxfbG9ja190aHJlYWRfY291bnQ7Ci1BQ1BJX0VYVEVSTiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9vcmlnaW5hbF9tb2RlOwotQUNQSV9FWFRFUk4gdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfcnNkcF9vcmlnaW5hbF9sb2NhdGlvbjsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX25zX2xvb2t1cF9jb3VudDsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX3BzX2ZpbmRfY291bnQ7Ci1BQ1BJX0VYVEVSTiB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9wbTFfZW5hYmxlX3JlZ2lzdGVyX3NhdmU7Ci1BQ1BJX0VYVEVSTiB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9uZXh0X3RhYmxlX293bmVyX2lkOwotQUNQSV9FWFRFUk4gdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfbmV4dF9tZXRob2Rfb3duZXJfaWQ7Ci1BQ1BJX0VYVEVSTiB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9nbG9iYWxfbG9ja19oYW5kbGU7Ci1BQ1BJX0VYVEVSTiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9kZWJ1Z2dlcl9jb25maWd1cmF0aW9uOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfYWNxdWlyZWQ7Ci1BQ1BJX0VYVEVSTiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9zdGVwX3RvX25leHRfY2FsbDsKLUFDUElfRVhURVJOIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2FjcGlfaGFyZHdhcmVfcHJlc2VudDsKLUFDUElfRVhURVJOIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3ByZXNlbnQ7Ci1BQ1BJX0VYVEVSTiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9ldmVudHNfaW5pdGlhbGl6ZWQ7Ci1BQ1BJX0VYVEVSTiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9zeXN0ZW1fYXdha2VfYW5kX3J1bm5pbmc7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqYWNwaV9nYmxfZ2xvYmFsX2xpc3Q7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqYWNwaV9nYmxfbnNfbm9kZV9saXN0OworI2VuZGlmCiAKLWV4dGVybiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX3NodXRkb3duOwotZXh0ZXJuIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfc3RhcnR1cF9mbGFnczsKLWV4dGVybiBjb25zdCB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RlY29kZV90bzhiaXRbOF07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9zbGVlcF9zdGF0ZV9uYW1lc1tBQ1BJX1NfU1RBVEVfQ09VTlRdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfaGlnaGVzdF9kc3RhdGVfbmFtZXNbNF07Ci1leHRlcm4gY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gICAgICAgICAgICBhY3BpX2dibF9hbWxfb3BfaW5mb1tBTUxfTlVNX09QQ09ERVNdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfcmVnaW9uX3R5cGVzW0FDUElfTlVNX1BSRURFRklORURfUkVHSU9OU107Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF92YWxpZF9vc2lfc3RyaW5nc1tBQ1BJX05VTV9PU0lfU1RSSU5HU107CisvKiBPYmplY3QgY2FjaGVzICovCiAKK0FDUElfRVhURVJOIGFjcGlfY2FjaGVfdCAqYWNwaV9nYmxfc3RhdGVfY2FjaGU7CitBQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX3BzX25vZGVfY2FjaGU7CitBQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlOworQUNQSV9FWFRFUk4gYWNwaV9jYWNoZV90ICphY3BpX2dibF9vcGVyYW5kX2NhY2hlOworCisvKiBHbG9iYWwgaGFuZGxlcnMgKi8KKworQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfb2JqZWN0X25vdGlmeV9oYW5kbGVyIGFjcGlfZ2JsX2RldmljZV9ub3RpZnk7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9vYmplY3Rfbm90aWZ5X2hhbmRsZXIgYWNwaV9nYmxfc3lzdGVtX25vdGlmeTsKK0FDUElfRVhURVJOIGFjcGlfZXhjZXB0aW9uX2hhbmRsZXIgYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXI7CitBQ1BJX0VYVEVSTiBhY3BpX2luaXRfaGFuZGxlciBhY3BpX2dibF9pbml0X2hhbmRsZXI7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICphY3BpX2dibF9icmVha3BvaW50X3dhbGs7CitBQ1BJX0VYVEVSTiBhY3BpX2hhbmRsZSBhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmU7CisKKy8qIE1pc2MgKi8KKworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudDsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9vcmlnaW5hbF9tb2RlOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3JzZHBfb3JpZ2luYWxfbG9jYXRpb247CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfbnNfbG9va3VwX2NvdW50OworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3BzX2ZpbmRfY291bnQ7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfb3duZXJfaWRfbWFzazsKK0FDUElfRVhURVJOIHUxNiBhY3BpX2dibF9wbTFfZW5hYmxlX3JlZ2lzdGVyX3NhdmU7CitBQ1BJX0VYVEVSTiB1MTYgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGVidWdnZXJfY29uZmlndXJhdGlvbjsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfc3RlcF90b19uZXh0X2NhbGw7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9hY3BpX2hhcmR3YXJlX3ByZXNlbnQ7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9nbG9iYWxfbG9ja19wcmVzZW50OworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZXZlbnRzX2luaXRpYWxpemVkOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nOworCitleHRlcm4gdTggYWNwaV9nYmxfc2h1dGRvd247CitleHRlcm4gdTMyIGFjcGlfZ2JsX3N0YXJ0dXBfZmxhZ3M7CitleHRlcm4gY29uc3QgdTggYWNwaV9nYmxfZGVjb2RlX3RvOGJpdFs4XTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9zbGVlcF9zdGF0ZV9uYW1lc1tBQ1BJX1NfU1RBVEVfQ09VTlRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzWzRdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvIGFjcGlfZ2JsX2FtbF9vcF9pbmZvW0FNTF9OVU1fT1BDT0RFU107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfcmVnaW9uX3R5cGVzW0FDUElfTlVNX1BSRURFRklORURfUkVHSU9OU107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfdmFsaWRfb3NpX3N0cmluZ3NbQUNQSV9OVU1fT1NJX1NUUklOR1NdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMzAsMzYgKzI0NSwzNCBAQAogI2RlZmluZSBOVU1fUFJFREVGSU5FRF9OQU1FUyAgICAgICAgICAgIDkKICNlbmRpZgogCi1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICBhY3BpX2dibF9yb290X25vZGVfc3RydWN0OwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAqYWNwaV9nYmxfcm9vdF9ub2RlOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAqYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlOworQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdDsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX2dibF9yb290X25vZGU7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlOwogCi1leHRlcm4gY29uc3QgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9uc19wcm9wZXJ0aWVzW05VTV9OU19UWVBFU107Ci1leHRlcm4gY29uc3Qgc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyAgICAgICBhY3BpX2dibF9wcmVfZGVmaW5lZF9uYW1lcyBbTlVNX1BSRURFRklORURfTkFNRVNdOworZXh0ZXJuIGNvbnN0IHU4IGFjcGlfZ2JsX25zX3Byb3BlcnRpZXNbTlVNX05TX1RZUEVTXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzCisgICAgYWNwaV9nYmxfcHJlX2RlZmluZWRfbmFtZXNbTlVNX1BSRURFRklORURfTkFNRVNdOwogCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2N1cnJlbnRfbm9kZV9jb3VudDsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2N1cnJlbnRfbm9kZV9zaXplOwotQUNQSV9FWFRFUk4gdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfbWF4X2NvbmN1cnJlbnRfbm9kZV9jb3VudDsKLUFDUElfRVhURVJOIGFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2VudHJ5X3N0YWNrX3BvaW50ZXI7Ci1BQ1BJX0VYVEVSTiBhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlcjsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RlZXBlc3RfbmVzdGluZzsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9jdXJyZW50X25vZGVfY291bnQ7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfY3VycmVudF9ub2RlX3NpemU7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfbWF4X2NvbmN1cnJlbnRfbm9kZV9jb3VudDsKK0FDUElfRVhURVJOIGFjcGlfc2l6ZSBhY3BpX2dibF9lbnRyeV9zdGFja19wb2ludGVyOworQUNQSV9FWFRFUk4gYWNwaV9zaXplIGFjcGlfZ2JsX2xvd2VzdF9zdGFja19wb2ludGVyOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX2RlZXBlc3RfbmVzdGluZzsKICNlbmRpZgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVycHJldGVyIGdsb2JhbHMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCi1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICAgICphY3BpX2dibF9jdXJyZW50X3dhbGtfbGlzdDsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqYWNwaV9nYmxfY3VycmVudF93YWxrX2xpc3Q7CiAKIC8qIENvbnRyb2wgbWV0aG9kIHNpbmdsZSBzdGVwIGZsYWcgKi8KIAotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfY21fc2luZ2xlX3N0ZXA7Ci0KK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2NtX3NpbmdsZV9zdGVwOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yNjcsOCArMjgwLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotQUNQSV9FWFRFUk4gdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAqYWNwaV9nYmxfcGFyc2VkX25hbWVzcGFjZV9yb290OwotCitBQ1BJX0VYVEVSTiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9nYmxfcGFyc2VkX25hbWVzcGFjZV9yb290OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yNzYsMTAgKzI4OCwxMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1leHRlcm4gICAgICBzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAgICAgICBhY3BpX2dibF9iaXRfcmVnaXN0ZXJfaW5mb1tBQ1BJX05VTV9CSVRSRUddOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfc2xlZXBfdHlwZV9hOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfc2xlZXBfdHlwZV9iOwotCitleHRlcm4gc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8KKyAgICBhY3BpX2dibF9iaXRfcmVnaXN0ZXJfaW5mb1tBQ1BJX05VTV9CSVRSRUddOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfc2xlZXBfdHlwZV9hOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfc2xlZXBfdHlwZV9iOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yODcsMTIgKzI5OSwxNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1leHRlcm4gICAgICBzdHJ1Y3QgYWNwaV9maXhlZF9ldmVudF9pbmZvICAgICAgICBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfTlVNX0ZJWEVEX0VWRU5UU107Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9maXhlZF9ldmVudF9oYW5kbGVyICAgICBhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tBQ1BJX05VTV9GSVhFRF9FVkVOVFNdOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAgICAqYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZDsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgICAgKmFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1tBQ1BJX01BWF9HUEVfQkxPQ0tTXTsKLUFDUElfRVhURVJOIGFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2dwZV9sb2NrOwotCitleHRlcm4gc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaW5mbworICAgIGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bQUNQSV9OVU1fRklYRURfRVZFTlRTXTsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX2ZpeGVkX2V2ZW50X2hhbmRsZXIKKyAgICBhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tBQ1BJX05VTV9GSVhFRF9FVkVOVFNdOworQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbworICAgICphY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbQUNQSV9NQVhfR1BFX0JMT0NLU107CitBQ1BJX0VYVEVSTiBhY3BpX2hhbmRsZSBhY3BpX2dibF9ncGVfbG9jazsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzAwLDU4ICszMTQsNTUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfb3V0cHV0X2ZsYWdzOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3V0cHV0X2ZsYWdzOwogCiAjaWZkZWYgQUNQSV9ESVNBU1NFTUJMRVIKIAotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfb3B0X2Rpc2FzbTsKLUFDUElfRVhURVJOIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RiX29wdF92ZXJib3NlOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3B0X2Rpc2FzbTsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX29wdF92ZXJib3NlOwogI2VuZGlmCiAKLQogI2lmZGVmIEFDUElfREVCVUdHRVIKIAotZXh0ZXJuICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfbWV0aG9kX2V4ZWN1dGluZzsKLWV4dGVybiAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2Fib3J0X21ldGhvZDsKLWV4dGVybiAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RiX3Rlcm1pbmF0ZV90aHJlYWRzOworZXh0ZXJuIHU4IGFjcGlfZ2JsX21ldGhvZF9leGVjdXRpbmc7CitleHRlcm4gdTggYWNwaV9nYmxfYWJvcnRfbWV0aG9kOworZXh0ZXJuIHU4IGFjcGlfZ2JsX2RiX3Rlcm1pbmF0ZV90aHJlYWRzOwogCi1BQ1BJX0VYVEVSTiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbmQ7Ci1BQ1BJX0VYVEVSTiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvcHRhcmc7CitBQ1BJX0VYVEVSTiBpbnQgb3B0aW5kOworQUNQSV9FWFRFUk4gY2hhciAqb3B0YXJnOwogCi1BQ1BJX0VYVEVSTiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9kYl9vcHRfdGFibGVzOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfb3B0X3N0YXRzOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfb3B0X2luaV9tZXRob2RzOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3B0X3RhYmxlczsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX29wdF9zdGF0czsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX29wdF9pbmlfbWV0aG9kczsKIAotCi1BQ1BJX0VYVEVSTiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9kYl9hcmdzW0FDUElfREVCVUdHRVJfTUFYX0FSR1NdOwotQUNQSV9FWFRFUk4gY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfbGluZV9idWZbODBdOwotQUNQSV9FWFRFUk4gY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfcGFyc2VkX2J1Zls4MF07Ci1BQ1BJX0VYVEVSTiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9kYl9zY29wZV9idWZbNDBdOwotQUNQSV9FWFRFUk4gY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfZGVidWdfZmlsZW5hbWVbNDBdOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfb3V0cHV0X3RvX2ZpbGU7Ci1BQ1BJX0VYVEVSTiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9kYl9idWZmZXI7Ci1BQ1BJX0VYVEVSTiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9kYl9maWxlbmFtZTsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RiX2RlYnVnX2xldmVsOwotQUNQSV9FWFRFUk4gdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfY29uc29sZV9kZWJ1Z19sZXZlbDsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgICAgKmFjcGlfZ2JsX2RiX3RhYmxlX3B0cjsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgKmFjcGlfZ2JsX2RiX3Njb3BlX25vZGU7CitBQ1BJX0VYVEVSTiBjaGFyICphY3BpX2dibF9kYl9hcmdzW0FDUElfREVCVUdHRVJfTUFYX0FSR1NdOworQUNQSV9FWFRFUk4gY2hhciBhY3BpX2dibF9kYl9saW5lX2J1Zls4MF07CitBQ1BJX0VYVEVSTiBjaGFyIGFjcGlfZ2JsX2RiX3BhcnNlZF9idWZbODBdOworQUNQSV9FWFRFUk4gY2hhciBhY3BpX2dibF9kYl9zY29wZV9idWZbNDBdOworQUNQSV9FWFRFUk4gY2hhciBhY3BpX2dibF9kYl9kZWJ1Z19maWxlbmFtZVs0MF07CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9kYl9vdXRwdXRfdG9fZmlsZTsKK0FDUElfRVhURVJOIGNoYXIgKmFjcGlfZ2JsX2RiX2J1ZmZlcjsKK0FDUElfRVhURVJOIGNoYXIgKmFjcGlfZ2JsX2RiX2ZpbGVuYW1lOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX2RiX2RlYnVnX2xldmVsOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX2RiX2NvbnNvbGVfZGVidWdfbGV2ZWw7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmFjcGlfZ2JsX2RiX3RhYmxlX3B0cjsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX2dibF9kYl9zY29wZV9ub2RlOwogCiAvKgogICogU3RhdGlzdGljIGdsb2JhbHMKICAqLwotQUNQSV9FWFRFUk4gdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfb2JqX3R5cGVfY291bnRbQUNQSV9UWVBFX05TX05PREVfTUFYKzFdOwotQUNQSV9FWFRFUk4gdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfbm9kZV90eXBlX2NvdW50W0FDUElfVFlQRV9OU19OT0RFX01BWCsxXTsKLUFDUElfRVhURVJOIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX29ial90eXBlX2NvdW50X21pc2M7Ci1BQ1BJX0VYVEVSTiB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9ub2RlX3R5cGVfY291bnRfbWlzYzsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX251bV9ub2RlczsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX251bV9vYmplY3RzOworQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX29ial90eXBlX2NvdW50W0FDUElfVFlQRV9OU19OT0RFX01BWCArIDFdOworQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX25vZGVfdHlwZV9jb3VudFtBQ1BJX1RZUEVfTlNfTk9ERV9NQVggKyAxXTsKK0FDUElfRVhURVJOIHUxNiBhY3BpX2dibF9vYmpfdHlwZV9jb3VudF9taXNjOworQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX25vZGVfdHlwZV9jb3VudF9taXNjOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX251bV9ub2RlczsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9udW1fb2JqZWN0czsKIAorQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3NpemVfb2ZfcGFyc2VfdHJlZTsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9zaXplX29mX21ldGhvZF90cmVlczsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9zaXplX29mX25vZGVfZW50cmllczsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9zaXplX29mX2FjcGlfb2JqZWN0czsKIAotQUNQSV9FWFRFUk4gdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfc2l6ZV9vZl9wYXJzZV90cmVlOwotQUNQSV9FWFRFUk4gdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfc2l6ZV9vZl9tZXRob2RfdHJlZXM7Ci1BQ1BJX0VYVEVSTiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9zaXplX29mX25vZGVfZW50cmllczsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX3NpemVfb2ZfYWNwaV9vYmplY3RzOworI2VuZGlmCQkJCS8qIEFDUElfREVCVUdHRVIgKi8KIAotI2VuZGlmIC8qIEFDUElfREVCVUdHRVIgKi8KLQotI2VuZGlmIC8qIF9fQUNHTE9CQUxfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ0dMT0JBTF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmggYi9pbmNsdWRlL2FjcGkvYWNod2FyZS5oCmluZGV4IDlkNjM2NDEuLjM2NDRkNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjaHdhcmUuaApAQCAtNDQsNyArNDQsNiBAQAogI2lmbmRlZiBfX0FDSFdBUkVfSF9fCiAjZGVmaW5lIF9fQUNIV0FSRV9IX18KIAotCiAvKiBQTSBUaW1lciB0aWNrcyBwZXIgc2Vjb25kIChIWikgKi8KIAogI2RlZmluZSBQTV9USU1FUl9GUkVRVUVOQ1kgIDM1Nzk1NDUKQEAgLTU3LDEyNiArNTYsNzggQEAKICNkZWZpbmUgQUNQSV9TU1RfU0xFRVBJTkcgICAgICAgMwogI2RlZmluZSBBQ1BJX1NTVF9TTEVFUF9DT05URVhUICA0CiAKLQogLyogUHJvdG90eXBlcyAqLwogCi0KIC8qCiAgKiBod2FjcGkgLSBoaWdoIGxldmVsIGZ1bmN0aW9ucwogICovCi1hY3BpX3N0YXR1cwotYWNwaV9od19pbml0aWFsaXplICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfaHdfaW5pdGlhbGl6ZSh2b2lkKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfaHdfc2V0X21vZGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CithY3BpX3N0YXR1cyBhY3BpX2h3X3NldF9tb2RlKHUzMiBtb2RlKTsKIAotdTMyCi1hY3BpX2h3X2dldF9tb2RlICgKLQl2b2lkKTsKLQordTMyIGFjcGlfaHdfZ2V0X21vZGUodm9pZCk7CiAKIC8qCiAgKiBod3JlZ3MgLSBBQ1BJIFJlZ2lzdGVyIEkvTwogICovCi1zdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqCi1hY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9pZCk7CitzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8odTMyIHJlZ2lzdGVyX2lkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfbG9jaywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2lkLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJldHVybl92YWx1ZSk7CithY3BpX2h3X3JlZ2lzdGVyX3JlYWQodTggdXNlX2xvY2ssIHUzMiByZWdpc3Rlcl9pZCwgdTMyICogcmV0dXJuX3ZhbHVlKTsKKworYWNwaV9zdGF0dXMgYWNwaV9od19yZWdpc3Rlcl93cml0ZSh1OCB1c2VfbG9jaywgdTMyIHJlZ2lzdGVyX2lkLCB1MzIgdmFsdWUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfbG9jaywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2lkLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworYWNwaV9od19sb3dfbGV2ZWxfcmVhZCh1MzIgd2lkdGgsCisJCSAgICAgICB1MzIgKiB2YWx1ZSwgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpyZWcpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19sb3dfbGV2ZWxfcmVhZCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgICpyZWcpOworYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUodTMyIHdpZHRoLCB1MzIgdmFsdWUsIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqcmVnKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfaHdfbG93X2xldmVsX3dyaXRlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICAqcmVnKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCithY3BpX3N0YXR1cyBhY3BpX2h3X2NsZWFyX2FjcGlfc3RhdHVzKHUzMiBmbGFncyk7CiAKIC8qCiAgKiBod2dwZSAtIEdQRSBzdXBwb3J0CiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbyk7CithY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2h3X2Rpc2FibGVfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOworYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCisJCQkgIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOworCithY3BpX3N0YXR1cyBhY3BpX2h3X2NsZWFyX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19jbGVhcl9ncGUgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOworYWNwaV9od19jbGVhcl9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAorCQkJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jayk7CiAKICNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfaHdfZ2V0X2dwZV9zdGF0dXMgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLAotCWFjcGlfZXZlbnRfc3RhdHVzICAgICAgICAgICAgICAgKmV2ZW50X3N0YXR1cyk7Ci0jZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KK2FjcGlfaHdfZ2V0X2dwZV9zdGF0dXMoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAorCQkgICAgICAgYWNwaV9ldmVudF9zdGF0dXMgKiBldmVudF9zdGF0dXMpOworI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCisKK2FjcGlfc3RhdHVzIGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3Blcyh2b2lkKTsKKworYWNwaV9zdGF0dXMgYWNwaV9od19lbmFibGVfYWxsX3J1bnRpbWVfZ3Blcyh2b2lkKTsKKworYWNwaV9zdGF0dXMgYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzKHZvaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOwotCithY3BpX2h3X2VuYWJsZV9ydW50aW1lX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCisJCQkJIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOwogCiAjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIC8qCiAgKiBod3RpbWVyIC0gQUNQSSBUaW1lciBwcm90b3R5cGVzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2dldF90aW1lcl9yZXNvbHV0aW9uICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXNvbHV0aW9uKTsKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3RpbWVyX3Jlc29sdXRpb24odTMyICogcmVzb2x1dGlvbik7CisKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3RpbWVyKHUzMiAqIHRpY2tzKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3RpbWVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aWNrcyk7CithY3BpX2dldF90aW1lcl9kdXJhdGlvbih1MzIgc3RhcnRfdGlja3MsIHUzMiBlbmRfdGlja3MsIHUzMiAqIHRpbWVfZWxhcHNlZCk7CisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3RpbWVyX2R1cmF0aW9uICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3RpY2tzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3RpY2tzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWVfZWxhcHNlZCk7Ci0jZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KLQotCi0jZW5kaWYgLyogX19BQ0hXQVJFX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNIV0FSRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2ludGVycC5oIGIvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmgKaW5kZXggNWM3MTcyNC4uMmM5YzFhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmgKQEAgLTQ0LDI5ICs0NCwyMiBAQAogI2lmbmRlZiBfX0FDSU5URVJQX0hfXwogI2RlZmluZSBfX0FDSU5URVJQX0hfXwogCi0KICNkZWZpbmUgQUNQSV9XQUxLX09QRVJBTkRTICAgICAgICgmKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLTFdKSkKIAotCiAvKgogICogZXhjb252cnQgLSBvYmplY3QgY29udmVyc2lvbgogICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXN1bHRfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKK2FjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJlc3VsdF9kZXNjLCB1MzIgZmxhZ3MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlciAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJlc3VsdF9kZXNjKTsKK2FjcGlfZXhfY29udmVydF90b19idWZmZXIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXN1bHRfZGVzYyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmVzdWx0X2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKK2FjcGlfZXhfY29udmVydF90b19zdHJpbmcodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXN1bHRfZGVzYywgdTMyIHR5cGUpOwogCiAvKiBUeXBlcyBmb3IgLT5TdHJpbmcgY29udmVyc2lvbiAqLwogCkBAIC03Niw1ODcgKzY5LDQxMiBAQAogI2RlZmluZSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfREVDSU1BTCAgIDB4MDAwMDAwMDMKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfY29udmVydF90b190YXJnZXRfdHlwZSAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl90eXBlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXN1bHRfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9leF9jb252ZXJ0X3RvX3RhcmdldF90eXBlKGFjcGlfb2JqZWN0X3R5cGUgZGVzdGluYXRpb25fdHlwZSwKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmVzdWx0X2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIC8qCiAgKiBleGZpZWxkIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uIC0gZmllbGQgbWFuaXB1bGF0aW9uCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvbW1vbl9idWZmZXJfc2V0dXAgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2xlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXR1bV9jb3VudCk7CithY3BpX2V4X2NvbW1vbl9idWZmZXJfc2V0dXAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgdTMyIGJ1ZmZlcl9sZW5ndGgsIHUzMiAqIGRhdHVtX2NvdW50KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBtYXNrLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgZmllbGRfdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7CithY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgICAgYWNwaV9pbnRlZ2VyIG1hc2ssCisJCQkgICAgICAgYWNwaV9pbnRlZ2VyIGZpZWxkX3ZhbHVlLAorCQkJICAgICAgIHUzMiBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7CiAKIHZvaWQKLWFjcGlfZXhfZ2V0X2J1ZmZlcl9kYXR1bSgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICpkYXR1bSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9ncmFudWxhcml0eSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9vZmZzZXQpOworYWNwaV9leF9nZXRfYnVmZmVyX2RhdHVtKGFjcGlfaW50ZWdlciAqIGRhdHVtLAorCQkJIHZvaWQgKmJ1ZmZlciwKKwkJCSB1MzIgYnVmZmVyX2xlbmd0aCwKKwkJCSB1MzIgYnl0ZV9ncmFudWxhcml0eSwgdTMyIGJ1ZmZlcl9vZmZzZXQpOwogCiB2b2lkCi1hY3BpX2V4X3NldF9idWZmZXJfZGF0dW0gKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgbWVyZ2VkX2RhdHVtLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX2dyYW51bGFyaXR5LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX29mZnNldCk7CithY3BpX2V4X3NldF9idWZmZXJfZGF0dW0oYWNwaV9pbnRlZ2VyIG1lcmdlZF9kYXR1bSwKKwkJCSB2b2lkICpidWZmZXIsCisJCQkgdTMyIGJ1ZmZlcl9sZW5ndGgsCisJCQkgdTMyIGJ5dGVfZ3JhbnVsYXJpdHksIHUzMiBidWZmZXJfb2Zmc2V0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldF9idWZmZXJfZGVzYyk7CithY3BpX2V4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0X2J1ZmZlcl9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfd3JpdGVfZGF0YV90b19maWVsZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJlc3VsdF9kZXNjKTsKLQorYWNwaV9leF93cml0ZV9kYXRhX3RvX2ZpZWxkKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXN1bHRfZGVzYyk7CiAKIC8qCiAgKiBleGZsZGlvIC0gbG93IGxldmVsIGZpZWxkIEkvTwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgpOworYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICB2b2lkICpidWZmZXIsIHUzMiBidWZmZXJfbGVuZ3RoKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgpOworYWNwaV9leF9pbnNlcnRfaW50b19maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgdm9pZCAqYnVmZmVyLCB1MzIgYnVmZmVyX2xlbmd0aCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2FjY2Vzc19yZWdpb24gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3dyaXRlKTsKLQorYWNwaV9leF9hY2Nlc3NfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkgICAgICB1MzIgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCSAgICAgIGFjcGlfaW50ZWdlciAqIHZhbHVlLCB1MzIgcmVhZF93cml0ZSk7CiAKIC8qCiAgKiBleG1pc2MgLSBtaXNjIHN1cHBvcnQgcm91dGluZXMKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXR1cm5fZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXR1cm5fZGVzYywKKwkJCSAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MyLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjMiwKKwkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCisJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZG9fY29uY2F0ZW5hdGUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjMiwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqYWN0dWFsX3JldHVybl9kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9kb19jb25jYXRlbmF0ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjMiwKKwkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZG9fbG9naWNhbF9udW1lcmljX29wICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGludGVnZXIwLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjEsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9naWNhbF9yZXN1bHQpOworYWNwaV9leF9kb19sb2dpY2FsX251bWVyaWNfb3AodTE2IG9wY29kZSwKKwkJCSAgICAgIGFjcGlfaW50ZWdlciBpbnRlZ2VyMCwKKwkJCSAgICAgIGFjcGlfaW50ZWdlciBpbnRlZ2VyMSwgdTggKiBsb2dpY2FsX3Jlc3VsdCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2RvX2xvZ2ljYWxfb3AgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9wZXJhbmQwLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9wZXJhbmQxLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvZ2ljYWxfcmVzdWx0KTsKK2FjcGlfZXhfZG9fbG9naWNhbF9vcCh1MTYgb3Bjb2RlLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMCwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZDEsIHU4ICogbG9naWNhbF9yZXN1bHQpOwogCiBhY3BpX2ludGVnZXIKLWFjcGlfZXhfZG9fbWF0aF9vcCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBvcGVyYW5kMCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIG9wZXJhbmQxKTsKK2FjcGlfZXhfZG9fbWF0aF9vcCh1MTYgb3Bjb2RlLCBhY3BpX2ludGVnZXIgb3BlcmFuZDAsIGFjcGlfaW50ZWdlciBvcGVyYW5kMSk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX211dGV4KHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOworCithY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV9wcm9jZXNzb3Ioc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfbXV0ZXggKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9jcmVhdGVfcmVnaW9uKHU4ICogYW1sX3N0YXJ0LAorCQkgICAgICB1MzIgYW1sX2xlbmd0aCwKKwkJICAgICAgdTggcmVnaW9uX3NwYWNlLCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKKworYWNwaV9zdGF0dXMgYWNwaV9leF9jcmVhdGVfdGFibGVfcmVnaW9uKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOworCithY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV9ldmVudChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKKworYWNwaV9zdGF0dXMgYWNwaV9leF9jcmVhdGVfYWxpYXMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NyZWF0ZV9wcm9jZXNzb3IgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfcG93ZXJfcmVzb3VyY2UgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfcmVnaW9uICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uX3NwYWNlLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfdGFibGVfcmVnaW9uICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfY3JlYXRlX2V2ZW50ICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfY3JlYXRlX2FsaWFzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfY3JlYXRlX21ldGhvZCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sX3N0YXJ0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX2xlbmd0aCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9leF9jcmVhdGVfbWV0aG9kKHU4ICogYW1sX3N0YXJ0LAorCQkgICAgICB1MzIgYW1sX2xlbmd0aCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIC8qCiAgKiBleGNvbmZpZyAtIGR5bmFtaWMgdGFibGUgbG9hZC91bmxvYWQKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfbG9hZF9vcCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGFyZ2V0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9sb2FkX29wKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXQsCisJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9sb2FkX3RhYmxlX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXR1cm5fZGVzYyk7CithY3BpX2V4X2xvYWRfdGFibGVfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9kZXNjKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfdW5sb2FkX3RhYmxlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZGJfaGFuZGxlKTsKLQorYWNwaV9zdGF0dXMgYWNwaV9leF91bmxvYWRfdGFibGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGRiX2hhbmRsZSk7CiAKIC8qCiAgKiBleG11dGV4IC0gbXV0ZXggc3VwcG9ydAogICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9hY3F1aXJlX211dGV4ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0aW1lX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2V4X2FjcXVpcmVfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGltZV9kZXNjLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3JlbGVhc2VfbXV0ZXggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9yZWxlYXNlX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAotdm9pZAotYWNwaV9leF9yZWxlYXNlX2FsbF9tdXRleGVzICgKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpOwordm9pZCBhY3BpX2V4X3JlbGVhc2VfYWxsX211dGV4ZXMoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpOwogCi12b2lkCi1hY3BpX2V4X3VubGlua19tdXRleCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwotCit2b2lkIGFjcGlfZXhfdW5saW5rX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKTsKIAogLyoKICAqIGV4cHJlcCAtIEFDUEkgQU1MIGV4ZWN1dGlvbiAtIHByZXAgdXRpbGl0aWVzCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9mbGFncywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2F0dHJpYnV0ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9wb3NpdGlvbiwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGgpOworYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkJIHU4IGZpZWxkX2ZsYWdzLAorCQkJCSB1OCBmaWVsZF9hdHRyaWJ1dGUsCisJCQkJIHUzMiBmaWVsZF9iaXRfcG9zaXRpb24sIHUzMiBmaWVsZF9iaXRfbGVuZ3RoKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfcHJlcF9maWVsZF92YWx1ZSAoCi0Jc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gICAqaW5mbyk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfZXhfcHJlcF9maWVsZF92YWx1ZShzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAqaW5mbyk7CiAKIC8qCiAgKiBleHN5c3RlbSAtIEludGVyZmFjZSB0byBPUyBzZXJ2aWNlcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fZG9fbm90aWZ5X29wICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp2YWx1ZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7CithY3BpX2V4X3N5c3RlbV9kb19ub3RpZnlfb3AodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdmFsdWUsCisJCQkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOworCithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9kb19zdXNwZW5kKGFjcGlfaW50ZWdlciB0aW1lKTsKKworYWNwaV9zdGF0dXMgYWNwaV9leF9zeXN0ZW1fZG9fc3RhbGwodTMyIHRpbWUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fZG9fc3VzcGVuZCgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHRpbWUpOworYWNwaV9leF9zeXN0ZW1fYWNxdWlyZV9tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0aW1lLAorCQkJICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOworCithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9zaWduYWxfZXZlbnQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fZG9fc3RhbGwgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSk7CithY3BpX2V4X3N5c3RlbV93YWl0X2V2ZW50KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRpbWUsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3lzdGVtX2FjcXVpcmVfbXV0ZXgoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGltZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7CithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9yZXNldF9ldmVudCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV9yZWxlYXNlX211dGV4KAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3lzdGVtX3NpZ25hbF9ldmVudCgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV93YWl0X2V2ZW50KAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRpbWUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fcmVzZXRfZXZlbnQoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlKGFjcGlfaGFuZGxlIHNlbWFwaG9yZSwgdTE2IHRpbWVvdXQpOwogCiAvKgogICogZXhvcGFyZzEgLSBBQ1BJIEFNTCBleGVjdXRpb24sIDEgb3BlcmFuZAogICovCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfMEFfMFRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMEFfMFRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8xQV8wVF8wUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8xQV8wVF8wUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzFBXzBUXzFSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfMUFfMVRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMUFfMVRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8xQV8xVF8wUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8xQV8xVF8wUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGV4b3BhcmcyIC0gQUNQSSBBTUwgZXhlY3V0aW9uLCAyIG9wZXJhbmRzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8yQV8wVF8wUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8yQV8wVF8wUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzJBXzBUXzFSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzJBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfMkFfMVRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMkFfMVRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8yQV8yVF8xUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzJBXzJUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiAvKgogICogZXhvcGFyZzMgLSBBQ1BJIEFNTCBleGVjdXRpb24sIDMgb3BlcmFuZHMKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfM0FfMVRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8zQV8xVF8xUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGV4b3Bhcmc2IC0gQUNQSSBBTUwgZXhlY3V0aW9uLCA2IG9wZXJhbmRzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV82QV8wVF8xUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiAvKgogICogZXhyZXNvbHYgLSBPYmplY3QgcmVzb2x1dGlvbiBhbmQgZ2V0IHZhbHVlIGZ1bmN0aW9ucwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3RhY2tfcHRyLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipzdGFja19wdHIsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb3BlcmFuZCwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgICpyZXR1cm5fdHlwZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmV0dXJuX2Rlc2MpOwotCithY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kLAorCQkJIGFjcGlfb2JqZWN0X3R5cGUgKiByZXR1cm5fdHlwZSwKKwkJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX2Rlc2MpOwogCiAvKgogICogZXhyZXNudGUgLSByZXNvbHZlIG5hbWVzcGFjZSBub2RlCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqKnN0YWNrX3B0ciwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipzdGFja19wdHIsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGV4cmVzb3AgLSByZXNvbHZlIG9wZXJhbmQgdG8gdmFsdWUKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnN0YWNrX3B0ciwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKHUxNiBvcGNvZGUsCisJCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnN0YWNrX3B0ciwKKwkJCSBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGV4ZHVtcCAtIEludGVycHJldGVyIGRlYnVnIG91dHB1dCByb3V0aW5lcwogICovCi12b2lkCi1hY3BpX2V4X2R1bXBfb3BlcmFuZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCk7Cit2b2lkIGFjcGlfZXhfZHVtcF9vcGVyYW5kKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLCB1MzIgZGVwdGgpOwogCiB2b2lkCi1hY3BpX2V4X2R1bXBfb3BlcmFuZHMgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kcywKLQlhY3BpX2ludGVycHJldGVyX21vZGUgICAgICAgICAgIGludGVycHJldGVyX21vZGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaWRlbnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fbGV2ZWxzLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5vdGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlcik7CithY3BpX2V4X2R1bXBfb3BlcmFuZHModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmRzLAorCQkgICAgICBhY3BpX2ludGVycHJldGVyX21vZGUgaW50ZXJwcmV0ZXJfbW9kZSwKKwkJICAgICAgY2hhciAqaWRlbnQsCisJCSAgICAgIHUzMiBudW1fbGV2ZWxzLAorCQkgICAgICBjaGFyICpub3RlLCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGxpbmVfbnVtYmVyKTsKIAogI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiB2b2lkCi1hY3BpX2V4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3IgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKK2FjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsIHUzMiBmbGFncyk7CiAKLXZvaWQKLWFjcGlfZXhfZHVtcF9ub2RlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCi0KK3ZvaWQgYWNwaV9leF9kdW1wX25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsIHUzMiBmbGFncyk7CisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAogLyoKICAqIGV4bmFtZXMgLSBBTUwgbmFtZXN0cmluZyBzdXBwb3J0CiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2dldF9uYW1lX3N0cmluZyAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICBkYXRhX3R5cGUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5fYW1sX2FkZHJlc3MsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dF9uYW1lX3N0cmluZywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfbmFtZV9sZW5ndGgpOwotCithY3BpX2V4X2dldF9uYW1lX3N0cmluZyhhY3BpX29iamVjdF90eXBlIGRhdGFfdHlwZSwKKwkJCXU4ICogaW5fYW1sX2FkZHJlc3MsCisJCQljaGFyICoqb3V0X25hbWVfc3RyaW5nLCB1MzIgKiBvdXRfbmFtZV9sZW5ndGgpOwogCiAvKgogICogZXhzdG9yZSAtIE9iamVjdCBzdG9yZSBzdXBwb3J0CiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N0b3JlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp2YWxfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2V4X3N0b3JlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnZhbF9kZXNjLAorCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRlc3RfZGVzYywKKwkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0X2NvbnZlcnNpb24pOworYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgIHU4IGltcGxpY2l0X2NvbnZlcnNpb24pOwogCiAjZGVmaW5lIEFDUElfSU1QTElDSVRfQ09OVkVSU0lPTiAgICAgICAgVFJVRQogI2RlZmluZSBBQ1BJX05PX0lNUExJQ0lUX0NPTlZFUlNJT04gICAgIEZBTFNFCiAKLQogLyoKICAqIGV4c3RvcmVuIC0gcmVzb2x2ZS9zdG9yZSBvYmplY3QKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV9vYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipzb3VyY2VfZGVzY19wdHIsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0YXJnZXRfdHlwZSwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZXhfcmVzb2x2ZV9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnNvdXJjZV9kZXNjX3B0ciwKKwkJICAgICAgIGFjcGlfb2JqZWN0X3R5cGUgdGFyZ2V0X3R5cGUsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipuZXdfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRlc3RfZGVzYywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqbmV3X2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIC8qCiAgKiBleHN0b3JvYiAtIHN0b3JlIG9iamVjdCAtIGJ1ZmZlci9zdHJpbmcKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfYnVmZmVyX3RvX2J1ZmZlciAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGFyZ2V0X2Rlc2MpOworYWNwaV9leF9zdG9yZV9idWZmZXJfdG9fYnVmZmVyKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhcmdldF9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfc3RyaW5nX3RvX3N0cmluZyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGFyZ2V0X2Rlc2MpOwotCithY3BpX2V4X3N0b3JlX3N0cmluZ190b19zdHJpbmcodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGFyZ2V0X2Rlc2MpOwogCiAvKgogICogZXhjb3B5IC0gb2JqZWN0IGNvcHkKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfY29weV9pbnRlZ2VyX3RvX2luZGV4X2ZpZWxkICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YXJnZXRfZGVzYyk7CithY3BpX2V4X2NvcHlfaW50ZWdlcl90b19pbmRleF9maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCQkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGFyZ2V0X2Rlc2MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jb3B5X2ludGVnZXJfdG9fYmFua19maWVsZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGFyZ2V0X2Rlc2MpOworYWNwaV9leF9jb3B5X2ludGVnZXJfdG9fYmFua19maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXRfZGVzYyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvcHlfZGF0YV90b19uYW1lZF9maWVsZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CithY3BpX2V4X2NvcHlfZGF0YV90b19uYW1lZF9maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCQkgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jb3B5X2ludGVnZXJfdG9fYnVmZmVyX2ZpZWxkICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YXJnZXRfZGVzYyk7Ci0KK2FjcGlfZXhfY29weV9pbnRlZ2VyX3RvX2J1ZmZlcl9maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCQkgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhcmdldF9kZXNjKTsKIAogLyoKICAqIGV4dXRpbHMgLSBpbnRlcnByZXRlci9zY2FubmVyIHV0aWxpdGllcwogICovCi1hY3BpX3N0YXR1cwotYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlciAoCi0Jdm9pZCk7CithY3BpX3N0YXR1cyBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKHZvaWQpOwogCi12b2lkCi1hY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIgKAotCXZvaWQpOwordm9pZCBhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIodm9pZCk7CiAKLXZvaWQKLWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKK3ZvaWQgYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CiAKLXU4Ci1hY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZSk7Cit1OCBhY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sodTMyIHJ1bGUpOwogCi12b2lkCi1hY3BpX2V4X3JlbGVhc2VfZ2xvYmFsX2xvY2sgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2VkKTsKK3ZvaWQgYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrKHU4IGxvY2tlZCk7CiAKLXZvaWQKLWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY19pZCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfc3RyaW5nKTsKK3ZvaWQgYWNwaV9leF9laXNhX2lkX3RvX3N0cmluZyh1MzIgbnVtZXJpY19pZCwgY2hhciAqb3V0X3N0cmluZyk7CiAKLXZvaWQKLWFjcGlfZXhfdW5zaWduZWRfaW50ZWdlcl90b19zdHJpbmcgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0X3N0cmluZyk7Ci0KK3ZvaWQgYWNwaV9leF91bnNpZ25lZF9pbnRlZ2VyX3RvX3N0cmluZyhhY3BpX2ludGVnZXIgdmFsdWUsIGNoYXIgKm91dF9zdHJpbmcpOwogCiAvKgogICogZXhyZWdpb24gLSBkZWZhdWx0IG9wX3JlZ2lvbiBoYW5kbGVycwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCk7CithY3BpX2V4X3N5c3RlbV9tZW1vcnlfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkJICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJCSAgICB1MzIgYml0X3dpZHRoLAorCQkJCSAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCQkgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LAorCQkJCSAgICB2b2lkICpyZWdpb25fY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV9pb19zcGFjZV9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW9uX2NvbnRleHQpOworYWNwaV9leF9zeXN0ZW1faW9fc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkJYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJdTMyIGJpdF93aWR0aCwKKwkJCQlhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCQl2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcGNpX2NvbmZpZ19zcGFjZV9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW9uX2NvbnRleHQpOworYWNwaV9leF9wY2lfY29uZmlnX3NwYWNlX2hhbmRsZXIodTMyIGZ1bmN0aW9uLAorCQkJCSBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCQkgdTMyIGJpdF93aWR0aCwKKwkJCQkgYWNwaV9pbnRlZ2VyICogdmFsdWUsCisJCQkJIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqcmVnaW9uX2NvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jbW9zX3NwYWNlX2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCk7CithY3BpX2V4X2Ntb3Nfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgIHUzMiBiaXRfd2lkdGgsCisJCQkgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCSAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqcmVnaW9uX2NvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9wY2lfYmFyX3NwYWNlX2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCk7CithY3BpX2V4X3BjaV9iYXJfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgICAgIHUzMiBiaXRfd2lkdGgsCisJCQkgICAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCSAgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqcmVnaW9uX2NvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9lbWJlZGRlZF9jb250cm9sbGVyX3NwYWNlX2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCk7CithY3BpX2V4X2VtYmVkZGVkX2NvbnRyb2xsZXJfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkJCSAgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJCSAgdTMyIGJpdF93aWR0aCwKKwkJCQkJICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCQkJICB2b2lkICpoYW5kbGVyX2NvbnRleHQsCisJCQkJCSAgdm9pZCAqcmVnaW9uX2NvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zbV9idXNfc3BhY2VfaGFuZGxlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIGFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfd2lkdGgsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2lvbl9jb250ZXh0KTsKLQorYWNwaV9leF9zbV9idXNfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJICAgICB1MzIgYml0X3dpZHRoLAorCQkJICAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCSAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2RhdGFfdGFibGVfc3BhY2VfaGFuZGxlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIGFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfd2lkdGgsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2lvbl9jb250ZXh0KTsKK2FjcGlfZXhfZGF0YV90YWJsZV9zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKKwkJCQkgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJIHUzMiBiaXRfd2lkdGgsCisJCQkJIGFjcGlfaW50ZWdlciAqIHZhbHVlLAorCQkJCSB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KTsKIAotI2VuZGlmIC8qIF9fSU5URVJQX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fSU5URVJQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaCBiL2luY2x1ZGUvYWNwaS9hY2xvY2FsLmgKaW5kZXggMDMwZTY0MS4uOWZiYTBmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNsb2NhbC5oCkBAIC00NCwxNyArNDQsMjAgQEAKICNpZm5kZWYgX19BQ0xPQ0FMX0hfXwogI2RlZmluZSBfX0FDTE9DQUxfSF9fCiAKKyNkZWZpbmUgQUNQSV9XQUlUX0ZPUkVWRVIgICAgICAgICAgICAgICAweEZGRkYJLyogdTE2LCBhcyBwZXIgQUNQSSBzcGVjICovCiAKLSNkZWZpbmUgQUNQSV9XQUlUX0ZPUkVWRVIgICAgICAgICAgICAgICAweEZGRkYgIC8qIHUxNiwgYXMgcGVyIEFDUEkgc3BlYyAqLwotCi10eXBlZGVmIHZvaWQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX211dGV4OwotdHlwZWRlZiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9tdXRleF9oYW5kbGU7Ci0KK3R5cGVkZWYgdm9pZCAqYWNwaV9tdXRleDsKK3R5cGVkZWYgdTMyIGFjcGlfbXV0ZXhfaGFuZGxlOwogCiAvKiBUb3RhbCBudW1iZXIgb2YgYW1sIG9wY29kZXMgZGVmaW5lZCAqLwogCiAjZGVmaW5lIEFNTF9OVU1fT1BDT0RFUyAgICAgICAgICAgICAgICAgMHg3RgogCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCitzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlOworc3RydWN0IGFjcGlfb2JqX211dGV4OwordW5pb24gYWNwaV9wYXJzZV9vYmplY3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYyLDcgKzY1LDYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCiAvKgogICogUHJlZGVmaW5lZCBoYW5kbGVzIGZvciB0aGUgbXV0ZXggb2JqZWN0cyB1c2VkIHdpdGhpbiB0aGUgc3Vic3lzdGVtCiAgKiBBbGwgbXV0ZXggb2JqZWN0cyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IGFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZS4KQEAgLTg5LDE0ICs5MSwxMiBAQAogI2RlZmluZSBNQVhfTVVURVggICAgICAgICAgICAgICAgICAgICAgIDEyCiAjZGVmaW5lIE5VTV9NVVRFWCAgICAgICAgICAgICAgICAgICAgICAgTUFYX01VVEVYKzEKIAotCiAjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQogI2lmZGVmIERFRklORV9BQ1BJX0dMT0JBTFMKIAogLyogTmFtZXMgZm9yIHRoZSBtdXRleGVzIHVzZWQgaW4gdGhlIHN1YnN5c3RlbSAqLwogCi1zdGF0aWMgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfbXV0ZXhfbmFtZXNbXSA9Ci17CitzdGF0aWMgY2hhciAqYWNwaV9nYmxfbXV0ZXhfbmFtZXNbXSA9IHsKIAkiQUNQSV9NVFhfRXhlY3V0ZSIsCiAJIkFDUElfTVRYX0ludGVycHJldGVyIiwKIAkiQUNQSV9NVFhfUGFyc2VyIiwKQEAgLTExNSwzNCArMTE1LDI4IEBACiAjZW5kaWYKICNlbmRpZgogCisvKiBPd25lciBJRHMgYXJlIHVzZWQgdG8gdHJhY2sgbmFtZXNwYWNlIG5vZGVzIGZvciBzZWxlY3RpdmUgZGVsZXRpb24gKi8KKwordHlwZWRlZiB1OCBhY3BpX293bmVyX2lkOworI2RlZmluZSBBQ1BJX09XTkVSX0lEX01BWCAgICAgICAgICAgICAgIDB4RkYKKworLyogVGhpcyBUaHJlYWQgSUQgbWVhbnMgdGhhdCB0aGUgbXV0ZXggaXMgbm90IGluIHVzZSAodW5sb2NrZWQpICovCisKKyNkZWZpbmUgQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQgICAgICAgICAodTMyKSAtMQogCiAvKiBUYWJsZSBmb3IgdGhlIGdsb2JhbCBtdXRleGVzICovCiAKLXN0cnVjdCBhY3BpX211dGV4X2luZm8KLXsKLQlhY3BpX211dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRleDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfY291bnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJfaWQ7CitzdHJ1Y3QgYWNwaV9tdXRleF9pbmZvIHsKKwlhY3BpX211dGV4IG11dGV4OworCXUzMiB1c2VfY291bnQ7CisJdTMyIHRocmVhZF9pZDsKIH07CiAKLS8qIFRoaXMgb3duZXIgSUQgbWVhbnMgdGhhdCB0aGUgbXV0ZXggaXMgbm90IGluIHVzZSAodW5sb2NrZWQpICovCi0KLSNkZWZpbmUgQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQgICAgICAgICAodTMyKSAoLTEpCi0KLQogLyogTG9jayBmbGFnIHBhcmFtZXRlciBmb3IgdmFyaW91cyBpbnRlcmZhY2VzICovCiAKICNkZWZpbmUgQUNQSV9NVFhfRE9fTk9UX0xPQ0sgICAgICAgICAgICAwCiAjZGVmaW5lIEFDUElfTVRYX0xPQ0sgICAgICAgICAgICAgICAgICAgMQogCi0KLXR5cGVkZWYgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfb3duZXJfaWQ7Ci0jZGVmaW5lIEFDUElfT1dORVJfVFlQRV9UQUJMRSAgICAgICAgICAgMHgwCi0jZGVmaW5lIEFDUElfT1dORVJfVFlQRV9NRVRIT0QgICAgICAgICAgMHgxCi0jZGVmaW5lIEFDUElfRklSU1RfTUVUSE9EX0lEICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIEFDUElfRklSU1RfVEFCTEVfSUQgICAgICAgICAgICAgMHhGMDAwCi0KLQogLyogRmllbGQgYWNjZXNzIGdyYW51bGFyaXRpZXMgKi8KIAogI2RlZmluZSBBQ1BJX0ZJRUxEX0JZVEVfR1JBTlVMQVJJVFkgICAgIDEKQEAgLTE1MCw3ICsxNDQsNiBAQAogI2RlZmluZSBBQ1BJX0ZJRUxEX0RXT1JEX0dSQU5VTEFSSVRZICAgIDQKICNkZWZpbmUgQUNQSV9GSUVMRF9RV09SRF9HUkFOVUxBUklUWSAgICA4CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogTmFtZXNwYWNlIHR5cGVkZWZzIGFuZCBzdHJ1Y3RzCkBAIC0xNTksMTUgKzE1MiwxMiBAQAogCiAvKiBPcGVyYXRpb25hbCBtb2RlcyBvZiB0aGUgQU1MIGludGVycHJldGVyL3NjYW5uZXIgKi8KIAotdHlwZWRlZiBlbnVtCi17Ci0JQUNQSV9JTU9ERV9MT0FEX1BBU1MxICAgICAgICAgICAgICAgPSAweDAxLAotCUFDUElfSU1PREVfTE9BRF9QQVNTMiAgICAgICAgICAgICAgID0gMHgwMiwKLQlBQ1BJX0lNT0RFX0VYRUNVVEUgICAgICAgICAgICAgICAgICA9IDB4MEUKLQordHlwZWRlZiBlbnVtIHsKKwlBQ1BJX0lNT0RFX0xPQURfUEFTUzEgPSAweDAxLAorCUFDUElfSU1PREVfTE9BRF9QQVNTMiA9IDB4MDIsCisJQUNQSV9JTU9ERV9FWEVDVVRFID0gMHgwRQogfSBhY3BpX2ludGVycHJldGVyX21vZGU7CiAKLQogLyoKICAqIFRoZSBOb2RlIGRlc2NyaWJlcyBhIG5hbWVkIG9iamVjdCB0aGF0IGFwcGVhcnMgaW4gdGhlIEFNTAogICogQW4gYWNwaV9ub2RlIGlzIHVzZWQgdG8gc3RvcmUgTm9kZXMuCkBAIC0xNzUsMzQgKzE2NSwzNyBAQAogICogZGF0YV90eXBlIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGRlc2NyaXB0b3JzLCBhbmQgTVVTVAogICogYmUgdGhlIGZpcnN0IGJ5dGUgaW4gdGhpcyBzdHJ1Y3R1cmUuCiAgKi8KLXVuaW9uIGFjcGlfbmFtZV91bmlvbgotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXI7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjaWlbNF07Cit1bmlvbiBhY3BpX25hbWVfdW5pb24geworCXUzMiBpbnRlZ2VyOworCWNoYXIgYXNjaWlbNF07CiB9OwogCi1zdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZQotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3I7ICAgICAvKiBVc2VkIHRvIGRpZmZlcmVudGlhdGUgb2JqZWN0IGRlc2NyaXB0b3IgdHlwZXMgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOyAgICAgICAgICAgLyogVHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuYW1lICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJfaWQ7Ci0JdW5pb24gYWNwaV9uYW1lX3VuaW9uICAgICAgICAgICAgICAgbmFtZTsgICAgICAgICAgIC8qIEFDUEkgTmFtZSwgYWx3YXlzIDQgY2hhcnMgcGVyIEFDUEkgc3BlYyAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICpvYmplY3Q7ICAgICAgICAvKiBQb2ludGVyIHRvIGF0dGFjaGVkIEFDUEkgb2JqZWN0IChvcHRpb25hbCkgKi8KLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAqY2hpbGQ7ICAgICAgICAgLyogRmlyc3QgY2hpbGQgKi8KLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAqcGVlcjsgICAgICAgICAgLyogTmV4dCBwZWVyKi8KLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VfY291bnQ7IC8qIEN1cnJlbnQgY291bnQgb2YgcmVmZXJlbmNlcyBhbmQgY2hpbGRyZW4gKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKLX07CitzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSB7CisJdTggZGVzY3JpcHRvcjsJCS8qIFVzZWQgdG8gZGlmZmVyZW50aWF0ZSBvYmplY3QgZGVzY3JpcHRvciB0eXBlcyAqLworCXU4IHR5cGU7CQkvKiBUeXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWUgKi8KKwl1MTYgcmVmZXJlbmNlX2NvdW50OwkvKiBDdXJyZW50IGNvdW50IG9mIHJlZmVyZW5jZXMgYW5kIGNoaWxkcmVuICovCisJdW5pb24gYWNwaV9uYW1lX3VuaW9uIG5hbWU7CS8qIEFDUEkgTmFtZSwgYWx3YXlzIDQgY2hhcnMgcGVyIEFDUEkgc3BlYyAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdDsJLyogUG9pbnRlciB0byBhdHRhY2hlZCBBQ1BJIG9iamVjdCAob3B0aW9uYWwpICovCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkOwkvKiBGaXJzdCBjaGlsZCAqLworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwZWVyOwkvKiBOZXh0IHBlZXIgKi8KKwl1OCBvd25lcl9pZDsJCS8qIFdobyBjcmVhdGVkIHRoaXMgbm9kZSAqLworCXU4IGZsYWdzOwogCisJLyogRmllbGRzIHVzZWQgYnkgdGhlIEFTTCBjb21waWxlciBvbmx5ICovCisKKyNpZmRlZiBBQ1BJX0FTTF9DT01QSUxFUgorCXUzMiB2YWx1ZTsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisjZW5kaWYKK307CiAKICNkZWZpbmUgQUNQSV9FTlRSWV9OT1RfRk9VTkQgICAgICAgICAgICBOVUxMCiAKLQogLyogTm9kZSBmbGFncyAqLwogCiAjZGVmaW5lIEFOT0JKX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgMHgwMQogI2RlZmluZSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUICAgICAgICAgIDB4MDIKLSNkZWZpbmUgQU5PQkpfREFUQV9XSURUSF8zMiAgICAgICAgICAgICAweDA0ICAgICAvKiBQYXJlbnQgdGFibGUgaXMgNjQtYml0cyAqLworI2RlZmluZSBBTk9CSl9EQVRBX1dJRFRIXzMyICAgICAgICAgICAgIDB4MDQJLyogUGFyZW50IHRhYmxlIGlzIDY0LWJpdHMgKi8KICNkZWZpbmUgQU5PQkpfTUVUSE9EX0FSRyAgICAgICAgICAgICAgICAweDA4CiAjZGVmaW5lIEFOT0JKX01FVEhPRF9MT0NBTCAgICAgICAgICAgICAgMHgxMAogI2RlZmluZSBBTk9CSl9NRVRIT0RfTk9fUkVUVkFMICAgICAgICAgIDB4MjAKQEAgLTIxMiw5MSArMjA1LDc3IEBACiAvKgogICogQUNQSSBUYWJsZSBEZXNjcmlwdG9yLiAgT25lIHBlciBBQ1BJIHRhYmxlCiAgKi8KLXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICpwcmV2OwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKm5leHQ7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqaW5zdGFsbGVkX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqcG9pbnRlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQ7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbF9hZGRyZXNzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX2xlbmd0aDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQlhY3BpX293bmVyX2lkICAgICAgICAgICAgICAgICAgIHRhYmxlX2lkOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb247Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRfaW50b19uYW1lc3BhY2U7CitzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICpwcmV2OworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKm5leHQ7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqaW5zdGFsbGVkX2Rlc2M7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpwb2ludGVyOworCXU4ICphbWxfc3RhcnQ7CisJdTY0IHBoeXNpY2FsX2FkZHJlc3M7CisJdTMyIGFtbF9sZW5ndGg7CisJYWNwaV9zaXplIGxlbmd0aDsKKwlhY3BpX293bmVyX2lkIG93bmVyX2lkOworCXU4IHR5cGU7CisJdTggYWxsb2NhdGlvbjsKKwl1OCBsb2FkZWRfaW50b19uYW1lc3BhY2U7CiB9OwogCi1zdHJ1Y3QgYWNwaV90YWJsZV9saXN0Ci17Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqbmV4dDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Oworc3RydWN0IGFjcGlfdGFibGVfbGlzdCB7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqbmV4dDsKKwl1MzIgY291bnQ7CiB9OwogCi0KLXN0cnVjdCBhY3BpX2ZpbmRfY29udGV4dAotewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlYXJjaF9mb3I7Ci0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAqbGlzdDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb3VudDsKK3N0cnVjdCBhY3BpX2ZpbmRfY29udGV4dCB7CisJY2hhciAqc2VhcmNoX2ZvcjsKKwlhY3BpX2hhbmRsZSAqbGlzdDsKKwl1MzIgKmNvdW50OwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9uc19zZWFyY2hfZGF0YQotewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7CitzdHJ1Y3QgYWNwaV9uc19zZWFyY2hfZGF0YSB7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiB9OwogCi0KIC8qCiAgKiBQcmVkZWZpbmVkIE5hbWVzcGFjZSBpdGVtcwogICovCi1zdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzCi17Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsOworc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyB7CisJY2hhciAqbmFtZTsKKwl1OCB0eXBlOworCWNoYXIgKnZhbDsKIH07CiAKLQogLyogT2JqZWN0IHR5cGVzIHVzZWQgZHVyaW5nIHBhY2thZ2UgY29waWVzICovCiAKLQogI2RlZmluZSBBQ1BJX0NPUFlfVFlQRV9TSU1QTEUgICAgICAgICAgIDAKICNkZWZpbmUgQUNQSV9DT1BZX1RZUEVfUEFDS0FHRSAgICAgICAgICAxCiAKIC8qIEluZm8gc3RydWN0dXJlIHVzZWQgdG8gY29udmVydCBleHRlcm5hbDwtPmludGVybmFsIG5hbWVzdHJpbmdzICovCiAKLXN0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbwotewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVybmFsX25hbWU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmV4dF9leHRlcm5hbF9jaGFyOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmludGVybmFsX25hbWU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2VnbWVudHM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2FyYXRzOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHlfcXVhbGlmaWVkOworc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvIHsKKwljaGFyICpleHRlcm5hbF9uYW1lOworCWNoYXIgKm5leHRfZXh0ZXJuYWxfY2hhcjsKKwljaGFyICppbnRlcm5hbF9uYW1lOworCXUzMiBsZW5ndGg7CisJdTMyIG51bV9zZWdtZW50czsKKwl1MzIgbnVtX2NhcmF0czsKKwl1OCBmdWxseV9xdWFsaWZpZWQ7CiB9OwogCi0KIC8qIEZpZWxkIGNyZWF0aW9uIGluZm8gKi8KIAotc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8KLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpyZWdpb25fbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpmaWVsZF9ub2RlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnJlZ2lzdGVyX25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGF0YV9yZWdpc3Rlcl9ub2RlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFua192YWx1ZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9wb3NpdGlvbjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9mbGFnczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU7CitzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyB7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnJlZ2lvbl9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpmaWVsZF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpc3Rlcl9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkYXRhX3JlZ2lzdGVyX25vZGU7CisJdTMyIGJhbmtfdmFsdWU7CisJdTMyIGZpZWxkX2JpdF9wb3NpdGlvbjsKKwl1MzIgZmllbGRfYml0X2xlbmd0aDsKKwl1OCBmaWVsZF9mbGFnczsKKwl1OCBhdHRyaWJ1dGU7CisJdTggZmllbGRfdHlwZTsKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRXZlbnQgdHlwZWRlZnMgYW5kIHN0cnVjdHMKQEAgLTMwNSwxMDggKzI4NCw5NSBAQAogCiAvKiBEaXNwYXRjaCBpbmZvIGZvciBlYWNoIEdQRSAtLSBlaXRoZXIgYSBtZXRob2Qgb3IgaGFuZGxlciwgY2Fubm90IGJlIGJvdGggKi8KIAotc3RydWN0IGFjcGlfaGFuZGxlcl9pbmZvCi17Ci0JYWNwaV9ldmVudF9oYW5kbGVyICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M7ICAgICAgICAvKiBBZGRyZXNzIG9mIGhhbmRsZXIsIGlmIGFueSAqLwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dDsgICAgICAgLyogQ29udGV4dCB0byBiZSBwYXNzZWQgdG8gaGFuZGxlciAqLwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICAgICAqbWV0aG9kX25vZGU7ICAgLyogTWV0aG9kIG5vZGUgZm9yIHRoaXMgR1BFIGxldmVsIChzYXZlZCkgKi8KK3N0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbyB7CisJYWNwaV9ldmVudF9oYW5kbGVyIGFkZHJlc3M7CS8qIEFkZHJlc3Mgb2YgaGFuZGxlciwgaWYgYW55ICovCisJdm9pZCAqY29udGV4dDsJCS8qIENvbnRleHQgdG8gYmUgcGFzc2VkIHRvIGhhbmRsZXIgKi8KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGU7CS8qIE1ldGhvZCBub2RlIGZvciB0aGlzIEdQRSBsZXZlbCAoc2F2ZWQpICovCiB9OwogCi11bmlvbiBhY3BpX2dwZV9kaXNwYXRjaF9pbmZvCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgICAgICptZXRob2Rfbm9kZTsgICAvKiBNZXRob2Qgbm9kZSBmb3IgdGhpcyBHUEUgbGV2ZWwgKi8KLQlzdHJ1Y3QgYWNwaV9oYW5kbGVyX2luZm8gICAgICAgICAgICAgICAgKmhhbmRsZXI7Cit1bmlvbiBhY3BpX2dwZV9kaXNwYXRjaF9pbmZvIHsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGU7CS8qIE1ldGhvZCBub2RlIGZvciB0aGlzIEdQRSBsZXZlbCAqLworCXN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbyAqaGFuZGxlcjsKIH07CiAKIC8qCiAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIEdQRSwgb25lIHBlciBlYWNoIEdQRSBpbiBhbiBhcnJheS4KICAqIE5PVEU6IEltcG9ydGFudCB0byBrZWVwIHRoaXMgc3RydWN0IGFzIHNtYWxsIGFzIHBvc3NpYmxlLgogICovCi1zdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbwotewotCXVuaW9uIGFjcGlfZ3BlX2Rpc3BhdGNoX2luZm8gICAgZGlzcGF0Y2g7ICAgICAgIC8qIEVpdGhlciBNZXRob2Qgb3IgSGFuZGxlciAqLwotCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICAgICAgICAgICAqcmVnaXN0ZXJfaW5mbzsgLyogQmFja3BvaW50ZXIgdG8gcmVnaXN0ZXIgaW5mbyAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogTWlzYyBpbmZvIGFib3V0IHRoaXMgR1BFICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2JpdDsgICAvKiBUaGlzIEdQRSBiaXQgd2l0aGluIHRoZSByZWdpc3RlciAqLworc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8geworCXVuaW9uIGFjcGlfZ3BlX2Rpc3BhdGNoX2luZm8gZGlzcGF0Y2g7CS8qIEVpdGhlciBNZXRob2Qgb3IgSGFuZGxlciAqLworCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpyZWdpc3Rlcl9pbmZvOwkvKiBCYWNrcG9pbnRlciB0byByZWdpc3RlciBpbmZvICovCisJdTggZmxhZ3M7CQkvKiBNaXNjIGluZm8gYWJvdXQgdGhpcyBHUEUgKi8KKwl1OCByZWdpc3Rlcl9iaXQ7CS8qIFRoaXMgR1BFIGJpdCB3aXRoaW4gdGhlIHJlZ2lzdGVyICovCiB9OwogCiAvKiBJbmZvcm1hdGlvbiBhYm91dCBhIEdQRSByZWdpc3RlciBwYWlyLCBvbmUgcGVyIGVhY2ggc3RhdHVzL2VuYWJsZSBwYWlyIGluIGFuIGFycmF5ICovCiAKLXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvCi17Ci0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICAgICAgICAgIHN0YXR1c19hZGRyZXNzOyAvKiBBZGRyZXNzIG9mIHN0YXR1cyByZWcgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgICAgICAgICAgZW5hYmxlX2FkZHJlc3M7IC8qIEFkZHJlc3Mgb2YgZW5hYmxlIHJlZyAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfZm9yX3dha2U7IC8qIEdQRXMgdG8ga2VlcCBlbmFibGVkIHdoZW4gc2xlZXBpbmcgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2Zvcl9ydW47IC8qIEdQRXMgdG8ga2VlcCBlbmFibGVkIHdoZW4gcnVubmluZyAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2dwZV9udW1iZXI7IC8qIEJhc2UgR1BFIG51bWJlciBmb3IgdGhpcyByZWdpc3RlciAqLworc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8geworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBzdGF0dXNfYWRkcmVzczsJLyogQWRkcmVzcyBvZiBzdGF0dXMgcmVnICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGVuYWJsZV9hZGRyZXNzOwkvKiBBZGRyZXNzIG9mIGVuYWJsZSByZWcgKi8KKwl1OCBlbmFibGVfZm9yX3dha2U7CS8qIEdQRXMgdG8ga2VlcCBlbmFibGVkIHdoZW4gc2xlZXBpbmcgKi8KKwl1OCBlbmFibGVfZm9yX3J1bjsJLyogR1BFcyB0byBrZWVwIGVuYWJsZWQgd2hlbiBydW5uaW5nICovCisJdTggYmFzZV9ncGVfbnVtYmVyOwkvKiBCYXNlIEdQRSBudW1iZXIgZm9yIHRoaXMgcmVnaXN0ZXIgKi8KIH07CiAKIC8qCiAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIEdQRSByZWdpc3RlciBibG9jaywgb25lIHBlciBlYWNoIGluc3RhbGxlZCBibG9jayAtLQogICogR1BFMCwgR1BFMSwgYW5kIG9uZSBwZXIgZWFjaCBpbnN0YWxsZWQgR1BFIEJsb2NrIERldmljZS4KICAqLwotc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8KLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKm5vZGU7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAgICAgICAgICpwcmV2aW91czsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICAgICAgICAgKm5leHQ7Ci0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAgICAgICAgICp4cnVwdF9ibG9jazsgICAvKiBCYWNrcG9pbnRlciB0byBpbnRlcnJ1cHQgYmxvY2sgKi8KLQlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAgICAgICAgICAgKnJlZ2lzdGVyX2luZm87IC8qIE9uZSBwZXIgR1BFIHJlZ2lzdGVyIHBhaXIgKi8KLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICAgICAgICAgKmV2ZW50X2luZm87ICAgIC8qIE9uZSBmb3IgZWFjaCBHUEUgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgICAgICAgICAgYmxvY2tfYWRkcmVzczsgIC8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgYmxvY2sgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQ7IC8qIE51bWJlciBvZiByZWdpc3RlciBwYWlycyBpbiBibG9jayAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19iYXNlX251bWJlcjsvKiBCYXNlIEdQRSBudW1iZXIgZm9yIHRoaXMgYmxvY2sgKi8KK3N0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvIHsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqcHJldmlvdXM7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKm5leHQ7CisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKnhydXB0X2Jsb2NrOwkvKiBCYWNrcG9pbnRlciB0byBpbnRlcnJ1cHQgYmxvY2sgKi8KKwlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqcmVnaXN0ZXJfaW5mbzsJLyogT25lIHBlciBHUEUgcmVnaXN0ZXIgcGFpciAqLworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpldmVudF9pbmZvOwkvKiBPbmUgZm9yIGVhY2ggR1BFICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGJsb2NrX2FkZHJlc3M7CS8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgYmxvY2sgKi8KKwl1MzIgcmVnaXN0ZXJfY291bnQ7CS8qIE51bWJlciBvZiByZWdpc3RlciBwYWlycyBpbiBibG9jayAqLworCXU4IGJsb2NrX2Jhc2VfbnVtYmVyOwkvKiBCYXNlIEdQRSBudW1iZXIgZm9yIHRoaXMgYmxvY2sgKi8KIH07CiAKIC8qIEluZm9ybWF0aW9uIGFib3V0IEdQRSBpbnRlcnJ1cHQgaGFuZGxlcnMsIG9uZSBwZXIgZWFjaCBpbnRlcnJ1cHQgbGV2ZWwgdXNlZCBmb3IgR1BFcyAqLwogCi1zdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbwotewotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgICAgICAgICAqcHJldmlvdXM7Ci0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAgICAgICAgICpuZXh0OwotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgICAgICAgICAqZ3BlX2Jsb2NrX2xpc3RfaGVhZDsgLyogTGlzdCBvZiBHUEUgYmxvY2tzIGZvciB0aGlzIHhydXB0ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbDsgICAgLyogU3lzdGVtIGludGVycnVwdCBsZXZlbCAqLworc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8geworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpwcmV2aW91czsKKwlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqbmV4dDsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrX2xpc3RfaGVhZDsJLyogTGlzdCBvZiBHUEUgYmxvY2tzIGZvciB0aGlzIHhydXB0ICovCisJdTMyIGludGVycnVwdF9udW1iZXI7CS8qIFN5c3RlbSBpbnRlcnJ1cHQgbnVtYmVyICovCiB9OwogCi0KLXN0cnVjdCBhY3BpX2dwZV93YWxrX2luZm8KLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKmdwZV9kZXZpY2U7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAgICAgICAgICpncGVfYmxvY2s7CitzdHJ1Y3QgYWNwaV9ncGVfd2Fsa19pbmZvIHsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZ3BlX2RldmljZTsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwogfTsKIAotCi10eXBlZGVmIGFjcGlfc3RhdHVzICgqQUNQSV9HUEVfQ0FMTEJBQ0spICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOwotCit0eXBlZGVmIGFjcGlfc3RhdHVzKCpBQ1BJX0dQRV9DQUxMQkFDSykgKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICoKKwkJCQkJIGdwZV94cnVwdF9pbmZvLAorCQkJCQkgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKgorCQkJCQkgZ3BlX2Jsb2NrKTsKIAogLyogSW5mb3JtYXRpb24gYWJvdXQgZWFjaCBwYXJ0aWN1bGFyIGZpeGVkIGV2ZW50ICovCiAKLXN0cnVjdCBhY3BpX2ZpeGVkX2V2ZW50X2hhbmRsZXIKLXsKLQlhY3BpX2V2ZW50X2hhbmRsZXIgICAgICAgICAgICAgIGhhbmRsZXI7ICAgICAgICAvKiBBZGRyZXNzIG9mIGhhbmRsZXIuICovCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dDsgICAgICAgLyogQ29udGV4dCB0byBiZSBwYXNzZWQgdG8gaGFuZGxlciAqLworc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaGFuZGxlciB7CisJYWNwaV9ldmVudF9oYW5kbGVyIGhhbmRsZXI7CS8qIEFkZHJlc3Mgb2YgaGFuZGxlci4gKi8KKwl2b2lkICpjb250ZXh0OwkJLyogQ29udGV4dCB0byBiZSBwYXNzZWQgdG8gaGFuZGxlciAqLwogfTsKIAotc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaW5mbwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JlZ2lzdGVyX2lkOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2JpdF9tYXNrOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2JpdF9tYXNrOworc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaW5mbyB7CisJdTggc3RhdHVzX3JlZ2lzdGVyX2lkOworCXU4IGVuYWJsZV9yZWdpc3Rlcl9pZDsKKwl1MTYgc3RhdHVzX2JpdF9tYXNrOworCXUxNiBlbmFibGVfYml0X21hc2s7CiB9OwogCiAvKiBJbmZvcm1hdGlvbiB1c2VkIGR1cmluZyBmaWVsZCBwcm9jZXNzaW5nICovCiAKLXN0cnVjdCBhY3BpX2ZpZWxkX2luZm8KLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfZmllbGQ7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9mbGFnOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnX2xlbmd0aDsKK3N0cnVjdCBhY3BpX2ZpZWxkX2luZm8geworCXU4IHNraXBfZmllbGQ7CisJdTggZmllbGRfZmxhZzsKKwl1MzIgcGtnX2xlbmd0aDsKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogR2VuZXJpYyAic3RhdGUiIG9iamVjdCBmb3Igc3RhY2tzCkBAIC00MTksMTQgKzM4NSw2IEBACiAjZGVmaW5lIEFDUElfQ09OVFJPTF9QUkVESUNBVEVfRkFMU0UgICAgICAgICAweEMzCiAjZGVmaW5lIEFDUElfQ09OVFJPTF9QUkVESUNBVEVfVFJVRSAgICAgICAgICAweEM0CiAKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgOwotc3RydWN0IGFjcGlfb2JqX211dGV4OwotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgIDsKLQotCiAjZGVmaW5lIEFDUElfU1RBVEVfQ09NTU9OICAgICAgICAgICAgICAgICAgLyogVHdvIDMyLWJpdCBmaWVsZHMgYW5kIGEgcG9pbnRlciAqL1wKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGU7ICAgICAgICAgIC8qIFRvIGRpZmZlcmVudGlhdGUgdmFyaW91cyBpbnRlcm5hbCBvYmpzICovXAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOyAgICAgIFwKQEAgLTQzNSwxNDcgKzM5MywxMTIgQEAKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsgICBcCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHQ7ICAgICAgXAogCi1zdHJ1Y3QgYWNwaV9jb21tb25fc3RhdGUKLXsKLQlBQ1BJX1NUQVRFX0NPTU1PTgotfTsKLQorc3RydWN0IGFjcGlfY29tbW9uX3N0YXRlIHsKK0FDUElfU1RBVEVfQ09NTU9OfTsKIAogLyoKICAqIFVwZGF0ZSBzdGF0ZSAtIHVzZWQgdG8gdHJhdmVyc2UgY29tcGxleCBvYmplY3RzIHN1Y2ggYXMgcGFja2FnZXMKICAqLwotc3RydWN0IGFjcGlfdXBkYXRlX3N0YXRlCi17Ci0JQUNQSV9TVEFURV9DT01NT04KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAqb2JqZWN0Oworc3RydWN0IGFjcGlfdXBkYXRlX3N0YXRlIHsKKwlBQ1BJX1NUQVRFX0NPTU1PTiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7CiB9OwogCi0KIC8qCiAgKiBQa2cgc3RhdGUgLSB1c2VkIHRvIHRyYXZlcnNlIG5lc3RlZCBwYWNrYWdlIHN0cnVjdHVyZXMKICAqLwotc3RydWN0IGFjcGlfcGtnX3N0YXRlCi17Ci0JQUNQSV9TVEFURV9DT01NT04KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAqc291cmNlX29iamVjdDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAqZGVzdF9vYmplY3Q7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAgICAgKndhbGtfc3RhdGU7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRoaXNfdGFyZ2V0X29iajsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGFja2FnZXM7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CitzdHJ1Y3QgYWNwaV9wa2dfc3RhdGUgeworCUFDUElfU1RBVEVfQ09NTU9OIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3Q7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9vYmplY3Q7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKKwl2b2lkICp0aGlzX3RhcmdldF9vYmo7CisJdTMyIG51bV9wYWNrYWdlczsKKwl1MTYgaW5kZXg7CiB9OwogCi0KIC8qCiAgKiBDb250cm9sIHN0YXRlIC0gb25lIHBlciBpZi9lbHNlIGFuZCB3aGlsZSBjb25zdHJ1Y3RzLgogICogQWxsb3dzIG5lc3Rpbmcgb2YgdGhlc2UgY29uc3RydWN0cwogICovCi1zdHJ1Y3QgYWNwaV9jb250cm9sX3N0YXRlCi17Ci0JQUNQSV9TVEFURV9DT01NT04KLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqcHJlZGljYXRlX29wOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfcHJlZGljYXRlX3N0YXJ0OyAgIC8qIFN0YXJ0IG9mIGlmL3doaWxlIHByZWRpY2F0ZSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYWNrYWdlX2VuZDsgICAgICAgICAgIC8qIEVuZCBvZiBpZi93aGlsZSBibG9jayAqLwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZTsKK3N0cnVjdCBhY3BpX2NvbnRyb2xfc3RhdGUgeworCUFDUElfU1RBVEVfQ09NTU9OIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwcmVkaWNhdGVfb3A7CisJdTggKmFtbF9wcmVkaWNhdGVfc3RhcnQ7CS8qIFN0YXJ0IG9mIGlmL3doaWxlIHByZWRpY2F0ZSAqLworCXU4ICpwYWNrYWdlX2VuZDsJLyogRW5kIG9mIGlmL3doaWxlIGJsb2NrICovCisJdTE2IG9wY29kZTsKIH07CiAKLQogLyoKICAqIFNjb3BlIHN0YXRlIC0gY3VycmVudCBzY29wZSBkdXJpbmcgbmFtZXNwYWNlIGxvb2t1cHMKICAqLwotc3RydWN0IGFjcGlfc2NvcGVfc3RhdGUKLXsKLQlBQ1BJX1NUQVRFX0NPTU1PTgotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICpub2RlOworc3RydWN0IGFjcGlfc2NvcGVfc3RhdGUgeworCUFDUElfU1RBVEVfQ09NTU9OIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9wc2NvcGVfc3RhdGUKLXsKLQlBQ1BJX1NUQVRFX0NPTU1PTgotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgICAgICpvcDsgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgb3AgYmVpbmcgcGFyc2VkICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ19lbmQ7ICAgICAgICAgICAgICAgLyogQ3VycmVudCBhcmd1bWVudCBlbmQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGtnX2VuZDsgICAgICAgICAgICAgICAvKiBDdXJyZW50IHBhY2thZ2UgZW5kICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX2xpc3Q7ICAgICAgICAgICAgICAgLyogTmV4dCBhcmd1bWVudCB0byBwYXJzZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ19jb3VudDsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmaXhlZCBhcmd1bWVudHMgKi8KK3N0cnVjdCBhY3BpX3BzY29wZV9zdGF0ZSB7CisJQUNQSV9TVEFURV9DT01NT04gdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOwkvKiBDdXJyZW50IG9wIGJlaW5nIHBhcnNlZCAqLworCXU4ICphcmdfZW5kOwkJLyogQ3VycmVudCBhcmd1bWVudCBlbmQgKi8KKwl1OCAqcGtnX2VuZDsJCS8qIEN1cnJlbnQgcGFja2FnZSBlbmQgKi8KKwl1MzIgYXJnX2xpc3Q7CQkvKiBOZXh0IGFyZ3VtZW50IHRvIHBhcnNlICovCisJdTMyIGFyZ19jb3VudDsJCS8qIE51bWJlciBvZiBmaXhlZCBhcmd1bWVudHMgKi8KIH07CiAKLQogLyoKICAqIFRocmVhZCBzdGF0ZSAtIG9uZSBwZXIgdGhyZWFkIGFjcm9zcyBtdWx0aXBsZSB3YWxrIHN0YXRlcy4gIE11bHRpcGxlIHdhbGsKICAqIHN0YXRlcyBhcmUgY3JlYXRlZCB3aGVuIHRoZXJlIGFyZSBuZXN0ZWQgY29udHJvbCBtZXRob2RzIGV4ZWN1dGluZy4KICAqLwotc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlCi17Ci0JQUNQSV9TVEFURV9DT01NT04KLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICAgICAqd2Fsa19zdGF0ZV9saXN0OyAgICAgICAvKiBIZWFkIG9mIGxpc3Qgb2Ygd2Fsa19zdGF0ZXMgZm9yIHRoaXMgdGhyZWFkICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgKmFjcXVpcmVkX211dGV4X2xpc3Q7ICAgLyogTGlzdCBvZiBhbGwgY3VycmVudGx5IGFjcXVpcmVkIG11dGV4ZXMgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfaWQ7ICAgICAgICAgICAgICAvKiBSdW5uaW5nIHRocmVhZCBJRCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfc3luY19sZXZlbDsgICAgIC8qIE11dGV4IFN5bmMgKG5lc3RlZCBhY3F1aXJlKSBsZXZlbCAqLworc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlIHsKKwlBQ1BJX1NUQVRFX0NPTU1PTiBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlX2xpc3Q7CS8qIEhlYWQgb2YgbGlzdCBvZiB3YWxrX3N0YXRlcyBmb3IgdGhpcyB0aHJlYWQgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3F1aXJlZF9tdXRleF9saXN0OwkvKiBMaXN0IG9mIGFsbCBjdXJyZW50bHkgYWNxdWlyZWQgbXV0ZXhlcyAqLworCXUzMiB0aHJlYWRfaWQ7CQkvKiBSdW5uaW5nIHRocmVhZCBJRCAqLworCXU4IGN1cnJlbnRfc3luY19sZXZlbDsJLyogTXV0ZXggU3luYyAobmVzdGVkIGFjcXVpcmUpIGxldmVsICovCiB9OwogCi0KIC8qCiAgKiBSZXN1bHQgdmFsdWVzIC0gdXNlZCB0byBhY2N1bXVsYXRlIHRoZSByZXN1bHRzIG9mIG5lc3RlZAogICogQU1MIGFyZ3VtZW50cwogICovCi1zdHJ1Y3QgYWNwaV9yZXN1bHRfdmFsdWVzCi17CitzdHJ1Y3QgYWNwaV9yZXN1bHRfdmFsdWVzIHsKIAlBQ1BJX1NUQVRFX0NPTU1PTgotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICpvYmpfZGVzYyBbQUNQSV9PQkpfTlVNX09QRVJBTkRTXTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcmVzdWx0czsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2luc2VydDsKKwkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2NbQUNQSV9PQkpfTlVNX09QRVJBTkRTXTsKKwl1OCBudW1fcmVzdWx0czsKKwl1OCBsYXN0X2luc2VydDsKIH07CiAKLQogdHlwZWRlZgotYWNwaV9zdGF0dXMgKCphY3BpX3BhcnNlX2Rvd253YXJkcykgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgICAgICoqb3V0X29wKTsKK2FjcGlfc3RhdHVzKCphY3BpX3BhcnNlX2Rvd253YXJkcykgKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlLAorCQkJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKiBvdXRfb3ApOwogCi10eXBlZGVmCi1hY3BpX3N0YXR1cyAoKmFjcGlfcGFyc2VfdXB3YXJkcykgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQordHlwZWRlZiBhY3BpX3N0YXR1cygqYWNwaV9wYXJzZV91cHdhcmRzKSAoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpOwogCiAvKgogICogTm90aWZ5IGluZm8gLSB1c2VkIHRvIHBhc3MgaW5mbyB0byB0aGUgZGVmZXJyZWQgbm90aWZ5CiAgKiBoYW5kbGVyL2Rpc3BhdGNoZXIuCiAgKi8KLXN0cnVjdCBhY3BpX25vdGlmeV9pbmZvCi17Ci0JQUNQSV9TVEFURV9DT01NT04KLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAqbm9kZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAqaGFuZGxlcl9vYmo7CitzdHJ1Y3QgYWNwaV9ub3RpZnlfaW5mbyB7CisJQUNQSV9TVEFURV9DT01NT04gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9vYmo7CiB9OwogCi0KIC8qIEdlbmVyaWMgc3RhdGUgaXMgdW5pb24gb2Ygc3RydWN0cyBhYm92ZSAqLwogCi11bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUKLXsKLQlzdHJ1Y3QgYWNwaV9jb21tb25fc3RhdGUgICAgICAgICAgICBjb21tb247Ci0Jc3RydWN0IGFjcGlfY29udHJvbF9zdGF0ZSAgICAgICAgICAgY29udHJvbDsKLQlzdHJ1Y3QgYWNwaV91cGRhdGVfc3RhdGUgICAgICAgICAgICB1cGRhdGU7Ci0Jc3RydWN0IGFjcGlfc2NvcGVfc3RhdGUgICAgICAgICAgICAgc2NvcGU7Ci0Jc3RydWN0IGFjcGlfcHNjb3BlX3N0YXRlICAgICAgICAgICAgcGFyc2Vfc2NvcGU7Ci0Jc3RydWN0IGFjcGlfcGtnX3N0YXRlICAgICAgICAgICAgICAgcGtnOwotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgICAgIHRocmVhZDsKLQlzdHJ1Y3QgYWNwaV9yZXN1bHRfdmFsdWVzICAgICAgICAgICByZXN1bHRzOwotCXN0cnVjdCBhY3BpX25vdGlmeV9pbmZvICAgICAgICAgICAgIG5vdGlmeTsKK3VuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSB7CisJc3RydWN0IGFjcGlfY29tbW9uX3N0YXRlIGNvbW1vbjsKKwlzdHJ1Y3QgYWNwaV9jb250cm9sX3N0YXRlIGNvbnRyb2w7CisJc3RydWN0IGFjcGlfdXBkYXRlX3N0YXRlIHVwZGF0ZTsKKwlzdHJ1Y3QgYWNwaV9zY29wZV9zdGF0ZSBzY29wZTsKKwlzdHJ1Y3QgYWNwaV9wc2NvcGVfc3RhdGUgcGFyc2Vfc2NvcGU7CisJc3RydWN0IGFjcGlfcGtnX3N0YXRlIHBrZzsKKwlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgdGhyZWFkOworCXN0cnVjdCBhY3BpX3Jlc3VsdF92YWx1ZXMgcmVzdWx0czsKKwlzdHJ1Y3QgYWNwaV9ub3RpZnlfaW5mbyBub3RpZnk7CiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVycHJldGVyIHR5cGVkZWZzIGFuZCBzdHJ1Y3RzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYKLWFjcGlfc3RhdHVzICgqQUNQSV9FWEVDVVRFX09QKSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAgICAgKndhbGtfc3RhdGUpOwotCit0eXBlZGVmIGFjcGlfc3RhdHVzKCpBQ1BJX0VYRUNVVEVfT1ApIChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTU4NiwyOCArNTA5LDI2IEBACiAvKgogICogQU1MIG9wY29kZSwgbmFtZSwgYW5kIGFyZ3VtZW50IGxheW91dAogICovCi1zdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbwoteworc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gewogI2lmIGRlZmluZWQoQUNQSV9ESVNBU1NFTUJMRVIpIHx8IGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWU7ICAgICAgICAgIC8qIE9wY29kZSBuYW1lIChkaXNhc3NlbWJsZXIvZGVidWcgb25seSkgKi8KKwljaGFyICpuYW1lOwkJLyogT3Bjb2RlIG5hbWUgKGRpc2Fzc2VtYmxlci9kZWJ1ZyBvbmx5KSAqLwogI2VuZGlmCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfYXJnczsgICAgIC8qIEdyYW1tYXIvUGFyc2UgdGltZSBhcmd1bWVudHMgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lX2FyZ3M7ICAgLyogSW50ZXJwcmV0IHRpbWUgYXJndW1lbnRzICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8qIE1pc2MgZmxhZ3MgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZTsgICAgLyogQ29ycmVzcG9uZGluZyBpbnRlcm5hbCBvYmplY3QgdHlwZSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOyAgICAgICAgICAvKiBPcGNvZGUgY2xhc3MgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOyAgICAgICAgICAgLyogT3Bjb2RlIHR5cGUgKi8KKwl1MzIgcGFyc2VfYXJnczsJCS8qIEdyYW1tYXIvUGFyc2UgdGltZSBhcmd1bWVudHMgKi8KKwl1MzIgcnVudGltZV9hcmdzOwkvKiBJbnRlcnByZXQgdGltZSBhcmd1bWVudHMgKi8KKwl1MzIgZmxhZ3M7CQkvKiBNaXNjIGZsYWdzICovCisJdTggb2JqZWN0X3R5cGU7CQkvKiBDb3JyZXNwb25kaW5nIGludGVybmFsIG9iamVjdCB0eXBlICovCisJdTggY2xhc3M7CQkvKiBPcGNvZGUgY2xhc3MgKi8KKwl1OCB0eXBlOwkJLyogT3Bjb2RlIHR5cGUgKi8KIH07CiAKLXVuaW9uIGFjcGlfcGFyc2VfdmFsdWUKLXsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOyAgICAgICAgLyogSW50ZWdlciBjb25zdGFudCAoVXAgdG8gNjQgYml0cykgKi8KLQlzdHJ1Y3QgdWludDY0X3N0cnVjdCAgICAgICAgICAgICAgICBpbnRlZ2VyNjQ7ICAgICAgLyogU3RydWN0dXJlIG92ZXJsYXkgZm9yIDIgMzItYml0IER3b3JkcyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU7ICAgICAgICAgICAvKiBieXRlbGlzdCBvciBmaWVsZCBzaXplICovCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZzsgICAgICAgIC8qIE5VTEwgdGVybWluYXRlZCBzdHJpbmcgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOyAgICAgICAgLyogYnVmZmVyIG9yIHN0cmluZyAqLwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lOyAgICAgICAgICAvKiBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nICovCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAgKmFyZzsgICAgICAgICAgIC8qIGFyZ3VtZW50cyBhbmQgY29udGFpbmVkIG9wcyAqLwordW5pb24gYWNwaV9wYXJzZV92YWx1ZSB7CisJYWNwaV9pbnRlZ2VyIGludGVnZXI7CS8qIEludGVnZXIgY29uc3RhbnQgKFVwIHRvIDY0IGJpdHMpICovCisJc3RydWN0IHVpbnQ2NF9zdHJ1Y3QgaW50ZWdlcjY0OwkvKiBTdHJ1Y3R1cmUgb3ZlcmxheSBmb3IgMiAzMi1iaXQgRHdvcmRzICovCisJdTMyIHNpemU7CQkvKiBieXRlbGlzdCBvciBmaWVsZCBzaXplICovCisJY2hhciAqc3RyaW5nOwkJLyogTlVMTCB0ZXJtaW5hdGVkIHN0cmluZyAqLworCXU4ICpidWZmZXI7CQkvKiBidWZmZXIgb3Igc3RyaW5nICovCisJY2hhciAqbmFtZTsJCS8qIE5VTEwgdGVybWluYXRlZCBzdHJpbmcgKi8KKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOwkvKiBhcmd1bWVudHMgYW5kIGNvbnRhaW5lZCBvcHMgKi8KIH07CiAKICNkZWZpbmUgQUNQSV9QQVJTRV9DT01NT04gXApAQCAtNjM2LDg0ICs1NTcsNzIgQEAKIC8qCiAgKiBnZW5lcmljIG9wZXJhdGlvbiAoZm9yIGV4YW1wbGU6ICBJZiwgV2hpbGUsIFN0b3JlKQogICovCi1zdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfY29tbW9uCi17Ci0JQUNQSV9QQVJTRV9DT01NT04KLX07Ci0KK3N0cnVjdCBhY3BpX3BhcnNlX29ial9jb21tb24geworQUNQSV9QQVJTRV9DT01NT059OwogCiAvKgogICogRXh0ZW5kZWQgT3AgZm9yIG5hbWVkIG9wcyAoU2NvcGUsIE1ldGhvZCwgZXRjLiksIGRlZmVycmVkIG9wcyAoTWV0aG9kcyBhbmQgb3BfcmVnaW9ucyksCiAgKiBhbmQgYnl0ZWxpc3RzLgogICovCi1zdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfbmFtZWQKLXsKLQlBQ1BJX1BBUlNFX0NPTU1PTgotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhOyAgICAgICAgICAvKiBBTUwgYm9keSBvciBieXRlbGlzdCBkYXRhICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOyAgICAgICAgIC8qIEFNTCBsZW5ndGggKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOyAgICAgICAgICAgLyogNC1ieXRlIG5hbWUgb3IgemVybyBpZiBubyBuYW1lICovCitzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfbmFtZWQgeworCUFDUElfUEFSU0VfQ09NTU9OIHU4ICogcGF0aDsKKwl1OCAqZGF0YTsJCS8qIEFNTCBib2R5IG9yIGJ5dGVsaXN0IGRhdGEgKi8KKwl1MzIgbGVuZ3RoOwkJLyogQU1MIGxlbmd0aCAqLworCXUzMiBuYW1lOwkJLyogNC1ieXRlIG5hbWUgb3IgemVybyBpZiBubyBuYW1lICovCiB9OwogCi0KIC8qIFRoZSBwYXJzZSBub2RlIGlzIHRoZSBmdW5kYW1lbnRhbCBlbGVtZW50IG9mIHRoZSBwYXJzZSB0cmVlICovCiAKLXN0cnVjdCBhY3BpX3BhcnNlX29ial9hc2wKLXsKLQlBQ1BJX1BBUlNFX0NPTU1PTgotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgICAgICpjaGlsZDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqcGFyZW50X21ldGhvZDsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmlsZW5hbWU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVybmFsX25hbWU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVwYXRoOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc2VnWzRdOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3ZhbHVlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsX2xpbmVfbnVtYmVyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxfYnl0ZV9vZmZzZXQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2xpbmU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2xvZ2ljYWxfbGluZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2J0eXBlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9sZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX3N1YnRyZWVfbGVuZ3RoOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX2FtbF9sZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfYW1sX29mZnNldDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlX2ZsYWdzOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX29wY29kZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3Bjb2RlX2xlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfcGtnX2xlbl9ieXRlczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYTsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9vcF9uYW1lWzEyXTsKK3N0cnVjdCBhY3BpX3BhcnNlX29ial9hc2wgeworCUFDUElfUEFSU0VfQ09NTU9OIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpjaGlsZDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcGFyZW50X21ldGhvZDsKKwljaGFyICpmaWxlbmFtZTsKKwljaGFyICpleHRlcm5hbF9uYW1lOworCWNoYXIgKm5hbWVwYXRoOworCWNoYXIgbmFtZV9zZWdbNF07CisJdTMyIGV4dHJhX3ZhbHVlOworCXUzMiBjb2x1bW47CisJdTMyIGxpbmVfbnVtYmVyOworCXUzMiBsb2dpY2FsX2xpbmVfbnVtYmVyOworCXUzMiBsb2dpY2FsX2J5dGVfb2Zmc2V0OworCXUzMiBlbmRfbGluZTsKKwl1MzIgZW5kX2xvZ2ljYWxfbGluZTsKKwl1MzIgYWNwaV9idHlwZTsKKwl1MzIgYW1sX2xlbmd0aDsKKwl1MzIgYW1sX3N1YnRyZWVfbGVuZ3RoOworCXUzMiBmaW5hbF9hbWxfbGVuZ3RoOworCXUzMiBmaW5hbF9hbWxfb2Zmc2V0OworCXUzMiBjb21waWxlX2ZsYWdzOworCXUxNiBwYXJzZV9vcGNvZGU7CisJdTggYW1sX29wY29kZV9sZW5ndGg7CisJdTggYW1sX3BrZ19sZW5fYnl0ZXM7CisJdTggZXh0cmE7CisJY2hhciBwYXJzZV9vcF9uYW1lWzEyXTsKIH07CiAKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0Ci17Ci0Jc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2NvbW1vbiAgICAgICAgY29tbW9uOwotCXN0cnVjdCBhY3BpX3BhcnNlX29ial9uYW1lZCAgICAgICAgIG5hbWVkOwotCXN0cnVjdCBhY3BpX3BhcnNlX29ial9hc2wgICAgICAgICAgIGFzbDsKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0IHsKKwlzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfY29tbW9uIGNvbW1vbjsKKwlzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfbmFtZWQgbmFtZWQ7CisJc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2FzbCBhc2w7CiB9OwogCi0KIC8qCiAgKiBQYXJzZSBzdGF0ZSAtIG9uZSBzdGF0ZSBwZXIgcGFyc2VyIGludm9jYXRpb24gYW5kIGVhY2ggY29udHJvbAogICogbWV0aG9kLgogICovCi1zdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZQotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9zaXplOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQ7ICAgICAvKiBGaXJzdCBBTUwgYnl0ZSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWw7ICAgICAgICAgICAvKiBOZXh0IEFNTCBieXRlICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9lbmQ7ICAgICAgIC8qIChsYXN0ICsgMSkgQU1MIGJ5dGUgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGtnX3N0YXJ0OyAgICAgLyogQ3VycmVudCBwYWNrYWdlIGJlZ2luICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBrZ19lbmQ7ICAgICAgIC8qIEN1cnJlbnQgcGFja2FnZSBlbmQgKi8KLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqc3RhcnRfb3A7ICAgICAgLyogUm9vdCBvZiBwYXJzZSB0cmVlICovCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgKnN0YXJ0X25vZGU7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAgICAgKnNjb3BlOyAgICAgICAgIC8qIEN1cnJlbnQgc2NvcGUgKi8KLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqc3RhcnRfc2NvcGU7CitzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSB7CisJdTMyIGFtbF9zaXplOworCXU4ICphbWxfc3RhcnQ7CQkvKiBGaXJzdCBBTUwgYnl0ZSAqLworCXU4ICphbWw7CQkvKiBOZXh0IEFNTCBieXRlICovCisJdTggKmFtbF9lbmQ7CQkvKiAobGFzdCArIDEpIEFNTCBieXRlICovCisJdTggKnBrZ19zdGFydDsJCS8qIEN1cnJlbnQgcGFja2FnZSBiZWdpbiAqLworCXU4ICpwa2dfZW5kOwkJLyogQ3VycmVudCBwYWNrYWdlIGVuZCAqLworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpzdGFydF9vcDsJLyogUm9vdCBvZiBwYXJzZSB0cmVlICovCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGU7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZTsJLyogQ3VycmVudCBzY29wZSAqLworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpzdGFydF9zY29wZTsKIH07CiAKLQogLyogUGFyc2Ugb2JqZWN0IGZsYWdzICovCiAKICNkZWZpbmUgQUNQSV9QQVJTRU9QX0dFTkVSSUMgICAgICAgICAgICAgICAgICAgIDB4MDEKQEAgLTcyOSw3ICs2MzgsNiBAQAogI2RlZmluZSBBQ1BJX1BBUlNFT1BfRU1QVFlfVEVSTUxJU1QgICAgICAgICAgICAgMHgwNAogI2RlZmluZSBBQ1BJX1BBUlNFT1BfU1BFQ0lBTCAgICAgICAgICAgICAgICAgICAgMHgxMAogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEhhcmR3YXJlIChBQ1BJIHJlZ2lzdGVycykgYW5kIFBOUApAQCAtNzM3LDE1ICs2NDUsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZGVmaW5lIFBDSV9ST09UX0hJRF9TVFJJTkcgICAgICAgICAiUE5QMEEwMyIKKyNkZWZpbmUgUENJX0VYUFJFU1NfUk9PVF9ISURfU1RSSU5HICJQTlAwQTA4IgogCi1zdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9yZWdpc3RlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfcG9zaXRpb247Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2JpdF9tYXNrOworc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8geworCXU4IHBhcmVudF9yZWdpc3RlcjsKKwl1OCBiaXRfcG9zaXRpb247CisJdTE2IGFjY2Vzc19iaXRfbWFzazsKIH07CiAKLQogLyoKICAqIFJlZ2lzdGVyIElEcwogICogVGhlc2UgYXJlIHRoZSBmdWxsIEFDUEkgcmVnaXN0ZXJzCkBAIC03NjAsNyArNjY3LDYgQEAKICNkZWZpbmUgQUNQSV9SRUdJU1RFUl9QUk9DRVNTT1JfQkxPQ0sgICAgICAgICAgIDB4MDgKICNkZWZpbmUgQUNQSV9SRUdJU1RFUl9TTUlfQ09NTUFORF9CTE9DSyAgICAgICAgIDB4MDkKIAotCiAvKiBNYXNrcyB1c2VkIHRvIGFjY2VzcyB0aGUgYml0X3JlZ2lzdGVycyAqLwogCiAjZGVmaW5lIEFDUElfQklUTUFTS19USU1FUl9TVEFUVVMgICAgICAgICAgICAgICAweDAwMDEKQEAgLTc2OSw3ICs2NzUsNyBAQAogI2RlZmluZSBBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX1NUQVRVUyAgICAgICAgMHgwMTAwCiAjZGVmaW5lIEFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fU1RBVFVTICAgICAgICAweDAyMDAKICNkZWZpbmUgQUNQSV9CSVRNQVNLX1JUX0NMT0NLX1NUQVRVUyAgICAgICAgICAgIDB4MDQwMAotI2RlZmluZSBBQ1BJX0JJVE1BU0tfUENJRVhQX1dBS0VfU1RBVFVTICAgICAgICAgMHg0MDAwICAgIC8qIEFDUEkgMy4wICovCisjZGVmaW5lIEFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9TVEFUVVMgICAgICAgICAweDQwMDAJLyogQUNQSSAzLjAgKi8KICNkZWZpbmUgQUNQSV9CSVRNQVNLX1dBS0VfU1RBVFVTICAgICAgICAgICAgICAgIDB4ODAwMAogCiAjZGVmaW5lIEFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTICAgICAgICAgICAoQUNQSV9CSVRNQVNLX1RJTUVSX1NUQVRVUyAgICAgICAgICB8IFwKQEAgLTc4NSw3ICs2OTEsNyBAQAogI2RlZmluZSBBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX0VOQUJMRSAgICAgICAgMHgwMTAwCiAjZGVmaW5lIEFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fRU5BQkxFICAgICAgICAweDAyMDAKICNkZWZpbmUgQUNQSV9CSVRNQVNLX1JUX0NMT0NLX0VOQUJMRSAgICAgICAgICAgIDB4MDQwMAotI2RlZmluZSBBQ1BJX0JJVE1BU0tfUENJRVhQX1dBS0VfRElTQUJMRSAgICAgICAgMHg0MDAwICAgIC8qIEFDUEkgMy4wICovCisjZGVmaW5lIEFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9ESVNBQkxFICAgICAgICAweDQwMDAJLyogQUNQSSAzLjAgKi8KIAogI2RlZmluZSBBQ1BJX0JJVE1BU0tfU0NJX0VOQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAxCiAjZGVmaW5lIEFDUElfQklUTUFTS19CVVNfTUFTVEVSX1JMRCAgICAgICAgICAgICAweDAwMDIKQEAgLTc5NSw3ICs3MDEsNiBAQAogCiAjZGVmaW5lIEFDUElfQklUTUFTS19BUkJfRElTQUJMRSAgICAgICAgICAgICAgICAweDAwMDEKIAotCiAvKiBSYXcgYml0IHBvc2l0aW9uIG9mIGVhY2ggYml0X3JlZ2lzdGVyICovCiAKICNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9USU1FUl9TVEFUVVMgICAgICAgICAgIDB4MDAKQEAgLTgwNCw3ICs3MDksNyBAQAogI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1BPV0VSX0JVVFRPTl9TVEFUVVMgICAgMHgwOAogI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0JVVFRPTl9TVEFUVVMgICAgMHgwOQogI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1JUX0NMT0NLX1NUQVRVUyAgICAgICAgMHgwQQotI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1BDSUVYUF9XQUtFX1NUQVRVUyAgICAgMHgwRSAgICAvKiBBQ1BJIDMuMCAqLworI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1BDSUVYUF9XQUtFX1NUQVRVUyAgICAgMHgwRQkvKiBBQ1BJIDMuMCAqLwogI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1dBS0VfU1RBVFVTICAgICAgICAgICAgMHgwRgogCiAjZGVmaW5lIEFDUElfQklUUE9TSVRJT05fVElNRVJfRU5BQkxFICAgICAgICAgICAweDAwCkBAIC04MTIsNyArNzE3LDcgQEAKICNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9QT1dFUl9CVVRUT05fRU5BQkxFICAgIDB4MDgKICNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9CVVRUT05fRU5BQkxFICAgIDB4MDkKICNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9SVF9DTE9DS19FTkFCTEUgICAgICAgIDB4MEEKLSNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9QQ0lFWFBfV0FLRV9ESVNBQkxFICAgIDB4MEUgICAgLyogQUNQSSAzLjAgKi8KKyNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9QQ0lFWFBfV0FLRV9ESVNBQkxFICAgIDB4MEUJLyogQUNQSSAzLjAgKi8KIAogI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1NDSV9FTkFCTEUgICAgICAgICAgICAgMHgwMAogI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX0JVU19NQVNURVJfUkxEICAgICAgICAgMHgwMQpAQCAtODIyLDcgKzcyNyw2IEBACiAKICNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9BUkJfRElTQUJMRSAgICAgICAgICAgIDB4MDAKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBSZXNvdXJjZSBkZXNjcmlwdG9ycwpAQCAtODQxLDggKzc0NSw3IEBACiAjZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9TTUFMTCAgICAgICAgICAgICAgICAgICAweDAwCiAKICNkZWZpbmUgQUNQSV9SREVTQ19UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgQUNQSV9SREVTQ19TTUFMTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4NzggLyogT25seSBiaXRzIDY6MyBjb250YWluIHRoZSB0eXBlICovCi0KKyNkZWZpbmUgQUNQSV9SREVTQ19TTUFMTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4NzgJLyogT25seSBiaXRzIDY6MyBjb250YWluIHRoZSB0eXBlICovCiAKIC8qCiAgKiBTbWFsbCByZXNvdXJjZSBkZXNjcmlwdG9yIHR5cGVzCkBAIC04NzEsNyArNzc0LDYgQEAKICNkZWZpbmUgQUNQSV9SREVTQ19UWVBFX1FXT1JEX0FERFJFU1NfU1BBQ0UgICAgIDB4OEEKICNkZWZpbmUgQUNQSV9SREVTQ19UWVBFX0VYVEVOREVEX0FERFJFU1NfU1BBQ0UgIDB4OEIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBNaXNjZWxsYW5lb3VzCkBAIC04ODAsNDkgKzc4MiwzNiBAQAogCiAjZGVmaW5lIEFDUElfQVNDSUlfWkVSTyAgICAgICAgICAgICAgICAgICAgICAweDMwCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRGVidWdnZXIKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfZGJfbWV0aG9kX2luZm8KLXsKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9nYXRlOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmFyZ3M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9sb29wczsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lWzEyOF07CitzdHJ1Y3QgYWNwaV9kYl9tZXRob2RfaW5mbyB7CisJYWNwaV9oYW5kbGUgdGhyZWFkX2dhdGU7CisJY2hhciAqbmFtZTsKKwljaGFyICoqYXJnczsKKwl1MzIgZmxhZ3M7CisJdTMyIG51bV9sb29wczsKKwljaGFyIHBhdGhuYW1lWzEyOF07CiB9OwogCi1zdHJ1Y3QgYWNwaV9pbnRlZ3JpdHlfaW5mbwotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBub2RlczsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0czsKK3N0cnVjdCBhY3BpX2ludGVncml0eV9pbmZvIHsKKwl1MzIgbm9kZXM7CisJdTMyIG9iamVjdHM7CiB9OwogCi0KICNkZWZpbmUgQUNQSV9EQl9SRURJUkVDVEFCTEVfT1VUUFVUICAweDAxCiAjZGVmaW5lIEFDUElfREJfQ09OU09MRV9PVVRQVVQgICAgICAgMHgwMgogI2RlZmluZSBBQ1BJX0RCX0RVUExJQ0FURV9PVVRQVVQgICAgIDB4MDMKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBEZWJ1ZwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQ7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHJvY19uYW1lOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lOwotfTsKLQotCiAvKiBFbnRyeSBmb3IgYSBtZW1vcnkgYWxsb2NhdGlvbiAoZGVidWcgb25seSkgKi8KIAogI2RlZmluZSBBQ1BJX01FTV9NQUxMT0MgICAgICAgICAgICAgICAgICAgICAgMApAQCAtOTM4LDUxICs4MjcsMzYgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVbQUNQSV9NQVhfTU9EVUxFX05BTUVdOyBcCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfdHlwZTsKIAotc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlcgotewotCUFDUElfQ09NTU9OX0RFQlVHX01FTV9IRUFERVIKLX07CitzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1faGVhZGVyIHsKK0FDUElfQ09NTU9OX0RFQlVHX01FTV9IRUFERVJ9OwogCi1zdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sKLXsKLQlBQ1BJX0NPTU1PTl9ERUJVR19NRU1fSEVBREVSCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9zcGFjZTsKK3N0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayB7CisJQUNQSV9DT01NT05fREVCVUdfTUVNX0hFQURFUiB1NjQgdXNlcl9zcGFjZTsKIH07CiAKLQogI2RlZmluZSBBQ1BJX01FTV9MSVNUX0dMT0JBTCAgICAgICAgICAgIDAKICNkZWZpbmUgQUNQSV9NRU1fTElTVF9OU05PREUgICAgICAgICAgICAxCisjZGVmaW5lIEFDUElfTUVNX0xJU1RfTUFYICAgICAgICAgICAgICAgMQorI2RlZmluZSBBQ1BJX05VTV9NRU1fTElTVFMgICAgICAgICAgICAgIDIKIAotI2RlZmluZSBBQ1BJX01FTV9MSVNUX0ZJUlNUX0NBQ0hFX0xJU1QgIDIKLSNkZWZpbmUgQUNQSV9NRU1fTElTVF9TVEFURSAgICAgICAgICAgICAyCi0jZGVmaW5lIEFDUElfTUVNX0xJU1RfUFNOT0RFICAgICAgICAgICAgMwotI2RlZmluZSBBQ1BJX01FTV9MSVNUX1BTTk9ERV9FWFQgICAgICAgIDQKLSNkZWZpbmUgQUNQSV9NRU1fTElTVF9PUEVSQU5EICAgICAgICAgICA1Ci0jZGVmaW5lIEFDUElfTUVNX0xJU1RfV0FMSyAgICAgICAgICAgICAgNgotI2RlZmluZSBBQ1BJX01FTV9MSVNUX01BWCAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgQUNQSV9OVU1fTUVNX0xJU1RTICAgICAgICAgICAgICA3Ci0KLQotc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QKLXsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGlzdF9oZWFkOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfb2Zmc2V0OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jYWNoZV9kZXB0aDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9kZXB0aDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc2l6ZTsKK3N0cnVjdCBhY3BpX21lbW9yeV9saXN0IHsKKwljaGFyICpsaXN0X25hbWU7CisJdm9pZCAqbGlzdF9oZWFkOworCXUxNiBvYmplY3Rfc2l6ZTsKKwl1MTYgbWF4X2RlcHRoOworCXUxNiBjdXJyZW50X2RlcHRoOworCXUxNiBsaW5rX29mZnNldDsKIAogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCiAKIAkvKiBTdGF0aXN0aWNzIGZvciBkZWJ1ZyBtZW1vcnkgdHJhY2tpbmcgb25seSAqLwogCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYWxsb2NhdGVkOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2ZyZWVkOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdG90YWxfc2l6ZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9yZXF1ZXN0czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9oaXRzOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsaXN0X25hbWU7CisJdTMyIHRvdGFsX2FsbG9jYXRlZDsKKwl1MzIgdG90YWxfZnJlZWQ7CisJdTMyIGN1cnJlbnRfdG90YWxfc2l6ZTsKKwl1MzIgcmVxdWVzdHM7CisJdTMyIGhpdHM7CiAjZW5kaWYKIH07CiAKLQotI2VuZGlmIC8qIF9fQUNMT0NBTF9IX18gKi8KKyNlbmRpZgkJCQkvKiBfX0FDTE9DQUxfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaCBiL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oCmluZGV4IDA5YmU5MzcuLjcwMmNjNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oCkBAIC00NCw3ICs0NCw2IEBACiAjaWZuZGVmIF9fQUNNQUNST1NfSF9fCiAjZGVmaW5lIF9fQUNNQUNST1NfSF9fCiAKLQogLyoKICAqIERhdGEgbWFuaXB1bGF0aW9uIG1hY3JvcwogICovCkBAIC01Nyw3ICs1Niw2IEBACiAjZGVmaW5lIEFDUElfQ0xFQVJfQklUKHRhcmdldCxiaXQpICAgICAgKCh0YXJnZXQpICY9IH4oYml0KSkKICNkZWZpbmUgQUNQSV9NSU4oYSxiKSAgICAgICAgICAgICAgICAgICAoKChhKTwoYikpPyhhKTooYikpCiAKLQogI2lmIEFDUElfTUFDSElORV9XSURUSCA9PSAxNgogCiAvKgpAQCAtMTY4LDcgKzE2Niw3IEBACiAKIC8qIDMyLWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCiAKLSNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKSAgICAvKiBUcnVuY2F0ZSB0byAxNiAqLworI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpCS8qIFRydW5jYXRlIHRvIDE2ICovCiAKICNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzMyKGQscykgICAgICAgICB7KCggIHU4ICopKHZvaWQgKikoZCkpWzBdID0gKCh1OCAqKSh2b2lkICopKHMpKVszXTtcCiAJCQkJCQkJCQkgICgoICB1OCAqKSh2b2lkICopKGQpKVsxXSA9ICgodTggKikodm9pZCAqKShzKSlbMl07XApAQCAtMTgzLDkgKzE4MSw5IEBACiAKIC8qIDY0LWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCiAKLSNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKSAgICAvKiBUcnVuY2F0ZSB0byAxNiAqLworI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpCS8qIFRydW5jYXRlIHRvIDE2ICovCiAKLSNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzMyKGQscykgICAgICAgICBBQ1BJX01PVkVfMzJfVE9fMzIoZCxzKSAgICAvKiBUcnVuY2F0ZSB0byAzMiAqLworI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMzIoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpCS8qIFRydW5jYXRlIHRvIDMyICovCiAKICNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzY0KGQscykgICAgICAgICB7KCggIHU4ICopKHZvaWQgKikoZCkpWzBdID0gKCh1OCAqKSh2b2lkICopKHMpKVs3XTtcCiAJCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVsxXSA9ICgodTggKikodm9pZCAqKShzKSlbNl07XApAQCAtMjE5LDE0ICsyMTcsMTQgQEAKIAogLyogMzItYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KIAotI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpICAgIC8qIFRydW5jYXRlIHRvIDE2ICovCisjZGVmaW5lIEFDUElfTU9WRV8zMl9UT18xNihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQscykJLyogVHJ1bmNhdGUgdG8gMTYgKi8KICNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzMyKGQscykgICAgICAgICAqKHUzMiAqKSh2b2lkICopKGQpID0gKih1MzIgKikodm9pZCAqKShzKQogI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fNjQoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpCiAKIC8qIDY0LWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCiAKLSNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKSAgICAvKiBUcnVuY2F0ZSB0byAxNiAqLwotI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMzIoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpICAgIC8qIFRydW5jYXRlIHRvIDMyICovCisjZGVmaW5lIEFDUElfTU9WRV82NF9UT18xNihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQscykJLyogVHJ1bmNhdGUgdG8gMTYgKi8KKyNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzMyKGQscykgICAgICAgICBBQ1BJX01PVkVfMzJfVE9fMzIoZCxzKQkvKiBUcnVuY2F0ZSB0byAzMiAqLwogI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fNjQoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpCiAKICNlbHNlCkBAIC0yMzgsMTQgKzIzNiwxNCBAQAogCiAvKiAzMi1iaXQgc291cmNlLCAxNi8zMi82NCBkZXN0aW5hdGlvbiAqLwogCi0jZGVmaW5lIEFDUElfTU9WRV8zMl9UT18xNihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQscykgICAgLyogVHJ1bmNhdGUgdG8gMTYgKi8KKyNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKQkvKiBUcnVuY2F0ZSB0byAxNiAqLwogI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMzIoZCxzKSAgICAgICAgICoodTMyICopKHZvaWQgKikoZCkgPSAqKHUzMiAqKSh2b2lkICopKHMpCiAjZGVmaW5lIEFDUElfTU9WRV8zMl9UT182NChkLHMpICAgICAgICAgKih1NjQgKikodm9pZCAqKShkKSA9ICoodTMyICopKHZvaWQgKikocykKIAogLyogNjQtYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KIAotI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpICAgIC8qIFRydW5jYXRlIHRvIDE2ICovCi0jZGVmaW5lIEFDUElfTU9WRV82NF9UT18zMihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzMyX1RPXzMyKGQscykgICAgLyogVHJ1bmNhdGUgdG8gMzIgKi8KKyNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKQkvKiBUcnVuY2F0ZSB0byAxNiAqLworI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMzIoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpCS8qIFRydW5jYXRlIHRvIDMyICovCiAjZGVmaW5lIEFDUElfTU9WRV82NF9UT182NChkLHMpICAgICAgICAgKih1NjQgKikodm9pZCAqKShkKSA9ICoodTY0ICopKHZvaWQgKikocykKICNlbmRpZgogCkBAIC0yNjYsNyArMjY0LDcgQEAKIAogLyogMzItYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KIAotI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpICAgIC8qIFRydW5jYXRlIHRvIDE2ICovCisjZGVmaW5lIEFDUElfTU9WRV8zMl9UT18xNihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQscykJLyogVHJ1bmNhdGUgdG8gMTYgKi8KIAogI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMzIoZCxzKSAgICAgICAgIHsoKCAgdTggKikodm9pZCAqKShkKSlbMF0gPSAoKHU4ICopKHZvaWQgKikocykpWzBdO1wKIAkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzFdID0gKCh1OCAqKSh2b2lkICopKHMpKVsxXTtcCkBAIC0yNzcsOCArMjc1LDggQEAKIAogLyogNjQtYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KIAotI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpICAgIC8qIFRydW5jYXRlIHRvIDE2ICovCi0jZGVmaW5lIEFDUElfTU9WRV82NF9UT18zMihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzMyX1RPXzMyKGQscykgICAgLyogVHJ1bmNhdGUgdG8gMzIgKi8KKyNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKQkvKiBUcnVuY2F0ZSB0byAxNiAqLworI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMzIoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpCS8qIFRydW5jYXRlIHRvIDMyICovCiAjZGVmaW5lIEFDUElfTU9WRV82NF9UT182NChkLHMpICAgICAgICAgeygoICB1OCAqKSh2b2lkICopKGQpKVswXSA9ICgodTggKikodm9pZCAqKShzKSlbMF07XAogCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbMV0gPSAoKHU4ICopKHZvaWQgKikocykpWzFdO1wKIAkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzJdID0gKCh1OCAqKSh2b2lkICopKHMpKVsyXTtcCkBAIC0zMDUsNyArMzAzLDYgQEAKICNlcnJvciB1bmtub3duIEFDUElfTUFDSElORV9XSURUSAogI2VuZGlmCiAKLQogLyoKICAqIEZhc3QgcG93ZXItb2YtdHdvIG1hdGggbWFjcm9zIGZvciBub24tb3B0aW1pemVkIGNvbXBpbGVycwogICovCkBAIC0zMjksNyArMzI2LDYgQEAKICNkZWZpbmUgQUNQSV9NVUxfMTYoYSkgICAgICAgICAgICAgICAgICBfQUNQSV9NVUwoYSw0KQogI2RlZmluZSBBQ1BJX01PRF8xNihhKSAgICAgICAgICAgICAgICAgIF9BQ1BJX01PRChhLDE2KQogCi0KIC8qCiAgKiBSb3VuZGluZyBtYWNyb3MgKFBvd2VyIG9mIHR3byBib3VuZGFyaWVzIG9ubHkpCiAgKi8KQEAgLTM0NCw3ICszNDAsNiBAQAogI2RlZmluZSBBQ1BJX1JPVU5EX1VQX3RvXzY0X2JJVFMoYSkgICAgICAgICAgQUNQSV9ST1VORF9VUChhLDgpCiAjZGVmaW5lIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoYSkgICAgICBBQ1BJX1JPVU5EX1VQKGEsQUxJR05FRF9BRERSRVNTX0JPVU5EQVJZKQogCi0KICNkZWZpbmUgQUNQSV9ST1VORF9CSVRTX1VQX1RPX0JZVEVTKGEpICAgICAgIEFDUElfRElWXzgoKGEpICsgNykKICNkZWZpbmUgQUNQSV9ST1VORF9CSVRTX0RPV05fVE9fQllURVMoYSkgICAgIEFDUElfRElWXzgoKGEpKQogCkBAIC0zNjUsNyArMzYwLDYgQEAKIAogI2RlZmluZSBBQ1BJX0lTX09DVEFMX0RJR0lUKGQpICAgICAgICAgICAgICAgKCgoY2hhcikoZCkgPj0gJzAnKSAmJiAoKGNoYXIpKGQpIDw9ICc3JykpCiAKLQogLyogQml0ZmllbGRzIHdpdGhpbiBBQ1BJIHJlZ2lzdGVycyAqLwogCiAjZGVmaW5lIEFDUElfUkVHSVNURVJfUFJFUEFSRV9CSVRTKHZhbCwgcG9zLCBtYXNrKSAgICAgICgodmFsIDw8IHBvcykgJiBtYXNrKQpAQCAtMzgxLDcgKzM3NSw2IEBACiAjZGVmaW5lIEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShkKSAgICAgKCgodW5pb24gYWNwaV9kZXNjcmlwdG9yICopKHZvaWQgKikoZCkpLT5kZXNjcmlwdG9yX2lkKQogI2RlZmluZSBBQ1BJX1NFVF9ERVNDUklQVE9SX1RZUEUoZCx0KSAgICgoKHVuaW9uIGFjcGlfZGVzY3JpcHRvciAqKSh2b2lkICopKGQpKS0+ZGVzY3JpcHRvcl9pZCA9IHQpCiAKLQogLyogTWFjcm8gdG8gdGVzdCB0aGUgb2JqZWN0IHR5cGUgKi8KIAogI2RlZmluZSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShkKSAgICAgICAgICgoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikodm9pZCAqKShkKSktPmNvbW1vbi50eXBlKQpAQCAtNDMwLDI4ICs0MjMsMjggQEAKICNkZWZpbmUgR0VUX0NVUlJFTlRfQVJHX1RZUEUobGlzdCkgICAgICAobGlzdCAmICgodTMyKSAweDFGKSkKICNkZWZpbmUgSU5DUkVNRU5UX0FSR19MSVNUKGxpc3QpICAgICAgICAobGlzdCA+Pj0gKCh1MzIpIEFSR19UWVBFX1dJRFRIKSkKIAotCiAvKgogICogUmVwb3J0aW5nIG1hY3JvcyB0aGF0IGFyZSBuZXZlciBjb21waWxlZCBvdXQKICAqLwogI2RlZmluZSBBQ1BJX1BBUkFNX0xJU1QocGwpICAgICAgICAgICAgICAgICBwbAogCiAvKgotICogRXJyb3IgcmVwb3J0aW5nLiAgVGhlc2UgdmVyc2lvbnMgYWRkIGNhbGxlcnMgbW9kdWxlIGFuZCBsaW5lIy4gIFNpbmNlCi0gKiBfVEhJU19NT0RVTEUgZ2V0cyBjb21waWxlZCBvdXQgd2hlbiBBQ1BJX0RFQlVHX09VVFBVVCBpc24ndCBkZWZpbmVkLCBvbmx5Ci0gKiB1c2UgaXQgaW4gZGVidWcgbW9kZS4KKyAqIEVycm9yIHJlcG9ydGluZy4gIFRoZXNlIHZlcnNpb25zIGFkZCBjYWxsZXJzIG1vZHVsZSBhbmQgbGluZSMuCisgKgorICogU2luY2UgX2FjcGlfbW9kdWxlX25hbWUgZ2V0cyBjb21waWxlZCBvdXQgd2hlbiBBQ1BJX0RFQlVHX09VVFBVVAorICogaXNuJ3QgZGVmaW5lZCwgb25seSB1c2UgaXQgaW4gZGVidWcgbW9kZS4KICAqLwogI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCiAKLSNkZWZpbmUgQUNQSV9SRVBPUlRfSU5GTyhmcCkgICAgICAgICAgICAgICAge2FjcGlfdXRfcmVwb3J0X2luZm8oX1RISVNfTU9EVUxFLF9fTElORV9fLF9DT01QT05FTlQpOyBcCisjZGVmaW5lIEFDUElfUkVQT1JUX0lORk8oZnApICAgICAgICAgICAgICAgIHthY3BpX3V0X3JlcG9ydF9pbmZvKF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fLF9DT01QT05FTlQpOyBcCiAJCQkJCQkJCQkJCQlhY3BpX29zX3ByaW50ZiBBQ1BJX1BBUkFNX0xJU1QoZnApO30KLSNkZWZpbmUgQUNQSV9SRVBPUlRfRVJST1IoZnApICAgICAgICAgICAgICAge2FjcGlfdXRfcmVwb3J0X2Vycm9yKF9USElTX01PRFVMRSxfX0xJTkVfXyxfQ09NUE9ORU5UKTsgXAorI2RlZmluZSBBQ1BJX1JFUE9SVF9FUlJPUihmcCkgICAgICAgICAgICAgICB7YWNwaV91dF9yZXBvcnRfZXJyb3IoX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18sX0NPTVBPTkVOVCk7IFwKIAkJCQkJCQkJCQkJCWFjcGlfb3NfcHJpbnRmIEFDUElfUEFSQU1fTElTVChmcCk7fQotI2RlZmluZSBBQ1BJX1JFUE9SVF9XQVJOSU5HKGZwKSAgICAgICAgICAgICB7YWNwaV91dF9yZXBvcnRfd2FybmluZyhfVEhJU19NT0RVTEUsX19MSU5FX18sX0NPTVBPTkVOVCk7IFwKKyNkZWZpbmUgQUNQSV9SRVBPUlRfV0FSTklORyhmcCkgICAgICAgICAgICAge2FjcGlfdXRfcmVwb3J0X3dhcm5pbmcoX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18sX0NPTVBPTkVOVCk7IFwKIAkJCQkJCQkJCQkJCWFjcGlfb3NfcHJpbnRmIEFDUElfUEFSQU1fTElTVChmcCk7fQotI2RlZmluZSBBQ1BJX1JFUE9SVF9OU0VSUk9SKHMsZSkgICAgICAgICAgICBhY3BpX25zX3JlcG9ydF9lcnJvcihfVEhJU19NT0RVTEUsX19MSU5FX18sX0NPTVBPTkVOVCwgcywgZSk7CisjZGVmaW5lIEFDUElfUkVQT1JUX05TRVJST1IocyxlKSAgICAgICAgICAgIGFjcGlfbnNfcmVwb3J0X2Vycm9yKF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fLF9DT01QT05FTlQsIHMsIGUpOwogCi0jZGVmaW5lIEFDUElfUkVQT1JUX01FVEhPRF9FUlJPUihzLG4scCxlKSAgIGFjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvcihfVEhJU19NT0RVTEUsX19MSU5FX18sX0NPTVBPTkVOVCwgcywgbiwgcCwgZSk7CisjZGVmaW5lIEFDUElfUkVQT1JUX01FVEhPRF9FUlJPUihzLG4scCxlKSAgIGFjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvcihfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXyxfQ09NUE9ORU5ULCBzLCBuLCBwLCBlKTsKIAogI2Vsc2UKIApAQCAtNDgwLDM2ICs0NzMsNTggQEAKICAqIERlYnVnIG1hY3JvcyB0aGF0IGFyZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkCiAgKi8KICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAotCi0jZGVmaW5lIEFDUElfTU9EVUxFX05BTUUobmFtZSkgICAgICAgICAgICAgICBzdGF0aWMgY2hhciBBQ1BJX1VOVVNFRF9WQVIgKl9USElTX01PRFVMRSA9IG5hbWU7CisjZGVmaW5lIEFDUElfTU9EVUxFX05BTUUobmFtZSkgICAgICAgICAgc3RhdGljIGNoYXIgQUNQSV9VTlVTRURfVkFSICpfYWNwaV9tb2R1bGVfbmFtZSA9IG5hbWU7CiAKIC8qCi0gKiBGdW5jdGlvbiBlbnRyeSB0cmFjaW5nLgotICogVGhlIGZpcnN0IHBhcmFtZXRlciBzaG91bGQgYmUgdGhlIHByb2NlZHVyZSBuYW1lIGFzIGEgcXVvdGVkIHN0cmluZy4gIFRoaXMgaXMgZGVjbGFyZWQKLSAqIGFzIGEgbG9jYWwgc3RyaW5nICgiX3Byb2NfbmFtZSkgc28gdGhhdCBpdCBjYW4gYmUgYWxzbyB1c2VkIGJ5IHRoZSBmdW5jdGlvbiBleGl0IG1hY3JvcyBiZWxvdy4KKyAqIENvbW1vbiBwYXJhbWV0ZXJzIHVzZWQgZm9yIGRlYnVnIG91dHB1dCBmdW5jdGlvbnM6CisgKiBsaW5lIG51bWJlciwgZnVuY3Rpb24gbmFtZSwgbW9kdWxlKGZpbGUpIG5hbWUsIGNvbXBvbmVudCBJRAogICovCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fTkFNRShhKSAgICAgICAgICAgICAgIHN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gX2RlYnVnX2luZm87IFwKLQkJCQkJCQkJCQkJCV9kZWJ1Z19pbmZvLmNvbXBvbmVudF9pZCA9IF9DT01QT05FTlQ7IFwKLQkJCQkJCQkJCQkJCV9kZWJ1Z19pbmZvLnByb2NfbmFtZSAgPSBhOyBcCi0JCQkJCQkJCQkJCQlfZGVidWdfaW5mby5tb2R1bGVfbmFtZSA9IF9USElTX01PRFVMRTsKKyNkZWZpbmUgQUNQSV9ERUJVR19QQVJBTUVURVJTICAgICAgICAgICBfX0xJTkVfXywgQUNQSV9HRVRfRlVOQ1RJT05fTkFNRSwgX2FjcGlfbW9kdWxlX25hbWUsIF9DT01QT05FTlQKIAotI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFKGEpICAgICAgICAgICAgICBBQ1BJX0ZVTkNUSU9OX05BTUUoYSkgXAotCQkJCQkJCQkJCQkJYWNwaV91dF90cmFjZShfX0xJTkVfXywmX2RlYnVnX2luZm8pCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGEsYikgICAgICAgIEFDUElfRlVOQ1RJT05fTkFNRShhKSBcCi0JCQkJCQkJCQkJCQlhY3BpX3V0X3RyYWNlX3B0cihfX0xJTkVfXywmX2RlYnVnX2luZm8sKHZvaWQgKiliKQotI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihhLGIpICAgICAgICBBQ1BJX0ZVTkNUSU9OX05BTUUoYSkgXAotCQkJCQkJCQkJCQkJYWNwaV91dF90cmFjZV91MzIoX19MSU5FX18sJl9kZWJ1Z19pbmZvLCh1MzIpYikKLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoYSxiKSAgICAgICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKLQkJCQkJCQkJCQkJCWFjcGlfdXRfdHJhY2Vfc3RyKF9fTElORV9fLCZfZGVidWdfaW5mbywoY2hhciAqKWIpCisvKgorICogRnVuY3Rpb24gZW50cnkgdHJhY2luZworICovCiAKLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9FTlRSWSgpICAgICAgICAgICAgICAgYWNwaV91dF90cmFja19zdGFja19wdHIoKQorLyoKKyAqIElmIEFDUElfR0VUX0ZVTkNUSU9OX05BTUUgd2FzIG5vdCBkZWZpbmVkIGluIHRoZSBjb21waWxlci1kZXBlbmRlbnQgaGVhZGVyLAorICogZGVmaW5lIGl0IG5vdy4gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGVyZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydAorICogYSBfX0ZVTkNUSU9OX18gbWFjcm8gb3IgZXF1aXZhbGVudC4gV2Ugc2F2ZSB0aGUgZnVuY3Rpb24gbmFtZSBvbiB0aGUKKyAqIGxvY2FsIHN0YWNrLgorICovCisjaWZuZGVmIEFDUElfR0VUX0ZVTkNUSU9OX05BTUUKKyNkZWZpbmUgQUNQSV9HRVRfRlVOQ1RJT05fTkFNRSAgICAgICAgICBfYWNwaV9mdW5jdGlvbl9uYW1lCisvKgorICogVGhlIE5hbWUgcGFyYW1ldGVyIHNob3VsZCBiZSB0aGUgcHJvY2VkdXJlIG5hbWUgYXMgYSBxdW90ZWQgc3RyaW5nLgorICogVGhpcyBpcyBkZWNsYXJlZCBhcyBhIGxvY2FsIHN0cmluZyAoIm15X2Z1bmN0aW9uX25hbWUiKSBzbyB0aGF0IGl0IGNhbgorICogYmUgYWxzbyB1c2VkIGJ5IHRoZSBmdW5jdGlvbiBleGl0IG1hY3JvcyBiZWxvdy4KKyAqIE5vdGU6IChjb25zdCBjaGFyKSBpcyB1c2VkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZGVidWcgaW50ZXJmYWNlcworICogYW5kIG1hY3JvcyBzdWNoIGFzIF9fRlVOQ1RJT05fXy4KKyAqLworI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX05BTUUobmFtZSkgICAgICAgIGNvbnN0IGNoYXIgKl9hY3BpX2Z1bmN0aW9uX25hbWUgPSBuYW1lOworCisjZWxzZQorLyogQ29tcGlsZXIgc3VwcG9ydHMgX19GVU5DVElPTl9fIChvciBlcXVpdmFsZW50KSAtLSBJZ25vcmUgdGhpcyBtYWNybyAqLworCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fTkFNRShuYW1lKQorI2VuZGlmCisKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRShhKSAgICAgICAgICBBQ1BJX0ZVTkNUSU9OX05BTUUoYSkgXAorCQkJCQkJCQkJCQlhY3BpX3V0X3RyYWNlKEFDUElfREVCVUdfUEFSQU1FVEVSUykKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoYSxiKSAgICBBQ1BJX0ZVTkNUSU9OX05BTUUoYSkgXAorCQkJCQkJCQkJCQlhY3BpX3V0X3RyYWNlX3B0cihBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsKHZvaWQgKiliKQorI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihhLGIpICAgIEFDUElfRlVOQ1RJT05fTkFNRShhKSBcCisJCQkJCQkJCQkJCWFjcGlfdXRfdHJhY2VfdTMyKEFDUElfREVCVUdfUEFSQU1FVEVSUywodTMyKWIpCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGEsYikgICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKKwkJCQkJCQkJCQkJYWNwaV91dF90cmFjZV9zdHIoQUNQSV9ERUJVR19QQVJBTUVURVJTLChjaGFyICopYikKKworI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX0VOVFJZKCkgICAgICAgICAgIGFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKCkKIAogLyoKICAqIEZ1bmN0aW9uIGV4aXQgdHJhY2luZy4KICAqIFdBUk5JTkc6IFRoZXNlIG1hY3JvcyBpbmNsdWRlIGEgcmV0dXJuIHN0YXRlbWVudC4gIFRoaXMgaXMgdXN1YWxseSBjb25zaWRlcmVkCiAgKiBiYWQgZm9ybSwgYnV0IGhhdmluZyBhIHNlcGFyYXRlIGV4aXQgbWFjcm8gaXMgdmVyeSB1Z2x5IGFuZCBkaWZmaWN1bHQgdG8gbWFpbnRhaW4uCiAgKiBPbmUgb2YgdGhlIEZVTkNUSU9OX1RSQUNFIG1hY3JvcyBhYm92ZSBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGVzZSBtYWNyb3MKLSAqIHNvIHRoYXQgIl9wcm9jX25hbWUiIGlzIGRlZmluZWQuCisgKiBzbyB0aGF0ICJfYWNwaV9mdW5jdGlvbl9uYW1lIiBpcyBkZWZpbmVkLgogICovCiAjaWZkZWYgQUNQSV9VU0VfRE9fV0hJTEVfMAogI2RlZmluZSBBQ1BJX0RPX1dISUxFMChhKSAgICAgICAgICAgICAgIGRvIGEgd2hpbGUoMCkKQEAgLTUxNywxMCArNTMyLDEwIEBACiAjZGVmaW5lIEFDUElfRE9fV0hJTEUwKGEpICAgICAgICAgICAgICAgYQogI2VuZGlmCiAKLSNkZWZpbmUgcmV0dXJuX1ZPSUQgICAgICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoe2FjcGlfdXRfZXhpdChfX0xJTkVfXywmX2RlYnVnX2luZm8pO3JldHVybjt9KQotI2RlZmluZSByZXR1cm5fQUNQSV9TVEFUVVMocykgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7YWNwaV91dF9zdGF0dXNfZXhpdChfX0xJTkVfXywmX2RlYnVnX2luZm8sKHMpKTtyZXR1cm4oKHMpKTt9KQotI2RlZmluZSByZXR1cm5fVkFMVUUocykgICAgICAgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7YWNwaV91dF92YWx1ZV9leGl0KF9fTElORV9fLCZfZGVidWdfaW5mbywoYWNwaV9pbnRlZ2VyKShzKSk7cmV0dXJuKChzKSk7fSkKLSNkZWZpbmUgcmV0dXJuX1BUUihzKSAgICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoe2FjcGlfdXRfcHRyX2V4aXQoX19MSU5FX18sJl9kZWJ1Z19pbmZvLCh1OCAqKShzKSk7cmV0dXJuKChzKSk7fSkKKyNkZWZpbmUgcmV0dXJuX1ZPSUQgICAgICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoe2FjcGlfdXRfZXhpdChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMpO3JldHVybjt9KQorI2RlZmluZSByZXR1cm5fQUNQSV9TVEFUVVMocykgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7YWNwaV91dF9zdGF0dXNfZXhpdChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsKHMpKTtyZXR1cm4oKHMpKTt9KQorI2RlZmluZSByZXR1cm5fVkFMVUUocykgICAgICAgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7YWNwaV91dF92YWx1ZV9leGl0KEFDUElfREVCVUdfUEFSQU1FVEVSUywoYWNwaV9pbnRlZ2VyKShzKSk7cmV0dXJuKChzKSk7fSkKKyNkZWZpbmUgcmV0dXJuX1BUUihzKSAgICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoe2FjcGlfdXRfcHRyX2V4aXQoQUNQSV9ERUJVR19QQVJBTUVURVJTLCh1OCAqKShzKSk7cmV0dXJuKChzKSk7fSkKIAogLyogQ29uZGl0aW9uYWwgZXhlY3V0aW9uICovCiAKQEAgLTUzMSwxMiArNTQ2LDEwIEBACiAjZGVmaW5lIEFDUElfREVCVUdfT05MWV9NRU1CRVJTKGEpICAgICAgYTsKICNkZWZpbmUgX1ZFUkJPU0VfU1RSVUNUVVJFUwogCi0KIC8qIFN0YWNrIGFuZCBidWZmZXIgZHVtcGluZyAqLwogCiAjZGVmaW5lIEFDUElfRFVNUF9TVEFDS19FTlRSWShhKSAgICAgICAgYWNwaV9leF9kdW1wX29wZXJhbmQoKGEpLDApCi0jZGVmaW5lIEFDUElfRFVNUF9PUEVSQU5EUyhhLGIsYyxkLGUpICAgYWNwaV9leF9kdW1wX29wZXJhbmRzKGEsYixjLGQsZSxfVEhJU19NT0RVTEUsX19MSU5FX18pCi0KKyNkZWZpbmUgQUNQSV9EVU1QX09QRVJBTkRTKGEsYixjLGQsZSkgICBhY3BpX2V4X2R1bXBfb3BlcmFuZHMoYSxiLGMsZCxlLF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fKQogCiAjZGVmaW5lIEFDUElfRFVNUF9FTlRSWShhLGIpICAgICAgICAgICAgYWNwaV9uc19kdW1wX2VudHJ5IChhLGIpCiAjZGVmaW5lIEFDUElfRFVNUF9QQVRITkFNRShhLGIsYyxkKSAgICAgYWNwaV9uc19kdW1wX3BhdGhuYW1lKGEsYixjLGQpCkBAIC01NDQsNyArNTU3LDYgQEAKICNkZWZpbmUgQUNQSV9EVU1QX0JVRkZFUihhLGIpICAgICAgICAgICBhY3BpX3V0X2R1bXBfYnVmZmVyKCh1OCAqKWEsYixEQl9CWVRFX0RJU1BMQVksX0NPTVBPTkVOVCkKICNkZWZpbmUgQUNQSV9CUkVBS19NU0coYSkgICAgICAgICAgICAgICBhY3BpX29zX3NpZ25hbCAoQUNQSV9TSUdOQUxfQlJFQUtQT0lOVCwoYSkpCiAKLQogLyoKICAqIEdlbmVyYXRlIElOVDMgb24gQUNQSV9FUlJPUiAoRGVidWcgb25seSEpCiAgKi8KQEAgLTU2NSwxNCArNTc3LDEzIEBACiAjZGVmaW5lIEFDUElfREVCVUdfUFJJTlQocGwpICAgICAgICAgICAgYWNwaV91dF9kZWJ1Z19wcmludCBBQ1BJX1BBUkFNX0xJU1QocGwpCiAjZGVmaW5lIEFDUElfREVCVUdfUFJJTlRfUkFXKHBsKSAgICAgICAgYWNwaV91dF9kZWJ1Z19wcmludF9yYXcgQUNQSV9QQVJBTV9MSVNUKHBsKQogCi0KICNlbHNlCiAvKgogICogVGhpcyBpcyB0aGUgbm9uLWRlYnVnIGNhc2UgLS0gbWFrZSBldmVyeXRoaW5nIGdvIGF3YXksCiAgKiBsZWF2aW5nIG5vIGV4ZWN1dGFibGUgZGVidWcgY29kZSEKICAqLwogI2RlZmluZSBBQ1BJX01PRFVMRV9OQU1FKG5hbWUpCi0jZGVmaW5lIF9USElTX01PRFVMRSAiIgorI2RlZmluZSBfYWNwaV9tb2R1bGVfbmFtZSAiIgogCiAjZGVmaW5lIEFDUElfREVCVUdfRVhFQyhhKQogI2RlZmluZSBBQ1BJX05PUk1BTF9FWEVDKGEpICAgICAgICAgICAgIGE7CkBAIC02MTYsNyArNjI3LDYgQEAKICNkZWZpbmUgQUNQSV9ERUJVR0dFUl9FWEVDKGEpCiAjZW5kaWYKIAotCiAvKgogICogRm9yIDE2LWJpdCBjb2RlLCB3ZSB3YW50IHRvIHNocmluayBzb21lIHRoaW5ncyBldmVuIHRob3VnaAogICogd2UgYXJlIHVzaW5nIEFDUElfREVCVUdfT1VUUFVUIHRvIGdldCB0aGUgZGVidWcgb3V0cHV0CkBAIC02MjcsNyArNjM3LDYgQEAKICNkZWZpbmUgQUNQSV9ERUJVR19PTkxZX01FTUJFUlMoYSkKICNlbmRpZgogCi0KICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAogLyoKICAqIDEpIFNldCBuYW1lIHRvIGJsYW5rcwpAQCAtNjQwLDcgKzY0OSw2IEBACiAjZGVmaW5lIEFDUElfQUREX09CSkVDVF9OQU1FKGEsYikKICNlbmRpZgogCi0KIC8qCiAgKiBNZW1vcnkgYWxsb2NhdGlvbiB0cmFja2luZyAoREVCVUcgT05MWSkKICAqLwpAQCAtNjQ4LDIxICs2NTYsMjAgQEAKIAogLyogTWVtb3J5IGFsbG9jYXRpb24gKi8KIAotI2RlZmluZSBBQ1BJX01FTV9BTExPQ0FURShhKSAgICAgICAgICAgIGFjcGlfdXRfYWxsb2NhdGUoKGFjcGlfc2l6ZSkoYSksX0NPTVBPTkVOVCxfVEhJU19NT0RVTEUsX19MSU5FX18pCi0jZGVmaW5lIEFDUElfTUVNX0NBTExPQ0FURShhKSAgICAgICAgICAgYWNwaV91dF9jYWxsb2NhdGUoKGFjcGlfc2l6ZSkoYSksIF9DT01QT05FTlQsX1RISVNfTU9EVUxFLF9fTElORV9fKQorI2RlZmluZSBBQ1BJX01FTV9BTExPQ0FURShhKSAgICAgICAgICAgIGFjcGlfdXRfYWxsb2NhdGUoKGFjcGlfc2l6ZSkoYSksX0NPTVBPTkVOVCxfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXykKKyNkZWZpbmUgQUNQSV9NRU1fQ0FMTE9DQVRFKGEpICAgICAgICAgICBhY3BpX3V0X2NhbGxvY2F0ZSgoYWNwaV9zaXplKShhKSwgX0NPTVBPTkVOVCxfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXykKICNkZWZpbmUgQUNQSV9NRU1fRlJFRShhKSAgICAgICAgICAgICAgICBhY3BpX29zX2ZyZWUoYSkKICNkZWZpbmUgQUNQSV9NRU1fVFJBQ0tJTkcoYSkKIAotCiAjZWxzZQogCiAvKiBNZW1vcnkgYWxsb2NhdGlvbiAqLwogCi0jZGVmaW5lIEFDUElfTUVNX0FMTE9DQVRFKGEpICAgICAgICAgICAgYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2soKGFjcGlfc2l6ZSkoYSksX0NPTVBPTkVOVCxfVEhJU19NT0RVTEUsX19MSU5FX18pCi0jZGVmaW5lIEFDUElfTUVNX0NBTExPQ0FURShhKSAgICAgICAgICAgYWNwaV91dF9jYWxsb2NhdGVfYW5kX3RyYWNrKChhY3BpX3NpemUpKGEpLCBfQ09NUE9ORU5ULF9USElTX01PRFVMRSxfX0xJTkVfXykKLSNkZWZpbmUgQUNQSV9NRU1fRlJFRShhKSAgICAgICAgICAgICAgICBhY3BpX3V0X2ZyZWVfYW5kX3RyYWNrKGEsX0NPTVBPTkVOVCxfVEhJU19NT0RVTEUsX19MSU5FX18pCisjZGVmaW5lIEFDUElfTUVNX0FMTE9DQVRFKGEpICAgICAgICAgICAgYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2soKGFjcGlfc2l6ZSkoYSksX0NPTVBPTkVOVCxfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXykKKyNkZWZpbmUgQUNQSV9NRU1fQ0FMTE9DQVRFKGEpICAgICAgICAgICBhY3BpX3V0X2NhbGxvY2F0ZV9hbmRfdHJhY2soKGFjcGlfc2l6ZSkoYSksIF9DT01QT05FTlQsX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18pCisjZGVmaW5lIEFDUElfTUVNX0ZSRUUoYSkgICAgICAgICAgICAgICAgYWNwaV91dF9mcmVlX2FuZF90cmFjayhhLF9DT01QT05FTlQsX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18pCiAjZGVmaW5lIEFDUElfTUVNX1RSQUNLSU5HKGEpICAgICAgICAgICAgYQogCi0jZW5kaWYgLyogQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMgKi8KKyNlbmRpZgkJCQkvKiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUyAqLwogCi0jZW5kaWYgLyogQUNNQUNST1NfSCAqLworI2VuZGlmCQkJCS8qIEFDTUFDUk9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY25hbWVzLmggYi9pbmNsdWRlL2FjcGkvYWNuYW1lcy5oCmluZGV4IGRlYjdjYjAuLjRmOTA2M2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY25hbWVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXMuaApAQCAtNzEsMTQgKzcxLDEzIEBACiAKIC8qIERlZmluaXRpb25zIG9mIHRoZSBwcmVkZWZpbmVkIG5hbWVzcGFjZSBuYW1lcyAgKi8KIAotI2RlZmluZSBBQ1BJX1VOS05PV05fTkFNRSAgICAgICAodTMyKSAweDNGM0YzRjNGICAgICAvKiBVbmtub3duIG5hbWUgaXMgICI/Pz8/IiAqLwotI2RlZmluZSBBQ1BJX1JPT1RfTkFNRSAgICAgICAgICAodTMyKSAweDVGNUY1RjVDICAgICAvKiBSb290IG5hbWUgaXMgICAgICJcX19fIiAqLwotI2RlZmluZSBBQ1BJX1NZU19CVVNfTkFNRSAgICAgICAodTMyKSAweDVGNTM0MjVGICAgICAvKiBTeXMgYnVzIG5hbWUgaXMgICJfU0JfIiAqLworI2RlZmluZSBBQ1BJX1VOS05PV05fTkFNRSAgICAgICAodTMyKSAweDNGM0YzRjNGCS8qIFVua25vd24gbmFtZSBpcyAiPz8/PyIgKi8KKyNkZWZpbmUgQUNQSV9ST09UX05BTUUgICAgICAgICAgKHUzMikgMHg1RjVGNUY1QwkvKiBSb290IG5hbWUgaXMgICAgIlxfX18iICovCisKKyNkZWZpbmUgQUNQSV9QUkVGSVhfTUlYRUQgICAgICAgKHUzMikgMHg2OTcwNjM0MQkvKiAiQWNwaSIgKi8KKyNkZWZpbmUgQUNQSV9QUkVGSVhfTE9XRVIgICAgICAgKHUzMikgMHg2OTcwNjM2MQkvKiAiYWNwaSIgKi8KIAogI2RlZmluZSBBQ1BJX05TX1JPT1RfUEFUSCAgICAgICAiXFwiCiAjZGVmaW5lIEFDUElfTlNfU1lTVEVNX0JVUyAgICAgICJfU0JfIgogCi0KLSNlbmRpZiAgLyogX19BQ05BTUVTX0hfXyAgKi8KLQotCisjZW5kaWYJCQkJLyogX19BQ05BTUVTX0hfXyAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY25hbWVzcC5oIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmgKaW5kZXggZDFiM2NlOC4uZGQzNTAxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmgKQEAgLTQ0LDcgKzQ0LDYgQEAKICNpZm5kZWYgX19BQ05BTUVTUF9IX18KICNkZWZpbmUgX19BQ05BTUVTUF9IX18KIAotCiAvKiBUbyBzZWFyY2ggdGhlIGVudGlyZSBuYW1lIHNwYWNlLCBwYXNzIHRoaXMgYXMgc2VhcmNoX2Jhc2UgKi8KIAogI2RlZmluZSBBQ1BJX05TX0FMTCAgICAgICAgICAgICAgICAgKChhY3BpX2hhbmRsZSkwKQpAQCAtNTQsOCArNTMsOCBAQAogICogYW5kIHNob3VsZCBiZSBvbmUtdG8tb25lIHdpdGggdmFsdWVzIG9mIGFjcGlfb2JqZWN0X3R5cGUKICAqLwogI2RlZmluZSBBQ1BJX05TX05PUk1BTCAgICAgICAgICAgICAgMAotI2RlZmluZSBBQ1BJX05TX05FV1NDT1BFICAgICAgICAgICAgMSAgIC8qIGEgZGVmaW5pdGlvbiBvZiB0aGlzIHR5cGUgb3BlbnMgYSBuYW1lIHNjb3BlICovCi0jZGVmaW5lIEFDUElfTlNfTE9DQUwgICAgICAgICAgICAgICAyICAgLyogc3VwcHJlc3Mgc2VhcmNoIG9mIGVuY2xvc2luZyBzY29wZXMgKi8KKyNkZWZpbmUgQUNQSV9OU19ORVdTQ09QRSAgICAgICAgICAgIDEJLyogYSBkZWZpbml0aW9uIG9mIHRoaXMgdHlwZSBvcGVucyBhIG5hbWUgc2NvcGUgKi8KKyNkZWZpbmUgQUNQSV9OU19MT0NBTCAgICAgICAgICAgICAgIDIJLyogc3VwcHJlc3Mgc2VhcmNoIG9mIGVuY2xvc2luZyBzY29wZXMgKi8KIAogLyogRmxhZ3MgZm9yIGFjcGlfbnNfbG9va3VwLCBhY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIgKi8KIApAQCAtNjgsMzU3ICs2NywyMzcgQEAKICNkZWZpbmUgQUNQSV9OU19XQUxLX1VOTE9DSyAgICAgICAgIFRSVUUKICNkZWZpbmUgQUNQSV9OU19XQUxLX05PX1VOTE9DSyAgICAgIEZBTFNFCiAKLQogLyoKICAqIG5zaW5pdCAtIE5hbWVzcGFjZSBpbml0aWFsaXphdGlvbgogICovCi1hY3BpX3N0YXR1cwotYWNwaV9uc19pbml0aWFsaXplX29iamVjdHMgKAotCXZvaWQpOworYWNwaV9zdGF0dXMgYWNwaV9uc19pbml0aWFsaXplX29iamVjdHModm9pZCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcyAoCi0Jdm9pZCk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfbnNfaW5pdGlhbGl6ZV9kZXZpY2VzKHZvaWQpOwogCiAvKgogICogbnNsb2FkIC0gIE5hbWVzcGFjZSBsb2FkaW5nCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfbmFtZXNwYWNlICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfbnNfbG9hZF9uYW1lc3BhY2Uodm9pZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7Ci0KK2FjcGlfbnNfbG9hZF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjLAorCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CiAKIC8qCiAgKiBuc3dhbGsgLSB3YWxrIHRoZSBuYW1lc3BhY2UKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X29iamVjdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXB0aCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubG9ja19iZWZvcmVfY2FsbGJhY2ssCi0JYWNwaV93YWxrX2NhbGxiYWNrICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CithY3BpX25zX3dhbGtfbmFtZXNwYWNlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJICAgICAgIGFjcGlfaGFuZGxlIHN0YXJ0X29iamVjdCwKKwkJICAgICAgIHUzMiBtYXhfZGVwdGgsCisJCSAgICAgICB1OCB1bmxvY2tfYmVmb3JlX2NhbGxiYWNrLAorCQkgICAgICAgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCisJCSAgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKIAotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgotYWNwaV9uc19nZXRfbmV4dF9ub2RlICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50LAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmNoaWxkKTsKLQorc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfZ2V0X25leHRfbm9kZShhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCQkJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICpwYXJlbnQsCisJCQkJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICpjaGlsZCk7CiAKIC8qCiAgKiBuc3BhcnNlIC0gdGFibGUgcGFyc2luZwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9uc19wYXJzZV90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYywKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpzY29wZSk7CithY3BpX25zX3BhcnNlX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2MsCisJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc2NvcGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc19udW1iZXIsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYyk7Ci0KK2FjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKHU4IHBhc3NfbnVtYmVyLCBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKTsKIAogLyoKICAqIG5zYWNjZXNzIC0gVG9wLWxldmVsIG5hbWVzcGFjZSBhY2Nlc3MKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfbnNfcm9vdF9pbml0aWFsaXplICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfbnNfcm9vdF9pbml0aWFsaXplKHZvaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19sb29rdXAgKAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnNjb3BlX2luZm8sCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUsCi0JYWNwaV9pbnRlcnByZXRlcl9tb2RlICAgICAgICAgICBpbnRlcnByZXRlcl9tb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqcmV0X25vZGUpOwotCithY3BpX25zX2xvb2t1cCh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm8sCisJICAgICAgIGNoYXIgKm5hbWUsCisJICAgICAgIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkgICAgICAgYWNwaV9pbnRlcnByZXRlcl9tb2RlIGludGVycHJldGVyX21vZGUsCisJICAgICAgIHUzMiBmbGFncywKKwkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkgICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXRfbm9kZSk7CiAKIC8qCiAgKiBuc2FsbG9jIC0gTmFtZWQgb2JqZWN0IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCiAgKi8KLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfbnNfY3JlYXRlX25vZGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CitzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19jcmVhdGVfbm9kZSh1MzIgbmFtZSk7CisKK3ZvaWQgYWNwaV9uc19kZWxldGVfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CiAKIHZvaWQKLWFjcGlfbnNfZGVsZXRlX25vZGUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpOworYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9oYW5kbGUpOwogCi12b2lkCi1hY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X2hhbmRsZSk7Cit2b2lkIGFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihhY3BpX293bmVyX2lkIG93bmVyX2lkKTsKIAotdm9pZAotYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2lkKTsKK3ZvaWQgYWNwaV9uc19kZXRhY2hfb2JqZWN0KHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKIAotdm9pZAotYWNwaV9uc19kZXRhY2hfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKK3ZvaWQgYWNwaV9uc19kZWxldGVfY2hpbGRyZW4oc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudCk7CiAKLXZvaWQKLWFjcGlfbnNfZGVsZXRlX2NoaWxkcmVuICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnQpOwotCi1pbnQKLWFjcGlfbnNfY29tcGFyZV9uYW1lcyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTEsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTIpOwotCitpbnQgYWNwaV9uc19jb21wYXJlX25hbWVzKGNoYXIgKm5hbWUxLCBjaGFyICpuYW1lMik7CiAKIC8qCiAgKiBuc2R1bXAgLSBOYW1lc3BhY2UgZHVtcC9wcmludCB1dGlsaXRpZXMKICAqLwogI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCi12b2lkCi1hY3BpX25zX2R1bXBfdGFibGVzICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF9iYXNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RlcHRoKTsKLSNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwordm9pZCBhY3BpX25zX2R1bXBfdGFibGVzKGFjcGlfaGFuZGxlIHNlYXJjaF9iYXNlLCB1MzIgbWF4X2RlcHRoKTsKKyNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLworCit2b2lkIGFjcGlfbnNfZHVtcF9lbnRyeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBkZWJ1Z19sZXZlbCk7CiAKIHZvaWQKLWFjcGlfbnNfZHVtcF9lbnRyeSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19sZXZlbCk7CithY3BpX25zX2R1bXBfcGF0aG5hbWUoYWNwaV9oYW5kbGUgaGFuZGxlLCBjaGFyICptc2csIHUzMiBsZXZlbCwgdTMyIGNvbXBvbmVudCk7CiAKLXZvaWQKLWFjcGlfbnNfZHVtcF9wYXRobmFtZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbXNnLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQpOwotCi12b2lkCi1hY3BpX25zX3ByaW50X3BhdGhuYW1lICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zZWdtZW50cywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRobmFtZSk7Cit2b2lkIGFjcGlfbnNfcHJpbnRfcGF0aG5hbWUodTMyIG51bV9zZWdtZW50cywgY2hhciAqcGF0aG5hbWUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19kdW1wX29uZV9vYmplY3QgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CithY3BpX25zX2R1bXBfb25lX29iamVjdChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKIAogI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiB2b2lkCi1hY3BpX25zX2R1bXBfb2JqZWN0cyAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV90eXBlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RlcHRoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZGVyX2lkLAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc3RhcnRfaGFuZGxlKTsKLSNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwotCithY3BpX25zX2R1bXBfb2JqZWN0cyhhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCSAgICAgdTggZGlzcGxheV90eXBlLAorCQkgICAgIHUzMiBtYXhfZGVwdGgsCisJCSAgICAgYWNwaV9vd25lcl9pZCBvd25lcl9pZCwgYWNwaV9oYW5kbGUgc3RhcnRfaGFuZGxlKTsKKyNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiAvKgogICogbnNldmFsIC0gTmFtZXNwYWNlIGV2YWx1YXRpb24gZnVuY3Rpb25zCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZSAoCi0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbyk7CithY3BpX3N0YXR1cyBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZShzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2V2YWx1YXRlX2J5X25hbWUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGhuYW1lLAotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pOworYWNwaV9uc19ldmFsdWF0ZV9ieV9uYW1lKGNoYXIgKnBhdGhuYW1lLCBzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRobmFtZSwKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKTsKLQorYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZShjaGFyICpwYXRobmFtZSwgc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pOwogCiAvKgogICogbnNuYW1lcyAtIE5hbWUgYW5kIFNjb3BlIG1hbmlwdWxhdGlvbgogICovCi11MzIKLWFjcGlfbnNfb3BlbnNfc2NvcGUgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSk7Cit1MzIgYWNwaV9uc19vcGVuc19zY29wZShhY3BpX29iamVjdF90eXBlIHR5cGUpOwogCi1jaGFyICoKLWFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKK2NoYXIgKmFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKIAotY2hhciAqCi1hY3BpX25zX25hbWVfb2ZfY3VycmVudF9zY29wZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CitjaGFyICphY3BpX25zX25hbWVfb2ZfY3VycmVudF9zY29wZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9oYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqYnVmZmVyKTsKK2FjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lKGFjcGlfaGFuZGxlIHRhcmdldF9oYW5kbGUsCisJCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKmJ1ZmZlcik7CiAKIHU4Ci1hY3BpX25zX3BhdHRlcm5fbWF0Y2ggKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm9ial9ub2RlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlYXJjaF9mb3IpOworYWNwaV9uc19wYXR0ZXJuX21hdGNoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpvYmpfbm9kZSwgY2hhciAqc2VhcmNoX2Zvcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2dldF9ub2RlX2J5X3BhdGggKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVybmFsX3BhdGhuYW1lLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmluX3ByZWZpeF9ub2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqKm91dF9ub2RlKTsKK2FjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aChjaGFyICpleHRlcm5hbF9wYXRobmFtZSwKKwkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqaW5fcHJlZml4X25vZGUsCisJCQkgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKm91dF9ub2RlKTsKIAotYWNwaV9zaXplCi1hY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGggKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpOwotCithY3BpX3NpemUgYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKIAogLyoKICAqIG5zb2JqZWN0IC0gT2JqZWN0IG1hbmFnZW1lbnQgZm9yIG5hbWVzcGFjZSBub2RlcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9uc19hdHRhY2hfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUpOworYWNwaV9uc19hdHRhY2hfb2JqZWN0KHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7CiAKLXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKgotYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChzdHJ1Y3QKKwkJCQkJCSAgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICAgICAgKm5vZGUpOwogCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoKLWFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QodW5pb24KKwkJCQkJCQlhY3BpX29wZXJhbmRfb2JqZWN0CisJCQkJCQkJKm9ial9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfYXR0YWNoX2RhdGEgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOworYWNwaV9uc19hdHRhY2hfZGF0YShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJICAgIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqZGF0YSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2RldGFjaF9kYXRhICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfb2JqZWN0X2hhbmRsZXIgICAgICAgICAgICAgaGFuZGxlcik7CithY3BpX25zX2RldGFjaF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkgICAgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfZ2V0X2F0dGFjaGVkX2RhdGEgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipkYXRhKTsKLQorYWNwaV9uc19nZXRfYXR0YWNoZWRfZGF0YShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICoqZGF0YSk7CiAKIC8qCiAgKiBuc3NlYXJjaCAtIE5hbWVzcGFjZSBzZWFyY2hpbmcgYW5kIGVudHJ5CiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfbmFtZSwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9pbnRlcnByZXRlcl9tb2RlICAgICAgICAgICBpbnRlcnByZXRlcl9tb2RlLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKipyZXRfbm9kZSk7CithY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIodTMyIGVudHJ5X25hbWUsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSBhY3BpX2ludGVycHJldGVyX21vZGUgaW50ZXJwcmV0ZXJfbW9kZSwKKwkJCSBhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCQkgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldF9ub2RlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfc2VhcmNoX25vZGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfbmFtZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqcmV0X25vZGUpOworYWNwaV9uc19zZWFyY2hfbm9kZSh1MzIgZW50cnlfbmFtZSwKKwkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkgICAgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXRfbm9kZSk7CiAKIHZvaWQKLWFjcGlfbnNfaW5zdGFsbF9ub2RlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlKTsKLQorYWNwaV9uc19pbnN0YWxsX25vZGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUsCisJCSAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7CiAKIC8qCiAgKiBuc3V0aWxzIC0gVXRpbGl0eSBmdW5jdGlvbnMKICAqLwotdTgKLWFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXggKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4KTsKK3U4IGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgoY2hhciBwcmVmaXgpOwogCi1hY3BpX29iamVjdF90eXBlCi1hY3BpX25zX2dldF90eXBlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKK2FjcGlfb2JqZWN0X3R5cGUgYWNwaV9uc19nZXRfdHlwZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CiAKLXUzMgotYWNwaV9uc19sb2NhbCAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlKTsKK3UzMiBhY3BpX25zX2xvY2FsKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7CiAKIHZvaWQKLWFjcGlfbnNfcmVwb3J0X2Vycm9yICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmludGVybmFsX25hbWUsCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBsb29rdXBfc3RhdHVzKTsKK2FjcGlfbnNfcmVwb3J0X2Vycm9yKGNoYXIgKm1vZHVsZV9uYW1lLAorCQkgICAgIHUzMiBsaW5lX251bWJlciwKKwkJICAgICB1MzIgY29tcG9uZW50X2lkLAorCQkgICAgIGNoYXIgKmludGVybmFsX25hbWUsIGFjcGlfc3RhdHVzIGxvb2t1cF9zdGF0dXMpOwogCiB2b2lkCi1hY3BpX25zX3JlcG9ydF9tZXRob2RfZXJyb3IgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbWVzc2FnZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGgsCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBsb29rdXBfc3RhdHVzKTsKK2FjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvcihjaGFyICptb2R1bGVfbmFtZSwKKwkJCSAgICB1MzIgbGluZV9udW1iZXIsCisJCQkgICAgdTMyIGNvbXBvbmVudF9pZCwKKwkJCSAgICBjaGFyICptZXNzYWdlLAorCQkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIGNoYXIgKnBhdGgsIGFjcGlfc3RhdHVzIGxvb2t1cF9zdGF0dXMpOwogCi12b2lkCi1hY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbXNnKTsKK3ZvaWQgYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLCBjaGFyICptc2cpOworCithY3BpX3N0YXR1cyBhY3BpX25zX2J1aWxkX2ludGVybmFsX25hbWUoc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvICppbmZvKTsKKwordm9pZCBhY3BpX25zX2dldF9pbnRlcm5hbF9uYW1lX2xlbmd0aChzdHJ1Y3QgYWNwaV9uYW1lc3RyaW5nX2luZm8gKmluZm8pOworCithY3BpX3N0YXR1cyBhY3BpX25zX2ludGVybmFsaXplX25hbWUoY2hhciAqZG90dGVkX25hbWUsIGNoYXIgKipjb252ZXJ0ZWRfbmFtZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2J1aWxkX2ludGVybmFsX25hbWUgKAotCXN0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbyAgICAgKmluZm8pOworYWNwaV9uc19leHRlcm5hbGl6ZV9uYW1lKHUzMiBpbnRlcm5hbF9uYW1lX2xlbmd0aCwKKwkJCSBjaGFyICppbnRlcm5hbF9uYW1lLAorCQkJIHUzMiAqIGNvbnZlcnRlZF9uYW1lX2xlbmd0aCwgY2hhciAqKmNvbnZlcnRlZF9uYW1lKTsKIAotdm9pZAotYWNwaV9uc19nZXRfaW50ZXJuYWxfbmFtZV9sZW5ndGggKAotCXN0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbyAgICAgKmluZm8pOworc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX25zX2ludGVybmFsaXplX25hbWUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRvdHRlZF9uYW1lLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipjb252ZXJ0ZWRfbmFtZSk7CithY3BpX2hhbmRsZSBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZXh0ZXJuYWxpemVfbmFtZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbF9uYW1lX2xlbmd0aCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnRlcm5hbF9uYW1lLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnZlcnRlZF9uYW1lX2xlbmd0aCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqY29udmVydGVkX25hbWUpOwordm9pZCBhY3BpX25zX3Rlcm1pbmF0ZSh2b2lkKTsKIAotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgotYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX2dldF9wYXJlbnRfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJICAgICpub2RlKTsKIAotYWNwaV9oYW5kbGUKLWFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CitzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlKHN0cnVjdAorCQkJCQkJCWFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCQkqbm9kZSk7CiAKLXZvaWQKLWFjcGlfbnNfdGVybWluYXRlICgKLQl2b2lkKTsKLQotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgotYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpOwotCi0KLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7Ci0KLSNlbmRpZiAvKiBfX0FDTkFNRVNQX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNOQU1FU1BfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvYmplY3QuaCBiL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oCmluZGV4IGUwNzliOTQuLjRhMzI2YmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oCkBAIC00NSw3ICs0NSw2IEBACiAjaWZuZGVmIF9BQ09CSkVDVF9ICiAjZGVmaW5lIF9BQ09CSkVDVF9ICiAKLQogLyoKICAqIFRoZSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgIGlzIHVzZWQgdG8gcGFzcyBBTUwgb3BlcmFuZHMgZnJvbSB0aGUgZGlzcGF0Y2hlcgogICogdG8gdGhlIGludGVycHJldGVyLCBhbmQgdG8ga2VlcCB0cmFjayBvZiB0aGUgdmFyaW91cyBoYW5kbGVycyBzdWNoIGFzCkBAIC04MSw3ICs4MCw2IEBACiAjZGVmaW5lIEFPUE9CSl9TRVRVUF9DT01QTEVURSAgICAgICAweDEwCiAjZGVmaW5lIEFPUE9CSl9TSU5HTEVfREFUVU0gICAgICAgICAweDIwCiAKLQogLyoKICAqIENvbW1vbiBiaXRmaWVsZCBmb3IgdGhlIGZpZWxkIG9iamVjdHMKICAqICJGaWVsZCBEYXR1bSIgIC0tIGEgZGF0dW0gZnJvbSB0aGUgYWN0dWFsIGZpZWxkIG9iamVjdApAQCAtOTYsOCArOTQsNyBAQAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9maWVsZF9iaXRfb2Zmc2V0Oy8qIEJpdCBvZmZzZXQgd2l0aGluIGZpcnN0IGZpZWxkIGRhdHVtICgwLTYzKSAqL1wKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2JpdF93aWR0aDsgICAvKiBSZWFkL1dyaXRlIHNpemUgaW4gYml0cyAoOC02NCkgKi9cCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOyAgICAgICAgICAgICAgLyogVmFsdWUgdG8gc3RvcmUgaW50byB0aGUgQmFuayBvciBJbmRleCByZWdpc3RlciAqL1wKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKm5vZGU7ICAgICAgICAgICAgICAvKiBMaW5rIGJhY2sgdG8gcGFyZW50IG5vZGUgKi8KLQorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICAgICAqbm9kZTsJLyogTGluayBiYWNrIHRvIHBhcmVudCBub2RlICovCiAKIC8qCiAgKiBGaWVsZHMgY29tbW9uIHRvIGJvdGggU3RyaW5ncyBhbmQgQnVmZmVycwpAQCAtMTA1LDE1ICsxMDIsMTMgQEAKICNkZWZpbmUgQUNQSV9DT01NT05fQlVGRkVSX0lORk8gXAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CiAKLQogLyoKICAqIENvbW1vbiBmaWVsZHMgZm9yIG9iamVjdHMgdGhhdCBzdXBwb3J0IEFTTCBub3RpZmljYXRpb25zCiAgKi8KICNkZWZpbmUgQUNQSV9DT01NT05fTk9USUZZX0lORk8gXAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqc3lzdGVtX25vdGlmeTsgICAgIC8qIEhhbmRsZXIgZm9yIHN5c3RlbSBub3RpZmllcyAqL1wKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAgICAgKmRldmljZV9ub3RpZnk7ICAgICAvKiBIYW5kbGVyIGZvciBkcml2ZXIgbm90aWZpZXMgKi9cCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpoYW5kbGVyOyAgICAgICAgICAgLyogSGFuZGxlciBmb3IgQWRkcmVzcyBzcGFjZSAqLwotCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpoYW5kbGVyOwkvKiBIYW5kbGVyIGZvciBBZGRyZXNzIHNwYWNlICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMjEsMTYxICsxMTYsMTEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV9vYmplY3RfY29tbW9uCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgorc3RydWN0IGFjcGlfb2JqZWN0X2NvbW1vbiB7CitBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSfTsKKworc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgeworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgYWNwaV9pbnRlZ2VyIHZhbHVlOwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9vYmplY3RfaW50ZWdlcgotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7Ci19OwotCi0KIC8qCiAgKiBOb3RlOiBUaGUgU3RyaW5nIGFuZCBCdWZmZXIgb2JqZWN0IG11c3QgYmUgaWRlbnRpY2FsIHRocm91Z2ggdGhlIFBvaW50ZXIKICAqIGVsZW1lbnQuICBUaGVyZSBpcyBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLgogICovCi1zdHJ1Y3QgYWNwaV9vYmplY3Rfc3RyaW5nICAgICAgICAgICAvKiBOdWxsIHRlcm1pbmF0ZWQsIEFTQ0lJIGNoYXJhY3RlcnMgb25seSAqLwotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9CVUZGRVJfSU5GTwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9pbnRlcjsgICAgICAgICAgIC8qIFN0cmluZyBpbiBBTUwgc3RyZWFtIG9yIGFsbG9jYXRlZCBzdHJpbmcgKi8KK3N0cnVjdCBhY3BpX29iamVjdF9zdHJpbmcgewkvKiBOdWxsIHRlcm1pbmF0ZWQsIEFTQ0lJIGNoYXJhY3RlcnMgb25seSAqLworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgQUNQSV9DT01NT05fQlVGRkVSX0lORk8gY2hhciAqcG9pbnRlcjsJLyogU3RyaW5nIGluIEFNTCBzdHJlYW0gb3IgYWxsb2NhdGVkIHN0cmluZyAqLwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9vYmplY3RfYnVmZmVyCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCUFDUElfQ09NTU9OX0JVRkZFUl9JTkZPCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2ludGVyOyAgICAgICAgICAgLyogQnVmZmVyIGluIEFNTCBzdHJlYW0gb3IgYWxsb2NhdGVkIGJ1ZmZlciAqLwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICAgICAqbm9kZTsgICAgICAgICAgICAgIC8qIExpbmsgYmFjayB0byBwYXJlbnQgbm9kZSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sX3N0YXJ0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoOworc3RydWN0IGFjcGlfb2JqZWN0X2J1ZmZlciB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9CVUZGRVJfSU5GTyB1OCAqIHBvaW50ZXI7CS8qIEJ1ZmZlciBpbiBBTUwgc3RyZWFtIG9yIGFsbG9jYXRlZCBidWZmZXIgKi8KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsJLyogTGluayBiYWNrIHRvIHBhcmVudCBub2RlICovCisJdTggKmFtbF9zdGFydDsKKwl1MzIgYW1sX2xlbmd0aDsKIH07CiAKLQotc3RydWN0IGFjcGlfb2JqZWN0X3BhY2thZ2UKLXsKLQlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSCi0KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7ICAgICAgICAgICAgICAvKiAjIG9mIGVsZW1lbnRzIGluIHBhY2thZ2UgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX2xlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9zdGFydDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKm5vZGU7ICAgICAgICAgICAgICAvKiBMaW5rIGJhY2sgdG8gcGFyZW50IG5vZGUgKi8KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAgICAgKiplbGVtZW50czsgICAgICAgICAvKiBBcnJheSBvZiBwb2ludGVycyB0byBhY3BpX29iamVjdHMgKi8KK3N0cnVjdCBhY3BpX29iamVjdF9wYWNrYWdlIHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHUzMiBjb3VudDsJLyogIyBvZiBlbGVtZW50cyBpbiBwYWNrYWdlICovCisJdTMyIGFtbF9sZW5ndGg7CisJdTggKmFtbF9zdGFydDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsJLyogTGluayBiYWNrIHRvIHBhcmVudCBub2RlICovCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmVsZW1lbnRzOwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBhY3BpX29iamVjdHMgKi8KIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIENvbXBsZXggZGF0YSB0eXBlcwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfb2JqZWN0X2V2ZW50Ci17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VtYXBob3JlOworc3RydWN0IGFjcGlfb2JqZWN0X2V2ZW50IHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHZvaWQgKnNlbWFwaG9yZTsKIH07CiAKLQogI2RlZmluZSBBQ1BJX0lORklOSVRFX0NPTkNVUlJFTkNZICAgMHhGRgogCiB0eXBlZGVmCi1hY3BpX3N0YXR1cyAoKkFDUElfSU5URVJOQUxfTUVUSE9EKSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX3N0YXR1cygqQUNQSV9JTlRFUk5BTF9NRVRIT0QpIChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSk7CiAKLXN0cnVjdCBhY3BpX29iamVjdF9tZXRob2QKLXsKLQlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9mbGFnczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fY291bnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9sZW5ndGg7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZW1hcGhvcmU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQ7Ci0JQUNQSV9JTlRFUk5BTF9NRVRIT0QgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3k7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9jb3VudDsKLQlhY3BpX293bmVyX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duaW5nX2lkOworc3RydWN0IGFjcGlfb2JqZWN0X21ldGhvZCB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiB1OCBtZXRob2RfZmxhZ3M7CisJdTggcGFyYW1fY291bnQ7CisJdTMyIGFtbF9sZW5ndGg7CisJdm9pZCAqc2VtYXBob3JlOworCXU4ICphbWxfc3RhcnQ7CisJQUNQSV9JTlRFUk5BTF9NRVRIT0QgaW1wbGVtZW50YXRpb247CisJdTggY29uY3VycmVuY3k7CisJdTggdGhyZWFkX2NvdW50OworCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7CiB9OwogCi0KLXN0cnVjdCBhY3BpX29iamVjdF9tdXRleAotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19sZXZlbDsgICAgICAgICAvKiAwLTE1LCBzcGVjaWZpZWQgaW4gTXV0ZXgoKSBjYWxsICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpc2l0aW9uX2RlcHRoOyAgLyogQWxsb3cgbXVsdGlwbGUgQWNxdWlyZXMsIHNhbWUgdGhyZWFkICovCi0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAgICAgICAgICpvd25lcl90aHJlYWQ7ICAgICAgLyogQ3VycmVudCBvd25lciBvZiB0aGUgbXV0ZXggKi8KLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlbWFwaG9yZTsgICAgICAgICAvKiBBY3R1YWwgT1Mgc3luY2hyb25pemF0aW9uIG9iamVjdCAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqcHJldjsgICAgICAgICAgICAgIC8qIExpbmsgZm9yIGxpc3Qgb2YgYWNxdWlyZWQgbXV0ZXhlcyAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqbmV4dDsgICAgICAgICAgICAgIC8qIExpbmsgZm9yIGxpc3Qgb2YgYWNxdWlyZWQgbXV0ZXhlcyAqLwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICAgICAqbm9kZTsgICAgICAgICAgICAgIC8qIENvbnRhaW5pbmcgbmFtZXNwYWNlIG5vZGUgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfc3luY19sZXZlbDsgLyogT3duZXIncyBvcmlnaW5hbCBzeW5jIGxldmVsICgwLTE1KSAqLworc3RydWN0IGFjcGlfb2JqZWN0X211dGV4IHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHU4IHN5bmNfbGV2ZWw7CS8qIDAtMTUsIHNwZWNpZmllZCBpbiBNdXRleCgpIGNhbGwgKi8KKwl1MTYgYWNxdWlzaXRpb25fZGVwdGg7CS8qIEFsbG93IG11bHRpcGxlIEFjcXVpcmVzLCBzYW1lIHRocmVhZCAqLworCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqb3duZXJfdGhyZWFkOwkvKiBDdXJyZW50IG93bmVyIG9mIHRoZSBtdXRleCAqLworCXZvaWQgKnNlbWFwaG9yZTsJLyogQWN0dWFsIE9TIHN5bmNocm9uaXphdGlvbiBvYmplY3QgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwcmV2OwkvKiBMaW5rIGZvciBsaXN0IG9mIGFjcXVpcmVkIG11dGV4ZXMgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0OwkvKiBMaW5rIGZvciBsaXN0IG9mIGFjcXVpcmVkIG11dGV4ZXMgKi8KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsJLyogQ29udGFpbmluZyBuYW1lc3BhY2Ugbm9kZSAqLworCXU4IG9yaWdpbmFsX3N5bmNfbGV2ZWw7CS8qIE93bmVyJ3Mgb3JpZ2luYWwgc3luYyBsZXZlbCAoMC0xNSkgKi8KIH07CiAKLQotc3RydWN0IGFjcGlfb2JqZWN0X3JlZ2lvbgotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV9pZDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAgICAgKmhhbmRsZXI7ICAgICAgICAgICAvKiBIYW5kbGVyIGZvciByZWdpb24gYWNjZXNzICovCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgICAgICpub2RlOyAgICAgICAgICAgICAgLyogQ29udGFpbmluZyBuYW1lc3BhY2Ugbm9kZSAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqbmV4dDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgICAgICAgICBhZGRyZXNzOworc3RydWN0IGFjcGlfb2JqZWN0X3JlZ2lvbiB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiB1OCBzcGFjZV9pZDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyOwkvKiBIYW5kbGVyIGZvciByZWdpb24gYWNjZXNzICovCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CS8qIENvbnRhaW5pbmcgbmFtZXNwYWNlIG5vZGUgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0OworCXUzMiBsZW5ndGg7CisJYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3M7CiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBPYmplY3RzIHRoYXQgY2FuIGJlIG5vdGlmaWVkLiAgQWxsIHNoYXJlIGEgY29tbW9uIG5vdGlmeV9pbmZvIGFyZWEuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV9vYmplY3Rfbm90aWZ5X2NvbW1vbiAgICAgICAgICAgIC8qIENPTU1PTiBOT1RJRlkgZm9yIFBPV0VSLCBQUk9DRVNTT1IsIERFVklDRSwgYW5kIFRIRVJNQUwgKi8KLXsKK3N0cnVjdCBhY3BpX29iamVjdF9ub3RpZnlfY29tbW9uIHsJLyogQ09NTU9OIE5PVElGWSBmb3IgUE9XRVIsIFBST0NFU1NPUiwgREVWSUNFLCBhbmQgVEhFUk1BTCAqLworQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9OT1RJRllfSU5GT307CisKK3N0cnVjdCBhY3BpX29iamVjdF9kZXZpY2UgewogCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9OT1RJRllfSU5GTworCSAgICBBQ1BJX0NPTU1PTl9OT1RJRllfSU5GTyBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9vYmplY3RfZGV2aWNlCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCUFDUElfQ09NTU9OX05PVElGWV9JTkZPCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAgICAgICAgICpncGVfYmxvY2s7CitzdHJ1Y3QgYWNwaV9vYmplY3RfcG93ZXJfcmVzb3VyY2UgeworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgQUNQSV9DT01NT05fTk9USUZZX0lORk8gdTMyIHN5c3RlbV9sZXZlbDsKKwl1MzIgcmVzb3VyY2Vfb3JkZXI7CiB9OwogCi0KLXN0cnVjdCBhY3BpX29iamVjdF9wb3dlcl9yZXNvdXJjZQotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9OT1RJRllfSU5GTwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbGV2ZWw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX29yZGVyOworc3RydWN0IGFjcGlfb2JqZWN0X3Byb2Nlc3NvciB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9OT1RJRllfSU5GTyB1MzIgcHJvY19pZDsKKwl1MzIgbGVuZ3RoOworCWFjcGlfaW9fYWRkcmVzcyBhZGRyZXNzOwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9vYmplY3RfcHJvY2Vzc29yCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCUFDUElfQ09NTU9OX05PVElGWV9JTkZPCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfaWQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQlhY3BpX2lvX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczsKLX07Ci0KLQotc3RydWN0IGFjcGlfb2JqZWN0X3RoZXJtYWxfem9uZQotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9OT1RJRllfSU5GTwotfTsKLQorc3RydWN0IGFjcGlfb2JqZWN0X3RoZXJtYWxfem9uZSB7CitBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIEFDUElfQ09NTU9OX05PVElGWV9JTkZPfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTI4Myw5MCArMjI3LDYzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV9vYmplY3RfZmllbGRfY29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPTU1PTiBGSUVMRCAoZm9yIEJVRkZFUiwgUkVHSU9OLCBCQU5LLCBhbmQgSU5ERVggZmllbGRzKSAqLwotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpyZWdpb25fb2JqOyAgICAgICAgLyogQ29udGFpbmluZyBPcGVyYXRpb24gUmVnaW9uIG9iamVjdCAqLwotCQkJICAvKiAoUkVHSU9OL0JBTksgZmllbGRzIG9ubHkpICovCitzdHJ1Y3QgYWNwaV9vYmplY3RfZmllbGRfY29tbW9uIHsJLyogQ09NTU9OIEZJRUxEIChmb3IgQlVGRkVSLCBSRUdJT04sIEJBTkssIGFuZCBJTkRFWCBmaWVsZHMpICovCisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmo7CS8qIENvbnRhaW5pbmcgT3BlcmF0aW9uIFJlZ2lvbiBvYmplY3QgKi8KKwkvKiAoUkVHSU9OL0JBTksgZmllbGRzIG9ubHkpICovCiB9OwogCi0KLXN0cnVjdCBhY3BpX29iamVjdF9yZWdpb25fZmllbGQKLXsKLQlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSCi0JQUNQSV9DT01NT05fRklFTERfSU5GTwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqcmVnaW9uX29iajsgICAgICAgIC8qIENvbnRhaW5pbmcgb3BfcmVnaW9uIG9iamVjdCAqLworc3RydWN0IGFjcGlfb2JqZWN0X3JlZ2lvbl9maWVsZCB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmo7CS8qIENvbnRhaW5pbmcgb3BfcmVnaW9uIG9iamVjdCAqLwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9vYmplY3RfYmFua19maWVsZAotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpyZWdpb25fb2JqOyAgICAgICAgLyogQ29udGFpbmluZyBvcF9yZWdpb24gb2JqZWN0ICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpiYW5rX29iajsgICAgICAgICAgLyogYmFua19zZWxlY3QgUmVnaXN0ZXIgb2JqZWN0ICovCitzdHJ1Y3QgYWNwaV9vYmplY3RfYmFua19maWVsZCB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmo7CS8qIENvbnRhaW5pbmcgb3BfcmVnaW9uIG9iamVjdCAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmJhbmtfb2JqOwkvKiBiYW5rX3NlbGVjdCBSZWdpc3RlciBvYmplY3QgKi8KIH07CiAKLQotc3RydWN0IGFjcGlfb2JqZWN0X2luZGV4X2ZpZWxkCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCUFDUElfQ09NTU9OX0ZJRUxEX0lORk8KLQotCS8qCi0JICogTm8gInJlZ2lvbl9vYmoiIHBvaW50ZXIgbmVlZGVkIHNpbmNlIHRoZSBJbmRleCBhbmQgRGF0YSByZWdpc3RlcnMKLQkgKiBhcmUgZWFjaCBmaWVsZCBkZWZpbml0aW9ucyB1bnRvIHRoZW1zZWx2ZXMuCi0JICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICppbmRleF9vYmo7ICAgICAgICAgLyogSW5kZXggcmVnaXN0ZXIgKi8KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAgICAgKmRhdGFfb2JqOyAgICAgICAgICAvKiBEYXRhIHJlZ2lzdGVyICovCitzdHJ1Y3QgYWNwaV9vYmplY3RfaW5kZXhfZmllbGQgeworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgQUNQSV9DT01NT05fRklFTERfSU5GTworCSAgICAvKgorCSAgICAgKiBObyAicmVnaW9uX29iaiIgcG9pbnRlciBuZWVkZWQgc2luY2UgdGhlIEluZGV4IGFuZCBEYXRhIHJlZ2lzdGVycworCSAgICAgKiBhcmUgZWFjaCBmaWVsZCBkZWZpbml0aW9ucyB1bnRvIHRoZW1zZWx2ZXMuCisJICAgICAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmluZGV4X29iajsJLyogSW5kZXggcmVnaXN0ZXIgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkYXRhX29iajsJLyogRGF0YSByZWdpc3RlciAqLwogfTsKIAotCiAvKiBUaGUgYnVmZmVyX2ZpZWxkIGlzIGRpZmZlcmVudCBpbiB0aGF0IGl0IGlzIHBhcnQgb2YgYSBCdWZmZXIsIG5vdCBhbiBvcF9yZWdpb24gKi8KIAotc3RydWN0IGFjcGlfb2JqZWN0X2J1ZmZlcl9maWVsZAotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpidWZmZXJfb2JqOyAgICAgICAgLyogQ29udGFpbmluZyBCdWZmZXIgb2JqZWN0ICovCitzdHJ1Y3QgYWNwaV9vYmplY3RfYnVmZmVyX2ZpZWxkIHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIEFDUElfQ09NTU9OX0ZJRUxEX0lORk8gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYnVmZmVyX29iajsJLyogQ29udGFpbmluZyBCdWZmZXIgb2JqZWN0ICovCiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBPYmplY3RzIGZvciBoYW5kbGVycwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfb2JqZWN0X25vdGlmeV9oYW5kbGVyCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICAgICAqbm9kZTsgICAgICAgICAgICAgIC8qIFBhcmVudCBkZXZpY2UgKi8KLQlhY3BpX25vdGlmeV9oYW5kbGVyICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQ7CitzdHJ1Y3QgYWNwaV9vYmplY3Rfbm90aWZ5X2hhbmRsZXIgeworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CS8qIFBhcmVudCBkZXZpY2UgKi8KKwlhY3BpX25vdGlmeV9oYW5kbGVyIGhhbmRsZXI7CisJdm9pZCAqY29udGV4dDsKIH07CiAKLQogLyogRmxhZ3MgZm9yIGFkZHJlc3MgaGFuZGxlciAqLwogCiAjZGVmaW5lIEFDUElfQUREUl9IQU5ETEVSX0RFRkFVTFRfSU5TVEFMTEVEICAweDEKIAotCi1zdHJ1Y3QgYWNwaV9vYmplY3RfYWRkcl9oYW5kbGVyCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV9pZDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGZsYWdzOwotCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgICAgICAgICAgICAgICAgICBoYW5kbGVyOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICAgICAqbm9kZTsgICAgICAgICAgICAgIC8qIFBhcmVudCBkZXZpY2UgKi8KLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQ7Ci0JYWNwaV9hZHJfc3BhY2Vfc2V0dXAgICAgICAgICAgICAgICAgICAgIHNldHVwOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqcmVnaW9uX2xpc3Q7ICAgICAgIC8qIHJlZ2lvbnMgdXNpbmcgdGhpcyBoYW5kbGVyICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpuZXh0Oworc3RydWN0IGFjcGlfb2JqZWN0X2FkZHJfaGFuZGxlciB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiB1OCBzcGFjZV9pZDsKKwl1MTYgaGZsYWdzOworCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgaGFuZGxlcjsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsJLyogUGFyZW50IGRldmljZSAqLworCXZvaWQgKmNvbnRleHQ7CisJYWNwaV9hZHJfc3BhY2Vfc2V0dXAgc2V0dXA7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX2xpc3Q7CS8qIHJlZ2lvbnMgdXNpbmcgdGhpcyBoYW5kbGVyICovCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dDsKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFNwZWNpYWwgaW50ZXJuYWwgb2JqZWN0cwpAQCAtMzc3LDE4ICsyOTQsMTUgQEAKICAqIFRoZSBSZWZlcmVuY2Ugb2JqZWN0IHR5cGUgaXMgdXNlZCBmb3IgdGhlc2Ugb3Bjb2RlczoKICAqIEFyZ1swLTZdLCBMb2NhbFswLTddLCBpbmRleF9vcCwgbmFtZV9vcCwgemVyb19vcCwgb25lX29wLCBvbmVzX29wLCBkZWJ1Z19vcAogICovCi1zdHJ1Y3QgYWNwaV9vYmplY3RfcmVmZXJlbmNlCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdHlwZTsgICAgICAgIC8qIFVzZWQgZm9yIGluZGV4X29wICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OyAgICAgICAgICAgICAvKiBVc2VkIGZvciBhcmdfb3AsIGxvY2FsX29wLCBhbmQgaW5kZXhfb3AgKi8KLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdDsgICAgICAgICAgICAvKiBuYW1lX29wPT5IQU5ETEUgdG8gb2JqLCBpbmRleF9vcD0+dW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgKi8KLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKm5vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICoqd2hlcmU7CitzdHJ1Y3QgYWNwaV9vYmplY3RfcmVmZXJlbmNlIHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHU4IHRhcmdldF90eXBlOwkvKiBVc2VkIGZvciBpbmRleF9vcCAqLworCXUxNiBvcGNvZGU7CisJdTMyIG9mZnNldDsJCS8qIFVzZWQgZm9yIGFyZ19vcCwgbG9jYWxfb3AsIGFuZCBpbmRleF9vcCAqLworCXZvaWQgKm9iamVjdDsJCS8qIG5hbWVfb3A9PkhBTkRMRSB0byBvYmosIGluZGV4X29wPT51bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAqLworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKip3aGVyZTsKIH07CiAKLQogLyoKICAqIEV4dHJhIG9iamVjdCBpcyB1c2VkIGFzIGFkZGl0aW9uYWwgc3RvcmFnZSBmb3IgdHlwZXMgdGhhdAogICogaGF2ZSBBTUwgY29kZSBpbiB0aGVpciBkZWNsYXJhdGlvbnMgKHRlcm1fYXJncykgdGhhdCBtdXN0IGJlCkBAIC0zOTYsNzMgKzMxMCw2MiBAQAogICoKICAqIEN1cnJlbnRseTogUmVnaW9uIGFuZCBmaWVsZF91bml0IHR5cGVzCiAgKi8KLXN0cnVjdCBhY3BpX29iamVjdF9leHRyYQotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9maWxsMTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZF9maWxsMTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX2xlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9zdGFydDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKm1ldGhvZF9SRUc7ICAgICAgICAvKiBfUkVHIG1ldGhvZCBmb3IgdGhpcyByZWdpb24gKGlmIGFueSkgKi8KLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2lvbl9jb250ZXh0OyAgICAvKiBSZWdpb24tc3BlY2lmaWMgZGF0YSAqLworc3RydWN0IGFjcGlfb2JqZWN0X2V4dHJhIHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHU4IGJ5dGVfZmlsbDE7CisJdTE2IHdvcmRfZmlsbDE7CisJdTMyIGFtbF9sZW5ndGg7CisJdTggKmFtbF9zdGFydDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX1JFRzsJLyogX1JFRyBtZXRob2QgZm9yIHRoaXMgcmVnaW9uIChpZiBhbnkpICovCisJdm9pZCAqcmVnaW9uX2NvbnRleHQ7CS8qIFJlZ2lvbi1zcGVjaWZpYyBkYXRhICovCiB9OwogCi0KIC8qIEFkZGl0aW9uYWwgZGF0YSB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBuYW1lc3BhY2Ugbm9kZXMgKi8KIAotc3RydWN0IGFjcGlfb2JqZWN0X2RhdGEKLXsKLQlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSCi0JYWNwaV9vYmplY3RfaGFuZGxlciAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXI7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2ludGVyOworc3RydWN0IGFjcGlfb2JqZWN0X2RhdGEgeworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyOworCXZvaWQgKnBvaW50ZXI7CiB9OwogCi0KIC8qIFN0cnVjdHVyZSB1c2VkIHdoZW4gb2JqZWN0cyBhcmUgY2FjaGVkIGZvciByZXVzZSAqLwogCi1zdHJ1Y3QgYWNwaV9vYmplY3RfY2FjaGVfbGlzdAotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAgICAgKm5leHQ7ICAgICAgICAgICAgICAvKiBMaW5rIGZvciBvYmplY3QgY2FjaGUgYW5kIGludGVybmFsIGxpc3RzKi8KK3N0cnVjdCBhY3BpX29iamVjdF9jYWNoZV9saXN0IHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5leHQ7CS8qIExpbmsgZm9yIG9iamVjdCBjYWNoZSBhbmQgaW50ZXJuYWwgbGlzdHMgKi8KIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgRGVzY3JpcHRvciAtIGEgZ2lhbnQgdW5pb24gb2YgYWxsIG9mIHRoZSBhYm92ZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAotewotCXN0cnVjdCBhY3BpX29iamVjdF9jb21tb24gICAgICAgICAgICAgICBjb21tb247Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgICAgICAgICAgICAgIGludGVnZXI7Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X3N0cmluZyAgICAgICAgICAgICAgIHN0cmluZzsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfYnVmZmVyICAgICAgICAgICAgICAgYnVmZmVyOwotCXN0cnVjdCBhY3BpX29iamVjdF9wYWNrYWdlICAgICAgICAgICAgICBwYWNrYWdlOwotCXN0cnVjdCBhY3BpX29iamVjdF9ldmVudCAgICAgICAgICAgICAgICBldmVudDsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbWV0aG9kICAgICAgICAgICAgICAgbWV0aG9kOwotCXN0cnVjdCBhY3BpX29iamVjdF9tdXRleCAgICAgICAgICAgICAgICBtdXRleDsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfcmVnaW9uICAgICAgICAgICAgICAgcmVnaW9uOwotCXN0cnVjdCBhY3BpX29iamVjdF9ub3RpZnlfY29tbW9uICAgICAgICBjb21tb25fbm90aWZ5OwotCXN0cnVjdCBhY3BpX29iamVjdF9kZXZpY2UgICAgICAgICAgICAgICBkZXZpY2U7Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X3Bvd2VyX3Jlc291cmNlICAgICAgIHBvd2VyX3Jlc291cmNlOwotCXN0cnVjdCBhY3BpX29iamVjdF9wcm9jZXNzb3IgICAgICAgICAgICBwcm9jZXNzb3I7Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X3RoZXJtYWxfem9uZSAgICAgICAgIHRoZXJtYWxfem9uZTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfZmllbGRfY29tbW9uICAgICAgICAgY29tbW9uX2ZpZWxkOwotCXN0cnVjdCBhY3BpX29iamVjdF9yZWdpb25fZmllbGQgICAgICAgICBmaWVsZDsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfYnVmZmVyX2ZpZWxkICAgICAgICAgYnVmZmVyX2ZpZWxkOwotCXN0cnVjdCBhY3BpX29iamVjdF9iYW5rX2ZpZWxkICAgICAgICAgICBiYW5rX2ZpZWxkOwotCXN0cnVjdCBhY3BpX29iamVjdF9pbmRleF9maWVsZCAgICAgICAgICBpbmRleF9maWVsZDsKLQlzdHJ1Y3QgYWNwaV9vYmplY3Rfbm90aWZ5X2hhbmRsZXIgICAgICAgbm90aWZ5OwotCXN0cnVjdCBhY3BpX29iamVjdF9hZGRyX2hhbmRsZXIgICAgICAgICBhZGRyZXNzX3NwYWNlOwotCXN0cnVjdCBhY3BpX29iamVjdF9yZWZlcmVuY2UgICAgICAgICAgICByZWZlcmVuY2U7Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2V4dHJhICAgICAgICAgICAgICAgIGV4dHJhOwotCXN0cnVjdCBhY3BpX29iamVjdF9kYXRhICAgICAgICAgICAgICAgICBkYXRhOwotCXN0cnVjdCBhY3BpX29iamVjdF9jYWNoZV9saXN0ICAgICAgICAgICBjYWNoZTsKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgeworCXN0cnVjdCBhY3BpX29iamVjdF9jb21tb24gY29tbW9uOworCXN0cnVjdCBhY3BpX29iamVjdF9pbnRlZ2VyIGludGVnZXI7CisJc3RydWN0IGFjcGlfb2JqZWN0X3N0cmluZyBzdHJpbmc7CisJc3RydWN0IGFjcGlfb2JqZWN0X2J1ZmZlciBidWZmZXI7CisJc3RydWN0IGFjcGlfb2JqZWN0X3BhY2thZ2UgcGFja2FnZTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfZXZlbnQgZXZlbnQ7CisJc3RydWN0IGFjcGlfb2JqZWN0X21ldGhvZCBtZXRob2Q7CisJc3RydWN0IGFjcGlfb2JqZWN0X211dGV4IG11dGV4OworCXN0cnVjdCBhY3BpX29iamVjdF9yZWdpb24gcmVnaW9uOworCXN0cnVjdCBhY3BpX29iamVjdF9ub3RpZnlfY29tbW9uIGNvbW1vbl9ub3RpZnk7CisJc3RydWN0IGFjcGlfb2JqZWN0X2RldmljZSBkZXZpY2U7CisJc3RydWN0IGFjcGlfb2JqZWN0X3Bvd2VyX3Jlc291cmNlIHBvd2VyX3Jlc291cmNlOworCXN0cnVjdCBhY3BpX29iamVjdF9wcm9jZXNzb3IgcHJvY2Vzc29yOworCXN0cnVjdCBhY3BpX29iamVjdF90aGVybWFsX3pvbmUgdGhlcm1hbF96b25lOworCXN0cnVjdCBhY3BpX29iamVjdF9maWVsZF9jb21tb24gY29tbW9uX2ZpZWxkOworCXN0cnVjdCBhY3BpX29iamVjdF9yZWdpb25fZmllbGQgZmllbGQ7CisJc3RydWN0IGFjcGlfb2JqZWN0X2J1ZmZlcl9maWVsZCBidWZmZXJfZmllbGQ7CisJc3RydWN0IGFjcGlfb2JqZWN0X2JhbmtfZmllbGQgYmFua19maWVsZDsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfaW5kZXhfZmllbGQgaW5kZXhfZmllbGQ7CisJc3RydWN0IGFjcGlfb2JqZWN0X25vdGlmeV9oYW5kbGVyIG5vdGlmeTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfYWRkcl9oYW5kbGVyIGFkZHJlc3Nfc3BhY2U7CisJc3RydWN0IGFjcGlfb2JqZWN0X3JlZmVyZW5jZSByZWZlcmVuY2U7CisJc3RydWN0IGFjcGlfb2JqZWN0X2V4dHJhIGV4dHJhOworCXN0cnVjdCBhY3BpX29iamVjdF9kYXRhIGRhdGE7CisJc3RydWN0IGFjcGlfb2JqZWN0X2NhY2hlX2xpc3QgY2FjaGU7CiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiB1bmlvbiBhY3BpX2Rlc2NyaXB0b3IgLSBvYmplY3RzIHRoYXQgc2hhcmUgYSBjb21tb24gZGVzY3JpcHRvciBpZGVudGlmaWVyCkBAIC00NzEsNyArMzc0LDcgQEAKIAogLyogT2JqZWN0IGRlc2NyaXB0b3IgdHlwZXMgKi8KIAotI2RlZmluZSBBQ1BJX0RFU0NfVFlQRV9DQUNIRUQgICAgICAgICAgIDB4MDEgICAgICAgIC8qIFVzZWQgb25seSB3aGVuIG9iamVjdCBpcyBjYWNoZWQgKi8KKyNkZWZpbmUgQUNQSV9ERVNDX1RZUEVfQ0FDSEVEICAgICAgICAgICAweDAxCS8qIFVzZWQgb25seSB3aGVuIG9iamVjdCBpcyBjYWNoZWQgKi8KICNkZWZpbmUgQUNQSV9ERVNDX1RZUEVfU1RBVEUgICAgICAgICAgICAweDAyCiAjZGVmaW5lIEFDUElfREVTQ19UWVBFX1NUQVRFX1VQREFURSAgICAgMHgwMwogI2RlZmluZSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9QQUNLQUdFICAgIDB4MDQKQEAgLTQ4OCwxNCArMzkxLDExIEBACiAjZGVmaW5lIEFDUElfREVTQ19UWVBFX05BTUVEICAgICAgICAgICAgMHgwRgogI2RlZmluZSBBQ1BJX0RFU0NfVFlQRV9NQVggICAgICAgICAgICAgIDB4MEYKIAotCi11bmlvbiBhY3BpX2Rlc2NyaXB0b3IKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9pZDsgIC8qIFRvIGRpZmZlcmVudGlhdGUgdmFyaW91cyBpbnRlcm5hbCBvYmpzICovXAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICBvYmplY3Q7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgICAgIG5vZGU7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAgICAgIG9wOwordW5pb24gYWNwaV9kZXNjcmlwdG9yIHsKKwl1OCBkZXNjcmlwdG9yX2lkOwkvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3Qgb2JqZWN0OworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIG5vZGU7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3Qgb3A7CiB9OwogCi0KLSNlbmRpZiAvKiBfQUNPQkpFQ1RfSCAqLworI2VuZGlmCQkJCS8qIF9BQ09CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvcGNvZGUuaCBiL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oCmluZGV4IDExOGVjYmEuLjY0ZGE0MjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oCkBAIC02Miw3ICs2Miw2IEBACiAjZGVmaW5lIF9OQU0gICAgICAgICAgICAgICAgICAgICAgICAweDZDCiAjZGVmaW5lIF9QRlggICAgICAgICAgICAgICAgICAgICAgICAweDZECiAKLQogLyoKICAqIEFsbCBBTUwgb3Bjb2RlcyBhbmQgdGhlIHBhcnNlLXRpbWUgYXJndW1lbnRzIGZvciBlYWNoLiAgVXNlZCBieSB0aGUgQU1MCiAgKiBwYXJzZXIgIEVhY2ggbGlzdCBpcyBjb21wcmVzc2VkIGludG8gYSAzMi1iaXQgbnVtYmVyIGFuZCBzdG9yZWQgaW4gdGhlCkBAIC0xOTEsNyArMTkwLDYgQEAKICNkZWZpbmUgQVJHUF9XT1JEX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1dPUkREQVRBKQogI2RlZmluZSBBUkdQX1pFUk9fT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCiAKLQogLyoKICAqIEFsbCBBTUwgb3Bjb2RlcyBhbmQgdGhlIHJ1bnRpbWUgYXJndW1lbnRzIGZvciBlYWNoLiAgVXNlZCBieSB0aGUgQU1MCiAgKiBpbnRlcnByZXRlciAgRWFjaCBsaXN0IGlzIGNvbXByZXNzZWQgaW50byBhIDMyLWJpdCBudW1iZXIgYW5kIHN0b3JlZApAQCAtMjQ2LDcgKzI0NCw3IEBACiAjZGVmaW5lIEFSR0lfRklFTERfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQogI2RlZmluZSBBUkdJX0ZJTkRfU0VUX0xFRlRfQklUX09QICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9UQVJHRVRSRUYpCiAjZGVmaW5lIEFSR0lfRklORF9TRVRfUklHSFRfQklUX09QICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9GUk9NX0JDRF9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0ZST01fQkNEX09QICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9GSVhFRF9UQVJHRVQpCiAjZGVmaW5lIEFSR0lfSUZfT1AgICAgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQogI2RlZmluZSBBUkdJX0lOQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUl9SRUYpCiAjZGVmaW5lIEFSR0lfSU5ERVhfRklFTERfT1AgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQpAQCAtMzIyLDQgKzMyMCw0IEBACiAjZGVmaW5lIEFSR0lfV09SRF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQogI2RlZmluZSBBUkdJX1pFUk9fT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCiAKLSNlbmRpZiAvKiBfX0FDT1BDT0RFX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNPUENPREVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaCBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCmluZGV4IDJmYmUxODAuLjY4ZDdlZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCkBAIC03MywxMiArNzMsMTAgQEAKICNkZWZpbmUgQUNQSV9BTExfQ09NUE9ORU5UUyAgICAgICAgIDB4MDAwMDNGRkYKICNkZWZpbmUgQUNQSV9DT01QT05FTlRfREVGQVVMVCAgICAgIChBQ1BJX0FMTF9DT01QT05FTlRTKQogCi0KIC8qIENvbXBvbmVudCBJRHMgcmVzZXJ2ZWQgZm9yIEFDUEkgZHJpdmVycyAqLwogCiAjZGVmaW5lIEFDUElfQUxMX0RSSVZFUlMgICAgICAgICAgICAweEZGRkYwMDAwCiAKLQogLyoKICAqIFJhdyBkZWJ1ZyBvdXRwdXQgbGV2ZWxzLCBkbyBub3QgdXNlIHRoZXNlIGluIHRoZSBERUJVR19QUklOVCBtYWNyb3MKICAqLwpAQCAtMTMyLDExICsxMzAsMTAgQEAKIAogI2RlZmluZSBBQ1BJX0xWX1ZFUkJPU0UgICAgICAgICAgICAgMHhGMDAwMDAwMAogCi0KIC8qCiAgKiBEZWJ1ZyBsZXZlbCBtYWNyb3MgdGhhdCBhcmUgdXNlZCBpbiB0aGUgREVCVUdfUFJJTlQgbWFjcm9zCiAgKi8KLSNkZWZpbmUgQUNQSV9ERUJVR19MRVZFTChkbCkgICAgICAgICh1MzIpIGRsLF9fTElORV9fLCZfZGVidWdfaW5mbworI2RlZmluZSBBQ1BJX0RFQlVHX0xFVkVMKGRsKSAgICAgICAgKHUzMikgZGwsQUNQSV9ERUJVR19QQVJBTUVURVJTCiAKIC8qIEV4Y2VwdGlvbiBsZXZlbCAtLSB1c2VkIGluIHRoZSBnbG9iYWwgImRlYnVnX2xldmVsIiAqLwogCkBAIC0xNDcsNyArMTQ0LDYgQEAKICNkZWZpbmUgQUNQSV9EQl9JTkZPICAgICAgICAgICAgICAgIEFDUElfREVCVUdfTEVWRUwgKEFDUElfTFZfSU5GTykKICNkZWZpbmUgQUNQSV9EQl9BTExfRVhDRVBUSU9OUyAgICAgIEFDUElfREVCVUdfTEVWRUwgKEFDUElfTFZfQUxMX0VYQ0VQVElPTlMpCiAKLQogLyogVHJhY2UgbGV2ZWwgLS0gYWxzbyB1c2VkIGluIHRoZSBnbG9iYWwgImRlYnVnX2xldmVsIiAqLwogCiAjZGVmaW5lIEFDUElfREJfSU5JVF9OQU1FUyAgICAgICAgICBBQ1BJX0RFQlVHX0xFVkVMIChBQ1BJX0xWX0lOSVRfTkFNRVMpCkBAIC0xNzQsMTIgKzE3MCwxMCBAQAogCiAjZGVmaW5lIEFDUElfREJfQUxMICAgICAgICAgICAgICAgICBBQ1BJX0RFQlVHX0xFVkVMIChBQ1BJX0xWX0FMTCkKIAotCiAvKiBEZWZhdWx0cyBmb3IgZGVidWdfbGV2ZWwsIGRlYnVnIGFuZCBub3JtYWwgKi8KIAogI2RlZmluZSBBQ1BJX0RFQlVHX0RFRkFVTFQgICAgICAgICAgKEFDUElfTFZfSU5JVCB8IEFDUElfTFZfV0FSTiB8IEFDUElfTFZfRVJST1IgfCBBQ1BJX0xWX0RFQlVHX09CSkVDVCkKICNkZWZpbmUgQUNQSV9OT1JNQUxfREVGQVVMVCAgICAgICAgIChBQ1BJX0xWX0lOSVQgfCBBQ1BJX0xWX1dBUk4gfCBBQ1BJX0xWX0VSUk9SIHwgQUNQSV9MVl9ERUJVR19PQkpFQ1QpCiAjZGVmaW5lIEFDUElfREVCVUdfQUxMICAgICAgICAgICAgICAoQUNQSV9MVl9BTUxfRElTQVNTRU1CTEUgfCBBQ1BJX0xWX0FMTF9FWENFUFRJT05TIHwgQUNQSV9MVl9BTEwpCiAKLQotI2VuZGlmIC8qIF9fQUNPVVRQVVRfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ09VVFBVVF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BhcnNlci5oIGIvaW5jbHVkZS9hY3BpL2FjcGFyc2VyLmgKaW5kZXggNjk4Mjc2NS4uZDM1MmQ0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGFyc2VyLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGFyc2VyLmgKQEAgLTQxLDE4ICs0MSwxNSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2lmbmRlZiBfX0FDUEFSU0VSX0hfXwogI2RlZmluZSBfX0FDUEFSU0VSX0hfXwogCi0KICNkZWZpbmUgT1BfSEFTX1JFVFVSTl9WQUxVRSAgICAgICAgICAgICAxCiAKIC8qIHZhcmlhYmxlICMgYXJndW1lbnRzICovCiAKICNkZWZpbmUgQUNQSV9WQVJfQVJHUyAgICAgICAgICAgICAgICAgICBBQ1BJX1VJTlQzMl9NQVgKIAotCiAjZGVmaW5lIEFDUElfUEFSU0VfREVMRVRFX1RSRUUgICAgICAgICAgMHgwMDAxCiAjZGVmaW5lIEFDUElfUEFSU0VfTk9fVFJFRV9ERUxFVEUgICAgICAgMHgwMDAwCiAjZGVmaW5lIEFDUElfUEFSU0VfVFJFRV9NQVNLICAgICAgICAgICAgMHgwMDAxCkBAIC02Myw3ICs2MCw3IEBACiAjZGVmaW5lIEFDUElfUEFSU0VfTU9ERV9NQVNLICAgICAgICAgICAgMHgwMDMwCiAKICNkZWZpbmUgQUNQSV9QQVJTRV9ERUZFUlJFRF9PUCAgICAgICAgICAweDAxMDAKLQorI2RlZmluZSBBQ1BJX1BBUlNFX0RJU0FTU0VNQkxFICAgICAgICAgIDB4MDIwMAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzEsMjUxICs2OCwxNjUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLyoKICAqIHBzeGZhY2UgLSBQYXJzZXIgZXh0ZXJuYWwgaW50ZXJmYWNlcwogICovCi1hY3BpX3N0YXR1cwotYWNwaV9wc3hfbG9hZF90YWJsZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGNvZGVfYWRkciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjb2RlX2xlbmd0aCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3BzeF9leGVjdXRlICgKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKTsKLQorYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX21ldGhvZChzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbyk7CiAKIC8qCiAgKiBwc2FyZ3MgLSBQYXJzZSBBTUwgb3Bjb2RlIGFyZ3VtZW50cwogICovCi11OCAqCi1hY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpOwordTggKmFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9lbmQoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSk7CiAKLWNoYXIgKgotYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpOworY2hhciAqYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUpOwogCiB2b2lkCi1hY3BpX3BzX2dldF9uZXh0X3NpbXBsZV9hcmcgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ190eXBlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZyk7CithY3BpX3BzX2dldF9uZXh0X3NpbXBsZV9hcmcoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSwKKwkJCSAgICB1MzIgYXJnX3R5cGUsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9wc19nZXRfbmV4dF9uYW1lcGF0aCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwpOworYWNwaV9wc19nZXRfbmV4dF9uYW1lcGF0aChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICBzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlLAorCQkJICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnLCB1OCBtZXRob2RfY2FsbCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3BzX2dldF9uZXh0X2FyZyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfdHlwZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICoqcmV0dXJuX2FyZyk7Ci0KK2FjcGlfcHNfZ2V0X25leHRfYXJnKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSwKKwkJICAgICB1MzIgYXJnX3R5cGUsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqcmV0dXJuX2FyZyk7CiAKIC8qCiAgKiBwc2ZpbmQKICAqLwotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgotYWNwaV9wc19maW5kX25hbWUgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnNjb3BlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7Cit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19maW5kX25hbWUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnNjb3BlLAorCQkJCQkgICB1MzIgbmFtZSwgdTMyIG9wY29kZSk7CiAKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0KgotYWNwaV9wc19nZXRfcGFyZW50ICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9wYXJlbnQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAogLyoKICAqIHBzb3Bjb2RlIC0gQU1MIE9wY29kZSBpbmZvcm1hdGlvbgogICovCi1jb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqCi1hY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOworY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKmFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKHUxNiBvcGNvZGUpOwogCi1jaGFyICoKLWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7Ci0KK2NoYXIgKmFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHUxNiBvcGNvZGUpOwogCiAvKgogICogcHNwYXJzZSAtIHRvcCBsZXZlbCBwYXJzaW5nIHJvdXRpbmVzCiAgKi8KK2FjcGlfc3RhdHVzIGFjcGlfcHNfcGFyc2VfYW1sKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOworCit1MzIgYWNwaV9wc19nZXRfb3Bjb2RlX3NpemUodTMyIG9wY29kZSk7CisKK3UxNiBhY3BpX3BzX3BlZWtfb3Bjb2RlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpzdGF0ZSk7CisKIGFjcGlfc3RhdHVzCi1hY3BpX3BzX3BhcnNlX2FtbCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi11MzIKLWFjcGlfcHNfZ2V0X29wY29kZV9zaXplICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7CithY3BpX3N0YXR1cworYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJIGFjcGlfc3RhdHVzIGNhbGxiYWNrX3N0YXR1cyk7CiAKLXUxNgotYWNwaV9wc19wZWVrX29wY29kZSAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqc3RhdGUpOwotCisvKgorICogcHNsb29wIC0gbWFpbiBwYXJzZSBsb29wCisgKi8KK2FjcGlfc3RhdHVzIGFjcGlfcHNfcGFyc2VfbG9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIHBzc2NvcGUgLSBTY29wZSBzdGFjayBtYW5hZ2VtZW50IHJvdXRpbmVzCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX3BzX2luaXRfc2NvcGUgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpyb290KTsKK2FjcGlfcHNfaW5pdF9zY29wZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlLAorCQkgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcm9vdCk7CiAKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZ2V0X3BhcmVudF9zY29wZSAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqc3RhdGUpOwordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZ2V0X3BhcmVudF9zY29wZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZQorCQkJCQkJICAqc3RhdGUpOwogCi11OAotYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpOwordTggYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUpOwogCiB2b2lkCi1hY3BpX3BzX3BvcF9zY29wZSAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKipvcCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmdfbGlzdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmdfY291bnQpOworYWNwaV9wc19wb3Bfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSwKKwkJICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKm9wLAorCQkgIHUzMiAqIGFyZ19saXN0LCB1MzIgKiBhcmdfY291bnQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9wc19wdXNoX3Njb3BlICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdfYXJncywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ19jb3VudCk7CithY3BpX3BzX3B1c2hfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSwKKwkJICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkgICB1MzIgcmVtYWluaW5nX2FyZ3MsIHUzMiBhcmdfY291bnQpOwogCi12b2lkCi1hY3BpX3BzX2NsZWFudXBfc2NvcGUgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnN0YXRlKTsKLQordm9pZCBhY3BpX3BzX2NsZWFudXBfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnN0YXRlKTsKIAogLyoKICAqIHBzdHJlZSAtIHBhcnNlIHRyZWUgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCiAgKi8KIHZvaWQKLWFjcGlfcHNfYXBwZW5kX2FyZygKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcpOworYWNwaV9wc19hcHBlbmRfYXJnKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZyk7CiAKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0KgotYWNwaV9wc19maW5kICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpzY29wZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRoLAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlKTsKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2ZpbmQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnNjb3BlLAorCQkJCSAgICAgIGNoYXIgKnBhdGgsIHUxNiBvcGNvZGUsIHUzMiBjcmVhdGUpOwogCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCi1hY3BpX3BzX2dldF9hcmcoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnbik7Cit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19nZXRfYXJnKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwgdTMyIGFyZ24pOwogCiAjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZ2V0X2RlcHRoX25leHQgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9yaWdpbiwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0jZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KLQordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZ2V0X2RlcHRoX25leHQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9yaWdpbiwKKwkJCQkJCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAogLyoKICAqIHBzd2FsayAtIHBhcnNlIHRyZWUgd2FsayByb3V0aW5lcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9wc193YWxrX3BhcnNlZF9hbWwgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnN0YXJ0X29wLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmVuZF9vcCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICptdGhfZGVzYywKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpzdGFydF9ub2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipwYXJhbXMsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmNhbGxlcl9yZXR1cm5fZGVzYywKLQlhY3BpX293bmVyX2lkICAgICAgICAgICAgICAgICAgIG93bmVyX2lkLAotCWFjcGlfcGFyc2VfZG93bndhcmRzICAgICAgICAgICAgZGVzY2VuZGluZ19jYWxsYmFjaywKLQlhY3BpX3BhcnNlX3Vwd2FyZHMgICAgICAgICAgICAgIGFzY2VuZGluZ19jYWxsYmFjayk7CithY3BpX3BzX3dhbGtfcGFyc2VkX2FtbCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqc3RhcnRfb3AsCisJCQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqZW5kX29wLAorCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbXRoX2Rlc2MsCisJCQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZSwKKwkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipwYXJhbXMsCisJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqY2FsbGVyX3JldHVybl9kZXNjLAorCQkJYWNwaV9vd25lcl9pZCBvd25lcl9pZCwKKwkJCWFjcGlfcGFyc2VfZG93bndhcmRzIGRlc2NlbmRpbmdfY2FsbGJhY2ssCisJCQlhY3BpX3BhcnNlX3Vwd2FyZHMgYXNjZW5kaW5nX2NhbGxiYWNrKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcHNfZ2V0X25leHRfd2Fsa19vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQlhY3BpX3BhcnNlX3Vwd2FyZHMgICAgICAgICAgICAgIGFzY2VuZGluZ19jYWxsYmFjayk7CithY3BpX3BzX2dldF9uZXh0X3dhbGtfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgYWNwaV9wYXJzZV91cHdhcmRzIGFzY2VuZGluZ19jYWxsYmFjayk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3BzX2RlbGV0ZV9jb21wbGV0ZWRfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9zdGF0dXMgYWNwaV9wc19kZWxldGVfY29tcGxldGVkX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi12b2lkCi1hY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpyb290KTsKLQordm9pZCBhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpyb290KTsKIAogLyoKICAqIHBzdXRpbHMgLSBwYXJzZXIgdXRpbGl0aWVzCiAgKi8KLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfY3JlYXRlX3Njb3BlX29wICgKLQl2b2lkKTsKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2NyZWF0ZV9zY29wZV9vcCh2b2lkKTsKIAotdm9pZAotYWNwaV9wc19pbml0X29wICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7Cit2b2lkIGFjcGlfcHNfaW5pdF9vcCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsIHUxNiBvcGNvZGUpOwogCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCi1hY3BpX3BzX2FsbG9jX29wICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7Cit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19hbGxvY19vcCh1MTYgb3Bjb2RlKTsKIAotdm9pZAotYWNwaV9wc19mcmVlX29wICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Cit2b2lkIGFjcGlfcHNfZnJlZV9vcCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi11OAotYWNwaV9wc19pc19sZWFkaW5nX2NoYXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyk7Cit1OCBhY3BpX3BzX2lzX2xlYWRpbmdfY2hhcih1MzIgYyk7CiAKLXU4Ci1hY3BpX3BzX2lzX3ByZWZpeF9jaGFyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMpOwordTggYWNwaV9wc19pc19wcmVmaXhfY2hhcih1MzIgYyk7CiAKICNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQotdTMyCi1hY3BpX3BzX2dldF9uYW1lKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLSNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwordTMyIGFjcGlfcHNfZ2V0X25hbWUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKKyNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCi12b2lkCi1hY3BpX3BzX3NldF9uYW1lKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0KLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLXZvaWQKLWFjcGlfcHNfZGVsZXRlX3BhcnNlX2NhY2hlICgKLQl2b2lkKTsKLSNlbmRpZgotCit2b2lkIGFjcGlfcHNfc2V0X25hbWUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLCB1MzIgbmFtZSk7CiAKIC8qCiAgKiBwc2R1bXAgLSBkaXNwbGF5IHBhcnNlciB0cmVlCiAgKi8KIHUzMgotYWNwaV9wc19zcHJpbnRfcGF0aCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyX3N0YXJ0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOworYWNwaV9wc19zcHJpbnRfcGF0aChjaGFyICpidWZmZXJfc3RhcnQsCisJCSAgICB1MzIgYnVmZmVyX3NpemUsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKIHUzMgotYWNwaV9wc19zcHJpbnRfb3AgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcl9zdGFydCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK2FjcGlfcHNfc3ByaW50X29wKGNoYXIgKmJ1ZmZlcl9zdGFydCwKKwkJICB1MzIgYnVmZmVyX3NpemUsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQKLWFjcGlfcHNfc2hvdyAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordm9pZCBhY3BpX3BzX3Nob3codW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAotCi0jZW5kaWYgLyogX19BQ1BBUlNFUl9IX18gKi8KKyNlbmRpZgkJCQkvKiBfX0FDUEFSU0VSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGkuaCBiL2luY2x1ZGUvYWNwaS9hY3BpLmgKaW5kZXggYTY5ZDc4OS4uY2NmMzRmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGkuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaS5oCkBAIC00OSwyMiArNDksMjEgQEAKICAqIFdlIHB1dCB0aGVtIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGR1cGxpY2F0ZSB0aGVtCiAgKiBpbiB0aGUgcmVzdCBvZiB0aGUgc291cmNlIGNvZGUgYWdhaW4gYW5kIGFnYWluLgogICovCi0jaW5jbHVkZSAiYWNuYW1lcy5oIiAgICAgICAgICAgIC8qIEdsb2JhbCBBQ1BJIG5hbWVzIGFuZCBzdHJpbmdzICovCi0jaW5jbHVkZSAiYWNjb25maWcuaCIgICAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzICovCi0jaW5jbHVkZSAicGxhdGZvcm0vYWNlbnYuaCIgICAgIC8qIFRhcmdldCBlbnZpcm9ubWVudCBzcGVjaWZpYyBpdGVtcyAqLwotI2luY2x1ZGUgImFjdHlwZXMuaCIgICAgICAgICAgICAvKiBGdW5kYW1lbnRhbCBjb21tb24gZGF0YSB0eXBlcyAqLwotI2luY2x1ZGUgImFjZXhjZXAuaCIgICAgICAgICAgICAvKiBBQ1BJIGV4Y2VwdGlvbiBjb2RlcyAqLwotI2luY2x1ZGUgImFjbWFjcm9zLmgiICAgICAgICAgICAvKiBDIG1hY3JvcyAqLwotI2luY2x1ZGUgImFjdGJsLmgiICAgICAgICAgICAgICAvKiBBQ1BJIHRhYmxlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiYWNsb2NhbC5oIiAgICAgICAgICAgIC8qIEludGVybmFsIGRhdGEgdHlwZXMgKi8KLSNpbmNsdWRlICJhY291dHB1dC5oIiAgICAgICAgICAgLyogRXJyb3Igb3V0cHV0IGFuZCBEZWJ1ZyBtYWNyb3MgKi8KLSNpbmNsdWRlICJhY3Bpb3N4Zi5oIiAgICAgICAgICAgLyogSW50ZXJmYWNlcyB0byB0aGUgQUNQSS10by1PUyBsYXllciovCi0jaW5jbHVkZSAiYWNwaXhmLmgiICAgICAgICAgICAgIC8qIEFDUEkgY29yZSBzdWJzeXN0ZW0gZXh0ZXJuYWwgaW50ZXJmYWNlcyAqLwotI2luY2x1ZGUgImFjb2JqZWN0LmgiICAgICAgICAgICAvKiBBQ1BJIGludGVybmFsIG9iamVjdCAqLwotI2luY2x1ZGUgImFjc3RydWN0LmgiICAgICAgICAgICAvKiBDb21tb24gc3RydWN0dXJlcyAqLwotI2luY2x1ZGUgImFjZ2xvYmFsLmgiICAgICAgICAgICAvKiBBbGwgZ2xvYmFsIHZhcmlhYmxlcyAqLwotI2luY2x1ZGUgImFjaHdhcmUuaCIgICAgICAgICAgICAvKiBIYXJkd2FyZSBkZWZpbmVzIGFuZCBpbnRlcmZhY2VzICovCi0jaW5jbHVkZSAiYWN1dGlscy5oIiAgICAgICAgICAgIC8qIFV0aWxpdHkgaW50ZXJmYWNlcyAqLworI2luY2x1ZGUgImFjbmFtZXMuaCIJCS8qIEdsb2JhbCBBQ1BJIG5hbWVzIGFuZCBzdHJpbmdzICovCisjaW5jbHVkZSAiYWNjb25maWcuaCIJCS8qIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzICovCisjaW5jbHVkZSAicGxhdGZvcm0vYWNlbnYuaCIJLyogVGFyZ2V0IGVudmlyb25tZW50IHNwZWNpZmljIGl0ZW1zICovCisjaW5jbHVkZSAiYWN0eXBlcy5oIgkJLyogRnVuZGFtZW50YWwgY29tbW9uIGRhdGEgdHlwZXMgKi8KKyNpbmNsdWRlICJhY2V4Y2VwLmgiCQkvKiBBQ1BJIGV4Y2VwdGlvbiBjb2RlcyAqLworI2luY2x1ZGUgImFjbWFjcm9zLmgiCQkvKiBDIG1hY3JvcyAqLworI2luY2x1ZGUgImFjdGJsLmgiCQkvKiBBQ1BJIHRhYmxlIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiYWNsb2NhbC5oIgkJLyogSW50ZXJuYWwgZGF0YSB0eXBlcyAqLworI2luY2x1ZGUgImFjb3V0cHV0LmgiCQkvKiBFcnJvciBvdXRwdXQgYW5kIERlYnVnIG1hY3JvcyAqLworI2luY2x1ZGUgImFjcGlvc3hmLmgiCQkvKiBJbnRlcmZhY2VzIHRvIHRoZSBBQ1BJLXRvLU9TIGxheWVyICovCisjaW5jbHVkZSAiYWNwaXhmLmgiCQkvKiBBQ1BJIGNvcmUgc3Vic3lzdGVtIGV4dGVybmFsIGludGVyZmFjZXMgKi8KKyNpbmNsdWRlICJhY29iamVjdC5oIgkJLyogQUNQSSBpbnRlcm5hbCBvYmplY3QgKi8KKyNpbmNsdWRlICJhY3N0cnVjdC5oIgkJLyogQ29tbW9uIHN0cnVjdHVyZXMgKi8KKyNpbmNsdWRlICJhY2dsb2JhbC5oIgkJLyogQWxsIGdsb2JhbCB2YXJpYWJsZXMgKi8KKyNpbmNsdWRlICJhY2h3YXJlLmgiCQkvKiBIYXJkd2FyZSBkZWZpbmVzIGFuZCBpbnRlcmZhY2VzICovCisjaW5jbHVkZSAiYWN1dGlscy5oIgkJLyogVXRpbGl0eSBpbnRlcmZhY2VzICovCiAKLQotI2VuZGlmIC8qIF9fQUNQSV9IX18gKi8KKyNlbmRpZgkJCQkvKiBfX0FDUElfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaCBiL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oCmluZGV4IDhkMGUxMjkuLjBiNTRlOWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oCkBAIC0zNSw0OCArMzUsNDEgQEAKIC8qIFRCRDogTWFrZSBkeW5hbWljICovCiAjZGVmaW5lIEFDUElfTUFYX0hBTkRMRVMJMTAKIHN0cnVjdCBhY3BpX2hhbmRsZV9saXN0IHsKLQl1MzIJCQljb3VudDsKLQlhY3BpX2hhbmRsZQkJaGFuZGxlc1tBQ1BJX01BWF9IQU5ETEVTXTsKKwl1MzIgY291bnQ7CisJYWNwaV9oYW5kbGUgaGFuZGxlc1tBQ1BJX01BWF9IQU5ETEVTXTsKIH07CiAKLQogLyogYWNwaV91dGlscy5oICovCiBhY3BpX3N0YXR1cwotYWNwaV9leHRyYWN0X3BhY2thZ2UgKAotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICpwYWNrYWdlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICpmb3JtYXQsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgKmJ1ZmZlcik7CithY3BpX2V4dHJhY3RfcGFja2FnZSh1bmlvbiBhY3BpX29iamVjdCAqcGFja2FnZSwKKwkJICAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKmZvcm1hdCwgc3RydWN0IGFjcGlfYnVmZmVyICpidWZmZXIpOwogYWNwaV9zdGF0dXMKLWFjcGlfZXZhbHVhdGVfaW50ZWdlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgaGFuZGxlLAotCWFjcGlfc3RyaW5nICAgICAgICAgICAgIHBhdGhuYW1lLAotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICphcmd1bWVudHMsCi0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgKmRhdGEpOworYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJICAgICAgYWNwaV9zdHJpbmcgcGF0aG5hbWUsCisJCSAgICAgIHN0cnVjdCBhY3BpX29iamVjdF9saXN0ICphcmd1bWVudHMsIHVuc2lnbmVkIGxvbmcgKmRhdGEpOwogYWNwaV9zdGF0dXMKLWFjcGlfZXZhbHVhdGVfcmVmZXJlbmNlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICBoYW5kbGUsCi0JYWNwaV9zdHJpbmcgICAgICAgICAgICAgcGF0aG5hbWUsCi0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKmFyZ3VtZW50cywKLQlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCAqbGlzdCk7CithY3BpX2V2YWx1YXRlX3JlZmVyZW5jZShhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQlhY3BpX3N0cmluZyBwYXRobmFtZSwKKwkJCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICphcmd1bWVudHMsCisJCQlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCAqbGlzdCk7CiAKLQotI2lmZGVmIENPTkZJR19BQ1BJX0JVUworI2lmZGVmIENPTkZJR19BQ1BJCiAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAKICNkZWZpbmUgQUNQSV9CVVNfRklMRV9ST09UCSJhY3BpIgotZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqYWNwaV9yb290X2RpcjsKLWV4dGVybiBGQURUX0RFU0NSSVBUT1IJCWFjcGlfZmFkdDsKK2V4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfcm9vdF9kaXI7CitleHRlcm4gRkFEVF9ERVNDUklQVE9SIGFjcGlfZmFkdDsKIAogZW51bSBhY3BpX2J1c19yZW1vdmFsX3R5cGUgewotCUFDUElfQlVTX1JFTU9WQUxfTk9STUFMCT0gMCwKKwlBQ1BJX0JVU19SRU1PVkFMX05PUk1BTCA9IDAsCiAJQUNQSV9CVVNfUkVNT1ZBTF9FSkVDVCwKIAlBQ1BJX0JVU19SRU1PVkFMX1NVUFJJU0UsCiAJQUNQSV9CVVNfUkVNT1ZBTF9UWVBFX0NPVU5UCiB9OwogCiBlbnVtIGFjcGlfYnVzX2RldmljZV90eXBlIHsKLQlBQ1BJX0JVU19UWVBFX0RFVklDRQk9IDAsCisJQUNQSV9CVVNfVFlQRV9ERVZJQ0UgPSAwLAogCUFDUElfQlVTX1RZUEVfUE9XRVIsCiAJQUNQSV9CVVNfVFlQRV9QUk9DRVNTT1IsCiAJQUNQSV9CVVNfVFlQRV9USEVSTUFMLApAQCAtODksNjEgKzgyLDYwIEBACiBzdHJ1Y3QgYWNwaV9kcml2ZXI7CiBzdHJ1Y3QgYWNwaV9kZXZpY2U7CiAKLQogLyoKICAqIEFDUEkgRHJpdmVyCiAgKiAtLS0tLS0tLS0tLQogICovCiAKLXR5cGVkZWYgaW50ICgqYWNwaV9vcF9hZGQpCShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci10eXBlZGVmIGludCAoKmFjcGlfb3BfcmVtb3ZlKQkoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLXR5cGVkZWYgaW50ICgqYWNwaV9vcF9sb2NrKQkoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLXR5cGVkZWYgaW50ICgqYWNwaV9vcF9zdGFydCkJKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXR5cGVkZWYgaW50ICgqYWNwaV9vcF9zdG9wKQkoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLXR5cGVkZWYgaW50ICgqYWNwaV9vcF9zdXNwZW5kKQkoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBzdGF0ZSk7Ci10eXBlZGVmIGludCAoKmFjcGlfb3BfcmVzdW1lKQkoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBzdGF0ZSk7Ci10eXBlZGVmIGludCAoKmFjcGlfb3Bfc2NhbikJKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXR5cGVkZWYgaW50ICgqYWNwaV9vcF9iaW5kKQkoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotdHlwZWRlZiBpbnQgKCphY3BpX29wX3VuYmluZCkJKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXR5cGVkZWYgaW50ICgqYWNwaV9vcF9tYXRjaCkJKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAotCQkJCSBzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcik7Cit0eXBlZGVmIGludCAoKmFjcGlfb3BfYWRkKSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlKTsKK3R5cGVkZWYgaW50ICgqYWNwaV9vcF9yZW1vdmUpIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UsIGludCB0eXBlKTsKK3R5cGVkZWYgaW50ICgqYWNwaV9vcF9sb2NrKSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlLCBpbnQgdHlwZSk7Cit0eXBlZGVmIGludCAoKmFjcGlfb3Bfc3RhcnQpIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UpOwordHlwZWRlZiBpbnQgKCphY3BpX29wX3N0b3ApIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UsIGludCB0eXBlKTsKK3R5cGVkZWYgaW50ICgqYWNwaV9vcF9zdXNwZW5kKSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlLCBpbnQgc3RhdGUpOwordHlwZWRlZiBpbnQgKCphY3BpX29wX3Jlc3VtZSkgKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSwgaW50IHN0YXRlKTsKK3R5cGVkZWYgaW50ICgqYWNwaV9vcF9zY2FuKSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlKTsKK3R5cGVkZWYgaW50ICgqYWNwaV9vcF9iaW5kKSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlKTsKK3R5cGVkZWYgaW50ICgqYWNwaV9vcF91bmJpbmQpIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UpOwordHlwZWRlZiBpbnQgKCphY3BpX29wX21hdGNoKSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlLAorCQkJICAgICAgc3RydWN0IGFjcGlfZHJpdmVyICogZHJpdmVyKTsKIAogc3RydWN0IGFjcGlfYnVzX29wcyB7Ci0JdTMyIAkJCWFjcGlfb3BfYWRkOjE7Ci0JdTMyCQkJYWNwaV9vcF9yZW1vdmU6MTsKLQl1MzIJCQlhY3BpX29wX2xvY2s6MTsKLQl1MzIJCQlhY3BpX29wX3N0YXJ0OjE7Ci0JdTMyCQkJYWNwaV9vcF9zdG9wOjE7Ci0JdTMyCQkJYWNwaV9vcF9zdXNwZW5kOjE7Ci0JdTMyCQkJYWNwaV9vcF9yZXN1bWU6MTsKLQl1MzIJCQlhY3BpX29wX3NjYW46MTsKLQl1MzIJCQlhY3BpX29wX2JpbmQ6MTsKLQl1MzIJCQlhY3BpX29wX3VuYmluZDoxOwotCXUzMgkJCWFjcGlfb3BfbWF0Y2g6MTsKLQl1MzIJCQlyZXNlcnZlZDoyMTsKKwl1MzIgYWNwaV9vcF9hZGQ6MTsKKwl1MzIgYWNwaV9vcF9yZW1vdmU6MTsKKwl1MzIgYWNwaV9vcF9sb2NrOjE7CisJdTMyIGFjcGlfb3Bfc3RhcnQ6MTsKKwl1MzIgYWNwaV9vcF9zdG9wOjE7CisJdTMyIGFjcGlfb3Bfc3VzcGVuZDoxOworCXUzMiBhY3BpX29wX3Jlc3VtZToxOworCXUzMiBhY3BpX29wX3NjYW46MTsKKwl1MzIgYWNwaV9vcF9iaW5kOjE7CisJdTMyIGFjcGlfb3BfdW5iaW5kOjE7CisJdTMyIGFjcGlfb3BfbWF0Y2g6MTsKKwl1MzIgcmVzZXJ2ZWQ6MjE7CiB9OwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2Vfb3BzIHsKLQlhY3BpX29wX2FkZAkJYWRkOwotCWFjcGlfb3BfcmVtb3ZlCQlyZW1vdmU7Ci0JYWNwaV9vcF9sb2NrCQlsb2NrOwotCWFjcGlfb3Bfc3RhcnQJCXN0YXJ0OwotCWFjcGlfb3Bfc3RvcAkJc3RvcDsKLQlhY3BpX29wX3N1c3BlbmQJCXN1c3BlbmQ7Ci0JYWNwaV9vcF9yZXN1bWUJCXJlc3VtZTsKLQlhY3BpX29wX3NjYW4JCXNjYW47Ci0JYWNwaV9vcF9iaW5kCQliaW5kOwotCWFjcGlfb3BfdW5iaW5kCQl1bmJpbmQ7Ci0JYWNwaV9vcF9tYXRjaAkJbWF0Y2g7CisJYWNwaV9vcF9hZGQgYWRkOworCWFjcGlfb3BfcmVtb3ZlIHJlbW92ZTsKKwlhY3BpX29wX2xvY2sgbG9jazsKKwlhY3BpX29wX3N0YXJ0IHN0YXJ0OworCWFjcGlfb3Bfc3RvcCBzdG9wOworCWFjcGlfb3Bfc3VzcGVuZCBzdXNwZW5kOworCWFjcGlfb3BfcmVzdW1lIHJlc3VtZTsKKwlhY3BpX29wX3NjYW4gc2NhbjsKKwlhY3BpX29wX2JpbmQgYmluZDsKKwlhY3BpX29wX3VuYmluZCB1bmJpbmQ7CisJYWNwaV9vcF9tYXRjaCBtYXRjaDsKIH07CiAKIHN0cnVjdCBhY3BpX2RyaXZlciB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlub2RlOwotCWNoYXIJCQluYW1lWzgwXTsKLQljaGFyCQkJY2xhc3NbODBdOwotCWF0b21pY190CQlyZWZlcmVuY2VzOwotCWNoYXIJCQkqaWRzOwkJLyogU3VwcG9ydGVkIEhhcmR3YXJlIElEcyAqLwotCXN0cnVjdCBhY3BpX2RldmljZV9vcHMJb3BzOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwljaGFyIG5hbWVbODBdOworCWNoYXIgY2xhc3NbODBdOworCWF0b21pY190IHJlZmVyZW5jZXM7CisJY2hhciAqaWRzOwkJLyogU3VwcG9ydGVkIEhhcmR3YXJlIElEcyAqLworCXN0cnVjdCBhY3BpX2RldmljZV9vcHMgb3BzOwogfTsKIAogLyoKQEAgLTE1NCw2MCArMTQ2LDU3IEBACiAvKiBTdGF0dXMgKF9TVEEpICovCiAKIHN0cnVjdCBhY3BpX2RldmljZV9zdGF0dXMgewotCXUzMgkJCXByZXNlbnQ6MTsKLQl1MzIJCQllbmFibGVkOjE7Ci0JdTMyCQkJc2hvd19pbl91aToxOwotCXUzMgkJCWZ1bmN0aW9uYWw6MTsKLQl1MzIJCQliYXR0ZXJ5X3ByZXNlbnQ6MTsKLQl1MzIJCQlyZXNlcnZlZDoyNzsKKwl1MzIgcHJlc2VudDoxOworCXUzMiBlbmFibGVkOjE7CisJdTMyIHNob3dfaW5fdWk6MTsKKwl1MzIgZnVuY3Rpb25hbDoxOworCXUzMiBiYXR0ZXJ5X3ByZXNlbnQ6MTsKKwl1MzIgcmVzZXJ2ZWQ6Mjc7CiB9OwogCi0KIC8qIEZsYWdzICovCiAKIHN0cnVjdCBhY3BpX2RldmljZV9mbGFncyB7Ci0JdTMyCQkJZHluYW1pY19zdGF0dXM6MTsKLQl1MzIJCQloYXJkd2FyZV9pZDoxOwotCXUzMgkJCWNvbXBhdGlibGVfaWRzOjE7Ci0JdTMyCQkJYnVzX2FkZHJlc3M6MTsKLQl1MzIJCQl1bmlxdWVfaWQ6MTsKLQl1MzIJCQlyZW1vdmFibGU6MTsKLQl1MzIJCQllamVjdGFibGU6MTsKLQl1MzIJCQlsb2NrYWJsZToxOwotCXUzMgkJCXN1cHJpc2VfcmVtb3ZhbF9vazoxOwotCXUzMgkJCXBvd2VyX21hbmFnZWFibGU6MTsKLQl1MzIJCQlwZXJmb3JtYW5jZV9tYW5hZ2VhYmxlOjE7Ci0JdTMyCQkJd2FrZV9jYXBhYmxlOjE7IC8qIFdha2V1cChfUFJXKSBzdXBwb3J0ZWQ/ICovCi0JdTMyCQkJcmVzZXJ2ZWQ6MjA7CisJdTMyIGR5bmFtaWNfc3RhdHVzOjE7CisJdTMyIGhhcmR3YXJlX2lkOjE7CisJdTMyIGNvbXBhdGlibGVfaWRzOjE7CisJdTMyIGJ1c19hZGRyZXNzOjE7CisJdTMyIHVuaXF1ZV9pZDoxOworCXUzMiByZW1vdmFibGU6MTsKKwl1MzIgZWplY3RhYmxlOjE7CisJdTMyIGxvY2thYmxlOjE7CisJdTMyIHN1cHJpc2VfcmVtb3ZhbF9vazoxOworCXUzMiBwb3dlcl9tYW5hZ2VhYmxlOjE7CisJdTMyIHBlcmZvcm1hbmNlX21hbmFnZWFibGU6MTsKKwl1MzIgd2FrZV9jYXBhYmxlOjE7CS8qIFdha2V1cChfUFJXKSBzdXBwb3J0ZWQ/ICovCisJdTMyIHJlc2VydmVkOjIwOwogfTsKIAotCiAvKiBGaWxlIFN5c3RlbSAqLwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2VfZGlyIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5OworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7CiB9OwogCiAjZGVmaW5lIGFjcGlfZGV2aWNlX2RpcihkKQkoKGQpLT5kaXIuZW50cnkpCiAKLQogLyogUGx1ZyBhbmQgUGxheSAqLwogCi10eXBlZGVmIGNoYXIJCQlhY3BpX2J1c19pZFs1XTsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZwkJYWNwaV9idXNfYWRkcmVzczsKLXR5cGVkZWYgY2hhcgkJCWFjcGlfaGFyZHdhcmVfaWRbOV07Ci10eXBlZGVmIGNoYXIJCQlhY3BpX3VuaXF1ZV9pZFs5XTsKLXR5cGVkZWYgY2hhcgkJCWFjcGlfZGV2aWNlX25hbWVbNDBdOwotdHlwZWRlZiBjaGFyCQkJYWNwaV9kZXZpY2VfY2xhc3NbMjBdOwordHlwZWRlZiBjaGFyIGFjcGlfYnVzX2lkWzVdOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGFjcGlfYnVzX2FkZHJlc3M7Cit0eXBlZGVmIGNoYXIgYWNwaV9oYXJkd2FyZV9pZFs5XTsKK3R5cGVkZWYgY2hhciBhY3BpX3VuaXF1ZV9pZFs5XTsKK3R5cGVkZWYgY2hhciBhY3BpX2RldmljZV9uYW1lWzQwXTsKK3R5cGVkZWYgY2hhciBhY3BpX2RldmljZV9jbGFzc1syMF07CiAKIHN0cnVjdCBhY3BpX2RldmljZV9wbnAgewotCWFjcGlfYnVzX2lkCQlidXNfaWQ7CQkgICAgICAgICAgICAgICAvKiBPYmplY3QgbmFtZSAqLwotCWFjcGlfYnVzX2FkZHJlc3MJYnVzX2FkZHJlc3M7CSAgICAgICAgICAgICAgICAgICAgICAvKiBfQURSICovCi0JYWNwaV9oYXJkd2FyZV9pZAloYXJkd2FyZV9pZDsJICAgICAgICAgICAgICAgICAgICAgIC8qIF9ISUQgKi8KLQlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QgKmNpZF9saXN0OwkJICAgICAvKiBfQ0lEcyAqLwotCWFjcGlfdW5pcXVlX2lkCQl1bmlxdWVfaWQ7CSAgICAgICAgICAgICAgICAgICAgICAvKiBfVUlEICovCi0JYWNwaV9kZXZpY2VfbmFtZQlkZXZpY2VfbmFtZTsJICAgICAgICAgLyogRHJpdmVyLWRldGVybWluZWQgKi8KLQlhY3BpX2RldmljZV9jbGFzcwlkZXZpY2VfY2xhc3M7CSAgICAgICAgIC8qICAgICAgICAiICAgICAgICAgICovCisJYWNwaV9idXNfaWQgYnVzX2lkOwkvKiBPYmplY3QgbmFtZSAqLworCWFjcGlfYnVzX2FkZHJlc3MgYnVzX2FkZHJlc3M7CS8qIF9BRFIgKi8KKwlhY3BpX2hhcmR3YXJlX2lkIGhhcmR3YXJlX2lkOwkvKiBfSElEICovCisJc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICpjaWRfbGlzdDsJLyogX0NJRHMgKi8KKwlhY3BpX3VuaXF1ZV9pZCB1bmlxdWVfaWQ7CS8qIF9VSUQgKi8KKwlhY3BpX2RldmljZV9uYW1lIGRldmljZV9uYW1lOwkvKiBEcml2ZXItZGV0ZXJtaW5lZCAqLworCWFjcGlfZGV2aWNlX2NsYXNzIGRldmljZV9jbGFzczsJLyogICAgICAgICIgICAgICAgICAgKi8KIH07CiAKICNkZWZpbmUgYWNwaV9kZXZpY2VfYmlkKGQpCSgoZCktPnBucC5idXNfaWQpCkBAIC0yMTcsMTE0ICsyMDYsMTExIEBACiAjZGVmaW5lIGFjcGlfZGV2aWNlX25hbWUoZCkJKChkKS0+cG5wLmRldmljZV9uYW1lKQogI2RlZmluZSBhY3BpX2RldmljZV9jbGFzcyhkKQkoKGQpLT5wbnAuZGV2aWNlX2NsYXNzKQogCi0KIC8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KIAogc3RydWN0IGFjcGlfZGV2aWNlX3Bvd2VyX2ZsYWdzIHsKLQl1MzIJCQlleHBsaWNpdF9nZXQ6MTsJCSAgICAgLyogX1BTQyBwcmVzZW50PyAqLwotCXUzMgkJCXBvd2VyX3Jlc291cmNlczoxOwkgICAvKiBQb3dlciByZXNvdXJjZXMgKi8KLQl1MzIJCQlpbnJ1c2hfY3VycmVudDoxOwkgIC8qIFNlcmlhbGl6ZSBEeC0+RDAgKi8KLQl1MzIJCQlwb3dlcl9yZW1vdmVkOjE7CSAgIC8qIE9wdGltaXplIER4LT5EMCAqLwotCXUzMgkJCXJlc2VydmVkOjI4OworCXUzMiBleHBsaWNpdF9nZXQ6MTsJLyogX1BTQyBwcmVzZW50PyAqLworCXUzMiBwb3dlcl9yZXNvdXJjZXM6MTsJLyogUG93ZXIgcmVzb3VyY2VzICovCisJdTMyIGlucnVzaF9jdXJyZW50OjE7CS8qIFNlcmlhbGl6ZSBEeC0+RDAgKi8KKwl1MzIgcG93ZXJfcmVtb3ZlZDoxOwkvKiBPcHRpbWl6ZSBEeC0+RDAgKi8KKwl1MzIgcmVzZXJ2ZWQ6Mjg7CiB9OwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2VfcG93ZXJfc3RhdGUgewogCXN0cnVjdCB7Ci0JCXU4CQkJdmFsaWQ6MTsJCi0JCXU4CQkJZXhwbGljaXRfc2V0OjE7CSAgICAgLyogX1BTeCBwcmVzZW50PyAqLwotCQl1OAkJCXJlc2VydmVkOjY7Ci0JfQkJCWZsYWdzOwotCWludAkJCXBvd2VyOwkJICAvKiAlIFBvd2VyIChjb21wYXJlZCB0byBEMCkgKi8KLQlpbnQJCQlsYXRlbmN5OwkvKiBEeC0+RDAgdGltZSAobWljcm9zZWNvbmRzKSAqLwotCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0CXJlc291cmNlczsJLyogUG93ZXIgcmVzb3VyY2VzIHJlZmVyZW5jZWQgKi8KKwkJdTggdmFsaWQ6MTsKKwkJdTggZXhwbGljaXRfc2V0OjE7CS8qIF9QU3ggcHJlc2VudD8gKi8KKwkJdTggcmVzZXJ2ZWQ6NjsKKwl9IGZsYWdzOworCWludCBwb3dlcjsJCS8qICUgUG93ZXIgKGNvbXBhcmVkIHRvIEQwKSAqLworCWludCBsYXRlbmN5OwkJLyogRHgtPkQwIHRpbWUgKG1pY3Jvc2Vjb25kcykgKi8KKwlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCByZXNvdXJjZXM7CS8qIFBvd2VyIHJlc291cmNlcyByZWZlcmVuY2VkICovCiB9OwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2VfcG93ZXIgewotCWludAkJCXN0YXRlOwkJICAgICAgICAgICAgIC8qIEN1cnJlbnQgc3RhdGUgKi8KKwlpbnQgc3RhdGU7CQkvKiBDdXJyZW50IHN0YXRlICovCiAJc3RydWN0IGFjcGlfZGV2aWNlX3Bvd2VyX2ZsYWdzIGZsYWdzOwotCXN0cnVjdCBhY3BpX2RldmljZV9wb3dlcl9zdGF0ZSBzdGF0ZXNbNF07ICAgICAvKiBQb3dlciBzdGF0ZXMgKEQwLUQzKSAqLworCXN0cnVjdCBhY3BpX2RldmljZV9wb3dlcl9zdGF0ZSBzdGF0ZXNbNF07CS8qIFBvd2VyIHN0YXRlcyAoRDAtRDMpICovCiB9OwogCi0KIC8qIFBlcmZvcm1hbmNlIE1hbmFnZW1lbnQgKi8KIAogc3RydWN0IGFjcGlfZGV2aWNlX3BlcmZfZmxhZ3MgewotCXU4CQkJcmVzZXJ2ZWQ6ODsKKwl1OCByZXNlcnZlZDo4OwogfTsKIAogc3RydWN0IGFjcGlfZGV2aWNlX3BlcmZfc3RhdGUgewogCXN0cnVjdCB7Ci0JCXU4CQkJdmFsaWQ6MTsJCi0JCXU4CQkJcmVzZXJ2ZWQ6NzsKLQl9CQkJZmxhZ3M7Ci0JdTgJCQlwb3dlcjsJCSAgLyogJSBQb3dlciAoY29tcGFyZWQgdG8gUDApICovCi0JdTgJCQlwZXJmb3JtYW5jZTsJICAvKiAlIFBlcmZvcm1hbmNlICggICAgIiAgICkgKi8KLQlpbnQJCQlsYXRlbmN5OwkvKiBQeC0+UDAgdGltZSAobWljcm9zZWNvbmRzKSAqLworCQl1OCB2YWxpZDoxOworCQl1OCByZXNlcnZlZDo3OworCX0gZmxhZ3M7CisJdTggcG93ZXI7CQkvKiAlIFBvd2VyIChjb21wYXJlZCB0byBQMCkgKi8KKwl1OCBwZXJmb3JtYW5jZTsJCS8qICUgUGVyZm9ybWFuY2UgKCAgICAiICAgKSAqLworCWludCBsYXRlbmN5OwkJLyogUHgtPlAwIHRpbWUgKG1pY3Jvc2Vjb25kcykgKi8KIH07CiAKIHN0cnVjdCBhY3BpX2RldmljZV9wZXJmIHsKLQlpbnQJCQlzdGF0ZTsKKwlpbnQgc3RhdGU7CiAJc3RydWN0IGFjcGlfZGV2aWNlX3BlcmZfZmxhZ3MgZmxhZ3M7Ci0JaW50CQkJc3RhdGVfY291bnQ7CisJaW50IHN0YXRlX2NvdW50OwogCXN0cnVjdCBhY3BpX2RldmljZV9wZXJmX3N0YXRlICpzdGF0ZXM7CiB9OwogCiAvKiBXYWtldXAgTWFuYWdlbWVudCAqLwogc3RydWN0IGFjcGlfZGV2aWNlX3dha2V1cF9mbGFncyB7Ci0JdTgJdmFsaWQ6MTsgLyogQ2FuIHN1Y2Nlc3NmdWxseSBlbmFibGUgd2FrZXVwPyAqLwotCXU4CXJ1bl93YWtlOjE7IC8qIFJ1bi1XYWtlIEdQRSBkZXZpY2VzICovCisJdTggdmFsaWQ6MTsJCS8qIENhbiBzdWNjZXNzZnVsbHkgZW5hYmxlIHdha2V1cD8gKi8KKwl1OCBydW5fd2FrZToxOwkJLyogUnVuLVdha2UgR1BFIGRldmljZXMgKi8KIH07CiAKIHN0cnVjdCBhY3BpX2RldmljZV93YWtldXBfc3RhdGUgewotCXU4CWVuYWJsZWQ6MTsKLQl1OAlhY3RpdmU6MTsKKwl1OCBlbmFibGVkOjE7CisJdTggYWN0aXZlOjE7CiB9OwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2FrZXVwIHsKLQlhY3BpX2hhbmRsZQkJZ3BlX2RldmljZTsKLQlhY3BpX2ludGVnZXIJCWdwZV9udW1iZXI7OwotCWFjcGlfaW50ZWdlcgkJc2xlZXBfc3RhdGU7Ci0Jc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QJcmVzb3VyY2VzOwotCXN0cnVjdCBhY3BpX2RldmljZV93YWtldXBfc3RhdGUJc3RhdGU7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX3dha2V1cF9mbGFncwlmbGFnczsKKwlhY3BpX2hhbmRsZSBncGVfZGV2aWNlOworCWFjcGlfaW50ZWdlciBncGVfbnVtYmVyOzsKKwlhY3BpX2ludGVnZXIgc2xlZXBfc3RhdGU7CisJc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgcmVzb3VyY2VzOworCXN0cnVjdCBhY3BpX2RldmljZV93YWtldXBfc3RhdGUgc3RhdGU7CisJc3RydWN0IGFjcGlfZGV2aWNlX3dha2V1cF9mbGFncyBmbGFnczsKIH07CiAKIC8qIERldmljZSAqLwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2UgewotCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpwYXJlbnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZAljaGlsZHJlbjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7Ci0Jc3RydWN0IGxpc3RfaGVhZAl3YWtldXBfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWdfbGlzdDsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJc3RydWN0IGFjcGlfZGV2aWNlICpwYXJlbnQ7CisJc3RydWN0IGxpc3RfaGVhZCBjaGlsZHJlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc3RydWN0IGxpc3RfaGVhZCB3YWtldXBfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGdfbGlzdDsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2Vfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2VfZmxhZ3MgZmxhZ3M7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX3BucAlwbnA7CisJc3RydWN0IGFjcGlfZGV2aWNlX3BucCBwbnA7CiAJc3RydWN0IGFjcGlfZGV2aWNlX3Bvd2VyIHBvd2VyOwogCXN0cnVjdCBhY3BpX2RldmljZV93YWtldXAgd2FrZXVwOwotCXN0cnVjdCBhY3BpX2RldmljZV9wZXJmCXBlcmZvcm1hbmNlOwotCXN0cnVjdCBhY3BpX2RldmljZV9kaXIJZGlyOwotCXN0cnVjdCBhY3BpX2RldmljZV9vcHMJb3BzOwotCXN0cnVjdCBhY3BpX2RyaXZlcgkqZHJpdmVyOwotCXZvaWQJCQkqZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IGtvYmplY3QJCWtvYmo7CisJc3RydWN0IGFjcGlfZGV2aWNlX3BlcmYgcGVyZm9ybWFuY2U7CisJc3RydWN0IGFjcGlfZGV2aWNlX2RpciBkaXI7CisJc3RydWN0IGFjcGlfZGV2aWNlX29wcyBvcHM7CisJc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXI7CisJdm9pZCAqZHJpdmVyX2RhdGE7CisJc3RydWN0IGtvYmplY3Qga29iajsKIH07CiAKICNkZWZpbmUgYWNwaV9kcml2ZXJfZGF0YShkKQkoKGQpLT5kcml2ZXJfZGF0YSkKIAotCiAvKgogICogRXZlbnRzCiAgKiAtLS0tLS0KICAqLwogCiBzdHJ1Y3QgYWNwaV9idXNfZXZlbnQgewotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKLQlhY3BpX2RldmljZV9jbGFzcwlkZXZpY2VfY2xhc3M7Ci0JYWNwaV9idXNfaWQJCWJ1c19pZDsKLQl1MzIJCQl0eXBlOwotCXUzMgkJCWRhdGE7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWFjcGlfZGV2aWNlX2NsYXNzIGRldmljZV9jbGFzczsKKwlhY3BpX2J1c19pZCBidXNfaWQ7CisJdTMyIHR5cGU7CisJdTMyIGRhdGE7CiB9OwogCiBleHRlcm4gc3RydWN0IHN1YnN5c3RlbSBhY3BpX3N1YnN5czsKQEAgLTMzNSwzNCArMzIxLDMyIEBACiAKIGludCBhY3BpX2J1c19nZXRfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfZGV2aWNlICoqZGV2aWNlKTsKIHZvaWQgYWNwaV9idXNfZGF0YV9oYW5kbGVyKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGZ1bmN0aW9uLCB2b2lkICpjb250ZXh0KTsKLWludCBhY3BpX2J1c19nZXRfc3RhdHVzIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1pbnQgYWNwaV9idXNfZ2V0X3Bvd2VyIChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqc3RhdGUpOwotaW50IGFjcGlfYnVzX3NldF9wb3dlciAoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgc3RhdGUpOwotaW50IGFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50IChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgdTggdHlwZSwgaW50IGRhdGEpOwotaW50IGFjcGlfYnVzX3JlY2VpdmVfZXZlbnQgKHN0cnVjdCBhY3BpX2J1c19ldmVudCAqZXZlbnQpOwotaW50IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlciAoc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpOwotaW50IGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyIChzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcik7Ci1pbnQgYWNwaV9idXNfYWRkIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKipjaGlsZCwgc3RydWN0IGFjcGlfZGV2aWNlICpwYXJlbnQsCi0JCWFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpOwotaW50IGFjcGlfYnVzX3N0YXJ0IChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitpbnQgYWNwaV9idXNfZ2V0X3N0YXR1cyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitpbnQgYWNwaV9idXNfZ2V0X3Bvd2VyKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50ICpzdGF0ZSk7CitpbnQgYWNwaV9idXNfc2V0X3Bvd2VyKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHN0YXRlKTsKK2ludCBhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgdTggdHlwZSwgaW50IGRhdGEpOworaW50IGFjcGlfYnVzX3JlY2VpdmVfZXZlbnQoc3RydWN0IGFjcGlfYnVzX2V2ZW50ICpldmVudCk7CitpbnQgYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKTsKK2ludCBhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcik7CitpbnQgYWNwaV9idXNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqKmNoaWxkLCBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCwKKwkJIGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpOworaW50IGFjcGlfYnVzX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAotCi1pbnQgYWNwaV9tYXRjaF9pZHMgKHN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLCBjaGFyCSppZHMpOworaW50IGFjcGlfbWF0Y2hfaWRzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBjaGFyICppZHMpOwogaW50IGFjcGlfY3JlYXRlX2RpcihzdHJ1Y3QgYWNwaV9kZXZpY2UgKik7CiB2b2lkIGFjcGlfcmVtb3ZlX2RpcihzdHJ1Y3QgYWNwaV9kZXZpY2UgKik7CiAKLQogLyoKICAqIEJpbmQgcGh5c2ljYWwgZGV2aWNlcyB3aXRoIEFDUEkgZGV2aWNlcwogICovCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiBzdHJ1Y3QgYWNwaV9idXNfdHlwZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXN0cnVjdCBidXNfdHlwZQkJKmJ1czsKLQkvKiBGb3IgZ2VuZXJhbCBkZXZpY2VzIHVuZGVyIHRoZSBidXMqLwotCWludCAoKmZpbmRfZGV2aWNlKShzdHJ1Y3QgZGV2aWNlICosIGFjcGlfaGFuZGxlKik7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBidXNfdHlwZSAqYnVzOworCS8qIEZvciBnZW5lcmFsIGRldmljZXMgdW5kZXIgdGhlIGJ1cyAqLworCWludCAoKmZpbmRfZGV2aWNlKSAoc3RydWN0IGRldmljZSAqLCBhY3BpX2hhbmRsZSAqKTsKIAkvKiBGb3IgYnJpZGdlcywgc3VjaCBhcyBQQ0kgcm9vdCBicmlkZ2UsIElERSBjb250cm9sbGVyICovCi0JaW50ICgqZmluZF9icmlkZ2UpKHN0cnVjdCBkZXZpY2UgKiwgYWNwaV9oYW5kbGUgKik7CisJaW50ICgqZmluZF9icmlkZ2UpIChzdHJ1Y3QgZGV2aWNlICosIGFjcGlfaGFuZGxlICopOwogfTsKIGludCByZWdpc3Rlcl9hY3BpX2J1c190eXBlKHN0cnVjdCBhY3BpX2J1c190eXBlICopOwogaW50IHVucmVnaXN0ZXJfYWNwaV9idXNfdHlwZShzdHJ1Y3QgYWNwaV9idXNfdHlwZSAqKTsKQEAgLTM3Miw2ICszNTYsNiBAQAogYWNwaV9oYW5kbGUgYWNwaV9nZXRfcGNpX3Jvb3RicmlkZ2VfaGFuZGxlKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKICNkZWZpbmUgREVWSUNFX0FDUElfSEFORExFKGRldikgKChhY3BpX2hhbmRsZSkoKGRldiktPmZpcm13YXJlX2RhdGEpKQogCi0jZW5kaWYgLypDT05GSUdfQUNQSV9CVVMqLworI2VuZGlmIC8qIENPTkZJR19BQ1BJICovCiAKICNlbmRpZiAvKl9fQUNQSV9CVVNfSF9fKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaCBiL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaAppbmRleCA1NzlmZTE5Li5jMWI0ZTFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KIAotCiAjZGVmaW5lIEFDUElfTUFYX1NUUklORwkJCTgwCiAKICNkZWZpbmUgQUNQSV9CVVNfQ09NUE9ORU5UCQkweDAwMDEwMDAwCkBAIC00NCw2MCArNDMsNTUgQEAKICNkZWZpbmUgQUNQSV9CVVRUT05fSElEX1BPV0VSRgkJIkFDUElfRlBCIgogI2RlZmluZSBBQ1BJX0JVVFRPTl9ISURfU0xFRVBGCQkiQUNQSV9GU0IiCiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmZGVmIENPTkZJR19BQ1BJX1BDSQotCiAjZGVmaW5lIEFDUElfUENJX0NPTVBPTkVOVAkJMHgwMDQwMDAwMAogCiAvKiBBQ1BJIFBDSSBJbnRlcnJ1cHQgTGluayAocGNpX2xpbmsuYykgKi8KIAotaW50IGFjcGlfaXJxX3BlbmFsdHlfaW5pdCAodm9pZCk7Ci1pbnQgYWNwaV9wY2lfbGlua19hbGxvY2F0ZV9pcnEgKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGluZGV4LCBpbnQgKmVkZ2VfbGV2ZWwsCi0JaW50ICphY3RpdmVfaGlnaF9sb3csIGNoYXIgKipuYW1lKTsKK2ludCBhY3BpX2lycV9wZW5hbHR5X2luaXQodm9pZCk7CitpbnQgYWNwaV9wY2lfbGlua19hbGxvY2F0ZV9pcnEoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgaW5kZXgsIGludCAqZWRnZV9sZXZlbCwKKwkJCSAgICAgICBpbnQgKmFjdGl2ZV9oaWdoX2xvdywgY2hhciAqKm5hbWUpOwogaW50IGFjcGlfcGNpX2xpbmtfZnJlZV9pcnEoYWNwaV9oYW5kbGUgaGFuZGxlKTsKIAogLyogQUNQSSBQQ0kgSW50ZXJydXB0IFJvdXRpbmcgKHBjaV9pcnEuYykgKi8KIAotaW50IGFjcGlfcGNpX2lycV9hZGRfcHJ0IChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBzZWdtZW50LCBpbnQgYnVzKTsKLXZvaWQgYWNwaV9wY2lfaXJxX2RlbF9wcnQgKGludCBzZWdtZW50LCBpbnQgYnVzKTsKK2ludCBhY3BpX3BjaV9pcnFfYWRkX3BydChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBzZWdtZW50LCBpbnQgYnVzKTsKK3ZvaWQgYWNwaV9wY2lfaXJxX2RlbF9wcnQoaW50IHNlZ21lbnQsIGludCBidXMpOwogCiAvKiBBQ1BJIFBDSSBEZXZpY2UgQmluZGluZyAocGNpX2JpbmQuYykgKi8KIAogc3RydWN0IHBjaV9idXM7CiAKLWFjcGlfc3RhdHVzIGFjcGlfZ2V0X3BjaV9pZCAoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9wY2lfaWQgKmlkKTsKLWludCBhY3BpX3BjaV9iaW5kIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1pbnQgYWNwaV9wY2lfdW5iaW5kIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1pbnQgYWNwaV9wY2lfYmluZF9yb290IChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgc3RydWN0IGFjcGlfcGNpX2lkICppZCwgc3RydWN0IHBjaV9idXMgKmJ1cyk7CithY3BpX3N0YXR1cyBhY3BpX2dldF9wY2lfaWQoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9wY2lfaWQgKmlkKTsKK2ludCBhY3BpX3BjaV9iaW5kKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK2ludCBhY3BpX3BjaV91bmJpbmQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworaW50IGFjcGlfcGNpX2JpbmRfcm9vdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgc3RydWN0IGFjcGlfcGNpX2lkICppZCwKKwkJICAgICAgIHN0cnVjdCBwY2lfYnVzICpidXMpOwogCiAvKiBBcmNoLWRlZmluZWQgZnVuY3Rpb24gdG8gYWRkIGEgYnVzIHRvIHRoZSBzeXN0ZW0gKi8KIAotc3RydWN0IHBjaV9idXMgKnBjaV9hY3BpX3NjYW5fcm9vdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IGRvbWFpbiwgaW50IGJ1cyk7Ci0KLSNlbmRpZiAvKkNPTkZJR19BQ1BJX1BDSSovCi0KK3N0cnVjdCBwY2lfYnVzICpwY2lfYWNwaV9zY2FuX3Jvb3Qoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBkb21haW4sCisJCQkJICAgaW50IGJ1cyk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXIgUmVzb3VyY2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICNpZmRlZiBDT05GSUdfQUNQSV9QT1dFUgotaW50IGFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2VfcG93ZXIgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2KTsKLWludCBhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZV9wb3dlciAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXYpOwotaW50IGFjcGlfcG93ZXJfZ2V0X2luZmVycmVkX3N0YXRlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1pbnQgYWNwaV9wb3dlcl90cmFuc2l0aW9uIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKTsKK2ludCBhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3Bvd2VyKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2KTsKK2ludCBhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZV9wb3dlcihzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldik7CitpbnQgYWNwaV9wb3dlcl9nZXRfaW5mZXJyZWRfc3RhdGUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworaW50IGFjcGlfcG93ZXJfdHJhbnNpdGlvbihzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKTsKICNlbmRpZgogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1iZWRkZWQgQ29udHJvbGxlcgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICNpZmRlZiBDT05GSUdfQUNQSV9FQwotaW50IGFjcGlfZWNfZWNkdF9wcm9iZSAodm9pZCk7CitpbnQgYWNwaV9lY19lY2R0X3Byb2JlKHZvaWQpOwogI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCmluZGV4IGVhNDg5ZjIuLjk4ZTBiOGNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaApAQCAtNyw3ICs3LDYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgpAQCAtNTEsNyArNTAsNiBAQAogI2luY2x1ZGUgInBsYXRmb3JtL2FjZW52LmgiCiAjaW5jbHVkZSAiYWN0eXBlcy5oIgogCi0KIC8qIFByaW9yaXRpZXMgZm9yIGFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbiAqLwogCiAjZGVmaW5lIE9TRF9QUklPUklUWV9HUEUgICAgICAgICAgICAxCkBAIC02MiwyMDAgKzYwLDEzNiBAQAogI2RlZmluZSBBQ1BJX05PX1VOSVRfTElNSVQgICAgICAgICAgKCh1MzIpIC0xKQogI2RlZmluZSBBQ1BJX01VVEVYX1NFTSAgICAgICAgICAgICAgMQogCi0KIC8qIEZ1bmN0aW9ucyBmb3IgYWNwaV9vc19zaWduYWwgKi8KIAogI2RlZmluZSBBQ1BJX1NJR05BTF9GQVRBTCAgICAgICAgICAgMAogI2RlZmluZSBBQ1BJX1NJR05BTF9CUkVBS1BPSU5UICAgICAgMQogCi1zdHJ1Y3QgYWNwaV9zaWduYWxfZmF0YWxfaW5mbwotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudDsKK3N0cnVjdCBhY3BpX3NpZ25hbF9mYXRhbF9pbmZvIHsKKwl1MzIgdHlwZTsKKwl1MzIgY29kZTsKKwl1MzIgYXJndW1lbnQ7CiB9OwogCi0KIC8qCiAgKiBPU0wgSW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duIHByaW1pdGl2ZXMKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfb3NfaW5pdGlhbGl6ZSAoCi0Jdm9pZCk7CithY3BpX3N0YXR1cyBhY3BpX29zX2luaXRpYWxpemUodm9pZCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX3Rlcm1pbmF0ZSAoCi0Jdm9pZCk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfb3NfdGVybWluYXRlKHZvaWQpOwogCiAvKgogICogQUNQSSBUYWJsZSBpbnRlcmZhY2VzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX29zX2dldF9yb290X3BvaW50ZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcyk7CithY3BpX3N0YXR1cyBhY3BpX29zX2dldF9yb290X3BvaW50ZXIodTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfb3NfcHJlZGVmaW5lZF9vdmVycmlkZSAoCi0JY29uc3Qgc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyAqaW5pdF92YWwsCi0JYWNwaV9zdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgKm5ld192YWwpOworYWNwaV9vc19wcmVkZWZpbmVkX292ZXJyaWRlKGNvbnN0IHN0cnVjdCBhY3BpX3ByZWRlZmluZWRfbmFtZXMgKmluaXRfdmFsLAorCQkJICAgIGFjcGlfc3RyaW5nICogbmV3X3ZhbCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX3RhYmxlX292ZXJyaWRlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpleGlzdGluZ190YWJsZSwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICoqbmV3X3RhYmxlKTsKLQorYWNwaV9vc190YWJsZV9vdmVycmlkZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmV4aXN0aW5nX3RhYmxlLAorCQkgICAgICAgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqbmV3X3RhYmxlKTsKIAogLyoKICAqIFN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3VuaXRzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF91bml0cywKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgICpvdXRfaGFuZGxlKTsKK2FjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSh1MzIgbWF4X3VuaXRzLAorCQkJIHUzMiBpbml0aWFsX3VuaXRzLCBhY3BpX2hhbmRsZSAqIG91dF9oYW5kbGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9vc19kZWxldGVfc2VtYXBob3JlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CithY3BpX3N0YXR1cyBhY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUoYWNwaV9oYW5kbGUgaGFuZGxlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfb3Nfd2FpdF9zZW1hcGhvcmUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMsCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KTsKK2FjcGlfc3RhdHVzIGFjcGlfb3Nfd2FpdF9zZW1hcGhvcmUoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdW5pdHMsIHUxNiB0aW1lb3V0KTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CithY3BpX3N0YXR1cyBhY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdW5pdHMpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9vc19jcmVhdGVfbG9jayAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAqb3V0X2hhbmRsZSk7CithY3BpX3N0YXR1cyBhY3BpX29zX2NyZWF0ZV9sb2NrKGFjcGlfaGFuZGxlICogb3V0X2hhbmRsZSk7CiAKLXZvaWQKLWFjcGlfb3NfZGVsZXRlX2xvY2sgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKK3ZvaWQgYWNwaV9vc19kZWxldGVfbG9jayhhY3BpX2hhbmRsZSBoYW5kbGUpOwogCi12b2lkCi1hY3BpX29zX2FjcXVpcmVfbG9jayAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Cit1bnNpZ25lZCBsb25nIGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfaGFuZGxlIGhhbmRsZSk7CiAKLXZvaWQKLWFjcGlfb3NfcmVsZWFzZV9sb2NrICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQordm9pZCBhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2hhbmRsZSBoYW5kbGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCiAvKgogICogTWVtb3J5IGFsbG9jYXRpb24gYW5kIG1hcHBpbmcKICAqLwotdm9pZCAqCi1hY3BpX29zX2FsbG9jYXRlICgKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwordm9pZCAqYWNwaV9vc19hbGxvY2F0ZShhY3BpX3NpemUgc2l6ZSk7CiAKLXZvaWQKLWFjcGlfb3NfZnJlZSAoCi0Jdm9pZCAqICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkpOwordm9pZCBhY3BpX29zX2ZyZWUodm9pZCAqbWVtb3J5KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfb3NfbWFwX21lbW9yeSAoCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBwaHlzaWNhbF9hZGRyZXNzLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICAgICAqKmxvZ2ljYWxfYWRkcmVzcyk7CithY3BpX29zX21hcF9tZW1vcnkoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHBoeXNpY2FsX2FkZHJlc3MsCisJCSAgIGFjcGlfc2l6ZSBzaXplLCB2b2lkIF9faW9tZW0gKiogbG9naWNhbF9hZGRyZXNzKTsKIAotdm9pZAotYWNwaV9vc191bm1hcF9tZW1vcnkgKAotCXZvaWQgX19pb21lbSAgICAgICAgICAgICAgICAgICpsb2dpY2FsX2FkZHJlc3MsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKK3ZvaWQgYWNwaV9vc191bm1hcF9tZW1vcnkodm9pZCBfX2lvbWVtICogbG9naWNhbF9hZGRyZXNzLCBhY3BpX3NpemUgc2l6ZSk7CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfb3NfZ2V0X3BoeXNpY2FsX2FkZHJlc3MgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvZ2ljYWxfYWRkcmVzcywKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgICpwaHlzaWNhbF9hZGRyZXNzKTsKK2FjcGlfb3NfZ2V0X3BoeXNpY2FsX2FkZHJlc3Modm9pZCAqbG9naWNhbF9hZGRyZXNzLAorCQkJICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgKiBwaHlzaWNhbF9hZGRyZXNzKTsKICNlbmRpZgogCisvKgorICogTWVtb3J5L09iamVjdCBDYWNoZQorICovCithY3BpX3N0YXR1cworYWNwaV9vc19jcmVhdGVfY2FjaGUoY2hhciAqY2FjaGVfbmFtZSwKKwkJICAgICB1MTYgb2JqZWN0X3NpemUsCisJCSAgICAgdTE2IG1heF9kZXB0aCwgYWNwaV9jYWNoZV90ICoqIHJldHVybl9jYWNoZSk7CisKK2FjcGlfc3RhdHVzIGFjcGlfb3NfZGVsZXRlX2NhY2hlKGFjcGlfY2FjaGVfdCAqIGNhY2hlKTsKKworYWNwaV9zdGF0dXMgYWNwaV9vc19wdXJnZV9jYWNoZShhY3BpX2NhY2hlX3QgKiBjYWNoZSk7CisKK3ZvaWQgKmFjcGlfb3NfYWNxdWlyZV9vYmplY3QoYWNwaV9jYWNoZV90ICogY2FjaGUpOworCithY3BpX3N0YXR1cyBhY3BpX29zX3JlbGVhc2Vfb2JqZWN0KGFjcGlfY2FjaGVfdCAqIGNhY2hlLCB2b2lkICpvYmplY3QpOwogCiAvKgogICogSW50ZXJydXB0IGhhbmRsZXJzCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX29zX2luc3RhbGxfaW50ZXJydXB0X2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NpLAotCWFjcGlfb3NkX2hhbmRsZXIgICAgICAgICAgICAgICAgc2VydmljZV9yb3V0aW5lLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworYWNwaV9vc19pbnN0YWxsX2ludGVycnVwdF9oYW5kbGVyKHUzMiBnc2ksCisJCQkJICBhY3BpX29zZF9oYW5kbGVyIHNlcnZpY2Vfcm91dGluZSwKKwkJCQkgIHZvaWQgKmNvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9vc19yZW1vdmVfaW50ZXJydXB0X2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NpLAotCWFjcGlfb3NkX2hhbmRsZXIgICAgICAgICAgICAgICAgc2VydmljZV9yb3V0aW5lKTsKLQorYWNwaV9vc19yZW1vdmVfaW50ZXJydXB0X2hhbmRsZXIodTMyIGdzaSwgYWNwaV9vc2RfaGFuZGxlciBzZXJ2aWNlX3JvdXRpbmUpOwogCiAvKgogICogVGhyZWFkcyBhbmQgU2NoZWR1bGluZwogICovCi11MzIKLWFjcGlfb3NfZ2V0X3RocmVhZF9pZCAoCi0Jdm9pZCk7Cit1MzIgYWNwaV9vc19nZXRfdGhyZWFkX2lkKHZvaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAotCWFjcGlfb3NkX2V4ZWNfY2FsbGJhY2sgICAgICAgICAgZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CithY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24odTMyIHByaW9yaXR5LAorCQkJICAgIGFjcGlfb3NkX2V4ZWNfY2FsbGJhY2sgZnVuY3Rpb24sIHZvaWQgKmNvbnRleHQpOwogCi12b2lkCi1hY3BpX29zX3dhaXRfZXZlbnRzX2NvbXBsZXRlKAotCXZvaWQgKiBjb250ZXh0KTsKK3ZvaWQgYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZSh2b2lkICpjb250ZXh0KTsKIAotdm9pZAotYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Cit2b2lkIGFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUodm9pZCAqY29udGV4dCk7CiAKLXZvaWQKLWFjcGlfb3Nfc2xlZXAgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKTsKK3ZvaWQgYWNwaV9vc19zbGVlcChhY3BpX2ludGVnZXIgbWlsbGlzZWNvbmRzKTsKIAotdm9pZAotYWNwaV9vc19zdGFsbCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb3NlY29uZHMpOwotCit2b2lkIGFjcGlfb3Nfc3RhbGwodTMyIG1pY3Jvc2Vjb25kcyk7CiAKIC8qCiAgKiBQbGF0Zm9ybSBhbmQgaGFyZHdhcmUtaW5kZXBlbmRlbnQgSS9PIGludGVyZmFjZXMKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfb3NfcmVhZF9wb3J0ICgKLQlhY3BpX2lvX2FkZHJlc3MgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CithY3BpX3N0YXR1cyBhY3BpX29zX3JlYWRfcG9ydChhY3BpX2lvX2FkZHJlc3MgYWRkcmVzcywgdTMyICogdmFsdWUsIHUzMiB3aWR0aCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX3dyaXRlX3BvcnQgKAotCWFjcGlfaW9fYWRkcmVzcyAgICAgICAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOwotCithY3BpX3N0YXR1cyBhY3BpX29zX3dyaXRlX3BvcnQoYWNwaV9pb19hZGRyZXNzIGFkZHJlc3MsIHUzMiB2YWx1ZSwgdTMyIHdpZHRoKTsKIAogLyoKICAqIFBsYXRmb3JtIGFuZCBoYXJkd2FyZS1pbmRlcGVuZGVudCBwaHlzaWNhbCBtZW1vcnkgaW50ZXJmYWNlcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9vc19yZWFkX21lbW9yeSAoCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworYWNwaV9vc19yZWFkX21lbW9yeShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywgdTMyICogdmFsdWUsIHUzMiB3aWR0aCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX3dyaXRlX21lbW9yeSAoCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0KK2FjcGlfb3Nfd3JpdGVfbWVtb3J5KGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLCB1MzIgdmFsdWUsIHUzMiB3aWR0aCk7CiAKIC8qCiAgKiBQbGF0Zm9ybSBhbmQgaGFyZHdhcmUtaW5kZXBlbmRlbnQgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgYWNjZXNzCkBAIC0yNjMsMTExICsxOTcsNjkgQEAKICAqIGNlcnRhaW4gY29tcGlsZXJzIGNvbXBsYWluLgogICovCiBhY3BpX3N0YXR1cwotYWNwaV9vc19yZWFkX3BjaV9jb25maWd1cmF0aW9uICgKLQlzdHJ1Y3QgYWNwaV9wY2lfaWQgICAgICAgICAgICAgICpwY2lfaWQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CithY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24oc3RydWN0IGFjcGlfcGNpX2lkICpwY2lfaWQsCisJCQkgICAgICAgdTMyIHJlZywgdm9pZCAqdmFsdWUsIHUzMiB3aWR0aCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX3dyaXRlX3BjaV9jb25maWd1cmF0aW9uICgKLQlzdHJ1Y3QgYWNwaV9wY2lfaWQgICAgICAgICAgICAgICpwY2lfaWQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKK2FjcGlfb3Nfd3JpdGVfcGNpX2NvbmZpZ3VyYXRpb24oc3RydWN0IGFjcGlfcGNpX2lkICpwY2lfaWQsCisJCQkJdTMyIHJlZywgYWNwaV9pbnRlZ2VyIHZhbHVlLCB1MzIgd2lkdGgpOwogCiAvKgogICogSW50ZXJpbSBmdW5jdGlvbiBuZWVkZWQgZm9yIFBDSSBJUlEgcm91dGluZwogICovCiB2b2lkCi1hY3BpX29zX2Rlcml2ZV9wY2lfaWQoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICByaGFuZGxlLAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgY2hhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9wY2lfaWQgICAgICAgICAgICAgICoqcGNpX2lkKTsKK2FjcGlfb3NfZGVyaXZlX3BjaV9pZChhY3BpX2hhbmRsZSByaGFuZGxlLAorCQkgICAgICBhY3BpX2hhbmRsZSBjaGFuZGxlLCBzdHJ1Y3QgYWNwaV9wY2lfaWQgKipwY2lfaWQpOwogCiAvKgogICogTWlzY2VsbGFuZW91cwogICovCi11OAotYWNwaV9vc19yZWFkYWJsZSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9pbnRlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Cit1OCBhY3BpX29zX3JlYWRhYmxlKHZvaWQgKnBvaW50ZXIsIGFjcGlfc2l6ZSBsZW5ndGgpOwogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLXU4Ci1hY3BpX29zX3dyaXRhYmxlICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2ludGVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKK3U4IGFjcGlfb3Nfd3JpdGFibGUodm9pZCAqcG9pbnRlciwgYWNwaV9zaXplIGxlbmd0aCk7CiAjZW5kaWYKIAotdTY0Ci1hY3BpX29zX2dldF90aW1lciAoCi0Jdm9pZCk7Cit1NjQgYWNwaV9vc19nZXRfdGltZXIodm9pZCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX3NpZ25hbCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvKTsKK2FjcGlfc3RhdHVzIGFjcGlfb3Nfc2lnbmFsKHUzMiBmdW5jdGlvbiwgdm9pZCAqaW5mbyk7CiAKIC8qCiAgKiBEZWJ1ZyBwcmludCByb3V0aW5lcwogICovCi12b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCi1hY3BpX29zX3ByaW50ZiAoCi0JY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqZm9ybWF0LAotCS4uLik7Cit2b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFIGFjcGlfb3NfcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKIAotdm9pZAotYWNwaV9vc192cHJpbnRmICgKLQljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpmb3JtYXQsCi0JdmFfbGlzdCAgICAgICAgICAgICAgICAgYXJncyk7Cit2b2lkIGFjcGlfb3NfdnByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncyk7CiAKLXZvaWQKLWFjcGlfb3NfcmVkaXJlY3Rfb3V0cHV0ICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0aW5hdGlvbik7Ci0KK3ZvaWQgYWNwaV9vc19yZWRpcmVjdF9vdXRwdXQodm9pZCAqZGVzdGluYXRpb24pOwogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIC8qCiAgKiBEZWJ1ZyBpbnB1dAogICovCi11MzIKLWFjcGlfb3NfZ2V0X2xpbmUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcik7Cit1MzIgYWNwaV9vc19nZXRfbGluZShjaGFyICpidWZmZXIpOwogI2VuZGlmCiAKLQogLyoKICAqIERpcmVjdG9yeSBtYW5pcHVsYXRpb24KICAqLwotdm9pZCAqCi1hY3BpX29zX29wZW5fZGlyZWN0b3J5ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRobmFtZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp3aWxkY2FyZF9zcGVjLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2ZpbGVfdHlwZSk7Cit2b2lkICphY3BpX29zX29wZW5fZGlyZWN0b3J5KGNoYXIgKnBhdGhuYW1lLAorCQkJICAgICBjaGFyICp3aWxkY2FyZF9zcGVjLCBjaGFyIHJlcXVlc3RlZF9maWxlX3R5cGUpOwogCiAvKiByZXF1ZXN0ZV9maWxlX3R5cGUgdmFsdWVzICovCiAKICNkZWZpbmUgUkVRVUVTVF9GSUxFX09OTFkgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBSRVFVRVNUX0RJUl9PTkxZICAgICAgICAgICAgICAgICAgICAxCiAKK2NoYXIgKmFjcGlfb3NfZ2V0X25leHRfZmlsZW5hbWUodm9pZCAqZGlyX2hhbmRsZSk7CiAKLWNoYXIgKgotYWNwaV9vc19nZXRfbmV4dF9maWxlbmFtZSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGlyX2hhbmRsZSk7Ci0KLXZvaWQKLWFjcGlfb3NfY2xvc2VfZGlyZWN0b3J5ICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkaXJfaGFuZGxlKTsKK3ZvaWQgYWNwaV9vc19jbG9zZV9kaXJlY3Rvcnkodm9pZCAqZGlyX2hhbmRsZSk7CiAKIC8qCiAgKiBEZWJ1ZwogICovCiB2b2lkCi1hY3BpX29zX2RiZ19hc3NlcnQoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmFpbGVkX2Fzc2VydGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmaWxlX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptZXNzYWdlKTsKK2FjcGlfb3NfZGJnX2Fzc2VydCh2b2lkICpmYWlsZWRfYXNzZXJ0aW9uLAorCQkgICB2b2lkICpmaWxlX25hbWUsIHUzMiBsaW5lX251bWJlciwgY2hhciAqbWVzc2FnZSk7CiAKLSNlbmRpZiAvKiBfX0FDUElPU1hGX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNQSU9TWEZfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmggYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKaW5kZXggZjhmNjE5Zi4uMmE5ZGJjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaApAQCAtNDIsNDQ3ICs0MiwyODMgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpZm5kZWYgX19BQ1hGQUNFX0hfXwogI2RlZmluZSBfX0FDWEZBQ0VfSF9fCiAKICNpbmNsdWRlICJhY3R5cGVzLmgiCiAjaW5jbHVkZSAiYWN0YmwuaCIKIAotCiAvKgogICogR2xvYmFsIGludGVyZmFjZXMKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0gKAotCXZvaWQpOworYWNwaV9zdGF0dXMgYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSh2b2lkKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZW5hYmxlX3N1YnN5c3RlbSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CithY3BpX3N0YXR1cyBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0odTMyIGZsYWdzKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKK2FjcGlfc3RhdHVzIGFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzKHUzMiBmbGFncyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3Rlcm1pbmF0ZSAoCi0Jdm9pZCk7CithY3BpX3N0YXR1cyBhY3BpX3Rlcm1pbmF0ZSh2b2lkKTsKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV9zdWJzeXN0ZW1fc3RhdHVzICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfc3Vic3lzdGVtX3N0YXR1cyh2b2lkKTsKICNlbmRpZgogCi1hY3BpX3N0YXR1cwotYWNwaV9lbmFibGUgKAotCXZvaWQpOworYWNwaV9zdGF0dXMgYWNwaV9lbmFibGUodm9pZCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2Rpc2FibGUgKAotCXZvaWQpOworYWNwaV9zdGF0dXMgYWNwaV9kaXNhYmxlKHZvaWQpOwogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9zeXN0ZW1faW5mbyAoCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcik7CithY3BpX3N0YXR1cyBhY3BpX2dldF9zeXN0ZW1faW5mbyhzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpOwogI2VuZGlmCiAKLWNvbnN0IGNoYXIgKgotYWNwaV9mb3JtYXRfZXhjZXB0aW9uICgKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbik7Citjb25zdCBjaGFyICphY3BpX2Zvcm1hdF9leGNlcHRpb24oYWNwaV9zdGF0dXMgZXhjZXB0aW9uKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfcHVyZ2VfY2FjaGVkX29iamVjdHMgKAotCXZvaWQpOworYWNwaV9zdGF0dXMgYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyh2b2lkKTsKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9pbnN0YWxsX2luaXRpYWxpemF0aW9uX2hhbmRsZXIgKAotCWFjcGlfaW5pdF9oYW5kbGVyICAgICAgICAgICAgICAgaGFuZGxlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKTsKK2FjcGlfaW5zdGFsbF9pbml0aWFsaXphdGlvbl9oYW5kbGVyKGFjcGlfaW5pdF9oYW5kbGVyIGhhbmRsZXIsIHUzMiBmdW5jdGlvbik7CiAjZW5kaWYKIAogLyoKICAqIEFDUEkgTWVtb3J5IG1hbmFnbWVudAogICovCi12b2lkICoKLWFjcGlfYWxsb2NhdGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Cit2b2lkICphY3BpX2FsbG9jYXRlKHUzMiBzaXplKTsKIAotdm9pZCAqCi1hY3BpX2NhbGxvY2F0ZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKK3ZvaWQgKmFjcGlfY2FsbG9jYXRlKHUzMiBzaXplKTsKIAotdm9pZAotYWNwaV9mcmVlICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICphZGRyZXNzKTsKLQordm9pZCBhY3BpX2ZyZWUodm9pZCAqYWRkcmVzcyk7CiAKIC8qCiAgKiBBQ1BJIHRhYmxlIG1hbmlwdWxhdGlvbiBpbnRlcmZhY2VzCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2ZpbmRfcm9vdF9wb2ludGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKnJzZHBfYWRkcmVzcyk7CithY3BpX2ZpbmRfcm9vdF9wb2ludGVyKHUzMiBmbGFncywgc3RydWN0IGFjcGlfcG9pbnRlciAqcnNkcF9hZGRyZXNzKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfbG9hZF90YWJsZXMgKAotCXZvaWQpOworYWNwaV9zdGF0dXMgYWNwaV9sb2FkX3RhYmxlcyh2b2lkKTsKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV9sb2FkX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9wdHIpOworYWNwaV9zdGF0dXMgYWNwaV9sb2FkX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfcHRyKTsKKworYWNwaV9zdGF0dXMgYWNwaV91bmxvYWRfdGFibGUoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91bmxvYWRfdGFibGUgKAotCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdGFibGVfdHlwZSk7CithY3BpX2dldF90YWJsZV9oZWFkZXIoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUsCisJCSAgICAgIHUzMiBpbnN0YW5jZSwgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpvdXRfdGFibGVfaGVhZGVyKTsKKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF90YWJsZV9oZWFkZXIgKAotCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdGFibGVfdHlwZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKm91dF90YWJsZV9oZWFkZXIpOwotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCithY3BpX2dldF90YWJsZShhY3BpX3RhYmxlX3R5cGUgdGFibGVfdHlwZSwKKwkgICAgICAgdTMyIGluc3RhbmNlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfdGFibGUgKAotCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdGFibGVfdHlwZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfZmlybXdhcmVfdGFibGUgKAotCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICoqdGFibGVfcG9pbnRlcik7Ci0KK2FjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKGFjcGlfc3RyaW5nIHNpZ25hdHVyZSwKKwkJCXUzMiBpbnN0YW5jZSwKKwkJCXUzMiBmbGFncywgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqdGFibGVfcG9pbnRlcik7CiAKIC8qCiAgKiBOYW1lc3BhY2UgYW5kIG5hbWUgaW50ZXJmYWNlcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV93YWxrX25hbWVzcGFjZSAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc3RhcnRfb2JqZWN0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RlcHRoLAotCWFjcGlfd2Fsa19jYWxsYmFjayAgICAgICAgICAgICAgdXNlcl9mdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworYWNwaV93YWxrX25hbWVzcGFjZShhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCSAgICBhY3BpX2hhbmRsZSBzdGFydF9vYmplY3QsCisJCSAgICB1MzIgbWF4X2RlcHRoLAorCQkgICAgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCisJCSAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2RldmljZXMgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkhJRCwKLQlhY3BpX3dhbGtfY2FsbGJhY2sgICAgICAgICAgICAgIHVzZXJfZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKK2FjcGlfZ2V0X2RldmljZXMoY2hhciAqSElELAorCQkgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCisJCSB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X25hbWUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV90eXBlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9wYXRoX3B0cik7CithY3BpX2dldF9uYW1lKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkgICAgICB1MzIgbmFtZV90eXBlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9wYXRoX3B0cik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9oYW5kbGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgcGFyZW50LAotCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUsCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAqcmV0X2hhbmRsZSk7CithY3BpX2dldF9oYW5kbGUoYWNwaV9oYW5kbGUgcGFyZW50LAorCQlhY3BpX3N0cmluZyBwYXRobmFtZSwgYWNwaV9oYW5kbGUgKiByZXRfaGFuZGxlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfYXR0YWNoX2RhdGEgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQlhY3BpX29iamVjdF9oYW5kbGVyICAgICAgICAgICAgIGhhbmRsZXIsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7CithY3BpX2F0dGFjaF9kYXRhKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCSBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmRhdGEpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kZXRhY2hfZGF0YSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCWFjcGlfb2JqZWN0X2hhbmRsZXIgICAgICAgICAgICAgaGFuZGxlcik7CithY3BpX2RldGFjaF9kYXRhKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9kYXRhICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JYWNwaV9vYmplY3RfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipkYXRhKTsKLQorYWNwaV9nZXRfZGF0YShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLCBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKipkYXRhKTsKIAogLyoKICAqIE9iamVjdCBtYW5pcHVsYXRpb24gYW5kIGVudW1lcmF0aW9uCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V2YWx1YXRlX29iamVjdCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCi0JYWNwaV9zdHJpbmcgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSwKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAgICAgICAgICpwYXJhbWV0ZXJfb2JqZWN0cywKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXR1cm5fb2JqZWN0X2J1ZmZlcik7CithY3BpX2V2YWx1YXRlX29iamVjdChhY3BpX2hhbmRsZSBvYmplY3QsCisJCSAgICAgYWNwaV9zdHJpbmcgcGF0aG5hbWUsCisJCSAgICAgc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKnBhcmFtZXRlcl9vYmplY3RzLAorCQkgICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0dXJuX29iamVjdF9idWZmZXIpOwogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCi1hY3BpX2V2YWx1YXRlX29iamVjdF90eXBlZCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCi0JYWNwaV9zdHJpbmcgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSwKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAgICAgICAgICpleHRlcm5hbF9wYXJhbXMsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0dXJuX2J1ZmZlciwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHJldHVybl90eXBlKTsKK2FjcGlfZXZhbHVhdGVfb2JqZWN0X3R5cGVkKGFjcGlfaGFuZGxlIG9iamVjdCwKKwkJCSAgIGFjcGlfc3RyaW5nIHBhdGhuYW1lLAorCQkJICAgc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKmV4dGVybmFsX3BhcmFtcywKKwkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0dXJuX2J1ZmZlciwKKwkJCSAgIGFjcGlfb2JqZWN0X3R5cGUgcmV0dXJuX3R5cGUpOwogI2VuZGlmCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9vYmplY3RfaW5mbyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0dXJuX2J1ZmZlcik7CithY3BpX2dldF9vYmplY3RfaW5mbyhhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0dXJuX2J1ZmZlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9uZXh0X29iamVjdCAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgcGFyZW50LAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgY2hpbGQsCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAqb3V0X2hhbmRsZSk7CithY3BpX2dldF9uZXh0X29iamVjdChhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCSAgICAgYWNwaV9oYW5kbGUgcGFyZW50LAorCQkgICAgIGFjcGlfaGFuZGxlIGNoaWxkLCBhY3BpX2hhbmRsZSAqIG91dF9oYW5kbGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfdHlwZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAqb3V0X3R5cGUpOworYWNwaV9zdGF0dXMgYWNwaV9nZXRfdHlwZShhY3BpX2hhbmRsZSBvYmplY3QsIGFjcGlfb2JqZWN0X3R5cGUgKiBvdXRfdHlwZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9wYXJlbnQgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgKm91dF9oYW5kbGUpOwotCithY3BpX3N0YXR1cyBhY3BpX2dldF9wYXJlbnQoYWNwaV9oYW5kbGUgb2JqZWN0LCBhY3BpX2hhbmRsZSAqIG91dF9oYW5kbGUpOwogCiAvKgogICogRXZlbnQgaGFuZGxlciBpbnRlcmZhY2VzCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2V2ZW50LAotCWFjcGlfZXZlbnRfaGFuZGxlciAgICAgICAgICAgICAgaGFuZGxlciwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK2FjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKHUzMiBhY3BpX2V2ZW50LAorCQkJCSBhY3BpX2V2ZW50X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZXZlbnQsCi0JYWNwaV9ldmVudF9oYW5kbGVyICAgICAgICAgICAgICBoYW5kbGVyKTsKK2FjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIodTMyIGFjcGlfZXZlbnQsIGFjcGlfZXZlbnRfaGFuZGxlciBoYW5kbGVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyX3R5cGUsCi0JYWNwaV9ub3RpZnlfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGFjcGlfaGFuZGxlIGRldmljZSwKKwkJCSAgICB1MzIgaGFuZGxlcl90eXBlLAorCQkJICAgIGFjcGlfbm90aWZ5X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyX3R5cGUsCi0JYWNwaV9ub3RpZnlfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyKTsKK2FjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGFjcGlfaGFuZGxlIGRldmljZSwKKwkJCSAgIHUzMiBoYW5kbGVyX3R5cGUsIGFjcGlfbm90aWZ5X2hhbmRsZXIgaGFuZGxlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLQlhY3BpX2Fkcl9zcGFjZV90eXBlICAgICAgICAgICAgIHNwYWNlX2lkLAotCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgICAgICAgICAgaGFuZGxlciwKLQlhY3BpX2Fkcl9zcGFjZV9zZXR1cCAgICAgICAgICAgIHNldHVwLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihhY3BpX2hhbmRsZSBkZXZpY2UsCisJCQkJICAgYWNwaV9hZHJfc3BhY2VfdHlwZSBzcGFjZV9pZCwKKwkJCQkgICBhY3BpX2Fkcl9zcGFjZV9oYW5kbGVyIGhhbmRsZXIsCisJCQkJICAgYWNwaV9hZHJfc3BhY2Vfc2V0dXAgc2V0dXAsIHZvaWQgKmNvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yZW1vdmVfYWRkcmVzc19zcGFjZV9oYW5kbGVyICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLQlhY3BpX2Fkcl9zcGFjZV90eXBlICAgICAgICAgICAgIHNwYWNlX2lkLAotCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgICAgICAgICAgaGFuZGxlcik7CithY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZGV2aWNlLAorCQkJCSAgYWNwaV9hZHJfc3BhY2VfdHlwZSBzcGFjZV9pZCwKKwkJCQkgIGFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgaGFuZGxlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotCWFjcGlfZXZlbnRfaGFuZGxlciAgICAgICAgICAgICAgYWRkcmVzcywKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK2FjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcihhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAorCQkJIHUzMiBncGVfbnVtYmVyLAorCQkJIHUzMiB0eXBlLCBhY3BpX2V2ZW50X2hhbmRsZXIgYWRkcmVzcywgdm9pZCAqY29udGV4dCk7CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9leGNlcHRpb25faGFuZGxlciAoCi0JYWNwaV9leGNlcHRpb25faGFuZGxlciAgICAgICAgICBoYW5kbGVyKTsKK2FjcGlfc3RhdHVzIGFjcGlfaW5zdGFsbF9leGNlcHRpb25faGFuZGxlcihhY3BpX2V4Y2VwdGlvbl9oYW5kbGVyIGhhbmRsZXIpOwogI2VuZGlmCiAKLQogLyoKICAqIEV2ZW50IGludGVyZmFjZXMKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZSk7CithY3BpX3N0YXR1cyBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2sodTE2IHRpbWVvdXQsIHUzMiAqIGhhbmRsZSk7CisKK2FjcGlfc3RhdHVzIGFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayh1MzIgaGFuZGxlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpOworYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJCXUzMiBncGVfbnVtYmVyLCBhY3BpX2V2ZW50X2hhbmRsZXIgYWRkcmVzcyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3JlbW92ZV9ncGVfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlciwKLQlhY3BpX2V2ZW50X2hhbmRsZXIgICAgICAgICAgICAgIGFkZHJlc3MpOworYWNwaV9zdGF0dXMgYWNwaV9lbmFibGVfZXZlbnQodTMyIGV2ZW50LCB1MzIgZmxhZ3MpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9lbmFibGVfZXZlbnQgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CithY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGVfZXZlbnQodTMyIGV2ZW50LCB1MzIgZmxhZ3MpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kaXNhYmxlX2V2ZW50ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworYWNwaV9zdGF0dXMgYWNwaV9jbGVhcl9ldmVudCh1MzIgZXZlbnQpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9jbGVhcl9ldmVudCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X2V2ZW50X3N0YXR1cyh1MzIgZXZlbnQsIGFjcGlfZXZlbnRfc3RhdHVzICogZXZlbnRfc3RhdHVzKTsKKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCisKK2FjcGlfc3RhdHVzIGFjcGlfc2V0X2dwZV90eXBlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyLCB1OCB0eXBlKTsKKworYWNwaV9zdGF0dXMgYWNwaV9lbmFibGVfZ3BlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyLCB1MzIgZmxhZ3MpOworCithY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGVfZ3BlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyLCB1MzIgZmxhZ3MpOworCithY3BpX3N0YXR1cyBhY3BpX2NsZWFyX2dwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlciwgdTMyIGZsYWdzKTsKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfZXZlbnRfc3RhdHVzICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAotCWFjcGlfZXZlbnRfc3RhdHVzICAgICAgICAgICAgICAgKmV2ZW50X3N0YXR1cyk7Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KK2FjcGlfZ2V0X2dwZV9zdGF0dXMoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJICAgIHUzMiBncGVfbnVtYmVyLAorCQkgICAgdTMyIGZsYWdzLCBhY3BpX2V2ZW50X3N0YXR1cyAqIGV2ZW50X3N0YXR1cyk7CisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9zZXRfZ3BlX3R5cGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKK2FjcGlfaW5zdGFsbF9ncGVfYmxvY2soYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJICAgICAgIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ3BlX2Jsb2NrX2FkZHJlc3MsCisJCSAgICAgICB1MzIgcmVnaXN0ZXJfY291bnQsIHUzMiBpbnRlcnJ1cHRfbnVtYmVyKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZW5hYmxlX2dwZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZGlzYWJsZV9ncGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2NsZWFyX2dwZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfZ3BlX3N0YXR1cyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCWFjcGlfZXZlbnRfc3RhdHVzICAgICAgICAgICAgICAgKmV2ZW50X3N0YXR1cyk7Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9ncGVfYmxvY2sgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgICpncGVfYmxvY2tfYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2NvdW50LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0X2xldmVsKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfcmVtb3ZlX2dwZV9ibG9jayAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlKTsKLQorYWNwaV9zdGF0dXMgYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UpOwogCiAvKgogICogUmVzb3VyY2UgaW50ZXJmYWNlcwogICovCiB0eXBlZGVmCi1hY3BpX3N0YXR1cyAoKkFDUElfV0FMS19SRVNPVVJDRV9DQUxMQkFDSykgKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKnJlc291cmNlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCithY3BpX3N0YXR1cygqQUNQSV9XQUxLX1JFU09VUkNFX0NBTExCQUNLKSAoc3RydWN0IGFjcGlfcmVzb3VyY2UgKiByZXNvdXJjZSwKKwkJCQkJICAgdm9pZCAqY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9jdXJyZW50X3Jlc291cmNlcygKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGRldmljZV9oYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcik7CithY3BpX2dldF9jdXJyZW50X3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAorCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfcG9zc2libGVfcmVzb3VyY2VzKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2hhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKTsKK2FjcGlfZ2V0X3Bvc3NpYmxlX3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAorCQkJICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CiAjZW5kaWYKIAogYWNwaV9zdGF0dXMKLWFjcGlfd2Fsa19yZXNvdXJjZXMgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfaGFuZGxlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCwKLQlBQ1BJX1dBTEtfUkVTT1VSQ0VfQ0FMTEJBQ0sgICAgIHVzZXJfZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK2FjcGlfd2Fsa19yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJICAgIGNoYXIgKnBhdGgsCisJCSAgICBBQ1BJX1dBTEtfUkVTT1VSQ0VfQ0FMTEJBQ0sgdXNlcl9mdW5jdGlvbiwgdm9pZCAqY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKmluX2J1ZmZlcik7CithY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAorCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICppbl9idWZmZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgYnVzX2RldmljZV9oYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcik7CithY3BpX2dldF9pcnFfcm91dGluZ190YWJsZShhY3BpX2hhbmRsZSBidXNfZGV2aWNlX2hhbmRsZSwKKwkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NCAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqcmVzb3VyY2UsCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0ICpvdXQpOworYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAorCQkJICAgc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0ICpvdXQpOwogCiAvKgogICogSGFyZHdhcmUgKEFDUEkgZGV2aWNlKSBpbnRlcmZhY2VzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9yZWdpc3RlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9pZCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXR1cm5fdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CithY3BpX3N0YXR1cyBhY3BpX2dldF9yZWdpc3Rlcih1MzIgcmVnaXN0ZXJfaWQsIHUzMiAqIHJldHVybl92YWx1ZSwgdTMyIGZsYWdzKTsKKworYWNwaV9zdGF0dXMgYWNwaV9zZXRfcmVnaXN0ZXIodTMyIHJlZ2lzdGVyX2lkLCB1MzIgdmFsdWUsIHUzMiBmbGFncyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3NldF9yZWdpc3RlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9pZCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvciAoCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBwaHlzaWNhbF9hZGRyZXNzKTsKK2FjcGlfc2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHBoeXNpY2FsX2FkZHJlc3MpOwogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yICgKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgICpwaHlzaWNhbF9hZGRyZXNzKTsKK2FjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IoYWNwaV9waHlzaWNhbF9hZGRyZXNzICogcGh5c2ljYWxfYWRkcmVzcyk7CiAjZW5kaWYKIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcF9zdGF0ZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzbHBfdHlwX2EsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2xwX3R5cF9iKTsKK2FjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YSh1OCBzbGVlcF9zdGF0ZSwgdTggKiBzbHBfdHlwX2EsIHU4ICogc2xwX3R5cF9iKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcF9zdGF0ZSk7CithY3BpX3N0YXR1cyBhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAodTggc2xlZXBfc3RhdGUpOwogCi1hY3BpX3N0YXR1cyBhc21saW5rYWdlCi1hY3BpX2VudGVyX3NsZWVwX3N0YXRlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFzbWxpbmthZ2UgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSh1OCBzbGVlcF9zdGF0ZSk7CiAKLWFjcGlfc3RhdHVzIGFzbWxpbmthZ2UKLWFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFzbWxpbmthZ2UgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9zNGJpb3Modm9pZCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2xlYXZlX3NsZWVwX3N0YXRlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfbGVhdmVfc2xlZXBfc3RhdGUodTggc2xlZXBfc3RhdGUpOwogCi0KLSNlbmRpZiAvKiBfX0FDWEZBQ0VfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ1hGQUNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcmVzcmMuaCBiL2luY2x1ZGUvYWNwaS9hY3Jlc3JjLmgKaW5kZXggZWQ2NzkyNi4uMzhlNzk4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcmVzcmMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNyZXNyYy5oCkBAIC00NCwzMDMgKzQ0LDIxNiBAQAogI2lmbmRlZiBfX0FDUkVTUkNfSF9fCiAjZGVmaW5lIF9fQUNSRVNSQ19IX18KIAotCiAvKgogICogIEZ1bmN0aW9uIHByb3RvdHlwZXMgY2FsbGVkIGZyb20gQWNwaSogQVBJcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfcHJ0X21ldGhvZF9kYXRhICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKTsKLQorYWNwaV9yc19nZXRfcHJ0X21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZ2V0X2Nyc19tZXRob2RfZGF0YSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcik7CithY3BpX3JzX2dldF9jcnNfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpOwogCiAjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpOwotI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCithY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpOworI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9tZXRob2RfZGF0YSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKTsKK2FjcGlfcnNfZ2V0X21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCWNoYXIgKnBhdGgsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX3NldF9zcnNfbWV0aG9kX2RhdGEgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpOworYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpvdXRwdXRfYnVmZmVyKTsKK2FjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJICAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dHB1dF9idWZmZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19jcmVhdGVfYnl0ZV9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0X2J1ZmZlciwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpvdXRwdXRfYnVmZmVyKTsKK2FjcGlfcnNfY3JlYXRlX2J5dGVfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdF9idWZmZXIsCisJCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dHB1dF9idWZmZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19jcmVhdGVfcGNpX3JvdXRpbmdfdGFibGUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnBhY2thZ2Vfb2JqZWN0LAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKm91dHB1dF9idWZmZXIpOwotCithY3BpX3JzX2NyZWF0ZV9wY2lfcm91dGluZ190YWJsZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX29iamVjdCwKKwkJCQkgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXRfYnVmZmVyKTsKIAogLyoKICAqIHJzZHVtcAogICovCiAjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKLXZvaWQKLWFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0ICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpyZXNvdXJjZSk7Cit2b2lkIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0KHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSk7CiAKLXZvaWQKLWFjcGlfcnNfZHVtcF9pcnFfbGlzdCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcm91dGVfdGFibGUpOwotI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCi0KK3ZvaWQgYWNwaV9yc19kdW1wX2lycV9saXN0KHU4ICogcm91dGVfdGFibGUpOworI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIC8qCiAgKiByc2NhbGMKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZ2V0X2J5dGVfc3RyZWFtX3N0YXJ0ICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmJ5dGVfc3RyZWFtX3N0YXJ0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUpOworYWNwaV9yc19nZXRfYnl0ZV9zdHJlYW1fc3RhcnQodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkgICAgICB1OCAqKiBieXRlX3N0cmVhbV9zdGFydCwgdTMyICogc2l6ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9saXN0X2xlbmd0aCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzaXplX25lZWRlZCk7CithY3BpX3JzX2dldF9saXN0X2xlbmd0aCh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCXUzMiBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoLCBhY3BpX3NpemUgKiBzaXplX25lZWRlZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9ieXRlX3N0cmVhbV9sZW5ndGggKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzaXplX25lZWRlZCk7CithY3BpX3JzX2dldF9ieXRlX3N0cmVhbV9sZW5ndGgoc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0X2J1ZmZlciwKKwkJCSAgICAgICBhY3BpX3NpemUgKiBzaXplX25lZWRlZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9wY2lfcm91dGluZ190YWJsZV9sZW5ndGggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnBhY2thZ2Vfb2JqZWN0LAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcl9zaXplX25lZWRlZCk7CithY3BpX3JzX2dldF9wY2lfcm91dGluZ190YWJsZV9sZW5ndGgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFja2FnZV9vYmplY3QsCisJCQkJICAgICBhY3BpX3NpemUgKiBidWZmZXJfc2l6ZV9uZWVkZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19ieXRlX3N0cmVhbV90b19saXN0ICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dF9idWZmZXIpOworYWNwaV9yc19ieXRlX3N0cmVhbV90b19saXN0KHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJICAgIHUzMiBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoLCB1OCAqIG91dHB1dF9idWZmZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19saXN0X3RvX2J5dGVfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dF9idWZmZXIpOworYWNwaV9yc19saXN0X3RvX2J5dGVfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCSAgICBhY3BpX3NpemUgYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQsCisJCQkgICAgdTggKiBvdXRwdXRfYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfaW9fcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSk7CithY3BpX3JzX2lvX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkgICAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCSAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2ZpeGVkX2lvX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpOworYWNwaV9yc19maXhlZF9pb19yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfaW9fc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX2lvX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCSAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19maXhlZF9pb19zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKTsKK2FjcGlfcnNfZml4ZWRfaW9fc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCXU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfaXJxX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpOworYWNwaV9yc19pcnFfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCSAgICAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCSAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19pcnFfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX2lycV9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2RtYV9yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfZG1hX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkgICAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZG1hX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpOworYWNwaV9yc19kbWFfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19hZGRyZXNzMTZfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSk7CithY3BpX3JzX2FkZHJlc3MxNl9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19hZGRyZXNzMTZfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX2FkZHJlc3MxNl9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfYWRkcmVzczMyX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpOworYWNwaV9yc19hZGRyZXNzMzJfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCSAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfYWRkcmVzczMyX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpOworYWNwaV9yc19hZGRyZXNzMzJfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCSB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3M2NF9yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfYWRkcmVzczY0X3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJICAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3M2NF9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKTsKK2FjcGlfcnNfYWRkcmVzczY0X3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQkgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19zdGFydF9kZXBlbmRfZm5zX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpOworYWNwaV9yc19zdGFydF9kZXBlbmRfZm5zX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCSAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkJICB1OCAqKiBvdXRwdXRfYnVmZmVyLAorCQkJCSAgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19lbmRfZGVwZW5kX2Zuc19yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfZW5kX2RlcGVuZF9mbnNfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkJdTggKiogb3V0cHV0X2J1ZmZlciwKKwkJCQlhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCQl1OCAqKiBvdXRwdXRfYnVmZmVyLAorCQkJCWFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZW5kX2RlcGVuZF9mbnNfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX2VuZF9kZXBlbmRfZm5zX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQkgICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX21lbW9yeTI0X3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpOworYWNwaV9yc19tZW1vcnkyNF9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfbWVtb3J5MjRfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX21lbW9yeTI0X3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQl1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX21lbW9yeTMyX3JhbmdlX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpOworYWNwaV9yc19tZW1vcnkzMl9yYW5nZV9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQlhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCQl1OCAqKiBvdXRwdXRfYnVmZmVyLAorCQkJCWFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZml4ZWRfbWVtb3J5MzJfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSk7CithY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCWFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJCXU4ICoqIG91dHB1dF9idWZmZXIsCisJCQkJYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19tZW1vcnkzMl9yYW5nZV9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKTsKK2FjcGlfcnNfbWVtb3J5MzJfcmFuZ2Vfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCSAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZml4ZWRfbWVtb3J5MzJfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQkgICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2V4dGVuZGVkX2lycV9yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfZXh0ZW5kZWRfaXJxX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJICAgICAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkgICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2V4dGVuZGVkX2lycV9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKTsKK2FjcGlfcnNfZXh0ZW5kZWRfaXJxX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQkgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19lbmRfdGFnX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpOworYWNwaV9yc19lbmRfdGFnX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZW5kX3RhZ19zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKTsKK2FjcGlfcnNfZW5kX3RhZ19zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkgICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc192ZW5kb3JfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSk7CithY3BpX3JzX3ZlbmRvcl9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCWFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc192ZW5kb3Jfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX3ZlbmRvcl9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkgICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7CiAKLXU4Ci1hY3BpX3JzX2dldF9yZXNvdXJjZV90eXBlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3N0YXJ0X2J5dGUpOwordTggYWNwaV9yc19nZXRfcmVzb3VyY2VfdHlwZSh1OCByZXNvdXJjZV9zdGFydF9ieXRlKTsKIAotI2VuZGlmICAvKiBfX0FDUkVTUkNfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ1JFU1JDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmggYi9pbmNsdWRlL2FjcGkvYWNzdHJ1Y3QuaAppbmRleCBlNmI5ZTM2Li45OWQyMzUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNzdHJ1Y3QuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNzdHJ1Y3QuaApAQCAtNDQsMTQgKzQ0LDEyIEBACiAjaWZuZGVmIF9fQUNTVFJVQ1RfSF9fCiAjZGVmaW5lIF9fQUNTVFJVQ1RfSF9fCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogVHJlZSB3YWxraW5nIHR5cGVkZWZzIGFuZCBzdHJ1Y3RzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLyoKICAqIFdhbGsgc3RhdGUgLSBjdXJyZW50IHN0YXRlIG9mIGEgcGFyc2UgdHJlZSB3YWxrLiAgVXNlZCBmb3IgYm90aCBhIGxlaXN1cmVseSBzdHJvbGwgdGhyb3VnaAogICogdGhlIHRyZWUgKGZvciB3aGF0ZXZlciByZWFzb24pLCBhbmQgZm9yIGNvbnRyb2wgbWV0aG9kIGV4ZWN1dGlvbi4KQEAgLTY1LDE1MiArNjMsMTQyIEBACiAjZGVmaW5lIEFDUElfV0FMS19DT05TVF9SRVFVSVJFRCAgICAzCiAjZGVmaW5lIEFDUElfV0FMS19DT05TVF9PUFRJT05BTCAgICA0CiAKLXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyBNVVNUIEJFIEZJUlNUISovXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtfdHlwZTsKLQlhY3BpX293bmVyX2lkICAgICAgICAgICAgICAgICAgICAgICBvd25lcl9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPd25lciBvZiBvYmplY3RzIGNyZWF0ZWQgZHVyaW5nIHRoZSB3YWxrICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9wcmVkaWNhdGU7ICAgICAgICAgICAgICAgICAgICAgLyogUmVzdWx0IG9mIGxhc3QgcHJlZGljYXRlICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGFsaWdubWVudCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgIC8qICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9vcF9pbmZvOyAgICAgICAgICAgICAgICAgICAgICAgLyogSW5mbyBhYm91dCBuZXh0X29wICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX29wZXJhbmRzOyAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhY2sgcG9pbnRlciBmb3IgT3BlcmFuZHNbXSBhcnJheSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl91c2VkOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgQU1MIG9wY29kZSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlX2RlcHRoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXNoIGZvciBmaXhlZCBvciB2YXIgYXJncyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vZmZzZXQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX3R5cGVzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9icmVha3BvaW50OyAgICAgICAgICAgICAgICAgIC8qIEZvciBzaW5nbGUgc3RlcHBpbmcgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2JyZWFrcG9pbnQ7ICAgICAgICAgICAgICAgICAgICAvKiBVc2VyIEFNTCBicmVha3BvaW50ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfZmxhZ3M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9hcmdfdHlwZXM7CitzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlIHsKKwl1OCBkYXRhX3R5cGU7CQkvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyBNVVNUIEJFIEZJUlNUISAqLworCXU4IHdhbGtfdHlwZTsKKwlhY3BpX293bmVyX2lkIG93bmVyX2lkOwkvKiBPd25lciBvZiBvYmplY3RzIGNyZWF0ZWQgZHVyaW5nIHRoZSB3YWxrICovCisJdTggbGFzdF9wcmVkaWNhdGU7CS8qIFJlc3VsdCBvZiBsYXN0IHByZWRpY2F0ZSAqLworCXU4IGN1cnJlbnRfcmVzdWx0OwkvKiAqLworCXU4IG5leHRfb3BfaW5mbzsJLyogSW5mbyBhYm91dCBuZXh0X29wICovCisJdTggbnVtX29wZXJhbmRzOwkvKiBTdGFjayBwb2ludGVyIGZvciBPcGVyYW5kc1tdIGFycmF5ICovCisJdTggcmV0dXJuX3VzZWQ7CisJdTE2IG9wY29kZTsJCS8qIEN1cnJlbnQgQU1MIG9wY29kZSAqLworCXU4IHNjb3BlX2RlcHRoOworCXU4IHBhc3NfbnVtYmVyOwkJLyogUGFyc2UgcGFzcyBkdXJpbmcgdGFibGUgbG9hZCAqLworCXUzMiBhcmdfY291bnQ7CQkvKiBwdXNoIGZvciBmaXhlZCBvciB2YXIgYXJncyAqLworCXUzMiBhbWxfb2Zmc2V0OworCXUzMiBhcmdfdHlwZXM7CisJdTMyIG1ldGhvZF9icmVha3BvaW50OwkvKiBGb3Igc2luZ2xlIHN0ZXBwaW5nICovCisJdTMyIHVzZXJfYnJlYWtwb2ludDsJLyogVXNlciBBTUwgYnJlYWtwb2ludCAqLworCXUzMiBwYXJzZV9mbGFnczsKKwl1MzIgcHJldl9hcmdfdHlwZXM7CiAKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sX2xhc3Rfd2hpbGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgYXJndW1lbnRzW0FDUElfTUVUSE9EX05VTV9BUkdTXTsgICAgLyogQ29udHJvbCBtZXRob2QgYXJndW1lbnRzICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgKipjYWxsZXJfcmV0dXJuX2Rlc2M7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAgICAgKmNvbnRyb2xfc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgLyogTGlzdCBvZiBjb250cm9sIHN0YXRlcyAobmVzdGVkIElGcykgKi8KLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAqZGVmZXJyZWRfbm9kZTsgICAgICAgICAgICAgICAgICAgICAvKiBVc2VkIHdoZW4gZXhlY3V0aW5nIGRlZmVycmVkIG9wY29kZXMgKi8KLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICAgICAqZ3BlX2V2ZW50X2luZm87ICAgICAgICAgICAgICAgICAgICAvKiBJbmZvIGZvciBHUEUgKF9MeHgvX0V4eCBtZXRob2RzIG9ubHkgKi8KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAqaW1wbGljaXRfcmV0dXJuX29iajsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICBsb2NhbF92YXJpYWJsZXNbQUNQSV9NRVRIT0RfTlVNX0xPQ0FMU107ICAgIC8qIENvbnRyb2wgbWV0aG9kIGxvY2FscyAqLwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICptZXRob2RfY2FsbF9ub2RlOyAgICAgICAgICAgICAgICAgIC8qIENhbGxlZCBtZXRob2QgTm9kZSovCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAgKm1ldGhvZF9jYWxsX29wOyAgICAgICAgICAgICAgICAgICAgLyogbWV0aG9kX2NhbGwgT3AgaWYgcnVubmluZyBhIG1ldGhvZCAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICptZXRob2RfZGVzYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIE1ldGhvZCBkZXNjcmlwdG9yIGlmIHJ1bm5pbmcgYSBtZXRob2QgKi8KLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAqbWV0aG9kX25vZGU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBNZXRob2Qgbm9kZSBpZiBydW5uaW5nIGEgbWV0aG9kLiAqLwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgICAgICpvcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgcGFyc2VyIG9wICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgKm9wZXJhbmRzW0FDUElfT0JKX05VTV9PUEVSQU5EUysxXTsgLyogT3BlcmFuZHMgcGFzc2VkIHRvIHRoZSBpbnRlcnByZXRlciAoKzEgZm9yIE5VTEwgdGVybWluYXRvcikgKi8KLQljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAgICAgICAqb3BfaW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmZvIG9uIGN1cnJlbnQgb3Bjb2RlICovCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAgKm9yaWdpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhcnQgb2Ygd2FsayBbT2Jzb2xldGVdICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgKipwYXJhbXM7Ci0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAgICAgcGFyc2VyX3N0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBzdGF0ZSBvZiBwYXJzZXIgKi8KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAqcmVzdWx0X29iajsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICAgICAqcmVzdWx0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFjayBvZiBhY2N1bXVsYXRlZCByZXN1bHRzICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgKnJldHVybl9kZXNjOyAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIG9iamVjdCwgaWYgYW55ICovCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAgICAgKnNjb3BlX2luZm87ICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhY2sgb2YgbmVzdGVkIHNjb3BlcyAqLworCXU4ICphbWxfbGFzdF93aGlsZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSBhcmd1bWVudHNbQUNQSV9NRVRIT0RfTlVNX0FSR1NdOwkvKiBDb250cm9sIG1ldGhvZCBhcmd1bWVudHMgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqY2FsbGVyX3JldHVybl9kZXNjOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqY29udHJvbF9zdGF0ZTsJLyogTGlzdCBvZiBjb250cm9sIHN0YXRlcyAobmVzdGVkIElGcykgKi8KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGVmZXJyZWRfbm9kZTsJLyogVXNlZCB3aGVuIGV4ZWN1dGluZyBkZWZlcnJlZCBvcGNvZGVzICovCisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwkvKiBJbmZvIGZvciBHUEUgKF9MeHgvX0V4eCBtZXRob2RzIG9ubHkgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbXBsaWNpdF9yZXR1cm5fb2JqOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIGxvY2FsX3ZhcmlhYmxlc1tBQ1BJX01FVEhPRF9OVU1fTE9DQUxTXTsJLyogQ29udHJvbCBtZXRob2QgbG9jYWxzICovCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9jYWxsX25vZGU7CS8qIENhbGxlZCBtZXRob2QgTm9kZSAqLworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICptZXRob2RfY2FsbF9vcDsJLyogbWV0aG9kX2NhbGwgT3AgaWYgcnVubmluZyBhIG1ldGhvZCAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm1ldGhvZF9kZXNjOwkvKiBNZXRob2QgZGVzY3JpcHRvciBpZiBydW5uaW5nIGEgbWV0aG9kICovCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9ub2RlOwkvKiBNZXRob2Qgbm9kZSBpZiBydW5uaW5nIGEgbWV0aG9kLiAqLworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsJLyogQ3VycmVudCBwYXJzZXIgb3AgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kc1tBQ1BJX09CSl9OVU1fT1BFUkFORFMgKyAxXTsJLyogT3BlcmFuZHMgcGFzc2VkIHRvIHRoZSBpbnRlcnByZXRlciAoKzEgZm9yIE5VTEwgdGVybWluYXRvcikgKi8KKwljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqb3BfaW5mbzsJLyogSW5mbyBvbiBjdXJyZW50IG9wY29kZSAqLworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcmlnaW47CS8qIFN0YXJ0IG9mIHdhbGsgW09ic29sZXRlXSAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipwYXJhbXM7CisJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgcGFyc2VyX3N0YXRlOwkvKiBDdXJyZW50IHN0YXRlIG9mIHBhcnNlciAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlc3VsdF9vYmo7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpyZXN1bHRzOwkvKiBTdGFjayBvZiBhY2N1bXVsYXRlZCByZXN1bHRzICovCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2M7CS8qIFJldHVybiBvYmplY3QsIGlmIGFueSAqLworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc2NvcGVfaW5mbzsJLyogU3RhY2sgb2YgbmVzdGVkIHNjb3BlcyAqLwogCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAgKnByZXZfb3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGFzdCBvcCB0aGF0IHdhcyBwcm9jZXNzZWQgKi8KLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqbmV4dF9vcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG9wIHRvIGJlIHByb2Nlc3NlZCAqLwotCWFjcGlfcGFyc2VfZG93bndhcmRzICAgICAgICAgICAgICAgIGRlc2NlbmRpbmdfY2FsbGJhY2s7Ci0JYWNwaV9wYXJzZV91cHdhcmRzICAgICAgICAgICAgICAgICAgYXNjZW5kaW5nX2NhbGxiYWNrOwotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgICAgICp0aHJlYWQ7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAgICAgKm5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV4dCB3YWxrX3N0YXRlIGluIGxpc3QgKi8KKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcHJldl9vcDsJLyogTGFzdCBvcCB0aGF0IHdhcyBwcm9jZXNzZWQgKi8KKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dF9vcDsJLyogbmV4dCBvcCB0byBiZSBwcm9jZXNzZWQgKi8KKwlhY3BpX3BhcnNlX2Rvd253YXJkcyBkZXNjZW5kaW5nX2NhbGxiYWNrOworCWFjcGlfcGFyc2VfdXB3YXJkcyBhc2NlbmRpbmdfY2FsbGJhY2s7CisJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQ7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqbmV4dDsJLyogTmV4dCB3YWxrX3N0YXRlIGluIGxpc3QgKi8KIH07CiAKLQogLyogSW5mbyB1c2VkIGJ5IGFjcGlfcHNfaW5pdF9vYmplY3RzICovCiAKLXN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvCi17Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY291bnQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY291bnQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9yZWdpb25fY291bnQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9jb3VudDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9jb3VudDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VfY291bnQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9yZWdpb25faW5pdDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2luaXQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaW5pdDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VfaW5pdDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9jb3VudDsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjOworc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8geworCXUxNiBtZXRob2RfY291bnQ7CisJdTE2IGRldmljZV9jb3VudDsKKwl1MTYgb3BfcmVnaW9uX2NvdW50OworCXUxNiBmaWVsZF9jb3VudDsKKwl1MTYgYnVmZmVyX2NvdW50OworCXUxNiBwYWNrYWdlX2NvdW50OworCXUxNiBvcF9yZWdpb25faW5pdDsKKwl1MTYgZmllbGRfaW5pdDsKKwl1MTYgYnVmZmVyX2luaXQ7CisJdTE2IHBhY2thZ2VfaW5pdDsKKwl1MTYgb2JqZWN0X2NvdW50OworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7CiB9OwogCi0KIC8qIEluZm8gdXNlZCBieSBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcyAqLwogCi1zdHJ1Y3QgYWNwaV9kZXZpY2Vfd2Fsa19pbmZvCi17Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY291bnQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fU1RBOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX0lOSTsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjOworc3RydWN0IGFjcGlfZGV2aWNlX3dhbGtfaW5mbyB7CisJdTE2IGRldmljZV9jb3VudDsKKwl1MTYgbnVtX1NUQTsKKwl1MTYgbnVtX0lOSTsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjOwogfTsKIAotCiAvKiBUQkQ6IFtSZXN0cnVjdHVyZV0gTWVyZ2Ugd2l0aCBzdHJ1Y3QgYWJvdmUgKi8KIAotc3RydWN0IGFjcGlfd2Fsa19pbmZvCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19sZXZlbDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyX2lkOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV90eXBlOworc3RydWN0IGFjcGlfd2Fsa19pbmZvIHsKKwl1MzIgZGVidWdfbGV2ZWw7CisJdTMyIGNvdW50OworCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7CisJdTggZGlzcGxheV90eXBlOwogfTsKIAogLyogRGlzcGxheSBUeXBlcyAqLwogCi0jZGVmaW5lIEFDUElfRElTUExBWV9TVU1NQVJZICAgIDAKLSNkZWZpbmUgQUNQSV9ESVNQTEFZX09CSkVDVFMgICAgMQorI2RlZmluZSBBQ1BJX0RJU1BMQVlfU1VNTUFSWSAgICAodTgpIDAKKyNkZWZpbmUgQUNQSV9ESVNQTEFZX09CSkVDVFMgICAgKHU4KSAxCisjZGVmaW5lIEFDUElfRElTUExBWV9NQVNLICAgICAgICh1OCkgMQogCi1zdHJ1Y3QgYWNwaV9nZXRfZGV2aWNlc19pbmZvCi17Ci0JYWNwaV93YWxrX2NhbGxiYWNrICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQ7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGlkOworI2RlZmluZSBBQ1BJX0RJU1BMQVlfU0hPUlQgICAgICAodTgpIDIKKworc3RydWN0IGFjcGlfZ2V0X2RldmljZXNfaW5mbyB7CisJYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb247CisJdm9pZCAqY29udGV4dDsKKwljaGFyICpoaWQ7CiB9OwogCit1bmlvbiBhY3BpX2FtbF9vcGVyYW5kcyB7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZHNbN107CiAKLXVuaW9uIGFjcGlfYW1sX29wZXJhbmRzCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgKm9wZXJhbmRzWzddOwotCi0Jc3RydWN0Ci0JewotCQlzdHJ1Y3QgYWNwaV9vYmplY3RfaW50ZWdlciAgICAgICp0eXBlOwotCQlzdHJ1Y3QgYWNwaV9vYmplY3RfaW50ZWdlciAgICAgICpjb2RlOwotCQlzdHJ1Y3QgYWNwaV9vYmplY3RfaW50ZWdlciAgICAgICphcmd1bWVudDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgYWNwaV9vYmplY3RfaW50ZWdlciAqdHlwZTsKKwkJc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgKmNvZGU7CisJCXN0cnVjdCBhY3BpX29iamVjdF9pbnRlZ2VyICphcmd1bWVudDsKIAogCX0gZmF0YWw7CiAKLQlzdHJ1Y3QKLQl7Ci0JCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZTsKLQkJc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgICAgICAqaW5kZXg7Ci0JCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRhcmdldDsKKwlzdHJ1Y3QgeworCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2U7CisJCXN0cnVjdCBhY3BpX29iamVjdF9pbnRlZ2VyICppbmRleDsKKwkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGFyZ2V0OwogCiAJfSBpbmRleDsKIAotCXN0cnVjdAotCXsKLQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlOwotCQlzdHJ1Y3QgYWNwaV9vYmplY3RfaW50ZWdlciAgICAgICppbmRleDsKLQkJc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgICAgICAqbGVuZ3RoOwotCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YXJnZXQ7CisJc3RydWN0IHsKKwkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlOworCQlzdHJ1Y3QgYWNwaV9vYmplY3RfaW50ZWdlciAqaW5kZXg7CisJCXN0cnVjdCBhY3BpX29iamVjdF9pbnRlZ2VyICpsZW5ndGg7CisJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhcmdldDsKIAogCX0gbWlkOwogfTsKIAotCiAvKiBJbnRlcm5hbCBtZXRob2QgcGFyYW1ldGVyIGxpc3QgKi8KIAotc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8KLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipwYXJhbWV0ZXJzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9vYmplY3Q7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3RfdHlwZTsKK3N0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIHsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcGFyYW1ldGVyczsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fb2JqZWN0OworCXU4IHBhc3NfbnVtYmVyOworCXU4IHBhcmFtZXRlcl90eXBlOworCXU4IHJldHVybl9vYmplY3RfdHlwZTsKIH07CiAKIC8qIFR5cGVzIGZvciBwYXJhbWV0ZXJfdHlwZSBhYm92ZSAqLwpAQCAtMjE4LDUgKzIwNiw0IEBACiAjZGVmaW5lIEFDUElfUEFSQU1fQVJHUyAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBQ1BJX1BBUkFNX0dQRSAgICAgICAgICAgICAgICAgIDEKIAotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oIGIvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKaW5kZXggMzlkZjkyZS4uZjkyYzE4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKQEAgLTQ0LDE0NiArNDQsMTAxIEBACiAjaWZuZGVmIF9fQUNUQUJMRVNfSF9fCiAjZGVmaW5lIF9fQUNUQUJMRVNfSF9fCiAKLQogLyogVXNlZCBpbiBhY3BpX3RiX21hcF9hY3BpX3RhYmxlIGZvciBzaXplIHBhcmFtZXRlciBpZiB0YWJsZSBoZWFkZXIgaXMgdG8gYmUgdXNlZCAqLwogCiAjZGVmaW5lIFNJWkVfSU5fSEVBREVSICAgICAgICAgIDAKIAotCiAvKgogICogdGJjb252cnQgLSBUYWJsZSBjb252ZXJzaW9uIHJvdXRpbmVzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2NvbnZlcnRfdG9feHNkdCAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7CithY3BpX3N0YXR1cyBhY3BpX3RiX2NvbnZlcnRfdG9feHNkdChzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfdGJfY29udmVydF90YWJsZV9mYWR0ICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfdGJfY29udmVydF90YWJsZV9mYWR0KHZvaWQpOwogCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9idWlsZF9jb21tb25fZmFjcyAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7CithY3BpX3N0YXR1cyBhY3BpX3RiX2J1aWxkX2NvbW1vbl9mYWNzKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pOwogCiB1MzIKLWFjcGlfdGJfZ2V0X3RhYmxlX2NvdW50ICgKLQlzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yICAgICAgICAgICpSU0RQLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKlJTRFQpOwotCithY3BpX3RiX2dldF90YWJsZV9jb3VudChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yICpSU0RQLAorCQkJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpSU0RUKTsKIAogLyoKICAqIHRiZ2V0IC0gVGFibGUgImdldCIgcm91dGluZXMKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOworYWNwaV90Yl9nZXRfdGFibGUoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKKwkJICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3RhYmxlX2hlYWRlciAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpyZXR1cm5faGVhZGVyKTsKK2FjcGlfdGJfZ2V0X3RhYmxlX2hlYWRlcihzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzLAorCQkJIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqcmV0dXJuX2hlYWRlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9ib2R5ICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKK2FjcGlfdGJfZ2V0X3RhYmxlX2JvZHkoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKKwkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyLAorCQkgICAgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9wdHIgKAotCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdGFibGVfdHlwZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKip0YWJsZV9wdHJfbG9jKTsKK2FjcGlfdGJfZ2V0X3RhYmxlX3B0cihhY3BpX3RhYmxlX3R5cGUgdGFibGVfdHlwZSwKKwkJICAgICAgdTMyIGluc3RhbmNlLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKip0YWJsZV9wdHJfbG9jKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfdGJfdmVyaWZ5X3JzZHAgKAotCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MpOworYWNwaV9zdGF0dXMgYWNwaV90Yl92ZXJpZnlfcnNkcChzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzKTsKIAotdm9pZAotYWNwaV90Yl9nZXRfcnNkdF9hZGRyZXNzICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICpvdXRfYWRkcmVzcyk7Cit2b2lkIGFjcGlfdGJfZ2V0X3JzZHRfYWRkcmVzcyhzdHJ1Y3QgYWNwaV9wb2ludGVyICpvdXRfYWRkcmVzcyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX3ZhbGlkYXRlX3JzZHQgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlX3B0cik7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfdGJfdmFsaWRhdGVfcnNkdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX3B0cik7CiAKIC8qCiAgKiB0YmdldGFsbCAtIGdldCBtdWx0aXBsZSByZXF1aXJlZCB0YWJsZXMKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3JlcXVpcmVkX3RhYmxlcyAoCi0Jdm9pZCk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfdGJfZ2V0X3JlcXVpcmVkX3RhYmxlcyh2b2lkKTsKIAogLyoKICAqIHRiaW5zdGFsbCAtIFRhYmxlIGluc3RhbGxhdGlvbgogICovCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9pbnN0YWxsX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKK2FjcGlfc3RhdHVzIGFjcGlfdGJfaW5zdGFsbF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdGJfcmVjb2duaXplX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoX3R5cGUpOworYWNwaV90Yl9yZWNvZ25pemVfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbywgdTggc2VhcmNoX3R5cGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl9pbml0X3RhYmxlX2Rlc2NyaXB0b3IgKAotCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdGFibGVfdHlwZSwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKLQorYWNwaV90Yl9pbml0X3RhYmxlX2Rlc2NyaXB0b3IoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKTsKIAogLyoKICAqIHRicmVtb3ZlIC0gVGFibGUgcmVtb3ZhbCBhbmQgZGVsZXRpb24KICAqLwotdm9pZAotYWNwaV90Yl9kZWxldGVfYWxsX3RhYmxlcyAoCi0Jdm9pZCk7Cit2b2lkIGFjcGlfdGJfZGVsZXRlX2FsbF90YWJsZXModm9pZCk7CiAKLXZvaWQKLWFjcGlfdGJfZGVsZXRlX3RhYmxlc19ieV90eXBlICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHR5cGUpOwordm9pZCBhY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZShhY3BpX3RhYmxlX3R5cGUgdHlwZSk7CiAKLXZvaWQKLWFjcGlfdGJfZGVsZXRlX3NpbmdsZV90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYyk7Cit2b2lkIGFjcGlfdGJfZGVsZXRlX3NpbmdsZV90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKTsKIAotc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqCi1hY3BpX3RiX3VuaW5zdGFsbF90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYyk7Ci0KK3N0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKmFjcGlfdGJfdW5pbnN0YWxsX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MKKwkJCQkJCSp0YWJsZV9kZXNjKTsKIAogLyoKICAqIHRieGZyb290IC0gUlNEUCwgUlNEVCB1dGlsaXRpZXMKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfdGJfZmluZF90YWJsZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2lnbmF0dXJlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9lbV9pZCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvZW1fdGFibGVfaWQsCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqKnRhYmxlX3B0cik7CithY3BpX3RiX2ZpbmRfdGFibGUoY2hhciAqc2lnbmF0dXJlLAorCQkgICBjaGFyICpvZW1faWQsCisJCSAgIGNoYXIgKm9lbV90YWJsZV9pZCwgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqdGFibGVfcHRyKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3RhYmxlX3JzZHQgKAotCXZvaWQpOworYWNwaV9zdGF0dXMgYWNwaV90Yl9nZXRfdGFibGVfcnNkdCh2b2lkKTsKIAorYWNwaV9zdGF0dXMgYWNwaV90Yl92YWxpZGF0ZV9yc2RwKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgKnJzZHApOwogCiAvKgogICogdGJ1dGlscyAtIGNvbW1vbiB0YWJsZSB1dGlsaXRpZXMKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfdGJfdmVyaWZ5X3RhYmxlX2NoZWNrc3VtICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9oZWFkZXIpOwotCi11OAotYWNwaV90Yl9jaGVja3N1bSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKK2FjcGlfc3RhdHVzIGFjcGlfdGJfaXNfdGFibGVfaW5zdGFsbGVkKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKm5ld190YWJsZV9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdGJfdmFsaWRhdGVfdGFibGVfaGVhZGVyICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9oZWFkZXIpOworYWNwaV90Yl92ZXJpZnlfdGFibGVfY2hlY2tzdW0oc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9oZWFkZXIpOwogCi0jZW5kaWYgLyogX19BQ1RBQkxFU19IX18gKi8KK3U4IGFjcGlfdGJfZ2VuZXJhdGVfY2hlY2tzdW0odm9pZCAqYnVmZmVyLCB1MzIgbGVuZ3RoKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdGJfdmFsaWRhdGVfdGFibGVfaGVhZGVyKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfaGVhZGVyKTsKKworI2VuZGlmCQkJCS8qIF9fQUNUQUJMRVNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0YmwuaCBiL2luY2x1ZGUvYWNwaS9hY3RibC5oCmluZGV4IGI1Y2RjY2EuLmE0NmY0MDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3RibC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3RibC5oCkBAIC00NCwyNyArNDQsMjQgQEAKICNpZm5kZWYgX19BQ1RCTF9IX18KICNkZWZpbmUgX19BQ1RCTF9IX18KIAotCiAvKgogICogIFZhbHVlcyBmb3IgZGVzY3JpcHRpb24gdGFibGUgaGVhZGVyIHNpZ25hdHVyZXMKICAqLwogI2RlZmluZSBSU0RQX05BTUUgICAgICAgICAgICAgICAiUlNEUCIKLSNkZWZpbmUgUlNEUF9TSUcgICAgICAgICAgICAgICAgIlJTRCBQVFIgIiAgLyogUlNEVCBQb2ludGVyIHNpZ25hdHVyZSAqLwotI2RlZmluZSBBUElDX1NJRyAgICAgICAgICAgICAgICAiQVBJQyIgICAgICAvKiBNdWx0aXBsZSBBUElDIERlc2NyaXB0aW9uIFRhYmxlICovCi0jZGVmaW5lIERTRFRfU0lHICAgICAgICAgICAgICAgICJEU0RUIiAgICAgIC8qIERpZmZlcmVudGlhdGVkIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLwotI2RlZmluZSBGQURUX1NJRyAgICAgICAgICAgICAgICAiRkFDUCIgICAgICAvKiBGaXhlZCBBQ1BJIERlc2NyaXB0aW9uIFRhYmxlICovCi0jZGVmaW5lIEZBQ1NfU0lHICAgICAgICAgICAgICAgICJGQUNTIiAgICAgIC8qIEZpcm13YXJlIEFDUEkgQ29udHJvbCBTdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgUFNEVF9TSUcgICAgICAgICAgICAgICAgIlBTRFQiICAgICAgLyogUGVyc2lzdGVudCBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKi8KLSNkZWZpbmUgUlNEVF9TSUcgICAgICAgICAgICAgICAgIlJTRFQiICAgICAgLyogUm9vdCBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKi8KLSNkZWZpbmUgWFNEVF9TSUcgICAgICAgICAgICAgICAgIlhTRFQiICAgICAgLyogRXh0ZW5kZWQgIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLwotI2RlZmluZSBTU0RUX1NJRyAgICAgICAgICAgICAgICAiU1NEVCIgICAgICAvKiBTZWNvbmRhcnkgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCi0jZGVmaW5lIFNCU1RfU0lHICAgICAgICAgICAgICAgICJTQlNUIiAgICAgIC8qIFNtYXJ0IEJhdHRlcnkgU3BlY2lmaWNhdGlvbiBUYWJsZSAqLwotI2RlZmluZSBTUElDX1NJRyAgICAgICAgICAgICAgICAiU1BJQyIgICAgICAvKiBJT1NBUElDIHRhYmxlICovCi0jZGVmaW5lIEJPT1RfU0lHICAgICAgICAgICAgICAgICJCT09UIiAgICAgIC8qIEJvb3QgdGFibGUgKi8KKyNkZWZpbmUgUlNEUF9TSUcgICAgICAgICAgICAgICAgIlJTRCBQVFIgIgkvKiBSU0RUIFBvaW50ZXIgc2lnbmF0dXJlICovCisjZGVmaW5lIEFQSUNfU0lHICAgICAgICAgICAgICAgICJBUElDIgkvKiBNdWx0aXBsZSBBUElDIERlc2NyaXB0aW9uIFRhYmxlICovCisjZGVmaW5lIERTRFRfU0lHICAgICAgICAgICAgICAgICJEU0RUIgkvKiBEaWZmZXJlbnRpYXRlZCBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKi8KKyNkZWZpbmUgRkFEVF9TSUcgICAgICAgICAgICAgICAgIkZBQ1AiCS8qIEZpeGVkIEFDUEkgRGVzY3JpcHRpb24gVGFibGUgKi8KKyNkZWZpbmUgRkFDU19TSUcgICAgICAgICAgICAgICAgIkZBQ1MiCS8qIEZpcm13YXJlIEFDUEkgQ29udHJvbCBTdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgUFNEVF9TSUcgICAgICAgICAgICAgICAgIlBTRFQiCS8qIFBlcnNpc3RlbnQgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCisjZGVmaW5lIFJTRFRfU0lHICAgICAgICAgICAgICAgICJSU0RUIgkvKiBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLworI2RlZmluZSBYU0RUX1NJRyAgICAgICAgICAgICAgICAiWFNEVCIJLyogRXh0ZW5kZWQgIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLworI2RlZmluZSBTU0RUX1NJRyAgICAgICAgICAgICAgICAiU1NEVCIJLyogU2Vjb25kYXJ5IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLworI2RlZmluZSBTQlNUX1NJRyAgICAgICAgICAgICAgICAiU0JTVCIJLyogU21hcnQgQmF0dGVyeSBTcGVjaWZpY2F0aW9uIFRhYmxlICovCisjZGVmaW5lIFNQSUNfU0lHICAgICAgICAgICAgICAgICJTUElDIgkvKiBJT1NBUElDIHRhYmxlICovCisjZGVmaW5lIEJPT1RfU0lHICAgICAgICAgICAgICAgICJCT09UIgkvKiBCb290IHRhYmxlICovCiAKLQotI2RlZmluZSBHTF9PV05FRCAgICAgICAgICAgICAgICAweDAyICAgICAgICAvKiBPd25lcnNoaXAgb2YgZ2xvYmFsIGxvY2sgaXMgYml0IDEgKi8KLQorI2RlZmluZSBHTF9PV05FRCAgICAgICAgICAgICAgICAweDAyCS8qIE93bmVyc2hpcCBvZiBnbG9iYWwgbG9jayBpcyBiaXQgMSAqLwogCiAvKgogICogQ29tbW9uIHRhYmxlIHR5cGVzLiAgVGhlIGJhc2UgY29kZSBjYW4gcmVtYWluCkBAIC03NSw3ICs3Miw2IEBACiAjZGVmaW5lIEZBQ1NfREVTQ1JJUFRPUiAgICAgICAgIHN0cnVjdCBmYWNzX2Rlc2NyaXB0b3JfcmV2MgogI2RlZmluZSBGQURUX0RFU0NSSVBUT1IgICAgICAgICBzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIKIAotCiAjcHJhZ21hIHBhY2soMSkKIAogLyoKQEAgLTg0LDQ1ICs4MCwzNyBAQAogICogTk9URTogVGhlIHRhYmxlcyB0aGF0IGFyZSBzcGVjaWZpYyB0byBBQ1BJIHZlcnNpb25zICgxLjAsIDIuMCwgZXRjLikKICAqIGFyZSBpbiBzZXBhcmF0ZSBmaWxlcy4KICAqLwotc3RydWN0IHJzZHBfZGVzY3JpcHRvciAgICAgICAgIC8qIFJvb3QgU3lzdGVtIERlc2NyaXB0b3IgUG9pbnRlciAqLwotewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlIFs4XTsgICAgICAgICAgLyogQUNQSSBzaWduYXR1cmUsIGNvbnRhaW5zICJSU0QgUFRSICIgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtOyAgICAgICAgICAgICAgIC8qIFRvIG1ha2Ugc3VtIG9mIHN0cnVjdCA9PSAwICovCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZW1faWQgWzZdOyAgICAgICAgICAgICAvKiBPRU0gaWRlbnRpZmljYXRpb24gKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uOyAgICAgICAgICAgICAgIC8qIE11c3QgYmUgMCBmb3IgMS4wLCAyIGZvciAyLjAgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzZHRfcGh5c2ljYWxfYWRkcmVzczsgIC8qIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIFJTRFQgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qIFhTRFQgTGVuZ3RoIGluIGJ5dGVzIGluY2x1ZGluZyBoZHIgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzZHRfcGh5c2ljYWxfYWRkcmVzczsgIC8qIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIFhTRFQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkX2NoZWNrc3VtOyAgICAgIC8qIENoZWNrc3VtIG9mIGVudGlyZSB0YWJsZSAqLwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgWzNdOyAgICAgICAgICAgLyogUmVzZXJ2ZWQgZmllbGQgbXVzdCBiZSAwICovCitzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yIHsJLyogUm9vdCBTeXN0ZW0gRGVzY3JpcHRvciBQb2ludGVyICovCisJY2hhciBzaWduYXR1cmVbOF07CS8qIEFDUEkgc2lnbmF0dXJlLCBjb250YWlucyAiUlNEIFBUUiAiICovCisJdTggY2hlY2tzdW07CQkvKiBBQ1BJIDEuMCBjaGVja3N1bSAqLworCWNoYXIgb2VtX2lkWzZdOwkJLyogT0VNIGlkZW50aWZpY2F0aW9uICovCisJdTggcmV2aXNpb247CQkvKiBNdXN0IGJlICgwKSBmb3IgQUNQSSAxLjAgb3IgKDIpIGZvciBBQ1BJIDIuMCsgKi8KKwl1MzIgcnNkdF9waHlzaWNhbF9hZGRyZXNzOwkvKiAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgUlNEVCAqLworCXUzMiBsZW5ndGg7CQkvKiBYU0RUIExlbmd0aCBpbiBieXRlcywgaW5jbHVkaW5nIGhlYWRlciAqLworCXU2NCB4c2R0X3BoeXNpY2FsX2FkZHJlc3M7CS8qIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBYU0RUICovCisJdTggZXh0ZW5kZWRfY2hlY2tzdW07CS8qIENoZWNrc3VtIG9mIGVudGlyZSB0YWJsZSAoQUNQSSAyLjApICovCisJY2hhciByZXNlcnZlZFszXTsJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9jb21tb25fZmFjcyAgICAgICAgICAvKiBDb21tb24gRkFDUyBmb3IgaW50ZXJuYWwgdXNlICovCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZ2xvYmFsX2xvY2s7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcl93aWR0aDsKK3N0cnVjdCBhY3BpX2NvbW1vbl9mYWNzIHsJLyogQ29tbW9uIEZBQ1MgZm9yIGludGVybmFsIHVzZSAqLworCXUzMiAqZ2xvYmFsX2xvY2s7CisJdTY0ICpmaXJtd2FyZV93YWtpbmdfdmVjdG9yOworCXU4IHZlY3Rvcl93aWR0aDsKIH07CiAKLQogI2RlZmluZSBBQ1BJX1RBQkxFX0hFQURFUl9ERUYgICAvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8gXAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlIFs0XTsgICAgICAgICAgLyogQUNQSSBzaWduYXR1cmUgKDQgQVNDSUkgY2hhcmFjdGVycykgKi9cCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGFibGUsIGluIGJ5dGVzLCBpbmNsdWRpbmcgaGVhZGVyICovXAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlWzRdOyAgICAgICAgICAgLyogQVNDSUkgdGFibGUgc2lnbmF0dXJlICovXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHRhYmxlIGluIGJ5dGVzLCBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgKi9cCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbjsgICAgICAgICAgICAgICAvKiBBQ1BJIFNwZWNpZmljYXRpb24gbWlub3IgdmVyc2lvbiAjICovXAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW07ICAgICAgICAgICAgICAgLyogVG8gbWFrZSBzdW0gb2YgZW50aXJlIHRhYmxlID09IDAgKi9cCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZW1faWQgWzZdOyAgICAgICAgICAgICAvKiBPRU0gaWRlbnRpZmljYXRpb24gKi9cCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZW1fdGFibGVfaWQgWzhdOyAgICAgICAvKiBPRU0gdGFibGUgaWRlbnRpZmljYXRpb24gKi9cCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZW1faWRbNl07ICAgICAgICAgICAgICAvKiBBU0NJSSBPRU0gaWRlbnRpZmljYXRpb24gKi9cCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZW1fdGFibGVfaWRbOF07ICAgICAgICAvKiBBU0NJSSBPRU0gdGFibGUgaWRlbnRpZmljYXRpb24gKi9cCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZW1fcmV2aXNpb247ICAgICAgICAgICAvKiBPRU0gcmV2aXNpb24gbnVtYmVyICovXAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNsX2NvbXBpbGVyX2lkIFs0XTsgICAgLyogQVNMIGNvbXBpbGVyIHZlbmRvciBJRCAqL1wKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbF9jb21waWxlcl9yZXZpc2lvbjsgIC8qIEFTTCBjb21waWxlciByZXZpc2lvbiBudW1iZXIgKi8KKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbF9jb21waWxlcl9pZCBbNF07ICAgIC8qIEFTQ0lJIEFTTCBjb21waWxlciB2ZW5kb3IgSUQgKi9cCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2xfY29tcGlsZXJfcmV2aXNpb247CS8qIEFTTCBjb21waWxlciB2ZXJzaW9uICovCiAKLQotc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAgLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCi17Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGCi19OwotCitzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgewkvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KK0FDUElfVEFCTEVfSEVBREVSX0RFRn07CiAKIC8qCiAgKiBNQURUIHZhbHVlcyBhbmQgc3RydWN0dXJlcwpAQCAtMTM1LDEyICsxMjMsMTUgQEAKIAogLyogTWFzdGVyIE1BRFQgKi8KIAotc3RydWN0IG11bHRpcGxlX2FwaWNfdGFibGUKLXsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2FwaWNfYWRkcmVzczsgICAgIC8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgbG9jYWwgQVBJQyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENBVGNvbXBhdCAgICAgIDogMTsgICAgLyogQSBvbmUgaW5kaWNhdGVzIHN5c3RlbSBhbHNvIGhhcyBkdWFsIDgyNTlzICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDEgICAgICAgOiAzMTsKK3N0cnVjdCBtdWx0aXBsZV9hcGljX3RhYmxlIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYJLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCisJdTMyIGxvY2FsX2FwaWNfYWRkcmVzczsJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBsb2NhbCBBUElDICovCisKKwkvKiBGbGFncyAoMzIgYml0cykgKi8KKworCXU4IFBDQVRjb21wYXQ6MTsJLyogMDA6ICAgIFN5c3RlbSBhbHNvIGhhcyBkdWFsIDgyNTlzICovCisJIHU4Ojc7CQkJLyogMDEtMDc6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1OCByZXNlcnZlZDFbM107CS8qIDA4LTMxOiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCiB9OwogCiAvKiBWYWx1ZXMgZm9yIFR5cGUgaW4gQVBJQ19IRUFERVJfREVGICovCkBAIC0xNTQsNyArMTQ1LDcgQEAKICNkZWZpbmUgQVBJQ19JT19TQVBJQyAgICAgICAgICAgNgogI2RlZmluZSBBUElDX0xPQ0FMX1NBUElDICAgICAgICA3CiAjZGVmaW5lIEFQSUNfWFJVUFRfU09VUkNFICAgICAgIDgKLSNkZWZpbmUgQVBJQ19SRVNFUlZFRCAgICAgICAgICAgOSAgICAgICAgICAgLyogOSBhbmQgZ3JlYXRlciBhcmUgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQVBJQ19SRVNFUlZFRCAgICAgICAgICAgOQkvKiA5IGFuZCBncmVhdGVyIGFyZSByZXNlcnZlZCAqLwogCiAvKgogICogTUFEVCBzdWItc3RydWN0dXJlcyAoRm9sbG93IE1VTFRJUExFX0FQSUNfREVTQ1JJUFRJT05fVEFCTEUpCkBAIC0xNjMsMTAgKzE1NCw4IEBACiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOyBcCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CiAKLXN0cnVjdCBhcGljX2hlYWRlcgotewotCUFQSUNfSEVBREVSX0RFRgotfTsKK3N0cnVjdCBhcGljX2hlYWRlciB7CitBUElDX0hFQURFUl9ERUZ9OwogCiAvKiBWYWx1ZXMgZm9yIE1QUyBJTlRJIGZsYWdzICovCiAKQEAgLTE4MCwxMTcgKzE2OSw5MCBAQAogI2RlZmluZSBUUklHR0VSX1JFU0VSVkVEICAgICAgICAyCiAjZGVmaW5lIFRSSUdHRVJfTEVWRUwgICAgICAgICAgIDMKIAotLyogQ29tbW9uIGZsYWcgZGVmaW5pdGlvbnMgKi8KKy8qIENvbW1vbiBmbGFnIGRlZmluaXRpb25zICgxNiBiaXRzIGVhY2gpICovCiAKICNkZWZpbmUgTVBTX0lOVElfRkxBR1MgXAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sYXJpdHkgICAgICAgIDogMjsgICAgLyogUG9sYXJpdHkgb2YgQVBJQyBJL08gaW5wdXQgc2lnbmFscyAqL1wKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJfbW9kZSAgICA6IDI7ICAgIC8qIFRyaWdnZXIgbW9kZSBvZiBBUElDIGlucHV0IHNpZ25hbHMgKi9cCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDEgICAgICAgOiAxMjsgICAvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xhcml0eSAgICAgICAgOiAyOyAgICAvKiAwMC0wMTogUG9sYXJpdHkgb2YgQVBJQyBJL08gaW5wdXQgc2lnbmFscyAqL1wKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJfbW9kZSAgICA6IDI7ICAgIC8qIDAyLTAzOiBUcmlnZ2VyIG1vZGUgb2YgQVBJQyBpbnB1dCBzaWduYWxzICovXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNDsgICAgLyogMDQtMDc6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi9cCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDE7CS8qIDA4LTE1OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCiAKICNkZWZpbmUgTE9DQUxfQVBJQ19GTEFHUyBcCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3JfZW5hYmxlZDogMTsgICAvKiBQcm9jZXNzb3IgaXMgdXNhYmxlIGlmIHNldCAqL1wKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMiAgICAgICA6IDMxOyAgIC8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Nvcl9lbmFibGVkOiAxOyAgIC8qIDAwOiAgICBQcm9jZXNzb3IgaXMgdXNhYmxlIGlmIHNldCAqL1wKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDc7ICAgIC8qIDAxLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQyOwkvKiAwOC0xNTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogCiAvKiBTdWItc3RydWN0dXJlcyBmb3IgTUFEVCAqLwogCi1zdHJ1Y3QgbWFkdF9wcm9jZXNzb3JfYXBpYwotewotCUFQSUNfSEVBREVSX0RFRgotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yX2lkOyAgICAgICAgICAgLyogQUNQSSBwcm9jZXNzb3IgaWQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2FwaWNfaWQ7ICAgICAgICAgIC8qIFByb2Nlc3NvcidzIGxvY2FsIEFQSUMgaWQgKi8KLQlMT0NBTF9BUElDX0ZMQUdTCitzdHJ1Y3QgbWFkdF9wcm9jZXNzb3JfYXBpYyB7CisJQVBJQ19IRUFERVJfREVGIHU4IHByb2Nlc3Nvcl9pZDsJLyogQUNQSSBwcm9jZXNzb3IgaWQgKi8KKwl1OCBsb2NhbF9hcGljX2lkOwkvKiBQcm9jZXNzb3IncyBsb2NhbCBBUElDIGlkICovCisgTE9DQUxfQVBJQ19GTEFHU307CisKK3N0cnVjdCBtYWR0X2lvX2FwaWMgeworCUFQSUNfSEVBREVSX0RFRiB1OCBpb19hcGljX2lkOwkvKiBJL08gQVBJQyBJRCAqLworCXU4IHJlc2VydmVkOwkJLyogUmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKwl1MzIgYWRkcmVzczsJCS8qIEFQSUMgcGh5c2ljYWwgYWRkcmVzcyAqLworCXUzMiBpbnRlcnJ1cHQ7CQkvKiBHbG9iYWwgc3lzdGVtIGludGVycnVwdCB3aGVyZSBJTlRJCisJCQkJICogbGluZXMgc3RhcnQgKi8KIH07CiAKLXN0cnVjdCBtYWR0X2lvX2FwaWMKLXsKLQlBUElDX0hFQURFUl9ERUYKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvX2FwaWNfaWQ7ICAgICAgICAgICAgIC8qIEkvTyBBUElDIElEICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsgICAgICAgICAgICAgICAvKiBSZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczsgICAgICAgICAgICAgICAgLyogQVBJQyBwaHlzaWNhbCBhZGRyZXNzICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQ7ICAgICAgICAgICAgICAvKiBHbG9iYWwgc3lzdGVtIGludGVycnVwdCB3aGVyZSBJTlRJCi0JCQkgICogbGluZXMgc3RhcnQgKi8KK3N0cnVjdCBtYWR0X2ludGVycnVwdF9vdmVycmlkZSB7CisJQVBJQ19IRUFERVJfREVGIHU4IGJ1czsJLyogMCAtIElTQSAqLworCXU4IHNvdXJjZTsJCS8qIEludGVycnVwdCBzb3VyY2UgKElSUSkgKi8KKwl1MzIgaW50ZXJydXB0OwkJLyogR2xvYmFsIHN5c3RlbSBpbnRlcnJ1cHQgKi8KKyBNUFNfSU5USV9GTEFHU307CisKK3N0cnVjdCBtYWR0X25taV9zb3VyY2UgeworCUFQSUNfSEVBREVSX0RFRiBNUFNfSU5USV9GTEFHUyB1MzIgaW50ZXJydXB0OwkvKiBHbG9iYWwgc3lzdGVtIGludGVycnVwdCAqLwogfTsKIAotc3RydWN0IG1hZHRfaW50ZXJydXB0X292ZXJyaWRlCi17Ci0JQVBJQ19IRUFERVJfREVGCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXM7ICAgICAgICAgICAgICAgICAgICAvKiAwIC0gSVNBICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U7ICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHQgc291cmNlIChJUlEpICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQ7ICAgICAgICAgICAgICAvKiBHbG9iYWwgc3lzdGVtIGludGVycnVwdCAqLwotCU1QU19JTlRJX0ZMQUdTCitzdHJ1Y3QgbWFkdF9sb2NhbF9hcGljX25taSB7CisJQVBJQ19IRUFERVJfREVGIHU4IHByb2Nlc3Nvcl9pZDsJLyogQUNQSSBwcm9jZXNzb3IgaWQgKi8KKwlNUFNfSU5USV9GTEFHUyB1OCBsaW50OwkvKiBMSU5UbiB0byB3aGljaCBOTUkgaXMgY29ubmVjdGVkICovCiB9OwogCi1zdHJ1Y3QgbWFkdF9ubWlfc291cmNlCi17Ci0JQVBJQ19IRUFERVJfREVGCi0JTVBTX0lOVElfRkxBR1MKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdDsgICAgICAgICAgICAgIC8qIEdsb2JhbCBzeXN0ZW0gaW50ZXJydXB0ICovCitzdHJ1Y3QgbWFkdF9hZGRyZXNzX292ZXJyaWRlIHsKKwlBUElDX0hFQURFUl9ERUYgdTE2IHJlc2VydmVkOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTY0IGFkZHJlc3M7CQkvKiBBUElDIHBoeXNpY2FsIGFkZHJlc3MgKi8KIH07CiAKLXN0cnVjdCBtYWR0X2xvY2FsX2FwaWNfbm1pCi17Ci0JQVBJQ19IRUFERVJfREVGCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3JfaWQ7ICAgICAgICAgICAvKiBBQ1BJIHByb2Nlc3NvciBpZCAqLwotCU1QU19JTlRJX0ZMQUdTCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW50OyAgICAgICAgICAgICAgICAgICAvKiBMSU5UbiB0byB3aGljaCBOTUkgaXMgY29ubmVjdGVkICovCitzdHJ1Y3QgbWFkdF9pb19zYXBpYyB7CisJQVBJQ19IRUFERVJfREVGIHU4IGlvX3NhcGljX2lkOwkvKiBJL08gU0FQSUMgSUQgKi8KKwl1OCByZXNlcnZlZDsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1MzIgaW50ZXJydXB0X2Jhc2U7CS8qIEdsb2NhbCBpbnRlcnJ1cHQgZm9yIFNBUElDIHN0YXJ0ICovCisJdTY0IGFkZHJlc3M7CQkvKiBTQVBJQyBwaHlzaWNhbCBhZGRyZXNzICovCiB9OwogCi1zdHJ1Y3QgbWFkdF9hZGRyZXNzX292ZXJyaWRlCi17Ci0JQVBJQ19IRUFERVJfREVGCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsgICAgICAgICAgICAgICAvKiBSZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczsgICAgICAgICAgICAgICAgLyogQVBJQyBwaHlzaWNhbCBhZGRyZXNzICovCitzdHJ1Y3QgbWFkdF9sb2NhbF9zYXBpYyB7CisJQVBJQ19IRUFERVJfREVGIHU4IHByb2Nlc3Nvcl9pZDsJLyogQUNQSSBwcm9jZXNzb3IgaWQgKi8KKwl1OCBsb2NhbF9zYXBpY19pZDsJLyogU0FQSUMgSUQgKi8KKwl1OCBsb2NhbF9zYXBpY19laWQ7CS8qIFNBUElDIEVJRCAqLworCXU4IHJlc2VydmVkWzNdOwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCSBMT0NBTF9BUElDX0ZMQUdTIHUzMiBwcm9jZXNzb3JfdUlEOwkvKiBOdW1lcmljIFVJRCAtIEFDUEkgMy4wICovCisJY2hhciBwcm9jZXNzb3JfdUlEc3RyaW5nWzFdOwkvKiBTdHJpbmcgVUlEICAtIEFDUEkgMy4wICovCiB9OwogCi1zdHJ1Y3QgbWFkdF9pb19zYXBpYwotewotCUFQSUNfSEVBREVSX0RFRgotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9fc2FwaWNfaWQ7ICAgICAgICAgICAgLyogSS9PIFNBUElDIElEICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsgICAgICAgICAgICAgICAvKiBSZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0X2Jhc2U7ICAgICAgICAgLyogR2xvY2FsIGludGVycnVwdCBmb3IgU0FQSUMgc3RhcnQgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M7ICAgICAgICAgICAgICAgIC8qIFNBUElDIHBoeXNpY2FsIGFkZHJlc3MgKi8KK3N0cnVjdCBtYWR0X2ludGVycnVwdF9zb3VyY2UgeworCUFQSUNfSEVBREVSX0RFRiBNUFNfSU5USV9GTEFHUyB1OCBpbnRlcnJ1cHRfdHlwZTsJLyogMT1QTUksIDI9SU5JVCwgMz1jb3JyZWN0ZWQgKi8KKwl1OCBwcm9jZXNzb3JfaWQ7CS8qIFByb2Nlc3NvciBJRCAqLworCXU4IHByb2Nlc3Nvcl9laWQ7CS8qIFByb2Nlc3NvciBFSUQgKi8KKwl1OCBpb19zYXBpY192ZWN0b3I7CS8qIFZlY3RvciB2YWx1ZSBmb3IgUE1JIGludGVycnVwdHMgKi8KKwl1MzIgaW50ZXJydXB0OwkJLyogR2xvYmFsIHN5c3RlbSBpbnRlcnJ1cHQgKi8KKwl1MzIgZmxhZ3M7CQkvKiBJbnRlcnJ1cHQgU291cmNlIEZsYWdzICovCiB9OwogCi1zdHJ1Y3QgbWFkdF9sb2NhbF9zYXBpYwotewotCUFQSUNfSEVBREVSX0RFRgotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yX2lkOyAgICAgICAgICAgLyogQUNQSSBwcm9jZXNzb3IgaWQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3NhcGljX2lkOyAgICAgICAgIC8qIFNBUElDIElEICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9zYXBpY19laWQ7ICAgICAgICAvKiBTQVBJQyBFSUQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkIFszXTsgICAgICAgICAgIC8qIFJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCi0JTE9DQUxfQVBJQ19GTEFHUwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yX3VJRDsgICAgICAgICAgLyogTnVtZXJpYyBVSUQgLSBBQ1BJIDMuMCAqLwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yX3VJRHN0cmluZ1sxXTsgLyogU3RyaW5nIFVJRCAgLSBBQ1BJIDMuMCAqLwotfTsKLQotc3RydWN0IG1hZHRfaW50ZXJydXB0X3NvdXJjZQotewotCUFQSUNfSEVBREVSX0RFRgotCU1QU19JTlRJX0ZMQUdTCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfdHlwZTsgICAgICAgICAvKiAxPVBNSSwgMj1JTklULCAzPWNvcnJlY3RlZCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yX2lkOyAgICAgICAgICAgLyogUHJvY2Vzc29yIElEICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3JfZWlkOyAgICAgICAgICAvKiBQcm9jZXNzb3IgRUlEICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19zYXBpY192ZWN0b3I7ICAgICAgICAvKiBWZWN0b3IgdmFsdWUgZm9yIFBNSSBpbnRlcnJ1cHRzICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQ7ICAgICAgICAgICAgICAvKiBHbG9iYWwgc3lzdGVtIGludGVycnVwdCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyogSW50ZXJydXB0IFNvdXJjZSBGbGFncyAqLwotfTsKLQotCiAvKgogICogU21hcnQgQmF0dGVyeQogICovCi1zdHJ1Y3Qgc21hcnRfYmF0dGVyeV90YWJsZQotewotCUFDUElfVEFCTEVfSEVBREVSX0RFRgotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ19sZXZlbDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd19sZXZlbDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRpY2FsX2xldmVsOworc3RydWN0IHNtYXJ0X2JhdHRlcnlfdGFibGUgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1MzIgd2FybmluZ19sZXZlbDsKKwl1MzIgbG93X2xldmVsOworCXUzMiBjcml0aWNhbF9sZXZlbDsKIH07CiAKLQogI3ByYWdtYSBwYWNrKCkKIAotCiAvKgogICogQUNQSSBUYWJsZSBpbmZvcm1hdGlvbi4gIFdlIHNhdmUgdGhlIHRhYmxlIGFkZHJlc3MsIGxlbmd0aCwKICAqIGFuZCB0eXBlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIChtYXBwZWQgb3IgYWxsb2NhdGVkKSBmb3IgZWFjaApAQCAtMzE0LDM5ICsyNzYsMzUgQEAKIAogLyogRGF0YSBhYm91dCBlYWNoIGtub3duIHRhYmxlIHR5cGUgKi8KIAotc3RydWN0IGFjcGlfdGFibGVfc3VwcG9ydAotewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2lnbmF0dXJlOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipnbG9iYWxfcHRyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnX2xlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOworc3RydWN0IGFjcGlfdGFibGVfc3VwcG9ydCB7CisJY2hhciAqbmFtZTsKKwljaGFyICpzaWduYXR1cmU7CisJdm9pZCAqKmdsb2JhbF9wdHI7CisJdTggc2lnX2xlbmd0aDsKKwl1OCBmbGFnczsKIH07CiAKLQogLyoKICAqIEdldCB0aGUgQUNQSSB2ZXJzaW9uLXNwZWNpZmljIHRhYmxlcwogICovCi0jaW5jbHVkZSAiYWN0YmwxLmgiICAgLyogQWNwaSAxLjAgdGFibGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJhY3RibDIuaCIgICAvKiBBY3BpIDIuMCB0YWJsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImFjdGJsMS5oIgkJLyogQWNwaSAxLjAgdGFibGUgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJhY3RibDIuaCIJCS8qIEFjcGkgMi4wIHRhYmxlIGRlZmluaXRpb25zICovCiAKLWV4dGVybiB1OCBhY3BpX2ZhZHRfaXNfdjE7IC8qIGlzIHNldCB0byAxIGlmIEZBRFQgaXMgcmV2aXNpb24gMSwKLQkJCSAgICAqIG5lZWRlZCBmb3IgY2VydGFpbiB3b3JrYXJvdW5kcyAqLworZXh0ZXJuIHU4IGFjcGlfZmFkdF9pc192MTsJLyogaXMgc2V0IHRvIDEgaWYgRkFEVCBpcyByZXZpc2lvbiAxLAorCQkJCSAqIG5lZWRlZCBmb3IgY2VydGFpbiB3b3JrYXJvdW5kcyAqLwogCiAjcHJhZ21hIHBhY2soMSkKIC8qCiAgKiBIaWdoIHBlcmZvcm1hbmNlIHRpbWVyCiAgKi8KLXN0cnVjdCBocGV0X3RhYmxlCi17Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZV9pZDsKLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgIGJhc2VfYWRkcmVzczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwZXRfbnVtYmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tfdGljazsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM7CitzdHJ1Y3QgaHBldF90YWJsZSB7CisJQUNQSV9UQUJMRV9IRUFERVJfREVGIHUzMiBoYXJkd2FyZV9pZDsKKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgYmFzZV9hZGRyZXNzOworCXU4IGhwZXRfbnVtYmVyOworCXUxNiBjbG9ja190aWNrOworCXU4IGF0dHJpYnV0ZXM7CiB9OwogCiAjcHJhZ21hIHBhY2soKQogCi0jZW5kaWYgLyogX19BQ1RCTF9IX18gKi8KKyNlbmRpZgkJCQkvKiBfX0FDVEJMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsMS5oIGIvaW5jbHVkZS9hY3BpL2FjdGJsMS5oCmluZGV4IDMzZGU1ZjQuLjY3MzEyYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3RibDEuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0YmwxLmgKQEAgLTQ5LDg4ICs0OSw4NyBAQAogLyoKICAqIEFDUEkgMS4wIFJvb3QgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlIChSU0RUKQogICovCi1zdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yX3JldjEKLXsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX29mZnNldF9lbnRyeSBbMV07IC8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIG90aGVyICovCi0JCQkgLyogQUNQSSB0YWJsZXMgKi8KK3N0cnVjdCByc2R0X2Rlc2NyaXB0b3JfcmV2MSB7CisJQUNQSV9UQUJMRV9IRUFERVJfREVGCS8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLworCXUzMiB0YWJsZV9vZmZzZXRfZW50cnlbMV07CS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIEFDUEkgdGFibGVzICovCiB9OwogCi0KIC8qCiAgKiBBQ1BJIDEuMCBGaXJtd2FyZSBBQ1BJIENvbnRyb2wgU3RydWN0dXJlIChGQUNTKQogICovCi1zdHJ1Y3QgZmFjc19kZXNjcmlwdG9yX3JldjEKLXsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVs0XTsgICAgICAgICAgIC8qIEFDUEkgU2lnbmF0dXJlICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2Ygc3RydWN0dXJlLCBpbiBieXRlcyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVfc2lnbmF0dXJlOyAgICAgLyogSGFyZHdhcmUgY29uZmlndXJhdGlvbiBzaWduYXR1cmUgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcm13YXJlX3dha2luZ192ZWN0b3I7IC8qIEFDUEkgT1Mgd2FraW5nIHZlY3RvciAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX2xvY2s7ICAgICAgICAgICAgLyogR2xvYmFsIExvY2sgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM0Ymlvc19mICAgICAgICA6IDE7ICAgIC8qIEluZGljYXRlcyBpZiBTNEJJT1Mgc3VwcG9ydCBpcyBwcmVzZW50ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDEgICAgICAgOiAzMTsgICAvKiBNdXN0IGJlIDAgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3ZlcnZlZDMgWzQwXTsgICAgICAgIC8qIFJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCi19Oworc3RydWN0IGZhY3NfZGVzY3JpcHRvcl9yZXYxIHsKKwljaGFyIHNpZ25hdHVyZVs0XTsJLyogQVNDSUkgdGFibGUgc2lnbmF0dXJlICovCisJdTMyIGxlbmd0aDsJCS8qIExlbmd0aCBvZiBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKwl1MzIgaGFyZHdhcmVfc2lnbmF0dXJlOwkvKiBIYXJkd2FyZSBjb25maWd1cmF0aW9uIHNpZ25hdHVyZSAqLworCXUzMiBmaXJtd2FyZV93YWtpbmdfdmVjdG9yOwkvKiBBQ1BJIE9TIHdha2luZyB2ZWN0b3IgKi8KKwl1MzIgZ2xvYmFsX2xvY2s7CS8qIEdsb2JhbCBMb2NrICovCiAKKwkvKiBGbGFncyAoMzIgYml0cykgKi8KKworCXU4IFM0Ymlvc19mOjE7CQkvKiAwMDogICAgUzRCSU9TIHN1cHBvcnQgaXMgcHJlc2VudCAqLworCSB1ODo3OwkJCS8qIDAxLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTggcmVzZXJ2ZWQxWzNdOwkvKiAwOC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCisJdTggcmVzZXJ2ZWQyWzQwXTsJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworfTsKIAogLyoKICAqIEFDUEkgMS4wIEZpeGVkIEFDUEkgRGVzY3JpcHRpb24gVGFibGUgKEZBRFQpCiAgKi8KLXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MQotewotCUFDUElfVEFCTEVfSEVBREVSX0RFRiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlybXdhcmVfY3RybDsgICAgICAgICAgLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBGQUNTICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2R0OyAgICAgICAgICAgICAgICAgICAvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsOyAgICAgICAgICAgICAgICAgIC8qIFN5c3RlbSBJbnRlcnJ1cHQgTW9kZWwgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIFJlc2VydmVkICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfaW50OyAgICAgICAgICAgICAgICAvKiBTeXN0ZW0gdmVjdG9yIG9mIFNDSSBpbnRlcnJ1cHQgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtaV9jbWQ7ICAgICAgICAgICAgICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBTTUkgY29tbWFuZCBwb3J0ICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2VuYWJsZTsgICAgICAgICAgICAvKiBWYWx1ZSB0byB3cml0ZSB0byBzbWlfY21kIHRvIGVuYWJsZSBBQ1BJICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2Rpc2FibGU7ICAgICAgICAgICAvKiBWYWx1ZSB0byB3cml0ZSB0byBzbWlfY21kIHRvIGRpc2FibGUgQUNQSSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUzRiaW9zX3JlcTsgICAgICAgICAgICAgLyogVmFsdWUgdG8gd3JpdGUgdG8gU01JIENNRCB0byBlbnRlciBTNEJJT1Mgc3RhdGUgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsgICAgICAgICAgICAgIC8qIFJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTFhX2V2dF9ibGs7ICAgICAgICAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIGFjcGlfZXZlbnQgUmVnIEJsayAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0xYl9ldnRfYmxrOyAgICAgICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBhY3BpX2V2ZW50IFJlZyBCbGsgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMWFfY250X2JsazsgICAgICAgICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTFiX2NudF9ibGs7ICAgICAgICAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX2NudF9ibGs7ICAgICAgICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1fdG1yX2JsazsgICAgICAgICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZTBfYmxrOyAgICAgICAgICAgICAgIC8qIFBvcnQgYWRkciBvZiBHZW5lcmFsIFB1cnBvc2UgYWNwaV9ldmVudCAwIFJlZyBCbGsgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZTFfYmxrOyAgICAgICAgICAgICAgIC8qIFBvcnQgYWRkciBvZiBHZW5lcmFsIFB1cnBvc2UgYWNwaV9ldmVudCAxIFJlZyBCbGsgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMV9ldnRfbGVuOyAgICAgICAgICAgIC8qIEJ5dGUgbGVuZ3RoIG9mIHBvcnRzIGF0IHBtMV94X2V2dF9ibGsgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMV9jbnRfbGVuOyAgICAgICAgICAgIC8qIEJ5dGUgbGVuZ3RoIG9mIHBvcnRzIGF0IHBtMV94X2NudF9ibGsgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9jbnRfbGVuOyAgICAgICAgICAgIC8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMl9jbnRfYmxrICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbV90bV9sZW47ICAgICAgICAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbV90bV9ibGsgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZTBfYmxrX2xlbjsgICAgICAgICAgIC8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTBfYmxrICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGUxX2Jsa19sZW47ICAgICAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUxX2JsayAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlMV9iYXNlOyAgICAgICAgICAgICAgLyogT2Zmc2V0IGluIGdwZSBtb2RlbCB3aGVyZSBncGUxIGV2ZW50cyBzdGFydCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQzOyAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdmwyX2xhdDsgICAgICAgICAgICAgIC8qIFdvcnN0IGNhc2UgSFcgbGF0ZW5jeSB0byBlbnRlci9leGl0IEMyIHN0YXRlICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHZsM19sYXQ7ICAgICAgICAgICAgICAvKiBXb3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMyBzdGF0ZSAqLwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hfc2l6ZTsgICAgICAgICAgICAgLyogU2l6ZSBvZiBhcmVhIHJlYWQgdG8gZmx1c2ggY2FjaGVzICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaF9zdHJpZGU7ICAgICAgICAgICAvKiBTdHJpZGUgdXNlZCBpbiBmbHVzaGluZyBjYWNoZXMgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1dHlfb2Zmc2V0OyAgICAgICAgICAgIC8qIEJpdCBsb2NhdGlvbiBvZiBkdXR5IGN5Y2xlIGZpZWxkIGluIHBfY250IHJlZyAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHV0eV93aWR0aDsgICAgICAgICAgICAgLyogQml0IHdpZHRoIG9mIGR1dHkgY3ljbGUgZmllbGQgaW4gcF9jbnQgcmVnICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXlfYWxybTsgICAgICAgICAgICAgICAvKiBJbmRleCB0byBkYXktb2YtbW9udGggYWxhcm0gaW4gUlRDIENNT1MgUkFNICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25fYWxybTsgICAgICAgICAgICAgICAvKiBJbmRleCB0byBtb250aC1vZi15ZWFyIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudHVyeTsgICAgICAgICAgICAgICAgLyogSW5kZXggdG8gY2VudHVyeSBpbiBSVEMgQ01PUyBSQU0gKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkNDsgICAgICAgICAgICAgIC8qIFJlc2VydmVkICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDRhOyAgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ0YjsgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiX2ludmQgICAgICAgICA6IDE7ICAgIC8qIFRoZSB3YmludmQgaW5zdHJ1Y3Rpb24gd29ya3MgcHJvcGVybHkgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiX2ludmRfZmx1c2ggICA6IDE7ICAgIC8qIFRoZSB3YmludmQgZmx1c2hlcyBidXQgZG9lcyBub3QgaW52YWxpZGF0ZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19jMSAgICAgICAgIDogMTsgICAgLyogQWxsIHByb2Nlc3NvcnMgc3VwcG9ydCBDMSBzdGF0ZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx2bDJfdXAgICAgICAgIDogMTsgICAgLyogQzIgc3RhdGUgd29ya3Mgb24gTVAgc3lzdGVtICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd3JfYnV0dG9uICAgICAgOiAxOyAgICAvKiBQb3dlciBidXR0b24gaXMgaGFuZGxlZCBhcyBhIGdlbmVyaWMgZmVhdHVyZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBfYnV0dG9uICAgIDogMTsgICAgLyogU2xlZXAgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUsIG9yIG5vdCBwcmVzZW50ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9yVEMgICAgICAgOiAxOyAgICAvKiBSVEMgd2FrZXVwIHN0YXQgbm90IGluIGZpeGVkIHJlZ2lzdGVyIHNwYWNlICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydGNzNCAgICAgICAgICAgOiAxOyAgICAvKiBSVEMgd2FrZXVwIHN0YXQgbm90IHBvc3NpYmxlIGZyb20gUzQgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcl92YWxfZXh0ICAgICA6IDE7ICAgIC8qIFRoZSB0bXJfdmFsIHdpZHRoIGlzIDMyIGJpdHMgKDAgPSAyNCBiaXRzKSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ1ICAgICAgIDogMjM7ICAgLyogUmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KK3N0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MSB7CisJQUNQSV9UQUJMRV9IRUFERVJfREVGCS8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLworCXUzMiBmaXJtd2FyZV9jdHJsOwkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIEZBQ1MgKi8KKwl1MzIgZHNkdDsJCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgRFNEVCAqLworCXU4IG1vZGVsOwkJLyogU3lzdGVtIEludGVycnVwdCBNb2RlbCAqLworCXU4IHJlc2VydmVkMTsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1MTYgc2NpX2ludDsJCS8qIFN5c3RlbSB2ZWN0b3Igb2YgU0NJIGludGVycnVwdCAqLworCXUzMiBzbWlfY21kOwkJLyogUG9ydCBhZGRyZXNzIG9mIFNNSSBjb21tYW5kIHBvcnQgKi8KKwl1OCBhY3BpX2VuYWJsZTsJCS8qIFZhbHVlIHRvIHdyaXRlIHRvIHNtaV9jbWQgdG8gZW5hYmxlIEFDUEkgKi8KKwl1OCBhY3BpX2Rpc2FibGU7CS8qIFZhbHVlIHRvIHdyaXRlIHRvIHNtaV9jbWQgdG8gZGlzYWJsZSBBQ1BJICovCisJdTggUzRiaW9zX3JlcTsJCS8qIFZhbHVlIHRvIHdyaXRlIHRvIFNNSSBDTUQgdG8gZW50ZXIgUzRCSU9TIHN0YXRlICovCisJdTggcmVzZXJ2ZWQyOwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCXUzMiBwbTFhX2V2dF9ibGs7CS8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgYWNwaV9ldmVudCBSZWcgQmxrICovCisJdTMyIHBtMWJfZXZ0X2JsazsJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBhY3BpX2V2ZW50IFJlZyBCbGsgKi8KKwl1MzIgcG0xYV9jbnRfYmxrOwkvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIENvbnRyb2wgUmVnIEJsayAqLworCXUzMiBwbTFiX2NudF9ibGs7CS8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgQ29udHJvbCBSZWcgQmxrICovCisJdTMyIHBtMl9jbnRfYmxrOwkvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrICovCisJdTMyIHBtX3Rtcl9ibGs7CQkvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IFRpbWVyIEN0cmwgUmVnIEJsayAqLworCXUzMiBncGUwX2JsazsJCS8qIFBvcnQgYWRkciBvZiBHZW5lcmFsIFB1cnBvc2UgYWNwaV9ldmVudCAwIFJlZyBCbGsgKi8KKwl1MzIgZ3BlMV9ibGs7CQkvKiBQb3J0IGFkZHIgb2YgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMSBSZWcgQmxrICovCisJdTggcG0xX2V2dF9sZW47CQkvKiBCeXRlIGxlbmd0aCBvZiBwb3J0cyBhdCBwbTFfeF9ldnRfYmxrICovCisJdTggcG0xX2NudF9sZW47CQkvKiBCeXRlIGxlbmd0aCBvZiBwb3J0cyBhdCBwbTFfeF9jbnRfYmxrICovCisJdTggcG0yX2NudF9sZW47CQkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbTJfY250X2JsayAqLworCXU4IHBtX3RtX2xlbjsJCS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtX3RtX2JsayAqLworCXU4IGdwZTBfYmxrX2xlbjsJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgZ3BlMF9ibGsgKi8KKwl1OCBncGUxX2Jsa19sZW47CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTFfYmxrICovCisJdTggZ3BlMV9iYXNlOwkJLyogT2Zmc2V0IGluIGdwZSBtb2RlbCB3aGVyZSBncGUxIGV2ZW50cyBzdGFydCAqLworCXU4IHJlc2VydmVkMzsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1MTYgcGx2bDJfbGF0OwkJLyogV29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzIgc3RhdGUgKi8KKwl1MTYgcGx2bDNfbGF0OwkJLyogV29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzMgc3RhdGUgKi8KKwl1MTYgZmx1c2hfc2l6ZTsJCS8qIFNpemUgb2YgYXJlYSByZWFkIHRvIGZsdXNoIGNhY2hlcyAqLworCXUxNiBmbHVzaF9zdHJpZGU7CS8qIFN0cmlkZSB1c2VkIGluIGZsdXNoaW5nIGNhY2hlcyAqLworCXU4IGR1dHlfb2Zmc2V0OwkJLyogQml0IGxvY2F0aW9uIG9mIGR1dHkgY3ljbGUgZmllbGQgaW4gcF9jbnQgcmVnICovCisJdTggZHV0eV93aWR0aDsJCS8qIEJpdCB3aWR0aCBvZiBkdXR5IGN5Y2xlIGZpZWxkIGluIHBfY250IHJlZyAqLworCXU4IGRheV9hbHJtOwkJLyogSW5kZXggdG8gZGF5LW9mLW1vbnRoIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLworCXU4IG1vbl9hbHJtOwkJLyogSW5kZXggdG8gbW9udGgtb2YteWVhciBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8KKwl1OCBjZW50dXJ5OwkJLyogSW5kZXggdG8gY2VudHVyeSBpbiBSVEMgQ01PUyBSQU0gKi8KKwl1OCByZXNlcnZlZDRbM107CS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKworCS8qIEZsYWdzICgzMiBiaXRzKSAqLworCisJdTggd2JfaW52ZDoxOwkJLyogMDA6ICAgIFRoZSB3YmludmQgaW5zdHJ1Y3Rpb24gd29ya3MgcHJvcGVybHkgKi8KKwl1OCB3Yl9pbnZkX2ZsdXNoOjE7CS8qIDAxOiAgICBUaGUgd2JpbnZkIGZsdXNoZXMgYnV0IGRvZXMgbm90IGludmFsaWRhdGUgKi8KKwl1OCBwcm9jX2MxOjE7CQkvKiAwMjogICAgQWxsIHByb2Nlc3NvcnMgc3VwcG9ydCBDMSBzdGF0ZSAqLworCXU4IHBsdmwyX3VwOjE7CQkvKiAwMzogICAgQzIgc3RhdGUgd29ya3Mgb24gTVAgc3lzdGVtICovCisJdTggcHdyX2J1dHRvbjoxOwkvKiAwNDogICAgUG93ZXIgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUgKi8KKwl1OCBzbGVlcF9idXR0b246MTsJLyogMDU6ICAgIFNsZWVwIGJ1dHRvbiBpcyBoYW5kbGVkIGFzIGEgZ2VuZXJpYyBmZWF0dXJlLCBvciBub3QgcHJlc2VudCAqLworCXU4IGZpeGVkX3JUQzoxOwkJLyogMDY6ICAgIFJUQyB3YWtldXAgc3RhdCBub3QgaW4gZml4ZWQgcmVnaXN0ZXIgc3BhY2UgKi8KKwl1OCBydGNzNDoxOwkJLyogMDc6ICAgIFJUQyB3YWtldXAgc3RhdCBub3QgcG9zc2libGUgZnJvbSBTNCAqLworCXU4IHRtcl92YWxfZXh0OjE7CS8qIDA4OiAgICB0bXJfdmFsIHdpZHRoIGlzIDMyIGJpdHMgKDAgPSAyNCBiaXRzKSAqLworCSB1ODo3OwkJCS8qIDA5LTE1OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTggcmVzZXJ2ZWQ1WzJdOwkvKiAxNi0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogfTsKIAogI3ByYWdtYSBwYWNrKCkKIAotI2VuZGlmIC8qIF9fQUNUQkwxX0hfXyAqLwotCi0KKyNlbmRpZgkJCQkvKiBfX0FDVEJMMV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibDIuaCBiL2luY2x1ZGUvYWNwaS9hY3RibDIuaAppbmRleCBlMTcyOWM5Li41MDMwNWNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YmwyLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGJsMi5oCkBAIC02NCw2MiArNjQsNTYgQEAKICNkZWZpbmUgRkFEVDJfUkVWSVNJT05fSUQgICAgICAgICAgICAgICAzCiAjZGVmaW5lIEZBRFQyX01JTlVTX1JFVklTSU9OX0lEICAgICAgICAgMgogCi0KICNwcmFnbWEgcGFjaygxKQogCiAvKgogICogQUNQSSAyLjAgUm9vdCBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKFJTRFQpCiAgKi8KLXN0cnVjdCByc2R0X2Rlc2NyaXB0b3JfcmV2MgotewotCUFDUElfVEFCTEVfSEVBREVSX0RFRiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfb2Zmc2V0X2VudHJ5IFsxXTsgLyogQXJyYXkgb2YgcG9pbnRlcnMgdG8gICovCi0JCQkgLyogQUNQSSB0YWJsZSBoZWFkZXJzICovCitzdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yX3JldjIgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRgkvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KKwl1MzIgdGFibGVfb2Zmc2V0X2VudHJ5WzFdOwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBBQ1BJIHRhYmxlcyAqLwogfTsKIAotCiAvKgogICogQUNQSSAyLjAgRXh0ZW5kZWQgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlIChYU0RUKQogICovCi1zdHJ1Y3QgeHNkdF9kZXNjcmlwdG9yX3JldjIKLXsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX29mZnNldF9lbnRyeSBbMV07IC8qIEFycmF5IG9mIHBvaW50ZXJzIHRvICAqLwotCQkJIC8qIEFDUEkgdGFibGUgaGVhZGVycyAqLworc3RydWN0IHhzZHRfZGVzY3JpcHRvcl9yZXYyIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYJLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCisJdTY0IHRhYmxlX29mZnNldF9lbnRyeVsxXTsJLyogQXJyYXkgb2YgcG9pbnRlcnMgdG8gQUNQSSB0YWJsZXMgKi8KIH07CiAKLQogLyoKICAqIEFDUEkgMi4wIEZpcm13YXJlIEFDUEkgQ29udHJvbCBTdHJ1Y3R1cmUgKEZBQ1MpCiAgKi8KLXN0cnVjdCBmYWNzX2Rlc2NyaXB0b3JfcmV2MgotewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlWzRdOyAgICAgICAgICAgLyogQUNQSSBzaWduYXR1cmUgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBzdHJ1Y3R1cmUsIGluIGJ5dGVzICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZV9zaWduYXR1cmU7ICAgICAvKiBIYXJkd2FyZSBjb25maWd1cmF0aW9uIHNpZ25hdHVyZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsgLyogMzJiaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgRmlybXdhcmUgV2FraW5nIFZlY3Rvci4gKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9sb2NrOyAgICAgICAgICAgIC8qIEdsb2JhbCBMb2NrIHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHNoYXJlZCBoYXJkd2FyZSByZXNvdXJjZXMgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM0Ymlvc19mICAgICAgICA6IDE7ICAgIC8qIFM0Qmlvc19mIC0gSW5kaWNhdGVzIGlmIFM0QklPUyBzdXBwb3J0IGlzIHByZXNlbnQgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMSAgICAgICA6IDMxOyAgIC8qIE11c3QgYmUgMCAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGZpcm13YXJlX3dha2luZ192ZWN0b3I7IC8qIDY0Yml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIEZpcm13YXJlIFdha2luZyBWZWN0b3IuICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOyAgICAgICAgICAgICAgICAvKiBWZXJzaW9uIG9mIHRoaXMgdGFibGUgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMyBbMzFdOyAgICAgICAgIC8qIFJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCi19Oworc3RydWN0IGZhY3NfZGVzY3JpcHRvcl9yZXYyIHsKKwljaGFyIHNpZ25hdHVyZVs0XTsJLyogQVNDSUkgdGFibGUgc2lnbmF0dXJlICovCisJdTMyIGxlbmd0aDsJCS8qIExlbmd0aCBvZiBzdHJ1Y3R1cmUsIGluIGJ5dGVzICovCisJdTMyIGhhcmR3YXJlX3NpZ25hdHVyZTsJLyogSGFyZHdhcmUgY29uZmlndXJhdGlvbiBzaWduYXR1cmUgKi8KKwl1MzIgZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsJLyogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIEZpcm13YXJlIFdha2luZyBWZWN0b3IuICovCisJdTMyIGdsb2JhbF9sb2NrOwkvKiBHbG9iYWwgTG9jayB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byBzaGFyZWQgaGFyZHdhcmUgcmVzb3VyY2VzICovCiAKKwkvKiBGbGFncyAoMzIgYml0cykgKi8KKworCXU4IFM0Ymlvc19mOjE7CQkvKiAwMDogICAgUzRCSU9TIHN1cHBvcnQgaXMgcHJlc2VudCAqLworCSB1ODo3OwkJCS8qIDAxLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTggcmVzZXJ2ZWQxWzNdOwkvKiAwOC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCisJdTY0IHhmaXJtd2FyZV93YWtpbmdfdmVjdG9yOwkvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgRmlybXdhcmUgV2FraW5nIFZlY3Rvci4gKi8KKwl1OCB2ZXJzaW9uOwkJLyogVmVyc2lvbiBvZiB0aGlzIHRhYmxlICovCisJdTggcmVzZXJ2ZWQzWzMxXTsJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworfTsKIAogLyoKICAqIEFDUEkgMi4wKyBHZW5lcmljIEFkZHJlc3MgU3RydWN0dXJlIChHQVMpCiAgKi8KLXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19zcGFjZV9pZDsgICAgICAgLyogQWRkcmVzcyBzcGFjZSB3aGVyZSBzdHJ1Y3Qgb3IgcmVnaXN0ZXIgZXhpc3RzLiAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfYml0X3dpZHRoOyAgICAgLyogU2l6ZSBpbiBiaXRzIG9mIGdpdmVuIHJlZ2lzdGVyICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9iaXRfb2Zmc2V0OyAgICAvKiBCaXQgb2Zmc2V0IHdpdGhpbiB0aGUgcmVnaXN0ZXIgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc193aWR0aDsgICAgICAgICAgIC8qIE1pbmltdW0gQWNjZXNzIHNpemUgKEFDUEkgMy4wKSAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczsgICAgICAgICAgICAgICAgLyogNjQtYml0IGFkZHJlc3Mgb2Ygc3RydWN0IG9yIHJlZ2lzdGVyICovCitzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeworCXU4IGFkZHJlc3Nfc3BhY2VfaWQ7CS8qIEFkZHJlc3Mgc3BhY2Ugd2hlcmUgc3RydWN0IG9yIHJlZ2lzdGVyIGV4aXN0cy4gKi8KKwl1OCByZWdpc3Rlcl9iaXRfd2lkdGg7CS8qIFNpemUgaW4gYml0cyBvZiBnaXZlbiByZWdpc3RlciAqLworCXU4IHJlZ2lzdGVyX2JpdF9vZmZzZXQ7CS8qIEJpdCBvZmZzZXQgd2l0aGluIHRoZSByZWdpc3RlciAqLworCXU4IGFjY2Vzc193aWR0aDsJLyogTWluaW11bSBBY2Nlc3Mgc2l6ZSAoQUNQSSAzLjApICovCisJdTY0IGFkZHJlc3M7CQkvKiA2NC1iaXQgYWRkcmVzcyBvZiBzdHJ1Y3Qgb3IgcmVnaXN0ZXIgKi8KIH07CiAKLQogI2RlZmluZSBGQURUX1JFVjJfQ09NTU9OIFwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxX2Zpcm13YXJlX2N0cmw7ICAgLyogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLyBcCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV9kc2R0OyAgICAgICAgICAgIC8qIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8gXApAQCAtMTYxLDEyOSArMTU1LDEyMyBAQAogLyoKICAqIEFDUEkgMi4wKyBGaXhlZCBBQ1BJIERlc2NyaXB0aW9uIFRhYmxlIChGQURUKQogICovCi1zdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIKLXsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgICAgICAgICAgICAgICAgICAgICAgIC8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLwotCUZBRFRfUkVWMl9DT01NT04KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiX2ludmQgICAgIDogMTsgICAgLyogVGhlIHdiaW52ZCBpbnN0cnVjdGlvbiB3b3JrcyBwcm9wZXJseSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2JfaW52ZF9mbHVzaCA6IDE7ICAvKiBUaGUgd2JpbnZkIGZsdXNoZXMgYnV0IGRvZXMgbm90IGludmFsaWRhdGUgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfYzEgICAgIDogMTsgICAgLyogQWxsIHByb2Nlc3NvcnMgc3VwcG9ydCBDMSBzdGF0ZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx2bDJfdXAgICAgOiAxOyAgICAvKiBDMiBzdGF0ZSB3b3JrcyBvbiBNUCBzeXN0ZW0gKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3cl9idXR0b24gIDogMTsgICAgLyogUG93ZXIgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwX2J1dHRvbiA6IDE7ICAgLyogU2xlZXAgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUsIG9yIG5vdCBwcmVzZW50ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9yVEMgICA6IDE7ICAgIC8qIFJUQyB3YWtldXAgc3RhdCBub3QgaW4gZml4ZWQgcmVnaXN0ZXIgc3BhY2UgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0Y3M0ICAgICAgIDogMTsgICAgLyogUlRDIHdha2V1cCBzdGF0IG5vdCBwb3NzaWJsZSBmcm9tIFM0ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXJfdmFsX2V4dCA6IDE7ICAgIC8qIEluZGljYXRlcyB0bXJfdmFsIGlzIDMyIGJpdHMgMD0yNC1iaXRzICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2NrX2NhcCAgICA6IDE7ICAgIC8qIFN1cHBvcnRzIERvY2tpbmcgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0X3JlZ19zdXAgOiAxOyAgLyogSW5kaWNhdGVzIHN5c3RlbSBzdXBwb3J0cyBzeXN0ZW0gcmVzZXQgdmlhIHRoZSBGQURUIFJFU0VUX1JFRyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhbGVkX2Nhc2UgOiAxOyAgICAvKiBJbmRpY2F0ZXMgc3lzdGVtIGhhcyBubyBpbnRlcm5hbCBleHBhbnNpb24gY2FwYWJpbGl0aWVzIGFuZCBjYXNlIGlzIHNlYWxlZCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGxlc3MgICAgOiAxOyAgICAvKiBJbmRpY2F0ZXMgc3lzdGVtIGRvZXMgbm90IGhhdmUgbG9jYWwgdmlkZW8gY2FwYWJpbGl0aWVzIG9yIGxvY2FsIGlucHV0IGRldmljZXMgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9zd19zbGVlcCA6IDE7ICAgLyogSW5kaWNhdGVzIHRvIE9TUE0gdGhhdCBhIHByb2Nlc3NvciBuYXRpdmUgaW5zdHJ1Y3Rpb24gKi8KLQkJCSAgIC8qIG11c3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgd3JpdGluZyB0aGUgU0xQX1RZUHggcmVnaXN0ZXIgKi8KLQkvKiBBQ1BJIDMuMCBmbGFnIGJpdHMgKi8KK3N0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiB7CisJQUNQSV9UQUJMRV9IRUFERVJfREVGCS8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLworCUZBRFRfUkVWMl9DT01NT04gdTggcmVzZXJ2ZWQyOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCiAKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9leHBfd2FrICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsgLyogU3lzdGVtIHN1cHBvcnRzIFBDSUVYUF9XQUtFIChTVFMvRU4pIGJpdHMgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9wbGF0Zm9ybV9jbG9jayAgICAgICAgICAgICAgICAgIDogMTsgLyogT1NQTSBzaG91bGQgdXNlIHBsYXRmb3JtLXByb3ZpZGVkIHRpbWVyICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNHJ0Y19zdHNfdmFsaWQgICAgICAgICAgICAgICAgICAgICA6IDE7IC8qIENvbnRlbnRzIG9mIFJUQ19TVFMgdmFsaWQgYWZ0ZXIgUzQgd2FrZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlX3Bvd2VyX29uX2NhcGFibGUgICAgICAgICAgICAgOiAxOyAvKiBTeXN0ZW0gaXMgY29tcGF0aWJsZSB3aXRoIHJlbW90ZSBwb3dlciBvbiAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VfYXBpY19jbHVzdGVyX21vZGVsICAgICAgICAgICAgOiAxOyAvKiBBbGwgbG9jYWwgQVBJQ3MgbXVzdCB1c2UgY2x1c3RlciBtb2RlbCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VfYXBpY19waHlzaWNhbF9kZXN0aW5hdGlvbl9tb2RlIDogMTsgLyogYWxsIGxvY2FsIHhfYVBJQ3MgbXVzdCB1c2UgcGh5c2ljYWwgZGVzdCBtb2RlICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDYgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDEyOy8qIFJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisJLyogRmxhZ3MgKDMyIGJpdHMpICovCiAKLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgIHJlc2V0X3JlZ2lzdGVyOyAgICAgLyogUmVzZXQgcmVnaXN0ZXIgYWRkcmVzcyBpbiBHQVMgZm9ybWF0ICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldF92YWx1ZTsgICAgICAgIC8qIFZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZXNldF9yZWdpc3RlciBwb3J0IHRvIHJlc2V0IHRoZSBzeXN0ZW0gKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkN1szXTsgICAgICAgLyogVGhlc2UgdGhyZWUgYnl0ZXMgbXVzdCBiZSB6ZXJvICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZmlybXdhcmVfY3RybDsgICAgIC8qIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIEZBQ1MgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhkc2R0OyAgICAgICAgICAgICAgLyogNjQtYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRFNEVCAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgeHBtMWFfZXZ0X2JsazsgICAgICAvKiBFeHRlbmRlZCBQb3dlciBNZ3QgMWEgYWNwaV9ldmVudCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgIHhwbTFiX2V2dF9ibGs7ICAgICAgLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDFiIGFjcGlfZXZlbnQgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICB4cG0xYV9jbnRfYmxrOyAgICAgIC8qIEV4dGVuZGVkIFBvd2VyIE1ndCAxYSBDb250cm9sIFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgeHBtMWJfY250X2JsazsgICAgICAvKiBFeHRlbmRlZCBQb3dlciBNZ3QgMWIgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgIHhwbTJfY250X2JsazsgICAgICAgLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgIHhwbV90bXJfYmxrOyAgICAgICAgLyogRXh0ZW5kZWQgUG93ZXIgTWd0IFRpbWVyIEN0cmwgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICB4Z3BlMF9ibGs7ICAgICAgICAgIC8qIEV4dGVuZGVkIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDAgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICB4Z3BlMV9ibGs7ICAgICAgICAgIC8qIEV4dGVuZGVkIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDEgUmVnIEJsayBhZGRyZXNzICovCisJdTggd2JfaW52ZDoxOwkJLyogMDA6ICAgIFRoZSB3YmludmQgaW5zdHJ1Y3Rpb24gd29ya3MgcHJvcGVybHkgKi8KKwl1OCB3Yl9pbnZkX2ZsdXNoOjE7CS8qIDAxOiAgICBUaGUgd2JpbnZkIGZsdXNoZXMgYnV0IGRvZXMgbm90IGludmFsaWRhdGUgKi8KKwl1OCBwcm9jX2MxOjE7CQkvKiAwMjogICAgQWxsIHByb2Nlc3NvcnMgc3VwcG9ydCBDMSBzdGF0ZSAqLworCXU4IHBsdmwyX3VwOjE7CQkvKiAwMzogICAgQzIgc3RhdGUgd29ya3Mgb24gTVAgc3lzdGVtICovCisJdTggcHdyX2J1dHRvbjoxOwkvKiAwNDogICAgUG93ZXIgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUgKi8KKwl1OCBzbGVlcF9idXR0b246MTsJLyogMDU6ICAgIFNsZWVwIGJ1dHRvbiBpcyBoYW5kbGVkIGFzIGEgZ2VuZXJpYyBmZWF0dXJlLCBvciBub3QgcHJlc2VudCAqLworCXU4IGZpeGVkX3JUQzoxOwkJLyogMDY6ICAgIFJUQyB3YWtldXAgc3RhdCBub3QgaW4gZml4ZWQgcmVnaXN0ZXIgc3BhY2UgKi8KKwl1OCBydGNzNDoxOwkJLyogMDc6ICAgIFJUQyB3YWtldXAgc3RhdCBub3QgcG9zc2libGUgZnJvbSBTNCAqLworCXU4IHRtcl92YWxfZXh0OjE7CS8qIDA4OiAgICB0bXJfdmFsIGlzIDMyIGJpdHMgMD0yNC1iaXRzICovCisJdTggZG9ja19jYXA6MTsJCS8qIDA5OiAgICBEb2NraW5nIHN1cHBvcnRlZCAqLworCXU4IHJlc2V0X3JlZ19zdXA6MTsJLyogMTA6ICAgIFN5c3RlbSByZXNldCB2aWEgdGhlIEZBRFQgUkVTRVRfUkVHIHN1cHBvcnRlZCAqLworCXU4IHNlYWxlZF9jYXNlOjE7CS8qIDExOiAgICBObyBpbnRlcm5hbCBleHBhbnNpb24gY2FwYWJpbGl0aWVzIGFuZCBjYXNlIGlzIHNlYWxlZCAqLworCXU4IGhlYWRsZXNzOjE7CQkvKiAxMjogICAgTm8gbG9jYWwgdmlkZW8gY2FwYWJpbGl0aWVzIG9yIGxvY2FsIGlucHV0IGRldmljZXMgKi8KKwl1OCBjcHVfc3dfc2xlZXA6MTsJLyogMTM6ICAgIE11c3QgZXhlY3V0ZSBuYXRpdmUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgd3JpdGluZyBTTFBfVFlQeCByZWdpc3RlciAqLworCisJdTggcGNpX2V4cF93YWs6MTsJLyogMTQ6ICAgIFN5c3RlbSBzdXBwb3J0cyBQQ0lFWFBfV0FLRSAoU1RTL0VOKSBiaXRzIChBQ1BJIDMuMCkgKi8KKwl1OCB1c2VfcGxhdGZvcm1fY2xvY2s6MTsJLyogMTU6ICAgIE9TUE0gc2hvdWxkIHVzZSBwbGF0Zm9ybS1wcm92aWRlZCB0aW1lciAoQUNQSSAzLjApICovCisJdTggUzRydGNfc3RzX3ZhbGlkOjE7CS8qIDE2OiAgICBDb250ZW50cyBvZiBSVENfU1RTIHZhbGlkIGFmdGVyIFM0IHdha2UgKEFDUEkgMy4wKSAqLworCXU4IHJlbW90ZV9wb3dlcl9vbl9jYXBhYmxlOjE7CS8qIDE3OiAgICBTeXN0ZW0gaXMgY29tcGF0aWJsZSB3aXRoIHJlbW90ZSBwb3dlciBvbiAoQUNQSSAzLjApICovCisJdTggZm9yY2VfYXBpY19jbHVzdGVyX21vZGVsOjE7CS8qIDE4OiAgICBBbGwgbG9jYWwgQVBJQ3MgbXVzdCB1c2UgY2x1c3RlciBtb2RlbCAoQUNQSSAzLjApICovCisJdTggZm9yY2VfYXBpY19waHlzaWNhbF9kZXN0aW5hdGlvbl9tb2RlOjE7CS8qIDE5OiAgIGFsbCBsb2NhbCB4X2FQSUNzIG11c3QgdXNlIHBoeXNpY2FsIGRlc3QgbW9kZSAoQUNQSSAzLjApICovCisJIHU4OjQ7CQkJLyogMjAtMjM6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1OCByZXNlcnZlZDM7CQkvKiAyNC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHJlc2V0X3JlZ2lzdGVyOwkvKiBSZXNldCByZWdpc3RlciBhZGRyZXNzIGluIEdBUyBmb3JtYXQgKi8KKwl1OCByZXNldF92YWx1ZTsJCS8qIFZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZXNldF9yZWdpc3RlciBwb3J0IHRvIHJlc2V0IHRoZSBzeXN0ZW0gKi8KKwl1OCByZXNlcnZlZDRbM107CS8qIFRoZXNlIHRocmVlIGJ5dGVzIG11c3QgYmUgemVybyAqLworCXU2NCB4ZmlybXdhcmVfY3RybDsJLyogNjQtYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLworCXU2NCBYZHNkdDsJCS8qIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWFfZXZ0X2JsazsJLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDFhIGFjcGlfZXZlbnQgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFiX2V2dF9ibGs7CS8qIEV4dGVuZGVkIFBvd2VyIE1ndCAxYiBhY3BpX2V2ZW50IFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYV9jbnRfYmxrOwkvKiBFeHRlbmRlZCBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWJfY250X2JsazsJLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTJfY250X2JsazsJLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtX3Rtcl9ibGs7CS8qIEV4dGVuZGVkIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4Z3BlMF9ibGs7CS8qIEV4dGVuZGVkIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDAgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhncGUxX2JsazsJLyogRXh0ZW5kZWQgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMSBSZWcgQmxrIGFkZHJlc3MgKi8KIH07CiAKLQogLyogIkRvd24tcmV2dmVkIiBBQ1BJIDIuMCBGQURUIGRlc2NyaXB0b3IgKi8KIAotc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyX21pbnVzCi17Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGICAgICAgICAgICAgICAgICAgICAgICAvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KLQlGQURUX1JFVjJfQ09NTU9OCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDI7ICAgICAgICAgIC8qIFJlc2VydmVkICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgIHJlc2V0X3JlZ2lzdGVyOyAgICAgLyogUmVzZXQgcmVnaXN0ZXIgYWRkcmVzcyBpbiBHQVMgZm9ybWF0ICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldF92YWx1ZTsgICAgICAgIC8qIFZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZXNldF9yZWdpc3RlciBwb3J0IHRvIHJlc2V0IHRoZSBzeXN0ZW0uICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDdbM107ICAgICAgIC8qIFRoZXNlIHRocmVlIGJ5dGVzIG11c3QgYmUgemVybyAqLworc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyX21pbnVzIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYJLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCisJRkFEVF9SRVYyX0NPTU1PTiB1OCByZXNlcnZlZDI7CS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1MzIgZmxhZ3M7CisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHJlc2V0X3JlZ2lzdGVyOwkvKiBSZXNldCByZWdpc3RlciBhZGRyZXNzIGluIEdBUyBmb3JtYXQgKi8KKwl1OCByZXNldF92YWx1ZTsJCS8qIFZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZXNldF9yZWdpc3RlciBwb3J0IHRvIHJlc2V0IHRoZSBzeXN0ZW0uICovCisJdTggcmVzZXJ2ZWQ3WzNdOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCiB9OwogCi0KIC8qIEVDRFQgLSBFbWJlZGRlZCBDb250cm9sbGVyIEJvb3QgUmVzb3VyY2VzIFRhYmxlICovCiAKLXN0cnVjdCBlY19ib290X3Jlc291cmNlcwotewotCUFDUElfVEFCTEVfSEVBREVSX0RFRgotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgZWNfY29udHJvbDsgICAgICAgICAvKiBBZGRyZXNzIG9mIEVDIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICBlY19kYXRhOyAgICAgICAgICAgIC8qIEFkZHJlc3Mgb2YgRUMgZGF0YSByZWdpc3RlciAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkOyAgICAgICAgICAgICAgICAvKiBVbmlxdWUgSUQgLSBtdXN0IGJlIHNhbWUgYXMgdGhlIEVDIF9VSUQgbWV0aG9kICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfYml0OyAgICAgICAgICAgIC8qIFRoZSBHUEUgZm9yIHRoZSBFQyAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfaWRbMV07ICAgICAgICAgICAvKiBGdWxsIG5hbWVwYXRoIG9mIHRoZSBFQyBpbiB0aGUgQUNQSSBuYW1lc3BhY2UgKi8KK3N0cnVjdCBlY19ib290X3Jlc291cmNlcyB7CisJQUNQSV9UQUJMRV9IRUFERVJfREVGIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBlY19jb250cm9sOwkvKiBBZGRyZXNzIG9mIEVDIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGVjX2RhdGE7CS8qIEFkZHJlc3Mgb2YgRUMgZGF0YSByZWdpc3RlciAqLworCXUzMiB1aWQ7CQkvKiBVbmlxdWUgSUQgLSBtdXN0IGJlIHNhbWUgYXMgdGhlIEVDIF9VSUQgbWV0aG9kICovCisJdTggZ3BlX2JpdDsJCS8qIFRoZSBHUEUgZm9yIHRoZSBFQyAqLworCXU4IGVjX2lkWzFdOwkJLyogRnVsbCBuYW1lcGF0aCBvZiB0aGUgRUMgaW4gdGhlIEFDUEkgbmFtZXNwYWNlICovCiB9OwogCi0KIC8qIFNSQVQgLSBTeXN0ZW0gUmVzb3VyY2UgQWZmaW5pdHkgVGFibGUgKi8KIAotc3RydWN0IHN0YXRpY19yZXNvdXJjZV9hbGxvYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3hpbWl0eV9kb21haW5fbG87Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljX2lkOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCAgICAgICAgIDoxOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQzICAgICAgIDozMTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3NhcGljX2VpZDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3hpbWl0eV9kb21haW5faGlbM107Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDQ7CitzdHJ1Y3Qgc3RhdGljX3Jlc291cmNlX2FsbG9jIHsKKwl1OCB0eXBlOworCXU4IGxlbmd0aDsKKwl1OCBwcm94aW1pdHlfZG9tYWluX2xvOworCXU4IGFwaWNfaWQ7CisKKwkvKiBGbGFncyAoMzIgYml0cykgKi8KKworCXU4IGVuYWJsZWQ6MTsJCS8qIDAwOiAgICBVc2UgYWZmaW5pdHkgc3RydWN0dXJlICovCisJIHU4Ojc7CQkJLyogMDEtMDc6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1OCByZXNlcnZlZDNbM107CS8qIDA4LTMxOiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisKKwl1OCBsb2NhbF9zYXBpY19laWQ7CisJdTggcHJveGltaXR5X2RvbWFpbl9oaVszXTsKKwl1MzIgcmVzZXJ2ZWQ0OwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogfTsKIAotc3RydWN0IG1lbW9yeV9hZmZpbml0eQotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3hpbWl0eV9kb21haW47Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDM7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2FkZHJlc3M7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX2xlbmd0aDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkNDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgICAgICAgICA6MTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdF9wbHVnZ2FibGUgICA6MTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl92b2xhdGlsZSAgICA6MTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkNSAgICAgICA6Mjk7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDY7CitzdHJ1Y3QgbWVtb3J5X2FmZmluaXR5IHsKKwl1OCB0eXBlOworCXU4IGxlbmd0aDsKKwl1MzIgcHJveGltaXR5X2RvbWFpbjsKKwl1MTYgcmVzZXJ2ZWQzOworCXU2NCBiYXNlX2FkZHJlc3M7CisJdTY0IGFkZHJlc3NfbGVuZ3RoOworCXUzMiByZXNlcnZlZDQ7CisKKwkvKiBGbGFncyAoMzIgYml0cykgKi8KKworCXU4IGVuYWJsZWQ6MTsJCS8qIDAwOiAgICBVc2UgYWZmaW5pdHkgc3RydWN0dXJlICovCisJdTggaG90X3BsdWdnYWJsZToxOwkvKiAwMTogICAgTWVtb3J5IHJlZ2lvbiBpcyBob3QgcGx1Z2dhYmxlICovCisJdTggbm9uX3ZvbGF0aWxlOjE7CS8qIDAyOiAgICBNZW1vcnkgaXMgbm9uLXZvbGF0aWxlICovCisJIHU4OjU7CQkJLyogMDMtMDc6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1OCByZXNlcnZlZDVbM107CS8qIDA4LTMxOiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisKKwl1NjQgcmVzZXJ2ZWQ2OwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogfTsKIAotc3RydWN0IHN5c3RlbV9yZXNvdXJjZV9hZmZpbml0eQotewotCUFDUElfVEFCTEVfSEVBREVSX0RFRgotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxOyAgICAgICAgICAvKiBNdXN0IGJlIHZhbHVlICcxJyAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQyOworc3RydWN0IHN5c3RlbV9yZXNvdXJjZV9hZmZpbml0eSB7CisJQUNQSV9UQUJMRV9IRUFERVJfREVGIHUzMiByZXNlcnZlZDE7CS8qIE11c3QgYmUgdmFsdWUgJzEnICovCisJdTY0IHJlc2VydmVkMjsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KIH07CiAKLQogLyogU0xJVCAtIFN5c3RlbSBMb2NhbGl0eSBEaXN0YW5jZSBJbmZvcm1hdGlvbiBUYWJsZSAqLwogCi1zdHJ1Y3Qgc3lzdGVtX2xvY2FsaXR5X2luZm8KLXsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsaXR5X2NvdW50OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlbMV1bMV07CitzdHJ1Y3Qgc3lzdGVtX2xvY2FsaXR5X2luZm8geworCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1NjQgbG9jYWxpdHlfY291bnQ7CisJdTggZW50cnlbMV1bMV07CiB9OwogCi0KICNwcmFnbWEgcGFjaygpCiAKLSNlbmRpZiAvKiBfX0FDVEJMMl9IX18gKi8KLQorI2VuZGlmCQkJCS8qIF9fQUNUQkwyX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsNzEuaCBiL2luY2x1ZGUvYWNwaS9hY3RibDcxLmgKaW5kZXggN2I0ZmI0NC4uMTBhYzA1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGJsNzEuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0Ymw3MS5oCkBAIC0yNyw3ICsyNyw2IEBACiAjaWZuZGVmIF9fQUNUQkw3MV9IX18KICNkZWZpbmUgX19BQ1RCTDcxX0hfXwogCi0KIC8qIDAuNzEgRkFEVCBhZGRyZXNzX3NwYWNlIGRhdGEgaXRlbSBiaXRtYXNrcyBkZWZpbmVzICovCiAvKiBJZiB0aGUgYXNzb2NpYXRlZCBiaXQgaXMgemVybyB0aGVuIGl0IGlzIGluIG1lbW9yeSBzcGFjZSBlbHNlIGluIGlvIHNwYWNlICovCiAKQEAgLTQwLDEwNSArMzksOTYgQEAKIAogLyogT25seSBmb3IgY2xhcml0eSBpbiBkZWNsYXJhdGlvbnMgKi8KIAotdHlwZWRlZiB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgSU9fQUREUkVTUzsKLQordHlwZWRlZiB1NjQgSU9fQUREUkVTUzsKIAogI3ByYWdtYSBwYWNrKDEpCi1zdHJ1Y3QgIC8qIFJvb3QgU3lzdGVtIERlc2NyaXB0b3IgUG9pbnRlciAqLwotewotCU5BVElWRV9DSEFSICAgICAgICAgICAgIHNpZ25hdHVyZSBbOF07ICAgICAgICAgIC8qIGNvbnRhaW5zICJSU0QgUFRSICIgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtOyAgICAgICAgICAgICAgIC8qIHRvIG1ha2Ugc3VtIG9mIHN0cnVjdCA9PSAwICovCi0JTkFUSVZFX0NIQVIgICAgICAgICAgICAgb2VtX2lkIFs2XTsgICAgICAgICAgICAgLyogT0VNIGlkZW50aWZpY2F0aW9uICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsgICAgICAgICAgICAgICAvKiBNdXN0IGJlIDAgZm9yIDEuMCwgMiBmb3IgMi4wICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2R0X3BoeXNpY2FsX2FkZHJlc3M7ICAvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBSU0RUICovCitzdHJ1Y3QgewkJCS8qIFJvb3QgU3lzdGVtIERlc2NyaXB0b3IgUG9pbnRlciAqLworCU5BVElWRV9DSEFSIHNpZ25hdHVyZVs4XTsJLyogY29udGFpbnMgIlJTRCBQVFIgIiAqLworCXU4IGNoZWNrc3VtOwkJLyogdG8gbWFrZSBzdW0gb2Ygc3RydWN0ID09IDAgKi8KKwlOQVRJVkVfQ0hBUiBvZW1faWRbNl07CS8qIE9FTSBpZGVudGlmaWNhdGlvbiAqLworCXU4IHJlc2VydmVkOwkJLyogTXVzdCBiZSAwIGZvciAxLjAsIDIgZm9yIDIuMCAqLworCXU2NCByc2R0X3BoeXNpY2FsX2FkZHJlc3M7CS8qIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIFJTRFQgKi8KIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogSUE2NCBFeHRlbnNpb25zIHRvIEFDUEkgU3BlYyBSZXYgMC43MSAqLwogLyogZm9yIHRoZSBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0Ci17Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgIGhlYWRlcjsgICAgICAgICAgICAgICAgIC8qIFRhYmxlIGhlYWRlciAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZF9wYWQ7ICAgICAgICAgICAvKiBJQTY0IGFsaWdubWVudCwgbXVzdCBiZSAwICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX29mZnNldF9lbnRyeSBbMV07IC8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIG90aGVyICovCi0JCQkgICAvKiB0YWJsZXMnIGhlYWRlcnMgKi8KK3N0cnVjdCB7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsJLyogVGFibGUgaGVhZGVyICovCisJdTMyIHJlc2VydmVkX3BhZDsJLyogSUE2NCBhbGlnbm1lbnQsIG11c3QgYmUgMCAqLworCXU2NCB0YWJsZV9vZmZzZXRfZW50cnlbMV07CS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIG90aGVyICovCisJLyogdGFibGVzJyBoZWFkZXJzICovCiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogSUE2NCBFeHRlbnNpb25zIHRvIEFDUEkgU3BlYyBSZXYgMC43MSAgICovCiAvKiBmb3IgdGhlIEZpcm13YXJlIEFDUEkgQ29udHJvbCBTdHJ1Y3R1cmUgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0Ci17Ci0JTkFUSVZFX0NIQVIgICAgICAgICBzaWduYXR1cmVbNF07ICAgICAgICAgLyogc2lnbmF0dXJlICJGQUNTIiAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7ICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIHN0cnVjdHVyZSwgaW4gYnl0ZXMgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVfc2lnbmF0dXJlOyAgIC8qIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gc2lnbmF0dXJlICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkNDsgICAgICAgICAgICAvKiBtdXN0IGJlIDAgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsgLyogQUNQSSBPUyB3YWtpbmcgdmVjdG9yICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9sb2NrOyAgICAgICAgICAvKiBHbG9iYWwgTG9jayAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBTNGJpb3NfZiAgICAgIDogMTsgICAgLyogSW5kaWNhdGVzIGlmIFM0QklPUyBzdXBwb3J0IGlzIHByZXNlbnQgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxICAgICA6IDMxOyAgIC8qIG11c3QgYmUgMCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDMgWzI4XTsgICAgICAgLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KK3N0cnVjdCB7CisJTkFUSVZFX0NIQVIgc2lnbmF0dXJlWzRdOwkvKiBzaWduYXR1cmUgIkZBQ1MiICovCisJdTMyIGxlbmd0aDsJCS8qIGxlbmd0aCBvZiBzdHJ1Y3R1cmUsIGluIGJ5dGVzICovCisJdTMyIGhhcmR3YXJlX3NpZ25hdHVyZTsJLyogaGFyZHdhcmUgY29uZmlndXJhdGlvbiBzaWduYXR1cmUgKi8KKwl1MzIgcmVzZXJ2ZWQ0OwkJLyogbXVzdCBiZSAwICovCisJdTY0IGZpcm13YXJlX3dha2luZ192ZWN0b3I7CS8qIEFDUEkgT1Mgd2FraW5nIHZlY3RvciAqLworCXU2NCBnbG9iYWxfbG9jazsJLyogR2xvYmFsIExvY2sgKi8KKwl1MzIgUzRiaW9zX2Y6MTsJCS8qIEluZGljYXRlcyBpZiBTNEJJT1Mgc3VwcG9ydCBpcyBwcmVzZW50ICovCisJdTMyIHJlc2VydmVkMTozMTsJLyogbXVzdCBiZSAwICovCisJdTggcmVzZXJ2ZWQzWzI4XTsJLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIElBNjQgRXh0ZW5zaW9ucyB0byBBQ1BJIFNwZWMgUmV2IDAuNzEgICovCiAvKiBmb3IgdGhlIEZpeGVkIEFDUEkgRGVzY3JpcHRpb24gVGFibGUgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdAotewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICBoZWFkZXI7ICAgICAgICAgICAgIC8qIHRhYmxlIGhlYWRlciAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZF9wYWQ7ICAgICAgIC8qIElBNjQgYWxpZ25tZW50LCBtdXN0IGJlIDAgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgZmlybXdhcmVfY3RybDsgICAgICAvKiA2NC1iaXQgUGh5c2ljYWwgYWRkcmVzcyBvZiBGQUNTICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgIGRzZHQ7ICAgICAgICAgICAgICAgLyogNjQtYml0IFBoeXNpY2FsIGFkZHJlc3Mgb2YgRFNEVCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbDsgICAgICAgICAgICAgIC8qIFN5c3RlbSBJbnRlcnJ1cHQgTW9kZWwgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19zcGFjZTsgICAgICAvKiBBZGRyZXNzIFNwYWNlIEJpdG1hc2sgKi8KLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2ludDsgICAgICAgICAgICAvKiBTeXN0ZW0gdmVjdG9yIG9mIFNDSSBpbnRlcnJ1cHQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9lbmFibGU7ICAgICAgICAvKiB2YWx1ZSB0byB3cml0ZSB0byBzbWlfY21kIHRvIGVuYWJsZSBBQ1BJICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZGlzYWJsZTsgICAgICAgLyogdmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBkaXNhYmxlIEFDUEkgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgUzRiaW9zX3JlcTsgICAgICAgICAvKiBWYWx1ZSB0byB3cml0ZSB0byBTTUkgQ01EIHRvIGVudGVyIFM0QklPUyBzdGF0ZSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDI7ICAgICAgICAgIC8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgIHNtaV9jbWQ7ICAgICAgICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFNNSSBjb21tYW5kIHBvcnQgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgcG0xYV9ldnRfYmxrOyAgICAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIGFjcGlfZXZlbnQgUmVnIEJsayAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICBwbTFiX2V2dF9ibGs7ICAgICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgYWNwaV9ldmVudCBSZWcgQmxrICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgIHBtMWFfY250X2JsazsgICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBDb250cm9sIFJlZyBCbGsgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgcG0xYl9jbnRfYmxrOyAgICAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfY250X2JsazsgICAgICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMiBDb250cm9sIFJlZyBCbGsgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgcG1fdG1yX2JsazsgICAgICAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IFRpbWVyIEN0cmwgUmVnIEJsayAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICBncGUwX2JsazsgICAgICAgICAgIC8qIFBvcnQgYWRkciBvZiBHZW5lcmFsIFB1cnBvc2UgYWNwaV9ldmVudCAwIFJlZyBCbGsgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlMV9ibGs7ICAgICAgICAgICAvKiBQb3J0IGFkZHIgb2YgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMSBSZWcgQmxrICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIHBtMV9ldnRfbGVuOyAgICAgICAgLyogQnl0ZSBsZW5ndGggb2YgcG9ydHMgYXQgcG0xX3hfZXZ0X2JsayAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBwbTFfY250X2xlbjsgICAgICAgIC8qIEJ5dGUgbGVuZ3RoIG9mIHBvcnRzIGF0IHBtMV94X2NudF9ibGsgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX2NudF9sZW47ICAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbTJfY250X2JsayAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBwbV90bV9sZW47ICAgICAgICAgIC8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtX3RtX2JsayAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBncGUwX2Jsa19sZW47ICAgICAgIC8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTBfYmxrICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIGdwZTFfYmxrX2xlbjsgICAgICAgLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgZ3BlMV9ibGsgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlMV9iYXNlOyAgICAgICAgICAvKiBvZmZzZXQgaW4gZ3BlIG1vZGVsIHdoZXJlIGdwZTEgZXZlbnRzIHN0YXJ0ICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMzsgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgcGx2bDJfbGF0OyAgICAgICAgICAvKiB3b3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMiBzdGF0ZSAqLwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICBwbHZsM19sYXQ7ICAgICAgICAgIC8qIHdvcnN0IGNhc2UgSFcgbGF0ZW5jeSB0byBlbnRlci9leGl0IEMzIHN0YXRlICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIGRheV9hbHJtOyAgICAgICAgICAgLyogaW5kZXggdG8gZGF5LW9mLW1vbnRoIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBtb25fYWxybTsgICAgICAgICAgIC8qIGluZGV4IHRvIG1vbnRoLW9mLXllYXIgYWxhcm0gaW4gUlRDIENNT1MgUkFNICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnR1cnk7ICAgICAgICAgICAgLyogaW5kZXggdG8gY2VudHVyeSBpbiBSVEMgQ01PUyBSQU0gKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ0OyAgICAgICAgICAvKiByZXNlcnZlZCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaF9jYXNoICA6IDE7ICAgIC8qIFBBTF9GTFVTSF9DQUNIRSBpcyBjb3JyZWN0bHkgc3VwcG9ydGVkICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkNSAgIDogMTsgICAgLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19jMSAgICAgOiAxOyAgICAvKiBhbGwgcHJvY2Vzc29ycyBzdXBwb3J0IEMxIHN0YXRlICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHBsdmwyX3VwICAgIDogMTsgICAgLyogQzIgc3RhdGUgd29ya3Mgb24gTVAgc3lzdGVtICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHB3cl9idXR0b24gIDogMTsgICAgLyogUG93ZXIgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBfYnV0dG9uIDogMTsgICAvKiBTbGVlcCBidXR0b24gaXMgaGFuZGxlZCBhcyBhIGdlbmVyaWMgZmVhdHVyZSwgb3Igbm90IHByZXNlbnQgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfclRDICAgOiAxOyAgICAvKiBSVEMgd2FrZXVwIHN0YXQgbm90IGluIGZpeGVkIHJlZ2lzdGVyIHNwYWNlICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHJ0Y3M0ICAgICAgIDogMTsgICAgLyogUlRDIHdha2V1cCBzdGF0IG5vdCBwb3NzaWJsZSBmcm9tIFM0ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHRtcl92YWxfZXh0IDogMTsgICAgLyogdG1yX3ZhbCBpcyAzMiBiaXRzICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIGRvY2tfY2FwICAgIDogMTsgICAgLyogU3VwcG9ydHMgRG9ja2luZyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDYgICA6IDIyOyAgICAvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworc3RydWN0IHsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwkvKiB0YWJsZSBoZWFkZXIgKi8KKwl1MzIgcmVzZXJ2ZWRfcGFkOwkvKiBJQTY0IGFsaWdubWVudCwgbXVzdCBiZSAwICovCisJdTY0IGZpcm13YXJlX2N0cmw7CS8qIDY0LWJpdCBQaHlzaWNhbCBhZGRyZXNzIG9mIEZBQ1MgKi8KKwl1NjQgZHNkdDsJCS8qIDY0LWJpdCBQaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KKwl1OCBtb2RlbDsJCS8qIFN5c3RlbSBJbnRlcnJ1cHQgTW9kZWwgKi8KKwl1OCBhZGRyZXNzX3NwYWNlOwkvKiBBZGRyZXNzIFNwYWNlIEJpdG1hc2sgKi8KKwl1MTYgc2NpX2ludDsJCS8qIFN5c3RlbSB2ZWN0b3Igb2YgU0NJIGludGVycnVwdCAqLworCXU4IGFjcGlfZW5hYmxlOwkJLyogdmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBlbmFibGUgQUNQSSAqLworCXU4IGFjcGlfZGlzYWJsZTsJLyogdmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBkaXNhYmxlIEFDUEkgKi8KKwl1OCBTNGJpb3NfcmVxOwkJLyogVmFsdWUgdG8gd3JpdGUgdG8gU01JIENNRCB0byBlbnRlciBTNEJJT1Mgc3RhdGUgKi8KKwl1OCByZXNlcnZlZDI7CQkvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworCXU2NCBzbWlfY21kOwkJLyogUG9ydCBhZGRyZXNzIG9mIFNNSSBjb21tYW5kIHBvcnQgKi8KKwl1NjQgcG0xYV9ldnRfYmxrOwkvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIGFjcGlfZXZlbnQgUmVnIEJsayAqLworCXU2NCBwbTFiX2V2dF9ibGs7CS8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgYWNwaV9ldmVudCBSZWcgQmxrICovCisJdTY0IHBtMWFfY250X2JsazsJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBDb250cm9sIFJlZyBCbGsgKi8KKwl1NjQgcG0xYl9jbnRfYmxrOwkvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayAqLworCXU2NCBwbTJfY250X2JsazsJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayAqLworCXU2NCBwbV90bXJfYmxrOwkJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgKi8KKwl1NjQgZ3BlMF9ibGs7CQkvKiBQb3J0IGFkZHIgb2YgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMCBSZWcgQmxrICovCisJdTY0IGdwZTFfYmxrOwkJLyogUG9ydCBhZGRyIG9mIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDEgUmVnIEJsayAqLworCXU4IHBtMV9ldnRfbGVuOwkJLyogQnl0ZSBsZW5ndGggb2YgcG9ydHMgYXQgcG0xX3hfZXZ0X2JsayAqLworCXU4IHBtMV9jbnRfbGVuOwkJLyogQnl0ZSBsZW5ndGggb2YgcG9ydHMgYXQgcG0xX3hfY250X2JsayAqLworCXU4IHBtMl9jbnRfbGVuOwkJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0yX2NudF9ibGsgKi8KKwl1OCBwbV90bV9sZW47CQkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbV90bV9ibGsgKi8KKwl1OCBncGUwX2Jsa19sZW47CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTBfYmxrICovCisJdTggZ3BlMV9ibGtfbGVuOwkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUxX2JsayAqLworCXU4IGdwZTFfYmFzZTsJCS8qIG9mZnNldCBpbiBncGUgbW9kZWwgd2hlcmUgZ3BlMSBldmVudHMgc3RhcnQgKi8KKwl1OCByZXNlcnZlZDM7CQkvKiByZXNlcnZlZCAqLworCXUxNiBwbHZsMl9sYXQ7CQkvKiB3b3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMiBzdGF0ZSAqLworCXUxNiBwbHZsM19sYXQ7CQkvKiB3b3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMyBzdGF0ZSAqLworCXU4IGRheV9hbHJtOwkJLyogaW5kZXggdG8gZGF5LW9mLW1vbnRoIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLworCXU4IG1vbl9hbHJtOwkJLyogaW5kZXggdG8gbW9udGgtb2YteWVhciBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8KKwl1OCBjZW50dXJ5OwkJLyogaW5kZXggdG8gY2VudHVyeSBpbiBSVEMgQ01PUyBSQU0gKi8KKwl1OCByZXNlcnZlZDQ7CQkvKiByZXNlcnZlZCAqLworCXUzMiBmbHVzaF9jYXNoOjE7CS8qIFBBTF9GTFVTSF9DQUNIRSBpcyBjb3JyZWN0bHkgc3VwcG9ydGVkICovCisJdTMyIHJlc2VydmVkNToxOwkvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworCXUzMiBwcm9jX2MxOjE7CQkvKiBhbGwgcHJvY2Vzc29ycyBzdXBwb3J0IEMxIHN0YXRlICovCisJdTMyIHBsdmwyX3VwOjE7CQkvKiBDMiBzdGF0ZSB3b3JrcyBvbiBNUCBzeXN0ZW0gKi8KKwl1MzIgcHdyX2J1dHRvbjoxOwkvKiBQb3dlciBidXR0b24gaXMgaGFuZGxlZCBhcyBhIGdlbmVyaWMgZmVhdHVyZSAqLworCXUzMiBzbGVlcF9idXR0b246MTsJLyogU2xlZXAgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUsIG9yIG5vdCBwcmVzZW50ICovCisJdTMyIGZpeGVkX3JUQzoxOwkvKiBSVEMgd2FrZXVwIHN0YXQgbm90IGluIGZpeGVkIHJlZ2lzdGVyIHNwYWNlICovCisJdTMyIHJ0Y3M0OjE7CQkvKiBSVEMgd2FrZXVwIHN0YXQgbm90IHBvc3NpYmxlIGZyb20gUzQgKi8KKwl1MzIgdG1yX3ZhbF9leHQ6MTsJLyogdG1yX3ZhbCBpcyAzMiBiaXRzICovCisJdTMyIGRvY2tfY2FwOjE7CQkvKiBTdXBwb3J0cyBEb2NraW5nICovCisJdTMyIHJlc2VydmVkNjoyMjsJLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KIH07CiAKICNwcmFnbWEgcGFjaygpCiAKLSNlbmRpZiAvKiBfX0FDVEJMNzFfSF9fICovCi0KKyNlbmRpZgkJCQkvKiBfX0FDVEJMNzFfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oIGIvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaAppbmRleCAzYTQ1MWRjLi42MjEzYjI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKQEAgLTQ2LDM1ICs0NiwzMSBAQAogCiAvKiEgW0JlZ2luXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAoa2VlcCB0aGUgdHlwZWRlZnMpICovCiAKLQotCiAvKgogICogRGF0YSB0eXBlIHJhbmdlcwogICogTm90ZTogVGhlc2UgbWFjcm9zIGFyZSBkZXNpZ25lZCB0byBiZSBjb21waWxlciBpbmRlcGVuZGVudCBhcyB3ZWxsIGFzCiAgKiB3b3JraW5nIGFyb3VuZCBwcm9ibGVtcyB0aGF0IHNvbWUgMzItYml0IGNvbXBpbGVycyBoYXZlIHdpdGggNjQtYml0CiAgKiBjb25zdGFudHMuCiAgKi8KLSNkZWZpbmUgQUNQSV9VSU5UOF9NQVggICAgICAgICAgICAgICAgICAoVUlOVDgpICh+KChVSU5UOCkgIDApKSAvKiAweEZGICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQUNQSV9VSU5UMTZfTUFYICAgICAgICAgICAgICAgICAoVUlOVDE2KSh+KChVSU5UMTYpIDApKSAvKiAweEZGRkYgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQUNQSV9VSU5UMzJfTUFYICAgICAgICAgICAgICAgICAoVUlOVDMyKSh+KChVSU5UMzIpIDApKSAvKiAweEZGRkZGRkZGICAgICAgICAgKi8KLSNkZWZpbmUgQUNQSV9VSU5UNjRfTUFYICAgICAgICAgICAgICAgICAoVUlOVDY0KSh+KChVSU5UNjQpIDApKSAvKiAweEZGRkZGRkZGRkZGRkZGRkYgKi8KKyNkZWZpbmUgQUNQSV9VSU5UOF9NQVggICAgICAgICAgICAgICAgICAoVUlOVDgpICh+KChVSU5UOCkgIDApKQkvKiAweEZGICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQUNQSV9VSU5UMTZfTUFYICAgICAgICAgICAgICAgICAoVUlOVDE2KSh+KChVSU5UMTYpIDApKQkvKiAweEZGRkYgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQUNQSV9VSU5UMzJfTUFYICAgICAgICAgICAgICAgICAoVUlOVDMyKSh+KChVSU5UMzIpIDApKQkvKiAweEZGRkZGRkZGICAgICAgICAgKi8KKyNkZWZpbmUgQUNQSV9VSU5UNjRfTUFYICAgICAgICAgICAgICAgICAoVUlOVDY0KSh+KChVSU5UNjQpIDApKQkvKiAweEZGRkZGRkZGRkZGRkZGRkYgKi8KICNkZWZpbmUgQUNQSV9BU0NJSV9NQVggICAgICAgICAgICAgICAgICAweDdGCiAKLQogI2lmZGVmIERFRklORV9BTFRFUk5BVEVfVFlQRVMKIC8qCiAgKiBUeXBlcyB1c2VkIG9ubHkgaW4gdHJhbnNsYXRlZCBzb3VyY2UsIGRlZmluZWQgaGVyZSB0byBlbmFibGUKICAqIGNyb3NzLXBsYXRmb3JtIGNvbXBpbGF0aW9uIG9ubHkuCiAgKi8KLXR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgdTg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICAgdTE2OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIHUzMjsKLXR5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX1VJTlQ2NCAgICAgICB1NjQ7Cit0eXBlZGVmIGludCBzMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdTg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX1VJTlQ2NCB1NjQ7CiAKICNlbmRpZgogCi0KIC8qCiAgKiBEYXRhIHR5cGVzIC0gRml4ZWQgYWNyb3NzIGFsbCBjb21waWxhdGlvbiBtb2RlbHMgKDE2LzMyLzY0KQogICoKQEAgLTEwMiwzMCArOTgsMjkgQEAKIC8qCiAgKiA2NC1iaXQgdHlwZSBkZWZpbml0aW9ucwogICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgVUlOVDg7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgQk9PTEVBTjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICBVSU5UMTY7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgVUlOVDMyOwotdHlwZWRlZiBDT01QSUxFUl9ERVBFTkRFTlRfSU5UNjQgICAgICAgIElOVDY0OwotdHlwZWRlZiBDT01QSUxFUl9ERVBFTkRFTlRfVUlOVDY0ICAgICAgIFVJTlQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVSU5UODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBCT09MRUFOOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVSU5UMTY7Cit0eXBlZGVmIGludCBJTlQzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQzMjsKK3R5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX0lOVDY0IElOVDY0OwordHlwZWRlZiBDT01QSUxFUl9ERVBFTkRFTlRfVUlOVDY0IFVJTlQ2NDsKIAogLyohIFtFbmRdIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICEqLwogCi10eXBlZGVmIHM2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX25hdGl2ZV9pbnQ7Ci10eXBlZGVmIHU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX25hdGl2ZV91aW50OwordHlwZWRlZiBzNjQgYWNwaV9uYXRpdmVfaW50OwordHlwZWRlZiB1NjQgYWNwaV9uYXRpdmVfdWludDsKIAotdHlwZWRlZiB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV90YWJsZV9wdHI7Ci10eXBlZGVmIHU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2lvX2FkZHJlc3M7Ci10eXBlZGVmIHU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3M7Ci10eXBlZGVmIHU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX3NpemU7Cit0eXBlZGVmIHU2NCBhY3BpX3RhYmxlX3B0cjsKK3R5cGVkZWYgdTY0IGFjcGlfaW9fYWRkcmVzczsKK3R5cGVkZWYgdTY0IGFjcGlfcGh5c2ljYWxfYWRkcmVzczsKK3R5cGVkZWYgdTY0IGFjcGlfc2l6ZTsKIAotI2RlZmluZSBBTElHTkVEX0FERFJFU1NfQk9VTkRBUlkgICAgICAgIDB4MDAwMDAwMDggICAgICAvKiBObyBoYXJkd2FyZSBhbGlnbm1lbnQgc3VwcG9ydCBpbiBJQTY0ICovCi0jZGVmaW5lIEFDUElfVVNFX05BVElWRV9ESVZJREUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5hdGl2ZSA2NC1iaXQgaW50ZWdlciBzdXBwb3J0ICovCisjZGVmaW5lIEFMSUdORURfQUREUkVTU19CT1VOREFSWSAgICAgICAgMHgwMDAwMDAwOAkvKiBObyBoYXJkd2FyZSBhbGlnbm1lbnQgc3VwcG9ydCBpbiBJQTY0ICovCisjZGVmaW5lIEFDUElfVVNFX05BVElWRV9ESVZJREUJLyogTmF0aXZlIDY0LWJpdCBpbnRlZ2VyIHN1cHBvcnQgKi8KICNkZWZpbmUgQUNQSV9NQVhfUFRSICAgICAgICAgICAgICAgICAgICBBQ1BJX1VJTlQ2NF9NQVgKICNkZWZpbmUgQUNQSV9TSVpFX01BWCAgICAgICAgICAgICAgICAgICBBQ1BJX1VJTlQ2NF9NQVgKIAotCiAjZWxpZiBBQ1BJX01BQ0hJTkVfV0lEVEggPT0gMTYKIAogLyohIFtCZWdpbl0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gKGtlZXAgdGhlIHR5cGVkZWZzKSAqLwpAQCAtMTMzLDMyICsxMjgsMzEgQEAKIC8qCiAgKiAxNi1iaXQgdHlwZSBkZWZpbml0aW9ucwogICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgVUlOVDg7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgQk9PTEVBTjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICBVSU5UMTY7Ci10eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzI7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICAgVUlOVDMyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJTlQ4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJPT0xFQU47Cit0eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMTY7Cit0eXBlZGVmIGxvbmcgSU5UMzI7Cit0eXBlZGVmIGludCBJTlQxNjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVSU5UMzI7CiAKLXN0cnVjdAotewotCVVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMbzsKLQlVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGk7CitzdHJ1Y3QgeworCVVJTlQzMiBMbzsKKwlVSU5UMzIgSGk7CiB9OwogCiAvKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCiAKLXR5cGVkZWYgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfbmF0aXZlX3VpbnQ7Ci10eXBlZGVmIHMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX25hdGl2ZV9pbnQ7Cit0eXBlZGVmIHUxNiBhY3BpX25hdGl2ZV91aW50OwordHlwZWRlZiBzMTYgYWNwaV9uYXRpdmVfaW50OwogCi10eXBlZGVmIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX3RhYmxlX3B0cjsKLXR5cGVkZWYgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfaW9fYWRkcmVzczsKLXR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX3BoeXNpY2FsX2FkZHJlc3M7Ci10eXBlZGVmIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX3NpemU7Cit0eXBlZGVmIHUzMiBhY3BpX3RhYmxlX3B0cjsKK3R5cGVkZWYgdTMyIGFjcGlfaW9fYWRkcmVzczsKK3R5cGVkZWYgY2hhciAqYWNwaV9waHlzaWNhbF9hZGRyZXNzOwordHlwZWRlZiB1MTYgYWNwaV9zaXplOwogCiAjZGVmaW5lIEFMSUdORURfQUREUkVTU19CT1VOREFSWSAgICAgICAgMHgwMDAwMDAwMgogI2RlZmluZSBBQ1BJX01JU0FMSUdORURfVFJBTlNGRVJTCi0jZGVmaW5lIEFDUElfVVNFX05BVElWRV9ESVZJREUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIDY0LWJpdCBpbnRlZ2Vycywgb2sgdG8gdXNlIG5hdGl2ZSBkaXZpZGUgKi8KKyNkZWZpbmUgQUNQSV9VU0VfTkFUSVZFX0RJVklERQkvKiBObyA2NC1iaXQgaW50ZWdlcnMsIG9rIHRvIHVzZSBuYXRpdmUgZGl2aWRlICovCiAjZGVmaW5lIEFDUElfTUFYX1BUUiAgICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UMTZfTUFYCiAjZGVmaW5lIEFDUElfU0laRV9NQVggICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UMTZfTUFYCiAKQEAgLTE2OCw3ICsxNjIsNiBAQAogICovCiAjZGVmaW5lIEFDUElfTk9fSU5URUdFUjY0X1NVUFBPUlQKIAotCiAjZWxpZiBBQ1BJX01BQ0hJTkVfV0lEVEggPT0gMzIKIAogLyohIFtCZWdpbl0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gKGtlZXAgdGhlIHR5cGVkZWZzKSAqLwpAQCAtMTc2LDIzICsxNjksMjMgQEAKIC8qCiAgKiAzMi1iaXQgdHlwZSBkZWZpbml0aW9ucyAoZGVmYXVsdCkKICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgIFVJTlQ4OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgIEJPT0xFQU47Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICAgVUlOVDE2OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIFVJTlQzMjsKLXR5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX0lOVDY0ICAgICAgICBJTlQ2NDsKLXR5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX1VJTlQ2NCAgICAgICBVSU5UNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUlOVDg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQk9PTEVBTjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgVUlOVDE2OwordHlwZWRlZiBpbnQgSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMzI7Cit0eXBlZGVmIENPTVBJTEVSX0RFUEVOREVOVF9JTlQ2NCBJTlQ2NDsKK3R5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX1VJTlQ2NCBVSU5UNjQ7CiAKIC8qISBbRW5kXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAhKi8KIAotdHlwZWRlZiBzMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9uYXRpdmVfaW50OwotdHlwZWRlZiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9uYXRpdmVfdWludDsKK3R5cGVkZWYgczMyIGFjcGlfbmF0aXZlX2ludDsKK3R5cGVkZWYgdTMyIGFjcGlfbmF0aXZlX3VpbnQ7CiAKLXR5cGVkZWYgdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfdGFibGVfcHRyOwotdHlwZWRlZiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9pb19hZGRyZXNzOwotdHlwZWRlZiB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzOwotdHlwZWRlZiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9zaXplOwordHlwZWRlZiB1NjQgYWNwaV90YWJsZV9wdHI7Cit0eXBlZGVmIHUzMiBhY3BpX2lvX2FkZHJlc3M7Cit0eXBlZGVmIHU2NCBhY3BpX3BoeXNpY2FsX2FkZHJlc3M7Cit0eXBlZGVmIHUzMiBhY3BpX3NpemU7CiAKICNkZWZpbmUgQUxJR05FRF9BRERSRVNTX0JPVU5EQVJZICAgICAgICAweDAwMDAwMDA0CiAjZGVmaW5lIEFDUElfTUlTQUxJR05FRF9UUkFOU0ZFUlMKQEAgLTIwMywyOSArMTk2LDI3IEBACiAjZXJyb3IgdW5rbm93biBBQ1BJX01BQ0hJTkVfV0lEVEgKICNlbmRpZgogCi0KIC8qCi0gKiBNaXNjZWxsYW5lb3VzIGNvbW1vbiB0eXBlcworICogVGhpcyB0eXBlIGlzIHVzZWQgZm9yIGJpdGZpZWxkcyBpbiBBQ1BJIHRhYmxlcy4gVGhlIG9ubHkgdHlwZSB0aGF0IGlzCisgKiBldmVuIHJlbW90ZWx5IHBvcnRhYmxlIGlzIHU4LiBBbnl0aGluZyBlbHNlIGlzIG5vdCBwb3J0YWJsZSwgc28KKyAqIGRvIG5vdCBhZGQgYW55IG1vcmUgYml0ZmllbGQgdHlwZXMuCiAgKi8KLXR5cGVkZWYgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNl9CSVQ7Ci10eXBlZGVmIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzJfQklUOwotdHlwZWRlZiBhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9QVFJESUZGOwordHlwZWRlZiB1OCBVSU5UOF9CSVQ7Cit0eXBlZGVmIGFjcGlfbmF0aXZlX3VpbnQgQUNQSV9QVFJESUZGOwogCiAvKgogICogUG9pbnRlciBvdmVybGF5cyB0byBhdm9pZCBsb3RzIG9mIHR5cGVjYXN0aW5nIGZvcgogICogY29kZSB0aGF0IGFjY2VwdHMgYm90aCBwaHlzaWNhbCBhbmQgbG9naWNhbCBwb2ludGVycy4KICAqLwotdW5pb24gYWNwaV9wb2ludGVycwotewotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgICAgIHBoeXNpY2FsOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2dpY2FsOwotCWFjcGlfdGFibGVfcHRyICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwordW5pb24gYWNwaV9wb2ludGVycyB7CisJYWNwaV9waHlzaWNhbF9hZGRyZXNzIHBoeXNpY2FsOworCXZvaWQgKmxvZ2ljYWw7CisJYWNwaV90YWJsZV9wdHIgdmFsdWU7CiB9OwogCi1zdHJ1Y3QgYWNwaV9wb2ludGVyCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl90eXBlOwotCXVuaW9uIGFjcGlfcG9pbnRlcnMgICAgICAgICAgICAgICAgIHBvaW50ZXI7CitzdHJ1Y3QgYWNwaV9wb2ludGVyIHsKKwl1MzIgcG9pbnRlcl90eXBlOworCXVuaW9uIGFjcGlfcG9pbnRlcnMgcG9pbnRlcjsKIH07CiAKIC8qIHBvaW50ZXJfdHlwZXMgZm9yIGFib3ZlICovCkBAIC0yNDMsNiArMjM0LDE0IEBACiAjZGVmaW5lIEFDUElfTE9HTU9ERV9QSFlTUFRSICAgICAgICAgICAgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcgIHwgQUNQSV9QSFlTSUNBTF9QT0lOVEVSCiAjZGVmaW5lIEFDUElfTE9HTU9ERV9MT0dQVFIgICAgICAgICAgICAgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcgIHwgQUNQSV9MT0dJQ0FMX1BPSU5URVIKIAorLyoKKyAqIElmIGFjcGlfY2FjaGVfdCB3YXMgbm90IGRlZmluZWQgaW4gdGhlIE9TLWRlcGVuZGVudCBoZWFkZXIsCisgKiBkZWZpbmUgaXQgbm93LiBUaGlzIGlzIHR5cGljYWxseSB0aGUgY2FzZSB3aGVyZSB0aGUgbG9jYWwgY2FjaGUKKyAqIG1hbmFnZXIgaW1wbGVtZW50YXRpb24gaXMgdG8gYmUgdXNlZCAoQUNQSV9VU0VfTE9DQUxfQ0FDSEUpCisgKi8KKyNpZm5kZWYgYWNwaV9jYWNoZV90CisjZGVmaW5lIGFjcGlfY2FjaGVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdAorI2VuZGlmCiAKIC8qCiAgKiBVc2VmdWwgZGVmaW5lcwpAQCAtMjYxLDM0ICsyNjAsMjkgQEAKICNkZWZpbmUgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAwCiAjZW5kaWYKIAotCiAvKgogICogTG9jYWwgZGF0YXR5cGVzCiAgKi8KLXR5cGVkZWYgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfc3RhdHVzOyAgICAvKiBBbGwgQUNQSSBFeGNlcHRpb25zICovCi10eXBlZGVmIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX25hbWU7ICAgICAgLyogNC1ieXRlIEFDUEkgbmFtZSAqLwotdHlwZWRlZiBjaGFyICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9zdHJpbmc7ICAgIC8qIE51bGwgdGVybWluYXRlZCBBU0NJSSBzdHJpbmcgKi8KLXR5cGVkZWYgdm9pZCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfaGFuZGxlOyAgICAvKiBBY3R1YWxseSBhIHB0ciB0byBhbiBOb2RlICovCit0eXBlZGVmIHUzMiBhY3BpX3N0YXR1czsJLyogQWxsIEFDUEkgRXhjZXB0aW9ucyAqLwordHlwZWRlZiB1MzIgYWNwaV9uYW1lOwkJLyogNC1ieXRlIEFDUEkgbmFtZSAqLwordHlwZWRlZiBjaGFyICphY3BpX3N0cmluZzsJLyogTnVsbCB0ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZyAqLwordHlwZWRlZiB2b2lkICphY3BpX2hhbmRsZTsJLyogQWN0dWFsbHkgYSBwdHIgdG8gYW4gTm9kZSAqLwogCi1zdHJ1Y3QgdWludDY0X3N0cnVjdAotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpOworc3RydWN0IHVpbnQ2NF9zdHJ1Y3QgeworCXUzMiBsbzsKKwl1MzIgaGk7CiB9OwogCi11bmlvbiB1aW50NjRfb3ZlcmxheQotewotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGw7Ci0Jc3RydWN0IHVpbnQ2NF9zdHJ1Y3QgICAgICAgICAgICAgICAgcGFydDsKK3VuaW9uIHVpbnQ2NF9vdmVybGF5IHsKKwl1NjQgZnVsbDsKKwlzdHJ1Y3QgdWludDY0X3N0cnVjdCBwYXJ0OwogfTsKIAotc3RydWN0IHVpbnQzMl9zdHJ1Y3QKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaTsKK3N0cnVjdCB1aW50MzJfc3RydWN0IHsKKwl1MzIgbG87CisJdTMyIGhpOwogfTsKIAotCiAvKgogICogQWNwaSBpbnRlZ2VyIHdpZHRoLiBJbiBBQ1BJIHZlcnNpb24gMSwgaW50ZWdlcnMgYXJlCiAgKiAzMiBiaXRzLiAgSW4gQUNQSSB2ZXJzaW9uIDIsIGludGVnZXJzIGFyZSA2NCBiaXRzLgpAQCAtMzAwLDI2ICsyOTQsMjQgQEAKIAogLyogMzItYml0IGludGVnZXJzIG9ubHksIG5vIDY0LWJpdCBzdXBwb3J0ICovCiAKLXR5cGVkZWYgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfaW50ZWdlcjsKK3R5cGVkZWYgdTMyIGFjcGlfaW50ZWdlcjsKICNkZWZpbmUgQUNQSV9JTlRFR0VSX01BWCAgICAgICAgICAgICAgICBBQ1BJX1VJTlQzMl9NQVgKICNkZWZpbmUgQUNQSV9JTlRFR0VSX0JJVF9TSVpFICAgICAgICAgICAzMgotI2RlZmluZSBBQ1BJX01BWF9ERUNJTUFMX0RJR0lUUyAgICAgICAgIDEwICAvKiAyXjMyID0gNCwyOTQsOTY3LDI5NiAqLworI2RlZmluZSBBQ1BJX01BWF9ERUNJTUFMX0RJR0lUUyAgICAgICAgIDEwCS8qIDJeMzIgPSA0LDI5NCw5NjcsMjk2ICovCiAKLSNkZWZpbmUgQUNQSV9VU0VfTkFUSVZFX0RJVklERSAgICAgICAgICAvKiBVc2UgY29tcGlsZXIgbmF0aXZlIDMyLWJpdCBkaXZpZGUgKi8KLQorI2RlZmluZSBBQ1BJX1VTRV9OQVRJVkVfRElWSURFCS8qIFVzZSBjb21waWxlciBuYXRpdmUgMzItYml0IGRpdmlkZSAqLwogCiAjZWxzZQogCiAvKiA2NC1iaXQgaW50ZWdlcnMgKi8KIAotdHlwZWRlZiB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9pbnRlZ2VyOwordHlwZWRlZiB1NjQgYWNwaV9pbnRlZ2VyOwogI2RlZmluZSBBQ1BJX0lOVEVHRVJfTUFYICAgICAgICAgICAgICAgIEFDUElfVUlOVDY0X01BWAogI2RlZmluZSBBQ1BJX0lOVEVHRVJfQklUX1NJWkUgICAgICAgICAgIDY0Ci0jZGVmaW5lIEFDUElfTUFYX0RFQ0lNQUxfRElHSVRTICAgICAgICAgMjAgIC8qIDJeNjQgPSAxOCw0NDYsNzQ0LDA3Myw3MDksNTUxLDYxNiAqLwotCisjZGVmaW5lIEFDUElfTUFYX0RFQ0lNQUxfRElHSVRTICAgICAgICAgMjAJLyogMl42NCA9IDE4LDQ0Niw3NDQsMDczLDcwOSw1NTEsNjE2ICovCiAKICNpZiBBQ1BJX01BQ0hJTkVfV0lEVEggPT0gNjQKLSNkZWZpbmUgQUNQSV9VU0VfTkFUSVZFX0RJVklERSAgICAgICAgICAvKiBVc2UgY29tcGlsZXIgbmF0aXZlIDY0LWJpdCBkaXZpZGUgKi8KKyNkZWZpbmUgQUNQSV9VU0VfTkFUSVZFX0RJVklERQkvKiBVc2UgY29tcGlsZXIgbmF0aXZlIDY0LWJpdCBkaXZpZGUgKi8KICNlbmRpZgogI2VuZGlmCiAKQEAgLTMzMyw3ICszMjUsNiBAQAogICovCiAjZGVmaW5lIEFDUElfUk9PVF9PQkpFQ1QgICAgICAgICAgICAgICAgKGFjcGlfaGFuZGxlKSBBQ1BJX1BUUl9BREQgKGNoYXIsIE5VTEwsIEFDUElfTUFYX1BUUikKIAotCiAvKgogICogSW5pdGlhbGl6YXRpb24gc2VxdWVuY2UKICAqLwpAQCAtNDAwLDcgKzM5MSw3IEBACiAvKgogICogIFRhYmxlIHR5cGVzLiAgVGhlc2UgdmFsdWVzIGFyZSBwYXNzZWQgdG8gdGhlIHRhYmxlIHJlbGF0ZWQgQVBJcwogICovCi10eXBlZGVmIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX3RhYmxlX3R5cGU7Cit0eXBlZGVmIHUzMiBhY3BpX3RhYmxlX3R5cGU7CiAKICNkZWZpbmUgQUNQSV9UQUJMRV9SU0RQICAgICAgICAgICAgICAgICAoYWNwaV90YWJsZV90eXBlKSAwCiAjZGVmaW5lIEFDUElfVEFCTEVfRFNEVCAgICAgICAgICAgICAgICAgKGFjcGlfdGFibGVfdHlwZSkgMQpAQCAtNDIxLDIyICs0MTIsMjIgQEAKICAqIE5PVEU6IFR5cGVzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGdsb2JhbCBhY3BpX25zX3Byb3BlcnRpZXMKICAqIGFuZCBhY3BpX25zX3R5cGVfbmFtZXMgYXJyYXlzLgogICovCi10eXBlZGVmIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX29iamVjdF90eXBlOwordHlwZWRlZiB1MzIgYWNwaV9vYmplY3RfdHlwZTsKIAogI2RlZmluZSBBQ1BJX1RZUEVfQU5ZICAgICAgICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgQUNQSV9UWVBFX0lOVEVHRVIgICAgICAgICAgICAgICAweDAxICAvKiBCeXRlL1dvcmQvRHdvcmQvWmVyby9PbmUvT25lcyAqLworI2RlZmluZSBBQ1BJX1RZUEVfSU5URUdFUiAgICAgICAgICAgICAgIDB4MDEJLyogQnl0ZS9Xb3JkL0R3b3JkL1plcm8vT25lL09uZXMgKi8KICNkZWZpbmUgQUNQSV9UWVBFX1NUUklORyAgICAgICAgICAgICAgICAweDAyCiAjZGVmaW5lIEFDUElfVFlQRV9CVUZGRVIgICAgICAgICAgICAgICAgMHgwMwotI2RlZmluZSBBQ1BJX1RZUEVfUEFDS0FHRSAgICAgICAgICAgICAgIDB4MDQgIC8qIGJ5dGVfY29uc3QsIG11bHRpcGxlIGRhdGFfdGVybS9Db25zdGFudC9zdXBlcl9uYW1lICovCisjZGVmaW5lIEFDUElfVFlQRV9QQUNLQUdFICAgICAgICAgICAgICAgMHgwNAkvKiBieXRlX2NvbnN0LCBtdWx0aXBsZSBkYXRhX3Rlcm0vQ29uc3RhbnQvc3VwZXJfbmFtZSAqLwogI2RlZmluZSBBQ1BJX1RZUEVfRklFTERfVU5JVCAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgQUNQSV9UWVBFX0RFVklDRSAgICAgICAgICAgICAgICAweDA2ICAvKiBOYW1lLCBtdWx0aXBsZSBOb2RlICovCisjZGVmaW5lIEFDUElfVFlQRV9ERVZJQ0UgICAgICAgICAgICAgICAgMHgwNgkvKiBOYW1lLCBtdWx0aXBsZSBOb2RlICovCiAjZGVmaW5lIEFDUElfVFlQRV9FVkVOVCAgICAgICAgICAgICAgICAgMHgwNwotI2RlZmluZSBBQ1BJX1RZUEVfTUVUSE9EICAgICAgICAgICAgICAgIDB4MDggIC8qIE5hbWUsIGJ5dGVfY29uc3QsIG11bHRpcGxlIENvZGUgKi8KKyNkZWZpbmUgQUNQSV9UWVBFX01FVEhPRCAgICAgICAgICAgICAgICAweDA4CS8qIE5hbWUsIGJ5dGVfY29uc3QsIG11bHRpcGxlIENvZGUgKi8KICNkZWZpbmUgQUNQSV9UWVBFX01VVEVYICAgICAgICAgICAgICAgICAweDA5CiAjZGVmaW5lIEFDUElfVFlQRV9SRUdJT04gICAgICAgICAgICAgICAgMHgwQQotI2RlZmluZSBBQ1BJX1RZUEVfUE9XRVIgICAgICAgICAgICAgICAgIDB4MEIgIC8qIE5hbWUsYnl0ZV9jb25zdCx3b3JkX2NvbnN0LG11bHRpIE5vZGUgKi8KLSNkZWZpbmUgQUNQSV9UWVBFX1BST0NFU1NPUiAgICAgICAgICAgICAweDBDICAvKiBOYW1lLGJ5dGVfY29uc3QsRHdvcmRfY29uc3QsYnl0ZV9jb25zdCxtdWx0aSBubV9vICovCi0jZGVmaW5lIEFDUElfVFlQRV9USEVSTUFMICAgICAgICAgICAgICAgMHgwRCAgLyogTmFtZSwgbXVsdGlwbGUgTm9kZSAqLworI2RlZmluZSBBQ1BJX1RZUEVfUE9XRVIgICAgICAgICAgICAgICAgIDB4MEIJLyogTmFtZSxieXRlX2NvbnN0LHdvcmRfY29uc3QsbXVsdGkgTm9kZSAqLworI2RlZmluZSBBQ1BJX1RZUEVfUFJPQ0VTU09SICAgICAgICAgICAgIDB4MEMJLyogTmFtZSxieXRlX2NvbnN0LER3b3JkX2NvbnN0LGJ5dGVfY29uc3QsbXVsdGkgbm1fbyAqLworI2RlZmluZSBBQ1BJX1RZUEVfVEhFUk1BTCAgICAgICAgICAgICAgIDB4MEQJLyogTmFtZSwgbXVsdGlwbGUgTm9kZSAqLwogI2RlZmluZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEICAgICAgICAgIDB4MEUKICNkZWZpbmUgQUNQSV9UWVBFX0REQl9IQU5ETEUgICAgICAgICAgICAweDBGCiAjZGVmaW5lIEFDUElfVFlQRV9ERUJVR19PQkpFQ1QgICAgICAgICAgMHgxMApAQCAtNDUzLDE2ICs0NDQsMTYgQEAKICNkZWZpbmUgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRCAgICAweDExCiAjZGVmaW5lIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEICAgICAgMHgxMgogI2RlZmluZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQgICAgIDB4MTMKLSNkZWZpbmUgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSAgICAgICAweDE0ICAvKiBBcmcjLCBMb2NhbCMsIE5hbWUsIERlYnVnLCByZWZfb2YsIEluZGV4ICovCisjZGVmaW5lIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UgICAgICAgMHgxNAkvKiBBcmcjLCBMb2NhbCMsIE5hbWUsIERlYnVnLCByZWZfb2YsIEluZGV4ICovCiAjZGVmaW5lIEFDUElfVFlQRV9MT0NBTF9BTElBUyAgICAgICAgICAgMHgxNQogI2RlZmluZSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTICAgIDB4MTYKICNkZWZpbmUgQUNQSV9UWVBFX0xPQ0FMX05PVElGWSAgICAgICAgICAweDE3CiAjZGVmaW5lIEFDUElfVFlQRV9MT0NBTF9BRERSRVNTX0hBTkRMRVIgMHgxOAogI2RlZmluZSBBQ1BJX1RZUEVfTE9DQUxfUkVTT1VSQ0UgICAgICAgIDB4MTkKICNkZWZpbmUgQUNQSV9UWVBFX0xPQ0FMX1JFU09VUkNFX0ZJRUxEICAweDFBCi0jZGVmaW5lIEFDUElfVFlQRV9MT0NBTF9TQ09QRSAgICAgICAgICAgMHgxQiAgLyogMSBOYW1lLCBtdWx0aXBsZSBvYmplY3RfbGlzdCBOb2RlcyAqLworI2RlZmluZSBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUgICAgICAgICAgIDB4MUIJLyogMSBOYW1lLCBtdWx0aXBsZSBvYmplY3RfbGlzdCBOb2RlcyAqLwogCi0jZGVmaW5lIEFDUElfVFlQRV9OU19OT0RFX01BWCAgICAgICAgICAgMHgxQiAgLyogTGFzdCB0eXBlY29kZSB1c2VkIHdpdGhpbiBhIE5TIE5vZGUgKi8KKyNkZWZpbmUgQUNQSV9UWVBFX05TX05PREVfTUFYICAgICAgICAgICAweDFCCS8qIExhc3QgdHlwZWNvZGUgdXNlZCB3aXRoaW4gYSBOUyBOb2RlICovCiAKIC8qCiAgKiBUaGVzZSBhcmUgc3BlY2lhbCBvYmplY3QgdHlwZXMgdGhhdCBuZXZlciBhcHBlYXIgaW4KQEAgLTUwNiw3ICs0OTcsNyBAQAogI2RlZmluZSBBQ1BJX0JUWVBFX0RBVEEgICAgICAgICAgICAgICAgIChBQ1BJX0JUWVBFX0NPTVBVVEVfREFUQSAgfCBBQ1BJX0JUWVBFX1BBQ0tBR0UpCiAjZGVmaW5lIEFDUElfQlRZUEVfREFUQV9SRUZFUkVOQ0UgICAgICAgKEFDUElfQlRZUEVfREFUQSB8IEFDUElfQlRZUEVfUkVGRVJFTkNFIHwgQUNQSV9CVFlQRV9EREJfSEFORExFKQogI2RlZmluZSBBQ1BJX0JUWVBFX0RFVklDRV9PQkpFQ1RTICAgICAgIChBQ1BJX0JUWVBFX0RFVklDRSB8IEFDUElfQlRZUEVfVEhFUk1BTCB8IEFDUElfQlRZUEVfUFJPQ0VTU09SKQotI2RlZmluZSBBQ1BJX0JUWVBFX09CSkVDVFNfQU5EX1JFRlMgICAgIDB4MDAwMUZGRkYgIC8qIEFSRyBvciBMT0NBTCAqLworI2RlZmluZSBBQ1BJX0JUWVBFX09CSkVDVFNfQU5EX1JFRlMgICAgIDB4MDAwMUZGRkYJLyogQVJHIG9yIExPQ0FMICovCiAjZGVmaW5lIEFDUElfQlRZUEVfQUxMX09CSkVDVFMgICAgICAgICAgMHgwMDAwRkZGRgogCiAvKgpAQCAtNTE5LDcgKzUxMCw3IEBACiAvKgogICogRXZlbnQgVHlwZXM6IEZpeGVkICYgR2VuZXJhbCBQdXJwb3NlCiAgKi8KLXR5cGVkZWYgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZXZlbnRfdHlwZTsKK3R5cGVkZWYgdTMyIGFjcGlfZXZlbnRfdHlwZTsKIAogLyoKICAqIEZpeGVkIGV2ZW50cwpAQCAtNTQ3LDcgKzUzOCw3IEBACiAgKiAgICAgICAgICB8ICAgICArLS0tLS0gU2V0PwogICogICAgICAgICAgKy0tLS0tLS0tLS0tIDxSZXNlcnZlZD4KICAqLwotdHlwZWRlZiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9ldmVudF9zdGF0dXM7Cit0eXBlZGVmIHUzMiBhY3BpX2V2ZW50X3N0YXR1czsKIAogI2RlZmluZSBBQ1BJX0VWRU5UX0ZMQUdfRElTQUJMRUQgICAgICAgIChhY3BpX2V2ZW50X3N0YXR1cykgMHgwMAogI2RlZmluZSBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFRCAgICAgICAgIChhY3BpX2V2ZW50X3N0YXR1cykgMHgwMQpAQCAtNTY0LDcgKzU1NSw2IEBACiAjZGVmaW5lIEFDUElfR1BFX0VOQUJMRSAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBQ1BJX0dQRV9ESVNBQkxFICAgICAgICAgICAgICAgIDEKIAotCiAvKgogICogR1BFIGluZm8gZmxhZ3MgLSBQZXIgR1BFCiAgKiArLSstKy0rLS0tKy0tLSstKwpAQCAtNTg1LDIyICs1NzUsMjIgQEAKICNkZWZpbmUgQUNQSV9HUEVfVFlQRV9NQVNLICAgICAgICAgICAgICAodTgpIDB4MDYKICNkZWZpbmUgQUNQSV9HUEVfVFlQRV9XQUtFX1JVTiAgICAgICAgICAodTgpIDB4MDYKICNkZWZpbmUgQUNQSV9HUEVfVFlQRV9XQUtFICAgICAgICAgICAgICAodTgpIDB4MDIKLSNkZWZpbmUgQUNQSV9HUEVfVFlQRV9SVU5USU1FICAgICAgICAgICAodTgpIDB4MDQgICAgLyogRGVmYXVsdCAqLworI2RlZmluZSBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUgICAgICAgICAgICh1OCkgMHgwNAkvKiBEZWZhdWx0ICovCiAKICNkZWZpbmUgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSyAgICAgICAgICAodTgpIDB4MTgKICNkZWZpbmUgQUNQSV9HUEVfRElTUEFUQ0hfSEFORExFUiAgICAgICAodTgpIDB4MDgKICNkZWZpbmUgQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EICAgICAgICAodTgpIDB4MTAKLSNkZWZpbmUgQUNQSV9HUEVfRElTUEFUQ0hfTk9UX1VTRUQgICAgICAodTgpIDB4MDAgICAgLyogRGVmYXVsdCAqLworI2RlZmluZSBBQ1BJX0dQRV9ESVNQQVRDSF9OT1RfVVNFRCAgICAgICh1OCkgMHgwMAkvKiBEZWZhdWx0ICovCiAKICNkZWZpbmUgQUNQSV9HUEVfUlVOX0VOQUJMRV9NQVNLICAgICAgICAodTgpIDB4MjAKICNkZWZpbmUgQUNQSV9HUEVfUlVOX0VOQUJMRUQgICAgICAgICAgICAodTgpIDB4MjAKLSNkZWZpbmUgQUNQSV9HUEVfUlVOX0RJU0FCTEVEICAgICAgICAgICAodTgpIDB4MDAgICAgLyogRGVmYXVsdCAqLworI2RlZmluZSBBQ1BJX0dQRV9SVU5fRElTQUJMRUQgICAgICAgICAgICh1OCkgMHgwMAkvKiBEZWZhdWx0ICovCiAKICNkZWZpbmUgQUNQSV9HUEVfV0FLRV9FTkFCTEVfTUFTSyAgICAgICAodTgpIDB4NDAKICNkZWZpbmUgQUNQSV9HUEVfV0FLRV9FTkFCTEVEICAgICAgICAgICAodTgpIDB4NDAKLSNkZWZpbmUgQUNQSV9HUEVfV0FLRV9ESVNBQkxFRCAgICAgICAgICAodTgpIDB4MDAgICAgLyogRGVmYXVsdCAqLworI2RlZmluZSBBQ1BJX0dQRV9XQUtFX0RJU0FCTEVEICAgICAgICAgICh1OCkgMHgwMAkvKiBEZWZhdWx0ICovCiAKLSNkZWZpbmUgQUNQSV9HUEVfRU5BQkxFX01BU0sgICAgICAgICAgICAodTgpIDB4NjAgICAgLyogQm90aCBydW4vd2FrZSAqLworI2RlZmluZSBBQ1BJX0dQRV9FTkFCTEVfTUFTSyAgICAgICAgICAgICh1OCkgMHg2MAkvKiBCb3RoIHJ1bi93YWtlICovCiAKICNkZWZpbmUgQUNQSV9HUEVfU1lTVEVNX01BU0sgICAgICAgICAgICAodTgpIDB4ODAKICNkZWZpbmUgQUNQSV9HUEVfU1lTVEVNX1JVTk5JTkcgICAgICAgICAodTgpIDB4ODAKQEAgLTYwOSwxMyArNTk5LDEyIEBACiAvKgogICogRmxhZ3MgZm9yIEdQRSBhbmQgTG9jayBpbnRlcmZhY2VzCiAgKi8KLSNkZWZpbmUgQUNQSV9FVkVOVF9XQUtFX0VOQUJMRSAgICAgICAgICAweDIgICAgICAgICAgICAgLyogYWNwaV9ncGVfZW5hYmxlICovCi0jZGVmaW5lIEFDUElfRVZFTlRfV0FLRV9ESVNBQkxFICAgICAgICAgMHgyICAgICAgICAgICAgIC8qIGFjcGlfZ3BlX2Rpc2FibGUgKi8KKyNkZWZpbmUgQUNQSV9FVkVOVF9XQUtFX0VOQUJMRSAgICAgICAgICAweDIJLyogYWNwaV9ncGVfZW5hYmxlICovCisjZGVmaW5lIEFDUElfRVZFTlRfV0FLRV9ESVNBQkxFICAgICAgICAgMHgyCS8qIGFjcGlfZ3BlX2Rpc2FibGUgKi8KIAogI2RlZmluZSBBQ1BJX05PVF9JU1IgICAgICAgICAgICAgICAgICAgIDB4MQogI2RlZmluZSBBQ1BJX0lTUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MAogCi0KIC8qIE5vdGlmeSB0eXBlcyAqLwogCiAjZGVmaW5lIEFDUElfU1lTVEVNX05PVElGWSAgICAgICAgICAgICAgMHgxCkBAIC02MjUsMTAgKzYxNCw5IEBACiAKICNkZWZpbmUgQUNQSV9NQVhfU1lTX05PVElGWSAgICAgICAgICAgICAweDdmCiAKLQogLyogQWRkcmVzcyBTcGFjZSAoT3BlcmF0aW9uIFJlZ2lvbikgVHlwZXMgKi8KIAotdHlwZWRlZiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9hZHJfc3BhY2VfdHlwZTsKK3R5cGVkZWYgdTggYWNwaV9hZHJfc3BhY2VfdHlwZTsKIAogI2RlZmluZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZICAgIChhY3BpX2Fkcl9zcGFjZV90eXBlKSAwCiAjZGVmaW5lIEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTyAgICAgICAgKGFjcGlfYWRyX3NwYWNlX3R5cGUpIDEKQEAgLTY0MCw3ICs2MjgsNiBAQAogI2RlZmluZSBBQ1BJX0FEUl9TUEFDRV9EQVRBX1RBQkxFICAgICAgIChhY3BpX2Fkcl9zcGFjZV90eXBlKSA3CiAjZGVmaW5lIEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFICAgKGFjcGlfYWRyX3NwYWNlX3R5cGUpIDEyNwogCi0KIC8qCiAgKiBiaXRfcmVnaXN0ZXIgSURzCiAgKiBUaGVzZSBhcmUgYml0ZmllbGRzIGRlZmluZWQgd2l0aGluIHRoZSBmdWxsIEFDUEkgcmVnaXN0ZXJzCkBAIC02NzQsNzQgKzY2MSw2MiBAQAogI2RlZmluZSBBQ1BJX0JJVFJFR19NQVggICAgICAgICAgICAgICAgICAgICAgICAgMHgxNQogI2RlZmluZSBBQ1BJX05VTV9CSVRSRUcgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9CSVRSRUdfTUFYICsgMQogCi0KIC8qCiAgKiBFeHRlcm5hbCBBQ1BJIG9iamVjdCBkZWZpbml0aW9uCiAgKi8KLXVuaW9uIGFjcGlfb2JqZWN0Ci17Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAgICAgdHlwZTsgICAvKiBTZWUgZGVmaW5pdGlvbiBvZiBhY3BpX25zX3R5cGUgZm9yIHZhbHVlcyAqLwotCXN0cnVjdAotCXsKLQkJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQkJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7ICAgICAgLyogVGhlIGFjdHVhbCBudW1iZXIgKi8KK3VuaW9uIGFjcGlfb2JqZWN0IHsKKwlhY3BpX29iamVjdF90eXBlIHR5cGU7CS8qIFNlZSBkZWZpbml0aW9uIG9mIGFjcGlfbnNfdHlwZSBmb3IgdmFsdWVzICovCisJc3RydWN0IHsKKwkJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCQlhY3BpX2ludGVnZXIgdmFsdWU7CS8qIFRoZSBhY3R1YWwgbnVtYmVyICovCiAJfSBpbnRlZ2VyOwogCi0Jc3RydWN0Ci0JewotCQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgICAgICB0eXBlOwotCQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7ICAgICAvKiAjIG9mIGJ5dGVzIGluIHN0cmluZywgZXhjbHVkaW5nIHRyYWlsaW5nIG51bGwgKi8KLQkJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvaW50ZXI7ICAgLyogcG9pbnRzIHRvIHRoZSBzdHJpbmcgdmFsdWUgKi8KKwlzdHJ1Y3QgeworCQlhY3BpX29iamVjdF90eXBlIHR5cGU7CisJCXUzMiBsZW5ndGg7CS8qICMgb2YgYnl0ZXMgaW4gc3RyaW5nLCBleGNsdWRpbmcgdHJhaWxpbmcgbnVsbCAqLworCQljaGFyICpwb2ludGVyOwkvKiBwb2ludHMgdG8gdGhlIHN0cmluZyB2YWx1ZSAqLwogCX0gc3RyaW5nOwogCi0Jc3RydWN0Ci0JewotCQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgICAgICB0eXBlOwotCQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7ICAgICAvKiAjIG9mIGJ5dGVzIGluIGJ1ZmZlciAqLwotCQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9pbnRlcjsgICAvKiBwb2ludHMgdG8gdGhlIGJ1ZmZlciAqLworCXN0cnVjdCB7CisJCWFjcGlfb2JqZWN0X3R5cGUgdHlwZTsKKwkJdTMyIGxlbmd0aDsJLyogIyBvZiBieXRlcyBpbiBidWZmZXIgKi8KKwkJdTggKnBvaW50ZXI7CS8qIHBvaW50cyB0byB0aGUgYnVmZmVyICovCiAJfSBidWZmZXI7CiAKLQlzdHJ1Y3QKLQl7Ci0JCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0JCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwxOwotCQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU7ICAgICAvKiBvYmplY3QgcmVmZXJlbmNlICovCisJc3RydWN0IHsKKwkJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCQl1MzIgZmlsbDE7CisJCWFjcGlfaGFuZGxlIGhhbmRsZTsJLyogb2JqZWN0IHJlZmVyZW5jZSAqLwogCX0gcmVmZXJlbmNlOwogCi0Jc3RydWN0Ci0JewotCQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgICAgICB0eXBlOwotCQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDsgICAgICAvKiAjIG9mIGVsZW1lbnRzIGluIHBhY2thZ2UgKi8KLQkJdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAgICAgKmVsZW1lbnRzOyAgLyogUG9pbnRlciB0byBhbiBhcnJheSBvZiBBQ1BJX09CSkVDVHMgKi8KKwlzdHJ1Y3QgeworCQlhY3BpX29iamVjdF90eXBlIHR5cGU7CisJCXUzMiBjb3VudDsJLyogIyBvZiBlbGVtZW50cyBpbiBwYWNrYWdlICovCisJCXVuaW9uIGFjcGlfb2JqZWN0ICplbGVtZW50czsJLyogUG9pbnRlciB0byBhbiBhcnJheSBvZiBBQ1BJX09CSkVDVHMgKi8KIAl9IHBhY2thZ2U7CiAKLQlzdHJ1Y3QKLQl7Ci0JCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0JCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfaWQ7Ci0JCWFjcGlfaW9fYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgIHBibGtfYWRkcmVzczsKLQkJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJsa19sZW5ndGg7CisJc3RydWN0IHsKKwkJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCQl1MzIgcHJvY19pZDsKKwkJYWNwaV9pb19hZGRyZXNzIHBibGtfYWRkcmVzczsKKwkJdTMyIHBibGtfbGVuZ3RoOwogCX0gcHJvY2Vzc29yOwogCi0Jc3RydWN0Ci0JewotCQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgICAgICB0eXBlOwotCQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbGV2ZWw7Ci0JCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX29yZGVyOworCXN0cnVjdCB7CisJCWFjcGlfb2JqZWN0X3R5cGUgdHlwZTsKKwkJdTMyIHN5c3RlbV9sZXZlbDsKKwkJdTMyIHJlc291cmNlX29yZGVyOwogCX0gcG93ZXJfcmVzb3VyY2U7CiB9OwogCi0KIC8qCiAgKiBMaXN0IG9mIG9iamVjdHMsIHVzZWQgYXMgYSBwYXJhbWV0ZXIgbGlzdCBmb3IgY29udHJvbCBtZXRob2QgZXZhbHVhdGlvbgogICovCi1zdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OwotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgICAgICpwb2ludGVyOworc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgeworCXUzMiBjb3VudDsKKwl1bmlvbiBhY3BpX29iamVjdCAqcG9pbnRlcjsKIH07CiAKLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29tbW9uIERhdGEgU3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBpbnRlcmZhY2VzCiAgKi8KQEAgLTc0OSwxMyArNzI0LDExIEBACiAjZGVmaW5lIEFDUElfQUxMT0NBVEVfQlVGRkVSICAgICAgICAoYWNwaV9zaXplKSAoLTEpCiAjZGVmaW5lIEFDUElfQUxMT0NBVEVfTE9DQUxfQlVGRkVSICAoYWNwaV9zaXplKSAoLTIpCiAKLXN0cnVjdCBhY3BpX2J1ZmZlcgotewotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsgICAgICAgICAvKiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciAqLwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2ludGVyOyAgICAgICAvKiBwb2ludGVyIHRvIGJ1ZmZlciAqLworc3RydWN0IGFjcGlfYnVmZmVyIHsKKwlhY3BpX3NpemUgbGVuZ3RoOwkvKiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciAqLworCXZvaWQgKnBvaW50ZXI7CQkvKiBwb2ludGVyIHRvIGJ1ZmZlciAqLwogfTsKIAotCiAvKgogICogbmFtZV90eXBlIGZvciBhY3BpX2dldF9uYW1lCiAgKi8KQEAgLTc2Myw3ICs3MzYsNiBAQAogI2RlZmluZSBBQ1BJX1NJTkdMRV9OQU1FICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgQUNQSV9OQU1FX1RZUEVfTUFYICAgICAgICAgICAgICAxCiAKLQogLyoKICAqIFN0cnVjdHVyZSBhbmQgZmxhZ3MgZm9yIGFjcGlfZ2V0X3N5c3RlbV9pbmZvCiAgKi8KQEAgLTc3MiwxMzkgKzc0NCwxMDYgQEAKICNkZWZpbmUgQUNQSV9TWVNfTU9ERV9MRUdBQ1kgICAgICAgICAgICAweDAwMDIKICNkZWZpbmUgQUNQSV9TWVNfTU9ERVNfTUFTSyAgICAgICAgICAgICAweDAwMDMKIAotCiAvKgogICogQUNQSSBUYWJsZSBJbmZvLiAgT25lIHBlciBBQ1BJIHRhYmxlIF90eXBlXwogICovCi1zdHJ1Y3QgYWNwaV90YWJsZV9pbmZvCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7CitzdHJ1Y3QgYWNwaV90YWJsZV9pbmZvIHsKKwl1MzIgY291bnQ7CiB9OwogCi0KIC8qCiAgKiBTeXN0ZW0gaW5mbyByZXR1cm5lZCBieSBhY3BpX2dldF9zeXN0ZW1faW5mbygpCiAgKi8KLXN0cnVjdCBhY3BpX3N5c3RlbV9pbmZvCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9jYV92ZXJzaW9uOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyX3Jlc29sdXRpb247Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19sZXZlbDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19sYXllcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdGFibGVfdHlwZXM7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaW5mbyAgICAgICAgICAgICAgdGFibGVfaW5mbyBbTlVNX0FDUElfVEFCTEVfVFlQRVNdOworc3RydWN0IGFjcGlfc3lzdGVtX2luZm8geworCXUzMiBhY3BpX2NhX3ZlcnNpb247CisJdTMyIGZsYWdzOworCXUzMiB0aW1lcl9yZXNvbHV0aW9uOworCXUzMiByZXNlcnZlZDE7CisJdTMyIHJlc2VydmVkMjsKKwl1MzIgZGVidWdfbGV2ZWw7CisJdTMyIGRlYnVnX2xheWVyOworCXUzMiBudW1fdGFibGVfdHlwZXM7CisJc3RydWN0IGFjcGlfdGFibGVfaW5mbyB0YWJsZV9pbmZvW05VTV9BQ1BJX1RBQkxFX1RZUEVTXTsKIH07CiAKLQogLyoKICAqIFR5cGVzIHNwZWNpZmljIHRvIHRoZSBPUyBzZXJ2aWNlIGludGVyZmFjZXMKICAqLwotdHlwZWRlZiB1MzIKLShBQ1BJX1NZU1RFTV9YRkFDRSAqYWNwaV9vc2RfaGFuZGxlcikgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwordHlwZWRlZiB1MzIoQUNQSV9TWVNURU1fWEZBQ0UgKiBhY3BpX29zZF9oYW5kbGVyKSAodm9pZCAqY29udGV4dCk7CiAKIHR5cGVkZWYgdm9pZAotKEFDUElfU1lTVEVNX1hGQUNFICphY3BpX29zZF9leGVjX2NhbGxiYWNrKSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CisgKEFDUElfU1lTVEVNX1hGQUNFICogYWNwaV9vc2RfZXhlY19jYWxsYmFjaykgKHZvaWQgKmNvbnRleHQpOwogCiAvKgogICogVmFyaW91cyBoYW5kbGVycyBhbmQgY2FsbGJhY2sgcHJvY2VkdXJlcwogICovCi10eXBlZGVmCi11MzIgKCphY3BpX2V2ZW50X2hhbmRsZXIpICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Cit0eXBlZGVmIHUzMigqYWNwaV9ldmVudF9oYW5kbGVyKSAodm9pZCAqY29udGV4dCk7CiAKIHR5cGVkZWYKLXZvaWQgKCphY3BpX25vdGlmeV9oYW5kbGVyKSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK3ZvaWQgKCphY3BpX25vdGlmeV9oYW5kbGVyKSAoYWNwaV9oYW5kbGUgZGV2aWNlLCB1MzIgdmFsdWUsIHZvaWQgKmNvbnRleHQpOwogCiB0eXBlZGVmCi12b2lkICgqYWNwaV9vYmplY3RfaGFuZGxlcikgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Cit2b2lkICgqYWNwaV9vYmplY3RfaGFuZGxlcikgKGFjcGlfaGFuZGxlIG9iamVjdCwgdTMyIGZ1bmN0aW9uLCB2b2lkICpkYXRhKTsKIAotdHlwZWRlZgotYWNwaV9zdGF0dXMgKCphY3BpX2luaXRfaGFuZGxlcikgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbik7Cit0eXBlZGVmIGFjcGlfc3RhdHVzKCphY3BpX2luaXRfaGFuZGxlcikgKGFjcGlfaGFuZGxlIG9iamVjdCwgdTMyIGZ1bmN0aW9uKTsKIAogI2RlZmluZSBBQ1BJX0lOSVRfREVWSUNFX0lOSSAgICAgICAgMQogCiB0eXBlZGVmCi1hY3BpX3N0YXR1cyAoKmFjcGlfZXhjZXB0aW9uX2hhbmRsZXIpICgKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIGFtbF9zdGF0dXMsCi0JYWNwaV9uYW1lICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX29mZnNldCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQorYWNwaV9zdGF0dXMoKmFjcGlfZXhjZXB0aW9uX2hhbmRsZXIpIChhY3BpX3N0YXR1cyBhbWxfc3RhdHVzLAorCQkJCSAgICAgIGFjcGlfbmFtZSBuYW1lLAorCQkJCSAgICAgIHUxNiBvcGNvZGUsCisJCQkJICAgICAgdTMyIGFtbF9vZmZzZXQsIHZvaWQgKmNvbnRleHQpOwogCiAvKiBBZGRyZXNzIFNwYWNlcyAoRm9yIE9wZXJhdGlvbiBSZWdpb25zKSAqLwogCiB0eXBlZGVmCi1hY3BpX3N0YXR1cyAoKmFjcGlfYWRyX3NwYWNlX2hhbmRsZXIpICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW9uX2NvbnRleHQpOworYWNwaV9zdGF0dXMoKmFjcGlfYWRyX3NwYWNlX2hhbmRsZXIpICh1MzIgZnVuY3Rpb24sCisJCQkJICAgICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJICAgICAgdTMyIGJpdF93aWR0aCwKKwkJCQkgICAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCQkgICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsCisJCQkJICAgICAgdm9pZCAqcmVnaW9uX2NvbnRleHQpOwogCiAjZGVmaW5lIEFDUElfREVGQVVMVF9IQU5ETEVSICAgICAgICBOVUxMCiAKLQogdHlwZWRlZgotYWNwaV9zdGF0dXMgKCphY3BpX2Fkcl9zcGFjZV9zZXR1cCkgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlZ2lvbl9jb250ZXh0KTsKK2FjcGlfc3RhdHVzKCphY3BpX2Fkcl9zcGFjZV9zZXR1cCkgKGFjcGlfaGFuZGxlIHJlZ2lvbl9oYW5kbGUsCisJCQkJICAgIHUzMiBmdW5jdGlvbiwKKwkJCQkgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LAorCQkJCSAgICB2b2lkICoqcmVnaW9uX2NvbnRleHQpOwogCiAjZGVmaW5lIEFDUElfUkVHSU9OX0FDVElWQVRFICAgIDAKICNkZWZpbmUgQUNQSV9SRUdJT05fREVBQ1RJVkFURSAgMQogCiB0eXBlZGVmCi1hY3BpX3N0YXR1cyAoKmFjcGlfd2Fsa19jYWxsYmFjaykgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KK2FjcGlfc3RhdHVzKCphY3BpX3dhbGtfY2FsbGJhY2spIChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJCSAgdTMyIG5lc3RpbmdfbGV2ZWwsCisJCQkJICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKIAogLyogSW50ZXJydXB0IGhhbmRsZXIgcmV0dXJuIHZhbHVlcyAqLwogCiAjZGVmaW5lIEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEICAgICAgMHgwMAogI2RlZmluZSBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEICAgICAgICAgIDB4MDEKIAotCiAvKiBDb21tb24gc3RyaW5nIHZlcnNpb24gb2YgZGV2aWNlIEhJRHMgYW5kIFVJRHMgKi8KIAotc3RydWN0IGFjcGlfZGV2aWNlX2lkCi17Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtBQ1BJX0RFVklDRV9JRF9MRU5HVEhdOworc3RydWN0IGFjcGlfZGV2aWNlX2lkIHsKKwljaGFyIHZhbHVlW0FDUElfREVWSUNFX0lEX0xFTkdUSF07CiB9OwogCiAvKiBDb21tb24gc3RyaW5nIHZlcnNpb24gb2YgZGV2aWNlIENJRHMgKi8KIAotc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZAotewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVbQUNQSV9NQVhfQ0lEX0xFTkdUSF07CitzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkIHsKKwljaGFyIHZhbHVlW0FDUElfTUFYX0NJRF9MRU5HVEhdOwogfTsKIAotc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0Ci17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU7Ci0Jc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZCAgICAgICBpZFsxXTsKK3N0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCB7CisJdTMyIGNvdW50OworCXUzMiBzaXplOworCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWQgaWRbMV07CiB9OwogCi0KIC8qIFN0cnVjdHVyZSBhbmQgZmxhZ3MgZm9yIGFjcGlfZ2V0X29iamVjdF9pbmZvICovCiAKICNkZWZpbmUgQUNQSV9WQUxJRF9TVEEgICAgICAgICAgICAgICAgICAweDAwMDEKQEAgLTkxNCw1NSArODUzLDQ1IEBACiAjZGVmaW5lIEFDUElfVkFMSURfQ0lEICAgICAgICAgICAgICAgICAgMHgwMDEwCiAjZGVmaW5lIEFDUElfVkFMSURfU1hEUyAgICAgICAgICAgICAgICAgMHgwMDIwCiAKLQogI2RlZmluZSBBQ1BJX0NPTU1PTl9PQkpfSU5GTyBcCiAJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAgICAgdHlwZTsgICAgICAgICAgIC8qIEFDUEkgb2JqZWN0IHR5cGUgKi8gXAotCWFjcGlfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAvKiBBQ1BJIG9iamVjdCBOYW1lICovCisJYWNwaV9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZQkvKiBBQ1BJIG9iamVjdCBOYW1lICovCiAKLQotc3RydWN0IGFjcGlfb2JqX2luZm9faGVhZGVyCi17CitzdHJ1Y3QgYWNwaV9vYmpfaW5mb19oZWFkZXIgewogCUFDUElfQ09NTU9OX09CSl9JTkZPOwogfTsKIAotCiAvKiBTdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBHZXQgT2JqZWN0IEluZm8gKi8KIAotc3RydWN0IGFjcGlfZGV2aWNlX2luZm8KLXsKK3N0cnVjdCBhY3BpX2RldmljZV9pbmZvIHsKIAlBQ1BJX0NPTU1PTl9PQkpfSU5GTzsKIAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkOyAgICAgICAgICAgICAgLyogSW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBiZWxvdyBhcmUgdmFsaWQgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3N0YXR1czsgICAgIC8qIF9TVEEgdmFsdWUgKi8KLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOyAgICAgICAgICAgIC8qIF9BRFIgdmFsdWUgaWYgYW55ICovCi0Jc3RydWN0IGFjcGlfZGV2aWNlX2lkICAgICAgICAgICAgICAgaGFyZHdhcmVfaWQ7ICAgICAgICAvKiBfSElEIHZhbHVlIGlmIGFueSAqLwotCXN0cnVjdCBhY3BpX2RldmljZV9pZCAgICAgICAgICAgICAgIHVuaXF1ZV9pZDsgICAgICAgICAgLyogX1VJRCB2YWx1ZSBpZiBhbnkgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoZXN0X2RzdGF0ZXNbNF07IC8qIF9zeF9kIHZhbHVlczogMHhGRiBpbmRpY2F0ZXMgbm90IHZhbGlkICovCi0Jc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICAgICAgY29tcGF0aWJpbGl0eV9pZDsgICAvKiBMaXN0IG9mIF9DSURzIGlmIGFueSAqLworCXUzMiB2YWxpZDsJCS8qIEluZGljYXRlcyB3aGljaCBmaWVsZHMgYmVsb3cgYXJlIHZhbGlkICovCisJdTMyIGN1cnJlbnRfc3RhdHVzOwkvKiBfU1RBIHZhbHVlICovCisJYWNwaV9pbnRlZ2VyIGFkZHJlc3M7CS8qIF9BRFIgdmFsdWUgaWYgYW55ICovCisJc3RydWN0IGFjcGlfZGV2aWNlX2lkIGhhcmR3YXJlX2lkOwkvKiBfSElEIHZhbHVlIGlmIGFueSAqLworCXN0cnVjdCBhY3BpX2RldmljZV9pZCB1bmlxdWVfaWQ7CS8qIF9VSUQgdmFsdWUgaWYgYW55ICovCisJdTggaGlnaGVzdF9kc3RhdGVzWzRdOwkvKiBfc3hfZCB2YWx1ZXM6IDB4RkYgaW5kaWNhdGVzIG5vdCB2YWxpZCAqLworCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCBjb21wYXRpYmlsaXR5X2lkOwkvKiBMaXN0IG9mIF9DSURzIGlmIGFueSAqLwogfTsKIAotCiAvKiBDb250ZXh0IHN0cnVjdHMgZm9yIGFkZHJlc3Mgc3BhY2UgaGFuZGxlcnMgKi8KIAotc3RydWN0IGFjcGlfcGNpX2lkCi17Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXM7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOworc3RydWN0IGFjcGlfcGNpX2lkIHsKKwl1MTYgc2VnbWVudDsKKwl1MTYgYnVzOworCXUxNiBkZXZpY2U7CisJdTE2IGZ1bmN0aW9uOwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9tZW1fc3BhY2VfY29udGV4dAotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgICAgICBhZGRyZXNzOwotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgICAgIG1hcHBlZF9waHlzaWNhbF9hZGRyZXNzOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptYXBwZWRfbG9naWNhbF9hZGRyZXNzOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF9sZW5ndGg7CitzdHJ1Y3QgYWNwaV9tZW1fc3BhY2VfY29udGV4dCB7CisJdTMyIGxlbmd0aDsKKwlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzczsKKwlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgbWFwcGVkX3BoeXNpY2FsX2FkZHJlc3M7CisJdTggKm1hcHBlZF9sb2dpY2FsX2FkZHJlc3M7CisJYWNwaV9zaXplIG1hcHBlZF9sZW5ndGg7CiB9OwogCi0KIC8qCiAgKiBEZWZpbml0aW9ucyBmb3IgUmVzb3VyY2UgQXR0cmlidXRlcwogICovCkBAIC05OTIsOCArOTIxLDggQEAKIC8qCiAgKiAgSU8gUG9ydCBEZXNjcmlwdG9yIERlY29kZQogICovCi0jZGVmaW5lIEFDUElfREVDT0RFXzEwICAgICAgICAgICAgICAgICAgKHU4KSAweDAwICAgIC8qIDEwLWJpdCBJTyBhZGRyZXNzIGRlY29kZSAqLwotI2RlZmluZSBBQ1BJX0RFQ09ERV8xNiAgICAgICAgICAgICAgICAgICh1OCkgMHgwMSAgICAvKiAxNi1iaXQgSU8gYWRkcmVzcyBkZWNvZGUgKi8KKyNkZWZpbmUgQUNQSV9ERUNPREVfMTAgICAgICAgICAgICAgICAgICAodTgpIDB4MDAJLyogMTAtYml0IElPIGFkZHJlc3MgZGVjb2RlICovCisjZGVmaW5lIEFDUElfREVDT0RFXzE2ICAgICAgICAgICAgICAgICAgKHU4KSAweDAxCS8qIDE2LWJpdCBJTyBhZGRyZXNzIGRlY29kZSAqLwogCiAvKgogICogIElSUSBBdHRyaWJ1dGVzCkBAIC0xMDQ1LDMyICs5NzQsMjggQEAKICNkZWZpbmUgQUNQSV9QUk9EVUNFUiAgICAgICAgICAgICAgICAgICAodTgpIDB4MDAKICNkZWZpbmUgQUNQSV9DT05TVU1FUiAgICAgICAgICAgICAgICAgICAodTgpIDB4MDEKIAotCiAvKgogICogIFN0cnVjdHVyZXMgdXNlZCB0byBkZXNjcmliZSBkZXZpY2UgcmVzb3VyY2VzCiAgKi8KLXN0cnVjdCBhY3BpX3Jlc291cmNlX2lycQotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VfbGV2ZWw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlX2hpZ2hfbG93OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9leGNsdXNpdmU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2ludGVycnVwdHM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0c1sxXTsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2lycSB7CisJdTMyIGVkZ2VfbGV2ZWw7CisJdTMyIGFjdGl2ZV9oaWdoX2xvdzsKKwl1MzIgc2hhcmVkX2V4Y2x1c2l2ZTsKKwl1MzIgbnVtYmVyX29mX2ludGVycnVwdHM7CisJdTMyIGludGVycnVwdHNbMV07CiB9OwogCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19tYXN0ZXI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2NoYW5uZWxzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzWzFdOworc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hIHsKKwl1MzIgdHlwZTsKKwl1MzIgYnVzX21hc3RlcjsKKwl1MzIgdHJhbnNmZXI7CisJdTMyIG51bWJlcl9vZl9jaGFubmVsczsKKwl1MzIgY2hhbm5lbHNbMV07CiB9OwogCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kcGYKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5X3ByaW9yaXR5OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlX3JvYnVzdG5lc3M7CitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kcGYgeworCXUzMiBjb21wYXRpYmlsaXR5X3ByaW9yaXR5OworCXUzMiBwZXJmb3JtYW5jZV9yb2J1c3RuZXNzOwogfTsKIAogLyoKQEAgLTEwNzgsMTUwICsxMDAzLDEyOCBAQAogICogbmVlZGVkIGJlY2F1c2UgaXQgaGFzIG5vIGZpZWxkcwogICovCiAKLXN0cnVjdCBhY3BpX3Jlc291cmNlX2lvCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9fZGVjb2RlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9iYXNlX2FkZHJlc3M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Jhc2VfYWRkcmVzczsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfbGVuZ3RoOworc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8geworCXUzMiBpb19kZWNvZGU7CisJdTMyIG1pbl9iYXNlX2FkZHJlc3M7CisJdTMyIG1heF9iYXNlX2FkZHJlc3M7CisJdTMyIGFsaWdubWVudDsKKwl1MzIgcmFuZ2VfbGVuZ3RoOwogfTsKIAotc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8KLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2FkZHJlc3M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfbGVuZ3RoOworc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8geworCXUzMiBiYXNlX2FkZHJlc3M7CisJdTMyIHJhbmdlX2xlbmd0aDsKIH07CiAKLXN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcgotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZFsxXTsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvciB7CisJdTMyIGxlbmd0aDsKKwl1OCByZXNlcnZlZFsxXTsKIH07CiAKLXN0cnVjdCBhY3BpX3Jlc291cmNlX2VuZF90YWcKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bTsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2VuZF90YWcgeworCXU4IGNoZWNrc3VtOwogfTsKIAotc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3dyaXRlX2F0dHJpYnV0ZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYmFzZV9hZGRyZXNzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9iYXNlX2FkZHJlc3M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX2xlbmd0aDsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX21lbTI0IHsKKwl1MzIgcmVhZF93cml0ZV9hdHRyaWJ1dGU7CisJdTMyIG1pbl9iYXNlX2FkZHJlc3M7CisJdTMyIG1heF9iYXNlX2FkZHJlc3M7CisJdTMyIGFsaWdubWVudDsKKwl1MzIgcmFuZ2VfbGVuZ3RoOwogfTsKIAotc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3dyaXRlX2F0dHJpYnV0ZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYmFzZV9hZGRyZXNzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9iYXNlX2FkZHJlc3M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX2xlbmd0aDsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX21lbTMyIHsKKwl1MzIgcmVhZF93cml0ZV9hdHRyaWJ1dGU7CisJdTMyIG1pbl9iYXNlX2FkZHJlc3M7CisJdTMyIG1heF9iYXNlX2FkZHJlc3M7CisJdTMyIGFsaWdubWVudDsKKwl1MzIgcmFuZ2VfbGVuZ3RoOwogfTsKIAotc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3dyaXRlX2F0dHJpYnV0ZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9iYXNlX2FkZHJlc3M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfbGVuZ3RoOworc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIgeworCXUzMiByZWFkX3dyaXRlX2F0dHJpYnV0ZTsKKwl1MzIgcmFuZ2VfYmFzZV9hZGRyZXNzOworCXUzMiByYW5nZV9sZW5ndGg7CiB9OwogCi1zdHJ1Y3QgYWNwaV9tZW1vcnlfYXR0cmlidXRlCi17Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVfYXR0cmlidXRlOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfd3JpdGVfYXR0cmlidXRlOworc3RydWN0IGFjcGlfbWVtb3J5X2F0dHJpYnV0ZSB7CisJdTE2IGNhY2hlX2F0dHJpYnV0ZTsKKwl1MTYgcmVhZF93cml0ZV9hdHRyaWJ1dGU7CiB9OwogCi1zdHJ1Y3QgYWNwaV9pb19hdHRyaWJ1dGUKLXsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9hdHRyaWJ1dGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25fYXR0cmlidXRlOworc3RydWN0IGFjcGlfaW9fYXR0cmlidXRlIHsKKwl1MTYgcmFuZ2VfYXR0cmlidXRlOworCXUxNiB0cmFuc2xhdGlvbl9hdHRyaWJ1dGU7CiB9OwogCi1zdHJ1Y3QgYWNwaV9idXNfYXR0cmlidXRlCi17Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsKK3N0cnVjdCBhY3BpX2J1c19hdHRyaWJ1dGUgeworCXUxNiByZXNlcnZlZDE7CisJdTE2IHJlc2VydmVkMjsKIH07CiAKLXVuaW9uIGFjcGlfcmVzb3VyY2VfYXR0cmlidXRlCi17Ci0Jc3RydWN0IGFjcGlfbWVtb3J5X2F0dHJpYnV0ZSAgICAgICAgbWVtb3J5OwotCXN0cnVjdCBhY3BpX2lvX2F0dHJpYnV0ZSAgICAgICAgICAgIGlvOwotCXN0cnVjdCBhY3BpX2J1c19hdHRyaWJ1dGUgICAgICAgICAgIGJ1czsKK3VuaW9uIGFjcGlfcmVzb3VyY2VfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgYWNwaV9tZW1vcnlfYXR0cmlidXRlIG1lbW9yeTsKKwlzdHJ1Y3QgYWNwaV9pb19hdHRyaWJ1dGUgaW87CisJc3RydWN0IGFjcGlfYnVzX2F0dHJpYnV0ZSBidXM7CiB9OwogCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zb3VyY2UKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmdfcHRyOworc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHsKKwl1MzIgaW5kZXg7CisJdTMyIHN0cmluZ19sZW5ndGg7CisJY2hhciAqc3RyaW5nX3B0cjsKIH07CiAKLXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNgotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3R5cGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXJfY29uc3VtZXI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9hZGRyZXNzX2ZpeGVkOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hZGRyZXNzX2ZpeGVkOworLyogRmllbGRzIGNvbW1vbiB0byBhbGwgYWRkcmVzcyBkZXNjcmlwdG9ycywgMTYvMzIvNjQgYml0ICovCisKKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiBcCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfdHlwZTsgXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VyX2NvbnN1bWVyOyBcCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlOyBcCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2FkZHJlc3NfZml4ZWQ7IFwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYWRkcmVzc19maXhlZDsgXAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfYXR0cmlidXRlICAgICAgIGF0dHJpYnV0ZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudWxhcml0eTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYWRkcmVzc19yYW5nZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYWRkcmVzc19yYW5nZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX2xlbmd0aDsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zb3VyY2UgICAgICAgICByZXNvdXJjZV9zb3VyY2U7CisKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MgeworQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTn07CisKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiB7CisJQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1MzIgZ3JhbnVsYXJpdHk7CisJdTMyIG1pbl9hZGRyZXNzX3JhbmdlOworCXUzMiBtYXhfYWRkcmVzc19yYW5nZTsKKwl1MzIgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQ7CisJdTMyIGFkZHJlc3NfbGVuZ3RoOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSByZXNvdXJjZV9zb3VyY2U7CiB9OwogCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV90eXBlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VyX2NvbnN1bWVyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYWRkcmVzc19maXhlZDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYWRkcmVzc19maXhlZDsKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2F0dHJpYnV0ZSAgICAgICBhdHRyaWJ1dGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHk7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2FkZHJlc3NfcmFuZ2U7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FkZHJlc3NfcmFuZ2U7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19sZW5ndGg7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlICAgICAgICAgcmVzb3VyY2Vfc291cmNlOworc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyIHsKKwlBQ1BJX1JFU09VUkNFX0FERFJFU1NfQ09NTU9OIHUzMiBncmFudWxhcml0eTsKKwl1MzIgbWluX2FkZHJlc3NfcmFuZ2U7CisJdTMyIG1heF9hZGRyZXNzX3JhbmdlOworCXUzMiBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldDsKKwl1MzIgYWRkcmVzc19sZW5ndGg7CisJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHJlc291cmNlX3NvdXJjZTsKIH07CiAKLXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NAotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3R5cGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXJfY29uc3VtZXI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9hZGRyZXNzX2ZpeGVkOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hZGRyZXNzX2ZpeGVkOwotCXVuaW9uIGFjcGlfcmVzb3VyY2VfYXR0cmlidXRlICAgICAgIGF0dHJpYnV0ZTsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudWxhcml0eTsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYWRkcmVzc19yYW5nZTsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYWRkcmVzc19yYW5nZTsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldDsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX2xlbmd0aDsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXM7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlICAgICAgICAgcmVzb3VyY2Vfc291cmNlOworc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0IHsKKwlBQ1BJX1JFU09VUkNFX0FERFJFU1NfQ09NTU9OIHU2NCBncmFudWxhcml0eTsKKwl1NjQgbWluX2FkZHJlc3NfcmFuZ2U7CisJdTY0IG1heF9hZGRyZXNzX3JhbmdlOworCXU2NCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldDsKKwl1NjQgYWRkcmVzc19sZW5ndGg7CisJdTY0IHR5cGVfc3BlY2lmaWNfYXR0cmlidXRlczsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zb3VyY2UgcmVzb3VyY2Vfc291cmNlOwogfTsKIAotc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycQotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VyX2NvbnN1bWVyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VfbGV2ZWw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlX2hpZ2hfbG93OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9leGNsdXNpdmU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2ludGVycnVwdHM7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlICAgICAgICAgcmVzb3VyY2Vfc291cmNlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdHNbMV07CitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxIHsKKwl1MzIgcHJvZHVjZXJfY29uc3VtZXI7CisJdTMyIGVkZ2VfbGV2ZWw7CisJdTMyIGFjdGl2ZV9oaWdoX2xvdzsKKwl1MzIgc2hhcmVkX2V4Y2x1c2l2ZTsKKwl1MzIgbnVtYmVyX29mX2ludGVycnVwdHM7CisJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHJlc291cmNlX3NvdXJjZTsKKwl1MzIgaW50ZXJydXB0c1sxXTsKIH07CiAKLQogLyogQUNQSV9SRVNPVVJDRV9UWVBFcyAqLwogCiAjZGVmaW5lIEFDUElfUlNUWVBFX0lSUSAgICAgICAgICAgICAgICAgMApAQCAtMTI0MCwzNSArMTE0MywzNCBAQAogI2RlZmluZSBBQ1BJX1JTVFlQRV9BRERSRVNTNjQgICAgICAgICAgIDEzCiAjZGVmaW5lIEFDUElfUlNUWVBFX0VYVF9JUlEgICAgICAgICAgICAgMTQKIAotdHlwZWRlZiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9yZXNvdXJjZV90eXBlOwordHlwZWRlZiB1MzIgYWNwaV9yZXNvdXJjZV90eXBlOwogCi11bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEKLXsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgICAgICAgICAgICBpcnE7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hICAgICAgICAgICAgZG1hOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RwZiAgICAgIHN0YXJ0X2RwZjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyAgICAgICAgICAgICBpbzsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyAgICAgICBmaXhlZF9pbzsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IgICAgICAgICB2ZW5kb3Jfc3BlY2lmaWM7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZW5kX3RhZyAgICAgICAgZW5kX3RhZzsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0yNCAgICAgICAgICBtZW1vcnkyNDsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMiAgICAgICAgICBtZW1vcnkzMjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMiAgICBmaXhlZF9tZW1vcnkzMjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYgICAgICBhZGRyZXNzMTY7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyICAgICAgYWRkcmVzczMyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCAgICAgIGFkZHJlc3M2NDsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxICAgICAgICBleHRlbmRlZF9pcnE7Cit1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgeworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSBpcnE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hIGRtYTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kcGYgc3RhcnRfZHBmOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lvIGlvOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvIGZpeGVkX2lvOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvciB2ZW5kb3Jfc3BlY2lmaWM7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfZW5kX3RhZyBlbmRfdGFnOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTI0IG1lbW9yeTI0OworCXN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTMyIG1lbW9yeTMyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyIGZpeGVkX21lbW9yeTMyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MgYWRkcmVzczsJLyogQ29tbW9uIDE2LzMyLzY0IGFkZHJlc3MgZmllbGRzICovCisJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2IGFkZHJlc3MxNjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIgYWRkcmVzczMyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCBhZGRyZXNzNjQ7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSBleHRlbmRlZF9pcnE7CiB9OwogCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZQotewotCWFjcGlfcmVzb3VyY2VfdHlwZSAgICAgICAgICAgICAgICAgIGlkOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICAgICBkYXRhOworc3RydWN0IGFjcGlfcmVzb3VyY2UgeworCWFjcGlfcmVzb3VyY2VfdHlwZSBpZDsKKwl1MzIgbGVuZ3RoOworCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSBkYXRhOwogfTsKIAogI2RlZmluZSBBQ1BJX1JFU09VUkNFX0xFTkdUSCAgICAgICAgICAgICAgICAxMgotI2RlZmluZSBBQ1BJX1JFU09VUkNFX0xFTkdUSF9OT19EQVRBICAgICAgICA4ICAgICAgIC8qIElkICsgTGVuZ3RoIGZpZWxkcyAqLworI2RlZmluZSBBQ1BJX1JFU09VUkNFX0xFTkdUSF9OT19EQVRBICAgICAgICA4CS8qIElkICsgTGVuZ3RoIGZpZWxkcyAqLwogCiAjZGVmaW5lIEFDUElfU0laRU9GX1JFU09VUkNFKHR5cGUpICAgICAgICAgIChBQ1BJX1JFU09VUkNFX0xFTkdUSF9OT19EQVRBICsgc2l6ZW9mICh0eXBlKSkKIApAQCAtMTI4NCwxOSArMTE4NiwxNiBAQAogICogRU5EOiBvZiBkZWZpbml0aW9ucyBmb3IgUmVzb3VyY2UgQXR0cmlidXRlcwogICovCiAKLQotc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M7ICAgICAgICAvKiBoZXJlIGZvciA2NC1iaXQgYWxpZ25tZW50ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2luZGV4OwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVs0XTsgICAgICAvKiBwYWQgdG8gNjQgYml0cyBzbyBzaXplb2YoKSB3b3JrcyBpbiBhbGwgY2FzZXMgKi8KK3N0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlIHsKKwl1MzIgbGVuZ3RoOworCXUzMiBwaW47CisJYWNwaV9pbnRlZ2VyIGFkZHJlc3M7CS8qIGhlcmUgZm9yIDY0LWJpdCBhbGlnbm1lbnQgKi8KKwl1MzIgc291cmNlX2luZGV4OworCWNoYXIgc291cmNlWzRdOwkJLyogcGFkIHRvIDY0IGJpdHMgc28gc2l6ZW9mKCkgd29ya3MgaW4gYWxsIGNhc2VzICovCiB9OwogCiAvKgogICogRU5EOiBvZiBkZWZpbml0aW9ucyBmb3IgUENJIFJvdXRpbmcgdGFibGVzCiAgKi8KIAotCi0jZW5kaWYgLyogX19BQ1RZUEVTX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNUWVBFU19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3V0aWxzLmggYi9pbmNsdWRlL2FjcGkvYWN1dGlscy5oCmluZGV4IDE5MmQwYmUuLmMxMDg2NDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3V0aWxzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdXRpbHMuaApAQCAtNDQsMjAgKzQ0LDE3IEBACiAjaWZuZGVmIF9BQ1VUSUxTX0gKICNkZWZpbmUgX0FDVVRJTFNfSAogCi0KIHR5cGVkZWYKLWFjcGlfc3RhdHVzICgqYWNwaV9wa2dfY2FsbGJhY2spICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CithY3BpX3N0YXR1cygqYWNwaV9wa2dfY2FsbGJhY2spICh1OCBvYmplY3RfdHlwZSwKKwkJCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqIHNvdXJjZV9vYmplY3QsCisJCQkJIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqIHN0YXRlLAorCQkJCSB2b2lkICpjb250ZXh0KTsKIAotc3RydWN0IGFjcGlfcGtnX2luZm8KLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmcmVlX3NwYWNlOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3NwYWNlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BhY2thZ2VzOworc3RydWN0IGFjcGlfcGtnX2luZm8geworCXU4ICpmcmVlX3NwYWNlOworCWFjcGlfc2l6ZSBsZW5ndGg7CisJdTMyIG9iamVjdF9zcGFjZTsKKwl1MzIgbnVtX3BhY2thZ2VzOwogfTsKIAogI2RlZmluZSBSRUZfSU5DUkVNRU5UICAgICAgICh1MTYpIDAKQEAgLTcxLDE2NyArNjgsODkgQEAKICNkZWZpbmUgREJfRFdPUkRfRElTUExBWSAgICA0CiAjZGVmaW5lIERCX1FXT1JEX0RJU1BMQVkgICAgOAogCi0KIC8qCiAgKiB1dGdsb2JhbCAtIEdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgYW5kIHByb2NlZHVyZXMKICAqLwotdm9pZAotYWNwaV91dF9pbml0X2dsb2JhbHMgKAotCXZvaWQpOwordm9pZCBhY3BpX3V0X2luaXRfZ2xvYmFscyh2b2lkKTsKIAogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKIAotY2hhciAqCi1hY3BpX3V0X2dldF9tdXRleF9uYW1lICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4X2lkKTsKK2NoYXIgKmFjcGlfdXRfZ2V0X211dGV4X25hbWUodTMyIG11dGV4X2lkKTsKIAogI2VuZGlmCiAKLWNoYXIgKgotYWNwaV91dF9nZXRfdHlwZV9uYW1lICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUpOworY2hhciAqYWNwaV91dF9nZXRfdHlwZV9uYW1lKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7CiAKLWNoYXIgKgotYWNwaV91dF9nZXRfbm9kZV9uYW1lICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QpOworY2hhciAqYWNwaV91dF9nZXRfbm9kZV9uYW1lKHZvaWQgKm9iamVjdCk7CiAKLWNoYXIgKgotYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QpOworY2hhciAqYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKHZvaWQgKm9iamVjdCk7CiAKLWNoYXIgKgotYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOworY2hhciAqYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CiAKLWNoYXIgKgotYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VfaWQpOworY2hhciAqYWNwaV91dF9nZXRfcmVnaW9uX25hbWUodTggc3BhY2VfaWQpOwogCi1jaGFyICoKLWFjcGlfdXRfZ2V0X2V2ZW50X25hbWUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaWQpOworY2hhciAqYWNwaV91dF9nZXRfZXZlbnRfbmFtZSh1MzIgZXZlbnRfaWQpOwogCi1jaGFyCi1hY3BpX3V0X2hleF90b19hc2NpaV9jaGFyICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGludGVnZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7CitjaGFyIGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIoYWNwaV9pbnRlZ2VyIGludGVnZXIsIHUzMiBwb3NpdGlvbik7CiAKLXU4Ci1hY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUpOwotCi1hY3BpX293bmVyX2lkCi1hY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkX3R5cGUpOwotCit1OCBhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7CiAKIC8qCiAgKiB1dGluaXQgLSBtaXNjZWxsYW5lb3VzIGluaXRpYWxpemF0aW9uIGFuZCBzaHV0ZG93bgogICovCi1hY3BpX3N0YXR1cwotYWNwaV91dF9oYXJkd2FyZV9pbml0aWFsaXplICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfdXRfaGFyZHdhcmVfaW5pdGlhbGl6ZSh2b2lkKTsKIAotdm9pZAotYWNwaV91dF9zdWJzeXN0ZW1fc2h1dGRvd24gKAotCXZvaWQpOwordm9pZCBhY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93bih2b2lkKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfdXRfdmFsaWRhdGVfZmFkdCAoCi0Jdm9pZCk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfdXRfdmFsaWRhdGVfZmFkdCh2b2lkKTsKIAogLyoKICAqIHV0Y2xpYiAtIExvY2FsIGltcGxlbWVudGF0aW9ucyBvZiBDIGxpYnJhcnkgZnVuY3Rpb25zCiAgKi8KICNpZm5kZWYgQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZCiAKLWFjcGlfc2l6ZQotYWNwaV91dF9zdHJsZW4gKAotCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZyk7CithY3BpX3NpemUgYWNwaV91dF9zdHJsZW4oY29uc3QgY2hhciAqc3RyaW5nKTsKIAotY2hhciAqCi1hY3BpX3V0X3N0cmNweSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZHN0X3N0cmluZywKLQljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpzcmNfc3RyaW5nKTsKK2NoYXIgKmFjcGlfdXRfc3RyY3B5KGNoYXIgKmRzdF9zdHJpbmcsIGNvbnN0IGNoYXIgKnNyY19zdHJpbmcpOwogCi1jaGFyICoKLWFjcGlfdXRfc3RybmNweSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZHN0X3N0cmluZywKLQljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpzcmNfc3RyaW5nLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOworY2hhciAqYWNwaV91dF9zdHJuY3B5KGNoYXIgKmRzdF9zdHJpbmcsCisJCSAgICAgIGNvbnN0IGNoYXIgKnNyY19zdHJpbmcsIGFjcGlfc2l6ZSBjb3VudCk7CiAKLWludAotYWNwaV91dF9tZW1jbXAgKAotCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcjEsCi0JY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyMiwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKK2ludCBhY3BpX3V0X21lbWNtcChjb25zdCBjaGFyICpidWZmZXIxLCBjb25zdCBjaGFyICpidWZmZXIyLCBhY3BpX3NpemUgY291bnQpOwogCi1pbnQKLWFjcGlfdXRfc3RybmNtcCAoCi0JY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nMSwKLQljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOworaW50IGFjcGlfdXRfc3RybmNtcChjb25zdCBjaGFyICpzdHJpbmcxLCBjb25zdCBjaGFyICpzdHJpbmcyLCBhY3BpX3NpemUgY291bnQpOwogCi1pbnQKLWFjcGlfdXRfc3RyY21wICgKLQljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcxLAotCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZzIpOworaW50IGFjcGlfdXRfc3RyY21wKGNvbnN0IGNoYXIgKnN0cmluZzEsIGNvbnN0IGNoYXIgKnN0cmluZzIpOwogCi1jaGFyICoKLWFjcGlfdXRfc3RyY2F0ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkc3Rfc3RyaW5nLAotCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgKnNyY19zdHJpbmcpOworY2hhciAqYWNwaV91dF9zdHJjYXQoY2hhciAqZHN0X3N0cmluZywgY29uc3QgY2hhciAqc3JjX3N0cmluZyk7CiAKLWNoYXIgKgotYWNwaV91dF9zdHJuY2F0ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkc3Rfc3RyaW5nLAotCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgKnNyY19zdHJpbmcsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CitjaGFyICphY3BpX3V0X3N0cm5jYXQoY2hhciAqZHN0X3N0cmluZywKKwkJICAgICAgY29uc3QgY2hhciAqc3JjX3N0cmluZywgYWNwaV9zaXplIGNvdW50KTsKIAotdTMyCi1hY3BpX3V0X3N0cnRvdWwgKAotCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqdGVybWluYXRvciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UpOwordTMyIGFjcGlfdXRfc3RydG91bChjb25zdCBjaGFyICpzdHJpbmcsIGNoYXIgKip0ZXJtaW5hdG9yLCB1MzIgYmFzZSk7CiAKLWNoYXIgKgotYWNwaV91dF9zdHJzdHIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZzEsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nMik7CitjaGFyICphY3BpX3V0X3N0cnN0cihjaGFyICpzdHJpbmcxLCBjaGFyICpzdHJpbmcyKTsKIAotdm9pZCAqCi1hY3BpX3V0X21lbWNweSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCwKLQljb25zdCB2b2lkICAgICAgICAgICAgICAgICAgICAgICpzcmMsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7Cit2b2lkICphY3BpX3V0X21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIGFjcGlfc2l6ZSBjb3VudCk7CiAKLXZvaWQgKgotYWNwaV91dF9tZW1zZXQgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QsCi0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICB2YWx1ZSwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKK3ZvaWQgKmFjcGlfdXRfbWVtc2V0KHZvaWQgKmRlc3QsIGFjcGlfbmF0aXZlX3VpbnQgdmFsdWUsIGFjcGlfc2l6ZSBjb3VudCk7CiAKLWludAotYWNwaV91dF90b191cHBlciAoCi0JaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKTsKK2ludCBhY3BpX3V0X3RvX3VwcGVyKGludCBjKTsKIAotaW50Ci1hY3BpX3V0X3RvX2xvd2VyICgKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMpOworaW50IGFjcGlfdXRfdG9fbG93ZXIoaW50IGMpOwogCiBleHRlcm4gY29uc3QgdTggX2FjcGlfY3R5cGVbXTsKIAotI2RlZmluZSBfQUNQSV9YQSAgICAgMHgwMCAgICAvKiBleHRyYSBhbHBoYWJldGljIC0gbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBfQUNQSV9YUyAgICAgMHg0MCAgICAvKiBleHRyYSBzcGFjZSAqLwotI2RlZmluZSBfQUNQSV9CQiAgICAgMHgwMCAgICAvKiBCRUwsIEJTLCBldGMuIC0gbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBfQUNQSV9DTiAgICAgMHgyMCAgICAvKiBDUiwgRkYsIEhULCBOTCwgVlQgKi8KLSNkZWZpbmUgX0FDUElfREkgICAgIDB4MDQgICAgLyogJzAnLSc5JyAqLwotI2RlZmluZSBfQUNQSV9MTyAgICAgMHgwMiAgICAvKiAnYSctJ3onICovCi0jZGVmaW5lIF9BQ1BJX1BVICAgICAweDEwICAgIC8qIHB1bmN0dWF0aW9uICovCi0jZGVmaW5lIF9BQ1BJX1NQICAgICAweDA4ICAgIC8qIHNwYWNlICovCi0jZGVmaW5lIF9BQ1BJX1VQICAgICAweDAxICAgIC8qICdBJy0nWicgKi8KLSNkZWZpbmUgX0FDUElfWEQgICAgIDB4ODAgICAgLyogJzAnLSc5JywgJ0EnLSdGJywgJ2EnLSdmJyAqLworI2RlZmluZSBfQUNQSV9YQSAgICAgMHgwMAkvKiBleHRyYSBhbHBoYWJldGljIC0gbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBfQUNQSV9YUyAgICAgMHg0MAkvKiBleHRyYSBzcGFjZSAqLworI2RlZmluZSBfQUNQSV9CQiAgICAgMHgwMAkvKiBCRUwsIEJTLCBldGMuIC0gbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBfQUNQSV9DTiAgICAgMHgyMAkvKiBDUiwgRkYsIEhULCBOTCwgVlQgKi8KKyNkZWZpbmUgX0FDUElfREkgICAgIDB4MDQJLyogJzAnLSc5JyAqLworI2RlZmluZSBfQUNQSV9MTyAgICAgMHgwMgkvKiAnYSctJ3onICovCisjZGVmaW5lIF9BQ1BJX1BVICAgICAweDEwCS8qIHB1bmN0dWF0aW9uICovCisjZGVmaW5lIF9BQ1BJX1NQICAgICAweDA4CS8qIHNwYWNlICovCisjZGVmaW5lIF9BQ1BJX1VQICAgICAweDAxCS8qICdBJy0nWicgKi8KKyNkZWZpbmUgX0FDUElfWEQgICAgIDB4ODAJLyogJzAnLSc5JywgJ0EnLSdGJywgJ2EnLSdmJyAqLwogCiAjZGVmaW5lIEFDUElfSVNfRElHSVQoYykgIChfYWNwaV9jdHlwZVsodW5zaWduZWQgY2hhcikoYyldICYgKF9BQ1BJX0RJKSkKICNkZWZpbmUgQUNQSV9JU19TUEFDRShjKSAgKF9hY3BpX2N0eXBlWyh1bnNpZ25lZCBjaGFyKShjKV0gJiAoX0FDUElfU1ApKQpAQCAtMjQyLDUwMiArMTYxLDMyMyBAQAogI2RlZmluZSBBQ1BJX0lTX0FMUEhBKGMpICAoX2FjcGlfY3R5cGVbKHVuc2lnbmVkIGNoYXIpKGMpXSAmIChfQUNQSV9MTyB8IF9BQ1BJX1VQKSkKICNkZWZpbmUgQUNQSV9JU19BU0NJSShjKSAgKChjKSA8IDB4ODApCiAKLSNlbmRpZiAvKiBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkgKi8KLQorI2VuZGlmCQkJCS8qIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWSAqLwogCiAvKgogICogdXRjb3B5IC0gT2JqZWN0IGNvbnN0cnVjdGlvbiBhbmQgY29udmVyc2lvbiBpbnRlcmZhY2VzCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2J1aWxkX3NpbXBsZV9vYmplY3QoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqLAotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKnVzZXJfb2JqLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc3BhY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyX3NwYWNlX3VzZWQpOworYWNwaV91dF9idWlsZF9zaW1wbGVfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwKKwkJCSAgICB1bmlvbiBhY3BpX29iamVjdCAqdXNlcl9vYmosCisJCQkgICAgdTggKiBkYXRhX3NwYWNlLCB1MzIgKiBidWZmZXJfc3BhY2VfdXNlZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2J1aWxkX3BhY2thZ2Vfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwYWNlX3VzZWQpOworYWNwaV91dF9idWlsZF9wYWNrYWdlX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmosCisJCQkgICAgIHU4ICogYnVmZmVyLCB1MzIgKiBzcGFjZV91c2VkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2VvYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iaiwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKTsKK2FjcGlfdXRfY29weV9pb2JqZWN0X3RvX2VvYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqLAorCQkJCXN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfZW9iamVjdF90b19pb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29iamVjdCAgICAgICAgICAgICAgICpvYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmludGVybmFsX29iaik7CithY3BpX3V0X2NvcHlfZW9iamVjdF90b19pb2JqZWN0KHVuaW9uIGFjcGlfb2JqZWN0ICpvYmosCisJCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmludGVybmFsX29iaik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaXNpbXBsZV90b19pc2ltcGxlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3Rfb2JqKTsKK2FjcGlfdXRfY29weV9pc2ltcGxlX3RvX2lzaW1wbGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iaiwKKwkJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X29iaik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqZGVzdF9kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCithY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZXN0X2Rlc2MsCisJCQkJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIC8qCiAgKiB1dGNyZWF0ZSAtIE9iamVjdCBjcmVhdGlvbgogICovCiBhY3BpX3N0YXR1cwotYWNwaV91dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKTsKLQorYWNwaV91dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsIHUxNiBhY3Rpb24pOwogCiAvKgogICogdXRkZWJ1ZyAtIERlYnVnIGludGVyZmFjZXMKICAqLwotdm9pZAotYWNwaV91dF9pbml0X3N0YWNrX3B0cl90cmFjZSAoCi0Jdm9pZCk7Cit2b2lkIGFjcGlfdXRfaW5pdF9zdGFja19wdHJfdHJhY2Uodm9pZCk7CisKK3ZvaWQgYWNwaV91dF90cmFja19zdGFja19wdHIodm9pZCk7CiAKIHZvaWQKLWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyICgKLQl2b2lkKTsKK2FjcGlfdXRfdHJhY2UodTMyIGxpbmVfbnVtYmVyLAorCSAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkKTsKIAogdm9pZAotYWNwaV91dF90cmFjZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvICAgICpkYmdfaW5mbyk7CithY3BpX3V0X3RyYWNlX3B0cih1MzIgbGluZV9udW1iZXIsCisJCSAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJICBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgdm9pZCAqcG9pbnRlcik7CiAKIHZvaWQKLWFjcGlfdXRfdHJhY2VfcHRyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvaW50ZXIpOworYWNwaV91dF90cmFjZV91MzIodTMyIGxpbmVfbnVtYmVyLAorCQkgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHUzMiBpbnRlZ2VyKTsKIAogdm9pZAotYWNwaV91dF90cmFjZV91MzIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8sCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyKTsKK2FjcGlfdXRfdHJhY2Vfc3RyKHUzMiBsaW5lX251bWJlciwKKwkJICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgIGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCBjaGFyICpzdHJpbmcpOwogCiB2b2lkCi1hY3BpX3V0X3RyYWNlX3N0ciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvICAgICpkYmdfaW5mbywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcpOworYWNwaV91dF9leGl0KHUzMiBsaW5lX251bWJlciwKKwkgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkKTsKIAogdm9pZAotYWNwaV91dF9leGl0ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvKTsKK2FjcGlfdXRfc3RhdHVzX2V4aXQodTMyIGxpbmVfbnVtYmVyLAorCQkgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJICAgIGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCBhY3BpX3N0YXR1cyBzdGF0dXMpOwogCiB2b2lkCi1hY3BpX3V0X3N0YXR1c19leGl0ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvLAotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKK2FjcGlfdXRfdmFsdWVfZXhpdCh1MzIgbGluZV9udW1iZXIsCisJCSAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgIGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCBhY3BpX2ludGVnZXIgdmFsdWUpOwogCiB2b2lkCi1hY3BpX3V0X3ZhbHVlX2V4aXQgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8sCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CithY3BpX3V0X3B0cl9leGl0KHUzMiBsaW5lX251bWJlciwKKwkJIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgdTggKiBwdHIpOworCit2b2lkIGFjcGlfdXRfcmVwb3J0X2luZm8oY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlciwgdTMyIGNvbXBvbmVudF9pZCk7CisKK3ZvaWQgYWNwaV91dF9yZXBvcnRfZXJyb3IoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlciwgdTMyIGNvbXBvbmVudF9pZCk7CiAKIHZvaWQKLWFjcGlfdXRfcHRyX2V4aXQgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8sCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyKTsKK2FjcGlfdXRfcmVwb3J0X3dhcm5pbmcoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlciwgdTMyIGNvbXBvbmVudF9pZCk7CiAKLXZvaWQKLWFjcGlfdXRfcmVwb3J0X2luZm8gKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQpOwotCi12b2lkCi1hY3BpX3V0X3JlcG9ydF9lcnJvciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCk7Ci0KLXZvaWQKLWFjcGlfdXRfcmVwb3J0X3dhcm5pbmcgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQpOwotCi12b2lkCi1hY3BpX3V0X2R1bXBfYnVmZmVyICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQpOwordm9pZCBhY3BpX3V0X2R1bXBfYnVmZmVyKHU4ICogYnVmZmVyLCB1MzIgY291bnQsIHUzMiBkaXNwbGF5LCB1MzIgY29tcG9uZW50X2lkKTsKIAogdm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQotYWNwaV91dF9kZWJ1Z19wcmludCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvICAgICpkYmdfaW5mbywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmb3JtYXQsCi0JLi4uKSBBQ1BJX1BSSU5URl9MSUtFX0ZVTkM7CithY3BpX3V0X2RlYnVnX3ByaW50KHUzMiByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwsCisJCSAgICB1MzIgbGluZV9udW1iZXIsCisJCSAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgICAgY2hhciAqbW9kdWxlX25hbWUsCisJCSAgICB1MzIgY29tcG9uZW50X2lkLCBjaGFyICpmb3JtYXQsIC4uLikgQUNQSV9QUklOVEZfTElLRV9GVU5DOwogCiB2b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCi1hY3BpX3V0X2RlYnVnX3ByaW50X3JhdyAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvICAgICpkYmdfaW5mbywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmb3JtYXQsCi0JLi4uKSBBQ1BJX1BSSU5URl9MSUtFX0ZVTkM7Ci0KK2FjcGlfdXRfZGVidWdfcHJpbnRfcmF3KHUzMiByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwsCisJCQl1MzIgbGluZV9udW1iZXIsCisJCQljb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkJY2hhciAqbW9kdWxlX25hbWUsCisJCQl1MzIgY29tcG9uZW50X2lkLAorCQkJY2hhciAqZm9ybWF0LCAuLi4pIEFDUElfUFJJTlRGX0xJS0VfRlVOQzsKIAogLyoKICAqIHV0ZGVsZXRlIC0gT2JqZWN0IGRlbGV0aW9uIGFuZCByZWZlcmVuY2UgY291bnRzCiAgKi8KLXZvaWQKLWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KTsKK3ZvaWQgYWNwaV91dF9hZGRfcmVmZXJlbmNlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCk7CiAKLXZvaWQKLWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KTsKK3ZvaWQgYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCk7CiAKLXZvaWQKLWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX3BhY2thZ2Vfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpOwordm9pZCBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9wYWNrYWdlX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpOwogCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9zaW1wbGVfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpOwordm9pZCBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9zaW1wbGVfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCk7CiAKLXZvaWQKLWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqX2xpc3QpOwotCit2b2lkIGFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmpfbGlzdCk7CiAKIC8qCiAgKiB1dGV2YWwgLSBvYmplY3QgZXZhbHVhdGlvbgogICovCi1hY3BpX3N0YXR1cwotYWNwaV91dF9vc2lfaW1wbGVtZW50YXRpb24gKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9zdGF0dXMgYWNwaV91dF9vc2lfaW1wbGVtZW50YXRpb24oc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcHJlZml4X25vZGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3JldHVybl9idHlwZXMsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9kZXNjKTsKK2FjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwcmVmaXhfbm9kZSwKKwkJCWNoYXIgKnBhdGgsCisJCQl1MzIgZXhwZWN0ZWRfcmV0dXJuX2J0eXBlcywKKwkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXR1cm5fZGVzYyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3RfbmFtZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpkZXZpY2Vfbm9kZSwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICphZGRyZXNzKTsKK2FjcGlfdXRfZXZhbHVhdGVfbnVtZXJpY19vYmplY3QoY2hhciAqb2JqZWN0X25hbWUsCisJCQkJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRldmljZV9ub2RlLAorCQkJCWFjcGlfaW50ZWdlciAqIGFkZHJlc3MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX0hJRCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0Jc3RydWN0IGFjcGlfZGV2aWNlX2lkICAgICAgICAgICAqaGlkKTsKK2FjcGlfdXRfZXhlY3V0ZV9ISUQoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRldmljZV9ub2RlLAorCQkgICAgc3RydWN0IGFjcGlfZGV2aWNlX2lkICpoaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX0NJRCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0Jc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICoqcmV0dXJuX2NpZF9saXN0KTsKK2FjcGlfdXRfZXhlY3V0ZV9DSUQoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRldmljZV9ub2RlLAorCQkgICAgc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICoqcmV0dXJuX2NpZF9saXN0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfZXhlY3V0ZV9TVEEgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmRldmljZV9ub2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1c19mbGFncyk7CithY3BpX3V0X2V4ZWN1dGVfU1RBKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwKKwkJICAgIHUzMiAqIHN0YXR1c19mbGFncyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2V4ZWN1dGVfVUlEICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpkZXZpY2Vfbm9kZSwKLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgICAgICAgICAgICp1aWQpOworYWNwaV91dF9leGVjdXRlX1VJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCisJCSAgICBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKnVpZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2V4ZWN1dGVfc3hkcyAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGlnaGVzdCk7Ci0KK2FjcGlfdXRfZXhlY3V0ZV9zeGRzKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwgdTggKiBoaWdoZXN0KTsKIAogLyoKICAqIHV0b2JqZWN0IC0gaW50ZXJuYWwgb2JqZWN0IGNyZWF0ZS9kZWxldGUvY2FjaGUgcm91dGluZXMKICAqLwotdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAqCi1hY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3RfZGJnICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSk7Cit1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3RfZGJnKGNoYXIgKm1vZHVsZV9uYW1lLAorCQkJCQkJCSAgICAgIHUzMiBsaW5lX251bWJlciwKKwkJCQkJCQkgICAgICB1MzIgY29tcG9uZW50X2lkLAorCQkJCQkJCSAgICAgIGFjcGlfb2JqZWN0X3R5cGUKKwkJCQkJCQkgICAgICB0eXBlKTsKIAotdm9pZCAqCi1hY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCk7Cit2b2lkICphY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyhjaGFyICptb2R1bGVfbmFtZSwKKwkJCQkgICAgICAgdTMyIGxpbmVfbnVtYmVyLCB1MzIgY29tcG9uZW50X2lkKTsKIAotI2RlZmluZSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QodCkgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyAoX1RISVNfTU9EVUxFLF9fTElORV9fLF9DT01QT05FTlQsdCkKLSNkZWZpbmUgYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzYygpICBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyAoX1RISVNfTU9EVUxFLF9fTElORV9fLF9DT01QT05FTlQpCisjZGVmaW5lIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCh0KSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3RfZGJnIChfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXyxfQ09NUE9ORU5ULHQpCisjZGVmaW5lIGFjcGlfdXRfYWxsb2NhdGVfb2JqZWN0X2Rlc2MoKSAgYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcgKF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fLF9DT01QT05FTlQpCiAKLXZvaWQKLWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpOwordm9pZCBhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpOwogCi11OAotYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3QgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCk7Cit1OCBhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdCh2b2lkICpvYmplY3QpOwogCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoKLWFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QgKAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemUpOwordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdChhY3BpX3NpemUgYnVmZmVyX3NpemUpOwogCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoKLWFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QgKAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3NpemUpOwordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdChhY3BpX3NpemUgc3RyaW5nX3NpemUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9nZXRfb2JqZWN0X3NpemUoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKm9ial9sZW5ndGgpOwotCithY3BpX3V0X2dldF9vYmplY3Rfc2l6ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmosIGFjcGlfc2l6ZSAqIG9ial9sZW5ndGgpOwogCiAvKgogICogdXRzdGF0ZSAtIEdlbmVyaWMgc3RhdGUgY3JlYXRpb24vY2FjaGUgcm91dGluZXMKICAqLwogdm9pZAotYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUgKAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipsaXN0X2hlYWQsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUpOworYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoqbGlzdF9oZWFkLAorCQkJICAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSk7CiAKLXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqCi1hY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlICgKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICoqbGlzdF9oZWFkKTsKK3VuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUKKwkJCQkJCSAgICAqKmxpc3RfaGVhZCk7CiAKK3VuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSh2b2lkKTsKIAotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKAotCXZvaWQpOworc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICphY3BpX3V0X2NyZWF0ZV90aHJlYWRfc3RhdGUodm9pZCk7CiAKLXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqCi1hY3BpX3V0X2NyZWF0ZV90aHJlYWRfc3RhdGUgKAotCXZvaWQpOwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorCQkJCQkJICAgICAgKm9iamVjdCwgdTE2IGFjdGlvbik7CiAKLXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqCi1hY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbik7Ci0KLXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqCi1hY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGUgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmludGVybmFsX29iamVjdCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRlcm5hbF9vYmplY3QsCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Cit1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZSh2b2lkICppbnRlcm5hbF9vYmplY3QsCisJCQkJCQkgICB2b2lkICpleHRlcm5hbF9vYmplY3QsCisJCQkJCQkgICB1MTYgaW5kZXgpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QsCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqKnN0YXRlX2xpc3QpOworYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwKKwkJCQkgICAgIHUxNiBhY3Rpb24sCisJCQkJICAgICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKipzdGF0ZV9saXN0KTsKIAogI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqKnN0YXRlX2xpc3QpOwotI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCithY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGVfYW5kX3B1c2godm9pZCAqaW50ZXJuYWxfb2JqZWN0LAorCQkJCSAgdm9pZCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCSAgdTE2IGluZGV4LAorCQkJCSAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoqc3RhdGVfbGlzdCk7CisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUgKAotCXZvaWQpOwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV9jb250cm9sX3N0YXRlKHZvaWQpOwogCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlICgKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZSk7Ci0KLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLXZvaWQKLWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGVfY2FjaGUgKAotCXZvaWQpOwotCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9vYmplY3RfY2FjaGUgKAotCXZvaWQpOwotI2VuZGlmCi0KK3ZvaWQgYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlKTsKIAogLyoKICAqIHV0bWF0aAogICovCiBhY3BpX3N0YXR1cwotYWNwaV91dF9kaXZpZGUgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5fZGl2aWRlbmQsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbl9kaXZpc29yLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKm91dF9xdW90aWVudCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICpvdXRfcmVtYWluZGVyKTsKK2FjcGlfdXRfZGl2aWRlKGFjcGlfaW50ZWdlciBpbl9kaXZpZGVuZCwKKwkgICAgICAgYWNwaV9pbnRlZ2VyIGluX2Rpdmlzb3IsCisJICAgICAgIGFjcGlfaW50ZWdlciAqIG91dF9xdW90aWVudCwgYWNwaV9pbnRlZ2VyICogb3V0X3JlbWFpbmRlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X3Nob3J0X2RpdmlkZSAoCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbl9kaXZpZGVuZCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3IsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqb3V0X3F1b3RpZW50LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dF9yZW1haW5kZXIpOworYWNwaV91dF9zaG9ydF9kaXZpZGUoYWNwaV9pbnRlZ2VyIGluX2RpdmlkZW5kLAorCQkgICAgIHUzMiBkaXZpc29yLAorCQkgICAgIGFjcGlfaW50ZWdlciAqIG91dF9xdW90aWVudCwgdTMyICogb3V0X3JlbWFpbmRlcik7CiAKIC8qCiAgKiB1dG1pc2MKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfdXRfd2Fsa19wYWNrYWdlX3RyZWUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGFyZ2V0X29iamVjdCwKLQlhY3BpX3BrZ19jYWxsYmFjayAgICAgICAgICAgICAgIHdhbGtfY2FsbGJhY2ssCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CithY3BpX3N0YXR1cyBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkKGFjcGlfb3duZXJfaWQgKiBvd25lcl9pZCk7CiAKLWNoYXIgKgotYWNwaV91dF9zdHJ1cHIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNyY19zdHJpbmcpOwotCi12b2lkCi1hY3BpX3V0X3ByaW50X3N0cmluZyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2xlbmd0aCk7Ci0KLXU4Ci1hY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQotdTgKLWFjcGlfdXRfdmFsaWRfYWNwaV9jaGFyYWN0ZXIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyKTsKK3ZvaWQgYWNwaV91dF9yZWxlYXNlX293bmVyX2lkKGFjcGlfb3duZXJfaWQgKiBvd25lcl9pZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X3N0cnRvdWw2NCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICpyZXRfaW50ZWdlcik7CithY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3QsCisJCQkgIHZvaWQgKnRhcmdldF9vYmplY3QsCisJCQkgIGFjcGlfcGtnX2NhbGxiYWNrIHdhbGtfY2FsbGJhY2ssIHZvaWQgKmNvbnRleHQpOworCit2b2lkIGFjcGlfdXRfc3RydXByKGNoYXIgKnNyY19zdHJpbmcpOworCit2b2lkIGFjcGlfdXRfcHJpbnRfc3RyaW5nKGNoYXIgKnN0cmluZywgdTggbWF4X2xlbmd0aCk7CisKK3U4IGFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKHUzMiBuYW1lKTsKKwordTggYWNwaV91dF92YWxpZF9hY3BpX2NoYXJhY3RlcihjaGFyIGNoYXJhY3Rlcik7CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X3N0cnRvdWw2NChjaGFyICpzdHJpbmcsIHUzMiBiYXNlLCBhY3BpX2ludGVnZXIgKiByZXRfaW50ZWdlcik7CiAKIC8qIFZhbHVlcyBmb3IgQmFzZSBhYm92ZSAoMTY9SGV4LCAxMD1EZWNpbWFsKSAqLwogCiAjZGVmaW5lIEFDUElfQU5ZX0JBU0UgICAgICAgIDAKIAotYWNwaV9zdGF0dXMKLWFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZSAoCi0Jdm9pZCk7Cit1OCAqYWNwaV91dF9nZXRfcmVzb3VyY2VfZW5kX3RhZyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CiAKLXZvaWQKLWFjcGlfdXRfbXV0ZXhfdGVybWluYXRlICgKLQl2b2lkKTsKK3U4IGFjcGlfdXRfZ2VuZXJhdGVfY2hlY2tzdW0odTggKiBidWZmZXIsIHUzMiBsZW5ndGgpOwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF9hY3F1aXJlX211dGV4ICgKLQlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKTsKK3UzMiBhY3BpX3V0X2R3b3JkX2J5dGVfc3dhcCh1MzIgdmFsdWUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF9yZWxlYXNlX211dGV4ICgKLQlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKTsKLQotdTggKgotYWNwaV91dF9nZXRfcmVzb3VyY2VfZW5kX3RhZyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwotCi11OAotYWNwaV91dF9nZW5lcmF0ZV9jaGVja3N1bSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLQotdTMyCi1hY3BpX3V0X2R3b3JkX2J5dGVfc3dhcCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0KLXZvaWQKLWFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGggKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb24pOwordm9pZCBhY3BpX3V0X3NldF9pbnRlZ2VyX3dpZHRoKHU4IHJldmlzaW9uKTsKIAogI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCiB2b2lkCi1hY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm9ial9oYW5kbGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCk7CithY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSh1OCB0eXBlLAorCQkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm9ial9oYW5kbGUsCisJCQkgICAgICBjaGFyICpwYXRoKTsKIAogI2VuZGlmCiAKKy8qCisgKiB1dG11dGV4IC0gbXV0ZXggc3VwcG9ydAorICovCithY3BpX3N0YXR1cyBhY3BpX3V0X211dGV4X2luaXRpYWxpemUodm9pZCk7CisKK3ZvaWQgYWNwaV91dF9tdXRleF90ZXJtaW5hdGUodm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfdXRfYWNxdWlyZV9tdXRleChhY3BpX211dGV4X2hhbmRsZSBtdXRleF9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfdXRfcmVsZWFzZV9tdXRleChhY3BpX211dGV4X2hhbmRsZSBtdXRleF9pZCk7CiAKIC8qCiAgKiB1dGFsbG9jIC0gbWVtb3J5IGFsbG9jYXRpb24gYW5kIG9iamVjdCBjYWNoaW5nCiAgKi8KLXZvaWQgKgotYWNwaV91dF9hY3F1aXJlX2Zyb21fY2FjaGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCk7CithY3BpX3N0YXR1cyBhY3BpX3V0X2NyZWF0ZV9jYWNoZXModm9pZCk7CiAKLXZvaWQKLWFjcGlfdXRfcmVsZWFzZV90b19jYWNoZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCk7CithY3BpX3N0YXR1cyBhY3BpX3V0X2RlbGV0ZV9jYWNoZXModm9pZCk7CiAKLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLXZvaWQKLWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfY2FjaGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCk7Ci0jZW5kaWYKK2FjcGlfc3RhdHVzIGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyKHN0cnVjdCBhY3BpX2J1ZmZlciAqYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyICgKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpidWZmZXIpOworYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihzdHJ1Y3QgYWNwaV9idWZmZXIgKmJ1ZmZlciwKKwkJCSAgYWNwaV9zaXplIHJlcXVpcmVkX2xlbmd0aCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyICgKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpidWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9sZW5ndGgpOwordm9pZCAqYWNwaV91dF9hbGxvY2F0ZShhY3BpX3NpemUgc2l6ZSwgdTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlLCB1MzIgbGluZSk7CiAKLXZvaWQgKgotYWNwaV91dF9hbGxvY2F0ZSAoCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOwotCi12b2lkICoKLWFjcGlfdXRfY2FsbG9jYXRlICgKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7Cit2b2lkICphY3BpX3V0X2NhbGxvY2F0ZShhY3BpX3NpemUgc2l6ZSwgdTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlLCB1MzIgbGluZSk7CiAKICNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUwotdm9pZCAqCi1hY3BpX3V0X2FsbG9jYXRlX2FuZF90cmFjayAoCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOwordm9pZCAqYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2soYWNwaV9zaXplIHNpemUsCisJCQkJIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpOwogCi12b2lkICoKLWFjcGlfdXRfY2FsbG9jYXRlX2FuZF90cmFjayAoCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOwordm9pZCAqYWNwaV91dF9jYWxsb2NhdGVfYW5kX3RyYWNrKGFjcGlfc2l6ZSBzaXplLAorCQkJCSAgdTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlLCB1MzIgbGluZSk7CiAKIHZvaWQKLWFjcGlfdXRfZnJlZV9hbmRfdHJhY2sgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7CithY3BpX3V0X2ZyZWVfYW5kX3RyYWNrKHZvaWQgKmFkZHJlc3MsIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpOwogCiAjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKLXZvaWQKLWFjcGlfdXRfZHVtcF9hbGxvY2F0aW9uX2luZm8gKAotCXZvaWQpOwotI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCit2b2lkIGFjcGlfdXRfZHVtcF9hbGxvY2F0aW9uX2luZm8odm9pZCk7CisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAotdm9pZAotYWNwaV91dF9kdW1wX2FsbG9jYXRpb25zICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUpOwordm9pZCBhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbnModTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlKTsKICNlbmRpZgogCi0jZW5kaWYgLyogX0FDVVRJTFNfSCAqLworI2VuZGlmCQkJCS8qIF9BQ1VUSUxTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hbWxjb2RlLmggYi9pbmNsdWRlL2FjcGkvYW1sY29kZS5oCmluZGV4IDU1ZTk3ZWQuLjdmZGY1Mjk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYW1sY29kZS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hbWxjb2RlLmgKQEAgLTU5LDE3ICs1OSwxNyBAQAogI2RlZmluZSBBTUxfV09SRF9PUCAgICAgICAgICAgICAgICAgKHUxNikgMHgwYgogI2RlZmluZSBBTUxfRFdPUkRfT1AgICAgICAgICAgICAgICAgKHUxNikgMHgwYwogI2RlZmluZSBBTUxfU1RSSU5HX09QICAgICAgICAgICAgICAgKHUxNikgMHgwZAotI2RlZmluZSBBTUxfUVdPUkRfT1AgICAgICAgICAgICAgICAgKHUxNikgMHgwZSAgICAgLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQU1MX1FXT1JEX09QICAgICAgICAgICAgICAgICh1MTYpIDB4MGUJLyogQUNQSSAyLjAgKi8KICNkZWZpbmUgQU1MX1NDT1BFX09QICAgICAgICAgICAgICAgICh1MTYpIDB4MTAKICNkZWZpbmUgQU1MX0JVRkZFUl9PUCAgICAgICAgICAgICAgICh1MTYpIDB4MTEKICNkZWZpbmUgQU1MX1BBQ0tBR0VfT1AgICAgICAgICAgICAgICh1MTYpIDB4MTIKLSNkZWZpbmUgQU1MX1ZBUl9QQUNLQUdFX09QICAgICAgICAgICh1MTYpIDB4MTMgICAgIC8qIEFDUEkgMi4wICovCisjZGVmaW5lIEFNTF9WQVJfUEFDS0FHRV9PUCAgICAgICAgICAodTE2KSAweDEzCS8qIEFDUEkgMi4wICovCiAjZGVmaW5lIEFNTF9NRVRIT0RfT1AgICAgICAgICAgICAgICAodTE2KSAweDE0CiAjZGVmaW5lIEFNTF9EVUFMX05BTUVfUFJFRklYICAgICAgICAodTE2KSAweDJlCiAjZGVmaW5lIEFNTF9NVUxUSV9OQU1FX1BSRUZJWF9PUCAgICAodTE2KSAweDJmCiAjZGVmaW5lIEFNTF9OQU1FX0NIQVJfU1VCU0VRICAgICAgICAodTE2KSAweDMwCiAjZGVmaW5lIEFNTF9OQU1FX0NIQVJfRklSU1QgICAgICAgICAodTE2KSAweDQxCi0jZGVmaW5lIEFNTF9PUF9QUkVGSVggICAgICAgICAgICAgICAodTE2KSAweDViCisjZGVmaW5lIEFNTF9FWFRFTkRFRF9PUF9QUkVGSVggICAgICAodTE2KSAweDViCiAjZGVmaW5lIEFNTF9ST09UX1BSRUZJWCAgICAgICAgICAgICAodTE2KSAweDVjCiAjZGVmaW5lIEFNTF9QQVJFTlRfUFJFRklYICAgICAgICAgICAodTE2KSAweDVlCiAjZGVmaW5lIEFNTF9MT0NBTF9PUCAgICAgICAgICAgICAgICAodTE2KSAweDYwCkBAIC0xMDksOCArMTA5LDggQEAKICNkZWZpbmUgQU1MX0ZJTkRfU0VUX0xFRlRfQklUX09QICAgICh1MTYpIDB4ODEKICNkZWZpbmUgQU1MX0ZJTkRfU0VUX1JJR0hUX0JJVF9PUCAgICh1MTYpIDB4ODIKICNkZWZpbmUgQU1MX0RFUkVGX09GX09QICAgICAgICAgICAgICh1MTYpIDB4ODMKLSNkZWZpbmUgQU1MX0NPTkNBVF9SRVNfT1AgICAgICAgICAgICh1MTYpIDB4ODQgICAgIC8qIEFDUEkgMi4wICovCi0jZGVmaW5lIEFNTF9NT0RfT1AgICAgICAgICAgICAgICAgICAodTE2KSAweDg1ICAgICAvKiBBQ1BJIDIuMCAqLworI2RlZmluZSBBTUxfQ09OQ0FUX1JFU19PUCAgICAgICAgICAgKHUxNikgMHg4NAkvKiBBQ1BJIDIuMCAqLworI2RlZmluZSBBTUxfTU9EX09QICAgICAgICAgICAgICAgICAgKHUxNikgMHg4NQkvKiBBQ1BJIDIuMCAqLwogI2RlZmluZSBBTUxfTk9USUZZX09QICAgICAgICAgICAgICAgKHUxNikgMHg4NgogI2RlZmluZSBBTUxfU0laRV9PRl9PUCAgICAgICAgICAgICAgKHUxNikgMHg4NwogI2RlZmluZSBBTUxfSU5ERVhfT1AgICAgICAgICAgICAgICAgKHUxNikgMHg4OApAQCAtMTIwLDIxICsxMjAsMjEgQEAKICNkZWZpbmUgQU1MX0NSRUFURV9CWVRFX0ZJRUxEX09QICAgICh1MTYpIDB4OGMKICNkZWZpbmUgQU1MX0NSRUFURV9CSVRfRklFTERfT1AgICAgICh1MTYpIDB4OGQKICNkZWZpbmUgQU1MX1RZUEVfT1AgICAgICAgICAgICAgICAgICh1MTYpIDB4OGUKLSNkZWZpbmUgQU1MX0NSRUFURV9RV09SRF9GSUVMRF9PUCAgICh1MTYpIDB4OGYgICAgIC8qIEFDUEkgMi4wICovCisjZGVmaW5lIEFNTF9DUkVBVEVfUVdPUkRfRklFTERfT1AgICAodTE2KSAweDhmCS8qIEFDUEkgMi4wICovCiAjZGVmaW5lIEFNTF9MQU5EX09QICAgICAgICAgICAgICAgICAodTE2KSAweDkwCiAjZGVmaW5lIEFNTF9MT1JfT1AgICAgICAgICAgICAgICAgICAodTE2KSAweDkxCiAjZGVmaW5lIEFNTF9MTk9UX09QICAgICAgICAgICAgICAgICAodTE2KSAweDkyCiAjZGVmaW5lIEFNTF9MRVFVQUxfT1AgICAgICAgICAgICAgICAodTE2KSAweDkzCiAjZGVmaW5lIEFNTF9MR1JFQVRFUl9PUCAgICAgICAgICAgICAodTE2KSAweDk0CiAjZGVmaW5lIEFNTF9MTEVTU19PUCAgICAgICAgICAgICAgICAodTE2KSAweDk1Ci0jZGVmaW5lIEFNTF9UT19CVUZGRVJfT1AgICAgICAgICAgICAodTE2KSAweDk2ICAgICAvKiBBQ1BJIDIuMCAqLwotI2RlZmluZSBBTUxfVE9fREVDU1RSSU5HX09QICAgICAgICAgKHUxNikgMHg5NyAgICAgLyogQUNQSSAyLjAgKi8KLSNkZWZpbmUgQU1MX1RPX0hFWFNUUklOR19PUCAgICAgICAgICh1MTYpIDB4OTggICAgIC8qIEFDUEkgMi4wICovCi0jZGVmaW5lIEFNTF9UT19JTlRFR0VSX09QICAgICAgICAgICAodTE2KSAweDk5ICAgICAvKiBBQ1BJIDIuMCAqLwotI2RlZmluZSBBTUxfVE9fU1RSSU5HX09QICAgICAgICAgICAgKHUxNikgMHg5YyAgICAgLyogQUNQSSAyLjAgKi8KLSNkZWZpbmUgQU1MX0NPUFlfT1AgICAgICAgICAgICAgICAgICh1MTYpIDB4OWQgICAgIC8qIEFDUEkgMi4wICovCi0jZGVmaW5lIEFNTF9NSURfT1AgICAgICAgICAgICAgICAgICAodTE2KSAweDllICAgICAvKiBBQ1BJIDIuMCAqLwotI2RlZmluZSBBTUxfQ09OVElOVUVfT1AgICAgICAgICAgICAgKHUxNikgMHg5ZiAgICAgLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQU1MX1RPX0JVRkZFUl9PUCAgICAgICAgICAgICh1MTYpIDB4OTYJLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQU1MX1RPX0RFQ1NUUklOR19PUCAgICAgICAgICh1MTYpIDB4OTcJLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQU1MX1RPX0hFWFNUUklOR19PUCAgICAgICAgICh1MTYpIDB4OTgJLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQU1MX1RPX0lOVEVHRVJfT1AgICAgICAgICAgICh1MTYpIDB4OTkJLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQU1MX1RPX1NUUklOR19PUCAgICAgICAgICAgICh1MTYpIDB4OWMJLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQU1MX0NPUFlfT1AgICAgICAgICAgICAgICAgICh1MTYpIDB4OWQJLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQU1MX01JRF9PUCAgICAgICAgICAgICAgICAgICh1MTYpIDB4OWUJLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQU1MX0NPTlRJTlVFX09QICAgICAgICAgICAgICh1MTYpIDB4OWYJLyogQUNQSSAyLjAgKi8KICNkZWZpbmUgQU1MX0lGX09QICAgICAgICAgICAgICAgICAgICh1MTYpIDB4YTAKICNkZWZpbmUgQU1MX0VMU0VfT1AgICAgICAgICAgICAgICAgICh1MTYpIDB4YTEKICNkZWZpbmUgQU1MX1dISUxFX09QICAgICAgICAgICAgICAgICh1MTYpIDB4YTIKQEAgLTE0Niw3ICsxNDYsNyBAQAogCiAvKiBwcmVmaXhlZCBvcGNvZGVzICovCiAKLSNkZWZpbmUgQU1MX0VYVE9QICAgICAgICAgICAgICAgICAgICh1MTYpIDB4MDA1YiAgICAgLyogcHJlZml4IGZvciAyLWJ5dGUgb3Bjb2RlcyAqLworI2RlZmluZSBBTUxfRVhURU5ERURfT1BDT0RFICAgICAgICAgKHUxNikgMHg1YjAwCS8qIHByZWZpeCBmb3IgMi1ieXRlIG9wY29kZXMgKi8KIAogI2RlZmluZSBBTUxfTVVURVhfT1AgICAgICAgICAgICAgICAgKHUxNikgMHg1YjAxCiAjZGVmaW5lIEFNTF9FVkVOVF9PUCAgICAgICAgICAgICAgICAodTE2KSAweDViMDIKQEAgLTE1NCw3ICsxNTQsNyBAQAogI2RlZmluZSBBTUxfU0hJRlRfTEVGVF9CSVRfT1AgICAgICAgKHUxNikgMHg1YjExCiAjZGVmaW5lIEFNTF9DT05EX1JFRl9PRl9PUCAgICAgICAgICAodTE2KSAweDViMTIKICNkZWZpbmUgQU1MX0NSRUFURV9GSUVMRF9PUCAgICAgICAgICh1MTYpIDB4NWIxMwotI2RlZmluZSBBTUxfTE9BRF9UQUJMRV9PUCAgICAgICAgICAgKHUxNikgMHg1YjFmICAgICAvKiBBQ1BJIDIuMCAqLworI2RlZmluZSBBTUxfTE9BRF9UQUJMRV9PUCAgICAgICAgICAgKHUxNikgMHg1YjFmCS8qIEFDUEkgMi4wICovCiAjZGVmaW5lIEFNTF9MT0FEX09QICAgICAgICAgICAgICAgICAodTE2KSAweDViMjAKICNkZWZpbmUgQU1MX1NUQUxMX09QICAgICAgICAgICAgICAgICh1MTYpIDB4NWIyMQogI2RlZmluZSBBTUxfU0xFRVBfT1AgICAgICAgICAgICAgICAgKHUxNikgMHg1YjIyCkBAIC0xNjksNyArMTY5LDcgQEAKICNkZWZpbmUgQU1MX1JFVklTSU9OX09QICAgICAgICAgICAgICh1MTYpIDB4NWIzMAogI2RlZmluZSBBTUxfREVCVUdfT1AgICAgICAgICAgICAgICAgKHUxNikgMHg1YjMxCiAjZGVmaW5lIEFNTF9GQVRBTF9PUCAgICAgICAgICAgICAgICAodTE2KSAweDViMzIKLSNkZWZpbmUgQU1MX1RJTUVSX09QICAgICAgICAgICAgICAgICh1MTYpIDB4NWIzMyAgICAgLyogQUNQSSAzLjAgKi8KKyNkZWZpbmUgQU1MX1RJTUVSX09QICAgICAgICAgICAgICAgICh1MTYpIDB4NWIzMwkvKiBBQ1BJIDMuMCAqLwogI2RlZmluZSBBTUxfUkVHSU9OX09QICAgICAgICAgICAgICAgKHUxNikgMHg1YjgwCiAjZGVmaW5lIEFNTF9GSUVMRF9PUCAgICAgICAgICAgICAgICAodTE2KSAweDViODEKICNkZWZpbmUgQU1MX0RFVklDRV9PUCAgICAgICAgICAgICAgICh1MTYpIDB4NWI4MgpAQCAtMTc4LDggKzE3OCw3IEBACiAjZGVmaW5lIEFNTF9USEVSTUFMX1pPTkVfT1AgICAgICAgICAodTE2KSAweDViODUKICNkZWZpbmUgQU1MX0lOREVYX0ZJRUxEX09QICAgICAgICAgICh1MTYpIDB4NWI4NgogI2RlZmluZSBBTUxfQkFOS19GSUVMRF9PUCAgICAgICAgICAgKHUxNikgMHg1Yjg3Ci0jZGVmaW5lIEFNTF9EQVRBX1JFR0lPTl9PUCAgICAgICAgICAodTE2KSAweDViODggICAgIC8qIEFDUEkgMi4wICovCi0KKyNkZWZpbmUgQU1MX0RBVEFfUkVHSU9OX09QICAgICAgICAgICh1MTYpIDB4NWI4OAkvKiBBQ1BJIDIuMCAqLwogCiAvKiBCb2d1cyBvcGNvZGVzICh0aGV5IGFyZSBhY3R1YWxseSB0d28gc2VwYXJhdGUgb3Bjb2RlcykgKi8KIApAQCAtMTg3LDcgKzE4Niw2IEBACiAjZGVmaW5lIEFNTF9MTEVTU0VRVUFMX09QICAgICAgICAgICAodTE2KSAweDkyOTQKICNkZWZpbmUgQU1MX0xOT1RFUVVBTF9PUCAgICAgICAgICAgICh1MTYpIDB4OTI5MwogCi0KIC8qCiAgKiBJbnRlcm5hbCBvcGNvZGVzCiAgKiBVc2Ugb25seSAiVW5rbm93biIgQU1MIG9wY29kZXMsIGRvbid0IGF0dGVtcHQgdG8gdXNlCkBAIC0yMDMsNyArMjAxLDYgQEAKICNkZWZpbmUgQU1MX0lOVF9SRVRVUk5fVkFMVUVfT1AgICAgICh1MTYpIDB4MDAzNgogI2RlZmluZSBBTUxfSU5UX0VWQUxfU1VCVFJFRV9PUCAgICAgKHUxNikgMHgwMDM3CiAKLQogI2RlZmluZSBBUkdfTk9ORSAgICAgICAgICAgICAgICAgICAgMHgwCiAKIC8qCkBAIC0yNDUsNyArMjQyLDcgQEAKIAogLyogU2luZ2xlLCBzaW1wbGUgdHlwZXMgKi8KIAotI2RlZmluZSBBUkdJX0FOWVRZUEUgICAgICAgICAgICAgICAgMHgwMSAgICAvKiBEb24ndCBjYXJlICovCisjZGVmaW5lIEFSR0lfQU5ZVFlQRSAgICAgICAgICAgICAgICAweDAxCS8qIERvbid0IGNhcmUgKi8KICNkZWZpbmUgQVJHSV9QQUNLQUdFICAgICAgICAgICAgICAgIDB4MDIKICNkZWZpbmUgQVJHSV9FVkVOVCAgICAgICAgICAgICAgICAgIDB4MDMKICNkZWZpbmUgQVJHSV9NVVRFWCAgICAgICAgICAgICAgICAgIDB4MDQKQEAgLTI1Niw4ICsyNTMsOCBAQAogI2RlZmluZSBBUkdJX0lOVEVHRVIgICAgICAgICAgICAgICAgMHgwNgogI2RlZmluZSBBUkdJX1NUUklORyAgICAgICAgICAgICAgICAgMHgwNwogI2RlZmluZSBBUkdJX0JVRkZFUiAgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBBUkdJX0JVRkZFUl9PUl9TVFJJTkcgICAgICAgMHgwOSAgICAvKiBVc2VkIGJ5IE1JRCBvcCBvbmx5ICovCi0jZGVmaW5lIEFSR0lfQ09NUFVURURBVEEgICAgICAgICAgICAweDBBICAgIC8qIEJ1ZmZlciwgU3RyaW5nLCBvciBJbnRlZ2VyICovCisjZGVmaW5lIEFSR0lfQlVGRkVSX09SX1NUUklORyAgICAgICAweDA5CS8qIFVzZWQgYnkgTUlEIG9wIG9ubHkgKi8KKyNkZWZpbmUgQVJHSV9DT01QVVRFREFUQSAgICAgICAgICAgIDB4MEEJLyogQnVmZmVyLCBTdHJpbmcsIG9yIEludGVnZXIgKi8KIAogLyogUmVmZXJlbmNlIG9iamVjdHMgKi8KIApAQCAtMjY1LDMwICsyNjIsMjggQEAKICNkZWZpbmUgQVJHSV9PQkpFQ1RfUkVGICAgICAgICAgICAgIDB4MEMKICNkZWZpbmUgQVJHSV9ERVZJQ0VfUkVGICAgICAgICAgICAgIDB4MEQKICNkZWZpbmUgQVJHSV9SRUZFUkVOQ0UgICAgICAgICAgICAgIDB4MEUKLSNkZWZpbmUgQVJHSV9UQVJHRVRSRUYgICAgICAgICAgICAgIDB4MEYgICAgLyogVGFyZ2V0LCBzdWJqZWN0IHRvIGltcGxpY2l0IGNvbnZlcnNpb24gKi8KLSNkZWZpbmUgQVJHSV9GSVhFRF9UQVJHRVQgICAgICAgICAgIDB4MTAgICAgLyogVGFyZ2V0LCBubyBpbXBsaWNpdCBjb252ZXJzaW9uICovCi0jZGVmaW5lIEFSR0lfU0lNUExFX1RBUkdFVCAgICAgICAgICAweDExICAgIC8qIE5hbWUsIExvY2FsLCBBcmcgLS0gbm8gaW1wbGljaXQgY29udmVyc2lvbiAqLworI2RlZmluZSBBUkdJX1RBUkdFVFJFRiAgICAgICAgICAgICAgMHgwRgkvKiBUYXJnZXQsIHN1YmplY3QgdG8gaW1wbGljaXQgY29udmVyc2lvbiAqLworI2RlZmluZSBBUkdJX0ZJWEVEX1RBUkdFVCAgICAgICAgICAgMHgxMAkvKiBUYXJnZXQsIG5vIGltcGxpY2l0IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgQVJHSV9TSU1QTEVfVEFSR0VUICAgICAgICAgIDB4MTEJLyogTmFtZSwgTG9jYWwsIEFyZyAtLSBubyBpbXBsaWNpdCBjb252ZXJzaW9uICovCiAKIC8qIE11bHRpcGxlL2NvbXBsZXggdHlwZXMgKi8KIAotI2RlZmluZSBBUkdJX0RBVEFPQkpFQ1QgICAgICAgICAgICAgMHgxMiAgICAvKiBCdWZmZXIsIFN0cmluZywgcGFja2FnZSBvciByZWZlcmVuY2UgdG8gYSBOb2RlIC0gVXNlZCBvbmx5IGJ5IHNpemVfb2Ygb3BlcmF0b3IqLwotI2RlZmluZSBBUkdJX0NPTVBMRVhPQkogICAgICAgICAgICAgMHgxMyAgICAvKiBCdWZmZXIsIFN0cmluZywgb3IgcGFja2FnZSAoVXNlZCBieSBJTkRFWCBvcCBvbmx5KSAqLwotI2RlZmluZSBBUkdJX1JFRl9PUl9TVFJJTkcgICAgICAgICAgMHgxNCAgICAvKiBSZWZlcmVuY2Ugb3IgU3RyaW5nIChVc2VkIGJ5IERFUkVGT0Ygb3Agb25seSkgKi8KLSNkZWZpbmUgQVJHSV9SRUdJT05fT1JfRklFTEQgICAgICAgIDB4MTUgICAgLyogVXNlZCBieSBMT0FEIG9wIG9ubHkgKi8KKyNkZWZpbmUgQVJHSV9EQVRBT0JKRUNUICAgICAgICAgICAgIDB4MTIJLyogQnVmZmVyLCBTdHJpbmcsIHBhY2thZ2Ugb3IgcmVmZXJlbmNlIHRvIGEgTm9kZSAtIFVzZWQgb25seSBieSBzaXplX29mIG9wZXJhdG9yICovCisjZGVmaW5lIEFSR0lfQ09NUExFWE9CSiAgICAgICAgICAgICAweDEzCS8qIEJ1ZmZlciwgU3RyaW5nLCBvciBwYWNrYWdlIChVc2VkIGJ5IElOREVYIG9wIG9ubHkpICovCisjZGVmaW5lIEFSR0lfUkVGX09SX1NUUklORyAgICAgICAgICAweDE0CS8qIFJlZmVyZW5jZSBvciBTdHJpbmcgKFVzZWQgYnkgREVSRUZPRiBvcCBvbmx5KSAqLworI2RlZmluZSBBUkdJX1JFR0lPTl9PUl9GSUVMRCAgICAgICAgMHgxNQkvKiBVc2VkIGJ5IExPQUQgb3Agb25seSAqLwogI2RlZmluZSBBUkdJX0RBVEFSRUZPQkogICAgICAgICAgICAgMHgxNgogCiAvKiBOb3RlOiB0eXBlcyBhYm92ZSBjYW4gZXhwYW5kIHRvIDB4MUYgbWF4aW11bSAqLwogCiAjZGVmaW5lIEFSR0lfSU5WQUxJRF9PUENPREUgICAgICAgICAweEZGRkZGRkZGCiAKLQogLyoKICAqIGhhc2ggb2Zmc2V0cwogICovCiAjZGVmaW5lIEFNTF9FWFRPUF9IQVNIX09GRlNFVCAgICAgICAyMgogI2RlZmluZSBBTUxfTE5PVF9IQVNIX09GRlNFVCAgICAgICAgMTkKIAotCiAvKgogICogb3Bjb2RlIGdyb3VwcyBhbmQgdHlwZXMKICAqLwpAQCAtMjk2LDcgKzI5MSw2IEBACiAjZGVmaW5lIE9QR1JQX0ZJRUxEICAgICAgICAgICAgICAgICAweDAyCiAjZGVmaW5lIE9QR1JQX0JZVEVMSVNUICAgICAgICAgICAgICAweDA0CiAKLQogLyoKICAqIE9wY29kZSBpbmZvcm1hdGlvbgogICovCkBAIC0zMjIsMzEgKzMxNiwzMCBAQAogLyogQ29udmVuaWVudCBmbGFnIGdyb3VwaW5ncyAqLwogCiAjZGVmaW5lIEFNTF9GTEFHU19FWEVDXzBBXzBUXzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNTF9IQVNfUkVUVkFMCi0jZGVmaW5lIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSICAgICBBTUxfSEFTX0FSR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbmFkaWMxICAqLwotI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiAgICAgQU1MX0hBU19BUkdTIHwgICAgICAgICAgICAgICAgICBBTUxfSEFTX1JFVFZBTCAvKiBNb25hZGljMiAgKi8KKyNkZWZpbmUgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIgICAgIEFNTF9IQVNfQVJHUwkvKiBNb25hZGljMSAgKi8KKyNkZWZpbmUgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIgICAgIEFNTF9IQVNfQVJHUyB8ICAgICAgICAgICAgICAgICAgQU1MX0hBU19SRVRWQUwJLyogTW9uYWRpYzIgICovCiAjZGVmaW5lIEFNTF9GTEFHU19FWEVDXzFBXzFUXzBSICAgICBBTUxfSEFTX0FSR1MgfCBBTUxfSEFTX1RBUkdFVAotI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiAgICAgQU1MX0hBU19BUkdTIHwgQU1MX0hBU19UQVJHRVQgfCBBTUxfSEFTX1JFVFZBTCAvKiBtb25hZGljMl9yICovCi0jZGVmaW5lIEFNTF9GTEFHU19FWEVDXzJBXzBUXzBSICAgICBBTUxfSEFTX0FSR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIER5YWRpYzEgICAqLwotI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiAgICAgQU1MX0hBU19BUkdTIHwgICAgICAgICAgICAgICAgICBBTUxfSEFTX1JFVFZBTCAvKiBEeWFkaWMyICAgKi8KLSNkZWZpbmUgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9IQVNfVEFSR0VUIHwgQU1MX0hBU19SRVRWQUwgLyogZHlhZGljMl9yICAqLworI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiAgICAgQU1MX0hBU19BUkdTIHwgQU1MX0hBU19UQVJHRVQgfCBBTUxfSEFTX1JFVFZBTAkvKiBtb25hZGljMl9yICovCisjZGVmaW5lIEFNTF9GTEFHU19FWEVDXzJBXzBUXzBSICAgICBBTUxfSEFTX0FSR1MJLyogRHlhZGljMSAgICovCisjZGVmaW5lIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSICAgICBBTUxfSEFTX0FSR1MgfCAgICAgICAgICAgICAgICAgIEFNTF9IQVNfUkVUVkFMCS8qIER5YWRpYzIgICAqLworI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiAgICAgQU1MX0hBU19BUkdTIHwgQU1MX0hBU19UQVJHRVQgfCBBTUxfSEFTX1JFVFZBTAkvKiBkeWFkaWMyX3IgICovCiAjZGVmaW5lIEFNTF9GTEFHU19FWEVDXzJBXzJUXzFSICAgICBBTUxfSEFTX0FSR1MgfCBBTUxfSEFTX1RBUkdFVCB8IEFNTF9IQVNfUkVUVkFMCiAjZGVmaW5lIEFNTF9GTEFHU19FWEVDXzNBXzBUXzBSICAgICBBTUxfSEFTX0FSR1MKICNkZWZpbmUgQU1MX0ZMQUdTX0VYRUNfM0FfMVRfMVIgICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9IQVNfVEFSR0VUIHwgQU1MX0hBU19SRVRWQUwKICNkZWZpbmUgQU1MX0ZMQUdTX0VYRUNfNkFfMFRfMVIgICAgIEFNTF9IQVNfQVJHUyB8ICAgICAgICAgICAgICAgICAgQU1MX0hBU19SRVRWQUwKIAotCiAvKgogICogVGhlIG9wY29kZSBUeXBlIGlzIHVzZWQgaW4gYSBkaXNwYXRjaCB0YWJsZSwgZG8gbm90IGNoYW5nZQogICogd2l0aG91dCB1cGRhdGluZyB0aGUgdGFibGUuCiAgKi8KICNkZWZpbmUgQU1MX1RZUEVfRVhFQ18wQV8wVF8xUiAgICAgIDB4MDAKLSNkZWZpbmUgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiAgICAgIDB4MDEgLyogTW9uYWRpYzEgICovCi0jZGVmaW5lIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIgICAgICAweDAyIC8qIE1vbmFkaWMyICAqLworI2RlZmluZSBBTUxfVFlQRV9FWEVDXzFBXzBUXzBSICAgICAgMHgwMQkvKiBNb25hZGljMSAgKi8KKyNkZWZpbmUgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiAgICAgIDB4MDIJLyogTW9uYWRpYzIgICovCiAjZGVmaW5lIEFNTF9UWVBFX0VYRUNfMUFfMVRfMFIgICAgICAweDAzCi0jZGVmaW5lIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIgICAgICAweDA0IC8qIG1vbmFkaWMyX3IgKi8KLSNkZWZpbmUgQU1MX1RZUEVfRVhFQ18yQV8wVF8wUiAgICAgIDB4MDUgLyogRHlhZGljMSAgICovCi0jZGVmaW5lIEFNTF9UWVBFX0VYRUNfMkFfMFRfMVIgICAgICAweDA2IC8qIER5YWRpYzIgICAqLwotI2RlZmluZSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSICAgICAgMHgwNyAvKiBkeWFkaWMyX3IgICovCisjZGVmaW5lIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIgICAgICAweDA0CS8qIG1vbmFkaWMyX3IgKi8KKyNkZWZpbmUgQU1MX1RZUEVfRVhFQ18yQV8wVF8wUiAgICAgIDB4MDUJLyogRHlhZGljMSAgICovCisjZGVmaW5lIEFNTF9UWVBFX0VYRUNfMkFfMFRfMVIgICAgICAweDA2CS8qIER5YWRpYzIgICAqLworI2RlZmluZSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSICAgICAgMHgwNwkvKiBkeWFkaWMyX3IgICovCiAjZGVmaW5lIEFNTF9UWVBFX0VYRUNfMkFfMlRfMVIgICAgICAweDA4CiAjZGVmaW5lIEFNTF9UWVBFX0VYRUNfM0FfMFRfMFIgICAgICAweDA5CiAjZGVmaW5lIEFNTF9UWVBFX0VYRUNfM0FfMVRfMVIgICAgICAweDBBCkBAIC0zOTksNDAgKzM5MiwzMyBAQAogI2RlZmluZSBBTUxfQ0xBU1NfTUVUSE9EX0NBTEwgICAgICAgMHgwOQogI2RlZmluZSBBTUxfQ0xBU1NfVU5LTk9XTiAgICAgICAgICAgMHgwQQogCi0KIC8qIFByZWRlZmluZWQgT3BlcmF0aW9uIFJlZ2lvbiBzcGFjZV9pRHMgKi8KIAotdHlwZWRlZiBlbnVtCi17Ci0JUkVHSU9OX01FTU9SWSAgICAgICAgICAgICAgICAgICA9IDAsCit0eXBlZGVmIGVudW0geworCVJFR0lPTl9NRU1PUlkgPSAwLAogCVJFR0lPTl9JTywKIAlSRUdJT05fUENJX0NPTkZJRywKIAlSRUdJT05fRUMsCiAJUkVHSU9OX1NNQlVTLAogCVJFR0lPTl9DTU9TLAogCVJFR0lPTl9QQ0lfQkFSLAotCVJFR0lPTl9EQVRBX1RBQkxFLCAgICAgICAgICAgICAgLyogSW50ZXJuYWwgdXNlIG9ubHkgKi8KLQlSRUdJT05fRklYRURfSFcgICAgICAgICAgICAgICAgID0gMHg3RgotCisJUkVHSU9OX0RBVEFfVEFCTEUsCS8qIEludGVybmFsIHVzZSBvbmx5ICovCisJUkVHSU9OX0ZJWEVEX0hXID0gMHg3RgogfSBBTUxfUkVHSU9OX1RZUEVTOwogCi0KIC8qIENvbXBhcmlzb24gb3BlcmF0aW9uIGNvZGVzIGZvciBtYXRjaF9vcCBvcGVyYXRvciAqLwogCi10eXBlZGVmIGVudW0KLXsKLQlNQVRDSF9NVFIgICAgICAgICAgICAgICAgICAgICAgID0gMCwKLQlNQVRDSF9NRVEgICAgICAgICAgICAgICAgICAgICAgID0gMSwKLQlNQVRDSF9NTEUgICAgICAgICAgICAgICAgICAgICAgID0gMiwKLQlNQVRDSF9NTFQgICAgICAgICAgICAgICAgICAgICAgID0gMywKLQlNQVRDSF9NR0UgICAgICAgICAgICAgICAgICAgICAgID0gNCwKLQlNQVRDSF9NR1QgICAgICAgICAgICAgICAgICAgICAgID0gNQotCit0eXBlZGVmIGVudW0geworCU1BVENIX01UUiA9IDAsCisJTUFUQ0hfTUVRID0gMSwKKwlNQVRDSF9NTEUgPSAyLAorCU1BVENIX01MVCA9IDMsCisJTUFUQ0hfTUdFID0gNCwKKwlNQVRDSF9NR1QgPSA1CiB9IEFNTF9NQVRDSF9PUEVSQVRPUjsKIAogI2RlZmluZSBNQVhfTUFUQ0hfT1BFUkFUT1IgICAgICAgICAgNQogCi0KIC8qCiAgKiBmaWVsZF9mbGFncwogICoKQEAgLTQ1MCw2MCArNDM2LDQ3IEBACiAjZGVmaW5lIEFNTF9GSUVMRF9MT0NLX1JVTEVfTUFTSyAgICAweDEwCiAjZGVmaW5lIEFNTF9GSUVMRF9VUERBVEVfUlVMRV9NQVNLICAweDYwCiAKLQogLyogMSkgRmllbGQgQWNjZXNzIFR5cGVzICovCiAKLXR5cGVkZWYgZW51bQotewotCUFNTF9GSUVMRF9BQ0NFU1NfQU5ZICAgICAgICAgICAgPSAweDAwLAotCUFNTF9GSUVMRF9BQ0NFU1NfQllURSAgICAgICAgICAgPSAweDAxLAotCUFNTF9GSUVMRF9BQ0NFU1NfV09SRCAgICAgICAgICAgPSAweDAyLAotCUFNTF9GSUVMRF9BQ0NFU1NfRFdPUkQgICAgICAgICAgPSAweDAzLAotCUFNTF9GSUVMRF9BQ0NFU1NfUVdPUkQgICAgICAgICAgPSAweDA0LCAgICAvKiBBQ1BJIDIuMCAqLwotCUFNTF9GSUVMRF9BQ0NFU1NfQlVGRkVSICAgICAgICAgPSAweDA1ICAgICAvKiBBQ1BJIDIuMCAqLwotCit0eXBlZGVmIGVudW0geworCUFNTF9GSUVMRF9BQ0NFU1NfQU5ZID0gMHgwMCwKKwlBTUxfRklFTERfQUNDRVNTX0JZVEUgPSAweDAxLAorCUFNTF9GSUVMRF9BQ0NFU1NfV09SRCA9IDB4MDIsCisJQU1MX0ZJRUxEX0FDQ0VTU19EV09SRCA9IDB4MDMsCisJQU1MX0ZJRUxEX0FDQ0VTU19RV09SRCA9IDB4MDQsCS8qIEFDUEkgMi4wICovCisJQU1MX0ZJRUxEX0FDQ0VTU19CVUZGRVIgPSAweDA1CS8qIEFDUEkgMi4wICovCiB9IEFNTF9BQ0NFU1NfVFlQRTsKIAotCiAvKiAyKSBGaWVsZCBMb2NrIFJ1bGVzICovCiAKLXR5cGVkZWYgZW51bQotewotCUFNTF9GSUVMRF9MT0NLX05FVkVSICAgICAgICAgICAgPSAweDAwLAotCUFNTF9GSUVMRF9MT0NLX0FMV0FZUyAgICAgICAgICAgPSAweDEwCi0KK3R5cGVkZWYgZW51bSB7CisJQU1MX0ZJRUxEX0xPQ0tfTkVWRVIgPSAweDAwLAorCUFNTF9GSUVMRF9MT0NLX0FMV0FZUyA9IDB4MTAKIH0gQU1MX0xPQ0tfUlVMRTsKIAotCiAvKiAzKSBGaWVsZCBVcGRhdGUgUnVsZXMgKi8KIAotdHlwZWRlZiBlbnVtCi17Ci0JQU1MX0ZJRUxEX1VQREFURV9QUkVTRVJWRSAgICAgICA9IDB4MDAsCi0JQU1MX0ZJRUxEX1VQREFURV9XUklURV9BU19PTkVTICA9IDB4MjAsCit0eXBlZGVmIGVudW0geworCUFNTF9GSUVMRF9VUERBVEVfUFJFU0VSVkUgPSAweDAwLAorCUFNTF9GSUVMRF9VUERBVEVfV1JJVEVfQVNfT05FUyA9IDB4MjAsCiAJQU1MX0ZJRUxEX1VQREFURV9XUklURV9BU19aRVJPUyA9IDB4NDAKLQogfSBBTUxfVVBEQVRFX1JVTEU7CiAKLQogLyoKICAqIEZpZWxkIEFjY2VzcyBBdHRyaWJ1dGVzLgogICogVGhpcyBieXRlIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBBTUwgdmlhIHRoZQogICogYWNjZXNzX2FzIGtleXdvcmQKICAqLwotdHlwZWRlZiBlbnVtCi17Ci0JQU1MX0ZJRUxEX0FUVFJJQl9TTUJfUVVJQ0sgICAgICA9IDB4MDIsCi0JQU1MX0ZJRUxEX0FUVFJJQl9TTUJfU0VORF9SQ1YgICA9IDB4MDQsCi0JQU1MX0ZJRUxEX0FUVFJJQl9TTUJfQllURSAgICAgICA9IDB4MDYsCi0JQU1MX0ZJRUxEX0FUVFJJQl9TTUJfV09SRCAgICAgICA9IDB4MDgsCi0JQU1MX0ZJRUxEX0FUVFJJQl9TTUJfQkxPQ0sgICAgICA9IDB4MEEsCi0JQU1MX0ZJRUxEX0FUVFJJQl9TTUJfV09SRF9DQUxMICA9IDB4MEMsCit0eXBlZGVmIGVudW0geworCUFNTF9GSUVMRF9BVFRSSUJfU01CX1FVSUNLID0gMHgwMiwKKwlBTUxfRklFTERfQVRUUklCX1NNQl9TRU5EX1JDViA9IDB4MDQsCisJQU1MX0ZJRUxEX0FUVFJJQl9TTUJfQllURSA9IDB4MDYsCisJQU1MX0ZJRUxEX0FUVFJJQl9TTUJfV09SRCA9IDB4MDgsCisJQU1MX0ZJRUxEX0FUVFJJQl9TTUJfQkxPQ0sgPSAweDBBLAorCUFNTF9GSUVMRF9BVFRSSUJfU01CX1dPUkRfQ0FMTCA9IDB4MEMsCiAJQU1MX0ZJRUxEX0FUVFJJQl9TTUJfQkxPQ0tfQ0FMTCA9IDB4MEQKLQogfSBBTUxfQUNDRVNTX0FUVFJJQlVURTsKIAotCiAvKiBCaXQgZmllbGRzIGluIG1ldGhvZF9mbGFncyBieXRlICovCiAKICNkZWZpbmUgQU1MX01FVEhPRF9BUkdfQ09VTlQgICAgICAgIDB4MDcKQEAgLTUxNiw1ICs0ODksNCBAQAogI2RlZmluZSBBTUxfTUVUSE9EX1JFU0VSVkVEMSAgICAgICAgMHgwMgogI2RlZmluZSBBTUxfTUVUSE9EX1JFU0VSVkVEMiAgICAgICAgMHgwNAogCi0KLSNlbmRpZiAvKiBfX0FNTENPREVfSF9fICovCisjZW5kaWYJCQkJLyogX19BTUxDT0RFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FtbHJlc3JjLmggYi9pbmNsdWRlL2FjcGkvYW1scmVzcmMuaAppbmRleCBiMjBlYzMwLi4wNTE3ODZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYW1scmVzcmMuaAorKysgYi9pbmNsdWRlL2FjcGkvYW1scmVzcmMuaApAQCAtNDIsMjkgKzQyLDI3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaWZuZGVmIF9fQU1MUkVTUkNfSAogI2RlZmluZSBfX0FNTFJFU1JDX0gKIAotCiAjZGVmaW5lIEFTTF9SRVNOQU1FX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAiX0FEUiIKICNkZWZpbmUgQVNMX1JFU05BTUVfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICJfQUxOIgogI2RlZmluZSBBU0xfUkVTTkFNRV9BRERSRVNTU1BBQ0UgICAgICAgICAgICAgICAgIl9BU0kiCiAjZGVmaW5lIEFTTF9SRVNOQU1FX0FDQ0VTU1NJWkUgICAgICAgICAgICAgICAgICAiX0FTWiIKICNkZWZpbmUgQVNMX1JFU05BTUVfVFlQRVNQRUNJRklDQVRUUklCVVRFUyAgICAgICJfQVRUIgogI2RlZmluZSBBU0xfUkVTTkFNRV9CQVNFQUREUkVTUyAgICAgICAgICAgICAgICAgIl9CQVMiCi0jZGVmaW5lIEFTTF9SRVNOQU1FX0JVU01BU1RFUiAgICAgICAgICAgICAgICAgICAiX0JNXyIgIC8qIE1hc3RlcigxKSwgU2xhdmUoMCkgKi8KKyNkZWZpbmUgQVNMX1JFU05BTUVfQlVTTUFTVEVSICAgICAgICAgICAgICAgICAgICJfQk1fIgkvKiBNYXN0ZXIoMSksIFNsYXZlKDApICovCiAjZGVmaW5lIEFTTF9SRVNOQU1FX0RFQ09ERSAgICAgICAgICAgICAgICAgICAgICAiX0RFQyIKICNkZWZpbmUgQVNMX1JFU05BTUVfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICJfRE1BIgotI2RlZmluZSBBU0xfUkVTTkFNRV9ETUFUWVBFICAgICAgICAgICAgICAgICAgICAgIl9UWVAiICAvKiBDb21wYXRpYmxlKDApLCBBKDEpLCBCKDIpLCBGKDMpICovCisjZGVmaW5lIEFTTF9SRVNOQU1FX0RNQVRZUEUgICAgICAgICAgICAgICAgICAgICAiX1RZUCIJLyogQ29tcGF0aWJsZSgwKSwgQSgxKSwgQigyKSwgRigzKSAqLwogI2RlZmluZSBBU0xfUkVTTkFNRV9HUkFOVUxBUklUWSAgICAgICAgICAgICAgICAgIl9HUkEiCiAjZGVmaW5lIEFTTF9SRVNOQU1FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAiX0lOVCIKLSNkZWZpbmUgQVNMX1JFU05BTUVfSU5URVJSVVBUTEVWRUwgICAgICAgICAgICAgICJfTExfIiAgLyogYWN0aXZlX2xvKDEpLCBhY3RpdmVfaGkoMCkgKi8KLSNkZWZpbmUgQVNMX1JFU05BTUVfSU5URVJSVVBUU0hBUkUgICAgICAgICAgICAgICJfU0hSIiAgLyogU2hhcmVhYmxlKDEpLCBub19zaGFyZSgwKSAqLwotI2RlZmluZSBBU0xfUkVTTkFNRV9JTlRFUlJVUFRUWVBFICAgICAgICAgICAgICAgIl9IRV8iICAvKiBFZGdlKDEpLCBMZXZlbCgwKSAqLworI2RlZmluZSBBU0xfUkVTTkFNRV9JTlRFUlJVUFRMRVZFTCAgICAgICAgICAgICAgIl9MTF8iCS8qIGFjdGl2ZV9sbygxKSwgYWN0aXZlX2hpKDApICovCisjZGVmaW5lIEFTTF9SRVNOQU1FX0lOVEVSUlVQVFNIQVJFICAgICAgICAgICAgICAiX1NIUiIJLyogU2hhcmVhYmxlKDEpLCBub19zaGFyZSgwKSAqLworI2RlZmluZSBBU0xfUkVTTkFNRV9JTlRFUlJVUFRUWVBFICAgICAgICAgICAgICAgIl9IRV8iCS8qIEVkZ2UoMSksIExldmVsKDApICovCiAjZGVmaW5lIEFTTF9SRVNOQU1FX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAiX0xFTiIKLSNkZWZpbmUgQVNMX1JFU05BTUVfTUVNQVRUUklCVVRFUyAgICAgICAgICAgICAgICJfTVRQIiAgLyogTWVtb3J5KDApLCBSZXNlcnZlZCgxKSwgQUNQSSgyKSwgTlZTKDMpICovCi0jZGVmaW5lIEFTTF9SRVNOQU1FX01FTVRZUEUgICAgICAgICAgICAgICAgICAgICAiX01FTSIgIC8qIG5vbl9jYWNoZSgwKSwgQ2FjaGVhYmxlKDEpIENhY2hlK2NvbWJpbmUoMiksIENhY2hlK3ByZWZldGNoKDMpICovCisjZGVmaW5lIEFTTF9SRVNOQU1FX01FTUFUVFJJQlVURVMgICAgICAgICAgICAgICAiX01UUCIJLyogTWVtb3J5KDApLCBSZXNlcnZlZCgxKSwgQUNQSSgyKSwgTlZTKDMpICovCisjZGVmaW5lIEFTTF9SRVNOQU1FX01FTVRZUEUgICAgICAgICAgICAgICAgICAgICAiX01FTSIJLyogbm9uX2NhY2hlKDApLCBDYWNoZWFibGUoMSkgQ2FjaGUrY29tYmluZSgyKSwgQ2FjaGUrcHJlZmV0Y2goMykgKi8KICNkZWZpbmUgQVNMX1JFU05BTUVfTUFYQUREUiAgICAgICAgICAgICAgICAgICAgICJfTUFYIgogI2RlZmluZSBBU0xfUkVTTkFNRV9NSU5BRERSICAgICAgICAgICAgICAgICAgICAgIl9NSU4iCiAjZGVmaW5lIEFTTF9SRVNOQU1FX01BWFRZUEUgICAgICAgICAgICAgICAgICAgICAiX01BRiIKQEAgLTcyLDEyICs3MCwxMSBAQAogI2RlZmluZSBBU0xfUkVTTkFNRV9SRUdJU1RFUkJJVE9GRlNFVCAgICAgICAgICAgIl9SQk8iCiAjZGVmaW5lIEFTTF9SRVNOQU1FX1JFR0lTVEVSQklUV0lEVEggICAgICAgICAgICAiX1JCVyIKICNkZWZpbmUgQVNMX1JFU05BTUVfUkFOR0VUWVBFICAgICAgICAgICAgICAgICAgICJfUk5HIgotI2RlZmluZSBBU0xfUkVTTkFNRV9SRUFEV1JJVEVUWVBFICAgICAgICAgICAgICAgIl9SV18iICAvKiByZWFkX29ubHkoMCksIFdyaXRlYWJsZSAoMSkgKi8KKyNkZWZpbmUgQVNMX1JFU05BTUVfUkVBRFdSSVRFVFlQRSAgICAgICAgICAgICAgICJfUldfIgkvKiByZWFkX29ubHkoMCksIFdyaXRlYWJsZSAoMSkgKi8KICNkZWZpbmUgQVNMX1JFU05BTUVfVFJBTlNMQVRJT04gICAgICAgICAgICAgICAgICJfVFJBIgotI2RlZmluZSBBU0xfUkVTTkFNRV9UUkFOU1RZUEUgICAgICAgICAgICAgICAgICAgIl9UUlMiICAvKiBTcGFyc2UoMSksIERlbnNlKDApICovCi0jZGVmaW5lIEFTTF9SRVNOQU1FX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAiX1RUUCIgIC8qIFRyYW5zbGF0aW9uKDEpLCBTdGF0aWMgKDApICovCi0jZGVmaW5lIEFTTF9SRVNOQU1FX1hGRVJUWVBFICAgICAgICAgICAgICAgICAgICAiX1NJeiIgIC8qIDgoMCksIDhfYW5kMTYoMSksIDE2KDIpICovCi0KKyNkZWZpbmUgQVNMX1JFU05BTUVfVFJBTlNUWVBFICAgICAgICAgICAgICAgICAgICJfVFJTIgkvKiBTcGFyc2UoMSksIERlbnNlKDApICovCisjZGVmaW5lIEFTTF9SRVNOQU1FX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAiX1RUUCIJLyogVHJhbnNsYXRpb24oMSksIFN0YXRpYyAoMCkgKi8KKyNkZWZpbmUgQVNMX1JFU05BTUVfWEZFUlRZUEUgICAgICAgICAgICAgICAgICAgICJfU0l6IgkvKiA4KDApLCA4X2FuZDE2KDEpLCAxNigyKSAqLwogCiAvKiBEZWZhdWx0IHNpemVzIGZvciAic21hbGwiIHJlc291cmNlIGRlc2NyaXB0b3JzICovCiAKQEAgLTg5LDE1ICs4NiwxMiBAQAogI2RlZmluZSBBU0xfUkRFU0NfRklYRURfSU9fU0laRSAgICAgICAgICAgICAgICAgMHgwMwogI2RlZmluZSBBU0xfUkRFU0NfRU5EX1RBR19TSVpFICAgICAgICAgICAgICAgICAgMHgwMQogCi0KLXN0cnVjdCBhc2xfcmVzb3VyY2Vfbm9kZQotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGg7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcjsKLQlzdHJ1Y3QgYXNsX3Jlc291cmNlX25vZGUgICAgICAgICAgICAqbmV4dDsKK3N0cnVjdCBhc2xfcmVzb3VyY2Vfbm9kZSB7CisJdTMyIGJ1ZmZlcl9sZW5ndGg7CisJdm9pZCAqYnVmZmVyOworCXN0cnVjdCBhc2xfcmVzb3VyY2Vfbm9kZSAqbmV4dDsKIH07CiAKLQogLyoKICAqIFJlc291cmNlIGRlc2NyaXB0b3JzIGRlZmluZWQgaW4gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4KICAqCkBAIC0xMDYsMjE0ICsxMDAsMTc1IEBACiAgKi8KICNwcmFnbWEgcGFjaygxKQogCi1zdHJ1Y3QgYXNsX2lycV9mb3JtYXRfZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFfbWFzazsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKK3N0cnVjdCBhc2xfaXJxX2Zvcm1hdF9kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTE2IGlycV9tYXNrOworCXU4IGZsYWdzOwogfTsKIAotCi1zdHJ1Y3QgYXNsX2lycV9ub2ZsYWdzX2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxX21hc2s7CitzdHJ1Y3QgYXNsX2lycV9ub2ZsYWdzX2Rlc2MgeworCXU4IGRlc2NyaXB0b3JfdHlwZTsKKwl1MTYgaXJxX21hc2s7CiB9OwogCi0KLXN0cnVjdCBhc2xfZG1hX2Zvcm1hdF9kZXNjCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90eXBlOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtYV9jaGFubmVsX21hc2s7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CitzdHJ1Y3QgYXNsX2RtYV9mb3JtYXRfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXU4IGRtYV9jaGFubmVsX21hc2s7CisJdTggZmxhZ3M7CiB9OwogCi0KLXN0cnVjdCBhc2xfc3RhcnRfZGVwZW5kZW50X2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CitzdHJ1Y3QgYXNsX3N0YXJ0X2RlcGVuZGVudF9kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTggZmxhZ3M7CiB9OwogCi0KLXN0cnVjdCBhc2xfc3RhcnRfZGVwZW5kZW50X25vcHJpb19kZXNjCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90eXBlOworc3RydWN0IGFzbF9zdGFydF9kZXBlbmRlbnRfbm9wcmlvX2Rlc2MgeworCXU4IGRlc2NyaXB0b3JfdHlwZTsKIH07CiAKLQotc3RydWN0IGFzbF9lbmRfZGVwZW5kZW50X2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7CitzdHJ1Y3QgYXNsX2VuZF9kZXBlbmRlbnRfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOwogfTsKIAotCi1zdHJ1Y3QgYXNsX2lvX3BvcnRfZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX21pbjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX21heDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworc3RydWN0IGFzbF9pb19wb3J0X2Rlc2MgeworCXU4IGRlc2NyaXB0b3JfdHlwZTsKKwl1OCBpbmZvcm1hdGlvbjsKKwl1MTYgYWRkcmVzc19taW47CisJdTE2IGFkZHJlc3NfbWF4OworCXU4IGFsaWdubWVudDsKKwl1OCBsZW5ndGg7CiB9OwogCi0KLXN0cnVjdCBhc2xfZml4ZWRfaW9fcG9ydF9kZXNjCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90eXBlOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfYWRkcmVzczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CitzdHJ1Y3QgYXNsX2ZpeGVkX2lvX3BvcnRfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXUxNiBiYXNlX2FkZHJlc3M7CisJdTggbGVuZ3RoOwogfTsKIAotCi1zdHJ1Y3QgYXNsX3NtYWxsX3ZlbmRvcl9kZXNjCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90eXBlOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcl9kZWZpbmVkWzddOworc3RydWN0IGFzbF9zbWFsbF92ZW5kb3JfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXU4IHZlbmRvcl9kZWZpbmVkWzddOwogfTsKIAotCi1zdHJ1Y3QgYXNsX2VuZF90YWdfZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bTsKK3N0cnVjdCBhc2xfZW5kX3RhZ19kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTggY2hlY2tzdW07CiB9OwogCi0KIC8qIExBUkdFIGRlc2NyaXB0b3JzICovCiAKLXN0cnVjdCBhc2xfbWVtb3J5XzI0X2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbWluOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbWF4OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9sZW5ndGg7CitzdHJ1Y3QgYXNsX21lbW9yeV8yNF9kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTE2IGxlbmd0aDsKKwl1OCBpbmZvcm1hdGlvbjsKKwl1MTYgYWRkcmVzc19taW47CisJdTE2IGFkZHJlc3NfbWF4OworCXUxNiBhbGlnbm1lbnQ7CisJdTE2IHJhbmdlX2xlbmd0aDsKIH07CiAKLQotc3RydWN0IGFzbF9sYXJnZV92ZW5kb3JfZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yX2RlZmluZWRbMV07CitzdHJ1Y3QgYXNsX2xhcmdlX3ZlbmRvcl9kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTE2IGxlbmd0aDsKKwl1OCB2ZW5kb3JfZGVmaW5lZFsxXTsKIH07CiAKLQotc3RydWN0IGFzbF9tZW1vcnlfMzJfZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb247Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19taW47Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19tYXg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX2xlbmd0aDsKK3N0cnVjdCBhc2xfbWVtb3J5XzMyX2Rlc2MgeworCXU4IGRlc2NyaXB0b3JfdHlwZTsKKwl1MTYgbGVuZ3RoOworCXU4IGluZm9ybWF0aW9uOworCXUzMiBhZGRyZXNzX21pbjsKKwl1MzIgYWRkcmVzc19tYXg7CisJdTMyIGFsaWdubWVudDsKKwl1MzIgcmFuZ2VfbGVuZ3RoOwogfTsKIAotCi1zdHJ1Y3QgYXNsX2ZpeGVkX21lbW9yeV8zMl9kZXNjCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90eXBlOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2FkZHJlc3M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfbGVuZ3RoOworc3RydWN0IGFzbF9maXhlZF9tZW1vcnlfMzJfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXUxNiBsZW5ndGg7CisJdTggaW5mb3JtYXRpb247CisJdTMyIGJhc2VfYWRkcmVzczsKKwl1MzIgcmFuZ2VfbGVuZ3RoOwogfTsKIAotCi1zdHJ1Y3QgYXNsX2V4dGVuZGVkX2FkZHJlc3NfZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY19mbGFnczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbl9pRDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudWxhcml0eTsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX21pbjsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX21heDsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbl9vZmZzZXQ7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19sZW5ndGg7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZpZWxkc1syXTsgLyogVXNlZCBmb3IgbGVuZ3RoIGNhbGN1bGF0aW9uIG9ubHkgKi8KK3N0cnVjdCBhc2xfZXh0ZW5kZWRfYWRkcmVzc19kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTE2IGxlbmd0aDsKKwl1OCByZXNvdXJjZV90eXBlOworCXU4IGZsYWdzOworCXU4IHNwZWNpZmljX2ZsYWdzOworCXU4IHJldmlzaW9uX2lEOworCXU4IHJlc2VydmVkOworCXU2NCBncmFudWxhcml0eTsKKwl1NjQgYWRkcmVzc19taW47CisJdTY0IGFkZHJlc3NfbWF4OworCXU2NCB0cmFuc2xhdGlvbl9vZmZzZXQ7CisJdTY0IGFkZHJlc3NfbGVuZ3RoOworCXU2NCB0eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXM7CisJdTggb3B0aW9uYWxfZmllbGRzWzJdOwkvKiBVc2VkIGZvciBsZW5ndGggY2FsY3VsYXRpb24gb25seSAqLwogfTsKIAotI2RlZmluZSBBU0xfRVhURU5ERURfQUREUkVTU19ERVNDX1JFVklTSU9OICAgICAgICAgIDEgICAgICAgLyogQUNQSSAzLjAgKi8KKyNkZWZpbmUgQVNMX0VYVEVOREVEX0FERFJFU1NfREVTQ19SRVZJU0lPTiAgICAgICAgICAxCS8qIEFDUEkgMy4wICovCiAKLQotc3RydWN0IGFzbF9xd29yZF9hZGRyZXNzX2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3R5cGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNfZmxhZ3M7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHk7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19taW47Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19tYXg7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25fb2Zmc2V0OwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZpZWxkc1syXTsKK3N0cnVjdCBhc2xfcXdvcmRfYWRkcmVzc19kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTE2IGxlbmd0aDsKKwl1OCByZXNvdXJjZV90eXBlOworCXU4IGZsYWdzOworCXU4IHNwZWNpZmljX2ZsYWdzOworCXU2NCBncmFudWxhcml0eTsKKwl1NjQgYWRkcmVzc19taW47CisJdTY0IGFkZHJlc3NfbWF4OworCXU2NCB0cmFuc2xhdGlvbl9vZmZzZXQ7CisJdTY0IGFkZHJlc3NfbGVuZ3RoOworCXU4IG9wdGlvbmFsX2ZpZWxkc1syXTsKIH07CiAKLQotc3RydWN0IGFzbF9kd29yZF9hZGRyZXNzX2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3R5cGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNfZmxhZ3M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHk7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19taW47Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19tYXg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25fb2Zmc2V0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZpZWxkc1syXTsKK3N0cnVjdCBhc2xfZHdvcmRfYWRkcmVzc19kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTE2IGxlbmd0aDsKKwl1OCByZXNvdXJjZV90eXBlOworCXU4IGZsYWdzOworCXU4IHNwZWNpZmljX2ZsYWdzOworCXUzMiBncmFudWxhcml0eTsKKwl1MzIgYWRkcmVzc19taW47CisJdTMyIGFkZHJlc3NfbWF4OworCXUzMiB0cmFuc2xhdGlvbl9vZmZzZXQ7CisJdTMyIGFkZHJlc3NfbGVuZ3RoOworCXU4IG9wdGlvbmFsX2ZpZWxkc1syXTsKIH07CiAKLQotc3RydWN0IGFzbF93b3JkX2FkZHJlc3NfZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY19mbGFnczsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudWxhcml0eTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX21pbjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX21heDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbl9vZmZzZXQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19sZW5ndGg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfZmllbGRzWzJdOworc3RydWN0IGFzbF93b3JkX2FkZHJlc3NfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXUxNiBsZW5ndGg7CisJdTggcmVzb3VyY2VfdHlwZTsKKwl1OCBmbGFnczsKKwl1OCBzcGVjaWZpY19mbGFnczsKKwl1MTYgZ3JhbnVsYXJpdHk7CisJdTE2IGFkZHJlc3NfbWluOworCXUxNiBhZGRyZXNzX21heDsKKwl1MTYgdHJhbnNsYXRpb25fb2Zmc2V0OworCXUxNiBhZGRyZXNzX2xlbmd0aDsKKwl1OCBvcHRpb25hbF9maWVsZHNbMl07CiB9OwogCi0KLXN0cnVjdCBhc2xfZXh0ZW5kZWRfeHJ1cHRfZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfbGVuZ3RoOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9udW1iZXJbMV07CitzdHJ1Y3QgYXNsX2V4dGVuZGVkX3hydXB0X2Rlc2MgeworCXU4IGRlc2NyaXB0b3JfdHlwZTsKKwl1MTYgbGVuZ3RoOworCXU4IGZsYWdzOworCXU4IHRhYmxlX2xlbmd0aDsKKwl1MzIgaW50ZXJydXB0X251bWJlclsxXTsKIAkvKiByZXNfc291cmNlX2luZGV4LCByZXNfc291cmNlIG9wdGlvbmFsIGZpZWxkcyBmb2xsb3cgKi8KIH07CiAKLQotc3RydWN0IGFzbF9nZW5lcmFsX3JlZ2lzdGVyX2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nfc3BhY2VfaWQ7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF9vZmZzZXQ7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX3NpemU7IC8qIEFDUEkgMy4wLCB3YXMgUmVzZXJ2ZWQgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOworc3RydWN0IGFzbF9nZW5lcmFsX3JlZ2lzdGVyX2Rlc2MgeworCXU4IGRlc2NyaXB0b3JfdHlwZTsKKwl1MTYgbGVuZ3RoOworCXU4IGFkZHJlc3Nfc3BhY2VfaWQ7CisJdTggYml0X3dpZHRoOworCXU4IGJpdF9vZmZzZXQ7CisJdTggYWNjZXNzX3NpemU7CQkvKiBBQ1BJIDMuMCwgd2FzIFJlc2VydmVkICovCisJdTY0IGFkZHJlc3M7CiB9OwogCiAvKiByZXN0b3JlIGRlZmF1bHQgYWxpZ25tZW50ICovCkBAIC0zMjIsMzIgKzI3NywyOSBAQAogCiAvKiBVbmlvbiBvZiBhbGwgcmVzb3VyY2UgZGVzY3JpcHRvcnMsIHNvIHdlIGNhbiBhbGxvY2F0ZSB0aGUgd29yc3QgY2FzZSAqLwogCi11bmlvbiBhc2xfcmVzb3VyY2VfZGVzYwotewotCXN0cnVjdCBhc2xfaXJxX2Zvcm1hdF9kZXNjICAgICAgICAgIGlycTsKLQlzdHJ1Y3QgYXNsX2RtYV9mb3JtYXRfZGVzYyAgICAgICAgICBkbWE7Ci0Jc3RydWN0IGFzbF9zdGFydF9kZXBlbmRlbnRfZGVzYyAgICAgc3RkOwotCXN0cnVjdCBhc2xfZW5kX2RlcGVuZGVudF9kZXNjICAgICAgIGVuZDsKLQlzdHJ1Y3QgYXNsX2lvX3BvcnRfZGVzYyAgICAgICAgICAgICBpb3A7Ci0Jc3RydWN0IGFzbF9maXhlZF9pb19wb3J0X2Rlc2MgICAgICAgZmlvOwotCXN0cnVjdCBhc2xfc21hbGxfdmVuZG9yX2Rlc2MgICAgICAgIHNtdjsKLQlzdHJ1Y3QgYXNsX2VuZF90YWdfZGVzYyAgICAgICAgICAgICBldDsKK3VuaW9uIGFzbF9yZXNvdXJjZV9kZXNjIHsKKwlzdHJ1Y3QgYXNsX2lycV9mb3JtYXRfZGVzYyBpcnE7CisJc3RydWN0IGFzbF9kbWFfZm9ybWF0X2Rlc2MgZG1hOworCXN0cnVjdCBhc2xfc3RhcnRfZGVwZW5kZW50X2Rlc2Mgc3RkOworCXN0cnVjdCBhc2xfZW5kX2RlcGVuZGVudF9kZXNjIGVuZDsKKwlzdHJ1Y3QgYXNsX2lvX3BvcnRfZGVzYyBpb3A7CisJc3RydWN0IGFzbF9maXhlZF9pb19wb3J0X2Rlc2MgZmlvOworCXN0cnVjdCBhc2xfc21hbGxfdmVuZG9yX2Rlc2Mgc212OworCXN0cnVjdCBhc2xfZW5kX3RhZ19kZXNjIGV0OwogCi0Jc3RydWN0IGFzbF9tZW1vcnlfMjRfZGVzYyAgICAgICAgICAgTTI0OwotCXN0cnVjdCBhc2xfbGFyZ2VfdmVuZG9yX2Rlc2MgICAgICAgIGxndjsKLQlzdHJ1Y3QgYXNsX21lbW9yeV8zMl9kZXNjICAgICAgICAgICBNMzI7Ci0Jc3RydWN0IGFzbF9maXhlZF9tZW1vcnlfMzJfZGVzYyAgICAgRjMyOwotCXN0cnVjdCBhc2xfcXdvcmRfYWRkcmVzc19kZXNjICAgICAgIHFhczsKLQlzdHJ1Y3QgYXNsX2R3b3JkX2FkZHJlc3NfZGVzYyAgICAgICBkYXM7Ci0Jc3RydWN0IGFzbF93b3JkX2FkZHJlc3NfZGVzYyAgICAgICAgd2FzOwotCXN0cnVjdCBhc2xfZXh0ZW5kZWRfYWRkcmVzc19kZXNjICAgIGVhczsKLQlzdHJ1Y3QgYXNsX2V4dGVuZGVkX3hydXB0X2Rlc2MgICAgICBleHg7Ci0Jc3RydWN0IGFzbF9nZW5lcmFsX3JlZ2lzdGVyX2Rlc2MgICAgZ3JnOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl9pdGVtOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl9pdGVtOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFU4aXRlbTsKKwlzdHJ1Y3QgYXNsX21lbW9yeV8yNF9kZXNjIE0yNDsKKwlzdHJ1Y3QgYXNsX2xhcmdlX3ZlbmRvcl9kZXNjIGxndjsKKwlzdHJ1Y3QgYXNsX21lbW9yeV8zMl9kZXNjIE0zMjsKKwlzdHJ1Y3QgYXNsX2ZpeGVkX21lbW9yeV8zMl9kZXNjIEYzMjsKKwlzdHJ1Y3QgYXNsX3F3b3JkX2FkZHJlc3NfZGVzYyBxYXM7CisJc3RydWN0IGFzbF9kd29yZF9hZGRyZXNzX2Rlc2MgZGFzOworCXN0cnVjdCBhc2xfd29yZF9hZGRyZXNzX2Rlc2Mgd2FzOworCXN0cnVjdCBhc2xfZXh0ZW5kZWRfYWRkcmVzc19kZXNjIGVhczsKKwlzdHJ1Y3QgYXNsX2V4dGVuZGVkX3hydXB0X2Rlc2MgZXh4OworCXN0cnVjdCBhc2xfZ2VuZXJhbF9yZWdpc3Rlcl9kZXNjIGdyZzsKKwl1MzIgdTMyX2l0ZW07CisJdTE2IHUxNl9pdGVtOworCXU4IFU4aXRlbTsKIH07CiAKLQogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9jb250YWluZXIuaCBiL2luY2x1ZGUvYWNwaS9jb250YWluZXIuaAppbmRleCBkNzE2ZGYwLi5hNzAzZjE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvY29udGFpbmVyLmgKKysrIGIvaW5jbHVkZS9hY3BpL2NvbnRhaW5lci5oCkBAIC05LDUgKzksNCBAQAogCWludCBzdGF0ZTsKIH07CiAKLSNlbmRpZiAvKiBfX0FDUElfQ09OVEFJTkVSX0ggKi8KLQorI2VuZGlmCQkJCS8qIF9fQUNQSV9DT05UQUlORVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BkY19pbnRlbC5oIGIvaW5jbHVkZS9hY3BpL3BkY19pbnRlbC5oCmluZGV4IGZkNjczMGUuLjkxZjRhMTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wZGNfaW50ZWwuaAorKysgYi9pbmNsdWRlL2FjcGkvcGRjX2ludGVsLmgKQEAgLTE0LDcgKzE0LDYgQEAKICNkZWZpbmUgQUNQSV9QRENfU01QX1RfU1dDT09SRAkJKDB4MDA4MCkKICNkZWZpbmUgQUNQSV9QRENfQ19DMV9GRkgJCSgweDAxMDApCiAKLQogI2RlZmluZSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVAJKEFDUElfUERDX1NNUF9DMVBUIHwgXAogCQkJCQkgQUNQSV9QRENfQ19DMV9IQUxUKQogCkBAIC0yNSw1ICsyNCw0IEBACiAJCQkJCSBBQ1BJX1BEQ19TTVBfQzFQVCB8IFwKIAkJCQkJIEFDUElfUERDX0NfQzFfSEFMVCkKIAotI2VuZGlmIC8qIF9fUERDX0lOVEVMX0hfXyAqLwotCisjZW5kaWYJCQkJLyogX19QRENfSU5URUxfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oCmluZGV4IGFkZjk2OWUuLjE2NjA5YzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oCkBAIC00NCw0MCArNDQsNDIgQEAKICNpZm5kZWYgX19BQ0VOVl9IX18KICNkZWZpbmUgX19BQ0VOVl9IX18KIAotCiAvKgogICogQ29uZmlndXJhdGlvbiBmb3IgQUNQSSB0b29scyBhbmQgdXRpbGl0aWVzCiAgKi8KIAotI2lmZGVmIF9BQ1BJX0RVTVBfQVBQCisjaWZkZWYgQUNQSV9MSUJSQVJZCisjZGVmaW5lIEFDUElfVVNFX0xPQ0FMX0NBQ0hFCisjZW5kaWYKKworI2lmZGVmIEFDUElfRFVNUF9BUFAKICNpZm5kZWYgTVNET1MKICNkZWZpbmUgQUNQSV9ERUJVR19PVVRQVVQKICNlbmRpZgogI2RlZmluZSBBQ1BJX0FQUExJQ0FUSU9OCiAjZGVmaW5lIEFDUElfRElTQVNTRU1CTEVSCiAjZGVmaW5lIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotI2RlZmluZSBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkKLSNkZWZpbmUgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCiAjZW5kaWYKIAotI2lmZGVmIF9BQ1BJX0VYRUNfQVBQCisjaWZkZWYgQUNQSV9FWEVDX0FQUAogI3VuZGVmIERFQlVHR0VSX1RIUkVBRElORwogI2RlZmluZSBERUJVR0dFUl9USFJFQURJTkcgICAgICBERUJVR0dFUl9TSU5HTEVfVEhSRUFERUQKICNkZWZpbmUgQUNQSV9ERUJVR19PVVRQVVQKICNkZWZpbmUgQUNQSV9BUFBMSUNBVElPTgogI2RlZmluZSBBQ1BJX0RFQlVHR0VSCiAjZGVmaW5lIEFDUElfRElTQVNTRU1CTEVSCi0jZGVmaW5lIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWQotI2RlZmluZSBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKICNlbmRpZgogCi0jaWZkZWYgX0FDUElfQVNMX0NPTVBJTEVSCisjaWZkZWYgQUNQSV9BU0xfQ09NUElMRVIKICNkZWZpbmUgQUNQSV9ERUJVR19PVVRQVVQKICNkZWZpbmUgQUNQSV9BUFBMSUNBVElPTgogI2RlZmluZSBBQ1BJX0RJU0FTU0VNQkxFUgogI2RlZmluZSBBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWQorI2VuZGlmCisKKyNpZmRlZiBBQ1BJX0FQUExJQ0FUSU9OCiAjZGVmaW5lIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWQotI2RlZmluZSBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKKyNkZWZpbmUgQUNQSV9VU0VfTE9DQUxfQ0FDSEUKICNlbmRpZgogCiAvKgpAQCAtMTMxLDcgKzEzMyw3IEBACiAjZWxpZiBkZWZpbmVkKFdJTjY0KQogI2luY2x1ZGUgImFjd2luNjQuaCIKIAotI2VsaWYgZGVmaW5lZChNU0RPUykgICAgICAgIC8qIE11c3QgYXBwZWFyIGFmdGVyIFdJTjMyIGFuZCBXSU42NCBjaGVjayAqLworI2VsaWYgZGVmaW5lZChNU0RPUykJCS8qIE11c3QgYXBwZWFyIGFmdGVyIFdJTjMyIGFuZCBXSU42NCBjaGVjayAqLwogI2luY2x1ZGUgImFjZG9zMTYuaCIKIAogI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKQEAgLTE3Nyw3ICsxNzksNiBAQAogCiAvKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCiAKLQogLyoKICAqIERlYnVnZ2VyIHRocmVhZGluZyBtb2RlbAogICogVXNlIHNpbmdsZSB0aHJlYWRlZCBpZiB0aGUgZW50aXJlIHN1YnN5c3RlbSBpcyBjb250YWluZWQgaW4gYW4gYXBwbGljYXRpb24KQEAgLTE5Niw4ICsxOTcsNyBAQAogI2Vsc2UKICNkZWZpbmUgREVCVUdHRVJfVEhSRUFESU5HICAgICAgICAgIERFQlVHR0VSX01VTFRJX1RIUkVBREVECiAjZW5kaWYKLSNlbmRpZiAvKiAhREVCVUdHRVJfVEhSRUFESU5HICovCi0KKyNlbmRpZgkJCQkvKiAhREVCVUdHRVJfVEhSRUFESU5HICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMTksNyArMjE5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogCi0jZW5kaWYgLyogQUNQSV9VU0VfU1RBTkRBUkRfSEVBREVSUyAqLworI2VuZGlmCQkJCS8qIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMgKi8KIAogLyoKICAqIFdlIHdpbGwgYmUgbGlua2luZyB0byB0aGUgc3RhbmRhcmQgQ2xpYiBmdW5jdGlvbnMKQEAgLTIzOCwxNSArMjM4LDE1IEBACiAjZGVmaW5lIEFDUElfTUVNQ1BZKGQscyxuKSAgICAgICh2b2lkKSBtZW1jcHkoKGQpLCAocyksIChhY3BpX3NpemUpKG4pKQogI2RlZmluZSBBQ1BJX01FTVNFVChkLHMsbikgICAgICAodm9pZCkgbWVtc2V0KChkKSwgKHMpLCAoYWNwaV9zaXplKShuKSkKIAotI2RlZmluZSBBQ1BJX1RPVVBQRVIgICAgICAgICAgICB0b3VwcGVyCi0jZGVmaW5lIEFDUElfVE9MT1dFUiAgICAgICAgICAgIHRvbG93ZXIKLSNkZWZpbmUgQUNQSV9JU19YRElHSVQgICAgICAgICAgaXN4ZGlnaXQKLSNkZWZpbmUgQUNQSV9JU19ESUdJVCAgICAgICAgICAgaXNkaWdpdAotI2RlZmluZSBBQ1BJX0lTX1NQQUNFICAgICAgICAgICBpc3NwYWNlCi0jZGVmaW5lIEFDUElfSVNfVVBQRVIgICAgICAgICAgIGlzdXBwZXIKLSNkZWZpbmUgQUNQSV9JU19QUklOVCAgICAgICAgICAgaXNwcmludAotI2RlZmluZSBBQ1BJX0lTX0FMUEhBICAgICAgICAgICBpc2FscGhhCi0jZGVmaW5lIEFDUElfSVNfQVNDSUkgICAgICAgICAgIGlzYXNjaWkKKyNkZWZpbmUgQUNQSV9UT1VQUEVSKGkpICAgICAgICAgdG91cHBlcigoaW50KSAoaSkpCisjZGVmaW5lIEFDUElfVE9MT1dFUihpKSAgICAgICAgIHRvbG93ZXIoKGludCkgKGkpKQorI2RlZmluZSBBQ1BJX0lTX1hESUdJVChpKSAgICAgICBpc3hkaWdpdCgoaW50KSAoaSkpCisjZGVmaW5lIEFDUElfSVNfRElHSVQoaSkgICAgICAgIGlzZGlnaXQoKGludCkgKGkpKQorI2RlZmluZSBBQ1BJX0lTX1NQQUNFKGkpICAgICAgICBpc3NwYWNlKChpbnQpIChpKSkKKyNkZWZpbmUgQUNQSV9JU19VUFBFUihpKSAgICAgICAgaXN1cHBlcigoaW50KSAoaSkpCisjZGVmaW5lIEFDUElfSVNfUFJJTlQoaSkgICAgICAgIGlzcHJpbnQoKGludCkgKGkpKQorI2RlZmluZSBBQ1BJX0lTX0FMUEhBKGkpICAgICAgICBpc2FscGhhKChpbnQpIChpKSkKKyNkZWZpbmUgQUNQSV9JU19BU0NJSShpKSAgICAgICAgaXNhc2NpaSgoaW50KSAoaSkpCiAKICNlbHNlCiAKQEAgLTI1NywxOCArMjU3LDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICAvKgotICogVXNlIGxvY2FsIGRlZmluaXRpb25zIG9mIEMgbGlicmFyeSBtYWNyb3MgYW5kIGZ1bmN0aW9ucwotICogTk9URTogVGhlIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IGJlIGFzIGVmZmljaWVudAotICogYXMgYW4gaW5saW5lIG9yIGFzc2VtYmx5IGNvZGUgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgYQotICogbmF0aXZlIEMgbGlicmFyeS4KLSAqLworICAqIFVzZSBsb2NhbCBkZWZpbml0aW9ucyBvZiBDIGxpYnJhcnkgbWFjcm9zIGFuZCBmdW5jdGlvbnMKKyAgKiBOT1RFOiBUaGUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIG1heSBub3QgYmUgYXMgZWZmaWNpZW50CisgICogYXMgYW4gaW5saW5lIG9yIGFzc2VtYmx5IGNvZGUgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgYQorICAqIG5hdGl2ZSBDIGxpYnJhcnkuCisgICovCiAKICNpZm5kZWYgdmFfYXJnCiAKICNpZm5kZWYgX1ZBTElTVAogI2RlZmluZSBfVkFMSVNUCiB0eXBlZGVmIGNoYXIgKnZhX2xpc3Q7Ci0jZW5kaWYgLyogX1ZBTElTVCAqLworI2VuZGlmCQkJCS8qIF9WQUxJU1QgKi8KIAogLyoKICAqIFN0b3JhZ2UgYWxpZ25tZW50IHByb3BlcnRpZXMKQEAgLTI4NCw4ICsyODQsNyBAQAogI2RlZmluZSB2YV9lbmQoYXApICAgICAgICAgICAgICAodm9pZCkgMAogI2RlZmluZSB2YV9zdGFydChhcCwgQSkgICAgICAgICAodm9pZCkgKChhcCkgPSAoKChjaGFyICopICYoQSkpICsgKF9ibmQgKEEsX0FVUEJORCkpKSkKIAotI2VuZGlmIC8qIHZhX2FyZyAqLwotCisjZW5kaWYJCQkJLyogdmFfYXJnICovCiAKICNkZWZpbmUgQUNQSV9TVFJTVFIoczEsczIpICAgICAgYWNwaV91dF9zdHJzdHIgKChzMSksIChzMikpCiAjZGVmaW5lIEFDUElfU1RSQ0hSKHMxLGMpICAgICAgIGFjcGlfdXRfc3RyY2hyICgoczEpLCAoYykpCkBAIC0zMDMsOCArMzAyLDcgQEAKICNkZWZpbmUgQUNQSV9UT1VQUEVSICAgICAgICAgICAgYWNwaV91dF90b191cHBlcgogI2RlZmluZSBBQ1BJX1RPTE9XRVIgICAgICAgICAgICBhY3BpX3V0X3RvX2xvd2VyCiAKLSNlbmRpZiAvKiBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkgKi8KLQorI2VuZGlmCQkJCS8qIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzQ1LDggKzM0Myw3IEBACiAjZGVmaW5lIEFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyhHbHB0ciwgYWNxKQogI2RlZmluZSBBQ1BJX1JFTEVBU0VfR0xPQkFMX0xPQ0soR2xwdHIsIGFjcSkKIAotI2VuZGlmIC8qIEFDUElfQVNNX01BQ1JPUyAqLwotCisjZW5kaWYJCQkJLyogQUNQSV9BU01fTUFDUk9TICovCiAKICNpZmRlZiBBQ1BJX0FQUExJQ0FUSU9OCiAKQEAgLTM1NiwxMSArMzUzLDEwIEBACiAjZGVmaW5lIEJSRUFLUE9JTlQzCiAjZW5kaWYKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogQ29tcGlsZXItc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluIHRoZSBjb21waWxlci1zcGVjaWZpYwogICogaGVhZGVycy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZW5kaWYgLyogX19BQ0VOVl9IX18gKi8KKyNlbmRpZgkJCQkvKiBfX0FDRU5WX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmggYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNnY2MuaAppbmRleCA5MWZkYTM2Li40YzBlMGJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNnY2MuaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNnY2MuaApAQCAtNDQsMTYgKzQ0LDIwIEBACiAjaWZuZGVmIF9fQUNHQ0NfSF9fCiAjZGVmaW5lIF9fQUNHQ0NfSF9fCiAKKy8qIEZ1bmN0aW9uIG5hbWUgaXMgdXNlZCBmb3IgZGVidWcgb3V0cHV0LiBOb24tQU5TSSwgY29tcGlsZXItZGVwZW5kZW50ICovCisKKyNkZWZpbmUgQUNQSV9HRVRfRlVOQ1RJT05fTkFNRSAgICAgICAgICBfX0ZVTkNUSU9OX18KKwogLyogVGhpcyBtYWNybyBpcyB1c2VkIHRvIHRhZyBmdW5jdGlvbnMgYXMgInByaW50Zi1saWtlIiBiZWNhdXNlCiAgKiBzb21lIGNvbXBpbGVycyAobGlrZSBHQ0MpIGNhbiBjYXRjaCBwcmludGYgZm9ybWF0IHN0cmluZyBwcm9ibGVtcy4KICAqLwotI2RlZmluZSBBQ1BJX1BSSU5URl9MSUtFX0ZVTkMgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDQsIDUpKSkKKyNkZWZpbmUgQUNQSV9QUklOVEZfTElLRV9GVU5DIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCA2LCA3KSkpCiAKIC8qIFNvbWUgY29tcGlsZXJzIGNvbXBsYWluIGFib3V0IHVudXNlZCB2YXJpYWJsZXMuIFNvbWV0aW1lcyB3ZSBkb24ndCB3YW50IHRvCi0gKiB1c2UgYWxsIHRoZSB2YXJpYWJsZXMgKG1vc3Qgc3BlY2lmaWNhbGx5IGZvciBfVEhJU19NT0RVTEUpLiBUaGlzIGFsbG93IHVzCisgKiB1c2UgYWxsIHRoZSB2YXJpYWJsZXMgKGZvciBleGFtcGxlLCBfYWNwaV9tb2R1bGVfbmFtZSkuIFRoaXMgYWxsb3dzIHVzCiAgKiB0byB0byB0ZWxsIHRoZSBjb21waWxlciB3YXJuaW5nIGluIGEgcGVyLXZhcmlhYmxlIG1hbm5lciB0aGF0IGEgdmFyaWFibGUKICAqIGlzIHVudXNlZC4KICAqLwogI2RlZmluZSBBQ1BJX1VOVVNFRF9WQVIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCiAKLSNlbmRpZiAvKiBfX0FDR0NDX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNHQ0NfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAppbmRleCBhM2RlMGRiLi5jOTNlNjU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKQEAgLTYyLDcgKzYyLDE2IEBACiAKICNkZWZpbmUgQUNQSV9NQUNISU5FX1dJRFRIICBCSVRTX1BFUl9MT05HCiAKLSNlbHNlIC8qICFfX0tFUk5FTF9fICovCisvKiBUeXBlKHMpIGZvciB0aGUgT1NMICovCisKKyNpZmRlZiBBQ1BJX1VTRV9MT0NBTF9DQUNIRQorI2RlZmluZSBhY3BpX2NhY2hlX3QJc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2RlZmluZSBhY3BpX2NhY2hlX3QJa21lbV9jYWNoZV90CisjZW5kaWYKKworI2Vsc2UJCQkJLyogIV9fS0VSTkVMX18gKi8KIAogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtODMsMTAgKzkyLDEwIEBACiAKICNkZWZpbmUgX19jZGVjbAogI2RlZmluZSBBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KIAogLyogTGludXggdXNlcyBHQ0MgKi8KIAogI2luY2x1ZGUgImFjZ2NjLmgiCiAKLSNlbmRpZiAvKiBfX0FDTElOVVhfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ0xJTlVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCmluZGV4IDUwY2ZlYTQuLjdhMDBkNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKQEAgLTIzLDQ1ICsyMyw0NCBAQAogc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4OwogCiBzdHJ1Y3QgYWNwaV9wb3dlcl9yZWdpc3RlciB7Ci0JdTgJCQlkZXNjcmlwdG9yOwotCXUxNgkJCWxlbmd0aDsKLQl1OAkJCXNwYWNlX2lkOwotCXU4CQkJYml0X3dpZHRoOwotCXU4CQkJYml0X29mZnNldDsKLQl1OAkJCXJlc2VydmVkOwotCXU2NAkJCWFkZHJlc3M7CisJdTggZGVzY3JpcHRvcjsKKwl1MTYgbGVuZ3RoOworCXU4IHNwYWNlX2lkOworCXU4IGJpdF93aWR0aDsKKwl1OCBiaXRfb2Zmc2V0OworCXU4IHJlc2VydmVkOworCXU2NCBhZGRyZXNzOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLQogc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4X3BvbGljeSB7Ci0JdTMyCQkJY291bnQ7CisJdTMyIGNvdW50OwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqc3RhdGU7CiAJc3RydWN0IHsKLQkJdTMyCQkJdGltZTsKLQkJdTMyCQkJdGlja3M7Ci0JCXUzMgkJCWNvdW50OwotCQl1MzIJCQlibTsKLQl9CQkJdGhyZXNob2xkOworCQl1MzIgdGltZTsKKwkJdTMyIHRpY2tzOworCQl1MzIgY291bnQ7CisJCXUzMiBibTsKKwl9IHRocmVzaG9sZDsKIH07CiAKIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCB7Ci0JdTgJCQl2YWxpZDsKLQl1OAkJCXR5cGU7Ci0JdTMyCQkJYWRkcmVzczsKLQl1MzIJCQlsYXRlbmN5OwotCXUzMgkJCWxhdGVuY3lfdGlja3M7Ci0JdTMyCQkJcG93ZXI7Ci0JdTMyCQkJdXNhZ2U7CisJdTggdmFsaWQ7CisJdTggdHlwZTsKKwl1MzIgYWRkcmVzczsKKwl1MzIgbGF0ZW5jeTsKKwl1MzIgbGF0ZW5jeV90aWNrczsKKwl1MzIgcG93ZXI7CisJdTMyIHVzYWdlOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeF9wb2xpY3kgcHJvbW90aW9uOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeF9wb2xpY3kgZGVtb3Rpb247CiB9OwogCiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcG93ZXIgewogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqc3RhdGU7Ci0JdW5zaWduZWQgbG9uZwkJYm1fY2hlY2tfdGltZXN0YW1wOwotCXUzMgkJCWRlZmF1bHRfc3RhdGU7Ci0JdTMyCQkJYm1fYWN0aXZpdHk7Ci0JaW50CQkJY291bnQ7CisJdW5zaWduZWQgbG9uZyBibV9jaGVja190aW1lc3RhbXA7CisJdTMyIGRlZmF1bHRfc3RhdGU7CisJdTMyIGJtX2FjdGl2aXR5OworCWludCBjb3VudDsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggc3RhdGVzW0FDUElfUFJPQ0VTU09SX01BWF9QT1dFUl07CiAKIAkvKiB0aGUgX1BEQyBvYmplY3RzIHBhc3NlZCBieSB0aGUgZHJpdmVyLCBpZiBhbnkgKi8KQEAgLTcxLDg1ICs3MCw4MiBAQAogLyogUGVyZm9ybWFuY2UgTWFuYWdlbWVudCAqLwogCiBzdHJ1Y3QgYWNwaV9wY3RfcmVnaXN0ZXIgewotCXU4CQkJZGVzY3JpcHRvcjsKLQl1MTYJCQlsZW5ndGg7Ci0JdTgJCQlzcGFjZV9pZDsKLQl1OAkJCWJpdF93aWR0aDsKLQl1OAkJCWJpdF9vZmZzZXQ7Ci0JdTgJCQlyZXNlcnZlZDsKLQl1NjQJCQlhZGRyZXNzOworCXU4IGRlc2NyaXB0b3I7CisJdTE2IGxlbmd0aDsKKwl1OCBzcGFjZV9pZDsKKwl1OCBiaXRfd2lkdGg7CisJdTggYml0X29mZnNldDsKKwl1OCByZXNlcnZlZDsKKwl1NjQgYWRkcmVzczsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcHggewotCWFjcGlfaW50ZWdlcgkJY29yZV9mcmVxdWVuY3k7CQkvKiBtZWdhaGVydHogKi8KLQlhY3BpX2ludGVnZXIJCXBvd2VyOwkJCS8qIG1pbGxpV2F0dHMgKi8KLQlhY3BpX2ludGVnZXIJCXRyYW5zaXRpb25fbGF0ZW5jeTsJLyogbWljcm9zZWNvbmRzICovCi0JYWNwaV9pbnRlZ2VyCQlidXNfbWFzdGVyX2xhdGVuY3k7CS8qIG1pY3Jvc2Vjb25kcyAqLwotCWFjcGlfaW50ZWdlcgkJY29udHJvbDsJCS8qIGNvbnRyb2wgdmFsdWUgKi8KLQlhY3BpX2ludGVnZXIJCXN0YXR1czsJCQkvKiBzdWNjZXNzIGluZGljYXRvciAqLworCWFjcGlfaW50ZWdlciBjb3JlX2ZyZXF1ZW5jeTsJLyogbWVnYWhlcnR6ICovCisJYWNwaV9pbnRlZ2VyIHBvd2VyOwkvKiBtaWxsaVdhdHRzICovCisJYWNwaV9pbnRlZ2VyIHRyYW5zaXRpb25fbGF0ZW5jeTsJLyogbWljcm9zZWNvbmRzICovCisJYWNwaV9pbnRlZ2VyIGJ1c19tYXN0ZXJfbGF0ZW5jeTsJLyogbWljcm9zZWNvbmRzICovCisJYWNwaV9pbnRlZ2VyIGNvbnRyb2w7CS8qIGNvbnRyb2wgdmFsdWUgKi8KKwlhY3BpX2ludGVnZXIgc3RhdHVzOwkvKiBzdWNjZXNzIGluZGljYXRvciAqLwogfTsKIAogc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlIHsKLQl1bnNpZ25lZCBpbnQJCSBzdGF0ZTsKLQl1bnNpZ25lZCBpbnQJCSBwbGF0Zm9ybV9saW1pdDsKKwl1bnNpZ25lZCBpbnQgc3RhdGU7CisJdW5zaWduZWQgaW50IHBsYXRmb3JtX2xpbWl0OwogCXN0cnVjdCBhY3BpX3BjdF9yZWdpc3RlciBjb250cm9sX3JlZ2lzdGVyOwogCXN0cnVjdCBhY3BpX3BjdF9yZWdpc3RlciBzdGF0dXNfcmVnaXN0ZXI7Ci0JdW5zaWduZWQgaW50CQkgc3RhdGVfY291bnQ7CisJdW5zaWduZWQgaW50IHN0YXRlX2NvdW50OwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9weCAqc3RhdGVzOwogCiAJLyogdGhlIF9QREMgb2JqZWN0cyBwYXNzZWQgYnkgdGhlIGRyaXZlciwgaWYgYW55ICovCiAJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKnBkYzsKIH07CiAKLQotCiAvKiBUaHJvdHRsaW5nIENvbnRyb2wgKi8KIAogc3RydWN0IGFjcGlfcHJvY2Vzc29yX3R4IHsKLQl1MTYJCQlwb3dlcjsKLQl1MTYJCQlwZXJmb3JtYW5jZTsKKwl1MTYgcG93ZXI7CisJdTE2IHBlcmZvcm1hbmNlOwogfTsKIAogc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmcgewotCWludAkJCXN0YXRlOwotCXUzMgkJCWFkZHJlc3M7Ci0JdTgJCQlkdXR5X29mZnNldDsKLQl1OAkJCWR1dHlfd2lkdGg7Ci0JaW50CQkJc3RhdGVfY291bnQ7CisJaW50IHN0YXRlOworCXUzMiBhZGRyZXNzOworCXU4IGR1dHlfb2Zmc2V0OworCXU4IGR1dHlfd2lkdGg7CisJaW50IHN0YXRlX2NvdW50OwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl90eCBzdGF0ZXNbQUNQSV9QUk9DRVNTT1JfTUFYX1RIUk9UVExJTkddOwogfTsKIAogLyogTGltaXQgSW50ZXJmYWNlICovCiAKIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9seCB7Ci0JaW50CQkJcHg7CQkvKiBwZXJmb3JtYWNlIHN0YXRlICovCQotCWludAkJCXR4OwkJLyogdGhyb3R0bGUgbGV2ZWwgKi8KKwlpbnQgcHg7CQkJLyogcGVyZm9ybWFjZSBzdGF0ZSAqLworCWludCB0eDsJCQkvKiB0aHJvdHRsZSBsZXZlbCAqLwogfTsKIAogc3RydWN0IGFjcGlfcHJvY2Vzc29yX2xpbWl0IHsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfbHggc3RhdGU7CQkvKiBjdXJyZW50IGxpbWl0ICovCisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2x4IHN0YXRlOwkvKiBjdXJyZW50IGxpbWl0ICovCiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2x4IHRoZXJtYWw7CS8qIHRoZXJtYWwgbGltaXQgKi8KLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfbHggdXNlcjsJCS8qIHVzZXIgbGltaXQgKi8KKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfbHggdXNlcjsJLyogdXNlciBsaW1pdCAqLwogfTsKIAotCiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfZmxhZ3MgewotCXU4CQkJcG93ZXI6MTsKLQl1OAkJCXBlcmZvcm1hbmNlOjE7Ci0JdTgJCQl0aHJvdHRsaW5nOjE7Ci0JdTgJCQlsaW1pdDoxOwotCXU4CQkJYm1fY29udHJvbDoxOwotCXU4CQkJYm1fY2hlY2s6MTsKLQl1OAkJCWhhc19jc3Q6MTsKLQl1OAkJCXBvd2VyX3NldHVwX2RvbmU6MTsKKwl1OCBwb3dlcjoxOworCXU4IHBlcmZvcm1hbmNlOjE7CisJdTggdGhyb3R0bGluZzoxOworCXU4IGxpbWl0OjE7CisJdTggYm1fY29udHJvbDoxOworCXU4IGJtX2NoZWNrOjE7CisJdTggaGFzX2NzdDoxOworCXU4IHBvd2VyX3NldHVwX2RvbmU6MTsKIH07CiAKIHN0cnVjdCBhY3BpX3Byb2Nlc3NvciB7Ci0JYWNwaV9oYW5kbGUJCWhhbmRsZTsKLQl1MzIJCQlhY3BpX2lkOwotCXUzMgkJCWlkOwotCXUzMgkJCXBibGs7Ci0JaW50CQkJcGVyZm9ybWFuY2VfcGxhdGZvcm1fbGltaXQ7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXUzMiBhY3BpX2lkOworCXUzMiBpZDsKKwl1MzIgcGJsazsKKwlpbnQgcGVyZm9ybWFuY2VfcGxhdGZvcm1fbGltaXQ7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2ZsYWdzIGZsYWdzOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wb3dlciBwb3dlcjsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKnBlcmZvcm1hbmNlOwpAQCAtMTU4LDUwICsxNTQsNDkgQEAKIH07CiAKIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9lcnJhdGEgewotCXU4CQkJc21wOworCXU4IHNtcDsKIAlzdHJ1Y3QgewotCQl1OAkJCXRocm90dGxlOjE7Ci0JCXU4CQkJZmRtYToxOwotCQl1OAkJCXJlc2VydmVkOjY7Ci0JCXUzMgkJCWJtaXN4OwotCX0JCQlwaWl4NDsKKwkJdTggdGhyb3R0bGU6MTsKKwkJdTggZmRtYToxOworCQl1OCByZXNlcnZlZDo2OworCQl1MzIgYm1pc3g7CisJfSBwaWl4NDsKIH07CiAKLWV4dGVybiBpbnQgYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJfcGVyZm9ybWFuY2UgKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqIHBlcmZvcm1hbmNlLAotCXVuc2lnbmVkIGludCBjcHUpOwotZXh0ZXJuIHZvaWQgYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZSAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICogcGVyZm9ybWFuY2UsCi0JdW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gaW50IGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQorCQkJCQkgICAgICAgKnBlcmZvcm1hbmNlLCB1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiB2b2lkIGFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2Uoc3RydWN0CisJCQkJCQkgIGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlCisJCQkJCQkgICpwZXJmb3JtYW5jZSwKKwkJCQkJCSAgdW5zaWduZWQgaW50IGNwdSk7CiAKIC8qIG5vdGU6IHRoaXMgbG9ja3MgYm90aCB0aGUgY2FsbGluZyBtb2R1bGUgYW5kIHRoZSBwcm9jZXNzb3IgbW9kdWxlCiAgICAgICAgICBpZiBhIF9QUEMgb2JqZWN0IGV4aXN0cywgcm1tb2QgaXMgZGlzYWxsb3dlZCB0aGVuICovCiBpbnQgYWNwaV9wcm9jZXNzb3Jfbm90aWZ5X3NtbShzdHJ1Y3QgbW9kdWxlICpjYWxsaW5nX21vZHVsZSk7CiAKLQotCiAvKiBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIG11bHRpcGxlIHBhcnRzIG9mIHRoZSBwcm9jZXNzb3Iga2VybmVsIG1vZHVsZSAqLwotZXh0ZXJuIHN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHJvY2Vzc29yc1tOUl9DUFVTXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByb2Nlc3NvcnNbTlJfQ1BVU107CiBleHRlcm4gc3RydWN0IGFjcGlfcHJvY2Vzc29yX2VycmF0YSBlcnJhdGE7CiAKIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfcGRjKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCi0JCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGNfaW4pOworCQkJICAgc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKnBkY19pbik7CiAKICNpZmRlZiBBUkNIX0hBU19QT1dFUl9QRENfSU5JVAogdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcG93ZXIgKnBvdywKLQkJdW5zaWduZWQgaW50IGNwdSk7CisJCQkJICAgdW5zaWduZWQgaW50IGNwdSk7CiB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfYm1fY2hlY2soc3RydWN0IGFjcGlfcHJvY2Vzc29yX2ZsYWdzICpmbGFncywKLQkJdW5zaWduZWQgaW50IGNwdSk7CisJCQkJCXVuc2lnbmVkIGludCBjcHUpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X3BkYygKLQkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Bvd2VyICpwb3csIHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9wZGMoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Bvd2VyCisJCQkJCQkgKnBvdywgdW5zaWduZWQgaW50IGNwdSkKIHsKIAlwb3ctPnBkYyA9IE5VTEw7CiAJcmV0dXJuOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9ibV9jaGVjaygKLQkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2ZsYWdzICpmbGFncywgdW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2JtX2NoZWNrKHN0cnVjdAorCQkJCQkJICAgICAgYWNwaV9wcm9jZXNzb3JfZmxhZ3MKKwkJCQkJCSAgICAgICpmbGFncywgdW5zaWduZWQgaW50IGNwdSkKIHsKIAlmbGFncy0+Ym1fY2hlY2sgPSAxOwogCXJldHVybjsKQEAgLTIxNSw1MSArMjEwLDYyIEBACiB2b2lkIGFjcGlfcHJvY2Vzc29yX3BwY19leGl0KHZvaWQpOwogaW50IGFjcGlfcHJvY2Vzc29yX3BwY19oYXNfY2hhbmdlZChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfcHBjX2luaXQodm9pZCkgeyByZXR1cm47IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wcGNfZXhpdCh2b2lkKSB7IHJldHVybjsgfQotc3RhdGljIGlubGluZSBpbnQgYWNwaV9wcm9jZXNzb3JfcHBjX2hhc19jaGFuZ2VkKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpIHsKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wcGNfaW5pdCh2b2lkKQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wcGNfZXhpdCh2b2lkKQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGFjcGlfcHJvY2Vzc29yX3BwY19oYXNfY2hhbmdlZChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQorewogCXN0YXRpYyB1bnNpZ25lZCBpbnQgcHJpbnRvdXQgPSAxOwogCWlmIChwcmludG91dCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nOiBQcm9jZXNzb3IgUGxhdGZvcm0gTGltaXQgZXZlbnQgZGV0ZWN0ZWQsIGJ1dCBub3QgaGFuZGxlZC5cbiIpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJDb25zaWRlciBjb21waWxpbmcgQ1BVZnJlcSBzdXBwb3J0IGludG8geW91ciBrZXJuZWwuXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIldhcm5pbmc6IFByb2Nlc3NvciBQbGF0Zm9ybSBMaW1pdCBldmVudCBkZXRlY3RlZCwgYnV0IG5vdCBoYW5kbGVkLlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJDb25zaWRlciBjb21waWxpbmcgQ1BVZnJlcSBzdXBwb3J0IGludG8geW91ciBrZXJuZWwuXG4iKTsKIAkJcHJpbnRvdXQgPSAwOwogCX0KIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfQ1BVX0ZSRVEgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfQ1BVX0ZSRVEgKi8KIAogLyogaW4gcHJvY2Vzc29yX3Rocm90dGxpbmcuYyAqLwotaW50IGFjcGlfcHJvY2Vzc29yX2dldF90aHJvdHRsaW5nX2luZm8gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpOwotaW50IGFjcGlfcHJvY2Vzc29yX3NldF90aHJvdHRsaW5nIChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCBpbnQgc3RhdGUpOwotc3NpemVfdCBhY3BpX3Byb2Nlc3Nvcl93cml0ZV90aHJvdHRsaW5nICgKLSAgICAgICAgc3RydWN0IGZpbGUJCSpmaWxlLAotICAgICAgICBjb25zdCBjaGFyCQlfX3VzZXIgKmJ1ZmZlciwKLSAgICAgICAgc2l6ZV90CQkJY291bnQsCi0gICAgICAgIGxvZmZfdAkJCSpkYXRhKTsKK2ludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZ19pbmZvKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpOworaW50IGFjcGlfcHJvY2Vzc29yX3NldF90aHJvdHRsaW5nKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsIGludCBzdGF0ZSk7Citzc2l6ZV90IGFjcGlfcHJvY2Vzc29yX3dyaXRlX3Rocm90dGxpbmcoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCWNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpOwogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19mb3BzOwogCiAvKiBpbiBwcm9jZXNzb3JfaWRsZS5jICovCi1pbnQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1pbnQgYWNwaV9wcm9jZXNzb3JfY3N0X2hhc19jaGFuZ2VkIChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKLWludCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9leGl0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLQoraW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK2ludCBhY3BpX3Byb2Nlc3Nvcl9jc3RfaGFzX2NoYW5nZWQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcik7CitpbnQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfZXhpdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJICAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCiAvKiBpbiBwcm9jZXNzb3JfdGhlcm1hbC5jICovCi1pbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X2xpbWl0X2luZm8gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpOwotc3NpemVfdCBhY3BpX3Byb2Nlc3Nvcl93cml0ZV9saW1pdCAoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCWNvbnN0IGNoYXIJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpkYXRhKTsKK2ludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfbGltaXRfaW5mbyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKK3NzaXplX3QgYWNwaV9wcm9jZXNzb3Jfd3JpdGVfbGltaXQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfcHJvY2Vzc29yX2xpbWl0X2ZvcHM7CiAKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIHZvaWQgYWNwaV90aGVybWFsX2NwdWZyZXFfaW5pdCh2b2lkKTsKIHZvaWQgYWNwaV90aGVybWFsX2NwdWZyZXFfZXhpdCh2b2lkKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNwaV90aGVybWFsX2NwdWZyZXFfaW5pdCh2b2lkKSB7IHJldHVybjsgfQotc3RhdGljIGlubGluZSB2b2lkIGFjcGlfdGhlcm1hbF9jcHVmcmVxX2V4aXQodm9pZCkgeyByZXR1cm47IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pbml0KHZvaWQpCit7CisJcmV0dXJuOworfQorc3RhdGljIGlubGluZSB2b2lkIGFjcGlfdGhlcm1hbF9jcHVmcmVxX2V4aXQodm9pZCkKK3sKKwlyZXR1cm47Cit9CiAjZW5kaWYKIAotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tYWxwaGEvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2ZmU4OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2F1eHZlYy5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX19BU01fQUxQSEFfQVVYVkVDX0gKKyNkZWZpbmUgX19BU01fQUxQSEFfQVVYVkVDX0gKKworLyogUmVzZXJ2ZSB0aGVzZSBudW1iZXJzIGZvciBhbnkgZnV0dXJlIHVzZSBvZiBhIFZEU08uICAqLworI2lmIDAKKyNkZWZpbmUgQVRfU1lTSU5GTwkJMzIKKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSCQkzMworI2VuZGlmCisKKy8qIE1vcmUgY29tcGxldGUgY2FjaGUgZGVzY3JpcHRpb25zIHRoYW4gQVRfW0RJVV1DQUNIRUJTSVpFLiAgSWYgdGhlCisgICB2YWx1ZSBpcyAtMSwgdGhlbiB0aGUgY2FjaGUgZG9lc24ndCBleGlzdC4gIE90aGVyd2lzZToKKworICAgICAgYml0IDAtMzoJICBDYWNoZSBzZXQtYXNzb2NpYXRpdml0eTsgMCBtZWFucyBmdWxseSBhc3NvY2lhdGl2ZS4KKyAgICAgIGJpdCA0LTc6CSAgTG9nMiBvZiBjYWNoZWxpbmUgc2l6ZS4KKyAgICAgIGJpdCA4LTMxOgkgIFNpemUgb2YgdGhlIGVudGlyZSBjYWNoZSA+PiA4LgorICAgICAgYml0IDMyLTYzOiAgUmVzZXJ2ZWQuCisqLworCisjZGVmaW5lIEFUX0wxSV9DQUNIRVNIQVBFCTM0CisjZGVmaW5lIEFUX0wxRF9DQUNIRVNIQVBFCTM1CisjZGVmaW5lIEFUX0wyX0NBQ0hFU0hBUEUJMzYKKyNkZWZpbmUgQVRfTDNfQ0FDSEVTSEFQRQkzNworCisjZW5kaWYgLyogX19BU01fQUxQSEFfQVVYVkVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2VsZi5oIGIvaW5jbHVkZS9hc20tYWxwaGEvZWxmLmgKaW5kZXggZTk0YTk0NS4uNmMyZDc4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvZWxmLmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9fQVNNX0FMUEhBX0VMRl9ICiAjZGVmaW5lIF9fQVNNX0FMUEhBX0VMRl9ICiAKKyNpbmNsdWRlIDxhc20vYXV4dmVjLmg+CisKIC8qIFNwZWNpYWwgdmFsdWVzIGZvciB0aGUgc3Rfb3RoZXIgZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCiAKICNkZWZpbmUgU1RPX0FMUEhBX05PUFYJCTB4ODAKQEAgLTE0MiwyNiArMTQ0LDYgQEAKIAk6IGFtYXNrIChBTUFTS19DSVgpID8gImV2NiIgOiAiZXY2NyIpOwlcCiB9KQogCi0vKiBSZXNlcnZlIHRoZXNlIG51bWJlcnMgZm9yIGFueSBmdXR1cmUgdXNlIG9mIGEgVkRTTy4gICovCi0jaWYgMAotI2RlZmluZSBBVF9TWVNJTkZPCQkzMgotI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIJCTMzCi0jZW5kaWYKLQotLyogTW9yZSBjb21wbGV0ZSBjYWNoZSBkZXNjcmlwdGlvbnMgdGhhbiBBVF9bRElVXUNBQ0hFQlNJWkUuICBJZiB0aGUKLSAgIHZhbHVlIGlzIC0xLCB0aGVuIHRoZSBjYWNoZSBkb2Vzbid0IGV4aXN0LiAgT3RoZXJ3aXNlOgotCi0gICAgICBiaXQgMC0zOgkgIENhY2hlIHNldC1hc3NvY2lhdGl2aXR5OyAwIG1lYW5zIGZ1bGx5IGFzc29jaWF0aXZlLgotICAgICAgYml0IDQtNzoJICBMb2cyIG9mIGNhY2hlbGluZSBzaXplLgotICAgICAgYml0IDgtMzE6CSAgU2l6ZSBvZiB0aGUgZW50aXJlIGNhY2hlID4+IDguCi0gICAgICBiaXQgMzItNjM6ICBSZXNlcnZlZC4KLSovCi0KLSNkZWZpbmUgQVRfTDFJX0NBQ0hFU0hBUEUJMzQKLSNkZWZpbmUgQVRfTDFEX0NBQ0hFU0hBUEUJMzUKLSNkZWZpbmUgQVRfTDJfQ0FDSEVTSEFQRQkzNgotI2RlZmluZSBBVF9MM19DQUNIRVNIQVBFCTM3Ci0KICNpZmRlZiBfX0tFUk5FTF9fCiAKICNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKEVYLCBJQkNTMikJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvZmNudGwuaCBiL2luY2x1ZGUvYXNtLWFscGhhL2ZjbnRsLmgKaW5kZXggNmI3ZDZjMS4uODdmMmNmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9mY250bC5oCkBAIC0zLDEwICszLDYgQEAKIAogLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwogICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQUNDTU9ERQkgIDAwMDMKLSNkZWZpbmUgT19SRE9OTFkJICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAwMQotI2RlZmluZSBPX1JEV1IJCSAgICAwMgogI2RlZmluZSBPX0NSRUFUCQkgMDEwMDAJLyogbm90IGZjbnRsICovCiAjZGVmaW5lIE9fVFJVTkMJCSAwMjAwMAkvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19FWENMCQkgMDQwMDAJLyogbm90IGZjbnRsICovCkBAIC0xNCwyMCArMTAsMTMgQEAKIAogI2RlZmluZSBPX05PTkJMT0NLCSAwMDAwNAogI2RlZmluZSBPX0FQUEVORAkgMDAwMTAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwogI2RlZmluZSBPX1NZTkMJCTA0MDAwMAotI2RlZmluZSBGQVNZTkMJCTAyMDAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIE9fRElSRUNUT1JZCTAxMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwogI2RlZmluZSBPX05PRk9MTE9XCTAyMDAwMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCiAjZGVmaW5lIE9fTEFSR0VGSUxFCTA0MDAwMDAgLyogd2lsbCBiZSBzZXQgYnkgdGhlIGtlcm5lbCBvbiBldmVyeSBvcGVuICovCiAjZGVmaW5lIE9fRElSRUNUCTAyMDAwMDAwIC8qIGRpcmVjdCBkaXNrIGFjY2VzcyAtIHNob3VsZCBjaGVjayB3aXRoIE9TRi8xICovCiAjZGVmaW5lIE9fTk9BVElNRQkwNDAwMDAwMAogCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQgICAgICAgLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KICNkZWZpbmUgRl9HRVRMSwkJNwogI2RlZmluZSBGX1NFVExLCQk4CiAjZGVmaW5lIEZfU0VUTEtXCTkKQEAgLTM3LDkgKzI2LDYgQEAKICNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwogI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCiAKLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQogLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KICNkZWZpbmUgRl9SRExDSwkJMQogI2RlZmluZSBGX1dSTENLCQkyCkBAIC01MSwyNSArMzcsNiBAQAogCiAjZGVmaW5lIEZfSU5QUk9HUkVTUwk2NAogCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19NQU5EICAgICAgMzIgICAgICAvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrICovCi0jZGVmaW5lIExPQ0tfUkVBRCAgICAgIDY0ICAgICAgLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFICAgICAxMjggICAgIC8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfUlcgICAgICAgIDE5MiAgICAgLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLSAKLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCV9fa2VybmVsX29mZl90IGxfc3RhcnQ7Ci0JX19rZXJuZWxfb2ZmX3QgbF9sZW47Ci0JX19rZXJuZWxfcGlkX3QgbF9waWQ7Ci19OwotCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRSAgMTAyNAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLWFscGhhL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCWNhc2UgRlVURVhfT1BfQUREOgorCWNhc2UgRlVURVhfT1BfT1I6CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCWNhc2UgRlVURVhfT1BfWE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9oZHJlZy5oIGIvaW5jbHVkZS9hc20tYWxwaGEvaGRyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZmQxYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2hkcmVnLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9wYWdlLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9wYWdlLmgKaW5kZXggMDU3N2RhZi4uZmEwYjQxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3BhZ2UuaApAQCAtNjMsMjAgKzYzLDYgQEAKIAogI2VuZGlmIC8qIFNUUklDVF9NTV9UWVBFQ0hFQ0tTICovCiAKLS8qIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyICovCi1leHRlcm4gX19pbmxpbmVfXyBpbnQgZ2V0X29yZGVyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpbnQgb3JkZXI7Ci0KLQlzaXplID0gKHNpemUtMSkgPj4gKFBBR0VfU0hJRlQtMSk7Ci0Jb3JkZXIgPSAtMTsKLQlkbyB7Ci0JCXNpemUgPj49IDE7Ci0JCW9yZGVyKys7Ci0JfSB3aGlsZSAoc2l6ZSk7Ci0JcmV0dXJuIG9yZGVyOwotfQotCiAjaWZkZWYgVVNFXzQ4X0JJVF9LU0VHCiAjZGVmaW5lIFBBR0VfT0ZGU0VUCQkweGZmZmY4MDAwMDAwMDAwMDBVTAogI2Vsc2UKQEAgLTExMiw0ICs5OCw2IEBACiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYWdlLmg+CisKICNlbmRpZiAvKiBfQUxQSEFfUEFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9wY2kuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3BjaS5oCmluZGV4IGY2ODFlNjcuLjRlMTE1ZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3BjaS5oCkBAIC0yNTQsNiArMjU0LDE5IEBACiBleHRlcm4gdm9pZCBwY2liaW9zX2J1c190b19yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKIAkJCQkgICAgc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24pOwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZXNvdXJjZSAqCitwY2liaW9zX3NlbGVjdF9yb290KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QgPSBOVUxMOworCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQlyb290ID0gJmlvcG9ydF9yZXNvdXJjZTsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlyb290ID0gJmlvbWVtX3Jlc291cmNlOworCisJcmV0dXJuIHJvb3Q7Cit9CisKICNkZWZpbmUgcGNpX2RvbWFpbl9ucihidXMpICgoc3RydWN0IHBjaV9jb250cm9sbGVyICopKGJ1cyktPnN5c2RhdGEpLT5pbmRleAogCiBzdGF0aWMgaW5saW5lIGludCBwY2lfcHJvY19kb21haW4oc3RydWN0IHBjaV9idXMgKmJ1cykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9zcGlubG9jay5oCmluZGV4IDgwNzgwZGIuLjgxOTdjNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvc3BpbmxvY2suaApAQCAtNiw3ICs2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogCi0KIC8qCiAgKiBTaW1wbGUgc3BpbiBsb2NrIG9wZXJhdGlvbnMuICBUaGVyZSBhcmUgdHdvIHZhcmlhbnRzLCBvbmUgY2xlYXJzIElSUSdzCiAgKiBvbiB0aGUgbG9jYWwgcHJvY2Vzc29yLCBvbmUgZG9lcyBub3QuCkBAIC0xNCw0MyArMTMsMTggQEAKICAqIFdlIG1ha2Ugbm8gZmFpcm5lc3MgYXNzdW1wdGlvbnMuIFRoZXkgaGF2ZSBhIGNvc3QuCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOwotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCWludCBvbl9jcHU7Ci0JaW50IGxpbmVfbm87Ci0Jdm9pZCAqcHJldmlvdXM7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICogdGFzazsKLQljb25zdCBjaGFyICpiYXNlX2ZpbGU7Ci0jZW5kaWYKLX0gc3BpbmxvY2tfdDsKKyNkZWZpbmUgX19yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfX3Jhd19zcGluX2xvY2sobG9jaykKKyNkZWZpbmUgX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkJKCh4KS0+bG9jayAhPSAwKQorI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KHgpIFwKKwkJZG8geyBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoKHgpLT5sb2NrKQogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRAkoc3BpbmxvY2tfdCl7IDAsIC0xLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH0KLSNlbHNlCi0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRAkoc3BpbmxvY2tfdCl7IDAgfQotI2VuZGlmCi0KLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQoeCkJZG8geyAqKHgpID0gU1BJTl9MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpCSgoeCktPmxvY2sgIT0gMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdCh4KQlkbyB7IGJhcnJpZXIoKTsgfSB3aGlsZSAoKHgpLT5sb2NrKQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi1leHRlcm4gdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKiBsb2NrKTsKLWV4dGVybiB2b2lkIGRlYnVnX3NwaW5fbG9jayhzcGlubG9ja190ICogbG9jaywgY29uc3QgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludCBkZWJ1Z19zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqIGxvY2ssIGNvbnN0IGNoYXIgKiwgaW50KTsKLSNkZWZpbmUgX3Jhd19zcGluX2xvY2soTE9DSykgXAotCWRlYnVnX3NwaW5fbG9jayhMT0NLLCBfX0JBU0VfRklMRV9fLCBfX0xJTkVfXykKLSNkZWZpbmUgX3Jhd19zcGluX3RyeWxvY2soTE9DSykgXAotCWRlYnVnX3NwaW5fdHJ5bG9jayhMT0NLLCBfX0JBU0VfRklMRV9fLCBfX0xJTkVfXykKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX3VubG9jayhzcGlubG9ja190ICogbG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqIGxvY2spCiB7CiAJbWIoKTsKIAlsb2NrLT5sb2NrID0gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKiBsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9jayhyYXdfc3BpbmxvY2tfdCAqIGxvY2spCiB7CiAJbG9uZyB0bXA7CiAKQEAgLTcwLDM5ICs0NCw0NCBAQAogCTogIm0iKGxvY2stPmxvY2spIDogIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCXJldHVybiAhdGVzdF9hbmRfc2V0X2JpdCgwLCAmbG9jay0+bG9jayk7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0RFQlVHX1NQSU5MT0NLICovCi0KLSNkZWZpbmUgX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9yYXdfc3Bpbl9sb2NrKGxvY2spCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOwotfSByd2xvY2tfdDsKLQotI2RlZmluZSBSV19MT0NLX1VOTE9DS0VECShyd2xvY2tfdCl7IDAgfQotCi0jZGVmaW5lIHJ3bG9ja19pbml0KHgpCQlkbyB7ICooeCkgPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0KLXN0YXRpYyBpbmxpbmUgaW50IHJlYWRfY2FuX2xvY2socndsb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19yZWFkX2Nhbl9sb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKIHsKIAlyZXR1cm4gKGxvY2stPmxvY2sgJiAxKSA9PSAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB3cml0ZV9jYW5fbG9jayhyd2xvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKIHsKIAlyZXR1cm4gbG9jay0+bG9jayA9PSAwOwogfQogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1JXTE9DSwotZXh0ZXJuIHZvaWQgX3Jhd193cml0ZV9sb2NrKHJ3bG9ja190ICogbG9jayk7Ci1leHRlcm4gdm9pZCBfcmF3X3JlYWRfbG9jayhyd2xvY2tfdCAqIGxvY2spOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKiBsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3JlYWRfbG9jayhyYXdfcndsb2NrX3QgKmxvY2spCit7CisJbG9uZyByZWd4OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIjE6CWxkbF9sCSUxLCUwXG4iCisJIglibGJzCSUxLDZmXG4iCisJIglzdWJsCSUxLDIsJTFcbiIKKwkiCXN0bF9jCSUxLCUwXG4iCisJIgliZXEJJTEsNmZcbiIKKwkiCW1iXG4iCisJIi5zdWJzZWN0aW9uIDJcbiIKKwkiNjoJbGRsCSUxLCUwXG4iCisJIglibGJzCSUxLDZiXG4iCisJIglicgkxYlxuIgorCSIucHJldmlvdXMiCisJOiAiPW0iICgqbG9jayksICI9JnIiIChyZWd4KQorCTogIm0iICgqbG9jaykgOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV9sb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKIHsKIAlsb25nIHJlZ3g7CiAKQEAgLTEyMiwyOCArMTAxLDcgQEAKIAk6ICJtIiAoKmxvY2spIDogIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19yZWFkX2xvY2socndsb2NrX3QgKiBsb2NrKQotewotCWxvbmcgcmVneDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSIxOglsZGxfbAklMSwlMFxuIgotCSIJYmxicwklMSw2ZlxuIgotCSIJc3VibAklMSwyLCUxXG4iCi0JIglzdGxfYwklMSwlMFxuIgotCSIJYmVxCSUxLDZmXG4iCi0JIgltYlxuIgotCSIuc3Vic2VjdGlvbiAyXG4iCi0JIjY6CWxkbAklMSwlMFxuIgotCSIJYmxicwklMSw2YlxuIgotCSIJYnIJMWJcbiIKLQkiLnByZXZpb3VzIgotCTogIj1tIiAoKmxvY2spLCAiPSZyIiAocmVneCkKLQk6ICJtIiAoKmxvY2spIDogIm1lbW9yeSIpOwotfQotI2VuZGlmIC8qIENPTkZJR19ERUJVR19SV0xPQ0sgKi8KLQotc3RhdGljIGlubGluZSBpbnQgX3Jhd19yZWFkX3RyeWxvY2socndsb2NrX3QgKiBsb2NrKQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfcmVhZF90cnlsb2NrKHJhd19yd2xvY2tfdCAqIGxvY2spCiB7CiAJbG9uZyByZWd4OwogCWludCBzdWNjZXNzOwpAQCAtMTY1LDcgKzEyMyw3IEBACiAJcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqIGxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJhd19yd2xvY2tfdCAqIGxvY2spCiB7CiAJbG9uZyByZWd4OwogCWludCBzdWNjZXNzOwpAQCAtMTg3LDEzICsxNDUsNyBAQAogCXJldHVybiBzdWNjZXNzOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd193cml0ZV91bmxvY2socndsb2NrX3QgKiBsb2NrKQotewotCW1iKCk7Ci0JbG9jay0+bG9jayA9IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3JlYWRfdW5sb2NrKHJ3bG9ja190ICogbG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX3VubG9jayhyYXdfcndsb2NrX3QgKiBsb2NrKQogewogCWxvbmcgcmVneDsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKQEAgLTIwOSw0ICsxNjEsMTAgQEAKIAk6ICJtIiAoKmxvY2spIDogIm1lbW9yeSIpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqIGxvY2spCit7CisJbWIoKTsKKwlsb2NrLT5sb2NrID0gMDsKK30KKwogI2VuZGlmIC8qIF9BTFBIQV9TUElOTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9zcGlubG9ja190eXBlcy5oIGIvaW5jbHVkZS9hc20tYWxwaGEvc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTQxZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9BTFBIQV9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9BTFBIQV9TUElOTE9DS19UWVBFU19ICisKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19UWVBFU19ICisjIGVycm9yICJwbGVhc2UgZG9uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkiCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAwIH0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyAwIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS90eXBlcy5oIGIvaW5jbHVkZS9hc20tYWxwaGEvdHlwZXMuaAppbmRleCA0MzI2NGQyLi5mNTcxNjEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3R5cGVzLmgKQEAgLTU2LDggKzU2LDYgQEAKIHR5cGVkZWYgdTY0IGRtYV9hZGRyX3Q7CiB0eXBlZGVmIHU2NCBkbWE2NF9hZGRyX3Q7CiAKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQga21lbV9idWZjdGxfdDsKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQUxQSEFfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tYWxwaGEvdWFjY2Vzcy5oCmluZGV4IDRjMzllZTcuLjIyZGUzYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS91YWNjZXNzLmgKQEAgLTQ4LDEyICs0OCw2IEBACiAJX19hY2Nlc3Nfb2soKCh1bnNpZ25lZCBsb25nKShhZGRyKSksKHNpemUpLGdldF9mcygpKTsJXAogfSkKIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1leHRlcm4gaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpID8gMCA6IC1FRkFVTFQ7Ci19Ci0KIC8qCiAgKiBUaGVzZSBhcmUgdGhlIG1haW4gc2luZ2xlLXZhbHVlIHRyYW5zZmVyIHJvdXRpbmVzLiAgVGhleSBhdXRvbWF0aWNhbGx5CiAgKiB1c2UgdGhlIHJpZ2h0IHNpemUgaWYgd2UganVzdCBoYXZlIHRoZSByaWdodCBwb2ludGVyIHR5cGUuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oCmluZGV4IDc0OTUwMjYuLmUzNTBkY2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oCkBAIC0zODMsMzkgKzM4Myw0NSBAQAogCQkqdmFkZHIrKyA9IGlubChpb19hZGRyKTsKIH0KIAotI2RlZmluZQlfX2lzX2lvX2FkZHJlc3MocCkJKCgodW5zaWduZWQgbG9uZylwID49IDB4MCkgJiYgXAotCQkJCQkoKHVuc2lnbmVkIGxvbmcpcCA8PSAweDAwMDBmZmZmKSkKKyNkZWZpbmUgUElPX09GRlNFVCAgICAgIDB4MTAwMDBVTAorI2RlZmluZSBQSU9fTUFTSyAgICAgICAgMHgwZmZmZlVMCisKKyNkZWZpbmUJX19pc19pb19hZGRyZXNzKHApCSgoKHVuc2lnbmVkIGxvbmcpcCA+PSBQSU9fT0ZGU0VUKSAmJiBcCisJCQkJCSgodW5zaWduZWQgbG9uZylwIDw9IChQSU9fTUFTSyArIFBJT19PRkZTRVQpKSkKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1fX2l4cDR4eF9pb3JlYWQ4KHZvaWQgX19pb21lbSAqcG9ydCkKK19faXhwNHh4X2lvcmVhZDgodm9pZCBfX2lvbWVtICphZGRyKQogeworCXVuc2lnbmVkIGxvbmcgcG9ydCA9ICh1bnNpZ25lZCBsb25nIF9fZm9yY2UpYWRkcjsKIAlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQotCQlyZXR1cm4JKHVuc2lnbmVkIGludClfX2l4cDR4eF9pbmIoKHVuc2lnbmVkIGludClwb3J0KTsKKwkJcmV0dXJuCSh1bnNpZ25lZCBpbnQpX19peHA0eHhfaW5iKHBvcnQgJiBQSU9fTUFTSyk7CiAJZWxzZQogI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQotCQlyZXR1cm4gKHVuc2lnbmVkIGludClfX3Jhd19yZWFkYigodTMyKXBvcnQpOworCQlyZXR1cm4gKHVuc2lnbmVkIGludClfX3Jhd19yZWFkYihwb3J0KTsKICNlbHNlCi0JCXJldHVybiAodW5zaWduZWQgaW50KV9faXhwNHh4X3JlYWRiKCh1MzIpcG9ydCk7CisJCXJldHVybiAodW5zaWduZWQgaW50KV9faXhwNHh4X3JlYWRiKHBvcnQpOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotX19peHA0eHhfaW9yZWFkOF9yZXAodTMyIHBvcnQsIHU4ICp2YWRkciwgdTMyIGNvdW50KQorX19peHA0eHhfaW9yZWFkOF9yZXAodm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICp2YWRkciwgdTMyIGNvdW50KQogeworCXVuc2lnbmVkIGxvbmcgcG9ydCA9ICh1bnNpZ25lZCBsb25nIF9fZm9yY2UpYWRkcjsKIAlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQotCQlfX2l4cDR4eF9pbnNiKHBvcnQsIHZhZGRyLCBjb3VudCk7CisJCV9faXhwNHh4X2luc2IocG9ydCAmIFBJT19NQVNLLCB2YWRkciwgY291bnQpOwogCWVsc2UKICNpZm5kZWYJQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKLQkJX19yYXdfcmVhZHNiKCh2b2lkIF9faW9tZW0gKilwb3J0LCB2YWRkciwgY291bnQpOworCQlfX3Jhd19yZWFkc2IoYWRkciwgdmFkZHIsIGNvdW50KTsKICNlbHNlCiAJCV9faXhwNHh4X3JlYWRzYihwb3J0LCB2YWRkciwgY291bnQpOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1fX2l4cDR4eF9pb3JlYWQxNih2b2lkIF9faW9tZW0gKnBvcnQpCitfX2l4cDR4eF9pb3JlYWQxNih2b2lkIF9faW9tZW0gKmFkZHIpCiB7CisJdW5zaWduZWQgbG9uZyBwb3J0ID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyOwogCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCi0JCXJldHVybgkodW5zaWduZWQgaW50KV9faXhwNHh4X2ludygodW5zaWduZWQgaW50KXBvcnQpOworCQlyZXR1cm4JKHVuc2lnbmVkIGludClfX2l4cDR4eF9pbncocG9ydCAmIFBJT19NQVNLKTsKIAllbHNlCiAjaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCiAJCXJldHVybiBsZTE2X3RvX2NwdShfX3Jhd19yZWFkdygodTMyKXBvcnQpKTsKQEAgLTQyNSwyMyArNDMxLDI1IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotX19peHA0eHhfaW9yZWFkMTZfcmVwKHUzMiBwb3J0LCB1MTYgKnZhZGRyLCB1MzIgY291bnQpCitfX2l4cDR4eF9pb3JlYWQxNl9yZXAodm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICp2YWRkciwgdTMyIGNvdW50KQogeworCXVuc2lnbmVkIGxvbmcgcG9ydCA9ICh1bnNpZ25lZCBsb25nIF9fZm9yY2UpYWRkcjsKIAlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQotCQlfX2l4cDR4eF9pbnN3KHBvcnQsIHZhZGRyLCBjb3VudCk7CisJCV9faXhwNHh4X2luc3cocG9ydCAmIFBJT19NQVNLLCB2YWRkciwgY291bnQpOwogCWVsc2UKICNpZm5kZWYJQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKLQkJX19yYXdfcmVhZHN3KCh2b2lkIF9faW9tZW0gKilwb3J0LCB2YWRkciwgY291bnQpOworCQlfX3Jhd19yZWFkc3coYWRkciwgdmFkZHIsIGNvdW50KTsKICNlbHNlCiAJCV9faXhwNHh4X3JlYWRzdyhwb3J0LCB2YWRkciwgY291bnQpOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1fX2l4cDR4eF9pb3JlYWQzMih2b2lkIF9faW9tZW0gKnBvcnQpCitfX2l4cDR4eF9pb3JlYWQzMih2b2lkIF9faW9tZW0gKmFkZHIpCiB7CisJdW5zaWduZWQgbG9uZyBwb3J0ID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyOwogCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCi0JCXJldHVybgkodW5zaWduZWQgaW50KV9faXhwNHh4X2lubCgodW5zaWduZWQgaW50KXBvcnQpOworCQlyZXR1cm4JKHVuc2lnbmVkIGludClfX2l4cDR4eF9pbmwocG9ydCAmIFBJT19NQVNLKTsKIAllbHNlIHsKICNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKIAkJcmV0dXJuIGxlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKCh1MzIpcG9ydCkpOwpAQCAtNDUyLDkwICs0NjAsMTAwIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotX19peHA0eHhfaW9yZWFkMzJfcmVwKHUzMiBwb3J0LCB1MzIgKnZhZGRyLCB1MzIgY291bnQpCitfX2l4cDR4eF9pb3JlYWQzMl9yZXAodm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICp2YWRkciwgdTMyIGNvdW50KQogeworCXVuc2lnbmVkIGxvbmcgcG9ydCA9ICh1bnNpZ25lZCBsb25nIF9fZm9yY2UpYWRkcjsKIAlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQotCQlfX2l4cDR4eF9pbnNsKHBvcnQsIHZhZGRyLCBjb3VudCk7CisJCV9faXhwNHh4X2luc2wocG9ydCAmIFBJT19NQVNLLCB2YWRkciwgY291bnQpOwogCWVsc2UKICNpZm5kZWYJQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKLQkJX19yYXdfcmVhZHNsKCh2b2lkIF9faW9tZW0gKilwb3J0LCB2YWRkciwgY291bnQpOworCQlfX3Jhd19yZWFkc2woYWRkciwgdmFkZHIsIGNvdW50KTsKICNlbHNlCiAJCV9faXhwNHh4X3JlYWRzbChwb3J0LCB2YWRkciwgY291bnQpOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotX19peHA0eHhfaW93cml0ZTgodTggdmFsdWUsIHZvaWQgX19pb21lbSAqcG9ydCkKK19faXhwNHh4X2lvd3JpdGU4KHU4IHZhbHVlLCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CisJdW5zaWduZWQgbG9uZyBwb3J0ID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyOwogCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCi0JCV9faXhwNHh4X291dGIodmFsdWUsICh1bnNpZ25lZCBpbnQpcG9ydCk7CisJCV9faXhwNHh4X291dGIodmFsdWUsIHBvcnQgJiBQSU9fTUFTSyk7CiAJZWxzZQogI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQotCQlfX3Jhd193cml0ZWIodmFsdWUsICh1MzIpcG9ydCk7CisJCV9fcmF3X3dyaXRlYih2YWx1ZSwgcG9ydCk7CiAjZWxzZQotCQlfX2l4cDR4eF93cml0ZWIodmFsdWUsICh1MzIpcG9ydCk7CisJCV9faXhwNHh4X3dyaXRlYih2YWx1ZSwgcG9ydCk7CiAjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1fX2l4cDR4eF9pb3dyaXRlOF9yZXAodTMyIHBvcnQsIHU4ICp2YWRkciwgdTMyIGNvdW50KQorX19peHA0eHhfaW93cml0ZThfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqdmFkZHIsIHUzMiBjb3VudCkKIHsKKwl1bnNpZ25lZCBsb25nIHBvcnQgPSAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKWFkZHI7CiAJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKLQkJX19peHA0eHhfb3V0c2IocG9ydCwgdmFkZHIsIGNvdW50KTsKKwkJX19peHA0eHhfb3V0c2IocG9ydCAmIFBJT19NQVNLLCB2YWRkciwgY291bnQpOworCWVsc2UKICNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKLQkJX19yYXdfd3JpdGVzYigodm9pZCBfX2lvbWVtICopcG9ydCwgdmFkZHIsIGNvdW50KTsKKwkJX19yYXdfd3JpdGVzYihhZGRyLCB2YWRkciwgY291bnQpOwogI2Vsc2UKIAkJX19peHA0eHhfd3JpdGVzYihwb3J0LCB2YWRkciwgY291bnQpOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotX19peHA0eHhfaW93cml0ZTE2KHUxNiB2YWx1ZSwgdm9pZCBfX2lvbWVtICpwb3J0KQorX19peHA0eHhfaW93cml0ZTE2KHUxNiB2YWx1ZSwgdm9pZCBfX2lvbWVtICphZGRyKQogeworCXVuc2lnbmVkIGxvbmcgcG9ydCA9ICh1bnNpZ25lZCBsb25nIF9fZm9yY2UpYWRkcjsKIAlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQotCQlfX2l4cDR4eF9vdXR3KHZhbHVlLCAodW5zaWduZWQgaW50KXBvcnQpOworCQlfX2l4cDR4eF9vdXR3KHZhbHVlLCBwb3J0ICYgUElPX01BU0spOwogCWVsc2UKICNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKLQkJX19yYXdfd3JpdGV3KGNwdV90b19sZTE2KHZhbHVlKSwgKHUzMilwb3J0KTsKKwkJX19yYXdfd3JpdGV3KGNwdV90b19sZTE2KHZhbHVlKSwgYWRkcik7CiAjZWxzZQotCQlfX2l4cDR4eF93cml0ZXcodmFsdWUsICh1MzIpcG9ydCk7CisJCV9faXhwNHh4X3dyaXRldyh2YWx1ZSwgcG9ydCk7CiAjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1fX2l4cDR4eF9pb3dyaXRlMTZfcmVwKHUzMiBwb3J0LCB1MTYgKnZhZGRyLCB1MzIgY291bnQpCitfX2l4cDR4eF9pb3dyaXRlMTZfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqdmFkZHIsIHUzMiBjb3VudCkKIHsKKwl1bnNpZ25lZCBsb25nIHBvcnQgPSAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKWFkZHI7CiAJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKLQkJX19peHA0eHhfb3V0c3cocG9ydCwgdmFkZHIsIGNvdW50KTsKKwkJX19peHA0eHhfb3V0c3cocG9ydCAmIFBJT19NQVNLLCB2YWRkciwgY291bnQpOworCWVsc2UKICNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKLQkJX19yYXdfcmVhZHN3KCh2b2lkIF9faW9tZW0gKilwb3J0LCB2YWRkciwgY291bnQpOworCQlfX3Jhd193cml0ZXN3KGFkZHIsIHZhZGRyLCBjb3VudCk7CiAjZWxzZQogCQlfX2l4cDR4eF93cml0ZXN3KHBvcnQsIHZhZGRyLCBjb3VudCk7CiAjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1fX2l4cDR4eF9pb3dyaXRlMzIodTMyIHZhbHVlLCB2b2lkIF9faW9tZW0gKnBvcnQpCitfX2l4cDR4eF9pb3dyaXRlMzIodTMyIHZhbHVlLCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CisJdW5zaWduZWQgbG9uZyBwb3J0ID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyOwogCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCi0JCV9faXhwNHh4X291dGwodmFsdWUsICh1bnNpZ25lZCBpbnQpcG9ydCk7CisJCV9faXhwNHh4X291dGwodmFsdWUsIHBvcnQgJiBQSU9fTUFTSyk7CiAJZWxzZQogI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQotCQlfX3Jhd193cml0ZWwoY3B1X3RvX2xlMzIodmFsdWUpLCAodTMyKXBvcnQpOworCQlfX3Jhd193cml0ZWwoY3B1X3RvX2xlMzIodmFsdWUpLCBwb3J0KTsKICNlbHNlCi0JCV9faXhwNHh4X3dyaXRlbCh2YWx1ZSwgKHUzMilwb3J0KTsKKwkJX19peHA0eHhfd3JpdGVsKHZhbHVlLCBwb3J0KTsKICNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLV9faXhwNHh4X2lvd3JpdGUzMl9yZXAodTMyIHBvcnQsIHUzMiAqdmFkZHIsIHUzMiBjb3VudCkKK19faXhwNHh4X2lvd3JpdGUzMl9yZXAodm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICp2YWRkciwgdTMyIGNvdW50KQogeworCXVuc2lnbmVkIGxvbmcgcG9ydCA9ICh1bnNpZ25lZCBsb25nIF9fZm9yY2UpYWRkcjsKIAlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQotCQlfX2l4cDR4eF9vdXRzbChwb3J0LCB2YWRkciwgY291bnQpOworCQlfX2l4cDR4eF9vdXRzbChwb3J0ICYgUElPX01BU0ssIHZhZGRyLCBjb3VudCk7CisJZWxzZQogI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQotCQlfX3Jhd19yZWFkc2woKHZvaWQgX19pb21lbSAqKXBvcnQsIHZhZGRyLCBjb3VudCk7CisJCV9fcmF3X3dyaXRlc2woYWRkciwgdmFkZHIsIGNvdW50KTsKICNlbHNlCi0JCV9faXhwNHh4X291dHNsKHBvcnQsIHZhZGRyLCBjb3VudCk7CisJCV9faXhwNHh4X3dyaXRlc2wocG9ydCwgdmFkZHIsIGNvdW50KTsKICNlbmRpZgogfQogCkBAIC01NTUsNyArNTczLDcgQEAKICNkZWZpbmUJaW93cml0ZTE2X3JlcChwLCB2LCBjKQkJX19peHA0eHhfaW93cml0ZTE2X3JlcChwLCB2LCBjKQogI2RlZmluZQlpb3dyaXRlMzJfcmVwKHAsIHYsIGMpCQlfX2l4cDR4eF9pb3dyaXRlMzJfcmVwKHAsIHYsIGMpCiAKLSNkZWZpbmUJaW9wb3J0X21hcChwb3J0LCBucikJCSgodm9pZCBfX2lvbWVtKilwb3J0KQorI2RlZmluZQlpb3BvcnRfbWFwKHBvcnQsIG5yKQkJKCh2b2lkIF9faW9tZW0qKShwb3J0ICsgUElPX09GRlNFVCkpCiAjZGVmaW5lCWlvcG9ydF91bm1hcChhZGRyKQogCiAjZW5kaWYJLy8gIF9fQVNNX0FSTV9BUkNIX0lPX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9wbGF0Zm9ybS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L3BsYXRmb3JtLmgKaW5kZXggM2E2MjZjMC4uZDEzZWU3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L3BsYXRmb3JtLmgKQEAgLTgzLDE3ICs4Myw2IEBACiAjZGVmaW5lIElYUDRYWF9HUElPX09VVCAJCTB4MQogI2RlZmluZSBJWFA0WFhfR1BJT19JTiAgCQkweDIKIAotI2RlZmluZSBJWFA0WFhfR1BJT19JTlRTVFlMRV9NQVNLCTB4N0MgIC8qIEJpdHMgWzY6Ml0gZGVmaW5lIGludGVycnVwdCBzdHlsZSAqLwotCi0vKiAKLSAqIEdQSU8gaW50ZXJydXB0IHR5cGVzLgotICovCi0jZGVmaW5lIElYUDRYWF9HUElPX0FDVElWRV9ISUdICQkweDQgLyogRGVmYXVsdCAqLwotI2RlZmluZSBJWFA0WFhfR1BJT19BQ1RJVkVfTE9XCQkweDgKLSNkZWZpbmUgSVhQNFhYX0dQSU9fUklTSU5HX0VER0UJCTB4MTAKLSNkZWZpbmUgSVhQNFhYX0dQSU9fRkFMTElOR19FREdFIAkweDIwCi0jZGVmaW5lIElYUDRYWF9HUElPX1RSQU5TSVRJT05BTCAJMHg0MAotCiAvKiBHUElPIHNpZ25hbCB0eXBlcyAqLwogI2RlZmluZSBJWFA0WFhfR1BJT19MT1cJCQkwCiAjZGVmaW5lIElYUDRYWF9HUElPX0hJR0gJCTEKQEAgLTEwMiw3ICs5MSwxMyBAQAogI2RlZmluZSBJWFA0WFhfR1BJT19DTEtfMAkJMTQKICNkZWZpbmUgSVhQNFhYX0dQSU9fQ0xLXzEJCTE1CiAKLWV4dGVybiB2b2lkIGdwaW9fbGluZV9jb25maWcodTggbGluZSwgdTMyIHN0eWxlKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2xpbmVfY29uZmlnKHU4IGxpbmUsIHUzMiBkaXJlY3Rpb24pCit7CisJaWYgKGRpcmVjdGlvbiA9PSBJWFA0WFhfR1BJT19PVVQpCisJCSpJWFA0WFhfR1BJT19HUE9FUiB8PSAoMSA8PCBsaW5lKTsKKwllbHNlCisJCSpJWFA0WFhfR1BJT19HUE9FUiAmPSB+KDEgPDwgbGluZSk7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2xpbmVfZ2V0KHU4IGxpbmUsIGludCAqdmFsdWUpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWg0LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWg0LmgKaW5kZXggNzkxMzhkY2YuLmQ2NGVlOTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtaDQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWg0LmgKQEAgLTMwLDYgKzMwLDkgQEAKICNkZWZpbmUgX19BU01fQVJDSF9PTUFQX0g0X0gKIAogLyogUGxhY2Vob2xkZXIgZm9yIEg0IHNwZWNpZmljIGRlZmluZXMgKi8KKy8qIEdQTUMgQ1MxICovCisjZGVmaW5lIE9NQVAyNFhYX0VUSFJfU1RBUlQgICAgICAgICAgICAgMHgwODAwMDMwMAorI2RlZmluZSBPTUFQMjRYWF9FVEhSX0dQSU9fSVJRCQk5MgogCiAjZW5kaWYgLyogIF9fQVNNX0FSQ0hfT01BUF9INF9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtaW5ub3ZhdG9yLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWlubm92YXRvci5oCmluZGV4IDBmMWFiYWUuLjc5NTc0ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtaW5ub3ZhdG9yLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1pbm5vdmF0b3IuaApAQCAtMzYsMzEgKzM2LDYgQEAKICNkZWZpbmUgT01BUDE1MTBQMV9FTUlGU19QUklfVkFMVUUJCTB4MDAKICNkZWZpbmUgT01BUDE1MTBQMV9FTUlGRl9QUklfVkFMVUUJCTB4MDAKIAotLyoKLSAqIFRoZXNlIGRlZmluaXRpb25zIGRlZmluZSBhbiBhcmVhIG9mIEZMQVNIIHNldCBhc2lkZQotICogZm9yIHRoZSB1c2Ugb2YgTVREL0pGRlMyLiBUaGlzIGlzIHRoZSBhcmVhIG9mIGZsYXNoCi0gKiB0aGF0IGEgSkZGUzIgZmlsZXN5c3RlbSB3aWxsIHJlc2lkZSB3aGljaCBpcyBtb3VudGVkCi0gKiBhdCBib290IHdpdGggdGhlICJyb290PS9kZXYvbXRkYmxvY2svMCBydyIKLSAqIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZSBmbGFzaCBhZGRyZXNzIHVzZWQgaGVyZSBtdXN0Ci0gKiBmYWxsIHdpdGhpbiB0aGUgbGVnYWwgcmFuZ2UgZGVmaW5lZCBieSBycmxvYWQgZm9yIHN0b3JpbmcKLSAqIHRoZSBmaWxlc3lzdGVtIGNvbXBvbmVudC4gVGhpcyBhZGRyZXNzIHdpbGwgYmUgc3VmZmljaWVudGx5Ci0gKiBkZWVwIGludG8gdGhlIG92ZXJhbGwgZmxhc2ggcmFuZ2UgdG8gYXZvaWQgdGhlIG90aGVyCi0gKiBjb21wb25lbnRzIGFsc28gc3RvcmVkIGluIGZsYXNoIHN1Y2ggYXMgdGhlIGJvb3Rsb2FkZXIsCi0gKiB0aGUgYm9vdGxvYWRlciBwYXJhbXMsIGFuZCB0aGUga2VybmVsLgotICogVGhlIFNXMiBzZXR0aW5ncyBmb3IgdGhlIG1hcCBiZWxvdyBhcmU6Ci0gKiAxIG9mZiwgMiBvZmYsIDMgb24sIDQgb2ZmLgotICovCi0KLS8qIEludGVsIGZsYXNoXzAsIHBhcnRpdGlvbmVkIGFzIGV4cGVjdGVkIGJ5IHJybG9hZCAqLwotI2RlZmluZSBPTUFQX0ZMQVNIXzBfQkFTRQkweEQ4MDAwMDAwCi0jZGVmaW5lIE9NQVBfRkxBU0hfMF9TVEFSVAkweDAwMDAwMDAwCi0jZGVmaW5lIE9NQVBfRkxBU0hfMF9TSVpFCVNaXzE2TQotCi0vKiBJbnRlbCBmbGFzaF8xLCB1c2VkIGZvciBjcmFtZnMgb3Igb3RoZXIgZmxhc2ggZmlsZSBzeXN0ZW1zICovCi0jZGVmaW5lIE9NQVBfRkxBU0hfMV9CQVNFCTB4RDkwMDAwMDAKLSNkZWZpbmUgT01BUF9GTEFTSF8xX1NUQVJUCTB4MDEwMDAwMDAKLSNkZWZpbmUgT01BUF9GTEFTSF8xX1NJWkUJU1pfMTZNCi0KICNkZWZpbmUgTlJfRlBHQV9JUlFTCQkyNAogI2RlZmluZSBOUl9JUlFTICAgICAgICAgICAgICAgICBJSF9CT0FSRF9CQVNFICsgTlJfRlBHQV9JUlFTCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtcGVyc2V1czIuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtcGVyc2V1czIuaAppbmRleCAwYzIyNGNjLi42OTFlNTJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLXBlcnNldXMyLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1wZXJzZXVzMi5oCkBAIC0zNiwyMyArMzYsMTQgQEAKICNkZWZpbmUgT01BUF9TRFJBTV9ERVZJQ0UJCUQyNTZNXzFYMTZfNEIKICNlbmRpZgogCi0vKgotICogVGhlc2UgZGVmaW5pdGlvbnMgZGVmaW5lIGFuIGFyZWEgb2YgRkxBU0ggc2V0IGFzaWRlCi0gKiBmb3IgdGhlIHVzZSBvZiBNVEQvSkZGUzIuIFRoaXMgaXMgdGhlIGFyZWEgb2YgZmxhc2gKLSAqIHRoYXQgYSBKRkZTMiBmaWxlc3lzdGVtIHdpbGwgcmVzaWRlIHdoaWNoIGlzIG1vdW50ZWQKLSAqIGF0IGJvb3Qgd2l0aCB0aGUgInJvb3Q9L2Rldi9tdGRibG9jay8wIHJ3IgotICogY29tbWFuZCBsaW5lIG9wdGlvbi4KLSAqLwotCi0vKiBJbnRlbCBmbGFzaF8wLCBwYXJ0aXRpb25lZCBhcyBleHBlY3RlZCBieSBycmxvYWQgKi8KLSNkZWZpbmUgT01BUF9GTEFTSF8wX0JBU0UJMHhEODAwMDAwMAkvKiBWQSAqLwotI2RlZmluZSBPTUFQX0ZMQVNIXzBfU1RBUlQJMHgwMDAwMDAwMAkvKiBQQSAqLwotI2RlZmluZSBPTUFQX0ZMQVNIXzBfU0laRQlTWl8zMk0KLQogI2RlZmluZSBNQVhJUlFOVU0JCUlIX0JPQVJEX0JBU0UKICNkZWZpbmUgTUFYRklRTlVNCQlNQVhJUlFOVU0KICNkZWZpbmUgTUFYU1dJTlVNCQlNQVhJUlFOVU0KIAogI2RlZmluZSBOUl9JUlFTCQkJKE1BWElSUU5VTSArIDEpCiAKKy8qIFNhbXN1bmcgTkFORCBmbGFzaCBhdCBDUzJCIG9yIENTMyhOQU5EIEJvb3QpICovCisjZGVmaW5lIE9NQVBfTkFORF9GTEFTSF9TVEFSVDEJICAgMHgwQTAwMDAwMCAvKiBDUzJCICovCisjZGVmaW5lIE9NQVBfTkFORF9GTEFTSF9TVEFSVDIJICAgMHgwQzAwMDAwMCAvKiBDUzMgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLXZvaWNlYmx1ZS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC12b2ljZWJsdWUuaAppbmRleCAzMzk3N2I4Li5lZDZkMzQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLXZvaWNlYmx1ZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtdm9pY2VibHVlLmgKQEAgLTExLDExICsxMSw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfVk9JQ0VCTFVFX0gKICNkZWZpbmUgX19BU01fQVJDSF9WT0lDRUJMVUVfSAogCi0jaWYgKEVYVEVSTkFMX01BWF9OUl9QT1JUUyA8IDQpCi0jdW5kZWYgRVhURVJOQUxfTUFYX05SX1BPUlRTCi0jZGVmaW5lIEVYVEVSTkFMX01BWF9OUl9QT1JUUwk0Ci0jZW5kaWYKLQogZXh0ZXJuIHZvaWQgdm9pY2VibHVlX3dkdF9lbmFibGUodm9pZCk7CiBleHRlcm4gdm9pZCB2b2ljZWJsdWVfd2R0X2Rpc2FibGUodm9pZCk7CiBleHRlcm4gdm9pZCB2b2ljZWJsdWVfd2R0X3Bpbmcodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLmgKaW5kZXggOTViZDYyNS4uYTAwNDBjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQuaApAQCAtMzAsMTAgKzMwLDIzIEBACiAJdTggc3lzdGVtX2Nsb2NrX3R5cGU7CiB9OwogCitzdHJ1Y3Qgb21hcF9tbWNfY29uZiB7CisJdW5zaWduZWQgZW5hYmxlZDoxOworCS8qIG5vbXV4IG1lYW5zICJzdGFuZGFyZCIgbXV4aW5nIGlzIHdyb25nIG9uIHRoaXMgYm9hcmQsIGFuZCB0aGF0CisJICogYm9hcmQtc3BlY2lmaWMgY29kZSBoYW5kbGVkIGl0IGJlZm9yZSBjb21tb24gaW5pdCBsb2dpYy4KKwkgKi8KKwl1bnNpZ25lZCBub211eDoxOworCS8qIHN3aXRjaCBwaW4gY2FuIGJlIGZvciBjYXJkIGRldGVjdCAoZGVmYXVsdCkgb3IgY2FyZCBjb3ZlciAqLworCXVuc2lnbmVkIGNvdmVyOjE7CisJLyogNCB3aXJlIHNpZ25hbGluZyBpcyBvcHRpb25hbCwgYW5kIGlzIG9ubHkgdXNlZCBmb3IgU0QvU0RJTyAqLworCXVuc2lnbmVkIHdpcmU0OjE7CisJczE2IHBvd2VyX3BpbjsKKwlzMTYgc3dpdGNoX3BpbjsKKwlzMTYgd3BfcGluOworfTsKKwogc3RydWN0IG9tYXBfbW1jX2NvbmZpZyB7Ci0JdTggbW1jX2Jsb2NrczsKLQlzMTYgbW1jMV9wb3dlcl9waW4sIG1tYzJfcG93ZXJfcGluOwotCXMxNiBtbWMxX3N3aXRjaF9waW4sIG1tYzJfc3dpdGNoX3BpbjsKKwlzdHJ1Y3Qgb21hcF9tbWNfY29uZiBtbWNbMl07CiB9OwogCiBzdHJ1Y3Qgb21hcF9zZXJpYWxfY29uc29sZV9jb25maWcgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9jcHUuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvY3B1LmgKaW5kZXggZTg3ODY3MS4uMTExOWUyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9jcHUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2NwdS5oCkBAIC0zOCwxNDYgKzM4LDE3OSBAQAogLyoKICAqIFRlc3QgaWYgbXVsdGljb3JlIE9NQVAgc3VwcG9ydCBpcyBuZWVkZWQKICAqLwotI3VuZGVmIE1VTFRJX09NQVAKKyN1bmRlZiBNVUxUSV9PTUFQMQorI3VuZGVmIE1VTFRJX09NQVAyCiAjdW5kZWYgT01BUF9OQU1FCiAKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCiAjIGlmZGVmIE9NQVBfTkFNRQotIyAgdW5kZWYgIE1VTFRJX09NQVAKLSMgIGRlZmluZSBNVUxUSV9PTUFQCisjICB1bmRlZiAgTVVMVElfT01BUDEKKyMgIGRlZmluZSBNVUxUSV9PTUFQMQogIyBlbHNlCiAjICBkZWZpbmUgT01BUF9OQU1FIG9tYXA3MzAKICMgZW5kaWYKICNlbmRpZgogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCiAjIGlmZGVmIE9NQVBfTkFNRQotIyAgdW5kZWYgIE1VTFRJX09NQVAKLSMgIGRlZmluZSBNVUxUSV9PTUFQCisjICB1bmRlZiAgTVVMVElfT01BUDEKKyMgIGRlZmluZSBNVUxUSV9PTUFQMQogIyBlbHNlCiAjICBkZWZpbmUgT01BUF9OQU1FIG9tYXAxNTEwCiAjIGVuZGlmCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAogIyBpZmRlZiBPTUFQX05BTUUKLSMgIHVuZGVmICBNVUxUSV9PTUFQCi0jICBkZWZpbmUgTVVMVElfT01BUAorIyAgdW5kZWYgIE1VTFRJX09NQVAxCisjICBkZWZpbmUgTVVMVElfT01BUDEKICMgZWxzZQotIyAgZGVmaW5lIE9NQVBfTkFNRSBvbWFwMTYxMAorIyAgZGVmaW5lIE9NQVBfTkFNRSBvbWFwMTZ4eAogIyBlbmRpZgogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKLSMgaWZkZWYgT01BUF9OQU1FCi0jICB1bmRlZiAgTVVMVElfT01BUAotIyAgZGVmaW5lIE1VTFRJX09NQVAKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorIyBpZiAoZGVmaW5lZChPTUFQX05BTUUpIHx8IGRlZmluZWQoTVVMVElfT01BUDEpKQorIyAgZXJyb3IgIk9NQVAxIGFuZCBPTUFQMiBjYW4ndCBiZSBzZWxlY3RlZCBhdCB0aGUgc2FtZSB0aW1lIgogIyBlbHNlCi0jICBkZWZpbmUgT01BUF9OQU1FIG9tYXAxNzEwCisjICB1bmRlZiAgTVVMVElfT01BUDIKKyMgIGRlZmluZSBPTUFQX05BTUUgb21hcDI0eHgKICMgZW5kaWYKICNlbmRpZgogCiAvKgotICogR2VuZXJhdGUgdmFyaW91cyBPTUFQIGNwdSBzcGVjaWZpYyBtYWNyb3MsIGFuZCBjcHUgY2xhc3MKLSAqIHNwZWNpZmljIG1hY3JvcworICogTWFjcm9zIHRvIGdyb3VwIE9NQVAgaW50byBjcHUgY2xhc3Nlcy4KKyAqIFRoZXNlIGNhbiBiZSB1c2VkIGluIG1vc3QgcGxhY2VzLgorICogY3B1X2lzX29tYXA3eHgoKToJVHJ1ZSBmb3IgT01BUDczMAorICogY3B1X2lzX29tYXAxNXh4KCk6CVRydWUgZm9yIE9NQVAxNTEwIGFuZCBPTUFQNTkxMAorICogY3B1X2lzX29tYXAxNnh4KCk6CVRydWUgZm9yIE9NQVAxNjEwLCBPTUFQNTkxMiBhbmQgT01BUDE3MTAKKyAqIGNwdV9pc19vbWFwMjR4eCgpOglUcnVlIGZvciBPTUFQMjQyMAogICovCi0jZGVmaW5lIEdFVF9PTUFQX1RZUEUJKChzeXN0ZW1fcmV2ID4+IDI0KSAmIDB4ZmYpCiAjZGVmaW5lIEdFVF9PTUFQX0NMQVNTCShzeXN0ZW1fcmV2ICYgMHhmZikKIAotI2RlZmluZSBJU19PTUFQX1RZUEUodHlwZSwgaWQpCQkJCVwKLXN0YXRpYyBpbmxpbmUgaW50IGlzX29tYXAgIyN0eXBlICh2b2lkKQkJCVwKLXsJCQkJCQkJXAotCXJldHVybiAoR0VUX09NQVBfVFlQRSA9PSAoaWQpKSA/IDEgOiAwOwkJXAotfQotCiAjZGVmaW5lIElTX09NQVBfQ0xBU1MoY2xhc3MsIGlkKQkJCVwKIHN0YXRpYyBpbmxpbmUgaW50IGlzX29tYXAgIyNjbGFzcyAodm9pZCkJCVwKIHsJCQkJCQkJXAogCXJldHVybiAoR0VUX09NQVBfQ0xBU1MgPT0gKGlkKSkgPyAxIDogMDsJXAogfQogCi1JU19PTUFQX1RZUEUoNzMwLCAweDA3KQotSVNfT01BUF9UWVBFKDE1MTAsIDB4MTUpCi1JU19PTUFQX1RZUEUoMTYxMCwgMHgxNikKLUlTX09NQVBfVFlQRSg1OTEyLCAweDE2KQotSVNfT01BUF9UWVBFKDE3MTAsIDB4MTcpCi1JU19PTUFQX1RZUEUoMjQyMCwgMHgyNCkKLQogSVNfT01BUF9DTEFTUyg3eHgsIDB4MDcpCiBJU19PTUFQX0NMQVNTKDE1eHgsIDB4MTUpCiBJU19PTUFQX0NMQVNTKDE2eHgsIDB4MTYpCiBJU19PTUFQX0NMQVNTKDI0eHgsIDB4MjQpCiAKLS8qCi0gKiBNYWNyb3MgdG8gZ3JvdXAgT01BUCB0eXBlcyBpbnRvIGNwdSBjbGFzc2VzLgotICogVGhlc2UgY2FuIGJlIHVzZWQgaW4gbW9zdCBwbGFjZXMuCi0gKiBjcHVfaXNfb21hcDE1eHgoKToJVHJ1ZSBmb3IgMTUxMCBhbmQgNTkxMAotICogY3B1X2lzX29tYXAxNnh4KCk6CVRydWUgZm9yIDE2MTAsIDU5MTIgYW5kIDE3MTAKLSAqLwotI2lmIGRlZmluZWQoTVVMVElfT01BUCkKLSMgZGVmaW5lIGNwdV9pc19vbWFwN3h4KCkJCWlzX29tYXA3eHgoKQotIyBkZWZpbmUgY3B1X2lzX29tYXAxNXh4KCkJCWlzX29tYXAxNXh4KCkKLSMgaWYgIShkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNTEwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA3MzApKQotIyAgZGVmaW5lIGNwdV9pc19vbWFwMTZ4eCgpCQkxCi0jIGVsc2UKKyNkZWZpbmUgY3B1X2lzX29tYXA3eHgoKQkJMAorI2RlZmluZSBjcHVfaXNfb21hcDE1eHgoKQkJMAorI2RlZmluZSBjcHVfaXNfb21hcDE2eHgoKQkJMAorI2RlZmluZSBjcHVfaXNfb21hcDI0eHgoKQkJMAorCisjaWYgZGVmaW5lZChNVUxUSV9PTUFQMSkKKyMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNzMwKQorIyAgdW5kZWYgIGNwdV9pc19vbWFwN3h4CisjICBkZWZpbmUgY3B1X2lzX29tYXA3eHgoKQkJaXNfb21hcDd4eCgpCisjIGVuZGlmCisjIGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE1MTApCisjICB1bmRlZiAgY3B1X2lzX29tYXAxNXh4CisjICBkZWZpbmUgY3B1X2lzX29tYXAxNXh4KCkJCWlzX29tYXAxNXh4KCkKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKKyMgIHVuZGVmICBjcHVfaXNfb21hcDE2eHgKICMgIGRlZmluZSBjcHVfaXNfb21hcDE2eHgoKQkJaXNfb21hcDE2eHgoKQogIyBlbmRpZgogI2Vsc2UKICMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNzMwKQorIyAgdW5kZWYgIGNwdV9pc19vbWFwN3h4CiAjICBkZWZpbmUgY3B1X2lzX29tYXA3eHgoKQkJMQotIyBlbHNlCi0jICBkZWZpbmUgY3B1X2lzX29tYXA3eHgoKQkJMAogIyBlbmRpZgogIyBpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNTEwKQorIyAgdW5kZWYgIGNwdV9pc19vbWFwMTV4eAogIyAgZGVmaW5lIGNwdV9pc19vbWFwMTV4eCgpCQkxCi0jIGVsc2UKLSMgIGRlZmluZSBjcHVfaXNfb21hcDE1eHgoKQkJMAogIyBlbmRpZgogIyBpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorIyAgdW5kZWYgIGNwdV9pc19vbWFwMTZ4eAogIyAgZGVmaW5lIGNwdV9pc19vbWFwMTZ4eCgpCQkxCi0jIGVsc2UKLSMgIGRlZmluZSBjcHVfaXNfb21hcDE2eHgoKQkJMAorIyBlbmRpZgorIyBpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNFhYKQorIyAgdW5kZWYgIGNwdV9pc19vbWFwMjR4eAorIyAgZGVmaW5lIGNwdV9pc19vbWFwMjR4eCgpCQkxCiAjIGVuZGlmCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoTVVMVElfT01BUCkKLSMgZGVmaW5lIGNwdV9pc19vbWFwNzMwKCkJCWlzX29tYXA3MzAoKQotIyBkZWZpbmUgY3B1X2lzX29tYXAxNTEwKCkJCWlzX29tYXAxNTEwKCkKLSMgZGVmaW5lIGNwdV9pc19vbWFwMTYxMCgpCQlpc19vbWFwMTYxMCgpCi0jIGRlZmluZSBjcHVfaXNfb21hcDU5MTIoKQkJaXNfb21hcDU5MTIoKQotIyBkZWZpbmUgY3B1X2lzX29tYXAxNzEwKCkJCWlzX29tYXAxNzEwKCkKLSNlbHNlCisvKgorICogTWFjcm9zIHRvIGRldGVjdCBpbmRpdmlkdWFsIGNwdSB0eXBlcy4KKyAqIFRoZXNlIGFyZSBvbmx5IHJhcmVseSBuZWVkZWQuCisgKiBjcHVfaXNfb21hcDczMCgpOglUcnVlIGZvciBPTUFQNzMwCisgKiBjcHVfaXNfb21hcDE1MTAoKToJVHJ1ZSBmb3IgT01BUDE1MTAKKyAqIGNwdV9pc19vbWFwMTYxMCgpOglUcnVlIGZvciBPTUFQMTYxMAorICogY3B1X2lzX29tYXAxNjExKCk6CVRydWUgZm9yIE9NQVAxNjExCisgKiBjcHVfaXNfb21hcDU5MTIoKToJVHJ1ZSBmb3IgT01BUDU5MTIKKyAqIGNwdV9pc19vbWFwMTYyMSgpOglUcnVlIGZvciBPTUFQMTYyMQorICogY3B1X2lzX29tYXAxNzEwKCk6CVRydWUgZm9yIE9NQVAxNzEwCisgKiBjcHVfaXNfb21hcDI0MjAoKToJVHJ1ZSBmb3IgT01BUDI0MjAKKyAqLworI2RlZmluZSBHRVRfT01BUF9UWVBFCSgoc3lzdGVtX3JldiA+PiAxNikgJiAweGZmZmYpCisKKyNkZWZpbmUgSVNfT01BUF9UWVBFKHR5cGUsIGlkKQkJCQlcCitzdGF0aWMgaW5saW5lIGludCBpc19vbWFwICMjdHlwZSAodm9pZCkJCQlcCit7CQkJCQkJCVwKKwlyZXR1cm4gKEdFVF9PTUFQX1RZUEUgPT0gKGlkKSkgPyAxIDogMDsJCVwKK30KKworSVNfT01BUF9UWVBFKDczMCwgMHgwNzMwKQorSVNfT01BUF9UWVBFKDE1MTAsIDB4MTUxMCkKK0lTX09NQVBfVFlQRSgxNjEwLCAweDE2MTApCitJU19PTUFQX1RZUEUoMTYxMSwgMHgxNjExKQorSVNfT01BUF9UWVBFKDU5MTIsIDB4MTYxMSkKK0lTX09NQVBfVFlQRSgxNjIxLCAweDE2MjEpCitJU19PTUFQX1RZUEUoMTcxMCwgMHgxNzEwKQorSVNfT01BUF9UWVBFKDI0MjAsIDB4MjQyMCkKKworI2RlZmluZSBjcHVfaXNfb21hcDczMCgpCQkwCisjZGVmaW5lIGNwdV9pc19vbWFwMTUxMCgpCQkwCisjZGVmaW5lIGNwdV9pc19vbWFwMTYxMCgpCQkwCisjZGVmaW5lIGNwdV9pc19vbWFwNTkxMigpCQkwCisjZGVmaW5lIGNwdV9pc19vbWFwMTYxMSgpCQkwCisjZGVmaW5lIGNwdV9pc19vbWFwMTYyMSgpCQkwCisjZGVmaW5lIGNwdV9pc19vbWFwMTcxMCgpCQkwCisjZGVmaW5lIGNwdV9pc19vbWFwMjQyMCgpCQkwCisKKyNpZiBkZWZpbmVkKE1VTFRJX09NQVAxKQogIyBpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA3MzApCi0jICBkZWZpbmUgY3B1X2lzX29tYXA3MzAoKQkJMQotIyBlbHNlCi0jICBkZWZpbmUgY3B1X2lzX29tYXA3MzAoKQkJMAorIyAgdW5kZWYgIGNwdV9pc19vbWFwNzMwCisjICBkZWZpbmUgY3B1X2lzX29tYXA3MzAoKQkJaXNfb21hcDczMCgpCiAjIGVuZGlmCiAjIGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE1MTApCisjICB1bmRlZiAgY3B1X2lzX29tYXAxNTEwCisjICBkZWZpbmUgY3B1X2lzX29tYXAxNTEwKCkJCWlzX29tYXAxNTEwKCkKKyMgZW5kaWYKKyNlbHNlCisjIGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDczMCkKKyMgIHVuZGVmICBjcHVfaXNfb21hcDczMAorIyAgZGVmaW5lIGNwdV9pc19vbWFwNzMwKCkJCTEKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTUxMCkKKyMgIHVuZGVmICBjcHVfaXNfb21hcDE1MTAKICMgIGRlZmluZSBjcHVfaXNfb21hcDE1MTAoKQkJMQotIyBlbHNlCi0jICBkZWZpbmUgY3B1X2lzX29tYXAxNTEwKCkJCTAKICMgZW5kaWYKLSMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLSMgIGRlZmluZSBjcHVfaXNfb21hcDE2MTAoKQkJMQotIyBlbHNlCi0jICBkZWZpbmUgY3B1X2lzX29tYXAxNjEwKCkJCTAKLSMgZW5kaWYKLSMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLSMgIGRlZmluZSBjcHVfaXNfb21hcDU5MTIoKQkJMQotIyBlbHNlCi0jICBkZWZpbmUgY3B1X2lzX29tYXA1OTEyKCkJCTAKLSMgZW5kaWYKLSMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKKyNlbmRpZgorCisvKgorICogV2hldGhlciB3ZSBoYXZlIE1VTFRJX09NQVAxIG9yIG5vdCwgd2Ugc3RpbGwgbmVlZCB0byBkaXN0aW5ndWlzaAorICogYmV0d2VlbiAxNjExQi81OTEyIGFuZCAxNzEwLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKKyMgdW5kZWYgIGNwdV9pc19vbWFwMTYxMAorIyB1bmRlZiAgY3B1X2lzX29tYXAxNjExCisjIHVuZGVmICBjcHVfaXNfb21hcDU5MTIKKyMgdW5kZWYgIGNwdV9pc19vbWFwMTYyMQorIyB1bmRlZiAgY3B1X2lzX29tYXAxNzEwCiAjIGRlZmluZSBjcHVfaXNfb21hcDE2MTAoKQkJaXNfb21hcDE2MTAoKQorIyBkZWZpbmUgY3B1X2lzX29tYXAxNjExKCkJCWlzX29tYXAxNjExKCkKICMgZGVmaW5lIGNwdV9pc19vbWFwNTkxMigpCQlpc19vbWFwNTkxMigpCisjIGRlZmluZSBjcHVfaXNfb21hcDE2MjEoKQkJaXNfb21hcDE2MjEoKQogIyBkZWZpbmUgY3B1X2lzX29tYXAxNzEwKCkJCWlzX29tYXAxNzEwKCkKLSMgZWxzZQotIyBkZWZpbmUgY3B1X2lzX29tYXAxNjEwKCkJCTAKLSMgZGVmaW5lIGNwdV9pc19vbWFwNTkxMigpCQkwCi0jIGRlZmluZSBjcHVfaXNfb21hcDE3MTAoKQkJMAotIyBlbmRpZgotIyBpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDIwKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDIwKQorIyAgdW5kZWYgIGNwdV9pc19vbWFwMjQyMAogIyAgZGVmaW5lIGNwdV9pc19vbWFwMjQyMCgpCQkxCi0jIGVsc2UKLSMgIGRlZmluZSBjcHVfaXNfb21hcDI0MjAoKQkJMAotIyBlbmRpZgogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kZWJ1Zy1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kZWJ1Zy1tYWNyby5TCmluZGV4IDgzYmI0NTguLmNhNGY1NzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZGVidWctbWFjcm8uUworKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RlYnVnLW1hY3JvLlMKQEAgLTE0LDYgKzE0LDcgQEAKIAkJLm1hY3JvCWFkZHJ1YXJ0LHJ4CiAJCW1yYwlwMTUsIDAsIFxyeCwgYzEsIGMwCiAJCXRzdAlccngsICMxCQkJQCBNTVUgZW5hYmxlZD8KKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQogCQltb3ZlcQlccngsICMweGZmMDAwMDAwCUAgcGh5c2ljYWwgYmFzZSBhZGRyZXNzCiAJCW1vdm5lCVxyeCwgIzB4ZmUwMDAwMDAJQCB2aXJ0dWFsIGJhc2UKIAkJb3JyCVxyeCwgXHJ4LCAjMHgwMGZiMDAwMApAQCAtMjMsNiArMjQsMTggQEAKICNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQyKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzKQogCQlvcnIJXHJ4LCBccngsICMweDAwMDAwODAwCUAgVUFSVCAyICYgMwogI2VuZGlmCisKKyNlbGlmICBDT05GSUdfQVJDSF9PTUFQMgorCQltb3ZlcQlccngsICMweDQ4MDAwMDAwCUAgcGh5c2ljYWwgYmFzZSBhZGRyZXNzCisJCW1vdm5lCVxyeCwgIzB4ZDgwMDAwMDAJQCB2aXJ0dWFsIGJhc2UKKwkJb3JyCVxyeCwgXHJ4LCAjMHgwMDA2YTAwMAorI2lmZGVmIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQyCisJCWFkZAlccngsIFxyeCwgIzB4MDAwMDIwMDAJQCBVQVJUIDIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzCisJCWFkZAlccngsIFxyeCwgIzB4MDAwMDQwMDAJQCBVQVJUIDMKKyNlbmRpZgorI2VuZGlmCiAJCS5lbmRtCiAKIAkJLm1hY3JvCXNlbmR1YXJ0LHJkLHJ4CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RtYS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kbWEuaAppbmRleCBjZTExNGNlLi4wNGViZWY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZG1hLmgKQEAgLTI0MCw2ICsyNDAsNyBAQAogCiBleHRlcm4gZG1hX2FkZHJfdCBvbWFwX2dldF9kbWFfc3JjX3BvcyhpbnQgbGNoKTsKIGV4dGVybiBkbWFfYWRkcl90IG9tYXBfZ2V0X2RtYV9kc3RfcG9zKGludCBsY2gpOworZXh0ZXJuIGludCBvbWFwX2dldF9kbWFfc3JjX2FkZHJfY291bnRlcihpbnQgbGNoKTsKIGV4dGVybiB2b2lkIG9tYXBfY2xlYXJfZG1hKGludCBsY2gpOwogZXh0ZXJuIGludCBvbWFwX2RtYV9ydW5uaW5nKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RtdGltZXIuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZG10aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzcyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RtdGltZXIuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20tYXJtL2FybS9hcmNoLW9tYXAvZG10aW1lci5oCisgKgorICogT01BUCBEdWFsLU1vZGUgVGltZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IExhdXJpIExldWtrdW5lbiA8bGF1cmkubGV1a2t1bmVuQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KKyAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1RJTUVSX0gKKyNkZWZpbmUgX19BU01fQVJDSF9USU1FUl9ICisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNkZWZpbmUgT01BUF9USU1FUl9TUkNfQVJNWE9SCQkweDAwCisjZGVmaW5lIE9NQVBfVElNRVJfU1JDXzMyX0tIWgkJMHgwMQorI2RlZmluZSBPTUFQX1RJTUVSX1NSQ19FWFRfQ0xLCQkweDAyCisKKy8qIHRpbWVyIGNvbnRyb2wgcmVnIGJpdHMgKi8KKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX0NBUFRNT0RFCSgxIDw8IDEzKQorI2RlZmluZSBPTUFQX1RJTUVSX0NUUkxfUFQJCSgxIDw8IDEyKQorI2RlZmluZSBPTUFQX1RJTUVSX0NUUkxfVFJHX09WRVJGTE9XCSgweDEgPDwgMTApCisjZGVmaW5lIE9NQVBfVElNRVJfQ1RSTF9UUkdfT0ZBTkRNQVRDSAkoMHgyIDw8IDEwKQorI2RlZmluZSBPTUFQX1RJTUVSX0NUUkxfVENNX0xPV1RPSElHSAkoMHgxIDw8IDgpCisjZGVmaW5lIE9NQVBfVElNRVJfQ1RSTF9UQ01fSElHSFRPTE9XCSgweDIgPDwgOCkKKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX1RDTV9CT1RIRURHRVMJKDB4MyA8PCA4KQorI2RlZmluZSBPTUFQX1RJTUVSX0NUUkxfU0NQV00JCSgxIDw8IDcpCisjZGVmaW5lIE9NQVBfVElNRVJfQ1RSTF9DRQkJKDEgPDwgNikJLyogY29tcGFyZSBlbmFibGUgKi8KKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX1BSRQkJKDEgPDwgNSkJLyogcHJlc2NhbGVyIGVuYWJsZSAqLworI2RlZmluZSBPTUFQX1RJTUVSX0NUUkxfUFRWX1NISUZUCTIJCS8qIGhvdyBtdWNoIHRvIHNoaWZ0IHRoZSBwcmVzY2FsZXIgdmFsdWUgKi8KKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX0FSCQkoMSA8PCAxKQkvKiBhdXRvLXJlbG9hZCBlbmFibGUgKi8KKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX1NUCQkoMSA8PCAwKQkvKiBzdGFydCB0aW1lciAqLworCisvKiB0aW1lciBpbnRlcnJ1cHQgZW5hYmxlIGJpdHMgKi8KKyNkZWZpbmUgT01BUF9USU1FUl9JTlRfQ0FQVFVSRQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUF9USU1FUl9JTlRfT1ZFUkZMT1cJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVBfVElNRVJfSU5UX01BVENICQkoMSA8PCAwKQorCisKK3N0cnVjdCBvbWFwX2RtX3RpbWVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRpbWVyX2xpc3Q7CisKKwl1MzIgYmFzZTsKKwl1bnNpZ25lZCBpbnQgaXJxOworfTsKKwordTMyIG9tYXBfZG1fdGltZXJfcmVhZF9yZWcoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgcmVnKTsKK3ZvaWQgb21hcF9kbV90aW1lcl93cml0ZV9yZWcoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgcmVnLCB1MzIgdmFsdWUpOworCitzdHJ1Y3Qgb21hcF9kbV90aW1lciAqIG9tYXBfZG1fdGltZXJfcmVxdWVzdCh2b2lkKTsKK3ZvaWQgb21hcF9kbV90aW1lcl9mcmVlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7Cit2b2lkIG9tYXBfZG1fdGltZXJfc2V0X3NvdXJjZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBzb3VyY2UpOworCit2b2lkIG9tYXBfZG1fdGltZXJfc2V0X2ludF9lbmFibGUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpOwordm9pZCBvbWFwX2RtX3RpbWVyX3NldF90cmlnZ2VyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdW5zaWduZWQgaW50IHZhbHVlKTsKK3ZvaWQgb21hcF9kbV90aW1lcl9lbmFibGVfY29tcGFyZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOwordm9pZCBvbWFwX2RtX3RpbWVyX2VuYWJsZV9hdXRvcmVsb2FkKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CisKK3ZvaWQgb21hcF9kbV90aW1lcl90cmlnZ2VyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7Cit2b2lkIG9tYXBfZG1fdGltZXJfc3RhcnQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKK3ZvaWQgb21hcF9kbV90aW1lcl9zdG9wKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CisKK3ZvaWQgb21hcF9kbV90aW1lcl9zZXRfbG9hZChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCBsb2FkKTsKK3ZvaWQgb21hcF9kbV90aW1lcl9zZXRfbWF0Y2goc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgbWF0Y2gpOworCit1bnNpZ25lZCBpbnQgb21hcF9kbV90aW1lcl9yZWFkX3N0YXR1cyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOwordm9pZCBvbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCB2YWx1ZSk7CisKK3Vuc2lnbmVkIGludCBvbWFwX2RtX3RpbWVyX3JlYWRfY291bnRlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOwordm9pZCBvbWFwX2RtX3RpbWVyX3Jlc2V0X2NvdW50ZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKKworaW50IG9tYXBfZG1fdGltZXJzX2FjdGl2ZSh2b2lkKTsKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfVElNRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kc3AuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiZjRmMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZHNwLmgKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RzcC5oCisgKgorICogSGVhZGVyIGZvciBPTUFQIERTUCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFdyaXR0ZW4gYnkgVG9zaGloaXJvIEtvYmF5YXNoaSA8dG9zaGloaXJvLmtvYmF5YXNoaUBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIDIwMDUvMDYvMDE6ICBEU1AgR2F0ZXdheSB2ZXJzaW9uIDMuMworICovCisKKyNpZm5kZWYgQVNNX0FSQ0hfRFNQX0gKKyNkZWZpbmUgQVNNX0FSQ0hfRFNQX0gKKworCisvKgorICogZm9yIC9kZXYvZHNwY3RsL2N0bAorICovCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX1JFU0VUCQkJMQorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9SVU4JCQkyCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX1NFVFJTVFZFQ1QJCTMKKyNkZWZpbmUgT01BUF9EU1BfSU9DVExfQ1BVX0lETEUJCQk0CisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX01QVUlfV09SRFNXQVBfT04JCTUKKyNkZWZpbmUgT01BUF9EU1BfSU9DVExfTVBVSV9XT1JEU1dBUF9PRkYJNgorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9NUFVJX0JZVEVTV0FQX09OCQk3CisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX01QVUlfQllURVNXQVBfT0ZGCTgKKyNkZWZpbmUgT01BUF9EU1BfSU9DVExfR0JMX0lETEUJCQk5CisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX0RTUENGRwkJCTEwCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX0RTUFVOQ0ZHCQkJMTEKKyNkZWZpbmUgT01BUF9EU1BfSU9DVExfVEFTS0NOVAkJCTEyCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX1BPTEwJCQkxMworI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9SRUdNRU1SCQkJNDAKKyNkZWZpbmUgT01BUF9EU1BfSU9DVExfUkVHTUVNVwkJCTQxCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX1JFR0lPUgkJCTQyCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX1JFR0lPVwkJCTQzCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX0dFVFZBUgkJCTQ0CisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX1NFVFZBUgkJCTQ1CisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX1JVTkxFVkVMCQkJNTAKKyNkZWZpbmUgT01BUF9EU1BfSU9DVExfU1VTUEVORAkJCTUxCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX1JFU1VNRQkJCTUyCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX0ZCRU4JCQk1MworI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9GQkRJUwkJCTU0CisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX01CU0VORAkJCTk5CisKKy8qCisgKiBmb3IgdGFza2RldgorICogKGlvY3RscyBiZWxvdyBzaG91bGQgYmUgPj0gMHgxMDAwMCkKKyAqLworI2RlZmluZSBPTUFQX0RTUF9UQVNLX0lPQ1RMX0JGTFNICTB4MTAwMDAKKyNkZWZpbmUgT01BUF9EU1BfVEFTS19JT0NUTF9TRVRCU1oJMHgxMDAwMQorI2RlZmluZSBPTUFQX0RTUF9UQVNLX0lPQ1RMX0xPQ0sJMHgxMDAwMgorI2RlZmluZSBPTUFQX0RTUF9UQVNLX0lPQ1RMX1VOTE9DSwkweDEwMDAzCisjZGVmaW5lIE9NQVBfRFNQX1RBU0tfSU9DVExfR0VUTkFNRQkweDEwMDA0CisKKy8qCisgKiBmb3IgL2Rldi9kc3BjdGwvbWVtCisgKi8KKyNkZWZpbmUgT01BUF9EU1BfTUVNX0lPQ1RMX0VYTUFQCTEKKyNkZWZpbmUgT01BUF9EU1BfTUVNX0lPQ1RMX0VYVU5NQVAJMgorI2RlZmluZSBPTUFQX0RTUF9NRU1fSU9DVExfRVhNQVBfRkxVU0gJMworI2RlZmluZSBPTUFQX0RTUF9NRU1fSU9DVExfRkJFWFBPUlQJNQorI2RlZmluZSBPTUFQX0RTUF9NRU1fSU9DVExfTU1VSVRBQ0sJNworI2RlZmluZSBPTUFQX0RTUF9NRU1fSU9DVExfTU1VSU5JVAk5CisjZGVmaW5lIE9NQVBfRFNQX01FTV9JT0NUTF9LTUVNX1JFU0VSVkUJMTEKKyNkZWZpbmUgT01BUF9EU1BfTUVNX0lPQ1RMX0tNRU1fUkVMRUFTRQkxMgorCitzdHJ1Y3Qgb21hcF9kc3BfbWFwaW5mbyB7CisJdW5zaWduZWQgbG9uZyBkc3BhZHI7CisJdW5zaWduZWQgbG9uZyBzaXplOworfTsKKworLyoKKyAqIGZvciAvZGV2L2RzcGN0bC90d2NoCisgKi8KKyNkZWZpbmUgT01BUF9EU1BfVFdDSF9JT0NUTF9NS0RFVgkxCisjZGVmaW5lIE9NQVBfRFNQX1RXQ0hfSU9DVExfUk1ERVYJMgorI2RlZmluZSBPTUFQX0RTUF9UV0NIX0lPQ1RMX1RBREQJMTEKKyNkZWZpbmUgT01BUF9EU1BfVFdDSF9JT0NUTF9UREVMCTEyCisjZGVmaW5lIE9NQVBfRFNQX1RXQ0hfSU9DVExfVEtJTEwJMTMKKworI2RlZmluZSBPTUFQX0RTUF9ERVZTVEFURV9OT1RBU0sJMHgwMDAwMDAwMQorI2RlZmluZSBPTUFQX0RTUF9ERVZTVEFURV9BVFRBQ0hFRAkweDAwMDAwMDAyCisjZGVmaW5lIE9NQVBfRFNQX0RFVlNUQVRFX0dBUkJBR0UJMHgwMDAwMDAwNAorI2RlZmluZSBPTUFQX0RTUF9ERVZTVEFURV9JTlZBTElECTB4MDAwMDAwMDgKKyNkZWZpbmUgT01BUF9EU1BfREVWU1RBVEVfQUREUkVRCTB4MDAwMDAxMDAKKyNkZWZpbmUgT01BUF9EU1BfREVWU1RBVEVfREVMUkVRCTB4MDAwMDAyMDAKKyNkZWZpbmUgT01BUF9EU1BfREVWU1RBVEVfQURERkFJTAkweDAwMDAxMDAwCisjZGVmaW5lIE9NQVBfRFNQX0RFVlNUQVRFX0FERElORwkweDAwMDEwMDAwCisjZGVmaW5lIE9NQVBfRFNQX0RFVlNUQVRFX0RFTElORwkweDAwMDIwMDAwCisjZGVmaW5lIE9NQVBfRFNQX0RFVlNUQVRFX0tJTExJTkcJMHgwMDA0MDAwMAorI2RlZmluZSBPTUFQX0RTUF9ERVZTVEFURV9TVEFURV9NQVNLCTB4N2ZmZmZmZmYKKyNkZWZpbmUgT01BUF9EU1BfREVWU1RBVEVfU1RBTEUJCTB4ODAwMDAwMDAKKworc3RydWN0IG9tYXBfZHNwX3RhZGRpbmZvIHsKKwl1bnNpZ25lZCBjaGFyIG1pbm9yOworCXVuc2lnbmVkIGxvbmcgdGFza2FkcjsKK307CisjZGVmaW5lIE9NQVBfRFNQX1RBRERfQUJPUlRBRFIJMHhmZmZmZmZmZgorCisKKy8qCisgKiBlcnJvciBjYXVzZSBkZWZpbml0aW9uIChmb3IgZXJyb3IgZGV0ZWN0aW9uIGRldmljZSkKKyAqLworI2RlZmluZSBPTUFQX0RTUF9FUlJEVF9XRFQJMHgwMDAwMDAwMQorI2RlZmluZSBPTUFQX0RTUF9FUlJEVF9NTVUJMHgwMDAwMDAwMgorCisKKy8qCisgKiBtYWlsYm94IHByb3RvY29sIGRlZmluaXRpb25zCisgKi8KKworc3RydWN0IG9tYXBfZHNwX21haWxib3hfY21kIHsKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7CisJdW5zaWduZWQgc2hvcnQgZGF0YTsKK307CisKK3N0cnVjdCBvbWFwX2RzcF9yZWdpbmZvIHsKKwl1bnNpZ25lZCBzaG9ydCBhZHI7CisJdW5zaWduZWQgc2hvcnQgdmFsOworfTsKKworc3RydWN0IG9tYXBfZHNwX3ZhcmluZm8geworCXVuc2lnbmVkIGNoYXIgdmFyaWQ7CisJdW5zaWduZWQgc2hvcnQgdmFsWzBdOworfTsKKworI2RlZmluZSBPTUFQX0RTUF9NQlBST1RfUkVWSVNJT04JMHgwMDE5CisKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfV0RTTkQJMHgxMAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9XRFJFUQkweDExCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0JLU05ECTB4MjAKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfQktSRVEJMHgyMQorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9CS1lMRAkweDIzCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0JLU05EUAkweDI0CisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0JLUkVRUAkweDI1CisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1RDVEwJMHgzMAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9UQ1RMREFUQQkweDMxCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1BPTEwJMHgzMgorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9XRFQJMHg1MAkvKiB2My4zOiBvYnNvbGV0ZSAqLworI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9SVU5MRVZFTAkweDUxCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1BNCTB4NTIKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfU1VTUEVORAkweDUzCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0tGVU5DCTB4NTQKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfVENGRwkweDYwCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1RBREQJMHg2MgorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9UREVMCTB4NjMKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfVFNUT1AJMHg2NQorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9EU1BDRkcJMHg3MAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9SRUdSVwkweDcyCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0dFVFZBUgkweDc0CisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1NFVFZBUgkweDc1CisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0VSUgkweDc4CisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0RCRwkweDc5CisKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfVENUTF9USU5JVAkweDAwMDAKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfVENUTF9URU4JCTB4MDAwMQorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9UQ1RMX1RESVMJMHgwMDAyCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1RDVExfVENMUgkweDAwMDMKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfVENUTF9UQ0xSX0ZPUkNFCTB4MDAwNAorCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1JVTkxFVkVMX1VTRVIJCTB4MDEKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfUlVOTEVWRUxfU1VQRVIJCTB4MGUKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfUlVOTEVWRUxfUkVDT1ZFUlkJMHgxMAorCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1BNX0RJU0FCTEUJMHgwMAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9QTV9FTkFCTEUJMHgwMQorCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0tGVU5DX0ZCQ1RMCTB4MDAKKworI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9GQkNUTF9FTkFCTEUJMHgwMDAyCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0ZCQ1RMX0RJU0FCTEUJMHgwMDAzCisKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfVERFTF9TQUZFCTB4MDAwMAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9UREVMX0tJTEwJMHgwMDAxCisKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfRFNQQ0ZHX1JFUQkweDAwCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0RTUENGR19TWVNBRFJICTB4MjgKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfRFNQQ0ZHX1NZU0FEUkwJMHgyOQorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9EU1BDRkdfUFJPVFJFVgkweDcwCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0RTUENGR19BQk9SVAkweDc4CisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0RTUENGR19MQVNUCTB4ODAKKworI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9SRUdSV19NRU1SCTB4MDAKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfUkVHUldfTUVNVwkweDAxCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1JFR1JXX0lPUgkweDAyCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1JFR1JXX0lPVwkweDAzCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1JFR1JXX0RBVEEJMHgwNAorCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1ZBUklEX0lDUk1BU0sJMHgwMAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9WQVJJRF9MT0FESU5GTwkweDAxCisKKyNkZWZpbmUgT01BUF9EU1BfVFRZUF9BUkNWCTB4MDAwMQorI2RlZmluZSBPTUFQX0RTUF9UVFlQX0FTTkQJMHgwMDAyCisjZGVmaW5lIE9NQVBfRFNQX1RUWVBfQktNRAkweDAwMDQKKyNkZWZpbmUgT01BUF9EU1BfVFRZUF9CS0RNCTB4MDAwOAorI2RlZmluZSBPTUFQX0RTUF9UVFlQX1BWTUQJMHgwMDEwCisjZGVmaW5lIE9NQVBfRFNQX1RUWVBfUFZETQkweDAwMjAKKworI2RlZmluZSBPTUFQX0RTUF9FSURfQkFEVElECTB4MTAKKyNkZWZpbmUgT01BUF9EU1BfRUlEX0JBRFRDTgkweDExCisjZGVmaW5lIE9NQVBfRFNQX0VJRF9CQURCSUQJMHgyMAorI2RlZmluZSBPTUFQX0RTUF9FSURfQkFEQ05UCTB4MjEKKyNkZWZpbmUgT01BUF9EU1BfRUlEX05PVExPQ0tFRAkweDIyCisjZGVmaW5lIE9NQVBfRFNQX0VJRF9TVFZCVUYJMHgyMworI2RlZmluZSBPTUFQX0RTUF9FSURfQkFEQURSCTB4MjQKKyNkZWZpbmUgT01BUF9EU1BfRUlEX0JBRFRDVEwJMHgzMAorI2RlZmluZSBPTUFQX0RTUF9FSURfQkFEUEFSQU0JMHg1MAorI2RlZmluZSBPTUFQX0RTUF9FSURfRkFUQUwJMHg1OAorI2RlZmluZSBPTUFQX0RTUF9FSURfTk9NRU0JMHhjMAorI2RlZmluZSBPTUFQX0RTUF9FSURfTk9SRVMJMHhjMQorI2RlZmluZSBPTUFQX0RTUF9FSURfSVBCRlVMTAkweGMyCisjZGVmaW5lIE9NQVBfRFNQX0VJRF9XRFQJMHhkMAorI2RlZmluZSBPTUFQX0RTUF9FSURfVEFTS05PVFJEWQkweGUwCisjZGVmaW5lIE9NQVBfRFNQX0VJRF9UQVNLQlNZCTB4ZTEKKyNkZWZpbmUgT01BUF9EU1BfRUlEX1RBU0tFUlIJMHhlZgorI2RlZmluZSBPTUFQX0RTUF9FSURfQkFEQ0ZHVFlQCTB4ZjAKKyNkZWZpbmUgT01BUF9EU1BfRUlEX0RFQlVHCTB4ZjgKKyNkZWZpbmUgT01BUF9EU1BfRUlEX0JBRFNFUQkweGZlCisjZGVmaW5lIE9NQVBfRFNQX0VJRF9CQURDTUQJMHhmZgorCisjZGVmaW5lIE9NQVBfRFNQX1ROTV9MRU4JMTYKKworI2RlZmluZSBPTUFQX0RTUF9USURfRlJFRQkweGZmCisjZGVmaW5lIE9NQVBfRFNQX1RJRF9BTk9OCTB4ZmUKKworI2RlZmluZSBPTUFQX0RTUF9CSURfTlVMTAkweGZmZmYKKyNkZWZpbmUgT01BUF9EU1BfQklEX1BWVAkweGZmZmUKKworI2VuZGlmIC8qIEFTTV9BUkNIX0RTUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RzcF9jb21tb24uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZHNwX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmY2NlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RzcF9jb21tb24uaApAQCAtMCwwICsxLDM3IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kc3BfY29tbW9uLmgKKyAqCisgKiBIZWFkZXIgZm9yIE9NQVAgRFNQIHN1YnN5c3RlbSBjb250cm9sCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IFRvc2hpaGlybyBLb2JheWFzaGkgPHRvc2hpaGlyby5rb2JheWFzaGlAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAyMDA1LzA2LzAzOiAgRFNQIEdhdGV3YXkgdmVyc2lvbiAzLjMKKyAqLworCisjaWZuZGVmIEFTTV9BUkNIX0RTUF9DT01NT05fSAorI2RlZmluZSBBU01fQVJDSF9EU1BfQ09NTU9OX0gKKwordm9pZCBvbWFwX2RzcF9wbV9zdXNwZW5kKHZvaWQpOwordm9pZCBvbWFwX2RzcF9wbV9yZXN1bWUodm9pZCk7Cit2b2lkIG9tYXBfZHNwX3JlcXVlc3RfbXB1aSh2b2lkKTsKK3ZvaWQgb21hcF9kc3BfcmVsZWFzZV9tcHVpKHZvaWQpOworaW50IG9tYXBfZHNwX3JlcXVlc3RfbWVtKHZvaWQpOworaW50IG9tYXBfZHNwX3JlbGVhc2VfbWVtKHZvaWQpOworCisjZW5kaWYgLyogQVNNX0FSQ0hfRFNQX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2VudHJ5LW1hY3JvLlMgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2VudHJ5LW1hY3JvLlMKaW5kZXggNTdiMTI2OC4uMGQyOWI5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9lbnRyeS1tYWNyby5TCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZW50cnktbWFjcm8uUwpAQCAtOCw2ICs4LDggQEAKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwogCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMSkKKwogIAkJLm1hY3JvCWRpc2FibGVfZmlxCiAJCS5lbmRtCiAKQEAgLTMwLDMgKzMyLDI5IEBACiAxNTEwOgogCQkuZW5kbQogCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNFhYKQorCisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDI0eHguaD4KKworCQkubWFjcm8JZGlzYWJsZV9maXEKKwkJLmVuZG0KKworCQkubWFjcm8JZ2V0X2lycW5yX2FuZF9iYXNlLCBpcnFuciwgaXJxc3RhdCwgYmFzZSwgdG1wCisJCWxkcglcYmFzZSwgPVZBX0lDX0JBU0UKKwkJbGRyCVxpcnFuciwgW1xiYXNlLCAjMHg5OF0gLyogSVJRIHBlbmRpbmcgcmVnIDEgKi8KKwkJY21wCVxpcnFuciwgIzB4MAorCQlibmUJMjIyMmYKKwkJbGRyCVxpcnFuciwgW1xiYXNlLCAjMHhiOF0gLyogSVJRIHBlbmRpbmcgcmVnIDIgKi8KKwkJY21wCVxpcnFuciwgIzB4MAorCQlibmUJMjIyMmYKKwkJbGRyCVxpcnFuciwgW1xiYXNlLCAjMHhkOF0gLyogSVJRIHBlbmRpbmcgcmVnIDMgKi8KKwkJY21wCVxpcnFuciwgIzB4MAorMjIyMjoKKwkJbGRybmUJXGlycW5yLCBbXGJhc2UsICNJUlFfU0lSX0lSUV0KKworCQkuZW5kbQorCisJCS5tYWNybwlpcnFfcHJpb190YWJsZQorCQkuZW5kbQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZ3Bpby5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ncGlvLmgKaW5kZXggZmFkMmZjOS4uNzRjYjJiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ncGlvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ncGlvLmgKQEAgLTMsNyArMyw3IEBACiAgKgogICogT01BUCBHUElPIGhhbmRsaW5nIGRlZmluZXMgYW5kIGZ1bmN0aW9ucwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMyBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgTm9raWEgQ29ycG9yYXRpb24KICAqCiAgKiBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAgKgpAQCAtMzAsNyArMzAsMjMgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNkZWZpbmUgT01BUF9NUFVJT19CQVNFCQkJMHhmZmZiNTAwMAorI2RlZmluZSBPTUFQX01QVUlPX0JBU0UJCQkodm9pZCBfX2lvbWVtICopMHhmZmZiNTAwMAorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAorI2RlZmluZSBPTUFQX01QVUlPX0lOUFVUX0xBVENICQkweDAwCisjZGVmaW5lIE9NQVBfTVBVSU9fT1VUUFVUCQkweDAyCisjZGVmaW5lIE9NQVBfTVBVSU9fSU9fQ05UTAkJMHgwNAorI2RlZmluZSBPTUFQX01QVUlPX0tCUl9MQVRDSAkJMHgwOAorI2RlZmluZSBPTUFQX01QVUlPX0tCQwkJCTB4MGEKKyNkZWZpbmUgT01BUF9NUFVJT19HUElPX0VWRU5UX01PREUJMHgwYworI2RlZmluZSBPTUFQX01QVUlPX0dQSU9fSU5UX0VER0UJMHgwZQorI2RlZmluZSBPTUFQX01QVUlPX0tCRF9JTlQJCTB4MTAKKyNkZWZpbmUgT01BUF9NUFVJT19HUElPX0lOVAkJMHgxMgorI2RlZmluZSBPTUFQX01QVUlPX0tCRF9NQVNLSVQJCTB4MTQKKyNkZWZpbmUgT01BUF9NUFVJT19HUElPX01BU0tJVAkJMHgxNgorI2RlZmluZSBPTUFQX01QVUlPX0dQSU9fREVCT1VOQ0lORwkweDE4CisjZGVmaW5lIE9NQVBfTVBVSU9fTEFUQ0gJCTB4MWEKKyNlbHNlCiAjZGVmaW5lIE9NQVBfTVBVSU9fSU5QVVRfTEFUQ0gJCTB4MDAKICNkZWZpbmUgT01BUF9NUFVJT19PVVRQVVQJCTB4MDQKICNkZWZpbmUgT01BUF9NUFVJT19JT19DTlRMCQkweDA4CkBAIC00NCw2ICs2MCw3IEBACiAjZGVmaW5lIE9NQVBfTVBVSU9fR1BJT19NQVNLSVQJCTB4MmMKICNkZWZpbmUgT01BUF9NUFVJT19HUElPX0RFQk9VTkNJTkcJMHgzMAogI2RlZmluZSBPTUFQX01QVUlPX0xBVENICQkweDM0CisjZW5kaWYKIAogI2RlZmluZSBPTUFQX01QVUlPKG5yKQkJKE9NQVBfTUFYX0dQSU9fTElORVMgKyAobnIpKQogI2RlZmluZSBPTUFQX0dQSU9fSVNfTVBVSU8obnIpCSgobnIpID49IE9NQVBfTUFYX0dQSU9fTElORVMpCkBAIC01MiwxOCArNjksMTEgQEAKIAkJCQkgSUhfTVBVSU9fQkFTRSArICgobnIpICYgMHgwZikgOiBcCiAJCQkJIElIX0dQSU9fQkFTRSArICgobnIpICYgMHgzZikpCiAKLS8qIEZvciBFREdFQ1RSTCAqLwotI2RlZmluZSBPTUFQX0dQSU9fTk9fRURHRQkgIDB4MDAKLSNkZWZpbmUgT01BUF9HUElPX0ZBTExJTkdfRURHRQkgIDB4MDEKLSNkZWZpbmUgT01BUF9HUElPX1JJU0lOR19FREdFCSAgMHgwMgotI2RlZmluZSBPTUFQX0dQSU9fQk9USF9FREdFUwkgIDB4MDMKLQogZXh0ZXJuIGludCBvbWFwX2dwaW9faW5pdCh2b2lkKTsJLyogQ2FsbCBmcm9tIGJvYXJkIGluaXQgb25seSAqLwogZXh0ZXJuIGludCBvbWFwX3JlcXVlc3RfZ3BpbyhpbnQgZ3Bpbyk7CiBleHRlcm4gdm9pZCBvbWFwX2ZyZWVfZ3BpbyhpbnQgZ3Bpbyk7CiBleHRlcm4gdm9pZCBvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihpbnQgZ3BpbywgaW50IGlzX2lucHV0KTsKIGV4dGVybiB2b2lkIG9tYXBfc2V0X2dwaW9fZGF0YW91dChpbnQgZ3BpbywgaW50IGVuYWJsZSk7CiBleHRlcm4gaW50IG9tYXBfZ2V0X2dwaW9fZGF0YWluKGludCBncGlvKTsKLWV4dGVybiB2b2lkIG9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKGludCBncGlvLCBpbnQgZWRnZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9oYXJkd2FyZS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9oYXJkd2FyZS5oCmluZGV4IDQ4MjU4YzcuLjYwMjAxZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaGFyZHdhcmUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2hhcmR3YXJlLmgKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KICNlbmRpZgogI2luY2x1ZGUgPGFzbS9hcmNoL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc2VyaWFsLmg+CiAKIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTg5LDExICs5MCwxMiBAQAogLyogRFBMTCBjb250cm9sIHJlZ2lzdGVycyAqLwogI2RlZmluZSBEUExMX0NUTAkJKDB4ZmZmZWNmMDApCiAKLS8qIERTUCBjbG9jayBjb250cm9sICovCisvKiBEU1AgY2xvY2sgY29udHJvbC4gTXVzdCB1c2UgX19yYXdfcmVhZHcoKSBhbmQgX19yYXdfd3JpdGV3KCkgd2l0aCB0aGVzZSAqLwogI2RlZmluZSBEU1BfQ09ORklHX1JFR19CQVNFICAgICAoMHhlMTAwODAwMCkKICNkZWZpbmUgRFNQX0NLQ1RMCQkoRFNQX0NPTkZJR19SRUdfQkFTRSArIDB4MCkKICNkZWZpbmUgRFNQX0lETEVDVDEJCShEU1BfQ09ORklHX1JFR19CQVNFICsgMHg0KQogI2RlZmluZSBEU1BfSURMRUNUMgkJKERTUF9DT05GSUdfUkVHX0JBU0UgKyAweDgpCisjZGVmaW5lIERTUF9SU1RDVDIJCShEU1BfQ09ORklHX1JFR19CQVNFICsgMHgxNCkKIAogLyoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTQyLDYgKzE0NCwxMyBAQAogICogSW50ZXJydXB0cwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQorCisvKgorICogWFhYOiBUaGVzZSBwcm9iYWJseSB3YW50IHRvIGJlIG1vdmVkIHRvIGFyY2gvYXJtL21hY2gtb21hcC9vbWFwMS9pcnEuYworICogb3Igc29tZXRoaW5nIHNpbWlsYXIuLiAtLSBQRk0uCisgKi8KKwogI2RlZmluZSBPTUFQX0lIMV9CQVNFCQkweGZmZmVjYjAwCiAjZGVmaW5lIE9NQVBfSUgyX0JBU0UJCTB4ZmZmZTAwMDAKIApAQCAtMTcwLDYgKzE3OSw4IEBACiAjZGVmaW5lIElSUV9JTFIwX1JFR19PRkZTRVQJMHgxYwogI2RlZmluZSBJUlFfR01SX1JFR19PRkZTRVQJMHhhMAogCisjZW5kaWYKKwogLyoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFN5c3RlbSBjb250cm9sIHJlZ2lzdGVycwpAQCAtMjYwLDMyICsyNzEsMTcgQEAKIAogLyoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogU2VyaWFsIHBvcnRzCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2RlZmluZSBPTUFQX1VBUlQxX0JBU0UJCSh1bnNpZ25lZCBjaGFyICopMHhmZmZiMDAwMAotI2RlZmluZSBPTUFQX1VBUlQyX0JBU0UJCSh1bnNpZ25lZCBjaGFyICopMHhmZmZiMDgwMAotI2RlZmluZSBPTUFQX1VBUlQzX0JBU0UJCSh1bnNpZ25lZCBjaGFyICopMHhmZmZiOTgwMAotI2RlZmluZSBPTUFQX01BWF9OUl9QT1JUUwkzCi0jZGVmaW5lIE9NQVAxNTEwX0JBU0VfQkFVRAkoMTIwMDAwMDAvMTYpCi0jZGVmaW5lIE9NQVAxNlhYX0JBU0VfQkFVRAkoNDgwMDAwMDAvMTYpCi0KLSNkZWZpbmUgaXNfb21hcF9wb3J0KHApCSh7aW50IF9fcmV0ID0gMDsJCQlcCi0JCQlpZiAocCA9PSBJT19BRERSRVNTKE9NQVBfVUFSVDFfQkFTRSkgfHwJXAotCQkJICAgIHAgPT0gSU9fQUREUkVTUyhPTUFQX1VBUlQyX0JBU0UpIHx8CVwKLQkJCSAgICBwID09IElPX0FERFJFU1MoT01BUF9VQVJUM19CQVNFKSkJXAotCQkJCV9fcmV0ID0gMTsJCQlcCi0JCQlfX3JldDsJCQkJCVwKLQkJCX0pCi0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFByb2Nlc3NvciBzcGVjaWZpYyBkZWZpbmVzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCiAjaW5jbHVkZSAib21hcDczMC5oIgogI2luY2x1ZGUgIm9tYXAxNTEwLmgiCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorI2luY2x1ZGUgIm9tYXAyNHh4LmgiCisjZW5kaWYKKwogI2luY2x1ZGUgIm9tYXAxNnh4LmgiCiAKIC8qCkBAIC0zMTIsNyArMzA4LDYgQEAKIAogI2lmZGVmIENPTkZJR19NQUNIX09NQVBfSDQKICNpbmNsdWRlICJib2FyZC1oNC5oIgotI2Vycm9yICJTdXBwb3J0IGZvciBINCBib2FyZCBub3QgeWV0IGltcGxlbWVudGVkLiIKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01BQ0hfT01BUF9PU0sKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaW8uaAppbmRleCAxYzhjOWZjLi4xMWZiZjYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pby5oCkBAIC00OSwxNiArNDksMjQgQEAKICAqIEkvTyBtYXBwaW5nCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLSNkZWZpbmUgSU9fUEhZUwkJCTB4RkZGQjAwMDAKLSNkZWZpbmUgSU9fT0ZGU0VUCQkweDAxMDAwMDAwCS8qIFZpcnR1YWwgSU8gPSAweGZlZmIwMDAwICovCi0jZGVmaW5lIElPX1ZJUlQJCQkoSU9fUEhZUyAtIElPX09GRlNFVCkKLSNkZWZpbmUgSU9fU0laRQkJCTB4NDAwMDAKLSNkZWZpbmUgSU9fQUREUkVTUyh4KQkJKCh4KSAtIElPX09GRlNFVCkKIAotI2RlZmluZSBQQ0lPX0JBU0UJCTAKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxKQorI2RlZmluZSBJT19QSFlTCQkweEZGRkIwMDAwCisjZGVmaW5lIElPX09GRlNFVCAgICAgIC0weDAxMDAwMDAwCS8qIFZpcnR1YWwgSU8gPSAweGZlZmIwMDAwICovCisjZGVmaW5lIElPX1NJWkUJCTB4NDAwMDAKIAotI2RlZmluZSBpb19wMnYoeCkgICAgICAgICAgICAgICAoKHgpIC0gSU9fT0ZGU0VUKQotI2RlZmluZSBpb192MnAoeCkgICAgICAgICAgICAgICAoKHgpICsgSU9fT0ZGU0VUKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMikKKyNkZWZpbmUgSU9fUEhZUwkJMHg0ODAwMDAwMAkvKiBMNCBwZXJpcGhlcmFsczsgb3RoZXIgc3R1ZmYgaGFzIHRvIGJlIG1hcHBlZCAqCisJCQkJCSAqIG1hbnVhbGx5LiAqLworI2RlZmluZSBJT19PRkZTRVQJMHg5MDAwMDAwMAkvKiBWaXJ0dWFsIElPID0gMHhkODAwMDAwMCAqLworI2RlZmluZSBJT19TSVpFCQkweDA4MDAwMDAwCisjZW5kaWYKKworI2RlZmluZSBJT19WSVJUCQkoSU9fUEhZUyArIElPX09GRlNFVCkKKyNkZWZpbmUgSU9fQUREUkVTUyh4KQkoKHgpICsgSU9fT0ZGU0VUKQorI2RlZmluZSBQQ0lPX0JBU0UJMAorI2RlZmluZSBpb19wMnYoeCkJKCh4KSArIElPX09GRlNFVCkKKyNkZWZpbmUgaW9fdjJwKHgpCSgoeCkgLSBJT19PRkZTRVQpCiAKICNpZm5kZWYgX19BU1NFTUJMRVJfXwogCkBAIC05Niw2ICsxMDQsOCBAQAogCQkJCQktPm9mZnNldFsoKHZhZGRyKSY0MDk1KT4+Ml0KICNkZWZpbmUgX19SRUczMihwYWRkcikJCV9fUkVHVjMyKGlvX3AydihwYWRkcikpCiAKK2V4dGVybiB2b2lkIG9tYXBfbWFwX2NvbW1vbl9pbyh2b2lkKTsKKwogI2Vsc2UKIAogI2RlZmluZSBfX1JFRzgocGFkZHIpCQlpb19wMnYocGFkZHIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2lycXMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaXJxcy5oCmluZGV4IDBkMDVhN2MuLjc0ZTEwOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaXJxcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaXJxcy5oCkBAIC0xMzUsNyArMTM1LDYgQEAKIC8qCiAgKiBPTUFQLTE1MTAgc3BlY2lmaWMgSVJRIG51bWJlcnMgZm9yIGludGVycnVwdCBoYW5kbGVyIDIKICAqLwotI2RlZmluZSBJTlRfMTUxMF9PU18zMmtIel9USU1FUiAoMjIgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzE1MTBfQ09NX1NQSV9STwkoMzEgKyBJSDJfQkFTRSkKIAogLyoKQEAgLTIzMiw2ICsyMzEsMTEgQEAKICNkZWZpbmUgSU5UXzczMF9ETUFfQ0gxNQkoNjIgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzczMF9OQU5ECQkoNjMgKyBJSDJfQkFTRSkKIAorI2RlZmluZSBJTlRfMjRYWF9HUElPX0JBTksxCTI5CisjZGVmaW5lIElOVF8yNFhYX0dQSU9fQkFOSzIJMzAKKyNkZWZpbmUgSU5UXzI0WFhfR1BJT19CQU5LMwkzMQorI2RlZmluZSBJTlRfMjRYWF9HUElPX0JBTks0CTMyCisKIC8qIE1heC4gMTI4IGxldmVsIDIgSVJRcyAoT01BUDE2MTApLCAxOTIgR1BJT3MgKE9NQVA3MzApIGFuZAogICogMTYgTVBVSU8gbGluZXMgKi8KICNkZWZpbmUgT01BUF9NQVhfR1BJT19MSU5FUwkxOTIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbWVtb3J5LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL21lbW9yeS5oCmluZGV4IGY2YjU3ZGQuLjg0ZjgxZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbWVtb3J5LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9tZW1vcnkuaApAQCAtMzYsMTIgKzM2LDExIEBACiAvKgogICogUGh5c2ljYWwgRFJBTSBvZmZzZXQuCiAgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxKQogI2RlZmluZSBQSFlTX09GRlNFVAkJKDB4MTAwMDAwMDBVTCkKLQotLyoKLSAqIE9NQVAtMTUxMCBMb2NhbCBCdXMgYWRkcmVzcyBvZmZzZXQKLSAqLwotI2RlZmluZSBPTUFQMTUxMF9MQl9PRkZTRVQJKDB4MzAwMDAwMDBVTCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDIpCisjZGVmaW5lIFBIWVNfT0ZGU0VUCQkoMHg4MDAwMDAwMFVMKQorI2VuZGlmCiAKIC8qCiAgKiBDb252ZXJzaW9uIGJldHdlZW4gU0RSQU0gYW5kIGZha2UgUENJIGJ1cywgdXNlZCBieSBVU0IKQEAgLTY0LDYgKzYzLDExIEBACiAgKi8KICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAogCisvKgorICogT01BUC0xNTEwIExvY2FsIEJ1cyBhZGRyZXNzIG9mZnNldAorICovCisjZGVmaW5lIE9NQVAxNTEwX0xCX09GRlNFVAkoMHgzMDAwMDAwMFVMKQorCiAjZGVmaW5lIHZpcnRfdG9fbGJ1cyh4KQkJKCh4KSAtIFBBR0VfT0ZGU0VUICsgT01BUDE1MTBfTEJfT0ZGU0VUKQogI2RlZmluZSBsYnVzX3RvX3ZpcnQoeCkJCSgoeCkgLSBPTUFQMTUxMF9MQl9PRkZTRVQgKyBQQUdFX09GRlNFVCkKICNkZWZpbmUgaXNfbGJ1c19kZXZpY2UoZGV2KQkoY3B1X2lzX29tYXAxNTEwKCkgJiYgZGV2ICYmIChzdHJuY21wKGRldi0+YnVzX2lkLCAib2hjaSIsIDQpID09IDApKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9tdGQteGlwLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL210ZC14aXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzNhMjg1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9tdGQteGlwLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIE1URCBwcmltaXRpdmVzIGZvciBYSVAgc3VwcG9ydC4gQXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZ1bmN0aW9ucy4KKyAqCisgKiBEbyBub3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuIEl0J3MgaW5jbHVkZWQgZnJvbSBsaW51eC9tdGQveGlwLmgKKyAqCisgKiBBdXRob3I6IFZsYWRpbWlyIEJhcmlub3YgPHZiYXJpbm92QHJ1Lm12aXN0YS5jb20+CisgKgorICogKGMpIDIwMDUgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcworICogbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yCisgKiBpbXBsaWVkLgorICovCisKKyNpZm5kZWYgX19BUkNIX09NQVBfTVREX1hJUF9IX18KKyNkZWZpbmUgX19BUkNIX09NQVBfTVREX1hJUF9IX18KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2RlZmluZSBPTUFQX01QVV9USU1FUl9CQVNFCSgweGZmZmVjNTAwKQorI2RlZmluZSBPTUFQX01QVV9USU1FUl9PRkZTRVQJMHgxMDAKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBjbnRsOwkJCS8qIENOVExfVElNRVIsIFIvVyAqLworCXUzMiBsb2FkX3RpbTsJCQkvKiBMT0FEX1RJTSwgICBXICovCisJdTMyIHJlYWRfdGltOwkJCS8qIFJFQURfVElNLCAgIFIgKi8KK30geGlwX29tYXBfbXB1X3RpbWVyX3JlZ3NfdDsKKworI2RlZmluZSB4aXBfb21hcF9tcHVfdGltZXJfYmFzZShuKQkJCQkJXAorKCh2b2xhdGlsZSB4aXBfb21hcF9tcHVfdGltZXJfcmVnc190KilJT19BRERSRVNTKE9NQVBfTVBVX1RJTUVSX0JBU0UgKwlcCisJKG4pKk9NQVBfTVBVX1RJTUVSX09GRlNFVCkpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB4aXBfb21hcF9tcHVfdGltZXJfcmVhZChpbnQgbnIpCit7CisJdm9sYXRpbGUgeGlwX29tYXBfbXB1X3RpbWVyX3JlZ3NfdCogdGltZXIgPSB4aXBfb21hcF9tcHVfdGltZXJfYmFzZShucik7CisJcmV0dXJuIHRpbWVyLT5yZWFkX3RpbTsKK30KKworI2RlZmluZSB4aXBfaXJxcGVuZGluZygpCVwKKwkob21hcF9yZWFkbChPTUFQX0lIMV9JVFIpICYgfm9tYXBfcmVhZGwoT01BUF9JSDFfTUlSKSkKKyNkZWZpbmUgeGlwX2N1cnJ0aW1lKCkJCSh+eGlwX29tYXBfbXB1X3RpbWVyX3JlYWQoMCkpCisKKy8qCisgKiBJdCdzIHBlcm1pdHRlZCB0byBkbyBhcHByb3htYXRpb24gZm9yIHhpcF9lbGFwc2VkX3NpbmNlIG1hY3JvCisgKiAoc2VlIGxpbnV4L210ZC94aXAuaCkKKyAqLworCisjaWZkZWYgQ09ORklHX01BQ0hfT01BUF9QRVJTRVVTMgorI2RlZmluZSB4aXBfZWxhcHNlZF9zaW5jZSh4KQkoc2lnbmVkKSgofnhpcF9vbWFwX21wdV90aW1lcl9yZWFkKDApIC0gKHgpKSAvIDcpCisjZWxzZQorI2RlZmluZSB4aXBfZWxhcHNlZF9zaW5jZSh4KQkoc2lnbmVkKSgofnhpcF9vbWFwX21wdV90aW1lcl9yZWFkKDApIC0gKHgpKSAvIDYpCisjZW5kaWYKKworLyoKKyAqIHhpcF9jcHVfaWRsZSgpIGlzIHVzZWQgd2hlbiB3YWl0aW5nIGZvciBhIGRlbGF5IGVxdWFsIG9yIGxhcmdlciB0aGFuCisgKiB0aGUgc3lzdGVtIHRpbWVyIHRpY2sgcGVyaW9kLiAgVGhpcyBzaG91bGQgcHV0IHRoZSBDUFUgaW50byBpZGxlIG1vZGUKKyAqIHRvIHNhdmUgcG93ZXIgYW5kIHRvIGJlIHdva2VuIHVwIG9ubHkgd2hlbiBzb21lIGludGVycnVwdHMgYXJlIHBlbmRpbmcuCisgKiBBcyBhYm92ZSwgdGhpcyBzaG91bGQgbm90IHJlbHkgdXBvbiBzdGFuZGFyZCBrZXJuZWwgY29kZS4KKyAqLworCisjZGVmaW5lIHhpcF9jcHVfaWRsZSgpICBhc20gdm9sYXRpbGUgKCJtY3IgcDE1LCAwLCAlMCwgYzcsIGMwLCA0IiA6OiAiciIgKDEpKQorCisjZW5kaWYgLyogX19BUkNIX09NQVBfTVREX1hJUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbXV4LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL211eC5oCmluZGV4IDViZDNmMDAuLjFiMWFkNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbXV4LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9tdXguaApAQCAtMTg1LDYgKzE4NSw3IEBACiAKIAkvKiBNUFVJTyAqLwogCU1QVUlPMiwKKwlOMTVfMTYxMF9NUFVJTzIsCiAJTVBVSU80LAogCU1QVUlPNSwKIAlUMjBfMTYxMF9NUFVJTzUsCkBAIC0yMTAsNiArMjExLDcgQEAKIAogCS8qIE1pc2MgYmFsbG91dHMgKi8KIAlCQUxMT1VUX1Y4X0FSTUlPMywKKwlOMjBfSERRLAogCiAJLyogT01BUC0xNjEwIE1NQzIgKi8KIAlXOF8xNjEwX01NQzJfREFUMCwKQEAgLTIzNSw2ICsyMzcsNyBAQAogCVAyMF8xNjEwX0dQSU80LAogCVY5XzE2MTBfR1BJTzcsCiAJVzhfMTYxMF9HUElPOSwKKwlOMjBfMTYxMF9HUElPMTEsCiAJTjE5XzE2MTBfR1BJTzEzLAogCVAxMF8xNjEwX0dQSU8yMiwKIAlWNV8xNjEwX0dQSU8yNCwKQEAgLTI1MCw3ICsyNTMsNyBAQAogCVUxOF8xNjEwX1VXSVJFX1NESSwKIAlXMjFfMTYxMF9VV0lSRV9TRE8sCiAJTjE0XzE2MTBfVVdJUkVfQ1MwLAotCVAxNV8xNjEwX1VXSVJFX0NTMCwKKwlQMTVfMTYxMF9VV0lSRV9DUzMsCiAJTjE1XzE2MTBfVVdJUkVfQ1MxLAogCiAJLyogT01BUC0xNjEwIEZsYXNoICovCkBAIC00MTEsNyArNDE0LDggQEAKIE1VWF9DRkcoIlcxNV8xNzEwX0dQSU80MCIsICAgICAgIDksICAgMjcsICAgIDcsICAgMiwgICA1LCAgIDEsICAgIDIsICAgICAxLCAgMSkKIAogLyogTVBVSU8gKi8KLU1VWF9DRkcoIk1QVUlPMiIsCQkgNywgICAxOCwgICAgMCwJICAxLCAgIDEsICAgMSwJIE5BLAkgMCwgIDEpCitNVVhfQ0ZHKCJNUFVJTzIiLAkJIDcsICAgMTgsICAgIDAsCSAgMSwgIDE0LCAgIDEsCSBOQSwJIDAsICAxKQorTVVYX0NGRygiTjE1XzE2MTBfTVBVSU8yIiwJIDcsICAgMTgsICAgIDAsCSAgMSwgIDE0LCAgIDEsCSAgMSwJIDAsICAxKQogTVVYX0NGRygiTVBVSU80IiwJCSA3LCAgIDE1LCAgICAwLAkgIDEsICAxMywgICAxLAkgTkEsCSAwLCAgMSkKIE1VWF9DRkcoIk1QVUlPNSIsCQkgNywgICAxMiwgICAgMCwJICAxLCAgMTIsICAgMSwJIE5BLAkgMCwgIDEpCiAKQEAgLTQzOCw2ICs0NDIsNyBAQAogCiAvKiBNaXNjIGJhbGxvdXRzICovCiBNVVhfQ0ZHKCJCQUxMT1VUX1Y4X0FSTUlPMyIsCSBCLCAgIDE4LCAgICAwLAkgIDIsICAyNSwgICAxLAkgTkEsCSAwLCAgMSkKK01VWF9DRkcoIk4yMF9IRFEiLAkgICAgICAgNiwgICAxOCwgICAgMSwgICAxLCAgIDQsICAgMCwgICAgMSwgICAgIDQsICAwKQogCiAvKiBPTUFQLTE2MTAgTU1DMiAqLwogTVVYX0NGRygiVzhfMTYxMF9NTUMyX0RBVDAiLAkgQiwgICAyMSwgICAgNiwJICAyLCAgMjMsICAgMSwJICAyLAkgMSwgIDEpCkBAIC00NjMsNiArNDY4LDcgQEAKIE1VWF9DRkcoIlAyMF8xNjEwX0dQSU80IiwJIDYsICAgMjcsICAgIDAsCSAgMSwgICA3LCAgIDAsCSAgMSwJIDEsICAxKQogTVVYX0NGRygiVjlfMTYxMF9HUElPNyIsCSBCLCAgIDEyLCAgICAxLAkgIDIsICAyMCwgICAwLAkgIDIsCSAxLCAgMSkKIE1VWF9DRkcoIlc4XzE2MTBfR1BJTzkiLAkgQiwgICAyMSwgICAgMCwJICAyLCAgMjMsICAgMCwJICAyLAkgMSwgIDEpCitNVVhfQ0ZHKCJOMjBfMTYxMF9HUElPMTEiLCAgICAgICA2LCAgIDE4LCAgICAwLCAgIDEsICAgNCwgICAwLCAgICAxLCAgICAgMSwgIDEpCiBNVVhfQ0ZHKCJOMTlfMTYxMF9HUElPMTMiLAkgNiwgICAxMiwgICAgMCwJICAxLCAgIDIsICAgMCwJICAxLAkgMSwgIDEpCiBNVVhfQ0ZHKCJQMTBfMTYxMF9HUElPMjIiLAkgQywgICAgMCwgICAgNywJICAyLCAgMjYsICAgMCwJICAyLAkgMSwgIDEpCiBNVVhfQ0ZHKCJWNV8xNjEwX0dQSU8yNCIsCSBCLCAgIDE1LCAgICA3LAkgIDIsICAyMSwgICAwLAkgIDIsCSAxLCAgMSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDE1MTAuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDE1MTAuaAppbmRleCBmNDkxYTQ4Li5mMDg2YTM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXAxNTEwLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9vbWFwMTUxMC5oCkBAIC0zNiwxMCArMzYsNiBAQAogCiAvKiBTeW50YXg6IFhYX0JBU0UgPSBWaXJ0dWFsIGJhc2UgYWRkcmVzcywgWFhfU1RBUlQgPSBQaHlzaWNhbCBiYXNlIGFkZHJlc3MgKi8KIAotI2RlZmluZSBPTUFQMTUxMF9TUkFNX0JBU0UJMHhEMDAwMDAwMAotI2RlZmluZSBPTUFQMTUxMF9TUkFNX1NJWkUJKFNaXzEyOEsgKyBTWl82NEspCi0jZGVmaW5lIE9NQVAxNTEwX1NSQU1fU1RBUlQJMHgyMDAwMDAwMAotCiAjZGVmaW5lIE9NQVAxNTEwX0RTUF9CQVNFCTB4RTAwMDAwMDAKICNkZWZpbmUgT01BUDE1MTBfRFNQX1NJWkUJMHgyODAwMAogI2RlZmluZSBPTUFQMTUxMF9EU1BfU1RBUlQJMHhFMDAwMDAwMApAQCAtNDgsMTQgKzQ0LDUgQEAKICNkZWZpbmUgT01BUDE1MTBfRFNQUkVHX1NJWkUJU1pfMTI4SwogI2RlZmluZSBPTUFQMTUxMF9EU1BSRUdfU1RBUlQJMHhFMTAwMDAwMAogCi0vKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTWVtb3J5IHVzZWQgYnkgcG93ZXIgbWFuYWdlbWVudAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNkZWZpbmUgT01BUDE1MTBfU1JBTV9JRExFX1NVU1BFTkQJKE9NQVAxNTEwX1NSQU1fQkFTRSArIE9NQVAxNTEwX1NSQU1fU0laRSAtIDB4MjAwKQotI2RlZmluZSBPTUFQMTUxMF9TUkFNX0FQSV9TVVNQRU5ECShPTUFQMTUxMF9TUkFNX0lETEVfU1VTUEVORCArIDB4MTAwKQotCiAjZW5kaWYgLyogIF9fQVNNX0FSQ0hfT01BUDE1MTBfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXAxNnh4LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXAxNnh4LmgKaW5kZXggMzhhOWI5NS4uZjBjN2YwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9vbWFwMTZ4eC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDE2eHguaApAQCAtMzYsMTEgKzM2LDYgQEAKIAogLyogU3ludGF4OiBYWF9CQVNFID0gVmlydHVhbCBiYXNlIGFkZHJlc3MsIFhYX1NUQVJUID0gUGh5c2ljYWwgYmFzZSBhZGRyZXNzICovCiAKLSNkZWZpbmUgT01BUDE2WFhfU1JBTV9CQVNFCTB4RDAwMDAwMDAKLSNkZWZpbmUgT01BUDE2MTBfU1JBTV9TSVpFCShTWl8xNkspCi0jZGVmaW5lIE9NQVA1OTEyX1NSQU1fU0laRQkweDNFODAwCi0jZGVmaW5lIE9NQVAxNlhYX1NSQU1fU1RBUlQJMHgyMDAwMDAwMAotCiAjZGVmaW5lIE9NQVAxNlhYX0RTUF9CQVNFCTB4RTAwMDAwMDAKICNkZWZpbmUgT01BUDE2WFhfRFNQX1NJWkUJMHgyODAwMAogI2RlZmluZSBPTUFQMTZYWF9EU1BfU1RBUlQJMHhFMDAwMDAwMApAQCAtNTAsMTcgKzQ1LDYgQEAKICNkZWZpbmUgT01BUDE2WFhfRFNQUkVHX1NUQVJUCTB4RTEwMDAwMDAKIAogLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE1lbW9yeSB1c2VkIGJ5IHBvd2VyIG1hbmFnZW1lbnQKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jZGVmaW5lIE9NQVAxNjEwX1NSQU1fSURMRV9TVVNQRU5ECShPTUFQMTZYWF9TUkFNX0JBU0UgKyBPTUFQMTYxMF9TUkFNX1NJWkUgLSAweDIwMCkKLSNkZWZpbmUgT01BUDE2MTBfU1JBTV9BUElfU1VTUEVORAkoT01BUDE2MTBfU1JBTV9JRExFX1NVU1BFTkQgKyAweDEwMCkKLSNkZWZpbmUgT01BUDU5MTJfU1JBTV9JRExFX1NVU1BFTkQJKE9NQVAxNlhYX1NSQU1fQkFTRSArIE9NQVA1OTEyX1NSQU1fU0laRSAtIDB4MjAwKQotI2RlZmluZSBPTUFQNTkxMl9TUkFNX0FQSV9TVVNQRU5ECShPTUFQNTkxMl9TUkFNX0lETEVfU1VTUEVORCArIDB4MTAwKQotCi0vKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJbnRlcnJ1cHRzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDI0eHguaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDI0eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTEwNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9vbWFwMjR4eC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX19BU01fQVJDSF9PTUFQMjRYWF9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfT01BUDI0WFhfSAorCisjZGVmaW5lIE9NQVAyNFhYX0w0X0lPX0JBU0UJMHg0ODAwMDAwMAorCisvKiBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworI2RlZmluZSBPTUFQMjRYWF9JQ19CQVNFCShPTUFQMjRYWF9MNF9JT19CQVNFICsgMHhmZTAwMCkKKyNkZWZpbmUgVkFfSUNfQkFTRQkJSU9fQUREUkVTUyhPTUFQMjRYWF9JQ19CQVNFKQorCisjZGVmaW5lIE9NQVAyNFhYX0lWQV9JTlRDX0JBU0UJMHg0MDAwMDAwMAorCisjZGVmaW5lIElSUV9TSVJfSVJRCQkweDAwNDAKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfT01BUDI0WFhfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXA3MzAuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDczMC5oCmluZGV4IDU5OWFiMDAuLjc1NWI2NGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDczMC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDczMC5oCkBAIC0zNiwxMCArMzYsNiBAQAogCiAvKiBTeW50YXg6IFhYX0JBU0UgPSBWaXJ0dWFsIGJhc2UgYWRkcmVzcywgWFhfU1RBUlQgPSBQaHlzaWNhbCBiYXNlIGFkZHJlc3MgKi8KIAotI2RlZmluZSBPTUFQNzMwX1NSQU1fQkFTRQkweEQwMDAwMDAwCi0jZGVmaW5lIE9NQVA3MzBfU1JBTV9TSVpFCShTWl8xMjhLICsgU1pfNjRLICsgU1pfOEspCi0jZGVmaW5lIE9NQVA3MzBfU1JBTV9TVEFSVAkweDIwMDAwMDAwCi0KICNkZWZpbmUgT01BUDczMF9EU1BfQkFTRQkweEUwMDAwMDAwCiAjZGVmaW5lIE9NQVA3MzBfRFNQX1NJWkUJMHg1MDAwMAogI2RlZmluZSBPTUFQNzMwX0RTUF9TVEFSVAkweEUwMDAwMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3BtLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3BtLmgKaW5kZXggZjIwOWZjMC4uZmJkNzQyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9wbS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvcG0uaApAQCAtNjEsNyArNjEsMTAgQEAKICNkZWZpbmUgUEVSX0VOCQkJCTB4MQogCiAjZGVmaW5lIENQVV9TVVNQRU5EX1NJWkUJCTIwMAotI2RlZmluZSBVTFBEX0xPV19QT1dFUl9FTgkJMHgwMDAxCisjZGVmaW5lIFVMUERfTE9XX1BXUl9FTgkJCTB4MDAwMQorI2RlZmluZSBVTFBEX0RFRVBfU0xFRVBfVFJBTlNJVElPTl9FTgkweDAwMTAKKyNkZWZpbmUgVUxQRF9TRVRVUF9BTkFMT0dfQ0VMTF8zX1ZBTAkwCisjZGVmaW5lIFVMUERfUE9XRVJfQ1RSTF9SRUdfVkFMCQkweDAyMTkKIAogI2RlZmluZSBEU1BfSURMRV9ERUxBWQkJCTEwCiAjZGVmaW5lIERTUF9JRExFCQkJMHgwMDQwCkBAIC04Niw0NiArODksMzUgQEAKICNkZWZpbmUgT01BUDE1MTBfQklHX1NMRUVQX1JFUVVFU1QJMHgwY2M1CiAjZGVmaW5lIE9NQVAxNTEwX0lETEVfTE9PUF9SRVFVRVNUCTB4MGMwMAogI2RlZmluZSBPTUFQMTUxMF9JRExFX0NMT0NLX0RPTUFJTlMJMHgyCi0jZGVmaW5lIE9NQVAxNTEwX1VMUERfTE9XX1BPV0VSX1JFUQkweDAwMDEKIAotI2RlZmluZSBPTUFQMTYxMF9ERUVQX1NMRUVQX1JFUVVFU1QJMHgxN2M3Ci0jZGVmaW5lIE9NQVAxNjEwX0JJR19TTEVFUF9SRVFVRVNUCVRCRAorLyogQm90aCBiaWcgc2xlZXAgYW5kIGRlZXAgc2xlZXAgdXNlIHNhbWUgdmFsdWVzLiBEaWZmZXJlbmNlIGlzIGluIFVMUEQuICovCisjZGVmaW5lIE9NQVAxNjEwX0lETEVDVDFfU0xFRVBfVkFMCTB4MTNjNworI2RlZmluZSBPTUFQMTYxMF9JRExFQ1QyX1NMRUVQX1ZBTAkweDA5YzcKKyNkZWZpbmUgT01BUDE2MTBfSURMRUNUM19WQUwJCTB4M2YKKyNkZWZpbmUgT01BUDE2MTBfSURMRUNUM19TTEVFUF9PUk1BU0sJMHgyYworI2RlZmluZSBPTUFQMTYxMF9JRExFQ1QzCQkweGZmZmVjZTI0CiAjZGVmaW5lIE9NQVAxNjEwX0lETEVfTE9PUF9SRVFVRVNUCTB4MDQwMAotI2RlZmluZSBPTUFQMTYxMF9JRExFX0NMT0NLX0RPTUFJTlMJMHgwOWM3Ci0jZGVmaW5lIE9NQVAxNjEwX1VMUERfTE9XX1BPV0VSX1JFUQkweDMKLQotI2lmbmRlZiBPTUFQMTUxMF9TUkFNX0lETEVfU1VTUEVORAotI2RlZmluZSBPTUFQMTUxMF9TUkFNX0lETEVfU1VTUEVORCAwCi0jZW5kaWYKLSNpZm5kZWYgT01BUDE2MTBfU1JBTV9JRExFX1NVU1BFTkQKLSNkZWZpbmUgT01BUDE2MTBfU1JBTV9JRExFX1NVU1BFTkQgMAotI2VuZGlmCi0jaWZuZGVmIE9NQVA1OTEyX1NSQU1fSURMRV9TVVNQRU5ECi0jZGVmaW5lIE9NQVA1OTEyX1NSQU1fSURMRV9TVVNQRU5EIDAKLSNlbmRpZgotCi0jaWZuZGVmIE9NQVAxNTEwX1NSQU1fQVBJX1NVU1BFTkQKLSNkZWZpbmUgT01BUDE1MTBfU1JBTV9BUElfU1VTUEVORCAwCi0jZW5kaWYKLSNpZm5kZWYgT01BUDE2MTBfU1JBTV9BUElfU1VTUEVORAotI2RlZmluZSBPTUFQMTYxMF9TUkFNX0FQSV9TVVNQRU5EIDAKLSNlbmRpZgotI2lmbmRlZiBPTUFQNTkxMl9TUkFNX0FQSV9TVVNQRU5ECi0jZGVmaW5lIE9NQVA1OTEyX1NSQU1fQVBJX1NVU1BFTkQgMAotI2VuZGlmCiAKICNpZiAgICAgIWRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE1MTApICYmIFwKLQkhZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKKwkhZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkgJiYgXAorCSFkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNFhYKQogI2Vycm9yICJQb3dlciBtYW5hZ2VtZW50IGZvciB0aGlzIHByb2Nlc3NvciBub3QgaW1wbGVtZW50ZWQgeWV0IgogI2VuZGlmCiAKICNpZm5kZWYgX19BU1NFTUJMRVJfXwogZXh0ZXJuIHZvaWQgb21hcF9wbV9pZGxlKHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcF9wbV9zdXNwZW5kKHZvaWQpOwotZXh0ZXJuIGludCBvbWFwMTUxMF9jcHVfc3VzcGVuZCh1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOwotZXh0ZXJuIGludCBvbWFwMTYxMF9jcHVfc3VzcGVuZCh1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOwotZXh0ZXJuIGludCBvbWFwMTUxMF9pZGxlX2xvb3Bfc3VzcGVuZCh2b2lkKTsKLWV4dGVybiBpbnQgb21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmQodm9pZCk7CitleHRlcm4gdm9pZCBvbWFwMTUxMF9jcHVfc3VzcGVuZCh1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQgb21hcDE2MTBfY3B1X3N1c3BlbmQodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKK2V4dGVybiB2b2lkIG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kKHZvaWQpOworZXh0ZXJuIHZvaWQgb21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmQodm9pZCk7CisKKyNpZmRlZiBDT05GSUdfT01BUF9TRVJJQUxfV0FLRQorZXh0ZXJuIHZvaWQgb21hcF9zZXJpYWxfd2FrZV90cmlnZ2VyKGludCBlbmFibGUpOworI2Vsc2UKKyNkZWZpbmUgb21hcF9zZXJpYWxfd2FrZV90cmlnZ2VyKHgpCXt9CisjZW5kaWYJLyogQ09ORklHX09NQVBfU0VSSUFMX1dBS0UgKi8KKwogZXh0ZXJuIHVuc2lnbmVkIGludCBvbWFwMTUxMF9jcHVfc3VzcGVuZF9zejsKIGV4dGVybiB1bnNpZ25lZCBpbnQgb21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmRfc3o7CiBleHRlcm4gdW5zaWduZWQgaW50IG9tYXAxNjEwX2NwdV9zdXNwZW5kX3N6OwpAQCAtMTYxLDYgKzE1Myw3IEBACiAJQVJNX1NMRUVQX1NBVkVfQVJNX0NLQ1RMLAogCUFSTV9TTEVFUF9TQVZFX0FSTV9JRExFQ1QxLAogCUFSTV9TTEVFUF9TQVZFX0FSTV9JRExFQ1QyLAorCUFSTV9TTEVFUF9TQVZFX0FSTV9JRExFQ1QzLAogCUFSTV9TTEVFUF9TQVZFX0FSTV9FV1VQQ1QsCiAJQVJNX1NMRUVQX1NBVkVfQVJNX1JTVENUMSwKIAlBUk1fU0xFRVBfU0FWRV9BUk1fUlNUQ1QyLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhNTI5NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvc2VyaWFsLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3NlcmlhbC5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9TRVJJQUxfSAorI2RlZmluZSBfX0FTTV9BUkNIX1NFUklBTF9ICisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxKQorLyogT01BUDEgc2VyaWFsIHBvcnRzICovCisjZGVmaW5lIE9NQVBfVUFSVDFfQkFTRQkJMHhmZmZiMDAwMAorI2RlZmluZSBPTUFQX1VBUlQyX0JBU0UJCTB4ZmZmYjA4MDAKKyNkZWZpbmUgT01BUF9VQVJUM19CQVNFCQkweGZmZmI5ODAwCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKQorLyogT01BUDIgc2VyaWFsIHBvcnRzICovCisjZGVmaW5lIE9NQVBfVUFSVDFfQkFTRQkJMHg0ODA2YTAwMAorI2RlZmluZSBPTUFQX1VBUlQyX0JBU0UJCTB4NDgwNmMwMDAKKyNkZWZpbmUgT01BUF9VQVJUM19CQVNFCQkweDQ4MDZlMDAwCisjZW5kaWYKKworI2RlZmluZSBPTUFQX01BWF9OUl9QT1JUUwkzCisjZGVmaW5lIE9NQVAxNTEwX0JBU0VfQkFVRAkoMTIwMDAwMDAvMTYpCisjZGVmaW5lIE9NQVAxNlhYX0JBU0VfQkFVRAkoNDgwMDAwMDAvMTYpCisKKyNkZWZpbmUgaXNfb21hcF9wb3J0KHApCSh7aW50IF9fcmV0ID0gMDsJCQlcCisJCQlpZiAocCA9PSBJT19BRERSRVNTKE9NQVBfVUFSVDFfQkFTRSkgfHwJXAorCQkJICAgIHAgPT0gSU9fQUREUkVTUyhPTUFQX1VBUlQyX0JBU0UpIHx8CVwKKwkJCSAgICBwID09IElPX0FERFJFU1MoT01BUF9VQVJUM19CQVNFKSkJXAorCQkJCV9fcmV0ID0gMTsJCQlcCisJCQlfX3JldDsJCQkJCVwKKwkJCX0pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC91bmNvbXByZXNzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3VuY29tcHJlc3MuaAppbmRleCAzZTY0MGFiLi4zNTQ1Yzg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3VuY29tcHJlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3VuY29tcHJlc3MuaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc2VyaWFsLmg+CiAKIHVuc2lnbmVkIGludCBzeXN0ZW1fcmV2OwogCkBAIC0zNCw4ICszNCw5IEBACiBwdXRzdHIoY29uc3QgY2hhciAqcykKIHsKIAl2b2xhdGlsZSB1OCAqIHVhcnQgPSAwOwotCWludCBzaGlmdDsKKwlpbnQgc2hpZnQgPSAyOwogCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUAogI2lmZGVmCUNPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzCiAJdWFydCA9ICh2b2xhdGlsZSB1OCAqKShPTUFQX1VBUlQzX0JBU0UpOwogI2VsaWYJQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDIKQEAgLTQ0LDYgKzQ1LDcgQEAKIAl1YXJ0ID0gKHZvbGF0aWxlIHU4ICopKE9NQVBfVUFSVDFfQkFTRSk7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCiAJLyogRGV0ZXJtaW5lIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogCWRvIHsKIAkJLyogTU1VIGlzIG5vdCBvbiwgc28gY3B1X2lzX29tYXBYWFhYKCkgd29uJ3Qgd29yayBoZXJlICovCkBAIC01MSwxNCArNTMsMTQgQEAKIAogCQlpZiAob21hcF9pZCA9PSBPTUFQX0lEXzczMCkKIAkJCXNoaWZ0ID0gMDsKLQkJZWxzZQotCQkJc2hpZnQgPSAyOwogCiAJCWlmIChjaGVja19wb3J0KHVhcnQsIHNoaWZ0KSkKIAkJCWJyZWFrOwogCQkvKiBTaWxlbnQgYm9vdCBpZiBubyBzZXJpYWwgcG9ydHMgYXJlIGVuYWJsZWQuICovCiAJCXJldHVybjsKIAl9IHdoaWxlICgwKTsKKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9PTUFQMSAqLworI2VuZGlmCiAKIAkvKgogCSAqIE5vdywgeG1pdCBlYWNoIGNoYXJhY3RlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2NvcmdpLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvY29yZ2kuaAppbmRleCAzMjRkYjA2Li40YjdhYTBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvY29yZ2kuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvY29yZ2kuaApAQCAtMTAzLDE4ICsxMDMsMjAgQEAKICAqIFNoYXJlZCBkYXRhIHN0cnVjdHVyZXMKICAqLwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2lzY29vcF9kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3JnaXNzcF9kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3JnaWZiX2RldmljZTsKIAogLyoKICAqIEV4dGVybmFsIEZ1bmN0aW9ucwogICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBjb3JnaV9zc3BfYWRzNzg0Nl9wdXRnZXQodW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBjb3JnaV9zc3BfYWRzNzg0Nl9nZXQodm9pZCk7Ci1leHRlcm4gdm9pZCBjb3JnaV9zc3BfYWRzNzg0Nl9wdXQodWxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBjb3JnaV9zc3BfYWRzNzg0Nl9wdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKIGV4dGVybiB2b2lkIGNvcmdpX3NzcF9hZHM3ODQ2X2xvY2sodm9pZCk7CiBleHRlcm4gdm9pZCBjb3JnaV9zc3BfYWRzNzg0Nl91bmxvY2sodm9pZCk7Ci1leHRlcm4gdm9pZCBjb3JnaV9zc3BfbGNkdGdfc2VuZCAodTggYWRycywgdTggZGF0YSk7CitleHRlcm4gdm9pZCBjb3JnaV9zc3BfbGNkdGdfc2VuZCAodW5zaWduZWQgY2hhciBhZHJzLCB1bnNpZ25lZCBjaGFyIGRhdGEpOwogZXh0ZXJuIHZvaWQgY29yZ2lfc3NwX2JsZHV0eV9zZXQoaW50IGR1dHkpOwotZXh0ZXJuIGludCBjb3JnaV9zc3BfbWF4MTExMV9nZXQodWxvbmcgZGF0YSk7CitleHRlcm4gaW50IGNvcmdpX3NzcF9tYXgxMTExX2dldCh1bnNpZ25lZCBsb25nIGRhdGEpOwogCiAjZW5kaWYgLyogX19BU01fQVJDSF9DT1JHSV9IICAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvaGFyZHdhcmUuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9oYXJkd2FyZS5oCmluZGV4IDcyYjA0ZDguLmNmMzU3MjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9oYXJkd2FyZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9oYXJkd2FyZS5oCkBAIC00NCwyNCArNDQsMTIgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotI2lmIDAKLSMgZGVmaW5lIF9fUkVHKHgpCSgqKCh2b2xhdGlsZSB1MzIgKilpb19wMnYoeCkpKQotI2Vsc2UKLS8qCi0gKiBUaGlzIF9fUkVHKCkgdmVyc2lvbiBnaXZlcyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSBvbmUgYWJvdmUsICBleGNlcHQKLSAqIHRoYXQgd2UgYXJlIGZvb2xpbmcgZ2NjIHNvbWVob3cgc28gaXQgZ2VuZXJhdGVzIGZhciBiZXR0ZXIgYW5kIHNtYWxsZXIKLSAqIGFzc2VtYmx5IGNvZGUgZm9yIGFjY2VzcyB0byBjb250aWdvdXMgcmVnaXN0ZXJzLiAgSXQncyBhIHNoYW1lIHRoYXQgZ2NjCi0gKiBkb2Vzbid0IGd1ZXNzIHRoaXMgYnkgaXRzZWxmLgotICovCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIHUzMiBvZmZzZXRbNDA5Nl07IH0gX19yZWdiYXNlOwotIyBkZWZpbmUgX19SRUdQKHgpCSgoX19yZWdiYXNlICopKCh4KSZ+NDA5NSkpLT5vZmZzZXRbKCh4KSY0MDk1KT4+Ml0KLSMgZGVmaW5lIF9fUkVHKHgpCV9fUkVHUChpb19wMnYoeCkpCi0jZW5kaWYKKyMgZGVmaW5lIF9fUkVHKHgpCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopaW9fcDJ2KHgpKSkKIAogLyogV2l0aCBpbmRleGVkIHJlZ3Mgd2UgZG9uJ3Qgd2FudCB0byBmZWVkIHRoZSBpbmRleCB0aHJvdWdoIGlvX3AydigpCiAgICBlc3BlY2lhbGx5IGlmIGl0IGlzIGEgdmFyaWFibGUsIG90aGVyd2lzZSBob3JyaWJsZSBjb2RlIHdpbGwgcmVzdWx0LiAqLwotIyBkZWZpbmUgX19SRUcyKHgseSkgICAgICgqKHZvbGF0aWxlIHUzMiAqKSgodTMyKSZfX1JFRyh4KSArICh5KSkpCisjIGRlZmluZSBfX1JFRzIoeCx5KQlcCisJKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSgodW5zaWduZWQgbG9uZykmX19SRUcoeCkgKyAoeSkpKQogCiAjIGRlZmluZSBfX1BSRUcoeCkJKGlvX3YycCgodTMyKSYoeCkpKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvaTJjLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvaTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlYzIyNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9pMmMuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogIGkyY19weGEuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50cmluc3ljIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2lmbmRlZiBfSTJDX1BYQV9IXworI2RlZmluZSBfSTJDX1BYQV9IXworCisjaWYgMAorI2RlZmluZSBERUZfVElNRU9VVCAgICAgICAgICAgICAzCisjZWxzZQorLyogbmVlZCBhIGxvbmdlciB0aW1lb3V0IGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCB0aGUgZmFjdCB3ZSBtYXkgd2VsbCBiZQorICogbG9va2luZyBhdCBhIG11bHRpLW1hc3RlciBlbnZpcm9ubWVudAorKi8KKyNkZWZpbmUgREVGX1RJTUVPVVQgICAgICAgICAgICAgMzIKKyNlbmRpZgorCisjZGVmaW5lIEJVU19FUlJPUiAgICAgICAgICAgICAgICgtRVJFTU9URUlPKQorI2RlZmluZSBYRkVSX05BS0VEICAgICAgICAgICAgICAoLUVDT05OUkVGVVNFRCkKKyNkZWZpbmUgSTJDX1JFVFJZICAgICAgICAgICAgICAgKC0yMDAwKSAvKiBhbiBlcnJvciBoYXMgb2NjdXJyZWQgcmV0cnkgdHJhbnNtaXQgKi8KKworLyogSUNSIGluaXRpYWxpemUgYml0IHZhbHVlcworKgorKiAgMTUuIEZNICAgICAgIDAgKDEwMCBLaHogb3BlcmF0aW9uKQorKiAgMTQuIFVSICAgICAgIDAgKE5vIHVuaXQgcmVzZXQpCisqICAxMy4gU0FESUUgICAgMCAoRGlzYWJsZXMgdGhlIHVuaXQgZnJvbSBpbnRlcnJ1cHRpbmcgb24gc2xhdmUgYWRkcmVzc2VzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcgaXRzIHNsYXZlIGFkZHJlc3MpCisqICAxMi4gQUxESUUgICAgMCAoRGlzYWJsZXMgdGhlIHVuaXQgZnJvbSBpbnRlcnJ1cHQgd2hlbiBpdCBsb3NlcyBhcmJpdHJhdGlvbgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1hc3RlciBtb2RlKQorKiAgMTEuIFNTRElFICAgIDAgKERpc2FibGVzIGludGVycnVwdHMgZnJvbSBhIHNsYXZlIHN0b3AgZGV0ZWN0ZWQsIGluIHNsYXZlIG1vZGUpCisqICAxMC4gQkVJRSAgICAgMSAoRW5hYmxlIGludGVycnVwdHMgZnJvbSBkZXRlY3RlZCBidXMgZXJyb3JzLCBubyBBQ0sgc2VudCkKKyogIDkuICBJUkZJRSAgICAxIChFbmFibGUgaW50ZXJydXB0cyBmcm9tIGZ1bGwgYnVmZmVyIHJlY2VpdmVkKQorKiAgOC4gIElURUlFICAgIDEgKEVuYWJsZXMgdGhlIEkyQyB1bml0IHRvIGludGVycnVwdCB3aGVuIHRyYW5zbWl0IGJ1ZmZlciBlbXB0eSkKKyogIDcuICBHQ0QgICAgICAxIChEaXNhYmxlcyBpMmMgdW5pdCByZXNwb25zZSB0byBnZW5lcmFsIGNhbGwgbWVzc2FnZXMgYXMgYSBzbGF2ZSkKKyogIDYuICBJVUUgICAgICAwIChEaXNhYmxlIHVuaXQgdW50aWwgd2UgY2hhbmdlIHNldHRpbmdzKQorKiAgNS4gIFNDTEUgICAgIDEgKEVuYWJsZXMgdGhlIGkyYyBjbG9jayBvdXRwdXQgZm9yIG1hc3RlciBtb2RlIChkcml2ZXMgU0NMKQorKiAgNC4gIE1BICAgICAgIDAgKE9ubHkgc2VuZCBzdG9wIHdpdGggdGhlIElDUiBzdG9wIGJpdCkKKyogIDMuICBUQiAgICAgICAwIChXZSBhcmUgbm90IHRyYW5zbWl0dGluZyBhIGJ5dGUgaW5pdGlhbGx5KQorKiAgMi4gIEFDS05BSyAgIDAgKFNlbmQgYW4gQUNLIGFmdGVyIHRoZSB1bml0IHJlY2VpdmVzIGEgYnl0ZSkKKyogIDEuICBTVE9QICAgICAwIChEbyBub3Qgc2VuZCBhIFNUT1ApCisqICAwLiAgU1RBUlQgICAgMCAoRG8gbm90IHNlbmQgYSBTVEFSVCkKKyoKKyovCisjZGVmaW5lIEkyQ19JQ1JfSU5JVAkoSUNSX0JFSUUgfCBJQ1JfSVJGSUUgfCBJQ1JfSVRFSUUgfCBJQ1JfR0NEIHwgSUNSX1NDTEUpCisKKy8qIEkyQyBzdGF0dXMgcmVnaXN0ZXIgaW5pdCB2YWx1ZXMKKyAqCisgKiAxMC4gQkVEICAgICAgMSAoQ2xlYXIgYnVzIGVycm9yIGRldGVjdGVkKQorICogOS4gIFNBRCAgICAgIDEgKENsZWFyIHNsYXZlIGFkZHJlc3MgZGV0ZWN0ZWQpCisgKiA3LiAgSVJGICAgICAgMSAoQ2xlYXIgSURCUiBSZWNlaXZlIEZ1bGwpCisgKiA2LiAgSVRFICAgICAgMSAoQ2xlYXIgSURCUiBUcmFuc21pdCBFbXB0eSkKKyAqIDUuICBBTEQgICAgICAxIChDbGVhciBBcmJpdHJhdGlvbiBMb3NzIERldGVjdGVkKQorICogNC4gIFNTRCAgICAgIDEgKENsZWFyIFNsYXZlIFN0b3AgRGV0ZWN0ZWQpCisgKi8KKyNkZWZpbmUgSTJDX0lTUl9JTklUCTB4N0ZGICAvKiBzdGF0dXMgcmVnaXN0ZXIgaW5pdCAqLworCitzdHJ1Y3QgaTJjX3NsYXZlX2NsaWVudDsKKworc3RydWN0IGkyY19weGFfcGxhdGZvcm1fZGF0YSB7CisJdW5zaWduZWQgaW50CQlzbGF2ZV9hZGRyOworCXN0cnVjdCBpMmNfc2xhdmVfY2xpZW50CSpzbGF2ZTsKK307CisKK2V4dGVybiB2b2lkIHB4YV9zZXRfaTJjX2luZm8oc3RydWN0IGkyY19weGFfcGxhdGZvcm1fZGF0YSAqaW5mbyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9tbWMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9tbWMuaAppbmRleCA3NDkyZWE3Li44OGMxN2RkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvbW1jLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL21tYy5oCkBAIC05LDcgKzksOSBAQAogCiBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgewogCXVuc2lnbmVkIGludCBvY3JfbWFzazsJCQkvKiBhdmFpbGFibGUgdm9sdGFnZXMgKi8KKwl1bnNpZ25lZCBsb25nIGRldGVjdF9kZWxheTsJCS8qIGRlbGF5IGluIGppZmZpZXMgYmVmb3JlIGRldGVjdGluZyBjYXJkcyBhZnRlciBpbnRlcnJ1cHQgKi8KIAlpbnQgKCppbml0KShzdHJ1Y3QgZGV2aWNlICosIGlycXJldHVybl90ICgqKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksIHZvaWQgKik7CisJaW50ICgqZ2V0X3JvKShzdHJ1Y3QgZGV2aWNlICopOwogCXZvaWQgKCpzZXRwb3dlcikoc3RydWN0IGRldmljZSAqLCB1bnNpZ25lZCBpbnQpOwogCXZvaWQgKCpleGl0KShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKik7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhLXJlZ3MuaAppbmRleCA1MWYwZmUwLi45MzlkOWU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhLXJlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhLXJlZ3MuaApAQCAtODE4LDYgKzgxOCwyMyBAQAogI2RlZmluZSBVRENPVEdJQ1JfSUVJREYJKDEgPDwgMCkJLyogT1RHIElEIENoYW5nZSBGYWxsaW5nIEVkZ2UKIAkJCQkJICAgSW50ZXJydXB0IEVuYWJsZSAqLwogCisjZGVmaW5lIFVQMk9DUgkJICBfX1JFRygweDQwNjAwMDIwKSAgLyogVVNCIFBvcnQgMiBPdXRwdXQgQ29udHJvbCByZWdpc3RlciAqLworCisjZGVmaW5lIFVQMk9DUl9DUFZFTgkoMSA8PCAwKQkvKiBDaGFyZ2UgUHVtcCBWYnVzIEVuYWJsZSAqLworI2RlZmluZSBVUDJPQ1JfQ1BWUEUJKDEgPDwgMSkJLyogQ2hhcmdlIFB1bXAgVmJ1cyBQdWxzZSBFbmFibGUgKi8KKyNkZWZpbmUgVVAyT0NSX0RQUERFCSgxIDw8IDIpCS8qIEhvc3QgUG9ydCAyIFRyYW5zY2VpdmVyIEQrIFB1bGwgRG93biBFbmFibGUgKi8KKyNkZWZpbmUgVVAyT0NSX0RNUERFCSgxIDw8IDMpCS8qIEhvc3QgUG9ydCAyIFRyYW5zY2VpdmVyIEQtIFB1bGwgRG93biBFbmFibGUgKi8KKyNkZWZpbmUgVVAyT0NSX0RQUFVFCSgxIDw8IDQpCS8qIEhvc3QgUG9ydCAyIFRyYW5zY2VpdmVyIEQrIFB1bGwgVXAgRW5hYmxlICovCisjZGVmaW5lIFVQMk9DUl9ETVBVRQkoMSA8PCA1KQkvKiBIb3N0IFBvcnQgMiBUcmFuc2NlaXZlciBELSBQdWxsIFVwIEVuYWJsZSAqLworI2RlZmluZSBVUDJPQ1JfRFBQVUJFCSgxIDw8IDYpCS8qIEhvc3QgUG9ydCAyIFRyYW5zY2VpdmVyIEQrIFB1bGwgVXAgQnlwYXNzIEVuYWJsZSAqLworI2RlZmluZSBVUDJPQ1JfRE1QVUJFCSgxIDw8IDcpCS8qIEhvc3QgUG9ydCAyIFRyYW5zY2VpdmVyIEQtIFB1bGwgVXAgQnlwYXNzIEVuYWJsZSAqLworI2RlZmluZSBVUDJPQ1JfRVhTUAkJKDEgPDwgOCkJLyogRXh0ZXJuYWwgVHJhbnNjZWl2ZXIgU3BlZWQgQ29udHJvbCAqLworI2RlZmluZSBVUDJPQ1JfRVhTVVMJKDEgPDwgOSkJLyogRXh0ZXJuYWwgVHJhbnNjZWl2ZXIgU3BlZWQgRW5hYmxlICovCisjZGVmaW5lIFVQMk9DUl9JRE9OCQkoMSA8PCAxMCkJLyogT1RHIElEIFJlYWQgRW5hYmxlICovCisjZGVmaW5lIFVQMk9DUl9IWFMJCSgxIDw8IDE2KQkvKiBIb3N0IFBvcnQgMiBUcmFuc2NlaXZlciBPdXRwdXQgU2VsZWN0ICovCisjZGVmaW5lIFVQMk9DUl9IWE9FCQkoMSA8PCAxNykJLyogSG9zdCBQb3J0IDIgVHJhbnNjZWl2ZXIgT3V0cHV0IEVuYWJsZSAqLworI2RlZmluZSBVUDJPQ1JfU0VPUwkJKDEgPDwgMjQpCS8qIFNpbmdsZS1FbmRlZCBPdXRwdXQgU2VsZWN0ICovCisKICNkZWZpbmUgVURDQ1NOKHgpCV9fUkVHMigweDQwNjAwMTAwLCAoeCkgPDwgMikKICNkZWZpbmUgVURDQ1NSMCAgICAgICAgIF9fUkVHKDB4NDA2MDAxMDApIC8qIFVEQyBDb250cm9sL1N0YXR1cyByZWdpc3RlciAtIEVuZHBvaW50IDAgKi8KICNkZWZpbmUgVURDQ1NSMF9TQQkoMSA8PCA3KQkvKiBTZXR1cCBBY3RpdmUgKi8KQEAgLTE0MjMsNiArMTQ0MCw3IEBACiAjZGVmaW5lIEdQSU84NF9OU1NQX1JYICAgICAgCSg4NCB8IEdQSU9fQUxUX0ZOXzJfSU4pCiAjZGVmaW5lIEdQSU84NV9uUENFXzFfTUQJKDg1IHwgR1BJT19BTFRfRk5fMV9PVVQpCiAjZGVmaW5lIEdQSU85Ml9NTUNEQVQwX01ECSg5MiB8IEdQSU9fQUxUX0ZOXzFfT1VUKQorI2RlZmluZSBHUElPMTA0X3BTS1RTRUxfTUQJKDEwNCB8IEdQSU9fQUxUX0ZOXzFfT1VUKQogI2RlZmluZSBHUElPMTA5X01NQ0RBVDFfTUQJKDEwOSB8IEdQSU9fQUxUX0ZOXzFfT1VUKQogI2RlZmluZSBHUElPMTEwX01NQ0RBVDJfTUQJKDExMCB8IEdQSU9fQUxUX0ZOXzFfT1VUKQogI2RlZmluZSBHUElPMTEwX01NQ0NTMF9NRAkoMTEwIHwgR1BJT19BTFRfRk5fMV9PVVQpCkBAIC0xNTEwLDYgKzE1MjgsOCBAQAogI2RlZmluZSBQU1NSX0JGUwkoMSA8PCAxKQkvKiBCYXR0ZXJ5IEZhdWx0IFN0YXR1cyAqLwogI2RlZmluZSBQU1NSX1NTUwkoMSA8PCAwKQkvKiBTb2Z0d2FyZSBTbGVlcCBTdGF0dXMgKi8KIAorI2RlZmluZSBQU0xSX1NMX1JPRAkoMSA8PCAyMCkJLyogU2xlZXAtTW9kZS9EZXBwLVNsZWVwIE1vZGUgblJFU0VUX09VVCBEaXNhYmxlICovCisKICNkZWZpbmUgUENGUl9STwkJKDEgPDwgMTUpCS8qIFJESCBPdmVycmlkZSAqLwogI2RlZmluZSBQQ0ZSX1BPCQkoMSA8PCAxNCkJLyogUEggT3ZlcnJpZGUgKi8KICNkZWZpbmUgUENGUl9HUFJPRAkoMSA8PCAxMikJLyogR1BJTyBuUkVTRVRfT1VUIERpc2FibGUgKi8KQEAgLTE1MTcsNiArMTUzNyw3IEBACiAjZGVmaW5lIFBDRlJfRlZDCSgxIDw8IDEwKQkvKiBGcmVxdWVuY3kvVm9sdGFnZSBDaGFuZ2UgKi8KICNkZWZpbmUgUENGUl9EQ19FTgkoMSA8PCA3KQkvKiBTbGVlcC9kZWVwLXNsZWVwIERDLURDIENvbnZlcnRlciBFbmFibGUgKi8KICNkZWZpbmUgUENGUl9QSTJDRU4JKDEgPDwgNikJLyogRW5hYmxlIFBJMkMgY29udHJvbGxlciAqLworI2RlZmluZSBQQ0ZSX0dQUl9FTgkoMSA8PCA0KQkvKiBuUkVTRVRfR1BJTyBQaW4gRW5hYmxlICovCiAjZGVmaW5lIFBDRlJfRFMJCSgxIDw8IDMpCS8qIERlZXAgU2xlZXAgTW9kZSAqLwogI2RlZmluZSBQQ0ZSX0ZTCQkoMSA8PCAyKQkvKiBGbG9hdCBTdGF0aWMgQ2hpcCBTZWxlY3RzICovCiAjZGVmaW5lIFBDRlJfRlAJCSgxIDw8IDEpCS8qIEZsb2F0IFBDTUNJQSBjb250cm9scyAqLwpAQCAtMTgxMCw2ICsxODMxLDExIEBACiAjZGVmaW5lIExDQ1IwX1BERF9TCTEyCiAjZGVmaW5lIExDQ1IwX0JNCSgxIDw8IDIwKSAJLyogQnJhbmNoIG1hc2sgKi8KICNkZWZpbmUgTENDUjBfT1VNCSgxIDw8IDIxKQkvKiBPdXRwdXQgRklGTyB1bmRlcnJ1biBtYXNrICovCisjZGVmaW5lIExDQ1IwX0xDRFQgICAgICAoMSA8PCAyMikgICAgICAgLyogTENEIHBhbmVsIHR5cGUgKi8KKyNkZWZpbmUgTENDUjBfUkRTVE0gICAgICgxIDw8IDIzKSAgICAgICAvKiBSZWFkIHN0YXR1cyBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSBMQ0NSMF9DTURJTSAgICAgKDEgPDwgMjQpICAgICAgIC8qIENvbW1hbmQgaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgTENDUjBfT1VDICAgICAgICgxIDw8IDI1KSAgICAgICAvKiBPdmVybGF5IFVuZGVybGF5IGNvbnRyb2wgYml0ICovCisjZGVmaW5lIExDQ1IwX0xEREFMVCAgICAoMSA8PCAyNikgICAgICAgLyogTEREIGFsdGVybmF0ZSBtYXBwaW5nIGNvbnRyb2wgKi8KIAogI2RlZmluZSBMQ0NSMV9QUEwgICAgICAgRmxkICgxMCwgMCkgICAgICAvKiBQaXhlbHMgUGVyIExpbmUgLSAxICovCiAjZGVmaW5lIExDQ1IxX0Rpc1dkdGgoUGl4ZWwpICAgICAgICAgICAgLyogRGlzcGxheSBXaWR0aCBbMS4uODAwIHBpeC5dICAqLyBcCkBAIC0yMDYyLDcgKzIwODgsMTAgQEAKICNkZWZpbmUgVUhDRk1OCQlfX1JFRygweDRDMDAwMDNDKSAvKiBVSEMgRnJhbWUgTnVtYmVyICovCiAjZGVmaW5lIFVIQ1BFUlMJCV9fUkVHKDB4NEMwMDAwNDApIC8qIFVIQyBQZXJpb2RpYyBTdGFydCAqLwogI2RlZmluZSBVSENMUwkJX19SRUcoMHg0QzAwMDA0NCkgLyogVUhDIExvdyBTcGVlZCBUaHJlc2hvbGQgKi8KKwogI2RlZmluZSBVSENSSERBCQlfX1JFRygweDRDMDAwMDQ4KSAvKiBVSEMgUm9vdCBIdWIgRGVzY3JpcHRvciBBICovCisjZGVmaW5lIFVIQ1JIREFfTk9DUAkoMSA8PCAxMikJLyogTm8gb3ZlciBjdXJyZW50IHByb3RlY3Rpb24gKi8KKwogI2RlZmluZSBVSENSSERCCQlfX1JFRygweDRDMDAwMDRDKSAvKiBVSEMgUm9vdCBIdWIgRGVzY3JpcHRvciBCICovCiAjZGVmaW5lIFVIQ1JIUwkJX19SRUcoMHg0QzAwMDA1MCkgLyogVUhDIFJvb3QgSHViIFN0YXR1cyAqLwogI2RlZmluZSBVSENSSFBTMQlfX1JFRygweDRDMDAwMDU0KSAvKiBVSEMgUm9vdCBIdWIgUG9ydCAxIFN0YXR1cyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YWZiLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhZmIuaAppbmRleCAyN2Q3MWU5Li4yMWMwZTE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhZmIuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhZmIuaApAQCAtNjYsMyArNjYsNCBAQAogCiB9Owogdm9pZCBzZXRfcHhhX2ZiX2luZm8oc3RydWN0IHB4YWZiX21hY2hfaW5mbyAqaGFyZF9weGFfZmJfaW5mbyk7Cit1bnNpZ25lZCBsb25nIHB4YWZiX2dldF9oc3luY190aW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1jcGxkLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1jcGxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3NWIxNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYW51YmlzLWNwbGQuaApAQCAtMCwwICsxLDI0IEBACisvKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1jcGxkLmgKKyAqCisgKiAoYykgMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIEFOVUJJUyAtIENQTEQgY29udHJvbCBjb25zdGFudHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIENoYW5nZWxvZzoKKyAqCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfQU5VQklTQ1BMRF9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfQU5VQklTQ1BMRF9ICisKKy8qIENUUkwyIC0gTkFORCBXUCBjb250cm9sLCBJREUgUmVzZXQgYXNzZXJ0L2NoZWNrICovCisKKyNkZWZpbmUgQU5VQklTX0NUUkwxX05BTkRTRUwJCSgweDMpCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX0FOVUJJU0NQTERfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtaXJxLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmYxNWRiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtaXJxLmgKQEAgLTAsMCArMSwyMyBAQAorLyogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtaXJxLmgKKyAqCisgKiAoYykgMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqICBBTlVCSVMgLSBJUlEgTnVtYmVyIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDaGFuZ2Vsb2c6CisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0FOVUJJU0lSUV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfQU5VQklTSVJRX0gKKworI2RlZmluZSBJUlFfSURFMCAgICAgICBJUlFfRUlOVDIKKyNkZWZpbmUgSVJRX0lERTEgICAgICAgSVJRX0VJTlQzCisjZGVmaW5lIElSUV9BU0lYICAgICAgIElSUV9FSU5UMQorCisjZW5kaWYgLyogX19BU01fQVJDSF9BTlVCSVNJUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtbWFwLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzc0MWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtbWFwLmgKQEAgLTAsMCArMSw0NiBAQAorLyogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtbWFwLmgKKyAqCisgKiAoYykgMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIEFOVUJJUyAtIE1lbW9yeSBtYXAgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIENoYW5nZWxvZzoKKyovCisKKy8qIG5lZWRzIGFyY2gvbWFwLmggaW5jbHVkaW5nIHdpdGggdGhpcyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfQU5VQklTTUFQX0gKKyNkZWZpbmUgX19BU01fQVJDSF9BTlVCSVNNQVBfSAorCisvKiBzdGFydCBwZXJpcGhlcmFscyBvZmYgYWZ0ZXIgdGhlIFMzQzI0MTAgKi8KKworI2RlZmluZSBBTlVCSVNfSU9BRERSKHgpCShTM0MyNDEwX0FERFIoKHgpICsgMHgwMjAwMDAwMCkpCisKKyNkZWZpbmUgQU5VQklTX1BBX0NQTEQJCShTM0MyNDEwX0NTMSB8ICgxPDwyNikpCisKKy8qIHdlIHB1dCB0aGUgQ1BMRCByZWdpc3RlcnMgbmV4dCwgdG8gZ2V0IHRoZW0gb3V0IG9mIHRoZSB3YXkgKi8KKworI2RlZmluZSBBTlVCSVNfVkFfQ1RSTDEJICAgIEFOVUJJU19JT0FERFIoMHgwMDAwMDAwMCkJIC8qIDB4MDEzMDAwMDAgKi8KKyNkZWZpbmUgQU5VQklTX1BBX0NUUkwxCSAgICAoQU5VQklTX1BBX0NQTEQpCisKKyNkZWZpbmUgQU5VQklTX1ZBX0NUUkwyCSAgICBBTlVCSVNfSU9BRERSKDB4MDAxMDAwMDApCSAvKiAweDAxNDAwMDAwICovCisjZGVmaW5lIEFOVUJJU19QQV9DVFJMMgkgICAgKEFOVUJJU19QQV9DUExEKQorCisjZGVmaW5lIEFOVUJJU19WQV9DVFJMMwkgICAgQU5VQklTX0lPQUREUigweDAwMjAwMDAwKQkgLyogMHgwMTUwMDAwMCAqLworI2RlZmluZSBBTlVCSVNfUEFfQ1RSTDMJICAgIChBTlVCSVNfUEFfQ1BMRCkKKworI2RlZmluZSBBTlVCSVNfVkFfQ1RSTDQJICAgIEFOVUJJU19JT0FERFIoMHgwMDMwMDAwMCkJIC8qIDB4MDE2MDAwMDAgKi8KKyNkZWZpbmUgQU5VQklTX1BBX0NUUkw0CSAgICAoQU5VQklTX1BBX0NQTEQpCisKKyNkZWZpbmUgQU5VQklTX0lERVBSSQkgICAgQU5VQklTX0lPQUREUigweDAxMDAwMDAwKQorI2RlZmluZSBBTlVCSVNfSURFUFJJQVVYICAgIEFOVUJJU19JT0FERFIoMHgwMTEwMDAwMCkKKyNkZWZpbmUgQU5VQklTX0lERVNFQwkgICAgQU5VQklTX0lPQUREUigweDAxMjAwMDAwKQorI2RlZmluZSBBTlVCSVNfSURFU0VDQVVYICAgIEFOVUJJU19JT0FERFIoMHgwMTMwMDAwMCkKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfQU5VQklTTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZmIuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzU3YmM4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9mYi5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIGxpbnV4L2luY2x1ZGUvYXNtL2FyY2gtczNjMjQxMC9mYi5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKgorICogSW5zcGlyZWQgYnkgcHhhZmIuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICoKKyAqICBDaGFuZ2Vsb2c6CisgKgkwNy1TZXAtMjAwNAlSVFAJQ3JlYXRlZCBmaWxlCisgKgkwMy1Ob3YtMjAwNAlCSkQJVXBkYXRlZCBhbmQgbWlub3IgY2xlYW51cHMKKyAqCTAzLUF1Zy0yMDA1ICAgICBSVFAgICAgIFJlbmFtZWQgdG8gZmIuaAorKi8KKworI2lmbmRlZiBfX0FTTV9BUk1fRkJfSAorI2RlZmluZSBfX0FTTV9BUk1fRkJfSAorCisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1sY2QuaD4KKworc3RydWN0IHMzYzI0MTBmYl92YWwgeworCXVuc2lnbmVkIGludAlkZWZ2YWw7CisJdW5zaWduZWQgaW50CW1pbjsKKwl1bnNpZ25lZCBpbnQJbWF4OworfTsKKworc3RydWN0IHMzYzI0MTBmYl9odyB7CisJdW5zaWduZWQgbG9uZwlsY2Rjb24xOworCXVuc2lnbmVkIGxvbmcJbGNkY29uMjsKKwl1bnNpZ25lZCBsb25nCWxjZGNvbjM7CisJdW5zaWduZWQgbG9uZwlsY2Rjb240OworCXVuc2lnbmVkIGxvbmcJbGNkY29uNTsKK307CisKK3N0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyCWZpeGVkX3N5bmNzOwkvKiBkbyBub3QgdXBkYXRlIHN5bmMvYm9yZGVyICovCisKKwkvKiBTY3JlZW4gc2l6ZSAqLworCWludAkJd2lkdGg7CisJaW50CQloZWlnaHQ7CisKKwkvKiBTY3JlZW4gaW5mbyAqLworCXN0cnVjdCBzM2MyNDEwZmJfdmFsIHhyZXM7CisJc3RydWN0IHMzYzI0MTBmYl92YWwgeXJlczsKKwlzdHJ1Y3QgczNjMjQxMGZiX3ZhbCBicHA7CisKKwkvKiBsY2QgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKwlzdHJ1Y3QgczNjMjQxMGZiX2h3ICByZWdzOworCisJLyogR1BJT3MgKi8KKworCXVuc2lnbmVkIGxvbmcJZ3BjdXA7CisJdW5zaWduZWQgbG9uZwlncGN1cF9tYXNrOworCXVuc2lnbmVkIGxvbmcJZ3BjY29uOworCXVuc2lnbmVkIGxvbmcJZ3BjY29uX21hc2s7CisJdW5zaWduZWQgbG9uZwlncGR1cDsKKwl1bnNpZ25lZCBsb25nCWdwZHVwX21hc2s7CisJdW5zaWduZWQgbG9uZwlncGRjb247CisJdW5zaWduZWQgbG9uZwlncGRjb25fbWFzazsKKworCS8qIGxwYzM2MDAgY29udHJvbCByZWdpc3RlciAqLworCXVuc2lnbmVkIGxvbmcJbHBjc2VsOworfTsKKwordm9pZCBfX2luaXQgc2V0X3MzYzI0MTBmYl9pbmZvKHN0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvICpoYXJkX3MzYzI0MTBmYl9pbmZvKTsKKworI2VuZGlmIC8qIF9fQVNNX0FSTV9GQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtY2xvY2suaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1jbG9jay5oCmluZGV4IGU1ZTkzOGIuLjE2ZjRjM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1jbG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1jbG9jay5oCkBAIC0xLDcgKzEsNyBAQAogLyogbGludXgvaW5jbHVkZS9hc20vYXJjaC1zM2MyNDEwL3JlZ3MtY2xvY2suaAogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMywyMDA0IFNpbXRlYyBFbGVjdHJvbmljcyA8bGludXhAc2ltdGVjLmNvLnVrPgotICoJCSAgICAgIGh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL1NXTElOVVgvCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsMjAwNCwyMDA1IFNpbXRlYyBFbGVjdHJvbmljcyA8bGludXhAc2ltdGVjLmNvLnVrPgorICoJCSAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0xNyw2ICsxNyw3IEBACiAgKiAgICAyOS1TZXAtMjAwNCBCZW4gRG9va3MJICAgIEZpeGVkIHVzYWdlIGZvciBhc3NlbWJseSBpbmNsdXNpb24KICAqICAgIDEwLUZlYi0yMDA1IEJlbiBEb29rcwkgICAgRml4ZWQgQ0FNRElWTiBhZGRyZXNzIChHdWlsbGF1bWUgR291cmF0KQogICogICAgMTAtTWFyLTIwMDUgTHVjYXMgVmlsbGEgUmVhbCAgQ2hhbmdlZCBTM0MyNDEwX1ZBIHRvIFMzQzI0WFhfVkEKKyAqICAgIDI3LUF1Zy0yMDA1IEJlbiBEb29rcwkgICAgQWRkIGNsb2NrLXNsb3cgaW5mbwogICovCiAKICNpZm5kZWYgX19BU01fQVJNX1JFR1NfQ0xPQ0sKQEAgLTc0LDYgKzc1LDEyIEBACiAjZGVmaW5lIFMzQzI0MTBfQ0xLRElWTl9QRElWTgkgICAgICgxPDwwKQogI2RlZmluZSBTM0MyNDEwX0NMS0RJVk5fSERJVk4JICAgICAoMTw8MSkKIAorI2RlZmluZSBTM0MyNDEwX0NMS1NMT1dfVUNMS19PRkYJKDE8PDcpCisjZGVmaW5lIFMzQzI0MTBfQ0xLU0xPV19NUExMX09GRgkoMTw8NSkKKyNkZWZpbmUgUzNDMjQxMF9DTEtTTE9XX1NMT1cJCSgxPDw0KQorI2RlZmluZSBTM0MyNDEwX0NMS1NMT1dfU0xPV1ZBTCh4KQkoeCkKKyNkZWZpbmUgUzNDMjQxMF9DTEtTTE9XX0dFVF9TTE9XVkFMKHgpCSgoeCkgJiA3KQorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWxjZC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWxjZC5oCmluZGV4IDdmODgyZWEuLmI2YjFiNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1sY2QuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtbGNkLmgKQEAgLTUxLDIxICs1MSwzMiBAQAogCiAjZGVmaW5lIFMzQzI0MTBfTENEQ09OMV9FTlZJRAkgICAoMSkKIAorI2RlZmluZSBTM0MyNDEwX0xDRENPTjFfTU9ERU1BU0sgICAgMHgxRQorCiAjZGVmaW5lIFMzQzI0MTBfTENEQ09OMl9WQlBEKHgpCSAgICAoKHgpIDw8IDI0KQogI2RlZmluZSBTM0MyNDEwX0xDRENPTjJfTElORVZBTCh4KSAgKCh4KSA8PCAxNCkKICNkZWZpbmUgUzNDMjQxMF9MQ0RDT04yX1ZGUEQoeCkJICAgICgoeCkgPDwgNikKICNkZWZpbmUgUzNDMjQxMF9MQ0RDT04yX1ZTUFcoeCkJICAgICgoeCkgPDwgMCkKIAorI2RlZmluZSBTM0MyNDEwX0xDRENPTjJfR0VUX1ZCUEQoeCkgKCAoKHgpID4+IDI0KSAmIDB4RkYpCisjZGVmaW5lIFMzQzI0MTBfTENEQ09OMl9HRVRfVkZQRCh4KSAoICgoeCkgPj4gIDYpICYgMHhGRikKKyNkZWZpbmUgUzNDMjQxMF9MQ0RDT04yX0dFVF9WU1BXKHgpICggKCh4KSA+PiAgMCkgJiAweDNGKQorCiAjZGVmaW5lIFMzQzI0MTBfTENEQ09OM19IQlBEKHgpCSAgICAoKHgpIDw8IDE5KQogI2RlZmluZSBTM0MyNDEwX0xDRENPTjNfV0RMWSh4KQkgICAgKCh4KSA8PCAxOSkKICNkZWZpbmUgUzNDMjQxMF9MQ0RDT04zX0hPWlZBTCh4KSAgICgoeCkgPDwgOCkKICNkZWZpbmUgUzNDMjQxMF9MQ0RDT04zX0hGUEQoeCkJICAgICgoeCkgPDwgMCkKICNkZWZpbmUgUzNDMjQxMF9MQ0RDT04zX0xJTkVCTEFOSyh4KSgoeCkgPDwgMCkKIAorI2RlZmluZSBTM0MyNDEwX0xDRENPTjNfR0VUX0hCUEQoeCkgKCAoKHgpID4+IDE5KSAmIDB4N0YpCisjZGVmaW5lIFMzQzI0MTBfTENEQ09OM19HRVRfSEZQRCh4KSAoICgoeCkgPj4gIDApICYgMHhGRikKKwogI2RlZmluZSBTM0MyNDEwX0xDRENPTjRfTVZBTCh4KQkgICAgKCh4KSA8PCA4KQogI2RlZmluZSBTM0MyNDEwX0xDRENPTjRfSFNQVyh4KQkgICAgKCh4KSA8PCAwKQogI2RlZmluZSBTM0MyNDEwX0xDRENPTjRfV0xIKHgpCSAgICAoKHgpIDw8IDApCiAKKyNkZWZpbmUgUzNDMjQxMF9MQ0RDT040X0dFVF9IU1BXKHgpICggKCh4KSA+PiAgMCkgJiAweEZGKQorCiAjZGVmaW5lIFMzQzI0MTBfTENEQ09ONV9CUFAyNEJMCSAgICAoMTw8MTIpCiAjZGVmaW5lIFMzQzI0MTBfTENEQ09ONV9GUk01NjUJICAgICgxPDwxMSkKICNkZWZpbmUgUzNDMjQxMF9MQ0RDT041X0lOVlZDTEsJICAgICgxPDwxMCkKQEAgLTEwMCwxMCArMTExLDE2IEBACiAjZGVmaW5lIFMzQzI0MTBfRElUSE1PREUgICBTM0MyNDEwX0xDRFJFRygweDRDKQogI2RlZmluZSBTM0MyNDEwX1RQQUwJICAgUzNDMjQxMF9MQ0RSRUcoMHg1MCkKIAorI2RlZmluZSBTM0MyNDEwX1RQQUxfRU4JCSgxPDwyNCkKKwogLyogaW50ZXJydXB0IGluZm8gKi8KICNkZWZpbmUgUzNDMjQxMF9MQ0RJTlRQTkQgIFMzQzI0MTBfTENEUkVHKDB4NTQpCiAjZGVmaW5lIFMzQzI0MTBfTENEU1JDUE5EICBTM0MyNDEwX0xDRFJFRygweDU4KQogI2RlZmluZSBTM0MyNDEwX0xDRElOVE1TSyAgUzNDMjQxMF9MQ0RSRUcoMHg1QykKKyNkZWZpbmUgUzNDMjQxMF9MQ0RJTlRfRklXU0VMCSgxPDwyKQorI2RlZmluZQlTM0MyNDEwX0xDRElOVF9GUlNZTkMJKDE8PDEpCisjZGVmaW5lIFMzQzI0MTBfTENESU5UX0ZJQ05UCSgxPDwwKQorCiAjZGVmaW5lIFMzQzI0MTBfTFBDU0VMCSAgIFMzQzI0MTBfTENEUkVHKDB4NjApCiAKICNkZWZpbmUgUzNDMjQxMF9URlRQQUwoeCkgIFMzQzI0MTBfTENEUkVHKCgweDQwMCArICh4KSo0KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9oYXJkd2FyZS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL2hhcmR3YXJlLmgKaW5kZXggMTBjNjJkYi4uMTljM2IxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL2hhcmR3YXJlLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL2hhcmR3YXJlLmgKQEAgLTQ5LDIzICs0OSw5IEBACiAgICAoICgoKHgpJjB4MDBmZmZmZmYpIHwgKCgoeCkmKDB4MzAwMDAwMDA+PlZJT19TSElGVCkpPDxWSU9fU0hJRlQpKSArIFBJT19TVEFSVCApCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKLSNpZiAwCi0jIGRlZmluZSBfX1JFRyh4KQkoKigodm9sYXRpbGUgdTMyICopaW9fcDJ2KHgpKSkKLSNlbHNlCi0vKgotICogVGhpcyBfX1JFRygpIHZlcnNpb24gZ2l2ZXMgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgb25lIGFib3ZlLCAgZXhjZXB0Ci0gKiB0aGF0IHdlIGFyZSBmb29saW5nIGdjYyBzb21laG93IHNvIGl0IGdlbmVyYXRlcyBmYXIgYmV0dGVyIGFuZCBzbWFsbGVyCi0gKiBhc3NlbWJseSBjb2RlIGZvciBhY2Nlc3MgdG8gY29udGlnb3VzIHJlZ2lzdGVycy4gIEl0J3MgYSBzaGFtZSB0aGF0IGdjYwotICogZG9lc24ndCBndWVzcyB0aGlzIGJ5IGl0c2VsZi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSB1MzIgb2Zmc2V0WzQwOTZdOyB9IF9fcmVnYmFzZTsKLSMgZGVmaW5lIF9fUkVHUCh4KQkoKF9fcmVnYmFzZSAqKSgoeCkmfjQwOTUpKS0+b2Zmc2V0WygoeCkmNDA5NSk+PjJdCi0jIGRlZmluZSBfX1JFRyh4KQlfX1JFR1AoaW9fcDJ2KHgpKQotI2VuZGlmCi0KLSMgZGVmaW5lIF9fUFJFRyh4KQkoaW9fdjJwKCh1MzIpJih4KSkpCisjIGRlZmluZSBfX1JFRyh4KQkoKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWlvX3Aydih4KSkpCisjIGRlZmluZSBfX1BSRUcoeCkJKGlvX3YycCgodW5zaWduZWQgbG9uZykmKHgpKSkKIAogI2Vsc2UKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tYXJtL2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTM2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXV4dmVjLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9fQVNNQVJNX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNQVJNX0FVWFZFQ19ICisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLWFybS9jYWNoZWZsdXNoLmgKaW5kZXggMDM1Y2RjZi4uZTgxYmFmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vY2FjaGVmbHVzaC5oCkBAIC0yNTYsNyArMjU2LDcgQEAKICAqIENvbnZlcnQgY2FsbHMgdG8gb3VyIGNhbGxpbmcgY29udmVudGlvbi4KICAqLwogI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJX19jcHVjX2ZsdXNoX2tlcm5fYWxsKCkKLQorI2lmbmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1ZJUFQKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9jYWNoZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlpZiAoY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgbW0tPmNwdV92bV9tYXNrKSkKQEAgLTI3OSw2ICsyNzksMTEgQEAKIAkJX19jcHVjX2ZsdXNoX3VzZXJfcmFuZ2UoYWRkciwgYWRkciArIFBBR0VfU0laRSwgdm1hLT52bV9mbGFncyk7CiAJfQogfQorI2Vsc2UKK2V4dGVybiB2b2lkIGZsdXNoX2NhY2hlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKK2V4dGVybiB2b2lkIGZsdXNoX2NhY2hlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CitleHRlcm4gdm9pZCBmbHVzaF9jYWNoZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHVzZXJfYWRkciwgdW5zaWduZWQgbG9uZyBwZm4pOworI2VuZGlmCiAKIC8qCiAgKiBmbHVzaF9jYWNoZV91c2VyX3JhbmdlIGlzIHVzZWQgd2hlbiB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1hcm0vZmNudGwuaAppbmRleCA0ODViNmJkLi5hODBiNjYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vZmNudGwuaApAQCAtMSw4NyArMSwxMSBAQAogI2lmbmRlZiBfQVJNX0ZDTlRMX0gKICNkZWZpbmUgX0FSTV9GQ05UTF9ICiAKLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgT19ESVJFQ1RPUlkJIDA0MDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCiAjZGVmaW5lIE9fTk9GT0xMT1cJMDEwMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KICNkZWZpbmUgT19ESVJFQ1QJMDIwMDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAtIGN1cnJlbnRseSBpZ25vcmVkICovCiAjZGVmaW5lIE9fTEFSR0VGSUxFCTA0MDAwMDAKLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCiAKLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CiAKLSNkZWZpbmUgRl9TRVRPV04JOAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUT1dOCTkJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX1NFVFNJRwkxMAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUU0lHCTExCS8qICBmb3Igc29ja2V0cy4gKi8KLQotI2RlZmluZSBGX0dFVExLNjQJMTIJLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KLSNkZWZpbmUgRl9TRVRMSzY0CTEzCi0jZGVmaW5lIEZfU0VUTEtXNjQJMTQKLQotLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KLSNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLwotCi0vKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLwotI2RlZmluZSBGX1JETENLCQkwCi0jZGVmaW5lIEZfV1JMQ0sJCTEKLSNkZWZpbmUgRl9VTkxDSwkJMgotCi0vKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLwotI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KLSNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCi0KLS8qIGZvciBsZWFzZXMgKi8KLSNkZWZpbmUgRl9JTlBST0dSRVNTCTE2Ci0KLS8qIG9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAqLwotI2RlZmluZSBMT0NLX1NICQkxCS8qIHNoYXJlZCBsb2NrICovCi0jZGVmaW5lIExPQ0tfRVgJCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19OQgkJNAkvKiBvcidkIHdpdGggb25lIG9mIHRoZSBhYm92ZSB0byBwcmV2ZW50Ci0JCQkJICAgYmxvY2tpbmcgKi8KLSNkZWZpbmUgTE9DS19VTgkJOAkvKiByZW1vdmUgbG9jayAqLwotCi0jZGVmaW5lIExPQ0tfTUFORAkzMgkvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrICovCi0jZGVmaW5lIExPQ0tfUkVBRAk2NAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfV1JJVEUJMTI4CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfUlcJCTE5MgkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCAmIHdyaXRlIG9wcyAqLwotCi1zdHJ1Y3QgZmxvY2sgewotCXNob3J0IGxfdHlwZTsKLQlzaG9ydCBsX3doZW5jZTsKLQlvZmZfdCBsX3N0YXJ0OwotCW9mZl90IGxfbGVuOwotCXBpZF90IGxfcGlkOwotfTsKLQotc3RydWN0IGZsb2NrNjQgewotCXNob3J0ICBsX3R5cGU7Ci0Jc2hvcnQgIGxfd2hlbmNlOwotCWxvZmZfdCBsX3N0YXJ0OwotCWxvZmZfdCBsX2xlbjsKLQlwaWRfdCAgbF9waWQ7Ci19OwotCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9mdXRleC5oIGIvaW5jbHVkZS9hc20tYXJtL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2hhcmR3YXJlL3Njb29wLmggYi9pbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvc2Nvb3AuaAppbmRleCA3ZWE3NzFmLi41Mjc0MDRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvc2Nvb3AuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvc2Nvb3AuaApAQCAtNDAsNiArNDAsMTkgQEAKIAl1bnNpZ25lZCBzaG9ydCBpb19kaXI7CiB9OwogCisvKiBTdHJ1Y3R1cmUgZm9yIGxpbmtpbmcgc2Nvb3AgZGV2aWNlcyB0byBQQ01DSUEgc29ja2V0cyAqLworc3RydWN0IHNjb29wX3BjbWNpYV9kZXYgeworCXN0cnVjdCBkZXZpY2UgKmRldjsgICAgIC8qIFBvaW50ZXIgdG8gdGhpcyBzb2NrZXQncyBzY29vcCBkZXZpY2UgKi8KKwlpbnQJaXJxOyAgICAgICAgICAgICAgICAvKiBpcnEgZm9yIHNvY2tldCAqLworCWludCBjZF9pcnE7CisJY29uc3QgY2hhciAqY2RfaXJxX3N0cjsKKwl1bnNpZ25lZCBjaGFyIGtlZXBfdnM7CisJdW5zaWduZWQgY2hhciBrZWVwX3JkOworfTsKKworZXh0ZXJuIGludCBzY29vcF9udW07CitleHRlcm4gc3RydWN0IHNjb29wX3BjbWNpYV9kZXYgKnNjb29wX2RldnM7CisKIHZvaWQgcmVzZXRfc2Nvb3Aoc3RydWN0IGRldmljZSAqZGV2KTsKIHVuc2lnbmVkIHNob3J0IHNldF9zY29vcF9ncGlvKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgYml0KTsKIHVuc2lnbmVkIHNob3J0IHJlc2V0X3Njb29wX2dwaW8oc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBiaXQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2hkcmVnLmggYi9pbmNsdWRlL2FzbS1hcm0vaGRyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZmQxYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9oZHJlZy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL21hY2gvaXJxLmggYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC9pcnEuaAppbmRleCBhNDNhMzUzLi4wY2U2Y2E1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vbWFjaC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC9pcnEuaApAQCAtNDIsMTEgKzQyLDExIEBACiAJLyoKIAkgKiBTZXQgdGhlIHR5cGUgb2YgdGhlIElSUS4KIAkgKi8KLQlpbnQgKCp0eXBlKSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CisJaW50ICgqc2V0X3R5cGUpKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIAkvKgogCSAqIFNldCB3YWtldXAtZW5hYmxlIG9uIHRoZSBzZWxlY3RlZCBJUlEKIAkgKi8KLQlpbnQgKCp3YWtlKSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CisJaW50ICgqc2V0X3dha2UpKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIAogI2lmZGVmIENPTkZJR19TTVAKIAkvKgpAQCAtOTIsNiArOTIsMTQgQEAKIGV4dGVybiBzdHJ1Y3QgaXJxZGVzYyBpcnFfZGVzY1tdOwogCiAvKgorICogSGVscGZ1bCBpbmxpbmUgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaXJxIGRlc2NyaXB0b3IgaGFuZGxlcnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXNjX2hhbmRsZV9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWRlc2MtPmhhbmRsZShpcnEsIGRlc2MsIHJlZ3MpOworfQorCisvKgogICogVGhpcyBpcyBpbnRlcm5hbC4gIERvIG5vdCB1c2UgaXQuCiAgKi8KIGV4dGVybiB2b2lkICgqaW5pdF9hcmNoX2lycSkodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vbWFjaC90aW1lLmggYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC90aW1lLmgKaW5kZXggMmNmMjc5YS4uOTZjNmRiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL21hY2gvdGltZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9tYWNoL3RpbWUuaApAQCAtNDcsOSArNDcsNyBAQAogCiAjaWZkZWYgQ09ORklHX05PX0lETEVfSFoKIAotI2RlZmluZSBEWU5fVElDS19TS0lQUElORwkoMSA8PCAyKQogI2RlZmluZSBEWU5fVElDS19FTkFCTEVECSgxIDw8IDEpCi0jZGVmaW5lIERZTl9USUNLX1NVSVRBQkxFCSgxIDw8IDApCiAKIHN0cnVjdCBkeW5fdGlja190aW1lciB7CiAJdW5zaWduZWQgaW50CXN0YXRlOwkJCS8qIEN1cnJlbnQgc3RhdGUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wYWdlLmggYi9pbmNsdWRlL2FzbS1hcm0vcGFnZS5oCmluZGV4IDAxOWM0NWQuLjRkYTFkNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3BhZ2UuaApAQCAtMTYzLDIwICsxNjMsNiBAQAogLyogdGhlIHVwcGVyLW1vc3QgcGFnZSB0YWJsZSBwb2ludGVyICovCiBleHRlcm4gcG1kX3QgKnRvcF9wbWQ7CiAKLS8qIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyICovCi1zdGF0aWMgaW5saW5lIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBvcmRlcjsKLQotCXNpemUgPSAoc2l6ZS0xKSA+PiAoUEFHRV9TSElGVC0xKTsKLQlvcmRlciA9IC0xOwotCWRvIHsKLQkJc2l6ZSA+Pj0gMTsKLQkJb3JkZXIrKzsKLQl9IHdoaWxlIChzaXplKTsKLQlyZXR1cm4gb3JkZXI7Ci19Ci0KICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CiAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCkBAIC0xODYsNCArMTcyLDYgQEAKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGNpLmggYi9pbmNsdWRlL2FzbS1hcm0vcGNpLmgKaW5kZXggMzhlYTU4OS4uZWFkM2NlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9wY2kuaApAQCAtNjQsNiArNjQsMTkgQEAKIHBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAogCQkJc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24pOwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZXNvdXJjZSAqCitwY2liaW9zX3NlbGVjdF9yb290KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QgPSBOVUxMOworCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQlyb290ID0gJmlvcG9ydF9yZXNvdXJjZTsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlyb290ID0gJmlvbWVtX3Jlc291cmNlOworCisJcmV0dXJuIHJvb3Q7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLWFybS9zcGlubG9jay5oCmluZGV4IDFmOTA2ZDAuLmNiNDkwNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9zcGlubG9jay5oCkBAIC0xNiwyMSArMTYsMTQgQEAKICAqIFVubG9ja2VkIHZhbHVlOiAwCiAgKiBMb2NrZWQgdmFsdWU6IDEKICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gc3BpbmxvY2tfdDsKIAotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQJKHNwaW5sb2NrX3QpIHsgMCB9CisjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpCQkoKHgpLT5sb2NrICE9IDApCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQobG9jaykgXAorCWRvIHsgd2hpbGUgKF9fcmF3X3NwaW5faXNfbG9ja2VkKGxvY2spKSBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoMCkKIAotI2RlZmluZSBzcGluX2xvY2tfaW5pdCh4KQlkbyB7ICooeCkgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpCSgoeCktPmxvY2sgIT0gMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdCh4KQlkbyB7IGJhcnJpZXIoKTsgfSB3aGlsZSAoc3Bpbl9pc19sb2NrZWQoeCkpCi0jZGVmaW5lIF9yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfcmF3X3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAKQEAgLTQ3LDcgKzQwLDcgQEAKIAlzbXBfbWIoKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX3Jhd19zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3NwaW5fdHJ5bG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKIApAQCAtNjcsNyArNjAsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAlzbXBfbWIoKTsKIApAQCAtODAsMjMgKzczLDE0IEBACiAKIC8qCiAgKiBSV0xPQ0tTCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHJ3bG9ja190OwotCi0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQJKHJ3bG9ja190KSB7IDAgfQotI2RlZmluZSByd2xvY2tfaW5pdCh4KQkJZG8geyAqKHgpID0gUldfTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgcndsb2NrX2lzX2xvY2tlZCh4KQkoKigodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKHgpKSAhPSAwKQotCi0vKgorICoKKyAqCiAgKiBXcml0ZSBsb2NrcyBhcmUgZWFzeSAtIHdlIGp1c3Qgc2V0IGJpdCAzMS4gIFdoZW4gdW5sb2NraW5nLCB3ZSBjYW4KICAqIGp1c3Qgd3JpdGUgemVybyBzaW5jZSB0aGUgbG9jayBpcyBleGNsdXNpdmVseSBoZWxkLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd193cml0ZV9sb2NrKHJ3bG9ja190ICpydykKKyNkZWZpbmUgcndsb2NrX2lzX2xvY2tlZCh4KQkoKigodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKHgpKSAhPSAwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfbG9jayhyd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAKQEAgLTExMyw3ICs5Nyw3IEBACiAJc21wX21iKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJ3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKIApAQCAtMTMzLDcgKzExNyw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd193cml0ZV91bmxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCXNtcF9tYigpOwogCkBAIC0xNTYsNyArMTQwLDcgQEAKICAqIGN1cnJlbnRseSBhY3RpdmUuICBIb3dldmVyLCB3ZSBrbm93IHdlIHdvbid0IGhhdmUgYW55IHdyaXRlCiAgKiBsb2Nrcy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfcmVhZF9sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcCwgdG1wMjsKIApAQCAtMTczLDcgKzE1Nyw3IEBACiAJc21wX21iKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3JlYWRfdW5sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX3VubG9jayhyd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAsIHRtcDI7CiAKQEAgLTE5MCw2ICsxNzQsNiBAQAogCTogImNjIik7CiB9CiAKLSNkZWZpbmUgX3Jhd19yZWFkX3RyeWxvY2sobG9jaykgZ2VuZXJpY19yYXdfcmVhZF90cnlsb2NrKGxvY2spCisjZGVmaW5lIF9fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSBnZW5lcmljX19yYXdfcmVhZF90cnlsb2NrKGxvY2spCiAKICNlbmRpZiAvKiBfX0FTTV9TUElOTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vc3BpbmxvY2tfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLWFybS9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZTgzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX19BU01fU1BJTkxPQ0tfVFlQRVNfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKK30gcmF3X3NwaW5sb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VECXsgMCB9CisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKK30gcmF3X3J3bG9ja190OworCisjZGVmaW5lIF9fUkFXX1JXX0xPQ0tfVU5MT0NLRUQJCXsgMCB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3R5cGVzLmggYi9pbmNsdWRlL2FzbS1hcm0vdHlwZXMuaAppbmRleCBmNGM5MmU0Li4yMjk5MmVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vdHlwZXMuaApAQCAtNTIsOCArNTIsNiBAQAogdHlwZWRlZiB1MzIgZG1hX2FkZHJfdDsKIHR5cGVkZWYgdTMyIGRtYTY0X2FkZHJfdDsKIAotdHlwZWRlZiB1bnNpZ25lZCBpbnQga21lbV9idWZjdGxfdDsKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLWFybS91YWNjZXNzLmgKaW5kZXggYTdjMDE4Yi4uYTJmZGFkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vdWFjY2Vzcy5oCkBAIC03NywxMiArNzcsNiBAQAogCiAjZGVmaW5lIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkJKF9fcmFuZ2Vfb2soYWRkcixzaXplKSA9PSAwKQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpID8gMCA6IC1FRkFVTFQ7Ci19Ci0KIC8qCiAgKiBTaW5nbGUtdmFsdWUgdHJhbnNmZXIgcm91dGluZXMuICBUaGV5IGF1dG9tYXRpY2FsbHkgdXNlIHRoZSByaWdodAogICogc2l6ZSBpZiB3ZSBqdXN0IGhhdmUgdGhlIHJpZ2h0IHBvaW50ZXIgdHlwZS4gIE5vdGUgdGhhdCB0aGUgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1hcm0vdW5pc3RkLmgKaW5kZXggYWJiMzZlNS4uYzQ5ZGY2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS91bmlzdGQuaApAQCAtMjk1LDcgKzI5NSw3IEBACiAjZGVmaW5lIF9fTlJfZnN0YXRmczY0CQkJKF9fTlJfU1lTQ0FMTF9CQVNFKzI2NykKICNkZWZpbmUgX19OUl90Z2tpbGwJCQkoX19OUl9TWVNDQUxMX0JBU0UrMjY4KQogI2RlZmluZSBfX05SX3V0aW1lcwkJCShfX05SX1NZU0NBTExfQkFTRSsyNjkpCi0jZGVmaW5lIF9fTlJfZmFkdmlzZTY0XzY0CQkoX19OUl9TWVNDQUxMX0JBU0UrMjcwKQorI2RlZmluZSBfX05SX2FybV9mYWR2aXNlNjRfNjQJCShfX05SX1NZU0NBTExfQkFTRSsyNzApCiAjZGVmaW5lIF9fTlJfcGNpY29uZmlnX2lvYmFzZQkJKF9fTlJfU1lTQ0FMTF9CQVNFKzI3MSkKICNkZWZpbmUgX19OUl9wY2ljb25maWdfcmVhZAkJKF9fTlJfU1lTQ0FMTF9CQVNFKzI3MikKICNkZWZpbmUgX19OUl9wY2ljb25maWdfd3JpdGUJCShfX05SX1NZU0NBTExfQkFTRSsyNzMpCkBAIC0zNTUsNiArMzU1LDkgQEAKICNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQJCShfX05SX1NZU0NBTExfQkFTRSszMTYpCiAjZGVmaW5lIF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gJCShfX05SX1NZU0NBTExfQkFTRSszMTcpCiAjZGVmaW5lIF9fTlJfaW5vdGlmeV9ybV93YXRjaAkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMxOCkKKyNkZWZpbmUgX19OUl9tYmluZAkJCShfX05SX1NZU0NBTExfQkFTRSszMTkpCisjZGVmaW5lIF9fTlJfZ2V0X21lbXBvbGljeQkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMyMCkKKyNkZWZpbmUgX19OUl9zZXRfbWVtcG9saWN5CQkoX19OUl9TWVNDQUxMX0JBU0UrMzIxKQogCiAvKgogICogVGhlIGZvbGxvd2luZyBTV0lzIGFyZSBBUk0gcHJpdmF0ZS4KQEAgLTUxNSw3ICs1MTgsNiBAQAogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVElNRQogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVVRJTUUKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NPQ0tFVENBTEwKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0ZBRFZJU0U2NAogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUUEdSUAogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfTExTRUVLCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19OSUNFCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9hdXh2ZWMuaCBiL2luY2x1ZGUvYXNtLWFybTI2L2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTM2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX19BU01BUk1fQVVYVkVDX0gKKyNkZWZpbmUgX19BU01BUk1fQVVYVkVDX0gKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9mY250bC5oIGIvaW5jbHVkZS9hc20tYXJtMjYvZmNudGwuaAppbmRleCA0ODViNmJkLi5kODU5OTVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2ZjbnRsLmgKQEAgLTMsODUgKzMsMTEgQEAKIAogLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwogICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQUNDTU9ERQkgICAwMDAzCi0jZGVmaW5lIE9fUkRPTkxZCSAgICAgMDAKLSNkZWZpbmUgT19XUk9OTFkJICAgICAwMQotI2RlZmluZSBPX1JEV1IJCSAgICAgMDIKLSNkZWZpbmUgT19DUkVBVAkJICAgMDEwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19FWENMCQkgICAwMjAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX05PQ1RUWQkgICAwNDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX1RSVU5DCQkgIDAxMDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0FQUEVORAkgIDAyMDAwCi0jZGVmaW5lIE9fTk9OQkxPQ0sJICAwNDAwMAotI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCi0jZGVmaW5lIE9fU1lOQwkJIDAxMDAwMAotI2RlZmluZSBGQVNZTkMJCSAwMjAwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBPX0RJUkVDVE9SWQkgMDQwMDAwCS8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KICNkZWZpbmUgT19OT0ZPTExPVwkwMTAwMDAwCS8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLwogI2RlZmluZSBPX0RJUkVDVAkwMjAwMDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50IC0gY3VycmVudGx5IGlnbm9yZWQgKi8KICNkZWZpbmUgT19MQVJHRUZJTEUJMDQwMDAwMAotI2RlZmluZSBPX05PQVRJTUUJMDEwMDAwMDAKIAotI2RlZmluZSBGX0RVUEZECQkwCS8qIGR1cCAqLwotI2RlZmluZSBGX0dFVEZECQkxCS8qIGdldCBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfU0VURkQJCTIJLyogc2V0L2NsZWFyIGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9HRVRGTAkJMwkvKiBnZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX1NFVEZMCQk0CS8qIHNldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfR0VUTEsJCTUKLSNkZWZpbmUgRl9TRVRMSwkJNgotI2RlZmluZSBGX1NFVExLVwk3CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KIAotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0jZGVmaW5lIEZfR0VUTEs2NAkxMgkvKiAgdXNpbmcgJ3N0cnVjdCBmbG9jazY0JyAqLwotI2RlZmluZSBGX1NFVExLNjQJMTMKLSNkZWZpbmUgRl9TRVRMS1c2NAkxNAotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCW9mZl90IGxfc3RhcnQ7Ci0Jb2ZmX3QgbF9sZW47Ci0JcGlkX3QgbF9waWQ7Ci19OwotCi1zdHJ1Y3QgZmxvY2s2NCB7Ci0Jc2hvcnQgIGxfdHlwZTsKLQlzaG9ydCAgbF93aGVuY2U7Ci0JbG9mZl90IGxfc3RhcnQ7Ci0JbG9mZl90IGxfbGVuOwotCXBpZF90ICBsX3BpZDsKLX07Ci0KLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLWFybTI2L2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCWNhc2UgRlVURVhfT1BfQUREOgorCWNhc2UgRlVURVhfT1BfT1I6CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCWNhc2UgRlVURVhfT1BfWE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9oYXJkaXJxLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9oYXJkaXJxLmgKaW5kZXggNzkxZWUxZC4uZGMyOGRhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvaGFyZGlycS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2hhcmRpcnEuaApAQCAtMjIsOCArMjIsNiBAQAogIyBlcnJvciBIQVJESVJRX0JJVFMgaXMgdG9vIGxvdyEKICNlbmRpZgogCi0jZGVmaW5lIGlycV9lbnRlcigpCQkocHJlZW1wdF9jb3VudCgpICs9IEhBUkRJUlFfT0ZGU0VUKQotCiAjaWZuZGVmIENPTkZJR19TTVAKIAogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBfX2RvX3NvZnRpcnEodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9oZHJlZy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvaGRyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZmQxYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2hkcmVnLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9wYWdlLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9wYWdlLmgKaW5kZXggYzMzNDA3OS4uZDNmMjNhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L3BhZ2UuaApAQCAtODksMjAgKzg5LDYgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi0vKiBQdXJlIDJebiB2ZXJzaW9uIG9mIGdldF9vcmRlciAqLwotc3RhdGljIGlubGluZSBpbnQgZ2V0X29yZGVyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpbnQgb3JkZXI7Ci0KLQlzaXplID0gKHNpemUtMSkgPj4gKFBBR0VfU0hJRlQtMSk7Ci0Jb3JkZXIgPSAtMTsKLQlkbyB7Ci0JCXNpemUgPj49IDE7Ci0JCW9yZGVyKys7Ci0JfSB3aGlsZSAoc2l6ZSk7Ci0JcmV0dXJuIG9yZGVyOwotfQotCiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwpAQCAtMTEyLDQgKzk4LDYgQEAKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi90eXBlcy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvdHlwZXMuaAppbmRleCA1NmNiZTU3Li44MWJkMzU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L3R5cGVzLmgKQEAgLTUyLDggKzUyLDYgQEAKIHR5cGVkZWYgdTMyIGRtYV9hZGRyX3Q7CiB0eXBlZGVmIHUzMiBkbWE2NF9hZGRyX3Q7CiAKLXR5cGVkZWYgdW5zaWduZWQgaW50IGttZW1fYnVmY3RsX3Q7Ci0KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLWFybTI2L3VhY2Nlc3MuaAppbmRleCBhYjljZTM4Li4zZjJkZDEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvdWFjY2Vzcy5oCkBAIC00MCwxMiArNDAsNiBAQAogCiAjZGVmaW5lIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkJKF9fcmFuZ2Vfb2soYWRkcixzaXplKSA9PSAwKQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpID8gMCA6IC1FRkFVTFQ7Ci19Ci0KIC8qCiAgKiBTaW5nbGUtdmFsdWUgdHJhbnNmZXIgcm91dGluZXMuICBUaGV5IGF1dG9tYXRpY2FsbHkgdXNlIHRoZSByaWdodAogICogc2l6ZSBpZiB3ZSBqdXN0IGhhdmUgdGhlIHJpZ2h0IHBvaW50ZXIgdHlwZS4gIE5vdGUgdGhhdCB0aGUgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjMwYjAxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX19BU01DUklTX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNQ1JJU19BVVhWRUNfSAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvZmNudGwuaCBiL2luY2x1ZGUvYXNtLWNyaXMvZmNudGwuaAppbmRleCA2MWM1NjMyLi40NmFiMTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9mY250bC5oCkBAIC0xLDkwICsxIEBACi0jaWZuZGVmIF9DUklTX0ZDTlRMX0gKLSNkZWZpbmUgX0NSSVNfRkNOVExfSAotCi0vKiB2ZXJiYXRpbSBjb3B5IG9mIGkzODYgdmVyc2lvbiAqLwotCi0vKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCi0gICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgT19BQ0NNT0RFCSAgIDAwMDMKLSNkZWZpbmUgT19SRE9OTFkJICAgICAwMAotI2RlZmluZSBPX1dST05MWQkgICAgIDAxCi0jZGVmaW5lIE9fUkRXUgkJICAgICAwMgotI2RlZmluZSBPX0NSRUFUCQkgICAwMTAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0VYQ0wJCSAgIDAyMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fTk9DVFRZCSAgIDA0MDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fVFJVTkMJCSAgMDEwMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fQVBQRU5ECSAgMDIwMDAKLSNkZWZpbmUgT19OT05CTE9DSwkgIDA0MDAwCi0jZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKLSNkZWZpbmUgT19TWU5DCQkgMDEwMDAwCi0jZGVmaW5lIEZBU1lOQwkJIDAyMDAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIE9fRElSRUNUCSAwNDAwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgLSBjdXJyZW50bHkgaWdub3JlZCAqLwotI2RlZmluZSBPX0xBUkdFRklMRQkwMTAwMDAwCi0jZGVmaW5lIE9fRElSRUNUT1JZCTAyMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XCTA0MDAwMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCi0jZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAotCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQgZl9mbGFncyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIG1vcmUgZmxhZ3MgKGNsb2V4ZWMpICovCi0jZGVmaW5lIEZfU0VURkwJCTQKLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKLQotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0jZGVmaW5lIEZfR0VUTEs2NCAgICAgIDEyICAgICAgLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KLSNkZWZpbmUgRl9TRVRMSzY0ICAgICAgMTMKLSNkZWZpbmUgRl9TRVRMS1c2NCAgICAgMTQKLQotLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KLSNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLwotCi0vKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLwotI2RlZmluZSBGX1JETENLCQkwCi0jZGVmaW5lIEZfV1JMQ0sJCTEKLSNkZWZpbmUgRl9VTkxDSwkJMgotCi0vKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLwotI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KLSNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCi0KLS8qIGZvciBsZWFzZXMgKi8KLSNkZWZpbmUgRl9JTlBST0dSRVNTICAgMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5EICAgICAgMzIgICAgICAvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrICovCi0jZGVmaW5lIExPQ0tfUkVBRCAgICAgIDY0ICAgICAgLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFICAgICAxMjggICAgIC8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfUlcgICAgICAgIDE5MiAgICAgLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLX07Ci0KLXN0cnVjdCBmbG9jazY0IHsKLQlzaG9ydCAgbF90eXBlOwotCXNob3J0ICBsX3doZW5jZTsKLQlsb2ZmX3QgbF9zdGFydDsKLQlsb2ZmX3QgbF9sZW47Ci0JcGlkX3QgIGxfcGlkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UgIDEwMjQKLQotI2VuZGlmCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLWNyaXMvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9pcnEuaCBiL2luY2x1ZGUvYXNtLWNyaXMvaXJxLmgKaW5kZXggOGU3ODdmZC4uNGZhYjVjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2lycS5oCkBAIC0xLDYgKzEsMTEgQEAKICNpZm5kZWYgX0FTTV9JUlFfSAogI2RlZmluZSBfQVNNX0lSUV9ICiAKKy8qCisgKiBJUlEgbGluZSBzdGF0dXMgbWFjcm8gSVJRX1BFUl9DUFUgaXMgdXNlZAorICovCisjZGVmaW5lIEFSQ0hfSEFTX0lSUV9QRVJfQ1BVCisKICNpbmNsdWRlIDxhc20vYXJjaC9pcnEuaD4KIAogZXh0ZXJuIF9faW5saW5lX18gaW50IGlycV9jYW5vbmljYWxpemUoaW50IGlycSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvcGFnZS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9wYWdlLmgKaW5kZXggYmJmMTdiZC4uYzk5YzQ3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9wYWdlLmgKQEAgLTcwLDE5ICs3MCw2IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLS8qIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyICovCi1zdGF0aWMgaW5saW5lIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBvcmRlcjsKLQotCXNpemUgPSAoc2l6ZS0xKSA+PiAoUEFHRV9TSElGVC0xKTsKLQlvcmRlciA9IC0xOwotCWRvIHsKLQkJc2l6ZSA+Pj0gMTsKLQkJb3JkZXIrKzsKLQl9IHdoaWxlIChzaXplKTsKLQlyZXR1cm4gb3JkZXI7Ci19CiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTCShWTV9SRUFEIHwgVk1fV1JJVEUgfCBWTV9FWEVDIHwgXApAQCAtOTAsNSArNzcsNyBAQAogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgorCiAjZW5kaWYgLyogX0NSSVNfUEFHRV9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvdHlwZXMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvdHlwZXMuaAppbmRleCA4ZmE2ZDZjLi44NDU1N2M5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy90eXBlcy5oCkBAIC01Miw4ICs1Miw2IEBACiB0eXBlZGVmIHUzMiBkbWFfYWRkcl90OwogdHlwZWRlZiB1MzIgZG1hNjRfYWRkcl90OwogCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGttZW1fYnVmY3RsX3Q7Ci0KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy91YWNjZXNzLmgKaW5kZXggNmRiMTcyMi4uN2Q1MDA4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy91YWNjZXNzLmgKQEAgLTkxLDEzICs5MSw2IEBACiAjZGVmaW5lIF9fYWNjZXNzX29rKGFkZHIsc2l6ZSkgKF9fa2VybmVsX29rIHx8IF9fdXNlcl9vaygoYWRkciksKHNpemUpKSkKICNkZWZpbmUgYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKSBfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZykoYWRkciksKHNpemUpKQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLWV4dGVybiBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKiBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQotCiAjaW5jbHVkZSA8YXNtL2FyY2gvdWFjY2Vzcy5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tZnJ2L2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NzEwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1mcnYvYXV4dmVjLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9fRlJWX0FVWFZFQ19ICisjZGVmaW5lIF9fRlJWX0FVWFZFQ19ICisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1mcnYvZmNudGwuaAppbmRleCBkNjFiOTk5Li40NmFiMTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvZmNudGwuaApAQCAtMSw4OCArMSBAQAotI2lmbmRlZiBfQVNNX0ZDTlRMX0gKLSNkZWZpbmUgX0FTTV9GQ05UTF9ICi0KLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgT19ESVJFQ1QJIDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLwotI2RlZmluZSBPX0xBUkdFRklMRQkwMTAwMDAwCi0jZGVmaW5lIE9fRElSRUNUT1JZCTAyMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XCTA0MDAwMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCi0jZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAotCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKLQotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0jZGVmaW5lIEZfR0VUTEs2NAkxMgkvKiAgdXNpbmcgJ3N0cnVjdCBmbG9jazY0JyAqLwotI2RlZmluZSBGX1NFVExLNjQJMTMKLSNkZWZpbmUgRl9TRVRMS1c2NAkxNAotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCW9mZl90IGxfc3RhcnQ7Ci0Jb2ZmX3QgbF9sZW47Ci0JcGlkX3QgbF9waWQ7Ci19OwotCi1zdHJ1Y3QgZmxvY2s2NCB7Ci0Jc2hvcnQgIGxfdHlwZTsKLQlzaG9ydCAgbF93aGVuY2U7Ci0JbG9mZl90IGxfc3RhcnQ7Ci0JbG9mZl90IGxfbGVuOwotCXBpZF90ICBsX3BpZDsKLX07Ci0KLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKLSNlbmRpZiAvKiBfQVNNX0ZDTlRMX0ggKi8KLQorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLWZydi9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1mcnYvZnV0ZXguaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9BU01fRlVURVhfSAorI2RlZmluZSBfQVNNX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJY2FzZSBGVVRFWF9PUF9PUjoKKwljYXNlIEZVVEVYX09QX0FORE46CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9wYWdlLmggYi9pbmNsdWRlL2FzbS1mcnYvcGFnZS5oCmluZGV4IGY3OTE0ZjEuLjRmZWJhNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3BhZ2UuaApAQCAtNDUsMjEgKzQ1LDYgQEAKIC8qIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIHRoZSAobmV4dCkgcGFnZSBib3VuZGFyeSAqLwogI2RlZmluZSBQQUdFX0FMSUdOKGFkZHIpCSgoKGFkZHIpICsgUEFHRV9TSVpFIC0gMSkgJiBQQUdFX01BU0spCiAKLS8qIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyICovCi1zdGF0aWMgaW5saW5lIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKSBfX2F0dHJpYnV0ZV9jb25zdF9fOwotc3RhdGljIGlubGluZSBpbnQgZ2V0X29yZGVyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpbnQgb3JkZXI7Ci0KLQlzaXplID0gKHNpemUgLSAxKSA+PiAoUEFHRV9TSElGVCAtIDEpOwotCW9yZGVyID0gLTE7Ci0JZG8gewotCQlzaXplID4+PSAxOwotCQlvcmRlcisrOwotCX0gd2hpbGUgKHNpemUpOwotCXJldHVybiBvcmRlcjsKLX0KLQogI2RlZmluZSBkZXZtZW1faXNfYWxsb3dlZChwZm4pCTEKIAogI2RlZmluZSBfX3BhKHZhZGRyKQkJdmlydF90b19waHlzKCh2b2lkICopIHZhZGRyKQpAQCAtMTAyLDQgKzg3LDYgQEAKICNkZWZpbmUgV0FOVF9QQUdFX1ZJUlRVQUwJMQogI2VuZGlmCiAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYWdlLmg+CisKICNlbmRpZiAvKiBfQVNNX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3R5cGVzLmggYi9pbmNsdWRlL2FzbS1mcnYvdHlwZXMuaAppbmRleCAxYTViNjU0Li41MDYwNWRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvdHlwZXMuaApAQCAtNjUsOCArNjUsNiBAQAogCiB0eXBlZGVmIHUzMiBkbWFfYWRkcl90OwogCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGttZW1fYnVmY3RsX3Q7Ci0KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1mcnYvdWFjY2Vzcy5oCmluZGV4IDMyZGM1MmU4Li45OTFiNTBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi91YWNjZXNzLmgKQEAgLTY3LDEyICs2Nyw2IEBACiAjZGVmaW5lIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgKF9fcmFuZ2Vfb2soKGFkZHIpLCAoc2l6ZSkpID09IDApCiAjZGVmaW5lIF9fYWNjZXNzX29rKGFkZHIsc2l6ZSkgKF9fcmFuZ2Vfb2soKGFkZHIpLCAoc2l6ZSkpID09IDApCiAKLS8qIHRoaXMgZnVuY3Rpb24gd2lsbCBnbyBhd2F5IHNvb24gLSB1c2UgYWNjZXNzX29rKCkgLyBfX3JhbmdlX29rKCkgaW5zdGVhZCAqLwotc3RhdGljIGlubGluZSBpbnQgX19kZXByZWNhdGVkIHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBfX3JhbmdlX29rKGFkZHIsIHNpemUpOwotfQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjM1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKQEAgLTAsMCArMSwxNDkgQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX0ZDTlRMX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX0ZDTlRMX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKKyAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLworI2RlZmluZSBPX0FDQ01PREUJMDAwMDAwMDMKKyNkZWZpbmUgT19SRE9OTFkJMDAwMDAwMDAKKyNkZWZpbmUgT19XUk9OTFkJMDAwMDAwMDEKKyNkZWZpbmUgT19SRFdSCQkwMDAwMDAwMgorI2lmbmRlZiBPX0NSRUFUCisjZGVmaW5lIE9fQ1JFQVQJCTAwMDAwMTAwCS8qIG5vdCBmY250bCAqLworI2VuZGlmCisjaWZuZGVmIE9fRVhDTAorI2RlZmluZSBPX0VYQ0wJCTAwMDAwMjAwCS8qIG5vdCBmY250bCAqLworI2VuZGlmCisjaWZuZGVmIE9fTk9DVFRZCisjZGVmaW5lIE9fTk9DVFRZCTAwMDAwNDAwCS8qIG5vdCBmY250bCAqLworI2VuZGlmCisjaWZuZGVmIE9fVFJVTkMKKyNkZWZpbmUgT19UUlVOQwkJMDAwMDEwMDAJLyogbm90IGZjbnRsICovCisjZW5kaWYKKyNpZm5kZWYgT19BUFBFTkQKKyNkZWZpbmUgT19BUFBFTkQJMDAwMDIwMDAKKyNlbmRpZgorI2lmbmRlZiBPX05PTkJMT0NLCisjZGVmaW5lIE9fTk9OQkxPQ0sJMDAwMDQwMDAKKyNlbmRpZgorI2lmbmRlZiBPX1NZTkMKKyNkZWZpbmUgT19TWU5DCQkwMDAxMDAwMAorI2VuZGlmCisjaWZuZGVmIEZBU1lOQworI2RlZmluZSBGQVNZTkMJCTAwMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KKyNlbmRpZgorI2lmbmRlZiBPX0RJUkVDVAorI2RlZmluZSBPX0RJUkVDVAkwMDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLworI2VuZGlmCisjaWZuZGVmIE9fTEFSR0VGSUxFCisjZGVmaW5lIE9fTEFSR0VGSUxFCTAwMTAwMDAwCisjZW5kaWYKKyNpZm5kZWYgT19ESVJFQ1RPUlkKKyNkZWZpbmUgT19ESVJFQ1RPUlkJMDAyMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLworI2VuZGlmCisjaWZuZGVmIE9fTk9GT0xMT1cKKyNkZWZpbmUgT19OT0ZPTExPVwkwMDQwMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KKyNlbmRpZgorI2lmbmRlZiBPX05PQVRJTUUKKyNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCisjZW5kaWYKKyNpZm5kZWYgT19OREVMQVkKKyNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSworI2VuZGlmCisKKyNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KKyNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLworI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCisjZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KKyNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLworI2lmbmRlZiBGX0dFVExLCisjZGVmaW5lIEZfR0VUTEsJCTUKKyNkZWZpbmUgRl9TRVRMSwkJNgorI2RlZmluZSBGX1NFVExLVwk3CisjZW5kaWYKKyNpZm5kZWYgRl9TRVRPV04KKyNkZWZpbmUgRl9TRVRPV04JOAkvKiBmb3Igc29ja2V0cy4gKi8KKyNkZWZpbmUgRl9HRVRPV04JOQkvKiBmb3Igc29ja2V0cy4gKi8KKyNlbmRpZgorI2lmbmRlZiBGX1NFVFNJRworI2RlZmluZSBGX1NFVFNJRwkxMAkvKiBmb3Igc29ja2V0cy4gKi8KKyNkZWZpbmUgRl9HRVRTSUcJMTEJLyogZm9yIHNvY2tldHMuICovCisjZW5kaWYKKworLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KKyNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLworCisvKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLworI2lmbmRlZiBGX1JETENLCisjZGVmaW5lIEZfUkRMQ0sJCTAKKyNkZWZpbmUgRl9XUkxDSwkJMQorI2RlZmluZSBGX1VOTENLCQkyCisjZW5kaWYKKworLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KKyNpZm5kZWYgRl9FWExDSworI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KKyNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCisjZW5kaWYKKworLyogZm9yIGxlYXNlcyAqLworI2lmbmRlZiBGX0lOUFJPR1JFU1MKKyNkZWZpbmUgRl9JTlBST0dSRVNTCTE2CisjZW5kaWYKKworLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCisjZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KKyNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLworI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKKwkJCQkgICBibG9ja2luZyAqLworI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCisKKyNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgLi4uICovCisjZGVmaW5lIExPQ0tfUkVBRAk2NAkvKiB3aGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLworI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCAmIHdyaXRlIG9wcyAqLworCisjZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0CisKKyNpZm5kZWYgSEFWRV9BUkNIX1NUUlVDVF9GTE9DSworI2lmbmRlZiBfX0FSQ0hfRkxPQ0tfUEFECisjZGVmaW5lIF9fQVJDSF9GTE9DS19QQUQKKyNlbmRpZgorCitzdHJ1Y3QgZmxvY2sgeworCXNob3J0CWxfdHlwZTsKKwlzaG9ydAlsX3doZW5jZTsKKwlvZmZfdAlsX3N0YXJ0OworCW9mZl90CWxfbGVuOworCXBpZF90CWxfcGlkOworCV9fQVJDSF9GTE9DS19QQUQKK307CisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfNjRCSVQKKworI2lmbmRlZiBGX0dFVExLNjQKKyNkZWZpbmUgRl9HRVRMSzY0CTEyCS8qICB1c2luZyAnc3RydWN0IGZsb2NrNjQnICovCisjZGVmaW5lIEZfU0VUTEs2NAkxMworI2RlZmluZSBGX1NFVExLVzY0CTE0CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0FSQ0hfU1RSVUNUX0ZMT0NLNjQKKyNpZm5kZWYgX19BUkNIX0ZMT0NLNjRfUEFECisjZGVmaW5lIF9fQVJDSF9GTE9DSzY0X1BBRAorI2VuZGlmCisKK3N0cnVjdCBmbG9jazY0IHsKKwlzaG9ydCAgbF90eXBlOworCXNob3J0ICBsX3doZW5jZTsKKwlsb2ZmX3QgbF9zdGFydDsKKwlsb2ZmX3QgbF9sZW47CisJcGlkX3QgIGxfcGlkOworCV9fQVJDSF9GTE9DSzY0X1BBRAorfTsKKyNlbmRpZgorI2VuZGlmIC8qICFDT05GSUdfNjRCSVQgKi8KKworI2VuZGlmIC8qIF9BU01fR0VORVJJQ19GQ05UTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2hkcmVnLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2hkcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTFmYmEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jd2FybmluZyA8YXNtL2hkcmVnLmg+IGlzIG9ic29sZXRlLCBwbGVhc2UgZG8gbm90IHVzZSBpdAotCi0jaWZuZGVmIF9fQVNNX0dFTkVSSUNfSERSRUdfSAotI2RlZmluZSBfX0FTTV9HRU5FUklDX0hEUkVHX0gKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGlkZV9pb3JlZ190OwotCi0jZW5kaWYgLyogX19BU01fR0VORVJJQ19IRFJFR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NmI1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BhZ2UuaApAQCAtMCwwICsxLDI2IEBACisjaWZuZGVmIF9BU01fR0VORVJJQ19QQUdFX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX1BBR0VfSAorCisjaWZkZWYgX19LRVJORUxfXworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKKy8qIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyICovCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBvcmRlcjsKKworCXNpemUgPSAoc2l6ZSAtIDEpID4+IChQQUdFX1NISUZUIC0gMSk7CisJb3JkZXIgPSAtMTsKKwlkbyB7CisJCXNpemUgPj49IDE7CisJCW9yZGVyKys7CisJfSB3aGlsZSAoc2l6ZSk7CisJcmV0dXJuIG9yZGVyOworfQorCisjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX0FTTV9HRU5FUklDX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wY2kuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGNpLmgKaW5kZXggZWUxZDhiNS4uYzM2YTc3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BjaS5oCkBAIC0zMCw2ICszMCwxOSBAQAogCXJlcy0+ZW5kID0gcmVnaW9uLT5lbmQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlc291cmNlICoKK3BjaWJpb3Nfc2VsZWN0X3Jvb3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCXN0cnVjdCByZXNvdXJjZSAqcm9vdCA9IE5VTEw7CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCXJvb3QgPSAmaW9wb3J0X3Jlc291cmNlOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCXJvb3QgPSAmaW9tZW1fcmVzb3VyY2U7CisKKwlyZXR1cm4gcm9vdDsKK30KKwogI2RlZmluZSBwY2liaW9zX3NjYW5fYWxsX2ZucyhhLCBiKQkwCiAKICNpZm5kZWYgSEFWRV9BUkNIX1BDSV9HRVRfTEVHQUNZX0lERV9JUlEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKaW5kZXggZjQwNTkzNS4uZjg2YzFlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKQEAgLTEwMSw2ICsxMDEsMjIgQEAKIH0pCiAjZW5kaWYKIAorI2lmbmRlZiBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVJfRlVMTAorI2RlZmluZSBwdGVwX2dldF9hbmRfY2xlYXJfZnVsbChfX21tLCBfX2FkZHJlc3MsIF9fcHRlcCwgX19mdWxsKQlcCisoewkJCQkJCQkJCVwKKwlwdGVfdCBfX3B0ZTsJCQkJCQkJXAorCV9fcHRlID0gcHRlcF9nZXRfYW5kX2NsZWFyKChfX21tKSwgKF9fYWRkcmVzcyksIChfX3B0ZXApKTsJXAorCV9fcHRlOwkJCQkJCQkJXAorfSkKKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1BURV9DTEVBUl9GVUxMCisjZGVmaW5lIHB0ZV9jbGVhcl9mdWxsKF9fbW0sIF9fYWRkcmVzcywgX19wdGVwLCBfX2Z1bGwpCQkJXAorZG8gewkJCQkJCQkJCVwKKwlwdGVfY2xlYXIoKF9fbW0pLCAoX19hZGRyZXNzKSwgKF9fcHRlcCkpOwkJCVwKK30gd2hpbGUgKDApCisjZW5kaWYKKwogI2lmbmRlZiBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX0ZMVVNICiAjZGVmaW5lIHB0ZXBfY2xlYXJfZmx1c2goX192bWEsIF9fYWRkcmVzcywgX19wdGVwKQkJCVwKICh7CQkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9zZWN0aW9ucy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9zZWN0aW9ucy5oCmluZGV4IDQ1MGVhZTIuLjg4NmRiZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2VjdGlvbnMuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3NlY3Rpb25zLmgKQEAgLTEyLDUgKzEyLDYgQEAKIGV4dGVybiBjaGFyIF9lZXh0cmF0ZXh0W10gX19hdHRyaWJ1dGVfXygod2VhaykpOwogZXh0ZXJuIGNoYXIgX2VuZFtdOwogZXh0ZXJuIGNoYXIgX19wZXJfY3B1X3N0YXJ0W10sIF9fcGVyX2NwdV9lbmRbXTsKK2V4dGVybiBjaGFyIF9fa3Byb2Jlc190ZXh0X3N0YXJ0W10sIF9fa3Byb2Jlc190ZXh0X2VuZFtdOwogCiAjZW5kaWYgLyogX0FTTV9HRU5FUklDX1NFQ1RJT05TX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3VuYWxpZ25lZC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmFsaWduZWQuaAppbmRleCA2YzkwZjBmLi40ZGM4ZGRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3VuYWxpZ25lZC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5hbGlnbmVkLmgKQEAgLTE2LDkgKzE2LDkgQEAKICAqIFRoZSBtYWluIHNpbmdsZS12YWx1ZSB1bmFsaWduZWQgdHJhbnNmZXIgcm91dGluZXMuCiAgKi8KICNkZWZpbmUgZ2V0X3VuYWxpZ25lZChwdHIpIFwKLQkoKF9fdHlwZW9mX18oKihwdHIpKSlfX2dldF91bmFsaWduZWQoKHB0ciksIHNpemVvZigqKHB0cikpKSkKKwlfX2dldF91bmFsaWduZWQoKHB0ciksIHNpemVvZigqKHB0cikpKQogI2RlZmluZSBwdXRfdW5hbGlnbmVkKHgscHRyKSBcCi0JX19wdXRfdW5hbGlnbmVkKCh1bnNpZ25lZCBsb25nKSh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKQorCV9fcHV0X3VuYWxpZ25lZCgoX191NjQpKHgpLCAocHRyKSwgc2l6ZW9mKCoocHRyKSkpCiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3QuICBUaGUgaWRlYSBpcyB0aGF0IHdoZW4KQEAgLTM2LDE5ICszNiwxOSBAQAogICogRWxlbWVudGFsIHVuYWxpZ25lZCBsb2FkcyAKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX191bGRxKGNvbnN0IF9fdTY0ICphZGRyKQorc3RhdGljIGlubGluZSBfX3U2NCBfX3VsZHEoY29uc3QgX191NjQgKmFkZHIpCiB7CiAJY29uc3Qgc3RydWN0IF9fdW5hX3U2NCAqcHRyID0gKGNvbnN0IHN0cnVjdCBfX3VuYV91NjQgKikgYWRkcjsKIAlyZXR1cm4gcHRyLT54OwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX191bGRsKGNvbnN0IF9fdTMyICphZGRyKQorc3RhdGljIGlubGluZSBfX3UzMiBfX3VsZGwoY29uc3QgX191MzIgKmFkZHIpCiB7CiAJY29uc3Qgc3RydWN0IF9fdW5hX3UzMiAqcHRyID0gKGNvbnN0IHN0cnVjdCBfX3VuYV91MzIgKikgYWRkcjsKIAlyZXR1cm4gcHRyLT54OwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX191bGR3KGNvbnN0IF9fdTE2ICphZGRyKQorc3RhdGljIGlubGluZSBfX3UxNiBfX3VsZHcoY29uc3QgX191MTYgKmFkZHIpCiB7CiAJY29uc3Qgc3RydWN0IF9fdW5hX3UxNiAqcHRyID0gKGNvbnN0IHN0cnVjdCBfX3VuYV91MTYgKikgYWRkcjsKIAlyZXR1cm4gcHRyLT54OwpAQCAtNzgsNyArNzgsNyBAQAogCiAjZGVmaW5lIF9fZ2V0X3VuYWxpZ25lZChwdHIsIHNpemUpICh7CQlcCiAJY29uc3Qgdm9pZCAqX19ndV9wID0gcHRyOwkJXAotCXVuc2lnbmVkIGxvbmcgdmFsOwkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgdmFsOwkJCVwKIAlzd2l0Y2ggKHNpemUpIHsJCQkJXAogCWNhc2UgMToJCQkJCVwKIAkJdmFsID0gKihjb25zdCBfX3U4ICopX19ndV9wOwlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKaW5kZXggYjNiYjMyNi4uYTljNTU0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaApAQCAtNiw2ICs2LDkgQEAKICNkZWZpbmUgVk1MSU5VWF9TWU1CT0woX3N5bV8pIF9zeW1fCiAjZW5kaWYKIAorLyogQWxpZ24gLiB0byBhIDggYnl0ZSBib3VuZGFyeSBlcXVhbHMgdG8gbWF4aW11bSBmdW5jdGlvbiBhbGlnbm1lbnQuICovCisjZGVmaW5lIEFMSUdOX0ZVTkNUSU9OKCkgIC4gPSBBTElHTig4KQorCiAjZGVmaW5lIFJPREFUQQkJCQkJCQkJXAogCS5yb2RhdGEgICAgICAgICAgIDogQVQoQUREUigucm9kYXRhKSAtIExPQURfT0ZGU0VUKSB7CQlcCiAJCSooLnJvZGF0YSkgKigucm9kYXRhLiopCQkJCQlcCkBAIC03OSwxMiArODIsNjIgQEAKIAkJVk1MSU5VWF9TWU1CT0woX19zZWN1cml0eV9pbml0Y2FsbF9lbmQpID0gLjsJCVwKIAl9CiAKKy8qIHNjaGVkLnRleHQgaXMgYWxpbmcgdG8gZnVuY3Rpb24gYWxpZ25tZW50IHRvIHNlY3VyZSB3ZSBoYXZlIHNhbWUKKyAqIGFkZHJlc3MgZXZlbiBhdCBzZWNvbmQgbGQgcGFzcyB3aGVuIGdlbmVyYXRpbmcgU3lzdGVtLm1hcCAqLwogI2RlZmluZSBTQ0hFRF9URVhUCQkJCQkJCVwKKwkJQUxJR05fRlVOQ1RJT04oKTsJCQkJCVwKIAkJVk1MSU5VWF9TWU1CT0woX19zY2hlZF90ZXh0X3N0YXJ0KSA9IC47CQkJXAogCQkqKC5zY2hlZC50ZXh0KQkJCQkJCVwKIAkJVk1MSU5VWF9TWU1CT0woX19zY2hlZF90ZXh0X2VuZCkgPSAuOwogCisvKiBzcGlubG9jay50ZXh0IGlzIGFsaW5nIHRvIGZ1bmN0aW9uIGFsaWdubWVudCB0byBzZWN1cmUgd2UgaGF2ZSBzYW1lCisgKiBhZGRyZXNzIGV2ZW4gYXQgc2Vjb25kIGxkIHBhc3Mgd2hlbiBnZW5lcmF0aW5nIFN5c3RlbS5tYXAgKi8KICNkZWZpbmUgTE9DS19URVhUCQkJCQkJCVwKKwkJQUxJR05fRlVOQ1RJT04oKTsJCQkJCVwKIAkJVk1MSU5VWF9TWU1CT0woX19sb2NrX3RleHRfc3RhcnQpID0gLjsJCQlcCiAJCSooLnNwaW5sb2NrLnRleHQpCQkJCQlcCiAJCVZNTElOVVhfU1lNQk9MKF9fbG9ja190ZXh0X2VuZCkgPSAuOworCisjZGVmaW5lIEtQUk9CRVNfVEVYVAkJCQkJCQlcCisJCUFMSUdOX0ZVTkNUSU9OKCk7CQkJCQlcCisJCVZNTElOVVhfU1lNQk9MKF9fa3Byb2Jlc190ZXh0X3N0YXJ0KSA9IC47CQlcCisJCSooLmtwcm9iZXMudGV4dCkJCQkJCVwKKwkJVk1MSU5VWF9TWU1CT0woX19rcHJvYmVzX3RleHRfZW5kKSA9IC47CisKKwkJLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisJCVN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8KKwkJdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworI2RlZmluZSBEV0FSRl9ERUJVRwkJCQkJCQlcCisJCS8qIERXQVJGIDEgKi8JCQkJCQlcCisJCS5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQkJCVwKKwkJLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0JCQlcCisJCS8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8JCQkJXAorCQkuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQkJXAorCQkuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQkJXAorCQkvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8JCQkJXAorCQkuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQkJXAorCQkuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0JCVwKKwkJLyogRFdBUkYgMiAqLwkJCQkJCVwKKwkJLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8JCQlcCisJCQkJLmdudS5saW5rb25jZS53aS4qKSB9CQkJXAorCQkuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CQlcCisJCS5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CQkJXAorCQkuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0JCQlcCisJCS5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0JCQlcCisJCS5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0JCQlcCisJCS5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CQlcCisJCS8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwkJCVwKKwkJLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0JCVwKKwkJLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0JCVwKKwkJLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0JCVwKKwkJLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQkJXAorCisJCS8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisjZGVmaW5lIFNUQUJTX0RFQlVHCQkJCQkJCVwKKwkJLnN0YWIgMCA6IHsgKiguc3RhYikgfQkJCQkJXAorCQkuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9CQkJCVwKKwkJLnN0YWIuZXhjbCAwIDogeyAqKC5zdGFiLmV4Y2wpIH0JCQlcCisJCS5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CQkJXAorCQkuc3RhYi5pbmRleCAwIDogeyAqKC5zdGFiLmluZGV4KSB9CQkJXAorCQkuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CQlcCisJCS5jb21tZW50IDAgOiB7ICooLmNvbW1lbnQpIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20taDgzMDAvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzNmZlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX19BU01IODMwMF9BVVhWRUNfSAorI2RlZmluZSBfX0FTTUg4MzAwX0FVWFZFQ19ICisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvZmNudGwuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL2ZjbnRsLmgKaW5kZXggMzU1MzUwYS4uMTk1MmNiMmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvZmNudGwuaApAQCAtMSw4NyArMSwxMSBAQAogI2lmbmRlZiBfSDgzMDBfRkNOVExfSAogI2RlZmluZSBfSDgzMDBfRkNOVExfSAogCi0vKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCi0gICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgT19BQ0NNT0RFCSAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgMDAKLSNkZWZpbmUgT19XUk9OTFkJICAgIDAxCi0jZGVmaW5lIE9fUkRXUgkJICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgMDEwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19FWENMCQkgIDAyMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fTk9DVFRZCSAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJIDAxMDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0FQUEVORAkgMDIwMDAKLSNkZWZpbmUgT19OT05CTE9DSwkgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCTAxMDAwMAotI2RlZmluZSBGQVNZTkMJCTAyMDAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIE9fRElSRUNUT1JZCTA0MDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCiAjZGVmaW5lIE9fTk9GT0xMT1cJMDEwMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KICNkZWZpbmUgT19ESVJFQ1QJMDIwMDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAtIGN1cnJlbnRseSBpZ25vcmVkICovCiAjZGVmaW5lIE9fTEFSR0VGSUxFCTA0MDAwMDAKLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCiAKLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CiAKLSNkZWZpbmUgRl9TRVRPV04JOAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUT1dOCTkJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX1NFVFNJRwkxMAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUU0lHCTExCS8qICBmb3Igc29ja2V0cy4gKi8KLQotI2RlZmluZSBGX0dFVExLNjQJMTIJLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KLSNkZWZpbmUgRl9TRVRMSzY0CTEzCi0jZGVmaW5lIEZfU0VUTEtXNjQJMTQKLQotLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KLSNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLwotCi0vKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLwotI2RlZmluZSBGX1JETENLCQkwCi0jZGVmaW5lIEZfV1JMQ0sJCTEKLSNkZWZpbmUgRl9VTkxDSwkJMgotCi0vKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLwotI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KLSNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCi0KLS8qIGZvciBsZWFzZXMgKi8KLSNkZWZpbmUgRl9JTlBST0dSRVNTCTE2Ci0KLS8qIG9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAqLwotI2RlZmluZSBMT0NLX1NICQkxCS8qIHNoYXJlZCBsb2NrICovCi0jZGVmaW5lIExPQ0tfRVgJCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19OQgkJNAkvKiBvcidkIHdpdGggb25lIG9mIHRoZSBhYm92ZSB0byBwcmV2ZW50Ci0JCQkJICAgYmxvY2tpbmcgKi8KLSNkZWZpbmUgTE9DS19VTgkJOAkvKiByZW1vdmUgbG9jayAqLwotCi0jZGVmaW5lIExPQ0tfTUFORAkzMgkvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrICovCi0jZGVmaW5lIExPQ0tfUkVBRAk2NAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfV1JJVEUJMTI4CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfUlcJCTE5MgkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCAmIHdyaXRlIG9wcyAqLwotCi1zdHJ1Y3QgZmxvY2sgewotCXNob3J0IGxfdHlwZTsKLQlzaG9ydCBsX3doZW5jZTsKLQlvZmZfdCBsX3N0YXJ0OwotCW9mZl90IGxfbGVuOwotCXBpZF90IGxfcGlkOwotfTsKLQotc3RydWN0IGZsb2NrNjQgewotCXNob3J0ICBsX3R5cGU7Ci0Jc2hvcnQgIGxfd2hlbmNlOwotCWxvZmZfdCBsX3N0YXJ0OwotCWxvZmZfdCBsX2xlbjsKLQlwaWRfdCAgbF9waWQ7Ci19OwotCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0CiAjZW5kaWYgLyogX0g4MzAwX0ZDTlRMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1oODMwMC9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvaGRyZWcuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL2hkcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZDBjMDYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qCi0gKiAgbGludXgvaW5jbHVkZS9hc20taDgzMDAvaGRyZWcuaAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiAgTGludXMgVG9ydmFsZHMgJiBhdXRob3JzCi0gKi8KLQotI3dhcm5pbmcgdGhpcyBmaWxlIGlzIG9ic29sZXRlLCBwbGVhc2UgZG8gbm90IHVzZSBpdAotCi0jaWZuZGVmIF9IODMwMF9IRFJFR19ICi0jZGVmaW5lIF9IODMwMF9IRFJFR19ICi0KLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgcTQwaWRlX2lvcmVnX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgKiBpZGVfaW9yZWdfdDsKLQotI2VuZGlmIC8qIF9IODMwMF9IRFJFR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9wYWdlLmggYi9pbmNsdWRlL2FzbS1oODMwMC9wYWdlLmgKaW5kZXggZTNiNzk2MC4uZThjMDJiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaApAQCAtNTQsMjAgKzU0LDYgQEAKIC8qIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIHRoZSAobmV4dCkgcGFnZSBib3VuZGFyeSAqLwogI2RlZmluZSBQQUdFX0FMSUdOKGFkZHIpCSgoKGFkZHIpK1BBR0VfU0laRS0xKSZQQUdFX01BU0spCiAKLS8qIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyICovCi1leHRlcm4gX19pbmxpbmVfXyBpbnQgZ2V0X29yZGVyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpbnQgb3JkZXI7Ci0KLQlzaXplID0gKHNpemUtMSkgPj4gKFBBR0VfU0hJRlQtMSk7Ci0Jb3JkZXIgPSAtMTsKLQlkbyB7Ci0JCXNpemUgPj49IDE7Ci0JCW9yZGVyKys7Ci0JfSB3aGlsZSAoc2l6ZSk7Ci0JcmV0dXJuIG9yZGVyOwotfQotCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQ7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1vcnlfZW5kOwogCkBAIC0xMDEsNCArODcsNiBAQAogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgorCiAjZW5kaWYgLyogX0g4MzAwX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvdHlwZXMuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3R5cGVzLmgKaW5kZXggMjFmNGZjMC4uYmY5MWUwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC90eXBlcy5oCkBAIC01OCw4ICs1OCw2IEBACiAjZGVmaW5lIEhBVkVfU0VDVE9SX1QKIHR5cGVkZWYgdTY0IHNlY3Rvcl90OwogCi10eXBlZGVmIHVuc2lnbmVkIGludCBrbWVtX2J1ZmN0bF90OwotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1oODMwMC91YWNjZXNzLmgKaW5kZXggMTQ4MGYzMC4uZWJlNThjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3VhY2Nlc3MuaApAQCAtMjQsMTIgKzI0LDYgQEAKIAlyZXR1cm4oUkFOR0VfQ0hFQ0tfT0soYWRkciwgc2l6ZSwgMEwsICh1bnNpZ25lZCBsb25nKSZfcmFtZW5kKSk7CiB9CiAKLS8qIHRoaXMgZnVuY3Rpb24gd2lsbCBnbyBhd2F5IHNvb24gLSB1c2UgYWNjZXNzX29rKCkgaW5zdGVhZCAqLwotc3RhdGljIGlubGluZSBpbnQgX19kZXByZWNhdGVkIHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSk/MDotRUZBVUxUOwotfQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAppbmRleCBjZjgyOGFjLi5kZjRlZDMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaApAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgICAgIDoiPXIiKG5faGkpLCAiPXIiKG5fbG8pICAgICBcCiAgICAgICAgIDoiMCIobl9oaSksICIxIihuX2xvKSkKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QgCisjaWZkZWYgQ09ORklHX0FDUEkgCiBleHRlcm4gaW50IGFjcGlfbGFwaWM7CiBleHRlcm4gaW50IGFjcGlfaW9hcGljOwogZXh0ZXJuIGludCBhY3BpX25vaXJxOwpAQCAtMTQ2LDEzICsxNDYsNiBAQAogCiAjZW5kaWYKIAotI2Vsc2UJLyogQ09ORklHX0FDUElfQk9PVCAqLwotIyAgZGVmaW5lIGFjcGlfbGFwaWMgMAotIyAgZGVmaW5lIGFjcGlfaW9hcGljIDAKLQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQUNQSV9QQ0kKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX25vaXJxX3NldCh2b2lkKSB7IGFjcGlfbm9pcnEgPSAxOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9kaXNhYmxlX3BjaSh2b2lkKSAKIHsKQEAgLTE2MCwxMSArMTUzLDE2IEBACiAJYWNwaV9ub2lycV9zZXQoKTsKIH0KIGV4dGVybiBpbnQgYWNwaV9pcnFfYmFsYW5jZV9zZXQoY2hhciAqc3RyKTsKLSNlbHNlCisKKyNlbHNlCS8qICFDT05GSUdfQUNQSSAqLworCisjZGVmaW5lIGFjcGlfbGFwaWMgMAorI2RlZmluZSBhY3BpX2lvYXBpYyAwCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9ub2lycV9zZXQodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9kaXNhYmxlX3BjaSh2b2lkKSB7IH0KLXN0YXRpYyBpbmxpbmUgaW50IGFjcGlfaXJxX2JhbGFuY2Vfc2V0KGNoYXIgKnN0cikgeyByZXR1cm4gMDsgfQotI2VuZGlmCisKKyNlbmRpZgkvKiAhQ09ORklHX0FDUEkgKi8KKwogCiAjaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hZ3AuaCBiL2luY2x1ZGUvYXNtLWkzODYvYWdwLmgKaW5kZXggYjgyZjVmMy4uOTA3NTA4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9hZ3AuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FncC5oCkBAIC0xOSw3ICsxOSw3IEBACiAvKiBDb3VsZCB1c2UgQ0xGTFVTSCBoZXJlIGlmIHRoZSBjcHUgc3VwcG9ydHMgaXQuIEJ1dCB0aGVuIGl0IHdvdWxkCiAgICBuZWVkIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBjYWNoZWxpbmUgb2YgdGhlIHdob2xlIHBhZ2Ugc28gaXQgbWF5IG5vdCBiZSAKICAgIHdvcnRoIGl0LiBXb3VsZCBuZWVkIGEgcGFnZSBmb3IgaXQuICovCi0jZGVmaW5lIGZsdXNoX2FncF9jYWNoZSgpIGFzbSB2b2xhdGlsZSgid2JpbnZkIjo6OiJtZW1vcnkiKQorI2RlZmluZSBmbHVzaF9hZ3BfY2FjaGUoKSB3YmludmQoKQogCiAvKiBDb252ZXJ0IGEgcGh5c2ljYWwgYWRkcmVzcyB0byBhbiBhZGRyZXNzIHN1aXRhYmxlIGZvciB0aGUgR0FSVC4gKi8KICNkZWZpbmUgcGh5c190b19nYXJ0KHgpICh4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hcGljZGVmLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWNkZWYuaAppbmRleCBhOTZhOGY0Li4wMzE4NWNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FwaWNkZWYuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWNkZWYuaApAQCAtMTYsNiArMTYsNyBAQAogI2RlZmluZQkJCUdFVF9BUElDX1ZFUlNJT04oeCkJKCh4KSYweEZGKQogI2RlZmluZQkJCUdFVF9BUElDX01BWExWVCh4KQkoKCh4KT4+MTYpJjB4RkYpCiAjZGVmaW5lCQkJQVBJQ19JTlRFR1JBVEVEKHgpCSgoeCkmMHhGMCkKKyNkZWZpbmUJCQlBUElDX1hBUElDKHgpCQkoKHgpID49IDB4MTQpCiAjZGVmaW5lCQlBUElDX1RBU0tQUkkJMHg4MAogI2RlZmluZQkJCUFQSUNfVFBSSV9NQVNLCQkweEZGCiAjZGVmaW5lCQlBUElDX0FSQlBSSQkweDkwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2F1eHZlYy5oIGIvaW5jbHVkZS9hc20taTM4Ni9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTVlMTMwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9hdXh2ZWMuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9fQVNNaTM4Nl9BVVhWRUNfSAorI2RlZmluZSBfX0FTTWkzODZfQVVYVkVDX0gKKworLyoKKyAqIEFyY2hpdGVjdHVyZS1uZXV0cmFsIEFUXyB2YWx1ZXMgaW4gMC0xNywgbGVhdmUgc29tZSByb29tCisgKiBmb3IgbW9yZSBvZiB0aGVtLCBzdGFydCB0aGUgeDg2LXNwZWNpZmljIG9uZXMgYXQgMzIuCisgKi8KKyNkZWZpbmUgQVRfU1lTSU5GTwkJMzIKKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSCQkzMworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYnVncy5oIGIvaW5jbHVkZS9hc20taTM4Ni9idWdzLmgKaW5kZXggNjc4OWZjMi4uZWE1NDU0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9idWdzLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9idWdzLmgKQEAgLTExOCw3ICsxMTgsMTAgQEAKIAkJcHJpbnRrKCJkaXNhYmxlZFxuIik7CiAJCXJldHVybjsKIAl9Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oImhsdCA7IGhsdCA7IGhsdCA7IGhsdCIpOworCWhhbHQoKTsKKwloYWx0KCk7CisJaGFsdCgpOworCWhhbHQoKTsKIAlwcmludGsoIk9LLlxuIik7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZGVzYy5oIGIvaW5jbHVkZS9hc20taTM4Ni9kZXNjLmgKaW5kZXggMTFlNjc4MS4uNmRmMWE1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9kZXNjLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9kZXNjLmgKQEAgLTI3LDggKzI3LDE4IEBACiAKIGV4dGVybiBzdHJ1Y3QgWGd0X2Rlc2Nfc3RydWN0IGlkdF9kZXNjciwgY3B1X2dkdF9kZXNjcltOUl9DUFVTXTsKIAotI2RlZmluZSBsb2FkX1RSX2Rlc2MoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygibHRyICUlYXgiOjoiYSIgKEdEVF9FTlRSWV9UU1MqOCkpCi0jZGVmaW5lIGxvYWRfTERUX2Rlc2MoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygibGxkdCAlJWF4Ijo6ImEiIChHRFRfRU5UUllfTERUKjgpKQorI2RlZmluZSBsb2FkX1RSX2Rlc2MoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygibHRyICV3MCI6OiJxIiAoR0RUX0VOVFJZX1RTUyo4KSkKKyNkZWZpbmUgbG9hZF9MRFRfZGVzYygpIF9fYXNtX18gX192b2xhdGlsZV9fKCJsbGR0ICV3MCI6OiJxIiAoR0RUX0VOVFJZX0xEVCo4KSkKKworI2RlZmluZSBsb2FkX2dkdChkdHIpIF9fYXNtX18gX192b2xhdGlsZSgibGdkdCAlMCI6OiJtIiAoKmR0cikpCisjZGVmaW5lIGxvYWRfaWR0KGR0cikgX19hc21fXyBfX3ZvbGF0aWxlKCJsaWR0ICUwIjo6Im0iICgqZHRyKSkKKyNkZWZpbmUgbG9hZF90cih0cikgX19hc21fXyBfX3ZvbGF0aWxlKCJsdHIgJTAiOjoibXIiICh0cikpCisjZGVmaW5lIGxvYWRfbGR0KGxkdCkgX19hc21fXyBfX3ZvbGF0aWxlKCJsbGR0ICUwIjo6Im1yIiAobGR0KSkKKworI2RlZmluZSBzdG9yZV9nZHQoZHRyKSBfX2FzbV9fICgic2dkdCAlMCI6Ij1tIiAoKmR0cikpCisjZGVmaW5lIHN0b3JlX2lkdChkdHIpIF9fYXNtX18gKCJzaWR0ICUwIjoiPW0iICgqZHRyKSkKKyNkZWZpbmUgc3RvcmVfdHIodHIpIF9fYXNtX18gKCJzdHIgJTAiOiI9bXIiICh0cikpCisjZGVmaW5lIHN0b3JlX2xkdChsZHQpIF9fYXNtX18gKCJzbGR0ICUwIjoiPW1yIiAobGR0KSkKIAogLyoKICAqIFRoaXMgaXMgdGhlIGxkdCB0aGF0IGV2ZXJ5IHByb2Nlc3Mgd2lsbCBnZXQgdW5sZXNzIHdlIG5lZWQKQEAgLTM5LDE0ICs0OSwxNCBAQAogCiAjZGVmaW5lIF9zZXRfdHNzbGR0X2Rlc2MobixhZGRyLGxpbWl0LHR5cGUpIFwKIF9fYXNtX18gX192b2xhdGlsZV9fICgibW92dyAldzMsMCglMilcblx0IiBcCi0JIm1vdncgJSVheCwyKCUyKVxuXHQiIFwKLQkicm9ybCAkMTYsJSVlYXhcblx0IiBcCi0JIm1vdmIgJSVhbCw0KCUyKVxuXHQiIFwKKwkibW92dyAldzEsMiglMilcblx0IiBcCisJInJvcmwgJDE2LCUxXG5cdCIgXAorCSJtb3ZiICViMSw0KCUyKVxuXHQiIFwKIAkibW92YiAlNCw1KCUyKVxuXHQiIFwKIAkibW92YiAkMCw2KCUyKVxuXHQiIFwKLQkibW92YiAlJWFoLDcoJTIpXG5cdCIgXAotCSJyb3JsICQxNiwlJWVheCIgXAotCTogIj1tIigqKG4pKSA6ICJhIiAoYWRkciksICJyIihuKSwgImlyIihsaW1pdCksICJpIih0eXBlKSkKKwkibW92YiAlaDEsNyglMilcblx0IiBcCisJInJvcmwgJDE2LCUxIiBcCisJOiAiPW0iKCoobikpIDogInEiIChhZGRyKSwgInIiKG4pLCAiaXIiKGxpbWl0KSwgImkiKHR5cGUpKQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfdHNzX2Rlc2ModW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IGVudHJ5LCB2b2lkICphZGRyKQogewpAQCAtODYsNiArOTYsMTMgQEAKIAkoaW5mbyktPnNlZ19ub3RfcHJlc2VudAk9PSAxCSYmIFwKIAkoaW5mbyktPnVzZWFibGUJCT09IDAJKQogCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbGR0X2VudHJ5KHZvaWQgKmxkdCwgaW50IGVudHJ5LCBfX3UzMiBlbnRyeV9hLCBfX3UzMiBlbnRyeV9iKQoreworCV9fdTMyICpscCA9IChfX3UzMiAqKSgoY2hhciAqKWxkdCArIGVudHJ5KjgpOworCSpscCA9IGVudHJ5X2E7CisJKihscCsxKSA9IGVudHJ5X2I7Cit9CisKICNpZiBUTFNfU0laRSAhPSAyNAogIyBlcnJvciB1cGRhdGUgdGhpcyBjb2RlLgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2RpdjY0LmggYi9pbmNsdWRlL2FzbS1pMzg2L2RpdjY0LmgKaW5kZXggMjhlZDhiMi4uNzVjNjdjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9kaXY2NC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZGl2NjQuaApAQCAtMzUsNyArMzUsNyBAQAogICovCiAjZGVmaW5lIGRpdl9sb25nX2xvbmdfcmVtKGEsYixjKSBkaXZfbGxfWF9sX3JlbShhLGIsYykKIAotZXh0ZXJuIGlubGluZSBsb25nCitzdGF0aWMgaW5saW5lIGxvbmcKIGRpdl9sbF9YX2xfcmVtKGxvbmcgbG9uZyBkaXZzLCBsb25nIGRpdiwgbG9uZyAqcmVtKQogewogCWxvbmcgZHVtMjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZWxmLmggYi9pbmNsdWRlL2FzbS1pMzg2L2VsZi5oCmluZGV4IDEzMGJkYzguLmZhMTExMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9lbGYuaApAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxhc20vdXNlci5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CQkvKiBmb3Igc2F2ZXNlZ21lbnQgKi8KKyNpbmNsdWRlIDxhc20vYXV4dmVjLmg+CiAKICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAKQEAgLTEwOSwxMyArMTEwLDYgQEAKIAogI2RlZmluZSBFTEZfUExBVEZPUk0gIChzeXN0ZW1fdXRzbmFtZS5tYWNoaW5lKQogCi0vKgotICogQXJjaGl0ZWN0dXJlLW5ldXRyYWwgQVRfIHZhbHVlcyBpbiAwLTE3LCBsZWF2ZSBzb21lIHJvb20KLSAqIGZvciBtb3JlIG9mIHRoZW0sIHN0YXJ0IHRoZSB4ODYtc3BlY2lmaWMgb25lcyBhdCAzMi4KLSAqLwotI2RlZmluZSBBVF9TWVNJTkZPCQkzMgotI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIJCTMzCi0KICNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIGRvIHsgfSB3aGlsZSAoMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9mY250bC5oIGIvaW5jbHVkZS9hc20taTM4Ni9mY250bC5oCmluZGV4IDUxMWNkZTkuLjQ2YWIxMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2ZjbnRsLmgKQEAgLTEsODggKzEgQEAKLSNpZm5kZWYgX0kzODZfRkNOVExfSAotI2RlZmluZSBfSTM4Nl9GQ05UTF9ICi0KLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgT19ESVJFQ1QJIDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLwotI2RlZmluZSBPX0xBUkdFRklMRQkwMTAwMDAwCi0jZGVmaW5lIE9fRElSRUNUT1JZCTAyMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XCTA0MDAwMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCi0jZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAotCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKLQotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0jZGVmaW5lIEZfR0VUTEs2NAkxMgkvKiAgdXNpbmcgJ3N0cnVjdCBmbG9jazY0JyAqLwotI2RlZmluZSBGX1NFVExLNjQJMTMKLSNkZWZpbmUgRl9TRVRMS1c2NAkxNAotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCW9mZl90IGxfc3RhcnQ7Ci0Jb2ZmX3QgbF9sZW47Ci0JcGlkX3QgbF9waWQ7Ci19OwotCi1zdHJ1Y3QgZmxvY2s2NCB7Ci0Jc2hvcnQgIGxfdHlwZTsKLQlzaG9ydCAgbF93aGVuY2U7Ci0JbG9mZl90IGxfc3RhcnQ7Ci0JbG9mZl90IGxfbGVuOwotCXBpZF90ICBsX3BpZDsKLX07Ci0KLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKLQotI2VuZGlmCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZml4bWFwLmggYi9pbmNsdWRlL2FzbS1pMzg2L2ZpeG1hcC5oCmluZGV4IGM5NGNhYzkuLmNmYjFjNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZml4bWFwLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9maXhtYXAuaApAQCAtNzYsNyArNzYsNyBAQAogCUZJWF9LTUFQX0JFR0lOLAkvKiByZXNlcnZlZCBwdGUncyBmb3IgdGVtcG9yYXJ5IGtlcm5lbCBtYXBwaW5ncyAqLwogCUZJWF9LTUFQX0VORCA9IEZJWF9LTUFQX0JFR0lOKyhLTV9UWVBFX05SKk5SX0NQVVMpLTEsCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAlGSVhfQUNQSV9CRUdJTiwKIAlGSVhfQUNQSV9FTkQgPSBGSVhfQUNQSV9CRUdJTiArIEZJWF9BQ1BJX1BBR0VTIC0gMSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9mdXRleC5oIGIvaW5jbHVkZS9hc20taTM4Ni9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YjlkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2Z1dGV4LmgKQEAgLTAsMCArMSwxMDggQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgX19mdXRleF9hdG9taWNfb3AxKGluc24sIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpIFwKKyAgX19hc21fXyBfX3ZvbGF0aWxlICgJCQkJCQlcCisiMToJIiBpbnNuICJcbiIJCQkJCQlcCisiMjoJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuXAorMzoJbW92CSUzLCAlMVxuXAorCWptcAkyYlxuXAorCS5wcmV2aW91c1xuXAorCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcblwKKwkuYWxpZ24JOFxuXAorCS5sb25nCTFiLDNiXG5cCisJLnByZXZpb3VzIgkJCQkJCVwKKwk6ICI9ciIgKG9sZHZhbCksICI9ciIgKHJldCksICI9bSIgKCp1YWRkcikJCVwKKwk6ICJpIiAoLUVGQVVMVCksICJtIiAoKnVhZGRyKSwgIjAiIChvcGFyZyksICIxIiAoMCkpCisKKyNkZWZpbmUgX19mdXRleF9hdG9taWNfb3AyKGluc24sIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpIFwKKyAgX19hc21fXyBfX3ZvbGF0aWxlICgJCQkJCQlcCisiMToJbW92bAklMiwgJTBcblwKKwltb3ZsCSUwLCAlM1xuIgkJCQkJXAorCWluc24gIlxuIgkJCQkJCVwKKyIyOgkiIExPQ0tfUFJFRklYICJjbXB4Y2hnbCAlMywgJTJcblwKKwlqbnoJMWJcblwKKzM6CS5zZWN0aW9uIC5maXh1cCxcImF4XCJcblwKKzQ6CW1vdgklNSwgJTFcblwKKwlqbXAJM2JcblwKKwkucHJldmlvdXNcblwKKwkuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG5cCisJLmFsaWduCThcblwKKwkubG9uZwkxYiw0YiwyYiw0YlxuXAorCS5wcmV2aW91cyIJCQkJCQlcCisJOiAiPSZhIiAob2xkdmFsKSwgIj0mciIgKHJldCksICI9bSIgKCp1YWRkciksCQlcCisJICAiPSZyIiAodGVtKQkJCQkJCVwKKwk6ICJyIiAob3BhcmcpLCAiaSIgKC1FRkFVTFQpLCAibSIgKCp1YWRkciksICIxIiAoMCkpCisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKG9wID09IEZVVEVYX09QX1NFVCkKKwkJX19mdXRleF9hdG9taWNfb3AxKCJ4Y2hnbCAlMCwgJTIiLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwllbHNlIHsKKyNpZm5kZWYgQ09ORklHX1g4Nl9CU1dBUAorCQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMykKKwkJCXJldCA9IC1FTk9TWVM7CisJCWVsc2UKKyNlbmRpZgorCQlzd2l0Y2ggKG9wKSB7CisJCWNhc2UgRlVURVhfT1BfQUREOgorCQkJX19mdXRleF9hdG9taWNfb3AxKExPQ0tfUFJFRklYICJ4YWRkbCAlMCwgJTIiLCByZXQsCisJCQkJCSAgIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIEZVVEVYX09QX09SOgorCQkJX19mdXRleF9hdG9taWNfb3AyKCJvcmwgJTQsICUzIiwgcmV0LCBvbGR2YWwsIHVhZGRyLAorCQkJCQkgICBvcGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9BTkROOgorCQkJX19mdXRleF9hdG9taWNfb3AyKCJhbmRsICU0LCAlMyIsIHJldCwgb2xkdmFsLCB1YWRkciwKKwkJCQkJICAgfm9wYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIEZVVEVYX09QX1hPUjoKKwkJCV9fZnV0ZXhfYXRvbWljX29wMigieG9ybCAlNCwgJTMiLCByZXQsIG9sZHZhbCwgdWFkZHIsCisJCQkJCSAgIG9wYXJnKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9oZHJlZy5oIGIvaW5jbHVkZS9hc20taTM4Ni9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg5YmJjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSN3YXJuaW5nIHRoaXMgZmlsZSBpcyBvYnNvbGV0ZSwgcGxlYXNlIGRvIG5vdCB1c2UgaXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvaW9fYXBpYy5oIGIvaW5jbHVkZS9hc20taTM4Ni9pb19hcGljLmgKaW5kZXggMDAyYzIwMy4uNTFjNGU1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pb19hcGljLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9pb19hcGljLmgKQEAgLTE5NSwxMiArMTk1LDEyIEBACiAgKi8KICNkZWZpbmUgaW9fYXBpY19hc3NpZ25fcGNpX2lycXMgKG1wX2lycV9lbnRyaWVzICYmICFza2lwX2lvYXBpY19zZXR1cCAmJiBpb19hcGljX2lycXMpCiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIGV4dGVybiBpbnQgaW9fYXBpY19nZXRfdW5pcXVlX2lkIChpbnQgaW9hcGljLCBpbnQgYXBpY19pZCk7CiBleHRlcm4gaW50IGlvX2FwaWNfZ2V0X3ZlcnNpb24gKGludCBpb2FwaWMpOwogZXh0ZXJuIGludCBpb19hcGljX2dldF9yZWRpcl9lbnRyaWVzIChpbnQgaW9hcGljKTsKIGV4dGVybiBpbnQgaW9fYXBpY19zZXRfcGNpX3JvdXRpbmcgKGludCBpb2FwaWMsIGludCBwaW4sIGludCBpcnEsIGludCBlZGdlX2xldmVsLCBpbnQgYWN0aXZlX2hpZ2hfbG93KTsKLSNlbmRpZiAvKkNPTkZJR19BQ1BJX0JPT1QqLworI2VuZGlmIC8qIENPTkZJR19BQ1BJICovCiAKIGV4dGVybiBpbnQgKCppb2FwaWNfcmVudW1iZXJfaXJxKShpbnQgaW9hcGljLCBpbnQgaXJxKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9rZGVidWcuaCBiL2luY2x1ZGUvYXNtLWkzODYva2RlYnVnLmgKaW5kZXggYjNmOGQ1Zi4uMzE2MTM4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9rZGVidWcuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2tkZWJ1Zy5oCkBAIC00MSw5ICs0MSwxNiBAQAogCURJRV9QQUdFX0ZBVUxULAogfTsKIAotc3RhdGljIGlubGluZSBpbnQgbm90aWZ5X2RpZShlbnVtIGRpZV92YWwgdmFsLGNoYXIgKnN0cixzdHJ1Y3QgcHRfcmVncyAqcmVncyxsb25nIGVycixpbnQgdHJhcCwgaW50IHNpZykKK3N0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9kaWUoZW51bSBkaWVfdmFsIHZhbCwgY29uc3QgY2hhciAqc3RyLAorCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyLCBpbnQgdHJhcCwgaW50IHNpZykKIHsKLQlzdHJ1Y3QgZGllX2FyZ3MgYXJncyA9IHsgLnJlZ3M9cmVncywgLnN0cj1zdHIsIC5lcnI9ZXJyLCAudHJhcG5yPXRyYXAsLnNpZ25yPXNpZyB9OworCXN0cnVjdCBkaWVfYXJncyBhcmdzID0geworCQkucmVncyA9IHJlZ3MsCisJCS5zdHIgPSBzdHIsCisJCS5lcnIgPSBlcnIsCisJCS50cmFwbnIgPSB0cmFwLAorCQkuc2lnbnIgPSBzaWcKKwl9OwogCXJldHVybiBub3RpZmllcl9jYWxsX2NoYWluKCZpMzg2ZGllX2NoYWluLCB2YWwsICZhcmdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvbWFjaF9yZWJvb3QuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L21hY2hfcmVib290LmgKaW5kZXggNTIxZTIyNy4uMDZhZTRkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvbWFjaF9yZWJvb3QuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9tYWNoX3JlYm9vdC5oCkBAIC0yMiw3ICsyMiwxNSBAQAogCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewogCQlrYl93YWl0KCk7CiAJCXVkZWxheSg1MCk7Ci0JCW91dGIoMHhmZSwgMHg2NCk7ICAgICAgICAgLyogcHVsc2UgcmVzZXQgbG93ICovCisJCW91dGIoMHg2MCwgMHg2NCk7CS8qIHdyaXRlIENvbnRyb2xsZXIgQ29tbWFuZCBCeXRlICovCisJCXVkZWxheSg1MCk7CisJCWtiX3dhaXQoKTsKKwkJdWRlbGF5KDUwKTsKKwkJb3V0YigweDE0LCAweDYwKTsJLyogc2V0ICJTeXN0ZW0gZmxhZyIgKi8KKwkJdWRlbGF5KDUwKTsKKwkJa2Jfd2FpdCgpOworCQl1ZGVsYXkoNTApOworCQlvdXRiKDB4ZmUsIDB4NjQpOwkvKiBwdWxzZSByZXNldCBsb3cgKi8KIAkJdWRlbGF5KDUwKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZXM3MDAwL21hY2hfbXBwYXJzZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWVzNzAwMC9tYWNoX21wcGFyc2UuaAppbmRleCA4NTgwOWUwLi4yOGE4NGY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZXM3MDAwL21hY2hfbXBwYXJzZS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1lczcwMDAvbWFjaF9tcHBhcnNlLmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9fQVNNX01BQ0hfTVBQQVJTRV9ICiAjZGVmaW5lIF9fQVNNX01BQ0hfTVBQQVJTRV9ICiAKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBtcGNfb2VtX2J1c19pbmZvKHN0cnVjdCBtcGNfY29uZmlnX2J1cyAqbSwgY2hhciAqbmFtZSwgCiAJCQkJc3RydWN0IG1wY19jb25maWdfdHJhbnNsYXRpb24gKnRyYW5zbGF0aW9uKQogewpAQCAtMTIsOCArMTQsOSBAQAogewogfQogCi1leHRlcm4gaW50IHBhcnNlX3VuaXN5c19vZW0gKGNoYXIgKm9lbXB0ciwgaW50IG9lbV9lbnRyaWVzKTsKLWV4dGVybiBpbnQgZmluZF91bmlzeXNfYWNwaV9vZW1fdGFibGUodW5zaWduZWQgbG9uZyAqb2VtX2FkZHIsIGludCAqbGVuZ3RoKTsKK2V4dGVybiBpbnQgcGFyc2VfdW5pc3lzX29lbSAoY2hhciAqb2VtcHRyKTsKK2V4dGVybiBpbnQgZmluZF91bmlzeXNfYWNwaV9vZW1fdGFibGUodW5zaWduZWQgbG9uZyAqb2VtX2FkZHIpOworZXh0ZXJuIHZvaWQgc2V0dXBfdW5pc3lzKCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1wc19vZW1fY2hlY2soc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjLCBjaGFyICpvZW0sCiAJCWNoYXIgKnByb2R1Y3RpZCkKQEAgLTIyLDE4ICsyNSwzMyBAQAogCQlzdHJ1Y3QgbXBfY29uZmlnX29lbXRhYmxlICpvZW1fdGFibGUgPSAKIAkJCShzdHJ1Y3QgbXBfY29uZmlnX29lbXRhYmxlICopbXBjLT5tcGNfb2VtcHRyOwogCQlpZiAoIXN0cm5jbXAob2VtLCAiVU5JU1lTIiwgNikpCi0JCQlyZXR1cm4gcGFyc2VfdW5pc3lzX29lbSgoY2hhciAqKW9lbV90YWJsZSwgb2VtX3RhYmxlLT5vZW1fbGVuZ3RoKTsKKwkJCXJldHVybiBwYXJzZV91bmlzeXNfb2VtKChjaGFyICopb2VtX3RhYmxlKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGVzNzAwMF9jaGVja19kc2R0KCkKK3sKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciA9IE5VTEw7CisJaWYoIWFjcGlfZ2V0X3RhYmxlX2hlYWRlcl9lYXJseShBQ1BJX0RTRFQsICZoZWFkZXIpKQorCQlhY3BpX3RhYmxlX3ByaW50KGhlYWRlciwgMCk7CisJaWYgKCFzdHJuY21wKGhlYWRlci0+b2VtX2lkLCAiVU5JU1lTIiwgNikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCiAvKiBIb29rIGZyb20gZ2VuZXJpYyBBQ1BJIHRhYmxlcy5jICovCiBzdGF0aWMgaW5saW5lIGludCBhY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQogewogCXVuc2lnbmVkIGxvbmcgb2VtX2FkZHI7IAotCWludCBvZW1fZW50cmllczsKLQlpZiAoIWZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKCZvZW1fYWRkciwgJm9lbV9lbnRyaWVzKSkKLQkJcmV0dXJuIHBhcnNlX3VuaXN5c19vZW0oKGNoYXIgKilvZW1fYWRkciwgb2VtX2VudHJpZXMpOworCWlmICghZmluZF91bmlzeXNfYWNwaV9vZW1fdGFibGUoJm9lbV9hZGRyKSkgeworCQlpZiAoZXM3MDAwX2NoZWNrX2RzZHQoKSkKKwkJCXJldHVybiBwYXJzZV91bmlzeXNfb2VtKChjaGFyICopb2VtX2FkZHIpOworCQllbHNlIHsKKwkJCXNldHVwX3VuaXN5cygpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1nZW5lcmljL21hY2hfYXBpYy5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWdlbmVyaWMvbWFjaF9hcGljLmgKaW5kZXggYjEzNzY3YS4uZDlkYzAzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWdlbmVyaWMvbWFjaF9hcGljLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWdlbmVyaWMvbWFjaF9hcGljLmgKQEAgLTI4LDQgKzI4LDYgQEAKICNkZWZpbmUgZW5hYmxlX2FwaWNfbW9kZSAoZ2VuYXBpYy0+ZW5hYmxlX2FwaWNfbW9kZSkKICNkZWZpbmUgcGh5c19wa2dfaWQgKGdlbmFwaWMtPnBoeXNfcGtnX2lkKQogCitleHRlcm4gdm9pZCBnZW5lcmljX2JpZ3NtcF9wcm9iZSh2b2lkKTsKKwogI2VuZGlmIC8qIF9fQVNNX01BQ0hfQVBJQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21tem9uZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9tbXpvbmUuaAppbmRleCA1MTY0MjEzLi4zNDhmZTNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21tem9uZS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbW16b25lLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNpZmRlZiBDT05GSUdfWDg2X05VTUFRCiAJaWYgKGdldF9tZW1jZmdfbnVtYXEoKSkKIAkJcmV0dXJuOwotI2VsaWYgQ09ORklHX0FDUElfU1JBVAorI2VsaWYgZGVmaW5lZChDT05GSUdfQUNQSV9TUkFUKQogCWlmIChnZXRfbWVtY2ZnX2Zyb21fc3JhdCgpKQogCQlyZXR1cm47CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbXBzcGVjLmggYi9pbmNsdWRlL2FzbS1pMzg2L21wc3BlYy5oCmluZGV4IGQ5ZmFmYmEuLjY0YTBiOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbXBzcGVjLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tcHNwZWMuaApAQCAtMTEsNiArMTEsNyBAQAogZXh0ZXJuIGludCBxdWFkX2xvY2FsX3RvX21wX2J1c19pZCBbTlJfQ1BVUy80XVs0XTsKIGV4dGVybiBpbnQgbXBfYnVzX2lkX3RvX3BjaV9idXMgW01BWF9NUF9CVVNTRVNdOwogCitleHRlcm4gdW5zaWduZWQgaW50IGRlZl90b19iaWdzbXA7CiBleHRlcm4gdW5zaWduZWQgaW50IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZDsKIGV4dGVybiBpbnQgc21wX2ZvdW5kX2NvbmZpZzsKIGV4dGVybiB2b2lkIGZpbmRfc21wX2NvbmZpZyAodm9pZCk7CkBAIC0yNiwxNCArMjcsMTQgQEAKIGV4dGVybiBpbnQgcGljX21vZGU7CiBleHRlcm4gaW50IHVzaW5nX2FwaWNfdGltZXI7CiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIGV4dGVybiB2b2lkIG1wX3JlZ2lzdGVyX2xhcGljICh1OCBpZCwgdTggZW5hYmxlZCk7CiBleHRlcm4gdm9pZCBtcF9yZWdpc3Rlcl9sYXBpY19hZGRyZXNzICh1NjQgYWRkcmVzcyk7CiBleHRlcm4gdm9pZCBtcF9yZWdpc3Rlcl9pb2FwaWMgKHU4IGlkLCB1MzIgYWRkcmVzcywgdTMyIGdzaV9iYXNlKTsKIGV4dGVybiB2b2lkIG1wX292ZXJyaWRlX2xlZ2FjeV9pcnEgKHU4IGJ1c19pcnEsIHU4IHBvbGFyaXR5LCB1OCB0cmlnZ2VyLCB1MzIgZ3NpKTsKIGV4dGVybiB2b2lkIG1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzICh2b2lkKTsKIGV4dGVybiBpbnQgbXBfcmVnaXN0ZXJfZ3NpICh1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdyk7Ci0jZW5kaWYgLypDT05GSUdfQUNQSV9CT09UKi8KKyNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwogCiAjZGVmaW5lIFBIWVNJRF9BUlJBWV9TSVpFCUJJVFNfVE9fTE9OR1MoTUFYX0FQSUNTKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21zci5oIGIvaW5jbHVkZS9hc20taTM4Ni9tc3IuaAppbmRleCBjNzZmY2U4Li42MmI3NmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21zci5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbXNyLmgKQEAgLTQ3LDYgKzQ3LDIxIEBACiAJCSAgICAgOiAiYyIgKG1zciksICIwIiAoYSksICJkIiAoYiksICJpIiAoLUVGQVVMVCkpO1wKIAlyZXRfXzsgfSkKIAorLyogcmRtc3Igd2l0aCBleGNlcHRpb24gaGFuZGxpbmcgKi8KKyNkZWZpbmUgcmRtc3Jfc2FmZShtc3IsYSxiKSAoeyBpbnQgcmV0X187CQkJCQkJXAorCWFzbSB2b2xhdGlsZSgiMjogcmRtc3IgOyB4b3JsICUwLCUwXG4iCQkJCQkJXAorCQkgICAgICIxOlxuXHQiCQkJCQkJCQlcCisJCSAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcblx0IgkJCQkJXAorCQkgICAgICIzOiAgbW92bCAlNCwlMCA7IGptcCAxYlxuXHQiCQkJCQlcCisJCSAgICAgIi5wcmV2aW91c1xuXHQiCQkJCQkJCVwKKyAJCSAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQkJCVwKKwkJICAgICAiICAgLmFsaWduIDRcblx0IgkJCQkJCQlcCisJCSAgICAgIiAgIC5sb25nIAkyYiwzYlxuXHQiCQkJCQkJXAorCQkgICAgICIucHJldmlvdXMiCQkJCQkJCVwKKwkJICAgICA6ICI9ciIgKHJldF9fKSwgIj1hIiAoKihhKSksICI9ZCIgKCooYikpCQkJCVwKKwkJICAgICA6ICJjIiAobXNyKSwgImkiICgtRUZBVUxUKSk7XAorCXJldF9fOyB9KQorCiAjZGVmaW5lIHJkdHNjKGxvdyxoaWdoKSBcCiAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJyZHRzYyIgOiAiPWEiIChsb3cpLCAiPWQiIChoaWdoKSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wYWdlLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaAppbmRleCA4ZDkzZjczLi43MzI5NmQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaApAQCAtNjgsNyArNjgsNiBAQAogI2RlZmluZSBIUEFHRV9NQVNLCSh+KEhQQUdFX1NJWkUgLSAxKSkKICNkZWZpbmUgSFVHRVRMQl9QQUdFX09SREVSCShIUEFHRV9TSElGVCAtIFBBR0VfU0hJRlQpCiAjZGVmaW5lIEhBVkVfQVJDSF9IVUdFVExCX1VOTUFQUEVEX0FSRUEKLSNkZWZpbmUgQVJDSF9IQVNfSFVHRVRMQl9DTEVBTl9TVEFMRV9QR1RBQkxFCiAjZW5kaWYKIAogI2RlZmluZSBwZ2RfdmFsKHgpCSgoeCkucGdkKQpAQCAtMTA0LDIwICsxMDMsNiBAQAogICovCiBleHRlcm4gdW5zaWduZWQgaW50IF9fVk1BTExPQ19SRVNFUlZFOwogCi0vKiBQdXJlIDJebiB2ZXJzaW9uIG9mIGdldF9vcmRlciAqLwotc3RhdGljIF9faW5saW5lX18gaW50IGdldF9vcmRlcih1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JaW50IG9yZGVyOwotCi0Jc2l6ZSA9IChzaXplLTEpID4+IChQQUdFX1NISUZULTEpOwotCW9yZGVyID0gLTE7Ci0JZG8gewotCQlzaXplID4+PSAxOwotCQlvcmRlcisrOwotCX0gd2hpbGUgKHNpemUpOwotCXJldHVybiBvcmRlcjsKLX0KLQogZXh0ZXJuIGludCBzeXNjdGxfbGVnYWN5X3ZhX2xheW91dDsKIAogZXh0ZXJuIGludCBwYWdlX2lzX3JhbSh1bnNpZ25lZCBsb25nIHBhZ2Vucik7CkBAIC0xNTYsNCArMTQxLDYgQEAKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KKwogI2VuZGlmIC8qIF9JMzg2X1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTNsZXZlbC5oIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTNsZXZlbC5oCmluZGV4IGQ2MDlmOWMuLjJlM2Y0YTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0zbGV2ZWwuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtM2xldmVsLmgKQEAgLTY0LDcgKzY0LDcgQEAKICNkZWZpbmUgc2V0X3BtZChwbWRwdHIscG1kdmFsKSBcCiAJCXNldF82NGJpdCgodW5zaWduZWQgbG9uZyBsb25nICopKHBtZHB0cikscG1kX3ZhbChwbWR2YWwpKQogI2RlZmluZSBzZXRfcHVkKHB1ZHB0cixwdWR2YWwpIFwKLQkJc2V0XzY0Yml0KCh1bnNpZ25lZCBsb25nIGxvbmcgKikocHVkcHRyKSxwdWRfdmFsKHB1ZHZhbCkpCisJCSgqKHB1ZHB0cikgPSAocHVkdmFsKSkKIAogLyoKICAqIFBlbnRpdW0tSUkgZXJyYXR1bSBBMTM6IGluIFBBRSBtb2RlIHdlIGV4cGxpY2l0bHkgaGF2ZSB0byBmbHVzaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUuaAppbmRleCA3N2M2NDk3Li40N2JjMWZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUuaApAQCAtODYsOSArODYsNyBAQAogI2VuZGlmCiAKIC8qCi0gKiBUaGUgNE1CIHBhZ2UgaXMgZ3Vlc3NpbmcuLiAgRGV0YWlsZWQgaW4gdGhlIGluZmFtb3VzICJDaGFwdGVyIEgiCi0gKiBvZiB0aGUgUGVudGl1bSBkZXRhaWxzLCBidXQgYXNzdW1pbmcgaW50ZWwgZGlkIHRoZSBzdHJhaWdodGZvcndhcmQKLSAqIHRoaW5nLCB0aGlzIGJpdCBzZXQgaW4gdGhlIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGp1c3QgbWVhbnMgdGhhdAorICogX1BBR0VfUFNFIHNldCBpbiB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkganVzdCBtZWFucyB0aGF0CiAgKiB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkgcG9pbnRzIGRpcmVjdGx5IHRvIGEgNE1CLWFsaWduZWQgYmxvY2sgb2YKICAqIG1lbW9yeS4gCiAgKi8KQEAgLTExOSw4ICsxMTcsMTAgQEAKICNkZWZpbmUgX1BBR0VfVU5VU0VEMgkweDQwMAogI2RlZmluZSBfUEFHRV9VTlVTRUQzCTB4ODAwCiAKLSNkZWZpbmUgX1BBR0VfRklMRQkweDA0MAkvKiBzZXQ6cGFnZWNhY2hlIHVuc2V0OnN3YXAgKi8KLSNkZWZpbmUgX1BBR0VfUFJPVE5PTkUJMHgwODAJLyogSWYgbm90IHByZXNlbnQgKi8KKy8qIElmIF9QQUdFX1BSRVNFTlQgaXMgY2xlYXIsIHdlIHVzZSB0aGVzZTogKi8KKyNkZWZpbmUgX1BBR0VfRklMRQkweDA0MAkvKiBub25saW5lYXIgZmlsZSBtYXBwaW5nLCBzYXZlZCBQVEU7IHVuc2V0OnN3YXAgKi8KKyNkZWZpbmUgX1BBR0VfUFJPVE5PTkUJMHgwODAJLyogaWYgdGhlIHVzZXIgbWFwcGVkIGl0IHdpdGggUFJPVF9OT05FOworCQkJCSAgIHB0ZV9wcmVzZW50IGdpdmVzIHRydWUgKi8KICNpZmRlZiBDT05GSUdfWDg2X1BBRQogI2RlZmluZSBfUEFHRV9OWAkoMVVMTDw8X1BBR0VfQklUX05YKQogI2Vsc2UKQEAgLTIxNSwxMSArMjE1LDEzIEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KKyNkZWZpbmUgX19MQVJHRV9QVEUgKF9QQUdFX1BTRSB8IF9QQUdFX1BSRVNFTlQpCiBzdGF0aWMgaW5saW5lIGludCBwdGVfdXNlcihwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfVVNFUjsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlX2xvdyAmIF9QQUdFX1VTRVI7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfUlc7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9odWdlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICgocHRlKS5wdGVfbG93ICYgX19MQVJHRV9QVEUpID09IF9fTEFSR0VfUFRFOyB9CiAKIC8qCiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29ya3MgaWYgcHRlX3ByZXNlbnQoKSBpcyBub3QgdHJ1ZS4KQEAgLTIzNiw3ICsyMzgsNyBAQAogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9SVzsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtodWdlKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93IHw9IF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9QU0U7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21raHVnZShwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfX0xBUkdFX1BURTsgcmV0dXJuIHB0ZTsgfQogCiAjaWZkZWYgQ09ORklHX1g4Nl9QQUUKICMgaW5jbHVkZSA8YXNtL3BndGFibGUtM2xldmVsLmg+CkBAIC0yNTgsMTIgKzI2MCwzOSBAQAogCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0FDQ0VTU0VELCAmcHRlcC0+cHRlX2xvdyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlcF9nZXRfYW5kX2NsZWFyX2Z1bGwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXAsIGludCBmdWxsKQoreworCXB0ZV90IHB0ZTsKKwlpZiAoZnVsbCkgeworCQlwdGUgPSAqcHRlcDsKKwkJKnB0ZXAgPSBfX3B0ZSgwKTsKKwl9IGVsc2UgeworCQlwdGUgPSBwdGVwX2dldF9hbmRfY2xlYXIobW0sIGFkZHIsIHB0ZXApOworCX0KKwlyZXR1cm4gcHRlOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlcF9zZXRfd3Jwcm90ZWN0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewogCWNsZWFyX2JpdChfUEFHRV9CSVRfUlcsICZwdGVwLT5wdGVfbG93KTsKIH0KIAogLyoKKyAqIGNsb25lX3BnZF9yYW5nZShwZ2RfdCAqZHN0LCBwZ2RfdCAqc3JjLCBpbnQgY291bnQpOworICoKKyAqICBkc3QgLSBwb2ludGVyIHRvIHBnZCByYW5nZSBhbndoZXJlIG9uIGEgcGdkIHBhZ2UKKyAqICBzcmMgLSAiIgorICogIGNvdW50IC0gdGhlIG51bWJlciBvZiBwZ2RzIHRvIGNvcHkuCisgKgorICogZHN0IGFuZCBzcmMgY2FuIGJlIG9uIHRoZSBzYW1lIHBhZ2UsIGJ1dCB0aGUgcmFuZ2UgbXVzdCBub3Qgb3ZlcmxhcCwKKyAqIGFuZCBtdXN0IG5vdCBjcm9zcyBhIHBhZ2UgYm91bmRhcnkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9uZV9wZ2RfcmFuZ2UocGdkX3QgKmRzdCwgcGdkX3QgKnNyYywgaW50IGNvdW50KQoreworICAgICAgIG1lbWNweShkc3QsIHNyYywgY291bnQgKiBzaXplb2YocGdkX3QpKTsKK30KKworLyoKICAqIE1hY3JvIHRvIG1hcmsgYSBwYWdlIHByb3RlY3Rpb24gdmFsdWUgYXMgInVuY2FjaGVhYmxlIi4gIE9uIHByb2Nlc3NvcnMgd2hpY2ggZG8gbm90IHN1cHBvcnQKICAqIGl0LCB0aGlzIGlzIGEgbm8tb3AuCiAgKi8KQEAgLTQxNSw2ICs0NDQsNyBAQAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCisjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUl9GVUxMCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU0FNRQogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCmluZGV4IGQwZDhiMDEuLjBhNGVjNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaApAQCAtMjAzLDkgKzIwMyw3IEBACiAJcmV0dXJuIGVkeDsKIH0KIAotI2RlZmluZSBsb2FkX2NyMyhwZ2RpcikgXAotCWFzbSB2b2xhdGlsZSgibW92bCAlMCwlJWNyMyI6IDoiciIgKF9fcGEocGdkaXIpKSkKLQorI2RlZmluZSBsb2FkX2NyMyhwZ2Rpcikgd3JpdGVfY3IzKF9fcGEocGdkaXIpKQogCiAvKgogICogSW50ZWwgQ1BVIGZlYXR1cmVzIGluIENSNApAQCAtMjMyLDIyICsyMzAsMjAgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9pbl9jcjQgKHVuc2lnbmVkIGxvbmcgbWFzaykKIHsKKwl1bnNpZ25lZCBjcjQ7CiAJbW11X2NyNF9mZWF0dXJlcyB8PSBtYXNrOwotCV9fYXNtX18oIm1vdmwgJSVjcjQsJSVlYXhcblx0IgotCQkib3JsICUwLCUlZWF4XG5cdCIKLQkJIm1vdmwgJSVlYXgsJSVjcjRcbiIKLQkJOiA6ICJpcmciIChtYXNrKQotCQk6ImF4Iik7CisJY3I0ID0gcmVhZF9jcjQoKTsKKwljcjQgfD0gbWFzazsKKwl3cml0ZV9jcjQoY3I0KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2luX2NyNCAodW5zaWduZWQgbG9uZyBtYXNrKQogeworCXVuc2lnbmVkIGNyNDsKIAltbXVfY3I0X2ZlYXR1cmVzICY9IH5tYXNrOwotCV9fYXNtX18oIm1vdmwgJSVjcjQsJSVlYXhcblx0IgotCQkiYW5kbCAlMCwlJWVheFxuXHQiCi0JCSJtb3ZsICUlZWF4LCUlY3I0XG4iCi0JCTogOiAiaXJnIiAofm1hc2spCi0JCToiYXgiKTsKKwljcjQgPSByZWFkX2NyNCgpOworCWNyNCAmPSB+bWFzazsKKwl3cml0ZV9jcjQoY3I0KTsKIH0KIAogLyoKQEAgLTI4MSw2ICsyNzcsMTEgQEAKIAlvdXRiKChkYXRhKSwgMHgyMyk7IFwKIH0gd2hpbGUgKDApCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXJpYWxpemVfY3B1KHZvaWQpCit7CisJIF9fYXNtX18gX192b2xhdGlsZV9fICgiY3B1aWQiIDogOiA6ICJheCIsICJieCIsICJjeCIsICJkeCIpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgX19tb25pdG9yKGNvbnN0IHZvaWQgKmVheCwgdW5zaWduZWQgbG9uZyBlY3gsCiAJCXVuc2lnbmVkIGxvbmcgZWR4KQogewpAQCAtNDU0LDYgKzQ1NSw3IEBACiAJdW5zaWduZWQgaW50CQlzYXZlZF9mcywgc2F2ZWRfZ3M7CiAvKiBJTyBwZXJtaXNzaW9ucyAqLwogCXVuc2lnbmVkIGxvbmcJKmlvX2JpdG1hcF9wdHI7CisgCXVuc2lnbmVkIGxvbmcJaW9wbDsKIC8qIG1heCBhbGxvd2VkIHBvcnQgaW4gdGhlIGJpdG1hcCwgaW4gYnl0ZXM6ICovCiAJdW5zaWduZWQgbG9uZwlpb19iaXRtYXBfbWF4OwogfTsKQEAgLTQ3NCw3ICs0NzYsNiBAQAogCS5lc3AwCQk9IHNpemVvZihpbml0X3N0YWNrKSArIChsb25nKSZpbml0X3N0YWNrLAlcCiAJLnNzMAkJPSBfX0tFUk5FTF9EUywJCQkJCVwKIAkuc3MxCQk9IF9fS0VSTkVMX0NTLAkJCQkJXAotCS5sZHQJCT0gR0RUX0VOVFJZX0xEVCwJCQkJXAogCS5pb19iaXRtYXBfYmFzZQk9IElOVkFMSURfSU9fQklUTUFQX09GRlNFVCwJCQlcCiAJLmlvX2JpdG1hcAk9IHsgWyAwIC4uLiBJT19CSVRNQVBfTE9OR1NdID0gfjAgfSwJCVwKIH0KQEAgLTUxMSw2ICs1MTIsMjEgQEAKIAkJCTogLyogbm8gb3V0cHV0ICovCQkJXAogCQkJOiJyIiAodmFsdWUpKQogCisvKgorICogU2V0IElPUEwgYml0cyBpbiBFRkxBR1MgZnJvbSBnaXZlbiBtYXNrCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaW9wbF9tYXNrKHVuc2lnbmVkIG1hc2spCit7CisJdW5zaWduZWQgaW50IHJlZzsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInB1c2hmbDsiCisJCQkgICAgICAicG9wbCAlMDsiCisJCQkgICAgICAiYW5kbCAlMSwgJTA7IgorCQkJICAgICAgIm9ybCAlMiwgJTA7IgorCQkJICAgICAgInB1c2hsICUwOyIKKwkJCSAgICAgICJwb3BmbCIKKwkJCQk6ICI9JnIiIChyZWcpCisJCQkJOiAiaSIgKH5YODZfRUZMQUdTX0lPUEwpLCAiciIgKG1hc2spKTsKK30KIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiwgYSBzdHJhbmdlIEMgdGhpbmcgKi8KIHN0cnVjdCB0YXNrX3N0cnVjdDsKQEAgLTY2Myw3ICs2NzksNyBAQAogICAgSG93ZXZlciB3ZSBkb24ndCBkbyBwcmVmZXRjaGVzIGZvciBwcmUgWFAgQXRobG9ucyBjdXJyZW50bHkKICAgIFRoYXQgc2hvdWxkIGJlIGZpeGVkLiAqLwogI2RlZmluZSBBUkNIX0hBU19QUkVGRVRDSAotZXh0ZXJuIGlubGluZSB2b2lkIHByZWZldGNoKGNvbnN0IHZvaWQgKngpCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlZmV0Y2goY29uc3Qgdm9pZCAqeCkKIHsKIAlhbHRlcm5hdGl2ZV9pbnB1dChBU01fTk9QNCwKIAkJCSAgInByZWZldGNobnRhICglMSkiLApAQCAtNjc3LDcgKzY5Myw3IEBACiAKIC8qIDNkbm93ISBwcmVmZXRjaCB0byBnZXQgYW4gZXhjbHVzaXZlIGNhY2hlIGxpbmUuIFVzZWZ1bCBmb3IgCiAgICBzcGlubG9ja3MgdG8gYXZvaWQgb25lIHN0YXRlIHRyYW5zaXRpb24gaW4gdGhlIGNhY2hlIGNvaGVyZW5jeSBwcm90b2NvbC4gKi8KLWV4dGVybiBpbmxpbmUgdm9pZCBwcmVmZXRjaHcoY29uc3Qgdm9pZCAqeCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVmZXRjaHcoY29uc3Qgdm9pZCAqeCkKIHsKIAlhbHRlcm5hdGl2ZV9pbnB1dChBU01fTk9QNCwKIAkJCSAgInByZWZldGNodyAoJTEpIiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1pMzg2L3B0cmFjZS5oCmluZGV4IDA1NTMyODcuLjdlMGYyOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wdHJhY2UuaApAQCAtNjEsNiArNjEsMTMgQEAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIGV4dGVybiB2b2lkIHNlbmRfc2lndHJhcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBlcnJvcl9jb2RlKTsKIAorLyoKKyAqIHVzZXJfbW9kZV92bShyZWdzKSBkZXRlcm1pbmVzIHdoZXRoZXIgYSByZWdpc3RlciBzZXQgY2FtZSBmcm9tIHVzZXIgbW9kZS4KKyAqIFRoaXMgaXMgdHJ1ZSBpZiBWODA4NiBtb2RlIHdhcyBlbmFibGVkIE9SIGlmIHRoZSByZWdpc3RlciBzZXQgd2FzIGZyb20KKyAqIHByb3RlY3RlZCBtb2RlIHdpdGggUlBMLTMgQ1MgdmFsdWUuICBUaGlzIHRyaWNreSB0ZXN0IGNoZWNrcyB0aGF0IHdpdGgKKyAqIG9uZSBjb21wYXJpc29uLiAgTWFueSBwbGFjZXMgaW4gdGhlIGtlcm5lbCBjYW4gYnlwYXNzIHRoaXMgZnVsbCBjaGVjaworICogaWYgdGhleSBoYXZlIGFscmVhZHkgcnVsZWQgb3V0IFY4MDg2IG1vZGUsIHNvIHVzZXJfbW9kZShyZWdzKSBjYW4gYmUgdXNlZC4KKyAqLwogc3RhdGljIGlubGluZSBpbnQgdXNlcl9tb2RlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXJldHVybiAocmVncy0+eGNzICYgMykgIT0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc2V0dXAuaCBiL2luY2x1ZGUvYXNtLWkzODYvc2V0dXAuaAppbmRleCA3YTMyMTg0Li44MjZhOGNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3NldHVwLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zZXR1cC5oCkBAIC00NCw3ICs0NCw3IEBACiAjZGVmaW5lIEVGSV9TWVNUQUIgKChlZmlfc3lzdGVtX3RhYmxlX3QgKikgKigodW5zaWduZWQgbG9uZyAqKShQQVJBTSsweDFjNCkpKQogI2RlZmluZSBFRklfTUVNREVTQ19TSVpFICgqKCh1bnNpZ25lZCBsb25nICopIChQQVJBTSsweDFjOCkpKQogI2RlZmluZSBFRklfTUVNREVTQ19WRVJTSU9OICgqKCh1bnNpZ25lZCBsb25nICopIChQQVJBTSsweDFjYykpKQotI2RlZmluZSBFRklfTUVNTUFQICgoZWZpX21lbW9yeV9kZXNjX3QgKikgKigodW5zaWduZWQgbG9uZyAqKShQQVJBTSsweDFkMCkpKQorI2RlZmluZSBFRklfTUVNTUFQICgodm9pZCAqKSAqKCh1bnNpZ25lZCBsb25nICopKFBBUkFNKzB4MWQwKSkpCiAjZGVmaW5lIEVGSV9NRU1NQVBfU0laRSAoKigodW5zaWduZWQgbG9uZyAqKSAoUEFSQU0rMHgxZDQpKSkKICNkZWZpbmUgTU9VTlRfUk9PVF9SRE9OTFkgKCoodW5zaWduZWQgc2hvcnQgKikgKFBBUkFNKzB4MUYyKSkKICNkZWZpbmUgUkFNRElTS19GTEFHUyAoKih1bnNpZ25lZCBzaG9ydCAqKSAoUEFSQU0rMHgxRjgpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zbXAuaCBiL2luY2x1ZGUvYXNtLWkzODYvc21wLmgKaW5kZXggYTI4MzczOC4uMTMyNTAxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3NtcC5oCkBAIC01OSw3ICs1OSw3IEBACiAKIGV4dGVybiBjcHVtYXNrX3QgY3B1X2NhbGxvdXRfbWFwOwogZXh0ZXJuIGNwdW1hc2tfdCBjcHVfY2FsbGluX21hcDsKLSNkZWZpbmUgY3B1X3Bvc3NpYmxlX21hcCBjcHVfY2FsbG91dF9tYXAKK2V4dGVybiBjcHVtYXNrX3QgY3B1X3Bvc3NpYmxlX21hcDsKIAogLyogV2UgZG9uJ3QgbWFyayBDUFVzIG9ubGluZSB1bnRpbCBfX2NwdV91cCgpLCBzbyB3ZSBuZWVkIGFub3RoZXIgbWVhc3VyZSAqLwogc3RhdGljIGlubGluZSBpbnQgbnVtX2Jvb3RpbmdfY3B1cyh2b2lkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20taTM4Ni9zcGlubG9jay5oCmluZGV4IGY5ZmYzMWYuLjIzNjA0MzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3NwaW5sb2NrLmgKQEAgLTcsNDYgKzcsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCi1hc21saW5rYWdlIGludCBwcmludGsoY29uc3QgY2hhciAqIGZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKLQogLyoKICAqIFlvdXIgYmFzaWMgU01QIHNwaW5sb2NrcywgYWxsb3dpbmcgb25seSBhIHNpbmdsZSBDUFUgYW55d2hlcmUKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IHNsb2NrOwotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCXVuc2lnbmVkIG1hZ2ljOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSBzcGlubG9ja190OwotCi0jZGVmaW5lIFNQSU5MT0NLX01BR0lDCTB4ZGVhZDRlYWQKLQotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotI2RlZmluZSBTUElOTE9DS19NQUdJQ19JTklUCSwgU1BJTkxPQ0tfTUFHSUMKLSNlbHNlCi0jZGVmaW5lIFNQSU5MT0NLX01BR0lDX0lOSVQJLyogKi8KLSNlbmRpZgotCi0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRCAoc3BpbmxvY2tfdCkgeyAxIFNQSU5MT0NLX01BR0lDX0lOSVQgfQotCi0jZGVmaW5lIHNwaW5fbG9ja19pbml0KHgpCWRvIHsgKih4KSA9IFNQSU5fTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi0vKgorICoKICAqIFNpbXBsZSBzcGluIGxvY2sgb3BlcmF0aW9ucy4gIFRoZXJlIGFyZSB0d28gdmFyaWFudHMsIG9uZSBjbGVhcnMgSVJRJ3MKICAqIG9uIHRoZSBsb2NhbCBwcm9jZXNzb3IsIG9uZSBkb2VzIG5vdC4KICAqCiAgKiBXZSBtYWtlIG5vIGZhaXJuZXNzIGFzc3VtcHRpb25zLiBUaGV5IGhhdmUgYSBjb3N0LgorICoKKyAqICh0aGUgdHlwZSBkZWZpbml0aW9ucyBhcmUgaW4gYXNtL3NwaW5sb2NrX3R5cGVzLmgpCiAgKi8KIAotI2RlZmluZSBzcGluX2lzX2xvY2tlZCh4KQkoKih2b2xhdGlsZSBzaWduZWQgY2hhciAqKSgmKHgpLT5zbG9jaykgPD0gMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdCh4KQlkbyB7IGJhcnJpZXIoKTsgfSB3aGlsZShzcGluX2lzX2xvY2tlZCh4KSkKKyNkZWZpbmUgX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkgXAorCQkoKih2b2xhdGlsZSBzaWduZWQgY2hhciAqKSgmKHgpLT5zbG9jaykgPD0gMCkKIAotI2RlZmluZSBzcGluX2xvY2tfc3RyaW5nIFwKKyNkZWZpbmUgX19yYXdfc3Bpbl9sb2NrX3N0cmluZyBcCiAJIlxuMTpcdCIgXAogCSJsb2NrIDsgZGVjYiAlMFxuXHQiIFwKIAkiam5zIDNmXG4iIFwKQEAgLTU3LDcgKzMyLDcgQEAKIAkiam1wIDFiXG4iIFwKIAkiMzpcblx0IgogCi0jZGVmaW5lIHNwaW5fbG9ja19zdHJpbmdfZmxhZ3MgXAorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfc3RyaW5nX2ZsYWdzIFwKIAkiXG4xOlx0IiBcCiAJImxvY2sgOyBkZWNiICUwXG5cdCIgXAogCSJqbnMgNGZcblx0IiBcCkBAIC03Myw1MiArNDgsMjEgQEAKIAkiam1wIDFiXG4iIFwKIAkiNDpcblx0IgogCi0vKgotICogVGhpcyB3b3Jrcy4gRGVzcGl0ZSBhbGwgdGhlIGNvbmZ1c2lvbi4KLSAqIChleGNlcHQgb24gUFBybyBTTVAgb3IgaWYgd2UgYXJlIHVzaW5nIE9PU1RPUkUpCi0gKiAoUFBybyBlcnJhdGEgNjYsIDkyKQotICovCi0KLSNpZiAhZGVmaW5lZChDT05GSUdfWDg2X09PU1RPUkUpICYmICFkZWZpbmVkKENPTkZJR19YODZfUFBST19GRU5DRSkKLQotI2RlZmluZSBzcGluX3VubG9ja19zdHJpbmcgXAotCSJtb3ZiICQxLCUwIiBcCi0JCToiPW0iIChsb2NrLT5zbG9jaykgOiA6ICJtZW1vcnkiCi0KLQotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JQlVHX09OKGxvY2stPm1hZ2ljICE9IFNQSU5MT0NLX01BR0lDKTsKLQlCVUdfT04oIXNwaW5faXNfbG9ja2VkKGxvY2spKTsKLSNlbmRpZgogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlzcGluX3VubG9ja19zdHJpbmcKLQkpOworCQlfX3Jhd19zcGluX2xvY2tfc3RyaW5nCisJCToiPW0iIChsb2NrLT5zbG9jaykgOiA6ICJtZW1vcnkiKTsKIH0KIAotI2Vsc2UKLQotI2RlZmluZSBzcGluX3VubG9ja19zdHJpbmcgXAotCSJ4Y2hnYiAlYjAsICUxIiBcCi0JCToiPXEiIChvbGR2YWwpLCAiPW0iIChsb2NrLT5zbG9jaykgXAotCQk6IjAiIChvbGR2YWwpIDogIm1lbW9yeSIKLQotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2tfZmxhZ3MocmF3X3NwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0JY2hhciBvbGR2YWwgPSAxOwotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCUJVR19PTihsb2NrLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQyk7Ci0JQlVHX09OKCFzcGluX2lzX2xvY2tlZChsb2NrKSk7Ci0jZW5kaWYKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJc3Bpbl91bmxvY2tfc3RyaW5nCi0JKTsKKwkJX19yYXdfc3Bpbl9sb2NrX3N0cmluZ19mbGFncworCQk6Ij1tIiAobG9jay0+c2xvY2spIDogInIiIChmbGFncykgOiAibWVtb3J5Iik7CiB9CiAKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCWNoYXIgb2xkdmFsOwogCV9fYXNtX18gX192b2xhdGlsZV9fKApAQCAtMTI4LDMyICs3Miw0OCBAQAogCXJldHVybiBvbGR2YWwgPiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaykKKy8qCisgKiBfX3Jhd19zcGluX3VubG9jayBiYXNlZCBvbiB3cml0aW5nICQxIHRvIHRoZSBsb3cgYnl0ZS4KKyAqIFRoaXMgbWV0aG9kIHdvcmtzLiBEZXNwaXRlIGFsbCB0aGUgY29uZnVzaW9uLgorICogKGV4Y2VwdCBvbiBQUHJvIFNNUCBvciBpZiB3ZSBhcmUgdXNpbmcgT09TVE9SRSwgc28gd2UgdXNlIHhjaGdiIHRoZXJlKQorICogKFBQcm8gZXJyYXRhIDY2LCA5MikKKyAqLworCisjaWYgIWRlZmluZWQoQ09ORklHX1g4Nl9PT1NUT1JFKSAmJiAhZGVmaW5lZChDT05GSUdfWDg2X1BQUk9fRkVOQ0UpCisKKyNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2tfc3RyaW5nIFwKKwkibW92YiAkMSwlMCIgXAorCQk6Ij1tIiAobG9jay0+c2xvY2spIDogOiAibWVtb3J5IgorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQlpZiAodW5saWtlbHkobG9jay0+bWFnaWMgIT0gU1BJTkxPQ0tfTUFHSUMpKSB7Ci0JCXByaW50aygiZWlwOiAlcFxuIiwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLQkJQlVHKCk7Ci0JfQotI2VuZGlmCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCXNwaW5fbG9ja19zdHJpbmcKLQkJOiI9bSIgKGxvY2stPnNsb2NrKSA6IDogIm1lbW9yeSIpOworCQlfX3Jhd19zcGluX3VubG9ja19zdHJpbmcKKwkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX2xvY2tfZmxhZ3MgKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisjZWxzZQorCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3N0cmluZyBcCisJInhjaGdiICViMCwgJTEiIFwKKwkJOiI9cSIgKG9sZHZhbCksICI9bSIgKGxvY2stPnNsb2NrKSBcCisJCToiMCIgKG9sZHZhbCkgOiAibWVtb3J5IgorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JaWYgKHVubGlrZWx5KGxvY2stPm1hZ2ljICE9IFNQSU5MT0NLX01BR0lDKSkgewotCQlwcmludGsoImVpcDogJXBcbiIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JCUJVRygpOwotCX0KLSNlbmRpZgorCWNoYXIgb2xkdmFsID0gMTsKKwogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlzcGluX2xvY2tfc3RyaW5nX2ZsYWdzCi0JCToiPW0iIChsb2NrLT5zbG9jaykgOiAiciIgKGZsYWdzKSA6ICJtZW1vcnkiKTsKKwkJX19yYXdfc3Bpbl91bmxvY2tfc3RyaW5nCisJKTsKIH0KIAorI2VuZGlmCisKKyNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChsb2NrKSBcCisJZG8geyB3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQobG9jaykpIGNwdV9yZWxheCgpOyB9IHdoaWxlICgwKQorCiAvKgogICogUmVhZC13cml0ZSBzcGlubG9ja3MsIGFsbG93aW5nIG11bHRpcGxlIHJlYWRlcnMKICAqIGJ1dCBvbmx5IG9uZSB3cml0ZXIuCkBAIC0xNjMsNDIgKzEyMyw3IEBACiAgKiBjYW4gIm1peCIgaXJxLXNhZmUgbG9ja3MgLSBhbnkgd3JpdGVyIG5lZWRzIHRvIGdldCBhCiAgKiBpcnEtc2FmZSB3cml0ZS1sb2NrLCBidXQgcmVhZGVycyBjYW4gZ2V0IG5vbi1pcnFzYWZlCiAgKiByZWFkLWxvY2tzLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JdW5zaWduZWQgbWFnaWM7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHJ3bG9ja190OwotCi0jZGVmaW5lIFJXTE9DS19NQUdJQwkweGRlYWYxZWVkCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLSNkZWZpbmUgUldMT0NLX01BR0lDX0lOSVQJLCBSV0xPQ0tfTUFHSUMKLSNlbHNlCi0jZGVmaW5lIFJXTE9DS19NQUdJQ19JTklUCS8qICovCi0jZW5kaWYKLQotI2RlZmluZSBSV19MT0NLX1VOTE9DS0VEIChyd2xvY2tfdCkgeyBSV19MT0NLX0JJQVMgUldMT0NLX01BR0lDX0lOSVQgfQotCi0jZGVmaW5lIHJ3bG9ja19pbml0KHgpCWRvIHsgKih4KSA9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLQotLyoqCi0gKiByZWFkX2Nhbl9sb2NrIC0gd291bGQgcmVhZF90cnlsb2NrKCkgc3VjY2VlZD8KLSAqIEBsb2NrOiB0aGUgcndsb2NrIGluIHF1ZXN0aW9uLgotICovCi0jZGVmaW5lIHJlYWRfY2FuX2xvY2soeCkgKChpbnQpKHgpLT5sb2NrID4gMCkKLQotLyoqCi0gKiB3cml0ZV9jYW5fbG9jayAtIHdvdWxkIHdyaXRlX3RyeWxvY2soKSBzdWNjZWVkPwotICogQGxvY2s6IHRoZSByd2xvY2sgaW4gcXVlc3Rpb24uCi0gKi8KLSNkZWZpbmUgd3JpdGVfY2FuX2xvY2soeCkgKCh4KS0+bG9jayA9PSBSV19MT0NLX0JJQVMpCi0KLS8qCisgKgogICogT24geDg2LCB3ZSBpbXBsZW1lbnQgcmVhZC13cml0ZSBsb2NrcyBhcyBhIDMyLWJpdCBjb3VudGVyCiAgKiB3aXRoIHRoZSBoaWdoIGJpdCAoc2lnbikgYmVpbmcgdGhlICJjb250ZW5kZWQiIGJpdC4KICAqCkBAIC0yMDYsMjkgKzEzMSwzMyBAQAogICoKICAqIENoYW5nZWQgdG8gdXNlIHRoZSBzYW1lIHRlY2huaXF1ZSBhcyBydyBzZW1hcGhvcmVzLiAgU2VlCiAgKiBzZW1hcGhvcmUuaCBmb3IgZGV0YWlscy4gIC1iZW4KKyAqCisgKiB0aGUgaGVscGVycyBhcmUgaW4gYXJjaC9pMzg2L2tlcm5lbC9zZW1hcGhvcmUuYwogICovCi0vKiB0aGUgc3BpbmxvY2sgaGVscGVycyBhcmUgaW4gYXJjaC9pMzg2L2tlcm5lbC9zZW1hcGhvcmUuYyAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19yZWFkX2xvY2socndsb2NrX3QgKnJ3KQorLyoqCisgKiByZWFkX2Nhbl9sb2NrIC0gd291bGQgcmVhZF90cnlsb2NrKCkgc3VjY2VlZD8KKyAqIEBsb2NrOiB0aGUgcndsb2NrIGluIHF1ZXN0aW9uLgorICovCisjZGVmaW5lIF9fcmF3X3JlYWRfY2FuX2xvY2soeCkJCSgoaW50KSh4KS0+bG9jayA+IDApCisKKy8qKgorICogd3JpdGVfY2FuX2xvY2sgLSB3b3VsZCB3cml0ZV90cnlsb2NrKCkgc3VjY2VlZD8KKyAqIEBsb2NrOiB0aGUgcndsb2NrIGluIHF1ZXN0aW9uLgorICovCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHgpCQkoKHgpLT5sb2NrID09IFJXX0xPQ0tfQklBUykKKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3JlYWRfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCUJVR19PTihydy0+bWFnaWMgIT0gUldMT0NLX01BR0lDKTsKLSNlbmRpZgogCV9fYnVpbGRfcmVhZF9sb2NrKHJ3LCAiX19yZWFkX2xvY2tfZmFpbGVkIik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQlCVUdfT04ocnctPm1hZ2ljICE9IFJXTE9DS19NQUdJQyk7Ci0jZW5kaWYKIAlfX2J1aWxkX3dyaXRlX2xvY2socncsICJfX3dyaXRlX2xvY2tfZmFpbGVkIik7CiB9CiAKLSNkZWZpbmUgX3Jhd19yZWFkX3VubG9jayhydykJCWFzbSB2b2xhdGlsZSgibG9jayA7IGluY2wgJTAiIDoiPW0iICgocncpLT5sb2NrKSA6IDogIm1lbW9yeSIpCi0jZGVmaW5lIF9yYXdfd3JpdGVfdW5sb2NrKHJ3KQlhc20gdm9sYXRpbGUoImxvY2sgOyBhZGRsICQiIFJXX0xPQ0tfQklBU19TVFIgIiwlMCI6Ij1tIiAoKHJ3KS0+bG9jaykgOiA6ICJtZW1vcnkiKQotCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3JlYWRfdHJ5bG9jayhyd2xvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3JlYWRfdHJ5bG9jayhyYXdfcndsb2NrX3QgKmxvY2spCiB7CiAJYXRvbWljX3QgKmNvdW50ID0gKGF0b21pY190ICopbG9jazsKIAlhdG9taWNfZGVjKGNvdW50KTsKQEAgLTIzOCw3ICsxNjcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3dyaXRlX3RyeWxvY2socndsb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKIHsKIAlhdG9taWNfdCAqY291bnQgPSAoYXRvbWljX3QgKilsb2NrOwogCWlmIChhdG9taWNfc3ViX2FuZF90ZXN0KFJXX0xPQ0tfQklBUywgY291bnQpKQpAQCAtMjQ3LDQgKzE3NiwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlhc20gdm9sYXRpbGUoImxvY2sgOyBpbmNsICUwIiA6Ij1tIiAocnctPmxvY2spIDogOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlhc20gdm9sYXRpbGUoImxvY2sgOyBhZGRsICQiIFJXX0xPQ0tfQklBU19TVFIgIiwgJTAiCisJCQkJIDogIj1tIiAocnctPmxvY2spIDogOiAibWVtb3J5Iik7Cit9CisKICNlbmRpZiAvKiBfX0FTTV9TUElOTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS1pMzg2L3NwaW5sb2NrX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllZmU4NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX19BU01fU1BJTkxPQ0tfVFlQRVNfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc2xvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDEgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19yd2xvY2tfdDsKKworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VECQl7IFJXX0xPQ0tfQklBUyB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWkzODYvc3lzdGVtLmgKaW5kZXggM2RiNzE3YS4uYWNkNWMyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3N5c3RlbS5oCkBAIC0xNCw4ICsxNCw3IEBACiAKICNkZWZpbmUgc3dpdGNoX3RvKHByZXYsbmV4dCxsYXN0KSBkbyB7CQkJCQlcCiAJdW5zaWduZWQgbG9uZyBlc2ksZWRpOwkJCQkJCVwKLQlhc20gdm9sYXRpbGUoInB1c2hmbFxuXHQiCQkJCQlcCi0JCSAgICAgInB1c2hsICUlZWJwXG5cdCIJCQkJCVwKKwlhc20gdm9sYXRpbGUoInB1c2hsICUlZWJwXG5cdCIJCQkJCVwKIAkJICAgICAibW92bCAlJWVzcCwlMFxuXHQiCS8qIHNhdmUgRVNQICovCQlcCiAJCSAgICAgIm1vdmwgJTUsJSVlc3Bcblx0IgkvKiByZXN0b3JlIEVTUCAqLwlcCiAJCSAgICAgIm1vdmwgJDFmLCUxXG5cdCIJCS8qIHNhdmUgRUlQICovCQlcCkBAIC0yMyw3ICsyMiw2IEBACiAJCSAgICAgImptcCBfX3N3aXRjaF90b1xuIgkJCQlcCiAJCSAgICAgIjE6XHQiCQkJCQkJXAogCQkgICAgICJwb3BsICUlZWJwXG5cdCIJCQkJCVwKLQkJICAgICAicG9wZmwiCQkJCQkJXAogCQkgICAgIDoiPW0iIChwcmV2LT50aHJlYWQuZXNwKSwiPW0iIChwcmV2LT50aHJlYWQuZWlwKSwJXAogCQkgICAgICAiPWEiIChsYXN0KSwiPVMiIChlc2kpLCI9RCIgKGVkaSkJCQlcCiAJCSAgICAgOiJtIiAobmV4dC0+dGhyZWFkLmVzcCksIm0iIChuZXh0LT50aHJlYWQuZWlwKSwJXApAQCAtOTMsMTMgKzkxLDEzIEBACiAJCSIuYWxpZ24gNFxuXHQiCQkJXAogCQkiLmxvbmcgMWIsM2JcbiIJCQlcCiAJCSIucHJldmlvdXMiCQkJXAotCQk6IDoibSIgKHZhbHVlKSkKKwkJOiA6InJtIiAodmFsdWUpKQogCiAvKgogICogU2F2ZSBhIHNlZ21lbnQgcmVnaXN0ZXIgYXdheQogICovCiAjZGVmaW5lIHNhdmVzZWdtZW50KHNlZywgdmFsdWUpIFwKLQlhc20gdm9sYXRpbGUoIm1vdiAlJSIgI3NlZyAiLCUwIjoiPW0iICh2YWx1ZSkpCisJYXNtIHZvbGF0aWxlKCJtb3YgJSUiICNzZWcgIiwlMCI6Ij1ybSIgKHZhbHVlKSkKIAogLyoKICAqIENsZWFyIGFuZCBzZXQgJ1RTJyBiaXQgcmVzcGVjdGl2ZWx5CkBAIC0xMDcsMTMgKzEwNSwzMyBAQAogI2RlZmluZSBjbHRzKCkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbHRzIikKICNkZWZpbmUgcmVhZF9jcjAoKSAoeyBcCiAJdW5zaWduZWQgaW50IF9fZHVtbXk7IFwKLQlfX2FzbV9fKCBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKIAkJIm1vdmwgJSVjcjAsJTBcblx0IiBcCiAJCToiPXIiIChfX2R1bW15KSk7IFwKIAlfX2R1bW15OyBcCiB9KQogI2RlZmluZSB3cml0ZV9jcjAoeCkgXAotCV9fYXNtX18oIm1vdmwgJTAsJSVjcjAiOiA6InIiICh4KSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJTAsJSVjcjAiOiA6InIiICh4KSk7CisKKyNkZWZpbmUgcmVhZF9jcjIoKSAoeyBcCisJdW5zaWduZWQgaW50IF9fZHVtbXk7IFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAorCQkibW92bCAlJWNyMiwlMFxuXHQiIFwKKwkJOiI9ciIgKF9fZHVtbXkpKTsgXAorCV9fZHVtbXk7IFwKK30pCisjZGVmaW5lIHdyaXRlX2NyMih4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJTAsJSVjcjIiOiA6InIiICh4KSk7CisKKyNkZWZpbmUgcmVhZF9jcjMoKSAoeyBcCisJdW5zaWduZWQgaW50IF9fZHVtbXk7IFwKKwlfX2FzbV9fICggXAorCQkibW92bCAlJWNyMywlMFxuXHQiIFwKKwkJOiI9ciIgKF9fZHVtbXkpKTsgXAorCV9fZHVtbXk7IFwKK30pCisjZGVmaW5lIHdyaXRlX2NyMyh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJTAsJSVjcjMiOiA6InIiICh4KSk7CiAKICNkZWZpbmUgcmVhZF9jcjQoKSAoeyBcCiAJdW5zaWduZWQgaW50IF9fZHVtbXk7IFwKQEAgLTEyMyw3ICsxNDEsNyBAQAogCV9fZHVtbXk7IFwKIH0pCiAjZGVmaW5lIHdyaXRlX2NyNCh4KSBcCi0JX19hc21fXygibW92bCAlMCwlJWNyNCI6IDoiciIgKHgpKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlMCwlJWNyNCI6IDoiciIgKHgpKTsKICNkZWZpbmUgc3R0cygpIHdyaXRlX2NyMCg4IHwgcmVhZF9jcjAoKSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KQEAgLTQ0Nyw2ICs0NjUsOCBAQAogI2RlZmluZSBsb2NhbF9pcnFfZW5hYmxlKCkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN0aSI6IDogOiJtZW1vcnkiKQogLyogdXNlZCBpbiB0aGUgaWRsZSBsb29wOyBzdGkgdGFrZXMgb25lIGluc3RydWN0aW9uIGN5Y2xlIHRvIGNvbXBsZXRlICovCiAjZGVmaW5lIHNhZmVfaGFsdCgpCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RpOyBobHQiOiA6IDoibWVtb3J5IikKKy8qIHVzZWQgd2hlbiBpbnRlcnJ1cHRzIGFyZSBhbHJlYWR5IGVuYWJsZWQgb3IgdG8gc2h1dGRvd24gdGhlIHByb2Nlc3NvciAqLworI2RlZmluZSBoYWx0KCkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaGx0IjogOiA6Im1lbW9yeSIpCiAKICNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCQkJXAogKHsJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaAppbmRleCA5NWFkZDgxLi44ZmJmNzkxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oCkBAIC00OCw3ICs0OCw3IEBACiAKICNlbHNlIC8qICFfX0FTU0VNQkxZX18gKi8KIAotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjZW5kaWYKIApAQCAtMTM5LDYgKzEzOSw3IEBACiAjZGVmaW5lIFRJRl9ORUVEX1JFU0NIRUQJMwkvKiByZXNjaGVkdWxpbmcgbmVjZXNzYXJ5ICovCiAjZGVmaW5lIFRJRl9TSU5HTEVTVEVQCQk0CS8qIHJlc3RvcmUgc2luZ2xlc3RlcCBvbiByZXR1cm4gdG8gdXNlciBtb2RlICovCiAjZGVmaW5lIFRJRl9JUkVUCQk1CS8qIHJldHVybiB3aXRoIGlyZXQgKi8KKyNkZWZpbmUgVElGX1NZU0NBTExfRU1VCQk2CS8qIHN5c2NhbGwgZW11bGF0aW9uIGFjdGl2ZSAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9BVURJVAk3CS8qIHN5c2NhbGwgYXVkaXRpbmcgYWN0aXZlICovCiAjZGVmaW5lIFRJRl9TRUNDT01QCQk4CS8qIHNlY3VyZSBjb21wdXRpbmcgKi8KICNkZWZpbmUgVElGX1BPTExJTkdfTlJGTEFHCTE2CS8qIHRydWUgaWYgcG9sbF9pZGxlKCkgaXMgcG9sbGluZyBUSUZfTkVFRF9SRVNDSEVEICovCkBAIC0xNTAsMTMgKzE1MSwxNSBAQAogI2RlZmluZSBfVElGX05FRURfUkVTQ0hFRAkoMTw8VElGX05FRURfUkVTQ0hFRCkKICNkZWZpbmUgX1RJRl9TSU5HTEVTVEVQCQkoMTw8VElGX1NJTkdMRVNURVApCiAjZGVmaW5lIF9USUZfSVJFVAkJKDE8PFRJRl9JUkVUKQorI2RlZmluZSBfVElGX1NZU0NBTExfRU1VCSgxPDxUSUZfU1lTQ0FMTF9FTVUpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMTw8VElGX1NZU0NBTExfQVVESVQpCiAjZGVmaW5lIF9USUZfU0VDQ09NUAkJKDE8PFRJRl9TRUNDT01QKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCiAKIC8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KICNkZWZpbmUgX1RJRl9XT1JLX01BU0sgXAotICAoMHgwMDAwRkZGRiAmIH4oX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU1lTQ0FMTF9BVURJVHxfVElGX1NJTkdMRVNURVB8X1RJRl9TRUNDT01QKSkKKyAgKDB4MDAwMEZGRkYgJiB+KF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVR8X1RJRl9TSU5HTEVTVEVQfFwKKwkJICBfVElGX1NFQ0NPTVB8X1RJRl9TWVNDQUxMX0VNVSkpCiAvKiB3b3JrIHRvIGRvIG9uIGFueSByZXR1cm4gdG8gdS1zcGFjZSAqLwogI2RlZmluZSBfVElGX0FMTFdPUktfTUFTSwkoMHgwMDAwRkZGRiAmIH5fVElGX1NFQ0NPTVApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdGltZXIuaCBiL2luY2x1ZGUvYXNtLWkzODYvdGltZXIuaAppbmRleCBkY2YxZTA3Li5hZWQxNjQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3RpbWVyLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90aW1lci5oCkBAIC0xLDYgKzEsNyBAQAogI2lmbmRlZiBfQVNNaTM4Nl9USU1FUl9ICiAjZGVmaW5lIF9BU01pMzg2X1RJTUVSX0gKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KIAogLyoqCiAgKiBzdHJ1Y3QgdGltZXJfb3BzIC0gdXNlZCB0byBkZWZpbmUgYSB0aW1lciBzb3VyY2UKQEAgLTIzLDYgKzI0LDggQEAKIAl1bnNpZ25lZCBsb25nIGxvbmcgKCptb25vdG9uaWNfY2xvY2spKHZvaWQpOwogCXZvaWQgKCpkZWxheSkodW5zaWduZWQgbG9uZyk7CiAJdW5zaWduZWQgbG9uZyAoKnJlYWRfdGltZXIpKHZvaWQpOworCWludCAoKnN1c3BlbmQpKHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICgqcmVzdW1lKSh2b2lkKTsKIH07CiAKIHN0cnVjdCBpbml0X3RpbWVyX29wdHMgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni90eXBlcy5oIGIvaW5jbHVkZS9hc20taTM4Ni90eXBlcy5oCmluZGV4IDkwMWI3N2MuLmNlZDAwZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3R5cGVzLmgKQEAgLTYzLDggKzYzLDYgQEAKICNkZWZpbmUgSEFWRV9TRUNUT1JfVAogI2VuZGlmCiAKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQga21lbV9idWZjdGxfdDsKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaAppbmRleCA4ODY4NjdhLi44OWFiN2UyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaApAQCAtODMsMzAgKzgzLDYgQEAKICAqLwogI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpIChsaWtlbHkoX19yYW5nZV9vayhhZGRyLHNpemUpID09IDApKQogCi0vKioKLSAqIHZlcmlmeV9hcmVhOiAtIE9ic29sZXRlL2RlcHJlY2F0ZWQgYW5kIHdpbGwgZ28gYXdheSBzb29uLAotICogdXNlIGFjY2Vzc19vaygpIGluc3RlYWQuCi0gKiBAdHlwZTogVHlwZSBvZiBhY2Nlc3M6ICVWRVJJRllfUkVBRCBvciAlVkVSSUZZX1dSSVRFCi0gKiBAYWRkcjogVXNlciBzcGFjZSBwb2ludGVyIHRvIHN0YXJ0IG9mIGJsb2NrIHRvIGNoZWNrCi0gKiBAc2l6ZTogU2l6ZSBvZiBibG9jayB0byBjaGVjawotICoKLSAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiByZXBsYWNlZCBieSBhY2Nlc3Nfb2soKS4KLSAqCi0gKiBDaGVja3MgaWYgYSBwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UgaXMgdmFsaWQuCi0gKgotICogUmV0dXJucyB6ZXJvIGlmIHRoZSBtZW1vcnkgYmxvY2sgbWF5IGJlIHZhbGlkLCAtRUZBVUxUCi0gKiBpZiBpdCBpcyBkZWZpbml0ZWx5IGludmFsaWQuCi0gKgotICogU2VlIGFjY2Vzc19vaygpIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKiBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni94b3IuaCBiL2luY2x1ZGUvYXNtLWkzODYveG9yLmgKaW5kZXggZjgwZTJkYi4uMjNjODZjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni94b3IuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3hvci5oCkBAIC01MzUsMTQgKzUzNSwxNCBAQAogCiAjZGVmaW5lIFhNTVNfU0FWRSBkbyB7CQkJCVwKIAlwcmVlbXB0X2Rpc2FibGUoKTsJCQlcCisJY3IwID0gcmVhZF9jcjAoKTsJCQlcCisJY2x0cygpOwkJCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fICggCQkJXAotCQkibW92bCAlJWNyMCwlMAkJO1xuXHQiCVwKLQkJImNsdHMJCQk7XG5cdCIJXAotCQkibW92dXBzICUleG1tMCwoJTEpCTtcblx0IglcCi0JCSJtb3Z1cHMgJSV4bW0xLDB4MTAoJTEpCTtcblx0IglcCi0JCSJtb3Z1cHMgJSV4bW0yLDB4MjAoJTEpCTtcblx0IglcCi0JCSJtb3Z1cHMgJSV4bW0zLDB4MzAoJTEpCTtcblx0IglcCi0JCTogIj0mciIgKGNyMCkJCQlcCisJCSJtb3Z1cHMgJSV4bW0wLCglMCkJO1xuXHQiCVwKKwkJIm1vdnVwcyAlJXhtbTEsMHgxMCglMCkJO1xuXHQiCVwKKwkJIm1vdnVwcyAlJXhtbTIsMHgyMCglMCkJO1xuXHQiCVwKKwkJIm1vdnVwcyAlJXhtbTMsMHgzMCglMCkJO1xuXHQiCVwKKwkJOgkJCQlcCiAJCTogInIiICh4bW1fc2F2ZSkgCQlcCiAJCTogIm1lbW9yeSIpOwkJCVwKIH0gd2hpbGUoMCkKQEAgLTU1MCwxNCArNTUwLDE0IEBACiAjZGVmaW5lIFhNTVNfUkVTVE9SRSBkbyB7CQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fICggCQkJXAogCQkic2ZlbmNlCQkJO1xuXHQiCVwKLQkJIm1vdnVwcyAoJTEpLCUleG1tMAk7XG5cdCIJXAotCQkibW92dXBzIDB4MTAoJTEpLCUleG1tMQk7XG5cdCIJXAotCQkibW92dXBzIDB4MjAoJTEpLCUleG1tMgk7XG5cdCIJXAotCQkibW92dXBzIDB4MzAoJTEpLCUleG1tMwk7XG5cdCIJXAotCQkibW92bCAJJTAsJSVjcjAJO1xuXHQiCVwKKwkJIm1vdnVwcyAoJTApLCUleG1tMAk7XG5cdCIJXAorCQkibW92dXBzIDB4MTAoJTApLCUleG1tMQk7XG5cdCIJXAorCQkibW92dXBzIDB4MjAoJTApLCUleG1tMgk7XG5cdCIJXAorCQkibW92dXBzIDB4MzAoJTApLCUleG1tMwk7XG5cdCIJXAogCQk6CQkJCVwKLQkJOiAiciIgKGNyMCksICJyIiAoeG1tX3NhdmUpCVwKKwkJOiAiciIgKHhtbV9zYXZlKQkJXAogCQk6ICJtZW1vcnkiKTsJCQlcCisJd3JpdGVfY3IwKGNyMCk7CQkJCVwKIAlwcmVlbXB0X2VuYWJsZSgpOwkJCVwKIH0gd2hpbGUoMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9hY3BpLWV4dC5oIGIvaW5jbHVkZS9hc20taWE2NC9hY3BpLWV4dC5oCmluZGV4IDkyNzFkNzQuLjU2ZDJkZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvYWNwaS1leHQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2FjcGktZXh0LmgKQEAgLTExLDYgKzExLDcgQEAKICNkZWZpbmUgX0FTTV9JQTY0X0FDUElfRVhUX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CiAKIGV4dGVybiBhY3BpX3N0YXR1cyBocF9hY3BpX2Nzcl9zcGFjZSAoYWNwaV9oYW5kbGUsIHU2NCAqYmFzZSwgdTY0ICpsZW5ndGgpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaCBiL2luY2x1ZGUvYXNtLWlhNjQvYWNwaS5oCmluZGV4IDRjMDZkNDUuLjNhNTQ0ZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvYWNwaS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvYWNwaS5oCkBAIC0xMTYsNiArMTE2LDExIEBACiAKIGV4dGVybiB1MTYgaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtdOwogCisvKgorICogUmVmZXIgSW50ZWwgQUNQSSBfUERDIHN1cHBvcnQgZG9jdW1lbnQgZm9yIGJpdCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUCAgICAgMHg4CisKICNlbmRpZiAvKl9fS0VSTkVMX18qLwogCiAjZW5kaWYgLypfQVNNX0FDUElfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2F1eHZlYy5oIGIvaW5jbHVkZS9hc20taWE2NC9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NlYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9hdXh2ZWMuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9BU01fSUE2NF9BVVhWRUNfSAorI2RlZmluZSBfQVNNX0lBNjRfQVVYVkVDX0gKKworLyoKKyAqIEFyY2hpdGVjdHVyZS1uZXV0cmFsIEFUXyB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSAwLTE3LiAgTGVhdmUgc29tZSByb29tIGZvciBtb3JlIG9mCisgKiB0aGVtLCBzdGFydCB0aGUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIG9uZXMgYXQgMzIuCisgKi8KKyNkZWZpbmUgQVRfU1lTSU5GTwkzMgorI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIJMzMKKworI2VuZGlmIC8qIF9BU01fSUE2NF9BVVhWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvY29tcGF0LmgKaW5kZXggMGMwNWU1Yi4uYWFmMTFmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2NvbXBhdC5oCkBAIC0xMywxMCArMTMsMTAgQEAKIHR5cGVkZWYgczMyCQljb21wYXRfY2xvY2tfdDsKIHR5cGVkZWYgczMyCQljb21wYXRfa2V5X3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X3BpZF90OwotdHlwZWRlZiB1MTYJCWNvbXBhdF91aWRfdDsKLXR5cGVkZWYgdTE2CQljb21wYXRfZ2lkX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X3VpZDMyX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X2dpZDMyX3Q7Cit0eXBlZGVmIHUxNgkJX19jb21wYXRfdWlkX3Q7Cit0eXBlZGVmIHUxNgkJX19jb21wYXRfZ2lkX3Q7Cit0eXBlZGVmIHUzMgkJX19jb21wYXRfdWlkMzJfdDsKK3R5cGVkZWYgdTMyCQlfX2NvbXBhdF9naWQzMl90OwogdHlwZWRlZiB1MTYJCWNvbXBhdF9tb2RlX3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X2lub190OwogdHlwZWRlZiB1MTYJCWNvbXBhdF9kZXZfdDsKQEAgLTUwLDggKzUwLDggQEAKIAljb21wYXRfaW5vX3QJc3RfaW5vOwogCWNvbXBhdF9tb2RlX3QJc3RfbW9kZTsKIAljb21wYXRfbmxpbmtfdAlzdF9ubGluazsKLQljb21wYXRfdWlkX3QJc3RfdWlkOwotCWNvbXBhdF9naWRfdAlzdF9naWQ7CisJX19jb21wYXRfdWlkX3QJc3RfdWlkOworCV9fY29tcGF0X2dpZF90CXN0X2dpZDsKIAljb21wYXRfZGV2X3QJc3RfcmRldjsKIAl1MTYJCV9fcGFkMjsKIAl1MzIJCXN0X3NpemU7CkBAIC0xMjAsMTAgKzEyMCwxMCBAQAogCiBzdHJ1Y3QgY29tcGF0X2lwYzY0X3Blcm0gewogCWNvbXBhdF9rZXlfdCBrZXk7Ci0JY29tcGF0X3VpZDMyX3QgdWlkOwotCWNvbXBhdF9naWQzMl90IGdpZDsKLQljb21wYXRfdWlkMzJfdCBjdWlkOwotCWNvbXBhdF9naWQzMl90IGNnaWQ7CisJX19jb21wYXRfdWlkMzJfdCB1aWQ7CisJX19jb21wYXRfZ2lkMzJfdCBnaWQ7CisJX19jb21wYXRfdWlkMzJfdCBjdWlkOworCV9fY29tcGF0X2dpZDMyX3QgY2dpZDsKIAl1bnNpZ25lZCBzaG9ydCBtb2RlOwogCXVuc2lnbmVkIHNob3J0IF9fcGFkMTsKIAl1bnNpZ25lZCBzaG9ydCBzZXE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2VsZi5oIGIvaW5jbHVkZS9hc20taWE2NC9lbGYuaAppbmRleCA3ZDRjY2M0Li40NDZmY2UwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvZWxmLmgKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9mcHUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9hdXh2ZWMuaD4KIAogLyoKICAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCkBAIC0xNzcsMTMgKzE3OCw2IEBACiAgICByZWxldmFudCB1bnRpbCB3ZSBoYXZlIHJlYWwgaGFyZHdhcmUgdG8gcGxheSB3aXRoLi4uICovCiAjZGVmaW5lIEVMRl9QTEFURk9STQlOVUxMCiAKLS8qCi0gKiBBcmNoaXRlY3R1cmUtbmV1dHJhbCBBVF8gdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UgMC0xNy4gIExlYXZlIHNvbWUgcm9vbSBmb3IgbW9yZSBvZgotICogdGhlbSwgc3RhcnQgdGhlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBvbmVzIGF0IDMyLgotICovCi0jZGVmaW5lIEFUX1NZU0lORk8JMzIKLSNkZWZpbmUgQVRfU1lTSU5GT19FSERSCTMzCi0KICNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpCXNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpCiAjZGVmaW5lIGVsZl9yZWFkX2ltcGxpZXNfZXhlYyhleCwgZXhlY3V0YWJsZV9zdGFjaykJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvZmNudGwuaCBiL2luY2x1ZGUvYXNtLWlhNjQvZmNudGwuaAppbmRleCBjOWY4ZDgzLi4xZGQyNzVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9mY250bC5oCkBAIC0xLDg2ICsxLDEzIEBACiAjaWZuZGVmIF9BU01fSUE2NF9GQ05UTF9ICiAjZGVmaW5lIF9BU01fSUE2NF9GQ05UTF9ICiAvKgotICogQmFzZWQgb24gPGFzbS1pMzg2L2ZjbnRsLmg+LgotICoKICAqIE1vZGlmaWVkIDE5OTgtMjAwMAogICoJRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPiwgSGV3bGV0dC1QYWNrYXJkIENvLgogICovCiAKLS8qCi0gKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uCi0gKiBmaWxlcyBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0KLSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgT19ESVJFQ1QJIDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAtIGN1cnJlbnRseSBpZ25vcmVkICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFCTAxMDAwMDAKLSNkZWZpbmUgT19ESVJFQ1RPUlkJMDIwMDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMDQwMDAwMCAvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCisjZGVmaW5lIGZvcmNlX29fbGFyZ2VmaWxlKCkJXAorCQkocGVyc29uYWxpdHkoY3VycmVudC0+cGVyc29uYWxpdHkpICE9IFBFUl9MSU5VWDMyKQogCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKLQotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCW9mZl90IGxfc3RhcnQ7Ci0Jb2ZmX3QgbF9sZW47Ci0JcGlkX3QgbF9waWQ7Ci19OwotCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0Ci0KLSNkZWZpbmUgZm9yY2Vfb19sYXJnZWZpbGUoKSAoICEgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgUEVSX0xJTlVYMzIpICkKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgogCiAjZW5kaWYgLyogX0FTTV9JQTY0X0ZDTlRMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLWlhNjQvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9oZHJlZy5oIGIvaW5jbHVkZS9hc20taWE2NC9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2I1MTYxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qCi0gKiAgbGludXgvaW5jbHVkZS9hc20taWE2NC9oZHJlZy5oCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5NC0xOTk2ICBMaW51cyBUb3J2YWxkcyAmIGF1dGhvcnMKLSAqLwotCi0jd2FybmluZyB0aGlzIGZpbGUgaXMgb2Jzb2xldGUsIHBsZWFzZSBkbyBub3QgdXNlIGl0Ci0KLSNpZm5kZWYgX19BU01fSUE2NF9IRFJFR19ICi0jZGVmaW5lIF9fQVNNX0lBNjRfSERSRUdfSAotCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGlkZV9pb3JlZ190OwotCi0jZW5kaWYgLyogX19BU01fSUE2NF9IRFJFR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2h3X2lycS5oIGIvaW5jbHVkZS9hc20taWE2NC9od19pcnEuaAppbmRleCAwNDFhYjhjLi4wY2YxMTliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2h3X2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvaHdfaXJxLmgKQEAgLTExNiwxMyArMTE2LDYgQEAKICAqIGFuZCB0byBvYnRhaW4gdGhlIGlycSBkZXNjcmlwdG9yIGZvciBhIGdpdmVuIGlycSBudW1iZXIuCiAgKi8KIAotLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgaXJxIGRlc2NyaXB0b3IgZm9yIElSUS4gICovCi1zdGF0aWMgaW5saW5lIGlycV9kZXNjX3QgKgotaXJxX2Rlc2NwIChpbnQgaXJxKQotewotCXJldHVybiBpcnFfZGVzYyArIGlycTsKLX0KLQogLyogRXh0cmFjdCB0aGUgSUEtNjQgdmVjdG9yIHRoYXQgY29ycmVzcG9uZHMgdG8gSVJRLiAgKi8KIHN0YXRpYyBpbmxpbmUgaWE2NF92ZWN0b3IKIGlycV90b192ZWN0b3IgKGludCBpcnEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2lvLmggYi9pbmNsdWRlL2FzbS1pYTY0L2lvLmgKaW5kZXggNTRlNzYzNy4uY2Y3NzJhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvaW8uaApAQCAtMjMsNyArMjMsNyBAQAogI2RlZmluZSBfX1NMT1dfRE9XTl9JTwlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIFNMT1dfRE9XTl9JTwlkbyB7IH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgX19JQTY0X1VOQ0FDSEVEX09GRlNFVAkweGMwMDAwMDAwMDAwMDAwMDBVTAkvKiByZWdpb24gNiAqLworI2RlZmluZSBfX0lBNjRfVU5DQUNIRURfT0ZGU0VUCVJHTl9CQVNFKFJHTl9VTkNBQ0hFRCkKIAogLyoKICAqIFRoZSBsZWdhY3kgSS9PIHNwYWNlIGRlZmluZWQgYnkgdGhlIGlhNjQgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIG9ubHkgNjU1MzYgcG9ydHMsIGJ1dApAQCAtNDEsNyArNDEsNyBAQAogI2RlZmluZSBJT19TUEFDRV9CQVNFKHNwYWNlKQkJKChzcGFjZSkgPDwgSU9fU1BBQ0VfQklUUykKICNkZWZpbmUgSU9fU1BBQ0VfUE9SVChwb3J0KQkJKChwb3J0KSAmIChJT19TUEFDRV9TSVpFIC0gMSkpCiAKLSNkZWZpbmUgSU9fU1BBQ0VfU1BBUlNFX0VOQ09ESU5HKHApCSgoKChwKSA+PiAyKSA8PCAxMikgfCAocCAmIDB4ZmZmKSkKKyNkZWZpbmUgSU9fU1BBQ0VfU1BBUlNFX0VOQ09ESU5HKHApCSgoKChwKSA+PiAyKSA8PCAxMikgfCAoKHApICYgMHhmZmYpKQogCiBzdHJ1Y3QgaW9fc3BhY2UgewogCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlOwkvKiBiYXNlIGluIE1NSU8gc3BhY2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvaW9zYXBpYy5oIGIvaW5jbHVkZS9hc20taWE2NC9pb3NhcGljLmgKaW5kZXggYTQyOWZlMi4uMjBmOThmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9pb3NhcGljLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9pb3NhcGljLmgKQEAgLTgwLDEyICs4MCw5IEBACiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUcgKi8KIGV4dGVybiBpbnQgZ3NpX3RvX3ZlY3RvciAodW5zaWduZWQgaW50IGdzaSk7CiBleHRlcm4gaW50IGdzaV90b19pcnEgKHVuc2lnbmVkIGludCBnc2kpOwotZXh0ZXJuIHZvaWQgaW9zYXBpY19lbmFibGVfaW50ciAodW5zaWduZWQgaW50IHZlY3Rvcik7CiBleHRlcm4gaW50IGlvc2FwaWNfcmVnaXN0ZXJfaW50ciAodW5zaWduZWQgaW50IGdzaSwgdW5zaWduZWQgbG9uZyBwb2xhcml0eSwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgdHJpZ2dlcik7Ci0jaWZkZWYgQ09ORklHX0FDUElfREVBTExPQ0FURV9JUlEKIGV4dGVybiB2b2lkIGlvc2FwaWNfdW5yZWdpc3Rlcl9pbnRyICh1bnNpZ25lZCBpbnQgaXJxKTsKLSNlbmRpZgogZXh0ZXJuIHZvaWQgX19pbml0IGlvc2FwaWNfb3ZlcnJpZGVfaXNhX2lycSAodW5zaWduZWQgaW50IGlzYV9pcnEsIHVuc2lnbmVkIGludCBnc2ksCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwb2xhcml0eSwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIHRyaWdnZXIpOwpAQCAtOTcsNyArOTQsNiBAQAogCQkJCQkgICB1bnNpZ25lZCBsb25nIHRyaWdnZXIpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBpb3NhcGljX3ZlcnNpb24gKGNoYXIgX19pb21lbSAqYWRkcik7CiAKLWV4dGVybiB2b2lkIGlvc2FwaWNfcGNpX2ZpeHVwIChpbnQpOwogI2lmZGVmIENPTkZJR19OVU1BCiBleHRlcm4gdm9pZCBfX2RldmluaXQgbWFwX2lvc2FwaWNfdG9fbm9kZSAodW5zaWduZWQgaW50LCBpbnQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2lycS5oIGIvaW5jbHVkZS9hc20taWE2NC9pcnEuaAppbmRleCBiZDA3ZDExLi5kYmU4NmMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvaXJxLmgKQEAgLTE0LDYgKzE0LDExIEBACiAjZGVmaW5lIE5SX0lSUVMJCTI1NgogI2RlZmluZSBOUl9JUlFfVkVDVE9SUwlOUl9JUlFTCiAKKy8qCisgKiBJUlEgbGluZSBzdGF0dXMgbWFjcm8gSVJRX1BFUl9DUFUgaXMgdXNlZAorICovCisjZGVmaW5lIEFSQ0hfSEFTX0lSUV9QRVJfQ1BVCisKIHN0YXRpYyBfX2lubGluZV9fIGludAogaXJxX2Nhbm9uaWNhbGl6ZSAoaW50IGlycSkKIHsKQEAgLTMwLDE0ICszNSw0IEBACiBleHRlcm4gdm9pZCBlbmFibGVfaXJxICh1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHZvaWQgc2V0X2lycV9hZmZpbml0eV9pbmZvICh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgZGVzdCwgaW50IHJlZGlyKTsKIAotI2lmZGVmIENPTkZJR19TTVAKLWV4dGVybiB2b2lkIG1vdmVfaXJxKGludCBpcnEpOwotI2Vsc2UKLSNkZWZpbmUgbW92ZV9pcnEoaXJxKQotI2VuZGlmCi0KLXN0cnVjdCBpcnFhY3Rpb247Ci1zdHJ1Y3QgcHRfcmVnczsKLWludCBoYW5kbGVfSVJRX2V2ZW50KHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IGlycWFjdGlvbiAqKTsKLQogI2VuZGlmIC8qIF9BU01fSUE2NF9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmggYi9pbmNsdWRlL2FzbS1pYTY0L2twcm9iZXMuaAppbmRleCBiZjM2YTMyLi41NzNhMzU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2twcm9iZXMuaApAQCAtOTIsNiArOTIsNyBAQAogCWtwcm9iZV9vcGNvZGVfdCBpbnNuOwogICNkZWZpbmUgSU5TVF9GTEFHX0ZJWF9SRUxBVElWRV9JUF9BRERSCQkxCiAgI2RlZmluZSBJTlNUX0ZMQUdfRklYX0JSQU5DSF9SRUcJCTIKKyAjZGVmaW5lIElOU1RfRkxBR19CUkVBS19JTlNUCQkJNAogIAl1bnNpZ25lZCBsb25nIGluc3RfZmxhZzsKICAJdW5zaWduZWQgc2hvcnQgdGFyZ2V0X2JyX3JlZzsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L21jYS5oIGIvaW5jbHVkZS9hc20taWE2NC9tY2EuaAppbmRleCAxNDlhZDAxLi45N2EyOGI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L21jYS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvbWNhLmgKQEAgLTExLDggKzExLDYgQEAKICNpZm5kZWYgX0FTTV9JQTY0X01DQV9ICiAjZGVmaW5lIF9BU01fSUE2NF9NQ0FfSAogCi0jZGVmaW5lIElBNjRfTUNBX1NUQUNLX1NJWkUJODE5MgotCiAjaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC00OCw3ICs0Niw4IEBACiAKIGVudW0gewogCUlBNjRfTUNBX1JFTkRFWl9DSEVDS0lOX05PVERPTkUJPQkweDAsCi0JSUE2NF9NQ0FfUkVOREVaX0NIRUNLSU5fRE9ORQk9CTB4MQorCUlBNjRfTUNBX1JFTkRFWl9DSEVDS0lOX0RPTkUJPQkweDEsCisJSUE2NF9NQ0FfUkVOREVaX0NIRUNLSU5fSU5JVAk9CTB4MiwKIH07CiAKIC8qIEluZm9ybWF0aW9uIG1haW50YWluZWQgYnkgdGhlIE1DIGluZnJhc3RydWN0dXJlICovCkBAIC02MywxOCArNjIsNDIgQEAKIAogfSBpYTY0X21jX2luZm9fdDsKIAotdHlwZWRlZiBzdHJ1Y3QgaWE2NF9tY2Ffc2FsX3RvX29zX3N0YXRlX3MgewotCXU2NAkJaW1zdG9fb3NfZ3A7CQkvKiBHUCBvZiB0aGUgb3MgcmVnaXN0ZXJlZCB3aXRoIHRoZSBTQUwgKi8KLQl1NjQJCWltc3RvX3BhbF9wcm9jOwkJLyogUEFMX1BST0MgZW50cnkgcG9pbnQgLSBwaHlzaWNhbCBhZGRyICovCi0JdTY0CQlpbXN0b19zYWxfcHJvYzsJCS8qIFNBTF9QUk9DIGVudHJ5IHBvaW50IC0gcGh5c2ljYWwgYWRkciAqLwotCXU2NAkJaW1zdG9fc2FsX2dwOwkJLyogR1Agb2YgdGhlIFNBTCAtIHBoeXNpY2FsICovCi0JdTY0CQlpbXN0b19yZW5kZXpfc3RhdGU7CS8qIFJlbmRleiBzdGF0ZSBpbmZvcm1hdGlvbiAqLwotCXU2NAkJaW1zdG9fc2FsX2NoZWNrX3JhOwkvKiBSZXR1cm4gYWRkcmVzcyBpbiBTQUxfQ0hFQ0sgd2hpbGUgZ29pbmcKLQkJCQkJCSAqIGJhY2sgdG8gU0FMIGZyb20gT1MgYWZ0ZXIgTUNBIGhhbmRsaW5nLgotCQkJCQkJICovCi0JdTY0CQlwYWxfbWluX3N0YXRlOwkJLyogZnJvbSBQQUwgaW4gcjE3ICovCi0JdTY0CQlwcm9jX3N0YXRlX3BhcmFtOwkvKiBmcm9tIFBBTCBpbiByMTguIFNlZSBTRFYgMjoyNjggMTEuMy4yLjEgKi8KLX0gaWE2NF9tY2Ffc2FsX3RvX29zX3N0YXRlX3Q7CisvKiBIYW5kb3ZlciBzdGF0ZSBmcm9tIFNBTCB0byBPUyBhbmQgdmljZSB2ZXJzYSwgZm9yIGJvdGggTUNBIGFuZCBJTklUIGV2ZW50cy4KKyAqIEJlc2lkZXMgdGhlIGhhbmRvdmVyIHN0YXRlLCBpdCBhbHNvIGNvbnRhaW5zIHNvbWUgc2F2ZWQgcmVnaXN0ZXJzIGZyb20gdGhlCisgKiB0aW1lIG9mIHRoZSBldmVudC4KKyAqIE5vdGU6IG1jYV9hc20uUyBkZXBlbmRzIG9uIHRoZSBwcmVjaXNlIGxheW91dCBvZiB0aGlzIHN0cnVjdHVyZS4KKyAqLworCitzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUgeworCS8qIFNBTCB0byBPUywgbXVzdCBiZSBhdCBvZmZzZXQgMCAqLworCXU2NAkJCW9zX2dwOwkJCS8qIEdQIG9mIHRoZSBvcyByZWdpc3RlcmVkIHdpdGggdGhlIFNBTCwgcGh5c2ljYWwgKi8KKwl1NjQJCQlwYWxfcHJvYzsJCS8qIFBBTF9QUk9DIGVudHJ5IHBvaW50LCBwaHlzaWNhbCAqLworCXU2NAkJCXNhbF9wcm9jOwkJLyogU0FMX1BST0MgZW50cnkgcG9pbnQsIHBoeXNpY2FsICovCisJdTY0CQkJcnZfcmM7CQkJLyogTUNBIC0gUmVuZGV6dm91cyBzdGF0ZSwgSU5JVCAtIHJlYXNvbiBjb2RlICovCisJdTY0CQkJcHJvY19zdGF0ZV9wYXJhbTsJLyogZnJvbSBSMTggKi8KKwl1NjQJCQltb25hcmNoOwkJLyogMSBmb3IgYSBtb25hcmNoIGV2ZW50LCAwIGZvciBhIHNsYXZlICovCisJLyogY29tbW9uLCBtdXN0IGZvbGxvdyBTQUwgdG8gT1MgKi8KKwl1NjQJCQlzYWxfcmE7CQkJLyogUmV0dXJuIGFkZHJlc3MgaW4gU0FMLCBwaHlzaWNhbCAqLworCXU2NAkJCXNhbF9ncDsJCQkvKiBHUCBvZiB0aGUgU0FMIC0gcGh5c2ljYWwgKi8KKwlwYWxfbWluX3N0YXRlX2FyZWFfdAkqcGFsX21pbl9zdGF0ZTsJCS8qIGZyb20gUjE3LiAgcGh5c2ljYWwgaW4gYXNtLCB2aXJ0dWFsIGluIEMgKi8KKwl1NjQJCQlwcmV2X0lBNjRfS1JfQ1VSUkVOVDsJLyogcHJldmlvdXMgdmFsdWUgb2YgSUE2NF9LUihDVVJSRU5UKSAqLworCXN0cnVjdCB0YXNrX3N0cnVjdAkqcHJldl90YXNrOwkJLyogcHJldmlvdXMgdGFzaywgTlVMTCBpZiBpdCBpcyBub3QgdXNlZnVsICovCisJLyogU29tZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzIGFyZSBub3Qgc2F2ZWQgaW4gbWluc3RhdGUsIHB0X3JlZ3Mgb3IKKwkgKiBzd2l0Y2hfc3RhY2suICBCZWNhdXNlIE1DQS9JTklUIGNhbiBvY2N1ciB3aGVuIGludGVycnVwdHMgYXJlCisJICogZGlzYWJsZWQsIHdlIG5lZWQgdG8gc2F2ZSB0aGUgYWRkaXRpb25hbCBpbnRlcnJ1cHQgcmVnaXN0ZXJzIG92ZXIKKwkgKiBNQ0EvSU5JVCBhbmQgcmVzdW1lLgorCSAqLworCXU2NAkJCWlzcjsKKwl1NjQJCQlpZmE7CisJdTY0CQkJaXRpcjsKKwl1NjQJCQlpaXBhOworCXU2NAkJCWlpbTsKKwl1NjQJCQlpaGE7CisJLyogT1MgdG8gU0FMLCBtdXN0IGZvbGxvdyBjb21tb24gKi8KKwl1NjQJCQlvc19zdGF0dXM7CQkvKiBPUyBzdGF0dXMgdG8gU0FMLCBlbnVtIGJlbG93ICovCisJdTY0CQkJY29udGV4dDsJCS8qIDAgaWYgcmV0dXJuIHRvIHNhbWUgY29udGV4dAorCQkJCQkJCSAgIDEgaWYgcmV0dXJuIHRvIG5ldyBjb250ZXh0ICovCit9OwogCiBlbnVtIHsKIAlJQTY0X01DQV9DT1JSRUNURUQJPQkweDAsCS8qIEVycm9yIGhhcyBiZWVuIGNvcnJlY3RlZCBieSBPU19NQ0EgKi8KQEAgLTg0LDM1ICsxMDcsMjEgQEAKIH07CiAKIGVudW0geworCUlBNjRfSU5JVF9SRVNVTUUJPQkweDAsCS8qIFJlc3VtZSBhZnRlciByZXR1cm4gZnJvbSBJTklUICovCisJSUE2NF9JTklUX1dBUk1fQk9PVAk9CS0xLAkvKiBXYXJtIGJvb3Qgb2YgdGhlIHN5c3RlbSBuZWVkIGZyb20gU0FMICovCit9OworCitlbnVtIHsKIAlJQTY0X01DQV9TQU1FX0NPTlRFWFQJPQkweDAsCS8qIFNBTCB0byByZXR1cm4gdG8gc2FtZSBjb250ZXh0ICovCiAJSUE2NF9NQ0FfTkVXX0NPTlRFWFQJPQktMQkvKiBTQUwgdG8gcmV0dXJuIHRvIG5ldyBjb250ZXh0ICovCiB9OwogCi10eXBlZGVmIHN0cnVjdCBpYTY0X21jYV9vc190b19zYWxfc3RhdGVfcyB7Ci0JdTY0CQlpbW90c19vc19zdGF0dXM7CS8qICAgT1Mgc3RhdHVzIHRvIFNBTCBhcyB0byB3aGF0IGhhcHBlbmVkCi0JCQkJCQkgKiAgIHdpdGggdGhlIE1DQSBoYW5kbGluZy4KLQkJCQkJCSAqLwotCXU2NAkJaW1vdHNfc2FsX2dwOwkJLyogR1Agb2YgdGhlIFNBTCAtIHBoeXNpY2FsICovCi0JdTY0CQlpbW90c19jb250ZXh0OwkJLyogMCBpZiByZXR1cm4gdG8gc2FtZSBjb250ZXh0Ci0JCQkJCQkgICAxIGlmIHJldHVybiB0byBuZXcgY29udGV4dCAqLwotCXU2NAkJKmltb3RzX25ld19taW5fc3RhdGU7CS8qIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcKLQkJCQkJCSAqIG5ldyB2YWx1ZXMgb2YgcmVnaXN0ZXJzIGluIHRoZSBtaW4gc3RhdGUKLQkJCQkJCSAqIHNhdmUgYXJlYS4KLQkJCQkJCSAqLwotCXU2NAkJaW1vdHNfc2FsX2NoZWNrX3JhOwkvKiBSZXR1cm4gYWRkcmVzcyBpbiBTQUxfQ0hFQ0sgd2hpbGUgZ29pbmcKLQkJCQkJCSAqIGJhY2sgdG8gU0FMIGZyb20gT1MgYWZ0ZXIgTUNBIGhhbmRsaW5nLgotCQkJCQkJICovCi19IGlhNjRfbWNhX29zX3RvX3NhbF9zdGF0ZV90OwotCiAvKiBQZXItQ1BVIE1DQSBzdGF0ZSB0aGF0IGlzIHRvbyBiaWcgZm9yIG5vcm1hbCBwZXItQ1BVIHZhcmlhYmxlcy4gICovCiAKIHN0cnVjdCBpYTY0X21jYV9jcHUgewotCXU2NCBzdGFja1tJQTY0X01DQV9TVEFDS19TSVpFLzhdOwkvKiBNQ0EgbWVtb3J5LXN0YWNrICovCi0JdTY0IHByb2Nfc3RhdGVfZHVtcFs1MTJdOwotCXU2NCBzdGFja2ZyYW1lWzMyXTsKLQl1NjQgcmJzdG9yZVtJQTY0X01DQV9TVEFDS19TSVpFLzhdOwkvKiBNQ0EgcmVnLi1iYWNraW5nIHN0b3JlICovCisJdTY0IG1jYV9zdGFja1tLRVJORUxfU1RBQ0tfU0laRS84XTsKIAl1NjQgaW5pdF9zdGFja1tLRVJORUxfU1RBQ0tfU0laRS84XTsKLX0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7Cit9OwogCiAvKiBBcnJheSBvZiBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgZWFjaCBDUFUncyBNQ0EgYXJlYS4gICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX3Blcl9jcHVfbWNhW05SX0NQVVNdOwpAQCAtMTIxLDEyICsxMzAsMjkgQEAKIGV4dGVybiB2b2lkIGlhNjRfbWNhX2NwdV9pbml0KHZvaWQgKik7CiBleHRlcm4gdm9pZCBpYTY0X29zX21jYV9kaXNwYXRjaCh2b2lkKTsKIGV4dGVybiB2b2lkIGlhNjRfb3NfbWNhX2Rpc3BhdGNoX2VuZCh2b2lkKTsKLWV4dGVybiB2b2lkIGlhNjRfbWNhX3VjbWNfaGFuZGxlcih2b2lkKTsKK2V4dGVybiB2b2lkIGlhNjRfbWNhX3VjbWNfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUgKik7CitleHRlcm4gdm9pZCBpYTY0X2luaXRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqLAorCQkJICAgICAgc3RydWN0IHN3aXRjaF9zdGFjayAqLAorCQkJICAgICAgc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlICopOwogZXh0ZXJuIHZvaWQgaWE2NF9tb25hcmNoX2luaXRfaGFuZGxlcih2b2lkKTsKIGV4dGVybiB2b2lkIGlhNjRfc2xhdmVfaW5pdF9oYW5kbGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgaWE2NF9tY2FfY21jX3ZlY3Rvcl9zZXR1cCh2b2lkKTsKLWV4dGVybiBpbnQgIGlhNjRfcmVnX01DQV9leHRlbnNpb24odm9pZCopOworZXh0ZXJuIGludCAgaWE2NF9yZWdfTUNBX2V4dGVuc2lvbihpbnQgKCpmbikodm9pZCAqLCBzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUgKikpOwogZXh0ZXJuIHZvaWQgaWE2NF91bnJlZ19NQ0FfZXh0ZW5zaW9uKHZvaWQpOworZXh0ZXJuIHU2NCBpYTY0X2dldF9ybmF0KHU2NCAqKTsKKworI2Vsc2UJLyogX19BU1NFTUJMWV9fICovCisKKyNkZWZpbmUgSUE2NF9NQ0FfQ09SUkVDVEVECTB4MAkvKiBFcnJvciBoYXMgYmVlbiBjb3JyZWN0ZWQgYnkgT1NfTUNBICovCisjZGVmaW5lIElBNjRfTUNBX1dBUk1fQk9PVAktMQkvKiBXYXJtIGJvb3Qgb2YgdGhlIHN5c3RlbSBuZWVkIGZyb20gU0FMICovCisjZGVmaW5lIElBNjRfTUNBX0NPTERfQk9PVAktMgkvKiBDb2xkIGJvb3Qgb2YgdGhlIHN5c3RlbSBuZWVkIGZyb20gU0FMICovCisjZGVmaW5lIElBNjRfTUNBX0hBTFQJCS0zCS8qIFN5c3RlbSB0byBiZSBoYWx0ZWQgYnkgU0FMICovCisKKyNkZWZpbmUgSUE2NF9JTklUX1JFU1VNRQkweDAJLyogUmVzdW1lIGFmdGVyIHJldHVybiBmcm9tIElOSVQgKi8KKyNkZWZpbmUgSUE2NF9JTklUX1dBUk1fQk9PVAktMQkvKiBXYXJtIGJvb3Qgb2YgdGhlIHN5c3RlbSBuZWVkIGZyb20gU0FMICovCisKKyNkZWZpbmUgSUE2NF9NQ0FfU0FNRV9DT05URVhUCTB4MAkvKiBTQUwgdG8gcmV0dXJuIHRvIHNhbWUgY29udGV4dCAqLworI2RlZmluZSBJQTY0X01DQV9ORVdfQ09OVEVYVAktMQkvKiBTQUwgdG8gcmV0dXJuIHRvIG5ldyBjb250ZXh0ICovCiAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAjZW5kaWYgLyogX0FTTV9JQTY0X01DQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L21jYV9hc20uaCBiL2luY2x1ZGUvYXNtLWlhNjQvbWNhX2FzbS5oCmluZGV4IDgzNjk1M2UuLjI3YzkyMDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvbWNhX2FzbS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvbWNhX2FzbS5oCkBAIC04LDYgKzgsOCBAQAogICogQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIE1vc2Jlcmdlci1UYW5nIDxkYXZpZG1AaHBsLmhwLmNvbT4KICAqIENvcHlyaWdodCAoQykgMjAwMiBJbnRlbCBDb3JwLgogICogQ29weXJpZ2h0IChDKSAyMDAyIEplbm5hIEhhbGwgPGplbm5hLnMuaGFsbEBpbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgS2VpdGggT3dlbnMgPGthb3NAc2dpLmNvbT4KICAqLwogI2lmbmRlZiBfQVNNX0lBNjRfTUNBX0FTTV9ICiAjZGVmaW5lIF9BU01fSUE2NF9NQ0FfQVNNX0gKQEAgLTIwNywxMDYgKzIwOSwzMyBAQAogCTs7CiAKIC8qCi0gKiBUaGUgZm9sbG93aW5nIG9mZnNldHMgY2FwdHVyZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlCi0gKiBSU0UgcmVsYXRlZCByZWdpc3RlcnMgZnJvbSB0aGUgb2xkIGNvbnRleHQgYXJlCi0gKiBzYXZlZCBvbnRvIHRoZSBuZXcgc3RhY2sgZnJhbWUuCisgKiBUaGUgTUNBIGFuZCBJTklUIHN0YWNrcyBpbiBzdHJ1Y3QgaWE2NF9tY2FfY3B1IGxvb2sgbGlrZSBub3JtYWwga2VybmVsCisgKiBzdGFja3MsIGV4Y2VwdCB0aGF0IHRoZSBTQUwvT1Mgc3RhdGUgYW5kIGEgc3dpdGNoX3N0YWNrIGFyZSBzdG9yZWQgbmVhciB0aGUKKyAqIHRvcCBvZiB0aGUgTUNBL0lOSVQgc3RhY2suICBUbyBzdXBwb3J0IGNvbmN1cnJlbnQgZW50cnkgdG8gTUNBIG9yIElOSVQsIGFzCisgKiB3ZWxsIGFzIE1DQSBvdmVyIElOSVQsIGVhY2ggZXZlbnQgbmVlZHMgaXRzIG93biBTQUwvT1Mgc3RhdGUuICBBbGwgZW50cmllcworICogYXJlIDE2IGJ5dGUgYWxpZ25lZC4KICAqCi0gKgkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKgl8TkRJUlRZIFtCU1AgLSBCU1BTVE9SRV18Ci0gKgkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKgl8CVJOQVQJCXwKLSAqCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqCXwJQlNQU1RPUkUJfAotICoJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICoJfAlJRlMJCXwKLSAqCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqCXwJUEZTCQl8Ci0gKgkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKgl8CVJTQwkJfAotICoJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyA8LS0tLS0tLS0gQm90dG9tIG9mIG5ldyBzdGFjayBmcmFtZQorICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgICB8ICAgICAgICAgIHB0X3JlZ3MgICAgICAgICAgfAorICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgICB8ICAgICAgICBzd2l0Y2hfc3RhY2sgICAgICAgfAorICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgICB8ICAgICAgICBTQUwvT1Mgc3RhdGUgICAgICAgfAorICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgICB8ICAgIDE2IGJ5dGUgc2NyYXRjaCBhcmVhICAgfAorICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyA8LS0tLS0tLS0gU1AgYXQgc3RhcnQgb2YgQyBNQ0EgaGFuZGxlcgorICogICAgICB8ICAgICAgICAgICAuLi4uLiAgICAgICAgICAgfAorICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgICB8IFJCUyBmb3IgTUNBL0lOSVQgaGFuZGxlciAgfAorICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgICB8IHN0cnVjdCB0YXNrIGZvciBNQ0EvSU5JVCAgfAorICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyA8LS0tLS0tLS0gQm90dG9tIG9mIE1DQS9JTklUIHN0YWNrCiAgKi8KLSNkZWZpbmUgIHJzZV9yc2Nfb2Zmc2V0CQkwCi0jZGVmaW5lICByc2VfcGZzX29mZnNldAkJKHJzZV9yc2Nfb2Zmc2V0KzB4MDgpCi0jZGVmaW5lICByc2VfaWZzX29mZnNldAkJKHJzZV9wZnNfb2Zmc2V0KzB4MDgpCi0jZGVmaW5lICByc2VfYnNwc3RvcmVfb2Zmc2V0CShyc2VfaWZzX29mZnNldCsweDA4KQotI2RlZmluZSAgcnNlX3JuYXRfb2Zmc2V0CShyc2VfYnNwc3RvcmVfb2Zmc2V0KzB4MDgpCi0jZGVmaW5lICByc2VfbmRpcnR5X29mZnNldAkocnNlX3JuYXRfb2Zmc2V0KzB4MDgpCiAKLS8qCi0gKiByc2Vfc3dpdGNoX2NvbnRleHQKLSAqCi0gKgkxLiBTYXZlIG9sZCBSU0Mgb250byB0aGUgbmV3IHN0YWNrIGZyYW1lCi0gKgkyLiBTYXZlIFBGUyBvbnRvIG5ldyBzdGFjayBmcmFtZQotICoJMy4gQ292ZXIgdGhlIG9sZCBmcmFtZSBhbmQgc3RhcnQgYSBuZXcgZnJhbWUuCi0gKgk0LiBTYXZlIElGUyBvbnRvIG5ldyBzdGFjayBmcmFtZQotICoJNS4gU2F2ZSB0aGUgb2xkIEJTUFNUT1JFIG9uIHRoZSBuZXcgc3RhY2sgZnJhbWUKLSAqCTYuIFNhdmUgdGhlIG9sZCBSTkFUIG9uIHRoZSBuZXcgc3RhY2sgZnJhbWUKLSAqCTcuIFdyaXRlIEJTUFNUT1JFIHdpdGggdGhlIG5ldyBiYWNraW5nIHN0b3JlIHBvaW50ZXIKLSAqCTguIFJlYWQgYW5kIHNhdmUgdGhlIG5ldyBCU1AgdG8gY2FsY3VsYXRlIHRoZSAjZGlydHkgcmVnaXN0ZXJzCi0gKiBOT1RFOiBMb29rIGF0IHBhZ2VzIDExLTEwLCAxMS0xMSBpbiBQUk0gVm9sIDIKLSAqLwotI2RlZmluZSByc2Vfc3dpdGNoX2NvbnRleHQodGVtcCxwX3N0YWNrZnJhbWUscF9ic3BzdG9yZSkJCQlcCi0JOzsJCQkJCQkJCQlcCi0JbW92ICAgICB0ZW1wPWFyLnJzYzs7CQkJCQkJCVwKLQlzdDggICAgIFtwX3N0YWNrZnJhbWVdPXRlbXAsODs7CQkJCQlcCi0JbW92ICAgICB0ZW1wPWFyLnBmczs7CQkJCQkJCVwKLQlzdDggICAgIFtwX3N0YWNrZnJhbWVdPXRlbXAsODsJCQkJCQlcCi0JY292ZXIgOzsJCQkJCQkJCVwKLQltb3YgICAgIHRlbXA9Y3IuaWZzOzsJCQkJCQkJXAotCXN0OCAgICAgW3Bfc3RhY2tmcmFtZV09dGVtcCw4OzsJCQkJCQlcCi0JbW92ICAgICB0ZW1wPWFyLmJzcHN0b3JlOzsJCQkJCQlcCi0Jc3Q4ICAgICBbcF9zdGFja2ZyYW1lXT10ZW1wLDg7OwkJCQkJXAotCW1vdiAgICAgdGVtcD1hci5ybmF0OzsJCQkJCQkJXAotCXN0OCAgICAgW3Bfc3RhY2tmcmFtZV09dGVtcCw4OwkJCQkJCVwKLQltb3YgICAgIGFyLmJzcHN0b3JlPXBfYnNwc3RvcmU7OwkJCQkJXAotCW1vdiAgICAgdGVtcD1hci5ic3A7OwkJCQkJCQlcCi0Jc3ViICAgICB0ZW1wPXRlbXAscF9ic3BzdG9yZTs7CQkJCQkJXAotCXN0OCAgICAgW3Bfc3RhY2tmcmFtZV09dGVtcCw4OzsKLQotLyoKLSAqIHJzZV9yZXR1cm5fY29udGV4dAotICoJMS4gQWxsb2NhdGUgYSB6ZXJvLXNpemVkIGZyYW1lCi0gKgkyLiBTdG9yZSB0aGUgbnVtYmVyIG9mIGRpcnR5IHJlZ2lzdGVycyBSU0MubG9hZHJzIGZpZWxkCi0gKgkzLiBJc3N1ZSBhIGxvYWRycyB0byBpbnN1cmUgdGhhdCBhbnkgcmVnaXN0ZXJzIGZyb20gdGhlIGludGVycnVwdGVkCi0gKgkgICBjb250ZXh0IHdoaWNoIHdlcmUgc2F2ZWQgb24gdGhlIG5ldyBzdGFjayBmcmFtZSBoYXZlIGJlZW4gbG9hZGVkCi0gKgkgICBiYWNrIGludG8gdGhlIHN0YWNrZWQgcmVnaXN0ZXJzCi0gKgk0LiBSZXN0b3JlIEJTUFNUT1JFCi0gKgk1LiBSZXN0b3JlIFJOQVQKLSAqCTYuIFJlc3RvcmUgUEZTCi0gKgk3LiBSZXN0b3JlIElGUwotICoJOC4gUmVzdG9yZSBSU0MKLSAqCTkuIElzc3VlIGFuIFJGSQotICovCi0jZGVmaW5lIHJzZV9yZXR1cm5fY29udGV4dChwc3JfbWFza19yZWcsdGVtcCxwX3N0YWNrZnJhbWUpCQkJXAotCTs7CQkJCQkJCQkJXAotCWFsbG9jICAgdGVtcD1hci5wZnMsMCwwLDAsMDsJCQkJCQlcCi0JYWRkICAgICBwX3N0YWNrZnJhbWU9cnNlX25kaXJ0eV9vZmZzZXQscF9zdGFja2ZyYW1lOzsJCQlcCi0JbGQ4ICAgICB0ZW1wPVtwX3N0YWNrZnJhbWVdOzsJCQkJCQlcCi0Jc2hsICAgICB0ZW1wPXRlbXAsMTY7OwkJCQkJCQlcCi0JbW92ICAgICBhci5yc2M9dGVtcDs7CQkJCQkJCVwKLQlsb2FkcnM7OwkJCQkJCQkJXAotCWFkZCAgICAgcF9zdGFja2ZyYW1lPS1yc2VfbmRpcnR5X29mZnNldCtyc2VfYnNwc3RvcmVfb2Zmc2V0LHBfc3RhY2tmcmFtZTs7XAotCWxkOCAgICAgdGVtcD1bcF9zdGFja2ZyYW1lXTs7CQkJCQkJXAotCW1vdiAgICAgYXIuYnNwc3RvcmU9dGVtcDs7CQkJCQkJXAotCWFkZCAgICAgcF9zdGFja2ZyYW1lPS1yc2VfYnNwc3RvcmVfb2Zmc2V0K3JzZV9ybmF0X29mZnNldCxwX3N0YWNrZnJhbWU7O1wKLQlsZDggICAgIHRlbXA9W3Bfc3RhY2tmcmFtZV07OwkJCQkJCVwKLQltb3YgICAgIGFyLnJuYXQ9dGVtcDs7CQkJCQkJCVwKLQlhZGQgICAgIHBfc3RhY2tmcmFtZT0tcnNlX3JuYXRfb2Zmc2V0K3JzZV9wZnNfb2Zmc2V0LHBfc3RhY2tmcmFtZTs7CVwKLQlsZDggICAgIHRlbXA9W3Bfc3RhY2tmcmFtZV07OwkJCQkJCVwKLQltb3YgICAgIGFyLnBmcz10ZW1wOzsJCQkJCQkJXAotCWFkZCAgICAgcF9zdGFja2ZyYW1lPS1yc2VfcGZzX29mZnNldCtyc2VfaWZzX29mZnNldCxwX3N0YWNrZnJhbWU7OwlcCi0JbGQ4ICAgICB0ZW1wPVtwX3N0YWNrZnJhbWVdOzsJCQkJCQlcCi0JbW92ICAgICBjci5pZnM9dGVtcDs7CQkJCQkJCVwKLQlhZGQgICAgIHBfc3RhY2tmcmFtZT0tcnNlX2lmc19vZmZzZXQrcnNlX3JzY19vZmZzZXQscF9zdGFja2ZyYW1lOzsJXAotCWxkOCAgICAgdGVtcD1bcF9zdGFja2ZyYW1lXTs7CQkJCQkJXAotCW1vdiAgICAgYXIucnNjPXRlbXAgOwkJCQkJCQlcCi0JbW92ICAgICB0ZW1wPXBzcjs7CQkJCQkJCVwKLQlvciAgICAgIHRlbXA9dGVtcCxwc3JfbWFza19yZWc7OwkJCQkJXAotCW1vdiAgICAgY3IuaXBzcj10ZW1wOzsJCQkJCQkJXAotCW1vdiAgICAgdGVtcD1pcDs7CQkJCQkJCVwKLQlhZGQgICAgIHRlbXA9MHgzMCx0ZW1wOzsJCQkJCQlcCi0JbW92ICAgICBjci5paXA9dGVtcDs7CQkJCQkJCVwKLQlzcmx6Lmk7OwkJCQkJCQkJXAotCXJmaTs7CisjZGVmaW5lIEFMSUdOMTYoeCkJCQkoKHgpJn4xNSkKKyNkZWZpbmUgTUNBX1BUX1JFR1NfT0ZGU0VUCQlBTElHTjE2KEtFUk5FTF9TVEFDS19TSVpFLUlBNjRfUFRfUkVHU19TSVpFKQorI2RlZmluZSBNQ0FfU1dJVENIX1NUQUNLX09GRlNFVAkJQUxJR04xNihNQ0FfUFRfUkVHU19PRkZTRVQtSUE2NF9TV0lUQ0hfU1RBQ0tfU0laRSkKKyNkZWZpbmUgTUNBX1NPU19PRkZTRVQJCQlBTElHTjE2KE1DQV9TV0lUQ0hfU1RBQ0tfT0ZGU0VULUlBNjRfU0FMX09TX1NUQVRFX1NJWkUpCisjZGVmaW5lIE1DQV9TUF9PRkZTRVQJCQlBTElHTjE2KE1DQV9TT1NfT0ZGU0VULTE2KQogCiAjZW5kaWYgLyogX0FTTV9JQTY0X01DQV9BU01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9tbXUuaCBiL2luY2x1ZGUvYXNtLWlhNjQvbW11LmgKaW5kZXggYWUxNTI1My4uNjExNDMyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L21tdS5oCkBAIC0yLDEwICsyLDEyIEBACiAjZGVmaW5lIF9fTU1VX0gKIAogLyoKLSAqIFR5cGUgZm9yIGEgY29udGV4dCBudW1iZXIuICBXZSBkZWNsYXJlIGl0IHZvbGF0aWxlIHRvIGVuc3VyZSBwcm9wZXIgb3JkZXJpbmcgd2hlbiBpdCdzCi0gKiBhY2Nlc3NlZCBvdXRzaWRlIG9mIHNwaW5sb2NrJ2QgY3JpdGljYWwgc2VjdGlvbnMgKGUuZy4sIGFzIGRvbmUgaW4gYWN0aXZhdGVfbW0oKSBhbmQKLSAqIGluaXRfbmV3X2NvbnRleHQoKSkuCisgKiBUeXBlIGZvciBhIGNvbnRleHQgbnVtYmVyLiAgV2UgZGVjbGFyZSBpdCB2b2xhdGlsZSB0byBlbnN1cmUgcHJvcGVyCisgKiBvcmRlcmluZyB3aGVuIGl0J3MgYWNjZXNzZWQgb3V0c2lkZSBvZiBzcGlubG9jaydkIGNyaXRpY2FsIHNlY3Rpb25zCisgKiAoZS5nLiwgYXMgZG9uZSBpbiBhY3RpdmF0ZV9tbSgpIGFuZCBpbml0X25ld19jb250ZXh0KCkpLgogICovCiB0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbW1fY29udGV4dF90OwogCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbnZfbW1fY29udGV4dF90OworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvbW11X2NvbnRleHQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvbW11X2NvbnRleHQuaAppbmRleCBlM2U1ZmVkLi44ZDZlNzJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9tbXVfY29udGV4dC5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNkZWZpbmUgaWE2NF9yaWQoY3R4LGFkZHIpCSgoKGN0eCkgPDwgMykgfCAoYWRkciA+PiA2MSkpCiAKKyMgaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICMgaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KQEAgLTU1LDM0ICs1Niw0NiBAQAogZGVsYXllZF90bGJfZmx1c2ggKHZvaWQpCiB7CiAJZXh0ZXJuIHZvaWQgbG9jYWxfZmx1c2hfdGxiX2FsbCAodm9pZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICh1bmxpa2VseShfX2lhNjRfcGVyX2NwdV92YXIoaWE2NF9uZWVkX3RsYl9mbHVzaCkpKSB7Ci0JCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKLQkJX19pYTY0X3Blcl9jcHVfdmFyKGlhNjRfbmVlZF90bGJfZmx1c2gpID0gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlhNjRfY3R4LmxvY2ssIGZsYWdzKTsKKwkJeworCQkJaWYgKF9faWE2NF9wZXJfY3B1X3ZhcihpYTY0X25lZWRfdGxiX2ZsdXNoKSkgeworCQkJCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKKwkJCQlfX2lhNjRfcGVyX2NwdV92YXIoaWE2NF9uZWVkX3RsYl9mbHVzaCkgPSAwOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlhNjRfY3R4LmxvY2ssIGZsYWdzKTsKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgbW1fY29udGV4dF90CitzdGF0aWMgaW5saW5lIG52X21tX2NvbnRleHRfdAogZ2V0X21tdV9jb250ZXh0IChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCW1tX2NvbnRleHRfdCBjb250ZXh0ID0gbW0tPmNvbnRleHQ7CisJbnZfbW1fY29udGV4dF90IGNvbnRleHQgPSBtbS0+Y29udGV4dDsKIAotCWlmIChjb250ZXh0KQotCQlyZXR1cm4gY29udGV4dDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpYTY0X2N0eC5sb2NrLCBmbGFncyk7Ci0JewotCQkvKiByZS1jaGVjaywgbm93IHRoYXQgd2UndmUgZ290IHRoZSBsb2NrOiAqLwotCQljb250ZXh0ID0gbW0tPmNvbnRleHQ7Ci0JCWlmIChjb250ZXh0ID09IDApIHsKLQkJCWNwdXNfY2xlYXIobW0tPmNwdV92bV9tYXNrKTsKLQkJCWlmIChpYTY0X2N0eC5uZXh0ID49IGlhNjRfY3R4LmxpbWl0KQotCQkJCXdyYXBfbW11X2NvbnRleHQobW0pOwotCQkJbW0tPmNvbnRleHQgPSBjb250ZXh0ID0gaWE2NF9jdHgubmV4dCsrOworCWlmICh1bmxpa2VseSghY29udGV4dCkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlhNjRfY3R4LmxvY2ssIGZsYWdzKTsKKwkJeworCQkJLyogcmUtY2hlY2ssIG5vdyB0aGF0IHdlJ3ZlIGdvdCB0aGUgbG9jazogKi8KKwkJCWNvbnRleHQgPSBtbS0+Y29udGV4dDsKKwkJCWlmIChjb250ZXh0ID09IDApIHsKKwkJCQljcHVzX2NsZWFyKG1tLT5jcHVfdm1fbWFzayk7CisJCQkJaWYgKGlhNjRfY3R4Lm5leHQgPj0gaWE2NF9jdHgubGltaXQpCisJCQkJCXdyYXBfbW11X2NvbnRleHQobW0pOworCQkJCW1tLT5jb250ZXh0ID0gY29udGV4dCA9IGlhNjRfY3R4Lm5leHQrKzsKKwkJCX0KIAkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpYTY0X2N0eC5sb2NrLCBmbGFncyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlhNjRfY3R4LmxvY2ssIGZsYWdzKTsKKwkvKgorCSAqIEVuc3VyZSB3ZSdyZSBub3Qgc3RhcnRpbmcgdG8gdXNlICJjb250ZXh0IiBiZWZvcmUgYW55IG9sZAorCSAqIHVzZXMgb2YgaXQgYXJlIGdvbmUgZnJvbSBvdXIgVExCLgorCSAqLworCWRlbGF5ZWRfdGxiX2ZsdXNoKCk7CisKIAlyZXR1cm4gY29udGV4dDsKIH0KIApAQCAtMTA0LDEzICsxMTcsMTMgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1yZWxvYWRfY29udGV4dCAobW1fY29udGV4dF90IGNvbnRleHQpCityZWxvYWRfY29udGV4dCAobnZfbW1fY29udGV4dF90IGNvbnRleHQpCiB7CiAJdW5zaWduZWQgbG9uZyByaWQ7CiAJdW5zaWduZWQgbG9uZyByaWRfaW5jciA9IDA7CiAJdW5zaWduZWQgbG9uZyBycjAsIHJyMSwgcnIyLCBycjMsIHJyNCwgb2xkX3JyNDsKIAotCW9sZF9ycjQgPSBpYTY0X2dldF9ycigweDgwMDAwMDAwMDAwMDAwMDBVTCk7CisJb2xkX3JyNCA9IGlhNjRfZ2V0X3JyKFJHTl9CQVNFKFJHTl9IUEFHRSkpOwogCXJpZCA9IGNvbnRleHQgPDwgMzsJLyogbWFrZSBzcGFjZSBmb3IgZW5jb2RpbmcgdGhlIHJlZ2lvbiBudW1iZXIgKi8KIAlyaWRfaW5jciA9IDEgPDwgODsKIApAQCAtMTIyLDYgKzEzNSwxMCBAQAogCXJyNCA9IHJyMCArIDQqcmlkX2luY3I7CiAjaWZkZWYgIENPTkZJR19IVUdFVExCX1BBR0UKIAlycjQgPSAocnI0ICYgKH4oMHhmY1VMKSkpIHwgKG9sZF9ycjQgJiAweGZjKTsKKworIyAgaWYgUkdOX0hQQUdFICE9IDQKKyMgICAgZXJyb3IgInJlbG9hZF9jb250ZXh0IGFzc3VtZXMgUkdOX0hQQUdFIGlzIDQiCisjICBlbmRpZgogI2VuZGlmCiAKIAlpYTY0X3NldF9ycigweDAwMDAwMDAwMDAwMDAwMDBVTCwgcnIwKTsKQEAgLTEzOCw3ICsxNTUsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBhY3RpdmF0ZV9jb250ZXh0IChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQltbV9jb250ZXh0X3QgY29udGV4dDsKKwludl9tbV9jb250ZXh0X3QgY29udGV4dDsKIAogCWRvIHsKIAkJY29udGV4dCA9IGdldF9tbXVfY29udGV4dChtbSk7CkBAIC0xNTcsOCArMTc0LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogYWN0aXZhdGVfbW0gKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQpCiB7Ci0JZGVsYXllZF90bGJfZmx1c2goKTsKLQogCS8qCiAJICogV2UgbWF5IGdldCBpbnRlcnJ1cHRzIGhlcmUsIGJ1dCB0aGF0J3MgT0sgYmVjYXVzZSBpbnRlcnJ1cHQgaGFuZGxlcnMgY2Fubm90CiAJICogdG91Y2ggdXNlci1zcGFjZS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGFnZS5oIGIvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKaW5kZXggMDg4OTRmNy4uOWVkZmZhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKQEAgLTEzLDYgKzEzLDE5IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKIC8qCisgKiBUaGUgdG9wIHRocmVlIGJpdHMgb2YgYW4gSUE2NCBhZGRyZXNzIGFyZSBpdHMgUmVnaW9uIE51bWJlci4KKyAqIERpZmZlcmVudCByZWdpb25zIGFyZSBhc3NpZ25lZCB0byBkaWZmZXJlbnQgcHVycG9zZXMuCisgKi8KKyNkZWZpbmUgUkdOX1NISUZUCSg2MSkKKyNkZWZpbmUgUkdOX0JBU0UocikJKF9fSUE2NF9VTF9DT05TVChyKTw8UkdOX1NISUZUKQorI2RlZmluZSBSR05fQklUUwkoUkdOX0JBU0UoLTEpKQorCisjZGVmaW5lIFJHTl9LRVJORUwJNwkvKiBJZGVudGl0eSBtYXBwZWQgcmVnaW9uICovCisjZGVmaW5lIFJHTl9VTkNBQ0hFRCAgICA2CS8qIElkZW50aXR5IG1hcHBlZCBJL08gcmVnaW9uICovCisjZGVmaW5lIFJHTl9HQVRFCTUJLyogR2F0ZSBwYWdlLCBLZXJuZWwgdGV4dCwgZXRjICovCisjZGVmaW5lIFJHTl9IUEFHRQk0CS8qIEZvciBIdWdlIFRMQiBwYWdlcyAqLworCisvKgogICogUEFHRV9TSElGVCBkZXRlcm1pbmVzIHRoZSBhY3R1YWwga2VybmVsIHBhZ2Ugc2l6ZS4KICAqLwogI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfUEFHRV9TSVpFXzRLQikKQEAgLTM2LDEwICs0OSw5IEBACiAKICNkZWZpbmUgUkdOX01BUF9MSU1JVAkoKDFVTCA8PCAoNCpQQUdFX1NISUZUIC0gMTIpKSAtIFBBR0VfU0laRSkJLyogcGVyIHJlZ2lvbiBhZGRyIGxpbWl0ICovCiAKKwogI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKLSMgZGVmaW5lIFJFR0lPTl9IUEFHRQkJKDRVTCkJLyogbm90ZTogdGhpcyBpcyBoYXJkY29kZWQgaW4gcmVsb2FkX2NvbnRleHQoKSEqLwotIyBkZWZpbmUgUkVHSU9OX1NISUZUCQk2MQotIyBkZWZpbmUgSFBBR0VfUkVHSU9OX0JBU0UJKFJFR0lPTl9IUEFHRSA8PCBSRUdJT05fU0hJRlQpCisjIGRlZmluZSBIUEFHRV9SRUdJT05fQkFTRQlSR05fQkFTRShSR05fSFBBR0UpCiAjIGRlZmluZSBIUEFHRV9TSElGVAkJaHBhZ2Vfc2hpZnQKICMgZGVmaW5lIEhQQUdFX1NISUZUX0RFRkFVTFQJMjgJLyogY2hlY2sgaWE2NCBTRE0gZm9yIGFyY2hpdGVjdHVyZSBzdXBwb3J0ZWQgc2l6ZSAqLwogIyBkZWZpbmUgSFBBR0VfU0laRQkJKF9fSUE2NF9VTF9DT05TVCgxKSA8PCBIUEFHRV9TSElGVCkKQEAgLTEzMCwxNiArMTQyLDEzIEBACiAjZGVmaW5lIFJFR0lPTl9OVU1CRVIoeCkJKHtpYTY0X3ZhIF92OyBfdi5sID0gKGxvbmcpICh4KTsgX3YuZi5yZWc7fSkKICNkZWZpbmUgUkVHSU9OX09GRlNFVCh4KQkoe2lhNjRfdmEgX3Y7IF92LmwgPSAobG9uZykgKHgpOyBfdi5mLm9mZjt9KQogCi0jZGVmaW5lIFJFR0lPTl9TSVpFCQlSRUdJT05fTlVNQkVSKDEpCi0jZGVmaW5lIFJFR0lPTl9LRVJORUwJCTcKLQogI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKICMgZGVmaW5lIGh0bGJwYWdlX3RvX3BhZ2UoeCkJKCgodW5zaWduZWQgbG9uZykgUkVHSU9OX05VTUJFUih4KSA8PCA2MSkJCQlcCiAJCQkJIHwgKFJFR0lPTl9PRkZTRVQoeCkgPj4gKEhQQUdFX1NISUZULVBBR0VfU0hJRlQpKSkKICMgZGVmaW5lIEhVR0VUTEJfUEFHRV9PUkRFUgkoSFBBR0VfU0hJRlQgLSBQQUdFX1NISUZUKQogIyBkZWZpbmUgaXNfaHVnZXBhZ2Vfb25seV9yYW5nZShtbSwgYWRkciwgbGVuKQkJXAotCSAoUkVHSU9OX05VTUJFUihhZGRyKSA9PSBSRUdJT05fSFBBR0UgJiYJXAotCSAgUkVHSU9OX05VTUJFUigoYWRkcikrKGxlbiktMSkgPT0gUkVHSU9OX0hQQUdFKQorCSAoUkVHSU9OX05VTUJFUihhZGRyKSA9PSBSR05fSFBBR0UgJiYJXAorCSAgUkVHSU9OX05VTUJFUigoYWRkcikrKGxlbiktMSkgPT0gUkdOX0hQQUdFKQogZXh0ZXJuIHVuc2lnbmVkIGludCBocGFnZV9zaGlmdDsKICNlbmRpZgogCkBAIC0xOTcsNyArMjA2LDcgQEAKICMgZGVmaW5lIF9fcGdwcm90KHgpCSh4KQogI2VuZGlmIC8qICFTVFJJQ1RfTU1fVFlQRUNIRUNLUyAqLwogCi0jZGVmaW5lIFBBR0VfT0ZGU0VUCQkJX19JQTY0X1VMX0NPTlNUKDB4ZTAwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgUEFHRV9PRkZTRVQJCQlSR05fQkFTRShSR05fS0VSTkVMKQogCiAjZGVmaW5lIFZNX0RBVEFfREVGQVVMVF9GTEFHUwkJKFZNX1JFQUQgfCBWTV9XUklURSB8CQkJCQlcCiAJCQkJCSBWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlFWEVDIHwJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGFsLmggYi9pbmNsdWRlL2FzbS1pYTY0L3BhbC5oCmluZGV4IDIzMDNhMTAuLmU4MjgzNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcGFsLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wYWwuaApAQCAtNzUsNiArNzUsOCBAQAogI2RlZmluZSBQQUxfQ0FDSEVfUkVBRAkJMjU5CS8qIHJlYWQgdGFnICYgZGF0YSBvZiBjYWNoZWxpbmUgZm9yIGRpYWdub3N0aWMgdGVzdGluZyAqLwogI2RlZmluZSBQQUxfQ0FDSEVfV1JJVEUJCTI2MAkvKiB3cml0ZSB0YWcgJiBkYXRhIG9mIGNhY2hlbGluZSBmb3IgZGlhZ25vc3RpYyB0ZXN0aW5nICovCiAjZGVmaW5lIFBBTF9WTV9UUl9SRUFECQkyNjEJLyogcmVhZCBjb250ZW50cyBvZiB0cmFuc2xhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBQQUxfR0VUX1BTVEFURQkJMjYyCS8qIGdldCB0aGUgY3VycmVudCBQLXN0YXRlICovCisjZGVmaW5lIFBBTF9TRVRfUFNUQVRFCQkyNjMJLyogc2V0IHRoZSBQLXN0YXRlICovCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTExMTEsNiArMTExMywyNSBAQAogCXJldHVybiBpcHJ2LnN0YXR1czsKIH0KIAorLyogR2V0IHRoZSBjdXJyZW50IFAtc3RhdGUgaW5mb3JtYXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgczY0CitpYTY0X3BhbF9nZXRfcHN0YXRlICh1NjQgKnBzdGF0ZV9pbmRleCkKK3sKKwlzdHJ1Y3QgaWE2NF9wYWxfcmV0dmFsIGlwcnY7CisJUEFMX0NBTExfU1RLKGlwcnYsIFBBTF9HRVRfUFNUQVRFLCAwLCAwLCAwKTsKKwkqcHN0YXRlX2luZGV4ID0gaXBydi52MDsKKwlyZXR1cm4gaXBydi5zdGF0dXM7Cit9CisKKy8qIFNldCB0aGUgUC1zdGF0ZSAqLworc3RhdGljIGlubGluZSBzNjQKK2lhNjRfcGFsX3NldF9wc3RhdGUgKHU2NCBwc3RhdGVfaW5kZXgpCit7CisJc3RydWN0IGlhNjRfcGFsX3JldHZhbCBpcHJ2OworCVBBTF9DQUxMX1NUSyhpcHJ2LCBQQUxfU0VUX1BTVEFURSwgcHN0YXRlX2luZGV4LCAwLCAwKTsKKwlyZXR1cm4gaXBydi5zdGF0dXM7Cit9CisKIC8qIENhdXNlIHRoZSBwcm9jZXNzb3IgdG8gZW50ZXIgTElHSFQgSEFMVCBzdGF0ZSwgd2hlcmUgcHJlZmV0Y2hpbmcgYW5kIGV4ZWN1dGlvbiBhcmUKICAqIHN1c3BlbmRlZCwgYnV0IGNhY2hlIGFuZCBUTEIgY29oZXJlbmN5IGlzIG1haW50YWluZWQuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGNpLmggYi9pbmNsdWRlL2FzbS1pYTY0L3BjaS5oCmluZGV4IGRiYTlmMjIuLmVmNjE2ZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wY2kuaApAQCAtMTU2LDYgKzE1NiwxOSBAQAogZXh0ZXJuIHZvaWQgcGNpYmlvc19idXNfdG9fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJc3RydWN0IHJlc291cmNlICpyZXMsIHN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uKTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVzb3VyY2UgKgorcGNpYmlvc19zZWxlY3Rfcm9vdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJc3RydWN0IHJlc291cmNlICpyb290ID0gTlVMTDsKKworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJcm9vdCA9ICZpb3BvcnRfcmVzb3VyY2U7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJcm9vdCA9ICZpb21lbV9yZXNvdXJjZTsKKworCXJldHVybiByb290OworfQorCiAjZGVmaW5lIHBjaWJpb3Nfc2Nhbl9hbGxfZm5zKGEsIGIpCTAKIAogI2VuZGlmIC8qIF9BU01fSUE2NF9QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaAppbmRleCA0ODU4NmUwLi4yZTM0YzA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaApAQCAtMjA0LDIxICsyMDQsMTggQEAKICNkZWZpbmUgc2V0X3B0ZShwdGVwLCBwdGV2YWwpCSgqKHB0ZXApID0gKHB0ZXZhbCkpCiAjZGVmaW5lIHNldF9wdGVfYXQobW0sYWRkcixwdGVwLHB0ZXZhbCkgc2V0X3B0ZShwdGVwLHB0ZXZhbCkKIAotI2RlZmluZSBSR05fU0laRQkoMVVMIDw8IDYxKQotI2RlZmluZSBSR05fS0VSTkVMCTcKLQotI2RlZmluZSBWTUFMTE9DX1NUQVJUCQkweGEwMDAwMDAyMDAwMDAwMDBVTAorI2RlZmluZSBWTUFMTE9DX1NUQVJUCQkoUkdOX0JBU0UoUkdOX0dBVEUpICsgMHgyMDAwMDAwMDBVTCkKICNpZmRlZiBDT05GSUdfVklSVFVBTF9NRU1fTUFQCi0jIGRlZmluZSBWTUFMTE9DX0VORF9JTklUCSgweGEwMDAwMDAwMDAwMDAwMDBVTCArICgxVUwgPDwgKDQqUEFHRV9TSElGVCAtIDkpKSkKKyMgZGVmaW5lIFZNQUxMT0NfRU5EX0lOSVQJKFJHTl9CQVNFKFJHTl9HQVRFKSArICgxVUwgPDwgKDQqUEFHRV9TSElGVCAtIDkpKSkKICMgZGVmaW5lIFZNQUxMT0NfRU5ECQl2bWFsbG9jX2VuZAogICBleHRlcm4gdW5zaWduZWQgbG9uZyB2bWFsbG9jX2VuZDsKICNlbHNlCi0jIGRlZmluZSBWTUFMTE9DX0VORAkJKDB4YTAwMDAwMDAwMDAwMDAwMFVMICsgKDFVTCA8PCAoNCpQQUdFX1NISUZUIC0gOSkpKQorIyBkZWZpbmUgVk1BTExPQ19FTkQJCShSR05fQkFTRShSR05fR0FURSkgKyAoMVVMIDw8ICg0KlBBR0VfU0hJRlQgLSA5KSkpCiAjZW5kaWYKIAogLyogZnMvcHJvYy9rY29yZS5jICovCi0jZGVmaW5lCWtjX3ZhZGRyX3RvX29mZnNldCh2KSAoKHYpIC0gMHhhMDAwMDAwMDAwMDAwMDAwVUwpCi0jZGVmaW5lCWtjX29mZnNldF90b192YWRkcihvKSAoKG8pICsgMHhhMDAwMDAwMDAwMDAwMDAwVUwpCisjZGVmaW5lCWtjX3ZhZGRyX3RvX29mZnNldCh2KSAoKHYpIC0gUkdOX0JBU0UoUkdOX0dBVEUpKQorI2RlZmluZQlrY19vZmZzZXRfdG9fdmFkZHIobykgKChvKSArIFJHTl9CQVNFKFJHTl9HQVRFKSkKIAogLyoKICAqIENvbnZlcnNpb24gZnVuY3Rpb25zOiBjb252ZXJ0IHBhZ2UgZnJhbWUgbnVtYmVyIChwZm4pIGFuZCBhIHByb3RlY3Rpb24gdmFsdWUgdG8gYSBwYWdlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20taWE2NC9wcm9jZXNzb3IuaAppbmRleCA5MWJiZDFmLi45NGUwN2U3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvcHJvY2Vzc29yLmgKQEAgLTIwLDkgKzIwLDYgQEAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VzdGFjay5oPgogCi0vKiBPdXIgYXJjaCBzcGVjaWZpYyBhcmNoX2luaXRfc2NoZWRfZG9tYWluIGlzIGluIGFyY2gvaWE2NC9rZXJuZWwvZG9tYWluLmMgKi8KLSNkZWZpbmUgQVJDSF9IQVNfU0NIRURfRE9NQUlOCi0KICNkZWZpbmUgSUE2NF9OVU1fREJHX1JFR1MJOAogLyoKICAqIExpbWl0cyBmb3IgUE1DIGFuZCBQTUQgYXJlIHNldCB0byBsZXNzIHRoYW4gbWF4aW11bSBhcmNoaXRlY3RlZCB2YWx1ZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1pYTY0L3B0cmFjZS5oCmluZGV4IDBiZWYxOTUuLmZjNTQ0OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wdHJhY2UuaApAQCAtNTcsNyArNTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCiAjaW5jbHVkZSA8YXNtL2ZwdS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIC8qCiAgKiBCYXNlLTIgbG9nYXJpdGhtIG9mIG51bWJlciBvZiBwYWdlcyB0byBhbGxvY2F0ZSBwZXIgdGFzayBzdHJ1Y3R1cmUKQEAgLTExOSw3ICsxMTksNyBAQAogCXVuc2lnbmVkIGxvbmcgYXJfdW5hdDsJCS8qIGludGVycnVwdGVkIHRhc2sncyBOYVQgcmVnaXN0ZXIgKHByZXNlcnZlZCkgKi8KIAl1bnNpZ25lZCBsb25nIGFyX3BmczsJCS8qIHByZXYgZnVuY3Rpb24gc3RhdGUgICovCiAJdW5zaWduZWQgbG9uZyBhcl9yc2M7CQkvKiBSU0UgY29uZmlndXJhdGlvbiAqLwotCS8qIFRoZSBmb2xsb3dpbmcgdHdvIGFyZSB2YWxpZCBvbmx5IGlmIGNyX2lwc3IuY3BsID4gMDogKi8KKwkvKiBUaGUgZm9sbG93aW5nIHR3byBhcmUgdmFsaWQgb25seSBpZiBjcl9pcHNyLmNwbCA+IDAgfHwgdGktPmZsYWdzICYgX1RJRl9NQ0FfSU5JVCAqLwogCXVuc2lnbmVkIGxvbmcgYXJfcm5hdDsJCS8qIFJTRSBOYVQgKi8KIAl1bnNpZ25lZCBsb25nIGFyX2JzcHN0b3JlOwkvKiBSU0UgYnNwc3RvcmUgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9yd3NlbS5oIGIvaW5jbHVkZS9hc20taWE2NC9yd3NlbS5oCmluZGV4IDZlY2U1MDYuLmUxOGI1YWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcndzZW0uaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3J3c2VtLmgKQEAgLTMsNiArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAzIEtlbiBDaGVuIDxrZW5uZXRoLncuY2hlbkBpbnRlbC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQXNpdCBNYWxsaWNrIDxhc2l0LmsubWFsbGlja0BpbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQ2hyaXN0b3BoIExhbWV0ZXIgPGNsYW1ldGVyQHNnaS5jb20+CiAgKgogICogQmFzZWQgb24gYXNtLWkzODYvcndzZW0uaCBhbmQgb3RoZXIgYXJjaGl0ZWN0dXJlIGltcGxlbWVudGF0aW9uLgogICoKQEAgLTExLDkgKzEyLDkgQEAKICAqCiAgKiBUaGUgbG9jayBjb3VudCBpcyBpbml0aWFsaXplZCB0byAwIChubyBhY3RpdmUgYW5kIG5vIHdhaXRpbmcgbG9ja2VycykuCiAgKgotICogV2hlbiBhIHdyaXRlciBzdWJ0cmFjdHMgV1JJVEVfQklBUywgaXQnbGwgZ2V0IDB4ZmZmZjAwMDEgZm9yIHRoZSBjYXNlCi0gKiBvZiBhbiB1bmNvbnRlbmRlZCBsb2NrLiBSZWFkZXJzIGluY3JlbWVudCBieSAxIGFuZCBzZWUgYSBwb3NpdGl2ZSB2YWx1ZQotICogd2hlbiB1bmNvbnRlbmRlZCwgbmVnYXRpdmUgaWYgdGhlcmUgYXJlIHdyaXRlcnMgKGFuZCBtYXliZSkgcmVhZGVycworICogV2hlbiBhIHdyaXRlciBzdWJ0cmFjdHMgV1JJVEVfQklBUywgaXQnbGwgZ2V0IDB4ZmZmZmZmZmYwMDAwMDAwMSBmb3IKKyAqIHRoZSBjYXNlIG9mIGFuIHVuY29udGVuZGVkIGxvY2suIFJlYWRlcnMgaW5jcmVtZW50IGJ5IDEgYW5kIHNlZSBhIHBvc2l0aXZlCisgKiB2YWx1ZSB3aGVuIHVuY29udGVuZGVkLCBuZWdhdGl2ZSBpZiB0aGVyZSBhcmUgd3JpdGVycyAoYW5kIG1heWJlKSByZWFkZXJzCiAgKiB3YWl0aW5nIChpbiB3aGljaCBjYXNlIGl0IGdvZXMgdG8gc2xlZXApLgogICovCiAKQEAgLTI5LDcgKzMwLDcgQEAKICAqIHRoZSBzZW1hcGhvcmUgZGVmaW5pdGlvbgogICovCiBzdHJ1Y3Qgcndfc2VtYXBob3JlIHsKLQlzaWduZWQgaW50CQljb3VudDsKKwlzaWduZWQgbG9uZwkJY291bnQ7CiAJc3BpbmxvY2tfdAkJd2FpdF9sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQJd2FpdF9saXN0OwogI2lmIFJXU0VNX0RFQlVHCkBAIC0zNywxMCArMzgsMTAgQEAKICNlbmRpZgogfTsKIAotI2RlZmluZSBSV1NFTV9VTkxPQ0tFRF9WQUxVRQkJMHgwMDAwMDAwMAotI2RlZmluZSBSV1NFTV9BQ1RJVkVfQklBUwkJMHgwMDAwMDAwMQotI2RlZmluZSBSV1NFTV9BQ1RJVkVfTUFTSwkJMHgwMDAwZmZmZgotI2RlZmluZSBSV1NFTV9XQUlUSU5HX0JJQVMJCSgtMHgwMDAxMDAwMCkKKyNkZWZpbmUgUldTRU1fVU5MT0NLRURfVkFMVUUJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIFJXU0VNX0FDVElWRV9CSUFTCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAxKQorI2RlZmluZSBSV1NFTV9BQ1RJVkVfTUFTSwkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDBmZmZmZmZmZikKKyNkZWZpbmUgUldTRU1fV0FJVElOR19CSUFTCQktX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDEwMDAwMDAwMCkKICNkZWZpbmUgUldTRU1fQUNUSVZFX1JFQURfQklBUwkJUldTRU1fQUNUSVZFX0JJQVMKICNkZWZpbmUgUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMJCShSV1NFTV9XQUlUSU5HX0JJQVMgKyBSV1NFTV9BQ1RJVkVfQklBUykKIApAQCAtODMsNyArODQsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBfX2Rvd25fcmVhZCAoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewotCWludCByZXN1bHQgPSBpYTY0X2ZldGNoYWRkNF9hY3EoKHVuc2lnbmVkIGludCAqKSZzZW0tPmNvdW50LCAxKTsKKwlsb25nIHJlc3VsdCA9IGlhNjRfZmV0Y2hhZGQ4X2FjcSgodW5zaWduZWQgbG9uZyAqKSZzZW0tPmNvdW50LCAxKTsKIAogCWlmIChyZXN1bHQgPCAwKQogCQlyd3NlbV9kb3duX3JlYWRfZmFpbGVkKHNlbSk7CkBAIC05NSw3ICs5Niw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIF9fZG93bl93cml0ZSAoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewotCWludCBvbGQsIG5ldzsKKwlsb25nIG9sZCwgbmV3OwogCiAJZG8gewogCQlvbGQgPSBzZW0tPmNvdW50OwpAQCAtMTEyLDcgKzExMyw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIF9fdXBfcmVhZCAoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewotCWludCByZXN1bHQgPSBpYTY0X2ZldGNoYWRkNF9yZWwoKHVuc2lnbmVkIGludCAqKSZzZW0tPmNvdW50LCAtMSk7CisJbG9uZyByZXN1bHQgPSBpYTY0X2ZldGNoYWRkOF9yZWwoKHVuc2lnbmVkIGxvbmcgKikmc2VtLT5jb3VudCwgLTEpOwogCiAJaWYgKHJlc3VsdCA8IDAgJiYgKC0tcmVzdWx0ICYgUldTRU1fQUNUSVZFX01BU0spID09IDApCiAJCXJ3c2VtX3dha2Uoc2VtKTsKQEAgLTEyNCw3ICsxMjUsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBfX3VwX3dyaXRlIChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCiB7Ci0JaW50IG9sZCwgbmV3OworCWxvbmcgb2xkLCBuZXc7CiAKIAlkbyB7CiAJCW9sZCA9IHNlbS0+Y291bnQ7CkBAIC0xNDEsNyArMTQyLDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBfX2Rvd25fcmVhZF90cnlsb2NrIChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCiB7Ci0JaW50IHRtcDsKKwlsb25nIHRtcDsKIAl3aGlsZSAoKHRtcCA9IHNlbS0+Y291bnQpID49IDApIHsKIAkJaWYgKHRtcCA9PSBjbXB4Y2hnX2FjcSgmc2VtLT5jb3VudCwgdG1wLCB0bXArMSkpIHsKIAkJCXJldHVybiAxOwpAQCAtMTU2LDcgKzE1Nyw3IEBACiBzdGF0aWMgaW5saW5lIGludAogX19kb3duX3dyaXRlX3RyeWxvY2sgKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKIHsKLQlpbnQgdG1wID0gY21weGNoZ19hY3EoJnNlbS0+Y291bnQsIFJXU0VNX1VOTE9DS0VEX1ZBTFVFLAorCWxvbmcgdG1wID0gY21weGNoZ19hY3EoJnNlbS0+Y291bnQsIFJXU0VNX1VOTE9DS0VEX1ZBTFVFLAogCQkJICAgICAgUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMpOwogCXJldHVybiB0bXAgPT0gUldTRU1fVU5MT0NLRURfVkFMVUU7CiB9CkBAIC0xNjcsNyArMTY4LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogX19kb3duZ3JhZGVfd3JpdGUgKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKIHsKLQlpbnQgb2xkLCBuZXc7CisJbG9uZyBvbGQsIG5ldzsKIAogCWRvIHsKIAkJb2xkID0gc2VtLT5jb3VudDsKQEAgLTE4Miw3ICsxODMsNyBAQAogICogSW1wbGVtZW50IGF0b21pYyBhZGQgZnVuY3Rpb25hbGl0eS4gIFRoZXNlIHVzZWQgdG8gYmUgImlubGluZSIgZnVuY3Rpb25zLCBidXQgR0NDIHYzLjEKICAqIGRvZXNuJ3QgcXVpdGUgb3B0aW1pemUgdGhpcyBzdHVmZiByaWdodCBhbmQgZW5kcyB1cCB3aXRoIGJhZCBjYWxscyB0byBmZXRjaGFuZGFkZC4KICAqLwotI2RlZmluZSByd3NlbV9hdG9taWNfYWRkKGRlbHRhLCBzZW0pCWF0b21pY19hZGQoZGVsdGEsIChhdG9taWNfdCAqKSgmKHNlbSktPmNvdW50KSkKLSNkZWZpbmUgcndzZW1fYXRvbWljX3VwZGF0ZShkZWx0YSwgc2VtKQlhdG9taWNfYWRkX3JldHVybihkZWx0YSwgKGF0b21pY190ICopKCYoc2VtKS0+Y291bnQpKQorI2RlZmluZSByd3NlbV9hdG9taWNfYWRkKGRlbHRhLCBzZW0pCWF0b21pYzY0X2FkZChkZWx0YSwgKGF0b21pYzY0X3QgKikoJihzZW0pLT5jb3VudCkpCisjZGVmaW5lIHJ3c2VtX2F0b21pY191cGRhdGUoZGVsdGEsIHNlbSkJYXRvbWljNjRfYWRkX3JldHVybihkZWx0YSwgKGF0b21pYzY0X3QgKikoJihzZW0pLT5jb3VudCkpCiAKICNlbmRpZiAvKiBfQVNNX0lBNjRfUldTRU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9hZGRycy5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9hZGRycy5oCmluZGV4IDEwM2Q3NDUuLjJjMzJlNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vYWRkcnMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2FkZHJzLmgKQEAgLTMsNyArMyw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Mi0xOTk5LDIwMDEtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTItMTk5OSwyMDAxLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAKICNpZm5kZWYgX0FTTV9JQTY0X1NOX0FERFJTX0gKQEAgLTY1LDcgKzY1LDYgQEAKIAogI2RlZmluZSBOQVNJRF9NQVNLICAgICAgICAgICAgICAoKHU2NClOQVNJRF9CSVRNQVNLIDw8IE5BU0lEX1NISUZUKQogI2RlZmluZSBBU19NQVNLCQkJKCh1NjQpQVNfQklUTUFTSyA8PCBBU19TSElGVCkKLSNkZWZpbmUgUkVHSU9OX0JJVFMJCTB4ZTAwMDAwMDAwMDAwMDAwMFVMCiAKIAogLyoKQEAgLTc5LDM4ICs3OCwzMCBAQAogI2RlZmluZSBBU19DQUNfU1BBQ0UJCShBU19DQUNfVkFMIDw8IEFTX1NISUZUKQogCiAKLS8qCi0gKiBCYXNlIGFkZHJlc3NlcyBmb3IgdmFyaW91cyBhZGRyZXNzIHJhbmdlcy4KLSAqLwotI2RlZmluZSBDQUNIRUQJCQkweGUwMDAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBVTkNBQ0hFRCAgICAgICAgICAgICAgICAweGMwMDAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBVTkNBQ0hFRF9QSFlTICAgICAgICAgICAweDgwMDAwMDAwMDAwMDAwMDBVTAotCi0KIC8qIAogICogVmlydHVhbCBNb2RlIExvY2FsICYgR2xvYmFsIE1NUiBzcGFjZS4gIAogICovCiAjZGVmaW5lIFNIMV9MT0NBTF9NTVJfT0ZGU0VUCTB4ODAwMDAwMDAwMFVMCiAjZGVmaW5lIFNIMl9MT0NBTF9NTVJfT0ZGU0VUCTB4MDIwMDAwMDAwMFVMCiAjZGVmaW5lIExPQ0FMX01NUl9PRkZTRVQJKGlzX3NodWIyKCkgPyBTSDJfTE9DQUxfTU1SX09GRlNFVCA6IFNIMV9MT0NBTF9NTVJfT0ZGU0VUKQotI2RlZmluZSBMT0NBTF9NTVJfU1BBQ0UJCShVTkNBQ0hFRCB8IExPQ0FMX01NUl9PRkZTRVQpCi0jZGVmaW5lIExPQ0FMX1BIWVNfTU1SX1NQQUNFCShVTkNBQ0hFRF9QSFlTIHwgTE9DQUxfTU1SX09GRlNFVCkKKyNkZWZpbmUgTE9DQUxfTU1SX1NQQUNFCQkoX19JQTY0X1VOQ0FDSEVEX09GRlNFVCB8IExPQ0FMX01NUl9PRkZTRVQpCisjZGVmaW5lIExPQ0FMX1BIWVNfTU1SX1NQQUNFCShSR05fQkFTRShSR05fSFBBR0UpIHwgTE9DQUxfTU1SX09GRlNFVCkKIAogI2RlZmluZSBTSDFfR0xPQkFMX01NUl9PRkZTRVQJMHgwODAwMDAwMDAwVUwKICNkZWZpbmUgU0gyX0dMT0JBTF9NTVJfT0ZGU0VUCTB4MDMwMDAwMDAwMFVMCiAjZGVmaW5lIEdMT0JBTF9NTVJfT0ZGU0VUCShpc19zaHViMigpID8gU0gyX0dMT0JBTF9NTVJfT0ZGU0VUIDogU0gxX0dMT0JBTF9NTVJfT0ZGU0VUKQotI2RlZmluZSBHTE9CQUxfTU1SX1NQQUNFCShVTkNBQ0hFRCB8IEdMT0JBTF9NTVJfT0ZGU0VUKQorI2RlZmluZSBHTE9CQUxfTU1SX1NQQUNFCShfX0lBNjRfVU5DQUNIRURfT0ZGU0VUIHwgR0xPQkFMX01NUl9PRkZTRVQpCiAKIC8qCiAgKiBQaHlzaWNhbCBtb2RlIGFkZHJlc3NlcwogICovCi0jZGVmaW5lIEdMT0JBTF9QSFlTX01NUl9TUEFDRQkoVU5DQUNIRURfUEhZUyB8IEdMT0JBTF9NTVJfT0ZGU0VUKQorI2RlZmluZSBHTE9CQUxfUEhZU19NTVJfU1BBQ0UJKFJHTl9CQVNFKFJHTl9IUEFHRSkgfCBHTE9CQUxfTU1SX09GRlNFVCkKIAogCiAvKgogICogQ2xlYXIgcmVnaW9uICYgQVMgYml0cy4KICAqLwotI2RlZmluZSBUT19QSFlTX01BU0sJCSh+KFJFR0lPTl9CSVRTIHwgQVNfTUFTSykpCisjZGVmaW5lIFRPX1BIWVNfTUFTSwkJKH4oUkdOX0JJVFMgfCBBU19NQVNLKSkKIAogCiAvKgpAQCAtMTI2LDYgKzExNyw3IEBACiAjZGVmaW5lIEdMT0JBTF9NTVJfUEhZU19BRERSKG4sYSkgKEdMT0JBTF9QSFlTX01NUl9TUEFDRSB8IFJFTU9URV9BRERSKG4sYSkpCiAjZGVmaW5lIEdMT0JBTF9DQUNfQUREUihuLGEpCShDQUNfQkFTRSB8IFJFTU9URV9BRERSKG4sYSkpCiAjZGVmaW5lIENIQU5HRV9OQVNJRChuLHgpCSgodm9pZCAqKSgoKHU2NCkoeCkgJiB+TkFTSURfTUFTSykgfCBOQVNJRF9TUEFDRShuKSkpCisjZGVmaW5lIElTX1RJT19OQVNJRChuKQkJKChuKSAmIDEpCiAKIAogLyogbm9uLUlJIG1tcidzIHN0YXJ0IGF0IHRvcCBvZiBiaWcgd2luZG93IHNwYWNlICg0RykgKi8KQEAgLTEzNCwxMCArMTI2LDEwIEBACiAvKgogICogZ2VuZXJhbCBhZGRyZXNzIGRlZmluZXMKICAqLwotI2RlZmluZSBDQUNfQkFTRQkJKENBQ0hFRCAgIHwgQVNfQ0FDX1NQQUNFKQotI2RlZmluZSBBTU9fQkFTRQkJKFVOQ0FDSEVEIHwgQVNfQU1PX1NQQUNFKQotI2RlZmluZSBBTU9fUEhZU19CQVNFCQkoVU5DQUNIRURfUEhZUyB8IEFTX0FNT19TUEFDRSkKLSNkZWZpbmUgR0VUX0JBU0UJCShDQUNIRUQgICB8IEFTX0dFVF9TUEFDRSkKKyNkZWZpbmUgQ0FDX0JBU0UJCShQQUdFX09GRlNFVCB8IEFTX0NBQ19TUEFDRSkKKyNkZWZpbmUgQU1PX0JBU0UJCShfX0lBNjRfVU5DQUNIRURfT0ZGU0VUIHwgQVNfQU1PX1NQQUNFKQorI2RlZmluZSBBTU9fUEhZU19CQVNFCQkoUkdOX0JBU0UoUkdOX0hQQUdFKSB8IEFTX0FNT19TUEFDRSkKKyNkZWZpbmUgR0VUX0JBU0UJCShQQUdFX09GRlNFVCB8IEFTX0dFVF9TUEFDRSkKIAogLyoKICAqIENvbnZlcnQgTWVtb3J5IGFkZHJlc3NlcyBiZXR3ZWVuIHZhcmlvdXMgYWRkcmVzc2luZyBtb2Rlcy4KQEAgLTE1NSwxNyArMTQ3LDM1IEBACiAgKiAgICAgICAgICAgdGhlIGNoaXBsZXQgaWQgaXMgemVyby4gIElmIHdlIGltcGxlbWVudCBUSU8tVElPIGRtYSwgd2UgbWlnaHQgbmVlZAogICogICAgICAgICAgIHRvIGluc2VydCBhIGNoaXBsZXQgaWQgaW50byB0aGlzIG1hY3JvLiAgSG93ZXZlciwgaXQgaXMgb3VyIGJlbGllZgogICogICAgICAgICAgIHJpZ2h0IG5vdyB0aGF0IHRoaXMgY2hpcGxldCBpZCB3aWxsIGJlIElDRSwgd2hpY2ggaXMgYWxzbyB6ZXJvLgotICogICAgICAgICAgIE5hc2lkIHN0YXJ0cyBvbiBiaXQgNDAuCiAgKi8KLSNkZWZpbmUgUEhZU19UT19USU9ETUEoeCkJKCAoKCh1NjQpKE5BU0lEX0dFVCh4KSkpIDw8IDQwKSB8IE5PREVfT0ZGU0VUKHgpKQotI2RlZmluZSBQSFlTX1RPX0RNQSh4KSAgICAgICAgICAoICgoKHU2NCkoeCkgJiBOQVNJRF9NQVNLKSA+PiAyKSB8IE5PREVfT0ZGU0VUKHgpKQorI2RlZmluZSBTSDFfVElPX1BIWVNfVE9fRE1BKHgpIAkJCQkJCVwKKwkoKCgodTY0KShOQVNJRF9HRVQoeCkpKSA8PCA0MCkgfCBOT0RFX09GRlNFVCh4KSkKKworI2RlZmluZSBTSDJfTkVUV09SS19CQU5LX09GRlNFVCh4KSAJCQkJCVwKKyAgICAgICAgKCh1NjQpKHgpICYgKCgxVUwgPDwgKHNuX2h1Yl9pbmZvLT5uYXNpZF9zaGlmdCAtIDQpKSAtMSkpCisKKyNkZWZpbmUgU0gyX05FVFdPUktfQkFOS19TRUxFQ1QoeCkgCQkJCQlcCisgICAgICAgICgoKCh1NjQpKHgpICYgKDB4M1VMIDw8IChzbl9odWJfaW5mby0+bmFzaWRfc2hpZnQgLSA0KSkpCVwKKyAgICAgICAgCT4+IChzbl9odWJfaW5mby0+bmFzaWRfc2hpZnQgLSA0KSkgPDwgMzYpCisKKyNkZWZpbmUgU0gyX05FVFdPUktfQUREUkVTUyh4KSAJCQkJCQlcCisJKFNIMl9ORVRXT1JLX0JBTktfT0ZGU0VUKHgpIHwgU0gyX05FVFdPUktfQkFOS19TRUxFQ1QoeCkpCisKKyNkZWZpbmUgU0gyX1RJT19QSFlTX1RPX0RNQSh4KSAJCQkJCQlcCisgICAgICAgICgoKHU2NCkoTkFTSURfR0VUKHgpKSA8PCA0MCkgfCAJU0gyX05FVFdPUktfQUREUkVTUyh4KSkKKworI2RlZmluZSBQSFlTX1RPX1RJT0RNQSh4KQkJCQkJCVwKKwkoaXNfc2h1YjEoKSA/IFNIMV9USU9fUEhZU19UT19ETUEoeCkgOiBTSDJfVElPX1BIWVNfVE9fRE1BKHgpKQorCisjZGVmaW5lIFBIWVNfVE9fRE1BKHgpCQkJCQkJCVwKKwkoKCgodTY0KSh4KSAmIE5BU0lEX01BU0spID4+IDIpIHwgTk9ERV9PRkZTRVQoeCkpCiAKIAogLyoKICAqIE1hY3JvcyB0byB0ZXN0IGZvciBhZGRyZXNzIHR5cGUuCiAgKi8KLSNkZWZpbmUgSVNfQU1PX0FERFJFU1MoeCkJKCgodTY0KSh4KSAmIChSRUdJT05fQklUUyB8IEFTX01BU0spKSA9PSBBTU9fQkFTRSkKLSNkZWZpbmUgSVNfQU1PX1BIWVNfQUREUkVTUyh4KQkoKCh1NjQpKHgpICYgKFJFR0lPTl9CSVRTIHwgQVNfTUFTSykpID09IEFNT19QSFlTX0JBU0UpCisjZGVmaW5lIElTX0FNT19BRERSRVNTKHgpCSgoKHU2NCkoeCkgJiAoUkdOX0JJVFMgfCBBU19NQVNLKSkgPT0gQU1PX0JBU0UpCisjZGVmaW5lIElTX0FNT19QSFlTX0FERFJFU1MoeCkJKCgodTY0KSh4KSAmIChSR05fQklUUyB8IEFTX01BU0spKSA9PSBBTU9fUEhZU19CQVNFKQogCiAKIC8qCkBAIC0xODAsMTggKzE5MCwyMCBAQAogI2RlZmluZSBUSU9fU1dJTl9CQVNFKG4sIHcpIAkJKFRJT19JT19CQVNFKG4pICsgXAogCQkJCQkgICAgKCh1NjQpICh3KSA8PCBUSU9fU1dJTl9TSVpFX0JJVFMpKQogI2RlZmluZSBOT0RFX0lPX0JBU0UobikJCQkoR0xPQkFMX01NUl9TUEFDRSB8IE5BU0lEX1NQQUNFKG4pKQotI2RlZmluZSBUSU9fSU9fQkFTRShuKSAgICAgICAgICAgICAgICAgIChVTkNBQ0hFRCB8IE5BU0lEX1NQQUNFKG4pKQorI2RlZmluZSBUSU9fSU9fQkFTRShuKSAgICAgICAgICAgICAgICAgIChfX0lBNjRfVU5DQUNIRURfT0ZGU0VUIHwgTkFTSURfU1BBQ0UobikpCiAjZGVmaW5lIEJXSU5fU0laRQkJCSgxVUwgPDwgQldJTl9TSVpFX0JJVFMpCiAjZGVmaW5lIE5PREVfQldJTl9CQVNFMChuKQkJKE5PREVfSU9fQkFTRShuKSArIEJXSU5fU0laRSkKICNkZWZpbmUgTk9ERV9CV0lOX0JBU0UobiwgdykJCShOT0RFX0JXSU5fQkFTRTAobikgKyAoKHU2NCkgKHcpIDw8IEJXSU5fU0laRV9CSVRTKSkKICNkZWZpbmUgUkFXX05PREVfU1dJTl9CQVNFKG4sIHcpCShOT0RFX0lPX0JBU0UobikgKyAoKHU2NCkgKHcpIDw8IFNXSU5fU0laRV9CSVRTKSkKICNkZWZpbmUgQldJTl9XSURHRVRfTUFTSwkJMHg3CiAjZGVmaW5lIEJXSU5fV0lORE9XTlVNKHgpCQkoKCh4KSA+PiBCV0lOX1NJWkVfQklUUykgJiBCV0lOX1dJREdFVF9NQVNLKQorI2RlZmluZSBTSDFfSVNfQklHX1dJTkRPV19BRERSKHgpCSgoeCkgJiBCV0lOX1RPUCkKIAogI2RlZmluZSBUSU9fQldJTl9XSU5ET1dfU0VMRUNUX01BU0sJMHg3CiAjZGVmaW5lIFRJT19CV0lOX1dJTkRPV05VTSh4KQkJKCgoeCkgPj4gVElPX0JXSU5fU0laRV9CSVRTKSAmIFRJT19CV0lOX1dJTkRPV19TRUxFQ1RfTUFTSykKIAotCisjZGVmaW5lIFRJT19IV0lOX1NISUZUX0JJVFMJCTMzCisjZGVmaW5lIFRJT19IV0lOKHgpCQkJKE5PREVfT0ZGU0VUKHgpID4+IFRJT19IV0lOX1NISUZUX0JJVFMpCiAKIC8qCiAgKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHBlcnRhaW4gdG8gdGhlIElPIHNwZWNpYWwgYWRkcmVzcwpAQCAtMjE2LDEwICsyMjgsNiBAQAogI2RlZmluZSBUSU9fU1dJTl9XSURHRVROVU0oeCkJCSgoKHgpICA+PiBUSU9fU1dJTl9TSVpFX0JJVFMpICYgVElPX1NXSU5fV0lER0VUX01BU0spCiAKIAotI2RlZmluZSBUSU9fSU9TUEFDRV9BRERSKG4seCkJCQkJCVwKLQkvKiBNb3ZlIGluIHRoZSBDaGlwbGV0IElEIGZvciBUSU8gTG9jYWwgQmxvY2sgTU1SICovCVwKLQkoUkVNT1RFX0FERFIobix4KSB8IDFVTCA8PCAoTkFTSURfU0hJRlQgLSAyKSkKLQogLyoKICAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHByb2R1Y2UgdGhlIGNvcnJlY3QgYmFzZSB2aXJ0dWFsIGFkZHJlc3MgZm9yCiAgKiB0aGUgaHViIHJlZ2lzdGVycy4gVGhlIFJFTU9URV9IVUJfKiBtYWNybyBwcm9kdWNlCkBAIC0yMzQsMTggKzI0Miw0MCBAQAogICoJT3RoZXJ3aXNlLCB0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2ggaXMgdG8gdXNlICpfSFVCX0woKSBhbmQgKl9IVUJfUygpLgogICoJVGhleSdyZSBhbHdheXMgc2FmZS4KICAqLworLyogU2h1YjEgVElPICYgTU1SIGFkZHJlc3NpbmcgbWFjcm9zICovCisjZGVmaW5lIFNIMV9USU9fSU9TUEFDRV9BRERSKG4seCkJCQkJCVwKKwlHTE9CQUxfTU1SX0FERFIobix4KQorCisjZGVmaW5lIFNIMV9SRU1PVEVfQldJTl9NTVIobix4KQkJCQkJXAorCUdMT0JBTF9NTVJfQUREUihuLHgpCisKKyNkZWZpbmUgU0gxX1JFTU9URV9TV0lOX01NUihuLHgpCQkJCQlcCisJKE5PREVfU1dJTl9CQVNFKG4sMSkgKyAweDgwMDAwMFVMICsgKHgpKQorCisjZGVmaW5lIFNIMV9SRU1PVEVfTU1SKG4seCkJCQkJCQlcCisJKFNIMV9JU19CSUdfV0lORE9XX0FERFIoeCkgPyBTSDFfUkVNT1RFX0JXSU5fTU1SKG4seCkgOgkJXAorCSAJU0gxX1JFTU9URV9TV0lOX01NUihuLHgpKQorCisvKiBTaHViMSBUSU8gJiBNTVIgYWRkcmVzc2luZyBtYWNyb3MgKi8KKyNkZWZpbmUgU0gyX1RJT19JT1NQQUNFX0FERFIobix4KQkJCQkJXAorCSgoX19JQTY0X1VOQ0FDSEVEX09GRlNFVCB8IFJFTU9URV9BRERSKG4seCkgfCAxVUwgPDwgKE5BU0lEX1NISUZUIC0gMikpKQorCisjZGVmaW5lIFNIMl9SRU1PVEVfTU1SKG4seCkJCQkJCQlcCisJR0xPQkFMX01NUl9BRERSKG4seCkKKworCisvKiBUSU8gJiBNTVIgYWRkcmVzc2luZyBtYWNyb3MgdGhhdCB3b3JrIG9uIGJvdGggc2h1YjEgJiBzaHViMiAqLworI2RlZmluZSBUSU9fSU9TUEFDRV9BRERSKG4seCkJCQkJCQlcCisJKCh1NjQgKikoaXNfc2h1YjEoKSA/IFNIMV9USU9fSU9TUEFDRV9BRERSKG4seCkgOgkJXAorCQkgU0gyX1RJT19JT1NQQUNFX0FERFIobix4KSkpCisKKyNkZWZpbmUgU0hfUkVNT1RFX01NUihuLHgpCQkJCQkJXAorCShpc19zaHViMSgpID8gU0gxX1JFTU9URV9NTVIobix4KSA6IFNIMl9SRU1PVEVfTU1SKG4seCkpCisKICNkZWZpbmUgUkVNT1RFX0hVQl9BRERSKG4seCkJCQkJCQlcCi0JKChuICYgMSkgPwkJCQkJCQlcCi0JLyogVElPOiAqLwkJCQkJCQlcCi0JKGlzX3NodWIyKCkgPwkJCQkJCQlcCi0JLyogVElPIG9uIFNodWIyICovCQkJCQkJXAotCSh2b2xhdGlsZSB1NjQgKikoVElPX0lPU1BBQ0VfQUREUihuLHgpKQkJCQlcCi0JOiAvKiBUSU8gb24gc2h1YjEgKi8JCQkJCQlcCi0JKHZvbGF0aWxlIHU2NCAqKShHTE9CQUxfTU1SX0FERFIobix4KSkpCQkJCVwKLQkJCQkJCQkJCVwKLQk6IC8qIFNIVUIxIGFuZCBTSFVCMiBNTVJzOiAqLwkJCQkJXAotCSgoKHgpICYgQldJTl9UT1ApID8gKCh2b2xhdGlsZSB1NjQgKikoR0xPQkFMX01NUl9BRERSKG4seCkpKQlcCi0JOiAoKHZvbGF0aWxlIHU2NCAqKShOT0RFX1NXSU5fQkFTRShuLDEpICsgMHg4MDAwMDAgKyAoeCkpKSkpCisJKElTX1RJT19OQVNJRChuKSA/ICAoKHZvbGF0aWxlIHU2NCopVElPX0lPU1BBQ0VfQUREUihuLHgpKSA6CVwKKwkgKCh2b2xhdGlsZSB1NjQqKVNIX1JFTU9URV9NTVIobix4KSkpCisKIAogI2RlZmluZSBIVUJfTCh4KQkJCSgqKCh2b2xhdGlsZSB0eXBlb2YoKngpICopeCkpCiAjZGVmaW5lCUhVQl9TKHgsZCkJCQkoKigodm9sYXRpbGUgdHlwZW9mKCp4KSAqKXgpID0gKGQpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9nZW8uaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vZ2VvLmgKaW5kZXggODRiMjU0Ni4uZjA4M2M5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9nZW8uaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2dlby5oCkBAIC0zLDcgKzMsNyBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTIgLSAxOTk3LCAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAxOTkyIC0gMTk5NywgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogCiAjaWZuZGVmIF9BU01fSUE2NF9TTl9HRU9fSApAQCAtMTA4LDcgKzEwOCw2IEBACiAjZGVmaW5lIElOVkFMSURfU0xBQiAgICAgICAgICAgIChzbGFiaWRfdCktMQogI2RlZmluZSBJTlZBTElEX1NMT1QgICAgICAgICAgICAoc2xvdGlkX3QpLTEKICNkZWZpbmUgSU5WQUxJRF9NT0RVTEUgICAgICAgICAgKChtb2R1bGVpZF90KS0xKQotI2RlZmluZSBJTlZBTElEX1BBUlRJRCAgICAgICAgICAoKHBhcnRpZF90KS0xKQogCiBzdGF0aWMgaW5saW5lIHNsYWJpZF90IGdlb19zbGFiKGdlb2lkX3QgZykKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9pbnRyLmgKaW5kZXggZTE5MGRkNC4uZTM1MDc0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9pbnRyLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9pbnRyLmgKQEAgLTEyLDEzICsxMiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAKICNkZWZpbmUgU0dJX1VBUlRfVkVDVE9SCQkoMHhlOSkKLSNkZWZpbmUgU0dJX1BDSUJSX0VSUk9SCQkoMHgzMykKIAogLyogUmVzZXJ2ZWQgSVJRcyA6IE5vdGUsIG5vdCB0byBleGNlZWQgSUE2NF9TTjJfRklSU1RfREVWSUNFX1ZFQ1RPUiAqLwogI2RlZmluZSBTR0lfWFBDX0FDVElWQVRFICAgICAgICAgICAgICAgICgweDMwKQogI2RlZmluZSBTR0lfSUlfRVJST1IgICAgICAgICAgICAgICAgICAgICgweDMxKQogI2RlZmluZSBTR0lfWEJPV19FUlJPUiAgICAgICAgICAgICAgICAgICgweDMyKQotI2RlZmluZSBTR0lfUENJQlJfRVJST1IgICAgICAgICAgICAgICAgICgweDMzKQorI2RlZmluZSBTR0lfUENJQVNJQ19FUlJPUiAgICAgICAgICAgICAgICgweDMzKQogI2RlZmluZSBTR0lfQUNQSV9TQ0lfSU5UICAgICAgICAgICAgICAgICgweDM0KQogI2RlZmluZSBTR0lfVElPQ0FfRVJST1IgICAgICAgICAgICAgICAgICgweDM1KQogI2RlZmluZSBTR0lfVElPX0VSUk9SICAgICAgICAgICAgICAgICAgICgweDM2KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9ub2RlcGRhLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL25vZGVwZGEuaAppbmRleCA3MTM4YjFlLi40N2JiODEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL25vZGVwZGEuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL25vZGVwZGEuaApAQCAtMzcsNyArMzcsNiBAQAogCiBzdHJ1Y3Qgbm9kZXBkYV9zIHsKIAl2b2lkIAkJKnBkaW5mbzsJLyogUGxhdGZvcm0tZGVwZW5kZW50IHBlci1ub2RlIGluZm8gKi8KLQlzcGlubG9ja190CQliaXN0X2xvY2s7CiAKIAkvKgogCSAqIFRoZSBCVEVzIG9uIHRoaXMgbm9kZSBhcmUgc2hhcmVkIGJ5IHRoZSBsb2NhbCBjcHVzCkBAIC01NSw2ICs1NCw4IEBACiAJICogQXJyYXkgb2YgcGh5c2ljYWwgY3B1IGlkZW50aWZpZXJzLiBJbmRleGVkIGJ5IGNwdWlkLgogCSAqLwogCXN0cnVjdCBwaHlzX2NwdWlkCXBoeXNfY3B1aWRbTlJfQ1BVU107CisJc3BpbmxvY2tfdAkJcHRjX2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKKwlzcGlubG9ja190CQliaXN0X2xvY2s7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCBub2RlcGRhX3Mgbm9kZXBkYV90OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oCmluZGV4IDk3NmY1ZWYuLmFkMGU4ZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmgKQEAgLTE4LDggKzE4LDkgQEAKICNkZWZpbmUgUENJSU9fQVNJQ19UWVBFX1BJQwkyCiAjZGVmaW5lIFBDSUlPX0FTSUNfVFlQRV9USU9DUAkzCiAjZGVmaW5lIFBDSUlPX0FTSUNfVFlQRV9USU9DQQk0CisjZGVmaW5lIFBDSUlPX0FTSUNfVFlQRV9USU9DRQk1CiAKLSNkZWZpbmUgUENJSU9fQVNJQ19NQVhfVFlQRVMJNQorI2RlZmluZSBQQ0lJT19BU0lDX01BWF9UWVBFUwk2CiAKIC8qCiAgKiBDb21tb24gcGNpaW8gYnVzIHByb3ZpZGVyIGRhdGEuICBUaGVyZSBzaG91bGQgYmUgb25lIG9mIHRoZXNlIGFzIHRoZQpAQCAtMzAsNyArMzEsOCBAQAogc3RydWN0IHBjaWJ1c19idXNzb2Z0IHsKIAl1aW50MzJfdAkJYnNfYXNpY190eXBlOwkvKiBjaGlwc2V0IHR5cGUgKi8KIAl1aW50MzJfdAkJYnNfeGlkOwkJLyogeHdpZGdldCBpZCAqLwotCXVpbnQ2NF90CQlic19wZXJzaXN0X2J1c251bTsgLyogUGVyc2lzdGVudCBCdXMgTnVtYmVyICovCisJdWludDMyX3QJCWJzX3BlcnNpc3RfYnVzbnVtOyAvKiBQZXJzaXN0ZW50IEJ1cyBOdW1iZXIgKi8KKwl1aW50MzJfdAkJYnNfcGVyc2lzdF9zZWdtZW50OyAvKiBTZWdtZW50IE51bWJlciAqLwogCXVpbnQ2NF90CQlic19sZWdhY3lfaW87CS8qIGxlZ2FjeSBpbyBwaW8gYWRkciAqLwogCXVpbnQ2NF90CQlic19sZWdhY3lfbWVtOwkvKiBsZWdhY3kgbWVtIHBpbyBhZGRyICovCiAJdWludDY0X3QJCWJzX2Jhc2U7CS8qIHdpZGdldCBiYXNlICovCkBAIC00Nyw2ICs0OSw4IEBACiAJZG1hX2FkZHJfdAkoKmRtYV9tYXBfY29uc2lzdGVudCkoc3RydWN0IHBjaV9kZXYgKiwgdW5zaWduZWQgbG9uZywgc2l6ZV90KTsKIAl2b2lkCQkoKmRtYV91bm1hcCkoc3RydWN0IHBjaV9kZXYgKiwgZG1hX2FkZHJfdCwgaW50KTsKIAl2b2lkICoJCSgqYnVzX2ZpeHVwKShzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKiwgc3RydWN0IHBjaV9jb250cm9sbGVyICopOworIAl2b2lkCQkoKmZvcmNlX2ludGVycnVwdCkoc3RydWN0IHNuX2lycV9pbmZvICopOworIAl2b2lkCQkoKnRhcmdldF9pbnRlcnJ1cHQpKHN0cnVjdCBzbl9pcnFfaW5mbyAqKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpzbl9wY2lfcHJvdmlkZXJbXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vcGRhLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BkYS5oCmluZGV4IGVhNTU5MGMuLjFjNTEwOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vcGRhLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9wZGEuaApAQCAtMzksNyArMzksNiBAQAogCXVuc2lnbmVkIGxvbmcgcGlvX3dyaXRlX3N0YXR1c192YWw7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcGlvX3NodWJfd2FyX2NhbV9hZGRyOwogCi0JdW5zaWduZWQgbG9uZwlzbl9zb2Z0X2lycls0XTsKIAl1bnNpZ25lZCBsb25nCXNuX2luX3NlcnZpY2VfaXZlY3NbNF07CiAJaW50CQlzbl9sYl9pbnRfd2FyX3RpY2tzOwogCWludAkJc25fbGFzdF9pcnE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuMi9zbl9od3BlcmYuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc24yL3NuX2h3cGVyZi5oCmluZGV4IGRmNzVmNGMuLjI5MWVmM2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc24yL3NuX2h3cGVyZi5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc24yL3NuX2h3cGVyZi5oCkBAIC00Myw2ICs0Myw3IEBACiAKIC8qIG1hY3JvcyBmb3Igb2JqZWN0IGNsYXNzaWZpY2F0aW9uICovCiAjZGVmaW5lIFNOX0hXUEVSRl9JU19OT0RFKHgpCQkoKHgpICYmIHN0cnN0cigoeCktPm5hbWUsICJTSHViIikpCisjZGVmaW5lIFNOX0hXUEVSRl9JU19OT0RFX1NIVUIyKHgpCSgoeCkgJiYgc3Ryc3RyKCh4KS0+bmFtZSwgIlNIdWIgMi4iKSkKICNkZWZpbmUgU05fSFdQRVJGX0lTX0lPTk9ERSh4KQkJKCh4KSAmJiBzdHJzdHIoKHgpLT5uYW1lLCAiVElPIikpCiAjZGVmaW5lIFNOX0hXUEVSRl9JU19ST1VURVIoeCkJCSgoeCkgJiYgc3Ryc3RyKCh4KS0+bmFtZSwgIlJvdXRlciIpKQogI2RlZmluZSBTTl9IV1BFUkZfSVNfTkwzUk9VVEVSKHgpCSgoeCkgJiYgc3Ryc3RyKCh4KS0+bmFtZSwgIk5MM1JvdXRlciIpKQpAQCAtMjE0LDYgKzIxNSwxNSBAQAogICovCiAjZGVmaW5lIFNOX0hXUEVSRl9HRVRfTk9ERV9OQVNJRAkoMTAyfFNOX0hXUEVSRl9PUF9NRU1fQ09QWU9VVCkKIAorLyoKKyAqIEdpdmVuIGEgbm9kZSBpZCwgZGV0ZXJtaW5lIHRoZSBpZCBvZiB0aGUgbmVhcmVzdCBub2RlIHdpdGggQ1BVcworICogYW5kIHRoZSBpZCBvZiB0aGUgbmVhcmVzdCBub2RlIHRoYXQgaGFzIG1lbW9yeS4gVGhlIGFyZ3VtZW50CisgKiBub2RlIHdvdWxkIG5vcm1hbGx5IGJlIGEgImhlYWRsZXNzIiBub2RlLCBlLmcuIGFuICJJTyBub2RlIi4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2V4dGVybiBpbnQgc25faHdwZXJmX2dldF9uZWFyZXN0X25vZGUoY25vZGVpZF90IG5vZGUsCisJY25vZGVpZF90ICpuZWFyX21lbSwgY25vZGVpZF90ICpuZWFyX2NwdSk7CisKIC8qIHJldHVybiBjb2RlcyAqLwogI2RlZmluZSBTTl9IV1BFUkZfT1BfT0sJCQkwCiAjZGVmaW5lIFNOX0hXUEVSRl9PUF9OT01FTQkJMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmgKaW5kZXggMjc5NzZkMi4uZTY3ODI1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX3NhbC5oCkBAIC01NSw3ICs1NSw2IEBACiAjZGVmaW5lICBTTl9TQUxfQlVTX0NPTkZJRwkJICAgCSAgIDB4MDIwMDAwMzcKICNkZWZpbmUgIFNOX1NBTF9TWVNfU0VSSUFMX0dFVAkJCSAgIDB4MDIwMDAwMzgKICNkZWZpbmUgIFNOX1NBTF9QQVJUSVRJT05fU0VSSUFMX0dFVAkJICAgMHgwMjAwMDAzOQotI2RlZmluZSAgU05fU0FMX1NZU0NUTF9QQVJUSVRJT05fR0VUCQkgICAweDAyMDAwMDNhCiAjZGVmaW5lICBTTl9TQUxfU1lTVEVNX1BPV0VSX0RPV04JCSAgIDB4MDIwMDAwM2IKICNkZWZpbmUgIFNOX1NBTF9HRVRfTUFTVEVSX0JBU0VJT19OQVNJRAkJICAgMHgwMjAwMDAzYwogI2RlZmluZSAgU05fU0FMX0NPSEVSRU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAzZApAQCAtNzgsNyArNzcsOCBAQAogCiAjZGVmaW5lIFNOX1NBTF9IVUJfRVJST1JfSU5URVJSVVBUCQkgICAweDAyMDAwMDYwCiAjZGVmaW5lIFNOX1NBTF9CVEVfUkVDT1ZFUgkJCSAgIDB4MDIwMDAwNjEKLSNkZWZpbmUgU05fU0FMX0lPSUZfR0VUX1BDSV9UT1BPTE9HWQkgICAgICAgICAgIDB4MDIwMDAwNjIKKyNkZWZpbmUgU05fU0FMX1JFU0VSVkVEX0RPX05PVF9VU0UJCSAgIDB4MDIwMDAwNjIKKyNkZWZpbmUgU05fU0FMX0lPSUZfR0VUX1BDSV9UT1BPTE9HWQkJICAgMHgwMjAwMDA2NAogCiAvKgogICogU2VydmljZS1zcGVjaWZpYyBjb25zdGFudHMKQEAgLTU4NiwzNSArNTg2LDYgQEAKIH0KIAogLyoKLSAqIFJldHVybnMgdGhlIHBhcnRpdGlvbiBpZCBvZiB0aGUgbmFzaWQgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50LAotICogb3IgSU5WQUxJRF9QQVJUSUQgaWYgdGhlIHBhcnRpdGlvbiBpZCBjYW5ub3QgYmUgcmV0cmlldmVkLgotICovCi1zdGF0aWMgaW5saW5lIHBhcnRpZF90Ci1pYTY0X3NuX3N5c2N0bF9wYXJ0aXRpb25fZ2V0KG5hc2lkX3QgbmFzaWQpCi17Ci0Jc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7Ci0JaWE2NF9zYWxfb2VtY2FsbF9ub2xvY2soJnJldF9zdHVmZiwgU05fU0FMX1NZU0NUTF9QQVJUSVRJT05fR0VULCBuYXNpZCwKLQkJCQkwLCAwLCAwLCAwLCAwLCAwKTsKLQlpZiAocmV0X3N0dWZmLnN0YXR1cyAhPSAwKQotCSAgICByZXR1cm4gSU5WQUxJRF9QQVJUSUQ7Ci0JcmV0dXJuICgocGFydGlkX3QpcmV0X3N0dWZmLnYwKTsKLX0KLQotLyoKLSAqIFJldHVybnMgdGhlIHBhcnRpdGlvbiBpZCBvZiB0aGUgY3VycmVudCBwcm9jZXNzb3IuCi0gKi8KLQotZXh0ZXJuIHBhcnRpZF90IHNuX3BhcnRpZDsKLQotc3RhdGljIGlubGluZSBwYXJ0aWRfdAotc25fbG9jYWxfcGFydGlkKHZvaWQpIHsKLQlpZiAodW5saWtlbHkoc25fcGFydGlkIDwgMCkpIHsKLQkJc25fcGFydGlkID0gaWE2NF9zbl9zeXNjdGxfcGFydGl0aW9uX2dldChjcHVpZF90b19uYXNpZChzbXBfcHJvY2Vzc29yX2lkKCkpKTsKLQl9Ci0JcmV0dXJuIHNuX3BhcnRpZDsKLX0KLQotLyoKICAqIFJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHBhcnRpdGlvbidzIHJlc2VydmVkIHBhZ2UgdGhyb3VnaAogICogYW4gaXRlcmF0aXZlIG51bWJlciBvZiBjYWxscy4KICAqCkBAIC03NDksNyArNzIwLDggQEAKIHsKIAlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJldF9zdHVmZjsKIAlTQUxfQ0FMTChyZXRfc3R1ZmYsIFNOX1NBTF9TWVNURU1fUE9XRVJfRE9XTiwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7Ci0Jd2hpbGUoMSk7CisJd2hpbGUoMSkKKwkJY3B1X3JlbGF4KCk7CiAJLyogbmV2ZXIgcmV0dXJucyAqLwogfQogCkBAIC0xMDE4LDI0ICs5OTAsNiBAQAogCXJldF9zdHVmZi52MiA9IDA7CiAJU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwgU05fU0FMX0dFVF9TTl9JTkZPLCBmYywgMCwgMCwgMCwgMCwgMCwgMCk7CiAKLS8qKioqKiBCRUdJTiBIQUNLIC0gdGVtcCB0aWwgb2xkIHByb21zIG5vIGxvbmdlciBzdXBwb3J0ZWQgKioqKioqKiovCi0JaWYgKHJldF9zdHVmZi5zdGF0dXMgPT0gU0FMUkVUX05PVF9JTVBMRU1FTlRFRCkgewotCQlpbnQgbmFzaWQgPSBnZXRfc2FwaWNpZCgpICYgMHhmZmY7OwotI2RlZmluZSBTSF9TSFVCX0lEX05PREVTX1BFUl9CSVRfTUFTSyAweDAwMWYwMDAwMDAwMDAwMDBVTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIFNIX1NIVUJfSURfTk9ERVNfUEVSX0JJVF9TSEZUIDQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCWlmIChzaHVidHlwZSkgKnNodWJ0eXBlID0gMDsKLQkJaWYgKG5hc2lkX2JpdG1hc2spICpuYXNpZF9iaXRtYXNrID0gMHg3ZmY7Ci0JCWlmIChuYXNpZF9zaGlmdCkgKm5hc2lkX3NoaWZ0ID0gMzg7Ci0JCWlmIChzeXN0ZW1zaXplKSAqc3lzdGVtc2l6ZSA9IDExOwotCQlpZiAoc2hhcmluZ19kb21haW5fc2l6ZSkgKnNoYXJpbmdfZG9tYWluX3NpemUgPSA5OwotCQlpZiAocGFydGlkKSAqcGFydGlkID0gaWE2NF9zbl9zeXNjdGxfcGFydGl0aW9uX2dldChuYXNpZCk7Ci0JCWlmIChjb2hlcikgKmNvaGVyID0gbmFzaWQgPj4gOTsKLQkJaWYgKHJlZykgKnJlZyA9IChIVUJfTCgodTY0ICopIExPQ0FMX01NUl9BRERSKFNIMV9TSFVCX0lEKSkgJiBTSF9TSFVCX0lEX05PREVTX1BFUl9CSVRfTUFTSykgPj4KLQkJCVNIX1NIVUJfSURfTk9ERVNfUEVSX0JJVF9TSEZUOwotCQlyZXR1cm4gMDsKLQl9Ci0vKioqKiogRU5EIEhBQ0sgKioqKioqKi8KLQogCWlmIChyZXRfc3R1ZmYuc3RhdHVzIDwgMCkKIAkJcmV0dXJuIHJldF9zdHVmZi5zdGF0dXM7CiAKQEAgLTEwNjgsMTIgKzEwMjIsMTAgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWlhNjRfc25faW9pZl9nZXRfcGNpX3RvcG9sb2d5KHU2NCByYWNrLCB1NjQgYmF5LCB1NjQgc2xvdCwgdTY0IHNsYWIsCi0JCQkgICAgICB1NjQgYnVmLCB1NjQgbGVuKQoraWE2NF9zbl9pb2lmX2dldF9wY2lfdG9wb2xvZ3kodTY0IGJ1ZiwgdTY0IGxlbikKIHsKIAlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJ2OwotCVNBTF9DQUxMX05PTE9DSyhydiwgU05fU0FMX0lPSUZfR0VUX1BDSV9UT1BPTE9HWSwKLQkJcmFjaywgYmF5LCBzbG90LCBzbGFiLCBidWYsIGxlbiwgMCk7CisJU0FMX0NBTExfTk9MT0NLKHJ2LCBTTl9TQUxfSU9JRl9HRVRfUENJX1RPUE9MT0dZLCBidWYsIGxlbiwgMCwgMCwgMCwgMCwgMCk7CiAJcmV0dXJuIChpbnQpIHJ2LnN0YXR1czsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jZS5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyODc5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NlLmgKQEAgLTAsMCArMSw3NDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgVW5wdWJsaXNoZWQgY29weXJpZ2h0IChjKSAyMDA1LCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICAgICAgICAgICAgICAgICoKKyAqICBUSElTIElTIFVOUFVCTElTSEVEIENPTkZJREVOVElBTCBBTkQgUFJPUFJJRVRBUlkgU09VUkNFIENPREUgT0YgU0dJLiAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgVGhlIGNvcHlyaWdodCBub3RpY2UgYWJvdmUgZG9lcyAgbm90IGV2aWRlbmNlIGFueSBhY3R1YWwgb3IgaW50ZW5kZWQgICoKKyAqICBwdWJsaWNhdGlvbiAgb3IgIGRpc2Nsb3N1cmUgIG9mICB0aGlzIHNvdXJjZSAgY29kZSwgIHdoaWNoICBpbmNsdWRlcyAgKgorICogIGluZm9ybWF0aW9uIHRoYXQgaXMgY29uZmlkZW50aWFsICBhbmQvb3IgcHJvcHJpZXRhcnksIGFuZCBpcyBhIHRyYWRlICAqCisgKiAgc2VjcmV0LCBvZiAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgIEFOWSBSRVBST0RVQ1RJT04sIE1PRElGSUNBVElPTiwgICoKKyAqICBESVNUUklCVVRJT04sIFBVQkxJQyAgUEVSRk9STUFOQ0UsIE9SICBQVUJMSUMgRElTUExBWSBPRiAgT1IgVEhST1VHSCAgKgorICogIFVTRSAgT0YgVEhJUyAgU09VUkNFIENPREUgIFdJVEhPVVQgIFRIRSBFWFBSRVNTICBXUklUVEVOIENPTlNFTlQgIE9GICAqCisgKiAgU0lMSUNPTiBHUkFQSElDUywgSU5DLiAgSVMgIFNUUklDVExZIFBST0hJQklURUQsIEFORCBJTiBWSU9MQVRJT04gT0YgICoKKyAqICBBUFBMSUNBQkxFICBMQVdTICAgQU5EICBJTlRFUk5BVElPTkFMICBUUkVBVElFUy4gICAgVEhFICBSRUNFSVBUICBPUiAgKgorICogIFBPU1NFU1NJT04gT0YgIFRISVMgU09VUkNFIENPREUgQU5EL09SIFJFTEFURUQgIElORk9STUFUSU9OIERPRVMgTk9UICAqCisgKiAgQ09OVkVZIE9SIElNUExZIEFOWSBSSUdIVFMgIFRPIFJFUFJPRFVDRSwgRElTQ0xPU0UgT1IgRElTVFJJQlVURSBJVFMgICoKKyAqICBDT05URU5UUywgIE9SIFRPICBNQU5VRkFDVFVSRSwgVVNFLCAgT1IgIFNFTEwgQU5ZVEhJTkcgIFRIQVQgSVQgIE1BWSAgKgorICogIERFU0NSSUJFLCBJTiBXSE9MRSBPUiBJTiBQQVJULiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0FTTV9JQTY0X1NOX1RJT0NFX0hfXworI2RlZmluZSBfX0FTTV9JQTY0X1NOX1RJT0NFX0hfXworCisvKiBDRSBBU0lDIHBhcnQgJiBtZmdyIGluZm9ybWF0aW9uICAqLworI2RlZmluZSBUSU9DRV9QQVJUX05VTQkJCTB4Q0UwMAorI2RlZmluZSBUSU9DRV9NRkdSX05VTQkJCTB4MzYKKyNkZWZpbmUgVElPQ0VfUkVWX0EJCQkweDEKKworLyogQ0UgVmlydHVhbCBQUEIgVmVuZG9yL0RldmljZSBJRHMgKi8KKyNkZWZpbmUgQ0VfVklSVF9QUEJfVkVORE9SX0lECQkweDEwYTkKKyNkZWZpbmUgQ0VfVklSVF9QUEJfREVWSUNFX0lECQkweDQwMDIKKworLyogQ0UgSG9zdCBCcmlkZ2UgVmVuZG9yL0RldmljZSBJRHMgKi8KKyNkZWZpbmUgQ0VfSE9TVF9CUklER0VfVkVORE9SX0lECTB4MTBhOQorI2RlZmluZSBDRV9IT1NUX0JSSURHRV9ERVZJQ0VfSUQJMHg0MDAzCisKKworI2RlZmluZSBUSU9DRV9OVU1fTTQwX0FURVMJCTQwOTYKKyNkZWZpbmUgVElPQ0VfTlVNX00zMjQwX0FURVMJCTIwNDgKKyNkZWZpbmUgVElPQ0VfTlVNX1BPUlRTCQkJMgorCisvKgorICogUmVnaXN0ZXIgbGF5b3V0IGZvciBUSU9DRS4gIE1NUiBvZmZzZXRzIGFyZSBzaG93biBhdCB0aGUgZmFyIHJpZ2h0IG9mIHRoZQorICogc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0IHRpb2NlIHsKKwkvKgorCSAqIEFETUlOIDogQWRtaW5pc3RyYXRpb24gUmVnaXN0ZXJzCisJICovCisJdWludDY0X3QJY2VfYWRtX2lkOwkJCQkvKiAweDAwMDAwMCAqLworCXVpbnQ2NF90CWNlX3BhZF8wMDAwMDg7CQkJCS8qIDB4MDAwMDA4ICovCisJdWludDY0X3QJY2VfYWRtX2R5bl9jcmVkaXRfc3RhdHVzOwkJLyogMHgwMDAwMTAgKi8KKwl1aW50NjRfdAljZV9hZG1fbGFzdF9jcmVkaXRfc3RhdHVzOwkJLyogMHgwMDAwMTggKi8KKwl1aW50NjRfdAljZV9hZG1fY3JlZGl0X2xpbWl0OwkJCS8qIDB4MDAwMDIwICovCisJdWludDY0X3QJY2VfYWRtX2ZvcmNlX2NyZWRpdDsJCQkvKiAweDAwMDAyOCAqLworCXVpbnQ2NF90CWNlX2FkbV9jb250cm9sOwkJCQkvKiAweDAwMDAzMCAqLworCXVpbnQ2NF90CWNlX2FkbV9tbXJfY2huX3RpbWVvdXQ7CQkJLyogMHgwMDAwMzggKi8KKwl1aW50NjRfdAljZV9hZG1fc3NwX3VyZV90aW1lb3V0OwkJCS8qIDB4MDAwMDQwICovCisJdWludDY0X3QJY2VfYWRtX3NzcF9kcmVfdGltZW91dDsJCQkvKiAweDAwMDA0OCAqLworCXVpbnQ2NF90CWNlX2FkbV9zc3BfZGVidWdfc2VsOwkJCS8qIDB4MDAwMDUwICovCisJdWludDY0X3QJY2VfYWRtX2ludF9zdGF0dXM7CQkJLyogMHgwMDAwNTggKi8KKwl1aW50NjRfdAljZV9hZG1faW50X3N0YXR1c19hbGlhczsJCS8qIDB4MDAwMDYwICovCisJdWludDY0X3QJY2VfYWRtX2ludF9tYXNrOwkJCS8qIDB4MDAwMDY4ICovCisJdWludDY0X3QJY2VfYWRtX2ludF9wZW5kaW5nOwkJCS8qIDB4MDAwMDcwICovCisJdWludDY0X3QJY2VfYWRtX2ZvcmNlX2ludDsJCQkvKiAweDAwMDA3OCAqLworCXVpbnQ2NF90CWNlX2FkbV91cmVfdXBzX2J1Zl9iYXJyaWVyX2ZsdXNoOwkvKiAweDAwMDA4MCAqLworCXVpbnQ2NF90CWNlX2FkbV9pbnRfZGVzdFsxNV07CSAgICAvKiAweDAwMDA4OCAtLSAweDAwMDBGOCAqLworCXVpbnQ2NF90CWNlX2FkbV9lcnJvcl9zdW1tYXJ5OwkJCS8qIDB4MDAwMTAwICovCisJdWludDY0X3QJY2VfYWRtX2Vycm9yX3N1bW1hcnlfYWxpYXM7CQkvKiAweDAwMDEwOCAqLworCXVpbnQ2NF90CWNlX2FkbV9lcnJvcl9tYXNrOwkJCS8qIDB4MDAwMTEwICovCisJdWludDY0X3QJY2VfYWRtX2ZpcnN0X2Vycm9yOwkJCS8qIDB4MDAwMTE4ICovCisJdWludDY0X3QJY2VfYWRtX2Vycm9yX292ZXJmbG93OwkJCS8qIDB4MDAwMTIwICovCisJdWludDY0X3QJY2VfYWRtX2Vycm9yX292ZXJmbG93X2FsaWFzOwkJLyogMHgwMDAxMjggKi8KKwl1aW50NjRfdAljZV9wYWRfMDAwMTMwWzJdOwkgICAgLyogMHgwMDAxMzAgLS0gMHgwMDAxMzggKi8KKwl1aW50NjRfdAljZV9hZG1fdG51bV9lcnJvcjsJCQkvKiAweDAwMDE0MCAqLworCXVpbnQ2NF90CWNlX2FkbV9tbXJfZXJyX2RldGFpbDsJCQkvKiAweDAwMDE0OCAqLworCXVpbnQ2NF90CWNlX2FkbV9tc2dfc3JhbV9wZXJyX2RldGFpbDsJCS8qIDB4MDAwMTUwICovCisJdWludDY0X3QJY2VfYWRtX2JhcF9zcmFtX3BlcnJfZGV0YWlsOwkJLyogMHgwMDAxNTggKi8KKwl1aW50NjRfdAljZV9hZG1fY2Vfc3JhbV9wZXJyX2RldGFpbDsJCS8qIDB4MDAwMTYwICovCisJdWludDY0X3QJY2VfYWRtX2NlX2NyZWRpdF9vZmxvd19kZXRhaWw7CQkvKiAweDAwMDE2OCAqLworCXVpbnQ2NF90CWNlX2FkbV90eF9saW5rX2lkbGVfbWF4X3RpbWVyOwkJLyogMHgwMDAxNzAgKi8KKwl1aW50NjRfdAljZV9hZG1fcGNpZV9kZWJ1Z19zZWw7CQkJLyogMHgwMDAxNzggKi8KKwl1aW50NjRfdAljZV9wYWRfMDAwMTgwWzE2XTsJICAgIC8qIDB4MDAwMTgwIC0tIDB4MDAwMUY4ICovCisKKwl1aW50NjRfdAljZV9hZG1fcGNpZV9kZWJ1Z19zZWxfdG9wOwkJLyogMHgwMDAyMDAgKi8KKwl1aW50NjRfdAljZV9hZG1fcGNpZV9kZWJ1Z19sYXRfc2VsX2xvX3RvcDsJLyogMHgwMDAyMDggKi8KKwl1aW50NjRfdAljZV9hZG1fcGNpZV9kZWJ1Z19sYXRfc2VsX2hpX3RvcDsJLyogMHgwMDAyMTAgKi8KKwl1aW50NjRfdAljZV9hZG1fcGNpZV9kZWJ1Z190cmlnX3NlbF90b3A7CQkvKiAweDAwMDIxOCAqLworCXVpbnQ2NF90CWNlX2FkbV9wY2llX2RlYnVnX3RyaWdfbGF0X3NlbF9sb190b3A7CS8qIDB4MDAwMjIwICovCisJdWludDY0X3QJY2VfYWRtX3BjaWVfZGVidWdfdHJpZ19sYXRfc2VsX2hpX3RvcDsJLyogMHgwMDAyMjggKi8KKwl1aW50NjRfdAljZV9hZG1fcGNpZV90cmlnX2NvbXBhcmVfdG9wOwkJLyogMHgwMDAyMzAgKi8KKwl1aW50NjRfdAljZV9hZG1fcGNpZV90cmlnX2NvbXBhcmVfZW5fdG9wOwkvKiAweDAwMDIzOCAqLworCXVpbnQ2NF90CWNlX2FkbV9zc3BfZGVidWdfc2VsX3RvcDsJCS8qIDB4MDAwMjQwICovCisJdWludDY0X3QJY2VfYWRtX3NzcF9kZWJ1Z19sYXRfc2VsX2xvX3RvcDsJLyogMHgwMDAyNDggKi8KKwl1aW50NjRfdAljZV9hZG1fc3NwX2RlYnVnX2xhdF9zZWxfaGlfdG9wOwkvKiAweDAwMDI1MCAqLworCXVpbnQ2NF90CWNlX2FkbV9zc3BfZGVidWdfdHJpZ19zZWxfdG9wOwkJLyogMHgwMDAyNTggKi8KKwl1aW50NjRfdAljZV9hZG1fc3NwX2RlYnVnX3RyaWdfbGF0X3NlbF9sb190b3A7CS8qIDB4MDAwMjYwICovCisJdWludDY0X3QJY2VfYWRtX3NzcF9kZWJ1Z190cmlnX2xhdF9zZWxfaGlfdG9wOwkvKiAweDAwMDI2OCAqLworCXVpbnQ2NF90CWNlX2FkbV9zc3BfdHJpZ19jb21wYXJlX3RvcDsJCS8qIDB4MDAwMjcwICovCisJdWludDY0X3QJY2VfYWRtX3NzcF90cmlnX2NvbXBhcmVfZW5fdG9wOwkJLyogMHgwMDAyNzggKi8KKwl1aW50NjRfdAljZV9wYWRfMDAwMjgwWzQ4XTsJICAgIC8qIDB4MDAwMjgwIC0tIDB4MDAwM0Y4ICovCisKKwl1aW50NjRfdAljZV9hZG1fYmFwX2N0cmw7CQkJLyogMHgwMDA0MDAgKi8KKwl1aW50NjRfdAljZV9wYWRfMDAwNDA4WzEyN107CSAgICAvKiAweDAwMDQwOCAtLSAweDAwMDdGOCAqLworCisJdWludDY0X3QJY2VfbXNnX2J1Zl9kYXRhNjNfMFszNV07ICAgIC8qIDB4MDAwODAwIC0tIDB4MDAwOTE4ICovCisJdWludDY0X3QJY2VfcGFkXzAwMDkyMFsyOV07CSAgICAvKiAweDAwMDkyMCAtLSAweDAwMDlGOCAqLworCisJdWludDY0X3QJY2VfbXNnX2J1Zl9kYXRhMTI3XzY0WzM1XTsgIC8qIDB4MDAwQTAwIC0tIDB4MDAwQjE4ICovCisJdWludDY0X3QJY2VfcGFkXzAwMEIyMFsyOV07CSAgICAvKiAweDAwMEIyMCAtLSAweDAwMEJGOCAqLworCisJdWludDY0X3QJY2VfbXNnX2J1Zl9wYXJpdHlbMzVdOwkgICAgLyogMHgwMDBDMDAgLS0gMHgwMDBEMTggKi8KKwl1aW50NjRfdAljZV9wYWRfMDAwRDIwWzI5XTsJICAgIC8qIDB4MDAwRDIwIC0tIDB4MDAwREY4ICovCisKKwl1aW50NjRfdAljZV9wYWRfMDAwRTAwWzU3Nl07CSAgICAvKiAweDAwMEUwMCAtLSAweDAwMUZGOCAqLworCisJLyoKKwkgKiBMU0kgOiBMU0kncyBQQ0kgRXhwcmVzcyBMaW5rIFJlZ2lzdGVycyAoTGluayMxIGFuZCBMaW5rIzIpCisJICogTGluayMxIE1NUnMgYXQgc3RhcnQgYXQgMHgwMDIwMDAsIExpbmsjMiBNTVJzIGF0IDB4MDAzMDAwCisJICogTk9URTogdGhlIGNvbW1lbnQgb2Zmc2V0cyBhdCBmYXIgcmlnaHQ6IGxldCAneicgPSB7MiBvciAzfQorCSAqLworCSNkZWZpbmUgY2VfbHNpKGxpbmtfbnVtKQljZV9sc2lbbGlua19udW0tMV0KKwlzdHJ1Y3QgY2VfbHNpX3JlZyB7CisJCXVpbnQ2NF90CWNlX2xzaV9scHVfaWQ7CQkJLyogMHgwMHowMDAgKi8KKwkJdWludDY0X3QJY2VfbHNpX3JzdDsJCQkvKiAweDAwejAwOCAqLworCQl1aW50NjRfdAljZV9sc2lfZGJnX3N0YXQ7CQkvKiAweDAwejAxMCAqLworCQl1aW50NjRfdAljZV9sc2lfZGJnX2NmZzsJCQkvKiAweDAwejAxOCAqLworCQl1aW50NjRfdAljZV9sc2lfbHRzc21fY3RybDsJCS8qIDB4MDB6MDIwICovCisJCXVpbnQ2NF90CWNlX2xzaV9sa19zdGF0OwkJCS8qIDB4MDB6MDI4ICovCisJCXVpbnQ2NF90CWNlX3BhZF8wMHowMzBbMl07ICAgLyogMHgwMHowMzAgLS0gMHgwMHowMzggKi8KKwkJdWludDY0X3QJY2VfbHNpX2ludF9hbmRfc3RhdDsJCS8qIDB4MDB6MDQwICovCisJCXVpbnQ2NF90CWNlX2xzaV9pbnRfbWFzazsJCS8qIDB4MDB6MDQ4ICovCisJCXVpbnQ2NF90CWNlX3BhZF8wMHowNTBbMjJdOyAgLyogMHgwMHowNTAgLS0gMHgwMHowRjggKi8KKwkJdWludDY0X3QJY2VfbHNpX2xrX3BlcmZfY250X3NlbDsJCS8qIDB4MDB6MTAwICovCisJCXVpbnQ2NF90CWNlX3BhZF8wMHoxMDg7CQkJLyogMHgwMHoxMDggKi8KKwkJdWludDY0X3QJY2VfbHNpX2xrX3BlcmZfY250X2N0cmw7CS8qIDB4MDB6MTEwICovCisJCXVpbnQ2NF90CWNlX3BhZF8wMHoxMTg7CQkJLyogMHgwMHoxMTggKi8KKwkJdWludDY0X3QJY2VfbHNpX2xrX3BlcmZfY250MTsJCS8qIDB4MDB6MTIwICovCisJCXVpbnQ2NF90CWNlX2xzaV9sa19wZXJmX2NudDFfdGVzdDsJLyogMHgwMHoxMjggKi8KKwkJdWludDY0X3QJY2VfbHNpX2xrX3BlcmZfY250MjsJCS8qIDB4MDB6MTMwICovCisJCXVpbnQ2NF90CWNlX2xzaV9sa19wZXJmX2NudDJfdGVzdDsJLyogMHgwMHoxMzggKi8KKwkJdWludDY0X3QJY2VfcGFkXzAwejE0MFsyNF07ICAvKiAweDAwejE0MCAtLSAweDAwejFGOCAqLworCQl1aW50NjRfdAljZV9sc2lfbGtfbHlyX2NmZzsJCS8qIDB4MDB6MjAwICovCisJCXVpbnQ2NF90CWNlX2xzaV9sa19seXJfc3RhdHVzOwkJLyogMHgwMHoyMDggKi8KKwkJdWludDY0X3QJY2VfbHNpX2xrX2x5cl9pbnRfc3RhdDsJCS8qIDB4MDB6MjEwICovCisJCXVpbnQ2NF90CWNlX2xzaV9sa19seV9pbnRfc3RhdF90ZXN0OwkvKiAweDAwejIxOCAqLworCQl1aW50NjRfdAljZV9sc2lfbGtfbHlfaW50X3N0YXRfbWFzazsJLyogMHgwMHoyMjAgKi8KKwkJdWludDY0X3QJY2VfcGFkXzAwejIyOFszXTsgICAvKiAweDAwejIyOCAtLSAweDAwejIzOCAqLworCQl1aW50NjRfdAljZV9sc2lfZmNfdXBkX2N0bDsJCS8qIDB4MDB6MjQwICovCisJCXVpbnQ2NF90CWNlX3BhZF8wMHoyNDhbM107ICAgLyogMHgwMHoyNDggLS0gMHgwMHoyNTggKi8KKwkJdWludDY0X3QJY2VfbHNpX2Zsd19jdGxfdXBkX3RvX3RpbWVyOwkvKiAweDAwejI2MCAqLworCQl1aW50NjRfdAljZV9sc2lfZmx3X2N0bF91cGRfdGltZXIwOwkvKiAweDAwejI2OCAqLworCQl1aW50NjRfdAljZV9sc2lfZmx3X2N0bF91cGRfdGltZXIxOwkvKiAweDAwejI3MCAqLworCQl1aW50NjRfdAljZV9wYWRfMDB6Mjc4WzQ5XTsgIC8qIDB4MDB6Mjc4IC0tIDB4MDB6M0Y4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9mcmVxX25ha19sYXRfdGhyc2g7CS8qIDB4MDB6NDAwICovCisJCXVpbnQ2NF90CWNlX2xzaV9hY2tfbmFrX2xhdF90bXI7CQkvKiAweDAwejQwOCAqLworCQl1aW50NjRfdAljZV9sc2lfcnBseV90bXJfdGhyOwkJLyogMHgwMHo0MTAgKi8KKwkJdWludDY0X3QJY2VfbHNpX3JwbHlfdG1yOwkJLyogMHgwMHo0MTggKi8KKwkJdWludDY0X3QJY2VfbHNpX3JwbHlfbnVtX3N0YXQ7CQkvKiAweDAwejQyMCAqLworCQl1aW50NjRfdAljZV9sc2lfcnR5X2J1Zl9tYXhfYWRkcjsJLyogMHgwMHo0MjggKi8KKwkJdWludDY0X3QJY2VfbHNpX3J0eV9maWZvX3B0cjsJCS8qIDB4MDB6NDMwICovCisJCXVpbnQ2NF90CWNlX2xzaV9ydHlfZmlmb19yZF93cl9wdHI7CS8qIDB4MDB6NDM4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9ydHlfZmlmb19jcmVkOwkJLyogMHgwMHo0NDAgKi8KKwkJdWludDY0X3QJY2VfbHNpX3NlcV9jbnQ7CQkJLyogMHgwMHo0NDggKi8KKwkJdWludDY0X3QJY2VfbHNpX2Fja19zZW50X3NlcV9udW07CS8qIDB4MDB6NDUwICovCisJCXVpbnQ2NF90CWNlX2xzaV9zZXFfY250X2ZpZm9fbWF4X2FkZHI7CS8qIDB4MDB6NDU4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9zZXFfY250X2ZpZm9fcHRyOwkvKiAweDAwejQ2MCAqLworCQl1aW50NjRfdAljZV9sc2lfc2VxX2NudF9yZF93cl9wdHI7CS8qIDB4MDB6NDY4ICovCisJCXVpbnQ2NF90CWNlX2xzaV90eF9sa190c19jdGw7CQkvKiAweDAwejQ3MCAqLworCQl1aW50NjRfdAljZV9wYWRfMDB6NDc4OwkJCS8qIDB4MDB6NDc4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9tZW1fYWRkcl9jdGw7CQkvKiAweDAwejQ4MCAqLworCQl1aW50NjRfdAljZV9sc2lfbWVtX2RfbGQwOwkJLyogMHgwMHo0ODggKi8KKwkJdWludDY0X3QJY2VfbHNpX21lbV9kX2xkMTsJCS8qIDB4MDB6NDkwICovCisJCXVpbnQ2NF90CWNlX2xzaV9tZW1fZF9sZDI7CQkvKiAweDAwejQ5OCAqLworCQl1aW50NjRfdAljZV9sc2lfbWVtX2RfbGQzOwkJLyogMHgwMHo0QTAgKi8KKwkJdWludDY0X3QJY2VfbHNpX21lbV9kX2xkNDsJCS8qIDB4MDB6NEE4ICovCisJCXVpbnQ2NF90CWNlX3BhZF8wMHo0QjBbMl07ICAgLyogMHgwMHo0QjAgLS0gMHgwMHo0QjggKi8KKwkJdWludDY0X3QJY2VfbHNpX3J0eV9kX2NudDsJCS8qIDB4MDB6NEMwICovCisJCXVpbnQ2NF90CWNlX2xzaV9zZXFfYnVmX2NudDsJCS8qIDB4MDB6NEM4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9zZXFfYnVmX2J0X2Q7CQkvKiAweDAwejREMCAqLworCQl1aW50NjRfdAljZV9wYWRfMDB6NEQ4OwkJCS8qIDB4MDB6NEQ4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9hY2tfbGF0X3RocjsJCS8qIDB4MDB6NEUwICovCisJCXVpbnQ2NF90CWNlX3BhZF8wMHo0RThbM107ICAgLyogMHgwMHo0RTggLS0gMHgwMHo0RjggKi8KKwkJdWludDY0X3QJY2VfbHNpX254dF9yY3Zfc2VxXzFfY250cjsJLyogMHgwMHo1MDAgKi8KKwkJdWludDY0X3QJY2VfbHNpX3Vuc3BfZGxscF9yY3ZkOwkJLyogMHgwMHo1MDggKi8KKwkJdWludDY0X3QJY2VfbHNpX3Jjdl9sa190c19jdGw7CQkvKiAweDAwejUxMCAqLworCQl1aW50NjRfdAljZV9wYWRfMDB6NTE4WzI5XTsgIC8qIDB4MDB6NTE4IC0tIDB4MDB6NUY4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9waHlfbHlyX2NmZzsJCS8qIDB4MDB6NjAwICovCisJCXVpbnQ2NF90CWNlX3BhZF8wMHo2MDg7CQkJLyogMHgwMHo2MDggKi8KKwkJdWludDY0X3QJY2VfbHNpX3BoeV9seXJfaW50X3N0YXQ7CS8qIDB4MDB6NjEwICovCisJCXVpbnQ2NF90CWNlX2xzaV9waHlfbHlyX2ludF9zdGF0X3Rlc3Q7CS8qIDB4MDB6NjE4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9waHlfbHlyX2ludF9tYXNrOwkvKiAweDAwejYyMCAqLworCQl1aW50NjRfdAljZV9wYWRfMDB6NjI4WzExXTsgIC8qIDB4MDB6NjI4IC0tIDB4MDB6Njc4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9yY3ZfcGh5X2NmZzsJCS8qIDB4MDB6NjgwICovCisJCXVpbnQ2NF90CWNlX2xzaV9yY3ZfcGh5X3N0YXQxOwkJLyogMHgwMHo2ODggKi8KKwkJdWludDY0X3QJY2VfbHNpX3Jjdl9waHlfc3RhdDI7CQkvKiAweDAwejY5MCAqLworCQl1aW50NjRfdAljZV9sc2lfcmN2X3BoeV9zdGF0MzsJCS8qIDB4MDB6Njk4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9yY3ZfcGh5X2ludF9zdGF0OwkvKiAweDAwejZBMCAqLworCQl1aW50NjRfdAljZV9sc2lfcmN2X3BoeV9pbnRfc3RhdF90ZXN0OwkvKiAweDAwejZBOCAqLworCQl1aW50NjRfdAljZV9sc2lfcmN2X3BoeV9pbnRfbWFzazsJLyogMHgwMHo2QjAgKi8KKwkJdWludDY0X3QJY2VfcGFkXzAwejZCOFs5XTsgICAvKiAweDAwejZCOCAtLSAweDAwejZGOCAqLworCQl1aW50NjRfdAljZV9sc2lfdHhfcGh5X2NmZzsJCS8qIDB4MDB6NzAwICovCisJCXVpbnQ2NF90CWNlX2xzaV90eF9waHlfc3RhdDsJCS8qIDB4MDB6NzA4ICovCisJCXVpbnQ2NF90CWNlX2xzaV90eF9waHlfaW50X3N0YXQ7CQkvKiAweDAwejcxMCAqLworCQl1aW50NjRfdAljZV9sc2lfdHhfcGh5X2ludF9zdGF0X3Rlc3Q7CS8qIDB4MDB6NzE4ICovCisJCXVpbnQ2NF90CWNlX2xzaV90eF9waHlfaW50X21hc2s7CQkvKiAweDAwejcyMCAqLworCQl1aW50NjRfdAljZV9sc2lfdHhfcGh5X3N0YXQyOwkJLyogMHgwMHo3MjggKi8KKwkJdWludDY0X3QJY2VfcGFkXzAwejczMFsxMF07ICAvKiAweDAwejczMCAtLSAweDAwejc3RiAqLworCQl1aW50NjRfdAljZV9sc2lfbHRzc21fY2ZnMTsJCS8qIDB4MDB6NzgwICovCisJCXVpbnQ2NF90CWNlX2xzaV9sdHNzbV9jZmcyOwkJLyogMHgwMHo3ODggKi8KKwkJdWludDY0X3QJY2VfbHNpX2x0c3NtX2NmZzM7CQkvKiAweDAwejc5MCAqLworCQl1aW50NjRfdAljZV9sc2lfbHRzc21fY2ZnNDsJCS8qIDB4MDB6Nzk4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9sdHNzbV9jZmc1OwkJLyogMHgwMHo3QTAgKi8KKwkJdWludDY0X3QJY2VfbHNpX2x0c3NtX3N0YXQxOwkJLyogMHgwMHo3QTggKi8KKwkJdWludDY0X3QJY2VfbHNpX2x0c3NtX3N0YXQyOwkJLyogMHgwMHo3QjAgKi8KKwkJdWludDY0X3QJY2VfbHNpX2x0c3NtX2ludF9zdGF0OwkJLyogMHgwMHo3QjggKi8KKwkJdWludDY0X3QJY2VfbHNpX2x0c3NtX2ludF9zdGF0X3Rlc3Q7CS8qIDB4MDB6N0MwICovCisJCXVpbnQ2NF90CWNlX2xzaV9sdHNzbV9pbnRfbWFzazsJCS8qIDB4MDB6N0M4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9sdHNzbV9zdGF0X3dyX2VuOwkvKiAweDAwejdEMCAqLworCQl1aW50NjRfdAljZV9wYWRfMDB6N0Q4WzVdOyAgIC8qIDB4MDB6N0Q4IC0tIDB4MDB6N0Y4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9nYl9jZmcxOwkJCS8qIDB4MDB6ODAwICovCisJCXVpbnQ2NF90CWNlX2xzaV9nYl9jZmcyOwkJCS8qIDB4MDB6ODA4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9nYl9jZmczOwkJCS8qIDB4MDB6ODEwICovCisJCXVpbnQ2NF90CWNlX2xzaV9nYl9jZmc0OwkJCS8qIDB4MDB6ODE4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9nYl9zdGF0OwkJCS8qIDB4MDB6ODIwICovCisJCXVpbnQ2NF90CWNlX2xzaV9nYl9pbnRfc3RhdDsJCS8qIDB4MDB6ODI4ICovCisJCXVpbnQ2NF90CWNlX2xzaV9nYl9pbnRfc3RhdF90ZXN0OwkvKiAweDAwejgzMCAqLworCQl1aW50NjRfdAljZV9sc2lfZ2JfaW50X21hc2s7CQkvKiAweDAwejgzOCAqLworCQl1aW50NjRfdAljZV9sc2lfZ2JfcHdyX2RuMTsJCS8qIDB4MDB6ODQwICovCisJCXVpbnQ2NF90CWNlX2xzaV9nYl9wd3JfZG4yOwkJLyogMHgwMHo4NDggKi8KKwkJdWludDY0X3QJY2VfcGFkXzAwejg1MFsyNDZdOyAvKiAweDAwejg1MCAtLSAweDAwekZGOCAqLworCX0gY2VfbHNpWzJdOworCisJdWludDY0X3QJY2VfcGFkXzAwNDAwMFsxMF07CSAgICAvKiAweDAwNDAwMCAtLSAweDAwNDA0OCAqLworCisJLyoKKwkgKiBDUk06IENvcmV0YWxrIFJlY2VpdmUgTW9kdWxlIFJlZ2lzdGVycworCSAqLworCXVpbnQ2NF90CWNlX2NybV9kZWJ1Z19tdXg7CQkJLyogMHgwMDQwNTAgKi8KKwl1aW50NjRfdAljZV9wYWRfMDA0MDU4OwkJCQkvKiAweDAwNDA1OCAqLworCXVpbnQ2NF90CWNlX2NybV9zc3BfZXJyX2NtZF93cmQ7CQkJLyogMHgwMDQwNjAgKi8KKwl1aW50NjRfdAljZV9jcm1fc3NwX2Vycl9hZGRyOwkJCS8qIDB4MDA0MDY4ICovCisJdWludDY0X3QJY2VfY3JtX3NzcF9lcnJfc3luOwkJCS8qIDB4MDA0MDcwICovCisKKwl1aW50NjRfdAljZV9wYWRfMDA0MDc4WzQ5OV07CSAgICAvKiAweDAwNDA3OCAtLSAweDAwNTAwOCAqLworCisJLyoKKyAgICAgICAgICogQ1hNOiBDb3JldGFsayBYbWl0IE1vZHVsZSBSZWdpc3RlcnMKKyAgICAgICAgICovCisJdWludDY0X3QJY2VfY3htX2R5bl9jcmVkaXRfc3RhdHVzOwkJLyogMHgwMDUwMTAgKi8KKwl1aW50NjRfdAljZV9jeG1fbGFzdF9jcmVkaXRfc3RhdHVzOwkJLyogMHgwMDUwMTggKi8KKwl1aW50NjRfdAljZV9jeG1fY3JlZGl0X2xpbWl0OwkJCS8qIDB4MDA1MDIwICovCisJdWludDY0X3QJY2VfY3htX2ZvcmNlX2NyZWRpdDsJCQkvKiAweDAwNTAyOCAqLworCXVpbnQ2NF90CWNlX2N4bV9kaXNhYmxlX2J5cGFzczsJCQkvKiAweDAwNTAzMCAqLworCXVpbnQ2NF90CWNlX3BhZF8wMDUwMzhbM107CSAgICAvKiAweDAwNTAzOCAtLSAweDAwNTA0OCAqLworCXVpbnQ2NF90CWNlX2N4bV9kZWJ1Z19tdXg7CQkJLyogMHgwMDUwNTAgKi8KKworICAgICAgICB1aW50NjRfdCAgICAgICAgY2VfcGFkXzAwNTA1OFs1MDFdOyAgICAgICAgIC8qIDB4MDA1MDU4IC0tIDB4MDA1RkY4ICovCisKKwkvKgorCSAqIERUTDogRG93bnN0cmVhbSBUcmFuc2FjdGlvbiBMYXllciBSZWdzIChMaW5rIzEgYW5kIExpbmsjMikKKwkgKiBEVEw6IExpbmsjMSBNTVJzIGF0IHN0YXJ0IGF0IDB4MDA2MDAwLCBMaW5rIzIgTU1ScyBhdCAweDAwODAwMAorCSAqIERUTDogdGhlIGNvbW1lbnQgb2Zmc2V0cyBhdCBmYXIgcmlnaHQ6IGxldCAneScgPSB7NiBvciA4fQorCSAqCisJICogVVRMOiBEb3duc3RyZWFtIFRyYW5zYWN0aW9uIExheWVyIFJlZ3MgKExpbmsjMSBhbmQgTGluayMyKQorCSAqIFVUTDogTGluayMxIE1NUnMgYXQgc3RhcnQgYXQgMHgwMDcwMDAsIExpbmsjMiBNTVJzIGF0IDB4MDA5MDAwCisJICogVVRMOiB0aGUgY29tbWVudCBvZmZzZXRzIGF0IGZhciByaWdodDogbGV0ICd6JyA9IHs3IG9yIDl9CisJICovCisJI2RlZmluZSBjZV9kdGwobGlua19udW0pCWNlX2R0bF91dGxbbGlua19udW0tMV0KKwkjZGVmaW5lIGNlX3V0bChsaW5rX251bSkJY2VfZHRsX3V0bFtsaW5rX251bS0xXQorCXN0cnVjdCBjZV9kdGxfdXRsX3JlZyB7CisJCS8qIERUTCAqLworCQl1aW50NjRfdAljZV9kdGxfZHRkcl9jcmVkaXRfbGltaXQ7CS8qIDB4MDB5MDAwICovCisJCXVpbnQ2NF90CWNlX2R0bF9kdGRyX2NyZWRpdF9mb3JjZTsJLyogMHgwMHkwMDggKi8KKwkJdWludDY0X3QJY2VfZHRsX2R5bl9jcmVkaXRfc3RhdHVzOwkvKiAweDAweTAxMCAqLworCQl1aW50NjRfdAljZV9kdGxfZHRsX2xhc3RfY3JlZGl0X3N0YXQ7CS8qIDB4MDB5MDE4ICovCisJCXVpbnQ2NF90CWNlX2R0bF9kdGxfY3RybDsJCS8qIDB4MDB5MDIwICovCisJCXVpbnQ2NF90CWNlX3BhZF8wMHkwMjhbNV07ICAgLyogMHgwMHkwMjggLS0gMHgwMHkwNDggKi8KKwkJdWludDY0X3QJY2VfZHRsX2RlYnVnX3NlbDsJCS8qIDB4MDB5MDUwICovCisJCXVpbnQ2NF90CWNlX3BhZF8wMHkwNThbNTAxXTsgLyogMHgwMHkwNTggLS0gMHgwMHlGRjggKi8KKworCQkvKiBVVEwgKi8KKwkJdWludDY0X3QJY2VfdXRsX3V0bF9jdHJsOwkJLyogMHgwMHowMDAgKi8KKwkJdWludDY0X3QJY2VfdXRsX2RlYnVnX3NlbDsJCS8qIDB4MDB6MDA4ICovCisJCXVpbnQ2NF90CWNlX3BhZF8wMHowMTBbNTEwXTsgLyogMHgwMHowMTAgLS0gMHgwMHpGRjggKi8KKwl9IGNlX2R0bF91dGxbMl07CisKKwl1aW50NjRfdAljZV9wYWRfMDBBMDAwWzUxNF07CSAgICAvKiAweDAwQTAwMCAtLSAweDAwQjAwOCAqLworCisJLyoKKwkgKiBVUkU6IFVwc3RyZWFtIFJlcXVlc3QgRW5naW5lCisgICAgICAgICAqLworCXVpbnQ2NF90CWNlX3VyZV9keW5fY3JlZGl0X3N0YXR1czsJCS8qIDB4MDBCMDEwICovCisJdWludDY0X3QJY2VfdXJlX2xhc3RfY3JlZGl0X3N0YXR1czsJCS8qIDB4MDBCMDE4ICovCisJdWludDY0X3QJY2VfdXJlX2NyZWRpdF9saW1pdDsJCQkvKiAweDAwQjAyMCAqLworCXVpbnQ2NF90CWNlX3BhZF8wMEIwMjg7CQkJCS8qIDB4MDBCMDI4ICovCisJdWludDY0X3QJY2VfdXJlX2NvbnRyb2w7CQkJCS8qIDB4MDBCMDMwICovCisJdWludDY0X3QJY2VfdXJlX3N0YXR1czsJCQkJLyogMHgwMEIwMzggKi8KKwl1aW50NjRfdAljZV9wYWRfMDBCMDQwWzJdOwkgICAgLyogMHgwMEIwNDAgLS0gMHgwMEIwNDggKi8KKwl1aW50NjRfdAljZV91cmVfZGVidWdfc2VsOwkJCS8qIDB4MDBCMDUwICovCisJdWludDY0X3QJY2VfdXJlX3BjaWVfZGVidWdfc2VsOwkJCS8qIDB4MDBCMDU4ICovCisJdWludDY0X3QJY2VfdXJlX3NzcF9lcnJfY21kX3dyZDsJCQkvKiAweDAwQjA2MCAqLworCXVpbnQ2NF90CWNlX3VyZV9zc3BfZXJyX2FkZHI7CQkJLyogMHgwMEIwNjggKi8KKwl1aW50NjRfdAljZV91cmVfcGFnZV9tYXA7CQkJLyogMHgwMEIwNzAgKi8KKwl1aW50NjRfdAljZV91cmVfZGlyX21hcFtUSU9DRV9OVU1fUE9SVFNdOwkvKiAweDAwQjA3OCAqLworCXVpbnQ2NF90CWNlX3VyZV9waXBlX3NlbDE7CQkJLyogMHgwMEIwODggKi8KKwl1aW50NjRfdAljZV91cmVfcGlwZV9tYXNrMTsJCQkvKiAweDAwQjA5MCAqLworCXVpbnQ2NF90CWNlX3VyZV9waXBlX3NlbDI7CQkJLyogMHgwMEIwOTggKi8KKwl1aW50NjRfdAljZV91cmVfcGlwZV9tYXNrMjsJCQkvKiAweDAwQjBBMCAqLworCXVpbnQ2NF90CWNlX3VyZV9wY2llMV9jcmVkaXRzX3NlbnQ7CQkvKiAweDAwQjBBOCAqLworCXVpbnQ2NF90CWNlX3VyZV9wY2llMV9jcmVkaXRzX3VzZWQ7CQkvKiAweDAwQjBCMCAqLworCXVpbnQ2NF90CWNlX3VyZV9wY2llMV9jcmVkaXRfbGltaXQ7CQkvKiAweDAwQjBCOCAqLworCXVpbnQ2NF90CWNlX3VyZV9wY2llMl9jcmVkaXRzX3NlbnQ7CQkvKiAweDAwQjBDMCAqLworCXVpbnQ2NF90CWNlX3VyZV9wY2llMl9jcmVkaXRzX3VzZWQ7CQkvKiAweDAwQjBDOCAqLworCXVpbnQ2NF90CWNlX3VyZV9wY2llMl9jcmVkaXRfbGltaXQ7CQkvKiAweDAwQjBEMCAqLworCXVpbnQ2NF90CWNlX3VyZV9wY2llX2ZvcmNlX2NyZWRpdDsJCS8qIDB4MDBCMEQ4ICovCisJdWludDY0X3QJY2VfdXJlX3JkX3RudW1fdmFsOwkJCS8qIDB4MDBCMEUwICovCisJdWludDY0X3QJY2VfdXJlX3JkX3RudW1fcnNwX3JjdmQ7CQkvKiAweDAwQjBFOCAqLworCXVpbnQ2NF90CWNlX3VyZV9yZF90bnVtX2VzZW50X3RpbWVyOwkJLyogMHgwMEIwRjAgKi8KKwl1aW50NjRfdAljZV91cmVfcmRfdG51bV9lcnJvcjsJCQkvKiAweDAwQjBGOCAqLworCXVpbnQ2NF90CWNlX3VyZV9yZF90bnVtX2ZpcnN0X2NsOwkJLyogMHgwMEIxMDAgKi8KKwl1aW50NjRfdAljZV91cmVfcmRfdG51bV9saW5rX2J1ZjsJCS8qIDB4MDBCMTA4ICovCisJdWludDY0X3QJY2VfdXJlX3dyX3RudW1fdmFsOwkJCS8qIDB4MDBCMTEwICovCisJdWludDY0X3QJY2VfdXJlX3NyYW1fZXJyX2FkZHIwOwkJCS8qIDB4MDBCMTE4ICovCisJdWludDY0X3QJY2VfdXJlX3NyYW1fZXJyX2FkZHIxOwkJCS8qIDB4MDBCMTIwICovCisJdWludDY0X3QJY2VfdXJlX3NyYW1fZXJyX2FkZHIyOwkJCS8qIDB4MDBCMTI4ICovCisJdWludDY0X3QJY2VfdXJlX3NyYW1fcmRfYWRkcjA7CQkJLyogMHgwMEIxMzAgKi8KKwl1aW50NjRfdAljZV91cmVfc3JhbV9yZF9hZGRyMTsJCQkvKiAweDAwQjEzOCAqLworCXVpbnQ2NF90CWNlX3VyZV9zcmFtX3JkX2FkZHIyOwkJCS8qIDB4MDBCMTQwICovCisJdWludDY0X3QJY2VfdXJlX3NyYW1fd3JfYWRkcjA7CQkJLyogMHgwMEIxNDggKi8KKwl1aW50NjRfdAljZV91cmVfc3JhbV93cl9hZGRyMTsJCQkvKiAweDAwQjE1MCAqLworCXVpbnQ2NF90CWNlX3VyZV9zcmFtX3dyX2FkZHIyOwkJCS8qIDB4MDBCMTU4ICovCisJdWludDY0X3QJY2VfdXJlX2J1Zl9mbHVzaDEwOwkJCS8qIDB4MDBCMTYwICovCisJdWludDY0X3QJY2VfdXJlX2J1Zl9mbHVzaDExOwkJCS8qIDB4MDBCMTY4ICovCisJdWludDY0X3QJY2VfdXJlX2J1Zl9mbHVzaDEyOwkJCS8qIDB4MDBCMTcwICovCisJdWludDY0X3QJY2VfdXJlX2J1Zl9mbHVzaDEzOwkJCS8qIDB4MDBCMTc4ICovCisJdWludDY0X3QJY2VfdXJlX2J1Zl9mbHVzaDIwOwkJCS8qIDB4MDBCMTgwICovCisJdWludDY0X3QJY2VfdXJlX2J1Zl9mbHVzaDIxOwkJCS8qIDB4MDBCMTg4ICovCisJdWludDY0X3QJY2VfdXJlX2J1Zl9mbHVzaDIyOwkJCS8qIDB4MDBCMTkwICovCisJdWludDY0X3QJY2VfdXJlX2J1Zl9mbHVzaDIzOwkJCS8qIDB4MDBCMTk4ICovCisJdWludDY0X3QJY2VfdXJlX3BjaWVfY29udHJvbDE7CQkJLyogMHgwMEIxQTAgKi8KKwl1aW50NjRfdAljZV91cmVfcGNpZV9jb250cm9sMjsJCQkvKiAweDAwQjFBOCAqLworCisJdWludDY0X3QJY2VfcGFkXzAwQjFCMFs0NThdOwkgICAgLyogMHgwMEIxQjAgLS0gMHgwMEJGRjggKi8KKworCS8qIFVwc3RyZWFtIERhdGEgQnVmZmVyLCBQb3J0MSAqLworCXN0cnVjdCBjZV91cmVfbWFpbnRfdXBzX2RhdDFfZGF0YSB7CisJCXVpbnQ2NF90CWRhdGE2M18wWzUxMl07CSAgICAvKiAweDAwQzAwMCAtLSAweDAwQ0ZGOCAqLworCQl1aW50NjRfdAlkYXRhMTI3XzY0WzUxMl07ICAgIC8qIDB4MDBEMDAwIC0tIDB4MDBERkY4ICovCisJCXVpbnQ2NF90CXBhcml0eVs1MTJdOwkgICAgLyogMHgwMEUwMDAgLS0gMHgwMEVGRjggKi8KKwl9IGNlX3VyZV9tYWludF91cHNfZGF0MTsKKworCS8qIFVwc3RyZWFtIEhlYWRlciBCdWZmZXIsIFBvcnQxICovCisJc3RydWN0IGNlX3VyZV9tYWludF91cHNfaGRyMV9kYXRhIHsKKwkJdWludDY0X3QJZGF0YTYzXzBbNTEyXTsJICAgIC8qIDB4MDBGMDAwIC0tIDB4MDBGRkY4ICovCisJCXVpbnQ2NF90CWRhdGExMjdfNjRbNTEyXTsgICAgLyogMHgwMTAwMDAgLS0gMHgwMTBGRjggKi8KKwkJdWludDY0X3QJcGFyaXR5WzUxMl07CSAgICAvKiAweDAxMTAwMCAtLSAweDAxMUZGOCAqLworCX0gY2VfdXJlX21haW50X3Vwc19oZHIxOworCisJLyogVXBzdHJlYW0gRGF0YSBCdWZmZXIsIFBvcnQyICovCisJc3RydWN0IGNlX3VyZV9tYWludF91cHNfZGF0Ml9kYXRhIHsKKwkJdWludDY0X3QJZGF0YTYzXzBbNTEyXTsJICAgIC8qIDB4MDEyMDAwIC0tIDB4MDEyRkY4ICovCisJCXVpbnQ2NF90CWRhdGExMjdfNjRbNTEyXTsgICAgLyogMHgwMTMwMDAgLS0gMHgwMTNGRjggKi8KKwkJdWludDY0X3QJcGFyaXR5WzUxMl07CSAgICAvKiAweDAxNDAwMCAtLSAweDAxNEZGOCAqLworCX0gY2VfdXJlX21haW50X3Vwc19kYXQyOworCisJLyogVXBzdHJlYW0gSGVhZGVyIEJ1ZmZlciwgUG9ydDIgKi8KKwlzdHJ1Y3QgY2VfdXJlX21haW50X3Vwc19oZHIyX2RhdGEgeworCQl1aW50NjRfdAlkYXRhNjNfMFs1MTJdOwkgICAgLyogMHgwMTUwMDAgLS0gMHgwMTVGRjggKi8KKwkJdWludDY0X3QJZGF0YTEyN182NFs1MTJdOyAgICAvKiAweDAxNjAwMCAtLSAweDAxNkZGOCAqLworCQl1aW50NjRfdAlwYXJpdHlbNTEyXTsJICAgIC8qIDB4MDE3MDAwIC0tIDB4MDE3RkY4ICovCisJfSBjZV91cmVfbWFpbnRfdXBzX2hkcjI7CisKKwkvKiBEb3duc3RyZWFtIERhdGEgQnVmZmVyICovCisJc3RydWN0IGNlX3VyZV9tYWludF9kbnNfZGF0X2RhdGEgeworCQl1aW50NjRfdAlkYXRhNjNfMFs1MTJdOwkgICAgLyogMHgwMTgwMDAgLS0gMHgwMThGRjggKi8KKwkJdWludDY0X3QJZGF0YTEyN182NFs1MTJdOyAgICAvKiAweDAxOTAwMCAtLSAweDAxOUZGOCAqLworCQl1aW50NjRfdAlwYXJpdHlbNTEyXTsJICAgIC8qIDB4MDFBMDAwIC0tIDB4MDFBRkY4ICovCisJfSBjZV91cmVfbWFpbnRfZG5zX2RhdDsKKworCS8qIERvd25zdHJlYW0gSGVhZGVyIEJ1ZmZlciAqLworCXN0cnVjdAljZV91cmVfbWFpbnRfZG5zX2hkcl9kYXRhIHsKKwkJdWludDY0X3QJZGF0YTMxXzBbNjRdOwkgICAgLyogMHgwMUIwMDAgLS0gMHgwMUIxRjggKi8KKwkJdWludDY0X3QJZGF0YTk1XzMyWzY0XTsJICAgIC8qIDB4MDFCMjAwIC0tIDB4MDFCM0Y4ICovCisJCXVpbnQ2NF90CXBhcml0eVs2NF07CSAgICAvKiAweDAxQjQwMCAtLSAweDAxQjVGOCAqLworCX0gY2VfdXJlX21haW50X2Ruc19oZHI7CisKKwkvKiBSQ0kgQnVmZmVyIERhdGEgKi8KKwlzdHJ1Y3QJY2VfdXJlX21haW50X3JjaV9kYXRhIHsKKwkJdWludDY0X3QJZGF0YTQxXzBbNjRdOwkgICAgLyogMHgwMUI2MDAgLS0gMHgwMUI3RjggKi8KKwkJdWludDY0X3QJZGF0YTY5XzQyWzY0XTsJICAgIC8qIDB4MDFCODAwIC0tIDB4MDFCOUY4ICovCisJfSBjZV91cmVfbWFpbnRfcmNpOworCisJLyogUmVzcG9uc2UgUXVldWUgKi8KKwl1aW50NjRfdAljZV91cmVfbWFpbnRfcnNwcVs2NF07CSAgICAvKiAweDAxQkEwMCAtLSAweDAxQkJGOCAqLworCisJdWludDY0X3QJY2VfcGFkXzAxQzAwMFs0MjI0XTsJICAgIC8qIDB4MDFCQzAwIC0tIDB4MDIzRkY4ICovCisKKwkvKiBBZG1pbiBCdWlsZC1hLVBhY2tldCBCdWZmZXIgKi8KKwlzdHJ1Y3QJY2VfYWRtX21haW50X2JhcF9idWZfZGF0YSB7CisJCXVpbnQ2NF90CWRhdGE2M18wWzI1OF07CSAgICAvKiAweDAyNDAwMCAtLSAweDAyNDgwOCAqLworCQl1aW50NjRfdAlkYXRhMTI3XzY0WzI1OF07ICAgIC8qIDB4MDI0ODEwIC0tIDB4MDI1MDE4ICovCisJCXVpbnQ2NF90CXBhcml0eVsyNThdOwkgICAgLyogMHgwMjUwMjAgLS0gMHgwMjU4MjggKi8KKwl9IGNlX2FkbV9tYWludF9iYXBfYnVmOworCisJdWludDY0X3QJY2VfcGFkXzAyNTgzMFs1MzcwXTsJICAgIC8qIDB4MDI1ODMwIC0tIDB4MDJGRkY4ICovCisKKwkvKiBVUkU6IDQwYml0IFBNVSBBVEUgQnVmZmVyICovCQkgICAgLyogMHgwMzAwMDAgLS0gMHgwMzdGRjggKi8KKwl1aW50NjRfdAljZV91cmVfYXRlNDBbVElPQ0VfTlVNX000MF9BVEVTXTsKKworCS8qIFVSRTogMzIvNDBiaXQgUE1VIEFURSBCdWZmZXIgKi8JICAgIC8qIDB4MDM4MDAwIC0tIDB4MDNCRkY4ICovCisJdWludDY0X3QJY2VfdXJlX2F0ZTMyNDBbVElPQ0VfTlVNX00zMjQwX0FURVNdOworCisJdWludDY0X3QJY2VfcGFkXzAzQzAwMFsyMDUwXTsJICAgIC8qIDB4MDNDMDAwIC0tIDB4MDQwMDA4ICovCisKKwkvKgorCSAqIERSRTogRG93biBTdHJlYW0gUmVxdWVzdCBFbmdpbmUKKyAgICAgICAgICovCisJdWludDY0X3QJY2VfZHJlX2R5bl9jcmVkaXRfc3RhdHVzMTsJCS8qIDB4MDQwMDEwICovCisJdWludDY0X3QJY2VfZHJlX2R5bl9jcmVkaXRfc3RhdHVzMjsJCS8qIDB4MDQwMDE4ICovCisJdWludDY0X3QJY2VfZHJlX2xhc3RfY3JlZGl0X3N0YXR1czE7CQkvKiAweDA0MDAyMCAqLworCXVpbnQ2NF90CWNlX2RyZV9sYXN0X2NyZWRpdF9zdGF0dXMyOwkJLyogMHgwNDAwMjggKi8KKwl1aW50NjRfdAljZV9kcmVfY3JlZGl0X2xpbWl0MTsJCQkvKiAweDA0MDAzMCAqLworCXVpbnQ2NF90CWNlX2RyZV9jcmVkaXRfbGltaXQyOwkJCS8qIDB4MDQwMDM4ICovCisJdWludDY0X3QJY2VfZHJlX2ZvcmNlX2NyZWRpdDE7CQkJLyogMHgwNDAwNDAgKi8KKwl1aW50NjRfdAljZV9kcmVfZm9yY2VfY3JlZGl0MjsJCQkvKiAweDA0MDA0OCAqLworCXVpbnQ2NF90CWNlX2RyZV9kZWJ1Z19tdXgxOwkJCS8qIDB4MDQwMDUwICovCisJdWludDY0X3QJY2VfZHJlX2RlYnVnX211eDI7CQkJLyogMHgwNDAwNTggKi8KKwl1aW50NjRfdAljZV9kcmVfc3NwX2Vycl9jbWRfd3JkOwkJCS8qIDB4MDQwMDYwICovCisJdWludDY0X3QJY2VfZHJlX3NzcF9lcnJfYWRkcjsJCQkvKiAweDA0MDA2OCAqLworCXVpbnQ2NF90CWNlX2RyZV9jb21wX2Vycl9jbWRfd3JkOwkJLyogMHgwNDAwNzAgKi8KKwl1aW50NjRfdAljZV9kcmVfY29tcF9lcnJfYWRkcjsJCQkvKiAweDA0MDA3OCAqLworCXVpbnQ2NF90CWNlX2RyZV9yZXFfc3RhdHVzOwkJCS8qIDB4MDQwMDgwICovCisJdWludDY0X3QJY2VfZHJlX2NvbmZpZzE7CQkJCS8qIDB4MDQwMDg4ICovCisJdWludDY0X3QJY2VfZHJlX2NvbmZpZzI7CQkJCS8qIDB4MDQwMDkwICovCisJdWludDY0X3QJY2VfZHJlX2NvbmZpZ19yZXFfc3RhdHVzOwkJLyogMHgwNDAwOTggKi8KKwl1aW50NjRfdAljZV9wYWRfMDQwMEEwWzEyXTsJICAgIC8qIDB4MDQwMEEwIC0tIDB4MDQwMEY4ICovCisJdWludDY0X3QJY2VfZHJlX2R5bl9maWZvOwkJCS8qIDB4MDQwMTAwICovCisJdWludDY0X3QJY2VfcGFkXzA0MDEwOFszXTsJICAgIC8qIDB4MDQwMTA4IC0tIDB4MDQwMTE4ICovCisJdWludDY0X3QJY2VfZHJlX2xhc3RfZmlmbzsJCQkvKiAweDA0MDEyMCAqLworCisJdWludDY0X3QJY2VfcGFkXzA0MDEyOFsyN107CSAgICAvKiAweDA0MDEyOCAtLSAweDA0MDFGOCAqLworCisJLyogRFJFIERvd25zdHJlYW0gSGVhZCBRdWV1ZSAqLworCXN0cnVjdAljZV9kcmVfbWFpbnRfZHNfaGVhZF9xdWV1ZSB7CisJCXVpbnQ2NF90CWRhdGE2M18wWzMyXTsJICAgIC8qIDB4MDQwMjAwIC0tIDB4MDQwMkY4ICovCisJCXVpbnQ2NF90CWRhdGExMjdfNjRbMzJdOwkgICAgLyogMHgwNDAzMDAgLS0gMHgwNDAzRjggKi8KKwkJdWludDY0X3QJcGFyaXR5WzMyXTsJICAgIC8qIDB4MDQwNDAwIC0tIDB4MDQwNEY4ICovCisJfSBjZV9kcmVfbWFpbnRfZHNfaGVhZF9xOworCisJdWludDY0X3QJY2VfcGFkXzA0MDUwMFszNTJdOwkgICAgLyogMHgwNDA1MDAgLS0gMHgwNDBGRjggKi8KKworCS8qIERSRSBEb3duc3RyZWFtIERhdGEgUXVldWUgKi8KKwlzdHJ1Y3QJY2VfZHJlX21haW50X2RzX2RhdGFfcXVldWUgeworCQl1aW50NjRfdAlkYXRhNjNfMFsyNTZdOwkgICAgLyogMHgwNDEwMDAgLS0gMHgwNDE3RjggKi8KKwkJdWludDY0X3QJY2VfcGFkXzA0MTgwMFsyNTZdOyAvKiAweDA0MTgwMCAtLSAweDA0MUZGOCAqLworCQl1aW50NjRfdAlkYXRhMTI3XzY0WzI1Nl07ICAgIC8qIDB4MDQyMDAwIC0tIDB4MDQyN0Y4ICovCisJCXVpbnQ2NF90CWNlX3BhZF8wNDI4MDBbMjU2XTsgLyogMHgwNDI4MDAgLS0gMHgwNDJGRjggKi8KKwkJdWludDY0X3QJcGFyaXR5WzI1Nl07CSAgICAvKiAweDA0MzAwMCAtLSAweDA0MzdGOCAqLworCQl1aW50NjRfdAljZV9wYWRfMDQzODAwWzI1Nl07IC8qIDB4MDQzODAwIC0tIDB4MDQzRkY4ICovCisJfSBjZV9kcmVfbWFpbnRfZHNfZGF0YV9xOworCisJLyogRFJFIFVSRSBVcHN0cmVhbSBSZXNwb25zZSBRdWV1ZSAqLworCXN0cnVjdAljZV9kcmVfbWFpbnRfdXJlX3VzX3JzcF9xdWV1ZSB7CisJCXVpbnQ2NF90CWRhdGE2M18wWzhdOwkgICAgLyogMHgwNDQwMDAgLS0gMHgwNDQwMzggKi8KKwkJdWludDY0X3QJY2VfcGFkXzA0NDA0MFsyNF07ICAvKiAweDA0NDA0MCAtLSAweDA0NDBGOCAqLworCQl1aW50NjRfdAlkYXRhMTI3XzY0WzhdOyAgICAgIC8qIDB4MDQ0MTAwIC0tIDB4MDQ0MTM4ICovCisJCXVpbnQ2NF90CWNlX3BhZF8wNDQxNDBbMjRdOyAgLyogMHgwNDQxNDAgLS0gMHgwNDQxRjggKi8KKwkJdWludDY0X3QJcGFyaXR5WzhdOwkgICAgLyogMHgwNDQyMDAgLS0gMHgwNDQyMzggKi8KKwkJdWludDY0X3QJY2VfcGFkXzA0NDI0MFsyNF07ICAvKiAweDA0NDI0MCAtLSAweDA0NDJGOCAqLworCX0gY2VfZHJlX21haW50X3VyZV91c19yc3BfcTsKKworCXVpbnQ2NF90IAljZV9kcmVfbWFpbnRfdXNfd3J0X3JzcFszMl07LyogMHgwNDQzMDAgLS0gMHgwNDQzRjggKi8KKworCXVpbnQ2NF90CWNlX2VuZF9vZl9zdHJ1Y3Q7CQkJLyogMHgwNDQ0MDAgKi8KK30gdGlvY2VfdDsKKworCisvKiBjZV9hZG1faW50X21hc2svY2VfYWRtX2ludF9zdGF0dXMgcmVnaXN0ZXIgYml0IGRlZmluZXMgKi8KKyNkZWZpbmUgQ0VfQURNX0lOVF9DRV9FUlJPUl9TSEZUCQkwCisjZGVmaW5lIENFX0FETV9JTlRfTFNJMV9JUF9FUlJPUl9TSEZUCQkxCisjZGVmaW5lIENFX0FETV9JTlRfTFNJMl9JUF9FUlJPUl9TSEZUCQkyCisjZGVmaW5lIENFX0FETV9JTlRfUENJRV9FUlJPUl9TSEZUCQkzCisjZGVmaW5lIENFX0FETV9JTlRfUE9SVDFfSE9UUExVR19FVkVOVF9TSEZUCTQKKyNkZWZpbmUgQ0VfQURNX0lOVF9QT1JUMl9IT1RQTFVHX0VWRU5UX1NIRlQJNQorI2RlZmluZSBDRV9BRE1fSU5UX1BDSUVfUE9SVDFfREVWX0FfU0hGVAk2CisjZGVmaW5lIENFX0FETV9JTlRfUENJRV9QT1JUMV9ERVZfQl9TSEZUCTcKKyNkZWZpbmUgQ0VfQURNX0lOVF9QQ0lFX1BPUlQxX0RFVl9DX1NIRlQJOAorI2RlZmluZSBDRV9BRE1fSU5UX1BDSUVfUE9SVDFfREVWX0RfU0hGVAk5CisjZGVmaW5lIENFX0FETV9JTlRfUENJRV9QT1JUMl9ERVZfQV9TSEZUCTEwCisjZGVmaW5lIENFX0FETV9JTlRfUENJRV9QT1JUMl9ERVZfQl9TSEZUCTExCisjZGVmaW5lIENFX0FETV9JTlRfUENJRV9QT1JUMl9ERVZfQ19TSEZUCTEyCisjZGVmaW5lIENFX0FETV9JTlRfUENJRV9QT1JUMl9ERVZfRF9TSEZUCTEzCisjZGVmaW5lIENFX0FETV9JTlRfUENJRV9NU0dfU0hGVAkJMTQgLypzZWUgaW50X2Rlc3RfMTQqLworI2RlZmluZSBDRV9BRE1fSU5UX1BDSUVfTVNHX1NMT1RfMF9TSEZUCQkxNAorI2RlZmluZSBDRV9BRE1fSU5UX1BDSUVfTVNHX1NMT1RfMV9TSEZUCQkxNQorI2RlZmluZSBDRV9BRE1fSU5UX1BDSUVfTVNHX1NMT1RfMl9TSEZUCQkxNgorI2RlZmluZSBDRV9BRE1fSU5UX1BDSUVfTVNHX1NMT1RfM19TSEZUCQkxNworI2RlZmluZSBDRV9BRE1fSU5UX1BPUlQxX1BNX1BNRV9NU0dfU0hGVAkyMgorI2RlZmluZSBDRV9BRE1fSU5UX1BPUlQyX1BNX1BNRV9NU0dfU0hGVAkyMworCisvKiBjZV9hZG1fZm9yY2VfaW50IHJlZ2lzdGVyIGJpdCBkZWZpbmVzICovCisjZGVmaW5lIENFX0FETV9GT1JDRV9JTlRfUENJRV9QT1JUMV9ERVZfQV9TSEZUCTAKKyNkZWZpbmUgQ0VfQURNX0ZPUkNFX0lOVF9QQ0lFX1BPUlQxX0RFVl9CX1NIRlQJMQorI2RlZmluZSBDRV9BRE1fRk9SQ0VfSU5UX1BDSUVfUE9SVDFfREVWX0NfU0hGVAkyCisjZGVmaW5lIENFX0FETV9GT1JDRV9JTlRfUENJRV9QT1JUMV9ERVZfRF9TSEZUCTMKKyNkZWZpbmUgQ0VfQURNX0ZPUkNFX0lOVF9QQ0lFX1BPUlQyX0RFVl9BX1NIRlQJNAorI2RlZmluZSBDRV9BRE1fRk9SQ0VfSU5UX1BDSUVfUE9SVDJfREVWX0JfU0hGVAk1CisjZGVmaW5lIENFX0FETV9GT1JDRV9JTlRfUENJRV9QT1JUMl9ERVZfQ19TSEZUCTYKKyNkZWZpbmUgQ0VfQURNX0ZPUkNFX0lOVF9QQ0lFX1BPUlQyX0RFVl9EX1NIRlQJNworI2RlZmluZSBDRV9BRE1fRk9SQ0VfSU5UX0FMV0FZU19TSEZUCQk4CisKKy8qIGNlX2FkbV9pbnRfZGVzdCByZWdpc3RlciBiaXQgbWFza3MgJiBzaGlmdHMgKi8KKyNkZWZpbmUgSU5UUl9WRUNUT1JfU0hGVAkJCTU2CisKKy8qIGNlX2FkbV9lcnJvcl9tYXNrIGFuZCBjZV9hZG1fZXJyb3Jfc3VtbWFyeSByZWdpc3RlciBiaXQgbWFza3MgKi8KKyNkZWZpbmUgQ0VfQURNX0VSUl9DUk1fU1NQX1JFUV9JTlZBTElECQkJKDB4MVVMTCA8PCAgMCkKKyNkZWZpbmUgQ0VfQURNX0VSUl9TU1BfUkVRX0hFQURFUgkJCSgweDFVTEwgPDwgIDEpCisjZGVmaW5lIENFX0FETV9FUlJfU1NQX1JTUF9IRUFERVIJCQkoMHgxVUxMIDw8ICAyKQorI2RlZmluZSBDRV9BRE1fRVJSX1NTUF9QUk9UT0NPTF9FUlJPUgkJCSgweDFVTEwgPDwgIDMpCisjZGVmaW5lIENFX0FETV9FUlJfU1NQX1NCRQkJCQkoMHgxVUxMIDw8ICA0KQorI2RlZmluZSBDRV9BRE1fRVJSX1NTUF9NQkUJCQkJKDB4MVVMTCA8PCAgNSkKKyNkZWZpbmUgQ0VfQURNX0VSUl9DWE1fQ1JFRElUX09GTE9XCQkJKDB4MVVMTCA8PCAgNikKKyNkZWZpbmUgQ0VfQURNX0VSUl9EUkVfU1NQX1JFUV9JTlZBTAkJCSgweDFVTEwgPDwgIDcpCisjZGVmaW5lIENFX0FETV9FUlJfU1NQX1JFUV9MT05HCQkJCSgweDFVTEwgPDwgIDgpCisjZGVmaW5lIENFX0FETV9FUlJfU1NQX1JFUV9PRkxPVwkJCSgweDFVTEwgPDwgIDkpCisjZGVmaW5lIENFX0FETV9FUlJfU1NQX1JFUV9TSE9SVAkJCSgweDFVTEwgPDwgMTApCisjZGVmaW5lIENFX0FETV9FUlJfU1NQX1JFUV9TSURFQkFORAkJCSgweDFVTEwgPDwgMTEpCisjZGVmaW5lIENFX0FETV9FUlJfU1NQX1JFUV9BRERSX0VSUgkJCSgweDFVTEwgPDwgMTIpCisjZGVmaW5lIENFX0FETV9FUlJfU1NQX1JFUV9CQURfQkUJCQkoMHgxVUxMIDw8IDEzKQorI2RlZmluZSBDRV9BRE1fRVJSX1BDSUVfQ09NUExfVElNRU9VVAkJCSgweDFVTEwgPDwgMTQpCisjZGVmaW5lIENFX0FETV9FUlJfUENJRV9VTkVYUF9DT01QTAkJCSgweDFVTEwgPDwgMTUpCisjZGVmaW5lIENFX0FETV9FUlJfUENJRV9FUlJfQ09NUEwJCQkoMHgxVUxMIDw8IDE2KQorI2RlZmluZSBDRV9BRE1fRVJSX0RSRV9DUkVESVRfT0ZMT1cJCQkoMHgxVUxMIDw8IDE3KQorI2RlZmluZSBDRV9BRE1fRVJSX0RSRV9TUkFNX1BFCQkJCSgweDFVTEwgPDwgMTgpCisjZGVmaW5lIENFX0FETV9FUlJfU1NQX1JTUF9JTlZBTElECQkJKDB4MVVMTCA8PCAxOSkKKyNkZWZpbmUgQ0VfQURNX0VSUl9TU1BfUlNQX0xPTkcJCQkJKDB4MVVMTCA8PCAyMCkKKyNkZWZpbmUgQ0VfQURNX0VSUl9TU1BfUlNQX1NIT1JUCQkJKDB4MVVMTCA8PCAyMSkKKyNkZWZpbmUgQ0VfQURNX0VSUl9TU1BfUlNQX1NJREVCQU5ECQkJKDB4MVVMTCA8PCAyMikKKyNkZWZpbmUgQ0VfQURNX0VSUl9VUkVfU1NQX1JTUF9VTkVYUAkJCSgweDFVTEwgPDwgMjMpCisjZGVmaW5lIENFX0FETV9FUlJfVVJFX1NTUF9XUl9SRVFfVElNRU9VVAkJKDB4MVVMTCA8PCAyNCkKKyNkZWZpbmUgQ0VfQURNX0VSUl9VUkVfU1NQX1JEX1JFUV9USU1FT1VUCQkoMHgxVUxMIDw8IDI1KQorI2RlZmluZSBDRV9BRE1fRVJSX1VSRV9BVEUzMjQwX1BBR0VfRkFVTFQJCSgweDFVTEwgPDwgMjYpCisjZGVmaW5lIENFX0FETV9FUlJfVVJFX0FURTQwX1BBR0VfRkFVTFQJCQkoMHgxVUxMIDw8IDI3KQorI2RlZmluZSBDRV9BRE1fRVJSX1VSRV9DUkVESVRfT0ZMT1cJCQkoMHgxVUxMIDw8IDI4KQorI2RlZmluZSBDRV9BRE1fRVJSX1VSRV9TUkFNX1BFCQkJCSgweDFVTEwgPDwgMjkpCisjZGVmaW5lIENFX0FETV9FUlJfQURNX1NTUF9SU1BfVU5FWFAJCQkoMHgxVUxMIDw8IDMwKQorI2RlZmluZSBDRV9BRE1fRVJSX0FETV9TU1BfUkVRX1RJTUVPVVQJCQkoMHgxVUxMIDw8IDMxKQorI2RlZmluZSBDRV9BRE1fRVJSX01NUl9BQ0NFU1NfRVJST1IJCQkoMHgxVUxMIDw8IDMyKQorI2RlZmluZSBDRV9BRE1fRVJSX01NUl9BRERSX0VSUk9SCQkJKDB4MVVMTCA8PCAzMykKKyNkZWZpbmUgQ0VfQURNX0VSUl9BRE1fQ1JFRElUX09GTE9XCQkJKDB4MVVMTCA8PCAzNCkKKyNkZWZpbmUgQ0VfQURNX0VSUl9BRE1fU1JBTV9QRQkJCQkoMHgxVUxMIDw8IDM1KQorI2RlZmluZSBDRV9BRE1fRVJSX0RUTDFfTUlOX1BEQVRBX0NSRURJVF9FUlIJCSgweDFVTEwgPDwgMzYpCisjZGVmaW5lIENFX0FETV9FUlJfRFRMMV9JTkZfQ09NUExfQ1JFRF9VUERUX0VSUgkJKDB4MVVMTCA8PCAzNykKKyNkZWZpbmUgQ0VfQURNX0VSUl9EVEwxX0lORl9QT1NURURfQ1JFRF9VUERUX0VSUgkoMHgxVUxMIDw8IDM4KQorI2RlZmluZSBDRV9BRE1fRVJSX0RUTDFfSU5GX05QT1NURURfQ1JFRF9VUERUX0VSUgkoMHgxVUxMIDw8IDM5KQorI2RlZmluZSBDRV9BRE1fRVJSX0RUTDFfQ09NUF9IRF9DUkVEX01BWF9FUlIJCSgweDFVTEwgPDwgNDApCisjZGVmaW5lIENFX0FETV9FUlJfRFRMMV9DT01QX0RfQ1JFRF9NQVhfRVJSCQkoMHgxVUxMIDw8IDQxKQorI2RlZmluZSBDRV9BRE1fRVJSX0RUTDFfTlBPU1RFRF9IRF9DUkVEX01BWF9FUlIJCSgweDFVTEwgPDwgNDIpCisjZGVmaW5lIENFX0FETV9FUlJfRFRMMV9OUE9TVEVEX0RfQ1JFRF9NQVhfRVJSCQkoMHgxVUxMIDw8IDQzKQorI2RlZmluZSBDRV9BRE1fRVJSX0RUTDFfUE9TVEVEX0hEX0NSRURfTUFYX0VSUgkJKDB4MVVMTCA8PCA0NCkKKyNkZWZpbmUgQ0VfQURNX0VSUl9EVEwxX1BPU1RFRF9EX0NSRURfTUFYX0VSUgkJKDB4MVVMTCA8PCA0NSkKKyNkZWZpbmUgQ0VfQURNX0VSUl9EVEwyX01JTl9QREFUQV9DUkVESVRfRVJSCQkoMHgxVUxMIDw8IDQ2KQorI2RlZmluZSBDRV9BRE1fRVJSX0RUTDJfSU5GX0NPTVBMX0NSRURfVVBEVF9FUlIJCSgweDFVTEwgPDwgNDcpCisjZGVmaW5lIENFX0FETV9FUlJfRFRMMl9JTkZfUE9TVEVEX0NSRURfVVBEVF9FUlIJKDB4MVVMTCA8PCA0OCkKKyNkZWZpbmUgQ0VfQURNX0VSUl9EVEwyX0lORl9OUE9TVEVEX0NSRURfVVBEVF9FUlIJKDB4MVVMTCA8PCA0OSkKKyNkZWZpbmUgQ0VfQURNX0VSUl9EVEwyX0NPTVBfSERfQ1JFRF9NQVhfRVJSCQkoMHgxVUxMIDw8IDUwKQorI2RlZmluZSBDRV9BRE1fRVJSX0RUTDJfQ09NUF9EX0NSRURfTUFYX0VSUgkJKDB4MVVMTCA8PCA1MSkKKyNkZWZpbmUgQ0VfQURNX0VSUl9EVEwyX05QT1NURURfSERfQ1JFRF9NQVhfRVJSCQkoMHgxVUxMIDw8IDUyKQorI2RlZmluZSBDRV9BRE1fRVJSX0RUTDJfTlBPU1RFRF9EX0NSRURfTUFYX0VSUgkJKDB4MVVMTCA8PCA1MykKKyNkZWZpbmUgQ0VfQURNX0VSUl9EVEwyX1BPU1RFRF9IRF9DUkVEX01BWF9FUlIJCSgweDFVTEwgPDwgNTQpCisjZGVmaW5lIENFX0FETV9FUlJfRFRMMl9QT1NURURfRF9DUkVEX01BWF9FUlIJCSgweDFVTEwgPDwgNTUpCisjZGVmaW5lIENFX0FETV9FUlJfUE9SVDFfUENJRV9DT1JfRVJSCQkJKDB4MVVMTCA8PCA1NikKKyNkZWZpbmUgQ0VfQURNX0VSUl9QT1JUMV9QQ0lFX05GQVRfRVJSCQkJKDB4MVVMTCA8PCA1NykKKyNkZWZpbmUgQ0VfQURNX0VSUl9QT1JUMV9QQ0lFX0ZBVF9FUlIJCQkoMHgxVUxMIDw8IDU4KQorI2RlZmluZSBDRV9BRE1fRVJSX1BPUlQyX1BDSUVfQ09SX0VSUgkJCSgweDFVTEwgPDwgNTkpCisjZGVmaW5lIENFX0FETV9FUlJfUE9SVDJfUENJRV9ORkFUX0VSUgkJCSgweDFVTEwgPDwgNjApCisjZGVmaW5lIENFX0FETV9FUlJfUE9SVDJfUENJRV9GQVRfRVJSCQkJKDB4MVVMTCA8PCA2MSkKKworLyogY2VfYWRtX3VyZV91cHNfYnVmX2JhcnJpZXJfZmx1c2ggcmVnaXN0ZXIgYml0IG1hc2tzIGFuZCBzaGlmdHMgKi8KKyNkZWZpbmUgRkxVU0hfU0VMX1BPUlQxX1BJUEUwX1NIRlQJMAorI2RlZmluZSBGTFVTSF9TRUxfUE9SVDFfUElQRTFfU0hGVAk0CisjZGVmaW5lIEZMVVNIX1NFTF9QT1JUMV9QSVBFMl9TSEZUCTgKKyNkZWZpbmUgRkxVU0hfU0VMX1BPUlQxX1BJUEUzX1NIRlQJMTIKKyNkZWZpbmUgRkxVU0hfU0VMX1BPUlQyX1BJUEUwX1NIRlQJMTYKKyNkZWZpbmUgRkxVU0hfU0VMX1BPUlQyX1BJUEUxX1NIRlQJMjAKKyNkZWZpbmUgRkxVU0hfU0VMX1BPUlQyX1BJUEUyX1NIRlQJMjQKKyNkZWZpbmUgRkxVU0hfU0VMX1BPUlQyX1BJUEUzX1NIRlQJMjgKKworLyogY2VfZHJlX2NvbmZpZzEgcmVnaXN0ZXIgYml0IG1hc2tzIGFuZCBzaGlmdHMgKi8KKyNkZWZpbmUgQ0VfRFJFX1JPX0VOQUJMRQkJKDB4MVVMTCA8PCAwKQorI2RlZmluZSBDRV9EUkVfRFlOX1JPX0VOQUJMRQkJKDB4MVVMTCA8PCAxKQorI2RlZmluZSBDRV9EUkVfU1VQX0NPTkZJR19DT01QX0VSUk9SCSgweDFVTEwgPDwgMikKKyNkZWZpbmUgQ0VfRFJFX1NVUF9JT19DT01QX0VSUk9SCSgweDFVTEwgPDwgMykKKyNkZWZpbmUgQ0VfRFJFX0FERFJfTU9ERV9TSEZUCQk0CisKKy8qIGNlX2RyZV9jb25maWdfcmVxX3N0YXR1cyByZWdpc3RlciBiaXQgbWFza3MgKi8KKyNkZWZpbmUgQ0VfRFJFX0xBU1RfQ09ORklHX0NPTVBMRVRJT04JKDB4N1VMTCA8PCAwKQorI2RlZmluZSBDRV9EUkVfRE9XTlNUUkVBTV9DT05GSUdfRVJST1IJKDB4MVVMTCA8PCAzKQorI2RlZmluZSBDRV9EUkVfQ09ORklHX0NPTVBMRVRJT05fVkFMSUQJKDB4MVVMTCA8PCA0KQorI2RlZmluZSBDRV9EUkVfQ09ORklHX1JFUVVFU1RfQUNUSVZFCSgweDFVTEwgPDwgNSkKKworLyogY2VfdXJlX2NvbnRyb2wgcmVnaXN0ZXIgYml0IG1hc2tzICYgc2hpZnRzICovCisjZGVmaW5lIENFX1VSRV9SRF9NUkdfRU5BQkxFCQkoMHgxVUxMIDw8IDApCisjZGVmaW5lIENFX1VSRV9XUlRfTVJHX0VOQUJMRTEJCSgweDFVTEwgPDwgNCkKKyNkZWZpbmUgQ0VfVVJFX1dSVF9NUkdfRU5BQkxFMgkJKDB4MVVMTCA8PCA1KQorI2RlZmluZSBDRV9VUkVfUlNQUV9CWVBBU1NfRElTQUJMRQkoMHgxVUxMIDw8IDI0KQorI2RlZmluZSBDRV9VUkVfVVBTX0RBVDFfUEFSX0RJU0FCTEUJKDB4MVVMTCA8PCAzMikKKyNkZWZpbmUgQ0VfVVJFX1VQU19IRFIxX1BBUl9ESVNBQkxFCSgweDFVTEwgPDwgMzMpCisjZGVmaW5lIENFX1VSRV9VUFNfREFUMl9QQVJfRElTQUJMRQkoMHgxVUxMIDw8IDM0KQorI2RlZmluZSBDRV9VUkVfVVBTX0hEUjJfUEFSX0RJU0FCTEUJKDB4MVVMTCA8PCAzNSkKKyNkZWZpbmUgQ0VfVVJFX0FURV9QQVJfRElTQUJMRQkJKDB4MVVMTCA8PCAzNikKKyNkZWZpbmUgQ0VfVVJFX1JDSV9QQVJfRElTQUJMRQkJKDB4MVVMTCA8PCAzNykKKyNkZWZpbmUgQ0VfVVJFX1JTUFFfUEFSX0RJU0FCTEUJCSgweDFVTEwgPDwgMzgpCisjZGVmaW5lIENFX1VSRV9ETlNfREFUX1BBUl9ESVNBQkxFCSgweDFVTEwgPDwgMzkpCisjZGVmaW5lIENFX1VSRV9ETlNfSERSX1BBUl9ESVNBQkxFCSgweDFVTEwgPDwgNDApCisjZGVmaW5lIENFX1VSRV9NQUxGT1JNX0RJU0FCTEUJCSgweDFVTEwgPDwgNDQpCisjZGVmaW5lIENFX1VSRV9VTlNVUF9ESVNBQkxFCQkoMHgxVUxMIDw8IDQ1KQorCisvKiBjZV91cmVfcGFnZV9tYXAgcmVnaXN0ZXIgYml0IG1hc2tzICYgc2hpZnRzICovCisjZGVmaW5lIENFX1VSRV9BVEUzMjQwX0VOQUJMRQkJKDB4MVVMTCA8PCAwKQorI2RlZmluZSBDRV9VUkVfQVRFNDBfRU5BQkxFIAkJKDB4MVVMTCA8PCAxKQorI2RlZmluZSBDRV9VUkVfUEFHRVNJWkVfU0hGVAkJNAorI2RlZmluZSBDRV9VUkVfUEFHRVNJWkVfTUFTSwkJKDB4N1VMTCA8PCBDRV9VUkVfUEFHRVNJWkVfU0hGVCkKKyNkZWZpbmUgQ0VfVVJFXzRLX1BBR0VTSVpFCQkoMHgwVUxMIDw8IENFX1VSRV9QQUdFU0laRV9TSEZUKQorI2RlZmluZSBDRV9VUkVfMTZLX1BBR0VTSVpFCQkoMHgxVUxMIDw8IENFX1VSRV9QQUdFU0laRV9TSEZUKQorI2RlZmluZSBDRV9VUkVfNjRLX1BBR0VTSVpFCQkoMHgyVUxMIDw8IENFX1VSRV9QQUdFU0laRV9TSEZUKQorI2RlZmluZSBDRV9VUkVfMTI4S19QQUdFU0laRQkJKDB4M1VMTCA8PCBDRV9VUkVfUEFHRVNJWkVfU0hGVCkKKyNkZWZpbmUgQ0VfVVJFXzI1NktfUEFHRVNJWkUJCSgweDRVTEwgPDwgQ0VfVVJFX1BBR0VTSVpFX1NIRlQpCisKKy8qIGNlX3VyZV9waXBlX3NlbCByZWdpc3RlciBiaXQgbWFza3MgJiBzaGlmdHMgKi8KKyNkZWZpbmUgUEtUX1RSQUZJQ19TSFJUCQkJMTYKKyNkZWZpbmUgQlVTX1NSQ19JRF9TSEZUCQkJOAorI2RlZmluZSBERVZfU1JDX0lEX1NIRlQJCQkzCisjZGVmaW5lIEZOQ19TUkNfSURfU0hGVAkJCTAKKyNkZWZpbmUgQ0VfVVJFX1RDX01BU0sJCQkoMHgwN1VMTCA8PCBQS1RfVFJBRklDX1NIUlQpCisjZGVmaW5lIENFX1VSRV9CVVNfTUFTSwkJCSgweEZGVUxMIDw8IEJVU19TUkNfSURfU0hGVCkKKyNkZWZpbmUgQ0VfVVJFX0RFVl9NQVNLCQkJKDB4MUZVTEwgPDwgREVWX1NSQ19JRF9TSEZUKQorI2RlZmluZSBDRV9VUkVfRk5DX01BU0sJCQkoMHgwN1VMTCA8PCBGTkNfU1JDX0lEX1NIRlQpCisjZGVmaW5lIENFX1VSRV9QSVBFX0JVUyhiKQkJKCgodWludDY0X3QpKGIpIDw8IEJVU19TUkNfSURfU0hGVCkgJiBcCisJCQkJCSBDRV9VUkVfQlVTX01BU0spCisjZGVmaW5lIENFX1VSRV9QSVBFX0RFVihkKQkJKCgodWludDY0X3QpKGQpIDw8IERFVl9TUkNfSURfU0hGVCkgJiBcCisJCQkJCSBDRV9VUkVfREVWX01BU0spCisjZGVmaW5lIENFX1VSRV9QSVBFX0ZOQyhmKQkJKCgodWludDY0X3QpKGYpIDw8IEZOQ19TUkNfSURfU0hGVCkgJiBcCisJCQkJCSBDRV9VUkVfRk5DX01BU0spCisKKyNkZWZpbmUgQ0VfVVJFX1NFTDFfU0hGVAkJMAorI2RlZmluZSBDRV9VUkVfU0VMMl9TSEZUCQkyMAorI2RlZmluZSBDRV9VUkVfU0VMM19TSEZUCQk0MAorI2RlZmluZSBDRV9VUkVfU0VMMV9NQVNLCQkoMHg3RkZGRlVMTCA8PCBDRV9VUkVfU0VMMV9TSEZUKQorI2RlZmluZSBDRV9VUkVfU0VMMl9NQVNLCQkoMHg3RkZGRlVMTCA8PCBDRV9VUkVfU0VMMl9TSEZUKQorI2RlZmluZSBDRV9VUkVfU0VMM19NQVNLCQkoMHg3RkZGRlVMTCA8PCBDRV9VUkVfU0VMM19TSEZUKQorCisKKy8qIGNlX3VyZV9waXBlX21hc2sgcmVnaXN0ZXIgYml0IG1hc2tzICYgc2hpZnRzICovCisjZGVmaW5lIENFX1VSRV9NQVNLMV9TSEZUCQkwCisjZGVmaW5lIENFX1VSRV9NQVNLMl9TSEZUCQkyMAorI2RlZmluZSBDRV9VUkVfTUFTSzNfU0hGVAkJNDAKKyNkZWZpbmUgQ0VfVVJFX01BU0sxX01BU0sJCSgweDdGRkZGVUxMIDw8IENFX1VSRV9NQVNLMV9TSEZUKQorI2RlZmluZSBDRV9VUkVfTUFTSzJfTUFTSwkJKDB4N0ZGRkZVTEwgPDwgQ0VfVVJFX01BU0syX1NIRlQpCisjZGVmaW5lIENFX1VSRV9NQVNLM19NQVNLCQkoMHg3RkZGRlVMTCA8PCBDRV9VUkVfTUFTSzNfU0hGVCkKKworCisvKiBjZV91cmVfcGNpZV9jb250cm9sMSByZWdpc3RlciBiaXQgbWFza3MgJiBzaGlmdHMgKi8KKyNkZWZpbmUgQ0VfVVJFX1NJCQkJKDB4MVVMTCA8PCAwKQorI2RlZmluZSBDRV9VUkVfRUxBTF9TSEZUCQk0CisjZGVmaW5lIENFX1VSRV9FTEFMX01BU0sJCSgweDdVTEwgPDwgQ0VfVVJFX0VMQUxfU0hGVCkKKyNkZWZpbmUgQ0VfVVJFX0VMQUwxX1NIRlQJCTgKKyNkZWZpbmUgQ0VfVVJFX0VMQUwxX01BU0sJCSgweDdVTEwgPDwgQ0VfVVJFX0VMQUwxX1NIRlQpCisjZGVmaW5lIENFX1VSRV9TQ0MJCQkoMHgxVUxMIDw8IDEyKQorI2RlZmluZSBDRV9VUkVfUE4xX1NIRlQJCQkxNgorI2RlZmluZSBDRV9VUkVfUE4xX01BU0sJCQkoMHhGRlVMTCA8PCBDRV9VUkVfUE4xX1NIRlQpCisjZGVmaW5lIENFX1VSRV9QTjJfU0hGVAkJCTI0CisjZGVmaW5lIENFX1VSRV9QTjJfTUFTSwkJCSgweEZGVUxMIDw8IENFX1VSRV9QTjJfU0hGVCkKKyNkZWZpbmUgQ0VfVVJFX1BOMV9TRVQobikJCSgoKHVpbnQ2NF90KShuKSA8PCBDRV9VUkVfUE4xX1NIRlQpICYgXAorCQkJCQkgQ0VfVVJFX1BOMV9NQVNLKQorI2RlZmluZSBDRV9VUkVfUE4yX1NFVChuKQkJKCgodWludDY0X3QpKG4pIDw8IENFX1VSRV9QTjJfU0hGVCkgJiBcCisJCQkJCSBDRV9VUkVfUE4yX01BU0spCisKKy8qIGNlX3VyZV9wY2llX2NvbnRyb2wyIHJlZ2lzdGVyIGJpdCBtYXNrcyAmIHNoaWZ0cyAqLworI2RlZmluZSBDRV9VUkVfQUJQCQkJKDB4MVVMTCA8PCAwKQorI2RlZmluZSBDRV9VUkVfUENQCQkJKDB4MVVMTCA8PCAxKQorI2RlZmluZSBDRV9VUkVfTVNQCQkJKDB4MVVMTCA8PCAyKQorI2RlZmluZSBDRV9VUkVfQUlQCQkJKDB4MVVMTCA8PCAzKQorI2RlZmluZSBDRV9VUkVfUElQCQkJKDB4MVVMTCA8PCA0KQorI2RlZmluZSBDRV9VUkVfSFBTCQkJKDB4MVVMTCA8PCA1KQorI2RlZmluZSBDRV9VUkVfSFBDCQkJKDB4MVVMTCA8PCA2KQorI2RlZmluZSBDRV9VUkVfU1BMVl9TSEZUCQk3CisjZGVmaW5lIENFX1VSRV9TUExWX01BU0sJCSgweEZGVUxMIDw8IENFX1VSRV9TUExWX1NIRlQpCisjZGVmaW5lIENFX1VSRV9TUExTX1NIRlQJCTE1CisjZGVmaW5lIENFX1VSRV9TUExTX01BU0sJCSgweDNVTEwgPDwgQ0VfVVJFX1NQTFNfU0hGVCkKKyNkZWZpbmUgQ0VfVVJFX1BTTjFfU0hGVAkJMTkKKyNkZWZpbmUgQ0VfVVJFX1BTTjFfTUFTSwkJKDB4MUZGRlVMTCA8PCBDRV9VUkVfUFNOMV9TSEZUKQorI2RlZmluZSBDRV9VUkVfUFNOMl9TSEZUCQkzMgorI2RlZmluZSBDRV9VUkVfUFNOMl9NQVNLCQkoMHgxRkZGVUxMIDw8IENFX1VSRV9QU04yX1NIRlQpCisjZGVmaW5lIENFX1VSRV9QU04xX1NFVChuKQkJKCgodWludDY0X3QpKG4pIDw8IENFX1VSRV9QU04xX1NIRlQpICYgXAorCQkJCQkgQ0VfVVJFX1BTTjFfTUFTSykKKyNkZWZpbmUgQ0VfVVJFX1BTTjJfU0VUKG4pCQkoKCh1aW50NjRfdCkobikgPDwgQ0VfVVJFX1BTTjJfU0hGVCkgJiBcCisJCQkJCSBDRV9VUkVfUFNOMl9NQVNLKQorCisvKgorICogUElPIGFkZHJlc3Mgc3BhY2UgcmFuZ2VzIGZvciBDRQorICovCisKKy8qIExvY2FsIENFIFJlZ2lzdGVycyBTcGFjZSAqLworI2RlZmluZSBDRV9QSU9fTU1SCQkJMHgwMDAwMDAwMAorI2RlZmluZSBDRV9QSU9fTU1SX0xFTgkJCTB4MDQwMDAwMDAKKworLyogUENJIENvbXBhdGlibGUgQ29uZmlnIFNwYWNlICovCisjZGVmaW5lIENFX1BJT19DT05GSUdfU1BBQ0UJCTB4MDQwMDAwMDAKKyNkZWZpbmUgQ0VfUElPX0NPTkZJR19TUEFDRV9MRU4JCTB4MDQwMDAwMDAKKworLyogUENJIEkvTyBTcGFjZSBBbGlhcyAqLworI2RlZmluZSBDRV9QSU9fSU9fU1BBQ0VfQUxJQVMJCTB4MDgwMDAwMDAKKyNkZWZpbmUgQ0VfUElPX0lPX1NQQUNFX0FMSUFTX0xFTgkweDA4MDAwMDAwCisKKy8qIFBDSSBFbmhhbmNlZCBDb25maWcgU3BhY2UgKi8KKyNkZWZpbmUgQ0VfUElPX0VfQ09ORklHX1NQQUNFCQkweDEwMDAwMDAwCisjZGVmaW5lIENFX1BJT19FX0NPTkZJR19TUEFDRV9MRU4JMHgxMDAwMDAwMAorCisvKiBQQ0kgSS9PIFNwYWNlICovCisjZGVmaW5lIENFX1BJT19JT19TUEFDRQkJCTB4MTAwMDAwMDAwCisjZGVmaW5lIENFX1BJT19JT19TUEFDRV9MRU4JCTB4MTAwMDAwMDAwCisKKy8qIFBDSSBNRU0gU3BhY2UgKi8KKyNkZWZpbmUgQ0VfUElPX01FTV9TUEFDRQkJMHgyMDAwMDAwMDAKKyNkZWZpbmUgQ0VfUElPX01FTV9TUEFDRV9MRU4JCVRJT19IV0lOX1NJWkUKKworCisvKgorICogQ0UgUENJIEVuaGFuY2VkIENvbmZpZyBTcGFjZSBzaGlmdHMgJiBtYXNrcworICovCisjZGVmaW5lIENFX0VfQ09ORklHX0JVU19TSEZUCQkyMAorI2RlZmluZSBDRV9FX0NPTkZJR19CVVNfTUFTSwkJKDB4RkYgPDwgQ0VfRV9DT05GSUdfQlVTX1NIRlQpCisjZGVmaW5lIENFX0VfQ09ORklHX0RFVklDRV9TSEZUCQkxNQorI2RlZmluZSBDRV9FX0NPTkZJR19ERVZJQ0VfTUFTSwkJKDB4MUYgPDwgQ0VfRV9DT05GSUdfREVWSUNFX1NIRlQpCisjZGVmaW5lIENFX0VfQ09ORklHX0ZVTkNfU0hGVAkJMTIKKyNkZWZpbmUgQ0VfRV9DT05GSUdfRlVOQ19NQVNLCQkoMHg3ICA8PCBDRV9FX0NPTkZJR19GVU5DX1NIRlQpCisKKyNlbmRpZiAvKiBfX0FTTV9JQTY0X1NOX1RJT0NFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jZV9wcm92aWRlci5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jZV9wcm92aWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNjNkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NlX3Byb3ZpZGVyLmgKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDUsIFNpbGljb24gR3JhcGhpY3MsIEluYy4gICAgICAgICAgICAgICAgICoKKyAqCQkJCQkJCQkJICAqCisgKiAgVGhlc2UgY29kZWQgaW5zdHJ1Y3Rpb25zLCBzdGF0ZW1lbnRzLCBhbmQgY29tcHV0ZXIgcHJvZ3JhbXMJIGNvbnRhaW4gICoKKyAqICB1bnB1Ymxpc2hlZAkgcHJvcHJpZXRhcnkgIGluZm9ybWF0aW9uIG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4sIGFuZCAgKgorICogIGFyZSBwcm90ZWN0ZWQgYnkgRmVkZXJhbCBjb3B5cmlnaHQgbGF3LiAgVGhleSAgbWF5CW5vdCBiZSBkaXNjbG9zZWQgICoKKyAqICB0bwl0aGlyZCAgcGFydGllcwlvciBjb3BpZWQgb3IgZHVwbGljYXRlZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgICoKKyAqICBpbiBwYXJ0LCB3aXRob3V0IHRoZSBwcmlvciB3cml0dGVuIGNvbnNlbnQgb2YgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgKgorICoJCQkJCQkJCQkgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQVNNX0lBNjRfU05fQ0VfUFJPVklERVJfSAorI2RlZmluZSBfQVNNX0lBNjRfU05fQ0VfUFJPVklERVJfSAorCisjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CisjaW5jbHVkZSA8YXNtL3NuL3Rpb2NlLmg+CisKKy8qCisgKiBDb21tb24gVElPQ0Ugc3RydWN0dXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBwcm9tIGFuZCBrZXJuZWwKKyAqCisgKiBETyBOT1QgQ0hBTkdFIFRISVMgU1RSVUNUIFdJVEhPVVQgTUFLSU5HIENPUlJFU1BPTkRJTkcgQ0hBTkdFUyBUTyBUSEUKKyAqIFBST00gVkVSU0lPTi4KKyAqLworc3RydWN0IHRpb2NlX2NvbW1vbiB7CisJc3RydWN0IHBjaWJ1c19idXNzb2Z0CWNlX3BjaWJ1czsJLyogY29tbW9uIHBjaWlvIGhlYWRlciAqLworCisJdWludDMyX3QJCWNlX3JldjsKKwl1aW50NjRfdAkJY2Vfa2VybmVsX3ByaXZhdGU7CisJdWludDY0X3QJCWNlX3Byb21fcHJpdmF0ZTsKK307CisKK3N0cnVjdCB0aW9jZV9rZXJuZWwgeworCXN0cnVjdCB0aW9jZV9jb21tb24JKmNlX2NvbW1vbjsKKwlzcGlubG9ja190CQljZV9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJY2VfZG1hbWFwX2xpc3Q7CisKKwl1aW50NjRfdAkJY2VfYXRlNDBfc2hhZG93W1RJT0NFX05VTV9NNDBfQVRFU107CisJdWludDY0X3QJCWNlX2F0ZTMyNDBfc2hhZG93W1RJT0NFX05VTV9NMzI0MF9BVEVTXTsKKwl1aW50MzJfdAkJY2VfYXRlMzI0MF9wYWdlc2l6ZTsKKworCXVpbnQ4X3QJCQljZV9wb3J0MV9zZWNvbmRhcnk7CisKKwkvKiBwZXItcG9ydCByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgeworCQlpbnQgCQlkaXJtYXBfcmVmY250OworCQl1aW50NjRfdAlkaXJtYXBfc2hhZG93OworCX0gY2VfcG9ydFtUSU9DRV9OVU1fUE9SVFNdOworfTsKKworc3RydWN0IHRpb2NlX2RtYW1hcCB7CisJc3RydWN0IGxpc3RfaGVhZAljZV9kbWFtYXBfbGlzdDsJLyogaGVhZGVkIGJ5IHRpb2NlX2tlcm5lbCAqLworCXVpbnQzMl90CQlyZWZjbnQ7CisKKwl1aW50NjRfdAkJbmJ5dGVzOwkJLyogIyBieXRlcyBtYXBwZWQgKi8KKworCXVpbnQ2NF90CQljdF9zdGFydDsJLyogY29yZXRhbGsgc3RhcnQgYWRkcmVzcyAqLworCXVpbnQ2NF90CQlwY2lfc3RhcnQ7CS8qIGJ1cyBzdGFydCBhZGRyZXNzICovCisKKwl1aW50NjRfdAkJKmF0ZV9odzsJLyogaHcgcHRyIG9mIGZpcnN0IGF0ZSBpbiBtYXAgKi8KKwl1aW50NjRfdAkJKmF0ZV9zaGFkb3c7CS8qIHNoYWRvdyBwdHIgb2YgZmlyYXQgYXRlICovCisJdWludDE2X3QJCWF0ZV9jb3VudDsJLyogIyBhdGUncyBpbiB0aGUgbWFwICovCit9OworCitleHRlcm4gaW50IHRpb2NlX2luaXRfcHJvdmlkZXIodm9pZCk7CisKKyNlbmRpZiAgLyogX19BU01fSUE2NF9TTl9DRV9QUk9WSURFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NwaW5sb2NrLmgKaW5kZXggOTA5OTM2Zi4uNWI3ODYxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc3BpbmxvY2suaApAQCAtMTcsMjggKzE3LDIwIEBACiAjaW5jbHVkZSA8YXNtL2ludHJpbnNpY3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHNwaW5sb2NrX3Q7Ci0KLSNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VECQkJKHNwaW5sb2NrX3QpIHsgMCB9Ci0jZGVmaW5lIHNwaW5fbG9ja19pbml0KHgpCQkJKCh4KS0+bG9jayA9IDApCisjZGVmaW5lIF9fcmF3X3NwaW5fbG9ja19pbml0KHgpCQkJKCh4KS0+bG9jayA9IDApCiAKICNpZmRlZiBBU01fU1VQUE9SVEVECiAvKgogICogVHJ5IHRvIGdldCB0aGUgbG9jay4gIElmIHdlIGZhaWwgdG8gZ2V0IHRoZSBsb2NrLCBtYWtlIGEgbm9uLXN0YW5kYXJkIGNhbGwgdG8KICAqIGlhNjRfc3BpbmxvY2tfY29udGVudGlvbigpLiAgV2UgZG8gbm90IHVzZSBhIG5vcm1hbCBjYWxsIGJlY2F1c2UgdGhhdCB3b3VsZCBmb3JjZSBhbGwKLSAqIGNhbGxlcnMgb2Ygc3Bpbl9sb2NrKCkgdG8gYmUgbm9uLWxlYWYgcm91dGluZXMuICBJbnN0ZWFkLCBpYTY0X3NwaW5sb2NrX2NvbnRlbnRpb24oKSBpcwotICogY2FyZWZ1bGx5IGNvZGVkIHRvIHRvdWNoIG9ubHkgdGhvc2UgcmVnaXN0ZXJzIHRoYXQgc3Bpbl9sb2NrKCkgbWFya3MgImNsb2JiZXJlZCIuCisgKiBjYWxsZXJzIG9mIF9fcmF3X3NwaW5fbG9jaygpIHRvIGJlIG5vbi1sZWFmIHJvdXRpbmVzLiAgSW5zdGVhZCwgaWE2NF9zcGlubG9ja19jb250ZW50aW9uKCkgaXMKKyAqIGNhcmVmdWxseSBjb2RlZCB0byB0b3VjaCBvbmx5IHRob3NlIHJlZ2lzdGVycyB0aGF0IF9fcmF3X3NwaW5fbG9jaygpIG1hcmtzICJjbG9iYmVyZWQiLgogICovCiAKICNkZWZpbmUgSUE2NF9TUElOTE9DS19DTE9CQkVSUyAiYXIuY2N2IiwgImFyLnBmcyIsICJwMTQiLCAicDE1IiwgInIyNyIsICJyMjgiLCAicjI5IiwgInIzMCIsICJiNiIsICJtZW1vcnkiCiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotX3Jhd19zcGluX2xvY2tfZmxhZ3MgKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitfX3Jhd19zcGluX2xvY2tfZmxhZ3MgKHJhd19zcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXJlZ2lzdGVyIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqcHRyIGFzbSAoInIzMSIpID0gJmxvY2stPmxvY2s7CiAKQEAgLTkzLDEwICs4NSwxOCBAQAogIyBlbmRpZiAvKiBDT05GSUdfTUNLSU5MRVkgKi8KICNlbmRpZgogfQotI2RlZmluZSBfcmF3X3NwaW5fbG9jayhsb2NrKSBfcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCAwKQorCisjZGVmaW5lIF9fcmF3X3NwaW5fbG9jayhsb2NrKSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgMCkKKworLyogVW5sb2NrIGJ5IGRvaW5nIGFuIG9yZGVyZWQgc3RvcmUgYW5kIHJlbGVhc2luZyB0aGUgY2FjaGVsaW5lIHdpdGggbnRhICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKngpIHsKKwliYXJyaWVyKCk7CisJYXNtIHZvbGF0aWxlICgic3Q0LnJlbC5udGEgWyUwXSA9IHIwXG5cdCIgOjogInIiKHgpKTsKK30KKwogI2Vsc2UgLyogIUFTTV9TVVBQT1JURUQgKi8KLSNkZWZpbmUgX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9yYXdfc3Bpbl9sb2NrKGxvY2spCi0jIGRlZmluZSBfcmF3X3NwaW5fbG9jayh4KQkJCQkJCQkJXAorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQorIyBkZWZpbmUgX19yYXdfc3Bpbl9sb2NrKHgpCQkJCQkJCQlcCiBkbyB7CQkJCQkJCQkJCQlcCiAJX191MzIgKmlhNjRfc3BpbmxvY2tfcHRyID0gKF9fdTMyICopICh4KTsJCQkJCVwKIAlfX3U2NCBpYTY0X3NwaW5sb2NrX3ZhbDsJCQkJCQkJXApAQCAtMTA5LDI5ICsxMDksMjAgQEAKIAkJfSB3aGlsZSAoaWE2NF9zcGlubG9ja192YWwpOwkJCQkJCVwKIAl9CQkJCQkJCQkJCVwKIH0gd2hpbGUgKDApCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrKHgpCWRvIHsgYmFycmllcigpOyAoKHJhd19zcGlubG9ja190ICopIHgpLT5sb2NrID0gMDsgfSB3aGlsZSAoMCkKICNlbmRpZiAvKiAhQVNNX1NVUFBPUlRFRCAqLwogCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpCSgoeCktPmxvY2sgIT0gMCkKLSNkZWZpbmUgX3Jhd19zcGluX3VubG9jayh4KQlkbyB7IGJhcnJpZXIoKTsgKChzcGlubG9ja190ICopIHgpLT5sb2NrID0gMDsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgX3Jhd19zcGluX3RyeWxvY2soeCkJKGNtcHhjaGdfYWNxKCYoeCktPmxvY2ssIDAsIDEpID09IDApCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQoeCkJZG8geyBiYXJyaWVyKCk7IH0gd2hpbGUgKCh4KS0+bG9jaykKKyNkZWZpbmUgX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkJCSgoeCktPmxvY2sgIT0gMCkKKyNkZWZpbmUgX19yYXdfc3Bpbl90cnlsb2NrKHgpCQkoY21weGNoZ19hY3EoJih4KS0+bG9jaywgMCwgMSkgPT0gMCkKKyNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChsb2NrKSBcCisJZG8geyB3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQobG9jaykpIGNwdV9yZWxheCgpOyB9IHdoaWxlICgwKQogCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IHJlYWRfY291bnRlcgk6IDMxOwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCB3cml0ZV9sb2NrCTogIDE7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKLSNkZWZpbmUgUldfTE9DS19VTkxPQ0tFRCAocndsb2NrX3QpIHsgMCwgMCB9CisjZGVmaW5lIF9fcmF3X3JlYWRfY2FuX2xvY2socncpCQkoKih2b2xhdGlsZSBpbnQgKikocncpID49IDApCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHJ3KQkoKih2b2xhdGlsZSBpbnQgKikocncpID09IDApCiAKLSNkZWZpbmUgcndsb2NrX2luaXQoeCkJCWRvIHsgKih4KSA9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLSNkZWZpbmUgcmVhZF9jYW5fbG9jayhydykJKCoodm9sYXRpbGUgaW50ICopKHJ3KSA+PSAwKQotI2RlZmluZSB3cml0ZV9jYW5fbG9jayhydykJKCoodm9sYXRpbGUgaW50ICopKHJ3KSA9PSAwKQotCi0jZGVmaW5lIF9yYXdfcmVhZF9sb2NrKHJ3KQkJCQkJCQkJXAorI2RlZmluZSBfX3Jhd19yZWFkX2xvY2socncpCQkJCQkJCQlcCiBkbyB7CQkJCQkJCQkJCQlcCi0Jcndsb2NrX3QgKl9fcmVhZF9sb2NrX3B0ciA9IChydyk7CQkJCQkJXAorCXJhd19yd2xvY2tfdCAqX19yZWFkX2xvY2tfcHRyID0gKHJ3KTsJCQkJCQlcCiAJCQkJCQkJCQkJCVwKIAl3aGlsZSAodW5saWtlbHkoaWE2NF9mZXRjaGFkZCgxLCAoaW50ICopIF9fcmVhZF9sb2NrX3B0ciwgYWNxKSA8IDApKSB7CQlcCiAJCWlhNjRfZmV0Y2hhZGQoLTEsIChpbnQgKikgX19yZWFkX2xvY2tfcHRyLCByZWwpOwkJCVwKQEAgLTE0MCwxNCArMTMxLDE0IEBACiAJfQkJCQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIF9yYXdfcmVhZF91bmxvY2socncpCQkJCQlcCisjZGVmaW5lIF9fcmF3X3JlYWRfdW5sb2NrKHJ3KQkJCQkJXAogZG8gewkJCQkJCQkJXAotCXJ3bG9ja190ICpfX3JlYWRfbG9ja19wdHIgPSAocncpOwkJCVwKKwlyYXdfcndsb2NrX3QgKl9fcmVhZF9sb2NrX3B0ciA9IChydyk7CQkJXAogCWlhNjRfZmV0Y2hhZGQoLTEsIChpbnQgKikgX19yZWFkX2xvY2tfcHRyLCByZWwpOwlcCiB9IHdoaWxlICgwKQogCiAjaWZkZWYgQVNNX1NVUFBPUlRFRAotI2RlZmluZSBfcmF3X3dyaXRlX2xvY2socncpCQkJCQkJCVwKKyNkZWZpbmUgX19yYXdfd3JpdGVfbG9jayhydykJCQkJCQkJXAogZG8gewkJCQkJCQkJCQlcCiAgCV9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJCQkJXAogCQkibW92IGFyLmNjdiA9IHIwXG4iCQkJCQkJXApAQCAtMTYyLDcgKzE1Myw3IEBACiAJCTo6ICJyIihydykgOiAiYXIuY2N2IiwgInA3IiwgInIyIiwgInIyOSIsICJtZW1vcnkiKTsJCVwKIH0gd2hpbGUoMCkKIAotI2RlZmluZSBfcmF3X3dyaXRlX3RyeWxvY2socncpCQkJCQkJCVwKKyNkZWZpbmUgX19yYXdfd3JpdGVfdHJ5bG9jayhydykJCQkJCQkJXAogKHsJCQkJCQkJCQkJXAogCXJlZ2lzdGVyIGxvbmcgcmVzdWx0OwkJCQkJCQlcCiAJCQkJCQkJCQkJXApAQCAtMTc0LDkgKzE2NSwxNiBAQAogCShyZXN1bHQgPT0gMCk7CQkJCQkJCQlcCiB9KQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqeCkKK3sKKwl1OCAqeSA9ICh1OCAqKXg7CisJYmFycmllcigpOworCWFzbSB2b2xhdGlsZSAoInN0MS5yZWwubnRhIFslMF0gPSByMFxuXHQiIDo6ICJyIih5KzMpIDogIm1lbW9yeSIgKTsKK30KKwogI2Vsc2UgLyogIUFTTV9TVVBQT1JURUQgKi8KIAotI2RlZmluZSBfcmF3X3dyaXRlX2xvY2sobCkJCQkJCQkJCVwKKyNkZWZpbmUgX19yYXdfd3JpdGVfbG9jayhsKQkJCQkJCQkJXAogKHsJCQkJCQkJCQkJCVwKIAlfX3U2NCBpYTY0X3ZhbCwgaWE2NF9zZXRfdmFsID0gaWE2NF9kZXBfbWkoLTEsIDAsIDMxLCAxKTsJCQlcCiAJX191MzIgKmlhNjRfd3JpdGVfbG9ja19wdHIgPSAoX191MzIgKikgKGwpOwkJCQkJXApAQCAtMTg3LDcgKzE4NSw3IEBACiAJfSB3aGlsZSAoaWE2NF92YWwpOwkJCQkJCQkJXAogfSkKIAotI2RlZmluZSBfcmF3X3dyaXRlX3RyeWxvY2socncpCQkJCQkJXAorI2RlZmluZSBfX3Jhd193cml0ZV90cnlsb2NrKHJ3KQkJCQkJCVwKICh7CQkJCQkJCQkJXAogCV9fdTY0IGlhNjRfdmFsOwkJCQkJCQlcCiAJX191NjQgaWE2NF9zZXRfdmFsID0gaWE2NF9kZXBfbWkoLTEsIDAsIDMxLDEpOwkJCVwKQEAgLTE5NSwxNCArMTkzLDE0IEBACiAJKGlhNjRfdmFsID09IDApOwkJCQkJCVwKIH0pCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICp4KQoreworCWJhcnJpZXIoKTsKKwl4LT53cml0ZV9sb2NrID0gMDsKK30KKwogI2VuZGlmIC8qICFBU01fU1VQUE9SVEVEICovCiAKLSNkZWZpbmUgX3Jhd19yZWFkX3RyeWxvY2sobG9jaykgZ2VuZXJpY19yYXdfcmVhZF90cnlsb2NrKGxvY2spCi0KLSNkZWZpbmUgX3Jhd193cml0ZV91bmxvY2soeCkJCQkJCQkJCVwKLSh7CQkJCQkJCQkJCQlcCi0Jc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCk7CS8qIG5lZWQgYmFycmllciBiZWZvcmUgcmVsZWFzaW5nIGxvY2suLi4gKi8JXAotCWNsZWFyX2JpdCgzMSwgKHgpKTsJCQkJCQkJCVwKLX0pCisjZGVmaW5lIF9fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSBnZW5lcmljX19yYXdfcmVhZF90cnlsb2NrKGxvY2spCiAKICNlbmRpZiAvKiAgX0FTTV9JQTY0X1NQSU5MT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc3BpbmxvY2tfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzRlNDZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zcGlubG9ja190eXBlcy5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX0FTTV9JQTY0X1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX0FTTV9JQTY0X1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHJlYWRfY291bnRlcgk6IDMxOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB3cml0ZV9sb2NrCTogIDE7Cit9IHJhd19yd2xvY2tfdDsKKworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VECQl7IDAsIDAgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1pYTY0L3N5c3RlbS5oCmluZGV4IGNkMmNmNzYuLjYzNTIzNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zeXN0ZW0uaApAQCAtMTksMTIgKzE5LDEzIEBACiAjaW5jbHVkZSA8YXNtL3BhbC5oPgogI2luY2x1ZGUgPGFzbS9wZXJjcHUuaD4KIAotI2RlZmluZSBHQVRFX0FERFIJCV9fSUE2NF9VTF9DT05TVCgweGEwMDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIEdBVEVfQUREUgkJUkdOX0JBU0UoUkdOX0dBVEUpCisKIC8qCiAgKiAweGEwMDAwMDAwMDAwMDAwMDArMipQRVJDUFVfUEFHRV9TSVpFCiAgKiAtIDB4YTAwMDAwMDAwMDAwMDAwMCszKlBFUkNQVV9QQUdFX1NJWkUgcmVtYWluIHVubWFwcGVkIChndWFyZCBwYWdlKQogICovCi0jZGVmaW5lIEtFUk5FTF9TVEFSVAkJIF9fSUE2NF9VTF9DT05TVCgweGEwMDAwMDAxMDAwMDAwMDApCisjZGVmaW5lIEtFUk5FTF9TVEFSVAkJIChHQVRFX0FERFIrMHgxMDAwMDAwMDApCiAjZGVmaW5lIFBFUkNQVV9BRERSCQkoLVBFUkNQVV9QQUdFX1NJWkUpCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCkBAIC0yNzQsNiArMjc1LDcgQEAKICAqLwogI2RlZmluZSBfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9DVFhTVwogCisjZGVmaW5lIEFSQ0hfSEFTX1BSRUZFVENIX1NXSVRDSF9TVEFDSwogI2RlZmluZSBpYTY0X3BsYXRmb3JtX2lzKHgpIChzdHJjbXAoeCwgcGxhdGZvcm1fbmFtZSkgPT0gMCkKIAogdm9pZCBjcHVfaWRsZV93YWl0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20taWE2NC90aHJlYWRfaW5mby5oCmluZGV4IDdkYzg5NTEuLmNmNGE5NTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3RocmVhZF9pbmZvLmgKQEAgLTUsNyArNSw3IEBACiAjaWZuZGVmIF9BU01fSUE2NF9USFJFQURfSU5GT19ICiAjZGVmaW5lIF9BU01fSUE2NF9USFJFQURfSU5GT19ICiAKLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKQEAgLTc2LDYgKzc2LDcgQEAKICNkZWZpbmUgVElGX1NJR0RFTEFZRUQJCTUJLyogc2lnbmFsIGRlbGF5ZWQgZnJvbSBNQ0EvSU5JVC9OTUkvUE1JIGNvbnRleHQgKi8KICNkZWZpbmUgVElGX1BPTExJTkdfTlJGTEFHCTE2CS8qIHRydWUgaWYgcG9sbF9pZGxlKCkgaXMgcG9sbGluZyBUSUZfTkVFRF9SRVNDSEVEICovCiAjZGVmaW5lIFRJRl9NRU1ESUUJCTE3CisjZGVmaW5lIFRJRl9NQ0FfSU5JVAkJMTgJLyogdGhpcyB0YXNrIGlzIHByb2Nlc3NpbmcgTUNBIG9yIElOSVQgKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDEgPDwgVElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMSA8PCBUSUZfU1lTQ0FMTF9BVURJVCkKQEAgLTg1LDYgKzg2LDcgQEAKICNkZWZpbmUgX1RJRl9ORUVEX1JFU0NIRUQJKDEgPDwgVElGX05FRURfUkVTQ0hFRCkKICNkZWZpbmUgX1RJRl9TSUdERUxBWUVECSgxIDw8IFRJRl9TSUdERUxBWUVEKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxIDw8IFRJRl9QT0xMSU5HX05SRkxBRykKKyNkZWZpbmUgX1RJRl9NQ0FfSU5JVAkJKDEgPDwgVElGX01DQV9JTklUKQogCiAvKiAid29yayB0byBkbyBvbiB1c2VyLXJldHVybiIgYml0cyAqLwogI2RlZmluZSBUSUZfQUxMV09SS19NQVNLCShfVElGX05PVElGWV9SRVNVTUV8X1RJRl9TSUdQRU5ESU5HfF9USUZfTkVFRF9SRVNDSEVEfF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVR8X1RJRl9TSUdERUxBWUVEKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC90b3BvbG9neS5oIGIvaW5jbHVkZS9hc20taWE2NC90b3BvbG9neS5oCmluZGV4IDM5OWJjMjkuLmE5ZjczOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3RvcG9sb2d5LmgKQEAgLTk4LDI5ICs5OCw2IEBACiAJLm5yX2JhbGFuY2VfZmFpbGVkCT0gMCwJCQlcCiB9CiAKLS8qIHNjaGVkX2RvbWFpbnMgU0RfQUxMTk9ERVNfSU5JVCBmb3IgSUE2NCBOVU1BIG1hY2hpbmVzICovCi0jZGVmaW5lIFNEX0FMTE5PREVTX0lOSVQgKHN0cnVjdCBzY2hlZF9kb21haW4pIHsJXAotCS5zcGFuCQkJPSBDUFVfTUFTS19OT05FLAlcCi0JLnBhcmVudAkJCT0gTlVMTCwJCQlcCi0JLmdyb3VwcwkJCT0gTlVMTCwJCQlcCi0JLm1pbl9pbnRlcnZhbAkJPSA2NCwJCQlcCi0JLm1heF9pbnRlcnZhbAkJPSA2NCpudW1fb25saW5lX2NwdXMoKSwJXAotCS5idXN5X2ZhY3RvcgkJPSAxMjgsCQkJXAotCS5pbWJhbGFuY2VfcGN0CQk9IDEzMywJCQlcCi0JLmNhY2hlX2hvdF90aW1lCQk9ICgxMCoxMDAwMDAwKSwJCVwKLQkuY2FjaGVfbmljZV90cmllcwk9IDEsCQkJXAotCS5idXN5X2lkeAkJPSAzLAkJCVwKLQkuaWRsZV9pZHgJCT0gMywJCQlcCi0JLm5ld2lkbGVfaWR4CQk9IDAsIC8qIHVudXNlZCAqLwlcCi0JLndha2VfaWR4CQk9IDAsIC8qIHVudXNlZCAqLwlcCi0JLmZvcmtleGVjX2lkeAkJPSAwLCAvKiB1bnVzZWQgKi8JXAotCS5wZXJfY3B1X2dhaW4JCT0gMTAwLAkJCVwKLQkuZmxhZ3MJCQk9IFNEX0xPQURfQkFMQU5DRSwJXAotCS5sYXN0X2JhbGFuY2UJCT0gamlmZmllcywJCVwKLQkuYmFsYW5jZV9pbnRlcnZhbAk9IDY0LAkJCVwKLQkubnJfYmFsYW5jZV9mYWlsZWQJPSAwLAkJCVwKLX0KLQogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy90b3BvbG9neS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC90eXBlcy5oIGIvaW5jbHVkZS9hc20taWE2NC90eXBlcy5oCmluZGV4IGE2Nzc1NjUuLjkwMjg1MGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3R5cGVzLmgKQEAgLTY3LDggKzY3LDYgQEAKIAogdHlwZWRlZiB1NjQgZG1hX2FkZHJfdDsKIAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBrbWVtX2J1ZmN0bF90OwotCiAjIGVuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20taWE2NC91YWNjZXNzLmgKaW5kZXggOGVkZDlhOS4uM2E3ODI5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC91YWNjZXNzLmgKQEAgLTcyLDEzICs3Miw2IEBACiB9KQogI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkJX19hY2Nlc3Nfb2soKGFkZHIpLCAoc2l6ZSksIGdldF9mcygpKQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZAotdmVyaWZ5X2FyZWEgKGludCB0eXBlLCBjb25zdCB2b2lkIF9fdXNlciAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQogLyoKICAqIFRoZXNlIGFyZSB0aGUgbWFpbiBzaW5nbGUtdmFsdWUgdHJhbnNmZXIgcm91dGluZXMuICBUaGV5IGF1dG9tYXRpY2FsbHkKICAqIHVzZSB0aGUgcmlnaHQgc2l6ZSBpZiB3ZSBqdXN0IGhhdmUgdGhlIHJpZ2h0IHBvaW50ZXIgdHlwZS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdW53aW5kLmggYi9pbmNsdWRlL2FzbS1pYTY0L3Vud2luZC5oCmluZGV4IDYxNDI2YWQuLjVkZjAyNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdW53aW5kLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC91bndpbmQuaApAQCAtMTE0LDEzICsxMTQsNiBAQAogICovCiBleHRlcm4gdm9pZCB1bndfaW5pdF9mcm9tX2Jsb2NrZWRfdGFzayAoc3RydWN0IHVud19mcmFtZV9pbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpOwogCi0vKgotICogUHJlcGFyZSB0byB1bndpbmQgZnJvbSBpbnRlcnJ1cHRpb24uICBUaGUgcHQtcmVncyBhbmQgc3dpdGNoLXN0YWNrIHN0cnVjdHVyZXMgbXVzdCBoYXZlCi0gKiBiZSAiYWRqYWNlbnQiIChubyBzdGF0ZSBtb2RpZmljYXRpb25zIGJldHdlZW4gcHQtcmVncyBhbmQgc3dpdGNoLXN0YWNrKS4KLSAqLwotZXh0ZXJuIHZvaWQgdW53X2luaXRfZnJvbV9pbnRlcnJ1cHRpb24gKHN0cnVjdCB1bndfZnJhbWVfaW5mbyAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICp0LAotCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcHQsIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3KTsKLQogZXh0ZXJuIHZvaWQgdW53X2luaXRfZnJhbWVfaW5mbyAoc3RydWN0IHVud19mcmFtZV9pbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsCiAJCQkJIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9hdXh2ZWMuaCBiL2luY2x1ZGUvYXNtLW0zMnIvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2ZGNjOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvYXV4dmVjLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9BU01fTTMyUl9fQVVYVkVDX0gKKyNkZWZpbmUgX0FTTV9NMzJSX19BVVhWRUNfSAorCisjZW5kaWYgIC8qIF9BU01fTTMyUl9fQVVYVkVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvZmNudGwuaCBiL2luY2x1ZGUvYXNtLW0zMnIvZmNudGwuaAppbmRleCAzZTMwODk1Li40NmFiMTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9mY250bC5oCkBAIC0xLDkyICsxIEBACi0jaWZuZGVmIF9BU01fTTMyUl9GQ05UTF9ICi0jZGVmaW5lIF9BU01fTTMyUl9GQ05UTF9ICi0KLS8qICRJZCQgKi8KLQotLyogb3JpZyA6IGkzODYgMi40LjE4ICovCi0KLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgT19ESVJFQ1QJIDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLwotI2RlZmluZSBPX0xBUkdFRklMRQkwMTAwMDAwCi0jZGVmaW5lIE9fRElSRUNUT1JZCTAyMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XCTA0MDAwMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCi0jZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAotCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKLQotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0jZGVmaW5lIEZfR0VUTEs2NAkxMgkvKiAgdXNpbmcgJ3N0cnVjdCBmbG9jazY0JyAqLwotI2RlZmluZSBGX1NFVExLNjQJMTMKLSNkZWZpbmUgRl9TRVRMS1c2NAkxNAotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCW9mZl90IGxfc3RhcnQ7Ci0Jb2ZmX3QgbF9sZW47Ci0JcGlkX3QgbF9waWQ7Ci19OwotCi1zdHJ1Y3QgZmxvY2s2NCB7Ci0Jc2hvcnQgIGxfdHlwZTsKLQlzaG9ydCAgbF93aGVuY2U7Ci0JbG9mZl90IGxfc3RhcnQ7Ci0JbG9mZl90IGxfbGVuOwotCXBpZF90ICBsX3BpZDsKLX07Ci0KLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKLQotI2VuZGlmICAvKiBfQVNNX00zMlJfRkNOVExfSCAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1tMzJyL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvZnV0ZXguaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9BU01fRlVURVhfSAorI2RlZmluZSBfQVNNX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJY2FzZSBGVVRFWF9PUF9PUjoKKwljYXNlIEZVVEVYX09QX0FORE46CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvaGRyZWcuaCBiL2luY2x1ZGUvYXNtLW0zMnIvaGRyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZmQxYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL2hkcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaGRyZWcuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvcGFnZS5oIGIvaW5jbHVkZS9hc20tbTMyci9wYWdlLmgKaW5kZXggMWM2YWJiOS4uNGFiNTc4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9wYWdlLmgKQEAgLTYxLDI1ICs2MSw2IEBACiAKIC8qIFRoaXMgaGFuZGxlcyB0aGUgbWVtb3J5IG1hcC4uICovCiAKLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLS8qIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyICovCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgZ2V0X29yZGVyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpbnQgb3JkZXI7Ci0KLQlzaXplID0gKHNpemUgLSAxKSA+PiAoUEFHRV9TSElGVCAtIDEpOwotCW9yZGVyID0gLTE7Ci0JZG8gewotCQlzaXplID4+PSAxOwotCQlvcmRlcisrOwotCX0gd2hpbGUgKHNpemUpOwotCi0JcmV0dXJuIG9yZGVyOwotfQotCi0jZW5kaWYgLyogX19BU1NFTUJMWV9fICovCi0KICNkZWZpbmUgX19NRU1PUllfU1RBUlQgIENPTkZJR19NRU1PUllfU1RBUlQKICNkZWZpbmUgX19NRU1PUllfU0laRSAgIENPTkZJR19NRU1PUllfU0laRQogCkBAIC0xMTEsNSArOTIsNyBAQAogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgorCiAjZW5kaWYgLyogX0FTTV9NMzJSX1BBR0VfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1tMzJyL3NwaW5sb2NrLmgKaW5kZXggNjYwOGQ4My4uN2RlN2RlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvc3BpbmxvY2suaApAQCAtMTQsNTcgKzE0LDMwIEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKLWV4dGVybiBpbnQgcHJpbnRrKGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7Ci0KLSNkZWZpbmUgUldfTE9DS19CSUFTCQkgMHgwMTAwMDAwMAotI2RlZmluZSBSV19MT0NLX0JJQVNfU1RSCSIweDAxMDAwMDAwIgotCiAvKgogICogWW91ciBiYXNpYyBTTVAgc3BpbmxvY2tzLCBhbGxvd2luZyBvbmx5IGEgc2luZ2xlIENQVSBhbnl3aGVyZQotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSBpbnQgc2xvY2s7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JdW5zaWduZWQgbWFnaWM7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHNwaW5sb2NrX3Q7Ci0KLSNkZWZpbmUgU1BJTkxPQ0tfTUFHSUMJMHhkZWFkNGVhZAotCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0jZGVmaW5lIFNQSU5MT0NLX01BR0lDX0lOSVQJLCBTUElOTE9DS19NQUdJQwotI2Vsc2UKLSNkZWZpbmUgU1BJTkxPQ0tfTUFHSUNfSU5JVAkvKiAqLwotI2VuZGlmCi0KLSNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VEIChzcGlubG9ja190KSB7IDEgU1BJTkxPQ0tfTUFHSUNfSU5JVCB9Ci0KLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQoeCkJZG8geyAqKHgpID0gU1BJTl9MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0KLS8qCisgKgorICogKHRoZSB0eXBlIGRlZmluaXRpb25zIGFyZSBpbiBhc20vc3BpbmxvY2tfdHlwZXMuaCkKKyAqCiAgKiBTaW1wbGUgc3BpbiBsb2NrIG9wZXJhdGlvbnMuICBUaGVyZSBhcmUgdHdvIHZhcmlhbnRzLCBvbmUgY2xlYXJzIElSUSdzCiAgKiBvbiB0aGUgbG9jYWwgcHJvY2Vzc29yLCBvbmUgZG9lcyBub3QuCiAgKgogICogV2UgbWFrZSBubyBmYWlybmVzcyBhc3N1bXB0aW9ucy4gVGhleSBoYXZlIGEgY29zdC4KICAqLwogCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpCSgqKHZvbGF0aWxlIGludCAqKSgmKHgpLT5zbG9jaykgPD0gMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdCh4KQlkbyB7IGJhcnJpZXIoKTsgfSB3aGlsZShzcGluX2lzX2xvY2tlZCh4KSkKLSNkZWZpbmUgX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9yYXdfc3Bpbl9sb2NrKGxvY2spCisjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpCQkoKih2b2xhdGlsZSBpbnQgKikoJih4KS0+c2xvY2spIDw9IDApCisjZGVmaW5lIF9fcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX19yYXdfc3Bpbl9sb2NrKGxvY2spCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQoeCkgXAorCQlkbyB7IGNwdV9yZWxheCgpOyB9IHdoaWxlIChfX3Jhd19zcGluX2lzX2xvY2tlZCh4KSkKIAogLyoqCi0gKiBfcmF3X3NwaW5fdHJ5bG9jayAtIFRyeSBzcGluIGxvY2sgYW5kIHJldHVybiBhIHJlc3VsdAorICogX19yYXdfc3Bpbl90cnlsb2NrIC0gVHJ5IHNwaW4gbG9jayBhbmQgcmV0dXJuIGEgcmVzdWx0CiAgKiBAbG9jazogUG9pbnRlciB0byB0aGUgbG9jayB2YXJpYWJsZQogICoKLSAqIF9yYXdfc3Bpbl90cnlsb2NrKCkgdHJpZXMgdG8gZ2V0IHRoZSBsb2NrIGFuZCByZXR1cm5zIGEgcmVzdWx0LgorICogX19yYXdfc3Bpbl90cnlsb2NrKCkgdHJpZXMgdG8gZ2V0IHRoZSBsb2NrIGFuZCByZXR1cm5zIGEgcmVzdWx0LgogICogT24gdGhlIG0zMnIsIHRoZSByZXN1bHQgdmFsdWUgaXMgMSAoPSBTdWNjZXNzKSBvciAwICg9IEZhaWx1cmUpLgogICovCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCWludCBvbGR2YWw7CiAJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOwpAQCAtNzgsNyArNTEsNyBAQAogCSAqIH0KIAkgKi8KIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSIjIHNwaW5fdHJ5bG9jawkJCVxuXHQiCisJCSIjIF9fcmF3X3NwaW5fdHJ5bG9jawkJXG5cdCIKIAkJImxkaQklMSwgIzA7CQkJXG5cdCIKIAkJIm12ZmMJJTIsIHBzdzsJCVxuXHQiCiAJCSJjbHJwc3cJIzB4NDAgLT4gbm9wOwkJXG5cdCIKQEAgLTk3LDE2ICs3MCwxMCBAQAogCXJldHVybiAob2xkdmFsID4gMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDAsIHRtcDE7CiAKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQlpZiAodW5saWtlbHkobG9jay0+bWFnaWMgIT0gU1BJTkxPQ0tfTUFHSUMpKSB7Ci0JCXByaW50aygicGM6ICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCQlCVUcoKTsKLQl9Ci0jZW5kaWYKIAkvKgogCSAqIGxvY2stPnNsb2NrIDogID0xIDogdW5sb2NrCiAJICogICAgICAgICAgICAgOiA8PTAgOiBsb2NrCkBAIC0xMTgsNyArODUsNyBAQAogCSAqIH0KIAkgKi8KIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSIjIHNwaW5fbG9jawkJCVxuXHQiCisJCSIjIF9fcmF3X3NwaW5fbG9jawkJXG5cdCIKIAkJIi5maWxsaW5zbgkJCVxuIgogCQkiMToJCQkJXG5cdCIKIAkJIm12ZmMJJTEsIHBzdzsJCVxuXHQiCkBAIC0xNDUsMTIgKzExMiw4IEBACiAJKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQlCVUdfT04obG9jay0+bWFnaWMgIT0gU1BJTkxPQ0tfTUFHSUMpOwotCUJVR19PTighc3Bpbl9pc19sb2NrZWQobG9jaykpOwotI2VuZGlmCiAJbWIoKTsKIAlsb2NrLT5zbG9jayA9IDE7CiB9CkBAIC0xNjQsNDIgKzEyNyw3IEBACiAgKiBjYW4gIm1peCIgaXJxLXNhZmUgbG9ja3MgLSBhbnkgd3JpdGVyIG5lZWRzIHRvIGdldCBhCiAgKiBpcnEtc2FmZSB3cml0ZS1sb2NrLCBidXQgcmVhZGVycyBjYW4gZ2V0IG5vbi1pcnFzYWZlCiAgKiByZWFkLWxvY2tzLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgaW50IGxvY2s7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JdW5zaWduZWQgbWFnaWM7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHJ3bG9ja190OwotCi0jZGVmaW5lIFJXTE9DS19NQUdJQwkweGRlYWYxZWVkCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLSNkZWZpbmUgUldMT0NLX01BR0lDX0lOSVQJLCBSV0xPQ0tfTUFHSUMKLSNlbHNlCi0jZGVmaW5lIFJXTE9DS19NQUdJQ19JTklUCS8qICovCi0jZW5kaWYKLQotI2RlZmluZSBSV19MT0NLX1VOTE9DS0VEIChyd2xvY2tfdCkgeyBSV19MT0NLX0JJQVMgUldMT0NLX01BR0lDX0lOSVQgfQotCi0jZGVmaW5lIHJ3bG9ja19pbml0KHgpCWRvIHsgKih4KSA9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLQotLyoqCi0gKiByZWFkX2Nhbl9sb2NrIC0gd291bGQgcmVhZF90cnlsb2NrKCkgc3VjY2VlZD8KLSAqIEBsb2NrOiB0aGUgcndsb2NrIGluIHF1ZXN0aW9uLgotICovCi0jZGVmaW5lIHJlYWRfY2FuX2xvY2soeCkgKChpbnQpKHgpLT5sb2NrID4gMCkKLQotLyoqCi0gKiB3cml0ZV9jYW5fbG9jayAtIHdvdWxkIHdyaXRlX3RyeWxvY2soKSBzdWNjZWVkPwotICogQGxvY2s6IHRoZSByd2xvY2sgaW4gcXVlc3Rpb24uCi0gKi8KLSNkZWZpbmUgd3JpdGVfY2FuX2xvY2soeCkgKCh4KS0+bG9jayA9PSBSV19MT0NLX0JJQVMpCi0KLS8qCisgKgogICogT24geDg2LCB3ZSBpbXBsZW1lbnQgcmVhZC13cml0ZSBsb2NrcyBhcyBhIDMyLWJpdCBjb3VudGVyCiAgKiB3aXRoIHRoZSBoaWdoIGJpdCAoc2lnbikgYmVpbmcgdGhlICJjb250ZW5kZWQiIGJpdC4KICAqCkBAIC0yMDgsMTUgKzEzNiwyMyBAQAogICogQ2hhbmdlZCB0byB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlIGFzIHJ3IHNlbWFwaG9yZXMuICBTZWUKICAqIHNlbWFwaG9yZS5oIGZvciBkZXRhaWxzLiAgLWJlbgogICovCi0vKiB0aGUgc3BpbmxvY2sgaGVscGVycyBhcmUgaW4gYXJjaC9pMzg2L2tlcm5lbC9zZW1hcGhvcmUuYyAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19yZWFkX2xvY2socndsb2NrX3QgKnJ3KQorLyoqCisgKiByZWFkX2Nhbl9sb2NrIC0gd291bGQgcmVhZF90cnlsb2NrKCkgc3VjY2VlZD8KKyAqIEBsb2NrOiB0aGUgcndsb2NrIGluIHF1ZXN0aW9uLgorICovCisjZGVmaW5lIF9fcmF3X3JlYWRfY2FuX2xvY2soeCkgKChpbnQpKHgpLT5sb2NrID4gMCkKKworLyoqCisgKiB3cml0ZV9jYW5fbG9jayAtIHdvdWxkIHdyaXRlX3RyeWxvY2soKSBzdWNjZWVkPworICogQGxvY2s6IHRoZSByd2xvY2sgaW4gcXVlc3Rpb24uCisgKi8KKyNkZWZpbmUgX19yYXdfd3JpdGVfY2FuX2xvY2soeCkgKCh4KS0+bG9jayA9PSBSV19MT0NLX0JJQVMpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDAsIHRtcDE7CiAKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQlCVUdfT04ocnctPm1hZ2ljICE9IFJXTE9DS19NQUdJQyk7Ci0jZW5kaWYKIAkvKgogCSAqIHJ3LT5sb2NrIDogID4wIDogdW5sb2NrCiAJICogICAgICAgICAgOiA8PTAgOiBsb2NrCkBAIC0yNjQsMTMgKzIwMCwxMCBAQAogCSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDAsIHRtcDEsIHRtcDI7CiAKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQlCVUdfT04ocnctPm1hZ2ljICE9IFJXTE9DS19NQUdJQyk7Ci0jZW5kaWYKIAkvKgogCSAqIHJ3LT5sb2NrIDogID1SV19MT0NLX0JJQVNfU1RSIDogdW5sb2NrCiAJICogICAgICAgICAgOiAhPVJXX0xPQ0tfQklBU19TVFIgOiBsb2NrCkBAIC0zMjAsNyArMjUzLDcgQEAKIAkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19yZWFkX3VubG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDAsIHRtcDE7CiAKQEAgLTM0Miw3ICsyNzUsNyBAQAogCSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX3VubG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAwLCB0bXAxLCB0bXAyOwogCkBAIC0zNjYsOSArMjk5LDkgQEAKIAkpOwogfQogCi0jZGVmaW5lIF9yYXdfcmVhZF90cnlsb2NrKGxvY2spIGdlbmVyaWNfcmF3X3JlYWRfdHJ5bG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19yZWFkX3RyeWxvY2sobG9jaykgZ2VuZXJpY19fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKQogCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3dyaXRlX3RyeWxvY2socndsb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKIHsKIAlhdG9taWNfdCAqY291bnQgPSAoYXRvbWljX3QgKilsb2NrOwogCWlmIChhdG9taWNfc3ViX2FuZF90ZXN0KFJXX0xPQ0tfQklBUywgY291bnQpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9zcGlubG9ja190eXBlcy5oIGIvaW5jbHVkZS9hc20tbTMyci9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOTk0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfQVNNX00zMlJfU1BJTkxPQ0tfVFlQRVNfSAorI2RlZmluZSBfQVNNX00zMlJfU1BJTkxPQ0tfVFlQRVNfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSBpbnQgc2xvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDEgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgaW50IGxvY2s7Cit9IHJhd19yd2xvY2tfdDsKKworI2RlZmluZSBSV19MT0NLX0JJQVMJCQkweDAxMDAwMDAwCisjZGVmaW5lIFJXX0xPQ0tfQklBU19TVFIJCSIweDAxMDAwMDAwIgorCisjZGVmaW5lIF9fUkFXX1JXX0xPQ0tfVU5MT0NLRUQJCXsgUldfTE9DS19CSUFTIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3R5cGVzLmggYi9pbmNsdWRlL2FzbS1tMzJyL3R5cGVzLmgKaW5kZXggY2EwYTg4Ny4uZmNmMjRjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvdHlwZXMuaApAQCAtNTUsOCArNTUsNiBAQAogdHlwZWRlZiB1MzIgZG1hX2FkZHJfdDsKIHR5cGVkZWYgdTY0IGRtYTY0X2FkZHJfdDsKIAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBrbWVtX2J1ZmN0bF90OwotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLW0zMnIvdWFjY2Vzcy5oCmluZGV4IGJiYjhhYzQuLjkzZDg2M2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvdWFjY2Vzcy5oCkBAIC0xMjAsMzEgKzEyMCw2IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX01NVSAqLwogCi0vKioKLSAqIHZlcmlmeV9hcmVhOiAtIE9ic29sZXRlL2RlcHJlY2F0ZWQgYW5kIHdpbGwgZ28gYXdheSBzb29uLAotICogdXNlIGFjY2Vzc19vaygpIGluc3RlYWQuCi0gKiBAdHlwZTogVHlwZSBvZiBhY2Nlc3M6ICVWRVJJRllfUkVBRCBvciAlVkVSSUZZX1dSSVRFCi0gKiBAYWRkcjogVXNlciBzcGFjZSBwb2ludGVyIHRvIHN0YXJ0IG9mIGJsb2NrIHRvIGNoZWNrCi0gKiBAc2l6ZTogU2l6ZSBvZiBibG9jayB0byBjaGVjawotICoKLSAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiByZXBsYWNlZCBieSBhY2Nlc3Nfb2soKS4KLSAqCi0gKiBDaGVja3MgaWYgYSBwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UgaXMgdmFsaWQuCi0gKgotICogUmV0dXJucyB6ZXJvIGlmIHRoZSBtZW1vcnkgYmxvY2sgbWF5IGJlIHZhbGlkLCAtRUZBVUxUCi0gKiBpZiBpdCBpcyBkZWZpbml0ZWx5IGludmFsaWQuCi0gKgotICogU2VlIGFjY2Vzc19vaygpIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKmFkZHIsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLCBhZGRyLCBzaXplKSA/IDAgOiAtRUZBVUxUOwotfQotCi0KIC8qCiAgKiBUaGUgZXhjZXB0aW9uIHRhYmxlIGNvbnNpc3RzIG9mIHBhaXJzIG9mIGFkZHJlc3NlczogdGhlIGZpcnN0IGlzIHRoZQogICogYWRkcmVzcyBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzIGFsbG93ZWQgdG8gZmF1bHQsIGFuZCB0aGUgc2Vjb25kIGlzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tbTY4ay9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDRkNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX19BU01tNjhrX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNbTY4a19BVVhWRUNfSAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tbTY4ay9jYWNoZWZsdXNoLmgKaW5kZXggZTQ3NzM5NC4uOGFiYTk3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9jYWNoZWZsdXNoLmgKQEAgLTEzMCwyMCArMTMwLDI1IEBACiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9tbWFwX2xvY2sobWFwcGluZykJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfdW5sb2NrKG1hcHBpbmcpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfaWNhY2hlX3BhZ2Uodm1hLCBwYWdlKQlfX2ZsdXNoX3BhZ2VfdG9fcmFtKHBhZ2VfYWRkcmVzcyhwYWdlKSkKLSNkZWZpbmUgZmx1c2hfaWNhY2hlX3VzZXJfcmFuZ2Uodm1hLHBnLGFkcixsZW4pCWRvIHsgfSB3aGlsZSAoMCkKIAotI2RlZmluZSBjb3B5X3RvX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIHZhZGRyLCBkc3QsIHNyYywgbGVuKSBcCi0JZG8gewkJCQkJCQlcCi0JCWZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2YWRkciwgcGFnZV90b19wZm4ocGFnZSkpO1wKLQkJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwkJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBjb3B5X2Zyb21fdXNlcl9wYWdlKHZtYSwgcGFnZSwgdmFkZHIsIGRzdCwgc3JjLCBsZW4pIFwKLQlkbyB7CQkJCQkJCVwKLQkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZhZGRyLCBwYWdlX3RvX3BmbihwYWdlKSk7XAotCQltZW1jcHkoZHN0LCBzcmMsIGxlbik7CQkJCVwKLQl9IHdoaWxlICgwKQotCitleHRlcm4gdm9pZCBmbHVzaF9pY2FjaGVfdXNlcl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGxlbik7CiBleHRlcm4gdm9pZCBmbHVzaF9pY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZGFkZHIpOwogCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV90b191c2VyX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkciwKKwkJCQkgICAgIHZvaWQgKmRzdCwgdm9pZCAqc3JjLCBpbnQgbGVuKQoreworCWZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2YWRkciwgcGFnZV90b19wZm4ocGFnZSkpOworCW1lbWNweShkc3QsIHNyYywgbGVuKTsKKwlmbHVzaF9pY2FjaGVfdXNlcl9yYW5nZSh2bWEsIHBhZ2UsIHZhZGRyLCBsZW4pOworfQorc3RhdGljIGlubGluZSB2b2lkIGNvcHlfZnJvbV91c2VyX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICAgIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHZhZGRyLAorCQkJCSAgICAgICB2b2lkICpkc3QsIHZvaWQgKnNyYywgaW50IGxlbikKK3sKKwlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgdmFkZHIsIHBhZ2VfdG9fcGZuKHBhZ2UpKTsKKwltZW1jcHkoZHN0LCBzcmMsIGxlbik7Cit9CisKICNlbmRpZiAvKiBfTTY4S19DQUNIRUZMVVNIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvZmNudGwuaCBiL2luY2x1ZGUvYXNtLW02OGsvZmNudGwuaAppbmRleCAwZDQyMTI5Li4xYzM2OWIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9mY250bC5oCkBAIC0xLDg3ICsxLDExIEBACiAjaWZuZGVmIF9NNjhLX0ZDTlRMX0gKICNkZWZpbmUgX002OEtfRkNOVExfSAogCi0vKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCi0gICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgT19BQ0NNT0RFCSAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgMDAKLSNkZWZpbmUgT19XUk9OTFkJICAgIDAxCi0jZGVmaW5lIE9fUkRXUgkJICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgMDEwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19FWENMCQkgIDAyMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fTk9DVFRZCSAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJIDAxMDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0FQUEVORAkgMDIwMDAKLSNkZWZpbmUgT19OT05CTE9DSwkgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCTAxMDAwMAotI2RlZmluZSBGQVNZTkMJCTAyMDAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIE9fRElSRUNUT1JZCTA0MDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCiAjZGVmaW5lIE9fTk9GT0xMT1cJMDEwMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KICNkZWZpbmUgT19ESVJFQ1QJMDIwMDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAtIGN1cnJlbnRseSBpZ25vcmVkICovCiAjZGVmaW5lIE9fTEFSR0VGSUxFCTA0MDAwMDAKLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCiAKLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CiAKLSNkZWZpbmUgRl9TRVRPV04JOAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUT1dOCTkJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX1NFVFNJRwkxMAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUU0lHCTExCS8qICBmb3Igc29ja2V0cy4gKi8KLQotI2RlZmluZSBGX0dFVExLNjQJMTIJLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KLSNkZWZpbmUgRl9TRVRMSzY0CTEzCi0jZGVmaW5lIEZfU0VUTEtXNjQJMTQKLQotLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KLSNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLwotCi0vKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLwotI2RlZmluZSBGX1JETENLCQkwCi0jZGVmaW5lIEZfV1JMQ0sJCTEKLSNkZWZpbmUgRl9VTkxDSwkJMgotCi0vKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLwotI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KLSNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCi0KLS8qIGZvciBsZWFzZXMgKi8KLSNkZWZpbmUgRl9JTlBST0dSRVNTCTE2Ci0KLS8qIG9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAqLwotI2RlZmluZSBMT0NLX1NICQkxCS8qIHNoYXJlZCBsb2NrICovCi0jZGVmaW5lIExPQ0tfRVgJCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19OQgkJNAkvKiBvcidkIHdpdGggb25lIG9mIHRoZSBhYm92ZSB0byBwcmV2ZW50Ci0JCQkJICAgYmxvY2tpbmcgKi8KLSNkZWZpbmUgTE9DS19VTgkJOAkvKiByZW1vdmUgbG9jayAqLwotCi0jZGVmaW5lIExPQ0tfTUFORAkzMgkvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrICovCi0jZGVmaW5lIExPQ0tfUkVBRAk2NAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfV1JJVEUJMTI4CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfUlcJCTE5MgkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCAmIHdyaXRlIG9wcyAqLwotCi1zdHJ1Y3QgZmxvY2sgewotCXNob3J0IGxfdHlwZTsKLQlzaG9ydCBsX3doZW5jZTsKLQlvZmZfdCBsX3N0YXJ0OwotCW9mZl90IGxfbGVuOwotCXBpZF90IGxfcGlkOwotfTsKLQotc3RydWN0IGZsb2NrNjQgewotCXNob3J0ICBsX3R5cGU7Ci0Jc2hvcnQgIGxfd2hlbmNlOwotCWxvZmZfdCBsX3N0YXJ0OwotCWxvZmZfdCBsX2xlbjsKLQlwaWRfdCAgbF9waWQ7Ci19OwotCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0CiAjZW5kaWYgLyogX002OEtfRkNOVExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9mdXRleC5oIGIvaW5jbHVkZS9hc20tbTY4ay9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCWNhc2UgRlVURVhfT1BfQUREOgorCWNhc2UgRlVURVhfT1BfT1I6CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCWNhc2UgRlVURVhfT1BfWE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2hkcmVnLmggYi9pbmNsdWRlL2FzbS1tNjhrL2hkcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ODliYmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI3dhcm5pbmcgdGhpcyBmaWxlIGlzIG9ic29sZXRlLCBwbGVhc2UgZG8gbm90IHVzZSBpdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9wYWdlLmggYi9pbmNsdWRlL2FzbS1tNjhrL3BhZ2UuaAppbmRleCAyMDYzMTNlLi5mMjA2ZGZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3BhZ2UuaApAQCAtMTA3LDIwICsxMDcsNiBAQAogLyogdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gdGhlIChuZXh0KSBwYWdlIGJvdW5kYXJ5ICovCiAjZGVmaW5lIFBBR0VfQUxJR04oYWRkcikJKCgoYWRkcikrUEFHRV9TSVpFLTEpJlBBR0VfTUFTSykKIAotLyogUHVyZSAyXm4gdmVyc2lvbiBvZiBnZXRfb3JkZXIgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGdldF9vcmRlcih1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JaW50IG9yZGVyOwotCi0Jc2l6ZSA9IChzaXplLTEpID4+IChQQUdFX1NISUZULTEpOwotCW9yZGVyID0gLTE7Ci0JZG8gewotCQlzaXplID4+PSAxOwotCQlvcmRlcisrOwotCX0gd2hpbGUgKHNpemUpOwotCXJldHVybiBvcmRlcjsKLX0KLQogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAogI2luY2x1ZGUgPGFzbS9wYWdlX29mZnNldC5oPgpAQCAtMTkyLDQgKzE3OCw2IEBACiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYWdlLmg+CisKICNlbmRpZiAvKiBfTTY4S19QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc3RyaW5nLmggYi9pbmNsdWRlL2FzbS1tNjhrL3N0cmluZy5oCmluZGV4IDQ0ZGVmMDcuLjZjNTkyMTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc3RyaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zdHJpbmcuaApAQCAtODAsNDMgKzgwLDYgQEAKICAgcmV0dXJuKCAoY2hhciAqKSBzKTsKIH0KIAotI2lmIDAKLSNkZWZpbmUgX19IQVZFX0FSQ0hfU1RSUEJSSwotc3RhdGljIGlubGluZSBjaGFyICpzdHJwYnJrKGNvbnN0IGNoYXIgKmNzLGNvbnN0IGNoYXIgKmN0KQotewotICBjb25zdCBjaGFyICpzYzEsKnNjMjsKLQotICBmb3IoIHNjMSA9IGNzOyAqc2MxICE9ICdcMCc7ICsrc2MxKQotICAgIGZvciggc2MyID0gY3Q7ICpzYzIgIT0gJ1wwJzsgKytzYzIpCi0gICAgICBpZiAoKnNjMSA9PSAqc2MyKQotCXJldHVybigoY2hhciAqKSBzYzEpOwotICByZXR1cm4oIE5VTEwgKTsKLX0KLSNlbmRpZgotCi0jaWYgMAotI2RlZmluZSBfX0hBVkVfQVJDSF9TVFJTUE4KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IHN0cnNwbihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICphY2NlcHQpCi17Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGNvbnN0IGNoYXIgKmE7Ci0gIHNpemVfdCBjb3VudCA9IDA7Ci0KLSAgZm9yIChwID0gczsgKnAgIT0gJ1wwJzsgKytwKQotICAgIHsKLSAgICAgIGZvciAoYSA9IGFjY2VwdDsgKmEgIT0gJ1wwJzsgKythKQotICAgICAgICBpZiAoKnAgPT0gKmEpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICBpZiAoKmEgPT0gJ1wwJykKLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgZWxzZQotICAgICAgICArK2NvdW50OwotICAgIH0KLQotICByZXR1cm4gY291bnQ7Ci19Ci0jZW5kaWYKLQogLyogc3Ryc3RyICEhICovCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfU1RSTEVOCkBAIC0xNzMsMzcwICsxMzYsMTggQEAKIH0KIAogI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1TRVQKLS8qCi0gKiBUaGlzIGlzIHJlYWxseSB1Z2x5LCBidXQgaXRzIGhpZ2hseSBvcHRpbWl6YXRpYWJsZSBieSB0aGUKLSAqIGNvbXBpbGVyIGFuZCBpcyBtZWFudCBhcyBjb21wZW5zYXRpb24gZm9yIGdjYydzIG1pc3NpbmcKLSAqIF9fYnVpbHRpbl9tZW1zZXQoKS4gRm9yIHRoZSA2ODBbMjNdMAlpdCBtaWdodCBiZSB3b3J0aCBjb25zaWRlcmluZwotICogdGhlIG9wdGltYWwgbnVtYmVyIG9mIG1pc2FsaWduZWQgd3JpdGVzIGNvbXBhcmVkIHRvIHRoZSBudW1iZXIgb2YKLSAqIHRlc3RzJ24nYnJhbmNoZXMgbmVlZGVkIHRvIGFsaWduIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzLiBUaGUKLSAqIDY4MFs0Nl0wIGRvZXNuJ3QgcmVhbGx5IGNhcmUgZHVlIHRvIHRoZWlyIGNvcHktYmFjayBjYWNoZXMuCi0gKgkJCQkJCTEwLzA5Lzk2IC0gSmVzIFNvcmVuc2VuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqIF9fbWVtc2V0X2codm9pZCAqIHMsIGludCBjLCBzaXplX3QgY291bnQpCi17Ci0gIHZvaWQgKnhzID0gczsKLSAgc2l6ZV90IHRlbXA7Ci0KLSAgaWYgKCFjb3VudCkKLSAgICByZXR1cm4geHM7Ci0KLSAgYyAmPSAweGZmOwotICBjIHw9IGMgPDwgODsKLSAgYyB8PSBjIDw8IDE2OwotCi0gIGlmIChjb3VudCA8IDM2KXsKLQkgIGxvbmcgKmxzID0gczsKLQotCSAgc3dpdGNoKGNvdW50KXsKLQkgIGNhc2UgMzI6IGNhc2UgMzM6IGNhc2UgMzQ6IGNhc2UgMzU6Ci0JCSAgKmxzKysgPSBjOwotCSAgY2FzZSAyODogY2FzZSAyOTogY2FzZSAzMDogY2FzZSAzMToKLQkJICAqbHMrKyA9IGM7Ci0JICBjYXNlIDI0OiBjYXNlIDI1OiBjYXNlIDI2OiBjYXNlIDI3OgotCQkgICpscysrID0gYzsKLQkgIGNhc2UgMjA6IGNhc2UgMjE6IGNhc2UgMjI6IGNhc2UgMjM6Ci0JCSAgKmxzKysgPSBjOwotCSAgY2FzZSAxNjogY2FzZSAxNzogY2FzZSAxODogY2FzZSAxOToKLQkJICAqbHMrKyA9IGM7Ci0JICBjYXNlIDEyOiBjYXNlIDEzOiBjYXNlIDE0OiBjYXNlIDE1OgotCQkgICpscysrID0gYzsKLQkgIGNhc2UgODogY2FzZSA5OiBjYXNlIDEwOiBjYXNlIDExOgotCQkgICpscysrID0gYzsKLQkgIGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6IGNhc2UgNzoKLQkJICAqbHMrKyA9IGM7Ci0JCSAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCQkgIGJyZWFrOwotCSAgfQotCSAgcyA9IGxzOwotCSAgaWYgKGNvdW50ICYgMHgwMil7Ci0JCSAgc2hvcnQgKnNzID0gczsKLQkJICAqc3MrKyA9IGM7Ci0JCSAgcyA9IHNzOwotCSAgfQotCSAgaWYgKGNvdW50ICYgMHgwMSl7Ci0JCSAgY2hhciAqY3MgPSBzOwotCQkgICpjcysrID0gYzsKLQkJICBzID0gY3M7Ci0JICB9Ci0JICByZXR1cm4geHM7Ci0gIH0KLQotICBpZiAoKGxvbmcpIHMgJiAxKQotICAgIHsKLSAgICAgIGNoYXIgKmNzID0gczsKLSAgICAgICpjcysrID0gYzsKLSAgICAgIHMgPSBjczsKLSAgICAgIGNvdW50LS07Ci0gICAgfQotICBpZiAoY291bnQgPiAyICYmIChsb25nKSBzICYgMikKLSAgICB7Ci0gICAgICBzaG9ydCAqc3MgPSBzOwotICAgICAgKnNzKysgPSBjOwotICAgICAgcyA9IHNzOwotICAgICAgY291bnQgLT0gMjsKLSAgICB9Ci0gIHRlbXAgPSBjb3VudCA+PiAyOwotICBpZiAodGVtcCkKLSAgICB7Ci0gICAgICBsb25nICpscyA9IHM7Ci0gICAgICB0ZW1wLS07Ci0gICAgICBkbwotCSpscysrID0gYzsKLSAgICAgIHdoaWxlICh0ZW1wLS0pOwotICAgICAgcyA9IGxzOwotICAgIH0KLSAgaWYgKGNvdW50ICYgMikKLSAgICB7Ci0gICAgICBzaG9ydCAqc3MgPSBzOwotICAgICAgKnNzKysgPSBjOwotICAgICAgcyA9IHNzOwotICAgIH0KLSAgaWYgKGNvdW50ICYgMSkKLSAgICB7Ci0gICAgICBjaGFyICpjcyA9IHM7Ci0gICAgICAqY3MgPSBjOwotICAgIH0KLSAgcmV0dXJuIHhzOwotfQotCi0vKgotICogX19tZW1zZXRfcGFnZSBhc3N1bWVzIHRoYXQgZGF0YSBpcyBsb25nd29yZCBhbGlnbmVkLiBNb3N0LCBpZiBub3QKLSAqIGFsbCwgb2YgdGhlc2UgcGFnZSBzaXplZCBtZW1zZXRzIGFyZSBwZXJmb3JtZWQgb24gcGFnZSBhbGlnbmVkCi0gKiBhcmVhcywgdGh1cyB3ZSBkbyBub3QgbmVlZCB0byBjaGVjayBpZiB0aGUgZGVzdGluYXRpb24gaXMgbG9uZ3dvcmQKLSAqIGFsaWduZWQuIE9mIGNvdXJzZSB3ZSBzdWZmZXIgYSBzZXJpb3VzIHBlcmZvcm1hbmNlIGxvc3MgaWYgdGhpcyBpcwotICogbm90IHRoZSBjYXNlIGJ1dCBJIHRoaW5rIHRoZSByaXNrIG9mIHRoaXMgZXZlciBoYXBwZW5pbmcgaXMKLSAqIGV4dHJlbWVseSBzbWFsbC4gV2Ugc3BlbmQgYSBsb3Qgb2YgdGltZSBjbGVhcmluZyBwYWdlcyBpbgotICogZ2V0X2VtcHR5X3BhZ2UoKSBzbyBJIHRoaW5rIGl0IGlzIHdvcnRoIGl0IGFueXdheS4gQmVzaWRlcywgdGhlCi0gKiA2ODBbNDZdMCBkbyBub3QgcmVhbGx5IGNhcmUgYWJvdXQgbWlzYWxpZ25lZCB3cml0ZXMgZHVlIHRvIHRoZWlyCi0gKiBjb3B5LWJhY2sgY2FjaGUuCi0gKgotICogVGhlIG9wdGltaXplZCBjYXNlIGZvciB0aGUgNjgwWzQ2XTAgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIG1vdmUxNgotICogaW5zdHJ1Y3Rpb24uIE15IHRlc3RzIHNob3dlZCB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgMzUtNDUlCi0gKiBmYXN0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gdXNpbmcgbW92ZWwsIHRoZSBvbmx5Ci0gKiBjYXZlYXQgaXMgdGhhdCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMS8wOS85NiAtIEplcyBTb3JlbnNlbgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKiBfX21lbXNldF9wYWdlKHZvaWQgKiBzLGludCBjLHNpemVfdCBjb3VudCkKLXsKLSAgdW5zaWduZWQgbG9uZyBkYXRhLCB0bXA7Ci0gIHZvaWQgKnhzID0gczsKLQotICBjID0gYyAmIDI1NTsKLSAgZGF0YSA9IGMgfCAoYyA8PCA4KTsKLSAgZGF0YSB8PSBkYXRhIDw8IDE2OwotCi0jaWZkZWYgQ1BVX002ODA0MF9PUl9NNjgwNjBfT05MWQotCi0gIGlmICgoKHVuc2lnbmVkIGxvbmcpIHMpICYgMHgwZikKLQkgIF9fbWVtc2V0X2cocywgYywgY291bnQpOwotICBlbHNlewotCSAgdW5zaWduZWQgbG9uZyAqc3AgPSBzOwotCSAgKnNwKysgPSBkYXRhOwotCSAgKnNwKysgPSBkYXRhOwotCSAgKnNwKysgPSBkYXRhOwotCSAgKnNwKysgPSBkYXRhOwotCi0JICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiMTpcdCIKLQkJCSAgICAgICAiLmNoaXAgNjgwNDBcblx0IgotCQkJICAgICAgICJtb3ZlMTYgJTJAKywlMEArXG5cdCIKLQkJCSAgICAgICAiLmNoaXAgNjhrXG5cdCIKLQkJCSAgICAgICAic3VicXcgICM4LCUyXG5cdCIKLQkJCSAgICAgICAic3VicXcgICM4LCUyXG5cdCIKLQkJCSAgICAgICAiZGJyYSAgICUxLDFiXG5cdCIKLQkJCSAgICAgICA6ICI9YSIgKHNwKSwgIj1kIiAodG1wKQotCQkJICAgICAgIDogImEiIChzKSwgIjAiIChzcCksICIxIiAoKGNvdW50IC0gMTYpIC8gMTYgLSAxKQotCQkJICAgICAgICk7Ci0gIH0KLQotI2Vsc2UKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oIjE6XHQiCi0JCSAgICAgICAibW92ZWwgJTIsJTBAK1xuXHQiCi0JCSAgICAgICAibW92ZWwgJTIsJTBAK1xuXHQiCi0JCSAgICAgICAibW92ZWwgJTIsJTBAK1xuXHQiCi0JCSAgICAgICAibW92ZWwgJTIsJTBAK1xuXHQiCi0JCSAgICAgICAibW92ZWwgJTIsJTBAK1xuXHQiCi0JCSAgICAgICAibW92ZWwgJTIsJTBAK1xuXHQiCi0JCSAgICAgICAibW92ZWwgJTIsJTBAK1xuXHQiCi0JCSAgICAgICAibW92ZWwgJTIsJTBAK1xuXHQiCi0JCSAgICAgICAiZGJyYSAgJTEsMWJcblx0IgotCQkgICAgICAgOiAiPWEiIChzKSwgIj1kIiAodG1wKQotCQkgICAgICAgOiAiZCIgKGRhdGEpLCAiMCIgKHMpLCAiMSIgKGNvdW50IC8gMzIgLSAxKQotCQkgICAgICAgKTsKLSNlbmRpZgotCi0gIHJldHVybiB4czsKLX0KLQotZXh0ZXJuIHZvaWQgKm1lbXNldCh2b2lkICosaW50LF9fa2VybmVsX3NpemVfdCk7Ci0KLSNkZWZpbmUgX19tZW1zZXRfY29uc3QocyxjLGNvdW50KSBcCi0oKGNvdW50PT1QQUdFX1NJWkUpID8gXAotICBfX21lbXNldF9wYWdlKChzKSwoYyksKGNvdW50KSkgOiBcCi0gIF9fbWVtc2V0X2coKHMpLChjKSwoY291bnQpKSkKLQotI2RlZmluZSBtZW1zZXQocywgYywgY291bnQpIFwKLShfX2J1aWx0aW5fY29uc3RhbnRfcChjb3VudCkgPyBcCi0gX19tZW1zZXRfY29uc3QoKHMpLChjKSwoY291bnQpKSA6IFwKLSBfX21lbXNldF9nKChzKSwoYyksKGNvdW50KSkpCitleHRlcm4gdm9pZCAqbWVtc2V0KHZvaWQgKiwgaW50LCBfX2tlcm5lbF9zaXplX3QpOworI2RlZmluZSBtZW1zZXQoZCwgYywgbikgX19idWlsdGluX21lbXNldChkLCBjLCBuKQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX01FTUNQWQotZXh0ZXJuIHZvaWQgKiBtZW1jcHkodm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCApOwotLyoKLSAqIF9fYnVpbHRpbl9tZW1jcHkoKSBkb2VzIG5vdCBoYW5kbGUgcGFnZS1zaXplZCBtZW1jcHlzIHZlcnkgd2VsbCwKLSAqIHRodXMgZm9sbG93aW5nIHRoZSBzYW1lIGFzc3VtcHRpb25zIGFzIGZvciBwYWdlLXNpemVkIG1lbXNldHMsIHRoaXMKLSAqIGZ1bmN0aW9uIGNvcGllcyBwYWdlLXNpemVkIGFyZWFzIHVzaW5nIGFuIHVucm9sbGVkIGxvb3AsIHdpdGhvdXQKLSAqIGNvbnNpZGVyaW5nIGFsaWdubWVudC4KLSAqCi0gKiBGb3IgdGhlIDY4MFs0Nl0wIG9ubHkga2VybmVscyB3ZSB1c2UgdGhlIG1vdmUxNiBpbnN0cnVjdGlvbiBpbnN0ZWFkCi0gKiBhcyBpdCB3cml0ZXMgdGhyb3VnaCB0aGUgZGF0YS1jYWNoZSwgaW52YWxpZGF0aW5nIHRoZSBjYWNoZS1saW5lcwotICogdG91Y2hlZC4gSW4gdGhpcyB3YXkgd2UgZG8gbm90IHVzZSB1cCB0aGUgZW50aXJlIGRhdGEtY2FjaGUgKHdlbGwsCi0gKiBoYWxmIG9mIGl0IG9uIHRoZSA2ODA2MCkgYnkgY29weWluZyBhIHBhZ2UuIEFuIHVucm9sbGVkIGxvb3Agb2YgdHdvCi0gKiBtb3ZlMTYgaW5zdHJ1Y3Rpb25zIHNlZW0gdG8gdGhlIGZhc3Rlc3QuIFRoZSBvbmx5IGNhdmVhdCBpcyB0aGF0Ci0gKiBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQsIGlmIG5vdCB3ZSBmYWxsCi0gKiBiYWNrIHRvIHRoZSBnZW5lcmljIG1lbWNweSBmdW5jdGlvbi4gIC0gSmVzCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqIF9fbWVtY3B5X3BhZ2Uodm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgc2l6ZV90IGNvdW50KQotewotICB1bnNpZ25lZCBsb25nIHRtcDsKLSAgdm9pZCAqeHRvID0gdG87Ci0KLSNpZmRlZiBDUFVfTTY4MDQwX09SX002ODA2MF9PTkxZCi0KLSAgaWYgKCgodW5zaWduZWQgbG9uZykgdG8gfCAodW5zaWduZWQgbG9uZykgZnJvbSkgJiAweDBmKQotCSAgcmV0dXJuIG1lbWNweSh0bywgZnJvbSwgY291bnQpOwotCi0gIF9fYXNtX18gX192b2xhdGlsZV9fKCIxOlx0IgotCQkgICAgICAgIi5jaGlwIDY4MDQwXG5cdCIKLQkJICAgICAgICJtb3ZlMTYgJTFAKywlMEArXG5cdCIKLQkJICAgICAgICJtb3ZlMTYgJTFAKywlMEArXG5cdCIKLQkJICAgICAgICIuY2hpcCA2OGtcblx0IgotCQkgICAgICAgImRicmEgICUyLDFiXG5cdCIKLQkJICAgICAgIDogIj1hIiAodG8pLCAiPWEiIChmcm9tKSwgIj1kIiAodG1wKQotCQkgICAgICAgOiAiMCIgKHRvKSwgIjEiIChmcm9tKSAsICIyIiAoY291bnQgLyAzMiAtIDEpCi0JCSAgICAgICApOwotI2Vsc2UKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oIjE6XHQiCi0JCSAgICAgICAibW92ZWwgJTFAKywlMEArXG5cdCIKLQkJICAgICAgICJtb3ZlbCAlMUArLCUwQCtcblx0IgotCQkgICAgICAgIm1vdmVsICUxQCssJTBAK1xuXHQiCi0JCSAgICAgICAibW92ZWwgJTFAKywlMEArXG5cdCIKLQkJICAgICAgICJtb3ZlbCAlMUArLCUwQCtcblx0IgotCQkgICAgICAgIm1vdmVsICUxQCssJTBAK1xuXHQiCi0JCSAgICAgICAibW92ZWwgJTFAKywlMEArXG5cdCIKLQkJICAgICAgICJtb3ZlbCAlMUArLCUwQCtcblx0IgotCQkgICAgICAgImRicmEgICUyLDFiXG5cdCIKLQkJICAgICAgIDogIj1hIiAodG8pLCAiPWEiIChmcm9tKSwgIj1kIiAodG1wKQotCQkgICAgICAgOiAiMCIgKHRvKSwgIjEiIChmcm9tKSAsICIyIiAoY291bnQgLyAzMiAtIDEpCi0JCSAgICAgICApOwotI2VuZGlmCi0gIHJldHVybiB4dG87Ci19Ci0KLSNkZWZpbmUgX19tZW1jcHlfY29uc3QodG8sIGZyb20sIG4pIFwKLSgobj09UEFHRV9TSVpFKSA/IFwKLSAgX19tZW1jcHlfcGFnZSgodG8pLChmcm9tKSwobikpIDogXAotICBfX2J1aWx0aW5fbWVtY3B5KCh0byksKGZyb20pLChuKSkpCi0KLSNkZWZpbmUgbWVtY3B5KHRvLCBmcm9tLCBuKSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AobikgPyBcCi0gX19tZW1jcHlfY29uc3QoKHRvKSwoZnJvbSksKG4pKSA6IFwKLSBtZW1jcHkoKHRvKSwoZnJvbSksKG4pKSkKK2V4dGVybiB2b2lkICptZW1jcHkodm9pZCAqLCBjb25zdCB2b2lkICosIF9fa2VybmVsX3NpemVfdCk7CisjZGVmaW5lIG1lbWNweShkLCBzLCBuKSBfX2J1aWx0aW5fbWVtY3B5KGQsIHMsIG4pCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNTU9WRQotc3RhdGljIGlubGluZSB2b2lkICogbWVtbW92ZSh2b2lkICogZGVzdCxjb25zdCB2b2lkICogc3JjLCBzaXplX3QgbikKLXsKLSAgdm9pZCAqeGRlc3QgPSBkZXN0OwotICBzaXplX3QgdGVtcDsKLQotICBpZiAoIW4pCi0gICAgcmV0dXJuIHhkZXN0OwotCi0gIGlmIChkZXN0IDwgc3JjKQotICAgIHsKLSAgICAgIGlmICgobG9uZykgZGVzdCAmIDEpCi0JewotCSAgY2hhciAqY2Rlc3QgPSBkZXN0OwotCSAgY29uc3QgY2hhciAqY3NyYyA9IHNyYzsKLQkgICpjZGVzdCsrID0gKmNzcmMrKzsKLQkgIGRlc3QgPSBjZGVzdDsKLQkgIHNyYyA9IGNzcmM7Ci0JICBuLS07Ci0JfQotICAgICAgaWYgKG4gPiAyICYmIChsb25nKSBkZXN0ICYgMikKLQl7Ci0JICBzaG9ydCAqc2Rlc3QgPSBkZXN0OwotCSAgY29uc3Qgc2hvcnQgKnNzcmMgPSBzcmM7Ci0JICAqc2Rlc3QrKyA9ICpzc3JjKys7Ci0JICBkZXN0ID0gc2Rlc3Q7Ci0JICBzcmMgPSBzc3JjOwotCSAgbiAtPSAyOwotCX0KLSAgICAgIHRlbXAgPSBuID4+IDI7Ci0gICAgICBpZiAodGVtcCkKLQl7Ci0JICBsb25nICpsZGVzdCA9IGRlc3Q7Ci0JICBjb25zdCBsb25nICpsc3JjID0gc3JjOwotCSAgdGVtcC0tOwotCSAgZG8KLQkgICAgKmxkZXN0KysgPSAqbHNyYysrOwotCSAgd2hpbGUgKHRlbXAtLSk7Ci0JICBkZXN0ID0gbGRlc3Q7Ci0JICBzcmMgPSBsc3JjOwotCX0KLSAgICAgIGlmIChuICYgMikKLQl7Ci0JICBzaG9ydCAqc2Rlc3QgPSBkZXN0OwotCSAgY29uc3Qgc2hvcnQgKnNzcmMgPSBzcmM7Ci0JICAqc2Rlc3QrKyA9ICpzc3JjKys7Ci0JICBkZXN0ID0gc2Rlc3Q7Ci0JICBzcmMgPSBzc3JjOwotCX0KLSAgICAgIGlmIChuICYgMSkKLQl7Ci0JICBjaGFyICpjZGVzdCA9IGRlc3Q7Ci0JICBjb25zdCBjaGFyICpjc3JjID0gc3JjOwotCSAgKmNkZXN0ID0gKmNzcmM7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRlc3QgPSAoY2hhciAqKSBkZXN0ICsgbjsKLSAgICAgIHNyYyA9IChjb25zdCBjaGFyICopIHNyYyArIG47Ci0gICAgICBpZiAoKGxvbmcpIGRlc3QgJiAxKQotCXsKLQkgIGNoYXIgKmNkZXN0ID0gZGVzdDsKLQkgIGNvbnN0IGNoYXIgKmNzcmMgPSBzcmM7Ci0JICAqLS1jZGVzdCA9ICotLWNzcmM7Ci0JICBkZXN0ID0gY2Rlc3Q7Ci0JICBzcmMgPSBjc3JjOwotCSAgbi0tOwotCX0KLSAgICAgIGlmIChuID4gMiAmJiAobG9uZykgZGVzdCAmIDIpCi0JewotCSAgc2hvcnQgKnNkZXN0ID0gZGVzdDsKLQkgIGNvbnN0IHNob3J0ICpzc3JjID0gc3JjOwotCSAgKi0tc2Rlc3QgPSAqLS1zc3JjOwotCSAgZGVzdCA9IHNkZXN0OwotCSAgc3JjID0gc3NyYzsKLQkgIG4gLT0gMjsKLQl9Ci0gICAgICB0ZW1wID0gbiA+PiAyOwotICAgICAgaWYgKHRlbXApCi0JewotCSAgbG9uZyAqbGRlc3QgPSBkZXN0OwotCSAgY29uc3QgbG9uZyAqbHNyYyA9IHNyYzsKLQkgIHRlbXAtLTsKLQkgIGRvCi0JICAgICotLWxkZXN0ID0gKi0tbHNyYzsKLQkgIHdoaWxlICh0ZW1wLS0pOwotCSAgZGVzdCA9IGxkZXN0OwotCSAgc3JjID0gbHNyYzsKLQl9Ci0gICAgICBpZiAobiAmIDIpCi0JewotCSAgc2hvcnQgKnNkZXN0ID0gZGVzdDsKLQkgIGNvbnN0IHNob3J0ICpzc3JjID0gc3JjOwotCSAgKi0tc2Rlc3QgPSAqLS1zc3JjOwotCSAgZGVzdCA9IHNkZXN0OwotCSAgc3JjID0gc3NyYzsKLQl9Ci0gICAgICBpZiAobiAmIDEpCi0JewotCSAgY2hhciAqY2Rlc3QgPSBkZXN0OwotCSAgY29uc3QgY2hhciAqY3NyYyA9IHNyYzsKLQkgICotLWNkZXN0ID0gKi0tY3NyYzsKLQl9Ci0gICAgfQotICByZXR1cm4geGRlc3Q7Ci19CitleHRlcm4gdm9pZCAqbWVtbW92ZSh2b2lkICosIGNvbnN0IHZvaWQgKiwgX19rZXJuZWxfc2l6ZV90KTsKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1DTVAKLWV4dGVybiBpbnQgbWVtY21wKGNvbnN0IHZvaWQgKiAsY29uc3Qgdm9pZCAqICxzaXplX3QgKTsKLSNkZWZpbmUgbWVtY21wKGNzLCBjdCwgbikgXAotKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8gXAotIF9fYnVpbHRpbl9tZW1jbXAoKGNzKSwoY3QpLChuKSkgOiBcCi0gbWVtY21wKChjcyksKGN0KSwobikpKQotCi0jZGVmaW5lIF9fSEFWRV9BUkNIX01FTUNIUgotc3RhdGljIGlubGluZSB2b2lkICptZW1jaHIoY29uc3Qgdm9pZCAqY3MsIGludCBjLCBzaXplX3QgY291bnQpCi17Ci0JLyogU29tZW9uZSBlbHNlIGNhbiBvcHRpbWl6ZSB0aGlzLCBJIGRvbid0IGNhcmUgLSB0b255bUBtYWMubGludXgtbTY4ay5vcmcgKi8KLQl1bnNpZ25lZCBjaGFyICpyZXQgPSAodW5zaWduZWQgY2hhciAqKWNzOwotCWZvcig7Y291bnQ+MDtjb3VudC0tLHJldCsrKQotCQlpZigqcmV0ID09IGMpIHJldHVybiByZXQ7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KK2V4dGVybiBpbnQgbWVtY21wKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBfX2tlcm5lbF9zaXplX3QpOworI2RlZmluZSBtZW1jbXAoZCwgcywgbikgX19idWlsdGluX21lbWNtcChkLCBzLCBuKQogCiAjZW5kaWYgLyogX002OEtfU1RSSU5HX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3R5cGVzLmggYi9pbmNsdWRlL2FzbS1tNjhrL3R5cGVzLmgKaW5kZXggZjM5MWNiZS4uYjVhMWZlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvdHlwZXMuaApAQCAtNjAsOCArNjAsNiBAQAogdHlwZWRlZiB1MzIgZG1hX2FkZHJfdDsKIHR5cGVkZWYgdTMyIGRtYTY0X2FkZHJfdDsKIAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBrbWVtX2J1ZmN0bF90OwotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLW02OGsvdWFjY2Vzcy5oCmluZGV4IDYwNWU2Y2IuLmY1Y2VkZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvdWFjY2Vzcy5oCkBAIC0xNCwxMiArMTQsNiBAQAogLyogV2UgbGV0IHRoZSBNTVUgZG8gYWxsIGNoZWNraW5nICovCiAjZGVmaW5lIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgMQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpID8gMCA6IC1FRkFVTFQ7Ci19Ci0KIC8qCiAgKiBUaGUgZXhjZXB0aW9uIHRhYmxlIGNvbnNpc3RzIG9mIHBhaXJzIG9mIGFkZHJlc3NlczogdGhlIGZpcnN0IGlzIHRoZQogICogYWRkcmVzcyBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzIGFsbG93ZWQgdG8gZmF1bHQsIGFuZCB0aGUgc2Vjb25kIGlzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0ZDZkNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX19BU01tNjhrX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNbTY4a19BVVhWRUNfSAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9jb2xkZmlyZS5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2NvbGRmaXJlLmgKaW5kZXggMTZmMzJjYy4uMWRmM2Y2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2NvbGRmaXJlLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2NvbGRmaXJlLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNkZWZpbmUJTUNGX01CQVIyCTB4ODAwMDAwMDAKICNkZWZpbmUJTUNGX0lQU0JBUgkweDQwMDAwMDAwCiAKLSNpZiBkZWZpbmVkKENPTkZJR19NNTI3eCkgfHwgZGVmaW5lZChDT05GSUdfTTUyOHgpCisjaWYgZGVmaW5lZChDT05GSUdfTTUyM3gpIHx8IGRlZmluZWQoQ09ORklHX001Mjd4KSB8fCBkZWZpbmVkKENPTkZJR19NNTI4eCkKICN1bmRlZiBNQ0ZfTUJBUgogI2RlZmluZQlNQ0ZfTUJBUglNQ0ZfSVBTQkFSCiAjZW5kaWYKQEAgLTU0LDYgKzU0LDggQEAKICNkZWZpbmUJTUNGX0NMSwkJNTQwMDAwMDAKICNlbGlmIGRlZmluZWQoQ09ORklHX0NMT0NLXzYwTUh6KQogI2RlZmluZQlNQ0ZfQ0xLCQk2MDAwMDAwMAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ0xPQ0tfNjJfNU1IeikKKyNkZWZpbmUgTUNGX0NMSwkJNjI1MDAwMDAKICNlbGlmIGRlZmluZWQoQ09ORklHX0NMT0NLXzY0TUh6KQogI2RlZmluZQlNQ0ZfQ0xLCQk2NDAwMDAwMAogI2VsaWYgZGVmaW5lZChDT05GSUdfQ0xPQ0tfNjZNSHopCkBAIC03Niw3ICs3OCw3IEBACiAgKglPbmUgc29tZSBDb2xkRmlyZSBmYW1pbHkgbWVtYmVycyB0aGUgYnVzIGNsb2NrICh1c2VkIGJ5IGludGVybmFsCiAgKglwZXJpcGhlcmFscykgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBDUFUgY2xvY2suCiAgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19NNTI0OSkgfHwgZGVmaW5lZChDT05GSUdfTTUyN3gpCisjaWYgZGVmaW5lZChDT05GSUdfTTUyM3gpIHx8IGRlZmluZWQoQ09ORklHX001MjQ5KSB8fCBkZWZpbmVkKENPTkZJR19NNTI3eCkKICNkZWZpbmUJTUNGX0JVU0NMSwkoTUNGX0NMSyAvIDIpCiAjZWxzZQogI2RlZmluZQlNQ0ZfQlVTQ0xLCU1DRl9DTEsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9mdXRleC5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2hkcmVnLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaGRyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkZDliMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tbTY4ay9oZHJlZy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L201MjN4c2ltLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbTUyM3hzaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjZjZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L201MjN4c2ltLmgKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgltNTIzeHNpbS5oIC0tIENvbGRGaXJlIDUyM3ggU3lzdGVtIEludGVncmF0aW9uIE1vZHVsZSBzdXBwb3J0LgorICoKKyAqCShDKSBDb3B5cmlnaHQgMjAwMy0yMDA1LCBHcmVnIFVuZ2VyZXIgPGdlcmdAc25hcGdlYXIuY29tPgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZgltNTIzeHNpbV9oCisjZGVmaW5lCW01MjN4c2ltX2gKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qCisgKglEZWZpbmUgdGhlIDUyM3ggU0lNIHJlZ2lzdGVyIHNldCBhZGRyZXNzZXMuCisgKi8KKyNkZWZpbmUJTUNGSUNNX0lOVEMwCQkweDBjMDAJCS8qIEJhc2UgZm9yIEludGVycnVwdCBDdHJsIDAgKi8KKyNkZWZpbmUJTUNGSUNNX0lOVEMxCQkweDBkMDAJCS8qIEJhc2UgZm9yIEludGVycnVwdCBDdHJsIDAgKi8KKyNkZWZpbmUJTUNGSU5UQ19JUFJICQkweDAwCQkvKiBJbnRlcnJ1cHQgcGVuZGluZyAzMi02MyAqLworI2RlZmluZQlNQ0ZJTlRDX0lQUkwJCTB4MDQJCS8qIEludGVycnVwdCBwZW5kaW5nIDEtMzEgKi8KKyNkZWZpbmUJTUNGSU5UQ19JTVJICQkweDA4CQkvKiBJbnRlcnJ1cHQgbWFzayAzMi02MyAqLworI2RlZmluZQlNQ0ZJTlRDX0lNUkwJCTB4MGMJCS8qIEludGVycnVwdCBtYXNrIDEtMzEgKi8KKyNkZWZpbmUJTUNGSU5UQ19JTlRGUkNICQkweDEwCQkvKiBJbnRlcnJ1cHQgZm9yY2UgMzItNjMgKi8KKyNkZWZpbmUJTUNGSU5UQ19JTlRGUkNMCQkweDE0CQkvKiBJbnRlcnJ1cHQgZm9yY2UgMS0zMSAqLworI2RlZmluZQlNQ0ZJTlRDX0lSTFIJCTB4MTgJCS8qICovCisjZGVmaW5lCU1DRklOVENfSUFDS0wJCTB4MTkJCS8qICovCisjZGVmaW5lCU1DRklOVENfSUNSMAkJMHg0MAkJLyogQmFzZSBJQ1IgcmVnaXN0ZXIgKi8KKworI2RlZmluZQlNQ0ZJTlRfVkVDQkFTRQkJNjQJCS8qIFZlY3RvciBiYXNlIG51bWJlciAqLworI2RlZmluZQlNQ0ZJTlRfVUFSVDAJCTEzCQkvKiBJbnRlcnJ1cHQgbnVtYmVyIGZvciBVQVJUMCAqLworI2RlZmluZQlNQ0ZJTlRfUElUMQkJMzYJCS8qIEludGVycnVwdCBudW1iZXIgZm9yIFBJVDEgKi8KKyNkZWZpbmUgTUNGSU5UX1FTUEkJCTE4CQkvKiBJbnRlcnJ1cHQgbnVtYmVyIGZvciBRU1BJICovCisKKy8qCisgKglTRFJBTSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZQlNQ0ZTSU1fRENSCQkweDQ0CQkvKiBTRFJBTSBjb250cm9sICovCisjZGVmaW5lCU1DRlNJTV9EQUNSMAkJMHg0OAkJLyogU0RSQU0gYmFzZSBhZGRyZXNzIDAgKi8KKyNkZWZpbmUJTUNGU0lNX0RNUjAJCTB4NGMJCS8qIFNEUkFNIGFkZHJlc3MgbWFzayAwICovCisjZGVmaW5lCU1DRlNJTV9EQUNSMQkJMHg1MAkJLyogU0RSQU0gYmFzZSBhZGRyZXNzIDEgKi8KKyNkZWZpbmUJTUNGU0lNX0RNUjEJCTB4NTQJCS8qIFNEUkFNIGFkZHJlc3MgbWFzayAxICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCS8qIG01MjN4c2ltX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2ZzaW0uaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2ZzaW0uaAppbmRleCA1MjJlNTEzLi5iMGM3NzM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWNmc2ltLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZnNpbS5oCkBAIC0xNSwxMyArMTUsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAogLyoKLSAqCUluY2x1ZGUgNTIwNCwgNTIwNi9lLCA1MjQ5LCA1MjcwLzUyNzEsIDUyNzIsIDUyODAvNTI4MiwgNTMwNyBvcgotICoJNTQwNyBzcGVjaWZpYyBhZGRyZXNzZXMuCisgKglJbmNsdWRlIDUyMDQsIDUyMDYvZSwgNTIzNSwgNTI0OSwgNTI3MC81MjcxLCA1MjcyLCA1MjgwLzUyODIsCisgKgk1MzA3IG9yIDU0MDcgc3BlY2lmaWMgYWRkcmVzc2VzLgogICovCiAjaWYgZGVmaW5lZChDT05GSUdfTTUyMDQpCiAjaW5jbHVkZSA8YXNtL201MjA0c2ltLmg+CiAjZWxpZiBkZWZpbmVkKENPTkZJR19NNTIwNikgfHwgZGVmaW5lZChDT05GSUdfTTUyMDZlKQogI2luY2x1ZGUgPGFzbS9tNTIwNnNpbS5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfTTUyM3gpCisjaW5jbHVkZSA8YXNtL201MjN4c2ltLmg+CiAjZWxpZiBkZWZpbmVkKENPTkZJR19NNTI0OSkKICNpbmNsdWRlIDxhc20vbTUyNDlzaW0uaD4KICNlbGlmIGRlZmluZWQoQ09ORklHX001Mjd4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZnVhcnQuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2Z1YXJ0LmgKaW5kZXggNTRkNGE4NS4uOWMxMjEwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZnVhcnQuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWNmdWFydC5oCkBAIC0yOSw3ICsyOSw3IEBACiAjZGVmaW5lCU1DRlVBUlRfQkFTRTEJCTB4MTQwCQkvKiBCYXNlIGFkZHJlc3Mgb2YgVUFSVDEgKi8KICNkZWZpbmUJTUNGVUFSVF9CQVNFMgkJMHgxODAJCS8qIEJhc2UgYWRkcmVzcyBvZiBVQVJUMiAqLwogI2VuZGlmCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NNTI3eCkgfHwgZGVmaW5lZChDT05GSUdfTTUyOHgpCisjZWxpZiBkZWZpbmVkKENPTkZJR19NNTIzeCkgfHwgZGVmaW5lZChDT05GSUdfTTUyN3gpIHx8IGRlZmluZWQoQ09ORklHX001Mjh4KQogI2RlZmluZSBNQ0ZVQVJUX0JBU0UxCQkweDIwMCAgICAgICAgICAgLyogQmFzZSBhZGRyZXNzIG9mIFVBUlQxICovCiAjZGVmaW5lIE1DRlVBUlRfQkFTRTIJCTB4MjQwICAgICAgICAgICAvKiBCYXNlIGFkZHJlc3Mgb2YgVUFSVDIgKi8KICNkZWZpbmUgTUNGVUFSVF9CQVNFMwkJMHgyODAgICAgICAgICAgIC8qIEJhc2UgYWRkcmVzcyBvZiBVQVJUMyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9wYWdlLmgKaW5kZXggMDVlMDNkZi4uOTQyZGZiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFnZS5oCkBAIC00OCwyMCArNDgsNiBAQAogLyogdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gdGhlIChuZXh0KSBwYWdlIGJvdW5kYXJ5ICovCiAjZGVmaW5lIFBBR0VfQUxJR04oYWRkcikJKCgoYWRkcikrUEFHRV9TSVpFLTEpJlBBR0VfTUFTSykKIAotLyogUHVyZSAyXm4gdmVyc2lvbiBvZiBnZXRfb3JkZXIgKi8KLWV4dGVybiBfX2lubGluZV9fIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBvcmRlcjsKLQotCXNpemUgPSAoc2l6ZS0xKSA+PiAoUEFHRV9TSElGVC0xKTsKLQlvcmRlciA9IC0xOwotCWRvIHsKLQkJc2l6ZSA+Pj0gMTsKLQkJb3JkZXIrKzsKLQl9IHdoaWxlIChzaXplKTsKLQlyZXR1cm4gb3JkZXI7Ci19Ci0KIGV4dGVybiB1bnNpZ25lZCBsb25nIG1lbW9yeV9zdGFydDsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1lbW9yeV9lbmQ7CiAKQEAgLTczLDggKzU5LDggQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotI2RlZmluZSBfX3BhKHZhZGRyKQkJdmlydF90b19waHlzKCh2b2lkICopdmFkZHIpCi0jZGVmaW5lIF9fdmEocGFkZHIpCQlwaHlzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpcGFkZHIpCisjZGVmaW5lIF9fcGEodmFkZHIpCQl2aXJ0X3RvX3BoeXMoKHZvaWQgKikodmFkZHIpKQorI2RlZmluZSBfX3ZhKHBhZGRyKQkJcGh5c190b192aXJ0KCh1bnNpZ25lZCBsb25nKShwYWRkcikpCiAKICNkZWZpbmUgdmlydF90b19wZm4oa2FkZHIpCShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQogI2RlZmluZSBwZm5fdG9fdmlydChwZm4pCV9fdmEoKHBmbikgPDwgUEFHRV9TSElGVCkKQEAgLTg0LDYgKzcwLDcgQEAKIAogI2RlZmluZSBwZm5fdG9fcGFnZShwZm4pCXZpcnRfdG9fcGFnZShwZm5fdG9fdmlydChwZm4pKQogI2RlZmluZSBwYWdlX3RvX3BmbihwYWdlKQl2aXJ0X3RvX3BmbihwYWdlX3RvX3ZpcnQocGFnZSkpCisjZGVmaW5lIHBmbl92YWxpZChwZm4pCSAgICAgICAgKChwZm4pIDwgbWF4X21hcG5yKQogCiAjZGVmaW5lCXZpcnRfYWRkcl92YWxpZChrYWRkcikJKCgodm9pZCAqKShrYWRkcikgPj0gKHZvaWQgKilQQUdFX09GRlNFVCkgJiYgXAogCQkJCSgodm9pZCAqKShrYWRkcikgPCAodm9pZCAqKW1lbW9yeV9lbmQpKQpAQCAtOTIsNCArNzksNiBAQAogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgorCiAjZW5kaWYgLyogX002OEtOT01NVV9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvdWFjY2Vzcy5oCmluZGV4IGYwYmU3NGIuLjA1YmU5NTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3VhY2Nlc3MuaApAQCAtMjMsMTIgKzIzLDYgQEAKIAkJKGlzX2luX3JvbShhZGRyKSAmJiBpc19pbl9yb20oYWRkcitzaXplKSkpOwogfQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLWV4dGVybiBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKT8wOi1FRkFVTFQ7Ci19Ci0KIC8qCiAgKiBUaGUgZXhjZXB0aW9uIHRhYmxlIGNvbnNpc3RzIG9mIHBhaXJzIG9mIGFkZHJlc3NlczogdGhlIGZpcnN0IGlzIHRoZQogICogYWRkcmVzcyBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzIGFsbG93ZWQgdG8gZmF1bHQsIGFuZCB0aGUgc2Vjb25kIGlzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2Eub3V0LmggYi9pbmNsdWRlL2FzbS1taXBzL2Eub3V0LmgKaW5kZXggZTQyYjMwOS4uMmIzZGMzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9hLm91dC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvYS5vdXQuaApAQCAtMzUsMTAgKzM1LDEwIEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAjZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKICNlbmRpZgotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKICNkZWZpbmUgU1RBQ0tfVE9QCShjdXJyZW50LT50aHJlYWQubWZsYWdzICYgTUZfMzJCSVRfQUREUiA/IFRBU0tfU0laRTMyIDogVEFTS19TSVpFKQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYWRkcnNwYWNlLmggYi9pbmNsdWRlL2FzbS1taXBzL2FkZHJzcGFjZS5oCmluZGV4IDJjYWE4YzQuLjdkYzI2MTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvYWRkcnNwYWNlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9hZGRyc3BhY2UuaApAQCAtNDgsNyArNDgsNyBAQAogI2RlZmluZSBDUEhZU0FERFIoYSkJCSgoX0FDQVNUMzJfIChhKSkgJiAweDFmZmZmZmZmKQogI2RlZmluZSBYUEhZU0FERFIoYSkgICAgICAgICAgICAoKF9BQ0FTVDY0XyAoYSkpICYgMHgwMDAwMDBmZmZmZmZmZmZmKQogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCiAvKgogICogTWVtb3J5IHNlZ21lbnRzICg2NGJpdCBrZXJuZWwgbW9kZSBhZGRyZXNzZXMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2FzbW1hY3JvLTMyLmggYi9pbmNsdWRlL2FzbS1taXBzL2FzbW1hY3JvLTMyLmgKaW5kZXggYWM4ODIzZC4uMTFkYWY1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9hc21tYWNyby0zMi5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvYXNtbWFjcm8tMzIuaApAQCAtNyw3ICs3LDcgQEAKICNpZm5kZWYgX0FTTV9BU01NQUNST18zMl9ICiAjZGVmaW5lIF9BU01fQVNNTUFDUk9fMzJfSAogCi0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vZnByZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYXNtbWFjcm8tNjQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvYXNtbWFjcm8tNjQuaAppbmRleCBiYmVkMzU1Li41NTljMzU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2FzbW1hY3JvLTY0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9hc21tYWNyby02NC5oCkBAIC04LDcgKzgsNyBAQAogI2lmbmRlZiBfQVNNX0FTTU1BQ1JPXzY0X0gKICNkZWZpbmUgX0FTTV9BU01NQUNST182NF9ICiAKLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgogI2luY2x1ZGUgPGFzbS9mcHJlZ2RlZi5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9hc21tYWNyby5oIGIvaW5jbHVkZS9hc20tbWlwcy9hc21tYWNyby5oCmluZGV4IDM3YTQ2MGEuLjMwYjE4ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvYXNtbWFjcm8uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2FzbW1hY3JvLmgKQEAgLTcsMTQgKzcsMTQgQEAKICAqLwogI2lmbmRlZiBfQVNNX0FTTU1BQ1JPX0gKICNkZWZpbmUgX0FTTV9BU01NQUNST19ICi0gCisKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vaGF6YXJkcy5oPgotIAotI2lmZGVmIENPTkZJR19NSVBTMzIKKworI2lmZGVmIENPTkZJR18zMkJJVAogI2luY2x1ZGUgPGFzbS9hc21tYWNyby0zMi5oPgogI2VuZGlmCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogI2luY2x1ZGUgPGFzbS9hc21tYWNyby02NC5oPgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1taXBzL2F0b21pYy5oCmluZGV4IDdkODllODcuLmMwYmQ4ZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9hdG9taWMuaApAQCAtMzM0LDcgKzMzNCw3IEBACiAgKi8KICNkZWZpbmUgYXRvbWljX2FkZF9uZWdhdGl2ZShpLHYpIChhdG9taWNfYWRkX3JldHVybihpLCAodikpIDwgMCkKIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAogdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBfX3M2NCBjb3VudGVyOyB9IGF0b21pYzY0X3Q7CiAKQEAgLTYzOSw3ICs2MzksNyBAQAogICovCiAjZGVmaW5lIGF0b21pYzY0X2FkZF9uZWdhdGl2ZShpLHYpIChhdG9taWM2NF9hZGRfcmV0dXJuKGksICh2KSkgPCAwKQogCi0jZW5kaWYgLyogQ09ORklHX01JUFM2NCAqLworI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCiAvKgogICogYXRvbWljKl9yZXR1cm4gb3BlcmF0aW9ucyBhcmUgc2VyaWFsaXppbmcgYnV0IG5vdCB0aGUgbm9uLSpfcmV0dXJuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tbWlwcy9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2Y3ZjJkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX0FTTV9BVVhWRUNfSAorI2RlZmluZSBfQVNNX0FVWFZFQ19ICisKKyNlbmRpZiAvKiBfQVNNX0FVWFZFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2JpdG9wcy5oIGIvaW5jbHVkZS9hc20tbWlwcy9iaXRvcHMuaAppbmRleCA3NzlkMjE4Li5lYjhkNzlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2JpdG9wcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvYml0b3BzLmgKQEAgLTIwLDEzICsyMCwxMyBAQAogI2RlZmluZSBTWkxPTkdfTUFTSyAzMVVMCiAjZGVmaW5lIF9fTEwJImxsCSIKICNkZWZpbmUgX19TQwkic2MJIgotI2RlZmluZSBjcHVfdG9fbGVsb25ncCh4KSBjcHVfdG9fbGUzMnAoKF9fdTMyICopICh4KSkgCisjZGVmaW5lIGNwdV90b19sZWxvbmdwKHgpIGNwdV90b19sZTMycCgoX191MzIgKikgKHgpKQogI2VsaWYgKF9NSVBTX1NaTE9ORyA9PSA2NCkKICNkZWZpbmUgU1pMT05HX0xPRyA2CiAjZGVmaW5lIFNaTE9OR19NQVNLIDYzVUwKICNkZWZpbmUgX19MTAkibGxkCSIKICNkZWZpbmUgX19TQwkic2NkCSIKLSNkZWZpbmUgY3B1X3RvX2xlbG9uZ3AoeCkgY3B1X3RvX2xlNjRwKChfX3U2NCAqKSAoeCkpIAorI2RlZmluZSBjcHVfdG9fbGVsb25ncCh4KSBjcHVfdG9fbGU2NHAoKF9fdTY0ICopICh4KSkKICNlbmRpZgogCiAjaWZkZWYgX19LRVJORUxfXwpAQCAtNTMzLDE0ICs1MzMsMTQgQEAKIAlpbnQgYiA9IDAsIHM7CiAKIAl3b3JkID0gfndvcmQ7Ci0jaWZkZWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogCXMgPSAxNjsgaWYgKHdvcmQgPDwgMTYgIT0gMCkgcyA9IDA7IGIgKz0gczsgd29yZCA+Pj0gczsKIAlzID0gIDg7IGlmICh3b3JkIDw8IDI0ICE9IDApIHMgPSAwOyBiICs9IHM7IHdvcmQgPj49IHM7CiAJcyA9ICA0OyBpZiAod29yZCA8PCAyOCAhPSAwKSBzID0gMDsgYiArPSBzOyB3b3JkID4+PSBzOwogCXMgPSAgMjsgaWYgKHdvcmQgPDwgMzAgIT0gMCkgcyA9IDA7IGIgKz0gczsgd29yZCA+Pj0gczsKIAlzID0gIDE7IGlmICh3b3JkIDw8IDMxICE9IDApIHMgPSAwOyBiICs9IHM7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAJcyA9IDMyOyBpZiAod29yZCA8PCAzMiAhPSAwKSBzID0gMDsgYiArPSBzOyB3b3JkID4+PSBzOwogCXMgPSAxNjsgaWYgKHdvcmQgPDwgNDggIT0gMCkgcyA9IDA7IGIgKz0gczsgd29yZCA+Pj0gczsKIAlzID0gIDg7IGlmICh3b3JkIDw8IDU2ICE9IDApIHMgPSAwOyBiICs9IHM7IHdvcmQgPj49IHM7CkBAIC02ODMsNyArNjgzLDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgc2NoZWRfZmluZF9maXJzdF9iaXQoY29uc3QgdW5zaWduZWQgbG9uZyAqYikKIHsKLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAJaWYgKHVubGlrZWx5KGJbMF0pKQogCQlyZXR1cm4gX19mZnMoYlswXSk7CiAJaWYgKHVubGlrZWx5KGJbMV0pKQpAQCAtNjk0LDcgKzY5NCw3IEBACiAJCXJldHVybiBfX2ZmcyhiWzNdKSArIDk2OwogCXJldHVybiBfX2ZmcyhiWzRdKSArIDEyODsKICNlbmRpZgotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAlpZiAodW5saWtlbHkoYlswXSkpCiAJCXJldHVybiBfX2ZmcyhiWzBdKTsKIAlpZiAodW5saWtlbHkoYlsxXSkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2J1Z3MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvYnVncy5oCmluZGV4IDE4Y2NlZDEuLmIxNGI5NjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvYnVncy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvYnVncy5oCkBAIC0xNSw3ICsxNSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfYnVncyh2b2lkKQogewogCWNoZWNrX2J1Z3MzMigpOwotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAljaGVja19idWdzNjQoKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tbWlwcy9jaGVja3N1bS5oCmluZGV4IGMyNWNjOTIuLmMxZWE1YTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2NoZWNrc3VtLmgKQEAgLTEyOCw3ICsxMjgsNyBAQAogewogCV9fYXNtX18oCiAJIi5zZXRcdG5vYXRcdFx0XHQjIGNzdW1fdGNwdWRwX25vZm9sZFxuXHQiCi0jaWZkZWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogCSJhZGR1XHQlMCwgJTJcblx0IgogCSJzbHR1XHQkMSwgJTAsICUyXG5cdCIKIAkiYWRkdVx0JTAsICQxXG5cdCIKQEAgLTE0MSw3ICsxNDEsNyBAQAogCSJzbHR1XHQkMSwgJTAsICU0XG5cdCIKIAkiYWRkdVx0JTAsICQxXG5cdCIKICNlbmRpZgotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAkiZGFkZHVcdCUwLCAlMlxuXHQiCiAJImRhZGR1XHQlMCwgJTNcblx0IgogCSJkYWRkdVx0JTAsICU0XG5cdCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oCmluZGV4IGQ3ODAwMmEuLjJjMDg0Y2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaApAQCAtMTUsOCArMTUsMTAgQEAKIHR5cGVkZWYgczMyCQljb21wYXRfc3VzZWNvbmRzX3Q7CiAKIHR5cGVkZWYgczMyCQljb21wYXRfcGlkX3Q7Ci10eXBlZGVmIHMzMgkJY29tcGF0X3VpZF90OwotdHlwZWRlZiBzMzIJCWNvbXBhdF9naWRfdDsKK3R5cGVkZWYgdTMyCQlfX2NvbXBhdF91aWRfdDsKK3R5cGVkZWYgdTMyCQlfX2NvbXBhdF9naWRfdDsKK3R5cGVkZWYgdTMyCQlfX2NvbXBhdF91aWQzMl90OwordHlwZWRlZiB1MzIJCV9fY29tcGF0X2dpZDMyX3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X21vZGVfdDsKIHR5cGVkZWYgdTMyCQljb21wYXRfaW5vX3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X2Rldl90OwpAQCAtNTIsOCArNTQsOCBAQAogCWNvbXBhdF9pbm9fdAlzdF9pbm87CiAJY29tcGF0X21vZGVfdAlzdF9tb2RlOwogCWNvbXBhdF9ubGlua190CXN0X25saW5rOwotCWNvbXBhdF91aWRfdAlzdF91aWQ7Ci0JY29tcGF0X2dpZF90CXN0X2dpZDsKKwlfX2NvbXBhdF91aWQzMl90CXN0X3VpZDsKKwlfX2NvbXBhdF9naWQzMl90CXN0X2dpZDsKIAljb21wYXRfZGV2X3QJc3RfcmRldjsKIAlzMzIJCXN0X3BhZDJbMl07CiAJY29tcGF0X29mZl90CXN0X3NpemU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2NwdS1mZWF0dXJlcy5oIGIvaW5jbHVkZS9hc20tbWlwcy9jcHUtZmVhdHVyZXMuaAppbmRleCAxZGYyYzI5Li45YTJkZTY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2NwdS1mZWF0dXJlcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvY3B1LWZlYXR1cmVzLmgKQEAgLTEwNiw3ICsxMDYsNyBAQAogI2RlZmluZSBQTEFUX1RSQU1QT0xJTkVfU1RVRkZfTElORQkwVUwKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogIyBpZm5kZWYgY3B1X2hhc19ub2ZwdWV4CiAjIGRlZmluZSBjcHVfaGFzX25vZnB1ZXgJKGNwdV9kYXRhWzBdLm9wdGlvbnMgJiBNSVBTX0NQVV9OT0ZQVUVYKQogIyBlbmRpZgpAQCAtMTI0LDcgKzEyNCw3IEBACiAjIGVuZGlmCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKICMgaWZuZGVmIGNwdV9oYXNfbm9mcHVleAogIyBkZWZpbmUgY3B1X2hhc19ub2ZwdWV4CQkwCiAjIGVuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RkYjV4eHgvZGRiNTQ3Ny5oIGIvaW5jbHVkZS9hc20tbWlwcy9kZGI1eHh4L2RkYjU0NzcuaAppbmRleCBhZTNlMmEzLi5hNDM4NTQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2RkYjV4eHgvZGRiNTQ3Ny5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZGRiNXh4eC9kZGI1NDc3LmgKQEAgLTI0Nyw3ICsyNDcsNyBAQAogICogIEFsbCBQQ0kgaXJxIGJ1dCBJTlRDIGFyZSBhY3RpdmUgbG93LgogICovCiAKLS8qIAorLyoKICAqIGlycSBudW1iZXIgYmxvY2sgYXNzaWdubWVudAogICovCiAKQEAgLTI4NSw3ICsyODUsNyBAQAogI2RlZmluZSBWUkM1NDc3X0lSUV9JT1BDSV9JTlRCCSgxNyArIFZSQzU0NzdfSVJRX0JBU0UpICAgICAgLyogVVNCLVAgKi8KICNkZWZpbmUgVlJDNTQ3N19JUlFfSU9QQ0lfSU5UQwkoMTggKyBWUkM1NDc3X0lSUV9CQVNFKSAgICAgIC8qIEFDOTcgKi8KICNkZWZpbmUgVlJDNTQ3N19JUlFfSU9QQ0lfSU5URAkoMTkgKyBWUkM1NDc3X0lSUV9CQVNFKSAgICAgIC8qIFJlc2VydmVkICovCi0jZGVmaW5lIFZSQzU0NzdfSVJRX1VBUlQxCSgyMCArIFZSQzU0NzdfSVJRX0JBU0UpICAgICAKKyNkZWZpbmUgVlJDNTQ3N19JUlFfVUFSVDEJKDIwICsgVlJDNTQ3N19JUlFfQkFTRSkKICNkZWZpbmUgVlJDNTQ3N19JUlFfU1BUMAkoMjEgKyBWUkM1NDc3X0lSUV9CQVNFKSAgICAgIC8qIHNwZWNpYWwgcHVycG9zZSB0aW1lciAwICovCiAjZGVmaW5lIFZSQzU0NzdfSVJRX0dQVDAJKDIyICsgVlJDNTQ3N19JUlFfQkFTRSkgICAgICAvKiBnZW5lcmFsIHB1cnBvc2UgdGltZXIgMCAqLwogI2RlZmluZSBWUkM1NDc3X0lSUV9HUFQxCSgyMyArIFZSQzU0NzdfSVJRX0JBU0UpICAgICAgLyogZ2VuZXJhbCBwdXJwb3NlIHRpbWVyIDEgKi8KQEAgLTMwMSw3ICszMDEsNyBAQAogLyoKICAqIGkyODU5IGlycSBhc3NpZ25tZW50CiAgKi8KLSNkZWZpbmUgSTgyNTlfSVJRX1JFU0VSVkVEXzAJKDAgKyBJODI1OV9JUlFfQkFTRSkJCisjZGVmaW5lIEk4MjU5X0lSUV9SRVNFUlZFRF8wCSgwICsgSTgyNTlfSVJRX0JBU0UpCiAjZGVmaW5lIEk4MjU5X0lSUV9LRVlCT0FSRAkoMSArIEk4MjU5X0lSUV9CQVNFKQkvKiBNMTU0MyBkZWZhdWx0ICovCiAjZGVmaW5lIEk4MjU5X0lSUV9DQVNDQURFCSgyICsgSTgyNTlfSVJRX0JBU0UpCiAjZGVmaW5lIEk4MjU5X0lSUV9VQVJUX0IJKDMgKyBJODI1OV9JUlFfQkFTRSkJLyogTTE1NDMgZGVmYXVsdCwgbWF5IGNvbmZsaWN0IHdpdGggUlRDIGFjY29yZGluZyB0byBzY2hlbWF0aWMgZGlhZ3JhbSAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL3Byb20uaCBiL2luY2x1ZGUvYXNtLW1pcHMvZGVjL3Byb20uaAppbmRleCBiNjNlMmYyLi5hMDVkNmQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2RlYy9wcm9tLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9kZWMvcHJvbS5oCkBAIC00OCwxNSArNDgsMTUgQEAKICAqLwogI2RlZmluZSBSRVhfUFJPTV9NQUdJQwkJMHgzMDQ2NDM1NAogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCiAjZGVmaW5lIHByb21faXNfcmV4KG1hZ2ljKQkxCS8qIEtOMDQgYW5kIEtOMDUgYXJlIFJFWCBQUk9Ncy4gICovCiAKLSNlbHNlIC8qICFDT05GSUdfTUlQUzY0ICovCisjZWxzZSAvKiAhQ09ORklHXzY0QklUICovCiAKICNkZWZpbmUgcHJvbV9pc19yZXgobWFnaWMpCSgobWFnaWMpID09IFJFWF9QUk9NX01BR0lDKQogCi0jZW5kaWYgLyogIUNPTkZJR19NSVBTNjQgKi8KKyNlbmRpZiAvKiAhQ09ORklHXzY0QklUICovCiAKIAogLyoKQEAgLTEwNSw3ICsxMDUsNyBAQAogZXh0ZXJuIGludCAoKl9fcG1heF9jbG9zZSkoaW50KTsKIAogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCiAvKgogICogT24gTUlQUzY0IHdlIGhhdmUgdG8gY2FsbCBQUk9NIGZ1bmN0aW9ucyB2aWEgYSBoZWxwZXIKQEAgLTEzOCw3ICsxMzgsNyBAQAogI2RlZmluZSBwcm9tX2dldGVudih4KQkJX3Byb21fZ2V0ZW52KF9fcHJvbV9nZXRlbnYsIHgpCiAjZGVmaW5lIHByb21fcHJpbnRmKHguLi4pCV9wcm9tX3ByaW50ZihfX3Byb21fcHJpbnRmLCB4KQogCi0jZWxzZSAvKiAhQ09ORklHX01JUFM2NCAqLworI2Vsc2UgLyogIUNPTkZJR182NEJJVCAqLwogCiAvKgogICogT24gcGxhaW4gTUlQUyB3ZSBqdXN0IGNhbGwgUFJPTSBmdW5jdGlvbnMgZGlyZWN0bHkuCkBAIC0xNjAsNyArMTYwLDcgQEAKICNkZWZpbmUgcG1heF9yZWFkCQlfX3BtYXhfcmVhZAogI2RlZmluZSBwbWF4X2Nsb3NlCQlfX3BtYXhfY2xvc2UKIAotI2VuZGlmIC8qICFDT05GSUdfTUlQUzY0ICovCisjZW5kaWYgLyogIUNPTkZJR182NEJJVCAqLwogCiAKIGV4dGVybiB2b2lkIHByb21fbWVtaW5pdCh1MzIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kZWxheS5oIGIvaW5jbHVkZS9hc20tbWlwcy9kZWxheS5oCmluZGV4IGQwZjY4NDQuLmE2MDZkYmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZGVsYXkuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2RlbGF5LmgKQEAgLTU3LDExICs1NywxMSBAQAogCSAqIFRoZSBjb21tb24gcmF0ZXMgb2YgMTAwMCBhbmQgMTI4IGFyZSByb3VuZGVkIHdyb25nbHkgYnkgdGhlCiAJICogY2F0Y2hhbGwgY2FzZSBmb3IgNjQtYml0LiAgRXhjZXNzaXZlIHByZWNpc3Npb24/ICBQcm9iYWJseSAuLi4KIAkgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTNjQpICYmIChIWiA9PSAxMjgpCisjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpICYmIChIWiA9PSAxMjgpCiAJdXNlY3MgKj0gMHgwMDA4NjM3YmQwNWFmNmM3VUw7CQkvKiAyKio2NCAvICgxMDAwMDAwIC8gSFopICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NSVBTNjQpICYmIChIWiA9PSAxMDAwKQorI2VsaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpICYmIChIWiA9PSAxMDAwKQogCXVzZWNzICo9IDB4MDA0MTg5Mzc0QkM2QTdmMFVMOwkJLyogMioqNjQgLyAoMTAwMDAwMCAvIEhaKSAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfTUlQUzY0KQorI2VsaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpCiAJdXNlY3MgKj0gKDB4ODAwMDAwMDAwMDAwMDAwMFVMIC8gKDUwMDAwMCAvIEhaKSk7CiAjZWxzZSAvKiAzMi1iaXQganVuayBmb2xsb3dzIGhlcmUgKi8KIAl1c2VjcyAqPSAodW5zaWduZWQgbG9uZykgKCgoMHg4MDAwMDAwMDAwMDAwMDAwVUxMIC8gKDUwMDAwMCAvIEhaKSkgKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9lbGYuaCBiL2luY2x1ZGUvYXNtLW1pcHMvZWxmLmgKaW5kZXggN2I5MmM4MC4uZTQ4ODExNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2VsZi5oCkBAIC0xMjUsNyArMTI1LDcgQEAKIHR5cGVkZWYgZG91YmxlIGVsZl9mcHJlZ190OwogdHlwZWRlZiBlbGZfZnByZWdfdCBlbGZfZnByZWdzZXRfdFtFTEZfTkZQUkVHXTsKIAotI2lmZGVmIENPTkZJR19NSVBTMzIKKyNpZmRlZiBDT05GSUdfMzJCSVQKIAogLyoKICAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCkBAIC0xNTMsOSArMTUzLDkgQEAKICAqLwogI2RlZmluZSBFTEZfQ0xBU1MJRUxGQ0xBU1MzMgogCi0jZW5kaWYgLyogQ09ORklHX01JUFMzMiAqLworI2VuZGlmIC8qIENPTkZJR18zMkJJVCAqLwogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogLyoKICAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCiAgKi8KQEAgLTE3Nyw3ICsxNzcsNyBAQAogICovCiAjZGVmaW5lIEVMRl9DTEFTUwlFTEZDTEFTUzY0CiAKLSNlbmRpZiAvKiBDT05GSUdfTUlQUzY0ICovCisjZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAKIC8qCiAgKiBUaGVzZSBhcmUgdXNlZCB0byBzZXQgcGFyYW1ldGVycyBpbiB0aGUgY29yZSBkdW1wcy4KQEAgLTE5Myw3ICsxOTMsNyBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCi0jaWZkZWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpCQkJXAogZG8gewkJCQkJCQlcCkBAIC0yMDIsOSArMjAyLDkgQEAKIAlzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYKTsJCQlcCiB9IHdoaWxlICgwKQogCi0jZW5kaWYgLyogQ09ORklHX01JUFMzMiAqLworI2VuZGlmIC8qIENPTkZJR18zMkJJVCAqLwogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpCQkJCVwKIGRvIHsJY3VycmVudC0+dGhyZWFkLm1mbGFncyAmPSB+TUZfQUJJX01BU0s7CQkJXApAQCAtMjIyLDcgKzIyMiw3IEBACiAJCXNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpOwkJCVwKIH0gd2hpbGUgKDApCiAKLSNlbmRpZiAvKiBDT05GSUdfTUlQUzY0ICovCisjZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAKIGV4dGVybiB2b2lkIGR1bXBfcmVncyhlbGZfZ3JlZ190ICosIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBpbnQgZHVtcF90YXNrX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgZWxmX2ZwcmVnc2V0X3QgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1taXBzL2ZjbnRsLmgKaW5kZXggMjQzNjM5Mi4uMDZjNWQxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZmNudGwuaApAQCAtOCwzMyArOCwxNiBAQAogI2lmbmRlZiBfQVNNX0ZDTlRMX0gKICNkZWZpbmUgX0FTTV9GQ05UTF9ICiAKLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJMHgwMDAzCi0jZGVmaW5lIE9fUkRPTkxZCTB4MDAwMAotI2RlZmluZSBPX1dST05MWQkweDAwMDEKLSNkZWZpbmUgT19SRFdSCQkweDAwMDIKICNkZWZpbmUgT19BUFBFTkQJMHgwMDA4CiAjZGVmaW5lIE9fU1lOQwkJMHgwMDEwCiAjZGVmaW5lIE9fTk9OQkxPQ0sJMHgwMDgwCiAjZGVmaW5lIE9fQ1JFQVQgICAgICAgICAweDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fVFJVTkMJCTB4MDIwMAkvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19FWENMCQkweDA0MDAJLyogbm90IGZjbnRsICovCiAjZGVmaW5lIE9fTk9DVFRZCTB4MDgwMAkvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgRkFTWU5DCQkweDEwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBPX0xBUkdFRklMRQkweDIwMDAJLyogYWxsb3cgbGFyZ2UgZmlsZSBvcGVucyAqLwogI2RlZmluZSBPX0RJUkVDVAkweDgwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgKi8KLSNkZWZpbmUgT19ESVJFQ1RPUlkJMHgxMDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMHgyMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTB4NDAwMDAKIAotI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCi0KLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwogI2RlZmluZSBGX0dFVExLCQkxNAogI2RlZmluZSBGX1NFVExLCQk2CiAjZGVmaW5lIEZfU0VUTEtXCTcKQEAgLTUwLDMzICszMyw2IEBACiAjZGVmaW5lIEZfU0VUTEtXNjQJMzUKICNlbmRpZgogCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KIC8qCiAgKiBUaGUgZmxhdm91cnMgb2Ygc3RydWN0IGZsb2NrLiAgInN0cnVjdCBmbG9jayIgaXMgdGhlIEFCSSBjb21wbGlhbnQKICAqIHZhcmlhbnQuICBGaW5hbGx5IHN0cnVjdCBmbG9jazY0IGlzIHRoZSBMRlMgdmFyaWFudCBvZiBzdHJ1Y3QgZmxvY2suICBBcwpAQCAtODYsNyArNDIsNyBAQAogCiAjaWZuZGVmIF9fbWlwczY0CiAKLXR5cGVkZWYgc3RydWN0IGZsb2NrIHsKK3N0cnVjdCBmbG9jayB7CiAJc2hvcnQJbF90eXBlOwogCXNob3J0CWxfd2hlbmNlOwogCV9fa2VybmVsX29mZl90IGxfc3RhcnQ7CkBAIC05NCwzMiArNTAsMTcgQEAKIAlsb25nCWxfc3lzaWQ7CiAJX19rZXJuZWxfcGlkX3QgbF9waWQ7CiAJbG9uZwlwYWRbNF07Ci19IGZsb2NrX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBmbG9jazY0IHsKLQlzaG9ydAlsX3R5cGU7Ci0Jc2hvcnQJbF93aGVuY2U7Ci0JbG9mZl90CWxfc3RhcnQ7Ci0JbG9mZl90CWxfbGVuOwotCXBpZF90CWxfcGlkOwotfSBmbG9jazY0X3Q7Ci0KLSNlbHNlIC8qIDY0LWJpdCBkZWZpbml0aW9ucyAqLwotCi10eXBlZGVmIHN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQJbF90eXBlOwotCXNob3J0CWxfd2hlbmNlOwotCV9fa2VybmVsX29mZl90IGxfc3RhcnQ7Ci0JX19rZXJuZWxfb2ZmX3QgbF9sZW47Ci0JX19rZXJuZWxfcGlkX3QgbF9waWQ7Ci19IGZsb2NrX3Q7Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIGZsb2NrNjQJCWZsb2NrCi0jZW5kaWYKKyNkZWZpbmUgSEFWRV9BUkNIX1NUUlVDVF9GTE9DSwogCiAjZW5kaWYKIAotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CisKK3R5cGVkZWYgc3RydWN0IGZsb2NrIGZsb2NrX3Q7CisjaWZuZGVmIF9fbWlwczY0Cit0eXBlZGVmIHN0cnVjdCBmbG9jazY0IGZsb2NrNjRfdDsKKyNlbmRpZgogCiAjZW5kaWYgLyogX0FTTV9GQ05UTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2ZwcmVnZGVmLmggYi9pbmNsdWRlL2FzbS1taXBzL2ZwcmVnZGVmLmgKaW5kZXggMWQ5YWEwOS4uMmI1ZmRkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9mcHJlZ2RlZi5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZnByZWdkZWYuaApAQCAtMTMsNyArMTMsNyBAQAogI2RlZmluZSBfQVNNX0ZQUkVHREVGX0gKIAogI2luY2x1ZGUgPGFzbS9zZ2lkZWZzLmg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAjaWYgX01JUFNfU0lNID09IF9NSVBTX1NJTV9BQkkzMgogCiAvKgpAQCAtNTYsNyArNTYsNyBAQAogI2RlZmluZSBmY3IzMQkkMzEgICAgICAvKiBGUFUgc3RhdHVzIHJlZ2lzdGVyICovCiAKICNlbmRpZiAvKiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTMyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAjaWYgX01JUFNfU0lNID09IF9NSVBTX1NJTV9BQkk2NCB8fCBfTUlQU19TSU0gPT0gX01JUFNfU0lNX05BQkkzMgogCiAjZGVmaW5lIGZ2MAkkZjAJLyogcmV0dXJuIHZhbHVlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2ZwdS5oIGIvaW5jbHVkZS9hc20tbWlwcy9mcHUuaAppbmRleCA2Y2IzOGQ1Li5lYTI0ZTczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2ZwdS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZnB1LmgKQEAgLTgyLDcgKzgyLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgaXNfZnB1X293bmVyKHZvaWQpCiB7Ci0JcmV0dXJuIGNwdV9oYXNfZnB1ICYmIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1VTRURGUFUpOyAKKwlyZXR1cm4gY3B1X2hhc19mcHUgJiYgdGVzdF90aHJlYWRfZmxhZyhUSUZfVVNFREZQVSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvd25fZnB1KHZvaWQpCkBAIC05MCw3ICs5MCw3IEBACiAJaWYgKGNwdV9oYXNfZnB1KSB7CiAJCV9fZW5hYmxlX2ZwdSgpOwogCQlLU1RLX1NUQVRVUyhjdXJyZW50KSB8PSBTVDBfQ1UxOwotCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1VTRURGUFUpOyAKKwkJc2V0X3RocmVhZF9mbGFnKFRJRl9VU0VERlBVKTsKIAl9CiB9CiAKQEAgLTk4LDcgKzk4LDcgQEAKIHsKIAlpZiAoY3B1X2hhc19mcHUpIHsKIAkJS1NUS19TVEFUVVMoY3VycmVudCkgJj0gflNUMF9DVTE7Ci0JCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9VU0VERlBVKTsgCisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9VU0VERlBVKTsKIAkJX19kaXNhYmxlX2ZwdSgpOwogCX0KIH0KQEAgLTEyNyw3ICsxMjcsNyBAQAogc3RhdGljIGlubGluZSBmcHVyZWdfdCAqZ2V0X2ZwdV9yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCWlmIChjcHVfaGFzX2ZwdSkgewotCQlpZiAoKHRzayA9PSBjdXJyZW50KSAmJiBpc19mcHVfb3duZXIoKSkgCisJCWlmICgodHNrID09IGN1cnJlbnQpICYmIGlzX2ZwdV9vd25lcigpKQogCQkJX3NhdmVfZnAoY3VycmVudCk7CiAJCXJldHVybiB0c2stPnRocmVhZC5mcHUuaGFyZC5mcHI7CiAJfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9mdXRleC5oIGIvaW5jbHVkZS9hc20tbWlwcy9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZWZmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0OworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9oZHJlZy5oIGIvaW5jbHVkZS9hc20tbWlwcy9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg5YmJjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSN3YXJuaW5nIHRoaXMgZmlsZSBpcyBvYnNvbGV0ZSwgcGxlYXNlIGRvIG5vdCB1c2UgaXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaHAtbGovYXNpYy5oIGIvaW5jbHVkZS9hc20tbWlwcy9ocC1sai9hc2ljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMmNhNjUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9ocC1sai9hc2ljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQotdHlwZWRlZiBlbnVtIHsgSWxsZWdhbEFzaWMsIFVua25vd25Bc2ljLCBBbmRyb3NBc2ljLCBIYXJtb255QXNpYyB9IEFzaWNJZDsKLQotQXNpY0lkIEdldEFzaWNJZCh2b2lkKTsKLQotY29uc3QgY2hhciogY29uc3QgR2V0QXNpY05hbWUodm9pZCk7Ci0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaXAzMi9tYWNlLmggYi9pbmNsdWRlL2FzbS1taXBzL2lwMzIvbWFjZS5oCmluZGV4IDJiN2IwZmQuLjQzMjAxMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvaXAzMi9tYWNlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9pcDMyL21hY2UuaApAQCAtOTQsNyArOTQsNyBAQAogCXVuc2lnbmVkIGxvbmcgeHh4OwkvKiBsYXRlci4uLiAqLwogfTsKIAotLyogCisvKgogICogRXRoZXJuZXQgaW50ZXJmYWNlCiAgKi8KIHN0cnVjdCBtYWNlX2V0aGVybmV0IHsKQEAgLTEyOSw3ICsxMjksNyBAQAogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcnhfZmlmbzsKIH07CiAKLS8qIAorLyoKICAqIFBlcmlwaGVyYWxzCiAgKi8KIApAQCAtMjUxLDcgKzI1MSw3IEBACiAJdGltZXJfcmVnIGF1ZGlvX291dDI7CiAJdGltZXJfcmVnIHZpZGVvX2luMTsKIAl0aW1lcl9yZWcgdmlkZW9faW4yOwotCXRpbWVyX3JlZyB2aWRlb19vdXQ7CQorCXRpbWVyX3JlZyB2aWRlb19vdXQ7CiB9OwogCiBzdHJ1Y3QgbWFjZV9wZXJpZiB7CkBAIC0yNzIsNyArMjcyLDcgQEAKIH07CiAKIAotLyogCisvKgogICogSVNBIHBlcmlwaGVyYWxzCiAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pcnEuaCBiL2luY2x1ZGUvYXNtLW1pcHMvaXJxLmgKaW5kZXggYjkwYjExZC4uM2YyNDcwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2lycS5oCkBAIC00OSw3ICs0OSw0IEBACiAKIGV4dGVybiB2b2lkIGFyY2hfaW5pdF9pcnEodm9pZCk7CiAKLXN0cnVjdCBpcnFhY3Rpb247Ci1pbnQgaGFuZGxlX0lSUV9ldmVudCh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICosIHN0cnVjdCBpcnFhY3Rpb24gKik7Ci0KICNlbmRpZiAvKiBfQVNNX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2xhc2F0L3NlcmlhbC5oIGIvaW5jbHVkZS9hc20tbWlwcy9sYXNhdC9zZXJpYWwuaAppbmRleCAyMWQwZmI3Li45ZTg4Yzc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2xhc2F0L3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbGFzYXQvc2VyaWFsLmgKQEAgLTEsMTMgKzEsMTMgQEAKICNpbmNsdWRlIDxhc20vbGFzYXQvbGFzYXQuaD4KIAogLyogTGFzYXQgMTAwIGJvYXJkcyBzZXJpYWwgY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBMQVNBVF9CQVNFX0JBVURfMTAwIAkJKCA3MzcyODAwIC8gMTYgKSAKKyNkZWZpbmUgTEFTQVRfQkFTRV9CQVVEXzEwMCAJCSggNzM3MjgwMCAvIDE2ICkKICNkZWZpbmUgTEFTQVRfVUFSVF9SRUdTX0JBU0VfMTAwCTB4MWM4YjAwMDAKICNkZWZpbmUgTEFTQVRfVUFSVF9SRUdTX1NISUZUXzEwMAkyCiAjZGVmaW5lIExBU0FUSU5UX1VBUlRfMTAwCQk4CiAKIC8qICogTEFTQVQgMjAwIGJvYXJkcyBzZXJpYWwgY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBMQVNBVF9CQVNFX0JBVURfMjAwCQkoMTAwMDAwMDAwIC8gMTYgLyAxMikgCisjZGVmaW5lIExBU0FUX0JBU0VfQkFVRF8yMDAJCSgxMDAwMDAwMDAgLyAxNiAvIDEyKQogI2RlZmluZSBMQVNBVF9VQVJUX1JFR1NfQkFTRV8yMDAJKFZyYzUwNzRfUEhZU19CQVNFICsgMHgwMzAwKQogI2RlZmluZSBMQVNBVF9VQVJUX1JFR1NfU0hJRlRfMjAwCTMKICNkZWZpbmUgTEFTQVRJTlRfVUFSVF8yMDAJCTEzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2xvY2FsLmggYi9pbmNsdWRlL2FzbS1taXBzL2xvY2FsLmgKaW5kZXggN2ViNmJmNi4uYzM4ODQ0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9sb2NhbC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbG9jYWwuaApAQCAtNSw3ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAKIHR5cGVkZWYgYXRvbWljX3QgbG9jYWxfdDsKIApAQCAtMjAsNyArMjAsNyBAQAogCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAogdHlwZWRlZiBhdG9taWM2NF90IGxvY2FsX3Q7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxMDAwLmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2F1MTAwMC5oCmluZGV4IDJiMzZlYTMuLjE0OGJhZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxMDAwLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTEwMDAuaApAQCAtMTM4Myw3ICsxMzgzLDcgQEAKICNkZWZpbmUgUENJX0lPX1NUQVJUICAgIDAKICNkZWZpbmUgUENJX0lPX0VORCAgICAgIDAKICNkZWZpbmUgUENJX01FTV9TVEFSVCAgIDAKLSNkZWZpbmUgUENJX01FTV9FTkQgICAgIDAgCisjZGVmaW5lIFBDSV9NRU1fRU5EICAgICAwCiAjZGVmaW5lIFBDSV9GSVJTVF9ERVZGTiAwCiAjZGVmaW5lIFBDSV9MQVNUX0RFVkZOICAwCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1kYjF4MDAvZGIxeDAwLmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtZGIxeDAwL2RiMXgwMC5oCmluZGV4IDQ2OTEzOTguLmVmYWZlNjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1kYjF4MDAvZGIxeDAwLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWRiMXgwMC9kYjF4MDAuaApAQCAtMjMsNyArMjMsNyBAQAogICoKICAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICoKLSAqIAorICoKICAqLwogI2lmbmRlZiBfX0FTTV9EQjFYMDBfSAogI2RlZmluZSBfX0FTTV9EQjFYMDBfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMvc3BhY2VzLmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9zcGFjZXMuaAppbmRleCA2M2MwYTgxLi41YTJjMWVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9zcGFjZXMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9zcGFjZXMuaApAQCAtMTIsNyArMTIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAKICNkZWZpbmUgQ0FDX0JBU0UJCTB4ODAwMDAwMDAKICNkZWZpbmUgSU9fQkFTRQkJCTB4YTAwMDAwMDAKQEAgLTMyLDkgKzMyLDkgQEAKICNkZWZpbmUgSElHSE1FTV9TVEFSVAkJMHgyMDAwMDAwMFVMCiAjZW5kaWYKIAotI2VuZGlmIC8qIENPTkZJR19NSVBTMzIgKi8KKyNlbmRpZiAvKiBDT05GSUdfMzJCSVQgKi8KIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAogLyoKICAqIFRoaXMgaGFuZGxlcyB0aGUgbWVtb3J5IG1hcC4KQEAgLTY3LDYgKzY3LDYgQEAKICNkZWZpbmUgVE9fQ0FDKHgpCQkoQ0FDX0JBU0UgICB8ICgoeCkgJiBUT19QSFlTX01BU0spKQogI2RlZmluZSBUT19VTkNBQyh4KQkJKFVOQ0FDX0JBU0UgfCAoKHgpICYgVE9fUEhZU19NQVNLKSkKIAotI2VuZGlmIC8qIENPTkZJR19NSVBTNjQgKi8KKyNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAogI2VuZGlmIC8qIF9fQVNNX01BQ0hfR0VORVJJQ19TUEFDRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjIvc3BhY2VzLmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyMi9zcGFjZXMuaAppbmRleCAzMGQ0MmZjLi5lOTYxNjZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyMi9zcGFjZXMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyMi9zcGFjZXMuaApAQCAtMTIsNyArMTIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAKICNkZWZpbmUgQ0FDX0JBU0UJCTB4ODAwMDAwMDAKICNkZWZpbmUgSU9fQkFTRQkJCTB4YTAwMDAwMDAKQEAgLTMyLDkgKzMyLDkgQEAKICNkZWZpbmUgSElHSE1FTV9TVEFSVAkJMHgyMDAwMDAwMFVMCiAjZW5kaWYKIAotI2VuZGlmIC8qIENPTkZJR19NSVBTMzIgKi8KKyNlbmRpZiAvKiBDT05GSUdfMzJCSVQgKi8KIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKICNkZWZpbmUgUEFHRV9PRkZTRVQJCTB4ZmZmZmZmZmY4MDAwMDAwMFVMCiAKICNpZm5kZWYgSElHSE1FTV9TVEFSVApAQCAtNTAsNiArNTAsNiBAQAogI2RlZmluZSBUT19DQUMoeCkJCShDQUNfQkFTRSAgIHwgKCh4KSAmIFRPX1BIWVNfTUFTSykpCiAjZGVmaW5lIFRPX1VOQ0FDKHgpCQkoVU5DQUNfQkFTRSB8ICgoeCkgJiBUT19QSFlTX01BU0spKQogCi0jZW5kaWYgLyogQ09ORklHX01JUFM2NCAqLworI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCiAjZW5kaWYgLyogX19BU01fTUFDSF9JUDIyX1NQQUNFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAzMi9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDMyL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmluZGV4IGI5MzIyMzcuLjA0NzEzOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDMyL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDMyL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBzbywgZm9yIDY0Yml0IElQMzIga2VybmVsIHdlIGp1c3QgZG9uJ3QgdXNlIGxsL3NjLgogICogVGhpcyBkb2VzIG5vdCBhZmZlY3QgbHVzZXJsYW5kLgogICovCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1I1MDAwKSAmJiBkZWZpbmVkKENPTkZJR19NSVBTNjQpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1I1MDAwKSAmJiBkZWZpbmVkKENPTkZJR182NEJJVCkKICNkZWZpbmUgY3B1X2hhc19sbHNjCQkwCiAjZWxzZQogI2RlZmluZSBjcHVfaGFzX2xsc2MJCTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1qYXp6L2Zsb3BweS5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWphenovZmxvcHB5LmgKaW5kZXggOGNmMGQwNC4uYzlkYWQ5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWphenovZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWphenovZmxvcHB5LmgKQEAgLTkyLDcgKzkyLDcgQEAKIAlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwKIAkgICAgICAgICAgICAgICAgICAgU0FfSU5URVJSVVBUIHwgU0FfU0FNUExFX1JBTkRPTSwgImZsb3BweSIsIE5VTEwpOwogfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwogc3RhdGljIGlubGluZSB2b2lkIGZkX2ZyZWVfaXJxKHZvaWQpCiB7CiAJZnJlZV9pcnEoRkxPUFBZX0lSUSwgTlVMTCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcGIxeDAwL3BiMTUwMC5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBiMXgwMC9wYjE1MDAuaAppbmRleCBkNmM3Nzk3NC4uZmY2ZDQwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBiMXgwMC9wYjE1MDAuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtcGIxeDAwL3BiMTUwMC5oCkBAIC0zMywxMSArMzMsMTEgQEAKICNkZWZpbmUgUENJX0JPQVJEX1JFRyAgICAgICAgICAgICAweEFFMDAwMDEwCiAjZGVmaW5lIFBDTUNJQV9CT0FSRF9SRUcgICAgICAgICAgMHhBRTAwMDAxMAogICAjZGVmaW5lIFBDX0RFQVNTRVJUX1JTVCAgICAgICAgICAgICAgIDB4ODAKLSAgI2RlZmluZSBQQ19EUlZfRU4gICAgICAgICAgICAgICAgICAgICAweDEwIAorICAjZGVmaW5lIFBDX0RSVl9FTiAgICAgICAgICAgICAgICAgICAgIDB4MTAKICNkZWZpbmUgUEIxNTAwX0dfQ09OVFJPTCAgICAgICAgICAweEFFMDAwMDE0CiAjZGVmaW5lIFBCMTUwMF9SU1RfVkRESSAgICAgICAgICAgMHhBRTAwMDAxQwogI2RlZmluZSBQQjE1MDBfTEVEUyAgICAgICAgICAgICAgIDB4QUUwMDAwMTgKLSAgCisKICNkZWZpbmUgUEIxNTAwX0hFWF9MRUQgICAgICAgICAgICAweEFGMDAwMDA0CiAjZGVmaW5lIFBCMTUwMF9IRVhfTEVEX0JMQU5LICAgICAgMHhBRjAwMDAwOAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcWVtdS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1xZW11L2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZTM3MGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtcWVtdS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJhbGYgQmFlY2hsZQorICovCisjaWZuZGVmIF9fQVNNX01BQ0hfUUVNVV9DUFVfRkVBVFVSRV9PVkVSUklERVNfSAorI2RlZmluZSBfX0FTTV9NQUNIX1FFTVVfQ1BVX0ZFQVRVUkVfT1ZFUlJJREVTX0gKKworLyoKKyAqIFFFTVUgb25seSBjb21lcyB3aXRoIGEgaGF6YXJkLWZyZWUgTUlQUzMyIHByb2Nlc3Nvciwgc28gdGhpbmdzIGFyZSBlYXN5LgorICovCisjZGVmaW5lIGNwdV9oYXNfbWlwczE2CQkwCisjZGVmaW5lIGNwdV9oYXNfZGl2ZWMJCTAKKyNkZWZpbmUgY3B1X2hhc19jYWNoZV9jZGV4X3AJMAorI2RlZmluZSBjcHVfaGFzX3ByZWZldGNoCTAKKyNkZWZpbmUgY3B1X2hhc19tY2hlY2sJCTAKKyNkZWZpbmUgY3B1X2hhc19lanRhZwkJMAorCisjZGVmaW5lIGNwdV9oYXNfbGxzYwkJMQorI2RlZmluZSBjcHVfaGFzX3Z0YWdfaWNhY2hlCTAKKyNkZWZpbmUgY3B1X2hhc19kY19hbGlhc2VzCShQQUdFX1NJWkUgPCAweDQwMDApCisjZGVmaW5lIGNwdV9oYXNfaWNfZmlsbHNfZl9kYwkwCisKKyNkZWZpbmUgY3B1X2hhc19kc3AJCTAKKworI2RlZmluZSBjcHVfaGFzX25vZnB1ZXgJCTAKKyNkZWZpbmUgY3B1X2hhc182NGJpdHMJCTAKKworI2VuZGlmIC8qIF9fQVNNX01BQ0hfUUVNVV9DUFVfRkVBVFVSRV9PVkVSUklERVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXFlbXUvcGFyYW0uaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1xZW11L3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzMGVlNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1xZW11L3BhcmFtLmgKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBSYWxmIEJhZWNobGUKKyAqLworI2lmbmRlZiBfX0FTTV9NQUNIX1FFTVVfUEFSQU1fSAorI2RlZmluZSBfX0FTTV9NQUNIX1FFTVVfUEFSQU1fSAorCisjZGVmaW5lIEhaCQkxMDAJCS8qIEludGVybmFsIGtlcm5lbCB0aW1lciBmcmVxdWVuY3kgKi8KKworI2VuZGlmIC8qIF9fQVNNX01BQ0hfUUVNVV9QQVJBTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdnI0MXh4L3RpbWV4LmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtdnI0MXh4L3RpbWV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNzE0ODUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXZyNDF4eC90aW1leC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMyBieSBSYWxmIEJhZWNobGUKLSAqLwotLyoKLSAqIENoYW5nZXM6Ci0gKiAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KLSAqICAtIENMT0NLX1RJQ0tfUkFURSBpcyBjaGFuZ2VkIGludG8gMzI3NjggZnJvbSA2MTQ0MDAwLgotICovCi0jaWZuZGVmIF9fQVNNX01BQ0hfVlI0MVhYX1RJTUVYX0gKLSNkZWZpbmUgX19BU01fTUFDSF9WUjQxWFhfVElNRVhfSAotCi0jZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkJMzI3NjgKLQotI2VuZGlmIC8qIF9fQVNNX01BQ0hfVlI0MVhYX1RJTUVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbW11X2NvbnRleHQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbW11X2NvbnRleHQuaAppbmRleCA0OGI3N2M5Li40NWNkNzJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tbXVfY29udGV4dC5oCkBAIC0yOCwxNyArMjgsMTcgQEAKICNkZWZpbmUgVExCTUlTU19IQU5ETEVSX1NFVFVQX1BHRChwZ2QpIFwKIAlwZ2RfY3VycmVudFtzbXBfcHJvY2Vzc29yX2lkKCldID0gKHVuc2lnbmVkIGxvbmcpKHBnZCkKIAotI2lmZGVmIENPTkZJR19NSVBTMzIKKyNpZmRlZiBDT05GSUdfMzJCSVQKICNkZWZpbmUgVExCTUlTU19IQU5ETEVSX1NFVFVQKCkJCQkJCQlcCiAJd3JpdGVfYzBfY29udGV4dCgodW5zaWduZWQgbG9uZykgc21wX3Byb2Nlc3Nvcl9pZCgpIDw8IDIzKTsJXAogCVRMQk1JU1NfSEFORExFUl9TRVRVUF9QR0Qoc3dhcHBlcl9wZ19kaXIpCiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTNjQpICYmICFkZWZpbmVkKENPTkZJR19CVUlMRF9FTEY2NCkKKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgJiYgIWRlZmluZWQoQ09ORklHX0JVSUxEX0VMRjY0KQogI2RlZmluZSBUTEJNSVNTX0hBTkRMRVJfU0VUVVAoKQkJCQkJCVwKIAl3cml0ZV9jMF9jb250ZXh0KCh1bnNpZ25lZCBsb25nKSAmcGdkX2N1cnJlbnRbc21wX3Byb2Nlc3Nvcl9pZCgpXSA8PCAyMyk7IFwKIAlUTEJNSVNTX0hBTkRMRVJfU0VUVVBfUEdEKHN3YXBwZXJfcGdfZGlyKQogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfTUlQUzY0KSAmJiBkZWZpbmVkKENPTkZJR19CVUlMRF9FTEY2NCkKKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgJiYgZGVmaW5lZChDT05GSUdfQlVJTERfRUxGNjQpCiAjZGVmaW5lIFRMQk1JU1NfSEFORExFUl9TRVRVUCgpCQkJCQkJXAogCXdyaXRlX2MwX2NvbnRleHQoKHVuc2lnbmVkIGxvbmcpIHNtcF9wcm9jZXNzb3JfaWQoKSA8PCAyMyk7CVwKIAlUTEJNSVNTX0hBTkRMRVJfU0VUVVBfUEdEKHN3YXBwZXJfcGdfZGlyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tb2R1bGUuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbW9kdWxlLmgKaW5kZXggOTBlZTI0YS4uMGJlNThiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tb2R1bGUuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21vZHVsZS5oCkBAIC0yNSw3ICsyNSw3IEBACiAgIEVsZjY0X1N4d29yZCByX2FkZGVuZDsJCS8qIEFkZGVuZC4gICovCiB9IEVsZjY0X01pcHNfUmVsYTsKIAotI2lmZGVmIENPTkZJR19NSVBTMzIKKyNpZmRlZiBDT05GSUdfMzJCSVQKIAogI2RlZmluZSBFbGZfU2hkcglFbGYzMl9TaGRyCiAjZGVmaW5lIEVsZl9TeW0JCUVsZjMyX1N5bQpAQCAtMzMsNyArMzMsNyBAQAogCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAogI2RlZmluZSBFbGZfU2hkcglFbGY2NF9TaGRyCiAjZGVmaW5lIEVsZl9TeW0JCUVsZjY0X1N5bQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tc2didWYuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbXNnYnVmLmgKaW5kZXggNTEzYjI4Mi4uYTE1MzM5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tc2didWYuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21zZ2J1Zi5oCkBAIC0xNSwyNSArMTUsMjUgQEAKIAogc3RydWN0IG1zcWlkNjRfZHMgewogCXN0cnVjdCBpcGM2NF9wZXJtIG1zZ19wZXJtOwotI2lmIGRlZmluZWQoQ09ORklHX01JUFMzMikgJiYgIWRlZmluZWQoQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOKQorI2lmIGRlZmluZWQoQ09ORklHXzMyQklUKSAmJiAhZGVmaW5lZChDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4pCiAJdW5zaWduZWQgbG9uZwlfX3VudXNlZDE7CiAjZW5kaWYKIAlfX2tlcm5lbF90aW1lX3QgbXNnX3N0aW1lOwkvKiBsYXN0IG1zZ3NuZCB0aW1lICovCi0jaWYgZGVmaW5lZChDT05GSUdfTUlQUzMyKSAmJiBkZWZpbmVkKENPTkZJR19DUFVfTElUVExFX0VORElBTikKKyNpZiBkZWZpbmVkKENPTkZJR18zMkJJVCkgJiYgZGVmaW5lZChDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4pCiAJdW5zaWduZWQgbG9uZwlfX3VudXNlZDE7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTMzIpICYmICFkZWZpbmVkKENPTkZJR19DUFVfTElUVExFX0VORElBTikKKyNpZiBkZWZpbmVkKENPTkZJR18zMkJJVCkgJiYgIWRlZmluZWQoQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOKQogCXVuc2lnbmVkIGxvbmcJX191bnVzZWQyOwogI2VuZGlmCiAJX19rZXJuZWxfdGltZV90IG1zZ19ydGltZTsJLyogbGFzdCBtc2dyY3YgdGltZSAqLwotI2lmIGRlZmluZWQoQ09ORklHX01JUFMzMikgJiYgZGVmaW5lZChDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4pCisjaWYgZGVmaW5lZChDT05GSUdfMzJCSVQpICYmIGRlZmluZWQoQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOKQogCXVuc2lnbmVkIGxvbmcJX191bnVzZWQyOwogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfTUlQUzMyKSAmJiAhZGVmaW5lZChDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4pCisjaWYgZGVmaW5lZChDT05GSUdfMzJCSVQpICYmICFkZWZpbmVkKENPTkZJR19DUFVfTElUVExFX0VORElBTikKIAl1bnNpZ25lZCBsb25nCV9fdW51c2VkMzsKICNlbmRpZgogCV9fa2VybmVsX3RpbWVfdCBtc2dfY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTMzIpICYmIGRlZmluZWQoQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOKQorI2lmIGRlZmluZWQoQ09ORklHXzMyQklUKSAmJiBkZWZpbmVkKENPTkZJR19DUFVfTElUVExFX0VORElBTikKIAl1bnNpZ25lZCBsb25nCV9fdW51c2VkMzsKICNlbmRpZgogCXVuc2lnbmVkIGxvbmcgIG1zZ19jYnl0ZXM7CS8qIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIG9uIHF1ZXVlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcGFjY2Vzcy5oCmluZGV4IDM2Y2VjOWUuLjMwOWJjMzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGFjY2Vzcy5oCkBAIC0xNiwxMCArMTYsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCi0jaWZkZWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogI2RlZmluZSBfX1BBX0FERFIJIi53b3JkIgogI2VuZGlmCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogI2RlZmluZSBfX1BBX0FERFIJIi5kd29yZCIKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcGFnZS5oCmluZGV4IDVjYWUzNWMuLjY1MmI2ZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGFnZS5oCkBAIC0xMDMsMjAgKzEwMyw2IEBACiAjZGVmaW5lIF9fcGdkKHgpCSgocGdkX3QpIHsgKHgpIH0gKQogI2RlZmluZSBfX3BncHJvdCh4KQkoKHBncHJvdF90KSB7ICh4KSB9ICkKIAotLyogUHVyZSAyXm4gdmVyc2lvbiBvZiBnZXRfb3JkZXIgKi8KLXN0YXRpYyBfX2lubGluZV9fIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBvcmRlcjsKLQotCXNpemUgPSAoc2l6ZS0xKSA+PiAoUEFHRV9TSElGVC0xKTsKLQlvcmRlciA9IC0xOwotCWRvIHsKLQkJc2l6ZSA+Pj0gMTsKLQkJb3JkZXIrKzsKLQl9IHdoaWxlIChzaXplKTsKLQlyZXR1cm4gb3JkZXI7Ci19Ci0KICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKIC8qIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIHRoZSAobmV4dCkgcGFnZSBib3VuZGFyeSAqLwpAQCAtMTQ4LDQgKzEzNCw2IEBACiAjZGVmaW5lIFdBTlRfUEFHRV9WSVJUVUFMCiAjZW5kaWYKIAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KKwogI2VuZGlmIC8qIF9BU01fUEFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BjaS5oIGIvaW5jbHVkZS9hc20tbWlwcy9wY2kuaAppbmRleCBkNzBkYzM1Li5jOWEwMGNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGNpLmgKQEAgLTk0LDcgKzk0LDcgQEAKICAqLwogZXh0ZXJuIHVuc2lnbmVkIGludCBQQ0lfRE1BX0JVU19JU19QSFlTOwogCi0jaWZkZWYgQ09ORklHX01BUFBFRF9ETUFfSU8KKyNpZmRlZiBDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURQogCiAvKiBwY2lfdW5tYXBfe3NpbmdsZSxwYWdlfSBpcyBub3QgYSBub3AsIHRodXMuLi4gKi8KICNkZWZpbmUgREVDTEFSRV9QQ0lfVU5NQVBfQUREUihBRERSX05BTUUpCWRtYV9hZGRyX3QgQUREUl9OQU1FOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAjZGVmaW5lIHBjaV91bm1hcF9sZW4oUFRSLCBMRU5fTkFNRSkJCSgoUFRSKS0+TEVOX05BTUUpCiAjZGVmaW5lIHBjaV91bm1hcF9sZW5fc2V0KFBUUiwgTEVOX05BTUUsIFZBTCkJKCgoUFRSKS0+TEVOX05BTUUpID0gKFZBTCkpCiAKLSNlbHNlIC8qIENPTkZJR19NQVBQRURfRE1BX0lPICAqLworI2Vsc2UgLyogQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEUgICovCiAKIC8qIHBjaV91bm1hcF97cGFnZSxzaW5nbGV9IGlzIGEgbm9wIHNvLi4uICovCiAjZGVmaW5lIERFQ0xBUkVfUENJX1VOTUFQX0FERFIoQUREUl9OQU1FKQpAQCAtMTE0LDcgKzExNCw3IEBACiAjZGVmaW5lIHBjaV91bm1hcF9sZW4oUFRSLCBMRU5fTkFNRSkJCSgwKQogI2RlZmluZSBwY2lfdW5tYXBfbGVuX3NldChQVFIsIExFTl9OQU1FLCBWQUwpCWRvIHsgfSB3aGlsZSAoMCkKIAotI2VuZGlmIC8qIENPTkZJR19NQVBQRURfRE1BX0lPICAqLworI2VuZGlmIC8qIENPTkZJR19ETUFfTkVFRF9QQ0lfTUFQX1NUQVRFICAqLwogCiAvKiBUaGlzIGlzIGFsd2F5cyBmaW5lLiAqLwogI2RlZmluZSBwY2lfZGFjX2RtYV9zdXBwb3J0ZWQocGNpX2RldiwgbWFzaykJKDEpCkBAIC0xNDIsNiArMTQyLDggQEAKIAogZXh0ZXJuIHZvaWQgcGNpYmlvc19yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9kZXYgKmRldiwKIAlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbiwgc3RydWN0IHJlc291cmNlICpyZXMpOworZXh0ZXJuIHZvaWQgcGNpYmlvc19idXNfdG9fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24pOwogCiAjaWZkZWYgQ09ORklHX1BDSV9ET01BSU5TCiAKQEAgLTE2Nyw0ICsxNjksMTcgQEAKIC8qIERvIHBsYXRmb3JtIHNwZWNpZmljIGRldmljZSBpbml0aWFsaXphdGlvbiBhdCBwY2lfZW5hYmxlX2RldmljZSgpIHRpbWUgKi8KIGV4dGVybiBpbnQgcGNpYmlvc19wbGF0X2Rldl9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZXNvdXJjZSAqCitwY2liaW9zX3NlbGVjdF9yb290KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QgPSBOVUxMOworCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQlyb290ID0gJmlvcG9ydF9yZXNvdXJjZTsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlyb290ID0gJmlvbWVtX3Jlc291cmNlOworCisJcmV0dXJuIHJvb3Q7Cit9CisKICNlbmRpZiAvKiBfQVNNX1BDSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcGdhbGxvYy5oCmluZGV4IDJkNjNmNWIuLmNlNTcyODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGdhbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGdhbGxvYy5oCkBAIC04NSw3ICs4NSw3IEBACiAKICNkZWZpbmUgX19wdGVfZnJlZV90bGIodGxiLHB0ZSkJCXRsYl9yZW1vdmVfcGFnZSgodGxiKSwocHRlKSkKIAotI2lmZGVmIENPTkZJR19NSVBTMzIKKyNpZmRlZiBDT05GSUdfMzJCSVQKICNkZWZpbmUgcGdkX3BvcHVsYXRlKG1tLCBwbWQsIHB0ZSkJQlVHKCkKIAogLyoKQEAgLTk3LDcgKzk3LDcgQEAKICNkZWZpbmUgX19wbWRfZnJlZV90bGIodGxiLHgpCQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAogI2RlZmluZSBwZ2RfcG9wdWxhdGUobW0sIHBnZCwgcG1kKQlzZXRfcGdkKHBnZCwgX19wZ2QocG1kKSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUuaAppbmRleCBlNzZjY2Q2Li5kYmUxM2RhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUuaApAQCAtMTEsMTAgKzExLDEwIEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvNGxldmVsLWZpeHVwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAjaW5jbHVkZSA8YXNtL3BndGFibGUtMzIuaD4KICNlbmRpZgotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKICNpbmNsdWRlIDxhc20vcGd0YWJsZS02NC5oPgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1taXBzL3Byb2Nlc3Nvci5oCmluZGV4IDEzYzU0ZDUuLmQ2NDY2YWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wcm9jZXNzb3IuaApAQCAtMzMsNyArMzMsNyBAQAogCiBleHRlcm4gdW5zaWduZWQgaW50IHZjZWRfY291bnQsIHZjZWlfY291bnQ7CiAKLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAvKgogICogVXNlciBzcGFjZSBwcm9jZXNzIHNpemU6IDJHQi4gVGhpcyBpcyBoYXJkY29kZWQgaW50byBhIGZldyBwbGFjZXMsCiAgKiBzbyBkb24ndCBjaGFuZ2UgaXQgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KQEAgLTQ3LDcgKzQ3LDcgQEAKICNkZWZpbmUgVEFTS19VTk1BUFBFRF9CQVNFCShQQUdFX0FMSUdOKFRBU0tfU0laRSAvIDMpKQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiAvKgogICogVXNlciBzcGFjZSBwcm9jZXNzIHNpemU6IDFUQi4gVGhpcyBpcyBoYXJkY29kZWQgaW50byBhIGZldyBwbGFjZXMsCiAgKiBzbyBkb24ndCBjaGFuZ2UgaXQgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gIFRBU0tfU0laRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcHRyYWNlLmgKaW5kZXggZDNjNDZkNi4uMmI1YzYyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3B0cmFjZS5oCkBAIC0yOCw3ICsyOCw3IEBACiAgKiBzeXN0ZW0gY2FsbC9leGNlcHRpb24uIEFzIHVzdWFsIHRoZSByZWdpc3RlcnMgazAvazEgYXJlbid0IGJlaW5nIHNhdmVkLgogICovCiBzdHJ1Y3QgcHRfcmVncyB7Ci0jaWZkZWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogCS8qIFBhZCBieXRlcyBmb3IgYXJndW1lbnQgc2F2ZSBzcGFjZSBvbiB0aGUgc3RhY2suICovCiAJdW5zaWduZWQgbG9uZyBwYWQwWzZdOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3FlbXUuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcWVtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWMzOTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3FlbXUuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKKyAqLworI2lmbmRlZiBfX0FTTV9RRU1VX0gKKyNkZWZpbmUgX19BU01fUUVNVV9ICisKKy8qCisgKiBJbnRlcnJ1cHQgbnVtYmVycworICovCisjZGVmaW5lIFFfUElDX0lSUV9CQVNFCQkwCisjZGVmaW5lIFFfQ09VTlRfQ09NUEFSRV9JUlEJMTYKKworLyoKKyAqIFFlbXUgY2xvY2sgcmF0ZS4gIFVubGlrZSBvbiByZWFsIE1JUFMgdGhpcyBoYXMgbm8gcmVsYXRpb24gdG8gdGhlCisgKiBpbnN0cnVjdGlvbiBpc3N1ZSByYXRlLCBzbyB0aGUgY2hvb3NlbiB2YWx1ZSBpcyBwdXJlIGZpY3Rpb24sIGp1c3QgbmVlZHMKKyAqIHRvIG1hdGNoIHRoZSB2YWx1ZSBpbiBRZW11IGl0c2VsZi4KKyAqLworI2RlZmluZSBRRU1VX0MwX0NPVU5URVJfQ0xPQ0sJMTAwMDAwMDAwCisKKyNlbmRpZiAvKiBfX0FTTV9RRU1VX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcjRrY2FjaGUuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcjRrY2FjaGUuaAppbmRleCBkYTAzYTMyLi41YmVhNDlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3I0a2NhY2hlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9yNGtjYWNoZS5oCkBAIC0xNzEsMTEgKzE3MSwxMSBAQAogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBJTkRFWF9CQVNFOwogCXVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzaXplOwogCXVuc2lnbmVkIGxvbmcgd3NfaW5jID0gMVVMIDw8IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheWJpdDsKLQl1bnNpZ25lZCBsb25nIHdzX2VuZCA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMgPDwgCisJdW5zaWduZWQgbG9uZyB3c19lbmQgPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzIDw8CiAJICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXliaXQ7CiAJdW5zaWduZWQgbG9uZyB3cywgYWRkcjsKIAotCWZvciAod3MgPSAwOyB3cyA8IHdzX2VuZDsgd3MgKz0gd3NfaW5jKSAKKwlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKIAkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHgyMDApCiAJCQljYWNoZTE2X3Vucm9sbDMyKGFkZHJ8d3MsSW5kZXhfV3JpdGViYWNrX0ludl9EKTsKIH0KQEAgLTIwMCw4ICsyMDAsOCBAQAogCSAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5Yml0OwogCXVuc2lnbmVkIGxvbmcgd3MsIGFkZHI7CiAKLQlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykgCi0JCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IDB4MjAwKSAKKwlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKKwkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHgyMDApCiAJCQljYWNoZTE2X3Vucm9sbDMyKGFkZHJ8d3MsSW5kZXhfV3JpdGViYWNrX0ludl9EKTsKIH0KIApAQCAtMjE0LDggKzIxNCw4IEBACiAJICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXliaXQ7CiAJdW5zaWduZWQgbG9uZyB3cywgYWRkcjsKIAotCWZvciAod3MgPSAwOyB3cyA8IHdzX2VuZDsgd3MgKz0gd3NfaW5jKSAKLQkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHgyMDApIAorCWZvciAod3MgPSAwOyB3cyA8IHdzX2VuZDsgd3MgKz0gd3NfaW5jKQorCQlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSAweDIwMCkKIAkJCWNhY2hlMTZfdW5yb2xsMzIoYWRkcnx3cyxJbmRleF9JbnZhbGlkYXRlX0kpOwogfQogCkBAIC0yMzksOCArMjM5LDggQEAKIAkgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheWJpdDsKIAl1bnNpZ25lZCBsb25nIHdzLCBhZGRyOwogCi0JZm9yICh3cyA9IDA7IHdzIDwgd3NfZW5kOyB3cyArPSB3c19pbmMpIAotCQlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSAweDIwMCkgCisJZm9yICh3cyA9IDA7IHdzIDwgd3NfZW5kOyB3cyArPSB3c19pbmMpCisJCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IDB4MjAwKQogCQkJY2FjaGUxNl91bnJvbGwzMihhZGRyfHdzLEluZGV4X0ludmFsaWRhdGVfSSk7CiB9CiAKQEAgLTI0OSwxMSArMjQ5LDExIEBACiAJdW5zaWduZWQgbG9uZyBzdGFydCA9IElOREVYX0JBU0U7CiAJdW5zaWduZWQgbG9uZyBlbmQgPSBzdGFydCArIGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheXNpemU7CiAJdW5zaWduZWQgbG9uZyB3c19pbmMgPSAxVUwgPDwgY3VycmVudF9jcHVfZGF0YS5zY2FjaGUud2F5Yml0OwotCXVuc2lnbmVkIGxvbmcgd3NfZW5kID0gY3VycmVudF9jcHVfZGF0YS5zY2FjaGUud2F5cyA8PCAKKwl1bnNpZ25lZCBsb25nIHdzX2VuZCA9IGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheXMgPDwKIAkgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheWJpdDsKIAl1bnNpZ25lZCBsb25nIHdzLCBhZGRyOwogCi0JZm9yICh3cyA9IDA7IHdzIDwgd3NfZW5kOyB3cyArPSB3c19pbmMpIAorCWZvciAod3MgPSAwOyB3cyA8IHdzX2VuZDsgd3MgKz0gd3NfaW5jKQogCQlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSAweDIwMCkKIAkJCWNhY2hlMTZfdW5yb2xsMzIoYWRkcnx3cyxJbmRleF9Xcml0ZWJhY2tfSW52X1NEKTsKIH0KQEAgLTI3OCw4ICsyNzgsOCBAQAogCSAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9jcHVfZGF0YS5zY2FjaGUud2F5Yml0OwogCXVuc2lnbmVkIGxvbmcgd3MsIGFkZHI7CiAKLQlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykgCi0JCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IDB4MjAwKSAKKwlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKKwkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHgyMDApCiAJCQljYWNoZTE2X3Vucm9sbDMyKGFkZHJ8d3MsSW5kZXhfV3JpdGViYWNrX0ludl9TRCk7CiB9CiAKQEAgLTMxOCw4ICszMTgsOCBAQAogCSAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5Yml0OwogCXVuc2lnbmVkIGxvbmcgd3MsIGFkZHI7CiAKLQlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykgCi0JCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IDB4NDAwKSAKKwlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKKwkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHg0MDApCiAJCQljYWNoZTMyX3Vucm9sbDMyKGFkZHJ8d3MsSW5kZXhfV3JpdGViYWNrX0ludl9EKTsKIH0KIApAQCAtMzQzLDggKzM0Myw4IEBACiAJICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXliaXQ7CiAJdW5zaWduZWQgbG9uZyB3cywgYWRkcjsKIAotCWZvciAod3MgPSAwOyB3cyA8IHdzX2VuZDsgd3MgKz0gd3NfaW5jKSAKLQkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHg0MDApIAorCWZvciAod3MgPSAwOyB3cyA8IHdzX2VuZDsgd3MgKz0gd3NfaW5jKQorCQlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSAweDQwMCkKIAkJCWNhY2hlMzJfdW5yb2xsMzIoYWRkcnx3cyxJbmRleF9Xcml0ZWJhY2tfSW52X0QpOwogfQogCkBAIC0zNTcsOCArMzU3LDggQEAKIAkgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheWJpdDsKIAl1bnNpZ25lZCBsb25nIHdzLCBhZGRyOwogCi0JZm9yICh3cyA9IDA7IHdzIDwgd3NfZW5kOyB3cyArPSB3c19pbmMpIAotCQlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSAweDQwMCkgCisJZm9yICh3cyA9IDA7IHdzIDwgd3NfZW5kOyB3cyArPSB3c19pbmMpCisJCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IDB4NDAwKQogCQkJY2FjaGUzMl91bnJvbGwzMihhZGRyfHdzLEluZGV4X0ludmFsaWRhdGVfSSk7CiB9CiAKQEAgLTM4Myw3ICszODMsNyBAQAogCXVuc2lnbmVkIGxvbmcgd3MsIGFkZHI7CiAKIAlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKLQkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHg0MDApIAorCQlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSAweDQwMCkKIAkJCWNhY2hlMzJfdW5yb2xsMzIoYWRkcnx3cyxJbmRleF9JbnZhbGlkYXRlX0kpOwogfQogCkBAIC0zOTIsMTEgKzM5MiwxMSBAQAogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBJTkRFWF9CQVNFOwogCXVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS53YXlzaXplOwogCXVuc2lnbmVkIGxvbmcgd3NfaW5jID0gMVVMIDw8IGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheWJpdDsKLQl1bnNpZ25lZCBsb25nIHdzX2VuZCA9IGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheXMgPDwgCisJdW5zaWduZWQgbG9uZyB3c19lbmQgPSBjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS53YXlzIDw8CiAJICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS53YXliaXQ7CiAJdW5zaWduZWQgbG9uZyB3cywgYWRkcjsKIAotCWZvciAod3MgPSAwOyB3cyA8IHdzX2VuZDsgd3MgKz0gd3NfaW5jKSAKKwlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKIAkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHg0MDApCiAJCQljYWNoZTMyX3Vucm9sbDMyKGFkZHJ8d3MsSW5kZXhfV3JpdGViYWNrX0ludl9TRCk7CiB9CkBAIC00MjEsOCArNDIxLDggQEAKIAkgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheWJpdDsKIAl1bnNpZ25lZCBsb25nIHdzLCBhZGRyOwogCi0JZm9yICh3cyA9IDA7IHdzIDwgd3NfZW5kOyB3cyArPSB3c19pbmMpIAotCQlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSAweDQwMCkgCisJZm9yICh3cyA9IDA7IHdzIDwgd3NfZW5kOyB3cyArPSB3c19pbmMpCisJCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IDB4NDAwKQogCQkJY2FjaGUzMl91bnJvbGwzMihhZGRyfHdzLEluZGV4X1dyaXRlYmFja19JbnZfU0QpOwogfQogCkBAIC00NjEsOCArNDYxLDggQEAKIAkgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheWJpdDsKIAl1bnNpZ25lZCBsb25nIHdzLCBhZGRyOwogCi0JZm9yICh3cyA9IDA7IHdzIDwgd3NfZW5kOyB3cyArPSB3c19pbmMpIAotCQlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSAweDgwMCkgCisJZm9yICh3cyA9IDA7IHdzIDwgd3NfZW5kOyB3cyArPSB3c19pbmMpCisJCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IDB4ODAwKQogCQkJY2FjaGU2NF91bnJvbGwzMihhZGRyfHdzLEluZGV4X0ludmFsaWRhdGVfSSk7CiB9CiAKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogCXVuc2lnbmVkIGxvbmcgd3MsIGFkZHI7CiAKIAlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKLQkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHg4MDApIAorCQlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSAweDgwMCkKIAkJCWNhY2hlNjRfdW5yb2xsMzIoYWRkcnx3cyxJbmRleF9JbnZhbGlkYXRlX0kpOwogfQogCkBAIC00OTYsMTEgKzQ5NiwxMSBAQAogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBJTkRFWF9CQVNFOwogCXVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS53YXlzaXplOwogCXVuc2lnbmVkIGxvbmcgd3NfaW5jID0gMVVMIDw8IGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheWJpdDsKLQl1bnNpZ25lZCBsb25nIHdzX2VuZCA9IGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheXMgPDwgCisJdW5zaWduZWQgbG9uZyB3c19lbmQgPSBjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS53YXlzIDw8CiAJICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS53YXliaXQ7CiAJdW5zaWduZWQgbG9uZyB3cywgYWRkcjsKIAotCWZvciAod3MgPSAwOyB3cyA8IHdzX2VuZDsgd3MgKz0gd3NfaW5jKSAKKwlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKIAkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHg4MDApCiAJCQljYWNoZTY0X3Vucm9sbDMyKGFkZHJ8d3MsSW5kZXhfV3JpdGViYWNrX0ludl9TRCk7CiB9CkBAIC01MjUsOCArNTI1LDggQEAKIAkgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheWJpdDsKIAl1bnNpZ25lZCBsb25nIHdzLCBhZGRyOwogCi0JZm9yICh3cyA9IDA7IHdzIDwgd3NfZW5kOyB3cyArPSB3c19pbmMpIAotCQlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSAweDgwMCkgCisJZm9yICh3cyA9IDA7IHdzIDwgd3NfZW5kOyB3cyArPSB3c19pbmMpCisJCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IDB4ODAwKQogCQkJY2FjaGU2NF91bnJvbGwzMihhZGRyfHdzLEluZGV4X1dyaXRlYmFja19JbnZfU0QpOwogfQogCkBAIC01NjEsMTEgKzU2MSwxMSBAQAogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBJTkRFWF9CQVNFOwogCXVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS53YXlzaXplOwogCXVuc2lnbmVkIGxvbmcgd3NfaW5jID0gMVVMIDw8IGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheWJpdDsKLQl1bnNpZ25lZCBsb25nIHdzX2VuZCA9IGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheXMgPDwgCisJdW5zaWduZWQgbG9uZyB3c19lbmQgPSBjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS53YXlzIDw8CiAJICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS53YXliaXQ7CiAJdW5zaWduZWQgbG9uZyB3cywgYWRkcjsKIAotCWZvciAod3MgPSAwOyB3cyA8IHdzX2VuZDsgd3MgKz0gd3NfaW5jKSAKKwlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykKIAkJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMHgxMDAwKQogCQkJY2FjaGUxMjhfdW5yb2xsMzIoYWRkcnx3cyxJbmRleF9Xcml0ZWJhY2tfSW52X1NEKTsKIH0KQEAgLTU5MCw4ICs1OTAsOCBAQAogCSAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9jcHVfZGF0YS5zY2FjaGUud2F5Yml0OwogCXVuc2lnbmVkIGxvbmcgd3MsIGFkZHI7CiAKLQlmb3IgKHdzID0gMDsgd3MgPCB3c19lbmQ7IHdzICs9IHdzX2luYykgCi0JCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IDB4MTAwMCkgCisJZm9yICh3cyA9IDA7IHdzIDwgd3NfZW5kOyB3cyArPSB3c19pbmMpCisJCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IDB4MTAwMCkKIAkJCWNhY2hlMTI4X3Vucm9sbDMyKGFkZHJ8d3MsSW5kZXhfV3JpdGViYWNrX0ludl9TRCk7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcmVnLmggYi9pbmNsdWRlL2FzbS1taXBzL3JlZy5oCmluZGV4IDdiMzNiYmMuLjYxNzMwMDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcmVnLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9yZWcuaApAQCAtMTQsNyArMTQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTMzIpIHx8IGRlZmluZWQoV0FOVF9DT01QQVRfUkVHX0gpCisjaWYgZGVmaW5lZChDT05GSUdfMzJCSVQpIHx8IGRlZmluZWQoV0FOVF9DT01QQVRfUkVHX0gpCiAKICNkZWZpbmUgRUZfUjAJCQk2CiAjZGVmaW5lIEVGX1IxCQkJNwpAQCAtNzAsNyArNzAsNyBAQAogCiAjZW5kaWYKIAotI2lmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAogI2RlZmluZSBFRl9SMAkJCSAwCiAjZGVmaW5lIEVGX1IxCQkJIDEKQEAgLTEyNCw2ICsxMjQsNiBAQAogCiAjZGVmaW5lIEVGX1NJWkUJCQkzMDQJLyogc2l6ZSBpbiBieXRlcyAqLwogCi0jZW5kaWYgLyogQ09ORklHX01JUFM2NCAqLworI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCiAjZW5kaWYgLyogX19BU01fTUlQU19SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9yZXNvdXJjZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9yZXNvdXJjZS5oCmluZGV4IGZkM2M2ZDEuLjFmYmEwMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcmVzb3VyY2UuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3Jlc291cmNlLmgKQEAgLTI3LDcgKzI3LDcgQEAKICAqIGJ1dCB3ZSBrZWVwIHRoZSBvbGQgdmFsdWUgb24gTUlQUzMyLAogICogZm9yIGNvbXBhdGliaWxpdHk6CiAgKi8KLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAjIGRlZmluZSBSTElNX0lORklOSVRZCQkweDdmZmZmZmZmVUwKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3J0Yy5oIGIvaW5jbHVkZS9hc20tbWlwcy9ydGMuaAppbmRleCAzMWMwYzIzLi4zYzRiNjM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3J0Yy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcnRjLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogaW5jbHVkZS9hc20tbWlwcy9ydGMuaCAKKyAqIGluY2x1ZGUvYXNtLW1pcHMvcnRjLmgKICAqCiAgKiAoUmVhbGx5IGFuIGludGVyZmFjZSBmb3IgZHJpdmVycy9jaGFyL2dlbnJ0Yy5jKQogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2dpby5oIGIvaW5jbHVkZS9hc20tbWlwcy9zZ2kvZ2lvLmgKaW5kZXggYTM4ZDY2Zi4uODg5Y2YwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zZ2kvZ2lvLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zZ2kvZ2lvLmgKQEAgLTE2LDcgKzE2LDcgQEAKICAqCiAgKiBUaGUgSW5kaWdvIGFuZCBJbmR5IGhhdmUgdHdvIEdJTyBidXMgY29ubmVjdG9ycy4gSW5kaWdvMiAoYWxsIG1vZGVscykgaGF2ZQogICogdGhyZWUgcGh5c2ljYWwgY29ubmVjdG9ycywgYnV0IG9ubHkgdHdvIHNsb3RzLCBHRlggYW5kIEVYUDAuCi0gKiAKKyAqCiAgKiBUaGVyZSBpcyAxME1CIG9mIEdJTyBhZGRyZXNzIHNwYWNlIGZvciBHSU82NCBzbG90IGRldmljZXMKICAqIHNsb3QjICAgc2xvdCB0eXBlIGFkZHJlc3MgcmFuZ2UgICAgICAgICAgICBzaXplCiAgKiAtLS0tLSAgIC0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zZ2kvaHBjMy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zZ2kvaHBjMy5oCmluZGV4IGE1Yjk4OGQuLmFjM2RmYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2hwYzMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NnaS9ocGMzLmgKQEAgLTIyMSw3ICsyMjEsNyBAQAogI2RlZmluZSBIUEMzX0JFU1RBVF9QSURNQVNLCTB4M2Y3MDAJLyogRE1BIGNoYW5uZWwgcGFyaXR5IGlkZW50aWZpZXIgKi8KIAogCXUzMiBfdW51c2VkMVsweDE0MDAwLzQgLSA1XTsJLyogcGFkZGluZyAqLwotCQorCiAJLyogTm93IGRpcmVjdCBQSU8gcGVyLUhQQzMgcGVyaXBoZXJhbCBhY2Nlc3MgdG8gZXh0ZXJuYWwgcmVncy4gKi8KIAl2b2xhdGlsZSB1MzIgc2NzaTBfZXh0WzI1Nl07CS8qIFNDU0kgY2hhbm5lbCAwIGV4dGVybmFsIHJlZ3MgKi8KIAl1MzIgX3VudXNlZDJbMHg3YzAwLzRdOwpAQCAtMzA0LDcgKzMwNCw3IEBACiAJdm9sYXRpbGUgdTMyIGJicmFtWzgxOTItNTAtMTRdOwkvKiBCYXR0ZXJ5IGJhY2tlZCByYW0gKi8KIH07CiAKLS8qIAorLyoKICAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgdHdvIEhQQzMncyB3aXRoaW4gdGhlIGFkZHJlc3Mgc3BhY2Ugb24KICAqIG9uZSBtYWNoaW5lLCB0aG91Z2ggb25seSBoYXZpbmcgb25lIGlzIG1vcmUgbGlrZWx5IG9uIGFuIEluZHkuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2lvYy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zZ2kvaW9jLmgKaW5kZXggMTY5MTg3Zi4uZjNlM2RjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zZ2kvaW9jLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zZ2kvaW9jLmgKQEAgLTE2LDcgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zZ2kvcGkxLmg+CiAKLS8qIAorLyoKICAqIEFsbCByZWdpc3RlcnMgYXJlIDgtYml0IHdpZGUgYWxsaWduZWQgb24gMzItYml0IGJvdW5kYXJ5LiBCYWQgdGhpbmdzCiAgKiBoYXBwZW4gaWYgeW91IHRyeSB3b3JkIGFjY2VzcyB0aGVtLiBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KICAqLwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJdTggX3N5c2lkWzNdOwogCXZvbGF0aWxlIHU4IHN5c2lkOwogI2RlZmluZSBTR0lPQ19TWVNJRF9GVUxMSE9VU0UJMHgwMQotI2RlZmluZSBTR0lPQ19TWVNJRF9CT0FSRFJFVih4KQkoKHggJiAweGUwKSA+IDUpIAorI2RlZmluZSBTR0lPQ19TWVNJRF9CT0FSRFJFVih4KQkoKHggJiAweGUwKSA+IDUpCiAjZGVmaW5lIFNHSU9DX1NZU0lEX0NISVBSRVYoeCkJKCh4ICYgMHgxZSkgPiAxKQogCXUzMiBfdW51c2VkMjsKIAl1OCBfcmVhZFszXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2lwMjIuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2lwMjIuaAppbmRleCA5N2Q3M2FkLi5iYmZjMDVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NnaS9pcDIyLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zZ2kvaXAyMi5oCkBAIC0xMiw3ICsxMiw3IEBACiAjaWZuZGVmIF9TR0lfSVAyMl9ICiAjZGVmaW5lIF9TR0lfSVAyMl9ICiAKLS8qIAorLyoKICAqIFRoZXNlIGFyZSB0aGUgdmlydHVhbCBJUlEgbnVtYmVycywgd2UgZGl2aWRlIGFsbCBJUlEncyBpbnRvCiAgKiAnc3BhY2VzJywgdGhlICdzcGFjZScgZGV0ZXJtaW5lcyB3aGVyZSBhbmQgaG93IHRvIGVuYWJsZS9kaXNhYmxlCiAgKiB0aGF0IHBhcnRpY3VsYXIgSVJRIG9uIGFuIFNHSSBtYWNoaW5lLiBIUEMgRE1BIGFuZCBNQyBETUEgaW50ZXJydXBzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NnaS9tYy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zZ2kvbWMuaAppbmRleCBmZDk4ZjkzLi5jNTJmNzgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NnaS9tYy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2dpL21jLmgKQEAgLTE4MiwxNCArMTgyLDE0IEBACiAJdm9sYXRpbGUgdTMyIGR0bGJfaGkzOwogCXUzMiBfdW51c2VkMzM7CiAJdm9sYXRpbGUgdTMyIGR0bGJfbG8zOwotCQorCiAJdTMyIF91bnVzZWQzNFsweDAzOTJdOwotCQorCiAJdTMyIF91bnVzZWQzNTsKIAl2b2xhdGlsZSB1MzIgcnBzc2NvdW50ZXI7CS8qIENoaXJwcyBhdCAxMDBucyAqLwogCiAJdTMyIF91bnVzZWQzNlsweDEwMDAvNC0yKjRdOwotCQorCiAJdTMyIF91bnVzZWQzNzsKIAl2b2xhdGlsZSB1MzIgbWFkZHJvbmx5OwkJLyogQWRkcmVzcyBETUEgZ29lcyBhdCAqLwogCXUzMiBfdW51c2VkMzg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NnaWFyY3MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2dpYXJjcy5oCmluZGV4IDU5NDUwMzMuLjcyMmI3N2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2dpYXJjcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2dpYXJjcy5oCkBAIC0zNjcsNyArMzY3LDcgQEAKICAqIE1hY3JvcyBmb3IgY2FsbGluZyBhIDMyLWJpdCBBUkMgaW1wbGVtZW50YXRpb24gZnJvbSA2NC1iaXQgY29kZQogICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTNjQpICYmIGRlZmluZWQoQ09ORklHX0FSQzMyKQorI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSAmJiBkZWZpbmVkKENPTkZJR19BUkMzMikKIAogI2RlZmluZSBfX2FyY19jbG9iYmVycwkJCQkJCQlcCiAJIiQyIiwiJDMiIC8qIC4uLiAqLywgIiQ4IiwiJDkiLCIkMTAiLCIkMTEiLAkJCVwKQEAgLTQ3NiwxMCArNDc2LDEwIEBACiAJX19yZXM7CQkJCQkJCQlcCiB9KQogCi0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfTUlQUzY0KSAmJiBkZWZpbmVkKENPTkZJR19BUkMzMikgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR182NEJJVCkgJiYgZGVmaW5lZChDT05GSUdfQVJDMzIpICovCiAKLSNpZiAoZGVmaW5lZChDT05GSUdfTUlQUzMyKSAmJiBkZWZpbmVkKENPTkZJR19BUkMzMikpIHx8CQlcCi0gICAgKGRlZmluZWQoQ09ORklHX01JUFM2NCkgJiYgZGVmaW5lZChDT05GSUdfQVJDNjQpKQorI2lmIChkZWZpbmVkKENPTkZJR18zMkJJVCkgJiYgZGVmaW5lZChDT05GSUdfQVJDMzIpKSB8fAkJXAorICAgIChkZWZpbmVkKENPTkZJR182NEJJVCkgJiYgZGVmaW5lZChDT05GSUdfQVJDNjQpKQogCiAjZGVmaW5lIEFSQ19DQUxMMChkZXN0KQkJCQkJCQlcCiAoewlsb25nIF9fcmVzOwkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9jYXJtZWwuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2Nhcm1lbC5oCmluZGV4IDdhYzVkYTEuLmI1ZTdkYWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2Nhcm1lbC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2Nhcm1lbC5oCkBAIC0yNSwxMiArMjUsMTIgQEAKIAogI2RlZmluZSBTSUJZVEVfQk9BUkRfTkFNRSAiQ2FybWVsIgogCi0jZGVmaW5lIEdQSU9fUEhZX0lOVEVSUlVQVCAgICAgIDIgCi0jZGVmaW5lIEdQSU9fTk9OTUFTS0FCTEVfSU5UICAgIDMgCi0jZGVmaW5lIEdQSU9fQ0ZfSU5TRVJURUQgICAgICAgIDYgCi0jZGVmaW5lIEdQSU9fTU9OVEVSRVlfUkVTRVQgICAgIDcgCi0jZGVmaW5lIEdQSU9fUVVBRFVBUlRfSU5UICAgICAgIDggCi0jZGVmaW5lIEdQSU9fQ0ZfSU5UICAgICAgICAgICAgIDkgCisjZGVmaW5lIEdQSU9fUEhZX0lOVEVSUlVQVCAgICAgIDIKKyNkZWZpbmUgR1BJT19OT05NQVNLQUJMRV9JTlQgICAgMworI2RlZmluZSBHUElPX0NGX0lOU0VSVEVEICAgICAgICA2CisjZGVmaW5lIEdQSU9fTU9OVEVSRVlfUkVTRVQgICAgIDcKKyNkZWZpbmUgR1BJT19RVUFEVUFSVF9JTlQgICAgICAgOAorI2RlZmluZSBHUElPX0NGX0lOVCAgICAgICAgICAgICA5CiAjZGVmaW5lIEdQSU9fRlBHQV9DQ0xLICAgICAgICAgIDEwCiAjZGVmaW5lIEdQSU9fRlBHQV9ET1VUICAgICAgICAgIDExCiAjZGVmaW5lIEdQSU9fRlBHQV9ESU4gICAgICAgICAgIDEyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfZGVmcy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2RlZnMuaAppbmRleCA5NjA4OGZiLi40MGVmOTdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfZGVmcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9kZWZzLmgKQEAgLTEsMjMgKzEsMjMgQEAKIC8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqICBTQjEyNTAgQm9hcmQgU3VwcG9ydCBQYWNrYWdlCi0gICAgKiAgCi0gICAgKiAgR2xvYmFsIGNvbnN0YW50cyBhbmQgbWFjcm9zCQlGaWxlOiBzYjEyNTBfZGVmcy5oCQotICAgICogIAorICAgICoKKyAgICAqICBHbG9iYWwgY29uc3RhbnRzIGFuZCBtYWNyb3MJCUZpbGU6IHNiMTI1MF9kZWZzLmgKKyAgICAqCiAgICAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIG1hY3JvcyBhbmQgZGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgb3RoZXIKICAgICAqICBpbmNsdWRlIGZpbGVzLgogICAgICoKICAgICAqICBTQjEyNTAgc3BlY2lmaWNhdGlvbiBsZXZlbDogIFVzZXIncyBtYW51YWwgMS8wMi8wMgotICAgICogIAorICAgICoKICAgICAqICBBdXRob3I6ICBNaXRjaCBMaWNodGVuYmVyZwotICAgICogIAotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICAgKgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICoKICAgICAqICBDb3B5cmlnaHQgMjAwMCwyMDAxLDIwMDIsMjAwMwogICAgICogIEJyb2FkY29tIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICogIAotICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gICAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gICAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgICAgKgorICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAgICAgKiAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgICAgKgogICAgICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApAQCAtMjcsNyArMjcsNyBAQAogICAgICoKICAgICAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgICAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICAgICAqICBNQSAwMjExMS0xMzA3IFVTQQogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCkBAIC0xMDUsNyArMTA1LDcgQEAKICNkZWZpbmUJU0lCWVRFX0hEUl9GTUFTS18xMTJ4X0FMTAkJMHgwMDAwZjAwCiAjZGVmaW5lCVNJQllURV9IRFJfRk1BU0tfMTEyeF9QQVNTMQkJMHgwMDAwMTAwCiAKLS8qIEJpdCBtYXNrIGZvciBjaGlwL3JldmlzaW9uLiAgKHVzZSBfQUxMIGZvciBhbGwgcmV2aXNpb25zIG9mIGEgY2hpcCkuICAqLyAKKy8qIEJpdCBtYXNrIGZvciBjaGlwL3JldmlzaW9uLiAgKHVzZSBfQUxMIGZvciBhbGwgcmV2aXNpb25zIG9mIGEgY2hpcCkuICAqLwogI2RlZmluZQlTSUJZVEVfSERSX0ZNQVNLKGNoaXAsIHBhc3MpCQkJCQlcCiAgICAgKFNJQllURV9IRFJfRk1BU0tfICMjIGNoaXAgIyMgXyAjIyBwYXNzKQogI2RlZmluZQlTSUJZVEVfSERSX0ZNQVNLX0FMTFJFVlMoY2hpcCkJCQkJCVwKQEAgLTE1MCwzMSArMTUwLDMxIEBACiAKIC8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqICBOYW1pbmcgc2NoZW1lcyBmb3IgY29uc3RhbnRzIGluIHRoZXNlIGZpbGVzOgotICAgICogIAotICAgICogIE1feHh4ICAgICAgICAgICBNQVNLIGNvbnN0YW50IChpZGVudGlmaWVzIGJpdHMgaW4gYSByZWdpc3RlcikuIAorICAgICoKKyAgICAqICBNX3h4eCAgICAgICAgICAgTUFTSyBjb25zdGFudCAoaWRlbnRpZmllcyBiaXRzIGluIGEgcmVnaXN0ZXIpLgogICAgICogICAgICAgICAgICAgICAgICBGb3IgbXVsdGktYml0IGZpZWxkcywgYWxsIGJpdHMgaW4gdGhlIGZpZWxkIHdpbGwKICAgICAqICAgICAgICAgICAgICAgICAgYmUgc2V0LgogICAgICoKICAgICAqICBLX3h4eCAgICAgICAgICAgIkNvZGUiIGNvbnN0YW50ICh2YWx1ZSBmb3IgZGF0YSBpbiBhIG11bHRpLWJpdAogICAgICogICAgICAgICAgICAgICAgICBmaWVsZCkuICBUaGUgdmFsdWUgaXMgcmlnaHQganVzdGlmaWVkLgogICAgICoKLSAgICAqICBWX3h4eCAgICAgICAgICAgIlZhbHVlIiBjb25zdGFudC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIAorICAgICogIFZfeHh4ICAgICAgICAgICAiVmFsdWUiIGNvbnN0YW50LiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUKICAgICAqICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyAiS194eHgiIGNvbnN0YW50LCBleGNlcHQgaXQgaXMKICAgICAqICAgICAgICAgICAgICAgICAgc2hpZnRlZCB0byB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgcmVnaXN0ZXIuCiAgICAgKgogICAgICogIFNfeHh4ICAgICAgICAgICBTSElGVCBjb25zdGFudC4gIFRoaXMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQKLSAgICAqICAgICAgICAgICAgICAgICAgYSBmaWVsZCB2YWx1ZSAoY29kZSkgbmVlZHMgdG8gYmUgc2hpZnRlZCAKKyAgICAqICAgICAgICAgICAgICAgICAgYSBmaWVsZCB2YWx1ZSAoY29kZSkgbmVlZHMgdG8gYmUgc2hpZnRlZAogICAgICogICAgICAgICAgICAgICAgICAodG93YXJkcyB0aGUgbGVmdCkgdG8gcHV0IHRoZSB2YWx1ZSBpbiB0aGUgcmlnaHQKICAgICAqICAgICAgICAgICAgICAgICAgcG9zaXRpb24gZm9yIHRoZSByZWdpc3Rlci4KICAgICAqCi0gICAgKiAgQV94eHggICAgICAgICAgIEFERFJFU1MgY29uc3RhbnQuICBUaGlzIHdpbGwgYmUgYSBwaHlzaWNhbCAKKyAgICAqICBBX3h4eCAgICAgICAgICAgQUREUkVTUyBjb25zdGFudC4gIFRoaXMgd2lsbCBiZSBhIHBoeXNpY2FsCiAgICAgKiAgICAgICAgICAgICAgICAgIGFkZHJlc3MuICBVc2UgdGhlIFBIWVNfVE9fSzEgbWFjcm8gdG8gZ2VuZXJhdGUKICAgICAqICAgICAgICAgICAgICAgICAgYSBLMVNFRyBhZGRyZXNzLgogICAgICoKICAgICAqICBSX3h4eCAgICAgICAgICAgUkVMQVRJVkUgb2Zmc2V0IGNvbnN0YW50LiAgVGhpcyBpcyBhbiBvZmZzZXQgZnJvbQogICAgICogICAgICAgICAgICAgICAgICBhbiBBX3h4eCBjb25zdGFudCAodXN1YWxseSB0aGUgZmlyc3QgcmVnaXN0ZXIgaW4KICAgICAqICAgICAgICAgICAgICAgICAgYSBncm91cCkuCi0gICAgKiAgCisgICAgKgogICAgICogIEdfeHh4KFgpICAgICAgICBHRVQgdmFsdWUuICBUaGlzIG1hY3JvIG9idGFpbnMgYSBtdWx0aS1iaXQgZmllbGQKICAgICAqICAgICAgICAgICAgICAgICAgZnJvbSBhIHJlZ2lzdGVyLCBtYXNrcyBpdCwgYW5kIHNoaWZ0cyBpdCB0bwogICAgICogICAgICAgICAgICAgICAgICB0aGUgYm90dG9tIG9mIHRoZSByZWdpc3RlciAocmV0cmlldmluZyBhIEtfeHh4CkBAIC0xODksNyArMTg5LDcgQEAKIAogCiAvKgotICogQ2FzdCB0byA2NC1iaXQgbnVtYmVyLiAgUHJlc3VtYWJseSB0aGUgc3ludGF4IGlzIGRpZmZlcmVudCBpbiAKKyAqIENhc3QgdG8gNjQtYml0IG51bWJlci4gIFByZXN1bWFibHkgdGhlIHN5bnRheCBpcyBkaWZmZXJlbnQgaW4KICAqIGFzc2VtYmx5IGxhbmd1YWdlLgogICoKICAqIE5vdGU6IHlvdSdsbCBuZWVkIHRvIGRlZmluZSB1aW50MzJfdCBhbmQgdWludDY0X3QgaW4geW91ciBoZWFkZXJzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2RtYS5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2RtYS5oCmluZGV4IGYxYjA4ZDMyLi4zY2RiNDhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2RtYS5oCkBAIC0xLDI0ICsxLDI0IEBACiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiAgU0IxMjUwIEJvYXJkIFN1cHBvcnQgUGFja2FnZQotICAgICogIAorICAgICoKICAgICAqICBETUEgZGVmaW5pdGlvbnMJCQkJRmlsZTogc2IxMjUwX2RtYS5oCi0gICAgKiAgCisgICAgKgogICAgICogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvbnN0YW50cyBhbmQgbWFjcm9zIHVzZWZ1bCBmb3IKICAgICAqICBwcm9ncmFtbWluZyB0aGUgU0IxMjUwJ3MgRE1BIGNvbnRyb2xsZXJzLCBib3RoIHRoZSBkYXRhIG1vdmVyCiAgICAgKiAgYW5kIHRoZSBFdGhlcm5ldCBETUEuCi0gICAgKiAgCisgICAgKgogICAgICogIFNCMTI1MCBzcGVjaWZpY2F0aW9uIGxldmVsOiAgVXNlcidzIG1hbnVhbCAxLzAyLzAyCi0gICAgKiAgCisgICAgKgogICAgICogIEF1dGhvcjogIE1pdGNoIExpY2h0ZW5iZXJnCi0gICAgKiAgCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgICAqCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKgogICAgICogIENvcHlyaWdodCAyMDAwLDIwMDEsMjAwMiwyMDAzCiAgICAgKiAgQnJvYWRjb20gQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgKiAgCi0gICAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAgICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAgICAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAgICAqCisgICAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICAgICAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAgICAqCiAgICAgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgKgogICAgICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICAgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAgICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogICAgICogIE1BIDAyMTExLTEzMDcgVVNBCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKQEAgLTQzLDkgKzQzLDkgQEAKICAgICAqICBETUEgUmVnaXN0ZXJzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKLS8qIAorLyoKICAqIEV0aGVybmV0IGFuZCBTZXJpYWwgRE1BIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMCAgKFRhYmxlIDctNCkKLSAqIFJlZ2lzdGVyczogRE1BX0NPTkZJRzBfTUFDX3hfUlhfQ0hfMCAKKyAqIFJlZ2lzdGVyczogRE1BX0NPTkZJRzBfTUFDX3hfUlhfQ0hfMAogICogUmVnaXN0ZXJzOiBETUFfQ09ORklHMF9NQUNfeF9UWF9DSF8wCiAgKiBSZWdpc3RlcnM6IERNQV9DT05GSUcwX1NFUl94X1JYCiAgKiBSZWdpc3RlcnM6IERNQV9DT05GSUcwX1NFUl94X1RYCkBAIC05OCw3ICs5OCw3IEBACiAKIC8qCiAgKiBFdGhlcm5ldCBhbmQgU2VyaWFsIERNQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKFRhYmxlIDctNSkKLSAqIFJlZ2lzdGVyczogRE1BX0NPTkZJRzFfTUFDX3hfUlhfQ0hfMCAKKyAqIFJlZ2lzdGVyczogRE1BX0NPTkZJRzFfTUFDX3hfUlhfQ0hfMAogICogUmVnaXN0ZXJzOiBETUFfQ09ORklHMV9ETUFfeF9UWF9DSF8wCiAgKiBSZWdpc3RlcnM6IERNQV9DT05GSUcxX1NFUl94X1JYCiAgKiBSZWdpc3RlcnM6IERNQV9DT05GSUcxX1NFUl94X1RYCkBAIC0xNTIsMTEgKzE1MiwxMSBAQAogLyoKICAqIERNQSBEZXNjcmlwdG9yIENvdW50IFJlZ2lzdGVycyAoVGFibGUgNy04KQogICovCi0gCisKIC8qIE5vIGJpdGZpZWxkcyAqLwogCiAKLS8qIAorLyoKICAqIEN1cnJlbnQgRGVzY3JpcHRvciBBZGRyZXNzIFJlZ2lzdGVyIChUYWJsZSA3LTExKQogICovCiAKQEAgLTI3NSwxNCArMjc1LDE0IEBACiAjZGVmaW5lIFZfRE1BX0RTQ1JCX1NUQVRVUyh4KSAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19ETUFfRFNDUkJfU1RBVFVTKQogI2RlZmluZSBHX0RNQV9EU0NSQl9TVEFUVVMoeCkgICAgICAgX1NCX0dFVFZBTFVFKHgsU19ETUFfRFNDUkJfU1RBVFVTLE1fRE1BX0RTQ1JCX1NUQVRVUykKIAotLyogCisvKgogICogRXRoZXJuZXQgRGVzY3JpcHRvciBTdGF0dXMgQml0cyAoVGFibGUgNy0xNSkKICAqLwogCiAjZGVmaW5lIE1fRE1BX0VUSFJYX0JBRElQNENTICAgICAgICBfU0JfTUFLRU1BU0sxKDUxKQogI2RlZmluZSBNX0RNQV9FVEhSWF9EU0NSRVJSCSAgICBfU0JfTUFLRU1BU0sxKDUyKQogCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpIAorI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKQogLyogTm90ZTogQkFEVENQQ1MgaXMgYWN0dWFsbHkgaW4gRFNDUl9CIG9wdGlvbnMgZmllbGQgKi8KICNkZWZpbmUgTV9ETUFfRVRIUlhfQkFEVENQQ1MJX1NCX01BS0VNQVNLMSgwKQogI2VuZGlmIC8qIDEyNTAgUEFTUzIgfHwgMTEyeCBQQVNTMSAqLwpAQCAtMzI0LDcgKzMyNCw3IEBACiAKICNkZWZpbmUgTV9ETUFfRVRIVFhfU09QCSAgICAJICAgIF9TQl9NQUtFTUFTSzEoNjMpCiAKLS8qIAorLyoKICAqIEV0aGVybmV0IFRyYW5zbWl0IE9wdGlvbnMgKFRhYmxlIDctMTcpCiAgKi8KIApAQCAtMzc3LDcgKzM3Nyw3IEBACiAgICAgKiAgRGF0YSBNb3ZlciBSZWdpc3RlcnMKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAotLyogCisvKgogICogRGF0YSBNb3ZlciBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAoVGFibGUgNy0yMikKICAqIFJlZ2lzdGVyOiBETV9EU0NSX0JBU0VfMAogICogUmVnaXN0ZXI6IERNX0RTQ1JfQkFTRV8xCkBAIC00MTQsNyArNDE0LDcgQEAKICNkZWZpbmUgTV9ETV9EU0NSX0JBU0VfQUJPUlQgICAgICAgIF9TQl9NQUtFTUFTSzEoNjIpCiAjZGVmaW5lIE1fRE1fRFNDUl9CQVNFX0VOQUJMICAgICAgICBfU0JfTUFLRU1BU0sxKDYzKQogCi0vKiAKKy8qCiAgKiBEYXRhIE1vdmVyIERlc2NyaXB0b3IgQ291bnQgUmVnaXN0ZXIgKFRhYmxlIDctMjUpCiAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2dlbmJ1cy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2dlbmJ1cy5oCmluZGV4IDBkOWRmYWMuLmYxZjUwOWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9nZW5idXMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfZ2VuYnVzLmgKQEAgLTEsMjMgKzEsMjMgQEAKIC8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqICBTQjEyNTAgQm9hcmQgU3VwcG9ydCBQYWNrYWdlCi0gICAgKiAgCisgICAgKgogICAgICogIEdlbmVyaWMgQnVzIENvbnN0YW50cyAgICAgICAgICAgICAgICAgICAgIEZpbGU6IHNiMTI1MF9nZW5idXMuaAotICAgICogIAotICAgICogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvbnN0YW50cyBhbmQgbWFjcm9zIHVzZWZ1bCBmb3IgCisgICAgKgorICAgICogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvbnN0YW50cyBhbmQgbWFjcm9zIHVzZWZ1bCBmb3IKICAgICAqICBtYW5pcHVsYXRpbmcgdGhlIFNCMTI1MCdzIEdlbmVyaWMgQnVzIGludGVyZmFjZQotICAgICogIAorICAgICoKICAgICAqICBTQjEyNTAgc3BlY2lmaWNhdGlvbiBsZXZlbDogIFVzZXIncyBtYW51YWwgMS8wMi8wMgotICAgICogIAorICAgICoKICAgICAqICBBdXRob3I6ICBNaXRjaCBMaWNodGVuYmVyZwotICAgICogIAotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICAgKgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICoKICAgICAqICBDb3B5cmlnaHQgMjAwMCwyMDAxLDIwMDIsMjAwMwogICAgICogIEJyb2FkY29tIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICogIAotICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gICAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gICAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgICAgKgorICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAgICAgKiAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgICAgKgogICAgICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApAQCAtMjcsNyArMjcsNyBAQAogICAgICoKICAgICAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgICAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICAgICAqICBNQSAwMjExMS0xMzA3IFVTQQogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfaW50LmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfaW50LmgKaW5kZXggYzNmNzRkZi4uZTE3M2UyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2ludC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9pbnQuaApAQCAtMSwyMyArMSwyMyBAQAogLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICogIFNCMTI1MCBCb2FyZCBTdXBwb3J0IFBhY2thZ2UKLSAgICAqICAKKyAgICAqCiAgICAgKiAgSW50ZXJydXB0IE1hcHBlciBkZWZpbml0aW9ucwkJRmlsZTogc2IxMjUwX2ludC5oCi0gICAgKiAgCisgICAgKgogICAgICogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvbnN0YW50cyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBTQjEyNTAncwogICAgICogIGludGVycnVwdCBtYXBwZXIgYW5kIGRlZmluaXRpb25zIGZvciB0aGUgaW50ZXJydXB0IHNvdXJjZXMuCi0gICAgKiAgCisgICAgKgogICAgICogIFNCMTI1MCBzcGVjaWZpY2F0aW9uIGxldmVsOiAgVXNlcidzIG1hbnVhbCAxLzAyLzAyCi0gICAgKiAgCisgICAgKgogICAgICogIEF1dGhvcjogIE1pdGNoIExpY2h0ZW5iZXJnCi0gICAgKiAgCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgICAqCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKgogICAgICogIENvcHlyaWdodCAyMDAwLDIwMDEsMjAwMiwyMDAzCiAgICAgKiAgQnJvYWRjb20gQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgKiAgCi0gICAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAgICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAgICAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAgICAqCisgICAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICAgICAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAgICAqCiAgICAgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCkBAIC0yNyw3ICsyNyw3IEBACiAgICAgKgogICAgICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICAgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAgICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogICAgICogIE1BIDAyMTExLTEzMDcgVVNBCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKQEAgLTQzLDcgKzQzLDcgQEAKIAogLyoKICAqIEludGVycnVwdCBzb3VyY2VzIChUYWJsZSA0LTgsIFVNIDAuMikKLSAqIAorICoKICAqIEZpcnN0LCB0aGUgaW50ZXJydXB0IG51bWJlcnMuCiAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2wyYy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2wyYy5oCmluZGV4IDc5OWRiODIuLjhhZmU4ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9sMmMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfbDJjLmgKQEAgLTEsMjMgKzEsMjMgQEAKIC8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqICBTQjEyNTAgQm9hcmQgU3VwcG9ydCBQYWNrYWdlCi0gICAgKiAgCisgICAgKgogICAgICogIEwyIENhY2hlIGNvbnN0YW50cyBhbmQgbWFjcm9zCQlGaWxlOiBzYjEyNTBfbDJjLmgKLSAgICAqICAKKyAgICAqCiAgICAgKiAgVGhpcyBtb2R1bGUgY29udGFpbnMgY29uc3RhbnRzIHVzZWZ1bCBmb3IgbWFuaXB1bGF0aW5nIHRoZQogICAgICogIGxldmVsIDIgY2FjaGUuCi0gICAgKiAgCisgICAgKgogICAgICogIFNCMTI1MCBzcGVjaWZpY2F0aW9uIGxldmVsOiAgVXNlcidzIG1hbnVhbCAxLzAyLzAyCi0gICAgKiAgCisgICAgKgogICAgICogIEF1dGhvcjogIE1pdGNoIExpY2h0ZW5iZXJnCi0gICAgKiAgCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgICAqCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKgogICAgICogIENvcHlyaWdodCAyMDAwLDIwMDEsMjAwMiwyMDAzCiAgICAgKiAgQnJvYWRjb20gQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgKiAgCi0gICAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAgICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAgICAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAgICAqCisgICAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICAgICAqICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAgICAqCiAgICAgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCkBAIC0yNyw3ICsyNyw3IEBACiAgICAgKgogICAgICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICAgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAgICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogICAgICogIE1BIDAyMTExLTEzMDcgVVNBCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9sZHQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9sZHQuaAppbmRleCBkODc1Mzg4Li5mMjYxN2RlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfbGR0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2xkdC5oCkBAIC0xLDIzICsxLDIzIEBACiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiAgU0IxMjUwIEJvYXJkIFN1cHBvcnQgUGFja2FnZQotICAgICogIAorICAgICoKICAgICAqICBMRFQgY29uc3RhbnRzCQkJCUZpbGU6IHNiMTI1MF9sZHQuaAotICAgICogIAotICAgICogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvbnN0YW50cyBhbmQgbWFjcm9zIHRvIGRlc2NyaWJlIAotICAgICogIHRoZSBMRFQgaW50ZXJmYWNlIG9uIHRoZSBTQjEyNTAuICAKLSAgICAqICAKKyAgICAqCisgICAgKiAgVGhpcyBtb2R1bGUgY29udGFpbnMgY29uc3RhbnRzIGFuZCBtYWNyb3MgdG8gZGVzY3JpYmUKKyAgICAqICB0aGUgTERUIGludGVyZmFjZSBvbiB0aGUgU0IxMjUwLgorICAgICoKICAgICAqICBTQjEyNTAgc3BlY2lmaWNhdGlvbiBsZXZlbDogIFVzZXIncyBtYW51YWwgMS8wMi8wMgotICAgICogIAorICAgICoKICAgICAqICBBdXRob3I6ICBNaXRjaCBMaWNodGVuYmVyZwotICAgICogIAotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICAgKgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICoKICAgICAqICBDb3B5cmlnaHQgMjAwMCwyMDAxLDIwMDIsMjAwMwogICAgICogIEJyb2FkY29tIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICogIAotICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gICAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gICAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgICAgKgorICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAgICAgKiAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgICAgKgogICAgICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApAQCAtMjcsNyArMjcsNyBAQAogICAgICoKICAgICAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgICAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICAgICAqICBNQSAwMjExMS0xMzA3IFVTQQogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCkBAIC0xNTUsNyArMTU1LDcgQEAKIAogLyoKICAqIExEVCBTdGF0dXMgUmVnaXN0ZXIgKFRhYmxlIDgtMTQpLiAgTm90ZSB0aGF0IHRoZXNlIGNvbnN0YW50cwotICogYXNzdW1lIHlvdSd2ZSByZWFkIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgCisgKiBhc3N1bWUgeW91J3ZlIHJlYWQgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlcgogICogdG9nZXRoZXIgKDMyLWJpdCByZWFkIGF0IG9mZnNldCAweDA0KQogICoKICAqIFRoZXNlIGJpdHMgYWxzbyBhcHBseSB0byB0aGUgc2Vjb25kYXJ5IHN0YXR1cwpAQCAtMTgzLDggKzE4Myw4IEBACiAjZGVmaW5lIE1fTERUX1NUQVRVU19ERVRQQVJFUlIJCV9TQl9NQUtFTUFTSzFfMzIoMzEpCiAKIC8qCi0gKiBCcmlkZ2UgQ29udHJvbCBSZWdpc3RlciAoVGFibGUgOC0xNikuICBOb3RlIHRoYXQgdGhlc2UgCi0gKiBjb25zdGFudHMgYXNzdW1lIHlvdSd2ZSByZWFkIHRoZSByZWdpc3RlciBhcyBhIDMyLWJpdCAKKyAqIEJyaWRnZSBDb250cm9sIFJlZ2lzdGVyIChUYWJsZSA4LTE2KS4gIE5vdGUgdGhhdCB0aGVzZQorICogY29uc3RhbnRzIGFzc3VtZSB5b3UndmUgcmVhZCB0aGUgcmVnaXN0ZXIgYXMgYSAzMi1iaXQKICAqIHJlYWQgKG9mZnNldCAweDNDKQogICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYWMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYWMuaAppbmRleCA4MWY2MDNmLi4xOGU3NGU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfbWFjLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX21hYy5oCkBAIC0xLDIzICsxLDIzIEBACiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiAgU0IxMjUwIEJvYXJkIFN1cHBvcnQgUGFja2FnZQotICAgICogIAorICAgICoKICAgICAqICBNQUMgY29uc3RhbnRzIGFuZCBtYWNyb3MJCQlGaWxlOiBzYjEyNTBfbWFjLmgKLSAgICAqICAKKyAgICAqCiAgICAgKiAgVGhpcyBtb2R1bGUgY29udGFpbnMgY29uc3RhbnRzIGFuZCBtYWNyb3MgZm9yIHRoZSBTQjEyNTAncwogICAgICogIGV0aGVybmV0IGNvbnRyb2xsZXJzLgotICAgICogIAorICAgICoKICAgICAqICBTQjEyNTAgc3BlY2lmaWNhdGlvbiBsZXZlbDogIFVzZXIncyBtYW51YWwgMS8wMi8wMgotICAgICogIAorICAgICoKICAgICAqICBBdXRob3I6ICBNaXRjaCBMaWNodGVuYmVyZwotICAgICogIAotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICAgKgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICoKICAgICAqICBDb3B5cmlnaHQgMjAwMCwyMDAxLDIwMDIsMjAwMwogICAgICogIEJyb2FkY29tIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICogIAotICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gICAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gICAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgICAgKgorICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAgICAgKiAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgICAgKgogICAgICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApAQCAtMjcsNyArMjcsNyBAQAogICAgICoKICAgICAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgICAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICAgICAqICBNQSAwMjExMS0xMzA3IFVTQQogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCkBAIC0zMTEsNyArMzExLDcgQEAKIAogLyoKICAqIFRoZXNlIGNvbnN0YW50cyBhcmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGZpZWxkcyB3aXRoaW4gdGhlIEZyYW1lCi0gKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLiAgCisgKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLgogICovCiAKICNkZWZpbmUgS19NQUNfSUZHX1JYXzEwICAgICAgICAgICAgIF9TQl9NQUtFNjQoMCkJLyogU2VlIHRhYmxlIDE3Niwgbm90IHVzZWQgKi8KQEAgLTM5Myw3ICszOTMsNyBAQAogICogUmVnaXN0ZXI6IE1BQ19JTlRfTUFTS18yCiAgKi8KIAotLyogCisvKgogICogVXNlIHRoZXNlIGNvbnN0YW50cyB0byBzaGlmdCB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbAogICogaW50byB0aGUgQ0gwIHBvc2l0aW9uIHNvIHRoZSBzYW1lIHRlc3RzIGNhbiBiZSB1c2VkCiAgKiBvbiBlYWNoIGNoYW5uZWwuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfbWMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYy5oCmluZGV4IDkzYTQ4MzMuLjFkZDQxYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYy5oCkBAIC0xLDIzICsxLDIzIEBACiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiAgU0IxMjUwIEJvYXJkIFN1cHBvcnQgUGFja2FnZQotICAgICogIAotICAgICogIE1lbW9yeSBDb250cm9sbGVyIGNvbnN0YW50cyAgICAgICAgICAgICAgRmlsZTogc2IxMjUwX21jLmggICAgICAgCi0gICAgKiAgCisgICAgKgorICAgICogIE1lbW9yeSBDb250cm9sbGVyIGNvbnN0YW50cyAgICAgICAgICAgICAgRmlsZTogc2IxMjUwX21jLmgKKyAgICAqCiAgICAgKiAgVGhpcyBtb2R1bGUgY29udGFpbnMgY29uc3RhbnRzIGFuZCBtYWNyb3MgdXNlZnVsIGZvcgogICAgICogIHByb2dyYW1taW5nIHRoZSBtZW1vcnkgY29udHJvbGxlci4KLSAgICAqICAKKyAgICAqCiAgICAgKiAgU0IxMjUwIHNwZWNpZmljYXRpb24gbGV2ZWw6ICBVc2VyJ3MgbWFudWFsIDEvMDIvMDIKLSAgICAqICAKKyAgICAqCiAgICAgKiAgQXV0aG9yOiAgTWl0Y2ggTGljaHRlbmJlcmcKLSAgICAqICAKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAgICoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqCiAgICAgKiAgQ29weXJpZ2h0IDIwMDAsMjAwMSwyMDAyLDIwMDMKICAgICAqICBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAqICAKLSAgICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICAgICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICAgICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICAgICoKKyAgICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgICAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogICAgICogIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICAgICoKICAgICAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKQEAgLTI3LDcgKzI3LDcgQEAKICAgICAqCiAgICAgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgICAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICAgICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAgICAgKiAgTUEgMDIxMTEtMTMwNyBVU0EKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIApAQCAtMTY2LDcgKzE2Niw3IEBACiAKICNkZWZpbmUgS19NQ19SRUZfUkFURV8xMDBNSHogICAgICAgICAweDYyCiAjZGVmaW5lIEtfTUNfUkVGX1JBVEVfMTMzTUh6ICAgICAgICAgMHg4MQotI2RlZmluZSBLX01DX1JFRl9SQVRFXzIwME1IeiAgICAgICAgIDB4QzQgCisjZGVmaW5lIEtfTUNfUkVGX1JBVEVfMjAwTUh6ICAgICAgICAgMHhDNAogCiAjZGVmaW5lIFZfTUNfUkVGX1JBVEVfMTAwTUh6ICAgICAgICAgVl9NQ19SRUZfUkFURShLX01DX1JFRl9SQVRFXzEwME1IeikKICNkZWZpbmUgVl9NQ19SRUZfUkFURV8xMzNNSHogICAgICAgICBWX01DX1JFRl9SQVRFKEtfTUNfUkVGX1JBVEVfMTMzTUh6KQpAQCAtMjI4LDcgKzIyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVl9NQ19BRERSX0RSSVZFX0RFRkFVTFQgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVl9NQ19EQVRBX0RSSVZFX0RFRkFVTFQgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVl9NQ19DTE9DS19EUklWRV9ERUZBVUxUIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZfTUNfUkVGX1JBVEVfREVGQVVMVCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWX01DX1JFRl9SQVRFX0RFRkFVTFQKIAogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfcmVncy5oCmluZGV4IDVkNDk2YzYuLjlkYjgwY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3JlZ3MuaApAQCAtMSwyMyArMSwyMyBAQAogLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICogIFNCMTI1MCBCb2FyZCBTdXBwb3J0IFBhY2thZ2UKLSAgICAqICAKKyAgICAqCiAgICAgKiAgUmVnaXN0ZXIgRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICBGaWxlOiBzYjEyNTBfcmVncy5oCi0gICAgKiAgCisgICAgKgogICAgICogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBhZGRyZXNzZXMgb2YgdGhlIG9uLWNoaXAgcGVyaXBoZXJhbHMKICAgICAqICBvbiB0aGUgU0IxMjUwLgotICAgICogIAorICAgICoKICAgICAqICBTQjEyNTAgc3BlY2lmaWNhdGlvbiBsZXZlbDogIDAxLzAyLzIwMDIKLSAgICAqICAKKyAgICAqCiAgICAgKiAgQXV0aG9yOiAgTWl0Y2ggTGljaHRlbmJlcmcKLSAgICAqICAKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAgICoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqCiAgICAgKiAgQ29weXJpZ2h0IDIwMDAsMjAwMSwyMDAyLDIwMDMKICAgICAqICBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAqICAKLSAgICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICAgICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICAgICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICAgICoKKyAgICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgICAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogICAgICogIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICAgICoKICAgICAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKQEAgLTI3LDcgKzI3LDcgQEAKICAgICAqCiAgICAgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgICAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICAgICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAgICAgKiAgTUEgMDIxMTEtMTMwNyBVU0EKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIApAQCAtNDAsMjAgKzQwLDIwIEBACiAKIC8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqICBTb21lIGdlbmVyYWwgbm90ZXM6Ci0gICAgKiAgCisgICAgKgogICAgICogIEZvciB0aGUgbW9zdCBwYXJ0LCB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGVyaXBoZXJhbAogICAgICogIG9mIHRoZSBzYW1lIHR5cGUgb24gdGhlIFNPQywgdGhlIGNvbnN0YW50cyBiZWxvdyB3aWxsIGJlCiAgICAgKiAgb2Zmc2V0cyBmcm9tIHRoZSBiYXNlIG9mIGVhY2ggcGVyaXBoZXJhbC4gIEZvciBleGFtcGxlLAogICAgICogIHRoZSBNQUMgcmVnaXN0ZXJzIGFyZSBkZXNjcmliZWQgYXMgb2Zmc2V0cyBmcm9tIHRoZSBmaXJzdAogICAgICogIE1BQyByZWdpc3RlciwgYW5kIHRoZXJlIHdpbGwgYmUgYSBNQUNfUkVHSVNURVIoKSBtYWNybwotICAgICogIHRvIGNhbGN1bGF0ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIGEgZ2l2ZW4gTUFDLiAgCi0gICAgKiAgCisgICAgKiAgdG8gY2FsY3VsYXRlIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBnaXZlbiBNQUMuCisgICAgKgogICAgICogIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgYmFzZWQgb24gdGhlIFNCMTI1MCBTT0MKICAgICAqICBtYW51YWwgdmVyc2lvbiAwLjIsIEp1bHkgMjAwMC4KICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAogCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICogTWVtb3J5IENvbnRyb2xsZXIgUmVnaXN0ZXJzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogI2RlZmluZSBSX01DX1RFU1RfRUNDICAgICAgICAgICAgICAgMHgwMDAwMDAwNDIwCiAjZGVmaW5lIFJfTUNfTUNMS19DRkcgICAgICAgICAgICAgICAweDAwMDAwMDA1MDAKIAotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKy8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqIEwyIENhY2hlIENvbnRyb2wgUmVnaXN0ZXJzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKQEAgLTEyNiw3ICsxMjYsNyBAQAogI2RlZmluZSBBX0wyX0VFQ19BRERSRVNTICAgICAgICAgICAgQV9MMl9FQ0NfVEFHCiAKIAotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKy8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqIFBDSSBJbnRlcmZhY2UgUmVnaXN0ZXJzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKQEAgLTEzNCw3ICsxMzQsNyBAQAogI2RlZmluZSBBX1BDSV9UWVBFMDFfSEVBREVSICAgICAgICAgMHgwMERFMDAwODAwCiAKIAotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKy8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqIEV0aGVybmV0IERNQSBhbmQgTUFDcwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCkBAIC0xODQsNyArMTg0LDcgQEAKICAgICAgICAgICAgIChSX01BQ19ETUFfQ0hBTk5FTF9CQVNFKHR4cngsY2hhbikgKyAgICBcCiAgICAgICAgICAgICAocmVnKSkKIAotLyogCisvKgogICogRE1BIGNoYW5uZWwgcmVnaXN0ZXJzLCByZWxhdGl2ZSB0byBBX01BQ19ETUFfQ0hBTk5FTF9CQVNFCiAgKi8KIApAQCAtMjU5LDcgKzI1OSw3IEBACiAjZGVmaW5lIE1BQ19DSE1BUF9DT1VOVAkJCTQKIAogCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICogRFVBUlQgUmVnaXN0ZXJzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKQEAgLTM2Myw3ICszNjMsNyBAQAogI2VuZGlmIC8qIDEyNTAgUEFTUzIgfHwgMTEyeCBQQVNTMSAqLwogCiAKLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiBTeW5jaHJvbm91cyBTZXJpYWwgUmVnaXN0ZXJzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKQEAgLTM5Nyw3ICszOTcsNyBAQAogICAgICAgICAgICAgKHJlZykpCiAKIAotLyogCisvKgogICogRE1BIGNoYW5uZWwgcmVnaXN0ZXJzLCByZWxhdGl2ZSB0byBBX1NFUl9ETUFfQ0hBTk5FTF9CQVNFCiAgKi8KIApAQCAtNDU3LDcgKzQ1Nyw3IEBACiAjZGVmaW5lIFJfU0VSX1JNT05fUlhfRVJST1JTICAgICAgICAweDAwMDAwMUYwCiAjZGVmaW5lIFJfU0VSX1JNT05fUlhfQkFEQUREUiAgICAgICAweDAwMDAwMUY4CiAKLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiBHZW5lcmljIEJ1cyBSZWdpc3RlcnMKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIApAQCAtNTEzLDcgKzUxMyw3IEBACiAjZGVmaW5lIFJfSU9fUENNQ0lBX0NGRyAgICAgICAgICAgICAweDBBNjAKICNkZWZpbmUgUl9JT19QQ01DSUFfU1RBVFVTICAgICAgICAgIDB4MEE3MAogCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICogR1BJTyBSZWdpc3RlcnMKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIApAQCAtNTM3LDcgKzUzNyw3IEBACiAjZGVmaW5lIFJfR1BJT19QSU5fQ0xSICAgICAgICAgICAgICAweDMwCiAjZGVmaW5lIFJfR1BJT19QSU5fU0VUICAgICAgICAgICAgICAweDM4CiAKLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiBTTUJ1cyBSZWdpc3RlcnMKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIApAQCAtNTczLDcgKzU3Myw3IEBACiAjZGVmaW5lIFJfU01CX0NPTlRST0wgICAgICAgICAgICAgICAweDAwMDAwMDAwNjAKICNkZWZpbmUgUl9TTUJfUEVDICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDA3MAogCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICogVGltZXIgUmVnaXN0ZXJzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKQEAgLTY0MSw3ICs2NDEsNyBAQAogI2VuZGlmIC8qIDEyNTAgUEFTUzIgfHwgMTEyeCBQQVNTMSAqLwogCiAKLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlcnMKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIApAQCAtNjQ5LDcgKzY0OSw3IEBACiAjZGVmaW5lIEFfU0NEX1NZU1RFTV9DRkcgICAgICAgICAgICAweDAwMTAwMjAwMDgKICNkZWZpbmUgQV9TQ0RfU1lTVEVNX01BTlVGICAgICAgICAgIDB4MDAxMDAzODAwMAogCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICogU3lzdGVtIEFkZHJlc3MgVHJhcCBSZWdpc3RlcnMKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIApAQCAtNjcyLDcgKzY3Miw3IEBACiAjZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxICovCiAKIAotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKy8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqIFN5c3RlbSBJbnRlcnJ1cHQgTWFwcGVyIFJlZ2lzdGVycwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCkBAIC03MDEsNyArNzAxLDcgQEAKICNkZWZpbmUgUl9JTVJfSU5URVJSVVBUX01BUF9CQVNFICAgICAgICAweDAyMDAKICNkZWZpbmUgUl9JTVJfSU5URVJSVVBUX01BUF9DT1VOVCAgICAgICA2NAogCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICogU3lzdGVtIFBlcmZvcm1hbmNlIENvdW50ZXIgUmVnaXN0ZXJzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKQEAgLTcxMSw3ICs3MTEsNyBAQAogI2RlZmluZSBBX1NDRF9QRVJGX0NOVF8yICAgICAgICAgICAgMHgwMDEwMDIwNEUwCiAjZGVmaW5lIEFfU0NEX1BFUkZfQ05UXzMgICAgICAgICAgICAweDAwMTAwMjA0RTgKIAotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKy8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqIFN5c3RlbSBCdXMgV2F0Y2hlciBSZWdpc3RlcnMKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIApAQCAtNzI2LDEzICs3MjYsMTMgQEAKICNkZWZpbmUgQV9CVVNfTDJfRVJST1JTICAgICAgICAgICAgIDB4MDAxMDAyMDhDMAogI2RlZmluZSBBX0JVU19NRU1fSU9fRVJST1JTICAgICAgICAgMHgwMDEwMDIwOEM4CiAKLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiBTeXN0ZW0gRGVidWcgQ29udHJvbGxlciBSZWdpc3RlcnMKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAogI2RlZmluZSBBX1NDRF9KVEFHX0JBU0UgICAgICAgICAgICAgMHgwMDEwMDAwMDAwCiAKLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiBTeXN0ZW0gVHJhY2UgQnVmZmVyIFJlZ2lzdGVycwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCkBAIC03NTUsNyArNzU1LDcgQEAKICNkZWZpbmUgQV9TQ0RfVFJBQ0VfU0VRVUVOQ0VfNiAgICAgIDB4MDAxMDAyMEE5MAogI2RlZmluZSBBX1NDRF9UUkFDRV9TRVFVRU5DRV83ICAgICAgMHgwMDEwMDIwQTk4CiAKLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiBTeXN0ZW0gR2VuZXJpYyBETUEgUmVnaXN0ZXJzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9zY2QuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9zY2QuaAppbmRleCAyMmU4MDQxLi5kYmJkNjgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfc2NkLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3NjZC5oCkBAIC0xLDIzICsxLDIzIEBACiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiAgU0IxMjUwIEJvYXJkIFN1cHBvcnQgUGFja2FnZQotICAgICogIAorICAgICoKICAgICAqICBTQ0QgQ29uc3RhbnRzIGFuZCBNYWNyb3MJCQlGaWxlOiBzYjEyNTBfc2NkLmgKLSAgICAqICAKKyAgICAqCiAgICAgKiAgVGhpcyBtb2R1bGUgY29udGFpbnMgY29uc3RhbnRzIGFuZCBtYWNyb3MgdXNlZnVsIGZvcgogICAgICogIG1hbmlwdWxhdGluZyB0aGUgU3lzdGVtIENvbnRyb2wgYW5kIERlYnVnIG1vZHVsZSBvbiB0aGUgMTI1MC4KLSAgICAqICAKKyAgICAqCiAgICAgKiAgU0IxMjUwIHNwZWNpZmljYXRpb24gbGV2ZWw6ICBVc2VyJ3MgbWFudWFsIDEvMDIvMDIKLSAgICAqICAKKyAgICAqCiAgICAgKiAgQXV0aG9yOiAgTWl0Y2ggTGljaHRlbmJlcmcKLSAgICAqICAKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAgICoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqCiAgICAgKiAgQ29weXJpZ2h0IDIwMDAsMjAwMSwyMDAyLDIwMDMKICAgICAqICBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAqICAKLSAgICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICAgICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICAgICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICAgICoKKyAgICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgICAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogICAgICogIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICAgICoKICAgICAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKQEAgLTI3LDcgKzI3LDcgQEAKICAgICAqCiAgICAgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgICAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICAgICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAgICAgKiAgTUEgMDIxMTEtMTMwNyBVU0EKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIApAQCAtMTMwLDQwICsxMzAsNDAgQEAKIC8qIFN5c3RlbSBNYW51ZmFjdHVyaW5nIFJlZ2lzdGVyCiAqIFJlZ2lzdGVyOiBTQ0RfU1lTVEVNX01BTlVGCiAqLwotIAorCiAvKiBXYWZlciBJRDogYml0cyAzMTowICovCiAjZGVmaW5lIFNfU1lTX1dBRkVSSUQxXzIwMCAgICAgICAgX1NCX01BS0U2NCgwKQogI2RlZmluZSBNX1NZU19XQUZFUklEMV8yMDAgICAgICAgIF9TQl9NQUtFTUFTSygzMixTX1NZU19XQUZFUklEMV8yMDApCiAjZGVmaW5lIFZfU1lTX1dBRkVSSUQxXzIwMCh4KSAgICAgX1NCX01BS0VWQUxVRSh4LFNfU1lTX1dBRkVSSUQxXzIwMCkKICNkZWZpbmUgR19TWVNfV0FGRVJJRDFfMjAwKHgpICAgICBfU0JfR0VUVkFMVUUoeCxTX1NZU19XQUZFUklEMV8yMDAsTV9TWVNfV0FGRVJJRDFfMjAwKQotIAorCiAjZGVmaW5lIFNfU1lTX0JJTiAgICAgICAgICAgICAgICAgX1NCX01BS0U2NCgzMikKICNkZWZpbmUgTV9TWVNfQklOICAgICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soNCxTX1NZU19CSU4pCiAjZGVmaW5lIFZfU1lTX0JJTiAgICAgICAgICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfU1lTX0JJTikKICNkZWZpbmUgR19TWVNfQklOICAgICAgICAgICAgICAgICBfU0JfR0VUVkFMVUUoeCxTX1NZU19CSU4sTV9TWVNfQklOKQotIAorCiAvKiBXYWZlciBJRDogYml0cyAzOTozNiAqLwogI2RlZmluZSBTX1NZU19XQUZFUklEMl8yMDAgICAgICAgIF9TQl9NQUtFNjQoMzYpCiAjZGVmaW5lIE1fU1lTX1dBRkVSSUQyXzIwMCAgICAgICAgX1NCX01BS0VNQVNLKDQsU19TWVNfV0FGRVJJRDJfMjAwKQogI2RlZmluZSBWX1NZU19XQUZFUklEMl8yMDAoeCkgICAgIF9TQl9NQUtFVkFMVUUoeCxTX1NZU19XQUZFUklEMl8yMDApCiAjZGVmaW5lIEdfU1lTX1dBRkVSSUQyXzIwMCh4KSAgICAgX1NCX0dFVFZBTFVFKHgsU19TWVNfV0FGRVJJRDJfMjAwLE1fU1lTX1dBRkVSSUQyXzIwMCkKLSAKKwogLyogV2FmZXIgSUQ6IGJpdHMgMzk6MCAqLwogI2RlZmluZSBTX1NZU19XQUZFUklEXzMwMCAgICAgICAgIF9TQl9NQUtFNjQoMCkKICNkZWZpbmUgTV9TWVNfV0FGRVJJRF8zMDAgICAgICAgICBfU0JfTUFLRU1BU0soNDAsU19TWVNfV0FGRVJJRF8zMDApCiAjZGVmaW5lIFZfU1lTX1dBRkVSSURfMzAwKHgpICAgICAgX1NCX01BS0VWQUxVRSh4LFNfU1lTX1dBRkVSSURfMzAwKQogI2RlZmluZSBHX1NZU19XQUZFUklEXzMwMCh4KSAgICAgIF9TQl9HRVRWQUxVRSh4LFNfU1lTX1dBRkVSSURfMzAwLE1fU1lTX1dBRkVSSURfMzAwKQotIAorCiAjZGVmaW5lIFNfU1lTX1hQT1MgICAgICAgICAgICAgICAgX1NCX01BS0U2NCg0MCkKICNkZWZpbmUgTV9TWVNfWFBPUyAgICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soNixTX1NZU19YUE9TKQogI2RlZmluZSBWX1NZU19YUE9TKHgpICAgICAgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX1NZU19YUE9TKQogI2RlZmluZSBHX1NZU19YUE9TKHgpICAgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfU1lTX1hQT1MsTV9TWVNfWFBPUykKLSAKKwogI2RlZmluZSBTX1NZU19ZUE9TICAgICAgICAgICAgICAgIF9TQl9NQUtFNjQoNDYpCiAjZGVmaW5lIE1fU1lTX1lQT1MgICAgICAgICAgICAgICAgX1NCX01BS0VNQVNLKDYsU19TWVNfWVBPUykKICNkZWZpbmUgVl9TWVNfWVBPUyh4KSAgICAgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19TWVNfWVBPUykKICNkZWZpbmUgR19TWVNfWVBPUyh4KSAgICAgICAgICAgICBfU0JfR0VUVkFMVUUoeCxTX1NZU19ZUE9TLE1fU1lTX1lQT1MpCi0gCisKIC8qCiAgKiBTeXN0ZW0gQ29uZmlnIFJlZ2lzdGVyIChUYWJsZSA0LTIpCiAgKiBSZWdpc3RlcjogU0NEX1NZU1RFTV9DRkcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9zbWJ1cy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3NtYnVzLmgKaW5kZXggMjg3Y2JmZS4uMzM1YzUzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3NtYnVzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3NtYnVzLmgKQEAgLTEsMjMgKzEsMjMgQEAKIC8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqICBTQjEyNTAgQm9hcmQgU3VwcG9ydCBQYWNrYWdlCi0gICAgKiAgCisgICAgKgogICAgICogIFNNQlVTIENvbnN0YW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZTogc2IxMjUwX3NtYnVzLmgKLSAgICAqICAKLSAgICAqICBUaGlzIG1vZHVsZSBjb250YWlucyBjb25zdGFudHMgYW5kIG1hY3JvcyB1c2VmdWwgZm9yIAorICAgICoKKyAgICAqICBUaGlzIG1vZHVsZSBjb250YWlucyBjb25zdGFudHMgYW5kIG1hY3JvcyB1c2VmdWwgZm9yCiAgICAgKiAgbWFuaXB1bGF0aW5nIHRoZSBTQjEyNTAncyBTTWJ1cyBkZXZpY2VzLgotICAgICogIAorICAgICoKICAgICAqICBTQjEyNTAgc3BlY2lmaWNhdGlvbiBsZXZlbDogIDAxLzAyLzIwMDIKLSAgICAqICAKKyAgICAqCiAgICAgKiAgQXV0aG9yOiAgTWl0Y2ggTGljaHRlbmJlcmcKLSAgICAqICAKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIAorICAgICoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqCiAgICAgKiAgQ29weXJpZ2h0IDIwMDAsMjAwMSwyMDAyLDIwMDMKICAgICAqICBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAqICAKLSAgICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICAgICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICAgICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICAgICoKKyAgICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgICAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogICAgICogIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICAgICoKICAgICAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKQEAgLTI3LDcgKzI3LDcgQEAKICAgICAqCiAgICAgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgICAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICAgICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAgICAgKiAgTUEgMDIxMTEtMTMwNyBVU0EKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3N5bmNzZXIuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9zeW5jc2VyLmgKaW5kZXggOGQ1ZThlZGQuLmZhMjc2MGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9zeW5jc2VyLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3N5bmNzZXIuaApAQCAtNywxNyArNywxNyBAQAogICAgICogIG1hbmlwdWxhdGluZyB0aGUgU0IxMjUwJ3MgU3luY2hyb25vdXMgU2VyaWFsCiAgICAgKgogICAgICogIFNCMTI1MCBzcGVjaWZpY2F0aW9uIGxldmVsOiAgVXNlcidzIG1hbnVhbCAxLzAyLzAyCi0gICAgKiAgCisgICAgKgogICAgICogIEF1dGhvcjogIE1pdGNoIExpY2h0ZW5iZXJnCiAgICAgKgogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICoKICAgICAqICBDb3B5cmlnaHQgMjAwMCwyMDAxLDIwMDIsMjAwMwogICAgICogIEJyb2FkY29tIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICogIAotICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gICAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gICAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgICAgKgorICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAgICAgKiAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgICAgKgogICAgICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApAQCAtMjcsNyArMjcsNyBAQAogICAgICoKICAgICAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgICAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICAgICAqICBNQSAwMjExMS0xMzA3IFVTQQogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfdWFydC5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3VhcnQuaAppbmRleCA3NjU1ZDY5Li45MjNlYTRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfdWFydC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF91YXJ0LmgKQEAgLTEsMjMgKzEsMjMgQEAKIC8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqICBTQjEyNTAgQm9hcmQgU3VwcG9ydCBQYWNrYWdlCi0gICAgKiAgCisgICAgKgogICAgICogIFVBUlQgQ29uc3RhbnRzCQkJCUZpbGU6IHNiMTI1MF91YXJ0LmgKLSAgICAqICAKLSAgICAqICBUaGlzIG1vZHVsZSBjb250YWlucyBjb25zdGFudHMgYW5kIG1hY3JvcyB1c2VmdWwgZm9yIAorICAgICoKKyAgICAqICBUaGlzIG1vZHVsZSBjb250YWlucyBjb25zdGFudHMgYW5kIG1hY3JvcyB1c2VmdWwgZm9yCiAgICAgKiAgbWFuaXB1bGF0aW5nIHRoZSBTQjEyNTAncyBVQVJUcwogICAgICoKICAgICAqICBTQjEyNTAgc3BlY2lmaWNhdGlvbiBsZXZlbDogIFVzZXIncyBtYW51YWwgMS8wMi8wMgotICAgICogIAorICAgICoKICAgICAqICBBdXRob3I6ICBNaXRjaCBMaWNodGVuYmVyZwotICAgICogIAotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCisgICAgKgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICoKICAgICAqICBDb3B5cmlnaHQgMjAwMCwyMDAxLDIwMDIsMjAwMwogICAgICogIEJyb2FkY29tIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICogIAotICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gICAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gICAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgICAgKgorICAgICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAgICAgKiAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgICAgKgogICAgICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApAQCAtMjcsNyArMjcsNyBAQAogICAgICoKICAgICAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgICAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICAgICAqICBNQSAwMjExMS0xMzA3IFVTQQogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCkBAIC0zNyw3ICszNyw3IEBACiAKICNpbmNsdWRlICJzYjEyNTBfZGVmcy5oIgogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKiBEVUFSVCBSZWdpc3RlcnMKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIApAQCAtMTQ1LDcgKzE0NSw3IEBACiAjZGVmaW5lIFZfRFVBUlRfTUlTQ19DTURfU1RBUlRfQlJFQUsgICAgIFZfRFVBUlRfTUlTQ19DTUQoS19EVUFSVF9NSVNDX0NNRF9TVEFSVF9CUkVBSykKICNkZWZpbmUgVl9EVUFSVF9NSVNDX0NNRF9TVE9QX0JSRUFLICAgICAgVl9EVUFSVF9NSVNDX0NNRChLX0RVQVJUX01JU0NfQ01EX1NUT1BfQlJFQUspCiAKLSNkZWZpbmUgTV9EVUFSVF9DTURfUkVTRVJWRUQgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg3KSAKKyNkZWZpbmUgTV9EVUFSVF9DTURfUkVTRVJWRUQgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg3KQogCiAvKgogICogRFVBUlQgU3RhdHVzIFJlZ2lzdGVyIChUYWJsZSAxMC02KQpAQCAtMTY1LDcgKzE2NSw3IEBACiAKIC8qCiAgKiBEVUFSVCBCYXVkIFJhdGUgUmVnaXN0ZXIgKFRhYmxlIDEwLTcpCi0gKiBSZWdpc3RlcjogRFVBUlRfQ0xLX1NFTF9BIAorICogUmVnaXN0ZXI6IERVQVJUX0NMS19TRUxfQQogICogUmVnaXN0ZXI6IERVQVJUX0NMS19TRUxfQgogICovCiAKQEAgLTMzMiw3ICszMzIsNyBAQAogICAgIChjaGFuID09IDAgPyBNX0RVQVJUX09VVF9QSU5fQ0xSMCA6IE1fRFVBUlRfT1VUX1BJTl9DTFIxKQogCiAjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpCi0vKiAKKy8qCiAgKiBGdWxsIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyCiAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWdjb250ZXh0LmggYi9pbmNsdWRlL2FzbS1taXBzL3NpZ2NvbnRleHQuaAppbmRleCAxODkzOWU4Li5mN2ZiZWJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpZ2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpZ2NvbnRleHQuaApAQCAtMTAsNyArMTAsNyBAQAogI2RlZmluZSBfQVNNX1NJR0NPTlRFWFRfSAogCiAjaW5jbHVkZSA8YXNtL3NnaWRlZnMuaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKICNpZiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTMyCiAKIC8qCkBAIC0zOCw3ICszOCw3IEBACiB9OwogCiAjZW5kaWYgLyogX01JUFNfU0lNID09IF9NSVBTX1NJTV9BQkkzMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwogI2lmIF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fQUJJNjQgfHwgX01JUFNfU0lNID09IF9NSVBTX1NJTV9OQUJJMzIKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lnaW5mby5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWdpbmZvLmgKaW5kZXggYTBlMjZlNi4uNjk4YmVjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWdpbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWdpbmZvLmgKQEAgLTI1LDEwICsyNSwxMCBAQAogLyoKICAqIENhcmVmdWwgdG8ga2VlcCB1bmlvbiBfc2lmaWVsZHMgZnJvbSBzaGlmdGluZyAuLi4KICAqLwotI2lmZGVmIENPTkZJR19NSVBTMzIKKyNpZmRlZiBDT05GSUdfMzJCSVQKICNkZWZpbmUgX19BUkNIX1NJX1BSRUFNQkxFX1NJWkUgKDMgKiBzaXplb2YoaW50KSkKICNlbmRpZgotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKICNkZWZpbmUgX19BUkNIX1NJX1BSRUFNQkxFX1NJWkUgKDQgKiBzaXplb2YoaW50KSkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpbS5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaW0uaAppbmRleCA2MzMzMTY5Li45YzJhZjFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpbS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2ltLmgKQEAgLTExLDEyICsxMSwxMiBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICNkZWZpbmUgX19zdHIyKHgpICN4CiAjZGVmaW5lIF9fc3RyKHgpIF9fc3RyMih4KQogCi0jaWZkZWYgQ09ORklHX01JUFMzMgorI2lmZGVmIENPTkZJR18zMkJJVAogCiAjZGVmaW5lIHNhdmVfc3RhdGljX2Z1bmN0aW9uKHN5bWJvbCkJCQkJCVwKIF9fYXNtX18gKAkJCQkJCQkJXApAQCAtNDIsOSArNDIsOSBAQAogCiAjZGVmaW5lIG5hYmlfbm9fcmVnYXJncwogCi0jZW5kaWYgLyogQ09ORklHX01JUFMzMiAqLworI2VuZGlmIC8qIENPTkZJR18zMkJJVCAqLwogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCiAjZGVmaW5lIHNhdmVfc3RhdGljX2Z1bmN0aW9uKHN5bWJvbCkJCQkJCVwKIF9fYXNtX18gKAkJCQkJCQkJXApAQCAtNzgsNiArNzgsNiBAQAogCXVuc2lnbmVkIGxvbmcgX19kdW1teTYsCQkJCQkJXAogCXVuc2lnbmVkIGxvbmcgX19kdW1teTcsCiAKLSNlbmRpZiAvKiBDT05GSUdfTUlQUzY0ICovCisjZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAKICNlbmRpZiAvKiBfQVNNX1NJTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NvY2tldC5oIGIvaW5jbHVkZS9hc20tbWlwcy9zb2NrZXQuaAppbmRleCBkNDc4YTg2Li43NTNiNjYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc29ja2V0LmgKQEAgLTgyLDcgKzgyLDcgQEAKICAqIEBTT0NLX1NUUkVBTSAtIHN0cmVhbSAoY29ubmVjdGlvbikgc29ja2V0CiAgKiBAU09DS19SQVcgLSByYXcgc29ja2V0CiAgKiBAU09DS19SRE0gLSByZWxpYWJseS1kZWxpdmVyZWQgbWVzc2FnZQotICogQFNPQ0tfU0VRUEFDS0VUIC0gc2VxdWVudGlhbCBwYWNrZXQgc29ja2V0IAorICogQFNPQ0tfU0VRUEFDS0VUIC0gc2VxdWVudGlhbCBwYWNrZXQgc29ja2V0CiAgKiBAU09DS19QQUNLRVQgLSBsaW51eCBzcGVjaWZpYyB3YXkgb2YgZ2V0dGluZyBwYWNrZXRzIGF0IHRoZSBkZXYgbGV2ZWwuCiAgKgkJICBGb3Igd3JpdGluZyByYXJwIGFuZCBvdGhlciBzaW1pbGFyIHRoaW5ncyBvbiB0aGUgdXNlciBsZXZlbC4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tbWlwcy9zcGlubG9jay5oCmluZGV4IDExNGQzZWIuLjRkMDEzNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrLmgKQEAgLTE2LDIwICsxNiwxMCBAQAogICogWW91ciBiYXNpYyBTTVAgc3BpbmxvY2tzLCBhbGxvd2luZyBvbmx5IGEgc2luZ2xlIENQVSBhbnl3aGVyZQogICovCiAKLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHNwaW5sb2NrX3Q7Ci0KLSNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VEIChzcGlubG9ja190KSB7IDAgfQotCi0jZGVmaW5lIHNwaW5fbG9ja19pbml0KHgpCWRvIHsgKHgpLT5sb2NrID0gMDsgfSB3aGlsZSgwKQotCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpCSgoeCktPmxvY2sgIT0gMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdCh4KQlkbyB7IGJhcnJpZXIoKTsgfSB3aGlsZSAoKHgpLT5sb2NrKQotI2RlZmluZSBfcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX3Jhd19zcGluX2xvY2sobG9jaykKKyNkZWZpbmUgX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkJKCh4KS0+bG9jayAhPSAwKQorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KHgpIFwKKwkJZG8geyBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoKHgpLT5sb2NrKQogCiAvKgogICogU2ltcGxlIHNwaW4gbG9jayBvcGVyYXRpb25zLiAgVGhlcmUgYXJlIHR3byB2YXJpYW50cywgb25lIGNsZWFycyBJUlEncwpAQCAtMzgsMTMgKzI4LDEzIEBACiAgKiBXZSBtYWtlIG5vIGZhaXJuZXNzIGFzc3VtcHRpb25zLiAgVGhleSBoYXZlIGEgY29zdC4KICAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIAogCWlmIChSMTAwMDBfTExTQ19XQVIpIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAlub3Jlb3JkZXIJIyBfcmF3X3NwaW5fbG9jawlcbiIKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3NwaW5fbG9jawlcbiIKIAkJIjE6CWxsCSUxLCAlMgkJCQkJXG4iCiAJCSIJYm5legklMSwgMWIJCQkJCVxuIgogCQkiCSBsaQklMSwgMQkJCQkJXG4iCkBAIC01OCw3ICs0OCw3IEBACiAJCTogIm1lbW9yeSIpOwogCX0gZWxzZSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX3Jhd19zcGluX2xvY2sJXG4iCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19zcGluX2xvY2sJXG4iCiAJCSIxOglsbAklMSwgJTIJCQkJCVxuIgogCQkiCWJuZXoJJTEsIDFiCQkJCQlcbiIKIAkJIgkgbGkJJTEsIDEJCQkJCVxuIgpAQCAtNzIsMTAgKzYyLDEwIEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSIJLnNldAlub3Jlb3JkZXIJIyBfcmF3X3NwaW5fdW5sb2NrCVxuIgorCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19zcGluX3VubG9jawlcbiIKIAkiCXN5bmMJCQkJCQlcbiIKIAkiCXN3CSQwLCAlMAkJCQkJXG4iCiAJIgkuc2V0XHRyZW9yZGVyCQkJCQlcbiIKQEAgLTg0LDEzICs3NCwxMyBAQAogCTogIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfcmF3X3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCXVuc2lnbmVkIGludCB0ZW1wLCByZXM7CiAKIAlpZiAoUjEwMDAwX0xMU0NfV0FSKSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX3Jhd19zcGluX3RyeWxvY2sJXG4iCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19zcGluX3RyeWxvY2sJXG4iCiAJCSIxOglsbAklMCwgJTMJCQkJCVxuIgogCQkiCW9yaQklMiwgJTAsIDEJCQkJXG4iCiAJCSIJc2MJJTIsICUxCQkJCQlcbiIKQEAgLTEwNCw3ICs5NCw3IEBACiAJCTogIm1lbW9yeSIpOwogCX0gZWxzZSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX3Jhd19zcGluX3RyeWxvY2sJXG4iCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19zcGluX3RyeWxvY2sJXG4iCiAJCSIxOglsbAklMCwgJTMJCQkJCVxuIgogCQkiCW9yaQklMiwgJTAsIDEJCQkJXG4iCiAJCSIJc2MJJTIsICUxCQkJCQlcbiIKQEAgLTEyOSwyNCArMTE5LDEzIEBACiAgKiByZWFkLWxvY2tzLgogICovCiAKLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHJ3bG9ja190OwotCi0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQgKHJ3bG9ja190KSB7IDAgfQotCi0jZGVmaW5lIHJ3bG9ja19pbml0KHgpICBkbyB7ICooeCkgPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3JlYWRfbG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIAogCWlmIChSMTAwMDBfTExTQ19XQVIpIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAlub3Jlb3JkZXIJIyBfcmF3X3JlYWRfbG9jawlcbiIKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3JlYWRfbG9jawlcbiIKIAkJIjE6CWxsCSUxLCAlMgkJCQkJXG4iCiAJCSIJYmx0egklMSwgMWIJCQkJCVxuIgogCQkiCSBhZGR1CSUxLCAxCQkJCQlcbiIKQEAgLTE2MCw3ICsxMzksNyBAQAogCQk6ICJtZW1vcnkiKTsKIAl9IGVsc2UgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW5vcmVvcmRlcgkjIF9yYXdfcmVhZF9sb2NrCVxuIgorCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfcmVhZF9sb2NrCVxuIgogCQkiMToJbGwJJTEsICUyCQkJCQlcbiIKIAkJIglibHR6CSUxLCAxYgkJCQkJXG4iCiAJCSIJIGFkZHUJJTEsIDEJCQkJCVxuIgpAQCAtMTc3LDEzICsxNTYsMTMgQEAKIC8qIE5vdGUgdGhlIHVzZSBvZiBzdWIsIG5vdCBzdWJ1IHdoaWNoIHdpbGwgbWFrZSB0aGUga2VybmVsIGRpZSB3aXRoIGFuCiAgICBvdmVyZmxvdyBleGNlcHRpb24gaWYgd2UgZXZlciB0cnkgdG8gdW5sb2NrIGFuIHJ3bG9jayB0aGF0IGlzIGFscmVhZHkKICAgIHVubG9ja2VkIG9yIGlzIGJlaW5nIGhlbGQgYnkgYSB3cml0ZXIuICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfcmVhZF91bmxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3JlYWRfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIAogCWlmIChSMTAwMDBfTExTQ19XQVIpIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIxOglsbAklMSwgJTIJCSMgX3Jhd19yZWFkX3VubG9jawlcbiIKKwkJIjE6CWxsCSUxLCAlMgkJIyBfX3Jhd19yZWFkX3VubG9jawlcbiIKIAkJIglzdWIJJTEsIDEJCQkJCVxuIgogCQkiCXNjCSUxLCAlMAkJCQkJXG4iCiAJCSIJYmVxemwJJTEsIDFiCQkJCQlcbiIKQEAgLTE5Myw3ICsxNzIsNyBAQAogCQk6ICJtZW1vcnkiKTsKIAl9IGVsc2UgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW5vcmVvcmRlcgkjIF9yYXdfcmVhZF91bmxvY2sJXG4iCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19yZWFkX3VubG9jawlcbiIKIAkJIjE6CWxsCSUxLCAlMgkJCQkJXG4iCiAJCSIJc3ViCSUxLCAxCQkJCQlcbiIKIAkJIglzYwklMSwgJTAJCQkJCVxuIgpAQCAtMjA2LDEzICsxODUsMTMgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCiAJaWYgKFIxMDAwMF9MTFNDX1dBUikgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW5vcmVvcmRlcgkjIF9yYXdfd3JpdGVfbG9jawlcbiIKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3dyaXRlX2xvY2sJXG4iCiAJCSIxOglsbAklMSwgJTIJCQkJCVxuIgogCQkiCWJuZXoJJTEsIDFiCQkJCQlcbiIKIAkJIgkgbHVpCSUxLCAweDgwMDAJCQkJXG4iCkBAIC0yMjYsNyArMjA1LDcgQEAKIAkJOiAibWVtb3J5Iik7CiAJfSBlbHNlIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAlub3Jlb3JkZXIJIyBfcmF3X3dyaXRlX2xvY2sJXG4iCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd193cml0ZV9sb2NrCVxuIgogCQkiMToJbGwJJTEsICUyCQkJCQlcbiIKIAkJIglibmV6CSUxLCAxYgkJCQkJXG4iCiAJCSIJIGx1aQklMSwgMHg4MDAwCQkJCVxuIgpAQCAtMjQxLDI2ICsyMjAsMjYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX3VubG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JIglzeW5jCQkJIyBfcmF3X3dyaXRlX3VubG9jawlcbiIKKwkiCXN5bmMJCQkjIF9fcmF3X3dyaXRlX3VubG9jawlcbiIKIAkiCXN3CSQwLCAlMAkJCQkJXG4iCiAJOiAiPW0iIChydy0+bG9jaykKIAk6ICJtIiAocnctPmxvY2spCiAJOiAibWVtb3J5Iik7CiB9CiAKLSNkZWZpbmUgX3Jhd19yZWFkX3RyeWxvY2sobG9jaykgZ2VuZXJpY19yYXdfcmVhZF90cnlsb2NrKGxvY2spCisjZGVmaW5lIF9fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSBnZW5lcmljX19yYXdfcmVhZF90cnlsb2NrKGxvY2spCiAKLXN0YXRpYyBpbmxpbmUgaW50IF9yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIAlpbnQgcmV0OwogCiAJaWYgKFIxMDAwMF9MTFNDX1dBUikgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW5vcmVvcmRlcgkjIF9yYXdfd3JpdGVfdHJ5bG9jawlcbiIKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3dyaXRlX3RyeWxvY2sJXG4iCiAJCSIJbGkJJTIsIDAJCQkJCVxuIgogCQkiMToJbGwJJTEsICUzCQkJCQlcbiIKIAkJIglibmV6CSUxLCAyZgkJCQkJXG4iCkBAIC0yNzcsNyArMjU2LDcgQEAKIAkJOiAibWVtb3J5Iik7CiAJfSBlbHNlIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAlub3Jlb3JkZXIJIyBfcmF3X3dyaXRlX3RyeWxvY2sJXG4iCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd193cml0ZV90cnlsb2NrCVxuIgogCQkiCWxpCSUyLCAwCQkJCQlcbiIKIAkJIjE6CWxsCSUxLCAlMwkJCQkJXG4iCiAJCSIJYm5legklMSwgMmYJCQkJCVxuIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zcGlubG9ja190eXBlcy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjZjNTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfQVNNX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX0FTTV9TUElOTE9DS19UWVBFU19ICisKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19UWVBFU19ICisjIGVycm9yICJwbGVhc2UgZG9uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkiCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAwIH0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyAwIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3N0YWNrZnJhbWUuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc3RhY2tmcmFtZS5oCmluZGV4IDg2MjgzYzIuLjdiNWU2NDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc3RhY2tmcmFtZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc3RhY2tmcmFtZS5oCkBAIC0xNSw3ICsxNSw3IEBACiAKICNpbmNsdWRlIDxhc20vYXNtLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAJCS5tYWNybwlTQVZFX0FUCiAJCS5zZXQJcHVzaApAQCAtMjYsNyArMjYsNyBAQAogCiAJCS5tYWNybwlTQVZFX1RFTVAKIAkJbWZoaQl2MQotI2lmZGVmIENPTkZJR19NSVBTMzIKKyNpZmRlZiBDT05GSUdfMzJCSVQKIAkJTE9OR19TCSQ4LCBQVF9SOChzcCkKIAkJTE9OR19TCSQ5LCBQVF9SOShzcCkKICNlbmRpZgpAQCAtNTYsNyArNTYsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCQkubWFjcm8JZ2V0X3NhdmVkX3NwCS8qIFNNUCB2YXJpYXRpb24gKi8KLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAJCW1mYzAJazAsIENQMF9DT05URVhUCiAJCWx1aQlrMSwgJWhpKGtlcm5lbHNwKQogCQlzcmwJazAsIGswLCAyMwpAQCAtNjQsNyArNjQsNyBAQAogCQlhZGR1CWsxLCBrMAogCQlMT05HX0wJazEsICVsbyhrZXJuZWxzcCkoazEpCiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTNjQpICYmICFkZWZpbmVkKENPTkZJR19CVUlMRF9FTEY2NCkKKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgJiYgIWRlZmluZWQoQ09ORklHX0JVSUxEX0VMRjY0KQogCQlNRkMwCWsxLCBDUDBfQ09OVEVYVAogCQlkc3JhCWsxLCAyMwogCQlsdWkJazAsICVoaShwZ2RfY3VycmVudCkKQEAgLTc0LDcgKzc0LDcgQEAKIAkJZGFkZHUJazEsIGswCiAJCUxPTkdfTAlrMSwgJWxvKGtlcm5lbHNwKShrMSkKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX01JUFM2NCkgJiYgZGVmaW5lZChDT05GSUdfQlVJTERfRUxGNjQpCisjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpICYmIGRlZmluZWQoQ09ORklHX0JVSUxEX0VMRjY0KQogCQlNRkMwCWsxLCBDUDBfQ09OVEVYVAogCQlkc3JsCWsxLCAyMwogCQlkc2xsCWsxLCBrMSwgMwpAQCAtODMsMjAgKzgzLDIwIEBACiAJCS5lbmRtCiAKIAkJLm1hY3JvCXNldF9zYXZlZF9zcCBzdGFja3AgdGVtcCB0ZW1wMgotI2lmZGVmIENPTkZJR19NSVBTMzIKKyNpZmRlZiBDT05GSUdfMzJCSVQKIAkJbWZjMAlcdGVtcCwgQ1AwX0NPTlRFWFQKIAkJc3JsCVx0ZW1wLCAyMwogCQlzbGwJXHRlbXAsIDIKIAkJTE9OR19TCVxzdGFja3AsIGtlcm5lbHNwKFx0ZW1wKQogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfTUlQUzY0KSAmJiAhZGVmaW5lZChDT05GSUdfQlVJTERfRUxGNjQpCisjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpICYmICFkZWZpbmVkKENPTkZJR19CVUlMRF9FTEY2NCkKIAkJbHcJXHRlbXAsIFRJX0NQVShncCkKIAkJZHNsbAlcdGVtcCwgMwogCQlsdWkJXHRlbXAyLCAlaGkoa2VybmVsc3ApCiAJCWRhZGR1CVx0ZW1wLCBcdGVtcDIKIAkJTE9OR19TCVxzdGFja3AsICVsbyhrZXJuZWxzcCkoXHRlbXApCiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTNjQpICYmIGRlZmluZWQoQ09ORklHX0JVSUxEX0VMRjY0KQorI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSAmJiBkZWZpbmVkKENPTkZJR19CVUlMRF9FTEY2NCkKIAkJbHcJXHRlbXAsIFRJX0NQVShncCkKIAkJZHNsbAlcdGVtcCwgMwogCQlMT05HX1MJXHN0YWNrcCwga2VybmVsc3AoXHRlbXApCkBAIC0xNDAsNyArMTQwLDcgQEAKIAkJTE9OR19TCSQ2LCBQVF9SNihzcCkKIAkJTUZDMAl2MSwgQ1AwX0VQQwogCQlMT05HX1MJJDcsIFBUX1I3KHNwKQotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAkJTE9OR19TCSQ4LCBQVF9SOChzcCkKIAkJTE9OR19TCSQ5LCBQVF9SOShzcCkKICNlbmRpZgpAQCAtMTY5LDcgKzE2OSw3IEBACiAKIAkJLm1hY3JvCVJFU1RPUkVfVEVNUAogCQlMT05HX0wJJDI0LCBQVF9MTyhzcCkKLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAJCUxPTkdfTAkkOCwgUFRfUjgoc3ApCiAJCUxPTkdfTAkkOSwgUFRfUjkoc3ApCiAjZW5kaWYKQEAgLTIxNyw3ICsyMTcsNyBAQAogCQlMT05HX0wJJDMxLCBQVF9SMzEoc3ApCiAJCUxPTkdfTAkkMjgsIFBUX1IyOChzcCkKIAkJTE9OR19MCSQyNSwgUFRfUjI1KHNwKQotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAkJTE9OR19MCSQ4LCBQVF9SOChzcCkKIAkJTE9OR19MCSQ5LCBQVF9SOShzcCkKICNlbmRpZgpAQCAtMjYyLDcgKzI2Miw3IEBACiAJCUxPTkdfTAkkMzEsIFBUX1IzMShzcCkKIAkJTE9OR19MCSQyOCwgUFRfUjI4KHNwKQogCQlMT05HX0wJJDI1LCBQVF9SMjUoc3ApCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogCQlMT05HX0wJJDgsIFBUX1I4KHNwKQogCQlMT05HX0wJJDksIFBUX1I5KHNwKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3N0YXRmcy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zdGF0ZnMuaAppbmRleCA1MDc2ZmVjLi5jM2RkZjk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3N0YXRmcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc3RhdGZzLmgKQEAgLTU3LDcgKzU3LDcgQEAKIH07CiAKICNlbmRpZiAvKiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTMyICovCi0gCisKICNpZiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTY0CiAKIHN0cnVjdCBzdGF0ZnM2NCB7CQkJLyogU2FtZSBhcyBzdHJ1Y3Qgc3RhdGZzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3N0cmluZy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zdHJpbmcuaAppbmRleCBiMTgzNDU1Li41YTA2ZjZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3N0cmluZy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc3RyaW5nLmgKQEAgLTE2LDcgKzE2LDcgQEAKICAqIE1vc3Qgb2YgdGhlIGlubGluZSBmdW5jdGlvbnMgYXJlIHJhdGhlciBuYWl2ZSBpbXBsZW1lbnRhdGlvbnMgc28gSSBqdXN0CiAgKiBkaWRuJ3QgYm90aGVyIHVwZGF0aW5nIHRoZW0gZm9yIDY0LWJpdCAuLi4KICAqLwotI2lmZGVmIENPTkZJR19NSVBTMzIKKyNpZmRlZiBDT05GSUdfMzJCSVQKIAogI2lmbmRlZiBJTl9TVFJJTkdfQwogCkBAIC0xMzAsNyArMTMwLDcgQEAKIAogCXJldHVybiBfX3JlczsKIH0KLSNlbmRpZiAvKiBDT05GSUdfTUlQUzMyICovCisjZW5kaWYgLyogQ09ORklHXzMyQklUICovCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNU0VUCiBleHRlcm4gdm9pZCAqbWVtc2V0KHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fY291bnQpOwpAQCAtMTQxLDcgKzE0MSw3IEBACiAjZGVmaW5lIF9fSEFWRV9BUkNIX01FTU1PVkUKIGV4dGVybiB2b2lkICptZW1tb3ZlKHZvaWQgKl9fZGVzdCwgX19jb25zdF9fIHZvaWQgKl9fc3JjLCBzaXplX3QgX19uKTsKIAotI2lmZGVmIENPTkZJR19NSVBTMzIKKyNpZmRlZiBDT05GSUdfMzJCSVQKICNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNU0NBTgogc3RhdGljIF9faW5saW5lX18gdm9pZCAqbWVtc2Nhbih2b2lkICpfX2FkZHIsIGludCBfX2MsIHNpemVfdCBfX3NpemUpCiB7CkBAIC0xNjEsNiArMTYxLDYgQEAKIAogCXJldHVybiBfX2FkZHI7CiB9Ci0jZW5kaWYgLyogQ09ORklHX01JUFMzMiAqLworI2VuZGlmIC8qIENPTkZJR18zMkJJVCAqLwogCiAjZW5kaWYgLyogX0FTTV9TVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLW1pcHMvc3lzdGVtLmgKaW5kZXggMTY5ZjNkNC4uNjY2M2VmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3N5c3RlbS5oCkBAIC0yMDgsNyArMjA4LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi0jaWZkZWYgQ09ORklHX01JUFM2NAorI2lmZGVmIENPTkZJR182NEJJVAogc3RhdGljIGlubGluZSBfX3U2NCBfX3hjaGdfdTY0KHZvbGF0aWxlIF9fdTY0ICogbSwgX191NjQgdmFsKQogewogCV9fdTY0IHJldHZhbDsKQEAgLTMzMCw3ICszMzAsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLSNpZmRlZiBDT05GSUdfTUlQUzY0CisjaWZkZWYgQ09ORklHXzY0QklUCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19jbXB4Y2hnX3U2NCh2b2xhdGlsZSBpbnQgKiBtLCB1bnNpZ25lZCBsb25nIG9sZCwKIAl1bnNpZ25lZCBsb25nIG5ldykKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLW1pcHMvdGhyZWFkX2luZm8uaAppbmRleCA0MmZjZDZmLi5hNzBjYjA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy90aHJlYWRfaW5mby5oCkBAIC02MiwxMCArNjIsMTAgQEAKICNkZWZpbmUgY3VycmVudF90aHJlYWRfaW5mbygpICBfX2N1cnJlbnRfdGhyZWFkX2luZm8KIAogLyogdGhyZWFkIGluZm9ybWF0aW9uIGFsbG9jYXRpb24gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19QQUdFX1NJWkVfNEtCKSAmJiBkZWZpbmVkKENPTkZJR19NSVBTMzIpCisjaWYgZGVmaW5lZChDT05GSUdfUEFHRV9TSVpFXzRLQikgJiYgZGVmaW5lZChDT05GSUdfMzJCSVQpCiAjZGVmaW5lIFRIUkVBRF9TSVpFX09SREVSICgxKQogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfUEFHRV9TSVpFXzRLQikgJiYgZGVmaW5lZChDT05GSUdfTUlQUzY0KQorI2lmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV80S0IpICYmIGRlZmluZWQoQ09ORklHXzY0QklUKQogI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUiAoMikKICNlbmRpZgogI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfOEtCCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3RpdGFuX2RlcC5oIGIvaW5jbHVkZS9hc20tbWlwcy90aXRhbl9kZXAuaAppbmRleCBmZDk1OTllLi5mZWUxOTA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3RpdGFuX2RlcC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdGl0YW5fZGVwLmgKQEAgLTIyOCw0ICsyMjgsNCBAQAogI2RlZmluZSBSTTlLX1JFQURfOChvZnMsIHZhbCkgICAqKHZhbCkgPSAqKHZvbGF0aWxlIHU4ICopKFJNOTAwMHgyX0JBU0VfQUREUitvZnMpCiAjZGVmaW5lIFJNOUtfUkVBRF8xNihvZnMsIHZhbCkgICoodmFsKSA9ICoodm9sYXRpbGUgdTE2ICopKFJNOTAwMHgyX0JBU0VfQUREUitvZnMpCiAKLSNlbmRpZiAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy90eDQ5MjcvdHg0OTI3LmggYi9pbmNsdWRlL2FzbS1taXBzL3R4NDkyNy90eDQ5MjcuaAppbmRleCA1ZDkzOWRiLi4zYmI3ZjAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3R4NDkyNy90eDQ5MjcuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3R4NDkyNy90eDQ5MjcuaApAQCAtNDUsMTQgKzQ1LDE0IEBACiAKIAogLyogVFg0OTI3IFNEUkFNIGNvbnRyb2xsZXIgKDY0LWJpdCByZWdpc3RlcnMpICovCi0jZGVmaW5lIFRYNDkyN19TRFJBTUNfQkFTRSAgICAgICAgICAgICAgMHg4MDAwIAotI2RlZmluZSBUWDQ5MjdfU0RSQU1DX1NEQ0NSMCAgICAgICAgICAgIDB4ODAwMCAKKyNkZWZpbmUgVFg0OTI3X1NEUkFNQ19CQVNFICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgVFg0OTI3X1NEUkFNQ19TRENDUjAgICAgICAgICAgICAweDgwMDAKICNkZWZpbmUgVFg0OTI3X1NEUkFNQ19TRENDUjEgICAgICAgICAgICAweDgwMDgKICNkZWZpbmUgVFg0OTI3X1NEUkFNQ19TRENDUjIgICAgICAgICAgICAweDgwMTAKICNkZWZpbmUgVFg0OTI3X1NEUkFNQ19TRENDUjMgICAgICAgICAgICAweDgwMTgKICNkZWZpbmUgVFg0OTI3X1NEUkFNQ19TRENUUiAgICAgICAgICAgICAweDgwNDAKICNkZWZpbmUgVFg0OTI3X1NEUkFNQ19TRENNRCAgICAgICAgICAgICAweDgwNTgKLSNkZWZpbmUgVFg0OTI3X1NEUkFNQ19MSU1JVCAgICAgICAgICAgICAweDhmZmYgCisjZGVmaW5lIFRYNDkyN19TRFJBTUNfTElNSVQgICAgICAgICAgICAgMHg4ZmZmCiAKIAogLyogVFg0OTI3IGV4dGVybmFsIGJ1cyBjb250cm9sbGVyICg2NC1iaXQgcmVnaXN0ZXJzKSAqLwpAQCAtMjg5LDggKzI4OSw4IEBACiAKIAogLyogVFg0OTI3IHNlcmlhbCBwb3J0IDAgKDMyLWJpdCByZWdpc3RlcnMpICovCi0jZGVmaW5lIFRYNDkyN19TSU8wX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMzAwIAotI2RlZmluZSBUWDQ5MjdfU0lPMF9TSUxDUjAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjMwMCAKKyNkZWZpbmUgVFg0OTI3X1NJTzBfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAweGYzMDAKKyNkZWZpbmUgVFg0OTI3X1NJTzBfU0lMQ1IwICAgICAgICAgICAgICAgICAgICAgICAweGYzMDAKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lMQ1IwX1JFU0VSVkVEXzE2XzMxICAgICAgICAgICAgICAgIEJNXzE2XzMxCiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJTENSMF9SV1VCICAgICAgICAgICAgICAgICAgICAgICAgICBCTV8xNV8xNQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSUxDUjBfVFdVQiAgICAgICAgICAgICAgICAgICAgICAgICAgQk1fMTRfMTQKQEAgLTMwOSw3ICszMDksNyBAQAogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSUxDUjBfVU1PREVfREFUQV83X0JJVCAgICAgICAgICAgICh+Qk1fMDBfMDEpCiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJTENSMF9VTU9ERV9EQVRBXzhfQklUX01DICAgICAgICAgICBCTV8wMV8wMQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSUxDUjBfVU1PREVfREFUQV83X0JJVF9NQyAgICAgICAgICAgQk1fMDBfMDEKLSNkZWZpbmUgVFg0OTI3X1NJTzBfU0lESUNSMCAgICAgICAgICAgICAgICAgICAgICAweGYzMDQgCisjZGVmaW5lIFRYNDkyN19TSU8wX1NJRElDUjAgICAgICAgICAgICAgICAgICAgICAgMHhmMzA0CiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJRElDUjBfUkVTRVJWRURfMTZfMzEgICAgICAgICAgICAgICBCTV8xNl8zMQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSURJQ1IwX1RERSAgICAgICAgICAgICAgICAgICAgICAgICAgQk1fMTVfMTUKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lESUNSMF9SREUgICAgICAgICAgICAgICAgICAgICAgICAgIEJNXzE0XzE0CkBAIC0zMzAsNyArMzMwLDcgQEAKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lESUNSMF9TVElFX1RSRFkgICAgICAgICAgICAgICAgICAgIEJNXzAyXzAyCiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJRElDUjBfU1RJRV9UWEFMUyAgICAgICAgICAgICAgICAgICBCTV8wMV8wMQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSURJQ1IwX1NUSUVfVUJSS0QgICAgICAgICAgICAgICAgICAgQk1fMDBfMDAKLSNkZWZpbmUgVFg0OTI3X1NJTzBfU0lESVNSMCAgICAgICAgICAgICAgICAgICAgICAweGYzMDggCisjZGVmaW5lIFRYNDkyN19TSU8wX1NJRElTUjAgICAgICAgICAgICAgICAgICAgICAgMHhmMzA4CiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJRElTUjBfUkVTRVJWRURfMTZfMzEgICAgICAgICAgICAgICBCTV8xNl8zMQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSURJU1IwX1VCUksgICAgICAgICAgICAgICAgICAgICAgICAgQk1fMTVfMTUKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lESVNSMF9VVkFMSUQgICAgICAgICAgICAgICAgICAgICAgIEJNXzE0XzE0CkBAIC0zNDQsNyArMzQ0LDcgQEAKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lESVNSMF9TVElTICAgICAgICAgICAgICAgICAgICAgICAgIEJNXzA2XzA2CiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJRElTUjBfUkVTRVJWRURfMDVfMDUgICAgICAgICAgICAgICBCTV8wNV8wNQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSURJU1IwX1JGRE4gICAgICAgICAgICAgICAgICAgICAgICAgQk1fMDBfMDQKLSNkZWZpbmUgVFg0OTI3X1NJTzBfU0lTQ0lTUjAgICAgICAgICAgICAgICAgICAgICAweGYzMGMgCisjZGVmaW5lIFRYNDkyN19TSU8wX1NJU0NJU1IwICAgICAgICAgICAgICAgICAgICAgMHhmMzBjCiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJU0NJU1IwX1JFU0VSVkVEXzA2XzMxICAgICAgICAgICAgICBCTV8wNl8zMQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSVNDSVNSMF9PRVJTICAgICAgICAgICAgICAgICAgICAgICAgQk1fMDVfMDUKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lTQ0lTUjBfQ1RTUyAgICAgICAgICAgICAgICAgICAgICAgIEJNXzA0XzA0CkBAIC0zNTIsNyArMzUyLDcgQEAKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lTQ0lTUjBfVFJEWSAgICAgICAgICAgICAgICAgICAgICAgIEJNXzAyXzAyCiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJU0NJU1IwX1RYQUxTICAgICAgICAgICAgICAgICAgICAgICBCTV8wMV8wMQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSVNDSVNSMF9VQlJLRCAgICAgICAgICAgICAgICAgICAgICAgQk1fMDBfMDAKLSNkZWZpbmUgVFg0OTI3X1NJTzBfU0lGQ1IwICAgICAgICAgICAgICAgICAgICAgICAweGYzMTAgCisjZGVmaW5lIFRYNDkyN19TSU8wX1NJRkNSMCAgICAgICAgICAgICAgICAgICAgICAgMHhmMzEwCiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJRkNSMF9SRVNFUlZFRF8xNl8zMSAgICAgICAgICAgICAgICBCTV8xNl8zMQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSUZDUjBfU1dSU1QgICAgICAgICAgICAgICAgICAgICAgICAgQk1fMTZfMzEKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lGQ1IwX1JFU0VSVkVEXzA5XzE0ICAgICAgICAgICAgICAgIEJNXzA5XzE0CkBAIC0zNzAsNyArMzcwLDcgQEAKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lGQ1IwX1RGUlNUICAgICAgICAgICAgICAgICAgICAgICAgIEJNXzAyXzAyCiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJRkNSMF9SRlJTVCAgICAgICAgICAgICAgICAgICAgICAgICBCTV8wMV8wMQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSUZDUjBfRlJTVEUgICAgICAgICAgICAgICAgICAgICAgICAgQk1fMDBfMDAKLSNkZWZpbmUgVFg0OTI3X1NJTzBfU0lGTENSMCAgICAgICAgICAgICAgICAgICAgICAweGYzMTQgCisjZGVmaW5lIFRYNDkyN19TSU8wX1NJRkxDUjAgICAgICAgICAgICAgICAgICAgICAgMHhmMzE0CiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJRkxDUjBfUkVTRVJWRURfMTNfMzEgICAgICAgICAgICAgICBCTV8xM18zMQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSUZMQ1IwX1JDUyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1fMTJfMTIKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lGTENSMF9URVMgICAgICAgICAgICAgICAgICAgICAgICAgIEJNXzExXzExCkBAIC0zODEsNyArMzgxLDcgQEAKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lGTENSMF9SRVNFUlZFRF8wNV8wNiAgICAgICAgICAgICAgIEJNXzA1XzA2CiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJRkxDUjBfUlRTVEwgICAgICAgICAgICAgICAgICAgICAgICBCTV8wMV8wNAogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSUZMQ1IwX1RCUksgICAgICAgICAgICAgICAgICAgICAgICAgQk1fMDBfMDAKLSNkZWZpbmUgVFg0OTI3X1NJTzBfU0lCR1IwICAgICAgICAgICAgICAgICAgICAgICAweGYzMTggCisjZGVmaW5lIFRYNDkyN19TSU8wX1NJQkdSMCAgICAgICAgICAgICAgICAgICAgICAgMHhmMzE4CiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJQkdSMF9SRVNFUlZFRF8xMF8zMSAgICAgICAgICAgICAgICBCTV8xMF8zMQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSUJHUjBfQkNMSyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1fMDhfMDkKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lCR1IwX0JDTEtfVDAgICAgICAgICAgICAgICAgICAgICAofkJNXzA4XzA5KQpAQCAtMzg5LDI4ICszODksMjggQEAKICNkZWZpbmUgVFg0OTI3X1NJTzBfU0lCR1IwX0JDTEtfVDQgICAgICAgICAgICAgICAgICAgICAgIEJNXzA5XzA5CiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJQkdSMF9CQ0xLX1Q2ICAgICAgICAgICAgICAgICAgICAgICBCTV8wOF8wOQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSUJHUjBfQlJEICAgICAgICAgICAgICAgICAgICAgICAgICAgQk1fMDBfMDcKLSNkZWZpbmUgVFg0OTI3X1NJTzBfU0lURklGMDAgICAgICAgICAgICAgICAgICAgICAweGYzMWMgCisjZGVmaW5lIFRYNDkyN19TSU8wX1NJVEZJRjAwICAgICAgICAgICAgICAgICAgICAgMHhmMzFjCiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJVEZJRjAwX1JFU0VSVkVEXzA4XzMxICAgICAgICAgICAgICBCTV8wOF8zMQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSVRGSUYwMF9UWEQgICAgICAgICAgICAgICAgICAgICAgICAgQk1fMDBfMDcKLSNkZWZpbmUgVFg0OTI3X1NJTzBfU0lSRklGTzAgICAgICAgICAgICAgICAgICAgICAweGYzMjAgICAgICAgICAgCisjZGVmaW5lIFRYNDkyN19TSU8wX1NJUkZJRk8wICAgICAgICAgICAgICAgICAgICAgMHhmMzIwCiAjZGVmaW5lIFRYNDkyN19TSU8wX1NJUkZJRk8wX1JFU0VSVkVEXzA4XzMxICAgICAgICAgICAgICBCTV8wOF8zMQogI2RlZmluZSBUWDQ5MjdfU0lPMF9TSVJGSUZPMF9SWEQgICAgICAgICAgICAgICAgICAgICAgICAgQk1fMDBfMDcKLSNkZWZpbmUgVFg0OTI3X1NJTzBfU0lSRklGTzAgICAgICAgICAgICAgICAgICAgICAweGYzMjAgICAgICAgICAgCi0jZGVmaW5lIFRYNDkyN19TSU8wX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgMHhmM2ZmIAorI2RlZmluZSBUWDQ5MjdfU0lPMF9TSVJGSUZPMCAgICAgICAgICAgICAgICAgICAgIDB4ZjMyMAorI2RlZmluZSBUWDQ5MjdfU0lPMF9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjNmZgogCiAKIC8qIFRYNDkyNyBzZXJpYWwgcG9ydCAxICgzMi1iaXQgcmVnaXN0ZXJzKSAqLwotI2RlZmluZSBUWDQ5MjdfU0lPMV9CQVNFICAgICAgICAgICAgICAgIDB4ZjQwMCAKLSNkZWZpbmUgVFg0OTI3X1NJTzFfU0lMQ1IxICAgICAgICAgICAgICAweGY0MDAgCi0jZGVmaW5lIFRYNDkyN19TSU8xX1NJRElDUjEgICAgICAgICAgICAgMHhmNDA0IAotI2RlZmluZSBUWDQ5MjdfU0lPMV9TSURJU1IxICAgICAgICAgICAgIDB4ZjQwOCAKLSNkZWZpbmUgVFg0OTI3X1NJTzFfU0lTQ0lTUjEgICAgICAgICAgICAweGY0MGMgCi0jZGVmaW5lIFRYNDkyN19TSU8xX1NJRkNSMSAgICAgICAgICAgICAgMHhmNDEwIAotI2RlZmluZSBUWDQ5MjdfU0lPMV9TSUZMQ1IxICAgICAgICAgICAgIDB4ZjQxNCAKLSNkZWZpbmUgVFg0OTI3X1NJTzFfU0lCR1IxICAgICAgICAgICAgICAweGY0MTggCi0jZGVmaW5lIFRYNDkyN19TSU8xX1NJVEZJRjAxICAgICAgICAgICAgMHhmNDFjIAotI2RlZmluZSBUWDQ5MjdfU0lPMV9TSVJGSUZPMSAgICAgICAgICAgIDB4ZjQyMCAKLSNkZWZpbmUgVFg0OTI3X1NJTzFfTElNSVQgICAgICAgICAgICAgICAweGY0ZmYgCisjZGVmaW5lIFRYNDkyN19TSU8xX0JBU0UgICAgICAgICAgICAgICAgMHhmNDAwCisjZGVmaW5lIFRYNDkyN19TSU8xX1NJTENSMSAgICAgICAgICAgICAgMHhmNDAwCisjZGVmaW5lIFRYNDkyN19TSU8xX1NJRElDUjEgICAgICAgICAgICAgMHhmNDA0CisjZGVmaW5lIFRYNDkyN19TSU8xX1NJRElTUjEgICAgICAgICAgICAgMHhmNDA4CisjZGVmaW5lIFRYNDkyN19TSU8xX1NJU0NJU1IxICAgICAgICAgICAgMHhmNDBjCisjZGVmaW5lIFRYNDkyN19TSU8xX1NJRkNSMSAgICAgICAgICAgICAgMHhmNDEwCisjZGVmaW5lIFRYNDkyN19TSU8xX1NJRkxDUjEgICAgICAgICAgICAgMHhmNDE0CisjZGVmaW5lIFRYNDkyN19TSU8xX1NJQkdSMSAgICAgICAgICAgICAgMHhmNDE4CisjZGVmaW5lIFRYNDkyN19TSU8xX1NJVEZJRjAxICAgICAgICAgICAgMHhmNDFjCisjZGVmaW5lIFRYNDkyN19TSU8xX1NJUkZJRk8xICAgICAgICAgICAgMHhmNDIwCisjZGVmaW5lIFRYNDkyN19TSU8xX0xJTUlUICAgICAgICAgICAgICAgMHhmNGZmCiAKIAogLyogVFg0OTI3IHBhcmFsbGVsIHBvcnQgKDMyLWJpdCByZWdpc3RlcnMpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3R4NDkyNy90eDQ5MjdfcGNpLmggYi9pbmNsdWRlL2FzbS1taXBzL3R4NDkyNy90eDQ5MjdfcGNpLmgKaW5kZXggMTcwNDMzNC4uMTY1ZjZiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy90eDQ5MjcvdHg0OTI3X3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdHg0OTI3L3R4NDkyN19wY2kuaApAQCAtNSw4ICs1LDggQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBUb3NoaWJhIENvcnBvcmF0aW9uCiAgKi8KLSNpZm5kZWYgX19BU01fVFg0OTI3X1RYNDkyN19QQ0lfSCAKLSNkZWZpbmUgX19BU01fVFg0OTI3X1RYNDkyN19QQ0lfSCAKKyNpZm5kZWYgX19BU01fVFg0OTI3X1RYNDkyN19QQ0lfSAorI2RlZmluZSBfX0FTTV9UWDQ5MjdfVFg0OTI3X1BDSV9ICiAKICNkZWZpbmUgVFg0OTI3X0NDRkdfVE9FIDB4MDAwMDQwMDAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy90eXBlcy5oIGIvaW5jbHVkZS9hc20tbWlwcy90eXBlcy5oCmluZGV4IGQyZjBjNzYuLjQyMWIzYWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3R5cGVzLmgKQEAgLTc4LDcgKzc4LDcgQEAKICNlbmRpZgogCiAjaWYgKGRlZmluZWQoQ09ORklHX0hJR0hNRU0pICYmIGRlZmluZWQoQ09ORklHXzY0QklUX1BIWVNfQUREUikpIFwKLSAgICB8fCBkZWZpbmVkKENPTkZJR19NSVBTNjQpCisgICAgfHwgZGVmaW5lZChDT05GSUdfNjRCSVQpCiB0eXBlZGVmIHU2NCBkbWFfYWRkcl90OwogI2Vsc2UKIHR5cGVkZWYgdTMyIGRtYV9hZGRyX3Q7CkBAIC05OSw4ICs5OSw2IEBACiAjZGVmaW5lIEhBVkVfU0VDVE9SX1QKICNlbmRpZgogCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGttZW1fYnVmY3RsX3Q7Ci0KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tbWlwcy91YWNjZXNzLmgKaW5kZXggMDcxMTQ4OS4uNWMyYzk4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy91YWNjZXNzLmgKQEAgLTIyLDcgKzIyLDcgQEAKICAqCiAgKiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGVzZSBtYWNyb3MgYXJlIGdyb3NzbHkgbWlzbmFtZWQuCiAgKi8KLSNpZmRlZiBDT05GSUdfTUlQUzMyCisjaWZkZWYgQ09ORklHXzMyQklUCiAKICNkZWZpbmUgX19VQV9MSU1JVAkweDgwMDAwMDAwVUwKIApAQCAtMzIsOSArMzIsOSBAQAogI2RlZmluZSBfX1VBX3QwCQkiJDgiCiAjZGVmaW5lIF9fVUFfdDEJCSIkOSIKIAotI2VuZGlmIC8qIENPTkZJR19NSVBTMzIgKi8KKyNlbmRpZiAvKiBDT05GSUdfMzJCSVQgKi8KIAotI2lmZGVmIENPTkZJR19NSVBTNjQKKyNpZmRlZiBDT05GSUdfNjRCSVQKIAogI2RlZmluZSBfX1VBX0xJTUlUCSgtIFRBU0tfU0laRSkKIApAQCAtNDQsNyArNDQsNyBAQAogI2RlZmluZSBfX1VBX3QwCQkiJDEyIgogI2RlZmluZSBfX1VBX3QxCQkiJDEzIgogCi0jZW5kaWYgLyogQ09ORklHX01JUFM2NCAqLworI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCiAvKgogICogVVNFUl9EUyBpcyBhIGJpdG1hc2sgdGhhdCBoYXMgdGhlIGJpdHMgc2V0IHRoYXQgbWF5IG5vdCBiZSBzZXQgaW4gYSB2YWxpZApAQCAtMTEyLDI5ICsxMTIsNiBAQAogCWxpa2VseShfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZykoYWRkciksIChzaXplKSxfX2FjY2Vzc19tYXNrKSkKIAogLyoKLSAqIHZlcmlmeV9hcmVhOiAtIE9ic29sZXRlL2RlcHJlY2F0ZWQgYW5kIHdpbGwgZ28gYXdheSBzb29uLAotICogdXNlIGFjY2Vzc19vaygpIGluc3RlYWQuCi0gKiBAdHlwZTogVHlwZSBvZiBhY2Nlc3M6ICVWRVJJRllfUkVBRCBvciAlVkVSSUZZX1dSSVRFCi0gKiBAYWRkcjogVXNlciBzcGFjZSBwb2ludGVyIHRvIHN0YXJ0IG9mIGJsb2NrIHRvIGNoZWNrCi0gKiBAc2l6ZTogU2l6ZSBvZiBibG9jayB0byBjaGVjawotICoKLSAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiByZXBsYWNlZCBieSBhY2Nlc3Nfb2soKS4KLSAqCi0gKiBDaGVja3MgaWYgYSBwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UgaXMgdmFsaWQuCi0gKgotICogUmV0dXJucyB6ZXJvIGlmIHRoZSBtZW1vcnkgYmxvY2sgbWF5IGJlIHZhbGlkLCAtRUZBVUxUCi0gKiBpZiBpdCBpcyBkZWZpbml0ZWx5IGludmFsaWQuCi0gKgotICogU2VlIGFjY2Vzc19vaygpIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpID8gMCA6IC1FRkFVTFQ7Ci19Ci0KLS8qCiAgKiBwdXRfdXNlcjogLSBXcml0ZSBhIHNpbXBsZSB2YWx1ZSBpbnRvIHVzZXIgc3BhY2UuCiAgKiBAeDogICBWYWx1ZSB0byBjb3B5IHRvIHVzZXIgc3BhY2UuCiAgKiBAcHRyOiBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdW5pc3RkLmgKaW5kZXggNmQyMWNjOS4uYWQ0ZDQ4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3VuaXN0ZC5oCkBAIC0xMTI0LDcgKzExMjQsNyBAQAogIyBpZm5kZWYgX19taXBzNjQKICMgIGRlZmluZSBfX0FSQ0hfV0FOVF9TVEFUNjQKICMgZW5kaWYKLSMgaWZkZWYgQ09ORklHX01JUFMzMgorIyBpZmRlZiBDT05GSUdfMzJCSVQKICMgIGRlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVElNRQogIyBlbmRpZgogIyBpZmRlZiBDT05GSUdfTUlQUzMyX08zMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92cjQxODEvaXJxLmggYi9pbmNsdWRlL2FzbS1taXBzL3ZyNDE4MS9pcnEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmMGVhOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDE4MS9pcnEuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogTWFjcm9zIGZvciB2cjQxODEgSVJRIG51bWJlcnMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBKdW4gU3VuLCBqc3VuQG12aXN0YS5jb20gb3IganN1bkBqdW5zdW4ubmV0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotLyoKLSAqIFN0cmF0ZWd5OgotICoKLSAqIFZyNDE4MSBoYXMgY29uY2VwdHVhbGx5IHRocmVlIGxldmVscyBvZiBpbnRlcnJ1cHQgY29udHJvbGxlcnM6Ci0gKiAgMS4gdGhlIENQVSBpdHNlbGYgd2l0aCA4IGludHIgbGV2ZWwuCi0gKiAgMi4gc3lzdGVtIGludGVycnVwdCBjb250cm9sbGVyLCBjYXNjYWRlZCBmcm9tIGludDAgcGluIGluIENQVSwgMzIgaW50cnMKLSAqICAzLiBHUElPIGludGVycnVwdHMgOiBmb3J3YXJkaW5nIGV4dGVybmFsIGludGVycnVwdHMgdG8gc3lzIGludHIgY29udHJvbGxlcgotICovCi0KLS8qIGRlY2lkZSB0aGUgaXJxIGJsb2NrIGFzc2lnbm1lbnQgKi8KLSNkZWZpbmUJVlI0MTgxX05VTV9DUFVfSVJRCTgKLSNkZWZpbmUJVlI0MTgxX05VTV9TWVNfSVJRCTMyCi0jZGVmaW5lCVZSNDE4MV9OVU1fR1BJT19JUlEJMTYKLQotI2RlZmluZQlWUjQxODFfSVJRX0JBU0UJCTAKLQotI2RlZmluZQlWUjQxODFfQ1BVX0lSUV9CQVNFCVZSNDE4MV9JUlFfQkFTRQotI2RlZmluZQlWUjQxODFfU1lTX0lSUV9CQVNFCShWUjQxODFfQ1BVX0lSUV9CQVNFICsgVlI0MTgxX05VTV9DUFVfSVJRKQotI2RlZmluZQlWUjQxODFfR1BJT19JUlFfQkFTRQkoVlI0MTgxX1NZU19JUlFfQkFTRSArIFZSNDE4MV9OVU1fU1lTX0lSUSkKLQotLyogQ1BVIGludGVycnVwdHMgKi8KLQotLyoKLSAgIElQMCAtIFNvZnR3YXJlIGludGVycnVwdAotICAgSVAxIC0gU29mdHdhcmUgaW50ZXJydXB0Ci0gICBJUDIgLSBBbGwgYnV0IGJhdHRlcnksIGhpZ2ggc3BlZWQgbW9kZW0sIGFuZCByZWFsIHRpbWUgY2xvY2sKLSAgIElQMyAtIFJUQyBMb25nMSAoc3lzdGVtIHRpbWVyKQotICAgSVA0IC0gUlRDIExvbmcyCi0gICBJUDUgLSBIaWdoIFNwZWVkIE1vZGVtICh1bnVzZWQgb24gVlI0MTgxKQotICAgSVA2IC0gVW51c2VkCi0gICBJUDcgLSBUaW1lciBpbnRlcnJ1cHQgZnJvbSBDUE9fQ09NUEFSRQotKi8KLQotI2RlZmluZSBWUjQxODFfSVJRX1NXMSAgICAgICAoVlI0MTgxX0NQVV9JUlFfQkFTRSArIDApCi0jZGVmaW5lIFZSNDE4MV9JUlFfU1cyICAgICAgIChWUjQxODFfQ1BVX0lSUV9CQVNFICsgMSkKLSNkZWZpbmUgVlI0MTgxX0lSUV9JTlQwICAgICAgKFZSNDE4MV9DUFVfSVJRX0JBU0UgKyAyKQotI2RlZmluZSBWUjQxODFfSVJRX0lOVDEgICAgICAoVlI0MTgxX0NQVV9JUlFfQkFTRSArIDMpCi0jZGVmaW5lIFZSNDE4MV9JUlFfSU5UMiAgICAgIChWUjQxODFfQ1BVX0lSUV9CQVNFICsgNCkKLSNkZWZpbmUgVlI0MTgxX0lSUV9JTlQzICAgICAgKFZSNDE4MV9DUFVfSVJRX0JBU0UgKyA1KQotI2RlZmluZSBWUjQxODFfSVJRX0lOVDQgICAgICAoVlI0MTgxX0NQVV9JUlFfQkFTRSArIDYpCi0jZGVmaW5lIFZSNDE4MV9JUlFfVElNRVIgICAgIChWUjQxODFfQ1BVX0lSUV9CQVNFICsgNykKLQotCi0vKiBDYXNjYWRlZCBmcm9tIFZSNDE4MV9JUlFfSU5UMCAoSUNVIG1hcHBlZCBpbnRlcnJ1cHRzKSAqLwotCi0vKgotICAgSVAyIC0gc2FtZSBhcyBWUjQxODFfSVJRX0lOVDEKLSAgIElQOCAtIFRoaXMgaXMgYSBjYXNjYWRlIHRvIEdQSU8gSVJRJ3MuIERvIG5vdCB1c2UuCi0gICBJUDE2IC0gc2FtZSBhcyBWUjQxODFfSVJRX0lOVDIKLSAgIElQMTggLSBDb21wYWN0Rmxhc2gKLSovCi0KLSNkZWZpbmUgVlI0MTgxX0lSUV9CQVRURVJZICAgKFZSNDE4MV9TWVNfSVJRX0JBU0UgKyAwKQotI2RlZmluZSBWUjQxODFfSVJRX1BPV0VSICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDEpCi0jZGVmaW5lIFZSNDE4MV9JUlFfUlRDTDEgICAgIChWUjQxODFfU1lTX0lSUV9CQVNFICsgMikKLSNkZWZpbmUgVlI0MTgxX0lSUV9FVElNRVIgICAgKFZSNDE4MV9TWVNfSVJRX0JBU0UgKyAzKQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTEyICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDQpCi0jZGVmaW5lIFZSNDE4MV9JUlFfUElVICAgICAgIChWUjQxODFfU1lTX0lSUV9CQVNFICsgNSkKLSNkZWZpbmUgVlI0MTgxX0lSUV9BSVUgICAgICAgKFZSNDE4MV9TWVNfSVJRX0JBU0UgKyA2KQotI2RlZmluZSBWUjQxODFfSVJRX0tJVSAgICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDcpCi0jZGVmaW5lIFZSNDE4MV9JUlFfR0lVICAgICAgIChWUjQxODFfU1lTX0lSUV9CQVNFICsgOCkKLSNkZWZpbmUgVlI0MTgxX0lSUV9TSVUgICAgICAgKFZSNDE4MV9TWVNfSVJRX0JBU0UgKyA5KQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTE4ICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDEwKQotI2RlZmluZSBWUjQxODFfSVJRX1NPRlQgICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDExKQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTIwICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDEyKQotI2RlZmluZSBWUjQxODFfSVJRX0RPWkVQSVUgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDEzKQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTIyICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDE0KQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTIzICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDE1KQotI2RlZmluZSBWUjQxODFfSVJRX1JUQ0wyICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDE2KQotI2RlZmluZSBWUjQxODFfSVJRX0xFRCAgICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDE3KQotI2RlZmluZSBWUjQxODFfSVJRX0VDVSAgICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDE4KQotI2RlZmluZSBWUjQxODFfSVJRX0NTVSAgICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDE5KQotI2RlZmluZSBWUjQxODFfSVJRX1VTQiAgICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDIwKQotI2RlZmluZSBWUjQxODFfSVJRX0RNQSAgICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDIxKQotI2RlZmluZSBWUjQxODFfSVJRX0xDRCAgICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDIyKQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTMxICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDIzKQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTMyICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDI0KQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTMzICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDI1KQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTM0ICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDI2KQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTM1ICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDI3KQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTM2ICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDI4KQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTM3ICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDI5KQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTM4ICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDMwKQotI2RlZmluZSBWUjQxODFfSVJRX1JGVTM5ICAgICAoVlI0MTgxX1NZU19JUlFfQkFTRSArIDMxKQotCi0vKiBDYXNjYWRlZCBmcm9tIFZSNDE4MV9JUlFfR0lVICovCi0jZGVmaW5lIFZSNDE4MV9JUlFfR1BJTzAgICAgIChWUjQxODFfR1BJT19JUlFfQkFTRSArIDApCi0jZGVmaW5lIFZSNDE4MV9JUlFfR1BJTzEgICAgIChWUjQxODFfR1BJT19JUlFfQkFTRSArIDEpCi0jZGVmaW5lIFZSNDE4MV9JUlFfR1BJTzIgICAgIChWUjQxODFfR1BJT19JUlFfQkFTRSArIDIpCi0jZGVmaW5lIFZSNDE4MV9JUlFfR1BJTzMgICAgIChWUjQxODFfR1BJT19JUlFfQkFTRSArIDMpCi0jZGVmaW5lIFZSNDE4MV9JUlFfR1BJTzQgICAgIChWUjQxODFfR1BJT19JUlFfQkFTRSArIDQpCi0jZGVmaW5lIFZSNDE4MV9JUlFfR1BJTzUgICAgIChWUjQxODFfR1BJT19JUlFfQkFTRSArIDUpCi0jZGVmaW5lIFZSNDE4MV9JUlFfR1BJTzYgICAgIChWUjQxODFfR1BJT19JUlFfQkFTRSArIDYpCi0jZGVmaW5lIFZSNDE4MV9JUlFfR1BJTzcgICAgIChWUjQxODFfR1BJT19JUlFfQkFTRSArIDcpCi0jZGVmaW5lIFZSNDE4MV9JUlFfR1BJTzggICAgIChWUjQxODFfR1BJT19JUlFfQkFTRSArIDgpCi0jZGVmaW5lIFZSNDE4MV9JUlFfR1BJTzkgICAgIChWUjQxODFfR1BJT19JUlFfQkFTRSArIDkpCi0jZGVmaW5lIFZSNDE4MV9JUlFfR1BJTzEwICAgIChWUjQxODFfR1BJT19JUlFfQkFTRSArIDEwKQotI2RlZmluZSBWUjQxODFfSVJRX0dQSU8xMSAgICAoVlI0MTgxX0dQSU9fSVJRX0JBU0UgKyAxMSkKLSNkZWZpbmUgVlI0MTgxX0lSUV9HUElPMTIgICAgKFZSNDE4MV9HUElPX0lSUV9CQVNFICsgMTIpCi0jZGVmaW5lIFZSNDE4MV9JUlFfR1BJTzEzICAgIChWUjQxODFfR1BJT19JUlFfQkFTRSArIDEzKQotI2RlZmluZSBWUjQxODFfSVJRX0dQSU8xNCAgICAoVlI0MTgxX0dQSU9fSVJRX0JBU0UgKyAxNCkKLSNkZWZpbmUgVlI0MTgxX0lSUV9HUElPMTUgICAgKFZSNDE4MV9HUElPX0lSUV9CQVNFICsgMTUpCi0KLQotLy8gQWx0ZXJuYXRpdmUgdG8gYWJvdmUgR1BJTyBJUlEgZGVmaW5lcwotI2RlZmluZSBWUjQxODFfSVJRX0dQSU8ocGluKSAoKFZSNDE4MV9JUlFfR1BJTzApICsgKHBpbikpCi0KLSNkZWZpbmUgVlI0MTgxX0lSUV9NQVggICAgICAgKFZSNDE4MV9JUlFfQkFTRSArIFZSNDE4MV9OVU1fQ1BVX0lSUSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZSNDE4MV9OVU1fU1lTX0lSUSArIFZSNDE4MV9OVU1fR1BJT19JUlEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDE4MS92cjQxODEuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MTgxL3ZyNDE4MS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzVkNjA3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MTgxL3ZyNDE4MS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgYnkgTWljaGFlbCBLbGFyCi0gKgotICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IGpzdW5AbXZpc3RhLmNvbSBvciBqc3VuQGp1bnN1bi5uZXQKLSAqCi0gKi8KLSNpZm5kZWYgX19BU01fVlI0MTgxX1ZSNDE4MV9ICi0jZGVmaW5lIF9fQVNNX1ZSNDE4MV9WUjQxODFfSAotCi0jaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotCi0jaW5jbHVkZSA8YXNtL3ZyNDE4MS9pcnEuaD4KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLSNkZWZpbmUgX19wcmVnOAkJKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKQotI2RlZmluZSBfX3ByZWcxNgkodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqKQotI2RlZmluZSBfX3ByZWczMgkodm9sYXRpbGUgdW5zaWduZWQgaW50KikKLSNlbHNlCi0jZGVmaW5lIF9fcHJlZzgKLSNkZWZpbmUgX19wcmVnMTYKLSNkZWZpbmUgX19wcmVnMzIKLSNlbmRpZgotCi0vLyBFbWJlZGRlZCBDUFUgcGVyaXBoZXJhbCByZWdpc3RlcnMKLS8vIE5vdGUgdGhhdCBtYW55IG9mIHRoZSByZWdpc3RlcnMgaGF2ZSBkaWZmZXJlbnQgcGh5c2ljYWwgYWRkcmVzcyBmb3IgVlI0MTgxCi0KLS8vIEJ1cyBDb250cm9sIFVuaXQgKEJDVSkKLSNkZWZpbmUgVlI0MTgxX0JDVUNOVFJFRzEJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwMDAwKQkvKiBCQ1UgY29udHJvbCByZWdpc3RlciAxIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9DTVVDTEtNU0sJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwMDA0KQkvKiBDbG9jayBtYXNrIHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9DTVVDTEtNU0tfTVNLQ1NVUENMSyAgMHgwMDQwCi0jZGVmaW5lIFZSNDE4MV9DTVVDTEtNU0tfTVNLQUlVUENMSyAgMHgwMDIwCi0jZGVmaW5lIFZSNDE4MV9DTVVDTEtNU0tfTVNLUElVUENMSyAgMHgwMDEwCi0jZGVmaW5lIFZSNDE4MV9DTVVDTEtNU0tfTVNLQURVUENMSyAgMHgwMDA4Ci0jZGVmaW5lIFZSNDE4MV9DTVVDTEtNU0tfTVNLU0lVMThNICAgMHgwMDA0Ci0jZGVmaW5lIFZSNDE4MV9DTVVDTEtNU0tfTVNLQURVMThNICAgMHgwMDAyCi0jZGVmaW5lIFZSNDE4MV9DTVVDTEtNU0tfTVNLVVNCICAgICAgMHgwMDAxCi0jZGVmaW5lIFZSNDE4MV9DTVVDTEtNU0tfTVNLU0lVICAgICAgVlI0MTgxX0NNVUNMS01TS19NU0tTSVUxOE0KLSNkZWZpbmUgVlI0MTgxX0JDVVNQRUVEUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDAwQykJLyogQkNVIGFjY2VzcyB0aW1lIHBhcmFtZXRlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfQkNVUkZDTlRSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwMDEwKQkvKiBCQ1UgcmVmcmVzaCBjb250cm9sIHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9SRVZJRFJFRwkJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwMDE0KQkvKiBSZXZpc2lvbiBJRCByZWdpc3RlciAoUikgKi8KLSNkZWZpbmUgVlI0MTgxX0NMS1NQRUVEUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDAxOCkJLyogQ2xvY2sgc3BlZWQgcmVnaXN0ZXIgKFIpICovCi0jZGVmaW5lIFZSNDE4MV9FRE9NQ1lUUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDMwMCkJLyogTWVtb3J5IGN5Y2xlIHRpbWluZyByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTUVNQ0ZHX1JFRwlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDAzMDQpCS8qIE1lbW9yeSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NT0RFX1JFRwkJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwMzA4KQkvKiBTRFJBTSBtb2RlIHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TRFRJTUlOR1JFRwlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDAzMEMpCS8qIFNEUkFNIHRpbWluZyByZWdpc3RlciAoUi9XKSAqLwotCi0vLyBETUEgQ29udHJvbCBVbml0IChEQ1UpCi0jZGVmaW5lIFZSNDE4MV9NSUNERVNUMVJFRzEJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwMDIwKQkvKiBNaWNyb3Bob25lIGRlc3RpbmF0aW9uIDEgYWRkcmVzcyByZWdpc3RlciAxIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NSUNERVNUMVJFRzIJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwMDIyKQkvKiBNaWNyb3Bob25lIGRlc3RpbmF0aW9uIDEgYWRkcmVzcyByZWdpc3RlciAyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NSUNERVNUMlJFRzEJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwMDI0KQkvKiBNaWNyb3Bob25lIGRlc3RpbmF0aW9uIDIgYWRkcmVzcyByZWdpc3RlciAxIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NSUNERVNUMlJFRzIJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwMDI2KQkvKiBNaWNyb3Bob25lIGRlc3RpbmF0aW9uIDIgYWRkcmVzcyByZWdpc3RlciAyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TUEtSUkMxUkVHMQlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDAwMjgpCS8qIFNwZWFrZXIgU291cmNlIDEgYWRkcmVzcyByZWdpc3RlciAxIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TUEtSUkMxUkVHMglfX3ByZWcxNihLU0VHMSArIDB4MEEwMDAwMkEpCS8qIFNwZWFrZXIgU291cmNlIDEgYWRkcmVzcyByZWdpc3RlciAyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TUEtSUkMyUkVHMQlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDAwMkMpCS8qIFNwZWFrZXIgU291cmNlIDIgYWRkcmVzcyByZWdpc3RlciAxIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TUEtSUkMyUkVHMglfX3ByZWcxNihLU0VHMSArIDB4MEEwMDAwMkUpCS8qIFNwZWFrZXIgU291cmNlIDIgYWRkcmVzcyByZWdpc3RlciAyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9ETUFSU1RSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwMDQwKQkvKiBETUEgUmVzZXQgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0FJVURNQU1TS1JFRwlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDAwNDYpCS8qIEF1ZGlvIERNQSBtYXNrIHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9VU0JETUFNU0tSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNjAwKQkvKiBVU0IgRE1BIE1hc2sgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1VTQlJYUzFBUkVHMQlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA2MDIpCS8qIFVTQiBSeCBzb3VyY2UgMSBhZGRyZXNzIHJlZ2lzdGVyIDEgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1VTQlJYUzFBUkVHMglfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA2MDQpCS8qIFVTQiBSeCBzb3VyY2UgMSBhZGRyZXNzIHJlZ2lzdGVyIDIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1VTQlJYUzJBUkVHMQlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA2MDYpCS8qIFVTQiBSeCBzb3VyY2UgMiBhZGRyZXNzIHJlZ2lzdGVyIDEgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1VTQlJYUzJBUkVHMglfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA2MDgpCS8qIFVTQiBSeCBzb3VyY2UgMiBhZGRyZXNzIHJlZ2lzdGVyIDIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1VTQlRYUzFBUkVHMQlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA2MEEpCS8qIFVTQiBUeCBzb3VyY2UgMSBhZGRyZXNzIHJlZ2lzdGVyIDEgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1VTQlRYUzFBUkVHMglfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA2MEMpCS8qIFVTQiBUeCBzb3VyY2UgMSBhZGRyZXNzIHJlZ2lzdGVyIDIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1VTQlRYUzJBUkVHMQlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA2MEUpCS8qIFVTQiBUeCBzb3VyY2UgMiBhZGRyZXNzIHJlZ2lzdGVyIDEgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1VTQlRYUzJBUkVHMglfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA2MTApCS8qIFVTQiBUeCBzb3VyY2UgMiBhZGRyZXNzIHJlZ2lzdGVyIDIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1VTQlJYRDFBUkVHMQlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA2MkEpCS8qIFVTQiBSeCBkZXN0aW5hdGlvbiAxIGFkZHJlc3MgcmVnaXN0ZXIgMSAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfVVNCUlhEMUFSRUcyCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDYyQykJLyogVVNCIFJ4IGRlc3RpbmF0aW9uIDEgYWRkcmVzcyByZWdpc3RlciAyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9VU0JSWEQyQVJFRzEJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNjJFKQkvKiBVU0IgUnggZGVzdGluYXRpb24gMiBhZGRyZXNzIHJlZ2lzdGVyIDEgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1VTQlJYRDJBUkVHMglfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA2MzApCS8qIFVTQiBSeCBkZXN0aW5hdGlvbiAyIGFkZHJlc3MgcmVnaXN0ZXIgMiAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfVVNCVFhEMUFSRUcxCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDYzMikJLyogVVNCIFR4IGRlc3RpbmF0aW9uIDEgYWRkcmVzcyByZWdpc3RlciAxIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9VU0JUWEQxQVJFRzIJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNjM0KQkvKiBVU0IgVHggZGVzdGluYXRpb24gMSBhZGRyZXNzIHJlZ2lzdGVyIDIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1VTQlRYRDJBUkVHMQlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA2MzYpCS8qIFVTQiBUeCBkZXN0aW5hdGlvbiAyIGFkZHJlc3MgcmVnaXN0ZXIgMSAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfVVNCVFhEMkFSRUcyCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDYzOCkJLyogVVNCIFR4IGRlc3RpbmF0aW9uIDIgYWRkcmVzcyByZWdpc3RlciAyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9SeFJDTEVOUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDY1MikJLyogVVNCIFJ4IHJlY29yZCBsZW5ndGggcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1R4UkNMRU5SRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNjU0KQkvKiBVU0IgVHggcmVjb3JkIGxlbmd0aCByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTUlDUkNMRU5SRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNjU4KQkvKiBNaWNyb3Bob25lIHJlY29yZCBsZW5ndGggcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NQS1JDTEVOUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDY1QSkJLyogU3BlYWtlciByZWNvcmQgbGVuZ3RoIHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9VU0JDRkdSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNjVDKQkvKiBVU0IgY29uZmlndXJhdGlvbiByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTUlDRE1BQ0ZHUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDY1RSkJLyogTWljcm9waG9uZSBETUEgY29uZmlndXJhdGlvbiByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfU1BLRE1BQ0ZHUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDY2MCkJLyogU3BlYWtlciBETUEgY29uZmlndXJhdGlvbiByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfRE1BSVRSUVJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA2NjIpCS8qIERNQSBpbnRlcnJ1cHQgcmVxdWVzdCByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfRE1BQ0xUUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDY2NCkJLyogRE1BIGNvbnRyb2wgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0RNQUlUTUtSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNjY2KQkvKiBETUEgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKFIvVykgKi8KLQotLy8gSVNBIEJyaWRnZQotI2RlZmluZSBWUjQxODFfSVNBQlJHQ1RMCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDJDMCkJLyogSVNBIEJyaWRnZSBDb250cm9sIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9JU0FCUkdTVFMJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMkMyKQkvKiBJU0EgQnJpZGdlIFN0YXR1cyBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfWElTQUNUTAkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMkM0KQkvKiBFeHRlcm5hbCBJU0EgQ29udHJvbCBSZWdpc3RlciAoUi9XKSAqLwotCi0vLyBDbG9ja2VkIFNlcmlhbCBJbnRlcmZhY2UgKENTSSkKLSNkZWZpbmUgVlI0MTgxX0NTSU1PREUJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDkwMCkJLyogQ1NJIE1vZGUgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0NTSVJYREFUQQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDA5MDIpCS8qIENTSSBSZWNlaXZlIERhdGEgUmVnaXN0ZXIgKFIpICovCi0jZGVmaW5lIFZSNDE4MV9DU0lUWERBVEEJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwOTA0KQkvKiBDU0kgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfQ1NJTFNUQVQJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDkwNikJLyogQ1NJIExpbmUgU3RhdHVzIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9DU0lJTlRNU0sJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwOTA4KQkvKiBDU0kgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0NTSUlOVFNUQVQJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwOTBhKQkvKiBDU0kgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfQ1NJVFhCTEVOCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDkwYykJLyogQ1NJIFRyYW5zbWl0IEJ1cnN0IExlbmd0aCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfQ1NJUlhCTEVOCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDkwZSkJLyogQ1NJIFJlY2VpdmUgQnVyc3QgTGVuZ3RoIFJlZ2lzdGVyIChSL1cpICovCi0KLS8vIEludGVycnVwdCBDb250cm9sIFVuaXQgKElDVSkKLSNkZWZpbmUgVlI0MTgxX1NZU0lOVDFSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwMDgwKQkvKiBMZXZlbCAxIFN5c3RlbSBpbnRlcnJ1cHQgcmVnaXN0ZXIgMSAoUikgKi8KLSNkZWZpbmUgVlI0MTgxX01TWVNJTlQxUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDA4QykJLyogTGV2ZWwgMSBtYXNrIHN5c3RlbSBpbnRlcnJ1cHQgcmVnaXN0ZXIgMSAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTk1JUkVHCQlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDAwOTgpCS8qIE5NSSByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfU09GVElOVFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDAwOUEpCS8qIFNvZnR3YXJlIGludGVycnVwdCByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfU1lTSU5UMlJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDAyMDApCS8qIExldmVsIDEgU3lzdGVtIGludGVycnVwdCByZWdpc3RlciAyIChSKSAqLwotI2RlZmluZSBWUjQxODFfTVNZU0lOVDJSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwMjA2KQkvKiBMZXZlbCAxIG1hc2sgc3lzdGVtIGludGVycnVwdCByZWdpc3RlciAyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QSVVJTlRSRUdybwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAwODIpCS8qIExldmVsIDIgUElVIGludGVycnVwdCByZWdpc3RlciAoUikgKi8KLSNkZWZpbmUgVlI0MTgxX0FJVUlOVFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAwODQpCS8qIExldmVsIDIgQUlVIGludGVycnVwdCByZWdpc3RlciAoUikgKi8KLSNkZWZpbmUgVlI0MTgxX01QSVVJTlRSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMDhFKQkvKiBMZXZlbCAyIG1hc2sgUElVIGludGVycnVwdCByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTUFJVUlOVFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAwOTApCS8qIExldmVsIDIgbWFzayBBSVUgaW50ZXJydXB0IHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NS0lVSU5UUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDA5MikJLyogTGV2ZWwgMiBtYXNrIEtJVSBpbnRlcnJ1cHQgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0tJVUlOVFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAxOTgpCS8qIExldmVsIDIgS0lVIGludGVycnVwdCByZWdpc3RlciAoUikgKi8KLQotLy8gUG93ZXIgTWFuYWdlbWVudCBVbml0IChQTVUpCi0jZGVmaW5lIFZSNDE4MV9QTVVJTlRSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMEEwKQkvKiBQTVUgU3RhdHVzIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QTVVJTlRfUE9XRVJTVyAgMHgxCS8qIFBvd2VyIHN3aXRjaCAqLwotI2RlZmluZSBWUjQxODFfUE1VSU5UX0JBVFQgICAgIDB4MgkvKiBMb3cgYmF0dCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiAqLwotI2RlZmluZSBWUjQxODFfUE1VSU5UX0RFQURNQU4gIDB4NAkvKiBEZWFkbWFuJ3Mgc3dpdGNoICovCi0jZGVmaW5lIFZSNDE4MV9QTVVJTlRfUkVTRVQgICAgMHg4CS8qIFJlc2V0IHN3aXRjaCAqLwotI2RlZmluZSBWUjQxODFfUE1VSU5UX1JUQ1JFU0VUIDB4MTAJLyogUlRDIFJlc2V0ICovCi0jZGVmaW5lIFZSNDE4MV9QTVVJTlRfVElNRU9VVCAgMHgyMAkvKiBIQUwgVGltZXIgUmVzZXQgKi8KLSNkZWZpbmUgVlI0MTgxX1BNVUlOVF9CQVRUTE9XICAweDEwMAkvKiBCYXR0ZXJ5IGxvdyAqLwotI2RlZmluZSBWUjQxODFfUE1VSU5UX1JUQyAgICAgIDB4MjAwCS8qIFJUQyBBbGFybSAqLwotI2RlZmluZSBWUjQxODFfUE1VSU5UX0RDRCAgICAgIDB4NDAwCS8qIERDRCMgKi8KLSNkZWZpbmUgVlI0MTgxX1BNVUlOVF9HUElPMCAgICAweDEwMDAJLyogR1BJTzAgKi8KLSNkZWZpbmUgVlI0MTgxX1BNVUlOVF9HUElPMSAgICAweDIwMDAJLyogR1BJTzEgKi8KLSNkZWZpbmUgVlI0MTgxX1BNVUlOVF9HUElPMiAgICAweDQwMDAJLyogR1BJTzIgKi8KLSNkZWZpbmUgVlI0MTgxX1BNVUlOVF9HUElPMyAgICAweDgwMDAJLyogR1BJTzMgKi8KLQotI2RlZmluZSBWUjQxODFfUE1VQ05UUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDBBMikJLyogUE1VIENvbnRyb2wgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1BNVVdBSVRSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMEE4KQkvKiBQTVUgV2FpdCBDb3VudGVyIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QTVVESVZSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMEFDKQkvKiBQTVUgRGl2aWRlIE1vZGUgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0RSQU1ISUJDVEwJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMEIyKQkvKiBEUkFNIEhpYmVybmF0ZSBDb250cm9sIFJlZ2lzdGVyIChSL1cpICovCi0KLS8vIFJlYWwgVGltZSBDbG9jayBVbml0IChSVEMpCi0jZGVmaW5lIFZSNDE4MV9FVElNRUxSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMEMwKQkvKiBFbGFwc2VkIFRpbWUgTCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfRVRJTUVNUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDBDMikJLyogRWxhcHNlZCBUaW1lIE0gUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0VUSU1FSFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAwQzQpCS8qIEVsYXBzZWQgVGltZSBIIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9FQ01QTFJFRwkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMEM4KQkvKiBFbGFwc2VkIENvbXBhcmUgTCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfRUNNUE1SRUcJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDBDQSkJLyogRWxhcHNlZCBDb21wYXJlIE0gUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0VDTVBIUkVHCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAwQ0MpCS8qIEVsYXBzZWQgQ29tcGFyZSBIIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9SVENMMUxSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMEQwKQkvKiBSVEMgTG9uZyAxIEwgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1JUQ0wxSFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAwRDIpCS8qIFJUQyBMb25nIDEgSCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfUlRDTDFDTlRMUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDBENCkJLyogUlRDIExvbmcgMSBDb3VudCBMIFJlZ2lzdGVyIChSKSAqLwotI2RlZmluZSBWUjQxODFfUlRDTDFDTlRIUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDBENikJLyogUlRDIExvbmcgMSBDb3VudCBIIFJlZ2lzdGVyIChSKSAqLwotI2RlZmluZSBWUjQxODFfUlRDTDJMUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDBEOCkJLyogUlRDIExvbmcgMiBMIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9SVENMMkhSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMERBKQkvKiBSVEMgTG9uZyAyIEggUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1JUQ0wyQ05UTFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAwREMpCS8qIFJUQyBMb25nIDIgQ291bnQgTCBSZWdpc3RlciAoUikgKi8KLSNkZWZpbmUgVlI0MTgxX1JUQ0wyQ05USFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAwREUpCS8qIFJUQyBMb25nIDIgQ291bnQgSCBSZWdpc3RlciAoUikgKi8KLSNkZWZpbmUgVlI0MTgxX1JUQ0lOVFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAxREUpCS8qIFJUQyBJbnRlcnJ1cHQgUmVnaXN0ZXIgKFIvVykgKi8KLQotLy8gRGVhZG1hbidzIFN3aXRjaCBVbml0IChEU1UpCi0jZGVmaW5lIFZSNDE4MV9EU1VDTlRSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMEUwKQkvKiBEU1UgQ29udHJvbCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfRFNVU0VUUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDBFMikJLyogRFNVIERlYWQgVGltZSBTZXQgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0RTVUNMUlJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAwRTQpCS8qIERTVSBDbGVhciBSZWdpc3RlciAoVykgKi8KLSNkZWZpbmUgVlI0MTgxX0RTVVRJTVJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAwRTYpCS8qIERTVSBFbGFwc2VkIFRpbWUgUmVnaXN0ZXIgKFIvVykgKi8KLQotLy8gR2VuZXJhbCBQdXJwb3NlIEkvTyBVbml0IChHSVUpCi0jZGVmaW5lIFZSNDE4MV9HUE1EMFJFRwkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzAwKQkvKiBHUElPIE1vZGUgMCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfR1BNRDFSRUcJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDMwMikJLyogR1BJTyBNb2RlIDEgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0dQTUQyUkVHCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzMDQpCS8qIEdQSU8gTW9kZSAyIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9HUE1EM1JFRwkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzA2KQkvKiBHUElPIE1vZGUgMyBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfR1BEQVRIUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDMwOCkJLyogR1BJTyBEYXRhIEhpZ2ggUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0dQREFUSFJFR19HUElPMTYgIDB4MDAwMQotI2RlZmluZSBWUjQxODFfR1BEQVRIUkVHX0dQSU8xNyAgMHgwMDAyCi0jZGVmaW5lIFZSNDE4MV9HUERBVEhSRUdfR1BJTzE4ICAweDAwMDQKLSNkZWZpbmUgVlI0MTgxX0dQREFUSFJFR19HUElPMTkgIDB4MDAwOAotI2RlZmluZSBWUjQxODFfR1BEQVRIUkVHX0dQSU8yMCAgMHgwMDEwCi0jZGVmaW5lIFZSNDE4MV9HUERBVEhSRUdfR1BJTzIxICAweDAwMjAKLSNkZWZpbmUgVlI0MTgxX0dQREFUSFJFR19HUElPMjIgIDB4MDA0MAotI2RlZmluZSBWUjQxODFfR1BEQVRIUkVHX0dQSU8yMyAgMHgwMDgwCi0jZGVmaW5lIFZSNDE4MV9HUERBVEhSRUdfR1BJTzI0ICAweDAxMDAKLSNkZWZpbmUgVlI0MTgxX0dQREFUSFJFR19HUElPMjUgIDB4MDIwMAotI2RlZmluZSBWUjQxODFfR1BEQVRIUkVHX0dQSU8yNiAgMHgwNDAwCi0jZGVmaW5lIFZSNDE4MV9HUERBVEhSRUdfR1BJTzI3ICAweDA4MDAKLSNkZWZpbmUgVlI0MTgxX0dQREFUSFJFR19HUElPMjggIDB4MTAwMAotI2RlZmluZSBWUjQxODFfR1BEQVRIUkVHX0dQSU8yOSAgMHgyMDAwCi0jZGVmaW5lIFZSNDE4MV9HUERBVEhSRUdfR1BJTzMwICAweDQwMDAKLSNkZWZpbmUgVlI0MTgxX0dQREFUSFJFR19HUElPMzEgIDB4ODAwMAotI2RlZmluZSBWUjQxODFfR1BEQVRMUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDMwQSkJLyogR1BJTyBEYXRhIExvdyBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfR1BEQVRMUkVHX0dQSU8wICAgMHgwMDAxCi0jZGVmaW5lIFZSNDE4MV9HUERBVExSRUdfR1BJTzEgICAweDAwMDIKLSNkZWZpbmUgVlI0MTgxX0dQREFUTFJFR19HUElPMiAgIDB4MDAwNAotI2RlZmluZSBWUjQxODFfR1BEQVRMUkVHX0dQSU8zICAgMHgwMDA4Ci0jZGVmaW5lIFZSNDE4MV9HUERBVExSRUdfR1BJTzQgICAweDAwMTAKLSNkZWZpbmUgVlI0MTgxX0dQREFUTFJFR19HUElPNSAgIDB4MDAyMAotI2RlZmluZSBWUjQxODFfR1BEQVRMUkVHX0dQSU82ICAgMHgwMDQwCi0jZGVmaW5lIFZSNDE4MV9HUERBVExSRUdfR1BJTzcgICAweDAwODAKLSNkZWZpbmUgVlI0MTgxX0dQREFUTFJFR19HUElPOCAgIDB4MDEwMAotI2RlZmluZSBWUjQxODFfR1BEQVRMUkVHX0dQSU85ICAgMHgwMjAwCi0jZGVmaW5lIFZSNDE4MV9HUERBVExSRUdfR1BJTzEwICAweDA0MDAKLSNkZWZpbmUgVlI0MTgxX0dQREFUTFJFR19HUElPMTEgIDB4MDgwMAotI2RlZmluZSBWUjQxODFfR1BEQVRMUkVHX0dQSU8xMiAgMHgxMDAwCi0jZGVmaW5lIFZSNDE4MV9HUERBVExSRUdfR1BJTzEzICAweDIwMDAKLSNkZWZpbmUgVlI0MTgxX0dQREFUTFJFR19HUElPMTQgIDB4NDAwMAotI2RlZmluZSBWUjQxODFfR1BEQVRMUkVHX0dQSU8xNSAgMHg4MDAwCi0jZGVmaW5lIFZSNDE4MV9HUElOVEVOCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzMEMpCS8qIEdQSU8gSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfR1BJTlRNU0sJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDMwRSkJLyogR1BJTyBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfR1BJTlRUWVBICV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDMxMCkJLyogR1BJTyBJbnRlcnJ1cHQgVHlwZSBIaWdoIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9HUElOVFRZUEwJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzEyKQkvKiBHUElPIEludGVycnVwdCBUeXBlIExvdyBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfR1BJTlRTVEFUCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDMxNCkJLyogR1BJTyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9HUEhJQlNUSAkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzE2KQkvKiBHUElPIEhpYmVybmF0ZSBQaW4gU3RhdGUgSGlnaCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfR1BISUJTVEwJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDMxOCkJLyogR1BJTyBIaWJlcm5hdGUgUGluIFN0YXRlIExvdyBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfR1BTSUNUTAkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzFBKQkvKiBHUElPIFNlcmlhbCBJbnRlcmZhY2UgQ29udHJvbCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfS0VZRU4JCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDMxQykJLyogS2V5Ym9hcmQgU2NhbiBQaW4gRW5hYmxlIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QQ1MwU1RSQQkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzIwKQkvKiBQcm9ncmFtbWFibGUgQ2hpcCBTZWxlY3QgWzBdIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1BDUzBTVFBBCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzMjIpCS8qIFByb2dyYW1tYWJsZSBDaGlwIFNlbGVjdCBbMF0gU3RvcCBBZGRyZXNzIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QQ1MwSElBCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzMjQpCS8qIFByb2dyYW1tYWJsZSBDaGlwIFNlbGVjdCBbMF0gSGlnaCBBZGRyZXNzIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QQ1MxU1RSQQkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzI2KQkvKiBQcm9ncmFtbWFibGUgQ2hpcCBTZWxlY3QgWzFdIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1BDUzFTVFBBCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzMjgpCS8qIFByb2dyYW1tYWJsZSBDaGlwIFNlbGVjdCBbMV0gU3RvcCBBZGRyZXNzIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QQ1MxSElBCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzMkEpCS8qIFByb2dyYW1tYWJsZSBDaGlwIFNlbGVjdCBbMV0gSGlnaCBBZGRyZXNzIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QQ1NNT0RFCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzMkMpCS8qIFByb2dyYW1tYWJsZSBDaGlwIFNlbGVjdCBNb2RlIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9MQ0RHUE1PREUJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzJFKQkvKiBMQ0QgR2VuZXJhbCBQdXJwb3NlIE1vZGUgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX01JU0NSRUcwCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzMzApCS8qIE1pc2MuIFIvVyBCYXR0ZXJ5IEJhY2tlZCBSZWdpc3RlcnMgZm9yIE5vbi1Wb2xhdGlsZSBTdG9yYWdlIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NSVNDUkVHMQkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzMyKQkvKiBNaXNjLiBSL1cgQmF0dGVyeSBCYWNrZWQgUmVnaXN0ZXJzIGZvciBOb24tVm9sYXRpbGUgU3RvcmFnZSAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTUlTQ1JFRzIJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDMzNCkJLyogTWlzYy4gUi9XIEJhdHRlcnkgQmFja2VkIFJlZ2lzdGVycyBmb3IgTm9uLVZvbGF0aWxlIFN0b3JhZ2UgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX01JU0NSRUczCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzMzYpCS8qIE1pc2MuIFIvVyBCYXR0ZXJ5IEJhY2tlZCBSZWdpc3RlcnMgZm9yIE5vbi1Wb2xhdGlsZSBTdG9yYWdlIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NSVNDUkVHNAkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzM4KQkvKiBNaXNjLiBSL1cgQmF0dGVyeSBCYWNrZWQgUmVnaXN0ZXJzIGZvciBOb24tVm9sYXRpbGUgU3RvcmFnZSAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTUlTQ1JFRzUJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDMzQSkJLyogTWlzYy4gUi9XIEJhdHRlcnkgQmFja2VkIFJlZ2lzdGVycyBmb3IgTm9uLVZvbGF0aWxlIFN0b3JhZ2UgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX01JU0NSRUc2CQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzM0MpCS8qIE1pc2MuIFIvVyBCYXR0ZXJ5IEJhY2tlZCBSZWdpc3RlcnMgZm9yIE5vbi1Wb2xhdGlsZSBTdG9yYWdlIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NSVNDUkVHNwkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzNEKQkvKiBNaXNjLiBSL1cgQmF0dGVyeSBCYWNrZWQgUmVnaXN0ZXJzIGZvciBOb24tVm9sYXRpbGUgU3RvcmFnZSAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTUlTQ1JFRzgJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDM0MCkJLyogTWlzYy4gUi9XIEJhdHRlcnkgQmFja2VkIFJlZ2lzdGVycyBmb3IgTm9uLVZvbGF0aWxlIFN0b3JhZ2UgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX01JU0NSRUc5CQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzNDIpCS8qIE1pc2MuIFIvVyBCYXR0ZXJ5IEJhY2tlZCBSZWdpc3RlcnMgZm9yIE5vbi1Wb2xhdGlsZSBTdG9yYWdlIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NSVNDUkVHMTAJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzQ0KQkvKiBNaXNjLiBSL1cgQmF0dGVyeSBCYWNrZWQgUmVnaXN0ZXJzIGZvciBOb24tVm9sYXRpbGUgU3RvcmFnZSAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTUlTQ1JFRzExCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDM0NikJLyogTWlzYy4gUi9XIEJhdHRlcnkgQmFja2VkIFJlZ2lzdGVycyBmb3IgTm9uLVZvbGF0aWxlIFN0b3JhZ2UgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX01JU0NSRUcxMglfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzNDgpCS8qIE1pc2MuIFIvVyBCYXR0ZXJ5IEJhY2tlZCBSZWdpc3RlcnMgZm9yIE5vbi1Wb2xhdGlsZSBTdG9yYWdlIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NSVNDUkVHMTMJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMzRBKQkvKiBNaXNjLiBSL1cgQmF0dGVyeSBCYWNrZWQgUmVnaXN0ZXJzIGZvciBOb24tVm9sYXRpbGUgU3RvcmFnZSAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTUlTQ1JFRzE0CV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDM0QykJLyogTWlzYy4gUi9XIEJhdHRlcnkgQmFja2VkIFJlZ2lzdGVycyBmb3IgTm9uLVZvbGF0aWxlIFN0b3JhZ2UgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX01JU0NSRUcxNQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAzNEUpCS8qIE1pc2MuIFIvVyBCYXR0ZXJ5IEJhY2tlZCBSZWdpc3RlcnMgZm9yIE5vbi1Wb2xhdGlsZSBTdG9yYWdlIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TRUNJUlFNQVNLTAlWUjQxODFfR1BJTlRFTgotLy8gTm8gU0VDSVJRTUFTS0ggZm9yIFZSNDE4MQotCi0vLyBUb3VjaCBQYW5lbCBJbnRlcmZhY2UgVW5pdCAoUElVKQotI2RlZmluZSBWUjQxODFfUElVQ05UUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDEyMikJLyogUElVIENvbnRyb2wgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1BJVUNOVFJFR19QSVVTRVFFTgkweDAwMDQKLSNkZWZpbmUgVlI0MTgxX1BJVUNOVFJFR19QSVVQV1IJCTB4MDAwMgotI2RlZmluZSBWUjQxODFfUElVQ05UUkVHX1BBRFJTVAkJMHgwMDAxCi0KLSNkZWZpbmUgVlI0MTgxX1BJVUlOVFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAxMjQpCS8qIFBJVSBJbnRlcnJ1cHQgY2F1c2UgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1BJVUlOVFJFR19PVlAJCTB4ODAwMAotI2RlZmluZSBWUjQxODFfUElVSU5UUkVHX1BBRENNRAkJMHgwMDQwCi0jZGVmaW5lIFZSNDE4MV9QSVVJTlRSRUdfUEFEQURQCQkweDAwMjAKLSNkZWZpbmUgVlI0MTgxX1BJVUlOVFJFR19QQURQQUdFMQkweDAwMTAKLSNkZWZpbmUgVlI0MTgxX1BJVUlOVFJFR19QQURQQUdFMAkweDAwMDgKLSNkZWZpbmUgVlI0MTgxX1BJVUlOVFJFR19QQURETE9TVAkweDAwMDQKLSNkZWZpbmUgVlI0MTgxX1BJVUlOVFJFR19QRU5DSEcJCTB4MDAwMQotCi0jZGVmaW5lIFZSNDE4MV9QSVVTSVZMUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDEyNikJLyogUElVIERhdGEgc2FtcGxpbmcgaW50ZXJ2YWwgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1BJVVNUQkxSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMTI4KQkvKiBQSVUgQS9EIGNvbnZlcnRlciBzdGFydCBkZWxheSByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfUElVQ01EUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDEyQSkJLyogUElVIEEvRCBjb21tYW5kIHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QSVVBU0NOUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDEzMCkJLyogUElVIEEvRCBwb3J0IHNjYW4gcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1BJVUFNU0tSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMTMyKQkvKiBQSVUgQS9EIHNjYW4gbWFzayByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfUElVQ0lWTFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAxM0UpCS8qIFBJVSBDaGVjayBpbnRlcnZhbCByZWdpc3RlciAoUikgKi8KLSNkZWZpbmUgVlI0MTgxX1BJVVBCMDBSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMkEwKQkvKiBQSVUgUGFnZSAwIEJ1ZmZlciAwIHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QSVVQQjAxUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDJBMikJLyogUElVIFBhZ2UgMCBCdWZmZXIgMSByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfUElVUEIwMlJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAyQTQpCS8qIFBJVSBQYWdlIDAgQnVmZmVyIDIgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1BJVVBCMDNSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMkE2KQkvKiBQSVUgUGFnZSAwIEJ1ZmZlciAzIHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QSVVQQjEwUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDJBOCkJLyogUElVIFBhZ2UgMSBCdWZmZXIgMCByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfUElVUEIxMVJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAyQUEpCS8qIFBJVSBQYWdlIDEgQnVmZmVyIDEgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1BJVVBCMTJSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMkFDKQkvKiBQSVUgUGFnZSAxIEJ1ZmZlciAyIHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QSVVQQjEzUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDJBRSkJLyogUElVIFBhZ2UgMSBCdWZmZXIgMyByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfUElVQUIwUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDJCMCkJLyogUElVIEEvRCBzY2FuIEJ1ZmZlciAwIHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QSVVBQjFSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMkIyKQkvKiBQSVUgQS9EIHNjYW4gQnVmZmVyIDEgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1BJVUFCMlJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAyQjQpCS8qIFBJVSBBL0Qgc2NhbiBCdWZmZXIgMiByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfUElVQUIzUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDJCNikJLyogUElVIEEvRCBzY2FuIEJ1ZmZlciAzIHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9QSVVQQjA0UkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDJCQykJLyogUElVIFBhZ2UgMCBCdWZmZXIgNCByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfUElVUEIxNFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAyQkUpCS8qIFBJVSBQYWdlIDEgQnVmZmVyIDQgcmVnaXN0ZXIgKFIvVykgKi8KLQotLy8gQXVkaW8gSW50ZXJmYWNlIFVuaXQgKEFJVSkKLSNkZWZpbmUgVlI0MTgxX1NPREFUUkVHCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAxNjYpCS8qIFNwZWFrZXIgT3V0cHV0IERhdGEgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NDTlRSRUcJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE2OCkJLyogU3BlYWtlciBPdXRwdXQgQ29udHJvbCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTUlEQVRSRUcJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE3MCkJLyogTWlrZSBJbnB1dCBEYXRhIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NQ05UUkVHCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAxNzIpCS8qIE1pa2UgSW5wdXQgQ29udHJvbCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfRFZBTElEUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE3OCkJLyogRGF0YSBWYWxpZCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfU0VRUkVHCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAxN0EpCS8qIFNlcXVlbnRpYWwgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0lOVFJFRwkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMTdDKQkvKiBJbnRlcnJ1cHQgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NETUFEQVRSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMTYwKQkvKiBTcGVha2VyIERNQSBEYXRhIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NRE1BREFUUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE2MikJLyogTWljcm9waG9uZSBETUEgRGF0YSBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfREFWUkVGX1NFVFVQCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE2NCkJLyogREFDIFZyZWYgc2V0dXAgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NDTlZDX0VORAlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAxNkUpCS8qIFNwZWFrZXIgc2FtcGxlIHJhdGUgY29udHJvbCAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTUlEQVRSRUcJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE3MCkJLyogTWljcm9waG9uZSBJbnB1dCBEYXRhIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9NQ05UUkVHCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAxNzIpCS8qIE1pY3JvcGhvbmUgSW5wdXQgQ29udHJvbCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTUNOVkNfRU5ECV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE3RSkJLyogTWljcm9waG9uZSBzYW1wbGUgcmF0ZSBjb250cm9sIChSL1cpICovCi0KLS8vIEtleWJvYXJkIEludGVyZmFjZSBVbml0IChLSVUpCi0jZGVmaW5lIFZSNDE4MV9LSVVEQVQwCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAxODApCS8qIEtJVSBEYXRhMCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfS0lVREFUMQkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMTgyKQkvKiBLSVUgRGF0YTEgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0tJVURBVDIJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE4NCkJLyogS0lVIERhdGEyIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9LSVVEQVQzCQlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAxODYpCS8qIEtJVSBEYXRhMyBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfS0lVREFUNAkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMTg4KQkvKiBLSVUgRGF0YTQgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0tJVURBVDUJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE4QSkJLyogS0lVIERhdGE1IFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9LSVVTQ0FOUkVQCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE5MCkJLyogS0lVIFNjYW4vUmVwZWF0IFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9LSVVTQ0FOUkVQX0tFWUVOICAgICAgMHg4MDAwCi0jZGVmaW5lIFZSNDE4MV9LSVVTQ0FOUkVQX1NDQU5TVFAgICAgMHgwMDA4Ci0jZGVmaW5lIFZSNDE4MV9LSVVTQ0FOUkVQX1NDQU5TVEFSVCAgMHgwMDA0Ci0jZGVmaW5lIFZSNDE4MV9LSVVTQ0FOUkVQX0FUU1RQICAgICAgMHgwMDAyCi0jZGVmaW5lIFZSNDE4MV9LSVVTQ0FOUkVQX0FUU0NBTiAgICAgMHgwMDAxCi0jZGVmaW5lIFZSNDE4MV9LSVVTQ0FOUwkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMTkyKQkvKiBLSVUgU2NhbiBTdGF0dXMgUmVnaXN0ZXIgKFIpICovCi0jZGVmaW5lIFZSNDE4MV9LSVVXS1MJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE5NCkJLyogS0lVIFdhaXQgS2V5c2NhbiBTdGFibGUgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0tJVVdLSQkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMTk2KQkvKiBLSVUgV2FpdCBLZXlzY2FuIEludGVydmFsIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9LSVVJTlQJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE5OCkJLyogS0lVIEludGVycnVwdCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfS0lVSU5UX0tEQVRMT1NUICAgICAgIDB4MDAwNAotI2RlZmluZSBWUjQxODFfS0lVSU5UX0tEQVRSRFkgICAgICAgIDB4MDAwMgotI2RlZmluZSBWUjQxODFfS0lVSU5UX1NDQU5JTlQgICAgICAgIDB4MDAwMQotI2RlZmluZSBWUjQxODFfS0lVREFUNgkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMThDKQkvKiBTY2FuIExpbmUgNiBLZXkgRGF0YSBSZWdpc3RlciAoUikgKi8KLSNkZWZpbmUgVlI0MTgxX0tJVURBVDcJCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDE4RSkJLyogU2NhbiBMaW5lIDcgS2V5IERhdGEgUmVnaXN0ZXIgKFIpICovCi0KLS8vIENvbXBhY3RGbGFzaCBDb250cm9sbGVyCi0jZGVmaW5lIFZSNDE4MV9QQ0NBUkRJTkRFWAlfX3ByZWc4KEtTRUcxICsgMHgwQjAwMDhFMCkJLyogUEMgQ2FyZCBDb250cm9sbGVyIEluZGV4IFJlZ2lzdGVyICovCi0jZGVmaW5lIFZSNDE4MV9QQ0NBUkREQVRBCV9fcHJlZzgoS1NFRzEgKyAweDBCMDAwOEUxKQkvKiBQQyBDYXJkIENvbnRyb2xsZXIgRGF0YSBSZWdpc3RlciAqLwotI2RlZmluZSBWUjQxODFfSU5UU1RBVFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDA4RjgpCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0lOVE1TS1JFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDA4RkEpCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9DRkdfUkVHXzEJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwOEZFKQkvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KLQotLy8gTEVEIENvbnRyb2wgVW5pdCAoTEVEKQotI2RlZmluZSBWUjQxODFfTEVESFRTUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDI0MCkJLyogTEVEIEggVGltZSBTZXQgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0xFRExUU1JFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAyNDIpCS8qIExFRCBMIFRpbWUgU2V0IHJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9MRURDTlRSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwMjQ4KQkvKiBMRUQgQ29udHJvbCByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTEVEQVNUQ1JFRwlfX3ByZWcxNihLU0VHMSArIDB4MEIwMDAyNEEpCS8qIExFRCBBdXRvIFN0b3AgVGltZSBDb3VudCByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTEVESU5UUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDI0QykJLyogTEVEIEludGVycnVwdCByZWdpc3RlciAoUi9XKSAqLwotCi0vLyBTZXJpYWwgSW50ZXJmYWNlIFVuaXQgKFNJVSAvIFNJVTEgYW5kIFNJVTIpCi0jZGVmaW5lIFZSNDE4MV9TSVVSQgkJX19wcmVnOChLU0VHMSArIDB4MEMwMDAwMTApCS8qIFJlY2VpdmVyIEJ1ZmZlciBSZWdpc3RlciAoUmVhZCkgRExBQiA9IDAgKFIpICovCi0jZGVmaW5lIFZSNDE4MV9TSVVUSAkJX19wcmVnOChLU0VHMSArIDB4MEMwMDAwMTApCS8qIFRyYW5zbWl0dGVyIEhvbGRpbmcgUmVnaXN0ZXIgKFdyaXRlKSBETEFCID0gMCAoVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NJVURMTAkJX19wcmVnOChLU0VHMSArIDB4MEMwMDAwMTApCS8qIERpdmlzb3IgTGF0Y2ggKExlYXN0IFNpZ25pZmljYW50IEJ5dGUpIERMQUIgPSAxIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TSVVJRQkJX19wcmVnOChLU0VHMSArIDB4MEMwMDAwMTEpCS8qIEludGVycnVwdCBFbmFibGUgRExBQiA9IDAgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NJVURMTQkJX19wcmVnOChLU0VHMSArIDB4MEMwMDAwMTEpCS8qIERpdmlzb3IgTGF0Y2ggKE1vc3QgU2lnbmlmaWNhbnQgQnl0ZSkgRExBQiA9IDEgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NJVUlJRAkJX19wcmVnOChLU0VHMSArIDB4MEMwMDAwMTIpCS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAoUmVhZCkgKFIpICovCi0jZGVmaW5lIFZSNDE4MV9TSVVGQwkJX19wcmVnOChLU0VHMSArIDB4MEMwMDAwMTIpCS8qIEZJRk8gQ29udHJvbCBSZWdpc3RlciAoV3JpdGUpIChXKSAqLwotI2RlZmluZSBWUjQxODFfU0lVTEMJCV9fcHJlZzgoS1NFRzEgKyAweDBDMDAwMDEzKQkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NJVU1DCQlfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAxNCkJLyogTU9ERU0gQ29udHJvbCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfU0lVTFMJCV9fcHJlZzgoS1NFRzEgKyAweDBDMDAwMDE1KQkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfU0lVTVMJCV9fcHJlZzgoS1NFRzEgKyAweDBDMDAwMDE2KQkvKiBNT0RFTSBTdGF0dXMgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NJVVNDCQlfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAxNykJLyogU2NyYXRjaCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfU0lVUkVTRVQJCV9fcHJlZzgoS1NFRzEgKyAweDBDMDAwMDE5KQkvKiBTSVUgUmVzZXQgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NJVUFDVE1TSwlfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAxQykJLyogU0lVIEFjdGl2aXR5IE1hc2sgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NJVUFDVFRNUglfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAxRSkJLyogU0lVIEFjdGl2aXR5IFRpbWVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TSVVSQl8yCQlfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAwMCkJLyogUmVjZWl2ZSBCdWZmZXIgUmVnaXN0ZXIgKFJlYWQpIChSKSAqLwotI2RlZmluZSBWUjQxODFfU0lVVEhfMgkJX19wcmVnOChLU0VHMSArIDB4MEMwMDAwMDApCS8qIFRyYW5zbWl0dGVyIEhvbGRpbmcgUmVnaXN0ZXIgKFdyaXRlKSAoVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NJVURMTF8yCQlfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAwMCkJLyogRGl2aXNvciBMYXRjaCAoTGVhc3QgU2lnbmlmaWNhbnQgQnl0ZSkgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NJVUlFXzIJCV9fcHJlZzgoS1NFRzEgKyAweDBDMDAwMDAxKQkvKiBJbnRlcnJ1cHQgRW5hYmxlIChETEFCID0gMCkgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NJVURMTV8yCQlfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAwMSkJLyogRGl2aXNvciBMYXRjaCAoTW9zdCBTaWduaWZpY2FudCBCeXRlKSAoRExBQiA9IDEpIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TSVVJSURfMgkJX19wcmVnOChLU0VHMSArIDB4MEMwMDAwMDIpCS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAoUmVhZCkgKFIpICovCi0jZGVmaW5lIFZSNDE4MV9TSVVGQ18yCQlfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAwMikJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyIChXcml0ZSkgKFcpICovCi0jZGVmaW5lIFZSNDE4MV9TSVVMQ18yCQlfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAwMykJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TSVVNQ18yCQlfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAwNCkJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfU0lVTFNfMgkJX19wcmVnOChLU0VHMSArIDB4MEMwMDAwMDUpCS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TSVVNU18yCQlfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAwNikJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TSVVTQ18yCQlfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAwNykJLyogU2NyYXRjaCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfU0lVSVJTRUxfMglfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAwOCkJLyogU0lVIElyREEgU2VsZWN0b3QgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NJVVJFU0VUXzIJX19wcmVnOChLU0VHMSArIDB4MEMwMDAwMDkpCS8qIFNJVSBSZXNldCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfU0lVQ1NFTF8yCV9fcHJlZzgoS1NFRzEgKyAweDBDMDAwMDBBKQkvKiBJckRBIEVjaG8tYmFjayBDb250cm9sIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9TSVVBQ1RNU0tfMglfX3ByZWc4KEtTRUcxICsgMHgwQzAwMDAwQykJLyogU0lVIEFjdGl2aXR5IE1hc2sgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1NJVUFDVFRNUl8yCV9fcHJlZzgoS1NFRzEgKyAweDBDMDAwMDBFKQkvKiBTSVUgQWN0aXZpdHkgVGltZXIgUmVnaXN0ZXIgKFIvVykgKi8KLQotCi0vLyBVU0IgTW9kdWxlCi0jZGVmaW5lIFZSNDE4MV9VU0JJTkZJRk8JX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwNzgwKQkvKiBVU0IgQnVsayBJbnB1dCBGSUZPIChCdWxrIEluIEVuZCBQb2ludCkgKFcpICovCi0jZGVmaW5lIFZSNDE4MV9VU0JPVVRGSUZPCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDc4MikJLyogVVNCIEJ1bGsgT3V0cHV0IEZJRk8gKEJ1bGsgT3V0IEVuZCBQb2ludCkgKFIpICovCi0jZGVmaW5lIFZSNDE4MV9VU0JDVExGSUZPCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDc4NCkJLyogVVNCIENvbnRyb2wgRklGTyAoQ29udHJvbCBFbmQgUG9pbnQpIChXKSAqLwotI2RlZmluZSBWUjQxODFfVVNCU1RBVAkJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwNzg2KQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9VU0JJTlRNU0sJX19wcmVnMTYoS1NFRzEgKyAweDBCMDAwNzg4KQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfVVNCQ1RMUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDc4QSkJLyogQ29udHJvbCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfVVNCU1RQUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQjAwMDc4QykJLyogVVNCIFRyYW5zZmVyIFN0b3AgUmVnaXN0ZXIgKFIvVykgKi8KLQotLy8gTENEIENvbnRyb2xsZXIKLSNkZWZpbmUgVlI0MTgxX0hSVE9UQUxSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNDAwKQkvKiBIb3Jpem9udGFsIHRvdGFsIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9IUlZJU0lCUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDQwMikJLyogSG9yaXpvbnRhbCBWaXNpYmxlIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9MRENMS1NUUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDQwNCkJLyogTG9hZCBjbG9jayBzdGFydCBSZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfTERDTEtORFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA0MDYpCS8qIExvYWQgY2xvY2sgZW5kIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9WUlRPVEFMUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDQwOCkJLyogVmVydGljYWwgVG90YWwgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1ZSVklTSUJSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNDBBKQkvKiBWZXJ0aWNhbCBWaXNpYmxlIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9GVlNUQVJUUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDQwQykJLyogRkxNIHZlcnRpY2FsIHN0YXJ0IFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9GVkVORFJFRwkJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNDBFKQkvKiBGTE0gdmVydGljYWwgZW5kIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9MQ0RDVFJMUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDQxMCkJLyogTENEIGNvbnRyb2wgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0xDRElOUlFSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNDEyKQkvKiBMQ0QgSW50ZXJydXB0IHJlcXVlc3QgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0xDRENGR1JFRzAJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNDE0KQkvKiBMQ0QgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAwIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9MQ0RDRkdSRUcxCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDQxNikJLyogTENEIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfRkJTVEFEMVJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA0MTgpCS8qIEZyYW1lIEJ1ZmZlciBTdGFydCBBZGRyZXNzIDEgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0ZCU1RBRDJSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNDFBKQkvKiBGcmFtZSBCdWZmZXIgU3RhcnQgQWRkcmVzcyAyIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9GQk5EQUQxUkVHCV9fcHJlZzE2KEtTRUcxICsgMHgwQTAwMDQyMCkJLyogRnJhbWUgQnVmZmVyIEVuZCBBZGRyZXNzIDEgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0ZCTkRBRDJSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNDIyKQkvKiBGcmFtZSBCdWZmZXIgRW5kIEFkZHJlc3MgMiByZWdpc3RlciAoUi9XKSAqLwotI2RlZmluZSBWUjQxODFfRkhTVEFSVFJFRwlfX3ByZWcxNihLU0VHMSArIDB4MEEwMDA0MjQpCS8qIEZMTSBob3Jpem9udGFsIFN0YXJ0IFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9GSEVORFJFRwkJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNDI2KQkvKiBGTE0gaG9yaXpvbnRhbCBFbmQgUmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1BXUkNPTlJFRzEJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNDMwKQkvKiBQb3dlciBDb250cm9sIHJlZ2lzdGVyIDEgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX1BXUkNPTlJFRzIJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNDMyKQkvKiBQb3dlciBDb250cm9sIHJlZ2lzdGVyIDIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0xDRElNU0tSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNDM0KQkvKiBMQ0QgSW50ZXJydXB0IE1hc2sgcmVnaXN0ZXIgKFIvVykgKi8KLSNkZWZpbmUgVlI0MTgxX0NQSU5EQ1RSRUcJX19wcmVnMTYoS1NFRzEgKyAweDBBMDAwNDdFKQkvKiBDb2xvciBwYWxldHRlIEluZGV4IGFuZCBjb250cm9sIFJlZ2lzdGVyIChSL1cpICovCi0jZGVmaW5lIFZSNDE4MV9DUEFMREFUUkVHCV9fcHJlZzMyKEtTRUcxICsgMHgwQTAwMDQ4MCkJLyogQ29sb3IgcGFsZXR0ZSBkYXRhIHJlZ2lzdGVyICgzMmJpdHMgUmVnaXN0ZXIpIChSL1cpICovCi0KLS8vIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2VzCi0jZGVmaW5lIFZSNDE4MV9MQ0QgICAgICAgICAgICAgMHgwYTAwMDAwMAotI2RlZmluZSBWUjQxODFfSU5URVJOQUxfSU9fMiAgIDB4MGIwMDAwMDAKLSNkZWZpbmUgVlI0MTgxX0lOVEVSTkFMX0lPXzEgICAweDBjMDAwMDAwCi0jZGVmaW5lIFZSNDE4MV9JU0FfTUVNICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBWUjQxODFfSVNBX0lPICAgICAgICAgIDB4MTQwMDAwMDAKLSNkZWZpbmUgVlI0MTgxX1JPTSAgICAgICAgICAgICAweDE4MDAwMDAwCi0KLS8vIFRoaXMgaXMgdGhlIGJhc2UgYWRkcmVzcyBmb3IgSU8gcG9ydCBkZWNvZGluZyB0byB3aGljaCB0aGUgMTYgYml0IElPIHBvcnQgYWRkcmVzcwotLy8gaXMgYWRkZWQuICBEZWZpbmluZyBpdCB0byAwIHdpbGwgdXN1YWxseSBjYXVzZSBhIGtlcm5lbCBvb3BzIGFueSB0aW1lIHBvcnQgSU8gaXMKLS8vIGF0dGVtcHRlZCwgd2hpY2ggY2FuIGJlIGhhbmR5IGZvciB0dXJuaW5nIHVwIHBhcnRzIG9mIHRoZSBrZXJuZWwgdGhhdCBtYWtlCi0vLyBpbmNvcnJlY3QgYXJjaGl0ZWN0dXJlIGFzc3VtcHRpb25zIChieSBhc3N1bWluZyB0aGF0IGV2ZXJ5dGhpbmcgYWN0cyBsaWtlIGEgUEMpLAotLy8gYnV0IHdlIG5lZWQgaXQgY29ycmVjdGx5IGRlZmluZWQgdG8gdXNlIHRoZSBQQ01DSUEvQ0YgY29udHJvbGxlcjoKLSNkZWZpbmUgVlI0MTgxX1BPUlRfQkFTRQkoS1NFRzEgKyBWUjQxODFfSVNBX0lPKQotI2RlZmluZSBWUjQxODFfSVNBTUVNX0JBU0UJKEtTRUcxICsgVlI0MTgxX0lTQV9NRU0pCi0KLSNlbmRpZiAvKiBfX0FTTV9WUjQxODFfVlI0MTgxX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3RiMDI4Ny5oIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdGIwMjg3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5ODMyMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3RiMDI4Ny5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgdGIwMjg3LmgsIEluY2x1ZGUgZmlsZSBmb3IgVEFOQkFDIFRCMDI4NyBtaW5pLUlUWCBib2FyZC4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBNZWRpYSBMYWIgSW5jLiA8aXRvQG1sYi5jby5qcD4KKyAqCisgKiAgVGhpcyBjb2RlIGlzIGxhcmdlbHkgYmFzZWQgb24gdGIwMjE5LmguCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgX19UQU5CQUNfVEIwMjg3X0gKKyNkZWZpbmUgX19UQU5CQUNfVEIwMjg3X0gKKworI2luY2x1ZGUgPGFzbS92cjQxeHgvdnI0MXh4Lmg+CisKKy8qCisgKiBHZW5lcmFsLVB1cnBvc2UgSS9PIFBpbiBOdW1iZXIKKyAqLworI2RlZmluZSBUQjAyODdfUENJX1NMT1RfUElOCQkyCisjZGVmaW5lIFRCMDI4N19TTTUwMV9QSU4JCTMKKyNkZWZpbmUgVEIwMjg3X1NJTDY4MEFfUElOCQk4CisjZGVmaW5lIFRCMDI4N19SVEw4MTEwX1BJTgkJMTMKKworLyoKKyAqIEludGVycnVwdCBOdW1iZXIKKyAqLworI2RlZmluZSBUQjAyODdfUENJX1NMT1RfSVJRCQlHSVVfSVJRKFRCMDI4N19QQ0lfU0xPVF9QSU4pCisjZGVmaW5lIFRCMDI4N19TTTUwMV9JUlEJCUdJVV9JUlEoVEIwMjg3X1NNNTAxX1BJTikKKyNkZWZpbmUgVEIwMjg3X1NJTDY4MEFfSVJRCQlHSVVfSVJRKFRCMDI4N19TSUw2ODBBX1BJTikKKyNkZWZpbmUgVEIwMjg3X1JUTDgxMTBfSVJRCQlHSVVfSVJRKFRCMDI4N19SVEw4MTEwX1BJTikKKworI2VuZGlmIC8qIF9fVEFOQkFDX1RCMDI4N19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC92cjQxeHguaCBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3ZyNDF4eC5oCmluZGV4IDdkNDFlNDQuLmJkMjcyM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3ZyNDF4eC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3ZyNDF4eC5oCkBAIC03LDcgKzcsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFBhdWwgTXVuZHQKICAqIENvcHlyaWdodCAoQykgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgVGltZVN5cyBDb3JwLgotICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtNzksMTEgKzc5LDExIEBACiAjZGVmaW5lIE1JUFNfQ1BVX0lSUSh4KQkJKE1JUFNfQ1BVX0lSUV9CQVNFICsgKHgpKQogI2RlZmluZSBNSVBTX1NPRlRJTlQwX0lSUQlNSVBTX0NQVV9JUlEoMCkKICNkZWZpbmUgTUlQU19TT0ZUSU5UMV9JUlEJTUlQU19DUFVfSVJRKDEpCi0jZGVmaW5lIElOVDBfQ0FTQ0FERV9JUlEJTUlQU19DUFVfSVJRKDIpCi0jZGVmaW5lIElOVDFfQ0FTQ0FERV9JUlEJTUlQU19DUFVfSVJRKDMpCi0jZGVmaW5lIElOVDJfQ0FTQ0FERV9JUlEJTUlQU19DUFVfSVJRKDQpCi0jZGVmaW5lIElOVDNfQ0FTQ0FERV9JUlEJTUlQU19DUFVfSVJRKDUpCi0jZGVmaW5lIElOVDRfQ0FTQ0FERV9JUlEJTUlQU19DUFVfSVJRKDYpCisjZGVmaW5lIElOVDBfSVJRCQlNSVBTX0NQVV9JUlEoMikKKyNkZWZpbmUgSU5UMV9JUlEJCU1JUFNfQ1BVX0lSUSgzKQorI2RlZmluZSBJTlQyX0lSUQkJTUlQU19DUFVfSVJRKDQpCisjZGVmaW5lIElOVDNfSVJRCQlNSVBTX0NQVV9JUlEoNSkKKyNkZWZpbmUgSU5UNF9JUlEJCU1JUFNfQ1BVX0lSUSg2KQogI2RlZmluZSBUSU1FUl9JUlEJCU1JUFNfQ1BVX0lSUSg3KQogCiAvKiBTWUlOVDEgSW50ZXJydXB0IE51bWJlcnMgKi8KQEAgLTk3LDcgKzk3LDcgQEAKICNkZWZpbmUgUElVX0lSUQkJCVNZU0lOVDFfSVJRKDUpCiAjZGVmaW5lIEFJVV9JUlEJCQlTWVNJTlQxX0lSUSg2KQogI2RlZmluZSBLSVVfSVJRCQkJU1lTSU5UMV9JUlEoNykKLSNkZWZpbmUgR0lVSU5UX0NBU0NBREVfSVJRCVNZU0lOVDFfSVJRKDgpCisjZGVmaW5lIEdJVUlOVF9JUlEJCVNZU0lOVDFfSVJRKDgpCiAjZGVmaW5lIFNJVV9JUlEJCQlTWVNJTlQxX0lSUSg5KQogI2RlZmluZSBCVVNFUlJfSVJRCQlTWVNJTlQxX0lSUSgxMCkKICNkZWZpbmUgU09GVElOVF9JUlEJCVNZU0lOVDFfSVJRKDExKQpAQCAtMTI4LDcgKzEyOCw3IEBACiAjZGVmaW5lIEdJVV9JUlFfTEFTVAkJR0lVX0lSUSgzMSkKIAogZXh0ZXJuIGludCB2cjQxeHhfc2V0X2ludGFzc2lnbih1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBjaGFyIGludGFzc2lnbik7Ci1leHRlcm4gaW50IHZyNDF4eF9jYXNjYWRlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgKCpnZXRfaXJxX251bWJlcikoaW50IGlycSkpOworZXh0ZXJuIGludCBjYXNjYWRlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgKCpnZXRfaXJxKSh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICopKTsKIAogI2RlZmluZSBQSVVJTlRfQ09NTUFORAkJMHgwMDQwCiAjZGVmaW5lIFBJVUlOVF9EQVRBCQkweDAwMjAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3ZyYzQxNzMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3ZyYzQxNzMuaAppbmRleCA1OGUxOTNjLi5iYjdhODVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC92cmM0MTczLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdnJjNDE3My5oCkBAIC0yMSw4ICsyMSw4IEBACiAgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KLSNpZm5kZWYgX19ORUNfVlJDNDE3M19IIAotI2RlZmluZSBfX05FQ19WUkM0MTczX0ggCisjaWZuZGVmIF9fTkVDX1ZSQzQxNzNfSAorI2RlZmluZSBfX05FQ19WUkM0MTczX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy93YXIuaCBiL2luY2x1ZGUvYXNtLW1pcHMvd2FyLmgKaW5kZXggYzRhNzA0MS4uMDRlZTUzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy93YXIuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3dhci5oCkBAIC0xMTMsNyArMTEzLDcgQEAKICAqLwogI2RlZmluZSBCQ00xMjUwX00zX1dBUiAxCiAKLS8qIAorLyoKICAqIFRoaXMgaXMgYSBEVUFSVCB3b3JrYXJvdW5kIHJlbGF0ZWQgdG8gZ2xpdGNoZXMgYXJvdW5kIHJlZ2lzdGVyIGFjY2Vzc2VzCiAgKi8KICNkZWZpbmUgU0lCWVRFXzE5NTZfV0FSIDEKQEAgLTEyMiw3ICsxMjIsNyBAQAogCiAvKgogICogRmlsbCBidWZmZXJzIG5vdCBmbHVzaGVkIG9uIENBQ0hFIGluc3RydWN0aW9ucwotICogCisgKgogICogSGl0X0ludmFsaWRhdGVfSSBjYWNoZW9wcyBpbnZhbGlkYXRlIGFuIGljYWNoZSBsaW5lIGJ1dCB0aGUgcmVmaWxsCiAgKiBmb3IgdGhhdCBsaW5lIGNhbiBnZXQgc3RhbGUgZGF0YSBmcm9tIHRoZSBmaWxsIGJ1ZmZlciBpbnN0ZWFkIG9mCiAgKiBhY2Nlc3NpbmcgbWVtb3J5IGlmIHRoZSBwcmV2aW91cyBpY2FjaGUgbWlzcyB3YXMgYWxzbyB0byB0aGF0IGxpbmUuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3h4czE1MDAuaCBiL2luY2x1ZGUvYXNtLW1pcHMveHhzMTUwMC5oCmluZGV4IDc1YzBkZGYuLjRkODRhOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMveHhzMTUwMC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMveHhzMTUwMC5oCkBAIC0yMiw3ICsyMiw3IEBACiAgKgogICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgKgotICogCisgKgogICovCiAjaWZuZGVmIF9fQVNNX1hYUzE1MDBfSAogI2RlZmluZSBfX0FTTV9YWFMxNTAwX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9hc3NlbWJseS5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2Fzc2VtYmx5LmgKaW5kZXggY2JjMjg2Zi4uMzBiMDIzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2Fzc2VtYmx5LmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2Fzc2VtYmx5LmgKQEAgLTYzLDcgKzYzLDcgQEAKIAkubGV2ZWwgMi4wdwogI2VuZGlmCiAKLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKICNpbmNsdWRlIDxhc20vYXNtcmVncy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2F0b21pYy5oCmluZGV4IGUyNGY3NTcuLjA0OGEyYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvYXRvbWljLmgKQEAgLTI0LDE5ICsyNCwxOSBAQAogIyAgZGVmaW5lIEFUT01JQ19IQVNIX1NJWkUgNAogIyAgZGVmaW5lIEFUT01JQ19IQVNIKGEpICgmKF9fYXRvbWljX2hhc2hbICgoKHVuc2lnbmVkIGxvbmcpIGEpL0wxX0NBQ0hFX0JZVEVTKSAmIChBVE9NSUNfSEFTSF9TSVpFLTEpIF0pKQogCi1leHRlcm4gc3BpbmxvY2tfdCBfX2F0b21pY19oYXNoW0FUT01JQ19IQVNIX1NJWkVdIF9fbG9ja19hbGlnbmVkOworZXh0ZXJuIHJhd19zcGlubG9ja190IF9fYXRvbWljX2hhc2hbQVRPTUlDX0hBU0hfU0laRV0gX19sb2NrX2FsaWduZWQ7CiAKLS8qIENhbid0IHVzZSBfcmF3X3NwaW5fbG9ja19pcnEgYmVjYXVzZSBvZiAjaW5jbHVkZSBwcm9ibGVtcywgc28KKy8qIENhbid0IHVzZSByYXdfc3Bpbl9sb2NrX2lycSBiZWNhdXNlIG9mICNpbmNsdWRlIHByb2JsZW1zLCBzbwogICogdGhpcyBpcyB0aGUgc3Vic3RpdHV0ZSAqLwogI2RlZmluZSBfYXRvbWljX3NwaW5fbG9ja19pcnFzYXZlKGwsZikgZG8gewlcCi0Jc3BpbmxvY2tfdCAqcyA9IEFUT01JQ19IQVNIKGwpOwkJXAorCXJhd19zcGlubG9ja190ICpzID0gQVRPTUlDX0hBU0gobCk7CQlcCiAJbG9jYWxfaXJxX3NhdmUoZik7CQkJXAotCV9yYXdfc3Bpbl9sb2NrKHMpOwkJCVwKKwlfX3Jhd19zcGluX2xvY2socyk7CQkJXAogfSB3aGlsZSgwKQogCiAjZGVmaW5lIF9hdG9taWNfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsLGYpIGRvIHsJXAotCXNwaW5sb2NrX3QgKnMgPSBBVE9NSUNfSEFTSChsKTsJCQlcCi0JX3Jhd19zcGluX3VubG9jayhzKTsJCQkJXAorCXJhd19zcGlubG9ja190ICpzID0gQVRPTUlDX0hBU0gobCk7CQkJXAorCV9fcmF3X3NwaW5fdW5sb2NrKHMpOwkJCQlcCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZik7CQkJCVwKIH0gd2hpbGUoMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljM2FjNGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvYXV4dmVjLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9fQVNNUEFSSVNDX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNUEFSSVNDX0FVWFZFQ19ICisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2JpdG9wcy5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2JpdG9wcy5oCmluZGV4IDkyOGU1ZWYuLmFmN2RiNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9iaXRvcHMuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvYml0b3BzLmgKQEAgLTIsNyArMiw3IEBACiAjZGVmaW5lIF9QQVJJU0NfQklUT1BTX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zcGlubG9jay5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvY2FjaGVmbHVzaC5oCmluZGV4IDA2NzMyNzEuLmFhNTkyZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2NhY2hlZmx1c2guaApAQCAtMyw2ICszLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CS8qIGZvciBmbHVzaF91c2VyX2RjYWNoZV9yYW5nZV9hc20oKSBwcm90byAqLwogCiAvKiBUaGUgdXN1YWwgY29tbWVudCBpcyAiQ2FjaGVzIGFyZW4ndCBicmFpbi1kZWFkIG9uIHRoZSA8YXJjaGl0ZWN0dXJlPiIuCiAgKiBVbmZvcnR1bmF0ZWx5LCB0aGF0IGRvZXNuJ3QgYXBwbHkgdG8gUEEtUklTQy4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9jb21wYXQuaAppbmRleCA3NjMwZDFhLi4zOGI5MThmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2NvbXBhdC5oCkBAIC0xMyw4ICsxMywxMCBAQAogdHlwZWRlZiBzMzIJY29tcGF0X3RpbWVfdDsKIHR5cGVkZWYgczMyCWNvbXBhdF9jbG9ja190OwogdHlwZWRlZiBzMzIJY29tcGF0X3BpZF90OwotdHlwZWRlZiB1MzIJY29tcGF0X3VpZF90OwotdHlwZWRlZiB1MzIJY29tcGF0X2dpZF90OwordHlwZWRlZiB1MzIJX19jb21wYXRfdWlkX3Q7Cit0eXBlZGVmIHUzMglfX2NvbXBhdF9naWRfdDsKK3R5cGVkZWYgdTMyCV9fY29tcGF0X3VpZDMyX3Q7Cit0eXBlZGVmIHUzMglfX2NvbXBhdF9naWQzMl90OwogdHlwZWRlZiB1MTYJY29tcGF0X21vZGVfdDsKIHR5cGVkZWYgdTMyCWNvbXBhdF9pbm9fdDsKIHR5cGVkZWYgdTMyCWNvbXBhdF9kZXZfdDsKQEAgLTY3LDggKzY5LDggQEAKIAljb21wYXRfZGV2X3QJCXN0X3JlYWxkZXY7CiAJdTE2CQkJc3RfYmFzZW1vZGU7CiAJdTE2CQkJc3Rfc3BhcmVzaG9ydDsKLQljb21wYXRfdWlkX3QJCXN0X3VpZDsKLQljb21wYXRfZ2lkX3QJCXN0X2dpZDsKKwlfX2NvbXBhdF91aWQzMl90CXN0X3VpZDsKKwlfX2NvbXBhdF9naWQzMl90CXN0X2dpZDsKIAl1MzIJCQlzdF9zcGFyZTRbM107CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvZmNudGwuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mY250bC5oCmluZGV4IGRlZjM1MjMuLjMxNzg1MWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mY250bC5oCkBAIC0zLDM4ICszLDIyIEBACiAKIC8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKICAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJMDAwMDAwMDMKLSNkZWZpbmUgT19SRE9OTFkJMDAwMDAwMDAKLSNkZWZpbmUgT19XUk9OTFkJMDAwMDAwMDEKLSNkZWZpbmUgT19SRFdSCQkwMDAwMDAwMgogI2RlZmluZSBPX0FQUEVORAkwMDAwMDAxMAogI2RlZmluZSBPX0JMS1NFRUsJMDAwMDAxMDAgLyogSFBVWCBvbmx5ICovCiAjZGVmaW5lIE9fQ1JFQVQJCTAwMDAwNDAwIC8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX1RSVU5DCQkwMDAwMTAwMCAvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19FWENMCQkwMDAwMjAwMCAvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19MQVJHRUZJTEUJMDAwMDQwMDAKICNkZWZpbmUgT19TWU5DCQkwMDEwMDAwMAogI2RlZmluZSBPX05PTkJMT0NLCTAwMjAwMDA0IC8qIEhQVVggaGFzIHNlcGFyYXRlIE5ERUxBWSAmIE5PTkJMT0NLICovCi0jZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKICNkZWZpbmUgT19OT0NUVFkJMDA0MDAwMDAgLyogbm90IGZjbnRsICovCiAjZGVmaW5lIE9fRFNZTkMJCTAxMDAwMDAwIC8qIEhQVVggb25seSAqLwogI2RlZmluZSBPX1JTWU5DCQkwMjAwMDAwMCAvKiBIUFVYIG9ubHkgKi8KICNkZWZpbmUgT19OT0FUSU1FCTA0MDAwMDAwCiAKLSNkZWZpbmUgRkFTWU5DCQkwMDAyMDAwMCAvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIE9fRElSRUNUCTAwMDQwMDAwIC8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50IC0gY3VycmVudGx5IGlnbm9yZWQgKi8KICNkZWZpbmUgT19ESVJFQ1RPUlkJMDAwMTAwMDAgLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwogI2RlZmluZSBPX05PRk9MTE9XCTAwMDAwMjAwIC8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLwogI2RlZmluZSBPX0lOVklTSUJMRQkwNDAwMDAwMCAvKiBpbnZpc2libGUgSS9PLCBmb3IgRE1BUEkvWERTTSAqLwogCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQgZl9mbGFncyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIG1vcmUgZmxhZ3MgKGNsb2V4ZWMpICovCi0jZGVmaW5lIEZfU0VURkwJCTQKLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKICNkZWZpbmUgRl9HRVRMSzY0CTgKICNkZWZpbmUgRl9TRVRMSzY0CTkKICNkZWZpbmUgRl9TRVRMS1c2NAkxMApAQCAtNDQsNDkgKzI4LDExIEBACiAjZGVmaW5lIEZfU0VUU0lHCTEzCS8qICBmb3Igc29ja2V0cy4gKi8KICNkZWZpbmUgRl9HRVRTSUcJMTQJLyogIGZvciBzb2NrZXRzLiAqLwogCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KIC8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCiAjZGVmaW5lIEZfUkRMQ0sJCTAxCiAjZGVmaW5lIEZfV1JMQ0sJCTAyCiAjZGVmaW5lIEZfVU5MQ0sJCTAzCiAKLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCW9mZl90IGxfc3RhcnQ7Ci0Jb2ZmX3QgbF9sZW47Ci0JcGlkX3QgbF9waWQ7Ci19OwotCi1zdHJ1Y3QgZmxvY2s2NCB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCWxvZmZfdCBsX3N0YXJ0OwotCWxvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLX07Ci0KLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFICAxMDI0CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvZnV0ZXguaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9BU01fRlVURVhfSAorI2RlZmluZSBfQVNNX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJY2FzZSBGVVRFWF9PUF9PUjoKKwljYXNlIEZVVEVYX09QX0FORE46CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9oZHJlZy5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2hkcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2ZkMWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2hkcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaGRyZWcuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9pcnEuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9pcnEuaAppbmRleCA3NTY1NGJhLi5mODc2YmRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2lycS5oCkBAIC0yNiw2ICsyNiwxMSBAQAogCiAjZGVmaW5lIE5SX0lSUVMJCShDUFVfSVJRX01BWCArIDEpCiAKKy8qCisgKiBJUlEgbGluZSBzdGF0dXMgbWFjcm8gSVJRX1BFUl9DUFUgaXMgdXNlZAorICovCisjZGVmaW5lIEFSQ0hfSEFTX0lSUV9QRVJfQ1BVCisKIHN0YXRpYyBfX2lubGluZV9fIGludCBpcnFfY2Fub25pY2FsaXplKGludCBpcnEpCiB7CiAJcmV0dXJuIChpcnEgPT0gMikgPyA5IDogaXJxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wYWdlLmgKaW5kZXggNGExMjY5Mi4uNDRlYWU5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvcGFnZS5oCkBAIC03NCwyMCArNzQsNiBAQAogI2RlZmluZSBfX3BnZCh4KQkoKHBnZF90KSB7ICh4KSB9ICkKICNkZWZpbmUgX19wZ3Byb3QoeCkJKChwZ3Byb3RfdCkgeyAoeCkgfSApCiAKLS8qIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyICovCi1leHRlcm4gX19pbmxpbmVfXyBpbnQgZ2V0X29yZGVyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpbnQgb3JkZXI7Ci0KLQlzaXplID0gKHNpemUtMSkgPj4gKFBBR0VfU0hJRlQtMSk7Ci0Jb3JkZXIgPSAtMTsKLQlkbyB7Ci0JCXNpemUgPj49IDE7Ci0JCW9yZGVyKys7Ci0JfSB3aGlsZSAoc2l6ZSk7Ci0JcmV0dXJuIG9yZGVyOwotfQotCiB0eXBlZGVmIHN0cnVjdCBfX3BoeXNtZW1fcmFuZ2UgewogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOwogCXVuc2lnbmVkIGxvbmcgcGFnZXM7ICAgICAgIC8qIFBBR0VfU0laRSBwYWdlcyAqLwpAQCAtMTU5LDQgKzE0NSw2IEBACiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYWdlLmg+CisKICNlbmRpZiAvKiBfUEFSSVNDX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3BjaS5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3BjaS5oCmluZGV4IDk4ZDc5YTMuLmQwYjc2MWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvcGNpLmgKQEAgLTI1Nyw2ICsyNTcsMTkgQEAKIHBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAogCQkJc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24pOwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZXNvdXJjZSAqCitwY2liaW9zX3NlbGVjdF9yb290KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QgPSBOVUxMOworCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQlyb290ID0gJmlvcG9ydF9yZXNvdXJjZTsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlyb290ID0gJmlvbWVtX3Jlc291cmNlOworCisJcmV0dXJuIHJvb3Q7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvcHJvY2Vzc29yLmgKaW5kZXggMGI2MWY1MS4uYTlkZmFkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wcm9jZXNzb3IuaApAQCAtMTEsNiArMTEsNyBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2tfdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2Mvc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zcGlubG9jay5oCmluZGV4IDY3OWVhMWMuLjQzZWFhNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zcGlubG9jay5oCkBAIC0yLDMwICsyLDI1IEBACiAjZGVmaW5lIF9fQVNNX1NQSU5MT0NLX0gKIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3NwaW5sb2NrX3R5cGVzLmg+CiAKIC8qIE5vdGUgdGhhdCBQQS1SSVNDIGhhcyB0byB1c2UgYDEnIHRvIG1lYW4gdW5sb2NrZWQgYW5kIGAwJyB0byBtZWFuIGxvY2tlZAogICogc2luY2UgaXQgb25seSBoYXMgbG9hZC1hbmQtemVyby4gTW9yZW92ZXIsIGF0IGxlYXN0IG9uIHNvbWUgUEEgcHJvY2Vzc29ycywKICAqIHRoZSBzZW1hcGhvcmUgYWRkcmVzcyBoYXMgdG8gYmUgMTYtYnl0ZSBhbGlnbmVkLgogICovCiAKLSNpZm5kZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0KLSNkZWZpbmUgX19TUElOX0xPQ0tfVU5MT0NLRUQJeyB7IDEsIDEsIDEsIDEgfSB9Ci0jdW5kZWYgU1BJTl9MT0NLX1VOTE9DS0VECi0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRCAoc3BpbmxvY2tfdCkgX19TUElOX0xPQ0tfVU5MT0NLRUQKLQotI2RlZmluZSBzcGluX2xvY2tfaW5pdCh4KQlkbyB7ICooeCkgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLQotc3RhdGljIGlubGluZSBpbnQgc3Bpbl9pc19sb2NrZWQoc3BpbmxvY2tfdCAqeCkKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3NwaW5faXNfbG9ja2VkKHJhd19zcGlubG9ja190ICp4KQogewogCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9IF9fbGRjd19hbGlnbih4KTsKIAlyZXR1cm4gKmEgPT0gMDsKIH0KIAotI2RlZmluZSBzcGluX3VubG9ja193YWl0KHgpCWRvIHsgYmFycmllcigpOyB9IHdoaWxlKHNwaW5faXNfbG9ja2VkKHgpKQotI2RlZmluZSBfcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX3Jhd19zcGluX2xvY2sobG9jaykKKyNkZWZpbmUgX19yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfX3Jhd19zcGluX2xvY2sobG9jaykKKyNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2tfd2FpdCh4KSBcCisJCWRvIHsgY3B1X3JlbGF4KCk7IH0gd2hpbGUgKF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqeCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKngpCiB7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50ICphOwogCkBAIC0zNiw3ICszMSw3IEBACiAJbWIoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqeCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqeCkKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmE7CiAJbWIoKTsKQEAgLTQ1LDcgKzQwLDcgQEAKIAltYigpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICp4KQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICp4KQogewogCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYTsKIAlpbnQgcmV0OwpAQCAtNTcsMTMxICs1MiwzOCBAQAogCiAJcmV0dXJuIHJldDsKIH0KLQkKLSNkZWZpbmUgc3Bpbl9sb2NrX293bihMT0NLLCBMT0NBVElPTikJKCh2b2lkKTApCi0KLSNlbHNlIC8qICEoQ09ORklHX0RFQlVHX1NQSU5MT0NLKSAqLwotCi0jZGVmaW5lIFNQSU5MT0NLX01BR0lDCTB4MUQyNDRCM0MKLQotI2RlZmluZSBfX1NQSU5fTE9DS19VTkxPQ0tFRAl7IHsgMSwgMSwgMSwgMSB9LCBTUElOTE9DS19NQUdJQywgMTAsIF9fRklMRV9fICwgTlVMTCwgMCwgLTEsIE5VTEwsIE5VTEwgfQotI3VuZGVmIFNQSU5fTE9DS19VTkxPQ0tFRAotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQgKHNwaW5sb2NrX3QpIF9fU1BJTl9MT0NLX1VOTE9DS0VECi0KLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQoeCkJZG8geyAqKHgpID0gU1BJTl9MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0KLSNkZWZpbmUgQ0hFQ0tfTE9DSyh4KQkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCSAJaWYgKHVubGlrZWx5KCh4KS0+bWFnaWMgIT0gU1BJTkxPQ0tfTUFHSUMpKSB7CQkJXAotCQkJcHJpbnRrKEtFUk5fRVJSICIlczolZDogc3Bpbl9pc19sb2NrZWQiCQlcCi0JCQkiIG9uIHVuaW5pdGlhbGl6ZWQgc3BpbmxvY2sgJXAuXG4iLAkJXAotCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgKHgpKTsgCQlcCi0JCX0gCQkJCQkJCVwKLQl9IHdoaWxlKDApCi0KLSNkZWZpbmUgc3Bpbl9pc19sb2NrZWQoeCkJCQkJCQlcCi0JKHsJCQkJCQkJCVwKLQkgCUNIRUNLX0xPQ0soeCk7CQkJCQkJXAotCQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmEgPSBfX2xkY3dfYWxpZ24oeCk7CQlcCi0JCWlmICh1bmxpa2VseSgoKmEgPT0gMCkgJiYgKHgpLT5iYWJibGUpKSB7CQkJCVwKLQkJCSh4KS0+YmFiYmxlLS07CQkJCQlcCi0JCQlwcmludGsoIktFUk5fV0FSTklORwkJCQlcCi0JCQkJJXM6JWQ6IHNwaW5faXNfbG9ja2VkKCVzLyVwKSBhbHJlYWR5IglcCi0JCQkJIiBsb2NrZWQgYnkgJXM6JWQgaW4gJXMgYXQgJXAoJWQpXG4iLAlcCi0JCQkJX19GSUxFX18sX19MSU5FX18sICh4KS0+bW9kdWxlLAkoeCksCVwKLQkJCQkoeCktPmJmaWxlLCAoeCktPmJsaW5lLCAoeCktPnRhc2stPmNvbW0sXAotCQkJCSh4KS0+cHJldmlvdXMsICh4KS0+b25jcHUpOwkJXAotCQl9CQkJCQkJCVwKLQkJKmEgPT0gMDsJCQkJCQlcCi0JfSkKLQotI2RlZmluZSBzcGluX3VubG9ja193YWl0KHgpCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkgCUNIRUNLX0xPQ0soeCk7CQkJCQkJXAotCQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmEgPSBfX2xkY3dfYWxpZ24oeCk7CQlcCi0JCWlmICh1bmxpa2VseSgoKmEgPT0gMCkgJiYgKHgpLT5iYWJibGUpKSB7CQkJCVwKLQkJCSh4KS0+YmFiYmxlLS07CQkJCQlcCi0JCQlwcmludGsoIktFUk5fV0FSTklORwkJCQlcCi0JCQkJJXM6JWQ6IHNwaW5fdW5sb2NrX3dhaXQoJXMvJXApIgkJXAotCQkJCSIgb3duZWQgYnkgJXM6JWQgaW4gJXMgYXQgJXAoJWQpXG4iLAlcCi0JCQkJX19GSUxFX18sX19MSU5FX18sICh4KS0+bW9kdWxlLCAoeCksCVwKLQkJCQkoeCktPmJmaWxlLCAoeCktPmJsaW5lLCAoeCktPnRhc2stPmNvbW0sXAotCQkJCSh4KS0+cHJldmlvdXMsICh4KS0+b25jcHUpOwkJXAotCQl9CQkJCQkJCVwKLQkJYmFycmllcigpOwkJCQkJCVwKLQl9IHdoaWxlICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKF9fbGRjd19hbGlnbih4KSkpID09IDApCi0KLWV4dGVybiB2b2lkIF9kYmdfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2ssIGNvbnN0IGNoYXIgKmJhc2VfZmlsZSwgaW50IGxpbmVfbm8pOwotZXh0ZXJuIHZvaWQgX2RiZ19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrLCBjb25zdCBjaGFyICosIGludCk7Ci1leHRlcm4gaW50IF9kYmdfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKiBsb2NrLCBjb25zdCBjaGFyICosIGludCk7Ci0KLSNkZWZpbmUgX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9yYXdfc3Bpbl9sb2NrKGxvY2spCi0KLSNkZWZpbmUgX3Jhd19zcGluX3VubG9jayhsb2NrKQlfZGJnX3NwaW5fdW5sb2NrKGxvY2ssIF9fRklMRV9fLCBfX0xJTkVfXykKLSNkZWZpbmUgX3Jhd19zcGluX2xvY2sobG9jaykgX2RiZ19zcGluX2xvY2sobG9jaywgX19GSUxFX18sIF9fTElORV9fKQotI2RlZmluZSBfcmF3X3NwaW5fdHJ5bG9jayhsb2NrKSBfZGJnX3NwaW5fdHJ5bG9jayhsb2NrLCBfX0ZJTEVfXywgX19MSU5FX18pCi0KLS8qIGp1c3QgaW4gY2FzZSB3ZSBuZWVkIGl0ICovCi0jZGVmaW5lIHNwaW5fbG9ja19vd24oTE9DSywgTE9DQVRJT04pCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9IF9fbGRjd19hbGlnbihMT0NLKTsJCQlcCi0JaWYgKCEoKCphID09IDApICYmICgoTE9DSyktPm9uY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkpKQlcCi0JCXByaW50aygiS0VSTl9XQVJOSU5HCQkJCQlcCi0JCQklczogY2FsbGVkIG9uICVkIGZyb20gJXAgYnV0IGxvY2sgJXMgb24gJWRcbiIsCVwKLQkJCUxPQ0FUSU9OLCBzbXBfcHJvY2Vzc29yX2lkKCksCQkJXAotCQkJX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLAkJCVwKLQkJCSgqYSA9PSAwKSA/ICJ0YWtlbiIgOiAiZnJlZWQiLCAoTE9DSyktPm9uX2NwdSk7CVwKLX0gd2hpbGUgKDApCi0KLSNlbmRpZiAvKiAhKENPTkZJR19ERUJVR19TUElOTE9DSykgKi8KIAogLyoKICAqIFJlYWQtd3JpdGUgc3BpbmxvY2tzLCBhbGxvd2luZyBtdWx0aXBsZSByZWFkZXJzCiAgKiBidXQgb25seSBvbmUgd3JpdGVyLgogICovCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXZvbGF0aWxlIGludCBjb3VudGVyOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gcndsb2NrX3Q7CiAKLSNkZWZpbmUgUldfTE9DS19VTkxPQ0tFRCAocndsb2NrX3QpIHsgX19TUElOX0xPQ0tfVU5MT0NLRUQsIDAgfQotCi0jZGVmaW5lIHJ3bG9ja19pbml0KGxwKQlkbyB7ICoobHApID0gUldfTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSBnZW5lcmljX3Jhd19yZWFkX3RyeWxvY2sobG9jaykKKyNkZWZpbmUgX19yYXdfcmVhZF90cnlsb2NrKGxvY2spIGdlbmVyaWNfX3Jhd19yZWFkX3RyeWxvY2sobG9jaykKIAogLyogcmVhZF9sb2NrLCByZWFkX3VubG9jayBhcmUgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4gIE9mIGNvdXJzZSBpdCBzb21laG93CiAgKiBzdWNrcyB3ZSBlbmQgdXAgc2F2aW5nL3Jlc3RvcmluZyBmbGFncyB0d2ljZSBmb3IgcmVhZF9sb2NrX2lycXNhdmUgYXNvLiAqLwogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1JXTE9DSwotZXh0ZXJuIHZvaWQgX2RiZ19yZWFkX2xvY2socndsb2NrX3QgKiBydywgY29uc3QgY2hhciAqYmZpbGUsIGludCBibGluZSk7Ci0jZGVmaW5lIF9yYXdfcmVhZF9sb2NrKHJ3KSBfZGJnX3JlYWRfbG9jayhydywgX19GSUxFX18sIF9fTElORV9fKQotI2Vsc2UKLXN0YXRpYyAgX19pbmxpbmVfXyB2b2lkIF9yYXdfcmVhZF9sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyAgX19pbmxpbmVfXyB2b2lkIF9fcmF3X3JlYWRfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCV9yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7IAorCV9fcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOwogCiAJcnctPmNvdW50ZXIrKzsKIAotCV9yYXdfc3Bpbl91bmxvY2soJnJ3LT5sb2NrKTsKKwlfX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KLSNlbmRpZgkvKiBDT05GSUdfREVCVUdfUldMT0NLICovCiAKLXN0YXRpYyAgX19pbmxpbmVfXyB2b2lkIF9yYXdfcmVhZF91bmxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljICBfX2lubGluZV9fIHZvaWQgX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlfcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOyAKKwlfX3Jhd19zcGluX2xvY2soJnJ3LT5sb2NrKTsKIAogCXJ3LT5jb3VudGVyLS07CiAKLQlfcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CisJX19yYXdfc3Bpbl91bmxvY2soJnJ3LT5sb2NrKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKQEAgLTE5NCwyMCArOTYsMTcgQEAKICAqIHdyaXRlcnMpIGluIGludGVycnVwdCBoYW5kbGVycyBzb21lb25lIGZ1Y2tlZCB1cCBhbmQgd2UnZCBkZWFkLWxvY2sKICAqIHNvb25lciBvciBsYXRlciBhbnl3YXkuICAgcHJ1bXBmICovCiAKLSNpZmRlZiBDT05GSUdfREVCVUdfUldMT0NLCi1leHRlcm4gdm9pZCBfZGJnX3dyaXRlX2xvY2socndsb2NrX3QgKiBydywgY29uc3QgY2hhciAqYmZpbGUsIGludCBibGluZSk7Ci0jZGVmaW5lIF9yYXdfd3JpdGVfbG9jayhydykgX2RiZ193cml0ZV9sb2NrKHJ3LCBfX0ZJTEVfXywgX19MSU5FX18pCi0jZWxzZQotc3RhdGljICBfX2lubGluZV9fIHZvaWQgX3Jhd193cml0ZV9sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyAgX19pbmxpbmVfXyB2b2lkIF9fcmF3X3dyaXRlX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKIHJldHJ5OgotCV9yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7CisJX19yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7CiAKIAlpZihydy0+Y291bnRlciAhPSAwKSB7CiAJCS8qIHRoaXMgYmFzaWNhbGx5IG5ldmVyIGhhcHBlbnMgKi8KLQkJX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOworCQlfX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOwogCi0JCXdoaWxlKHJ3LT5jb3VudGVyICE9IDApOworCQl3aGlsZSAocnctPmNvdW50ZXIgIT0gMCkKKwkJCWNwdV9yZWxheCgpOwogCiAJCWdvdG8gcmV0cnk7CiAJfQpAQCAtMjE1LDI2ICsxMTQsMjEgQEAKIAkvKiBnb3QgaXQuICBub3cgbGVhdmUgd2l0aG91dCB1bmxvY2tpbmcgKi8KIAlydy0+Y291bnRlciA9IC0xOyAvKiByZW1lbWJlciB3ZSBhcmUgbG9ja2VkICovCiB9Ci0jZW5kaWYgLyogQ09ORklHX0RFQlVHX1JXTE9DSyAqLwogCiAvKiB3cml0ZV91bmxvY2sgaXMgYWJzb2x1dGVseSB0cml2aWFsIC0gd2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciBhbnl0aGluZyAqLwogCi1zdGF0aWMgIF9faW5saW5lX18gdm9pZCBfcmF3X3dyaXRlX3VubG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgIF9faW5saW5lX18gdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAlydy0+Y291bnRlciA9IDA7Ci0JX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOworCV9fcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CiB9CiAKLSNpZmRlZiBDT05GSUdfREVCVUdfUldMT0NLCi1leHRlcm4gaW50IF9kYmdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqIHJ3LCBjb25zdCBjaGFyICpiZmlsZSwgaW50IGJsaW5lKTsKLSNkZWZpbmUgX3Jhd193cml0ZV90cnlsb2NrKHJ3KSBfZGJnX3dyaXRlX3RyeWxvY2socncsIF9fRklMRV9fLCBfX0xJTkVfXykKLSNlbHNlCi1zdGF0aWMgIF9faW5saW5lX18gaW50IF9yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgIF9faW5saW5lX18gaW50IF9fcmF3X3dyaXRlX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKIHsKLQlfcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOworCV9fcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOwogCWlmIChydy0+Y291bnRlciAhPSAwKSB7CiAJCS8qIHRoaXMgYmFzaWNhbGx5IG5ldmVyIGhhcHBlbnMgKi8KLQkJX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOworCQlfX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOwogCiAJCXJldHVybiAwOwogCX0KQEAgLTI0MywxNCArMTM3LDEzIEBACiAJcnctPmNvdW50ZXIgPSAtMTsgLyogcmVtZW1iZXIgd2UgYXJlIGxvY2tlZCAqLwogCXJldHVybiAxOwogfQotI2VuZGlmIC8qIENPTkZJR19ERUJVR19SV0xPQ0sgKi8KIAotc3RhdGljIF9faW5saW5lX18gaW50IGlzX3JlYWRfbG9ja2VkKHJ3bG9ja190ICpydykKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX3Jhd19pc19yZWFkX2xvY2tlZChyYXdfcndsb2NrX3QgKnJ3KQogewogCXJldHVybiBydy0+Y291bnRlciA+IDA7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBpc193cml0ZV9sb2NrZWQocndsb2NrX3QgKnJ3KQorc3RhdGljIF9faW5saW5lX18gaW50IF9fcmF3X2lzX3dyaXRlX2xvY2tlZChyYXdfcndsb2NrX3QgKnJ3KQogewogCXJldHVybiBydy0+Y291bnRlciA8IDA7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2Mvc3BpbmxvY2tfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NWJiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2Mvc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX19BU01fU1BJTkxPQ0tfVFlQRVNfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9ja1s0XTsKK30gcmF3X3NwaW5sb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VECXsgeyAxLCAxLCAxLCAxIH0gfQorCit0eXBlZGVmIHN0cnVjdCB7CisJcmF3X3NwaW5sb2NrX3QgbG9jazsKKwl2b2xhdGlsZSBpbnQgY291bnRlcjsKK30gcmF3X3J3bG9ja190OworCisjZGVmaW5lIF9fUkFXX1JXX0xPQ0tfVU5MT0NLRUQJCXsgX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VELCAwIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2Mvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1wYXJpc2Mvc3lzdGVtLmgKaW5kZXggODFjNTQzMy4uMjZmZjg0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zeXN0ZW0uaApAQCAtMTYwLDI5ICsxNjAsNyBAQAogfSkKIAogI2lmZGVmIENPTkZJR19TTVAKLS8qCi0gKiBZb3VyIGJhc2ljIFNNUCBzcGlubG9ja3MsIGFsbG93aW5nIG9ubHkgYSBzaW5nbGUgQ1BVIGFueXdoZXJlCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrWzRdOwotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCXVuc2lnbmVkIGxvbmcgbWFnaWM7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGJhYmJsZTsKLQljb25zdCBjaGFyICptb2R1bGU7Ci0JY2hhciAqYmZpbGU7Ci0JaW50IGJsaW5lOwotCWludCBvbmNwdTsKLQl2b2lkICpwcmV2aW91czsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiB0YXNrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSBzcGlubG9ja190OwotCi0jZGVmaW5lIF9fbG9ja19hbGlnbmVkIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5sb2NrX2FsaWduZWQiKSkpCi0KKyMgZGVmaW5lIF9fbG9ja19hbGlnbmVkIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5sb2NrX2FsaWduZWQiKSkpCiAjZW5kaWYKIAogI2RlZmluZSBLRVJORUxfU1RBUlQgKDB4MTAxMDAwMDAgLSAweDEwMDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy90eXBlcy5oCmluZGV4IDhmZTdhNDQuLmQyMWI5ZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy90eXBlcy5oCkBAIC01Niw4ICs1Niw2IEBACiB0eXBlZGVmIHUzMiBkbWFfYWRkcl90OwogdHlwZWRlZiB1NjQgZG1hNjRfYWRkcl90OwogCi10eXBlZGVmIHVuc2lnbmVkIGludCBrbWVtX2J1ZmN0bF90OwotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3VhY2Nlc3MuaAppbmRleCBjMWI1YmRlLi5mNmM0MTdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy91YWNjZXNzLmgKQEAgLTQwLDEwICs0MCw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNkZWZpbmUgdmVyaWZ5X2FyZWEodHlwZSxhZGRyLHNpemUpICgwKQkvKiBGSVhNRTogYWxsIHVzZXJzIHNob3VsZCBnbyBhd2F5IHNvb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIHVzZSBhY2Nlc3Nfb2sgaW5zdGVhZCwgdGhlbiB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2hvdWxkIGJlIHJlbW92ZWQuICovCi0KICNkZWZpbmUgcHV0X3VzZXIgX19wdXRfdXNlcgogI2RlZmluZSBnZXRfdXNlciBfX2dldF91c2VyCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvODI1M3BpdC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy84MjUzcGl0LmgKaW5kZXggODYyNzA4YS4uYjcwZDZlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy84MjUzcGl0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy84MjUzcGl0LmgKQEAgLTEsMTAgKzEsMTAgQEAKKyNpZm5kZWYgX0FTTV9QT1dFUlBDXzgyNTNQSVRfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfODI1M1BJVF9ICisKIC8qCiAgKiA4MjUzLzgyNTQgUHJvZ3JhbW1hYmxlIEludGVydmFsIFRpbWVyCiAgKi8KIAotI2lmbmRlZiBfODI1M1BJVF9ICi0jZGVmaW5lIF84MjUzUElUX0gKLQogI2RlZmluZSBQSVRfVElDS19SQVRFCTExOTMxODJVTAogCi0jZW5kaWYKKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfODI1M1BJVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2FncC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9hZ3AuaAppbmRleCBjYTllNDIzLi44ODViNDYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2FncC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYWdwLmgKQEAgLTEsMTAgKzEsOCBAQAotI2lmbmRlZiBBR1BfSAotI2RlZmluZSBBR1BfSCAxCisjaWZuZGVmIF9BU01fUE9XRVJQQ19BR1BfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfQUdQX0gKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0vKiBub3RoaW5nIG11Y2ggbmVlZGVkIGhlcmUgKi8KLQogI2RlZmluZSBtYXBfcGFnZV9pbnRvX2FncChwYWdlKQogI2RlZmluZSB1bm1hcF9wYWdlX2Zyb21fYWdwKHBhZ2UpCiAjZGVmaW5lIGZsdXNoX2FncF9tYXBwaW5ncygpCkBAIC0yMCw0ICsxOCw0IEBACiAjZGVmaW5lIGZyZWVfZ2F0dF9wYWdlcyh0YWJsZSwgb3JkZXIpCVwKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSh0YWJsZSksIChvcmRlcikpCiAKLSNlbmRpZgorI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19BR1BfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9idWdzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2J1Z3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmZkYjczCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9idWdzLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfQlVHU19ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19CVUdTX0gKKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSAnaW5pdC9tYWluLmMnIHRvIGNoZWNrIGZvcgorICogYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBidWdzLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19idWdzKHZvaWQpIHsgfQorCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX0JVR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9lcnJuby5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lcnJuby5oCmluZGV4IDE5ZjIwYmQuLjhjMTQ1ZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZXJybm8uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Vycm5vLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9QUENfRVJSTk9fSAotI2RlZmluZSBfUFBDX0VSUk5PX0gKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX0VSUk5PX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX0VSUk5PX0gKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Vycm5vLmg+CiAKQEAgLTgsNCArOCw0IEBACiAKICNkZWZpbmUgX0xBU1RfRVJSTk8JNTE2CiAKLSNlbmRpZgorI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19FUlJOT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1YzQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmNudGwuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9BU01fRkNOVExfSAorI2RlZmluZSBfQVNNX0ZDTlRMX0gKKworI2RlZmluZSBPX0RJUkVDVE9SWSAgICAgIDA0MDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCisjZGVmaW5lIE9fTk9GT0xMT1cgICAgICAwMTAwMDAwCS8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLworI2RlZmluZSBPX0xBUkdFRklMRSAgICAgMDIwMDAwMAorI2RlZmluZSBPX0RJUkVDVAkwNDAwMDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50ICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgorCisjZW5kaWYgLyogX0FTTV9GQ05UTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvY3RsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvY3RsLmgKaW5kZXggOTNjNmFjZi4uOGViOTk4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pb2N0bC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW9jdGwuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX1BQQ19JT0NUTF9ICi0jZGVmaW5lIF9QUENfSU9DVExfSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfSU9DVExfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfSU9DVExfSAogCiAKIC8qCkBAIC02Niw0ICs2Niw0IEBACiAjZGVmaW5lIElPQ1NJWkVfTUFTSwkoX0lPQ19TSVpFTUFTSyA8PCBfSU9DX1NJWkVTSElGVCkKICNkZWZpbmUgSU9DU0laRV9TSElGVAkoX0lPQ19TSVpFU0hJRlQpCiAKLSNlbmRpZgorI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19JT0NUTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvY3Rscy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pb2N0bHMuaAppbmRleCBmNWI3ZjJiLi41Yjk0ZmY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW9jdGxzLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fUFBDX0lPQ1RMU19ICi0jZGVmaW5lIF9BU01fUFBDX0lPQ1RMU19ICisjaWZuZGVmIF9BU01fUE9XRVJQQ19JT0NUTFNfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfSU9DVExTX0gKIAogI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgogCkBAIC0xMDQsNCArMTA0LDQgQEAKICNkZWZpbmUgVElPQ01JV0FJVAkweDU0NUMJLyogd2FpdCBmb3IgYSBjaGFuZ2Ugb24gc2VyaWFsIGlucHV0IGxpbmUocykgKi8KICNkZWZpbmUgVElPQ0dJQ09VTlQJMHg1NDVECS8qIHJlYWQgc2VyaWFsIHBvcnQgaW5saW5lIGludGVycnVwdCBjb3VudHMgKi8KIAotI2VuZGlmIC8qIF9BU01fUFBDX0lPQ1RMU19IICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX0lPQ1RMU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2xpbmthZ2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbGlua2FnZS5oCmluZGV4IDI5MWMyZDAuLmUxYzRhYzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbGlua2FnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbGlua2FnZS5oCkBAIC0xLDYgKzEsNiBAQAotI2lmbmRlZiBfX0FTTV9MSU5LQUdFX0gKLSNkZWZpbmUgX19BU01fTElOS0FHRV9ICisjaWZuZGVmIF9BU01fUE9XRVJQQ19MSU5LQUdFX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX0xJTktBR0VfSAogCiAvKiBOb3RoaW5nIHRvIHNlZSBoZXJlLi4uICovCiAKLSNlbmRpZgorI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19MSU5LQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L21jMTQ2ODE4cnRjLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21jMTQ2ODE4cnRjLmgKc2ltaWxhcml0eSBpbmRleCA4MyUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tcHBjNjQvbWMxNDY4MThydGMuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tcG93ZXJwYy9tYzE0NjgxOHJ0Yy5oCmluZGV4IGY3MTNlMWIuLmYyNzQxYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L21jMTQ2ODE4cnRjLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tYzE0NjgxOHJ0Yy5oCkBAIC0xLDMgKzEsNiBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfTUMxNDY4MThSVENfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfTUMxNDY4MThSVENfSAorCiAvKgogICogTWFjaGluZSBkZXBlbmRlbnQgYWNjZXNzIGZ1bmN0aW9ucyBmb3IgUlRDIHJlZ2lzdGVycy4KICAqCkBAIC02LDggKzksOCBAQAogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCi0jaWZuZGVmIF9fQVNNX1BQQzY0X01DMTQ2ODE4UlRDX0gKLSNkZWZpbmUgX19BU01fUFBDNjRfTUMxNDY4MThSVENfSAorCisjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKQEAgLTI5LDQgKzMyLDUgQEAKIG91dGJfcCgodmFsKSxSVENfUE9SVCgxKSk7IFwKIH0pCiAKLSNlbmRpZiAvKiBfX0FTTV9QUEM2NF9NQzE0NjgxOFJUQ19IICovCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19NQzE0NjgxOFJUQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9tbWFuLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tYW4uaApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1wcGM2NC9tbWFuLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXBvd2VycGMvbW1hbi5oCmluZGV4IGQ0ZjkzNDQuLmY1ZTUzNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L21tYW4uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tYW4uaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19QUEM2NF9NTUFOX0hfXwotI2RlZmluZSBfX1BQQzY0X01NQU5fSF9fCisjaWZuZGVmIF9BU01fUE9XRVJQQ19NTUFOX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX01NQU5fSAogCiAvKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNDksNCArNDksNCBAQAogI2RlZmluZSBNQVBfQU5PTglNQVBfQU5PTllNT1VTCiAjZGVmaW5lIE1BUF9GSUxFCTAKIAotI2VuZGlmIC8qIF9fUFBDNjRfTU1BTl9IX18gKi8KKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfTU1BTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21vZHVsZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWNkMDVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tb2R1bGUuaApAQCAtMCwwICsxLDc3IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19NT0RVTEVfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfTU9EVUxFX0gKKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vYnVnLmg+CisKKworI2lmbmRlZiBfX3Bvd2VycGM2NF9fCisvKgorICogVGhhbmtzIHRvIFBhdWwgTSBmb3IgZXhwbGFpbmluZyB0aGlzLgorICoKKyAqIFBQQyBjYW4gb25seSBkbyByZWwganVtcHMgKz0gMzJNQiwgYW5kIG9mdGVuIHRoZSBrZXJuZWwgYW5kIG90aGVyCisgKiBtb2R1bGVzIGFyZSBmdXJ0aHVyIGF3YXkgdGhhbiB0aGlzLiAgU28sIHdlIGp1bXAgdG8gYSB0YWJsZSBvZgorICogdHJhbXBvbGluZXMgYXR0YWNoZWQgdG8gdGhlIG1vZHVsZSAodGhlIFByb2NlZHVyZSBMaW5rYWdlIFRhYmxlKQorICogd2hlbmV2ZXIgdGhhdCBoYXBwZW5zLgorICovCisKK3N0cnVjdCBwcGNfcGx0X2VudHJ5IHsKKwkvKiAxNiBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgKDQgaW5zdHJ1Y3Rpb25zKSAqLworCXVuc2lnbmVkIGludCBqdW1wWzRdOworfTsKKyNlbmRpZgkvKiBfX3Bvd2VycGM2NF9fICovCisKKworc3RydWN0IG1vZF9hcmNoX3NwZWNpZmljIHsKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisJdW5zaWduZWQgaW50IHN0dWJzX3NlY3Rpb247CS8qIEluZGV4IG9mIHN0dWJzIHNlY3Rpb24gaW4gbW9kdWxlICovCisJdW5zaWduZWQgaW50IHRvY19zZWN0aW9uOwkvKiBXaGF0IHNlY3Rpb24gaXMgdGhlIFRPQz8gKi8KKyNlbHNlCisJLyogSW5kaWNlcyBvZiBQTFQgc2VjdGlvbnMgd2l0aGluIG1vZHVsZS4gKi8KKwl1bnNpZ25lZCBpbnQgY29yZV9wbHRfc2VjdGlvbjsKKwl1bnNpZ25lZCBpbnQgaW5pdF9wbHRfc2VjdGlvbjsKKyNlbmRpZgorCisJLyogTGlzdCBvZiBCVUcgYWRkcmVzc2VzLCBzb3VyY2UgbGluZSBudW1iZXJzIGFuZCBmaWxlbmFtZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1Z19saXN0OworCXN0cnVjdCBidWdfZW50cnkgKmJ1Z190YWJsZTsKKwl1bnNpZ25lZCBpbnQgbnVtX2J1Z3M7Cit9OworCitleHRlcm4gc3RydWN0IGJ1Z19lbnRyeSAqbW9kdWxlX2ZpbmRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkcik7CisKKy8qCisgKiBTZWxlY3QgRUxGIGhlYWRlcnMuCisgKiBNYWtlIGVtcHR5IHNlY3Rpb24gZm9yIG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMgdG8gZXhwYW5kLgorICovCisKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisjICAgIGRlZmluZSBFbGZfU2hkcglFbGY2NF9TaGRyCisjICAgIGRlZmluZSBFbGZfU3ltCUVsZjY0X1N5bQorIyAgICBkZWZpbmUgRWxmX0VoZHIJRWxmNjRfRWhkcgorIyAgICBpZmRlZiBNT0RVTEUKKwlhc20oIi5zZWN0aW9uIC5zdHVicyxcImF4XCIsQG5vYml0czsgLmFsaWduIDM7IC5wcmV2aW91cyIpOworIyAgICBlbmRpZgorI2Vsc2UKKyMgICAgZGVmaW5lIEVsZl9TaGRyCUVsZjMyX1NoZHIKKyMgICAgZGVmaW5lIEVsZl9TeW0JRWxmMzJfU3ltCisjICAgIGRlZmluZSBFbGZfRWhkcglFbGYzMl9FaGRyCisjICAgIGlmZGVmIE1PRFVMRQorCWFzbSgiLnNlY3Rpb24gLnBsdCxcImF4XCIsQG5vYml0czsgLmFsaWduIDM7IC5wcmV2aW91cyIpOworCWFzbSgiLnNlY3Rpb24gLmluaXQucGx0LFwiYXhcIixAbm9iaXRzOyAuYWxpZ24gMzsgLnByZXZpb3VzIik7CisjICAgIGVuZGlmCS8qIE1PRFVMRSAqLworI2VuZGlmCisKKworc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeTsKK3ZvaWQgc29ydF9leF90YWJsZShzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICpzdGFydCwKKwkJICAgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZmluaXNoKTsKKworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19NT0RVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL21zZ2J1Zi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tc2didWYuaApzaW1pbGFyaXR5IGluZGV4IDY0JQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1wcGMvbXNnYnVmLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXBvd2VycGMvbXNnYnVmLmgKaW5kZXggMTA1MzQ1Mi4uZGQ3Njc0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL21zZ2J1Zi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXNnYnVmLmgKQEAgLTEsMTcgKzEsMjUgQEAKLSNpZm5kZWYgX1BQQ19NU0dCVUZfSAotI2RlZmluZSBfUFBDX01TR0JVRl9ICisjaWZuZGVmIF9BU01fUE9XRVJQQ19NU0dCVUZfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfTVNHQlVGX0gKIAogLyoKLSAqIFRoZSBtc3FpZDY0X2RzIHN0cnVjdHVyZSBmb3IgdGhlIFBQQyBhcmNoaXRlY3R1cmUuCisgKiBUaGUgbXNxaWQ2NF9kcyBzdHJ1Y3R1cmUgZm9yIHRoZSBQb3dlclBDIGFyY2hpdGVjdHVyZS4KKyAqIE5vdGUgZXh0cmEgcGFkZGluZyBiZWNhdXNlIHRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCBiYWNrIGFuZCBmb3J0aAorICogYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCiAgKi8KIAogc3RydWN0IG1zcWlkNjRfZHMgewogCXN0cnVjdCBpcGM2NF9wZXJtIG1zZ19wZXJtOworI2lmbmRlZiBfX3Bvd2VycGM2NF9fCiAJdW5zaWduZWQgaW50CV9fdW51c2VkMTsKKyNlbmRpZgogCV9fa2VybmVsX3RpbWVfdCBtc2dfc3RpbWU7CS8qIGxhc3QgbXNnc25kIHRpbWUgKi8KKyNpZm5kZWYgX19wb3dlcnBjNjRfXwogCXVuc2lnbmVkIGludAlfX3VudXNlZDI7CisjZW5kaWYKIAlfX2tlcm5lbF90aW1lX3QgbXNnX3J0aW1lOwkvKiBsYXN0IG1zZ3JjdiB0aW1lICovCisjaWZuZGVmIF9fcG93ZXJwYzY0X18KIAl1bnNpZ25lZCBpbnQJX191bnVzZWQzOworI2VuZGlmCiAJX19rZXJuZWxfdGltZV90IG1zZ19jdGltZTsJLyogbGFzdCBjaGFuZ2UgdGltZSAqLwogCXVuc2lnbmVkIGxvbmcgIG1zZ19jYnl0ZXM7CS8qIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIG9uIHF1ZXVlICovCiAJdW5zaWduZWQgbG9uZyAgbXNnX3FudW07CS8qIG51bWJlciBvZiBtZXNzYWdlcyBpbiBxdWV1ZSAqLwpAQCAtMjIsNCArMzAsNCBAQAogCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNTsKIH07CiAKLSNlbmRpZiAvKiBfUFBDX01TR0JVRl9IICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX01TR0JVRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL25hbWVpLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL25hbWVpLmgKaW5kZXggMjljOWVjOC4uNjU3NDQzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9uYW1laS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbmFtZWkuaApAQCAtMSwxNCArMSwxNCBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfTkFNRUlfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfTkFNRUlfSAorCisjaWZkZWYgX19LRVJORUxfXworCiAvKgotICogaW5jbHVkZS9hc20tcHBjL25hbWVpLmgKICAqIEFkYXB0ZWQgZnJvbSBpbmNsdWRlL2FzbS1hbHBoYS9uYW1laS5oCiAgKgogICogSW5jbHVkZWQgZnJvbSBmcy9uYW1laS5jCiAgKi8KIAotI2lmZGVmIF9fS0VSTkVMX18KLSNpZm5kZWYgX19QUENfTkFNRUlfSAotI2RlZmluZSBfX1BQQ19OQU1FSV9ICi0KIC8qIFRoaXMgZHVtbXkgcm91dGluZSBtYXliZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyB1c2VmdWwKICAqIGZvciAvdXNyL2duZW11bC8gZW11bGF0aW9uIHN0dWZmLgogICogTG9vayBhdCBhc20tc3BhcmMvbmFtZWkuaCBmb3IgZGV0YWlscy4KQEAgLTE2LDUgKzE2LDUgQEAKIAogI2RlZmluZSBfX2VtdWxfcHJlZml4KCkgTlVMTAogCi0jZW5kaWYgLyogX19QUENfTkFNRUlfSCAqLwotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX05BTUVJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9wYXJhbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYXJhbS5oCnNpbWlsYXJpdHkgaW5kZXggNjUlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXBwYy9wYXJhbS5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1wb3dlcnBjL3BhcmFtLmgKaW5kZXggYjI0YTRlMy4uYmRjNzI0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3BhcmFtLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYXJhbS5oCkBAIC0xLDggKzEsMTAgQEAKLSNpZm5kZWYgX0FTTV9QUENfUEFSQU1fSAotI2RlZmluZSBfQVNNX1BQQ19QQVJBTV9ICisjaWZuZGVmIF9BU01fUE9XRVJQQ19QQVJBTV9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19QQVJBTV9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAogI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgSFoJCTEwMDAJCS8qIGludGVybmFsIHRpbWVyIGZyZXF1ZW5jeSAqLworI2RlZmluZSBIWgkJQ09ORklHX0haCS8qIGludGVybmFsIGtlcm5lbCB0aW1lciBmcmVxdWVuY3kgKi8KICNkZWZpbmUgVVNFUl9IWgkJMTAwCQkvKiBmb3IgdXNlciBpbnRlcmZhY2VzIGluICJ0aWNrcyIgKi8KICNkZWZpbmUgQ0xPQ0tTX1BFUl9TRUMJKFVTRVJfSFopCS8qIGZyZXF1ZW5jeSBhdCB3aGljaCB0aW1lcygpIGNvdW50cyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KQEAgLTE5LDQgKzIxLDQgQEAKIAogI2RlZmluZSBNQVhIT1NUTkFNRUxFTgk2NAkvKiBtYXggbGVuZ3RoIG9mIGhvc3RuYW1lICovCiAKLSNlbmRpZgorI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19QQVJBTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BvbGwuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcG9sbC5oCmluZGV4IGJlNTAyNDkuLmVkZDIwNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcG9sbC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX1BQQ19QT0xMX0gKLSNkZWZpbmUgX19QUENfUE9MTF9ICisjaWZuZGVmIF9BU01fUE9XRVJQQ19QT0xMX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1BPTExfSAogCiAjZGVmaW5lIFBPTExJTgkJMHgwMDAxCiAjZGVmaW5lIFBPTExQUkkJCTB4MDAwMgpAQCAtMjAsNCArMjAsNCBAQAogCXNob3J0IHJldmVudHM7CiB9OwogCi0jZW5kaWYKKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfUE9MTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9zZW1idWYuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc2VtYnVmLmgKc2ltaWxhcml0eSBpbmRleCA2MSUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tcHBjNjQvc2VtYnVmLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXBvd2VycGMvc2VtYnVmLmgKaW5kZXggMTcyZTU5MC4uOTlhNDE5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvc2VtYnVmLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zZW1idWYuaApAQCAtMSwyNyArMSwzNiBAQAotI2lmbmRlZiBfUFBDNjRfU0VNQlVGX0gKLSNkZWZpbmUgX1BQQzY0X1NFTUJVRl9ICisjaWZuZGVmIF9BU01fUE9XRVJQQ19TRU1CVUZfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfU0VNQlVGX0gKIAotLyogCi0gKiBUaGUgc2VtaWQ2NF9kcyBzdHJ1Y3R1cmUgZm9yIFBQQyBhcmNoaXRlY3R1cmUuCi0gKgotICoKKy8qCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qCisgKiBUaGUgc2VtaWQ2NF9kcyBzdHJ1Y3R1cmUgZm9yIFBQQyBhcmNoaXRlY3R1cmUuCisgKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgogICoKICAqIFBhZCBzcGFjZSBpcyBsZWZ0IGZvcjoKLSAqIC0gMiBtaXNjZWxsYW5lb3VzIDY0LWJpdCB2YWx1ZXMKKyAqIC0gNjQtYml0IHRpbWVfdCB0byBzb2x2ZSB5MjAzOCBwcm9ibGVtCisgKiAtIDIgbWlzY2VsbGFuZW91cyAzMi1iaXQgdmFsdWVzCiAgKi8KIAogc3RydWN0IHNlbWlkNjRfZHMgewogCXN0cnVjdCBpcGM2NF9wZXJtIHNlbV9wZXJtOwkvKiBwZXJtaXNzaW9ucyAuLiBzZWUgaXBjLmggKi8KKyNpZm5kZWYgX19wb3dlcnBjNjRfXworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOworI2VuZGlmCiAJX19rZXJuZWxfdGltZV90CXNlbV9vdGltZTsJLyogbGFzdCBzZW1vcCB0aW1lICovCisjaWZuZGVmIF9fcG93ZXJwYzY0X18KKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMjsKKyNlbmRpZgogCV9fa2VybmVsX3RpbWVfdAlzZW1fY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KIAl1bnNpZ25lZCBsb25nCXNlbV9uc2VtczsJLyogbm8uIG9mIHNlbWFwaG9yZXMgaW4gYXJyYXkgKi8KLQotCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOwotCXVuc2lnbmVkIGxvbmcJX191bnVzZWQyOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQzOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQ0OwogfTsKIAotI2VuZGlmIC8qIF9QUEM2NF9TRU1CVUZfSCAqLworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19TRU1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zZXR1cC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zZXR1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTc0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NldHVwLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19TRVRVUF9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19TRVRVUF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUJNTEyCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1NFVFVQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3NobWJ1Zi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zaG1idWYuaApzaW1pbGFyaXR5IGluZGV4IDcxJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1wcGM2NC9zaG1idWYuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tcG93ZXJwYy9zaG1idWYuaAppbmRleCAwMmU5OWQ2Li44ZWZhMzk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9zaG1idWYuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NobWJ1Zi5oCkBAIC0xLDMxICsxLDQ3IEBACi0jaWZuZGVmIF9QUEM2NF9TSE1CVUZfSAotI2RlZmluZSBfUFBDNjRfU0hNQlVGX0gKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1NITUJVRl9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19TSE1CVUZfSAogCi0vKiAKLSAqIFRoZSBzaG1pZDY0X2RzIHN0cnVjdHVyZSBmb3IgUFBDNjQgYXJjaGl0ZWN0dXJlLgotICogTm90ZSBleHRyYSBwYWRkaW5nIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoCi0gKiBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlciBzcGFjZS4KLSAqCi0gKiBQYWQgc3BhY2UgaXMgbGVmdCBmb3I6Ci0gKiAtIDIgbWlzY2VsbGFuZW91cyA2NC1iaXQgdmFsdWVzCi0gKgorLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorLyoKKyAqIFRoZSBzaG1pZDY0X2RzIHN0cnVjdHVyZSBmb3IgUFBDIGFyY2hpdGVjdHVyZS4KKyAqCisgKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgorICoKKyAqIFBhZCBzcGFjZSBpcyBsZWZ0IGZvcjoKKyAqIC0gNjQtYml0IHRpbWVfdCB0byBzb2x2ZSB5MjAzOCBwcm9ibGVtCisgKiAtIDIgbWlzY2VsbGFuZW91cyAzMi1iaXQgdmFsdWVzCisgKi8KKwogc3RydWN0IHNobWlkNjRfZHMgewogCXN0cnVjdCBpcGM2NF9wZXJtCXNobV9wZXJtOwkvKiBvcGVyYXRpb24gcGVybXMgKi8KKyNpZm5kZWYgX19wb3dlcnBjNjRfXworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMTsKKyNlbmRpZgogCV9fa2VybmVsX3RpbWVfdAkJc2htX2F0aW1lOwkvKiBsYXN0IGF0dGFjaCB0aW1lICovCisjaWZuZGVmIF9fcG93ZXJwYzY0X18KKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDI7CisjZW5kaWYKIAlfX2tlcm5lbF90aW1lX3QJCXNobV9kdGltZTsJLyogbGFzdCBkZXRhY2ggdGltZSAqLworI2lmbmRlZiBfX3Bvd2VycGM2NF9fCisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQzOworI2VuZGlmCiAJX19rZXJuZWxfdGltZV90CQlzaG1fY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKyNpZm5kZWYgX19wb3dlcnBjNjRfXworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkNDsKKyNlbmRpZgogCXNpemVfdAkJCXNobV9zZWdzejsJLyogc2l6ZSBvZiBzZWdtZW50IChieXRlcykgKi8KIAlfX2tlcm5lbF9waWRfdAkJc2htX2NwaWQ7CS8qIHBpZCBvZiBjcmVhdG9yICovCiAJX19rZXJuZWxfcGlkX3QJCXNobV9scGlkOwkvKiBwaWQgb2YgbGFzdCBvcGVyYXRvciAqLwogCXVuc2lnbmVkIGxvbmcJCXNobV9uYXR0Y2g7CS8qIG5vLiBvZiBjdXJyZW50IGF0dGFjaGVzICovCi0JdW5zaWduZWQgbG9uZwkJX191bnVzZWQxOwotCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMjsKKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDU7CisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQ2OwogfTsKIAogc3RydWN0IHNobWluZm82NCB7CkBAIC00MCw0ICs1Niw0IEBACiAJdW5zaWduZWQgbG9uZwlfX3VudXNlZDQ7CiB9OwogCi0jZW5kaWYgLyogX1BQQzY0X1NITUJVRl9IICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1NITUJVRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NobXBhcmFtLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NobXBhcmFtLmgKaW5kZXggZDYyNTA2MC4uNWNkYTQyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zaG1wYXJhbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc2htcGFyYW0uaApAQCAtMSw2ICsxLDYgQEAKLSNpZm5kZWYgX1BQQ19TSE1QQVJBTV9ICi0jZGVmaW5lIF9QUENfU0hNUEFSQU1fSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfU0hNUEFSQU1fSAorI2RlZmluZSBfQVNNX1BPV0VSUENfU0hNUEFSQU1fSAogCiAjZGVmaW5lCVNITUxCQSBQQUdFX1NJWkUJCSAvKiBhdHRhY2ggYWRkciBhIG11bHRpcGxlIG9mIHRoaXMgKi8KIAotI2VuZGlmIC8qIF9QUENfU0hNUEFSQU1fSCAqLworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19TSE1QQVJBTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NpZ2luZm8uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc2lnaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOGVhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NpZ2luZm8uaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19TSUdJTkZPX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1NJR0lORk9fSAorCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZkZWYgX19wb3dlcnBjNjRfXworIyAgICBkZWZpbmUgX19BUkNIX1NJX1BSRUFNQkxFX1NJWkUJKDQgKiBzaXplb2YoaW50KSkKKyMgICAgZGVmaW5lIFNJX1BBRF9TSVpFMzIJCSgoU0lfTUFYX1NJWkUvc2l6ZW9mKGludCkpIC0gMykKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnaW5mby5oPgorCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1NJR0lORk9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NvY2tldC5oCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXBwYzY0L3NvY2tldC5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1wb3dlcnBjL3NvY2tldC5oCmluZGV4IDllMWFmOGUuLmU0YjgxNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc29ja2V0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fU09DS0VUX0gKLSNkZWZpbmUgX0FTTV9TT0NLRVRfSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfU09DS0VUX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1NPQ0tFVF9ICiAKIC8qCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0xMCw3ICsxMCw3IEBACiAKICNpbmNsdWRlIDxhc20vc29ja2lvcy5oPgogCi0vKiBGb3Igc2V0c29ja29wdGlvbnMoMikgKi8KKy8qIEZvciBzZXRzb2Nrb3B0KDIpICovCiAjZGVmaW5lIFNPTF9TT0NLRVQJMQogCiAjZGVmaW5lIFNPX0RFQlVHCTEKQEAgLTUyLDggKzUyLDggQEAKICNkZWZpbmUgU09fVElNRVNUQU1QCQkyOQogI2RlZmluZSBTQ01fVElNRVNUQU1QCQlTT19USU1FU1RBTVAKIAotI2RlZmluZSBTT19BQ0NFUFRDT05OICAgICAgICAgICAzMAorI2RlZmluZSBTT19BQ0NFUFRDT05OCQkzMAogCi0jZGVmaW5lIFNPX1BFRVJTRUMgICAgICAgICAgICAgMzEKKyNkZWZpbmUgU09fUEVFUlNFQwkJMzEKIAotI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc29ja2lvcy5oCnNpbWlsYXJpdHkgaW5kZXggODIlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXBwYzY0L3NvY2tpb3MuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tcG93ZXJwYy9zb2NraW9zLmgKaW5kZXggNmJkMWEyMi4uNTkwMDc4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc29ja2lvcy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1BQQzY0X1NPQ0tJT1NfSAotI2RlZmluZSBfQVNNX1BQQzY0X1NPQ0tJT1NfSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfU09DS0lPU19ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19TT0NLSU9TX0gKIAogLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTE2LDQgKzE2LDQgQEAKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKICNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLwogCi0jZW5kaWYgLyogX0FTTV9QUEM2NF9TT0NLSU9TX0ggKi8KKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfU09DS0lPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N0cmluZy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zdHJpbmcuaAppbmRleCAyMjU1NzU5Li44NjA2YTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N0cmluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3RyaW5nLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9QUENfU1RSSU5HX0hfCi0jZGVmaW5lIF9QUENfU1RSSU5HX0hfCisjaWZuZGVmIF9BU01fUE9XRVJQQ19TVFJJTkdfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfU1RSSU5HX0gKIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtMjksNCArMjksNCBAQAogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCi0jZW5kaWYKKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfU1RSSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1iaXRzLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tcHBjNjQvdGVybWJpdHMuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tcG93ZXJwYy90ZXJtYml0cy5oCmluZGV4IGQxYTJiZWUuLmViZjYwNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90ZXJtYml0cy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfUFBDNjRfVEVSTUJJVFNfSAotI2RlZmluZSBfUFBDNjRfVEVSTUJJVFNfSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfVEVSTUJJVFNfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfVEVSTUJJVFNfSAogCiAvKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtOCw4ICs4LDYgQEAKICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X3R5cGVzLmg+Ci0KIHR5cGVkZWYgdW5zaWduZWQgY2hhcgljY190OwogdHlwZWRlZiB1bnNpZ25lZCBpbnQJc3BlZWRfdDsKIHR5cGVkZWYgdW5zaWduZWQgaW50CXRjZmxhZ190OwpAQCAtMTkwLDQgKzE4OCw0IEBACiAjZGVmaW5lCVRDU0FEUkFJTgkxCiAjZGVmaW5lCVRDU0FGTFVTSAkyCiAKLSNlbmRpZiAvKiBfUFBDNjRfVEVSTUJJVFNfSCAqLworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19URVJNQklUU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1pb3MuaApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1wcGM2NC90ZXJtaW9zLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXBvd2VycGMvdGVybWlvcy5oCmluZGV4IDAyYzNkMjguLmM1YjhlNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1pb3MuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX1BQQzY0X1RFUk1JT1NfSAotI2RlZmluZSBfUFBDNjRfVEVSTUlPU19ICisjaWZuZGVmIF9BU01fUE9XRVJQQ19URVJNSU9TX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1RFUk1JT1NfSAogCiAvKgogICogTGliZXJhbGx5IGFkYXB0ZWQgZnJvbSBhbHBoYS90ZXJtaW9zLmguICBJbiBwYXJ0aWN1bGFyLCB0aGUgY19jY1tdCkBAIC04Nyw2ICs4Nyw3IEBACiAjZGVmaW5lIE5fU01TQkxPQ0sJMTIJLyogU01TIGJsb2NrIG1vZGUgLSBmb3IgdGFsa2luZyB0byBHU00gZGF0YSBjYXJkcyBhYm91dCBTTVMgbWVzc2FnZXMgKi8KICNkZWZpbmUgTl9IRExDCQkxMwkvKiBzeW5jaHJvbm91cyBIRExDICovCiAjZGVmaW5lIE5fU1lOQ19QUFAJMTQKKyNkZWZpbmUgTl9IQ0kJCTE1ICAvKiBCbHVldG9vdGggSENJIFVBUlQgKi8KIAogI2lmZGVmIF9fS0VSTkVMX18KIC8qICAgICAgICAgICAgICAgICAgIF5DICBeXCBkZWwgIF5VICBeRCAgIDEgICAwICAgMCAgIDAgICAwICBeVyAgXlIgIF5aICBeUSAgXlMgIF5WICBeVSAgKi8KQEAgLTIzMiw0ICsyMzMsNCBAQAogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCi0jZW5kaWYJLyogX1BQQzY0X1RFUk1JT1NfSCAqLworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19URVJNSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZXguaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM1YjMxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1leC5oCkBAIC0wLDAgKzEsNDkgQEAKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1RJTUVYX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1RJTUVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoKKyAqIFBvd2VyUEMgYXJjaGl0ZWN0dXJlIHRpbWV4IHNwZWNpZmljYXRpb25zCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorCisjZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkxMTkzMTgwIC8qIFVuZGVybHlpbmcgSFogKi8KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGN5Y2xlc190OworCitzdGF0aWMgaW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXModm9pZCkKK3sKKwljeWNsZXNfdCByZXQ7CisKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibWZ0YiAlMCIgOiAiPXIiIChyZXQpIDogKTsKKworI2Vsc2UKKwkvKgorCSAqIEZvciB0aGUgImN5Y2xlIiBjb3VudGVyIHdlIHVzZSB0aGUgdGltZWJhc2UgbG93ZXIgaGFsZi4KKwkgKiBDdXJyZW50bHkgb25seSB1c2VkIG9uIFNNUC4KKwkgKi8KKworCXJldCA9IDA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIjk4OgltZnRiICUwXG4iCisJCSI5OTpcbiIKKwkJIi5zZWN0aW9uIF9fZnRyX2ZpeHVwLFwiYVwiXG4iCisJCSIJLmxvbmcgJTFcbiIKKwkJIgkubG9uZyAwXG4iCisJCSIJLmxvbmcgOThiXG4iCisJCSIJLmxvbmcgOTliXG4iCisJCSIucHJldmlvdXMiCisJCTogIj1yIiAocmV0KSA6ICJpIiAoQ1BVX0ZUUl82MDEpKTsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfVElNRVhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdG9wb2xvZ3kuaApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1wcGM2NC90b3BvbG9neS5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1wb3dlcnBjL3RvcG9sb2d5LmgKaW5kZXggMWU5YjE5MC4uMjUxMmUzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RvcG9sb2d5LmgKQEAgLTEsMTEgKzEsMTIgQEAKLSNpZm5kZWYgX0FTTV9QUEM2NF9UT1BPTE9HWV9ICi0jZGVmaW5lIF9BU01fUFBDNjRfVE9QT0xPR1lfSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfVE9QT0xPR1lfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfVE9QT0xPR1lfSAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNtL21tem9uZS5oPgogCiAjaWZkZWYgQ09ORklHX05VTUEKIAorI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KKwogc3RhdGljIGlubGluZSBpbnQgY3B1X3RvX25vZGUoaW50IGNwdSkKIHsKIAlpbnQgbm9kZTsKQEAgLTY2LDQgKzY3LDQgQEAKIAogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAKLSNlbmRpZiAvKiBfQVNNX1BQQzY0X1RPUE9MT0dZX0ggKi8KKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfVE9QT0xPR1lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy91bmFsaWduZWQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdW5hbGlnbmVkLmgKaW5kZXggNDU1MjBkOS4uNmM5NWRmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy91bmFsaWduZWQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3VuYWxpZ25lZC5oCkBAIC0xLDYgKzEsNyBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfVU5BTElHTkVEX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1VOQUxJR05FRF9ICisKICNpZmRlZiBfX0tFUk5FTF9fCi0jaWZuZGVmIF9fUFBDX1VOQUxJR05FRF9ICi0jZGVmaW5lIF9fUFBDX1VOQUxJR05FRF9ICiAKIC8qCiAgKiBUaGUgUG93ZXJQQyBjYW4gZG8gdW5hbGlnbmVkIGFjY2Vzc2VzIGl0c2VsZiBpbiBiaWcgZW5kaWFuIG1vZGUuCkBAIC0xNCw1ICsxNSw1IEBACiAKICNkZWZpbmUgcHV0X3VuYWxpZ25lZCh2YWwsIHB0cikgKCh2b2lkKSggKihwdHIpID0gKHZhbCkgKSkKIAotI2VuZGlmCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfVU5BTElHTkVEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy91c2VyLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3VzZXIuaApzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1wcGMvdXNlci5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1wb3dlcnBjL3VzZXIuaAppbmRleCBkNjYyYjIxLi5lNTlhZGU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvdXNlci5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdXNlci5oCkBAIC0xLDEzICsxLDE0IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19VU0VSX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1VTRVJfSAorCiAjaWZkZWYgX19LRVJORUxfXwotI2lmbmRlZiBfUFBDX1VTRVJfSAotI2RlZmluZSBfUFBDX1VTRVJfSAogCi0vKiBBZGFwdGVkIGZyb20gPGFzbS1hbHBoYS91c2VyLmg+ICovCi0KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogLyoKKyAqIEFkYXB0ZWQgZnJvbSA8YXNtLWFscGhhL3VzZXIuaD4KKyAqCiAgKiBDb3JlIGZpbGUgZm9ybWF0OiBUaGUgY29yZSBmaWxlIGlzIHdyaXR0ZW4gaW4gc3VjaCBhIHdheSB0aGF0IGdkYgogICogY2FuIHVuZGVyc3RhbmQgaXQgYW5kIHByb3ZpZGUgdXNlZnVsIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyICh1bmRlcgogICogbGludXggd2UgdXNlIHRoZSBgdHJhZC1jb3JlJyBiZmQsIE5PVCB0aGUgb3NmLWNvcmUpLiAgVGhlIGZpbGUgY29udGVudHMKQEAgLTUwLDUgKzUxLDUgQEAKICNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIJKHUuc3RhcnRfZGF0YSkKICNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUgkodS5zdGFydF9zdGFjayArIHUudV9zc2l6ZSAqIE5CUEcpCiAKLSNlbmRpZiAvKiBfUFBDX1VTRVJfSCAqLwotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tcHBjL2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MjM1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wcGMvYXV4dmVjLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfX1BQQ19BVVhWRUNfSAorI2RlZmluZSBfX1BQQ19BVVhWRUNfSAorCisvKgorICogV2UgbmVlZCB0byBwdXQgaW4gc29tZSBleHRyYSBhdXggdGFibGUgZW50cmllcyB0byB0ZWxsIGdsaWJjIHdoYXQKKyAqIHRoZSBjYWNoZSBibG9jayBzaXplIGlzLCBzbyBpdCBjYW4gdXNlIHRoZSBkY2J6IGluc3RydWN0aW9uIHNhZmVseS4KKyAqLworI2RlZmluZSBBVF9EQ0FDSEVCU0laRQkJMTkKKyNkZWZpbmUgQVRfSUNBQ0hFQlNJWkUJCTIwCisjZGVmaW5lIEFUX1VDQUNIRUJTSVpFCQkyMQorLyogQSBzcGVjaWFsIGlnbm9yZWQgdHlwZSB2YWx1ZSBmb3IgUFBDLCBmb3IgZ2xpYmMgY29tcGF0aWJpbGl0eS4gICovCisjZGVmaW5lIEFUX0lHTk9SRVBQQwkJMjIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvYnVncy5oIGIvaW5jbHVkZS9hc20tcHBjL2J1Z3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjZTFlMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvYnVncy5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5ICdpbml0L21haW4uYycKLSAqLwotCi1leHRlcm4gdm9pZAotY2hlY2tfYnVncyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tcHBjL2RtYS1tYXBwaW5nLmgKaW5kZXggNmY3NGY1OS4uOTJiOGVlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2RtYS1tYXBwaW5nLmgKQEAgLTYwLDcgKzYwLDggQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkICpkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCQkgICAgICAgZG1hX2FkZHJfdCAqIGRtYV9oYW5kbGUsIGludCBnZnApCisJCQkJICAgICAgIGRtYV9hZGRyX3QgKiBkbWFfaGFuZGxlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogI2lmZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKIAlyZXR1cm4gX19kbWFfYWxsb2NfY29oZXJlbnQoc2l6ZSwgZG1hX2hhbmRsZSwgZ2ZwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9lbGYuaCBiL2luY2x1ZGUvYXNtLXBwYy9lbGYuaAppbmRleCAyYzA1Njk2Li5jMjVjYzM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2VsZi5oCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KKyNpbmNsdWRlIDxhc20vYXV4dmVjLmg+CiAKIC8qIFBvd2VyUEMgcmVsb2NhdGlvbnMgZGVmaW5lZCBieSB0aGUgQUJJcyAqLwogI2RlZmluZSBSX1BQQ19OT05FCQkwCkBAIC0xMjIsMTYgKzEyMyw2IEBACiAKICNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikgc2V0X3BlcnNvbmFsaXR5KChpYmNzMik/UEVSX1NWUjQ6UEVSX0xJTlVYKQogCi0vKgotICogV2UgbmVlZCB0byBwdXQgaW4gc29tZSBleHRyYSBhdXggdGFibGUgZW50cmllcyB0byB0ZWxsIGdsaWJjIHdoYXQKLSAqIHRoZSBjYWNoZSBibG9jayBzaXplIGlzLCBzbyBpdCBjYW4gdXNlIHRoZSBkY2J6IGluc3RydWN0aW9uIHNhZmVseS4KLSAqLwotI2RlZmluZSBBVF9EQ0FDSEVCU0laRQkJMTkKLSNkZWZpbmUgQVRfSUNBQ0hFQlNJWkUJCTIwCi0jZGVmaW5lIEFUX1VDQUNIRUJTSVpFCQkyMQotLyogQSBzcGVjaWFsIGlnbm9yZWQgdHlwZSB2YWx1ZSBmb3IgUFBDLCBmb3IgZ2xpYmMgY29tcGF0aWJpbGl0eS4gICovCi0jZGVmaW5lIEFUX0lHTk9SRVBQQwkJMjIKLQogZXh0ZXJuIGludCBkY2FjaGVfYnNpemU7CiBleHRlcm4gaW50IGljYWNoZV9ic2l6ZTsKIGV4dGVybiBpbnQgdWNhY2hlX2JzaXplOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1wcGMvZmNudGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyOGU0MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvZmNudGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSNpZm5kZWYgX1BQQ19GQ05UTF9ICi0jZGVmaW5lIF9QUENfRkNOVExfSAotCi0vKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCi0gICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgT19BQ0NNT0RFCSAgIDAwMDMKLSNkZWZpbmUgT19SRE9OTFkJICAgICAwMAotI2RlZmluZSBPX1dST05MWQkgICAgIDAxCi0jZGVmaW5lIE9fUkRXUgkJICAgICAwMgotI2RlZmluZSBPX0NSRUFUCQkgICAwMTAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0VYQ0wJCSAgIDAyMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fTk9DVFRZCSAgIDA0MDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fVFJVTkMJCSAgMDEwMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fQVBQRU5ECSAgMDIwMDAKLSNkZWZpbmUgT19OT05CTE9DSwkgIDA0MDAwCi0jZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKLSNkZWZpbmUgT19TWU5DCQkgMDEwMDAwCi0jZGVmaW5lIEZBU1lOQwkJIDAyMDAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIE9fRElSRUNUT1JZICAgICAgMDQwMDAwCS8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgT19OT0ZPTExPVyAgICAgIDAxMDAwMDAJLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFICAgICAwMjAwMDAwCi0jZGVmaW5lIE9fRElSRUNUCTA0MDAwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCi0KLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNwotCi0jZGVmaW5lIEZfU0VUT1dOCTgJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVE9XTgk5CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLSNkZWZpbmUgRl9HRVRMSzY0CTEyCS8qICB1c2luZyAnc3RydWN0IGZsb2NrNjQnICovCi0jZGVmaW5lIEZfU0VUTEs2NAkxMwotI2RlZmluZSBGX1NFVExLVzY0CTE0Ci0KLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQotLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KLSNkZWZpbmUgRl9SRExDSwkJMAotI2RlZmluZSBGX1dSTENLCQkxCi0jZGVmaW5lIEZfVU5MQ0sJCTIKLQotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLwotCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgRl9QT1NJWAkJMQotI2RlZmluZSBGX0ZMT0NLCQkyCi0jZGVmaW5lIEZfQlJPS0VOCTQJLyogYnJva2VuIGZsb2NrKCkgZW11bGF0aW9uICovCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi1zdHJ1Y3QgZmxvY2sgewotCXNob3J0IGxfdHlwZTsKLQlzaG9ydCBsX3doZW5jZTsKLQlvZmZfdCBsX3N0YXJ0OwotCW9mZl90IGxfbGVuOwotCXBpZF90IGxfcGlkOwotfTsKLQotc3RydWN0IGZsb2NrNjQgewotCXNob3J0ICBsX3R5cGU7Ci0Jc2hvcnQgIGxfd2hlbmNlOwotCWxvZmZfdCBsX3N0YXJ0OwotCWxvZmZfdCBsX2xlbjsKLQlwaWRfdCAgbF9waWQ7Ci19OwotCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9mdXRleC5oIGIvaW5jbHVkZS9hc20tcHBjL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2libTR4eC5oIGIvaW5jbHVkZS9hc20tcHBjL2libTR4eC5oCmluZGV4IGU4MDdiZTkuLmU5OTIzNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9pYm00eHguaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvaWJtNHh4LmgKQEAgLTE5LDEwICsxOSw2IEBACiAKICNpZmRlZiBDT05GSUdfNDB4CiAKLSNpZiBkZWZpbmVkKENPTkZJR19BU0gpCi0jaW5jbHVkZSA8cGxhdGZvcm1zLzR4eC9hc2guaD4KLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfQlVCSU5HQSkKICNpbmNsdWRlIDxwbGF0Zm9ybXMvNHh4L2J1YmluZ2EuaD4KICNlbmRpZgpAQCAtMzUsMTQgKzMxLDYgQEAKICNpbmNsdWRlIDxwbGF0Zm9ybXMvNHh4L2VwNDA1Lmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX09BSykKLSNpbmNsdWRlIDxwbGF0Zm9ybXMvNHh4L29hay5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19SRURXT09EXzQpCi0jaW5jbHVkZSA8cGxhdGZvcm1zLzR4eC9yZWR3b29kLmg+Ci0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX1JFRFdPT0RfNSkKICNpbmNsdWRlIDxwbGF0Zm9ybXMvNHh4L3JlZHdvb2Q1Lmg+CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9pYm1fb2NwLmggYi9pbmNsdWRlL2FzbS1wcGMvaWJtX29jcC5oCmluZGV4IDNmN2I1NjYuLjZmMTBhMjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9pYm1fb2NwLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2libV9vY3AuaApAQCAtNjcsNiArNjcsNyBAQAogCWludAlwaHlfbW9kZTsJLyogUEhZIHR5cGUgb3IgY29uZmlndXJhYmxlIG1vZGUgKi8KIAl1OAltYWNfYWRkcls2XTsJLyogRU1BQyBtYWMgYWRkcmVzcyAqLwogCXUzMglwaHlfbWFwOwkvKiBFTUFDIHBoeSBtYXAgKi8KKwl1MzIJcGh5X2ZlYXRfZXhjOwkvKiBFeGNsdWRlZCBQSFkgZmVhdHVyZXMgKi8KIH07CiAKIC8qIFN5c2ZzIHN1cHBvcnQgKi8KQEAgLTgzLDYgKzg0LDcgQEAKIE9DUF9TWVNGU19BRERUTChzdHJ1Y3Qgb2NwX2Z1bmNfZW1hY19kYXRhLCAiJWRcbiIsIGVtYWMsIHRhaF9pZHgpCVwKIE9DUF9TWVNGU19BRERUTChzdHJ1Y3Qgb2NwX2Z1bmNfZW1hY19kYXRhLCAiJWRcbiIsIGVtYWMsIHBoeV9tb2RlKQlcCiBPQ1BfU1lTRlNfQUREVEwoc3RydWN0IG9jcF9mdW5jX2VtYWNfZGF0YSwgIjB4JTA4eFxuIiwgZW1hYywgcGh5X21hcCkJXAorT0NQX1NZU0ZTX0FERFRMKHN0cnVjdCBvY3BfZnVuY19lbWFjX2RhdGEsICIweCUwOHhcbiIsIGVtYWMsIHBoeV9mZWF0X2V4YylcCiAJCQkJCQkJCQlcCiB2b2lkIG9jcF9zaG93X2VtYWNfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYpCQkJCVwKIHsJCQkJCQkJCQlcCkBAIC05OCw4ICsxMDAsMjIgQEAKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZW1hY190YWhfaWR4KTsJCVwKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZW1hY19waHlfbW9kZSk7CQlcCiAJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2VtYWNfcGh5X21hcCk7CQlcCisJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2VtYWNfcGh5X2ZlYXRfZXhjKTsJCVwKIH0KIAorLyoKKyAqIFBIWSBtb2RlIHNldHRpbmdzIChFTUFDIDwtPiBaTUlJL1JHTUlJIGJyaWRnZSA8LT4gUEhZKQorICovCisjZGVmaW5lIFBIWV9NT0RFX05BCTAKKyNkZWZpbmUgUEhZX01PREVfTUlJCTEKKyNkZWZpbmUgUEhZX01PREVfUk1JSQkyCisjZGVmaW5lIFBIWV9NT0RFX1NNSUkJMworI2RlZmluZSBQSFlfTU9ERV9SR01JSQk0CisjZGVmaW5lIFBIWV9NT0RFX1RCSQk1CisjZGVmaW5lIFBIWV9NT0RFX0dNSUkJNgorI2RlZmluZSBQSFlfTU9ERV9SVEJJCTcKKyNkZWZpbmUgUEhZX01PREVfU0dNSUkJOAorCiAjaWZkZWYgQ09ORklHXzQweAogLyoKICAqIEhlbHBlciBmdW5jdGlvbiB0byBjb3B5IE1BQyBhZGRyZXNzZXMgZnJvbSB0aGUgYmRfdCB0byBPQ1AgRU1BQwpAQCAtMTMzLDYgKzE0OSw3IEBACiAJaW50CXR4ZGVfaXJxOwkvKiBUWCBEZXNjcmlwdG9yIEVycm9yIElSUSAqLwogCWludAlyeGRlX2lycTsJLyogUlggRGVzY3JpcHRvciBFcnJvciBJUlEgKi8KIAlpbnQJc2Vycl9pcnE7CS8qIE1BTCBTeXN0ZW0gRXJyb3IgSVJRICAgICovCisJaW50CWRjcl9iYXNlOwkvKiBNQUx4X0NGRyBEQ1IgbnVtYmVyICAgKi8KIH07CiAKICNkZWZpbmUgT0NQX1NZU0ZTX01BTF9EQVRBKCkJCQkJCQlcCkBAIC0xNDMsNiArMTYwLDcgQEAKIE9DUF9TWVNGU19BRERUTChzdHJ1Y3Qgb2NwX2Z1bmNfbWFsX2RhdGEsICIlZFxuIiwgbWFsLCB0eGRlX2lycSkJXAogT0NQX1NZU0ZTX0FERFRMKHN0cnVjdCBvY3BfZnVuY19tYWxfZGF0YSwgIiVkXG4iLCBtYWwsIHJ4ZGVfaXJxKQlcCiBPQ1BfU1lTRlNfQUREVEwoc3RydWN0IG9jcF9mdW5jX21hbF9kYXRhLCAiJWRcbiIsIG1hbCwgc2Vycl9pcnEpCVwKK09DUF9TWVNGU19BRERUTChzdHJ1Y3Qgb2NwX2Z1bmNfbWFsX2RhdGEsICIlZFxuIiwgbWFsLCBkY3JfYmFzZSkJXAogCQkJCQkJCQkJXAogdm9pZCBvY3Bfc2hvd19tYWxfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYpCQkJCVwKIHsJCQkJCQkJCQlcCkBAIC0xNTMsNiArMTcxLDcgQEAKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbWFsX3R4ZGVfaXJxKTsJCVwKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbWFsX3J4ZGVfaXJxKTsJCVwKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbWFsX3NlcnJfaXJxKTsJCVwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbWFsX2Rjcl9iYXNlKTsJCVwKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9pcnEuaCBiL2luY2x1ZGUvYXNtLXBwYy9pcnEuaAppbmRleCBhOWIzMzMyLi41NTc1MjQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2lycS5oCkBAIC0xOSw2ICsxOSwxMSBAQAogI2RlZmluZSBJUlFfUE9MQVJJVFlfUE9TSVRJVkUJMHgyCS8qIGhpZ2ggbGV2ZWwgb3IgbG93LT5oaWdoIGVkZ2UgKi8KICNkZWZpbmUgSVJRX1BPTEFSSVRZX05FR0FUSVZFCTB4MAkvKiBsb3cgbGV2ZWwgb3IgaGlnaC0+bG93IGVkZ2UgKi8KIAorLyoKKyAqIElSUSBsaW5lIHN0YXR1cyBtYWNybyBJUlFfUEVSX0NQVSBpcyB1c2VkCisgKi8KKyNkZWZpbmUgQVJDSF9IQVNfSVJRX1BFUl9DUFUKKwogI2lmIGRlZmluZWQoQ09ORklHXzQweCkKICNpbmNsdWRlIDxhc20vaWJtNHh4Lmg+CiAKQEAgLTMzNyw2ICszNDIsNyBAQAogI2RlZmluZQlTSVVfSU5UX0lETUEzCQkoKHVpbnQpMHgwOCArIENQTV9JUlFfT0ZGU0VUKQogI2RlZmluZQlTSVVfSU5UX0lETUE0CQkoKHVpbnQpMHgwOSArIENQTV9JUlFfT0ZGU0VUKQogI2RlZmluZQlTSVVfSU5UX1NETUEJCSgodWludCkweDBhICsgQ1BNX0lSUV9PRkZTRVQpCisjZGVmaW5lCVNJVV9JTlRfVVNCCQkoKHVpbnQpMHgwYiArIENQTV9JUlFfT0ZGU0VUKQogI2RlZmluZQlTSVVfSU5UX1RJTUVSMQkJKCh1aW50KTB4MGMgKyBDUE1fSVJRX09GRlNFVCkKICNkZWZpbmUJU0lVX0lOVF9USU1FUjIJCSgodWludCkweDBkICsgQ1BNX0lSUV9PRkZTRVQpCiAjZGVmaW5lCVNJVV9JTlRfVElNRVIzCQkoKHVpbnQpMHgwZSArIENQTV9JUlFfT0ZGU0VUKQpAQCAtMzk4LDkgKzQwNCw1IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBwcGNfbG9zdF9pbnRlcnJ1cHRzW05SX01BU0tfV09SRFNdOwogZXh0ZXJuIGF0b21pY190IHBwY19uX2xvc3RfaW50ZXJydXB0czsKIAotc3RydWN0IGlycWFjdGlvbjsKLXN0cnVjdCBwdF9yZWdzOwotaW50IGhhbmRsZV9JUlFfZXZlbnQodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgaXJxYWN0aW9uICopOwotCiAjZW5kaWYgLyogX0FTTV9JUlFfSCAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9rbWFwX3R5cGVzLmggYi9pbmNsdWRlL2FzbS1wcGMva21hcF90eXBlcy5oCmluZGV4IDI1ODlmMTgyLi42ZDZmYzc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMva21hcF90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9rbWFwX3R5cGVzLmgKQEAgLTE3LDYgKzE3LDcgQEAKIAlLTV9TT0ZUSVJRMCwKIAlLTV9TT0ZUSVJRMSwKIAlLTV9QUENfU1lOQ19QQUdFLAorCUtNX1BQQ19TWU5DX0lDQUNIRSwKIAlLTV9UWVBFX05SCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvbWMxNDY4MThydGMuaCBiL2luY2x1ZGUvYXNtLXBwYy9tYzE0NjgxOHJ0Yy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjcwMThiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXBwYy9tYzE0NjgxOHJ0Yy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIE1hY2hpbmUgZGVwZW5kZW50IGFjY2VzcyBmdW5jdGlvbnMgZm9yIFJUQyByZWdpc3RlcnMuCi0gKi8KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaWZuZGVmIF9fQVNNX1BQQ19NQzE0NjgxOFJUQ19ICi0jZGVmaW5lIF9fQVNNX1BQQ19NQzE0NjgxOFJUQ19ICi0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2lmbmRlZiBSVENfUE9SVAotI2RlZmluZSBSVENfUE9SVCh4KQkoMHg3MCArICh4KSkKLSNkZWZpbmUgUlRDX0FMV0FZU19CQ0QJMQkvKiBSVEMgb3BlcmF0ZXMgaW4gYmluYXJ5IG1vZGUgKi8KLSNlbmRpZgotCi0vKgotICogVGhlIHlldCBzdXBwb3J0ZWQgbWFjaGluZXMgYWxsIGFjY2VzcyB0aGUgUlRDIGluZGV4IHJlZ2lzdGVyIHZpYQotICogYW4gSVNBIHBvcnQgYWNjZXNzIGJ1dCB0aGUgd2F5IHRvIGFjY2VzcyB0aGUgZGF0ZSByZWdpc3RlciBkaWZmZXJzIC4uLgotICovCi0jZGVmaW5lIENNT1NfUkVBRChhZGRyKSAoeyBcCi1vdXRiX3AoKGFkZHIpLFJUQ19QT1JUKDApKTsgXAotaW5iX3AoUlRDX1BPUlQoMSkpOyBcCi19KQotI2RlZmluZSBDTU9TX1dSSVRFKHZhbCwgYWRkcikgKHsgXAotb3V0Yl9wKChhZGRyKSxSVENfUE9SVCgwKSk7IFwKLW91dGJfcCgodmFsKSxSVENfUE9SVCgxKSk7IFwKLX0pCi0KLSNkZWZpbmUgUlRDX0lSUSA4Ci0KLSNlbmRpZiAvKiBfX0FTTV9QUENfTUMxNDY4MThSVENfSCAqLwotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9tbWFuLmggYi9pbmNsdWRlL2FzbS1wcGMvbW1hbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQxOWZkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXBwYy9tbWFuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jaWZuZGVmIF9fUFBDX01NQU5fSF9fCi0jZGVmaW5lIF9fUFBDX01NQU5fSF9fCi0KLSNkZWZpbmUgUFJPVF9SRUFECTB4MQkJLyogcGFnZSBjYW4gYmUgcmVhZCAqLwotI2RlZmluZSBQUk9UX1dSSVRFCTB4MgkJLyogcGFnZSBjYW4gYmUgd3JpdHRlbiAqLwotI2RlZmluZSBQUk9UX0VYRUMJMHg0CQkvKiBwYWdlIGNhbiBiZSBleGVjdXRlZCAqLwotI2RlZmluZSBQUk9UX1NFTQkweDgJCS8qIHBhZ2UgbWF5IGJlIHVzZWQgZm9yIGF0b21pYyBvcHMgKi8KLSNkZWZpbmUgUFJPVF9OT05FCTB4MAkJLyogcGFnZSBjYW4gbm90IGJlIGFjY2Vzc2VkICovCi0jZGVmaW5lIFBST1RfR1JPV1NET1dOCTB4MDEwMDAwMDAJLyogbXByb3RlY3QgZmxhZzogZXh0ZW5kIGNoYW5nZSB0byBzdGFydCBvZiBncm93c2Rvd24gdm1hICovCi0jZGVmaW5lIFBST1RfR1JPV1NVUAkweDAyMDAwMDAwCS8qIG1wcm90ZWN0IGZsYWc6IGV4dGVuZCBjaGFuZ2UgdG8gZW5kIG9mIGdyb3dzdXAgdm1hICovCi0KLSNkZWZpbmUgTUFQX1NIQVJFRAkweDAxCQkvKiBTaGFyZSBjaGFuZ2VzICovCi0jZGVmaW5lIE1BUF9QUklWQVRFCTB4MDIJCS8qIENoYW5nZXMgYXJlIHByaXZhdGUgKi8KLSNkZWZpbmUgTUFQX1RZUEUJMHgwZgkJLyogTWFzayBmb3IgdHlwZSBvZiBtYXBwaW5nICovCi0jZGVmaW5lIE1BUF9GSVhFRAkweDEwCQkvKiBJbnRlcnByZXQgYWRkciBleGFjdGx5ICovCi0jZGVmaW5lIE1BUF9BTk9OWU1PVVMJMHgyMAkJLyogZG9uJ3QgdXNlIGEgZmlsZSAqLwotI2RlZmluZSBNQVBfUkVOQU1FICAgICAgTUFQX0FOT05ZTU9VUyAgIC8qIEluIFN1bk9TIHRlcm1pbm9sb2d5ICovCi0jZGVmaW5lIE1BUF9OT1JFU0VSVkUgICAweDQwICAgICAgICAgICAgLyogZG9uJ3QgcmVzZXJ2ZSBzd2FwIHBhZ2VzICovCi0jZGVmaW5lIE1BUF9MT0NLRUQJMHg4MAotCi0jZGVmaW5lIE1BUF9HUk9XU0RPV04JMHgwMTAwCQkvKiBzdGFjay1saWtlIHNlZ21lbnQgKi8KLSNkZWZpbmUgTUFQX0RFTllXUklURQkweDA4MDAJCS8qIEVUWFRCU1kgKi8KLSNkZWZpbmUgTUFQX0VYRUNVVEFCTEUJMHgxMDAwCQkvKiBtYXJrIGl0IGFzIGFuIGV4ZWN1dGFibGUgKi8KLSNkZWZpbmUgTUFQX1BPUFVMQVRFCTB4ODAwMAkJLyogcG9wdWxhdGUgKHByZWZhdWx0KSBwYWdldGFibGVzICovCi0jZGVmaW5lIE1BUF9OT05CTE9DSwkweDEwMDAwCQkvKiBkbyBub3QgYmxvY2sgb24gSU8gKi8KLQotI2RlZmluZSBNU19BU1lOQwkxCQkvKiBzeW5jIG1lbW9yeSBhc3luY2hyb25vdXNseSAqLwotI2RlZmluZSBNU19JTlZBTElEQVRFCTIJCS8qIGludmFsaWRhdGUgdGhlIGNhY2hlcyAqLwotI2RlZmluZSBNU19TWU5DCQk0CQkvKiBzeW5jaHJvbm91cyBtZW1vcnkgc3luYyAqLwotCi0jZGVmaW5lIE1DTF9DVVJSRU5UICAgICAweDIwMDAgICAgICAgICAgLyogbG9jayBhbGwgY3VycmVudGx5IG1hcHBlZCBwYWdlcyAqLwotI2RlZmluZSBNQ0xfRlVUVVJFICAgICAgMHg0MDAwICAgICAgICAgIC8qIGxvY2sgYWxsIGFkZGl0aW9ucyB0byBhZGRyZXNzIHNwYWNlICovCi0KLSNkZWZpbmUgTUFEVl9OT1JNQUwJMHgwCQkvKiBkZWZhdWx0IHBhZ2UtaW4gYmVoYXZpb3IgKi8KLSNkZWZpbmUgTUFEVl9SQU5ET00JMHgxCQkvKiBwYWdlLWluIG1pbmltdW0gcmVxdWlyZWQgKi8KLSNkZWZpbmUgTUFEVl9TRVFVRU5USUFMCTB4MgkJLyogcmVhZC1haGVhZCBhZ2dyZXNzaXZlbHkgKi8KLSNkZWZpbmUgTUFEVl9XSUxMTkVFRAkweDMJCS8qIHByZS1mYXVsdCBwYWdlcyAqLwotI2RlZmluZSBNQURWX0RPTlRORUVECTB4NAkJLyogZGlzY2FyZCB0aGVzZSBwYWdlcyAqLwotCi0vKiBjb21wYXRpYmlsaXR5IGZsYWdzICovCi0jZGVmaW5lIE1BUF9BTk9OCU1BUF9BTk9OWU1PVVMKLSNkZWZpbmUgTUFQX0ZJTEUJMAotCi0jZW5kaWYgLyogX19QUENfTU1BTl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9tb2R1bGUuaCBiL2luY2x1ZGUvYXNtLXBwYy9tb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2MzQ5Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvbW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jaWZuZGVmIF9BU01fUFBDX01PRFVMRV9ICi0jZGVmaW5lIF9BU01fUFBDX01PRFVMRV9ICi0vKiBNb2R1bGUgc3R1ZmYgZm9yIFBQQy4gIChDKSAyMDAxIFJ1c3R5IFJ1c3NlbGwgKi8KLQotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxhc20vYnVnLmg+Ci0KLS8qIFRoYW5rcyB0byBQYXVsIE0gZm9yIGV4cGxhaW5pbmcgdGhpcy4KLQotICAgUFBDIGNhbiBvbmx5IGRvIHJlbCBqdW1wcyArPSAzMk1CLCBhbmQgb2Z0ZW4gdGhlIGtlcm5lbCBhbmQgb3RoZXIKLSAgIG1vZHVsZXMgYXJlIGZ1cnRodXIgYXdheSB0aGFuIHRoaXMuICBTbywgd2UganVtcCB0byBhIHRhYmxlIG9mCi0gICB0cmFtcG9saW5lcyBhdHRhY2hlZCB0byB0aGUgbW9kdWxlICh0aGUgUHJvY2VkdXJlIExpbmthZ2UgVGFibGUpCi0gICB3aGVuZXZlciB0aGF0IGhhcHBlbnMuCi0qLwotCi1zdHJ1Y3QgcHBjX3BsdF9lbnRyeQotewotCS8qIDE2IGJ5dGUganVtcCBpbnN0cnVjdGlvbiBzZXF1ZW5jZSAoNCBpbnN0cnVjdGlvbnMpICovCi0JdW5zaWduZWQgaW50IGp1bXBbNF07Ci19OwotCi1zdHJ1Y3QgbW9kX2FyY2hfc3BlY2lmaWMKLXsKLQkvKiBJbmRpY2VzIG9mIFBMVCBzZWN0aW9ucyB3aXRoaW4gbW9kdWxlLiAqLwotCXVuc2lnbmVkIGludCBjb3JlX3BsdF9zZWN0aW9uLCBpbml0X3BsdF9zZWN0aW9uOwotCi0JLyogTGlzdCBvZiBCVUcgYWRkcmVzc2VzLCBzb3VyY2UgbGluZSBudW1iZXJzIGFuZCBmaWxlbmFtZXMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGJ1Z19saXN0OwotCXN0cnVjdCBidWdfZW50cnkgKmJ1Z190YWJsZTsKLQl1bnNpZ25lZCBpbnQgbnVtX2J1Z3M7Ci19OwotCi1leHRlcm4gc3RydWN0IGJ1Z19lbnRyeSAqbW9kdWxlX2ZpbmRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkcik7Ci0KLSNkZWZpbmUgRWxmX1NoZHIgRWxmMzJfU2hkcgotI2RlZmluZSBFbGZfU3ltIEVsZjMyX1N5bQotI2RlZmluZSBFbGZfRWhkciBFbGYzMl9FaGRyCi0KLS8qIE1ha2UgZW1wdHkgc2VjdGlvbnMgZm9yIG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMgdG8gZXhwYW5kLiAqLwotI2lmZGVmIE1PRFVMRQotYXNtKCIuc2VjdGlvbiAucGx0LFwiYXhcIixAbm9iaXRzOyAuYWxpZ24gMzsgLnByZXZpb3VzIik7Ci1hc20oIi5zZWN0aW9uIC5pbml0LnBsdCxcImF4XCIsQG5vYml0czsgLmFsaWduIDM7IC5wcmV2aW91cyIpOwotI2VuZGlmCi0jZW5kaWYgLyogX0FTTV9QUENfTU9EVUxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9tcGM4MjYwLmggYi9pbmNsdWRlL2FzbS1wcGMvbXBjODI2MC5oCmluZGV4IDg5ZWI4YTIuLjk2OTRlY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9tcGM4MjYwLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL21wYzgyNjAuaApAQCAtNjcsNiArNjcsMjQgQEAKICNkZWZpbmUgSU9fVklSVF9BRERSCUlPX1BIWVNfQUREUgogI2VuZGlmCiAKK2VudW0gcHBjX3N5c19kZXZpY2VzIHsKKwlNUEM4Mnh4X0NQTV9GQ0MxLAorCU1QQzgyeHhfQ1BNX0ZDQzIsCisJTVBDODJ4eF9DUE1fRkNDMywKKwlNUEM4Mnh4X0NQTV9JMkMsCisJTVBDODJ4eF9DUE1fU0NDMSwKKwlNUEM4Mnh4X0NQTV9TQ0MyLAorCU1QQzgyeHhfQ1BNX1NDQzMsCisJTVBDODJ4eF9DUE1fU0NDNCwKKwlNUEM4Mnh4X0NQTV9TUEksCisJTVBDODJ4eF9DUE1fTUNDMSwKKwlNUEM4Mnh4X0NQTV9NQ0MyLAorCU1QQzgyeHhfQ1BNX1NNQzEsCisJTVBDODJ4eF9DUE1fU01DMiwKKwlNUEM4Mnh4X0NQTV9VU0IsCisJTVBDODJ4eF9TRUMxLAorfTsKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIC8qIFRoZSAicmVzaWR1YWwiIGRhdGEgYm9hcmQgaW5mb3JtYXRpb24gc3RydWN0dXJlIHRoZSBib290IGxvYWRlcgogICogaGFuZHMgdG8gdXMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvbXBjOHh4LmggYi9pbmNsdWRlL2FzbS1wcGMvbXBjOHh4LmgKaW5kZXggN2MzMWYyZC4uZGM4ZTU5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL21wYzh4eC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9tcGM4eHguaApAQCAtMzYsMTAgKzM2LDYgQEAKICNpbmNsdWRlIDxwbGF0Zm9ybXMvdHFtOHh4Lmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NQRDgyM1RTKQotI2luY2x1ZGUgPHBsYXRmb3Jtcy9zcGQ4eHguaD4KLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfSVZNUzgpIHx8IGRlZmluZWQoQ09ORklHX0lWTUwyNCkKICNpbmNsdWRlIDxwbGF0Zm9ybXMvaXZtczguaD4KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL212NjR4NjAuaCBiL2luY2x1ZGUvYXNtLXBwYy9tdjY0eDYwLmgKaW5kZXggY2MyNWI5Mi4uODM1OTMwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL212NjR4NjAuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvbXY2NHg2MC5oCkBAIC0yNzgsNiArMjc4LDEzIEBACiAjZGVmaW5lCW12NjR4NjBfc2V0X2JpdHMoYmgsIG9mZnMsIGJpdHMpIG12NjR4NjBfbW9kaWZ5KGJoLCBvZmZzLCB+MCwgYml0cykKICNkZWZpbmUJbXY2NHg2MF9jbHJfYml0cyhiaCwgb2ZmcywgYml0cykgbXY2NHg2MF9tb2RpZnkoYmgsIG9mZnMsIDAsIGJpdHMpCiAKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNGUykgJiYgIWRlZmluZWQoQ09ORklHX0dUNjQyNjApCisjZGVmaW5lCU1WNjRYWFhfREVWX05BTUUJIm12NjR4eHgiCisKK3N0cnVjdCBtdjY0eHh4X3BkYXRhIHsKKwl1MzIJaHNfcmVnX3ZhbGlkOworfTsKKyNlbmRpZgogCiAvKiBFeHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwogaW50IG12NjR4NjBfaW5pdChzdHJ1Y3QgbXY2NHg2MF9oYW5kbGUgKmJoLCBzdHJ1Y3QgbXY2NHg2MF9zZXR1cF9pbmZvICpzaSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvbXY2NHg2MF9kZWZzLmggYi9pbmNsdWRlL2FzbS1wcGMvbXY2NHg2MF9kZWZzLmgKaW5kZXggMmY0Mjg3NC4uZjhmN2YxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL212NjR4NjBfZGVmcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9tdjY0eDYwX2RlZnMuaApAQCAtMzMzLDcgKzMzMyw3IEBACiAvKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICoJU1JBTSBDb3Rucm9sbGVyIFJlZ2lzdGVycworICoJU1JBTSBDb250cm9sbGVyIFJlZ2lzdGVycwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCkBAIC0zNTIsNyArMzUyLDcgQEAKIC8qCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKglTRFJBTS9NRU0gQ290bnJvbGxlciBSZWdpc3RlcnMKKyAqCVNEUkFNL01FTSBDb250cm9sbGVyIFJlZ2lzdGVycwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCkBAIC0zNzUsNiArMzc1LDcgQEAKIC8qIFNEUkFNIENvbnRyb2wgUmVnaXN0ZXJzICovCiAjZGVmaW5lIE1WNjQzNjBfRF9VTklUX0NPTlRST0xfTE9XCQkweDE0MDQKICNkZWZpbmUgTVY2NDM2MF9EX1VOSVRfQ09OVFJPTF9ISUdICQkweDE0MjQKKyNkZWZpbmUgTVY2NDQ2MF9EX1VOSVRfTU1BU0sJCQkweDE0YjAKIAogLyogU0RSQU0gRXJyb3IgUmVwb3J0IFJlZ2lzdGVycyAoNjQzNjApICovCiAjZGVmaW5lCU1WNjQzNjBfU0RSQU1fRVJSX0RBVEFfTE8JCTB4MTQ0NApAQCAtMzg4LDcgKzM4OSw3IEBACiAvKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICoJRGV2aWNlL0JPT1QgQ290bnJvbGxlciBSZWdpc3RlcnMKKyAqCURldmljZS9CT09UIENvbnRyb2xsZXIgUmVnaXN0ZXJzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KQEAgLTY4MCw2ICs2ODEsOCBAQAogI2RlZmluZQlNVjY0eDYwX1BDSTFfU0xBVkVfUDJQX0lPX1JFTUFQCQkweDBkZWMKICNkZWZpbmUJTVY2NHg2MF9QQ0kxX1NMQVZFX0NQVV9SRU1BUAkJMHgwZGYwCiAKKyNkZWZpbmUJTVY2NDM2MF9QQ0lDRkdfQ1BDSV9IT1RTV0FQCQkweDY4CisKIC8qCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvcGNpLmggYi9pbmNsdWRlL2FzbS1wcGMvcGNpLmgKaW5kZXggYTgxMWU0NC4uOWRkMDZjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9wY2kuaApAQCAtMTA5LDYgKzEwOSwxOSBAQAogcGNpYmlvc19idXNfdG9fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMsCiAJCQlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbik7CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlc291cmNlICoKK3BjaWJpb3Nfc2VsZWN0X3Jvb3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCXN0cnVjdCByZXNvdXJjZSAqcm9vdCA9IE5VTEw7CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCXJvb3QgPSAmaW9wb3J0X3Jlc291cmNlOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCXJvb3QgPSAmaW9tZW1fcmVzb3VyY2U7CisKKwlyZXR1cm4gcm9vdDsKK30KKwogZXh0ZXJuIHZvaWQgcGNpYmlvc19hZGRfcGxhdGZvcm1fZW50cmllcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAogc3RydWN0IGZpbGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvcG1hY19mZWF0dXJlLmggYi9pbmNsdWRlL2FzbS1wcGMvcG1hY19mZWF0dXJlLmgKaW5kZXggOGJlYjE2Mi4uZTk2ODNiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3BtYWNfZmVhdHVyZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9wbWFjX2ZlYXR1cmUuaApAQCAtMzIsNiArMzIsNyBAQAogI2RlZmluZSBfX1BQQ19BU01fUE1BQ19GRUFUVVJFX0gKIAogI2luY2x1ZGUgPGFzbS9tYWNpby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAKIC8qCiAgKiBLbm93biBNYWMgbW90aGVyYm9hcmQgbW9kZWxzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvcHBjX3N5cy5oIGIvaW5jbHVkZS9hc20tcHBjL3BwY19zeXMuaAppbmRleCA4ZWE2MjQ1Li4wNDhmN2M4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvcHBjX3N5cy5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9wcGNfc3lzLmgKQEAgLTIxLDcgKzIxLDkgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfODN4eCkKKyNpZiBkZWZpbmVkKENPTkZJR184MjYwKQorI2luY2x1ZGUgPGFzbS9tcGM4MjYwLmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR184M3h4KQogI2luY2x1ZGUgPGFzbS9tcGM4M3h4Lmg+CiAjZWxpZiBkZWZpbmVkKENPTkZJR184NXh4KQogI2luY2x1ZGUgPGFzbS9tcGM4NXh4Lmg+CkBAIC01MCw2ICs1Miw3IEBACiAvKiBkZXRlcm1pbmUgd2hpY2ggc3BlY2lmaWMgU09DIHdlIGFyZSAqLwogZXh0ZXJuIHZvaWQgaWRlbnRpZnlfcHBjX3N5c19ieV9pZCh1MzIgaWQpIF9faW5pdDsKIGV4dGVybiB2b2lkIGlkZW50aWZ5X3BwY19zeXNfYnlfbmFtZShjaGFyICpuYW1lKSBfX2luaXQ7CitleHRlcm4gdm9pZCBpZGVudGlmeV9wcGNfc3lzX2J5X25hbWVfYW5kX2lkKGNoYXIgKm5hbWUsIHUzMiBpZCkgX19pbml0OwogCiAvKiBkZXNjcmliZXMgYWxsIGRldmljZXMgdGhhdCBtYXkgZXhpc3QgaW4gYSBnaXZlbiBmYW1pbHkgb2YgcHJvY2Vzc29ycyAqLwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHBjX3N5c19wbGF0Zm9ybV9kZXZpY2VzW107CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvcmVnLmggYi9pbmNsdWRlL2FzbS1wcGMvcmVnLmgKaW5kZXggODhiNDIyMi4uNzNjMzNlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3JlZy5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9yZWcuaApAQCAtMzY2LDEyICszNjYsNiBAQAogI2RlZmluZSBQVlJfU1RCMDNYWFgJMHg0MDMxMDAwMAogI2RlZmluZSBQVlJfTlA0MDVICTB4NDE0MTAwMDAKICNkZWZpbmUgUFZSX05QNDA1TAkweDQxNjEwMDAwCi0jZGVmaW5lIFBWUl80NDBHUF9SQgkweDQwMTIwNDQwCi0jZGVmaW5lIFBWUl80NDBHUF9SQzEJMHg0MDEyMDQ4MQotI2RlZmluZSBQVlJfNDQwR1BfUkMyCTB4NDAyMDA0ODEKLSNkZWZpbmUgUFZSXzQ0MEdYX1JBCTB4NTFiMjE4NTAKLSNkZWZpbmUgUFZSXzQ0MEdYX1JCCTB4NTFiMjE4NTEKLSNkZWZpbmUgUFZSXzQ0MEdYX1JDCTB4NTFiMjE4OTIKICNkZWZpbmUgUFZSXzYwMQkJMHgwMDAxMDAwMAogI2RlZmluZSBQVlJfNjAyCQkweDAwMDUwMDAwCiAjZGVmaW5lIFBWUl82MDMJCTB4MDAwMzAwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9zZW1idWYuaCBiL2luY2x1ZGUvYXNtLXBwYy9zZW1idWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzZjY4Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvc2VtYnVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jaWZuZGVmIF9QUENfU0VNQlVGX0gKLSNkZWZpbmUgX1BQQ19TRU1CVUZfSAotCi0vKgotICogVGhlIHNlbWlkNjRfZHMgc3RydWN0dXJlIGZvciBQUEMgYXJjaGl0ZWN0dXJlLgotICovCi0KLXN0cnVjdCBzZW1pZDY0X2RzIHsKLQlzdHJ1Y3QgaXBjNjRfcGVybSBzZW1fcGVybTsJCS8qIHBlcm1pc3Npb25zIC4uIHNlZSBpcGMuaCAqLwotCXVuc2lnbmVkIGludAlfX3VudXNlZDE7Ci0JX19rZXJuZWxfdGltZV90CXNlbV9vdGltZTsJCS8qIGxhc3Qgc2Vtb3AgdGltZSAqLwotCXVuc2lnbmVkIGludAlfX3VudXNlZDI7Ci0JX19rZXJuZWxfdGltZV90CXNlbV9jdGltZTsJCS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KLQl1bnNpZ25lZCBsb25nCXNlbV9uc2VtczsJCS8qIG5vLiBvZiBzZW1hcGhvcmVzIGluIGFycmF5ICovCi0JdW5zaWduZWQgbG9uZwlfX3VudXNlZDM7Ci0JdW5zaWduZWQgbG9uZwlfX3VudXNlZDQ7Ci19OwotCi0jZW5kaWYgLyogX1BQQ19TRU1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3NlcmlhbC5oIGIvaW5jbHVkZS9hc20tcHBjL3NlcmlhbC5oCmluZGV4IDZkNDc0MzguLjQ4NWE5MjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvc2VyaWFsLmgKQEAgLTE4LDggKzE4LDYgQEAKICNpbmNsdWRlIDxwbGF0Zm9ybXMvcG93ZXJwbWMyNTAuaD4KICNlbGlmIGRlZmluZWQoQ09ORklHX0xPUEVDKQogI2luY2x1ZGUgPHBsYXRmb3Jtcy9sb3BlYy5oPgotI2VsaWYgZGVmaW5lZChDT05GSUdfTUNQTjc2NSkKLSNpbmNsdWRlIDxwbGF0Zm9ybXMvbWNwbjc2NS5oPgogI2VsaWYgZGVmaW5lZChDT05GSUdfTVZNRTUxMDApCiAjaW5jbHVkZSA8cGxhdGZvcm1zL212bWU1MTAwLmg+CiAjZWxpZiBkZWZpbmVkKENPTkZJR19QQUw0KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3NldHVwLmggYi9pbmNsdWRlL2FzbS1wcGMvc2V0dXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkMTllZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvc2V0dXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNpZmRlZiBfX0tFUk5FTF9fCi0jaWZuZGVmIF9QUENfU0VUVVBfSAotI2RlZmluZSBfUFBDX1NFVFVQX0gKLQotI2RlZmluZSBtNjhrX251bV9tZW1vcnkgbnVtX21lbW9yeQotI2RlZmluZSBtNjhrX21lbW9yeSBtZW1vcnkKLQotI2luY2x1ZGUgPGFzbS1tNjhrL3NldHVwLmg+Ci0vKiBXZSBoYXZlIGEgYmlnZ2VyIGNvbW1hbmQgbGluZSBidWZmZXIuICovCi0jdW5kZWYgQ09NTUFORF9MSU5FX1NJWkUKLSNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUJNTEyCi0KLSNlbmRpZiAvKiBfUFBDX1NFVFVQX0ggKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvc2htYnVmLmggYi9pbmNsdWRlL2FzbS1wcGMvc2htYnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYzBiZDMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3NobWJ1Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotI2lmbmRlZiBfUFBDX1NITUJVRl9ICi0jZGVmaW5lIF9QUENfU0hNQlVGX0gKLQotLyoKLSAqIFRoZSBzaG1pZDY0X2RzIHN0cnVjdHVyZSBmb3IgUFBDIGFyY2hpdGVjdHVyZS4KLSAqLwotCi1zdHJ1Y3Qgc2htaWQ2NF9kcyB7Ci0Jc3RydWN0IGlwYzY0X3Blcm0Jc2htX3Blcm07CS8qIG9wZXJhdGlvbiBwZXJtcyAqLwotCXVuc2lnbmVkIGludAkJX191bnVzZWQxOwotCV9fa2VybmVsX3RpbWVfdAkJc2htX2F0aW1lOwkvKiBsYXN0IGF0dGFjaCB0aW1lICovCi0JdW5zaWduZWQgaW50CQlfX3VudXNlZDI7Ci0JX19rZXJuZWxfdGltZV90CQlzaG1fZHRpbWU7CS8qIGxhc3QgZGV0YWNoIHRpbWUgKi8KLQl1bnNpZ25lZCBpbnQJCV9fdW51c2VkMzsKLQlfX2tlcm5lbF90aW1lX3QJCXNobV9jdGltZTsJLyogbGFzdCBjaGFuZ2UgdGltZSAqLwotCXVuc2lnbmVkIGludAkJX191bnVzZWQ0OwotCXNpemVfdAkJCXNobV9zZWdzejsJLyogc2l6ZSBvZiBzZWdtZW50IChieXRlcykgKi8KLQlfX2tlcm5lbF9waWRfdAkJc2htX2NwaWQ7CS8qIHBpZCBvZiBjcmVhdG9yICovCi0JX19rZXJuZWxfcGlkX3QJCXNobV9scGlkOwkvKiBwaWQgb2YgbGFzdCBvcGVyYXRvciAqLwotCXVuc2lnbmVkIGxvbmcJCXNobV9uYXR0Y2g7CS8qIG5vLiBvZiBjdXJyZW50IGF0dGFjaGVzICovCi0JdW5zaWduZWQgbG9uZwkJX191bnVzZWQ1OwotCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkNjsKLX07Ci0KLXN0cnVjdCBzaG1pbmZvNjQgewotCXVuc2lnbmVkIGxvbmcJc2htbWF4OwotCXVuc2lnbmVkIGxvbmcJc2htbWluOwotCXVuc2lnbmVkIGxvbmcJc2htbW5pOwotCXVuc2lnbmVkIGxvbmcJc2htc2VnOwotCXVuc2lnbmVkIGxvbmcJc2htYWxsOwotCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOwotCXVuc2lnbmVkIGxvbmcJX191bnVzZWQyOwotCXVuc2lnbmVkIGxvbmcJX191bnVzZWQzOwotCXVuc2lnbmVkIGxvbmcJX191bnVzZWQ0OwotfTsKLQotI2VuZGlmIC8qIF9QUENfU0hNQlVGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9zaWdpbmZvLmggYi9pbmNsdWRlL2FzbS1wcGMvc2lnaW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjk0MzViLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXBwYy9zaWdpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX1BQQ19TSUdJTkZPX0gKLSNkZWZpbmUgX1BQQ19TSUdJTkZPX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ2luZm8uaD4KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvc21wLmggYi9pbmNsdWRlL2FzbS1wcGMvc21wLmgKaW5kZXggMTc1MzBjMi4uODI5NDgxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9zbXAuaApAQCAtNDEsNiArNDEsMTAgQEAKIHN0cnVjdCBwdF9yZWdzOwogZXh0ZXJuIHZvaWQgc21wX21lc3NhZ2VfcmVjdihpbnQsIHN0cnVjdCBwdF9yZWdzICopOwogCitleHRlcm4gaW50IF9fY3B1X2Rpc2FibGUodm9pZCk7CitleHRlcm4gdm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gdm9pZCBjcHVfZGllKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisKICNkZWZpbmUgTk9fUFJPQ19JRAkJMHhGRiAgICAgICAgICAgIC8qIE5vIHByb2Nlc3NvciBtYWdpYyBtYXJrZXIgKi8KICNkZWZpbmUgUFJPQ19DSEFOR0VfUEVOQUxUWQkyMAogCkBAIC02NCw2ICs2OCw4IEBACiAKICNlbHNlIC8qICEoQ09ORklHX1NNUCkgKi8KIAorc3RhdGljIGlubGluZSB2b2lkIGNwdV9kaWUodm9pZCkgeyB9CisKICNlbmRpZiAvKiAhKENPTkZJR19TTVApICovCiAKICNlbmRpZiAvKiAhKF9QUENfU01QX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1wcGMvc29ja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NmUxYTMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3NvY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotI2lmbmRlZiBfQVNNX1NPQ0tFVF9ICi0jZGVmaW5lIF9BU01fU09DS0VUX0gKLQotLyogU29ja2V0LWxldmVsIEkvTyBjb250cm9sIGNhbGxzLiAqLwotI2RlZmluZSBGSU9TRVRPV04gCTB4ODkwMQotI2RlZmluZSBTSU9DU1BHUlAJMHg4OTAyCi0jZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKLSNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAotI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICovCi0KLS8qIEZvciBzZXRzb2Nrb3B0KDIpICovCi0jZGVmaW5lIFNPTF9TT0NLRVQJMQotCi0jZGVmaW5lIFNPX0RFQlVHCTEKLSNkZWZpbmUgU09fUkVVU0VBRERSCTIKLSNkZWZpbmUgU09fVFlQRQkJMwotI2RlZmluZSBTT19FUlJPUgk0Ci0jZGVmaW5lIFNPX0RPTlRST1VURQk1Ci0jZGVmaW5lIFNPX0JST0FEQ0FTVAk2Ci0jZGVmaW5lIFNPX1NOREJVRgk3Ci0jZGVmaW5lIFNPX1JDVkJVRgk4Ci0jZGVmaW5lIFNPX1NOREJVRkZPUkNFCTMyCi0jZGVmaW5lIFNPX1JDVkJVRkZPUkNFCTMzCi0jZGVmaW5lIFNPX0tFRVBBTElWRQk5Ci0jZGVmaW5lIFNPX09PQklOTElORQkxMAotI2RlZmluZSBTT19OT19DSEVDSwkxMQotI2RlZmluZSBTT19QUklPUklUWQkxMgotI2RlZmluZSBTT19MSU5HRVIJMTMKLSNkZWZpbmUgU09fQlNEQ09NUEFUCTE0Ci0vKiBUbyBhZGQgOiNkZWZpbmUgU09fUkVVU0VQT1JUIDE1ICovCi0jZGVmaW5lIFNPX1JDVkxPV0FUCTE2Ci0jZGVmaW5lIFNPX1NORExPV0FUCTE3Ci0jZGVmaW5lIFNPX1JDVlRJTUVPCTE4Ci0jZGVmaW5lIFNPX1NORFRJTUVPCTE5Ci0jZGVmaW5lIFNPX1BBU1NDUkVECTIwCi0jZGVmaW5lIFNPX1BFRVJDUkVECTIxCi0KLS8qIFNlY3VyaXR5IGxldmVscyAtIGFzIHBlciBOUkwgSVB2NiAtIGRvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nICovCi0jZGVmaW5lIFNPX1NFQ1VSSVRZX0FVVEhFTlRJQ0FUSU9OCQkyMgotI2RlZmluZSBTT19TRUNVUklUWV9FTkNSWVBUSU9OX1RSQU5TUE9SVAkyMwotI2RlZmluZSBTT19TRUNVUklUWV9FTkNSWVBUSU9OX05FVFdPUksJCTI0Ci0KLSNkZWZpbmUgU09fQklORFRPREVWSUNFCTI1Ci0KLS8qIFNvY2tldCBmaWx0ZXJpbmcgKi8KLSNkZWZpbmUgU09fQVRUQUNIX0ZJTFRFUgkyNgotI2RlZmluZSBTT19ERVRBQ0hfRklMVEVSCTI3Ci0KLSNkZWZpbmUgU09fUEVFUk5BTUUJCTI4Ci0jZGVmaW5lIFNPX1RJTUVTVEFNUAkJMjkKLSNkZWZpbmUgU0NNX1RJTUVTVEFNUAkJU09fVElNRVNUQU1QCi0KLSNkZWZpbmUgU09fQUNDRVBUQ09OTgkJMzAKLQotI2RlZmluZSBTT19QRUVSU0VDCQkzMQotCi0jZW5kaWYgLyogX0FTTV9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLXBwYy9zb2NraW9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NWFlZGMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3NvY2tpb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9QUENfU09DS0lPU19ICi0jZGVmaW5lIF9BU01fUFBDX1NPQ0tJT1NfSAotCi0jaWYgMCAvKiBUaGVzZSBhcmUgZGVmaW5lZCB0aGlzIHdheSBvbiBBbHBoYSAtIG1heWJlIGxhdGVyLiAqLwotLyogU29ja2V0LWxldmVsIEkvTyBjb250cm9sIGNhbGxzLiAqLwotCi0jZGVmaW5lIEZJT0dFVE9XTglfSU9SKCdmJywgMTIzLCBpbnQpCi0jZGVmaW5lIEZJT1NFVE9XTiAJX0lPVygnZicsIDEyNCwgaW50KQotCi0jZGVmaW5lIFNJT0NBVE1BUksJX0lPUigncycsIDcsIGludCkKLSNkZWZpbmUgU0lPQ1NQR1JQCV9JT1coJ3MnLCA4LCBwaWRfdCkKLSNkZWZpbmUgU0lPQ0dQR1JQCV9JT1IoJ3MnLCA5LCBwaWRfdCkKLQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wIC0gbGludXgtc3BlY2lmaWMgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogX0FTTV9QUENfU09DS0lPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLXBwYy9zcGlubG9jay5oCmluZGV4IDkwOTE5OWEuLjIwZWRjZjJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvc3BpbmxvY2suaApAQCAtNSw0MSArNSwyMSBAQAogCiAvKgogICogU2ltcGxlIHNwaW4gbG9jayBvcGVyYXRpb25zLgorICoKKyAqICh0aGUgdHlwZSBkZWZpbml0aW9ucyBhcmUgaW4gYXNtL3Jhd19zcGlubG9ja190eXBlcy5oKQogICovCiAKLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvY2s7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBvd25lcl9wYzsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIG93bmVyX2NwdTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gc3BpbmxvY2tfdDsKKyNkZWZpbmUgX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkJCSgoeCktPmxvY2sgIT0gMCkKKyNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChsb2NrKSBcCisJZG8geyB3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQobG9jaykpIGNwdV9yZWxheCgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQogCi0jaWZkZWYgX19LRVJORUxfXwotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotI2RlZmluZSBTUElOTE9DS19ERUJVR19JTklUICAgICAsIDAsIDAKLSNlbHNlCi0jZGVmaW5lIFNQSU5MT0NLX0RFQlVHX0lOSVQgICAgIC8qICovCi0jZW5kaWYKLQotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQJKHNwaW5sb2NrX3QpIHsgMCBTUElOTE9DS19ERUJVR19JTklUIH0KLQotI2RlZmluZSBzcGluX2xvY2tfaW5pdCh4KSAJZG8geyAqKHgpID0gU1BJTl9MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpCSgoeCktPmxvY2sgIT0gMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdCh4KQlkbyB7IGJhcnJpZXIoKTsgfSB3aGlsZShzcGluX2lzX2xvY2tlZCh4KSkKLSNkZWZpbmUgX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9yYXdfc3Bpbl9sb2NrKGxvY2spCi0KLSNpZm5kZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSJiCTFmCQkjIHNwaW5fbG9ja1xuXAorCSJiCTFmCQkjIF9fcmF3X3NwaW5fbG9ja1xuXAogMjoJbHd6eAklMCwwLCUxXG5cCiAJY21wd2kJMCwlMCwwXG5cCiAJYm5lKwkyYlxuXApAQCAtNTUsMjEgKzM1LDEzIEBACiAJOiAiY3IwIiwgIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJlaWVpbwkJIyBzcGluX3VubG9jayI6IDogOiJtZW1vcnkiKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiZWllaW8JIyBfX3Jhd19zcGluX3VubG9jayI6IDogOiJtZW1vcnkiKTsKIAlsb2NrLT5sb2NrID0gMDsKIH0KIAotI2RlZmluZSBfcmF3X3NwaW5fdHJ5bG9jayhsKSAoIXRlc3RfYW5kX3NldF9iaXQoMCwmKGwpLT5sb2NrKSkKLQotI2Vsc2UKLQotZXh0ZXJuIHZvaWQgX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jayk7Ci1leHRlcm4gdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spOwotZXh0ZXJuIGludCBfcmF3X3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKTsKLQotI2VuZGlmCisjZGVmaW5lIF9fcmF3X3NwaW5fdHJ5bG9jayhsKSAoIXRlc3RfYW5kX3NldF9iaXQoMCwmKGwpLT5sb2NrKSkKIAogLyoKICAqIFJlYWQtd3JpdGUgc3BpbmxvY2tzLCBhbGxvd2luZyBtdWx0aXBsZSByZWFkZXJzCkBAIC04MSwyMiArNTMsMTEgQEAKICAqIGlycS1zYWZlIHdyaXRlLWxvY2ssIGJ1dCByZWFkZXJzIGNhbiBnZXQgbm9uLWlycXNhZmUKICAqIHJlYWQtbG9ja3MuCiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSBzaWduZWQgaW50IGxvY2s7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKIAotI2RlZmluZSBSV19MT0NLX1VOTE9DS0VEIChyd2xvY2tfdCkgeyAwIH0KLSNkZWZpbmUgcndsb2NrX2luaXQobHApIGRvIHsgKihscCkgPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCisjZGVmaW5lIF9fcmF3X3JlYWRfY2FuX2xvY2socncpCSgocncpLT5sb2NrID49IDApCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHJ3KQkoIShydyktPmxvY2spCiAKLSNkZWZpbmUgcmVhZF9jYW5fbG9jayhydykJKChydyktPmxvY2sgPj0gMCkKLSNkZWZpbmUgd3JpdGVfY2FuX2xvY2socncpCSghKHJ3KS0+bG9jaykKLQotI2lmbmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQotc3RhdGljIF9faW5saW5lX18gaW50IF9yYXdfcmVhZF90cnlsb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX3Jhd19yZWFkX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAlzaWduZWQgaW50IHRtcDsKIApAQCAtMTE2LDcgKzc3LDcgQEAKIAlyZXR1cm4gdG1wID4gMDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBfcmF3X3JlYWRfbG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fcmF3X3JlYWRfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCXNpZ25lZCBpbnQgdG1wOwogCkBAIC0xMzcsNyArOTgsNyBAQAogCTogImNyMCIsICJtZW1vcnkiKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBfcmF3X3JlYWRfdW5sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAlzaWduZWQgaW50IHRtcDsKIApAQCAtMTUzLDcgKzExNCw3IEBACiAJOiAiY3IwIiwgIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgX3Jhd193cml0ZV90cnlsb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJc2lnbmVkIGludCB0bXA7CiAKQEAgLTE3Myw3ICsxMzQsNyBAQAogCXJldHVybiB0bXAgPT0gMDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3Jhd193cml0ZV9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJc2lnbmVkIGludCB0bXA7CiAKQEAgLTE5NCwyMiArMTU1LDEwIEBACiAJOiAiY3IwIiwgIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9yYXdfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oImVpZWlvCQkjIHdyaXRlX3VubG9jayI6IDogOiJtZW1vcnkiKTsKIAlydy0+bG9jayA9IDA7CiB9CiAKLSNlbHNlCi0KLWV4dGVybiB2b2lkIF9yYXdfcmVhZF9sb2NrKHJ3bG9ja190ICpydyk7Ci1leHRlcm4gdm9pZCBfcmF3X3JlYWRfdW5sb2NrKHJ3bG9ja190ICpydyk7Ci1leHRlcm4gdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KTsKLWV4dGVybiB2b2lkIF9yYXdfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydyk7Ci1leHRlcm4gaW50IF9yYXdfcmVhZF90cnlsb2NrKHJ3bG9ja190ICpydyk7Ci1leHRlcm4gaW50IF9yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncpOwotCi0jZW5kaWYKLQogI2VuZGlmIC8qIF9fQVNNX1NQSU5MT0NLX0ggKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvc3BpbmxvY2tfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXBwYy9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTljY2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wcGMvc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX19BU01fU1BJTkxPQ0tfVFlQRVNfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgc2lnbmVkIGludCBsb2NrOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyAwIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1wcGMvc3lzdGVtLmgKaW5kZXggODIzOTVmMy4uZDc1NGFiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9zeXN0ZW0uaApAQCAtODQsOSArODQsMTUgQEAKIGV4dGVybiB2b2lkIGN2dF9kZihkb3VibGUgKmZyb20sIGZsb2F0ICp0bywgdW5zaWduZWQgbG9uZyAqZnBzY3IpOwogZXh0ZXJuIGludCBjYWxsX3J0YXMoY29uc3QgY2hhciAqLCBpbnQsIGludCwgdW5zaWduZWQgbG9uZyAqLCAuLi4pOwogZXh0ZXJuIHZvaWQgY2FjaGVhYmxlX21lbXplcm8odm9pZCAqcCwgdW5zaWduZWQgaW50IG5iKTsKK2V4dGVybiB2b2lkICpjYWNoZWFibGVfbWVtY3B5KHZvaWQgKiwgY29uc3Qgdm9pZCAqLCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGludCBkb19wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIHZvaWQgYmFkX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKiwgdW5zaWduZWQgbG9uZywgaW50KTsKIGV4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworZXh0ZXJuIHZvaWQgX2V4Y2VwdGlvbihpbnQsIHN0cnVjdCBwdF9yZWdzICosIGludCwgdW5zaWduZWQgbG9uZyk7CisjaWZkZWYgQ09ORklHX0JPT0tFX1dEVAorZXh0ZXJuIHUzMiBib29rZV93ZHRfZW5hYmxlZDsKK2V4dGVybiB1MzIgYm9va2Vfd2R0X3BlcmlvZDsKKyNlbmRpZiAvKiBDT05GSUdfQk9PS0VfV0RUICovCiAKIHN0cnVjdCBkZXZpY2Vfbm9kZTsKIGV4dGVybiB2b2lkIG5vdGVfc2NzaV9ob3N0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCB2b2lkICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1wcGMvdGVybWJpdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0M2ZiNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvdGVybWJpdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0jaWZuZGVmIF9QUENfVEVSTUJJVFNfSAotI2RlZmluZSBfUFBDX1RFUk1CSVRTX0gKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCWNjX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludAlzcGVlZF90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQJdGNmbGFnX3Q7Ci0KLS8qCi0gKiB0ZXJtaW9zIHR5cGUgYW5kIG1hY3JvIGRlZmluaXRpb25zLiAgQmUgY2FyZWZ1bCBhYm91dCBhZGRpbmcgc3R1ZmYKLSAqIHRvIHRoaXMgZmlsZSBzaW5jZSBpdCdzIHVzZWQgaW4gR05VIGxpYmMgYW5kIHRoZXJlIGFyZSBzdHJpY3QgcnVsZXMKLSAqIGNvbmNlcm5pbmcgbmFtZXNwYWNlIHBvbGx1dGlvbi4KLSAqLwotCi0jZGVmaW5lIE5DQ1MgMTkKLXN0cnVjdCB0ZXJtaW9zIHsKLQl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLwotCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLwotCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KLQl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLwotCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLwotCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAoPT0gY19jY1sxOV0pICovCi0Jc3BlZWRfdCBjX2lzcGVlZDsJCS8qIGlucHV0IHNwZWVkICovCi0Jc3BlZWRfdCBjX29zcGVlZDsJCS8qIG91dHB1dCBzcGVlZCAqLwotfTsKLQotLyogY19jYyBjaGFyYWN0ZXJzICovCi0jZGVmaW5lIFZJTlRSIAkwCi0jZGVmaW5lIFZRVUlUIAkxCi0jZGVmaW5lIFZFUkFTRSAJMgotI2RlZmluZSBWS0lMTAkzCi0jZGVmaW5lIFZFT0YJNAotI2RlZmluZSBWTUlOCTUKLSNkZWZpbmUgVkVPTAk2Ci0jZGVmaW5lIFZUSU1FCTcKLSNkZWZpbmUgVkVPTDIJOAotI2RlZmluZSBWU1dUQwk5Ci0KLSNkZWZpbmUgVldFUkFTRSAJMTAKLSNkZWZpbmUgVlJFUFJJTlQJMTEKLSNkZWZpbmUgVlNVU1AgCQkxMgotI2RlZmluZSBWU1RBUlQJCTEzCi0jZGVmaW5lIFZTVE9QCQkxNAotI2RlZmluZSBWTE5FWFQJCTE1Ci0jZGVmaW5lIFZESVNDQVJECTE2Ci0KLS8qIGNfaWZsYWcgYml0cyAqLwotI2RlZmluZSBJR05CUksJMDAwMDAwMQotI2RlZmluZSBCUktJTlQJMDAwMDAwMgotI2RlZmluZSBJR05QQVIJMDAwMDAwNAotI2RlZmluZSBQQVJNUksJMDAwMDAxMAotI2RlZmluZSBJTlBDSwkwMDAwMDIwCi0jZGVmaW5lIElTVFJJUAkwMDAwMDQwCi0jZGVmaW5lIElOTENSCTAwMDAxMDAKLSNkZWZpbmUgSUdOQ1IJMDAwMDIwMAotI2RlZmluZSBJQ1JOTAkwMDAwNDAwCi0jZGVmaW5lIElYT04JMDAwMTAwMAotI2RlZmluZSBJWE9GRgkwMDAyMDAwCi0jZGVmaW5lIElYQU5ZCQkwMDA0MDAwCi0jZGVmaW5lIElVQ0xDCQkwMDEwMDAwCi0jZGVmaW5lIElNQVhCRUwJMDAyMDAwMAotI2RlZmluZSBJVVRGOAkwMDQwMDAwCi0KLS8qIGNfb2ZsYWcgYml0cyAqLwotI2RlZmluZSBPUE9TVAkwMDAwMDAxCi0jZGVmaW5lIE9OTENSCTAwMDAwMDIKLSNkZWZpbmUgT0xDVUMJMDAwMDAwNAotCi0jZGVmaW5lIE9DUk5MCTAwMDAwMTAKLSNkZWZpbmUgT05PQ1IJMDAwMDAyMAotI2RlZmluZSBPTkxSRVQJMDAwMDA0MAotCi0jZGVmaW5lIE9GSUxMCTAwMDAwMTAwCi0jZGVmaW5lIE9GREVMCTAwMDAwMjAwCi0jZGVmaW5lIE5MRExZCTAwMDAxNDAwCi0jZGVmaW5lICAgTkwwCTAwMDAwMDAwCi0jZGVmaW5lICAgTkwxCTAwMDAwNDAwCi0jZGVmaW5lICAgTkwyCTAwMDAxMDAwCi0jZGVmaW5lICAgTkwzCTAwMDAxNDAwCi0jZGVmaW5lIFRBQkRMWQkwMDAwNjAwMAotI2RlZmluZSAgIFRBQjAJMDAwMDAwMDAKLSNkZWZpbmUgICBUQUIxCTAwMDAyMDAwCi0jZGVmaW5lICAgVEFCMgkwMDAwNDAwMAotI2RlZmluZSAgIFRBQjMJMDAwMDYwMDAKLSNkZWZpbmUgICBYVEFCUwkwMDAwNjAwMAkvKiByZXF1aXJlZCBieSBQT1NJWCB0byA9PSBUQUIzICovCi0jZGVmaW5lIENSRExZCTAwMDMwMDAwCi0jZGVmaW5lICAgQ1IwCTAwMDAwMDAwCi0jZGVmaW5lICAgQ1IxCTAwMDEwMDAwCi0jZGVmaW5lICAgQ1IyCTAwMDIwMDAwCi0jZGVmaW5lICAgQ1IzCTAwMDMwMDAwCi0jZGVmaW5lIEZGRExZCTAwMDQwMDAwCi0jZGVmaW5lICAgRkYwCTAwMDAwMDAwCi0jZGVmaW5lICAgRkYxCTAwMDQwMDAwCi0jZGVmaW5lIEJTRExZCTAwMTAwMDAwCi0jZGVmaW5lICAgQlMwCTAwMDAwMDAwCi0jZGVmaW5lICAgQlMxCTAwMTAwMDAwCi0jZGVmaW5lIFZURExZCTAwMjAwMDAwCi0jZGVmaW5lICAgVlQwCTAwMDAwMDAwCi0jZGVmaW5lICAgVlQxCTAwMjAwMDAwCi0KLS8qIGNfY2ZsYWcgYml0IG1lYW5pbmcgKi8KLSNkZWZpbmUgQ0JBVUQJMDAwMDM3NwotI2RlZmluZSAgQjAJMDAwMDAwMAkJLyogaGFuZyB1cCAqLwotI2RlZmluZSAgQjUwCTAwMDAwMDEKLSNkZWZpbmUgIEI3NQkwMDAwMDAyCi0jZGVmaW5lICBCMTEwCTAwMDAwMDMKLSNkZWZpbmUgIEIxMzQJMDAwMDAwNAotI2RlZmluZSAgQjE1MAkwMDAwMDA1Ci0jZGVmaW5lICBCMjAwCTAwMDAwMDYKLSNkZWZpbmUgIEIzMDAJMDAwMDAwNwotI2RlZmluZSAgQjYwMAkwMDAwMDEwCi0jZGVmaW5lICBCMTIwMAkwMDAwMDExCi0jZGVmaW5lICBCMTgwMAkwMDAwMDEyCi0jZGVmaW5lICBCMjQwMAkwMDAwMDEzCi0jZGVmaW5lICBCNDgwMAkwMDAwMDE0Ci0jZGVmaW5lICBCOTYwMAkwMDAwMDE1Ci0jZGVmaW5lICBCMTkyMDAJMDAwMDAxNgotI2RlZmluZSAgQjM4NDAwCTAwMDAwMTcKLSNkZWZpbmUgRVhUQSBCMTkyMDAKLSNkZWZpbmUgRVhUQiBCMzg0MDAKLSNkZWZpbmUgQ0JBVURFWCAwMDAwMDAwCi0jZGVmaW5lICBCNTc2MDAgICAwMDAyMAotI2RlZmluZSAgQjExNTIwMCAgMDAwMjEKLSNkZWZpbmUgIEIyMzA0MDAgIDAwMDIyCi0jZGVmaW5lICBCNDYwODAwICAwMDAyMwotI2RlZmluZSAgQjUwMDAwMCAgMDAwMjQKLSNkZWZpbmUgIEI1NzYwMDAgIDAwMDI1Ci0jZGVmaW5lICBCOTIxNjAwICAwMDAyNgotI2RlZmluZSBCMTAwMDAwMCAgMDAwMjcKLSNkZWZpbmUgQjExNTIwMDAgIDAwMDMwCi0jZGVmaW5lIEIxNTAwMDAwICAwMDAzMQotI2RlZmluZSBCMjAwMDAwMCAgMDAwMzIKLSNkZWZpbmUgQjI1MDAwMDAgIDAwMDMzCi0jZGVmaW5lIEIzMDAwMDAwICAwMDAzNAotI2RlZmluZSBCMzUwMDAwMCAgMDAwMzUKLSNkZWZpbmUgQjQwMDAwMDAgIDAwMDM2Ci0KLSNkZWZpbmUgQ1NJWkUJMDAwMDE0MDAKLSNkZWZpbmUgICBDUzUJMDAwMDAwMDAKLSNkZWZpbmUgICBDUzYJMDAwMDA0MDAKLSNkZWZpbmUgICBDUzcJMDAwMDEwMDAKLSNkZWZpbmUgICBDUzgJMDAwMDE0MDAKLQotI2RlZmluZSBDU1RPUEIJMDAwMDIwMDAKLSNkZWZpbmUgQ1JFQUQJMDAwMDQwMDAKLSNkZWZpbmUgUEFSRU5CCTAwMDEwMDAwCi0jZGVmaW5lIFBBUk9ERAkwMDAyMDAwMAotI2RlZmluZSBIVVBDTAkwMDA0MDAwMAotCi0jZGVmaW5lIENMT0NBTAkwMDEwMDAwMAotI2RlZmluZSBDUlRTQ1RTCSAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KLQotLyogY19sZmxhZyBiaXRzICovCi0jZGVmaW5lIElTSUcJMHgwMDAwMDA4MAotI2RlZmluZSBJQ0FOT04JMHgwMDAwMDEwMAotI2RlZmluZSBYQ0FTRQkweDAwMDA0MDAwCi0jZGVmaW5lIEVDSE8JMHgwMDAwMDAwOAotI2RlZmluZSBFQ0hPRQkweDAwMDAwMDAyCi0jZGVmaW5lIEVDSE9LCTB4MDAwMDAwMDQKLSNkZWZpbmUgRUNIT05MCTB4MDAwMDAwMTAKLSNkZWZpbmUgTk9GTFNICTB4ODAwMDAwMDAKLSNkZWZpbmUgVE9TVE9QCTB4MDA0MDAwMDAKLSNkZWZpbmUgRUNIT0NUTAkweDAwMDAwMDQwCi0jZGVmaW5lIEVDSE9QUlQJMHgwMDAwMDAyMAotI2RlZmluZSBFQ0hPS0UJMHgwMDAwMDAwMQotI2RlZmluZSBGTFVTSE8JMHgwMDgwMDAwMAotI2RlZmluZSBQRU5ESU4JMHgyMDAwMDAwMAotI2RlZmluZSBJRVhURU4JMHgwMDAwMDQwMAotCi0vKiBWYWx1ZXMgZm9yIHRoZSBBQ1RJT04gYXJndW1lbnQgdG8gYHRjZmxvdycuICAqLwotI2RlZmluZQlUQ09PRkYJCTAKLSNkZWZpbmUJVENPT04JCTEKLSNkZWZpbmUJVENJT0ZGCQkyCi0jZGVmaW5lCVRDSU9OCQkzCi0KLS8qIFZhbHVlcyBmb3IgdGhlIFFVRVVFX1NFTEVDVE9SIGFyZ3VtZW50IHRvIGB0Y2ZsdXNoJy4gICovCi0jZGVmaW5lCVRDSUZMVVNICTAKLSNkZWZpbmUJVENPRkxVU0gJMQotI2RlZmluZQlUQ0lPRkxVU0gJMgotCi0vKiBWYWx1ZXMgZm9yIHRoZSBPUFRJT05BTF9BQ1RJT05TIGFyZ3VtZW50IHRvIGB0Y3NldGF0dHInLiAgKi8KLSNkZWZpbmUJVENTQU5PVwkJMAotI2RlZmluZQlUQ1NBRFJBSU4JMQotI2RlZmluZQlUQ1NBRkxVU0gJMgotCi0jZW5kaWYgLyogX1BQQ19URVJNQklUU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tcHBjL3Rlcm1pb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjNjI4Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvdGVybWlvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLSNpZm5kZWYgX1BQQ19URVJNSU9TX0gKLSNkZWZpbmUgX1BQQ19URVJNSU9TX0gKLQotLyoKLSAqIExpYmVyYWxseSBhZGFwdGVkIGZyb20gYWxwaGEvdGVybWlvcy5oLiAgSW4gcGFydGljdWxhciwgdGhlIGNfY2NbXQotICogZmllbGRzIGhhdmUgYmVlbiByZW9yZGVyZWQgc28gdGhhdCB0ZXJtaW8gJiB0ZXJtaW9zIHNoYXJlIHRoZQotICogY29tbW9uIHN1YnNldCBpbiB0aGUgc2FtZSBvcmRlciAoZm9yIGJyYWluIGRlYWQgcHJvZ3JhbXMgdGhhdCBkb24ndAotICoga25vdyBvciBjYXJlIGFib3V0IHRoZSBkaWZmZXJlbmNlcykuCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlIDxhc20vdGVybWJpdHMuaD4KLQotc3RydWN0IHNndHR5YiB7Ci0JY2hhcglzZ19pc3BlZWQ7Ci0JY2hhcglzZ19vc3BlZWQ7Ci0JY2hhcglzZ19lcmFzZTsKLQljaGFyCXNnX2tpbGw7Ci0Jc2hvcnQJc2dfZmxhZ3M7Ci19OwotCi1zdHJ1Y3QgdGNoYXJzIHsKLQljaGFyCXRfaW50cmM7Ci0JY2hhcgl0X3F1aXRjOwotCWNoYXIJdF9zdGFydGM7Ci0JY2hhcgl0X3N0b3BjOwotCWNoYXIJdF9lb2ZjOwotCWNoYXIJdF9icmtjOwotfTsKLQotc3RydWN0IGx0Y2hhcnMgewotCWNoYXIJdF9zdXNwYzsKLQljaGFyCXRfZHN1c3BjOwotCWNoYXIJdF9ycHJudGM7Ci0JY2hhcgl0X2ZsdXNoYzsKLQljaGFyCXRfd2VyYXNjOwotCWNoYXIJdF9sbmV4dGM7Ci19OwotCi0jZGVmaW5lIEZJT0NMRVgJCV9JTygnZicsIDEpCi0jZGVmaW5lIEZJT05DTEVYCV9JTygnZicsIDIpCi0jZGVmaW5lIEZJT0FTWU5DCV9JT1coJ2YnLCAxMjUsIGludCkKLSNkZWZpbmUgRklPTkJJTwkJX0lPVygnZicsIDEyNiwgaW50KQotI2RlZmluZSBGSU9OUkVBRAlfSU9SKCdmJywgMTI3LCBpbnQpCi0jZGVmaW5lIFRJT0NJTlEJCUZJT05SRUFECi0jZGVmaW5lIEZJT1FTSVpFCV9JT1IoJ2YnLCAxMjgsIGxvZmZfdCkKLQotI2RlZmluZSBUSU9DR0VUUAlfSU9SKCd0JywgOCwgc3RydWN0IHNndHR5YikKLSNkZWZpbmUgVElPQ1NFVFAJX0lPVygndCcsIDksIHN0cnVjdCBzZ3R0eWIpCi0jZGVmaW5lIFRJT0NTRVROCV9JT1coJ3QnLCAxMCwgc3RydWN0IHNndHR5YikJLyogVElPQ1NFVFAgd28gZmx1c2ggKi8KLQotI2RlZmluZSBUSU9DU0VUQwlfSU9XKCd0JywgMTcsIHN0cnVjdCB0Y2hhcnMpCi0jZGVmaW5lIFRJT0NHRVRDCV9JT1IoJ3QnLCAxOCwgc3RydWN0IHRjaGFycykKLSNkZWZpbmUgVENHRVRTCQlfSU9SKCd0JywgMTksIHN0cnVjdCB0ZXJtaW9zKQotI2RlZmluZSBUQ1NFVFMJCV9JT1coJ3QnLCAyMCwgc3RydWN0IHRlcm1pb3MpCi0jZGVmaW5lIFRDU0VUU1cJCV9JT1coJ3QnLCAyMSwgc3RydWN0IHRlcm1pb3MpCi0jZGVmaW5lIFRDU0VUU0YJCV9JT1coJ3QnLCAyMiwgc3RydWN0IHRlcm1pb3MpCi0KLSNkZWZpbmUgVENHRVRBCQlfSU9SKCd0JywgMjMsIHN0cnVjdCB0ZXJtaW8pCi0jZGVmaW5lIFRDU0VUQQkJX0lPVygndCcsIDI0LCBzdHJ1Y3QgdGVybWlvKQotI2RlZmluZSBUQ1NFVEFXCQlfSU9XKCd0JywgMjUsIHN0cnVjdCB0ZXJtaW8pCi0jZGVmaW5lIFRDU0VUQUYJCV9JT1coJ3QnLCAyOCwgc3RydWN0IHRlcm1pbykKLQotI2RlZmluZSBUQ1NCUksJCV9JTygndCcsIDI5KQotI2RlZmluZSBUQ1hPTkMJCV9JTygndCcsIDMwKQotI2RlZmluZSBUQ0ZMU0gJCV9JTygndCcsIDMxKQotCi0jZGVmaW5lIFRJT0NTV0lOU1oJX0lPVygndCcsIDEwMywgc3RydWN0IHdpbnNpemUpCi0jZGVmaW5lIFRJT0NHV0lOU1oJX0lPUigndCcsIDEwNCwgc3RydWN0IHdpbnNpemUpCi0jZGVmaW5lCVRJT0NTVEFSVAlfSU8oJ3QnLCAxMTApCQkvKiBzdGFydCBvdXRwdXQsIGxpa2UgXlEgKi8KLSNkZWZpbmUJVElPQ1NUT1AJX0lPKCd0JywgMTExKQkJLyogc3RvcCBvdXRwdXQsIGxpa2UgXlMgKi8KLSNkZWZpbmUgVElPQ09VVFEgICAgICAgIF9JT1IoJ3QnLCAxMTUsIGludCkgICAgIC8qIG91dHB1dCBxdWV1ZSBzaXplICovCi0KLSNkZWZpbmUgVElPQ0dMVEMJX0lPUigndCcsIDExNiwgc3RydWN0IGx0Y2hhcnMpCi0jZGVmaW5lIFRJT0NTTFRDCV9JT1coJ3QnLCAxMTcsIHN0cnVjdCBsdGNoYXJzKQotI2RlZmluZSBUSU9DU1BHUlAJX0lPVygndCcsIDExOCwgaW50KQotI2RlZmluZSBUSU9DR1BHUlAJX0lPUigndCcsIDExOSwgaW50KQotCi0jZGVmaW5lIFRJT0NFWENMCTB4NTQwQwotI2RlZmluZSBUSU9DTlhDTAkweDU0MEQKLSNkZWZpbmUgVElPQ1NDVFRZCTB4NTQwRQotCi0jZGVmaW5lIFRJT0NTVEkJCTB4NTQxMgotI2RlZmluZSBUSU9DTUdFVAkweDU0MTUKLSNkZWZpbmUgVElPQ01CSVMJMHg1NDE2Ci0jZGVmaW5lIFRJT0NNQklDCTB4NTQxNwotI2RlZmluZSBUSU9DTVNFVAkweDU0MTgKLSNkZWZpbmUgVElPQ0dTT0ZUQ0FSCTB4NTQxOQotI2RlZmluZSBUSU9DU1NPRlRDQVIJMHg1NDFBCi0jZGVmaW5lIFRJT0NMSU5VWAkweDU0MUMKLSNkZWZpbmUgVElPQ0NPTlMJMHg1NDFECi0jZGVmaW5lIFRJT0NHU0VSSUFMCTB4NTQxRQotI2RlZmluZSBUSU9DU1NFUklBTAkweDU0MUYKLSNkZWZpbmUgVElPQ1BLVAkJMHg1NDIwCi0KLSNkZWZpbmUgVElPQ05PVFRZCTB4NTQyMgotI2RlZmluZSBUSU9DU0VURAkweDU0MjMKLSNkZWZpbmUgVElPQ0dFVEQJMHg1NDI0Ci0jZGVmaW5lIFRDU0JSS1AJCTB4NTQyNQkvKiBOZWVkZWQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KLQotI2RlZmluZSBUSU9DU0VSQ09ORklHCTB4NTQ1MwotI2RlZmluZSBUSU9DU0VSR1dJTEQJMHg1NDU0Ci0jZGVmaW5lIFRJT0NTRVJTV0lMRAkweDU0NTUKLSNkZWZpbmUgVElPQ0dMQ0tUUk1JT1MJMHg1NDU2Ci0jZGVmaW5lIFRJT0NTTENLVFJNSU9TCTB4NTQ1NwotI2RlZmluZSBUSU9DU0VSR1NUUlVDVAkweDU0NTggLyogRm9yIGRlYnVnZ2luZyBvbmx5ICovCi0jZGVmaW5lIFRJT0NTRVJHRVRMU1IgICAweDU0NTkgLyogR2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lIFRJT0NTRVJHRVRNVUxUSSAweDU0NUEgLyogR2V0IG11bHRpcG9ydCBjb25maWcgICovCi0jZGVmaW5lIFRJT0NTRVJTRVRNVUxUSSAweDU0NUIgLyogU2V0IG11bHRpcG9ydCBjb25maWcgKi8KLQotI2RlZmluZSBUSU9DTUlXQUlUCTB4NTQ1QwkvKiB3YWl0IGZvciBhIGNoYW5nZSBvbiBzZXJpYWwgaW5wdXQgbGluZShzKSAqLwotI2RlZmluZSBUSU9DR0lDT1VOVAkweDU0NUQJLyogcmVhZCBzZXJpYWwgcG9ydCBpbmxpbmUgaW50ZXJydXB0IGNvdW50cyAqLwotCi0vKiBVc2VkIGZvciBwYWNrZXQgbW9kZSAqLwotI2RlZmluZSBUSU9DUEtUX0RBVEEJCSAwCi0jZGVmaW5lIFRJT0NQS1RfRkxVU0hSRUFECSAxCi0jZGVmaW5lIFRJT0NQS1RfRkxVU0hXUklURQkgMgotI2RlZmluZSBUSU9DUEtUX1NUT1AJCSA0Ci0jZGVmaW5lIFRJT0NQS1RfU1RBUlQJCSA4Ci0jZGVmaW5lIFRJT0NQS1RfTk9TVE9QCQkxNgotI2RlZmluZSBUSU9DUEtUX0RPU1RPUAkJMzIKLQotc3RydWN0IHdpbnNpemUgewotCXVuc2lnbmVkIHNob3J0IHdzX3JvdzsKLQl1bnNpZ25lZCBzaG9ydCB3c19jb2w7Ci0JdW5zaWduZWQgc2hvcnQgd3NfeHBpeGVsOwotCXVuc2lnbmVkIHNob3J0IHdzX3lwaXhlbDsKLX07Ci0KLSNkZWZpbmUgTkNDIDEwCi1zdHJ1Y3QgdGVybWlvIHsKLQl1bnNpZ25lZCBzaG9ydCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLwotCXVuc2lnbmVkIHNob3J0IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLwotCXVuc2lnbmVkIHNob3J0IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KLQl1bnNpZ25lZCBzaG9ydCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLwotCXVuc2lnbmVkIGNoYXIgY19saW5lOwkJLyogbGluZSBkaXNjaXBsaW5lICovCi0JdW5zaWduZWQgY2hhciBjX2NjW05DQ107CS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLwotfTsKLQotLyogY19jYyBjaGFyYWN0ZXJzICovCi0jZGVmaW5lIF9WSU5UUgkwCi0jZGVmaW5lIF9WUVVJVAkxCi0jZGVmaW5lIF9WRVJBU0UJMgotI2RlZmluZSBfVktJTEwJMwotI2RlZmluZSBfVkVPRgk0Ci0jZGVmaW5lIF9WTUlOCTUKLSNkZWZpbmUgX1ZFT0wJNgotI2RlZmluZSBfVlRJTUUJNwotI2RlZmluZSBfVkVPTDIJOAotI2RlZmluZSBfVlNXVEMJOQotCi0jaWZkZWYgX19LRVJORUxfXwotLyogICAgICAgICAgICAgICAgICAgXkMgIF5cIGRlbCAgXlUgIF5EICAgMSAgIDAgICAwICAgMCAgIDAgIF5XICBeUiAgXlogIF5RICBeUyAgXlYgIF5VICAqLwotI2RlZmluZSBJTklUX0NfQ0MgIlwwMDNcMDM0XDE3N1wwMjVcMDA0XDAwMVwwMDBcMDAwXDAwMFwwMDBcMDI3XDAyMlwwMzJcMDIxXDAyM1wwMjZcMDI1IgotI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KLQotLyogbW9kZW0gbGluZXMgKi8KLSNkZWZpbmUgVElPQ01fTEUJMHgwMDEKLSNkZWZpbmUgVElPQ01fRFRSCTB4MDAyCi0jZGVmaW5lIFRJT0NNX1JUUwkweDAwNAotI2RlZmluZSBUSU9DTV9TVAkweDAwOAotI2RlZmluZSBUSU9DTV9TUgkweDAxMAotI2RlZmluZSBUSU9DTV9DVFMJMHgwMjAKLSNkZWZpbmUgVElPQ01fQ0FSCTB4MDQwCi0jZGVmaW5lIFRJT0NNX1JORwkweDA4MAotI2RlZmluZSBUSU9DTV9EU1IJMHgxMDAKLSNkZWZpbmUgVElPQ01fQ0QJVElPQ01fQ0FSCi0jZGVmaW5lIFRJT0NNX1JJCVRJT0NNX1JORwotI2RlZmluZSBUSU9DTV9PVVQxCTB4MjAwMAotI2RlZmluZSBUSU9DTV9PVVQyCTB4NDAwMAotI2RlZmluZSBUSU9DTV9MT09QCTB4ODAwMAotCi0vKiBpb2N0bCAoZmQsIFRJT0NTRVJHRVRMU1IsICZyZXN1bHQpIHdoZXJlIHJlc3VsdCBtYXkgYmUgYXMgYmVsb3cgKi8KLSNkZWZpbmUgVElPQ1NFUl9URU1UICAgIDB4MDEJLyogVHJhbnNtaXR0ZXIgcGh5c2ljYWxseSBlbXB0eSAqLwotCi0vKiBsaW5lIGRpc2NpcGxpbmVzICovCi0jZGVmaW5lIE5fVFRZCQkwCi0jZGVmaW5lIE5fU0xJUAkJMQotI2RlZmluZSBOX01PVVNFCQkyCi0jZGVmaW5lIE5fUFBQCQkzCi0jZGVmaW5lIE5fU1RSSVAJCTQKLSNkZWZpbmUgTl9BWDI1CQk1Ci0jZGVmaW5lIE5fWDI1CQk2CS8qIFguMjUgYXN5bmMgKi8KLSNkZWZpbmUgTl82UEFDSwkJNwotI2RlZmluZSBOX01BU0MJCTgJLyogUmVzZXJ2ZWQgZm9yIE1vYml0ZXggbW9kdWxlIDxrYXpAY2FmZS5uZXQ+ICovCi0jZGVmaW5lIE5fUjM5NjQJCTkJLyogUmVzZXJ2ZWQgZm9yIFNpbWF0aWMgUjM5NjQgbW9kdWxlICovCi0jZGVmaW5lIE5fUFJPRklCVVNfRkRMCTEwCS8qIFJlc2VydmVkIGZvciBQcm9maWJ1cyA8RGF2ZUBtdmhpLmNvbT4gKi8KLSNkZWZpbmUgTl9JUkRBCQkxMQkvKiBMaW51eCBJckRhIC0gaHR0cDovL2lyZGEuc291cmNlZm9yZ2UubmV0LyAqLwotI2RlZmluZSBOX1NNU0JMT0NLCTEyCS8qIFNNUyBibG9jayBtb2RlIC0gZm9yIHRhbGtpbmcgdG8gR1NNIGRhdGEgY2FyZHMgYWJvdXQgU01TIG1lc3NhZ2VzICovCi0jZGVmaW5lIE5fSERMQwkJMTMJLyogc3luY2hyb25vdXMgSERMQyAqLwotI2RlZmluZSBOX1NZTkNfUFBQCTE0Ci0jZGVmaW5lIE5fSENJCQkxNSAgLyogQmx1ZXRvb3RoIEhDSSBVQVJUICovCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLS8qCi0gKiBUcmFuc2xhdGUgYSAidGVybWlvIiBzdHJ1Y3R1cmUgaW50byBhICJ0ZXJtaW9zIi4gVWdoLgotICovCi0jZGVmaW5lIFNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgeCkgeyBcCi0JdW5zaWduZWQgc2hvcnQgX190bXA7IFwKLQlnZXRfdXNlcihfX3RtcCwmKHRlcm1pbyktPngpOyBcCi0JKHRlcm1pb3MpLT54ID0gKDB4ZmZmZjAwMDAgJiAodGVybWlvcyktPngpIHwgX190bXA7IFwKLX0KLQotI2RlZmluZSB1c2VyX3Rlcm1pb190b19rZXJuZWxfdGVybWlvcyh0ZXJtaW9zLCB0ZXJtaW8pIFwKLSh7IFwKLQlTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIGNfaWZsYWcpOyBcCi0JU0VUX0xPV19URVJNSU9TX0JJVFModGVybWlvcywgdGVybWlvLCBjX29mbGFnKTsgXAotCVNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgY19jZmxhZyk7IFwKLQlTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIGNfbGZsYWcpOyBcCi0JY29weV9mcm9tX3VzZXIoKHRlcm1pb3MpLT5jX2NjLCAodGVybWlvKS0+Y19jYywgTkNDKTsgXAotfSkKLQotLyoKLSAqIFRyYW5zbGF0ZSBhICJ0ZXJtaW9zIiBzdHJ1Y3R1cmUgaW50byBhICJ0ZXJtaW8iLiBVZ2guCi0gKi8KLSNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW8odGVybWlvLCB0ZXJtaW9zKSBcCi0oeyBcCi0JcHV0X3VzZXIoKHRlcm1pb3MpLT5jX2lmbGFnLCAmKHRlcm1pbyktPmNfaWZsYWcpOyBcCi0JcHV0X3VzZXIoKHRlcm1pb3MpLT5jX29mbGFnLCAmKHRlcm1pbyktPmNfb2ZsYWcpOyBcCi0JcHV0X3VzZXIoKHRlcm1pb3MpLT5jX2NmbGFnLCAmKHRlcm1pbyktPmNfY2ZsYWcpOyBcCi0JcHV0X3VzZXIoKHRlcm1pb3MpLT5jX2xmbGFnLCAmKHRlcm1pbyktPmNfbGZsYWcpOyBcCi0JcHV0X3VzZXIoKHRlcm1pb3MpLT5jX2xpbmUsICAmKHRlcm1pbyktPmNfbGluZSk7IFwKLQljb3B5X3RvX3VzZXIoKHRlcm1pbyktPmNfY2MsICh0ZXJtaW9zKS0+Y19jYywgTkNDKTsgXAotfSkKLQotI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKLSNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotCi0jZW5kaWYJLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYJLyogX1BQQ19URVJNSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy90aW1leC5oIGIvaW5jbHVkZS9hc20tcHBjL3RpbWV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZmM4NzEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3RpbWV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tcHBjL3RpbWV4LmgKLSAqCi0gKiBwcGMgYXJjaGl0ZWN0dXJlIHRpbWV4IHNwZWNpZmljYXRpb25zCi0gKi8KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaWZuZGVmIF9BU01wcGNfVElNRVhfSAotI2RlZmluZSBfQVNNcHBjX1RJTUVYX0gKLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgotCi0jZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkxMTkzMTgwIC8qIFVuZGVybHlpbmcgSFogKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGN5Y2xlc190OwotCi0vKgotICogRm9yIHRoZSAiY3ljbGUiIGNvdW50ZXIgd2UgdXNlIHRoZSB0aW1lYmFzZSBsb3dlciBoYWxmLgotICogQ3VycmVudGx5IG9ubHkgdXNlZCBvbiBTTVAuCi0gKi8KLQotc3RhdGljIGlubGluZSBjeWNsZXNfdCBnZXRfY3ljbGVzKHZvaWQpCi17Ci0JY3ljbGVzX3QgcmV0ID0gMDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiOTg6CW1mdGIgJTBcbiIKLQkJIjk5OlxuIgotCQkiLnNlY3Rpb24gX19mdHJfZml4dXAsXCJhXCJcbiIKLQkJIgkubG9uZyAlMVxuIgotCQkiCS5sb25nIDBcbiIKLQkJIgkubG9uZyA5OGJcbiIKLQkJIgkubG9uZyA5OWJcbiIKLQkJIi5wcmV2aW91cyIKLQkJOiAiPXIiIChyZXQpIDogImkiIChDUFVfRlRSXzYwMSkpOwotCXJldHVybiByZXQ7Ci19Ci0KLSNlbmRpZgotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy90b3BvbG9neS5oIGIvaW5jbHVkZS9hc20tcHBjL3RvcG9sb2d5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMDI5YmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3RvcG9sb2d5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9QUENfVE9QT0xPR1lfSAotI2RlZmluZSBfQVNNX1BQQ19UT1BPTE9HWV9ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy90b3BvbG9neS5oPgotCi0jZW5kaWYgLyogX0FTTV9QUENfVE9QT0xPR1lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3R5cGVzLmggYi9pbmNsdWRlL2FzbS1wcGMvdHlwZXMuaAppbmRleCBhNzg3YmMwLi43N2RjMjRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvdHlwZXMuaApAQCAtNjIsOCArNjIsNiBAQAogI2RlZmluZSBIQVZFX1NFQ1RPUl9UCiAjZW5kaWYKIAotdHlwZWRlZiB1bnNpZ25lZCBpbnQga21lbV9idWZjdGxfdDsKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXBwYy91YWNjZXNzLmgKaW5kZXggYjA0NGFlMC4uNjNmNTYyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvdWFjY2Vzcy5oCkBAIC0zNywxMyArMzcsNiBAQAogI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgXAogCShfX2Noa191c2VyX3B0cihhZGRyKSxfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZykoYWRkciksKHNpemUpKSkKIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1leHRlcm4gaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzYzODFhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvYXV4dmVjLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfX1BQQzY0X0FVWFZFQ19ICisjZGVmaW5lIF9fUFBDNjRfQVVYVkVDX0gKKworLyoKKyAqIFdlIG5lZWQgdG8gcHV0IGluIHNvbWUgZXh0cmEgYXV4IHRhYmxlIGVudHJpZXMgdG8gdGVsbCBnbGliYyB3aGF0CisgKiB0aGUgY2FjaGUgYmxvY2sgc2l6ZSBpcywgc28gaXQgY2FuIHVzZSB0aGUgZGNieiBpbnN0cnVjdGlvbiBzYWZlbHkuCisgKi8KKyNkZWZpbmUgQVRfRENBQ0hFQlNJWkUJCTE5CisjZGVmaW5lIEFUX0lDQUNIRUJTSVpFCQkyMAorI2RlZmluZSBBVF9VQ0FDSEVCU0laRQkJMjEKKy8qIEEgc3BlY2lhbCBpZ25vcmVkIHR5cGUgdmFsdWUgZm9yIFBQQywgZm9yIGdsaWJjIGNvbXBhdGliaWxpdHkuICAqLworI2RlZmluZSBBVF9JR05PUkVQUEMJCTIyCisKKy8qIFRoZSB2RFNPIGxvY2F0aW9uLiBXZSBoYXZlIHRvIHVzZSB0aGUgc2FtZSB2YWx1ZSBhcyB4ODYgZm9yIGdsaWJjJ3MKKyAqIHNha2UgOi0pCisgKi8KKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSCQkzMworCisjZW5kaWYgLyogX19QUEM2NF9BVVhWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvYnVncy5oIGIvaW5jbHVkZS9hc20tcHBjNjQvYnVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjEwNzRiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L2J1Z3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgJ2luaXQvbWFpbi5jJyB0byBjaGVjayBmb3IgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudAotICogYnVncy4KLSAqCi0gKi8KLSNpZm5kZWYgX0FTTV9QUEM2NF9CVUdTX0gKLSNkZWZpbmUgX0FTTV9QUEM2NF9CVUdTX0gKLQotc3RhdGljIHZvaWQgY2hlY2tfYnVncyh2b2lkKSB7Ci19Ci0KLSNlbmRpZiAvKiBfQVNNX1BQQzY0X0JVR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1wcGM2NC9jb21wYXQuaAppbmRleCAxMjQxNGY1Li42ZWM2MmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9jb21wYXQuaApAQCAtMTMsOCArMTMsMTAgQEAKIHR5cGVkZWYgczMyCQljb21wYXRfdGltZV90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9jbG9ja190OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9waWRfdDsKLXR5cGVkZWYgdTMyCQljb21wYXRfdWlkX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X2dpZF90OwordHlwZWRlZiB1MzIJCV9fY29tcGF0X3VpZF90OwordHlwZWRlZiB1MzIJCV9fY29tcGF0X2dpZF90OwordHlwZWRlZiB1MzIJCV9fY29tcGF0X3VpZDMyX3Q7Cit0eXBlZGVmIHUzMgkJX19jb21wYXRfZ2lkMzJfdDsKIHR5cGVkZWYgdTMyCQljb21wYXRfbW9kZV90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF9pbm9fdDsKIHR5cGVkZWYgdTMyCQljb21wYXRfZGV2X3Q7CkBAIC00OCw4ICs1MCw4IEBACiAJY29tcGF0X2lub190CXN0X2lubzsKIAljb21wYXRfbW9kZV90CXN0X21vZGU7CiAJY29tcGF0X25saW5rX3QJc3Rfbmxpbms7CQotCWNvbXBhdF91aWRfdAlzdF91aWQ7Ci0JY29tcGF0X2dpZF90CXN0X2dpZDsKKwlfX2NvbXBhdF91aWQzMl90CXN0X3VpZDsKKwlfX2NvbXBhdF9naWQzMl90CXN0X2dpZDsKIAljb21wYXRfZGV2X3QJc3RfcmRldjsKIAljb21wYXRfb2ZmX3QJc3Rfc2l6ZTsKIAljb21wYXRfb2ZmX3QJc3RfYmxrc2l6ZTsKQEAgLTE0NCwxMCArMTQ2LDEwIEBACiAgKi8KIHN0cnVjdCBjb21wYXRfaXBjNjRfcGVybSB7CiAJY29tcGF0X2tleV90IGtleTsKLQljb21wYXRfdWlkX3QgdWlkOwotCWNvbXBhdF9naWRfdCBnaWQ7Ci0JY29tcGF0X3VpZF90IGN1aWQ7Ci0JY29tcGF0X2dpZF90IGNnaWQ7CisJX19jb21wYXRfdWlkX3QgdWlkOworCV9fY29tcGF0X2dpZF90IGdpZDsKKwlfX2NvbXBhdF91aWRfdCBjdWlkOworCV9fY29tcGF0X2dpZF90IGNnaWQ7CiAJY29tcGF0X21vZGVfdCBtb2RlOwogCXVuc2lnbmVkIGludCBzZXE7CiAJdW5zaWduZWQgaW50IF9fcGFkMjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L2NwdXRhYmxlLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9jcHV0YWJsZS5oCmluZGV4IGFlNmNmMzguLmFjYzliNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L2NwdXRhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvY3B1dGFibGUuaApAQCAtMzYsNiArMzYsNyBAQAogICogdmlhIHRoZSBta2RlZnMgbWVjaGFuaXNtLgogICovCiBzdHJ1Y3QgY3B1X3NwZWM7CitzdHJ1Y3Qgb3BfcHBjNjRfbW9kZWw7CiAKIHR5cGVkZWYJdm9pZCAoKmNwdV9zZXR1cF90KSh1bnNpZ25lZCBsb25nIG9mZnNldCwgc3RydWN0IGNwdV9zcGVjKiBzcGVjKTsKIApAQCAtNTIsMTAgKzUzLDE5IEBACiAJdW5zaWduZWQgaW50CWljYWNoZV9ic2l6ZTsKIAl1bnNpZ25lZCBpbnQJZGNhY2hlX2JzaXplOwogCisJLyogbnVtYmVyIG9mIHBlcmZvcm1hbmNlIG1vbml0b3IgY291bnRlcnMgKi8KKwl1bnNpZ25lZCBpbnQJbnVtX3BtY3M7CisKIAkvKiB0aGlzIGlzIGNhbGxlZCB0byBpbml0aWFsaXplIHZhcmlvdXMgQ1BVIGJpdHMgbGlrZSBMMSBjYWNoZSwKIAkgKiBCSFQsIFNQRCwgZXRjLi4uIGZyb20gaGVhZC5TIGJlZm9yZSBicmFuY2hpbmcgdG8gaWRlbnRpZnlfbWFjaGluZQogCSAqLwogCWNwdV9zZXR1cF90CWNwdV9zZXR1cDsKKworCS8qIFVzZWQgYnkgb3Byb2ZpbGUgdXNlcnNwYWNlIHRvIHNlbGVjdCB0aGUgcmlnaHQgY291bnRlcnMgKi8KKwljaGFyCQkqb3Byb2ZpbGVfY3B1X3R5cGU7CisKKwkvKiBQcm9jZXNzb3Igc3BlY2lmaWMgb3Byb2ZpbGUgb3BlcmF0aW9ucyAqLworCXN0cnVjdCBvcF9wcGM2NF9tb2RlbCAqb3Byb2ZpbGVfbW9kZWw7CiB9OwogCiBleHRlcm4gc3RydWN0IGNwdV9zcGVjCQljcHVfc3BlY3NbXTsKQEAgLTk1LDcgKzEwNSw3IEBACiAjZGVmaW5lIENQVV9GVFJfTk9EU0lTUkFMSUdOICAJCUFTTV9DT05TVCgweDAwMDAwMDEwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfSUFCUiAgCQkJQVNNX0NPTlNUKDB4MDAwMDAwMjAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9NTUNSQSAgCQkJQVNNX0NPTlNUKDB4MDAwMDAwNDAwMDAwMDAwMCkKLSNkZWZpbmUgQ1BVX0ZUUl9QTUM4ICAJCQlBU01fQ09OU1QoMHgwMDAwMDA4MDAwMDAwMDAwKQorLyogdW51c2VkIAkJCQlBU01fQ09OU1QoMHgwMDAwMDA4MDAwMDAwMDAwKSAqLwogI2RlZmluZSBDUFVfRlRSX1NNVCAgCQkJQVNNX0NPTlNUKDB4MDAwMDAxMDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgIAlBU01fQ09OU1QoMHgwMDAwMDIwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFCQlBU01fQ09OU1QoMHgwMDAwMDQwMDAwMDAwMDAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvZWVoLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9lZWguaAppbmRleCA5NDI5OGIxLi40MGM4ZWI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9lZWguaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9lZWguaApAQCAtMjE5LDIzICsyMTksMjQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlZWhfbWVtc2V0X2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgaW50IGMsCiAJCQkJIHVuc2lnbmVkIGxvbmcgbikKIHsKKwl2b2lkICpwID0gKHZvaWQgX19mb3JjZSAqKWFkZHI7CiAJdTMyIGxjID0gYzsKIAlsYyB8PSBsYyA8PCA4OwogCWxjIHw9IGxjIDw8IDE2OwogCi0Jd2hpbGUobiAmJiAhRUVIX0NIRUNLX0FMSUdOKGFkZHIsIDQpKSB7Ci0JCSooKHZvbGF0aWxlIHU4ICopYWRkcikgPSBjOwotCQlhZGRyID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpYWRkciArIDEpOworCXdoaWxlKG4gJiYgIUVFSF9DSEVDS19BTElHTihwLCA0KSkgeworCQkqKCh2b2xhdGlsZSB1OCAqKXApID0gYzsKKwkJcCsrOwogCQluLS07CiAJfQogCXdoaWxlKG4gPj0gNCkgewotCQkqKCh2b2xhdGlsZSB1MzIgKilhZGRyKSA9IGxjOwotCQlhZGRyID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpYWRkciArIDQpOworCQkqKCh2b2xhdGlsZSB1MzIgKilwKSA9IGxjOworCQlwICs9IDQ7CiAJCW4gLT0gNDsKIAl9CiAJd2hpbGUobikgewotCQkqKCh2b2xhdGlsZSB1OCAqKWFkZHIpID0gYzsKLQkJYWRkciA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWFkZHIgKyAxKTsKKwkJKigodm9sYXRpbGUgdTggKilwKSA9IGM7CisJCXArKzsKIAkJbi0tOwogCX0KIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKQEAgLTI1MCwyMiArMjUxLDIyIEBACiAJd2hpbGUobiAmJiAoIUVFSF9DSEVDS19BTElHTih2c3JjLCA0KSB8fCAhRUVIX0NIRUNLX0FMSUdOKGRlc3QsIDQpKSkgewogCQkqKCh1OCAqKWRlc3QpID0gKigodm9sYXRpbGUgdTggKil2c3JjKTsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOwotCQl2c3JjID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdnNyYyArIDEpOwotCQlkZXN0ID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpZGVzdCArIDEpOwkJCQorCQl2c3JjKys7CisJCWRlc3QrKzsKIAkJbi0tOwogCX0KIAl3aGlsZShuID4gNCkgewogCQkqKCh1MzIgKilkZXN0KSA9ICooKHZvbGF0aWxlIHUzMiAqKXZzcmMpOwogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7Ci0JCXZzcmMgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyl2c3JjICsgNCk7Ci0JCWRlc3QgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZylkZXN0ICsgNCk7CQkJCisJCXZzcmMgKz0gNDsKKwkJZGVzdCArPSA0OwogCQluIC09IDQ7CiAJfQogCXdoaWxlKG4pIHsKIAkJKigodTggKilkZXN0KSA9ICooKHZvbGF0aWxlIHU4ICopdnNyYyk7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKTsKLQkJdnNyYyA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXZzcmMgKyAxKTsKLQkJZGVzdCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWRlc3QgKyAxKTsJCQkKKwkJdnNyYysrOworCQlkZXN0Kys7CiAJCW4tLTsKIAl9CiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7CkBAIC0yODYsMjAgKzI4NywyMCBAQAogCiAJd2hpbGUobiAmJiAoIUVFSF9DSEVDS19BTElHTih2ZGVzdCwgNCkgfHwgIUVFSF9DSEVDS19BTElHTihzcmMsIDQpKSkgewogCQkqKCh2b2xhdGlsZSB1OCAqKXZkZXN0KSA9ICooKHU4ICopc3JjKTsKLQkJc3JjID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpc3JjICsgMSk7Ci0JCXZkZXN0ID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdmRlc3QgKyAxKTsJCQkKKwkJc3JjKys7CisJCXZkZXN0Kys7CiAJCW4tLTsKIAl9CiAJd2hpbGUobiA+IDQpIHsKIAkJKigodm9sYXRpbGUgdTMyICopdmRlc3QpID0gKigodm9sYXRpbGUgdTMyICopc3JjKTsKLQkJc3JjID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpc3JjICsgNCk7Ci0JCXZkZXN0ID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdmRlc3QgKyA0KTsJCQkKKwkJc3JjICs9IDQ7CisJCXZkZXN0ICs9IDQ7CiAJCW4tPTQ7CiAJfQogCXdoaWxlKG4pIHsKIAkJKigodm9sYXRpbGUgdTggKil2ZGVzdCkgPSAqKCh1OCAqKXNyYyk7Ci0JCXNyYyA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXNyYyArIDEpOwotCQl2ZGVzdCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXZkZXN0ICsgMSk7CQkJCisJCXNyYysrOworCQl2ZGVzdCsrOwogCQluLS07CiAJfQogCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvZWxmLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9lbGYuaAppbmRleCAwODVlZWRiLi5jOTE5YTg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9lbGYuaApAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2F1eHZlYy5oPgogCiAvKiBQb3dlclBDIHJlbG9jYXRpb25zIGRlZmluZWQgYnkgdGhlIEFCSXMgKi8KICNkZWZpbmUgUl9QUENfTk9ORQkJMApAQCAtMjM3LDIxICsyMzgsNiBAQAogCiAjZW5kaWYKIAotLyoKLSAqIFdlIG5lZWQgdG8gcHV0IGluIHNvbWUgZXh0cmEgYXV4IHRhYmxlIGVudHJpZXMgdG8gdGVsbCBnbGliYyB3aGF0Ci0gKiB0aGUgY2FjaGUgYmxvY2sgc2l6ZSBpcywgc28gaXQgY2FuIHVzZSB0aGUgZGNieiBpbnN0cnVjdGlvbiBzYWZlbHkuCi0gKi8KLSNkZWZpbmUgQVRfRENBQ0hFQlNJWkUJCTE5Ci0jZGVmaW5lIEFUX0lDQUNIRUJTSVpFCQkyMAotI2RlZmluZSBBVF9VQ0FDSEVCU0laRQkJMjEKLS8qIEEgc3BlY2lhbCBpZ25vcmVkIHR5cGUgdmFsdWUgZm9yIFBQQywgZm9yIGdsaWJjIGNvbXBhdGliaWxpdHkuICAqLwotI2RlZmluZSBBVF9JR05PUkVQUEMJCTIyCi0KLS8qIFRoZSB2RFNPIGxvY2F0aW9uLiBXZSBoYXZlIHRvIHVzZSB0aGUgc2FtZSB2YWx1ZSBhcyB4ODYgZm9yIGdsaWJjJ3MKLSAqIHNha2UgOi0pCi0gKi8KLSNkZWZpbmUgQVRfU1lTSU5GT19FSERSCQkzMwotCiBleHRlcm4gaW50IGRjYWNoZV9ic2l6ZTsKIGV4dGVybiBpbnQgaWNhY2hlX2JzaXplOwogZXh0ZXJuIGludCB1Y2FjaGVfYnNpemU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9mY250bC5oIGIvaW5jbHVkZS9hc20tcHBjNjQvZmNudGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyNTYwZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9mY250bC5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotI2lmbmRlZiBfUFBDNjRfRkNOVExfSAotI2RlZmluZSBfUFBDNjRfRkNOVExfSAotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0vKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCi0gICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgT19BQ0NNT0RFCSAgIDAwMDMKLSNkZWZpbmUgT19SRE9OTFkJICAgICAwMAotI2RlZmluZSBPX1dST05MWQkgICAgIDAxCi0jZGVmaW5lIE9fUkRXUgkJICAgICAwMgotI2RlZmluZSBPX0NSRUFUCQkgICAwMTAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0VYQ0wJCSAgIDAyMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fTk9DVFRZCSAgIDA0MDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fVFJVTkMJCSAgMDEwMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fQVBQRU5ECSAgMDIwMDAKLSNkZWZpbmUgT19OT05CTE9DSwkgIDA0MDAwCi0jZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKLSNkZWZpbmUgT19TWU5DCQkgMDEwMDAwCi0jZGVmaW5lIEZBU1lOQwkJIDAyMDAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIE9fRElSRUNUT1JZICAgICAgMDQwMDAwCS8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgT19OT0ZPTExPVyAgICAgIDAxMDAwMDAJLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFICAgICAwMjAwMDAwCi0jZGVmaW5lIE9fRElSRUNUCTA0MDAwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCi0KLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNwotCi0jZGVmaW5lIEZfU0VUT1dOCTgJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVE9XTgk5CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQotLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KLSNkZWZpbmUgRl9SRExDSwkJMAotI2RlZmluZSBGX1dSTENLCQkxCi0jZGVmaW5lIEZfVU5MQ0sJCTIKLQotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLwotCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgRl9QT1NJWAkJMQotI2RlZmluZSBGX0ZMT0NLCQkyCi0jZGVmaW5lIEZfQlJPS0VOCTQJLyogYnJva2VuIGZsb2NrKCkgZW11bGF0aW9uICovCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi1zdHJ1Y3QgZmxvY2sgewotCXNob3J0IGxfdHlwZTsKLQlzaG9ydCBsX3doZW5jZTsKLQlvZmZfdCBsX3N0YXJ0OwotCW9mZl90IGxfbGVuOwotCXBpZF90IGxfcGlkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAotCi0jZW5kaWYgLyogX1BQQzY0X0ZDTlRMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1wcGM2NC9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjY0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9mdXRleC5oCkBAIC0wLDAgKzEsODMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBfX2Z1dGV4X2F0b21pY19vcChpbnNuLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKSBcCisgIF9fYXNtX18gX192b2xhdGlsZSAoU1lOQ19PTl9TTVAJCQkJXAorIjE6CWx3YXJ4CSUwLDAsJTJcbiIJCQkJCVwKKwlpbnNuCQkJCQkJCVwKKyIyOglzdHdjeC4JJTEsMCwlMlxuXAorCWJuZS0JMWJcblwKKwlsaQklMSwwXG5cCiszOgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG5cCis0OglsaQklMSwlM1xuXAorCWIJM2JcblwKKwkucHJldmlvdXNcblwKKwkuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG5cCisJLmFsaWduIDNcblwKKwkubGxvbmcJMWIsNGIsMmIsNGJcblwKKwkucHJldmlvdXMiCQkJCQkJXAorCTogIj0mciIgKG9sZHZhbCksICI9JnIiIChyZXQpCQkJCVwKKwk6ICJiIiAodWFkZHIpLCAiaSIgKC1FRkFVTFQpLCAiMSIgKG9wYXJnKQkJXAorCTogImNyMCIsICJtZW1vcnkiKQorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldDsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJCV9fZnV0ZXhfYXRvbWljX29wKCIiLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJCV9fZnV0ZXhfYXRvbWljX29wKCJhZGQgJTEsJTAsJTFcbiIsIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX09SOgorCQlfX2Z1dGV4X2F0b21pY19vcCgib3IgJTEsJTAsJTFcbiIsIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX0FORE46CisJCV9fZnV0ZXhfYXRvbWljX29wKCJhbmRjICUxLCUwLCUxXG4iLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJCV9fZnV0ZXhfYXRvbWljX29wKCJ4b3IgJTEsJTAsJTFcbiIsIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvaW8uaCBiL2luY2x1ZGUvYXNtLXBwYzY0L2lvLmgKaW5kZXggYWJhMWRmYS4uNTljOTU4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9pby5oCkBAIC0yMCwxMCArMjAsMTAgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lvbWFwLmg+CiAKLSNkZWZpbmUgX19pZGVfbW1faW5zdyhwLCBhLCBjKSBfaW5zd19ucygodm9sYXRpbGUgdTE2ICopKHApLCAoYSksIChjKSkKLSNkZWZpbmUgX19pZGVfbW1faW5zbChwLCBhLCBjKSBfaW5zbF9ucygodm9sYXRpbGUgdTMyICopKHApLCAoYSksIChjKSkKLSNkZWZpbmUgX19pZGVfbW1fb3V0c3cocCwgYSwgYykgX291dHN3X25zKCh2b2xhdGlsZSB1MTYgKikocCksIChhKSwgKGMpKQotI2RlZmluZSBfX2lkZV9tbV9vdXRzbChwLCBhLCBjKSBfb3V0c2xfbnMoKHZvbGF0aWxlIHUzMiAqKShwKSwgKGEpLCAoYykpCisjZGVmaW5lIF9faWRlX21tX2luc3cocCwgYSwgYykgX2luc3dfbnMoKHZvbGF0aWxlIHUxNiBfX2lvbWVtICopKHApLCAoYSksIChjKSkKKyNkZWZpbmUgX19pZGVfbW1faW5zbChwLCBhLCBjKSBfaW5zbF9ucygodm9sYXRpbGUgdTMyIF9faW9tZW0gKikocCksIChhKSwgKGMpKQorI2RlZmluZSBfX2lkZV9tbV9vdXRzdyhwLCBhLCBjKSBfb3V0c3dfbnMoKHZvbGF0aWxlIHUxNiBfX2lvbWVtICopKHApLCAoYSksIChjKSkKKyNkZWZpbmUgX19pZGVfbW1fb3V0c2wocCwgYSwgYykgX291dHNsX25zKCh2b2xhdGlsZSB1MzIgX19pb21lbSAqKShwKSwgKGEpLCAoYykpCiAKIAogI2RlZmluZSBTSU9fQ09ORklHX1JBCTB4Mzk4CkBAIC03MSw4ICs3MSw4IEBACiAgKiBOZWl0aGVyIGRvIHRoZSBzdGFuZGFyZCB2ZXJzaW9ucyBub3csIHRoZXNlIGFyZSBqdXN0IGhlcmUKICAqIGZvciBvbGRlciBjb2RlLgogICovCi0jZGVmaW5lIGluc3dfbnMocG9ydCwgYnVmLCBucykJX2luc3dfbnMoKHUxNiAqKSgocG9ydCkrcGNpX2lvX2Jhc2UpLCAoYnVmKSwgKG5zKSkKLSNkZWZpbmUgaW5zbF9ucyhwb3J0LCBidWYsIG5sKQlfaW5zbF9ucygodTMyICopKChwb3J0KStwY2lfaW9fYmFzZSksIChidWYpLCAobmwpKQorI2RlZmluZSBpbnN3X25zKHBvcnQsIGJ1ZiwgbnMpCV9pbnN3X25zKCh1MTYgX19pb21lbSAqKSgocG9ydCkrcGNpX2lvX2Jhc2UpLCAoYnVmKSwgKG5zKSkKKyNkZWZpbmUgaW5zbF9ucyhwb3J0LCBidWYsIG5sKQlfaW5zbF9ucygodTMyIF9faW9tZW0gKikoKHBvcnQpK3BjaV9pb19iYXNlKSwgKGJ1ZiksIChubCkpCiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgX19yYXdfcmVhZGIoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQpAQCAtMTM2LDkgKzEzNiw5IEBACiAjZGVmaW5lIGluc3dfbnMocG9ydCwgYnVmLCBucykJZWVoX2luc3dfbnMoKHBvcnQpLCAoYnVmKSwgKG5zKSkKICNkZWZpbmUgaW5zbF9ucyhwb3J0LCBidWYsIG5sKQllZWhfaW5zbF9ucygocG9ydCksIChidWYpLCAobmwpKQogCi0jZGVmaW5lIG91dHNiKHBvcnQsIGJ1ZiwgbnMpICBfb3V0c2IoKHU4ICopKChwb3J0KStwY2lfaW9fYmFzZSksIChidWYpLCAobnMpKQotI2RlZmluZSBvdXRzdyhwb3J0LCBidWYsIG5zKSAgX291dHN3X25zKCh1MTYgKikoKHBvcnQpK3BjaV9pb19iYXNlKSwgKGJ1ZiksIChucykpCi0jZGVmaW5lIG91dHNsKHBvcnQsIGJ1ZiwgbmwpICBfb3V0c2xfbnMoKHUzMiAqKSgocG9ydCkrcGNpX2lvX2Jhc2UpLCAoYnVmKSwgKG5sKSkKKyNkZWZpbmUgb3V0c2IocG9ydCwgYnVmLCBucykgIF9vdXRzYigodTggX19pb21lbSAqKSgocG9ydCkrcGNpX2lvX2Jhc2UpLCAoYnVmKSwgKG5zKSkKKyNkZWZpbmUgb3V0c3cocG9ydCwgYnVmLCBucykgIF9vdXRzd19ucygodTE2IF9faW9tZW0gKikoKHBvcnQpK3BjaV9pb19iYXNlKSwgKGJ1ZiksIChucykpCisjZGVmaW5lIG91dHNsKHBvcnQsIGJ1ZiwgbmwpICBfb3V0c2xfbnMoKHUzMiBfX2lvbWVtICopKChwb3J0KStwY2lfaW9fYmFzZSksIChidWYpLCAobmwpKQogCiAjZW5kaWYKIApAQCAtMTQ3LDE2ICsxNDcsMTYgQEAKICNkZWZpbmUgcmVhZGxfcmVsYXhlZChhZGRyKSByZWFkbChhZGRyKQogI2RlZmluZSByZWFkcV9yZWxheGVkKGFkZHIpIHJlYWRxKGFkZHIpCiAKLWV4dGVybiB2b2lkIF9pbnNiKHZvbGF0aWxlIHU4ICpwb3J0LCB2b2lkICpidWYsIGludCBucyk7Ci1leHRlcm4gdm9pZCBfb3V0c2Iodm9sYXRpbGUgdTggKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG5zKTsKLWV4dGVybiB2b2lkIF9pbnN3KHZvbGF0aWxlIHUxNiAqcG9ydCwgdm9pZCAqYnVmLCBpbnQgbnMpOwotZXh0ZXJuIHZvaWQgX291dHN3KHZvbGF0aWxlIHUxNiAqcG9ydCwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbnMpOwotZXh0ZXJuIHZvaWQgX2luc2wodm9sYXRpbGUgdTMyICpwb3J0LCB2b2lkICpidWYsIGludCBubCk7Ci1leHRlcm4gdm9pZCBfb3V0c2wodm9sYXRpbGUgdTMyICpwb3J0LCBjb25zdCB2b2lkICpidWYsIGludCBubCk7Ci1leHRlcm4gdm9pZCBfaW5zd19ucyh2b2xhdGlsZSB1MTYgKnBvcnQsIHZvaWQgKmJ1ZiwgaW50IG5zKTsKLWV4dGVybiB2b2lkIF9vdXRzd19ucyh2b2xhdGlsZSB1MTYgKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG5zKTsKLWV4dGVybiB2b2lkIF9pbnNsX25zKHZvbGF0aWxlIHUzMiAqcG9ydCwgdm9pZCAqYnVmLCBpbnQgbmwpOwotZXh0ZXJuIHZvaWQgX291dHNsX25zKHZvbGF0aWxlIHUzMiAqcG9ydCwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbmwpOworZXh0ZXJuIHZvaWQgX2luc2Iodm9sYXRpbGUgdTggX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCBpbnQgbnMpOworZXh0ZXJuIHZvaWQgX291dHNiKHZvbGF0aWxlIHU4IF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG5zKTsKK2V4dGVybiB2b2lkIF9pbnN3KHZvbGF0aWxlIHUxNiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGludCBucyk7CitleHRlcm4gdm9pZCBfb3V0c3codm9sYXRpbGUgdTE2IF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG5zKTsKK2V4dGVybiB2b2lkIF9pbnNsKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGludCBubCk7CitleHRlcm4gdm9pZCBfb3V0c2wodm9sYXRpbGUgdTMyIF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG5sKTsKK2V4dGVybiB2b2lkIF9pbnN3X25zKHZvbGF0aWxlIHUxNiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGludCBucyk7CitleHRlcm4gdm9pZCBfb3V0c3dfbnModm9sYXRpbGUgdTE2IF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG5zKTsKK2V4dGVybiB2b2lkIF9pbnNsX25zKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGludCBubCk7CitleHRlcm4gdm9pZCBfb3V0c2xfbnModm9sYXRpbGUgdTMyIF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG5sKTsKIAogI2RlZmluZSBtbWlvd2IoKQogCkBAIC0xNzYsOCArMTc2LDggQEAKICAqIE5laXRoZXIgZG8gdGhlIHN0YW5kYXJkIHZlcnNpb25zIG5vdywgdGhlc2UgYXJlIGp1c3QgaGVyZQogICogZm9yIG9sZGVyIGNvZGUuCiAgKi8KLSNkZWZpbmUgb3V0c3dfbnMocG9ydCwgYnVmLCBucykJX291dHN3X25zKCh1MTYgKikoKHBvcnQpK3BjaV9pb19iYXNlKSwgKGJ1ZiksIChucykpCi0jZGVmaW5lIG91dHNsX25zKHBvcnQsIGJ1ZiwgbmwpCV9vdXRzbF9ucygodTMyICopKChwb3J0KStwY2lfaW9fYmFzZSksIChidWYpLCAobmwpKQorI2RlZmluZSBvdXRzd19ucyhwb3J0LCBidWYsIG5zKQlfb3V0c3dfbnMoKHUxNiBfX2lvbWVtICopKChwb3J0KStwY2lfaW9fYmFzZSksIChidWYpLCAobnMpKQorI2RlZmluZSBvdXRzbF9ucyhwb3J0LCBidWYsIG5sKQlfb3V0c2xfbnMoKHUzMiBfX2lvbWVtICopKChwb3J0KStwY2lfaW9fYmFzZSksIChidWYpLCAobmwpKQogCiAKICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgfigwVUwpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9pcnEuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L2lycS5oCmluZGV4IDU3MDY3OGIuLjk5NzgyYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2lycS5oCkBAIC0zMyw2ICszMywxMSBAQAogI2RlZmluZSBJUlFfUE9MQVJJVFlfUE9TSVRJVkUJMHgyCS8qIGhpZ2ggbGV2ZWwgb3IgbG93LT5oaWdoIGVkZ2UgKi8KICNkZWZpbmUgSVJRX1BPTEFSSVRZX05FR0FUSVZFCTB4MAkvKiBsb3cgbGV2ZWwgb3IgaGlnaC0+bG93IGVkZ2UgKi8KIAorLyoKKyAqIElSUSBsaW5lIHN0YXR1cyBtYWNybyBJUlFfUEVSX0NQVSBpcyB1c2VkCisgKi8KKyNkZWZpbmUgQVJDSF9IQVNfSVJRX1BFUl9DUFUKKwogI2RlZmluZSBnZXRfaXJxX2Rlc2MoaXJxKSAoJmlycV9kZXNjWyhpcnEpXSkKIAogLyogRGVmaW5lIGEgd2F5IHRvIGl0ZXJhdGUgYWNyb3NzIGlycXMuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9rcHJvYmVzLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9rcHJvYmVzLmgKaW5kZXggMDgwMjkxOS4uZDkxMjlkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2twcm9iZXMuaApAQCAtNDIsNiArNDIsOSBAQAogCiAjZGVmaW5lIEpQUk9CRV9FTlRSWShwZW50cnkpCShrcHJvYmVfb3Bjb2RlX3QgKikoKGZ1bmNfZGVzY3JfdCAqKXBlbnRyeSkKIAorI2RlZmluZSBpc190cmFwKGluc3RyKQkoSVNfVFcoaW5zdHIpIHx8IElTX1REKGluc3RyKSB8fCBcCisJCQlJU19UV0koaW5zdHIpIHx8IElTX1RESShpbnN0cikpCisKICNkZWZpbmUgQVJDSF9TVVBQT1JUU19LUkVUUFJPQkVTCiB2b2lkIGtyZXRwcm9iZV90cmFtcG9saW5lKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9sbWIuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L2xtYi5oCmluZGV4IGNiMzY4YmYuLmRlOTFlMDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L2xtYi5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2xtYi5oCkBAIC01Niw0ICs1NiwyNiBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBpb19ob2xlX3N0YXJ0OwogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK2xtYl9zaXplX2J5dGVzKHN0cnVjdCBsbWJfcmVnaW9uICp0eXBlLCB1bnNpZ25lZCBsb25nIHJlZ2lvbl9ucikKK3sKKwlyZXR1cm4gdHlwZS0+cmVnaW9uW3JlZ2lvbl9ucl0uc2l6ZTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworbG1iX3NpemVfcGFnZXMoc3RydWN0IGxtYl9yZWdpb24gKnR5cGUsIHVuc2lnbmVkIGxvbmcgcmVnaW9uX25yKQoreworCXJldHVybiBsbWJfc2l6ZV9ieXRlcyh0eXBlLCByZWdpb25fbnIpID4+IFBBR0VfU0hJRlQ7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK2xtYl9zdGFydF9wZm4oc3RydWN0IGxtYl9yZWdpb24gKnR5cGUsIHVuc2lnbmVkIGxvbmcgcmVnaW9uX25yKQoreworCXJldHVybiB0eXBlLT5yZWdpb25bcmVnaW9uX25yXS5iYXNlID4+IFBBR0VfU0hJRlQ7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK2xtYl9lbmRfcGZuKHN0cnVjdCBsbWJfcmVnaW9uICp0eXBlLCB1bnNpZ25lZCBsb25nIHJlZ2lvbl9ucikKK3sKKwlyZXR1cm4gbG1iX3N0YXJ0X3Bmbih0eXBlLCByZWdpb25fbnIpICsKKwkgICAgICAgbG1iX3NpemVfcGFnZXModHlwZSwgcmVnaW9uX25yKTsKK30KKwogI2VuZGlmIC8qIF9QUEM2NF9MTUJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvbHBwYWNhLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9scHBhY2EuaAppbmRleCA3MDc2NmI1Li45ZTJhNmMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9scHBhY2EuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9scHBhY2EuaApAQCAtMTA4LDcgKzEwOCw3IEBACiAJdm9sYXRpbGUgdTMyIHZpcnR1YWxfZGVjcjsJLy8gVmlydHVhbCBERUNSIGZvciBzaGFyZWQgcHJvY3N4NzgteDdCCiAJdTE2CXNsYl9jb3VudDsJCS8vICMgb2YgU0xCcyB0byBtYWludGFpbiAgICAgICAgeDdDLXg3RAogCXU4CWlkbGU7CQkJLy8gSW5kaWNhdGUgT1MgaXMgaWRsZSAgICAgICAgICB4N0UKLQl1OAlyZXNlcnZlZDU7CQkvLyBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgIHg3RgorCXU4CXZteHJlZ3NfaW5fdXNlOwkJLy8gVk1YIHJlZ2lzdGVycyBpbiB1c2UgICAgICAgICB4N0YKIAogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9tYWNoZGVwLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9tYWNoZGVwLmgKaW5kZXggZmYyYzkyOC4uOWExZWY0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvbWFjaGRlcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L21hY2hkZXAuaApAQCAtMTAzLDExICsxMDMsNiBAQAogCiAJdm9pZAkJKCpwcm9ncmVzcykoY2hhciAqLCB1bnNpZ25lZCBzaG9ydCk7CiAKLQkvKiBEZWJ1ZyBpbnRlcmZhY2UuICBMb3cgbGV2ZWwgSS9PIHRvIHNvbWUgdGVybWluYWwgZGV2aWNlICovCi0Jdm9pZAkJKCp1ZGJnX3B1dGMpKHVuc2lnbmVkIGNoYXIgYyk7Ci0JdW5zaWduZWQgY2hhcgkoKnVkYmdfZ2V0Yykodm9pZCk7Ci0JaW50CQkoKnVkYmdfZ2V0Y19wb2xsKSh2b2lkKTsKLQogCS8qIEludGVyZmFjZSBmb3IgcGxhdGZvcm0gZXJyb3IgbG9nZ2luZyAqLwogCXZvaWQgCQkoKmxvZ19lcnJvcikoY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgZXJyX3R5cGUsIGludCBmYXRhbCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L21lbW9yeS5oIGIvaW5jbHVkZS9hc20tcHBjNjQvbWVtb3J5LmgKaW5kZXggNTZlMDlmYS4uYWY1M2ZmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvbWVtb3J5LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvbWVtb3J5LmgKQEAgLTE4LDkgKzE4LDExIEBACiAjaWZkZWYgQ09ORklHX1NNUAogI2RlZmluZSBFSUVJT19PTl9TTVAJImVpZWlvXG4iCiAjZGVmaW5lIElTWU5DX09OX1NNUAkiXG5cdGlzeW5jIgorI2RlZmluZSBTWU5DX09OX1NNUAkibHdzeW5jXG5cdCIKICNlbHNlCiAjZGVmaW5lIEVJRUlPX09OX1NNUAogI2RlZmluZSBJU1lOQ19PTl9TTVAKKyNkZWZpbmUgU1lOQ19PTl9TTVAKICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHZvaWQgZWllaW8odm9pZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L21tdS5oIGIvaW5jbHVkZS9hc20tcHBjNjQvbW11LmgKaW5kZXggYWQzNmJiMi4uN2JjNDJlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvbW11LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvbW11LmgKQEAgLTU0LDggKzU0LDEwIEBACiAjZGVmaW5lIFNMQl9WU0lEX0MJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwODApIC8qIGNsYXNzICovCiAjZGVmaW5lIFNMQl9WU0lEX0xTCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDcwKSAvKiBzaXplIG9mIGxhcmdlcGFnZSAqLwogIAotI2RlZmluZSBTTEJfVlNJRF9LRVJORUwJCShTTEJfVlNJRF9LUHxTTEJfVlNJRF9DKQotI2RlZmluZSBTTEJfVlNJRF9VU0VSCQkoU0xCX1ZTSURfS1B8U0xCX1ZTSURfS1MpCisjZGVmaW5lIFNMQl9WU0lEX0tFUk5FTAkJKFNMQl9WU0lEX0tQKQorI2RlZmluZSBTTEJfVlNJRF9VU0VSCQkoU0xCX1ZTSURfS1B8U0xCX1ZTSURfS1N8U0xCX1ZTSURfQykKKworI2RlZmluZSBTTEJJRV9DCQkJKDB4MDgwMDAwMDApCiAKIC8qCiAgKiBIYXNoIHRhYmxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9tb2R1bGUuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L21vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTgxNjA3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L21vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1BQQzY0X01PRFVMRV9ICi0jZGVmaW5lIF9BU01fUFBDNjRfTU9EVUxFX0gKLQotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxhc20vYnVnLmg+Ci0KLXN0cnVjdCBtb2RfYXJjaF9zcGVjaWZpYwotewotCS8qIEluZGV4IG9mIHN0dWJzIHNlY3Rpb24gd2l0aGluIG1vZHVsZS4gKi8KLQl1bnNpZ25lZCBpbnQgc3R1YnNfc2VjdGlvbjsKLQotCS8qIFdoYXQgc2VjdGlvbiBpcyB0aGUgVE9DPyAqLwotCXVuc2lnbmVkIGludCB0b2Nfc2VjdGlvbjsKLQotCS8qIExpc3Qgb2YgQlVHIGFkZHJlc3Nlcywgc291cmNlIGxpbmUgbnVtYmVycyBhbmQgZmlsZW5hbWVzICovCi0Jc3RydWN0IGxpc3RfaGVhZCBidWdfbGlzdDsKLQlzdHJ1Y3QgYnVnX2VudHJ5ICpidWdfdGFibGU7Ci0JdW5zaWduZWQgaW50IG51bV9idWdzOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBidWdfZW50cnkgKm1vZHVsZV9maW5kX2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z2FkZHIpOwotCi0jZGVmaW5lIEVsZl9TaGRyIEVsZjY0X1NoZHIKLSNkZWZpbmUgRWxmX1N5bSBFbGY2NF9TeW0KLSNkZWZpbmUgRWxmX0VoZHIgRWxmNjRfRWhkcgotCi0vKiBNYWtlIGVtcHR5IHNlY3Rpb24gZm9yIG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMgdG8gZXhwYW5kLiAqLwotI2lmZGVmIE1PRFVMRQotYXNtKCIuc2VjdGlvbiAuc3R1YnMsXCJheFwiLEBub2JpdHM7IC5hbGlnbiAzOyAucHJldmlvdXMiKTsKLSNlbmRpZgotCi1zdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5Owotdm9pZCBzb3J0X2V4X3RhYmxlKHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKnN0YXJ0LAotCQkJc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZmluaXNoKTsKLQotI2VuZGlmIC8qIF9BU01fUFBDNjRfTU9EVUxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L21zZ2J1Zi5oIGIvaW5jbHVkZS9hc20tcHBjNjQvbXNnYnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYzFjYmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvbXNnYnVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jaWZuZGVmIF9QUEM2NF9NU0dCVUZfSAotI2RlZmluZSBfUFBDNjRfTVNHQlVGX0gKLQotLyogCi0gKiBUaGUgbXNxaWQ2NF9kcyBzdHJ1Y3R1cmUgZm9yIHRoZSBQUEMgYXJjaGl0ZWN0dXJlLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotc3RydWN0IG1zcWlkNjRfZHMgewotCXN0cnVjdCBpcGM2NF9wZXJtIG1zZ19wZXJtOwotCV9fa2VybmVsX3RpbWVfdCBtc2dfc3RpbWU7CS8qIGxhc3QgbXNnc25kIHRpbWUgKi8KLQlfX2tlcm5lbF90aW1lX3QgbXNnX3J0aW1lOwkvKiBsYXN0IG1zZ3JjdiB0aW1lICovCi0JX19rZXJuZWxfdGltZV90IG1zZ19jdGltZTsJLyogbGFzdCBjaGFuZ2UgdGltZSAqLwotCXVuc2lnbmVkIGxvbmcgIG1zZ19jYnl0ZXM7CS8qIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIG9uIHF1ZXVlICovCi0JdW5zaWduZWQgbG9uZyAgbXNnX3FudW07CS8qIG51bWJlciBvZiBtZXNzYWdlcyBpbiBxdWV1ZSAqLwotCXVuc2lnbmVkIGxvbmcgIG1zZ19xYnl0ZXM7CS8qIG1heCBudW1iZXIgb2YgYnl0ZXMgb24gcXVldWUgKi8KLQlfX2tlcm5lbF9waWRfdCBtc2dfbHNwaWQ7CS8qIHBpZCBvZiBsYXN0IG1zZ3NuZCAqLwotCV9fa2VybmVsX3BpZF90IG1zZ19scnBpZDsJLyogbGFzdCByZWNlaXZlIHBpZCAqLwotCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkMTsKLQl1bnNpZ25lZCBsb25nICBfX3VudXNlZDI7Ci19OwotCi0jZW5kaWYgLyogX1BQQzY0X01TR0JVRl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L29wcm9maWxlL29wX2ltcGwuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L29wcm9maWxlX2ltcGwuaApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBhcmNoL3BwYzY0L29wcm9maWxlL29wX2ltcGwuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tcHBjNjQvb3Byb2ZpbGVfaW1wbC5oCmluZGV4IDdmYTdlYWEuLmIwNGYxZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvb3Byb2ZpbGUvb3BfaW1wbC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L29wcm9maWxlX2ltcGwuaApAQCAtNDksNiArNDksOSBAQAogCWludCBudW1fY291bnRlcnM7CiB9OwogCitleHRlcm4gc3RydWN0IG9wX3BwYzY0X21vZGVsIG9wX21vZGVsX3JzNjQ7CitleHRlcm4gc3RydWN0IG9wX3BwYzY0X21vZGVsIG9wX21vZGVsX3Bvd2VyNDsKKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3RyX3JlYWQodW5zaWduZWQgaW50IGkpCiB7CiAJc3dpdGNoKGkpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3BhZ2UuaAppbmRleCBhNzlhMDhkLi5hMTU0MjJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvcGFnZS5oCkBAIC0xNzIsMjAgKzE3Miw2IEBACiAKICNlbmRpZgogCi0vKiBQdXJlIDJebiB2ZXJzaW9uIG9mIGdldF9vcmRlciAqLwotc3RhdGljIGlubGluZSBpbnQgZ2V0X29yZGVyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpbnQgb3JkZXI7Ci0KLQlzaXplID0gKHNpemUtMSkgPj4gKFBBR0VfU0hJRlQtMSk7Ci0Jb3JkZXIgPSAtMTsKLQlkbyB7Ci0JCXNpemUgPj49IDE7Ci0JCW9yZGVyKys7Ci0JfSB3aGlsZSAoc2l6ZSk7Ci0JcmV0dXJuIG9yZGVyOwotfQotCiAjZGVmaW5lIF9fcGEoeCkgKCh1bnNpZ25lZCBsb25nKSh4KS1QQUdFX09GRlNFVCkKIAogZXh0ZXJuIGludCBwYWdlX2lzX3JhbSh1bnNpZ25lZCBsb25nIHBmbik7CkBAIC0yNzAsNCArMjU2LDcgQEAKIAkgVk1fU1RBQ0tfREVGQVVMVF9GTEFHUzMyIDogVk1fU1RBQ0tfREVGQVVMVF9GTEFHUzY0KQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgorCiAjZW5kaWYgLyogX1BQQzY0X1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvcGFyYW0uaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3BhcmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YzIxMmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvcGFyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNpZm5kZWYgX0FTTV9QUEM2NF9QQVJBTV9ICi0jZGVmaW5lIF9BU01fUFBDNjRfUEFSQU1fSAotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jIGRlZmluZSBIWgkJQ09ORklHX0haCS8qIEludGVybmFsIGtlcm5lbCB0aW1lciBmcmVxdWVuY3kgKi8KLSMgZGVmaW5lIFVTRVJfSFoJMTAwCQkvKiAuLiBzb21lIHVzZXIgaW50ZXJmYWNlcyBhcmUgaW4gInRpY2tzIiAqLwotIyBkZWZpbmUgQ0xPQ0tTX1BFUl9TRUMJKFVTRVJfSFopCS8qIGxpa2UgdGltZXMoKSAqLwotI2VuZGlmCi0KLSNpZm5kZWYgSFoKLSNkZWZpbmUgSFogMTAwCi0jZW5kaWYKLQotI2RlZmluZSBFWEVDX1BBR0VTSVpFCTQwOTYKLQotI2lmbmRlZiBOT0dST1VQCi0jZGVmaW5lIE5PR1JPVVAJCSgtMSkKLSNlbmRpZgotCi0jZGVmaW5lIE1BWEhPU1ROQU1FTEVOCTY0CS8qIG1heCBsZW5ndGggb2YgaG9zdG5hbWUgKi8KLQotI2VuZGlmIC8qIF9BU01fUFBDNjRfUEFSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvcGNpLWJyaWRnZS5oIGIvaW5jbHVkZS9hc20tcHBjNjQvcGNpLWJyaWRnZS5oCmluZGV4IGM0ZjkwMjMuLjZiNGE1YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3BjaS1icmlkZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9wY2ktYnJpZGdlLmgKQEAgLTQ4LDE5ICs0OCw1MiBAQAogCXVuc2lnbmVkIGxvbmcgZG1hX3dpbmRvd19zaXplOwogfTsKIAorLyoKKyAqIFBDSSBzdHVmZiwgZm9yIG5vZGVzIHJlcHJlc2VudGluZyBQQ0kgZGV2aWNlcywgcG9pbnRlZCB0bworICogYnkgZGV2aWNlX25vZGUtPmRhdGEuCisgKi8KK3N0cnVjdCBwY2lfY29udHJvbGxlcjsKK3N0cnVjdCBpb21tdV90YWJsZTsKKworc3RydWN0IHBjaV9kbiB7CisJaW50CWJ1c25vOwkJCS8qIGZvciBwY2kgZGV2aWNlcyAqLworCWludAlidXNzdWJubzsJCS8qIGZvciBwY2kgZGV2aWNlcyAqLworCWludAlkZXZmbjsJCQkvKiBmb3IgcGNpIGRldmljZXMgKi8KKwlpbnQJZWVoX21vZGU7CQkvKiBTZWUgZWVoLmggZm9yIHBvc3NpYmxlIEVFSF9NT0RFcyAqLworCWludAllZWhfY29uZmlnX2FkZHI7CisJaW50CWVlaF9jYXBhYmxlOwkJLyogZnJvbSBmaXJtd2FyZSAqLworCWludCAJZWVoX2NoZWNrX2NvdW50OwkvKiAjIHRpbWVzIGRyaXZlciBpZ25vcmVkIGVycm9yICovCisJaW50IAllZWhfZnJlZXplX2NvdW50OwkvKiAjIHRpbWVzIHRoaXMgZGV2aWNlIGZyb3plIHVwLiAqLworCWludAllZWhfaXNfYnJpZGdlOwkJLyogZGV2aWNlIGlzIHBjaS10by1wY2kgYnJpZGdlICovCisKKwlpbnQJcGNpX2V4dF9jb25maWdfc3BhY2U7CS8qIGZvciBwY2kgZGV2aWNlcyAqLworCXN0cnVjdCAgcGNpX2NvbnRyb2xsZXIgKnBoYjsJLyogZm9yIHBjaSBkZXZpY2VzICovCisJc3RydWN0CWlvbW11X3RhYmxlICppb21tdV90YWJsZTsJLyogZm9yIHBoYidzIG9yIGJyaWRnZXMgKi8KKwlzdHJ1Y3QJcGNpX2RldiAqcGNpZGV2OwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIHBjaSBkZXZpY2UgKi8KKwlzdHJ1Y3QJZGV2aWNlX25vZGUgKm5vZGU7CS8qIGJhY2stcG9pbnRlciB0byB0aGUgZGV2aWNlX25vZGUgKi8KKwl1MzIJY29uZmlnX3NwYWNlWzE2XTsJLyogc2F2ZWQgUENJIGNvbmZpZyBzcGFjZSAqLworfTsKKworLyogR2V0IHRoZSBwb2ludGVyIHRvIGEgZGV2aWNlX25vZGUncyBwY2lfZG4gKi8KKyNkZWZpbmUgUENJX0ROKGRuKQkoKHN0cnVjdCBwY2lfZG4gKikgKGRuKS0+ZGF0YSkKKwogc3RydWN0IGRldmljZV9ub2RlICpmZXRjaF9kZXZfZG4oc3RydWN0IHBjaV9kZXYgKmRldik7CiAKLS8qIEdldCBhIGRldmljZV9ub2RlIGZyb20gYSBwY2lfZGV2LiAgVGhpcyBjb2RlIG11c3QgYmUgZmFzdCBleGNlcHQgaW4gdGhlIGNhc2UKLSAqIHdoZXJlIHRoZSBzeXNkYXRhIGlzIGluY29ycmVjdCBhbmQgbmVlZHMgdG8gYmUgZml4ZWQgdXAgKGhvcGVmdWxseSBqdXN0IG9uY2UpCisvKiBHZXQgYSBkZXZpY2Vfbm9kZSBmcm9tIGEgcGNpX2Rldi4gIFRoaXMgY29kZSBtdXN0IGJlIGZhc3QgZXhjZXB0CisgKiBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3lzZGF0YSBpcyBpbmNvcnJlY3QgYW5kIG5lZWRzIHRvIGJlIGZpeGVkCisgKiB1cCAodGhpcyB3aWxsIG9ubHkgaGFwcGVuIG9uY2UpLgorICogSW4gdGhpcyBjYXNlIHRoZSBzeXNkYXRhIHdpbGwgaGF2ZSBiZWVuIGluaGVyaXRlZCBmcm9tIGEgUENJIGhvc3QKKyAqIGJyaWRnZSBvciBhIFBDSS1QQ0kgYnJpZGdlIGZ1cnRoZXIgdXAgdGhlIHRyZWUsIHNvIGl0IHdpbGwgcG9pbnQKKyAqIHRvIGEgdmFsaWQgc3RydWN0IHBjaV9kbiwganVzdCBub3QgdGhlIG9uZSB3ZSB3YW50LgogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpX2RldmljZV90b19PRl9ub2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IGRldi0+c3lzZGF0YTsKKwlzdHJ1Y3QgcGNpX2RuICpwZG4gPSBkbi0+ZGF0YTsKIAotCWlmIChkbi0+ZGV2Zm4gPT0gZGV2LT5kZXZmbiAmJiBkbi0+YnVzbm8gPT0gZGV2LT5idXMtPm51bWJlcikKKwlpZiAocGRuICYmIHBkbi0+ZGV2Zm4gPT0gZGV2LT5kZXZmbiAmJiBwZG4tPmJ1c25vID09IGRldi0+YnVzLT5udW1iZXIpCiAJCXJldHVybiBkbjsJLyogZmFzdCBwYXRoLiAgc3lzZGF0YSBpcyBnb29kICovCi0JZWxzZQotCQlyZXR1cm4gZmV0Y2hfZGV2X2RuKGRldik7CisJcmV0dXJuIGZldGNoX2Rldl9kbihkZXYpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpX2J1c190b19PRl9ub2RlKHN0cnVjdCBwY2lfYnVzICpidXMpCkBAIC04Myw3ICsxMTYsNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYnVzZG4gPSBidXMtPnN5c2RhdGE7CiAKIAlCVUdfT04oYnVzZG4gPT0gTlVMTCk7Ci0JcmV0dXJuIGJ1c2RuLT5waGI7CisJcmV0dXJuIFBDSV9ETihidXNkbiktPnBoYjsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9wY2kuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3BjaS5oCmluZGV4IDRkMDU3NDUuLmE4OGJiZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L3BjaS5oCkBAIC0xMzgsNiArMTM4LDE5IEBACiBwY2liaW9zX2J1c190b19yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKIAkJCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uKTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVzb3VyY2UgKgorcGNpYmlvc19zZWxlY3Rfcm9vdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJc3RydWN0IHJlc291cmNlICpyb290ID0gTlVMTDsKKworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJcm9vdCA9ICZpb3BvcnRfcmVzb3VyY2U7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJcm9vdCA9ICZpb21lbV9yZXNvdXJjZTsKKworCXJldHVybiByb290OworfQorCiBleHRlcm4gaW50CiB1bm1hcF9idXNfcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tcHBjNjQvcHJvY2Vzc29yLmgKaW5kZXggN2JkNDc5Ni4uOGJkN2FhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvcHJvY2Vzc29yLmgKQEAgLTMxMSw2ICszMTEsMjAgQEAKIAkudHlwZSBHTFVFKC4sbmFtZSksQGZ1bmN0aW9uOyBcCiBHTFVFKC4sbmFtZSk6CiAKKyNkZWZpbmUgX0tQUk9CRShuYW1lKSBcCisJLnNlY3Rpb24gIi5rcHJvYmVzLnRleHQiLCJhIjsgXAorCS5hbGlnbiAyIDsgXAorCS5nbG9ibCBuYW1lOyBcCisJLmdsb2JsIEdMVUUoLixuYW1lKTsgXAorCS5zZWN0aW9uICIub3BkIiwiYXciOyBcCituYW1lOiBcCisJLnF1YWQgR0xVRSguLG5hbWUpOyBcCisJLnF1YWQgLlRPQy5AdG9jYmFzZTsgXAorCS5xdWFkIDA7IFwKKwkucHJldmlvdXM7IFwKKwkudHlwZSBHTFVFKC4sbmFtZSksQGZ1bmN0aW9uOyBcCitHTFVFKC4sbmFtZSk6CisKICNkZWZpbmUgX1NUQVRJQyhuYW1lKSBcCiAJLnNlY3Rpb24gIi50ZXh0IjsgXAogCS5hbGlnbiAyIDsgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvcHJvbS5oIGIvaW5jbHVkZS9hc20tcHBjNjQvcHJvbS5oCmluZGV4IGRjNTMzMGIuLmMwMmVjMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3Byb20uaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9wcm9tLmgKQEAgLTExNiwxNCArMTE2LDYgQEAKIAlzdHJ1Y3QgcHJvcGVydHkgKm5leHQ7CiB9OwogCi0vKiBOT1RFOiB0aGUgZGV2aWNlX25vZGUgY29udGFpbnMgUENJIHNwZWNpZmljIGluZm8gZm9yIHBjaSBkZXZpY2VzLgotICogVGhpcyBwZXJoYXBzIGNvdWxkIGJlIGh1bmcgb2ZmIHRoZSBkZXZpY2Vfbm9kZSB3aXRoIGFub3RoZXIgc3RydWN0LAotICogYnV0IGZvciBub3cgaXQgaXMgZGlyZWN0bHkgaW4gdGhlIG5vZGUuICBUaGUgcGhiIHB0ciBpcyBhIGdvb2QKLSAqIGluZGljYXRpb24gb2YgYSByZWFsIFBDSSBub2RlLiAgT3RoZXIgbm9kZXMgbGVhdmUgdGhlc2UgZmllbGRzIHplcm9lZC4KLSAqLwotc3RydWN0IHBjaV9jb250cm9sbGVyOwotc3RydWN0IGlvbW11X3RhYmxlOwotCiBzdHJ1Y3QgZGV2aWNlX25vZGUgewogCWNoYXIJKm5hbWU7CiAJY2hhcgkqdHlwZTsKQEAgLTEzNSwxNiArMTI3LDYgQEAKIAlzdHJ1Y3QJaW50ZXJydXB0X2luZm8gKmludHJzOwogCWNoYXIJKmZ1bGxfbmFtZTsKIAotCS8qIFBDSSBzdHVmZiBwcm9iYWJseSBkb2Vzbid0IGJlbG9uZyBoZXJlICovCi0JaW50CWJ1c25vOwkJCS8qIGZvciBwY2kgZGV2aWNlcyAqLwotCWludAlidXNzdWJubzsJCS8qIGZvciBwY2kgZGV2aWNlcyAqLwotCWludAlkZXZmbjsJCQkvKiBmb3IgcGNpIGRldmljZXMgKi8KLQlpbnQJZWVoX21vZGU7CQkvKiBTZWUgZWVoLmggZm9yIHBvc3NpYmxlIEVFSF9NT0RFcyAqLwotCWludAllZWhfY29uZmlnX2FkZHI7Ci0JaW50CXBjaV9leHRfY29uZmlnX3NwYWNlOwkvKiBmb3IgcGNpIGRldmljZXMgKi8KLQlzdHJ1Y3QgIHBjaV9jb250cm9sbGVyICpwaGI7CS8qIGZvciBwY2kgZGV2aWNlcyAqLwotCXN0cnVjdAlpb21tdV90YWJsZSAqaW9tbXVfdGFibGU7CS8qIGZvciBwaGIncyBvciBicmlkZ2VzICovCi0KIAlzdHJ1Y3QJcHJvcGVydHkgKnByb3BlcnRpZXM7CiAJc3RydWN0CWRldmljZV9ub2RlICpwYXJlbnQ7CiAJc3RydWN0CWRldmljZV9ub2RlICpjaGlsZDsKQEAgLTE1NCw2ICsxMzYsNyBAQAogCXN0cnVjdCAgcHJvY19kaXJfZW50cnkgKnBkZTsJLyogdGhpcyBub2RlJ3MgcHJvYyBkaXJlY3RvcnkgKi8KIAlzdHJ1Y3QgIGtyZWYga3JlZjsKIAl1bnNpZ25lZCBsb25nIF9mbGFnczsKKwl2b2lkCSpkYXRhOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfY2hvc2VuOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvc2VnbWVudC5oIGIvaW5jbHVkZS9hc20tcHBjNjQvc2VnbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBmYjY4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3NlZ21lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfX1BQQzY0X1NFR01FTlRfSAotI2RlZmluZSBfX1BQQzY0X1NFR01FTlRfSAotCi0vKiBPbmx5IGhlcmUgYmVjYXVzZSB3ZSBoYXZlIHNvbWUgb2xkIGhlYWRlciBmaWxlcyB0aGF0IGV4cGVjdCBpdC4uICovCi0KLSNlbmRpZiAvKiBfX1BQQzY0X1NFR01FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvc2V0dXAuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3NldHVwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNTdiODMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvc2V0dXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfUFBDX1NFVFVQX0gKLSNkZWZpbmUgX1BQQ19TRVRVUF9ICi0KLSNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUgNTEyCi0KLSNlbmRpZiAvKiBfUFBDX1NFVFVQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3NpZ2luZm8uaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3NpZ2luZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E3YzIzZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9zaWdpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jaWZuZGVmIF9QUEM2NF9TSUdJTkZPX0gKLSNkZWZpbmUgX1BQQzY0X1NJR0lORk9fSAotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jZGVmaW5lIF9fQVJDSF9TSV9QUkVBTUJMRV9TSVpFCSg0ICogc2l6ZW9mKGludCkpCi0jZGVmaW5lIFNJX1BBRF9TSVpFMzIJCSgoU0lfTUFYX1NJWkUvc2l6ZW9mKGludCkpIC0gMykKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ2luZm8uaD4KLQotI2VuZGlmIC8qIF9QUEM2NF9TSUdJTkZPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9zcGlubG9jay5oCmluZGV4IGFjZDExNTYuLjE0Y2I4OTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvc3BpbmxvY2suaApAQCAtMTUsMzYgKzE1LDQyIEBACiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICh0aGUgdHlwZSBkZWZpbml0aW9ucyBhcmUgaW4gYXNtL3NwaW5sb2NrX3R5cGVzLmgpCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vcGFjYS5oPgogI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KICNpbmNsdWRlIDxhc20vaVNlcmllcy9IdkNhbGwuaD4KIAotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gc3BpbmxvY2tfdDsKKyNkZWZpbmUgX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkJCSgoeCktPnNsb2NrICE9IDApCiAKLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSBzaWduZWQgaW50IGxvY2s7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VECShzcGlubG9ja190KSB7IDAgfQotCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpCSgoeCktPmxvY2sgIT0gMCkKLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQoeCkJZG8geyAqKHgpID0gU1BJTl9MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX3Jhd19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQorLyoKKyAqIFRoaXMgcmV0dXJucyB0aGUgb2xkIHZhbHVlIGluIHRoZSBsb2NrLCBzbyB3ZSBzdWNjZWVkZWQKKyAqIGluIGdldHRpbmcgdGhlIGxvY2sgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyAwLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIF9fc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsd3N5bmMJIyBzcGluX3VubG9jayI6IDogOiJtZW1vcnkiKTsKLQlsb2NrLT5sb2NrID0gMDsKKwl1bnNpZ25lZCBsb25nIHRtcCwgdG1wMjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorIglsd3oJCSUxLCUzKDEzKQkJIyBfX3NwaW5fdHJ5bG9ja1xuXAorMToJbHdhcngJCSUwLDAsJTJcblwKKwljbXB3aQkJMCwlMCwwXG5cCisJYm5lLQkJMmZcblwKKwlzdHdjeC4JCSUxLDAsJTJcblwKKwlibmUtCQkxYlxuXAorCWlzeW5jXG5cCisyOiIJOiAiPSZyIiAodG1wKSwgIj0mciIgKHRtcDIpCisJOiAiciIgKCZsb2NrLT5zbG9jayksICJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBsb2NrX3Rva2VuKSkKKwk6ICJjcjAiLCAibWVtb3J5Iik7CisKKwlyZXR1cm4gdG1wOworfQorCitzdGF0aWMgaW50IF9faW5saW5lX18gX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCXJldHVybiBfX3NwaW5fdHJ5bG9jayhsb2NrKSA9PSAwOwogfQogCiAvKgpAQCAtNjQsNDQgKzcwLDE1IEBACiAjaWYgZGVmaW5lZChDT05GSUdfUFBDX1NQTFBBUikgfHwgZGVmaW5lZChDT05GSUdfUFBDX0lTRVJJRVMpCiAvKiBXZSBvbmx5IHlpZWxkIHRvIHRoZSBoeXBlcnZpc29yIGlmIHdlIGFyZSBpbiBzaGFyZWQgcHJvY2Vzc29yIG1vZGUgKi8KICNkZWZpbmUgU0hBUkVEX1BST0NFU1NPUiAoZ2V0X3BhY2EoKS0+bHBwYWNhLnNoYXJlZF9wcm9jKQotZXh0ZXJuIHZvaWQgX19zcGluX3lpZWxkKHNwaW5sb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgX19yd195aWVsZChyd2xvY2tfdCAqbG9jayk7CitleHRlcm4gdm9pZCBfX3NwaW5feWllbGQocmF3X3NwaW5sb2NrX3QgKmxvY2spOworZXh0ZXJuIHZvaWQgX19yd195aWVsZChyYXdfcndsb2NrX3QgKmxvY2spOwogI2Vsc2UgLyogU1BMUEFSIHx8IElTRVJJRVMgKi8KICNkZWZpbmUgX19zcGluX3lpZWxkKHgpCWJhcnJpZXIoKQogI2RlZmluZSBfX3J3X3lpZWxkKHgpCWJhcnJpZXIoKQogI2RlZmluZSBTSEFSRURfUFJPQ0VTU09SCTAKICNlbmRpZgotZXh0ZXJuIHZvaWQgc3Bpbl91bmxvY2tfd2FpdChzcGlubG9ja190ICpsb2NrKTsKIAotLyoKLSAqIFRoaXMgcmV0dXJucyB0aGUgb2xkIHZhbHVlIGluIHRoZSBsb2NrLCBzbyB3ZSBzdWNjZWVkZWQKLSAqIGluIGdldHRpbmcgdGhlIGxvY2sgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyAwLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIF9fc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2spCi17Ci0JdW5zaWduZWQgbG9uZyB0bXAsIHRtcDI7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLSIJbHd6CQklMSwlMygxMykJCSMgX19zcGluX3RyeWxvY2tcblwKLTE6CWx3YXJ4CQklMCwwLCUyXG5cCi0JY21wd2kJCTAsJTAsMFxuXAotCWJuZS0JCTJmXG5cCi0Jc3R3Y3guCQklMSwwLCUyXG5cCi0JYm5lLQkJMWJcblwKLQlpc3luY1xuXAotMjoiCTogIj0mciIgKHRtcCksICI9JnIiICh0bXAyKQotCTogInIiICgmbG9jay0+bG9jayksICJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBsb2NrX3Rva2VuKSkKLQk6ICJjcjAiLCAibWVtb3J5Iik7Ci0KLQlyZXR1cm4gdG1wOwotfQotCi1zdGF0aWMgaW50IF9faW5saW5lX18gX3Jhd19zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlyZXR1cm4gX19zcGluX3RyeWxvY2sobG9jaykgPT0gMDsKLX0KLQotc3RhdGljIHZvaWQgX19pbmxpbmVfXyBfcmF3X3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIHZvaWQgX19pbmxpbmVfXyBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJd2hpbGUgKDEpIHsKIAkJaWYgKGxpa2VseShfX3NwaW5fdHJ5bG9jayhsb2NrKSA9PSAwKSkKQEAgLTExMCwxMiArODcsMTIgQEAKIAkJCUhNVF9sb3coKTsKIAkJCWlmIChTSEFSRURfUFJPQ0VTU09SKQogCQkJCV9fc3Bpbl95aWVsZChsb2NrKTsKLQkJfSB3aGlsZSAodW5saWtlbHkobG9jay0+bG9jayAhPSAwKSk7CisJCX0gd2hpbGUgKHVubGlrZWx5KGxvY2stPnNsb2NrICE9IDApKTsKIAkJSE1UX21lZGl1bSgpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbmxpbmVfXyBfcmF3X3NwaW5fbG9ja19mbGFncyhzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgX19pbmxpbmVfXyBfX3Jhd19zcGluX2xvY2tfZmxhZ3MocmF3X3NwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnc19kaXM7CiAKQEAgLTEyOCwxMiArMTA1LDIwIEBACiAJCQlITVRfbG93KCk7CiAJCQlpZiAoU0hBUkVEX1BST0NFU1NPUikKIAkJCQlfX3NwaW5feWllbGQobG9jayk7Ci0JCX0gd2hpbGUgKHVubGlrZWx5KGxvY2stPmxvY2sgIT0gMCkpOworCQl9IHdoaWxlICh1bmxpa2VseShsb2NrLT5zbG9jayAhPSAwKSk7CiAJCUhNVF9tZWRpdW0oKTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3NfZGlzKTsKIAl9CiB9CiAKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oImx3c3luYwkjIF9fcmF3X3NwaW5fdW5sb2NrIjogOiA6Im1lbW9yeSIpOworCWxvY2stPnNsb2NrID0gMDsKK30KKworZXh0ZXJuIHZvaWQgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChyYXdfc3BpbmxvY2tfdCAqbG9jayk7CisKIC8qCiAgKiBSZWFkLXdyaXRlIHNwaW5sb2NrcywgYWxsb3dpbmcgbXVsdGlwbGUgcmVhZGVycwogICogYnV0IG9ubHkgb25lIHdyaXRlci4KQEAgLTE0NCwyNCArMTI5LDE1IEBACiAgKiBpcnEtc2FmZSB3cml0ZS1sb2NrLCBidXQgcmVhZGVycyBjYW4gZ2V0IG5vbi1pcnFzYWZlCiAgKiByZWFkLWxvY2tzLgogICovCi0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQgKHJ3bG9ja190KSB7IDAgfQogCi0jZGVmaW5lIHJ3bG9ja19pbml0KHgpCQlkbyB7ICooeCkgPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0KLSNkZWZpbmUgcmVhZF9jYW5fbG9jayhydykJKChydyktPmxvY2sgPj0gMCkKLSNkZWZpbmUgd3JpdGVfY2FuX2xvY2socncpCSghKHJ3KS0+bG9jaykKLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBfcmF3X3dyaXRlX3VubG9jayhyd2xvY2tfdCAqcncpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oImx3c3luYwkJIyB3cml0ZV91bmxvY2siOiA6IDoibWVtb3J5Iik7Ci0JcnctPmxvY2sgPSAwOwotfQorI2RlZmluZSBfX3Jhd19yZWFkX2Nhbl9sb2NrKHJ3KQkJKChydyktPmxvY2sgPj0gMCkKKyNkZWZpbmUgX19yYXdfd3JpdGVfY2FuX2xvY2socncpCSghKHJ3KS0+bG9jaykKIAogLyoKICAqIFRoaXMgcmV0dXJucyB0aGUgb2xkIHZhbHVlIGluIHRoZSBsb2NrICsgMSwKICAqIHNvIHdlIGdvdCBhIHJlYWQgbG9jayBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzID4gMC4KICAqLwotc3RhdGljIGxvbmcgX19pbmxpbmVfXyBfX3JlYWRfdHJ5bG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgbG9uZyBfX2lubGluZV9fIF9fcmVhZF90cnlsb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJbG9uZyB0bXA7CiAKQEAgLTE4MCw0NSArMTU2LDExIEBACiAJcmV0dXJuIHRtcDsKIH0KIAotc3RhdGljIGludCBfX2lubGluZV9fIF9yYXdfcmVhZF90cnlsb2NrKHJ3bG9ja190ICpydykKLXsKLQlyZXR1cm4gX19yZWFkX3RyeWxvY2socncpID4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19pbmxpbmVfXyBfcmF3X3JlYWRfbG9jayhyd2xvY2tfdCAqcncpCi17Ci0Jd2hpbGUgKDEpIHsKLQkJaWYgKGxpa2VseShfX3JlYWRfdHJ5bG9jayhydykgPiAwKSkKLQkJCWJyZWFrOwotCQlkbyB7Ci0JCQlITVRfbG93KCk7Ci0JCQlpZiAoU0hBUkVEX1BST0NFU1NPUikKLQkJCQlfX3J3X3lpZWxkKHJ3KTsKLQkJfSB3aGlsZSAodW5saWtlbHkocnctPmxvY2sgPCAwKSk7Ci0JCUhNVF9tZWRpdW0oKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5saW5lX18gX3Jhd19yZWFkX3VubG9jayhyd2xvY2tfdCAqcncpCi17Ci0JbG9uZyB0bXA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkiZWllaW8JCQkJIyByZWFkX3VubG9ja1xuXAotMToJbHdhcngJCSUwLDAsJTFcblwKLQlhZGRpYwkJJTAsJTAsLTFcblwKLQlzdHdjeC4JCSUwLDAsJTFcblwKLQlibmUtCQkxYiIKLQk6ICI9JnIiKHRtcCkKLQk6ICJyIigmcnctPmxvY2spCi0JOiAiY3IwIiwgIm1lbW9yeSIpOwotfQotCiAvKgogICogVGhpcyByZXR1cm5zIHRoZSBvbGQgdmFsdWUgaW4gdGhlIGxvY2ssCiAgKiBzbyB3ZSBnb3QgdGhlIHdyaXRlIGxvY2sgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyAwLgogICovCi1zdGF0aWMgX19pbmxpbmVfXyBsb25nIF9fd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgX19pbmxpbmVfXyBsb25nIF9fd3JpdGVfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCWxvbmcgdG1wLCB0bXAyOwogCkBAIC0yMzcsMTIgKzE3OSwyMSBAQAogCXJldHVybiB0bXA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbmxpbmVfXyBfcmF3X3dyaXRlX3RyeWxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIHZvaWQgX19pbmxpbmVfXyBfX3Jhd19yZWFkX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKLQlyZXR1cm4gX193cml0ZV90cnlsb2NrKHJ3KSA9PSAwOworCXdoaWxlICgxKSB7CisJCWlmIChsaWtlbHkoX19yZWFkX3RyeWxvY2socncpID4gMCkpCisJCQlicmVhazsKKwkJZG8geworCQkJSE1UX2xvdygpOworCQkJaWYgKFNIQVJFRF9QUk9DRVNTT1IpCisJCQkJX19yd195aWVsZChydyk7CisJCX0gd2hpbGUgKHVubGlrZWx5KHJ3LT5sb2NrIDwgMCkpOworCQlITVRfbWVkaXVtKCk7CisJfQogfQogCi1zdGF0aWMgdm9pZCBfX2lubGluZV9fIF9yYXdfd3JpdGVfbG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIF9fcmF3X3dyaXRlX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKIAl3aGlsZSAoMSkgewogCQlpZiAobGlrZWx5KF9fd3JpdGVfdHJ5bG9jayhydykgPT0gMCkpCkBAIC0yNTYsNSArMjA3LDM1IEBACiAJfQogfQogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLworc3RhdGljIGludCBfX2lubGluZV9fIF9fcmF3X3JlYWRfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCXJldHVybiBfX3JlYWRfdHJ5bG9jayhydykgPiAwOworfQorCitzdGF0aWMgaW50IF9faW5saW5lX18gX19yYXdfd3JpdGVfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCXJldHVybiBfX3dyaXRlX3RyeWxvY2socncpID09IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlsb25nIHRtcDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSJlaWVpbwkJCQkjIHJlYWRfdW5sb2NrXG5cCisxOglsd2FyeAkJJTAsMCwlMVxuXAorCWFkZGljCQklMCwlMCwtMVxuXAorCXN0d2N4LgkJJTAsMCwlMVxuXAorCWJuZS0JCTFiIgorCTogIj0mciIodG1wKQorCTogInIiKCZydy0+bG9jaykKKwk6ICJjcjAiLCAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oImx3c3luYwkjIHdyaXRlX3VubG9jayI6IDogOiJtZW1vcnkiKTsKKwlydy0+bG9jayA9IDA7Cit9CisKICNlbmRpZiAvKiBfX0FTTV9TUElOTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9zcGlubG9ja190eXBlcy5oIGIvaW5jbHVkZS9hc20tcHBjNjQvc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzdjOGVhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX19BU01fU1BJTkxPQ0tfVFlQRVNfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc2xvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgc2lnbmVkIGludCBsb2NrOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyAwIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3N5c3RlbS5oCmluZGV4IGI5ZTE4MzUuLmMwMzk2NDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L3N5c3RlbS5oCkBAIC0xNTgsNyArMTU4LDcgQEAKICAqIGlzIG1vcmUgbGlrZSBtb3N0IG9mIHRoZSBvdGhlciBhcmNoaXRlY3R1cmVzLgogICovCiBzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nCi1fX3hjaGdfdTMyKHZvbGF0aWxlIGludCAqbSwgdW5zaWduZWQgbG9uZyB2YWwpCitfX3hjaGdfdTMyKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqbSwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJdW5zaWduZWQgbG9uZyBkdW1teTsKIApAQCAtMjAwLDcgKzIwMCw3IEBACiBleHRlcm4gdm9pZCBfX3hjaGdfY2FsbGVkX3dpdGhfYmFkX3BvaW50ZXIodm9pZCk7CiAKIHN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcKLV9feGNoZyh2b2xhdGlsZSB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgeCwgaW50IHNpemUpCitfX3hjaGcodm9sYXRpbGUgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIHgsIHVuc2lnbmVkIGludCBzaXplKQogewogCXN3aXRjaCAoc2l6ZSkgewogCWNhc2UgNDoKQEAgLTIyMyw3ICsyMjMsNyBAQAogI2RlZmluZSBfX0hBVkVfQVJDSF9DTVBYQ0hHCTEKIAogc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZwotX19jbXB4Y2hnX3UzMih2b2xhdGlsZSBpbnQgKnAsIGludCBvbGQsIGludCBuZXcpCitfX2NtcHhjaGdfdTMyKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqcCwgdW5zaWduZWQgbG9uZyBvbGQsIHVuc2lnbmVkIGxvbmcgbmV3KQogewogCXVuc2lnbmVkIGludCBwcmV2OwogCkBAIC0yNzEsNyArMjcxLDggQEAKIGV4dGVybiB2b2lkIF9fY21weGNoZ19jYWxsZWRfd2l0aF9iYWRfcG9pbnRlcih2b2lkKTsKIAogc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZwotX19jbXB4Y2hnKHZvbGF0aWxlIHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBvbGQsIHVuc2lnbmVkIGxvbmcgbmV3LCBpbnQgc2l6ZSkKK19fY21weGNoZyh2b2xhdGlsZSB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgb2xkLCB1bnNpZ25lZCBsb25nIG5ldywKKwkgIHVuc2lnbmVkIGludCBzaXplKQogewogCXN3aXRjaCAoc2l6ZSkgewogCWNhc2UgNDoKQEAgLTI4MywxMyArMjg0LDkgQEAKIAlyZXR1cm4gb2xkOwogfQogCi0jZGVmaW5lIGNtcHhjaGcocHRyLG8sbikJCQkJCQkgXAotICAoewkJCQkJCQkJCSBcCi0gICAgIF9fdHlwZW9mX18oKihwdHIpKSBfb18gPSAobyk7CQkJCQkgXAotICAgICBfX3R5cGVvZl9fKCoocHRyKSkgX25fID0gKG4pOwkJCQkJIFwKLSAgICAgKF9fdHlwZW9mX18oKihwdHIpKSkgX19jbXB4Y2hnKChwdHIpLCAodW5zaWduZWQgbG9uZylfb18sCQkgXAotCQkJCSAgICAodW5zaWduZWQgbG9uZylfbl8sIHNpemVvZigqKHB0cikpKTsgXAotICB9KQorI2RlZmluZSBjbXB4Y2hnKHB0cixvLG4pXAorCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZygocHRyKSwodW5zaWduZWQgbG9uZykobyksXAorCSh1bnNpZ25lZCBsb25nKShuKSxzaXplb2YoKihwdHIpKSkpCiAKIC8qCiAgKiBXZSBoYW5kbGUgbW9zdCB1bmFsaWduZWQgYWNjZXNzZXMgaW4gaGFyZHdhcmUuIE9uIHRoZSBvdGhlciBoYW5kIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvdGltZXguaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3RpbWV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjRkYTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvdGltZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBsaW51eC9pbmNsdWRlL2FzbS1wcGMvdGltZXguaAotICoKLSAqIFBQQzY0IGFyY2hpdGVjdHVyZSB0aW1leCBzcGVjaWZpY2F0aW9ucwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLSNpZm5kZWYgX0FTTVBQQzY0X1RJTUVYX0gKLSNkZWZpbmUgX0FTTVBQQzY0X1RJTUVYX0gKLQotI2RlZmluZSBDTE9DS19USUNLX1JBVEUJMTE5MzE4MCAvKiBVbmRlcmx5aW5nIEhaICovCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBjeWNsZXNfdDsKLQotc3RhdGljIGlubGluZSBjeWNsZXNfdCBnZXRfY3ljbGVzKHZvaWQpCi17Ci0JY3ljbGVzX3QgcmV0OwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1mdGIgJTAiIDogIj1yIiAocmV0KSA6ICk7Ci0JcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC90eXBlcy5oIGIvaW5jbHVkZS9hc20tcHBjNjQvdHlwZXMuaAppbmRleCA1YjhjMmNmLi5iZjI5NGMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L3R5cGVzLmgKQEAgLTcyLDcgKzcyLDYgQEAKIAl1bnNpZ25lZCBsb25nIGVudjsKIH0gZnVuY19kZXNjcl90OwogCi10eXBlZGVmIHVuc2lnbmVkIGludCBrbWVtX2J1ZmN0bF90OwogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tcHBjNjQvdWFjY2Vzcy5oCmluZGV4IDA1YjU5NDMuLmMxODFhNjBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvdWFjY2Vzcy5oCkBAIC01NiwxMyArNTYsNiBAQAogI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpIFwKIAlfX2FjY2Vzc19vaygoKF9fZm9yY2UgdW5zaWduZWQgbG9uZykoYWRkcikpLChzaXplKSxnZXRfZnMoKSkKIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1zdGF0aWMgaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvdWRiZy5oIGIvaW5jbHVkZS9hc20tcHBjNjQvdWRiZy5oCmluZGV4IGE2ZTA0ZDAuLmM3ODY2MDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3VkYmcuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC91ZGJnLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9fVURCR19IRFIKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAvKgogICogYyAyMDAxIFBQQyA2NCBUZWFtLCBJQk0gQ29ycApAQCAtMTIsMTcgKzEzLDE5IEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLXZvaWQgdWRiZ19pbml0X3VhcnQodm9pZCBfX2lvbWVtICpjb21wb3J0LCB1bnNpZ25lZCBpbnQgc3BlZWQpOwotdm9pZCB1ZGJnX3B1dGModW5zaWduZWQgY2hhciBjKTsKLXVuc2lnbmVkIGNoYXIgdWRiZ19nZXRjKHZvaWQpOwotaW50IHVkYmdfZ2V0Y19wb2xsKHZvaWQpOwotdm9pZCB1ZGJnX3B1dHMoY29uc3QgY2hhciAqcyk7Ci1pbnQgdWRiZ193cml0ZShjb25zdCBjaGFyICpzLCBpbnQgbik7Ci1pbnQgdWRiZ19yZWFkKGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7Ci1zdHJ1Y3QgY29uc29sZTsKLXZvaWQgdWRiZ19jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjb24sIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBuKTsKLXZvaWQgdWRiZ19wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pOwotdm9pZCB1ZGJnX3BwY2RiZyh1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci11bnNpZ25lZCBsb25nIHVkYmdfaWZkZWJ1Zyh1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB2b2lkICgqdWRiZ19wdXRjKSh1bnNpZ25lZCBjaGFyIGMpOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKCp1ZGJnX2dldGMpKHZvaWQpOworZXh0ZXJuIGludCAoKnVkYmdfZ2V0Y19wb2xsKSh2b2lkKTsKIAorZXh0ZXJuIHZvaWQgdWRiZ19wdXRzKGNvbnN0IGNoYXIgKnMpOworZXh0ZXJuIGludCB1ZGJnX3dyaXRlKGNvbnN0IGNoYXIgKnMsIGludCBuKTsKK2V4dGVybiBpbnQgdWRiZ19yZWFkKGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CisKK2V4dGVybiB2b2lkIHJlZ2lzdGVyX2Vhcmx5X3VkYmdfY29uc29sZSh2b2lkKTsKK2V4dGVybiB2b2lkIHVkYmdfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiB2b2lkIHVkYmdfcHBjZGJnKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHVkYmdfaWZkZWJ1Zyh1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB2b2lkIF9faW5pdCBwcGNkYmdfaW5pdGlhbGl6ZSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgdWRiZ19pbml0X3VhcnQodm9pZCBfX2lvbWVtICpjb21wb3J0LCB1bnNpZ25lZCBpbnQgc3BlZWQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC91c2VyLmggYi9pbmNsdWRlL2FzbS1wcGM2NC91c2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDY1NTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvdXNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotI2lmbmRlZiBfUFBDX1VTRVJfSAotI2RlZmluZSBfUFBDX1VTRVJfSAotCi0vKiBBZGFwdGVkIGZyb20gPGFzbS1hbHBoYS91c2VyLmg+IAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotCi0vKgotICogQ29yZSBmaWxlIGZvcm1hdDogVGhlIGNvcmUgZmlsZSBpcyB3cml0dGVuIGluIHN1Y2ggYSB3YXkgdGhhdCBnZGIKLSAqIGNhbiB1bmRlcnN0YW5kIGl0IGFuZCBwcm92aWRlIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byB0aGUgdXNlciAodW5kZXIKLSAqIGxpbnV4IHdlIHVzZSB0aGUgYHRyYWQtY29yZScgYmZkLCBOT1QgdGhlIG9zZi1jb3JlKS4gIFRoZSBmaWxlIGNvbnRlbnRzCi0gKiBhcmUgYXMgZm9sbG93czoKLSAqCi0gKiAgdXBhZ2U6IDEgcGFnZSBjb25zaXN0aW5nIG9mIGEgdXNlciBzdHJ1Y3QgdGhhdCB0ZWxscyBnZGIKLSAqCXdoYXQgaXMgcHJlc2VudCBpbiB0aGUgZmlsZS4gIERpcmVjdGx5IGFmdGVyIHRoaXMgaXMgYQotICoJY29weSBvZiB0aGUgdGFza19zdHJ1Y3QsIHdoaWNoIGlzIGN1cnJlbnRseSBub3QgdXNlZCBieSBnZGIsCi0gKglidXQgaXQgbWF5IGNvbWUgaW4gaGFuZHkgYXQgc29tZSBwb2ludC4gIEFsbCBvZiB0aGUgcmVnaXN0ZXJzCi0gKglhcmUgc3RvcmVkIGFzIHBhcnQgb2YgdGhlIHVwYWdlLiAgVGhlIHVwYWdlIHNob3VsZCBhbHdheXMgYmUKLSAqCW9ubHkgb25lIHBhZ2UgbG9uZy4KLSAqICBkYXRhOiBUaGUgZGF0YSBzZWdtZW50IGZvbGxvd3MgbmV4dC4gIFdlIHVzZSBjdXJyZW50LT5lbmRfdGV4dCB0bwotICoJY3VycmVudC0+YnJrIHRvIHBpY2sgdXAgYWxsIG9mIHRoZSB1c2VyIHZhcmlhYmxlcywgcGx1cyBhbnkgbWVtb3J5Ci0gKgl0aGF0IG1heSBoYXZlIGJlZW4gc2JyaydlZC4gIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBkZXRlcm1pbmUgaWYgYQotICoJcGFnZSBpcyBkZW1hbmQtemVybyBvciBpZiBhIHBhZ2UgaXMgdG90YWxseSB1bnVzZWQsIHdlIGp1c3QgY292ZXIKLSAqCXRoZSBlbnRpcmUgcmFuZ2UuICBBbGwgb2YgdGhlIGFkZHJlc3NlcyBhcmUgcm91bmRlZCBpbiBzdWNoIGEgd2F5Ci0gKgl0aGF0IGFuIGludGVncmFsIG51bWJlciBvZiBwYWdlcyBpcyB3cml0dGVuLgotICogIHN0YWNrOiBXZSBuZWVkIHRoZSBzdGFjayBpbmZvcm1hdGlvbiBpbiBvcmRlciB0byBnZXQgYSBtZWFuaW5nZnVsCi0gKgliYWNrdHJhY2UuICBXZSBuZWVkIHRvIHdyaXRlIHRoZSBkYXRhIGZyb20gdXNwIHRvCi0gKgljdXJyZW50LT5zdGFydF9zdGFjaywgc28gd2Ugcm91bmQgZWFjaCBvZiB0aGVzZSBpbiBvcmRlciB0byBiZSBhYmxlCi0gKgl0byB3cml0ZSBhbiBpbnRlZ2VyIG51bWJlciBvZiBwYWdlcy4KLSAqLwotc3RydWN0IHVzZXIgewotCXN0cnVjdCBwdF9yZWdzCXJlZ3M7CQkJLyogZW50aXJlIG1hY2hpbmUgc3RhdGUgKi8KLQlzaXplX3QJCXVfdHNpemU7CQkvKiB0ZXh0IHNpemUgKHBhZ2VzKSAqLwotCXNpemVfdAkJdV9kc2l6ZTsJCS8qIGRhdGEgc2l6ZSAocGFnZXMpICovCi0Jc2l6ZV90CQl1X3NzaXplOwkJLyogc3RhY2sgc2l6ZSAocGFnZXMpICovCi0JdW5zaWduZWQgbG9uZwlzdGFydF9jb2RlOwkJLyogdGV4dCBzdGFydGluZyBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZwlzdGFydF9kYXRhOwkJLyogZGF0YSBzdGFydGluZyBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZwlzdGFydF9zdGFjazsJCS8qIHN0YWNrIHN0YXJ0aW5nIGFkZHJlc3MgKi8KLQlsb25nIGludAlzaWduYWw7CQkJLyogc2lnbmFsIGNhdXNpbmcgY29yZSBkdW1wICovCi0Jc3RydWN0IHJlZ3MgKgl1X2FyMDsJCQkvKiBoZWxwIGdkYiBmaW5kIHJlZ2lzdGVycyAqLwotCXVuc2lnbmVkIGxvbmcJbWFnaWM7CQkJLyogaWRlbnRpZmllcyBhIGNvcmUgZmlsZSAqLwotCWNoYXIJCXVfY29tbVszMl07CQkvKiB1c2VyIGNvbW1hbmQgbmFtZSAqLwotfTsKLQotI2RlZmluZSBOQlBHCQkJUEFHRV9TSVpFCi0jZGVmaW5lIFVQQUdFUwkJCTEKLSNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIJKHUuc3RhcnRfY29kZSkKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIJKHUuc3RhcnRfZGF0YSkKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUgkodS5zdGFydF9zdGFjayArIHUudV9zc2l6ZSAqIE5CUEcpCi0KLSNlbmRpZiAvKiBfUFBDX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9hdXh2ZWMuaCBiL2luY2x1ZGUvYXNtLXMzOTAvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzNDA3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvYXV4dmVjLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9fQVNNUzM5MF9BVVhWRUNfSAorI2RlZmluZSBfX0FTTVMzOTBfQVVYVkVDX0gKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2NvbXBhdC5oIGIvaW5jbHVkZS9hc20tczM5MC9jb21wYXQuaAppbmRleCA3ZjhmNTQ0Li5hMDA3NzE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvY29tcGF0LmgKQEAgLTEzLDEwICsxMywxMCBAQAogdHlwZWRlZiBzMzIJCWNvbXBhdF90aW1lX3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2Nsb2NrX3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X3BpZF90OwotdHlwZWRlZiB1MTYJCWNvbXBhdF91aWRfdDsKLXR5cGVkZWYgdTE2CQljb21wYXRfZ2lkX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X3VpZDMyX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X2dpZDMyX3Q7Cit0eXBlZGVmIHUxNgkJX19jb21wYXRfdWlkX3Q7Cit0eXBlZGVmIHUxNgkJX19jb21wYXRfZ2lkX3Q7Cit0eXBlZGVmIHUzMgkJX19jb21wYXRfdWlkMzJfdDsKK3R5cGVkZWYgdTMyCQlfX2NvbXBhdF9naWQzMl90OwogdHlwZWRlZiB1MTYJCWNvbXBhdF9tb2RlX3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X2lub190OwogdHlwZWRlZiB1MTYJCWNvbXBhdF9kZXZfdDsKQEAgLTUxLDggKzUxLDggQEAKIAljb21wYXRfaW5vX3QJc3RfaW5vOwogCWNvbXBhdF9tb2RlX3QJc3RfbW9kZTsKIAljb21wYXRfbmxpbmtfdAlzdF9ubGluazsKLQljb21wYXRfdWlkX3QJc3RfdWlkOwotCWNvbXBhdF9naWRfdAlzdF9naWQ7CisJX19jb21wYXRfdWlkX3QJc3RfdWlkOworCV9fY29tcGF0X2dpZF90CXN0X2dpZDsKIAljb21wYXRfZGV2X3QJc3RfcmRldjsKIAl1MTYJCV9fcGFkMjsKIAl1MzIJCXN0X3NpemU7CkBAIC0xNDAsMTAgKzE0MCwxMCBAQAogCiBzdHJ1Y3QgY29tcGF0X2lwYzY0X3Blcm0gewogCWNvbXBhdF9rZXlfdCBrZXk7Ci0JY29tcGF0X3VpZDMyX3QgdWlkOwotCWNvbXBhdF9naWQzMl90IGdpZDsKLQljb21wYXRfdWlkMzJfdCBjdWlkOwotCWNvbXBhdF9naWQzMl90IGNnaWQ7CisJX19jb21wYXRfdWlkMzJfdCB1aWQ7CisJX19jb21wYXRfZ2lkMzJfdCBnaWQ7CisJX19jb21wYXRfdWlkMzJfdCBjdWlkOworCV9fY29tcGF0X2dpZDMyX3QgY2dpZDsKIAljb21wYXRfbW9kZV90IG1vZGU7CiAJdW5zaWduZWQgc2hvcnQgX19wYWQxOwogCXVuc2lnbmVkIHNob3J0IHNlcTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvZGVidWcuaCBiL2luY2x1ZGUvYXNtLXMzOTAvZGVidWcuaAppbmRleCA5MjM2MGQ5Li43MTI3MDMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2RlYnVnLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9kZWJ1Zy5oCkBAIC01Miw4ICs1Miw2IEBACiAjZGVmaW5lIERFQlVHX0RBVEEoZW50cnkpIChjaGFyKikoZW50cnkgKyAxKSAvKiBkYXRhIGlzIHN0b3JlZCBiZWhpbmQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBlbnRyeSBpbmZvcm1hdGlvbiAqLwogCi0jZGVmaW5lIFNUQ0soeCkJYXNtIHZvbGF0aWxlICgiU1RDSyAwKCUxKSIgOiAiPW0iICh4KSA6ICJhIiAoJih4KSkgOiAiY2MiKQotCiB0eXBlZGVmIHN0cnVjdCBfX2RlYnVnX2VudHJ5IGRlYnVnX2VudHJ5X3Q7CiAKIHN0cnVjdCBkZWJ1Z192aWV3OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9mY250bC5oIGIvaW5jbHVkZS9hc20tczM5MC9mY250bC5oCmluZGV4IDQ4ZjY5MmIuLjQ2YWIxMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2ZjbnRsLmgKQEAgLTEsOTcgKzEgQEAKLS8qCi0gKiAgaW5jbHVkZS9hc20tczM5MC9mY250bC5oCi0gKgotICogIFMzOTAgdmVyc2lvbgotICoKLSAqICBEZXJpdmVkIGZyb20gImluY2x1ZGUvYXNtLWkzODYvZmNudGwuaCIKLSAqLwotI2lmbmRlZiBfUzM5MF9GQ05UTF9ICi0jZGVmaW5lIF9TMzkwX0ZDTlRMX0gKLQotLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwotICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQUNDTU9ERQkgICAwMDAzCi0jZGVmaW5lIE9fUkRPTkxZCSAgICAgMDAKLSNkZWZpbmUgT19XUk9OTFkJICAgICAwMQotI2RlZmluZSBPX1JEV1IJCSAgICAgMDIKLSNkZWZpbmUgT19DUkVBVAkJICAgMDEwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19FWENMCQkgICAwMjAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX05PQ1RUWQkgICAwNDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX1RSVU5DCQkgIDAxMDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0FQUEVORAkgIDAyMDAwCi0jZGVmaW5lIE9fTk9OQkxPQ0sJICAwNDAwMAotI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCi0jZGVmaW5lIE9fU1lOQwkJIDAxMDAwMAotI2RlZmluZSBGQVNZTkMJCSAwMjAwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBPX0RJUkVDVAkgMDQwMDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50ICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFCTAxMDAwMDAKLSNkZWZpbmUgT19ESVJFQ1RPUlkJMDIwMDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMDQwMDAwMCAvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCi0KLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNwotCi0jZGVmaW5lIEZfU0VUT1dOCTgJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVE9XTgk5CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLSNpZm5kZWYgX19zMzkweF9fCi0jZGVmaW5lIEZfR0VUTEs2NAkxMgkvKiAgdXNpbmcgJ3N0cnVjdCBmbG9jazY0JyAqLwotI2RlZmluZSBGX1NFVExLNjQJMTMKLSNkZWZpbmUgRl9TRVRMS1c2NAkxNAotI2VuZGlmIC8qICEgX19zMzkweF9fICovCi0KLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQotLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KLSNkZWZpbmUgRl9SRExDSwkJMAotI2RlZmluZSBGX1dSTENLCQkxCi0jZGVmaW5lIEZfVU5MQ0sJCTIKLQotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLwotCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLX07Ci0KLSNpZm5kZWYgX19zMzkweF9fCi1zdHJ1Y3QgZmxvY2s2NCB7Ci0Jc2hvcnQgIGxfdHlwZTsKLQlzaG9ydCAgbF93aGVuY2U7Ci0JbG9mZl90IGxfc3RhcnQ7Ci0JbG9mZl90IGxfbGVuOwotCXBpZF90ICBsX3BpZDsKLX07Ci0jZW5kaWYKLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKLSNlbmRpZgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1zMzkwL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvZnV0ZXguaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9BU01fRlVURVhfSAorI2RlZmluZSBfQVNNX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJY2FzZSBGVVRFWF9PUF9PUjoKKwljYXNlIEZVVEVYX09QX0FORE46CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvbG93Y29yZS5oIGIvaW5jbHVkZS9hc20tczM5MC9sb3djb3JlLmgKaW5kZXggYWZlNmE5Zi4uYzZmNTFjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9sb3djb3JlLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9sb3djb3JlLmgKQEAgLTY4LDYgKzY4LDcgQEAKICNkZWZpbmUgX19MQ19TWVNURU1fVElNRVIJCTB4MjcwCiAjZGVmaW5lIF9fTENfTEFTVF9VUERBVEVfQ0xPQ0sJCTB4Mjc4CiAjZGVmaW5lIF9fTENfU1RFQUxfQ0xPQ0sJCTB4MjgwCisjZGVmaW5lIF9fTENfUkVUVVJOX01DQ0tfUFNXICAgICAgICAgICAgMHgyODgKICNkZWZpbmUgX19MQ19LRVJORUxfU1RBQ0sgICAgICAgICAgICAgICAweEM0MAogI2RlZmluZSBfX0xDX1RIUkVBRF9JTkZPCQkweEM0NAogI2RlZmluZSBfX0xDX0FTWU5DX1NUQUNLICAgICAgICAgICAgICAgIDB4QzQ4CkBAIC05MCw2ICs5MSw3IEBACiAjZGVmaW5lIF9fTENfU1lTVEVNX1RJTUVSCQkweDI3OAogI2RlZmluZSBfX0xDX0xBU1RfVVBEQVRFX0NMT0NLCQkweDI4MAogI2RlZmluZSBfX0xDX1NURUFMX0NMT0NLCQkweDI4OAorI2RlZmluZSBfX0xDX1JFVFVSTl9NQ0NLX1BTVyAgICAgICAgICAgIDB4MjkwCiAjZGVmaW5lIF9fTENfS0VSTkVMX1NUQUNLICAgICAgICAgICAgICAgMHhENDAKICNkZWZpbmUgX19MQ19USFJFQURfSU5GTwkJMHhENDgKICNkZWZpbmUgX19MQ19BU1lOQ19TVEFDSyAgICAgICAgICAgICAgICAweEQ1MApAQCAtMTk2LDcgKzE5OCw4IEBACiAJX191NjQgICAgICAgIHN5c3RlbV90aW1lcjsgICAgICAgICAgICAgLyogMHgyNzAgKi8KIAlfX3U2NCAgICAgICAgbGFzdF91cGRhdGVfY2xvY2s7ICAgICAgICAvKiAweDI3OCAqLwogCV9fdTY0ICAgICAgICBzdGVhbF9jbG9jazsgICAgICAgICAgICAgIC8qIDB4MjgwICovCi0JX191OCAgICAgICAgIHBhZDhbMHhjMDAtMHgyODhdOyAgICAgICAgLyogMHgyODggKi8KKyAgICAgICAgcHN3X3QgICAgICAgIHJldHVybl9tY2NrX3BzdzsgICAgICAgICAgLyogMHgyODggKi8KKwlfX3U4ICAgICAgICAgcGFkOFsweGMwMC0weDI5MF07ICAgICAgICAvKiAweDI5MCAqLwogCiAgICAgICAgIC8qIFN5c3RlbSBpbmZvIGFyZWEgKi8KIAlfX3UzMiAgICAgICAgc2F2ZV9hcmVhWzE2XTsgICAgICAgICAgICAvKiAweGMwMCAqLwpAQCAtMjg1LDcgKzI4OCw4IEBACiAJX191NjQgICAgICAgIHN5c3RlbV90aW1lcjsgICAgICAgICAgICAgLyogMHgyNzggKi8KIAlfX3U2NCAgICAgICAgbGFzdF91cGRhdGVfY2xvY2s7ICAgICAgICAvKiAweDI4MCAqLwogCV9fdTY0ICAgICAgICBzdGVhbF9jbG9jazsgICAgICAgICAgICAgIC8qIDB4Mjg4ICovCi0gICAgICAgIF9fdTggICAgICAgICBwYWQ4WzB4YzAwLTB4MjkwXTsgICAgICAgIC8qIDB4MjkwICovCisgICAgICAgIHBzd190ICAgICAgICByZXR1cm5fbWNja19wc3c7ICAgICAgICAgIC8qIDB4MjkwICovCisgICAgICAgIF9fdTggICAgICAgICBwYWQ4WzB4YzAwLTB4MmEwXTsgICAgICAgIC8qIDB4MmEwICovCiAgICAgICAgIC8qIFN5c3RlbSBpbmZvIGFyZWEgKi8KIAlfX3U2NCAgICAgICAgc2F2ZV9hcmVhWzE2XTsgICAgICAgICAgICAvKiAweGMwMCAqLwogICAgICAgICBfX3U4ICAgICAgICAgcGFkOVsweGQ0MC0weGM4MF07ICAgICAgICAvKiAweGM4MCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9wYWdlLmggYi9pbmNsdWRlL2FzbS1zMzkwL3BhZ2UuaAppbmRleCAyYmUyODdiLi4yNDMwYzU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3BhZ2UuaApAQCAtMTExLDIwICsxMTEsNiBAQAogI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQogI2RlZmluZSBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQogCi0vKiBQdXJlIDJebiB2ZXJzaW9uIG9mIGdldF9vcmRlciAqLwotZXh0ZXJuIF9faW5saW5lX18gaW50IGdldF9vcmRlcih1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0gICAgICAgIGludCBvcmRlcjsKLQotICAgICAgICBzaXplID0gKHNpemUtMSkgPj4gKFBBR0VfU0hJRlQtMSk7Ci0gICAgICAgIG9yZGVyID0gLTE7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBzaXplID4+PSAxOwotICAgICAgICAgICAgICAgIG9yZGVyKys7Ci0gICAgICAgIH0gd2hpbGUgKHNpemUpOwotICAgICAgICByZXR1cm4gb3JkZXI7Ci19Ci0KIC8qCiAgKiBUaGVzZSBhcmUgdXNlZCB0byBtYWtlIHVzZSBvZiBDIHR5cGUtY2hlY2tpbmcuLgogICovCkBAIC0yMDcsNCArMTkzLDYgQEAKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KKwogI2VuZGlmIC8qIF9TMzkwX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tczM5MC9zcGlubG9jay5oCmluZGV4IDhmZjEwMzAuLjI3M2RiZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3NwaW5sb2NrLmgKQEAgLTI3LDQyICsyNywzNiBAQAogICogb24gdGhlIGxvY2FsIHByb2Nlc3Nvciwgb25lIGRvZXMgbm90LgogICoKICAqIFdlIG1ha2Ugbm8gZmFpcm5lc3MgYXNzdW1wdGlvbnMuIFRoZXkgaGF2ZSBhIGNvc3QuCisgKgorICogKHRoZSB0eXBlIGRlZmluaXRpb25zIGFyZSBpbiBhc20vc3BpbmxvY2tfdHlwZXMuaCkKICAqLwogCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKSBzcGlubG9ja190OworI2RlZmluZSBfX3Jhd19zcGluX2lzX2xvY2tlZCh4KSAoKHgpLT5sb2NrICE9IDApCisjZGVmaW5lIF9fcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX19yYXdfc3Bpbl9sb2NrKGxvY2spCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQobG9jaykgXAorCWRvIHsgd2hpbGUgKF9fcmF3X3NwaW5faXNfbG9ja2VkKGxvY2spKSBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoMCkKIAotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQJKHNwaW5sb2NrX3QpIHsgMCB9Ci0jZGVmaW5lIHNwaW5fbG9ja19pbml0KGxwKQlkbyB7IChscCktPmxvY2sgPSAwOyB9IHdoaWxlKDApCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQobHApCWRvIHsgYmFycmllcigpOyB9IHdoaWxlKCgodm9sYXRpbGUgc3BpbmxvY2tfdCAqKShscCkpLT5sb2NrKQotI2RlZmluZSBzcGluX2lzX2xvY2tlZCh4KQkoKHgpLT5sb2NrICE9IDApCi0jZGVmaW5lIF9yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfcmF3X3NwaW5fbG9jayhsb2NrKQorZXh0ZXJuIHZvaWQgX3Jhd19zcGluX2xvY2tfd2FpdChyYXdfc3BpbmxvY2tfdCAqbHAsIHVuc2lnbmVkIGludCBwYyk7CitleHRlcm4gaW50IF9yYXdfc3Bpbl90cnlsb2NrX3JldHJ5KHJhd19zcGlubG9ja190ICpscCwgdW5zaWduZWQgaW50IHBjKTsKIAotZXh0ZXJuIHZvaWQgX3Jhd19zcGluX2xvY2tfd2FpdChzcGlubG9ja190ICpscCwgdW5zaWduZWQgaW50IHBjKTsKLWV4dGVybiBpbnQgX3Jhd19zcGluX3RyeWxvY2tfcmV0cnkoc3BpbmxvY2tfdCAqbHAsIHVuc2lnbmVkIGludCBwYyk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fbG9jayhzcGlubG9ja190ICpscCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxwKQogewotCXVuc2lnbmVkIGxvbmcgcGMgPSAodW5zaWduZWQgbG9uZykgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCXVuc2lnbmVkIGxvbmcgcGMgPSAxIHwgKHVuc2lnbmVkIGxvbmcpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKIAogCWlmICh1bmxpa2VseShfcmF3X2NvbXBhcmVfYW5kX3N3YXAoJmxwLT5sb2NrLCAwLCBwYykgIT0gMCkpCiAJCV9yYXdfc3Bpbl9sb2NrX3dhaXQobHAsIHBjKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX3Jhd19zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqbHApCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19zcGluX3RyeWxvY2socmF3X3NwaW5sb2NrX3QgKmxwKQogewotCXVuc2lnbmVkIGxvbmcgcGMgPSAodW5zaWduZWQgbG9uZykgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCXVuc2lnbmVkIGxvbmcgcGMgPSAxIHwgKHVuc2lnbmVkIGxvbmcpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKIAogCWlmIChsaWtlbHkoX3Jhd19jb21wYXJlX2FuZF9zd2FwKCZscC0+bG9jaywgMCwgcGMpID09IDApKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gX3Jhd19zcGluX3RyeWxvY2tfcmV0cnkobHAsIHBjKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbHApCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxwKQogewogCV9yYXdfY29tcGFyZV9hbmRfc3dhcCgmbHAtPmxvY2ssIGxwLT5sb2NrLCAwKTsKIH0KQEAgLTc3LDM2ICs3MSwyNSBAQAogICogaXJxLXNhZmUgd3JpdGUtbG9jaywgYnV0IHJlYWRlcnMgY2FuIGdldCBub24taXJxc2FmZQogICogcmVhZC1sb2Nrcy4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgb3duZXJfcGM7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKLQotI2RlZmluZSBSV19MT0NLX1VOTE9DS0VEIChyd2xvY2tfdCkgeyAwLCAwIH0KLQotI2RlZmluZSByd2xvY2tfaW5pdCh4KQlkbyB7ICooeCkgPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCiAKIC8qKgogICogcmVhZF9jYW5fbG9jayAtIHdvdWxkIHJlYWRfdHJ5bG9jaygpIHN1Y2NlZWQ/CiAgKiBAbG9jazogdGhlIHJ3bG9jayBpbiBxdWVzdGlvbi4KICAqLwotI2RlZmluZSByZWFkX2Nhbl9sb2NrKHgpICgoaW50KSh4KS0+bG9jayA+PSAwKQorI2RlZmluZSBfX3Jhd19yZWFkX2Nhbl9sb2NrKHgpICgoaW50KSh4KS0+bG9jayA+PSAwKQogCiAvKioKICAqIHdyaXRlX2Nhbl9sb2NrIC0gd291bGQgd3JpdGVfdHJ5bG9jaygpIHN1Y2NlZWQ/CiAgKiBAbG9jazogdGhlIHJ3bG9jayBpbiBxdWVzdGlvbi4KICAqLwotI2RlZmluZSB3cml0ZV9jYW5fbG9jayh4KSAoKHgpLT5sb2NrID09IDApCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHgpICgoeCktPmxvY2sgPT0gMCkKIAotZXh0ZXJuIHZvaWQgX3Jhd19yZWFkX2xvY2tfd2FpdChyd2xvY2tfdCAqbHApOwotZXh0ZXJuIGludCBfcmF3X3JlYWRfdHJ5bG9ja19yZXRyeShyd2xvY2tfdCAqbHApOwotZXh0ZXJuIHZvaWQgX3Jhd193cml0ZV9sb2NrX3dhaXQocndsb2NrX3QgKmxwKTsKLWV4dGVybiBpbnQgX3Jhd193cml0ZV90cnlsb2NrX3JldHJ5KHJ3bG9ja190ICpscCk7CitleHRlcm4gdm9pZCBfcmF3X3JlYWRfbG9ja193YWl0KHJhd19yd2xvY2tfdCAqbHApOworZXh0ZXJuIGludCBfcmF3X3JlYWRfdHJ5bG9ja19yZXRyeShyYXdfcndsb2NrX3QgKmxwKTsKK2V4dGVybiB2b2lkIF9yYXdfd3JpdGVfbG9ja193YWl0KHJhd19yd2xvY2tfdCAqbHApOworZXh0ZXJuIGludCBfcmF3X3dyaXRlX3RyeWxvY2tfcmV0cnkocmF3X3J3bG9ja190ICpscCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3JlYWRfbG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgaW50IG9sZDsKIAlvbGQgPSBydy0+bG9jayAmIDB4N2ZmZmZmZmZVOwpAQCAtMTE0LDcgKzk3LDcgQEAKIAkJX3Jhd19yZWFkX2xvY2tfd2FpdChydyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3JlYWRfdW5sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCXVuc2lnbmVkIGludCBvbGQsIGNtcDsKIApAQCAtMTI1LDE4ICsxMDgsMTggQEAKIAl9IHdoaWxlIChjbXAgIT0gb2xkKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfd3JpdGVfbG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCWlmICh1bmxpa2VseShfcmF3X2NvbXBhcmVfYW5kX3N3YXAoJnJ3LT5sb2NrLCAwLCAweDgwMDAwMDAwKSAhPSAwKSkKIAkJX3Jhd193cml0ZV9sb2NrX3dhaXQocncpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd193cml0ZV91bmxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCV9yYXdfY29tcGFyZV9hbmRfc3dhcCgmcnctPmxvY2ssIDB4ODAwMDAwMDAsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3JlYWRfdHJ5bG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19yZWFkX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBpbnQgb2xkOwogCW9sZCA9IHJ3LT5sb2NrICYgMHg3ZmZmZmZmZlU7CkBAIC0xNDUsNyArMTI4LDcgQEAKIAlyZXR1cm4gX3Jhd19yZWFkX3RyeWxvY2tfcmV0cnkocncpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3dyaXRlX3RyeWxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfd3JpdGVfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCWlmIChsaWtlbHkoX3Jhd19jb21wYXJlX2FuZF9zd2FwKCZydy0+bG9jaywgMCwgMHg4MDAwMDAwMCkgPT0gMCkpCiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zcGlubG9ja190eXBlcy5oIGIvaW5jbHVkZS9hc20tczM5MC9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OWEyMjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfX0FTTV9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpIHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IG93bmVyX3BjOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyAwLCAwIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3R5cGVzLmggYi9pbmNsdWRlL2FzbS1zMzkwL3R5cGVzLmgKaW5kZXggM2ZlZmQ2MS4uZDBiZTNlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvdHlwZXMuaApAQCAtNzksOCArNzksNiBAQAogCiB0eXBlZGVmIHUzMiBkbWFfYWRkcl90OwogCi10eXBlZGVmIHVuc2lnbmVkIGludCBrbWVtX2J1ZmN0bF90OwotCiAjaWZuZGVmIF9fczM5MHhfXwogdHlwZWRlZiB1bmlvbiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIHBhaXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXMzOTAvdWFjY2Vzcy5oCmluZGV4IDNlM2JmZTYuLjM4YTVjZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvdWFjY2Vzcy5oCkBAIC02NSwxMyArNjUsNiBAQAogCiAjZGVmaW5lIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgX19hY2Nlc3Nfb2soYWRkcixzaXplKQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLWV4dGVybiBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKmFkZHIsCi0JCQkJCQl1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLCBhZGRyLCBzaXplKSA/IDAgOiAtRUZBVUxUOwotfQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1zaC9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzIxZTRkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvYXV4dmVjLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9fQVNNX1NIX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNX1NIX0FVWFZFQ19ICisKKyNlbmRpZiAvKiBfX0FTTV9TSF9BVVhWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvZmNudGwuaCBiL2luY2x1ZGUvYXNtLXNoL2ZjbnRsLmgKaW5kZXggMGIzYWU1Mi4uNDZhYjEyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9mY250bC5oCkBAIC0xLDg4ICsxIEBACi0jaWZuZGVmIF9fQVNNX1NIX0ZDTlRMX0gKLSNkZWZpbmUgX19BU01fU0hfRkNOVExfSAotCi0vKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCi0gICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgT19BQ0NNT0RFCSAgIDAwMDMKLSNkZWZpbmUgT19SRE9OTFkJICAgICAwMAotI2RlZmluZSBPX1dST05MWQkgICAgIDAxCi0jZGVmaW5lIE9fUkRXUgkJICAgICAwMgotI2RlZmluZSBPX0NSRUFUCQkgICAwMTAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0VYQ0wJCSAgIDAyMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fTk9DVFRZCSAgIDA0MDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fVFJVTkMJCSAgMDEwMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fQVBQRU5ECSAgMDIwMDAKLSNkZWZpbmUgT19OT05CTE9DSwkgIDA0MDAwCi0jZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKLSNkZWZpbmUgT19TWU5DCQkgMDEwMDAwCi0jZGVmaW5lIEZBU1lOQwkJIDAyMDAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIE9fRElSRUNUCSAwNDAwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgLSBjdXJyZW50bHkgaWdub3JlZCAqLwotI2RlZmluZSBPX0xBUkdFRklMRQkwMTAwMDAwCi0jZGVmaW5lIE9fRElSRUNUT1JZCTAyMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XCTA0MDAwMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCi0jZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAotCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKLQotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0jZGVmaW5lIEZfR0VUTEs2NAkxMgkvKiAgdXNpbmcgJ3N0cnVjdCBmbG9jazY0JyAqLwotI2RlZmluZSBGX1NFVExLNjQJMTMKLSNkZWZpbmUgRl9TRVRMS1c2NAkxNAotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCW9mZl90IGxfc3RhcnQ7Ci0Jb2ZmX3QgbF9sZW47Ci0JcGlkX3QgbF9waWQ7Ci19OwotCi1zdHJ1Y3QgZmxvY2s2NCB7Ci0Jc2hvcnQgIGxfdHlwZTsKLQlzaG9ydCAgbF93aGVuY2U7Ci0JbG9mZl90IGxfc3RhcnQ7Ci0JbG9mZl90IGxfbGVuOwotCXBpZF90ICBsX3BpZDsKLX07Ci0KLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKLSNlbmRpZiAvKiBfX0FTTV9TSF9GQ05UTF9IICovCi0KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLXNoL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCWNhc2UgRlVURVhfT1BfQUREOgorCWNhc2UgRlVURVhfT1BfT1I6CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCWNhc2UgRlVURVhfT1BfWE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9oZHJlZy5oIGIvaW5jbHVkZS9hc20tc2gvaGRyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZmQxYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2hkcmVnLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9pcnEuaCBiL2luY2x1ZGUvYXNtLXNoL2lycS5oCmluZGV4IDgzMWU1MmUuLjYxNGE4YzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2lycS5oCkBAIC01ODcsMTAgKzU4Nyw2IEBACiAjZGVmaW5lIGlycV9jYW5vbmljYWxpemUoaXJxKQkoaXJxKQogI2RlZmluZSBpcnFfZGVtdXgoaXJxKQkJX19pcnFfZGVtdXgoc2hfbXYubXZfaXJxX2RlbXV4KGlycSkpCiAKLXN0cnVjdCBpcnFhY3Rpb247Ci1zdHJ1Y3QgcHRfcmVnczsKLWludCBoYW5kbGVfSVJRX2V2ZW50KHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IGlycWFjdGlvbiAqKTsKLQogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCiAjaW5jbHVkZSA8YXNtL2lycS1zaDczMTgwLmg+CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaAppbmRleCAxODA0NjdiLi4zMjRlNmNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvcGFnZS5oCkBAIC0xMjIsMjQgKzEyMiw4IEBACiAjZGVmaW5lIFZNX0RBVEFfREVGQVVMVF9GTEFHUwkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fRVhFQyB8IFwKIAkJCQkgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKIAotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotLyogUHVyZSAyXm4gdmVyc2lvbiBvZiBnZXRfb3JkZXIgKi8KLXN0YXRpYyBfX2lubGluZV9fIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBvcmRlcjsKLQotCXNpemUgPSAoc2l6ZS0xKSA+PiAoUEFHRV9TSElGVC0xKTsKLQlvcmRlciA9IC0xOwotCWRvIHsKLQkJc2l6ZSA+Pj0gMTsKLQkJb3JkZXIrKzsKLQl9IHdoaWxlIChzaXplKTsKLQlyZXR1cm4gb3JkZXI7Ci19Ci0KLSNlbmRpZgotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgorCiAjZW5kaWYgLyogX19BU01fU0hfUEFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tc2gvc3BpbmxvY2suaAppbmRleCBlNzcwYjU1Li44NDYzMjJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NwaW5sb2NrLmgKQEAgLTE1LDIwICsxNSwxMSBAQAogLyoKICAqIFlvdXIgYmFzaWMgU01QIHNwaW5sb2NrcywgYWxsb3dpbmcgb25seSBhIHNpbmdsZSBDUFUgYW55d2hlcmUKICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9jazsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHNwaW5sb2NrX3Q7CiAKLSNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VECShzcGlubG9ja190KSB7IDAgfQotCi0jZGVmaW5lIHNwaW5fbG9ja19pbml0KHgpCWRvIHsgKih4KSA9IFNQSU5fTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpCSgoeCktPmxvY2sgIT0gMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdCh4KQlkbyB7IGJhcnJpZXIoKTsgfSB3aGlsZSAoc3Bpbl9pc19sb2NrZWQoeCkpCi0jZGVmaW5lIF9yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfcmF3X3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19zcGluX2lzX2xvY2tlZCh4KQkoKHgpLT5sb2NrICE9IDApCisjZGVmaW5lIF9fcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX19yYXdfc3Bpbl9sb2NrKGxvY2spCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQoeCkgXAorCWRvIHsgY3B1X3JlbGF4KCk7IH0gd2hpbGUgKF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpKQogCiAvKgogICogU2ltcGxlIHNwaW4gbG9jayBvcGVyYXRpb25zLiAgVGhlcmUgYXJlIHR3byB2YXJpYW50cywgb25lIGNsZWFycyBJUlEncwpAQCAtMzYsNyArMjcsNyBAQAogICoKICAqIFdlIG1ha2Ugbm8gZmFpcm5lc3MgYXNzdW1wdGlvbnMuICBUaGV5IGhhdmUgYSBjb3N0LgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAogCQkiMTpcblx0IgpAQCAtNDksMTQgKzQwLDE0IEBACiAJKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAlhc3NlcnRfc3Bpbl9sb2NrZWQobG9jayk7CiAKIAlsb2NrLT5sb2NrID0gMDsKIH0KIAotI2RlZmluZSBfcmF3X3NwaW5fdHJ5bG9jayh4KSAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJih4KS0+bG9jaykpCisjZGVmaW5lIF9fcmF3X3NwaW5fdHJ5bG9jayh4KSAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJih4KS0+bG9jaykpCiAKIC8qCiAgKiBSZWFkLXdyaXRlIHNwaW5sb2NrcywgYWxsb3dpbmcgbXVsdGlwbGUgcmVhZGVycyBidXQgb25seSBvbmUgd3JpdGVyLgpAQCAtNjYsNTEgKzU3LDQwIEBACiAgKiBuZWVkcyB0byBnZXQgYSBpcnEtc2FmZSB3cml0ZS1sb2NrLCBidXQgcmVhZGVycyBjYW4gZ2V0IG5vbi1pcnFzYWZlCiAgKiByZWFkLWxvY2tzLgogICovCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCWF0b21pY190IGNvdW50ZXI7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKIAotI2RlZmluZSBSV19MT0NLX0JJQVMJCTB4MDEwMDAwMDAKLSNkZWZpbmUgUldfTE9DS19VTkxPQ0tFRAkocndsb2NrX3QpIHsgeyAwIH0sIHsgUldfTE9DS19CSUFTIH0gfQotI2RlZmluZSByd2xvY2tfaW5pdCh4KQkJZG8geyAqKHgpID0gUldfTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSAoMCkKLQotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfcmVhZF9sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKLQlfcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOworCV9fcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOwogCiAJYXRvbWljX2luYygmcnctPmNvdW50ZXIpOwogCi0JX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOworCV9fcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3JlYWRfdW5sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewotCV9yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7CisJX19yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7CiAKIAlhdG9taWNfZGVjKCZydy0+Y291bnRlcik7CiAKLQlfcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CisJX19yYXdfc3Bpbl91bmxvY2soJnJ3LT5sb2NrKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfd3JpdGVfbG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewotCV9yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7CisJX19yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7CiAJYXRvbWljX3NldCgmcnctPmNvdW50ZXIsIC0xKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAlhdG9taWNfc2V0KCZydy0+Y291bnRlciwgMCk7Ci0JX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOworCV9fcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CiB9CiAKLSNkZWZpbmUgX3Jhd19yZWFkX3RyeWxvY2sobG9jaykgZ2VuZXJpY19yYXdfcmVhZF90cnlsb2NrKGxvY2spCisjZGVmaW5lIF9fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSBnZW5lcmljX19yYXdfcmVhZF90cnlsb2NrKGxvY2spCiAKLXN0YXRpYyBpbmxpbmUgaW50IF9yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJaWYgKGF0b21pY19zdWJfYW5kX3Rlc3QoUldfTE9DS19CSUFTLCAmcnctPmNvdW50ZXIpKQogCQlyZXR1cm4gMTsKQEAgLTEyMSw0ICsxMDEsMyBAQAogfQogCiAjZW5kaWYgLyogX19BU01fU0hfU1BJTkxPQ0tfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zcGlubG9ja190eXBlcy5oIGIvaW5jbHVkZS9hc20tc2gvc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzQxYjZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fQVNNX1NIX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX19BU01fU0hfU1BJTkxPQ0tfVFlQRVNfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fU1BJTl9MT0NLX1VOTE9DS0VECQl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJcmF3X3NwaW5sb2NrX3QgbG9jazsKKwlhdG9taWNfdCBjb3VudGVyOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgUldfTE9DS19CSUFTCQkJMHgwMTAwMDAwMAorI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VECQl7IHsgMCB9LCB7IFJXX0xPQ0tfQklBUyB9IH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC90eXBlcy5oIGIvaW5jbHVkZS9hc20tc2gvdHlwZXMuaAppbmRleCBjNGRjMTI2Li5jYjdlMTgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3R5cGVzLmgKQEAgLTU4LDggKzU4LDYgQEAKICNkZWZpbmUgSEFWRV9TRUNUT1JfVAogI2VuZGlmCiAKLXR5cGVkZWYgdW5zaWduZWQgaW50IGttZW1fYnVmY3RsX3Q7Ci0KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaAppbmRleCBmYjllMzM0Li4yY2IwMTg2MWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1zaC91YWNjZXNzLmgKQEAgLTE0NiwxMiArMTQ2LDYgQEAKIAlyZXR1cm4gX19hY2Nlc3Nfb2soYWRkciwgc2l6ZSk7CiB9CiAKLS8qIHRoaXMgZnVuY3Rpb24gd2lsbCBnbyBhd2F5IHNvb24gLSB1c2UgYWNjZXNzX29rKCkgaW5zdGVhZCAqLwotc3RhdGljIGlubGluZSBpbnQgX19kZXByZWNhdGVkIHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkIF9fdXNlciAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKSA/IDAgOiAtRUZBVUxUOwotfQotCiAvKgogICogVWgsIHRoZXNlIHNob3VsZCBiZWNvbWUgdGhlIG1haW4gc2luZ2xlLXZhbHVlIHRyYW5zZmVyIHJvdXRpbmVzIC4uLgogICogVGhleSBhdXRvbWF0aWNhbGx5IHVzZSB0aGUgcmlnaHQgc2l6ZSBpZiB3ZSBqdXN0IGhhdmUgdGhlIHJpZ2h0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tc2g2NC9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWQ1YTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX19BU01fU0g2NF9BVVhWRUNfSAorI2RlZmluZSBfX0FTTV9TSDY0X0FVWFZFQ19ICisKKyNlbmRpZiAvKiBfX0FTTV9TSDY0X0FVWFZFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1zaDY0L2ZjbnRsLmgKaW5kZXggZmZjYzM2Yy4uNzQ0ZGQ3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvZmNudGwuaApAQCAtMSw3ICsxIEBACi0jaWZuZGVmIF9fQVNNX1NINjRfRkNOVExfSAotI2RlZmluZSBfX0FTTV9TSDY0X0ZDTlRMX0gKLQogI2luY2x1ZGUgPGFzbS1zaC9mY250bC5oPgotCi0jZW5kaWYgLyogX19BU01fU0g2NF9GQ05UTF9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLXNoNjQvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9oZHJlZy5oIGIvaW5jbHVkZS9hc20tc2g2NC9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmQ5ODM2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9TSDY0X0hEUkVHX0gKLSNkZWZpbmUgX19BU01fU0g2NF9IRFJFR19ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9oZHJlZy5oPgotCi0jZW5kaWYgLyogX19BU01fU0g2NF9IRFJFR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXNoNjQvcGFnZS5oCmluZGV4IGQ2MTY3ZjEuLmM4NmRmOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvcGFnZS5oCkBAIC0xMTUsMjQgKzExNSw4IEBACiAjZGVmaW5lIFZNX0RBVEFfREVGQVVMVF9GTEFHUwkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fRVhFQyB8IFwKIAkJCQkgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKIAotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotLyogUHVyZSAyXm4gdmVyc2lvbiBvZiBnZXRfb3JkZXIgKi8KLWV4dGVybiBfX2lubGluZV9fIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBvcmRlcjsKLQotCXNpemUgPSAoc2l6ZS0xKSA+PiAoUEFHRV9TSElGVC0xKTsKLQlvcmRlciA9IC0xOwotCWRvIHsKLQkJc2l6ZSA+Pj0gMTsKLQkJb3JkZXIrKzsKLQl9IHdoaWxlIChzaXplKTsKLQlyZXR1cm4gb3JkZXI7Ci19Ci0KLSNlbmRpZgotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgorCiAjZW5kaWYgLyogX19BU01fU0g2NF9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXNoNjQvdHlwZXMuaAppbmRleCA0MWQ0ZDJmLi44ZDQxZGIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaDY0L3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC90eXBlcy5oCkBAIC02NSw4ICs2NSw2IEBACiAjZW5kaWYKIHR5cGVkZWYgdTY0IGRtYTY0X2FkZHJfdDsKIAotdHlwZWRlZiB1bnNpZ25lZCBpbnQga21lbV9idWZjdGxfdDsKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZGVmaW5lIEJJVFNfUEVSX0xPTkcgMzIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tc2g2NC91YWNjZXNzLmgKaW5kZXggYTMzNjU0ZC4uNTZhYTNjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC91YWNjZXNzLmgKQEAgLTYwLDEyICs2MCw2IEBACiAjZGVmaW5lIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgKF9fcmFuZ2Vfb2soYWRkcixzaXplKSA9PSAwKQogI2RlZmluZSBfX2FjY2Vzc19vayhhZGRyLHNpemUpIChfX3JhbmdlX29rKGFkZHIsc2l6ZSkgPT0gMCkKIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1leHRlcm4gaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpID8gMCA6IC1FRkFVTFQ7Ci19Ci0KIC8qCiAgKiBVaCwgdGhlc2Ugc2hvdWxkIGJlY29tZSB0aGUgbWFpbiBzaW5nbGUtdmFsdWUgdHJhbnNmZXIgcm91dGluZXMgLi4uCiAgKiBUaGV5IGF1dG9tYXRpY2FsbHkgdXNlIHRoZSByaWdodCBzaXplIGlmIHdlIGp1c3QgaGF2ZSB0aGUgcmlnaHQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tc3BhcmMvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2ZjM2MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX0FTTVNQQVJDX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNU1BBUkNfQVVYVkVDX0gKKworI2VuZGlmIC8qICEoX19BU01TUEFSQ19BVVhWRUNfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9mY250bC5oCmluZGV4IGRmOWM3NWQuLjVkYjYwYjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvZmNudGwuaApAQCAtNCwxMCArNCw2IEBACiAKIC8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKICAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX1JET05MWQkweDAwMDAKLSNkZWZpbmUgT19XUk9OTFkJMHgwMDAxCi0jZGVmaW5lIE9fUkRXUgkJMHgwMDAyCi0jZGVmaW5lIE9fQUNDTU9ERQkweDAwMDMKICNkZWZpbmUgT19BUFBFTkQJMHgwMDA4CiAjZGVmaW5lIEZBU1lOQwkJMHgwMDQwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgT19DUkVBVAkJMHgwMjAwCS8qIG5vdCBmY250bCAqLwpAQCAtMTcsNzMgKzEzLDI0IEBACiAjZGVmaW5lIE9fTk9OQkxPQ0sJMHg0MDAwCiAjZGVmaW5lIE9fTkRFTEFZCSgweDAwMDQgfCBPX05PTkJMT0NLKQogI2RlZmluZSBPX05PQ1RUWQkweDgwMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRElSRUNUT1JZCTB4MTAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XCTB4MjAwMDAJLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCiAjZGVmaW5lIE9fTEFSR0VGSUxFCTB4NDAwMDAKICNkZWZpbmUgT19ESVJFQ1QgICAgICAgIDB4MTAwMDAwIC8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50ICovCiAjZGVmaW5lIE9fTk9BVElNRQkweDIwMDAwMAogCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KICNkZWZpbmUgRl9HRVRPV04JNQkvKiAgZm9yIHNvY2tldHMuICovCiAjZGVmaW5lIEZfU0VUT1dOCTYJLyogIGZvciBzb2NrZXRzLiAqLwogI2RlZmluZSBGX0dFVExLCQk3CiAjZGVmaW5lIEZfU0VUTEsJCTgKICNkZWZpbmUgRl9TRVRMS1cJOQotI2RlZmluZSBGX1NFVFNJRwkxMAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUU0lHCTExCS8qICBmb3Igc29ja2V0cy4gKi8KLQotI2RlZmluZSBGX0dFVExLNjQJMTIJLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KLSNkZWZpbmUgRl9TRVRMSzY0CTEzCi0jZGVmaW5lIEZfU0VUTEtXNjQJMTQKLQotLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KLSNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLwogCiAvKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLwogI2RlZmluZSBGX1JETENLCQkxCiAjZGVmaW5lIEZfV1JMQ0sJCTIKICNkZWZpbmUgRl9VTkxDSwkJMwogCi0vKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLwotI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KLSNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCisjZGVmaW5lIF9fQVJDSF9GTE9DS19QQUQJc2hvcnQgX191bnVzZWQ7CisjZGVmaW5lIF9fQVJDSF9GTE9DSzY0X1BBRAlzaG9ydCBfX3VudXNlZDsKIAotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgogCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLQlzaG9ydCBfX3VudXNlZDsKLX07Ci0KLXN0cnVjdCBmbG9jazY0IHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0JbG9mZl90IGxfc3RhcnQ7Ci0JbG9mZl90IGxfbGVuOwotCXBpZF90IGxfcGlkOwotCXNob3J0IF9fdW51c2VkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9mdXRleC5oIGIvaW5jbHVkZS9hc20tc3BhcmMvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvZnV0ZXguaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9BU01fRlVURVhfSAorI2RlZmluZSBfQVNNX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJY2FzZSBGVVRFWF9PUF9PUjoKKwljYXNlIEZVVEVYX09QX0FORE46CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL2hkcmVnLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdmZDFhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL2hkcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaGRyZWcuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3BhZ2UuaAppbmRleCAzODMwNjBlLi45MTIyNjg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvcGFnZS5oCkBAIC0xMzIsMjAgKzEzMiw2IEBACiAKICNkZWZpbmUgVEFTS19VTk1BUFBFRF9CQVNFCUJURklYVVBfU0VUSEkoc3BhcmNfdW5tYXBwZWRfYmFzZSkKIAotLyogUHVyZSAyXm4gdmVyc2lvbiBvZiBnZXRfb3JkZXIgKi8KLWV4dGVybiBfX2lubGluZV9fIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBvcmRlcjsKLQotCXNpemUgPSAoc2l6ZS0xKSA+PiAoUEFHRV9TSElGVC0xKTsKLQlvcmRlciA9IC0xOwotCWRvIHsKLQkJc2l6ZSA+Pj0gMTsKLQkJb3JkZXIrKzsKLQl9IHdoaWxlIChzaXplKTsKLQlyZXR1cm4gb3JkZXI7Ci19Ci0KICNlbHNlIC8qICEoX19BU1NFTUJMWV9fKSAqLwogCiAjZGVmaW5lIF9fcGdwcm90KHgpCSh4KQpAQCAtMTc4LDQgKzE2NCw2IEBACiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYWdlLmg+CisKICNlbmRpZiAvKiBfU1BBUkNfUEFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9wZ3RhYmxlLmgKaW5kZXggNDBlZDMwYS4uOGY0ZjZhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3BndGFibGUuaApAQCAtNDM1LDkgKzQzNSw2IEBACiAjZGVmaW5lIGtlcm5fYWRkcl92YWxpZChhZGRyKSBcCiAJKHRlc3RfYml0KF9fcGEoKHVuc2lnbmVkIGxvbmcpKGFkZHIpKT4+MjAsIHNwYXJjX3ZhbGlkX2FkZHJfYml0bWFwKSkKIAotZXh0ZXJuIGludCBpb19yZW1hcF9wYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZnJvbSwgdW5zaWduZWQgbG9uZyB0bywKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHBncHJvdF90IHByb3QsIGludCBzcGFjZSk7CiBleHRlcm4gaW50IGlvX3JlbWFwX3Bmbl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZnJvbSwgdW5zaWduZWQgbG9uZyBwZm4sCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHBncHJvdF90IHByb3QpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9wdHJhY2UuaAppbmRleCBkZDlkOTRkLi5hOGVjYjJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9wdHJhY2UuaApAQCAtNzMsMTEgKzczLDExIEBACiAjZW5kaWYKIAogLyoKLSAqIFRoZSBhc21fb2Zmc2V0cy5oIGlzIGEgZ2VuZXJhdGVkIGZpbGUsIHNvIHdlIGNhbm5vdCBpbmNsdWRlIGl0LgorICogVGhlIGFzbS1vZmZzZXRzLmggaXMgYSBnZW5lcmF0ZWQgZmlsZSwgc28gd2UgY2Fubm90IGluY2x1ZGUgaXQuCiAgKiBJdCBtYXkgYmUgT0sgZm9yIGdsaWJjIGhlYWRlcnMsIGJ1dCBpdCdzIHV0dGVybHkgcG9pbnRsZXNzIGZvciBDIGNvZGUuCiAgKiBUaGUgYXNzZW1ibHkgY29kZSB1c2luZyB0aG9zZSBvZmZzZXRzIGhhcyB0byBpbmNsdWRlIGl0IGV4cGxpY2l0bHkuCiAgKi8KLS8qICNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4gKi8KKy8qICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4gKi8KIAogLyogVGhlc2UgYXJlIGZvciBwdF9yZWdzLiAqLwogI2RlZmluZSBQVF9QU1IgICAgMHgwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tc3BhcmMvc3BpbmxvY2suaAppbmRleCAwY2JkODdhLi4xMTE3MjdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3NwaW5sb2NrLmgKQEAgLTEyLDk2ICsxMiwxMiBAQAogCiAjaW5jbHVkZSA8YXNtL3Bzci5oPgogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi1zdHJ1Y3QgX3NwaW5sb2NrX2RlYnVnIHsKLQl1bnNpZ25lZCBjaGFyIGxvY2s7Ci0JdW5zaWduZWQgbG9uZyBvd25lcl9wYzsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19OwotdHlwZWRlZiBzdHJ1Y3QgX3NwaW5sb2NrX2RlYnVnIHNwaW5sb2NrX3Q7CisjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKGxvY2spICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGxvY2spKSAhPSAwKQogCi0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRAkoc3BpbmxvY2tfdCkgeyAwLCAwIH0KLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQobHApCWRvIHsgKihscCk9IFNQSU5fTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotI2RlZmluZSBzcGluX2lzX2xvY2tlZChscCkgICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKCYoKGxwKS0+bG9jaykpKSAhPSAwKQotI2RlZmluZSBzcGluX3VubG9ja193YWl0KGxwKQlkbyB7IGJhcnJpZXIoKTsgfSB3aGlsZSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoJihscCktPmxvY2spKQorI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KGxvY2spIFwKKwlkbyB7IHdoaWxlIChfX3Jhd19zcGluX2lzX2xvY2tlZChsb2NrKSkgY3B1X3JlbGF4KCk7IH0gd2hpbGUgKDApCiAKLWV4dGVybiB2b2lkIF9kb19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaywgY2hhciAqc3RyKTsKLWV4dGVybiBpbnQgX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKTsKLWV4dGVybiB2b2lkIF9kb19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKTsKLQotI2RlZmluZSBfcmF3X3NwaW5fdHJ5bG9jayhscCkJX3NwaW5fdHJ5bG9jayhscCkKLSNkZWZpbmUgX3Jhd19zcGluX2xvY2sobG9jaykJX2RvX3NwaW5fbG9jayhsb2NrLCAic3Bpbl9sb2NrIikKLSNkZWZpbmUgX3Jhd19zcGluX3VubG9jayhsb2NrKQlfZG9fc3Bpbl91bmxvY2sobG9jaykKLQotc3RydWN0IF9yd2xvY2tfZGVidWcgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOwotCXVuc2lnbmVkIGxvbmcgb3duZXJfcGM7Ci0JdW5zaWduZWQgbG9uZyByZWFkZXJfcGNbTlJfQ1BVU107Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfTsKLXR5cGVkZWYgc3RydWN0IF9yd2xvY2tfZGVidWcgcndsb2NrX3Q7Ci0KLSNkZWZpbmUgUldfTE9DS19VTkxPQ0tFRCAocndsb2NrX3QpIHsgMCwgMCwgezB9IH0KLQotI2RlZmluZSByd2xvY2tfaW5pdChscCkJZG8geyAqKGxwKT0gUldfTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi1leHRlcm4gdm9pZCBfZG9fcmVhZF9sb2NrKHJ3bG9ja190ICpydywgY2hhciAqc3RyKTsKLWV4dGVybiB2b2lkIF9kb19yZWFkX3VubG9jayhyd2xvY2tfdCAqcncsIGNoYXIgKnN0cik7Ci1leHRlcm4gdm9pZCBfZG9fd3JpdGVfbG9jayhyd2xvY2tfdCAqcncsIGNoYXIgKnN0cik7Ci1leHRlcm4gdm9pZCBfZG9fd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydyk7Ci0KLSNkZWZpbmUgX3Jhd19yZWFkX2xvY2sobG9jaykJXAotZG8gewl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCi0JX2RvX3JlYWRfbG9jayhsb2NrLCAicmVhZF9sb2NrIik7IFwKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBfcmF3X3JlYWRfdW5sb2NrKGxvY2spIFwKLWRvIHsJdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAotCV9kb19yZWFkX3VubG9jayhsb2NrLCAicmVhZF91bmxvY2siKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIF9yYXdfd3JpdGVfbG9jayhsb2NrKSBcCi1kbyB7CXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKLQlfZG9fd3JpdGVfbG9jayhsb2NrLCAid3JpdGVfbG9jayIpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgX3Jhd193cml0ZV91bmxvY2sobG9jaykgXAotZG8gewl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCi0JX2RvX3dyaXRlX3VubG9jayhsb2NrKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAotfSB3aGlsZSgwKQotCi0jZWxzZSAvKiAhQ09ORklHX0RFQlVHX1NQSU5MT0NLICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBjaGFyIGxvY2s7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSBzcGlubG9ja190OwotCi0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRAkoc3BpbmxvY2tfdCkgeyAwIH0KLQotI2RlZmluZSBzcGluX2xvY2tfaW5pdChsb2NrKSAgICgqKCh1bnNpZ25lZCBjaGFyICopKGxvY2spKSA9IDApCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKGxvY2spICAgICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGxvY2spKSAhPSAwKQotCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQobG9jaykgXAotZG8geyBcCi0JYmFycmllcigpOyBcCi19IHdoaWxlKCooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilsb2NrKSkKLQotZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfcmF3X3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrKQorZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJIlxuMTpcblx0IgpAQCAtMTIxLDcgKzM3LDcgQEAKIAk6ICJnMiIsICJtZW1vcnkiLCAiY2MiKTsKIH0KIAotZXh0ZXJuIF9faW5saW5lX18gaW50IF9yYXdfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2spCitleHRlcm4gX19pbmxpbmVfXyBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCXVuc2lnbmVkIGludCByZXN1bHQ7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oImxkc3R1YiBbJTFdLCAlMCIKQEAgLTEzMSw3ICs0Nyw3IEBACiAJcmV0dXJuIChyZXN1bHQgPT0gMCk7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIHZvaWQgX3Jhd19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQorZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RiICUlZzAsIFslMF0iIDogOiAiciIgKGxvY2spIDogIm1lbW9yeSIpOwogfQpAQCAtMTQ3LDIzICs2MywxMSBAQAogICoKICAqIFhYWCBUaGlzIG1pZ2h0IGNyZWF0ZSBzb21lIHByb2JsZW1zIHdpdGggbXkgZHVhbCBzcGlubG9jawogICogWFhYIHNjaGVtZSwgZGVhZGxvY2tzIGV0Yy4gLURhdmVNCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHJ3bG9ja190OwotCi0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQgKHJ3bG9ja190KSB7IDAgfQotCi0jZGVmaW5lIHJ3bG9ja19pbml0KGxwKQlkbyB7ICoobHApPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0KLQotLyogU29ydCBvZiBsaWtlIGF0b21pY190J3Mgb24gU3BhcmMsIGJ1dCBldmVuIG1vcmUgY2xldmVyLgorICoKKyAqIFNvcnQgb2YgbGlrZSBhdG9taWNfdCdzIG9uIFNwYXJjLCBidXQgZXZlbiBtb3JlIGNsZXZlci4KICAqCiAgKgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCXwgMjQtYml0IGNvdW50ZXIgICAgICAgICAgIHwgd2xvY2sgfCAgcndsb2NrX3QKKyAqCXwgMjQtYml0IGNvdW50ZXIgICAgICAgICAgIHwgd2xvY2sgfCAgcmF3X3J3bG9ja190CiAgKgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCSAzMSAgICAgICAgICAgICAgICAgICAgICAgOCA3ICAgICAwCiAgKgpAQCAtMTc0LDkgKzc4LDkgQEAKICAqCiAgKiBVbmZvcnR1bmF0ZWx5IHRoaXMgc2NoZW1lIGxpbWl0cyB1cyB0byB+MTYsMDAwLDAwMCBjcHVzLgogICovCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIF9yZWFkX2xvY2socndsb2NrX3QgKnJ3KQorZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfX3JlYWRfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewotCXJlZ2lzdGVyIHJ3bG9ja190ICpscCBhc20oImcxIik7CisJcmVnaXN0ZXIgcmF3X3J3bG9ja190ICpscCBhc20oImcxIik7CiAJbHAgPSBydzsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkibW92CSUlbzcsICUlZzRcblx0IgpAQCAtMTg3LDE2ICs5MSwxNiBAQAogCTogImcyIiwgImc0IiwgIm1lbW9yeSIsICJjYyIpOwogfQogCi0jZGVmaW5lIF9yYXdfcmVhZF9sb2NrKGxvY2spIFwKKyNkZWZpbmUgX19yYXdfcmVhZF9sb2NrKGxvY2spIFwKIGRvIHsJdW5zaWduZWQgbG9uZyBmbGFnczsgXAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAotCV9yZWFkX2xvY2sobG9jayk7IFwKKwlfX3Jhd19yZWFkX2xvY2sobG9jayk7IFwKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKIH0gd2hpbGUoMCkKIAotZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfcmVhZF91bmxvY2socndsb2NrX3QgKnJ3KQorZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfX3JlYWRfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7Ci0JcmVnaXN0ZXIgcndsb2NrX3QgKmxwIGFzbSgiZzEiKTsKKwlyZWdpc3RlciByYXdfcndsb2NrX3QgKmxwIGFzbSgiZzEiKTsKIAlscCA9IHJ3OwogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCSJtb3YJJSVvNywgJSVnNFxuXHQiCkBAIC0yMDcsMTYgKzExMSwxNiBAQAogCTogImcyIiwgImc0IiwgIm1lbW9yeSIsICJjYyIpOwogfQogCi0jZGVmaW5lIF9yYXdfcmVhZF91bmxvY2sobG9jaykgXAorI2RlZmluZSBfX3Jhd19yZWFkX3VubG9jayhsb2NrKSBcCiBkbyB7CXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKLQlfcmVhZF91bmxvY2sobG9jayk7IFwKKwlfX3Jhd19yZWFkX3VubG9jayhsb2NrKTsgXAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAogfSB3aGlsZSgwKQogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIF9yYXdfd3JpdGVfbG9jayhyd2xvY2tfdCAqcncpCitleHRlcm4gX19pbmxpbmVfXyB2b2lkIF9fcmF3X3dyaXRlX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKLQlyZWdpc3RlciByd2xvY2tfdCAqbHAgYXNtKCJnMSIpOworCXJlZ2lzdGVyIHJhd19yd2xvY2tfdCAqbHAgYXNtKCJnMSIpOwogCWxwID0gcnc7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJIm1vdgklJW83LCAlJWc0XG5cdCIKQEAgLTIyNywxMSArMTMxLDkgQEAKIAk6ICJnMiIsICJnNCIsICJtZW1vcnkiLCAiY2MiKTsKIH0KIAotI2RlZmluZSBfcmF3X3dyaXRlX3VubG9jayhydykJZG8geyAocncpLT5sb2NrID0gMDsgfSB3aGlsZSgwKQorI2RlZmluZSBfX3Jhd193cml0ZV91bmxvY2socncpCWRvIHsgKHJ3KS0+bG9jayA9IDA7IH0gd2hpbGUoMCkKIAotI2VuZGlmIC8qIENPTkZJR19ERUJVR19TUElOTE9DSyAqLwotCi0jZGVmaW5lIF9yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfcmF3X3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQogCiAjZW5kaWYgLyogIShfX0FTU0VNQkxZX18pICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMGZiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9zcGlubG9ja190eXBlcy5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX19TUEFSQ19TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9fU1BBUkNfU1BJTkxPQ0tfVFlQRVNfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIGxvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19yd2xvY2tfdDsKKworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VECQl7IDAgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3R5cGVzLmggYi9pbmNsdWRlL2FzbS1zcGFyYy90eXBlcy5oCmluZGV4IDllYWJmNmUuLjQyZmM2ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvdHlwZXMuaApAQCAtNTQsOCArNTQsNiBAQAogdHlwZWRlZiB1MzIgZG1hX2FkZHJfdDsKIHR5cGVkZWYgdTMyIGRtYTY0X2FkZHJfdDsKIAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBrbWVtX2J1ZmN0bF90OwotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1zcGFyYy91YWNjZXNzLmgKaW5kZXggMGE3ODBlOC4uZjhmMWVjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3VhY2Nlc3MuaApAQCAtNDcsMTIgKzQ3LDYgQEAKICNkZWZpbmUgYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpCQkJCQlcCiAJKHsgKHZvaWQpKHR5cGUpOyBfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZykoYWRkciksIHNpemUpOyB9KQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKiBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQogLyoKICAqIFRoZSBleGNlcHRpb24gdGFibGUgY29uc2lzdHMgb2YgcGFpcnMgb2YgYWRkcmVzc2VzOiB0aGUgZmlyc3QgaXMgdGhlCiAgKiBhZGRyZXNzIG9mIGFuIGluc3RydWN0aW9uIHRoYXQgaXMgYWxsb3dlZCB0byBmYXVsdCwgYW5kIHRoZSBzZWNvbmQgaXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNmEyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX0FTTV9TUEFSQzY0X0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNX1NQQVJDNjRfQVVYVkVDX0gKKworI2VuZGlmIC8qICEoX19BU01fU1BBUkM2NF9BVVhWRUNfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NvbXBhdC5oCmluZGV4IGI1OTEyMmQuLmM3MzkzNWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9jb21wYXQuaApAQCAtMTIsOCArMTIsMTAgQEAKIHR5cGVkZWYgczMyCQljb21wYXRfdGltZV90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9jbG9ja190OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9waWRfdDsKLXR5cGVkZWYgdTE2CQljb21wYXRfdWlkX3Q7Ci10eXBlZGVmIHUxNgkJY29tcGF0X2dpZF90OwordHlwZWRlZiB1MTYJCV9fY29tcGF0X3VpZF90OwordHlwZWRlZiB1MTYJCV9fY29tcGF0X2dpZF90OwordHlwZWRlZiB1MzIJCV9fY29tcGF0X3VpZDMyX3Q7Cit0eXBlZGVmIHUzMgkJX19jb21wYXRfZ2lkMzJfdDsKIHR5cGVkZWYgdTE2CQljb21wYXRfbW9kZV90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF9pbm9fdDsKIHR5cGVkZWYgdTE2CQljb21wYXRfZGV2X3Q7CkBAIC00Nyw4ICs0OSw4IEBACiAJY29tcGF0X2lub190CXN0X2lubzsKIAljb21wYXRfbW9kZV90CXN0X21vZGU7CiAJY29tcGF0X25saW5rX3QJc3Rfbmxpbms7Ci0JY29tcGF0X3VpZF90CXN0X3VpZDsKLQljb21wYXRfZ2lkX3QJc3RfZ2lkOworCV9fY29tcGF0X3VpZF90CXN0X3VpZDsKKwlfX2NvbXBhdF9naWRfdAlzdF9naWQ7CiAJY29tcGF0X2Rldl90CXN0X3JkZXY7CiAJY29tcGF0X29mZl90CXN0X3NpemU7CiAJY29tcGF0X3RpbWVfdAlzdF9hdGltZTsKQEAgLTE3NywxMCArMTc5LDEwIEBACiAKIHN0cnVjdCBjb21wYXRfaXBjNjRfcGVybSB7CiAJY29tcGF0X2tleV90IGtleTsKLQlfX2tlcm5lbF91aWRfdCB1aWQ7Ci0JX19rZXJuZWxfZ2lkX3QgZ2lkOwotCV9fa2VybmVsX3VpZF90IGN1aWQ7Ci0JX19rZXJuZWxfZ2lkX3QgY2dpZDsKKwlfX2NvbXBhdF91aWQzMl90IHVpZDsKKwlfX2NvbXBhdF9naWQzMl90IGdpZDsKKwlfX2NvbXBhdF91aWQzMl90IGN1aWQ7CisJX19jb21wYXRfZ2lkMzJfdCBjZ2lkOwogCXVuc2lnbmVkIHNob3J0IF9fcGFkMTsKIAljb21wYXRfbW9kZV90IG1vZGU7CiAJdW5zaWduZWQgc2hvcnQgX19wYWQyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9jcHVkYXRhLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NwdWRhdGEuaAppbmRleCBjYzcxOThhLi45YTNhODFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NwdWRhdGEuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NwdWRhdGEuaApAQCAtMSw2ICsxLDYgQEAKIC8qIGNwdWRhdGEuaDogUGVyLWNwdSBwYXJhbWV0ZXJzLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQogICovCiAKICNpZm5kZWYgX1NQQVJDNjRfQ1BVREFUQV9ICkBAIC0xMCw3ICsxMCw3IEBACiAKIHR5cGVkZWYgc3RydWN0IHsKIAkvKiBEY2FjaGUgbGluZSAxICovCi0JdW5zaWduZWQgaW50CV9fcGFkMDsJCS8qIGJoX2NvdW50IG1vdmVkIHRvIGlycV9zdGF0IGZvciBjb25zaXN0ZW5jeS4gS0FPICovCisJdW5zaWduZWQgaW50CV9fc29mdGlycV9wZW5kaW5nOyAvKiBtdXN0IGJlIDFzdCwgc2VlIHJ0cmFwLlMgKi8KIAl1bnNpZ25lZCBpbnQJbXVsdGlwbGllcjsKIAl1bnNpZ25lZCBpbnQJY291bnRlcjsKIAl1bnNpZ25lZCBpbnQJaWRsZV92b2x1bWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2ZjbnRsLmgKaW5kZXggZTM2ZGVmMC4uYjJhZWNmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmNudGwuaApAQCAtNCwxMCArNCw2IEBACiAKIC8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKICAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX1JET05MWQkweDAwMDAKLSNkZWZpbmUgT19XUk9OTFkJMHgwMDAxCi0jZGVmaW5lIE9fUkRXUgkJMHgwMDAyCi0jZGVmaW5lIE9fQUNDTU9ERQkweDAwMDMKICNkZWZpbmUgT19OREVMQVkJMHgwMDA0CiAjZGVmaW5lIE9fQVBQRU5ECTB4MDAwOAogI2RlZmluZSBGQVNZTkMJCTB4MDA0MAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCkBAIC0xNyw2MiArMTMsMjQgQEAKICNkZWZpbmUgT19TWU5DCQkweDIwMDAKICNkZWZpbmUgT19OT05CTE9DSwkweDQwMDAKICNkZWZpbmUgT19OT0NUVFkJMHg4MDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0RJUkVDVE9SWQkweDEwMDAwCS8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgT19OT0ZPTExPVwkweDIwMDAwCS8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLwogI2RlZmluZSBPX0xBUkdFRklMRQkweDQwMDAwCiAjZGVmaW5lIE9fRElSRUNUICAgICAgICAweDEwMDAwMCAvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLwogI2RlZmluZSBPX05PQVRJTUUJMHgyMDAwMDAKIAogCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KICNkZWZpbmUgRl9HRVRPV04JNQkvKiAgZm9yIHNvY2tldHMuICovCiAjZGVmaW5lIEZfU0VUT1dOCTYJLyogIGZvciBzb2NrZXRzLiAqLwogI2RlZmluZSBGX0dFVExLCQk3CiAjZGVmaW5lIEZfU0VUTEsJCTgKICNkZWZpbmUgRl9TRVRMS1cJOQotI2RlZmluZSBGX1NFVFNJRwkxMAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUU0lHCTExCS8qICBmb3Igc29ja2V0cy4gKi8KLQotLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KLSNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLwogCiAvKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLwogI2RlZmluZSBGX1JETENLCQkxCiAjZGVmaW5lIEZfV1JMQ0sJCTIKICNkZWZpbmUgRl9VTkxDSwkJMwogCi0vKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLwotI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KLSNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCisjZGVmaW5lIF9fQVJDSF9GTE9DS19QQUQJc2hvcnQgX191bnVzZWQ7CiAKLS8qIGZvciBsZWFzZXMgKi8KLSNkZWZpbmUgRl9JTlBST0dSRVNTCTE2Ci0KLS8qIG9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAqLwotI2RlZmluZSBMT0NLX1NICQkxCS8qIHNoYXJlZCBsb2NrICovCi0jZGVmaW5lIExPQ0tfRVgJCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19OQgkJNAkvKiBvcidkIHdpdGggb25lIG9mIHRoZSBhYm92ZSB0byBwcmV2ZW50Ci0JCQkJICAgYmxvY2tpbmcgKi8KLSNkZWZpbmUgTE9DS19VTgkJOAkvKiByZW1vdmUgbG9jayAqLwotCi0jZGVmaW5lIExPQ0tfTUFORAkzMgkvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrICovCi0jZGVmaW5lIExPQ0tfUkVBRAk2NAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfV1JJVEUJMTI4CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfUlcJCTE5MgkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCAmIHdyaXRlIG9wcyAqLwotCi1zdHJ1Y3QgZmxvY2sgewotCXNob3J0IGxfdHlwZTsKLQlzaG9ydCBsX3doZW5jZTsKLQlvZmZfdCBsX3N0YXJ0OwotCW9mZl90IGxfbGVuOwotCXBpZF90IGxfcGlkOwotCXNob3J0IF9fdW51c2VkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CiAKICNlbmRpZiAvKiAhKF9TUEFSQzY0X0ZDTlRMX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZnV0ZXguaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9BU01fRlVURVhfSAorI2RlZmluZSBfQVNNX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJY2FzZSBGVVRFWF9PUF9PUjoKKwljYXNlIEZVVEVYX09QX0FORE46CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaGFyZGlycS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9oYXJkaXJxLmgKaW5kZXggZDZkYjFhZS4uZjBjZjcxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9oYXJkaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9oYXJkaXJxLmgKQEAgLTEsMjIgKzEsMTYgQEAKIC8qIGhhcmRpcnEuaDogNjQtYml0IFNwYXJjIGhhcmQgSVJRIHN1cHBvcnQuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMjAwNSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2lmbmRlZiBfX1NQQVJDNjRfSEFSRElSUV9ICiAjZGVmaW5lIF9fU1BBUkM2NF9IQVJESVJRX0gKIAotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL2NwdWRhdGEuaD4KIAotLyogcnRyYXAuUyBpcyBzZW5zaXRpdmUgdG8gdGhlIG9mZnNldHMgb2YgdGhlc2UgZmllbGRzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50IF9fc29mdGlycV9wZW5kaW5nOwotfSBfX19fY2FjaGVsaW5lX2FsaWduZWQgaXJxX2NwdXN0YXRfdDsKLQotI2luY2x1ZGUgPGxpbnV4L2lycV9jcHVzdGF0Lmg+CS8qIFN0YW5kYXJkIG1hcHBpbmdzIGZvciBpcnFfY3B1c3RhdF90IGFib3ZlICovCisjZGVmaW5lIF9fQVJDSF9JUlFfU1RBVAorI2RlZmluZSBsb2NhbF9zb2Z0aXJxX3BlbmRpbmcoKSBcCisJKGxvY2FsX2NwdV9kYXRhKCkuX19zb2Z0aXJxX3BlbmRpbmcpCiAKICNkZWZpbmUgSEFSRElSUV9CSVRTCTgKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9oZHJlZy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdmZDFhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9oZHJlZy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pby5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9pby5oCmluZGV4IGFmZGNlYTkuLjAwNTY3NzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2lvLmgKQEAgLTEwMCwxOCArMTAwLDQxIEBACiAjZGVmaW5lIGlubF9wKF9fYWRkcikJCWlubChfX2FkZHIpCiAjZGVmaW5lIG91dGxfcChfX2wsIF9fYWRkcikJb3V0bChfX2wsIF9fYWRkcikKIAotZXh0ZXJuIHZvaWQgb3V0c2Iodm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgb3V0c3codm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgb3V0c2wodm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgaW5zYih2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBpbnN3KHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIGluc2wodm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotI2RlZmluZSBpb3JlYWQ4X3JlcChhLGQsYykJaW5zYihhLGQsYykKLSNkZWZpbmUgaW9yZWFkMTZfcmVwKGEsZCxjKQlpbnN3KGEsZCxjKQotI2RlZmluZSBpb3JlYWQzMl9yZXAoYSxkLGMpCWluc2woYSxkLGMpCi0jZGVmaW5lIGlvd3JpdGU4X3JlcChhLHMsYykJb3V0c2IoYSxzLGMpCi0jZGVmaW5lIGlvd3JpdGUxNl9yZXAoYSxzLGMpCW91dHN3KGEscyxjKQotI2RlZmluZSBpb3dyaXRlMzJfcmVwKGEscyxjKQlvdXRzbChhLHMsYykKK2V4dGVybiB2b2lkIG91dHNiKHVuc2lnbmVkIGxvbmcsIGNvbnN0IHZvaWQgKiwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBvdXRzdyh1bnNpZ25lZCBsb25nLCBjb25zdCB2b2lkICosIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgb3V0c2wodW5zaWduZWQgbG9uZywgY29uc3Qgdm9pZCAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIGluc2IodW5zaWduZWQgbG9uZywgdm9pZCAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIGluc3codW5zaWduZWQgbG9uZywgdm9pZCAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIGluc2wodW5zaWduZWQgbG9uZywgdm9pZCAqLCB1bnNpZ25lZCBsb25nKTsKKworc3RhdGljIGlubGluZSB2b2lkIGlvcmVhZDhfcmVwKHZvaWQgX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCWluc2IoKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlwb3J0LCBidWYsIGNvdW50KTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3JlYWQxNl9yZXAodm9pZCBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJaW5zdygodW5zaWduZWQgbG9uZyBfX2ZvcmNlKXBvcnQsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW9yZWFkMzJfcmVwKHZvaWQgX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCWluc2woKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlwb3J0LCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvd3JpdGU4X3JlcCh2b2lkIF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlvdXRzYigodW5zaWduZWQgbG9uZyBfX2ZvcmNlKXBvcnQsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW93cml0ZTE2X3JlcCh2b2lkIF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlvdXRzdygodW5zaWduZWQgbG9uZyBfX2ZvcmNlKXBvcnQsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW93cml0ZTMyX3JlcCh2b2lkIF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlvdXRzbCgodW5zaWduZWQgbG9uZyBfX2ZvcmNlKXBvcnQsIGJ1ZiwgY291bnQpOworfQogCiAvKiBNZW1vcnkgZnVuY3Rpb25zLCBzYW1lIGFzIEkvTyBhY2Nlc3NlcyBvbiBVbHRyYS4gKi8KIHN0YXRpYyBpbmxpbmUgdTggX3JlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFnZS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wYWdlLmgKaW5kZXggYjg3ZGJiZC4uYzlmOGVmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wYWdlLmgKQEAgLTE1MCwyMCArMTUwLDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBzcGFyY19waHlzX2JhbmtzIHNwX2JhbmtzW1NQQVJDX1BIWVNfQkFOS1NdOwogCi0vKiBQdXJlIDJebiB2ZXJzaW9uIG9mIGdldF9vcmRlciAqLwotc3RhdGljIF9faW5saW5lX18gaW50IGdldF9vcmRlcih1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JaW50IG9yZGVyOwotCi0Jc2l6ZSA9IChzaXplLTEpID4+IChQQUdFX1NISUZULTEpOwotCW9yZGVyID0gLTE7Ci0JZG8gewotCQlzaXplID4+PSAxOwotCQlvcmRlcisrOwotCX0gd2hpbGUgKHNpemUpOwotCXJldHVybiBvcmRlcjsKLX0KLQogI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLwogCiAjZGVmaW5lIFZNX0RBVEFfREVGQVVMVF9GTEFHUwkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fRVhFQyB8IFwKQEAgLTE3MSw0ICsxNTcsNiBAQAogCiAjZW5kaWYgLyogIShfX0tFUk5FTF9fKSAqLwogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgorCiAjZW5kaWYgLyogIShfU1BBUkM2NF9QQUdFX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wY2kuaAppbmRleCBhNGFiMGVjLi44OWJkNzFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGNpLmgKQEAgLTI2OSw2ICsyNjksOCBAQAogcGNpYmlvc19idXNfdG9fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMsCiAJCQlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbik7CiAKK2V4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgKnBjaWJpb3Nfc2VsZWN0X3Jvb3Qoc3RydWN0IHBjaV9kZXYgKiwgc3RydWN0IHJlc291cmNlICopOworCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19hZGRfcGxhdGZvcm1fZW50cmllcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaAppbmRleCAxYWUwMGM1Li5hMmI0ZjVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaApAQCAtNDEwLDkgKzQxMCw2IEBACiAjZGVmaW5lIGtlcm5fYWRkcl92YWxpZChhZGRyKQlcCiAJKHRlc3RfYml0KF9fcGEoKHVuc2lnbmVkIGxvbmcpKGFkZHIpKT4+MjIsIHNwYXJjNjRfdmFsaWRfYWRkcl9iaXRtYXApKQogCi1leHRlcm4gaW50IGlvX3JlbWFwX3BhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgZnJvbSwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHBncHJvdF90IHByb3QsIGludCBzcGFjZSk7CiBleHRlcm4gaW50IGlvX3JlbWFwX3Bmbl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBmcm9tLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcGZuLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3QgcHJvdCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwaW5sb2NrLmgKaW5kZXggYTAyYzQzNy4uZWM4NWQxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3BpbmxvY2suaApAQCAtMjksMjQgKzI5LDEzIEBACiAgKiBtdXN0IGJlIHByZS1WOSBicmFuY2hlcy4KICAqLwogCi0jaWZuZGVmIENPTkZJR19ERUJVR19TUElOTE9DSworI2RlZmluZSBfX3Jhd19zcGluX2lzX2xvY2tlZChscCkJKChscCktPmxvY2sgIT0gMCkKIAotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgbG9jazsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHNwaW5sb2NrX3Q7Ci0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRAkoc3BpbmxvY2tfdCkgezAsfQorI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KGxwKQlcCisJZG8gewlybWIoKTsJCQlcCisJfSB3aGlsZSgobHApLT5sb2NrKQogCi0jZGVmaW5lIHNwaW5fbG9ja19pbml0KGxwKQlkbyB7ICoobHApPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLSNkZWZpbmUgc3Bpbl9pc19sb2NrZWQobHApICAoKGxwKS0+bG9jayAhPSAwKQotCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQobHApCVwKLWRvIHsJcm1iKCk7CQkJXAotfSB3aGlsZSgobHApLT5sb2NrKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAKQEAgLTY3LDcgKzU2LDcgQEAKIAk6ICJtZW1vcnkiKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX3Jhd19zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3NwaW5fdHJ5bG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdDsKIApAQCAtODEsNyArNzAsNyBAQAogCXJldHVybiAocmVzdWx0ID09IDBVTCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAiCW1lbWJhcgkJI1N0b3JlU3RvcmUgfCAjTG9hZFN0b3JlXG4iCkBAIC05MSw3ICs4MCw3IEBACiAJOiAibWVtb3J5Iik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fbG9ja19mbGFncyhzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9ja19mbGFncyhyYXdfc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDEsIHRtcDI7CiAKQEAgLTExNSw1MSArMTA0LDkgQEAKIAk6ICJtZW1vcnkiKTsKIH0KIAotI2Vsc2UgLyogIShDT05GSUdfREVCVUdfU1BJTkxPQ0spICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGxvY2s7Ci0JdW5zaWduZWQgaW50IG93bmVyX3BjLCBvd25lcl9jcHU7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSBzcGlubG9ja190OwotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQgKHNwaW5sb2NrX3QpIHsgMCwgMCwgMHhmZiB9Ci0jZGVmaW5lIHNwaW5fbG9ja19pbml0KGxwKQlkbyB7ICoobHApPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLSNkZWZpbmUgc3Bpbl9pc19sb2NrZWQoX19sb2NrKQkoKF9fbG9jayktPmxvY2sgIT0gMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdChfX2xvY2spCVwKLWRvIHsgXAotCXJtYigpOyBcCi19IHdoaWxlKChfX2xvY2spLT5sb2NrKQotCi1leHRlcm4gdm9pZCBfZG9fc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2ssIGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBjYWxsZXIpOwotZXh0ZXJuIHZvaWQgX2RvX3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spOwotZXh0ZXJuIGludCBfZG9fc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgY2FsbGVyKTsKLQotI2RlZmluZSBfcmF3X3NwaW5fdHJ5bG9jayhscCkJXAotCV9kb19zcGluX3RyeWxvY2sobHAsICh1bnNpZ25lZCBsb25nKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCi0jZGVmaW5lIF9yYXdfc3Bpbl9sb2NrKGxvY2spCVwKLQlfZG9fc3Bpbl9sb2NrKGxvY2ssICJzcGluX2xvY2siLCBcCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCi0jZGVmaW5lIF9yYXdfc3Bpbl91bmxvY2sobG9jaykJX2RvX3NwaW5fdW5sb2NrKGxvY2spCi0jZGVmaW5lIF9yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfcmF3X3NwaW5fbG9jayhsb2NrKQotCi0jZW5kaWYgLyogQ09ORklHX0RFQlVHX1NQSU5MT0NLICovCi0KIC8qIE11bHRpLXJlYWRlciBsb2NrcywgdGhlc2UgYXJlIG11Y2ggc2FuZXIgdGhhbiB0aGUgMzItYml0IFNwYXJjIG9uZXMuLi4gKi8KIAotI2lmbmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gcndsb2NrX3Q7Ci0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQJKHJ3bG9ja190KSB7MCx9Ci0jZGVmaW5lIHJ3bG9ja19pbml0KGxwKSBkbyB7ICoobHApID0gUldfTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi1zdGF0aWMgdm9pZCBpbmxpbmUgX19yZWFkX2xvY2socndsb2NrX3QgKmxvY2spCitzdGF0aWMgdm9pZCBpbmxpbmUgX19yZWFkX2xvY2socmF3X3J3bG9ja190ICpsb2NrKQogewogCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKIApAQCAtMTg0LDcgKzEzMSw3IEBACiAJOiAibWVtb3J5Iik7CiB9CiAKLXN0YXRpYyB2b2lkIGlubGluZSBfX3JlYWRfdW5sb2NrKHJ3bG9ja190ICpsb2NrKQorc3RhdGljIHZvaWQgaW5saW5lIF9fcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpsb2NrKQogewogCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKIApAQCAtMjAxLDcgKzE0OCw3IEBACiAJOiAibWVtb3J5Iik7CiB9CiAKLXN0YXRpYyB2b2lkIGlubGluZSBfX3dyaXRlX2xvY2socndsb2NrX3QgKmxvY2spCitzdGF0aWMgdm9pZCBpbmxpbmUgX193cml0ZV9sb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKIHsKIAl1bnNpZ25lZCBsb25nIG1hc2ssIHRtcDEsIHRtcDI7CiAKQEAgLTIyOCw3ICsxNzUsNyBAQAogCTogIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgdm9pZCBpbmxpbmUgX193cml0ZV91bmxvY2socndsb2NrX3QgKmxvY2spCitzdGF0aWMgdm9pZCBpbmxpbmUgX193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpsb2NrKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAogIgltZW1iYXIJCSNMb2FkU3RvcmUgfCAjU3RvcmVTdG9yZVxuIgpAQCAtMjM4LDcgKzE4NSw3IEBACiAJOiAibWVtb3J5Iik7CiB9CiAKLXN0YXRpYyBpbnQgaW5saW5lIF9fd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqbG9jaykKK3N0YXRpYyBpbnQgaW5saW5lIF9fd3JpdGVfdHJ5bG9jayhyYXdfcndsb2NrX3QgKmxvY2spCiB7CiAJdW5zaWduZWQgbG9uZyBtYXNrLCB0bXAxLCB0bXAyLCByZXN1bHQ7CiAKQEAgLTI2Myw3OCArMjEwLDE1IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotI2RlZmluZSBfcmF3X3JlYWRfbG9jayhwKQlfX3JlYWRfbG9jayhwKQotI2RlZmluZSBfcmF3X3JlYWRfdW5sb2NrKHApCV9fcmVhZF91bmxvY2socCkKLSNkZWZpbmUgX3Jhd193cml0ZV9sb2NrKHApCV9fd3JpdGVfbG9jayhwKQotI2RlZmluZSBfcmF3X3dyaXRlX3VubG9jayhwKQlfX3dyaXRlX3VubG9jayhwKQotI2RlZmluZSBfcmF3X3dyaXRlX3RyeWxvY2socCkJX193cml0ZV90cnlsb2NrKHApCisjZGVmaW5lIF9fcmF3X3JlYWRfbG9jayhwKQlfX3JlYWRfbG9jayhwKQorI2RlZmluZSBfX3Jhd19yZWFkX3VubG9jayhwKQlfX3JlYWRfdW5sb2NrKHApCisjZGVmaW5lIF9fcmF3X3dyaXRlX2xvY2socCkJX193cml0ZV9sb2NrKHApCisjZGVmaW5lIF9fcmF3X3dyaXRlX3VubG9jayhwKQlfX3dyaXRlX3VubG9jayhwKQorI2RlZmluZSBfX3Jhd193cml0ZV90cnlsb2NrKHApCV9fd3JpdGVfdHJ5bG9jayhwKQogCi0jZWxzZSAvKiAhKENPTkZJR19ERUJVR19TUElOTE9DSykgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9jazsKLQl1bnNpZ25lZCBpbnQgd3JpdGVyX3BjLCB3cml0ZXJfY3B1OwotCXVuc2lnbmVkIGludCByZWFkZXJfcGNbTlJfQ1BVU107Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKLSNkZWZpbmUgUldfTE9DS19VTkxPQ0tFRAkocndsb2NrX3QpIHsgMCwgMCwgMHhmZiwgeyB9IH0KLSNkZWZpbmUgcndsb2NrX2luaXQobHApIGRvIHsgKihscCkgPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0KLWV4dGVybiB2b2lkIF9kb19yZWFkX2xvY2socndsb2NrX3QgKnJ3LCBjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgY2FsbGVyKTsKLWV4dGVybiB2b2lkIF9kb19yZWFkX3VubG9jayhyd2xvY2tfdCAqcncsIGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBjYWxsZXIpOwotZXh0ZXJuIHZvaWQgX2RvX3dyaXRlX2xvY2socndsb2NrX3QgKnJ3LCBjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgY2FsbGVyKTsKLWV4dGVybiB2b2lkIF9kb193cml0ZV91bmxvY2socndsb2NrX3QgKnJ3LCB1bnNpZ25lZCBsb25nIGNhbGxlcik7Ci1leHRlcm4gaW50IF9kb193cml0ZV90cnlsb2NrKHJ3bG9ja190ICpydywgY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGNhbGxlcik7Ci0KLSNkZWZpbmUgX3Jhd19yZWFkX2xvY2sobG9jaykgXAotZG8gewl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCi0JX2RvX3JlYWRfbG9jayhsb2NrLCAicmVhZF9sb2NrIiwgXAotCQkgICAgICAodW5zaWduZWQgbG9uZykgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIF9yYXdfcmVhZF91bmxvY2sobG9jaykgXAotZG8gewl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCi0JX2RvX3JlYWRfdW5sb2NrKGxvY2ssICJyZWFkX3VubG9jayIsIFwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7IFwKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBfcmF3X3dyaXRlX2xvY2sobG9jaykgXAotZG8gewl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCi0JX2RvX3dyaXRlX2xvY2sobG9jaywgIndyaXRlX2xvY2siLCBcCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgX3Jhd193cml0ZV91bmxvY2sobG9jaykgXAotZG8gewl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCi0JX2RvX3dyaXRlX3VubG9jayhsb2NrLCBcCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgX3Jhd193cml0ZV90cnlsb2NrKGxvY2spIFwKLSh7CXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKLQlpbnQgdmFsOyBcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCi0JdmFsID0gX2RvX3dyaXRlX3RyeWxvY2sobG9jaywgIndyaXRlX3RyeWxvY2siLCBcCi0JCQkJKHVuc2lnbmVkIGxvbmcpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7IFwKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKLQl2YWw7IFwKLX0pCi0KLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfU1BJTkxPQ0sgKi8KLQotI2RlZmluZSBfcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSBnZW5lcmljX3Jhd19yZWFkX3RyeWxvY2sobG9jaykKLSNkZWZpbmUgcmVhZF9jYW5fbG9jayhydykJKCEoKHJ3KS0+bG9jayAmIDB4ODAwMDAwMDBVTCkpCi0jZGVmaW5lIHdyaXRlX2Nhbl9sb2NrKHJ3KQkoIShydyktPmxvY2spCisjZGVmaW5lIF9fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKQlnZW5lcmljX19yYXdfcmVhZF90cnlsb2NrKGxvY2spCisjZGVmaW5lIF9fcmF3X3JlYWRfY2FuX2xvY2socncpCQkoISgocncpLT5sb2NrICYgMHg4MDAwMDAwMFVMKSkKKyNkZWZpbmUgX19yYXdfd3JpdGVfY2FuX2xvY2socncpCSghKHJ3KS0+bG9jaykKIAogI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwaW5sb2NrX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyODExMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fU1BBUkM2NF9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9fU1BBUkM2NF9TUElOTE9DS19UWVBFU19ICisKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19UWVBFU19ICisjIGVycm9yICJwbGVhc2UgZG9uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkiCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgbG9jazsKK30gcmF3X3NwaW5sb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VECXsgMCB9CisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKK30gcmF3X3J3bG9ja190OworCisjZGVmaW5lIF9fUkFXX1JXX0xPQ0tfVU5MT0NLRUQJCXsgMCB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3lzdGVtLmgKaW5kZXggNWU5NGMwNS4uYjU0MTc1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3N5c3RlbS5oCkBAIC0yOCwxMyArMjgsNDggQEAKICNkZWZpbmUgQVJDSF9TVU40Q19TVU40IDAKICNkZWZpbmUgQVJDSF9TVU40IDAKIAotZXh0ZXJuIHZvaWQgbWIodm9pZCk7Ci1leHRlcm4gdm9pZCBybWIodm9pZCk7Ci1leHRlcm4gdm9pZCB3bWIodm9pZCk7Ci1leHRlcm4gdm9pZCBtZW1iYXJfc3RvcmVsb2FkKHZvaWQpOwotZXh0ZXJuIHZvaWQgbWVtYmFyX3N0b3JlbG9hZF9zdG9yZXN0b3JlKHZvaWQpOwotZXh0ZXJuIHZvaWQgbWVtYmFyX3N0b3JlbG9hZF9sb2FkbG9hZCh2b2lkKTsKLWV4dGVybiB2b2lkIG1lbWJhcl9zdG9yZXN0b3JlX2xvYWRzdG9yZSh2b2lkKTsKKy8qIFRoZXNlIGFyZSBoZXJlIGluIGFuIGVmZm9ydCB0byBtb3JlIGZ1bGx5IHdvcmsgYXJvdW5kIFNwaXRmaXJlIEVycmF0YQorICogIzUxLiAgRXNzZW50aWFsbHksIGlmIGEgbWVtb3J5IGJhcnJpZXIgb2NjdXJzIHNvb24gYWZ0ZXIgYSBtaXNwcmVkaWN0ZWQKKyAqIGJyYW5jaCwgdGhlIGNoaXAgY2FuIHN0b3AgZXhlY3V0aW5nIGluc3RydWN0aW9ucyB1bnRpbCBhIHRyYXAgb2NjdXJzLgorICogVGhlcmVmb3JlLCBpZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgdGhlIGNoaXAgY2FuIGhhbmcgZm9yZXZlci4KKyAqCisgKiBJdCB1c2VkIHRvIGJlIGJlbGlldmVkIHRoYXQgdGhlIG1lbW9yeSBiYXJyaWVyIGhhZCB0byBiZSByaWdodCBpbiB0aGUKKyAqIGRlbGF5IHNsb3QsIGJ1dCBhIGNhc2UgaGFzIGJlZW4gdHJhY2VkIHJlY2VudGx5IHdoZXJlaW4gdGhlIG1lbW9yeSBiYXJyaWVyCisgKiB3YXMgb25lIGluc3RydWN0aW9uIGFmdGVyIHRoZSBicmFuY2ggZGVsYXkgc2xvdCBhbmQgdGhlIGNoaXAgc3RpbGwgaHVuZy4KKyAqIFRoZSBvZmZlbmRpbmcgc2VxdWVuY2Ugd2FzIHRoZSBmb2xsb3dpbmcgaW4gc3ltX3dha2V1cF9kb25lKCkgb2YgdGhlCisgKiBzeW01M2M4eHhfMiBkcml2ZXI6CisgKgorICoJY2FsbAlzeW1fY2NiX2Zyb21fZHNhLCAwCisgKgkgbW92Z2UJJWljYywgMCwgJWwwCisgKglicnoscG4JJW8wLCAuTEwxMzAzCisgKgkgbW92CSVvMCwgJWwyCisgKgltZW1iYXIJI0xvYWRMb2FkCisgKgorICogVGhlIGJyYW5jaCBoYXMgdG8gYmUgbWlzcHJlZGljdGVkIGZvciB0aGUgYnVnIHRvIG9jY3VyLiAgVGhlcmVmb3JlLCB3ZSBwdXQKKyAqIHRoZSBtZW1vcnkgYmFycmllciBleHBsaWNpdGx5IGludG8gYSAiYnJhbmNoIGFsd2F5cywgcHJlZGljdGVkIHRha2VuIgorICogZGVsYXkgc2xvdCB0byBhdm9pZCB0aGUgcHJvYmxlbSBjYXNlLgorICovCisjZGVmaW5lIG1lbWJhcl9zYWZlKHR5cGUpIFwKK2RvIHsJX19hc21fXyBfX3ZvbGF0aWxlX18oImJhLHB0CSUleGNjLCAxZlxuXHQiIFwKKwkJCSAgICAgIiBtZW1iYXIJIiB0eXBlICJcbiIgXAorCQkJICAgICAiMTpcbiIgXAorCQkJICAgICA6IDogOiAibWVtb3J5Iik7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgbWIoKQlcCisJbWVtYmFyX3NhZmUoIiNMb2FkTG9hZCB8ICNMb2FkU3RvcmUgfCAjU3RvcmVTdG9yZSB8ICNTdG9yZUxvYWQiKQorI2RlZmluZSBybWIoKQlcCisJbWVtYmFyX3NhZmUoIiNMb2FkTG9hZCIpCisjZGVmaW5lIHdtYigpCVwKKwltZW1iYXJfc2FmZSgiI1N0b3JlU3RvcmUiKQorI2RlZmluZSBtZW1iYXJfc3RvcmVsb2FkKCkgXAorCW1lbWJhcl9zYWZlKCIjU3RvcmVMb2FkIikKKyNkZWZpbmUgbWVtYmFyX3N0b3JlbG9hZF9zdG9yZXN0b3JlKCkgXAorCW1lbWJhcl9zYWZlKCIjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUiKQorI2RlZmluZSBtZW1iYXJfc3RvcmVsb2FkX2xvYWRsb2FkKCkgXAorCW1lbWJhcl9zYWZlKCIjU3RvcmVMb2FkIHwgI0xvYWRMb2FkIikKKyNkZWZpbmUgbWVtYmFyX3N0b3Jlc3RvcmVfbG9hZHN0b3JlKCkgXAorCW1lbWJhcl9zYWZlKCIjU3RvcmVTdG9yZSB8ICNMb2FkU3RvcmUiKQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC90eXBlcy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC90eXBlcy5oCmluZGV4IDYyNDhlZDEuLmQwZWU3ZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3R5cGVzLmgKQEAgLTU2LDggKzU2LDYgQEAKIHR5cGVkZWYgdTMyIGRtYV9hZGRyX3Q7CiB0eXBlZGVmIHU2NCBkbWE2NF9hZGRyX3Q7CiAKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQga21lbV9idWZjdGxfdDsKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3VhY2Nlc3MuaAppbmRleCA1NjkwMTQyLi44MGE2NWQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3VhY2Nlc3MuaApAQCAtNTksMTIgKzU5LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1zdGF0aWMgaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiAwOwotfQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vYXV4dmVjLmggYi9pbmNsdWRlL2FzbS11bS9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTVlMWMyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tdW0vYXV4dmVjLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9fVU1fQVVYVkVDX0gKKyNkZWZpbmUgX19VTV9BVVhWRUNfSAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS11bS9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS11bS9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vaGRyZWcuaCBiL2luY2x1ZGUvYXNtLXVtL2hkcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNjM2M2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tdW0vaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfX1VNX0hEUkVHX0gKLSNkZWZpbmUgX19VTV9IRFJFR19ICi0KLSNpbmNsdWRlICJhc20vYXJjaC9oZHJlZy5oIgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS11bS9tbXVfY29udGV4dC5oCmluZGV4IDA5NWJiNjIuLjJlZGI0ZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXVtL21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tdW0vbW11X2NvbnRleHQuaApAQCAtMjAsNyArMjAsMTUgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm9sZCwgc3RydWN0IG1tX3N0cnVjdCAqbmV3KQogewotCWlmIChvbGQgIT0gbmV3KQorCS8qCisJICogVGhpcyBpcyBjYWxsZWQgYnkgZnMvZXhlYy5jIGFuZCBmcy9haW8uYy4gSW4gdGhlIGZpcnN0IGNhc2UsIGZvciBhbgorCSAqIGV4ZWMsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgd2UncmUgY2FsbGVkIGZyb20gdXNlcnNwYWNlCisJICogYW5kIHRodXMgZ29pbmcgdG8gdXNlIGEgbmV3IGhvc3QgUElELiBJbiB0aGUgc2Vjb25kLCB3ZSdyZSBjYWxsZWQKKwkgKiBmcm9tIGEga2VybmVsIHRocmVhZCwgYW5kIHRodXMgbmVlZCB0byBnbyBkb2luZyB0aGUgbW1hcCdzIG9uIHRoZQorCSAqIGhvc3QuIFNpbmNlIHRoZXkncmUgdmVyeSBleHBlbnNpdmUsIHdlIHdhbnQgdG8gYXZvaWQgdGhhdCBhcyBmYXIgYXMKKwkgKiBwb3NzaWJsZS4KKwkgKi8KKwlpZiAob2xkICE9IG5ldyAmJiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9CT1JST1dFRF9NTSkpCiAJCWZvcmNlX2ZsdXNoX2FsbCgpOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9wYWdlLmggYi9pbmNsdWRlL2FzbS11bS9wYWdlLmgKaW5kZXggZjU4YWVkYS4uMmMxOTJhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3BhZ2UuaApAQCAtOTYsOCArOTYsNyBAQAogCiAjZGVmaW5lIF9fdmFfc3BhY2UgKDgqMTAyNCoxMDI0KQogCi1leHRlcm4gdW5zaWduZWQgbG9uZyB0b19waHlzKHZvaWQgKnZpcnQpOwotZXh0ZXJuIHZvaWQgKnRvX3ZpcnQodW5zaWduZWQgbG9uZyBwaHlzKTsKKyNpbmNsdWRlICJtZW0uaCIKIAogLyogQ2FzdCB0byB1bnNpZ25lZCBsb25nIGJlZm9yZSBjYXN0aW5nIHRvIHZvaWQgKiB0byBhdm9pZCBhIHdhcm5pbmcgZnJvbQogICogbW1hcF9rbWVtIGFib3V0IGN1dHRpbmcgYSBsb25nIGxvbmcgZG93biB0byBhIHZvaWQgKi4gIE5vdCBzdXJlIHRoYXQKQEAgLTExNiwyNCArMTE1LDEyIEBACiAjZGVmaW5lIHBmbl92YWxpZChwZm4pICgocGZuKSA8IG1heF9tYXBucikKICNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKHYpIHBmbl92YWxpZChwaHlzX3RvX3BmbihfX3BhKHYpKSkKIAotLyogUHVyZSAyXm4gdmVyc2lvbiBvZiBnZXRfb3JkZXIgKi8KLXN0YXRpYyBfX2lubGluZV9fIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBvcmRlcjsKLQotCXNpemUgPSAoc2l6ZS0xKSA+PiAoUEFHRV9TSElGVC0xKTsKLQlvcmRlciA9IC0xOwotCWRvIHsKLQkJc2l6ZSA+Pj0gMTsKLQkJb3JkZXIrKzsKLQl9IHdoaWxlIChzaXplKTsKLQlyZXR1cm4gb3JkZXI7Ci19Ci0KIGV4dGVybiBzdHJ1Y3QgcGFnZSAqYXJjaF92YWxpZGF0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG1hc2ssIGludCBvcmRlcik7CiAjZGVmaW5lIEhBVkVfQVJDSF9WQUxJREFURQogCiBleHRlcm4gdm9pZCBhcmNoX2ZyZWVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKTsKICNkZWZpbmUgSEFWRV9BUkNIX0ZSRUVfUEFHRQogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLXVtL3BnYWxsb2MuaAppbmRleCA4ZmNiMmZjLi5lYTQ5NDExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tdW0vcGdhbGxvYy5oCkBAIC00MiwxMSArNDIsMTMgQEAKICNkZWZpbmUgX19wdGVfZnJlZV90bGIodGxiLHB0ZSkgdGxiX3JlbW92ZV9wYWdlKCh0bGIpLChwdGUpKQogCiAjaWZkZWYgQ09ORklHXzNfTEVWRUxfUEdUQUJMRVMKLS8qCi0gKiBJbiB0aGUgMy1sZXZlbCBjYXNlIHdlIGZyZWUgdGhlIHBtZHMgYXMgcGFydCBvZiB0aGUgcGdkLgotICovCi0jZGVmaW5lIHBtZF9mcmVlKHgpCQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBfX3BtZF9mcmVlX3RsYih0bGIseCkJCWRvIHsgfSB3aGlsZSAoMCkKKworZXh0ZXJuIF9faW5saW5lX18gdm9pZCBwbWRfZnJlZShwbWRfdCAqcG1kKQoreworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwbWQpOworfQorCisjZGVmaW5lIF9fcG1kX2ZyZWVfdGxiKHRsYix4KSAgIHRsYl9yZW1vdmVfcGFnZSgodGxiKSx2aXJ0X3RvX3BhZ2UoeCkpCiAjZW5kaWYKIAogI2RlZmluZSBjaGVja19wZ3RfY2FjaGUoKQlkbyB7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9wZ3RhYmxlLTJsZXZlbC5oIGIvaW5jbHVkZS9hc20tdW0vcGd0YWJsZS0ybGV2ZWwuaAppbmRleCA5YjNhYmMwLi5mZmUwMTdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9wZ3RhYmxlLTJsZXZlbC5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3BndGFibGUtMmxldmVsLmgKQEAgLTM1LDM1ICszNSw4IEBACiBzdGF0aWMgaW5saW5lIGludCBwZ2RfbmV3cGFnZShwZ2RfdCBwZ2QpCXsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwZ2RfbWt1cHRvZGF0ZShwZ2RfdCBwZ2QpCXsgfQogCi0jZGVmaW5lIHB0ZV9wcmVzZW50KHgpCShwdGVfdmFsKHgpICYgKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9QUk9UTk9ORSkpCi0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rbmV3cHJvdChwdGVfdCBwdGUpCi17Ci0gCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9ORVdQUk9UOwotCXJldHVybihwdGUpOwotfQotCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta25ld3BhZ2UocHRlX3QgcHRlKQotewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9ORVdQQUdFOwotCXJldHVybihwdGUpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X3B0ZShwdGVfdCAqcHRlcHRyLCBwdGVfdCBwdGV2YWwpCi17Ci0JLyogSWYgaXQncyBhIHN3YXAgZW50cnksIGl0IG5lZWRzIHRvIGJlIG1hcmtlZCBfUEFHRV9ORVdQQUdFIHNvCi0JICogZml4X3JhbmdlIGtub3dzIHRvIHVubWFwIGl0LiAgX1BBR0VfTkVXUFJPVCBpcyBzcGVjaWZpYyB0bwotCSAqIG1hcHBlZCBwYWdlcy4KLQkgKi8KLQkqcHRlcHRyID0gcHRlX21rbmV3cGFnZShwdGV2YWwpOwotCWlmKHB0ZV9wcmVzZW50KCpwdGVwdHIpKSAqcHRlcHRyID0gcHRlX21rbmV3cHJvdCgqcHRlcHRyKTsKLX0KLSNkZWZpbmUgc2V0X3B0ZV9hdChtbSxhZGRyLHB0ZXAscHRldmFsKSBzZXRfcHRlKHB0ZXAscHRldmFsKQotCiAjZGVmaW5lIHNldF9wbWQocG1kcHRyLCBwbWR2YWwpICgqKHBtZHB0cikgPSAocG1kdmFsKSkKIAotI2RlZmluZSBwdGVfcGFnZSh4KSBwZm5fdG9fcGFnZShwdGVfcGZuKHgpKQotI2RlZmluZSBwdGVfbm9uZSh4KSAhKHB0ZV92YWwoeCkgJiB+X1BBR0VfTkVXUEFHRSkKICNkZWZpbmUgcHRlX3Bmbih4KSBwaHlzX3RvX3BmbihwdGVfdmFsKHgpKQogI2RlZmluZSBwZm5fcHRlKHBmbiwgcHJvdCkgX19wdGUocGZuX3RvX3BoeXMocGZuKSB8IHBncHJvdF92YWwocHJvdCkpCiAjZGVmaW5lIHBmbl9wbWQocGZuLCBwcm90KSBfX3BtZChwZm5fdG9fcGh5cyhwZm4pIHwgcGdwcm90X3ZhbChwcm90KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL3BndGFibGUtM2xldmVsLmggYi9pbmNsdWRlL2FzbS11bS9wZ3RhYmxlLTNsZXZlbC5oCmluZGV4IDY1ZThiZmMuLjc4NmMyNTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXVtL3BndGFibGUtM2xldmVsLmgKKysrIGIvaW5jbHVkZS9hc20tdW0vcGd0YWJsZS0zbGV2ZWwuaApAQCAtNTcsMzUgKzU3LDYgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHBnZF9ta3VwdG9kYXRlKHBnZF90IHBnZCkgeyBwZ2RfdmFsKHBnZCkgJj0gfl9QQUdFX05FV1BBR0U7IH0KIAotCi0jZGVmaW5lIHB0ZV9wcmVzZW50KHgpCXB0ZV9nZXRfYml0cyh4LCAoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1BST1ROT05FKSkKLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtuZXdwcm90KHB0ZV90IHB0ZSkKLXsKLSAgICAgICAgcHRlX3NldF9iaXRzKHB0ZSwgX1BBR0VfTkVXUFJPVCk7Ci0JcmV0dXJuKHB0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rbmV3cGFnZShwdGVfdCBwdGUpCi17Ci0JcHRlX3NldF9iaXRzKHB0ZSwgX1BBR0VfTkVXUEFHRSk7Ci0JcmV0dXJuKHB0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcHRlKHB0ZV90ICpwdGVwdHIsIHB0ZV90IHB0ZXZhbCkKLXsKLQlwdGVfY29weSgqcHRlcHRyLCBwdGV2YWwpOwotCi0JLyogSWYgaXQncyBhIHN3YXAgZW50cnksIGl0IG5lZWRzIHRvIGJlIG1hcmtlZCBfUEFHRV9ORVdQQUdFIHNvCi0JICogZml4X3JhbmdlIGtub3dzIHRvIHVubWFwIGl0LiAgX1BBR0VfTkVXUFJPVCBpcyBzcGVjaWZpYyB0bwotCSAqIG1hcHBlZCBwYWdlcy4KLQkgKi8KLQotCSpwdGVwdHIgPSBwdGVfbWtuZXdwYWdlKCpwdGVwdHIpOwotCWlmKHB0ZV9wcmVzZW50KCpwdGVwdHIpKSAqcHRlcHRyID0gcHRlX21rbmV3cHJvdCgqcHRlcHRyKTsKLX0KLSNkZWZpbmUgc2V0X3B0ZV9hdChtbSxhZGRyLHB0ZXAscHRldmFsKSBzZXRfcHRlKHB0ZXAscHRldmFsKQotCiAjZGVmaW5lIHNldF9wbWQocG1kcHRyLCBwbWR2YWwpIHNldF82NGJpdCgocGh5c190ICopIChwbWRwdHIpLCBwbWRfdmFsKHBtZHZhbCkpCiAKIHN0YXRpYyBpbmxpbmUgcG1kX3QgKnBtZF9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKQEAgLTk4LDE0ICs2OSwxMSBAQAogICAgICAgICByZXR1cm4gcG1kOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcG1kX2ZyZWUocG1kX3QgKnBtZCl7Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwbWQpOworZXh0ZXJuIGlubGluZSB2b2lkIHB1ZF9jbGVhciAocHVkX3QgKnB1ZCkKK3sKKyAgICAgICAgc2V0X3B1ZChwdWQsIF9fcHVkKDApKTsKIH0KIAotI2RlZmluZSBfX3BtZF9mcmVlX3RsYih0bGIseCkgICBkbyB7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdWRfY2xlYXIgKHB1ZF90ICogcHVkKSB7IH0KLQogI2RlZmluZSBwdWRfcGFnZShwdWQpIFwKIAkoKHN0cnVjdCBwYWdlICopIF9fdmEocHVkX3ZhbChwdWQpICYgUEFHRV9NQVNLKSkKIApAQCAtMTEzLDEzICs4MSw2IEBACiAjZGVmaW5lIHBtZF9vZmZzZXQocHVkLCBhZGRyZXNzKSAoKHBtZF90ICopIHB1ZF9wYWdlKCoocHVkKSkgKyBcCiAJCQlwbWRfaW5kZXgoYWRkcmVzcykpCiAKLSNkZWZpbmUgcHRlX3BhZ2UoeCkgcGZuX3RvX3BhZ2UocHRlX3Bmbih4KSkKLQotc3RhdGljIGlubGluZSBpbnQgcHRlX25vbmUocHRlX3QgcHRlKQotewotCXJldHVybiBwdGVfaXNfemVybyhwdGUpOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHRlX3BmbihwdGVfdCBwdGUpCiB7CiAJcmV0dXJuIHBoeXNfdG9fcGZuKHB0ZV92YWwocHRlKSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS11bS9wZ3RhYmxlLmgKaW5kZXggYTg4MDQwOS4uZWQwNjE3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3BndGFibGUuaApAQCAtMTYsMTMgKzE2LDE1IEBACiAKICNkZWZpbmUgX1BBR0VfUFJFU0VOVAkweDAwMQogI2RlZmluZSBfUEFHRV9ORVdQQUdFCTB4MDAyCi0jZGVmaW5lIF9QQUdFX05FV1BST1QgICAweDAwNAotI2RlZmluZSBfUEFHRV9GSUxFCTB4MDA4ICAgLyogc2V0OnBhZ2VjYWNoZSB1bnNldDpzd2FwICovCi0jZGVmaW5lIF9QQUdFX1BST1ROT05FCTB4MDEwCS8qIElmIG5vdCBwcmVzZW50ICovCisjZGVmaW5lIF9QQUdFX05FV1BST1QJMHgwMDQKICNkZWZpbmUgX1BBR0VfUlcJMHgwMjAKICNkZWZpbmUgX1BBR0VfVVNFUgkweDA0MAogI2RlZmluZSBfUEFHRV9BQ0NFU1NFRAkweDA4MAogI2RlZmluZSBfUEFHRV9ESVJUWQkweDEwMAorLyogSWYgX1BBR0VfUFJFU0VOVCBpcyBjbGVhciwgd2UgdXNlIHRoZXNlOiAqLworI2RlZmluZSBfUEFHRV9GSUxFCTB4MDA4CS8qIG5vbmxpbmVhciBmaWxlIG1hcHBpbmcsIHNhdmVkIFBURTsgdW5zZXQ6c3dhcCAqLworI2RlZmluZSBfUEFHRV9QUk9UTk9ORQkweDAxMAkvKiBpZiB0aGUgdXNlciBtYXBwZWQgaXQgd2l0aCBQUk9UX05PTkU7CisJCQkJICAgcHRlX3ByZXNlbnQgZ2l2ZXMgdHJ1ZSAqLwogCiAjaWZkZWYgQ09ORklHXzNfTEVWRUxfUEdUQUJMRVMKICNpbmNsdWRlICJhc20vcGd0YWJsZS0zbGV2ZWwuaCIKQEAgLTE1MSwxMCArMTUzLDI0IEBACiAKICNkZWZpbmUgcG1kX3BhZ2UocG1kKSBwaHlzX3RvX3BhZ2UocG1kX3ZhbChwbWQpICYgUEFHRV9NQVNLKQogCisjZGVmaW5lIHB0ZV9wYWdlKHgpIHBmbl90b19wYWdlKHB0ZV9wZm4oeCkpCiAjZGVmaW5lIHB0ZV9hZGRyZXNzKHgpIChfX3ZhKHB0ZV92YWwoeCkgJiBQQUdFX01BU0spKQogI2RlZmluZSBta19waHlzKGEsIHIpICgoYSkgKyAoKCh1bnNpZ25lZCBsb25nKSByKSA8PCBSRUdJT05fU0hJRlQpKQogI2RlZmluZSBwaHlzX2FkZHIocCkgKChwKSAmIH5SRUdJT05fTUFTSykKIAorI2RlZmluZSBwdGVfcHJlc2VudCh4KQlwdGVfZ2V0X2JpdHMoeCwgKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9QUk9UTk9ORSkpCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsYWdzIGNoZWNraW5nIHNlY3Rpb24uCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBwdGVfbm9uZShwdGVfdCBwdGUpCit7CisJcmV0dXJuIHB0ZV9pc196ZXJvKHB0ZSk7Cit9CisKIC8qCiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCkBAIC0yMTAsNiArMjI2LDE4IEBACiAJcmV0dXJuKHB0ZV9wcmVzZW50KHB0ZSkgJiYgKHB0ZV9nZXRfYml0cyhwdGUsIF9QQUdFX05FV1BST1QpKSk7CiB9CiAKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsYWdzIHNldHRpbmcgc2VjdGlvbi4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rbmV3cHJvdChwdGVfdCBwdGUpCit7CisJcHRlX3NldF9iaXRzKHB0ZSwgX1BBR0VfTkVXUFJPVCk7CisJcmV0dXJuKHB0ZSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCiB7IAogCXB0ZV9jbGVhcl9iaXRzKHB0ZSwgX1BBR0VfVVNFUik7CkBAIC0yNzgsMTQgKzMwNiw0MiBAQAogCXJldHVybihwdGUpOyAKIH0KIAotZXh0ZXJuIHBoeXNfdCBwYWdlX3RvX3BoeXMoc3RydWN0IHBhZ2UgKnBhZ2UpOworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtuZXdwYWdlKHB0ZV90IHB0ZSkKK3sKKwlwdGVfc2V0X2JpdHMocHRlLCBfUEFHRV9ORVdQQUdFKTsKKwlyZXR1cm4ocHRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wdGUocHRlX3QgKnB0ZXB0ciwgcHRlX3QgcHRldmFsKQoreworCXB0ZV9jb3B5KCpwdGVwdHIsIHB0ZXZhbCk7CisKKwkvKiBJZiBpdCdzIGEgc3dhcCBlbnRyeSwgaXQgbmVlZHMgdG8gYmUgbWFya2VkIF9QQUdFX05FV1BBR0Ugc28KKwkgKiBmaXhfcmFuZ2Uga25vd3MgdG8gdW5tYXAgaXQuICBfUEFHRV9ORVdQUk9UIGlzIHNwZWNpZmljIHRvCisJICogbWFwcGVkIHBhZ2VzLgorCSAqLworCisJKnB0ZXB0ciA9IHB0ZV9ta25ld3BhZ2UoKnB0ZXB0cik7CisJaWYocHRlX3ByZXNlbnQoKnB0ZXB0cikpICpwdGVwdHIgPSBwdGVfbWtuZXdwcm90KCpwdGVwdHIpOworfQorI2RlZmluZSBzZXRfcHRlX2F0KG1tLGFkZHIscHRlcCxwdGV2YWwpIHNldF9wdGUocHRlcCxwdGV2YWwpCiAKIC8qCiAgKiBDb252ZXJzaW9uIGZ1bmN0aW9uczogY29udmVydCBhIHBhZ2UgYW5kIHByb3RlY3Rpb24gdG8gYSBwYWdlIGVudHJ5LAogICogYW5kIGEgcGFnZSBlbnRyeSBhbmQgcGFnZSBkaXJlY3RvcnkgdG8gdGhlIHBhZ2UgdGhleSByZWZlciB0by4KICAqLwogCi1leHRlcm4gcHRlX3QgbWtfcHRlKHN0cnVjdCBwYWdlICpwYWdlLCBwZ3Byb3RfdCBwZ3Byb3QpOworI2RlZmluZSBwaHlzX3RvX3BhZ2UocGh5cykgcGZuX3RvX3BhZ2UocGh5c190b19wZm4ocGh5cykpCisjZGVmaW5lIF9fdmlydF90b19wYWdlKHZpcnQpIHBoeXNfdG9fcGFnZShfX3BhKHZpcnQpKQorI2RlZmluZSBwYWdlX3RvX3BoeXMocGFnZSkgcGZuX3RvX3BoeXMocGFnZV90b19wZm4ocGFnZSkpCisKKyNkZWZpbmUgbWtfcHRlKHBhZ2UsIHBncHJvdCkgXAorCSh7IHB0ZV90IHB0ZTsJCQkJCVwKKwkJCQkJCQlcCisJcHRlX3NldF92YWwocHRlLCBwYWdlX3RvX3BoeXMocGFnZSksIChwZ3Byb3QpKTsJXAorCWlmIChwdGVfcHJlc2VudChwdGUpKQkJCQlcCisJCXB0ZV9ta25ld3Byb3QocHRlX21rbmV3cGFnZShwdGUpKTsJXAorCXB0ZTt9KQogCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9tb2RpZnkocHRlX3QgcHRlLCBwZ3Byb3RfdCBuZXdwcm90KQogewpAQCAtMzYyLDggKzQxOCw2IEBACiAjZW5kaWYKICNlbmRpZgogCi1leHRlcm4gc3RydWN0IHBhZ2UgKnBoeXNfdG9fcGFnZShjb25zdCB1bnNpZ25lZCBsb25nIHBoeXMpOwotZXh0ZXJuIHN0cnVjdCBwYWdlICpfX3ZpcnRfdG9fcGFnZShjb25zdCB1bnNpZ25lZCBsb25nIHZpcnQpOwogI2RlZmluZSB2aXJ0X3RvX3BhZ2UoYWRkcikgX192aXJ0X3RvX3BhZ2UoKGNvbnN0IHVuc2lnbmVkIGxvbmcpIGFkZHIpCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9zcGlubG9ja190eXBlcy5oIGIvaW5jbHVkZS9hc20tdW0vc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWE5NDI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tdW0vc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX19VTV9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9fVU1fU1BJTkxPQ0tfVFlQRVNfSAorCisjaW5jbHVkZSAiYXNtL2FyY2gvc3BpbmxvY2tfdHlwZXMuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tdjg1MC9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDkzMjMyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX19WODUwX0FVWFZFQ19IX18KKyNkZWZpbmUgX19WODUwX0FVWFZFQ19IX18KKworI2VuZGlmIC8qIF9fVjg1MF9BVVhWRUNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS12ODUwL2ZjbnRsLmgKaW5kZXggMzFkNGI1OS4uM2FmNGQ1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvZmNudGwuaApAQCAtMSw4NyArMSwxMSBAQAogI2lmbmRlZiBfX1Y4NTBfRkNOVExfSF9fCiAjZGVmaW5lIF9fVjg1MF9GQ05UTF9IX18KIAotLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwotICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQUNDTU9ERQkgIDAwMDMKLSNkZWZpbmUgT19SRE9OTFkJICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAwMQotI2RlZmluZSBPX1JEV1IJCSAgICAwMgotI2RlZmluZSBPX0NSRUFUCQkgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAwMjAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX05PQ1RUWQkgIDA0MDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fVFJVTkMJCSAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJIDAyMDAwCi0jZGVmaW5lIE9fTk9OQkxPQ0sJIDA0MDAwCi0jZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKLSNkZWZpbmUgT19TWU5DCQkwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkwMjAwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBPX0RJUkVDVE9SWQkwNDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwogI2RlZmluZSBPX05PRk9MTE9XICAgICAwMTAwMDAwCS8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLwogI2RlZmluZSBPX0RJUkVDVCAgICAgICAwMjAwMDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50IC0gY3VycmVudGx5IGlnbm9yZWQgKi8KICNkZWZpbmUgT19MQVJHRUZJTEUgICAgMDQwMDAwMAotI2RlZmluZSBPX05PQVRJTUUJMDEwMDAwMDAKIAotI2RlZmluZSBGX0RVUEZECQkwCS8qIGR1cCAqLwotI2RlZmluZSBGX0dFVEZECQkxCS8qIGdldCBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfU0VURkQJCTIJLyogc2V0L2NsZWFyIGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9HRVRGTAkJMwkvKiBnZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX1NFVEZMCQk0CS8qIHNldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfR0VUTEsJCTUKLSNkZWZpbmUgRl9TRVRMSwkJNgotI2RlZmluZSBGX1NFVExLVwk3CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KIAotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0jZGVmaW5lIEZfR0VUTEs2NAkxMgkvKiAgdXNpbmcgJ3N0cnVjdCBmbG9jazY0JyAqLwotI2RlZmluZSBGX1NFVExLNjQJMTMKLSNkZWZpbmUgRl9TRVRMS1c2NAkxNAotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCW9mZl90IGxfc3RhcnQ7Ci0Jb2ZmX3QgbF9sZW47Ci0JcGlkX3QgbF9waWQ7Ci19OwotCi1zdHJ1Y3QgZmxvY2s2NCB7Ci0Jc2hvcnQgIGxfdHlwZTsKLQlzaG9ydCAgbF93aGVuY2U7Ci0JbG9mZl90IGxfc3RhcnQ7Ci0JbG9mZl90IGxfbGVuOwotCXBpZF90ICBsX3BpZDsKLX07Ci0KLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKICNlbmRpZiAvKiBfX1Y4NTBfRkNOVExfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS12ODUwL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvZnV0ZXguaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9BU01fRlVURVhfSAorI2RlZmluZSBfQVNNX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJY2FzZSBGVVRFWF9PUF9PUjoKKwljYXNlIEZVVEVYX09QX0FORE46CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvcGFnZS5oIGIvaW5jbHVkZS9hc20tdjg1MC9wYWdlLmgKaW5kZXggZDYwOTE2Mi4uYjRiYzg1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9wYWdlLmgKQEAgLTk4LDI1ICs5OCw2IEBACiAjZGVmaW5lIFBBR0VfQUxJR04oYWRkcikJKCgoYWRkcikgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSykKIAogCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0vKiBQdXJlIDJebiB2ZXJzaW9uIG9mIGdldF9vcmRlciAqLwotZXh0ZXJuIF9faW5saW5lX18gaW50IGdldF9vcmRlciAodW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBvcmRlcjsKLQotCXNpemUgPSAoc2l6ZS0xKSA+PiAoUEFHRV9TSElGVC0xKTsKLQlvcmRlciA9IC0xOwotCWRvIHsKLQkJc2l6ZSA+Pj0gMTsKLQkJb3JkZXIrKzsKLQl9IHdoaWxlIChzaXplKTsKLQlyZXR1cm4gb3JkZXI7Ci19Ci0KLSNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0KLQogLyogTm8gY3VycmVudCB2ODUwIHByb2Nlc3NvciBoYXMgdmlydHVhbCBtZW1vcnkuICAqLwogI2RlZmluZSBfX3ZpcnRfdG9fcGh5cyhhZGRyKQkoYWRkcikKICNkZWZpbmUgX19waHlzX3RvX3ZpcnQoYWRkcikJKGFkZHIpCkBAIC0xNDQsNCArMTI1LDYgQEAKIAogI2VuZGlmIC8qIEtFUk5FTCAqLwogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgorCiAjZW5kaWYgLyogX19WODUwX1BBR0VfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3R5cGVzLmggYi9pbmNsdWRlL2FzbS12ODUwL3R5cGVzLmgKaW5kZXggZTdjZmU1Yi4uZGNlZjU3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvdHlwZXMuaApAQCAtNTksOCArNTksNiBAQAogCiB0eXBlZGVmIHUzMiBkbWFfYWRkcl90OwogCi10eXBlZGVmIHVuc2lnbmVkIGludCBrbWVtX2J1ZmN0bF90OwotCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS12ODUwL3VhY2Nlc3MuaAppbmRleCA0Mzg2Y2ZjLi4xODhiMjg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL3VhY2Nlc3MuaApAQCAtMjcsMTIgKzI3LDYgQEAKIAlyZXR1cm4gdmFsID49ICgweDgwICsgTlVNX0NQVV9JUlFTKjE2KSAmJiB2YWwgPCAweEZGRkZGMDAwOwogfQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLWV4dGVybiBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYSAoaW50IHR5cGUsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rICh0eXBlLCBhZGRyLCBzaXplKSA/IDAgOiAtRUZBVUxUOwotfQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hY3BpLmgKaW5kZXggZGM4Yzk4MS4uYWExYzdiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oCkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICAgICAgOiI9ciIobl9oaSksICI9ciIobl9sbykgICAgIFwKICAgICAgICAgOiIwIihuX2hpKSwgIjEiKG5fbG8pKQogCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVAorI2lmZGVmIENPTkZJR19BQ1BJCiBleHRlcm4gaW50IGFjcGlfbGFwaWM7CiBleHRlcm4gaW50IGFjcGlfaW9hcGljOwogZXh0ZXJuIGludCBhY3BpX25vaXJxOwpAQCAtMTIxLDE3ICsxMjEsNiBAQAogI2RlZmluZSBGSVhfQUNQSV9QQUdFUyA0CiAKIGV4dGVybiBpbnQgYWNwaV9nc2lfdG9faXJxKHUzMiBnc2ksIHVuc2lnbmVkIGludCAqaXJxKTsKLQotI2Vsc2UJLyogIUNPTkZJR19BQ1BJX0JPT1QgKi8KLSNkZWZpbmUgYWNwaV9sYXBpYyAwCi0jZGVmaW5lIGFjcGlfaW9hcGljIDAKLSNlbmRpZiAvKiAhQ09ORklHX0FDUElfQk9PVCAqLwotCi1leHRlcm4gaW50IGFjcGlfbnVtYTsKLWV4dGVybiBpbnQgYWNwaV9zY2FuX25vZGVzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKLSNkZWZpbmUgTlJfTk9ERV9NRU1CTEtTIChNQVhfTlVNTk9ERVMqMikKLQotI2lmZGVmIENPTkZJR19BQ1BJX1BDSQogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfbm9pcnFfc2V0KHZvaWQpIHsgYWNwaV9ub2lycSA9IDE7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2Rpc2FibGVfcGNpKHZvaWQpIAogewpAQCAtMTM5LDExICsxMjgsMTkgQEAKIAlhY3BpX25vaXJxX3NldCgpOwogfQogZXh0ZXJuIGludCBhY3BpX2lycV9iYWxhbmNlX3NldChjaGFyICpzdHIpOwotI2Vsc2UKKworI2Vsc2UJLyogIUNPTkZJR19BQ1BJICovCisKKyNkZWZpbmUgYWNwaV9sYXBpYyAwCisjZGVmaW5lIGFjcGlfaW9hcGljIDAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX25vaXJxX3NldCh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2Rpc2FibGVfcGNpKHZvaWQpIHsgfQotc3RhdGljIGlubGluZSBpbnQgYWNwaV9pcnFfYmFsYW5jZV9zZXQoY2hhciAqc3RyKSB7IHJldHVybiAwOyB9Ci0jZW5kaWYKKworI2VuZGlmIC8qICFDT05GSUdfQUNQSSAqLworCitleHRlcm4gaW50IGFjcGlfbnVtYTsKK2V4dGVybiBpbnQgYWNwaV9zY2FuX25vZGVzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKKyNkZWZpbmUgTlJfTk9ERV9NRU1CTEtTIChNQVhfTlVNTk9ERVMqMikKIAogI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hdXh2ZWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDAzYzRjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX0FTTV9YODZfNjRfQVVYVkVDX0gKKyNkZWZpbmUgX19BU01fWDg2XzY0X0FVWFZFQ19ICisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oCmluZGV4IGQwZjQ1M2MuLmYwMTU1YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvY29tcGF0LmgKQEAgLTE0LDEwICsxNCwxMCBAQAogdHlwZWRlZiBzMzIJCWNvbXBhdF90aW1lX3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2Nsb2NrX3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X3BpZF90OwotdHlwZWRlZiB1MTYJCWNvbXBhdF91aWRfdDsKLXR5cGVkZWYgdTE2CQljb21wYXRfZ2lkX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X3VpZDMyX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X2dpZDMyX3Q7Cit0eXBlZGVmIHUxNgkJX19jb21wYXRfdWlkX3Q7Cit0eXBlZGVmIHUxNgkJX19jb21wYXRfZ2lkX3Q7Cit0eXBlZGVmIHUzMgkJX19jb21wYXRfdWlkMzJfdDsKK3R5cGVkZWYgdTMyCQlfX2NvbXBhdF9naWQzMl90OwogdHlwZWRlZiB1MTYJCWNvbXBhdF9tb2RlX3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X2lub190OwogdHlwZWRlZiB1MTYJCWNvbXBhdF9kZXZfdDsKQEAgLTUyLDggKzUyLDggQEAKIAljb21wYXRfaW5vX3QJc3RfaW5vOwogCWNvbXBhdF9tb2RlX3QJc3RfbW9kZTsKIAljb21wYXRfbmxpbmtfdAlzdF9ubGluazsKLQljb21wYXRfdWlkX3QJc3RfdWlkOwotCWNvbXBhdF9naWRfdAlzdF9naWQ7CisJX19jb21wYXRfdWlkX3QJc3RfdWlkOworCV9fY29tcGF0X2dpZF90CXN0X2dpZDsKIAljb21wYXRfZGV2X3QJc3RfcmRldjsKIAl1MTYJCV9fcGFkMjsKIAl1MzIJCXN0X3NpemU7CkBAIC0xMjIsMTAgKzEyMiwxMCBAQAogCiBzdHJ1Y3QgY29tcGF0X2lwYzY0X3Blcm0gewogCWNvbXBhdF9rZXlfdCBrZXk7Ci0JY29tcGF0X3VpZDMyX3QgdWlkOwotCWNvbXBhdF9naWQzMl90IGdpZDsKLQljb21wYXRfdWlkMzJfdCBjdWlkOwotCWNvbXBhdF9naWQzMl90IGNnaWQ7CisJX19jb21wYXRfdWlkMzJfdCB1aWQ7CisJX19jb21wYXRfZ2lkMzJfdCBnaWQ7CisJX19jb21wYXRfdWlkMzJfdCBjdWlkOworCV9fY29tcGF0X2dpZDMyX3QgY2dpZDsKIAl1bnNpZ25lZCBzaG9ydCBtb2RlOwogCXVuc2lnbmVkIHNob3J0IF9fcGFkMTsKIAl1bnNpZ25lZCBzaG9ydCBzZXE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvY3VycmVudC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2N1cnJlbnQuaAppbmRleCA3ZGI1NjBlLi5iYzhhZGVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvY3VycmVudC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jdXJyZW50LmgKQEAgLTE3LDcgKzE3LDcgQEAKICNlbHNlCiAKICNpZm5kZWYgQVNNX09GRlNFVF9ICi0jaW5jbHVkZSA8YXNtL29mZnNldC5oPiAKKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4gCiAjZW5kaWYKIAogI2RlZmluZSBHRVRfQ1VSUkVOVChyZWcpIG1vdnEgJWdzOihwZGFfcGN1cnJlbnQpLHJlZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2ZjbnRsLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZmNudGwuaAppbmRleCA0NDExZjIyLi40NmFiMTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvZmNudGwuaApAQCAtMSw3NiArMSBAQAotI2lmbmRlZiBfWDg2XzY0X0ZDTlRMX0gKLSNkZWZpbmUgX1g4Nl82NF9GQ05UTF9ICi0KLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgT19ESVJFQ1QJIDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLwotI2RlZmluZSBPX0xBUkdFRklMRQkwMTAwMDAwCi0jZGVmaW5lIE9fRElSRUNUT1JZCTAyMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XCTA0MDAwMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCi0jZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAotCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKLQotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgIGxfdHlwZTsKLQlzaG9ydCAgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCAgbF9waWQ7Ci19OwotCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0Ci0KLSNlbmRpZiAvKiAhX1g4Nl82NF9GQ05UTF9IICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9mdXRleC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwMmMwOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9mdXRleC5oCkBAIC0wLDAgKzEsOTggQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBfX2Z1dGV4X2F0b21pY19vcDEoaW5zbiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZykgXAorICBfX2FzbV9fIF9fdm9sYXRpbGUgKAkJCQkJCVwKKyIxOgkiIGluc24gIlxuIgkJCQkJCVwKKyIyOgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG5cCiszOgltb3YJJTMsICUxXG5cCisJam1wCTJiXG5cCisJLnByZXZpb3VzXG5cCisJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuXAorCS5hbGlnbgk4XG5cCisJLnF1YWQJMWIsM2JcblwKKwkucHJldmlvdXMiCQkJCQkJXAorCTogIj1yIiAob2xkdmFsKSwgIj1yIiAocmV0KSwgIj1tIiAoKnVhZGRyKQkJXAorCTogImkiICgtRUZBVUxUKSwgIm0iICgqdWFkZHIpLCAiMCIgKG9wYXJnKSwgIjEiICgwKSkKKworI2RlZmluZSBfX2Z1dGV4X2F0b21pY19vcDIoaW5zbiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZykgXAorICBfX2FzbV9fIF9fdm9sYXRpbGUgKAkJCQkJCVwKKyIxOgltb3ZsCSUyLCAlMFxuXAorCW1vdmwJJTAsICUzXG4iCQkJCQlcCisJaW5zbiAiXG4iCQkJCQkJXAorIjI6CSIgTE9DS19QUkVGSVggImNtcHhjaGdsICUzLCAlMlxuXAorCWpuegkxYlxuXAorMzoJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuXAorNDoJbW92CSU1LCAlMVxuXAorCWptcAkzYlxuXAorCS5wcmV2aW91c1xuXAorCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcblwKKwkuYWxpZ24JOFxuXAorCS5xdWFkCTFiLDRiLDJiLDRiXG5cCisJLnByZXZpb3VzIgkJCQkJCVwKKwk6ICI9JmEiIChvbGR2YWwpLCAiPSZyIiAocmV0KSwgIj1tIiAoKnVhZGRyKSwJCVwKKwkgICI9JnIiICh0ZW0pCQkJCQkJXAorCTogInIiIChvcGFyZyksICJpIiAoLUVGQVVMVCksICJtIiAoKnVhZGRyKSwgIjEiICgwKSkKKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJCV9fZnV0ZXhfYXRvbWljX29wMSgieGNoZ2wgJTAsICUyIiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfQUREOgorCQlfX2Z1dGV4X2F0b21pY19vcDEoTE9DS19QUkVGSVggInhhZGRsICUwLCAlMiIsIHJldCwgb2xkdmFsLAorCQkJCSAgIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfT1I6CisJCV9fZnV0ZXhfYXRvbWljX29wMigib3JsICU0LCAlMyIsIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX0FORE46CisJCV9fZnV0ZXhfYXRvbWljX29wMigiYW5kbCAlNCwgJTMiLCByZXQsIG9sZHZhbCwgdWFkZHIsIH5vcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfWE9SOgorCQlfX2Z1dGV4X2F0b21pY19vcDIoInhvcmwgJTQsICUzIiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaGRyZWcuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg5YmJjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI3dhcm5pbmcgdGhpcyBmaWxlIGlzIG9ic29sZXRlLCBwbGVhc2UgZG8gbm90IHVzZSBpdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2lvX2FwaWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pb19hcGljLmgKaW5kZXggYThiYWJkMi4uZWUxYmM2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lvX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaW9fYXBpYy5oCkBAIC0yMDEsNyArMjAxLDcgQEAKICAqLwogI2RlZmluZSBpb19hcGljX2Fzc2lnbl9wY2lfaXJxcyAobXBfaXJxX2VudHJpZXMgJiYgIXNraXBfaW9hcGljX3NldHVwICYmIGlvX2FwaWNfaXJxcykKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogZXh0ZXJuIGludCBpb19hcGljX2dldF92ZXJzaW9uIChpbnQgaW9hcGljKTsKIGV4dGVybiBpbnQgaW9fYXBpY19nZXRfcmVkaXJfZW50cmllcyAoaW50IGlvYXBpYyk7CiBleHRlcm4gaW50IGlvX2FwaWNfc2V0X3BjaV9yb3V0aW5nIChpbnQgaW9hcGljLCBpbnQgcGluLCBpbnQgaXJxLCBpbnQsIGludCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaXJxLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvaXJxLmgKaW5kZXggNDQ4MjY1Ny4uZmI3MjRiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pcnEuaApAQCAtNDgsMTAgKzQ4LDYgQEAKICNkZWZpbmUgQVJDSF9IQVNfTk1JX1dBVENIRE9HCQkvKiBTZWUgaW5jbHVkZS9saW51eC9ubWkuaCAqLwogI2VuZGlmCiAKLXN0cnVjdCBpcnFhY3Rpb247Ci1zdHJ1Y3QgcHRfcmVnczsKLWludCBoYW5kbGVfSVJRX2V2ZW50KHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IGlycWFjdGlvbiAqKTsKLQogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIGV4dGVybiB2b2lkIGZpeHVwX2lycXMoY3B1bWFza190IG1hcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvbXBzcGVjLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvbXBzcGVjLmgKaW5kZXggMzMxZjZhMy4uZjI2N2UxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L21wc3BlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9tcHNwZWMuaApAQCAtMTc5LDcgKzE3OSw3IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBtcF9sYXBpY19hZGRyOwogZXh0ZXJuIGludCBwaWNfbW9kZTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogZXh0ZXJuIHZvaWQgbXBfcmVnaXN0ZXJfbGFwaWMgKHU4IGlkLCB1OCBlbmFibGVkKTsKIGV4dGVybiB2b2lkIG1wX3JlZ2lzdGVyX2xhcGljX2FkZHJlc3MgKHU2NCBhZGRyZXNzKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wYWdlLmgKaW5kZXggNDMxMzE4Ny4uMTM1ZmZhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGFnZS5oCkBAIC0yOCw3ICsyOCw2IEBACiAjZGVmaW5lIEhQQUdFX1NJWkUJKCgxVUwpIDw8IEhQQUdFX1NISUZUKQogI2RlZmluZSBIUEFHRV9NQVNLCSh+KEhQQUdFX1NJWkUgLSAxKSkKICNkZWZpbmUgSFVHRVRMQl9QQUdFX09SREVSCShIUEFHRV9TSElGVCAtIFBBR0VfU0hJRlQpCi0jZGVmaW5lIEFSQ0hfSEFTX0hVR0VUTEJfQ0xFQU5fU1RBTEVfUEdUQUJMRQogCiAjaWZkZWYgX19LRVJORUxfXwogI2lmbmRlZiBfX0FTU0VNQkxZX18KQEAgLTkyLDIwICs5MSw2IEBACiAKICNpbmNsdWRlIDxhc20vYnVnLmg+CiAKLS8qIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyICovCi1leHRlcm4gX19pbmxpbmVfXyBpbnQgZ2V0X29yZGVyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpbnQgb3JkZXI7Ci0KLQlzaXplID0gKHNpemUtMSkgPj4gKFBBR0VfU0hJRlQtMSk7Ci0Jb3JkZXIgPSAtMTsKLQlkbyB7Ci0JCXNpemUgPj49IDE7Ci0JCW9yZGVyKys7Ci0JfSB3aGlsZSAoc2l6ZSk7Ci0JcmV0dXJuIG9yZGVyOwotfQotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNkZWZpbmUgUEFHRV9PRkZTRVQJCSgodW5zaWduZWQgbG9uZylfX1BBR0VfT0ZGU0VUKQpAQCAtMTQxLDQgKzEyNiw2IEBACiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYWdlLmg+CisKICNlbmRpZiAvKiBfWDg2XzY0X1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmgKaW5kZXggNGUxNjdiNS4uNWUwZjJmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGd0YWJsZS5oCkBAIC0xMDQsNiArMTA0LDE5IEBACiAoKHVuc2lnbmVkIGxvbmcpIF9fdmEocHVkX3ZhbChwdWQpICYgUEhZU0lDQUxfUEFHRV9NQVNLKSkKIAogI2RlZmluZSBwdGVwX2dldF9hbmRfY2xlYXIobW0sYWRkcix4cCkJX19wdGUoeGNoZygmKHhwKS0+cHRlLCAwKSkKKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVwX2dldF9hbmRfY2xlYXJfZnVsbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCwgaW50IGZ1bGwpCit7CisJcHRlX3QgcHRlOworCWlmIChmdWxsKSB7CisJCXB0ZSA9ICpwdGVwOworCQkqcHRlcCA9IF9fcHRlKDApOworCX0gZWxzZSB7CisJCXB0ZSA9IHB0ZXBfZ2V0X2FuZF9jbGVhcihtbSwgYWRkciwgcHRlcCk7CisJfQorCXJldHVybiBwdGU7Cit9CisKICNkZWZpbmUgcHRlX3NhbWUoYSwgYikJCSgoYSkucHRlID09IChiKS5wdGUpCiAKICNkZWZpbmUgUE1EX1NJWkUJKDFVTCA8PCBQTURfU0hJRlQpCkBAIC0xNDMsNyArMTU2LDcgQEAKICNkZWZpbmUgX1BBR0VfQUNDRVNTRUQJMHgwMjAKICNkZWZpbmUgX1BBR0VfRElSVFkJMHgwNDAKICNkZWZpbmUgX1BBR0VfUFNFCTB4MDgwCS8qIDJNQiBwYWdlICovCi0jZGVmaW5lIF9QQUdFX0ZJTEUJMHgwNDAJLyogc2V0OnBhZ2VjYWNoZSwgdW5zZXQ6c3dhcCAqLworI2RlZmluZSBfUEFHRV9GSUxFCTB4MDQwCS8qIG5vbmxpbmVhciBmaWxlIG1hcHBpbmcsIHNhdmVkIFBURTsgdW5zZXQ6c3dhcCAqLwogI2RlZmluZSBfUEFHRV9HTE9CQUwJMHgxMDAJLyogR2xvYmFsIFRMQiBlbnRyeSAqLwogCiAjZGVmaW5lIF9QQUdFX1BST1ROT05FCTB4MDgwCS8qIElmIG5vdCBwcmVzZW50ICovCkBAIC0yNDcsNiArMjYwLDcgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLworI2RlZmluZSBfX0xBUkdFX1BURSAoX1BBR0VfUFNFfF9QQUdFX1BSRVNFTlQpCiBzdGF0aWMgaW5saW5lIGludCBwdGVfdXNlcihwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9CkBAIC0yNTQsOCArMjY4LDggQEAKIGV4dGVybiBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CitzdGF0aWMgaW5saW5lIGludCBwdGVfaHVnZShwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlX3ZhbChwdGUpICYgX19MQVJHRV9QVEUpID09IF9fTEFSR0VfUFRFOyB9CiAKLSNkZWZpbmUgX19MQVJHRV9QVEUgKF9QQUdFX1BTRXxfUEFHRV9QUkVTRU5UKQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9VU0VSKSk7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfVVNFUikpOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9ESVJUWSkpOyByZXR1cm4gcHRlOyB9CkBAIC00MzMsNiArNDQ3LDcgQEAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgorI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVJfRlVMTAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NBTUUKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvY2Vzc29yLmgKaW5kZXggODU1NDllNi4uYTgzMjE5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm9jZXNzb3IuaApAQCAtMzk4LDcgKzM5OCw3IEBACiAjZGVmaW5lIEFSQ0hfSEFTX1BSRUZFVENIVyAxCiBzdGF0aWMgaW5saW5lIHZvaWQgcHJlZmV0Y2h3KHZvaWQgKngpIAogeyAKLQlhbHRlcm5hdGl2ZV9pbnB1dChBU01fTk9QNSwKKwlhbHRlcm5hdGl2ZV9pbnB1dCgicHJlZmV0Y2h0MCAoJTEpIiwKIAkJCSAgInByZWZldGNodyAoJTEpIiwKIAkJCSAgWDg2X0ZFQVRVUkVfM0ROT1csCiAJCQkgICJyIiAoeCkpOwpAQCAtNDM3LDYgKzQzNywxMSBAQAogCW91dGIoKGRhdGEpLCAweDIzKTsgXAogfSB3aGlsZSAoMCkKIAorc3RhdGljIGlubGluZSB2b2lkIHNlcmlhbGl6ZV9jcHUodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNwdWlkIiA6IDogOiAiYXgiLCAiYngiLCAiY3giLCAiZHgiKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIF9fbW9uaXRvcihjb25zdCB2b2lkICplYXgsIHVuc2lnbmVkIGxvbmcgZWN4LAogCQl1bnNpZ25lZCBsb25nIGVkeCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmgKaW5kZXggNmM4MTNlYi4uZjc1NzQxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmgKQEAgLTgsNyArOCw2IEBACiBzdHJ1Y3QgY3B1aW5mb194ODY7IAogc3RydWN0IHB0X3JlZ3M7CiAKLWV4dGVybiB2b2lkIGdldF9jcHVfdmVuZG9yKHN0cnVjdCBjcHVpbmZvX3g4NiopOwogZXh0ZXJuIHZvaWQgc3RhcnRfa2VybmVsKHZvaWQpOwogZXh0ZXJuIHZvaWQgcGRhX2luaXQoaW50KTsgCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrLmgKaW5kZXggNWFlYjU3YS4uNjk2MzY4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrLmgKQEAgLTYsNDcgKzYsMjEgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCi1leHRlcm4gaW50IHByaW50ayhjb25zdCBjaGFyICogZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOwotCiAvKgogICogWW91ciBiYXNpYyBTTVAgc3BpbmxvY2tzLCBhbGxvd2luZyBvbmx5IGEgc2luZ2xlIENQVSBhbnl3aGVyZQotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQl1bnNpZ25lZCBtYWdpYzsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gc3BpbmxvY2tfdDsKLQotI2RlZmluZSBTUElOTE9DS19NQUdJQwkweGRlYWQ0ZWFkCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLSNkZWZpbmUgU1BJTkxPQ0tfTUFHSUNfSU5JVAksIFNQSU5MT0NLX01BR0lDCi0jZWxzZQotI2RlZmluZSBTUElOTE9DS19NQUdJQ19JTklUCS8qICovCi0jZW5kaWYKLQotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQgKHNwaW5sb2NrX3QpIHsgMSBTUElOTE9DS19NQUdJQ19JTklUIH0KLQotI2RlZmluZSBzcGluX2xvY2tfaW5pdCh4KQlkbyB7ICooeCkgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLQotLyoKKyAqCiAgKiBTaW1wbGUgc3BpbiBsb2NrIG9wZXJhdGlvbnMuICBUaGVyZSBhcmUgdHdvIHZhcmlhbnRzLCBvbmUgY2xlYXJzIElSUSdzCiAgKiBvbiB0aGUgbG9jYWwgcHJvY2Vzc29yLCBvbmUgZG9lcyBub3QuCiAgKgogICogV2UgbWFrZSBubyBmYWlybmVzcyBhc3N1bXB0aW9ucy4gVGhleSBoYXZlIGEgY29zdC4KKyAqCisgKiAodGhlIHR5cGUgZGVmaW5pdGlvbnMgYXJlIGluIGFzbS9zcGlubG9ja190eXBlcy5oKQogICovCiAKLSNkZWZpbmUgc3Bpbl9pc19sb2NrZWQoeCkJKCoodm9sYXRpbGUgc2lnbmVkIGNoYXIgKikoJih4KS0+bG9jaykgPD0gMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdCh4KQlkbyB7IGJhcnJpZXIoKTsgfSB3aGlsZShzcGluX2lzX2xvY2tlZCh4KSkKLSNkZWZpbmUgX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9yYXdfc3Bpbl9sb2NrKGxvY2spCisjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpIFwKKwkJKCoodm9sYXRpbGUgc2lnbmVkIGNoYXIgKikoJih4KS0+c2xvY2spIDw9IDApCiAKLSNkZWZpbmUgc3Bpbl9sb2NrX3N0cmluZyBcCisjZGVmaW5lIF9fcmF3X3NwaW5fbG9ja19zdHJpbmcgXAogCSJcbjE6XHQiIFwKIAkibG9jayA7IGRlY2IgJTBcblx0IiBcCiAJImpzIDJmXG4iIFwKQEAgLTU4LDc0ICszMiw0MCBAQAogCSJqbXAgMWJcbiIgXAogCUxPQ0tfU0VDVElPTl9FTkQKIAotLyoKLSAqIFRoaXMgd29ya3MuIERlc3BpdGUgYWxsIHRoZSBjb25mdXNpb24uCi0gKiAoZXhjZXB0IG9uIFBQcm8gU01QIG9yIGlmIHdlIGFyZSB1c2luZyBPT1NUT1JFKQotICogKFBQcm8gZXJyYXRhIDY2LCA5MikKLSAqLwotIAotI2lmICFkZWZpbmVkKENPTkZJR19YODZfT09TVE9SRSkgJiYgIWRlZmluZWQoQ09ORklHX1g4Nl9QUFJPX0ZFTkNFKQotCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3N0cmluZyBcCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3N0cmluZyBcCiAJIm1vdmIgJDEsJTAiIFwKLQkJOiI9bSIgKGxvY2stPmxvY2spIDogOiAibWVtb3J5IgorCQk6Ij1tIiAobG9jay0+c2xvY2spIDogOiAibWVtb3J5IgogCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCUJVR19PTihsb2NrLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQyk7Ci0JYXNzZXJ0X3NwaW5fbG9ja2VkKGxvY2spOwotI2VuZGlmCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCXNwaW5fdW5sb2NrX3N0cmluZwotCSk7CisJCV9fcmF3X3NwaW5fbG9ja19zdHJpbmcKKwkJOiI9bSIgKGxvY2stPnNsb2NrKSA6IDogIm1lbW9yeSIpOwogfQogCi0jZWxzZQorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQogCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3N0cmluZyBcCi0JInhjaGdiICViMCwgJTEiIFwKLQkJOiI9cSIgKG9sZHZhbCksICI9bSIgKGxvY2stPmxvY2spIFwKLQkJOiIwIiAob2xkdmFsKSA6ICJtZW1vcnkiCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCi17Ci0JY2hhciBvbGR2YWwgPSAxOwotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCUJVR19PTihsb2NrLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQyk7Ci0JYXNzZXJ0X3NwaW5fbG9ja2VkKGxvY2spOwotI2VuZGlmCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCXNwaW5fdW5sb2NrX3N0cmluZwotCSk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCWNoYXIgb2xkdmFsOworCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSJ4Y2hnYiAlYjAsJTEiCi0JCToiPXEiIChvbGR2YWwpLCAiPW0iIChsb2NrLT5sb2NrKQorCQk6Ij1xIiAob2xkdmFsKSwgIj1tIiAobG9jay0+c2xvY2spCiAJCToiMCIgKDApIDogIm1lbW9yeSIpOworCiAJcmV0dXJuIG9sZHZhbCA+IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCWlmIChsb2NrLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQykgewotCQlwcmludGsoImVpcDogJXBcbiIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JCUJVRygpOwotCX0KLSNlbmRpZgogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlzcGluX2xvY2tfc3RyaW5nCi0JCToiPW0iIChsb2NrLT5sb2NrKSA6IDogIm1lbW9yeSIpOworCQlfX3Jhd19zcGluX3VubG9ja19zdHJpbmcKKwkpOwogfQogCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQobG9jaykgXAorCWRvIHsgd2hpbGUgKF9fcmF3X3NwaW5faXNfbG9ja2VkKGxvY2spKSBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoMCkKIAogLyoKICAqIFJlYWQtd3JpdGUgc3BpbmxvY2tzLCBhbGxvd2luZyBtdWx0aXBsZSByZWFkZXJzCkBAIC0xMzYsMzMgKzc2LDcgQEAKICAqIGNhbiAibWl4IiBpcnEtc2FmZSBsb2NrcyAtIGFueSB3cml0ZXIgbmVlZHMgdG8gZ2V0IGEKICAqIGlycS1zYWZlIHdyaXRlLWxvY2ssIGJ1dCByZWFkZXJzIGNhbiBnZXQgbm9uLWlycXNhZmUKICAqIHJlYWQtbG9ja3MuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQl1bnNpZ25lZCBtYWdpYzsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gcndsb2NrX3Q7Ci0KLSNkZWZpbmUgUldMT0NLX01BR0lDCTB4ZGVhZjFlZWQKLQotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotI2RlZmluZSBSV0xPQ0tfTUFHSUNfSU5JVAksIFJXTE9DS19NQUdJQwotI2Vsc2UKLSNkZWZpbmUgUldMT0NLX01BR0lDX0lOSVQJLyogKi8KLSNlbmRpZgotCi0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQgKHJ3bG9ja190KSB7IFJXX0xPQ0tfQklBUyBSV0xPQ0tfTUFHSUNfSU5JVCB9Ci0KLSNkZWZpbmUgcndsb2NrX2luaXQoeCkJZG8geyAqKHgpID0gUldfTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi0jZGVmaW5lIHJlYWRfY2FuX2xvY2soeCkJKChpbnQpKHgpLT5sb2NrID4gMCkKLSNkZWZpbmUgd3JpdGVfY2FuX2xvY2soeCkJKCh4KS0+bG9jayA9PSBSV19MT0NLX0JJQVMpCi0KLS8qCisgKgogICogT24geDg2LCB3ZSBpbXBsZW1lbnQgcmVhZC13cml0ZSBsb2NrcyBhcyBhIDMyLWJpdCBjb3VudGVyCiAgKiB3aXRoIHRoZSBoaWdoIGJpdCAoc2lnbikgYmVpbmcgdGhlICJjb250ZW5kZWQiIGJpdC4KICAqCkBAIC0xNzAsMjkgKzg0LDI0IEBACiAgKgogICogQ2hhbmdlZCB0byB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlIGFzIHJ3IHNlbWFwaG9yZXMuICBTZWUKICAqIHNlbWFwaG9yZS5oIGZvciBkZXRhaWxzLiAgLWJlbgorICoKKyAqIHRoZSBoZWxwZXJzIGFyZSBpbiBhcmNoL2kzODYva2VybmVsL3NlbWFwaG9yZS5jCiAgKi8KLS8qIHRoZSBzcGlubG9jayBoZWxwZXJzIGFyZSBpbiBhcmNoL2kzODYva2VybmVsL3NlbWFwaG9yZS5jICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3JlYWRfbG9jayhyd2xvY2tfdCAqcncpCisjZGVmaW5lIF9fcmF3X3JlYWRfY2FuX2xvY2soeCkJCSgoaW50KSh4KS0+bG9jayA+IDApCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHgpCQkoKHgpLT5sb2NrID09IFJXX0xPQ0tfQklBUykKKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3JlYWRfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCUJVR19PTihydy0+bWFnaWMgIT0gUldMT0NLX01BR0lDKTsKLSNlbmRpZgogCV9fYnVpbGRfcmVhZF9sb2NrKHJ3LCAiX19yZWFkX2xvY2tfZmFpbGVkIik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQlCVUdfT04ocnctPm1hZ2ljICE9IFJXTE9DS19NQUdJQyk7Ci0jZW5kaWYKIAlfX2J1aWxkX3dyaXRlX2xvY2socncsICJfX3dyaXRlX2xvY2tfZmFpbGVkIik7CiB9CiAKLSNkZWZpbmUgX3Jhd19yZWFkX3VubG9jayhydykJCWFzbSB2b2xhdGlsZSgibG9jayA7IGluY2wgJTAiIDoiPW0iICgocncpLT5sb2NrKSA6IDogIm1lbW9yeSIpCi0jZGVmaW5lIF9yYXdfd3JpdGVfdW5sb2NrKHJ3KQlhc20gdm9sYXRpbGUoImxvY2sgOyBhZGRsICQiIFJXX0xPQ0tfQklBU19TVFIgIiwlMCI6Ij1tIiAoKHJ3KS0+bG9jaykgOiA6ICJtZW1vcnkiKQotCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3JlYWRfdHJ5bG9jayhyd2xvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3JlYWRfdHJ5bG9jayhyYXdfcndsb2NrX3QgKmxvY2spCiB7CiAJYXRvbWljX3QgKmNvdW50ID0gKGF0b21pY190ICopbG9jazsKIAlhdG9taWNfZGVjKGNvdW50KTsKQEAgLTIwMiw3ICsxMTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3dyaXRlX3RyeWxvY2socndsb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKIHsKIAlhdG9taWNfdCAqY291bnQgPSAoYXRvbWljX3QgKilsb2NrOwogCWlmIChhdG9taWNfc3ViX2FuZF90ZXN0KFJXX0xPQ0tfQklBUywgY291bnQpKQpAQCAtMjExLDQgKzEyMCwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlhc20gdm9sYXRpbGUoImxvY2sgOyBpbmNsICUwIiA6Ij1tIiAocnctPmxvY2spIDogOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlhc20gdm9sYXRpbGUoImxvY2sgOyBhZGRsICQiIFJXX0xPQ0tfQklBU19TVFIgIiwlMCIKKwkJCQk6ICI9bSIgKHJ3LT5sb2NrKSA6IDogIm1lbW9yeSIpOworfQorCiAjZW5kaWYgLyogX19BU01fU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWVmZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfX0FTTV9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNsb2NrOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAxIH0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyBSV19MT0NLX0JJQVMgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC90eXBlcy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3R5cGVzLmgKaW5kZXggMzJiZDE0Mi4uYzg2YzJlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3R5cGVzLmgKQEAgLTUxLDggKzUxLDYgQEAKIHR5cGVkZWYgdTY0IHNlY3Rvcl90OwogI2RlZmluZSBIQVZFX1NFQ1RPUl9UCiAKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQga21lbV9idWZjdGxfdDsKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC91YWNjZXNzLmgKaW5kZXggNDhmMjkyNy4uMWJiOGI4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdWFjY2Vzcy5oCkBAIC00OSwxMyArNDksNiBAQAogCiAjZGVmaW5lIGFjY2Vzc19vayh0eXBlLCBhZGRyLCBzaXplKSAoX19yYW5nZV9ub3Rfb2soYWRkcixzaXplKSA9PSAwKQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLWV4dGVybiBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKiBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2F0b21pYy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2F0b21pYy5oCmluZGV4IGQ3MmJjYjMuLjI0Zjg2ZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvYXRvbWljLmgKQEAgLTY2LDcgKzY2LDcgQEAKICAqCiAgKiBBdG9taWNhbGx5IGFkZHMgQGkgdG8gQHYuCiAgKi8KLWV4dGVybiBfX2lubGluZV9fIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKiB2KQorc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19hZGQoaW50IGksIGF0b21pY190ICogdikKIHsKICAgICB1bnNpZ25lZCBpbnQgdnZhbDsKIApAQCAtOTAsNyArOTAsNyBAQAogICoKICAqIEF0b21pY2FsbHkgc3VidHJhY3RzIEBpIGZyb20gQHYuCiAgKi8KLWV4dGVybiBfX2lubGluZV9fIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKnYpCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKnYpCiB7CiAgICAgdW5zaWduZWQgaW50IHZ2YWw7CiAKQEAgLTExMSw3ICsxMTEsNyBAQAogICogV2UgdXNlIGF0b21pY197YWRkfHN1Yn1fcmV0dXJuIHRvIGRlZmluZSBvdGhlciBmdW5jdGlvbnMuCiAgKi8KIAotZXh0ZXJuIF9faW5saW5lX18gaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqIHYpCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfYWRkX3JldHVybihpbnQgaSwgYXRvbWljX3QgKiB2KQogewogICAgICB1bnNpZ25lZCBpbnQgdnZhbDsKIApAQCAtMTMwLDcgKzEzMCw3IEBACiAgICAgcmV0dXJuIHZ2YWw7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIGludCBhdG9taWNfc3ViX3JldHVybihpbnQgaSwgYXRvbWljX3QgKiB2KQorc3RhdGljIGlubGluZSBpbnQgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGksIGF0b21pY190ICogdikKIHsKICAgICB1bnNpZ25lZCBpbnQgdnZhbDsKIApAQCAtMjI0LDcgKzIyNCw3IEBACiAjZGVmaW5lIGF0b21pY19hZGRfbmVnYXRpdmUoaSx2KSAoYXRvbWljX2FkZF9yZXR1cm4oKGkpLCh2KSkgPCAwKQogCiAKLWV4dGVybiBfX2lubGluZV9fIHZvaWQgYXRvbWljX2NsZWFyX21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQorc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19jbGVhcl9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqdikKIHsKICAgICB1bnNpZ25lZCBpbnQgYWxsX2YgPSAtMTsKICAgICB1bnNpZ25lZCBpbnQgdnZhbDsKQEAgLTI0Myw3ICsyNDMsNyBAQAogCSk7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIHZvaWQgYXRvbWljX3NldF9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqdikKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc2V0X21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQogewogICAgIHVuc2lnbmVkIGludCB2dmFsOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3ZGVjNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX19YVEVOU0FfQVVYVkVDX0gKKyNkZWZpbmUgX19YVEVOU0FfQVVYVkVDX0gKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCmluZGV4IDFhMDBmYWQuLjgxYTc5N2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCkBAIC00NywxNCArNDcsMTQgQEAKICAqCUlmIHlvdSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHBsZWFzZSBkb24ndCBmb3JnZXQgdGhlCiAgKgl2ZXJpZnlfYXJlYSgpLgogICovCi1leHRlcm4gX19pbmxpbmVfXworc3RhdGljIGlubGluZQogdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sgKCBjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKIAkJCQkJaW50IGxlbiwgaW50IHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyAoIHNyYywgZHN0LCBsZW4sIHN1bSwgTlVMTCwgTlVMTCk7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fCitzdGF0aWMgaW5saW5lCiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyICggY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsCiAJCQkJCQlpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZGVsYXkuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZWxheS5oCmluZGV4IDBhMTIzZDUuLjFiYzYwMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZWxheS5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZWxheS5oCkBAIC0xOCw3ICsxOCw3IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvb3BzX3Blcl9qaWZmeTsKIAotZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCitzdGF0aWMgaW5saW5lIHZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQogewogICAvKiAyIGN5Y2xlcyBwZXIgbG9vcC4gKi8KICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIxOiBhZGRpICUwLCAlMCwgLTI7IGJnZXVpICUwLCAyLCAxYiIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9mY250bC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2ZjbnRsLmgKaW5kZXggNDg4NzZiYi4uZWMwNjZhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2ZjbnRsLmgKQEAgLTE0LDMxICsxNCwxNyBAQAogCiAvKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCiAgICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgT19BQ0NNT0RFCTB4MDAwMwotI2RlZmluZSBPX1JET05MWQkweDAwMDAKLSNkZWZpbmUgT19XUk9OTFkJMHgwMDAxCi0jZGVmaW5lIE9fUkRXUgkJMHgwMDAyCiAjZGVmaW5lIE9fQVBQRU5ECTB4MDAwOAogI2RlZmluZSBPX1NZTkMJCTB4MDAxMAogI2RlZmluZSBPX05PTkJMT0NLCTB4MDA4MAogI2RlZmluZSBPX0NSRUFUICAgICAgICAgMHgwMTAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX1RSVU5DCQkweDAyMDAJLyogbm90IGZjbnRsICovCiAjZGVmaW5lIE9fRVhDTAkJMHgwNDAwCS8qIG5vdCBmY250bCAqLwogI2RlZmluZSBPX05PQ1RUWQkweDA4MDAJLyogbm90IGZjbnRsICovCiAjZGVmaW5lIEZBU1lOQwkJMHgxMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgT19MQVJHRUZJTEUJMHgyMDAwCS8qIGFsbG93IGxhcmdlIGZpbGUgb3BlbnMgLSBjdXJyZW50bHkgaWdub3JlZCAqLwogI2RlZmluZSBPX0RJUkVDVAkweDgwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgLSBjdXJyZW50bHkgaWdub3JlZCovCi0jZGVmaW5lIE9fRElSRUNUT1JZCTB4MTAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XCTB4MjAwMDAJLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCiAjZGVmaW5lIE9fTk9BVElNRQkweDEwMDAwMAogCi0jZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKLQotI2RlZmluZSBGX0RVUEZECQkwCS8qIGR1cCAqLwotI2RlZmluZSBGX0dFVEZECQkxCS8qIGdldCBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfU0VURkQJCTIJLyogc2V0L2NsZWFyIGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9HRVRGTAkJMwkvKiBnZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX1NFVEZMCQk0CS8qIHNldCBmaWxlLT5mX2ZsYWdzICovCiAjZGVmaW5lIEZfR0VUTEsJCTE0CiAjZGVmaW5lIEZfR0VUTEs2NCAgICAgICAxNQogI2RlZmluZSBGX1NFVExLCQk2CkBAIC00OCwzNSArMzQsNiBAQAogCiAjZGVmaW5lIEZfU0VUT1dOCTI0CS8qICBmb3Igc29ja2V0cy4gKi8KICNkZWZpbmUgRl9HRVRPV04JMjMJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX1NFVFNJRwkxMAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUU0lHCTExCS8qICBmb3Igc29ja2V0cy4gKi8KLQotLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KLSNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLwotCi0vKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLwotI2RlZmluZSBGX1JETENLCQkwCi0jZGVmaW5lIEZfV1JMQ0sJCTEKLSNkZWZpbmUgRl9VTkxDSwkJMgotCi0vKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLwotI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KLSNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCi0KLS8qIGZvciBsZWFzZXMgKi8KLSNkZWZpbmUgRl9JTlBST0dSRVNTCTE2Ci0KLS8qIG9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAqLwotI2RlZmluZSBMT0NLX1NICQkxCS8qIHNoYXJlZCBsb2NrICovCi0jZGVmaW5lIExPQ0tfRVgJCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19OQgkJNAkvKiBvcidkIHdpdGggb25lIG9mIHRoZSBhYm92ZSB0byBwcmV2ZW50Ci0JCQkJICAgYmxvY2tpbmcgKi8KLSNkZWZpbmUgTE9DS19VTgkJOAkvKiByZW1vdmUgbG9jayAqLwotCi0jZGVmaW5lIExPQ0tfTUFORAkzMgkvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrIC4uLiAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAgd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgZmxvY2sgewogCXNob3J0IGxfdHlwZTsKQEAgLTk2LDYgKzUzLDkgQEAKIAlwaWRfdCAgbF9waWQ7CiB9OwogCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0CisjZGVmaW5lIEhBVkVfQVJDSF9TVFJVQ1RfRkxPQ0sKKyNkZWZpbmUgSEFWRV9BUkNIX1NUUlVDVF9GTE9DSzY0CisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgogCiAjZW5kaWYgLyogX1hURU5TQV9GQ05UTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaGRyZWcuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGI4MDYwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9oZHJlZy5oCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAotICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgotICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgIExpbnVzIFRvcnZhbGRzICYgYXV0aG9ycwotICovCi0KLSNpZm5kZWYgX1hURU5TQV9IRFJFR19ICi0jZGVmaW5lIF9YVEVOU0FfSERSRUdfSAotCi10eXBlZGVmIHVuc2lnbmVkIGludCBpZGVfaW9yZWdfdDsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaW8uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCmluZGV4IDJjNDcxYzQuLmM1YzEzOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCkBAIC00MSwxMiArNDEsMTIgQEAKICAqIFRoZXNlIGFyZSB0cml2aWFsIG9uIHRoZSAxOjEgTGludXgvWHRlbnNhIG1hcHBpbmcKICAqLwogCi1leHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgdmlydF90b19waHlzKHZvbGF0aWxlIHZvaWQgKiBhZGRyZXNzKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZpcnRfdG9fcGh5cyh2b2xhdGlsZSB2b2lkICogYWRkcmVzcykKIHsKIAlyZXR1cm4gUEhZU0FERFIoKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyk7CiB9CiAKLWV4dGVybiBpbmxpbmUgdm9pZCAqIHBoeXNfdG9fdmlydCh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHZvaWQgKiBwaHlzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXJldHVybiAodm9pZCopIENBQ0hFRF9BRERSKGFkZHJlc3MpOwogfQpAQCAtNTUsMTIgKzU1LDEyIEBACiAgKiBJTyBidXMgbWVtb3J5IGFkZHJlc3NlcyBhcmUgYWxzbyAxOjEgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcwogICovCiAKLWV4dGVybiBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX2J1cyh2b2xhdGlsZSB2b2lkICogYWRkcmVzcykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX2J1cyh2b2xhdGlsZSB2b2lkICogYWRkcmVzcykKIHsKIAlyZXR1cm4gUEhZU0FERFIoKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyk7CiB9CiAKLWV4dGVybiBpbmxpbmUgdm9pZCAqIGJ1c190b192aXJ0ICh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHZvaWQgKiBidXNfdG9fdmlydCAodW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXJldHVybiAodm9pZCAqKSBDQUNIRURfQUREUihhZGRyZXNzKTsKIH0KQEAgLTY5LDE3ICs2OSwxNyBAQAogICogQ2hhbmdlICJzdHJ1Y3QgcGFnZSIgdG8gcGh5c2ljYWwgYWRkcmVzcy4KICAqLwogCi1leHRlcm4gaW5saW5lIHZvaWQgKmlvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCAqaW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQogewogICAgICAgICByZXR1cm4gKHZvaWQgKikgQ0FDSEVEX0FERFJfSU8ob2Zmc2V0KTsKIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkICppb3JlbWFwX25vY2FjaGUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCAqaW9yZW1hcF9ub2NhY2hlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAgICAgICAgIHJldHVybiAodm9pZCAqKSBCWVBBU1NfQUREUl9JTyhvZmZzZXQpOwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgaW91bm1hcCh2b2lkICphZGRyKQorc3RhdGljIGlubGluZSB2b2lkIGlvdW5tYXAodm9pZCAqYWRkcikKIHsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS14dGVuc2EvbW11X2NvbnRleHQuaAppbmRleCAxYjA4MDE1Li4zNjRhN2IwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvbW11X2NvbnRleHQuaApAQCAtMTk5LDEzICsxOTksMTMgQEAKICNkZWZpbmUgQVNJRF9GSVJTVF9WRVJTSU9OCQkJCQkJXAogCSgodW5zaWduZWQgbG9uZykofkFTSURfVkVSU0lPTl9NQVNLKSArIDEgKyBBU0lEX0ZJUlNUX05PTlJFU0VSVkVEKQogCi1leHRlcm4gaW5saW5lIHZvaWQgc2V0X3Jhc2lkX3JlZ2lzdGVyICh1bnNpZ25lZCBsb25nIHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcmFzaWRfcmVnaXN0ZXIgKHVuc2lnbmVkIGxvbmcgdmFsKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fICgiIHdzciAlMCwgIl9fc3RyaW5naWZ5KFJBU0lEKSJcblx0IgogCQkJICAgICAgIiBpc3luY1xuIiA6IDogImEiICh2YWwpKTsKIH0KIAotZXh0ZXJuIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9yYXNpZF9yZWdpc3RlciAodm9pZCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfcmFzaWRfcmVnaXN0ZXIgKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIgcnNyICUwLCAiX19zdHJpbmdpZnkoUkFTSUQpIlxuXHQiIDogIj1hIiAodG1wKSk7CkBAIC0yMTUsNyArMjE1LDcgQEAKIAogI2lmICgoWENIQUxfTU1VX0FTSURfSU5WQUxJRCA9PSAwKSAmJiAoWENIQUxfTU1VX0FTSURfS0VSTkVMID09IDEpKQogCi1leHRlcm4gaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogZ2V0X25ld19tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhc2lkKQogewogCWV4dGVybiB2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCk7CkBAIC0yMzQsNyArMjM0LDcgQEAKIC8qIFhDSEFMX01NVV9BU0lEX0lOVkFMSUQgPT0gMCBhbmQgWENIQUxfTU1VX0FTSURfS0VSTkVMID09MSBhcmUKICAgIHJlYWxseSB0aGUgYmVzdCwgYnV0IGlmIHlvdSBpbnNpc3QuLi4gKi8KIAotZXh0ZXJuIGlubGluZSBpbnQgdmFsaWRhdGVfYXNpZCAodW5zaWduZWQgbG9uZyBhc2lkKQorc3RhdGljIGlubGluZSBpbnQgdmFsaWRhdGVfYXNpZCAodW5zaWduZWQgbG9uZyBhc2lkKQogewogCXN3aXRjaCAoYXNpZCkgewogCWNhc2UgWENIQUxfTU1VX0FTSURfSU5WQUxJRDoKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCXJldHVybiAxOyAvKiB2YWxpZCAqLwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogZ2V0X25ld19tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhc2lkKQogewogCWV4dGVybiB2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCk7CkBAIC0yNzQsMTQgKzI3NCwxNCBAQAogICogaW5zdGFuY2UuCiAgKi8KIAotZXh0ZXJuIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgaW50CiBpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAltbS0+Y29udGV4dCA9IE5PX0NPTlRFWFQ7CiAJcmV0dXJuIDA7CiB9CiAKLWV4dGVybiBpbmxpbmUgdm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwKK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJdW5zaWduZWQgbG9uZyBhc2lkID0gYXNpZF9jYWNoZTsKQEAgLTMwMSw3ICszMDEsNyBAQAogICogRGVzdHJveSBjb250ZXh0IHJlbGF0ZWQgaW5mbyBmb3IgYW4gbW1fc3RydWN0IHRoYXQgaXMgYWJvdXQKICAqIHRvIGJlIHB1dCB0byByZXN0LgogICovCi1leHRlcm4gaW5saW5lIHZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQorc3RhdGljIGlubGluZSB2b2lkIGRlc3Ryb3lfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAkvKiBOb3RoaW5nIHRvIGRvLiAqLwogfQpAQCAtMzEwLDcgKzMxMCw3IEBACiAgKiBBZnRlciB3ZSBoYXZlIHNldCBjdXJyZW50LT5tbSB0byBhIG5ldyB2YWx1ZSwgdGhpcyBhY3RpdmF0ZXMKICAqIHRoZSBjb250ZXh0IGZvciB0aGUgbmV3IG1tIHNvIHdlIHNlZSB0aGUgbmV3IG1hcHBpbmdzLgogICovCi1leHRlcm4gaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogYWN0aXZhdGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCkKIHsKIAkvKiBVbmNvbmRpdGlvbmFsbHkgZ2V0IGEgbmV3IEFTSUQuICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wYWdlLmgKaW5kZXggYjQ5NWU1Yi4uOGRlZDM2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcGFnZS5oCkBAIC01NSw3ICs1NSw3IEBACiAgKiBQdXJlIDJebiB2ZXJzaW9uIG9mIGdldF9vcmRlcgogICovCiAKLWV4dGVybiBfX2lubGluZV9fIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIGlubGluZSBpbnQgZ2V0X29yZGVyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlpbnQgb3JkZXI7CiAjaWZuZGVmIFhDSEFMX0hBVkVfTlNVCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGFnZS5oLm4gYi9pbmNsdWRlL2FzbS14dGVuc2EvcGFnZS5oLm4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NmNjNjYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3BhZ2UuaC5uCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBsaW51eC9pbmNsdWRlL2FzbS14dGVuc2EvcGFnZS5oCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbjIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0jaWZuZGVmIF9YVEVOU0FfUEFHRV9ICi0jZGVmaW5lIF9YVEVOU0FfUEFHRV9ICi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0KLS8qCi0gKiBQQUdFX1NISUZUIGRldGVybWluZXMgdGhlIHBhZ2Ugc2l6ZQotICogUEFHRV9BTElHTih4KSBhbGlnbnMgdGhlIHBvaW50ZXIgdG8gdGhlIChuZXh0KSBwYWdlIGJvdW5kYXJ5Ci0gKi8KLSNkZWZpbmUgUEFHRV9TSElGVAkJWENIQUxfTU1VX01JTl9QVEVfUEFHRV9TSVpFCi0jZGVmaW5lIFBBR0VfU0laRQkJKDEgPDwgUEFHRV9TSElGVCkKLSNkZWZpbmUgUEFHRV9NQVNLCQkofihQQUdFX1NJWkUtMSkpCi0jZGVmaW5lIFBBR0VfQUxJR04oYWRkcikJKCgoYWRkcikrUEFHRV9TSVpFIC0gMSkgJiBQQUdFX01BU0spCi0KLSNkZWZpbmUgRENBQ0hFX1dBWV9TSVpFCQkoWENIQUxfRENBQ0hFX1NJWkUgLyBYQ0hBTF9EQ0FDSEVfV0FZUykKLSNkZWZpbmUgUEFHRV9PRkZTRVQJCVhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSCi0KLSNpZmRlZiBfX0FTU0VNQkxZX18KLQotI2RlZmluZSBfX3BncHJvdCh4KQkoeCkKLQotI2Vsc2UKLQotCi0vKgotICogVGhlc2UgYXJlIHVzZWQgdG8gbWFrZSB1c2Ugb2YgQyB0eXBlLWNoZWNraW5nLi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHB0ZTsgfSBwdGVfdDsJCS8qIHBhZ2UgdGFibGUgZW50cnkgKi8KLXR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwbWQ7IH0gcG1kX3Q7CQkvKiBQTUQgdGFibGUgZW50cnkgKi8KLXR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ2Q7IH0gcGdkX3Q7CQkvKiBQR0QgdGFibGUgZW50cnkgKi8KLXR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ3Byb3Q7IH0gcGdwcm90X3Q7Ci0KLSNkZWZpbmUgcHRlX3ZhbCh4KQkoKHgpLnB0ZSkKLSNkZWZpbmUgcG1kX3ZhbCh4KQkoKHgpLnBtZCkKLSNkZWZpbmUgcGdkX3ZhbCh4KQkoKHgpLnBnZCkKLSNkZWZpbmUgcGdwcm90X3ZhbCh4KQkoKHgpLnBncHJvdCkKLQotI2RlZmluZSBfX3B0ZSh4KQkoKHB0ZV90KSB7ICh4KSB9ICkKLSNkZWZpbmUgX19wbWQoeCkJKChwbWRfdCkgeyAoeCkgfSApCi0jZGVmaW5lIF9fcGdkKHgpCSgocGdkX3QpIHsgKHgpIH0gKQotI2RlZmluZSBfX3BncHJvdCh4KQkoKHBncHJvdF90KSB7ICh4KSB9ICkKLQotLyoKLSAqIFB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyCi0gKi8KLWV4dGVybiBfX2lubGluZV9fIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBvcmRlcjsKLSNpZm5kZWYgWENIQUxfSEFWRV9OU1UKLQl1bnNpZ25lZCBsb25nIHgxLCB4MiwgeDQsIHg4LCB4MTY7Ci0KLQlzaXplID0gKHNpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCXgxICA9IHNpemUgJiAweEFBQUFBQUFBOwotCXgyICA9IHNpemUgJiAweENDQ0NDQ0NDOwotCXg0ICA9IHNpemUgJiAweEYwRjBGMEYwOwotCXg4ICA9IHNpemUgJiAweEZGMDBGRjAwOwotCXgxNiA9IHNpemUgJiAweEZGRkYwMDAwOwotCW9yZGVyID0geDIgPyAyIDogMDsKLQlvcmRlciArPSAoeDE2ICE9IDApICogMTY7Ci0Jb3JkZXIgKz0gKHg4ICE9IDApICogODsKLQlvcmRlciArPSAoeDQgIT0gMCkgKiA0OwotCW9yZGVyICs9ICh4MSAhPSAwKTsKLQotCXJldHVybiBvcmRlcjsKLSNlbHNlCi0Jc2l6ZSA9IChzaXplIC0gMSkgPj4gUEFHRV9TSElGVDsKLQlhc20gKCJuc2F1ICUwLCAlMSIgOiAiPXIiIChvcmRlcikgOiAiciIgKHNpemUpKTsKLQlyZXR1cm4gMzIgLSBvcmRlcjsKLSNlbmRpZgotfQotCi0KLXN0cnVjdCBwYWdlOwotZXh0ZXJuIHZvaWQgY2xlYXJfcGFnZSh2b2lkICpwYWdlKTsKLWV4dGVybiB2b2lkIGNvcHlfcGFnZSh2b2lkICp0bywgdm9pZCAqZnJvbSk7Ci0KLS8qCi0gKiBJZiB3ZSBoYXZlIGNhY2hlIGFsaWFzaW5nIGFuZCB3cml0ZWJhY2sgY2FjaGVzLCB3ZSBtaWdodCBoYXZlIHRvIGRvCi0gKiBzb21lIGV4dHJhIHdvcmsKLSAqLwotCi0jaWYgKERDQUNIRV9XQVlfU0laRSA+IFBBR0VfU0laRSkgJiYgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSwotdm9pZCBjbGVhcl91c2VyX3BhZ2Uodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyB2YWRkciwgc3RydWN0IHBhZ2UqIHBhZ2UpOwotdm9pZCBjb3B5X3VzZXJfcGFnZSh2b2lkICp0bywgdm9pZCogZnJvbSwgdW5zaWduZWQgbG9uZyB2YWRkciwgc3RydWN0IHBhZ2UqIHBhZ2UpOwotI2Vsc2UKLSMgZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLHZhZGRyLHBnKQkJY2xlYXJfcGFnZShwYWdlKQotIyBkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQotI2VuZGlmCi0KLQotLyoKLSAqIFRoaXMgaGFuZGxlcyB0aGUgbWVtb3J5IG1hcC4gIFdlIGhhbmRsZSBwYWdlcyBhdAotICogWENIQUxfS1NFR19DQUNIRURfVkFERFIgZm9yIGtlcm5lbHMgd2l0aCAzMiBiaXQgYWRkcmVzcyBzcGFjZS4KLSAqIFRoZXNlIG1hY3JvcyBhcmUgZm9yIGNvbnZlcnNpb24gb2Yga2VybmVsIGFkZHJlc3MsIG5vdCB1c2VyCi0gKiBhZGRyZXNzZXMuCi0gKi8KLQotI2RlZmluZSBfX3BhKHgpCQkJKCh1bnNpZ25lZCBsb25nKSAoeCkgLSBQQUdFX09GRlNFVCkKLSNkZWZpbmUgX192YSh4KQkJCSgodm9pZCAqKSgodW5zaWduZWQgbG9uZykgKHgpICsgUEFHRV9PRkZTRVQpKQotI2RlZmluZSBwZm5fdmFsaWQocGZuKQkJKCh1bnNpZ25lZCBsb25nKXBmbiA8IG1heF9tYXBucikKLSNpZm5kZWYgQ09ORklHX0RJU0NPTlRJR01FTQotIyBkZWZpbmUgcGZuX3RvX3BhZ2UocGZuKQkobWVtX21hcCArIChwZm4pKQotIyBkZWZpbmUgcGFnZV90b19wZm4ocGFnZSkJKCh1bnNpZ25lZCBsb25nKSgocGFnZSkgLSBtZW1fbWFwKSkKLSNlbHNlCi0jIGVycm9yIENPTkZJR19ESVNDT05USUdNRU0gbm90IHN1cHBvcnRlZAotI2VuZGlmCi0KLSNkZWZpbmUgdmlydF90b19wYWdlKGthZGRyKQlwZm5fdG9fcGFnZShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQotI2RlZmluZSBwYWdlX3RvX3ZpcnQocGFnZSkJX192YShwYWdlX3RvX3BmbihwYWdlKSA8PCBQQUdFX1NISUZUKQotI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCXBmbl92YWxpZChfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQotI2RlZmluZSBwYWdlX3RvX3BoeXMocGFnZSkJKHBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQpCi0KLSNkZWZpbmUgV0FOVF9QQUdFX1ZJUlRVQUwKLQotCi0jZW5kaWYgLyogX19BU1NFTUJMWV9fICovCi0KLSNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTCShWTV9SRUFEIHwgVk1fV1JJVEUgfCBWTV9FWEVDIHwgXAotCQkJCSBWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlFWEVDKQotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotI2VuZGlmIC8qIF9YVEVOU0FfUEFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGNpLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGNpLmgKaW5kZXggNjgxNzc0Mi4uMjRlYjdmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wY2kuaApAQCAtMjIsMTIgKzIyLDEyIEBACiAKIGV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcih2b2lkKTsKIAotZXh0ZXJuIGlubGluZSB2b2lkIHBjaWJpb3Nfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3Nfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGd0YWJsZS5oCmluZGV4IDBiYjY0MTYuLjg4M2ViYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3BndGFibGUuaApAQCAtMjYwLDcgKzI2MCw3IEBACiAjZGVmaW5lIHBmbl9wdGUocGZuLCBwcm90KQlfX3B0ZSgoKHBmbikgPDwgUEFHRV9TSElGVCkgfCBwZ3Byb3RfdmFsKHByb3QpKQogI2RlZmluZSBta19wdGUocGFnZSwgcHJvdCkJcGZuX3B0ZShwYWdlX3RvX3BmbihwYWdlKSwgcHJvdCkKIAotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbW9kaWZ5KHB0ZV90IHB0ZSwgcGdwcm90X3QgbmV3cHJvdCkKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21vZGlmeShwdGVfdCBwdGUsIHBncHJvdF90IG5ld3Byb3QpCiB7CiAJcmV0dXJuIF9fcHRlKChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9DSEdfTUFTSykgfCBwZ3Byb3RfdmFsKG5ld3Byb3QpKTsKIH0KQEAgLTI3OCwxNCArMjc4LDE0IEBACiAjZW5kaWYKIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHNldF9wdGVfYXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCkKIHsKIAl1cGRhdGVfcHRlKHB0ZXAsIHB0ZXZhbCk7CiB9CiAKIAotZXh0ZXJuIGlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHNldF9wbWQocG1kX3QgKnBtZHAsIHBtZF90IHBtZHZhbCkKIHsKIAkqcG1kcCA9IHBtZHZhbDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaAppbmRleCAyODQ4YTVmLi5hYTRmZDdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3B0cmFjZS5oCkBAIC0xMjcsNyArMTI3LDcgQEAKICNlbHNlCS8qIF9fQVNTRU1CTFlfXyAqLwogCiAjaWZkZWYgX19LRVJORUxfXwotIyBpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorIyBpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNkZWZpbmUgUFRfUkVHU19PRkZTRVQJICAoS0VSTkVMX1NUQUNLX1NJWkUgLSBQVF9VU0VSX1NJWkUpCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NlbWFwaG9yZS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3NlbWFwaG9yZS5oCmluZGV4IGM4YTc1NzQuLmRiNzQwYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zZW1hcGhvcmUuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2Evc2VtYXBob3JlLmgKQEAgLTQ3LDcgKzQ3LDcgQEAKICNkZWZpbmUgREVDTEFSRV9NVVRFWChuYW1lKSBfX0RFQ0xBUkVfU0VNQVBIT1JFX0dFTkVSSUMobmFtZSwxKQogI2RlZmluZSBERUNMQVJFX01VVEVYX0xPQ0tFRChuYW1lKSBfX0RFQ0xBUkVfU0VNQVBIT1JFX0dFTkVSSUMobmFtZSwwKQogCi1leHRlcm4gaW5saW5lIHZvaWQgc2VtYV9pbml0IChzdHJ1Y3Qgc2VtYXBob3JlICpzZW0sIGludCB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQgc2VtYV9pbml0IChzdHJ1Y3Qgc2VtYXBob3JlICpzZW0sIGludCB2YWwpCiB7CiAvKgogICoJKnNlbSA9IChzdHJ1Y3Qgc2VtYXBob3JlKV9fU0VNQVBIT1JFX0lOSVRJQUxJWkVSKCgqc2VtKSx2YWwpOwpAQCAtNzksNyArNzksNyBAQAogCiBleHRlcm4gc3BpbmxvY2tfdCBzZW1hcGhvcmVfd2FrZV9sb2NrOwogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIGRvd24oc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb3duKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCiB7CiAjaWYgV0FJVFFVRVVFX0RFQlVHCiAJQ0hFQ0tfTUFHSUMoc2VtLT5fX21hZ2ljKTsKQEAgLTg5LDcgKzg5LDcgQEAKIAkJX19kb3duKHNlbSk7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIGludCBkb3duX2ludGVycnVwdGlibGUoc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK3N0YXRpYyBpbmxpbmUgaW50IGRvd25faW50ZXJydXB0aWJsZShzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQogewogCWludCByZXQgPSAwOwogI2lmIFdBSVRRVUVVRV9ERUJVRwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotZXh0ZXJuIF9faW5saW5lX18gaW50IGRvd25fdHJ5bG9jayhzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQorc3RhdGljIGlubGluZSBpbnQgZG93bl90cnlsb2NrKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCiB7CiAJaW50IHJldCA9IDA7CiAjaWYgV0FJVFFVRVVFX0RFQlVHCkBAIC0xMTcsNyArMTE3LDcgQEAKICAqIE5vdGUhIFRoaXMgaXMgc3VidGxlLiBXZSBqdW1wIHRvIHdha2UgcGVvcGxlIHVwIG9ubHkgaWYKICAqIHRoZSBzZW1hcGhvcmUgd2FzIG5lZ2F0aXZlICg9PSBzb21lYm9keSB3YXMgd2FpdGluZyBvbiBpdCkuCiAgKi8KLWV4dGVybiBfX2lubGluZV9fIHZvaWQgdXAoc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cChzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQogewogI2lmIFdBSVRRVUVVRV9ERUJVRwogCUNIRUNLX01BR0lDKHNlbS0+X19tYWdpYyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc3RyaW5nLmggYi9pbmNsdWRlL2FzbS14dGVuc2Evc3RyaW5nLmgKaW5kZXggM2Y4MWIyNy4uNWZiOGMyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3N0cmluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zdHJpbmcuaApAQCAtMTYsNyArMTYsNyBAQAogI2RlZmluZSBfWFRFTlNBX1NUUklOR19ICiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfU1RSQ1BZCi1leHRlcm4gX19pbmxpbmVfXyBjaGFyICpzdHJjcHkoY2hhciAqX19kZXN0LCBjb25zdCBjaGFyICpfX3NyYykKK3N0YXRpYyBpbmxpbmUgY2hhciAqc3RyY3B5KGNoYXIgKl9fZGVzdCwgY29uc3QgY2hhciAqX19zcmMpCiB7CiAJcmVnaXN0ZXIgY2hhciAqX194ZGVzdCA9IF9fZGVzdDsKIAl1bnNpZ25lZCBsb25nIF9fZHVtbXk7CkBAIC0zNSw3ICszNSw3IEBACiB9CiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfU1RSTkNQWQotZXh0ZXJuIF9faW5saW5lX18gY2hhciAqc3RybmNweShjaGFyICpfX2Rlc3QsIGNvbnN0IGNoYXIgKl9fc3JjLCBzaXplX3QgX19uKQorc3RhdGljIGlubGluZSBjaGFyICpzdHJuY3B5KGNoYXIgKl9fZGVzdCwgY29uc3QgY2hhciAqX19zcmMsIHNpemVfdCBfX24pCiB7CiAJcmVnaXN0ZXIgY2hhciAqX194ZGVzdCA9IF9fZGVzdDsKIAl1bnNpZ25lZCBsb25nIF9fZHVtbXk7CkBAIC02MCw3ICs2MCw3IEBACiB9CiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfU1RSQ01QCi1leHRlcm4gX19pbmxpbmVfXyBpbnQgc3RyY21wKGNvbnN0IGNoYXIgKl9fY3MsIGNvbnN0IGNoYXIgKl9fY3QpCitzdGF0aWMgaW5saW5lIGludCBzdHJjbXAoY29uc3QgY2hhciAqX19jcywgY29uc3QgY2hhciAqX19jdCkKIHsKIAlyZWdpc3RlciBpbnQgX19yZXM7CiAJdW5zaWduZWQgbG9uZyBfX2R1bW15OwpAQCAtODIsNyArODIsNyBAQAogfQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1NUUk5DTVAKLWV4dGVybiBfX2lubGluZV9fIGludCBzdHJuY21wKGNvbnN0IGNoYXIgKl9fY3MsIGNvbnN0IGNoYXIgKl9fY3QsIHNpemVfdCBfX24pCitzdGF0aWMgaW5saW5lIGludCBzdHJuY21wKGNvbnN0IGNoYXIgKl9fY3MsIGNvbnN0IGNoYXIgKl9fY3QsIHNpemVfdCBfX24pCiB7CiAJcmVnaXN0ZXIgaW50IF9fcmVzOwogCXVuc2lnbmVkIGxvbmcgX19kdW1teTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zeXN0ZW0uaAppbmRleCA2OTBmZTMyLi5mMDkzOTMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2Evc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3N5c3RlbS5oCkBAIC01Niw3ICs1Niw3IEBACiAKICNkZWZpbmUgY2xlYXJfY3BlbmFibGUoKSBfX2NsZWFyX2NwZW5hYmxlKCkKIAotZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfX2NsZWFyX2NwZW5hYmxlKHZvaWQpCitzdGF0aWMgaW5saW5lIHZvaWQgX19jbGVhcl9jcGVuYWJsZSh2b2lkKQogewogI2lmIFhDSEFMX0hBVkVfQ1AKIAl1bnNpZ25lZCBsb25nIGkgPSAwOwpAQCAtNjQsNyArNjQsNyBAQAogI2VuZGlmCiB9CiAKLWV4dGVybiBfX2lubGluZV9fIHZvaWQgZW5hYmxlX2NvcHJvY2Vzc29yKGludCBpKQorc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9jb3Byb2Nlc3NvcihpbnQgaSkKIHsKICNpZiBYQ0hBTF9IQVZFX0NQCiAJaW50IGNwOwpAQCAtNzQsNyArNzQsNyBAQAogI2VuZGlmCiB9CiAKLWV4dGVybiBfX2lubGluZV9fIHZvaWQgZGlzYWJsZV9jb3Byb2Nlc3NvcihpbnQgaSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2NvcHJvY2Vzc29yKGludCBpKQogewogI2lmIFhDSEFMX0hBVkVfQ1AKIAlpbnQgY3A7CkBAIC0xMjMsNyArMTIzLDcgQEAKICAqIGNtcHhjaGcKICAqLwogCi1leHRlcm4gX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIF9fY21weGNoZ191MzIodm9sYXRpbGUgaW50ICpwLCBpbnQgb2xkLCBpbnQgbmV3KQogewogICBfX2FzbV9fIF9fdm9sYXRpbGVfXygicnNpbCAgICBhMTUsICJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCkBAIC0xNzMsNyArMTczLDcgQEAKICAqIHdoZXJlIG5vIHJlZ2lzdGVyIHJlZmVyZW5jZSB3aWxsIGNhdXNlIGFuIG92ZXJmbG93LgogICovCiAKLWV4dGVybiBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgeGNoZ191MzIodm9sYXRpbGUgaW50ICogbSwgdW5zaWduZWQgbG9uZyB2YWwpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgeGNoZ191MzIodm9sYXRpbGUgaW50ICogbSwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAgIHVuc2lnbmVkIGxvbmcgdG1wOwogICBfX2FzbV9fIF9fdm9sYXRpbGVfXygicnNpbCAgICBhMTUsICJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdGxiZmx1c2guaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS90bGJmbHVzaC5oCmluZGV4IDIzYmZlOWQuLjQzZjZlYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90bGJmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS90bGJmbHVzaC5oCkBAIC0zOSw3ICszOSw3IEBACiAgKiBwYWdlLXRhYmxlIHBhZ2VzLgogICovCiAKLWV4dGVybiBpbmxpbmUgdm9pZCBmbHVzaF90bGJfcGd0YWJsZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX3BndGFibGVzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIH0KQEAgLTUxLDI2ICs1MSwyNiBAQAogI2RlZmluZSBJVExCX1BST0JFX1NVQ0NFU1MgICgxIDw8IElUTEJfV0FZU19MT0cyKQogI2RlZmluZSBEVExCX1BST0JFX1NVQ0NFU1MgICgxIDw8IERUTEJfV0FZU19MT0cyKQogCi1leHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgaXRsYl9wcm9iZSh1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaXRsYl9wcm9iZSh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oInBpdGxiICAlMCwgJTFcblx0IiA6ICI9YSIgKHRtcCkgOiAiYSIgKGFkZHIpKTsKIAlyZXR1cm4gdG1wOwogfQogCi1leHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgZHRsYl9wcm9iZSh1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZHRsYl9wcm9iZSh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oInBkdGxiICAlMCwgJTFcblx0IiA6ICI9YSIgKHRtcCkgOiAiYSIgKGFkZHIpKTsKIAlyZXR1cm4gdG1wOwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgaW52YWxpZGF0ZV9pdGxiX2VudHJ5ICh1bnNpZ25lZCBsb25nIHByb2JlKQorc3RhdGljIGlubGluZSB2b2lkIGludmFsaWRhdGVfaXRsYl9lbnRyeSAodW5zaWduZWQgbG9uZyBwcm9iZSkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaWl0bGIgICUwOyBpc3luY1xuXHQiIDogOiAiYSIgKHByb2JlKSk7CiB9CiAKLWV4dGVybiBpbmxpbmUgdm9pZCBpbnZhbGlkYXRlX2R0bGJfZW50cnkgKHVuc2lnbmVkIGxvbmcgcHJvYmUpCitzdGF0aWMgaW5saW5lIHZvaWQgaW52YWxpZGF0ZV9kdGxiX2VudHJ5ICh1bnNpZ25lZCBsb25nIHByb2JlKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKCJpZHRsYiAgJTA7IGRzeW5jXG5cdCIgOiA6ICJhIiAocHJvYmUpKTsKIH0KQEAgLTgwLDY4ICs4MCw2OCBAQAogICogY2FsbGVyIG11c3QgZm9sbG93IHVwIHdpdGggYW4gJ2lzeW5jJywgd2hpY2ggY2FuIGJlIHJlbGF0aXZlbHkKICAqIGV4cGVuc2l2ZSBvbiBzb21lIFh0ZW5zYSBpbXBsZW1lbnRhdGlvbnMuCiAgKi8KLWV4dGVybiBpbmxpbmUgdm9pZCBpbnZhbGlkYXRlX2l0bGJfZW50cnlfbm9faXN5bmMgKHVuc2lnbmVkIGVudHJ5KQorc3RhdGljIGlubGluZSB2b2lkIGludmFsaWRhdGVfaXRsYl9lbnRyeV9ub19pc3luYyAodW5zaWduZWQgZW50cnkpCiB7CiAJLyogQ2FsbGVyIG11c3QgZm9sbG93IHVwIHdpdGggJ2lzeW5jJy4gKi8KIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlpdGxiICAlMFxuIiA6IDogImEiIChlbnRyeSkgKTsKIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkIGludmFsaWRhdGVfZHRsYl9lbnRyeV9ub19pc3luYyAodW5zaWduZWQgZW50cnkpCitzdGF0aWMgaW5saW5lIHZvaWQgaW52YWxpZGF0ZV9kdGxiX2VudHJ5X25vX2lzeW5jICh1bnNpZ25lZCBlbnRyeSkKIHsKIAkvKiBDYWxsZXIgbXVzdCBmb2xsb3cgdXAgd2l0aCAnaXN5bmMnLiAqLwogCV9fYXNtX18gX192b2xhdGlsZV9fICgiaWR0bGIgICUwXG4iIDogOiAiYSIgKGVudHJ5KSApOwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgc2V0X2l0bGJjZmdfcmVnaXN0ZXIgKHVuc2lnbmVkIGxvbmcgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9pdGxiY2ZnX3JlZ2lzdGVyICh1bnNpZ25lZCBsb25nIHZhbCkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygid3NyICAlMCwgIl9fc3RyaW5naWZ5KElUTEJDRkcpIlxuXHQiICJpc3luY1xuXHQiCiAJCQkgICAgIDogOiAiYSIgKHZhbCkpOwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgc2V0X2R0bGJjZmdfcmVnaXN0ZXIgKHVuc2lnbmVkIGxvbmcgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9kdGxiY2ZnX3JlZ2lzdGVyICh1bnNpZ25lZCBsb25nIHZhbCkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygid3NyICAlMCwgIl9fc3RyaW5naWZ5KERUTEJDRkcpIjsgZHN5bmNcblx0IgogCSAgICAJCSAgICAgOiA6ICJhIiAodmFsKSk7CiB9CiAKLWV4dGVybiBpbmxpbmUgdm9pZCBzZXRfcHRldmFkZHJfcmVnaXN0ZXIgKHVuc2lnbmVkIGxvbmcgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9wdGV2YWRkcl9yZWdpc3RlciAodW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIiB3c3IgICUwLCAiX19zdHJpbmdpZnkoUFRFVkFERFIpIjsgaXN5bmNcbiIKIAkJCSAgICAgOiA6ICJhIiAodmFsKSk7CiB9CiAKLWV4dGVybiBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX3B0ZXZhZGRyX3JlZ2lzdGVyICh2b2lkKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfcHRldmFkZHJfcmVnaXN0ZXIgKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oInJzciAgJTAsICJfX3N0cmluZ2lmeShQVEVWQUREUikiXG5cdCIgOiAiPWEiICh0bXApKTsKIAlyZXR1cm4gdG1wOwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgd3JpdGVfZHRsYl9lbnRyeSAocHRlX3QgZW50cnksIGludCB3YXkpCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfZHRsYl9lbnRyeSAocHRlX3QgZW50cnksIGludCB3YXkpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIndkdGxiICAlMSwgJTA7IGRzeW5jXG5cdCIKIAkJCSAgICAgOiA6ICJyIiAod2F5KSwgInIiIChlbnRyeSkgKTsKIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkIHdyaXRlX2l0bGJfZW50cnkgKHB0ZV90IGVudHJ5LCBpbnQgd2F5KQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2l0bGJfZW50cnkgKHB0ZV90IGVudHJ5LCBpbnQgd2F5KQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3aXRsYiAgJTEsICUwOyBpc3luY1xuXHQiCiAJICAgICAgICAgICAgICAgICAgICAgOiA6ICJyIiAod2F5KSwgInIiIChlbnRyeSkgKTsKIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkIGludmFsaWRhdGVfcGFnZV9kaXJlY3RvcnkgKHZvaWQpCitzdGF0aWMgaW5saW5lIHZvaWQgaW52YWxpZGF0ZV9wYWdlX2RpcmVjdG9yeSAodm9pZCkKIHsKIAlpbnZhbGlkYXRlX2R0bGJfZW50cnkgKERUTEJfV0FZX1BHVEFCTEUpOwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgaW52YWxpZGF0ZV9pdGxiX21hcHBpbmcgKHVuc2lnbmVkIGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHZvaWQgaW52YWxpZGF0ZV9pdGxiX21hcHBpbmcgKHVuc2lnbmVkIGFkZHJlc3MpCiB7CiAJdW5zaWduZWQgbG9uZyB0bGJfZW50cnk7CiAJd2hpbGUgKCh0bGJfZW50cnkgPSBpdGxiX3Byb2JlIChhZGRyZXNzKSkgJiBJVExCX1BST0JFX1NVQ0NFU1MpCiAJCWludmFsaWRhdGVfaXRsYl9lbnRyeSAodGxiX2VudHJ5KTsKIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkIGludmFsaWRhdGVfZHRsYl9tYXBwaW5nICh1bnNpZ25lZCBhZGRyZXNzKQorc3RhdGljIGlubGluZSB2b2lkIGludmFsaWRhdGVfZHRsYl9tYXBwaW5nICh1bnNpZ25lZCBhZGRyZXNzKQogewogCXVuc2lnbmVkIGxvbmcgdGxiX2VudHJ5OwogCXdoaWxlICgodGxiX2VudHJ5ID0gZHRsYl9wcm9iZSAoYWRkcmVzcykpICYgRFRMQl9QUk9CRV9TVUNDRVNTKQpAQCAtMTY1LDI4ICsxNjUsMjggQEAKICAqICAgICAgYXNbMDcuLjAwXSBjb250YWluIHRoZSBhc2lkCiAgKi8KIAotZXh0ZXJuIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfZHRsYl92aXJ0dWFsIChpbnQgd2F5KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfZHRsYl92aXJ0dWFsIChpbnQgd2F5KQogewogCXVuc2lnbmVkIGxvbmcgdG1wOwogCV9fYXNtX18gX192b2xhdGlsZV9fKCJyZHRsYjAgICUwLCAlMVxuXHQiIDogIj1hIiAodG1wKSwgIithIiAod2F5KSk7CiAJcmV0dXJuIHRtcDsKIH0KIAotZXh0ZXJuIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfZHRsYl90cmFuc2xhdGlvbiAoaW50IHdheSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX2R0bGJfdHJhbnNsYXRpb24gKGludCB3YXkpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oInJkdGxiMSAgJTAsICUxXG5cdCIgOiAiPWEiICh0bXApLCAiK2EiICh3YXkpKTsKIAlyZXR1cm4gdG1wOwogfQogCi1leHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9pdGxiX3ZpcnR1YWwgKGludCB3YXkpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9pdGxiX3ZpcnR1YWwgKGludCB3YXkpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oInJpdGxiMCAgJTAsICUxXG5cdCIgOiAiPWEiICh0bXApLCAiK2EiICh3YXkpKTsKIAlyZXR1cm4gdG1wOwogfQogCi1leHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9pdGxiX3RyYW5zbGF0aW9uIChpbnQgd2F5KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfaXRsYl90cmFuc2xhdGlvbiAoaW50IHdheSkKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygicml0bGIxICAlMCwgJTFcblx0IiA6ICI9YSIgKHRtcCksICIrYSIgKHdheSkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3R5cGVzLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdHlwZXMuaAppbmRleCBlYmFjMDA0Li45ZDk5YThlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvdHlwZXMuaApAQCAtNTgsOCArNTgsNiBAQAogCiB0eXBlZGVmIHUzMiBkbWFfYWRkcl90OwogCi10eXBlZGVmIHVuc2lnbmVkIGludCBrbWVtX2J1ZmN0bF90OwotCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdWFjY2Vzcy5oCmluZGV4IDM1NTc2YjIuLjA2YTIyYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3VhY2Nlc3MuaApAQCAtMjUsNyArMjUsNyBAQAogCiAjZGVmaW5lIF9BU01MQU5HVUFHRQogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKIC8qCkBAIC0yMTEsNyArMjExLDcgQEAKICNkZWZpbmUgX19hY2Nlc3Nfb2soYWRkcixzaXplKSAoX19rZXJuZWxfb2sgfHwgX191c2VyX29rKChhZGRyKSwoc2l6ZSkpKQogI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpIF9fYWNjZXNzX29rKCh1bnNpZ25lZCBsb25nKShhZGRyKSwoc2l6ZSkpCiAKLWV4dGVybiBpbmxpbmUgaW50IHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIGlubGluZSBpbnQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJcmV0dXJuIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgPyAwIDogLUVGQVVMVDsKIH0KQEAgLTQ2NCw3ICs0NjQsNyBAQAogICogc3VjY2Vzcy4KICAqLwogCi1leHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogX194dGVuc2FfY2xlYXJfdXNlcih2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJaWYgKCAhIG1lbXNldChhZGRyLCAwLCBzaXplKSApCkBAIC00NzIsNyArNDcyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotZXh0ZXJuIGlubGluZSB1bnNpZ25lZCBsb25nCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIGNsZWFyX3VzZXIodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhZGRyLCBzaXplKSkKQEAgLTQ4Niw3ICs0ODYsNyBAQAogZXh0ZXJuIGxvbmcgX19zdHJuY3B5X3VzZXIoY2hhciAqLCBjb25zdCBjaGFyICosIGxvbmcpOwogI2RlZmluZSBfX3N0cm5jcHlfZnJvbV91c2VyIF9fc3RybmNweV91c2VyCiAKLWV4dGVybiBpbmxpbmUgbG9uZworc3RhdGljIGlubGluZSBsb25nCiBzdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgbG9uZyBjb3VudCkKIHsKIAlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIDEpKQpAQCAtNTAyLDcgKzUwMiw3IEBACiAgKi8KIGV4dGVybiBsb25nIF9fc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgKiwgbG9uZyk7CiAKLWV4dGVybiBpbmxpbmUgbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciAqc3RyLCBsb25nIGxlbikKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciAqc3RyLCBsb25nIGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIHRvcCA9IF9fa2VybmVsX29rID8gfjBVTCA6IFRBU0tfU0laRSAtIDE7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNwaS5oIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKaW5kZXggYjQ2YTUyMC4uMDI2YzNjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hY3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKQEAgLTQxLDcgKzQxLDcgQEAKICNpbmNsdWRlIDxhc20vYWNwaS5oPgogCiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAogZW51bSBhY3BpX2lycV9tb2RlbF9pZCB7CiAJQUNQSV9JUlFfTU9ERUxfUElDID0gMCwKQEAgLTQyOSwyMyArNDI5LDEzIEBACiAKIGV4dGVybiBpbnQgc2JmX3BvcnQgOwogCi0jZWxzZQkvKiFDT05GSUdfQUNQSV9CT09UKi8KKyNlbHNlCS8qICFDT05GSUdfQUNQSSAqLwogCiAjZGVmaW5lIGFjcGlfbXBfY29uZmlnCTAKIAotc3RhdGljIGlubGluZSBpbnQgYWNwaV9ib290X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KKyNlbmRpZiAJLyogIUNPTkZJR19BQ1BJICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IGFjcGlfYm9vdF90YWJsZV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAJLyohQ09ORklHX0FDUElfQk9PVCovCi0KLXVuc2lnbmVkIGludCBhY3BpX3JlZ2lzdGVyX2dzaSAodTMyIGdzaSwgaW50IGVkZ2VfbGV2ZWwsIGludCBhY3RpdmVfaGlnaF9sb3cpOworaW50IGFjcGlfcmVnaXN0ZXJfZ3NpICh1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdyk7CiBpbnQgYWNwaV9nc2lfdG9faXJxICh1MzIgZ3NpLCB1bnNpZ25lZCBpbnQgKmlycSk7CiAKIC8qCkBAIC00NTUsNyArNDQ1LDcgQEAKICAqLwogdm9pZCBhY3BpX3VucmVnaXN0ZXJfZ3NpICh1MzIgZ3NpKTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX1BDSQorI2lmZGVmIENPTkZJR19BQ1BJCiAKIHN0cnVjdCBhY3BpX3BydF9lbnRyeSB7CiAJc3RydWN0IGxpc3RfaGVhZAlub2RlOwpAQCAtNDg5LDcgKzQ3OSw3IEBACiBpbnQgYWNwaV9wY2lfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBhY3BpX3BjaV9kcml2ZXIgKmRyaXZlcik7CiB2b2lkIGFjcGlfcGNpX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBhY3BpX3BjaV9kcml2ZXIgKmRyaXZlcik7CiAKLSNlbmRpZiAvKkNPTkZJR19BQ1BJX1BDSSovCisjZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KIAogI2lmZGVmIENPTkZJR19BQ1BJX0VDCiAKQEAgLTQ5OCwyMCArNDg4LDkgQEAKIAogI2VuZGlmIC8qQ09ORklHX0FDUElfRUMqLwogCi0jaWZkZWYgQ09ORklHX0FDUElfSU5URVJQUkVURVIKLQogZXh0ZXJuIGludCBhY3BpX2JsYWNrbGlzdGVkKHZvaWQpOwogZXh0ZXJuIHZvaWQgYWNwaV9iaW9zX3llYXIoY2hhciAqcyk7CiAKLSNlbHNlIC8qIUNPTkZJR19BQ1BJX0lOVEVSUFJFVEVSKi8KLQotc3RhdGljIGlubGluZSBpbnQgYWNwaV9ibGFja2xpc3RlZCh2b2lkKQotewotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyohQ09ORklHX0FDUElfSU5URVJQUkVURVIqLwotCiAjZGVmaW5lCUFDUElfQ1NUQVRFX0xJTUlUX0RFRklORUQJLyogZm9yIGRyaXZlciBidWlsZHMgKi8KICNpZmRlZglDT05GSUdfQUNQSQogCkBAIC01NDksNSArNTI4LDE3IEBACiAKIGV4dGVybiBpbnQgcG5wYWNwaV9kaXNhYmxlZDsKIAorI2Vsc2UJLyogQ09ORklHX0FDUEkgKi8KKworc3RhdGljIGlubGluZSBpbnQgYWNwaV9ib290X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWNwaV9ib290X3RhYmxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwogI2VuZGlmCS8qIENPTkZJR19BQ1BJICovCiAjZW5kaWYJLypfTElOVVhfQUNQSV9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXR0cmlidXRlX2NvbnRhaW5lci5oIGIvaW5jbHVkZS9saW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmgKaW5kZXggYWYxMDEwYi4uOTNiZmIwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmgKQEAgLTExLDEwICsxMSwxMiBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgewogCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWNvbnRhaW5lcnM7CisJc3RydWN0IGtsaXN0CQljb250YWluZXJzOwogCXN0cnVjdCBjbGFzcwkJKmNsYXNzOwogCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICoqYXR0cnM7CiAJaW50ICgqbWF0Y2gpKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICosIHN0cnVjdCBkZXZpY2UgKik7CkBAIC02MiwxMiArNjQsOCBAQAogCQkJCQkJIHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzZGV2KTsKIHZvaWQgYXR0cmlidXRlX2NvbnRhaW5lcl9yZW1vdmVfYXR0cnMoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NkZXYpOwogdm9pZCBhdHRyaWJ1dGVfY29udGFpbmVyX2NsYXNzX2RldmljZV9kZWwoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NkZXYpOwotCi0KLQotCi0KLQorc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmF0dHJpYnV0ZV9jb250YWluZXJfY2xhc3NkZXZfdG9fY29udGFpbmVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKik7CitzdHJ1Y3QgY2xhc3NfZGV2aWNlICphdHRyaWJ1dGVfY29udGFpbmVyX2ZpbmRfY2xhc3NfZGV2aWNlKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICosIHN0cnVjdCBkZXZpY2UgKik7CiBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqKmF0dHJpYnV0ZV9jb250YWluZXJfY2xhc3NkZXZfdG9fYXR0cnMoY29uc3Qgc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NkZXYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXV4dmVjLmggYi9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhN2IzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgX0xJTlVYX0FVWFZFQ19ICisjZGVmaW5lIF9MSU5VWF9BVVhWRUNfSAorCisjaW5jbHVkZSA8YXNtL2F1eHZlYy5oPgorCisvKiBTeW1ib2xpYyB2YWx1ZXMgZm9yIHRoZSBlbnRyaWVzIGluIHRoZSBhdXhpbGlhcnkgdGFibGUKKyAgIHB1dCBvbiB0aGUgaW5pdGlhbCBzdGFjayAqLworI2RlZmluZSBBVF9OVUxMICAgMAkvKiBlbmQgb2YgdmVjdG9yICovCisjZGVmaW5lIEFUX0lHTk9SRSAxCS8qIGVudHJ5IHNob3VsZCBiZSBpZ25vcmVkICovCisjZGVmaW5lIEFUX0VYRUNGRCAyCS8qIGZpbGUgZGVzY3JpcHRvciBvZiBwcm9ncmFtICovCisjZGVmaW5lIEFUX1BIRFIgICAzCS8qIHByb2dyYW0gaGVhZGVycyBmb3IgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9QSEVOVCAgNAkvKiBzaXplIG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5ICovCisjZGVmaW5lIEFUX1BITlVNICA1CS8qIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnMgKi8KKyNkZWZpbmUgQVRfUEFHRVNaIDYJLyogc3lzdGVtIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBBVF9CQVNFICAgNwkvKiBiYXNlIGFkZHJlc3Mgb2YgaW50ZXJwcmV0ZXIgKi8KKyNkZWZpbmUgQVRfRkxBR1MgIDgJLyogZmxhZ3MgKi8KKyNkZWZpbmUgQVRfRU5UUlkgIDkJLyogZW50cnkgcG9pbnQgb2YgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9OT1RFTEYgMTAJLyogcHJvZ3JhbSBpcyBub3QgRUxGICovCisjZGVmaW5lIEFUX1VJRCAgICAxMQkvKiByZWFsIHVpZCAqLworI2RlZmluZSBBVF9FVUlEICAgMTIJLyogZWZmZWN0aXZlIHVpZCAqLworI2RlZmluZSBBVF9HSUQgICAgMTMJLyogcmVhbCBnaWQgKi8KKyNkZWZpbmUgQVRfRUdJRCAgIDE0CS8qIGVmZmVjdGl2ZSBnaWQgKi8KKyNkZWZpbmUgQVRfUExBVEZPUk0gMTUgIC8qIHN0cmluZyBpZGVudGlmeWluZyBDUFUgZm9yIG9wdGltaXphdGlvbnMgKi8KKyNkZWZpbmUgQVRfSFdDQVAgIDE2ICAgIC8qIGFyY2ggZGVwZW5kZW50IGhpbnRzIGF0IENQVSBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQVRfQ0xLVENLIDE3CS8qIGZyZXF1ZW5jeSBhdCB3aGljaCB0aW1lcygpIGluY3JlbWVudHMgKi8KKworI2RlZmluZSBBVF9TRUNVUkUgMjMgICAvKiBzZWN1cmUgbW9kZSBib29sZWFuICovCisKKyNkZWZpbmUgQVRfVkVDVE9SX1NJWkUgIDQyIC8qIFNpemUgb2YgYXV4aWxpYXJ5IHRhYmxlLiAgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9BVVhWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvYmZzX2ZzLmgKaW5kZXggZjdmMDkxMy4uYzEyMzdhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iZnNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jmc19mcy5oCkBAIC0xNCw4ICsxNCw5IEBACiAjZGVmaW5lIEJGU19JTk9ERVNfUEVSX0JMT0NLCTgKIAogLyogU1ZSNCB2bm9kZSB0eXBlIHZhbHVlcyAoYmZzX2lub2RlLT5pX3Z0eXBlKSAqLwotI2RlZmluZSBCRlNfVkRJUgkJMgotI2RlZmluZSBCRlNfVlJFRwkJMQorI2RlZmluZSBCRlNfVkRJUiAyTAorI2RlZmluZSBCRlNfVlJFRyAxTAorCiAKIC8qIEJGUyBpbm9kZSBsYXlvdXQgb24gZGlzayAqLwogc3RydWN0IGJmc19pbm9kZSB7CkBAIC01OCwyMiArNTksMjIgQEAKIAlfX3UzMiBzX3BhZGRpbmdbMTE4XTsKIH07CiAKLSNkZWZpbmUgQkZTX05aRklMRVNJWkUoaXApIFwKLSAgICAgICAgKCgoaXApLT5pX2VvZmZzZXQgKyAxKSAtIChpcCktPmlfc2Jsb2NrICogQkZTX0JTSVpFKQotCi0jZGVmaW5lIEJGU19GSUxFU0laRShpcCkgXAotICAgICAgICAoKGlwKS0+aV9zYmxvY2sgPT0gMCA/IDAgOiBCRlNfTlpGSUxFU0laRShpcCkpCi0KLSNkZWZpbmUgQkZTX0ZJTEVCTE9DS1MoaXApIFwKLSAgICAgICAgKChpcCktPmlfc2Jsb2NrID09IDAgPyAwIDogKChpcCktPmlfZWJsb2NrICsgMSkgLSAoaXApLT5pX3NibG9jaykKIAogI2RlZmluZSBCRlNfT0ZGMklOTyhvZmZzZXQpIFwKICAgICAgICAgKCgoKG9mZnNldCkgLSBCRlNfQlNJWkUpIC8gc2l6ZW9mKHN0cnVjdCBiZnNfaW5vZGUpKSArIEJGU19ST09UX0lOTykKIAogI2RlZmluZSBCRlNfSU5PMk9GRihpbm8pIFwKIAkoKF9fdTMyKSgoKGlubykgLSBCRlNfUk9PVF9JTk8pICogc2l6ZW9mKHN0cnVjdCBiZnNfaW5vZGUpKSArIEJGU19CU0laRSkKKyNkZWZpbmUgQkZTX05aRklMRVNJWkUoaXApIFwKKyAgICAgICAgKChjcHVfdG9fbGUzMigoaXApLT5pX2VvZmZzZXQpICsgMSkgLSAgY3B1X3RvX2xlMzIoKGlwKS0+aV9zYmxvY2spICogQkZTX0JTSVpFKQogCisjZGVmaW5lIEJGU19GSUxFU0laRShpcCkgXAorICAgICAgICAoKGlwKS0+aV9zYmxvY2sgPT0gMCA/IDAgOiBCRlNfTlpGSUxFU0laRShpcCkpCisKKyNkZWZpbmUgQkZTX0ZJTEVCTE9DS1MoaXApIFwKKyAgICAgICAgKChpcCktPmlfc2Jsb2NrID09IDAgPyAwIDogKGNwdV90b19sZTMyKChpcCktPmlfZWJsb2NrKSArIDEpIC0gIGNwdV90b19sZTMyKChpcCktPmlfc2Jsb2NrKSkKICNkZWZpbmUgQkZTX1VOQ0xFQU4oYmZzX3NiLCBzYikJXAotCSgoYmZzX3NiLT5zX2Zyb20gIT0gLTEpICYmIChiZnNfc2ItPnNfdG8gIT0gLTEpICYmICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCSgoY3B1X3RvX2xlMzIoYmZzX3NiLT5zX2Zyb20pICE9IC0xKSAmJiAoY3B1X3RvX2xlMzIoYmZzX3NiLT5zX3RvKSAhPSAtMSkgJiYgIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisKIAogI2VuZGlmCS8qIF9MSU5VWF9CRlNfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW8uaCBiL2luY2x1ZGUvbGludXgvYmlvLmgKaW5kZXggMzZlZjI5Zi4uNmUxYzc5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jpby5oCkBAIC0xMTEsNyArMTExLDYgQEAKIAl2b2lkCQkJKmJpX3ByaXZhdGU7CiAKIAliaW9fZGVzdHJ1Y3Rvcl90CSpiaV9kZXN0cnVjdG9yOwkvKiBkZXN0cnVjdG9yICovCi0Jc3RydWN0IGJpb19zZXQJCSpiaV9zZXQ7CS8qIG1lbW9yeSBwb29scyBzZXQgKi8KIH07CiAKIC8qCkBAIC0yODAsNiArMjc5LDcgQEAKIGV4dGVybiBzdHJ1Y3QgYmlvICpiaW9fYWxsb2ModW5zaWduZWQgaW50IF9fbm9jYXN0LCBpbnQpOwogZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19hbGxvY19iaW9zZXQodW5zaWduZWQgaW50IF9fbm9jYXN0LCBpbnQsIHN0cnVjdCBiaW9fc2V0ICopOwogZXh0ZXJuIHZvaWQgYmlvX3B1dChzdHJ1Y3QgYmlvICopOworZXh0ZXJuIHZvaWQgYmlvX2ZyZWUoc3RydWN0IGJpbyAqLCBzdHJ1Y3QgYmlvX3NldCAqKTsKIAogZXh0ZXJuIHZvaWQgYmlvX2VuZGlvKHN0cnVjdCBiaW8gKiwgdW5zaWduZWQgaW50LCBpbnQpOwogc3RydWN0IHJlcXVlc3RfcXVldWU7CkBAIC0yOTUsNyArMjk1LDEzIEBACiBleHRlcm4gaW50IGJpb19nZXRfbnJfdmVjcyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICopOwogZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19tYXBfdXNlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosCiAJCQkJdW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50LCBpbnQpOworc3RydWN0IHNnX2lvdmVjOworZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19tYXBfdXNlcl9pb3Yoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwKKwkJCQkgICAgc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQkJCSAgICBzdHJ1Y3Qgc2dfaW92ZWMgKiwgaW50LCBpbnQpOwogZXh0ZXJuIHZvaWQgYmlvX3VubWFwX3VzZXIoc3RydWN0IGJpbyAqKTsKK2V4dGVybiBzdHJ1Y3QgYmlvICpiaW9fbWFwX2tlcm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdm9pZCAqLCB1bnNpZ25lZCBpbnQsCisJCQkJdW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIGJpb19zZXRfcGFnZXNfZGlydHkoc3RydWN0IGJpbyAqYmlvKTsKIGV4dGVybiB2b2lkIGJpb19jaGVja19wYWdlc19kaXJ0eShzdHJ1Y3QgYmlvICpiaW8pOwogZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19jb3B5X3VzZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50LCBpbnQpOwpAQCAtMzA4LDkgKzMxNCw4IEBACiAgKiBidmVjX2ttYXBfaXJxIGFuZCBidmVjX2t1bm1hcF9pcnEhIQogICoKICAqIFRoaXMgZnVuY3Rpb24gTVVTVCBiZSBpbmxpbmVkIC0gaXQgcGxheXMgd2l0aCB0aGUgQ1BVIGludGVycnVwdCBmbGFncy4KLSAqIEhlbmNlIHRoZSBgZXh0ZXJuIGlubGluZScuCiAgKi8KLWV4dGVybiBpbmxpbmUgY2hhciAqYnZlY19rbWFwX2lycShzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCitzdGF0aWMgaW5saW5lIGNoYXIgKmJ2ZWNfa21hcF9pcnEoc3RydWN0IGJpb192ZWMgKmJ2ZWMsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIApAQCAtMzI2LDcgKzMzMSw3IEBACiAJcmV0dXJuIChjaGFyICopIGFkZHIgKyBidmVjLT5idl9vZmZzZXQ7CiB9CiAKLWV4dGVybiBpbmxpbmUgdm9pZCBidmVjX2t1bm1hcF9pcnEoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nICpmbGFncykKK3N0YXRpYyBpbmxpbmUgdm9pZCBidmVjX2t1bm1hcF9pcnEoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nICpmbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIHB0ciA9ICh1bnNpZ25lZCBsb25nKSBidWZmZXIgJiBQQUdFX01BU0s7CiAKQEAgLTMzOSw3ICszNDQsNyBAQAogI2RlZmluZSBidmVjX2t1bm1hcF9pcnEoYnVmLCBmbGFncykJZG8geyAqKGZsYWdzKSA9IDA7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotZXh0ZXJuIGlubGluZSBjaGFyICpfX2Jpb19rbWFwX2lycShzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIHNob3J0IGlkeCwKK3N0YXRpYyBpbmxpbmUgY2hhciAqX19iaW9fa21hcF9pcnEoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBzaG9ydCBpZHgsCiAJCQkJICAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7CiAJcmV0dXJuIGJ2ZWNfa21hcF9pcnEoYmlvX2lvdmVjX2lkeChiaW8sIGlkeCksIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYml0X3NwaW5sb2NrLmggYi9pbmNsdWRlL2xpbnV4L2JpdF9zcGlubG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjBhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2JpdF9zcGlubG9jay5oCkBAIC0wLDAgKzEsNzcgQEAKKyNpZm5kZWYgX19MSU5VWF9CSVRfU1BJTkxPQ0tfSAorI2RlZmluZSBfX0xJTlVYX0JJVF9TUElOTE9DS19ICisKKy8qCisgKiAgYml0LWJhc2VkIHNwaW5fbG9jaygpCisgKgorICogRG9uJ3QgdXNlIHRoaXMgdW5sZXNzIHlvdSByZWFsbHkgbmVlZCB0bzogc3Bpbl9sb2NrKCkgYW5kIHNwaW5fdW5sb2NrKCkKKyAqIGFyZSBzaWduaWZpY2FudGx5IGZhc3Rlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJpdF9zcGluX2xvY2soaW50IGJpdG51bSwgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwkvKgorCSAqIEFzc3VtaW5nIHRoZSBsb2NrIGlzIHVuY29udGVuZGVkLCB0aGlzIG5ldmVyIGVudGVycworCSAqIHRoZSBib2R5IG9mIHRoZSBvdXRlciBsb29wLiBJZiBpdCBpcyBjb250ZW5kZWQsIHRoZW4KKwkgKiB3aXRoaW4gdGhlIGlubmVyIGxvb3AgYSBub24tYXRvbWljIHRlc3QgaXMgdXNlZCB0bworCSAqIGJ1c3l3YWl0IHdpdGggbGVzcyBidXMgY29udGVudGlvbiBmb3IgYSBnb29kIHRpbWUgdG8KKwkgKiBhdHRlbXB0IHRvIGFjcXVpcmUgdGhlIGxvY2sgYml0LgorCSAqLworCXByZWVtcHRfZGlzYWJsZSgpOworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfU1BJTkxPQ0spCisJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoYml0bnVtLCBhZGRyKSkgeworCQl3aGlsZSAodGVzdF9iaXQoYml0bnVtLCBhZGRyKSkgeworCQkJcHJlZW1wdF9lbmFibGUoKTsKKwkJCWNwdV9yZWxheCgpOworCQkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCX0KKwl9CisjZW5kaWYKKwlfX2FjcXVpcmUoYml0bG9jayk7Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiBpdCB3YXMgYWNxdWlyZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgYml0X3NwaW5fdHJ5bG9jayhpbnQgYml0bnVtLCB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXByZWVtcHRfZGlzYWJsZSgpOworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfU1BJTkxPQ0spCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoYml0bnVtLCBhZGRyKSkgeworCQlwcmVlbXB0X2VuYWJsZSgpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwlfX2FjcXVpcmUoYml0bG9jayk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiAgYml0LWJhc2VkIHNwaW5fdW5sb2NrKCkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJpdF9zcGluX3VubG9jayhpbnQgYml0bnVtLCB1bnNpZ25lZCBsb25nICphZGRyKQoreworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfU1BJTkxPQ0spCisJQlVHX09OKCF0ZXN0X2JpdChiaXRudW0sIGFkZHIpKTsKKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwljbGVhcl9iaXQoYml0bnVtLCBhZGRyKTsKKyNlbmRpZgorCXByZWVtcHRfZW5hYmxlKCk7CisJX19yZWxlYXNlKGJpdGxvY2spOworfQorCisvKgorICogUmV0dXJuIHRydWUgaWYgdGhlIGxvY2sgaXMgaGVsZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYml0X3NwaW5faXNfbG9ja2VkKGludCBiaXRudW0sIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisjaWYgZGVmaW5lZChDT05GSUdfU01QKSB8fCBkZWZpbmVkKENPTkZJR19ERUJVR19TUElOTE9DSykKKwlyZXR1cm4gdGVzdF9iaXQoYml0bnVtLCBhZGRyKTsKKyNlbGlmIGRlZmluZWQgQ09ORklHX1BSRUVNUFQKKwlyZXR1cm4gcHJlZW1wdF9jb3VudCgpOworI2Vsc2UKKwlyZXR1cm4gMTsKKyNlbmRpZgorfQorCisjZW5kaWYgLyogX19MSU5VWF9CSVRfU1BJTkxPQ0tfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCAxOWJkOGU3Li5lZmRjOWI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTU2MywxMCArNTYzLDEyIEBACiBleHRlcm4gdm9pZCBfX2Jsa19zdG9wX3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSk7CiBleHRlcm4gdm9pZCBibGtfcnVuX3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqKTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9hY3Rpdml0eV9mbihyZXF1ZXN0X3F1ZXVlX3QgKiwgYWN0aXZpdHlfZm4gKiwgdm9pZCAqKTsKLWV4dGVybiBzdHJ1Y3QgcmVxdWVzdCAqYmxrX3JxX21hcF91c2VyKHJlcXVlc3RfcXVldWVfdCAqLCBpbnQsIHZvaWQgX191c2VyICosIHVuc2lnbmVkIGludCk7Ci1leHRlcm4gaW50IGJsa19ycV91bm1hcF91c2VyKHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBiaW8gKiwgdW5zaWduZWQgaW50KTsKLWV4dGVybiBpbnQgYmxrX2V4ZWN1dGVfcnEocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCBnZW5kaXNrICosIHN0cnVjdCByZXF1ZXN0ICopOwotCitleHRlcm4gaW50IGJsa19ycV9tYXBfdXNlcihyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgdm9pZCBfX3VzZXIgKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBpbnQgYmxrX3JxX3VubWFwX3VzZXIoc3RydWN0IGJpbyAqLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCBibGtfcnFfbWFwX2tlcm4ocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHZvaWQgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCBibGtfcnFfbWFwX3VzZXJfaW92KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBzdHJ1Y3Qgc2dfaW92ZWMgKiwgaW50KTsKK2V4dGVybiBpbnQgYmxrX2V4ZWN1dGVfcnEocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCBnZW5kaXNrICosCisJCQkgIHN0cnVjdCByZXF1ZXN0ICosIGludCk7CiBzdGF0aWMgaW5saW5lIHJlcXVlc3RfcXVldWVfdCAqYmRldl9nZXRfcXVldWUoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKIHsKIAlyZXR1cm4gYmRldi0+YmRfZGlzay0+cXVldWU7CkBAIC03MjYsNyArNzI4LDcgQEAKIAlyZXR1cm4gYml0czsKIH0KIAotZXh0ZXJuIGlubGluZSB1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQogewogCXJldHVybiBiZGV2LT5iZF9ibG9ja19zaXplOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmggYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAppbmRleCA4ZDEzOWY0Li42YjQ2MTg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaApAQCAtMjMzLDYgKzIzMyw3IEBACiAvKiBBbGxvdyBlbmFibGluZy9kaXNhYmxpbmcgdGFnZ2VkIHF1ZXVpbmcgb24gU0NTSSBjb250cm9sbGVycyBhbmQgc2VuZGluZwogICAgYXJiaXRyYXJ5IFNDU0kgY29tbWFuZHMgKi8KIC8qIEFsbG93IHNldHRpbmcgZW5jcnlwdGlvbiBrZXkgb24gbG9vcGJhY2sgZmlsZXN5c3RlbSAqLworLyogQWxsb3cgc2V0dGluZyB6b25lIHJlY2xhaW0gcG9saWN5ICovCiAKICNkZWZpbmUgQ0FQX1NZU19BRE1JTiAgICAgICAgMjEKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jaGlvLmggYi9pbmNsdWRlL2xpbnV4L2NoaW8uaAppbmRleCA2MzAzNWFlLi5hNDA0YzExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NoaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2NoaW8uaApAQCAtOTYsNyArOTYsNyBAQAogICovCiBzdHJ1Y3QgY2hhbmdlcl9lbGVtZW50X3N0YXR1cyB7CiAJaW50ICAgICAgICAgICAgIGNlc190eXBlOwotCXVuc2lnbmVkIGNoYXIgICAqY2VzX2RhdGE7CisJdW5zaWduZWQgY2hhciAgIF9fdXNlciAqY2VzX2RhdGE7CiB9OwogI2RlZmluZSBDRVNUQVRVU19GVUxMICAgICAweDAxIC8qIGZ1bGwgKi8KICNkZWZpbmUgQ0VTVEFUVVNfSU1QRVhQICAgMHgwMgkvKiBtZWRpYSB3YXMgaW1wb3J0ZWQgKGluc2VydGVkIGJ5IHN5c29wKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYXQuaCBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKaW5kZXggYjU4YjdkNi4uZjljYTUzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCkBAIC0xOCw2ICsxOCw5IEBACiAjZGVmaW5lIGNvbXBhdF9qaWZmaWVzX3RvX2Nsb2NrX3QoeCkJXAogCQkoKCh1bnNpZ25lZCBsb25nKSh4KSAqIENPTVBBVF9VU0VSX0haKSAvIEhaKQogCit0eXBlZGVmIF9fY29tcGF0X3VpZDMyX3QJY29tcGF0X3VpZF90OwordHlwZWRlZiBfX2NvbXBhdF9naWQzMl90CWNvbXBhdF9naWRfdDsKKwogc3RydWN0IHJ1c2FnZTsKIAogc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIHsgCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdS5oIGIvaW5jbHVkZS9saW51eC9jcHUuaAppbmRleCBlODkwNGMwLi44Njk4MGM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1LmgKQEAgLTgsNyArOCw3IEBACiAgKiBCYXNpYyBoYW5kbGluZyBvZiB0aGUgZGV2aWNlcyBpcyBkb25lIGluIGRyaXZlcnMvYmFzZS9jcHUuYwogICogYW5kIHN5c3RlbSBkZXZpY2VzIGFyZSBoYW5kbGVkIGluIGRyaXZlcnMvYmFzZS9zeXMuYy4gCiAgKgotICogQ1BVcyBhcmUgZXhwb3J0ZWQgdmlhIGRyaXZlcmZzIGluIHRoZSBjbGFzcy9jcHUvZGV2aWNlcy8KKyAqIENQVXMgYXJlIGV4cG9ydGVkIHZpYSBzeXNmcyBpbiB0aGUgY2xhc3MvY3B1L2RldmljZXMvCiAgKiBkaXJlY3RvcnkuIAogICoKICAqIFBlci1jcHUgaW50ZXJmYWNlcyBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcgYSBzdHJ1Y3QgZGV2aWNlX2ludGVyZmFjZS4gCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdXNldC5oIGIvaW5jbHVkZS9saW51eC9jcHVzZXQuaAppbmRleCAzNDM4MjMzLi4yNDA2MmExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKQEAgLTIzLDcgKzIzLDggQEAKIHZvaWQgY3B1c2V0X3VwZGF0ZV9jdXJyZW50X21lbXNfYWxsb3dlZCh2b2lkKTsKIHZvaWQgY3B1c2V0X3Jlc3RyaWN0X3RvX21lbXNfYWxsb3dlZCh1bnNpZ25lZCBsb25nICpub2Rlcyk7CiBpbnQgY3B1c2V0X3pvbmVsaXN0X3ZhbGlkX21lbXNfYWxsb3dlZChzdHJ1Y3Qgem9uZWxpc3QgKnpsKTsKLWludCBjcHVzZXRfem9uZV9hbGxvd2VkKHN0cnVjdCB6b25lICp6KTsKK2V4dGVybiBpbnQgY3B1c2V0X3pvbmVfYWxsb3dlZChzdHJ1Y3Qgem9uZSAqeiwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKTsKK2V4dGVybiBpbnQgY3B1c2V0X2V4Y2xfbm9kZXNfb3ZlcmxhcChjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jcHVzZXRfb3BlcmF0aW9uczsKIGV4dGVybiBjaGFyICpjcHVzZXRfdGFza19zdGF0dXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcik7CiAKQEAgLTQ4LDcgKzQ5LDEzIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNwdXNldF96b25lX2FsbG93ZWQoc3RydWN0IHpvbmUgKnopCitzdGF0aWMgaW5saW5lIGludCBjcHVzZXRfem9uZV9hbGxvd2VkKHN0cnVjdCB6b25lICp6LAorCQkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwdXNldF9leGNsX25vZGVzX292ZXJsYXAoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcmMxNi5oIGIvaW5jbHVkZS9saW51eC9jcmMxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWRmODIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2NyYzE2LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqCWNyYzE2LmggLSBDUkMtMTYgcm91dGluZQorICoKKyAqIEltcGxlbWVudHMgdGhlIHN0YW5kYXJkIENSQy0xNiwgYXMgdXNlZCB3aXRoIDEtd2lyZSBkZXZpY2VzOgorICogICBXaWR0aCAxNgorICogICBQb2x5ICAweDgwMDUgKHheMTYgKyB4XjE1ICsgeF4yICsgMSkKKyAqICAgSW5pdCAgMAorICoKKyAqIEZvciAxLXdpcmUgZGV2aWNlcywgdGhlIENSQyBpcyBzdG9yZWQgaW52ZXJ0ZWQsIExTQi1maXJzdAorICoKKyAqIEV4YW1wbGUgYnVmZmVyIHdpdGggdGhlIENSQyBhdHRhY2hlZDoKKyAqICAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgMzggMzkgQzIgNDQKKyAqCisgKiBUaGUgQ1JDIG92ZXIgYSBidWZmZXIgd2l0aCB0aGUgQ1JDIGF0dGFjaGVkIGlzIDB4QjAwMS4KKyAqIFNvLCBpZiAoY3JjMTYoMCwgYnVmLCBzaXplKSA9PSAweEIwMDEpIHRoZW4gdGhlIGJ1ZmZlciBpcyB2YWxpZC4KKyAqCisgKiBSZWZlciB0byAiQXBwbGljYXRpb24gTm90ZSA5Mzc6IEJvb2sgb2YgaUJ1dHRvbiBTdGFuZGFyZHMiIGZvciBkZXRhaWxzLgorICogaHR0cDovL3d3dy5tYXhpbS1pYy5jb20vYXBwbm90ZXMuY2ZtL2FwcG5vdGVfbnVtYmVyLzkzNworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBCZW4gR2FyZG5lciA8YmdhcmRuZXJAd2FidGVjLmNvbT4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQ1JDMTZfSAorI2RlZmluZSBfX0NSQzE2X0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgQ1JDMTZfSU5JVAkJMAorI2RlZmluZSBDUkMxNl9WQUxJRAkJMHhiMDAxCisKK2V4dGVybiB1MTYgY29uc3QgY3JjMTZfdGFibGVbMjU2XTsKKworZXh0ZXJuIHUxNiBjcmMxNih1MTYgY3JjLCBjb25zdCB1OCAqYnVmZmVyLCBzaXplX3QgbGVuKTsKKworc3RhdGljIGlubGluZSB1MTYgY3JjMTZfYnl0ZSh1MTYgY3JjLCBjb25zdCB1OCBkYXRhKQoreworCXJldHVybiAoY3JjID4+IDgpIF4gY3JjMTZfdGFibGVbKGNyYyBeIGRhdGEpICYgMHhmZl07Cit9CisKKyNlbmRpZiAvKiBfX0NSQzE2X0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcnlwdG8uaCBiL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKaW5kZXggNWUyYmNjNi4uM2M4OWRmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcnlwdG8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCkBAIC00NSw2ICs0NSw3IEBACiAjZGVmaW5lIENSWVBUT19URk1fTU9ERV9DVFIJCTB4MDAwMDAwMDgKIAogI2RlZmluZSBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWQkJMHgwMDAwMDEwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVAJMHgwMDAwMDIwMAogI2RlZmluZSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWQkJMHgwMDEwMDAwMAogI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTiAgIAkweDAwMjAwMDAwCiAjZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9LRVlfU0NIRUQgCTB4MDA0MDAwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGNhY2hlLmggYi9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCmluZGV4IDUwYmUyOTAuLmFiMDRiNGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaApAQCAtODgsOCArODgsOSBAQAogCQkJCQkgKiBuZWdhdGl2ZSAqLwogCS8qCiAJICogVGhlIG5leHQgdGhyZWUgZmllbGRzIGFyZSB0b3VjaGVkIGJ5IF9fZF9sb29rdXAuICBQbGFjZSB0aGVtIGhlcmUKLQkgKiBzbyB0aGV5IGFsbCBmaXQgaW4gYSAxNi1ieXRlIHJhbmdlLCB3aXRoIDE2LWJ5dGUgYWxpZ25tZW50LgorCSAqIHNvIHRoZXkgYWxsIGZpdCBpbiBhIGNhY2hlIGxpbmUuCiAJICovCisJc3RydWN0IGhsaXN0X25vZGUgZF9oYXNoOwkvKiBsb29rdXAgaGFzaCBsaXN0ICovCiAJc3RydWN0IGRlbnRyeSAqZF9wYXJlbnQ7CS8qIHBhcmVudCBkaXJlY3RvcnkgKi8KIAlzdHJ1Y3QgcXN0ciBkX25hbWU7CiAKQEAgLTEwMyw3ICsxMDQsNiBAQAogCXZvaWQgKmRfZnNkYXRhOwkJCS8qIGZzLXNwZWNpZmljIGRhdGEgKi8KICAJc3RydWN0IHJjdV9oZWFkIGRfcmN1OwogCXN0cnVjdCBkY29va2llX3N0cnVjdCAqZF9jb29raWU7IC8qIGNvb2tpZSwgaWYgYW55ICovCi0Jc3RydWN0IGhsaXN0X25vZGUgZF9oYXNoOwkvKiBsb29rdXAgaGFzaCBsaXN0ICovCQogCWludCBkX21vdW50ZWQ7CiAJdW5zaWduZWQgY2hhciBkX2luYW1lW0ROQU1FX0lOTElORV9MRU5fTUlOXTsJLyogc21hbGwgbmFtZXMgKi8KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjY3AuaCBiL2luY2x1ZGUvbGludXgvZGNjcC5oCmluZGV4IDAwN2MyOTAuLjhiZjRiYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGNjcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNjcC5oCkBAIC00MzIsNyArNDMyLDEwIEBACiAJc3RydWN0IGNjaWQJCQkqZGNjcHNfaGNfcnhfY2NpZDsKIAlzdHJ1Y3QgY2NpZAkJCSpkY2Nwc19oY190eF9jY2lkOwogCXN0cnVjdCBkY2NwX29wdGlvbnNfcmVjZWl2ZWQJZGNjcHNfb3B0aW9uc19yZWNlaXZlZDsKKwlzdHJ1Y3QgdGltZXZhbAkJCWRjY3BzX2Vwb2NoOwogCWVudW0gZGNjcF9yb2xlCQkJZGNjcHNfcm9sZToyOworCV9fdTgJCQkJZGNjcHNfaGNfcnhfaW5zZXJ0X29wdGlvbnM6MTsKKwlfX3U4CQkJCWRjY3BzX2hjX3R4X2luc2VydF9vcHRpb25zOjE7CiB9OwogIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGNjcF9zb2NrICpkY2NwX3NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hcG9vbC5oIGIvaW5jbHVkZS9saW51eC9kbWFwb29sLmgKaW5kZXggZTYwYmZkYS4uNDkzMmVlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWFwb29sLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWFwb29sLmgKQEAgLTE5LDcgKzE5LDggQEAKIAogdm9pZCBkbWFfcG9vbF9kZXN0cm95KHN0cnVjdCBkbWFfcG9vbCAqcG9vbCk7CiAKLXZvaWQgKmRtYV9wb29sX2FsbG9jKHN0cnVjdCBkbWFfcG9vbCAqcG9vbCwgaW50IG1lbV9mbGFncywgZG1hX2FkZHJfdCAqaGFuZGxlKTsKK3ZvaWQgKmRtYV9wb29sX2FsbG9jKHN0cnVjdCBkbWFfcG9vbCAqcG9vbCwgdW5zaWduZWQgaW50IF9fbm9jYXN0IG1lbV9mbGFncywKKwkJICAgICBkbWFfYWRkcl90ICpoYW5kbGUpOwogCiB2b2lkIGRtYV9wb29sX2ZyZWUoc3RydWN0IGRtYV9wb29sICpwb29sLCB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBhZGRyKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWkuaCBiL2luY2x1ZGUvbGludXgvZG1pLmgKaW5kZXggNWU5M2U2ZC4uYzMwMTc1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtaS5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfX0RNSV9IX18KICNkZWZpbmUgX19ETUlfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKIGVudW0gZG1pX2ZpZWxkIHsKIAlETUlfTk9ORSwKIAlETUlfQklPU19WRU5ET1IsCkBAIC0xNiw2ICsxOCwyNCBAQAogCURNSV9TVFJJTkdfTUFYLAogfTsKIAorZW51bSBkbWlfZGV2aWNlX3R5cGUgeworCURNSV9ERVZfVFlQRV9BTlkgPSAwLAorCURNSV9ERVZfVFlQRV9PVEhFUiwKKwlETUlfREVWX1RZUEVfVU5LTk9XTiwKKwlETUlfREVWX1RZUEVfVklERU8sCisJRE1JX0RFVl9UWVBFX1NDU0ksCisJRE1JX0RFVl9UWVBFX0VUSEVSTkVULAorCURNSV9ERVZfVFlQRV9UT0tFTlJJTkcsCisJRE1JX0RFVl9UWVBFX1NPVU5ELAorCURNSV9ERVZfVFlQRV9JUE1JID0gLTEKK307CisKK3N0cnVjdCBkbWlfaGVhZGVyIHsKKwl1OCB0eXBlOworCXU4IGxlbmd0aDsKKwl1MTYgaGFuZGxlOworfTsKKwogLyoKICAqCURNSSBjYWxsYmFja3MgZm9yIHByb2JsZW0gYm9hcmRzCiAgKi8KQEAgLTI2LDIyICs0NiwzMiBAQAogCiBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCB7CiAJaW50ICgqY2FsbGJhY2spKHN0cnVjdCBkbWlfc3lzdGVtX2lkICopOwotCWNoYXIgKmlkZW50OworCWNvbnN0IGNoYXIgKmlkZW50OwogCXN0cnVjdCBkbWlfc3RybWF0Y2ggbWF0Y2hlc1s0XTsKIAl2b2lkICpkcml2ZXJfZGF0YTsKIH07CiAKLSNkZWZpbmUgRE1JX01BVENIKGEsYikJeyBhLCBiIH0KKyNkZWZpbmUgRE1JX01BVENIKGEsIGIpCXsgYSwgYiB9CisKK3N0cnVjdCBkbWlfZGV2aWNlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50IHR5cGU7CisJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkICpkZXZpY2VfZGF0YTsJLyogVHlwZSBzcGVjaWZpYyBkYXRhICovCit9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2KSAmJiAhZGVmaW5lZChDT05GSUdfWDg2XzY0KQogCiBleHRlcm4gaW50IGRtaV9jaGVja19zeXN0ZW0oc3RydWN0IGRtaV9zeXN0ZW1faWQgKmxpc3QpOwogZXh0ZXJuIGNoYXIgKiBkbWlfZ2V0X3N5c3RlbV9pbmZvKGludCBmaWVsZCk7Ci0KK2V4dGVybiBzdHJ1Y3QgZG1pX2RldmljZSAqIGRtaV9maW5kX2RldmljZShpbnQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKKwlzdHJ1Y3QgZG1pX2RldmljZSAqZnJvbSk7CiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIGludCBkbWlfY2hlY2tfc3lzdGVtKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpsaXN0KSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGNoYXIgKiBkbWlfZ2V0X3N5c3RlbV9pbmZvKGludCBmaWVsZCkgeyByZXR1cm4gTlVMTDsgfQorc3RhdGljIHN0cnVjdCBkbWlfZGV2aWNlICogZG1pX2ZpbmRfZGV2aWNlKGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorCXN0cnVjdCBkbWlfZGV2aWNlICpmcm9tKSB7IHJldHVybiBOVUxMOyB9CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VmaS5oIGIvaW5jbHVkZS9saW51eC9lZmkuaAppbmRleCA3Mzc4MWVjLi5jN2M1ZGQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VmaS5oCisrKyBiL2luY2x1ZGUvbGludXgvZWZpLmgKQEAgLTkxLDExICs5MSw2IEBACiAKICNkZWZpbmUgRUZJX1BBR0VfU0hJRlQJCTEyCiAKLS8qCi0gKiBGb3IgY3VycmVudCB4ODYgaW1wbGVtZW50YXRpb25zIG9mIEVGSSwgdGhlcmUgaXMKLSAqIGFkZGl0aW9uYWwgcGFkZGluZyBpbiB0aGUgbWVtIGRlc2NyaXB0b3JzLiAgVGhpcyBpcyBub3QKLSAqIHRoZSBjYXNlIGluIGlhNjQuICBOZWVkIHRvIGhhdmUgdGhpcyBmaXhlZCBpbiB0aGUgZi93LgotICovCiB0eXBlZGVmIHN0cnVjdCB7CiAJdTMyIHR5cGU7CiAJdTMyIHBhZDsKQEAgLTEwMyw5ICs5OCw2IEBACiAJdTY0IHZpcnRfYWRkcjsKIAl1NjQgbnVtX3BhZ2VzOwogCXU2NCBhdHRyaWJ1dGU7Ci0jaWYgZGVmaW5lZCAoX19pMzg2X18pCi0JdTY0IHBhZDE7Ci0jZW5kaWYKIH0gZWZpX21lbW9yeV9kZXNjX3Q7CiAKIHR5cGVkZWYgaW50ICgqZWZpX2ZyZWVtZW1fY2FsbGJhY2tfdCkgKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCB2b2lkICphcmcpOwpAQCAtMjQwLDEwICsyMzIsMTIgQEAKIH0gZWZpX3N5c3RlbV90YWJsZV90OwogCiBzdHJ1Y3QgZWZpX21lbW9yeV9tYXAgewotCWVmaV9tZW1vcnlfZGVzY190ICpwaHlzX21hcDsKLQllZmlfbWVtb3J5X2Rlc2NfdCAqbWFwOworCXZvaWQgKnBoeXNfbWFwOworCXZvaWQgKm1hcDsKKwl2b2lkICptYXBfZW5kOwogCWludCBucl9tYXA7CiAJdW5zaWduZWQgbG9uZyBkZXNjX3ZlcnNpb247CisJdW5zaWduZWQgbG9uZyBkZXNjX3NpemU7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lbGYuaCBiL2luY2x1ZGUvbGludXgvZWxmLmgKaW5kZXggZjViM2JhNS4uZmY5NTVkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lbGYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VsZi5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfTElOVVhfRUxGX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYXV4dmVjLmg+CiAjaW5jbHVkZSA8YXNtL2VsZi5oPgogCiAjaWZuZGVmIGVsZl9yZWFkX2ltcGxpZXNfZXhlYwpAQCAtMTU4LDI5ICsxNTksNiBAQAogI2RlZmluZSBFTEY2NF9TVF9CSU5EKHgpCUVMRl9TVF9CSU5EKHgpCiAjZGVmaW5lIEVMRjY0X1NUX1RZUEUoeCkJRUxGX1NUX1RZUEUoeCkKIAotLyogU3ltYm9saWMgdmFsdWVzIGZvciB0aGUgZW50cmllcyBpbiB0aGUgYXV4aWxpYXJ5IHRhYmxlCi0gICBwdXQgb24gdGhlIGluaXRpYWwgc3RhY2sgKi8KLSNkZWZpbmUgQVRfTlVMTCAgIDAJLyogZW5kIG9mIHZlY3RvciAqLwotI2RlZmluZSBBVF9JR05PUkUgMQkvKiBlbnRyeSBzaG91bGQgYmUgaWdub3JlZCAqLwotI2RlZmluZSBBVF9FWEVDRkQgMgkvKiBmaWxlIGRlc2NyaXB0b3Igb2YgcHJvZ3JhbSAqLwotI2RlZmluZSBBVF9QSERSICAgMwkvKiBwcm9ncmFtIGhlYWRlcnMgZm9yIHByb2dyYW0gKi8KLSNkZWZpbmUgQVRfUEhFTlQgIDQJLyogc2l6ZSBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAqLwotI2RlZmluZSBBVF9QSE5VTSAgNQkvKiBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzICovCi0jZGVmaW5lIEFUX1BBR0VTWiA2CS8qIHN5c3RlbSBwYWdlIHNpemUgKi8KLSNkZWZpbmUgQVRfQkFTRSAgIDcJLyogYmFzZSBhZGRyZXNzIG9mIGludGVycHJldGVyICovCi0jZGVmaW5lIEFUX0ZMQUdTICA4CS8qIGZsYWdzICovCi0jZGVmaW5lIEFUX0VOVFJZICA5CS8qIGVudHJ5IHBvaW50IG9mIHByb2dyYW0gKi8KLSNkZWZpbmUgQVRfTk9URUxGIDEwCS8qIHByb2dyYW0gaXMgbm90IEVMRiAqLwotI2RlZmluZSBBVF9VSUQgICAgMTEJLyogcmVhbCB1aWQgKi8KLSNkZWZpbmUgQVRfRVVJRCAgIDEyCS8qIGVmZmVjdGl2ZSB1aWQgKi8KLSNkZWZpbmUgQVRfR0lEICAgIDEzCS8qIHJlYWwgZ2lkICovCi0jZGVmaW5lIEFUX0VHSUQgICAxNAkvKiBlZmZlY3RpdmUgZ2lkICovCi0jZGVmaW5lIEFUX1BMQVRGT1JNIDE1ICAvKiBzdHJpbmcgaWRlbnRpZnlpbmcgQ1BVIGZvciBvcHRpbWl6YXRpb25zICovCi0jZGVmaW5lIEFUX0hXQ0FQICAxNiAgICAvKiBhcmNoIGRlcGVuZGVudCBoaW50cyBhdCBDUFUgY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIEFUX0NMS1RDSyAxNwkvKiBmcmVxdWVuY3kgYXQgd2hpY2ggdGltZXMoKSBpbmNyZW1lbnRzICovCi0KLSNkZWZpbmUgQVRfU0VDVVJFIDIzICAgLyogc2VjdXJlIG1vZGUgYm9vbGVhbiAqLwotCiB0eXBlZGVmIHN0cnVjdCBkeW5hbWljewogICBFbGYzMl9Td29yZCBkX3RhZzsKICAgdW5pb257CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgKaW5kZXggY2U4NTE4ZS4uNDUyMmM3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaApAQCAtNjksNiArNjksMTIgQEAKIAlyZXR1cm4gKChhZGRyWzBdICE9IDB4ZmYpICYmICgweDAxICYgYWRkclswXSkpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihjb25zdCB1OCAqYWRkcikKK3sKKyAgICAgICAgcmV0dXJuICgoYWRkclswXSA9PSAweGZmKSAmJiAoYWRkclsxXSA9PSAweGZmKSAmJiAoYWRkclsyXSA9PSAweGZmKSAmJiAgCisJCShhZGRyWzNdID09IDB4ZmYpICYmIChhZGRyWzRdID09IDB4ZmYpICYmIChhZGRyWzVdID09IDB4ZmYpKTsKK30KKwogLyoqCiAgKiBpc192YWxpZF9ldGhlcl9hZGRyIC0gRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBFdGhlcm5ldCBhZGRyZXNzIGlzIHZhbGlkCiAgKiBAYWRkcjogUG9pbnRlciB0byBhIHNpeC1ieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIEV0aGVybmV0IGFkZHJlc3MKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oIGIvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKaW5kZXggYTY1NzEzMGIuLmY3YmQxYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCkBAIC0zMTMsNiArMzEzLDkgQEAKICNkZWZpbmUgRVhUMl9NT1VOVF9YQVRUUl9VU0VSCQkweDAwNDAwMCAgLyogRXh0ZW5kZWQgdXNlciBhdHRyaWJ1dGVzICovCiAjZGVmaW5lIEVYVDJfTU9VTlRfUE9TSVhfQUNMCQkweDAwODAwMCAgLyogUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMgKi8KICNkZWZpbmUgRVhUMl9NT1VOVF9YSVAJCQkweDAxMDAwMCAgLyogRXhlY3V0ZSBpbiBwbGFjZSAqLworI2RlZmluZSBFWFQyX01PVU5UX1VTUlFVT1RBCQkweDAyMDAwMCAvKiB1c2VyIHF1b3RhICovCisjZGVmaW5lIEVYVDJfTU9VTlRfR1JQUVVPVEEJCTB4MDQwMDAwIC8qIGdyb3VwIHF1b3RhICovCisKIAogI2RlZmluZSBjbGVhcl9vcHQobywgb3B0KQkJbyAmPSB+RVhUMl9NT1VOVF8jI29wdAogI2RlZmluZSBzZXRfb3B0KG8sIG9wdCkJCQlvIHw9IEVYVDJfTU9VTlRfIyNvcHQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mcy5oIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKaW5kZXggYzE2NjYyOC4uYzAyNzJkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKQEAgLTM3Myw2ICszNzMsOCBAQAogI2RlZmluZSBFWFQzX01PVU5UX0JBUlJJRVIJCTB4MjAwMDAgLyogVXNlIGJsb2NrIGJhcnJpZXJzICovCiAjZGVmaW5lIEVYVDNfTU9VTlRfTk9CSAkJCTB4NDAwMDAgLyogTm8gYnVmZmVyaGVhZHMgKi8KICNkZWZpbmUgRVhUM19NT1VOVF9RVU9UQQkJMHg4MDAwMCAvKiBTb21lIHF1b3RhIG9wdGlvbiBzZXQgKi8KKyNkZWZpbmUgRVhUM19NT1VOVF9VU1JRVU9UQQkJMHgxMDAwMDAgLyogIm9sZCIgdXNlciBxdW90YSAqLworI2RlZmluZSBFWFQzX01PVU5UX0dSUFFVT1RBCQkweDIwMDAwMCAvKiAib2xkIiBncm91cCBxdW90YSAqLwogCiAvKiBDb21wYXRpYmlsaXR5LCBmb3IgaGF2aW5nIGJvdGggZXh0Ml9mcy5oIGFuZCBleHQzX2ZzLmggaW5jbHVkZWQgYXQgb25jZSAqLwogI2lmbmRlZiBfTElOVVhfRVhUMl9GU19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZiLmggYi9pbmNsdWRlL2xpbnV4L2ZiLmgKaW5kZXggYmMyNGJlZS4uODJlMzljZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZmIuaApAQCAtMTA3LDYgKzEwNyw4IEBACiAjZGVmaW5lIEZCX0FDQ0VMX05WXzIwICAgICAgICAgIDQ0ICAgICAgLyogblZpZGlhIEFyY2ggMjAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBGQl9BQ0NFTF9OVl8zMCAgICAgICAgICA0NSAgICAgIC8qIG5WaWRpYSBBcmNoIDMwICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRkJfQUNDRUxfTlZfNDAgICAgICAgICAgNDYgICAgICAvKiBuVmlkaWEgQXJjaCA0MCAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1hHSV9WT0xBUklfVgk0NwkvKiBYR0kgVm9sYXJpIFYzWFQsIFY1LCBWOCAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1hHSV9WT0xBUklfWgk0OAkvKiBYR0kgVm9sYXJpIFo3ICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA3MCA5MAkvKiBOZW9NYWdpYyBOTTIwNzAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA5MCA5MQkvKiBOZW9NYWdpYyBOTTIwOTAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA5MyA5MgkvKiBOZW9NYWdpYyBOTTIwOTMgICAgICAgICAgICAgICovCkBAIC00OTUsNiArNDk3LDkgQEAKICNkZWZpbmUgRkJfRVZFTlRfQkxBTksgICAgICAgICAgICAgICAgICAweDA4CiAvKiAgICAgIFByaXZhdGUgbW9kZWxpc3QgaXMgdG8gYmUgcmVwbGFjZWQgKi8KICNkZWZpbmUgRkJfRVZFTlRfTkVXX01PREVMSVNUICAgICAgICAgICAweDA5CisvKglUaGUgcmVzb2x1dGlvbiBvZiB0aGUgcGFzc2VkIGluIGZiX2luZm8gYWJvdXQgdG8gY2hhbmdlIGFuZAorICAgICAgICBhbGwgdmMncyBzaG91bGQgYmUgY2hhbmdlZCAgICAgICAgICovCisjZGVmaW5lIEZCX0VWRU5UX01PREVfQ0hBTkdFX0FMTAkweDBBCiAKIHN0cnVjdCBmYl9ldmVudCB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CkBAIC04MjAsMTMgKzgyNSwyOSBAQAogCQkJCXUzMiBoZWlnaHQsIHUzMiBzaGlmdF9oaWdoLCB1MzIgc2hpZnRfbG93LCB1MzIgbW9kKTsKIGV4dGVybiB2b2lkIGZiX3BhZF9hbGlnbmVkX2J1ZmZlcih1OCAqZHN0LCB1MzIgZF9waXRjaCwgdTggKnNyYywgdTMyIHNfcGl0Y2gsIHUzMiBoZWlnaHQpOwogZXh0ZXJuIHZvaWQgZmJfc2V0X3N1c3BlbmQoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCBzdGF0ZSk7Ci1leHRlcm4gaW50IGZiX2dldF9jb2xvcl9kZXB0aChzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcik7CitleHRlcm4gaW50IGZiX2dldF9jb2xvcl9kZXB0aChzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSAgICAgIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4KTsKIGV4dGVybiBpbnQgZmJfZ2V0X29wdGlvbnMoY2hhciAqbmFtZSwgY2hhciAqKm9wdGlvbik7CiBleHRlcm4gaW50IGZiX25ld19tb2RlbGlzdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAKIGV4dGVybiBzdHJ1Y3QgZmJfaW5mbyAqcmVnaXN0ZXJlZF9mYltGQl9NQVhdOwogZXh0ZXJuIGludCBudW1fcmVnaXN0ZXJlZF9mYjsKIAorc3RhdGljIGlubGluZSB2b2lkIF9fZmJfcGFkX2FsaWduZWRfYnVmZmVyKHU4ICpkc3QsIHUzMiBkX3BpdGNoLAorCQkJCQkgICB1OCAqc3JjLCB1MzIgc19waXRjaCwgdTMyIGhlaWdodCkKK3sKKwlpbnQgaSwgajsKKworCWRfcGl0Y2ggLT0gc19waXRjaDsKKworCWZvciAoaSA9IGhlaWdodDsgaS0tOyApIHsKKwkJLyogc19waXRjaCBpcyBhIGZldyBieXRlcyBhdCB0aGUgbW9zdCwgbWVtY3B5IGlzIHN1Ym9wdGltYWwgKi8KKwkJZm9yIChqID0gMDsgaiA8IHNfcGl0Y2g7IGorKykKKwkJCSpkc3QrKyA9ICpzcmMrKzsKKwkJZHN0ICs9IGRfcGl0Y2g7CisJfQorfQorCiAvKiBkcml2ZXJzL3ZpZGVvL2Zic3lzZnMuYyAqLwogZXh0ZXJuIHN0cnVjdCBmYl9pbmZvICpmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplX3Qgc2l6ZSwgc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGZyYW1lYnVmZmVyX3JlbGVhc2Uoc3RydWN0IGZiX2luZm8gKmluZm8pOwpAQCAtODU2LDggKzg3NywxMSBAQAogZXh0ZXJuIGludCBmYl92YWxpZGF0ZV9tb2RlKGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogCQkJICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIGV4dGVybiBpbnQgZmJfcGFyc2VfZWRpZCh1bnNpZ25lZCBjaGFyICplZGlkLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcik7Ci1leHRlcm4gdm9pZCBmYl9lZGlkX3RvX21vbnNwZWNzKHVuc2lnbmVkIGNoYXIgKmVkaWQsIHN0cnVjdCBmYl9tb25zcGVjcyAqc3BlY3MpOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZiX2Zpcm13YXJlX2VkaWQoc3RydWN0IGRldmljZSAqZGV2aWNlKTsKK2V4dGVybiB2b2lkIGZiX2VkaWRfdG9fbW9uc3BlY3ModW5zaWduZWQgY2hhciAqZWRpZCwKKwkJCQlzdHJ1Y3QgZmJfbW9uc3BlY3MgKnNwZWNzKTsKIGV4dGVybiB2b2lkIGZiX2Rlc3Ryb3lfbW9kZWRiKHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGVkYik7CitleHRlcm4gaW50IGZiX2ZpbmRfbW9kZV9jdnQoc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZSwgaW50IG1hcmdpbnMsIGludCByYik7CiAKIC8qIGRyaXZlcnMvdmlkZW8vbW9kZWRiLmMgKi8KICNkZWZpbmUgVkVTQV9NT0RFREJfU0laRSAzNApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9maWxlLmggYi9pbmNsdWRlL2xpbnV4L2ZpbGUuaAppbmRleCA1MjA2YmViLi5mNWJiZDRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZpbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZpbGUuaApAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wb3NpeF90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogCiAvKgogICogVGhlIGRlZmF1bHQgZmQgYXJyYXkgbmVlZHMgdG8gYmUgYXQgbGVhc3QgQklUU19QRVJfTE9ORywKQEAgLTE2LDIzICsxNywzMyBAQAogICovCiAjZGVmaW5lIE5SX09QRU5fREVGQVVMVCBCSVRTX1BFUl9MT05HCiAKK3N0cnVjdCBmZHRhYmxlIHsKKwl1bnNpZ25lZCBpbnQgbWF4X2ZkczsKKwlpbnQgbWF4X2Zkc2V0OworCWludCBuZXh0X2ZkOworCXN0cnVjdCBmaWxlICoqIGZkOyAgICAgIC8qIGN1cnJlbnQgZmQgYXJyYXkgKi8KKwlmZF9zZXQgKmNsb3NlX29uX2V4ZWM7CisJZmRfc2V0ICpvcGVuX2ZkczsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZyZWVfZmlsZXM7CisJc3RydWN0IGZkdGFibGUgKm5leHQ7Cit9OworCiAvKgogICogT3BlbiBmaWxlIHRhYmxlIHN0cnVjdHVyZQogICovCiBzdHJ1Y3QgZmlsZXNfc3RydWN0IHsKICAgICAgICAgYXRvbWljX3QgY291bnQ7CiAgICAgICAgIHNwaW5sb2NrX3QgZmlsZV9sb2NrOyAgICAgLyogUHJvdGVjdHMgYWxsIHRoZSBiZWxvdyBtZW1iZXJzLiAgTmVzdHMgaW5zaWRlIHRzay0+YWxsb2NfbG9jayAqLwotICAgICAgICBpbnQgbWF4X2ZkczsKLSAgICAgICAgaW50IG1heF9mZHNldDsKLSAgICAgICAgaW50IG5leHRfZmQ7Ci0gICAgICAgIHN0cnVjdCBmaWxlICoqIGZkOyAgICAgIC8qIGN1cnJlbnQgZmQgYXJyYXkgKi8KLSAgICAgICAgZmRfc2V0ICpjbG9zZV9vbl9leGVjOwotICAgICAgICBmZF9zZXQgKm9wZW5fZmRzOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisJc3RydWN0IGZkdGFibGUgZmR0YWI7CiAgICAgICAgIGZkX3NldCBjbG9zZV9vbl9leGVjX2luaXQ7CiAgICAgICAgIGZkX3NldCBvcGVuX2Zkc19pbml0OwogICAgICAgICBzdHJ1Y3QgZmlsZSAqIGZkX2FycmF5W05SX09QRU5fREVGQVVMVF07CiB9OwogCisjZGVmaW5lIGZpbGVzX2ZkdGFibGUoZmlsZXMpIChyY3VfZGVyZWZlcmVuY2UoKGZpbGVzKS0+ZmR0KSkKKwogZXh0ZXJuIHZvaWQgRkFTVENBTEwoX19mcHV0KHN0cnVjdCBmaWxlICopKTsKIGV4dGVybiB2b2lkIEZBU1RDQUxMKGZwdXQoc3RydWN0IGZpbGUgKikpOwogCkBAIC01OSwxMyArNzAsMTYgQEAKIGV4dGVybiB2b2lkIGZyZWVfZmRzZXQoZmRfc2V0ICosIGludCk7CiAKIGV4dGVybiBpbnQgZXhwYW5kX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiwgaW50IG5yKTsKK2V4dGVybiB2b2lkIGZyZWVfZmR0YWJsZShzdHJ1Y3QgZmR0YWJsZSAqZmR0KTsKK2V4dGVybiB2b2lkIF9faW5pdCBmaWxlc19kZWZlcl9pbml0KHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmaWxlICogZmNoZWNrX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCB1bnNpZ25lZCBpbnQgZmQpCiB7CiAJc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CiAKLQlpZiAoZmQgPCBmaWxlcy0+bWF4X2ZkcykKLQkJZmlsZSA9IGZpbGVzLT5mZFtmZF07CisJaWYgKGZkIDwgZmR0LT5tYXhfZmRzKQorCQlmaWxlID0gcmN1X2RlcmVmZXJlbmNlKGZkdC0+ZmRbZmRdKTsKIAlyZXR1cm4gZmlsZTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9maXJtd2FyZS5oIGIvaW5jbHVkZS9saW51eC9maXJtd2FyZS5oCmluZGV4IDg4NjI1NWIuLjIwNjNjMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmlybXdhcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Zpcm13YXJlLmgKQEAgLTMsNiArMyw5IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNkZWZpbmUgRklSTVdBUkVfTkFNRV9NQVggMzAgCisjZGVmaW5lIEZXX0FDVElPTl9OT0hPVFBMVUcgMAorI2RlZmluZSBGV19BQ1RJT05fSE9UUExVRyAxCisKIHN0cnVjdCBmaXJtd2FyZSB7CiAJc2l6ZV90IHNpemU7CiAJdTggKmRhdGE7CkBAIC0xMSw3ICsxNCw3IEBACiBpbnQgcmVxdWVzdF9maXJtd2FyZShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwogaW50IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KAotCXN0cnVjdCBtb2R1bGUgKm1vZHVsZSwKKwlzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGludCBob3RwbHVnLAogCWNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgdm9pZCAqY29udGV4dCwKIAl2b2lkICgqY29udCkoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggNjdlNjczMi4uZTBiNzdjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXJlZi5oPgogCiAvKgogICogSXQncyBzaWxseSB0byBoYXZlIE5SX09QRU4gYmlnZ2VyIHRoYW4gTlJfRklMRSwgYnV0IHlvdSBjYW4gY2hhbmdlCkBAIC02OSw2ICs3MCw3IEBACiAjZGVmaW5lIFJFQUQgMAogI2RlZmluZSBXUklURSAxCiAjZGVmaW5lIFJFQURBIDIJCS8qIHJlYWQtYWhlYWQgIC0gZG9uJ3QgYmxvY2sgaWYgbm8gcmVzb3VyY2VzICovCisjZGVmaW5lIFNXUklURSAzCS8qIGZvciBsbF9yd19ibG9jaygpIC0gd2FpdCBmb3IgYnVmZmVyIGxvY2sgKi8KICNkZWZpbmUgU1BFQ0lBTCA0CS8qIEZvciBub24tYmxvY2tkZXZpY2UgcmVxdWVzdHMgaW4gcmVxdWVzdCBxdWV1ZSAqLwogI2RlZmluZSBSRUFEX1NZTkMJKFJFQUQgfCAoMSA8PCBCSU9fUldfU1lOQykpCiAjZGVmaW5lIFdSSVRFX1NZTkMJKFdSSVRFIHwgKDEgPDwgQklPX1JXX1NZTkMpKQpAQCAtMjgxLDE5ICsyODMsOSBAQAogCXN0cnVjdCB0aW1lc3BlYwlpYV9hdGltZTsKIAlzdHJ1Y3QgdGltZXNwZWMJaWFfbXRpbWU7CiAJc3RydWN0IHRpbWVzcGVjCWlhX2N0aW1lOwotCXVuc2lnbmVkIGludAlpYV9hdHRyX2ZsYWdzOwogfTsKIAogLyoKLSAqIFRoaXMgaXMgdGhlIGlub2RlIGF0dHJpYnV0ZXMgZmxhZyBkZWZpbml0aW9ucwotICovCi0jZGVmaW5lIEFUVFJfRkxBR19TWU5DUk9OT1VTCTEgCS8qIFN5bmNyb25vdXMgd3JpdGUgKi8KLSNkZWZpbmUgQVRUUl9GTEFHX05PQVRJTUUJMiAJLyogRG9uJ3QgdXBkYXRlIGF0aW1lICovCi0jZGVmaW5lIEFUVFJfRkxBR19BUFBFTkQJNCAJLyogQXBwZW5kLW9ubHkgZmlsZSAqLwotI2RlZmluZSBBVFRSX0ZMQUdfSU1NVVRBQkxFCTggCS8qIEltbXV0YWJsZSBmaWxlICovCi0jZGVmaW5lIEFUVFJfRkxBR19OT0RJUkFUSU1FCTE2IAkvKiBEb24ndCB1cGRhdGUgYXRpbWUgZm9yIGRpcmVjdG9yeSAqLwotCi0vKgogICogSW5jbHVkZXMgZm9yIGRpc2txdW90YXMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9xdW90YS5oPgpAQCAtNTk0LDcgKzU4Niw2IEBACiAJdW5zaWduZWQgaW50CQlmX3VpZCwgZl9naWQ7CiAJc3RydWN0IGZpbGVfcmFfc3RhdGUJZl9yYTsKIAotCXNpemVfdAkJCWZfbWF4Y291bnQ7CiAJdW5zaWduZWQgbG9uZwkJZl92ZXJzaW9uOwogCXZvaWQJCQkqZl9zZWN1cml0eTsKIApAQCAtNjA3LDEyICs1OTgsMTMgQEAKIAlzcGlubG9ja190CQlmX2VwX2xvY2s7CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19FUE9MTCAqLwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSpmX21hcHBpbmc7CisJc3RydWN0IHJjdV9oZWFkIAlmX3JjdWhlYWQ7CiB9OwogZXh0ZXJuIHNwaW5sb2NrX3QgZmlsZXNfbG9jazsKICNkZWZpbmUgZmlsZV9saXN0X2xvY2soKSBzcGluX2xvY2soJmZpbGVzX2xvY2spOwogI2RlZmluZSBmaWxlX2xpc3RfdW5sb2NrKCkgc3Bpbl91bmxvY2soJmZpbGVzX2xvY2spOwogCi0jZGVmaW5lIGdldF9maWxlKHgpCWF0b21pY19pbmMoJih4KS0+Zl9jb3VudCkKKyNkZWZpbmUgZ2V0X2ZpbGUoeCkJcmN1cmVmX2luYygmKHgpLT5mX2NvdW50KQogI2RlZmluZSBmaWxlX2NvdW50KHgpCWF0b21pY19yZWFkKCYoeCktPmZfY291bnQpCiAKICNkZWZpbmUJTUFYX05PTl9MRlMJKCgxVUw8PDMxKSAtIDEpCkBAIC0xMjkxLDYgKzEyODMsNyBAQAogLyogZnMvb3Blbi5jICovCiAKIGV4dGVybiBpbnQgZG9fdHJ1bmNhdGUoc3RydWN0IGRlbnRyeSAqLCBsb2ZmX3Qgc3RhcnQpOworZXh0ZXJuIGxvbmcgZG9fc3lzX29wZW4oY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZmlscF9vcGVuKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOwogZXh0ZXJuIHN0cnVjdCBmaWxlICogZGVudHJ5X29wZW4oc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgdmZzbW91bnQgKiwgaW50KTsKIGV4dGVybiBpbnQgZmlscF9jbG9zZShzdHJ1Y3QgZmlsZSAqLCBmbF9vd25lcl90IGlkKTsKQEAgLTE1MTYsOCArMTUwOSw2IEBACiAJCQkJICAgIGxvZmZfdCAqLCByZWFkX2Rlc2NyaXB0b3JfdCAqLCByZWFkX2FjdG9yX3QpOwogZXh0ZXJuIHZvaWQKIGZpbGVfcmFfc3RhdGVfaW5pdChzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmEsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKTsKLWV4dGVybiBzc2l6ZV90IGdlbmVyaWNfZmlsZV9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2Vncyk7CiBleHRlcm4gc3NpemVfdCBnZW5lcmljX2ZpbGVfcmVhZHYoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCAKIAl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCAqcHBvcyk7CiBzc2l6ZV90IGdlbmVyaWNfZmlsZV93cml0ZXYoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnVzZS5oIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiZWI5NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZnVzZS5oCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCisgICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKworICAgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgorICAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgorKi8KKworLyogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGtlcm5lbCBpbnRlcmZhY2Ugb2YgRlVTRSAqLworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKy8qKiBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLworI2RlZmluZSBGVVNFX0tFUk5FTF9WRVJTSU9OIDcKKworLyoqIE1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgaW50ZXJmYWNlICovCisjZGVmaW5lIEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT04gMgorCisvKiogVGhlIG5vZGUgSUQgb2YgdGhlIHJvb3QgaW5vZGUgKi8KKyNkZWZpbmUgRlVTRV9ST09UX0lEIDEKKworLyoqIFRoZSBtYWpvciBudW1iZXIgb2YgdGhlIGZ1c2UgY2hhcmFjdGVyIGRldmljZSAqLworI2RlZmluZSBGVVNFX01BSk9SIDEwCisKKy8qKiBUaGUgbWlub3IgbnVtYmVyIG9mIHRoZSBmdXNlIGNoYXJhY3RlciBkZXZpY2UgKi8KKyNkZWZpbmUgRlVTRV9NSU5PUiAyMjkKKworLyogTWFrZSBzdXJlIGFsbCBzdHJ1Y3R1cmVzIGFyZSBwYWRkZWQgdG8gNjRiaXQgYm91bmRhcnksIHNvIDMyYml0CisgICB1c2Vyc3BhY2Ugd29ya3MgdW5kZXIgNjRiaXQga2VybmVscyAqLworCitzdHJ1Y3QgZnVzZV9hdHRyIHsKKwlfX3U2NAlpbm87CisJX191NjQJc2l6ZTsKKwlfX3U2NAlibG9ja3M7CisJX191NjQJYXRpbWU7CisJX191NjQJbXRpbWU7CisJX191NjQJY3RpbWU7CisJX191MzIJYXRpbWVuc2VjOworCV9fdTMyCW10aW1lbnNlYzsKKwlfX3UzMgljdGltZW5zZWM7CisJX191MzIJbW9kZTsKKwlfX3UzMglubGluazsKKwlfX3UzMgl1aWQ7CisJX191MzIJZ2lkOworCV9fdTMyCXJkZXY7Cit9OworCitzdHJ1Y3QgZnVzZV9rc3RhdGZzIHsKKwlfX3U2NAlibG9ja3M7CisJX191NjQJYmZyZWU7CisJX191NjQJYmF2YWlsOworCV9fdTY0CWZpbGVzOworCV9fdTY0CWZmcmVlOworCV9fdTMyCWJzaXplOworCV9fdTMyCW5hbWVsZW47Cit9OworCisjZGVmaW5lIEZBVFRSX01PREUJKDEgPDwgMCkKKyNkZWZpbmUgRkFUVFJfVUlECSgxIDw8IDEpCisjZGVmaW5lIEZBVFRSX0dJRAkoMSA8PCAyKQorI2RlZmluZSBGQVRUUl9TSVpFCSgxIDw8IDMpCisjZGVmaW5lIEZBVFRSX0FUSU1FCSgxIDw8IDQpCisjZGVmaW5lIEZBVFRSX01USU1FCSgxIDw8IDUpCisjZGVmaW5lIEZBVFRSX0NUSU1FCSgxIDw8IDYpCisKKy8qKgorICogRmxhZ3MgcmV0dXJuZWQgYnkgdGhlIE9QRU4gcmVxdWVzdAorICoKKyAqIEZPUEVOX0RJUkVDVF9JTzogYnlwYXNzIHBhZ2UgY2FjaGUgZm9yIHRoaXMgb3BlbiBmaWxlCisgKiBGT1BFTl9LRUVQX0NBQ0hFOiBkb24ndCBpbnZhbGlkYXRlIHRoZSBkYXRhIGNhY2hlIG9uIG9wZW4KKyAqLworI2RlZmluZSBGT1BFTl9ESVJFQ1RfSU8JCSgxIDw8IDApCisjZGVmaW5lIEZPUEVOX0tFRVBfQ0FDSEUJKDEgPDwgMSkKKworZW51bSBmdXNlX29wY29kZSB7CisJRlVTRV9MT09LVVAJICAgPSAxLAorCUZVU0VfRk9SR0VUCSAgID0gMiwgIC8qIG5vIHJlcGx5ICovCisJRlVTRV9HRVRBVFRSCSAgID0gMywKKwlGVVNFX1NFVEFUVFIJICAgPSA0LAorCUZVU0VfUkVBRExJTksJICAgPSA1LAorCUZVU0VfU1lNTElOSwkgICA9IDYsCisJRlVTRV9NS05PRAkgICA9IDgsCisJRlVTRV9NS0RJUgkgICA9IDksCisJRlVTRV9VTkxJTksJICAgPSAxMCwKKwlGVVNFX1JNRElSCSAgID0gMTEsCisJRlVTRV9SRU5BTUUJICAgPSAxMiwKKwlGVVNFX0xJTksJICAgPSAxMywKKwlGVVNFX09QRU4JICAgPSAxNCwKKwlGVVNFX1JFQUQJICAgPSAxNSwKKwlGVVNFX1dSSVRFCSAgID0gMTYsCisJRlVTRV9TVEFURlMJICAgPSAxNywKKwlGVVNFX1JFTEVBU0UgICAgICAgPSAxOCwKKwlGVVNFX0ZTWU5DICAgICAgICAgPSAyMCwKKwlGVVNFX1NFVFhBVFRSICAgICAgPSAyMSwKKwlGVVNFX0dFVFhBVFRSICAgICAgPSAyMiwKKwlGVVNFX0xJU1RYQVRUUiAgICAgPSAyMywKKwlGVVNFX1JFTU9WRVhBVFRSICAgPSAyNCwKKwlGVVNFX0ZMVVNIICAgICAgICAgPSAyNSwKKwlGVVNFX0lOSVQgICAgICAgICAgPSAyNiwKKwlGVVNFX09QRU5ESVIgICAgICAgPSAyNywKKwlGVVNFX1JFQURESVIgICAgICAgPSAyOCwKKwlGVVNFX1JFTEVBU0VESVIgICAgPSAyOSwKKwlGVVNFX0ZTWU5DRElSICAgICAgPSAzMAorfTsKKworLyogQ29uc2VydmF0aXZlIGJ1ZmZlciBzaXplIGZvciB0aGUgY2xpZW50ICovCisjZGVmaW5lIEZVU0VfTUFYX0lOIDgxOTIKKworI2RlZmluZSBGVVNFX05BTUVfTUFYIDEwMjQKKyNkZWZpbmUgRlVTRV9TWU1MSU5LX01BWCA0MDk2CisjZGVmaW5lIEZVU0VfWEFUVFJfU0laRV9NQVggNDA5NgorCitzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgeworCV9fdTY0CW5vZGVpZDsJCS8qIElub2RlIElEICovCisJX191NjQJZ2VuZXJhdGlvbjsJLyogSW5vZGUgZ2VuZXJhdGlvbjogbm9kZWlkOmdlbiBtdXN0CisJCQkJICAgYmUgdW5pcXVlIGZvciB0aGUgZnMncyBsaWZldGltZSAqLworCV9fdTY0CWVudHJ5X3ZhbGlkOwkvKiBDYWNoZSB0aW1lb3V0IGZvciB0aGUgbmFtZSAqLworCV9fdTY0CWF0dHJfdmFsaWQ7CS8qIENhY2hlIHRpbWVvdXQgZm9yIHRoZSBhdHRyaWJ1dGVzICovCisJX191MzIJZW50cnlfdmFsaWRfbnNlYzsKKwlfX3UzMglhdHRyX3ZhbGlkX25zZWM7CisJc3RydWN0IGZ1c2VfYXR0ciBhdHRyOworfTsKKworc3RydWN0IGZ1c2VfZm9yZ2V0X2luIHsKKwlfX3U2NAlubG9va3VwOworfTsKKworc3RydWN0IGZ1c2VfYXR0cl9vdXQgeworCV9fdTY0CWF0dHJfdmFsaWQ7CS8qIENhY2hlIHRpbWVvdXQgZm9yIHRoZSBhdHRyaWJ1dGVzICovCisJX191MzIJYXR0cl92YWxpZF9uc2VjOworCV9fdTMyCWR1bW15OworCXN0cnVjdCBmdXNlX2F0dHIgYXR0cjsKK307CisKK3N0cnVjdCBmdXNlX21rbm9kX2luIHsKKwlfX3UzMgltb2RlOworCV9fdTMyCXJkZXY7Cit9OworCitzdHJ1Y3QgZnVzZV9ta2Rpcl9pbiB7CisJX191MzIJbW9kZTsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2VfcmVuYW1lX2luIHsKKwlfX3U2NAluZXdkaXI7Cit9OworCitzdHJ1Y3QgZnVzZV9saW5rX2luIHsKKwlfX3U2NAlvbGRub2RlaWQ7Cit9OworCitzdHJ1Y3QgZnVzZV9zZXRhdHRyX2luIHsKKwlfX3UzMgl2YWxpZDsKKwlfX3UzMglwYWRkaW5nOworCXN0cnVjdCBmdXNlX2F0dHIgYXR0cjsKK307CisKK3N0cnVjdCBmdXNlX29wZW5faW4geworCV9fdTMyCWZsYWdzOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9vcGVuX291dCB7CisJX191NjQJZmg7CisJX191MzIJb3Blbl9mbGFnczsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2VfcmVsZWFzZV9pbiB7CisJX191NjQJZmg7CisJX191MzIJZmxhZ3M7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX2ZsdXNoX2luIHsKKwlfX3U2NAlmaDsKKwlfX3UzMglmbHVzaF9mbGFnczsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2VfcmVhZF9pbiB7CisJX191NjQJZmg7CisJX191NjQJb2Zmc2V0OworCV9fdTMyCXNpemU7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX3dyaXRlX2luIHsKKwlfX3U2NAlmaDsKKwlfX3U2NAlvZmZzZXQ7CisJX191MzIJc2l6ZTsKKwlfX3UzMgl3cml0ZV9mbGFnczsKK307CisKK3N0cnVjdCBmdXNlX3dyaXRlX291dCB7CisJX191MzIJc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfc3RhdGZzX291dCB7CisJc3RydWN0IGZ1c2Vfa3N0YXRmcyBzdDsKK307CisKK3N0cnVjdCBmdXNlX2ZzeW5jX2luIHsKKwlfX3U2NAlmaDsKKwlfX3UzMglmc3luY19mbGFnczsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfc2V0eGF0dHJfaW4geworCV9fdTMyCXNpemU7CisJX191MzIJZmxhZ3M7Cit9OworCitzdHJ1Y3QgZnVzZV9nZXR4YXR0cl9pbiB7CisJX191MzIJc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2VfZ2V0eGF0dHJfb3V0IHsKKwlfX3UzMglzaXplOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9pbml0X2luX291dCB7CisJX191MzIJbWFqb3I7CisJX191MzIJbWlub3I7Cit9OworCitzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIgeworCV9fdTMyCWxlbjsKKwlfX3UzMglvcGNvZGU7CisJX191NjQJdW5pcXVlOworCV9fdTY0CW5vZGVpZDsKKwlfX3UzMgl1aWQ7CisJX191MzIJZ2lkOworCV9fdTMyCXBpZDsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfb3V0X2hlYWRlciB7CisJX191MzIJbGVuOworCV9fczMyCWVycm9yOworCV9fdTY0CXVuaXF1ZTsKK307CisKK3N0cnVjdCBmdXNlX2RpcmVudCB7CisJX191NjQJaW5vOworCV9fdTY0CW9mZjsKKwlfX3UzMgluYW1lbGVuOworCV9fdTMyCXR5cGU7CisJY2hhciBuYW1lWzBdOworfTsKKworI2RlZmluZSBGVVNFX05BTUVfT0ZGU0VUICgodW5zaWduZWQpICgoc3RydWN0IGZ1c2VfZGlyZW50ICopIDApLT5uYW1lKQorI2RlZmluZSBGVVNFX0RJUkVOVF9BTElHTih4KSAoKCh4KSArIHNpemVvZihfX3U2NCkgLSAxKSAmIH4oc2l6ZW9mKF9fdTY0KSAtIDEpKQorI2RlZmluZSBGVVNFX0RJUkVOVF9TSVpFKGQpIFwKKwlGVVNFX0RJUkVOVF9BTElHTihGVVNFX05BTUVfT0ZGU0VUICsgKGQpLT5uYW1lbGVuKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdXRleC5oIGIvaW5jbHVkZS9saW51eC9mdXRleC5oCmluZGV4IDY1ZDZjZmQuLjEwZjk2YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnV0ZXguaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z1dGV4LmgKQEAgLTQsMTQgKzQsNDAgQEAKIC8qIFNlY29uZCBhcmd1bWVudCB0byBmdXRleCBzeXNjYWxsICovCiAKIAotI2RlZmluZSBGVVRFWF9XQUlUICgwKQotI2RlZmluZSBGVVRFWF9XQUtFICgxKQotI2RlZmluZSBGVVRFWF9GRCAoMikKLSNkZWZpbmUgRlVURVhfUkVRVUVVRSAoMykKLSNkZWZpbmUgRlVURVhfQ01QX1JFUVVFVUUgKDQpCisjZGVmaW5lIEZVVEVYX1dBSVQJCTAKKyNkZWZpbmUgRlVURVhfV0FLRQkJMQorI2RlZmluZSBGVVRFWF9GRAkJMgorI2RlZmluZSBGVVRFWF9SRVFVRVVFCQkzCisjZGVmaW5lIEZVVEVYX0NNUF9SRVFVRVVFCTQKKyNkZWZpbmUgRlVURVhfV0FLRV9PUAkJNQogCiBsb25nIGRvX2Z1dGV4KHVuc2lnbmVkIGxvbmcgdWFkZHIsIGludCBvcCwgaW50IHZhbCwKIAkJdW5zaWduZWQgbG9uZyB0aW1lb3V0LCB1bnNpZ25lZCBsb25nIHVhZGRyMiwgaW50IHZhbDIsCiAJCWludCB2YWwzKTsKIAorI2RlZmluZSBGVVRFWF9PUF9TRVQJCTAJLyogKihpbnQgKilVQUREUjIgPSBPUEFSRzsgKi8KKyNkZWZpbmUgRlVURVhfT1BfQURECQkxCS8qICooaW50ICopVUFERFIyICs9IE9QQVJHOyAqLworI2RlZmluZSBGVVRFWF9PUF9PUgkJMgkvKiAqKGludCAqKVVBRERSMiB8PSBPUEFSRzsgKi8KKyNkZWZpbmUgRlVURVhfT1BfQU5ETgkJMwkvKiAqKGludCAqKVVBRERSMiAmPSB+T1BBUkc7ICovCisjZGVmaW5lIEZVVEVYX09QX1hPUgkJNAkvKiAqKGludCAqKVVBRERSMiBePSBPUEFSRzsgKi8KKworI2RlZmluZSBGVVRFWF9PUF9PUEFSR19TSElGVAk4CS8qIFVzZSAoMSA8PCBPUEFSRykgaW5zdGVhZCBvZiBPUEFSRy4gICovCisKKyNkZWZpbmUgRlVURVhfT1BfQ01QX0VRCQkwCS8qIGlmIChvbGR2YWwgPT0gQ01QQVJHKSB3YWtlICovCisjZGVmaW5lIEZVVEVYX09QX0NNUF9ORQkJMQkvKiBpZiAob2xkdmFsICE9IENNUEFSRykgd2FrZSAqLworI2RlZmluZSBGVVRFWF9PUF9DTVBfTFQJCTIJLyogaWYgKG9sZHZhbCA8IENNUEFSRykgd2FrZSAqLworI2RlZmluZSBGVVRFWF9PUF9DTVBfTEUJCTMJLyogaWYgKG9sZHZhbCA8PSBDTVBBUkcpIHdha2UgKi8KKyNkZWZpbmUgRlVURVhfT1BfQ01QX0dUCQk0CS8qIGlmIChvbGR2YWwgPiBDTVBBUkcpIHdha2UgKi8KKyNkZWZpbmUgRlVURVhfT1BfQ01QX0dFCQk1CS8qIGlmIChvbGR2YWwgPj0gQ01QQVJHKSB3YWtlICovCisKKy8qIEZVVEVYX1dBS0VfT1Agd2lsbCBwZXJmb3JtIGF0b21pY2FsbHkKKyAgIGludCBvbGR2YWwgPSAqKGludCAqKVVBRERSMjsKKyAgICooaW50ICopVUFERFIyID0gb2xkdmFsIE9QIE9QQVJHOworICAgaWYgKG9sZHZhbCBDTVAgQ01QQVJHKQorICAgICB3YWtlIFVBRERSMjsgICovCisKKyNkZWZpbmUgRlVURVhfT1Aob3AsIG9wYXJnLCBjbXAsIGNtcGFyZykgXAorICAoKChvcCAmIDB4ZikgPDwgMjgpIHwgKChjbXAgJiAweGYpIDw8IDI0KQkJXAorICAgfCAoKG9wYXJnICYgMHhmZmYpIDw8IDEyKSB8IChjbXBhcmcgJiAweGZmZikpCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZnAuaCBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKaW5kZXggN2M3NDAwMS4uNGRjOTkwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZnAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dmcC5oCkBAIC00MCw2ICs0MCw3IEBACiAjZGVmaW5lIF9fR0ZQX1pFUk8JMHg4MDAwdQkvKiBSZXR1cm4gemVyb2VkIHBhZ2Ugb24gc3VjY2VzcyAqLwogI2RlZmluZSBfX0dGUF9OT01FTUFMTE9DIDB4MTAwMDB1IC8qIERvbid0IHVzZSBlbWVyZ2VuY3kgcmVzZXJ2ZXMgKi8KICNkZWZpbmUgX19HRlBfTk9SRUNMQUlNICAweDIwMDAwdSAvKiBObyByZWFseSB6b25lIHJlY2xhaW0gZHVyaW5nIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgX19HRlBfSEFSRFdBTEwgICAweDQwMDAwdSAvKiBFbmZvcmNlIGhhcmR3YWxsIGNwdXNldCBtZW1vcnkgYWxsb2NzICovCiAKICNkZWZpbmUgX19HRlBfQklUU19TSElGVCAyMAkvKiBSb29tIGZvciAyMCBfX0dGUF9GT08gYml0cyAqLwogI2RlZmluZSBfX0dGUF9CSVRTX01BU0sgKCgxIDw8IF9fR0ZQX0JJVFNfU0hJRlQpIC0gMSkKQEAgLTQ4LDE0ICs0OSwxNSBAQAogI2RlZmluZSBHRlBfTEVWRUxfTUFTSyAoX19HRlBfV0FJVHxfX0dGUF9ISUdIfF9fR0ZQX0lPfF9fR0ZQX0ZTfCBcCiAJCQlfX0dGUF9DT0xEfF9fR0ZQX05PV0FSTnxfX0dGUF9SRVBFQVR8IFwKIAkJCV9fR0ZQX05PRkFJTHxfX0dGUF9OT1JFVFJZfF9fR0ZQX05PX0dST1d8X19HRlBfQ09NUHwgXAotCQkJX19HRlBfTk9NRU1BTExPQ3xfX0dGUF9OT1JFQ0xBSU0pCisJCQlfX0dGUF9OT01FTUFMTE9DfF9fR0ZQX05PUkVDTEFJTXxfX0dGUF9IQVJEV0FMTCkKIAogI2RlZmluZSBHRlBfQVRPTUlDCShfX0dGUF9ISUdIKQogI2RlZmluZSBHRlBfTk9JTwkoX19HRlBfV0FJVCkKICNkZWZpbmUgR0ZQX05PRlMJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTykKICNkZWZpbmUgR0ZQX0tFUk5FTAkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMpCi0jZGVmaW5lIEdGUF9VU0VSCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUykKLSNkZWZpbmUgR0ZQX0hJR0hVU0VSCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IF9fR0ZQX0hJR0hNRU0pCisjZGVmaW5lIEdGUF9VU0VSCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IF9fR0ZQX0hBUkRXQUxMKQorI2RlZmluZSBHRlBfSElHSFVTRVIJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTIHwgX19HRlBfSEFSRFdBTEwgfCBcCisJCQkgX19HRlBfSElHSE1FTSkKIAogLyogRmxhZyAtIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgd2lsbCBiZSBzdWl0YWJsZSBmb3IgRE1BLiAgSWdub3JlZCBvbiBzb21lCiAgICBwbGF0Zm9ybXMsIHVzZWQgYXMgYXBwcm9wcmlhdGUgb24gb3RoZXJzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaCBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCmluZGV4IGY1MjlkMTQuLmU2NzBiMGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCisrKyBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCkBAIC03MCwxMiArNzAsNiBAQAogdm9pZCBodWdldGxiX3ByZWZhdWx0X2FyY2hfaG9vayhzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiAjZW5kaWYKIAotI2lmbmRlZiBBUkNIX0hBU19IVUdFVExCX0NMRUFOX1NUQUxFX1BHVEFCTEUKLSNkZWZpbmUgaHVnZXRsYl9jbGVhbl9zdGFsZV9wZ3RhYmxlKHB0ZSkJQlVHKCkKLSNlbHNlCi12b2lkIGh1Z2V0bGJfY2xlYW5fc3RhbGVfcGd0YWJsZShwdGVfdCAqcHRlKTsKLSNlbmRpZgotCiAjZWxzZSAvKiAhQ09ORklHX0hVR0VUTEJfUEFHRSAqLwogCiBzdGF0aWMgaW5saW5lIGludCBpc192bV9odWdldGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h3bW9uLXN5c2ZzLmggYi9pbmNsdWRlL2xpbnV4L2h3bW9uLXN5c2ZzLmgKaW5kZXggMWI1MDE4YS4uN2ViNDAwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9od21vbi1zeXNmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvaHdtb24tc3lzZnMuaApAQCAtMzMsNCArMzMsMTkgQEAKIAkuaW5kZXggPQlfaW5kZXgsCQkJCQlcCiB9CiAKK3N0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIHsKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cjsKKwl1OCBpbmRleDsKKwl1OCBucjsKK307CisjZGVmaW5lIHRvX3NlbnNvcl9kZXZfYXR0cl8yKF9kZXZfYXR0cikgXAorCWNvbnRhaW5lcl9vZihfZGV2X2F0dHIsIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yLCBkZXZfYXR0cikKKworI2RlZmluZSBTRU5TT1JfREVWSUNFX0FUVFJfMihfbmFtZSxfbW9kZSxfc2hvdyxfc3RvcmUsX25yLF9pbmRleCkJXAorc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgc2Vuc29yX2Rldl9hdHRyXyMjX25hbWUgPSB7CVwKKwkuZGV2X2F0dHIgPQlfX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKSwJXAorCS5pbmRleCA9CV9pbmRleCwJCQkJCVwKKwkubnIgPQkJX25yLAkJCQkJXAorfQorCiAjZW5kaWYgLyogX0xJTlVYX0hXTU9OX1NZU0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHdtb24tdmlkLmggYi9pbmNsdWRlL2xpbnV4L2h3bW9uLXZpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNGI3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2h3bW9uLXZpZC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgICAgaHdtb24tdmlkLmggLSBWSUQvVlJNL1ZSRCB2b2x0YWdlIGNvbnZlcnNpb25zCisKKyAgICBPcmlnaW5hbGx5IHBhcnQgb2YgbG1fc2Vuc29ycworICAgIENvcHlyaWdodCAoYykgMjAwMiBNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CisgICAgV2l0aCBhc3Npc3RhbmNlIGZyb20gVHJlbnQgUGllcGhvIDx4eXp6eUBzcGVha2Vhc3kub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmIF9MSU5VWF9IV01PTl9WSURfSAorI2RlZmluZSBfTElOVVhfSFdNT05fVklEX0gKKworaW50IHZpZF9mcm9tX3JlZyhpbnQgdmFsLCBpbnQgdnJtKTsKK2ludCB2aWRfd2hpY2hfdnJtKHZvaWQpOworCisvKiB2cm0gaXMgdGhlIFZSTS9WUkQgZG9jdW1lbnQgdmVyc2lvbiBtdWx0aXBsaWVkIGJ5IDEwLgorICAgdmFsIGlzIGluIG1WIHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IGluIHRoZSBrZXJuZWwuCisgICBSZXR1cm5lZCB2YWx1ZSBpcyB0aGUgNC0sIDUtIG9yIDYtYml0IFZJRCBjb2RlLgorICAgTm90ZSB0aGF0IG9ubHkgVlJNIDkueCBpcyBzdXBwb3J0ZWQgZm9yIG5vdy4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZpZF90b19yZWcoaW50IHZhbCwgaW50IHZybSkKK3sKKwlzd2l0Y2ggKHZybSkgeworCWNhc2UgOTE6CQkvKiBWUk0gOS4xICovCisJY2FzZSA5MDoJCS8qIFZSTSA5LjAgKi8KKwkJcmV0dXJuICgodmFsID49IDExMDApICYmICh2YWwgPD0gMTg1MCkgPworCQkJKCgxODQ5OSAtIHZhbCAqIDEwKSAvIDI1ICsgNSkgLyAxMCA6IC0xKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorfQorCisjZW5kaWYgLyogX0xJTlVYX0hXTU9OX1ZJRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h3bW9uLmggYi9pbmNsdWRlL2xpbnV4L2h3bW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmZDk5NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaHdtb24uaApAQCAtMCwwICsxLDM1IEBACisvKgorICAgIGh3bW9uLmggLSBwYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nCisKKyAgICBUaGlzIGZpbGUgZGVjbGFyZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIHN5c2ZzIGNsYXNzICJod21vbiIsCisgICAgZm9yIHVzZSBieSBzZW5zb3JzIGRyaXZlcnMuCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUgTWFyayBNLiBIb2ZmbWFuIDxtaG9mZm1hbkBsaWdodGxpbmsuY29tPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgX0hXTU9OX0hfCisjZGVmaW5lIF9IV01PTl9IXworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKK3N0cnVjdCBjbGFzc19kZXZpY2UgKmh3bW9uX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpOworCit2b2lkIGh3bW9uX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYpOworCisvKiBTY2FsZSB1c2VyIGlucHV0IHRvIHNlbnNpYmxlIHZhbHVlcyAqLworc3RhdGljIGlubGluZSBpbnQgU0VOU09SU19MSU1JVChsb25nIHZhbHVlLCBsb25nIGxvdywgbG9uZyBoaWdoKQoreworCWlmICh2YWx1ZSA8IGxvdykKKwkJcmV0dXJuIGxvdzsKKwllbHNlIGlmICh2YWx1ZSA+IGhpZ2gpCisJCXJldHVybiBoaWdoOworCWVsc2UKKwkJcmV0dXJuIHZhbHVlOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMtaWQuaCBiL2luY2x1ZGUvbGludXgvaTJjLWlkLmgKaW5kZXggMzNmMDgyNS4uNDRmMzA4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMtaWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy1pZC5oCkBAIC0xLDYgKzEsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogCQkJCQkJCQkJICAgICAqLwotLyogaTJjLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIGkyYy1idXMgaW50ZXJmYWNlCQkJICAgICAqLworLyogaTJjLWlkLmggLSBpZGVudGlmaWVyIHZhbHVlcyBmb3IgaTJjIGRyaXZlcnMgYW5kIGFkYXB0ZXJzCQkgICAgICovCiAvKiAJCQkJCQkJCQkgICAgICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5IFNpbW9uIEcuIFZvZ2wKQEAgLTI0LDE2ICsyNCw2IEBACiAjZGVmaW5lIExJTlVYX0kyQ19JRF9ICiAKIC8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgaTJjLWJ1cyBwYWNrYWdlIGFuZCBjb250YWlucyB0aGUgaWRlbnRpZmllcgotICogdmFsdWVzIGZvciBkcml2ZXJzLCBhZGFwdGVycyBhbmQgb3RoZXIgZm9sayBwb3B1bGF0aW5nIHRoZXNlIHNlcmlhbAotICogd29ybGRzLiAKLSAqCi0gKiBUaGVzZSB3aWxsIGNoYW5nZSBvZnRlbiAoaS5lLiBhZGRpdGlvbnMpICwgdGhlcmVmb3JlIHRoaXMgaGFzIGJlZW4gCi0gKiBzZXBhcmF0ZWQgZnJvbSB0aGUgZnVuY3Rpb25hbCBpbnRlcmZhY2UgZGVmaW5pdGlvbnMgb2YgdGhlIGkyYyBhcGkuCi0gKgotICovCi0KLS8qCiAgKiAtLS0tIERyaXZlciB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogICAgICAgZGV2aWNlIGlkIG5hbWUgKyBudW1iZXIgICAgICAgIGZ1bmN0aW9uIGRlc2NyaXB0aW9uLCBpMmMgYWRkcmVzcyhlcykKICAqCkBAIC0xNzAsMTUxICsxNjAsMTEzIEBACiAKIC8qCiAgKiAtLS0tIEFkYXB0ZXIgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIEZpcnN0LCB3ZSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHNldmVyYWwgYWxnb3JpdGhtcyB0byBhY2Nlc3MgdGhlIGhhcmR3YXJlCi0gKiBpbnRlcmZhY2UgdHlwZXMsIGFzIGEgUENGIDg1ODQgbmVlZHMgb3RoZXIgY2FyZSB0aGFuIGEgYml0IGFkYXB0ZXIuCi0gKi8KLQotI2RlZmluZSBJMkNfQUxHT19OT05FCTB4MDAwMDAwCi0jZGVmaW5lIEkyQ19BTEdPX0JJVAkweDAxMDAwMAkvKiBiaXQgc3R5bGUgYWRhcHRlcnMJCSovCi0jZGVmaW5lIEkyQ19BTEdPX1BDRgkweDAyMDAwMAkvKiBQQ0YgODU4NCBzdHlsZSBhZGFwdGVycwkqLwotI2RlZmluZSBJMkNfQUxHT19BVEkJMHgwMzAwMDAJLyogQVRJIHZpZGVvIGNhcmQJCSovCi0jZGVmaW5lIEkyQ19BTEdPX1NNQlVTCTB4MDQwMDAwCi0jZGVmaW5lIEkyQ19BTEdPX0lTQSAJMHgwNTAwMDAJLyogbG1fc2Vuc29ycyBJU0EgcHNldWRvLWFkYXB0ZXIgKi8KLSNkZWZpbmUgSTJDX0FMR09fU0FBNzE0NiAweDA2MDAwMAkvKiBTQUEgNzE0NiB2aWRlbyBkZWNvZGVyIGJ1cwkqLwotI2RlZmluZSBJMkNfQUxHT19BQ0IgCTB4MDcwMDAwCS8qIEFDQ0VTUy5idXMgYWxnb3JpdGhtICAgICAgICAgKi8KLSNkZWZpbmUgSTJDX0FMR09fSUlDICAgIDB4MDgwMDAwIAkvKiBJVEUgSUlDIGJ1cyAqLwotI2RlZmluZSBJMkNfQUxHT19TQUE3MTM0IDB4MDkwMDAwCi0jZGVmaW5lIEkyQ19BTEdPX01QQzgyNFggMHgwYTAwMDAJLyogTW90b3JvbGEgODI0MCAvIDgyNDUgICAgICAgICAqLwotI2RlZmluZSBJMkNfQUxHT19JUE1JIAkweDBiMDAwMAkvKiBJUE1JIGR1bW15IGFkYXB0ZXIgKi8KLSNkZWZpbmUgSTJDX0FMR09fSVBNQiAJMHgwYzAwMDAJLyogSVBNQiBhZGFwdGVyICovCi0jZGVmaW5lIEkyQ19BTEdPX01QQzEwNyAweDBkMDAwMAotI2RlZmluZSBJMkNfQUxHT19FQyAgICAgMHgxMDAwMDAgICAgICAgIC8qIEFDUEkgZW1iZWRkZWQgY29udHJvbGxlciAgICAgKi8KLQotI2RlZmluZSBJMkNfQUxHT19NUEM4WFggMHgxMTAwMDAJLyogTVBDOHh4IFBvd2VyUEMgSTJDIGFsZ29yaXRobSAqLwotI2RlZmluZSBJMkNfQUxHT19PQ1AgICAgMHgxMjAwMDAJLyogSUJNIG9yIG90aGVyd2lzZSBPbi1jaGlwIEkyQyBhbGdvcml0aG0gKi8KLSNkZWZpbmUgSTJDX0FMR09fQklUSFMJMHgxMzAwMDAJLyogZW5oYW5jZWQgYml0IHN0eWxlIGFkYXB0ZXJzCSovCi0jZGVmaW5lIEkyQ19BTEdPX0lPUDNYWAkweDE0MDAwMAkvKiBYU0NBTEUgSU9QM1hYIE9uLWNoaXAgSTJDIGFsZyAqLwotI2RlZmluZSBJMkNfQUxHT19TSUJZVEUgMHgxNTAwMDAJLyogQnJvYWRjb20gU2lCeXRlIFNPQ3MJCSovCi0jZGVmaW5lIEkyQ19BTEdPX1NHSQkweDE2MDAwMAkvKiBTR0kgYWxnb3JpdGhtCQkqLwotCi0jZGVmaW5lIEkyQ19BTEdPX1VTQgkweDE3MDAwMAkvKiBVU0IgYWxnb3JpdGhtCQkqLwotI2RlZmluZSBJMkNfQUxHT19WSVJUCTB4MTgwMDAwCS8qIFZpcnR1YWwgYnVzIGFkYXB0ZXIJCSovCi0KLSNkZWZpbmUgSTJDX0FMR09fTVY2NFhYWCAweDE5MDAwMAkvKiBNYXJ2ZWxsIG12NjR4eHggaTJjIGN0bHIJKi8KLSNkZWZpbmUgSTJDX0FMR09fUENBCTB4MWEwMDAwCS8qIFBDQSA5NTY0IHN0eWxlIGFkYXB0ZXJzCSovCi0jZGVmaW5lIEkyQ19BTEdPX0FVMTU1MAkweDFiMDAwMCAgICAgICAgLyogQXUxNTUwIFBTQyBhbGdvcml0aG0JCSovCi0KLSNkZWZpbmUgSTJDX0FMR09fRVhQCTB4ODAwMDAwCS8qIGV4cGVyaW1lbnRhbAkJCSovCi0KLSNkZWZpbmUgSTJDX0FMR09fTUFTSwkweGZmMDAwMAkvKiBNYXNrIGZvciBhbGdvcml0aG1zCQkqLwotI2RlZmluZSBJMkNfQUxHT19TSElGVAkweDEwCS8qIHJpZ2h0IHNoaWZ0IHRvIGdldCBpbmRleCB2YWx1ZXMgCSovCi0KLSNkZWZpbmUgSTJDX0hXX0FEQVBTCTB4MTAwMDAJCS8qICMgYWRhcHRlciB0eXBlcwkJKi8KLSNkZWZpbmUgSTJDX0hXX01BU0sJMHhmZmZmCQkKLQotCi0vKiBodyBzcGVjaWZpYyBtb2R1bGVzIHRoYXQgYXJlIGRlZmluZWQgcGVyIGFsZ29yaXRobSBsYXllcgogICovCiAKIC8qIC0tLSBCaXQgYWxnb3JpdGhtIGFkYXB0ZXJzIAkJCQkJCSovCi0jZGVmaW5lIEkyQ19IV19CX0xQCTB4MDAJLyogUGFyYWxsZWwgcG9ydCBQaGlsaXBzIHN0eWxlIGFkYXB0ZXIJKi8KLSNkZWZpbmUgSTJDX0hXX0JfTFBDCTB4MDEJLyogUGFyYWxsZWwgcG9ydCwgb3ZlciBjb250cm9sIHJlZy4JKi8KLSNkZWZpbmUgSTJDX0hXX0JfU0VSCTB4MDIJLyogU2VyaWFsIGxpbmUgaW50ZXJmYWNlCQkqLwotI2RlZmluZSBJMkNfSFdfQl9FTFYJMHgwMwkvKiBFTFYgQ2FyZAkJCQkqLwotI2RlZmluZSBJMkNfSFdfQl9WRUxMRQkweDA0CS8qIFZlbGxlbWFubiBLODAwMAkJCSovCi0jZGVmaW5lIEkyQ19IV19CX0JUODQ4CTB4MDUJLyogQlQ4NDggdmlkZW8gYm9hcmRzCQkJKi8KLSNkZWZpbmUgSTJDX0hXX0JfV05WCTB4MDYJLyogV2lubm92IFZpZGV1bXMJCQkqLwotI2RlZmluZSBJMkNfSFdfQl9WSUEJMHgwNwkvKiBWaWEgdnQ4MmM1ODZiCQkJKi8KLSNkZWZpbmUgSTJDX0hXX0JfSFlEUkEJMHgwOAkvKiBBcHBsZSBIeWRyYSBNYWMgSS9PCQkJKi8KLSNkZWZpbmUgSTJDX0hXX0JfRzQwMAkweDA5CS8qIE1hdHJveCBHNDAwCQkJCSovCi0jZGVmaW5lIEkyQ19IV19CX0k4MTAJMHgwYQkvKiBJbnRlbCBJODEwIAkJCQkqLwotI2RlZmluZSBJMkNfSFdfQl9WT08JMHgwYgkvKiAzZGZ4IFZvb2RvbyAzIC8gQmFuc2hlZSAgICAgIAkqLwotI2RlZmluZSBJMkNfSFdfQl9QUE9SVCAgMHgwYwkvKiBQcmltaXRpdmUgcGFyYWxsZWwgcG9ydCBhZGFwdGVyCSovCi0jZGVmaW5lIEkyQ19IV19CX1NBVkcJMHgwZAkvKiBTYXZhZ2UgNCAgICAgICAgICAgICAgICAgICAgIAkqLwotI2RlZmluZSBJMkNfSFdfQl9TQ1gyMDAJMHgwZQkvKiBOYXQnbCBTZW1pIFNDeDIwMCBJMkMgICAgICAgIAkqLwotI2RlZmluZSBJMkNfSFdfQl9SSVZBCTB4MTAJLyogUml2YSBiYXNlZCBncmFwaGljcyBjYXJkcwkJKi8KLSNkZWZpbmUgSTJDX0hXX0JfSU9DCTB4MTEJLyogSU9DIGJpdC13aWdnbGluZwkJCSovCi0jZGVmaW5lIEkyQ19IV19CX1RTVU5BICAweDEyCS8qIERFQyBUc3VuYW1pIGNoaXBzZXQJCQkqLwotI2RlZmluZSBJMkNfSFdfQl9GUk9ETyAgMHgxMyAgICAvKiAyZDNELCBJbmMuIFNBLTExMTAgRGV2ZWxvcG1lbnQgQm9hcmQgKi8KLSNkZWZpbmUgSTJDX0hXX0JfT01BSEEgIDB4MTQgICAgLyogT21haGEgSTJDIGludGVyZmFjZSAoQVJNKQkJKi8KLSNkZWZpbmUgSTJDX0hXX0JfR1VJREUgIDB4MTUgICAgLyogR3VpZGUgYml0LWJhc2hlcgkJCSovCi0jZGVmaW5lIEkyQ19IV19CX0lYUDIwMDAgMHgxNgkvKiBHUElPIG9uIElYUDIwMDAgc3lzdGVtcyAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSTJDX0hXX0JfSVhQNFhYIDB4MTcJLyogR1BJTyBvbiBJWFA0WFggc3lzdGVtcwkJKi8KLSNkZWZpbmUgSTJDX0hXX0JfUzNWSUEJMHgxOAkvKiBTM1ZpYSBQcm9TYXZhZ2UgYWRhcHRlcgkJKi8KLSNkZWZpbmUgSTJDX0hXX0JfWlIzNjA2NyAweDE5CS8qIFpvcmFuLTM2MDU3LzM2MDY3IGJhc2VkIGJvYXJkcwkqLwotI2RlZmluZSBJMkNfSFdfQl9QQ0lMWU5YIDB4MWEJLyogVEkgUENJTHlueCBJMkMgYWRhcHRlcgkJKi8KLSNkZWZpbmUgSTJDX0hXX0JfQ1gyMzg4eCAweDFiCS8qIGNvbm5leGFudCAyMzg4eCBiYXNlZCB0diBjYXJkcwkqLworI2RlZmluZSBJMkNfSFdfQl9MUAkJMHgwMTAwMDAgLyogUGFyYWxsZWwgcG9ydCBQaGlsaXBzIHN0eWxlICovCisjZGVmaW5lIEkyQ19IV19CX0xQQwkJMHgwMTAwMDEgLyogUGFyYWxsZWwgcG9ydCBjb250cm9sIHJlZy4gKi8KKyNkZWZpbmUgSTJDX0hXX0JfU0VSCQkweDAxMDAwMiAvKiBTZXJpYWwgbGluZSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgSTJDX0hXX0JfRUxWCQkweDAxMDAwMyAvKiBFTFYgQ2FyZCAqLworI2RlZmluZSBJMkNfSFdfQl9WRUxMRQkJMHgwMTAwMDQgLyogVmVsbGVtYW5uIEs4MDAwICovCisjZGVmaW5lIEkyQ19IV19CX0JUODQ4CQkweDAxMDAwNSAvKiBCVDg0OCB2aWRlbyBib2FyZHMgKi8KKyNkZWZpbmUgSTJDX0hXX0JfV05WCQkweDAxMDAwNiAvKiBXaW5ub3YgVmlkZXVtcyAqLworI2RlZmluZSBJMkNfSFdfQl9WSUEJCTB4MDEwMDA3IC8qIFZpYSB2dDgyYzU4NmIgKi8KKyNkZWZpbmUgSTJDX0hXX0JfSFlEUkEJCTB4MDEwMDA4IC8qIEFwcGxlIEh5ZHJhIE1hYyBJL08gKi8KKyNkZWZpbmUgSTJDX0hXX0JfRzQwMAkJMHgwMTAwMDkgLyogTWF0cm94IEc0MDAgKi8KKyNkZWZpbmUgSTJDX0hXX0JfSTgxMAkJMHgwMTAwMGEgLyogSW50ZWwgSTgxMCAqLworI2RlZmluZSBJMkNfSFdfQl9WT08JCTB4MDEwMDBiIC8qIDNkZnggVm9vZG9vIDMgLyBCYW5zaGVlICovCisjZGVmaW5lIEkyQ19IV19CX1BQT1JUCQkweDAxMDAwYyAvKiBQcmltaXRpdmUgcGFyYWxsZWwgcG9ydCBhZGFwdGVyICovCisjZGVmaW5lIEkyQ19IV19CX1NBVkcJCTB4MDEwMDBkIC8qIFNhdmFnZSA0ICovCisjZGVmaW5lIEkyQ19IV19CX1NDWDIwMAkJMHgwMTAwMGUgLyogTmF0J2wgU2VtaSBTQ3gyMDAgSTJDICovCisjZGVmaW5lIEkyQ19IV19CX1JJVkEJCTB4MDEwMDEwIC8qIFJpdmEgYmFzZWQgZ3JhcGhpY3MgY2FyZHMgKi8KKyNkZWZpbmUgSTJDX0hXX0JfSU9DCQkweDAxMDAxMSAvKiBJT0MgYml0LXdpZ2dsaW5nICovCisjZGVmaW5lIEkyQ19IV19CX1RTVU5BCQkweDAxMDAxMiAvKiBERUMgVHN1bmFtaSBjaGlwc2V0ICovCisjZGVmaW5lIEkyQ19IV19CX0ZST0RPCQkweDAxMDAxMyAvKiAyZDNEIFNBLTExMTAgRGV2ZWxvcG1lbnQgQm9hcmQgKi8KKyNkZWZpbmUgSTJDX0hXX0JfT01BSEEJCTB4MDEwMDE0IC8qIE9tYWhhIEkyQyBpbnRlcmZhY2UgKEFSTSkgKi8KKyNkZWZpbmUgSTJDX0hXX0JfR1VJREUJCTB4MDEwMDE1IC8qIEd1aWRlIGJpdC1iYXNoZXIgKi8KKyNkZWZpbmUgSTJDX0hXX0JfSVhQMjAwMAkweDAxMDAxNiAvKiBHUElPIG9uIElYUDIwMDAgc3lzdGVtcyAqLworI2RlZmluZSBJMkNfSFdfQl9JWFA0WFgJCTB4MDEwMDE3IC8qIEdQSU8gb24gSVhQNFhYIHN5c3RlbXMgKi8KKyNkZWZpbmUgSTJDX0hXX0JfUzNWSUEJCTB4MDEwMDE4IC8qIFMzVmlhIFByb1NhdmFnZSBhZGFwdGVyICovCisjZGVmaW5lIEkyQ19IV19CX1pSMzYwNjcJMHgwMTAwMTkgLyogWm9yYW4tMzYwNTcvMzYwNjcgYmFzZWQgYm9hcmRzICovCisjZGVmaW5lIEkyQ19IV19CX1BDSUxZTlgJMHgwMTAwMWEgLyogVEkgUENJTHlueCBJMkMgYWRhcHRlciAqLworI2RlZmluZSBJMkNfSFdfQl9DWDIzODh4CTB4MDEwMDFiIC8qIGNvbm5leGFudCAyMzg4eCBiYXNlZCB0diBjYXJkcyAqLworI2RlZmluZSBJMkNfSFdfQl9OVklESUEJCTB4MDEwMDFjIC8qIG52aWRpYSBmcmFtZWJ1ZmZlciBkcml2ZXIgKi8KKyNkZWZpbmUgSTJDX0hXX0JfU0FWQUdFCQkweDAxMDAxZCAvKiBzYXZhZ2UgZnJhbWVidWZmZXIgZHJpdmVyICovCisjZGVmaW5lIEkyQ19IV19CX1JBREVPTgkJMHgwMTAwMWUgLyogcmFkZW9uIGZyYW1lYnVmZmVyIGRyaXZlciAqLwogCiAvKiAtLS0gUENGIDg1ODQgYmFzZWQgYWxnb3JpdGhtcwkJCQkJKi8KLSNkZWZpbmUgSTJDX0hXX1BfTFAJMHgwMAkvKiBQYXJhbGxlbCBwb3J0IGludGVyZmFjZQkJKi8KLSNkZWZpbmUgSTJDX0hXX1BfSVNBCTB4MDEJLyogZ2VuZXJpYyBJU0EgQnVzIGludGVmYWNlIGNhcmQJKi8KLSNkZWZpbmUgSTJDX0hXX1BfRUxFSwkweDAyCS8qIEVsZWt0b3IgSVNBIEJ1cyBpbnRlZmFjZSBjYXJkCSovCisjZGVmaW5lIEkyQ19IV19QX0xQCQkweDAyMDAwMCAvKiBQYXJhbGxlbCBwb3J0IGludGVyZmFjZSAqLworI2RlZmluZSBJMkNfSFdfUF9JU0EJCTB4MDIwMDAxIC8qIGdlbmVyaWMgSVNBIEJ1cyBpbnRlZmFjZSBjYXJkICovCisjZGVmaW5lIEkyQ19IV19QX0VMRUsJCTB4MDIwMDAyIC8qIEVsZWt0b3IgSVNBIEJ1cyBpbnRlZmFjZSBjYXJkICovCiAKIC8qIC0tLSBQQ0EgOTU2NCBiYXNlZCBhbGdvcml0aG1zICovCi0jZGVmaW5lIEkyQ19IV19BX0lTQQkweDAwCS8qIGdlbmVyaWMgSVNBIEJ1cyBpbnRlcmZhY2UgY2FyZAkqLworI2RlZmluZSBJMkNfSFdfQV9JU0EJCTB4MWEwMDAwIC8qIGdlbmVyaWMgSVNBIEJ1cyBpbnRlcmZhY2UgY2FyZCAqLwogCiAvKiAtLS0gQUNQSSBFbWJlZGRlZCBjb250cm9sbGVyIGFsZ29yaXRobXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJMkNfSFdfQUNQSV9FQyAgICAgICAgICAweDAwCisjZGVmaW5lIEkyQ19IV19BQ1BJX0VDICAgICAgICAgIDB4MWYwMDAwCiAKIC8qIC0tLSBNUEM4MjR4IFBvd2VyUEMgYWRhcHRlcnMJCQkJCQkqLwotI2RlZmluZSBJMkNfSFdfTVBDODI0WCAweDAwCS8qIE1vdG9yb2xhIDgyNDAgLyA4MjQ1ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJMkNfSFdfTVBDODI0WAkJMHgxMDAwMDEgLyogTW90b3JvbGEgODI0MCAvIDgyNDUgKi8KIAogLyogLS0tIE1QQzh4eCBQb3dlclBDIGFkYXB0ZXJzCQkJCQkJKi8KLSNkZWZpbmUgSTJDX0hXX01QQzhYWF9FUE9OIDB4MDAJLyogRXBvbnltb3VzIE1QQzh4eCBJMkMgYWRhcHRlciAJKi8KKyNkZWZpbmUgSTJDX0hXX01QQzhYWF9FUE9OCTB4MTEwMDAwIC8qIEVwb255bW91cyBNUEM4eHggSTJDIGFkYXB0ZXIgKi8KIAogLyogLS0tIElURSBiYXNlZCBhbGdvcml0aG1zCQkJCQkJKi8KLSNkZWZpbmUgSTJDX0hXX0lfSUlDCTB4MDAJLyogY29udHJvbGxlciBvbiB0aGUgSVRFICovCisjZGVmaW5lIEkyQ19IV19JX0lJQwkJMHgwODAwMDAgLyogY29udHJvbGxlciBvbiB0aGUgSVRFICovCiAKIC8qIC0tLSBQb3dlclBDIG9uLWNoaXAgYWRhcHRlcnMJCQkJCQkqLwotI2RlZmluZSBJMkNfSFdfT0NQIDB4MDAJLyogSUJNIG9uLWNoaXAgSTJDIGFkYXB0ZXIgCSovCisjZGVmaW5lIEkyQ19IV19PQ1AJCTB4MTIwMDAwIC8qIElCTSBvbi1jaGlwIEkyQyBhZGFwdGVyICovCiAKIC8qIC0tLSBCcm9hZGNvbSBTaUJ5dGUgYWRhcHRlcnMJCQkJCQkqLwotI2RlZmluZSBJMkNfSFdfU0lCWVRFCTB4MDAKKyNkZWZpbmUgSTJDX0hXX1NJQllURQkJMHgxNTAwMDAKIAogLyogLS0tIFNHSSBhZGFwdGVycwkJCQkJCQkqLwotI2RlZmluZSBJMkNfSFdfU0dJX1ZJTk8JMHgwMAotI2RlZmluZSBJMkNfSFdfU0dJX01BQ0UJMHgwMQorI2RlZmluZSBJMkNfSFdfU0dJX1ZJTk8JCTB4MTYwMDAwCisjZGVmaW5lIEkyQ19IV19TR0lfTUFDRQkJMHgxNjAwMDEKIAogLyogLS0tIFhTQ0FMRSBvbi1jaGlwIGFkYXB0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJMkNfSFdfSU9QM1hYIDB4MDAKKyNkZWZpbmUgSTJDX0hXX0lPUDNYWAkJMHgxNDAwMDAKIAogLyogLS0tIEF1MTU1MCBQU0MgYWRhcHRlcnMgYWRhcHRlcnMJCQkJCSovCi0jZGVmaW5lIEkyQ19IV19BVTE1NTBfUFNDCTB4MDAKKyNkZWZpbmUgSTJDX0hXX0FVMTU1MF9QU0MJMHgxYjAwMDAKIAogLyogLS0tIFNNQnVzIG9ubHkgYWRhcHRlcnMJCQkJCQkqLwotI2RlZmluZSBJMkNfSFdfU01CVVNfUElJWDQJMHgwMAotI2RlZmluZSBJMkNfSFdfU01CVVNfQUxJMTVYMwkweDAxCi0jZGVmaW5lIEkyQ19IV19TTUJVU19WSUEyCTB4MDIKLSNkZWZpbmUgSTJDX0hXX1NNQlVTX1ZPT0RPTzMJMHgwMwotI2RlZmluZSBJMkNfSFdfU01CVVNfSTgwMQkweDA0Ci0jZGVmaW5lIEkyQ19IV19TTUJVU19BTUQ3NTYJMHgwNQotI2RlZmluZSBJMkNfSFdfU01CVVNfU0lTNTU5NQkweDA2Ci0jZGVmaW5lIEkyQ19IV19TTUJVU19BTEkxNTM1CTB4MDcKLSNkZWZpbmUgSTJDX0hXX1NNQlVTX1NJUzYzMAkweDA4Ci0jZGVmaW5lIEkyQ19IV19TTUJVU19TSVM5NlgJMHgwOQotI2RlZmluZSBJMkNfSFdfU01CVVNfQU1EODExMQkweDBhCi0jZGVmaW5lIEkyQ19IV19TTUJVU19TQ1gyMDAJMHgwYgotI2RlZmluZSBJMkNfSFdfU01CVVNfTkZPUkNFMgkweDBjCi0jZGVmaW5lIEkyQ19IV19TTUJVU19XOTk2OENGCTB4MGQKLSNkZWZpbmUgSTJDX0hXX1NNQlVTX09WNTExCTB4MGUJLyogT1Y1MTEoKykgVVNCIDEuMSB3ZWJjYW0gSUNzCSovCi0jZGVmaW5lIEkyQ19IV19TTUJVU19PVjUxOAkweDBmCS8qIE9WNTE4KCspIFVTQiAxLjEgd2ViY2FtIElDcwkqLwotI2RlZmluZSBJMkNfSFdfU01CVVNfT1Y1MTkJMHgxMAkvKiBPVjUxOSBVU0IgMS4xIHdlYmNhbSBJQwkqLwotI2RlZmluZSBJMkNfSFdfU01CVVNfT1ZGWDIJMHgxMQkvKiBDeXByZXNzL09tbmlWaXNpb24gRlgyIHdlYmNhbSAqLworI2RlZmluZSBJMkNfSFdfU01CVVNfUElJWDQJMHgwNDAwMDAKKyNkZWZpbmUgSTJDX0hXX1NNQlVTX0FMSTE1WDMJMHgwNDAwMDEKKyNkZWZpbmUgSTJDX0hXX1NNQlVTX1ZJQTIJMHgwNDAwMDIKKyNkZWZpbmUgSTJDX0hXX1NNQlVTX1ZPT0RPTzMJMHgwNDAwMDMKKyNkZWZpbmUgSTJDX0hXX1NNQlVTX0k4MDEJMHgwNDAwMDQKKyNkZWZpbmUgSTJDX0hXX1NNQlVTX0FNRDc1NgkweDA0MDAwNQorI2RlZmluZSBJMkNfSFdfU01CVVNfU0lTNTU5NQkweDA0MDAwNgorI2RlZmluZSBJMkNfSFdfU01CVVNfQUxJMTUzNQkweDA0MDAwNworI2RlZmluZSBJMkNfSFdfU01CVVNfU0lTNjMwCTB4MDQwMDA4CisjZGVmaW5lIEkyQ19IV19TTUJVU19TSVM5NlgJMHgwNDAwMDkKKyNkZWZpbmUgSTJDX0hXX1NNQlVTX0FNRDgxMTEJMHgwNDAwMGEKKyNkZWZpbmUgSTJDX0hXX1NNQlVTX1NDWDIwMAkweDA0MDAwYgorI2RlZmluZSBJMkNfSFdfU01CVVNfTkZPUkNFMgkweDA0MDAwYworI2RlZmluZSBJMkNfSFdfU01CVVNfVzk5NjhDRgkweDA0MDAwZAorI2RlZmluZSBJMkNfSFdfU01CVVNfT1Y1MTEJMHgwNDAwMGUgLyogT1Y1MTEoKykgVVNCIDEuMSB3ZWJjYW0gSUNzICovCisjZGVmaW5lIEkyQ19IV19TTUJVU19PVjUxOAkweDA0MDAwZiAvKiBPVjUxOCgrKSBVU0IgMS4xIHdlYmNhbSBJQ3MgKi8KKyNkZWZpbmUgSTJDX0hXX1NNQlVTX09WNTE5CTB4MDQwMDEwIC8qIE9WNTE5IFVTQiAxLjEgd2ViY2FtIElDICovCisjZGVmaW5lIEkyQ19IV19TTUJVU19PVkZYMgkweDA0MDAxMSAvKiBDeXByZXNzL09tbmlWaXNpb24gRlgyIHdlYmNhbSAqLwogCiAvKiAtLS0gSVNBIHBzZXVkby1hZGFwdGVyCQkJCQkJKi8KLSNkZWZpbmUgSTJDX0hXX0lTQSAweDAwCisjZGVmaW5lIEkyQ19IV19JU0EJCTB4MDUwMDAwCiAKIC8qIC0tLSBJUE1JIHBzZXVkby1hZGFwdGVyCQkJCQkJKi8KLSNkZWZpbmUgSTJDX0hXX0lQTUkgMHgwMAorI2RlZmluZSBJMkNfSFdfSVBNSQkJMHgwYjAwMDAKIAogLyogLS0tIElQTUIgYWRhcHRlcgkJCQkJCSovCi0jZGVmaW5lIEkyQ19IV19JUE1CIDB4MDAKKyNkZWZpbmUgSTJDX0hXX0lQTUIJCTB4MGMwMDAwCiAKIC8qIC0tLSBNQ1AxMDcgYWRhcHRlciAqLwotI2RlZmluZSBJMkNfSFdfTVBDMTA3IDB4MDAKKyNkZWZpbmUgSTJDX0hXX01QQzEwNwkJMHgwZDAwMDAKIAogLyogLS0tIE1hcnZlbGwgbXY2NHh4eCBpMmMgYWRhcHRlciAqLwotI2RlZmluZSBJMkNfSFdfTVY2NFhYWCAweDAwCisjZGVmaW5lIEkyQ19IV19NVjY0WFhYCQkweDE5MDAwMAorCisvKiAtLS0gTWlzY2VsbGFuZW91cyBhZGFwdGVycyAqLworI2RlZmluZSBJMkNfSFdfU0FBNzE0NgkJMHgwNjAwMDAgLyogU0FBNzE0NiB2aWRlbyBkZWNvZGVyIGJ1cyAqLworI2RlZmluZSBJMkNfSFdfU0FBNzEzNAkJMHgwOTAwMDAgLyogU0FBNzEzNCB2aWRlbyBkZWNvZGVyIGJ1cyAqLwogCiAjZW5kaWYgLyogTElOVVhfSTJDX0lEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLWlzYS5oIGIvaW5jbHVkZS9saW51eC9pMmMtaXNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlMzU5OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLWlzYS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBpMmMtaXNhLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIGkyYy1pc2EgcHNldWRvLWkyYy1hZGFwdGVyIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JMkNfSVNBX0gKKyNkZWZpbmUgX0xJTlVYX0kyQ19JU0FfSAorCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKK2V4dGVybiBpbnQgaTJjX2lzYV9hZGRfZHJpdmVyKHN0cnVjdCBpMmNfZHJpdmVyICpkcml2ZXIpOworZXh0ZXJuIGludCBpMmNfaXNhX2RlbF9kcml2ZXIoc3RydWN0IGkyY19kcml2ZXIgKmRyaXZlcik7CisKKy8qIERldGVjdCB3aGV0aGVyIHdlIGFyZSBvbiB0aGUgaXNhIGJ1cy4gVGhpcyBpcyBvbmx5IHVzZWZ1bCB0byBoeWJyaWQKKyAgIChpMmMraXNhKSBkcml2ZXJzLiAqLworI2RlZmluZSBpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHB0cikgXAorICAgICAgICAoKGFkYXBwdHIpLT5pZCA9PSBJMkNfSFdfSVNBKQorI2RlZmluZSBpMmNfaXNfaXNhX2NsaWVudChjbGllbnRwdHIpIFwKKyAgICAgICAgaTJjX2lzX2lzYV9hZGFwdGVyKChjbGllbnRwdHIpLT5hZGFwdGVyKQorCisjZW5kaWYgLyogX0xJTlVYX0kyQ19JU0FfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMtcHhhLmggYi9pbmNsdWRlL2xpbnV4L2kyYy1weGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjNlYWY4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pMmMtcHhhLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBfTElOVVhfSTJDX0FMR09fUFhBX0gKKyNkZWZpbmUgX0xJTlVYX0kyQ19BTEdPX1BYQV9ICisKK3N0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaGVyIHsKKwl2b2lkICgqd3JpdGUpKHZvaWQgKiwgdW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGNoYXIgbmV3dmFsKTsKK307CisKK3N0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaCB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgZW5kOworCXN0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaGVyICpvcHM7CisJdm9pZCAqZGF0YTsKK307CisKKyNkZWZpbmUgSTJDX0VFUFJPTV9FTVVfU0laRSAoMjU2KQorCitzdHJ1Y3QgaTJjX2VlcHJvbV9lbXUgeworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBwdHI7CisJdW5zaWduZWQgaW50IHNlZW5fc3RhcnQ7CisJc3RydWN0IGxpc3RfaGVhZCB3YXRjaDsKKworCXVuc2lnbmVkIGNoYXIgYnl0ZXNbSTJDX0VFUFJPTV9FTVVfU0laRV07Cit9OworCit0eXBlZGVmIGVudW0gaTJjX3NsYXZlX2V2ZW50X2UgeworCUkyQ19TTEFWRV9FVkVOVF9TVEFSVF9SRUFELAorCUkyQ19TTEFWRV9FVkVOVF9TVEFSVF9XUklURSwKKwlJMkNfU0xBVkVfRVZFTlRfU1RPUAorfSBpMmNfc2xhdmVfZXZlbnRfdDsKKworc3RydWN0IGkyY19zbGF2ZV9jbGllbnQgeworCXZvaWQgKmRhdGE7CisJdm9pZCAoKmV2ZW50KSh2b2lkICpwdHIsIGkyY19zbGF2ZV9ldmVudF90IGV2ZW50KTsKKwlpbnQgICgqcmVhZCkgKHZvaWQgKnB0cik7CisJdm9pZCAoKndyaXRlKSh2b2lkICpwdHIsIHVuc2lnbmVkIGludCB2YWwpOworfTsKKworZXh0ZXJuIGludCBpMmNfZWVwcm9tX2VtdV9hZGR3YXRjaGVyKHN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqLCB2b2lkICpkYXRhLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgICAgc3RydWN0IGkyY19lZXByb21fZW11X3dhdGNoZXIgKik7CisKK2V4dGVybiB2b2lkIGkyY19lZXByb21fZW11X2RlbHdhdGNoZXIoc3RydWN0IGkyY19lZXByb21fZW11ICosIHZvaWQgKmRhdGEsIHN0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaGVyICp3YXRjaGVyKTsKKworZXh0ZXJuIHN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqaTJjX3B4YV9nZXRfZWVwcm9tKHZvaWQpOworCisjZW5kaWYgLyogX0xJTlVYX0kyQ19BTEdPX1BYQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy1zZW5zb3IuaCBiL2luY2x1ZGUvbGludXgvaTJjLXNlbnNvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWI2MjUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvaTJjLXNlbnNvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gICAgaTJjLXNlbnNvci5oIC0gUGFydCBvZiB0aGUgaTJjIHBhY2thZ2UKLSAgICB3YXMgb3JpZ2luYWxseSBzZW5zb3JzLmggLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKLSAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKi8KLQotI2lmbmRlZiBfTElOVVhfSTJDX1NFTlNPUl9ICi0jZGVmaW5lIF9MSU5VWF9JMkNfU0VOU09SX0gKLQotLyogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyBkZXRlY3QgaW5mb3JtYXRpb24uCi0gICBGb3JjZSB2YXJpYWJsZXMgb3ZlcnJ1bGUgYWxsIG90aGVyIHZhcmlhYmxlczsgdGhleSBmb3JjZSBhIGRldGVjdGlvbiBvbgotICAgdGhhdCBwbGFjZS4gSWYgYSBzcGVjaWZpYyBjaGlwIGlzIGdpdmVuLCB0aGUgbW9kdWxlIGJsaW5kbHkgYXNzdW1lcyB0aGlzCi0gICBjaGlwIHR5cGUgaXMgcHJlc2VudDsgaWYgYSBnZW5lcmFsIGZvcmNlIChraW5kID09IDApIGlzIGdpdmVuLCB0aGUgbW9kdWxlCi0gICB3aWxsIHN0aWxsIHRyeSB0byBmaWd1cmUgb3V0IHdoYXQgdHlwZSBvZiBjaGlwIGlzIHByZXNlbnQuIFRoaXMgaXMgdXNlZnVsCi0gICBpZiBmb3Igc29tZSByZWFzb25zIHRoZSBkZXRlY3QgZm9yIFNNQnVzIG9yIElTQSBhZGRyZXNzIHNwYWNlIGZpbGxlZAotICAgZmFpbHMuCi0gICBwcm9iZTogaW5zbW9kIHBhcmFtZXRlci4gSW5pdGlhbGl6ZSB0aGlzIGxpc3Qgd2l0aCBJMkNfQ0xJRU5UX0lTQV9FTkQgdmFsdWVzLgotICAgICBBIGxpc3Qgb2YgcGFpcnMuIFRoZSBmaXJzdCB2YWx1ZSBpcyBhIGJ1cyBudW1iZXIgKEFOWV9JMkNfSVNBX0JVUyBmb3IKLSAgICAgdGhlIElTQSBidXMsIC0xIGZvciBhbnkgSTJDIGJ1cyksIHRoZSBzZWNvbmQgaXMgdGhlIGFkZHJlc3MuIAotICAga2luZDogVGhlIGtpbmQgb2YgY2hpcC4gMCBlcXVhbHMgYW55IGNoaXAuCi0qLwotc3RydWN0IGkyY19mb3JjZV9kYXRhIHsKLQl1bnNpZ25lZCBzaG9ydCAqZm9yY2U7Ci0JdW5zaWduZWQgc2hvcnQga2luZDsKLX07Ci0KLS8qIEEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGRldGVjdCBpbmZvcm1hdGlvbi4KLSAgIG5vcm1hbF9pMmM6IGZpbGxlZCBpbiBieSB0aGUgbW9kdWxlIHdyaXRlci4gVGVybWluYXRlZCBieSBJMkNfQ0xJRU5UX0lTQV9FTkQuCi0gICAgIEEgbGlzdCBvZiBJMkMgYWRkcmVzc2VzIHdoaWNoIHNob3VsZCBub3JtYWxseSBiZSBleGFtaW5lZC4KLSAgIG5vcm1hbF9pc2E6IGZpbGxlZCBpbiBieSB0aGUgbW9kdWxlIHdyaXRlci4gVGVybWluYXRlZCBieSBTRU5TT1JTX0lTQV9FTkQuCi0gICAgIEEgbGlzdCBvZiBJU0EgYWRkcmVzc2VzIHdoaWNoIHNob3VsZCBub3JtYWxseSBiZSBleGFtaW5lZC4KLSAgIHByb2JlOiBpbnNtb2QgcGFyYW1ldGVyLiBJbml0aWFsaXplIHRoaXMgbGlzdCB3aXRoIEkyQ19DTElFTlRfSVNBX0VORCB2YWx1ZXMuCi0gICAgIEEgbGlzdCBvZiBwYWlycy4gVGhlIGZpcnN0IHZhbHVlIGlzIGEgYnVzIG51bWJlciAoQU5ZX0kyQ19JU0FfQlVTIGZvcgotICAgICB0aGUgSVNBIGJ1cywgLTEgZm9yIGFueSBJMkMgYnVzKSwgdGhlIHNlY29uZCBpcyB0aGUgYWRkcmVzcy4gVGhlc2UKLSAgICAgYWRkcmVzc2VzIGFyZSBhbHNvIHByb2JlZCwgYXMgaWYgdGhleSB3ZXJlIGluIHRoZSAnbm9ybWFsJyBsaXN0LgotICAgaWdub3JlOiBpbnNtb2QgcGFyYW1ldGVyLiBJbml0aWFsaXplIHRoaXMgbGlzdCB3aXRoIEkyQ19DTElFTlRfSVNBX0VORCB2YWx1ZXMuCi0gICAgIEEgbGlzdCBvZiBwYWlycy4gVGhlIGZpcnN0IHZhbHVlIGlzIGEgYnVzIG51bWJlciAoQU5ZX0kyQ19JU0FfQlVTIGZvcgotICAgICB0aGUgSVNBIGJ1cywgLTEgZm9yIGFueSBJMkMgYnVzKSwgdGhlIHNlY29uZCBpcyB0aGUgSTJDIGFkZHJlc3MuIFRoZXNlCi0gICAgIGFkZHJlc3NlcyBhcmUgbmV2ZXIgcHJvYmVkLiBUaGlzIHBhcmFtZXRlciBvdmVycnVsZXMgJ25vcm1hbCcgYW5kIAotICAgICAncHJvYmUnLCBidXQgbm90IHRoZSAnZm9yY2UnIGxpc3RzLgotICAgZm9yY2VfZGF0YTogaW5zbW9kIHBhcmFtZXRlcnMuIEEgbGlzdCwgZW5kaW5nIHdpdGggYW4gZWxlbWVudCBvZiB3aGljaAotICAgICB0aGUgZm9yY2UgZmllbGQgaXMgTlVMTC4KLSovCi1zdHJ1Y3QgaTJjX2FkZHJlc3NfZGF0YSB7Ci0JdW5zaWduZWQgc2hvcnQgKm5vcm1hbF9pMmM7Ci0JdW5zaWduZWQgaW50ICpub3JtYWxfaXNhOwotCXVuc2lnbmVkIHNob3J0ICpwcm9iZTsKLQl1bnNpZ25lZCBzaG9ydCAqaWdub3JlOwotCXN0cnVjdCBpMmNfZm9yY2VfZGF0YSAqZm9yY2VzOwotfTsKLQotI2RlZmluZSBTRU5TT1JTX01PRFVMRV9QQVJNX0ZPUkNFKG5hbWUpIFwKLSAgSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZV8gIyMgbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB3aGljaCBhcmUgdW5xdWVzdGlvbmFibHkiIFwKLSAgICAgICAgICAgICAgICAgICAgICAiIGFzc3VtZWQgdG8gY29udGFpbiBhIGAiICMgbmFtZSAiJyBjaGlwIikKLQotCi0vKiBUaGlzIGRlZmluZXMgc2V2ZXJhbCBpbnNtb2QgdmFyaWFibGVzLCBhbmQgdGhlIGFkZHJfZGF0YSBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgU0VOU09SU19JTlNNT0QgXAotICBJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKHByb2JlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvIHNjYW4gYWRkaXRpb25hbGx5Iik7IFwKLSAgSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShpZ25vcmUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgbm90IHRvIHNjYW4iKTsgXAotCXN0YXRpYyBzdHJ1Y3QgaTJjX2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CQkJXAotCQkJLm5vcm1hbF9pMmMgPQkJbm9ybWFsX2kyYywJCVwKLQkJCS5ub3JtYWxfaXNhID0JCW5vcm1hbF9pc2EsCQlcCi0JCQkucHJvYmUgPQkJcHJvYmUsCQkJXAotCQkJLmlnbm9yZSA9CQlpZ25vcmUsCQkJXAotCQkJLmZvcmNlcyA9CQlmb3JjZXMsCQkJXAotCQl9Ci0KLS8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNyZWF0ZSBhbiBlbnVtIHdpdGggdGhlIGNoaXAgbmFtZXMgYXMgZWxlbWVudHMuIAotICAgVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGVudW0gaXMgYW55X2NoaXAuIFRoZXNlIGFyZSB0aGUgb25seSBtYWNyb3MKLSAgIGEgbW9kdWxlIHdpbGwgd2FudCB0byB1c2UuICovCi0KLSNkZWZpbmUgU0VOU09SU19JTlNNT0RfMCBcCi0gIGVudW0gY2hpcHMgeyBhbnlfY2hpcCB9OyBcCi0gIEkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsIFwKLSAgICAgICAgICAgICAgICAgICAgICAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gYm9sZGx5IGFzc3VtZSAiIFwKLSAgICAgICAgICAgICAgICAgICAgICAidG8gYmUgcHJlc2VudCIpOyBcCi0gIHN0YXRpYyBzdHJ1Y3QgaTJjX2ZvcmNlX2RhdGEgZm9yY2VzW10gPSB7e2ZvcmNlLGFueV9jaGlwfSx7TlVMTH19OyBcCi0gIFNFTlNPUlNfSU5TTU9ECi0KLSNkZWZpbmUgU0VOU09SU19JTlNNT0RfMShjaGlwMSkgXAotICBlbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxIH07IFwKLSAgSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgXAotICAgICAgICAgICAgICAgICAgICAgICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byBib2xkbHkgYXNzdW1lICIgXAotICAgICAgICAgICAgICAgICAgICAgICJ0byBiZSBwcmVzZW50Iik7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7IFwKLSAgc3RhdGljIHN0cnVjdCBpMmNfZm9yY2VfZGF0YSBmb3JjZXNbXSA9IHt7Zm9yY2UsYW55X2NoaXB9LFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXAxLGNoaXAxfSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMfX07IFwKLSAgU0VOU09SU19JTlNNT0QKLQotI2RlZmluZSBTRU5TT1JTX0lOU01PRF8yKGNoaXAxLGNoaXAyKSBcCi0gIGVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyIH07IFwKLSAgSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgXAotICAgICAgICAgICAgICAgICAgICAgICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byBib2xkbHkgYXNzdW1lICIgXAotICAgICAgICAgICAgICAgICAgICAgICJ0byBiZSBwcmVzZW50Iik7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwMik7IFwKLSAgc3RhdGljIHN0cnVjdCBpMmNfZm9yY2VfZGF0YSBmb3JjZXNbXSA9IHt7Zm9yY2UsYW55X2NoaXB9LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZvcmNlXyAjIyBjaGlwMSxjaGlwMX0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXAyLGNoaXAyfSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMfX07IFwKLSAgU0VOU09SU19JTlNNT0QKLQotI2RlZmluZSBTRU5TT1JTX0lOU01PRF8zKGNoaXAxLGNoaXAyLGNoaXAzKSBcCi0gIGVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyLCBjaGlwMyB9OyBcCi0gIEkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsIFwKLSAgICAgICAgICAgICAgICAgICAgICAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gYm9sZGx5IGFzc3VtZSAiIFwKLSAgICAgICAgICAgICAgICAgICAgICAidG8gYmUgcHJlc2VudCIpOyBcCi0gIFNFTlNPUlNfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOyBcCi0gIFNFTlNPUlNfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDIpOyBcCi0gIFNFTlNPUlNfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDMpOyBcCi0gIHN0YXRpYyBzdHJ1Y3QgaTJjX2ZvcmNlX2RhdGEgZm9yY2VzW10gPSB7e2ZvcmNlLGFueV9jaGlwfSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmb3JjZV8gIyMgY2hpcDEsY2hpcDF9LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZvcmNlXyAjIyBjaGlwMixjaGlwMn0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXAzLGNoaXAzfSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMfX07IFwKLSAgU0VOU09SU19JTlNNT0QKLQotI2RlZmluZSBTRU5TT1JTX0lOU01PRF80KGNoaXAxLGNoaXAyLGNoaXAzLGNoaXA0KSBcCi0gIGVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQgfTsgXAotICBJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvIGJvbGRseSBhc3N1bWUgIiBcCi0gICAgICAgICAgICAgICAgICAgICAgInRvIGJlIHByZXNlbnQiKTsgXAotICBTRU5TT1JTX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAxKTsgXAotICBTRU5TT1JTX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsgXAotICBTRU5TT1JTX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAzKTsgXAotICBTRU5TT1JTX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA0KTsgXAotICBzdGF0aWMgc3RydWN0IGkyY19mb3JjZV9kYXRhIGZvcmNlc1tdID0ge3tmb3JjZSxhbnlfY2hpcH0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXAxLGNoaXAxfSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmb3JjZV8gIyMgY2hpcDIsY2hpcDJ9LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZvcmNlXyAjIyBjaGlwMyxjaGlwM30sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXA0LGNoaXA0fSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMfX07IFwKLSAgU0VOU09SU19JTlNNT0QKLQotI2RlZmluZSBTRU5TT1JTX0lOU01PRF81KGNoaXAxLGNoaXAyLGNoaXAzLGNoaXA0LGNoaXA1KSBcCi0gIGVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQsIGNoaXA1IH07IFwKLSAgSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgXAotICAgICAgICAgICAgICAgICAgICAgICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byBib2xkbHkgYXNzdW1lICIgXAotICAgICAgICAgICAgICAgICAgICAgICJ0byBiZSBwcmVzZW50Iik7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwMik7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwNCk7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwNSk7IFwKLSAgc3RhdGljIHN0cnVjdCBpMmNfZm9yY2VfZGF0YSBmb3JjZXNbXSA9IHt7Zm9yY2UsYW55X2NoaXB9LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZvcmNlXyAjIyBjaGlwMSxjaGlwMX0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXAyLGNoaXAyfSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmb3JjZV8gIyMgY2hpcDMsY2hpcDN9LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZvcmNlXyAjIyBjaGlwNCxjaGlwNH0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXA1LGNoaXA1fSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMfX07IFwKLSAgU0VOU09SU19JTlNNT0QKLQotI2RlZmluZSBTRU5TT1JTX0lOU01PRF82KGNoaXAxLGNoaXAyLGNoaXAzLGNoaXA0LGNoaXA1LGNoaXA2KSBcCi0gIGVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQsIGNoaXA1LCBjaGlwNiB9OyBcCi0gIEkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsIFwKLSAgICAgICAgICAgICAgICAgICAgICAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gYm9sZGx5IGFzc3VtZSAiIFwKLSAgICAgICAgICAgICAgICAgICAgICAidG8gYmUgcHJlc2VudCIpOyBcCi0gIFNFTlNPUlNfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOyBcCi0gIFNFTlNPUlNfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDIpOyBcCi0gIFNFTlNPUlNfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDMpOyBcCi0gIFNFTlNPUlNfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDQpOyBcCi0gIFNFTlNPUlNfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDUpOyBcCi0gIFNFTlNPUlNfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDYpOyBcCi0gIHN0YXRpYyBzdHJ1Y3QgaTJjX2ZvcmNlX2RhdGEgZm9yY2VzW10gPSB7e2ZvcmNlLGFueV9jaGlwfSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmb3JjZV8gIyMgY2hpcDEsY2hpcDF9LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZvcmNlXyAjIyBjaGlwMixjaGlwMn0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXAzLGNoaXAzfSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmb3JjZV8gIyMgY2hpcDQsY2hpcDR9LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZvcmNlXyAjIyBjaGlwNSxjaGlwNX0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXA2LGNoaXA2fSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMfX07IFwKLSAgU0VOU09SU19JTlNNT0QKLQotI2RlZmluZSBTRU5TT1JTX0lOU01PRF83KGNoaXAxLGNoaXAyLGNoaXAzLGNoaXA0LGNoaXA1LGNoaXA2LGNoaXA3KSBcCi0gIGVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQsIGNoaXA1LCBjaGlwNiwgY2hpcDcgfTsgXAotICBJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvIGJvbGRseSBhc3N1bWUgIiBcCi0gICAgICAgICAgICAgICAgICAgICAgInRvIGJlIHByZXNlbnQiKTsgXAotICBTRU5TT1JTX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAxKTsgXAotICBTRU5TT1JTX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsgXAotICBTRU5TT1JTX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAzKTsgXAotICBTRU5TT1JTX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA0KTsgXAotICBTRU5TT1JTX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA1KTsgXAotICBTRU5TT1JTX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA2KTsgXAotICBTRU5TT1JTX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA3KTsgXAotICBzdGF0aWMgc3RydWN0IGkyY19mb3JjZV9kYXRhIGZvcmNlc1tdID0ge3tmb3JjZSxhbnlfY2hpcH0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXAxLGNoaXAxfSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmb3JjZV8gIyMgY2hpcDIsY2hpcDJ9LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZvcmNlXyAjIyBjaGlwMyxjaGlwM30sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXA0LGNoaXA0fSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmb3JjZV8gIyMgY2hpcDUsY2hpcDV9LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZvcmNlXyAjIyBjaGlwNixjaGlwNn0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXA3LGNoaXA3fSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMfX07IFwKLSAgU0VOU09SU19JTlNNT0QKLQotI2RlZmluZSBTRU5TT1JTX0lOU01PRF84KGNoaXAxLGNoaXAyLGNoaXAzLGNoaXA0LGNoaXA1LGNoaXA2LGNoaXA3LGNoaXA4KSBcCi0gIGVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQsIGNoaXA1LCBjaGlwNiwgY2hpcDcsIGNoaXA4IH07IFwKLSAgSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgXAotICAgICAgICAgICAgICAgICAgICAgICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byBib2xkbHkgYXNzdW1lICIgXAotICAgICAgICAgICAgICAgICAgICAgICJ0byBiZSBwcmVzZW50Iik7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwMik7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwNCk7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwNSk7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwNik7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwNyk7IFwKLSAgU0VOU09SU19NT0RVTEVfUEFSTV9GT1JDRShjaGlwOCk7IFwKLSAgc3RhdGljIHN0cnVjdCBpMmNfZm9yY2VfZGF0YSBmb3JjZXNbXSA9IHt7Zm9yY2UsYW55X2NoaXB9LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZvcmNlXyAjIyBjaGlwMSxjaGlwMX0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXAyLGNoaXAyfSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmb3JjZV8gIyMgY2hpcDMsY2hpcDN9LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZvcmNlXyAjIyBjaGlwNCxjaGlwNH0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXA1LGNoaXA1fSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmb3JjZV8gIyMgY2hpcDYsY2hpcDZ9LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZvcmNlXyAjIyBjaGlwNyxjaGlwN30sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yY2VfICMjIGNoaXA4LGNoaXA4fSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMfX07IFwKLSAgU0VOU09SU19JTlNNT0QKLQotLyogRGV0ZWN0IGZ1bmN0aW9uLiBJdCBpdGVyYXRlcyBvdmVyIGFsbCBwb3NzaWJsZSBhZGRyZXNzZXMgaXRzZWxmLiBGb3IKLSAgIFNNQnVzIGFkZHJlc3NlcywgaXQgd2lsbCBvbmx5IGNhbGwgZm91bmRfcHJvYyBpZiBzb21lIGNsaWVudCBpcyBjb25uZWN0ZWQKLSAgIHRvIHRoZSBTTUJ1cyAodW5sZXNzIGEgJ2ZvcmNlJyBtYXRjaGVkKTsgZm9yIElTQSBkZXRlY3Rpb25zLCB0aGlzIGlzIG5vdAotICAgZG9uZS4gKi8KLWV4dGVybiBpbnQgaTJjX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSAgICAgIHN0cnVjdCBpMmNfYWRkcmVzc19kYXRhICphZGRyZXNzX2RhdGEsCi0JCSAgICAgIGludCAoKmZvdW5kX3Byb2MpIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgaW50LCBpbnQpKTsKLQotCi0vKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gc2NhbGUgdXNlci1pbnB1dCB0byBzZW5zaWJsZSB2YWx1ZXMgaW4gYWxtb3N0IGFsbAotICAgY2hpcCBkcml2ZXJzLiAqLwotc3RhdGljIGlubGluZSBpbnQgU0VOU09SU19MSU1JVChsb25nIHZhbHVlLCBsb25nIGxvdywgbG9uZyBoaWdoKQotewotCWlmICh2YWx1ZSA8IGxvdykKLQkJcmV0dXJuIGxvdzsKLQllbHNlIGlmICh2YWx1ZSA+IGhpZ2gpCi0JCXJldHVybiBoaWdoOwotCWVsc2UKLQkJcmV0dXJuIHZhbHVlOwotfQotI2VuZGlmCQkJCS8qIGRlZiBfTElOVVhfSTJDX1NFTlNPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy12aWQuaCBiL2luY2x1ZGUvbGludXgvaTJjLXZpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWQwNjM1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvaTJjLXZpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gICAgaTJjLXZpZC5oIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKLSAgICAgICAgICAgICAgICBtb25pdG9yaW5nCi0gICAgQ29weXJpZ2h0IChjKSAyMDAyIE1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4KLSAgICBXaXRoIGFzc2lzdGFuY2UgZnJvbSBUcmVudCBQaWVwaG8gPHh5enp5QHNwZWFrZWFzeS5vcmc+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSovCi0KLS8qCi0gICAgVGhpcyBmaWxlIGNvbnRhaW5zIGNvbW1vbiBjb2RlIGZvciBkZWNvZGluZyBWSUQgcGlucy4KLSAgICBUaGlzIGZpbGUgaXMgI2luY2x1ZGVkIGluIHZhcmlvdXMgY2hpcCBkcml2ZXJzIGluIHRoaXMgZGlyZWN0b3J5LgotICAgIEFzIHRoZSB1c2VyIGlzIHVubGlrZWx5IHRvIGxvYWQgbW9yZSB0aGFuIG9uZSBkcml2ZXIgd2hpY2gKLSAgICBpbmNsdWRlcyB0aGlzIGNvZGUgd2UgZG9uJ3Qgd29ycnkgYWJvdXQgdGhlIHdhc3RlZCBzcGFjZS4KLSAgICBSZWZlcmVuY2U6IFZSTSB4LnkgREMtREMgQ29udmVydGVyIERlc2lnbiBHdWlkZWxpbmVzLAotICAgIGF2YWlsYWJsZSBhdCBodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbQotKi8KLQotLyoKLSAgICBBTUQgT3B0ZXJvbiBwcm9jZXNzb3JzIGRvbid0IGZvbGxvdyB0aGUgSW50ZWwgVlJNIHNwZWMuCi0gICAgSSdtIGdvaW5nIHRvICJtYWtlIHVwIiAyLjQgYXMgdGhlIFZSTSBzcGVjIGZvciB0aGUgT3B0ZXJvbnMuCi0gICAgTm8gZ29vZCByZWFzb24ganVzdCBhIG1uZW1vbmljIGZvciB0aGUgMjR4IE9wdGVyb24gcHJvY2Vzc29yCi0gICAgc2VyaWVzCi0KLSAgICBPcHRlcm9uIFZJRCBlbmNvZGluZyBpczoKLQotICAgICAgIDAwMDAwICA9ICAxLjU1MCBWCi0gICAgICAgMDAwMDEgID0gIDEuNTI1IFYKLSAgICAgICAgLiAuIC4gLgotICAgICAgIDExMTEwICA9ICAwLjgwMCBWCi0gICAgICAgMTExMTEgID0gIDAuMDAwIFYgKG9mZikKLSAqLwotCi0vKgotICAgIExlZ2FsIHZhbCB2YWx1ZXMgMHgwMCAtIDB4MWY7IGV4Y2VwdCBmb3IgVlJEIDEwLjAsIDB4MDAgLSAweDNmLgotICAgIHZybSBpcyB0aGUgSW50ZWwgVlJNIGRvY3VtZW50IHZlcnNpb24uCi0gICAgTm90ZTogdnJtIHZlcnNpb24gaXMgc2NhbGVkIGJ5IDEwIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHNjYWxlZCBieSAxMDAwCi0gICAgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgaW4gdGhlIGtlcm5lbC4KLSovCi0KLWludCBpMmNfd2hpY2hfdnJtKHZvaWQpOwotCi0jZGVmaW5lIERFRkFVTFRfVlJNCTgyCi0KLXN0YXRpYyBpbmxpbmUgaW50IHZpZF9mcm9tX3JlZyhpbnQgdmFsLCBpbnQgdnJtKQotewotCWludCB2aWQ7Ci0KLQlzd2l0Y2godnJtKSB7Ci0KLQljYXNlICAwOgotCQlyZXR1cm4gMDsKLQotCWNhc2UgMTAwOiAgICAgICAgICAgICAgIC8qIFZSRCAxMC4wICovCi0JCWlmKCh2YWwgJiAweDFmKSA9PSAweDFmKQotCQkJcmV0dXJuIDA7Ci0JCWlmKCh2YWwgJiAweDFmKSA8PSAweDA5IHx8IHZhbCA9PSAweDBhKQotCQkJdmlkID0gMTA4NzUgLSAodmFsICYgMHgxZikgKiAyNTA7Ci0JCWVsc2UKLQkJCXZpZCA9IDE4NjI1IC0gKHZhbCAmIDB4MWYpICogMjUwOwotCQlpZih2YWwgJiAweDIwKQotCQkJdmlkIC09IDEyNTsKLQkJdmlkIC89IDEwOyAgICAgIC8qIG9ubHkgcmV0dXJuIDMgZGVjLiBwbGFjZXMgZm9yIG5vdyAqLwotCQlyZXR1cm4gdmlkOwotCi0JY2FzZSAyNDogICAgICAgICAgICAgICAgLyogT3B0ZXJvbiBwcm9jZXNzb3IgKi8KLQkJcmV0dXJuKHZhbCA9PSAweDFmID8gMCA6IDE1NTAgLSB2YWwgKiAyNSk7Ci0KLQljYXNlIDkxOgkJLyogVlJNIDkuMSAqLwotCWNhc2UgOTA6CQkvKiBWUk0gOS4wICovCi0JCXJldHVybih2YWwgPT0gMHgxZiA/IDAgOgotCQkgICAgICAgICAgICAgICAgICAgICAgIDE4NTAgLSB2YWwgKiAyNSk7Ci0KLQljYXNlIDg1OgkJLyogVlJNIDguNSAqLwotCQlyZXR1cm4oKHZhbCAmIDB4MTAgID8gMjUgOiAwKSArCi0JCSAgICAgICAoKHZhbCAmIDB4MGYpID4gMHgwNCA/IDIwNTAgOiAxMjUwKSAtCi0JCSAgICAgICAoKHZhbCAmIDB4MGYpICogNTApKTsKLQotCWNhc2UgODQ6CQkvKiBWUk0gOC40ICovCi0JCXZhbCAmPSAweDBmOwotCQkJCS8qIGZhbGwgdGhyb3VnaCAqLwotCWRlZmF1bHQ6CQkvKiBWUk0gOC4yICovCi0JCXJldHVybih2YWwgPT0gMHgxZiA/IDAgOgotCQkgICAgICAgdmFsICYgMHgxMCAgPyA1MTAwIC0gKHZhbCkgKiAxMDAgOgotCQkgICAgICAgICAgICAgICAgICAgICAyMDUwIC0gKHZhbCkgKiA1MCk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIGludCB2aWRfdG9fcmVnKGludCB2YWwsIGludCB2cm0pCi17Ci0Jc3dpdGNoICh2cm0pIHsKLQljYXNlIDkxOgkJLyogVlJNIDkuMSAqLwotCWNhc2UgOTA6CQkvKiBWUk0gOS4wICovCi0JCXJldHVybiAoKHZhbCA+PSAxMTAwKSAmJiAodmFsIDw9IDE4NTApID8KLQkJCSgoMTg0OTkgLSB2YWwgKiAxMCkgLyAyNSArIDUpIC8gMTAgOiAtMSk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLmggYi9pbmNsdWRlL2xpbnV4L2kyYy5oCmluZGV4IGJlODM3YjEuLmJlMzUzMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMuaApAQCAtMzQsNiArMzQsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4JLyogZm9yIHN0cnVjdCBkZXZpY2UgKi8KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKKy8qIC0tLSBGb3IgaTJjLWlzYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiB2b2lkIGkyY19hZGFwdGVyX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IGRldmljZV9kcml2ZXIgaTJjX2FkYXB0ZXJfZHJpdmVyOworZXh0ZXJuIHN0cnVjdCBjbGFzcyBpMmNfYWRhcHRlcl9jbGFzczsKK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgaTJjX2J1c190eXBlOworCiAvKiAtLS0gR2VuZXJhbCBvcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwogCiBzdHJ1Y3QgaTJjX21zZzsKQEAgLTQxLDcgKzQ4LDYgQEAKIHN0cnVjdCBpMmNfYWRhcHRlcjsKIHN0cnVjdCBpMmNfY2xpZW50Owogc3RydWN0IGkyY19kcml2ZXI7Ci1zdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGE7CiB1bmlvbiBpMmNfc21idXNfZGF0YTsKIAogLyoKQEAgLTE0MywxMiArMTQ5LDkgQEAKICAqLwogc3RydWN0IGkyY19jbGllbnQgewogCXVuc2lnbmVkIGludCBmbGFnczsJCS8qIGRpdi4sIHNlZSBiZWxvdwkJKi8KLQl1bnNpZ25lZCBpbnQgYWRkcjsJCS8qIGNoaXAgYWRkcmVzcyAtIE5PVEU6IDdiaXQgCSovCisJdW5zaWduZWQgc2hvcnQgYWRkcjsJCS8qIGNoaXAgYWRkcmVzcyAtIE5PVEU6IDdiaXQgCSovCiAJCQkJCS8qIGFkZHJlc3NlcyBhcmUgc3RvcmVkIGluIHRoZQkqLwotCQkJCQkvKiBfTE9XRVJfIDcgYml0cyBvZiB0aGlzIGNoYXIJKi8KLQkvKiBhZGRyOiB1bnNpZ25lZCBpbnQgdG8gbWFrZSBsbV9zZW5zb3JzIGkyYy1pc2EgYWRhcHRlciB3b3JrCi0JICBtb3JlIGNsZWFubHkuIEl0IGRvZXMgbm90IHRha2UgYW55IG1vcmUgbWVtb3J5IHNwYWNlLCBkdWUgdG8KLQkgIGFsaWdubWVudCBjb25zaWRlcmF0aW9ucyAqLworCQkJCQkvKiBfTE9XRVJfIDcgYml0cwkJKi8KIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXI7CS8qIHRoZSBhZGFwdGVyIHdlIHNpdCBvbgkqLwogCXN0cnVjdCBpMmNfZHJpdmVyICpkcml2ZXI7CS8qIGFuZCBvdXIgYWNjZXNzIHJvdXRpbmVzCSovCiAJaW50IHVzYWdlX2NvdW50OwkJLyogSG93IG1hbnkgYWNjZXNzZXMgY3VycmVudGx5ICAqLwpAQCAtMTYwLDYgKzE2MywxMSBAQAogfTsKICNkZWZpbmUgdG9faTJjX2NsaWVudChkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGkyY19jbGllbnQsIGRldikKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgaTJjX2NsaWVudCAqa29ial90b19pMmNfY2xpZW50KHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXJldHVybiB0b19pMmNfY2xpZW50KGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCAqaTJjX2dldF9jbGllbnRkYXRhIChzdHJ1Y3QgaTJjX2NsaWVudCAqZGV2KQogewogCXJldHVybiBkZXZfZ2V0X2RydmRhdGEgKCZkZXYtPmRldik7CkBAIC0xNzAsMTMgKzE3OCw2IEBACiAJZGV2X3NldF9kcnZkYXRhICgmZGV2LT5kZXYsIGRhdGEpOwogfQogCi0jZGVmaW5lIEkyQ19ERVZOQU1FKHN0cikJLm5hbWUgPSBzdHIKLQotc3RhdGljIGlubGluZSBjaGFyICppMmNfY2xpZW50bmFtZShzdHJ1Y3QgaTJjX2NsaWVudCAqYykKLXsKLQlyZXR1cm4gJmMtPm5hbWVbMF07Ci19Ci0KIC8qCiAgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHMgYXJlIGZvciB0aG9zZSB3aG8gbGlrZSB0byBpbXBsZW1lbnQgbmV3IGJ1cyBkcml2ZXJzOgogICogaTJjX2FsZ29yaXRobSBpcyB0aGUgaW50ZXJmYWNlIHRvIGEgY2xhc3Mgb2YgaGFyZHdhcmUgc29sdXRpb25zIHdoaWNoIGNhbgpAQCAtMTg0LDkgKzE4NSw2IEBACiAgKiB0byBuYW1lIHR3byBvZiB0aGUgbW9zdCBjb21tb24uCiAgKi8KIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHsKLQljaGFyIG5hbWVbMzJdOwkJCQkvKiB0ZXh0dWFsIGRlc2NyaXB0aW9uIAkqLwotCXVuc2lnbmVkIGludCBpZDsKLQogCS8qIElmIGFuIGFkYXB0ZXIgYWxnb3JpdGhtIGNhbid0IGRvIEkyQy1sZXZlbCBhY2Nlc3MsIHNldCBtYXN0ZXJfeGZlcgogCSAgIHRvIE5VTEwuIElmIGFuIGFkYXB0ZXIgYWxnb3JpdGhtIGNhbiBkbyBTTUJ1cyBhY2Nlc3MsIHNldCAKIAkgICBzbWJ1c194ZmVyLiBJZiBzZXQgdG8gTlVMTCwgdGhlIFNNQnVzIHByb3RvY29sIGlzIHNpbXVsYXRlZApAQCAtMjE0LDggKzIxMiw3IEBACiAgKi8KIHN0cnVjdCBpMmNfYWRhcHRlciB7CiAJc3RydWN0IG1vZHVsZSAqb3duZXI7Ci0JdW5zaWduZWQgaW50IGlkOy8qID09IGlzIGFsZ28tPmlkIHwgaHdkZXAuc3RydWN0LT5pZCwgCQkqLwotCQkJLyogZm9yIHJlZ2lzdGVyZWQgdmFsdWVzIHNlZSBiZWxvdwkJKi8KKwl1bnNpZ25lZCBpbnQgaWQ7CiAJdW5zaWduZWQgaW50IGNsYXNzOwogCXN0cnVjdCBpMmNfYWxnb3JpdGhtICphbGdvOy8qIHRoZSBhbGdvcml0aG0gdG8gYWNjZXNzIHRoZSBidXMJKi8KIAl2b2lkICphbGdvX2RhdGE7CkBAIC0yOTIsMTIgKzI4OSwxMSBAQAogCXVuc2lnbmVkIHNob3J0ICpub3JtYWxfaTJjOwogCXVuc2lnbmVkIHNob3J0ICpwcm9iZTsKIAl1bnNpZ25lZCBzaG9ydCAqaWdub3JlOwotCXVuc2lnbmVkIHNob3J0ICpmb3JjZTsKKwl1bnNpZ25lZCBzaG9ydCAqKmZvcmNlczsKIH07CiAKIC8qIEludGVybmFsIG51bWJlcnMgdG8gdGVybWluYXRlIGxpc3RzICovCiAjZGVmaW5lIEkyQ19DTElFTlRfRU5ECQkweGZmZmVVCi0jZGVmaW5lIEkyQ19DTElFTlRfSVNBX0VORAkweGZmZmVmZmZlVQogCiAvKiBUaGUgbnVtYmVycyB0byB1c2UgdG8gc2V0IEkyQyBidXMgYWRkcmVzcyAqLwogI2RlZmluZSBBTllfSTJDX0JVUwkJMHhmZmZmCkBAIC0zNTYsMTAgKzM1Miw2IEBACiAgKi8KIGV4dGVybiBpbnQgaTJjX2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKix1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCi0vKiBUaGlzIGNhbGwgcmV0dXJucyBhIHVuaXF1ZSBsb3cgaWRlbnRpZmllciBmb3IgZWFjaCByZWdpc3RlcmVkIGFkYXB0ZXIsCi0gKiBvciAtMSBpZiB0aGUgYWRhcHRlciB3YXMgbm90IHJlZ2lzdGVyZWQuIAotICovCi1leHRlcm4gaW50IGkyY19hZGFwdGVyX2lkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCk7CiBleHRlcm4gc3RydWN0IGkyY19hZGFwdGVyKiBpMmNfZ2V0X2FkYXB0ZXIoaW50IGlkKTsKIGV4dGVybiB2b2lkIGkyY19wdXRfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApOwogCkBAIC0zNzYsNiArMzY4LDEyIEBACiAJcmV0dXJuIChmdW5jICYgaTJjX2dldF9mdW5jdGlvbmFsaXR5KGFkYXApKSA9PSBmdW5jOwogfQogCisvKiBSZXR1cm4gaWQgbnVtYmVyIGZvciBhIHNwZWNpZmljIGFkYXB0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGkyY19hZGFwdGVyX2lkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gYWRhcC0+bnI7Cit9CisKIC8qCiAgKiBJMkMgTWVzc2FnZSAtIHVzZWQgZm9yIHB1cmUgaTJjIHRyYW5zYWN0aW9uLCBhbHNvIGZyb20gL2RldiBpbnRlcmZhY2UKICAqLwpAQCAtNTEwLDkgKzUwOCw2IEBACiAjZGVmaW5lIEkyQ19GVU5DUwkweDA3MDUJLyogR2V0IHRoZSBhZGFwdGVyIGZ1bmN0aW9uYWxpdHkgKi8KICNkZWZpbmUgSTJDX1JEV1IJMHgwNzA3CS8qIENvbWJpbmVkIFIvVyB0cmFuc2ZlciAob25lIHN0b3Agb25seSkqLwogI2RlZmluZSBJMkNfUEVDCQkweDA3MDgJLyogIT0gMCBmb3IgU01CdXMgUEVDICAgICAgICAgICAgICAgICAgICovCi0jaWYgMAotI2RlZmluZSBJMkNfQUNLX1RFU1QJMHgwNzEwCS8qIFNlZSBpZiBhIHNsYXZlIGlzIGF0IGEgc3BlY2lmaWMgYWRkcmVzcyAqLwotI2VuZGlmCiAKICNkZWZpbmUgSTJDX1NNQlVTCTB4MDcyMAkvKiBTTUJ1cy1sZXZlbCBhY2Nlc3MgKi8KIApAQCAtNTU2LDI3ICs1NTEsMTQ4IEBACiAgIG1vZHVsZV9wYXJhbV9hcnJheSh2YXIsIHNob3J0LCAmdmFyIyNfbnVtLCAwKTsgXAogICBNT0RVTEVfUEFSTV9ERVNDKHZhcixkZXNjKQogCi0vKiBUaGlzIGlzIHRoZSBvbmUgeW91IHdhbnQgdG8gdXNlIGluIHlvdXIgb3duIG1vZHVsZXMgKi8KKyNkZWZpbmUgSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShuYW1lKQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlXyMjbmFtZSwJCQkJCVwKKwkJICAgICAgICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB3aGljaCBhcmUgIglcCisJCSAgICAgICAidW5xdWVzdGlvbmFibHkgYXNzdW1lZCB0byBjb250YWluIGEgYCIJCVwKKwkJICAgICAgICMgbmFtZSAiJyBjaGlwIikKKworCisjZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EX0NPTU1PTgkJCQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShwcm9iZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvIHNjYW4gIglcCisJCSAgICAgICAiYWRkaXRpb25hbGx5Iik7CQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGlnbm9yZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIG5vdCB0byAiCVwKKwkJICAgICAgICJzY2FuIik7CQkJCQkJXAorc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CQkJXAorCS5ub3JtYWxfaTJjCT0gbm9ybWFsX2kyYywJCQkJCVwKKwkucHJvYmUJCT0gcHJvYmUsCQkJCQlcCisJLmlnbm9yZQkJPSBpZ25vcmUsCQkJCQlcCisJLmZvcmNlcwkJPSBmb3JjZXMsCQkJCQlcCit9CisKKy8qIFRoZXNlIGFyZSB0aGUgb25lcyB5b3Ugd2FudCB0byB1c2UgaW4geW91ciBvd24gZHJpdmVycy4gUGljayB0aGUgb25lCisgICB3aGljaCBtYXRjaGVzIHRoZSBudW1iZXIgb2YgZGV2aWNlcyB0aGUgZHJpdmVyIGRpZmZlcmVuY2lhdGVzIGJldHdlZW4uICovCiAjZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EIFwKLSAgSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShwcm9iZSwgXAotICAgICAgICAgICAgICAgICAgICAgICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byBzY2FuIGFkZGl0aW9uYWxseSIpOyBcCi0gIEkyQ19DTElFTlRfTU9EVUxFX1BBUk0oaWdub3JlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIG5vdCB0byBzY2FuIik7IFwKICAgSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgXAogICAgICAgICAgICAgICAgICAgICAgICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byBib2xkbHkgYXNzdW1lICIgXAogICAgICAgICAgICAgICAgICAgICAgICJ0byBiZSBwcmVzZW50Iik7IFwKLQlzdGF0aWMgc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsJCVwKLQkJCS5ub3JtYWxfaTJjID0gCQlub3JtYWxfaTJjLAkJXAotCQkJLnByb2JlID0JCXByb2JlLAkJCVwKLQkJCS5pZ25vcmUgPQkJaWdub3JlLAkJCVwKLQkJCS5mb3JjZSA9CQlmb3JjZSwJCQlcCi0JCX0KKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmZvcmNlc1tdID0gewkJCQlcCisJCQlmb3JjZSwJCQkJCQlcCisJCQlOVUxMCQkJCQkJXAorCQl9OwkJCQkJCQlcCitJMkNfQ0xJRU5UX0lOU01PRF9DT01NT04KIAotLyogRGV0ZWN0IHdoZXRoZXIgd2UgYXJlIG9uIHRoZSBpc2EgYnVzLiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgYWxsIGkyYwotICAgYWNjZXNzIHdpbGwgZmFpbCEgKi8KLSNkZWZpbmUgaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50cHRyKSBcCi0gICAgICAgICgoY2xpZW50cHRyKS0+YWRhcHRlci0+YWxnby0+aWQgPT0gSTJDX0FMR09fSVNBKQotI2RlZmluZSBpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHB0cikgXAotICAgICAgICAoKGFkYXBwdHIpLT5hbGdvLT5pZCA9PSBJMkNfQUxHT19JU0EpCisjZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzEoY2hpcDEpCQkJCQlcCitlbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxIH07CQkJCQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvICIJXAorCQkgICAgICAgImJvbGRseSBhc3N1bWUgdG8gYmUgcHJlc2VudCIpOwkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOwkJCQkJXAorc3RhdGljIHVuc2lnbmVkIHNob3J0ICpmb3JjZXNbXSA9IHsgZm9yY2UsIGZvcmNlXyMjY2hpcDEsIE5VTEwgfTsJXAorSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCisKKyNkZWZpbmUgSTJDX0NMSUVOVF9JTlNNT0RfMihjaGlwMSwgY2hpcDIpCQkJCVwKK2VudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyIH07CQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gIglcCisJCSAgICAgICAiYm9sZGx5IGFzc3VtZSB0byBiZSBwcmVzZW50Iik7CQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7CQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsJCQkJCVwKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLAkJXAorCQkJCSAgICBmb3JjZV8jI2NoaXAyLCBOVUxMIH07CQlcCitJMkNfQ0xJRU5UX0lOU01PRF9DT01NT04KKworI2RlZmluZSBJMkNfQ0xJRU5UX0lOU01PRF8zKGNoaXAxLCBjaGlwMiwgY2hpcDMpCQkJXAorZW51bSBjaGlwcyB7IGFueV9jaGlwLCBjaGlwMSwgY2hpcDIsIGNoaXAzIH07CQkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byAiCVwKKwkJICAgICAgICJib2xkbHkgYXNzdW1lIHRvIGJlIHByZXNlbnQiKTsJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAxKTsJCQkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDIpOwkJCQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7CQkJCQlcCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmZvcmNlc1tdID0geyBmb3JjZSwgZm9yY2VfIyNjaGlwMSwJCVwKKwkJCQkgICAgZm9yY2VfIyNjaGlwMiwgZm9yY2VfIyNjaGlwMywJXAorCQkJCSAgICBOVUxMIH07CQkJCVwKK0kyQ19DTElFTlRfSU5TTU9EX0NPTU1PTgorCisjZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzQoY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQpCQkJXAorZW51bSBjaGlwcyB7IGFueV9jaGlwLCBjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCB9OwkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byAiCVwKKwkJICAgICAgICJib2xkbHkgYXNzdW1lIHRvIGJlIHByZXNlbnQiKTsJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAxKTsJCQkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDIpOwkJCQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7CQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA0KTsJCQkJCVwKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLAkJXAorCQkJCSAgICBmb3JjZV8jI2NoaXAyLCBmb3JjZV8jI2NoaXAzLAlcCisJCQkJICAgIGZvcmNlXyMjY2hpcDQsIE5VTEx9OwkJXAorSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCisKKyNkZWZpbmUgSTJDX0NMSUVOVF9JTlNNT0RfNShjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCwgY2hpcDUpCQlcCitlbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSB9OwkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvICIJXAorCQkgICAgICAgImJvbGRseSBhc3N1bWUgdG8gYmUgcHJlc2VudCIpOwkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOwkJCQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMik7CQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAzKTsJCQkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDQpOwkJCQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNSk7CQkJCQlcCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmZvcmNlc1tdID0geyBmb3JjZSwgZm9yY2VfIyNjaGlwMSwJCVwKKwkJCQkgICAgZm9yY2VfIyNjaGlwMiwgZm9yY2VfIyNjaGlwMywJXAorCQkJCSAgICBmb3JjZV8jI2NoaXA0LCBmb3JjZV8jI2NoaXA1LAlcCisJCQkJICAgIE5VTEwgfTsJCQkJXAorSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCisKKyNkZWZpbmUgSTJDX0NMSUVOVF9JTlNNT0RfNihjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCwgY2hpcDUsIGNoaXA2KQlcCitlbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSwgY2hpcDYgfTsJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvICIJXAorCQkgICAgICAgImJvbGRseSBhc3N1bWUgdG8gYmUgcHJlc2VudCIpOwkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOwkJCQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMik7CQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAzKTsJCQkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDQpOwkJCQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNSk7CQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA2KTsJCQkJCVwKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLAkJXAorCQkJCSAgICBmb3JjZV8jI2NoaXAyLCBmb3JjZV8jI2NoaXAzLAlcCisJCQkJICAgIGZvcmNlXyMjY2hpcDQsIGZvcmNlXyMjY2hpcDUsCVwKKwkJCQkgICAgZm9yY2VfIyNjaGlwNiwgTlVMTCB9OwkJXAorSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCisKKyNkZWZpbmUgSTJDX0NMSUVOVF9JTlNNT0RfNyhjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCwgY2hpcDUsIGNoaXA2LCBjaGlwNykgXAorZW51bSBjaGlwcyB7IGFueV9jaGlwLCBjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCwgY2hpcDUsIGNoaXA2LAlcCisJICAgICBjaGlwNyB9OwkJCQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gIglcCisJCSAgICAgICAiYm9sZGx5IGFzc3VtZSB0byBiZSBwcmVzZW50Iik7CQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7CQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsJCQkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDMpOwkJCQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNCk7CQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA1KTsJCQkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDYpOwkJCQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNyk7CQkJCQlcCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmZvcmNlc1tdID0geyBmb3JjZSwgZm9yY2VfIyNjaGlwMSwJCVwKKwkJCQkgICAgZm9yY2VfIyNjaGlwMiwgZm9yY2VfIyNjaGlwMywJXAorCQkJCSAgICBmb3JjZV8jI2NoaXA0LCBmb3JjZV8jI2NoaXA1LAlcCisJCQkJICAgIGZvcmNlXyMjY2hpcDYsIGZvcmNlXyMjY2hpcDcsCVwKKwkJCQkgICAgTlVMTCB9OwkJCQlcCitJMkNfQ0xJRU5UX0lOU01PRF9DT01NT04KKworI2RlZmluZSBJMkNfQ0xJRU5UX0lOU01PRF84KGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSwgY2hpcDYsIGNoaXA3LCBjaGlwOCkgXAorZW51bSBjaGlwcyB7IGFueV9jaGlwLCBjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCwgY2hpcDUsIGNoaXA2LAlcCisJICAgICBjaGlwNywgY2hpcDggfTsJCQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gIglcCisJCSAgICAgICAiYm9sZGx5IGFzc3VtZSB0byBiZSBwcmVzZW50Iik7CQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7CQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsJCQkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDMpOwkJCQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNCk7CQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA1KTsJCQkJCVwKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDYpOwkJCQkJXAorSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNyk7CQkJCQlcCitJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA4KTsJCQkJCVwKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLAkJXAorCQkJCSAgICBmb3JjZV8jI2NoaXAyLCBmb3JjZV8jI2NoaXAzLAlcCisJCQkJICAgIGZvcmNlXyMjY2hpcDQsIGZvcmNlXyMjY2hpcDUsCVwKKwkJCQkgICAgZm9yY2VfIyNjaGlwNiwgZm9yY2VfIyNjaGlwNywJXAorCQkJCSAgICBmb3JjZV8jI2NoaXA4LCBOVUxMIH07CQlcCitJMkNfQ0xJRU5UX0lOU01PRF9DT01NT04KIAogI2VuZGlmIC8qIF9MSU5VWF9JMkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl90dW4uaCBiL2luY2x1ZGUvbGludXgvaWZfdHVuLmgKaW5kZXggMDk2YTg1YS4uODhhZWY3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl90dW4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3R1bi5oCkBAIC03Nyw2ICs3Nyw3IEBACiAjZGVmaW5lIFRVTlNFVElGRiAgICAgX0lPVygnVCcsIDIwMiwgaW50KSAKICNkZWZpbmUgVFVOU0VUUEVSU0lTVCBfSU9XKCdUJywgMjAzLCBpbnQpIAogI2RlZmluZSBUVU5TRVRPV05FUiAgIF9JT1coJ1QnLCAyMDQsIGludCkKKyNkZWZpbmUgVFVOU0VUTElOSyAgICBfSU9XKCdUJywgMjA1LCBpbnQpCiAKIC8qIFRVTlNFVElGRiBpZnIgZmxhZ3MgKi8KICNkZWZpbmUgSUZGX1RVTgkJMHgwMDAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luNi5oIGIvaW5jbHVkZS9saW51eC9pbjYuaAppbmRleCBkY2Y1NzIwLi4zMDRhYWVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luNi5oCisrKyBiL2luY2x1ZGUvbGludXgvaW42LmgKQEAgLTE0OCwxMyArMTQ4LDEzIEBACiAgKi8KIAogI2RlZmluZSBJUFY2X0FERFJGT1JNCQkxCi0jZGVmaW5lIElQVjZfUEtUSU5GTwkJMgotI2RlZmluZSBJUFY2X0hPUE9QVFMJCTMKLSNkZWZpbmUgSVBWNl9EU1RPUFRTCQk0Ci0jZGVmaW5lIElQVjZfUlRIRFIJCTUKLSNkZWZpbmUgSVBWNl9QS1RPUFRJT05TCQk2CisjZGVmaW5lIElQVjZfMjI5MlBLVElORk8JMgorI2RlZmluZSBJUFY2XzIyOTJIT1BPUFRTCTMKKyNkZWZpbmUgSVBWNl8yMjkyRFNUT1BUUwk0CisjZGVmaW5lIElQVjZfMjI5MlJUSERSCQk1CisjZGVmaW5lIElQVjZfMjI5MlBLVE9QVElPTlMJNgogI2RlZmluZSBJUFY2X0NIRUNLU1VNCQk3Ci0jZGVmaW5lIElQVjZfSE9QTElNSVQJCTgKKyNkZWZpbmUgSVBWNl8yMjkySE9QTElNSVQJOAogI2RlZmluZSBJUFY2X05FWFRIT1AJCTkKICNkZWZpbmUgSVBWNl9BVVRISERSCQkxMAkvKiBvYnNvbGV0ZSAqLwogI2RlZmluZSBJUFY2X0ZMT1dJTkZPCQkxMQpAQCAtMTk4LDQgKzE5OCw0NCBAQAogICogTUNBU1RfTVNGSUxURVIJCTQ4CiAgKi8KIAorLyoKKyAqIEFkdmFuY2VkIEFQSSAoUkZDMzU0MikgKDEpCisgKgorICogTm90ZTogSVBWNl9SRUNWUlRIRFJEU1RPUFRTIGRvZXMgbm90IGV4aXN0LiBzZWUgbmV0L2lwdjYvZGF0YWdyYW0uYy4KKyAqLworCisjZGVmaW5lIElQVjZfUkVDVlBLVElORk8JNDkKKyNkZWZpbmUgSVBWNl9QS1RJTkZPCQk1MAorI2RlZmluZSBJUFY2X1JFQ1ZIT1BMSU1JVAk1MQorI2RlZmluZSBJUFY2X0hPUExJTUlUCQk1MgorI2RlZmluZSBJUFY2X1JFQ1ZIT1BPUFRTCTUzCisjZGVmaW5lIElQVjZfSE9QT1BUUwkJNTQKKyNkZWZpbmUgSVBWNl9SVEhEUkRTVE9QVFMJNTUKKyNkZWZpbmUgSVBWNl9SRUNWUlRIRFIJCTU2CisjZGVmaW5lIElQVjZfUlRIRFIJCTU3CisjZGVmaW5lIElQVjZfUkVDVkRTVE9QVFMJNTgKKyNkZWZpbmUgSVBWNl9EU1RPUFRTCQk1OQorI2lmIDAJLyogbm90IHlldCAqLworI2RlZmluZSBJUFY2X1JFQ1ZQQVRITVRVCTYwCisjZGVmaW5lIElQVjZfUEFUSE1UVQkJNjEKKyNkZWZpbmUgSVBWNl9ET05URlJBRwkJNjIKKyNkZWZpbmUgSVBWNl9VU0VfTUlOX01UVQk2MworI2VuZGlmCisKKy8qCisgKiBOZXRmaWx0ZXIKKyAqCisgKiBGb2xsb3dpbmcgc29ja2V0IG9wdGlvbnMgYXJlIHVzZWQgaW4gaXA2X3RhYmxlczsKKyAqIHNlZSBpbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaC4KKyAqCisgKiBJUDZUX1NPX1NFVF9SRVBMQUNFIC8gSVA2VF9TT19HRVRfSU5GTwkJNjQKKyAqIElQNlRfU09fU0VUX0FERF9DT1VOVEVSUyAvIElQNlRfU09fR0VUX0VOVFJJRVMJNjUKKyAqLworCisvKgorICogQWR2YW5jZWQgQVBJIChSRkMzNTQyKSAoMikKKyAqLworI2RlZmluZSBJUFY2X1JFQ1ZUQ0xBU1MJCTY2CisjZGVmaW5lIElQVjZfVENMQVNTCQk2NworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmggYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCmluZGV4IGM3MjdjMTk1Li42OGFiNWYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKQEAgLTIsMTcgKzIsMjcgQEAKICNkZWZpbmUgX0xJTlVYX19JTklUX1RBU0tfSAogCiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAKLSNkZWZpbmUgSU5JVF9GSUxFUyBcCi17IAkJCQkJCQlcCi0JLmNvdW50CQk9IEFUT01JQ19JTklUKDEpLCAJCVwKLQkuZmlsZV9sb2NrCT0gU1BJTl9MT0NLX1VOTE9DS0VELCAJCVwKKyNkZWZpbmUgSU5JVF9GRFRBQkxFIFwKK3sJCQkJCQkJXAogCS5tYXhfZmRzCT0gTlJfT1BFTl9ERUZBVUxULCAJCVwKIAkubWF4X2Zkc2V0CT0gX19GRF9TRVRTSVpFLCAJCVwKIAkubmV4dF9mZAk9IDAsIAkJCQlcCiAJLmZkCQk9ICZpbml0X2ZpbGVzLmZkX2FycmF5WzBdLCAJXAogCS5jbG9zZV9vbl9leGVjCT0gJmluaXRfZmlsZXMuY2xvc2Vfb25fZXhlY19pbml0LCBcCiAJLm9wZW5fZmRzCT0gJmluaXRfZmlsZXMub3Blbl9mZHNfaW5pdCwgCVwKKwkucmN1CQk9IFJDVV9IRUFEX0lOSVQsIAkJXAorCS5mcmVlX2ZpbGVzCT0gTlVMTCwJCSAJCVwKKwkubmV4dAkJPSBOVUxMLAkJIAkJXAorfQorCisjZGVmaW5lIElOSVRfRklMRVMgXAoreyAJCQkJCQkJXAorCS5jb3VudAkJPSBBVE9NSUNfSU5JVCgxKSwgCQlcCisJLmZpbGVfbG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRCwgCQlcCisJLmZkdAkJPSAmaW5pdF9maWxlcy5mZHRhYiwgCQlcCisJLmZkdGFiCQk9IElOSVRfRkRUQUJMRSwJCQlcCiAJLmNsb3NlX29uX2V4ZWNfaW5pdCA9IHsgeyAwLCB9IH0sIAkJXAogCS5vcGVuX2Zkc19pbml0CT0geyB7IDAsIH0gfSwgCQkJXAogCS5mZF9hcnJheQk9IHsgTlVMTCwgfSAJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lub3RpZnkuaCBiL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oCmluZGV4IDkzYmIzYWYuLmVlNWIyMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oCkBAIC00Nyw2ICs0Nyw3IEBACiAjZGVmaW5lIElOX01PVkUJCQkoSU5fTU9WRURfRlJPTSB8IElOX01PVkVEX1RPKSAvKiBtb3ZlcyAqLwogCiAvKiBzcGVjaWFsIGZsYWdzICovCisjZGVmaW5lIElOX01BU0tfQURECQkweDIwMDAwMDAwCS8qIGFkZCB0byB0aGUgbWFzayBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIHdhdGNoICovCiAjZGVmaW5lIElOX0lTRElSCQkweDQwMDAwMDAwCS8qIGV2ZW50IG9jY3VycmVkIGFnYWluc3QgZGlyICovCiAjZGVmaW5lIElOX09ORVNIT1QJCTB4ODAwMDAwMDAJLyogb25seSBzZW5kIGV2ZW50IG9uY2UgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnB1dC5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC5oCmluZGV4IGJkYzUzYzYuLmU4YzI5NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5wdXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lucHV0LmgKQEAgLTY2LDYgKzY2LDcgQEAKICNkZWZpbmUgRVZJT0NHS0VZKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MTgsIGxlbikJCS8qIGdldCBnbG9iYWwga2V5c3RhdGUgKi8KICNkZWZpbmUgRVZJT0NHTEVEKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MTksIGxlbikJCS8qIGdldCBhbGwgTEVEcyAqLwogI2RlZmluZSBFVklPQ0dTTkQobGVuKQkJX0lPQyhfSU9DX1JFQUQsICdFJywgMHgxYSwgbGVuKQkJLyogZ2V0IGFsbCBzb3VuZHMgc3RhdHVzICovCisjZGVmaW5lIEVWSU9DR1NXKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MWIsIGxlbikJCS8qIGdldCBhbGwgc3dpdGNoIHN0YXRlcyAqLwogCiAjZGVmaW5lIEVWSU9DR0JJVChldixsZW4pCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MjAgKyBldiwgbGVuKQkvKiBnZXQgZXZlbnQgYml0cyAqLwogI2RlZmluZSBFVklPQ0dBQlMoYWJzKQkJX0lPUignRScsIDB4NDAgKyBhYnMsIHN0cnVjdCBpbnB1dF9hYnNpbmZvKQkJLyogZ2V0IGFicyB2YWx1ZS9saW1pdHMgKi8KQEAgLTg2LDYgKzg3LDcgQEAKICNkZWZpbmUgRVZfUkVMCQkJMHgwMgogI2RlZmluZSBFVl9BQlMJCQkweDAzCiAjZGVmaW5lIEVWX01TQwkJCTB4MDQKKyNkZWZpbmUgRVZfU1cJCQkweDA1CiAjZGVmaW5lIEVWX0xFRAkJCTB4MTEKICNkZWZpbmUgRVZfU05ECQkJMHgxMgogI2RlZmluZSBFVl9SRVAJCQkweDE0CkBAIC0yODcsNiArMjg5LDggQEAKICNkZWZpbmUgS0VZX1NDUk9MTERPV04JCTE3OAogI2RlZmluZSBLRVlfS1BMRUZUUEFSRU4JCTE3OQogI2RlZmluZSBLRVlfS1BSSUdIVFBBUkVOCTE4MAorI2RlZmluZSBLRVlfTkVXCQkJMTgxCisjZGVmaW5lIEtFWV9SRURPCQkxODIKIAogI2RlZmluZSBLRVlfRjEzCQkJMTgzCiAjZGVmaW5lIEtFWV9GMTQJCQkxODQKQEAgLTMzMyw2ICszMzcsMTIgQEAKICNkZWZpbmUgS0VZX0tCRElMTFVNRE9XTgkyMjkKICNkZWZpbmUgS0VZX0tCRElMTFVNVVAJCTIzMAogCisjZGVmaW5lIEtFWV9TRU5ECQkyMzEKKyNkZWZpbmUgS0VZX1JFUExZCQkyMzIKKyNkZWZpbmUgS0VZX0ZPUldBUkRNQUlMCQkyMzMKKyNkZWZpbmUgS0VZX1NBVkUJCTIzNAorI2RlZmluZSBLRVlfRE9DVU1FTlRTCQkyMzUKKwogI2RlZmluZSBLRVlfVU5LTk9XTgkJMjQwCiAKICNkZWZpbmUgQlROX01JU0MJCTB4MTAwCkBAIC01NTEsNiArNTYxLDIwIEBACiAjZGVmaW5lIEFCU19NQVgJCQkweDNmCiAKIC8qCisgKiBTd2l0Y2ggZXZlbnRzCisgKi8KKworI2RlZmluZSBTV18wCQkweDAwCisjZGVmaW5lIFNXXzEJCTB4MDEKKyNkZWZpbmUgU1dfMgkJMHgwMgorI2RlZmluZSBTV18zCQkweDAzCisjZGVmaW5lIFNXXzQJCTB4MDQKKyNkZWZpbmUgU1dfNQkJMHgwNQorI2RlZmluZSBTV182CQkweDA2CisjZGVmaW5lIFNXXzcJCTB4MDcKKyNkZWZpbmUgU1dfTUFYCQkweDBmCisKKy8qCiAgKiBNaXNjIGV2ZW50cwogICovCiAKQEAgLTgyNCw2ICs4NDgsNyBAQAogCXVuc2lnbmVkIGxvbmcgbGVkYml0W05CSVRTKExFRF9NQVgpXTsKIAl1bnNpZ25lZCBsb25nIHNuZGJpdFtOQklUUyhTTkRfTUFYKV07CiAJdW5zaWduZWQgbG9uZyBmZmJpdFtOQklUUyhGRl9NQVgpXTsKKwl1bnNpZ25lZCBsb25nIHN3Yml0W05CSVRTKFNXX01BWCldOwogCWludCBmZl9lZmZlY3RzX21heDsKIAogCXVuc2lnbmVkIGludCBrZXljb2RlbWF4OwpAQCAtODQ0LDYgKzg2OSw3IEBACiAJdW5zaWduZWQgbG9uZyBrZXlbTkJJVFMoS0VZX01BWCldOwogCXVuc2lnbmVkIGxvbmcgbGVkW05CSVRTKExFRF9NQVgpXTsKIAl1bnNpZ25lZCBsb25nIHNuZFtOQklUUyhTTkRfTUFYKV07CisJdW5zaWduZWQgbG9uZyBzd1tOQklUUyhTV19NQVgpXTsKIAogCWludCBhYnNtYXhbQUJTX01BWCArIDFdOwogCWludCBhYnNtaW5bQUJTX01BWCArIDFdOwpAQCAtODg2LDYgKzkxMiw3IEBACiAjZGVmaW5lIElOUFVUX0RFVklDRV9JRF9NQVRDSF9MRURCSVQJMHgyMDAKICNkZWZpbmUgSU5QVVRfREVWSUNFX0lEX01BVENIX1NOREJJVAkweDQwMAogI2RlZmluZSBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfRkZCSVQJMHg4MDAKKyNkZWZpbmUgSU5QVVRfREVWSUNFX0lEX01BVENIX1NXQklUCTB4MTAwMAogCiAjZGVmaW5lIElOUFVUX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0VcCiAJKElOUFVUX0RFVklDRV9JRF9NQVRDSF9CVVMgfCBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfVkVORE9SIHwgSU5QVVRfREVWSUNFX0lEX01BVENIX1BST0RVQ1QpCkBAIC05MDYsNiArOTMzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGxlZGJpdFtOQklUUyhMRURfTUFYKV07CiAJdW5zaWduZWQgbG9uZyBzbmRiaXRbTkJJVFMoU05EX01BWCldOwogCXVuc2lnbmVkIGxvbmcgZmZiaXRbTkJJVFMoRkZfTUFYKV07CisJdW5zaWduZWQgbG9uZyBzd2JpdFtOQklUUyhTV19NQVgpXTsKIAogCXVuc2lnbmVkIGxvbmcgZHJpdmVyX2luZm87CiB9OwpAQCAtOTk4LDYgKzEwMjYsMTEgQEAKIAlpbnB1dF9ldmVudChkZXYsIEVWX0ZGX1NUQVRVUywgY29kZSwgdmFsdWUpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgaW5wdXRfcmVwb3J0X3N3aXRjaChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCit7CisJaW5wdXRfZXZlbnQoZGV2LCBFVl9TVywgY29kZSwgISF2YWx1ZSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnB1dF9yZWdzKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJZGV2LT5yZWdzID0gcmVnczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9jdGwzMi5oIGIvaW5jbHVkZS9saW51eC9pb2N0bDMyLmgKaW5kZXggZThjNGFmMy4uOTQ4ODA5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb2N0bDMyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pb2N0bDMyLmgKQEAgLTE0LDI2ICsxNCw0IEBACiAJc3RydWN0IGlvY3RsX3RyYW5zICpuZXh0OwogfTsKIAotLyogCi0gKiBSZWdpc3RlciBhbiAzMmJpdCBpb2N0bCB0cmFuc2xhdGlvbiBoYW5kbGVyIGZvciBpb2N0bCBjbWQuCi0gKgotICogaGFuZGxlciA9PSBOVUxMOiB1c2UgNjRiaXQgaW9jdGwgaGFuZGxlci4KLSAqIGFyZ3VtZW50cyB0byBoYW5kbGVyOiAgZmQ6IGZpbGUgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgICAgICAgICAgICBjbWQ6IGlvY3RsIGNvbW1hbmQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFyZzogaW9jdGwgYXJndW1lbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZpbGUgKmZpbGU6IGZpbGUgZGVzY3JpcHRvciBwb2ludGVyLgotICovIAotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotZXh0ZXJuIGludCBfX2RlcHJlY2F0ZWQgcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKHVuc2lnbmVkIGludCBjbWQsCi0JCQkJaW9jdGxfdHJhbnNfaGFuZGxlcl90IGhhbmRsZXIpOwotZXh0ZXJuIGludCBfX2RlcHJlY2F0ZWQgdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24odW5zaWduZWQgaW50IGNtZCk7Ci0KLSNlbHNlCi0KLSNkZWZpbmUgcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKGNtZCwgaGFuZGxlcikJKHsgMDsgfSkKLSNkZWZpbmUgdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oY21kKQkJKHsgMDsgfSkKLQotI2VuZGlmCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcG1pLmggYi9pbmNsdWRlL2xpbnV4L2lwbWkuaAppbmRleCA1OTZjYTYxLi45MzhkNTViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lwbWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwbWkuaApAQCAtMzUsNiArMzUsNyBAQAogI2RlZmluZSBfX0xJTlVYX0lQTUlfSAogCiAjaW5jbHVkZSA8bGludXgvaXBtaV9tc2dkZWZzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAogLyoKICAqIFRoaXMgZmlsZSBkZXNjcmliZXMgYW4gaW50ZXJmYWNlIHRvIGFuIElQTUkgZHJpdmVyLiAgWW91IGhhdmUgdG8KQEAgLTI0MSw3ICsyNDIsOCBAQAogCS8qIFRoZSB1c2VyX21zZ19kYXRhIGlzIHRoZSBkYXRhIHN1cHBsaWVkIHdoZW4gYSBtZXNzYWdlIHdhcwogCSAgIHNlbnQsIGlmIHRoaXMgaXMgYSByZXNwb25zZSB0byBhIHNlbnQgbWVzc2FnZS4gIElmIHRoaXMgaXMKIAkgICBub3QgYSByZXNwb25zZSB0byBhIHNlbnQgbWVzc2FnZSwgdGhlbiB1c2VyX21zZ19kYXRhIHdpbGwKLQkgICBiZSBOVUxMLiAqLworCSAgIGJlIE5VTEwuICBJZiB0aGUgdXNlciBhYm92ZSBpcyBOVUxMLCB0aGVuIHRoaXMgd2lsbCBiZSB0aGUKKwkgICBpbnRmLiAqLwogCXZvaWQgICAgICAgICAgICAgKnVzZXJfbXNnX2RhdGE7CiAKIAkvKiBDYWxsIHRoaXMgd2hlbiBkb25lIHdpdGggdGhlIG1lc3NhZ2UuICBJdCB3aWxsIHByZXN1bWFibHkgZnJlZQpAQCAtMjk4LDEzICszMDAsMTkgQEAKICAgIHRoaXMgdXNlciwgc28gaXQgd2lsbCBhZmZlY3QgYWxsIHVzZXJzIG9mIHRoaXMgaW50ZXJmYWNlLiAgVGhpcyBpcwogICAgc28gc29tZSBpbml0aWFsaXphdGlvbiBjb2RlIGNhbiBjb21lIGluIGFuZCBkbyB0aGUgT0VNLXNwZWNpZmljCiAgICB0aGluZ3MgaXQgdGFrZXMgdG8gZGV0ZXJtaW5lIHlvdXIgYWRkcmVzcyAoaWYgbm90IHRoZSBCTUMpIGFuZCBzZXQKLSAgIGl0IGZvciBldmVyeW9uZSBlbHNlLiAqLwotdm9pZCBpcG1pX3NldF9teV9hZGRyZXNzKGlwbWlfdXNlcl90ICAgdXNlciwKLQkJCSB1bnNpZ25lZCBjaGFyIGFkZHJlc3MpOwotdW5zaWduZWQgY2hhciBpcG1pX2dldF9teV9hZGRyZXNzKGlwbWlfdXNlcl90IHVzZXIpOwotdm9pZCBpcG1pX3NldF9teV9MVU4oaXBtaV91c2VyX3QgICB1c2VyLAotCQkgICAgIHVuc2lnbmVkIGNoYXIgTFVOKTsKLXVuc2lnbmVkIGNoYXIgaXBtaV9nZXRfbXlfTFVOKGlwbWlfdXNlcl90IHVzZXIpOworICAgaXQgZm9yIGV2ZXJ5b25lIGVsc2UuICBOb3RlIHRoYXQgZWFjaCBjaGFubmVsIGNhbiBoYXZlIGl0cyBvd24gYWRkcmVzcy4gKi8KK2ludCBpcG1pX3NldF9teV9hZGRyZXNzKGlwbWlfdXNlcl90ICAgdXNlciwKKwkJCXVuc2lnbmVkIGludCAgY2hhbm5lbCwKKwkJCXVuc2lnbmVkIGNoYXIgYWRkcmVzcyk7CitpbnQgaXBtaV9nZXRfbXlfYWRkcmVzcyhpcG1pX3VzZXJfdCAgIHVzZXIsCisJCQl1bnNpZ25lZCBpbnQgIGNoYW5uZWwsCisJCQl1bnNpZ25lZCBjaGFyICphZGRyZXNzKTsKK2ludCBpcG1pX3NldF9teV9MVU4oaXBtaV91c2VyX3QgICB1c2VyLAorCQkgICAgdW5zaWduZWQgaW50ICBjaGFubmVsLAorCQkgICAgdW5zaWduZWQgY2hhciBMVU4pOworaW50IGlwbWlfZ2V0X215X0xVTihpcG1pX3VzZXJfdCAgIHVzZXIsCisJCSAgICB1bnNpZ25lZCBpbnQgIGNoYW5uZWwsCisJCSAgICB1bnNpZ25lZCBjaGFyICpMVU4pOwogCiAvKgogICogTGlrZSBpcG1pX3JlcXVlc3QsIGJ1dCBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgcmV0cmllcyBhbmQKQEAgLTU4NSw2ICs1OTMsMTYgQEAKICAqIHRoaW5ncyBpdCB0YWtlcyB0byBkZXRlcm1pbmUgeW91ciBhZGRyZXNzIChpZiBub3QgdGhlIEJNQykgYW5kIHNldAogICogaXQgZm9yIGV2ZXJ5b25lIGVsc2UuICBZb3Ugc2hvdWxkIHByb2JhYmx5IGxlYXZlIHRoZSBMVU4gYWxvbmUuCiAgKi8KK3N0cnVjdCBpcG1pX2NoYW5uZWxfbHVuX2FkZHJlc3Nfc2V0Cit7CisJdW5zaWduZWQgc2hvcnQgY2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyICB2YWx1ZTsKK307CisjZGVmaW5lIElQTUlDVExfU0VUX01ZX0NIQU5ORUxfQUREUkVTU19DTUQgX0lPUihJUE1JX0lPQ19NQUdJQywgMjQsIHN0cnVjdCBpcG1pX2NoYW5uZWxfbHVuX2FkZHJlc3Nfc2V0KQorI2RlZmluZSBJUE1JQ1RMX0dFVF9NWV9DSEFOTkVMX0FERFJFU1NfQ01EIF9JT1IoSVBNSV9JT0NfTUFHSUMsIDI1LCBzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCkKKyNkZWZpbmUgSVBNSUNUTF9TRVRfTVlfQ0hBTk5FTF9MVU5fQ01ECSAgIF9JT1IoSVBNSV9JT0NfTUFHSUMsIDI2LCBzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCkKKyNkZWZpbmUgSVBNSUNUTF9HRVRfTVlfQ0hBTk5FTF9MVU5fQ01ECSAgIF9JT1IoSVBNSV9JT0NfTUFHSUMsIDI3LCBzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCkKKy8qIExlZ2FjeSBpbnRlcmZhY2VzLCB0aGVzZSBvbmx5IHNldCBJUE1CIDAuICovCiAjZGVmaW5lIElQTUlDVExfU0VUX01ZX0FERFJFU1NfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE3LCB1bnNpZ25lZCBpbnQpCiAjZGVmaW5lIElQTUlDVExfR0VUX01ZX0FERFJFU1NfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE4LCB1bnNpZ25lZCBpbnQpCiAjZGVmaW5lIElQTUlDVExfU0VUX01ZX0xVTl9DTUQJCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE5LCB1bnNpZ25lZCBpbnQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwdjYuaCBiL2luY2x1ZGUvbGludXgvaXB2Ni5oCmluZGV4IDNjN2RiYzYuLmJiNmY4OGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbGludXgvaXB2Ni5oCkBAIC02OCw3ICs2OCw3IEBACiAKIHN0cnVjdCBydDBfaGRyIHsKIAlzdHJ1Y3QgaXB2Nl9ydF9oZHIJcnRfaGRyOwotCV9fdTMyCQkJYml0bWFwOwkJLyogc3RyaWN0L2xvb3NlIGJpdCBtYXAgKi8KKwlfX3UzMgkJCXJlc2VydmVkOwogCXN0cnVjdCBpbjZfYWRkcgkJYWRkclswXTsKIAogI2RlZmluZSBydDBfdHlwZQkJcnRfaGRyLnR5cGUKQEAgLTE4OSw2ICsxODksNyBAQAogCV9fdTE2CQkJZHN0MDsKIAlfX3UxNgkJCXNyY3J0OwogCV9fdTE2CQkJZHN0MTsKKwlfX3UxNgkJCWxhc3RvcHQ7CiB9OwogCiAjZGVmaW5lIElQNkNCKHNrYikJKChzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0qKSgoc2tiKS0+Y2IpKQpAQCAtMjM0LDE0ICsyMzUsMjAgQEAKIAkvKiBwa3RvcHRpb24gZmxhZ3MgKi8KIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQlfX3U4CXNyY3J0OjIsCisJCQlfX3UxNglzcmNydDoyLAorCQkJCW9zcmNydDoyLAogCQkJICAgICAgICByeGluZm86MSwKKwkJCSAgICAgICAgcnhvaW5mbzoxLAogCQkJCXJ4aGxpbToxLAorCQkJCXJ4b2hsaW06MSwKIAkJCQlob3BvcHRzOjEsCisJCQkJb2hvcG9wdHM6MSwKIAkJCQlkc3RvcHRzOjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4ZmxvdzoxOworCQkJCW9kc3RvcHRzOjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4ZmxvdzoxLAorCQkJCXJ4dGNsYXNzOjE7CiAJCX0gYml0czsKLQkJX191OAkJYWxsOworCQlfX3UxNgkJYWxsOwogCX0gcnhvcHQ7CiAKIAkvKiBzb2Nrb3B0IGZsYWdzICovCkBAIC0yNTAsNiArMjU3LDcgQEAKIAkgICAgICAgICAgICAgICAgICAgICAgICBzbmRmbG93OjEsCiAJCQkJcG10dWRpc2M6MiwKIAkJCQlpcHY2b25seToxOworCV9fdTgJCQl0Y2xhc3M7CiAKIAlfX3UzMgkJCWRzdF9jb29raWU7CiAKQEAgLTI2Myw2ICsyNzEsNyBAQAogCQlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdDsKIAkJc3RydWN0IHJ0Nl9pbmZvCSpydDsKIAkJaW50IGhvcF9saW1pdDsKKwkJaW50IHRjbGFzczsKIAl9IGNvcms7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCAwNjlkM2I4Li42OTY4MWMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTMyLDcgKzMyLDEyIEBACiAjZGVmaW5lIElSUV9XQUlUSU5HCTMyCS8qIElSUSBub3QgeWV0IHNlZW4gLSBmb3IgYXV0b2RldGVjdGlvbiAqLwogI2RlZmluZSBJUlFfTEVWRUwJNjQJLyogSVJRIGxldmVsIHRyaWdnZXJlZCAqLwogI2RlZmluZSBJUlFfTUFTS0VECTEyOAkvKiBJUlEgbWFza2VkIC0gc2hvdWxkbid0IGJlIHNlZW4gYWdhaW4gKi8KLSNkZWZpbmUgSVJRX1BFUl9DUFUJMjU2CS8qIElSUSBpcyBwZXIgQ1BVICovCisjaWYgZGVmaW5lZChBUkNIX0hBU19JUlFfUEVSX0NQVSkKKyMgZGVmaW5lIElSUV9QRVJfQ1BVCTI1NgkvKiBJUlEgaXMgcGVyIENQVSAqLworIyBkZWZpbmUgQ0hFQ0tfSVJRX1BFUl9DUFUodmFyKSAoKHZhcikgJiBJUlFfUEVSX0NQVSkKKyNlbHNlCisjIGRlZmluZSBDSEVDS19JUlFfUEVSX0NQVSh2YXIpIDAKKyNlbmRpZgogCiAvKgogICogSW50ZXJydXB0IGNvbnRyb2xsZXIgZGVzY3JpcHRvci4gVGhpcyBpcyBhbGwgd2UgbmVlZApAQCAtNzEsMTYgKzc2LDEzOSBAQAogCXVuc2lnbmVkIGludCBpcnFfY291bnQ7CQkvKiBGb3IgZGV0ZWN0aW5nIGJyb2tlbiBpbnRlcnJ1cHRzICovCiAJdW5zaWduZWQgaW50IGlycXNfdW5oYW5kbGVkOwogCXNwaW5sb2NrX3QgbG9jazsKKyNpZiBkZWZpbmVkIChDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUSkgfHwgZGVmaW5lZCAoQ09ORklHX0lSUUJBTEFOQ0UpCisJdW5zaWduZWQgaW50IG1vdmVfaXJxOwkJLyogRmxhZyBuZWVkIHRvIHJlLXRhcmdldCBpbnRyIGRlc3QqLworI2VuZGlmCiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZCBpcnFfZGVzY190OwogCiBleHRlcm4gaXJxX2Rlc2NfdCBpcnFfZGVzYyBbTlJfSVJRU107CiAKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGlycSBkZXNjcmlwdG9yIGZvciBJUlEuICAqLworc3RhdGljIGlubGluZSBpcnFfZGVzY190ICoKK2lycV9kZXNjcCAoaW50IGlycSkKK3sKKwlyZXR1cm4gaXJxX2Rlc2MgKyBpcnE7Cit9CisKICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+IC8qIHRoZSBhcmNoIGRlcGVuZGVudCBzdHVmZiAqLwogCiBleHRlcm4gaW50IHNldHVwX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICogbmV3KTsKIAogI2lmZGVmIENPTkZJR19HRU5FUklDX0hBUkRJUlFTCiBleHRlcm4gY3B1bWFza190IGlycV9hZmZpbml0eVtOUl9JUlFTXTsKKworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbmF0aXZlX2lycV9pbmZvKGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCWlycV9hZmZpbml0eVtpcnFdID0gbWFzazsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X25hdGl2ZV9pcnFfaW5mbyhpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3sKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NNUAorCisjaWYgZGVmaW5lZCAoQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlEpIHx8IGRlZmluZWQgKENPTkZJR19JUlFCQUxBTkNFKQorZXh0ZXJuIGNwdW1hc2tfdCBwZW5kaW5nX2lycV9jcHVtYXNrW05SX0lSUVNdOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BlbmRpbmdfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCWlycV9kZXNjX3QgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwlkZXNjLT5tb3ZlX2lycSA9IDE7CisJcGVuZGluZ19pcnFfY3B1bWFza1tpcnFdID0gbWFzazsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbW92ZV9uYXRpdmVfaXJxKGludCBpcnEpCit7CisJY3B1bWFza190IHRtcDsKKwlpcnFfZGVzY190ICpkZXNjID0gaXJxX2Rlc2NwKGlycSk7CisKKwlpZiAobGlrZWx5ICghZGVzYy0+bW92ZV9pcnEpKQorCQlyZXR1cm47CisKKwlkZXNjLT5tb3ZlX2lycSA9IDA7CisKKwlpZiAobGlrZWx5KGNwdXNfZW1wdHkocGVuZGluZ19pcnFfY3B1bWFza1tpcnFdKSkpCisJCXJldHVybjsKKworCWlmICghZGVzYy0+aGFuZGxlci0+c2V0X2FmZmluaXR5KQorCQlyZXR1cm47CisKKwkvKiBub3RlIC0gd2UgaG9sZCB0aGUgZGVzYy0+bG9jayAqLworCWNwdXNfYW5kKHRtcCwgcGVuZGluZ19pcnFfY3B1bWFza1tpcnFdLCBjcHVfb25saW5lX21hcCk7CisKKwkvKgorCSAqIElmIHRoZXJlIHdhcyBhIHZhbGlkIG1hc2sgdG8gd29yayB3aXRoLCBwbGVhc2UKKwkgKiBkbyB0aGUgZGlzYWJsZSwgcmUtcHJvZ3JhbSwgZW5hYmxlIHNlcXVlbmNlLgorCSAqIFRoaXMgaXMgKm5vdCogcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgbGV2ZWwgdHJpZ2dlcmVkCisJICogYnV0IGluIGEgZWRnZSB0cmlnZ2VyIGNhc2UsIHdlIG1pZ2h0IGJlIHNldHRpbmcgcnRlCisJICogd2hlbiBhbiBhY3RpdmUgdHJpZ2dlciBpcyBjb21taW5nIGluLiBUaGlzIGNvdWxkCisJICogY2F1c2Ugc29tZSBpb2FwaWNzIHRvIG1hbC1mdW5jdGlvbi4KKwkgKiBCZWluZyBwYXJhbm9pZCBpIGd1ZXNzIQorCSAqLworCWlmICh1bmxpa2VseSghY3B1c19lbXB0eSh0bXApKSkgeworCQlkZXNjLT5oYW5kbGVyLT5kaXNhYmxlKGlycSk7CisJCWRlc2MtPmhhbmRsZXItPnNldF9hZmZpbml0eShpcnEsdG1wKTsKKwkJZGVzYy0+aGFuZGxlci0+ZW5hYmxlKGlycSk7CisJfQorCWNwdXNfY2xlYXIocGVuZGluZ19pcnFfY3B1bWFza1tpcnFdKTsKK30KKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisvKgorICogV29uZGVyIHdoeSB0aGVzZSBhcmUgZHVtbWllcz8KKyAqIEZvciBlLmcgdGhlIHNldF9pb2FwaWNfYWZmaW5pdHlfdmVjdG9yKCkgY2FsbHMgdGhlIHNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKCkKKyAqIGNvdW50ZXIgcGFydCBhZnRlciB0cmFuc2xhdGluZyB0aGUgdmVjdG9yIHRvIGlycSBpbmZvLiBXZSBuZWVkIHRvIHBlcmZvcm0KKyAqIHRoaXMgb3BlcmF0aW9uIG9uIHRoZSByZWFsIGlycSwgd2hlbiB3ZSBkb250IHVzZSB2ZWN0b3IsIGkuZSB3aGVuCisgKiBwY2lfdXNlX3ZlY3RvcigpIGlzIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbW92ZV9pcnEoaW50IGlycSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9pcnFfaW5mbyhpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3sKK30KKworI2Vsc2UgLy8gQ09ORklHX1BDSV9NU0kKKworc3RhdGljIGlubGluZSB2b2lkIG1vdmVfaXJxKGludCBpcnEpCit7CisJbW92ZV9uYXRpdmVfaXJxKGlycSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaXJxX2luZm8oaW50IGlycSwgY3B1bWFza190IG1hc2spCit7CisJc2V0X25hdGl2ZV9pcnFfaW5mbyhpcnEsIG1hc2spOworfQorI2VuZGlmIC8vIENPTkZJR19QQ0lfTVNJCisKKyNlbHNlCS8vIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRIHx8IENPTkZJR19JUlFCQUxBTkNFCisKKyNkZWZpbmUgbW92ZV9pcnEoeCkKKyNkZWZpbmUgbW92ZV9uYXRpdmVfaXJxKHgpCisjZGVmaW5lIHNldF9wZW5kaW5nX2lycSh4LHkpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2lycV9pbmZvKGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCXNldF9uYXRpdmVfaXJxX2luZm8oaXJxLCBtYXNrKTsKK30KKworI2VuZGlmIC8vIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRCisKKyNlbHNlIC8vIENPTkZJR19TTVAKKworI2RlZmluZSBtb3ZlX2lycSh4KQorI2RlZmluZSBtb3ZlX25hdGl2ZV9pcnEoeCkKKworI2VuZGlmIC8vIENPTkZJR19TTVAKKwogZXh0ZXJuIGludCBub19pcnFfYWZmaW5pdHk7CiBleHRlcm4gaW50IG5vaXJxZGVidWdfc2V0dXAoY2hhciAqc3RyKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pc2RuLmggYi9pbmNsdWRlL2xpbnV4L2lzZG4uaAppbmRleCA4NjIwODNlLi41M2VhZWU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lzZG4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lzZG4uaApAQCAtMTUwLDcgKzE1MCw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamJkLmggYi9pbmNsdWRlL2xpbnV4L2piZC5oCmluZGV4IDU5MzQwN2UuLmRlMDk3MjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9qYmQuaApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvam91cm5hbC1oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvYml0X3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2VuZGlmCiAKQEAgLTkxNCw3ICs5MTUsNiBAQAogZXh0ZXJuIGludAkgICBqb3VybmFsX3NraXBfcmVjb3ZlcnkJKGpvdXJuYWxfdCAqKTsKIGV4dGVybiB2b2lkCSAgIGpvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2sJKGpvdXJuYWxfdCAqLCBpbnQpOwogZXh0ZXJuIHZvaWQJICAgX19qb3VybmFsX2Fib3J0X2hhcmQJKGpvdXJuYWxfdCAqKTsKLWV4dGVybiB2b2lkCSAgIF9fam91cm5hbF9hYm9ydF9zb2Z0CShqb3VybmFsX3QgKiwgaW50KTsKIGV4dGVybiB2b2lkCSAgIGpvdXJuYWxfYWJvcnQgICAgICAoam91cm5hbF90ICosIGludCk7CiBleHRlcm4gaW50CSAgIGpvdXJuYWxfZXJybm8gICAgICAoam91cm5hbF90ICopOwogZXh0ZXJuIHZvaWQJICAgam91cm5hbF9hY2tfZXJyICAgIChqb3VybmFsX3QgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaCBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCmluZGV4IGQ3YTI1NTUuLjZhY2ZkYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamlmZmllcy5oCisrKyBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCkBAIC0yNTQsMjMgKzI1NCwyMyBAQAogICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBqaWZmaWVzX3RvX21zZWNzKGNvbnN0IHVuc2lnbmVkIGxvbmcgaikKIHsKLSNpZiBIWiA8PSAxMDAwICYmICEoMTAwMCAlIEhaKQotCXJldHVybiAoMTAwMCAvIEhaKSAqIGo7Ci0jZWxpZiBIWiA+IDEwMDAgJiYgIShIWiAlIDEwMDApCi0JcmV0dXJuIChqICsgKEhaIC8gMTAwMCkgLSAxKS8oSFogLyAxMDAwKTsKKyNpZiBIWiA8PSBNU0VDX1BFUl9TRUMgJiYgIShNU0VDX1BFUl9TRUMgJSBIWikKKwlyZXR1cm4gKE1TRUNfUEVSX1NFQyAvIEhaKSAqIGo7CisjZWxpZiBIWiA+IE1TRUNfUEVSX1NFQyAmJiAhKEhaICUgTVNFQ19QRVJfU0VDKQorCXJldHVybiAoaiArIChIWiAvIE1TRUNfUEVSX1NFQykgLSAxKS8oSFogLyBNU0VDX1BFUl9TRUMpOwogI2Vsc2UKLQlyZXR1cm4gKGogKiAxMDAwKSAvIEhaOworCXJldHVybiAoaiAqIE1TRUNfUEVSX1NFQykgLyBIWjsKICNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBqaWZmaWVzX3RvX3VzZWNzKGNvbnN0IHVuc2lnbmVkIGxvbmcgaikKIHsKLSNpZiBIWiA8PSAxMDAwMDAwICYmICEoMTAwMDAwMCAlIEhaKQotCXJldHVybiAoMTAwMDAwMCAvIEhaKSAqIGo7Ci0jZWxpZiBIWiA+IDEwMDAwMDAgJiYgIShIWiAlIDEwMDAwMDApCi0JcmV0dXJuIChqICsgKEhaIC8gMTAwMDAwMCkgLSAxKS8oSFogLyAxMDAwMDAwKTsKKyNpZiBIWiA8PSBVU0VDX1BFUl9TRUMgJiYgIShVU0VDX1BFUl9TRUMgJSBIWikKKwlyZXR1cm4gKFVTRUNfUEVSX1NFQyAvIEhaKSAqIGo7CisjZWxpZiBIWiA+IFVTRUNfUEVSX1NFQyAmJiAhKEhaICUgVVNFQ19QRVJfU0VDKQorCXJldHVybiAoaiArIChIWiAvIFVTRUNfUEVSX1NFQykgLSAxKS8oSFogLyBVU0VDX1BFUl9TRUMpOwogI2Vsc2UKLQlyZXR1cm4gKGogKiAxMDAwMDAwKSAvIEhaOworCXJldHVybiAoaiAqIFVTRUNfUEVSX1NFQykgLyBIWjsKICNlbmRpZgogfQogCkBAIC0yNzgsMTIgKzI3OCwxMiBAQAogewogCWlmIChtID4gamlmZmllc190b19tc2VjcyhNQVhfSklGRllfT0ZGU0VUKSkKIAkJcmV0dXJuIE1BWF9KSUZGWV9PRkZTRVQ7Ci0jaWYgSFogPD0gMTAwMCAmJiAhKDEwMDAgJSBIWikKLQlyZXR1cm4gKG0gKyAoMTAwMCAvIEhaKSAtIDEpIC8gKDEwMDAgLyBIWik7Ci0jZWxpZiBIWiA+IDEwMDAgJiYgIShIWiAlIDEwMDApCi0JcmV0dXJuIG0gKiAoSFogLyAxMDAwKTsKKyNpZiBIWiA8PSBNU0VDX1BFUl9TRUMgJiYgIShNU0VDX1BFUl9TRUMgJSBIWikKKwlyZXR1cm4gKG0gKyAoTVNFQ19QRVJfU0VDIC8gSFopIC0gMSkgLyAoTVNFQ19QRVJfU0VDIC8gSFopOworI2VsaWYgSFogPiBNU0VDX1BFUl9TRUMgJiYgIShIWiAlIE1TRUNfUEVSX1NFQykKKwlyZXR1cm4gbSAqIChIWiAvIE1TRUNfUEVSX1NFQyk7CiAjZWxzZQotCXJldHVybiAobSAqIEhaICsgOTk5KSAvIDEwMDA7CisJcmV0dXJuIChtICogSFogKyBNU0VDX1BFUl9TRUMgLSAxKSAvIE1TRUNfUEVSX1NFQzsKICNlbmRpZgogfQogCkBAIC0yOTEsMTIgKzI5MSwxMiBAQAogewogCWlmICh1ID4gamlmZmllc190b191c2VjcyhNQVhfSklGRllfT0ZGU0VUKSkKIAkJcmV0dXJuIE1BWF9KSUZGWV9PRkZTRVQ7Ci0jaWYgSFogPD0gMTAwMDAwMCAmJiAhKDEwMDAwMDAgJSBIWikKLQlyZXR1cm4gKHUgKyAoMTAwMDAwMCAvIEhaKSAtIDEpIC8gKDEwMDAwMDAgLyBIWik7Ci0jZWxpZiBIWiA+IDEwMDAwMDAgJiYgIShIWiAlIDEwMDAwMDApCi0JcmV0dXJuIHUgKiAoSFogLyAxMDAwMDAwKTsKKyNpZiBIWiA8PSBVU0VDX1BFUl9TRUMgJiYgIShVU0VDX1BFUl9TRUMgJSBIWikKKwlyZXR1cm4gKHUgKyAoVVNFQ19QRVJfU0VDIC8gSFopIC0gMSkgLyAoVVNFQ19QRVJfU0VDIC8gSFopOworI2VsaWYgSFogPiBVU0VDX1BFUl9TRUMgJiYgIShIWiAlIFVTRUNfUEVSX1NFQykKKwlyZXR1cm4gdSAqIChIWiAvIFVTRUNfUEVSX1NFQyk7CiAjZWxzZQotCXJldHVybiAodSAqIEhaICsgOTk5OTk5KSAvIDEwMDAwMDA7CisJcmV0dXJuICh1ICogSFogKyBVU0VDX1BFUl9TRUMgLSAxKSAvIFVTRUNfUEVSX1NFQzsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tsaXN0LmggYi9pbmNsdWRlL2xpbnV4L2tsaXN0LmgKaW5kZXggZWViZjVlNS4uNzQwNzEyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rbGlzdC5oCisrKyBiL2luY2x1ZGUvbGludXgva2xpc3QuaApAQCAtOSwyMCArOSwyNSBAQAogICoJVGhpcyBmaWxlIGlzIHJsZWFzZWQgdW5kZXIgdGhlIEdQTCB2Mi4KICAqLwogCisjaWZuZGVmIF9MSU5VWF9LTElTVF9ICisjZGVmaW5lIF9MSU5VWF9LTElTVF9ICisKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCi0KK3N0cnVjdCBrbGlzdF9ub2RlOwogc3RydWN0IGtsaXN0IHsKIAlzcGlubG9ja190CQlrX2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAlrX2xpc3Q7CisJdm9pZAkJCSgqZ2V0KShzdHJ1Y3Qga2xpc3Rfbm9kZSAqKTsKKwl2b2lkCQkJKCpwdXQpKHN0cnVjdCBrbGlzdF9ub2RlICopOwogfTsKIAogCi1leHRlcm4gdm9pZCBrbGlzdF9pbml0KHN0cnVjdCBrbGlzdCAqIGspOwotCitleHRlcm4gdm9pZCBrbGlzdF9pbml0KHN0cnVjdCBrbGlzdCAqIGssIHZvaWQgKCpnZXQpKHN0cnVjdCBrbGlzdF9ub2RlICopLAorCQkgICAgICAgdm9pZCAoKnB1dCkoc3RydWN0IGtsaXN0X25vZGUgKikpOwogCiBzdHJ1Y3Qga2xpc3Rfbm9kZSB7CiAJc3RydWN0IGtsaXN0CQkqIG5fa2xpc3Q7CkBAIC0zMSw4ICszNiw4IEBACiAJc3RydWN0IGNvbXBsZXRpb24Jbl9yZW1vdmVkOwogfTsKIAotZXh0ZXJuIHZvaWQga2xpc3RfYWRkX3RhaWwoc3RydWN0IGtsaXN0ICogaywgc3RydWN0IGtsaXN0X25vZGUgKiBuKTsKLWV4dGVybiB2b2lkIGtsaXN0X2FkZF9oZWFkKHN0cnVjdCBrbGlzdCAqIGssIHN0cnVjdCBrbGlzdF9ub2RlICogbik7CitleHRlcm4gdm9pZCBrbGlzdF9hZGRfdGFpbChzdHJ1Y3Qga2xpc3Rfbm9kZSAqIG4sIHN0cnVjdCBrbGlzdCAqIGspOworZXh0ZXJuIHZvaWQga2xpc3RfYWRkX2hlYWQoc3RydWN0IGtsaXN0X25vZGUgKiBuLCBzdHJ1Y3Qga2xpc3QgKiBrKTsKIAogZXh0ZXJuIHZvaWQga2xpc3RfZGVsKHN0cnVjdCBrbGlzdF9ub2RlICogbik7CiBleHRlcm4gdm9pZCBrbGlzdF9yZW1vdmUoc3RydWN0IGtsaXN0X25vZGUgKiBuKTsKQEAgLTUzLDMgKzU4LDQgQEAKIGV4dGVybiB2b2lkIGtsaXN0X2l0ZXJfZXhpdChzdHJ1Y3Qga2xpc3RfaXRlciAqIGkpOwogZXh0ZXJuIHN0cnVjdCBrbGlzdF9ub2RlICoga2xpc3RfbmV4dChzdHJ1Y3Qga2xpc3RfaXRlciAqIGkpOwogCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oIGIvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKaW5kZXggZTA1MGZjMi4uZTMwYWZkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKQEAgLTQyLDYgKzQyLDkgQEAKICNkZWZpbmUgS1BST0JFX1JFRU5URVIJCTB4MDAwMDAwMDQKICNkZWZpbmUgS1BST0JFX0hJVF9TU0RPTkUJMHgwMDAwMDAwOAogCisvKiBBdHRhY2ggdG8gaW5zZXJ0IHByb2JlcyBvbiBhbnkgZnVuY3Rpb25zIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkKi8KKyNkZWZpbmUgX19rcHJvYmVzCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIua3Byb2Jlcy50ZXh0IikpKQorCiBzdHJ1Y3Qga3Byb2JlOwogc3RydWN0IHB0X3JlZ3M7CiBzdHJ1Y3Qga3JldHByb2JlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saWJhdGEuaCBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKaW5kZXggZmMwNWE5OC4uMDIyMTA1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saWJhdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCkBAIC00MCw3ICs0MCw2IEBACiAjdW5kZWYgQVRBX1ZFUkJPU0VfREVCVUcJLyogeWV0IG1vcmUgZGVidWdnaW5nIG91dHB1dCAqLwogI3VuZGVmIEFUQV9JUlFfVFJBUAkJLyogZGVmaW5lIHRvIGFjayBzY3JlYW1pbmcgaXJxcyAqLwogI3VuZGVmIEFUQV9OREVCVUcJCS8qIGRlZmluZSB0byBkaXNhYmxlIHF1aWNrIHJ1bnRpbWUgY2hlY2tzICovCi0jdW5kZWYgQVRBX0VOQUJMRV9BVEFQSQkJLyogZGVmaW5lIHRvIGVuYWJsZSBBVEFQSSBzdXBwb3J0ICovCiAjdW5kZWYgQVRBX0VOQUJMRV9QQVRBCQkvKiBkZWZpbmUgdG8gZW5hYmxlIFBBVEEgc3VwcG9ydCBpbiBzb21lCiAJCQkJICogbG93LWxldmVsIGRyaXZlcnMgKi8KICN1bmRlZiBBVEFQSV9FTkFCTEVfRE1BRElSCS8qIGVuYWJsZXMgQVRBUEkgRE1BRElSIGJyaWRnZSBzdXBwb3J0ICovCkBAIC00NTAsNiArNDQ5LDcgQEAKIAl1bnNpZ25lZCBsb25nCQl2YWw7CiB9OwogCitleHRlcm4gdm9pZCBhdGFfcGNpX2hvc3Rfc3RvcCAoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpOwogZXh0ZXJuIHN0cnVjdCBhdGFfcHJvYmVfZW50ICoKIGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IGF0YV9wb3J0X2luZm8gKipwb3J0KTsKIGV4dGVybiBpbnQgcGNpX3Rlc3RfY29uZmlnX2JpdHMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBwY2lfYml0cyAqYml0cyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpbmthZ2UuaCBiL2luY2x1ZGUvbGludXgvbGlua2FnZS5oCmluZGV4IDMzOGY3NzkuLjE0N2ViMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGlua2FnZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGlua2FnZS5oCkBAIC0zMyw2ICszMywxMyBAQAogICBBTElHTjsgXAogICBuYW1lOgogCisjZGVmaW5lIEtQUk9CRV9FTlRSWShuYW1lKSBcCisgIC5zZWN0aW9uIC5rcHJvYmVzLnRleHQsICJheCI7IFwKKyAgLmdsb2JsIG5hbWU7IFwKKyAgQUxJR047IFwKKyAgbmFtZToKKworCiAjZW5kaWYKIAogI2RlZmluZSBOT1JFVF9UWVBFICAgIC8qKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmggYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCmluZGV4IDg0ODBhZWYuLjU4Mzg1ZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaApAQCAtMTUwLDggKzE1MCwxMiBAQAogc3RydWN0IG1lbXBvbGljeSAqbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsCiAJCQkJCSAgICB1bnNpZ25lZCBsb25nIGlkeCk7CiAKK3N0cnVjdCBtZW1wb2xpY3kgKmdldF92bWFfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpOworCiBleHRlcm4gdm9pZCBudW1hX2RlZmF1bHRfcG9saWN5KHZvaWQpOwogZXh0ZXJuIHZvaWQgbnVtYV9wb2xpY3lfaW5pdCh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgbWVtcG9saWN5IGRlZmF1bHRfcG9saWN5OwogCiAjZWxzZQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmggYi9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKaW5kZXggYWVmZWRmMC4uMThmYzc3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaApAQCAtMzMsNiArMzMsMTMgQEAKIAl1bnNpZ25lZCBpbnQJCWNhcGFjaXR5OwogfTsKIAorc3RydWN0IHNkX3NjciB7CisJdW5zaWduZWQgY2hhcgkJc2RhX3ZzbjsKKwl1bnNpZ25lZCBjaGFyCQlidXNfd2lkdGhzOworI2RlZmluZSBTRF9TQ1JfQlVTX1dJRFRIXzEJKDE8PDApCisjZGVmaW5lIFNEX1NDUl9CVVNfV0lEVEhfNAkoMTw8MikKK307CisKIHN0cnVjdCBtbWNfaG9zdDsKIAogLyoKQEAgLTQ3LDE5ICs1NCwyNyBAQAogI2RlZmluZSBNTUNfU1RBVEVfUFJFU0VOVAkoMTw8MCkJCS8qIHByZXNlbnQgaW4gc3lzZnMgKi8KICNkZWZpbmUgTU1DX1NUQVRFX0RFQUQJCSgxPDwxKQkJLyogZGV2aWNlIG5vIGxvbmdlciBpbiBzdGFjayAqLwogI2RlZmluZSBNTUNfU1RBVEVfQkFECQkoMTw8MikJCS8qIHVucmVjb2duaXNlZCBkZXZpY2UgKi8KKyNkZWZpbmUgTU1DX1NUQVRFX1NEQ0FSRAkoMTw8MykJCS8qIGlzIGFuIFNEIGNhcmQgKi8KKyNkZWZpbmUgTU1DX1NUQVRFX1JFQURPTkxZCSgxPDw0KQkJLyogY2FyZCBpcyByZWFkLW9ubHkgKi8KIAl1MzIJCQlyYXdfY2lkWzRdOwkvKiByYXcgY2FyZCBDSUQgKi8KIAl1MzIJCQlyYXdfY3NkWzRdOwkvKiByYXcgY2FyZCBDU0QgKi8KKwl1MzIJCQlyYXdfc2NyWzJdOwkvKiByYXcgY2FyZCBTQ1IgKi8KIAlzdHJ1Y3QgbW1jX2NpZAkJY2lkOwkJLyogY2FyZCBpZGVudGlmaWNhdGlvbiAqLwogCXN0cnVjdCBtbWNfY3NkCQljc2Q7CQkvKiBjYXJkIHNwZWNpZmljICovCisJc3RydWN0IHNkX3NjcgkJc2NyOwkJLyogZXh0cmEgU0QgaW5mb3JtYXRpb24gKi8KIH07CiAKICNkZWZpbmUgbW1jX2NhcmRfcHJlc2VudChjKQkoKGMpLT5zdGF0ZSAmIE1NQ19TVEFURV9QUkVTRU5UKQogI2RlZmluZSBtbWNfY2FyZF9kZWFkKGMpCSgoYyktPnN0YXRlICYgTU1DX1NUQVRFX0RFQUQpCiAjZGVmaW5lIG1tY19jYXJkX2JhZChjKQkJKChjKS0+c3RhdGUgJiBNTUNfU1RBVEVfQkFEKQorI2RlZmluZSBtbWNfY2FyZF9zZChjKQkJKChjKS0+c3RhdGUgJiBNTUNfU1RBVEVfU0RDQVJEKQorI2RlZmluZSBtbWNfY2FyZF9yZWFkb25seShjKQkoKGMpLT5zdGF0ZSAmIE1NQ19TVEFURV9SRUFET05MWSkKIAogI2RlZmluZSBtbWNfY2FyZF9zZXRfcHJlc2VudChjKQkoKGMpLT5zdGF0ZSB8PSBNTUNfU1RBVEVfUFJFU0VOVCkKICNkZWZpbmUgbW1jX2NhcmRfc2V0X2RlYWQoYykJKChjKS0+c3RhdGUgfD0gTU1DX1NUQVRFX0RFQUQpCiAjZGVmaW5lIG1tY19jYXJkX3NldF9iYWQoYykJKChjKS0+c3RhdGUgfD0gTU1DX1NUQVRFX0JBRCkKKyNkZWZpbmUgbW1jX2NhcmRfc2V0X3NkKGMpCSgoYyktPnN0YXRlIHw9IE1NQ19TVEFURV9TRENBUkQpCisjZGVmaW5lIG1tY19jYXJkX3NldF9yZWFkb25seShjKSAoKGMpLT5zdGF0ZSB8PSBNTUNfU1RBVEVfUkVBRE9OTFkpCiAKICNkZWZpbmUgbW1jX2NhcmRfbmFtZShjKQkoKGMpLT5jaWQucHJvZF9uYW1lKQogI2RlZmluZSBtbWNfY2FyZF9pZChjKQkJKChjKS0+ZGV2LmJ1c19pZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaCBiL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAppbmRleCA5YTA4OTNmLi5jMWYwMjFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCkBAIC00NiwxNiArNDYsMjggQEAKICNkZWZpbmUgTU1DX0JVU01PREVfT1BFTkRSQUlOCTEKICNkZWZpbmUgTU1DX0JVU01PREVfUFVTSFBVTEwJMgogCisJdW5zaWduZWQgY2hhcgljaGlwX3NlbGVjdDsJCS8qIFNQSSBjaGlwIHNlbGVjdCAqLworCisjZGVmaW5lIE1NQ19DU19ET05UQ0FSRQkJMAorI2RlZmluZSBNTUNfQ1NfSElHSAkJMQorI2RlZmluZSBNTUNfQ1NfTE9XCQkyCisKIAl1bnNpZ25lZCBjaGFyCXBvd2VyX21vZGU7CQkvKiBwb3dlciBzdXBwbHkgbW9kZSAqLwogCiAjZGVmaW5lIE1NQ19QT1dFUl9PRkYJCTAKICNkZWZpbmUgTU1DX1BPV0VSX1VQCQkxCiAjZGVmaW5lIE1NQ19QT1dFUl9PTgkJMgorCisJdW5zaWduZWQgY2hhcglidXNfd2lkdGg7CQkvKiBkYXRhIGJ1cyB3aWR0aCAqLworCisjZGVmaW5lIE1NQ19CVVNfV0lEVEhfMQkJMAorI2RlZmluZSBNTUNfQlVTX1dJRFRIXzQJCTIKIH07CiAKIHN0cnVjdCBtbWNfaG9zdF9vcHMgewogCXZvaWQJKCpyZXF1ZXN0KShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqcmVxKTsKIAl2b2lkCSgqc2V0X2lvcykoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKTsKKwlpbnQJKCpnZXRfcm8pKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CiB9OwogCiBzdHJ1Y3QgbW1jX2NhcmQ7CkBAIC03MCw2ICs4MiwxMCBAQAogCXVuc2lnbmVkIGludAkJZl9tYXg7CiAJdTMyCQkJb2NyX2F2YWlsOwogCisJdW5zaWduZWQgbG9uZwkJY2FwczsJCS8qIEhvc3QgY2FwYWJpbGl0aWVzICovCisKKyNkZWZpbmUgTU1DX0NBUF80X0JJVF9EQVRBCSgxIDw8IDApCS8qIENhbiB0aGUgaG9zdCBkbyA0IGJpdCB0cmFuc2ZlcnMgKi8KKwogCS8qIGhvc3Qgc3BlY2lmaWMgYmxvY2sgZGF0YSAqLwogCXVuc2lnbmVkIGludAkJbWF4X3NlZ19zaXplOwkvKiBzZWUgYmxrX3F1ZXVlX21heF9zZWdtZW50X3NpemUgKi8KIAl1bnNpZ25lZCBzaG9ydAkJbWF4X2h3X3NlZ3M7CS8qIHNlZSBibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzICovCkBAIC04MSw2ICs5NywxMCBAQAogCXN0cnVjdCBtbWNfaW9zCQlpb3M7CQkvKiBjdXJyZW50IGlvIGJ1cyBzZXR0aW5ncyAqLwogCXUzMgkJCW9jcjsJCS8qIHRoZSBjdXJyZW50IE9DUiBzZXR0aW5nICovCiAKKwl1bnNpZ25lZCBpbnQJCW1vZGU7CQkvKiBjdXJyZW50IGNhcmQgbW9kZSBvZiBob3N0ICovCisjZGVmaW5lIE1NQ19NT0RFX01NQwkJMAorI2RlZmluZSBNTUNfTU9ERV9TRAkJMQorCiAJc3RydWN0IGxpc3RfaGVhZAljYXJkczsJCS8qIGRldmljZXMgYXR0YWNoZWQgdG8gdGhpcyBob3N0ICovCiAKIAl3YWl0X3F1ZXVlX2hlYWRfdAl3cTsKQEAgLTg5LDYgKzEwOSw4IEBACiAJc3RydWN0IG1tY19jYXJkCQkqY2FyZF9zZWxlY3RlZDsJLyogdGhlIHNlbGVjdGVkIE1NQyBjYXJkICovCiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJZGV0ZWN0OworCisJdW5zaWduZWQgbG9uZwkJcHJpdmF0ZVswXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiB9OwogCiBleHRlcm4gc3RydWN0IG1tY19ob3N0ICptbWNfYWxsb2NfaG9zdChpbnQgZXh0cmEsIHN0cnVjdCBkZXZpY2UgKik7CkBAIC05NiwxNCArMTE4LDE4IEBACiBleHRlcm4gdm9pZCBtbWNfcmVtb3ZlX2hvc3Qoc3RydWN0IG1tY19ob3N0ICopOwogZXh0ZXJuIHZvaWQgbW1jX2ZyZWVfaG9zdChzdHJ1Y3QgbW1jX2hvc3QgKik7CiAKLSNkZWZpbmUgbW1jX3ByaXYoeCkJKCh2b2lkICopKCh4KSArIDEpKQorc3RhdGljIGlubGluZSB2b2lkICptbWNfcHJpdihzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJcmV0dXJuICh2b2lkICopaG9zdC0+cHJpdmF0ZTsKK30KKwogI2RlZmluZSBtbWNfZGV2KHgpCSgoeCktPmRldikKICNkZWZpbmUgbW1jX2hvc3RuYW1lKHgpCSgoeCktPmNsYXNzX2Rldi5jbGFzc19pZCkKIAogZXh0ZXJuIGludCBtbWNfc3VzcGVuZF9ob3N0KHN0cnVjdCBtbWNfaG9zdCAqLCBwbV9tZXNzYWdlX3QpOwogZXh0ZXJuIGludCBtbWNfcmVzdW1lX2hvc3Qoc3RydWN0IG1tY19ob3N0ICopOwogCi1leHRlcm4gdm9pZCBtbWNfZGV0ZWN0X2NoYW5nZShzdHJ1Y3QgbW1jX2hvc3QgKik7CitleHRlcm4gdm9pZCBtbWNfZGV0ZWN0X2NoYW5nZShzdHJ1Y3QgbW1jX2hvc3QgKiwgdW5zaWduZWQgbG9uZyBkZWxheSk7CiBleHRlcm4gdm9pZCBtbWNfcmVxdWVzdF9kb25lKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvbW1jLmggYi9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaAppbmRleCAwZDM1ZDRmLi4xYWI3OGU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaApAQCAtODgsNiArODgsOCBAQAogCiBleHRlcm4gaW50IG1tY193YWl0X2Zvcl9yZXEoc3RydWN0IG1tY19ob3N0ICosIHN0cnVjdCBtbWNfcmVxdWVzdCAqKTsKIGV4dGVybiBpbnQgbW1jX3dhaXRfZm9yX2NtZChzdHJ1Y3QgbW1jX2hvc3QgKiwgc3RydWN0IG1tY19jb21tYW5kICosIGludCk7CitleHRlcm4gaW50IG1tY193YWl0X2Zvcl9hcHBfY21kKHN0cnVjdCBtbWNfaG9zdCAqLCB1bnNpZ25lZCBpbnQsCisJc3RydWN0IG1tY19jb21tYW5kICosIGludCk7CiAKIGV4dGVybiBpbnQgX19tbWNfY2xhaW1faG9zdChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL3Byb3RvY29sLmggYi9pbmNsdWRlL2xpbnV4L21tYy9wcm90b2NvbC5oCmluZGV4IDg5NjM0MjguLmY4MTljYWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3Byb3RvY29sLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvcHJvdG9jb2wuaApAQCAtMjM2LDUgKzIzNiwxMiBAQAogI2RlZmluZSBDU0RfU1BFQ19WRVJfMiAgICAgIDIgICAgICAgICAgIC8qIEltcGxlbWVudHMgc3lzdGVtIHNwZWNpZmljYXRpb24gMi4wIC0gMi4yICovCiAjZGVmaW5lIENTRF9TUEVDX1ZFUl8zICAgICAgMyAgICAgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAzLjEgKi8KIAorCisvKgorICogU0QgYnVzIHdpZHRocworICovCisjZGVmaW5lIFNEX0JVU19XSURUSF8xICAgICAgMAorI2RlZmluZSBTRF9CVVNfV0lEVEhfNCAgICAgIDIKKwogI2VuZGlmICAvKiBNTUNfTU1DX1BST1RPQ09MX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKaW5kZXggNmM5MDQ2MS4uNWVkNDcxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCkBAIC00ODcsMTEgKzQ4NywyNyBAQAogCXVuc2lnbmVkIGxvbmcgc2VjdGlvbl9tZW1fbWFwOwogfTsKIAotZXh0ZXJuIHN0cnVjdCBtZW1fc2VjdGlvbiBtZW1fc2VjdGlvbltOUl9NRU1fU0VDVElPTlNdOworI2lmZGVmIENPTkZJR19TUEFSU0VNRU1fRVhUUkVNRQorI2RlZmluZSBTRUNUSU9OU19QRVJfUk9PVCAgICAgICAoUEFHRV9TSVpFIC8gc2l6ZW9mIChzdHJ1Y3QgbWVtX3NlY3Rpb24pKQorI2Vsc2UKKyNkZWZpbmUgU0VDVElPTlNfUEVSX1JPT1QJMQorI2VuZGlmCisKKyNkZWZpbmUgU0VDVElPTl9OUl9UT19ST09UKHNlYykJKChzZWMpIC8gU0VDVElPTlNfUEVSX1JPT1QpCisjZGVmaW5lIE5SX1NFQ1RJT05fUk9PVFMJKE5SX01FTV9TRUNUSU9OUyAvIFNFQ1RJT05TX1BFUl9ST09UKQorI2RlZmluZSBTRUNUSU9OX1JPT1RfTUFTSwkoU0VDVElPTlNfUEVSX1JPT1QgLSAxKQorCisjaWZkZWYgQ09ORklHX1NQQVJTRU1FTV9FWFRSRU1FCitleHRlcm4gc3RydWN0IG1lbV9zZWN0aW9uICptZW1fc2VjdGlvbltOUl9TRUNUSU9OX1JPT1RTXTsKKyNlbHNlCitleHRlcm4gc3RydWN0IG1lbV9zZWN0aW9uIG1lbV9zZWN0aW9uW05SX1NFQ1RJT05fUk9PVFNdW1NFQ1RJT05TX1BFUl9ST09UXTsKKyNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtZW1fc2VjdGlvbiAqX19ucl90b19zZWN0aW9uKHVuc2lnbmVkIGxvbmcgbnIpCiB7Ci0JcmV0dXJuICZtZW1fc2VjdGlvbltucl07CisJaWYgKCFtZW1fc2VjdGlvbltTRUNUSU9OX05SX1RPX1JPT1QobnIpXSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZtZW1fc2VjdGlvbltTRUNUSU9OX05SX1RPX1JPT1QobnIpXVtuciAmIFNFQ1RJT05fUk9PVF9NQVNLXTsKIH0KIAogLyoKQEAgLTUxMywxMiArNTI5LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHZhbGlkX3NlY3Rpb24oc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uKQogewotCXJldHVybiAoc2VjdGlvbi0+c2VjdGlvbl9tZW1fbWFwICYgU0VDVElPTl9NQVJLRURfUFJFU0VOVCk7CisJcmV0dXJuIChzZWN0aW9uICYmIChzZWN0aW9uLT5zZWN0aW9uX21lbV9tYXAgJiBTRUNUSU9OX01BUktFRF9QUkVTRU5UKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3Rpb25faGFzX21lbV9tYXAoc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uKQogewotCXJldHVybiAoc2VjdGlvbi0+c2VjdGlvbl9tZW1fbWFwICYgU0VDVElPTl9IQVNfTUVNX01BUCk7CisJcmV0dXJuIChzZWN0aW9uICYmIChzZWN0aW9uLT5zZWN0aW9uX21lbV9tYXAgJiBTRUNUSU9OX0hBU19NRU1fTUFQKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHZhbGlkX3NlY3Rpb25fbnIodW5zaWduZWQgbG9uZyBucikKQEAgLTU3Miw2ICs1ODgsNyBAQAogdm9pZCBzcGFyc2VfaW5pdCh2b2lkKTsKICNlbHNlCiAjZGVmaW5lIHNwYXJzZV9pbml0KCkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIHNwYXJzZV9pbmRleF9pbml0KF9zZWMsIF9uaWQpICBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZiAvKiBDT05GSUdfU1BBUlNFTUVNICovCiAKICNpZmRlZiBDT05GSUdfTk9ERVNfU1BBTl9PVEhFUl9OT0RFUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tc2cuaCBiL2luY2x1ZGUvbGludXgvbXNnLmgKaW5kZXggMmM0YzZhYS4uOTAzZTBhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tc2cuaAorKysgYi9pbmNsdWRlL2xpbnV4L21zZy5oCkBAIC03Nyw2ICs3Nyw3IEBACiAvKiBvbmUgbXNxX3F1ZXVlIHN0cnVjdHVyZSBmb3IgZWFjaCBwcmVzZW50IHF1ZXVlIG9uIHRoZSBzeXN0ZW0gKi8KIHN0cnVjdCBtc2dfcXVldWUgewogCXN0cnVjdCBrZXJuX2lwY19wZXJtIHFfcGVybTsKKwlpbnQgcV9pZDsKIAl0aW1lX3QgcV9zdGltZTsJCQkvKiBsYXN0IG1zZ3NuZCB0aW1lICovCiAJdGltZV90IHFfcnRpbWU7CQkJLyogbGFzdCBtc2dyY3YgdGltZSAqLwogCXRpbWVfdCBxX2N0aW1lOwkJCS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXY2NDN4eC5oIGIvaW5jbHVkZS9saW51eC9tdjY0M3h4LmgKaW5kZXggNTc3M2VhNC4uMGIwOGNkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdjY0M3h4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tdjY0M3h4LmgKQEAgLTk4MCw3ICs5ODAsNyBAQAogLyogSTJDIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBNVjY0WFhYX0kyQ19DVExSX05BTUUJCQkJCSJtdjY0eHh4IGkyYyIKKyNkZWZpbmUgTVY2NFhYWF9JMkNfQ1RMUl9OQU1FCQkJCQkibXY2NHh4eF9pMmMiCiAjZGVmaW5lIE1WNjRYWFhfSTJDX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YzAwMAogI2RlZmluZSBNVjY0WFhYX0kyQ19SRUdfQkxPQ0tfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmgKaW5kZXggMDg4NzQyYi4uN2UwMzNlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oCkBAIC0yNjMsNiArMjYzLDkgQEAKIAkvKiBVbmlxdWUgSUQgKi8KIAl1bnNpZ25lZCBpbnQgaWQ7CiAKKwkvKiBGbGFncyAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKwogI2lmZGVmIENPTkZJR19JUF9ORl9OQVRfTkVFREVECiAJLyogVGhpcyBpcyB0aGUgb3JpZ2luYWwgcGVyLXByb3RvIHBhcnQsIHVzZWQgdG8gbWFwIHRoZQogCSAqIGV4cGVjdGVkIGNvbm5lY3Rpb24gdGhlIHdheSB0aGUgcmVjaXBpZW50IGV4cGVjdHMuICovCkBAIC0yNzIsNiArMjc1LDggQEAKICNlbmRpZgogfTsKIAorI2RlZmluZSBJUF9DVF9FWFBFQ1RfUEVSTUFORU5UCTB4MQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpcF9jb25udHJhY2sgKgogdHVwbGVoYXNoX3RvX2N0cmFjayhjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmhhc2gpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmgKaW5kZXggZGM0ZDJhMC4uOTA3ZDRmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaApAQCAtNTIsNyArNTIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWV4dGVybiB2b2lkIF9faXBfY3RfZXhwZWN0X3VubGlua19kZXN0cm95KHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApOworZXh0ZXJuIHZvaWQgaXBfY3RfdW5saW5rX2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKIAogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgKmlwX2Nvbm50cmFja19oYXNoOwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oCmluZGV4IGZlY2QyYTAuLjczYjk1NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmgKQEAgLTE5LDUgKzE5LDEwIEBACiBhbGxvY19udWxsX2JpbmRpbmcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAogCQkgICBzdHJ1Y3QgaXBfbmF0X2luZm8gKmluZm8sCiAJCSAgIHVuc2lnbmVkIGludCBob29rbnVtKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludAorYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCisJCQkgICAgIHN0cnVjdCBpcF9uYXRfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pOwogI2VuZGlmCiAjZW5kaWYgLyogX0lQX05BVF9SVUxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oIGIvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKaW5kZXggZjVhNjY5NS4uZjM0NzY3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKQEAgLTEzNCw2ICsxMzQsNyBAQAogfTsKIAogZXh0ZXJuIHZvaWQgZ2V0X3BhZ2Vfc3RhdGUoc3RydWN0IHBhZ2Vfc3RhdGUgKnJldCk7CitleHRlcm4gdm9pZCBnZXRfcGFnZV9zdGF0ZV9ub2RlKHN0cnVjdCBwYWdlX3N0YXRlICpyZXQsIGludCBub2RlKTsKIGV4dGVybiB2b2lkIGdldF9mdWxsX3BhZ2Vfc3RhdGUoc3RydWN0IHBhZ2Vfc3RhdGUgKnJldCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX3JlYWRfcGFnZV9zdGF0ZSh1bnNpZ25lZCBsb25nIG9mZnNldCk7CiBleHRlcm4gdm9pZCBfX21vZF9wYWdlX3N0YXRlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRlbHRhKTsKQEAgLTE5NCw2ICsxOTUsNyBAQAogI2RlZmluZSBTZXRQYWdlRGlydHkocGFnZSkJc2V0X2JpdChQR19kaXJ0eSwgJihwYWdlKS0+ZmxhZ3MpCiAjZGVmaW5lIFRlc3RTZXRQYWdlRGlydHkocGFnZSkJdGVzdF9hbmRfc2V0X2JpdChQR19kaXJ0eSwgJihwYWdlKS0+ZmxhZ3MpCiAjZGVmaW5lIENsZWFyUGFnZURpcnR5KHBhZ2UpCWNsZWFyX2JpdChQR19kaXJ0eSwgJihwYWdlKS0+ZmxhZ3MpCisjZGVmaW5lIF9fQ2xlYXJQYWdlRGlydHkocGFnZSkJX19jbGVhcl9iaXQoUEdfZGlydHksICYocGFnZSktPmZsYWdzKQogI2RlZmluZSBUZXN0Q2xlYXJQYWdlRGlydHkocGFnZSkgdGVzdF9hbmRfY2xlYXJfYml0KFBHX2RpcnR5LCAmKHBhZ2UpLT5mbGFncykKIAogI2RlZmluZSBTZXRQYWdlTFJVKHBhZ2UpCXNldF9iaXQoUEdfbHJ1LCAmKHBhZ2UpLT5mbGFncykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IGJjNGM0MDAuLjczNDkwNTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtMTksNDM2ICsxOSwxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAKLS8qCi0gKiBVbmRlciBQQ0ksIGVhY2ggZGV2aWNlIGhhcyAyNTYgYnl0ZXMgb2YgY29uZmlndXJhdGlvbiBhZGRyZXNzIHNwYWNlLAotICogb2Ygd2hpY2ggdGhlIGZpcnN0IDY0IGJ5dGVzIGFyZSBzdGFuZGFyZGl6ZWQgYXMgZm9sbG93czoKLSAqLwotI2RlZmluZSBQQ0lfVkVORE9SX0lECQkweDAwCS8qIDE2IGJpdHMgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9JRAkJMHgwMgkvKiAxNiBiaXRzICovCi0jZGVmaW5lIFBDSV9DT01NQU5ECQkweDA0CS8qIDE2IGJpdHMgKi8KLSNkZWZpbmUgIFBDSV9DT01NQU5EX0lPCQkweDEJLyogRW5hYmxlIHJlc3BvbnNlIGluIEkvTyBzcGFjZSAqLwotI2RlZmluZSAgUENJX0NPTU1BTkRfTUVNT1JZCTB4MgkvKiBFbmFibGUgcmVzcG9uc2UgaW4gTWVtb3J5IHNwYWNlICovCi0jZGVmaW5lICBQQ0lfQ09NTUFORF9NQVNURVIJMHg0CS8qIEVuYWJsZSBidXMgbWFzdGVyaW5nICovCi0jZGVmaW5lICBQQ0lfQ09NTUFORF9TUEVDSUFMCTB4OAkvKiBFbmFibGUgcmVzcG9uc2UgdG8gc3BlY2lhbCBjeWNsZXMgKi8KLSNkZWZpbmUgIFBDSV9DT01NQU5EX0lOVkFMSURBVEUJMHgxMAkvKiBVc2UgbWVtb3J5IHdyaXRlIGFuZCBpbnZhbGlkYXRlICovCi0jZGVmaW5lICBQQ0lfQ09NTUFORF9WR0FfUEFMRVRURSAweDIwCS8qIEVuYWJsZSBwYWxldHRlIHNub29waW5nICovCi0jZGVmaW5lICBQQ0lfQ09NTUFORF9QQVJJVFkJMHg0MAkvKiBFbmFibGUgcGFyaXR5IGNoZWNraW5nICovCi0jZGVmaW5lICBQQ0lfQ09NTUFORF9XQUlUIAkweDgwCS8qIEVuYWJsZSBhZGRyZXNzL2RhdGEgc3RlcHBpbmcgKi8KLSNkZWZpbmUgIFBDSV9DT01NQU5EX1NFUlIJMHgxMDAJLyogRW5hYmxlIFNFUlIgKi8KLSNkZWZpbmUgIFBDSV9DT01NQU5EX0ZBU1RfQkFDSwkweDIwMAkvKiBFbmFibGUgYmFjay10by1iYWNrIHdyaXRlcyAqLwotI2RlZmluZSAgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFIDB4NDAwIC8qIElOVHggRW11bGF0aW9uIERpc2FibGUgKi8KLQotI2RlZmluZSBQQ0lfU1RBVFVTCQkweDA2CS8qIDE2IGJpdHMgKi8KLSNkZWZpbmUgIFBDSV9TVEFUVVNfQ0FQX0xJU1QJMHgxMAkvKiBTdXBwb3J0IENhcGFiaWxpdHkgTGlzdCAqLwotI2RlZmluZSAgUENJX1NUQVRVU182Nk1IWgkweDIwCS8qIFN1cHBvcnQgNjYgTWh6IFBDSSAyLjEgYnVzICovCi0jZGVmaW5lICBQQ0lfU1RBVFVTX1VERgkJMHg0MAkvKiBTdXBwb3J0IFVzZXIgRGVmaW5hYmxlIEZlYXR1cmVzIFtvYnNvbGV0ZV0gKi8KLSNkZWZpbmUgIFBDSV9TVEFUVVNfRkFTVF9CQUNLCTB4ODAJLyogQWNjZXB0IGZhc3QtYmFjayB0byBiYWNrICovCi0jZGVmaW5lICBQQ0lfU1RBVFVTX1BBUklUWQkweDEwMAkvKiBEZXRlY3RlZCBwYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgIFBDSV9TVEFUVVNfREVWU0VMX01BU0sJMHg2MDAJLyogREVWU0VMIHRpbWluZyAqLwotI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfRkFTVAkweDAwMAkKLSNkZWZpbmUgIFBDSV9TVEFUVVNfREVWU0VMX01FRElVTSAweDIwMAotI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfU0xPVyAweDQwMAotI2RlZmluZSAgUENJX1NUQVRVU19TSUdfVEFSR0VUX0FCT1JUIDB4ODAwIC8qIFNldCBvbiB0YXJnZXQgYWJvcnQgKi8KLSNkZWZpbmUgIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCAweDEwMDAgLyogTWFzdGVyIGFjayBvZiAiICovCi0jZGVmaW5lICBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQgMHgyMDAwIC8qIFNldCBvbiBtYXN0ZXIgYWJvcnQgKi8KLSNkZWZpbmUgIFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUiAweDQwMDAgLyogU2V0IHdoZW4gd2UgZHJpdmUgU0VSUiAqLwotI2RlZmluZSAgUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkgMHg4MDAwIC8qIFNldCBvbiBwYXJpdHkgZXJyb3IgKi8KLQotI2RlZmluZSBQQ0lfQ0xBU1NfUkVWSVNJT04JMHgwOAkvKiBIaWdoIDI0IGJpdHMgYXJlIGNsYXNzLCBsb3cgOAotCQkJCQkgICByZXZpc2lvbiAqLwotI2RlZmluZSBQQ0lfUkVWSVNJT05fSUQgICAgICAgICAweDA4ICAgIC8qIFJldmlzaW9uIElEICovCi0jZGVmaW5lIFBDSV9DTEFTU19QUk9HICAgICAgICAgIDB4MDkgICAgLyogUmVnLiBMZXZlbCBQcm9ncmFtbWluZyBJbnRlcmZhY2UgKi8KLSNkZWZpbmUgUENJX0NMQVNTX0RFVklDRSAgICAgICAgMHgwYSAgICAvKiBEZXZpY2UgY2xhc3MgKi8KLQotI2RlZmluZSBQQ0lfQ0FDSEVfTElORV9TSVpFCTB4MGMJLyogOCBiaXRzICovCi0jZGVmaW5lIFBDSV9MQVRFTkNZX1RJTUVSCTB4MGQJLyogOCBiaXRzICovCi0jZGVmaW5lIFBDSV9IRUFERVJfVFlQRQkJMHgwZQkvKiA4IGJpdHMgKi8KLSNkZWZpbmUgIFBDSV9IRUFERVJfVFlQRV9OT1JNQUwJMAotI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX0JSSURHRSAxCi0jZGVmaW5lICBQQ0lfSEVBREVSX1RZUEVfQ0FSREJVUyAyCi0KLSNkZWZpbmUgUENJX0JJU1QJCTB4MGYJLyogOCBiaXRzICovCi0jZGVmaW5lICBQQ0lfQklTVF9DT0RFX01BU0sJMHgwZgkvKiBSZXR1cm4gcmVzdWx0ICovCi0jZGVmaW5lICBQQ0lfQklTVF9TVEFSVAkJMHg0MAkvKiAxIHRvIHN0YXJ0IEJJU1QsIDIgc2VjcyBvciBsZXNzICovCi0jZGVmaW5lICBQQ0lfQklTVF9DQVBBQkxFCTB4ODAJLyogMSBpZiBCSVNUIGNhcGFibGUgKi8KLQotLyoKLSAqIEJhc2UgYWRkcmVzc2VzIHNwZWNpZnkgbG9jYXRpb25zIGluIG1lbW9yeSBvciBJL08gc3BhY2UuCi0gKiBEZWNvZGVkIHNpemUgY2FuIGJlIGRldGVybWluZWQgYnkgd3JpdGluZyBhIHZhbHVlIG9mIAotICogMHhmZmZmZmZmZiB0byB0aGUgcmVnaXN0ZXIsIGFuZCByZWFkaW5nIGl0IGJhY2suICBPbmx5IAotICogMSBiaXRzIGFyZSBkZWNvZGVkLgotICovCi0jZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMAkweDEwCS8qIDMyIGJpdHMgKi8KLSNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18xCTB4MTQJLyogMzIgYml0cyBbaHR5cGUgMCwxIG9ubHldICovCi0jZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMgkweDE4CS8qIDMyIGJpdHMgW2h0eXBlIDAgb25seV0gKi8KLSNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18zCTB4MWMJLyogMzIgYml0cyAqLwotI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzQJMHgyMAkvKiAzMiBiaXRzICovCi0jZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfNQkweDI0CS8qIDMyIGJpdHMgKi8KLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UJMHgwMQkvKiAwID0gbWVtb3J5LCAxID0gSS9PICovCi0jZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPIDB4MDEKLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfTUVNT1JZIDB4MDAKLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSyAweDA2Ci0jZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzMyCTB4MDAJLyogMzIgYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMU0JMHgwMgkvKiBCZWxvdyAxTSBbb2Jzb2xldGVdICovCi0jZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0CTB4MDQJLyogNjQgYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1BSRUZFVENICTB4MDgJLyogcHJlZmV0Y2hhYmxlPyAqLwotI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSwkofjB4MGZVTCkKLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSwkofjB4MDNVTCkKLS8qIGJpdCAxIGlzIHJlc2VydmVkIGlmIGFkZHJlc3Nfc3BhY2UgPSAxICovCi0KLS8qIEhlYWRlciB0eXBlIDAgKG5vcm1hbCBkZXZpY2VzKSAqLwotI2RlZmluZSBQQ0lfQ0FSREJVU19DSVMJCTB4MjgKLSNkZWZpbmUgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQJMHgyYwotI2RlZmluZSBQQ0lfU1VCU1lTVEVNX0lECTB4MmUgIAotI2RlZmluZSBQQ0lfUk9NX0FERFJFU1MJCTB4MzAJLyogQml0cyAzMS4uMTEgYXJlIGFkZHJlc3MsIDEwLi4xIHJlc2VydmVkICovCi0jZGVmaW5lICBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFCTB4MDEKLSNkZWZpbmUgUENJX1JPTV9BRERSRVNTX01BU0sJKH4weDdmZlVMKQotCi0jZGVmaW5lIFBDSV9DQVBBQklMSVRZX0xJU1QJMHgzNAkvKiBPZmZzZXQgb2YgZmlyc3QgY2FwYWJpbGl0eSBsaXN0IGVudHJ5ICovCi0KLS8qIDB4MzUtMHgzYiBhcmUgcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgUENJX0lOVEVSUlVQVF9MSU5FCTB4M2MJLyogOCBiaXRzICovCi0jZGVmaW5lIFBDSV9JTlRFUlJVUFRfUElOCTB4M2QJLyogOCBiaXRzICovCi0jZGVmaW5lIFBDSV9NSU5fR05UCQkweDNlCS8qIDggYml0cyAqLwotI2RlZmluZSBQQ0lfTUFYX0xBVAkJMHgzZgkvKiA4IGJpdHMgKi8KLQotLyogSGVhZGVyIHR5cGUgMSAoUENJLXRvLVBDSSBicmlkZ2VzKSAqLwotI2RlZmluZSBQQ0lfUFJJTUFSWV9CVVMJCTB4MTgJLyogUHJpbWFyeSBidXMgbnVtYmVyICovCi0jZGVmaW5lIFBDSV9TRUNPTkRBUllfQlVTCTB4MTkJLyogU2Vjb25kYXJ5IGJ1cyBudW1iZXIgKi8KLSNkZWZpbmUgUENJX1NVQk9SRElOQVRFX0JVUwkweDFhCS8qIEhpZ2hlc3QgYnVzIG51bWJlciBiZWhpbmQgdGhlIGJyaWRnZSAqLwotI2RlZmluZSBQQ0lfU0VDX0xBVEVOQ1lfVElNRVIJMHgxYgkvKiBMYXRlbmN5IHRpbWVyIGZvciBzZWNvbmRhcnkgaW50ZXJmYWNlICovCi0jZGVmaW5lIFBDSV9JT19CQVNFCQkweDFjCS8qIEkvTyByYW5nZSBiZWhpbmQgdGhlIGJyaWRnZSAqLwotI2RlZmluZSBQQ0lfSU9fTElNSVQJCTB4MWQKLSNkZWZpbmUgIFBDSV9JT19SQU5HRV9UWVBFX01BU0sJMHgwZlVMCS8qIEkvTyBicmlkZ2luZyB0eXBlICovCi0jZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV8xNgkweDAwCi0jZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV8zMgkweDAxCi0jZGVmaW5lICBQQ0lfSU9fUkFOR0VfTUFTSwkofjB4MGZVTCkKLSNkZWZpbmUgUENJX1NFQ19TVEFUVVMJCTB4MWUJLyogU2Vjb25kYXJ5IHN0YXR1cyByZWdpc3Rlciwgb25seSBiaXQgMTQgdXNlZCAqLwotI2RlZmluZSBQQ0lfTUVNT1JZX0JBU0UJCTB4MjAJLyogTWVtb3J5IHJhbmdlIGJlaGluZCAqLwotI2RlZmluZSBQQ0lfTUVNT1JZX0xJTUlUCTB4MjIKLSNkZWZpbmUgIFBDSV9NRU1PUllfUkFOR0VfVFlQRV9NQVNLIDB4MGZVTAotI2RlZmluZSAgUENJX01FTU9SWV9SQU5HRV9NQVNLCSh+MHgwZlVMKQotI2RlZmluZSBQQ0lfUFJFRl9NRU1PUllfQkFTRQkweDI0CS8qIFByZWZldGNoYWJsZSBtZW1vcnkgcmFuZ2UgYmVoaW5kICovCi0jZGVmaW5lIFBDSV9QUkVGX01FTU9SWV9MSU1JVAkweDI2Ci0jZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFX01BU0sgMHgwZlVMCi0jZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFXzMyCTB4MDAKLSNkZWZpbmUgIFBDSV9QUkVGX1JBTkdFX1RZUEVfNjQJMHgwMQotI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfTUFTSwkofjB4MGZVTCkKLSNkZWZpbmUgUENJX1BSRUZfQkFTRV9VUFBFUjMyCTB4MjgJLyogVXBwZXIgaGFsZiBvZiBwcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlICovCi0jZGVmaW5lIFBDSV9QUkVGX0xJTUlUX1VQUEVSMzIJMHgyYwotI2RlZmluZSBQQ0lfSU9fQkFTRV9VUFBFUjE2CTB4MzAJLyogVXBwZXIgaGFsZiBvZiBJL08gYWRkcmVzc2VzICovCi0jZGVmaW5lIFBDSV9JT19MSU1JVF9VUFBFUjE2CTB4MzIKLS8qIDB4MzQgc2FtZSBhcyBmb3IgaHR5cGUgMCAqLwotLyogMHgzNS0weDNiIGlzIHJlc2VydmVkICovCi0jZGVmaW5lIFBDSV9ST01fQUREUkVTUzEJMHgzOAkvKiBTYW1lIGFzIFBDSV9ST01fQUREUkVTUywgYnV0IGZvciBodHlwZSAxICovCi0vKiAweDNjLTB4M2QgYXJlIHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KLSNkZWZpbmUgUENJX0JSSURHRV9DT05UUk9MCTB4M2UKLSNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1BBUklUWQkweDAxCS8qIEVuYWJsZSBwYXJpdHkgZGV0ZWN0aW9uIG9uIHNlY29uZGFyeSBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1NFUlIJMHgwMgkvKiBUaGUgc2FtZSBmb3IgU0VSUiBmb3J3YXJkaW5nICovCi0jZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9OT19JU0EJMHgwNAkvKiBEaXNhYmxlIGJyaWRnaW5nIG9mIElTQSBwb3J0cyAqLwotI2RlZmluZSAgUENJX0JSSURHRV9DVExfVkdBCTB4MDgJLyogRm9yd2FyZCBWR0EgYWRkcmVzc2VzICovCi0jZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9NQVNURVJfQUJPUlQgMHgyMCAgLyogUmVwb3J0IG1hc3RlciBhYm9ydHMgKi8KLSNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX0JVU19SRVNFVCAweDQwCS8qIFNlY29uZGFyeSBidXMgcmVzZXQgKi8KLSNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX0ZBU1RfQkFDSyAweDgwCS8qIEZhc3QgQmFjazJCYWNrIGVuYWJsZWQgb24gc2Vjb25kYXJ5IGludGVyZmFjZSAqLwotCi0vKiBIZWFkZXIgdHlwZSAyIChDYXJkQnVzIGJyaWRnZXMpICovCi0jZGVmaW5lIFBDSV9DQl9DQVBBQklMSVRZX0xJU1QJMHgxNAotLyogMHgxNSByZXNlcnZlZCAqLwotI2RlZmluZSBQQ0lfQ0JfU0VDX1NUQVRVUwkweDE2CS8qIFNlY29uZGFyeSBzdGF0dXMgKi8KLSNkZWZpbmUgUENJX0NCX1BSSU1BUllfQlVTCTB4MTgJLyogUENJIGJ1cyBudW1iZXIgKi8KLSNkZWZpbmUgUENJX0NCX0NBUkRfQlVTCQkweDE5CS8qIENhcmRCdXMgYnVzIG51bWJlciAqLwotI2RlZmluZSBQQ0lfQ0JfU1VCT1JESU5BVEVfQlVTCTB4MWEJLyogU3Vib3JkaW5hdGUgYnVzIG51bWJlciAqLwotI2RlZmluZSBQQ0lfQ0JfTEFURU5DWV9USU1FUgkweDFiCS8qIENhcmRCdXMgbGF0ZW5jeSB0aW1lciAqLwotI2RlZmluZSBQQ0lfQ0JfTUVNT1JZX0JBU0VfMAkweDFjCi0jZGVmaW5lIFBDSV9DQl9NRU1PUllfTElNSVRfMAkweDIwCi0jZGVmaW5lIFBDSV9DQl9NRU1PUllfQkFTRV8xCTB4MjQKLSNkZWZpbmUgUENJX0NCX01FTU9SWV9MSU1JVF8xCTB4MjgKLSNkZWZpbmUgUENJX0NCX0lPX0JBU0VfMAkweDJjCi0jZGVmaW5lIFBDSV9DQl9JT19CQVNFXzBfSEkJMHgyZQotI2RlZmluZSBQQ0lfQ0JfSU9fTElNSVRfMAkweDMwCi0jZGVmaW5lIFBDSV9DQl9JT19MSU1JVF8wX0hJCTB4MzIKLSNkZWZpbmUgUENJX0NCX0lPX0JBU0VfMQkweDM0Ci0jZGVmaW5lIFBDSV9DQl9JT19CQVNFXzFfSEkJMHgzNgotI2RlZmluZSBQQ0lfQ0JfSU9fTElNSVRfMQkweDM4Ci0jZGVmaW5lIFBDSV9DQl9JT19MSU1JVF8xX0hJCTB4M2EKLSNkZWZpbmUgIFBDSV9DQl9JT19SQU5HRV9NQVNLCSh+MHgwM1VMKQotLyogMHgzYy0weDNkIGFyZSBzYW1lIGFzIGZvciBodHlwZSAwICovCi0jZGVmaW5lIFBDSV9DQl9CUklER0VfQ09OVFJPTAkweDNlCi0jZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9QQVJJVFkJMHgwMQkvKiBTaW1pbGFyIHRvIHN0YW5kYXJkIGJyaWRnZSBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9TRVJSCQkweDAyCi0jZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9JU0EJCTB4MDQKLSNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1ZHQQkJMHgwOAotI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfTUFTVEVSX0FCT1JUCTB4MjAKLSNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX0NCX1JFU0VUCTB4NDAJLyogQ2FyZEJ1cyByZXNldCAqLwotI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfMTZCSVRfSU5UCTB4ODAJLyogRW5hYmxlIGludGVycnVwdCBmb3IgMTYtYml0IGNhcmRzICovCi0jZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9QUkVGRVRDSF9NRU0wIDB4MTAwCS8qIFByZWZldGNoIGVuYWJsZSBmb3IgYm90aCBtZW1vcnkgcmVnaW9ucyAqLwotI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfUFJFRkVUQ0hfTUVNMSAweDIwMAotI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfUE9TVF9XUklURVMJMHg0MDAKLSNkZWZpbmUgUENJX0NCX1NVQlNZU1RFTV9WRU5ET1JfSUQgMHg0MAotI2RlZmluZSBQQ0lfQ0JfU1VCU1lTVEVNX0lECTB4NDIKLSNkZWZpbmUgUENJX0NCX0xFR0FDWV9NT0RFX0JBU0UJMHg0NAkvKiAxNi1iaXQgUEMgQ2FyZCBsZWdhY3kgbW9kZSBiYXNlIGFkZHJlc3MgKEV4Q2EpICovCi0vKiAweDQ4LTB4N2YgcmVzZXJ2ZWQgKi8KLQotLyogQ2FwYWJpbGl0eSBsaXN0cyAqLwotCi0jZGVmaW5lIFBDSV9DQVBfTElTVF9JRAkJMAkvKiBDYXBhYmlsaXR5IElEICovCi0jZGVmaW5lICBQQ0lfQ0FQX0lEX1BNCQkweDAxCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KLSNkZWZpbmUgIFBDSV9DQVBfSURfQUdQCQkweDAyCS8qIEFjY2VsZXJhdGVkIEdyYXBoaWNzIFBvcnQgKi8KLSNkZWZpbmUgIFBDSV9DQVBfSURfVlBECQkweDAzCS8qIFZpdGFsIFByb2R1Y3QgRGF0YSAqLwotI2RlZmluZSAgUENJX0NBUF9JRF9TTE9USUQJMHgwNAkvKiBTbG90IElkZW50aWZpY2F0aW9uICovCi0jZGVmaW5lICBQQ0lfQ0FQX0lEX01TSQkJMHgwNQkvKiBNZXNzYWdlIFNpZ25hbGxlZCBJbnRlcnJ1cHRzICovCi0jZGVmaW5lICBQQ0lfQ0FQX0lEX0NIU1dQCTB4MDYJLyogQ29tcGFjdFBDSSBIb3RTd2FwICovCi0jZGVmaW5lICBQQ0lfQ0FQX0lEX1BDSVgJMHgwNwkvKiBQQ0ktWCAqLwotI2RlZmluZSAgUENJX0NBUF9JRF9TSFBDIAkweDBDCS8qIFBDSSBTdGFuZGFyZCBIb3QtUGx1ZyBDb250cm9sbGVyICovCi0jZGVmaW5lICBQQ0lfQ0FQX0lEX0VYUCAJMHgxMAkvKiBQQ0kgRXhwcmVzcyAqLwotI2RlZmluZSAgUENJX0NBUF9JRF9NU0lYCTB4MTEJLyogTVNJLVggKi8KLSNkZWZpbmUgUENJX0NBUF9MSVNUX05FWFQJMQkvKiBOZXh0IGNhcGFiaWxpdHkgaW4gdGhlIGxpc3QgKi8KLSNkZWZpbmUgUENJX0NBUF9GTEFHUwkJMgkvKiBDYXBhYmlsaXR5IGRlZmluZWQgZmxhZ3MgKDE2IGJpdHMpICovCi0jZGVmaW5lIFBDSV9DQVBfU0laRU9GCQk0Ci0KLS8qIFBvd2VyIE1hbmFnZW1lbnQgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgUENJX1BNX1BNQyAgICAgICAgICAgICAgMiAgICAgICAvKiBQTSBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfVkVSX01BU0sJMHgwMDA3CS8qIFZlcnNpb24gKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0NMT0NLCTB4MDAwOAkvKiBQTUUgY2xvY2sgcmVxdWlyZWQgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUkVTRVJWRUQgICAgMHgwMDEwICAvKiBSZXNlcnZlZCBmaWVsZCAqLwotI2RlZmluZSAgUENJX1BNX0NBUF9EU0kJCTB4MDAyMAkvKiBEZXZpY2Ugc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfQVVYX1BPV0VSCTB4MDFDMAkvKiBBdXhpbGxpYXJ5IHBvd2VyIHN1cHBvcnQgbWFzayAqLwotI2RlZmluZSAgUENJX1BNX0NBUF9EMQkJMHgwMjAwCS8qIEQxIHBvd2VyIHN0YXRlIHN1cHBvcnQgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfRDIJCTB4MDQwMAkvKiBEMiBwb3dlciBzdGF0ZSBzdXBwb3J0ICovCi0jZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRQkJMHgwODAwCS8qIFBNRSBwaW4gc3VwcG9ydGVkICovCi0jZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9NQVNLICAgIDB4RjgwMCAgLyogUE1FIE1hc2sgb2YgYWxsIHN1cHBvcnRlZCBzdGF0ZXMgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QwICAgICAgMHgwODAwICAvKiBQTUUjIGZyb20gRDAgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QxICAgICAgMHgxMDAwICAvKiBQTUUjIGZyb20gRDEgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QyICAgICAgMHgyMDAwICAvKiBQTUUjIGZyb20gRDIgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QzICAgICAgMHg0MDAwICAvKiBQTUUjIGZyb20gRDMgKGhvdCkgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QzY29sZCAgMHg4MDAwICAvKiBQTUUjIGZyb20gRDMgKGNvbGQpICovCi0jZGVmaW5lIFBDSV9QTV9DVFJMCQk0CS8qIFBNIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSAgUENJX1BNX0NUUkxfU1RBVEVfTUFTSwkweDAwMDMJLyogQ3VycmVudCBwb3dlciBzdGF0ZSAoRDAgdG8gRDMpICovCi0jZGVmaW5lICBQQ0lfUE1fQ1RSTF9QTUVfRU5BQkxFCTB4MDEwMAkvKiBQTUUgcGluIGVuYWJsZSAqLwotI2RlZmluZSAgUENJX1BNX0NUUkxfREFUQV9TRUxfTUFTSwkweDFlMDAJLyogRGF0YSBzZWxlY3QgKD8/KSAqLwotI2RlZmluZSAgUENJX1BNX0NUUkxfREFUQV9TQ0FMRV9NQVNLCTB4NjAwMAkvKiBEYXRhIHNjYWxlICg/PykgKi8KLSNkZWZpbmUgIFBDSV9QTV9DVFJMX1BNRV9TVEFUVVMJMHg4MDAwCS8qIFBNRSBwaW4gc3RhdHVzICovCi0jZGVmaW5lIFBDSV9QTV9QUEJfRVhURU5TSU9OUwk2CS8qIFBQQiBzdXBwb3J0IGV4dGVuc2lvbnMgKD8/KSAqLwotI2RlZmluZSAgUENJX1BNX1BQQl9CMl9CMwkweDQwCS8qIFN0b3AgY2xvY2sgd2hlbiBpbiBEM2hvdCAoPz8pICovCi0jZGVmaW5lICBQQ0lfUE1fQlBDQ19FTkFCTEUJMHg4MAkvKiBCdXMgcG93ZXIvY2xvY2sgY29udHJvbCBlbmFibGUgKD8/KSAqLwotI2RlZmluZSBQQ0lfUE1fREFUQV9SRUdJU1RFUgk3CS8qICg/PykgKi8KLSNkZWZpbmUgUENJX1BNX1NJWkVPRgkJOAotCi0vKiBBR1AgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgUENJX0FHUF9WRVJTSU9OCQkyCS8qIEJDRCB2ZXJzaW9uIG51bWJlciAqLwotI2RlZmluZSBQQ0lfQUdQX1JGVQkJMwkvKiBSZXN0IG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KLSNkZWZpbmUgUENJX0FHUF9TVEFUVVMJCTQJLyogU3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SUV9NQVNLCTB4ZmYwMDAwMDAJLyogTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgLSAxICovCi0jZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19TQkEJMHgwMjAwCS8qIFNpZGViYW5kIGFkZHJlc3Npbmcgc3VwcG9ydGVkICovCi0jZGVmaW5lICBQQ0lfQUdQX1NUQVRVU182NEJJVAkweDAwMjAJLyogNjQtYml0IGFkZHJlc3Npbmcgc3VwcG9ydGVkICovCi0jZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19GVwkweDAwMTAJLyogRlcgdHJhbnNmZXJzIHN1cHBvcnRlZCAqLwotI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUkFURTQJMHgwMDA0CS8qIDR4IHRyYW5zZmVyIHJhdGUgc3VwcG9ydGVkICovCi0jZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SQVRFMgkweDAwMDIJLyogMnggdHJhbnNmZXIgcmF0ZSBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JBVEUxCTB4MDAwMQkvKiAxeCB0cmFuc2ZlciByYXRlIHN1cHBvcnRlZCAqLwotI2RlZmluZSBQQ0lfQUdQX0NPTU1BTkQJCTgJLyogQ29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JRX01BU0sgMHhmZjAwMDAwMCAgLyogTWFzdGVyOiBNYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyAqLwotI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1NCQQkweDAyMDAJLyogU2lkZWJhbmQgYWRkcmVzc2luZyBlbmFibGVkICovCi0jZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfQUdQCTB4MDEwMAkvKiBBbGxvdyBwcm9jZXNzaW5nIG9mIEFHUCB0cmFuc2FjdGlvbnMgKi8KLSNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF82NEJJVAkweDAwMjAgCS8qIEFsbG93IHByb2Nlc3Npbmcgb2YgNjQtYml0IGFkZHJlc3NlcyAqLwotI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX0ZXCTB4MDAxMCAJLyogRm9yY2UgRlcgdHJhbnNmZXJzICovCi0jZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTQJMHgwMDA0CS8qIFVzZSA0eCByYXRlICovCi0jZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTIJMHgwMDAyCS8qIFVzZSAyeCByYXRlICovCi0jZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTEJMHgwMDAxCS8qIFVzZSAxeCByYXRlICovCi0jZGVmaW5lIFBDSV9BR1BfU0laRU9GCQkxMgotCi0vKiBWaXRhbCBQcm9kdWN0IERhdGEgKi8KLQotI2RlZmluZSBQQ0lfVlBEX0FERFIJCTIJLyogQWRkcmVzcyB0byBhY2Nlc3MgKDE1IGJpdHMhKSAqLwotI2RlZmluZSAgUENJX1ZQRF9BRERSX01BU0sJMHg3ZmZmCS8qIEFkZHJlc3MgbWFzayAqLwotI2RlZmluZSAgUENJX1ZQRF9BRERSX0YJCTB4ODAwMAkvKiBXcml0ZSAwLCAxIGluZGljYXRlcyBjb21wbGV0aW9uICovCi0jZGVmaW5lIFBDSV9WUERfREFUQQkJNAkvKiAzMi1iaXRzIG9mIGRhdGEgcmV0dXJuZWQgaGVyZSAqLwotCi0vKiBTbG90IElkZW50aWZpY2F0aW9uICovCi0KLSNkZWZpbmUgUENJX1NJRF9FU1IJCTIJLyogRXhwYW5zaW9uIFNsb3QgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgIFBDSV9TSURfRVNSX05TTE9UUwkweDFmCS8qIE51bWJlciBvZiBleHBhbnNpb24gc2xvdHMgYXZhaWxhYmxlICovCi0jZGVmaW5lICBQQ0lfU0lEX0VTUl9GSUMJMHgyMAkvKiBGaXJzdCBJbiBDaGFzc2lzIEZsYWcgKi8KLSNkZWZpbmUgUENJX1NJRF9DSEFTU0lTX05SCTMJLyogQ2hhc3NpcyBOdW1iZXIgKi8KLQotLyogTWVzc2FnZSBTaWduYWxsZWQgSW50ZXJydXB0cyByZWdpc3RlcnMgKi8KLQotI2RlZmluZSBQQ0lfTVNJX0ZMQUdTCQkyCS8qIFZhcmlvdXMgZmxhZ3MgKi8KLSNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfNjRCSVQJMHg4MAkvKiA2NC1iaXQgYWRkcmVzc2VzIGFsbG93ZWQgKi8KLSNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfUVNJWkUJMHg3MAkvKiBNZXNzYWdlIHF1ZXVlIHNpemUgY29uZmlndXJlZCAqLwotI2RlZmluZSAgUENJX01TSV9GTEFHU19RTUFTSwkweDBlCS8qIE1heGltdW0gcXVldWUgc2l6ZSBhdmFpbGFibGUgKi8KLSNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfRU5BQkxFCTB4MDEJLyogTVNJIGZlYXR1cmUgZW5hYmxlZCAqLwotI2RlZmluZSAgUENJX01TSV9GTEFHU19NQVNLQklUCTB4MTAwCS8qIDY0LWJpdCBtYXNrIGJpdHMgYWxsb3dlZCAqLwotI2RlZmluZSBQQ0lfTVNJX1JGVQkJMwkvKiBSZXN0IG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KLSNkZWZpbmUgUENJX01TSV9BRERSRVNTX0xPCTQJLyogTG93ZXIgMzIgYml0cyAqLwotI2RlZmluZSBQQ0lfTVNJX0FERFJFU1NfSEkJOAkvKiBVcHBlciAzMiBiaXRzIChpZiBQQ0lfTVNJX0ZMQUdTXzY0QklUIHNldCkgKi8KLSNkZWZpbmUgUENJX01TSV9EQVRBXzMyCQk4CS8qIDE2IGJpdHMgb2YgZGF0YSBmb3IgMzItYml0IGRldmljZXMgKi8KLSNkZWZpbmUgUENJX01TSV9EQVRBXzY0CQkxMgkvKiAxNiBiaXRzIG9mIGRhdGEgZm9yIDY0LWJpdCBkZXZpY2VzICovCi0jZGVmaW5lIFBDSV9NU0lfTUFTS19CSVQJMTYJLyogTWFzayBiaXRzIHJlZ2lzdGVyICovCi0KLS8qIENvbXBhY3RQQ0kgSG90c3dhcCBSZWdpc3RlciAqLwotCi0jZGVmaW5lIFBDSV9DSFNXUF9DU1IJCTIJLyogQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lICBQQ0lfQ0hTV1BfREhBCQkweDAxCS8qIERldmljZSBIaWRpbmcgQXJtICovCi0jZGVmaW5lICBQQ0lfQ0hTV1BfRUlNCQkweDAyCS8qIEVOVU0jIFNpZ25hbCBNYXNrICovCi0jZGVmaW5lICBQQ0lfQ0hTV1BfUElFCQkweDA0CS8qIFBlbmRpbmcgSW5zZXJ0IG9yIEV4dHJhY3QgKi8KLSNkZWZpbmUgIFBDSV9DSFNXUF9MT08JCTB4MDgJLyogTEVEIE9uIC8gT2ZmICovCi0jZGVmaW5lICBQQ0lfQ0hTV1BfUEkJCTB4MzAJLyogUHJvZ3JhbW1pbmcgSW50ZXJmYWNlICovCi0jZGVmaW5lICBQQ0lfQ0hTV1BfRVhUCQkweDQwCS8qIEVOVU0jIHN0YXR1cyAtIGV4dHJhY3Rpb24gKi8KLSNkZWZpbmUgIFBDSV9DSFNXUF9JTlMJCTB4ODAJLyogRU5VTSMgc3RhdHVzIC0gaW5zZXJ0aW9uICovCi0KLS8qIFBDSS1YIHJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIFBDSV9YX0NNRAkJMgkvKiBNb2RlcyAmIEZlYXR1cmVzICovCi0jZGVmaW5lICBQQ0lfWF9DTURfRFBFUlJfRQkweDAwMDEJLyogRGF0YSBQYXJpdHkgRXJyb3IgUmVjb3ZlcnkgRW5hYmxlICovCi0jZGVmaW5lICBQQ0lfWF9DTURfRVJPCQkweDAwMDIJLyogRW5hYmxlIFJlbGF4ZWQgT3JkZXJpbmcgKi8KLSNkZWZpbmUgIFBDSV9YX0NNRF9NQVhfUkVBRAkweDAwMGMJLyogTWF4IE1lbW9yeSBSZWFkIEJ5dGUgQ291bnQgKi8KLSNkZWZpbmUgIFBDSV9YX0NNRF9NQVhfU1BMSVQJMHgwMDcwCS8qIE1heCBPdXRzdGFuZGluZyBTcGxpdCBUcmFuc2FjdGlvbnMgKi8KLSNkZWZpbmUgIFBDSV9YX0NNRF9WRVJTSU9OKHgpIAkoKCh4KSA+PiAxMikgJiAzKSAvKiBWZXJzaW9uICovCi0jZGVmaW5lIFBDSV9YX1NUQVRVUwkJNAkvKiBQQ0ktWCBjYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgIFBDSV9YX1NUQVRVU19ERVZGTgkweDAwMDAwMGZmCS8qIEEgY29weSBvZiBkZXZmbiAqLwotI2RlZmluZSAgUENJX1hfU1RBVFVTX0JVUwkweDAwMDBmZjAwCS8qIEEgY29weSBvZiBidXMgbnIgKi8KLSNkZWZpbmUgIFBDSV9YX1NUQVRVU182NEJJVAkweDAwMDEwMDAwCS8qIDY0LWJpdCBkZXZpY2UgKi8KLSNkZWZpbmUgIFBDSV9YX1NUQVRVU18xMzNNSFoJMHgwMDAyMDAwMAkvKiAxMzMgTUh6IGNhcGFibGUgKi8KLSNkZWZpbmUgIFBDSV9YX1NUQVRVU19TUExfRElTQwkweDAwMDQwMDAwCS8qIFNwbGl0IENvbXBsZXRpb24gRGlzY2FyZGVkICovCi0jZGVmaW5lICBQQ0lfWF9TVEFUVVNfVU5YX1NQTAkweDAwMDgwMDAwCS8qIFVuZXhwZWN0ZWQgU3BsaXQgQ29tcGxldGlvbiAqLwotI2RlZmluZSAgUENJX1hfU1RBVFVTX0NPTVBMRVgJMHgwMDEwMDAwMAkvKiBEZXZpY2UgQ29tcGxleGl0eSAqLwotI2RlZmluZSAgUENJX1hfU1RBVFVTX01BWF9SRUFECTB4MDA2MDAwMDAJLyogRGVzaWduZWQgTWF4IE1lbW9yeSBSZWFkIENvdW50ICovCi0jZGVmaW5lICBQQ0lfWF9TVEFUVVNfTUFYX1NQTElUCTB4MDM4MDAwMDAJLyogRGVzaWduZWQgTWF4IE91dHN0YW5kaW5nIFNwbGl0IFRyYW5zYWN0aW9ucyAqLwotI2RlZmluZSAgUENJX1hfU1RBVFVTX01BWF9DVU0JMHgxYzAwMDAwMAkvKiBEZXNpZ25lZCBNYXggQ3VtdWxhdGl2ZSBSZWFkIFNpemUgKi8KLSNkZWZpbmUgIFBDSV9YX1NUQVRVU19TUExfRVJSCTB4MjAwMDAwMDAJLyogUmN2ZCBTcGxpdCBDb21wbGV0aW9uIEVycm9yIE1zZyAqLwotI2RlZmluZSAgUENJX1hfU1RBVFVTXzI2Nk1IWgkweDQwMDAwMDAwCS8qIDI2NiBNSHogY2FwYWJsZSAqLwotI2RlZmluZSAgUENJX1hfU1RBVFVTXzUzM01IWgkweDgwMDAwMDAwCS8qIDUzMyBNSHogY2FwYWJsZSAqLwotCi0vKiBQQ0kgRXhwcmVzcyBjYXBhYmlsaXR5IHJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIFBDSV9FWFBfRkxBR1MJCTIJLyogQ2FwYWJpbGl0aWVzIHJlZ2lzdGVyICovCi0jZGVmaW5lIFBDSV9FWFBfRkxBR1NfVkVSUwkweDAwMGYJLyogQ2FwYWJpbGl0eSB2ZXJzaW9uICovCi0jZGVmaW5lIFBDSV9FWFBfRkxBR1NfVFlQRQkweDAwZjAJLyogRGV2aWNlL1BvcnQgdHlwZSAqLwotI2RlZmluZSAgUENJX0VYUF9UWVBFX0VORFBPSU5UCTB4MAkvKiBFeHByZXNzIEVuZHBvaW50ICovCi0jZGVmaW5lICBQQ0lfRVhQX1RZUEVfTEVHX0VORAkweDEJLyogTGVnYWN5IEVuZHBvaW50ICovCi0jZGVmaW5lICBQQ0lfRVhQX1RZUEVfUk9PVF9QT1JUIDB4NAkvKiBSb290IFBvcnQgKi8KLSNkZWZpbmUgIFBDSV9FWFBfVFlQRV9VUFNUUkVBTQkweDUJLyogVXBzdHJlYW0gUG9ydCAqLwotI2RlZmluZSAgUENJX0VYUF9UWVBFX0RPV05TVFJFQU0gMHg2CS8qIERvd25zdHJlYW0gUG9ydCAqLwotI2RlZmluZSAgUENJX0VYUF9UWVBFX1BDSV9CUklER0UgMHg3CS8qIFBDSS9QQ0ktWCBCcmlkZ2UgKi8KLSNkZWZpbmUgUENJX0VYUF9GTEFHU19TTE9UCTB4MDEwMAkvKiBTbG90IGltcGxlbWVudGVkICovCi0jZGVmaW5lIFBDSV9FWFBfRkxBR1NfSVJRCTB4M2UwMAkvKiBJbnRlcnJ1cHQgbWVzc2FnZSBudW1iZXIgKi8KLSNkZWZpbmUgUENJX0VYUF9ERVZDQVAJCTQJLyogRGV2aWNlIGNhcGFiaWxpdGllcyAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUEFZTE9BRAkweDA3CS8qIE1heF9QYXlsb2FkX1NpemUgKi8KLSNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX1BIQU5UT00JMHgxOAkvKiBQaGFudG9tIGZ1bmN0aW9ucyAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfRVhUX1RBRwkweDIwCS8qIEV4dGVuZGVkIHRhZ3MgKi8KLSNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0wwUwkweDFjMAkvKiBMMHMgQWNjZXB0YWJsZSBMYXRlbmN5ICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9MMQkweGUwMAkvKiBMMSBBY2NlcHRhYmxlIExhdGVuY3kgKi8KLSNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0FUTl9CVVQJMHgxMDAwCS8qIEF0dGVudGlvbiBCdXR0b24gUHJlc2VudCAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfQVROX0lORAkweDIwMDAJLyogQXR0ZW50aW9uIEluZGljYXRvciBQcmVzZW50ICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9QV1JfSU5ECTB4NDAwMAkvKiBQb3dlciBJbmRpY2F0b3IgUHJlc2VudCAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUFdSX1ZBTAkweDNmYzAwMDAgLyogU2xvdCBQb3dlciBMaW1pdCBWYWx1ZSAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUFdSX1NDTAkweGMwMDAwMDAgLyogU2xvdCBQb3dlciBMaW1pdCBTY2FsZSAqLwotI2RlZmluZSBQQ0lfRVhQX0RFVkNUTAkJOAkvKiBEZXZpY2UgQ29udHJvbCAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDVExfQ0VSRQkweDAwMDEJLyogQ29ycmVjdGFibGUgRXJyb3IgUmVwb3J0aW5nIEVuLiAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDVExfTkZFUkUJMHgwMDAyCS8qIE5vbi1GYXRhbCBFcnJvciBSZXBvcnRpbmcgRW5hYmxlICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9GRVJFCTB4MDAwNAkvKiBGYXRhbCBFcnJvciBSZXBvcnRpbmcgRW5hYmxlICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9VUlJFCTB4MDAwOAkvKiBVbnN1cHBvcnRlZCBSZXF1ZXN0IFJlcG9ydGluZyBFbi4gKi8KLSNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX1JFTEFYX0VOIDB4MDAxMCAvKiBFbmFibGUgcmVsYXhlZCBvcmRlcmluZyAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDVExfUEFZTE9BRAkweDAwZTAJLyogTWF4X1BheWxvYWRfU2l6ZSAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDVExfRVhUX1RBRwkweDAxMDAJLyogRXh0ZW5kZWQgVGFnIEZpZWxkIEVuYWJsZSAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDVExfUEhBTlRPTQkweDAyMDAJLyogUGhhbnRvbSBGdW5jdGlvbnMgRW5hYmxlICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9BVVhfUE1FCTB4MDQwMAkvKiBBdXhpbGlhcnkgUG93ZXIgUE0gRW5hYmxlICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9OT1NOT09QX0VOIDB4MDgwMCAgLyogRW5hYmxlIE5vIFNub29wICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9SRUFEUlEJMHg3MDAwCS8qIE1heF9SZWFkX1JlcXVlc3RfU2l6ZSAqLwotI2RlZmluZSBQQ0lfRVhQX0RFVlNUQQkJMTAJLyogRGV2aWNlIFN0YXR1cyAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfQ0VECTB4MDEJLyogQ29ycmVjdGFibGUgRXJyb3IgRGV0ZWN0ZWQgKi8KLSNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX05GRUQJMHgwMgkvKiBOb24tRmF0YWwgRXJyb3IgRGV0ZWN0ZWQgKi8KLSNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX0ZFRAkweDA0CS8qIEZhdGFsIEVycm9yIERldGVjdGVkICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9VUkQJMHgwOAkvKiBVbnN1cHBvcnRlZCBSZXF1ZXN0IERldGVjdGVkICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9BVVhQRAkweDEwCS8qIEFVWCBQb3dlciBEZXRlY3RlZCAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfVFJQTkQJMHgyMAkvKiBUcmFuc2FjdGlvbnMgUGVuZGluZyAqLwotI2RlZmluZSBQQ0lfRVhQX0xOS0NBUAkJMTIJLyogTGluayBDYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgUENJX0VYUF9MTktDVEwJCTE2CS8qIExpbmsgQ29udHJvbCAqLwotI2RlZmluZSBQQ0lfRVhQX0xOS1NUQQkJMTgJLyogTGluayBTdGF0dXMgKi8KLSNkZWZpbmUgUENJX0VYUF9TTFRDQVAJCTIwCS8qIFNsb3QgQ2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIFBDSV9FWFBfU0xUQ1RMCQkyNAkvKiBTbG90IENvbnRyb2wgKi8KLSNkZWZpbmUgUENJX0VYUF9TTFRTVEEJCTI2CS8qIFNsb3QgU3RhdHVzICovCi0jZGVmaW5lIFBDSV9FWFBfUlRDVEwJCTI4CS8qIFJvb3QgQ29udHJvbCAqLwotI2RlZmluZSAgUENJX0VYUF9SVENUTF9TRUNFRQkweDAxCS8qIFN5c3RlbSBFcnJvciBvbiBDb3JyZWN0YWJsZSBFcnJvciAqLwotI2RlZmluZSAgUENJX0VYUF9SVENUTF9TRU5GRUUJMHgwMgkvKiBTeXN0ZW0gRXJyb3Igb24gTm9uLUZhdGFsIEVycm9yICovCi0jZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFRkVFCTB4MDQJLyogU3lzdGVtIEVycm9yIG9uIEZhdGFsIEVycm9yICovCi0jZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1BNRUlFCTB4MDgJLyogUE1FIEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgIFBDSV9FWFBfUlRDVExfQ1JTU1ZFCTB4MTAJLyogQ1JTIFNvZnR3YXJlIFZpc2liaWxpdHkgRW5hYmxlICovCi0jZGVmaW5lIFBDSV9FWFBfUlRDQVAJCTMwCS8qIFJvb3QgQ2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIFBDSV9FWFBfUlRTVEEJCTMyCS8qIFJvb3QgU3RhdHVzICovCi0KLS8qIEV4dGVuZGVkIENhcGFiaWxpdGllcyAoUENJLVggMi4wIGFuZCBFeHByZXNzKSAqLwotI2RlZmluZSBQQ0lfRVhUX0NBUF9JRChoZWFkZXIpCQkoaGVhZGVyICYgMHgwMDAwZmZmZikKLSNkZWZpbmUgUENJX0VYVF9DQVBfVkVSKGhlYWRlcikJCSgoaGVhZGVyID4+IDE2KSAmIDB4ZikKLSNkZWZpbmUgUENJX0VYVF9DQVBfTkVYVChoZWFkZXIpCSgoaGVhZGVyID4+IDIwKSAmIDB4ZmZjKQotCi0jZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX0VSUgkxCi0jZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX1ZDCTIKLSNkZWZpbmUgUENJX0VYVF9DQVBfSURfRFNOCTMKLSNkZWZpbmUgUENJX0VYVF9DQVBfSURfUFdSCTQKLQotLyogQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nICovCi0jZGVmaW5lIFBDSV9FUlJfVU5DT1JfU1RBVFVTCTQJLyogVW5jb3JyZWN0YWJsZSBFcnJvciBTdGF0dXMgKi8KLSNkZWZpbmUgIFBDSV9FUlJfVU5DX1RSQUlOCTB4MDAwMDAwMDEJLyogVHJhaW5pbmcgKi8KLSNkZWZpbmUgIFBDSV9FUlJfVU5DX0RMUAkweDAwMDAwMDEwCS8qIERhdGEgTGluayBQcm90b2NvbCAqLwotI2RlZmluZSAgUENJX0VSUl9VTkNfUE9JU09OX1RMUAkweDAwMDAxMDAwCS8qIFBvaXNvbmVkIFRMUCAqLwotI2RlZmluZSAgUENJX0VSUl9VTkNfRkNQCTB4MDAwMDIwMDAJLyogRmxvdyBDb250cm9sIFByb3RvY29sICovCi0jZGVmaW5lICBQQ0lfRVJSX1VOQ19DT01QX1RJTUUJMHgwMDAwNDAwMAkvKiBDb21wbGV0aW9uIFRpbWVvdXQgKi8KLSNkZWZpbmUgIFBDSV9FUlJfVU5DX0NPTVBfQUJPUlQJMHgwMDAwODAwMAkvKiBDb21wbGV0ZXIgQWJvcnQgKi8KLSNkZWZpbmUgIFBDSV9FUlJfVU5DX1VOWF9DT01QCTB4MDAwMTAwMDAJLyogVW5leHBlY3RlZCBDb21wbGV0aW9uICovCi0jZGVmaW5lICBQQ0lfRVJSX1VOQ19SWF9PVkVSCTB4MDAwMjAwMDAJLyogUmVjZWl2ZXIgT3ZlcmZsb3cgKi8KLSNkZWZpbmUgIFBDSV9FUlJfVU5DX01BTEZfVExQCTB4MDAwNDAwMDAJLyogTWFsZm9ybWVkIFRMUCAqLwotI2RlZmluZSAgUENJX0VSUl9VTkNfRUNSQwkweDAwMDgwMDAwCS8qIEVDUkMgRXJyb3IgU3RhdHVzICovCi0jZGVmaW5lICBQQ0lfRVJSX1VOQ19VTlNVUAkweDAwMTAwMDAwCS8qIFVuc3VwcG9ydGVkIFJlcXVlc3QgKi8KLSNkZWZpbmUgUENJX0VSUl9VTkNPUl9NQVNLCTgJLyogVW5jb3JyZWN0YWJsZSBFcnJvciBNYXNrICovCi0JLyogU2FtZSBiaXRzIGFzIGFib3ZlICovCi0jZGVmaW5lIFBDSV9FUlJfVU5DT1JfU0VWRVIJMTIJLyogVW5jb3JyZWN0YWJsZSBFcnJvciBTZXZlcml0eSAqLwotCS8qIFNhbWUgYml0cyBhcyBhYm92ZSAqLwotI2RlZmluZSBQQ0lfRVJSX0NPUl9TVEFUVVMJMTYJLyogQ29ycmVjdGFibGUgRXJyb3IgU3RhdHVzICovCi0jZGVmaW5lICBQQ0lfRVJSX0NPUl9SQ1ZSCTB4MDAwMDAwMDEJLyogUmVjZWl2ZXIgRXJyb3IgU3RhdHVzICovCi0jZGVmaW5lICBQQ0lfRVJSX0NPUl9CQURfVExQCTB4MDAwMDAwNDAJLyogQmFkIFRMUCBTdGF0dXMgKi8KLSNkZWZpbmUgIFBDSV9FUlJfQ09SX0JBRF9ETExQCTB4MDAwMDAwODAJLyogQmFkIERMTFAgU3RhdHVzICovCi0jZGVmaW5lICBQQ0lfRVJSX0NPUl9SRVBfUk9MTAkweDAwMDAwMTAwCS8qIFJFUExBWV9OVU0gUm9sbG92ZXIgKi8KLSNkZWZpbmUgIFBDSV9FUlJfQ09SX1JFUF9USU1FUgkweDAwMDAxMDAwCS8qIFJlcGxheSBUaW1lciBUaW1lb3V0ICovCi0jZGVmaW5lIFBDSV9FUlJfQ09SX01BU0sJMjAJLyogQ29ycmVjdGFibGUgRXJyb3IgTWFzayAqLwotCS8qIFNhbWUgYml0cyBhcyBhYm92ZSAqLwotI2RlZmluZSBQQ0lfRVJSX0NBUAkJMjQJLyogQWR2YW5jZWQgRXJyb3IgQ2FwYWJpbGl0aWVzICovCi0jZGVmaW5lICBQQ0lfRVJSX0NBUF9GRVAoeCkJKCh4KSAmIDMxKQkvKiBGaXJzdCBFcnJvciBQb2ludGVyICovCi0jZGVmaW5lICBQQ0lfRVJSX0NBUF9FQ1JDX0dFTkMJMHgwMDAwMDAyMAkvKiBFQ1JDIEdlbmVyYXRpb24gQ2FwYWJsZSAqLwotI2RlZmluZSAgUENJX0VSUl9DQVBfRUNSQ19HRU5FCTB4MDAwMDAwNDAJLyogRUNSQyBHZW5lcmF0aW9uIEVuYWJsZSAqLwotI2RlZmluZSAgUENJX0VSUl9DQVBfRUNSQ19DSEtDCTB4MDAwMDAwODAJLyogRUNSQyBDaGVjayBDYXBhYmxlICovCi0jZGVmaW5lICBQQ0lfRVJSX0NBUF9FQ1JDX0NIS0UJMHgwMDAwMDEwMAkvKiBFQ1JDIENoZWNrIEVuYWJsZSAqLwotI2RlZmluZSBQQ0lfRVJSX0hFQURFUl9MT0cJMjgJLyogSGVhZGVyIExvZyBSZWdpc3RlciAoMTYgYnl0ZXMpICovCi0jZGVmaW5lIFBDSV9FUlJfUk9PVF9DT01NQU5ECTQ0CS8qIFJvb3QgRXJyb3IgQ29tbWFuZCAqLwotI2RlZmluZSBQQ0lfRVJSX1JPT1RfU1RBVFVTCTQ4Ci0jZGVmaW5lIFBDSV9FUlJfUk9PVF9DT1JfU1JDCTUyCi0jZGVmaW5lIFBDSV9FUlJfUk9PVF9TUkMJNTQKLQotLyogVmlydHVhbCBDaGFubmVsICovCi0jZGVmaW5lIFBDSV9WQ19QT1JUX1JFRzEJNAotI2RlZmluZSBQQ0lfVkNfUE9SVF9SRUcyCTgKLSNkZWZpbmUgUENJX1ZDX1BPUlRfQ1RSTAkxMgotI2RlZmluZSBQQ0lfVkNfUE9SVF9TVEFUVVMJMTQKLSNkZWZpbmUgUENJX1ZDX1JFU19DQVAJCTE2Ci0jZGVmaW5lIFBDSV9WQ19SRVNfQ1RSTAkJMjAKLSNkZWZpbmUgUENJX1ZDX1JFU19TVEFUVVMJMjYKLQotLyogUG93ZXIgQnVkZ2V0aW5nICovCi0jZGVmaW5lIFBDSV9QV1JfRFNSCQk0CS8qIERhdGEgU2VsZWN0IFJlZ2lzdGVyICovCi0jZGVmaW5lIFBDSV9QV1JfREFUQQkJOAkvKiBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lICBQQ0lfUFdSX0RBVEFfQkFTRSh4KQkoKHgpICYgMHhmZikJICAgIC8qIEJhc2UgUG93ZXIgKi8KLSNkZWZpbmUgIFBDSV9QV1JfREFUQV9TQ0FMRSh4KQkoKCh4KSA+PiA4KSAmIDMpICAgIC8qIERhdGEgU2NhbGUgKi8KLSNkZWZpbmUgIFBDSV9QV1JfREFUQV9QTV9TVUIoeCkJKCgoeCkgPj4gMTApICYgNykgICAvKiBQTSBTdWIgU3RhdGUgKi8KLSNkZWZpbmUgIFBDSV9QV1JfREFUQV9QTV9TVEFURSh4KSAoKCh4KSA+PiAxMykgJiAzKSAvKiBQTSBTdGF0ZSAqLwotI2RlZmluZSAgUENJX1BXUl9EQVRBX1RZUEUoeCkJKCgoeCkgPj4gMTUpICYgNykgICAvKiBUeXBlICovCi0jZGVmaW5lICBQQ0lfUFdSX0RBVEFfUkFJTCh4KQkoKCh4KSA+PiAxOCkgJiA3KSAgIC8qIFBvd2VyIFJhaWwgKi8KLSNkZWZpbmUgUENJX1BXUl9DQVAJCTEyCS8qIENhcGFiaWxpdHkgKi8KLSNkZWZpbmUgIFBDSV9QV1JfQ0FQX0JVREdFVCh4KQkoKHgpICYgMSkJLyogSW5jbHVkZWQgaW4gc3lzdGVtIGJ1ZGdldCAqLworLyogSW5jbHVkZSB0aGUgcGNpIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2lfcmVncy5oPgogCiAvKiBJbmNsdWRlIHRoZSBJRCBsaXN0ICovCi0KICNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiAKIC8qCkBAIC00OTYsMTEgKzcwLDEyIEBACiAKIHR5cGVkZWYgaW50IF9fYml0d2lzZSBwY2lfcG93ZXJfdDsKIAotI2RlZmluZSBQQ0lfRDAJKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAwKQotI2RlZmluZSBQQ0lfRDEJKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAxKQotI2RlZmluZSBQQ0lfRDIJKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAyKQorI2RlZmluZSBQQ0lfRDAJCSgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMCkKKyNkZWZpbmUgUENJX0QxCQkoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDEpCisjZGVmaW5lIFBDSV9EMgkJKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAyKQogI2RlZmluZSBQQ0lfRDNob3QJKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAzKQogI2RlZmluZSBQQ0lfRDNjb2xkCSgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNCkKKyNkZWZpbmUgUENJX1VOS05PV04JKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSA1KQogI2RlZmluZSBQQ0lfUE9XRVJfRVJST1IJKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAtMSkKIAogLyoKQEAgLTU2MiwxMSArMTM3LDYgQEAKIAlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqcm9tX2F0dHI7IC8qIGF0dHJpYnV0ZSBkZXNjcmlwdG9yIGZvciBzeXNmcyBST00gZW50cnkgKi8KIAlpbnQgcm9tX2F0dHJfZW5hYmxlZDsJCS8qIGhhcyBkaXNwbGF5IG9mIHRoZSByb20gYXR0cmlidXRlIGJlZW4gZW5hYmxlZD8gKi8KIAlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqcmVzX2F0dHJbREVWSUNFX0NPVU5UX1JFU09VUkNFXTsgLyogc3lzZnMgZmlsZSBmb3IgcmVzb3VyY2VzICovCi0jaWZkZWYgQ09ORklHX1BDSV9OQU1FUwotI2RlZmluZSBQQ0lfTkFNRV9TSVpFCTI1NQotI2RlZmluZSBQQ0lfTkFNRV9IQUxGCV9fc3RyaW5naWZ5KDQzKQkvKiBsZXNzIHRoYW4gaGFsZiB0byBoYW5kbGUgc2xvcCAqLwotCWNoYXIJCXByZXR0eV9uYW1lW1BDSV9OQU1FX1NJWkVdOwkvKiBwcmV0dHkgbmFtZSBmb3IgdXNlcnMgdG8gc2VlICovCi0jZW5kaWYKIH07CiAKICNkZWZpbmUgcGNpX2Rldl9nKG4pIGxpc3RfZW50cnkobiwgc3RydWN0IHBjaV9kZXYsIGdsb2JhbF9saXN0KQpAQCAtNTgyLDE1ICsxNTIsMTUgQEAKICAqCTctMTAJYnJpZGdlczogYWRkcmVzcyBzcGFjZSBhc3NpZ25lZCB0byBidXNlcyBiZWhpbmQgdGhlIGJyaWRnZQogICovCiAKLSNkZWZpbmUgUENJX1JPTV9SRVNPVVJDRSA2Ci0jZGVmaW5lIFBDSV9CUklER0VfUkVTT1VSQ0VTIDcKLSNkZWZpbmUgUENJX05VTV9SRVNPVVJDRVMgMTEKKyNkZWZpbmUgUENJX1JPTV9SRVNPVVJDRQk2CisjZGVmaW5lIFBDSV9CUklER0VfUkVTT1VSQ0VTCTcKKyNkZWZpbmUgUENJX05VTV9SRVNPVVJDRVMJMTEKIAogI2lmbmRlZiBQQ0lfQlVTX05VTV9SRVNPVVJDRVMKLSNkZWZpbmUgUENJX0JVU19OVU1fUkVTT1VSQ0VTIDgKKyNkZWZpbmUgUENJX0JVU19OVU1fUkVTT1VSQ0VTCTgKICNlbmRpZgotICAKLSNkZWZpbmUgUENJX1JFR0lPTl9GTEFHX01BU0sgMHgwZlUJLyogVGhlc2UgYml0cyBvZiByZXNvdXJjZSBmbGFncyB0ZWxsIHVzIHRoZSBQQ0kgcmVnaW9uIGZsYWdzICovCisKKyNkZWZpbmUgUENJX1JFR0lPTl9GTEFHX01BU0sJMHgwZlUJLyogVGhlc2UgYml0cyBvZiByZXNvdXJjZSBmbGFncyB0ZWxsIHVzIHRoZSBQQ0kgcmVnaW9uIGZsYWdzICovCiAKIHN0cnVjdCBwY2lfYnVzIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CQkvKiBub2RlIGluIGxpc3Qgb2YgYnVzZXMgKi8KQEAgLTY5OSw3ICsyNjksNyBAQAogICogQGRldl9jbGFzc19tYXNrOiB0aGUgY2xhc3MgbWFzayBmb3IgdGhpcyBkZXZpY2UKICAqCiAgKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gY3JlYXRlIGEgc3RydWN0IHBjaV9kZXZpY2VfaWQgdGhhdCBtYXRjaGVzIGEKLSAqIHNwZWNpZmljIFBDSSBjbGFzcy4gIFRoZSB2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yLCBhbmQgc3ViZGV2aWNlIAorICogc3BlY2lmaWMgUENJIGNsYXNzLiAgVGhlIHZlbmRvciwgZGV2aWNlLCBzdWJ2ZW5kb3IsIGFuZCBzdWJkZXZpY2UKICAqIGZpZWxkcyB3aWxsIGJlIHNldCB0byBQQ0lfQU5ZX0lELgogICovCiAjZGVmaW5lIFBDSV9ERVZJQ0VfQ0xBU1MoZGV2X2NsYXNzLGRldl9jbGFzc19tYXNrKSBcCkBAIC03MDcsNyArMjc3LDcgQEAKIAkudmVuZG9yID0gUENJX0FOWV9JRCwgLmRldmljZSA9IFBDSV9BTllfSUQsIFwKIAkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwgLnN1YmRldmljZSA9IFBDSV9BTllfSUQKIAotLyogCisvKgogICogcGNpX21vZHVsZV9pbml0IGlzIG9ic29sZXRlLCB0aGlzIHN0YXlzIGhlcmUgdGlsbCB3ZSBmaXggdXAgYWxsIHVzYWdlcyBvZiBpdAogICogaW4gdGhlIHRyZWUuCiAgKi8KQEAgLTc0NSwxMiArMzE1LDEzIEBACiAJCXBjaV9idXNfYWRkX2RldmljZXMocm9vdF9idXMpOwogCXJldHVybiByb290X2J1czsKIH0KK3N0cnVjdCBwY2lfYnVzICpwY2lfY3JlYXRlX2J1cyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGludCBidXMsIHN0cnVjdCBwY2lfb3BzICpvcHMsIHZvaWQgKnN5c2RhdGEpOworc3RydWN0IHBjaV9idXMgKiBwY2lfYWRkX25ld19idXMoc3RydWN0IHBjaV9idXMgKnBhcmVudCwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJ1c25yKTsKIGludCBwY2lfc2Nhbl9zbG90KHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBkZXZmbik7CiBzdHJ1Y3QgcGNpX2RldiAqIHBjaV9zY2FuX3NpbmdsZV9kZXZpY2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGRldmZuKTsKK3ZvaWQgcGNpX2RldmljZV9hZGQoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9idXMgKmJ1cyk7CiB1bnNpZ25lZCBpbnQgcGNpX3NjYW5fY2hpbGRfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogdm9pZCBwY2lfYnVzX2FkZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7Ci12b2lkIHBjaV9uYW1lX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWNoYXIgKnBjaV9jbGFzc19uYW1lKHUzMiBjbGFzcyk7CiB2b2lkIHBjaV9yZWFkX2JyaWRnZV9iYXNlcyhzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQpOwogc3RydWN0IHJlc291cmNlICpwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMpOwogaW50IHBjaV9nZXRfaW50ZXJydXB0X3BpbihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldiAqKmJyaWRnZSk7CkBAIC03NTgsNiArMzI5LDcgQEAKIGV4dGVybiB2b2lkIHBjaV9kZXZfcHV0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgcGNpX3JlbW92ZV9idXMoc3RydWN0IHBjaV9idXMgKmIpOwogZXh0ZXJuIHZvaWQgcGNpX3JlbW92ZV9idXNfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwordm9pZCBwY2lfc2V0dXBfY2FyZGJ1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIAogLyogR2VuZXJpYyBQQ0kgZnVuY3Rpb25zIGV4cG9ydGVkIHRvIGNhcmQgZHJpdmVycyAqLwogCkBAIC04MTUsMTMgKzM4NywxNiBAQAogI2RlZmluZSBIQVZFX1BDSV9TRVRfTVdJCiBpbnQgcGNpX3NldF9td2koc3RydWN0IHBjaV9kZXYgKmRldik7CiB2b2lkIHBjaV9jbGVhcl9td2koc3RydWN0IHBjaV9kZXYgKmRldik7Cit2b2lkIHBjaV9pbnR4KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBlbmFibGUpOwogaW50IHBjaV9zZXRfZG1hX21hc2soc3RydWN0IHBjaV9kZXYgKmRldiwgdTY0IG1hc2spOwogaW50IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1NjQgbWFzayk7Cit2b2lkIHBjaV91cGRhdGVfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMsIGludCByZXNubyk7CiBpbnQgcGNpX2Fzc2lnbl9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaSk7Cit2b2lkIHBjaV9yZXN0b3JlX2JhcnMoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKIC8qIFJPTSBjb250cm9sIHJlbGF0ZWQgcm91dGluZXMgKi8KLXZvaWQgX19pb21lbSAqcGNpX21hcF9yb20oc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCAqc2l6ZSk7Ci12b2lkIF9faW9tZW0gKnBjaV9tYXBfcm9tX2NvcHkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCAqc2l6ZSk7Cit2b2lkIF9faW9tZW0gX19tdXN0X2NoZWNrICpwY2lfbWFwX3JvbShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc2l6ZV90ICpzaXplKTsKK3ZvaWQgX19pb21lbSBfX211c3RfY2hlY2sgKnBjaV9tYXBfcm9tX2NvcHkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCAqc2l6ZSk7CiB2b2lkIHBjaV91bm1hcF9yb20oc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqcm9tKTsKIHZvaWQgcGNpX3JlbW92ZV9yb20oc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogCkBAIC04NjUsNiArNDQwLDkgQEAKIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfbWF0Y2hfaWQoY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkcywgc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX3NjYW5fYnJpZGdlKHN0cnVjdCBwY2lfYnVzICpidXMsIHN0cnVjdCBwY2lfZGV2ICogZGV2LCBpbnQgbWF4LCBpbnQgcGFzcyk7CiAKK3ZvaWQgcGNpX3dhbGtfYnVzKHN0cnVjdCBwY2lfYnVzICp0b3AsIHZvaWQgKCpjYikoc3RydWN0IHBjaV9kZXYgKiwgdm9pZCAqKSwKKwkJICB2b2lkICp1c2VyZGF0YSk7CisKIC8qIGttZW1fY2FjaGUgc3R5bGUgd3JhcHBlciBhcm91bmQgcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSAqLwogCiAjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgpAQCAtOTEyLDE4ICs0OTAsMjYgQEAKIGV4dGVybiB2b2lkIG1zaV9yZW1vdmVfcGNpX2lycV92ZWN0b3JzKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogI2VuZGlmCiAKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCisvKgorICogUENJIGRvbWFpbiBzdXBwb3J0LiAgU29tZXRpbWVzIGNhbGxlZCBQQ0kgc2VnbWVudCAoZWcgYnkgQUNQSSksCisgKiBhIFBDSSBkb21haW4gaXMgZGVmaW5lZCB0byBiZSBhIHNldCBvZiBQQ0kgYnVzc2VzIHdoaWNoIHNoYXJlCisgKiBjb25maWd1cmF0aW9uIHNwYWNlLgorICovCisjaWZuZGVmIENPTkZJR19QQ0lfRE9NQUlOUworc3RhdGljIGlubGluZSBpbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBwY2lfcHJvY19kb21haW4oc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCi0vKiBJbmNsdWRlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgc2V0dGluZ3MgYW5kIGZ1bmN0aW9ucyAqLwotCi0jaW5jbHVkZSA8YXNtL3BjaS5oPgorI2Vsc2UgLyogQ09ORklHX1BDSSBpcyBub3QgZW5hYmxlZCAqLwogCiAvKgogICogIElmIHRoZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSBQQ0ksIGNsZWFybHkgdGhlc2UgcmV0dXJuIGVycm9ycy4gIERlZmluZQogICogIHRoZXNlIGFzIHNpbXBsZSBpbmxpbmUgZnVuY3Rpb25zIHRvIGF2b2lkIGhhaXIgaW4gZHJpdmVycy4KICAqLwogCi0jaWZuZGVmIENPTkZJR19QQ0kKICNkZWZpbmUgX1BDSV9OT1AobyxzLHQpIFwKIAlzdGF0aWMgaW5saW5lIGludCBwY2lfIyNvIyNfY29uZmlnXyMjcyAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLCB0IHZhbCkgXAogCQl7IHJldHVybiBQQ0lCSU9TX0ZVTkNfTk9UX1NVUFBPUlRFRDsgfQpAQCAtOTc0LDIxICs1NjAsMTEgQEAKIAogI2RlZmluZSBwY2lfZG1hX2J1cnN0X2FkdmljZShwZGV2LCBzdHJhdCwgc3RyYXRlZ3lfcGFyYW1ldGVyKSBkbyB7IH0gd2hpbGUgKDApCiAKLSNlbHNlCisjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCi0vKgotICogUENJIGRvbWFpbiBzdXBwb3J0LiAgU29tZXRpbWVzIGNhbGxlZCBQQ0kgc2VnbWVudCAoZWcgYnkgQUNQSSksCi0gKiBhIFBDSSBkb21haW4gaXMgZGVmaW5lZCB0byBiZSBhIHNldCBvZiBQQ0kgYnVzc2VzIHdoaWNoIHNoYXJlCi0gKiBjb25maWd1cmF0aW9uIHNwYWNlLgotICovCi0jaWZuZGVmIENPTkZJR19QQ0lfRE9NQUlOUwotc3RhdGljIGlubGluZSBpbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwY2lfcHJvY19kb21haW4oc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotI2VuZGlmIC8qICFDT05GSUdfUENJICovCisvKiBJbmNsdWRlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgc2V0dGluZ3MgYW5kIGZ1bmN0aW9ucyAqLworCisjaW5jbHVkZSA8YXNtL3BjaS5oPgogCiAvKiB0aGVzZSBoZWxwZXJzIHByb3ZpZGUgZnV0dXJlIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICogZm9yIGFjY2Vzc2luZyBwb3B1bGFyIFBDSSBCQVIgaW5mbyAqLwpAQCAtMTAyNSwxMyArNjAxLDYgQEAKIAlyZXR1cm4gcGRldi0+ZGV2LmJ1c19pZDsKIH0KIAotLyogU29tZSBhcmNocyB3YW50IHRvIHNlZSB0aGUgcHJldHR5IHBjaSBuYW1lLCBzbyB1c2UgdGhpcyBtYWNybyAqLwotI2lmZGVmIENPTkZJR19QQ0lfTkFNRVMKLSNkZWZpbmUgcGNpX3ByZXR0eV9uYW1lKGRldikgKChkZXYpLT5wcmV0dHlfbmFtZSkKLSNlbHNlCi0jZGVmaW5lIHBjaV9wcmV0dHlfbmFtZShkZXYpICIiCi0jZW5kaWYKLQogCiAvKiBTb21lIGFyY2hzIGRvbid0IHdhbnQgdG8gZXhwb3NlIHN0cnVjdCByZXNvdXJjZSB0byB1c2VybGFuZCBhcy1pcwogICogaW4gc3lzZnMgYW5kIC9wcm9jCkBAIC0xMDY3LDcgKzYzNiw3IEBACiAKIC8qIEFub255bW91cyB2YXJpYWJsZXMgd291bGQgYmUgbmljZS4uLiAqLwogI2RlZmluZSBERUNMQVJFX1BDSV9GSVhVUF9TRUNUSU9OKHNlY3Rpb24sIG5hbWUsIHZlbmRvciwgZGV2aWNlLCBob29rKQlcCi0Jc3RhdGljIHN0cnVjdCBwY2lfZml4dXAgX19wY2lfZml4dXBfIyNuYW1lIF9fYXR0cmlidXRlX3VzZWRfXwlcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZml4dXAgX19wY2lfZml4dXBfIyNuYW1lIF9fYXR0cmlidXRlX3VzZWRfXyBcCiAJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oI3NlY3Rpb24pKSkgPSB7IHZlbmRvciwgZGV2aWNlLCBob29rIH07CiAjZGVmaW5lIERFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKHZlbmRvciwgZGV2aWNlLCBob29rKQkJCVwKIAlERUNMQVJFX1BDSV9GSVhVUF9TRUNUSU9OKC5wY2lfZml4dXBfZWFybHksCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCA0OTlhNTMyLi5lZTBhYjdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtMTYxMiw2ICsxNjEyLDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9UT1NISUJBX1RDMzU4MTVDRgkweDAwMzAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9UT1NISUJBX1RYNDkyNwkweDAxODAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9UT1NISUJBX1RDODZDMDAxX01JU0MJMHgwMTA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVE9TSElCQV9TUElERVJfTkVUIDB4MDFiMwogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfUklDT0gJCTB4MTE4MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JJQ09IX1JMNUM0NjUJMHgwNDY1CkBAIC0yMTQ1LDYgKzIxNDYsMTAgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9FTkVfMTIyNQkJMHgxMjI1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRU5FXzE0MTAJCTB4MTQxMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VORV8xNDIwCQkweDE0MjAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DSEVMU0lPCQkweDE0MjUKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01JUFMJCTB4MTUzZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NPQ19JVAkJMHgwMDAxCiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TWUJBCQkweDE1OTIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9TWUJBXzJQX0VQUAkweDA3ODIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaCBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmEwODliCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICoJcGNpX3JlZ3MuaAorICoKKyAqCVBDSSBzdGFuZGFyZCBkZWZpbmVzCisgKglDb3B5cmlnaHQgMTk5NCwgRHJldyBFY2toYXJkdAorICoJQ29weXJpZ2h0IDE5OTctLTE5OTkgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+CisgKgorICoJRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IHRoZSBmb2xsb3dpbmcgbWFudWFscyAobG9vayBhdAorICoJaHR0cDovL3d3dy5wY2lzaWcuY29tLyBmb3IgaG93IHRvIGdldCB0aGVtKToKKyAqCisgKglQQ0kgQklPUyBTcGVjaWZpY2F0aW9uCisgKglQQ0kgTG9jYWwgQnVzIFNwZWNpZmljYXRpb24KKyAqCVBDSSB0byBQQ0kgQnJpZGdlIFNwZWNpZmljYXRpb24KKyAqCVBDSSBTeXN0ZW0gRGVzaWduIEd1aWRlCisgKi8KKworI2lmbmRlZiBMSU5VWF9QQ0lfUkVHU19ICisjZGVmaW5lIExJTlVYX1BDSV9SRUdTX0gKKworLyoKKyAqIFVuZGVyIFBDSSwgZWFjaCBkZXZpY2UgaGFzIDI1NiBieXRlcyBvZiBjb25maWd1cmF0aW9uIGFkZHJlc3Mgc3BhY2UsCisgKiBvZiB3aGljaCB0aGUgZmlyc3QgNjQgYnl0ZXMgYXJlIHN0YW5kYXJkaXplZCBhcyBmb2xsb3dzOgorICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSUQJCTB4MDAJLyogMTYgYml0cyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lECQkweDAyCS8qIDE2IGJpdHMgKi8KKyNkZWZpbmUgUENJX0NPTU1BTkQJCTB4MDQJLyogMTYgYml0cyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfSU8JCTB4MQkvKiBFbmFibGUgcmVzcG9uc2UgaW4gSS9PIHNwYWNlICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9NRU1PUlkJMHgyCS8qIEVuYWJsZSByZXNwb25zZSBpbiBNZW1vcnkgc3BhY2UgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX01BU1RFUgkweDQJLyogRW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1NQRUNJQUwJMHg4CS8qIEVuYWJsZSByZXNwb25zZSB0byBzcGVjaWFsIGN5Y2xlcyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfSU5WQUxJREFURQkweDEwCS8qIFVzZSBtZW1vcnkgd3JpdGUgYW5kIGludmFsaWRhdGUgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1ZHQV9QQUxFVFRFIDB4MjAJLyogRW5hYmxlIHBhbGV0dGUgc25vb3BpbmcgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1BBUklUWQkweDQwCS8qIEVuYWJsZSBwYXJpdHkgY2hlY2tpbmcgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1dBSVQgCTB4ODAJLyogRW5hYmxlIGFkZHJlc3MvZGF0YSBzdGVwcGluZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfU0VSUgkweDEwMAkvKiBFbmFibGUgU0VSUiAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfRkFTVF9CQUNLCTB4MjAwCS8qIEVuYWJsZSBiYWNrLXRvLWJhY2sgd3JpdGVzICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUgMHg0MDAgLyogSU5UeCBFbXVsYXRpb24gRGlzYWJsZSAqLworCisjZGVmaW5lIFBDSV9TVEFUVVMJCTB4MDYJLyogMTYgYml0cyAqLworI2RlZmluZSAgUENJX1NUQVRVU19DQVBfTElTVAkweDEwCS8qIFN1cHBvcnQgQ2FwYWJpbGl0eSBMaXN0ICovCisjZGVmaW5lICBQQ0lfU1RBVFVTXzY2TUhaCTB4MjAJLyogU3VwcG9ydCA2NiBNaHogUENJIDIuMSBidXMgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfVURGCQkweDQwCS8qIFN1cHBvcnQgVXNlciBEZWZpbmFibGUgRmVhdHVyZXMgW29ic29sZXRlXSAqLworI2RlZmluZSAgUENJX1NUQVRVU19GQVNUX0JBQ0sJMHg4MAkvKiBBY2NlcHQgZmFzdC1iYWNrIHRvIGJhY2sgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUEFSSVRZCTB4MTAwCS8qIERldGVjdGVkIHBhcml0eSBlcnJvciAqLworI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfTUFTSwkweDYwMAkvKiBERVZTRUwgdGltaW5nICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9GQVNUCQkweDAwMAorI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfTUVESVVNCTB4MjAwCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9TTE9XCQkweDQwMAorI2RlZmluZSAgUENJX1NUQVRVU19TSUdfVEFSR0VUX0FCT1JUCTB4ODAwIC8qIFNldCBvbiB0YXJnZXQgYWJvcnQgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVAkweDEwMDAgLyogTWFzdGVyIGFjayBvZiAiICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQJMHgyMDAwIC8qIFNldCBvbiBtYXN0ZXIgYWJvcnQgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUgkweDQwMDAgLyogU2V0IHdoZW4gd2UgZHJpdmUgU0VSUiAqLworI2RlZmluZSAgUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkJMHg4MDAwIC8qIFNldCBvbiBwYXJpdHkgZXJyb3IgKi8KKworI2RlZmluZSBQQ0lfQ0xBU1NfUkVWSVNJT04JMHgwOAkvKiBIaWdoIDI0IGJpdHMgYXJlIGNsYXNzLCBsb3cgOCByZXZpc2lvbiAqLworI2RlZmluZSBQQ0lfUkVWSVNJT05fSUQJCTB4MDgJLyogUmV2aXNpb24gSUQgKi8KKyNkZWZpbmUgUENJX0NMQVNTX1BST0cJCTB4MDkJLyogUmVnLiBMZXZlbCBQcm9ncmFtbWluZyBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgUENJX0NMQVNTX0RFVklDRQkweDBhCS8qIERldmljZSBjbGFzcyAqLworCisjZGVmaW5lIFBDSV9DQUNIRV9MSU5FX1NJWkUJMHgwYwkvKiA4IGJpdHMgKi8KKyNkZWZpbmUgUENJX0xBVEVOQ1lfVElNRVIJMHgwZAkvKiA4IGJpdHMgKi8KKyNkZWZpbmUgUENJX0hFQURFUl9UWVBFCQkweDBlCS8qIDggYml0cyAqLworI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX05PUk1BTAkJMAorI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX0JSSURHRQkJMQorI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX0NBUkRCVVMJMgorCisjZGVmaW5lIFBDSV9CSVNUCQkweDBmCS8qIDggYml0cyAqLworI2RlZmluZSAgUENJX0JJU1RfQ09ERV9NQVNLCTB4MGYJLyogUmV0dXJuIHJlc3VsdCAqLworI2RlZmluZSAgUENJX0JJU1RfU1RBUlQJCTB4NDAJLyogMSB0byBzdGFydCBCSVNULCAyIHNlY3Mgb3IgbGVzcyAqLworI2RlZmluZSAgUENJX0JJU1RfQ0FQQUJMRQkweDgwCS8qIDEgaWYgQklTVCBjYXBhYmxlICovCisKKy8qCisgKiBCYXNlIGFkZHJlc3NlcyBzcGVjaWZ5IGxvY2F0aW9ucyBpbiBtZW1vcnkgb3IgSS9PIHNwYWNlLgorICogRGVjb2RlZCBzaXplIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHdyaXRpbmcgYSB2YWx1ZSBvZgorICogMHhmZmZmZmZmZiB0byB0aGUgcmVnaXN0ZXIsIGFuZCByZWFkaW5nIGl0IGJhY2suICBPbmx5CisgKiAxIGJpdHMgYXJlIGRlY29kZWQuCisgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18wCTB4MTAJLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzEJMHgxNAkvKiAzMiBiaXRzIFtodHlwZSAwLDEgb25seV0gKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18yCTB4MTgJLyogMzIgYml0cyBbaHR5cGUgMCBvbmx5XSAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzMJMHgxYwkvKiAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfNAkweDIwCS8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU181CTB4MjQJLyogMzIgYml0cyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRQkJMHgwMQkvKiAwID0gbWVtb3J5LCAxID0gSS9PICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPCTB4MDEKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfTUVNT1JZCTB4MDAKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSwkweDA2CisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzMyCTB4MDAJLyogMzIgYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMU0JMHgwMgkvKiBCZWxvdyAxTSBbb2Jzb2xldGVdICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0CTB4MDQJLyogNjQgYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1BSRUZFVENICTB4MDgJLyogcHJlZmV0Y2hhYmxlPyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSwkofjB4MGZVTCkKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSwkofjB4MDNVTCkKKy8qIGJpdCAxIGlzIHJlc2VydmVkIGlmIGFkZHJlc3Nfc3BhY2UgPSAxICovCisKKy8qIEhlYWRlciB0eXBlIDAgKG5vcm1hbCBkZXZpY2VzKSAqLworI2RlZmluZSBQQ0lfQ0FSREJVU19DSVMJCTB4MjgKKyNkZWZpbmUgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQJMHgyYworI2RlZmluZSBQQ0lfU1VCU1lTVEVNX0lECTB4MmUKKyNkZWZpbmUgUENJX1JPTV9BRERSRVNTCQkweDMwCS8qIEJpdHMgMzEuLjExIGFyZSBhZGRyZXNzLCAxMC4uMSByZXNlcnZlZCAqLworI2RlZmluZSAgUENJX1JPTV9BRERSRVNTX0VOQUJMRQkweDAxCisjZGVmaW5lIFBDSV9ST01fQUREUkVTU19NQVNLCSh+MHg3ZmZVTCkKKworI2RlZmluZSBQQ0lfQ0FQQUJJTElUWV9MSVNUCTB4MzQJLyogT2Zmc2V0IG9mIGZpcnN0IGNhcGFiaWxpdHkgbGlzdCBlbnRyeSAqLworCisvKiAweDM1LTB4M2IgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIFBDSV9JTlRFUlJVUFRfTElORQkweDNjCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfSU5URVJSVVBUX1BJTgkweDNkCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfTUlOX0dOVAkJMHgzZQkvKiA4IGJpdHMgKi8KKyNkZWZpbmUgUENJX01BWF9MQVQJCTB4M2YJLyogOCBiaXRzICovCisKKy8qIEhlYWRlciB0eXBlIDEgKFBDSS10by1QQ0kgYnJpZGdlcykgKi8KKyNkZWZpbmUgUENJX1BSSU1BUllfQlVTCQkweDE4CS8qIFByaW1hcnkgYnVzIG51bWJlciAqLworI2RlZmluZSBQQ0lfU0VDT05EQVJZX0JVUwkweDE5CS8qIFNlY29uZGFyeSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9TVUJPUkRJTkFURV9CVVMJMHgxYQkvKiBIaWdoZXN0IGJ1cyBudW1iZXIgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKyNkZWZpbmUgUENJX1NFQ19MQVRFTkNZX1RJTUVSCTB4MWIJLyogTGF0ZW5jeSB0aW1lciBmb3Igc2Vjb25kYXJ5IGludGVyZmFjZSAqLworI2RlZmluZSBQQ0lfSU9fQkFTRQkJMHgxYwkvKiBJL08gcmFuZ2UgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKyNkZWZpbmUgUENJX0lPX0xJTUlUCQkweDFkCisjZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV9NQVNLCTB4MGZVTAkvKiBJL08gYnJpZGdpbmcgdHlwZSAqLworI2RlZmluZSAgUENJX0lPX1JBTkdFX1RZUEVfMTYJMHgwMAorI2RlZmluZSAgUENJX0lPX1JBTkdFX1RZUEVfMzIJMHgwMQorI2RlZmluZSAgUENJX0lPX1JBTkdFX01BU0sJKH4weDBmVUwpCisjZGVmaW5lIFBDSV9TRUNfU1RBVFVTCQkweDFlCS8qIFNlY29uZGFyeSBzdGF0dXMgcmVnaXN0ZXIsIG9ubHkgYml0IDE0IHVzZWQgKi8KKyNkZWZpbmUgUENJX01FTU9SWV9CQVNFCQkweDIwCS8qIE1lbW9yeSByYW5nZSBiZWhpbmQgKi8KKyNkZWZpbmUgUENJX01FTU9SWV9MSU1JVAkweDIyCisjZGVmaW5lICBQQ0lfTUVNT1JZX1JBTkdFX1RZUEVfTUFTSyAweDBmVUwKKyNkZWZpbmUgIFBDSV9NRU1PUllfUkFOR0VfTUFTSwkofjB4MGZVTCkKKyNkZWZpbmUgUENJX1BSRUZfTUVNT1JZX0JBU0UJMHgyNAkvKiBQcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlIGJlaGluZCAqLworI2RlZmluZSBQQ0lfUFJFRl9NRU1PUllfTElNSVQJMHgyNgorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfVFlQRV9NQVNLIDB4MGZVTAorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfVFlQRV8zMgkweDAwCisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFXzY0CTB4MDEKKyNkZWZpbmUgIFBDSV9QUkVGX1JBTkdFX01BU0sJKH4weDBmVUwpCisjZGVmaW5lIFBDSV9QUkVGX0JBU0VfVVBQRVIzMgkweDI4CS8qIFVwcGVyIGhhbGYgb2YgcHJlZmV0Y2hhYmxlIG1lbW9yeSByYW5nZSAqLworI2RlZmluZSBQQ0lfUFJFRl9MSU1JVF9VUFBFUjMyCTB4MmMKKyNkZWZpbmUgUENJX0lPX0JBU0VfVVBQRVIxNgkweDMwCS8qIFVwcGVyIGhhbGYgb2YgSS9PIGFkZHJlc3NlcyAqLworI2RlZmluZSBQQ0lfSU9fTElNSVRfVVBQRVIxNgkweDMyCisvKiAweDM0IHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KKy8qIDB4MzUtMHgzYiBpcyByZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUk9NX0FERFJFU1MxCTB4MzgJLyogU2FtZSBhcyBQQ0lfUk9NX0FERFJFU1MsIGJ1dCBmb3IgaHR5cGUgMSAqLworLyogMHgzYy0weDNkIGFyZSBzYW1lIGFzIGZvciBodHlwZSAwICovCisjZGVmaW5lIFBDSV9CUklER0VfQ09OVFJPTAkweDNlCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9QQVJJVFkJMHgwMQkvKiBFbmFibGUgcGFyaXR5IGRldGVjdGlvbiBvbiBzZWNvbmRhcnkgaW50ZXJmYWNlICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9TRVJSCTB4MDIJLyogVGhlIHNhbWUgZm9yIFNFUlIgZm9yd2FyZGluZyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfTk9fSVNBCTB4MDQJLyogRGlzYWJsZSBicmlkZ2luZyBvZiBJU0EgcG9ydHMgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1ZHQQkweDA4CS8qIEZvcndhcmQgVkdBIGFkZHJlc3NlcyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfTUFTVEVSX0FCT1JUCTB4MjAgIC8qIFJlcG9ydCBtYXN0ZXIgYWJvcnRzICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9CVVNfUkVTRVQJMHg0MAkvKiBTZWNvbmRhcnkgYnVzIHJlc2V0ICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9GQVNUX0JBQ0sJMHg4MAkvKiBGYXN0IEJhY2syQmFjayBlbmFibGVkIG9uIHNlY29uZGFyeSBpbnRlcmZhY2UgKi8KKworLyogSGVhZGVyIHR5cGUgMiAoQ2FyZEJ1cyBicmlkZ2VzKSAqLworI2RlZmluZSBQQ0lfQ0JfQ0FQQUJJTElUWV9MSVNUCTB4MTQKKy8qIDB4MTUgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NCX1NFQ19TVEFUVVMJMHgxNgkvKiBTZWNvbmRhcnkgc3RhdHVzICovCisjZGVmaW5lIFBDSV9DQl9QUklNQVJZX0JVUwkweDE4CS8qIFBDSSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9DQl9DQVJEX0JVUwkJMHgxOQkvKiBDYXJkQnVzIGJ1cyBudW1iZXIgKi8KKyNkZWZpbmUgUENJX0NCX1NVQk9SRElOQVRFX0JVUwkweDFhCS8qIFN1Ym9yZGluYXRlIGJ1cyBudW1iZXIgKi8KKyNkZWZpbmUgUENJX0NCX0xBVEVOQ1lfVElNRVIJMHgxYgkvKiBDYXJkQnVzIGxhdGVuY3kgdGltZXIgKi8KKyNkZWZpbmUgUENJX0NCX01FTU9SWV9CQVNFXzAJMHgxYworI2RlZmluZSBQQ0lfQ0JfTUVNT1JZX0xJTUlUXzAJMHgyMAorI2RlZmluZSBQQ0lfQ0JfTUVNT1JZX0JBU0VfMQkweDI0CisjZGVmaW5lIFBDSV9DQl9NRU1PUllfTElNSVRfMQkweDI4CisjZGVmaW5lIFBDSV9DQl9JT19CQVNFXzAJMHgyYworI2RlZmluZSBQQ0lfQ0JfSU9fQkFTRV8wX0hJCTB4MmUKKyNkZWZpbmUgUENJX0NCX0lPX0xJTUlUXzAJMHgzMAorI2RlZmluZSBQQ0lfQ0JfSU9fTElNSVRfMF9ISQkweDMyCisjZGVmaW5lIFBDSV9DQl9JT19CQVNFXzEJMHgzNAorI2RlZmluZSBQQ0lfQ0JfSU9fQkFTRV8xX0hJCTB4MzYKKyNkZWZpbmUgUENJX0NCX0lPX0xJTUlUXzEJMHgzOAorI2RlZmluZSBQQ0lfQ0JfSU9fTElNSVRfMV9ISQkweDNhCisjZGVmaW5lICBQQ0lfQ0JfSU9fUkFOR0VfTUFTSwkofjB4MDNVTCkKKy8qIDB4M2MtMHgzZCBhcmUgc2FtZSBhcyBmb3IgaHR5cGUgMCAqLworI2RlZmluZSBQQ0lfQ0JfQlJJREdFX0NPTlRST0wJMHgzZQorI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfUEFSSVRZCTB4MDEJLyogU2ltaWxhciB0byBzdGFuZGFyZCBicmlkZ2UgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfU0VSUgkJMHgwMgorI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfSVNBCQkweDA0CisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9WR0EJCTB4MDgKKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX01BU1RFUl9BQk9SVAkweDIwCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9DQl9SRVNFVAkweDQwCS8qIENhcmRCdXMgcmVzZXQgKi8KKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMXzE2QklUX0lOVAkweDgwCS8qIEVuYWJsZSBpbnRlcnJ1cHQgZm9yIDE2LWJpdCBjYXJkcyAqLworI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfUFJFRkVUQ0hfTUVNMCAweDEwMAkvKiBQcmVmZXRjaCBlbmFibGUgZm9yIGJvdGggbWVtb3J5IHJlZ2lvbnMgKi8KKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1BSRUZFVENIX01FTTEgMHgyMDAKKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1BPU1RfV1JJVEVTCTB4NDAwCisjZGVmaW5lIFBDSV9DQl9TVUJTWVNURU1fVkVORE9SX0lECTB4NDAKKyNkZWZpbmUgUENJX0NCX1NVQlNZU1RFTV9JRAkJMHg0MgorI2RlZmluZSBQQ0lfQ0JfTEVHQUNZX01PREVfQkFTRQkJMHg0NAkvKiAxNi1iaXQgUEMgQ2FyZCBsZWdhY3kgbW9kZSBiYXNlIGFkZHJlc3MgKEV4Q2EpICovCisvKiAweDQ4LTB4N2YgcmVzZXJ2ZWQgKi8KKworLyogQ2FwYWJpbGl0eSBsaXN0cyAqLworCisjZGVmaW5lIFBDSV9DQVBfTElTVF9JRAkJMAkvKiBDYXBhYmlsaXR5IElEICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1BNCQkweDAxCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfQUdQCQkweDAyCS8qIEFjY2VsZXJhdGVkIEdyYXBoaWNzIFBvcnQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfVlBECQkweDAzCS8qIFZpdGFsIFByb2R1Y3QgRGF0YSAqLworI2RlZmluZSAgUENJX0NBUF9JRF9TTE9USUQJMHgwNAkvKiBTbG90IElkZW50aWZpY2F0aW9uICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX01TSQkJMHgwNQkvKiBNZXNzYWdlIFNpZ25hbGxlZCBJbnRlcnJ1cHRzICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0NIU1dQCTB4MDYJLyogQ29tcGFjdFBDSSBIb3RTd2FwICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1BDSVgJMHgwNwkvKiBQQ0ktWCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9TSFBDIAkweDBDCS8qIFBDSSBTdGFuZGFyZCBIb3QtUGx1ZyBDb250cm9sbGVyICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0VYUCAJMHgxMAkvKiBQQ0kgRXhwcmVzcyAqLworI2RlZmluZSAgUENJX0NBUF9JRF9NU0lYCTB4MTEJLyogTVNJLVggKi8KKyNkZWZpbmUgUENJX0NBUF9MSVNUX05FWFQJMQkvKiBOZXh0IGNhcGFiaWxpdHkgaW4gdGhlIGxpc3QgKi8KKyNkZWZpbmUgUENJX0NBUF9GTEFHUwkJMgkvKiBDYXBhYmlsaXR5IGRlZmluZWQgZmxhZ3MgKDE2IGJpdHMpICovCisjZGVmaW5lIFBDSV9DQVBfU0laRU9GCQk0CisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX1BNX1BNQwkJMgkvKiBQTSBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfVkVSX01BU0sJMHgwMDA3CS8qIFZlcnNpb24gKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0NMT0NLCTB4MDAwOAkvKiBQTUUgY2xvY2sgcmVxdWlyZWQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUkVTRVJWRUQgICAgMHgwMDEwICAvKiBSZXNlcnZlZCBmaWVsZCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9EU0kJCTB4MDAyMAkvKiBEZXZpY2Ugc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfQVVYX1BPV0VSCTB4MDFDMAkvKiBBdXhpbGxpYXJ5IHBvd2VyIHN1cHBvcnQgbWFzayAqLworI2RlZmluZSAgUENJX1BNX0NBUF9EMQkJMHgwMjAwCS8qIEQxIHBvd2VyIHN0YXRlIHN1cHBvcnQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfRDIJCTB4MDQwMAkvKiBEMiBwb3dlciBzdGF0ZSBzdXBwb3J0ICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRQkJMHgwODAwCS8qIFBNRSBwaW4gc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9NQVNLCTB4RjgwMAkvKiBQTUUgTWFzayBvZiBhbGwgc3VwcG9ydGVkIHN0YXRlcyAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDAJMHgwODAwCS8qIFBNRSMgZnJvbSBEMCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDEJMHgxMDAwCS8qIFBNRSMgZnJvbSBEMSAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDIJMHgyMDAwCS8qIFBNRSMgZnJvbSBEMiAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDMJMHg0MDAwCS8qIFBNRSMgZnJvbSBEMyAoaG90KSAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfRDNjb2xkCTB4ODAwMAkvKiBQTUUjIGZyb20gRDMgKGNvbGQpICovCisjZGVmaW5lIFBDSV9QTV9DVFJMCQk0CS8qIFBNIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfU1RBVEVfTUFTSwkweDAwMDMJLyogQ3VycmVudCBwb3dlciBzdGF0ZSAoRDAgdG8gRDMpICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9OT19TT0ZUX1JFU0VUCTB4MDAwNAkvKiBObyByZXNldCBmb3IgRDNob3QtPkQwICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9QTUVfRU5BQkxFCTB4MDEwMAkvKiBQTUUgcGluIGVuYWJsZSAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfREFUQV9TRUxfTUFTSwkweDFlMDAJLyogRGF0YSBzZWxlY3QgKD8/KSAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfREFUQV9TQ0FMRV9NQVNLCTB4NjAwMAkvKiBEYXRhIHNjYWxlICg/PykgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX1BNRV9TVEFUVVMJMHg4MDAwCS8qIFBNRSBwaW4gc3RhdHVzICovCisjZGVmaW5lIFBDSV9QTV9QUEJfRVhURU5TSU9OUwk2CS8qIFBQQiBzdXBwb3J0IGV4dGVuc2lvbnMgKD8/KSAqLworI2RlZmluZSAgUENJX1BNX1BQQl9CMl9CMwkweDQwCS8qIFN0b3AgY2xvY2sgd2hlbiBpbiBEM2hvdCAoPz8pICovCisjZGVmaW5lICBQQ0lfUE1fQlBDQ19FTkFCTEUJMHg4MAkvKiBCdXMgcG93ZXIvY2xvY2sgY29udHJvbCBlbmFibGUgKD8/KSAqLworI2RlZmluZSBQQ0lfUE1fREFUQV9SRUdJU1RFUgk3CS8qICg/PykgKi8KKyNkZWZpbmUgUENJX1BNX1NJWkVPRgkJOAorCisvKiBBR1AgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX0FHUF9WRVJTSU9OCQkyCS8qIEJDRCB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBQQ0lfQUdQX1JGVQkJMwkvKiBSZXN0IG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgUENJX0FHUF9TVEFUVVMJCTQJLyogU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SUV9NQVNLCTB4ZmYwMDAwMDAJLyogTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgLSAxICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19TQkEJMHgwMjAwCS8qIFNpZGViYW5kIGFkZHJlc3Npbmcgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU182NEJJVAkweDAwMjAJLyogNjQtYml0IGFkZHJlc3Npbmcgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19GVwkweDAwMTAJLyogRlcgdHJhbnNmZXJzIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUkFURTQJMHgwMDA0CS8qIDR4IHRyYW5zZmVyIHJhdGUgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SQVRFMgkweDAwMDIJLyogMnggdHJhbnNmZXIgcmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JBVEUxCTB4MDAwMQkvKiAxeCB0cmFuc2ZlciByYXRlIHN1cHBvcnRlZCAqLworI2RlZmluZSBQQ0lfQUdQX0NPTU1BTkQJCTgJLyogQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JRX01BU0sgMHhmZjAwMDAwMCAgLyogTWFzdGVyOiBNYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1NCQQkweDAyMDAJLyogU2lkZWJhbmQgYWRkcmVzc2luZyBlbmFibGVkICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfQUdQCTB4MDEwMAkvKiBBbGxvdyBwcm9jZXNzaW5nIG9mIEFHUCB0cmFuc2FjdGlvbnMgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF82NEJJVAkweDAwMjAgCS8qIEFsbG93IHByb2Nlc3Npbmcgb2YgNjQtYml0IGFkZHJlc3NlcyAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX0ZXCTB4MDAxMCAJLyogRm9yY2UgRlcgdHJhbnNmZXJzICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTQJMHgwMDA0CS8qIFVzZSA0eCByYXRlICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTIJMHgwMDAyCS8qIFVzZSAyeCByYXRlICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTEJMHgwMDAxCS8qIFVzZSAxeCByYXRlICovCisjZGVmaW5lIFBDSV9BR1BfU0laRU9GCQkxMgorCisvKiBWaXRhbCBQcm9kdWN0IERhdGEgKi8KKworI2RlZmluZSBQQ0lfVlBEX0FERFIJCTIJLyogQWRkcmVzcyB0byBhY2Nlc3MgKDE1IGJpdHMhKSAqLworI2RlZmluZSAgUENJX1ZQRF9BRERSX01BU0sJMHg3ZmZmCS8qIEFkZHJlc3MgbWFzayAqLworI2RlZmluZSAgUENJX1ZQRF9BRERSX0YJCTB4ODAwMAkvKiBXcml0ZSAwLCAxIGluZGljYXRlcyBjb21wbGV0aW9uICovCisjZGVmaW5lIFBDSV9WUERfREFUQQkJNAkvKiAzMi1iaXRzIG9mIGRhdGEgcmV0dXJuZWQgaGVyZSAqLworCisvKiBTbG90IElkZW50aWZpY2F0aW9uICovCisKKyNkZWZpbmUgUENJX1NJRF9FU1IJCTIJLyogRXhwYW5zaW9uIFNsb3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9TSURfRVNSX05TTE9UUwkweDFmCS8qIE51bWJlciBvZiBleHBhbnNpb24gc2xvdHMgYXZhaWxhYmxlICovCisjZGVmaW5lICBQQ0lfU0lEX0VTUl9GSUMJMHgyMAkvKiBGaXJzdCBJbiBDaGFzc2lzIEZsYWcgKi8KKyNkZWZpbmUgUENJX1NJRF9DSEFTU0lTX05SCTMJLyogQ2hhc3NpcyBOdW1iZXIgKi8KKworLyogTWVzc2FnZSBTaWduYWxsZWQgSW50ZXJydXB0cyByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfTVNJX0ZMQUdTCQkyCS8qIFZhcmlvdXMgZmxhZ3MgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfNjRCSVQJMHg4MAkvKiA2NC1iaXQgYWRkcmVzc2VzIGFsbG93ZWQgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfUVNJWkUJMHg3MAkvKiBNZXNzYWdlIHF1ZXVlIHNpemUgY29uZmlndXJlZCAqLworI2RlZmluZSAgUENJX01TSV9GTEFHU19RTUFTSwkweDBlCS8qIE1heGltdW0gcXVldWUgc2l6ZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfRU5BQkxFCTB4MDEJLyogTVNJIGZlYXR1cmUgZW5hYmxlZCAqLworI2RlZmluZSAgUENJX01TSV9GTEFHU19NQVNLQklUCTB4MTAwCS8qIDY0LWJpdCBtYXNrIGJpdHMgYWxsb3dlZCAqLworI2RlZmluZSBQQ0lfTVNJX1JGVQkJMwkvKiBSZXN0IG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgUENJX01TSV9BRERSRVNTX0xPCTQJLyogTG93ZXIgMzIgYml0cyAqLworI2RlZmluZSBQQ0lfTVNJX0FERFJFU1NfSEkJOAkvKiBVcHBlciAzMiBiaXRzIChpZiBQQ0lfTVNJX0ZMQUdTXzY0QklUIHNldCkgKi8KKyNkZWZpbmUgUENJX01TSV9EQVRBXzMyCQk4CS8qIDE2IGJpdHMgb2YgZGF0YSBmb3IgMzItYml0IGRldmljZXMgKi8KKyNkZWZpbmUgUENJX01TSV9EQVRBXzY0CQkxMgkvKiAxNiBiaXRzIG9mIGRhdGEgZm9yIDY0LWJpdCBkZXZpY2VzICovCisjZGVmaW5lIFBDSV9NU0lfTUFTS19CSVQJMTYJLyogTWFzayBiaXRzIHJlZ2lzdGVyICovCisKKy8qIENvbXBhY3RQQ0kgSG90c3dhcCBSZWdpc3RlciAqLworCisjZGVmaW5lIFBDSV9DSFNXUF9DU1IJCTIJLyogQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfQ0hTV1BfREhBCQkweDAxCS8qIERldmljZSBIaWRpbmcgQXJtICovCisjZGVmaW5lICBQQ0lfQ0hTV1BfRUlNCQkweDAyCS8qIEVOVU0jIFNpZ25hbCBNYXNrICovCisjZGVmaW5lICBQQ0lfQ0hTV1BfUElFCQkweDA0CS8qIFBlbmRpbmcgSW5zZXJ0IG9yIEV4dHJhY3QgKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9MT08JCTB4MDgJLyogTEVEIE9uIC8gT2ZmICovCisjZGVmaW5lICBQQ0lfQ0hTV1BfUEkJCTB4MzAJLyogUHJvZ3JhbW1pbmcgSW50ZXJmYWNlICovCisjZGVmaW5lICBQQ0lfQ0hTV1BfRVhUCQkweDQwCS8qIEVOVU0jIHN0YXR1cyAtIGV4dHJhY3Rpb24gKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9JTlMJCTB4ODAJLyogRU5VTSMgc3RhdHVzIC0gaW5zZXJ0aW9uICovCisKKy8qIFBDSS1YIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9YX0NNRAkJMgkvKiBNb2RlcyAmIEZlYXR1cmVzICovCisjZGVmaW5lICBQQ0lfWF9DTURfRFBFUlJfRQkweDAwMDEJLyogRGF0YSBQYXJpdHkgRXJyb3IgUmVjb3ZlcnkgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfWF9DTURfRVJPCQkweDAwMDIJLyogRW5hYmxlIFJlbGF4ZWQgT3JkZXJpbmcgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9NQVhfUkVBRAkweDAwMGMJLyogTWF4IE1lbW9yeSBSZWFkIEJ5dGUgQ291bnQgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9NQVhfU1BMSVQJMHgwMDcwCS8qIE1heCBPdXRzdGFuZGluZyBTcGxpdCBUcmFuc2FjdGlvbnMgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9WRVJTSU9OKHgpIAkoKCh4KSA+PiAxMikgJiAzKSAvKiBWZXJzaW9uICovCisjZGVmaW5lIFBDSV9YX1NUQVRVUwkJNAkvKiBQQ0ktWCBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19ERVZGTgkweDAwMDAwMGZmCS8qIEEgY29weSBvZiBkZXZmbiAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX0JVUwkweDAwMDBmZjAwCS8qIEEgY29weSBvZiBidXMgbnIgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU182NEJJVAkweDAwMDEwMDAwCS8qIDY0LWJpdCBkZXZpY2UgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU18xMzNNSFoJMHgwMDAyMDAwMAkvKiAxMzMgTUh6IGNhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19TUExfRElTQwkweDAwMDQwMDAwCS8qIFNwbGl0IENvbXBsZXRpb24gRGlzY2FyZGVkICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfVU5YX1NQTAkweDAwMDgwMDAwCS8qIFVuZXhwZWN0ZWQgU3BsaXQgQ29tcGxldGlvbiAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX0NPTVBMRVgJMHgwMDEwMDAwMAkvKiBEZXZpY2UgQ29tcGxleGl0eSAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX01BWF9SRUFECTB4MDA2MDAwMDAJLyogRGVzaWduZWQgTWF4IE1lbW9yeSBSZWFkIENvdW50ICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfTUFYX1NQTElUCTB4MDM4MDAwMDAJLyogRGVzaWduZWQgTWF4IE91dHN0YW5kaW5nIFNwbGl0IFRyYW5zYWN0aW9ucyAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX01BWF9DVU0JMHgxYzAwMDAwMAkvKiBEZXNpZ25lZCBNYXggQ3VtdWxhdGl2ZSBSZWFkIFNpemUgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19TUExfRVJSCTB4MjAwMDAwMDAJLyogUmN2ZCBTcGxpdCBDb21wbGV0aW9uIEVycm9yIE1zZyAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTXzI2Nk1IWgkweDQwMDAwMDAwCS8qIDI2NiBNSHogY2FwYWJsZSAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTXzUzM01IWgkweDgwMDAwMDAwCS8qIDUzMyBNSHogY2FwYWJsZSAqLworCisvKiBQQ0kgRXhwcmVzcyBjYXBhYmlsaXR5IHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9FWFBfRkxBR1MJCTIJLyogQ2FwYWJpbGl0aWVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9FWFBfRkxBR1NfVkVSUwkweDAwMGYJLyogQ2FwYWJpbGl0eSB2ZXJzaW9uICovCisjZGVmaW5lIFBDSV9FWFBfRkxBR1NfVFlQRQkweDAwZjAJLyogRGV2aWNlL1BvcnQgdHlwZSAqLworI2RlZmluZSAgUENJX0VYUF9UWVBFX0VORFBPSU5UCTB4MAkvKiBFeHByZXNzIEVuZHBvaW50ICovCisjZGVmaW5lICBQQ0lfRVhQX1RZUEVfTEVHX0VORAkweDEJLyogTGVnYWN5IEVuZHBvaW50ICovCisjZGVmaW5lICBQQ0lfRVhQX1RZUEVfUk9PVF9QT1JUIDB4NAkvKiBSb290IFBvcnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfVFlQRV9VUFNUUkVBTQkweDUJLyogVXBzdHJlYW0gUG9ydCAqLworI2RlZmluZSAgUENJX0VYUF9UWVBFX0RPV05TVFJFQU0gMHg2CS8qIERvd25zdHJlYW0gUG9ydCAqLworI2RlZmluZSAgUENJX0VYUF9UWVBFX1BDSV9CUklER0UgMHg3CS8qIFBDSS9QQ0ktWCBCcmlkZ2UgKi8KKyNkZWZpbmUgUENJX0VYUF9GTEFHU19TTE9UCTB4MDEwMAkvKiBTbG90IGltcGxlbWVudGVkICovCisjZGVmaW5lIFBDSV9FWFBfRkxBR1NfSVJRCTB4M2UwMAkvKiBJbnRlcnJ1cHQgbWVzc2FnZSBudW1iZXIgKi8KKyNkZWZpbmUgUENJX0VYUF9ERVZDQVAJCTQJLyogRGV2aWNlIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUEFZTE9BRAkweDA3CS8qIE1heF9QYXlsb2FkX1NpemUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX1BIQU5UT00JMHgxOAkvKiBQaGFudG9tIGZ1bmN0aW9ucyAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfRVhUX1RBRwkweDIwCS8qIEV4dGVuZGVkIHRhZ3MgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0wwUwkweDFjMAkvKiBMMHMgQWNjZXB0YWJsZSBMYXRlbmN5ICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9MMQkweGUwMAkvKiBMMSBBY2NlcHRhYmxlIExhdGVuY3kgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0FUTl9CVVQJMHgxMDAwCS8qIEF0dGVudGlvbiBCdXR0b24gUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfQVROX0lORAkweDIwMDAJLyogQXR0ZW50aW9uIEluZGljYXRvciBQcmVzZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9QV1JfSU5ECTB4NDAwMAkvKiBQb3dlciBJbmRpY2F0b3IgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUFdSX1ZBTAkweDNmYzAwMDAgLyogU2xvdCBQb3dlciBMaW1pdCBWYWx1ZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUFdSX1NDTAkweGMwMDAwMDAgLyogU2xvdCBQb3dlciBMaW1pdCBTY2FsZSAqLworI2RlZmluZSBQQ0lfRVhQX0RFVkNUTAkJOAkvKiBEZXZpY2UgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfQ0VSRQkweDAwMDEJLyogQ29ycmVjdGFibGUgRXJyb3IgUmVwb3J0aW5nIEVuLiAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfTkZFUkUJMHgwMDAyCS8qIE5vbi1GYXRhbCBFcnJvciBSZXBvcnRpbmcgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9GRVJFCTB4MDAwNAkvKiBGYXRhbCBFcnJvciBSZXBvcnRpbmcgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9VUlJFCTB4MDAwOAkvKiBVbnN1cHBvcnRlZCBSZXF1ZXN0IFJlcG9ydGluZyBFbi4gKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX1JFTEFYX0VOIDB4MDAxMCAvKiBFbmFibGUgcmVsYXhlZCBvcmRlcmluZyAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfUEFZTE9BRAkweDAwZTAJLyogTWF4X1BheWxvYWRfU2l6ZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfRVhUX1RBRwkweDAxMDAJLyogRXh0ZW5kZWQgVGFnIEZpZWxkIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfUEhBTlRPTQkweDAyMDAJLyogUGhhbnRvbSBGdW5jdGlvbnMgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9BVVhfUE1FCTB4MDQwMAkvKiBBdXhpbGlhcnkgUG93ZXIgUE0gRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9OT1NOT09QX0VOIDB4MDgwMCAgLyogRW5hYmxlIE5vIFNub29wICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9SRUFEUlEJMHg3MDAwCS8qIE1heF9SZWFkX1JlcXVlc3RfU2l6ZSAqLworI2RlZmluZSBQQ0lfRVhQX0RFVlNUQQkJMTAJLyogRGV2aWNlIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfQ0VECTB4MDEJLyogQ29ycmVjdGFibGUgRXJyb3IgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX05GRUQJMHgwMgkvKiBOb24tRmF0YWwgRXJyb3IgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX0ZFRAkweDA0CS8qIEZhdGFsIEVycm9yIERldGVjdGVkICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9VUkQJMHgwOAkvKiBVbnN1cHBvcnRlZCBSZXF1ZXN0IERldGVjdGVkICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9BVVhQRAkweDEwCS8qIEFVWCBQb3dlciBEZXRlY3RlZCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfVFJQTkQJMHgyMAkvKiBUcmFuc2FjdGlvbnMgUGVuZGluZyAqLworI2RlZmluZSBQQ0lfRVhQX0xOS0NBUAkJMTIJLyogTGluayBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgUENJX0VYUF9MTktDVEwJCTE2CS8qIExpbmsgQ29udHJvbCAqLworI2RlZmluZSBQQ0lfRVhQX0xOS1NUQQkJMTgJLyogTGluayBTdGF0dXMgKi8KKyNkZWZpbmUgUENJX0VYUF9TTFRDQVAJCTIwCS8qIFNsb3QgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFBDSV9FWFBfU0xUQ1RMCQkyNAkvKiBTbG90IENvbnRyb2wgKi8KKyNkZWZpbmUgUENJX0VYUF9TTFRTVEEJCTI2CS8qIFNsb3QgU3RhdHVzICovCisjZGVmaW5lIFBDSV9FWFBfUlRDVEwJCTI4CS8qIFJvb3QgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9SVENUTF9TRUNFRQkweDAxCS8qIFN5c3RlbSBFcnJvciBvbiBDb3JyZWN0YWJsZSBFcnJvciAqLworI2RlZmluZSAgUENJX0VYUF9SVENUTF9TRU5GRUUJMHgwMgkvKiBTeXN0ZW0gRXJyb3Igb24gTm9uLUZhdGFsIEVycm9yICovCisjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFRkVFCTB4MDQJLyogU3lzdGVtIEVycm9yIG9uIEZhdGFsIEVycm9yICovCisjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1BNRUlFCTB4MDgJLyogUE1FIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfUlRDVExfQ1JTU1ZFCTB4MTAJLyogQ1JTIFNvZnR3YXJlIFZpc2liaWxpdHkgRW5hYmxlICovCisjZGVmaW5lIFBDSV9FWFBfUlRDQVAJCTMwCS8qIFJvb3QgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFBDSV9FWFBfUlRTVEEJCTMyCS8qIFJvb3QgU3RhdHVzICovCisKKy8qIEV4dGVuZGVkIENhcGFiaWxpdGllcyAoUENJLVggMi4wIGFuZCBFeHByZXNzKSAqLworI2RlZmluZSBQQ0lfRVhUX0NBUF9JRChoZWFkZXIpCQkoaGVhZGVyICYgMHgwMDAwZmZmZikKKyNkZWZpbmUgUENJX0VYVF9DQVBfVkVSKGhlYWRlcikJCSgoaGVhZGVyID4+IDE2KSAmIDB4ZikKKyNkZWZpbmUgUENJX0VYVF9DQVBfTkVYVChoZWFkZXIpCSgoaGVhZGVyID4+IDIwKSAmIDB4ZmZjKQorCisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX0VSUgkxCisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX1ZDCTIKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfRFNOCTMKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfUFdSCTQKKworLyogQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nICovCisjZGVmaW5lIFBDSV9FUlJfVU5DT1JfU1RBVFVTCTQJLyogVW5jb3JyZWN0YWJsZSBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX1RSQUlOCTB4MDAwMDAwMDEJLyogVHJhaW5pbmcgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX0RMUAkweDAwMDAwMDEwCS8qIERhdGEgTGluayBQcm90b2NvbCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfUE9JU09OX1RMUAkweDAwMDAxMDAwCS8qIFBvaXNvbmVkIFRMUCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfRkNQCTB4MDAwMDIwMDAJLyogRmxvdyBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19DT01QX1RJTUUJMHgwMDAwNDAwMAkvKiBDb21wbGV0aW9uIFRpbWVvdXQgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX0NPTVBfQUJPUlQJMHgwMDAwODAwMAkvKiBDb21wbGV0ZXIgQWJvcnQgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX1VOWF9DT01QCTB4MDAwMTAwMDAJLyogVW5leHBlY3RlZCBDb21wbGV0aW9uICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19SWF9PVkVSCTB4MDAwMjAwMDAJLyogUmVjZWl2ZXIgT3ZlcmZsb3cgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX01BTEZfVExQCTB4MDAwNDAwMDAJLyogTWFsZm9ybWVkIFRMUCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfRUNSQwkweDAwMDgwMDAwCS8qIEVDUkMgRXJyb3IgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19VTlNVUAkweDAwMTAwMDAwCS8qIFVuc3VwcG9ydGVkIFJlcXVlc3QgKi8KKyNkZWZpbmUgUENJX0VSUl9VTkNPUl9NQVNLCTgJLyogVW5jb3JyZWN0YWJsZSBFcnJvciBNYXNrICovCisJLyogU2FtZSBiaXRzIGFzIGFib3ZlICovCisjZGVmaW5lIFBDSV9FUlJfVU5DT1JfU0VWRVIJMTIJLyogVW5jb3JyZWN0YWJsZSBFcnJvciBTZXZlcml0eSAqLworCS8qIFNhbWUgYml0cyBhcyBhYm92ZSAqLworI2RlZmluZSBQQ0lfRVJSX0NPUl9TVEFUVVMJMTYJLyogQ29ycmVjdGFibGUgRXJyb3IgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVJSX0NPUl9SQ1ZSCTB4MDAwMDAwMDEJLyogUmVjZWl2ZXIgRXJyb3IgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVJSX0NPUl9CQURfVExQCTB4MDAwMDAwNDAJLyogQmFkIFRMUCBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX0JBRF9ETExQCTB4MDAwMDAwODAJLyogQmFkIERMTFAgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVJSX0NPUl9SRVBfUk9MTAkweDAwMDAwMTAwCS8qIFJFUExBWV9OVU0gUm9sbG92ZXIgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX1JFUF9USU1FUgkweDAwMDAxMDAwCS8qIFJlcGxheSBUaW1lciBUaW1lb3V0ICovCisjZGVmaW5lIFBDSV9FUlJfQ09SX01BU0sJMjAJLyogQ29ycmVjdGFibGUgRXJyb3IgTWFzayAqLworCS8qIFNhbWUgYml0cyBhcyBhYm92ZSAqLworI2RlZmluZSBQQ0lfRVJSX0NBUAkJMjQJLyogQWR2YW5jZWQgRXJyb3IgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lICBQQ0lfRVJSX0NBUF9GRVAoeCkJKCh4KSAmIDMxKQkvKiBGaXJzdCBFcnJvciBQb2ludGVyICovCisjZGVmaW5lICBQQ0lfRVJSX0NBUF9FQ1JDX0dFTkMJMHgwMDAwMDAyMAkvKiBFQ1JDIEdlbmVyYXRpb24gQ2FwYWJsZSAqLworI2RlZmluZSAgUENJX0VSUl9DQVBfRUNSQ19HRU5FCTB4MDAwMDAwNDAJLyogRUNSQyBHZW5lcmF0aW9uIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VSUl9DQVBfRUNSQ19DSEtDCTB4MDAwMDAwODAJLyogRUNSQyBDaGVjayBDYXBhYmxlICovCisjZGVmaW5lICBQQ0lfRVJSX0NBUF9FQ1JDX0NIS0UJMHgwMDAwMDEwMAkvKiBFQ1JDIENoZWNrIEVuYWJsZSAqLworI2RlZmluZSBQQ0lfRVJSX0hFQURFUl9MT0cJMjgJLyogSGVhZGVyIExvZyBSZWdpc3RlciAoMTYgYnl0ZXMpICovCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9DT01NQU5ECTQ0CS8qIFJvb3QgRXJyb3IgQ29tbWFuZCAqLworI2RlZmluZSBQQ0lfRVJSX1JPT1RfU1RBVFVTCTQ4CisjZGVmaW5lIFBDSV9FUlJfUk9PVF9DT1JfU1JDCTUyCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9TUkMJNTQKKworLyogVmlydHVhbCBDaGFubmVsICovCisjZGVmaW5lIFBDSV9WQ19QT1JUX1JFRzEJNAorI2RlZmluZSBQQ0lfVkNfUE9SVF9SRUcyCTgKKyNkZWZpbmUgUENJX1ZDX1BPUlRfQ1RSTAkxMgorI2RlZmluZSBQQ0lfVkNfUE9SVF9TVEFUVVMJMTQKKyNkZWZpbmUgUENJX1ZDX1JFU19DQVAJCTE2CisjZGVmaW5lIFBDSV9WQ19SRVNfQ1RSTAkJMjAKKyNkZWZpbmUgUENJX1ZDX1JFU19TVEFUVVMJMjYKKworLyogUG93ZXIgQnVkZ2V0aW5nICovCisjZGVmaW5lIFBDSV9QV1JfRFNSCQk0CS8qIERhdGEgU2VsZWN0IFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9QV1JfREFUQQkJOAkvKiBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfUFdSX0RBVEFfQkFTRSh4KQkoKHgpICYgMHhmZikJICAgIC8qIEJhc2UgUG93ZXIgKi8KKyNkZWZpbmUgIFBDSV9QV1JfREFUQV9TQ0FMRSh4KQkoKCh4KSA+PiA4KSAmIDMpICAgIC8qIERhdGEgU2NhbGUgKi8KKyNkZWZpbmUgIFBDSV9QV1JfREFUQV9QTV9TVUIoeCkJKCgoeCkgPj4gMTApICYgNykgICAvKiBQTSBTdWIgU3RhdGUgKi8KKyNkZWZpbmUgIFBDSV9QV1JfREFUQV9QTV9TVEFURSh4KSAoKCh4KSA+PiAxMykgJiAzKSAvKiBQTSBTdGF0ZSAqLworI2RlZmluZSAgUENJX1BXUl9EQVRBX1RZUEUoeCkJKCgoeCkgPj4gMTUpICYgNykgICAvKiBUeXBlICovCisjZGVmaW5lICBQQ0lfUFdSX0RBVEFfUkFJTCh4KQkoKCh4KSA+PiAxOCkgJiA3KSAgIC8qIFBvd2VyIFJhaWwgKi8KKyNkZWZpbmUgUENJX1BXUl9DQVAJCTEyCS8qIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgIFBDSV9QV1JfQ0FQX0JVREdFVCh4KQkoKHgpICYgMSkJLyogSW5jbHVkZWQgaW4gc3lzdGVtIGJ1ZGdldCAqLworCisjZW5kaWYgLyogTElOVVhfUENJX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waXBlX2ZzX2kuaCBiL2luY2x1ZGUvbGludXgvcGlwZV9mc19pLmgKaW5kZXggMzY3MjVlNy4uMTc2NzA3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waXBlX2ZzX2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oCkBAIC0zOSw5ICszOSw2IEBACiAKICNkZWZpbmUgUElQRV9TRU0oaW5vZGUpCQkoJihpbm9kZSkuaV9zZW0pCiAjZGVmaW5lIFBJUEVfV0FJVChpbm9kZSkJKCYoaW5vZGUpLmlfcGlwZS0+d2FpdCkKLSNkZWZpbmUgUElQRV9CQVNFKGlub2RlKQkoKGlub2RlKS5pX3BpcGUtPmJhc2UpCi0jZGVmaW5lIFBJUEVfU1RBUlQoaW5vZGUpCSgoaW5vZGUpLmlfcGlwZS0+c3RhcnQpCi0jZGVmaW5lIFBJUEVfTEVOKGlub2RlKQkJKChpbm9kZSkuaV9waXBlLT5sZW4pCiAjZGVmaW5lIFBJUEVfUkVBREVSUyhpbm9kZSkJKChpbm9kZSkuaV9waXBlLT5yZWFkZXJzKQogI2RlZmluZSBQSVBFX1dSSVRFUlMoaW5vZGUpCSgoaW5vZGUpLmlfcGlwZS0+d3JpdGVycykKICNkZWZpbmUgUElQRV9XQUlUSU5HX1dSSVRFUlMoaW5vZGUpCSgoaW5vZGUpLmlfcGlwZS0+d2FpdGluZ193cml0ZXJzKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbS5oIGIvaW5jbHVkZS9saW51eC9wbS5oCmluZGV4IDdhZWIyMDguLjVjZmIwNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3BtLmgKQEAgLTE4Niw3ICsxODYsOSBAQAogCiBzdHJ1Y3QgZGV2aWNlOwogCi10eXBlZGVmIHUzMiBfX2JpdHdpc2UgcG1fbWVzc2FnZV90OwordHlwZWRlZiBzdHJ1Y3QgcG1fbWVzc2FnZSB7CisJaW50IGV2ZW50OworfSBwbV9tZXNzYWdlX3Q7CiAKIC8qCiAgKiBUaGVyZSBhcmUgNCBpbXBvcnRhbnQgc3RhdGVzIGRyaXZlciBjYW4gYmUgaW46CkBAIC0yMDcsOSArMjA5LDEzIEBACiAgKiBvciBzb21ldGhpbmcgc2ltaWxhciBzb29uLgogICovCiAKLSNkZWZpbmUgUE1TR19GUkVFWkUJKChfX2ZvcmNlIHBtX21lc3NhZ2VfdCkgMykKLSNkZWZpbmUgUE1TR19TVVNQRU5ECSgoX19mb3JjZSBwbV9tZXNzYWdlX3QpIDMpCi0jZGVmaW5lIFBNU0dfT04JCSgoX19mb3JjZSBwbV9tZXNzYWdlX3QpIDApCisjZGVmaW5lIFBNX0VWRU5UX09OIDAKKyNkZWZpbmUgUE1fRVZFTlRfRlJFRVpFIDEKKyNkZWZpbmUgUE1fRVZFTlRfU1VTUEVORCAyCisKKyNkZWZpbmUgUE1TR19GUkVFWkUJKChzdHJ1Y3QgcG1fbWVzc2FnZSl7IC5ldmVudCA9IFBNX0VWRU5UX0ZSRUVaRSwgfSkKKyNkZWZpbmUgUE1TR19TVVNQRU5ECSgoc3RydWN0IHBtX21lc3NhZ2UpeyAuZXZlbnQgPSBQTV9FVkVOVF9TVVNQRU5ELCB9KQorI2RlZmluZSBQTVNHX09OCQkoKHN0cnVjdCBwbV9tZXNzYWdlKXsgLmV2ZW50ID0gUE1fRVZFTlRfT04sIH0pCiAKIHN0cnVjdCBkZXZfcG1faW5mbyB7CiAJcG1fbWVzc2FnZV90CQlwb3dlcl9zdGF0ZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG5wLmggYi9pbmNsdWRlL2xpbnV4L3BucC5oCmluZGV4IDVlYzJiZDAuLmFhZGJhYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG5wLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbnAuaApAQCAtNDQzLDcgKzQ0Myw3IEBACiAjZGVmaW5lIHBucF9pbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICJwbnA6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCiAjZGVmaW5lIHBucF93YXJuKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HICJwbnA6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCiAKLSNpZmRlZiBERUJVRworI2lmZGVmIENPTkZJR19QTlBfREVCVUcKICNkZWZpbmUgcG5wX2RiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fREVCVUcgInBucDogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKICNlbHNlCiAjZGVmaW5lIHBucF9kYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wdHJhY2UuaCBiL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKaW5kZXggYTM3M2ZjMi4uZGM2ZjM2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCkBAIC0yMCw2ICsyMCw4IEBACiAjZGVmaW5lIFBUUkFDRV9ERVRBQ0gJCTB4MTEKIAogI2RlZmluZSBQVFJBQ0VfU1lTQ0FMTAkJICAyNAorI2RlZmluZSBQVFJBQ0VfU1lTRU1VCQkgIDMxCisjZGVmaW5lIFBUUkFDRV9TWVNFTVVfU0lOR0xFU1RFUCAgMzIKIAogLyogMHg0MjAwLTB4NDMwMCBhcmUgcmVzZXJ2ZWQgZm9yIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBhZGRpdGlvbnMuICAqLwogI2RlZmluZSBQVFJBQ0VfU0VUT1BUSU9OUwkweDQyMDAKQEAgLTg4LDYgKzkwLDcgQEAKIAkJCSAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXdfcGFyZW50KTsKIGV4dGVybiB2b2lkIF9fcHRyYWNlX3VubGluayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKTsKIGV4dGVybiB2b2lkIHB0cmFjZV91bnRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpOworZXh0ZXJuIGludCBwdHJhY2VfbWF5X2F0dGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRyYWNlX2xpbmsoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwKIAkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ld19wYXJlbnQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCmluZGV4IDgwODFhMjguLjljNTE5MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCkBAIC0yNCw3ICsyNCw3IEBACiAKIHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgewogCXVuc2lnbmVkIGludAkJaGVpZ2h0OwotCWludAkJCWdmcF9tYXNrOworCXVuc2lnbmVkIGludAkJZ2ZwX21hc2s7CiAJc3RydWN0IHJhZGl4X3RyZWVfbm9kZQkqcm5vZGU7CiB9OwogCkBAIC01MCw3ICs1MCw3IEBACiB1bnNpZ25lZCBpbnQKIHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdm9pZCAqKnJlc3VsdHMsCiAJCQl1bnNpZ25lZCBsb25nIGZpcnN0X2luZGV4LCB1bnNpZ25lZCBpbnQgbWF4X2l0ZW1zKTsKLWludCByYWRpeF90cmVlX3ByZWxvYWQoaW50IGdmcF9tYXNrKTsKK2ludCByYWRpeF90cmVlX3ByZWxvYWQodW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKTsKIHZvaWQgcmFkaXhfdHJlZV9pbml0KHZvaWQpOwogdm9pZCAqcmFkaXhfdHJlZV90YWdfc2V0KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCiAJCQl1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgdGFnKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaAppbmRleCA0YmYxNjU5Li45ZGU5OTE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oCkBAIC03LDcgKzcsNyBAQAogI2RlZmluZSBCSVRNQVBfSCAxCiAKICNkZWZpbmUgQklUTUFQX01BSk9SIDMKLSNkZWZpbmUgQklUTUFQX01JTk9SIDM4CisjZGVmaW5lIEJJVE1BUF9NSU5PUiAzOQogCiAvKgogICogaW4tbWVtb3J5IGJpdG1hcDoKQEAgLTE0Nyw4ICsxNDcsOSBAQAogCV9fdTMyIHN0YXRlOyAgICAgICAgLyogNDggIGJpdG1hcCBzdGF0ZSBpbmZvcm1hdGlvbiAqLwogCV9fdTMyIGNodW5rc2l6ZTsgICAgLyogNTIgIHRoZSBiaXRtYXAgY2h1bmsgc2l6ZSBpbiBieXRlcyAqLwogCV9fdTMyIGRhZW1vbl9zbGVlcDsgLyogNTYgIHNlY29uZHMgYmV0d2VlbiBkaXNrIGZsdXNoZXMgKi8KKwlfX3UzMiB3cml0ZV9iZWhpbmQ7IC8qIDYwICBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgd3JpdGUtYmVoaW5kIHdyaXRlcyAqLwogCi0JX191OCAgcGFkWzI1NiAtIDYwXTsgLyogc2V0IHRvIHplcm8gKi8KKwlfX3U4ICBwYWRbMjU2IC0gNjRdOyAvKiBzZXQgdG8gemVybyAqLwogfSBiaXRtYXBfc3VwZXJfdDsKIAogLyogbm90ZXM6CkBAIC0yMjYsNiArMjI3LDkgQEAKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwl1bnNpZ25lZCBsb25nIG1heF93cml0ZV9iZWhpbmQ7IC8qIHdyaXRlLWJlaGluZCBtb2RlICovCisJYXRvbWljX3QgYmVoaW5kX3dyaXRlczsKKwogCS8qCiAJICogdGhlIGJpdG1hcCBkYWVtb24gLSBwZXJpb2RpY2FsbHkgd2FrZXMgdXAgYW5kIHN3ZWVwcyB0aGUgYml0bWFwCiAJICogZmlsZSwgY2xlYW5pbmcgdXAgYml0cyBhbmQgZmx1c2hpbmcgb3V0IHBhZ2VzIHRvIGRpc2sgYXMgbmVjZXNzYXJ5CkBAIC0yNjAsOSArMjY0LDEwIEBACiB2b2lkIGJpdG1hcF93cml0ZV9hbGwoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKIAogLyogdGhlc2UgYXJlIGV4cG9ydGVkICovCi1pbnQgYml0bWFwX3N0YXJ0d3JpdGUoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzZWN0b3JfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2VjdG9ycyk7Ci12b2lkIGJpdG1hcF9lbmR3cml0ZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBzZWN0b3JzLAotCQkgICAgIGludCBzdWNjZXNzKTsKK2ludCBiaXRtYXBfc3RhcnR3cml0ZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwKKwkJCXVuc2lnbmVkIGxvbmcgc2VjdG9ycywgaW50IGJlaGluZCk7Cit2b2lkIGJpdG1hcF9lbmR3cml0ZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwKKwkJCXVuc2lnbmVkIGxvbmcgc2VjdG9ycywgaW50IHN1Y2Nlc3MsIGludCBiZWhpbmQpOwogaW50IGJpdG1hcF9zdGFydF9zeW5jKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCBpbnQgKmJsb2NrcywgaW50IGRlZ3JhZGVkKTsKIHZvaWQgYml0bWFwX2VuZF9zeW5jKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCBpbnQgKmJsb2NrcywgaW50IGFib3J0ZWQpOwogdm9pZCBiaXRtYXBfY2xvc2Vfc3luYyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL2xpbmVhci5oIGIvaW5jbHVkZS9saW51eC9yYWlkL2xpbmVhci5oCmluZGV4IGUwNGM0ZmUuLjdlYWYyOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9saW5lYXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvbGluZWFyLmgKQEAgLTE0LDggKzE0LDggQEAKIHN0cnVjdCBsaW5lYXJfcHJpdmF0ZV9kYXRhCiB7CiAJZGV2X2luZm9fdAkJKipoYXNoX3RhYmxlOwotCWRldl9pbmZvX3QJCSpzbWFsbGVzdDsKLQlpbnQJCQlucl96b25lczsKKwlzZWN0b3JfdAkJaGFzaF9zcGFjaW5nOworCWludAkJCXByZXNoaWZ0OyAvKiBzaGlmdCBiZWZvcmUgZGl2aWRpbmcgYnkgaGFzaF9zcGFjaW5nICovCiAJZGV2X2luZm9fdAkJZGlza3NbMF07CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaAppbmRleCA4YzE0YmE1Li5lYmNlOTQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgKQEAgLTg2LDcwICs4Niw2IEBACiAjZGVmaW5lIE1BWF9DSFVOS19TSVpFICg0MDk2KjEwMjQpCiAKIC8qCi0gKiBkZWZhdWx0IHJlYWRhaGVhZAotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGRpc2tfZmF1bHR5KG1kcF9kaXNrX3QgKiBkKQotewotCXJldHVybiBkLT5zdGF0ZSAmICgxIDw8IE1EX0RJU0tfRkFVTFRZKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZGlza19hY3RpdmUobWRwX2Rpc2tfdCAqIGQpCi17Ci0JcmV0dXJuIGQtPnN0YXRlICYgKDEgPDwgTURfRElTS19BQ1RJVkUpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkaXNrX3N5bmMobWRwX2Rpc2tfdCAqIGQpCi17Ci0JcmV0dXJuIGQtPnN0YXRlICYgKDEgPDwgTURfRElTS19TWU5DKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZGlza19zcGFyZShtZHBfZGlza190ICogZCkKLXsKLQlyZXR1cm4gIWRpc2tfc3luYyhkKSAmJiAhZGlza19hY3RpdmUoZCkgJiYgIWRpc2tfZmF1bHR5KGQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkaXNrX3JlbW92ZWQobWRwX2Rpc2tfdCAqIGQpCi17Ci0JcmV0dXJuIGQtPnN0YXRlICYgKDEgPDwgTURfRElTS19SRU1PVkVEKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1hcmtfZGlza19mYXVsdHkobWRwX2Rpc2tfdCAqIGQpCi17Ci0JZC0+c3RhdGUgfD0gKDEgPDwgTURfRElTS19GQVVMVFkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFya19kaXNrX2FjdGl2ZShtZHBfZGlza190ICogZCkKLXsKLQlkLT5zdGF0ZSB8PSAoMSA8PCBNRF9ESVNLX0FDVElWRSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX2Rpc2tfc3luYyhtZHBfZGlza190ICogZCkKLXsKLQlkLT5zdGF0ZSB8PSAoMSA8PCBNRF9ESVNLX1NZTkMpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFya19kaXNrX3NwYXJlKG1kcF9kaXNrX3QgKiBkKQotewotCWQtPnN0YXRlID0gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1hcmtfZGlza19yZW1vdmVkKG1kcF9kaXNrX3QgKiBkKQotewotCWQtPnN0YXRlID0gKDEgPDwgTURfRElTS19GQVVMVFkpIHwgKDEgPDwgTURfRElTS19SRU1PVkVEKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1hcmtfZGlza19pbmFjdGl2ZShtZHBfZGlza190ICogZCkKLXsKLQlkLT5zdGF0ZSAmPSB+KDEgPDwgTURfRElTS19BQ1RJVkUpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFya19kaXNrX25vbnN5bmMobWRwX2Rpc2tfdCAqIGQpCi17Ci0JZC0+c3RhdGUgJj0gfigxIDw8IE1EX0RJU0tfU1lOQyk7Ci19Ci0KLS8qCiAgKiBNRCdzICdleHRlbmRlZCcgZGV2aWNlCiAgKi8KIHN0cnVjdCBtZGtfcmRldl9zCkBAIC0xNjYsNiArMTAyLDcgQEAKIAlpbnQJCXNiX2xvYWRlZDsKIAlzZWN0b3JfdAlkYXRhX29mZnNldDsJLyogc3RhcnQgb2YgZGF0YSBpbiBhcnJheSAqLwogCXNlY3Rvcl90CXNiX29mZnNldDsKKwlpbnQJCXNiX3NpemU7CS8qIGJ5dGVzIGluIHRoZSBzdXBlcmJsb2NrICovCiAJaW50CQlwcmVmZXJyZWRfbWlub3I7CS8qIGF1dG9ydW4gc3VwcG9ydCAqLwogCiAJLyogQSBkZXZpY2UgY2FuIGJlIGluIG9uZSBvZiB0aHJlZSBzdGF0ZXMgYmFzZWQgb24gdHdvIGZsYWdzOgpAQCAtMTgxLDYgKzExOCw5IEBACiAJaW50IGZhdWx0eTsJCQkvKiBpZiBmYXVsdHkgZG8gbm90IGlzc3VlIElPIHJlcXVlc3RzICovCiAJaW50IGluX3N5bmM7CQkJLyogZGV2aWNlIGlzIGEgZnVsbCBtZW1iZXIgb2YgdGhlIGFycmF5ICovCiAKKwl1bnNpZ25lZCBsb25nCWZsYWdzOwkJLyogU2hvdWxkIGluY2x1ZGUgZmF1bHR5IGFuZCBpbl9zeW5jIGhlcmUuICovCisjZGVmaW5lCVdyaXRlTW9zdGx5CTQJCS8qIEF2b2lkIHJlYWRpbmcgaWYgYXQgYWxsIHBvc3NpYmxlICovCisKIAlpbnQgZGVzY19ucjsJCQkvKiBkZXNjcmlwdG9yIGluZGV4IGluIHRoZSBzdXBlcmJsb2NrICovCiAJaW50IHJhaWRfZGlzazsJCQkvKiByb2xlIG9mIGRldmljZSBpbiBhcnJheSAqLwogCWludCBzYXZlZF9yYWlkX2Rpc2s7CQkvKiByb2xlIHRoYXQgZGV2aWNlIHVzZWQgdG8gaGF2ZSBpbiB0aGUKQEAgLTI3MiwxMiArMjEyLDE5IEBACiAJYXRvbWljX3QJCQl3cml0ZXNfcGVuZGluZzsgCiAJcmVxdWVzdF9xdWV1ZV90CQkJKnF1ZXVlOwkvKiBmb3IgcGx1Z2dpbmcgLi4uICovCiAKKwlhdG9taWNfdCAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2JlaGluZDsgLyogb3V0c3RhbmRpbmcgYXN5bmMgSU8gKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIG1heF93cml0ZV9iZWhpbmQ7IC8qIDAgPSBzeW5jICovCisKIAlzdHJ1Y3QgYml0bWFwICAgICAgICAgICAgICAgICAgICpiaXRtYXA7IC8qIHRoZSBiaXRtYXAgZm9yIHRoZSBkZXZpY2UgKi8KIAlzdHJ1Y3QgZmlsZQkJCSpiaXRtYXBfZmlsZTsgLyogdGhlIGJpdG1hcCBmaWxlICovCiAJbG9uZwkJCQliaXRtYXBfb2Zmc2V0OyAvKiBvZmZzZXQgZnJvbSBzdXBlcmJsb2NrIG9mCiAJCQkJCQkJKiBzdGFydCBvZiBiaXRtYXAuIE1heSBiZQogCQkJCQkJCSogbmVnYXRpdmUsIGJ1dCBub3QgJzAnCiAJCQkJCQkJKi8KKwlsb25nCQkJCWRlZmF1bHRfYml0bWFwX29mZnNldDsgLyogdGhpcyBpcyB0aGUgb2Zmc2V0IHRvIHVzZSB3aGVuCisJCQkJCQkJCSogaG90LWFkZGluZyBhIGJpdG1hcC4gIEl0IHNob3VsZAorCQkJCQkJCQkqIGV2ZW50dWFsbHkgYmUgc2V0dGFibGUgYnkgc3lzZnMuCisJCQkJCQkJCSovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlhbGxfbWRkZXZzOwogfTsKQEAgLTMxNCw2ICsyNjEsMTIgQEAKIAlpbnQgKCpyZXNpemUpIChtZGRldl90ICptZGRldiwgc2VjdG9yX3Qgc2VjdG9ycyk7CiAJaW50ICgqcmVzaGFwZSkgKG1kZGV2X3QgKm1kZGV2LCBpbnQgcmFpZF9kaXNrcyk7CiAJaW50ICgqcmVjb25maWcpIChtZGRldl90ICptZGRldiwgaW50IGxheW91dCwgaW50IGNodW5rX3NpemUpOworCS8qIHF1aWVzY2UgbW92ZXMgYmV0d2VlbiBxdWllc2NlbmNlIHN0YXRlcworCSAqIDAgLSBmdWxseSBhY3RpdmUKKwkgKiAxIC0gbm8gbmV3IHJlcXVlc3RzIGFsbG93ZWQKKwkgKiBvdGhlcnMgLSByZXNlcnZlZAorCSAqLworCXZvaWQgKCpxdWllc2NlKSAobWRkZXZfdCAqbWRkZXYsIGludCBzdGF0ZSk7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9wLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oCmluZGV4IGRjNjVjZDQuLmMxMDBmYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9wLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaApAQCAtNzksNiArNzksMTEgQEAKICNkZWZpbmUgTURfRElTS19TWU5DCQkyIC8qIGRpc2sgaXMgaW4gc3luYyB3aXRoIHRoZSByYWlkIHNldCAqLwogI2RlZmluZSBNRF9ESVNLX1JFTU9WRUQJCTMgLyogZGlzayBpcyBpbiBzeW5jIHdpdGggdGhlIHJhaWQgc2V0ICovCiAKKyNkZWZpbmUJTURfRElTS19XUklURU1PU1RMWQk5IC8qIGRpc2sgaXMgIndyaXRlLW1vc3RseSIgaXMgUkFJRDEgY29uZmlnLgorCQkJCSAgICogcmVhZCByZXF1ZXN0cyB3aWxsIG9ubHkgYmUgc2VudCBoZXJlIGluCisJCQkJICAgKiBkaXJlIG5lZWQKKwkJCQkgICAqLworCiB0eXBlZGVmIHN0cnVjdCBtZHBfZGV2aWNlX2Rlc2NyaXB0b3JfcyB7CiAJX191MzIgbnVtYmVyOwkJLyogMCBEZXZpY2UgbnVtYmVyIGluIHRoZSBlbnRpcmUgc2V0CSAgICAgICovCiAJX191MzIgbWFqb3I7CQkvKiAxIERldmljZSBtYWpvciBudW1iZXIJCSAgICAgICovCkBAIC0xOTMsNyArMTk4LDcgQEAKIAogCV9fdTY0CWN0aW1lOwkJLyogbG8gNDAgYml0cyBhcmUgc2Vjb25kcywgdG9wIDI0IGFyZSBtaWNyb3NlY29uZHMgb3IgMCovCiAJX191MzIJbGV2ZWw7CQkvKiAtNCAobXVsdGlwYXRoKSwgLTEgKGxpbmVhciksIDAsMSw0LDUgKi8KLQlfX3UzMglsYXlvdXQ7CQkvKiBvbmx5IGZvciByYWlkNSBjdXJyZW50bHkgKi8KKwlfX3UzMglsYXlvdXQ7CQkvKiBvbmx5IGZvciByYWlkNSBhbmQgcmFpZDEwIGN1cnJlbnRseSAqLwogCV9fdTY0CXNpemU7CQkvKiB1c2VkIHNpemUgb2YgY29tcG9uZW50IGRldmljZXMsIGluIDUxMmJ5dGUgc2VjdG9ycyAqLwogCiAJX191MzIJY2h1bmtzaXplOwkvKiBpbiA1MTJieXRlIHNlY3RvcnMgKi8KQEAgLTIxMiw3ICsyMTcsOSBAQAogCV9fdTMyCWRldl9udW1iZXI7CS8qIHBlcm1hbmVudCBpZGVudGlmaWVyIG9mIHRoaXMgIGRldmljZSAtIG5vdCByb2xlIGluIHJhaWQgKi8KIAlfX3UzMgljbnRfY29ycmVjdGVkX3JlYWQ7IC8qIG51bWJlciBvZiByZWFkIGVycm9ycyB0aGF0IHdlcmUgY29ycmVjdGVkIGJ5IHJlLXdyaXRpbmcgKi8KIAlfX3U4CWRldmljZV91dWlkWzE2XTsgLyogdXNlci1zcGFjZSBzZXRhYmxlLCBpZ25vcmVkIGJ5IGtlcm5lbCAqLwotCV9fdTgJcGFkMls2NC01Nl07CS8qIHNldCB0byAwIHdoZW4gd3JpdGluZyAqLworCV9fdTgJZGV2ZmxhZ3M7CS8qIHBlci1kZXZpY2UgZmxhZ3MuICBPbmx5IG9uZSBkZWZpbmVkLi4uKi8KKyNkZWZpbmUJV3JpdGVNb3N0bHkxCTEJLyogbWFzayBmb3Igd3JpdGVtb3N0bHkgZmxhZyBpbiBhYm92ZSAqLworCV9fdTgJcGFkMls2NC01N107CS8qIHNldCB0byAwIHdoZW4gd3JpdGluZyAqLwogCiAJLyogYXJyYXkgc3RhdGUgaW5mb3JtYXRpb24gLSA2NCBieXRlcyAqLwogCV9fdTY0CXV0aW1lOwkJLyogNDAgYml0cyBzZWNvbmQsIDI0IGJ0ZXMgbWljcm9zZWNvbmRzICovCkBAIC0yMzEsNSArMjM4LDEwIEBACiAJX191MTYJZGV2X3JvbGVzWzBdOwkvKiByb2xlIGluIGFycmF5LCBvciAweGZmZmYgZm9yIGEgc3BhcmUsIG9yIDB4ZmZmZSBmb3IgZmF1bHR5ICovCiB9OwogCisvKiBmZWF0dXJlX21hcCBiaXRzICovCisjZGVmaW5lIE1EX0ZFQVRVUkVfQklUTUFQX09GRlNFVAkxCisKKyNkZWZpbmUJTURfRkVBVFVSRV9BTEwJCQkxCisKICNlbmRpZiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL3JhaWQxLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDEuaAppbmRleCA5ZDkzY2YxLi42MGUxOWI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDEuaApAQCAtODAsNiArODAsOSBAQAogCWF0b21pY190CQlyZW1haW5pbmc7IC8qICdoYXZlIHdlIGZpbmlzaGVkJyBjb3VudCwKIAkJCQkJICAgICogdXNlZCBmcm9tIElSUSBoYW5kbGVycwogCQkJCQkgICAgKi8KKwlhdG9taWNfdAkJYmVoaW5kX3JlbWFpbmluZzsgLyogbnVtYmVyIG9mIHdyaXRlLWJlaGluZCBpb3MgcmVtYWluaW5nCisJCQkJCQkgKiBpbiB0aGlzIEJlaGluZElPIHJlcXVlc3QKKwkJCQkJCSAqLwogCXNlY3Rvcl90CQlzZWN0b3I7CiAJaW50CQkJc2VjdG9yczsKIAl1bnNpZ25lZCBsb25nCQlzdGF0ZTsKQEAgLTEwNyw0ICsxMTAsMTQgQEAKICNkZWZpbmUJUjFCSU9fVXB0b2RhdGUJMAogI2RlZmluZQlSMUJJT19Jc1N5bmMJMQogI2RlZmluZQlSMUJJT19EZWdyYWRlZAkyCisjZGVmaW5lCVIxQklPX0JlaGluZElPICAgMworLyogRm9yIHdyaXRlLWJlaGluZCByZXF1ZXN0cywgd2UgY2FsbCBiaV9lbmRfaW8gd2hlbgorICogdGhlIGxhc3Qgbm9uLXdyaXRlLWJlaGluZCBkZXZpY2UgY29tcGxldGVzLCBwcm92aWRpbmcKKyAqIGFueSB3cml0ZSB3YXMgc3VjY2Vzc2Z1bC4gIE90aGVyd2lzZSB3ZSBjYWxsIHdoZW4KKyAqIGFueSB3cml0ZS1iZWhpbmQgd3JpdGUgc3VjY2VlZHMsIG90aGVyd2lzZSB3ZSBjYWxsCisgKiB3aXRoIGZhaWx1cmUgd2hlbiBsYXN0IHdyaXRlIGNvbXBsZXRlcyAoYW5kIGFsbCBmYWlsZWQpLgorICogUmVjb3JkIHRoYXQgYmlfZW5kX2lvIHdhcyBjYWxsZWQgd2l0aCB0aGlzIGZsYWcuLi4KKyAqLworI2RlZmluZQlSMUJJT19SZXR1cm5lZCA0CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL3JhaWQ1LmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDUuaAppbmRleCBkNjNkZGNiLi4xNzZmYzY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDUuaApAQCAtMTM0LDYgKzEzNCw3IEBACiAJdW5zaWduZWQgbG9uZwkJc3RhdGU7CQkJLyogc3RhdGUgZmxhZ3MgKi8KIAlhdG9taWNfdAkJY291bnQ7CQkJLyogbnIgb2YgYWN0aXZlIHRocmVhZC9yZXF1ZXN0cyAqLwogCXNwaW5sb2NrX3QJCWxvY2s7CisJaW50CQkJYm1fc2VxOwkvKiBzZXF1ZW5jZSBudW1iZXIgZm9yIGJpdG1hcCBmbHVzaGVzICovCiAJc3RydWN0IHI1ZGV2IHsKIAkJc3RydWN0IGJpbwlyZXE7CiAJCXN0cnVjdCBiaW9fdmVjCXZlYzsKQEAgLTE2NSwxMiArMTY2LDEzIEBACiAvKgogICogU3RyaXBlIHN0YXRlCiAgKi8KLSNkZWZpbmUgU1RSSVBFX0VSUk9SCQkxCiAjZGVmaW5lIFNUUklQRV9IQU5ETEUJCTIKICNkZWZpbmUJU1RSSVBFX1NZTkNJTkcJCTMKICNkZWZpbmUJU1RSSVBFX0lOU1lOQwkJNAogI2RlZmluZQlTVFJJUEVfUFJFUkVBRF9BQ1RJVkUJNQogI2RlZmluZQlTVFJJUEVfREVMQVlFRAkJNgorI2RlZmluZQlTVFJJUEVfREVHUkFERUQJCTcKKyNkZWZpbmUJU1RSSVBFX0JJVF9ERUxBWQk4CiAKIC8qCiAgKiBQbHVnZ2luZzoKQEAgLTIxMCwxMCArMjEyLDIwIEBACiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWhhbmRsZV9saXN0OyAvKiBzdHJpcGVzIG5lZWRpbmcgaGFuZGxpbmcgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWRlbGF5ZWRfbGlzdDsgLyogc3RyaXBlcyB0aGF0IGhhdmUgcGx1Z2dlZCByZXF1ZXN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQJYml0bWFwX2xpc3Q7IC8qIHN0cmlwZXMgZGVsYXlpbmcgYXdhaXRpbmcgYml0bWFwIHVwZGF0ZSAqLwogCWF0b21pY190CQlwcmVyZWFkX2FjdGl2ZV9zdHJpcGVzOyAvKiBzdHJpcGVzIHdpdGggc2NoZWR1bGVkIGlvICovCiAKIAljaGFyCQkJY2FjaGVfbmFtZVsyMF07CiAJa21lbV9jYWNoZV90CQkqc2xhYl9jYWNoZTsgLyogZm9yIGFsbG9jYXRpbmcgc3RyaXBlcyAqLworCisJaW50CQkJc2VxX2ZsdXNoLCBzZXFfd3JpdGU7CisJaW50CQkJcXVpZXNjZTsKKworCWludAkJCWZ1bGxzeW5jOyAgLyogc2V0IHRvIDEgaWYgYSBmdWxsIHN5bmMgaXMgbmVlZGVkLAorCQkJCQkgICAgKiAoZnJlc2ggZGV2aWNlIGFkZGVkKS4KKwkJCQkJICAgICogQ2xlYXJlZCB3aGVuIGEgc3luYyBjb21wbGV0ZXMuCisJCQkJCSAgICAqLworCiAJLyoKIAkgKiBGcmVlIHN0cmlwZXMgcG9vbAogCSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkX2NsYXNzLmggYi9pbmNsdWRlL2xpbnV4L3JhaWRfY2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzExMjNjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkX2NsYXNzLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3RyYW5zcG9ydF9jbGFzcy5oPgorCitzdHJ1Y3QgcmFpZF90ZW1wbGF0ZSB7CisJc3RydWN0IHRyYW5zcG9ydF9jb250YWluZXIgcmFpZF9hdHRyczsKK307CisKK3N0cnVjdCByYWlkX2Z1bmN0aW9uX3RlbXBsYXRlIHsKKwl2b2lkICpjb29raWU7CisJaW50ICgqaXNfcmFpZCkoc3RydWN0IGRldmljZSAqKTsKKwl2b2lkICgqZ2V0X3Jlc3luYykoc3RydWN0IGRldmljZSAqKTsKKwl2b2lkICgqZ2V0X3N0YXRlKShzdHJ1Y3QgZGV2aWNlICopOworfTsKKworZW51bSByYWlkX3N0YXRlIHsKKwlSQUlEX0FDVElWRSA9IDEsCisJUkFJRF9ERUdSQURFRCwKKwlSQUlEX1JFU1lOQ0lORywKKwlSQUlEX09GRkxJTkUsCit9OworCitzdHJ1Y3QgcmFpZF9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvbXBvbmVudF9saXN0OworCWludCBjb21wb25lbnRfY291bnQ7CisJaW50IGxldmVsOworCWVudW0gcmFpZF9zdGF0ZSBzdGF0ZTsKKwlpbnQgcmVzeW5jOworfTsKKworI2RlZmluZSBERUZJTkVfUkFJRF9BVFRSSUJVVEUodHlwZSwgYXR0cikJCQkJICAgICAgXAorc3RhdGljIGlubGluZSB2b2lkCQkJCQkJCSAgICAgIFwKK3JhaWRfc2V0XyMjYXR0cihzdHJ1Y3QgcmFpZF90ZW1wbGF0ZSAqciwgc3RydWN0IGRldmljZSAqZGV2LCB0eXBlIHZhbHVlKSB7ICAgIFwKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2ID0JCQkJCSAgICAgIFwKKwkJYXR0cmlidXRlX2NvbnRhaW5lcl9maW5kX2NsYXNzX2RldmljZSgmci0+cmFpZF9hdHRycy5hYywgZGV2KTtcCisJc3RydWN0IHJhaWRfZGF0YSAqcmQ7CQkJCQkJICAgICAgXAorCUJVR19PTighY2Rldik7CQkJCQkJCSAgICAgIFwKKwlyZCA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOwkJCQkJICAgICAgXAorCXJkLT5hdHRyID0gdmFsdWU7CQkJCQkJICAgICAgXAorfQkJCQkJCQkJCSAgICAgIFwKK3N0YXRpYyBpbmxpbmUgdHlwZQkJCQkJCQkgICAgICBcCityYWlkX2dldF8jI2F0dHIoc3RydWN0IHJhaWRfdGVtcGxhdGUgKnIsIHN0cnVjdCBkZXZpY2UgKmRldikgewkJICAgICAgXAorCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYgPQkJCQkJICAgICAgXAorCQlhdHRyaWJ1dGVfY29udGFpbmVyX2ZpbmRfY2xhc3NfZGV2aWNlKCZyLT5yYWlkX2F0dHJzLmFjLCBkZXYpO1wKKwlzdHJ1Y3QgcmFpZF9kYXRhICpyZDsJCQkJCQkgICAgICBcCisJQlVHX09OKCFjZGV2KTsJCQkJCQkJICAgICAgXAorCXJkID0gY2xhc3NfZ2V0X2RldmRhdGEoY2Rldik7CQkJCQkgICAgICBcCisJcmV0dXJuIHJkLT5hdHRyOwkJCQkJCSAgICAgIFwKK30KKworREVGSU5FX1JBSURfQVRUUklCVVRFKGludCwgbGV2ZWwpCitERUZJTkVfUkFJRF9BVFRSSUJVVEUoaW50LCByZXN5bmMpCitERUZJTkVfUkFJRF9BVFRSSUJVVEUoZW51bSByYWlkX3N0YXRlLCBzdGF0ZSkKKwkKK3N0cnVjdCByYWlkX3RlbXBsYXRlICpyYWlkX2NsYXNzX2F0dGFjaChzdHJ1Y3QgcmFpZF9mdW5jdGlvbl90ZW1wbGF0ZSAqKTsKK3ZvaWQgcmFpZF9jbGFzc19yZWxlYXNlKHN0cnVjdCByYWlkX3RlbXBsYXRlICopOworCit2b2lkIHJhaWRfY29tcG9uZW50X2FkZChzdHJ1Y3QgcmFpZF90ZW1wbGF0ZSAqLCBzdHJ1Y3QgZGV2aWNlICosCisJCQlzdHJ1Y3QgZGV2aWNlICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCmluZGV4IGZkMjc2YWQuLjRlNjVlYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKQEAgLTUyLDggKzUyLDggQEAKIAl2b2lkICgqZnVuYykoc3RydWN0IHJjdV9oZWFkICpoZWFkKTsKIH07CiAKLSNkZWZpbmUgUkNVX0hFQURfSU5JVChoZWFkKSB7IC5uZXh0ID0gTlVMTCwgLmZ1bmMgPSBOVUxMIH0KLSNkZWZpbmUgUkNVX0hFQUQoaGVhZCkgc3RydWN0IHJjdV9oZWFkIGhlYWQgPSBSQ1VfSEVBRF9JTklUKGhlYWQpCisjZGVmaW5lIFJDVV9IRUFEX0lOSVQgCXsgLm5leHQgPSBOVUxMLCAuZnVuYyA9IE5VTEwgfQorI2RlZmluZSBSQ1VfSEVBRChoZWFkKSBzdHJ1Y3QgcmN1X2hlYWQgaGVhZCA9IFJDVV9IRUFEX0lOSVQKICNkZWZpbmUgSU5JVF9SQ1VfSEVBRChwdHIpIGRvIHsgXAogICAgICAgIChwdHIpLT5uZXh0ID0gTlVMTDsgKHB0ciktPmZ1bmMgPSBOVUxMOyBcCiB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3VyZWYuaCBiL2luY2x1ZGUvbGludXgvcmN1cmVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhZGJiYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcmN1cmVmLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiByY3VyZWYuaAorICoKKyAqIFJlZmVyZW5jZSBjb3VudGluZyBmb3IgZWxlbWVudHMgb2YgbGlzdHMvYXJyYXlzIHByb3RlY3RlZCBieQorICogUkNVLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDUKKyAqCisgKiBBdXRob3I6IERpcGFua2FyIFNhcm1hIDxkaXBhbmthckBpbi5pYm0uY29tPgorICoJICAgUmF2aWtpcmFuIFRoaXJ1bWFsYWkgPGtpcmFuX3RoQGdtYWlsLmNvbT4KKyAqCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9SQ1UvcmN1cmVmLnR4dCBmb3IgZGV0YWlsZWQgdXNlciBndWlkZS4KKyAqCisgKi8KKworI2lmbmRlZiBfUkNVUkVGX0hfCisjZGVmaW5lIF9SQ1VSRUZfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKy8qCisgKiBUaGVzZSBBUElzIHdvcmsgb24gdHJhZGl0aW9uYWwgYXRvbWljX3QgY291bnRlcnMgdXNlZCBpbiB0aGUKKyAqIGtlcm5lbCBmb3IgcmVmZXJlbmNlIGNvdW50aW5nLiBVbmRlciBzcGVjaWFsIGNpcmN1bXN0YW5jZXMKKyAqIHdoZXJlIGEgbG9jay1mcmVlIGdldCgpIG9wZXJhdGlvbiByYWNlcyB3aXRoIGEgcHV0KCkgb3BlcmF0aW9uCisgKiB0aGVzZSBBUElzIGNhbiBiZSB1c2VkLiBTZWUgRG9jdW1lbnRhdGlvbi9SQ1UvcmN1cmVmLnR4dC4KKyAqLworCisjaWZkZWYgX19IQVZFX0FSQ0hfQ01QWENIRworCisvKioKKyAqIHJjdXJlZl9pbmMgLSBpbmNyZW1lbnQgcmVmY291bnQgZm9yIG9iamVjdC4KKyAqIEByY3VyZWY6IHJlZmVyZW5jZSBjb3VudGVyIGluIHRoZSBvYmplY3QgaW4gcXVlc3Rpb24uCisgKgorICogVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBvYmplY3RzIHdoZXJlIHdlIHVzZSBSQ1UgYW5kCisgKiB1c2UgdGhlIHJjdXJlZl9pbmNfbGYoKSBhcGkgdG8gYWNxdWlyZSBhIHJlZmVyZW5jZQorICogaW4gYSBsb2NrLWZyZWUgcmVhZGVyLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJjdXJlZl9pbmMoYXRvbWljX3QgKnJjdXJlZikKK3sKKwlhdG9taWNfaW5jKHJjdXJlZik7Cit9CisKKy8qKgorICogcmN1cmVmX2RlYyAtIGRlY3JlbWVudCByZWZjb3VudCBmb3Igb2JqZWN0LgorICogQHJjdXJlZjogcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIG9iamVjdCBpbiBxdWVzdGlvbi4KKyAqCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG9iamVjdHMgd2hlcmUgd2UgdXNlIFJDVSBhbmQKKyAqIHVzZSB0aGUgcmN1cmVmX2luY19sZigpIGFwaSB0byBhY3F1aXJlIGEgcmVmZXJlbmNlCisgKiBpbiBhIGxvY2stZnJlZSByZWFkZXItc2lkZSBjcml0aWNhbCBzZWN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmN1cmVmX2RlYyhhdG9taWNfdCAqcmN1cmVmKQoreworCWF0b21pY19kZWMocmN1cmVmKTsKK30KKworLyoqCisgKiByY3VyZWZfZGVjX2FuZF90ZXN0IC0gZGVjcmVtZW50IHJlZmNvdW50IGZvciBvYmplY3QgYW5kIHRlc3QKKyAqIEByY3VyZWY6IHJlZmVyZW5jZSBjb3VudGVyIGluIHRoZSBvYmplY3QuCisgKiBAcmVsZWFzZTogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGNsZWFuIHVwIHRoZSBvYmplY3QKKyAqCSAgICAgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBpcyByZWxlYXNlZC4KKyAqCSAgICAgVGhpcyBwb2ludGVyIGlzIHJlcXVpcmVkLgorICoKKyAqIERlY3JlbWVudCB0aGUgcmVmY291bnQsIGFuZCBpZiAwLCByZXR1cm4gMS4gRWxzZSByZXR1cm4gMC4KKyAqCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG9iamVjdHMgd2hlcmUgd2UgdXNlIFJDVSBhbmQKKyAqIHVzZSB0aGUgcmN1cmVmX2luY19sZigpIGFwaSB0byBhY3F1aXJlIGEgcmVmZXJlbmNlCisgKiBpbiBhIGxvY2stZnJlZSByZWFkZXItc2lkZSBjcml0aWNhbCBzZWN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIGludCByY3VyZWZfZGVjX2FuZF90ZXN0KGF0b21pY190ICpyY3VyZWYpCit7CisJcmV0dXJuIGF0b21pY19kZWNfYW5kX3Rlc3QocmN1cmVmKTsKK30KKworLyoKKyAqIGNtcHhjaGcgaXMgbmVlZGVkIG9uIFVQIHRvbywgaWYgZGVsZXRpb25zIHRvIHRoZSBsaXN0L2FycmF5IGNhbiBoYXBwZW4KKyAqIGluIGludGVycnVwdCBjb250ZXh0LgorICovCisKKy8qKgorICogcmN1cmVmX2luY19sZiAtIFRha2UgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBpbiBhIHJlYWQtc2lkZQorICogY3JpdGljYWwgc2VjdGlvbiBwcm90ZWN0ZWQgYnkgUkNVLgorICogQHJjdXJlZjogcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIG9iamVjdCBpbiBxdWVzdGlvbi4KKyAqCisgKiBUcnkgYW5kIGluY3JlbWVudCB0aGUgcmVmY291bnQgYnkgMS4gIFRoZSBpbmNyZW1lbnQgbWlnaHQgZmFpbCBpZgorICogdGhlIHJlZmVyZW5jZSBjb3VudGVyIGhhcyBiZWVuIHRocm91Z2ggYSAxIHRvIDAgdHJhbnNpdGlvbiBhbmQKKyAqIGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBsb2NrLWZyZWUgbGlzdC4KKyAqIFJldHVybnMgbm9uLXplcm8gb24gc3VjY2Vzc2Z1bCBpbmNyZW1lbnQgYW5kIHplcm8gb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGludCByY3VyZWZfaW5jX2xmKGF0b21pY190ICpyY3VyZWYpCit7CisJaW50IGMsIG9sZDsKKwljID0gYXRvbWljX3JlYWQocmN1cmVmKTsKKwl3aGlsZSAoYyAmJiAob2xkID0gY21weGNoZygmcmN1cmVmLT5jb3VudGVyLCBjLCBjICsgMSkpICE9IGMpCisJCWMgPSBvbGQ7CisJcmV0dXJuIGM7Cit9CisKKyNlbHNlCQkJCS8qICFfX0hBVkVfQVJDSF9DTVBYQ0hHICovCisKK2V4dGVybiBzcGlubG9ja190IF9fcmN1cmVmX2hhc2hbXTsKKworLyoKKyAqIFVzZSBhIGhhc2ggdGFibGUgb2YgbG9ja3MgdG8gcHJvdGVjdCB0aGUgcmVmZXJlbmNlIGNvdW50CisgKiBzaW5jZSBjbXB4Y2hnIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBhcmNoLgorICovCisjaWZkZWYJQ09ORklHX1NNUAorI2RlZmluZSBSQ1VSRUZfSEFTSF9TSVpFCTQKKyNkZWZpbmUgUkNVUkVGX0hBU0goaykgXAorCSgmX19yY3VyZWZfaGFzaFsoKCh1bnNpZ25lZCBsb25nKWspPj44KSAmIChSQ1VSRUZfSEFTSF9TSVpFLTEpXSkKKyNlbHNlCisjZGVmaW5lCVJDVVJFRl9IQVNIX1NJWkUJMQorI2RlZmluZSBSQ1VSRUZfSEFTSChrKSAJJl9fcmN1cmVmX2hhc2hbMF0KKyNlbmRpZgkJCQkvKiBDT05GSUdfU01QICovCisKKy8qKgorICogcmN1cmVmX2luYyAtIGluY3JlbWVudCByZWZjb3VudCBmb3Igb2JqZWN0LgorICogQHJjdXJlZjogcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIG9iamVjdCBpbiBxdWVzdGlvbi4KKyAqCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG9iamVjdHMgd2hlcmUgd2UgdXNlIFJDVSBhbmQKKyAqIHVzZSB0aGUgcmN1cmVmX2luY19sZigpIGFwaSB0byBhY3F1aXJlIGEgcmVmZXJlbmNlIGluIGEgbG9jay1mcmVlCisgKiByZWFkZXItc2lkZSBjcml0aWNhbCBzZWN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmN1cmVmX2luYyhhdG9taWNfdCAqcmN1cmVmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoUkNVUkVGX0hBU0gocmN1cmVmKSwgZmxhZ3MpOworCXJjdXJlZi0+Y291bnRlciArPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoUkNVUkVGX0hBU0gocmN1cmVmKSwgZmxhZ3MpOworfQorCisvKioKKyAqIHJjdXJlZl9kZWMgLSBkZWNyZW1lbnQgcmVmY291bnQgZm9yIG9iamVjdC4KKyAqIEByY3VyZWY6IHJlZmVyZW5jZSBjb3VudGVyIGluIHRoZSBvYmplY3QgaW4gcXVlc3Rpb24uCisgKgorICogVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBvYmplY3RzIHdoZXJlIHdlIHVzZSBSQ1UgYW5kCisgKiB1c2UgdGhlIHJjdXJlZl9pbmNfbGYoKSBhcGkgdG8gYWNxdWlyZSBhIHJlZmVyZW5jZSBpbiBhIGxvY2stZnJlZQorICogcmVhZGVyLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJjdXJlZl9kZWMoYXRvbWljX3QgKnJjdXJlZikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKFJDVVJFRl9IQVNIKHJjdXJlZiksIGZsYWdzKTsKKwlyY3VyZWYtPmNvdW50ZXIgLT0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKFJDVVJFRl9IQVNIKHJjdXJlZiksIGZsYWdzKTsKK30KKworLyoqCisgKiByY3VyZWZfZGVjX2FuZF90ZXN0IC0gZGVjcmVtZW50IHJlZmNvdW50IGZvciBvYmplY3QgYW5kIHRlc3QKKyAqIEByY3VyZWY6IHJlZmVyZW5jZSBjb3VudGVyIGluIHRoZSBvYmplY3QuCisgKiBAcmVsZWFzZTogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGNsZWFuIHVwIHRoZSBvYmplY3QKKyAqCSAgICAgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBpcyByZWxlYXNlZC4KKyAqCSAgICAgVGhpcyBwb2ludGVyIGlzIHJlcXVpcmVkLgorICoKKyAqIERlY3JlbWVudCB0aGUgcmVmY291bnQsIGFuZCBpZiAwLCByZXR1cm4gMS4gRWxzZSByZXR1cm4gMC4KKyAqCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG9iamVjdHMgd2hlcmUgd2UgdXNlIFJDVSBhbmQKKyAqIHVzZSB0aGUgcmN1cmVmX2luY19sZigpIGFwaSB0byBhY3F1aXJlIGEgcmVmZXJlbmNlIGluIGEgbG9jay1mcmVlCisgKiByZWFkZXItc2lkZSBjcml0aWNhbCBzZWN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIGludCByY3VyZWZfZGVjX2FuZF90ZXN0KGF0b21pY190ICpyY3VyZWYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZShSQ1VSRUZfSEFTSChyY3VyZWYpLCBmbGFncyk7CisJcmN1cmVmLT5jb3VudGVyLS07CisJaWYgKCFyY3VyZWYtPmNvdW50ZXIpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShSQ1VSRUZfSEFTSChyY3VyZWYpLCBmbGFncyk7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoUkNVUkVGX0hBU0gocmN1cmVmKSwgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKgorICogcmN1cmVmX2luY19sZiAtIFRha2UgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvZiBhIGxvY2stZnJlZSBjb2xsZWN0aW9uCisgKiBieSB0cmF2ZXJzaW5nIGEgbG9jay1mcmVlIGxpc3QvYXJyYXkuCisgKiBAcmN1cmVmOiByZWZlcmVuY2UgY291bnRlciBpbiB0aGUgb2JqZWN0IGluIHF1ZXN0aW9uLgorICoKKyAqIFRyeSBhbmQgaW5jcmVtZW50IHRoZSByZWZjb3VudCBieSAxLiAgVGhlIGluY3JlbWVudCBtaWdodCBmYWlsIGlmCisgKiB0aGUgcmVmZXJlbmNlIGNvdW50ZXIgaGFzIGJlZW4gdGhyb3VnaCBhIDEgdG8gMCB0cmFuc2l0aW9uIGFuZAorICogb2JqZWN0IGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBsb2NrLWZyZWUgbGlzdC4KKyAqIFJldHVybnMgbm9uLXplcm8gb24gc3VjY2Vzc2Z1bCBpbmNyZW1lbnQgYW5kIHplcm8gb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGludCByY3VyZWZfaW5jX2xmKGF0b21pY190ICpyY3VyZWYpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKFJDVVJFRl9IQVNIKHJjdXJlZiksIGZsYWdzKTsKKwlpZiAocmN1cmVmLT5jb3VudGVyKQorCQlyZXQgPSByY3VyZWYtPmNvdW50ZXIrKzsKKwllbHNlCisJCXJldCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShSQ1VSRUZfSEFTSChyY3VyZWYpLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworCisjZW5kaWYgLyogIV9fSEFWRV9BUkNIX0NNUFhDSEcgKi8KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfUkNVUkVGX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKaW5kZXggMTdlNDU4ZS4uYWYwMGIxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaApAQCAtMjA5Nyw3ICsyMDk3LDcgQEAKIAkJCSBiX2Jsb2NrbnJfdCwgaW50IGZvcl91bmZvcm1hdHRlZCk7CiBpbnQgcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiwgYl9ibG9ja25yX3QgKiwgaW50LAogCQkJICAgICAgIGludCk7Ci1leHRlcm4gaW5saW5lIGludCByZWlzZXJmc19uZXdfZm9ybV9ibG9ja25ycyhzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX25ld19mb3JtX2Jsb2NrbnJzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAogCQkJCQkgICAgIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAogCQkJCQkgICAgIGludCBhbW91bnRfbmVlZGVkKQogewpAQCAtMjExMyw3ICsyMTEzLDcgQEAKIAkJCQkJICAwKTsKIH0KIAotZXh0ZXJuIGlubGluZSBpbnQgcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25ycyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlCitzdGF0aWMgaW5saW5lIGludCByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUKIAkJCQkJICAgICp0aCwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAogCQkJCQkgICAgc3RydWN0IHBhdGggKnBhdGgsIGxvbmcgYmxvY2spCkBAIC0yMTMwLDcgKzIxMzAsNyBAQAogfQogCiAjaWZkZWYgUkVJU0VSRlNfUFJFQUxMT0NBVEUKLWV4dGVybiBpbmxpbmUgaW50IHJlaXNlcmZzX25ld191bmZfYmxvY2tucnMyKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX25ld191bmZfYmxvY2tucnMyKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUKIAkJCQkJICAgICAqdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSAgICAgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCiAJCQkJCSAgICAgc3RydWN0IHBhdGggKnBhdGgsIGxvbmcgYmxvY2spCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlbGF5ZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvcmVsYXlmc19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYWZjM2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3JlbGF5ZnNfZnMuaApAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvcmVsYXlmc19mcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIC0gVG9tIFphbnVzc2kgKHphbnVzc2lAdXMuaWJtLmNvbSksIElCTSBDb3JwCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgLSBLYXJpbSBZYWdobW91ciAoa2FyaW1Ab3BlcnN5cy5jb20pCisgKgorICogUmVsYXlGUyBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zCisgKi8KKworI2lmbmRlZiBfTElOVVhfUkVMQVlGU19GU19ICisjZGVmaW5lIF9MSU5VWF9SRUxBWUZTX0ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKworLyoKKyAqIFRyYWNrcyBjaGFuZ2VzIHRvIHJjaGFuX2J1ZiBzdHJ1Y3QKKyAqLworI2RlZmluZSBSRUxBWUZTX0NIQU5ORUxfVkVSU0lPTgkJNQorCisvKgorICogUGVyLWNwdSByZWxheSBjaGFubmVsIGJ1ZmZlcgorICovCitzdHJ1Y3QgcmNoYW5fYnVmCit7CisJdm9pZCAqc3RhcnQ7CQkJLyogc3RhcnQgb2YgY2hhbm5lbCBidWZmZXIgKi8KKwl2b2lkICpkYXRhOwkJCS8qIHN0YXJ0IG9mIGN1cnJlbnQgc3ViLWJ1ZmZlciAqLworCXNpemVfdCBvZmZzZXQ7CQkJLyogY3VycmVudCBvZmZzZXQgaW50byBzdWItYnVmZmVyICovCisJc2l6ZV90IHN1YmJ1ZnNfcHJvZHVjZWQ7CS8qIGNvdW50IG9mIHN1Yi1idWZmZXJzIHByb2R1Y2VkICovCisJc2l6ZV90IHN1YmJ1ZnNfY29uc3VtZWQ7CS8qIGNvdW50IG9mIHN1Yi1idWZmZXJzIGNvbnN1bWVkICovCisJc3RydWN0IHJjaGFuICpjaGFuOwkJLyogYXNzb2NpYXRlZCBjaGFubmVsICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OwkvKiByZWFkZXIgd2FpdCBxdWV1ZSAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCB3YWtlX3JlYWRlcnM7IC8qIHJlYWRlciB3YWtlLXVwIHdvcmsgc3RydWN0ICovCisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwkJLyogY2hhbm5lbCBmaWxlIGRlbnRyeSAqLworCXN0cnVjdCBrcmVmIGtyZWY7CQkvKiBjaGFubmVsIGJ1ZmZlciByZWZjb3VudCAqLworCXN0cnVjdCBwYWdlICoqcGFnZV9hcnJheTsJLyogYXJyYXkgb2YgY3VycmVudCBidWZmZXIgcGFnZXMgKi8KKwl1bnNpZ25lZCBpbnQgcGFnZV9jb3VudDsJLyogbnVtYmVyIG9mIGN1cnJlbnQgYnVmZmVyIHBhZ2VzICovCisJdW5zaWduZWQgaW50IGZpbmFsaXplZDsJCS8qIGJ1ZmZlciBoYXMgYmVlbiBmaW5hbGl6ZWQgKi8KKwlzaXplX3QgKnBhZGRpbmc7CQkvKiBwYWRkaW5nIGNvdW50cyBwZXIgc3ViLWJ1ZmZlciAqLworCXNpemVfdCBwcmV2X3BhZGRpbmc7CQkvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KKwlzaXplX3QgYnl0ZXNfY29uc3VtZWQ7CQkvKiBieXRlcyBjb25zdW1lZCBpbiBjdXIgcmVhZCBzdWJidWYgKi8KKwl1bnNpZ25lZCBpbnQgY3B1OwkJLyogdGhpcyBidWYncyBjcHUgKi8KK30gX19fX2NhY2hlbGluZV9hbGlnbmVkOworCisvKgorICogUmVsYXkgY2hhbm5lbCBkYXRhIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgcmNoYW4KK3sKKwl1MzIgdmVyc2lvbjsJCQkvKiB0aGUgdmVyc2lvbiBvZiB0aGlzIHN0cnVjdCAqLworCXNpemVfdCBzdWJidWZfc2l6ZTsJCS8qIHN1Yi1idWZmZXIgc2l6ZSAqLworCXNpemVfdCBuX3N1YmJ1ZnM7CQkvKiBudW1iZXIgb2Ygc3ViLWJ1ZmZlcnMgcGVyIGJ1ZmZlciAqLworCXNpemVfdCBhbGxvY19zaXplOwkJLyogdG90YWwgYnVmZmVyIHNpemUgYWxsb2NhdGVkICovCisJc3RydWN0IHJjaGFuX2NhbGxiYWNrcyAqY2I7CS8qIGNsaWVudCBjYWxsYmFja3MgKi8KKwlzdHJ1Y3Qga3JlZiBrcmVmOwkJLyogY2hhbm5lbCByZWZjb3VudCAqLworCXZvaWQgKnByaXZhdGVfZGF0YTsJCS8qIGZvciB1c2VyLWRlZmluZWQgZGF0YSAqLworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZltOUl9DUFVTXTsgLyogcGVyLWNwdSBjaGFubmVsIGJ1ZmZlcnMgKi8KK307CisKKy8qCisgKiBSZWxheWZzIGlub2RlCisgKi8KK3N0cnVjdCByZWxheWZzX2lub2RlX2luZm8KK3sKKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlbGF5ZnNfaW5vZGVfaW5mbyAqUkVMQVlGU19JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IHJlbGF5ZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KKworLyoKKyAqIFJlbGF5IGNoYW5uZWwgY2xpZW50IGNhbGxiYWNrcworICovCitzdHJ1Y3QgcmNoYW5fY2FsbGJhY2tzCit7CisJLyoKKwkgKiBzdWJidWZfc3RhcnQgLSBjYWxsZWQgb24gYnVmZmVyLXN3aXRjaCB0byBhIG5ldyBzdWItYnVmZmVyCisJICogQGJ1ZjogdGhlIGNoYW5uZWwgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG5ldyBzdWItYnVmZmVyCisJICogQHN1YmJ1ZjogdGhlIHN0YXJ0IG9mIHRoZSBuZXcgc3ViLWJ1ZmZlcgorCSAqIEBwcmV2X3N1YmJ1ZjogdGhlIHN0YXJ0IG9mIHRoZSBwcmV2aW91cyBzdWItYnVmZmVyCisJICogQHByZXZfcGFkZGluZzogdW51c2VkIHNwYWNlIGF0IHRoZSBlbmQgb2YgcHJldmlvdXMgc3ViLWJ1ZmZlcgorCSAqCisJICogVGhlIGNsaWVudCBzaG91bGQgcmV0dXJuIDEgdG8gY29udGludWUgbG9nZ2luZywgMCB0byBzdG9wCisJICogbG9nZ2luZy4KKwkgKgorCSAqIE5PVEU6IHN1YmJ1Zl9zdGFydCB3aWxsIGFsc28gYmUgaW52b2tlZCB3aGVuIHRoZSBidWZmZXIgaXMKKwkgKiAgICAgICBjcmVhdGVkLCBzbyB0aGF0IHRoZSBmaXJzdCBzdWItYnVmZmVyIGNhbiBiZSBpbml0aWFsaXplZAorCSAqICAgICAgIGlmIG5lY2Vzc2FyeS4gIEluIHRoaXMgY2FzZSwgcHJldl9zdWJidWYgd2lsbCBiZSBOVUxMLgorCSAqCisJICogTk9URTogdGhlIGNsaWVudCBjYW4gcmVzZXJ2ZSBieXRlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcKKwkgKiAgICAgICBzdWItYnVmZmVyIGJ5IGNhbGxpbmcgc3ViYnVmX3N0YXJ0X3Jlc2VydmUoKSBpbiB0aGlzIGNhbGxiYWNrLgorCSAqLworCWludCAoKnN1YmJ1Zl9zdGFydCkgKHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKKwkJCSAgICAgdm9pZCAqc3ViYnVmLAorCQkJICAgICB2b2lkICpwcmV2X3N1YmJ1ZiwKKwkJCSAgICAgc2l6ZV90IHByZXZfcGFkZGluZyk7CisKKwkvKgorCSAqIGJ1Zl9tYXBwZWQgLSByZWxheWZzIGJ1ZmZlciBtbWFwIG5vdGlmaWNhdGlvbgorCSAqIEBidWY6IHRoZSBjaGFubmVsIGJ1ZmZlcgorCSAqIEBmaWxwOiByZWxheWZzIGZpbGUgcG9pbnRlcgorCSAqCisJICogQ2FsbGVkIHdoZW4gYSByZWxheWZzIGZpbGUgaXMgc3VjY2Vzc2Z1bGx5IG1tYXBwZWQKKwkgKi8KKyAgICAgICAgdm9pZCAoKmJ1Zl9tYXBwZWQpKHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKKwkJCSAgIHN0cnVjdCBmaWxlICpmaWxwKTsKKworCS8qCisJICogYnVmX3VubWFwcGVkIC0gcmVsYXlmcyBidWZmZXIgdW5tYXAgbm90aWZpY2F0aW9uCisJICogQGJ1ZjogdGhlIGNoYW5uZWwgYnVmZmVyCisJICogQGZpbHA6IHJlbGF5ZnMgZmlsZSBwb2ludGVyCisJICoKKwkgKiBDYWxsZWQgd2hlbiBhIHJlbGF5ZnMgZmlsZSBpcyBzdWNjZXNzZnVsbHkgdW5tYXBwZWQKKwkgKi8KKyAgICAgICAgdm9pZCAoKmJ1Zl91bm1hcHBlZCkoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLAorCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlscCk7Cit9OworCisvKgorICogcmVsYXlmcyBrZXJuZWwgQVBJLCBmcy9yZWxheWZzL3JlbGF5LmMKKyAqLworCitzdHJ1Y3QgcmNoYW4gKnJlbGF5X29wZW4oY29uc3QgY2hhciAqYmFzZV9maWxlbmFtZSwKKwkJCSBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCisJCQkgc2l6ZV90IHN1YmJ1Zl9zaXplLAorCQkJIHNpemVfdCBuX3N1YmJ1ZnMsCisJCQkgc3RydWN0IHJjaGFuX2NhbGxiYWNrcyAqY2IpOworZXh0ZXJuIHZvaWQgcmVsYXlfY2xvc2Uoc3RydWN0IHJjaGFuICpjaGFuKTsKK2V4dGVybiB2b2lkIHJlbGF5X2ZsdXNoKHN0cnVjdCByY2hhbiAqY2hhbik7CitleHRlcm4gdm9pZCByZWxheV9zdWJidWZzX2NvbnN1bWVkKHN0cnVjdCByY2hhbiAqY2hhbiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgY3B1LAorCQkJCSAgIHNpemVfdCBjb25zdW1lZCk7CitleHRlcm4gdm9pZCByZWxheV9yZXNldChzdHJ1Y3QgcmNoYW4gKmNoYW4pOworZXh0ZXJuIGludCByZWxheV9idWZfZnVsbChzdHJ1Y3QgcmNoYW5fYnVmICpidWYpOworCitleHRlcm4gc2l6ZV90IHJlbGF5X3N3aXRjaF9zdWJidWYoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLAorCQkJCSAgc2l6ZV90IGxlbmd0aCk7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqcmVsYXlmc19jcmVhdGVfZGlyKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpOworZXh0ZXJuIGludCByZWxheWZzX3JlbW92ZV9kaXIoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKKworLyoqCisgKglyZWxheV93cml0ZSAtIHdyaXRlIGRhdGEgaW50byB0aGUgY2hhbm5lbAorICoJQGNoYW46IHJlbGF5IGNoYW5uZWwKKyAqCUBkYXRhOiBkYXRhIHRvIGJlIHdyaXR0ZW4KKyAqCUBsZW5ndGg6IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICoKKyAqCVdyaXRlcyBkYXRhIGludG8gdGhlIGN1cnJlbnQgY3B1J3MgY2hhbm5lbCBidWZmZXIuCisgKgorICoJUHJvdGVjdHMgdGhlIGJ1ZmZlciBieSBkaXNhYmxpbmcgaW50ZXJydXB0cy4gIFVzZSB0aGlzCisgKglpZiB5b3UgbWlnaHQgYmUgbG9nZ2luZyBmcm9tIGludGVycnVwdCBjb250ZXh0LiAgVHJ5CisgKglfX3JlbGF5X3dyaXRlKCkgaWYgeW91IGtub3cgeW91CXdvbid0IGJlIGxvZ2dpbmcgZnJvbQorICoJaW50ZXJydXB0IGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZWxheV93cml0ZShzdHJ1Y3QgcmNoYW4gKmNoYW4sCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgICBzaXplX3QgbGVuZ3RoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWJ1ZiA9IGNoYW4tPmJ1ZltzbXBfcHJvY2Vzc29yX2lkKCldOworCWlmICh1bmxpa2VseShidWYtPm9mZnNldCArIGxlbmd0aCA+IGNoYW4tPnN1YmJ1Zl9zaXplKSkKKwkJbGVuZ3RoID0gcmVsYXlfc3dpdGNoX3N1YmJ1ZihidWYsIGxlbmd0aCk7CisJbWVtY3B5KGJ1Zi0+ZGF0YSArIGJ1Zi0+b2Zmc2V0LCBkYXRhLCBsZW5ndGgpOworCWJ1Zi0+b2Zmc2V0ICs9IGxlbmd0aDsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qKgorICoJX19yZWxheV93cml0ZSAtIHdyaXRlIGRhdGEgaW50byB0aGUgY2hhbm5lbAorICoJQGNoYW46IHJlbGF5IGNoYW5uZWwKKyAqCUBkYXRhOiBkYXRhIHRvIGJlIHdyaXR0ZW4KKyAqCUBsZW5ndGg6IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICoKKyAqCVdyaXRlcyBkYXRhIGludG8gdGhlIGN1cnJlbnQgY3B1J3MgY2hhbm5lbCBidWZmZXIuCisgKgorICoJUHJvdGVjdHMgdGhlIGJ1ZmZlciBieSBkaXNhYmxpbmcgcHJlZW1wdGlvbi4gIFVzZQorICoJcmVsYXlfd3JpdGUoKSBpZiB5b3UgbWlnaHQgYmUgbG9nZ2luZyBmcm9tIGludGVycnVwdAorICoJY29udGV4dC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fcmVsYXlfd3JpdGUoc3RydWN0IHJjaGFuICpjaGFuLAorCQkJCSBjb25zdCB2b2lkICpkYXRhLAorCQkJCSBzaXplX3QgbGVuZ3RoKQoreworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKKworCWJ1ZiA9IGNoYW4tPmJ1ZltnZXRfY3B1KCldOworCWlmICh1bmxpa2VseShidWYtPm9mZnNldCArIGxlbmd0aCA+IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemUpKQorCQlsZW5ndGggPSByZWxheV9zd2l0Y2hfc3ViYnVmKGJ1ZiwgbGVuZ3RoKTsKKwltZW1jcHkoYnVmLT5kYXRhICsgYnVmLT5vZmZzZXQsIGRhdGEsIGxlbmd0aCk7CisJYnVmLT5vZmZzZXQgKz0gbGVuZ3RoOworCXB1dF9jcHUoKTsKK30KKworLyoqCisgKglyZWxheV9yZXNlcnZlIC0gcmVzZXJ2ZSBzbG90IGluIGNoYW5uZWwgYnVmZmVyCisgKglAY2hhbjogcmVsYXkgY2hhbm5lbAorICoJQGxlbmd0aDogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlc2VydmUKKyAqCisgKglSZXR1cm5zIHBvaW50ZXIgdG8gcmVzZXJ2ZWQgc2xvdCwgTlVMTCBpZiBmdWxsLgorICoKKyAqCVJlc2VydmVzIGEgc2xvdCBpbiB0aGUgY3VycmVudCBjcHUncyBjaGFubmVsIGJ1ZmZlci4KKyAqCURvZXMgbm90IHByb3RlY3QgdGhlIGJ1ZmZlciBhdCBhbGwgLSBjYWxsZXIgbXVzdCBwcm92aWRlCisgKglhcHByb3ByaWF0ZSBzeW5jaHJvbml6YXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqcmVsYXlfcmVzZXJ2ZShzdHJ1Y3QgcmNoYW4gKmNoYW4sIHNpemVfdCBsZW5ndGgpCit7CisJdm9pZCAqcmVzZXJ2ZWQ7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gY2hhbi0+YnVmW3NtcF9wcm9jZXNzb3JfaWQoKV07CisKKwlpZiAodW5saWtlbHkoYnVmLT5vZmZzZXQgKyBsZW5ndGggPiBidWYtPmNoYW4tPnN1YmJ1Zl9zaXplKSkgeworCQlsZW5ndGggPSByZWxheV9zd2l0Y2hfc3ViYnVmKGJ1ZiwgbGVuZ3RoKTsKKwkJaWYgKCFsZW5ndGgpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmVzZXJ2ZWQgPSBidWYtPmRhdGEgKyBidWYtPm9mZnNldDsKKwlidWYtPm9mZnNldCArPSBsZW5ndGg7CisKKwlyZXR1cm4gcmVzZXJ2ZWQ7Cit9CisKKy8qKgorICoJc3ViYnVmX3N0YXJ0X3Jlc2VydmUgLSByZXNlcnZlIGJ5dGVzIGF0IHRoZSBzdGFydCBvZiBhIHN1Yi1idWZmZXIKKyAqCUBidWY6IHJlbGF5IGNoYW5uZWwgYnVmZmVyCisgKglAbGVuZ3RoOiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVzZXJ2ZQorICoKKyAqCUhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIHJlc2VydmUgYnl0ZXMgYXQgdGhlIGJlZ2lubmluZyBvZgorICoJYSBzdWItYnVmZmVyIGluIHRoZSBzdWJidWZfc3RhcnQoKSBjYWxsYmFjay4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHN1YmJ1Zl9zdGFydF9yZXNlcnZlKHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbmd0aCkKK3sKKwlCVUdfT04obGVuZ3RoID49IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemUgLSAxKTsKKwlidWYtPm9mZnNldCA9IGxlbmd0aDsKK30KKworLyoKKyAqIGV4cG9ydGVkIHJlbGF5ZnMgZmlsZSBvcGVyYXRpb25zLCBmcy9yZWxheWZzL2lub2RlLmMKKyAqLworCitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWxheWZzX2ZpbGVfb3BlcmF0aW9uczsKKworI2VuZGlmIC8qIF9MSU5VWF9SRUxBWUZTX0ZTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IGRlYzU4MjcuLmVkM2JiMTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTM1LDYgKzM1LDggQEAKICNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY2NvbXAuaD4KIAorI2luY2x1ZGUgPGxpbnV4L2F1eHZlYy5oPgkvKiBGb3IgQVRfVkVDVE9SX1NJWkUgKi8KKwogc3RydWN0IGV4ZWNfZG9tYWluOwogCiAvKgpAQCAtMTEyLDYgKzExNCw3IEBACiAjZGVmaW5lIFRBU0tfVFJBQ0VECQk4CiAjZGVmaW5lIEVYSVRfWk9NQklFCQkxNgogI2RlZmluZSBFWElUX0RFQUQJCTMyCisjZGVmaW5lIFRBU0tfTk9OSU5URVJBQ1RJVkUJNjQKIAogI2RlZmluZSBfX3NldF90YXNrX3N0YXRlKHRzaywgc3RhdGVfdmFsdWUpCQlcCiAJZG8geyAodHNrKS0+c3RhdGUgPSAoc3RhdGVfdmFsdWUpOyB9IHdoaWxlICgwKQpAQCAtMTc2LDYgKzE3OSwyMyBAQAogZXh0ZXJuIHZvaWQgdXBkYXRlX3Byb2Nlc3NfdGltZXMoaW50IHVzZXIpOwogZXh0ZXJuIHZvaWQgc2NoZWR1bGVyX3RpY2sodm9pZCk7CiAKKyNpZmRlZiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAKK2V4dGVybiB2b2lkIHNvZnRsb2NrdXBfdGljayhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCBzcGF3bl9zb2Z0bG9ja3VwX3Rhc2sodm9pZCk7CitleHRlcm4gdm9pZCB0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb2Z0bG9ja3VwX3RpY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc3Bhd25fc29mdGxvY2t1cF90YXNrKHZvaWQpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZyh2b2lkKQoreworfQorI2VuZGlmCisKKwogLyogQXR0YWNoIHRvIGFueSBmdW5jdGlvbnMgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQgaW4gd2NoYW4gb3V0cHV0LiAqLwogI2RlZmluZSBfX3NjaGVkCQlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLnNjaGVkLnRleHQiKSkpCiAvKiBJcyB0aGlzIGFkZHJlc3MgaW4gdGhlIF9fc2NoZWQgZnVuY3Rpb25zPyAqLwpAQCAtMTgzLDYgKzIwMyw4IEBACiAKICNkZWZpbmUJTUFYX1NDSEVEVUxFX1RJTUVPVVQJTE9OR19NQVgKIGV4dGVybiBzaWduZWQgbG9uZyBGQVNUQ0FMTChzY2hlZHVsZV90aW1lb3V0KHNpZ25lZCBsb25nIHRpbWVvdXQpKTsKK2V4dGVybiBzaWduZWQgbG9uZyBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc2lnbmVkIGxvbmcgdGltZW91dCk7CitleHRlcm4gc2lnbmVkIGxvbmcgc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoc2lnbmVkIGxvbmcgdGltZW91dCk7CiBhc21saW5rYWdlIHZvaWQgc2NoZWR1bGUodm9pZCk7CiAKIHN0cnVjdCBuYW1lc3BhY2U7CkBAIC0yNDQsNyArMjY2LDcgQEAKIAltbV9jb3VudGVyX3QgX3JzczsKIAltbV9jb3VudGVyX3QgX2Fub25fcnNzOwogCi0JdW5zaWduZWQgbG9uZyBzYXZlZF9hdXh2WzQyXTsgLyogZm9yIC9wcm9jL1BJRC9hdXh2ICovCisJdW5zaWduZWQgbG9uZyBzYXZlZF9hdXh2W0FUX1ZFQ1RPUl9TSVpFXTsgLyogZm9yIC9wcm9jL1BJRC9hdXh2ICovCiAKIAl1bnNpZ25lZCBkdW1wYWJsZToyOwogCWNwdW1hc2tfdCBjcHVfdm1fbWFzazsKQEAgLTU0NSwxMyArNTY3LDYgQEAKIAogZXh0ZXJuIHZvaWQgcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoY3B1bWFza190ICpwYXJ0aXRpb24xLAogCQkJCSAgICBjcHVtYXNrX3QgKnBhcnRpdGlvbjIpOwotI2lmZGVmIEFSQ0hfSEFTX1NDSEVEX0RPTUFJTgotLyogVXNlZnVsIGhlbHBlcnMgdGhhdCBhcmNoIHNldHVwIGNvZGUgbWF5IHVzZS4gRGVmaW5lZCBpbiBrZXJuZWwvc2NoZWQuYyAqLwotZXh0ZXJuIGNwdW1hc2tfdCBjcHVfaXNvbGF0ZWRfbWFwOwotZXh0ZXJuIHZvaWQgaW5pdF9zY2hlZF9idWlsZF9ncm91cHMoc3RydWN0IHNjaGVkX2dyb3VwIGdyb3Vwc1tdLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGNwdW1hc2tfdCBzcGFuLCBpbnQgKCpncm91cF9mbikoaW50IGNwdSkpOwotZXh0ZXJuIHZvaWQgY3B1X2F0dGFjaF9kb21haW4oc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpOwotI2VuZGlmIC8qIEFSQ0hfSEFTX1NDSEVEX0RPTUFJTiAqLwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogCkBAIC01OTIsNiArNjA3LDExIEBACiAjZGVmaW5lIEdST1VQX0FUKGdpLCBpKSBcCiAgICAgKChnaSktPmJsb2Nrc1soaSkvTkdST1VQU19QRVJfQkxPQ0tdWyhpKSVOR1JPVVBTX1BFUl9CTE9DS10pCiAKKyNpZmRlZiBBUkNIX0hBU19QUkVGRVRDSF9TV0lUQ0hfU1RBQ0sKK2V4dGVybiB2b2lkIHByZWZldGNoX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCopOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVmZXRjaF9zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpIHsgfQorI2VuZGlmCiAKIHN0cnVjdCBhdWRpdF9jb250ZXh0OwkJLyogU2VlIGF1ZGl0LmMgKi8KIHN0cnVjdCBtZW1wb2xpY3k7CkBAIC03NjUsNiArNzg1LDcgQEAKIAlzaG9ydCBpbF9uZXh0OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NQVVNFVFMKKwlzaG9ydCBjcHVzZXRfc2VtX25lc3RfZGVwdGg7CiAJc3RydWN0IGNwdXNldCAqY3B1c2V0OwogCW5vZGVtYXNrX3QgbWVtc19hbGxvd2VkOwogCWludCBjcHVzZXRfbWVtc19nZW5lcmF0aW9uOwpAQCAtODgzLDYgKzkwNCw4IEBACiBleHRlcm4gaW50IGlkbGVfY3B1KGludCBjcHUpOwogZXh0ZXJuIGludCBzY2hlZF9zZXRzY2hlZHVsZXIoc3RydWN0IHRhc2tfc3RydWN0ICosIGludCwgc3RydWN0IHNjaGVkX3BhcmFtICopOwogZXh0ZXJuIHRhc2tfdCAqaWRsZV90YXNrKGludCBjcHUpOworZXh0ZXJuIHRhc2tfdCAqY3Vycl90YXNrKGludCBjcHUpOworZXh0ZXJuIHZvaWQgc2V0X2N1cnJfdGFzayhpbnQgY3B1LCB0YXNrX3QgKnApOwogCiB2b2lkIHlpZWxkKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmggYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKaW5kZXggN2FhYjZhYi4uNTViMDJlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaApAQCAtMjUwLDI5ICsyNTAsMzcgQEAKICAqCUBpbm9kZSBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlLgogICoJRGVhbGxvY2F0ZSB0aGUgaW5vZGUgc2VjdXJpdHkgc3RydWN0dXJlIGFuZCBzZXQgQGlub2RlLT5pX3NlY3VyaXR5IHRvCiAgKglOVUxMLiAKKyAqIEBpbm9kZV9pbml0X3NlY3VyaXR5OgorICogCU9idGFpbiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlIG5hbWUgc3VmZml4IGFuZCB2YWx1ZSB0byBzZXQgb24gYSBuZXdseQorICoJY3JlYXRlZCBpbm9kZSBhbmQgc2V0IHVwIHRoZSBpbmNvcmUgc2VjdXJpdHkgZmllbGQgZm9yIHRoZSBuZXcgaW5vZGUuCisgKglUaGlzIGhvb2sgaXMgY2FsbGVkIGJ5IHRoZSBmcyBjb2RlIGFzIHBhcnQgb2YgdGhlIGlub2RlIGNyZWF0aW9uCisgKgl0cmFuc2FjdGlvbiBhbmQgcHJvdmlkZXMgZm9yIGF0b21pYyBsYWJlbGluZyBvZiB0aGUgaW5vZGUsIHVubGlrZQorICoJdGhlIHBvc3RfY3JlYXRlL21rZGlyLy4uLiBob29rcyBjYWxsZWQgYnkgdGhlIFZGUy4gIFRoZSBob29rIGZ1bmN0aW9uCisgKglpcyBleHBlY3RlZCB0byBhbGxvY2F0ZSB0aGUgbmFtZSBhbmQgdmFsdWUgdmlhIGttYWxsb2MsIHdpdGggdGhlIGNhbGxlcgorICoJYmVpbmcgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcga2ZyZWUgYWZ0ZXIgdXNpbmcgdGhlbS4KKyAqCUlmIHRoZSBzZWN1cml0eSBtb2R1bGUgZG9lcyBub3QgdXNlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgb3IgZG9lcworICoJbm90IHdpc2ggdG8gcHV0IGEgc2VjdXJpdHkgYXR0cmlidXRlIG9uIHRoaXMgcGFydGljdWxhciBpbm9kZSwKKyAqCXRoZW4gaXQgc2hvdWxkIHJldHVybiAtRU9QTk9UU1VQUCB0byBza2lwIHRoaXMgcHJvY2Vzc2luZy4KKyAqCUBpbm9kZSBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIG9mIHRoZSBuZXdseSBjcmVhdGVkIGlub2RlLgorICoJQGRpciBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgorICoJQG5hbWUgd2lsbCBiZSBzZXQgdG8gdGhlIGFsbG9jYXRlZCBuYW1lIHN1ZmZpeCAoZS5nLiBzZWxpbnV4KS4KKyAqCUB2YWx1ZSB3aWxsIGJlIHNldCB0byB0aGUgYWxsb2NhdGVkIGF0dHJpYnV0ZSB2YWx1ZS4KKyAqCUBsZW4gd2lsbCBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUuCisgKglSZXR1cm5zIDAgaWYgQG5hbWUgYW5kIEB2YWx1ZSBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwKKyAqCQktRU9QTk9UU1VQUCBpZiBubyBzZWN1cml0eSBhdHRyaWJ1dGUgaXMgbmVlZGVkLCBvcgorICoJCS1FTk9NRU0gb24gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4KICAqIEBpbm9kZV9jcmVhdGU6CiAgKglDaGVjayBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHJlZ3VsYXIgZmlsZS4KICAqCUBkaXIgY29udGFpbnMgaW5vZGUgc3RydWN0dXJlIG9mIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBmaWxlLgogICoJQGRlbnRyeSBjb250YWlucyB0aGUgZGVudHJ5IHN0cnVjdHVyZSBmb3IgdGhlIGZpbGUgdG8gYmUgY3JlYXRlZC4KICAqCUBtb2RlIGNvbnRhaW5zIHRoZSBmaWxlIG1vZGUgb2YgdGhlIGZpbGUgdG8gYmUgY3JlYXRlZC4KICAqCVJldHVybiAwIGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZC4KLSAqIEBpbm9kZV9wb3N0X2NyZWF0ZToKLSAqCVNldCB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcyBvbiBhIG5ld2x5IGNyZWF0ZWQgcmVndWxhciBmaWxlLiAgVGhpcyBob29rCi0gKglpcyBjYWxsZWQgYWZ0ZXIgYSBmaWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLgotICoJQGRpciBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBuZXcgZmlsZS4KLSAqCUBkZW50cnkgY29udGFpbnMgdGhlIHRoZSBkZW50cnkgc3RydWN0dXJlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBmaWxlLgotICoJQG1vZGUgY29udGFpbnMgdGhlIGZpbGUgbW9kZS4KICAqIEBpbm9kZV9saW5rOgogICoJQ2hlY2sgcGVybWlzc2lvbiBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgaGFyZCBsaW5rIHRvIGEgZmlsZS4KICAqCUBvbGRfZGVudHJ5IGNvbnRhaW5zIHRoZSBkZW50cnkgc3RydWN0dXJlIGZvciBhbiBleGlzdGluZyBsaW5rIHRvIHRoZSBmaWxlLgogICoJQGRpciBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBuZXcgbGluay4KICAqCUBuZXdfZGVudHJ5IGNvbnRhaW5zIHRoZSBkZW50cnkgc3RydWN0dXJlIGZvciB0aGUgbmV3IGxpbmsuCiAgKglSZXR1cm4gMCBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQuCi0gKiBAaW5vZGVfcG9zdF9saW5rOgotICoJU2V0IHNlY3VyaXR5IGF0dHJpYnV0ZXMgZm9yIGEgbmV3IGhhcmQgbGluayB0byBhIGZpbGUuCi0gKglAb2xkX2RlbnRyeSBjb250YWlucyB0aGUgZGVudHJ5IHN0cnVjdHVyZSBmb3IgdGhlIGV4aXN0aW5nIGxpbmsuCi0gKglAZGlyIGNvbnRhaW5zIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgb2YgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIG5ldyBmaWxlLgotICoJQG5ld19kZW50cnkgY29udGFpbnMgdGhlIGRlbnRyeSBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXcgZmlsZSBsaW5rLgogICogQGlub2RlX3VubGluazoKICAqCUNoZWNrIHRoZSBwZXJtaXNzaW9uIHRvIHJlbW92ZSBhIGhhcmQgbGluayB0byBhIGZpbGUuIAogICoJQGRpciBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIG9mIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGZpbGUuCkBAIC0yODQsMTMgKzI5Miw2IEBACiAgKglAZGVudHJ5IGNvbnRhaW5zIHRoZSBkZW50cnkgc3RydWN0dXJlIG9mIHRoZSBzeW1ib2xpYyBsaW5rLgogICoJQG9sZF9uYW1lIGNvbnRhaW5zIHRoZSBwYXRobmFtZSBvZiBmaWxlLgogICoJUmV0dXJuIDAgaWYgcGVybWlzc2lvbiBpcyBncmFudGVkLgotICogQGlub2RlX3Bvc3Rfc3ltbGluazoKLSAqCUBkaXIgY29udGFpbnMgdGhlIGlub2RlIHN0cnVjdHVyZSBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgbmV3IGxpbmsuCi0gKglAZGVudHJ5IGNvbnRhaW5zIHRoZSBkZW50cnkgc3RydWN0dXJlIG9mIG5ldyBzeW1ib2xpYyBsaW5rLgotICoJQG9sZF9uYW1lIGNvbnRhaW5zIHRoZSBwYXRobmFtZSBvZiBmaWxlLgotICoJU2V0IHNlY3VyaXR5IGF0dHJpYnV0ZXMgZm9yIGEgbmV3bHkgY3JlYXRlZCBzeW1ib2xpYyBsaW5rLiAgTm90ZSB0aGF0Ci0gKglAZGVudHJ5LT5kX2lub2RlIG1heSBiZSBOVUxMLCBzaW5jZSB0aGUgZmlsZXN5c3RlbSBtaWdodCBub3QKLSAqCWluc3RhbnRpYXRlIHRoZSBkZW50cnkgKGUuZy4gTkZTKS4KICAqIEBpbm9kZV9ta2RpcjoKICAqCUNoZWNrIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBhIG5ldyBkaXJlY3RvcnkgaW4gdGhlIGV4aXN0aW5nIGRpcmVjdG9yeQogICoJYXNzb2NpYXRlZCB3aXRoIGlub2RlIHN0cmN0dXJlIEBkaXIuIApAQCAtMjk4LDExICsyOTksNiBAQAogICoJQGRlbnRyeSBjb250YWlucyB0aGUgZGVudHJ5IHN0cnVjdHVyZSBvZiBuZXcgZGlyZWN0b3J5LgogICoJQG1vZGUgY29udGFpbnMgdGhlIG1vZGUgb2YgbmV3IGRpcmVjdG9yeS4KICAqCVJldHVybiAwIGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZC4KLSAqIEBpbm9kZV9wb3N0X21rZGlyOgotICoJU2V0IHNlY3VyaXR5IGF0dHJpYnV0ZXMgb24gYSBuZXdseSBjcmVhdGVkIGRpcmVjdG9yeS4KLSAqCUBkaXIgY29udGFpbnMgdGhlIGlub2RlIHN0cnVjdHVyZSBvZiBwYXJlbnQgb2YgdGhlIGRpcmVjdG9yeSB0byBiZSBjcmVhdGVkLgotICoJQGRlbnRyeSBjb250YWlucyB0aGUgZGVudHJ5IHN0cnVjdHVyZSBvZiBuZXcgZGlyZWN0b3J5LgotICoJQG1vZGUgY29udGFpbnMgdGhlIG1vZGUgb2YgbmV3IGRpcmVjdG9yeS4KICAqIEBpbm9kZV9ybWRpcjoKICAqCUNoZWNrIHRoZSBwZXJtaXNzaW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KICAqCUBkaXIgY29udGFpbnMgdGhlIGlub2RlIHN0cnVjdHVyZSBvZiBwYXJlbnQgb2YgdGhlIGRpcmVjdG9yeSB0byBiZSByZW1vdmVkLgpAQCAtMzE4LDEzICszMTQsNiBAQAogICoJQG1vZGUgY29udGFpbnMgdGhlIG1vZGUgb2YgdGhlIG5ldyBmaWxlLgogICoJQGRldiBjb250YWlucyB0aGUgdGhlIGRldmljZSBudW1iZXIuCiAgKglSZXR1cm4gMCBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQuCi0gKiBAaW5vZGVfcG9zdF9ta25vZDoKLSAqCVNldCBzZWN1cml0eSBhdHRyaWJ1dGVzIG9uIGEgbmV3bHkgY3JlYXRlZCBzcGVjaWFsIGZpbGUgKG9yIHNvY2tldCBvcgotICoJZmlmbyBmaWxlIGNyZWF0ZWQgdmlhIHRoZSBta25vZCBzeXN0ZW0gY2FsbCkuCi0gKglAZGlyIGNvbnRhaW5zIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgb2YgcGFyZW50IG9mIHRoZSBuZXcgbm9kZS4KLSAqCUBkZW50cnkgY29udGFpbnMgdGhlIGRlbnRyeSBzdHJ1Y3R1cmUgb2YgdGhlIG5ldyBub2RlLgotICoJQG1vZGUgY29udGFpbnMgdGhlIG1vZGUgb2YgdGhlIG5ldyBub2RlLgotICoJQGRldiBjb250YWlucyB0aGUgdGhlIGRldmljZSBudW1iZXIuCiAgKiBAaW5vZGVfcmVuYW1lOgogICoJQ2hlY2sgZm9yIHBlcm1pc3Npb24gdG8gcmVuYW1lIGEgZmlsZSBvciBkaXJlY3RvcnkuCiAgKglAb2xkX2RpciBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIGZvciBwYXJlbnQgb2YgdGhlIG9sZCBsaW5rLgpAQCAtMzMyLDEyICszMjEsNiBAQAogICoJQG5ld19kaXIgY29udGFpbnMgdGhlIGlub2RlIHN0cnVjdHVyZSBmb3IgcGFyZW50IG9mIHRoZSBuZXcgbGluay4KICAqCUBuZXdfZGVudHJ5IGNvbnRhaW5zIHRoZSBkZW50cnkgc3RydWN0dXJlIG9mIHRoZSBuZXcgbGluay4KICAqCVJldHVybiAwIGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZC4KLSAqIEBpbm9kZV9wb3N0X3JlbmFtZToKLSAqCVNldCBzZWN1cml0eSBhdHRyaWJ1dGVzIG9uIGEgcmVuYW1lZCBmaWxlIG9yIGRpcmVjdG9yeS4KLSAqCUBvbGRfZGlyIGNvbnRhaW5zIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgZm9yIHBhcmVudCBvZiB0aGUgb2xkIGxpbmsuCi0gKglAb2xkX2RlbnRyeSBjb250YWlucyB0aGUgZGVudHJ5IHN0cnVjdHVyZSBvZiB0aGUgb2xkIGxpbmsuCi0gKglAbmV3X2RpciBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIGZvciBwYXJlbnQgb2YgdGhlIG5ldyBsaW5rLgotICoJQG5ld19kZW50cnkgY29udGFpbnMgdGhlIGRlbnRyeSBzdHJ1Y3R1cmUgb2YgdGhlIG5ldyBsaW5rLgogICogQGlub2RlX3JlYWRsaW5rOgogICoJQ2hlY2sgdGhlIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc3ltYm9saWMgbGluay4KICAqCUBkZW50cnkgY29udGFpbnMgdGhlIGRlbnRyeSBzdHJ1Y3R1cmUgZm9yIHRoZSBmaWxlIGxpbmsuCkBAIC0xMDgwLDM0ICsxMDYzLDIxIEBACiAKIAlpbnQgKCppbm9kZV9hbGxvY19zZWN1cml0eSkgKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwkKIAl2b2lkICgqaW5vZGVfZnJlZV9zZWN1cml0eSkgKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCWludCAoKmlub2RlX2luaXRfc2VjdXJpdHkpIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgICAgY2hhciAqKm5hbWUsIHZvaWQgKip2YWx1ZSwgc2l6ZV90ICpsZW4pOwogCWludCAoKmlub2RlX2NyZWF0ZSkgKHN0cnVjdCBpbm9kZSAqZGlyLAogCSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpOwotCXZvaWQgKCppbm9kZV9wb3N0X2NyZWF0ZSkgKHN0cnVjdCBpbm9kZSAqZGlyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpOwogCWludCAoKmlub2RlX2xpbmspIChzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAogCSAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSk7Ci0Jdm9pZCAoKmlub2RlX3Bvc3RfbGluaykgKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KTsKIAlpbnQgKCppbm9kZV91bmxpbmspIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIAlpbnQgKCppbm9kZV9zeW1saW5rKSAoc3RydWN0IGlub2RlICpkaXIsCiAJICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqb2xkX25hbWUpOwotCXZvaWQgKCppbm9kZV9wb3N0X3N5bWxpbmspIChzdHJ1Y3QgaW5vZGUgKmRpciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvbGRfbmFtZSk7CiAJaW50ICgqaW5vZGVfbWtkaXIpIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSk7Ci0Jdm9pZCAoKmlub2RlX3Bvc3RfbWtkaXIpIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAKLQkJCSAgICBpbnQgbW9kZSk7CiAJaW50ICgqaW5vZGVfcm1kaXIpIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIAlpbnQgKCppbm9kZV9ta25vZCkgKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgZGV2X3QgZGV2KTsKLQl2b2lkICgqaW5vZGVfcG9zdF9ta25vZCkgKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgZGV2X3QgZGV2KTsKIAlpbnQgKCppbm9kZV9yZW5hbWUpIChzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCiAJICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KTsKLQl2b2lkICgqaW5vZGVfcG9zdF9yZW5hbWUpIChzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSk7CiAJaW50ICgqaW5vZGVfcmVhZGxpbmspIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogCWludCAoKmlub2RlX2ZvbGxvd19saW5rKSAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CiAJaW50ICgqaW5vZGVfcGVybWlzc2lvbikgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CkBAIC0xNDQyLDYgKzE0MTIsMTcgQEAKIAkJcmV0dXJuOwogCXNlY3VyaXR5X29wcy0+aW5vZGVfZnJlZV9zZWN1cml0eSAoaW5vZGUpOwogfQorCitzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9pbml0X3NlY3VyaXR5IChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJc3RydWN0IGlub2RlICpkaXIsCisJCQkJCQljaGFyICoqbmFtZSwKKwkJCQkJCXZvaWQgKip2YWx1ZSwKKwkJCQkJCXNpemVfdCAqbGVuKQoreworCWlmICh1bmxpa2VseSAoSVNfUFJJVkFURSAoaW5vZGUpKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCXJldHVybiBzZWN1cml0eV9vcHMtPmlub2RlX2luaXRfc2VjdXJpdHkgKGlub2RlLCBkaXIsIG5hbWUsIHZhbHVlLCBsZW4pOworfQogCQogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfaW5vZGVfY3JlYXRlIChzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkJIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKQEAgLTE0NTIsMTUgKzE0MzMsNiBAQAogCXJldHVybiBzZWN1cml0eV9vcHMtPmlub2RlX2NyZWF0ZSAoZGlyLCBkZW50cnksIG1vZGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJpdHlfaW5vZGVfcG9zdF9jcmVhdGUgKHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCQkgICAgICAgaW50IG1vZGUpCi17Ci0JaWYgKGRlbnRyeS0+ZF9pbm9kZSAmJiB1bmxpa2VseSAoSVNfUFJJVkFURSAoZGVudHJ5LT5kX2lub2RlKSkpCi0JCXJldHVybjsKLQlzZWN1cml0eV9vcHMtPmlub2RlX3Bvc3RfY3JlYXRlIChkaXIsIGRlbnRyeSwgbW9kZSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2xpbmsgKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCiAJCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQpAQCAtMTQ3MCwxNSArMTQ0Miw2IEBACiAJcmV0dXJuIHNlY3VyaXR5X29wcy0+aW5vZGVfbGluayAob2xkX2RlbnRyeSwgZGlyLCBuZXdfZGVudHJ5KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNlY3VyaXR5X2lub2RlX3Bvc3RfbGluayAoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKLQkJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQotewotCWlmIChuZXdfZGVudHJ5LT5kX2lub2RlICYmIHVubGlrZWx5IChJU19QUklWQVRFIChuZXdfZGVudHJ5LT5kX2lub2RlKSkpCi0JCXJldHVybjsKLQlzZWN1cml0eV9vcHMtPmlub2RlX3Bvc3RfbGluayAob2xkX2RlbnRyeSwgZGlyLCBuZXdfZGVudHJ5KTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfaW5vZGVfdW5saW5rIChzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkJIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKQEAgLTE0OTYsMTUgKzE0NTksNiBAQAogCXJldHVybiBzZWN1cml0eV9vcHMtPmlub2RlX3N5bWxpbmsgKGRpciwgZGVudHJ5LCBvbGRfbmFtZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eV9pbm9kZV9wb3N0X3N5bWxpbmsgKHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCQkJY29uc3QgY2hhciAqb2xkX25hbWUpCi17Ci0JaWYgKGRlbnRyeS0+ZF9pbm9kZSAmJiB1bmxpa2VseSAoSVNfUFJJVkFURSAoZGVudHJ5LT5kX2lub2RlKSkpCi0JCXJldHVybjsKLQlzZWN1cml0eV9vcHMtPmlub2RlX3Bvc3Rfc3ltbGluayAoZGlyLCBkZW50cnksIG9sZF9uYW1lKTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfaW5vZGVfbWtkaXIgKHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJCWludCBtb2RlKQpAQCAtMTUxNCwxNSArMTQ2OCw2IEBACiAJcmV0dXJuIHNlY3VyaXR5X29wcy0+aW5vZGVfbWtkaXIgKGRpciwgZGVudHJ5LCBtb2RlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNlY3VyaXR5X2lub2RlX3Bvc3RfbWtkaXIgKHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JCQkJCSAgICAgIGludCBtb2RlKQotewotCWlmIChkZW50cnktPmRfaW5vZGUgJiYgdW5saWtlbHkgKElTX1BSSVZBVEUgKGRlbnRyeS0+ZF9pbm9kZSkpKQotCQlyZXR1cm47Ci0Jc2VjdXJpdHlfb3BzLT5pbm9kZV9wb3N0X21rZGlyIChkaXIsIGRlbnRyeSwgbW9kZSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX3JtZGlyIChzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewpAQCAtMTU0MCwxNSArMTQ4NSw2IEBACiAJcmV0dXJuIHNlY3VyaXR5X29wcy0+aW5vZGVfbWtub2QgKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJpdHlfaW5vZGVfcG9zdF9ta25vZCAoc3RydWN0IGlub2RlICpkaXIsCi0JCQkJCSAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCQkJICAgICAgaW50IG1vZGUsIGRldl90IGRldikKLXsKLQlpZiAoZGVudHJ5LT5kX2lub2RlICYmIHVubGlrZWx5IChJU19QUklWQVRFIChkZW50cnktPmRfaW5vZGUpKSkKLQkJcmV0dXJuOwotCXNlY3VyaXR5X29wcy0+aW5vZGVfcG9zdF9ta25vZCAoZGlyLCBkZW50cnksIG1vZGUsIGRldik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX3JlbmFtZSAoc3RydWN0IGlub2RlICpvbGRfZGlyLAogCQkJCQkgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKIAkJCQkJIHN0cnVjdCBpbm9kZSAqbmV3X2RpciwKQEAgLTE1NjEsMTggKzE0OTcsNiBAQAogCQkJCQkgICBuZXdfZGlyLCBuZXdfZGVudHJ5KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNlY3VyaXR5X2lub2RlX3Bvc3RfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsCi0JCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAotCQkJCQkgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLAotCQkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKLXsKLQlpZiAodW5saWtlbHkgKElTX1BSSVZBVEUgKG9sZF9kZW50cnktPmRfaW5vZGUpIHx8Ci0JICAgIChuZXdfZGVudHJ5LT5kX2lub2RlICYmIElTX1BSSVZBVEUgKG5ld19kZW50cnktPmRfaW5vZGUpKSkpCi0JCXJldHVybjsKLQlzZWN1cml0eV9vcHMtPmlub2RlX3Bvc3RfcmVuYW1lIChvbGRfZGlyLCBvbGRfZGVudHJ5LAotCQkJCQkJbmV3X2RpciwgbmV3X2RlbnRyeSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX3JlYWRsaW5rIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJaWYgKHVubGlrZWx5IChJU19QUklWQVRFIChkZW50cnktPmRfaW5vZGUpKSkKQEAgLTIxNzEsNiArMjA5NSwxNSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJpdHlfaW5vZGVfZnJlZSAoc3RydWN0IGlub2RlICppbm9kZSkKIHsgfQorCitzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9pbml0X3NlY3VyaXR5IChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJc3RydWN0IGlub2RlICpkaXIsCisJCQkJCQljaGFyICoqbmFtZSwKKwkJCQkJCXZvaWQgKip2YWx1ZSwKKwkJCQkJCXNpemVfdCAqbGVuKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KIAkKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2NyZWF0ZSAoc3RydWN0IGlub2RlICpkaXIsCiAJCQkJCSBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCkBAIC0yMTc5LDExICsyMTEyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNlY3VyaXR5X2lub2RlX3Bvc3RfY3JlYXRlIChzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCQkJICAgICAgIGludCBtb2RlKQoteyB9Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2xpbmsgKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCiAJCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQpAQCAtMjE5MSwxMSArMjExOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eV9pbm9kZV9wb3N0X2xpbmsgKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCi0JCQkJCSAgICAgc3RydWN0IGlub2RlICpkaXIsCi0JCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKLXsgfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV91bmxpbmsgKHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewpAQCAtMjIwOSwxMSArMjEzMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eV9pbm9kZV9wb3N0X3N5bWxpbmsgKHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCQkJY29uc3QgY2hhciAqb2xkX25hbWUpCi17IH0KLQogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfaW5vZGVfbWtkaXIgKHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJCWludCBtb2RlKQpAQCAtMjIyMSwxMSArMjEzOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eV9pbm9kZV9wb3N0X21rZGlyIChzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCQkJICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCQkgICAgICBpbnQgbW9kZSkKLXsgfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9ybWRpciAoc3RydWN0IGlub2RlICpkaXIsCiAJCQkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKQEAgLTIyMzksMTEgKzIxNTIsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJpdHlfaW5vZGVfcG9zdF9ta25vZCAoc3RydWN0IGlub2RlICpkaXIsCi0JCQkJCSAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCQkJICAgICAgaW50IG1vZGUsIGRldl90IGRldikKLXsgfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9yZW5hbWUgKHN0cnVjdCBpbm9kZSAqb2xkX2RpciwKIAkJCQkJIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCiAJCQkJCSBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsCkBAIC0yMjUyLDEyICsyMTYwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNlY3VyaXR5X2lub2RlX3Bvc3RfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsCi0JCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAotCQkJCQkgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLAotCQkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKLXsgfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9yZWFkbGluayAoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZW0uaCBiL2luY2x1ZGUvbGludXgvc2VtLmgKaW5kZXggMmQ4NTE2Yi4uMTA2Zjk3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlbS5oCkBAIC04OCw2ICs4OCw3IEBACiAvKiBPbmUgc2VtX2FycmF5IGRhdGEgc3RydWN0dXJlIGZvciBlYWNoIHNldCBvZiBzZW1hcGhvcmVzIGluIHRoZSBzeXN0ZW0uICovCiBzdHJ1Y3Qgc2VtX2FycmF5IHsKIAlzdHJ1Y3Qga2Vybl9pcGNfcGVybQlzZW1fcGVybTsJLyogcGVybWlzc2lvbnMgLi4gc2VlIGlwYy5oICovCisJaW50CQkJc2VtX2lkOwogCXRpbWVfdAkJCXNlbV9vdGltZTsJLyogbGFzdCBzZW1vcCB0aW1lICovCiAJdGltZV90CQkJc2VtX2N0aW1lOwkvKiBsYXN0IGNoYW5nZSB0aW1lICovCiAJc3RydWN0IHNlbQkJKnNlbV9iYXNlOwkvKiBwdHIgdG8gZmlyc3Qgc2VtYXBob3JlIGluIGFycmF5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWwuaAppbmRleCA5ZjJkODUyLi4xMmNkOWNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsLmgKQEAgLTE3NiwxMCArMTc2LDYgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAotLyogRXhwb3J0IHRvIGFsbG93IFBDTUNJQSB0byB1c2UgdGhpcyAtIERhdmUgSGluZHMgKi8KLWV4dGVybiBpbnQgX19kZXByZWNhdGVkIHJlZ2lzdGVyX3NlcmlhbChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqcmVxKTsKLWV4dGVybiB2b2lkIF9fZGVwcmVjYXRlZCB1bnJlZ2lzdGVyX3NlcmlhbChpbnQgbGluZSk7Ci0KIC8qIEFsbG93IGFyY2hpdGVjdHVyZXMgdG8gb3ZlcnJpZGUgZW50cmllcyBpbiBzZXJpYWw4MjUwX3BvcnRzW10gYXQgcnVuIHRpbWU6ICovCiBzdHJ1Y3QgdWFydF9wb3J0OwkvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCiBleHRlcm4gaW50IGVhcmx5X3NlcmlhbF9zZXR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaAppbmRleCAzZTNjMWZhLi4zMTdhOTc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCkBAIC0xNCw2ICsxNCw5IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAorLyoKKyAqIFRoaXMgaXMgdGhlIHBsYXRmb3JtIGRldmljZSBwbGF0Zm9ybV9kYXRhIHN0cnVjdHVyZQorICovCiBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgewogCXVuc2lnbmVkIGxvbmcJaW9iYXNlOwkJLyogaW8gYmFzZSBhZGRyZXNzICovCiAJdm9pZCBfX2lvbWVtCSptZW1iYXNlOwkvKiBpb3JlbWFwIGNvb2tpZSBvciBOVUxMICovCkBAIC0yNiw0ICsyOSwzMiBAQAogCXVuc2lnbmVkIGludAlmbGFnczsJCS8qIFVQRl8qIGZsYWdzICovCiB9OwogCisvKgorICogQWxsb2NhdGUgODI1MCBwbGF0Zm9ybSBkZXZpY2UgSURzLiAgTm90aGluZyBpcyBpbXBsaWVkIGJ5CisgKiB0aGUgbnVtYmVyaW5nIGhlcmUsIGV4Y2VwdCBmb3IgdGhlIGxlZ2FjeSBlbnRyeSBiZWluZyAtMS4KKyAqLworZW51bSB7CisJUExBVDgyNTBfREVWX0xFR0FDWSA9IC0xLAorCVBMQVQ4MjUwX0RFVl9QTEFURk9STSwKKwlQTEFUODI1MF9ERVZfUExBVEZPUk0xLAorCVBMQVQ4MjUwX0RFVl9GT1VSUE9SVCwKKwlQTEFUODI1MF9ERVZfQUNDRU5ULAorCVBMQVQ4MjUwX0RFVl9CT0NBLAorCVBMQVQ4MjUwX0RFVl9IVUI2LAorCVBMQVQ4MjUwX0RFVl9NQ0EsCit9OworCisvKgorICogVGhpcyBzaG91bGQgYmUgdXNlZCBieSBkcml2ZXJzIHdoaWNoIHdhbnQgdG8gcmVnaXN0ZXIKKyAqIHRoZWlyIG93biA4MjUwIHBvcnRzIHdpdGhvdXQgcmVnaXN0ZXJpbmcgdGhlaXIgb3duCisgKiBwbGF0Zm9ybSBkZXZpY2UuICBVc2luZyB0aGVzZSB3aWxsIG1ha2UgeW91ciBkcml2ZXIKKyAqIGRlcGVuZGVudCBvbiB0aGUgODI1MCBkcml2ZXIuCisgKi8KK3N0cnVjdCB1YXJ0X3BvcnQ7CisKK2ludCBzZXJpYWw4MjUwX3JlZ2lzdGVyX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqKTsKK3ZvaWQgc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQoaW50IGxpbmUpOwordm9pZCBzZXJpYWw4MjUwX3N1c3BlbmRfcG9ydChpbnQgbGluZSk7Cit2b2lkIHNlcmlhbDgyNTBfcmVzdW1lX3BvcnQoaW50IGxpbmUpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAppbmRleCBmNmZjYThmLi4yN2RiOGRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC0xNDIsOCArMTQyLDggQEAKIAl1bnNpZ25lZCBpbnQJKCp0eF9lbXB0eSkoc3RydWN0IHVhcnRfcG9ydCAqKTsKIAl2b2lkCQkoKnNldF9tY3RybCkoc3RydWN0IHVhcnRfcG9ydCAqLCB1bnNpZ25lZCBpbnQgbWN0cmwpOwogCXVuc2lnbmVkIGludAkoKmdldF9tY3RybCkoc3RydWN0IHVhcnRfcG9ydCAqKTsKLQl2b2lkCQkoKnN0b3BfdHgpKHN0cnVjdCB1YXJ0X3BvcnQgKiwgdW5zaWduZWQgaW50IHR0eV9zdG9wKTsKLQl2b2lkCQkoKnN0YXJ0X3R4KShzdHJ1Y3QgdWFydF9wb3J0ICosIHVuc2lnbmVkIGludCB0dHlfc3RhcnQpOworCXZvaWQJCSgqc3RvcF90eCkoc3RydWN0IHVhcnRfcG9ydCAqKTsKKwl2b2lkCQkoKnN0YXJ0X3R4KShzdHJ1Y3QgdWFydF9wb3J0ICopOwogCXZvaWQJCSgqc2VuZF94Y2hhcikoc3RydWN0IHVhcnRfcG9ydCAqLCBjaGFyIGNoKTsKIAl2b2lkCQkoKnN0b3BfcngpKHN0cnVjdCB1YXJ0X3BvcnQgKik7CiAJdm9pZAkJKCplbmFibGVfbXMpKHN0cnVjdCB1YXJ0X3BvcnQgKik7CkBAIC0zNjAsOCArMzYwLDYgQEAKICAqLwogaW50IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1YXJ0X2RyaXZlciAqdWFydCk7CiB2b2lkIHVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVhcnRfZHJpdmVyICp1YXJ0KTsKLXZvaWQgX19kZXByZWNhdGVkIHVhcnRfdW5yZWdpc3Rlcl9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqcmVnLCBpbnQgbGluZSk7Ci1pbnQgX19kZXByZWNhdGVkIHVhcnRfcmVnaXN0ZXJfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKnJlZywgc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CiBpbnQgdWFydF9hZGRfb25lX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpyZWcsIHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwogaW50IHVhcnRfcmVtb3ZlX29uZV9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqcmVnLCBzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKIGludCB1YXJ0X21hdGNoX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydDEsIHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQyKTsKQEAgLTM4NywxMSArMzg1LDExIEBACiAvKgogICogVGhlIGZvbGxvd2luZyBhcmUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIGxvdyBsZXZlbCBkcml2ZXJzLgogICovCi0jaWZkZWYgU1VQUE9SVF9TWVNSUQogc3RhdGljIGlubGluZSBpbnQKIHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNoLAogCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisjaWZkZWYgU1VQUE9SVF9TWVNSUQogCWlmIChwb3J0LT5zeXNycSkgewogCQlpZiAoY2ggJiYgdGltZV9iZWZvcmUoamlmZmllcywgcG9ydC0+c3lzcnEpKSB7CiAJCQloYW5kbGVfc3lzcnEoY2gsIHJlZ3MsIE5VTEwpOwpAQCAtNDAwLDEwICszOTgsMTEgQEAKIAkJfQogCQlwb3J0LT5zeXNycSA9IDA7CiAJfQorI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci0jZWxzZQotI2RlZmluZSB1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKHBvcnQsY2gscmVncykJKDApCisjaWZuZGVmIFNVUFBPUlRfU1lTUlEKKyNkZWZpbmUgdWFydF9oYW5kbGVfc3lzcnFfY2hhcihwb3J0LGNoLHJlZ3MpIHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgMCwgTlVMTCkKICNlbmRpZgogCiAvKgpAQCAtNDY4LDEzICs0NjcsMTMgQEAKIAkJaWYgKHR0eS0+aHdfc3RvcHBlZCkgewogCQkJaWYgKHN0YXR1cykgewogCQkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7Ci0JCQkJcG9ydC0+b3BzLT5zdGFydF90eChwb3J0LCAwKTsKKwkJCQlwb3J0LT5vcHMtPnN0YXJ0X3R4KHBvcnQpOwogCQkJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOwogCQkJfQogCQl9IGVsc2UgewogCQkJaWYgKCFzdGF0dXMpIHsKIAkJCQl0dHktPmh3X3N0b3BwZWQgPSAxOwotCQkJCXBvcnQtPm9wcy0+c3RvcF90eChwb3J0LCAwKTsKKwkJCQlwb3J0LT5vcHMtPnN0b3BfdHgocG9ydCk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaAppbmRleCA0MmVkY2U2Li4yNzQxYzBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKQEAgLTExNjcsNyArMTE2Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHBza2JfdHJpbV9yY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKQogewotCWlmIChsZW4gPj0gc2tiLT5sZW4pCisJaWYgKGxpa2VseShsZW4gPj0gc2tiLT5sZW4pKQogCQlyZXR1cm4gMDsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKQEAgLTEyNTEsNyArMTI1MSw3IEBACiAgKglUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBvZmZzZXQgYmFjayB0byBhIHN0cnVjdCB0aW1ldmFsIGFuZCBzdG9yZXMKICAqCWl0IGluIHN0YW1wLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2tiX2dldF90aW1lc3RhbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRpbWV2YWwgKnN0YW1wKQorc3RhdGljIGlubGluZSB2b2lkIHNrYl9nZXRfdGltZXN0YW1wKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0aW1ldmFsICpzdGFtcCkKIHsKIAlzdGFtcC0+dHZfc2VjICA9IHNrYi0+dHN0YW1wLm9mZl9zZWM7CiAJc3RhbXAtPnR2X3VzZWMgPSBza2ItPnRzdGFtcC5vZmZfdXNlYzsKQEAgLTEyNzAsNyArMTI3MCw3IEBACiAgKglUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgc3RydWN0IHRpbWV2YWwgdG8gYW4gb2Zmc2V0IGFuZCBzdG9yZXMKICAqCWl0IGluIHRoZSBza2IuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBza2Jfc2V0X3RpbWVzdGFtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGltZXZhbCAqc3RhbXApCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NldF90aW1lc3RhbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnN0YW1wKQogewogCXNrYi0+dHN0YW1wLm9mZl9zZWMgID0gc3RhbXAtPnR2X3NlYyAtIHNrYl90dl9iYXNlLnR2X3NlYzsKIAlza2ItPnRzdGFtcC5vZmZfdXNlYyA9IHN0YW1wLT50dl91c2VjIC0gc2tiX3R2X2Jhc2UudHZfdXNlYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYi5oIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKaW5kZXggODBiMmRmZC4uMWYzNTZmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKQEAgLTk5LDEyICs5OSwyNyBAQAogCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOwogfQogCi1leHRlcm4gdm9pZCAqa2NhbGxvYyhzaXplX3QsIHNpemVfdCwgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKK2V4dGVybiB2b2lkICpremFsbG9jKHNpemVfdCwgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKKworLyoqCisgKiBrY2FsbG9jIC0gYWxsb2NhdGUgbWVtb3J5IGZvciBhbiBhcnJheS4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KKyAqIEBuOiBudW1iZXIgb2YgZWxlbWVudHMuCisgKiBAc2l6ZTogZWxlbWVudCBzaXplLgorICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqa2NhbGxvYyhzaXplX3Qgbiwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKK3sKKwlpZiAobiAhPSAwICYmIHNpemUgPiBJTlRfTUFYIC8gbikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGt6YWxsb2MobiAqIHNpemUsIGZsYWdzKTsKK30KKwogZXh0ZXJuIHZvaWQga2ZyZWUoY29uc3Qgdm9pZCAqKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQga3NpemUoY29uc3Qgdm9pZCAqKTsKIAogI2lmZGVmIENPTkZJR19OVU1BCi1leHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKGttZW1fY2FjaGVfdCAqLCBpbnQgZmxhZ3MsIGludCBub2RlKTsKK2V4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoa21lbV9jYWNoZV90ICosCisJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MsIGludCBub2RlKTsKIGV4dGVybiB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncywgaW50IG5vZGUpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKGttZW1fY2FjaGVfdCAqY2FjaGVwLCBpbnQgZmxhZ3MsIGludCBub2RlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb255cGkuaCBiL2luY2x1ZGUvbGludXgvc29ueXBpLmgKaW5kZXggNzY4Y2JiYS4uZjU2ZDI0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zb255cGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oCkBAIC05OSw2ICs5OSw4IEBACiAjZGVmaW5lIFNPTllQSV9FVkVOVF9CQVRURVJZX0lOU0VSVAkJNTcKICNkZWZpbmUgU09OWVBJX0VWRU5UX0JBVFRFUllfUkVNT1ZFCQk1OAogI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQJCTU5CisjZGVmaW5lIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PTgkJNjAKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1dJUkVMRVNTX09GRgkJNjEKIAogLyogZ2V0L3NldCBicmlnaHRuZXNzICovCiAjZGVmaW5lIFNPTllQSV9JT0NHQlJUCQlfSU9SKCd2JywgMCwgX191OCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc291bmQuaCBiL2luY2x1ZGUvbGludXgvc291bmQuaAppbmRleCA0MjhmNTk3Li43MmI5YWY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvdW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9zb3VuZC5oCkBAIC0yOSw3ICsyOSw5IEBACiAgKglTb3VuZCBjb3JlIGludGVyZmFjZSBmdW5jdGlvbnMKICAqLwogIAorc3RydWN0IGRldmljZTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfc291bmRfc3BlY2lhbChzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLCBpbnQgdW5pdCk7CitleHRlcm4gaW50IHJlZ2lzdGVyX3NvdW5kX3NwZWNpYWxfZGV2aWNlKHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMsIGludCB1bml0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9zb3VuZF9taXhlcihzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLCBpbnQgZGV2KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfc291bmRfbWlkaShzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLCBpbnQgZGV2KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfc291bmRfZHNwKHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMsIGludCBkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGlubG9jay5oIGIvaW5jbHVkZS9saW51eC9zcGlubG9jay5oCmluZGV4IGQ2YmEwNjguLmNkYzk5YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmgKQEAgLTIsNyArMiw0OCBAQAogI2RlZmluZSBfX0xJTlVYX1NQSU5MT0NLX0gKIAogLyoKLSAqIGluY2x1ZGUvbGludXgvc3BpbmxvY2suaCAtIGdlbmVyaWMgbG9ja2luZyBkZWNsYXJhdGlvbnMKKyAqIGluY2x1ZGUvbGludXgvc3BpbmxvY2suaCAtIGdlbmVyaWMgc3BpbmxvY2svcndsb2NrIGRlY2xhcmF0aW9ucworICoKKyAqIGhlcmUncyB0aGUgcm9sZSBvZiB0aGUgdmFyaW91cyBzcGlubG9jay9yd2xvY2sgcmVsYXRlZCBpbmNsdWRlIGZpbGVzOgorICoKKyAqIG9uIFNNUCBidWlsZHM6CisgKgorICogIGFzbS9zcGlubG9ja190eXBlcy5oOiBjb250YWlucyB0aGUgcmF3X3NwaW5sb2NrX3QvcmF3X3J3bG9ja190IGFuZCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJzCisgKgorICogIGxpbnV4L3NwaW5sb2NrX3R5cGVzLmg6CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZXMgdGhlIGdlbmVyaWMgdHlwZSBhbmQgaW5pdGlhbGl6ZXJzCisgKgorICogIGFzbS9zcGlubG9jay5oOiAgICAgICBjb250YWlucyB0aGUgX19yYXdfc3Bpbl8qKCkvZXRjLiBsb3dsZXZlbAorICogICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMsIG1vc3RseSBpbmxpbmUgYXNzZW1ibHkgY29kZQorICoKKyAqICAgKGFsc28gaW5jbHVkZWQgb24gVVAtZGVidWcgYnVpbGRzOikKKyAqCisgKiAgbGludXgvc3BpbmxvY2tfYXBpX3NtcC5oOgorICogICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgcHJvdG90eXBlcyBmb3IgdGhlIF9zcGluXyooKSBBUElzLgorICoKKyAqICBsaW51eC9zcGlubG9jay5oOiAgICAgYnVpbGRzIHRoZSBmaW5hbCBzcGluXyooKSBBUElzLgorICoKKyAqIG9uIFVQIGJ1aWxkczoKKyAqCisgKiAgbGludXgvc3BpbmxvY2tfdHlwZV91cC5oOgorICogICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgZ2VuZXJpYywgc2ltcGxpZmllZCBVUCBzcGlubG9jayB0eXBlLgorICogICAgICAgICAgICAgICAgICAgICAgICAod2hpY2ggaXMgYW4gZW1wdHkgc3RydWN0dXJlIG9uIG5vbi1kZWJ1ZyBidWlsZHMpCisgKgorICogIGxpbnV4L3NwaW5sb2NrX3R5cGVzLmg6CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZXMgdGhlIGdlbmVyaWMgdHlwZSBhbmQgaW5pdGlhbGl6ZXJzCisgKgorICogIGxpbnV4L3NwaW5sb2NrX3VwLmg6CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBfX3Jhd19zcGluXyooKS9ldGMuIHZlcnNpb24gb2YgVVAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRzLiAod2hpY2ggYXJlIE5PUHMgb24gbm9uLWRlYnVnLCBub24tcHJlZW1wdAorICogICAgICAgICAgICAgICAgICAgICAgICBidWlsZHMpCisgKgorICogICAoaW5jbHVkZWQgb24gVVAtbm9uLWRlYnVnIGJ1aWxkczopCisgKgorICogIGxpbnV4L3NwaW5sb2NrX2FwaV91cC5oOgorICogICAgICAgICAgICAgICAgICAgICAgICBidWlsZHMgdGhlIF9zcGluXyooKSBBUElzLgorICoKKyAqICBsaW51eC9zcGlubG9jay5oOiAgICAgYnVpbGRzIHRoZSBmaW5hbCBzcGluXyooKSBBUElzLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTEzLDcgKzU0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KIAotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JLyogZm9yIGNwdSByZWxheCAqLwogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogLyoKQEAgLTM1LDQyMyArNzUsODQgQEAKICNkZWZpbmUgX19sb2NrZnVuYyBmYXN0Y2FsbCBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuc3BpbmxvY2sudGV4dCIpKSkKIAogLyoKLSAqIElmIENPTkZJR19TTVAgaXMgc2V0LCBwdWxsIGluIHRoZSBfcmF3XyogZGVmaW5pdGlvbnMKKyAqIFB1bGwgdGhlIHJhd19zcGlubG9ja190IGFuZCByYXdfcndsb2NrX3QgZGVmaW5pdGlvbnM6CiAgKi8KLSNpZmRlZiBDT05GSUdfU01QCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2tfdHlwZXMuaD4KIAotI2RlZmluZSBhc3NlcnRfc3Bpbl9sb2NrZWQoeCkJQlVHX09OKCFzcGluX2lzX2xvY2tlZCh4KSkKLSNpbmNsdWRlIDxhc20vc3BpbmxvY2suaD4KK2V4dGVybiBpbnQgX19sb2NrZnVuYyBnZW5lcmljX19yYXdfcmVhZF90cnlsb2NrKHJhd19yd2xvY2tfdCAqbG9jayk7CiAKLWludCBfX2xvY2tmdW5jIF9zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqbG9jayk7Ci1pbnQgX19sb2NrZnVuYyBfcmVhZF90cnlsb2NrKHJ3bG9ja190ICpsb2NrKTsKLWludCBfX2xvY2tmdW5jIF93cml0ZV90cnlsb2NrKHJ3bG9ja190ICpsb2NrKTsKLQotdm9pZCBfX2xvY2tmdW5jIF9zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaykJX19hY3F1aXJlcyhzcGlubG9ja190KTsKLXZvaWQgX19sb2NrZnVuYyBfcmVhZF9sb2NrKHJ3bG9ja190ICpsb2NrKQlfX2FjcXVpcmVzKHJ3bG9ja190KTsKLXZvaWQgX19sb2NrZnVuYyBfd3JpdGVfbG9jayhyd2xvY2tfdCAqbG9jaykJX19hY3F1aXJlcyhyd2xvY2tfdCk7Ci0KLXZvaWQgX19sb2NrZnVuYyBfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaykJX19yZWxlYXNlcyhzcGlubG9ja190KTsKLXZvaWQgX19sb2NrZnVuYyBfcmVhZF91bmxvY2socndsb2NrX3QgKmxvY2spCV9fcmVsZWFzZXMocndsb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF93cml0ZV91bmxvY2socndsb2NrX3QgKmxvY2spCV9fcmVsZWFzZXMocndsb2NrX3QpOwotCi11bnNpZ25lZCBsb25nIF9fbG9ja2Z1bmMgX3NwaW5fbG9ja19pcnFzYXZlKHNwaW5sb2NrX3QgKmxvY2spCV9fYWNxdWlyZXMoc3BpbmxvY2tfdCk7Ci11bnNpZ25lZCBsb25nIF9fbG9ja2Z1bmMgX3JlYWRfbG9ja19pcnFzYXZlKHJ3bG9ja190ICpsb2NrKQlfX2FjcXVpcmVzKHJ3bG9ja190KTsKLXVuc2lnbmVkIGxvbmcgX19sb2NrZnVuYyBfd3JpdGVfbG9ja19pcnFzYXZlKHJ3bG9ja190ICpsb2NrKQlfX2FjcXVpcmVzKHJ3bG9ja190KTsKLQotdm9pZCBfX2xvY2tmdW5jIF9zcGluX2xvY2tfaXJxKHNwaW5sb2NrX3QgKmxvY2spCV9fYWNxdWlyZXMoc3BpbmxvY2tfdCk7Ci12b2lkIF9fbG9ja2Z1bmMgX3NwaW5fbG9ja19iaChzcGlubG9ja190ICpsb2NrKQkJX19hY3F1aXJlcyhzcGlubG9ja190KTsKLXZvaWQgX19sb2NrZnVuYyBfcmVhZF9sb2NrX2lycShyd2xvY2tfdCAqbG9jaykJCV9fYWNxdWlyZXMocndsb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF9yZWFkX2xvY2tfYmgocndsb2NrX3QgKmxvY2spCQlfX2FjcXVpcmVzKHJ3bG9ja190KTsKLXZvaWQgX19sb2NrZnVuYyBfd3JpdGVfbG9ja19pcnEocndsb2NrX3QgKmxvY2spCQlfX2FjcXVpcmVzKHJ3bG9ja190KTsKLXZvaWQgX19sb2NrZnVuYyBfd3JpdGVfbG9ja19iaChyd2xvY2tfdCAqbG9jaykJCV9fYWNxdWlyZXMocndsb2NrX3QpOwotCi12b2lkIF9fbG9ja2Z1bmMgX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykJX19yZWxlYXNlcyhzcGlubG9ja190KTsKLXZvaWQgX19sb2NrZnVuYyBfc3Bpbl91bmxvY2tfaXJxKHNwaW5sb2NrX3QgKmxvY2spCQkJCV9fcmVsZWFzZXMoc3BpbmxvY2tfdCk7Ci12b2lkIF9fbG9ja2Z1bmMgX3NwaW5fdW5sb2NrX2JoKHNwaW5sb2NrX3QgKmxvY2spCQkJCV9fcmVsZWFzZXMoc3BpbmxvY2tfdCk7Ci12b2lkIF9fbG9ja2Z1bmMgX3JlYWRfdW5sb2NrX2lycXJlc3RvcmUocndsb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCV9fcmVsZWFzZXMocndsb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF9yZWFkX3VubG9ja19pcnEocndsb2NrX3QgKmxvY2spCQkJCV9fcmVsZWFzZXMocndsb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF9yZWFkX3VubG9ja19iaChyd2xvY2tfdCAqbG9jaykJCQkJCV9fcmVsZWFzZXMocndsb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF93cml0ZV91bmxvY2tfaXJxcmVzdG9yZShyd2xvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykJX19yZWxlYXNlcyhyd2xvY2tfdCk7Ci12b2lkIF9fbG9ja2Z1bmMgX3dyaXRlX3VubG9ja19pcnEocndsb2NrX3QgKmxvY2spCQkJCV9fcmVsZWFzZXMocndsb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF93cml0ZV91bmxvY2tfYmgocndsb2NrX3QgKmxvY2spCQkJCV9fcmVsZWFzZXMocndsb2NrX3QpOwotCi1pbnQgX19sb2NrZnVuYyBfc3Bpbl90cnlsb2NrX2JoKHNwaW5sb2NrX3QgKmxvY2spOwotaW50IF9fbG9ja2Z1bmMgZ2VuZXJpY19yYXdfcmVhZF90cnlsb2NrKHJ3bG9ja190ICpsb2NrKTsKLWludCBpbl9sb2NrX2Z1bmN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHIpOwotCisvKgorICogUHVsbCB0aGUgX19yYXcqKCkgZnVuY3Rpb25zL2RlY2xhcmF0aW9ucyAoVVAtbm9uZGVidWcgZG9lc250IG5lZWQgdGhlbSk6CisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TTVApCisjIGluY2x1ZGUgPGFzbS9zcGlubG9jay5oPgogI2Vsc2UKKyMgaW5jbHVkZSA8bGludXgvc3BpbmxvY2tfdXAuaD4KKyNlbmRpZgogCi0jZGVmaW5lIGluX2xvY2tfZnVuY3Rpb25zKEFERFIpIDAKKyNkZWZpbmUgc3Bpbl9sb2NrX2luaXQobG9jaykJZG8geyAqKGxvY2spID0gU1BJTl9MT0NLX1VOTE9DS0VEOyB9IHdoaWxlICgwKQorI2RlZmluZSByd2xvY2tfaW5pdChsb2NrKQlkbyB7ICoobG9jaykgPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlICgwKQogCi0jaWYgIWRlZmluZWQoQ09ORklHX1BSRUVNUFQpICYmICFkZWZpbmVkKENPTkZJR19ERUJVR19TUElOTE9DSykKLSMgZGVmaW5lIF9hdG9taWNfZGVjX2FuZF9sb2NrKGF0b21pYyxsb2NrKSBhdG9taWNfZGVjX2FuZF90ZXN0KGF0b21pYykKLSMgZGVmaW5lIEFUT01JQ19ERUNfQU5EX0xPQ0sKKyNkZWZpbmUgc3Bpbl9pc19sb2NrZWQobG9jaykJX19yYXdfc3Bpbl9pc19sb2NrZWQoJihsb2NrKS0+cmF3X2xvY2spCisKKy8qKgorICogc3Bpbl91bmxvY2tfd2FpdCAtIHdhaXQgdW50aWwgdGhlIHNwaW5sb2NrIGdldHMgdW5sb2NrZWQKKyAqIEBsb2NrOiB0aGUgc3BpbmxvY2sgaW4gcXVlc3Rpb24uCisgKi8KKyNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdChsb2NrKQlfX3Jhd19zcGluX3VubG9ja193YWl0KCYobG9jayktPnJhd19sb2NrKQorCisvKgorICogUHVsbCB0aGUgX3NwaW5fKigpL19yZWFkXyooKS9fd3JpdGVfKigpIGZ1bmN0aW9ucy9kZWNsYXJhdGlvbnM6CisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TTVApIHx8IGRlZmluZWQoQ09ORklHX0RFQlVHX1NQSU5MT0NLKQorIyBpbmNsdWRlIDxsaW51eC9zcGlubG9ja19hcGlfc21wLmg+CisjZWxzZQorIyBpbmNsdWRlIDxsaW51eC9zcGlubG9ja19hcGlfdXAuaD4KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0gCi0jZGVmaW5lIFNQSU5MT0NLX01BR0lDCTB4MUQyNDRCM0MKLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIG1hZ2ljOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9jazsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgYmFiYmxlOwotCWNvbnN0IGNoYXIgKm1vZHVsZTsKLQljaGFyICpvd25lcjsKLQlpbnQgb2xpbmU7Ci19IHNwaW5sb2NrX3Q7Ci0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRCAoc3BpbmxvY2tfdCkgeyBTUElOTE9DS19NQUdJQywgMCwgMTAsIF9fRklMRV9fICwgTlVMTCwgMH0KKyBleHRlcm4gdm9pZCBfcmF3X3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrKTsKKyNkZWZpbmUgX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9yYXdfc3Bpbl9sb2NrKGxvY2spCisgZXh0ZXJuIGludCBfcmF3X3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKTsKKyBleHRlcm4gdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spOwogCi0jZGVmaW5lIHNwaW5fbG9ja19pbml0KHgpIFwKLQlkbyB7IFwKLQkJKHgpLT5tYWdpYyA9IFNQSU5MT0NLX01BR0lDOyBcCi0JCSh4KS0+bG9jayA9IDA7IFwKLQkJKHgpLT5iYWJibGUgPSA1OyBcCi0JCSh4KS0+bW9kdWxlID0gX19GSUxFX187IFwKLQkJKHgpLT5vd25lciA9IE5VTEw7IFwKLQkJKHgpLT5vbGluZSA9IDA7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIENIRUNLX0xPQ0soeCkgXAotCWRvIHsgXAotCSAJaWYgKCh4KS0+bWFnaWMgIT0gU1BJTkxPQ0tfTUFHSUMpIHsgXAotCQkJcHJpbnRrKEtFUk5fRVJSICIlczolZDogc3Bpbl9pc19sb2NrZWQgb24gdW5pbml0aWFsaXplZCBzcGlubG9jayAlcC5cbiIsIFwKLQkJCQkJX19GSUxFX18sIF9fTElORV9fLCAoeCkpOyBcCi0JCX0gXAotCX0gd2hpbGUoMCkKLQotI2RlZmluZSBfcmF3X3NwaW5fbG9jayh4KQkJXAotCWRvIHsgXAotCSAJQ0hFQ0tfTE9DSyh4KTsgXAotCQlpZiAoKHgpLT5sb2NrJiYoeCktPmJhYmJsZSkgeyBcCi0JCQkoeCktPmJhYmJsZS0tOyBcCi0JCQlwcmludGsoIiVzOiVkOiBzcGluX2xvY2soJXM6JXApIGFscmVhZHkgbG9ja2VkIGJ5ICVzLyVkXG4iLCBcCi0JCQkJCV9fRklMRV9fLF9fTElORV9fLCAoeCktPm1vZHVsZSwgXAotCQkJCQkoeCksICh4KS0+b3duZXIsICh4KS0+b2xpbmUpOyBcCi0JCX0gXAotCQkoeCktPmxvY2sgPSAxOyBcCi0JCSh4KS0+b3duZXIgPSBfX0ZJTEVfXzsgXAotCQkoeCktPm9saW5lID0gX19MSU5FX187IFwKLQl9IHdoaWxlICgwKQotCi0vKiB3aXRob3V0IGRlYnVnZ2luZywgc3Bpbl9pc19sb2NrZWQgb24gVVAgYWx3YXlzIHNheXMKLSAqIEZBTFNFLiAtLT4gcHJpbnRrIGlmIGFscmVhZHkgbG9ja2VkLiAqLwotI2RlZmluZSBzcGluX2lzX2xvY2tlZCh4KSBcCi0JKHsgXAotCSAJQ0hFQ0tfTE9DSyh4KTsgXAotCQlpZiAoKHgpLT5sb2NrJiYoeCktPmJhYmJsZSkgeyBcCi0JCQkoeCktPmJhYmJsZS0tOyBcCi0JCQlwcmludGsoIiVzOiVkOiBzcGluX2lzX2xvY2tlZCglczolcCkgYWxyZWFkeSBsb2NrZWQgYnkgJXMvJWRcbiIsIFwKLQkJCQkJX19GSUxFX18sX19MSU5FX18sICh4KS0+bW9kdWxlLCBcCi0JCQkJCSh4KSwgKHgpLT5vd25lciwgKHgpLT5vbGluZSk7IFwKLQkJfSBcCi0JCTA7IFwKLQl9KQotCi0vKiB3aXRoIGRlYnVnZ2luZywgYXNzZXJ0X3NwaW5fbG9ja2VkKCkgb24gVVAgZG9lcyBjaGVjawotICogdGhlIGxvY2sgdmFsdWUgcHJvcGVybHkgKi8KLSNkZWZpbmUgYXNzZXJ0X3NwaW5fbG9ja2VkKHgpIFwKLQkoeyBcCi0JCUNIRUNLX0xPQ0soeCk7IFwKLQkJQlVHX09OKCEoeCktPmxvY2spOyBcCi0JfSkKLQotLyogd2l0aG91dCBkZWJ1Z2dpbmcsIHNwaW5fdHJ5bG9jayBvbiBVUCBhbHdheXMgc2F5cwotICogVFJVRS4gLS0+IHByaW50ayBpZiBhbHJlYWR5IGxvY2tlZC4gKi8KLSNkZWZpbmUgX3Jhd19zcGluX3RyeWxvY2soeCkgXAotCSh7IFwKLQkgCUNIRUNLX0xPQ0soeCk7IFwKLQkJaWYgKCh4KS0+bG9jayYmKHgpLT5iYWJibGUpIHsgXAotCQkJKHgpLT5iYWJibGUtLTsgXAotCQkJcHJpbnRrKCIlczolZDogc3Bpbl90cnlsb2NrKCVzOiVwKSBhbHJlYWR5IGxvY2tlZCBieSAlcy8lZFxuIiwgXAotCQkJCQlfX0ZJTEVfXyxfX0xJTkVfXywgKHgpLT5tb2R1bGUsIFwKLQkJCQkJKHgpLCAoeCktPm93bmVyLCAoeCktPm9saW5lKTsgXAotCQl9IFwKLQkJKHgpLT5sb2NrID0gMTsgXAotCQkoeCktPm93bmVyID0gX19GSUxFX187IFwKLQkJKHgpLT5vbGluZSA9IF9fTElORV9fOyBcCi0JCTE7IFwKLQl9KQotCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQoeCkJXAotCWRvIHsgXAotCSAJQ0hFQ0tfTE9DSyh4KTsgXAotCQlpZiAoKHgpLT5sb2NrJiYoeCktPmJhYmJsZSkgeyBcCi0JCQkoeCktPmJhYmJsZS0tOyBcCi0JCQlwcmludGsoIiVzOiVkOiBzcGluX3VubG9ja193YWl0KCVzOiVwKSBvd25lZCBieSAlcy8lZFxuIiwgXAotCQkJCQlfX0ZJTEVfXyxfX0xJTkVfXywgKHgpLT5tb2R1bGUsICh4KSwgXAotCQkJCQkoeCktPm93bmVyLCAoeCktPm9saW5lKTsgXAotCQl9XAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3Jhd19zcGluX3VubG9jayh4KSBcCi0JZG8geyBcCi0JIAlDSEVDS19MT0NLKHgpOyBcCi0JCWlmICghKHgpLT5sb2NrJiYoeCktPmJhYmJsZSkgeyBcCi0JCQkoeCktPmJhYmJsZS0tOyBcCi0JCQlwcmludGsoIiVzOiVkOiBzcGluX3VubG9jayglczolcCkgbm90IGxvY2tlZFxuIiwgXAotCQkJCQlfX0ZJTEVfXyxfX0xJTkVfXywgKHgpLT5tb2R1bGUsICh4KSk7XAotCQl9IFwKLQkJKHgpLT5sb2NrID0gMDsgXAotCX0gd2hpbGUgKDApCisgZXh0ZXJuIHZvaWQgX3Jhd19yZWFkX2xvY2socndsb2NrX3QgKmxvY2spOworIGV4dGVybiBpbnQgX3Jhd19yZWFkX3RyeWxvY2socndsb2NrX3QgKmxvY2spOworIGV4dGVybiB2b2lkIF9yYXdfcmVhZF91bmxvY2socndsb2NrX3QgKmxvY2spOworIGV4dGVybiB2b2lkIF9yYXdfd3JpdGVfbG9jayhyd2xvY2tfdCAqbG9jayk7CisgZXh0ZXJuIGludCBfcmF3X3dyaXRlX3RyeWxvY2socndsb2NrX3QgKmxvY2spOworIGV4dGVybiB2b2lkIF9yYXdfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpsb2NrKTsKICNlbHNlCi0vKgotICogZ2NjIHZlcnNpb25zIGJlZm9yZSB+Mi45NSBoYXZlIGEgbmFzdHkgYnVnIHdpdGggZW1wdHkgaW5pdGlhbGl6ZXJzLgotICovCi0jaWYgKF9fR05VQ19fID4gMikKLSAgdHlwZWRlZiBzdHJ1Y3QgeyB9IHNwaW5sb2NrX3Q7Ci0gICNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VEIChzcGlubG9ja190KSB7IH0KLSNlbHNlCi0gIHR5cGVkZWYgc3RydWN0IHsgaW50IGdjY19pc19idWdneTsgfSBzcGlubG9ja190OwotICAjZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRCAoc3BpbmxvY2tfdCkgeyAwIH0KKyMgZGVmaW5lIF9yYXdfc3Bpbl91bmxvY2sobG9jaykJCV9fcmF3X3NwaW5fdW5sb2NrKCYobG9jayktPnJhd19sb2NrKQorIyBkZWZpbmUgX3Jhd19zcGluX3RyeWxvY2sobG9jaykJX19yYXdfc3Bpbl90cnlsb2NrKCYobG9jayktPnJhd19sb2NrKQorIyBkZWZpbmUgX3Jhd19zcGluX2xvY2sobG9jaykJCV9fcmF3X3NwaW5fbG9jaygmKGxvY2spLT5yYXdfbG9jaykKKyMgZGVmaW5lIF9yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBcCisJCV9fcmF3X3NwaW5fbG9ja19mbGFncygmKGxvY2spLT5yYXdfbG9jaywgKihmbGFncykpCisjIGRlZmluZSBfcmF3X3JlYWRfbG9jayhyd2xvY2spCQlfX3Jhd19yZWFkX2xvY2soJihyd2xvY2spLT5yYXdfbG9jaykKKyMgZGVmaW5lIF9yYXdfd3JpdGVfbG9jayhyd2xvY2spCV9fcmF3X3dyaXRlX2xvY2soJihyd2xvY2spLT5yYXdfbG9jaykKKyMgZGVmaW5lIF9yYXdfcmVhZF91bmxvY2socndsb2NrKQlfX3Jhd19yZWFkX3VubG9jaygmKHJ3bG9jayktPnJhd19sb2NrKQorIyBkZWZpbmUgX3Jhd193cml0ZV91bmxvY2socndsb2NrKQlfX3Jhd193cml0ZV91bmxvY2soJihyd2xvY2spLT5yYXdfbG9jaykKKyMgZGVmaW5lIF9yYXdfcmVhZF90cnlsb2NrKHJ3bG9jaykJX19yYXdfcmVhZF90cnlsb2NrKCYocndsb2NrKS0+cmF3X2xvY2spCisjIGRlZmluZSBfcmF3X3dyaXRlX3RyeWxvY2socndsb2NrKQlfX3Jhd193cml0ZV90cnlsb2NrKCYocndsb2NrKS0+cmF3X2xvY2spCiAjZW5kaWYKIAotLyoKLSAqIElmIENPTkZJR19TTVAgaXMgdW5zZXQsIGRlY2xhcmUgdGhlIF9yYXdfKiBkZWZpbml0aW9ucyBhcyBub3BzCi0gKi8KLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQobG9jaykJZG8geyAodm9pZCkobG9jayk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgX3Jhd19zcGluX2xvY2sobG9jaykJZG8geyAodm9pZCkobG9jayk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgc3Bpbl9pc19sb2NrZWQobG9jaykJKCh2b2lkKShsb2NrKSwgMCkKLSNkZWZpbmUgYXNzZXJ0X3NwaW5fbG9ja2VkKGxvY2spCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlKDApCi0jZGVmaW5lIF9yYXdfc3Bpbl90cnlsb2NrKGxvY2spCSgoKHZvaWQpKGxvY2spLCAxKSkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdChsb2NrKQkodm9pZCkobG9jaykKLSNkZWZpbmUgX3Jhd19zcGluX3VubG9jayhsb2NrKSBkbyB7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSgwKQotI2VuZGlmIC8qIENPTkZJR19ERUJVR19TUElOTE9DSyAqLwotCi0vKiBSVyBzcGlubG9ja3M6IE5vIGRlYnVnIHZlcnNpb24gKi8KLQotI2lmIChfX0dOVUNfXyA+IDIpCi0gIHR5cGVkZWYgc3RydWN0IHsgfSByd2xvY2tfdDsKLSAgI2RlZmluZSBSV19MT0NLX1VOTE9DS0VEIChyd2xvY2tfdCkgeyB9Ci0jZWxzZQotICB0eXBlZGVmIHN0cnVjdCB7IGludCBnY2NfaXNfYnVnZ3k7IH0gcndsb2NrX3Q7Ci0gICNkZWZpbmUgUldfTE9DS19VTkxPQ0tFRCAocndsb2NrX3QpIHsgMCB9Ci0jZW5kaWYKLQotI2RlZmluZSByd2xvY2tfaW5pdChsb2NrKQlkbyB7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSgwKQotI2RlZmluZSBfcmF3X3JlYWRfbG9jayhsb2NrKQlkbyB7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSgwKQotI2RlZmluZSBfcmF3X3JlYWRfdW5sb2NrKGxvY2spCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlKDApCi0jZGVmaW5lIF9yYXdfd3JpdGVfbG9jayhsb2NrKQlkbyB7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSgwKQotI2RlZmluZSBfcmF3X3dyaXRlX3VubG9jayhsb2NrKQlkbyB7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSgwKQotI2RlZmluZSByZWFkX2Nhbl9sb2NrKGxvY2spCSgoKHZvaWQpKGxvY2spLCAxKSkKLSNkZWZpbmUgd3JpdGVfY2FuX2xvY2sobG9jaykJKCgodm9pZCkobG9jayksIDEpKQotI2RlZmluZSBfcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSAoeyAodm9pZCkobG9jayk7ICgxKTsgfSkKLSNkZWZpbmUgX3Jhd193cml0ZV90cnlsb2NrKGxvY2spICh7ICh2b2lkKShsb2NrKTsgKDEpOyB9KQotCi0jZGVmaW5lIF9zcGluX3RyeWxvY2sobG9jaykJKHtwcmVlbXB0X2Rpc2FibGUoKTsgX3Jhd19zcGluX3RyeWxvY2sobG9jaykgPyBcCi0JCQkJMSA6ICh7cHJlZW1wdF9lbmFibGUoKTsgMDt9KTt9KQotCi0jZGVmaW5lIF9yZWFkX3RyeWxvY2sobG9jaykJKHtwcmVlbXB0X2Rpc2FibGUoKTtfcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSA/IFwKLQkJCQkxIDogKHtwcmVlbXB0X2VuYWJsZSgpOyAwO30pO30pCi0KLSNkZWZpbmUgX3dyaXRlX3RyeWxvY2sobG9jaykJKHtwcmVlbXB0X2Rpc2FibGUoKTsgX3Jhd193cml0ZV90cnlsb2NrKGxvY2spID8gXAotCQkJCTEgOiAoe3ByZWVtcHRfZW5hYmxlKCk7IDA7fSk7fSkKLQotI2RlZmluZSBfc3Bpbl90cnlsb2NrX2JoKGxvY2spCSh7cHJlZW1wdF9kaXNhYmxlKCk7IGxvY2FsX2JoX2Rpc2FibGUoKTsgXAotCQkJCV9yYXdfc3Bpbl90cnlsb2NrKGxvY2spID8gXAotCQkJCTEgOiAoe3ByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsgbG9jYWxfYmhfZW5hYmxlKCk7IDA7fSk7fSkKLQotI2RlZmluZSBfc3Bpbl9sb2NrKGxvY2spCVwKLWRvIHsgXAotCXByZWVtcHRfZGlzYWJsZSgpOyBcCi0JX3Jhd19zcGluX2xvY2sobG9jayk7IFwKLQlfX2FjcXVpcmUobG9jayk7IFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBfd3JpdGVfbG9jayhsb2NrKSBcCi1kbyB7IFwKLQlwcmVlbXB0X2Rpc2FibGUoKTsgXAotCV9yYXdfd3JpdGVfbG9jayhsb2NrKTsgXAotCV9fYWNxdWlyZShsb2NrKTsgXAotfSB3aGlsZSgwKQotIAotI2RlZmluZSBfcmVhZF9sb2NrKGxvY2spCVwKLWRvIHsgXAotCXByZWVtcHRfZGlzYWJsZSgpOyBcCi0JX3Jhd19yZWFkX2xvY2sobG9jayk7IFwKLQlfX2FjcXVpcmUobG9jayk7IFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBfc3Bpbl91bmxvY2sobG9jaykgXAotZG8geyBcCi0JX3Jhd19zcGluX3VubG9jayhsb2NrKTsgXAotCXByZWVtcHRfZW5hYmxlKCk7IFwKLQlfX3JlbGVhc2UobG9jayk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3dyaXRlX3VubG9jayhsb2NrKSBcCi1kbyB7IFwKLQlfcmF3X3dyaXRlX3VubG9jayhsb2NrKTsgXAotCXByZWVtcHRfZW5hYmxlKCk7IFwKLQlfX3JlbGVhc2UobG9jayk7IFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBfcmVhZF91bmxvY2sobG9jaykgXAotZG8geyBcCi0JX3Jhd19yZWFkX3VubG9jayhsb2NrKTsgXAotCXByZWVtcHRfZW5hYmxlKCk7IFwKLQlfX3JlbGVhc2UobG9jayk7IFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBfc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpIFwKLWRvIHsJXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAotCXByZWVtcHRfZGlzYWJsZSgpOyBcCi0JX3Jhd19zcGluX2xvY2sobG9jayk7IFwKLQlfX2FjcXVpcmUobG9jayk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3NwaW5fbG9ja19pcnEobG9jaykgXAotZG8geyBcCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsgXAotCXByZWVtcHRfZGlzYWJsZSgpOyBcCi0JX3Jhd19zcGluX2xvY2sobG9jayk7IFwKLQlfX2FjcXVpcmUobG9jayk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3NwaW5fbG9ja19iaChsb2NrKSBcCi1kbyB7IFwKLQlsb2NhbF9iaF9kaXNhYmxlKCk7IFwKLQlwcmVlbXB0X2Rpc2FibGUoKTsgXAotCV9yYXdfc3Bpbl9sb2NrKGxvY2spOyBcCi0JX19hY3F1aXJlKGxvY2spOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9yZWFkX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykgXAotZG8gewlcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCi0JcHJlZW1wdF9kaXNhYmxlKCk7IFwKLQlfcmF3X3JlYWRfbG9jayhsb2NrKTsgXAotCV9fYWNxdWlyZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfcmVhZF9sb2NrX2lycShsb2NrKSBcCi1kbyB7IFwKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOyBcCi0JcHJlZW1wdF9kaXNhYmxlKCk7IFwKLQlfcmF3X3JlYWRfbG9jayhsb2NrKTsgXAotCV9fYWNxdWlyZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfcmVhZF9sb2NrX2JoKGxvY2spIFwKLWRvIHsgXAotCWxvY2FsX2JoX2Rpc2FibGUoKTsgXAotCXByZWVtcHRfZGlzYWJsZSgpOyBcCi0JX3Jhd19yZWFkX2xvY2sobG9jayk7IFwKLQlfX2FjcXVpcmUobG9jayk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3dyaXRlX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykgXAotZG8gewlcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCi0JcHJlZW1wdF9kaXNhYmxlKCk7IFwKLQlfcmF3X3dyaXRlX2xvY2sobG9jayk7IFwKLQlfX2FjcXVpcmUobG9jayk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3dyaXRlX2xvY2tfaXJxKGxvY2spIFwKLWRvIHsgXAotCWxvY2FsX2lycV9kaXNhYmxlKCk7IFwKLQlwcmVlbXB0X2Rpc2FibGUoKTsgXAotCV9yYXdfd3JpdGVfbG9jayhsb2NrKTsgXAotCV9fYWNxdWlyZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfd3JpdGVfbG9ja19iaChsb2NrKSBcCi1kbyB7IFwKLQlsb2NhbF9iaF9kaXNhYmxlKCk7IFwKLQlwcmVlbXB0X2Rpc2FibGUoKTsgXAotCV9yYXdfd3JpdGVfbG9jayhsb2NrKTsgXAotCV9fYWNxdWlyZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykgXAotZG8geyBcCi0JX3Jhd19zcGluX3VubG9jayhsb2NrKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAotCXByZWVtcHRfZW5hYmxlKCk7IFwKLQlfX3JlbGVhc2UobG9jayk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3NwaW5fdW5sb2NrX2lycShsb2NrKSBcCi1kbyB7IFwKLQlfcmF3X3NwaW5fdW5sb2NrKGxvY2spOyBcCi0JbG9jYWxfaXJxX2VuYWJsZSgpOyBcCi0JcHJlZW1wdF9lbmFibGUoKTsgXAotCV9fcmVsZWFzZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfc3Bpbl91bmxvY2tfYmgobG9jaykgXAotZG8geyBcCi0JX3Jhd19zcGluX3VubG9jayhsb2NrKTsgXAotCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsgXAotCWxvY2FsX2JoX2VuYWJsZSgpOyBcCi0JX19yZWxlYXNlKGxvY2spOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF93cml0ZV91bmxvY2tfYmgobG9jaykgXAotZG8geyBcCi0JX3Jhd193cml0ZV91bmxvY2sobG9jayk7IFwKLQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7IFwKLQlsb2NhbF9iaF9lbmFibGUoKTsgXAotCV9fcmVsZWFzZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfcmVhZF91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykgXAotZG8geyBcCi0JX3Jhd19yZWFkX3VubG9jayhsb2NrKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAotCXByZWVtcHRfZW5hYmxlKCk7IFwKLQlfX3JlbGVhc2UobG9jayk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3dyaXRlX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKSBcCi1kbyB7IFwKLQlfcmF3X3dyaXRlX3VubG9jayhsb2NrKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAotCXByZWVtcHRfZW5hYmxlKCk7IFwKLQlfX3JlbGVhc2UobG9jayk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3JlYWRfdW5sb2NrX2lycShsb2NrKQlcCi1kbyB7IFwKLQlfcmF3X3JlYWRfdW5sb2NrKGxvY2spOwlcCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwlcCi0JcHJlZW1wdF9lbmFibGUoKTsJXAotCV9fcmVsZWFzZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfcmVhZF91bmxvY2tfYmgobG9jaykJXAotZG8geyBcCi0JX3Jhd19yZWFkX3VubG9jayhsb2NrKTsJXAotCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsJXAotCWxvY2FsX2JoX2VuYWJsZSgpOwlcCi0JX19yZWxlYXNlKGxvY2spOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF93cml0ZV91bmxvY2tfaXJxKGxvY2spCVwKLWRvIHsgXAotCV9yYXdfd3JpdGVfdW5sb2NrKGxvY2spOwlcCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwlcCi0JcHJlZW1wdF9lbmFibGUoKTsJXAotCV9fcmVsZWFzZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmIC8qICFTTVAgKi8KKyNkZWZpbmUgcmVhZF9jYW5fbG9jayhyd2xvY2spCQlfX3Jhd19yZWFkX2Nhbl9sb2NrKCYocndsb2NrKS0+cmF3X2xvY2spCisjZGVmaW5lIHdyaXRlX2Nhbl9sb2NrKHJ3bG9jaykJCV9fcmF3X3dyaXRlX2Nhbl9sb2NrKCYocndsb2NrKS0+cmF3X2xvY2spCiAKIC8qCiAgKiBEZWZpbmUgdGhlIHZhcmlvdXMgc3Bpbl9sb2NrIGFuZCByd19sb2NrIG1ldGhvZHMuICBOb3RlIHdlIGRlZmluZSB0aGVzZQogICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIENPTkZJR19TTVAgb3IgQ09ORklHX1BSRUVNUFQgYXJlIHNldC4gVGhlIHZhcmlvdXMKICAqIG1ldGhvZHMgYXJlIGRlZmluZWQgYXMgbm9wcyBpbiB0aGUgY2FzZSB0aGV5IGFyZSBub3QgcmVxdWlyZWQuCiAgKi8KLSNkZWZpbmUgc3Bpbl90cnlsb2NrKGxvY2spCV9fY29uZF9sb2NrKF9zcGluX3RyeWxvY2sobG9jaykpCi0jZGVmaW5lIHJlYWRfdHJ5bG9jayhsb2NrKQlfX2NvbmRfbG9jayhfcmVhZF90cnlsb2NrKGxvY2spKQotI2RlZmluZSB3cml0ZV90cnlsb2NrKGxvY2spCV9fY29uZF9sb2NrKF93cml0ZV90cnlsb2NrKGxvY2spKQorI2RlZmluZSBzcGluX3RyeWxvY2sobG9jaykJCV9fY29uZF9sb2NrKF9zcGluX3RyeWxvY2sobG9jaykpCisjZGVmaW5lIHJlYWRfdHJ5bG9jayhsb2NrKQkJX19jb25kX2xvY2soX3JlYWRfdHJ5bG9jayhsb2NrKSkKKyNkZWZpbmUgd3JpdGVfdHJ5bG9jayhsb2NrKQkJX19jb25kX2xvY2soX3dyaXRlX3RyeWxvY2sobG9jaykpCiAKLSNkZWZpbmUgc3Bpbl9sb2NrKGxvY2spCQlfc3Bpbl9sb2NrKGxvY2spCi0jZGVmaW5lIHdyaXRlX2xvY2sobG9jaykJX3dyaXRlX2xvY2sobG9jaykKLSNkZWZpbmUgcmVhZF9sb2NrKGxvY2spCQlfcmVhZF9sb2NrKGxvY2spCisjZGVmaW5lIHNwaW5fbG9jayhsb2NrKQkJCV9zcGluX2xvY2sobG9jaykKKyNkZWZpbmUgd3JpdGVfbG9jayhsb2NrKQkJX3dyaXRlX2xvY2sobG9jaykKKyNkZWZpbmUgcmVhZF9sb2NrKGxvY2spCQkJX3JlYWRfbG9jayhsb2NrKQogCi0jaWZkZWYgQ09ORklHX1NNUAorI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfU1BJTkxPQ0spCiAjZGVmaW5lIHNwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKQlmbGFncyA9IF9zcGluX2xvY2tfaXJxc2F2ZShsb2NrKQogI2RlZmluZSByZWFkX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykJZmxhZ3MgPSBfcmVhZF9sb2NrX2lycXNhdmUobG9jaykKICNkZWZpbmUgd3JpdGVfbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKQlmbGFncyA9IF93cml0ZV9sb2NrX2lycXNhdmUobG9jaykKQEAgLTQ3MCwxMzcgKzE3MSw1OSBAQAogI2RlZmluZSB3cml0ZV9sb2NrX2lycShsb2NrKQkJX3dyaXRlX2xvY2tfaXJxKGxvY2spCiAjZGVmaW5lIHdyaXRlX2xvY2tfYmgobG9jaykJCV93cml0ZV9sb2NrX2JoKGxvY2spCiAKLSNkZWZpbmUgc3Bpbl91bmxvY2sobG9jaykJX3NwaW5fdW5sb2NrKGxvY2spCi0jZGVmaW5lIHdyaXRlX3VubG9jayhsb2NrKQlfd3JpdGVfdW5sb2NrKGxvY2spCi0jZGVmaW5lIHJlYWRfdW5sb2NrKGxvY2spCV9yZWFkX3VubG9jayhsb2NrKQorI2RlZmluZSBzcGluX3VubG9jayhsb2NrKQkJX3NwaW5fdW5sb2NrKGxvY2spCisjZGVmaW5lIHdyaXRlX3VubG9jayhsb2NrKQkJX3dyaXRlX3VubG9jayhsb2NrKQorI2RlZmluZSByZWFkX3VubG9jayhsb2NrKQkJX3JlYWRfdW5sb2NrKGxvY2spCiAKLSNkZWZpbmUgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykJX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpCisjZGVmaW5lIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpIFwKKwkJCQkJX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpCiAjZGVmaW5lIHNwaW5fdW5sb2NrX2lycShsb2NrKQkJX3NwaW5fdW5sb2NrX2lycShsb2NrKQogI2RlZmluZSBzcGluX3VubG9ja19iaChsb2NrKQkJX3NwaW5fdW5sb2NrX2JoKGxvY2spCiAKLSNkZWZpbmUgcmVhZF91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykJX3JlYWRfdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpCi0jZGVmaW5lIHJlYWRfdW5sb2NrX2lycShsb2NrKQkJCV9yZWFkX3VubG9ja19pcnEobG9jaykKLSNkZWZpbmUgcmVhZF91bmxvY2tfYmgobG9jaykJCQlfcmVhZF91bmxvY2tfYmgobG9jaykKKyNkZWZpbmUgcmVhZF91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykgXAorCQkJCQlfcmVhZF91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykKKyNkZWZpbmUgcmVhZF91bmxvY2tfaXJxKGxvY2spCQlfcmVhZF91bmxvY2tfaXJxKGxvY2spCisjZGVmaW5lIHJlYWRfdW5sb2NrX2JoKGxvY2spCQlfcmVhZF91bmxvY2tfYmgobG9jaykKIAotI2RlZmluZSB3cml0ZV91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykJX3dyaXRlX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKQotI2RlZmluZSB3cml0ZV91bmxvY2tfaXJxKGxvY2spCQkJX3dyaXRlX3VubG9ja19pcnEobG9jaykKLSNkZWZpbmUgd3JpdGVfdW5sb2NrX2JoKGxvY2spCQkJX3dyaXRlX3VubG9ja19iaChsb2NrKQorI2RlZmluZSB3cml0ZV91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykgXAorCQkJCQlfd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpCisjZGVmaW5lIHdyaXRlX3VubG9ja19pcnEobG9jaykJCV93cml0ZV91bmxvY2tfaXJxKGxvY2spCisjZGVmaW5lIHdyaXRlX3VubG9ja19iaChsb2NrKQkJX3dyaXRlX3VubG9ja19iaChsb2NrKQogCi0jZGVmaW5lIHNwaW5fdHJ5bG9ja19iaChsb2NrKQkJCV9fY29uZF9sb2NrKF9zcGluX3RyeWxvY2tfYmgobG9jaykpCisjZGVmaW5lIHNwaW5fdHJ5bG9ja19iaChsb2NrKQkJX19jb25kX2xvY2soX3NwaW5fdHJ5bG9ja19iaChsb2NrKSkKIAogI2RlZmluZSBzcGluX3RyeWxvY2tfaXJxKGxvY2spIFwKICh7IFwKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOyBcCiAJX3NwaW5fdHJ5bG9jayhsb2NrKSA/IFwKLQkxIDogKHtsb2NhbF9pcnFfZW5hYmxlKCk7IDA7IH0pOyBcCisJMSA6ICh7IGxvY2FsX2lycV9lbmFibGUoKTsgMDsgIH0pOyBcCiB9KQogCiAjZGVmaW5lIHNwaW5fdHJ5bG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKSBcCiAoeyBcCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCiAJX3NwaW5fdHJ5bG9jayhsb2NrKSA/IFwKLQkxIDogKHtsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IDA7fSk7IFwKKwkxIDogKHsgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyAwOyB9KTsgXAogfSkKIAotI2lmZGVmIENPTkZJR19MT0NLTUVURVIKLWV4dGVybiB2b2lkIF9tZXRlcmVkX3NwaW5fbG9jayAgIChzcGlubG9ja190ICpsb2NrKTsKLWV4dGVybiB2b2lkIF9tZXRlcmVkX3NwaW5fdW5sb2NrIChzcGlubG9ja190ICpsb2NrKTsKLWV4dGVybiBpbnQgIF9tZXRlcmVkX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKTsKLWV4dGVybiB2b2lkIF9tZXRlcmVkX3JlYWRfbG9jayAgICAocndsb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgX21ldGVyZWRfcmVhZF91bmxvY2sgIChyd2xvY2tfdCAqbG9jayk7Ci1leHRlcm4gdm9pZCBfbWV0ZXJlZF93cml0ZV9sb2NrICAgKHJ3bG9ja190ICpsb2NrKTsKLWV4dGVybiB2b2lkIF9tZXRlcmVkX3dyaXRlX3VubG9jayAocndsb2NrX3QgKmxvY2spOwotZXh0ZXJuIGludCAgX21ldGVyZWRfcmVhZF90cnlsb2NrIChyd2xvY2tfdCAqbG9jayk7Ci1leHRlcm4gaW50ICBfbWV0ZXJlZF93cml0ZV90cnlsb2NrKHJ3bG9ja190ICpsb2NrKTsKLSNlbmRpZgotCi0vKiAibG9jayBvbiByZWZlcmVuY2UgY291bnQgemVybyIgKi8KLSNpZm5kZWYgQVRPTUlDX0RFQ19BTkRfTE9DSworLyoKKyAqIFB1bGwgdGhlIGF0b21pY190IGRlY2xhcmF0aW9uOgorICogKGFzbS1taXBzL2F0b21pYy5oIG5lZWRzIGFib3ZlIGRlZmluaXRpb25zKQorICovCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorLyoqCisgKiBhdG9taWNfZGVjX2FuZF9sb2NrIC0gbG9jayBvbiByZWFjaGluZyByZWZlcmVuY2UgY291bnQgemVybworICogQGF0b21pYzogdGhlIGF0b21pYyBjb3VudGVyCisgKiBAbG9jazogdGhlIHNwaW5sb2NrIGluIHF1ZXN0aW9uCisgKi8KIGV4dGVybiBpbnQgX2F0b21pY19kZWNfYW5kX2xvY2soYXRvbWljX3QgKmF0b21pYywgc3BpbmxvY2tfdCAqbG9jayk7Ci0jZW5kaWYKLQotI2RlZmluZSBhdG9taWNfZGVjX2FuZF9sb2NrKGF0b21pYyxsb2NrKSBfX2NvbmRfbG9jayhfYXRvbWljX2RlY19hbmRfbG9jayhhdG9taWMsbG9jaykpCi0KLS8qCi0gKiAgYml0LWJhc2VkIHNwaW5fbG9jaygpCi0gKgotICogRG9uJ3QgdXNlIHRoaXMgdW5sZXNzIHlvdSByZWFsbHkgbmVlZCB0bzogc3Bpbl9sb2NrKCkgYW5kIHNwaW5fdW5sb2NrKCkKLSAqIGFyZSBzaWduaWZpY2FudGx5IGZhc3Rlci4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGJpdF9zcGluX2xvY2soaW50IGJpdG51bSwgdW5zaWduZWQgbG9uZyAqYWRkcikKLXsKLQkvKgotCSAqIEFzc3VtaW5nIHRoZSBsb2NrIGlzIHVuY29udGVuZGVkLCB0aGlzIG5ldmVyIGVudGVycwotCSAqIHRoZSBib2R5IG9mIHRoZSBvdXRlciBsb29wLiBJZiBpdCBpcyBjb250ZW5kZWQsIHRoZW4KLQkgKiB3aXRoaW4gdGhlIGlubmVyIGxvb3AgYSBub24tYXRvbWljIHRlc3QgaXMgdXNlZCB0bwotCSAqIGJ1c3l3YWl0IHdpdGggbGVzcyBidXMgY29udGVudGlvbiBmb3IgYSBnb29kIHRpbWUgdG8KLQkgKiBhdHRlbXB0IHRvIGFjcXVpcmUgdGhlIGxvY2sgYml0LgotCSAqLwotCXByZWVtcHRfZGlzYWJsZSgpOwotI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfU1BJTkxPQ0spCi0Jd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoYml0bnVtLCBhZGRyKSkgewotCQl3aGlsZSAodGVzdF9iaXQoYml0bnVtLCBhZGRyKSkgewotCQkJcHJlZW1wdF9lbmFibGUoKTsKLQkJCWNwdV9yZWxheCgpOwotCQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCX0KLQl9Ci0jZW5kaWYKLQlfX2FjcXVpcmUoYml0bG9jayk7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gdHJ1ZSBpZiBpdCB3YXMgYWNxdWlyZWQKLSAqLwotc3RhdGljIGlubGluZSBpbnQgYml0X3NwaW5fdHJ5bG9jayhpbnQgYml0bnVtLCB1bnNpZ25lZCBsb25nICphZGRyKQotewotCXByZWVtcHRfZGlzYWJsZSgpOwkKLSNpZiBkZWZpbmVkKENPTkZJR19TTVApIHx8IGRlZmluZWQoQ09ORklHX0RFQlVHX1NQSU5MT0NLKQotCWlmICh0ZXN0X2FuZF9zZXRfYml0KGJpdG51bSwgYWRkcikpIHsKLQkJcHJlZW1wdF9lbmFibGUoKTsKLQkJcmV0dXJuIDA7Ci0JfQotI2VuZGlmCi0JX19hY3F1aXJlKGJpdGxvY2spOwotCXJldHVybiAxOwotfQotCi0vKgotICogIGJpdC1iYXNlZCBzcGluX3VubG9jaygpCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBiaXRfc3Bpbl91bmxvY2soaW50IGJpdG51bSwgdW5zaWduZWQgbG9uZyAqYWRkcikKLXsKLSNpZiBkZWZpbmVkKENPTkZJR19TTVApIHx8IGRlZmluZWQoQ09ORklHX0RFQlVHX1NQSU5MT0NLKQotCUJVR19PTighdGVzdF9iaXQoYml0bnVtLCBhZGRyKSk7Ci0Jc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCk7Ci0JY2xlYXJfYml0KGJpdG51bSwgYWRkcik7Ci0jZW5kaWYKLQlwcmVlbXB0X2VuYWJsZSgpOwotCV9fcmVsZWFzZShiaXRsb2NrKTsKLX0KLQotLyoKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBsb2NrIGlzIGhlbGQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGJpdF9zcGluX2lzX2xvY2tlZChpbnQgYml0bnVtLCB1bnNpZ25lZCBsb25nICphZGRyKQotewotI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfU1BJTkxPQ0spCi0JcmV0dXJuIHRlc3RfYml0KGJpdG51bSwgYWRkcik7Ci0jZWxpZiBkZWZpbmVkIENPTkZJR19QUkVFTVBUCi0JcmV0dXJuIHByZWVtcHRfY291bnQoKTsKLSNlbHNlCi0JcmV0dXJuIDE7Ci0jZW5kaWYKLX0KLQotI2RlZmluZSBERUZJTkVfU1BJTkxPQ0soeCkgc3BpbmxvY2tfdCB4ID0gU1BJTl9MT0NLX1VOTE9DS0VECi0jZGVmaW5lIERFRklORV9SV0xPQ0soeCkgcndsb2NrX3QgeCA9IFJXX0xPQ0tfVU5MT0NLRUQKKyNkZWZpbmUgYXRvbWljX2RlY19hbmRfbG9jayhhdG9taWMsIGxvY2spIFwKKwkJX19jb25kX2xvY2soX2F0b21pY19kZWNfYW5kX2xvY2soYXRvbWljLCBsb2NrKSkKIAogLyoqCiAgKiBzcGluX2Nhbl9sb2NrIC0gd291bGQgc3Bpbl90cnlsb2NrKCkgc3VjY2VlZD8KICAqIEBsb2NrOiB0aGUgc3BpbmxvY2sgaW4gcXVlc3Rpb24uCiAgKi8KLSNkZWZpbmUgc3Bpbl9jYW5fbG9jayhsb2NrKQkJKCFzcGluX2lzX2xvY2tlZChsb2NrKSkKKyNkZWZpbmUgc3Bpbl9jYW5fbG9jayhsb2NrKQkoIXNwaW5faXNfbG9ja2VkKGxvY2spKQogCiAjZW5kaWYgLyogX19MSU5VWF9TUElOTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX2FwaV9zbXAuaCBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfYXBpX3NtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZTY5ODkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX2FwaV9zbXAuaApAQCAtMCwwICsxLDU3IEBACisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfQVBJX1NNUF9ICisjZGVmaW5lIF9fTElOVVhfU1BJTkxPQ0tfQVBJX1NNUF9ICisKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19ICisjIGVycm9yICJwbGVhc2UgZG9uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkiCisjZW5kaWYKKworLyoKKyAqIGluY2x1ZGUvbGludXgvc3BpbmxvY2tfYXBpX3NtcC5oCisgKgorICogc3BpbmxvY2sgQVBJIGRlY2xhcmF0aW9ucyBvbiBTTVAgKGFuZCBkZWJ1ZykKKyAqIChpbXBsZW1lbnRlZCBpbiBrZXJuZWwvc3BpbmxvY2suYykKKyAqCisgKiBwb3J0aW9ucyBDb3B5cmlnaHQgMjAwNSwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLgorICovCisKK2ludCBpbl9sb2NrX2Z1bmN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHIpOworCisjZGVmaW5lIGFzc2VydF9zcGluX2xvY2tlZCh4KQlCVUdfT04oIXNwaW5faXNfbG9ja2VkKHgpKQorCit2b2lkIF9fbG9ja2Z1bmMgX3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrKQkJX19hY3F1aXJlcyhzcGlubG9ja190KTsKK3ZvaWQgX19sb2NrZnVuYyBfcmVhZF9sb2NrKHJ3bG9ja190ICpsb2NrKQkJX19hY3F1aXJlcyhyd2xvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3dyaXRlX2xvY2socndsb2NrX3QgKmxvY2spCQlfX2FjcXVpcmVzKHJ3bG9ja190KTsKK3ZvaWQgX19sb2NrZnVuYyBfc3Bpbl9sb2NrX2JoKHNwaW5sb2NrX3QgKmxvY2spCQlfX2FjcXVpcmVzKHNwaW5sb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF9yZWFkX2xvY2tfYmgocndsb2NrX3QgKmxvY2spCQlfX2FjcXVpcmVzKHJ3bG9ja190KTsKK3ZvaWQgX19sb2NrZnVuYyBfd3JpdGVfbG9ja19iaChyd2xvY2tfdCAqbG9jaykJCV9fYWNxdWlyZXMocndsb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF9zcGluX2xvY2tfaXJxKHNwaW5sb2NrX3QgKmxvY2spCV9fYWNxdWlyZXMoc3BpbmxvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3JlYWRfbG9ja19pcnEocndsb2NrX3QgKmxvY2spCQlfX2FjcXVpcmVzKHJ3bG9ja190KTsKK3ZvaWQgX19sb2NrZnVuYyBfd3JpdGVfbG9ja19pcnEocndsb2NrX3QgKmxvY2spCQlfX2FjcXVpcmVzKHJ3bG9ja190KTsKK3Vuc2lnbmVkIGxvbmcgX19sb2NrZnVuYyBfc3Bpbl9sb2NrX2lycXNhdmUoc3BpbmxvY2tfdCAqbG9jaykKKwkJCQkJCQlfX2FjcXVpcmVzKHNwaW5sb2NrX3QpOwordW5zaWduZWQgbG9uZyBfX2xvY2tmdW5jIF9yZWFkX2xvY2tfaXJxc2F2ZShyd2xvY2tfdCAqbG9jaykKKwkJCQkJCQlfX2FjcXVpcmVzKHJ3bG9ja190KTsKK3Vuc2lnbmVkIGxvbmcgX19sb2NrZnVuYyBfd3JpdGVfbG9ja19pcnFzYXZlKHJ3bG9ja190ICpsb2NrKQorCQkJCQkJCV9fYWNxdWlyZXMocndsb2NrX3QpOworaW50IF9fbG9ja2Z1bmMgX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKTsKK2ludCBfX2xvY2tmdW5jIF9yZWFkX3RyeWxvY2socndsb2NrX3QgKmxvY2spOworaW50IF9fbG9ja2Z1bmMgX3dyaXRlX3RyeWxvY2socndsb2NrX3QgKmxvY2spOworaW50IF9fbG9ja2Z1bmMgX3NwaW5fdHJ5bG9ja19iaChzcGlubG9ja190ICpsb2NrKTsKK3ZvaWQgX19sb2NrZnVuYyBfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaykJCV9fcmVsZWFzZXMoc3BpbmxvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3JlYWRfdW5sb2NrKHJ3bG9ja190ICpsb2NrKQkJX19yZWxlYXNlcyhyd2xvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3dyaXRlX3VubG9jayhyd2xvY2tfdCAqbG9jaykJCV9fcmVsZWFzZXMocndsb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF9zcGluX3VubG9ja19iaChzcGlubG9ja190ICpsb2NrKQlfX3JlbGVhc2VzKHNwaW5sb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF9yZWFkX3VubG9ja19iaChyd2xvY2tfdCAqbG9jaykJCV9fcmVsZWFzZXMocndsb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF93cml0ZV91bmxvY2tfYmgocndsb2NrX3QgKmxvY2spCV9fcmVsZWFzZXMocndsb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF9zcGluX3VubG9ja19pcnEoc3BpbmxvY2tfdCAqbG9jaykJX19yZWxlYXNlcyhzcGlubG9ja190KTsKK3ZvaWQgX19sb2NrZnVuYyBfcmVhZF91bmxvY2tfaXJxKHJ3bG9ja190ICpsb2NrKQlfX3JlbGVhc2VzKHJ3bG9ja190KTsKK3ZvaWQgX19sb2NrZnVuYyBfd3JpdGVfdW5sb2NrX2lycShyd2xvY2tfdCAqbG9jaykJX19yZWxlYXNlcyhyd2xvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykKKwkJCQkJCQlfX3JlbGVhc2VzKHNwaW5sb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF9yZWFkX3VubG9ja19pcnFyZXN0b3JlKHJ3bG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCQkJCQkJCV9fcmVsZWFzZXMocndsb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF93cml0ZV91bmxvY2tfaXJxcmVzdG9yZShyd2xvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykKKwkJCQkJCQlfX3JlbGVhc2VzKHJ3bG9ja190KTsKKworI2VuZGlmIC8qIF9fTElOVVhfU1BJTkxPQ0tfQVBJX1NNUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX2FwaV91cC5oIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja19hcGlfdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDgxY2VlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja19hcGlfdXAuaApAQCAtMCwwICsxLDgwIEBACisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfQVBJX1VQX0gKKyNkZWZpbmUgX19MSU5VWF9TUElOTE9DS19BUElfVVBfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3NwaW5sb2NrX2FwaV91cC5oCisgKgorICogc3BpbmxvY2sgQVBJIGltcGxlbWVudGF0aW9uIG9uIFVQLW5vbmRlYnVnIChpbmxpbmVkIGltcGxlbWVudGF0aW9uKQorICoKKyAqIHBvcnRpb25zIENvcHlyaWdodCAyMDA1LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkuCisgKi8KKworI2RlZmluZSBpbl9sb2NrX2Z1bmN0aW9ucyhBRERSKQkJMAorCisjZGVmaW5lIGFzc2VydF9zcGluX2xvY2tlZChsb2NrKQlkbyB7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSAoMCkKKworLyoKKyAqIEluIHRoZSBVUC1ub25kZWJ1ZyBjYXNlIHRoZXJlJ3Mgbm8gcmVhbCBsb2NraW5nIGdvaW5nIG9uLCBzbyB0aGUKKyAqIG9ubHkgdGhpbmcgd2UgaGF2ZSB0byBkbyBpcyB0byBrZWVwIHRoZSBwcmVlbXB0IGNvdW50cyBhbmQgaXJxCisgKiBmbGFncyBzdHJhaWdodCwgdG8gc3VwcmVzcyBjb21waWxlciB3YXJuaW5ncyBvZiB1bnVzZWQgbG9jaworICogdmFyaWFibGVzLCBhbmQgdG8gYWRkIHRoZSBwcm9wZXIgY2hlY2tlciBhbm5vdGF0aW9uczoKKyAqLworI2RlZmluZSBfX0xPQ0sobG9jaykgXAorICBkbyB7IHByZWVtcHRfZGlzYWJsZSgpOyBfX2FjcXVpcmUobG9jayk7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0xPQ0tfQkgobG9jaykgXAorICBkbyB7IGxvY2FsX2JoX2Rpc2FibGUoKTsgX19MT0NLKGxvY2spOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fTE9DS19JUlEobG9jaykgXAorICBkbyB7IGxvY2FsX2lycV9kaXNhYmxlKCk7IF9fTE9DSyhsb2NrKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0xPQ0tfSVJRU0FWRShsb2NrLCBmbGFncykgXAorICBkbyB7IGxvY2FsX2lycV9zYXZlKGZsYWdzKTsgX19MT0NLKGxvY2spOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fVU5MT0NLKGxvY2spIFwKKyAgZG8geyBwcmVlbXB0X2VuYWJsZSgpOyBfX3JlbGVhc2UobG9jayk7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX1VOTE9DS19CSChsb2NrKSBcCisgIGRvIHsgcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOyBsb2NhbF9iaF9lbmFibGUoKTsgX19yZWxlYXNlKGxvY2spOyAodm9pZCkobG9jayk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19VTkxPQ0tfSVJRKGxvY2spIFwKKyAgZG8geyBsb2NhbF9pcnFfZW5hYmxlKCk7IF9fVU5MT0NLKGxvY2spOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fVU5MT0NLX0lSUVJFU1RPUkUobG9jaywgZmxhZ3MpIFwKKyAgZG8geyBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IF9fVU5MT0NLKGxvY2spOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9zcGluX2xvY2sobG9jaykJCQlfX0xPQ0sobG9jaykKKyNkZWZpbmUgX3JlYWRfbG9jayhsb2NrKQkJCV9fTE9DSyhsb2NrKQorI2RlZmluZSBfd3JpdGVfbG9jayhsb2NrKQkJCV9fTE9DSyhsb2NrKQorI2RlZmluZSBfc3Bpbl9sb2NrX2JoKGxvY2spCQkJX19MT0NLX0JIKGxvY2spCisjZGVmaW5lIF9yZWFkX2xvY2tfYmgobG9jaykJCQlfX0xPQ0tfQkgobG9jaykKKyNkZWZpbmUgX3dyaXRlX2xvY2tfYmgobG9jaykJCQlfX0xPQ0tfQkgobG9jaykKKyNkZWZpbmUgX3NwaW5fbG9ja19pcnEobG9jaykJCQlfX0xPQ0tfSVJRKGxvY2spCisjZGVmaW5lIF9yZWFkX2xvY2tfaXJxKGxvY2spCQkJX19MT0NLX0lSUShsb2NrKQorI2RlZmluZSBfd3JpdGVfbG9ja19pcnEobG9jaykJCQlfX0xPQ0tfSVJRKGxvY2spCisjZGVmaW5lIF9zcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykJCV9fTE9DS19JUlFTQVZFKGxvY2ssIGZsYWdzKQorI2RlZmluZSBfcmVhZF9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpCQlfX0xPQ0tfSVJRU0FWRShsb2NrLCBmbGFncykKKyNkZWZpbmUgX3dyaXRlX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykJX19MT0NLX0lSUVNBVkUobG9jaywgZmxhZ3MpCisjZGVmaW5lIF9zcGluX3RyeWxvY2sobG9jaykJCQkoeyBfX0xPQ0sobG9jayk7IDE7IH0pCisjZGVmaW5lIF9yZWFkX3RyeWxvY2sobG9jaykJCQkoeyBfX0xPQ0sobG9jayk7IDE7IH0pCisjZGVmaW5lIF93cml0ZV90cnlsb2NrKGxvY2spCQkJKHsgX19MT0NLKGxvY2spOyAxOyB9KQorI2RlZmluZSBfc3Bpbl90cnlsb2NrX2JoKGxvY2spCQkJKHsgX19MT0NLX0JIKGxvY2spOyAxOyB9KQorI2RlZmluZSBfc3Bpbl91bmxvY2sobG9jaykJCQlfX1VOTE9DSyhsb2NrKQorI2RlZmluZSBfcmVhZF91bmxvY2sobG9jaykJCQlfX1VOTE9DSyhsb2NrKQorI2RlZmluZSBfd3JpdGVfdW5sb2NrKGxvY2spCQkJX19VTkxPQ0sobG9jaykKKyNkZWZpbmUgX3NwaW5fdW5sb2NrX2JoKGxvY2spCQkJX19VTkxPQ0tfQkgobG9jaykKKyNkZWZpbmUgX3dyaXRlX3VubG9ja19iaChsb2NrKQkJCV9fVU5MT0NLX0JIKGxvY2spCisjZGVmaW5lIF9yZWFkX3VubG9ja19iaChsb2NrKQkJCV9fVU5MT0NLX0JIKGxvY2spCisjZGVmaW5lIF9zcGluX3VubG9ja19pcnEobG9jaykJCQlfX1VOTE9DS19JUlEobG9jaykKKyNkZWZpbmUgX3JlYWRfdW5sb2NrX2lycShsb2NrKQkJCV9fVU5MT0NLX0lSUShsb2NrKQorI2RlZmluZSBfd3JpdGVfdW5sb2NrX2lycShsb2NrKQkJCV9fVU5MT0NLX0lSUShsb2NrKQorI2RlZmluZSBfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykJX19VTkxPQ0tfSVJRUkVTVE9SRShsb2NrLCBmbGFncykKKyNkZWZpbmUgX3JlYWRfdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpCV9fVU5MT0NLX0lSUVJFU1RPUkUobG9jaywgZmxhZ3MpCisjZGVmaW5lIF93cml0ZV91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykJX19VTkxPQ0tfSVJRUkVTVE9SRShsb2NrLCBmbGFncykKKworI2VuZGlmIC8qIF9fTElOVVhfU1BJTkxPQ0tfQVBJX1VQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2I1MWUwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja190eXBlcy5oCkBAIC0wLDAgKzEsNjcgQEAKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorCisvKgorICogaW5jbHVkZS9saW51eC9zcGlubG9ja190eXBlcy5oIC0gZ2VuZXJpYyBzcGlubG9jayB0eXBlIGRlZmluaXRpb25zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaW5pdGlhbGl6ZXJzCisgKgorICogcG9ydGlvbnMgQ29weXJpZ2h0IDIwMDUsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKS4KKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU01QKQorIyBpbmNsdWRlIDxhc20vc3BpbmxvY2tfdHlwZXMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGxpbnV4L3NwaW5sb2NrX3R5cGVzX3VwLmg+CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXJhd19zcGlubG9ja190IHJhd19sb2NrOworI2lmIGRlZmluZWQoQ09ORklHX1BSRUVNUFQpICYmIGRlZmluZWQoQ09ORklHX1NNUCkKKwl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSworCXVuc2lnbmVkIGludCBtYWdpYywgb3duZXJfY3B1OworCXZvaWQgKm93bmVyOworI2VuZGlmCit9IHNwaW5sb2NrX3Q7CisKKyNkZWZpbmUgU1BJTkxPQ0tfTUFHSUMJCTB4ZGVhZDRlYWQKKwordHlwZWRlZiBzdHJ1Y3QgeworCXJhd19yd2xvY2tfdCByYXdfbG9jazsKKyNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKSAmJiBkZWZpbmVkKENPTkZJR19TTVApCisJdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKKwl1bnNpZ25lZCBpbnQgbWFnaWMsIG93bmVyX2NwdTsKKwl2b2lkICpvd25lcjsKKyNlbmRpZgorfSByd2xvY2tfdDsKKworI2RlZmluZSBSV0xPQ0tfTUFHSUMJCTB4ZGVhZjFlZWQKKworI2RlZmluZSBTUElOTE9DS19PV05FUl9JTklUCSgodm9pZCAqKS0xTCkKKworI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSworIyBkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VECQkJCQkJXAorCShzcGlubG9ja190KQl7CS5yYXdfbG9jayA9IF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRCwJXAorCQkJCS5tYWdpYyA9IFNQSU5MT0NLX01BR0lDLAkJXAorCQkJCS5vd25lciA9IFNQSU5MT0NLX09XTkVSX0lOSVQsCQlcCisJCQkJLm93bmVyX2NwdSA9IC0xIH0KKyNkZWZpbmUgUldfTE9DS19VTkxPQ0tFRAkJCQkJCVwKKwkocndsb2NrX3QpCXsJLnJhd19sb2NrID0gX19SQVdfUldfTE9DS19VTkxPQ0tFRCwJXAorCQkJCS5tYWdpYyA9IFJXTE9DS19NQUdJQywJCQlcCisJCQkJLm93bmVyID0gU1BJTkxPQ0tfT1dORVJfSU5JVCwJCVwKKwkJCQkub3duZXJfY3B1ID0gLTEgfQorI2Vsc2UKKyMgZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRCBcCisJKHNwaW5sb2NrX3QpCXsJLnJhd19sb2NrID0gX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEIH0KKyNkZWZpbmUgUldfTE9DS19VTkxPQ0tFRCBcCisJKHJ3bG9ja190KQl7CS5yYXdfbG9jayA9IF9fUkFXX1JXX0xPQ0tfVU5MT0NLRUQgfQorI2VuZGlmCisKKyNkZWZpbmUgREVGSU5FX1NQSU5MT0NLKHgpCXNwaW5sb2NrX3QgeCA9IFNQSU5fTE9DS19VTkxPQ0tFRAorI2RlZmluZSBERUZJTkVfUldMT0NLKHgpCXJ3bG9ja190IHggPSBSV19MT0NLX1VOTE9DS0VECisKKyNlbmRpZiAvKiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfdHlwZXNfdXAuaCBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfdHlwZXNfdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWYyZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja190eXBlc191cC5oCkBAIC0wLDAgKzEsNTEgQEAKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19UWVBFU19VUF9ICisjZGVmaW5lIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfVVBfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3NwaW5sb2NrX3R5cGVzX3VwLmggLSBzcGlubG9jayB0eXBlIGRlZmluaXRpb25zIGZvciBVUAorICoKKyAqIHBvcnRpb25zIENvcHlyaWdodCAyMDA1LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkuCisgKi8KKworI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSworCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNsb2NrOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQgeyAxIH0KKworI2Vsc2UKKworLyoKKyAqIEFsbCBnY2MgMi45NSB2ZXJzaW9ucyBhbmQgZWFybHkgdmVyc2lvbnMgb2YgMi45NiBoYXZlIGEgbmFzdHkgYnVnCisgKiB3aXRoIGVtcHR5IGluaXRpYWxpemVycy4KKyAqLworI2lmIChfX0dOVUNfXyA+IDIpCit0eXBlZGVmIHN0cnVjdCB7IH0gcmF3X3NwaW5sb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEIHsgfQorI2Vsc2UKK3R5cGVkZWYgc3RydWN0IHsgaW50IGdjY19pc19idWdneTsgfSByYXdfc3BpbmxvY2tfdDsKKyNkZWZpbmUgX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEIChyYXdfc3BpbmxvY2tfdCkgeyAwIH0KKyNlbmRpZgorCisjZW5kaWYKKworI2lmIChfX0dOVUNfXyA+IDIpCit0eXBlZGVmIHN0cnVjdCB7CisJLyogbm8gZGVidWcgdmVyc2lvbiBvbiBVUCAqLworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRCB7IH0KKyNlbHNlCit0eXBlZGVmIHN0cnVjdCB7IGludCBnY2NfaXNfYnVnZ3k7IH0gcmF3X3J3bG9ja190OworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VEIChyYXdfcndsb2NrX3QpIHsgMCB9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGlubG9ja191cC5oIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja191cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYWNjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX3VwLmgKQEAgLTAsMCArMSw3NCBAQAorI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1VQX0gKKyNkZWZpbmUgX19MSU5VWF9TUElOTE9DS19VUF9ICisKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19ICisjIGVycm9yICJwbGVhc2UgZG9uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkiCisjZW5kaWYKKworLyoKKyAqIGluY2x1ZGUvbGludXgvc3BpbmxvY2tfdXAuaCAtIFVQLWRlYnVnIHZlcnNpb24gb2Ygc3BpbmxvY2tzLgorICoKKyAqIHBvcnRpb25zIENvcHlyaWdodCAyMDA1LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkuCisgKgorICogSW4gdGhlIGRlYnVnIGNhc2UsIDEgbWVhbnMgdW5sb2NrZWQsIDAgbWVhbnMgbG9ja2VkLiAodGhlIHZhbHVlcworICogYXJlIGludmVydGVkLCB0byBjYXRjaCBpbml0aWFsaXphdGlvbiBidWdzKQorICoKKyAqIE5vIGF0b21pY2l0eSBhbnl3aGVyZSwgd2UgYXJlIG9uIFVQLgorICovCisKKyNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKKworI2RlZmluZSBfX3Jhd19zcGluX2lzX2xvY2tlZCh4KQkJKCh4KS0+c2xvY2sgPT0gMCkKKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlsb2NrLT5zbG9jayA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19yYXdfc3Bpbl9sb2NrX2ZsYWdzKHJhd19zcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NrLT5zbG9jayA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3NwaW5fdHJ5bG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwljaGFyIG9sZHZhbCA9IGxvY2stPnNsb2NrOworCisJbG9jay0+c2xvY2sgPSAwOworCisJcmV0dXJuIG9sZHZhbCA+IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlsb2NrLT5zbG9jayA9IDE7Cit9CisKKy8qCisgKiBSZWFkLXdyaXRlIHNwaW5sb2Nrcy4gTm8gZGVidWcgdmVyc2lvbi4KKyAqLworI2RlZmluZSBfX3Jhd19yZWFkX2xvY2sobG9jaykJCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlICgwKQorI2RlZmluZSBfX3Jhd193cml0ZV9sb2NrKGxvY2spCQlkbyB7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19yYXdfcmVhZF90cnlsb2NrKGxvY2spCSh7ICh2b2lkKShsb2NrKTsgMTsgfSkKKyNkZWZpbmUgX19yYXdfd3JpdGVfdHJ5bG9jayhsb2NrKQkoeyAodm9pZCkobG9jayk7IDE7IH0pCisjZGVmaW5lIF9fcmF3X3JlYWRfdW5sb2NrKGxvY2spCQlkbyB7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19yYXdfd3JpdGVfdW5sb2NrKGxvY2spCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlICgwKQorCisjZWxzZSAvKiBERUJVR19TUElOTE9DSyAqLworI2RlZmluZSBfX3Jhd19zcGluX2lzX2xvY2tlZChsb2NrKQkoKHZvaWQpKGxvY2spLCAwKQorLyogZm9yIHNjaGVkLmMgYW5kIGtlcm5lbF9sb2NrLmM6ICovCisjIGRlZmluZSBfX3Jhd19zcGluX2xvY2sobG9jaykJCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlICgwKQorIyBkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2sobG9jaykJZG8geyAodm9pZCkobG9jayk7IH0gd2hpbGUgKDApCisjIGRlZmluZSBfX3Jhd19zcGluX3RyeWxvY2sobG9jaykJKHsgKHZvaWQpKGxvY2spOyAxOyB9KQorI2VuZGlmIC8qIERFQlVHX1NQSU5MT0NLICovCisKKyNkZWZpbmUgX19yYXdfcmVhZF9jYW5fbG9jayhsb2NrKQkoKCh2b2lkKShsb2NrKSwgMSkpCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKGxvY2spCSgoKHZvaWQpKGxvY2spLCAxKSkKKworI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KGxvY2spIFwKKwkJZG8geyBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQobG9jaykpCisKKyNlbmRpZiAvKiBfX0xJTlVYX1NQSU5MT0NLX1VQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2NhY2hlLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jYWNoZS5oCmluZGV4IDY4NjQwNjMuLmM0ZTNlYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL2NhY2hlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvY2FjaGUuaApAQCAtNjAsNiArNjAsNyBAQAogI2RlZmluZQlDQUNIRV9ORVdfRVhQSVJZIDEyMAkvKiBrZWVwIG5ldyB0aGluZ3MgcGVuZGluZyBjb25maXJtYXRpb24gZm9yIDEyMCBzZWNvbmRzICovCiAKIHN0cnVjdCBjYWNoZV9kZXRhaWwgeworCXN0cnVjdCBtb2R1bGUgKgkJb3duZXI7CiAJaW50CQkJaGFzaF9zaXplOwogCXN0cnVjdCBjYWNoZV9oZWFkICoqCWhhc2hfdGFibGU7CiAJcndsb2NrX3QJCWhhc2hfbG9jazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKaW5kZXggYmZlM2U3Ni4uM2M5ZmYwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKQEAgLTEwNyw2ICsxMDcsOCBAQAogCVNXUF9VU0VECT0gKDEgPDwgMCksCS8qIGlzIHNsb3QgaW4gc3dhcF9pbmZvW10gdXNlZD8gKi8KIAlTV1BfV1JJVEVPSwk9ICgxIDw8IDEpLAkvKiBvayB0byB3cml0ZSB0byB0aGlzIHN3YXA/CSovCiAJU1dQX0FDVElWRQk9IChTV1BfVVNFRCB8IFNXUF9XUklURU9LKSwKKwkJCQkJLyogYWRkIG90aGVycyBoZXJlIGJlZm9yZS4uLiAqLworCVNXUF9TQ0FOTklORwk9ICgxIDw8IDgpLAkvKiByZWZjb3VudCBpbiBzY2FuX3N3YXBfbWFwICovCiB9OwogCiAjZGVmaW5lIFNXQVBfQ0xVU1RFUl9NQVggMzIKQEAgLTExNiwxNiArMTE4LDEzIEBACiAKIC8qCiAgKiBUaGUgaW4tbWVtb3J5IHN0cnVjdHVyZSB1c2VkIHRvIHRyYWNrIHN3YXAgYXJlYXMuCi0gKiBleHRlbnRfbGlzdC5wcmV2IHBvaW50cyBhdCB0aGUgbG93ZXN0LWluZGV4IGV4dGVudC4gIFRoYXQgbGlzdCBpcwotICogc29ydGVkLgogICovCiBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7CiAJdW5zaWduZWQgaW50IGZsYWdzOwotCXNwaW5sb2NrX3Qgc2Rldl9sb2NrOworCWludCBwcmlvOwkJCS8qIHN3YXAgcHJpb3JpdHkgKi8KIAlzdHJ1Y3QgZmlsZSAqc3dhcF9maWxlOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJc3RydWN0IGxpc3RfaGVhZCBleHRlbnRfbGlzdDsKLQlpbnQgbnJfZXh0ZW50czsKIAlzdHJ1Y3Qgc3dhcF9leHRlbnQgKmN1cnJfc3dhcF9leHRlbnQ7CiAJdW5zaWduZWQgb2xkX2Jsb2NrX3NpemU7CiAJdW5zaWduZWQgc2hvcnQgKiBzd2FwX21hcDsKQEAgLTEzMywxMCArMTMyLDkgQEAKIAl1bnNpZ25lZCBpbnQgaGlnaGVzdF9iaXQ7CiAJdW5zaWduZWQgaW50IGNsdXN0ZXJfbmV4dDsKIAl1bnNpZ25lZCBpbnQgY2x1c3Rlcl9ucjsKLQlpbnQgcHJpbzsJCQkvKiBzd2FwIHByaW9yaXR5ICovCi0JaW50IHBhZ2VzOwotCXVuc2lnbmVkIGxvbmcgbWF4OwotCXVuc2lnbmVkIGxvbmcgaW51c2VfcGFnZXM7CisJdW5zaWduZWQgaW50IHBhZ2VzOworCXVuc2lnbmVkIGludCBtYXg7CisJdW5zaWduZWQgaW50IGludXNlX3BhZ2VzOwogCWludCBuZXh0OwkJCS8qIG5leHQgZW50cnkgb24gc3dhcCBsaXN0ICovCiB9OwogCkBAIC0yMjIsMTMgKzIyMCw3IEBACiBleHRlcm4gaW50IHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlKHN0cnVjdCBwYWdlICopOwogc3RydWN0IGJhY2tpbmdfZGV2X2luZm87CiAKLWV4dGVybiBzdHJ1Y3Qgc3dhcF9saXN0X3Qgc3dhcF9saXN0OwotZXh0ZXJuIHNwaW5sb2NrX3Qgc3dhcGxvY2s7Ci0KLSNkZWZpbmUgc3dhcF9saXN0X2xvY2soKQlzcGluX2xvY2soJnN3YXBsb2NrKQotI2RlZmluZSBzd2FwX2xpc3RfdW5sb2NrKCkJc3Bpbl91bmxvY2soJnN3YXBsb2NrKQotI2RlZmluZSBzd2FwX2RldmljZV9sb2NrKHApCXNwaW5fbG9jaygmcC0+c2Rldl9sb2NrKQotI2RlZmluZSBzd2FwX2RldmljZV91bmxvY2socCkJc3Bpbl91bmxvY2soJnAtPnNkZXZfbG9jaykKK2V4dGVybiBzcGlubG9ja190IHN3YXBfbG9jazsKIAogLyogbGludXgvbW0vdGhyYXNoLmMgKi8KIGV4dGVybiBzdHJ1Y3QgbW1fc3RydWN0ICogc3dhcF90b2tlbl9tbTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcG9wcy5oIGIvaW5jbHVkZS9saW51eC9zd2Fwb3BzLmgKaW5kZXggZDRjN2RiMy4uODdiOWQxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2Fwb3BzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2Fwb3BzLmgKQEAgLTQsNyArNCw3IEBACiAgKiB0aGUgbG93LW9yZGVyIGJpdHMuCiAgKgogICogV2UgYXJyYW5nZSB0aGUgYHR5cGUnIGFuZCBgb2Zmc2V0JyBmaWVsZHMgc28gdGhhdCBgdHlwZScgaXMgYXQgdGhlIGZpdmUKLSAqIGhpZ2gtb3JkZXIgYml0cyBvZiB0aGUgc21wX2VudHJ5X3QgYW5kIGBvZmZzZXQnIGlzIHJpZ2h0LWFsaWduZWQgaW4gdGhlCisgKiBoaWdoLW9yZGVyIGJpdHMgb2YgdGhlIHN3cF9lbnRyeV90IGFuZCBgb2Zmc2V0JyBpcyByaWdodC1hbGlnbmVkIGluIHRoZQogICogcmVtYWluaW5nIGJpdHMuCiAgKgogICogc3dwX2VudHJ5X3QncyBhcmUgKm5ldmVyKiBzdG9yZWQgYW55d2hlcmUgaW4gdGhlaXIgYXJjaC1kZXBlbmRlbnQgZm9ybWF0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaCBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKaW5kZXggZTgyYmU5Ni4uNTMyYTZjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCkBAIC03MTEsNiArNzExLDcgQEAKIAlERVZfUkFJRD00LAogCURFVl9NQUNfSElEPTUsCiAJREVWX1NDU0k9NiwKKwlERVZfSVBNST03LAogfTsKIAogLyogL3Byb2Mvc3lzL2Rldi9jZHJvbSAqLwpAQCAtNzc2LDYgKzc3NywxMSBAQAogCURFVl9TQ1NJX0xPR0dJTkdfTEVWRUw9MSwKIH07CiAKKy8qIC9wcm9jL3N5cy9kZXYvaXBtaSAqLworZW51bSB7CisJREVWX0lQTUlfUE9XRVJPRkZfUE9XRVJDWUNMRT0xLAorfTsKKwogLyogL3Byb2Mvc3lzL2FiaSAqLwogZW51bQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lLmggYi9pbmNsdWRlL2xpbnV4L3RpbWUuaAppbmRleCA1NjM0NDk3Li44ZTgzZjRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWUuaApAQCAtMjgsMTcgKzI4LDEwIEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAvKiBQYXJhbWV0ZXJzIHVzZWQgdG8gY29udmVydCB0aGUgdGltZXNwZWMgdmFsdWVzICovCi0jaWZuZGVmIFVTRUNfUEVSX1NFQworI2RlZmluZSBNU0VDX1BFUl9TRUMgKDEwMDBMKQogI2RlZmluZSBVU0VDX1BFUl9TRUMgKDEwMDAwMDBMKQotI2VuZGlmCi0KLSNpZm5kZWYgTlNFQ19QRVJfU0VDCiAjZGVmaW5lIE5TRUNfUEVSX1NFQyAoMTAwMDAwMDAwMEwpCi0jZW5kaWYKLQotI2lmbmRlZiBOU0VDX1BFUl9VU0VDCiAjZGVmaW5lIE5TRUNfUEVSX1VTRUMgKDEwMDBMKQotI2VuZGlmCiAKIHN0YXRpYyBfX2lubGluZV9fIGludCB0aW1lc3BlY19lcXVhbChzdHJ1Y3QgdGltZXNwZWMgKmEsIHN0cnVjdCB0aW1lc3BlYyAqYikgCiB7IApAQCAtOTcsNyArOTAsNiBAQAogZXh0ZXJuIGludCBkb19zeXNfc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYsIHN0cnVjdCB0aW1lem9uZSAqdHopOwogZXh0ZXJuIHZvaWQgY2xvY2tfd2FzX3NldCh2b2lkKTsgLy8gY2FsbCB3aGVuIGV2ZXIgdGhlIGNsb2NrIGlzIHNldAogZXh0ZXJuIGludCBkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZShzdHJ1Y3QgdGltZXNwZWMgKnRwKTsKLWV4dGVybiBsb25nIGRvX25hbm9zbGVlcChzdHJ1Y3QgdGltZXNwZWMgKnQpOwogZXh0ZXJuIGxvbmcgZG9fdXRpbWVzKGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCB0aW1ldmFsICogdGltZXMpOwogc3RydWN0IGl0aW1lcnZhbDsKIGV4dGVybiBpbnQgZG9fc2V0aXRpbWVyKGludCB3aGljaCwgc3RydWN0IGl0aW1lcnZhbCAqdmFsdWUsIHN0cnVjdCBpdGltZXJ2YWwgKm92YWx1ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWVyLmggYi9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKaW5kZXggMjIxZjgxYS4uMzM0MGYzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZXIuaApAQCAtMzIsNiArMzIsMTAgQEAKIAkJLm1hZ2ljID0gVElNRVJfTUFHSUMsCQkJCVwKIAl9CiAKKyNkZWZpbmUgREVGSU5FX1RJTUVSKF9uYW1lLCBfZnVuY3Rpb24sIF9leHBpcmVzLCBfZGF0YSkJCVwKKwlzdHJ1Y3QgdGltZXJfbGlzdCBfbmFtZSA9CQkJCVwKKwkJVElNRVJfSU5JVElBTElaRVIoX2Z1bmN0aW9uLCBfZXhwaXJlcywgX2RhdGEpCisKIHZvaWQgZmFzdGNhbGwgaW5pdF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqIHRpbWVyKTsKIAogLyoqKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1leC5oIGIvaW5jbHVkZS9saW51eC90aW1leC5oCmluZGV4IDc0ZmRkMDcuLjdlMDUwYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZXguaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWV4LmgKQEAgLTI2MCw2ICsyNjAsMjkgQEAKIGV4dGVybiBsb25nIHBwc19lcnJjbnQ7CQkvKiBjYWxpYnJhdGlvbiBlcnJvcnMgKi8KIGV4dGVybiBsb25nIHBwc19zdGJjbnQ7CQkvKiBzdGFiaWxpdHkgbGltaXQgZXhjZWVkZWQgKi8KIAorLyoqCisgKiBudHBfY2xlYXIgLSBDbGVhcnMgdGhlIE5UUCBzdGF0ZSB2YXJpYWJsZXMKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aGlsZSBob2xkaW5nIGEgd3JpdGUgb24gdGhlIHh0aW1lX2xvY2sKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG50cF9jbGVhcih2b2lkKQoreworCXRpbWVfYWRqdXN0ID0gMDsJCS8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLworCXRpbWVfc3RhdHVzIHw9IFNUQV9VTlNZTkM7CisJdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworfQorCisvKioKKyAqIG50cF9zeW5jZWQgLSBSZXR1cm5zIDEgaWYgdGhlIE5UUCBzdGF0dXMgaXMgbm90IFVOU1lOQworICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRwX3N5bmNlZCh2b2lkKQoreworCXJldHVybiAhKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQyk7Cit9CisKKwogI2lmZGVmIENPTkZJR19USU1FX0lOVEVSUE9MQVRJT04KIAogI2RlZmluZSBUSU1FX1NPVVJDRV9DUFUgMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90b3BvbG9neS5oIGIvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCmluZGV4IDAzMjAyMjUuLjNkZjFkNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKQEAgLTEzNSw2ICsxMzUsMjkgQEAKIH0KICNlbmRpZgogCisvKiBzY2hlZF9kb21haW5zIFNEX0FMTE5PREVTX0lOSVQgZm9yIE5VTUEgbWFjaGluZXMgKi8KKyNkZWZpbmUgU0RfQUxMTk9ERVNfSU5JVCAoc3RydWN0IHNjaGVkX2RvbWFpbikgewlcCisJLnNwYW4JCQk9IENQVV9NQVNLX05PTkUsCVwKKwkucGFyZW50CQkJPSBOVUxMLAkJCVwKKwkuZ3JvdXBzCQkJPSBOVUxMLAkJCVwKKwkubWluX2ludGVydmFsCQk9IDY0LAkJCVwKKwkubWF4X2ludGVydmFsCQk9IDY0Km51bV9vbmxpbmVfY3B1cygpLAlcCisJLmJ1c3lfZmFjdG9yCQk9IDEyOCwJCQlcCisJLmltYmFsYW5jZV9wY3QJCT0gMTMzLAkJCVwKKwkuY2FjaGVfaG90X3RpbWUJCT0gKDEwKjEwMDAwMDApLAkJXAorCS5jYWNoZV9uaWNlX3RyaWVzCT0gMSwJCQlcCisJLmJ1c3lfaWR4CQk9IDMsCQkJXAorCS5pZGxlX2lkeAkJPSAzLAkJCVwKKwkubmV3aWRsZV9pZHgJCT0gMCwgLyogdW51c2VkICovCVwKKwkud2FrZV9pZHgJCT0gMCwgLyogdW51c2VkICovCVwKKwkuZm9ya2V4ZWNfaWR4CQk9IDAsIC8qIHVudXNlZCAqLwlcCisJLnBlcl9jcHVfZ2FpbgkJPSAxMDAsCQkJXAorCS5mbGFncwkJCT0gU0RfTE9BRF9CQUxBTkNFLAlcCisJLmxhc3RfYmFsYW5jZQkJPSBqaWZmaWVzLAkJXAorCS5iYWxhbmNlX2ludGVydmFsCT0gNjQsCQkJXAorCS5ucl9iYWxhbmNlX2ZhaWxlZAk9IDAsCQkJXAorfQorCiAjaWZkZWYgQ09ORklHX05VTUEKICNpZm5kZWYgU0RfTk9ERV9JTklUCiAjZXJyb3IgUGxlYXNlIGRlZmluZSBhbiBhcHByb3ByaWF0ZSBTRF9OT0RFX0lOSVQgaW4gaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCEhIQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90cmFuc3BvcnRfY2xhc3MuaCBiL2luY2x1ZGUvbGludXgvdHJhbnNwb3J0X2NsYXNzLmgKaW5kZXggODdkOThkMS4uMWQ2Y2MyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90cmFuc3BvcnRfY2xhc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RyYW5zcG9ydF9jbGFzcy5oCkBAIC0xMiwxMSArMTIsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmg+CiAKK3N0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyOworCiBzdHJ1Y3QgdHJhbnNwb3J0X2NsYXNzIHsKIAlzdHJ1Y3QgY2xhc3MgY2xhc3M7Ci0JaW50ICgqc2V0dXApKHN0cnVjdCBkZXZpY2UgKik7Ci0JaW50ICgqY29uZmlndXJlKShzdHJ1Y3QgZGV2aWNlICopOwotCWludCAoKnJlbW92ZSkoc3RydWN0IGRldmljZSAqKTsKKwlpbnQgKCpzZXR1cCkoc3RydWN0IHRyYW5zcG9ydF9jb250YWluZXIgKiwgc3RydWN0IGRldmljZSAqLAorCQkgICAgIHN0cnVjdCBjbGFzc19kZXZpY2UgKik7CisJaW50ICgqY29uZmlndXJlKShzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqLCBzdHJ1Y3QgZGV2aWNlICosCisJCQkgc3RydWN0IGNsYXNzX2RldmljZSAqKTsKKwlpbnQgKCpyZW1vdmUpKHN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyICosIHN0cnVjdCBkZXZpY2UgKiwKKwkJICAgICAgc3RydWN0IGNsYXNzX2RldmljZSAqKTsKIH07CiAKICNkZWZpbmUgREVDTEFSRV9UUkFOU1BPUlRfQ0xBU1MoY2xzLCBubSwgc3UsIHJtLCBjZmcpCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHkuaCBiL2luY2x1ZGUvbGludXgvdHR5LmgKaW5kZXggNTlmZjQyYy4uMTI2N2Y4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eS5oCkBAIC03NCw3ICs3NCw4IEBACiAJdTE2IHZlc2FwbV9vZmY7CQkvKiAweDMwICovCiAJdTE2IHBhZ2VzOwkJLyogMHgzMiAqLwogCXUxNiB2ZXNhX2F0dHJpYnV0ZXM7CS8qIDB4MzQgKi8KLQkJCQkvKiAweDM2IC0tIDB4M2YgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKwl1MzIgIGNhcGFiaWxpdGllczsgICAgICAvKiAweDM2ICovCisJCQkJLyogMHgzYSAtLSAweDNmIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCiB9OwogCiBleHRlcm4gc3RydWN0IHNjcmVlbl9pbmZvIHNjcmVlbl9pbmZvOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiLmgKaW5kZXggNzI0NjM3Ny4uNGRiZTU4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi5oCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYl9jaDkuaD4KIAogI2RlZmluZSBVU0JfTUFKT1IJCQkxODAKKyNkZWZpbmUgVVNCX0RFVklDRV9NQUpPUgkJMTg5CiAKIAogI2lmZGVmIF9fS0VSTkVMX18KQEAgLTM0OSw2ICszNTAsNyBAQAogCWNoYXIgKm1hbnVmYWN0dXJlcjsKIAljaGFyICpzZXJpYWw7CQkJLyogc3RhdGljIHN0cmluZ3MgZnJvbSB0aGUgZGV2aWNlICovCiAJc3RydWN0IGxpc3RfaGVhZCBmaWxlbGlzdDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IGRlbnRyeSAqdXNiZnNfZGVudHJ5OwkvKiB1c2JmcyBkZW50cnkgZW50cnkgZm9yIHRoZSBkZXZpY2UgKi8KIAogCS8qCkBAIC02MTQsNyArNjE2LDYgQEAKICNkZWZpbmUgVVJCX0lTT19BU0FQCQkweDAwMDIJLyogaXNvLW9ubHksIHVyYi0+c3RhcnRfZnJhbWUgaWdub3JlZCAqLwogI2RlZmluZSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUAkweDAwMDQJLyogdXJiLT50cmFuc2Zlcl9kbWEgdmFsaWQgb24gc3VibWl0ICovCiAjZGVmaW5lIFVSQl9OT19TRVRVUF9ETUFfTUFQCTB4MDAwOAkvKiB1cmItPnNldHVwX2RtYSB2YWxpZCBvbiBzdWJtaXQgKi8KLSNkZWZpbmUgVVJCX0FTWU5DX1VOTElOSwkweDAwMTAJLyogdXNiX3VubGlua191cmIoKSByZXR1cm5zIGFzYXAgKi8KICNkZWZpbmUgVVJCX05PX0ZTQlIJCTB4MDAyMAkvKiBVSENJLXNwZWNpZmljICovCiAjZGVmaW5lIFVSQl9aRVJPX1BBQ0tFVAkJMHgwMDQwCS8qIEZpbmlzaCBidWxrIE9VVHMgd2l0aCBzaG9ydCBwYWNrZXQgKi8KICNkZWZpbmUgVVJCX05PX0lOVEVSUlVQVAkweDAwODAJLyogSElOVDogbm8gbm9uLWVycm9yIGludGVycnVwdCBuZWVkZWQgKi8KQEAgLTcyMiwxMyArNzIzLDcgQEAKICAqIEluaXRpYWxpemF0aW9uOgogICoKICAqIEFsbCBVUkJzIHN1Ym1pdHRlZCBtdXN0IGluaXRpYWxpemUgdGhlIGRldiwgcGlwZSwgdHJhbnNmZXJfZmxhZ3MgKG1heSBiZQotICogemVybyksIGFuZCBjb21wbGV0ZSBmaWVsZHMuCi0gKiBUaGUgVVJCX0FTWU5DX1VOTElOSyB0cmFuc2ZlciBmbGFnIGFmZmVjdHMgbGF0ZXIgaW52b2NhdGlvbnMgb2YKLSAqIHRoZSB1c2JfdW5saW5rX3VyYigpIHJvdXRpbmUuICBOb3RlOiBGYWlsdXJlIHRvIHNldCBVUkJfQVNZTkNfVU5MSU5LCi0gKiB3aXRoIHVzYl91bmxpbmtfdXJiKCkgaXMgZGVwcmVjYXRlZC4gIEZvciBzeW5jaHJvbm91cyB1bmxpbmtzIHVzZQotICogdXNiX2tpbGxfdXJiKCkgaW5zdGVhZC4KLSAqCi0gKiBBbGwgVVJCcyBtdXN0IGFsc28gaW5pdGlhbGl6ZSAKKyAqIHplcm8pLCBhbmQgY29tcGxldGUgZmllbGRzLiAgQWxsIFVSQnMgbXVzdCBhbHNvIGluaXRpYWxpemUKICAqIHRyYW5zZmVyX2J1ZmZlciBhbmQgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aC4gIFRoZXkgbWF5IHByb3ZpZGUgdGhlCiAgKiBVUkJfU0hPUlRfTk9UX09LIHRyYW5zZmVyIGZsYWcsIGluZGljYXRpbmcgdGhhdCBzaG9ydCByZWFkcyBhcmUKICAqIHRvIGJlIHRyZWF0ZWQgYXMgZXJyb3JzOyB0aGF0IGZsYWcgaXMgaW52YWxpZCBmb3Igd3JpdGUgcmVxdWVzdHMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl9pc3AxMTZ4LmggYi9pbmNsdWRlL2xpbnV4L3VzYl9pc3AxMTZ4LmgKaW5kZXggNWY1YTlkOS4uNDM2ZGQ4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2JfaXNwMTE2eC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX2lzcDExNnguaApAQCAtNywzNiArNywxOCBAQAogc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSB7CiAJLyogRW5hYmxlIGludGVybmFsIHJlc2lzdG9ycyBvbiBkb3duc3RyZWFtIHBvcnRzICovCiAJdW5zaWduZWQgc2VsMTVLcmVzOjE7Ci0JLyogQ2hpcCdzIGludGVybmFsIGNsb2NrIHdvbid0IGJlIHN0b3BwZWQgaW4gc3VzcGVuZGVkIHN0YXRlLgotCSAgIFNldHRpbmcvdW5zZXR0aW5nIHRoaXMgYml0IHRha2VzIGVmZmVjdCBvbmx5IGlmCi0JICAgJ3JlbW90ZV93YWtldXBfZW5hYmxlJyBiZWxvdyBpcyBub3Qgc2V0LiAqLwotCXVuc2lnbmVkIGNsa25vdHN0b3A6MTsKLQkvKiBPbi1jaGlwIG92ZXJjdXJyZW50IHByb3RlY3Rpb24gKi8KKwkvKiBPbi1jaGlwIG92ZXJjdXJyZW50IGRldGVjdGlvbiAqLwogCXVuc2lnbmVkIG9jX2VuYWJsZToxOwogCS8qIElOVCBvdXRwdXQgcG9sYXJpdHkgKi8KIAl1bnNpZ25lZCBpbnRfYWN0X2hpZ2g6MTsKIAkvKiBJTlQgZWRnZSBvciBsZXZlbCB0cmlnZ2VyZWQgKi8KIAl1bnNpZ25lZCBpbnRfZWRnZV90cmlnZ2VyZWQ6MTsKLQkvKiBXQUtFVVAgcGluIGNvbm5lY3RlZCAtIE5PVCBTVVBQT1JURUQgICovCi0JLyogdW5zaWduZWQgcmVtb3RlX3dha2V1cF9jb25uZWN0ZWQ6MTsgKi8KLQkvKiBXYWtldXAgYnkgZGV2aWNlcyBvbiB1c2IgYnVzIGVuYWJsZWQgKi8KKwkvKiBFbmFibGUgd2FrZXVwIGJ5IGRldmljZXMgb24gdXNiIGJ1cyAoZS5nLiB3YWtldXAKKwkgICBieSBhdHRhY2htZW50L2RldGFjaG1lbnQgb3IgYnkgZGV2aWNlIGFjdGl2aXR5CisJICAgc3VjaCBhcyBtb3ZpbmcgYSBtb3VzZSkuIFdoZW4gY2hvc2VuLCB0aGlzIG9wdGlvbgorCSAgIHByZXZlbnRzIHN0b3BwaW5nIGludGVybmFsIGNsb2NrLCBpbmNyZWFzaW5nCisJICAgdGhlcmVieSBwb3dlciBjb25zdW1wdGlvbiBpbiBzdXNwZW5kZWQgc3RhdGUuICovCiAJdW5zaWduZWQgcmVtb3RlX3dha2V1cF9lbmFibGU6MTsKLQkvKiBTd2l0Y2ggb3Igbm90IHRvIHN3aXRjaCAoa2VlcCBhbHdheXMgcG93ZXJlZCkgKi8KLQl1bnNpZ25lZCBub19wb3dlcl9zd2l0Y2hpbmc6MTsKLQkvKiBHYW5nZWQgcG9ydCBwb3dlciBzd2l0Y2hpbmcgKDApIG9yIGluZGl2aWR1YWwgcG9ydAotCSAgIHBvd2VyIHN3aXRjaGluZyAoMSkgKi8KLQl1bnNpZ25lZCBwb3dlcl9zd2l0Y2hpbmdfbW9kZToxOwotCS8qIEdpdmVuIHBvcnRfcG93ZXIsIG1zZWMvMiBhZnRlciBwb3dlciBvbiB0aWxsIHBvd2VyIGdvb2QgKi8KLQl1OCBwb3RwZzsKLQkvKiBIYXJkd2FyZSByZXNldCBzZXQvY2xlYXIuIElmIGltcGxlbWVudGVkLCB0aGlzIGZ1bmN0aW9uIG11c3Q6Ci0JICAgaWYgc2V0ID09IDAsICAgZGVhc3NlcnQgY2hpcCdzIEhXIHJlc2V0IHBpbgotCSAgIG90aGVyd2lzZSwgICAgIGFzc2VydCBjaGlwJ3MgSFcgcmVzZXQgcGluICAgICAgICovCi0Jdm9pZCAoKnJlc2V0KSAoc3RydWN0IGRldmljZSAqIGRldiwgaW50IHNldCk7Ci0JLyogSGFyZHdhcmUgY2xvY2sgc3RhcnQvc3RvcC4gSWYgaW1wbGVtZW50ZWQsIHRoaXMgZnVuY3Rpb24gbXVzdDoKLQkgICBpZiBzdGFydCA9PSAwLCAgICBzdG9wIHRoZSBleHRlcm5hbCBjbG9jawotCSAgIG90aGVyd2lzZSwgICAgICAgIHN0YXJ0IHRoZSBleHRlcm5hbCBjbG9jawotCSAqLwotCXZvaWQgKCpjbG9jaykgKHN0cnVjdCBkZXZpY2UgKiBkZXYsIGludCBzdGFydCk7CiAJLyogSW50ZXItaW8gZGVsYXkgKG5zKS4gVGhlIGNoaXAgaXMgcGlja3kgYWJvdXQgYWNjZXNzIHRpbWluZ3M7IGl0CiAJICAgZXhwZWN0cyBhdCBsZWFzdDoKIAkgICAxNTBucyBkZWxheSBiZXR3ZWVuIGNvbnNlY3V0aXZlIGFjY2Vzc2VzIHRvIERBVEFfUkVHLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aWRlb2Rldi5oIGIvaW5jbHVkZS9saW51eC92aWRlb2Rldi5oCmluZGV4IDlkNmZiZGUuLjFjYzhjMzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2LmgKQEAgLTMsNyArMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjZGVmaW5lIEhBVkVfVjRMMiAxCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CkBAIC0yOSw3ICsyOCw2IEBACiAJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCk7CiAKIAotI2lmIDEgLyogdG8gYmUgcmVtb3ZlZCBpbiAyLjcueCAqLwogCS8qIG9ic29sZXRlIC0tIGZvcHMtPm93bmVyIGlzIHVzZWQgaW5zdGVhZCAqLwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogCS8qIGRldi0+ZHJpdmVyX2RhdGEgd2lsbCBiZSB1c2VkIGluc3RlYWQgc29tZSBkYXkuCkBAIC0zNyw3ICszNSw2IEBACiAJICogc28gdGhlIHN3aXRjaCBvdmVyIHdpbGwgYmUgdHJhbnNwYXJlbnQgZm9yIHlvdS4KIAkgKiBPciB1c2Uge3BjaXx1c2J9X3tnZXR8c2V0fV9kcnZkYXRhKCkgZGlyZWN0bHkuICovCiAJdm9pZCAqcHJpdjsKLSNlbmRpZgogCiAJLyogZm9yIHZpZGVvZGV2LmMgaW50ZW5hbCB1c2FnZSAtLSBwbGVhc2UgZG9uJ3QgdG91Y2ggKi8KIAlpbnQgdXNlcnM7ICAgICAgICAgICAgICAgICAgICAgLyogdmlkZW9fZXhjbHVzaXZlX3tvcGVufGNsb3NlfSAuLi4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCmluZGV4IGFjYmZjNTIuLmY2MjNhMzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKKysrIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaApAQCAtMjcwLDcgKzI3MCw2IEBACiAvKiBUaGUgYWJvdmUgaXMgYmFzZWQgb24gU01QVEUgdGltZWNvZGVzICovCiAKIAotI2lmIDEKIC8qCiAgKglNIFAgRSBHICAgQyBPIE0gUCBSIEUgUyBTIEkgTyBOICAgUCBBIFIgQSBNIEUgVCBFIFIgUwogICoKQEAgLTM1Nyw3ICszNTYsNiBAQAogCS8qIEkgZG9uJ3QgZXhwZWN0IHRoZSBhYm92ZSBiZWluZyBwZXJmZWN0IHlldCA7KSAqLwogCV9fdTMyCQkJCXJlc2VydmVkXzVbOF07CiB9OwotI2VuZGlmCiAKIHN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbgogewpAQCAtODcxLDEwICs4NjksOCBAQAogI2RlZmluZSBWSURJT0NfRU5VTV9GTVQgICAgICAgICBfSU9XUiAoJ1YnLCAgMiwgc3RydWN0IHY0bDJfZm10ZGVzYykKICNkZWZpbmUgVklESU9DX0dfRk1UCQlfSU9XUiAoJ1YnLCAgNCwgc3RydWN0IHY0bDJfZm9ybWF0KQogI2RlZmluZSBWSURJT0NfU19GTVQJCV9JT1dSICgnVicsICA1LCBzdHJ1Y3QgdjRsMl9mb3JtYXQpCi0jaWYgMSAvKiBleHBlcmltZW50YWwgKi8KICNkZWZpbmUgVklESU9DX0dfTVBFR0NPTVAgICAgICAgX0lPUiAgKCdWJywgIDYsIHN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24pCiAjZGVmaW5lIFZJRElPQ19TX01QRUdDT01QICAgICAJX0lPVyAgKCdWJywgIDcsIHN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24pCi0jZW5kaWYKICNkZWZpbmUgVklESU9DX1JFUUJVRlMJCV9JT1dSICgnVicsICA4LCBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycykKICNkZWZpbmUgVklESU9DX1FVRVJZQlVGCQlfSU9XUiAoJ1YnLCAgOSwgc3RydWN0IHY0bDJfYnVmZmVyKQogI2RlZmluZSBWSURJT0NfR19GQlVGCQlfSU9SICAoJ1YnLCAxMCwgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaCBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCmluZGV4IDY0MDlkOWMuLmIyNDRmNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCkBAIC0xMCw2ICsxMCwxNCBAQAogI2RlZmluZSBWTV9NQVAJCTB4MDAwMDAwMDQJLyogdm1hcCgpZWQgcGFnZXMgKi8KIC8qIGJpdHMgWzIwLi4zMl0gcmVzZXJ2ZWQgZm9yIGFyY2ggc3BlY2lmaWMgaW9yZW1hcCBpbnRlcm5hbHMgKi8KIAorLyoKKyAqIE1heGltdW0gYWxpZ25tZW50IGZvciBpb3JlbWFwKCkgcmVnaW9ucy4KKyAqIENhbiBiZSBvdmVycmlkZW4gYnkgYXJjaC1zcGVjaWZpYyB2YWx1ZS4KKyAqLworI2lmbmRlZiBJT1JFTUFQX01BWF9PUkRFUgorI2RlZmluZSBJT1JFTUFQX01BWF9PUkRFUgkoNyArIFBBR0VfU0hJRlQpCS8qIDEyOCBwYWdlcyAqLworI2VuZGlmCisKIHN0cnVjdCB2bV9zdHJ1Y3QgewogCXZvaWQJCQkqYWRkcjsKIAl1bnNpZ25lZCBsb25nCQlzaXplOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93aXJlbGVzcy5oIGIvaW5jbHVkZS9saW51eC93aXJlbGVzcy5oCmluZGV4IGFlNDg1ZjkuLmE1NTVhMGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd2lyZWxlc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dpcmVsZXNzLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogVGhpcyBmaWxlIGRlZmluZSBhIHNldCBvZiBzdGFuZGFyZCB3aXJlbGVzcyBleHRlbnNpb25zCiAgKgotICogVmVyc2lvbiA6CTE4CTEyLjMuMDUKKyAqIFZlcnNpb24gOgkxOQkxOC4zLjA1CiAgKgogICogQXV0aG9ycyA6CUplYW4gVG91cnJpbGhlcyAtIEhQTCAtIDxqdEBocGwuaHAuY29tPgogICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUgSmVhbiBUb3VycmlsaGVzLCBBbGwgUmlnaHRzIFJlc2VydmVkLgpAQCAtNjksOCArNjksNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5DTFVERVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIFRvIG1pbmltaXNlIHByb2JsZW1zIGluIHVzZXIgc3BhY2UsIEkgbWlnaHQgcmVtb3ZlIHRob3NlIGhlYWRlcnMKLSAqIGF0IHNvbWUgcG9pbnQuIEplYW4gSUkgKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgkJLyogZm9yICJjYWRkcl90IiBldCBhbAkJKi8KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4JCS8qIGZvciAic3RydWN0IHNvY2thZGRyIiBldCBhbAkqLwogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CQkJLyogZm9yIElGTkFNU0laIGFuZCBjby4uLiAqLwpAQCAtODIsNyArODAsNyBAQAogICogKHRoZXJlIGlzIHNvbWUgc3R1ZmYgdGhhdCB3aWxsIGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuLi4pCiAgKiBJIGp1c3QgcGxhbiB0byBpbmNyZW1lbnQgd2l0aCBlYWNoIG5ldyB2ZXJzaW9uLgogICovCi0jZGVmaW5lIFdJUkVMRVNTX0VYVAkxOAorI2RlZmluZSBXSVJFTEVTU19FWFQJMTkKIAogLyoKICAqIENoYW5nZXMgOgpAQCAtMTk3LDYgKzE5NSwxNSBAQAogICoJICByZWxhdGVkIHBhcmFtZXRlcnMgKGV4dGVuc2libGUgdXAgdG8gNDA5NiBwYXJhbWV0ZXIgdmFsdWVzKQogICoJLSBBZGQgd2lyZWxlc3MgZXZlbnRzOiBJV0VWR0VOSUUsIElXRVZNSUNIQUVMTUlDRkFJTFVSRSwKICAqCSAgSVdFVkFTU09DUkVRSUUsIElXRVZBU1NPQ1JFU1BJRSwgSVdFVlBNS0lEQ0FORAorICoKKyAqIFYxOCB0byBWMTkKKyAqIC0tLS0tLS0tLS0KKyAqCS0gUmVtb3ZlIChzdHJ1Y3QgaXdfcG9pbnQgKiktPnBvaW50ZXIgZnJvbSBldmVudHMgYW5kIHN0cmVhbXMKKyAqCS0gUmVtb3ZlIGhlYWRlciBpbmNsdWRlcyB0byBoZWxwIHVzZXIgc3BhY2UKKyAqCS0gSW5jcmVhc2UgSVdfRU5DT0RJTkdfVE9LRU5fTUFYIGZyb20gMzIgdG8gNjQKKyAqCS0gQWRkIElXX1FVQUxfQUxMX1VQREFURUQgYW5kIElXX1FVQUxfQUxMX0lOVkFMSUQgbWFjcm9zCisgKgktIEFkZCBleHBsaWNpdCBmbGFnIHRvIHRlbGwgc3RhdHMgYXJlIGluIGRCbSA6IElXX1FVQUxfREJNCisgKgktIEFkZCBJV19JT0NUTF9JRFgoKSBhbmQgSVdfRVZFTlRfSURYKCkgbWFjcm9zCiAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09OU1RBTlRTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMjIsNiArMzI5LDcgQEAKIC8qIFRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgKHJhbmdlKSAqLwogI2RlZmluZSBTSU9DSVdGSVJTVAkweDhCMDAKICNkZWZpbmUgU0lPQ0lXTEFTVAlTSU9DSVdMQVNUUFJJVgkJLyogMHg4QkZGICovCisjZGVmaW5lIElXX0lPQ1RMX0lEWChjbWQpCSgoY21kKSAtIFNJT0NJV0ZJUlNUKQogCiAvKiBFdmVuIDogZ2V0ICh3b3JsZCBhY2Nlc3MpLCBvZGQgOiBzZXQgKHJvb3QgYWNjZXNzKSAqLwogI2RlZmluZSBJV19JU19TRVQoY21kKQkoISgoY21kKSAmIDB4MSkpCkBAIC0zNjYsNiArMzc0LDcgQEAKIAkJCQkJICogKHN0cnVjdCBpd19wbWtpZF9jYW5kKSAqLwogCiAjZGVmaW5lIElXRVZGSVJTVAkweDhDMDAKKyNkZWZpbmUgSVdfRVZFTlRfSURYKGNtZCkJKChjbWQpIC0gSVdFVkZJUlNUKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBSSVZBVEUgSU5GTyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKgpAQCAtNDI3LDEyICs0MzYsMTUgQEAKICNkZWZpbmUgSVdfTU9ERV9NT05JVE9SCTYJLyogUGFzc2l2ZSBtb25pdG9yIChsaXN0ZW4gb25seSkgKi8KIAogLyogU3RhdGlzdGljcyBmbGFncyAoYml0bWFzayBpbiB1cGRhdGVkKSAqLwotI2RlZmluZSBJV19RVUFMX1FVQUxfVVBEQVRFRAkweDEJLyogVmFsdWUgd2FzIHVwZGF0ZWQgc2luY2UgbGFzdCByZWFkICovCi0jZGVmaW5lIElXX1FVQUxfTEVWRUxfVVBEQVRFRAkweDIKLSNkZWZpbmUgSVdfUVVBTF9OT0lTRV9VUERBVEVECTB4NAorI2RlZmluZSBJV19RVUFMX1FVQUxfVVBEQVRFRAkweDAxCS8qIFZhbHVlIHdhcyB1cGRhdGVkIHNpbmNlIGxhc3QgcmVhZCAqLworI2RlZmluZSBJV19RVUFMX0xFVkVMX1VQREFURUQJMHgwMgorI2RlZmluZSBJV19RVUFMX05PSVNFX1VQREFURUQJMHgwNAorI2RlZmluZSBJV19RVUFMX0FMTF9VUERBVEVECTB4MDcKKyNkZWZpbmUgSVdfUVVBTF9EQk0JCTB4MDgJLyogTGV2ZWwgKyBOb2lzZSBhcmUgZEJtICovCiAjZGVmaW5lIElXX1FVQUxfUVVBTF9JTlZBTElECTB4MTAJLyogRHJpdmVyIGRvZXNuJ3QgcHJvdmlkZSB2YWx1ZSAqLwogI2RlZmluZSBJV19RVUFMX0xFVkVMX0lOVkFMSUQJMHgyMAogI2RlZmluZSBJV19RVUFMX05PSVNFX0lOVkFMSUQJMHg0MAorI2RlZmluZSBJV19RVUFMX0FMTF9JTlZBTElECTB4NzAKIAogLyogRnJlcXVlbmN5IGZsYWdzICovCiAjZGVmaW5lIElXX0ZSRVFfQVVUTwkJMHgwMAkvKiBMZXQgdGhlIGRyaXZlciBkZWNpZGVzICovCkBAIC00NDMsNyArNDU1LDcgQEAKICNkZWZpbmUgSVdfTUFYX0VOQ09ESU5HX1NJWkVTCTgKIAogLyogTWF4aW11bSBzaXplIG9mIHRoZSBlbmNvZGluZyB0b2tlbiBpbiBieXRlcyAqLwotI2RlZmluZSBJV19FTkNPRElOR19UT0tFTl9NQVgJMzIJLyogMjU2IGJpdHMgKGZvciBub3cpICovCisjZGVmaW5lIElXX0VOQ09ESU5HX1RPS0VOX01BWAk2NAkvKiA1MTIgYml0cyAoZm9yIG5vdykgKi8KIAogLyogRmxhZ3MgZm9yIGVuY29kaW5nIChhbG9uZyB3aXRoIHRoZSB0b2tlbikgKi8KICNkZWZpbmUgSVdfRU5DT0RFX0lOREVYCQkweDAwRkYJLyogVG9rZW4gaW5kZXggKGlmIG5lZWRlZCkgKi8KQEAgLTEwMzksMTIgKzEwNTEsMTYgQEAKICNkZWZpbmUgSVdfRVZfQ0hBUl9MRU4JKElXX0VWX0xDUF9MRU4gKyBJRk5BTVNJWikKICNkZWZpbmUgSVdfRVZfVUlOVF9MRU4JKElXX0VWX0xDUF9MRU4gKyBzaXplb2YoX191MzIpKQogI2RlZmluZSBJV19FVl9GUkVRX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihzdHJ1Y3QgaXdfZnJlcSkpCi0jZGVmaW5lIElXX0VWX1BPSU5UX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihzdHJ1Y3QgaXdfcG9pbnQpKQogI2RlZmluZSBJV19FVl9QQVJBTV9MRU4JKElXX0VWX0xDUF9MRU4gKyBzaXplb2Yoc3RydWN0IGl3X3BhcmFtKSkKICNkZWZpbmUgSVdfRVZfQUREUl9MRU4JKElXX0VWX0xDUF9MRU4gKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSkKICNkZWZpbmUgSVdfRVZfUVVBTF9MRU4JKElXX0VWX0xDUF9MRU4gKyBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKQogCi0vKiBOb3RlIDogaW4gdGhlIGNhc2Ugb2YgaXdfcG9pbnQsIHRoZSBleHRyYSBkYXRhIHdpbGwgY29tZSBhdCB0aGUKLSAqIGVuZCBvZiB0aGUgZXZlbnQgKi8KKy8qIGl3X3BvaW50IGV2ZW50cyBhcmUgc3BlY2lhbC4gRmlyc3QsIHRoZSBwYXlsb2FkIChleHRyYSBkYXRhKSBjb21lIGF0CisgKiB0aGUgZW5kIG9mIHRoZSBldmVudCwgc28gdGhleSBhcmUgYmlnZ2VyIHRoYW4gSVdfRVZfUE9JTlRfTEVOLiBTZWNvbmQsCisgKiB3ZSBvbWl0IHRoZSBwb2ludGVyLCBzbyBzdGFydCBhdCBhbiBvZmZzZXQuICovCisjZGVmaW5lIElXX0VWX1BPSU5UX09GRiAoKChjaGFyICopICYoKChzdHJ1Y3QgaXdfcG9pbnQgKikgTlVMTCktPmxlbmd0aCkpIC0gXAorCQkJICAoY2hhciAqKSBOVUxMKQorI2RlZmluZSBJV19FVl9QT0lOVF9MRU4JKElXX0VWX0xDUF9MRU4gKyBzaXplb2Yoc3RydWN0IGl3X3BvaW50KSAtIFwKKwkJCSBJV19FVl9QT0lOVF9PRkYpCiAKICNlbmRpZgkvKiBfTElOVVhfV0lSRUxFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaCBiL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKaW5kZXggNTQyZGJhZS4uMzQzZDg4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCkBAIC0xMDksOCArMTA5LDYgQEAKIGludCBkb193cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CiBpbnQgc3luY19wYWdlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQkJbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KTsKLWludCBzeW5jX3BhZ2VfcmFuZ2Vfbm9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlCi0JCSptYXBwaW5nLCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpOwogCiAvKiBwZGZsdXNoLmMgKi8KIGV4dGVybiBpbnQgbnJfcGRmbHVzaF90aHJlYWRzOwkvKiBHbG9iYWwgc28gaXQgY2FuIGJlIGV4cG9ydGVkIHRvIHN5c2N0bApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9hdWRpb2NoaXAuaCBiL2luY2x1ZGUvbWVkaWEvYXVkaW9jaGlwLmgKaW5kZXggY2Q4MzExNi4uYTdjZWVlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9hdWRpb2NoaXAuaAorKysgYi9pbmNsdWRlL21lZGlhL2F1ZGlvY2hpcC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogYXVkaW9jaGlwLmgsdiAxLjUgMjAwNS8wNi8xNiAyMjo1OToxNiBoaGFja21hbm4gRXhwICQKICAqLwogCiAjaWZuZGVmIEFVRElPQ0hJUF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2lkLmggYi9pbmNsdWRlL21lZGlhL2lkLmgKaW5kZXggYTM5YTY0Mi4uNmQwMmM5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9pZC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvaWQuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGlkLmgsdiAxLjQgMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCiAgKi8KIAogLyogRklYTUU6IHRoaXMgdGVtcG9yYXJlbHksIHVudGlsIHRoZXNlIGFyZSBpbmNsdWRlZCBpbiBsaW51eC9pMmMtaWQuaCAqLwpAQCAtMzQsOCArMzMsMyBAQAogI2lmbmRlZiAgSTJDX0RSSVZFUklEX1NBQTY3NTJIUwogIyBkZWZpbmUgSTJDX0RSSVZFUklEX1NBQTY3NTJIUyBJMkNfRFJJVkVSSURfRVhQMCs4CiAjZW5kaWYKLQotLyogYWxnb3JpdGhtcyAqLwotI2lmbmRlZiBJMkNfQUxHT19TQUE3MTM0Ci0jIGRlZmluZSBJMkNfQUxHT19TQUE3MTM0IDB4MDkwMDAwCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmggYi9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oCmluZGV4IDY5ODY3MDUuLjAxYjU2ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9pci1jb21tb24uaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGlyLWNvbW1vbi5oLHYgMS45IDIwMDUvMDUvMTUgMTk6MDE6MjYgbWNoZWhhYiBFeHAgJAogICoKICAqIHNvbWUgY29tbW9uIHN0cnVjdHMgYW5kIGZ1bmN0aW9ucyB0byBoYW5kbGUgaW5mcmFyZWQgcmVtb3RlcyB2aWEKICAqIGlucHV0IGxheWVyIC4uLgpAQCAtMjEsMTEgKzIwLDExIEBACiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KIAogCiAjZGVmaW5lIElSX1RZUEVfUkM1ICAgICAxCisjZGVmaW5lIElSX1RZUEVfUEQgICAgICAyIC8qIFB1bHNlIGRpc3RhbmNlIGVuY29kZWQgSVIgKi8KICNkZWZpbmUgSVJfVFlQRV9PVEhFUiAgOTkKIAogI2RlZmluZSBJUl9LRVlUQUJfVFlQRQl1MzIKQEAgLTYwLDYgKzU5LDcgQEAKIHUzMiAgaXJfZXh0cmFjdF9iaXRzKHUzMiBkYXRhLCB1MzIgbWFzayk7CiBpbnQgIGlyX2R1bXBfc2FtcGxlcyh1MzIgKnNhbXBsZXMsIGludCBjb3VudCk7CiBpbnQgIGlyX2RlY29kZV9iaXBoYXNlKHUzMiAqc2FtcGxlcywgaW50IGNvdW50LCBpbnQgbG93LCBpbnQgaGlnaCk7CitpbnQgIGlyX2RlY29kZV9wdWxzZWRpc3RhbmNlKHUzMiAqc2FtcGxlcywgaW50IGNvdW50LCBpbnQgbG93LCBpbnQgaGlnaCk7CiAKIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXM6CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaCBiL2luY2x1ZGUvbWVkaWEvc2FhNzE0Ni5oCmluZGV4IDNkZmI4ZDYuLjJhODk3YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc2FhNzE0Ni5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc2FhNzE0Ni5oCkBAIC0xLDcgKzEsNiBAQAogI2lmbmRlZiBfX1NBQTcxNDZfXwogI2RlZmluZSBfX1NBQTcxNDZfXwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgkvKiBmb3IgdmVyc2lvbiBtYWNyb3MgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogZm9yIG1vZHVsZS12ZXJzaW9uICovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogZm9yIGRlbGF5LXN0dWZmICovCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkJLyogZm9yIGttYWxsb2Mva2ZyZWUgKi8KQEAgLTE1LDEyICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgkvKiBmb3Igdm1hbGxvYygpICovCiAjaW5jbHVkZSA8bGludXgvbW0uaD4JCS8qIGZvciB2bWFsbG9jX3RvX3BhZ2UoKSAqLwogCi0vKiB1Z2x5LCBidXQgbmVjZXNzYXJ5IHRvIGJ1aWxkIHRoZSBkdmIgc3R1ZmYgdW5kZXIgMi40LiAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw1MSkKLQkjaW5jbHVkZSAiZHZiX2Z1bmN0aW9ucy5oIgotI2VuZGlmCi0KLSNkZWZpbmUgU0FBNzE0Nl9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCw1LDApCisjZGVmaW5lIFNBQTcxNDZfVkVSU0lPTl9DT0RFIDB4MDAwNTAwICAgLyogMC41LjAgKi8KIAogI2RlZmluZSBzYWE3MTQ2X3dyaXRlKHN4eSxhZHIsZGF0KSAgICB3cml0ZWwoKGRhdCksKHN4eS0+bWVtKyhhZHIpKSkKICNkZWZpbmUgc2FhNzE0Nl9yZWFkKHN4eSxhZHIpICAgICAgICAgcmVhZGwoc3h5LT5tZW0rKGFkcikpCkBAIC0zMywxMyArMjcsOCBAQAogCSNkZWZpbmUgREVCVUdfVkFSSUFCTEUgc2FhNzE0Nl9kZWJ1ZwogI2VuZGlmCiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNTEpCi0jZGVmaW5lIERFQlVHX1BST0xPRyBwcmludGsoIiVzOiAlcygpOiAiLF9fc3RyaW5naWZ5KEtCVUlMRF9CQVNFTkFNRSksX19GVU5DVElPTl9fKQotI2RlZmluZSBJTkZPKHgpIHsgcHJpbnRrKCIlczogIixfX3N0cmluZ2lmeShLQlVJTERfQkFTRU5BTUUpKTsgcHJpbnRrIHg7IH0KLSNlbHNlCiAjZGVmaW5lIERFQlVHX1BST0xPRyBwcmludGsoIiVzOiAlcygpOiAiLF9fc3RyaW5naWZ5KEtCVUlMRF9NT0ROQU1FKSxfX0ZVTkNUSU9OX18pCiAjZGVmaW5lIElORk8oeCkgeyBwcmludGsoIiVzOiAiLF9fc3RyaW5naWZ5KEtCVUlMRF9NT0ROQU1FKSk7IHByaW50ayB4OyB9Ci0jZW5kaWYKIAogI2RlZmluZSBFUlIoeCkgeyBERUJVR19QUk9MT0c7IHByaW50ayB4OyB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdHVuZXIuaCBiL2luY2x1ZGUvbWVkaWEvdHVuZXIuaAppbmRleCBlZWFhMTVkLi40YWQwOGUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3R1bmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS90dW5lci5oCkBAIC0xLDYgKzEsNCBAQAotCi0vKiAkSWQ6IHR1bmVyLmgsdiAxLjQ1IDIwMDUvMDcvMjggMTg6NDE6MjEgbWNoZWhhYiBFeHAgJAotICoKKy8qCiAgICAgdHVuZXIuaCAtIGRlZmluaXRpb24gZm9yIGRpZmZlcmVudCB0dW5lcnMKIAogICAgIENvcHlyaWdodCAoQykgMTk5NyBNYXJrdXMgU2Nocm9lZGVyIChzY2hyb2VkbUB1bmktZHVlc3NlbGRvcmYuZGUpCkBAIC0yOCw4OCArMjYsOTAgQEAKIAogI2RlZmluZSBBRERSX1VOU0VUICgyNTUpCiAKLSNkZWZpbmUgVFVORVJfVEVNSUNfUEFMICAgICAwICAgICAgICAvKiA0MDAyIEZINSAoM1ggNzc1NiwgOTQ4MykgKi8KLSNkZWZpbmUgVFVORVJfUEhJTElQU19QQUxfSSAxCi0jZGVmaW5lIFRVTkVSX1BISUxJUFNfTlRTQyAgMgotI2RlZmluZSBUVU5FUl9QSElMSVBTX1NFQ0FNIDMJCS8qIHlvdSBtdXN0IGFjdGl2ZWx5IHNlbGVjdCBCL0csIEwsIExgICovCisjZGVmaW5lIFRVTkVSX1RFTUlDX1BBTAkJCTAgICAgICAgIC8qIDQwMDIgRkg1ICgzWCA3NzU2LCA5NDgzKSAqLworI2RlZmluZSBUVU5FUl9QSElMSVBTX1BBTF9JCQkxCisjZGVmaW5lIFRVTkVSX1BISUxJUFNfTlRTQwkJMgorI2RlZmluZSBUVU5FUl9QSElMSVBTX1NFQ0FNCQkzCS8qIHlvdSBtdXN0IGFjdGl2ZWx5IHNlbGVjdCBCL0csIEwsIExgICovCiAKLSNkZWZpbmUgVFVORVJfQUJTRU5UICAgICAgICA0Ci0jZGVmaW5lIFRVTkVSX1BISUxJUFNfUEFMICAgNQotI2RlZmluZSBUVU5FUl9URU1JQ19OVFNDICAgIDYgICAgICAgIC8qIDQwMzIgRlk1ICgzWCA3MDA0LCA5NDk4LCA5Nzg5KSAgKi8KLSNkZWZpbmUgVFVORVJfVEVNSUNfUEFMX0kgICA3ICAgICAgICAvKiA0MDYyIEZZNSAoM1ggODUwMSwgOTk1NykgICAgICAgICovCisjZGVmaW5lIFRVTkVSX0FCU0VOVAkJCTQKKyNkZWZpbmUgVFVORVJfUEhJTElQU19QQUwJCTUKKyNkZWZpbmUgVFVORVJfVEVNSUNfTlRTQwkJNgkvKiA0MDMyIEZZNSAoM1ggNzAwNCwgOTQ5OCwgOTc4OSkgICovCisjZGVmaW5lIFRVTkVSX1RFTUlDX1BBTF9JCQk3CS8qIDQwNjIgRlk1ICgzWCA4NTAxLCA5OTU3KSAqLwogCi0jZGVmaW5lIFRVTkVSX1RFTUlDXzQwMzZGWTVfTlRTQyA4ICAgLyogNDAzNiBGWTUgKDNYIDEyMjMsIDE5ODEsIDc2ODYpICAqLwotI2RlZmluZSBUVU5FUl9BTFBTX1RTQkgxX05UU0MgCSA5Ci0jZGVmaW5lIFRVTkVSX0FMUFNfVFNCRTFfUEFMIAkxMAotI2RlZmluZSBUVU5FUl9BTFBTX1RTQkI1X1BBTF9JIAkxMQorI2RlZmluZSBUVU5FUl9URU1JQ180MDM2Rlk1X05UU0MJOAkvKiA0MDM2IEZZNSAoM1ggMTIyMywgMTk4MSwgNzY4NikgKi8KKyNkZWZpbmUgVFVORVJfQUxQU19UU0JIMV9OVFNDCQk5CisjZGVmaW5lIFRVTkVSX0FMUFNfVFNCRTFfUEFMCQkxMAorI2RlZmluZSBUVU5FUl9BTFBTX1RTQkI1X1BBTF9JCQkxMQogCi0jZGVmaW5lIFRVTkVSX0FMUFNfVFNCRTVfUEFMIAkxMgotI2RlZmluZSBUVU5FUl9BTFBTX1RTQkM1X1BBTCAJMTMKLSNkZWZpbmUgVFVORVJfVEVNSUNfNDAwNkZINV9QQUwJMTQgICAvKiA0MDA2IEZINSAoM1ggOTUwMCwgOTUwMSwgNzI5MSkgICAgICovCi0jZGVmaW5lIFRVTkVSX0FMUFNfVFNIQzZfTlRTQyAJMTUKKyNkZWZpbmUgVFVORVJfQUxQU19UU0JFNV9QQUwJCTEyCisjZGVmaW5lIFRVTkVSX0FMUFNfVFNCQzVfUEFMCQkxMworI2RlZmluZSBUVU5FUl9URU1JQ180MDA2Rkg1X1BBTAkJMTQJLyogNDAwNiBGSDUgKDNYIDk1MDAsIDk1MDEsIDcyOTEpICovCisjZGVmaW5lIFRVTkVSX0FMUFNfVFNIQzZfTlRTQwkJMTUKIAotI2RlZmluZSBUVU5FUl9URU1JQ19QQUxfREsJMTYgICAvKiA0MDE2IEZZNSAoM1ggMTM5MiwgMTM5MykgICAgICovCi0jZGVmaW5lIFRVTkVSX1BISUxJUFNfTlRTQ19NCTE3Ci0jZGVmaW5lIFRVTkVSX1RFTUlDXzQwNjZGWTVfUEFMX0kgICAgICAgMTggIC8qIDQwNjYgRlk1ICgzWCA3MDMyLCA3MDM1KSAqLwotI2RlZmluZSBUVU5FUl9URU1JQ180MDA2Rk41X01VTFRJX1BBTCAgIDE5ICAvKiBCL0csIEkgYW5kIEQvSyBhdXRvZGV0ZWN0ZWQgKDNYIDc1OTUsIDc2MDYsIDc2NTcpKi8KKyNkZWZpbmUgVFVORVJfVEVNSUNfUEFMX0RLCQkxNgkvKiA0MDE2IEZZNSAoM1ggMTM5MiwgMTM5MykgKi8KKyNkZWZpbmUgVFVORVJfUEhJTElQU19OVFNDX00JCTE3CisjZGVmaW5lIFRVTkVSX1RFTUlDXzQwNjZGWTVfUEFMX0kJMTgJLyogNDA2NiBGWTUgKDNYIDcwMzIsIDcwMzUpICovCisjZGVmaW5lIFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMCTE5CS8qIEIvRywgSSBhbmQgRC9LIGF1dG9kZXRlY3RlZCAoM1ggNzU5NSwgNzYwNiwgNzY1NykgKi8KIAotI2RlZmluZSBUVU5FUl9URU1JQ180MDA5RlI1X1BBTCAgICAgICAgIDIwICAvKiBpbmNsLiBGTSByYWRpbyAoM1ggNzYwNywgNzQ4OCwgNzcxMSkqLwotI2RlZmluZSBUVU5FUl9URU1JQ180MDM5RlI1X05UU0MgICAgICAgIDIxICAvKiBpbmNsLiBGTSByYWRpbyAoM1ggNzI0NiwgNzU3OCwgNzczMikqLwotI2RlZmluZSBUVU5FUl9URU1JQ180MDQ2Rk01ICAgICAgICAgICAgIDIyICAvKiB5b3UgbXVzdCBhY3RpdmVseSBzZWxlY3QgQi9HLCBEL0ssIEksIEwsIExgICEgICgzWCA3ODA0LCA3ODA2LCA4MTAzLCA4MTA0KSovCisjZGVmaW5lIFRVTkVSX1RFTUlDXzQwMDlGUjVfUEFMCQkyMAkvKiBpbmNsLiBGTSByYWRpbyAoM1ggNzYwNywgNzQ4OCwgNzcxMSkgKi8KKyNkZWZpbmUgVFVORVJfVEVNSUNfNDAzOUZSNV9OVFNDCTIxCS8qIGluY2wuIEZNIHJhZGlvICgzWCA3MjQ2LCA3NTc4LCA3NzMyKSAqLworI2RlZmluZSBUVU5FUl9URU1JQ180MDQ2Rk01CQkyMgkvKiB5b3UgbXVzdCBhY3RpdmVseSBzZWxlY3QgQi9HLCBEL0ssIEksIEwsIExgICEgICgzWCA3ODA0LCA3ODA2LCA4MTAzLCA4MTA0KSAqLwogI2RlZmluZSBUVU5FUl9QSElMSVBTX1BBTF9ESwkJMjMKIAotI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZRMTIxNk1FCQkyNCAgLyogeW91IG11c3QgYWN0aXZlbHkgc2VsZWN0IEIvRy9EL0ssIEksIEwsIExgICovCi0jZGVmaW5lIFRVTkVSX0xHX1BBTF9JX0ZNCTI1Ci0jZGVmaW5lIFRVTkVSX0xHX1BBTF9JCQkyNgotI2RlZmluZSBUVU5FUl9MR19OVFNDX0ZNCTI3CisjZGVmaW5lIFRVTkVSX1BISUxJUFNfRlExMjE2TUUJCTI0CS8qIHlvdSBtdXN0IGFjdGl2ZWx5IHNlbGVjdCBCL0cvRC9LLCBJLCBMLCBMYCAqLworI2RlZmluZSBUVU5FUl9MR19QQUxfSV9GTQkJMjUKKyNkZWZpbmUgVFVORVJfTEdfUEFMX0kJCQkyNgorI2RlZmluZSBUVU5FUl9MR19OVFNDX0ZNCQkyNwogCi0jZGVmaW5lIFRVTkVSX0xHX1BBTF9GTQkJMjgKLSNkZWZpbmUgVFVORVJfTEdfUEFMCQkyOQotI2RlZmluZSBUVU5FUl9URU1JQ180MDA5Rk41X01VTFRJX1BBTF9GTQkzMCAgLyogQi9HLCBJIGFuZCBEL0sgYXV0b2RldGVjdGVkICgzWCA4MTU1LCA4MTYwLCA4MTYzKSovCi0jZGVmaW5lIFRVTkVSX1NIQVJQXzJVNUpGNTU0MF9OVFNDICAzMQorI2RlZmluZSBUVU5FUl9MR19QQUxfRk0JCQkyOAorI2RlZmluZSBUVU5FUl9MR19QQUwJCQkyOQorI2RlZmluZSBUVU5FUl9URU1JQ180MDA5Rk41X01VTFRJX1BBTF9GTSAzMAkvKiBCL0csIEkgYW5kIEQvSyBhdXRvZGV0ZWN0ZWQgKDNYIDgxNTUsIDgxNjAsIDgxNjMpICovCisjZGVmaW5lIFRVTkVSX1NIQVJQXzJVNUpGNTU0MF9OVFNDCTMxCiAKLSNkZWZpbmUgVFVORVJfU2Ftc3VuZ19QQUxfVENQTTkwOTFQRDI3IDMyCi0jZGVmaW5lIFRVTkVSX01UMjAzMiAzMwotI2RlZmluZSBUVU5FUl9URU1JQ180MTA2Rkg1IAkzNAkvKiA0MTA2IEZINSAoM1ggNzgwOCwgNzg2NSkqLwotI2RlZmluZSBUVU5FUl9URU1JQ180MDEyRlk1CTM1CS8qIDQwMTIgRlk1ICgzWCAwOTcxLCAxMDk5KSovCisjZGVmaW5lIFRVTkVSX1NhbXN1bmdfUEFMX1RDUE05MDkxUEQyNwkzMgorI2RlZmluZSBUVU5FUl9NVDIwMzIJCQkzMworI2RlZmluZSBUVU5FUl9URU1JQ180MTA2Rkg1CQkzNAkvKiA0MTA2IEZINSAoM1ggNzgwOCwgNzg2NSkgKi8KKyNkZWZpbmUgVFVORVJfVEVNSUNfNDAxMkZZNQkJMzUJLyogNDAxMiBGWTUgKDNYIDA5NzEsIDEwOTkpICovCiAKLSNkZWZpbmUgVFVORVJfVEVNSUNfNDEzNkZZNQkzNgkvKiA0MTM2IEZZNSAoM1ggNzcwOCwgNzc0NikqLwotI2RlZmluZSBUVU5FUl9MR19QQUxfTkVXX1RBUEMgICAzNwotI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMyAgMzgKLSNkZWZpbmUgVFVORVJfTEdfTlRTQ19ORVdfVEFQQyAgIDM5CisjZGVmaW5lIFRVTkVSX1RFTUlDXzQxMzZGWTUJCTM2CS8qIDQxMzYgRlk1ICgzWCA3NzA4LCA3NzQ2KSAqLworI2RlZmluZSBUVU5FUl9MR19QQUxfTkVXX1RBUEMJCTM3CisjZGVmaW5lIFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszCTM4CisjZGVmaW5lIFRVTkVSX0xHX05UU0NfTkVXX1RBUEMJCTM5CiAKLSNkZWZpbmUgVFVORVJfSElUQUNISV9OVFNDICAgICAgIDQwCi0jZGVmaW5lIFRVTkVSX1BISUxJUFNfUEFMX01LICAgICA0MQotI2RlZmluZSBUVU5FUl9QSElMSVBTX0FUU0MgICAgICAgNDIKLSNkZWZpbmUgVFVORVJfUEhJTElQU19GTTEyMzZfTUszIDQzCisjZGVmaW5lIFRVTkVSX0hJVEFDSElfTlRTQwkJNDAKKyNkZWZpbmUgVFVORVJfUEhJTElQU19QQUxfTUsJCTQxCisjZGVmaW5lIFRVTkVSX1BISUxJUFNfQVRTQwkJNDIKKyNkZWZpbmUgVFVORVJfUEhJTElQU19GTTEyMzZfTUszCTQzCiAKLSNkZWZpbmUgVFVORVJfUEhJTElQU180SU4xICAgICAgIDQ0CS8qIEFUSSBUViBXb25kZXIgUHJvIC0gQ29uZXhhbnQgKi8KKyNkZWZpbmUgVFVORVJfUEhJTElQU180SU4xCQk0NAkvKiBBVEkgVFYgV29uZGVyIFBybyAtIENvbmV4YW50ICovCiAvKiBNaWNyb3R1bmUgbWVyZ2VnZWQgd2l0aCBUZW1pYyAxMi8zMS8xOTk5IHBhcnRpYWxseSBmaW5hbmNlZCBieSBBbHBzIC0gdGhlc2UgbWF5IGJlIHNpbWlsYXIgdG8gVGVtaWMgKi8KLSNkZWZpbmUgVFVORVJfTUlDUk9UVU5FXzQwNDlGTTUgIDQ1Ci0jZGVmaW5lIFRVTkVSX0xHX05UU0NfVEFQRSAgICAgICA0NworI2RlZmluZSBUVU5FUl9NSUNST1RVTkVfNDA0OUZNNSAJNDUKKyNkZWZpbmUgVFVORVJfTUlDUk9UVU5FXzQwNDJfRkk1CTQ2CisjZGVmaW5lIFRVTkVSX0xHX05UU0NfVEFQRQkJNDcKIAotI2RlZmluZSBUVU5FUl9UTkZfODgzMUJHRkYgICAgICAgNDgKLSNkZWZpbmUgVFVORVJfTUlDUk9UVU5FXzQwNDJGSTUgIDQ5CS8qIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEgLSA0MDQyIEZJNSAoM1ggODE0NykgKi8KLSNkZWZpbmUgVFVORVJfVENMXzIwMDJOICAgICAgICAgIDUwCi0jZGVmaW5lIFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMyAgIDUxCisjZGVmaW5lIFRVTkVSX1RORl84ODMxQkdGRgkJNDgKKyNkZWZpbmUgVFVORVJfTUlDUk9UVU5FXzQwNDJGSTUJCTQ5CS8qIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEgLSA0MDQyIEZJNSAoM1ggODE0NykgKi8KKyNkZWZpbmUgVFVORVJfVENMXzIwMDJOCQkJNTAKKyNkZWZpbmUgVFVORVJfUEhJTElQU19GTTEyNTZfSUgzCTUxCiAKLSNkZWZpbmUgVFVORVJfVEhPTVNPTl9EVFQ3NjEwICAgIDUyCi0jZGVmaW5lIFRVTkVSX1BISUxJUFNfRlExMjg2ICAgICA1MwotI2RlZmluZSBUVU5FUl9QSElMSVBTX1REQTgyOTAgICAgNTQKLSNkZWZpbmUgVFVORVJfTEdfUEFMX1RBUEUgICAgICAgIDU1ICAgIC8qIEhhdXBwYXVnZSBQVlItMTUwIFBBTCAqLworI2RlZmluZSBUVU5FUl9USE9NU09OX0RUVDc2MTAJCTUyCisjZGVmaW5lIFRVTkVSX1BISUxJUFNfRlExMjg2CQk1MworI2RlZmluZSBUVU5FUl9QSElMSVBTX1REQTgyOTAJCTU0CisjZGVmaW5lIFRVTkVSX0xHX1BBTF9UQVBFCQk1NQkvKiBIYXVwcGF1Z2UgUFZSLTE1MCBQQUwgKi8KIAotI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZRMTIxNkFNRV9NSzQgNTYgLyogSGF1cHBhdWdlIFBWUi0xNTAgUEFMICovCi0jZGVmaW5lIFRVTkVSX1BISUxJUFNfRlExMjM2QV9NSzQgICA1NyAgIC8qIEhhdXBwYXVnZSBQVlItNTAwTUNFIE5UU0MgKi8KKyNkZWZpbmUgVFVORVJfUEhJTElQU19GUTEyMTZBTUVfTUs0CTU2CS8qIEhhdXBwYXVnZSBQVlItMTUwIFBBTCAqLworI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZRMTIzNkFfTUs0CTU3CS8qIEhhdXBwYXVnZSBQVlItNTAwTUNFIE5UU0MgKi8KKyNkZWZpbmUgVFVORVJfWU1FQ19UVkZfODUzMU1GCQk1OAorI2RlZmluZSBUVU5FUl9ZTUVDX1RWRl81NTMzTUYJCTU5CS8qIFBpeGVsdmlldyBQcm8gVWx0cmEgTlRTQyAqLwogCi0jZGVmaW5lIFRVTkVSX1lNRUNfVFZGXzg1MzFNRiA1OAotI2RlZmluZSBUVU5FUl9ZTUVDX1RWRl81NTMzTUYgNTkJLyogUGl4ZWx2aWV3IFBybyBVbHRyYSBOVFNDICovCi0jZGVmaW5lIFRVTkVSX1RIT01TT05fRFRUNzYxMSA2MAkvKiBEVmlDTyBGdXNpb25IRFRWIDMgR29sZC1UICovCi0jZGVmaW5lIFRVTkVSX1RFTkFfOTUzM19ESSAgICA2MQorI2RlZmluZSBUVU5FUl9USE9NU09OX0RUVDc2MTEJCTYwCS8qIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVQgKi8KKyNkZWZpbmUgVFVORVJfVEVOQV85NTMzX0RJCQk2MQorI2RlZmluZSBUVU5FUl9URUE1NzY3CQkJNjIJLyogT25seSBGTSBSYWRpbyBUdW5lciAqLworI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMJNjMKIAotI2RlZmluZSBUVU5FUl9URUE1NzY3ICAgICAgICAgNjIJLyogT25seSBGTSBSYWRpbyBUdW5lciAqLwotI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMgNjMKLSNkZWZpbmUgVFVORVJfTEdfVERWU19IMDYyRiAgIDY0CS8qIERWaUNPIEZ1c2lvbkhEVFYgNSAqLwotI2RlZmluZSBUVU5FUl9ZTUVDX1RWRjY2VDVfQl9ERkYgNjUJLyogQWNvcnAgWTg3OEYgKi8KKyNkZWZpbmUgVFVORVJfTEdfVERWU19IMDYyRgkJNjQJLyogRFZpQ08gRnVzaW9uSERUViA1ICovCisjZGVmaW5lIFRVTkVSX1lNRUNfVFZGNjZUNV9CX0RGRgk2NQkvKiBBY29ycCBZODc4RiAqLworI2RlZmluZSBUVU5FUl9MR19OVFNDX1RBTE5fTUlOSQkJNjYKIAogI2RlZmluZSBOT1RVTkVSIDAKICNkZWZpbmUgUEFMICAgICAxCS8qIFBBTF9CRyAqLwpAQCAtMTE3LDcgKzExNyw3IEBACiAjZGVmaW5lIE5UU0MgICAgMwogI2RlZmluZSBTRUNBTSAgIDQKICNkZWZpbmUgQVRTQyAgICA1Ci0jZGVmaW5lIFJBRElPCTYKKyNkZWZpbmUgUkFESU8gICA2CiAKICNkZWZpbmUgTm9UdW5lciAwCiAjZGVmaW5lIFBoaWxpcHMgMQpAQCAtMTM0LDYgKzEzNCw3IEBACiAjZGVmaW5lIFRIT01TT04gMTIKIAogI2RlZmluZSBUVU5FUl9TRVRfVFlQRV9BRERSICAgICAgICAgIF9JT1coJ1QnLDMsaW50KQorI2RlZmluZSBUVU5FUl9TRVRfU1RBTkRCWSAgICAgICAgICAgIF9JT1coJ1QnLDQsaW50KQogI2RlZmluZSBUREE5ODg3X1NFVF9DT05GSUcgICAgICAgICAgIF9JT1coJ3QnLDUsaW50KQogCiAvKiB0diBjYXJkIHNwZWNpZmljICovCkBAIC0xNTMsOSArMTU0LDYgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBJMkNfQUREUl9UREE4MjkwICAgICAgICAweDRiCi0jZGVmaW5lIEkyQ19BRERSX1REQTgyNzUgICAgICAgIDB4NjEKLQogZW51bSB0dW5lcl9tb2RlIHsKIAlUX1VOSU5JVElBTElaRUQgPSAwLAogCVRfUkFESU8JCT0gMSA8PCBWNEwyX1RVTkVSX1JBRElPLApAQCAtMTY1LDIxICsxNjMsMjEgQEAKIH07CiAKIHN0cnVjdCB0dW5lcl9zZXR1cCB7Ci0JdW5zaWduZWQgc2hvcnQJCWFkZHI7Ci0JdW5zaWduZWQgaW50CQl0eXBlOwotCXVuc2lnbmVkIGludAkJbW9kZV9tYXNrOworCXVuc2lnbmVkIHNob3J0CWFkZHI7CisJdW5zaWduZWQgaW50CXR5cGU7CisJdW5zaWduZWQgaW50CW1vZGVfbWFzazsKIH07CiAKIHN0cnVjdCB0dW5lciB7CiAJLyogZGV2aWNlICovCiAJc3RydWN0IGkyY19jbGllbnQgaTJjOwogCi0JdW5zaWduZWQgaW50IHR5cGU7ICAgICAgICAgICAgLyogY2hpcCB0eXBlICovCisJdW5zaWduZWQgaW50IHR5cGU7CS8qIGNoaXAgdHlwZSAqLwogCi0JdW5zaWduZWQgaW50ICAgICAgICAgIG1vZGU7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgIG1vZGVfbWFzazsgLyogQ29tYmluYXRpb24gb2YgYWxsb3dhYmxlIG1vZGVzICovCisJdW5zaWduZWQgaW50IG1vZGU7CisJdW5zaWduZWQgaW50IG1vZGVfbWFzazsJLyogQ29tYmluYXRpb24gb2YgYWxsb3dhYmxlIG1vZGVzICovCiAKLQl1bnNpZ25lZCBpbnQgZnJlcTsgICAgICAgICAgICAvKiBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNldHRpbmdzICovCisJdW5zaWduZWQgaW50IGZyZXE7CS8qIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KIAl1bnNpZ25lZCBpbnQgYXVkbW9kZTsKIAl2NGwyX3N0ZF9pZCAgc3RkOwogCkBAIC0xOTgsNiArMTk2LDcgQEAKIAl2b2lkICgqcmFkaW9fZnJlcSkoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBmcmVxKTsKIAlpbnQgICgqaGFzX3NpZ25hbCkoc3RydWN0IGkyY19jbGllbnQgKmMpOwogCWludCAgKCppc19zdGVyZW8pKHN0cnVjdCBpMmNfY2xpZW50ICpjKTsKKwl2b2lkICgqc3RhbmRieSkoc3RydWN0IGkyY19jbGllbnQgKmMpOwogfTsKIAogZXh0ZXJuIHVuc2lnbmVkIGludCB0dW5lcl9kZWJ1ZzsKQEAgLTIwOSwxNiArMjA4LDIwIEBACiBleHRlcm4gaW50IGRlZmF1bHRfdHVuZXJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CiBleHRlcm4gaW50IHRlYTU3NjdfYXV0b2RldGVjdGlvbihzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CiAKLSNkZWZpbmUgdHVuZXJfd2FybihmbXQsIGFyZy4uLikgXAotCWRldl9wcmludGsoS0VSTl9XQVJOSU5HICwgJnQtPmkyYy5kZXYgLCBmbXQgLCAjIyBhcmcpCi0jZGVmaW5lIHR1bmVyX2luZm8oZm10LCBhcmcuLi4pIFwKLQlkZXZfcHJpbnRrKEtFUk5fSU5GTyAsICZ0LT5pMmMuZGV2ICwgZm10ICwgIyMgYXJnKQotI2RlZmluZSB0dW5lcl9kYmcoZm10LCBhcmcuLi4pIFwKLQlpZiAodHVuZXJfZGVidWcpIGRldl9wcmludGsoS0VSTl9ERUJVRyAsICZ0LT5pMmMuZGV2ICwgZm10ICwgIyMgYXJnKQorI2RlZmluZSB0dW5lcl93YXJuKGZtdCwgYXJnLi4uKSBkbyB7XAorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzICVkLSUwNHg6ICIgZm10LCB0LT5pMmMuZHJpdmVyLT5uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICB0LT5pMmMuYWRhcHRlci0+bnIsIHQtPmkyYy5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQorI2RlZmluZSB0dW5lcl9pbmZvKGZtdCwgYXJnLi4uKSBkbyB7XAorCXByaW50ayhLRVJOX0lORk8gIiVzICVkLSUwNHg6ICIgZm10LCB0LT5pMmMuZHJpdmVyLT5uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICB0LT5pMmMuYWRhcHRlci0+bnIsIHQtPmkyYy5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQorI2RlZmluZSB0dW5lcl9kYmcoZm10LCBhcmcuLi4pIGRvIHtcCisJaWYgKHR1bmVyX2RlYnVnKSBcCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzICVkLSUwNHg6ICIgZm10LCB0LT5pMmMuZHJpdmVyLT5uYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICB0LT5pMmMuYWRhcHRlci0+bnIsIHQtPmkyYy5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCi0jZW5kaWYKKyNlbmRpZiAvKiBfVFVORVJfSCAqLwogCiAvKgogICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3R2ZWVwcm9tLmggYi9pbmNsdWRlL21lZGlhL3R2ZWVwcm9tLmgKaW5kZXggODU0YTJjMi4uZTIwMzVjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS90dmVlcHJvbS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdHZlZXByb20uaApAQCAtMSwxOCArMSwyMSBAQAogLyoKLSAqICRJZDogdHZlZXByb20uaCx2IDEuMiAyMDA1LzA2LzEyIDA0OjE5OjE5IG1jaGVoYWIgRXhwICQKICAqLwogCiBzdHJ1Y3QgdHZlZXByb20gewogCXUzMiBoYXNfcmFkaW87CisJdTMyIGhhc19pcjsgICAgIC8qIDA6IG5vIElSLCAxOiBJUiBwcmVzZW50LCAyOiB1bmtub3duICovCiAKIAl1MzIgdHVuZXJfdHlwZTsKIAl1MzIgdHVuZXJfZm9ybWF0czsKIAorCXUzMiB0dW5lcjJfdHlwZTsKKwl1MzIgdHVuZXIyX2Zvcm1hdHM7CisKIAl1MzIgZGlnaXRpemVyOwogCXUzMiBkaWdpdGl6ZXJfZm9ybWF0czsKIAogCXUzMiBhdWRpb19wcm9jZXNzb3I7Ci0JLyogYV9wX2ZtdHM/ICovCisJdTMyIGRlY29kZXJfcHJvY2Vzc29yOwogCiAJdTMyIG1vZGVsOwogCXUzMiByZXZpc2lvbjsKQEAgLTIwLDcgKzIzLDcgQEAKIAljaGFyIHJldl9zdHJbNV07CiB9OwogCi12b2lkIHR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2coc3RydWN0IHR2ZWVwcm9tICp0dmVlLAordm9pZCB0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3QgdHZlZXByb20gKnR2ZWUsCiAJCQkgICAgICAgdW5zaWduZWQgY2hhciAqZWVwcm9tX2RhdGEpOwogCiBpbnQgdHZlZXByb21fcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgY2hhciAqZWVkYXRhLCBpbnQgbGVuKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdmlkZW8tYnVmLmggYi9pbmNsdWRlL21lZGlhL3ZpZGVvLWJ1Zi5oCmluZGV4IGFlNmRhNmQuLmFlOGQ3YTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdmlkZW8tYnVmLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92aWRlby1idWYuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IHZpZGVvLWJ1Zi5oLHYgMS45IDIwMDQvMTEvMDcgMTM6MTc6MTUga3JheGVsIEV4cCAkCiAgKgogICogZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zIGZvciB2aWRlbzRsaW51eCBjYXB0dXJlIGJ1ZmZlcnMsIHRvIGhhbmRsZQogICogbWVtb3J5IG1hbmFnZW1lbnQgYW5kIFBDSSBETUEuICBSaWdodCBub3cgYnR0diArIHNhYTcxMzQgdXNlIGl0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYXgyNS5oIGIvaW5jbHVkZS9uZXQvYXgyNS5oCmluZGV4IDkyNmVlZDUuLjIyN2QzMzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2F4MjUuaAorKysgYi9pbmNsdWRlL25ldC9heDI1LmgKQEAgLTI1Nyw4ICsyNTcsOCBAQAogCiAvKiBheDI1X2FkZHIuYyAqLwogZXh0ZXJuIGF4MjVfYWRkcmVzcyBudWxsX2F4MjVfYWRkcmVzczsKLWV4dGVybiBjaGFyICpheDJhc2MoYXgyNV9hZGRyZXNzICopOwotZXh0ZXJuIGF4MjVfYWRkcmVzcyAqYXNjMmF4KGNoYXIgKik7CitleHRlcm4gY2hhciAqYXgyYXNjKGNoYXIgKmJ1ZiwgYXgyNV9hZGRyZXNzICopOworZXh0ZXJuIHZvaWQgYXNjMmF4KGF4MjVfYWRkcmVzcyAqYWRkciwgY2hhciAqY2FsbHNpZ24pOwogZXh0ZXJuIGludCAgYXgyNWNtcChheDI1X2FkZHJlc3MgKiwgYXgyNV9hZGRyZXNzICopOwogZXh0ZXJuIGludCAgYXgyNWRpZ2ljbXAoYXgyNV9kaWdpICosIGF4MjVfZGlnaSAqKTsKIGV4dGVybiB1bnNpZ25lZCBjaGFyICpheDI1X2FkZHJfcGFyc2UodW5zaWduZWQgY2hhciAqLCBpbnQsIGF4MjVfYWRkcmVzcyAqLCBheDI1X2FkZHJlc3MgKiwgYXgyNV9kaWdpICosIGludCAqLCBpbnQgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jb21wYXQuaCBiL2luY2x1ZGUvbmV0L2NvbXBhdC5oCmluZGV4IDk5ODNmZDguLjI5MGJhYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvbmV0L2NvbXBhdC5oCkBAIC0zMyw3ICszMyw4IEBACiBleHRlcm4gYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcmVjdm1zZyhpbnQsc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICosdW5zaWduZWQpOwogZXh0ZXJuIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2dldHNvY2tvcHQoaW50LCBpbnQsIGludCwgY2hhciBfX3VzZXIgKiwgaW50IF9fdXNlciAqKTsKIGV4dGVybiBpbnQgcHV0X2Ntc2dfY29tcGF0KHN0cnVjdCBtc2doZHIqLCBpbnQsIGludCwgaW50LCB2b2lkICopOwotZXh0ZXJuIGludCBjbXNnaGRyX2Zyb21fdXNlcl9jb21wYXRfdG9fa2VybihzdHJ1Y3QgbXNnaGRyICosIHVuc2lnbmVkIGNoYXIgKiwKLQkJaW50KTsKKworc3RydWN0IHNvY2s7CitleHRlcm4gaW50IGNtc2doZHJfZnJvbV91c2VyX2NvbXBhdF90b19rZXJuKHN0cnVjdCBtc2doZHIgKiwgc3RydWN0IHNvY2sgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOwogCiAjZW5kaWYgLyogTkVUX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZWVlODAyMTEuaCBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCmluZGV4IGRiMDk1ODAuLmRjMzZiMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCkBAIC0yMCwxOCArMjAsOSBAQAogICovCiAjaWZuZGVmIElFRUU4MDIxMV9ICiAjZGVmaW5lIElFRUU4MDIxMV9ICi0KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPiAvKiBFVEhfQUxFTiAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAgIC8qIEFSUkFZX1NJWkUgKi8KLQotI2lmIFdJUkVMRVNTX0VYVCA8IDE3Ci0jZGVmaW5lIElXX1FVQUxfUVVBTF9JTlZBTElEICAgMHgxMAotI2RlZmluZSBJV19RVUFMX0xFVkVMX0lOVkFMSUQgIDB4MjAKLSNkZWZpbmUgSVdfUVVBTF9OT0lTRV9JTlZBTElEICAweDQwCi0jZGVmaW5lIElXX1FVQUxfUVVBTF9VUERBVEVEICAgMHgxCi0jZGVmaW5lIElXX1FVQUxfTEVWRUxfVVBEQVRFRCAgMHgyCi0jZGVmaW5lIElXX1FVQUxfTk9JU0VfVVBEQVRFRCAgMHg0Ci0jZW5kaWYKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogCiAjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTgkJMjMwNAogLyogTWF4aW11bSBzaXplIGZvciB0aGUgTUEtVU5JVERBVEEgcHJpbWl0aXZlLCA4MDIuMTEgc3RhbmRhcmQgc2VjdGlvbgpAQCAtNDcsNTEgKzM4LDIyIEBACiAjZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4JCShJRUVFODAyMTFfREFUQV9MRU4gKyBJRUVFODAyMTFfSExFTikKIAogc3RydWN0IGllZWU4MDIxMV9oZHIgewotCXUxNiBmcmFtZV9jdGw7Ci0JdTE2IGR1cmF0aW9uX2lkOworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOwogCXU4IGFkZHIxW0VUSF9BTEVOXTsKIAl1OCBhZGRyMltFVEhfQUxFTl07CiAJdTggYWRkcjNbRVRIX0FMRU5dOwotCXUxNiBzZXFfY3RsOworCV9fbGUxNiBzZXFfY3RsOwogCXU4IGFkZHI0W0VUSF9BTEVOXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciB7Ci0JdTE2IGZyYW1lX2N0bDsKLQl1MTYgZHVyYXRpb25faWQ7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CiAJdTggYWRkcjFbRVRIX0FMRU5dOwogCXU4IGFkZHIyW0VUSF9BTEVOXTsKIAl1OCBhZGRyM1tFVEhfQUxFTl07Ci0JdTE2IHNlcV9jdGw7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotZW51bSBlYXBfdHlwZSB7Ci0JRUFQX1BBQ0tFVCA9IDAsCi0JRUFQT0xfU1RBUlQsCi0JRUFQT0xfTE9HT0ZGLAotCUVBUE9MX0tFWSwKLQlFQVBPTF9FTkNBUF9BU0ZfQUxFUlQKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICplYXBfdHlwZXNbXSA9IHsKLQlbRUFQX1BBQ0tFVF0JCT0gIkVBUC1QYWNrZXQiLAotCVtFQVBPTF9TVEFSVF0JCT0gIkVBUE9MLVN0YXJ0IiwKLQlbRUFQT0xfTE9HT0ZGXQkJPSAiRUFQT0wtTG9nb2ZmIiwKLQlbRUFQT0xfS0VZXQkJPSAiRUFQT0wtS2V5IiwKLQlbRUFQT0xfRU5DQVBfQVNGX0FMRVJUXQk9ICJFQVBPTC1FbmNhcC1BU0YtQWxlcnQiCi19OwotCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVhcF9nZXRfdHlwZShpbnQgdHlwZSkKLXsKLQlyZXR1cm4gKHR5cGUgPj0gQVJSQVlfU0laRShlYXBfdHlwZXMpKSA/ICJVbmtub3duIiA6IGVhcF90eXBlc1t0eXBlXTsKLX0KLQotc3RydWN0IGVhcG9sIHsKLQl1OCBzbmFwWzZdOwotCXUxNiBldGhlcnR5cGU7Ci0JdTggdmVyc2lvbjsKLQl1OCB0eXBlOwotCXUxNiBsZW5ndGg7CisJX19sZTE2IHNlcV9jdGw7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogI2RlZmluZSBJRUVFODAyMTFfMUFERFJfTEVOIDEwCkBAIC0xMDQsNyArNjYsNyBAQAogI2RlZmluZQlNQVhfRlJBR19USFJFU0hPTEQgICAgIDIzNDZVCiAKIC8qIEZyYW1lIGNvbnRyb2wgZmllbGQgY29uc3RhbnRzICovCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1ZFUlMJCTB4MDAwMgorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9WRVJTCQkweDAwMDMKICNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlRZUEUJCTB4MDAwYwogI2RlZmluZSBJRUVFODAyMTFfRkNUTF9TVFlQRQkJMHgwMGYwCiAjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1RPRFMJCTB4MDEwMApAQCAtMTEyLDggKzc0LDggQEAKICNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTCTB4MDQwMAogI2RlZmluZSBJRUVFODAyMTFfRkNUTF9SRVRSWQkJMHgwODAwCiAjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1BNCQkweDEwMDAKLSNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRURBVEEJMHgyMDAwCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1dFUAkJMHg0MDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBCQkweDIwMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVECTB4NDAwMAogI2RlZmluZSBJRUVFODAyMTFfRkNUTF9PUkRFUgkJMHg4MDAwCiAKICNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX01HTVQJCTB4MDAwMApAQCAtMTMyLDYgKzk0LDcgQEAKICNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DCTB4MDBBMAogI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVVUSAkJMHgwMEIwCiAjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQUNUSU9OCQkweDAwRDAKIAogLyogY29udHJvbCAqLwogI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFNQT0xMCQkweDAwQTAKQEAgLTE2Nyw4ICsxMzAsMTkgQEAKICNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmCS8qIENPTkZJR19JRUVFODAyMTFfREVCVUcgKi8KIAorCisvKiBkZWJ1ZyBtYWNyb3Mgbm90IGRlcGVuZGVudCBvbiBDT05GSUdfSUVFRTgwMjExX0RFQlVHICovCisKKyNkZWZpbmUgTUFDX0ZNVCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiCisjZGVmaW5lIE1BQ19BUkcoeCkgKCh1OCopKHgpKVswXSwoKHU4KikoeCkpWzFdLCgodTgqKSh4KSlbMl0sKCh1OCopKHgpKVszXSwoKHU4KikoeCkpWzRdLCgodTgqKSh4KSlbNV0KKworLyogZXNjYXBlX2Vzc2lkKCkgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBkZWJ1ZyAoYW5kIHBvc3NpYmx5IGVycm9yKQorICogbWVzc2FnZXMuIEl0IHNob3VsZCBuZXZlciBiZSB1c2VkIGZvciBwYXNzaW5nIGVzc2lkIHRvIHVzZXIgc3BhY2UuICovCitjb25zdCBjaGFyICplc2NhcGVfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIHU4IGVzc2lkX2xlbik7CisKKwogLyoKLSAqIFRvIHVzZSB0aGUgZGVidWcgc3lzdGVtOworICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW06CiAgKgogICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQogICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgpAQCAtMTg0LDExICsxNTgsMTEgQEAKICAqCiAgKiBUbyBhZGQgeW91ciBkZWJ1ZyBsZXZlbCB0byB0aGUgbGlzdCBvZiBsZXZlbHMgc2VlbiB3aGVuIHlvdSBwZXJmb3JtCiAgKgotICogJSBjYXQgL3Byb2MvbmV0L2lwdy9kZWJ1Z19sZXZlbAorICogJSBjYXQgL3Byb2MvbmV0L2llZWU4MDIxMS9kZWJ1Z19sZXZlbAogICoKLSAqIHlvdSBzaW1wbHkgbmVlZCB0byBhZGQgeW91ciBlbnRyeSB0byB0aGUgaXB3X2RlYnVnX2xldmVscyBhcnJheS4KKyAqIHlvdSBzaW1wbHkgbmVlZCB0byBhZGQgeW91ciBlbnRyeSB0byB0aGUgaWVlZTgwMjExX2RlYnVnX2xldmVsIGFycmF5LgogICoKLSAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pcHcgdGhlbiB5b3UgZG8gbm90IGhhdmUKKyAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pZWVlODAyMTEgdGhlbiB5b3UgZG8gbm90IGhhdmUKICAqIENPTkZJR19JRUVFODAyMTFfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCiAgKgogICovCkBAIC0xOTksNyArMTczLDYgQEAKICNkZWZpbmUgSUVFRTgwMjExX0RMX1NUQVRFICAgICAgICAgKDE8PDMpCiAjZGVmaW5lIElFRUU4MDIxMV9ETF9NR01UICAgICAgICAgICgxPDw0KQogI2RlZmluZSBJRUVFODAyMTFfRExfRlJBRyAgICAgICAgICAoMTw8NSkKLSNkZWZpbmUgSUVFRTgwMjExX0RMX0VBUCAgICAgICAgICAgKDE8PDYpCiAjZGVmaW5lIElFRUU4MDIxMV9ETF9EUk9QICAgICAgICAgICgxPDw3KQogCiAjZGVmaW5lIElFRUU4MDIxMV9ETF9UWCAgICAgICAgICAgICgxPDw4KQpAQCAtMjE0LDcgKzE4Nyw2IEBACiAjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19TVEFURShmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9TVEFURSwgZiwgIyMgYSkKICNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX01HTVQoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfTUdNVCwgZiwgIyMgYSkKICNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0ZSQUcoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRlJBRywgZiwgIyMgYSkKLSNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0VBUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FQVAsIGYsICMjIGEpCiAjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19EUk9QKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0RST1AsIGYsICMjIGEpCiAjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19UWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UWCwgZiwgIyMgYSkKICNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1JYKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JYLCBmLCAjIyBhKQpAQCAtMjIzLDkgKzE5NSw5IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+IC8qIEFSUEhSRF9FVEhFUiAqLwogCiAjaWZuZGVmIFdJUkVMRVNTX1NQWQotI2RlZmluZSBXSVJFTEVTU19TUFkJCS8vIGVuYWJsZSBpd3NweSBzdXBwb3J0CisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLyogZW5hYmxlIGl3c3B5IHN1cHBvcnQgKi8KICNlbmRpZgotI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8vIG5ldyBkcml2ZXIgQVBJCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLyogbmV3IGRyaXZlciBBUEkgKi8KIAogI2lmbmRlZiBFVEhfUF9QQUUKICNkZWZpbmUgRVRIX1BfUEFFIDB4ODg4RSAvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLwpAQCAtMjUyLDYgKzIyNCw3IEBACiAKICNkZWZpbmUgU05BUF9TSVpFIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyKQogCisjZGVmaW5lIFdMQU5fRkNfR0VUX1ZFUlMoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfVkVSUykKICNkZWZpbmUgV0xBTl9GQ19HRVRfVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkKICNkZWZpbmUgV0xBTl9GQ19HRVRfU1RZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpCiAKQEAgLTI2NCw3ICsyMzcsNyBAQAogCiAjZGVmaW5lIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOIDEyOAogCi0jZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9CU1MgKDE8PDApCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9FU1MgKDE8PDApCiAjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9JQlNTICgxPDwxKQogI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTEFCTEUgKDE8PDIpCiAjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QgKDE8PDMpCkBAIC0yNzIsMzQgKzI0NSw3MiBAQAogI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUgKDE8PDUpCiAjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QQkNDICgxPDw2KQogI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0hBTk5FTF9BR0lMSVRZICgxPDw3KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU1BFQ1RSVU1fTUdNVCAoMTw8OCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1RfVElNRSAoMTw8MTApCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9PU1NTX09GRE0gKDE8PDEzKQogCiAvKiBTdGF0dXMgY29kZXMgKi8KLSNkZWZpbmUgV0xBTl9TVEFUVVNfU1VDQ0VTUyAwCi0jZGVmaW5lIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUgMQotI2RlZmluZSBXTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEIDEwCi0jZGVmaW5lIFdMQU5fU1RBVFVTX1JFQVNTT0NfTk9fQVNTT0MgMTEKLSNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1VOU1BFQyAxMgotI2RlZmluZSBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHIDEzCi0jZGVmaW5lIFdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTiAxNAotI2RlZmluZSBXTEFOX1NUQVRVU19DSEFMTEVOR0VfRkFJTCAxNQotI2RlZmluZSBXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQgMTYKLSNkZWZpbmUgV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBIDE3Ci0jZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9SQVRFUyAxOAotLyogODAyLjExYiAqLwotI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TSE9SVCAxOQotI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9QQkNDIDIwCi0jZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT0FHSUxJVFkgMjEKK2VudW0gaWVlZTgwMjExX3N0YXR1c2NvZGUgeworCVdMQU5fU1RBVFVTX1NVQ0NFU1MgPSAwLAorCVdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUgPSAxLAorCVdMQU5fU1RBVFVTX0NBUFNfVU5TVVBQT1JURUQgPSAxMCwKKwlXTEFOX1NUQVRVU19SRUFTU09DX05PX0FTU09DID0gMTEsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1VOU1BFQyA9IDEyLAorCVdMQU5fU1RBVFVTX05PVF9TVVBQT1JURURfQVVUSF9BTEcgPSAxMywKKwlXTEFOX1NUQVRVU19VTktOT1dOX0FVVEhfVFJBTlNBQ1RJT04gPSAxNCwKKwlXTEFOX1NUQVRVU19DSEFMTEVOR0VfRkFJTCA9IDE1LAorCVdMQU5fU1RBVFVTX0FVVEhfVElNRU9VVCA9IDE2LAorCVdMQU5fU1RBVFVTX0FQX1VOQUJMRV9UT19IQU5ETEVfTkVXX1NUQSA9IDE3LAorCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9SQVRFUyA9IDE4LAorCS8qIDgwMi4xMWIgKi8KKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TSE9SVFBSRUFNQkxFID0gMTksCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PUEJDQyA9IDIwLAorCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT0FHSUxJVFkgPSAyMSwKKwkvKiA4MDIuMTFoICovCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PU1BFQ1RSVU0gPSAyMiwKKwlXTEFOX1NUQVRVU19BU1NPQ19SRUpFQ1RFRF9CQURfUE9XRVIgPSAyMywKKwlXTEFOX1NUQVRVU19BU1NPQ19SRUpFQ1RFRF9CQURfU1VQUF9DSEFOID0gMjQsCisJLyogODAyLjExZyAqLworCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NIT1JUVElNRSA9IDI1LAorCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT0RTU1NPRkRNID0gMjYsCisJLyogODAyLjExaSAqLworCVdMQU5fU1RBVFVTX0lOVkFMSURfSUUgPSA0MCwKKwlXTEFOX1NUQVRVU19JTlZBTElEX0dST1VQX0NJUEhFUiA9IDQxLAorCVdMQU5fU1RBVFVTX0lOVkFMSURfUEFJUldJU0VfQ0lQSEVSID0gNDIsCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9BS01QID0gNDMsCisJV0xBTl9TVEFUVVNfVU5TVVBQX1JTTl9WRVJTSU9OID0gNDQsCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9SU05fSUVfQ0FQID0gNDUsCisJV0xBTl9TVEFUVVNfQ0lQSEVSX1NVSVRFX1JFSkVDVEVEID0gNDYsCit9OwogCiAvKiBSZWFzb24gY29kZXMgKi8KLSNkZWZpbmUgV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQgMQotI2RlZmluZSBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEIDIKLSNkZWZpbmUgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcgMwotI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSA0Ci0jZGVmaW5lIFdMQU5fUkVBU09OX0RJU0FTU09DX0FQX0JVU1kgNQotI2RlZmluZSBXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQSA2Ci0jZGVmaW5lIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSA3Ci0jZGVmaW5lIFdMQU5fUkVBU09OX0RJU0FTU09DX1NUQV9IQVNfTEVGVCA4Ci0jZGVmaW5lIFdMQU5fUkVBU09OX1NUQV9SRVFfQVNTT0NfV0lUSE9VVF9BVVRIIDkKK2VudW0gaWVlZTgwMjExX3JlYXNvbmNvZGUgeworCVdMQU5fUkVBU09OX1VOU1BFQ0lGSUVEID0gMSwKKwlXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEID0gMiwKKwlXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyA9IDMsCisJV0xBTl9SRUFTT05fRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFkgPSA0LAorCVdMQU5fUkVBU09OX0RJU0FTU09DX0FQX0JVU1kgPSA1LAorCVdMQU5fUkVBU09OX0NMQVNTMl9GUkFNRV9GUk9NX05PTkFVVEhfU1RBID0gNiwKKwlXTEFOX1JFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPQ19TVEEgPSA3LAorCVdMQU5fUkVBU09OX0RJU0FTU09DX1NUQV9IQVNfTEVGVCA9IDgsCisJV0xBTl9SRUFTT05fU1RBX1JFUV9BU1NPQ19XSVRIT1VUX0FVVEggPSA5LAorCS8qIDgwMi4xMWggKi8KKwlXTEFOX1JFQVNPTl9ESVNBU1NPQ19CQURfUE9XRVIgPSAxMCwKKwlXTEFOX1JFQVNPTl9ESVNBU1NPQ19CQURfU1VQUF9DSEFOID0gMTEsCisJLyogODAyLjExaSAqLworCVdMQU5fUkVBU09OX0lOVkFMSURfSUUgPSAxMywKKwlXTEFOX1JFQVNPTl9NSUNfRkFJTFVSRSA9IDE0LAorCVdMQU5fUkVBU09OXzRXQVlfSEFORFNIQUtFX1RJTUVPVVQgPSAxNSwKKwlXTEFOX1JFQVNPTl9HUk9VUF9LRVlfSEFORFNIQUtFX1RJTUVPVVQgPSAxNiwKKwlXTEFOX1JFQVNPTl9JRV9ESUZGRVJFTlQgPSAxNywKKwlXTEFOX1JFQVNPTl9JTlZBTElEX0dST1VQX0NJUEhFUiA9IDE4LAorCVdMQU5fUkVBU09OX0lOVkFMSURfUEFJUldJU0VfQ0lQSEVSID0gMTksCisJV0xBTl9SRUFTT05fSU5WQUxJRF9BS01QID0gMjAsCisJV0xBTl9SRUFTT05fVU5TVVBQX1JTTl9WRVJTSU9OID0gMjEsCisJV0xBTl9SRUFTT05fSU5WQUxJRF9SU05fSUVfQ0FQID0gMjIsCisJV0xBTl9SRUFTT05fSUVFRTgwMjFYX0ZBSUxFRCA9IDIzLAorCVdMQU5fUkVBU09OX0NJUEhFUl9TVUlURV9SRUpFQ1RFRCA9IDI0LAorfTsKIAogCiAjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwgKDE8PDApCkBAIC00MjYsOSArNDM3LDcgQEAKIAogc3RydWN0IGllZWU4MDIxMV9kZXZpY2U7CiAKLSNpZiAwIC8qIGZvciBsYXRlciAqLwogI2luY2x1ZGUgImllZWU4MDIxMV9jcnlwdC5oIgotI2VuZGlmCiAKICNkZWZpbmUgU0VDX0tFWV8xICAgICAgICAgKDE8PDApCiAjZGVmaW5lIFNFQ19LRVlfMiAgICAgICAgICgxPDwxKQpAQCAtNDgwLDE3ICs0ODksMzQgQEAKICNkZWZpbmUgQkVBQ09OX1BST0JFX1NTSURfSURfUE9TSVRJT04gMTIKIAogLyogTWFuYWdlbWVudCBGcmFtZSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzICovCi0jZGVmaW5lIE1GSUVfVFlQRV9TU0lEICAgICAgIDAKLSNkZWZpbmUgTUZJRV9UWVBFX1JBVEVTICAgICAgMQotI2RlZmluZSBNRklFX1RZUEVfRkhfU0VUICAgICAyCi0jZGVmaW5lIE1GSUVfVFlQRV9EU19TRVQgICAgIDMKLSNkZWZpbmUgTUZJRV9UWVBFX0NGX1NFVCAgICAgNAotI2RlZmluZSBNRklFX1RZUEVfVElNICAgICAgICA1Ci0jZGVmaW5lIE1GSUVfVFlQRV9JQlNTX1NFVCAgIDYKLSNkZWZpbmUgTUZJRV9UWVBFX0NIQUxMRU5HRSAgMTYKLSNkZWZpbmUgTUZJRV9UWVBFX1JTTgkgICAgIDQ4Ci0jZGVmaW5lIE1GSUVfVFlQRV9SQVRFU19FWCAgIDUwCi0jZGVmaW5lIE1GSUVfVFlQRV9HRU5FUklDICAgIDIyMQorZW51bSBpZWVlODAyMTFfbWZpZSB7CisJTUZJRV9UWVBFX1NTSUQgPSAwLAorCU1GSUVfVFlQRV9SQVRFUyA9IDEsCisJTUZJRV9UWVBFX0ZIX1NFVCA9IDIsCisJTUZJRV9UWVBFX0RTX1NFVCA9IDMsCisJTUZJRV9UWVBFX0NGX1NFVCA9ICA0LAorCU1GSUVfVFlQRV9USU0gPSA1LAorCU1GSUVfVFlQRV9JQlNTX1NFVCA9IDYsCisJTUZJRV9UWVBFX0NPVU5UUlkgPSA3LAorCU1GSUVfVFlQRV9IT1BfUEFSQU1TID0gOCwKKwlNRklFX1RZUEVfSE9QX1RBQkxFID0gOSwKKwlNRklFX1RZUEVfUkVRVUVTVCA9IDEwLAorCU1GSUVfVFlQRV9DSEFMTEVOR0UgPSAxNiwKKwlNRklFX1RZUEVfUE9XRVJfQ09OU1RSQUlOVCA9IDMyLAorCU1GSUVfVFlQRV9QT1dFUl9DQVBBQklMSVRZID0gMzMsCisJTUZJRV9UWVBFX1RQQ19SRVFVRVNUID0gMzQsCisJTUZJRV9UWVBFX1RQQ19SRVBPUlQgPSAzNSwKKwlNRklFX1RZUEVfU1VQUF9DSEFOTkVMUyA9IDM2LAorCU1GSUVfVFlQRV9DU0EgPSAzNywKKwlNRklFX1RZUEVfTUVBU1VSRV9SRVFVRVNUID0gMzgsCisJTUZJRV9UWVBFX01FQVNVUkVfUkVQT1JUID0gMzksCisJTUZJRV9UWVBFX1FVSUVUID0gNDAsCisJTUZJRV9UWVBFX0lCU1NfREZTID0gNDEsCisJTUZJRV9UWVBFX0VSUF9JTkZPID0gNDIsCisJTUZJRV9UWVBFX1JTTiA9IDQ4LAorCU1GSUVfVFlQRV9SQVRFU19FWCA9IDUwLAorCU1GSUVfVFlQRV9HRU5FUklDID0gMjIxLAorfTsKIAogc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyIHsKIAl1OCBpZDsKQEAgLTUyMiw5ICs1NDgsOSBAQAogCiBzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7Ci0JdTE2IGFsZ29yaXRobTsKLQl1MTYgdHJhbnNhY3Rpb247Ci0JdTE2IHN0YXR1czsKKwlfX2xlMTYgYWxnb3JpdGhtOworCV9fbGUxNiB0cmFuc2FjdGlvbjsKKwlfX2xlMTYgc3RhdHVzOwogCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCkBAIC01MzIsMjMgKzU1OCwyMyBAQAogc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwogCXUzMiB0aW1lX3N0YW1wWzJdOwotCXUxNiBiZWFjb25faW50ZXJ2YWw7Ci0JdTE2IGNhcGFiaWxpdHk7CisJX19sZTE2IGJlYWNvbl9pbnRlcnZhbDsKKwlfX2xlMTYgY2FwYWJpbGl0eTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lIHsKLQl1MTYgY2FwYWJpbGl0eTsKLQl1MTYgbGlzdGVuX2ludGVydmFsOworCV9fbGUxNiBjYXBhYmlsaXR5OworCV9fbGUxNiBsaXN0ZW5faW50ZXJ2YWw7CiAJdTggY3VycmVudF9hcFtFVEhfQUxFTl07CiAJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50OwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgewogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKLQl1MTYgY2FwYWJpbGl0eTsKLQl1MTYgc3RhdHVzOwotCXUxNiBhaWQ7CisJX19sZTE2IGNhcGFiaWxpdHk7CisJX19sZTE2IHN0YXR1czsKKwlfX2xlMTYgYWlkOwogCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsgLyogc3VwcG9ydGVkIHJhdGVzICovCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIApAQCAtNTYzLDcgKzU4OSw3IEBACiB9OwogCiAKLS8qIFNXRUVQIFRBQkxFIEVOVFJJRVMgTlVNQkVSKi8KKy8qIFNXRUVQIFRBQkxFIEVOVFJJRVMgTlVNQkVSICovCiAjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFUwkJICA0MgogI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVNfUEVSX1BBQ0tFVCAgNwogLyogTUFYX1JBVEVTX0xFTkdUSCBuZWVkcyB0byBiZSAxMi4gIFRoZSBzcGVjIHNheXMgOCwgYW5kIG1hbnkgQVBzCkBAIC02MjQsOCArNjUwLDYgQEAKIAogI2RlZmluZSBERUZBVUxUX01BWF9TQ0FOX0FHRSAoMTUgKiBIWikKICNkZWZpbmUgREVGQVVMVF9GVFMgMjM0NgotI2RlZmluZSBNQUNfRk1UICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKLSNkZWZpbmUgTUFDX0FSRyh4KSAoKHU4KikoeCkpWzBdLCgodTgqKSh4KSlbMV0sKCh1OCopKHgpKVsyXSwoKHU4KikoeCkpWzNdLCgodTgqKSh4KSlbNF0sKCh1OCopKHgpKVs1XQogCiAKICNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUyAoMTw8MCkKQEAgLTc5Myw4ICs4MTcsNiBAQAogZXh0ZXJuIGludCBpZWVlODAyMTFfc2V0X2VuY3J5cHRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwogCiAvKiBpZWVlODAyMTFfdHguYyAqLwotCi0KIGV4dGVybiBpbnQgaWVlZTgwMjExX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpZWVlODAyMTFfdHhiX2ZyZWUoc3RydWN0IGllZWU4MDIxMV90eGIgKik7CkBAIC04MDcsNyArODI5LDcgQEAKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlciwKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpOwogCi0vKiBpZWU4MDIxMV93eC5jICovCisvKiBpZWVlODAyMTFfd3guYyAqLwogZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCiAJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CkBAIC04MjksMjggKzg1MSw1IEBACiAJcmV0dXJuIGllZWUtPnNjYW5zOwogfQogCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVzY2FwZV9lc3NpZChjb25zdCBjaGFyICplc3NpZCwgdTggZXNzaWRfbGVuKSB7Ci0Jc3RhdGljIGNoYXIgZXNjYXBlZFtJV19FU1NJRF9NQVhfU0laRSAqIDIgKyAxXTsKLQljb25zdCBjaGFyICpzID0gZXNzaWQ7Ci0JY2hhciAqZCA9IGVzY2FwZWQ7Ci0KLQlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGVzc2lkLCBlc3NpZF9sZW4pKSB7Ci0JCW1lbWNweShlc2NhcGVkLCAiPGhpZGRlbj4iLCBzaXplb2YoIjxoaWRkZW4+IikpOwotCQlyZXR1cm4gZXNjYXBlZDsKLQl9Ci0KLQllc3NpZF9sZW4gPSBtaW4oZXNzaWRfbGVuLCAodTgpSVdfRVNTSURfTUFYX1NJWkUpOwotCXdoaWxlIChlc3NpZF9sZW4tLSkgewotCQlpZiAoKnMgPT0gJ1wwJykgewotCQkJKmQrKyA9ICdcXCc7Ci0JCQkqZCsrID0gJzAnOwotCQkJcysrOwotCQl9IGVsc2UgewotCQkJKmQrKyA9ICpzKys7Ci0JCX0KLQl9Ci0JKmQgPSAnXDAnOwotCXJldHVybiBlc2NhcGVkOwotfQogCiAjZW5kaWYgLyogSUVFRTgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9jcnlwdC5oIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExX2NyeXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4YTNiYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9jcnlwdC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBPcmlnaW5hbCBjb2RlIGJhc2VkIG9uIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlcgorICogZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIEFkYXB0aW9uIHRvIGEgZ2VuZXJpYyBJRUVFIDgwMi4xMSBzdGFjayBieSBKYW1lcyBLZXRyZW5vcworICogPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byB0aGUgaWVlZTgwMjExIGNyeXB0byBtb2R1bGUuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0NSWVBUX0gKKyNkZWZpbmUgSUVFRTgwMjExX0NSWVBUX0gKKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgeworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkvKiBpbml0IG5ldyBjcnlwdG8gY29udGV4dCAoZS5nLiwgYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIHNwYWNlLAorCSAqIHNlbGVjdCBJViwgZXRjLik7IHJldHVybnMgTlVMTCBvbiBmYWlsdXJlIG9yIHBvaW50ZXIgdG8gYWxsb2NhdGVkCisJICogcHJpdmF0ZSBkYXRhIG9uIHN1Y2Nlc3MgKi8KKwl2b2lkICogKCppbml0KShpbnQga2V5aWR4KTsKKworCS8qIGRlaW5pdGlhbGl6ZSBjcnlwdG8gY29udGV4dCBhbmQgZnJlZSBhbGxvY2F0ZWQgcHJpdmF0ZSBkYXRhICovCisJdm9pZCAoKmRlaW5pdCkodm9pZCAqcHJpdik7CisKKwkvKiBlbmNyeXB0L2RlY3J5cHQgcmV0dXJuIDwgMCBvbiBlcnJvciBvciA+PSAwIG9uIHN1Y2Nlc3MuIFRoZSByZXR1cm4KKwkgKiB2YWx1ZSBmcm9tIGRlY3J5cHRfbXBkdSBpcyBwYXNzZWQgYXMgdGhlIGtleWlkeCB2YWx1ZSBmb3IKKwkgKiBkZWNyeXB0X21zZHUuIHNrYiBtdXN0IGhhdmUgZW5vdWdoIGhlYWQgYW5kIHRhaWwgcm9vbSBmb3IgdGhlCisJICogZW5jcnlwdGlvbjsgaWYgbm90LCBlcnJvciB3aWxsIGJlIHJldHVybmVkOyB0aGVzZSBmdW5jdGlvbnMgYXJlCisJICogY2FsbGVkIGZvciBhbGwgTVBEVXMgKGkuZS4sIGZyYWdtZW50cykuCisJICovCisJaW50ICgqZW5jcnlwdF9tcGR1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisJaW50ICgqZGVjcnlwdF9tcGR1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisKKwkvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBmb3IgZnVsbCBNU0RVcywgaS5lLiBmdWxsIGZyYW1lcy4KKwkgKiBUaGVzZSBjYW4gYmUgTlVMTCBpZiBmdWxsIE1TRFUgb3BlcmF0aW9ucyBhcmUgbm90IG5lZWRlZC4gKi8KKwlpbnQgKCplbmNyeXB0X21zZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KTsKKwlpbnQgKCpkZWNyeXB0X21zZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBrZXlpZHgsIGludCBoZHJfbGVuLAorCQkJICAgIHZvaWQgKnByaXYpOworCisJaW50ICgqc2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKKwlpbnQgKCpnZXRfa2V5KSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpOworCisJLyogcHJvY2ZzIGhhbmRsZXIgZm9yIHByaW50aW5nIG91dCBrZXkgaW5mb3JtYXRpb24gYW5kIHBvc3NpYmxlCisJICogc3RhdGlzdGljcyAqLworCWNoYXIgKiAoKnByaW50X3N0YXRzKShjaGFyICpwLCB2b2lkICpwcml2KTsKKworCS8qIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGFkZGVkIGJ5IGVuY3J5cHRpb247IGVuY3J5cHQgYnVmIGlzCisJICogYWxsb2NhdGVkIHdpdGggZXh0cmFfcHJlZml4X2xlbiBieXRlcywgY29weSBvZiBpbl9idWYsIGFuZAorCSAqIGV4dHJhX3Bvc3RmaXhfbGVuOyBlbmNyeXB0IG5lZWQgbm90IHVzZSBhbGwgdGhpcyBzcGFjZSwgYnV0CisJICogdGhlIHJlc3VsdCBtdXN0IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBhbmQgY29ycmVjdAorCSAqIGxlbmd0aCBtdXN0IGJlIHJldHVybmVkICovCisJaW50IGV4dHJhX3ByZWZpeF9sZW4sIGV4dHJhX3Bvc3RmaXhfbGVuOworCisJc3RydWN0IG1vZHVsZSAqb3duZXI7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgLyogZGVsYXllZCBkZWxldGlvbiBsaXN0ICovCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7CisJdm9pZCAqcHJpdjsKKwlhdG9taWNfdCByZWZjbnQ7Cit9OworCitpbnQgaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHMpOworaW50IGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHMpOworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICogaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiwgaW50KTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcpOwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF92cy5oIGIvaW5jbHVkZS9uZXQvaXBfdnMuaAppbmRleCA3YTNjNDM3Li5lNDI2NjQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcF92cy5oCisrKyBiL2luY2x1ZGUvbmV0L2lwX3ZzLmgKQEAgLTk1OCw3ICs5NTgsNyBAQAogICovCiAjZGVmaW5lIElQX1ZTX0ZXRF9NRVRIT0QoY3ApICAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX0ZXRF9NQVNLKQogCi1leHRlcm4gX19pbmxpbmVfXyBjaGFyIGlwX3ZzX2Z3ZF90YWcoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQorc3RhdGljIGlubGluZSBjaGFyIGlwX3ZzX2Z3ZF90YWcoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQogewogCWNoYXIgZndkOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcHY2LmggYi9pbmNsdWRlL25ldC9pcHY2LmgKaW5kZXggMzIwM2VhZi4uNjVlYzg2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbmV0L2lwdjYuaApAQCAtMjMzLDYgKzIzMywxMCBAQAogZXh0ZXJuIGludAkJCWlwdjZfcGFyc2VfaG9wb3B0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQpOwogCiBleHRlcm4gc3RydWN0IGlwdjZfdHhvcHRpb25zICogIGlwdjZfZHVwX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCk7CitleHRlcm4gc3RydWN0IGlwdjZfdHhvcHRpb25zICoJaXB2Nl9yZW5ld19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQsCisJCQkJCQkgICBpbnQgbmV3dHlwZSwKKwkJCQkJCSAgIHN0cnVjdCBpcHY2X29wdF9oZHIgX191c2VyICpuZXdvcHQsCisJCQkJCQkgICBpbnQgbmV3b3B0bGVuKTsKIAogZXh0ZXJuIGludCBpcDZfZnJhZ19ucXVldWVzOwogZXh0ZXJuIGF0b21pY190IGlwNl9mcmFnX21lbTsKQEAgLTM3Myw2ICszNzcsNyBAQAogCQkJCQkJaW50IGxlbmd0aCwKIAkJCQkJCWludCB0cmFuc2hkcmxlbiwKIAkJICAgICAgCQkJCWludCBobGltaXQsCisJCSAgICAgIAkJCQlpbnQgdGNsYXNzLAogCQkJCQkJc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQsCiAJCQkJCQlzdHJ1Y3QgZmxvd2kgKmZsLAogCQkJCQkJc3RydWN0IHJ0Nl9pbmZvICpydCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lyZGEvaXJsYW5fZmlsdGVyLmggYi9pbmNsdWRlL25ldC9pcmRhL2lybGFuX2ZpbHRlci5oCmluZGV4IDNhZmViNmMuLjQ5MmRlZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lyZGEvaXJsYW5fZmlsdGVyLmgKKysrIGIvaW5jbHVkZS9uZXQvaXJkYS9pcmxhbl9maWx0ZXIuaApAQCAtMjgsNiArMjgsNiBAQAogdm9pZCBpcmxhbl9jaGVja19jb21tYW5kX3BhcmFtKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgY2hhciAqcGFyYW0sIAogCQkJICAgICAgIGNoYXIgKnZhbHVlKTsKIHZvaWQgaXJsYW5fZmlsdGVyX3JlcXVlc3Qoc3RydWN0IGlybGFuX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCBpcmxhbl9wcmludF9maWx0ZXIoc3RydWN0IHNlcV9maWxlICpzZXEsIGludCBmaWx0ZXJfdHlwZSk7Cit2b2lkIGlybGFuX3ByaW50X2ZpbHRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgaW50IGZpbHRlcl90eXBlKTsKIAogI2VuZGlmIC8qIElSTEFOX0ZJTFRFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pd19oYW5kbGVyLmggYi9pbmNsdWRlL25ldC9pd19oYW5kbGVyLmgKaW5kZXggNDRlZGQ0OC4uZDY3YzgzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXdfaGFuZGxlci5oCisrKyBiL2luY2x1ZGUvbmV0L2l3X2hhbmRsZXIuaApAQCAtMSwxMCArMSwxMCBAQAogLyoKICAqIFRoaXMgZmlsZSBkZWZpbmUgdGhlIG5ldyBkcml2ZXIgQVBJIGZvciBXaXJlbGVzcyBFeHRlbnNpb25zCiAgKgotICogVmVyc2lvbiA6CTYJMjEuNi4wNAorICogVmVyc2lvbiA6CTcJMTguMy4wNQogICoKICAqIEF1dGhvcnMgOglKZWFuIFRvdXJyaWxoZXMgLSBIUEwgLSA8anRAaHBsLmhwLmNvbT4KLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEplYW4gVG91cnJpbGhlcywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEplYW4gVG91cnJpbGhlcywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqLwogCiAjaWZuZGVmIF9JV19IQU5ETEVSX0gKQEAgLTIwNyw3ICsyMDcsNyBAQAogICogd2lsbCBiZSBuZWVkZWQuLi4KICAqIEkganVzdCBwbGFuIHRvIGluY3JlbWVudCB3aXRoIGVhY2ggbmV3IHZlcnNpb24uCiAgKi8KLSNkZWZpbmUgSVdfSEFORExFUl9WRVJTSU9OCTYKKyNkZWZpbmUgSVdfSEFORExFUl9WRVJTSU9OCTcKIAogLyoKICAqIENoYW5nZXMgOgpAQCAtMjMyLDYgKzIzMiwxMyBAQAogICoJLSBSZW1vdmUgc3B5ICNpZmRlZiwgdGhleSBhcmUgYWx3YXlzIG9uIC0+IGNsZWFuZXIgY29kZQogICoJLSBBZGQgSVdfREVTQ1JfRkxBR19OT01BWCBmbGFnIGZvciB2ZXJ5IGxhcmdlIHJlcXVlc3RzCiAgKgktIFN0YXJ0IG1pZ3JhdGluZyBnZXRfd2lyZWxlc3Nfc3RhdHMgdG8gc3RydWN0IGl3X2hhbmRsZXJfZGVmCisgKgorICogVjYgdG8gVjcKKyAqIC0tLS0tLS0tCisgKgktIEFkZCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSBwb2ludGVyIGluIHN0cnVjdCBpd19wdWJsaWNfZGF0YQorICoJLSBSZW1vdmUgKHN0cnVjdCBpd19wb2ludCAqKS0+cG9pbnRlciBmcm9tIGV2ZW50cyBhbmQgc3RyZWFtcworICoJLSBSZW1vdmUgc3B5X29mZnNldCBmcm9tIHN0cnVjdCBpd19oYW5kbGVyX2RlZgorICoJLSBBZGQgImNoZWNrIiB2ZXJzaW9uIG9mIGV2ZW50IG1hY3JvcyBmb3IgaWVlZTgwMi4xMSBzdGFjawogICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzM0LDkgKzM0MSw2IEBACiAJICogV2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGV4cG9ydCB0aGF0IHRvIHVzZXIgc3BhY2UuLi4gKi8KIAljb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzICoJcHJpdmF0ZV9hcmdzOwogCi0JLyogVGhpcyBmaWVsZCB3aWxsIGJlICpyZW1vdmVkKiBpbiB0aGUgbmV4dCB2ZXJzaW9uIG9mIFdFICovCi0JbG9uZwkJCXNweV9vZmZzZXQ7CS8qIERPIE5PVCBVU0UgKi8KLQogCS8qIE5ldyBsb2NhdGlvbiBvZiBnZXRfd2lyZWxlc3Nfc3RhdHMsIHRvIGRlLWJsb2F0IHN0cnVjdCBuZXRfZGV2aWNlLgogCSAqIFRoZSBvbGQgcG9pbnRlciBpbiBzdHJ1Y3QgbmV0X2RldmljZSB3aWxsIGJlIGdyYWR1YWxseSBwaGFzZWQKIAkgKiBvdXQsIGFuZCBkcml2ZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGlzIG9uZS4uLiAqLwpAQCAtNDAwLDE2ICs0MDQsMjEgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBERVZJQ0UgV0lSRUxFU1MgREFUQSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qCiAgKiBUaGlzIGlzIGFsbCB0aGUgd2lyZWxlc3MgZGF0YSBzcGVjaWZpYyB0byBhIGRldmljZSBpbnN0YW5jZSB0aGF0Ci0gKiBpcyBtYW5hZ2VkIGJ5IHRoZSBjb3JlIG9mIFdpcmVsZXNzIEV4dGVuc2lvbnMuCisgKiBpcyBtYW5hZ2VkIGJ5IHRoZSBjb3JlIG9mIFdpcmVsZXNzIEV4dGVuc2lvbnMgb3IgdGhlIDgwMi4xMSBsYXllci4KICAqIFdlIG9ubHkga2VlcCBwb2ludGVyIHRvIHRob3NlIHN0cnVjdHVyZXMsIHNvIHRoYXQgYSBkcml2ZXIgaXMgZnJlZQogICogdG8gc2hhcmUgdGhlbSBiZXR3ZWVuIGluc3RhbmNlcy4KICAqIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBpbml0aWFsaXNlZCBiZWZvcmUgcmVnaXN0ZXJpbmcgdGhlIGRldmljZS4KICAqIEFjY2VzcyB0byB0aGlzIGRhdGEgZm9sbG93IHRoZSBzYW1lIHJ1bGVzIGFzIGFueSBvdGhlciBzdHJ1Y3QgbmV0X2RldmljZQogICogZGF0YSAoaS5lLiB2YWxpZCBhcyBsb25nIGFzIHN0cnVjdCBuZXRfZGV2aWNlIGV4aXN0LCBzYW1lIGxvY2tpbmcgcnVsZXMpLgogICovCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZTsKKy8qIFRoZSBzdHJ1Y3QgKi8KIHN0cnVjdCBpd19wdWJsaWNfZGF0YSB7CiAJLyogRHJpdmVyIGVuaGFuY2VkIHNweSBzdXBwb3J0ICovCi0Jc3RydWN0IGl3X3NweV9kYXRhICoJc3B5X2RhdGE7CisJc3RydWN0IGl3X3NweV9kYXRhICoJCXNweV9kYXRhOworCS8qIFN0cnVjdHVyZSBtYW5hZ2VkIGJ5IHRoZSBpbi1rZXJuZWwgSUVFRSA4MDIuMTEgbGF5ZXIgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqCWllZWU4MDIxMTsKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBST1RPVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQyNCw3ICs0MzMsNyBAQAogZXh0ZXJuIGludCBkZXZfZ2V0X3dpcmVsZXNzX2luZm8oY2hhciAqIGJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAJCQkJIGludCBsZW5ndGgpOwogCi0vKiBIYW5kbGUgSU9DVExzLCBjYWxsZWQgaW4gbmV0L2NvZGUvZGV2LmMgKi8KKy8qIEhhbmRsZSBJT0NUTHMsIGNhbGxlZCBpbiBuZXQvY29yZS9kZXYuYyAqLwogZXh0ZXJuIGludCB3aXJlbGVzc19wcm9jZXNzX2lvY3RsKHN0cnVjdCBpZnJlcSAqaWZyLCB1bnNpZ25lZCBpbnQgY21kKTsKIAogLyogU2Vjb25kIDogZnVuY3Rpb25zIHRoYXQgbWF5IGJlIGNhbGxlZCBieSBkcml2ZXIgbW9kdWxlcyAqLwpAQCAtNDc5LDcgKzQ4OCw3IEBACiAJCSAgICAgaW50CWV2ZW50X2xlbikJLyogUmVhbCBzaXplIG9mIHBheWxvYWQgKi8KIHsKIAkvKiBDaGVjayBpZiBpdCdzIHBvc3NpYmxlICovCi0JaWYoKHN0cmVhbSArIGV2ZW50X2xlbikgPCBlbmRzKSB7CisJaWYobGlrZWx5KChzdHJlYW0gKyBldmVudF9sZW4pIDwgZW5kcykpIHsKIAkJaXdlLT5sZW4gPSBldmVudF9sZW47CiAJCW1lbWNweShzdHJlYW0sIChjaGFyICopIGl3ZSwgZXZlbnRfbGVuKTsKIAkJc3RyZWFtICs9IGV2ZW50X2xlbjsKQEAgLTQ5NSwxNCArNTA0LDE3IEBACiBzdGF0aWMgaW5saW5lIGNoYXIgKgogaXdlX3N0cmVhbV9hZGRfcG9pbnQoY2hhciAqCXN0cmVhbSwJCS8qIFN0cmVhbSBvZiBldmVudHMgKi8KIAkJICAgICBjaGFyICoJZW5kcywJCS8qIEVuZCBvZiBzdHJlYW0gKi8KLQkJICAgICBzdHJ1Y3QgaXdfZXZlbnQgKml3ZSwJLyogUGF5bG9hZCAqLwotCQkgICAgIGNoYXIgKglleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfZXZlbnQgKml3ZSwJLyogUGF5bG9hZCBsZW5ndGggKyBmbGFncyAqLworCQkgICAgIGNoYXIgKglleHRyYSkJCS8qIE1vcmUgcGF5bG9hZCAqLwogewogCWludAlldmVudF9sZW4gPSBJV19FVl9QT0lOVF9MRU4gKyBpd2UtPnUuZGF0YS5sZW5ndGg7CiAJLyogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSAqLwotCWlmKChzdHJlYW0gKyBldmVudF9sZW4pIDwgZW5kcykgeworCWlmKGxpa2VseSgoc3RyZWFtICsgZXZlbnRfbGVuKSA8IGVuZHMpKSB7CiAJCWl3ZS0+bGVuID0gZXZlbnRfbGVuOwotCQltZW1jcHkoc3RyZWFtLCAoY2hhciAqKSBpd2UsIElXX0VWX1BPSU5UX0xFTik7CisJCW1lbWNweShzdHJlYW0sIChjaGFyICopIGl3ZSwgSVdfRVZfTENQX0xFTik7CisJCW1lbWNweShzdHJlYW0gKyBJV19FVl9MQ1BfTEVOLAorCQkgICAgICAgKChjaGFyICopIGl3ZSkgKyBJV19FVl9MQ1BfTEVOICsgSVdfRVZfUE9JTlRfT0ZGLAorCQkgICAgICAgSVdfRVZfUE9JTlRfTEVOIC0gSVdfRVZfTENQX0xFTik7CiAJCW1lbWNweShzdHJlYW0gKyBJV19FVl9QT0lOVF9MRU4sIGV4dHJhLCBpd2UtPnUuZGF0YS5sZW5ndGgpOwogCQlzdHJlYW0gKz0gZXZlbnRfbGVuOwogCX0KQEAgLTUyNiw3ICs1MzgsNyBAQAogCWV2ZW50X2xlbiAtPSBJV19FVl9MQ1BfTEVOOwogCiAJLyogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSAqLwotCWlmKCh2YWx1ZSArIGV2ZW50X2xlbikgPCBlbmRzKSB7CisJaWYobGlrZWx5KCh2YWx1ZSArIGV2ZW50X2xlbikgPCBlbmRzKSkgewogCQkvKiBBZGQgbmV3IHZhbHVlICovCiAJCW1lbWNweSh2YWx1ZSwgKGNoYXIgKikgaXdlICsgSVdfRVZfTENQX0xFTiwgZXZlbnRfbGVuKTsKIAkJdmFsdWUgKz0gZXZlbnRfbGVuOwpAQCAtNTM3LDQgKzU0OSw4NSBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyYXBwZXIgdG8gYWRkIGFuIFdpcmVsZXNzIEV2ZW50IHRvIGEgc3RyZWFtIG9mIGV2ZW50cy4KKyAqIFNhbWUgYXMgYWJvdmUsIHdpdGggZXhwbGljaXQgZXJyb3IgY2hlY2suLi4KKyAqLworc3RhdGljIGlubGluZSBjaGFyICoKK2l3ZV9zdHJlYW1fY2hlY2tfYWRkX2V2ZW50KGNoYXIgKglzdHJlYW0sCQkvKiBTdHJlYW0gb2YgZXZlbnRzICovCisJCQkgICBjaGFyICoJZW5kcywJCS8qIEVuZCBvZiBzdHJlYW0gKi8KKwkJCSAgIHN0cnVjdCBpd19ldmVudCAqaXdlLAkvKiBQYXlsb2FkICovCisJCQkgICBpbnQJCWV2ZW50X2xlbiwJLyogU2l6ZSBvZiBwYXlsb2FkICovCisJCQkgICBpbnQgKglwZXJyKQkJLyogRXJyb3IgcmVwb3J0ICovCit7CisJLyogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSwgc2V0IGVycm9yIGlmIG5vdCAqLworCWlmKGxpa2VseSgoc3RyZWFtICsgZXZlbnRfbGVuKSA8IGVuZHMpKSB7CisJCWl3ZS0+bGVuID0gZXZlbnRfbGVuOworCQltZW1jcHkoc3RyZWFtLCAoY2hhciAqKSBpd2UsIGV2ZW50X2xlbik7CisJCXN0cmVhbSArPSBldmVudF9sZW47CisJfSBlbHNlCisJCSpwZXJyID0gLUUyQklHOworCXJldHVybiBzdHJlYW07Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcmFwcGVyIHRvIGFkZCBhbiBzaG9ydCBXaXJlbGVzcyBFdmVudCBjb250YWluaW5nIGEgcG9pbnRlciB0byBhCisgKiBzdHJlYW0gb2YgZXZlbnRzLgorICogU2FtZSBhcyBhYm92ZSwgd2l0aCBleHBsaWNpdCBlcnJvciBjaGVjay4uLgorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKgoraXdlX3N0cmVhbV9jaGVja19hZGRfcG9pbnQoY2hhciAqCXN0cmVhbSwJCS8qIFN0cmVhbSBvZiBldmVudHMgKi8KKwkJCSAgIGNoYXIgKgllbmRzLAkJLyogRW5kIG9mIHN0cmVhbSAqLworCQkJICAgc3RydWN0IGl3X2V2ZW50ICppd2UsCS8qIFBheWxvYWQgbGVuZ3RoICsgZmxhZ3MgKi8KKwkJCSAgIGNoYXIgKglleHRyYSwJCS8qIE1vcmUgcGF5bG9hZCAqLworCQkJICAgaW50ICoJcGVycikJCS8qIEVycm9yIHJlcG9ydCAqLworeworCWludAlldmVudF9sZW4gPSBJV19FVl9QT0lOVF9MRU4gKyBpd2UtPnUuZGF0YS5sZW5ndGg7CisJLyogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSAqLworCWlmKGxpa2VseSgoc3RyZWFtICsgZXZlbnRfbGVuKSA8IGVuZHMpKSB7CisJCWl3ZS0+bGVuID0gZXZlbnRfbGVuOworCQltZW1jcHkoc3RyZWFtLCAoY2hhciAqKSBpd2UsIElXX0VWX0xDUF9MRU4pOworCQltZW1jcHkoc3RyZWFtICsgSVdfRVZfTENQX0xFTiwKKwkJICAgICAgICgoY2hhciAqKSBpd2UpICsgSVdfRVZfTENQX0xFTiArIElXX0VWX1BPSU5UX09GRiwKKwkJICAgICAgIElXX0VWX1BPSU5UX0xFTiAtIElXX0VWX0xDUF9MRU4pOworCQltZW1jcHkoc3RyZWFtICsgSVdfRVZfUE9JTlRfTEVOLCBleHRyYSwgaXdlLT51LmRhdGEubGVuZ3RoKTsKKwkJc3RyZWFtICs9IGV2ZW50X2xlbjsKKwl9IGVsc2UKKwkJKnBlcnIgPSAtRTJCSUc7CisJcmV0dXJuIHN0cmVhbTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyYXBwZXIgdG8gYWRkIGEgdmFsdWUgdG8gYSBXaXJlbGVzcyBFdmVudCBpbiBhIHN0cmVhbSBvZiBldmVudHMuCisgKiBCZSBjYXJlZnVsLCB0aGlzIG9uZSBpcyB0cmlja3kgdG8gdXNlIHByb3Blcmx5IDoKKyAqIEF0IHRoZSBmaXJzdCBydW4sIHlvdSBuZWVkIHRvIGhhdmUgKHZhbHVlID0gZXZlbnQgKyBJV19FVl9MQ1BfTEVOKS4KKyAqIFNhbWUgYXMgYWJvdmUsIHdpdGggZXhwbGljaXQgZXJyb3IgY2hlY2suLi4KKyAqLworc3RhdGljIGlubGluZSBjaGFyICoKK2l3ZV9zdHJlYW1fY2hlY2tfYWRkX3ZhbHVlKGNoYXIgKglldmVudCwJCS8qIEV2ZW50IGluIHRoZSBzdHJlYW0gKi8KKwkJCSAgIGNoYXIgKgl2YWx1ZSwJCS8qIFZhbHVlIGluIGV2ZW50ICovCisJCQkgICBjaGFyICoJZW5kcywJCS8qIEVuZCBvZiBzdHJlYW0gKi8KKwkJCSAgIHN0cnVjdCBpd19ldmVudCAqaXdlLAkvKiBQYXlsb2FkICovCisJCQkgICBpbnQJCWV2ZW50X2xlbiwJLyogU2l6ZSBvZiBwYXlsb2FkICovCisJCQkgICBpbnQgKglwZXJyKQkJLyogRXJyb3IgcmVwb3J0ICovCit7CisJLyogRG9uJ3QgZHVwbGljYXRlIExDUCAqLworCWV2ZW50X2xlbiAtPSBJV19FVl9MQ1BfTEVOOworCisJLyogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSAqLworCWlmKGxpa2VseSgodmFsdWUgKyBldmVudF9sZW4pIDwgZW5kcykpIHsKKwkJLyogQWRkIG5ldyB2YWx1ZSAqLworCQltZW1jcHkodmFsdWUsIChjaGFyICopIGl3ZSArIElXX0VWX0xDUF9MRU4sIGV2ZW50X2xlbik7CisJCXZhbHVlICs9IGV2ZW50X2xlbjsKKwkJLyogUGF0Y2ggTENQICovCisJCWl3ZS0+bGVuID0gdmFsdWUgLSBldmVudDsKKwkJbWVtY3B5KGV2ZW50LCAoY2hhciAqKSBpd2UsIElXX0VWX0xDUF9MRU4pOworCX0gZWxzZQorCQkqcGVyciA9IC1FMkJJRzsKKwlyZXR1cm4gdmFsdWU7Cit9CisKICNlbmRpZgkvKiBfSVdfSEFORExFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zb2NrLmggYi9pbmNsdWRlL25ldC9zb2NrLmgKaW5kZXggMzEyY2IyNS4uOGM0OGZiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L3NvY2suaApAQCAtNzA5LDYgKzcwOSwxMiBAQAogCQlza19zdHJlYW1fbWVtX3NjaGVkdWxlKHNrLCBza2ItPnRydWVzaXplLCAxKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgc2tfc3RyZWFtX3dtZW1fc2NoZWR1bGUoc3RydWN0IHNvY2sgKnNrLCBpbnQgc2l6ZSkKK3sKKwlyZXR1cm4gc2l6ZSA8PSBzay0+c2tfZm9yd2FyZF9hbGxvYyB8fAorCSAgICAgICBza19zdHJlYW1fbWVtX3NjaGVkdWxlKHNrLCBzaXplLCAwKTsKK30KKwogLyogVXNlZCBieSBwcm9jZXNzZXMgdG8gImxvY2siIGEgc29ja2V0IHN0YXRlLCBzbyB0aGF0CiAgKiBpbnRlcnJ1cHRzIGFuZCBib3R0b20gaGFsZiBoYW5kbGVycyB3b24ndCBjaGFuZ2UgaXQKICAqIGZyb20gdW5kZXIgdXMuIEl0IGVzc2VudGlhbGx5IGJsb2NrcyBhbnkgaW5jb21pbmcKQEAgLTEyMDMsOCArMTIwOSw3IEBACiAJc2tiID0gYWxsb2Nfc2tiX2ZjbG9uZShzaXplICsgaGRyX2xlbiwgZ2ZwKTsKIAlpZiAoc2tiKSB7CiAJCXNrYi0+dHJ1ZXNpemUgKz0gbWVtOwotCQlpZiAoc2stPnNrX2ZvcndhcmRfYWxsb2MgPj0gKGludClza2ItPnRydWVzaXplIHx8Ci0JCSAgICBza19zdHJlYW1fbWVtX3NjaGVkdWxlKHNrLCBza2ItPnRydWVzaXplLCAwKSkgeworCQlpZiAoc2tfc3RyZWFtX3dtZW1fc2NoZWR1bGUoc2ssIHNrYi0+dHJ1ZXNpemUpKSB7CiAJCQlza2JfcmVzZXJ2ZShza2IsIGhkcl9sZW4pOwogCQkJcmV0dXJuIHNrYjsKIAkJfQpAQCAtMTIyNywxMCArMTIzMiw4IEBACiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCi0JaWYgKHNrLT5za19mb3J3YXJkX2FsbG9jID49IChpbnQpUEFHRV9TSVpFIHx8Ci0JICAgIHNrX3N0cmVhbV9tZW1fc2NoZWR1bGUoc2ssIFBBR0VfU0laRSwgMCkpCi0JCXBhZ2UgPSBhbGxvY19wYWdlcyhzay0+c2tfYWxsb2NhdGlvbiwgMCk7Ci0JZWxzZSB7CisJcGFnZSA9IGFsbG9jX3BhZ2VzKHNrLT5za19hbGxvY2F0aW9uLCAwKTsKKwlpZiAoIXBhZ2UpIHsKIAkJc2stPnNrX3Byb3QtPmVudGVyX21lbW9yeV9wcmVzc3VyZSgpOwogCQlza19zdHJlYW1fbW9kZXJhdGVfc25kYnVmKHNrKTsKIAl9CkBAIC0xMzc0LDkgKzEzNzcsMTAgQEAKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKIGV4dGVybiBzdHJ1Y3QgY3RsX3RhYmxlIGNvcmVfdGFibGVbXTsKLWV4dGVybiBpbnQgc3lzY3RsX29wdG1lbV9tYXg7CiAjZW5kaWYKIAorZXh0ZXJuIGludCBzeXNjdGxfb3B0bWVtX21heDsKKwogZXh0ZXJuIF9fdTMyIHN5c2N0bF93bWVtX2RlZmF1bHQ7CiBleHRlcm4gX191MzIgc3lzY3RsX3JtZW1fZGVmYXVsdDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNwLmggYi9pbmNsdWRlL25ldC90Y3AuaAppbmRleCBkNmJjZjEzLi45N2FmNzdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90Y3AuaAorKysgYi9pbmNsdWRlL25ldC90Y3AuaApAQCAtNDU0LDYgKzQ1NCw3IEBACiBleHRlcm4gdm9pZCB0Y3BfeG1pdF9yZXRyYW5zbWl0X3F1ZXVlKHN0cnVjdCBzb2NrICopOwogZXh0ZXJuIHZvaWQgdGNwX3NpbXBsZV9yZXRyYW5zbWl0KHN0cnVjdCBzb2NrICopOwogZXh0ZXJuIGludCB0Y3BfdHJpbV9oZWFkKHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICosIHUzMik7CitleHRlcm4gaW50IHRjcF9mcmFnbWVudChzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCB1MzIsIHVuc2lnbmVkIGludCk7CiAKIGV4dGVybiB2b2lkIHRjcF9zZW5kX3Byb2JlMChzdHJ1Y3Qgc29jayAqKTsKIGV4dGVybiB2b2lkIHRjcF9zZW5kX3BhcnRpYWwoc3RydWN0IHNvY2sgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90cmFuc3BfdjYuaCBiL2luY2x1ZGUvbmV0L3RyYW5zcF92Ni5oCmluZGV4IDhiMDc1YWIuLjRlODZmMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RyYW5zcF92Ni5oCisrKyBiL2luY2x1ZGUvbmV0L3RyYW5zcF92Ni5oCkBAIC0zNyw3ICszNyw3IEBACiBleHRlcm4gaW50CQkJZGF0YWdyYW1fc2VuZF9jdGwoc3RydWN0IG1zZ2hkciAqbXNnLAogCQkJCQkJICBzdHJ1Y3QgZmxvd2kgKmZsLAogCQkJCQkJICBzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCwKLQkJCQkJCSAgaW50ICpobGltaXQpOworCQkJCQkJICBpbnQgKmhsaW1pdCwgaW50ICp0Y2xhc3MpOwogCiAjZGVmaW5lCQlMT09QQkFDSzRfSVBWNgkJX19jb25zdGFudF9odG9ubCgweDdmMDAwMDA2KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9kcy5oIGIvaW5jbHVkZS9wY21jaWEvZHMuaAppbmRleCBiNzA3YTYwLi5jYjhiNmU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9kcy5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2RzLmgKQEAgLTE1MSw2ICsxNTEsOCBAQAogCSAgIHVuaXF1ZWx5IGRlZmluZSBhIHBjbWNpYV9kZXZpY2UgKi8KIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldAkqc29ja2V0OwogCisJY2hhcgkJCSpkZXZuYW1lOworCiAJdTgJCQlkZXZpY2Vfbm87CiAKIAkvKiB0aGUgaGFyZHdhcmUgImZ1bmN0aW9uIiBkZXZpY2U7IGNlcnRhaW4gc3ViZGV2aWNlcyBjYW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmRtYS9pYl9jbS5oIGIvaW5jbHVkZS9yZG1hL2liX2NtLmgKaW5kZXggNzdmZTkwMy4uNTMwODY4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL2liX2NtLmgKKysrIGIvaW5jbHVkZS9yZG1hL2liX2NtLmgKQEAgLTI5MCw2ICsyOTAsNyBAQAogCWVudW0gaWJfY21fbGFwX3N0YXRlCWxhcF9zdGF0ZTsJLyogaW50ZXJuYWwgQ00vZGVidWcgdXNlICovCiAJX19iZTMyCQkJbG9jYWxfaWQ7CiAJX19iZTMyCQkJcmVtb3RlX2lkOworCXUzMgkJCXJlbW90ZV9jbV9xcG47ICAvKiAxIHVubGVzcyByZWRpcmVjdGVkICovCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmRtYS9pYl9tYWQuaCBiL2luY2x1ZGUvcmRtYS9pYl9tYWQuaAppbmRleCBmYzZiMWMxLi41MzE4NGEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3JkbWEvaWJfbWFkLmgKKysrIGIvaW5jbHVkZS9yZG1hL2liX21hZC5oCkBAIC0xNzMsNiArMTczLDI3IEBACiAJdTgJCQlkYXRhWzIxNl07CiB9OwogCitzdHJ1Y3QgaWJfY2xhc3NfcG9ydF9pbmZvCit7CisJdTgJCQliYXNlX3ZlcnNpb247CisJdTgJCQljbGFzc192ZXJzaW9uOworCV9fYmUxNgkJCWNhcGFiaWxpdHlfbWFzazsKKwl1OAkJCXJlc2VydmVkWzNdOworCXU4CQkJcmVzcF90aW1lX3ZhbHVlOworCXU4CQkJcmVkaXJlY3RfZ2lkWzE2XTsKKwlfX2JlMzIJCQlyZWRpcmVjdF90Y3NsZmw7CisJX19iZTE2CQkJcmVkaXJlY3RfbGlkOworCV9fYmUxNgkJCXJlZGlyZWN0X3BrZXk7CisJX19iZTMyCQkJcmVkaXJlY3RfcXA7CisJX19iZTMyCQkJcmVkaXJlY3RfcWtleTsKKwl1OAkJCXRyYXBfZ2lkWzE2XTsKKwlfX2JlMzIJCQl0cmFwX3Rjc2xmbDsKKwlfX2JlMTYJCQl0cmFwX2xpZDsKKwlfX2JlMTYJCQl0cmFwX3BrZXk7CisJX19iZTMyCQkJdHJhcF9obHFwOworCV9fYmUzMgkJCXRyYXBfcWtleTsKK307CisKIC8qKgogICogaWJfbWFkX3NlbmRfYnVmIC0gTUFEIGRhdGEgYnVmZmVyIGFuZCB3b3JrIHJlcXVlc3QgZm9yIHNlbmRzLgogICogQG1hZDogUmVmZXJlbmNlcyBhbiBhbGxvY2F0ZWQgTUFEIGRhdGEgYnVmZmVyLiAgVGhlIHNpemUgb2YgdGhlIGRhdGEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmRtYS9pYl9zYS5oIGIvaW5jbHVkZS9yZG1hL2liX3NhLmgKaW5kZXggYzAyMmVkZi4uYTc1NTVjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL2liX3NhLmgKKysrIGIvaW5jbHVkZS9yZG1hL2liX3NhLmgKQEAgLTQ2LDcgKzQ2LDM2IEBACiAKIAlJQl9TQV9NRVRIT0RfR0VUX1RBQkxFCQk9IDB4MTIsCiAJSUJfU0FfTUVUSE9EX0dFVF9UQUJMRV9SRVNQCT0gMHg5MiwKLQlJQl9TQV9NRVRIT0RfREVMRVRFCQk9IDB4MTUKKwlJQl9TQV9NRVRIT0RfREVMRVRFCQk9IDB4MTUsCisJSUJfU0FfTUVUSE9EX0RFTEVURV9SRVNQCT0gMHg5NSwKKwlJQl9TQV9NRVRIT0RfR0VUX01VTFRJCQk9IDB4MTQsCisJSUJfU0FfTUVUSE9EX0dFVF9NVUxUSV9SRVNQCT0gMHg5NCwKKwlJQl9TQV9NRVRIT0RfR0VUX1RSQUNFX1RCTAk9IDB4MTMKK307CisKK2VudW0geworCUlCX1NBX0FUVFJfQ0xBU1NfUE9SVElORk8gICAgPSAweDAxLAorCUlCX1NBX0FUVFJfTk9USUNFCSAgICAgPSAweDAyLAorCUlCX1NBX0FUVFJfSU5GT1JNX0lORk8JICAgICA9IDB4MDMsCisJSUJfU0FfQVRUUl9OT0RFX1JFQwkgICAgID0gMHgxMSwKKwlJQl9TQV9BVFRSX1BPUlRfSU5GT19SRUMgICAgID0gMHgxMiwKKwlJQl9TQV9BVFRSX1NMMlZMX1JFQwkgICAgID0gMHgxMywKKwlJQl9TQV9BVFRSX1NXSVRDSF9SRUMJICAgICA9IDB4MTQsCisJSUJfU0FfQVRUUl9MSU5FQVJfRkRCX1JFQyAgICA9IDB4MTUsCisJSUJfU0FfQVRUUl9SQU5ET01fRkRCX1JFQyAgICA9IDB4MTYsCisJSUJfU0FfQVRUUl9NQ0FTVF9GREJfUkVDICAgICA9IDB4MTcsCisJSUJfU0FfQVRUUl9TTV9JTkZPX1JFQwkgICAgID0gMHgxOCwKKwlJQl9TQV9BVFRSX0xJTktfUkVDCSAgICAgPSAweDIwLAorCUlCX1NBX0FUVFJfR1VJRF9JTkZPX1JFQyAgICAgPSAweDMwLAorCUlCX1NBX0FUVFJfU0VSVklDRV9SRUMJICAgICA9IDB4MzEsCisJSUJfU0FfQVRUUl9QQVJUSVRJT05fUkVDICAgICA9IDB4MzMsCisJSUJfU0FfQVRUUl9QQVRIX1JFQwkgICAgID0gMHgzNSwKKwlJQl9TQV9BVFRSX1ZMX0FSQl9SRUMJICAgICA9IDB4MzYsCisJSUJfU0FfQVRUUl9NQ19NRU1CRVJfUkVDICAgICA9IDB4MzgsCisJSUJfU0FfQVRUUl9UUkFDRV9SRUMJICAgICA9IDB4MzksCisJSUJfU0FfQVRUUl9NVUxUSV9QQVRIX1JFQyAgICA9IDB4M2EsCisJSUJfU0FfQVRUUl9TRVJWSUNFX0FTU09DX1JFQyA9IDB4M2IsCisJSUJfU0FfQVRUUl9JTkZPUk1fSU5GT19SRUMgICA9IDB4ZjMKIH07CiAKIGVudW0gaWJfc2Ffc2VsZWN0b3IgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX3VzZXJfY20uaCBiL2luY2x1ZGUvcmRtYS9pYl91c2VyX2NtLmgKaW5kZXggNzIxODJkMS4uZTRkMTY1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL2liX3VzZXJfY20uaAorKysgYi9pbmNsdWRlL3JkbWEvaWJfdXNlcl9jbS5oCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTM3LDcgKzM4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNkZWZpbmUgSUJfVVNFUl9DTV9BQklfVkVSU0lPTiAxCisjZGVmaW5lIElCX1VTRVJfQ01fQUJJX1ZFUlNJT04gMgogCiBlbnVtIHsKIAlJQl9VU0VSX0NNX0NNRF9DUkVBVEVfSUQsCkBAIC02MCw2ICs2MSw3IEBACiAJSUJfVVNFUl9DTV9DTURfU0VORF9TSURSX1JFUCwKIAogCUlCX1VTRVJfQ01fQ01EX0VWRU5ULAorCUlCX1VTRVJfQ01fQ01EX0lOSVRfUVBfQVRUUiwKIH07CiAvKgogICogY29tbWFuZCBBQkkgc3RydWN0dXJlcy4KQEAgLTcxLDYgKzczLDcgQEAKIH07CiAKIHN0cnVjdCBpYl91Y21fY3JlYXRlX2lkIHsKKwlfX3U2NCB1aWQ7CiAJX191NjQgcmVzcG9uc2U7CiB9OwogCkBAIC03OSw5ICs4MiwxNCBAQAogfTsKIAogc3RydWN0IGliX3VjbV9kZXN0cm95X2lkIHsKKwlfX3U2NCByZXNwb25zZTsKIAlfX3UzMiBpZDsKIH07CiAKK3N0cnVjdCBpYl91Y21fZGVzdHJveV9pZF9yZXNwIHsKKwlfX3UzMiBldmVudHNfcmVwb3J0ZWQ7Cit9OworCiBzdHJ1Y3QgaWJfdWNtX2F0dHJfaWQgewogCV9fdTY0IHJlc3BvbnNlOwogCV9fdTMyIGlkOwpAQCAtOTQsNiArMTAyLDY0IEBACiAJX19iZTMyIHJlbW90ZV9pZDsKIH07CiAKK3N0cnVjdCBpYl91Y21faW5pdF9xcF9hdHRyIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBpZDsKKwlfX3UzMiBxcF9zdGF0ZTsKK307CisKK3N0cnVjdCBpYl91Y21fYWhfYXR0ciB7CisJX191OAlncmhfZGdpZFsxNl07CisJX191MzIJZ3JoX2Zsb3dfbGFiZWw7CisJX191MTYJZGxpZDsKKwlfX3UxNglyZXNlcnZlZDsKKwlfX3U4CWdyaF9zZ2lkX2luZGV4OworCV9fdTgJZ3JoX2hvcF9saW1pdDsKKwlfX3U4CWdyaF90cmFmZmljX2NsYXNzOworCV9fdTgJc2w7CisJX191OAlzcmNfcGF0aF9iaXRzOworCV9fdTgJc3RhdGljX3JhdGU7CisJX191OAlpc19nbG9iYWw7CisJX191OAlwb3J0X251bTsKK307CisKK3N0cnVjdCBpYl91Y21faW5pdF9xcF9hdHRyX3Jlc3AgeworCV9fdTMyCXFwX2F0dHJfbWFzazsKKwlfX3UzMglxcF9zdGF0ZTsKKwlfX3UzMgljdXJfcXBfc3RhdGU7CisJX191MzIJcGF0aF9tdHU7CisJX191MzIJcGF0aF9taWdfc3RhdGU7CisJX191MzIJcWtleTsKKwlfX3UzMglycV9wc247CisJX191MzIJc3FfcHNuOworCV9fdTMyCWRlc3RfcXBfbnVtOworCV9fdTMyCXFwX2FjY2Vzc19mbGFnczsKKworCXN0cnVjdCBpYl91Y21fYWhfYXR0cglhaF9hdHRyOworCXN0cnVjdCBpYl91Y21fYWhfYXR0cglhbHRfYWhfYXR0cjsKKworCS8qIGliX3FwX2NhcCAqLworCV9fdTMyCW1heF9zZW5kX3dyOworCV9fdTMyCW1heF9yZWN2X3dyOworCV9fdTMyCW1heF9zZW5kX3NnZTsKKwlfX3UzMgltYXhfcmVjdl9zZ2U7CisJX191MzIJbWF4X2lubGluZV9kYXRhOworCisJX191MTYJcGtleV9pbmRleDsKKwlfX3UxNglhbHRfcGtleV9pbmRleDsKKwlfX3U4CWVuX3NxZF9hc3luY19ub3RpZnk7CisJX191OAlzcV9kcmFpbmluZzsKKwlfX3U4CW1heF9yZF9hdG9taWM7CisJX191OAltYXhfZGVzdF9yZF9hdG9taWM7CisJX191OAltaW5fcm5yX3RpbWVyOworCV9fdTgJcG9ydF9udW07CisJX191OAl0aW1lb3V0OworCV9fdTgJcmV0cnlfY250OworCV9fdTgJcm5yX3JldHJ5OworCV9fdTgJYWx0X3BvcnRfbnVtOworCV9fdTgJYWx0X3RpbWVvdXQ7Cit9OworCiBzdHJ1Y3QgaWJfdWNtX2xpc3RlbiB7CiAJX19iZTY0IHNlcnZpY2VfaWQ7CiAJX19iZTY0IHNlcnZpY2VfbWFzazsKQEAgLTE1Nyw2ICsyMjMsNyBAQAogfTsKIAogc3RydWN0IGliX3VjbV9yZXAgeworCV9fdTY0IHVpZDsKIAlfX3U2NCBkYXRhOwogCV9fdTMyIGlkOwogCV9fdTMyIHFwbjsKQEAgLTIzMiw3ICsyOTksNiBAQAogfTsKIAogc3RydWN0IGliX3VjbV9yZXFfZXZlbnRfcmVzcCB7Ci0JX191MzIgICAgICAgICAgICAgICAgICBsaXN0ZW5faWQ7CiAJLyogZGV2aWNlICovCiAJLyogcG9ydCAqLwogCXN0cnVjdCBpYl91Y21fcGF0aF9yZWMgcHJpbWFyeV9wYXRoOwpAQCAtMjg3LDcgKzM1Myw2IEBACiB9OwogCiBzdHJ1Y3QgaWJfdWNtX3NpZHJfcmVxX2V2ZW50X3Jlc3AgewotCV9fdTMyIGxpc3Rlbl9pZDsKIAkvKiBkZXZpY2UgKi8KIAkvKiBwb3J0ICovCiAJX191MTYgcGtleTsKQEAgLTMwNyw2ICszNzIsNyBAQAogI2RlZmluZSBJQl9VQ01fUFJFU19BTFRFUk5BVEUgMHgwOAogCiBzdHJ1Y3QgaWJfdWNtX2V2ZW50X3Jlc3AgeworCV9fdTY0IHVpZDsKIAlfX3UzMiBpZDsKIAlfX3UzMiBldmVudDsKIAlfX3UzMiBwcmVzZW50OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX3VzZXJfdmVyYnMuaCBiL2luY2x1ZGUvcmRtYS9pYl91c2VyX3ZlcmJzLmgKaW5kZXggN2ViYjAxYy4uZmQ4NTcyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL2liX3VzZXJfdmVyYnMuaAorKysgYi9pbmNsdWRlL3JkbWEvaWJfdXNlcl92ZXJicy5oCkBAIC00Miw3ICs0Miw3IEBACiAgKiBJbmNyZW1lbnQgdGhpcyB2YWx1ZSBpZiBhbnkgY2hhbmdlcyB0aGF0IGJyZWFrIHVzZXJzcGFjZSBBQkkKICAqIGNvbXBhdGliaWxpdHkgYXJlIG1hZGUuCiAgKi8KLSNkZWZpbmUgSUJfVVNFUl9WRVJCU19BQklfVkVSU0lPTgkxCisjZGVmaW5lIElCX1VTRVJfVkVSQlNfQUJJX1ZFUlNJT04JMgogCiBlbnVtIHsKIAlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9QQVJBTVMsCkBAIC0yOTIsNyArMjkyLDE0IEBACiB9OwogCiBzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfY3EgeworCV9fdTY0IHJlc3BvbnNlOwogCV9fdTMyIGNxX2hhbmRsZTsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9jcV9yZXNwIHsKKwlfX3UzMiBjb21wX2V2ZW50c19yZXBvcnRlZDsKKwlfX3UzMiBhc3luY19ldmVudHNfcmVwb3J0ZWQ7CiB9OwogCiBzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9xcCB7CkBAIC0zNzIsNyArMzc5LDEzIEBACiB9OwogCiBzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfcXAgeworCV9fdTY0IHJlc3BvbnNlOwogCV9fdTMyIHFwX2hhbmRsZTsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9xcF9yZXNwIHsKKwlfX3UzMiBldmVudHNfcmVwb3J0ZWQ7CiB9OwogCiBzdHJ1Y3QgaWJfdXZlcmJzX2F0dGFjaF9tY2FzdCB7CkBAIC00MTYsNyArNDI5LDEzIEBACiB9OwogCiBzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfc3JxIHsKKwlfX3U2NCByZXNwb25zZTsKIAlfX3UzMiBzcnFfaGFuZGxlOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IGliX3V2ZXJic19kZXN0cm95X3NycV9yZXNwIHsKKwlfX3UzMiBldmVudHNfcmVwb3J0ZWQ7CiB9OwogCiAjZW5kaWYgLyogSUJfVVNFUl9WRVJCU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKaW5kZXggOTk1N2YxNi4uYmVkNGI3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaApAQCAtNTEsMTIgKzUxLDE2IEBACiAJICogcHJpbnRrJ3MgdG8gdXNlIC0+cGlkLCBzbyB0aGF0IHdlIGNhbiBraWxsIHRoaXMgZmllbGQuCiAJICovCiAJdW5zaWduZWQgbG9uZyBzZXJpYWxfbnVtYmVyOworCS8qCisJICogVGhpcyBpcyBzZXQgdG8gamlmZmllcyBhcyBpdCB3YXMgd2hlbiB0aGUgY29tbWFuZCB3YXMgZmlyc3QKKwkgKiBhbGxvY2F0ZWQuICBJdCBpcyB1c2VkIHRvIHRpbWUgaG93IGxvbmcgdGhlIGNvbW1hbmQgaGFzCisJICogYmVlbiBvdXRzdGFuZGluZworCSAqLworCXVuc2lnbmVkIGxvbmcgamlmZmllc19hdF9hbGxvYzsKIAogCWludCByZXRyaWVzOwogCWludCBhbGxvd2VkOwogCWludCB0aW1lb3V0X3Blcl9jb21tYW5kOwotCWludCB0aW1lb3V0X3RvdGFsOwotCWludCB0aW1lb3V0OwogCiAJdW5zaWduZWQgY2hhciBjbWRfbGVuOwogCXVuc2lnbmVkIGNoYXIgb2xkX2NtZF9sZW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9kYmcuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2RiZy5oCmluZGV4IDEyZTkwOTMuLmIwOTBhMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2RiZy5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2RiZy5oCkBAIC0zLDggKzMsMTAgQEAKIAogc3RydWN0IHNjc2lfY21uZDsKIHN0cnVjdCBzY3NpX3JlcXVlc3Q7CitzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHI7CiAKIGV4dGVybiB2b2lkIHNjc2lfcHJpbnRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICopOworZXh0ZXJuIHZvaWQgc2NzaV9wcmludF9zZW5zZV9oZHIoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKik7CiBleHRlcm4gdm9pZCBfX3Njc2lfcHJpbnRfY29tbWFuZCh1bnNpZ25lZCBjaGFyICopOwogZXh0ZXJuIHZvaWQgc2NzaV9wcmludF9zZW5zZShjb25zdCBjaGFyICosIHN0cnVjdCBzY3NpX2NtbmQgKik7CiBleHRlcm4gdm9pZCBzY3NpX3ByaW50X3JlcV9zZW5zZShjb25zdCBjaGFyICosIHN0cnVjdCBzY3NpX3JlcXVlc3QgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCmluZGV4IDgzNWFmOGUuLmRhNjM3MjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCkBAIC04LDggKzgsMTcgQEAKIAogc3RydWN0IHJlcXVlc3RfcXVldWU7CiBzdHJ1Y3Qgc2NzaV9jbW5kOwotc3RydWN0IHNjc2lfbW9kZV9kYXRhOwogc3RydWN0IHNjc2lfbHVuOworc3RydWN0IHNjc2lfc2Vuc2VfaGRyOworCitzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgeworCV9fdTMyCWxlbmd0aDsKKwlfX3UxNglibG9ja19kZXNjcmlwdG9yX2xlbmd0aDsKKwlfX3U4CW1lZGl1bV90eXBlOworCV9fdTgJZGV2aWNlX3NwZWNpZmljOworCV9fdTgJaGVhZGVyX2xlbmd0aDsKKwlfX3U4CWxvbmdsYmE6MTsKK307CiAKIC8qCiAgKiBzZGV2IHN0YXRlOiBJZiB5b3UgYWx0ZXIgdGhpcywgeW91IGFsc28gbmVlZCB0byBhbHRlciBzY3NpX3N5c2ZzLmMKQEAgLTIyOCw3ICsyMzcsOCBAQAogCiBleHRlcm4gaW50IHNjc2lfbW9kZV9zZW5zZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBkYmQsIGludCBtb2RlcGFnZSwKIAkJCSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwgaW50IHRpbWVvdXQsCi0JCQkgICBpbnQgcmV0cmllcywgc3RydWN0IHNjc2lfbW9kZV9kYXRhICpkYXRhKTsKKwkJCSAgIGludCByZXRyaWVzLCBzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgKmRhdGEsCisJCQkgICBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKik7CiBleHRlcm4gaW50IHNjc2lfdGVzdF91bml0X3JlYWR5KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHRpbWVvdXQsCiAJCQkJaW50IHJldHJpZXMpOwogZXh0ZXJuIGludCBzY3NpX2RldmljZV9zZXRfc3RhdGUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LApAQCAtMjQ3LDYgKzI1NywxNCBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKnNjc2lfZGV2aWNlX3N0YXRlX25hbWUoZW51bSBzY3NpX2RldmljZV9zdGF0ZSk7CiBleHRlcm4gaW50IHNjc2lfaXNfc2Rldl9kZXZpY2UoY29uc3Qgc3RydWN0IGRldmljZSAqKTsKIGV4dGVybiBpbnQgc2NzaV9pc190YXJnZXRfZGV2aWNlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKik7CitleHRlcm4gaW50IHNjc2lfZXhlY3V0ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtZCwKKwkJCWludCBkYXRhX2RpcmVjdGlvbiwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBidWZmbGVuLAorCQkJdW5zaWduZWQgY2hhciAqc2Vuc2UsIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcywKKwkJCWludCBmbGFnKTsKK2V4dGVybiBpbnQgc2NzaV9leGVjdXRlX3JlcShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtZCwKKwkJCSAgICBpbnQgZGF0YV9kaXJlY3Rpb24sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgYnVmZmxlbiwKKwkJCSAgICBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKiwgaW50IHRpbWVvdXQsIGludCByZXRyaWVzKTsKKwogc3RhdGljIGlubGluZSBpbnQgc2NzaV9kZXZpY2Vfb25saW5lKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKIAlyZXR1cm4gc2Rldi0+c2Rldl9zdGF0ZSAhPSBTREVWX09GRkxJTkU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9laC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfZWguaAppbmRleCA4MDU1N2Y4Li5mYWJkODc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9laC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2VoLmgKQEAgLTI2LDEwICsyNiwxNSBAQAogCXU4IGFkZGl0aW9uYWxfbGVuZ3RoOwkvKiBhbHdheXMgMCBmb3IgZml4ZWQgc2Vuc2UgZm9ybWF0ICovCiB9OwogCitzdGF0aWMgaW5saW5lIGludCBzY3NpX3NlbnNlX3ZhbGlkKHN0cnVjdCBzY3NpX3NlbnNlX2hkciAqc3NoZHIpCit7CisJaWYgKCFzc2hkcikKKwkJcmV0dXJuIDA7CiAKLWV4dGVybiB2b2lkIHNjc2lfYWRkX3RpbWVyKHN0cnVjdCBzY3NpX2NtbmQgKiwgaW50LAotCQl2b2lkICgqKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKLWV4dGVybiBpbnQgc2NzaV9kZWxldGVfdGltZXIoc3RydWN0IHNjc2lfY21uZCAqKTsKKwlyZXR1cm4gKHNzaGRyLT5yZXNwb25zZV9jb2RlICYgMHg3MCkgPT0gMHg3MDsKK30KKworCiBleHRlcm4gdm9pZCBzY3NpX3JlcG9ydF9idXNfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgc2NzaV9yZXBvcnRfZGV2aWNlX3Jlc2V0KHN0cnVjdCBTY3NpX0hvc3QgKiwgaW50LCBpbnQpOwogZXh0ZXJuIGludCBzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoc3RydWN0IHNjc2lfZGV2aWNlICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCmluZGV4IDgxZDUyMzQuLjkxNjE0NGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKQEAgLTQyOSwxMiArNDI5LDE1IEBACiB9OwogCiAvKgotICogc2hvc3Qgc3RhdGVzCisgKiBzaG9zdCBzdGF0ZTogSWYgeW91IGFsdGVyIHRoaXMsIHlvdSBhbHNvIG5lZWQgdG8gYWx0ZXIgc2NzaV9zeXNmcy5jCisgKiAoZm9yIHRoZSBhc2NpaSBkZXNjcmlwdGlvbnMpIGFuZCB0aGUgc3RhdGUgbW9kZWwgZW5mb3JjZXI6CisgKiBzY3NpX2hvc3Rfc2V0X3N0YXRlKCkKICAqLwotZW51bSB7Ci0JU0hPU1RfQURELAotCVNIT1NUX0RFTCwKK2VudW0gc2NzaV9ob3N0X3N0YXRlIHsKKwlTSE9TVF9DUkVBVEVEID0gMSwKKwlTSE9TVF9SVU5OSU5HLAogCVNIT1NUX0NBTkNFTCwKKwlTSE9TVF9ERUwsCiAJU0hPU1RfUkVDT1ZFUlksCiB9OwogCkBAIC00NjQsMTIgKzQ2NywxMCBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAgICAqIGVoYW5kbGVyOyAgLyogRXJyb3IgcmVjb3ZlcnkgdGhyZWFkLiAqLwogCXN0cnVjdCBzZW1hcGhvcmUgICAgICAqIGVoX3dhaXQ7ICAgLyogVGhlIGVycm9yIHJlY292ZXJ5IHRocmVhZCB3YWl0cwogCQkJCQkgICAgICBvbiB0aGlzLiAqLwotCXN0cnVjdCBjb21wbGV0aW9uICAgICAqIGVoX25vdGlmeTsgLyogd2FpdCBmb3IgZWggdG8gYmVnaW4gb3IgZW5kICovCiAJc3RydWN0IHNlbWFwaG9yZSAgICAgICogZWhfYWN0aW9uOyAvKiBXYWl0IGZvciBzcGVjaWZpYyBhY3Rpb25zIG9uIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC4gKi8KIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICBlaF9hY3RpdmU6MTsgLyogSW5kaWNhdGVzIHRoZSBlaCB0aHJlYWQgaXMgYXdha2UgYW5kIGFjdGl2ZSBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyB0cnVlLiAqLwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGVoX2tpbGw6MTsgLyogc2V0IHdoZW4ga2lsbGluZyB0aGUgZWggdGhyZWFkICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgICAgICAgaG9zdF93YWl0OwogCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKmhvc3R0OwogCXN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqdHJhbnNwb3J0dDsKQEAgLTU3NSw3ICs1NzYsNyBAQAogCXVuc2lnbmVkIGludCAgaXJxOwogCQogCi0JdW5zaWduZWQgbG9uZyBzaG9zdF9zdGF0ZTsKKwllbnVtIHNjc2lfaG9zdF9zdGF0ZSBzaG9zdF9zdGF0ZTsKIAogCS8qIGxkbSBiaXRzICovCiAJc3RydWN0IGRldmljZQkJc2hvc3RfZ2VuZGV2OwpAQCAtNjMzLDYgKzYzNCw3IEBACiBleHRlcm4gc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0X2dldChzdHJ1Y3QgU2NzaV9Ib3N0ICopOwogZXh0ZXJuIHZvaWQgc2NzaV9ob3N0X3B1dChzdHJ1Y3QgU2NzaV9Ib3N0ICp0KTsKIGV4dGVybiBzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3RfbG9va3VwKHVuc2lnbmVkIHNob3J0KTsKK2V4dGVybiBjb25zdCBjaGFyICpzY3NpX2hvc3Rfc3RhdGVfbmFtZShlbnVtIHNjc2lfaG9zdF9zdGF0ZSk7CiAKIGV4dGVybiB1NjQgc2NzaV9jYWxjdWxhdGVfYm91bmNlX2xpbWl0KHN0cnVjdCBTY3NpX0hvc3QgKik7CiAKQEAgLTY0Niw2ICs2NDgsMTUgQEAKICAgICAgICAgcmV0dXJuIHNob3N0LT5zaG9zdF9nZW5kZXYucGFyZW50OwogfQogCisvKioKKyAqIHNjc2lfaG9zdF9zY2FuX2FsbG93ZWQgLSBJcyBzY2FubmluZyBvZiB0aGlzIGhvc3QgYWxsb3dlZAorICogQHNob3N0OglQb2ludGVyIHRvIFNjc2lfSG9zdC4KKyAqKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNjc2lfaG9zdF9zY2FuX2FsbG93ZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJcmV0dXJuIHNob3N0LT5zaG9zdF9zdGF0ZSA9PSBTSE9TVF9SVU5OSU5HOworfQorCiBleHRlcm4gdm9pZCBzY3NpX3VuYmxvY2tfcmVxdWVzdHMoc3RydWN0IFNjc2lfSG9zdCAqKTsKIGV4dGVybiB2b2lkIHNjc2lfYmxvY2tfcmVxdWVzdHMoc3RydWN0IFNjc2lfSG9zdCAqKTsKIApAQCAtNjYzLDUgKzY3NCw2IEBACiAvKiBsZWdhY3kgaW50ZXJmYWNlcyAqLwogZXh0ZXJuIHN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfcmVnaXN0ZXIoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgc2NzaV91bnJlZ2lzdGVyKHN0cnVjdCBTY3NpX0hvc3QgKik7CitleHRlcm4gaW50IHNjc2lfaG9zdF9zZXRfc3RhdGUoc3RydWN0IFNjc2lfSG9zdCAqLCBlbnVtIHNjc2lfaG9zdF9zdGF0ZSk7CiAKICNlbmRpZiAvKiBfU0NTSV9TQ1NJX0hPU1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfcmVxdWVzdC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfcmVxdWVzdC5oCmluZGV4IDk4NzE5NDAuLjZhMTQwMDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX3JlcXVlc3QuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9yZXF1ZXN0LmgKQEAgLTU0LDIwICs1NCw0IEBACiAJCQl2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1ZmZsZW4sCiAJCQl2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKiksCiAJCQlpbnQgdGltZW91dCwgaW50IHJldHJpZXMpOwotCi1zdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgewotCV9fdTMyCWxlbmd0aDsKLQlfX3UxNglibG9ja19kZXNjcmlwdG9yX2xlbmd0aDsKLQlfX3U4CW1lZGl1bV90eXBlOwotCV9fdTgJZGV2aWNlX3NwZWNpZmljOwotCV9fdTgJaGVhZGVyX2xlbmd0aDsKLQlfX3U4CWxvbmdsYmE6MTsKLX07Ci0KLWV4dGVybiBpbnQgX19zY3NpX21vZGVfc2Vuc2Uoc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQsIGludCBkYmQsCi0JCQkgICAgIGludCBtb2RlcGFnZSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuLAotCQkJICAgICBpbnQgdGltZW91dCwgaW50IHJldHJpZXMsCi0JCQkgICAgIHN0cnVjdCBzY3NpX21vZGVfZGF0YSAqZGF0YSk7Ci0KLQogI2VuZGlmIC8qIF9TQ1NJX1NDU0lfUkVRVUVTVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmggYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmgKaW5kZXggYTMwZDZjZC4uNmJkYzRhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaApAQCAtMzksNiArMzksNyBAQAogCXVuc2lnbmVkIGludCByZF9zdHJtOjE7CS8qIFJlYWQgc3RyZWFtaW5nIGVuYWJsZWQgKi8KIAl1bnNpZ25lZCBpbnQgcnRpOjE7CS8qIFJldGFpbiBUcmFpbmluZyBJbmZvcm1hdGlvbiAqLwogCXVuc2lnbmVkIGludCBwY29tcF9lbjoxOy8qIFByZWNvbXBlbnNhdGlvbiBlbmFibGVkICovCisJdW5zaWduZWQgaW50IGhvbGRfbWNzOjE7LyogSG9sZCBNYXJnaW4gQ29udHJvbCBTZXR0aW5ncyAqLwogCXVuc2lnbmVkIGludCBpbml0aWFsX2R2OjE7IC8qIERWIGRvbmUgdG8gdGhpcyB0YXJnZXQgeWV0ICAqLwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIGZsYWdzIGZpZWxkIGZvciBkcml2ZXJzIHRvIHVzZSAqLwogCS8qIERldmljZSBQcm9wZXJ0aWVzIGZpZWxkcyAqLwpAQCAtNzgsNiArNzksNyBAQAogI2RlZmluZSBzcGlfcmRfc3RybSh4KQkoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPnJkX3N0cm0pCiAjZGVmaW5lIHNwaV9ydGkoeCkJKCgoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmKHgpLT5zdGFyZ2V0X2RhdGEpLT5ydGkpCiAjZGVmaW5lIHNwaV9wY29tcF9lbih4KQkoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPnBjb21wX2VuKQorI2RlZmluZSBzcGlfaG9sZF9tY3MoeCkJKCgoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmKHgpLT5zdGFyZ2V0X2RhdGEpLT5ob2xkX21jcykKICNkZWZpbmUgc3BpX2luaXRpYWxfZHYoeCkJKCgoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmKHgpLT5zdGFyZ2V0X2RhdGEpLT5pbml0aWFsX2R2KQogCiAjZGVmaW5lIHNwaV9zdXBwb3J0X3N5bmMoeCkJKCgoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmKHgpLT5zdGFyZ2V0X2RhdGEpLT5zdXBwb3J0X3N5bmMpCkBAIC0xMTQsOCArMTE2LDExIEBACiAJdm9pZAkoKnNldF9ydGkpKHN0cnVjdCBzY3NpX3RhcmdldCAqLCBpbnQpOwogCXZvaWQJKCpnZXRfcGNvbXBfZW4pKHN0cnVjdCBzY3NpX3RhcmdldCAqKTsKIAl2b2lkCSgqc2V0X3Bjb21wX2VuKShzdHJ1Y3Qgc2NzaV90YXJnZXQgKiwgaW50KTsKKwl2b2lkCSgqZ2V0X2hvbGRfbWNzKShzdHJ1Y3Qgc2NzaV90YXJnZXQgKik7CisJdm9pZAkoKnNldF9ob2xkX21jcykoc3RydWN0IHNjc2lfdGFyZ2V0ICosIGludCk7CiAJdm9pZAkoKmdldF9zaWduYWxsaW5nKShzdHJ1Y3QgU2NzaV9Ib3N0ICopOwogCXZvaWQJKCpzZXRfc2lnbmFsbGluZykoc3RydWN0IFNjc2lfSG9zdCAqLCBlbnVtIHNwaV9zaWduYWxfdHlwZSk7CisJaW50CSgqZGVueV9iaW5kaW5nKShzdHJ1Y3Qgc2NzaV90YXJnZXQgKik7CiAJLyogVGhlIGRyaXZlciBzZXRzIHRoZXNlIHRvIHRlbGwgdGhlIHRyYW5zcG9ydCBjbGFzcyBpdAogCSAqIHdhbnRzIHRoZSBhdHRyaWJ1dGVzIGRpc3BsYXllZCBpbiBzeXNmcy4gIElmIHRoZSBzaG93XyBmbGFnCiAJICogaXMgbm90IHNldCwgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHByaXZhdGUgdG8gdGhlIHRyYW5zcG9ydApAQCAtMTMwLDYgKzEzNSw3IEBACiAJdW5zaWduZWQgbG9uZwlzaG93X3JkX3N0cm06MTsKIAl1bnNpZ25lZCBsb25nCXNob3dfcnRpOjE7CiAJdW5zaWduZWQgbG9uZwlzaG93X3Bjb21wX2VuOjE7CisJdW5zaWduZWQgbG9uZwlzaG93X2hvbGRfbWNzOjE7CiB9OwogCiBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnNwaV9hdHRhY2hfdHJhbnNwb3J0KHN0cnVjdCBzcGlfZnVuY3Rpb25fdGVtcGxhdGUgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2FjOTdfY29kZWMuaCBiL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oCmluZGV4IDEzMDljMTIuLjI4NTdjZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oCisrKyBiL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oCkBAIC0yNiw2ICsyNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgInBjbS5oIgogI2luY2x1ZGUgImNvbnRyb2wuaCIKICNpbmNsdWRlICJpbmZvLmgiCkBAIC0zNzQsNiArMzc1LDkgQEAKICNkZWZpbmUgQUM5N19IQVNfTk9fUENfQkVFUAkoMTw8MTIpIC8qIG5vIFBDIEJlZXAgdm9sdW1lICovCiAjZGVmaW5lIEFDOTdfSEFTX05PX1ZJREVPCSgxPDwxMykgLyogbm8gVmlkZW8gdm9sdW1lICovCiAjZGVmaW5lIEFDOTdfSEFTX05PX0NECQkoMTw8MTQpIC8qIG5vIENEIHZvbHVtZSAqLworI2RlZmluZSBBQzk3X0hBU19OT19NSUMJKDE8PDE1KSAvKiBubyBNSUMgdm9sdW1lICovCisjZGVmaW5lIEFDOTdfSEFTX05PX1RPTkUJKDE8PDE2KSAvKiBubyBUb25lIHZvbHVtZSAqLworI2RlZmluZSBBQzk3X0hBU19OT19TVERfUENNCSgxPDwxNykJLyogbm8gc3RhbmRhcmQgQUM5NyBQQ00gdm9sdW1lIGFuZCBtdXRlICovCiAKIC8qIHJhdGVzIGluZGV4ZXMgKi8KICNkZWZpbmUgQUM5N19SQVRFU19GUk9OVF9EQUMJMApAQCAtNTIwLDYgKzUyNCw3IEBACiAJLyogamFjay1zaGFyaW5nIGluZm8gKi8KIAl1bnNpZ25lZCBjaGFyIGluZGVwX3N1cnJvdW5kOwogCXVuc2lnbmVkIGNoYXIgY2hhbm5lbF9tb2RlOworCXN0cnVjdCBkZXZpY2UgZGV2OwogfTsKIAogLyogY29uZGl0aW9ucyAqLwpAQCAtNTk5LDQgKzYwNCw4IEBACiAJdW5zaWduZWQgc2hvcnQgbWFzazsKIAljb25zdCBjaGFyICoqdGV4dHM7CiB9OworCisvKiBhZCBob2MgQUM5NyBkZXZpY2UgZHJpdmVyIGFjY2VzcyAqLworZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBhYzk3X2J1c190eXBlOworCiAjZW5kaWYgLyogX19TT1VORF9BQzk3X0NPREVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvYWQxODE2YS5oIGIvaW5jbHVkZS9zb3VuZC9hZDE4MTZhLmgKaW5kZXggMzk1OTc4ZS4uY2EyZTBlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9hZDE4MTZhLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9hZDE4MTZhLmgKQEAgLTEzOCw2ICsxMzgsNyBAQAogCXNwaW5sb2NrX3QgbG9jazsKIAogCXVuc2lnbmVkIHNob3J0IG1vZGU7CisJdW5zaWduZWQgaW50IGNsb2NrX2ZyZXE7CiAKIAlzbmRfY2FyZF90ICpjYXJkOwogCXNuZF9wY21fdCAqcGNtOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hc291bmQuaCBiL2luY2x1ZGUvc291bmQvYXNvdW5kLmgKaW5kZXggOTk3NGY4My4uOGU1NTJkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9hc291bmQuaAorKysgYi9pbmNsdWRlL3NvdW5kL2Fzb3VuZC5oCkBAIC01NjAsNyArNTYwLDcgQEAKICAqICBUaW1lciBzZWN0aW9uIC0gL2Rldi9zbmQvdGltZXIKICAqLwogCi0jZGVmaW5lIFNORFJWX1RJTUVSX1ZFUlNJT04JCVNORFJWX1BST1RPQ09MX1ZFUlNJT04oMiwgMCwgNCkKKyNkZWZpbmUgU05EUlZfVElNRVJfVkVSU0lPTgkJU05EUlZfUFJPVE9DT0xfVkVSU0lPTigyLCAwLCA1KQogCiBlbnVtIHNuZHJ2X3RpbWVyX2NsYXNzIHsKIAlTTkRSVl9USU1FUl9DTEFTU19OT05FID0gLTEsCkBAIC02OTMsMTEgKzY5MywxNSBAQAogCVNORFJWX1RJTUVSX0VWRU5UX0NPTlRJTlVFLAkJLyogdmFsID0gcmVzb2x1dGlvbiBpbiBucyAqLwogCVNORFJWX1RJTUVSX0VWRU5UX1BBVVNFLAkJLyogdmFsID0gMCAqLwogCVNORFJWX1RJTUVSX0VWRU5UX0VBUkxZLAkJLyogdmFsID0gMCwgZWFybHkgZXZlbnQgKi8KKwlTTkRSVl9USU1FUl9FVkVOVF9TVVNQRU5ELAkJLyogdmFsID0gMCAqLworCVNORFJWX1RJTUVSX0VWRU5UX1JFU1VNRSwJCS8qIHZhbCA9IHJlc29sdXRpb24gaW4gbnMgKi8KIAkvKiBtYXN0ZXIgdGltZXIgZXZlbnRzIGZvciBzbGF2ZSB0aW1lciBpbnN0YW5jZXMgKi8KIAlTTkRSVl9USU1FUl9FVkVOVF9NU1RBUlQgPSBTTkRSVl9USU1FUl9FVkVOVF9TVEFSVCArIDEwLAogCVNORFJWX1RJTUVSX0VWRU5UX01TVE9QID0gU05EUlZfVElNRVJfRVZFTlRfU1RPUCArIDEwLAogCVNORFJWX1RJTUVSX0VWRU5UX01DT05USU5VRSA9IFNORFJWX1RJTUVSX0VWRU5UX0NPTlRJTlVFICsgMTAsCiAJU05EUlZfVElNRVJfRVZFTlRfTVBBVVNFID0gU05EUlZfVElNRVJfRVZFTlRfUEFVU0UgKyAxMCwKKwlTTkRSVl9USU1FUl9FVkVOVF9NU1VTUEVORCA9IFNORFJWX1RJTUVSX0VWRU5UX1NVU1BFTkQgKyAxMCwKKwlTTkRSVl9USU1FUl9FVkVOVF9NUkVTVU1FID0gU05EUlZfVElNRVJfRVZFTlRfUkVTVU1FICsgMTAsCiB9OwogCiBzdHJ1Y3Qgc25kcnZfdGltZXJfdHJlYWQgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9jb3JlLmggYi9pbmNsdWRlL3NvdW5kL2NvcmUuaAppbmRleCBmNzJiM2VmLi4zZGM0MWZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2NvcmUuaAorKysgYi9pbmNsdWRlL3NvdW5kL2NvcmUuaApAQCAtMjkxLDEyICsyOTEsMTQgQEAKIGludCBzbmRfbWVtb3J5X2luZm9faW5pdCh2b2lkKTsKIGludCBzbmRfbWVtb3J5X2luZm9fZG9uZSh2b2lkKTsKIHZvaWQgKnNuZF9oaWRkZW5fa21hbGxvYyhzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzKTsKK3ZvaWQgKnNuZF9oaWRkZW5fa3phbGxvYyhzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzKTsKIHZvaWQgKnNuZF9oaWRkZW5fa2NhbGxvYyhzaXplX3Qgbiwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncyk7CiB2b2lkIHNuZF9oaWRkZW5fa2ZyZWUoY29uc3Qgdm9pZCAqb2JqKTsKIHZvaWQgKnNuZF9oaWRkZW5fdm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpOwogdm9pZCBzbmRfaGlkZGVuX3ZmcmVlKHZvaWQgKm9iaik7CiBjaGFyICpzbmRfaGlkZGVuX2tzdHJkdXAoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzKTsKICNkZWZpbmUga21hbGxvYyhzaXplLCBmbGFncykgc25kX2hpZGRlbl9rbWFsbG9jKHNpemUsIGZsYWdzKQorI2RlZmluZSBremFsbG9jKHNpemUsIGZsYWdzKSBzbmRfaGlkZGVuX2t6YWxsb2Moc2l6ZSwgZmxhZ3MpCiAjZGVmaW5lIGtjYWxsb2Mobiwgc2l6ZSwgZmxhZ3MpIHNuZF9oaWRkZW5fa2NhbGxvYyhuLCBzaXplLCBmbGFncykKICNkZWZpbmUga2ZyZWUob2JqKSBzbmRfaGlkZGVuX2tmcmVlKG9iaikKICNkZWZpbmUgdm1hbGxvYyhzaXplKSBzbmRfaGlkZGVuX3ZtYWxsb2Moc2l6ZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY3M0Nnh4LmggYi9pbmNsdWRlL3NvdW5kL2NzNDZ4eC5oCmluZGV4IDE4MmRkMjcuLjliOTQ1MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvY3M0Nnh4LmgKKysrIGIvaW5jbHVkZS9zb3VuZC9jczQ2eHguaApAQCAtMTc0OCw3ICsxNzQ4LDcgQEAKIGludCBzbmRfY3M0Nnh4X3BjbV9yZWFyKGNzNDZ4eF90ICpjaGlwLCBpbnQgZGV2aWNlLCBzbmRfcGNtX3QgKipycGNtKTsKIGludCBzbmRfY3M0Nnh4X3BjbV9pZWM5NTgoY3M0Nnh4X3QgKmNoaXAsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKnJwY20pOwogaW50IHNuZF9jczQ2eHhfcGNtX2NlbnRlcl9sZmUoY3M0Nnh4X3QgKmNoaXAsIGludCBkZXZpY2UsIHNuZF9wY21fdCAqKnJwY20pOwotaW50IHNuZF9jczQ2eHhfbWl4ZXIoY3M0Nnh4X3QgKmNoaXApOworaW50IHNuZF9jczQ2eHhfbWl4ZXIoY3M0Nnh4X3QgKmNoaXAsIGludCBzcGRpZl9kZXZpY2UpOwogaW50IHNuZF9jczQ2eHhfbWlkaShjczQ2eHhfdCAqY2hpcCwgaW50IGRldmljZSwgc25kX3Jhd21pZGlfdCAqKnJtaWRpKTsKIGludCBzbmRfY3M0Nnh4X3N0YXJ0X2RzcChjczQ2eHhfdCAqY2hpcCk7CiBpbnQgc25kX2NzNDZ4eF9nYW1lcG9ydChjczQ2eHhfdCAqY2hpcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2VtdTEwazEuaCBiL2luY2x1ZGUvc291bmQvZW11MTBrMS5oCmluZGV4IGMyZWYzZjAuLjRlMzk5M2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvZW11MTBrMS5oCisrKyBiL2luY2x1ZGUvc291bmQvZW11MTBrMS5oCkBAIC0xMTc4LDcgKzExNzgsNyBAQAogaW50IHNuZF9wMTZ2X21peGVyKGVtdTEwazFfdCAqIGVtdSk7CiBpbnQgc25kX2VtdTEwazFfcGNtX211bHRpKGVtdTEwazFfdCAqIGVtdSwgaW50IGRldmljZSwgc25kX3BjbV90ICoqIHJwY20pOwogaW50IHNuZF9lbXUxMGsxX2Z4ODAxMF9wY20oZW11MTBrMV90ICogZW11LCBpbnQgZGV2aWNlLCBzbmRfcGNtX3QgKiogcnBjbSk7Ci1pbnQgc25kX2VtdTEwazFfbWl4ZXIoZW11MTBrMV90ICogZW11KTsKK2ludCBzbmRfZW11MTBrMV9taXhlcihlbXUxMGsxX3QgKiBlbXUsIGludCBwY21fZGV2aWNlLCBpbnQgbXVsdGlfZGV2aWNlKTsKIGludCBzbmRfZW11MTBrMV90aW1lcihlbXUxMGsxX3QgKiBlbXUsIGludCBkZXZpY2UpOwogaW50IHNuZF9lbXUxMGsxX2Z4ODAxMF9uZXcoZW11MTBrMV90ICplbXUsIGludCBkZXZpY2UsIHNuZF9od2RlcF90ICoqIHJod2RlcCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvZ3VzLmggYi9pbmNsdWRlL3NvdW5kL2d1cy5oCmluZGV4IGI0YjQ2MWMuLjcwMDBkOWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvZ3VzLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9ndXMuaApAQCAtNTEyLDEzICs1MTIsMTMgQEAKIAogZXh0ZXJuIHZvaWQgc25kX2dmMV93cml0ZTgoc25kX2d1c19jYXJkX3QgKiBndXMsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIGRhdGEpOwogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc25kX2dmMV9sb29rOChzbmRfZ3VzX2NhcmRfdCAqIGd1cywgdW5zaWduZWQgY2hhciByZWcpOwotZXh0ZXJuIGlubGluZSB1bnNpZ25lZCBjaGFyIHNuZF9nZjFfcmVhZDgoc25kX2d1c19jYXJkX3QgKiBndXMsIHVuc2lnbmVkIGNoYXIgcmVnKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHNuZF9nZjFfcmVhZDgoc25kX2d1c19jYXJkX3QgKiBndXMsIHVuc2lnbmVkIGNoYXIgcmVnKQogewogCXJldHVybiBzbmRfZ2YxX2xvb2s4KGd1cywgcmVnIHwgMHg4MCk7CiB9CiBleHRlcm4gdm9pZCBzbmRfZ2YxX3dyaXRlMTYoc25kX2d1c19jYXJkX3QgKiBndXMsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBpbnQgZGF0YSk7CiBleHRlcm4gdW5zaWduZWQgc2hvcnQgc25kX2dmMV9sb29rMTYoc25kX2d1c19jYXJkX3QgKiBndXMsIHVuc2lnbmVkIGNoYXIgcmVnKTsKLWV4dGVybiBpbmxpbmUgdW5zaWduZWQgc2hvcnQgc25kX2dmMV9yZWFkMTYoc25kX2d1c19jYXJkX3QgKiBndXMsIHVuc2lnbmVkIGNoYXIgcmVnKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBzbmRfZ2YxX3JlYWQxNihzbmRfZ3VzX2NhcmRfdCAqIGd1cywgdW5zaWduZWQgY2hhciByZWcpCiB7CiAJcmV0dXJuIHNuZF9nZjFfbG9vazE2KGd1cywgcmVnIHwgMHg4MCk7CiB9CkBAIC01MzIsMTIgKzUzMiwxMiBAQAogZXh0ZXJuIHZvaWQgc25kX2dmMV9pX3dyaXRlOChzbmRfZ3VzX2NhcmRfdCAqIGd1cywgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgZGF0YSk7CiBleHRlcm4gdW5zaWduZWQgY2hhciBzbmRfZ2YxX2lfbG9vazgoc25kX2d1c19jYXJkX3QgKiBndXMsIHVuc2lnbmVkIGNoYXIgcmVnKTsKIGV4dGVybiB2b2lkIHNuZF9nZjFfaV93cml0ZTE2KHNuZF9ndXNfY2FyZF90ICogZ3VzLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgaW50IGRhdGEpOwotZXh0ZXJuIGlubGluZSB1bnNpZ25lZCBjaGFyIHNuZF9nZjFfaV9yZWFkOChzbmRfZ3VzX2NhcmRfdCAqIGd1cywgdW5zaWduZWQgY2hhciByZWcpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgc25kX2dmMV9pX3JlYWQ4KHNuZF9ndXNfY2FyZF90ICogZ3VzLCB1bnNpZ25lZCBjaGFyIHJlZykKIHsKIAlyZXR1cm4gc25kX2dmMV9pX2xvb2s4KGd1cywgcmVnIHwgMHg4MCk7CiB9CiBleHRlcm4gdW5zaWduZWQgc2hvcnQgc25kX2dmMV9pX2xvb2sxNihzbmRfZ3VzX2NhcmRfdCAqIGd1cywgdW5zaWduZWQgY2hhciByZWcpOwotZXh0ZXJuIGlubGluZSB1bnNpZ25lZCBzaG9ydCBzbmRfZ2YxX2lfcmVhZDE2KHNuZF9ndXNfY2FyZF90ICogZ3VzLCB1bnNpZ25lZCBjaGFyIHJlZykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgc25kX2dmMV9pX3JlYWQxNihzbmRfZ3VzX2NhcmRfdCAqIGd1cywgdW5zaWduZWQgY2hhciByZWcpCiB7CiAJcmV0dXJuIHNuZF9nZjFfaV9sb29rMTYoZ3VzLCByZWcgfCAweDgwKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvcGNtLmggYi9pbmNsdWRlL3NvdW5kL3BjbS5oCmluZGV4IGQ5MzU0MTcuLmQ2MzYxZGFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3BjbS5oCisrKyBiL2luY2x1ZGUvc291bmQvcGNtLmgKQEAgLTM3OSw3ICszNzksNiBAQAogCXVuc2lnbmVkIGludCBkbWFfYnVmX2lkOwogCXNpemVfdCBkbWFfbWF4OwogCS8qIC0tIGhhcmR3YXJlIG9wZXJhdGlvbnMgLS0gKi8KLQl1bnNpZ25lZCBpbnQgb3Blbl9mbGFnOiAxOwkvKiBsb3dsZXZlbCBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkICovCiAJc25kX3BjbV9vcHNfdCAqb3BzOwogCS8qIC0tIHJ1bnRpbWUgaW5mb3JtYXRpb24gLS0gKi8KIAlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZTsKQEAgLTkwNCwxOCArOTAzLDE3IEBACiBpbnQgc25kX3BjbV9mb3JtYXRfbGluZWFyKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKIGludCBzbmRfcGNtX2Zvcm1hdF9saXR0bGVfZW5kaWFuKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKIGludCBzbmRfcGNtX2Zvcm1hdF9iaWdfZW5kaWFuKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKLS8qKgorLyoKICAqIHNuZF9wY21fZm9ybWF0X2NwdV9lbmRpYW4gLSBDaGVjayB0aGUgUENNIGZvcm1hdCBpcyBDUFUtZW5kaWFuCiAgKiBAZm9ybWF0OiB0aGUgZm9ybWF0IHRvIGNoZWNrCiAgKgogICogUmV0dXJucyAxIGlmIHRoZSBnaXZlbiBQQ00gZm9ybWF0IGlzIENQVS1lbmRpYW4sIDAgaWYKICAqIG9wcG9zaXRlLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgZW5kaWFuIG5vdCBzcGVjaWZpZWQuCiAgKi8KLS8qIGludCBzbmRfcGNtX2Zvcm1hdF9jcHVfZW5kaWFuKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsgKi8KICNpZmRlZiBTTkRSVl9MSVRUTEVfRU5ESUFOCi0jZGVmaW5lIHNuZF9wY21fZm9ybWF0X2NwdV9lbmRpYW4Jc25kX3BjbV9mb3JtYXRfbGl0dGxlX2VuZGlhbgorI2RlZmluZSBzbmRfcGNtX2Zvcm1hdF9jcHVfZW5kaWFuKGZvcm1hdCkgc25kX3BjbV9mb3JtYXRfbGl0dGxlX2VuZGlhbihmb3JtYXQpCiAjZWxzZQotI2RlZmluZSBzbmRfcGNtX2Zvcm1hdF9jcHVfZW5kaWFuCXNuZF9wY21fZm9ybWF0X2JpZ19lbmRpYW4KKyNkZWZpbmUgc25kX3BjbV9mb3JtYXRfY3B1X2VuZGlhbihmb3JtYXQpIHNuZF9wY21fZm9ybWF0X2JpZ19lbmRpYW4oZm9ybWF0KQogI2VuZGlmCiBpbnQgc25kX3BjbV9mb3JtYXRfd2lkdGgoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOwkJCS8qIGluIGJpdHMgKi8KIGludCBzbmRfcGNtX2Zvcm1hdF9waHlzaWNhbF93aWR0aChzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CQkvKiBpbiBiaXRzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3RlYTU3NXgtdHVuZXIuaCBiL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oCmluZGV4IGFkM2MzYmUuLmI4MmU0MDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oCisrKyBiL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oCkBAIC0zNCw5ICszNCw3IEBACiBzdHJ1Y3Qgc25kX3RlYTU3NXggewogCXNuZF9jYXJkX3QgKmNhcmQ7CiAJc3RydWN0IHZpZGVvX2RldmljZSB2ZDsJCS8qIHZpZGVvIGRldmljZSAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA1LCAwKQogCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wczsKLSNlbmRpZgogCWludCBkZXZfbnI7CQkJLyogcmVxdWVzdGVkIGRldmljZSBudW1iZXIgKyAxICovCiAJaW50IHZkX3JlZ2lzdGVyZWQ7CQkvKiB2aWRlbyBkZXZpY2UgaXMgcmVnaXN0ZXJlZCAqLwogCWludCB0ZWE1NzU5OwkJCS8qIDU3NTkgY2hpcCBpcyBwcmVzZW50ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3ZlcnNpb24uaCBiL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oCmluZGV4IGMwODUxMzYuLjhkMTliZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oCisrKyBiL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oCkBAIC0xLDMgKzEsMyBAQAogLyogaW5jbHVkZS92ZXJzaW9uLmguICBHZW5lcmF0ZWQgYnkgY29uZmlndXJlLiAgKi8KLSNkZWZpbmUgQ09ORklHX1NORF9WRVJTSU9OICIxLjAuOWIiCi0jZGVmaW5lIENPTkZJR19TTkRfREFURSAiIChUaHUgSnVsIDI4IDEyOjIwOjEzIDIwMDUgVVRDKSIKKyNkZWZpbmUgQ09ORklHX1NORF9WRVJTSU9OICIxLjAuMTByYzEiCisjZGVmaW5lIENPTkZJR19TTkRfREFURSAiIChUdWUgQXVnIDMwIDA1OjMxOjA4IDIwMDUgVVRDKSIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQveW1mcGNpLmggYi9pbmNsdWRlL3NvdW5kL3ltZnBjaS5oCmluZGV4IDRiNTcwNjguLjlhM2MxZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQveW1mcGNpLmgKKysrIGIvaW5jbHVkZS9zb3VuZC95bWZwY2kuaApAQCAtMjk1LDYgKzI5NSw3IEBACiAJdW5zaWduZWQgaW50IHJ1bm5pbmc6IDE7CiAJdW5zaWduZWQgaW50IG91dHB1dF9mcm9udDogMTsKIAl1bnNpZ25lZCBpbnQgb3V0cHV0X3JlYXI6IDE7CisJdW5zaWduZWQgaW50IHVwZGF0ZV9wY21fdm9sOwogCXUzMiBwZXJpb2Rfc2l6ZTsJCS8qIGNhY2hlZCBmcm9tIHJ1bnRpbWUtPnBlcmlvZF9zaXplICovCiAJdTMyIGJ1ZmZlcl9zaXplOwkJLyogY2FjaGVkIGZyb20gcnVudGltZS0+YnVmZmVyX3NpemUgKi8KIAl1MzIgcGVyaW9kX3BvczsKQEAgLTM2Nyw2ICszNjgsMTEgQEAKIAlpbnQgbW9kZV9kdXA0Y2g7CiAJaW50IHJlYXJfb3BlbmVkOwogCWludCBzcGRpZl9vcGVuZWQ7CisJc3RydWN0IHsKKwkJdTE2IGxlZnQ7CisJCXUxNiByaWdodDsKKwkJc25kX2tjb250cm9sX3QgKmN0bDsKKwl9IHBjbV9taXhlclszMl07CiAKIAlzcGlubG9ja190IHJlZ19sb2NrOwogCXNwaW5sb2NrX3Qgdm9pY2VfbG9jazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vY3libGFmYi5oIGIvaW5jbHVkZS92aWRlby9jeWJsYWZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5NDgyMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdmlkZW8vY3libGFmYi5oCkBAIC0wLDAgKzEsMTcxIEBACisKKyNpZm5kZWYgQ1lCTEFGQl9ERUJVRworI2RlZmluZSBDWUJMQUZCX0RFQlVHIDAKKyNlbmRpZgorCisjaWYgQ1lCTEFGQl9ERUJVRworI2RlZmluZSBkZWJ1ZyhmLGEuLi4pCXByaW50aygiJXM6IiBmLCAgX19GVU5DVElPTl9fICwgIyMgYSk7CisjZWxzZQorI2RlZmluZSBkZWJ1ZyhmLGEuLi4pCisjZW5kaWYKKworI2RlZmluZSBvdXRwdXQoZiwgYS4uLikgcHJpbnRrKCJjeWJsYWZiOiAiIGYsICMjIGEpCisKKyNkZWZpbmUgS2IJKDEwMjQpCisjZGVmaW5lIE1iCShLYipLYikKKworLyogUENJIElEUyBvZiBzdXBwb3J0ZWQgY2FyZHMgdGVtcG9yYXJpbHkgaGVyZSAqLworCisjZGVmaW5lIENZQkVSQkxBREVpMQkweDg1MDAKKworLyogdGhlc2UgZGVmaW5lcyBhcmUgZm9yICdsY2QnIHZhcmlhYmxlICovCisjZGVmaW5lIExDRF9TVFJFVENICTAKKyNkZWZpbmUgTENEX0NFTlRFUgkxCisjZGVmaW5lIExDRF9CSU9TCTIKKworLyogZGlzcGxheSB0eXBlcyAqLworI2RlZmluZSBESVNQTEFZX0NSVAkwCisjZGVmaW5lIERJU1BMQVlfRlAJMQorCisjZGVmaW5lIFJPUF9TCTB4Q0MKKworI2RlZmluZSBwb2ludCh4LHkpICgoeSk8PDE2fCh4KSkKKworLy8KKy8vIEF0dHJpYnV0ZSBSZWdzLCBBUnh4LCAzYzAvM2MxCisvLworI2RlZmluZSBBUjAwCTB4MDAKKyNkZWZpbmUgQVIwMQkweDAxCisjZGVmaW5lIEFSMDIJMHgwMgorI2RlZmluZSBBUjAzCTB4MDMKKyNkZWZpbmUgQVIwNAkweDA0CisjZGVmaW5lIEFSMDUJMHgwNQorI2RlZmluZSBBUjA2CTB4MDYKKyNkZWZpbmUgQVIwNwkweDA3CisjZGVmaW5lIEFSMDgJMHgwOAorI2RlZmluZSBBUjA5CTB4MDkKKyNkZWZpbmUgQVIwQQkweDBBCisjZGVmaW5lIEFSMEIJMHgwQgorI2RlZmluZSBBUjBDCTB4MEMKKyNkZWZpbmUgQVIwRAkweDBECisjZGVmaW5lIEFSMEUJMHgwRQorI2RlZmluZSBBUjBGCTB4MEYKKyNkZWZpbmUgQVIxMAkweDEwCisjZGVmaW5lIEFSMTIJMHgxMgorI2RlZmluZSBBUjEzCTB4MTMKKworLy8KKy8vIFNlcXVlbmNlciBSZWdzLCBTUnh4LCAzYzQvM2M1CisvLworI2RlZmluZSBTUjAwCTB4MDAKKyNkZWZpbmUgU1IwMQkweDAxCisjZGVmaW5lIFNSMDIJMHgwMgorI2RlZmluZSBTUjAzCTB4MDMKKyNkZWZpbmUgU1IwNAkweDA0CisjZGVmaW5lIFNSMEQJMHgwRAorI2RlZmluZSBTUjBFCTB4MEUKKyNkZWZpbmUgU1IxMQkweDExCisjZGVmaW5lIFNSMTgJMHgxOAorI2RlZmluZSBTUjE5CTB4MTkKKworLy8KKy8vCisvLworI2RlZmluZSBDUjAwCTB4MDAKKyNkZWZpbmUgQ1IwMQkweDAxCisjZGVmaW5lIENSMDIJMHgwMgorI2RlZmluZSBDUjAzCTB4MDMKKyNkZWZpbmUgQ1IwNAkweDA0CisjZGVmaW5lIENSMDUJMHgwNQorI2RlZmluZSBDUjA2CTB4MDYKKyNkZWZpbmUgQ1IwNwkweDA3CisjZGVmaW5lIENSMDgJMHgwOAorI2RlZmluZSBDUjA5CTB4MDkKKyNkZWZpbmUgQ1IwQQkweDBBCisjZGVmaW5lIENSMEIJMHgwQgorI2RlZmluZSBDUjBDCTB4MEMKKyNkZWZpbmUgQ1IwRAkweDBECisjZGVmaW5lIENSMEUJMHgwRQorI2RlZmluZSBDUjBGCTB4MEYKKyNkZWZpbmUgQ1IxMAkweDEwCisjZGVmaW5lIENSMTEJMHgxMQorI2RlZmluZSBDUjEyCTB4MTIKKyNkZWZpbmUgQ1IxMwkweDEzCisjZGVmaW5lIENSMTQJMHgxNAorI2RlZmluZSBDUjE1CTB4MTUKKyNkZWZpbmUgQ1IxNgkweDE2CisjZGVmaW5lIENSMTcJMHgxNworI2RlZmluZSBDUjE4CTB4MTgKKyNkZWZpbmUgQ1IxOQkweDE5CisjZGVmaW5lIENSMUEJMHgxQQorI2RlZmluZSBDUjFCCTB4MUIKKyNkZWZpbmUgQ1IxQwkweDFDCisjZGVmaW5lIENSMUQJMHgxRAorI2RlZmluZSBDUjFFCTB4MUUKKyNkZWZpbmUgQ1IxRgkweDFGCisjZGVmaW5lIENSMjAJMHgyMAorI2RlZmluZSBDUjIxCTB4MjEKKyNkZWZpbmUgQ1IyNwkweDI3CisjZGVmaW5lIENSMjkJMHgyOQorI2RlZmluZSBDUjJBCTB4MkEKKyNkZWZpbmUgQ1IyQgkweDJCCisjZGVmaW5lIENSMkQJMHgyRAorI2RlZmluZSBDUjJGCTB4MkYKKyNkZWZpbmUgQ1IzNgkweDM2CisjZGVmaW5lIENSMzgJMHgzOAorI2RlZmluZSBDUjM5CTB4MzkKKyNkZWZpbmUgQ1IzQQkweDNBCisjZGVmaW5lIENSNTUJMHg1NQorI2RlZmluZSBDUjU2CTB4NTYKKyNkZWZpbmUgQ1I1NwkweDU3CisjZGVmaW5lIENSNTgJMHg1OAorCisvLworLy8KKy8vCisKKyNkZWZpbmUgR1IwMAkweDAxCisjZGVmaW5lIEdSMDEJMHgwMQorI2RlZmluZSBHUjAyCTB4MDIKKyNkZWZpbmUgR1IwMwkweDAzCisjZGVmaW5lIEdSMDQJMHgwNAorI2RlZmluZSBHUjA1CTB4MDUKKyNkZWZpbmUgR1IwNgkweDA2CisjZGVmaW5lIEdSMDcJMHgwNworI2RlZmluZSBHUjA4CTB4MDgKKyNkZWZpbmUgR1IwRgkweDBGCisjZGVmaW5lIEdSMjAJMHgyMAorI2RlZmluZSBHUjIzCTB4MjMKKyNkZWZpbmUgR1IyRgkweDJGCisjZGVmaW5lIEdSMzAJMHgzMAorI2RlZmluZSBHUjMxCTB4MzEKKyNkZWZpbmUgR1IzMwkweDMzCisjZGVmaW5lIEdSNTIJMHg1MgorI2RlZmluZSBHUjUzCTB4NTMKKyNkZWZpbmUgR1I1RAkweDVkCisKKworLy8KKy8vIEdyYXBoaWNzIEVuZ2luZQorLy8KKyNkZWZpbmUgR0VCYXNlCTB4MjEwMAkJLy8gY291bGQgYmUgbWFwcGVkIGVsc2V3aGVyZSBpZiB3ZSBsaWtlIGl0CisjZGVmaW5lIEdFMDAJKEdFQmFzZSsweDAwKQkvLyBzb3VyY2UgMSwgcCAxMTEKKyNkZWZpbmUgR0UwNAkoR0VCYXNlKzB4MDQpCS8vIHNvdXJjZSAyLCBwIDExMQorI2RlZmluZSBHRTA4CShHRUJhc2UrMHgwOCkJLy8gZGVzdGluYXRpb24gMSwgcCAxMTEKKyNkZWZpbmUgR0UwQwkoR0VCYXNlKzB4MEMpCS8vIGRlc3RpbmF0aW9uIDIsIHAgMTEyCisjZGVmaW5lIEdFMjAJKEdFQmFzZSsweDIwKQkvLyBlbmdpbmUgc3RhdHVzLCBwIDExMworI2RlZmluZSBHRTI0CShHRUJhc2UrMHgyNCkJLy8gcmVzZXQgYWxsIEdFIHBvaW50ZXJzCisjZGVmaW5lIEdFNDQJKEdFQmFzZSsweDQ0KQkvLyBjb21tYW5kIHJlZ2lzdGVyLCBwIDEyNgorI2RlZmluZSBHRTQ4CShHRUJhc2UrMHg0OCkJLy8gcmFzdGVyIG9wZXJhdGlvbiwgcCAxMjcKKyNkZWZpbmUgR0U2MAkoR0VCYXNlKzB4NjApCS8vIGZvcmVncm91bmQgY29sb3IsIHAgMTI4CisjZGVmaW5lIEdFNjQJKEdFQmFzZSsweDY0KQkvLyBiYWNrZ3JvdW5kIGNvbG9yLCBwIDEyOAorI2RlZmluZSBHRTZDCShHRUJhc2UrMHg2QykJLy8gUGF0dGVybiBhbmQgU3R5bGUsIHAgMTI5LCBvaworI2RlZmluZSBHRTlDCShHRUJhc2UrMHg5QykJLy8gcGl4ZWwgZW5naW5lIGRhdGEgcG9ydCwgcCAxMjUKKyNkZWZpbmUgR0VCOAkoR0VCYXNlKzB4QjgpCS8vIERlc3RpbmF0aW9uIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDAsIHAgMTMzCisjZGVmaW5lIEdFQkMJKEdFQmFzZSsweEJDKQkvLyBEZXN0aW5hdGlvbiBTdHJpZGUgLyBCdWZmZXIgQmFzZSAxLCBwIDEzMworI2RlZmluZSBHRUMwCShHRUJhc2UrMHhDMCkJLy8gRGVzdGluYXRpb24gU3RyaWRlIC8gQnVmZmVyIEJhc2UgMiwgcCAxMzMKKyNkZWZpbmUgR0VDNAkoR0VCYXNlKzB4QzQpCS8vIERlc3RpbmF0aW9uIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDMsIHAgMTMzCisjZGVmaW5lIEdFQzgJKEdFQmFzZSsweEM4KQkvLyBTb3VyY2UgU3RyaWRlIC8gQnVmZmVyIEJhc2UgMCwgcCAxMzMKKyNkZWZpbmUgR0VDQwkoR0VCYXNlKzB4Q0MpCS8vIFNvdXJjZSBTdHJpZGUgLyBCdWZmZXIgQmFzZSAxLCBwIDEzMworI2RlZmluZSBHRUQwCShHRUJhc2UrMHhEMCkJLy8gU291cmNlIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDIsIHAgMTMzCisjZGVmaW5lIEdFRDQJKEdFQmFzZSsweEQ0KQkvLyBTb3VyY2UgU3RyaWRlIC8gQnVmZmVyIEJhc2UgMywgcCAxMzMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vcG1hZy1iYS1mYi5oIGIvaW5jbHVkZS92aWRlby9wbWFnLWJhLWZiLmgKaW5kZXggY2ViZWYwNy4uZmNlYjZjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby9wbWFnLWJhLWZiLmgKKysrIGIvaW5jbHVkZS92aWRlby9wbWFnLWJhLWZiLmgKQEAgLTEsMjQgKzEsMjcgQEAKIC8qCi0gKiAgICAgIGxpbnV4L2RyaXZlcnMvdmlkZW8vcG1hZy1iYS1mYi5oCisgKglsaW51eC9pbmNsdWRlL3ZpZGVvL3BtYWctYmEtZmIuaAogICoKLSAqICAgICAgVHVyYm9DaGFubmVsIFBNQUctQkEgZnJhbWVidWZmZXIgY2FyZCBzdXBwb3J0LAotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxIGJ5Ci0gKiAgICAgIE1pY2hhZWwgRW5nZWwgPGVuZ2VsQHVuaXgtYWcub3JnPiwKLSAqICAgICAgS2Fyc3RlbiBNZXJrZXIgPG1lcmtlckBsaW51eHRhZy5vcmc+Ci0gKiAgICAgIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKLSAqICAgICAgUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcwotICogICAgICBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKglUVVJCT2NoYW5uZWwgUE1BRy1CQSBDb2xvciBGcmFtZSBCdWZmZXIgKENGQikgY2FyZCBzdXBwb3J0LAorICoJQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxIGJ5CisgKglNaWNoYWVsIEVuZ2VsIDxlbmdlbEB1bml4LWFnLm9yZz4sCisgKglLYXJzdGVuIE1lcmtlciA8bWVya2VyQGxpbnV4dGFnLm9yZz4KKyAqCUNvcHlyaWdodCAoYykgMjAwNSAgTWFjaWVqIFcuIFJvenlja2kKKyAqCisgKglUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKglQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzCisgKglhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotLyoKLSAqIEJ0NDU5IFJBTSBEQUMgcmVnaXN0ZXIgYmFzZSBvZmZzZXQgKHJlbC4gdG8gVEMgc2xvdCBiYXNlIGFkZHJlc3MpCi0gKi8KKy8qIElPbWVtIHJlc291cmNlIG9mZnNldHMuICAqLworI2RlZmluZSBQTUFHX0JBX0ZCTUVNCQkweDAwMDAwMAkvKiBmcmFtZSBidWZmZXIgKi8KKyNkZWZpbmUgUE1BR19CQV9CVDQ1OQkJMHgyMDAwMDAJLyogQnQ0NTkgUkFNREFDICovCisjZGVmaW5lIFBNQUdfQkFfSVJRCQkweDMwMDAwMAkvKiBJUlEgYWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUgUE1BR19CQV9ST00JCTB4MzgwMDAwCS8qIFJFWCBvcHRpb24gUk9NICovCisjZGVmaW5lIFBNQUdfQkFfQlQ0MzgJCTB4MzgwMDAwCS8qIEJ0NDM4IGNsb2NrIGNoaXAgcmVzZXQgKi8KKyNkZWZpbmUgUE1BR19CQV9TSVpFCQkweDQwMDAwMAkvKiBhZGRyZXNzIHNwYWNlIHNpemUgKi8KIAotI2RlZmluZSBQTUFHX0JBX0JUNDU5X09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAotCi0vKgotICogQmVnaW4gb2YgUE1BRy1CQSBmcmFtZWJ1ZmZlciBtZW1vcnkgcmVsYXRpdmUgdG8gVEMgc2xvdCBhZGRyZXNzLAotICogcmVzb2x1dGlvbiBpcyAxMDI0eDg2NHg4Ci0gKi8KLQotI2RlZmluZSBQTUFHX0JBX09OQk9BUkRfRkJNRU1fT0ZGU0VUICAgIDB4MDAwMDAwMDAKKy8qIEJ0NDU5IHJlZ2lzdGVyIG9mZnNldHMsIGJ5dGUtd2lkZSByZWdpc3RlcnMuICAqLworI2RlZmluZSBCVDQ1OV9BRERSX0xPCQkweDAJCS8qIGFkZHJlc3MgbG93ICovCisjZGVmaW5lIEJUNDU5X0FERFJfSEkJCTB4NAkJLyogYWRkcmVzcyBoaWdoICovCisjZGVmaW5lIEJUNDU5X0RBVEEJCTB4OAkJLyogZGF0YSB3aW5kb3cgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQlQ0NTlfQ01BUAkJMHhjCQkvKiBjb2xvciBtYXAgd2luZG93IHJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3BtYWdiLWItZmIuaCBiL2luY2x1ZGUvdmlkZW8vcG1hZ2ItYi1mYi5oCmluZGV4IDg3YjgxYTUuLjc1MzliOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vcG1hZ2ItYi1mYi5oCisrKyBiL2luY2x1ZGUvdmlkZW8vcG1hZ2ItYi1mYi5oCkBAIC0xLDMyICsxLDU4IEBACiAvKgotICogICAgICBsaW51eC9kcml2ZXJzL3ZpZGVvL3BtYWdiLWItZmIuaAorICoJbGludXgvaW5jbHVkZS92aWRlby9wbWFnYi1iLWZiLmgKICAqCi0gKiAgICAgIFR1cmJvQ2hhbm5lbCBQTUFHQi1CIGZyYW1lYnVmZmVyIGNhcmQgc3VwcG9ydCwKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxIGJ5Ci0gKiAgICAgIE1pY2hhZWwgRW5nZWwgPGVuZ2VsQHVuaXgtYWcub3JnPiBhbmQgCi0gKiAgICAgIEthcnN0ZW4gTWVya2VyIDxtZXJrZXJAbGludXh0YWcub3JnPgotICogICAgICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCi0gKiAgICAgIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKLSAqICAgICAgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoJVFVSQk9jaGFubmVsIFBNQUdCLUIgU21hcnQgRnJhbWUgQnVmZmVyIChTRkIpIGNhcmQgc3VwcG9ydCwKKyAqCUNvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSBieQorICoJTWljaGFlbCBFbmdlbCA8ZW5nZWxAdW5peC1hZy5vcmc+IGFuZAorICoJS2Fyc3RlbiBNZXJrZXIgPG1lcmtlckBsaW51eHRhZy5vcmc+CisgKglDb3B5cmlnaHQgKGMpIDIwMDUgIE1hY2llaiBXLiBSb3p5Y2tpCisgKgorICoJVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICoJUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcworICoJYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKKy8qIElPbWVtIHJlc291cmNlIG9mZnNldHMuICAqLworI2RlZmluZSBQTUFHQl9CX1JPTQkJMHgwMDAwMDAJLyogUkVYIG9wdGlvbiBST00gKi8KKyNkZWZpbmUgUE1BR0JfQl9TRkIJCTB4MTAwMDAwCS8qIFNGQiBBU0lDICovCisjZGVmaW5lIFBNQUdCX0JfR1AwCQkweDE0MDAwMAkvKiBnZW5lcmFsIHB1cnBvc2Ugb3V0cHV0IDAgKi8KKyNkZWZpbmUgUE1BR0JfQl9HUDEJCTB4MTgwMDAwCS8qIGdlbmVyYWwgcHVycG9zZSBvdXRwdXQgMSAqLworI2RlZmluZSBQTUFHQl9CX0JUNDU5CQkweDFjMDAwMAkvKiBCdDQ1OSBSQU1EQUMgKi8KKyNkZWZpbmUgUE1BR0JfQl9GQk1FTQkJMHgyMDAwMDAJLyogZnJhbWUgYnVmZmVyICovCisjZGVmaW5lIFBNQUdCX0JfU0laRQkJMHg0MDAwMDAJLyogYWRkcmVzcyBzcGFjZSBzaXplICovCiAKLS8qCi0gKiBCdDQ1OSBSQU0gREFDIHJlZ2lzdGVyIGJhc2Ugb2Zmc2V0IChyZWwuIHRvIFRDIHNsb3QgYmFzZSBhZGRyZXNzKQotICovCi0jZGVmaW5lIFBNQUdCX0JfQlQ0NTlfT0ZGU0VUCQkJMHgwMDFDMDAwMAorLyogSU9tZW0gcmVnaXN0ZXIgb2Zmc2V0cy4gICovCisjZGVmaW5lIFNGQl9SRUdfVklEX0hPUgkJMHg2NAkJLyogdmlkZW8gaG9yaXpvbnRhbCBzZXR1cCAqLworI2RlZmluZSBTRkJfUkVHX1ZJRF9WRVIJCTB4NjgJCS8qIHZpZGVvIHZlcnRpY2FsIHNldHVwICovCisjZGVmaW5lIFNGQl9SRUdfVklEX0JBU0UJMHg2YwkJLyogdmlkZW8gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFNGQl9SRUdfVENDTEtfQ09VTlQJMHg3OAkJLyogVFVSQk9jaGFubmVsIGNsb2NrIGNvdW50ICovCisjZGVmaW5lIFNGQl9SRUdfVklEQ0xLX0NPVU5UCTB4N2MJCS8qIHZpZGVvIGNsb2NrIGNvdW50ICovCiAKLS8qCi0gKiBCZWdpbiBvZiBQTUFHQi1CIGZyYW1lYnVmZmVyIG1lbW9yeSwgcmVzb2x1dGlvbiBpcyBjb25maWd1cmFibGU6Ci0gKiAxMDI0eDg2NHg4IG9yIDEyODB4MTAyNHg4LCBzZXR0YWJsZSBieSBqdW1wZXIgb24gdGhlIGNhcmQKLSAqLwotI2RlZmluZSBQTUFHQl9CX09OQk9BUkRfRkJNRU1fT0ZGU0VUCTB4MDAyMDEwMDAKKy8qIFZpZGVvIGhvcml6b250YWwgc2V0dXAgcmVnaXN0ZXIgY29uc3RhbnRzLiAgQWxsIGJpdHMgYXJlIHIvdy4gICovCisjZGVmaW5lIFNGQl9WSURfSE9SX0JQX1NISUZUCTB4MTUJCS8qIGJhY2sgcG9yY2ggKi8KKyNkZWZpbmUgU0ZCX1ZJRF9IT1JfQlBfTUFTSwkweDdmCisjZGVmaW5lIFNGQl9WSURfSE9SX1NZTl9TSElGVAkweDBlCQkvKiBzeW5jIHB1bHNlICovCisjZGVmaW5lIFNGQl9WSURfSE9SX1NZTl9NQVNLCTB4N2YKKyNkZWZpbmUgU0ZCX1ZJRF9IT1JfRlBfU0hJRlQJMHgwOQkJLyogZnJvbnQgcG9yY2ggKi8KKyNkZWZpbmUgU0ZCX1ZJRF9IT1JfRlBfTUFTSwkweDFmCisjZGVmaW5lIFNGQl9WSURfSE9SX1BJWF9TSElGVAkweDAwCQkvKiBhY3RpdmUgdmlkZW8gKi8KKyNkZWZpbmUgU0ZCX1ZJRF9IT1JfUElYX01BU0sJMHgxZmYKIAotLyoKLSAqIEJ0NDU5IHJlZ2lzdGVyIG9mZnNldHMsIGJ5dGUtd2lkZSByZWdpc3RlcnMKLSAqLworLyogVmlkZW8gdmVydGljYWwgc2V0dXAgcmVnaXN0ZXIgY29uc3RhbnRzLiAgQWxsIGJpdHMgYXJlIHIvdy4gICovCisjZGVmaW5lIFNGQl9WSURfVkVSX0JQX1NISUZUCTB4MTYJCS8qIGJhY2sgcG9yY2ggKi8KKyNkZWZpbmUgU0ZCX1ZJRF9WRVJfQlBfTUFTSwkweDNmCisjZGVmaW5lIFNGQl9WSURfVkVSX1NZTl9TSElGVAkweDEwCQkvKiBzeW5jIHB1bHNlICovCisjZGVmaW5lIFNGQl9WSURfVkVSX1NZTl9NQVNLCTB4M2YKKyNkZWZpbmUgU0ZCX1ZJRF9WRVJfRlBfU0hJRlQJMHgwYgkJLyogZnJvbnQgcG9yY2ggKi8KKyNkZWZpbmUgU0ZCX1ZJRF9WRVJfRlBfTUFTSwkweDFmCisjZGVmaW5lIFNGQl9WSURfVkVSX1NMX1NISUZUCTB4MDAJCS8qIGFjdGl2ZSBzY2FuIGxpbmVzICovCisjZGVmaW5lIFNGQl9WSURfVkVSX1NMX01BU0sJMHg3ZmYKIAotI2RlZmluZSBCVDQ1OV9BRFJfTE9XCQkJQlQ0NTlfT0ZGU0VUICsgMHgwMAkvKiBhZGRyLiBsb3cgKi8KLSNkZWZpbmUgQlQ0NTlfQURSX0hJR0gJCQlCVDQ1OV9PRkZTRVQgKyAweDA0CS8qIGFkZHIuIGhpZ2ggKi8KLSNkZWZpbmUgQlQ0NTlfREFUQQkJCUJUNDU5X09GRlNFVCArIDB4MDgJLyogci93IGRhdGEgKi8KLSNkZWZpbmUgQlQ0NTlfQ01BUAkJCUJUNDU5X09GRlNFVCArIDB4MEMJLyogY29sb3IgbWFwICovCisvKiBWaWRlbyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgY29uc3RhbnRzLiAgQWxsIGJpdHMgYXJlIHIvdy4gICovCisjZGVmaW5lIFNGQl9WSURfQkFTRV9NQVNLCTB4MWZmCQkvKiB2aWRlbyBiYXNlIHJvdyBhZGRyZXNzICovCisKKy8qIEJ0NDU5IHJlZ2lzdGVyIG9mZnNldHMsIGJ5dGUtd2lkZSByZWdpc3RlcnMuICAqLworI2RlZmluZSBCVDQ1OV9BRERSX0xPCQkweDAJCS8qIGFkZHJlc3MgbG93ICovCisjZGVmaW5lIEJUNDU5X0FERFJfSEkJCTB4NAkJLyogYWRkcmVzcyBoaWdoICovCisjZGVmaW5lIEJUNDU5X0RBVEEJCTB4OAkJLyogZGF0YSB3aW5kb3cgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQlQ0NTlfQ01BUAkJMHhjCQkvKiBjb2xvciBtYXAgd2luZG93IHJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3Npc2ZiLmggYi9pbmNsdWRlL3ZpZGVvL3Npc2ZiLmgKaW5kZXggMTM2YmY3OS4uZTQwMmViNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby9zaXNmYi5oCisrKyBiL2luY2x1ZGUvdmlkZW8vc2lzZmIuaApAQCAtMSw1ICsxLDcgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEuCisgKiBzaXNmYi5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBTaVMgZnJhbWVidWZmZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTYsOCArMTgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCiAgKi8KIAotI2lmbmRlZiBfTElOVVhfU0lTRkIKLSNkZWZpbmUgX0xJTlVYX1NJU0ZCCisjaWZuZGVmIF9MSU5VWF9TSVNGQl9IXworI2RlZmluZSBfTElOVVhfU0lTRkJfSF8KIAogI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgpAQCAtMjYsNDcgKzI4LDM1IEBACiAvKiAgICAgICAgICAgICAgICAgICBQVUJMSUMgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiB2YmZsYWdzICovCi0jZGVmaW5lIENSVDJfREVGQVVMVCAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQ1JUMl9MQ0QgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgLyogVFc6IE5ldmVyIGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIENSVDJfWFhYIGVudHJpZXMgKi8KLSNkZWZpbmUgQ1JUMl9UViAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgLyogICAgIChzZWUgU0lTQ3ljbGVDUlQyVHlwZSgpKSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1JUMl9WR0EgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBUVl9OVFNDICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIFRWX1BBTCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgVFZfSElWSVNJT04gICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBUVl9ZUEJQUiAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIFRWX0FWSURFTyAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgVFZfU1ZJREVPICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBUVl9TQ0FSVCAgICAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIFZCX0NPTkVYQU5UCQkweDAwMDAwODAwCS8qIDY2MSBzZXJpZXMgb25seSAqLwotI2RlZmluZSBWQl9UUlVNUElPTgkJVkJfQ09ORVhBTlQJLyogMzAwIHNlcmllcyBvbmx5ICovCi0jZGVmaW5lIFRWX1BBTE0gICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgVFZfUEFMTiAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorLyogdmJmbGFncywgcHVibGljIChvdGhlcnMgaW4gc2lzLmgpICovCisjZGVmaW5lIENSVDJfREVGQVVMVAkJMHgwMDAwMDAwMQorI2RlZmluZSBDUlQyX0xDRAkJMHgwMDAwMDAwMgorI2RlZmluZSBDUlQyX1RWCQkJMHgwMDAwMDAwNAorI2RlZmluZSBDUlQyX1ZHQQkJMHgwMDAwMDAwOAorI2RlZmluZSBUVl9OVFNDCQkJMHgwMDAwMDAxMAorI2RlZmluZSBUVl9QQUwJCQkweDAwMDAwMDIwCisjZGVmaW5lIFRWX0hJVklTSU9OCQkweDAwMDAwMDQwCisjZGVmaW5lIFRWX1lQQlBSCQkweDAwMDAwMDgwCisjZGVmaW5lIFRWX0FWSURFTwkJMHgwMDAwMDEwMAorI2RlZmluZSBUVl9TVklERU8JCTB4MDAwMDAyMDAKKyNkZWZpbmUgVFZfU0NBUlQJCTB4MDAwMDA0MDAKKyNkZWZpbmUgVFZfUEFMTQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgVFZfUEFMTgkJCTB4MDAwMDIwMDAKICNkZWZpbmUgVFZfTlRTQ0oJCTB4MDAwMDEwMDAKLSNkZWZpbmUgVkJfMzAyRUxWCQkweDAwMDA0MDAwCi0jZGVmaW5lIFRWX0NIU0NBUlQgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgVFZfQ0hZUEJQUjUyNUkgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBUVl9DSFNDQVJUCQkweDAwMDA4MDAwCisjZGVmaW5lIFRWX0NIWVBCUFI1MjVJCQkweDAwMDEwMDAwCiAjZGVmaW5lIENSVDFfVkdBCQkweDAwMDAwMDAwCiAjZGVmaW5lIENSVDFfTENEQQkJMHgwMDAyMDAwMAogI2RlZmluZSBWR0EyX0NPTk5FQ1RFRCAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIFZCX0RJU1BUWVBFX0NSVDEJMHgwMDA4MDAwMCAgCS8qIENSVDEgY29ubmVjdGVkIGFuZCB1c2VkICovCi0jZGVmaW5lIFZCXzMwMSAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAJLyogVmlkZW8gYnJpZGdlIHR5cGUgKi8KLSNkZWZpbmUgVkJfMzAxQiAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBWQl8zMDJCICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCi0jZGVmaW5lIFZCXzMweEJESAkJMHgwMDgwMDAwMCAgICAgIC8qIDMweEIgREggdmVyc2lvbiAody9vIExDRCBzdXBwb3J0KSAqLwotI2RlZmluZSBWQl9MVkRTICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIFZCX0NIUk9OVEVMICAgICAgICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgVkJfMzAxTFYgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAotI2RlZmluZSBWQl8zMDJMViAgICAgICAgICAgICAgICAweDA4MDAwMDAwCi0jZGVmaW5lIFZCXzMwMUMJCQkweDEwMDAwMDAwCi0jZGVmaW5lIFZCX1NJTkdMRV9NT0RFICAgICAgICAgIDB4MjAwMDAwMDAgICAJLyogQ1JUMSBvciBDUlQyOyBkZXRlcm1pbmVkIGJ5IERJU1BUWVBFX0NSVHggKi8KLSNkZWZpbmUgVkJfTUlSUk9SX01PREUJCTB4NDAwMDAwMDAgICAJLyogQ1JUMSArIENSVDIgaWRlbnRpY2FsIChtaXJyb3IgbW9kZSkgKi8KLSNkZWZpbmUgVkJfRFVBTFZJRVdfTU9ERQkweDgwMDAwMDAwICAgCS8qIENSVDEgKyBDUlQyIGluZGVwZW5kZW50IChkdWFsIGhlYWQgbW9kZSkgKi8KKyNkZWZpbmUgVkJfRElTUFRZUEVfQ1JUMQkweDAwMDgwMDAwCS8qIENSVDEgY29ubmVjdGVkIGFuZCB1c2VkICovCisjZGVmaW5lIFZCX1NJTkdMRV9NT0RFCQkweDIwMDAwMDAwCS8qIENSVDEgb3IgQ1JUMjsgZGV0ZXJtaW5lZCBieSBESVNQVFlQRV9DUlR4ICovCisjZGVmaW5lIFZCX01JUlJPUl9NT0RFCQkweDQwMDAwMDAwCS8qIENSVDEgKyBDUlQyIGlkZW50aWNhbCAobWlycm9yIG1vZGUpICovCisjZGVmaW5lIFZCX0RVQUxWSUVXX01PREUJMHg4MDAwMDAwMAkvKiBDUlQxICsgQ1JUMiBpbmRlcGVuZGVudCAoZHVhbCBoZWFkIG1vZGUpICovCiAKIC8qIEFsaWFzZXM6ICovCiAjZGVmaW5lIENSVDJfRU5BQkxFCQkoQ1JUMl9MQ0QgfCBDUlQyX1RWIHwgQ1JUMl9WR0EpCi0jZGVmaW5lIFRWX1NUQU5EQVJEICAgICAgICAgICAgIChUVl9OVFNDIHwgVFZfUEFMIHwgVFZfUEFMTSB8IFRWX1BBTE4gfCBUVl9OVFNDSikKLSNkZWZpbmUgVFZfSU5URVJGQUNFICAgICAgICAgICAgKFRWX0FWSURFT3xUVl9TVklERU98VFZfU0NBUlR8VFZfSElWSVNJT058VFZfWVBCUFJ8VFZfQ0hTQ0FSVHxUVl9DSFlQQlBSNTI1SSkKKyNkZWZpbmUgVFZfU1RBTkRBUkQJCShUVl9OVFNDIHwgVFZfUEFMIHwgVFZfUEFMTSB8IFRWX1BBTE4gfCBUVl9OVFNDSikKKyNkZWZpbmUgVFZfSU5URVJGQUNFCQkoVFZfQVZJREVPfFRWX1NWSURFT3xUVl9TQ0FSVHxUVl9ISVZJU0lPTnxUVl9ZUEJQUnxUVl9DSFNDQVJUfFRWX0NIWVBCUFI1MjVJKQogCiAvKiBPbmx5IGlmIFRWX1lQQlBSIGlzIHNldDogKi8KICNkZWZpbmUgVFZfWVBCUFI1MjVJCQlUVl9OVFNDCkBAIC03NSw4OSArNjUsMTE4IEBACiAjZGVmaW5lIFRWX1lQQlBSMTA4MEkJCVRWX1BBTE4KICNkZWZpbmUgVFZfWVBCUFJBTEwgCQkoVFZfWVBCUFI1MjVJIHwgVFZfWVBCUFI1MjVQIHwgVFZfWVBCUFI3NTBQIHwgVFZfWVBCUFIxMDgwSSkKIAotI2RlZmluZSBWQl9TSVNCUklER0UgICAgICAgICAgICAoVkJfMzAxfFZCXzMwMUJ8VkJfMzAxQ3xWQl8zMDJCfFZCXzMwMUxWfFZCXzMwMkxWfFZCXzMwMkVMVikKLSNkZWZpbmUgVkJfU0lTVFZCUklER0UgICAgICAgICAgKFZCXzMwMXxWQl8zMDFCfFZCXzMwMUN8VkJfMzAyQnxWQl8zMDFMVnxWQl8zMDJMVikKLSNkZWZpbmUgVkJfVklERU9CUklER0UJCShWQl9TSVNCUklER0UgfCBWQl9MVkRTIHwgVkJfQ0hST05URUwgfCBWQl9DT05FWEFOVCkKLQogI2RlZmluZSBWQl9ESVNQVFlQRV9ESVNQMglDUlQyX0VOQUJMRQogI2RlZmluZSBWQl9ESVNQVFlQRV9DUlQyCUNSVDJfRU5BQkxFCiAjZGVmaW5lIFZCX0RJU1BUWVBFX0RJU1AxCVZCX0RJU1BUWVBFX0NSVDEKICNkZWZpbmUgVkJfRElTUE1PREVfU0lOR0xFCVZCX1NJTkdMRV9NT0RFCiAjZGVmaW5lIFZCX0RJU1BNT0RFX01JUlJPUglWQl9NSVJST1JfTU9ERQogI2RlZmluZSBWQl9ESVNQTU9ERV9EVUFMCVZCX0RVQUxWSUVXX01PREUKLSNkZWZpbmUgVkJfRElTUExBWV9NT0RFICAgICAgIAkoU0lOR0xFX01PREUgfCBNSVJST1JfTU9ERSB8IERVQUxWSUVXX01PREUpCisjZGVmaW5lIFZCX0RJU1BMQVlfTU9ERQkJKFNJTkdMRV9NT0RFIHwgTUlSUk9SX01PREUgfCBEVUFMVklFV19NT0RFKQogCiAvKiBTdHJ1Y3R1cmUgYXJndW1lbnQgZm9yIFNJU0ZCX0dFVF9JTkZPIGlvY3RsICAqLwotdHlwZWRlZiBzdHJ1Y3QgX1NJU0ZCX0lORk8gc2lzZmJfaW5mbywgKnBzaXNmYl9pbmZvOwotCi1zdHJ1Y3QgX1NJU0ZCX0lORk8gewotCV9fdTMyICAgc2lzZmJfaWQ7ICAgICAgICAgCS8qIGZvciBpZGVudGlmeWluZyBzaXNmYiAqLworc3RydWN0IHNpc2ZiX2luZm8geworCV9fdTMyCXNpc2ZiX2lkOwkJLyogZm9yIGlkZW50aWZ5aW5nIHNpc2ZiICovCiAjaWZuZGVmIFNJU0ZCX0lECiAjZGVmaW5lIFNJU0ZCX0lECSAgMHg1MzQ5NTM0NiAgICAvKiBJZGVudGlmeSBteXNlbGYgd2l0aCAnU0lTRicgKi8KICNlbmRpZgotIAlfX3UzMiAgIGNoaXBfaWQ7CQkvKiBQQ0ktSUQgb2YgZGV0ZWN0ZWQgY2hpcCAqLwotCV9fdTMyICAgbWVtb3J5OwkJCS8qIHZpZGVvIG1lbW9yeSBpbiBLQiB3aGljaCBzaXNmYiBtYW5hZ2VzICovCi0JX191MzIgICBoZWFwc3RhcnQ7ICAgICAgICAgICAgCS8qIGhlYXAgc3RhcnQgKD0gc2lzZmIgIm1lbSIgYXJndW1lbnQpIGluIEtCICovCisJX191MzIgICBjaGlwX2lkOwkJLyogUENJLUlEIG9mIGRldGVjdGVkIGNoaXAgKi8KKwlfX3UzMiAgIG1lbW9yeTsJCQkvKiB0b3RhbCB2aWRlbyBtZW1vcnkgaW4gS0IgKi8KKwlfX3UzMiAgIGhlYXBzdGFydDsJCS8qIGhlYXAgc3RhcnQgb2Zmc2V0IGluIEtCICovCiAJX191OCAgICBmYnZpZG1vZGU7CQkvKiBjdXJyZW50IHNpc2ZiIG1vZGUgKi8KIAotCV9fdTggICAgc2lzZmJfdmVyc2lvbjsKLQlfX3U4ICAgIHNpc2ZiX3JldmlzaW9uOwotCV9fdTggCXNpc2ZiX3BhdGNobGV2ZWw7CisJX191OAlzaXNmYl92ZXJzaW9uOworCV9fdTgJc2lzZmJfcmV2aXNpb247CisJX191OAlzaXNmYl9wYXRjaGxldmVsOwogCi0JX191OCAJc2lzZmJfY2FwczsJCS8qIHNpc2ZiIGNhcGFiaWxpdGllcyAqLworCV9fdTgJc2lzZmJfY2FwczsJCS8qIHNpc2ZiIGNhcGFiaWxpdGllcyAqLwogCiAJX191MzIJc2lzZmJfdHFsZW47CQkvKiB0dXJibyBxdWV1ZSBsZW5ndGggKGluIEtCKSAqLwogCi0JX191MzIgCXNpc2ZiX3BjaWJ1czsgICAgICAJLyogVGhlIGNhcmQncyBQQ0kgSUQgKi8KLQlfX3UzMiAJc2lzZmJfcGNpc2xvdDsKLQlfX3UzMiAJc2lzZmJfcGNpZnVuYzsKKwlfX3UzMglzaXNmYl9wY2lidXM7CQkvKiBUaGUgY2FyZCdzIFBDSSBJRCAqLworCV9fdTMyCXNpc2ZiX3BjaXNsb3Q7CisJX191MzIJc2lzZmJfcGNpZnVuYzsKIAotCV9fdTggCXNpc2ZiX2xjZHBkYzsJCS8qIFBhbmVsRGVsYXlDb21wZW5zYXRpb24gKi8KKwlfX3U4CXNpc2ZiX2xjZHBkYzsJCS8qIFBhbmVsRGVsYXlDb21wZW5zYXRpb24gKi8KIAotCV9fdTggCXNpc2ZiX2xjZGE7CQkvKiBEZXRlY3RlZCBzdGF0dXMgb2YgTENEQSBmb3IgbG93IHJlcy90ZXh0IG1vZGVzICovCisJX191OAlzaXNmYl9sY2RhOwkJLyogRGV0ZWN0ZWQgc3RhdHVzIG9mIExDREEgZm9yIGxvdyByZXMvdGV4dCBtb2RlcyAqLwogCi0JX191MzIgCXNpc2ZiX3ZiZmxhZ3M7Ci0JX191MzIgCXNpc2ZiX2N1cnJlbnR2YmZsYWdzOworCV9fdTMyCXNpc2ZiX3ZiZmxhZ3M7CisJX191MzIJc2lzZmJfY3VycmVudHZiZmxhZ3M7CiAKLQlfX3UzMiAJc2lzZmJfc2NhbGVsY2Q7Ci0JX191MzIgCXNpc2ZiX3NwZWNpYWx0aW1pbmc7CisJX191MzIJc2lzZmJfc2NhbGVsY2Q7CisJX191MzIJc2lzZmJfc3BlY2lhbHRpbWluZzsKIAotCV9fdTggCXNpc2ZiX2hhdmVlbWk7Ci0JX191OCAJc2lzZmJfZW1pMzAsc2lzZmJfZW1pMzEsc2lzZmJfZW1pMzIsc2lzZmJfZW1pMzM7Ci0JX191OCAJc2lzZmJfaGF2ZWVtaWxjZDsKKwlfX3U4CXNpc2ZiX2hhdmVlbWk7CisJX191OAlzaXNmYl9lbWkzMCxzaXNmYl9lbWkzMSxzaXNmYl9lbWkzMixzaXNmYl9lbWkzMzsKKwlfX3U4CXNpc2ZiX2hhdmVlbWlsY2Q7CiAKLQlfX3U4IAlzaXNmYl9sY2RwZGNhOwkJLyogUGFuZWxEZWxheUNvbXBlbnNhdGlvbiBmb3IgTENELXZpYS1DUlQxICovCisJX191OAlzaXNmYl9sY2RwZGNhOwkJLyogUGFuZWxEZWxheUNvbXBlbnNhdGlvbiBmb3IgTENELXZpYS1DUlQxICovCiAKLQlfX3UxNglzaXNmYl90dnhwb3MsIHNpc2ZiX3R2eXBvczsgIC8qIFdhcm5pbmc6IFZhbHVlcyArIDMyICEgKi8KKwlfX3UxNglzaXNmYl90dnhwb3MsIHNpc2ZiX3R2eXBvczsJLyogV2FybmluZzogVmFsdWVzICsgMzIgISAqLwogCi0JX191OCAJcmVzZXJ2ZWRbMjA4XTsgCQkvKiBmb3IgZnV0dXJlIHVzZSAqLworCV9fdTMyCXNpc2ZiX2hlYXBzaXplOwkJLyogaGVhcCBzaXplIChpbiBLQikgKi8KKwlfX3UzMglzaXNmYl92aWRlb29mZnNldDsJLyogT2Zmc2V0IG9mIHZpZXdwb3J0IGluIHZpZGVvIG1lbW9yeSAoaW4gYnl0ZXMpICovCisKKwlfX3UzMglzaXNmYl9jdXJmc3RuOwkJLyogY3VycmVudGx5IHJ1bm5pbmcgRlNUTi9EU1ROIG1vZGUgKi8KKwlfX3UzMglzaXNmYl9jdXJkc3RuOworCisJX191MTYJc2lzZmJfcGNpX3ZlbmRvcjsJLyogUENJIHZlbmRvciAoU2lTIG9yIFhHSSkgKi8KKworCV9fdTMyCXNpc2ZiX3ZiZmxhZ3MyOwkJLyogaXZpZGVvLT52YmZsYWdzMiAqLworCisJX191OAlzaXNmYl9jYW5fcG9zdDsJCS8qIHNpc2ZiIGNhbiBQT1NUIHRoaXMgY2FyZCAqLworCV9fdTgJc2lzZmJfY2FyZF9wb3N0ZWQ7CS8qIGNhcmQgaXMgUE9TVEVEICovCisJX191OAlzaXNmYl93YXNfYm9vdF9kZXZpY2U7CS8qIFRoaXMgY2FyZCB3YXMgdGhlIGJvb3QgdmlkZW8gZGV2aWNlIChpZSBpcyBwcmltYXJ5KSAqLworCisJX191OAlyZXNlcnZlZFsxODNdOwkJLyogZm9yIGZ1dHVyZSB1c2UgKi8KK307CisKKyNkZWZpbmUgU0lTRkJfQ01EX0dFVFZCRkxBR1MJMHg1NUFBMDAwMQkvKiBubyBhcmc7IHJlc3VsdFsxXSA9IHZiZmxhZ3MgKi8KKyNkZWZpbmUgU0lTRkJfQ01EX1NXSVRDSENSVDEJMHg1NUFBMDAxMAkvKiBhcmdbMF06IDk5ID0gcXVlcnksIDAgPSBvZmYsIDEgPSBvbiAqLworLyogbW9yZSB0byBjb21lICovCisKKyNkZWZpbmUgU0lTRkJfQ01EX0VSUl9PSwkweDgwMDAwMDAwCS8qIGNvbW1hbmQgc3VjY2VlZGVkICovCisjZGVmaW5lIFNJU0ZCX0NNRF9FUlJfTE9DS0VECTB4ODAwMDAwMDEJLyogc2lzZmIgaXMgbG9ja2VkICovCisjZGVmaW5lIFNJU0ZCX0NNRF9FUlJfRUFSTFkJMHg4MDAwMDAwMgkvKiByZXF1ZXN0IGJlZm9yZSBzaXNmYiB0b29rIG92ZXIgZ2Z4IHN5c3RlbSAqLworI2RlZmluZSBTSVNGQl9DTURfRVJSX05PVkIJMHg4MDAwMDAwMwkvKiBObyB2aWRlbyBicmlkZ2UgKi8KKyNkZWZpbmUgU0lTRkJfQ01EX0VSUl9OT0NSVDIJMHg4MDAwMDAwNAkvKiBjYW4ndCBjaGFuZ2UgQ1JUMSBzdGF0dXMsIENSVDIgZGlzYWJsZWQgKi8KKy8qIG1vcmUgdG8gY29tZSAqLworI2RlZmluZSBTSVNGQl9DTURfRVJSX1VOS05PV04gICAweDgwMDBmZmZmCS8qIFVua25vd24gY29tbWFuZCAqLworI2RlZmluZSBTSVNGQl9DTURfRVJSX09USEVSCTB4ODAwMTAwMDAJLyogT3RoZXIgZXJyb3IgKi8KKworLyogQXJndW1lbnQgZm9yIFNJU0ZCX0NNRCBpb2N0bCAqLworc3RydWN0IHNpc2ZiX2NtZCB7CisJX191MzIgIHNpc2ZiX2NtZDsKKwlfX3UzMiAgc2lzZmJfYXJnWzE2XTsKKwlfX3UzMiAgc2lzZmJfcmVzdWx0WzRdOwogfTsKIAogLyogQWRkdGlvbmFsIElPQ1RMcyBmb3IgY29tbXVuaWNhdGlvbiBzaXNmYiA8PiBYIGRyaXZlciAgICAgICAgICAgICAgICAqLwogLyogSWYgY2hhbmdpbmcgdGhpcywgdmdhdHlwZXMuaCBtdXN0IGFsc28gYmUgY2hhbmdlZCAoZm9yIFggZHJpdmVyKSAgICAqLwogCiAvKiBpb2N0bCBmb3IgaWRlbnRpZnlpbmcgYW5kIGdpdmluZyBzb21lIGluZm8gKGVzcC4gbWVtb3J5IGhlYXAgc3RhcnQpICovCi0jZGVmaW5lIFNJU0ZCX0dFVF9JTkZPX1NJWkUgIAlfSU9SKDB4RjMsMHgwMCxfX3UzMikKLSNkZWZpbmUgU0lTRkJfR0VUX0lORk8JICAJX0lPUigweEYzLDB4MDEsc3RydWN0IF9TSVNGQl9JTkZPKQorI2RlZmluZSBTSVNGQl9HRVRfSU5GT19TSVpFCV9JT1IoMHhGMywweDAwLF9fdTMyKQorI2RlZmluZSBTSVNGQl9HRVRfSU5GTwkJX0lPUigweEYzLDB4MDEsc3RydWN0IHNpc2ZiX2luZm8pCiAKIC8qIGlvY3RybCB0byBnZXQgY3VycmVudCB2ZXJ0aWNhbCByZXRyYWNlIHN0YXR1cyAqLwotI2RlZmluZSBTSVNGQl9HRVRfVkJSU1RBVFVTICAJX0lPUigweEYzLDB4MDIsX191MzIpCisjZGVmaW5lIFNJU0ZCX0dFVF9WQlJTVEFUVVMJX0lPUigweEYzLDB4MDIsX191MzIpCiAKIC8qIGlvY3RsIHRvIGVuYWJsZS9kaXNhYmxlIHBhbm5pbmcgYXV0by1tYXhpbWl6ZSAobGlrZSBub21heCBwYXJhbWV0ZXIpICovCi0jZGVmaW5lIFNJU0ZCX0dFVF9BVVRPTUFYSU1JWkUgCV9JT1IoMHhGMywweDAzLF9fdTMyKQotI2RlZmluZSBTSVNGQl9TRVRfQVVUT01BWElNSVpFIAlfSU9XKDB4RjMsMHgwMyxfX3UzMikKKyNkZWZpbmUgU0lTRkJfR0VUX0FVVE9NQVhJTUlaRQlfSU9SKDB4RjMsMHgwMyxfX3UzMikKKyNkZWZpbmUgU0lTRkJfU0VUX0FVVE9NQVhJTUlaRQlfSU9XKDB4RjMsMHgwMyxfX3UzMikKIAogLyogaW9jdGxzIHRvIHJlbG9jYXRlIFRWIG91dHB1dCAoeD1EWzMxOjE2XSwgeT1EWzE1OjBdLCArIDMyKSovCi0jZGVmaW5lIFNJU0ZCX0dFVF9UVlBPU09GRlNFVCAgIF9JT1IoMHhGMywweDA0LF9fdTMyKQotI2RlZmluZSBTSVNGQl9TRVRfVFZQT1NPRkZTRVQgICBfSU9XKDB4RjMsMHgwNCxfX3UzMikKKyNkZWZpbmUgU0lTRkJfR0VUX1RWUE9TT0ZGU0VUCV9JT1IoMHhGMywweDA0LF9fdTMyKQorI2RlZmluZSBTSVNGQl9TRVRfVFZQT1NPRkZTRVQJX0lPVygweEYzLDB4MDQsX191MzIpCisKKy8qIGlvY3RsIGZvciBpbnRlcm5hbCBzaXNmYiBjb21tYW5kcyAoc2lzZmJjdHJsKSAqLworI2RlZmluZSBTSVNGQl9DT01NQU5ECQlfSU9XUigweEYzLDB4MDUsc3RydWN0IHNpc2ZiX2NtZCkKIAogLyogaW9jdGwgZm9yIGxvY2tpbmcgc2lzZmIgKG5vIHJlZ2lzdGVyIGFjY2VzcyBkdXJpbmcgbG9jaykgKi8KIC8qIEFzIG9mIG5vdywgb25seSB1c2VkIHRvIGF2b2lkIHJlZ2lzdGVyIGFjY2VzcyBkdXJpbmcKICAqIHRoZSBpb2N0bHMgbGlzdGVkIGFib3ZlLgogICovCi0jZGVmaW5lIFNJU0ZCX1NFVF9MT0NLICAJX0lPVygweEYzLDB4MDYsX191MzIpCi0KLS8qIG1vcmUgdG8gY29tZSBzb29uICovCisjZGVmaW5lIFNJU0ZCX1NFVF9MT0NLCQlfSU9XKDB4RjMsMHgwNixfX3UzMikKIAogLyogaW9jdGxzIDB4RjMgdXAgdG8gMHgzRiByZXNlcnZlZCBmb3Igc2lzZmIgKi8KIApAQCAtMTY1LDcgKzE4NCw3IEBACiAvKiBUaGUgZm9sbG93aW5nIGFyZSBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYW55bW9yZTogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogaW9jdGwgZm9yIGlkZW50aWZ5aW5nIGFuZCBnaXZpbmcgc29tZSBpbmZvIChlc3AuIG1lbW9yeSBoZWFwIHN0YXJ0KSAqLwotI2RlZmluZSBTSVNGQl9HRVRfSU5GT19PTEQgIAkgICBfSU9SKCduJywweEY4LF9fdTMyKQorI2RlZmluZSBTSVNGQl9HRVRfSU5GT19PTEQJICAgX0lPUignbicsMHhGOCxfX3UzMikKIC8qIGlvY3RybCB0byBnZXQgY3VycmVudCB2ZXJ0aWNhbCByZXRyYWNlIHN0YXR1cyAqLwogI2RlZmluZSBTSVNGQl9HRVRfVkJSU1RBVFVTX09MRAkgICBfSU9SKCduJywweEY5LF9fdTMyKQogLyogaW9jdGwgdG8gZW5hYmxlL2Rpc2FibGUgcGFubmluZyBhdXRvLW1heGltaXplIChsaWtlIG5vbWF4IHBhcmFtZXRlcikgKi8KQEAgLTE3Nyw4ICsxOTYsOCBAQAogCiAvKiBGb3IgZmIgbWVtb3J5IG1hbmFnZXIgKEZCSU9fQUxMT0MsIEZCSU9fRlJFRSkgKi8KIHN0cnVjdCBzaXNfbWVtcmVxIHsKLQlfX3UzMiAJb2Zmc2V0OwotCV9fdTMyIAlzaXplOworCV9fdTMyCW9mZnNldDsKKwlfX3UzMglzaXplOwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xODcsMTIgKzIwNiwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKwogI2RlZmluZQlVTktOT1dOX1ZHQSAgMAogI2RlZmluZQlTSVNfMzAwX1ZHQSAgMQogI2RlZmluZQlTSVNfMzE1X1ZHQSAgMgogCisjZGVmaW5lIFNJU0ZCX0hBVkVfTUFMTE9DX05FVwogZXh0ZXJuIHZvaWQgc2lzX21hbGxvYyhzdHJ1Y3Qgc2lzX21lbXJlcSAqcmVxKTsKK2V4dGVybiB2b2lkIHNpc19tYWxsb2NfbmV3KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2lzX21lbXJlcSAqcmVxKTsKKwogZXh0ZXJuIHZvaWQgc2lzX2ZyZWUodTMyIGJhc2UpOworZXh0ZXJuIHZvaWQgc2lzX2ZyZWVfbmV3KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgYmFzZSk7CiAjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3cxMDBmYi5oIGIvaW5jbHVkZS92aWRlby93MTAwZmIuaAppbmRleCBiZDU0OGMyLi5lNmRhMmQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL3cxMDBmYi5oCisrKyBiL2luY2x1ZGUvdmlkZW8vdzEwMGZiLmgKQEAgLTEsMjEgKzEsMTQ5IEBACiAvKgogICogIFN1cHBvcnQgZm9yIHRoZSB3MTAwIGZyYW1lIGJ1ZmZlci4KICAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA0IFJpY2hhcmQgUHVyZGllCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgUmljaGFyZCBQdXJkaWUKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgSWFuIE1vbHRvbgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2RlZmluZSBXMTAwX0dQSU9fUE9SVF9BCTAKKyNkZWZpbmUgVzEwMF9HUElPX1BPUlRfQgkxCisKKyNkZWZpbmUgQ0xLX1NSQ19YVEFMICAwCisjZGVmaW5lIENMS19TUkNfUExMICAgMQorCitzdHJ1Y3QgdzEwMGZiX3BhcjsKKwordW5zaWduZWQgbG9uZyB3MTAwZmJfZ3Bpb19yZWFkKGludCBwb3J0KTsKK3ZvaWQgdzEwMGZiX2dwaW9fd3JpdGUoaW50IHBvcnQsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworCisvKiBMQ0QgU3BlY2lmaWMgUm91dGluZXMgYW5kIENvbmZpZyAqLworc3RydWN0IHcxMDBfdGdfaW5mbyB7CisJdm9pZCAoKmNoYW5nZSkoc3RydWN0IHcxMDBmYl9wYXIqKTsKKwl2b2lkICgqc3VzcGVuZCkoc3RydWN0IHcxMDBmYl9wYXIqKTsKKwl2b2lkICgqcmVzdW1lKShzdHJ1Y3QgdzEwMGZiX3BhciopOworfTsKKworLyogR2VuZXJhbCBQbGF0Zm9ybSBTcGVjaWZpYyB3MTAwIFJlZ2lzdGVyIFZhbHVlcyAqLworc3RydWN0IHcxMDBfZ2VuX3JlZ3MgeworCXVuc2lnbmVkIGxvbmcgbGNkX2Zvcm1hdDsKKwl1bnNpZ25lZCBsb25nIGxjZGRfY250bDE7CisJdW5zaWduZWQgbG9uZyBsY2RkX2NudGwyOworCXVuc2lnbmVkIGxvbmcgZ2VubGNkX2NudGwxOworCXVuc2lnbmVkIGxvbmcgZ2VubGNkX2NudGwyOworCXVuc2lnbmVkIGxvbmcgZ2VubGNkX2NudGwzOworfTsKKworc3RydWN0IHcxMDBfZ3Bpb19yZWdzIHsKKwl1bnNpZ25lZCBsb25nIGluaXRfZGF0YTE7CisJdW5zaWduZWQgbG9uZyBpbml0X2RhdGEyOworCXVuc2lnbmVkIGxvbmcgZ3Bpb19kaXIxOworCXVuc2lnbmVkIGxvbmcgZ3Bpb19vZTE7CisJdW5zaWduZWQgbG9uZyBncGlvX2RpcjI7CisJdW5zaWduZWQgbG9uZyBncGlvX29lMjsKK307CisKKy8qIE9wdGlvbmFsIEV4dGVybmFsIE1lbW9yeSBDb25maWd1cmF0aW9uICovCitzdHJ1Y3QgdzEwMF9tZW1faW5mbyB7CisJdW5zaWduZWQgbG9uZyBleHRfY250bDsKKwl1bnNpZ25lZCBsb25nIHNkcmFtX21vZGVfcmVnOworCXVuc2lnbmVkIGxvbmcgZXh0X3RpbWluZ19jbnRsOworCXVuc2lnbmVkIGxvbmcgaW9fY250bDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKK307CisKK3N0cnVjdCB3MTAwX2JtX21lbV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGV4dF9tZW1fYnc7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBleHRfdGltaW5nX2N0bDsKKwl1bnNpZ25lZCBsb25nIGV4dF9jbnRsOworCXVuc2lnbmVkIGxvbmcgbW9kZV9yZWc7CisJdW5zaWduZWQgbG9uZyBpb19jbnRsOworCXVuc2lnbmVkIGxvbmcgY29uZmlnOworfTsKKworLyogTENEIE1vZGUgZGVmaW5pdGlvbiAqLworc3RydWN0IHcxMDBfbW9kZSB7CisJdW5zaWduZWQgaW50IHhyZXM7CisJdW5zaWduZWQgaW50IHlyZXM7CisJdW5zaWduZWQgc2hvcnQgbGVmdF9tYXJnaW47CisJdW5zaWduZWQgc2hvcnQgcmlnaHRfbWFyZ2luOworCXVuc2lnbmVkIHNob3J0IHVwcGVyX21hcmdpbjsKKwl1bnNpZ25lZCBzaG9ydCBsb3dlcl9tYXJnaW47CisJdW5zaWduZWQgbG9uZyBjcnRjX3NzOworCXVuc2lnbmVkIGxvbmcgY3J0Y19sczsKKwl1bnNpZ25lZCBsb25nIGNydGNfZ3M7CisJdW5zaWduZWQgbG9uZyBjcnRjX3Zwb3NfZ3M7CisJdW5zaWduZWQgbG9uZyBjcnRjX3JldjsKKwl1bnNpZ25lZCBsb25nIGNydGNfZGNsazsKKwl1bnNpZ25lZCBsb25nIGNydGNfZ2NsazsKKwl1bnNpZ25lZCBsb25nIGNydGNfZ29lOworCXVuc2lnbmVkIGxvbmcgY3J0Y19wczFfYWN0aXZlOworCWNoYXIgcGxsX2ZyZXE7CisJY2hhciBmYXN0X3BsbF9mcmVxOworCWludCBzeXNjbGtfc3JjOworCWludCBzeXNjbGtfZGl2aWRlcjsKKwlpbnQgcGl4Y2xrX3NyYzsKKwlpbnQgcGl4Y2xrX2RpdmlkZXI7CisJaW50IHBpeGNsa19kaXZpZGVyX3JvdGF0ZWQ7Cit9OworCitzdHJ1Y3QgdzEwMF9wbGxfaW5mbyB7CisJdWludDE2X3QgZnJlcTsgIC8qIGRlc2lyZWQgRm91dCBmb3IgUExMIChNaHopICovCisJdWludDhfdCBNOyAgICAgIC8qIGlucHV0IGRpdmlkZXIgKi8KKwl1aW50OF90IE5faW50OyAgLyogVkNPIG11bHRpcGxpZXIgKi8KKwl1aW50OF90IE5fZmFjOyAgLyogVkNPIG11bHRpcGxpZXIgZnJhY3Rpb25hbCBwYXJ0ICovCisJdWludDhfdCB0ZmdvYWw7CisJdWludDhfdCBsb2NrX3RpbWU7Cit9OworCisvKiBJbml0aWFsIFZpZGVvIG1vZGUgb3JpZW50YXRpb24gZmxhZ3MgKi8KKyNkZWZpbmUgSU5JVF9NT0RFX1JPVEFURUQgIDB4MQorI2RlZmluZSBJTklUX01PREVfRkxJUFBFRCAgMHgyCisKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIG1hY2hpbmUgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgb24uCiAgKiBJdCBpcyBzZXQgYnkgbWFjaGluZSBzcGVjaWZpYyBjb2RlIGFuZCB1c2VkIGluIHRoZSBwcm9iZSByb3V0aW5lCiAgKiBvZiBkcml2ZXJzL3ZpZGVvL3cxMDBmYi5jCiAgKi8KLQogc3RydWN0IHcxMDBmYl9tYWNoX2luZm8gewotCXZvaWQgKCp3MTAwZmJfc3NwX3NlbmQpKHU4IGFkcnMsIHU4IGRhdGEpOwotCWludCBjb21hZGo7Ci0JaW50IHBoYWRhZGo7CisJLyogR2VuZXJhbCBQbGF0Zm9ybSBTcGVjaWZpYyBSZWdpc3RlcnMgKi8KKwlzdHJ1Y3QgdzEwMF9nZW5fcmVncyAqcmVnczsKKwkvKiBUYWJsZSBvZiBtb2RlcyB0aGUgTENEIGlzIGNhcGFibGUgb2YgKi8KKwlzdHJ1Y3QgdzEwMF9tb2RlICptb2RlbGlzdDsKKwl1bnNpZ25lZCBpbnQgbnVtX21vZGVzOworCS8qIEhvb2tzIGZvciBhbnkgcGxhdGZvcm0gc3BlY2lmaWMgdGcvbGNkIGNvZGUgKG9wdGlvbmFsKSAqLworCXN0cnVjdCB3MTAwX3RnX2luZm8gKnRnOworCS8qIEV4dGVybmFsIG1lbW9yeSBkZWZpbml0aW9uIChpZiBwcmVzZW50KSAqLworCXN0cnVjdCB3MTAwX21lbV9pbmZvICptZW07CisJLyogQWRkaXRpb25hbCBFeHRlcm5hbCBtZW1vcnkgZGVmaW5pdGlvbiAoaWYgcHJlc2VudCkgKi8KKwlzdHJ1Y3QgdzEwMF9ibV9tZW1faW5mbyAqYm1fbWVtOworCS8qIEdQSU8gZGVmaW5pdGlvbnMgKG9wdGlvbmFsKSAqLworCXN0cnVjdCB3MTAwX2dwaW9fcmVncyAqZ3BpbzsKKwkvKiBJbml0aWFsIE1vZGUgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQgaW5pdF9tb2RlOworCS8qIFh0YWwgRnJlcXVlbmN5ICovCisJdW5zaWduZWQgaW50IHh0YWxfZnJlcTsKKwkvKiBFbmFibGUgWHRhbCBpbnB1dCBkb3VibGVyICgxID09IGVuYWJsZSkgKi8KKwl1bnNpZ25lZCBpbnQgeHRhbF9kYmw7Cit9OworCisvKiBHZW5lcmFsIGZyYW1lIGJ1ZmZlciBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IHcxMDBmYl9wYXIgeworCXVuc2lnbmVkIGludCBjaGlwX2lkOworCXVuc2lnbmVkIGludCB4cmVzOworCXVuc2lnbmVkIGludCB5cmVzOworCXVuc2lnbmVkIGludCBleHRtZW1fYWN0aXZlOworCXVuc2lnbmVkIGludCBmbGlwOworCXVuc2lnbmVkIGludCBibGFua2VkOworCXVuc2lnbmVkIGludCBmYXN0cGxsX21vZGU7CisJdW5zaWduZWQgbG9uZyBoc3luY19sZW47CisJc3RydWN0IHcxMDBfbW9kZSAqbW9kZTsKKwlzdHJ1Y3QgdzEwMF9wbGxfaW5mbyAqcGxsX3RhYmxlOworCXN0cnVjdCB3MTAwZmJfbWFjaF9pbmZvICptYWNoOworCXVpbnQzMl90ICpzYXZlZF9pbnRtZW07CisJdWludDMyX3QgKnNhdmVkX2V4dG1lbTsKIH07CmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggMDVhNzVjNC4uZDVhMWExMiAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtNzcsNiArNzcsMjIgQEAKIAkgIG9iamVjdCBhbmQgc291cmNlIHRyZWUsIGluIHRoYXQgb3JkZXIuICBZb3VyIHRvdGFsIHN0cmluZyBjYW4KIAkgIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzLgogCitjb25maWcgTE9DQUxWRVJTSU9OX0FVVE8KKwlib29sICJBdXRvbWF0aWNhbGx5IGFwcGVuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIHRvIHRoZSB2ZXJzaW9uIHN0cmluZyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIHdpbGwgdHJ5IHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIGlmIHRoZSBjdXJyZW50IHRyZWUgaXMgYQorCSAgcmVsZWFzZSB0cmVlIGJ5IGxvb2tpbmcgZm9yIGdpdCB0YWdzIHRoYXQKKwkgIGJlbG9uZyB0byB0aGUgY3VycmVudCB0b3Agb2YgdHJlZSByZXZpc2lvbi4KKworCSAgQSBzdHJpbmcgb2YgdGhlIGZvcm1hdCAtZ3h4eHh4eHh4IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxvY2FsdmVyc2lvbgorCSAgaWYgYSBnaXQgYmFzZWQgdHJlZSBpcyBmb3VuZC4gIFRoZSBzdHJpbmcgZ2VuZXJhdGVkIGJ5IHRoaXMgd2lsbCBiZQorCSAgYXBwZW5kZWQgYWZ0ZXIgYW55IG1hdGNoaW5nIGxvY2FsdmVyc2lvbiogZmlsZXMsIGFuZCBhZnRlciB0aGUgdmFsdWUKKwkgIHNldCBpbiBDT05GSUdfTE9DQUxWRVJTSU9OCisKKwkgIE5vdGU6IFRoaXMgcmVxdWlyZXMgUGVybCwgYW5kIGEgZ2l0IHJlcG9zaXRvcnksIGJ1dCBub3QgbmVjZXNzYXJpbHkKKwkgIHRoZSBnaXQgb3IgY29naXRvIHRvb2xzIHRvIGJlIGluc3RhbGxlZC4KKwogY29uZmlnIFNXQVAKIAlib29sICJTdXBwb3J0IGZvciBwYWdpbmcgb2YgYW5vbnltb3VzIG1lbW9yeSAoc3dhcCkiCiAJZGVwZW5kcyBvbiBNTVUKQEAgLTIzOCw2ICsyNTQsOCBAQAogCiAJICBTYXkgTiBpZiB1bnN1cmUuCiAKK3NvdXJjZSAidXNyL0tjb25maWciCisKIG1lbnVjb25maWcgRU1CRURERUQKIAlib29sICJDb25maWd1cmUgc3RhbmRhcmQga2VybmVsIGZlYXR1cmVzIChmb3Igc21hbGwgc3lzdGVtcykiCiAJaGVscApAQCAtMjYwLDggKzI3OCw4IEBACiAJaGVscAogCSAgIE5vcm1hbGx5IGthbGxzeW1zIG9ubHkgY29udGFpbnMgdGhlIHN5bWJvbHMgb2YgZnVuY3Rpb25zLCBmb3IgbmljZXIKIAkgICBPT1BTIG1lc3NhZ2VzLiAgU29tZSBkZWJ1Z2dlcnMgY2FuIHVzZSBrYWxsc3ltcyBmb3Igb3RoZXIKLQkgICBzeW1ib2xzIHRvbzogc2F5IFkgaGVyZSB0byBpbmNsdWRlIGFsbCBzeW1ib2xzLCBhbmQgeW91Ci0JICAgZG9uJ3QgY2FyZSBhYm91dCBhZGRpbmcgMzAwayB0byB0aGUgc2l6ZSBvZiB5b3VyIGtlcm5lbC4KKwkgICBzeW1ib2xzIHRvbzogc2F5IFkgaGVyZSB0byBpbmNsdWRlIGFsbCBzeW1ib2xzLCBpZiB5b3UgbmVlZCB0aGVtIAorCSAgIGFuZCB5b3UgZG9uJ3QgY2FyZSBhYm91dCBhZGRpbmcgMzAwayB0byB0aGUgc2l6ZSBvZiB5b3VyIGtlcm5lbC4KIAogCSAgIFNheSBOLgogCmRpZmYgLS1naXQgYS9pbml0L01ha2VmaWxlIGIvaW5pdC9NYWtlZmlsZQppbmRleCA5M2E1M2ZiLi5hMjMwMDA3IDEwMDY0NAotLS0gYS9pbml0L01ha2VmaWxlCisrKyBiL2luaXQvTWFrZWZpbGUKQEAgLTI1LDQgKzI1LDUgQEAKIAogaW5jbHVkZS9saW51eC9jb21waWxlLmg6IEZPUkNFCiAJQGVjaG8gJyAgQ0hLICAgICAkQCcKLQlAJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9ta2NvbXBpbGVfaCAkQCAiJChVVFNfTUFDSElORSkiICIkKENPTkZJR19TTVApIiAiJChDQykgJChDRkxBR1MpIgorCSQoUSkkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL21rY29tcGlsZV9oICRAIFwKKwkiJChVVFNfTUFDSElORSkiICIkKENPTkZJR19TTVApIiAiJChDT05GSUdfUFJFRU1QVCkiICIkKENDKSAkKENGTEFHUykiCmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50cy5jIGIvaW5pdC9kb19tb3VudHMuYwppbmRleCA0ZTExYTlhLi5iMjdjMTEwIDEwMDY0NAotLS0gYS9pbml0L2RvX21vdW50cy5jCisrKyBiL2luaXQvZG9fbW91bnRzLmMKQEAgLTEyNywxMCArMTI3LDEwIEBACiAgKgkgICB1c2VkIHdoZW4gZGlzayBuYW1lIG9mIHBhcnRpdGlvbmVkIGRpc2sgZW5kcyBvbiBhIGRpZ2l0LgogICoKICAqCUlmIG5hbWUgZG9lc24ndCBoYXZlIGZhbGwgaW50byB0aGUgY2F0ZWdvcmllcyBhYm92ZSwgd2UgcmV0dXJuIDAuCi0gKglEcml2ZXJmcyBpcyB1c2VkIHRvIGNoZWNrIGlmIHNvbWV0aGluZyBpcyBhIGRpc2sgbmFtZSAtIGl0IGhhcworICoJU3lzZnMgaXMgdXNlZCB0byBjaGVjayBpZiBzb21ldGhpbmcgaXMgYSBkaXNrIG5hbWUgLSBpdCBoYXMKICAqCWFsbCBrbm93biBkaXNrcyB1bmRlciBidXMvYmxvY2svZGV2aWNlcy4gIElmIHRoZSBkaXNrIG5hbWUKLSAqCWNvbnRhaW5zIHNsYXNoZXMsIG5hbWUgb2YgZHJpdmVyZnMgbm9kZSBoYXMgdGhlbSByZXBsYWNlZCB3aXRoCi0gKgliYW5ncy4gIHRyeV9uYW1lKCkgZG9lcyB0aGUgYWN0dWFsIGNoZWNrcywgYXNzdW1pbmcgdGhhdCBkcml2ZXJmcworICoJY29udGFpbnMgc2xhc2hlcywgbmFtZSBvZiBzeXNmcyBub2RlIGhhcyB0aGVtIHJlcGxhY2VkIHdpdGgKKyAqCWJhbmdzLiAgdHJ5X25hbWUoKSBkb2VzIHRoZSBhY3R1YWwgY2hlY2tzLCBhc3N1bWluZyB0aGF0IHN5c2ZzCiAgKglpcyBtb3VudGVkIG9uIHJvb3RmcyAvc3lzLgogICovCiAKZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggZmY0MTAwNi4uZjE0MmQ0MCAxMDA2NDQKLS0tIGEvaW5pdC9tYWluLmMKKysrIGIvaW5pdC9tYWluLmMKQEAgLTEyMyw2ICsxMjMsNyBAQAogY2hhciBzYXZlZF9jb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkVdOwogCiBzdGF0aWMgY2hhciAqZXhlY3V0ZV9jb21tYW5kOworc3RhdGljIGNoYXIgKnJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kOwogCiAvKiBTZXR1cCBjb25maWd1cmVkIG1heGltdW0gbnVtYmVyIG9mIENQVXMgdG8gYWN0aXZhdGUgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2NwdXMgPSBOUl9DUFVTOwpAQCAtMjk3LDYgKzI5OCwxOCBAQAogfQogX19zZXR1cCgiaW5pdD0iLCBpbml0X3NldHVwKTsKIAorc3RhdGljIGludCBfX2luaXQgcmRpbml0X3NldHVwKGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kID0gc3RyOworCS8qIFNlZSAiYXV0byIgY29tbWVudCBpbiBpbml0X3NldHVwICovCisJZm9yIChpID0gMTsgaSA8IE1BWF9JTklUX0FSR1M7IGkrKykKKwkJYXJndl9pbml0W2ldID0gTlVMTDsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoInJkaW5pdD0iLCByZGluaXRfc2V0dXApOworCiBleHRlcm4gdm9pZCBzZXR1cF9hcmNoKGNoYXIgKiopOwogCiAjaWZuZGVmIENPTkZJR19TTVAKQEAgLTYxNCw2ICs2MjcsNyBAQAogCW1pZ3JhdGlvbl9pbml0KCk7CiAjZW5kaWYKIAlzcGF3bl9rc29mdGlycWQoKTsKKwlzcGF3bl9zb2Z0bG9ja3VwX3Rhc2soKTsKIH0KIAogc3RhdGljIHZvaWQgcnVuX2luaXRfcHJvY2VzcyhjaGFyICppbml0X2ZpbGVuYW1lKQpAQCAtNjgwLDEwICs2OTQsMTQgQEAKIAkgKiBjaGVjayBpZiB0aGVyZSBpcyBhbiBlYXJseSB1c2Vyc3BhY2UgaW5pdC4gIElmIHllcywgbGV0IGl0IGRvIGFsbAogCSAqIHRoZSB3b3JrCiAJICovCi0JaWYgKHN5c19hY2Nlc3MoKGNvbnN0IGNoYXIgX191c2VyICopICIvaW5pdCIsIDApID09IDApCi0JCWV4ZWN1dGVfY29tbWFuZCA9ICIvaW5pdCI7Ci0JZWxzZQorCisJaWYgKCFyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCkKKwkJcmFtZGlza19leGVjdXRlX2NvbW1hbmQgPSAiL2luaXQiOworCisJaWYgKHN5c19hY2Nlc3MoKGNvbnN0IGNoYXIgX191c2VyICopIHJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kLCAwKSAhPSAwKSB7CisJCXJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kID0gTlVMTDsKIAkJcHJlcGFyZV9uYW1lc3BhY2UoKTsKKwl9CiAKIAkvKgogCSAqIE9rLCB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgaW5pdGlhbCBib290dXAsIGFuZApAQCAtNzAwLDE3ICs3MTgsMjQgQEAKIAogCSh2b2lkKSBzeXNfZHVwKDApOwogCSh2b2lkKSBzeXNfZHVwKDApOwotCQorCisJaWYgKHJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kKSB7CisJCXJ1bl9pbml0X3Byb2Nlc3MocmFtZGlza19leGVjdXRlX2NvbW1hbmQpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gZXhlY3V0ZSAlc1xuIiwKKwkJCQlyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCk7CisJfQorCiAJLyoKIAkgKiBXZSB0cnkgZWFjaCBvZiB0aGVzZSB1bnRpbCBvbmUgc3VjY2VlZHMuCiAJICoKIAkgKiBUaGUgQm91cm5lIHNoZWxsIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgaW5pdCBpZiB3ZSBhcmUgCiAJICogdHJ5aW5nIHRvIHJlY292ZXIgYSByZWFsbHkgYnJva2VuIG1hY2hpbmUuCiAJICovCi0KLQlpZiAoZXhlY3V0ZV9jb21tYW5kKQorCWlmIChleGVjdXRlX2NvbW1hbmQpIHsKIAkJcnVuX2luaXRfcHJvY2VzcyhleGVjdXRlX2NvbW1hbmQpOwotCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBleGVjdXRlICVzLiAgQXR0ZW1wdGluZyAiCisJCQkJCSJkZWZhdWx0cy4uLlxuIiwgZXhlY3V0ZV9jb21tYW5kKTsKKwl9CiAJcnVuX2luaXRfcHJvY2VzcygiL3NiaW4vaW5pdCIpOwogCXJ1bl9pbml0X3Byb2Nlc3MoIi9ldGMvaW5pdCIpOwogCXJ1bl9pbml0X3Byb2Nlc3MoIi9iaW4vaW5pdCIpOwpkaWZmIC0tZ2l0IGEvaXBjL2NvbXBhdC5jIGIvaXBjL2NvbXBhdC5jCmluZGV4IDM4ODFkNTYuLjFmZTk1ZjYgMTAwNjQ0Ci0tLSBhL2lwYy9jb21wYXQuYworKysgYi9pcGMvY29tcGF0LmMKQEAgLTQyLDEwICs0MiwxMCBAQAogCiBzdHJ1Y3QgY29tcGF0X2lwY19wZXJtIHsKIAlrZXlfdCBrZXk7Ci0JY29tcGF0X3VpZF90IHVpZDsKLQljb21wYXRfZ2lkX3QgZ2lkOwotCWNvbXBhdF91aWRfdCBjdWlkOwotCWNvbXBhdF9naWRfdCBjZ2lkOworCV9fY29tcGF0X3VpZF90IHVpZDsKKwlfX2NvbXBhdF9naWRfdCBnaWQ7CisJX19jb21wYXRfdWlkX3QgY3VpZDsKKwlfX2NvbXBhdF9naWRfdCBjZ2lkOwogCWNvbXBhdF9tb2RlX3QgbW9kZTsKIAl1bnNpZ25lZCBzaG9ydCBzZXE7CiB9OwpAQCAtMTc0LDggKzE3NCw4IEBACiAJCQkJCXN0cnVjdCBjb21wYXRfaXBjX3Blcm0gX191c2VyICp1cCkKIHsKIAlpbnQgZXJyOwotCWNvbXBhdF91aWRfdCB1OwotCWNvbXBhdF9naWRfdCBnOworCV9fY29tcGF0X3VpZF90IHU7CisJX19jb21wYXRfZ2lkX3QgZzsKIAogCWVyciAgPSBfX3B1dF91c2VyKHAtPmtleSwgJnVwLT5rZXkpOwogCVNFVF9VSUQodSwgcC0+dWlkKTsKZGlmZiAtLWdpdCBhL2lwYy9tcXVldWUuYyBiL2lwYy9tcXVldWUuYwppbmRleCAwYWNmMjQ1Li4zYTkyNjAxIDEwMDY0NAotLS0gYS9pcGMvbXF1ZXVlLmMKKysrIGIvaXBjL21xdWV1ZS5jCkBAIC02OSw3ICs2OSw3IEBACiAKIAlzdHJ1Y3Qgc2lnZXZlbnQgbm90aWZ5OwogCXBpZF90IG5vdGlmeV9vd25lcjsKLSAJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOwkvKiB1c2VyIHdobyBjcmVhdGVkLCBmb3IgYWNjb3V0aW5nICovCisJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOwkvKiB1c2VyIHdobyBjcmVhdGVkLCBmb3IgYWNjb3VudGluZyAqLwogCXN0cnVjdCBzb2NrICpub3RpZnlfc29jazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbm90aWZ5X2Nvb2tpZTsKIApkaWZmIC0tZ2l0IGEvaXBjL21zZy5jIGIvaXBjL21zZy5jCmluZGV4IDI3ZTUxNmYuLmQwMzViZDIgMTAwNjQ0Ci0tLSBhL2lwYy9tc2cuYworKysgYi9pcGMvbXNnLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJ1dGlsLmgiCkBAIC03NCwxNiArNzUsMTYgQEAKIHN0YXRpYyB2b2lkIGZyZWVxdWUgKHN0cnVjdCBtc2dfcXVldWUgKm1zcSwgaW50IGlkKTsKIHN0YXRpYyBpbnQgbmV3cXVlIChrZXlfdCBrZXksIGludCBtc2dmbGcpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW50IHN5c3ZpcGNfbXNnX3JlYWRfcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IHN5c3ZpcGNfbXNnX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0KTsKICNlbmRpZgogCiB2b2lkIF9faW5pdCBtc2dfaW5pdCAodm9pZCkKIHsKIAlpcGNfaW5pdF9pZHMoJm1zZ19pZHMsbXNnX2N0bG1uaSk7Ci0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN5c3ZpcGMvbXNnIiwgMCwgTlVMTCwgc3lzdmlwY19tc2dfcmVhZF9wcm9jLCBOVUxMKTsKLSNlbmRpZgorCWlwY19pbml0X3Byb2NfaW50ZXJmYWNlKCJzeXN2aXBjL21zZyIsCisJCQkJIiAgICAgICBrZXkgICAgICBtc3FpZCBwZXJtcyAgICAgIGNieXRlcyAgICAgICBxbnVtIGxzcGlkIGxycGlkICAgdWlkICAgZ2lkICBjdWlkICBjZ2lkICAgICAgc3RpbWUgICAgICBydGltZSAgICAgIGN0aW1lXG4iLAorCQkJCSZtc2dfaWRzLAorCQkJCXN5c3ZpcGNfbXNnX3Byb2Nfc2hvdyk7CiB9CiAKIHN0YXRpYyBpbnQgbmV3cXVlIChrZXlfdCBrZXksIGludCBtc2dmbGcpCkBAIC0xMTMsNiArMTE0LDcgQEAKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCisJbXNxLT5xX2lkID0gbXNnX2J1aWxkaWQoaWQsbXNxLT5xX3Blcm0uc2VxKTsKIAltc3EtPnFfc3RpbWUgPSBtc3EtPnFfcnRpbWUgPSAwOwogCW1zcS0+cV9jdGltZSA9IGdldF9zZWNvbmRzKCk7CiAJbXNxLT5xX2NieXRlcyA9IG1zcS0+cV9xbnVtID0gMDsKQEAgLTEyMyw3ICsxMjUsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZtc3EtPnFfc2VuZGVycyk7CiAJbXNnX3VubG9jayhtc3EpOwogCi0JcmV0dXJuIG1zZ19idWlsZGlkKGlkLG1zcS0+cV9wZXJtLnNlcSk7CisJcmV0dXJuIG1zcS0+cV9pZDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNzX2FkZChzdHJ1Y3QgbXNnX3F1ZXVlKiBtc3EsIHN0cnVjdCBtc2dfc2VuZGVyKiBtc3MpCkBAIC04MDgsNTUgKzgxMCwyNSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQgc3lzdmlwY19tc2dfcmVhZF9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBzeXN2aXBjX21zZ19wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCkKIHsKLQlvZmZfdCBwb3MgPSAwOwotCW9mZl90IGJlZ2luID0gMDsKLQlpbnQgaSwgbGVuID0gMDsKKwlzdHJ1Y3QgbXNnX3F1ZXVlICptc3EgPSBpdDsKIAotCWRvd24oJm1zZ19pZHMuc2VtKTsKLQlsZW4gKz0gc3ByaW50ZihidWZmZXIsICIgICAgICAga2V5ICAgICAgbXNxaWQgcGVybXMgICAgICBjYnl0ZXMgICAgICAgcW51bSBsc3BpZCBscnBpZCAgIHVpZCAgIGdpZCAgY3VpZCAgY2dpZCAgICAgIHN0aW1lICAgICAgcnRpbWUgICAgICBjdGltZVxuIik7Ci0KLQlmb3IoaSA9IDA7IGkgPD0gbXNnX2lkcy5tYXhfaWQ7IGkrKykgewotCQlzdHJ1Y3QgbXNnX3F1ZXVlICogbXNxOwotCQltc3EgPSBtc2dfbG9jayhpKTsKLQkJaWYobXNxICE9IE5VTEwpIHsKLQkJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiUxMGQgJTEwZCAgJTRvICAlMTBsdSAlMTBsdSAlNXUgJTV1ICU1dSAlNXUgJTV1ICU1dSAlMTBsdSAlMTBsdSAlMTBsdVxuIiwKLQkJCQltc3EtPnFfcGVybS5rZXksCi0JCQkJbXNnX2J1aWxkaWQoaSxtc3EtPnFfcGVybS5zZXEpLAotCQkJCW1zcS0+cV9wZXJtLm1vZGUsCi0JCQkJbXNxLT5xX2NieXRlcywKLQkJCQltc3EtPnFfcW51bSwKLQkJCQltc3EtPnFfbHNwaWQsCi0JCQkJbXNxLT5xX2xycGlkLAotCQkJCW1zcS0+cV9wZXJtLnVpZCwKLQkJCQltc3EtPnFfcGVybS5naWQsCi0JCQkJbXNxLT5xX3Blcm0uY3VpZCwKLQkJCQltc3EtPnFfcGVybS5jZ2lkLAotCQkJCW1zcS0+cV9zdGltZSwKLQkJCQltc3EtPnFfcnRpbWUsCi0JCQkJbXNxLT5xX2N0aW1lKTsKLQkJCW1zZ191bmxvY2sobXNxKTsKLQotCQkJcG9zICs9IGxlbjsKLQkJCWlmKHBvcyA8IG9mZnNldCkgewotCQkJCWxlbiA9IDA7Ci0JCQkJYmVnaW4gPSBwb3M7Ci0JCQl9Ci0JCQlpZihwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCi0JCQkJZ290byBkb25lOwotCQl9Ci0KLQl9Ci0JKmVvZiA9IDE7Ci1kb25lOgotCXVwKCZtc2dfaWRzLnNlbSk7Ci0JKnN0YXJ0ID0gYnVmZmVyICsgKG9mZnNldCAtIGJlZ2luKTsKLQlsZW4gLT0gKG9mZnNldCAtIGJlZ2luKTsKLQlpZihsZW4gPiBsZW5ndGgpCi0JCWxlbiA9IGxlbmd0aDsKLQlpZihsZW4gPCAwKQotCQlsZW4gPSAwOwotCXJldHVybiBsZW47CisJcmV0dXJuIHNlcV9wcmludGYocywKKwkJCSAgIiUxMGQgJTEwZCAgJTRvICAlMTBsdSAlMTBsdSAlNXUgJTV1ICU1dSAlNXUgJTV1ICU1dSAlMTBsdSAlMTBsdSAlMTBsdVxuIiwKKwkJCSAgbXNxLT5xX3Blcm0ua2V5LAorCQkJICBtc3EtPnFfaWQsCisJCQkgIG1zcS0+cV9wZXJtLm1vZGUsCisJCQkgIG1zcS0+cV9jYnl0ZXMsCisJCQkgIG1zcS0+cV9xbnVtLAorCQkJICBtc3EtPnFfbHNwaWQsCisJCQkgIG1zcS0+cV9scnBpZCwKKwkJCSAgbXNxLT5xX3Blcm0udWlkLAorCQkJICBtc3EtPnFfcGVybS5naWQsCisJCQkgIG1zcS0+cV9wZXJtLmN1aWQsCisJCQkgIG1zcS0+cV9wZXJtLmNnaWQsCisJCQkgIG1zcS0+cV9zdGltZSwKKwkJCSAgbXNxLT5xX3J0aW1lLAorCQkJICBtc3EtPnFfY3RpbWUpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pcGMvc2VtLmMgYi9pcGMvc2VtLmMKaW5kZXggNzA5NzVjZS4uMTlhZjAyOCAxMDA2NDQKLS0tIGEvaXBjL3NlbS5jCisrKyBiL2lwYy9zZW0uYwpAQCAtNzMsNiArNzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJ1dGlsLmgiCiAKQEAgLTg5LDcgKzkwLDcgQEAKIHN0YXRpYyBpbnQgbmV3YXJ5IChrZXlfdCwgaW50LCBpbnQpOwogc3RhdGljIHZvaWQgZnJlZWFyeSAoc3RydWN0IHNlbV9hcnJheSAqc21hLCBpbnQgaWQpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW50IHN5c3ZpcGNfc2VtX3JlYWRfcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IHN5c3ZpcGNfc2VtX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0KTsKICNlbmRpZgogCiAjZGVmaW5lIFNFTU1TTF9GQVNUCTI1NiAvKiA1MTIgYnl0ZXMgb24gc3RhY2sgKi8KQEAgLTExNiwxMCArMTE3LDEwIEBACiB7CiAJdXNlZF9zZW1zID0gMDsKIAlpcGNfaW5pdF9pZHMoJnNlbV9pZHMsc2Nfc2VtbW5pKTsKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3lzdmlwYy9zZW0iLCAwLCBOVUxMLCBzeXN2aXBjX3NlbV9yZWFkX3Byb2MsIE5VTEwpOwotI2VuZGlmCisJaXBjX2luaXRfcHJvY19pbnRlcmZhY2UoInN5c3ZpcGMvc2VtIiwKKwkJCQkiICAgICAgIGtleSAgICAgIHNlbWlkIHBlcm1zICAgICAgbnNlbXMgICB1aWQgICBnaWQgIGN1aWQgIGNnaWQgICAgICBvdGltZSAgICAgIGN0aW1lXG4iLAorCQkJCSZzZW1faWRzLAorCQkJCXN5c3ZpcGNfc2VtX3Byb2Nfc2hvdyk7CiB9CiAKIC8qCkBAIC0xOTMsNiArMTk0LDcgQEAKIAl9CiAJdXNlZF9zZW1zICs9IG5zZW1zOwogCisJc21hLT5zZW1faWQgPSBzZW1fYnVpbGRpZChpZCwgc21hLT5zZW1fcGVybS5zZXEpOwogCXNtYS0+c2VtX2Jhc2UgPSAoc3RydWN0IHNlbSAqKSAmc21hWzFdOwogCS8qIHNtYS0+c2VtX3BlbmRpbmcgPSBOVUxMOyAqLwogCXNtYS0+c2VtX3BlbmRpbmdfbGFzdCA9ICZzbWEtPnNlbV9wZW5kaW5nOwpAQCAtMjAxLDcgKzIwMyw3IEBACiAJc21hLT5zZW1fY3RpbWUgPSBnZXRfc2Vjb25kcygpOwogCXNlbV91bmxvY2soc21hKTsKIAotCXJldHVybiBzZW1fYnVpbGRpZChpZCwgc21hLT5zZW1fcGVybS5zZXEpOworCXJldHVybiBzbWEtPnNlbV9pZDsKIH0KIAogYXNtbGlua2FnZSBsb25nIHN5c19zZW1nZXQgKGtleV90IGtleSwgaW50IG5zZW1zLCBpbnQgc2VtZmxnKQpAQCAtMTMyOCw1MCArMTMzMCwyMSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQgc3lzdmlwY19zZW1fcmVhZF9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBzeXN2aXBjX3NlbV9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCkKIHsKLQlvZmZfdCBwb3MgPSAwOwotCW9mZl90IGJlZ2luID0gMDsKLQlpbnQgaSwgbGVuID0gMDsKKwlzdHJ1Y3Qgc2VtX2FycmF5ICpzbWEgPSBpdDsKIAotCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciwgIiAgICAgICBrZXkgICAgICBzZW1pZCBwZXJtcyAgICAgIG5zZW1zICAgdWlkICAgZ2lkICBjdWlkICBjZ2lkICAgICAgb3RpbWUgICAgICBjdGltZVxuIik7Ci0JZG93bigmc2VtX2lkcy5zZW0pOwotCi0JZm9yKGkgPSAwOyBpIDw9IHNlbV9pZHMubWF4X2lkOyBpKyspIHsKLQkJc3RydWN0IHNlbV9hcnJheSAqc21hOwotCQlzbWEgPSBzZW1fbG9jayhpKTsKLQkJaWYoc21hKSB7Ci0JCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIlMTBkICUxMGQgICU0byAlMTBsdSAlNXUgJTV1ICU1dSAlNXUgJTEwbHUgJTEwbHVcbiIsCi0JCQkJc21hLT5zZW1fcGVybS5rZXksCi0JCQkJc2VtX2J1aWxkaWQoaSxzbWEtPnNlbV9wZXJtLnNlcSksCi0JCQkJc21hLT5zZW1fcGVybS5tb2RlLAotCQkJCXNtYS0+c2VtX25zZW1zLAotCQkJCXNtYS0+c2VtX3Blcm0udWlkLAotCQkJCXNtYS0+c2VtX3Blcm0uZ2lkLAotCQkJCXNtYS0+c2VtX3Blcm0uY3VpZCwKLQkJCQlzbWEtPnNlbV9wZXJtLmNnaWQsCi0JCQkJc21hLT5zZW1fb3RpbWUsCi0JCQkJc21hLT5zZW1fY3RpbWUpOwotCQkJc2VtX3VubG9jayhzbWEpOwotCi0JCQlwb3MgKz0gbGVuOwotCQkJaWYocG9zIDwgb2Zmc2V0KSB7Ci0JCQkJbGVuID0gMDsKLQkgICAgCQkJYmVnaW4gPSBwb3M7Ci0JCQl9Ci0JCQlpZihwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCi0JCQkJZ290byBkb25lOwotCQl9Ci0JfQotCSplb2YgPSAxOwotZG9uZToKLQl1cCgmc2VtX2lkcy5zZW0pOwotCSpzdGFydCA9IGJ1ZmZlciArIChvZmZzZXQgLSBiZWdpbik7Ci0JbGVuIC09IChvZmZzZXQgLSBiZWdpbik7Ci0JaWYobGVuID4gbGVuZ3RoKQotCQlsZW4gPSBsZW5ndGg7Ci0JaWYobGVuIDwgMCkKLQkJbGVuID0gMDsKLQlyZXR1cm4gbGVuOworCXJldHVybiBzZXFfcHJpbnRmKHMsCisJCQkgICIlMTBkICUxMGQgICU0byAlMTBsdSAlNXUgJTV1ICU1dSAlNXUgJTEwbHUgJTEwbHVcbiIsCisJCQkgIHNtYS0+c2VtX3Blcm0ua2V5LAorCQkJICBzbWEtPnNlbV9pZCwKKwkJCSAgc21hLT5zZW1fcGVybS5tb2RlLAorCQkJICBzbWEtPnNlbV9uc2VtcywKKwkJCSAgc21hLT5zZW1fcGVybS51aWQsCisJCQkgIHNtYS0+c2VtX3Blcm0uZ2lkLAorCQkJICBzbWEtPnNlbV9wZXJtLmN1aWQsCisJCQkgIHNtYS0+c2VtX3Blcm0uY2dpZCwKKwkJCSAgc21hLT5zZW1fb3RpbWUsCisJCQkgIHNtYS0+c2VtX2N0aW1lKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaXBjL3NobS5jIGIvaXBjL3NobS5jCmluZGV4IDFkNmNmMDguLmRjYTkwNDggMTAwNjQ0Ci0tLSBhL2lwYy9zaG0uYworKysgYi9pcGMvc2htLmMKQEAgLTIzLDEyICsyMywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zaG1lbV9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC01MSw3ICs1MSw3IEBACiBzdGF0aWMgdm9pZCBzaG1fb3BlbiAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICpzaG1kKTsKIHN0YXRpYyB2b2lkIHNobV9jbG9zZSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICpzaG1kKTsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGludCBzeXN2aXBjX3NobV9yZWFkX3Byb2MoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBzeXN2aXBjX3NobV9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCk7CiAjZW5kaWYKIAogc2l6ZV90CXNobV9jdGxtYXggPSBTSE1NQVg7CkBAIC02Myw5ICs2MywxMCBAQAogdm9pZCBfX2luaXQgc2htX2luaXQgKHZvaWQpCiB7CiAJaXBjX2luaXRfaWRzKCZzaG1faWRzLCAxKTsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN5c3ZpcGMvc2htIiwgMCwgTlVMTCwgc3lzdmlwY19zaG1fcmVhZF9wcm9jLCBOVUxMKTsKLSNlbmRpZgorCWlwY19pbml0X3Byb2NfaW50ZXJmYWNlKCJzeXN2aXBjL3NobSIsCisJCQkJIiAgICAgICBrZXkgICAgICBzaG1pZCBwZXJtcyAgICAgICBzaXplICBjcGlkICBscGlkIG5hdHRjaCAgIHVpZCAgIGdpZCAgY3VpZCAgY2dpZCAgICAgIGF0aW1lICAgICAgZHRpbWUgICAgICBjdGltZVxuIiwKKwkJCQkmc2htX2lkcywKKwkJCQlzeXN2aXBjX3NobV9wcm9jX3Nob3cpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzaG1fY2hlY2tpZChzdHJ1Y3Qgc2htaWRfa2VybmVsICpzLCBpbnQgaWQpCkBAIC04NjksNjMgKzg3MCwzMiBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQgc3lzdmlwY19zaG1fcmVhZF9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBzeXN2aXBjX3NobV9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCkKIHsKLQlvZmZfdCBwb3MgPSAwOwotCW9mZl90IGJlZ2luID0gMDsKLQlpbnQgaSwgbGVuID0gMDsKKwlzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaHAgPSBpdDsKKwljaGFyICpmb3JtYXQ7CiAKLQlkb3duKCZzaG1faWRzLnNlbSk7Ci0JbGVuICs9IHNwcmludGYoYnVmZmVyLCAiICAgICAgIGtleSAgICAgIHNobWlkIHBlcm1zICAgICAgIHNpemUgIGNwaWQgIGxwaWQgbmF0dGNoICAgdWlkICAgZ2lkICBjdWlkICBjZ2lkICAgICAgYXRpbWUgICAgICBkdGltZSAgICAgIGN0aW1lXG4iKTsKLQotCWZvcihpID0gMDsgaSA8PSBzaG1faWRzLm1heF9pZDsgaSsrKSB7Ci0JCXN0cnVjdCBzaG1pZF9rZXJuZWwqIHNocDsKLQotCQlzaHAgPSBzaG1fbG9jayhpKTsKLQkJaWYoc2hwIT1OVUxMKSB7CiAjZGVmaW5lIFNNQUxMX1NUUklORyAiJTEwZCAlMTBkICAlNG8gJTEwdSAlNXUgJTV1ICAlNWQgJTV1ICU1dSAlNXUgJTV1ICUxMGx1ICUxMGx1ICUxMGx1XG4iCiAjZGVmaW5lIEJJR19TVFJJTkcgICAiJTEwZCAlMTBkICAlNG8gJTIxdSAlNXUgJTV1ICAlNWQgJTV1ICU1dSAlNXUgJTV1ICUxMGx1ICUxMGx1ICUxMGx1XG4iCi0JCQljaGFyICpmb3JtYXQ7CiAKLQkJCWlmIChzaXplb2Yoc2l6ZV90KSA8PSBzaXplb2YoaW50KSkKLQkJCQlmb3JtYXQgPSBTTUFMTF9TVFJJTkc7Ci0JCQllbHNlCi0JCQkJZm9ybWF0ID0gQklHX1NUUklORzsKLQkJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgZm9ybWF0LAotCQkJCXNocC0+c2htX3Blcm0ua2V5LAotCQkJCXNobV9idWlsZGlkKGksIHNocC0+c2htX3Blcm0uc2VxKSwKLQkJCQlzaHAtPnNobV9mbGFncywKLQkJCQlzaHAtPnNobV9zZWdzeiwKLQkJCQlzaHAtPnNobV9jcHJpZCwKLQkJCQlzaHAtPnNobV9scHJpZCwKLQkJCQlpc19maWxlX2h1Z2VwYWdlcyhzaHAtPnNobV9maWxlKSA/IChmaWxlX2NvdW50KHNocC0+c2htX2ZpbGUpIC0gMSkgOiBzaHAtPnNobV9uYXR0Y2gsCi0JCQkJc2hwLT5zaG1fcGVybS51aWQsCi0JCQkJc2hwLT5zaG1fcGVybS5naWQsCi0JCQkJc2hwLT5zaG1fcGVybS5jdWlkLAotCQkJCXNocC0+c2htX3Blcm0uY2dpZCwKLQkJCQlzaHAtPnNobV9hdGltLAotCQkJCXNocC0+c2htX2R0aW0sCi0JCQkJc2hwLT5zaG1fY3RpbSk7Ci0JCQlzaG1fdW5sb2NrKHNocCk7Ci0KLQkJCXBvcyArPSBsZW47Ci0JCQlpZihwb3MgPCBvZmZzZXQpIHsKLQkJCQlsZW4gPSAwOwotCQkJCWJlZ2luID0gcG9zOwotCQkJfQotCQkJaWYocG9zID4gb2Zmc2V0ICsgbGVuZ3RoKQotCQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQkqZW9mID0gMTsKLWRvbmU6Ci0JdXAoJnNobV9pZHMuc2VtKTsKLQkqc3RhcnQgPSBidWZmZXIgKyAob2Zmc2V0IC0gYmVnaW4pOwotCWxlbiAtPSAob2Zmc2V0IC0gYmVnaW4pOwotCWlmKGxlbiA+IGxlbmd0aCkKLQkJbGVuID0gbGVuZ3RoOwotCWlmKGxlbiA8IDApCi0JCWxlbiA9IDA7Ci0JcmV0dXJuIGxlbjsKKwlpZiAoc2l6ZW9mKHNpemVfdCkgPD0gc2l6ZW9mKGludCkpCisJCWZvcm1hdCA9IFNNQUxMX1NUUklORzsKKwllbHNlCisJCWZvcm1hdCA9IEJJR19TVFJJTkc7CisJcmV0dXJuIHNlcV9wcmludGYocywgZm9ybWF0LAorCQkJICBzaHAtPnNobV9wZXJtLmtleSwKKwkJCSAgc2hwLT5pZCwKKwkJCSAgc2hwLT5zaG1fZmxhZ3MsCisJCQkgIHNocC0+c2htX3NlZ3N6LAorCQkJICBzaHAtPnNobV9jcHJpZCwKKwkJCSAgc2hwLT5zaG1fbHByaWQsCisJCQkgIGlzX2ZpbGVfaHVnZXBhZ2VzKHNocC0+c2htX2ZpbGUpID8gKGZpbGVfY291bnQoc2hwLT5zaG1fZmlsZSkgLSAxKSA6IHNocC0+c2htX25hdHRjaCwKKwkJCSAgc2hwLT5zaG1fcGVybS51aWQsCisJCQkgIHNocC0+c2htX3Blcm0uZ2lkLAorCQkJICBzaHAtPnNobV9wZXJtLmN1aWQsCisJCQkgIHNocC0+c2htX3Blcm0uY2dpZCwKKwkJCSAgc2hwLT5zaG1fYXRpbSwKKwkJCSAgc2hwLT5zaG1fZHRpbSwKKwkJCSAgc2hwLT5zaG1fY3RpbSk7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2lwYy91dGlsLmMgYi9pcGMvdXRpbC5jCmluZGV4IGUwMGMzNWYuLjEwZTgzNmQgMTAwNjQ0Ci0tLSBhL2lwYy91dGlsLmMKKysrIGIvaXBjL3V0aWwuYwpAQCAtMjQsMTEgKzI0LDIwIEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogCiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCiAjaW5jbHVkZSAidXRpbC5oIgogCitzdHJ1Y3QgaXBjX3Byb2NfaWZhY2UgeworCWNvbnN0IGNoYXIgKnBhdGg7CisJY29uc3QgY2hhciAqaGVhZGVyOworCXN0cnVjdCBpcGNfaWRzICppZHM7CisJaW50ICgqc2hvdykoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7Cit9OworCiAvKioKICAqCWlwY19pbml0CS0JaW5pdGlhbGlzZSBJUEMgc3Vic3lzdGVtCiAgKgpAQCAtODYsNiArOTUsNDMgQEAKIAkJaWRzLT5lbnRyaWVzLT5wW2ldID0gTlVMTDsKIH0KIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeXN2aXBjX3Byb2NfZm9wczsKKy8qKgorICoJaXBjX2luaXRfcHJvY19pbnRlcmZhY2UJLSAgQ3JlYXRlIGEgcHJvYyBpbnRlcmZhY2UgZm9yIHN5c2lwYyB0eXBlcworICoJCQkJICAgdXNpbmcgYSBzZXFfZmlsZSBpbnRlcmZhY2UuCisgKglAcGF0aDogUGF0aCBpbiBwcm9jZnMKKyAqCUBoZWFkZXI6IEJhbm5lciB0byBiZSBwcmludGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgKglAaWRzOiBpcGMgaWQgdGFibGUgdG8gaXRlcmF0ZS4KKyAqCUBzaG93OiBzaG93IHJvdXRpbmUuCisgKi8KK3ZvaWQgX19pbml0IGlwY19pbml0X3Byb2NfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmhlYWRlciwKKwkJCQkgICAgc3RydWN0IGlwY19pZHMgKmlkcywKKwkJCQkgICAgaW50ICgqc2hvdykoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKikpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGU7CisJc3RydWN0IGlwY19wcm9jX2lmYWNlICppZmFjZTsKKworCWlmYWNlID0ga21hbGxvYyhzaXplb2YoKmlmYWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpZmFjZSkKKwkJcmV0dXJuOworCWlmYWNlLT5wYXRoCT0gcGF0aDsKKwlpZmFjZS0+aGVhZGVyCT0gaGVhZGVyOworCWlmYWNlLT5pZHMJPSBpZHM7CisJaWZhY2UtPnNob3cJPSBzaG93OworCisJcGRlID0gY3JlYXRlX3Byb2NfZW50cnkocGF0aCwKKwkJCQlTX0lSVUdPLCAgICAgICAgLyogd29ybGQgcmVhZGFibGUgKi8KKwkJCQlOVUxMICAgICAgICAgICAgLyogcGFyZW50IGRpciAqLyk7CisJaWYgKHBkZSkgeworCQlwZGUtPmRhdGEgPSBpZmFjZTsKKwkJcGRlLT5wcm9jX2ZvcHMgPSAmc3lzdmlwY19wcm9jX2ZvcHM7CisJfSBlbHNlIHsKKwkJa2ZyZWUoaWZhY2UpOworCX0KK30KKyNlbmRpZgorCiAvKioKICAqCWlwY19maW5ka2V5CS0JZmluZCBhIGtleSBpbiBhbiBpcGMgaWRlbnRpZmllciBzZXQJCiAgKglAaWRzOiBJZGVudGlmaWVyIHNldApAQCAtNTc4LDMgKzYyNCwxMTMgQEAKIH0KIAogI2VuZGlmIC8qIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHZvaWQgKnN5c3ZpcGNfcHJvY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXQsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBpcGNfcHJvY19pZmFjZSAqaWZhY2UgPSBzLT5wcml2YXRlOworCXN0cnVjdCBrZXJuX2lwY19wZXJtICppcGMgPSBpdDsKKwlsb2ZmX3QgcDsKKworCS8qIElmIHdlIGhhZCBhbiBpcGMgaWQgbG9ja2VkIGJlZm9yZSwgdW5sb2NrIGl0ICovCisJaWYgKGlwYyAmJiBpcGMgIT0gU0VRX1NUQVJUX1RPS0VOKQorCQlpcGNfdW5sb2NrKGlwYyk7CisKKwkvKgorCSAqIHAgPSAqcG9zIC0gMSAoYmVjYXVzZSBpZCAwIHN0YXJ0cyBhdCBwb3NpdGlvbiAxKQorCSAqICAgICAgICAgICsgMSAoYmVjYXVzZSB3ZSBpbmNyZW1lbnQgdGhlIHBvc2l0aW9uIGJ5IG9uZSkKKwkgKi8KKwlmb3IgKHAgPSAqcG9zOyBwIDw9IGlmYWNlLT5pZHMtPm1heF9pZDsgcCsrKSB7CisJCWlmICgoaXBjID0gaXBjX2xvY2soaWZhY2UtPmlkcywgcCkpICE9IE5VTEwpIHsKKwkJCSpwb3MgPSBwICsgMTsKKwkJCXJldHVybiBpcGM7CisJCX0KKwl9CisKKwkvKiBPdXQgb2YgcmFuZ2UgLSByZXR1cm4gTlVMTCB0byB0ZXJtaW5hdGUgaXRlcmF0aW9uICovCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBGaWxlIHBvc2l0aW9uczogcG9zIDAgLT4gaGVhZGVyLCBwb3MgbiAtPiBpcGMgaWQgKyAxLgorICogU2VxRmlsZSBpdGVyYXRvcjogaXRlcmF0b3IgdmFsdWUgbG9ja2VkIHNocCBvciBTRVFfVE9LRU5fU1RBUlQuCisgKi8KK3N0YXRpYyB2b2lkICpzeXN2aXBjX3Byb2Nfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXBjX3Byb2NfaWZhY2UgKmlmYWNlID0gcy0+cHJpdmF0ZTsKKwlzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXBjOworCWxvZmZfdCBwOworCisJLyoKKwkgKiBUYWtlIHRoZSBsb2NrIC0gdGhpcyB3aWxsIGJlIHJlbGVhc2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nCisJICogY2FsbCB0byBzdG9wKCkuCisJICovCisJZG93bigmaWZhY2UtPmlkcy0+c2VtKTsKKworCS8qIHBvcyA8IDAgaXMgaW52YWxpZCAqLworCWlmICgqcG9zIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBwb3MgPT0gMCBtZWFucyBoZWFkZXIgKi8KKwlpZiAoKnBvcyA9PSAwKQorCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOworCisJLyogRmluZCB0aGUgKHBvcy0xKXRoIGlwYyAqLworCWZvciAocCA9ICpwb3MgLSAxOyBwIDw9IGlmYWNlLT5pZHMtPm1heF9pZDsgcCsrKSB7CisJCWlmICgoaXBjID0gaXBjX2xvY2soaWZhY2UtPmlkcywgcCkpICE9IE5VTEwpIHsKKwkJCSpwb3MgPSBwICsgMTsKKwkJCXJldHVybiBpcGM7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHN5c3ZpcGNfcHJvY19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXQpCit7CisJc3RydWN0IGtlcm5faXBjX3Blcm0gKmlwYyA9IGl0OworCXN0cnVjdCBpcGNfcHJvY19pZmFjZSAqaWZhY2UgPSBzLT5wcml2YXRlOworCisJLyogSWYgd2UgaGFkIGEgbG9ja2VkIHNlZ21lbnQsIHJlbGVhc2UgaXQgKi8KKwlpZiAoaXBjICYmIGlwYyAhPSBTRVFfU1RBUlRfVE9LRU4pCisJCWlwY191bmxvY2soaXBjKTsKKworCS8qIFJlbGVhc2UgdGhlIGxvY2sgd2UgdG9vayBpbiBzdGFydCgpICovCisJdXAoJmlmYWNlLT5pZHMtPnNlbSk7Cit9CisKK3N0YXRpYyBpbnQgc3lzdmlwY19wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCkKK3sKKwlzdHJ1Y3QgaXBjX3Byb2NfaWZhY2UgKmlmYWNlID0gcy0+cHJpdmF0ZTsKKworCWlmIChpdCA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXJldHVybiBzZXFfcHV0cyhzLCBpZmFjZS0+aGVhZGVyKTsKKworCXJldHVybiBpZmFjZS0+c2hvdyhzLCBpdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc3lzdmlwY19wcm9jX3NlcW9wcyA9IHsKKwkuc3RhcnQgPSBzeXN2aXBjX3Byb2Nfc3RhcnQsCisJLnN0b3AgID0gc3lzdmlwY19wcm9jX3N0b3AsCisJLm5leHQgID0gc3lzdmlwY19wcm9jX25leHQsCisJLnNob3cgID0gc3lzdmlwY19wcm9jX3Nob3csCit9OworCitzdGF0aWMgaW50IHN5c3ZpcGNfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKSB7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZzeXN2aXBjX3Byb2Nfc2Vxb3BzKTsKKwlpZiAoIXJldCkgeworCQlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCXNlcS0+cHJpdmF0ZSA9IFBERShpbm9kZSktPmRhdGE7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5c3ZpcGNfcHJvY19mb3BzID0geworCS5vcGVuICAgID0gc3lzdmlwY19wcm9jX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwpkaWZmIC0tZ2l0IGEvaXBjL3V0aWwuaCBiL2lwYy91dGlsLmgKaW5kZXggNDQzNDhjYS4uZmM5YTI4YiAxMDA2NDQKLS0tIGEvaXBjL3V0aWwuaAorKysgYi9pcGMvdXRpbC5oCkBAIC0zMCw3ICszMCwxNSBAQAogCXN0cnVjdCBpcGNfaWRfYXJ5KiBlbnRyaWVzOwogfTsKIAorc3RydWN0IHNlcV9maWxlOwogdm9pZCBfX2luaXQgaXBjX2luaXRfaWRzKHN0cnVjdCBpcGNfaWRzKiBpZHMsIGludCBzaXplKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwordm9pZCBfX2luaXQgaXBjX2luaXRfcHJvY19pbnRlcmZhY2UoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqaGVhZGVyLAorCQkJCSAgICBzdHJ1Y3QgaXBjX2lkcyAqaWRzLAorCQkJCSAgICBpbnQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKSk7CisjZWxzZQorI2RlZmluZSBpcGNfaW5pdF9wcm9jX2ludGVyZmFjZShwYXRoLCBoZWFkZXIsIGlkcywgc2hvdykgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKIAogLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBpZHMtPnNlbSBhY3F1aXJlZC4qLwogaW50IGlwY19maW5ka2V5KHN0cnVjdCBpcGNfaWRzKiBpZHMsIGtleV90IGtleSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggY2IwNWNkMC4uZmY0ZGMwMiAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTIsNiArMTIsNyBAQAogb2JqLSQoQ09ORklHX0ZVVEVYKSArPSBmdXRleC5vCiBvYmotJChDT05GSUdfR0VORVJJQ19JU0FfRE1BKSArPSBkbWEubwogb2JqLSQoQ09ORklHX1NNUCkgKz0gY3B1Lm8gc3BpbmxvY2subworb2JqLSQoQ09ORklHX0RFQlVHX1NQSU5MT0NLKSArPSBzcGlubG9jay5vCiBvYmotJChDT05GSUdfVUlEMTYpICs9IHVpZDE2Lm8KIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBtb2R1bGUubwogb2JqLSQoQ09ORklHX0tBTExTWU1TKSArPSBrYWxsc3ltcy5vCkBAIC0yNyw2ICsyOCw3IEBACiBvYmotJChDT05GSUdfQVVESVRTWVNDQUxMKSArPSBhdWRpdHNjLm8KIG9iai0kKENPTkZJR19LUFJPQkVTKSArPSBrcHJvYmVzLm8KIG9iai0kKENPTkZJR19TWVNGUykgKz0ga3N5c2ZzLm8KK29iai0kKENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUCkgKz0gc29mdGxvY2t1cC5vCiBvYmotJChDT05GSUdfR0VORVJJQ19IQVJESVJRUykgKz0gaXJxLwogb2JqLSQoQ09ORklHX0NSQVNIX0RVTVApICs9IGNyYXNoX2R1bXAubwogb2JqLSQoQ09ORklHX1NFQ0NPTVApICs9IHNlY2NvbXAubwpkaWZmIC0tZ2l0IGEva2VybmVsL2FjY3QuYyBiL2tlcm5lbC9hY2N0LmMKaW5kZXggNDE2OGY2My4uYjc1NmY1MiAxMDA2NDQKLS0tIGEva2VybmVsL2FjY3QuYworKysgYi9rZXJuZWwvYWNjdC5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIH0KIAogLyoKLSAqIENsb3NlIHRoZSBvbGQgYWNjb3V0aW5nIGZpbGUgKGlmIGN1cnJlbnRseSBvcGVuKSBhbmQgdGhlbiByZXBsYWNlCisgKiBDbG9zZSB0aGUgb2xkIGFjY291bnRpbmcgZmlsZSAoaWYgY3VycmVudGx5IG9wZW4pIGFuZCB0aGVuIHJlcGxhY2UKICAqIGl0IHdpdGggZmlsZSAoaWYgbm9uLU5VTEwpLgogICoKICAqIE5PVEU6IGFjY3RfZ2xvYmFscy5sb2NrIE1VU1QgYmUgaGVsZCBvbiBlbnRyeSBhbmQgZXhpdC4KQEAgLTE5OSwxMSArMTk5LDE2IEBACiAJfQogfQogCi0vKgotICogIHN5c19hY2N0KCkgaXMgdGhlIG9ubHkgc3lzdGVtIGNhbGwgbmVlZGVkIHRvIGltcGxlbWVudCBwcm9jZXNzCi0gKiAgYWNjb3VudGluZy4gSXQgdGFrZXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2hlcmUgYWNjb3VudGluZyByZWNvcmRzCi0gKiAgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIHRoZSBmaWxlbmFtZSBpcyBOVUxMLCBhY2NvdW50aW5nIHdpbGwgYmUKLSAqICBzaHV0ZG93bi4KKy8qKgorICogc3lzX2FjY3QgLSBlbmFibGUvZGlzYWJsZSBwcm9jZXNzIGFjY291bnRpbmcKKyAqIEBuYW1lOiBmaWxlIG5hbWUgZm9yIGFjY291bnRpbmcgcmVjb3JkcyBvciBOVUxMIHRvIHNodXRkb3duIGFjY291bnRpbmcKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJybm8gdmFsdWVzIGZvciBmYWlsdXJlLgorICoKKyAqIHN5c19hY2N0KCkgaXMgdGhlIG9ubHkgc3lzdGVtIGNhbGwgbmVlZGVkIHRvIGltcGxlbWVudCBwcm9jZXNzCisgKiBhY2NvdW50aW5nLiBJdCB0YWtlcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3aGVyZSBhY2NvdW50aW5nIHJlY29yZHMKKyAqIHNob3VsZCBiZSB3cml0dGVuLiBJZiB0aGUgZmlsZW5hbWUgaXMgTlVMTCwgYWNjb3VudGluZyB3aWxsIGJlCisgKiBzaHV0ZG93bi4KICAqLwogYXNtbGlua2FnZSBsb25nIHN5c19hY2N0KGNvbnN0IGNoYXIgX191c2VyICpuYW1lKQogewpAQCAtMjIwLDcgKzIyNSw3IEBACiAJCQlyZXR1cm4gKFBUUl9FUlIodG1wKSk7CiAJCX0KIAkJLyogRGlmZmVyZW5jZSBmcm9tIEJTRCAtIHRoZXkgZG9uJ3QgZG8gT19BUFBFTkQgKi8KLQkJZmlsZSA9IGZpbHBfb3Blbih0bXAsIE9fV1JPTkxZfE9fQVBQRU5ELCAwKTsKKwkJZmlsZSA9IGZpbHBfb3Blbih0bXAsIE9fV1JPTkxZfE9fQVBQRU5EfE9fTEFSR0VGSUxFLCAwKTsKIAkJcHV0bmFtZSh0bXApOwogCQlpZiAoSVNfRVJSKGZpbGUpKSB7CiAJCQlyZXR1cm4gKFBUUl9FUlIoZmlsZSkpOwpAQCAtMjUwLDkgKzI1NSwxMiBAQAogCXJldHVybiAoMCk7CiB9CiAKLS8qCi0gKiBJZiB0aGUgYWNjb3V0aW5nIGlzIHR1cm5lZCBvbiBmb3IgYSBmaWxlIGluIHRoZSBmaWxlc3lzdGVtIHBvaW50ZWQKLSAqIHRvIGJ5IHNiLCB0dXJuIGFjY291dGluZyBvZmYuCisvKioKKyAqIGFjY3RfYXV0b19jbG9zZSAtIHR1cm4gb2ZmIGEgZmlsZXN5c3RlbSdzIGFjY291bnRpbmcgaWYgaXQgaXMgb24KKyAqIEBzYjogc3VwZXIgYmxvY2sgZm9yIHRoZSBmaWxlc3lzdGVtCisgKgorICogSWYgdGhlIGFjY291bnRpbmcgaXMgdHVybmVkIG9uIGZvciBhIGZpbGUgaW4gdGhlIGZpbGVzeXN0ZW0gcG9pbnRlZAorICogdG8gYnkgc2IsIHR1cm4gYWNjb3VudGluZyBvZmYuCiAgKi8KIHZvaWQgYWNjdF9hdXRvX2Nsb3NlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CkBAIC01MDMsOCArNTExLDExIEBACiAJc2V0X2ZzKGZzKTsKIH0KIAotLyoKKy8qKgogICogYWNjdF9wcm9jZXNzIC0gbm93IGp1c3QgYSB3cmFwcGVyIGFyb3VuZCBkb19hY2N0X3Byb2Nlc3MKKyAqIEBleGl0Y29kZTogdGFzayBleGl0IGNvZGUKKyAqCisgKiBoYW5kbGVzIHByb2Nlc3MgYWNjb3VudGluZyBmb3IgYW4gZXhpdGluZyB0YXNrCiAgKi8KIHZvaWQgYWNjdF9wcm9jZXNzKGxvbmcgZXhpdGNvZGUpCiB7CkBAIC01MzAsOSArNTQxLDkgQEAKIH0KIAogCi0vKgotICogYWNjdF91cGRhdGVfaW50ZWdyYWxzCi0gKiAgICAtICB1cGRhdGUgbW0gaW50ZWdyYWwgZmllbGRzIGluIHRhc2tfc3RydWN0CisvKioKKyAqIGFjY3RfdXBkYXRlX2ludGVncmFscyAtIHVwZGF0ZSBtbSBpbnRlZ3JhbCBmaWVsZHMgaW4gdGFza19zdHJ1Y3QKKyAqIEB0c2s6IHRhc2tfc3RydWN0IGZvciBhY2NvdW50aW5nCiAgKi8KIHZvaWQgYWNjdF91cGRhdGVfaW50ZWdyYWxzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewpAQCAtNTQ3LDkgKzU1OCw5IEBACiAJfQogfQogCi0vKgotICogYWNjdF9jbGVhcl9pbnRlZ3JhbHMKLSAqICAgIC0gY2xlYXIgdGhlIG1tIGludGVncmFsIGZpZWxkcyBpbiB0YXNrX3N0cnVjdAorLyoqCisgKiBhY2N0X2NsZWFyX2ludGVncmFscyAtIGNsZWFyIHRoZSBtbSBpbnRlZ3JhbCBmaWVsZHMgaW4gdGFza19zdHJ1Y3QKKyAqIEB0c2s6IHRhc2tfc3RydWN0IHdob3NlIGFjY291bnRpbmcgZmllbGRzIGFyZSBjbGVhcmVkCiAgKi8KIHZvaWQgYWNjdF9jbGVhcl9pbnRlZ3JhbHMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CmRpZmYgLS1naXQgYS9rZXJuZWwvY29tcGF0LmMgYi9rZXJuZWwvY29tcGF0LmMKaW5kZXggZGRmY2FhYS4uMTAyMjk2ZSAxMDA2NDQKLS0tIGEva2VybmVsL2NvbXBhdC5jCisrKyBiL2tlcm5lbC9jb21wYXQuYwpAQCAtNDgsOCArNDgsNyBAQAogCWlmICghdGltZV9hZnRlcihleHBpcmUsIG5vdykpCiAJCXJldHVybiAwOwogCi0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JZXhwaXJlID0gc2NoZWR1bGVfdGltZW91dChleHBpcmUgLSBub3cpOworCWV4cGlyZSA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShleHBpcmUgLSBub3cpOwogCWlmIChleHBpcmUgPT0gMCkKIAkJcmV0dXJuIDA7CiAKQEAgLTgyLDggKzgxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlleHBpcmUgPSB0aW1lc3BlY190b19qaWZmaWVzKCZ0KSArICh0LnR2X3NlYyB8fCB0LnR2X25zZWMpOwotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCWV4cGlyZSA9IHNjaGVkdWxlX3RpbWVvdXQoZXhwaXJlKTsKKwlleHBpcmUgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoZXhwaXJlKTsKIAlpZiAoZXhwaXJlID09IDApCiAJCXJldHVybiAwOwogCkBAIC03OTUsOCArNzkzLDcgQEAKIAkJCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCi0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lb3V0KTsKIAogCQkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJCQlzaWcgPSBkZXF1ZXVlX3NpZ25hbChjdXJyZW50LCAmcywgJmluZm8pOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IDhhYjFiNGUuLjQwN2I1ZjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTE4Miw2ICsxODIsMzcgQEAKIHN0YXRpYyBERUNMQVJFX01VVEVYKGNwdXNldF9zZW0pOwogCiAvKgorICogVGhlIGdsb2JhbCBjcHVzZXQgc2VtYXBob3JlIGNwdXNldF9zZW0gY2FuIGJlIG5lZWRlZCBieSB0aGUKKyAqIG1lbW9yeSBhbGxvY2F0b3IgdG8gdXBkYXRlIGEgdGFza3MgbWVtc19hbGxvd2VkIChzZWUgdGhlIGNhbGxzCisgKiB0byBjcHVzZXRfdXBkYXRlX2N1cnJlbnRfbWVtc19hbGxvd2VkKCkpIG9yIHRvIHdhbGsgdXAgdGhlCisgKiBjcHVzZXQgaGllcmFyY2h5IHRvIGZpbmQgYSBtZW1fZXhjbHVzaXZlIGNwdXNldCBzZWUgdGhlIGNhbGxzCisgKiB0byBjcHVzZXRfZXhjbF9ub2Rlc19vdmVybGFwKCkpLgorICoKKyAqIEJ1dCBpZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gaXMgYmVpbmcgZG9uZSBieSBjcHVzZXQuYyBjb2RlLCBpdAorICogdXN1YWxseSBhbHJlYWR5IGhvbGRzIGNwdXNldF9zZW0uICBEb3VibGUgdHJpcHBpbmcgb24gYSBrZXJuZWwKKyAqIHNlbWFwaG9yZSBkZWFkbG9ja3MgdGhlIGN1cnJlbnQgdGFzaywgYW5kIGFueSBvdGhlciB0YXNrIHRoYXQKKyAqIHN1YnNlcXVlbnRseSB0cmllcyB0byBvYnRhaW4gdGhlIGxvY2suCisgKgorICogUnVuIGFsbCB1cCdzIGFuZCBkb3duJ3Mgb24gY3B1c2V0X3NlbSB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKyAqIHdyYXBwZXJzLCB3aGljaCB3aWxsIGRldGVjdCB0aGlzIG5lc3RlZCBsb2NraW5nLCBhbmQgYXZvaWQKKyAqIGRlYWRsb2NraW5nLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfZG93bihzdHJ1Y3Qgc2VtYXBob3JlICpwc2VtKQoreworCWlmIChjdXJyZW50LT5jcHVzZXRfc2VtX25lc3RfZGVwdGggPT0gMCkKKwkJZG93bihwc2VtKTsKKwljdXJyZW50LT5jcHVzZXRfc2VtX25lc3RfZGVwdGgrKzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF91cChzdHJ1Y3Qgc2VtYXBob3JlICpwc2VtKQoreworCWN1cnJlbnQtPmNwdXNldF9zZW1fbmVzdF9kZXB0aC0tOworCWlmIChjdXJyZW50LT5jcHVzZXRfc2VtX25lc3RfZGVwdGggPT0gMCkKKwkJdXAocHNlbSk7Cit9CisKKy8qCiAgKiBBIGNvdXBsZSBvZiBmb3J3YXJkIGRlY2xhcmF0aW9ucyByZXF1aXJlZCwgZHVlIHRvIGN5Y2xpYyByZWZlcmVuY2UgbG9vcDoKICAqICBjcHVzZXRfbWtkaXIgLT4gY3B1c2V0X2NyZWF0ZSAtPiBjcHVzZXRfcG9wdWxhdGVfZGlyIC0+IGNwdXNldF9hZGRfZmlsZQogICogIC0+IGNwdXNldF9jcmVhdGVfZmlsZSAtPiBjcHVzZXRfZGlyX2lub2RlX29wZXJhdGlvbnMgLT4gY3B1c2V0X21rZGlyLgpAQCAtNTIyLDE5ICs1NTMsMTAgQEAKICAqIFJlZnJlc2ggY3VycmVudCB0YXNrcyBtZW1zX2FsbG93ZWQgYW5kIG1lbXNfZ2VuZXJhdGlvbiBmcm9tCiAgKiBjdXJyZW50IHRhc2tzIGNwdXNldC4gIENhbGwgd2l0aCBjcHVzZXRfc2VtIGhlbGQuCiAgKgotICogQmUgc3VyZSB0byBjYWxsIHJlZnJlc2hfbWVtcygpIG9uIGFueSBjcHVzZXQgb3BlcmF0aW9uIHdoaWNoCi0gKiAoMSkgaG9sZHMgY3B1c2V0X3NlbSwgYW5kICgyKSBtaWdodCBwb3NzaWJseSBhbGxvYyBtZW1vcnkuCi0gKiBDYWxsIGFmdGVyIG9idGFpbmluZyBjcHVzZXRfc2VtIGxvY2ssIGJlZm9yZSBhbnkgcG9zc2libGUKLSAqIGFsbG9jYXRpb24uICBPdGhlcndpc2Ugb25lIHJpc2tzIHRyeWluZyB0byBhbGxvY2F0ZSBtZW1vcnkKLSAqIHdoaWxlIHRoZSB0YXNrIGNwdXNldF9tZW1zX2dlbmVyYXRpb24gaXMgbm90IHRoZSBzYW1lIGFzCi0gKiB0aGUgbWVtc19nZW5lcmF0aW9uIGluIGl0cyBjcHVzZXQsIHdoaWNoIHdvdWxkIGRlYWRsb2NrIG9uCi0gKiBjcHVzZXRfc2VtIGluIGNwdXNldF91cGRhdGVfY3VycmVudF9tZW1zX2FsbG93ZWQoKS4KLSAqCi0gKiBTaW5jZSB3ZSBob2xkIGNwdXNldF9zZW0sIG9uY2UgcmVmcmVzaF9tZW1zKCkgaXMgY2FsbGVkLCB0aGUKLSAqIHRlc3QgKGN1cnJlbnQtPmNwdXNldF9tZW1zX2dlbmVyYXRpb24gIT0gY3MtPm1lbXNfZ2VuZXJhdGlvbikKLSAqIGluIGNwdXNldF91cGRhdGVfY3VycmVudF9tZW1zX2FsbG93ZWQoKSB3aWxsIHJlbWFpbiBmYWxzZSwKLSAqIHVudGlsIHdlIGRyb3AgY3B1c2V0X3NlbS4gIEFueW9uZSBlbHNlIHdobyB3b3VsZCBjaGFuZ2Ugb3VyCi0gKiBjcHVzZXRzIG1lbXNfZ2VuZXJhdGlvbiBuZWVkcyB0byBsb2NrIGNwdXNldF9zZW0gZmlyc3QuCisgKiBUaGlzIHJvdXRpbmUgaXMgbmVlZGVkIHRvIHVwZGF0ZSB0aGUgcGVyLXRhc2sgbWVtc19hbGxvd2VkCisgKiBkYXRhLCB3aXRoaW4gdGhlIHRhc2tzIGNvbnRleHQsIHdoZW4gaXQgaXMgdHJ5aW5nIHRvIGFsbG9jYXRlCisgKiBtZW1vcnkgKGluIHZhcmlvdXMgbW0vbWVtcG9saWN5LmMgcm91dGluZXMpIGFuZCBub3RpY2VzCisgKiB0aGF0IHNvbWUgb3RoZXIgdGFzayBoYXMgYmVlbiBtb2RpZnlpbmcgaXRzIGNwdXNldC4KICAqLwogCiBzdGF0aWMgdm9pZCByZWZyZXNoX21lbXModm9pZCkKQEAgLTYyOCwxMyArNjUwLDYgQEAKICAqIGxvY2tfY3B1X2hvdHBsdWcoKS91bmxvY2tfY3B1X2hvdHBsdWcoKSBwYWlyLgogICovCiAKLS8qCi0gKiBIYWNrIHRvIGF2b2lkIDIuNi4xMyBwYXJ0aWFsIG5vZGUgZHluYW1pYyBzY2hlZCBkb21haW4gYnVnLgotICogRGlzYWJsZSBsZXR0aW5nICdjcHVfZXhjbHVzaXZlJyBjcHVzZXRzIGRlZmluZSBkeW5hbWljIHNjaGVkCi0gKiBkb21haW5zLCB1bnRpbCB0aGUgc2NoZWQgZG9tYWluIGNhbiBoYW5kbGUgcGFydGlhbCBub2Rlcy4KLSAqIFJlbW92ZSB0aGlzICNpZiBoYWNrZXJ5IHdoZW4gc2NoZWQgZG9tYWlucyBmaXhlZC4KLSAqLwotI2lmIDAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9jcHVfZG9tYWlucyhzdHJ1Y3QgY3B1c2V0ICpjdXIpCiB7CiAJc3RydWN0IGNwdXNldCAqYywgKnBhciA9IGN1ci0+cGFyZW50OwpAQCAtNjc1LDExICs2OTAsNiBAQAogCXBhcnRpdGlvbl9zY2hlZF9kb21haW5zKCZwc3BhbiwgJmNzcGFuKTsKIAl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIH0KLSNlbHNlCi1zdGF0aWMgdm9pZCB1cGRhdGVfY3B1X2RvbWFpbnMoc3RydWN0IGNwdXNldCAqY3VyKQotewotfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgdXBkYXRlX2NwdW1hc2soc3RydWN0IGNwdXNldCAqY3MsIGNoYXIgKmJ1ZikKIHsKQEAgLTg1Miw3ICs4NjIsNyBAQAogCX0KIAlidWZmZXJbbmJ5dGVzXSA9IDA7CS8qIG51bC10ZXJtaW5hdGUgKi8KIAotCWRvd24oJmNwdXNldF9zZW0pOworCWNwdXNldF9kb3duKCZjcHVzZXRfc2VtKTsKIAogCWlmIChpc19yZW1vdmVkKGNzKSkgewogCQlyZXR2YWwgPSAtRU5PREVWOwpAQCAtODg2LDcgKzg5Niw3IEBACiAJaWYgKHJldHZhbCA9PSAwKQogCQlyZXR2YWwgPSBuYnl0ZXM7CiBvdXQyOgotCXVwKCZjcHVzZXRfc2VtKTsKKwljcHVzZXRfdXAoJmNwdXNldF9zZW0pOwogCWNwdXNldF9yZWxlYXNlX2FnZW50KHBhdGhidWYpOwogb3V0MToKIAlrZnJlZShidWZmZXIpOwpAQCAtOTI2LDkgKzkzNiw5IEBACiB7CiAJY3B1bWFza190IG1hc2s7CiAKLQlkb3duKCZjcHVzZXRfc2VtKTsKKwljcHVzZXRfZG93bigmY3B1c2V0X3NlbSk7CiAJbWFzayA9IGNzLT5jcHVzX2FsbG93ZWQ7Ci0JdXAoJmNwdXNldF9zZW0pOworCWNwdXNldF91cCgmY3B1c2V0X3NlbSk7CiAKIAlyZXR1cm4gY3B1bGlzdF9zY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCBtYXNrKTsKIH0KQEAgLTkzNyw5ICs5NDcsOSBAQAogewogCW5vZGVtYXNrX3QgbWFzazsKIAotCWRvd24oJmNwdXNldF9zZW0pOworCWNwdXNldF9kb3duKCZjcHVzZXRfc2VtKTsKIAltYXNrID0gY3MtPm1lbXNfYWxsb3dlZDsKLQl1cCgmY3B1c2V0X3NlbSk7CisJY3B1c2V0X3VwKCZjcHVzZXRfc2VtKTsKIAogCXJldHVybiBub2RlbGlzdF9zY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCBtYXNrKTsKIH0KQEAgLTk4NCw2ICs5OTQsMTAgQEAKIAkqcysrID0gJ1xuJzsKIAkqcyA9ICdcMCc7CiAKKwkvKiBEbyBub3RoaW5nIGlmICpwcG9zIGlzIGF0IHRoZSBlb2Ygb3IgYmV5b25kIHRoZSBlb2YuICovCisJaWYgKHMgLSBwYWdlIDw9ICpwcG9zKQorCQlyZXR1cm4gMDsKKwogCXN0YXJ0ID0gcGFnZSArICpwcG9zOwogCW4gPSBzIC0gc3RhcnQ7CiAJcmV0dmFsID0gbiAtIGNvcHlfdG9fdXNlcihidWYsIHN0YXJ0LCBtaW4obiwgbmJ5dGVzKSk7CkBAIC0xMzQyLDggKzEzNTYsNyBAQAogCWlmICghY3MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZG93bigmY3B1c2V0X3NlbSk7Ci0JcmVmcmVzaF9tZW1zKCk7CisJY3B1c2V0X2Rvd24oJmNwdXNldF9zZW0pOwogCWNzLT5mbGFncyA9IDA7CiAJaWYgKG5vdGlmeV9vbl9yZWxlYXNlKHBhcmVudCkpCiAJCXNldF9iaXQoQ1NfTk9USUZZX09OX1JFTEVBU0UsICZjcy0+ZmxhZ3MpOwpAQCAtMTM2OCwxNCArMTM4MSwxNCBAQAogCSAqIHdpbGwgZG93bigpIHRoaXMgbmV3IGRpcmVjdG9yeSdzIGlfc2VtIGFuZCBpZiB3ZSByYWNlIHdpdGgKIAkgKiBhbm90aGVyIG1rZGlyLCB3ZSBtaWdodCBkZWFkbG9jay4KIAkgKi8KLQl1cCgmY3B1c2V0X3NlbSk7CisJY3B1c2V0X3VwKCZjcHVzZXRfc2VtKTsKIAogCWVyciA9IGNwdXNldF9wb3B1bGF0ZV9kaXIoY3MtPmRlbnRyeSk7CiAJLyogSWYgZXJyIDwgMCwgd2UgaGF2ZSBhIGhhbGYtZmlsbGVkIGRpcmVjdG9yeSAtIG9oIHdlbGwgOykgKi8KIAlyZXR1cm4gMDsKIGVycjoKIAlsaXN0X2RlbCgmY3MtPnNpYmxpbmcpOwotCXVwKCZjcHVzZXRfc2VtKTsKKwljcHVzZXRfdXAoJmNwdXNldF9zZW0pOwogCWtmcmVlKGNzKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTM5NywxNCArMTQxMCwxMyBAQAogCiAJLyogdGhlIHZmcyBob2xkcyBib3RoIGlub2RlLT5pX3NlbSBhbHJlYWR5ICovCiAKLQlkb3duKCZjcHVzZXRfc2VtKTsKLQlyZWZyZXNoX21lbXMoKTsKKwljcHVzZXRfZG93bigmY3B1c2V0X3NlbSk7CiAJaWYgKGF0b21pY19yZWFkKCZjcy0+Y291bnQpID4gMCkgewotCQl1cCgmY3B1c2V0X3NlbSk7CisJCWNwdXNldF91cCgmY3B1c2V0X3NlbSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWlmICghbGlzdF9lbXB0eSgmY3MtPmNoaWxkcmVuKSkgewotCQl1cCgmY3B1c2V0X3NlbSk7CisJCWNwdXNldF91cCgmY3B1c2V0X3NlbSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCXBhcmVudCA9IGNzLT5wYXJlbnQ7CkBAIC0xNDIwLDcgKzE0MzIsNyBAQAogCXNwaW5fdW5sb2NrKCZkLT5kX2xvY2spOwogCWNwdXNldF9kX3JlbW92ZV9kaXIoZCk7CiAJZHB1dChkKTsKLQl1cCgmY3B1c2V0X3NlbSk7CisJY3B1c2V0X3VwKCZjcHVzZXRfc2VtKTsKIAljcHVzZXRfcmVsZWFzZV9hZ2VudChwYXRoYnVmKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MjMsMTAgKzE1MzUsMTAgQEAKIAlpZiAobm90aWZ5X29uX3JlbGVhc2UoY3MpKSB7CiAJCWNoYXIgKnBhdGhidWYgPSBOVUxMOwogCi0JCWRvd24oJmNwdXNldF9zZW0pOworCQljcHVzZXRfZG93bigmY3B1c2V0X3NlbSk7CiAJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjcy0+Y291bnQpKQogCQkJY2hlY2tfZm9yX3JlbGVhc2UoY3MsICZwYXRoYnVmKTsKLQkJdXAoJmNwdXNldF9zZW0pOworCQljcHVzZXRfdXAoJmNwdXNldF9zZW0pOwogCQljcHVzZXRfcmVsZWFzZV9hZ2VudChwYXRoYnVmKTsKIAl9IGVsc2UgewogCQlhdG9taWNfZGVjKCZjcy0+Y291bnQpOwpAQCAtMTU0NywxMSArMTU1OSwxMSBAQAogewogCWNwdW1hc2tfdCBtYXNrOwogCi0JZG93bigmY3B1c2V0X3NlbSk7CisJY3B1c2V0X2Rvd24oJmNwdXNldF9zZW0pOwogCXRhc2tfbG9jaygoc3RydWN0IHRhc2tfc3RydWN0ICopdHNrKTsKIAlndWFyYW50ZWVfb25saW5lX2NwdXModHNrLT5jcHVzZXQsICZtYXNrKTsKIAl0YXNrX3VubG9jaygoc3RydWN0IHRhc2tfc3RydWN0ICopdHNrKTsKLQl1cCgmY3B1c2V0X3NlbSk7CisJY3B1c2V0X3VwKCZjcHVzZXRfc2VtKTsKIAogCXJldHVybiBtYXNrOwogfQpAQCAtMTU3Niw5ICsxNTg4LDkgQEAKIAlpZiAoIWNzKQogCQlyZXR1cm47CQkvKiB0YXNrIGlzIGV4aXRpbmcgKi8KIAlpZiAoY3VycmVudC0+Y3B1c2V0X21lbXNfZ2VuZXJhdGlvbiAhPSBjcy0+bWVtc19nZW5lcmF0aW9uKSB7Ci0JCWRvd24oJmNwdXNldF9zZW0pOworCQljcHVzZXRfZG93bigmY3B1c2V0X3NlbSk7CiAJCXJlZnJlc2hfbWVtcygpOwotCQl1cCgmY3B1c2V0X3NlbSk7CisJCWNwdXNldF91cCgmY3B1c2V0X3NlbSk7CiAJfQogfQogCkBAIC0xNjExLDE3ICsxNjIzLDExNCBAQAogCXJldHVybiAwOwogfQogCi0vKioKLSAqIGNwdXNldF96b25lX2FsbG93ZWQgLSBpcyB6b25lIHogYWxsb3dlZCBpbiBjdXJyZW50LT5tZW1zX2FsbG93ZWQKLSAqIEB6OiB6b25lIGluIHF1ZXN0aW9uCi0gKgotICogSXMgem9uZSB6IGFsbG93ZWQgaW4gY3VycmVudC0+bWVtc19hbGxvd2VkLCBvciBpcwotICogdGhlIENQVSBpbiBpbnRlcnJ1cHQgY29udGV4dD8gKHpvbmUgaXMgYWx3YXlzIGFsbG93ZWQgaW4gdGhpcyBjYXNlKQorLyoKKyAqIG5lYXJlc3RfZXhjbHVzaXZlX2FuY2VzdG9yKCkgLSBSZXR1cm5zIHRoZSBuZWFyZXN0IG1lbV9leGNsdXNpdmUKKyAqIGFuY2VzdG9yIHRvIHRoZSBzcGVjaWZpZWQgY3B1c2V0LiAgQ2FsbCB3aGlsZSBob2xkaW5nIGNwdXNldF9zZW0uCisgKiBJZiBubyBhbmNlc3RvciBpcyBtZW1fZXhjbHVzaXZlIChhbiB1bnVzdWFsIGNvbmZpZ3VyYXRpb24pLCB0aGVuCisgKiByZXR1cm5zIHRoZSByb290IGNwdXNldC4KICAqLwotaW50IGNwdXNldF96b25lX2FsbG93ZWQoc3RydWN0IHpvbmUgKnopCitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdXNldCAqbmVhcmVzdF9leGNsdXNpdmVfYW5jZXN0b3IoY29uc3Qgc3RydWN0IGNwdXNldCAqY3MpCiB7Ci0JcmV0dXJuIGluX2ludGVycnVwdCgpIHx8Ci0JCW5vZGVfaXNzZXQoei0+em9uZV9wZ2RhdC0+bm9kZV9pZCwgY3VycmVudC0+bWVtc19hbGxvd2VkKTsKKwl3aGlsZSAoIWlzX21lbV9leGNsdXNpdmUoY3MpICYmIGNzLT5wYXJlbnQpCisJCWNzID0gY3MtPnBhcmVudDsKKwlyZXR1cm4gY3M7Cit9CisKKy8qKgorICogY3B1c2V0X3pvbmVfYWxsb3dlZCAtIENhbiB3ZSBhbGxvY2F0ZSBtZW1vcnkgb24gem9uZSB6J3MgbWVtb3J5IG5vZGU/CisgKiBAejogaXMgdGhpcyB6b25lIG9uIGFuIGFsbG93ZWQgbm9kZT8KKyAqIEBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MgKHdlIHVzZSBfX0dGUF9IQVJEV0FMTCkKKyAqCisgKiBJZiB3ZSdyZSBpbiBpbnRlcnJ1cHQsIHllcywgd2UgY2FuIGFsd2F5cyBhbGxvY2F0ZS4gIElmIHpvbmUKKyAqIHoncyBub2RlIGlzIGluIG91ciB0YXNrcyBtZW1zX2FsbG93ZWQsIHllcy4gIElmIGl0J3Mgbm90IGEKKyAqIF9fR0ZQX0hBUkRXQUxMIHJlcXVlc3QgYW5kIHRoaXMgem9uZSdzIG5vZGVzIGlzIGluIHRoZSBuZWFyZXN0CisgKiBtZW1fZXhjbHVzaXZlIGNwdXNldCBhbmNlc3RvciB0byB0aGlzIHRhc2tzIGNwdXNldCwgeWVzLgorICogT3RoZXJ3aXNlLCBuby4KKyAqCisgKiBHRlBfVVNFUiBhbGxvY2F0aW9ucyBhcmUgbWFya2VkIHdpdGggdGhlIF9fR0ZQX0hBUkRXQUxMIGJpdCwKKyAqIGFuZCBkbyBub3QgYWxsb3cgYWxsb2NhdGlvbnMgb3V0c2lkZSB0aGUgY3VycmVudCB0YXNrcyBjcHVzZXQuCisgKiBHRlBfS0VSTkVMIGFsbG9jYXRpb25zIGFyZSBub3Qgc28gbWFya2VkLCBzbyBjYW4gZXNjYXBlIHRvIHRoZQorICogbmVhcmVzdCBtZW1fZXhjbHVzaXZlIGFuY2VzdG9yIGNwdXNldC4KKyAqCisgKiBTY2FubmluZyB1cCBwYXJlbnQgY3B1c2V0cyByZXF1aXJlcyBjcHVzZXRfc2VtLiAgVGhlIF9fYWxsb2NfcGFnZXMoKQorICogcm91dGluZSBvbmx5IGNhbGxzIGhlcmUgd2l0aCBfX0dGUF9IQVJEV0FMTCBiaXQgX25vdF8gc2V0IGlmCisgKiBpdCdzIGEgR0ZQX0tFUk5FTCBhbGxvY2F0aW9uLCBhbmQgYWxsIG5vZGVzIGluIHRoZSBjdXJyZW50IHRhc2tzCisgKiBtZW1zX2FsbG93ZWQgY2FtZSB1cCBlbXB0eSBvbiB0aGUgZmlyc3QgcGFzcyBvdmVyIHRoZSB6b25lbGlzdC4KKyAqIFNvIG9ubHkgR0ZQX0tFUk5FTCBhbGxvY2F0aW9ucywgaWYgYWxsIG5vZGVzIGluIHRoZSBjcHVzZXQgYXJlCisgKiBzaG9ydCBvZiBtZW1vcnksIG1pZ2h0IHJlcXVpcmUgdGFraW5nIHRoZSBjcHVzZXRfc2VtIHNlbWFwaG9yZS4KKyAqCisgKiBUaGUgZmlyc3QgbG9vcCBvdmVyIHRoZSB6b25lbGlzdCBpbiBtbS9wYWdlX2FsbG9jLmM6X19hbGxvY19wYWdlcygpCisgKiBjYWxscyBoZXJlIHdpdGggX19HRlBfSEFSRFdBTEwgYWx3YXlzIHNldCBpbiBnZnBfbWFzaywgZW5mb3JjaW5nCisgKiBoYXJkd2FsbCBjcHVzZXRzIC0gbm8gYWxsb2NhdGlvbiBvbiBhIG5vZGUgb3V0c2lkZSB0aGUgY3B1c2V0IGlzCisgKiBhbGxvd2VkICh1bmxlc3MgaW4gaW50ZXJydXB0LCBvZiBjb3Vyc2UpLgorICoKKyAqIFRoZSBzZWNvbmQgbG9vcCBkb2Vzbid0IGV2ZW4gY2FsbCBoZXJlIGZvciBHRlBfQVRPTUlDIHJlcXVlc3RzCisgKiAoaWYgdGhlIF9fYWxsb2NfcGFnZXMoKSBsb2NhbCB2YXJpYWJsZSAnd2FpdCcgaXMgc2V0KS4gIFRoYXQgY2hlY2sKKyAqIGFuZCB0aGUgY2hlY2tzIGJlbG93IGhhdmUgdGhlIGNvbWJpbmVkIGFmZmVjdCBpbiB0aGUgc2Vjb25kIGxvb3Agb2YKKyAqIHRoZSBfX2FsbG9jX3BhZ2VzKCkgcm91dGluZSB0aGF0OgorICoJaW5faW50ZXJydXB0IC0gYW55IG5vZGUgb2sgKGN1cnJlbnQgdGFzayBjb250ZXh0IGlycmVsZXZhbnQpCisgKglHRlBfQVRPTUlDICAgLSBhbnkgbm9kZSBvaworICoJR0ZQX0tFUk5FTCAgIC0gYW55IG5vZGUgaW4gZW5jbG9zaW5nIG1lbV9leGNsdXNpdmUgY3B1c2V0IG9rCisgKglHRlBfVVNFUiAgICAgLSBvbmx5IG5vZGVzIGluIGN1cnJlbnQgdGFza3MgbWVtcyBhbGxvd2VkIG9rLgorICoqLworCitpbnQgY3B1c2V0X3pvbmVfYWxsb3dlZChzdHJ1Y3Qgem9uZSAqeiwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKQoreworCWludCBub2RlOwkJCS8qIG5vZGUgdGhhdCB6b25lIHogaXMgb24gKi8KKwljb25zdCBzdHJ1Y3QgY3B1c2V0ICpjczsJLyogY3VycmVudCBjcHVzZXQgYW5jZXN0b3JzICovCisJaW50IGFsbG93ZWQgPSAxOwkJLyogaXMgYWxsb2NhdGlvbiBpbiB6b25lIHogYWxsb3dlZD8gKi8KKworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJcmV0dXJuIDE7CisJbm9kZSA9IHotPnpvbmVfcGdkYXQtPm5vZGVfaWQ7CisJaWYgKG5vZGVfaXNzZXQobm9kZSwgY3VycmVudC0+bWVtc19hbGxvd2VkKSkKKwkJcmV0dXJuIDE7CisJaWYgKGdmcF9tYXNrICYgX19HRlBfSEFSRFdBTEwpCS8qIElmIGhhcmR3YWxsIHJlcXVlc3QsIHN0b3AgaGVyZSAqLworCQlyZXR1cm4gMDsKKworCS8qIE5vdCBoYXJkd2FsbCBhbmQgbm9kZSBvdXRzaWRlIG1lbXNfYWxsb3dlZDogc2NhbiB1cCBjcHVzZXRzICovCisJY3B1c2V0X2Rvd24oJmNwdXNldF9zZW0pOworCWNzID0gY3VycmVudC0+Y3B1c2V0OworCWlmICghY3MpCisJCWdvdG8gZG9uZTsJCS8qIGN1cnJlbnQgdGFzayBleGl0aW5nICovCisJY3MgPSBuZWFyZXN0X2V4Y2x1c2l2ZV9hbmNlc3Rvcihjcyk7CisJYWxsb3dlZCA9IG5vZGVfaXNzZXQobm9kZSwgY3MtPm1lbXNfYWxsb3dlZCk7Citkb25lOgorCWNwdXNldF91cCgmY3B1c2V0X3NlbSk7CisJcmV0dXJuIGFsbG93ZWQ7Cit9CisKKy8qKgorICogY3B1c2V0X2V4Y2xfbm9kZXNfb3ZlcmxhcCAtIERvIHdlIG92ZXJsYXAgQHAncyBtZW1fZXhjbHVzaXZlIGFuY2VzdG9ycz8KKyAqIEBwOiBwb2ludGVyIHRvIHRhc2tfc3RydWN0IG9mIHNvbWUgb3RoZXIgdGFzay4KKyAqCisgKiBEZXNjcmlwdGlvbjogUmV0dXJuIHRydWUgaWYgdGhlIG5lYXJlc3QgbWVtX2V4Y2x1c2l2ZSBhbmNlc3RvcgorICogY3B1c2V0cyBvZiB0YXNrcyBAcCBhbmQgY3VycmVudCBvdmVybGFwLiAgVXNlZCBieSBvb20ga2lsbGVyIHRvCisgKiBkZXRlcm1pbmUgaWYgdGFzayBAcCdzIG1lbW9yeSB1c2FnZSBtaWdodCBpbXBhY3QgdGhlIG1lbW9yeQorICogYXZhaWxhYmxlIHRvIHRoZSBjdXJyZW50IHRhc2suCisgKgorICogQWNxdWlyZXMgY3B1c2V0X3NlbSAtIG5vdCBzdWl0YWJsZSBmb3IgY2FsbGluZyBmcm9tIGEgZmFzdCBwYXRoLgorICoqLworCitpbnQgY3B1c2V0X2V4Y2xfbm9kZXNfb3ZlcmxhcChjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJY29uc3Qgc3RydWN0IGNwdXNldCAqY3MxLCAqY3MyOwkvKiBteSBhbmQgcCdzIGNwdXNldCBhbmNlc3RvcnMgKi8KKwlpbnQgb3ZlcmxhcCA9IDA7CQkvKiBkbyBjcHVzZXRzIG92ZXJsYXA/ICovCisKKwljcHVzZXRfZG93bigmY3B1c2V0X3NlbSk7CisJY3MxID0gY3VycmVudC0+Y3B1c2V0OworCWlmICghY3MxKQorCQlnb3RvIGRvbmU7CQkvKiBjdXJyZW50IHRhc2sgZXhpdGluZyAqLworCWNzMiA9IHAtPmNwdXNldDsKKwlpZiAoIWNzMikKKwkJZ290byBkb25lOwkJLyogdGFzayBwIGlzIGV4aXRpbmcgKi8KKwljczEgPSBuZWFyZXN0X2V4Y2x1c2l2ZV9hbmNlc3RvcihjczEpOworCWNzMiA9IG5lYXJlc3RfZXhjbHVzaXZlX2FuY2VzdG9yKGNzMik7CisJb3ZlcmxhcCA9IG5vZGVzX2ludGVyc2VjdHMoY3MxLT5tZW1zX2FsbG93ZWQsIGNzMi0+bWVtc19hbGxvd2VkKTsKK2RvbmU6CisJY3B1c2V0X3VwKCZjcHVzZXRfc2VtKTsKKworCXJldHVybiBvdmVybGFwOwogfQogCiAvKgpAQCAtMTY0Miw3ICsxNzUxLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl0c2sgPSBtLT5wcml2YXRlOwotCWRvd24oJmNwdXNldF9zZW0pOworCWNwdXNldF9kb3duKCZjcHVzZXRfc2VtKTsKIAl0YXNrX2xvY2sodHNrKTsKIAljcyA9IHRzay0+Y3B1c2V0OwogCXRhc2tfdW5sb2NrKHRzayk7CkBAIC0xNjU3LDcgKzE3NjYsNyBAQAogCXNlcV9wdXRzKG0sIGJ1Zik7CiAJc2VxX3B1dGMobSwgJ1xuJyk7CiBvdXQ6Ci0JdXAoJmNwdXNldF9zZW0pOworCWNwdXNldF91cCgmY3B1c2V0X3NlbSk7CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggNWIwZmI5Zi4uNmQyMDg5YSAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC0zNjgsMTcgKzM2OCwxOSBAQAogc3RhdGljIGlubGluZSB2b2lkIGNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKIHsKIAlpbnQgaSwgajsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCiAJaiA9IDA7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CiAJZm9yICg7OykgewogCQl1bnNpZ25lZCBsb25nIHNldDsKIAkJaSA9IGogKiBfX05GREJJVFM7Ci0JCWlmIChpID49IGZpbGVzLT5tYXhfZmRzZXQgfHwgaSA+PSBmaWxlcy0+bWF4X2ZkcykKKwkJaWYgKGkgPj0gZmR0LT5tYXhfZmRzZXQgfHwgaSA+PSBmZHQtPm1heF9mZHMpCiAJCQlicmVhazsKLQkJc2V0ID0gZmlsZXMtPm9wZW5fZmRzLT5mZHNfYml0c1tqKytdOworCQlzZXQgPSBmZHQtPm9wZW5fZmRzLT5mZHNfYml0c1tqKytdOwogCQl3aGlsZSAoc2V0KSB7CiAJCQlpZiAoc2V0ICYgMSkgewotCQkJCXN0cnVjdCBmaWxlICogZmlsZSA9IHhjaGcoJmZpbGVzLT5mZFtpXSwgTlVMTCk7CisJCQkJc3RydWN0IGZpbGUgKiBmaWxlID0geGNoZygmZmR0LT5mZFtpXSwgTlVMTCk7CiAJCQkJaWYgKGZpbGUpCiAJCQkJCWZpbHBfY2xvc2UoZmlsZSwgZmlsZXMpOwogCQkJfQpAQCAtNDAzLDE4ICs0MDUsMjIgQEAKIAogdm9pZCBmYXN0Y2FsbCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKQogeworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZmlsZXMtPmNvdW50KSkgewogCQljbG9zZV9maWxlcyhmaWxlcyk7CiAJCS8qCiAJCSAqIEZyZWUgdGhlIGZkIGFuZCBmZHNldCBhcnJheXMgaWYgd2UgZXhwYW5kZWQgdGhlbS4KKwkJICogSWYgdGhlIGZkdGFibGUgd2FzIGVtYmVkZGVkLCBwYXNzIGZpbGVzIGZvciBmcmVlaW5nCisJCSAqIGF0IHRoZSBlbmQgb2YgdGhlIFJDVSBncmFjZSBwZXJpb2QuIE90aGVyd2lzZSwKKwkJICogeW91IGNhbiBmcmVlIGZpbGVzIGltbWVkaWF0ZWx5LgogCQkgKi8KLQkJaWYgKGZpbGVzLT5mZCAhPSAmZmlsZXMtPmZkX2FycmF5WzBdKQotCQkJZnJlZV9mZF9hcnJheShmaWxlcy0+ZmQsIGZpbGVzLT5tYXhfZmRzKTsKLQkJaWYgKGZpbGVzLT5tYXhfZmRzZXQgPiBfX0ZEX1NFVFNJWkUpIHsKLQkJCWZyZWVfZmRzZXQoZmlsZXMtPm9wZW5fZmRzLCBmaWxlcy0+bWF4X2Zkc2V0KTsKLQkJCWZyZWVfZmRzZXQoZmlsZXMtPmNsb3NlX29uX2V4ZWMsIGZpbGVzLT5tYXhfZmRzZXQpOwotCQl9Ci0JCWttZW1fY2FjaGVfZnJlZShmaWxlc19jYWNoZXAsIGZpbGVzKTsKKwkJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJCWlmIChmZHQgPT0gJmZpbGVzLT5mZHRhYikKKwkJCWZkdC0+ZnJlZV9maWxlcyA9IGZpbGVzOworCQllbHNlCisJCQlrbWVtX2NhY2hlX2ZyZWUoZmlsZXNfY2FjaGVwLCBmaWxlcyk7CisJCWZyZWVfZmR0YWJsZShmZHQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggYjY1MTg3Zi4uODE0OWYzNiAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KQEAgLTE3Niw2ICsxNzcsNyBAQAogCiAJLyogT25lIGZvciB1cywgb25lIGZvciB3aG9ldmVyIGRvZXMgdGhlICJyZWxlYXNlX3Rhc2soKSIgKHVzdWFsbHkgcGFyZW50KSAqLwogCWF0b21pY19zZXQoJnRzay0+dXNhZ2UsMik7CisJYXRvbWljX3NldCgmdHNrLT5mc19leGNsLCAwKTsKIAlyZXR1cm4gdHNrOwogfQogCkBAIC01NjQsMjQgKzU2Niw1MyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNvdW50X29wZW5fZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIGludCBzaXplKQorc3RhdGljIGludCBjb3VudF9vcGVuX2ZpbGVzKHN0cnVjdCBmZHRhYmxlICpmZHQpCiB7CisJaW50IHNpemUgPSBmZHQtPm1heF9mZHNldDsKIAlpbnQgaTsKIAogCS8qIEZpbmQgdGhlIGxhc3Qgb3BlbiBmZCAqLwogCWZvciAoaSA9IHNpemUvKDgqc2l6ZW9mKGxvbmcpKTsgaSA+IDA7ICkgewotCQlpZiAoZmlsZXMtPm9wZW5fZmRzLT5mZHNfYml0c1stLWldKQorCQlpZiAoZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHNbLS1pXSkKIAkJCWJyZWFrOwogCX0KIAlpID0gKGkrMSkgKiA4ICogc2l6ZW9mKGxvbmcpOwogCXJldHVybiBpOwogfQogCitzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqYWxsb2NfZmlsZXModm9pZCkKK3sKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpuZXdmOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisKKwluZXdmID0ga21lbV9jYWNoZV9hbGxvYyhmaWxlc19jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIW5ld2YpCisJCWdvdG8gb3V0OworCisJYXRvbWljX3NldCgmbmV3Zi0+Y291bnQsIDEpOworCisJc3Bpbl9sb2NrX2luaXQoJm5ld2YtPmZpbGVfbG9jayk7CisJZmR0ID0gJm5ld2YtPmZkdGFiOworCWZkdC0+bmV4dF9mZCA9IDA7CisJZmR0LT5tYXhfZmRzID0gTlJfT1BFTl9ERUZBVUxUOworCWZkdC0+bWF4X2Zkc2V0ID0gX19GRF9TRVRTSVpFOworCWZkdC0+Y2xvc2Vfb25fZXhlYyA9ICZuZXdmLT5jbG9zZV9vbl9leGVjX2luaXQ7CisJZmR0LT5vcGVuX2ZkcyA9ICZuZXdmLT5vcGVuX2Zkc19pbml0OworCWZkdC0+ZmQgPSAmbmV3Zi0+ZmRfYXJyYXlbMF07CisJSU5JVF9SQ1VfSEVBRCgmZmR0LT5yY3UpOworCWZkdC0+ZnJlZV9maWxlcyA9IE5VTEw7CisJZmR0LT5uZXh0ID0gTlVMTDsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmV3Zi0+ZmR0LCBmZHQpOworb3V0OgorCXJldHVybiBuZXdmOworfQorCiBzdGF0aWMgaW50IGNvcHlfZmlsZXModW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICogdHNrKQogewogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsICpuZXdmOwogCXN0cnVjdCBmaWxlICoqb2xkX2ZkcywgKipuZXdfZmRzOwogCWludCBvcGVuX2ZpbGVzLCBzaXplLCBpLCBlcnJvciA9IDAsIGV4cGFuZDsKKwlzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7CiAKIAkvKgogCSAqIEEgYmFja2dyb3VuZCBwcm9jZXNzIG1heSBub3QgaGF2ZSBhbnkgZmlsZXMgLi4uCkBAIC02MDIsMzUgKzYzMywyNyBAQAogCSAqLwogCXRzay0+ZmlsZXMgPSBOVUxMOwogCWVycm9yID0gLUVOT01FTTsKLQluZXdmID0ga21lbV9jYWNoZV9hbGxvYyhmaWxlc19jYWNoZXAsIFNMQUJfS0VSTkVMKTsKLQlpZiAoIW5ld2YpIAorCW5ld2YgPSBhbGxvY19maWxlcygpOworCWlmICghbmV3ZikKIAkJZ290byBvdXQ7CiAKLQlhdG9taWNfc2V0KCZuZXdmLT5jb3VudCwgMSk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmbmV3Zi0+ZmlsZV9sb2NrKTsKLQluZXdmLT5uZXh0X2ZkCSAgICA9IDA7Ci0JbmV3Zi0+bWF4X2ZkcwkgICAgPSBOUl9PUEVOX0RFRkFVTFQ7Ci0JbmV3Zi0+bWF4X2Zkc2V0CSAgICA9IF9fRkRfU0VUU0laRTsKLQluZXdmLT5jbG9zZV9vbl9leGVjID0gJm5ld2YtPmNsb3NlX29uX2V4ZWNfaW5pdDsKLQluZXdmLT5vcGVuX2ZkcwkgICAgPSAmbmV3Zi0+b3Blbl9mZHNfaW5pdDsKLQluZXdmLT5mZAkgICAgPSAmbmV3Zi0+ZmRfYXJyYXlbMF07Ci0KIAlzcGluX2xvY2soJm9sZGYtPmZpbGVfbG9jayk7Ci0KLQlvcGVuX2ZpbGVzID0gY291bnRfb3Blbl9maWxlcyhvbGRmLCBvbGRmLT5tYXhfZmRzZXQpOworCW9sZF9mZHQgPSBmaWxlc19mZHRhYmxlKG9sZGYpOworCW5ld19mZHQgPSBmaWxlc19mZHRhYmxlKG5ld2YpOworCXNpemUgPSBvbGRfZmR0LT5tYXhfZmRzZXQ7CisJb3Blbl9maWxlcyA9IGNvdW50X29wZW5fZmlsZXMob2xkX2ZkdCk7CiAJZXhwYW5kID0gMDsKIAogCS8qCiAJICogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbGFyZ2VyIGZkIGFycmF5IG9yIGZkIHNldC4KIAkgKiBOb3RlOiB3ZSdyZSBub3QgYSBjbG9uZSB0YXNrLCBzbyB0aGUgb3BlbiBjb3VudCB3b24ndCAgY2hhbmdlLgogCSAqLwotCWlmIChvcGVuX2ZpbGVzID4gbmV3Zi0+bWF4X2Zkc2V0KSB7Ci0JCW5ld2YtPm1heF9mZHNldCA9IDA7CisJaWYgKG9wZW5fZmlsZXMgPiBuZXdfZmR0LT5tYXhfZmRzZXQpIHsKKwkJbmV3X2ZkdC0+bWF4X2Zkc2V0ID0gMDsKIAkJZXhwYW5kID0gMTsKIAl9Ci0JaWYgKG9wZW5fZmlsZXMgPiBuZXdmLT5tYXhfZmRzKSB7Ci0JCW5ld2YtPm1heF9mZHMgPSAwOworCWlmIChvcGVuX2ZpbGVzID4gbmV3X2ZkdC0+bWF4X2ZkcykgeworCQluZXdfZmR0LT5tYXhfZmRzID0gMDsKIAkJZXhwYW5kID0gMTsKIAl9CiAKQEAgLTY0MiwxNCArNjY1LDIxIEBACiAJCXNwaW5fdW5sb2NrKCZuZXdmLT5maWxlX2xvY2spOwogCQlpZiAoZXJyb3IgPCAwKQogCQkJZ290byBvdXRfcmVsZWFzZTsKKwkJbmV3X2ZkdCA9IGZpbGVzX2ZkdGFibGUobmV3Zik7CisJCS8qCisJCSAqIFJlYWNxdWlyZSB0aGUgb2xkZiBsb2NrIGFuZCBhIHBvaW50ZXIgdG8gaXRzIGZkIHRhYmxlCisJCSAqIHdobyBrbm93cyBpdCBtYXkgaGF2ZSBhIG5ldyBiaWdnZXIgZmQgdGFibGUuIFdlIG5lZWQKKwkJICogdGhlIGxhdGVzdCBwb2ludGVyLgorCQkgKi8KIAkJc3Bpbl9sb2NrKCZvbGRmLT5maWxlX2xvY2spOworCQlvbGRfZmR0ID0gZmlsZXNfZmR0YWJsZShvbGRmKTsKIAl9CiAKLQlvbGRfZmRzID0gb2xkZi0+ZmQ7Ci0JbmV3X2ZkcyA9IG5ld2YtPmZkOworCW9sZF9mZHMgPSBvbGRfZmR0LT5mZDsKKwluZXdfZmRzID0gbmV3X2ZkdC0+ZmQ7CiAKLQltZW1jcHkobmV3Zi0+b3Blbl9mZHMtPmZkc19iaXRzLCBvbGRmLT5vcGVuX2Zkcy0+ZmRzX2JpdHMsIG9wZW5fZmlsZXMvOCk7Ci0JbWVtY3B5KG5ld2YtPmNsb3NlX29uX2V4ZWMtPmZkc19iaXRzLCBvbGRmLT5jbG9zZV9vbl9leGVjLT5mZHNfYml0cywgb3Blbl9maWxlcy84KTsKKwltZW1jcHkobmV3X2ZkdC0+b3Blbl9mZHMtPmZkc19iaXRzLCBvbGRfZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHMsIG9wZW5fZmlsZXMvOCk7CisJbWVtY3B5KG5ld19mZHQtPmNsb3NlX29uX2V4ZWMtPmZkc19iaXRzLCBvbGRfZmR0LT5jbG9zZV9vbl9leGVjLT5mZHNfYml0cywgb3Blbl9maWxlcy84KTsKIAogCWZvciAoaSA9IG9wZW5fZmlsZXM7IGkgIT0gMDsgaS0tKSB7CiAJCXN0cnVjdCBmaWxlICpmID0gKm9sZF9mZHMrKzsKQEAgLTY2MiwyNCArNjkyLDI0IEBACiAJCQkgKiBpcyBwYXJ0d2F5IHRocm91Z2ggb3BlbigpLiAgU28gbWFrZSBzdXJlIHRoYXQgdGhpcwogCQkJICogZmQgaXMgYXZhaWxhYmxlIHRvIHRoZSBuZXcgcHJvY2Vzcy4KIAkJCSAqLwotCQkJRkRfQ0xSKG9wZW5fZmlsZXMgLSBpLCBuZXdmLT5vcGVuX2Zkcyk7CisJCQlGRF9DTFIob3Blbl9maWxlcyAtIGksIG5ld19mZHQtPm9wZW5fZmRzKTsKIAkJfQotCQkqbmV3X2ZkcysrID0gZjsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKCpuZXdfZmRzKyssIGYpOwogCX0KIAlzcGluX3VubG9jaygmb2xkZi0+ZmlsZV9sb2NrKTsKIAogCS8qIGNvbXB1dGUgdGhlIHJlbWFpbmRlciB0byBiZSBjbGVhcmVkICovCi0Jc2l6ZSA9IChuZXdmLT5tYXhfZmRzIC0gb3Blbl9maWxlcykgKiBzaXplb2Yoc3RydWN0IGZpbGUgKik7CisJc2l6ZSA9IChuZXdfZmR0LT5tYXhfZmRzIC0gb3Blbl9maWxlcykgKiBzaXplb2Yoc3RydWN0IGZpbGUgKik7CiAKIAkvKiBUaGlzIGlzIGxvbmcgd29yZCBhbGlnbmVkIHRodXMgY291bGQgdXNlIGEgb3B0aW1pemVkIHZlcnNpb24gKi8gCiAJbWVtc2V0KG5ld19mZHMsIDAsIHNpemUpOyAKIAotCWlmIChuZXdmLT5tYXhfZmRzZXQgPiBvcGVuX2ZpbGVzKSB7Ci0JCWludCBsZWZ0ID0gKG5ld2YtPm1heF9mZHNldC1vcGVuX2ZpbGVzKS84OworCWlmIChuZXdfZmR0LT5tYXhfZmRzZXQgPiBvcGVuX2ZpbGVzKSB7CisJCWludCBsZWZ0ID0gKG5ld19mZHQtPm1heF9mZHNldC1vcGVuX2ZpbGVzKS84OwogCQlpbnQgc3RhcnQgPSBvcGVuX2ZpbGVzIC8gKDggKiBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCi0JCW1lbXNldCgmbmV3Zi0+b3Blbl9mZHMtPmZkc19iaXRzW3N0YXJ0XSwgMCwgbGVmdCk7Ci0JCW1lbXNldCgmbmV3Zi0+Y2xvc2Vfb25fZXhlYy0+ZmRzX2JpdHNbc3RhcnRdLCAwLCBsZWZ0KTsKKwkJbWVtc2V0KCZuZXdfZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHNbc3RhcnRdLCAwLCBsZWZ0KTsKKwkJbWVtc2V0KCZuZXdfZmR0LT5jbG9zZV9vbl9leGVjLT5mZHNfYml0c1tzdGFydF0sIDAsIGxlZnQpOwogCX0KIAogCXRzay0+ZmlsZXMgPSBuZXdmOwpAQCAtNjg4LDkgKzcxOCw5IEBACiAJcmV0dXJuIGVycm9yOwogCiBvdXRfcmVsZWFzZToKLQlmcmVlX2Zkc2V0IChuZXdmLT5jbG9zZV9vbl9leGVjLCBuZXdmLT5tYXhfZmRzZXQpOwotCWZyZWVfZmRzZXQgKG5ld2YtPm9wZW5fZmRzLCBuZXdmLT5tYXhfZmRzZXQpOwotCWZyZWVfZmRfYXJyYXkobmV3Zi0+ZmQsIG5ld2YtPm1heF9mZHMpOworCWZyZWVfZmRzZXQgKG5ld19mZHQtPmNsb3NlX29uX2V4ZWMsIG5ld19mZHQtPm1heF9mZHNldCk7CisJZnJlZV9mZHNldCAobmV3X2ZkdC0+b3Blbl9mZHMsIG5ld19mZHQtPm1heF9mZHNldCk7CisJZnJlZV9mZF9hcnJheShuZXdfZmR0LT5mZCwgbmV3X2ZkdC0+bWF4X2Zkcyk7CiAJa21lbV9jYWNoZV9mcmVlKGZpbGVzX2NhY2hlcCwgbmV3Zik7CiAJZ290byBvdXQ7CiB9CkBAIC05OTQsNiArMTAyNCw5IEBACiAJICogb2YgQ0xPTkVfUFRSQUNFLgogCSAqLwogCWNsZWFyX3Rza190aHJlYWRfZmxhZyhwLCBUSUZfU1lTQ0FMTF9UUkFDRSk7CisjaWZkZWYgVElGX1NZU0NBTExfRU1VCisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9TWVNDQUxMX0VNVSk7CisjZW5kaWYKIAogCS8qIE91ciBwYXJlbnQgZXhlY3V0aW9uIGRvbWFpbiBiZWNvbWVzIGN1cnJlbnQgZG9tYWluCiAJICAgVGhlc2UgbXVzdCBtYXRjaCBmb3IgdGhyZWFkIHNpZ25hbGxpbmcgdG8gYXBwbHkgKi8KQEAgLTExMTIsNiArMTE0NSw5IEBACiAJCQlfX2dldF9jcHVfdmFyKHByb2Nlc3NfY291bnRzKSsrOwogCX0KIAorCWlmICghY3VycmVudC0+c2lnbmFsLT50dHkgJiYgcC0+c2lnbmFsLT50dHkpCisJCXAtPnNpZ25hbC0+dHR5ID0gTlVMTDsKKwogCW5yX3RocmVhZHMrKzsKIAl0b3RhbF9mb3JrcysrOwogCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCBjNzEzMGY4Li5jYTA1ZmU2IDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS9mdXRleC5oPgogCiAjZGVmaW5lIEZVVEVYX0hBU0hCSVRTIChDT05GSUdfQkFTRV9TTUFMTCA/IDQgOiA4KQogCkBAIC0zMjcsNiArMzI4LDExOCBAQAogfQogCiAvKgorICogV2FrZSB1cCBhbGwgd2FpdGVycyBoYXNoZWQgb24gdGhlIHBoeXNpY2FsIHBhZ2UgdGhhdCBpcyBtYXBwZWQKKyAqIHRvIHRoaXMgdmlydHVhbCBhZGRyZXNzOgorICovCitzdGF0aWMgaW50IGZ1dGV4X3dha2Vfb3AodW5zaWduZWQgbG9uZyB1YWRkcjEsIHVuc2lnbmVkIGxvbmcgdWFkZHIyLCBpbnQgbnJfd2FrZSwgaW50IG5yX3dha2UyLCBpbnQgb3ApCit7CisJdW5pb24gZnV0ZXhfa2V5IGtleTEsIGtleTI7CisJc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpiaDEsICpiaDI7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgZnV0ZXhfcSAqdGhpcywgKm5leHQ7CisJaW50IHJldCwgb3BfcmV0LCBhdHRlbXB0ID0gMDsKKworcmV0cnlmdWxsOgorCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIxLCAma2V5MSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBvdXQ7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsICZrZXkyKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIG91dDsKKworCWJoMSA9IGhhc2hfZnV0ZXgoJmtleTEpOworCWJoMiA9IGhhc2hfZnV0ZXgoJmtleTIpOworCityZXRyeToKKwlpZiAoYmgxIDwgYmgyKQorCQlzcGluX2xvY2soJmJoMS0+bG9jayk7CisJc3Bpbl9sb2NrKCZiaDItPmxvY2spOworCWlmIChiaDEgPiBiaDIpCisJCXNwaW5fbG9jaygmYmgxLT5sb2NrKTsKKworCW9wX3JldCA9IGZ1dGV4X2F0b21pY19vcF9pbnVzZXIob3AsIChpbnQgX191c2VyICopdWFkZHIyKTsKKwlpZiAodW5saWtlbHkob3BfcmV0IDwgMCkpIHsKKwkJaW50IGR1bW15OworCisJCXNwaW5fdW5sb2NrKCZiaDEtPmxvY2spOworCQlpZiAoYmgxICE9IGJoMikKKwkJCXNwaW5fdW5sb2NrKCZiaDItPmxvY2spOworCisJCS8qIGZ1dGV4X2F0b21pY19vcF9pbnVzZXIgbmVlZHMgdG8gYm90aCByZWFkIGFuZCB3cml0ZQorCQkgKiAqKGludCBfX3VzZXIgKil1YWRkcjIsIGJ1dCB3ZSBjYW4ndCBtb2RpZnkgaXQKKwkJICogbm9uLWF0b21pY2FsbHkuICBUaGVyZWZvcmUsIGlmIGdldF91c2VyIGJlbG93IGlzIG5vdAorCQkgKiBlbm91Z2gsIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBmYXVsdCBvdXJzZWx2ZXMsIHdoaWxlCisJCSAqIHN0aWxsIGhvbGRpbmcgdGhlIG1tYXBfc2VtLiAgKi8KKwkJaWYgKGF0dGVtcHQrKykgeworCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hOworCQkJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWlmIChhdHRlbXB0ID49IDIgfHwKKwkJCSAgICAhKHZtYSA9IGZpbmRfdm1hKG1tLCB1YWRkcjIpKSB8fAorCQkJICAgIHZtYS0+dm1fc3RhcnQgPiB1YWRkcjIgfHwKKwkJCSAgICAhKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJCQkJZ290byBvdXQ7CisKKwkJCXN3aXRjaCAoaGFuZGxlX21tX2ZhdWx0KG1tLCB2bWEsIHVhZGRyMiwgMSkpIHsKKwkJCWNhc2UgVk1fRkFVTFRfTUlOT1I6CisJCQkJY3VycmVudC0+bWluX2ZsdCsrOworCQkJCWJyZWFrOworCQkJY2FzZSBWTV9GQVVMVF9NQUpPUjoKKwkJCQljdXJyZW50LT5tYWpfZmx0Kys7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZ290byByZXRyeTsKKwkJfQorCisJCS8qIElmIHdlIHdvdWxkIGhhdmUgZmF1bHRlZCwgcmVsZWFzZSBtbWFwX3NlbSwKKwkJICogZmF1bHQgaXQgaW4gYW5kIHN0YXJ0IGFsbCBvdmVyIGFnYWluLiAgKi8KKwkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCQlyZXQgPSBnZXRfdXNlcihkdW1teSwgKGludCBfX3VzZXIgKil1YWRkcjIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlnb3RvIHJldHJ5ZnVsbDsKKwl9CisKKwloZWFkID0gJmJoMS0+Y2hhaW47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGhpcywgbmV4dCwgaGVhZCwgbGlzdCkgeworCQlpZiAobWF0Y2hfZnV0ZXggKCZ0aGlzLT5rZXksICZrZXkxKSkgeworCQkJd2FrZV9mdXRleCh0aGlzKTsKKwkJCWlmICgrK3JldCA+PSBucl93YWtlKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG9wX3JldCA+IDApIHsKKwkJaGVhZCA9ICZiaDItPmNoYWluOworCisJCW9wX3JldCA9IDA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0aGlzLCBuZXh0LCBoZWFkLCBsaXN0KSB7CisJCQlpZiAobWF0Y2hfZnV0ZXggKCZ0aGlzLT5rZXksICZrZXkyKSkgeworCQkJCXdha2VfZnV0ZXgodGhpcyk7CisJCQkJaWYgKCsrb3BfcmV0ID49IG5yX3dha2UyKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXQgKz0gb3BfcmV0OworCX0KKworCXNwaW5fdW5sb2NrKCZiaDEtPmxvY2spOworCWlmIChiaDEgIT0gYmgyKQorCQlzcGluX3VubG9jaygmYmgyLT5sb2NrKTsKK291dDoKKwl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qCiAgKiBSZXF1ZXVlIGFsbCB3YWl0ZXJzIGhhc2hlZCBvbiBvbmUgcGh5c2ljYWwgcGFnZSB0byBhbm90aGVyCiAgKiBwaHlzaWNhbCBwYWdlLgogICovCkBAIC02NzMsMjMgKzc4NiwxNyBAQAogCWZpbHAtPmZfbWFwcGluZyA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CiAKIAlpZiAoc2lnbmFsKSB7Ci0JCWludCBlcnI7CiAJCWVyciA9IGZfc2V0b3duKGZpbHAsIGN1cnJlbnQtPnBpZCwgMSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlwdXRfdW51c2VkX2ZkKHJldCk7Ci0JCQlwdXRfZmlscChmaWxwKTsKLQkJCXJldCA9IGVycjsKLQkJCWdvdG8gb3V0OworCQkJZ290byBlcnJvcjsKIAkJfQogCQlmaWxwLT5mX293bmVyLnNpZ251bSA9IHNpZ25hbDsKIAl9CiAKIAlxID0ga21hbGxvYyhzaXplb2YoKnEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXEpIHsKLQkJcHV0X3VudXNlZF9mZChyZXQpOwotCQlwdXRfZmlscChmaWxwKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CiAJfQogCiAJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwpAQCAtNjk3LDEwICs4MDQsOCBAQAogCiAJaWYgKHVubGlrZWx5KGVyciAhPSAwKSkgewogCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCQlwdXRfdW51c2VkX2ZkKHJldCk7Ci0JCXB1dF9maWxwKGZpbHApOwogCQlrZnJlZShxKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnJvcjsKIAl9CiAKIAkvKgpAQCAtNzE2LDYgKzgyMSwxMSBAQAogCWZkX2luc3RhbGwocmV0LCBmaWxwKTsKIG91dDoKIAlyZXR1cm4gcmV0OworZXJyb3I6CisJcHV0X3VudXNlZF9mZChyZXQpOworCXB1dF9maWxwKGZpbHApOworCXJldCA9IGVycjsKKwlnb3RvIG91dDsKIH0KIAogbG9uZyBkb19mdXRleCh1bnNpZ25lZCBsb25nIHVhZGRyLCBpbnQgb3AsIGludCB2YWwsIHVuc2lnbmVkIGxvbmcgdGltZW91dCwKQEAgLTc0MCw2ICs4NTAsOSBAQAogCWNhc2UgRlVURVhfQ01QX1JFUVVFVUU6CiAJCXJldCA9IGZ1dGV4X3JlcXVldWUodWFkZHIsIHVhZGRyMiwgdmFsLCB2YWwyLCAmdmFsMyk7CiAJCWJyZWFrOworCWNhc2UgRlVURVhfV0FLRV9PUDoKKwkJcmV0ID0gZnV0ZXhfd2FrZV9vcCh1YWRkciwgdWFkZHIyLCB2YWwsIHZhbDIsIHZhbDMpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRU5PU1lTOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9pbnRlcm1vZHVsZS5jIGIva2VybmVsL2ludGVybW9kdWxlLmMKaW5kZXggMzg4OTc3Zi4uMGNiZTYzMyAxMDA2NDQKLS0tIGEva2VybmVsL2ludGVybW9kdWxlLmMKKysrIGIva2VybmVsL2ludGVybW9kdWxlLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJc3RydWN0IGludGVyX21vZHVsZV9lbnRyeSAqaW1lLCAqaW1lX25ldzsKIAotCWlmICghKGltZV9uZXcgPSBrbWFsbG9jKHNpemVvZigqaW1lKSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEoaW1lX25ldyA9IGt6YWxsb2Moc2l6ZW9mKCppbWUpLCBHRlBfS0VSTkVMKSkpIHsKIAkJLyogT3ZlcmxvYWRlZCBrZXJuZWwsIG5vdCBmYXRhbCAqLwogCQlwcmludGsoS0VSTl9FUlIKIAkJCSJBaWVlLCBpbnRlcl9tb2R1bGVfcmVnaXN0ZXI6IGNhbm5vdCBrbWFsbG9jIGVudHJ5IGZvciAnJXMnXG4iLApAQCAtNDcsNyArNDcsNiBAQAogCQlrbWFsbG9jX2ZhaWxlZCA9IDE7CiAJCXJldHVybjsKIAl9Ci0JbWVtc2V0KGltZV9uZXcsIDAsIHNpemVvZigqaW1lX25ldykpOwogCWltZV9uZXctPmltX25hbWUgPSBpbV9uYW1lOwogCWltZV9uZXctPm93bmVyID0gb3duZXI7CiAJaW1lX25ldy0+dXNlcmRhdGEgPSB1c2VyZGF0YTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaGFuZGxlLmMgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCmluZGV4IGMyOWY4M2MuLjNmZjdiOTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaGFuZGxlLmMKKysrIGIva2VybmVsL2lycS9oYW5kbGUuYwpAQCAtMTExLDcgKzExMSw3IEBACiAJdW5zaWduZWQgaW50IHN0YXR1czsKIAogCWtzdGF0X3RoaXNfY3B1LmlycXNbaXJxXSsrOwotCWlmIChkZXNjLT5zdGF0dXMgJiBJUlFfUEVSX0NQVSkgeworCWlmIChDSEVDS19JUlFfUEVSX0NQVShkZXNjLT5zdGF0dXMpKSB7CiAJCWlycXJldHVybl90IGFjdGlvbl9yZXQ7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvbWFuYWdlLmMgYi9rZXJuZWwvaXJxL21hbmFnZS5jCmluZGV4IGFjNjcwMDkuLjFjZmRiMDggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvbWFuYWdlLmMKKysrIGIva2VybmVsL2lycS9tYW5hZ2UuYwpAQCAtMTgsNiArMTgsMTAgQEAKIAogY3B1bWFza190IGlycV9hZmZpbml0eVtOUl9JUlFTXSA9IHsgWzAgLi4uIE5SX0lSUVMtMV0gPSBDUFVfTUFTS19BTEwgfTsKIAorI2lmIGRlZmluZWQgKENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRKSB8fCBkZWZpbmVkIChDT05GSUdfSVJRQkFMQU5DRSkKK2NwdW1hc2tfdCBfX2NhY2hlbGluZV9hbGlnbmVkIHBlbmRpbmdfaXJxX2NwdW1hc2tbTlJfSVJRU107CisjZW5kaWYKKwogLyoqCiAgKglzeW5jaHJvbml6ZV9pcnEgLSB3YWl0IGZvciBwZW5kaW5nIElSUSBoYW5kbGVycyAob24gb3RoZXIgQ1BVcykKICAqCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL3Byb2MuYyBiL2tlcm5lbC9pcnEvcHJvYy5jCmluZGV4IDg1ZDA4ZGEuLmYyNmU1MzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvcHJvYy5jCisrKyBiL2tlcm5lbC9pcnEvcHJvYy5jCkBAIC0xOSwxMiArMTksMjIgQEAKICAqLwogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqc21wX2FmZmluaXR5X2VudHJ5W05SX0lSUVNdOwogCi12b2lkIF9fYXR0cmlidXRlX18oKHdlYWspKQotcHJvY19zZXRfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrX3ZhbCkKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUQordm9pZCBwcm9jX3NldF9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IG1hc2tfdmFsKQoreworCS8qCisJICogU2F2ZSB0aGVzZSBhd2F5IGZvciBsYXRlciB1c2UuIFJlLXByb2dhbSB3aGVuIHRoZQorCSAqIGludGVycnVwdCBpcyBwZW5kaW5nCisJICovCisJc2V0X3BlbmRpbmdfaXJxKGlycSwgbWFza192YWwpOworfQorI2Vsc2UKK3ZvaWQgcHJvY19zZXRfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrX3ZhbCkKIHsKIAlpcnFfYWZmaW5pdHlbaXJxXSA9IG1hc2tfdmFsOwogCWlycV9kZXNjW2lycV0uaGFuZGxlci0+c2V0X2FmZmluaXR5KGlycSwgbWFza192YWwpOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgaXJxX2FmZmluaXR5X3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKIAkJCQkgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCmRpZmYgLS1naXQgYS9rZXJuZWwva3Byb2Jlcy5jIGIva2VybmVsL2twcm9iZXMuYwppbmRleCBiMDIzNzEyLi5mM2VhNDkyIDEwMDY0NAotLS0gYS9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KQEAgLTcyLDcgKzczLDcgQEAKICAqIGdldF9pbnNuX3Nsb3QoKSAtIEZpbmQgYSBzbG90IG9uIGFuIGV4ZWN1dGFibGUgcGFnZSBmb3IgYW4gaW5zdHJ1Y3Rpb24uCiAgKiBXZSBhbGxvY2F0ZSBhbiBleGVjdXRhYmxlIHBhZ2UgaWYgdGhlcmUncyBubyByb29tIG9uIGV4aXN0aW5nIG9uZXMuCiAgKi8KLWtwcm9iZV9vcGNvZGVfdCAqZ2V0X2luc25fc2xvdCh2b2lkKQora3Byb2JlX29wY29kZV90IF9fa3Byb2JlcyAqZ2V0X2luc25fc2xvdCh2b2lkKQogewogCXN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXA7CiAJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKQEAgLTExNyw3ICsxMTgsNyBAQAogCXJldHVybiBraXAtPmluc25zOwogfQogCi12b2lkIGZyZWVfaW5zbl9zbG90KGtwcm9iZV9vcGNvZGVfdCAqc2xvdCkKK3ZvaWQgX19rcHJvYmVzIGZyZWVfaW5zbl9zbG90KGtwcm9iZV9vcGNvZGVfdCAqc2xvdCkKIHsKIAlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOwogCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CkBAIC0xNTIsMjAgKzE1Myw0MiBAQAogfQogCiAvKiBMb2NrcyBrcHJvYmU6IGlycXMgbXVzdCBiZSBkaXNhYmxlZCAqLwotdm9pZCBsb2NrX2twcm9iZXModm9pZCkKK3ZvaWQgX19rcHJvYmVzIGxvY2tfa3Byb2Jlcyh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJLyogQXZvaWRpbmcgbG9jYWwgaW50ZXJydXB0cyB0byBoYXBwZW4gcmlnaHQgYWZ0ZXIgd2UgdGFrZSB0aGUga3Byb2JlX2xvY2sKKwkgKiBhbmQgYmVmb3JlIHdlIGdldCBhIGNoYW5jZSB0byB1cGRhdGUga3Byb2JlX2NwdSwgdGhpcyB0byBwcmV2ZW50CisJICogZGVhZGxvY2sgd2hlbiB3ZSBoYXZlIGEga3Byb2JlIG9uIElTUiByb3V0aW5lIGFuZCBhIGtwcm9iZSBvbiB0YXNrCisJICogcm91dGluZQorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwogCXNwaW5fbG9jaygma3Byb2JlX2xvY2spOwogCWtwcm9iZV9jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKyAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCi12b2lkIHVubG9ja19rcHJvYmVzKHZvaWQpCit2b2lkIF9fa3Byb2JlcyB1bmxvY2tfa3Byb2Jlcyh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJLyogQXZvaWRpbmcgbG9jYWwgaW50ZXJydXB0cyB0byBoYXBwZW4gcmlnaHQgYWZ0ZXIgd2UgdXBkYXRlCisJICoga3Byb2JlX2NwdSBhbmQgYmVmb3JlIHdlIGdldCBhIGEgY2hhbmNlIHRvIHJlbGVhc2Uga3Byb2JlX2xvY2ssCisJICogdGhpcyB0byBwcmV2ZW50IGRlYWRsb2NrIHdoZW4gd2UgaGF2ZSBhIGtwcm9iZSBvbiBJU1Igcm91dGluZSBhbmQKKwkgKiBhIGtwcm9iZSBvbiB0YXNrIHJvdXRpbmUKKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKIAlrcHJvYmVfY3B1ID0gTlJfQ1BVUzsKIAlzcGluX3VubG9jaygma3Byb2JlX2xvY2spOworCisgCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogLyogWW91IGhhdmUgdG8gYmUgaG9sZGluZyB0aGUga3Byb2JlX2xvY2sgKi8KLXN0cnVjdCBrcHJvYmUgKmdldF9rcHJvYmUodm9pZCAqYWRkcikKK3N0cnVjdCBrcHJvYmUgX19rcHJvYmVzICpnZXRfa3Byb2JlKHZvaWQgKmFkZHIpCiB7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CkBAIC0xODMsNyArMjA2LDcgQEAKICAqIEFnZ3JlZ2F0ZSBoYW5kbGVycyBmb3IgbXVsdGlwbGUga3Byb2JlcyBzdXBwb3J0IC0gdGhlc2UgaGFuZGxlcnMKICAqIHRha2UgY2FyZSBvZiBpbnZva2luZyB0aGUgaW5kaXZpZHVhbCBrcHJvYmUgaGFuZGxlcnMgb24gcC0+bGlzdAogICovCi1zdGF0aWMgaW50IGFnZ3JfcHJlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IF9fa3Byb2JlcyBhZ2dyX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcHJvYmUgKmtwOwogCkBAIC0xOTgsOCArMjIxLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYWdncl9wb3N0X2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgX19rcHJvYmVzIGFnZ3JfcG9zdF9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBrcHJvYmUgKmtwOwogCkBAIC0yMTMsOCArMjM2LDggQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbnQgYWdncl9mYXVsdF9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJICAgICAgaW50IHRyYXBucikKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGFnZ3JfZmF1bHRfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJaW50IHRyYXBucikKIHsKIAkvKgogCSAqIGlmIHdlIGZhdWx0ZWQgImR1cmluZyIgdGhlIGV4ZWN1dGlvbiBvZiBhIHVzZXIgc3BlY2lmaWVkCkBAIC0yMjcsNyArMjUwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZ2dyX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IF9fa3Byb2JlcyBhZ2dyX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGtwcm9iZSAqa3AgPSBjdXJyX2twcm9iZTsKIAlpZiAoY3Vycl9rcHJvYmUgJiYga3AtPmJyZWFrX2hhbmRsZXIpIHsKQEAgLTI0MCw3ICsyNjMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpnZXRfZnJlZV9ycF9pbnN0KHN0cnVjdCBrcmV0cHJvYmUgKnJwKQorc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSBfX2twcm9iZXMgKmdldF9mcmVlX3JwX2luc3Qoc3RydWN0IGtyZXRwcm9iZSAqcnApCiB7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CiAJc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CkBAIC0yNDksNyArMjcyLDggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKmdldF91c2VkX3JwX2luc3Qoc3RydWN0IGtyZXRwcm9iZSAqcnApCitzdGF0aWMgc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSBfX2twcm9iZXMgKmdldF91c2VkX3JwX2luc3Qoc3RydWN0IGtyZXRwcm9iZQorCQkJCQkJCSAgICAgICpycCkKIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKIAlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaTsKQEAgLTI1OCw3ICsyODIsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIGFkZF9ycF9pbnN0KHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpKQordm9pZCBfX2twcm9iZXMgYWRkX3JwX2luc3Qoc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmkpCiB7CiAJLyoKIAkgKiBSZW1vdmUgcnAgaW5zdCBvZmYgdGhlIGZyZWUgbGlzdCAtCkBAIC0yNzYsNyArMzAwLDcgQEAKIAlobGlzdF9hZGRfaGVhZCgmcmktPnVmbGlzdCwgJnJpLT5ycC0+dXNlZF9pbnN0YW5jZXMpOwogfQogCi12b2lkIHJlY3ljbGVfcnBfaW5zdChzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaSkKK3ZvaWQgX19rcHJvYmVzIHJlY3ljbGVfcnBfaW5zdChzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaSkKIHsKIAkvKiByZW1vdmUgcnAgaW5zdCBvZmYgdGhlIHJwcm9iZV9pbnN0X3RhYmxlICovCiAJaGxpc3RfZGVsKCZyaS0+aGxpc3QpOwpAQCAtMjkxLDcgKzMxNSw3IEBACiAJCWtmcmVlKHJpKTsKIH0KIAotc3RydWN0IGhsaXN0X2hlYWQgKiBrcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQorc3RydWN0IGhsaXN0X2hlYWQgX19rcHJvYmVzICprcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXJldHVybiAma3JldHByb2JlX2luc3RfdGFibGVbaGFzaF9wdHIodHNrLCBLUFJPQkVfSEFTSF9CSVRTKV07CiB9CkBAIC0zMDIsNyArMzI2LDcgQEAKICAqIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXNrLiBUaGVzZSBsZWZ0IG92ZXIgaW5zdGFuY2VzIHJlcHJlc2VudAogICogcHJvYmVkIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBjYWxsZWQgYnV0IHdpbGwgbmV2ZXIgcmV0dXJuLgogICovCi12b2lkIGtwcm9iZV9mbHVzaF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGspCit2b2lkIF9fa3Byb2JlcyBrcHJvYmVfZmx1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRrKQogewogICAgICAgICBzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaTsKICAgICAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CkBAIC0zMjIsNyArMzQ2LDggQEAKICAqIFRoaXMga3Byb2JlIHByZV9oYW5kbGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCBldmVyeSBrcmV0cHJvYmUuIFdoZW4gcHJvYmUKICAqIGhpdHMgaXQgd2lsbCBzZXQgdXAgdGhlIHJldHVybiBwcm9iZS4KICAqLwotc3RhdGljIGludCBwcmVfaGFuZGxlcl9rcmV0cHJvYmUoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IF9fa3Byb2JlcyBwcmVfaGFuZGxlcl9rcmV0cHJvYmUoc3RydWN0IGtwcm9iZSAqcCwKKwkJCQkJICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGtyZXRwcm9iZSAqcnAgPSBjb250YWluZXJfb2YocCwgc3RydWN0IGtyZXRwcm9iZSwga3ApOwogCkBAIC0zNTMsNyArMzc4LDcgQEAKICogQWRkIHRoZSBuZXcgcHJvYmUgdG8gb2xkX3AtPmxpc3QuIEZhaWwgaWYgdGhpcyBpcyB0aGUKICogc2Vjb25kIGpwcm9iZSBhdCB0aGUgYWRkcmVzcyAtIHR3byBqcHJvYmVzIGNhbid0IGNvZXhpc3QKICovCi1zdGF0aWMgaW50IGFkZF9uZXdfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKm9sZF9wLCBzdHJ1Y3Qga3Byb2JlICpwKQorc3RhdGljIGludCBfX2twcm9iZXMgYWRkX25ld19rcHJvYmUoc3RydWN0IGtwcm9iZSAqb2xkX3AsIHN0cnVjdCBrcHJvYmUgKnApCiB7CiAgICAgICAgIHN0cnVjdCBrcHJvYmUgKmtwOwogCkBAIC0zOTUsNyArNDIwLDggQEAKICAqIHRoZSBpbnRyaWNhY2llcwogICogVE9ETzogTW92ZSBrY2FsbG9jIG91dHNpZGUgdGhlIHNwaW5sb2NrCiAgKi8KLXN0YXRpYyBpbnQgcmVnaXN0ZXJfYWdncl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqb2xkX3AsIHN0cnVjdCBrcHJvYmUgKnApCitzdGF0aWMgaW50IF9fa3Byb2JlcyByZWdpc3Rlcl9hZ2dyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpvbGRfcCwKKwkJCQkJICBzdHJ1Y3Qga3Byb2JlICpwKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBrcHJvYmUgKmFwOwpAQCAtNDM0LDE1ICs0NjAsMjUgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma3Byb2JlX2xvY2ssIGZsYWdzKTsKIH0KIAotaW50IHJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQorc3RhdGljIGludCBfX2twcm9iZXMgaW5fa3Byb2Jlc19mdW5jdGlvbnModW5zaWduZWQgbG9uZyBhZGRyKQoreworCWlmIChhZGRyID49ICh1bnNpZ25lZCBsb25nKV9fa3Byb2Jlc190ZXh0X3N0YXJ0CisJCSYmIGFkZHIgPCAodW5zaWduZWQgbG9uZylfX2twcm9iZXNfdGV4dF9lbmQpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCXN0cnVjdCBrcHJvYmUgKm9sZF9wOwogCi0JaWYgKChyZXQgPSBhcmNoX3ByZXBhcmVfa3Byb2JlKHApKSAhPSAwKSB7CisJaWYgKChyZXQgPSBpbl9rcHJvYmVzX2Z1bmN0aW9ucygodW5zaWduZWQgbG9uZykgcC0+YWRkcikpICE9IDApCisJCXJldHVybiByZXQ7CisJaWYgKChyZXQgPSBhcmNoX3ByZXBhcmVfa3Byb2JlKHApKSAhPSAwKQogCQlnb3RvIHJtX2twcm9iZTsKLQl9CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgma3Byb2JlX2xvY2ssIGZsYWdzKTsKIAlvbGRfcCA9IGdldF9rcHJvYmUocC0+YWRkcik7CiAJcC0+bm1pc3NlZCA9IDA7CkBAIC00NjYsNyArNTAyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIHVucmVnaXN0ZXJfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGtwcm9iZSAqb2xkX3A7CkBAIC00ODcsNyArNTIzLDcgQEAKIAkucHJpb3JpdHkgPSAweDdmZmZmZmZmIC8qIHdlIG5lZWQgdG8gbm90aWZpZWQgZmlyc3QgKi8KIH07CiAKLWludCByZWdpc3Rlcl9qcHJvYmUoc3RydWN0IGpwcm9iZSAqanApCitpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2pwcm9iZShzdHJ1Y3QganByb2JlICpqcCkKIHsKIAkvKiBUb2RvOiBWZXJpZnkgcHJvYmVwb2ludCBpcyBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50ICovCiAJanAtPmtwLnByZV9oYW5kbGVyID0gc2V0am1wX3ByZV9oYW5kbGVyOwpAQCAtNDk2LDE0ICs1MzIsMTQgQEAKIAlyZXR1cm4gcmVnaXN0ZXJfa3Byb2JlKCZqcC0+a3ApOwogfQogCi12b2lkIHVucmVnaXN0ZXJfanByb2JlKHN0cnVjdCBqcHJvYmUgKmpwKQordm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9qcHJvYmUoc3RydWN0IGpwcm9iZSAqanApCiB7CiAJdW5yZWdpc3Rlcl9rcHJvYmUoJmpwLT5rcCk7CiB9CiAKICNpZmRlZiBBUkNIX1NVUFBPUlRTX0tSRVRQUk9CRVMKIAotaW50IHJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCkKK2ludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKmluc3Q7CkBAIC01NDAsMTQgKzU3NiwxNCBAQAogCiAjZWxzZSAvKiBBUkNIX1NVUFBPUlRTX0tSRVRQUk9CRVMgKi8KIAotaW50IHJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCkKK2ludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwKQogewogCXJldHVybiAtRU5PU1lTOwogfQogCiAjZW5kaWYgLyogQVJDSF9TVVBQT1JUU19LUkVUUFJPQkVTICovCiAKLXZvaWQgdW5yZWdpc3Rlcl9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnApCit2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IGMzMjk5NWYuLjRiMzlkMzcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTE1MDksNiArMTUwOSw3IEBACiAJbG9uZyBlcnIgPSAwOwogCXZvaWQgKnBlcmNwdSA9IE5VTEwsICpwdHIgPSBOVUxMOyAvKiBTdG9wcyBzcHVyaW91cyBnY2Mgd2FybmluZyAqLwogCXN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmV4dGFibGU7CisJbW1fc2VnbWVudF90IG9sZF9mczsKIAogCURFQlVHUCgibG9hZF9tb2R1bGU6IHVtb2Q9JXAsIGxlbj0lbHUsIHVhcmdzPSVwXG4iLAogCSAgICAgICB1bW9kLCBsZW4sIHVhcmdzKTsKQEAgLTE3NzksNiArMTc4MCwyNCBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGNsZWFudXA7CiAKKwkvKiBmbHVzaCB0aGUgaWNhY2hlIGluIGNvcnJlY3QgY29udGV4dCAqLworCW9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCisJLyoKKwkgKiBGbHVzaCB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUsIHNpbmNlIHdlJ3ZlIHBsYXllZCB3aXRoIHRleHQuCisJICogRG8gaXQgYmVmb3JlIHByb2Nlc3Npbmcgb2YgbW9kdWxlIHBhcmFtZXRlcnMsIHNvIHRoZSBtb2R1bGUKKwkgKiBjYW4gcHJvdmlkZSBwYXJhbWV0ZXIgYWNjZXNzb3IgZnVuY3Rpb25zIG9mIGl0cyBvd24uCisJICovCisJaWYgKG1vZC0+bW9kdWxlX2luaXQpCisJCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9pbml0LAorCQkJCSAgICh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2luaXQKKwkJCQkgICArIG1vZC0+aW5pdF9zaXplKTsKKwlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpbW9kLT5tb2R1bGVfY29yZSwKKwkJCSAgICh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2NvcmUgKyBtb2QtPmNvcmVfc2l6ZSk7CisKKwlzZXRfZnMob2xkX2ZzKTsKKwogCW1vZC0+YXJncyA9IGFyZ3M7CiAJaWYgKG9ic3Bhcm1pbmRleCkgewogCQllcnIgPSBvYnNvbGV0ZV9wYXJhbXMobW9kLT5uYW1lLCBtb2QtPmFyZ3MsCkBAIC0xODYwLDcgKzE4NzksNiBAQAogCQljb25zdCBjaGFyIF9fdXNlciAqdWFyZ3MpCiB7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwotCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKIAlpbnQgcmV0ID0gMDsKIAogCS8qIE11c3QgaGF2ZSBwZXJtaXNzaW9uICovCkBAIC0xODc4LDE5ICsxODk2LDYgQEAKIAkJcmV0dXJuIFBUUl9FUlIobW9kKTsKIAl9CiAKLQkvKiBmbHVzaCB0aGUgaWNhY2hlIGluIGNvcnJlY3QgY29udGV4dCAqLwotCXNldF9mcyhLRVJORUxfRFMpOwotCi0JLyogRmx1c2ggdGhlIGluc3RydWN0aW9uIGNhY2hlLCBzaW5jZSB3ZSd2ZSBwbGF5ZWQgd2l0aCB0ZXh0ICovCi0JaWYgKG1vZC0+bW9kdWxlX2luaXQpCi0JCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9pbml0LAotCQkJCSAgICh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2luaXQKLQkJCQkgICArIG1vZC0+aW5pdF9zaXplKTsKLQlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpbW9kLT5tb2R1bGVfY29yZSwKLQkJCSAgICh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2NvcmUgKyBtb2QtPmNvcmVfc2l6ZSk7Ci0KLQlzZXRfZnMob2xkX2ZzKTsKLQogCS8qIE5vdyBzZXcgaXQgaW50byB0aGUgbGlzdHMuICBUaGV5IHdvbid0IGFjY2VzcyB1cywgc2luY2UKICAgICAgICAgICAgc3Ryb25nX3RyeV9tb2R1bGVfZ2V0KCkgd2lsbCBmYWlsLiAqLwogCXN0b3BfbWFjaGluZV9ydW4oX19saW5rX21vZHVsZSwgbW9kLCBOUl9DUFVTKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wYXJhbXMuYyBiL2tlcm5lbC9wYXJhbXMuYwppbmRleCBkNTg2YzM1Li5mYmYxNzMyIDEwMDY0NAotLS0gYS9rZXJuZWwvcGFyYW1zLmMKKysrIGIva2VybmVsL3BhcmFtcy5jCkBAIC01NDIsOCArNTQyLDggQEAKIHsKIAlzdHJ1Y3QgbW9kdWxlX2tvYmplY3QgKm1rOwogCi0JbWsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbW9kdWxlX2tvYmplY3QpLCBHRlBfS0VSTkVMKTsKLQltZW1zZXQobWssIDAsIHNpemVvZihzdHJ1Y3QgbW9kdWxlX2tvYmplY3QpKTsKKwltayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtb2R1bGVfa29iamVjdCksIEdGUF9LRVJORUwpOworCUJVR19PTighbWspOwogCiAJbWstPm1vZCA9IFRISVNfTU9EVUxFOwogCWtvYmpfc2V0X2tzZXRfcyhtaywgbW9kdWxlX3N1YnN5cyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG9zaXgtdGltZXJzLmMgYi9rZXJuZWwvcG9zaXgtdGltZXJzLmMKaW5kZXggMzg3OThhMi4uYjdiNTMyYSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvc2l4LXRpbWVycy5jCisrKyBiL2tlcm5lbC9wb3NpeC10aW1lcnMuYwpAQCAtNDI3LDIxICs0MjcsMjMgQEAKIAl0aW1yLT5zaWdxLT5pbmZvLnNpX2NvZGUgPSBTSV9USU1FUjsKIAl0aW1yLT5zaWdxLT5pbmZvLnNpX3RpZCA9IHRpbXItPml0X2lkOwogCXRpbXItPnNpZ3EtPmluZm8uc2lfdmFsdWUgPSB0aW1yLT5pdF9zaWdldl92YWx1ZTsKKwogCWlmICh0aW1yLT5pdF9zaWdldl9ub3RpZnkgJiBTSUdFVl9USFJFQURfSUQpIHsKLQkJaWYgKHVubGlrZWx5KHRpbXItPml0X3Byb2Nlc3MtPmZsYWdzICYgUEZfRVhJVElORykpIHsKLQkJCXRpbXItPml0X3NpZ2V2X25vdGlmeSA9IFNJR0VWX1NJR05BTDsKLQkJCXB1dF90YXNrX3N0cnVjdCh0aW1yLT5pdF9wcm9jZXNzKTsKLQkJCXRpbXItPml0X3Byb2Nlc3MgPSB0aW1yLT5pdF9wcm9jZXNzLT5ncm91cF9sZWFkZXI7Ci0JCQlnb3RvIGdyb3VwOwotCQl9Ci0JCXJldHVybiBzZW5kX3NpZ3F1ZXVlKHRpbXItPml0X3NpZ2V2X3NpZ25vLCB0aW1yLT5zaWdxLAotCQkJdGltci0+aXRfcHJvY2Vzcyk7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGVhZGVyOworCQlpbnQgcmV0ID0gc2VuZF9zaWdxdWV1ZSh0aW1yLT5pdF9zaWdldl9zaWdubywgdGltci0+c2lncSwKKwkJCQkJdGltci0+aXRfcHJvY2Vzcyk7CisKKwkJaWYgKGxpa2VseShyZXQgPj0gMCkpCisJCQlyZXR1cm4gcmV0OworCisJCXRpbXItPml0X3NpZ2V2X25vdGlmeSA9IFNJR0VWX1NJR05BTDsKKwkJbGVhZGVyID0gdGltci0+aXRfcHJvY2Vzcy0+Z3JvdXBfbGVhZGVyOworCQlwdXRfdGFza19zdHJ1Y3QodGltci0+aXRfcHJvY2Vzcyk7CisJCXRpbXItPml0X3Byb2Nlc3MgPSBsZWFkZXI7CiAJfQotCWVsc2UgewotCWdyb3VwOgotCQlyZXR1cm4gc2VuZF9ncm91cF9zaWdxdWV1ZSh0aW1yLT5pdF9zaWdldl9zaWdubywgdGltci0+c2lncSwKLQkJCXRpbXItPml0X3Byb2Nlc3MpOwotCX0KKworCXJldHVybiBzZW5kX2dyb3VwX3NpZ3F1ZXVlKHRpbXItPml0X3NpZ2V2X3NpZ25vLCB0aW1yLT5zaWdxLAorCQkJCSAgIHRpbXItPml0X3Byb2Nlc3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocG9zaXhfdGltZXJfZXZlbnQpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCmluZGV4IDJjNzEyMWQuLjM5NmM3ODcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnCisrKyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogY29uZmlnIFBNCiAJYm9vbCAiUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0IgorCWRlcGVuZHMgb24gIUlBNjRfSFBfU0lNCiAJLS0taGVscC0tLQogCSAgIlBvd2VyIE1hbmFnZW1lbnQiIG1lYW5zIHRoYXQgcGFydHMgb2YgeW91ciBjb21wdXRlciBhcmUgc2h1dAogCSAgb2ZmIG9yIHB1dCBpbnRvIGEgcG93ZXIgY29uc2VydmluZyAic2xlZXAiIG1vZGUgaWYgdGhleSBhcmUgbm90CkBAIC0yOCw3ICsyOSw3IEBACiAKIGNvbmZpZyBTT0ZUV0FSRV9TVVNQRU5ECiAJYm9vbCAiU29mdHdhcmUgU3VzcGVuZCIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBQTSAmJiBTV0FQICYmICgoWDg2ICYmIFNNUCkgfHwgKChGVlIgfHwgUFBDMzIgfHwgWDg2KSAmJiAhU01QKSkKKwlkZXBlbmRzIG9uIFBNICYmIFNXQVAgJiYgKFg4NiB8fCAoKEZWUiB8fCBQUEMzMikgJiYgIVNNUCkpCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHRoZSBwb3NzaWJpbGl0eSBvZiBzdXNwZW5kaW5nIHRoZSBtYWNoaW5lLgogCSAgSXQgZG9lc24ndCBuZWVkIEFQTS4KQEAgLTcyLDYgKzczLDE4IEBACiAJICBzdXNwZW5kZWQgaW1hZ2UgdG8uIEl0IHdpbGwgc2ltcGx5IHBpY2sgdGhlIGZpcnN0IGF2YWlsYWJsZSBzd2FwIAogCSAgZGV2aWNlLgogCitjb25maWcgU1dTVVNQX0VOQ1JZUFQKKwlib29sICJFbmNyeXB0IHN1c3BlbmQgaW1hZ2UiCisJZGVwZW5kcyBvbiBTT0ZUV0FSRV9TVVNQRU5EICYmIENSWVBUTz15ICYmIChDUllQVE9fQUVTPXkgfHwgQ1JZUFRPX0FFU181ODY9eSB8fCBDUllQVE9fQUVTX1g4Nl82ND15KQorCWRlZmF1bHQgIiIKKwktLS1oZWxwLS0tCisJICBUbyBwcmV2ZW50IGRhdGEgZ2F0aGVyaW5nIGZyb20gc3dhcCBhZnRlciByZXN1bWUgeW91IGNhbiBlbmNyeXB0CisJICB0aGUgc3VzcGVuZCBpbWFnZSB3aXRoIGEgdGVtcG9yYXJ5IGtleSB0aGF0IGlzIGRlbGV0ZWQgb24KKwkgIHJlc3VtZS4KKworCSAgTm90ZSB0aGF0IHRoZSB0ZW1wb3Jhcnkga2V5IGlzIHN0b3JlZCB1bmVuY3J5cHRlZCBvbiBkaXNrIHdoaWxlIHRoZQorCSAgc3lzdGVtIGlzIHN1c3BlbmRlZC4KKwogY29uZmlnIFNVU1BFTkRfU01QCiAJYm9vbAogCWRlcGVuZHMgb24gSE9UUExVR19DUFUgJiYgWDg2ICYmIFBNCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvZGlzay5jIGIva2VybmVsL3Bvd2VyL2Rpc2suYwppbmRleCA2NjRlYjA0Li4yZDhiZjA1IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvZGlzay5jCisrKyBiL2tlcm5lbC9wb3dlci9kaXNrLmMKQEAgLTExMiwyNCArMTEyLDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBmaW5pc2godm9pZCkKLXsKLQlkZXZpY2VfcmVzdW1lKCk7Ci0JcGxhdGZvcm1fZmluaXNoKCk7Ci0JdGhhd19wcm9jZXNzZXMoKTsKLQllbmFibGVfbm9uYm9vdF9jcHVzKCk7Ci0JcG1fcmVzdG9yZV9jb25zb2xlKCk7Ci19Ci0KLQogc3RhdGljIGludCBwcmVwYXJlX3Byb2Nlc3Nlcyh2b2lkKQogewogCWludCBlcnJvcjsKIAogCXBtX3ByZXBhcmVfY29uc29sZSgpOwotCiAJc3lzX3N5bmMoKTsKLQogCWRpc2FibGVfbm9uYm9vdF9jcHVzKCk7CiAKIAlpZiAoZnJlZXplX3Byb2Nlc3NlcygpKSB7CkBAIC0xNjIsMTUgKzE1MCw2IEBACiAJcG1fcmVzdG9yZV9jb25zb2xlKCk7CiB9CiAKLXN0YXRpYyBpbnQgcHJlcGFyZV9kZXZpY2VzKHZvaWQpCi17Ci0JaW50IGVycm9yOwotCi0JaWYgKChlcnJvciA9IGRldmljZV9zdXNwZW5kKFBNU0dfRlJFRVpFKSkpCi0JCXByaW50aygiU29tZSBkZXZpY2VzIGZhaWxlZCB0byBzdXNwZW5kXG4iKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIC8qKgogICoJcG1fc3VzcGVuZF9kaXNrIC0gVGhlIGdyYW5wYXBweSBvZiBwb3dlciBtYW5hZ2VtZW50LgogICoKQEAgLTE4NywxNyArMTY2LDE0IEBACiAJZXJyb3IgPSBwcmVwYXJlX3Byb2Nlc3NlcygpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwotCWVycm9yID0gcHJlcGFyZV9kZXZpY2VzKCk7CiAKKwllcnJvciA9IGRldmljZV9zdXNwZW5kKFBNU0dfRlJFRVpFKTsKIAlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKCJTb21lIGRldmljZXMgZmFpbGVkIHRvIHN1c3BlbmRcbiIpOwogCQl1bnByZXBhcmVfcHJvY2Vzc2VzKCk7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlwcl9kZWJ1ZygiUE06IEF0dGVtcHRpbmcgdG8gc3VzcGVuZCB0byBkaXNrLlxuIik7Ci0JaWYgKHBtX2Rpc2tfbW9kZSA9PSBQTV9ESVNLX0ZJUk1XQVJFKQotCQlyZXR1cm4gcG1fb3BzLT5lbnRlcihQTV9TVVNQRU5EX0RJU0spOwotCiAJcHJfZGVidWcoIlBNOiBzbmFwc2hvdHRpbmcgbWVtb3J5LlxuIik7CiAJaW5fc3VzcGVuZCA9IDE7CiAJaWYgKChlcnJvciA9IHN3c3VzcF9zdXNwZW5kKCkpKQpAQCAtMjA4LDExICsxODQsMjAgQEAKIAkJZXJyb3IgPSBzd3N1c3Bfd3JpdGUoKTsKIAkJaWYgKCFlcnJvcikKIAkJCXBvd2VyX2Rvd24ocG1fZGlza19tb2RlKTsKKwkJZWxzZSB7CisJCS8qIHN3c3VzcF93cml0ZSBjYW4gbm90IGZhaWwgaW4gZGV2aWNlX3Jlc3VtZSwKKwkJICAgbm8gbmVlZCB0byBkbyBzZWNvbmQgZGV2aWNlX3Jlc3VtZSAqLworCQkJc3dzdXNwX2ZyZWUoKTsKKwkJCXVucHJlcGFyZV9wcm9jZXNzZXMoKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQogCX0gZWxzZQogCQlwcl9kZWJ1ZygiUE06IEltYWdlIHJlc3RvcmVkIHN1Y2Nlc3NmdWxseS5cbiIpOworCiAJc3dzdXNwX2ZyZWUoKTsKICBEb25lOgotCWZpbmlzaCgpOworCWRldmljZV9yZXN1bWUoKTsKKwl1bnByZXBhcmVfcHJvY2Vzc2VzKCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0yMzMsOSArMjE4LDEyIEBACiB7CiAJaW50IGVycm9yOwogCisJZG93bigmcG1fc2VtKTsKIAlpZiAoIXN3c3VzcF9yZXN1bWVfZGV2aWNlKSB7Ci0JCWlmICghc3RybGVuKHJlc3VtZV9maWxlKSkKKwkJaWYgKCFzdHJsZW4ocmVzdW1lX2ZpbGUpKSB7CisJCQl1cCgmcG1fc2VtKTsKIAkJCXJldHVybiAtRU5PRU5UOworCQl9CiAJCXN3c3VzcF9yZXN1bWVfZGV2aWNlID0gbmFtZV90b19kZXZfdChyZXN1bWVfZmlsZSk7CiAJCXByX2RlYnVnKCJzd3N1c3A6IFJlc3VtZSBGcm9tIFBhcnRpdGlvbiAlc1xuIiwgcmVzdW1lX2ZpbGUpOwogCX0gZWxzZSB7CkBAIC0yNDgsNiArMjM2LDcgQEAKIAkJICogRklYTUU6IElmIG5vcmVzdW1lIGlzIHNwZWNpZmllZCwgd2UgbmVlZCB0byBmaW5kIHRoZSBwYXJ0aXRpb24KIAkJICogYW5kIHJlc2V0IGl0IGJhY2sgdG8gbm9ybWFsIHN3YXAgc3BhY2UuCiAJCSAqLworCQl1cCgmcG1fc2VtKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yNzAsMjAgKzI1OSwyNCBAQAogCiAJcHJfZGVidWcoIlBNOiBQcmVwYXJpbmcgZGV2aWNlcyBmb3IgcmVzdG9yZS5cbiIpOwogCi0JaWYgKChlcnJvciA9IHByZXBhcmVfZGV2aWNlcygpKSkKKwlpZiAoKGVycm9yID0gZGV2aWNlX3N1c3BlbmQoUE1TR19GUkVFWkUpKSkgeworCQlwcmludGsoIlNvbWUgZGV2aWNlcyBmYWlsZWQgdG8gc3VzcGVuZFxuIik7CiAJCWdvdG8gRnJlZTsKKwl9CiAKIAltYigpOwogCiAJcHJfZGVidWcoIlBNOiBSZXN0b3Jpbmcgc2F2ZWQgaW1hZ2UuXG4iKTsKIAlzd3N1c3BfcmVzdW1lKCk7CiAJcHJfZGVidWcoIlBNOiBSZXN0b3JlIGZhaWxlZCwgcmVjb3ZlcmluZy5uIik7Ci0JZmluaXNoKCk7CisJZGV2aWNlX3Jlc3VtZSgpOwogIEZyZWU6CiAJc3dzdXNwX2ZyZWUoKTsKICBDbGVhbnVwOgogCXVucHJlcGFyZV9wcm9jZXNzZXMoKTsKICBEb25lOgorCS8qIEZvciBzdWNjZXNzIGNhc2UsIHRoZSBzdXNwZW5kIHBhdGggd2lsbCByZWxlYXNlIHRoZSBsb2NrICovCisJdXAoJnBtX3NlbSk7CiAJcHJfZGVidWcoIlBNOiBSZXN1bWUgZnJvbSBkaXNrIGZhaWxlZC5cbiIpOwogCXJldHVybiAwOwogfQpAQCAtMzkwLDcgKzM4Myw5IEBACiAJaWYgKHNzY2FuZihidWYsICIldToldSIsICZtYWosICZtaW4pID09IDIpIHsKIAkJcmVzID0gTUtERVYobWFqLG1pbik7CiAJCWlmIChtYWogPT0gTUFKT1IocmVzKSAmJiBtaW4gPT0gTUlOT1IocmVzKSkgeworCQkJZG93bigmcG1fc2VtKTsKIAkJCXN3c3VzcF9yZXN1bWVfZGV2aWNlID0gcmVzOworCQkJdXAoJnBtX3NlbSk7CiAJCQlwcmludGsoIkF0dGVtcHRpbmcgbWFudWFsIHJlc3VtZVxuIik7CiAJCQlub3Jlc3VtZSA9IDA7CiAJCQlzb2Z0d2FyZV9yZXN1bWUoKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9tYWluLmMgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCmluZGV4IDcxYWEwZmQuLjIyYmRjOTMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9tYWluLmMKKysrIGIva2VybmVsL3Bvd2VyL21haW4uYwpAQCAtMTQzLDExICsxNDMsMTIgQEAKIAogCiAKLXN0YXRpYyBjaGFyICogcG1fc3RhdGVzW10gPSB7CitzdGF0aWMgY2hhciAqcG1fc3RhdGVzW1BNX1NVU1BFTkRfTUFYXSA9IHsKIAlbUE1fU1VTUEVORF9TVEFOREJZXQk9ICJzdGFuZGJ5IiwKIAlbUE1fU1VTUEVORF9NRU1dCT0gIm1lbSIsCisjaWZkZWYgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQKIAlbUE1fU1VTUEVORF9ESVNLXQk9ICJkaXNrIiwKLQlOVUxMLAorI2VuZGlmCiB9OwogCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wbS5jIGIva2VybmVsL3Bvd2VyL3BtLmMKaW5kZXggNjFkZWRhMC4uMTU5MTQ5MyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3BtLmMKKysrIGIva2VybmVsL3Bvd2VyL3BtLmMKQEAgLTYwLDkgKzYwLDggQEAKIAkJCSAgIHVuc2lnbmVkIGxvbmcgaWQsCiAJCQkgICBwbV9jYWxsYmFjayBjYWxsYmFjaykKIHsKLQlzdHJ1Y3QgcG1fZGV2ICpkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG1fZGV2KSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHBtX2RldiAqZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBtX2RldiksIEdGUF9LRVJORUwpOwogCWlmIChkZXYpIHsKLQkJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKCpkZXYpKTsKIAkJZGV2LT50eXBlID0gdHlwZTsKIAkJZGV2LT5pZCA9IGlkOwogCQlkZXYtPmNhbGxiYWNrID0gY2FsbGJhY2s7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvcHJvY2Vzcy5jIGIva2VybmVsL3Bvd2VyL3Byb2Nlc3MuYwppbmRleCAzYmQwZDI2Li4yOGRlMTE4IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvcHJvY2Vzcy5jCisrKyBiL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMKQEAgLTM4LDcgKzM4LDYgQEAKIAkgICBwcm9jZXNzZXMgYXJvdW5kPyAqLwogCWxvbmcgc2F2ZTsKIAlzYXZlID0gY3VycmVudC0+c3RhdGU7Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKIAlwcl9kZWJ1ZygiJXMgZW50ZXJlZCByZWZyaWdlcmF0b3JcbiIsIGN1cnJlbnQtPmNvbW0pOwogCXByaW50aygiPSIpOwogCkBAIC00Nyw4ICs0NiwxMCBAQAogCXJlY2FsY19zaWdwZW5kaW5nKCk7IC8qIFdlIHNlbnQgZmFrZSBzaWduYWwsIGNsZWFuIGl0IHVwICovCiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCXdoaWxlIChmcm96ZW4oY3VycmVudCkpCisJd2hpbGUgKGZyb3plbihjdXJyZW50KSkgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOwogCQlzY2hlZHVsZSgpOworCX0KIAlwcl9kZWJ1ZygiJXMgbGVmdCByZWZyaWdlcmF0b3JcbiIsIGN1cnJlbnQtPmNvbW0pOwogCWN1cnJlbnQtPnN0YXRlID0gc2F2ZTsKIH0KQEAgLTgwLDEzICs4MSwzMyBAQAogCQl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOwogCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJCXlpZWxkKCk7CQkJLyogWWllbGQgaXMgb2theSBoZXJlICovCi0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0X3RpbWUgKyBUSU1FT1VUKSkgeworCQlpZiAodG9kbyAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0X3RpbWUgKyBUSU1FT1VUKSkgewogCQkJcHJpbnRrKCAiXG4iICk7CiAJCQlwcmludGsoS0VSTl9FUlIgIiBzdG9wcGluZyB0YXNrcyBmYWlsZWQgKCVkIHRhc2tzIHJlbWFpbmluZylcbiIsIHRvZG8gKTsKLQkJCXJldHVybiB0b2RvOworCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlKHRvZG8pOwogCisJLyogVGhpcyBkb2VzIG5vdCB1bmZyZWV6ZSBwcm9jZXNzZXMgdGhhdCBhcmUgYWxyZWFkeSBmcm96ZW4KKwkgKiAod2UgaGF2ZSBzbGlnaHRseSB1Z2x5IGNhbGxpbmcgY29udmVudGlvbiBpbiB0aGF0IHJlc3BlY3QsCisJICogYW5kIGNhbGxlciBtdXN0IGNhbGwgdGhhd19wcm9jZXNzZXMoKSBpZiBzb21ldGhpbmcgZmFpbHMpLAorCSAqIGJ1dCBpdCBjbGVhbnMgdXAgbGVmdG92ZXIgUEZfRlJFRVpFIHJlcXVlc3RzLgorCSAqLworCWlmICh0b2RvKSB7CisJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJCWRvX2VhY2hfdGhyZWFkKGcsIHApCisJCQlpZiAoZnJlZXppbmcocCkpIHsKKwkJCQlwcl9kZWJ1ZygiICBjbGVhbiB1cDogJXNcbiIsIHAtPmNvbW0pOworCQkJCXAtPmZsYWdzICY9IH5QRl9GUkVFWkU7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwkJCQlyZWNhbGNfc2lncGVuZGluZ190c2socCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQkJfQorCQl3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKKwkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQlyZXR1cm4gdG9kbzsKKwl9CisKIAlwcmludGsoICJ8XG4iICk7CiAJQlVHX09OKGluX2F0b21pYygpKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zd3N1c3AuYyBiL2tlcm5lbC9wb3dlci9zd3N1c3AuYwppbmRleCBmMmJjNzFiLi5kOTY3ZTg3IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc3dzdXNwLmMKKysrIGIva2VybmVsL3Bvd2VyL3N3c3VzcC5jCkBAIC0zMSw2ICszMSw5IEBACiAgKiBBbGV4IEJhZGVhIDx2YW1waXJlQGdvLnJvPjoKICAqIEZpeGVkIHJ1bmF3YXkgaW5pdAogICoKKyAqIEFuZHJlYXMgU3RlaW5tZXR6IDxhc3RAZG9tZHYuZGU+OgorICogQWRkZWQgZW5jcnlwdGVkIHN1c3BlbmQgb3B0aW9uCisgKgogICogTW9yZSBzdGF0ZSBzYXZlcnMgYXJlIHdlbGNvbWUuIEVzcGVjaWFsbHkgZm9yIHRoZSBzY3NpIGxheWVyLi4uCiAgKgogICogRm9yIFRPRE9zLEZJWE1FcyBhbHNvIGxvb2sgaW4gRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CkBAIC03MSw4ICs3NCwxNiBAQAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisKICNpbmNsdWRlICJwb3dlci5oIgogCisjZGVmaW5lIENJUEhFUiAiYWVzIgorI2RlZmluZSBNQVhLRVkgMzIKKyNkZWZpbmUgTUFYSVYgIDMyCisKIC8qIFJlZmVyZW5jZXMgdG8gc2VjdGlvbiBib3VuZGFyaWVzICovCiBleHRlcm4gY29uc3Qgdm9pZCBfX25vc2F2ZV9iZWdpbiwgX19ub3NhdmVfZW5kOwogCkBAIC0xMDMsNyArMTE0LDggQEAKICNkZWZpbmUgU1dTVVNQX1NJRwkiUzFTVVNQRU5EIgogCiBzdGF0aWMgc3RydWN0IHN3c3VzcF9oZWFkZXIgewotCWNoYXIgcmVzZXJ2ZWRbUEFHRV9TSVpFIC0gMjAgLSBzaXplb2Yoc3dwX2VudHJ5X3QpXTsKKwljaGFyIHJlc2VydmVkW1BBR0VfU0laRSAtIDIwIC0gTUFYS0VZIC0gTUFYSVYgLSBzaXplb2Yoc3dwX2VudHJ5X3QpXTsKKwl1OCBrZXlfaXZbTUFYS0VZK01BWElWXTsKIAlzd3BfZW50cnlfdCBzd3N1c3BfaW5mbzsKIAljaGFyCW9yaWdfc2lnWzEwXTsKIAljaGFyCXNpZ1sxMF07CkBAIC0xMjksNiArMTQxLDEzMSBAQAogc3RhdGljIHVuc2lnbmVkIHNob3J0IHN3YXBmaWxlX3VzZWRbTUFYX1NXQVBGSUxFU107CiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgcm9vdF9zd2FwOwogCitzdGF0aWMgaW50IHdyaXRlX3BhZ2UodW5zaWduZWQgbG9uZyBhZGRyLCBzd3BfZW50cnlfdCAqIGxvYyk7CitzdGF0aWMgaW50IGJpb19yZWFkX3BhZ2UocGdvZmZfdCBwYWdlX29mZiwgdm9pZCAqIHBhZ2UpOworCitzdGF0aWMgdTgga2V5X2l2W01BWEtFWStNQVhJVl07CisKKyNpZmRlZiBDT05GSUdfU1dTVVNQX0VOQ1JZUFQKKworc3RhdGljIGludCBjcnlwdG9faW5pdChpbnQgbW9kZSwgdm9pZCAqKm1lbSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCWludCBsZW47CisJY2hhciAqbW9kZW1zZzsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtOworCisJbW9kZW1zZyA9IG1vZGUgPyAic3VzcGVuZCBub3QgcG9zc2libGUiIDogInJlc3VtZSBub3QgcG9zc2libGUiOworCisJdGZtID0gY3J5cHRvX2FsbG9jX3RmbShDSVBIRVIsIENSWVBUT19URk1fTU9ERV9DQkMpOworCWlmKCF0Zm0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzd3N1c3A6IG5vIHRmbSwgJXNcbiIsIG1vZGVtc2cpOworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmKE1BWEtFWSA8IGNyeXB0b190Zm1fYWxnX21pbl9rZXlzaXplKHRmbSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzd3N1c3A6IGtleSBidWZmZXIgdG9vIHNtYWxsLCAlc1xuIiwgbW9kZW1zZyk7CisJCWVycm9yID0gLUVOT0tFWTsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChtb2RlKQorCQlnZXRfcmFuZG9tX2J5dGVzKGtleV9pdiwgTUFYS0VZK01BWElWKTsKKworCWxlbiA9IGNyeXB0b190Zm1fYWxnX21heF9rZXlzaXplKHRmbSk7CisJaWYgKGxlbiA+IE1BWEtFWSkKKwkJbGVuID0gTUFYS0VZOworCisJaWYgKGNyeXB0b19jaXBoZXJfc2V0a2V5KHRmbSwga2V5X2l2LCBsZW4pKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3dzdXNwOiBrZXkgc2V0dXAgZmFpbHVyZSwgJXNcbiIsIG1vZGVtc2cpOworCQllcnJvciA9IC1FS0VZUkVKRUNURUQ7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlsZW4gPSBjcnlwdG9fdGZtX2FsZ19pdnNpemUodGZtKTsKKworCWlmIChNQVhJViA8IGxlbikgeworCQlwcmludGsoS0VSTl9FUlIgInN3c3VzcDogaXYgYnVmZmVyIHRvbyBzbWFsbCwgJXNcbiIsIG1vZGVtc2cpOworCQllcnJvciA9IC1FT1ZFUkZMT1c7CisJCWdvdG8gZmFpbDsKKwl9CisKKwljcnlwdG9fY2lwaGVyX3NldF9pdih0Zm0sIGtleV9pditNQVhLRVksIGxlbik7CisKKwkqbWVtPSh2b2lkICopdGZtOworCisJZ290byBvdXQ7CisKK2ZhaWw6CWNyeXB0b19mcmVlX3RmbSh0Zm0pOworb3V0OglyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgY3J5cHRvX2V4aXQodm9pZCAqbWVtKQoreworCWNyeXB0b19mcmVlX3RmbSgoc3RydWN0IGNyeXB0b190Zm0gKiltZW0pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgY3J5cHRvX3dyaXRlKHN0cnVjdCBwYmUgKnAsIHZvaWQgKm1lbSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBzY2F0dGVybGlzdCBzcmMsIGRzdDsKKworCXNyYy5wYWdlICAgPSB2aXJ0X3RvX3BhZ2UocC0+YWRkcmVzcyk7CisJc3JjLm9mZnNldCA9IDA7CisJc3JjLmxlbmd0aCA9IFBBR0VfU0laRTsKKwlkc3QucGFnZSAgID0gdmlydF90b19wYWdlKCh2b2lkICopJnN3c3VzcF9oZWFkZXIpOworCWRzdC5vZmZzZXQgPSAwOworCWRzdC5sZW5ndGggPSBQQUdFX1NJWkU7CisKKwllcnJvciA9IGNyeXB0b19jaXBoZXJfZW5jcnlwdCgoc3RydWN0IGNyeXB0b190Zm0gKiltZW0sICZkc3QsICZzcmMsCisJCQkJCVBBR0VfU0laRSk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHdyaXRlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpJnN3c3VzcF9oZWFkZXIsCisJCQkJJihwLT5zd2FwX2FkZHJlc3MpKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBjcnlwdG9fcmVhZChzdHJ1Y3QgcGJlICpwLCB2b2lkICptZW0pCit7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc3JjLCBkc3Q7CisKKwllcnJvciA9IGJpb19yZWFkX3BhZ2Uoc3dwX29mZnNldChwLT5zd2FwX2FkZHJlc3MpLCAodm9pZCAqKXAtPmFkZHJlc3MpOworCWlmICghZXJyb3IpIHsKKwkJc3JjLm9mZnNldCA9IDA7CisJCXNyYy5sZW5ndGggPSBQQUdFX1NJWkU7CisJCWRzdC5vZmZzZXQgPSAwOworCQlkc3QubGVuZ3RoID0gUEFHRV9TSVpFOworCQlzcmMucGFnZSA9IGRzdC5wYWdlID0gdmlydF90b19wYWdlKCh2b2lkICopcC0+YWRkcmVzcyk7CisKKwkJZXJyb3IgPSBjcnlwdG9fY2lwaGVyX2RlY3J5cHQoKHN0cnVjdCBjcnlwdG9fdGZtICopbWVtLCAmZHN0LAorCQkJCQkJJnNyYywgUEFHRV9TSVpFKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorI2Vsc2UKK3N0YXRpYyBfX2lubGluZV9fIGludCBjcnlwdG9faW5pdChpbnQgbW9kZSwgdm9pZCAqbWVtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNyeXB0b19leGl0KHZvaWQgKm1lbSkKK3sKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGNyeXB0b193cml0ZShzdHJ1Y3QgcGJlICpwLCB2b2lkICptZW0pCit7CisJcmV0dXJuIHdyaXRlX3BhZ2UocC0+YWRkcmVzcywgJihwLT5zd2FwX2FkZHJlc3MpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGNyeXB0b19yZWFkKHN0cnVjdCBwYmUgKnAsIHZvaWQgKm1lbSkKK3sKKwlyZXR1cm4gYmlvX3JlYWRfcGFnZShzd3Bfb2Zmc2V0KHAtPnN3YXBfYWRkcmVzcyksICh2b2lkICopcC0+YWRkcmVzcyk7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBtYXJrX3N3YXBmaWxlcyhzd3BfZW50cnlfdCBwcmV2KQogewogCWludCBlcnJvcjsKQEAgLTE0MCw2ICsyNzcsNyBAQAogCSAgICAhbWVtY21wKCJTV0FQU1BBQ0UyIixzd3N1c3BfaGVhZGVyLnNpZywgMTApKSB7CiAJCW1lbWNweShzd3N1c3BfaGVhZGVyLm9yaWdfc2lnLHN3c3VzcF9oZWFkZXIuc2lnLCAxMCk7CiAJCW1lbWNweShzd3N1c3BfaGVhZGVyLnNpZyxTV1NVU1BfU0lHLCAxMCk7CisJCW1lbWNweShzd3N1c3BfaGVhZGVyLmtleV9pdiwga2V5X2l2LCBNQVhLRVkrTUFYSVYpOwogCQlzd3N1c3BfaGVhZGVyLnN3c3VzcF9pbmZvID0gcHJldjsKIAkJZXJyb3IgPSByd19zd2FwX3BhZ2Vfc3luYyhXUklURSwKIAkJCQkJICBzd3BfZW50cnkocm9vdF9zd2FwLCAwKSwKQEAgLTE3OSw5ICszMTcsOSBAQAogCWxlbj1zdHJsZW4ocmVzdW1lX2ZpbGUpOwogCXJvb3Rfc3dhcCA9IDB4RkZGRjsKIAotCXN3YXBfbGlzdF9sb2NrKCk7CisJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCWZvciAoaT0wOyBpPE1BWF9TV0FQRklMRVM7IGkrKykgewotCQlpZiAoc3dhcF9pbmZvW2ldLmZsYWdzID09IDApIHsKKwkJaWYgKCEoc3dhcF9pbmZvW2ldLmZsYWdzICYgU1dQX1dSSVRFT0spKSB7CiAJCQlzd2FwZmlsZV91c2VkW2ldPVNXQVBGSUxFX1VOVVNFRDsKIAkJfSBlbHNlIHsKIAkJCWlmICghbGVuKSB7CkBAIC0yMDIsNyArMzQwLDcgQEAKIAkJCX0KIAkJfQogCX0KLQlzd2FwX2xpc3RfdW5sb2NrKCk7CisJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CiAJcmV0dXJuIChyb290X3N3YXAgIT0gMHhmZmZmKSA/IDAgOiAtRU5PREVWOwogfQogCkBAIC0yMTYsMTIgKzM1NCwxMiBAQAogewogCWludCBpOwogCi0Jc3dhcF9saXN0X2xvY2soKTsKKwlzcGluX2xvY2soJnN3YXBfbG9jayk7CiAJZm9yIChpID0gMDsgaTwgTUFYX1NXQVBGSUxFUzsgaSsrKQogCQlpZiAoc3dhcGZpbGVfdXNlZFtpXSA9PSBTV0FQRklMRV9JR05PUkVEKSB7Ci0JCQlzd2FwX2luZm9baV0uZmxhZ3MgXj0gMHhGRjsKKwkJCXN3YXBfaW5mb1tpXS5mbGFncyBePSBTV1BfV1JJVEVPSzsKIAkJfQotCXN3YXBfbGlzdF91bmxvY2soKTsKKwlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKIH0KIAogLyoqCkBAIC0yODYsNiArNDI0LDEwIEBACiAJaW50IGVycm9yID0gMCwgaSA9IDA7CiAJdW5zaWduZWQgaW50IG1vZCA9IG5yX2NvcHlfcGFnZXMgLyAxMDA7CiAJc3RydWN0IHBiZSAqcDsKKwl2b2lkICp0Zm07CisKKwlpZiAoKGVycm9yID0gY3J5cHRvX2luaXQoMSwgJnRmbSkpKQorCQlyZXR1cm4gZXJyb3I7CiAKIAlpZiAoIW1vZCkKIAkJbW9kID0gMTsKQEAgLTI5NCwxMSArNDM2LDE0IEBACiAJZm9yX2VhY2hfcGJlIChwLCBwYWdlZGlyX25vc2F2ZSkgewogCQlpZiAoIShpJW1vZCkpCiAJCQlwcmludGsoICJcYlxiXGJcYiUzZCUlIiwgaSAvIG1vZCApOwotCQlpZiAoKGVycm9yID0gd3JpdGVfcGFnZShwLT5hZGRyZXNzLCAmKHAtPnN3YXBfYWRkcmVzcykpKSkKKwkJaWYgKChlcnJvciA9IGNyeXB0b193cml0ZShwLCB0Zm0pKSkgeworCQkJY3J5cHRvX2V4aXQodGZtKTsKIAkJCXJldHVybiBlcnJvcjsKKwkJfQogCQlpKys7CiAJfQogCXByaW50aygiXGJcYlxiXGJkb25lXG4iKTsKKwljcnlwdG9fZXhpdCh0Zm0pOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMzg1LDcgKzUzMCw2IEBACiAgKgl3cml0ZV9zdXNwZW5kX2ltYWdlIC0gV3JpdGUgZW50aXJlIGltYWdlIGFuZCBtZXRhZGF0YS4KICAqCiAgKi8KLQogc3RhdGljIGludCB3cml0ZV9zdXNwZW5kX2ltYWdlKHZvaWQpCiB7CiAJaW50IGVycm9yOwpAQCAtNDAwLDYgKzU0NCw3IEBACiAJaWYgKChlcnJvciA9IGNsb3NlX3N3YXAoKSkpCiAJCWdvdG8gRnJlZVBhZ2VkaXI7CiAgRG9uZToKKwltZW1zZXQoa2V5X2l2LCAwLCBNQVhLRVkrTUFYSVYpOwogCXJldHVybiBlcnJvcjsKICBGcmVlUGFnZWRpcjoKIAlmcmVlX3BhZ2VkaXJfZW50cmllcygpOwpAQCAtNTkxLDE4ICs3MzYsNyBAQAogCiBzdGF0aWMgaW50IGNhbGNfbnIoaW50IG5yX2NvcHkpCiB7Ci0JaW50IGV4dHJhID0gMDsKLQlpbnQgbW9kID0gISEobnJfY29weSAlIFBCRVNfUEVSX1BBR0UpOwotCWludCBkaWZmID0gKG5yX2NvcHkgLyBQQkVTX1BFUl9QQUdFKSArIG1vZDsKLQotCWRvIHsKLQkJZXh0cmEgKz0gZGlmZjsKLQkJbnJfY29weSArPSBkaWZmOwotCQltb2QgPSAhIShucl9jb3B5ICUgUEJFU19QRVJfUEFHRSk7Ci0JCWRpZmYgPSAobnJfY29weSAvIFBCRVNfUEVSX1BBR0UpICsgbW9kIC0gZXh0cmE7Ci0JfSB3aGlsZSAoZGlmZiA+IDApOwotCi0JcmV0dXJuIG5yX2NvcHk7CisJcmV0dXJuIG5yX2NvcHkgKyAobnJfY29weStQQkVTX1BFUl9QQUdFLTIpLyhQQkVTX1BFUl9QQUdFLTEpOwogfQogCiAvKioKQEAgLTg4NiwyMCArMTAyMCwyMSBAQAogCSAqIGF0IHJlc3VtZSB0aW1lLCBhbmQgZXZpbCB3ZWlyZG5lc3MgZW5zdWVzLgogCSAqLwogCWlmICgoZXJyb3IgPSBkZXZpY2VfcG93ZXJfZG93bihQTVNHX0ZSRUVaRSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU29tZSBkZXZpY2VzIGZhaWxlZCB0byBwb3dlciBkb3duLCBhYm9ydGluZyBzdXNwZW5kXG4iKTsKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCiAJaWYgKChlcnJvciA9IHN3c3VzcF9zd2FwX2NoZWNrKCkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic3dzdXNwOiBGQVRBTDogY2Fubm90IGZpbmQgc3dhcCBkZXZpY2UsIHRyeSAiCi0JCQkJInN3YXBvbiAtYSFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInN3c3VzcDogY2Fubm90IGZpbmQgc3dhcCBkZXZpY2UsIHRyeSBzd2Fwb24gLWEuXG4iKTsKKwkJZGV2aWNlX3Bvd2VyX3VwKCk7CiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIAogCXNhdmVfcHJvY2Vzc29yX3N0YXRlKCk7CiAJaWYgKChlcnJvciA9IHN3c3VzcF9hcmNoX3N1c3BlbmQoKSkpCi0JCXByaW50aygiRXJyb3IgJWQgc3VzcGVuZGluZ1xuIiwgZXJyb3IpOworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yICVkIHN1c3BlbmRpbmdcbiIsIGVycm9yKTsKIAkvKiBSZXN0b3JlIGNvbnRyb2wgZmxvdyBtYWdpY2FsbHkgYXBwZWFycyBoZXJlICovCiAJcmVzdG9yZV9wcm9jZXNzb3Jfc3RhdGUoKTsKIAlCVUdfT04gKG5yX2NvcHlfcGFnZXNfY2hlY2sgIT0gbnJfY29weV9wYWdlcyk7CkBAIC05MjQsNiArMTA1OSw3IEBACiAJQlVHX09OKCFlcnJvcik7CiAJcmVzdG9yZV9wcm9jZXNzb3Jfc3RhdGUoKTsKIAlyZXN0b3JlX2hpZ2htZW0oKTsKKwl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiAJZGV2aWNlX3Bvd2VyX3VwKCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCXJldHVybiBlcnJvcjsKQEAgLTExNzksNyArMTMxNSw4IEBACiAJaWYgKHN0cmNtcChzd3N1c3BfaW5mby51dHMubWFjaGluZSxzeXN0ZW1fdXRzbmFtZS5tYWNoaW5lKSkKIAkJcmV0dXJuICJtYWNoaW5lIjsKICNpZiAwCi0JaWYoc3dzdXNwX2luZm8uY3B1cyAhPSBudW1fb25saW5lX2NwdXMoKSkKKwkvKiBXZSBjYW4ndCB1c2UgbnVtYmVyIG9mIG9ubGluZSBDUFVzIHdoZW4gd2UgdXNlIGhvdHBsdWcgdG8gcmVtb3ZlIHRoZW0gOy0pKSkgKi8KKwlpZiAoc3dzdXNwX2luZm8uY3B1cyAhPSBudW1fcG9zc2libGVfY3B1cygpKQogCQlyZXR1cm4gIm51bWJlciBvZiBjcHVzIjsKICNlbmRpZgogCXJldHVybiBOVUxMOwpAQCAtMTIxMiwxMyArMTM0OSwxNCBAQAogCQlyZXR1cm4gZXJyb3I7CiAJaWYgKCFtZW1jbXAoU1dTVVNQX1NJRywgc3dzdXNwX2hlYWRlci5zaWcsIDEwKSkgewogCQltZW1jcHkoc3dzdXNwX2hlYWRlci5zaWcsIHN3c3VzcF9oZWFkZXIub3JpZ19zaWcsIDEwKTsKKwkJbWVtY3B5KGtleV9pdiwgc3dzdXNwX2hlYWRlci5rZXlfaXYsIE1BWEtFWStNQVhJVik7CisJCW1lbXNldChzd3N1c3BfaGVhZGVyLmtleV9pdiwgMCwgTUFYS0VZK01BWElWKTsKIAogCQkvKgogCQkgKiBSZXNldCBzd2FwIHNpZ25hdHVyZSBub3cuCiAJCSAqLwogCQllcnJvciA9IGJpb193cml0ZV9wYWdlKDAsICZzd3N1c3BfaGVhZGVyKTsKIAl9IGVsc2UgeyAKLQkJcHJpbnRrKEtFUk5fRVJSICJzd3N1c3A6IFN1c3BlbmQgcGFydGl0aW9uIGhhcyB3cm9uZyBzaWduYXR1cmU/XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICghZXJyb3IpCkBAIC0xMjM5LDYgKzEzNzcsMTAgQEAKIAlpbnQgZXJyb3IgPSAwOwogCWludCBpID0gMDsKIAlpbnQgbW9kID0gc3dzdXNwX2luZm8uaW1hZ2VfcGFnZXMgLyAxMDA7CisJdm9pZCAqdGZtOworCisJaWYgKChlcnJvciA9IGNyeXB0b19pbml0KDAsICZ0Zm0pKSkKKwkJcmV0dXJuIGVycm9yOwogCiAJaWYgKCFtb2QpCiAJCW1vZCA9IDE7CkBAIC0xMjUwLDE0ICsxMzkyLDE1IEBACiAJCWlmICghKGkgJSBtb2QpKQogCQkJcHJpbnRrKCJcYlxiXGJcYiUzZCUlIiwgaSAvIG1vZCk7CiAKLQkJZXJyb3IgPSBiaW9fcmVhZF9wYWdlKHN3cF9vZmZzZXQocC0+c3dhcF9hZGRyZXNzKSwKLQkJCQkgICh2b2lkICopcC0+YWRkcmVzcyk7Ci0JCWlmIChlcnJvcikKKwkJaWYgKChlcnJvciA9IGNyeXB0b19yZWFkKHAsIHRmbSkpKSB7CisJCQljcnlwdG9fZXhpdCh0Zm0pOwogCQkJcmV0dXJuIGVycm9yOworCQl9CiAKIAkJaSsrOwogCX0KIAlwcmludGsoIlxiXGJcYlxiZG9uZVxuIik7CisJY3J5cHRvX2V4aXQodGZtKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTEzODUsNiArMTUyOCw3IEBACiAKIAllcnJvciA9IHJlYWRfc3VzcGVuZF9pbWFnZSgpOwogCWJsa2Rldl9wdXQocmVzdW1lX2JkZXYpOworCW1lbXNldChrZXlfaXYsIDAsIE1BWEtFWStNQVhJVik7CiAKIAlpZiAoIWVycm9yKQogCQlwcl9kZWJ1Zygic3dzdXNwOiBSZWFkaW5nIHJlc3VtZSBmaWxlIHdhcyBzdWNjZXNzZnVsXG4iKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsuYyBiL2tlcm5lbC9wcmludGsuYwppbmRleCA1MDkyMzk3Li5hOTY3NjA1IDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrLmMKKysrIGIva2VybmVsL3ByaW50ay5jCkBAIC01MTQsNiArNTE0LDkgQEAKIAlyZXR1cm4gcjsKIH0KIAorLyogY3B1IGN1cnJlbnRseSBob2xkaW5nIGxvZ2J1Zl9sb2NrICovCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgaW50IHByaW50a19jcHUgPSBVSU5UX01BWDsKKwogYXNtbGlua2FnZSBpbnQgdnByaW50ayhjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNTIyLDExICs1MjUsMTUgQEAKIAlzdGF0aWMgY2hhciBwcmludGtfYnVmWzEwMjRdOwogCXN0YXRpYyBpbnQgbG9nX2xldmVsX3Vua25vd24gPSAxOwogCi0JaWYgKHVubGlrZWx5KG9vcHNfaW5fcHJvZ3Jlc3MpKQorCXByZWVtcHRfZGlzYWJsZSgpOworCWlmICh1bmxpa2VseShvb3BzX2luX3Byb2dyZXNzKSAmJiBwcmludGtfY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJLyogSWYgYSBjcmFzaCBpcyBvY2N1cnJpbmcgZHVyaW5nIHByaW50aygpIG9uIHRoaXMgQ1BVLAorCQkgKiBtYWtlIHN1cmUgd2UgY2FuJ3QgZGVhZGxvY2sgKi8KIAkJemFwX2xvY2tzKCk7CiAKIAkvKiBUaGlzIHN0b3BzIHRoZSBob2xkZXIgb2YgY29uc29sZV9zZW0ganVzdCB3aGVyZSB3ZSB3YW50IGhpbSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZsb2didWZfbG9jaywgZmxhZ3MpOworCXByaW50a19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAkvKiBFbWl0IHRoZSBvdXRwdXQgaW50byB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciAqLwogCXByaW50ZWRfbGVuID0gdnNjbnByaW50ZihwcmludGtfYnVmLCBzaXplb2YocHJpbnRrX2J1ZiksIGZtdCwgYXJncyk7CkBAIC01OTUsNiArNjAyLDcgQEAKIAkJICogQ1BVIHVudGlsIGl0IGlzIG9mZmljaWFsbHkgdXAuICBXZSBzaG91bGRuJ3QgYmUgY2FsbGluZyBpbnRvCiAJCSAqIHJhbmRvbSBjb25zb2xlIGRyaXZlcnMgb24gYSBDUFUgd2hpY2ggZG9lc24ndCBleGlzdCB5ZXQuLgogCQkgKi8KKwkJcHJpbnRrX2NwdSA9IFVJTlRfTUFYOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2didWZfbG9jaywgZmxhZ3MpOwogCQlnb3RvIG91dDsKIAl9CkBAIC02MDQsNiArNjEyLDcgQEAKIAkJICogV2Ugb3duIHRoZSBkcml2ZXJzLiAgV2UgY2FuIGRyb3AgdGhlIHNwaW5sb2NrIGFuZCBsZXQKIAkJICogcmVsZWFzZV9jb25zb2xlX3NlbSgpIHByaW50IHRoZSB0ZXh0CiAJCSAqLworCQlwcmludGtfY3B1ID0gVUlOVF9NQVg7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CiAJCWNvbnNvbGVfbWF5X3NjaGVkdWxlID0gMDsKIAkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwpAQCAtNjEzLDkgKzYyMiwxMSBAQAogCQkgKiBhbGxvd3MgdGhlIHNlbWFwaG9yZSBob2xkZXIgdG8gcHJvY2VlZCBhbmQgdG8gY2FsbCB0aGUKIAkJICogY29uc29sZSBkcml2ZXJzIHdpdGggdGhlIG91dHB1dCB3aGljaCB3ZSBqdXN0IHByb2R1Y2VkLgogCQkgKi8KKwkJcHJpbnRrX2NwdSA9IFVJTlRfTUFYOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2didWZfbG9jaywgZmxhZ3MpOwogCX0KIG91dDoKKwlwcmVlbXB0X2VuYWJsZSgpOwogCXJldHVybiBwcmludGVkX2xlbjsKIH0KIEVYUE9SVF9TWU1CT0wocHJpbnRrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wdHJhY2UuYyBiL2tlcm5lbC9wdHJhY2UuYwppbmRleCA4ZGNiOGY2Li4wMTllMDRlIDEwMDY0NAotLS0gYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIva2VybmVsL3B0cmFjZS5jCkBAIC0xMTgsNiArMTE4LDMzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBtYXlfYXR0YWNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlpZiAoIXRhc2stPm1tKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICgoKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT5ldWlkKSB8fAorCSAgICAgKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT5zdWlkKSB8fAorCSAgICAgKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT51aWQpIHx8CisJICAgICAoY3VycmVudC0+Z2lkICE9IHRhc2stPmVnaWQpIHx8CisJICAgICAoY3VycmVudC0+Z2lkICE9IHRhc2stPnNnaWQpIHx8CisJICAgICAoY3VycmVudC0+Z2lkICE9IHRhc2stPmdpZCkpICYmICFjYXBhYmxlKENBUF9TWVNfUFRSQUNFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlzbXBfcm1iKCk7CisJaWYgKCF0YXNrLT5tbS0+ZHVtcGFibGUgJiYgIWNhcGFibGUoQ0FQX1NZU19QVFJBQ0UpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIHNlY3VyaXR5X3B0cmFjZShjdXJyZW50LCB0YXNrKTsKK30KKworaW50IHB0cmFjZV9tYXlfYXR0YWNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlpbnQgZXJyOworCXRhc2tfbG9jayh0YXNrKTsKKwllcnIgPSBtYXlfYXR0YWNoKHRhc2spOworCXRhc2tfdW5sb2NrKHRhc2spOworCXJldHVybiAhZXJyOworfQorCiBpbnQgcHRyYWNlX2F0dGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJaW50IHJldHZhbDsKQEAgLTEyNywyMiArMTU0LDEwIEBACiAJCWdvdG8gYmFkOwogCWlmICh0YXNrID09IGN1cnJlbnQpCiAJCWdvdG8gYmFkOwotCWlmICghdGFzay0+bW0pCi0JCWdvdG8gYmFkOwotCWlmKCgoY3VycmVudC0+dWlkICE9IHRhc2stPmV1aWQpIHx8Ci0JICAgIChjdXJyZW50LT51aWQgIT0gdGFzay0+c3VpZCkgfHwKLQkgICAgKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT51aWQpIHx8Ci0gCSAgICAoY3VycmVudC0+Z2lkICE9IHRhc2stPmVnaWQpIHx8Ci0gCSAgICAoY3VycmVudC0+Z2lkICE9IHRhc2stPnNnaWQpIHx8Ci0gCSAgICAoY3VycmVudC0+Z2lkICE9IHRhc2stPmdpZCkpICYmICFjYXBhYmxlKENBUF9TWVNfUFRSQUNFKSkKLQkJZ290byBiYWQ7Ci0Jc21wX3JtYigpOwotCWlmICghdGFzay0+bW0tPmR1bXBhYmxlICYmICFjYXBhYmxlKENBUF9TWVNfUFRSQUNFKSkKLQkJZ290byBiYWQ7CiAJLyogdGhlIHNhbWUgcHJvY2VzcyBjYW5ub3QgYmUgYXR0YWNoZWQgbWFueSB0aW1lcyAqLwogCWlmICh0YXNrLT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQogCQlnb3RvIGJhZDsKLQlyZXR2YWwgPSBzZWN1cml0eV9wdHJhY2UoY3VycmVudCwgdGFzayk7CisJcmV0dmFsID0gbWF5X2F0dGFjaCh0YXNrKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGJhZDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXBkYXRlLmMgYi9rZXJuZWwvcmN1cGRhdGUuYwppbmRleCBmNDM2OTkzLi5iZWYzYjY5IDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1cGRhdGUuYworKysgYi9rZXJuZWwvcmN1cGRhdGUuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KIAogLyogRGVmaW5pdGlvbiBmb3IgcmN1cGRhdGUgY29udHJvbCBibG9jay4gKi8KQEAgLTcyLDYgKzczLDE5IEBACiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRhc2tsZXRfc3RydWN0LCByY3VfdGFza2xldCkgPSB7TlVMTH07CiBzdGF0aWMgaW50IG1heGJhdGNoID0gMTA7CiAKKyNpZm5kZWYgX19IQVZFX0FSQ0hfQ01QWENIRworLyoKKyAqIFdlIHVzZSBhbiBhcnJheSBvZiBzcGlubG9ja3MgZm9yIHRoZSByY3VyZWZzIC0tIHNpbWlsYXIgdG8gb25lcyBpbiBzcGFyYworICogMzIgYml0IGF0b21pY190IGltcGxlbWVudGF0aW9ucywgYW5kIGEgaGFzaCBmdW5jdGlvbiBzaW1pbGFyIHRvIHRoYXQKKyAqIGZvciBvdXIgcmVmY291bnRpbmcgbmVlZHMuCisgKiBDYW4ndCBoZWxwIG11bHRpcHJvY2Vzc29ycyB3aGljaCBkb25vdCBoYXZlIGNtcHhjaGcgOigKKyAqLworCitzcGlubG9ja190IF9fcmN1cmVmX2hhc2hbUkNVUkVGX0hBU0hfU0laRV0gPSB7CisJWzAgLi4uIChSQ1VSRUZfSEFTSF9TSVpFLTEpXSA9IFNQSU5fTE9DS19VTkxPQ0tFRAorfTsKKyNlbmRpZgorCiAvKioKICAqIGNhbGxfcmN1IC0gUXVldWUgYW4gUkNVIGNhbGxiYWNrIGZvciBpbnZvY2F0aW9uIGFmdGVyIGEgZ3JhY2UgcGVyaW9kLgogICogQGhlYWQ6IHN0cnVjdHVyZSB0byBiZSB1c2VkIGZvciBxdWV1ZWluZyB0aGUgUkNVIHVwZGF0ZXMuCmRpZmYgLS1naXQgYS9rZXJuZWwvcmVzb3VyY2UuYyBiL2tlcm5lbC9yZXNvdXJjZS5jCmluZGV4IDI2OTY3ZTAuLjkyMjg1ZDggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZXNvdXJjZS5jCisrKyBiL2tlcm5lbC9yZXNvdXJjZS5jCkBAIC00MzAsMTAgKzQzMCw5IEBACiAgKi8KIHN0cnVjdCByZXNvdXJjZSAqIF9fcmVxdWVzdF9yZWdpb24oc3RydWN0IHJlc291cmNlICpwYXJlbnQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbiwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGttYWxsb2Moc2l6ZW9mKCpyZXMpLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGt6YWxsb2Moc2l6ZW9mKCpyZXMpLCBHRlBfS0VSTkVMKTsKIAogCWlmIChyZXMpIHsKLQkJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKCpyZXMpKTsKIAkJcmVzLT5uYW1lID0gbmFtZTsKIAkJcmVzLT5zdGFydCA9IHN0YXJ0OwogCQlyZXMtPmVuZCA9IHN0YXJ0ICsgbiAtIDE7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQuYyBiL2tlcm5lbC9zY2hlZC5jCmluZGV4IDVmODg5ZDAuLmU5ZmYwNGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC5jCisrKyBiL2tlcm5lbC9zY2hlZC5jCkBAIC04NzUsNyArODc1LDcgQEAKICAqIHNtcF9jYWxsX2Z1bmN0aW9uKCkgaWYgYW4gSVBJIGlzIHNlbnQgYnkgdGhlIHNhbWUgcHJvY2VzcyB3ZSBhcmUKICAqIHdhaXRpbmcgdG8gYmVjb21lIGluYWN0aXZlLgogICovCi12b2lkIHdhaXRfdGFza19pbmFjdGl2ZSh0YXNrX3QgKiBwKQordm9pZCB3YWl0X3Rhc2tfaW5hY3RpdmUodGFza190ICpwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJcnVucXVldWVfdCAqcnE7CkBAIC05NjYsOCArOTY2LDExIEBACiAJCWludCBsb2NhbF9ncm91cDsKIAkJaW50IGk7CiAKKwkJLyogU2tpcCBvdmVyIHRoaXMgZ3JvdXAgaWYgaXQgaGFzIG5vIENQVXMgYWxsb3dlZCAqLworCQlpZiAoIWNwdXNfaW50ZXJzZWN0cyhncm91cC0+Y3B1bWFzaywgcC0+Y3B1c19hbGxvd2VkKSkKKwkJCWdvdG8gbmV4dGdyb3VwOworCiAJCWxvY2FsX2dyb3VwID0gY3B1X2lzc2V0KHRoaXNfY3B1LCBncm91cC0+Y3B1bWFzayk7Ci0JCS8qIFhYWDogcHV0IGEgY3B1cyBhbGxvd2VkIGNoZWNrICovCiAKIAkJLyogVGFsbHkgdXAgdGhlIGxvYWQgb2YgYWxsIENQVXMgaW4gdGhlIGdyb3VwICovCiAJCWF2Z19sb2FkID0gMDsKQEAgLTk5Miw2ICs5OTUsNyBAQAogCQkJbWluX2xvYWQgPSBhdmdfbG9hZDsKIAkJCWlkbGVzdCA9IGdyb3VwOwogCQl9CituZXh0Z3JvdXA6CiAJCWdyb3VwID0gZ3JvdXAtPm5leHQ7CiAJfSB3aGlsZSAoZ3JvdXAgIT0gc2QtPmdyb3Vwcyk7CiAKQEAgLTEwMDMsMTMgKzEwMDcsMTggQEAKIC8qCiAgKiBmaW5kX2lkbGVzdF9xdWV1ZSAtIGZpbmQgdGhlIGlkbGVzdCBydW5xdWV1ZSBhbW9uZyB0aGUgY3B1cyBpbiBncm91cC4KICAqLwotc3RhdGljIGludCBmaW5kX2lkbGVzdF9jcHUoc3RydWN0IHNjaGVkX2dyb3VwICpncm91cCwgaW50IHRoaXNfY3B1KQorc3RhdGljIGludAorZmluZF9pZGxlc3RfY3B1KHN0cnVjdCBzY2hlZF9ncm91cCAqZ3JvdXAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHRoaXNfY3B1KQogeworCWNwdW1hc2tfdCB0bXA7CiAJdW5zaWduZWQgbG9uZyBsb2FkLCBtaW5fbG9hZCA9IFVMT05HX01BWDsKIAlpbnQgaWRsZXN0ID0gLTE7CiAJaW50IGk7CiAKLQlmb3JfZWFjaF9jcHVfbWFzayhpLCBncm91cC0+Y3B1bWFzaykgeworCS8qIFRyYXZlcnNlIG9ubHkgdGhlIGFsbG93ZWQgQ1BVcyAqLworCWNwdXNfYW5kKHRtcCwgZ3JvdXAtPmNwdW1hc2ssIHAtPmNwdXNfYWxsb3dlZCk7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCB0bXApIHsKIAkJbG9hZCA9IHNvdXJjZV9sb2FkKGksIDApOwogCiAJCWlmIChsb2FkIDwgbWluX2xvYWQgfHwgKGxvYWQgPT0gbWluX2xvYWQgJiYgaSA9PSB0aGlzX2NwdSkpIHsKQEAgLTEwNTIsNyArMTA2MSw3IEBACiAJCWlmICghZ3JvdXApCiAJCQlnb3RvIG5leHRsZXZlbDsKIAotCQluZXdfY3B1ID0gZmluZF9pZGxlc3RfY3B1KGdyb3VwLCBjcHUpOworCQluZXdfY3B1ID0gZmluZF9pZGxlc3RfY3B1KGdyb3VwLCB0LCBjcHUpOwogCQlpZiAobmV3X2NwdSA9PSAtMSB8fCBuZXdfY3B1ID09IGNwdSkKIAkJCWdvdG8gbmV4dGxldmVsOwogCkBAIC0xMTI3LDcgKzExMzYsNyBAQAogICoKICAqIHJldHVybnMgZmFpbHVyZSBvbmx5IGlmIHRoZSB0YXNrIGlzIGFscmVhZHkgYWN0aXZlLgogICovCi1zdGF0aWMgaW50IHRyeV90b193YWtlX3VwKHRhc2tfdCAqIHAsIHVuc2lnbmVkIGludCBzdGF0ZSwgaW50IHN5bmMpCitzdGF0aWMgaW50IHRyeV90b193YWtlX3VwKHRhc2tfdCAqcCwgdW5zaWduZWQgaW50IHN0YXRlLCBpbnQgc3luYykKIHsKIAlpbnQgY3B1LCB0aGlzX2NwdSwgc3VjY2VzcyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEyNTIsNiArMTI2MSwxNiBAQAogCX0KIAogCS8qCisJICogVGFza3MgdGhhdCBoYXZlIG1hcmtlZCB0aGVpciBzbGVlcCBhcyBub25pbnRlcmFjdGl2ZSBnZXQKKwkgKiB3b2tlbiB1cCB3aXRob3V0IHVwZGF0aW5nIHRoZWlyIHNsZWVwIGF2ZXJhZ2UuIChpLmUuIHRoZWlyCisJICogc2xlZXAgaXMgaGFuZGxlZCBpbiBhIHByaW9yaXR5LW5ldXRyYWwgbWFubmVyLCBubyBwcmlvcml0eQorCSAqIGJvb3N0IGFuZCBubyBwZW5hbHR5LikKKwkgKi8KKwlpZiAob2xkX3N0YXRlICYgVEFTS19OT05JTlRFUkFDVElWRSkKKwkJX19hY3RpdmF0ZV90YXNrKHAsIHJxKTsKKwllbHNlCisJCWFjdGl2YXRlX3Rhc2socCwgcnEsIGNwdSA9PSB0aGlzX2NwdSk7CisJLyoKIAkgKiBTeW5jIHdha2V1cHMgKGkuZS4gdGhvc2UgdHlwZXMgb2Ygd2FrZXVwcyB3aGVyZSB0aGUgd2FrZXIKIAkgKiBoYXMgaW5kaWNhdGVkIHRoYXQgaXQgd2lsbCBsZWF2ZSB0aGUgQ1BVIGluIHNob3J0IG9yZGVyKQogCSAqIGRvbid0IHRyaWdnZXIgYSBwcmVlbXB0aW9uLCBpZiB0aGUgd29rZW4gdXAgdGFzayB3aWxsIHJ1biBvbgpAQCAtMTI1OSw3ICsxMjc4LDYgQEAKIAkgKiB0aGUgd2FrZXIgZ3VhcmFudGVlcyB0aGF0IHRoZSBmcmVzaGx5IHdva2VuIHVwIHRhc2sgaXMgZ29pbmcKIAkgKiB0byBiZSBjb25zaWRlcmVkIG9uIHRoaXMgQ1BVLikKIAkgKi8KLQlhY3RpdmF0ZV90YXNrKHAsIHJxLCBjcHUgPT0gdGhpc19jcHUpOwogCWlmICghc3luYyB8fCBjcHUgIT0gdGhpc19jcHUpIHsKIAkJaWYgKFRBU0tfUFJFRU1QVFNfQ1VSUihwLCBycSkpCiAJCQlyZXNjaGVkX3Rhc2socnEtPmN1cnIpOwpAQCAtMTI3NCw3ICsxMjkyLDcgQEAKIAlyZXR1cm4gc3VjY2VzczsKIH0KIAotaW50IGZhc3RjYWxsIHdha2VfdXBfcHJvY2Vzcyh0YXNrX3QgKiBwKQoraW50IGZhc3RjYWxsIHdha2VfdXBfcHJvY2Vzcyh0YXNrX3QgKnApCiB7CiAJcmV0dXJuIHRyeV90b193YWtlX3VwKHAsIFRBU0tfU1RPUFBFRCB8IFRBU0tfVFJBQ0VEIHwKIAkJCQkgVEFTS19JTlRFUlJVUFRJQkxFIHwgVEFTS19VTklOVEVSUlVQVElCTEUsIDApOwpAQCAtMTM1Myw3ICsxMzcxLDcgQEAKICAqIHRoYXQgbXVzdCBiZSBkb25lIGZvciBldmVyeSBuZXdseSBjcmVhdGVkIGNvbnRleHQsIHRoZW4gcHV0cyB0aGUgdGFzawogICogb24gdGhlIHJ1bnF1ZXVlIGFuZCB3YWtlcyBpdC4KICAqLwotdm9pZCBmYXN0Y2FsbCB3YWtlX3VwX25ld190YXNrKHRhc2tfdCAqIHAsIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MpCit2b2lkIGZhc3RjYWxsIHdha2VfdXBfbmV3X3Rhc2sodGFza190ICpwLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHRoaXNfY3B1LCBjcHU7CkBAIC0xNDM2LDcgKzE0NTQsNyBAQAogICogYXJ0aWZpY2lhbGx5LCBiZWNhdXNlIGFueSB0aW1lc2xpY2UgcmVjb3ZlcmVkIGhlcmUKICAqIHdhcyBnaXZlbiBhd2F5IGJ5IHRoZSBwYXJlbnQgaW4gdGhlIGZpcnN0IHBsYWNlLikKICAqLwotdm9pZCBmYXN0Y2FsbCBzY2hlZF9leGl0KHRhc2tfdCAqIHApCit2b2lkIGZhc3RjYWxsIHNjaGVkX2V4aXQodGFza190ICpwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJcnVucXVldWVfdCAqcnE7CkBAIC0xNDc4LDYgKzE0OTYsNyBAQAogCiAvKioKICAqIGZpbmlzaF90YXNrX3N3aXRjaCAtIGNsZWFuIHVwIGFmdGVyIGEgdGFzay1zd2l0Y2gKKyAqIEBycTogcnVucXVldWUgYXNzb2NpYXRlZCB3aXRoIHRhc2stc3dpdGNoCiAgKiBAcHJldjogdGhlIHRocmVhZCB3ZSBqdXN0IHN3aXRjaGVkIGF3YXkgZnJvbS4KICAqCiAgKiBmaW5pc2hfdGFza19zd2l0Y2ggbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGNvbnRleHQgc3dpdGNoLCBwYWlyZWQKQEAgLTE1MTAsNiArMTUyOSwxMCBAQAogCSAqCQlNYW5mcmVkIFNwcmF1bCA8bWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tPgogCSAqLwogCXByZXZfdGFza19mbGFncyA9IHByZXYtPmZsYWdzOworI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSworCS8qIHRoaXMgaXMgYSB2YWxpZCBjYXNlIHdoZW4gYW5vdGhlciB0YXNrIHJlbGVhc2VzIHRoZSBzcGlubG9jayAqLworCXJxLT5sb2NrLm93bmVyID0gY3VycmVudDsKKyNlbmRpZgogCWZpbmlzaF9hcmNoX3N3aXRjaChwcmV2KTsKIAlmaW5pc2hfbG9ja19zd2l0Y2gocnEsIHByZXYpOwogCWlmIChtbSkKQEAgLTE3NTIsNyArMTc3NSw4IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUKIGludCBjYW5fbWlncmF0ZV90YXNrKHRhc2tfdCAqcCwgcnVucXVldWVfdCAqcnEsIGludCB0aGlzX2NwdSwKLQkgICAgIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBlbnVtIGlkbGVfdHlwZSBpZGxlLCBpbnQgKmFsbF9waW5uZWQpCisJCSAgICAgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGVudW0gaWRsZV90eXBlIGlkbGUsCisJCSAgICAgaW50ICphbGxfcGlubmVkKQogewogCS8qCiAJICogV2UgZG8gbm90IG1pZ3JhdGUgdGFza3MgdGhhdCBhcmU6CkBAIC0xODgyLDEwICsxOTA2LDExIEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKgogZmluZF9idXNpZXN0X2dyb3VwKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgdGhpc19jcHUsCi0JCSAgIHVuc2lnbmVkIGxvbmcgKmltYmFsYW5jZSwgZW51bSBpZGxlX3R5cGUgaWRsZSkKKwkJICAgdW5zaWduZWQgbG9uZyAqaW1iYWxhbmNlLCBlbnVtIGlkbGVfdHlwZSBpZGxlLCBpbnQgKnNkX2lkbGUpCiB7CiAJc3RydWN0IHNjaGVkX2dyb3VwICpidXNpZXN0ID0gTlVMTCwgKnRoaXMgPSBOVUxMLCAqZ3JvdXAgPSBzZC0+Z3JvdXBzOwogCXVuc2lnbmVkIGxvbmcgbWF4X2xvYWQsIGF2Z19sb2FkLCB0b3RhbF9sb2FkLCB0aGlzX2xvYWQsIHRvdGFsX3B3cjsKKwl1bnNpZ25lZCBsb25nIG1heF9wdWxsOwogCWludCBsb2FkX2lkeDsKIAogCW1heF9sb2FkID0gdGhpc19sb2FkID0gdG90YWxfbG9hZCA9IHRvdGFsX3B3ciA9IDA7CkBAIC0xOTA3LDYgKzE5MzIsOSBAQAogCQlhdmdfbG9hZCA9IDA7CiAKIAkJZm9yX2VhY2hfY3B1X21hc2soaSwgZ3JvdXAtPmNwdW1hc2spIHsKKwkJCWlmICgqc2RfaWRsZSAmJiAhaWRsZV9jcHUoaSkpCisJCQkJKnNkX2lkbGUgPSAwOworCiAJCQkvKiBCaWFzIGJhbGFuY2luZyB0b3dhcmQgY3B1cyBvZiBvdXIgZG9tYWluICovCiAJCQlpZiAobG9jYWxfZ3JvdXApCiAJCQkJbG9hZCA9IHRhcmdldF9sb2FkKGksIGxvYWRfaWR4KTsKQEAgLTE5MzIsNyArMTk2MCw3IEBACiAJCWdyb3VwID0gZ3JvdXAtPm5leHQ7CiAJfSB3aGlsZSAoZ3JvdXAgIT0gc2QtPmdyb3Vwcyk7CiAKLQlpZiAoIWJ1c2llc3QgfHwgdGhpc19sb2FkID49IG1heF9sb2FkKQorCWlmICghYnVzaWVzdCB8fCB0aGlzX2xvYWQgPj0gbWF4X2xvYWQgfHwgbWF4X2xvYWQgPD0gU0NIRURfTE9BRF9TQ0FMRSkKIAkJZ290byBvdXRfYmFsYW5jZWQ7CiAKIAlhdmdfbG9hZCA9IChTQ0hFRF9MT0FEX1NDQUxFICogdG90YWxfbG9hZCkgLyB0b3RhbF9wd3I7CkBAIC0xOTUyLDggKzE5ODAsMTIgQEAKIAkgKiBieSBwdWxsaW5nIHRhc2tzIHRvIHVzLiAgQmUgY2FyZWZ1bCBvZiBuZWdhdGl2ZSBudW1iZXJzIGFzIHRoZXknbGwKIAkgKiBhcHBlYXIgYXMgdmVyeSBsYXJnZSB2YWx1ZXMgd2l0aCB1bnNpZ25lZCBsb25ncy4KIAkgKi8KKworCS8qIERvbid0IHdhbnQgdG8gcHVsbCBzbyBtYW55IHRhc2tzIHRoYXQgYSBncm91cCB3b3VsZCBnbyBpZGxlICovCisJbWF4X3B1bGwgPSBtaW4obWF4X2xvYWQgLSBhdmdfbG9hZCwgbWF4X2xvYWQgLSBTQ0hFRF9MT0FEX1NDQUxFKTsKKwogCS8qIEhvdyBtdWNoIGxvYWQgdG8gYWN0dWFsbHkgbW92ZSB0byBlcXVhbGlzZSB0aGUgaW1iYWxhbmNlICovCi0JKmltYmFsYW5jZSA9IG1pbigobWF4X2xvYWQgLSBhdmdfbG9hZCkgKiBidXNpZXN0LT5jcHVfcG93ZXIsCisJKmltYmFsYW5jZSA9IG1pbihtYXhfcHVsbCAqIGJ1c2llc3QtPmNwdV9wb3dlciwKIAkJCQkoYXZnX2xvYWQgLSB0aGlzX2xvYWQpICogdGhpcy0+Y3B1X3Bvd2VyKQogCQkJLyBTQ0hFRF9MT0FEX1NDQUxFOwogCkBAIC0yMDUwLDExICsyMDgyLDE0IEBACiAJdW5zaWduZWQgbG9uZyBpbWJhbGFuY2U7CiAJaW50IG5yX21vdmVkLCBhbGxfcGlubmVkID0gMDsKIAlpbnQgYWN0aXZlX2JhbGFuY2UgPSAwOworCWludCBzZF9pZGxlID0gMDsKIAotCXNwaW5fbG9jaygmdGhpc19ycS0+bG9jayk7CisJaWYgKGlkbGUgIT0gTk9UX0lETEUgJiYgc2QtPmZsYWdzICYgU0RfU0hBUkVfQ1BVUE9XRVIpCisJCXNkX2lkbGUgPSAxOworCiAJc2NoZWRzdGF0X2luYyhzZCwgbGJfY250W2lkbGVdKTsKIAotCWdyb3VwID0gZmluZF9idXNpZXN0X2dyb3VwKHNkLCB0aGlzX2NwdSwgJmltYmFsYW5jZSwgaWRsZSk7CisJZ3JvdXAgPSBmaW5kX2J1c2llc3RfZ3JvdXAoc2QsIHRoaXNfY3B1LCAmaW1iYWxhbmNlLCBpZGxlLCAmc2RfaWRsZSk7CiAJaWYgKCFncm91cCkgewogCQlzY2hlZHN0YXRfaW5jKHNkLCBsYl9ub2J1c3lnW2lkbGVdKTsKIAkJZ290byBvdXRfYmFsYW5jZWQ7CkBAIC0yMDc4LDE5ICsyMTEzLDE2IEBACiAJCSAqIHN0aWxsIHVuYmFsYW5jZWQuIG5yX21vdmVkIHNpbXBseSBzdGF5cyB6ZXJvLCBzbyBpdCBpcwogCQkgKiBjb3JyZWN0bHkgdHJlYXRlZCBhcyBhbiBpbWJhbGFuY2UuCiAJCSAqLwotCQlkb3VibGVfbG9ja19iYWxhbmNlKHRoaXNfcnEsIGJ1c2llc3QpOworCQlkb3VibGVfcnFfbG9jayh0aGlzX3JxLCBidXNpZXN0KTsKIAkJbnJfbW92ZWQgPSBtb3ZlX3Rhc2tzKHRoaXNfcnEsIHRoaXNfY3B1LCBidXNpZXN0LAotCQkJCQkJaW1iYWxhbmNlLCBzZCwgaWRsZSwKLQkJCQkJCSZhbGxfcGlubmVkKTsKLQkJc3Bpbl91bmxvY2soJmJ1c2llc3QtPmxvY2spOworCQkJCQlpbWJhbGFuY2UsIHNkLCBpZGxlLCAmYWxsX3Bpbm5lZCk7CisJCWRvdWJsZV9ycV91bmxvY2sodGhpc19ycSwgYnVzaWVzdCk7CiAKIAkJLyogQWxsIHRhc2tzIG9uIHRoaXMgcnVucXVldWUgd2VyZSBwaW5uZWQgYnkgQ1BVIGFmZmluaXR5ICovCiAJCWlmICh1bmxpa2VseShhbGxfcGlubmVkKSkKIAkJCWdvdG8gb3V0X2JhbGFuY2VkOwogCX0KIAotCXNwaW5fdW5sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKLQogCWlmICghbnJfbW92ZWQpIHsKIAkJc2NoZWRzdGF0X2luYyhzZCwgbGJfZmFpbGVkW2lkbGVdKTsKIAkJc2QtPm5yX2JhbGFuY2VfZmFpbGVkKys7CkBAIC0yMDk4LDYgKzIxMzAsMTYgQEAKIAkJaWYgKHVubGlrZWx5KHNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA+IHNkLT5jYWNoZV9uaWNlX3RyaWVzKzIpKSB7CiAKIAkJCXNwaW5fbG9jaygmYnVzaWVzdC0+bG9jayk7CisKKwkJCS8qIGRvbid0IGtpY2sgdGhlIG1pZ3JhdGlvbl90aHJlYWQsIGlmIHRoZSBjdXJyCisJCQkgKiB0YXNrIG9uIGJ1c2llc3QgY3B1IGNhbid0IGJlIG1vdmVkIHRvIHRoaXNfY3B1CisJCQkgKi8KKwkJCWlmICghY3B1X2lzc2V0KHRoaXNfY3B1LCBidXNpZXN0LT5jdXJyLT5jcHVzX2FsbG93ZWQpKSB7CisJCQkJc3Bpbl91bmxvY2soJmJ1c2llc3QtPmxvY2spOworCQkJCWFsbF9waW5uZWQgPSAxOworCQkJCWdvdG8gb3V0X29uZV9waW5uZWQ7CisJCQl9CisKIAkJCWlmICghYnVzaWVzdC0+YWN0aXZlX2JhbGFuY2UpIHsKIAkJCQlidXNpZXN0LT5hY3RpdmVfYmFsYW5jZSA9IDE7CiAJCQkJYnVzaWVzdC0+cHVzaF9jcHUgPSB0aGlzX2NwdTsKQEAgLTIxMzAsMTkgKzIxNzIsMjMgQEAKIAkJCXNkLT5iYWxhbmNlX2ludGVydmFsICo9IDI7CiAJfQogCisJaWYgKCFucl9tb3ZlZCAmJiAhc2RfaWRsZSAmJiBzZC0+ZmxhZ3MgJiBTRF9TSEFSRV9DUFVQT1dFUikKKwkJcmV0dXJuIC0xOwogCXJldHVybiBucl9tb3ZlZDsKIAogb3V0X2JhbGFuY2VkOgotCXNwaW5fdW5sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKLQogCXNjaGVkc3RhdF9pbmMoc2QsIGxiX2JhbGFuY2VkW2lkbGVdKTsKIAogCXNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA9IDA7CisKK291dF9vbmVfcGlubmVkOgogCS8qIHR1bmUgdXAgdGhlIGJhbGFuY2luZyBpbnRlcnZhbCAqLwogCWlmICgoYWxsX3Bpbm5lZCAmJiBzZC0+YmFsYW5jZV9pbnRlcnZhbCA8IE1BWF9QSU5ORURfSU5URVJWQUwpIHx8CiAJCQkoc2QtPmJhbGFuY2VfaW50ZXJ2YWwgPCBzZC0+bWF4X2ludGVydmFsKSkKIAkJc2QtPmJhbGFuY2VfaW50ZXJ2YWwgKj0gMjsKIAorCWlmICghc2RfaWRsZSAmJiBzZC0+ZmxhZ3MgJiBTRF9TSEFSRV9DUFVQT1dFUikKKwkJcmV0dXJuIC0xOwogCXJldHVybiAwOwogfQogCkBAIC0yMTYwLDkgKzIyMDYsMTMgQEAKIAlydW5xdWV1ZV90ICpidXNpZXN0ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGltYmFsYW5jZTsKIAlpbnQgbnJfbW92ZWQgPSAwOworCWludCBzZF9pZGxlID0gMDsKKworCWlmIChzZC0+ZmxhZ3MgJiBTRF9TSEFSRV9DUFVQT1dFUikKKwkJc2RfaWRsZSA9IDE7CiAKIAlzY2hlZHN0YXRfaW5jKHNkLCBsYl9jbnRbTkVXTFlfSURMRV0pOwotCWdyb3VwID0gZmluZF9idXNpZXN0X2dyb3VwKHNkLCB0aGlzX2NwdSwgJmltYmFsYW5jZSwgTkVXTFlfSURMRSk7CisJZ3JvdXAgPSBmaW5kX2J1c2llc3RfZ3JvdXAoc2QsIHRoaXNfY3B1LCAmaW1iYWxhbmNlLCBORVdMWV9JRExFLCAmc2RfaWRsZSk7CiAJaWYgKCFncm91cCkgewogCQlzY2hlZHN0YXRfaW5jKHNkLCBsYl9ub2J1c3lnW05FV0xZX0lETEVdKTsKIAkJZ290byBvdXRfYmFsYW5jZWQ7CkBAIC0yMTc2LDIyICsyMjI2LDMwIEBACiAKIAlCVUdfT04oYnVzaWVzdCA9PSB0aGlzX3JxKTsKIAotCS8qIEF0dGVtcHQgdG8gbW92ZSB0YXNrcyAqLwotCWRvdWJsZV9sb2NrX2JhbGFuY2UodGhpc19ycSwgYnVzaWVzdCk7Ci0KIAlzY2hlZHN0YXRfYWRkKHNkLCBsYl9pbWJhbGFuY2VbTkVXTFlfSURMRV0sIGltYmFsYW5jZSk7Ci0JbnJfbW92ZWQgPSBtb3ZlX3Rhc2tzKHRoaXNfcnEsIHRoaXNfY3B1LCBidXNpZXN0LAorCisJbnJfbW92ZWQgPSAwOworCWlmIChidXNpZXN0LT5ucl9ydW5uaW5nID4gMSkgeworCQkvKiBBdHRlbXB0IHRvIG1vdmUgdGFza3MgKi8KKwkJZG91YmxlX2xvY2tfYmFsYW5jZSh0aGlzX3JxLCBidXNpZXN0KTsKKwkJbnJfbW92ZWQgPSBtb3ZlX3Rhc2tzKHRoaXNfcnEsIHRoaXNfY3B1LCBidXNpZXN0LAogCQkJCQlpbWJhbGFuY2UsIHNkLCBORVdMWV9JRExFLCBOVUxMKTsKLQlpZiAoIW5yX21vdmVkKQorCQlzcGluX3VubG9jaygmYnVzaWVzdC0+bG9jayk7CisJfQorCisJaWYgKCFucl9tb3ZlZCkgewogCQlzY2hlZHN0YXRfaW5jKHNkLCBsYl9mYWlsZWRbTkVXTFlfSURMRV0pOwotCWVsc2UKKwkJaWYgKCFzZF9pZGxlICYmIHNkLT5mbGFncyAmIFNEX1NIQVJFX0NQVVBPV0VSKQorCQkJcmV0dXJuIC0xOworCX0gZWxzZQogCQlzZC0+bnJfYmFsYW5jZV9mYWlsZWQgPSAwOwogCi0Jc3Bpbl91bmxvY2soJmJ1c2llc3QtPmxvY2spOwogCXJldHVybiBucl9tb3ZlZDsKIAogb3V0X2JhbGFuY2VkOgogCXNjaGVkc3RhdF9pbmMoc2QsIGxiX2JhbGFuY2VkW05FV0xZX0lETEVdKTsKKwlpZiAoIXNkX2lkbGUgJiYgc2QtPmZsYWdzICYgU0RfU0hBUkVfQ1BVUE9XRVIpCisJCXJldHVybiAtMTsKIAlzZC0+bnJfYmFsYW5jZV9mYWlsZWQgPSAwOwogCXJldHVybiAwOwogfQpAQCAtMjMxNiw3ICsyMzc0LDExIEBACiAKIAkJaWYgKGogLSBzZC0+bGFzdF9iYWxhbmNlID49IGludGVydmFsKSB7CiAJCQlpZiAobG9hZF9iYWxhbmNlKHRoaXNfY3B1LCB0aGlzX3JxLCBzZCwgaWRsZSkpIHsKLQkJCQkvKiBXZSd2ZSBwdWxsZWQgdGFza3Mgb3ZlciBzbyBubyBsb25nZXIgaWRsZSAqLworCQkJCS8qCisJCQkJICogV2UndmUgcHVsbGVkIHRhc2tzIG92ZXIgc28gZWl0aGVyIHdlJ3JlIG5vCisJCQkJICogbG9uZ2VyIGlkbGUsIG9yIG9uZSBvZiBvdXIgU01UIHNpYmxpbmdzIGlzCisJCQkJICogbm90IGlkbGUuCisJCQkJICovCiAJCQkJaWRsZSA9IE5PVF9JRExFOwogCQkJfQogCQkJc2QtPmxhc3RfYmFsYW5jZSArPSBpbnRlcnZhbDsKQEAgLTI1NzUsNiArMjYzNywxMyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAorc3RhdGljIGlubGluZSB2b2lkIHdha2V1cF9idXN5X3J1bnF1ZXVlKHJ1bnF1ZXVlX3QgKnJxKQoreworCS8qIElmIGFuIFNNVCBydW5xdWV1ZSBpcyBzbGVlcGluZyBkdWUgdG8gcHJpb3JpdHkgcmVhc29ucyB3YWtlIGl0IHVwICovCisJaWYgKHJxLT5jdXJyID09IHJxLT5pZGxlICYmIHJxLT5ucl9ydW5uaW5nKQorCQlyZXNjaGVkX3Rhc2socnEtPmlkbGUpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgd2FrZV9zbGVlcGluZ19kZXBlbmRlbnQoaW50IHRoaXNfY3B1LCBydW5xdWV1ZV90ICp0aGlzX3JxKQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnRtcCwgKnNkID0gTlVMTDsKQEAgLTI2MDgsMTIgKzI2NzcsNyBAQAogCWZvcl9lYWNoX2NwdV9tYXNrKGksIHNpYmxpbmdfbWFwKSB7CiAJCXJ1bnF1ZXVlX3QgKnNtdF9ycSA9IGNwdV9ycShpKTsKIAotCQkvKgotCQkgKiBJZiBhbiBTTVQgc2libGluZyB0YXNrIGlzIHNsZWVwaW5nIGR1ZSB0byBwcmlvcml0eQotCQkgKiByZWFzb25zIHdha2UgaXQgdXAgbm93LgotCQkgKi8KLQkJaWYgKHNtdF9ycS0+Y3VyciA9PSBzbXRfcnEtPmlkbGUgJiYgc210X3JxLT5ucl9ydW5uaW5nKQotCQkJcmVzY2hlZF90YXNrKHNtdF9ycS0+aWRsZSk7CisJCXdha2V1cF9idXN5X3J1bnF1ZXVlKHNtdF9ycSk7CiAJfQogCiAJZm9yX2VhY2hfY3B1X21hc2soaSwgc2libGluZ19tYXApCkBAIC0yNjI0LDYgKzI2ODgsMTYgQEAKIAkgKi8KIH0KIAorLyoKKyAqIG51bWJlciBvZiAnbG9zdCcgdGltZXNsaWNlcyB0aGlzIHRhc2sgd29udCBiZSBhYmxlIHRvIGZ1bGx5CisgKiB1dGlsaXplLCBpZiBhbm90aGVyIHRhc2sgcnVucyBvbiBhIHNpYmxpbmcuIFRoaXMgbW9kZWxzIHRoZQorICogc2xvd2Rvd24gZWZmZWN0IG9mIG90aGVyIHRhc2tzIHJ1bm5pbmcgb24gc2libGluZ3M6CisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzbXRfc2xpY2UodGFza190ICpwLCBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKK3sKKwlyZXR1cm4gcC0+dGltZV9zbGljZSAqICgxMDAgLSBzZC0+cGVyX2NwdV9nYWluKSAvIDEwMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgZGVwZW5kZW50X3NsZWVwZXIoaW50IHRoaXNfY3B1LCBydW5xdWV1ZV90ICp0aGlzX3JxKQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnRtcCwgKnNkID0gTlVMTDsKQEAgLTI2NjcsNiArMjc0MSwxMCBAQAogCQlydW5xdWV1ZV90ICpzbXRfcnEgPSBjcHVfcnEoaSk7CiAJCXRhc2tfdCAqc210X2N1cnIgPSBzbXRfcnEtPmN1cnI7CiAKKwkJLyogS2VybmVsIHRocmVhZHMgZG8gbm90IHBhcnRpY2lwYXRlIGluIGRlcGVuZGVudCBzbGVlcGluZyAqLworCQlpZiAoIXAtPm1tIHx8ICFzbXRfY3Vyci0+bW0gfHwgcnRfdGFzayhwKSkKKwkJCWdvdG8gY2hlY2tfc210X3Rhc2s7CisKIAkJLyoKIAkJICogSWYgYSB1c2VyIHRhc2sgd2l0aCBsb3dlciBzdGF0aWMgcHJpb3JpdHkgdGhhbiB0aGUKIAkJICogcnVubmluZyB0YXNrIG9uIHRoZSBTTVQgc2libGluZyBpcyB0cnlpbmcgdG8gc2NoZWR1bGUsCkBAIC0yNjc1LDIxICsyNzUzLDQ1IEBACiAJCSAqIHRhc2sgZnJvbSB1c2luZyBhbiB1bmZhaXIgcHJvcG9ydGlvbiBvZiB0aGUKIAkJICogcGh5c2ljYWwgY3B1J3MgcmVzb3VyY2VzLiAtY2sKIAkJICovCi0JCWlmICgoKHNtdF9jdXJyLT50aW1lX3NsaWNlICogKDEwMCAtIHNkLT5wZXJfY3B1X2dhaW4pIC8gMTAwKSA+Ci0JCQl0YXNrX3RpbWVzbGljZShwKSB8fCBydF90YXNrKHNtdF9jdXJyKSkgJiYKLQkJCXAtPm1tICYmIHNtdF9jdXJyLT5tbSAmJiAhcnRfdGFzayhwKSkKLQkJCQlyZXQgPSAxOworCQlpZiAocnRfdGFzayhzbXRfY3VycikpIHsKKwkJCS8qCisJCQkgKiBXaXRoIHJlYWwgdGltZSB0YXNrcyB3ZSBydW4gbm9uLXJ0IHRhc2tzIG9ubHkKKwkJCSAqIHBlcl9jcHVfZ2FpbiUgb2YgdGhlIHRpbWUuCisJCQkgKi8KKwkJCWlmICgoamlmZmllcyAlIERFRl9USU1FU0xJQ0UpID4KKwkJCQkoc2QtPnBlcl9jcHVfZ2FpbiAqIERFRl9USU1FU0xJQ0UgLyAxMDApKQorCQkJCQlyZXQgPSAxOworCQl9IGVsc2UKKwkJCWlmIChzbXRfY3Vyci0+c3RhdGljX3ByaW8gPCBwLT5zdGF0aWNfcHJpbyAmJgorCQkJCSFUQVNLX1BSRUVNUFRTX0NVUlIocCwgc210X3JxKSAmJgorCQkJCXNtdF9zbGljZShzbXRfY3Vyciwgc2QpID4gdGFza190aW1lc2xpY2UocCkpCisJCQkJCXJldCA9IDE7CisKK2NoZWNrX3NtdF90YXNrOgorCQlpZiAoKCFzbXRfY3Vyci0+bW0gJiYgc210X2N1cnIgIT0gc210X3JxLT5pZGxlKSB8fAorCQkJcnRfdGFzayhzbXRfY3VycikpCisJCQkJY29udGludWU7CisJCWlmICghcC0+bW0pIHsKKwkJCXdha2V1cF9idXN5X3J1bnF1ZXVlKHNtdF9ycSk7CisJCQljb250aW51ZTsKKwkJfQogCiAJCS8qCi0JCSAqIFJlc2NoZWR1bGUgYSBsb3dlciBwcmlvcml0eSB0YXNrIG9uIHRoZSBTTVQgc2libGluZywKLQkJICogb3Igd2FrZSBpdCB1cCBpZiBpdCBoYXMgYmVlbiBwdXQgdG8gc2xlZXAgZm9yIHByaW9yaXR5Ci0JCSAqIHJlYXNvbnMuCisJCSAqIFJlc2NoZWR1bGUgYSBsb3dlciBwcmlvcml0eSB0YXNrIG9uIHRoZSBTTVQgc2libGluZyBmb3IKKwkJICogaXQgdG8gYmUgcHV0IHRvIHNsZWVwLCBvciB3YWtlIGl0IHVwIGlmIGl0IGhhcyBiZWVuIHB1dCB0bworCQkgKiBzbGVlcCBmb3IgcHJpb3JpdHkgcmVhc29ucyB0byBzZWUgaWYgaXQgc2hvdWxkIHJ1biBub3cuCiAJCSAqLwotCQlpZiAoKCgocC0+dGltZV9zbGljZSAqICgxMDAgLSBzZC0+cGVyX2NwdV9nYWluKSAvIDEwMCkgPgotCQkJdGFza190aW1lc2xpY2Uoc210X2N1cnIpIHx8IHJ0X3Rhc2socCkpICYmCi0JCQlzbXRfY3Vyci0+bW0gJiYgcC0+bW0gJiYgIXJ0X3Rhc2soc210X2N1cnIpKSB8fAotCQkJKHNtdF9jdXJyID09IHNtdF9ycS0+aWRsZSAmJiBzbXRfcnEtPm5yX3J1bm5pbmcpKQotCQkJCXJlc2NoZWRfdGFzayhzbXRfY3Vycik7CisJCWlmIChydF90YXNrKHApKSB7CisJCQlpZiAoKGppZmZpZXMgJSBERUZfVElNRVNMSUNFKSA+CisJCQkJKHNkLT5wZXJfY3B1X2dhaW4gKiBERUZfVElNRVNMSUNFIC8gMTAwKSkKKwkJCQkJcmVzY2hlZF90YXNrKHNtdF9jdXJyKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChUQVNLX1BSRUVNUFRTX0NVUlIocCwgc210X3JxKSAmJgorCQkJCXNtdF9zbGljZShwLCBzZCkgPiB0YXNrX3RpbWVzbGljZShzbXRfY3VycikpCisJCQkJCXJlc2NoZWRfdGFzayhzbXRfY3Vycik7CisJCQllbHNlCisJCQkJd2FrZXVwX2J1c3lfcnVucXVldWUoc210X3JxKTsKKwkJfQogCX0KIG91dF91bmxvY2s6CiAJZm9yX2VhY2hfY3B1X21hc2soaSwgc2libGluZ19tYXApCkBAIC0yODg3LDYgKzI5ODksNyBAQAogCWlmIChuZXh0ID09IHJxLT5pZGxlKQogCQlzY2hlZHN0YXRfaW5jKHJxLCBzY2hlZF9nb2lkbGUpOwogCXByZWZldGNoKG5leHQpOworCXByZWZldGNoX3N0YWNrKG5leHQpOwogCWNsZWFyX3Rza19uZWVkX3Jlc2NoZWQocHJldik7CiAJcmN1X3FzY3RyX2luYyh0YXNrX2NwdShwcmV2KSk7CiAKQEAgLTMwMTQsNyArMzExNyw4IEBACiAKICNlbmRpZiAvKiBDT05GSUdfUFJFRU1QVCAqLwogCi1pbnQgZGVmYXVsdF93YWtlX2Z1bmN0aW9uKHdhaXRfcXVldWVfdCAqY3VyciwgdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsIHZvaWQgKmtleSkKK2ludCBkZWZhdWx0X3dha2VfZnVuY3Rpb24od2FpdF9xdWV1ZV90ICpjdXJyLCB1bnNpZ25lZCBtb2RlLCBpbnQgc3luYywKKwkJCSAgdm9pZCAqa2V5KQogewogCXRhc2tfdCAqcCA9IGN1cnItPnByaXZhdGU7CiAJcmV0dXJuIHRyeV90b193YWtlX3VwKHAsIG1vZGUsIHN5bmMpOwpAQCAtMzA1Niw3ICszMTYwLDcgQEAKICAqIEBrZXk6IGlzIGRpcmVjdGx5IHBhc3NlZCB0byB0aGUgd2FrZXVwIGZ1bmN0aW9uCiAgKi8KIHZvaWQgZmFzdGNhbGwgX193YWtlX3VwKHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwKLQkJCQlpbnQgbnJfZXhjbHVzaXZlLCB2b2lkICprZXkpCisJCQlpbnQgbnJfZXhjbHVzaXZlLCB2b2lkICprZXkpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMzA4OCw3ICszMTkyLDggQEAKICAqCiAgKiBPbiBVUCBpdCBjYW4gcHJldmVudCBleHRyYSBwcmVlbXB0aW9uLgogICovCi12b2lkIGZhc3RjYWxsIF9fd2FrZV91cF9zeW5jKHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwgaW50IG5yX2V4Y2x1c2l2ZSkKK3ZvaWQgZmFzdGNhbGwKK19fd2FrZV91cF9zeW5jKHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwgaW50IG5yX2V4Y2x1c2l2ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzeW5jID0gMTsKQEAgLTMyNzksNyArMzM4NCw4IEBACiAKIEVYUE9SVF9TWU1CT0woaW50ZXJydXB0aWJsZV9zbGVlcF9vbik7CiAKLWxvbmcgZmFzdGNhbGwgX19zY2hlZCBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIGxvbmcgdGltZW91dCkKK2xvbmcgZmFzdGNhbGwgX19zY2hlZAoraW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KHdhaXRfcXVldWVfaGVhZF90ICpxLCBsb25nIHRpbWVvdXQpCiB7CiAJU0xFRVBfT05fVkFSCiAKQEAgLTM0NzEsNiArMzU3NywzMiBAQAogfQogCiAvKioKKyAqIGN1cnJfdGFzayAtIHJldHVybiB0aGUgY3VycmVudCB0YXNrIGZvciBhIGdpdmVuIGNwdS4KKyAqIEBjcHU6IHRoZSBwcm9jZXNzb3IgaW4gcXVlc3Rpb24uCisgKi8KK3Rhc2tfdCAqY3Vycl90YXNrKGludCBjcHUpCit7CisJcmV0dXJuIGNwdV9jdXJyKGNwdSk7Cit9CisKKy8qKgorICogc2V0X2N1cnJfdGFzayAtIHNldCB0aGUgY3VycmVudCB0YXNrIGZvciBhIGdpdmVuIGNwdS4KKyAqIEBjcHU6IHRoZSBwcm9jZXNzb3IgaW4gcXVlc3Rpb24uCisgKiBAcDogdGhlIHRhc2sgcG9pbnRlciB0byBzZXQuCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlIHVzZWQgd2hlbiBub24tbWFza2FibGUgaW50ZXJydXB0cworICogYXJlIHNlcnZpY2VkIG9uIGEgc2VwYXJhdGUgc3RhY2suICBJdCBhbGxvd3MgdGhlIGFyY2hpdGVjdHVyZSB0byBzd2l0Y2ggdGhlCisgKiBub3Rpb24gb2YgdGhlIGN1cnJlbnQgdGFzayBvbiBhIGNwdSBpbiBhIG5vbi1ibG9ja2luZyBtYW5uZXIuICBUaGlzIGZ1bmN0aW9uCisgKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIHRoZSBjYWxsZXIgbXVzdCBzYXZlIHRoZSBvcmlnaW5hbAorICogdmFsdWUgb2YgdGhlIGN1cnJlbnQgdGFzayAoc2VlIGN1cnJfdGFzaygpIGFib3ZlKSBhbmQgcmVzdG9yZSB0aGF0IHZhbHVlCisgKiBiZWZvcmUgcmVlbmFibGluZyBpbnRlcnJ1cHRzLgorICovCit2b2lkIHNldF9jdXJyX3Rhc2soaW50IGNwdSwgdGFza190ICpwKQoreworCWNwdV9jdXJyKGNwdSkgPSBwOworfQorCisvKioKICAqIGZpbmRfcHJvY2Vzc19ieV9waWQgLSBmaW5kIGEgcHJvY2VzcyB3aXRoIGEgbWF0Y2hpbmcgUElEIHZhbHVlLgogICogQHBpZDogdGhlIHBpZCBpbiBxdWVzdGlvbi4KICAqLwpAQCAtMzQ5OCw3ICszNjMwLDggQEAKICAqIEBwb2xpY3k6IG5ldyBwb2xpY3kuCiAgKiBAcGFyYW06IHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBuZXcgUlQgcHJpb3JpdHkuCiAgKi8KLWludCBzY2hlZF9zZXRzY2hlZHVsZXIoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgcG9saWN5LCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKnBhcmFtKQoraW50IHNjaGVkX3NldHNjaGVkdWxlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBwb2xpY3ksCisJCSAgICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKnBhcmFtKQogewogCWludCByZXR2YWw7CiAJaW50IG9sZHByaW8sIG9sZHBvbGljeSA9IC0xOwpAQCAtMzUxOCw3ICszNjUxLDcgQEAKIAkgKiAxLi5NQVhfVVNFUl9SVF9QUklPLTEsIHZhbGlkIHByaW9yaXR5IGZvciBTQ0hFRF9OT1JNQUwgaXMgMC4KIAkgKi8KIAlpZiAocGFyYW0tPnNjaGVkX3ByaW9yaXR5IDwgMCB8fAotCSAgICAocC0+bW0gJiYgIHBhcmFtLT5zY2hlZF9wcmlvcml0eSA+IE1BWF9VU0VSX1JUX1BSSU8tMSkgfHwKKwkgICAgKHAtPm1tICYmIHBhcmFtLT5zY2hlZF9wcmlvcml0eSA+IE1BWF9VU0VSX1JUX1BSSU8tMSkgfHwKIAkgICAgKCFwLT5tbSAmJiBwYXJhbS0+c2NoZWRfcHJpb3JpdHkgPiBNQVhfUlRfUFJJTy0xKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKChwb2xpY3kgPT0gU0NIRURfTk9STUFMKSAhPSAocGFyYW0tPnNjaGVkX3ByaW9yaXR5ID09IDApKQpAQCAtMzU4MSw3ICszNzE0LDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNjaGVkX3NldHNjaGVkdWxlcik7CiAKLXN0YXRpYyBpbnQgZG9fc2NoZWRfc2V0c2NoZWR1bGVyKHBpZF90IHBpZCwgaW50IHBvbGljeSwgc3RydWN0IHNjaGVkX3BhcmFtIF9fdXNlciAqcGFyYW0pCitzdGF0aWMgaW50Citkb19zY2hlZF9zZXRzY2hlZHVsZXIocGlkX3QgcGlkLCBpbnQgcG9saWN5LCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gX191c2VyICpwYXJhbSkKIHsKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBzY2hlZF9wYXJhbSBscGFyYW07CkBAIC0zODQ4LDcgKzM5ODIsNyBAQAogCWlmIChydF90YXNrKGN1cnJlbnQpKQogCQl0YXJnZXQgPSBycS0+YWN0aXZlOwogCi0JaWYgKGN1cnJlbnQtPmFycmF5LT5ucl9hY3RpdmUgPT0gMSkgeworCWlmIChhcnJheS0+bnJfYWN0aXZlID09IDEpIHsKIAkJc2NoZWRzdGF0X2luYyhycSwgeWxkX2FjdF9lbXB0eSk7CiAJCWlmICghcnEtPmV4cGlyZWQtPm5yX2FjdGl2ZSkKIAkJCXNjaGVkc3RhdF9pbmMocnEsIHlsZF9ib3RoX2VtcHR5KTsKQEAgLTM5MTIsNyArNDA0Niw3IEBACiAgKiBvcGVyYXRpb25zIGhlcmUgdG8gcHJldmVudCBzY2hlZHVsZSgpIGZyb20gYmVpbmcgY2FsbGVkIHR3aWNlIChvbmNlIHZpYQogICogc3Bpbl91bmxvY2soKSwgb25jZSBieSBoYW5kKS4KICAqLwotaW50IGNvbmRfcmVzY2hlZF9sb2NrKHNwaW5sb2NrX3QgKiBsb2NrKQoraW50IGNvbmRfcmVzY2hlZF9sb2NrKHNwaW5sb2NrX3QgKmxvY2spCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTQwOTUsNyArNDIyOSw3IEBACiAJcmV0dXJuIGxpc3RfZW50cnkocC0+c2libGluZy5uZXh0LHN0cnVjdCB0YXNrX3N0cnVjdCxzaWJsaW5nKTsKIH0KIAotc3RhdGljIHZvaWQgc2hvd190YXNrKHRhc2tfdCAqIHApCitzdGF0aWMgdm9pZCBzaG93X3Rhc2sodGFza190ICpwKQogewogCXRhc2tfdCAqcmVsYXRpdmU7CiAJdW5zaWduZWQgc3RhdGU7CkBAIC00MTIxLDcgKzQyNTUsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFCiAJewotCQl1bnNpZ25lZCBsb25nICogbiA9ICh1bnNpZ25lZCBsb25nICopIChwLT50aHJlYWRfaW5mbysxKTsKKwkJdW5zaWduZWQgbG9uZyAqbiA9ICh1bnNpZ25lZCBsb25nICopIChwLT50aHJlYWRfaW5mbysxKTsKIAkJd2hpbGUgKCEqbikKIAkJCW4rKzsKIAkJZnJlZSA9ICh1bnNpZ25lZCBsb25nKSBuIC0gKHVuc2lnbmVkIGxvbmcpKHAtPnRocmVhZF9pbmZvKzEpOwpAQCAtNDMzMCw3ICs0NDY0LDcgQEAKICAqIHRocmVhZCBtaWdyYXRpb24gYnkgYnVtcGluZyB0aHJlYWQgb2ZmIENQVSB0aGVuICdwdXNoaW5nJyBvbnRvCiAgKiBhbm90aGVyIHJ1bnF1ZXVlLgogICovCi1zdGF0aWMgaW50IG1pZ3JhdGlvbl90aHJlYWQodm9pZCAqIGRhdGEpCitzdGF0aWMgaW50IG1pZ3JhdGlvbl90aHJlYWQodm9pZCAqZGF0YSkKIHsKIAlydW5xdWV1ZV90ICpycTsKIAlpbnQgY3B1ID0gKGxvbmcpZGF0YTsKQEAgLTQ3NzksNyArNDkxMyw3IEBACiAgKiBBdHRhY2ggdGhlIGRvbWFpbiAnc2QnIHRvICdjcHUnIGFzIGl0cyBiYXNlIGRvbWFpbi4gIENhbGxlcnMgbXVzdAogICogaG9sZCB0aGUgaG90cGx1ZyBsb2NrLgogICovCi12b2lkIGNwdV9hdHRhY2hfZG9tYWluKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQorc3RhdGljIHZvaWQgY3B1X2F0dGFjaF9kb21haW4oc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCiB7CiAJcnVucXVldWVfdCAqcnEgPSBjcHVfcnEoY3B1KTsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICp0bXA7CkBAIC00ODAyLDcgKzQ5MzYsNyBAQAogfQogCiAvKiBjcHVzIHdpdGggaXNvbGF0ZWQgZG9tYWlucyAqLwotY3B1bWFza190IF9fZGV2aW5pdGRhdGEgY3B1X2lzb2xhdGVkX21hcCA9IENQVV9NQVNLX05PTkU7CitzdGF0aWMgY3B1bWFza190IF9fZGV2aW5pdGRhdGEgY3B1X2lzb2xhdGVkX21hcCA9IENQVV9NQVNLX05PTkU7CiAKIC8qIFNldHVwIHRoZSBtYXNrIG9mIGNwdXMgY29uZmlndXJlZCBmb3IgaXNvbGF0ZWQgZG9tYWlucyAqLwogc3RhdGljIGludCBfX2luaXQgaXNvbGF0ZWRfY3B1X3NldHVwKGNoYXIgKnN0cikKQEAgLTQ4MzAsOCArNDk2NCw4IEBACiAgKiBjb3ZlcmVkIGJ5IHRoZSBnaXZlbiBzcGFuLCBhbmQgd2lsbCBzZXQgZWFjaCBncm91cCdzIC0+Y3B1bWFzayBjb3JyZWN0bHksCiAgKiBhbmQgLT5jcHVfcG93ZXIgdG8gMC4KICAqLwotdm9pZCBpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhzdHJ1Y3Qgc2NoZWRfZ3JvdXAgZ3JvdXBzW10sCi0JCQljcHVtYXNrX3Qgc3BhbiwgaW50ICgqZ3JvdXBfZm4pKGludCBjcHUpKQorc3RhdGljIHZvaWQgaW5pdF9zY2hlZF9idWlsZF9ncm91cHMoc3RydWN0IHNjaGVkX2dyb3VwIGdyb3Vwc1tdLCBjcHVtYXNrX3Qgc3BhbiwKKwkJCQkgICAgaW50ICgqZ3JvdXBfZm4pKGludCBjcHUpKQogewogCXN0cnVjdCBzY2hlZF9ncm91cCAqZmlyc3QgPSBOVUxMLCAqbGFzdCA9IE5VTEw7CiAJY3B1bWFza190IGNvdmVyZWQgPSBDUFVfTUFTS19OT05FOwpAQCAtNDg2NCwxMiArNDk5OCw4NSBAQAogCWxhc3QtPm5leHQgPSBmaXJzdDsKIH0KIAorI2RlZmluZSBTRF9OT0RFU19QRVJfRE9NQUlOIDE2CiAKLSNpZmRlZiBBUkNIX0hBU19TQ0hFRF9ET01BSU4KLWV4dGVybiB2b2lkIGJ1aWxkX3NjaGVkX2RvbWFpbnMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKTsKLWV4dGVybiB2b2lkIGFyY2hfaW5pdF9zY2hlZF9kb21haW5zKGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCk7Ci1leHRlcm4gdm9pZCBhcmNoX2Rlc3Ryb3lfc2NoZWRfZG9tYWlucyhjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXApOwotI2Vsc2UKKyNpZmRlZiBDT05GSUdfTlVNQQorLyoqCisgKiBmaW5kX25leHRfYmVzdF9ub2RlIC0gZmluZCB0aGUgbmV4dCBub2RlIHRvIGluY2x1ZGUgaW4gYSBzY2hlZF9kb21haW4KKyAqIEBub2RlOiBub2RlIHdob3NlIHNjaGVkX2RvbWFpbiB3ZSdyZSBidWlsZGluZworICogQHVzZWRfbm9kZXM6IG5vZGVzIGFscmVhZHkgaW4gdGhlIHNjaGVkX2RvbWFpbgorICoKKyAqIEZpbmQgdGhlIG5leHQgbm9kZSB0byBpbmNsdWRlIGluIGEgZ2l2ZW4gc2NoZWR1bGluZyBkb21haW4uICBTaW1wbHkKKyAqIGZpbmRzIHRoZSBjbG9zZXN0IG5vZGUgbm90IGFscmVhZHkgaW4gdGhlIEB1c2VkX25vZGVzIG1hcC4KKyAqCisgKiBTaG91bGQgdXNlIG5vZGVtYXNrX3QuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyAqdXNlZF9ub2RlcykKK3sKKwlpbnQgaSwgbiwgdmFsLCBtaW5fdmFsLCBiZXN0X25vZGUgPSAwOworCisJbWluX3ZhbCA9IElOVF9NQVg7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKKwkJLyogU3RhcnQgYXQgQG5vZGUgKi8KKwkJbiA9IChub2RlICsgaSkgJSBNQVhfTlVNTk9ERVM7CisKKwkJaWYgKCFucl9jcHVzX25vZGUobikpCisJCQljb250aW51ZTsKKworCQkvKiBTa2lwIGFscmVhZHkgdXNlZCBub2RlcyAqLworCQlpZiAodGVzdF9iaXQobiwgdXNlZF9ub2RlcykpCisJCQljb250aW51ZTsKKworCQkvKiBTaW1wbGUgbWluIGRpc3RhbmNlIHNlYXJjaCAqLworCQl2YWwgPSBub2RlX2Rpc3RhbmNlKG5vZGUsIG4pOworCisJCWlmICh2YWwgPCBtaW5fdmFsKSB7CisJCQltaW5fdmFsID0gdmFsOworCQkJYmVzdF9ub2RlID0gbjsKKwkJfQorCX0KKworCXNldF9iaXQoYmVzdF9ub2RlLCB1c2VkX25vZGVzKTsKKwlyZXR1cm4gYmVzdF9ub2RlOworfQorCisvKioKKyAqIHNjaGVkX2RvbWFpbl9ub2RlX3NwYW4gLSBnZXQgYSBjcHVtYXNrIGZvciBhIG5vZGUncyBzY2hlZF9kb21haW4KKyAqIEBub2RlOiBub2RlIHdob3NlIGNwdW1hc2sgd2UncmUgY29uc3RydWN0aW5nCisgKiBAc2l6ZTogbnVtYmVyIG9mIG5vZGVzIHRvIGluY2x1ZGUgaW4gdGhpcyBzcGFuCisgKgorICogR2l2ZW4gYSBub2RlLCBjb25zdHJ1Y3QgYSBnb29kIGNwdW1hc2sgZm9yIGl0cyBzY2hlZF9kb21haW4gdG8gc3Bhbi4gIEl0CisgKiBzaG91bGQgYmUgb25lIHRoYXQgcHJldmVudHMgdW5uZWNlc3NhcnkgYmFsYW5jaW5nLCBidXQgYWxzbyBzcHJlYWRzIHRhc2tzCisgKiBvdXQgb3B0aW1hbGx5LgorICovCitzdGF0aWMgY3B1bWFza190IHNjaGVkX2RvbWFpbl9ub2RlX3NwYW4oaW50IG5vZGUpCit7CisJaW50IGk7CisJY3B1bWFza190IHNwYW4sIG5vZGVtYXNrOworCURFQ0xBUkVfQklUTUFQKHVzZWRfbm9kZXMsIE1BWF9OVU1OT0RFUyk7CisKKwljcHVzX2NsZWFyKHNwYW4pOworCWJpdG1hcF96ZXJvKHVzZWRfbm9kZXMsIE1BWF9OVU1OT0RFUyk7CisKKwlub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhub2RlKTsKKwljcHVzX29yKHNwYW4sIHNwYW4sIG5vZGVtYXNrKTsKKwlzZXRfYml0KG5vZGUsIHVzZWRfbm9kZXMpOworCisJZm9yIChpID0gMTsgaSA8IFNEX05PREVTX1BFUl9ET01BSU47IGkrKykgeworCQlpbnQgbmV4dF9ub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCB1c2VkX25vZGVzKTsKKwkJbm9kZW1hc2sgPSBub2RlX3RvX2NwdW1hc2sobmV4dF9ub2RlKTsKKwkJY3B1c19vcihzcGFuLCBzcGFuLCBub2RlbWFzayk7CisJfQorCisJcmV0dXJuIHNwYW47Cit9CisjZW5kaWYKKworLyoKKyAqIEF0IHRoZSBtb21lbnQsIENPTkZJR19TQ0hFRF9TTVQgaXMgbmV2ZXIgZGVmaW5lZCwgYnV0IGxlYXZlIGl0IGluIHNvIHdlCisgKiBjYW4gc3dpdGNoIGl0IG9uIGVhc2lseSBpZiBuZWVkZWQuCisgKi8KICNpZmRlZiBDT05GSUdfU0NIRURfU01UCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiwgY3B1X2RvbWFpbnMpOwogc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCBzY2hlZF9ncm91cF9jcHVzW05SX0NQVVNdOwpAQCAtNDg5MSw0NiArNTA5OCw0NSBAQAogfQogCiAjaWZkZWYgQ09ORklHX05VTUEKLQorLyoKKyAqIFRoZSBpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyBjYW4ndCBoYW5kbGUgd2hhdCB3ZSB3YW50IHRvIGRvIHdpdGggbm9kZQorICogZ3JvdXBzLCBzbyByb2xsIG91ciBvd24uIE5vdyBlYWNoIG5vZGUgaGFzIGl0cyBvd24gbGlzdCBvZiBncm91cHMgd2hpY2gKKyAqIGdldHMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLgorICovCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiwgbm9kZV9kb21haW5zKTsKLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgc2NoZWRfZ3JvdXBfbm9kZXNbTUFYX05VTU5PREVTXTsKLXN0YXRpYyBpbnQgY3B1X3RvX25vZGVfZ3JvdXAoaW50IGNwdSkKK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKipzY2hlZF9ncm91cF9ub2Rlc19ieWNwdVtOUl9DUFVTXTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4sIGFsbG5vZGVzX2RvbWFpbnMpOworc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCAqc2NoZWRfZ3JvdXBfYWxsbm9kZXNfYnljcHVbTlJfQ1BVU107CisKK3N0YXRpYyBpbnQgY3B1X3RvX2FsbG5vZGVzX2dyb3VwKGludCBjcHUpCiB7CiAJcmV0dXJuIGNwdV90b19ub2RlKGNwdSk7CiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NDSEVEX1NNVCkgJiYgZGVmaW5lZChDT05GSUdfTlVNQSkKLS8qCi0gKiBUaGUgZG9tYWlucyBzZXR1cCBjb2RlIHJlbGllcyBvbiBzaWJsaW5ncyBub3Qgc3Bhbm5pbmcKLSAqIG11bHRpcGxlIG5vZGVzLiBNYWtlIHN1cmUgdGhlIGFyY2hpdGVjdHVyZSBoYXMgYSBwcm9wZXIKLSAqIHNpYmxpbmdzIG1hcDoKLSAqLwotc3RhdGljIHZvaWQgY2hlY2tfc2libGluZ19tYXBzKHZvaWQpCi17Ci0JaW50IGksIGo7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJZm9yX2VhY2hfY3B1X21hc2soaiwgY3B1X3NpYmxpbmdfbWFwW2ldKSB7Ci0JCQlpZiAoY3B1X3RvX25vZGUoaSkgIT0gY3B1X3RvX25vZGUoaikpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJ3YXJuaW5nOiBDUFUgJWQgc2libGluZ3MgbWFwICIKLQkJCQkJInRvIGRpZmZlcmVudCBub2RlIC0gaXNvbGF0aW5nICIKLQkJCQkJInRoZW0uXG4iLCBpKTsKLQkJCQljcHVfc2libGluZ19tYXBbaV0gPSBjcHVtYXNrX29mX2NwdShpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KLSNlbmRpZgotCiAvKgogICogQnVpbGQgc2NoZWQgZG9tYWlucyBmb3IgYSBnaXZlbiBzZXQgb2YgY3B1cyBhbmQgYXR0YWNoIHRoZSBzY2hlZCBkb21haW5zCiAgKiB0byB0aGUgaW5kaXZpZHVhbCBjcHVzCiAgKi8KLXN0YXRpYyB2b2lkIGJ1aWxkX3NjaGVkX2RvbWFpbnMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKQordm9pZCBidWlsZF9zY2hlZF9kb21haW5zKGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCkKIHsKIAlpbnQgaTsKKyNpZmRlZiBDT05GSUdfTlVNQQorCXN0cnVjdCBzY2hlZF9ncm91cCAqKnNjaGVkX2dyb3VwX25vZGVzID0gTlVMTDsKKwlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNjaGVkX2dyb3VwX2FsbG5vZGVzID0gTlVMTDsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIHBlci1ub2RlIGxpc3Qgb2Ygc2NoZWQgZ3JvdXBzCisJICovCisJc2NoZWRfZ3JvdXBfbm9kZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXAqKSpNQVhfTlVNTk9ERVMsCisJCQkJCSAgIEdGUF9BVE9NSUMpOworCWlmICghc2NoZWRfZ3JvdXBfbm9kZXMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuIG5vdCBhbGxvYyBzY2hlZCBncm91cCBub2RlIGxpc3RcbiIpOworCQlyZXR1cm47CisJfQorCXNjaGVkX2dyb3VwX25vZGVzX2J5Y3B1W2ZpcnN0X2NwdSgqY3B1X21hcCldID0gc2NoZWRfZ3JvdXBfbm9kZXM7CisjZW5kaWYKIAogCS8qCiAJICogU2V0IHVwIGRvbWFpbnMgZm9yIGNwdXMgc3BlY2lmaWVkIGJ5IHRoZSBjcHVfbWFwLgpAQCAtNDk0MywxMSArNTE0OSwzNSBAQAogCQljcHVzX2FuZChub2RlbWFzaywgbm9kZW1hc2ssICpjcHVfbWFwKTsKIAogI2lmZGVmIENPTkZJR19OVU1BCisJCWlmIChjcHVzX3dlaWdodCgqY3B1X21hcCkKKwkJCQk+IFNEX05PREVTX1BFUl9ET01BSU4qY3B1c193ZWlnaHQobm9kZW1hc2spKSB7CisJCQlpZiAoIXNjaGVkX2dyb3VwX2FsbG5vZGVzKSB7CisJCQkJc2NoZWRfZ3JvdXBfYWxsbm9kZXMKKwkJCQkJPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXApCisJCQkJCQkJKiBNQVhfTlVNTk9ERVMsCisJCQkJCQkgIEdGUF9LRVJORUwpOworCQkJCWlmICghc2NoZWRfZ3JvdXBfYWxsbm9kZXMpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiQ2FuIG5vdCBhbGxvYyBhbGxub2RlcyBzY2hlZCBncm91cFxuIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlzY2hlZF9ncm91cF9hbGxub2Rlc19ieWNwdVtpXQorCQkJCQkJPSBzY2hlZF9ncm91cF9hbGxub2RlczsKKwkJCX0KKwkJCXNkID0gJnBlcl9jcHUoYWxsbm9kZXNfZG9tYWlucywgaSk7CisJCQkqc2QgPSBTRF9BTExOT0RFU19JTklUOworCQkJc2QtPnNwYW4gPSAqY3B1X21hcDsKKwkJCWdyb3VwID0gY3B1X3RvX2FsbG5vZGVzX2dyb3VwKGkpOworCQkJc2QtPmdyb3VwcyA9ICZzY2hlZF9ncm91cF9hbGxub2Rlc1tncm91cF07CisJCQlwID0gc2Q7CisJCX0gZWxzZQorCQkJcCA9IE5VTEw7CisKIAkJc2QgPSAmcGVyX2NwdShub2RlX2RvbWFpbnMsIGkpOwotCQlncm91cCA9IGNwdV90b19ub2RlX2dyb3VwKGkpOwogCQkqc2QgPSBTRF9OT0RFX0lOSVQ7Ci0JCXNkLT5zcGFuID0gKmNwdV9tYXA7Ci0JCXNkLT5ncm91cHMgPSAmc2NoZWRfZ3JvdXBfbm9kZXNbZ3JvdXBdOworCQlzZC0+c3BhbiA9IHNjaGVkX2RvbWFpbl9ub2RlX3NwYW4oY3B1X3RvX25vZGUoaSkpOworCQlzZC0+cGFyZW50ID0gcDsKKwkJY3B1c19hbmQoc2QtPnNwYW4sIHNkLT5zcGFuLCAqY3B1X21hcCk7CiAjZW5kaWYKIAogCQlwID0gc2Q7CkBAIC00OTcyLDcgKzUyMDIsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAogCS8qIFNldCB1cCBDUFUgKHNpYmxpbmcpIGdyb3VwcyAqLwotCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjcHVfbWFwKSB7CiAJCWNwdW1hc2tfdCB0aGlzX3NpYmxpbmdfbWFwID0gY3B1X3NpYmxpbmdfbWFwW2ldOwogCQljcHVzX2FuZCh0aGlzX3NpYmxpbmdfbWFwLCB0aGlzX3NpYmxpbmdfbWFwLCAqY3B1X21hcCk7CiAJCWlmIChpICE9IGZpcnN0X2NwdSh0aGlzX3NpYmxpbmdfbWFwKSkKQEAgLTQ5OTcsOCArNTIyNyw3NyBAQAogCiAjaWZkZWYgQ09ORklHX05VTUEKIAkvKiBTZXQgdXAgbm9kZSBncm91cHMgKi8KLQlpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhzY2hlZF9ncm91cF9ub2RlcywgKmNwdV9tYXAsCi0JCQkJCSZjcHVfdG9fbm9kZV9ncm91cCk7CisJaWYgKHNjaGVkX2dyb3VwX2FsbG5vZGVzKQorCQlpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhzY2hlZF9ncm91cF9hbGxub2RlcywgKmNwdV9tYXAsCisJCQkJCSZjcHVfdG9fYWxsbm9kZXNfZ3JvdXApOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7CisJCS8qIFNldCB1cCBub2RlIGdyb3VwcyAqLworCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnLCAqcHJldjsKKwkJY3B1bWFza190IG5vZGVtYXNrID0gbm9kZV90b19jcHVtYXNrKGkpOworCQljcHVtYXNrX3QgZG9tYWluc3BhbjsKKwkJY3B1bWFza190IGNvdmVyZWQgPSBDUFVfTUFTS19OT05FOworCQlpbnQgajsKKworCQljcHVzX2FuZChub2RlbWFzaywgbm9kZW1hc2ssICpjcHVfbWFwKTsKKwkJaWYgKGNwdXNfZW1wdHkobm9kZW1hc2spKSB7CisJCQlzY2hlZF9ncm91cF9ub2Rlc1tpXSA9IE5VTEw7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRvbWFpbnNwYW4gPSBzY2hlZF9kb21haW5fbm9kZV9zcGFuKGkpOworCQljcHVzX2FuZChkb21haW5zcGFuLCBkb21haW5zcGFuLCAqY3B1X21hcCk7CisKKwkJc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXApLCBHRlBfS0VSTkVMKTsKKwkJc2NoZWRfZ3JvdXBfbm9kZXNbaV0gPSBzZzsKKwkJZm9yX2VhY2hfY3B1X21hc2soaiwgbm9kZW1hc2spIHsKKwkJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCQkJc2QgPSAmcGVyX2NwdShub2RlX2RvbWFpbnMsIGopOworCQkJc2QtPmdyb3VwcyA9IHNnOworCQkJaWYgKHNkLT5ncm91cHMgPT0gTlVMTCkgeworCQkJCS8qIFR1cm4gb2ZmIGJhbGFuY2luZyBpZiB3ZSBoYXZlIG5vIGdyb3VwcyAqLworCQkJCXNkLT5mbGFncyA9IDA7CisJCQl9CisJCX0KKwkJaWYgKCFzZykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIkNhbiBub3QgYWxsb2MgZG9tYWluIGdyb3VwIGZvciBub2RlICVkXG4iLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNnLT5jcHVfcG93ZXIgPSAwOworCQlzZy0+Y3B1bWFzayA9IG5vZGVtYXNrOworCQljcHVzX29yKGNvdmVyZWQsIGNvdmVyZWQsIG5vZGVtYXNrKTsKKwkJcHJldiA9IHNnOworCisJCWZvciAoaiA9IDA7IGogPCBNQVhfTlVNTk9ERVM7IGorKykgeworCQkJY3B1bWFza190IHRtcCwgbm90Y292ZXJlZDsKKwkJCWludCBuID0gKGkgKyBqKSAlIE1BWF9OVU1OT0RFUzsKKworCQkJY3B1c19jb21wbGVtZW50KG5vdGNvdmVyZWQsIGNvdmVyZWQpOworCQkJY3B1c19hbmQodG1wLCBub3Rjb3ZlcmVkLCAqY3B1X21hcCk7CisJCQljcHVzX2FuZCh0bXAsIHRtcCwgZG9tYWluc3Bhbik7CisJCQlpZiAoY3B1c19lbXB0eSh0bXApKQorCQkJCWJyZWFrOworCisJCQlub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhuKTsKKwkJCWNwdXNfYW5kKHRtcCwgdG1wLCBub2RlbWFzayk7CisJCQlpZiAoY3B1c19lbXB0eSh0bXApKQorCQkJCWNvbnRpbnVlOworCisJCQlzZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2hlZF9ncm91cCksIEdGUF9LRVJORUwpOworCQkJaWYgKCFzZykgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiQ2FuIG5vdCBhbGxvYyBkb21haW4gZ3JvdXAgZm9yIG5vZGUgJWRcbiIsIGopOworCQkJCWJyZWFrOworCQkJfQorCQkJc2ctPmNwdV9wb3dlciA9IDA7CisJCQlzZy0+Y3B1bWFzayA9IHRtcDsKKwkJCWNwdXNfb3IoY292ZXJlZCwgY292ZXJlZCwgdG1wKTsKKwkJCXByZXYtPm5leHQgPSBzZzsKKwkJCXByZXYgPSBzZzsKKwkJfQorCQlwcmV2LT5uZXh0ID0gc2NoZWRfZ3JvdXBfbm9kZXNbaV07CisJfQogI2VuZGlmCiAKIAkvKiBDYWxjdWxhdGUgQ1BVIHBvd2VyIGZvciBwaHlzaWNhbCBwYWNrYWdlcyBhbmQgbm9kZXMgKi8KQEAgLTUwMTcsMTQgKzUzMTYsNDYgQEAKIAkJc2QtPmdyb3Vwcy0+Y3B1X3Bvd2VyID0gcG93ZXI7CiAKICNpZmRlZiBDT05GSUdfTlVNQQotCQlpZiAoaSA9PSBmaXJzdF9jcHUoc2QtPmdyb3Vwcy0+Y3B1bWFzaykpIHsKLQkJCS8qIE9ubHkgYWRkICJwb3dlciIgb25jZSBmb3IgZWFjaCBwaHlzaWNhbCBwYWNrYWdlLiAqLwotCQkJc2QgPSAmcGVyX2NwdShub2RlX2RvbWFpbnMsIGkpOwotCQkJc2QtPmdyb3Vwcy0+Y3B1X3Bvd2VyICs9IHBvd2VyOworCQlzZCA9ICZwZXJfY3B1KGFsbG5vZGVzX2RvbWFpbnMsIGkpOworCQlpZiAoc2QtPmdyb3VwcykgeworCQkJcG93ZXIgPSBTQ0hFRF9MT0FEX1NDQUxFICsgU0NIRURfTE9BRF9TQ0FMRSAqCisJCQkJKGNwdXNfd2VpZ2h0KHNkLT5ncm91cHMtPmNwdW1hc2spLTEpIC8gMTA7CisJCQlzZC0+Z3JvdXBzLT5jcHVfcG93ZXIgPSBwb3dlcjsKIAkJfQogI2VuZGlmCiAJfQogCisjaWZkZWYgQ09ORklHX05VTUEKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKKwkJc3RydWN0IHNjaGVkX2dyb3VwICpzZyA9IHNjaGVkX2dyb3VwX25vZGVzW2ldOworCQlpbnQgajsKKworCQlpZiAoc2cgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworbmV4dF9zZzoKKwkJZm9yX2VhY2hfY3B1X21hc2soaiwgc2ctPmNwdW1hc2spIHsKKwkJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCQkJaW50IHBvd2VyOworCisJCQlzZCA9ICZwZXJfY3B1KHBoeXNfZG9tYWlucywgaik7CisJCQlpZiAoaiAhPSBmaXJzdF9jcHUoc2QtPmdyb3Vwcy0+Y3B1bWFzaykpIHsKKwkJCQkvKgorCQkJCSAqIE9ubHkgYWRkICJwb3dlciIgb25jZSBmb3IgZWFjaAorCQkJCSAqIHBoeXNpY2FsIHBhY2thZ2UuCisJCQkJICovCisJCQkJY29udGludWU7CisJCQl9CisJCQlwb3dlciA9IFNDSEVEX0xPQURfU0NBTEUgKyBTQ0hFRF9MT0FEX1NDQUxFICoKKwkJCQkoY3B1c193ZWlnaHQoc2QtPmdyb3Vwcy0+Y3B1bWFzayktMSkgLyAxMDsKKworCQkJc2ctPmNwdV9wb3dlciArPSBwb3dlcjsKKwkJfQorCQlzZyA9IHNnLT5uZXh0OworCQlpZiAoc2cgIT0gc2NoZWRfZ3JvdXBfbm9kZXNbaV0pCisJCQlnb3RvIG5leHRfc2c7CisJfQorI2VuZGlmCisKIAkvKiBBdHRhY2ggdGhlIGRvbWFpbnMgKi8KIAlmb3JfZWFjaF9jcHVfbWFzayhpLCAqY3B1X21hcCkgewogCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKQEAgLTUwMzksMTMgKzUzNzAsMTAgQEAKIC8qCiAgKiBTZXQgdXAgc2NoZWR1bGVyIGRvbWFpbnMgYW5kIGdyb3Vwcy4gIENhbGxlcnMgbXVzdCBob2xkIHRoZSBob3RwbHVnIGxvY2suCiAgKi8KLXN0YXRpYyB2b2lkIGFyY2hfaW5pdF9zY2hlZF9kb21haW5zKGNwdW1hc2tfdCAqY3B1X21hcCkKK3N0YXRpYyB2b2lkIGFyY2hfaW5pdF9zY2hlZF9kb21haW5zKGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCkKIHsKIAljcHVtYXNrX3QgY3B1X2RlZmF1bHRfbWFwOwogCi0jaWYgZGVmaW5lZChDT05GSUdfU0NIRURfU01UKSAmJiBkZWZpbmVkKENPTkZJR19OVU1BKQotCWNoZWNrX3NpYmxpbmdfbWFwcygpOwotI2VuZGlmCiAJLyoKIAkgKiBTZXR1cCBtYXNrIGZvciBjcHVzIHdpdGhvdXQgc3BlY2lhbCBjYXNlIHNjaGVkdWxpbmcgcmVxdWlyZW1lbnRzLgogCSAqIEZvciBub3cgdGhpcyBqdXN0IGV4Y2x1ZGVzIGlzb2xhdGVkIGNwdXMsIGJ1dCBjb3VsZCBiZSB1c2VkIHRvCkBAIC01MDU4LDEwICs1Mzg2LDQ3IEBACiAKIHN0YXRpYyB2b2lkIGFyY2hfZGVzdHJveV9zY2hlZF9kb21haW5zKGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCkKIHsKLQkvKiBEbyBub3RoaW5nOiBldmVyeXRoaW5nIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLiAqLwotfQorI2lmZGVmIENPTkZJR19OVU1BCisJaW50IGk7CisJaW50IGNwdTsKIAotI2VuZGlmIC8qIEFSQ0hfSEFTX1NDSEVEX0RPTUFJTiAqLworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKmNwdV9tYXApIHsKKwkJc3RydWN0IHNjaGVkX2dyb3VwICpzY2hlZF9ncm91cF9hbGxub2RlcworCQkJPSBzY2hlZF9ncm91cF9hbGxub2Rlc19ieWNwdVtjcHVdOworCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKipzY2hlZF9ncm91cF9ub2RlcworCQkJPSBzY2hlZF9ncm91cF9ub2Rlc19ieWNwdVtjcHVdOworCisJCWlmIChzY2hlZF9ncm91cF9hbGxub2RlcykgeworCQkJa2ZyZWUoc2NoZWRfZ3JvdXBfYWxsbm9kZXMpOworCQkJc2NoZWRfZ3JvdXBfYWxsbm9kZXNfYnljcHVbY3B1XSA9IE5VTEw7CisJCX0KKworCQlpZiAoIXNjaGVkX2dyb3VwX25vZGVzKQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7CisJCQljcHVtYXNrX3Qgbm9kZW1hc2sgPSBub2RlX3RvX2NwdW1hc2soaSk7CisJCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKm9sZHNnLCAqc2cgPSBzY2hlZF9ncm91cF9ub2Rlc1tpXTsKKworCQkJY3B1c19hbmQobm9kZW1hc2ssIG5vZGVtYXNrLCAqY3B1X21hcCk7CisJCQlpZiAoY3B1c19lbXB0eShub2RlbWFzaykpCisJCQkJY29udGludWU7CisKKwkJCWlmIChzZyA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJc2cgPSBzZy0+bmV4dDsKK25leHRfc2c6CisJCQlvbGRzZyA9IHNnOworCQkJc2cgPSBzZy0+bmV4dDsKKwkJCWtmcmVlKG9sZHNnKTsKKwkJCWlmIChvbGRzZyAhPSBzY2hlZF9ncm91cF9ub2Rlc1tpXSkKKwkJCQlnb3RvIG5leHRfc2c7CisJCX0KKwkJa2ZyZWUoc2NoZWRfZ3JvdXBfbm9kZXMpOworCQlzY2hlZF9ncm91cF9ub2Rlc19ieWNwdVtjcHVdID0gTlVMTDsKKwl9CisjZW5kaWYKK30KIAogLyoKICAqIERldGFjaCBzY2hlZCBkb21haW5zIGZyb20gYSBncm91cCBvZiBjcHVzIHNwZWNpZmllZCBpbiBjcHVfbWFwCmRpZmYgLS1naXQgYS9rZXJuZWwvc2lnbmFsLmMgYi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggZDI4MmZlYS4uYjkyYzNjOSAxMDA2NDQKLS0tIGEva2VybmVsL3NpZ25hbC5jCisrKyBiL2tlcm5lbC9zaWduYWwuYwpAQCAtNjc4LDcgKzY3OCw3IEBACiAKIC8qIGZvcndhcmQgZGVjbCAqLwogc3RhdGljIHZvaWQgZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAotCQkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpwYXJlbnQsCisJCQkJICAgICBpbnQgdG9fc2VsZiwKIAkJCQkgICAgIGludCB3aHkpOwogCiAvKgpAQCAtNzI5LDE0ICs3MjksNyBAQAogCQkJcC0+c2lnbmFsLT5ncm91cF9zdG9wX2NvdW50ID0gMDsKIAkJCXAtPnNpZ25hbC0+ZmxhZ3MgPSBTSUdOQUxfU1RPUF9DT05USU5VRUQ7CiAJCQlzcGluX3VubG9jaygmcC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCQlpZiAocC0+cHRyYWNlICYgUFRfUFRSQUNFRCkKLQkJCQlkb19ub3RpZnlfcGFyZW50X2NsZHN0b3AocCwgcC0+cGFyZW50LAotCQkJCQkJCSBDTERfU1RPUFBFRCk7Ci0JCQllbHNlCi0JCQkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKAotCQkJCQlwLT5ncm91cF9sZWFkZXIsCi0JCQkJCXAtPmdyb3VwX2xlYWRlci0+cmVhbF9wYXJlbnQsCi0JCQkJCQkJIENMRF9TVE9QUEVEKTsKKwkJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcChwLCAocC0+cHRyYWNlICYgUFRfUFRSQUNFRCksIENMRF9TVE9QUEVEKTsKIAkJCXNwaW5fbG9jaygmcC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJCX0KIAkJcm1fZnJvbV9xdWV1ZShTSUdfS0VSTkVMX1NUT1BfTUFTSywgJnAtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcpOwpAQCAtNzc3LDE0ICs3NzAsNyBAQAogCQkJcC0+c2lnbmFsLT5mbGFncyA9IFNJR05BTF9TVE9QX0NPTlRJTlVFRDsKIAkJCXAtPnNpZ25hbC0+Z3JvdXBfZXhpdF9jb2RlID0gMDsKIAkJCXNwaW5fdW5sb2NrKCZwLT5zaWdoYW5kLT5zaWdsb2NrKTsKLQkJCWlmIChwLT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQotCQkJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcChwLCBwLT5wYXJlbnQsCi0JCQkJCQkJIENMRF9DT05USU5VRUQpOwotCQkJZWxzZQotCQkJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcCgKLQkJCQkJcC0+Z3JvdXBfbGVhZGVyLAotCQkJCQlwLT5ncm91cF9sZWFkZXItPnJlYWxfcGFyZW50LAotCQkJCQkJCSBDTERfQ09OVElOVUVEKTsKKwkJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcChwLCAocC0+cHRyYWNlICYgUFRfUFRSQUNFRCksIENMRF9DT05USU5VRUQpOwogCQkJc3Bpbl9sb2NrKCZwLT5zaWdoYW5kLT5zaWdsb2NrKTsKIAkJfSBlbHNlIHsKIAkJCS8qCkBAIC0xMzgwLDE2ICsxMzY2LDE2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0ID0gMDsKIAotCS8qCi0JICogV2UgbmVlZCB0aGUgdGFza2xpc3QgbG9jayBldmVuIGZvciB0aGUgc3BlY2lmaWMKLQkgKiB0aHJlYWQgY2FzZSAod2hlbiB3ZSBkb24ndCBuZWVkIHRvIGZvbGxvdyB0aGUgZ3JvdXAKLQkgKiBsaXN0cykgaW4gb3JkZXIgdG8gYXZvaWQgcmFjZXMgd2l0aCAicC0+c2lnaGFuZCIKLQkgKiBnb2luZyBhd2F5IG9yIGNoYW5naW5nIGZyb20gdW5kZXIgdXMuCi0JICovCiAJQlVHX09OKCEocS0+ZmxhZ3MgJiBTSUdRVUVVRV9QUkVBTExPQykpOwotCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7ICAKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCisJaWYgKHVubGlrZWx5KHAtPmZsYWdzICYgUEZfRVhJVElORykpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwotCQorCiAJaWYgKHVubGlrZWx5KCFsaXN0X2VtcHR5KCZxLT5saXN0KSkpIHsKIAkJLyoKIAkJICogSWYgYW4gU0lfVElNRVIgZW50cnkgaXMgYWxyZWFkeSBxdWV1ZSBqdXN0IGluY3JlbWVudApAQCAtMTM5OSw3ICsxMzg1LDcgQEAKIAkJCUJVRygpOwogCQlxLT5pbmZvLnNpX292ZXJydW4rKzsKIAkJZ290byBvdXQ7Ci0JfSAKKwl9CiAJLyogU2hvcnQtY2lyY3VpdCBpZ25vcmVkIHNpZ25hbHMuICAqLwogCWlmIChzaWdfaWdub3JlZChwLCBzaWcpKSB7CiAJCXJldCA9IDE7CkBAIC0xNDE0LDggKzE0MDAsMTAgQEAKIAogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKK291dF9lcnI6CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCXJldHVybihyZXQpOworCisJcmV0dXJuIHJldDsKIH0KIAogaW50CkBAIC0xNTQyLDE0ICsxNTMwLDIwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHNpZy0+c2lnbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZAotZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBhcmVudCwKLQkJCSBpbnQgd2h5KQorc3RhdGljIHZvaWQgZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgdG9fc2VsZiwgaW50IHdoeSkKIHsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwYXJlbnQ7CiAJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWdoYW5kOwogCisJaWYgKHRvX3NlbGYpCisJCXBhcmVudCA9IHRzay0+cGFyZW50OworCWVsc2UgeworCQl0c2sgPSB0c2stPmdyb3VwX2xlYWRlcjsKKwkJcGFyZW50ID0gdHNrLT5yZWFsX3BhcmVudDsKKwl9CisKIAlpbmZvLnNpX3NpZ25vID0gU0lHQ0hMRDsKIAlpbmZvLnNpX2Vycm5vID0gMDsKIAlpbmZvLnNpX3BpZCA9IHRzay0+cGlkOwpAQCAtMTYxOCw4ICsxNjEyLDcgQEAKIAkJICAgIShjdXJyZW50LT5wdHJhY2UgJiBQVF9BVFRBQ0hFRCkpICYmCiAJICAgIChsaWtlbHkoY3VycmVudC0+cGFyZW50LT5zaWduYWwgIT0gY3VycmVudC0+c2lnbmFsKSB8fAogCSAgICAgIXVubGlrZWx5KGN1cnJlbnQtPnNpZ25hbC0+ZmxhZ3MgJiBTSUdOQUxfR1JPVVBfRVhJVCkpKSB7Ci0JCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcChjdXJyZW50LCBjdXJyZW50LT5wYXJlbnQsCi0JCQkJCSBDTERfVFJBUFBFRCk7CisJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcChjdXJyZW50LCAxLCBDTERfVFJBUFBFRCk7CiAJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAkJc2NoZWR1bGUoKTsKIAl9IGVsc2UgewpAQCAtMTY2OCwyNSArMTY2MSwyNSBAQAogc3RhdGljIHZvaWQKIGZpbmlzaF9zdG9wKGludCBzdG9wX2NvdW50KQogeworCWludCB0b19zZWxmOworCiAJLyoKIAkgKiBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgdGhyZWFkcyBpbiB0aGUgZ3JvdXAsIG9yIGlmIHRoZXJlIGlzCiAJICogYSBncm91cCBzdG9wIGluIHByb2dyZXNzIGFuZCB3ZSBhcmUgdGhlIGxhc3QgdG8gc3RvcCwKIAkgKiByZXBvcnQgdG8gdGhlIHBhcmVudC4gIFdoZW4gcHRyYWNlZCwgZXZlcnkgdGhyZWFkIHJlcG9ydHMgaXRzZWxmLgogCSAqLwotCWlmIChzdG9wX2NvdW50IDwgMCB8fCAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpIHsKLQkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKGN1cnJlbnQsIGN1cnJlbnQtPnBhcmVudCwKLQkJCQkJIENMRF9TVE9QUEVEKTsKLQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCX0KLQllbHNlIGlmIChzdG9wX2NvdW50ID09IDApIHsKLQkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKGN1cnJlbnQtPmdyb3VwX2xlYWRlciwKLQkJCQkJIGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cmVhbF9wYXJlbnQsCi0JCQkJCSBDTERfU1RPUFBFRCk7Ci0JCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQl9CisJaWYgKHN0b3BfY291bnQgPCAwIHx8IChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkKKwkJdG9fc2VsZiA9IDE7CisJZWxzZSBpZiAoc3RvcF9jb3VudCA9PSAwKQorCQl0b19zZWxmID0gMDsKKwllbHNlCisJCWdvdG8gb3V0OwogCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlkb19ub3RpZnlfcGFyZW50X2NsZHN0b3AoY3VycmVudCwgdG9fc2VsZiwgQ0xEX1NUT1BQRUQpOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworb3V0OgogCXNjaGVkdWxlKCk7CiAJLyoKIAkgKiBOb3cgd2UgZG9uJ3QgcnVuIGFnYWluIHVudGlsIGNvbnRpbnVlZC4KQEAgLTIyMjgsOCArMjIyMSw3IEBACiAJCQlyZWNhbGNfc2lncGVuZGluZygpOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7CiAKIAkJCXRyeV90b19mcmVlemUoKTsKIAkJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRsb2NrdXAuYyBiL2tlcm5lbC9zb2Z0bG9ja3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU5NzYyMAotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9zb2Z0bG9ja3VwLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBEZXRlY3QgU29mdCBMb2NrdXBzCisgKgorICogc3RhcnRlZCBieSBJbmdvIE1vbG5hciwgKEMpIDIwMDUsIFJlZCBIYXQKKyAqCisgKiB0aGlzIGNvZGUgZGV0ZWN0cyBzb2Z0IGxvY2t1cHM6IGluY2lkZW50cyBpbiB3aGVyZSBvbiBhIENQVQorICogdGhlIGtlcm5lbCBkb2VzIG5vdCByZXNjaGVkdWxlIGZvciAxMCBzZWNvbmRzIG9yIG1vcmUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socHJpbnRfbG9jayk7CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCB0aW1lc3RhbXApID0gMDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBwcmludF90aW1lc3RhbXApID0gMDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgd2F0Y2hkb2dfdGFzayk7CisKK3N0YXRpYyBpbnQgZGlkX3BhbmljID0gMDsKK3N0YXRpYyBpbnQgc29mdGxvY2tfcGFuaWMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LAorCQkJCXZvaWQgKnB0cikKK3sKKwlkaWRfcGFuaWMgPSAxOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBhbmljX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsID0gc29mdGxvY2tfcGFuaWMsCit9OworCit2b2lkIHRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2codm9pZCkKK3sKKwlwZXJfY3B1KHRpbWVzdGFtcCwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkgPSBqaWZmaWVzOworfQorRVhQT1JUX1NZTUJPTCh0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKTsKKworLyoKKyAqIFRoaXMgY2FsbGJhY2sgcnVucyBmcm9tIHRoZSB0aW1lciBpbnRlcnJ1cHQsIGFuZCBjaGVja3MKKyAqIHdoZXRoZXIgdGhlIHdhdGNoZG9nIHRocmVhZCBoYXMgaHVuZyBvciBub3Q6CisgKi8KK3ZvaWQgc29mdGxvY2t1cF90aWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCB0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCA9IHBlcl9jcHUodGltZXN0YW1wLCB0aGlzX2NwdSk7CisKKwlpZiAocGVyX2NwdShwcmludF90aW1lc3RhbXAsIHRoaXNfY3B1KSA9PSB0aW1lc3RhbXApCisJCXJldHVybjsKKworCS8qIERvIG5vdCBjYXVzZSBhIHNlY29uZCBwYW5pYyB3aGVuIHRoZXJlIGFscmVhZHkgd2FzIG9uZSAqLworCWlmIChkaWRfcGFuaWMpCisJCXJldHVybjsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVzdGFtcCArIDEwKkhaKSkgeworCQlwZXJfY3B1KHByaW50X3RpbWVzdGFtcCwgdGhpc19jcHUpID0gdGltZXN0YW1wOworCisJCXNwaW5fbG9jaygmcHJpbnRfbG9jayk7CisJCXByaW50ayhLRVJOX0VSUiAiQlVHOiBzb2Z0IGxvY2t1cCBkZXRlY3RlZCBvbiBDUFUjJWQhXG4iLAorCQkJdGhpc19jcHUpOworCQlzaG93X3JlZ3MocmVncyk7CisJCXNwaW5fdW5sb2NrKCZwcmludF9sb2NrKTsKKwl9Cit9CisKKy8qCisgKiBUaGUgd2F0Y2hkb2cgdGhyZWFkIC0gcnVucyBldmVyeSBzZWNvbmQgYW5kIHRvdWNoZXMgdGhlIHRpbWVzdGFtcC4KKyAqLworc3RhdGljIGludCB3YXRjaGRvZyh2b2lkICogX19iaW5kX2NwdSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IDk5IH07CisJaW50IHRoaXNfY3B1ID0gKGxvbmcpIF9fYmluZF9jcHU7CisKKwlwcmludGsoInNvZnRsb2NrdXAgdGhyZWFkICVkIHN0YXJ0ZWQgdXAuXG4iLCB0aGlzX2NwdSk7CisKKwlzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfRklGTywgJnBhcmFtKTsKKwljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkvKgorCSAqIFJ1biBicmllZmx5IG9uY2UgcGVyIHNlY29uZCAtIGlmIHRoaXMgZ2V0cyBkZWxheWVkIGZvcgorCSAqIG1vcmUgdGhhbiAxMCBzZWNvbmRzIHRoZW4gdGhlIGRlYnVnLXByaW50b3V0IHRyaWdnZXJzCisJICogaW4gc29mdGxvY2t1cF90aWNrKCk6CisJICovCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCk7CisJCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDcmVhdGUvZGVzdHJveSB3YXRjaGRvZyB0aHJlYWRzIGFzIENQVXMgY29tZSBhbmQgZ286CisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CitjcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCWludCBob3RjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDUFVfVVBfUFJFUEFSRToKKwkJQlVHX09OKHBlcl9jcHUod2F0Y2hkb2dfdGFzaywgaG90Y3B1KSk7CisJCXAgPSBrdGhyZWFkX2NyZWF0ZSh3YXRjaGRvZywgaGNwdSwgIndhdGNoZG9nLyVkIiwgaG90Y3B1KTsKKwkJaWYgKElTX0VSUihwKSkgeworCQkJcHJpbnRrKCJ3YXRjaGRvZyBmb3IgJWkgZmFpbGVkXG4iLCBob3RjcHUpOworCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisJCX0KKyAgCQlwZXJfY3B1KHdhdGNoZG9nX3Rhc2ssIGhvdGNwdSkgPSBwOworCQlrdGhyZWFkX2JpbmQocCwgaG90Y3B1KTsKKyAJCWJyZWFrOworCWNhc2UgQ1BVX09OTElORToKKworCQl3YWtlX3VwX3Byb2Nlc3MocGVyX2NwdSh3YXRjaGRvZ190YXNrLCBob3RjcHUpKTsKKwkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CisJCS8qIFVuYmluZCBzbyBpdCBjYW4gcnVuLiAgRmFsbCB0aHJ1LiAqLworCQlrdGhyZWFkX2JpbmQocGVyX2NwdSh3YXRjaGRvZ190YXNrLCBob3RjcHUpLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWNhc2UgQ1BVX0RFQUQ6CisJCXAgPSBwZXJfY3B1KHdhdGNoZG9nX3Rhc2ssIGhvdGNwdSk7CisJCXBlcl9jcHUod2F0Y2hkb2dfdGFzaywgaG90Y3B1KSA9IE5VTEw7CisJCWt0aHJlYWRfc3RvcChwKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisgCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fZGV2aW5pdGRhdGEgY3B1X25mYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGNwdV9jYWxsYmFjaworfTsKKworX19pbml0IHZvaWQgc3Bhd25fc29mdGxvY2t1cF90YXNrKHZvaWQpCit7CisJdm9pZCAqY3B1ID0gKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwljcHVfY2FsbGJhY2soJmNwdV9uZmIsIENQVV9VUF9QUkVQQVJFLCBjcHUpOworCWNwdV9jYWxsYmFjaygmY3B1X25mYiwgQ1BVX09OTElORSwgY3B1KTsKKwlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNwdV9uZmIpOworCisJbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZwYW5pY19ibG9jayk7Cit9CisKZGlmZiAtLWdpdCBhL2tlcm5lbC9zcGlubG9jay5jIGIva2VybmVsL3NwaW5sb2NrLmMKaW5kZXggMGMzZjlkOC4uMDM3NWZjZCAxMDA2NDQKLS0tIGEva2VybmVsL3NwaW5sb2NrLmMKKysrIGIva2VybmVsL3NwaW5sb2NrLmMKQEAgLTMsNyArMywxMCBAQAogICoKICAqIEF1dGhvcjogWndhbmUgTXdhaWthbWJvIDx6d2FuZUBmc21sYWJzLmNvbT4KICAqCi0gKiBDb3B5cmlnaHQgKDIwMDQpIEluZ28gTW9sbmFyCisgKiBDb3B5cmlnaHQgKDIwMDQsIDIwMDUpIEluZ28gTW9sbmFyCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzcGlubG9jay9yd2xvY2sgaW1wbGVtZW50YXRpb25zIGZvciB0aGUKKyAqIFNNUCBhbmQgdGhlIERFQlVHX1NQSU5MT0NLIGNhc2VzLiAoVVAtbm9uZGVidWcgaW5saW5lcyB0aGVtKQogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTE3LDEyICsyMCwxMiBAQAogICogR2VuZXJpYyBkZWNsYXJhdGlvbiBvZiB0aGUgcmF3IHJlYWRfdHJ5bG9jaygpIGZ1bmN0aW9uLAogICogYXJjaGl0ZWN0dXJlcyBhcmUgc3VwcG9zZWQgdG8gb3B0aW1pemUgdGhpczoKICAqLwotaW50IF9fbG9ja2Z1bmMgZ2VuZXJpY19yYXdfcmVhZF90cnlsb2NrKHJ3bG9ja190ICpsb2NrKQoraW50IF9fbG9ja2Z1bmMgZ2VuZXJpY19fcmF3X3JlYWRfdHJ5bG9jayhyYXdfcndsb2NrX3QgKmxvY2spCiB7Ci0JX3Jhd19yZWFkX2xvY2sobG9jayk7CisJX19yYXdfcmVhZF9sb2NrKGxvY2spOwogCXJldHVybiAxOwogfQotRVhQT1JUX1NZTUJPTChnZW5lcmljX3Jhd19yZWFkX3RyeWxvY2spOworRVhQT1JUX1NZTUJPTChnZW5lcmljX19yYXdfcmVhZF90cnlsb2NrKTsKIAogaW50IF9fbG9ja2Z1bmMgX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKQogewpAQCAtNTcsNyArNjAsNyBAQAogfQogRVhQT1JUX1NZTUJPTChfd3JpdGVfdHJ5bG9jayk7CiAKLSNpZm5kZWYgQ09ORklHX1BSRUVNUFQKKyNpZiAhZGVmaW5lZChDT05GSUdfUFJFRU1QVCkgfHwgIWRlZmluZWQoQ09ORklHX1NNUCkKIAogdm9pZCBfX2xvY2tmdW5jIF9yZWFkX2xvY2socndsb2NrX3QgKmxvY2spCiB7CkBAIC03Miw3ICs3NSw3IEBACiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpOworCV9yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssICZmbGFncyk7CiAJcmV0dXJuIGZsYWdzOwogfQogRVhQT1JUX1NZTUJPTChfc3Bpbl9sb2NrX2lycXNhdmUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IDBiY2FlZDYuLmM4MDQxMmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTE3MTEsNyArMTcxMSw2IEBACiAJCQkgIHVuc2lnbmVkIGxvbmcgYXJnNCwgdW5zaWduZWQgbG9uZyBhcmc1KQogewogCWxvbmcgZXJyb3I7Ci0JaW50IHNpZzsKIAogCWVycm9yID0gc2VjdXJpdHlfdGFza19wcmN0bChvcHRpb24sIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogCWlmIChlcnJvcikKQEAgLTE3MTksMTIgKzE3MTgsMTEgQEAKIAogCXN3aXRjaCAob3B0aW9uKSB7CiAJCWNhc2UgUFJfU0VUX1BERUFUSFNJRzoKLQkJCXNpZyA9IGFyZzI7Ci0JCQlpZiAoIXZhbGlkX3NpZ25hbChzaWcpKSB7CisJCQlpZiAoIXZhbGlkX3NpZ25hbChhcmcyKSkgewogCQkJCWVycm9yID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWN1cnJlbnQtPnBkZWF0aF9zaWduYWwgPSBzaWc7CisJCQljdXJyZW50LT5wZGVhdGhfc2lnbmFsID0gYXJnMjsKIAkJCWJyZWFrOwogCQljYXNlIFBSX0dFVF9QREVBVEhTSUc6CiAJCQllcnJvciA9IHB1dF91c2VyKGN1cnJlbnQtPnBkZWF0aF9zaWduYWwsIChpbnQgX191c2VyICopYXJnMik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZXIuYyBiL2tlcm5lbC90aW1lci5jCmluZGV4IDUzNzdmNDAuLmY0MTUyZmMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lci5jCisrKyBiL2tlcm5lbC90aW1lci5jCkBAIC05NTAsNiArOTUwLDcgQEAKIHsKIAlqaWZmaWVzXzY0Kys7CiAJdXBkYXRlX3RpbWVzKCk7CisJc29mdGxvY2t1cF90aWNrKHJlZ3MpOwogfQogCiAjaWZkZWYgX19BUkNIX1dBTlRfU1lTX0FMQVJNCkBAIC0xMTUzLDYgKzExNTQsMjAgQEAKIAogRVhQT1JUX1NZTUJPTChzY2hlZHVsZV90aW1lb3V0KTsKIAorc2lnbmVkIGxvbmcgX19zY2hlZCBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKyAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworICAgICAgIHJldHVybiBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworfQorRVhQT1JUX1NZTUJPTChzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUpOworCitzaWduZWQgbG9uZyBfX3NjaGVkIHNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKHNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworICAgICAgIHJldHVybiBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworfQorRVhQT1JUX1NZTUJPTChzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSk7CisKIC8qIFRocmVhZCBJRCAtIHRoZSBpbnRlcm5hbCBrZXJuZWwgInBpZCIgKi8KIGFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0dGlkKHZvaWQpCiB7CkBAIC0xMTY5LDggKzExODQsNyBAQAogCWlmICghdGltZV9hZnRlcihleHBpcmUsIG5vdykpCiAJCXJldHVybiAwOwogCi0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JZXhwaXJlID0gc2NoZWR1bGVfdGltZW91dChleHBpcmUgLSBub3cpOworCWV4cGlyZSA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShleHBpcmUgLSBub3cpOwogCiAJcmV0ID0gMDsKIAlpZiAoZXhwaXJlKSB7CkBAIC0xMTk4LDggKzEyMTIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWV4cGlyZSA9IHRpbWVzcGVjX3RvX2ppZmZpZXMoJnQpICsgKHQudHZfc2VjIHx8IHQudHZfbnNlYyk7Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JZXhwaXJlID0gc2NoZWR1bGVfdGltZW91dChleHBpcmUpOworCWV4cGlyZSA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShleHBpcmUpOwogCiAJcmV0ID0gMDsKIAlpZiAoZXhwaXJlKSB7CkBAIC0xNDI4LDcgKzE0NDEsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB1NjQgdGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIodm9pZCkKK3N0YXRpYyBpbmxpbmUgdTY0IHRpbWVfaW50ZXJwb2xhdG9yX2dldF9jb3VudGVyKGludCB3cml0ZWxvY2spCiB7CiAJdW5zaWduZWQgaW50IHNyYyA9IHRpbWVfaW50ZXJwb2xhdG9yLT5zb3VyY2U7CiAKQEAgLTE0NDIsNiArMTQ1NSwxNSBAQAogCQkJbm93ID0gdGltZV9pbnRlcnBvbGF0b3JfZ2V0X2N5Y2xlcyhzcmMpOwogCQkJaWYgKGxjeWNsZSAmJiB0aW1lX2FmdGVyKGxjeWNsZSwgbm93KSkKIAkJCQlyZXR1cm4gbGN5Y2xlOworCisJCQkvKiBXaGVuIGhvbGRpbmcgdGhlIHh0aW1lIHdyaXRlIGxvY2ssIHRoZXJlJ3Mgbm8gbmVlZAorCQkJICogdG8gYWRkIHRoZSBvdmVyaGVhZCBvZiB0aGUgY21weGNoZy4gIFJlYWRlcnMgYXJlCisJCQkgKiBmb3JjZSB0byByZXRyeSB1bnRpbCB0aGUgd3JpdGUgbG9jayBpcyByZWxlYXNlZC4KKwkJCSAqLworCQkJaWYgKHdyaXRlbG9jaykgeworCQkJCXRpbWVfaW50ZXJwb2xhdG9yLT5sYXN0X2N5Y2xlID0gbm93OworCQkJCXJldHVybiBub3c7CisJCQl9CiAJCQkvKiBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHRpbWVyIHZhbHVlIHJldHVybmVkLiBUaGUgdXNlIG9mIGNtcHhjaGcgaGVyZQogCQkJICogd2lsbCBjYXVzZSBjb250ZW50aW9uIGluIGFuIFNNUCBlbnZpcm9ubWVudC4KIAkJCSAqLwpAQCAtMTQ1NSw3ICsxNDc3LDcgQEAKIHZvaWQgdGltZV9pbnRlcnBvbGF0b3JfcmVzZXQodm9pZCkKIHsKIAl0aW1lX2ludGVycG9sYXRvci0+b2Zmc2V0ID0gMDsKLQl0aW1lX2ludGVycG9sYXRvci0+bGFzdF9jb3VudGVyID0gdGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIoKTsKKwl0aW1lX2ludGVycG9sYXRvci0+bGFzdF9jb3VudGVyID0gdGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIoMSk7CiB9CiAKICNkZWZpbmUgR0VUX1RJX05TRUNTKGNvdW50LGkpICgoKCgoY291bnQpIC0gaS0+bGFzdF9jb3VudGVyKSAmIChpKS0+bWFzaykgKiAoaSktPm5zZWNfcGVyX2N5YykgPj4gKGkpLT5zaGlmdCkKQEAgLTE0NjcsNyArMTQ4OSw3IEBACiAJCXJldHVybiAwOwogCiAJcmV0dXJuIHRpbWVfaW50ZXJwb2xhdG9yLT5vZmZzZXQgKwotCQlHRVRfVElfTlNFQ1ModGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIoKSwgdGltZV9pbnRlcnBvbGF0b3IpOworCQlHRVRfVElfTlNFQ1ModGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIoMCksIHRpbWVfaW50ZXJwb2xhdG9yKTsKIH0KIAogI2RlZmluZSBJTlRFUlBPTEFUT1JfQURKVVNUIDY1NTM2CkBAIC0xNDkwLDcgKzE1MTIsNyBAQAogCSAqIGFuZCB0aGUgdHVuaW5nIGxvZ2ljIGluc3VyZXMgdGhhdC4KICAgICAgICAgICovCiAKLQljb3VudGVyID0gdGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIoKTsKKwljb3VudGVyID0gdGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIoMSk7CiAJb2Zmc2V0ID0gdGltZV9pbnRlcnBvbGF0b3ItPm9mZnNldCArIEdFVF9USV9OU0VDUyhjb3VudGVyLCB0aW1lX2ludGVycG9sYXRvcik7CiAKIAlpZiAoZGVsdGFfbnNlYyA8IDAgfHwgKHVuc2lnbmVkIGxvbmcpIGRlbHRhX25zZWMgPCBvZmZzZXQpCkBAIC0xNTg4LDEwICsxNjEwLDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKG1zZWNzKSArIDE7CiAKLQl3aGlsZSAodGltZW91dCkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotCX0KKwl3aGlsZSAodGltZW91dCkKKwkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKHRpbWVvdXQpOwogfQogCiBFWFBPUlRfU1lNQk9MKG1zbGVlcCk7CkBAIC0xNjA0LDEwICsxNjI0LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKG1zZWNzKSArIDE7CiAKLQl3aGlsZSAodGltZW91dCAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JfQorCXdoaWxlICh0aW1lb3V0ICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lb3V0KTsKIAlyZXR1cm4gamlmZmllc190b19tc2Vjcyh0aW1lb3V0KTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jCmluZGV4IGM3ZTM2ZDQuLjkxYmFjYjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93b3JrcXVldWUuYworKysgYi9rZXJuZWwvd29ya3F1ZXVlLmMKQEAgLTMwOCwxMCArMzA4LDkgQEAKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCi0Jd3EgPSBrbWFsbG9jKHNpemVvZigqd3EpLCBHRlBfS0VSTkVMKTsKKwl3cSA9IGt6YWxsb2Moc2l6ZW9mKCp3cSksIEdGUF9LRVJORUwpOwogCWlmICghd3EpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldCh3cSwgMCwgc2l6ZW9mKCp3cSkpOwogCiAJd3EtPm5hbWUgPSBuYW1lOwogCS8qIFdlIGRvbid0IG5lZWQgdGhlIGRpc3RyYWN0aW9uIG9mIENQVXMgYXBwZWFyaW5nIGFuZCB2YW5pc2hpbmcuICovCkBAIC00OTksNyArNDk4LDcgQEAKIAljYXNlIENQVV9VUF9QUkVQQVJFOgogCQkvKiBDcmVhdGUgYSBuZXcgd29ya3F1ZXVlIHRocmVhZCBmb3IgaXQuICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkod3EsICZ3b3JrcXVldWVzLCBsaXN0KSB7Ci0JCQlpZiAoY3JlYXRlX3dvcmtxdWV1ZV90aHJlYWQod3EsIGhvdGNwdSkgPCAwKSB7CisJCQlpZiAoIWNyZWF0ZV93b3JrcXVldWVfdGhyZWFkKHdxLCBob3RjcHUpKSB7CiAJCQkJcHJpbnRrKCJ3b3JrcXVldWUgZm9yICVpIGZhaWxlZFxuIiwgaG90Y3B1KTsKIAkJCQlyZXR1cm4gTk9USUZZX0JBRDsKIAkJCX0KZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnIGIvbGliL0tjb25maWcKaW5kZXggZTQzMTk3ZS4uM2RlOTMzNSAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcKKysrIGIvbGliL0tjb25maWcKQEAgLTEyLDYgKzEyLDE0IEBACiAJICB0aGUga2VybmVsIHRyZWUgZG9lcy4gU3VjaCBtb2R1bGVzIHRoYXQgdXNlIGxpYnJhcnkgQ1JDLUNDSVRUCiAJICBmdW5jdGlvbnMgcmVxdWlyZSBNIGhlcmUuCiAKK2NvbmZpZyBDUkMxNgorCXRyaXN0YXRlICJDUkMxNiBmdW5jdGlvbnMiCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgcHJvdmlkZWQgZm9yIHRoZSBjYXNlIHdoZXJlIG5vIGluLWtlcm5lbC10cmVlCisJICBtb2R1bGVzIHJlcXVpcmUgQ1JDMTYgZnVuY3Rpb25zLCBidXQgYSBtb2R1bGUgYnVpbHQgb3V0c2lkZQorCSAgdGhlIGtlcm5lbCB0cmVlIGRvZXMuIFN1Y2ggbW9kdWxlcyB0aGF0IHVzZSBsaWJyYXJ5IENSQzE2CisJICBmdW5jdGlvbnMgcmVxdWlyZSBNIGhlcmUuCisKIGNvbmZpZyBDUkMzMgogCXRyaXN0YXRlICJDUkMzMiBmdW5jdGlvbnMiCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnCmluZGV4IDI5OWY3ZjMuLjM3NTRjOWEgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnLmRlYnVnCisrKyBiL2xpYi9LY29uZmlnLmRlYnVnCkBAIC00Niw2ICs0NiwyNSBAQAogCQkgICAgIDEzID0+ICA4IEtCCiAJCSAgICAgMTIgPT4gIDQgS0IKIAorY29uZmlnIERFVEVDVF9TT0ZUTE9DS1VQCisJYm9vbCAiRGV0ZWN0IFNvZnQgTG9ja3VwcyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBrZXJuZWwgdG8gZGV0ZWN0ICJzb2Z0IGxvY2t1cHMiLAorCSAgd2hpY2ggYXJlIGJ1Z3MgdGhhdCBjYXVzZSB0aGUga2VybmVsIHRvIGxvb3AgaW4ga2VybmVsCisJICBtb2RlIGZvciBtb3JlIHRoYW4gMTAgc2Vjb25kcywgd2l0aG91dCBnaXZpbmcgb3RoZXIgdGFza3MgYQorCSAgY2hhbmNlIHRvIHJ1bi4KKworCSAgV2hlbiBhIHNvZnQtbG9ja3VwIGlzIGRldGVjdGVkLCB0aGUga2VybmVsIHdpbGwgcHJpbnQgdGhlCisJICBjdXJyZW50IHN0YWNrIHRyYWNlICh3aGljaCB5b3Ugc2hvdWxkIHJlcG9ydCksIGJ1dCB0aGUKKwkgIHN5c3RlbSB3aWxsIHN0YXkgbG9ja2VkIHVwLiBUaGlzIGZlYXR1cmUgaGFzIG5lZ2xpZ2libGUKKwkgIG92ZXJoZWFkLgorCisJICAoTm90ZSB0aGF0ICJoYXJkIGxvY2t1cHMiIGFyZSBzZXBhcmF0ZSB0eXBlIG9mIGJ1Z3MgdGhhdAorCSAgIGNhbiBiZSBkZXRlY3RlZCB2aWEgdGhlIE5NSS13YXRjaGRvZywgb24gcGxhdGZvcm1zIHRoYXQKKwkgICBzdXBwb3J0IGl0LikKKwogY29uZmlnIFNDSEVEU1RBVFMKIAlib29sICJDb2xsZWN0IHNjaGVkdWxlciBzdGF0aXN0aWNzIgogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFBST0NfRlMKZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCA1MmY4MzM4Li40NGE0Njc1IDEwMDY0NAotLS0gYS9saWIvTWFrZWZpbGUKKysrIGIvbGliL01ha2VmaWxlCkBAIC0xNiwxNyArMTYsMjAgQEAKIENGTEFHU19rb2JqZWN0X3VldmVudC5vICs9IC1EREVCVUcKIGVuZGlmCiAKK29iai0kKENPTkZJR19ERUJVR19TUElOTE9DSykgKz0gc3BpbmxvY2tfZGVidWcubwogbGliLSQoQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0spICs9IHJ3c2VtLXNwaW5sb2NrLm8KIGxpYi0kKENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSkgKz0gcndzZW0ubworbGliLSQoQ09ORklHX1NFTUFQSE9SRV9TTEVFUEVSUykgKz0gc2VtYXBob3JlLXNsZWVwZXJzLm8KIGxpYi0kKENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQpICs9IGZpbmRfbmV4dF9iaXQubwogb2JqLSQoQ09ORklHX0xPQ0tfS0VSTkVMKSArPSBrZXJuZWxfbG9jay5vCiBvYmotJChDT05GSUdfREVCVUdfUFJFRU1QVCkgKz0gc21wX3Byb2Nlc3Nvcl9pZC5vCiAKLWlmbmVxICgkKENPTkZJR19IQVZFX0RFQ19MT0NLKSx5KSAKK2lmbmVxICgkKENPTkZJR19IQVZFX0RFQ19MT0NLKSx5KQogICBsaWIteSArPSBkZWNfYW5kX2xvY2subwogZW5kaWYKIAogb2JqLSQoQ09ORklHX0NSQ19DQ0lUVCkJKz0gY3JjLWNjaXR0Lm8KK29iai0kKENPTkZJR19DUkMxNikJKz0gY3JjMTYubwogb2JqLSQoQ09ORklHX0NSQzMyKQkrPSBjcmMzMi5vCiBvYmotJChDT05GSUdfTElCQ1JDMzJDKQkrPSBsaWJjcmMzMmMubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfSU9NQVApICs9IGlvbWFwLm8KZGlmZiAtLWdpdCBhL2xpYi9jcmMxNi5jIGIvbGliL2NyYzE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExZmU1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcmMxNi5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiAgICAgIGNyYzE2LmMKKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMxNi5oPgorCisvKiogQ1JDIHRhYmxlIGZvciB0aGUgQ1JDLTE2LiBUaGUgcG9seSBpcyAweDgwMDUgKHheMTYgKyB4XjE1ICsgeF4yICsgMSkgKi8KK3UxNiBjb25zdCBjcmMxNl90YWJsZVsyNTZdID0geworCTB4MDAwMCwgMHhDMEMxLCAweEMxODEsIDB4MDE0MCwgMHhDMzAxLCAweDAzQzAsIDB4MDI4MCwgMHhDMjQxLAorCTB4QzYwMSwgMHgwNkMwLCAweDA3ODAsIDB4Qzc0MSwgMHgwNTAwLCAweEM1QzEsIDB4QzQ4MSwgMHgwNDQwLAorCTB4Q0MwMSwgMHgwQ0MwLCAweDBEODAsIDB4Q0Q0MSwgMHgwRjAwLCAweENGQzEsIDB4Q0U4MSwgMHgwRTQwLAorCTB4MEEwMCwgMHhDQUMxLCAweENCODEsIDB4MEI0MCwgMHhDOTAxLCAweDA5QzAsIDB4MDg4MCwgMHhDODQxLAorCTB4RDgwMSwgMHgxOEMwLCAweDE5ODAsIDB4RDk0MSwgMHgxQjAwLCAweERCQzEsIDB4REE4MSwgMHgxQTQwLAorCTB4MUUwMCwgMHhERUMxLCAweERGODEsIDB4MUY0MCwgMHhERDAxLCAweDFEQzAsIDB4MUM4MCwgMHhEQzQxLAorCTB4MTQwMCwgMHhENEMxLCAweEQ1ODEsIDB4MTU0MCwgMHhENzAxLCAweDE3QzAsIDB4MTY4MCwgMHhENjQxLAorCTB4RDIwMSwgMHgxMkMwLCAweDEzODAsIDB4RDM0MSwgMHgxMTAwLCAweEQxQzEsIDB4RDA4MSwgMHgxMDQwLAorCTB4RjAwMSwgMHgzMEMwLCAweDMxODAsIDB4RjE0MSwgMHgzMzAwLCAweEYzQzEsIDB4RjI4MSwgMHgzMjQwLAorCTB4MzYwMCwgMHhGNkMxLCAweEY3ODEsIDB4Mzc0MCwgMHhGNTAxLCAweDM1QzAsIDB4MzQ4MCwgMHhGNDQxLAorCTB4M0MwMCwgMHhGQ0MxLCAweEZEODEsIDB4M0Q0MCwgMHhGRjAxLCAweDNGQzAsIDB4M0U4MCwgMHhGRTQxLAorCTB4RkEwMSwgMHgzQUMwLCAweDNCODAsIDB4RkI0MSwgMHgzOTAwLCAweEY5QzEsIDB4Rjg4MSwgMHgzODQwLAorCTB4MjgwMCwgMHhFOEMxLCAweEU5ODEsIDB4Mjk0MCwgMHhFQjAxLCAweDJCQzAsIDB4MkE4MCwgMHhFQTQxLAorCTB4RUUwMSwgMHgyRUMwLCAweDJGODAsIDB4RUY0MSwgMHgyRDAwLCAweEVEQzEsIDB4RUM4MSwgMHgyQzQwLAorCTB4RTQwMSwgMHgyNEMwLCAweDI1ODAsIDB4RTU0MSwgMHgyNzAwLCAweEU3QzEsIDB4RTY4MSwgMHgyNjQwLAorCTB4MjIwMCwgMHhFMkMxLCAweEUzODEsIDB4MjM0MCwgMHhFMTAxLCAweDIxQzAsIDB4MjA4MCwgMHhFMDQxLAorCTB4QTAwMSwgMHg2MEMwLCAweDYxODAsIDB4QTE0MSwgMHg2MzAwLCAweEEzQzEsIDB4QTI4MSwgMHg2MjQwLAorCTB4NjYwMCwgMHhBNkMxLCAweEE3ODEsIDB4Njc0MCwgMHhBNTAxLCAweDY1QzAsIDB4NjQ4MCwgMHhBNDQxLAorCTB4NkMwMCwgMHhBQ0MxLCAweEFEODEsIDB4NkQ0MCwgMHhBRjAxLCAweDZGQzAsIDB4NkU4MCwgMHhBRTQxLAorCTB4QUEwMSwgMHg2QUMwLCAweDZCODAsIDB4QUI0MSwgMHg2OTAwLCAweEE5QzEsIDB4QTg4MSwgMHg2ODQwLAorCTB4NzgwMCwgMHhCOEMxLCAweEI5ODEsIDB4Nzk0MCwgMHhCQjAxLCAweDdCQzAsIDB4N0E4MCwgMHhCQTQxLAorCTB4QkUwMSwgMHg3RUMwLCAweDdGODAsIDB4QkY0MSwgMHg3RDAwLCAweEJEQzEsIDB4QkM4MSwgMHg3QzQwLAorCTB4QjQwMSwgMHg3NEMwLCAweDc1ODAsIDB4QjU0MSwgMHg3NzAwLCAweEI3QzEsIDB4QjY4MSwgMHg3NjQwLAorCTB4NzIwMCwgMHhCMkMxLCAweEIzODEsIDB4NzM0MCwgMHhCMTAxLCAweDcxQzAsIDB4NzA4MCwgMHhCMDQxLAorCTB4NTAwMCwgMHg5MEMxLCAweDkxODEsIDB4NTE0MCwgMHg5MzAxLCAweDUzQzAsIDB4NTI4MCwgMHg5MjQxLAorCTB4OTYwMSwgMHg1NkMwLCAweDU3ODAsIDB4OTc0MSwgMHg1NTAwLCAweDk1QzEsIDB4OTQ4MSwgMHg1NDQwLAorCTB4OUMwMSwgMHg1Q0MwLCAweDVEODAsIDB4OUQ0MSwgMHg1RjAwLCAweDlGQzEsIDB4OUU4MSwgMHg1RTQwLAorCTB4NUEwMCwgMHg5QUMxLCAweDlCODEsIDB4NUI0MCwgMHg5OTAxLCAweDU5QzAsIDB4NTg4MCwgMHg5ODQxLAorCTB4ODgwMSwgMHg0OEMwLCAweDQ5ODAsIDB4ODk0MSwgMHg0QjAwLCAweDhCQzEsIDB4OEE4MSwgMHg0QTQwLAorCTB4NEUwMCwgMHg4RUMxLCAweDhGODEsIDB4NEY0MCwgMHg4RDAxLCAweDREQzAsIDB4NEM4MCwgMHg4QzQxLAorCTB4NDQwMCwgMHg4NEMxLCAweDg1ODEsIDB4NDU0MCwgMHg4NzAxLCAweDQ3QzAsIDB4NDY4MCwgMHg4NjQxLAorCTB4ODIwMSwgMHg0MkMwLCAweDQzODAsIDB4ODM0MSwgMHg0MTAwLCAweDgxQzEsIDB4ODA4MSwgMHg0MDQwCit9OworRVhQT1JUX1NZTUJPTChjcmMxNl90YWJsZSk7CisKKy8qKgorICogQ29tcHV0ZSB0aGUgQ1JDLTE2IGZvciB0aGUgZGF0YSBidWZmZXIKKyAqCisgKiBAcGFyYW0gY3JjICAgICBwcmV2aW91cyBDUkMgdmFsdWUKKyAqIEBwYXJhbSBidWZmZXIgIGRhdGEgcG9pbnRlcgorICogQHBhcmFtIGxlbiAgICAgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAqIEByZXR1cm4gICAgICAgIHRoZSB1cGRhdGVkIENSQyB2YWx1ZQorICovCit1MTYgY3JjMTYodTE2IGNyYywgdTggY29uc3QgKmJ1ZmZlciwgc2l6ZV90IGxlbikKK3sKKwl3aGlsZSAobGVuLS0pCisJCWNyYyA9IGNyYzE2X2J5dGUoY3JjLCAqYnVmZmVyKyspOworCXJldHVybiBjcmM7Cit9CitFWFBPUlRfU1lNQk9MKGNyYzE2KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDUkMxNiBjYWxjdWxhdGlvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvbGliL2RlY19hbmRfbG9jay5jIGIvbGliL2RlY19hbmRfbG9jay5jCmluZGV4IDY2NThkODEuLjIzNzdhZjAgMTAwNjQ0Ci0tLSBhL2xpYi9kZWNfYW5kX2xvY2suYworKysgYi9saWIvZGVjX2FuZF9sb2NrLmMKQEAgLTI1LDggKzI1LDYgQEAKICAqIHRoaXMgaXMgdHJpdmlhbGx5IGRvbmUgZWZmaWNpZW50bHkgdXNpbmcgYSBsb2FkLWxvY2tlZAogICogc3RvcmUtY29uZGl0aW9uYWwgYXBwcm9hY2gsIGZvciBleGFtcGxlLgogICovCi0KLSNpZm5kZWYgQVRPTUlDX0RFQ19BTkRfTE9DSwogaW50IF9hdG9taWNfZGVjX2FuZF9sb2NrKGF0b21pY190ICphdG9taWMsIHNwaW5sb2NrX3QgKmxvY2spCiB7CiAJc3Bpbl9sb2NrKGxvY2spOwpAQCAtMzcsNCArMzUsMyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKF9hdG9taWNfZGVjX2FuZF9sb2NrKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2tlcm5lbF9sb2NrLmMgYi9saWIva2VybmVsX2xvY2suYwppbmRleCBiZDJiYzVkLi5jYjU0OTBlIDEwMDY0NAotLS0gYS9saWIva2VybmVsX2xvY2suYworKysgYi9saWIva2VybmVsX2xvY2suYwpAQCAtMTc3LDggKzE3Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3VubG9ja19rZXJuZWwodm9pZCkKIHsKLQlfcmF3X3NwaW5fdW5sb2NrKCZrZXJuZWxfZmxhZyk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKKwlzcGluX3VubG9jaygma2VybmVsX2ZsYWcpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbGliL2tsaXN0LmMgYi9saWIva2xpc3QuYwppbmRleCA3MzhhYjgxLi5iYjJmMzU1IDEwMDY0NAotLS0gYS9saWIva2xpc3QuYworKysgYi9saWIva2xpc3QuYwpAQCAtNDIsMTIgKzQyLDIzIEBACiAvKioKICAqCWtsaXN0X2luaXQgLSBJbml0aWFsaXplIGEga2xpc3Qgc3RydWN0dXJlLiAKICAqCUBrOglUaGUga2xpc3Qgd2UncmUgaW5pdGlhbGl6aW5nLgorICoJQGdldDoJVGhlIGdldCBmdW5jdGlvbiBmb3IgdGhlIGVtYmVkZGluZyBvYmplY3QgKE5VTEwgaWYgbm9uZSkKKyAqCUBwdXQ6CVRoZSBwdXQgZnVuY3Rpb24gZm9yIHRoZSBlbWJlZGRpbmcgb2JqZWN0IChOVUxMIGlmIG5vbmUpCisgKgorICogSW5pdGlhbGlzZXMgdGhlIGtsaXN0IHN0cnVjdHVyZS4gIElmIHRoZSBrbGlzdF9ub2RlIHN0cnVjdHVyZXMgYXJlCisgKiBnb2luZyB0byBiZSBlbWJlZGRlZCBpbiByZWZjb3VudGVkIG9iamVjdHMgKG5lY2Vzc2FyeSBmb3Igc2FmZQorICogZGVsZXRpb24pIHRoZW4gdGhlIGdldC9wdXQgYXJndW1lbnRzIGFyZSB1c2VkIHRvIGluaXRpYWxpc2UKKyAqIGZ1bmN0aW9ucyB0aGF0IHRha2UgYW5kIHJlbGVhc2UgcmVmZXJlbmNlcyBvbiB0aGUgZW1iZWRkaW5nCisgKiBvYmplY3RzLgogICovCiAKLXZvaWQga2xpc3RfaW5pdChzdHJ1Y3Qga2xpc3QgKiBrKQordm9pZCBrbGlzdF9pbml0KHN0cnVjdCBrbGlzdCAqIGssIHZvaWQgKCpnZXQpKHN0cnVjdCBrbGlzdF9ub2RlICopLAorCQl2b2lkICgqcHV0KShzdHJ1Y3Qga2xpc3Rfbm9kZSAqKSkKIHsKIAlJTklUX0xJU1RfSEVBRCgmay0+a19saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmay0+a19sb2NrKTsKKwlrLT5nZXQgPSBnZXQ7CisJay0+cHV0ID0gcHV0OwogfQogCiBFWFBPUlRfU1lNQk9MX0dQTChrbGlzdF9pbml0KTsKQEAgLTc0LDE2ICs4NSwxOCBAQAogCWluaXRfY29tcGxldGlvbigmbi0+bl9yZW1vdmVkKTsKIAlrcmVmX2luaXQoJm4tPm5fcmVmKTsKIAluLT5uX2tsaXN0ID0gazsKKwlpZiAoay0+Z2V0KQorCQlrLT5nZXQobik7CiB9CiAKIAogLyoqCiAgKglrbGlzdF9hZGRfaGVhZCAtIEluaXRpYWxpemUgYSBrbGlzdF9ub2RlIGFuZCBhZGQgaXQgdG8gZnJvbnQuCi0gKglAazoJa2xpc3QgaXQncyBnb2luZyBvbi4KICAqCUBuOglub2RlIHdlJ3JlIGFkZGluZy4KKyAqCUBrOglrbGlzdCBpdCdzIGdvaW5nIG9uLgogICovCiAKLXZvaWQga2xpc3RfYWRkX2hlYWQoc3RydWN0IGtsaXN0ICogaywgc3RydWN0IGtsaXN0X25vZGUgKiBuKQordm9pZCBrbGlzdF9hZGRfaGVhZChzdHJ1Y3Qga2xpc3Rfbm9kZSAqIG4sIHN0cnVjdCBrbGlzdCAqIGspCiB7CiAJa2xpc3Rfbm9kZV9pbml0KGssIG4pOwogCWFkZF9oZWFkKGssIG4pOwpAQCAtOTQsMTEgKzEwNywxMSBAQAogCiAvKioKICAqCWtsaXN0X2FkZF90YWlsIC0gSW5pdGlhbGl6ZSBhIGtsaXN0X25vZGUgYW5kIGFkZCBpdCB0byBiYWNrLgotICoJQGs6CWtsaXN0IGl0J3MgZ29pbmcgb24uCiAgKglAbjoJbm9kZSB3ZSdyZSBhZGRpbmcuCisgKglAazoJa2xpc3QgaXQncyBnb2luZyBvbi4KICAqLwogCi12b2lkIGtsaXN0X2FkZF90YWlsKHN0cnVjdCBrbGlzdCAqIGssIHN0cnVjdCBrbGlzdF9ub2RlICogbikKK3ZvaWQga2xpc3RfYWRkX3RhaWwoc3RydWN0IGtsaXN0X25vZGUgKiBuLCBzdHJ1Y3Qga2xpc3QgKiBrKQogewogCWtsaXN0X25vZGVfaW5pdChrLCBuKTsKIAlhZGRfdGFpbChrLCBuKTsKQEAgLTExMCw5ICsxMjMsMTIgQEAKIHN0YXRpYyB2b2lkIGtsaXN0X3JlbGVhc2Uoc3RydWN0IGtyZWYgKiBrcmVmKQogewogCXN0cnVjdCBrbGlzdF9ub2RlICogbiA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3Qga2xpc3Rfbm9kZSwgbl9yZWYpOworCXZvaWQgKCpwdXQpKHN0cnVjdCBrbGlzdF9ub2RlICopID0gbi0+bl9rbGlzdC0+cHV0OwogCWxpc3RfZGVsKCZuLT5uX25vZGUpOwogCWNvbXBsZXRlKCZuLT5uX3JlbW92ZWQpOwogCW4tPm5fa2xpc3QgPSBOVUxMOworCWlmIChwdXQpCisJCXB1dChuKTsKIH0KIAogc3RhdGljIGludCBrbGlzdF9kZWNfYW5kX2RlbChzdHJ1Y3Qga2xpc3Rfbm9kZSAqIG4pCmRpZmYgLS1naXQgYS9saWIvcmFkaXgtdHJlZS5jIGIvbGliL3JhZGl4LXRyZWUuYwppbmRleCAxMGJlZDFjLi42YThiYzZlIDEwMDY0NAotLS0gYS9saWIvcmFkaXgtdHJlZS5jCisrKyBiL2xpYi9yYWRpeC10cmVlLmMKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAxIE1vbWNoaWwgVmVsaWtvdgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAxIENocmlzdG9waCBIZWxsd2lnCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgU0dJLCBDaHJpc3RvcGggTGFtZXRlciA8Y2xhbWV0ZXJAc2dpLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtNTEsNyArNTIsNyBAQAogfTsKIAogc3RydWN0IHJhZGl4X3RyZWVfcGF0aCB7Ci0Jc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwgKipzbG90OworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGU7CiAJaW50IG9mZnNldDsKIH07CiAKQEAgLTEwOSw3ICsxMTAsNyBAQAogICogc3VjY2VzcywgcmV0dXJuIHplcm8sIHdpdGggcHJlZW1wdGlvbiBkaXNhYmxlZC4gIE9uIGVycm9yLCByZXR1cm4gLUVOT01FTQogICogd2l0aCBwcmVlbXB0aW9uIG5vdCBkaXNhYmxlZC4KICAqLwotaW50IHJhZGl4X3RyZWVfcHJlbG9hZChpbnQgZ2ZwX21hc2spCitpbnQgcmFkaXhfdHJlZV9wcmVsb2FkKHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3QgcmFkaXhfdHJlZV9wcmVsb2FkICpydHA7CiAJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKQEAgLTIyNyw3ICsyMjgsNyBAQAogaW50IHJhZGl4X3RyZWVfaW5zZXJ0KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCiAJCQl1bnNpZ25lZCBsb25nIGluZGV4LCB2b2lkICppdGVtKQogewotCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUgPSBOVUxMLCAqdG1wLCAqKnNsb3Q7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSA9IE5VTEwsICpzbG90OwogCXVuc2lnbmVkIGludCBoZWlnaHQsIHNoaWZ0OwogCWludCBvZmZzZXQ7CiAJaW50IGVycm9yOwpAQCAtMjQwLDM4ICsyNDEsNDIgQEAKIAkJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlzbG90ID0gJnJvb3QtPnJub2RlOworCXNsb3QgPSByb290LT5ybm9kZTsKIAloZWlnaHQgPSByb290LT5oZWlnaHQ7CiAJc2hpZnQgPSAoaGVpZ2h0LTEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAKIAlvZmZzZXQgPSAwOwkJCS8qIHVuaW5pdGlhbGlzZWQgdmFyIHdhcm5pbmcgKi8KIAl3aGlsZSAoaGVpZ2h0ID4gMCkgewotCQlpZiAoKnNsb3QgPT0gTlVMTCkgeworCQlpZiAoc2xvdCA9PSBOVUxMKSB7CiAJCQkvKiBIYXZlIHRvIGFkZCBhIGNoaWxkIG5vZGUuICAqLwotCQkJaWYgKCEodG1wID0gcmFkaXhfdHJlZV9ub2RlX2FsbG9jKHJvb3QpKSkKKwkJCWlmICghKHNsb3QgPSByYWRpeF90cmVlX25vZGVfYWxsb2Mocm9vdCkpKQogCQkJCXJldHVybiAtRU5PTUVNOwotCQkJKnNsb3QgPSB0bXA7Ci0JCQlpZiAobm9kZSkKKwkJCWlmIChub2RlKSB7CisJCQkJbm9kZS0+c2xvdHNbb2Zmc2V0XSA9IHNsb3Q7CiAJCQkJbm9kZS0+Y291bnQrKzsKKwkJCX0gZWxzZQorCQkJCXJvb3QtPnJub2RlID0gc2xvdDsKIAkJfQogCiAJCS8qIEdvIGEgbGV2ZWwgZG93biAqLwogCQlvZmZzZXQgPSAoaW5kZXggPj4gc2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKLQkJbm9kZSA9ICpzbG90OwotCQlzbG90ID0gKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKiopKG5vZGUtPnNsb3RzICsgb2Zmc2V0KTsKKwkJbm9kZSA9IHNsb3Q7CisJCXNsb3QgPSBub2RlLT5zbG90c1tvZmZzZXRdOwogCQlzaGlmdCAtPSBSQURJWF9UUkVFX01BUF9TSElGVDsKIAkJaGVpZ2h0LS07CiAJfQogCi0JaWYgKCpzbG90ICE9IE5VTEwpCisJaWYgKHNsb3QgIT0gTlVMTCkKIAkJcmV0dXJuIC1FRVhJU1Q7CisKIAlpZiAobm9kZSkgewogCQlub2RlLT5jb3VudCsrOworCQlub2RlLT5zbG90c1tvZmZzZXRdID0gaXRlbTsKIAkJQlVHX09OKHRhZ19nZXQobm9kZSwgMCwgb2Zmc2V0KSk7CiAJCUJVR19PTih0YWdfZ2V0KG5vZGUsIDEsIG9mZnNldCkpOwotCX0KKwl9IGVsc2UKKwkJcm9vdC0+cm5vZGUgPSBpdGVtOwogCi0JKnNsb3QgPSBpdGVtOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChyYWRpeF90cmVlX2luc2VydCk7CkBAIC0yODYsMjcgKzI5MSwyNSBAQAogdm9pZCAqcmFkaXhfdHJlZV9sb29rdXAoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBpbmRleCkKIHsKIAl1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzaGlmdDsKLQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqc2xvdDsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90OwogCiAJaGVpZ2h0ID0gcm9vdC0+aGVpZ2h0OwogCWlmIChpbmRleCA+IHJhZGl4X3RyZWVfbWF4aW5kZXgoaGVpZ2h0KSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlzaGlmdCA9IChoZWlnaHQtMSkgKiBSQURJWF9UUkVFX01BUF9TSElGVDsKLQlzbG90ID0gJnJvb3QtPnJub2RlOworCXNsb3QgPSByb290LT5ybm9kZTsKIAogCXdoaWxlIChoZWlnaHQgPiAwKSB7Ci0JCWlmICgqc2xvdCA9PSBOVUxMKQorCQlpZiAoc2xvdCA9PSBOVUxMKQogCQkJcmV0dXJuIE5VTEw7CiAKLQkJc2xvdCA9IChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqKQotCQkJKCgqc2xvdCktPnNsb3RzICsKLQkJCQkoKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0spKTsKKwkJc2xvdCA9IHNsb3QtPnNsb3RzWyhpbmRleCA+PiBzaGlmdCkgJiBSQURJWF9UUkVFX01BUF9NQVNLXTsKIAkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAJCWhlaWdodC0tOwogCX0KIAotCXJldHVybiAqc2xvdDsKKwlyZXR1cm4gc2xvdDsKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9sb29rdXApOwogCkBAIC0zMjYsMjcgKzMyOSwyNyBAQAogCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgaW50IHRhZykKIHsKIAl1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzaGlmdDsKLQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqc2xvdDsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90OwogCiAJaGVpZ2h0ID0gcm9vdC0+aGVpZ2h0OwogCWlmIChpbmRleCA+IHJhZGl4X3RyZWVfbWF4aW5kZXgoaGVpZ2h0KSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlzaGlmdCA9IChoZWlnaHQgLSAxKSAqIFJBRElYX1RSRUVfTUFQX1NISUZUOwotCXNsb3QgPSAmcm9vdC0+cm5vZGU7CisJc2xvdCA9IHJvb3QtPnJub2RlOwogCiAJd2hpbGUgKGhlaWdodCA+IDApIHsKIAkJaW50IG9mZnNldDsKIAogCQlvZmZzZXQgPSAoaW5kZXggPj4gc2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKLQkJdGFnX3NldCgqc2xvdCwgdGFnLCBvZmZzZXQpOwotCQlzbG90ID0gKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKiopKCgqc2xvdCktPnNsb3RzICsgb2Zmc2V0KTsKLQkJQlVHX09OKCpzbG90ID09IE5VTEwpOworCQl0YWdfc2V0KHNsb3QsIHRhZywgb2Zmc2V0KTsKKwkJc2xvdCA9IHNsb3QtPnNsb3RzW29mZnNldF07CisJCUJVR19PTihzbG90ID09IE5VTEwpOwogCQlzaGlmdCAtPSBSQURJWF9UUkVFX01BUF9TSElGVDsKIAkJaGVpZ2h0LS07CiAJfQogCi0JcmV0dXJuICpzbG90OworCXJldHVybiBzbG90OwogfQogRVhQT1JUX1NZTUJPTChyYWRpeF90cmVlX3RhZ19zZXQpOwogCkBAIC0zNjcsNiArMzcwLDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIGludCB0YWcpCiB7CiAJc3RydWN0IHJhZGl4X3RyZWVfcGF0aCBwYXRoW1JBRElYX1RSRUVfTUFYX1BBVEhdLCAqcGF0aHAgPSBwYXRoOworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKnNsb3Q7CiAJdW5zaWduZWQgaW50IGhlaWdodCwgc2hpZnQ7CiAJdm9pZCAqcmV0ID0gTlVMTDsKIApAQCAtMzc2LDM4ICszODAsMzcgQEAKIAogCXNoaWZ0ID0gKGhlaWdodCAtIDEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAJcGF0aHAtPm5vZGUgPSBOVUxMOwotCXBhdGhwLT5zbG90ID0gJnJvb3QtPnJub2RlOworCXNsb3QgPSByb290LT5ybm9kZTsKIAogCXdoaWxlIChoZWlnaHQgPiAwKSB7CiAJCWludCBvZmZzZXQ7CiAKLQkJaWYgKCpwYXRocC0+c2xvdCA9PSBOVUxMKQorCQlpZiAoc2xvdCA9PSBOVUxMKQogCQkJZ290byBvdXQ7CiAKIAkJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0s7CiAJCXBhdGhwWzFdLm9mZnNldCA9IG9mZnNldDsKLQkJcGF0aHBbMV0ubm9kZSA9ICpwYXRocFswXS5zbG90OwotCQlwYXRocFsxXS5zbG90ID0gKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKiopCi0JCQkJKHBhdGhwWzFdLm5vZGUtPnNsb3RzICsgb2Zmc2V0KTsKKwkJcGF0aHBbMV0ubm9kZSA9IHNsb3Q7CisJCXNsb3QgPSBzbG90LT5zbG90c1tvZmZzZXRdOwogCQlwYXRocCsrOwogCQlzaGlmdCAtPSBSQURJWF9UUkVFX01BUF9TSElGVDsKIAkJaGVpZ2h0LS07CiAJfQogCi0JcmV0ID0gKnBhdGhwWzBdLnNsb3Q7CisJcmV0ID0gc2xvdDsKIAlpZiAocmV0ID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCiAJZG8gewogCQlpbnQgaWR4OwogCi0JCXRhZ19jbGVhcihwYXRocFswXS5ub2RlLCB0YWcsIHBhdGhwWzBdLm9mZnNldCk7CisJCXRhZ19jbGVhcihwYXRocC0+bm9kZSwgdGFnLCBwYXRocC0+b2Zmc2V0KTsKIAkJZm9yIChpZHggPSAwOyBpZHggPCBSQURJWF9UUkVFX1RBR19MT05HUzsgaWR4KyspIHsKLQkJCWlmIChwYXRocFswXS5ub2RlLT50YWdzW3RhZ11baWR4XSkKKwkJCWlmIChwYXRocC0+bm9kZS0+dGFnc1t0YWddW2lkeF0pCiAJCQkJZ290byBvdXQ7CiAJCX0KIAkJcGF0aHAtLTsKLQl9IHdoaWxlIChwYXRocFswXS5ub2RlKTsKKwl9IHdoaWxlIChwYXRocC0+bm9kZSk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTQxNSwyMSArNDE4LDIyIEBACiAKICNpZm5kZWYgX19LRVJORUxfXwkvKiBPbmx5IHRoZSB0ZXN0IGhhcm5lc3MgdXNlcyB0aGlzIGF0IHByZXNlbnQgKi8KIC8qKgotICoJcmFkaXhfdHJlZV90YWdfZ2V0IC0gZ2V0IGEgdGFnIG9uIGEgcmFkaXggdHJlZSBub2RlCi0gKglAcm9vdDoJCXJhZGl4IHRyZWUgcm9vdAotICoJQGluZGV4OgkJaW5kZXgga2V5Ci0gKglAdGFnOiAJCXRhZyBpbmRleAorICogcmFkaXhfdHJlZV90YWdfZ2V0IC0gZ2V0IGEgdGFnIG9uIGEgcmFkaXggdHJlZSBub2RlCisgKiBAcm9vdDoJCXJhZGl4IHRyZWUgcm9vdAorICogQGluZGV4OgkJaW5kZXgga2V5CisgKiBAdGFnOiAJCXRhZyBpbmRleAogICoKLSAqCVJldHVybiB0aGUgc2VhcmNoIHRhZyBjb3JyZXNwb25naW5nIHRvIEBpbmRleCBpbiB0aGUgcmFkaXggdHJlZS4KKyAqIFJldHVybiB2YWx1ZXM6CiAgKgotICoJUmV0dXJucyB6ZXJvIGlmIHRoZSB0YWcgaXMgdW5zZXQsIG9yIGlmIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgaXRlbQotICoJaW4gdGhlIHRyZWUuCisgKiAgMDogdGFnIG5vdCBwcmVzZW50CisgKiAgMTogdGFnIHByZXNlbnQsIHNldAorICogLTE6IHRhZyBwcmVzZW50LCB1bnNldAogICovCiBpbnQgcmFkaXhfdHJlZV90YWdfZ2V0KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCiAJCQl1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgdGFnKQogewogCXVuc2lnbmVkIGludCBoZWlnaHQsIHNoaWZ0OwotCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKipzbG90OworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKnNsb3Q7CiAJaW50IHNhd191bnNldF90YWcgPSAwOwogCiAJaGVpZ2h0ID0gcm9vdC0+aGVpZ2h0OwpAQCAtNDM3LDEyICs0NDEsMTIgQEAKIAkJcmV0dXJuIDA7CiAKIAlzaGlmdCA9IChoZWlnaHQgLSAxKSAqIFJBRElYX1RSRUVfTUFQX1NISUZUOwotCXNsb3QgPSAmcm9vdC0+cm5vZGU7CisJc2xvdCA9IHJvb3QtPnJub2RlOwogCiAJZm9yICggOyA7ICkgewogCQlpbnQgb2Zmc2V0OwogCi0JCWlmICgqc2xvdCA9PSBOVUxMKQorCQlpZiAoc2xvdCA9PSBOVUxMKQogCQkJcmV0dXJuIDA7CiAKIAkJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0s7CkBAIC00NTEsMTUgKzQ1NSwxNSBAQAogCQkgKiBUaGlzIGlzIGp1c3QgYSBkZWJ1ZyBjaGVjay4gIExhdGVyLCB3ZSBjYW4gYmFsZSBhcyBzb29uIGFzCiAJCSAqIHdlIHNlZSBhbiB1bnNldCB0YWcuCiAJCSAqLwotCQlpZiAoIXRhZ19nZXQoKnNsb3QsIHRhZywgb2Zmc2V0KSkKKwkJaWYgKCF0YWdfZ2V0KHNsb3QsIHRhZywgb2Zmc2V0KSkKIAkJCXNhd191bnNldF90YWcgPSAxOwogCQlpZiAoaGVpZ2h0ID09IDEpIHsKLQkJCWludCByZXQgPSB0YWdfZ2V0KCpzbG90LCB0YWcsIG9mZnNldCk7CisJCQlpbnQgcmV0ID0gdGFnX2dldChzbG90LCB0YWcsIG9mZnNldCk7CiAKIAkJCUJVR19PTihyZXQgJiYgc2F3X3Vuc2V0X3RhZyk7Ci0JCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuIHJldCA/IDEgOiAtMTsKIAkJfQotCQlzbG90ID0gKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKiopKCgqc2xvdCktPnNsb3RzICsgb2Zmc2V0KTsKKwkJc2xvdCA9IHNsb3QtPnNsb3RzW29mZnNldF07CiAJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOwogCQloZWlnaHQtLTsKIAl9CkBAIC00NzIsMTcgKzQ3NiwyMSBAQAogCXVuc2lnbmVkIGludCBtYXhfaXRlbXMsIHVuc2lnbmVkIGxvbmcgKm5leHRfaW5kZXgpCiB7CiAJdW5zaWduZWQgaW50IG5yX2ZvdW5kID0gMDsKLQl1bnNpZ25lZCBpbnQgc2hpZnQ7Ci0JdW5zaWduZWQgaW50IGhlaWdodCA9IHJvb3QtPmhlaWdodDsKKwl1bnNpZ25lZCBpbnQgc2hpZnQsIGhlaWdodDsKIAlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90OworCXVuc2lnbmVkIGxvbmcgaTsKKworCWhlaWdodCA9IHJvb3QtPmhlaWdodDsKKwlpZiAoaGVpZ2h0ID09IDApCisJCWdvdG8gb3V0OwogCiAJc2hpZnQgPSAoaGVpZ2h0LTEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAJc2xvdCA9IHJvb3QtPnJub2RlOwogCi0Jd2hpbGUgKGhlaWdodCA+IDApIHsKLQkJdW5zaWduZWQgbG9uZyBpID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0s7CisJZm9yICggOyBoZWlnaHQgPiAxOyBoZWlnaHQtLSkgewogCi0JCWZvciAoIDsgaSA8IFJBRElYX1RSRUVfTUFQX1NJWkU7IGkrKykgeworCQlmb3IgKGkgPSAoaW5kZXggPj4gc2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTSyA7CisJCQkJaSA8IFJBRElYX1RSRUVfTUFQX1NJWkU7IGkrKykgewogCQkJaWYgKHNsb3QtPnNsb3RzW2ldICE9IE5VTEwpCiAJCQkJYnJlYWs7CiAJCQlpbmRleCAmPSB+KCgxVUwgPDwgc2hpZnQpIC0gMSk7CkBAIC00OTIsMjIgKzUwMCwyMCBAQAogCQl9CiAJCWlmIChpID09IFJBRElYX1RSRUVfTUFQX1NJWkUpCiAJCQlnb3RvIG91dDsKLQkJaGVpZ2h0LS07Ci0JCWlmIChoZWlnaHQgPT0gMCkgewkvKiBCb3R0b20gbGV2ZWw6IGdyYWIgc29tZSBpdGVtcyAqLwotCQkJdW5zaWduZWQgbG9uZyBqID0gaW5kZXggJiBSQURJWF9UUkVFX01BUF9NQVNLOwogCi0JCQlmb3IgKCA7IGogPCBSQURJWF9UUkVFX01BUF9TSVpFOyBqKyspIHsKLQkJCQlpbmRleCsrOwotCQkJCWlmIChzbG90LT5zbG90c1tqXSkgewotCQkJCQlyZXN1bHRzW25yX2ZvdW5kKytdID0gc2xvdC0+c2xvdHNbal07Ci0JCQkJCWlmIChucl9mb3VuZCA9PSBtYXhfaXRlbXMpCi0JCQkJCQlnb3RvIG91dDsKLQkJCQl9Ci0JCQl9Ci0JCX0KIAkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAJCXNsb3QgPSBzbG90LT5zbG90c1tpXTsKIAl9CisKKwkvKiBCb3R0b20gbGV2ZWw6IGdyYWIgc29tZSBpdGVtcyAqLworCWZvciAoaSA9IGluZGV4ICYgUkFESVhfVFJFRV9NQVBfTUFTSzsgaSA8IFJBRElYX1RSRUVfTUFQX1NJWkU7IGkrKykgeworCQlpbmRleCsrOworCQlpZiAoc2xvdC0+c2xvdHNbaV0pIHsKKwkJCXJlc3VsdHNbbnJfZm91bmQrK10gPSBzbG90LT5zbG90c1tpXTsKKwkJCWlmIChucl9mb3VuZCA9PSBtYXhfaXRlbXMpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CiBvdXQ6CiAJKm5leHRfaW5kZXggPSBpbmRleDsKIAlyZXR1cm4gbnJfZm91bmQ7CkBAIC02NTUsNiArNjYxLDcgQEAKIHsKIAlzdHJ1Y3QgcmFkaXhfdHJlZV9wYXRoIHBhdGhbUkFESVhfVFJFRV9NQVhfUEFUSF0sICpwYXRocCA9IHBhdGg7CiAJc3RydWN0IHJhZGl4X3RyZWVfcGF0aCAqb3JpZ19wYXRocDsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90OwogCXVuc2lnbmVkIGludCBoZWlnaHQsIHNoaWZ0OwogCXZvaWQgKnJldCA9IE5VTEw7CiAJY2hhciB0YWdzW1JBRElYX1RSRUVfVEFHU107CkBAIC02NjYsMjUgKzY3MywyMyBAQAogCiAJc2hpZnQgPSAoaGVpZ2h0IC0gMSkgKiBSQURJWF9UUkVFX01BUF9TSElGVDsKIAlwYXRocC0+bm9kZSA9IE5VTEw7Ci0JcGF0aHAtPnNsb3QgPSAmcm9vdC0+cm5vZGU7CisJc2xvdCA9IHJvb3QtPnJub2RlOwogCi0Jd2hpbGUgKGhlaWdodCA+IDApIHsKKwlmb3IgKCA7IGhlaWdodCA+IDA7IGhlaWdodC0tKSB7CiAJCWludCBvZmZzZXQ7CiAKLQkJaWYgKCpwYXRocC0+c2xvdCA9PSBOVUxMKQorCQlpZiAoc2xvdCA9PSBOVUxMKQogCQkJZ290byBvdXQ7CiAKIAkJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0s7CiAJCXBhdGhwWzFdLm9mZnNldCA9IG9mZnNldDsKLQkJcGF0aHBbMV0ubm9kZSA9ICpwYXRocFswXS5zbG90OwotCQlwYXRocFsxXS5zbG90ID0gKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKiopCi0JCQkJKHBhdGhwWzFdLm5vZGUtPnNsb3RzICsgb2Zmc2V0KTsKKwkJcGF0aHBbMV0ubm9kZSA9IHNsb3Q7CisJCXNsb3QgPSBzbG90LT5zbG90c1tvZmZzZXRdOwogCQlwYXRocCsrOwogCQlzaGlmdCAtPSBSQURJWF9UUkVFX01BUF9TSElGVDsKLQkJaGVpZ2h0LS07CiAJfQogCi0JcmV0ID0gKnBhdGhwWzBdLnNsb3Q7CisJcmV0ID0gc2xvdDsKIAlpZiAocmV0ID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCkBAIC03MDQsMTAgKzcwOSwxMCBAQAogCQkJaWYgKHRhZ3NbdGFnXSkKIAkJCQljb250aW51ZTsKIAotCQkJdGFnX2NsZWFyKHBhdGhwWzBdLm5vZGUsIHRhZywgcGF0aHBbMF0ub2Zmc2V0KTsKKwkJCXRhZ19jbGVhcihwYXRocC0+bm9kZSwgdGFnLCBwYXRocC0+b2Zmc2V0KTsKIAogCQkJZm9yIChpZHggPSAwOyBpZHggPCBSQURJWF9UUkVFX1RBR19MT05HUzsgaWR4KyspIHsKLQkJCQlpZiAocGF0aHBbMF0ubm9kZS0+dGFnc1t0YWddW2lkeF0pIHsKKwkJCQlpZiAocGF0aHAtPm5vZGUtPnRhZ3NbdGFnXVtpZHhdKSB7CiAJCQkJCXRhZ3NbdGFnXSA9IDE7CiAJCQkJCW5yX2NsZWFyZWRfdGFncy0tOwogCQkJCQlicmVhazsKQEAgLTcxNSwxOCArNzIwLDE5IEBACiAJCQl9CiAJCX0KIAkJcGF0aHAtLTsKLQl9IHdoaWxlIChwYXRocFswXS5ub2RlICYmIG5yX2NsZWFyZWRfdGFncyk7CisJfSB3aGlsZSAocGF0aHAtPm5vZGUgJiYgbnJfY2xlYXJlZF90YWdzKTsKIAotCXBhdGhwID0gb3JpZ19wYXRocDsKLQkqcGF0aHBbMF0uc2xvdCA9IE5VTEw7Ci0Jd2hpbGUgKHBhdGhwWzBdLm5vZGUgJiYgLS1wYXRocFswXS5ub2RlLT5jb3VudCA9PSAwKSB7Ci0JCXBhdGhwLS07Ci0JCUJVR19PTigqcGF0aHBbMF0uc2xvdCA9PSBOVUxMKTsKLQkJKnBhdGhwWzBdLnNsb3QgPSBOVUxMOwotCQlyYWRpeF90cmVlX25vZGVfZnJlZShwYXRocFsxXS5ub2RlKTsKKwkvKiBOb3cgZnJlZSB0aGUgbm9kZXMgd2UgZG8gbm90IG5lZWQgYW55bW9yZSAqLworCWZvciAocGF0aHAgPSBvcmlnX3BhdGhwOyBwYXRocC0+bm9kZTsgcGF0aHAtLSkgeworCQlwYXRocC0+bm9kZS0+c2xvdHNbcGF0aHAtPm9mZnNldF0gPSBOVUxMOworCQlpZiAoLS1wYXRocC0+bm9kZS0+Y291bnQpCisJCQlnb3RvIG91dDsKKworCQkvKiBOb2RlIHdpdGggemVybyBzbG90cyBpbiB1c2Ugc28gZnJlZSBpdCAqLworCQlyYWRpeF90cmVlX25vZGVfZnJlZShwYXRocC0+bm9kZSk7CiAJfQotCWlmIChyb290LT5ybm9kZSA9PSBOVUxMKQotCQlyb290LT5oZWlnaHQgPSAwOworCXJvb3QtPnJub2RlID0gTlVMTDsKKwlyb290LT5oZWlnaHQgPSAwOwogb3V0OgogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2VtYXBob3JlLmMgYi9saWIvc2VtYXBob3JlLXNsZWVwZXJzLmMKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gYXJjaC94ODZfNjQva2VybmVsL3NlbWFwaG9yZS5jCnJlbmFtZSB0byBsaWIvc2VtYXBob3JlLXNsZWVwZXJzLmMKaW5kZXggNDhmN2MxOC4uNGQ1ZjE4OCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NlbWFwaG9yZS5jCisrKyBiL2xpYi9zZW1hcGhvcmUtc2xlZXBlcnMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiB4ODZfNjQgc2VtYXBob3JlIGltcGxlbWVudGF0aW9uLgorICogaTM4NiBhbmQgeDg2LTY0IHNlbWFwaG9yZSBpbXBsZW1lbnRhdGlvbi4KICAqCiAgKiAoQykgQ29weXJpZ2h0IDE5OTkgTGludXMgVG9ydmFsZHMKICAqCkBAIC0xNCw5ICsxNCw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLQogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KIAogLyoKQEAgLTUwLDEyICs0OSwxMiBAQAogICogICAgd2UgY2Fubm90IGxvc2Ugd2FrZXVwIGV2ZW50cy4KICAqLwogCi12b2lkIF9fdXAoc3RydWN0IHNlbWFwaG9yZSAqc2VtKQorZmFzdGNhbGwgdm9pZCBfX3VwKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKIHsKIAl3YWtlX3VwKCZzZW0tPndhaXQpOwogfQogCi12b2lkIF9fc2NoZWQgX19kb3duKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCitmYXN0Y2FsbCB2b2lkIF9fc2NoZWQgX19kb3duKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CkBAIC05Miw3ICs5MSw3IEBACiAJdHNrLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKIH0KIAotaW50IF9fc2NoZWQgX19kb3duX2ludGVycnVwdGlibGUoc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK2Zhc3RjYWxsIGludCBfX3NjaGVkIF9fZG93bl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCiB7CiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwpAQCAtMTU1LDcgKzE1NCw3IEBACiAgKiBzaW5nbGUgImNtcHhjaGciIHdpdGhvdXQgZmFpbHVyZSBjYXNlcywKICAqIGJ1dCB0aGVuIGl0IHdvdWxkbid0IHdvcmsgb24gYSAzODYuCiAgKi8KLWludCBfX2Rvd25fdHJ5bG9jayhzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQorZmFzdGNhbGwgaW50IF9fZG93bl90cnlsb2NrKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCiB7CiAJaW50IHNsZWVwZXJzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xNzYsNSArMTc1LDMgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOwogCXJldHVybiAxOwogfQotCi0KZGlmZiAtLWdpdCBhL2xpYi9zb3J0LmMgYi9saWIvc29ydC5jCmluZGV4IGI3M2RiYjAuLmRkYzRkMzUgMTAwNjQ0Ci0tLSBhL2xpYi9zb3J0LmMKKysrIGIvbGliL3NvcnQuYwpAQCAtNiwxNSArNiwxNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc29ydC5oPgogCi12b2lkIHUzMl9zd2FwKHZvaWQgKmEsIHZvaWQgKmIsIGludCBzaXplKQorc3RhdGljIHZvaWQgdTMyX3N3YXAodm9pZCAqYSwgdm9pZCAqYiwgaW50IHNpemUpCiB7CiAJdTMyIHQgPSAqKHUzMiAqKWE7CiAJKih1MzIgKilhID0gKih1MzIgKiliOwogCSoodTMyICopYiA9IHQ7CiB9CiAKLXZvaWQgZ2VuZXJpY19zd2FwKHZvaWQgKmEsIHZvaWQgKmIsIGludCBzaXplKQorc3RhdGljIHZvaWQgZ2VuZXJpY19zd2FwKHZvaWQgKmEsIHZvaWQgKmIsIGludCBzaXplKQogewogCWNoYXIgdDsKIApkaWZmIC0tZ2l0IGEvbGliL3NwaW5sb2NrX2RlYnVnLmMgYi9saWIvc3BpbmxvY2tfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDZhZDEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3NwaW5sb2NrX2RlYnVnLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3BpbmxvY2svcndsb2NrIGltcGxlbWVudGF0aW9ucyBmb3IKKyAqIERFQlVHX1NQSU5MT0NLLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKK3N0YXRpYyB2b2lkIHNwaW5fYnVnKHNwaW5sb2NrX3QgKmxvY2ssIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlzdGF0aWMgbG9uZyBwcmludF9vbmNlID0gMTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyID0gTlVMTDsKKworCWlmICh4Y2hnKCZwcmludF9vbmNlLCAwKSkgeworCQlpZiAobG9jay0+b3duZXIgJiYgbG9jay0+b3duZXIgIT0gU1BJTkxPQ0tfT1dORVJfSU5JVCkKKwkJCW93bmVyID0gbG9jay0+b3duZXI7CisJCXByaW50aygiQlVHOiBzcGlubG9jayAlcyBvbiBDUFUjJWQsICVzLyVkXG4iLAorCQkJbXNnLCBzbXBfcHJvY2Vzc29yX2lkKCksIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCk7CisJCXByaW50aygiIGxvY2s6ICVwLCAubWFnaWM6ICUwOHgsIC5vd25lcjogJXMvJWQsIC5vd25lcl9jcHU6ICVkXG4iLAorCQkJbG9jaywgbG9jay0+bWFnaWMsCisJCQlvd25lciA/IG93bmVyLT5jb21tIDogIjxub25lPiIsCisJCQlvd25lciA/IG93bmVyLT5waWQgOiAtMSwKKwkJCWxvY2stPm93bmVyX2NwdSk7CisJCWR1bXBfc3RhY2soKTsKKyNpZmRlZiBDT05GSUdfU01QCisJCS8qCisJCSAqIFdlIGNhbm5vdCBjb250aW51ZSBvbiBTTVA6CisJCSAqLworLy8JCXBhbmljKCJiYWQgbG9ja2luZyIpOworI2VuZGlmCisJfQorfQorCisjZGVmaW5lIFNQSU5fQlVHX09OKGNvbmQsIGxvY2ssIG1zZykgaWYgKHVubGlrZWx5KGNvbmQpKSBzcGluX2J1Zyhsb2NrLCBtc2cpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19zcGluX2xvY2tfYmVmb3JlKHNwaW5sb2NrX3QgKmxvY2spCit7CisJU1BJTl9CVUdfT04obG9jay0+bWFnaWMgIT0gU1BJTkxPQ0tfTUFHSUMsIGxvY2ssICJiYWQgbWFnaWMiKTsKKwlTUElOX0JVR19PTihsb2NrLT5vd25lciA9PSBjdXJyZW50LCBsb2NrLCAicmVjdXJzaW9uIik7CisJU1BJTl9CVUdfT04obG9jay0+b3duZXJfY3B1ID09IHJhd19zbXBfcHJvY2Vzc29yX2lkKCksCisJCQkJCQkJbG9jaywgImNwdSByZWN1cnNpb24iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3NwaW5fbG9ja19hZnRlcihzcGlubG9ja190ICpsb2NrKQoreworCWxvY2stPm93bmVyX2NwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisJbG9jay0+b3duZXIgPSBjdXJyZW50OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlTUElOX0JVR19PTihsb2NrLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQywgbG9jaywgImJhZCBtYWdpYyIpOworCVNQSU5fQlVHX09OKCFzcGluX2lzX2xvY2tlZChsb2NrKSwgbG9jaywgImFscmVhZHkgdW5sb2NrZWQiKTsKKwlTUElOX0JVR19PTihsb2NrLT5vd25lciAhPSBjdXJyZW50LCBsb2NrLCAid3Jvbmcgb3duZXIiKTsKKwlTUElOX0JVR19PTihsb2NrLT5vd25lcl9jcHUgIT0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSwKKwkJCQkJCQlsb2NrLCAid3JvbmcgQ1BVIik7CisJbG9jay0+b3duZXIgPSBTUElOTE9DS19PV05FUl9JTklUOworCWxvY2stPm93bmVyX2NwdSA9IC0xOworfQorCitzdGF0aWMgdm9pZCBfX3NwaW5fbG9ja19kZWJ1ZyhzcGlubG9ja190ICpsb2NrKQoreworCWludCBwcmludF9vbmNlID0gMTsKKwl1NjQgaTsKKworCWZvciAoOzspIHsKKwkJZm9yIChpID0gMDsgaSA8IGxvb3BzX3Blcl9qaWZmeSAqIEhaOyBpKyspIHsKKwkJCWNwdV9yZWxheCgpOworCQkJaWYgKF9fcmF3X3NwaW5fdHJ5bG9jaygmbG9jay0+cmF3X2xvY2spKQorCQkJCXJldHVybjsKKwkJfQorCQkvKiBsb2NrdXAgc3VzcGVjdGVkOiAqLworCQlpZiAocHJpbnRfb25jZSkgeworCQkJcHJpbnRfb25jZSA9IDA7CisJCQlwcmludGsoIkJVRzogc3BpbmxvY2sgbG9ja3VwIG9uIENQVSMlZCwgJXMvJWQsICVwXG4iLAorCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAorCQkJCQlsb2NrKTsKKwkJCWR1bXBfc3RhY2soKTsKKwkJfQorCX0KK30KKwordm9pZCBfcmF3X3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrKQoreworCWRlYnVnX3NwaW5fbG9ja19iZWZvcmUobG9jayk7CisJaWYgKHVubGlrZWx5KCFfX3Jhd19zcGluX3RyeWxvY2soJmxvY2stPnJhd19sb2NrKSkpCisJCV9fc3Bpbl9sb2NrX2RlYnVnKGxvY2spOworCWRlYnVnX3NwaW5fbG9ja19hZnRlcihsb2NrKTsKK30KKworaW50IF9yYXdfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2spCit7CisJaW50IHJldCA9IF9fcmF3X3NwaW5fdHJ5bG9jaygmbG9jay0+cmF3X2xvY2spOworCisJaWYgKHJldCkKKwkJZGVidWdfc3Bpbl9sb2NrX2FmdGVyKGxvY2spOworI2lmbmRlZiBDT05GSUdfU01QCisJLyoKKwkgKiBNdXN0IG5vdCBoYXBwZW4gb24gVVA6CisJICovCisJU1BJTl9CVUdfT04oIXJldCwgbG9jaywgInRyeWxvY2sgZmFpbHVyZSBvbiBVUCIpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCit7CisJZGVidWdfc3Bpbl91bmxvY2sobG9jayk7CisJX19yYXdfc3Bpbl91bmxvY2soJmxvY2stPnJhd19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcndsb2NrX2J1Zyhyd2xvY2tfdCAqbG9jaywgY29uc3QgY2hhciAqbXNnKQoreworCXN0YXRpYyBsb25nIHByaW50X29uY2UgPSAxOworCisJaWYgKHhjaGcoJnByaW50X29uY2UsIDApKSB7CisJCXByaW50aygiQlVHOiByd2xvY2sgJXMgb24gQ1BVIyVkLCAlcy8lZCwgJXBcbiIsIG1zZywKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBsb2NrKTsKKwkJZHVtcF9zdGFjaygpOworI2lmZGVmIENPTkZJR19TTVAKKwkJLyoKKwkJICogV2UgY2Fubm90IGNvbnRpbnVlIG9uIFNNUDoKKwkJICovCisJCXBhbmljKCJiYWQgbG9ja2luZyIpOworI2VuZGlmCisJfQorfQorCisjZGVmaW5lIFJXTE9DS19CVUdfT04oY29uZCwgbG9jaywgbXNnKSBpZiAodW5saWtlbHkoY29uZCkpIHJ3bG9ja19idWcobG9jaywgbXNnKQorCitzdGF0aWMgdm9pZCBfX3JlYWRfbG9ja19kZWJ1Zyhyd2xvY2tfdCAqbG9jaykKK3sKKwlpbnQgcHJpbnRfb25jZSA9IDE7CisJdTY0IGk7CisKKwlmb3IgKDs7KSB7CisJCWZvciAoaSA9IDA7IGkgPCBsb29wc19wZXJfamlmZnkgKiBIWjsgaSsrKSB7CisJCQljcHVfcmVsYXgoKTsKKwkJCWlmIChfX3Jhd19yZWFkX3RyeWxvY2soJmxvY2stPnJhd19sb2NrKSkKKwkJCQlyZXR1cm47CisJCX0KKwkJLyogbG9ja3VwIHN1c3BlY3RlZDogKi8KKwkJaWYgKHByaW50X29uY2UpIHsKKwkJCXByaW50X29uY2UgPSAwOworCQkJcHJpbnRrKCJCVUc6IHJlYWQtbG9jayBsb2NrdXAgb24gQ1BVIyVkLCAlcy8lZCwgJXBcbiIsCisJCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCisJCQkJCWxvY2spOworCQkJZHVtcF9zdGFjaygpOworCQl9CisJfQorfQorCit2b2lkIF9yYXdfcmVhZF9sb2NrKHJ3bG9ja190ICpsb2NrKQoreworCVJXTE9DS19CVUdfT04obG9jay0+bWFnaWMgIT0gUldMT0NLX01BR0lDLCBsb2NrLCAiYmFkIG1hZ2ljIik7CisJaWYgKHVubGlrZWx5KCFfX3Jhd19yZWFkX3RyeWxvY2soJmxvY2stPnJhd19sb2NrKSkpCisJCV9fcmVhZF9sb2NrX2RlYnVnKGxvY2spOworfQorCitpbnQgX3Jhd19yZWFkX3RyeWxvY2socndsb2NrX3QgKmxvY2spCit7CisJaW50IHJldCA9IF9fcmF3X3JlYWRfdHJ5bG9jaygmbG9jay0+cmF3X2xvY2spOworCisjaWZuZGVmIENPTkZJR19TTVAKKwkvKgorCSAqIE11c3Qgbm90IGhhcHBlbiBvbiBVUDoKKwkgKi8KKwlSV0xPQ0tfQlVHX09OKCFyZXQsIGxvY2ssICJ0cnlsb2NrIGZhaWx1cmUgb24gVVAiKTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgX3Jhd19yZWFkX3VubG9jayhyd2xvY2tfdCAqbG9jaykKK3sKKwlSV0xPQ0tfQlVHX09OKGxvY2stPm1hZ2ljICE9IFJXTE9DS19NQUdJQywgbG9jaywgImJhZCBtYWdpYyIpOworCV9fcmF3X3JlYWRfdW5sb2NrKCZsb2NrLT5yYXdfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z193cml0ZV9sb2NrX2JlZm9yZShyd2xvY2tfdCAqbG9jaykKK3sKKwlSV0xPQ0tfQlVHX09OKGxvY2stPm1hZ2ljICE9IFJXTE9DS19NQUdJQywgbG9jaywgImJhZCBtYWdpYyIpOworCVJXTE9DS19CVUdfT04obG9jay0+b3duZXIgPT0gY3VycmVudCwgbG9jaywgInJlY3Vyc2lvbiIpOworCVJXTE9DS19CVUdfT04obG9jay0+b3duZXJfY3B1ID09IHJhd19zbXBfcHJvY2Vzc29yX2lkKCksCisJCQkJCQkJbG9jaywgImNwdSByZWN1cnNpb24iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3dyaXRlX2xvY2tfYWZ0ZXIocndsb2NrX3QgKmxvY2spCit7CisJbG9jay0+b3duZXJfY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwlsb2NrLT5vd25lciA9IGN1cnJlbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z193cml0ZV91bmxvY2socndsb2NrX3QgKmxvY2spCit7CisJUldMT0NLX0JVR19PTihsb2NrLT5tYWdpYyAhPSBSV0xPQ0tfTUFHSUMsIGxvY2ssICJiYWQgbWFnaWMiKTsKKwlSV0xPQ0tfQlVHX09OKGxvY2stPm93bmVyICE9IGN1cnJlbnQsIGxvY2ssICJ3cm9uZyBvd25lciIpOworCVJXTE9DS19CVUdfT04obG9jay0+b3duZXJfY3B1ICE9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCksCisJCQkJCQkJbG9jaywgIndyb25nIENQVSIpOworCWxvY2stPm93bmVyID0gU1BJTkxPQ0tfT1dORVJfSU5JVDsKKwlsb2NrLT5vd25lcl9jcHUgPSAtMTsKK30KKworc3RhdGljIHZvaWQgX193cml0ZV9sb2NrX2RlYnVnKHJ3bG9ja190ICpsb2NrKQoreworCWludCBwcmludF9vbmNlID0gMTsKKwl1NjQgaTsKKworCWZvciAoOzspIHsKKwkJZm9yIChpID0gMDsgaSA8IGxvb3BzX3Blcl9qaWZmeSAqIEhaOyBpKyspIHsKKwkJCWNwdV9yZWxheCgpOworCQkJaWYgKF9fcmF3X3dyaXRlX3RyeWxvY2soJmxvY2stPnJhd19sb2NrKSkKKwkJCQlyZXR1cm47CisJCX0KKwkJLyogbG9ja3VwIHN1c3BlY3RlZDogKi8KKwkJaWYgKHByaW50X29uY2UpIHsKKwkJCXByaW50X29uY2UgPSAwOworCQkJcHJpbnRrKCJCVUc6IHdyaXRlLWxvY2sgbG9ja3VwIG9uIENQVSMlZCwgJXMvJWQsICVwXG4iLAorCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAorCQkJCQlsb2NrKTsKKwkJCWR1bXBfc3RhY2soKTsKKwkJfQorCX0KK30KKwordm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKmxvY2spCit7CisJZGVidWdfd3JpdGVfbG9ja19iZWZvcmUobG9jayk7CisJaWYgKHVubGlrZWx5KCFfX3Jhd193cml0ZV90cnlsb2NrKCZsb2NrLT5yYXdfbG9jaykpKQorCQlfX3dyaXRlX2xvY2tfZGVidWcobG9jayk7CisJZGVidWdfd3JpdGVfbG9ja19hZnRlcihsb2NrKTsKK30KKworaW50IF9yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqbG9jaykKK3sKKwlpbnQgcmV0ID0gX19yYXdfd3JpdGVfdHJ5bG9jaygmbG9jay0+cmF3X2xvY2spOworCisJaWYgKHJldCkKKwkJZGVidWdfd3JpdGVfbG9ja19hZnRlcihsb2NrKTsKKyNpZm5kZWYgQ09ORklHX1NNUAorCS8qCisJICogTXVzdCBub3QgaGFwcGVuIG9uIFVQOgorCSAqLworCVJXTE9DS19CVUdfT04oIXJldCwgbG9jaywgInRyeWxvY2sgZmFpbHVyZSBvbiBVUCIpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBfcmF3X3dyaXRlX3VubG9jayhyd2xvY2tfdCAqbG9jaykKK3sKKwlkZWJ1Z193cml0ZV91bmxvY2sobG9jayk7CisJX19yYXdfd3JpdGVfdW5sb2NrKCZsb2NrLT5yYXdfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9tbS9LY29uZmlnIGIvbW0vS2NvbmZpZwppbmRleCBjZDM3OTkzLi40ZTk5MzdhIDEwMDY0NAotLS0gYS9tbS9LY29uZmlnCisrKyBiL21tL0tjb25maWcKQEAgLTg5LDMgKzg5LDI1IEBACiBjb25maWcgSEFWRV9NRU1PUllfUFJFU0VOVAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIEFSQ0hfSEFWRV9NRU1PUllfUFJFU0VOVCB8fCBTUEFSU0VNRU0KKworIworIyBTUEFSU0VNRU1fRVhUUkVNRSAod2hpY2ggaXMgdGhlIGRlZmF1bHQpIGRvZXMgc29tZSBib290bWVtCisjIGFsbG9jYXRpb25zIHdoZW4gbWVtb3J5X3ByZXNlbnQoKSBpcyBjYWxsZWQuICBJZiB0aGlzIGNhbiBub3QKKyMgYmUgZG9uZSBvbiB5b3VyIGFyY2hpdGVjdHVyZSwgc2VsZWN0IHRoaXMgb3B0aW9uLiAgSG93ZXZlciwKKyMgc3RhdGljYWxseSBhbGxvY2F0aW5nIHRoZSBtZW1fc2VjdGlvbltdIGFycmF5IGNhbiBwb3RlbnRpYWxseQorIyBjb25zdW1lIHZhc3QgcXVhbnRpdGllcyBvZiAuYnNzLCBzbyBiZSBjYXJlZnVsLgorIworIyBUaGlzIG9wdGlvbiB3aWxsIGFsc28gcG90ZW50aWFsbHkgcHJvZHVjZSBzbWFsbGVyIHJ1bnRpbWUgY29kZQorIyB3aXRoIGdjYyAzLjQgYW5kIGxhdGVyLgorIworY29uZmlnIFNQQVJTRU1FTV9TVEFUSUMKKwlkZWZfYm9vbCBuCisKKyMKKyMgQXJjaGl0ZWN0ZWN0dXJlIHBsYXRmb3JtcyB3aGljaCByZXF1aXJlIGEgdHdvIGxldmVsIG1lbV9zZWN0aW9uIGluIFNQQVJTRU1FTQorIyBtdXN0IHNlbGVjdCB0aGlzIG9wdGlvbi4gVGhpcyBpcyB1c3VhbGx5IGZvciBhcmNoaXRlY3R1cmUgcGxhdGZvcm1zIHdpdGgKKyMgYW4gZXh0cmVtZWx5IHNwYXJzZSBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlLgorIworY29uZmlnIFNQQVJTRU1FTV9FWFRSRU1FCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gU1BBUlNFTUVNICYmICFTUEFSU0VNRU1fU1RBVElDCmRpZmYgLS1naXQgYS9tbS9maWxlbWFwLmMgYi9tbS9maWxlbWFwLmMKaW5kZXggYzExNDE4ZC4uYjUzNDY1NyAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcC5jCisrKyBiL21tL2ZpbGVtYXAuYwpAQCAtMzcsNiArMzcsMTAgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9tbWFuLmg+CiAKK3N0YXRpYyBzc2l6ZV90CitnZW5lcmljX2ZpbGVfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwlsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpOworCiAvKgogICogU2hhcmVkIG1hcHBpbmdzIGltcGxlbWVudGVkIDMwLjExLjE5OTQuIEl0J3Mgbm90IGZ1bGx5IHdvcmtpbmcgeWV0LAogICogdGhvdWdoLgpAQCAtNTQsOSArNTgsOCBAQAogICoKICAqICAtPmlfbW1hcF9sb2NrCQkodm10cnVuY2F0ZSkKICAqICAgIC0+cHJpdmF0ZV9sb2NrCQkoX19mcmVlX3B0ZS0+X19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKQotICogICAgICAtPnN3YXBfbGlzdF9sb2NrCi0gKiAgICAgICAgLT5zd2FwX2RldmljZV9sb2NrCShleGNsdXNpdmVfc3dhcF9wYWdlLCBvdGhlcnMpCi0gKiAgICAgICAgICAtPm1hcHBpbmctPnRyZWVfbG9jaworICogICAgICAtPnN3YXBfbG9jawkJKGV4Y2x1c2l2ZV9zd2FwX3BhZ2UsIG90aGVycykKKyAqICAgICAgICAtPm1hcHBpbmctPnRyZWVfbG9jawogICoKICAqICAtPmlfc2VtCiAgKiAgICAtPmlfbW1hcF9sb2NrCQkodHJ1bmNhdGUtPnVubWFwX21hcHBpbmdfcmFuZ2UpCkBAIC04Niw3ICs4OSw3IEBACiAgKiAgICAtPnBhZ2VfdGFibGVfbG9jawkJKGFub25fdm1hX3ByZXBhcmUgYW5kIHZhcmlvdXMpCiAgKgogICogIC0+cGFnZV90YWJsZV9sb2NrCi0gKiAgICAtPnN3YXBfZGV2aWNlX2xvY2sJKHRyeV90b191bm1hcF9vbmUpCisgKiAgICAtPnN3YXBfbG9jawkJKHRyeV90b191bm1hcF9vbmUpCiAgKiAgICAtPnByaXZhdGVfbG9jawkJKHRyeV90b191bm1hcF9vbmUpCiAgKiAgICAtPnRyZWVfbG9jawkJKHRyeV90b191bm1hcF9vbmUpCiAgKiAgICAtPnpvbmUubHJ1X2xvY2sJCShmb2xsb3dfcGFnZS0+bWFya19wYWdlX2FjY2Vzc2VkKQpAQCAtMzAyLDggKzMwNSw5IEBACiAgKiBhcyBpdCBmb3JjZXMgT19TWU5DIHdyaXRlcnMgdG8gZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBzYW1lIGZpbGUKICAqIHRvIGJlIHNlcmlhbGlzZWQgcmlnaHQgdW50aWwgaW8gY29tcGxldGlvbi4KICAqLwotaW50IHN5bmNfcGFnZV9yYW5nZV9ub2xvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQlsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IHN5bmNfcGFnZV9yYW5nZV9ub2xvY2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCSAgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQogewogCXBnb2ZmX3Qgc3RhcnQgPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlwZ29mZl90IGVuZCA9IChwb3MgKyBjb3VudCAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CkBAIC0zMTgsNyArMzIyLDYgQEAKIAkJcmV0ID0gd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZShtYXBwaW5nLCBzdGFydCwgZW5kKTsKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChzeW5jX3BhZ2VfcmFuZ2Vfbm9sb2NrKTsKIAogLyoqCiAgKiBmaWxlbWFwX2ZkYXRhd2FpdCAtIHdhbGsgdGhlIGxpc3Qgb2YgdW5kZXItd3JpdGViYWNrIHBhZ2VzIG9mIHRoZSBnaXZlbgpAQCAtMTUwNSw4ICsxNTA4LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJcGFnZSA9IGZpbGVtYXBfZ2V0cGFnZShmaWxlLCBwZ29mZiwgbm9uYmxvY2spOworCisJLyogWFhYOiBUaGlzIGlzIHdyb25nLCBhIGZpbGVzeXN0ZW0gSS9PIGVycm9yIG1heSBoYXZlIGhhcHBlbmVkLiBGaXggdGhhdCBhcworCSAqIGRvbmUgaW4gc2htZW1fcG9wdWxhdGUgY2FsbGluZyBzaG1lbV9nZXRwYWdlICovCiAJaWYgKCFwYWdlICYmICFub25ibG9jaykKIAkJcmV0dXJuIC1FTk9NRU07CisKIAlpZiAocGFnZSkgewogCQllcnIgPSBpbnN0YWxsX3BhZ2UobW0sIHZtYSwgYWRkciwgcGFnZSwgcHJvdCk7CiAJCWlmIChlcnIpIHsKQEAgLTE1MTQsNiArMTUyMSw5IEBACiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfSBlbHNlIHsKKwkJLyogTm8gcGFnZSB3YXMgZm91bmQganVzdCBiZWNhdXNlIHdlIGNhbid0IHJlYWQgaXQgaW4gbm93IChiZWluZworCQkgKiBoZXJlIGltcGxpZXMgbm9uYmxvY2sgIT0gMCksIGJ1dCB0aGUgcGFnZSBtYXkgZXhpc3QsIHNvIHNldAorCQkgKiB0aGUgUFRFIHRvIGZhdWx0IGl0IGluIGxhdGVyLiAqLwogCQllcnIgPSBpbnN0YWxsX2ZpbGVfcHRlKG1tLCB2bWEsIGFkZHIsIHBnb2ZmLCBwcm90KTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CkBAIC0yMDAyLDcgKzIwMTIsNyBAQAogfQogRVhQT1JUX1NZTUJPTChnZW5lcmljX2ZpbGVfYnVmZmVyZWRfd3JpdGUpOwogCi1zc2l6ZV90CitzdGF0aWMgc3NpemVfdAogX19nZW5lcmljX2ZpbGVfYWlvX3dyaXRlX25vbG9jayhzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAogCQkJCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90ICpwcG9zKQogewpAQCAtMjEwMiw3ICsyMTEyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zc2l6ZV90CitzdGF0aWMgc3NpemVfdAogX19nZW5lcmljX2ZpbGVfd3JpdGVfbm9sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKIAkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTIyMjMsNyArMjIzMyw3IEBACiAgKiBDYWxsZWQgdW5kZXIgaV9zZW0gZm9yIHdyaXRlcyB0byBTX0lTUkVHIGZpbGVzLiAgIFJldHVybnMgLUVJTyBpZiBzb21ldGhpbmcKICAqIHdlbnQgd3JvbmcgZHVyaW5nIHBhZ2VjYWNoZSBzaG9vdGRvd24uCiAgKi8KLXNzaXplX3QKK3N0YXRpYyBzc2l6ZV90CiBnZW5lcmljX2ZpbGVfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKIAlsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCiB7CkBAIC0yMjU4LDQgKzIyNjgsMyBAQAogCX0KIAlyZXR1cm4gcmV0dmFsOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoZ2VuZXJpY19maWxlX2RpcmVjdF9JTyk7CmRpZmYgLS1naXQgYS9tbS9odWdldGxiLmMgYi9tbS9odWdldGxiLmMKaW5kZXggNmJmNzIwYi4uOTAxYWM1MiAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCisrKyBiL21tL2h1Z2V0bGIuYwpAQCAtMzYwLDggKzM2MCw2IEBACiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJaWYgKCEgcHRlX25vbmUoKnB0ZSkpCi0JCQlodWdldGxiX2NsZWFuX3N0YWxlX3BndGFibGUocHRlKTsKIAogCQlpZHggPSAoKGFkZHIgLSB2bWEtPnZtX3N0YXJ0KSA+PiBIUEFHRV9TSElGVCkKIAkJCSsgKHZtYS0+dm1fcGdvZmYgPj4gKEhQQUdFX1NISUZUIC0gUEFHRV9TSElGVCkpOwpkaWZmIC0tZ2l0IGEvbW0vbWFkdmlzZS5jIGIvbW0vbWFkdmlzZS5jCmluZGV4IGM4YzAxYTEuLjQ0NTQ5MzYgMTAwNjQ0Ci0tLSBhL21tL21hZHZpc2UuYworKysgYi9tbS9tYWR2aXNlLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogCWlmIChuZXdfZmxhZ3MgPT0gdm1hLT52bV9mbGFncykgewogCQkqcHJldiA9IHZtYTsKLQkJZ290byBzdWNjZXNzOworCQlnb3RvIG91dDsKIAl9CiAKIAlwZ29mZiA9IHZtYS0+dm1fcGdvZmYgKyAoKHN0YXJ0IC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCk7CkBAIC02Miw2ICs2Miw3IEBACiAJCQlnb3RvIG91dDsKIAl9CiAKK3N1Y2Nlc3M6CiAJLyoKIAkgKiB2bV9mbGFncyBpcyBwcm90ZWN0ZWQgYnkgdGhlIG1tYXBfc2VtIGhlbGQgaW4gd3JpdGUgbW9kZS4KIAkgKi8KQEAgLTcwLDcgKzcxLDYgQEAKIG91dDoKIAlpZiAoZXJyb3IgPT0gLUVOT01FTSkKIAkJZXJyb3IgPSAtRUFHQUlOOwotc3VjY2VzczoKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTIzNyw4ICsyMzcsOSBAQAogCSAqIC0gZGlmZmVyZW50IGZyb20gdGhlIHdheSBvZiBoYW5kbGluZyBpbiBtbG9jayBldGMuCiAJICovCiAJdm1hID0gZmluZF92bWFfcHJldihjdXJyZW50LT5tbSwgc3RhcnQsICZwcmV2KTsKLQlpZiAoIXZtYSAmJiBwcmV2KQotCQl2bWEgPSBwcmV2LT52bV9uZXh0OworCWlmICh2bWEgJiYgc3RhcnQgPiB2bWEtPnZtX3N0YXJ0KQorCQlwcmV2ID0gdm1hOworCiAJZm9yICg7OykgewogCQkvKiBTdGlsbCBzdGFydCA8IGVuZC4gKi8KIAkJZXJyb3IgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuYwppbmRleCBhNTk2YzExLi5hZTgxNjFmIDEwMDY0NAotLS0gYS9tbS9tZW1vcnkuYworKysgYi9tbS9tZW1vcnkuYwpAQCAtNTYyLDcgKzU2Miw4IEBACiAJCQkJICAgICBwYWdlLT5pbmRleCA+IGRldGFpbHMtPmxhc3RfaW5kZXgpKQogCQkJCQljb250aW51ZTsKIAkJCX0KLQkJCXB0ZW50ID0gcHRlcF9nZXRfYW5kX2NsZWFyKHRsYi0+bW0sIGFkZHIsIHB0ZSk7CisJCQlwdGVudCA9IHB0ZXBfZ2V0X2FuZF9jbGVhcl9mdWxsKHRsYi0+bW0sIGFkZHIsIHB0ZSwKKwkJCQkJCQl0bGItPmZ1bGxtbSk7CiAJCQl0bGJfcmVtb3ZlX3RsYl9lbnRyeSh0bGIsIHB0ZSwgYWRkcik7CiAJCQlpZiAodW5saWtlbHkoIXBhZ2UpKQogCQkJCWNvbnRpbnVlOwpAQCAtNTkwLDcgKzU5MSw3IEBACiAJCQljb250aW51ZTsKIAkJaWYgKCFwdGVfZmlsZShwdGVudCkpCiAJCQlmcmVlX3N3YXBfYW5kX2NhY2hlKHB0ZV90b19zd3BfZW50cnkocHRlbnQpKTsKLQkJcHRlX2NsZWFyKHRsYi0+bW0sIGFkZHIsIHB0ZSk7CisJCXB0ZV9jbGVhcl9mdWxsKHRsYi0+bW0sIGFkZHIsIHB0ZSwgdGxiLT5mdWxsbW0pOwogCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOwogCXB0ZV91bm1hcChwdGUgLSAxKTsKIH0KQEAgLTE5NTUsNyArMTk1Niw3IEBACiAJICogRmFsbCBiYWNrIHRvIHRoZSBsaW5lYXIgbWFwcGluZyBpZiB0aGUgZnMgZG9lcyBub3Qgc3VwcG9ydAogCSAqIC0+cG9wdWxhdGU6CiAJICovCi0JaWYgKCF2bWEtPnZtX29wcyB8fCAhdm1hLT52bV9vcHMtPnBvcHVsYXRlIHx8IAorCWlmICghdm1hLT52bV9vcHMtPnBvcHVsYXRlIHx8CiAJCQkod3JpdGVfYWNjZXNzICYmICEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpKSB7CiAJCXB0ZV9jbGVhcihtbSwgYWRkcmVzcywgcHRlKTsKIAkJcmV0dXJuIGRvX25vX3BhZ2UobW0sIHZtYSwgYWRkcmVzcywgd3JpdGVfYWNjZXNzLCBwdGUsIHBtZCk7CkBAIC0yMjI0LDcgKzIyMjUsNyBAQAogI2lmICFkZWZpbmVkKF9fSEFWRV9BUkNIX0dBVEVfQVJFQSkKIAogI2lmIGRlZmluZWQoQVRfU1lTSU5GT19FSERSKQotc3RydWN0IHZtX2FyZWFfc3RydWN0IGdhdGVfdm1hOworc3RhdGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCBnYXRlX3ZtYTsKIAogc3RhdGljIGludCBfX2luaXQgZ2F0ZV92bWFfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuYwppbmRleCBiNGVhYmFiLi5hZmEwNmUxIDEwMDY0NAotLS0gYS9tbS9tZW1wb2xpY3kuYworKysgYi9tbS9tZW1wb2xpY3kuYwpAQCAtODgsNyArODgsNyBAQAogICAgcG9saWNpZWQuICovCiBzdGF0aWMgaW50IHBvbGljeV96b25lOwogCi1zdGF0aWMgc3RydWN0IG1lbXBvbGljeSBkZWZhdWx0X3BvbGljeSA9IHsKK3N0cnVjdCBtZW1wb2xpY3kgZGVmYXVsdF9wb2xpY3kgPSB7CiAJLnJlZmNudCA9IEFUT01JQ19JTklUKDEpLCAvKiBuZXZlciBmcmVlIGl0ICovCiAJLnBvbGljeSA9IE1QT0xfREVGQVVMVCwKIH07CkBAIC02NjQsMTAgKzY2NCwxMCBAQAogI2VuZGlmCiAKIC8qIFJldHVybiBlZmZlY3RpdmUgcG9saWN5IGZvciBhIFZNQSAqLwotc3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgKgotZ2V0X3ZtYV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0cnVjdCBtZW1wb2xpY3kgKgorZ2V0X3ZtYV9wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewotCXN0cnVjdCBtZW1wb2xpY3kgKnBvbCA9IGN1cnJlbnQtPm1lbXBvbGljeTsKKwlzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSB0YXNrLT5tZW1wb2xpY3k7CiAKIAlpZiAodm1hKSB7CiAJCWlmICh2bWEtPnZtX29wcyAmJiB2bWEtPnZtX29wcy0+Z2V0X3BvbGljeSkKQEAgLTc4Niw3ICs3ODYsNyBAQAogc3RydWN0IHBhZ2UgKgogYWxsb2NfcGFnZV92bWEodW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSBnZXRfdm1hX3BvbGljeSh2bWEsIGFkZHIpOworCXN0cnVjdCBtZW1wb2xpY3kgKnBvbCA9IGdldF92bWFfcG9saWN5KGN1cnJlbnQsIHZtYSwgYWRkcik7CiAKIAljcHVzZXRfdXBkYXRlX2N1cnJlbnRfbWVtc19hbGxvd2VkKCk7CiAKQEAgLTkwOCw3ICs5MDgsNyBAQAogLyogRmluZCBmaXJzdCBub2RlIHN1aXRhYmxlIGZvciBhbiBhbGxvY2F0aW9uICovCiBpbnQgbXBvbF9maXJzdF9ub2RlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0Jc3RydWN0IG1lbXBvbGljeSAqcG9sID0gZ2V0X3ZtYV9wb2xpY3kodm1hLCBhZGRyKTsKKwlzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSBnZXRfdm1hX3BvbGljeShjdXJyZW50LCB2bWEsIGFkZHIpOwogCiAJc3dpdGNoIChwb2wtPnBvbGljeSkgewogCWNhc2UgTVBPTF9ERUZBVUxUOgpAQCAtOTI4LDcgKzkyOCw3IEBACiAvKiBGaW5kIHNlY29uZGFyeSB2YWxpZCBub2RlcyBmb3IgYW4gYWxsb2NhdGlvbiAqLwogaW50IG1wb2xfbm9kZV92YWxpZChpbnQgbmlkLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewotCXN0cnVjdCBtZW1wb2xpY3kgKnBvbCA9IGdldF92bWFfcG9saWN5KHZtYSwgYWRkcik7CisJc3RydWN0IG1lbXBvbGljeSAqcG9sID0gZ2V0X3ZtYV9wb2xpY3koY3VycmVudCwgdm1hLCBhZGRyKTsKIAogCXN3aXRjaCAocG9sLT5wb2xpY3kpIHsKIAljYXNlIE1QT0xfUFJFRkVSUkVEOgpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IDQwNDMxOTQuLjEyMzM0YWUgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAogaW50IHN5c2N0bF9vdmVyY29tbWl0X21lbW9yeSA9IE9WRVJDT01NSVRfR1VFU1M7ICAvKiBoZXVyaXN0aWMgb3ZlcmNvbW1pdCAqLwogaW50IHN5c2N0bF9vdmVyY29tbWl0X3JhdGlvID0gNTA7CS8qIGRlZmF1bHQgaXMgNTAlICovCi1pbnQgc3lzY3RsX21heF9tYXBfY291bnQgPSBERUZBVUxUX01BWF9NQVBfQ09VTlQ7CitpbnQgc3lzY3RsX21heF9tYXBfY291bnQgX19yZWFkX21vc3RseSA9IERFRkFVTFRfTUFYX01BUF9DT1VOVDsKIGF0b21pY190IHZtX2NvbW1pdHRlZF9zcGFjZSA9IEFUT01JQ19JTklUKDApOwogCiAvKgpAQCAtMjAzLDEzICsyMDMsNiBAQAogCWttZW1fY2FjaGVfZnJlZSh2bV9hcmVhX2NhY2hlcCwgdm1hKTsKIH0KIAotLyoKLSAqICBzeXNfYnJrKCkgZm9yIHRoZSBtb3N0IHBhcnQgZG9lc24ndCBuZWVkIHRoZSBnbG9iYWwga2VybmVsCi0gKiAgbG9jaywgZXhjZXB0IHdoZW4gYW4gYXBwbGljYXRpb24gaXMgZG9pbmcgc29tZXRoaW5nIG5hc3R5Ci0gKiAgbGlrZSB0cnlpbmcgdG8gdW4tYnJrIGFuIGFyZWEgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIG1hcHBlZAotICogIHRvIGEgcmVndWxhciBmaWxlLiAgaW4gdGhpcyBjYXNlLCB0aGUgdW5tYXBwaW5nIHdpbGwgbmVlZAotICogIHRvIGludm9rZSBmaWxlIHN5c3RlbSByb3V0aW5lcyB0aGF0IG5lZWQgdGhlIGdsb2JhbCBsb2NrLgotICovCiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX2Jyayh1bnNpZ25lZCBsb25nIGJyaykKIHsKIAl1bnNpZ25lZCBsb25nIHJsaW0sIHJldHZhbDsKZGlmZiAtLWdpdCBhL21tL21yZW1hcC5jIGIvbW0vbXJlbWFwLmMKaW5kZXggZmM0NWRjOS4uYTMyZmVkNCAxMDA2NDQKLS0tIGEvbW0vbXJlbWFwLmMKKysrIGIvbW0vbXJlbWFwLmMKQEAgLTE0MSw2ICsxNDEsMTAgQEAKIAkJCWlmIChkc3QpIHsKIAkJCQlwdGVfdCBwdGU7CiAJCQkJcHRlID0gcHRlcF9jbGVhcl9mbHVzaCh2bWEsIG9sZF9hZGRyLCBzcmMpOworCQkJCS8qIFpFUk9fUEFHRSBjYW4gYmUgZGVwZW5kYW50IG9uIHZpcnR1YWwgYWRkciAqLworCQkJCWlmIChwZm5fdmFsaWQocHRlX3BmbihwdGUpKSAmJgorCQkJCQlwdGVfcGFnZShwdGUpID09IFpFUk9fUEFHRShvbGRfYWRkcikpCisJCQkJCXB0ZSA9IHB0ZV93cnByb3RlY3QobWtfcHRlKFpFUk9fUEFHRShuZXdfYWRkciksIG5ld192bWEtPnZtX3BhZ2VfcHJvdCkpOwogCQkJCXNldF9wdGVfYXQobW0sIG5ld19hZGRyLCBkc3QsIHB0ZSk7CiAJCQl9IGVsc2UKIAkJCQllcnJvciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9tbS9vb21fa2lsbC5jIGIvbW0vb29tX2tpbGwuYwppbmRleCAxZTU2MDc2Li5hYzNiZjMzIDEwMDY0NAotLS0gYS9tbS9vb21fa2lsbC5jCisrKyBiL21tL29vbV9raWxsLmMKQEAgLTYsOCArNiw4IEBACiAgKglmb3IgZ29hZGluZyBtZSBpbnRvIGNvZGluZyB0aGlzIGZpbGUuLi4KICAqCiAgKiAgVGhlIHJvdXRpbmVzIGluIHRoaXMgZmlsZSBhcmUgdXNlZCB0byBraWxsIGEgcHJvY2VzcyB3aGVuCi0gKiAgd2UncmUgc2VyaW91c2x5IG91dCBvZiBtZW1vcnkuIFRoaXMgZ2V0cyBjYWxsZWQgZnJvbSBrc3dhcGQoKQotICogIGluIGxpbnV4L21tL3Ztc2Nhbi5jIHdoZW4gd2UgcmVhbGx5IHJ1biBvdXQgb2YgbWVtb3J5LgorICogIHdlJ3JlIHNlcmlvdXNseSBvdXQgb2YgbWVtb3J5LiBUaGlzIGdldHMgY2FsbGVkIGZyb20gX19hbGxvY19wYWdlcygpCisgKiAgaW4gbW0vcGFnZV9hbGxvYy5jIHdoZW4gd2UgcmVhbGx5IHJ1biBvdXQgb2YgbWVtb3J5LgogICoKICAqICBTaW5jZSB3ZSB3b24ndCBjYWxsIHRoZXNlIHJvdXRpbmVzIG9mdGVuIChvbiBhIHdlbGwtY29uZmlndXJlZAogICogIG1hY2hpbmUpIHRoaXMgZmlsZSB3aWxsIGRvdWJsZSBhcyBhICdjb2RpbmcgZ3VpZGUnIGFuZCBhIHNpZ25wb3N0CkBAIC0yMCwxMyArMjAsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAKIC8qICNkZWZpbmUgREVCVUcgKi8KIAogLyoqCiAgKiBvb21fYmFkbmVzcyAtIGNhbGN1bGF0ZSBhIG51bWVyaWMgdmFsdWUgZm9yIGhvdyBiYWQgdGhpcyB0YXNrIGhhcyBiZWVuCiAgKiBAcDogdGFzayBzdHJ1Y3Qgb2Ygd2hpY2ggdGFzayB3ZSBzaG91bGQgY2FsY3VsYXRlCi0gKiBAcDogY3VycmVudCB1cHRpbWUgaW4gc2Vjb25kcworICogQHVwdGltZTogY3VycmVudCB1cHRpbWUgaW4gc2Vjb25kcwogICoKICAqIFRoZSBmb3JtdWxhIHVzZWQgaXMgcmVsYXRpdmVseSBzaW1wbGUgYW5kIGRvY3VtZW50ZWQgaW5saW5lIGluIHRoZQogICogZnVuY3Rpb24uIFRoZSBtYWluIHJhdGlvbmFsZSBpcyB0aGF0IHdlIHdhbnQgdG8gc2VsZWN0IGEgZ29vZCB0YXNrCkBAIC01Nyw5ICs1OCw5IEBACiAKIAkvKgogCSAqIFByb2Nlc3NlcyB3aGljaCBmb3JrIGEgbG90IG9mIGNoaWxkIHByb2Nlc3NlcyBhcmUgbGlrZWx5Ci0JICogYSBnb29kIGNob2ljZS4gV2UgYWRkIHRoZSB2bXNpemUgb2YgdGhlIGNoaWxkcyBpZiB0aGV5CisJICogYSBnb29kIGNob2ljZS4gV2UgYWRkIHRoZSB2bXNpemUgb2YgdGhlIGNoaWxkcmVuIGlmIHRoZXkKIAkgKiBoYXZlIGFuIG93biBtbS4gVGhpcyBwcmV2ZW50cyBmb3JraW5nIHNlcnZlcnMgdG8gZmxvb2QgdGhlCi0JICogbWFjaGluZSB3aXRoIGFuIGVuZGxlc3MgYW1vdW50IG9mIGNoaWxkcworCSAqIG1hY2hpbmUgd2l0aCBhbiBlbmRsZXNzIGFtb3VudCBvZiBjaGlsZHJlbgogCSAqLwogCWxpc3RfZm9yX2VhY2godHNrLCAmcC0+Y2hpbGRyZW4pIHsKIAkJc3RydWN0IHRhc2tfc3RydWN0ICpjaGxkOwpAQCAtMTQzLDI4ICsxNDQsMzYgQEAKIAlzdHJ1Y3QgdGltZXNwZWMgdXB0aW1lOwogCiAJZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWUoJnVwdGltZSk7Ci0JZG9fZWFjaF90aHJlYWQoZywgcCkKKwlkb19lYWNoX3RocmVhZChnLCBwKSB7CisJCXVuc2lnbmVkIGxvbmcgcG9pbnRzOworCQlpbnQgcmVsZWFzaW5nOworCiAJCS8qIHNraXAgdGhlIGluaXQgdGFzayB3aXRoIHBpZCA9PSAxICovCi0JCWlmIChwLT5waWQgPiAxICYmIHAtPm9vbWtpbGxhZGogIT0gT09NX0RJU0FCTEUpIHsKLQkJCXVuc2lnbmVkIGxvbmcgcG9pbnRzOworCQlpZiAocC0+cGlkID09IDEpCisJCQljb250aW51ZTsKKwkJaWYgKHAtPm9vbWtpbGxhZGogPT0gT09NX0RJU0FCTEUpCisJCQljb250aW51ZTsKKwkJLyogSWYgcCdzIG5vZGVzIGRvbid0IG92ZXJsYXAgb3VycywgaXQgd29uJ3QgaGVscCB0byBraWxsIHAuICovCisJCWlmICghY3B1c2V0X2V4Y2xfbm9kZXNfb3ZlcmxhcChwKSkKKwkJCWNvbnRpbnVlOwogCi0JCQkvKgotCQkJICogVGhpcyBpcyBpbiB0aGUgcHJvY2VzcyBvZiByZWxlYXNpbmcgbWVtb3J5IHNvIHdhaXQgaXQKLQkJCSAqIHRvIGZpbmlzaCBiZWZvcmUga2lsbGluZyBzb21lIG90aGVyIHRhc2sgYnkgbWlzdGFrZS4KLQkJCSAqLwotCQkJaWYgKCh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTUVNRElFKSkgfHwgKHAtPmZsYWdzICYgUEZfRVhJVElORykpICYmCi0JCQkgICAgIShwLT5mbGFncyAmIFBGX0RFQUQpKQotCQkJCXJldHVybiBFUlJfUFRSKC0xVUwpOwotCQkJaWYgKHAtPmZsYWdzICYgUEZfU1dBUE9GRikKLQkJCQlyZXR1cm4gcDsKKwkJLyoKKwkJICogVGhpcyBpcyBpbiB0aGUgcHJvY2VzcyBvZiByZWxlYXNpbmcgbWVtb3J5IHNvIGZvciB3YWl0IGl0CisJCSAqIHRvIGZpbmlzaCBiZWZvcmUga2lsbGluZyBzb21lIG90aGVyIHRhc2sgYnkgbWlzdGFrZS4KKwkJICovCisJCXJlbGVhc2luZyA9IHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9NRU1ESUUpIHx8CisJCQkJCQlwLT5mbGFncyAmIFBGX0VYSVRJTkc7CisJCWlmIChyZWxlYXNpbmcgJiYgIShwLT5mbGFncyAmIFBGX0RFQUQpKQorCQkJcmV0dXJuIEVSUl9QVFIoLTFVTCk7CisJCWlmIChwLT5mbGFncyAmIFBGX1NXQVBPRkYpCisJCQlyZXR1cm4gcDsKIAotCQkJcG9pbnRzID0gYmFkbmVzcyhwLCB1cHRpbWUudHZfc2VjKTsKLQkJCWlmIChwb2ludHMgPiBtYXhwb2ludHMgfHwgIWNob3NlbikgewotCQkJCWNob3NlbiA9IHA7Ci0JCQkJbWF4cG9pbnRzID0gcG9pbnRzOwotCQkJfQorCQlwb2ludHMgPSBiYWRuZXNzKHAsIHVwdGltZS50dl9zZWMpOworCQlpZiAocG9pbnRzID4gbWF4cG9pbnRzIHx8ICFjaG9zZW4pIHsKKwkJCWNob3NlbiA9IHA7CisJCQltYXhwb2ludHMgPSBwb2ludHM7CiAJCX0KLQl3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKKwl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOwogCXJldHVybiBjaG9zZW47CiB9CiAKQEAgLTE4OSw3ICsxOTgsOCBAQAogCQlyZXR1cm47CiAJfQogCXRhc2tfdW5sb2NrKHApOwotCXByaW50ayhLRVJOX0VSUiAiT3V0IG9mIE1lbW9yeTogS2lsbGVkIHByb2Nlc3MgJWQgKCVzKS5cbiIsIHAtPnBpZCwgcC0+Y29tbSk7CisJcHJpbnRrKEtFUk5fRVJSICJPdXQgb2YgTWVtb3J5OiBLaWxsZWQgcHJvY2VzcyAlZCAoJXMpLlxuIiwKKwkJCQkJCQlwLT5waWQsIHAtPmNvbW0pOwogCiAJLyoKIAkgKiBXZSBnaXZlIG91ciBzYWNyaWZpY2lhbCBsYW1iIGhpZ2ggcHJpb3JpdHkgYW5kIGFjY2VzcyB0bwpAQCAtMjkwLDYgKzMwMCw1IEBACiAJICogR2l2ZSAicCIgYSBnb29kIGNoYW5jZSBvZiBraWxsaW5nIGl0c2VsZiBiZWZvcmUgd2UKIAkgKiByZXRyeSB0byBhbGxvY2F0ZSBtZW1vcnkuCiAJICovCi0JX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwogfQpkaWZmIC0tZ2l0IGEvbW0vcGFnZS13cml0ZWJhY2suYyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKaW5kZXggYTYzMjlmYS4uMDE2NmVhMTUgMTAwNjQ0Ci0tLSBhL21tL3BhZ2Utd3JpdGViYWNrLmMKKysrIGIvbW0vcGFnZS13cml0ZWJhY2suYwpAQCAtMzY4LDEwICszNjgsOCBAQAogc3RhdGljIHZvaWQgd2JfdGltZXJfZm4odW5zaWduZWQgbG9uZyB1bnVzZWQpOwogc3RhdGljIHZvaWQgbGFwdG9wX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgdW51c2VkKTsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHdiX3RpbWVyID0KLQkJCVRJTUVSX0lOSVRJQUxJWkVSKHdiX3RpbWVyX2ZuLCAwLCAwKTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBsYXB0b3BfbW9kZV93Yl90aW1lciA9Ci0JCQlUSU1FUl9JTklUSUFMSVpFUihsYXB0b3BfdGltZXJfZm4sIDAsIDApOworc3RhdGljIERFRklORV9USU1FUih3Yl90aW1lciwgd2JfdGltZXJfZm4sIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihsYXB0b3BfbW9kZV93Yl90aW1lciwgbGFwdG9wX3RpbWVyX2ZuLCAwLCAwKTsKIAogLyoKICAqIFBlcmlvZGljIHdyaXRlYmFjayBvZiAib2xkIiBkYXRhLgpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDhkMDg4MzcuLmM1ODIzYzMgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTQyLDEzICs0MiwxMyBAQAogICogTUNEIC0gSEFDSzogRmluZCBzb21ld2hlcmUgdG8gaW5pdGlhbGl6ZSB0aGlzIEVBUkxZLCBvciBtYWtlIHRoaXMKICAqIGluaXRpYWxpemVyIGNsZWFuZXIKICAqLwotbm9kZW1hc2tfdCBub2RlX29ubGluZV9tYXAgPSB7IHsgWzBdID0gMVVMIH0gfTsKK25vZGVtYXNrX3Qgbm9kZV9vbmxpbmVfbWFwIF9fcmVhZF9tb3N0bHkgPSB7IHsgWzBdID0gMVVMIH0gfTsKIEVYUE9SVF9TWU1CT0wobm9kZV9vbmxpbmVfbWFwKTsKLW5vZGVtYXNrX3Qgbm9kZV9wb3NzaWJsZV9tYXAgPSBOT0RFX01BU0tfQUxMOworbm9kZW1hc2tfdCBub2RlX3Bvc3NpYmxlX21hcCBfX3JlYWRfbW9zdGx5ID0gTk9ERV9NQVNLX0FMTDsKIEVYUE9SVF9TWU1CT0wobm9kZV9wb3NzaWJsZV9tYXApOwotc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdF9saXN0OwotdW5zaWduZWQgbG9uZyB0b3RhbHJhbV9wYWdlczsKLXVuc2lnbmVkIGxvbmcgdG90YWxoaWdoX3BhZ2VzOworc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdF9saXN0IF9fcmVhZF9tb3N0bHk7Cit1bnNpZ25lZCBsb25nIHRvdGFscmFtX3BhZ2VzIF9fcmVhZF9tb3N0bHk7Cit1bnNpZ25lZCBsb25nIHRvdGFsaGlnaF9wYWdlcyBfX3JlYWRfbW9zdGx5OwogbG9uZyBucl9zd2FwX3BhZ2VzOwogCiAvKgpAQCAtNjgsNyArNjgsNyBAQAogICogVXNlZCBieSBwYWdlX3pvbmUoKSB0byBsb29rIHVwIHRoZSBhZGRyZXNzIG9mIHRoZSBzdHJ1Y3Qgem9uZSB3aG9zZQogICogaWQgaXMgZW5jb2RlZCBpbiB0aGUgdXBwZXIgYml0cyBvZiBwYWdlLT5mbGFncwogICovCi1zdHJ1Y3Qgem9uZSAqem9uZV90YWJsZVsxIDw8IFpPTkVUQUJMRV9TSElGVF07CitzdHJ1Y3Qgem9uZSAqem9uZV90YWJsZVsxIDw8IFpPTkVUQUJMRV9TSElGVF0gX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0woem9uZV90YWJsZSk7CiAKIHN0YXRpYyBjaGFyICp6b25lX25hbWVzW01BWF9OUl9aT05FU10gPSB7ICJETUEiLCAiTm9ybWFsIiwgIkhpZ2hNZW0iIH07CkBAIC0zMjksMTMgKzMyOSwxMyBAQAogCQkJMSA8PCBQR193cml0ZWJhY2sgKSkpCiAJCWJhZF9wYWdlKGZ1bmN0aW9uLCBwYWdlKTsKIAlpZiAoUGFnZURpcnR5KHBhZ2UpKQotCQlDbGVhclBhZ2VEaXJ0eShwYWdlKTsKKwkJX19DbGVhclBhZ2VEaXJ0eShwYWdlKTsKIH0KIAogLyoKICAqIEZyZWVzIGEgbGlzdCBvZiBwYWdlcy4gCiAgKiBBc3N1bWVzIGFsbCBwYWdlcyBvbiBsaXN0IGFyZSBpbiBzYW1lIHpvbmUsIGFuZCBvZiBzYW1lIG9yZGVyLgotICogY291bnQgaXMgdGhlIG51bWJlciBvZiBwYWdlcyB0byBmcmVlLCBvciAwIGZvciBhbGwgb24gdGhlIGxpc3QuCisgKiBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGZyZWUuCiAgKgogICogSWYgdGhlIHpvbmUgd2FzIHByZXZpb3VzbHkgaW4gYW4gImFsbCBwYWdlcyBwaW5uZWQiIHN0YXRlIHRoZW4gbG9vayB0bwogICogc2VlIGlmIHRoaXMgZnJlZWluZyBjbGVhcnMgdGhhdCBzdGF0ZS4KQEAgLTgwNiwxMSArODA2LDE0IEBACiAJY2xhc3N6b25lX2lkeCA9IHpvbmVfaWR4KHpvbmVzWzBdKTsKIAogcmVzdGFydDoKLQkvKiBHbyB0aHJvdWdoIHRoZSB6b25lbGlzdCBvbmNlLCBsb29raW5nIGZvciBhIHpvbmUgd2l0aCBlbm91Z2ggZnJlZSAqLworCS8qCisJICogR28gdGhyb3VnaCB0aGUgem9uZWxpc3Qgb25jZSwgbG9va2luZyBmb3IgYSB6b25lIHdpdGggZW5vdWdoIGZyZWUuCisJICogU2VlIGFsc28gY3B1c2V0X3pvbmVfYWxsb3dlZCgpIGNvbW1lbnQgaW4ga2VybmVsL2NwdXNldC5jLgorCSAqLwogCWZvciAoaSA9IDA7ICh6ID0gem9uZXNbaV0pICE9IE5VTEw7IGkrKykgewogCQlpbnQgZG9fcmVjbGFpbSA9IHNob3VsZF9yZWNsYWltX3pvbmUoeiwgZ2ZwX21hc2spOwogCi0JCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6KSkKKwkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHosIF9fR0ZQX0hBUkRXQUxMKSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qCkBAIC04NDUsNiArODQ4LDcgQEAKIAkgKgogCSAqIFRoaXMgaXMgdGhlIGxhc3QgY2hhbmNlLCBpbiBnZW5lcmFsLCBiZWZvcmUgdGhlIGdvdG8gbm9wYWdlLgogCSAqIElnbm9yZSBjcHVzZXQgaWYgR0ZQX0FUT01JQyAoIXdhaXQpIHJhdGhlciB0aGFuIGZhaWwgYWxsb2MuCisJICogU2VlIGFsc28gY3B1c2V0X3pvbmVfYWxsb3dlZCgpIGNvbW1lbnQgaW4ga2VybmVsL2NwdXNldC5jLgogCSAqLwogCWZvciAoaSA9IDA7ICh6ID0gem9uZXNbaV0pICE9IE5VTEw7IGkrKykgewogCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHosIG9yZGVyLCB6LT5wYWdlc19taW4sCkBAIC04NTIsNyArODU2LDcgQEAKIAkJCQkgICAgICAgZ2ZwX21hc2sgJiBfX0dGUF9ISUdIKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICh3YWl0ICYmICFjcHVzZXRfem9uZV9hbGxvd2VkKHopKQorCQlpZiAod2FpdCAmJiAhY3B1c2V0X3pvbmVfYWxsb3dlZCh6LCBnZnBfbWFzaykpCiAJCQljb250aW51ZTsKIAogCQlwYWdlID0gYnVmZmVyZWRfcm1xdWV1ZSh6LCBvcmRlciwgZ2ZwX21hc2spOwpAQCAtODY3LDcgKzg3MSw3IEBACiAJCWlmICghKGdmcF9tYXNrICYgX19HRlBfTk9NRU1BTExPQykpIHsKIAkJCS8qIGdvIHRocm91Z2ggdGhlIHpvbmVsaXN0IHlldCBhZ2FpbiwgaWdub3JpbmcgbWlucyAqLwogCQkJZm9yIChpID0gMDsgKHogPSB6b25lc1tpXSkgIT0gTlVMTDsgaSsrKSB7Ci0JCQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHopKQorCQkJCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6LCBnZnBfbWFzaykpCiAJCQkJCWNvbnRpbnVlOwogCQkJCXBhZ2UgPSBidWZmZXJlZF9ybXF1ZXVlKHosIG9yZGVyLCBnZnBfbWFzayk7CiAJCQkJaWYgKHBhZ2UpCkBAIC05MDMsNyArOTA3LDcgQEAKIAkJCQkJICAgICAgIGdmcF9tYXNrICYgX19HRlBfSElHSCkpCiAJCQkJY29udGludWU7CiAKLQkJCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6KSkKKwkJCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6LCBnZnBfbWFzaykpCiAJCQkJY29udGludWU7CiAKIAkJCXBhZ2UgPSBidWZmZXJlZF9ybXF1ZXVlKHosIG9yZGVyLCBnZnBfbWFzayk7CkBAIC05MjIsNyArOTI2LDcgQEAKIAkJCQkJICAgICAgIGNsYXNzem9uZV9pZHgsIDAsIDApKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoeikpCisJCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoeiwgX19HRlBfSEFSRFdBTEwpKQogCQkJCWNvbnRpbnVlOwogCiAJCQlwYWdlID0gYnVmZmVyZWRfcm1xdWV1ZSh6LCBvcmRlciwgZ2ZwX21hc2spOwpAQCAtMTEzMCwxOSArMTEzNCwyMCBAQAogREVGSU5FX1BFUl9DUFUobG9uZywgbnJfcGFnZWNhY2hlX2xvY2FsKSA9IDA7CiAjZW5kaWYKIAotdm9pZCBfX2dldF9wYWdlX3N0YXRlKHN0cnVjdCBwYWdlX3N0YXRlICpyZXQsIGludCBucikKK3ZvaWQgX19nZXRfcGFnZV9zdGF0ZShzdHJ1Y3QgcGFnZV9zdGF0ZSAqcmV0LCBpbnQgbnIsIGNwdW1hc2tfdCAqY3B1bWFzaykKIHsKIAlpbnQgY3B1ID0gMDsKIAogCW1lbXNldChyZXQsIDAsIHNpemVvZigqcmV0KSk7CisJY3B1c19hbmQoKmNwdW1hc2ssICpjcHVtYXNrLCBjcHVfb25saW5lX21hcCk7CiAKLQljcHUgPSBmaXJzdF9jcHUoY3B1X29ubGluZV9tYXApOworCWNwdSA9IGZpcnN0X2NwdSgqY3B1bWFzayk7CiAJd2hpbGUgKGNwdSA8IE5SX0NQVVMpIHsKIAkJdW5zaWduZWQgbG9uZyAqaW4sICpvdXQsIG9mZjsKIAogCQlpbiA9ICh1bnNpZ25lZCBsb25nICopJnBlcl9jcHUocGFnZV9zdGF0ZXMsIGNwdSk7CiAKLQkJY3B1ID0gbmV4dF9jcHUoY3B1LCBjcHVfb25saW5lX21hcCk7CisJCWNwdSA9IG5leHRfY3B1KGNwdSwgKmNwdW1hc2spOwogCiAJCWlmIChjcHUgPCBOUl9DUFVTKQogCQkJcHJlZmV0Y2goJnBlcl9jcHUocGFnZV9zdGF0ZXMsIGNwdSkpOwpAQCAtMTE1MywxOSArMTE1OCwzMyBAQAogCX0KIH0KIAotdm9pZCBnZXRfcGFnZV9zdGF0ZShzdHJ1Y3QgcGFnZV9zdGF0ZSAqcmV0KQordm9pZCBnZXRfcGFnZV9zdGF0ZV9ub2RlKHN0cnVjdCBwYWdlX3N0YXRlICpyZXQsIGludCBub2RlKQogewogCWludCBucjsKKwljcHVtYXNrX3QgbWFzayA9IG5vZGVfdG9fY3B1bWFzayhub2RlKTsKIAogCW5yID0gb2Zmc2V0b2Yoc3RydWN0IHBhZ2Vfc3RhdGUsIEdFVF9QQUdFX1NUQVRFX0xBU1QpOwogCW5yIC89IHNpemVvZih1bnNpZ25lZCBsb25nKTsKIAotCV9fZ2V0X3BhZ2Vfc3RhdGUocmV0LCBuciArIDEpOworCV9fZ2V0X3BhZ2Vfc3RhdGUocmV0LCBucisxLCAmbWFzayk7Cit9CisKK3ZvaWQgZ2V0X3BhZ2Vfc3RhdGUoc3RydWN0IHBhZ2Vfc3RhdGUgKnJldCkKK3sKKwlpbnQgbnI7CisJY3B1bWFza190IG1hc2sgPSBDUFVfTUFTS19BTEw7CisKKwluciA9IG9mZnNldG9mKHN0cnVjdCBwYWdlX3N0YXRlLCBHRVRfUEFHRV9TVEFURV9MQVNUKTsKKwluciAvPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisKKwlfX2dldF9wYWdlX3N0YXRlKHJldCwgbnIgKyAxLCAmbWFzayk7CiB9CiAKIHZvaWQgZ2V0X2Z1bGxfcGFnZV9zdGF0ZShzdHJ1Y3QgcGFnZV9zdGF0ZSAqcmV0KQogewotCV9fZ2V0X3BhZ2Vfc3RhdGUocmV0LCBzaXplb2YoKnJldCkgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWNwdW1hc2tfdCBtYXNrID0gQ1BVX01BU0tfQUxMOworCisJX19nZXRfcGFnZV9zdGF0ZShyZXQsIHNpemVvZigqcmV0KSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSwgJm1hc2spOwogfQogCiB1bnNpZ25lZCBsb25nIF9fcmVhZF9wYWdlX3N0YXRlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQpAQCAtMTkwOSw3ICsxOTI4LDcgQEAKIAkJem9uZS0+bnJfc2Nhbl9pbmFjdGl2ZSA9IDA7CiAJCXpvbmUtPm5yX2FjdGl2ZSA9IDA7CiAJCXpvbmUtPm5yX2luYWN0aXZlID0gMDsKLQkJYXRvbWljX3NldCgmem9uZS0+cmVjbGFpbV9pbl9wcm9ncmVzcywgLTEpOworCQlhdG9taWNfc2V0KCZ6b25lLT5yZWNsYWltX2luX3Byb2dyZXNzLCAwKTsKIAkJaWYgKCFzaXplKQogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL21tL3JlYWRhaGVhZC5jIGIvbW0vcmVhZGFoZWFkLmMKaW5kZXggYjg0MGU3Yy4uZDBiNTAwMyAxMDA2NDQKLS0tIGEvbW0vcmVhZGFoZWFkLmMKKysrIGIvbW0vcmVhZGFoZWFkLmMKQEAgLTU0MCw2ICs1NDAsNyBAQAogewogCXJhLT5mbGFncyB8PSBSQV9GTEFHX01JU1M7CiAJcmEtPmZsYWdzICY9IH5SQV9GTEFHX0lOQ0FDSEU7CisJcmEtPmNhY2hlX2hpdCA9IDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggMDhhYzVjNy4uNDUwZjUyNCAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtMzQsOSArMzQsOCBAQAogICogICAgICAgYW5vbl92bWEtPmxvY2sKICAqICAgICAgICAgbW0tPnBhZ2VfdGFibGVfbG9jawogICogICAgICAgICAgIHpvbmUtPmxydV9sb2NrIChpbiBtYXJrX3BhZ2VfYWNjZXNzZWQpCi0gKiAgICAgICAgICAgc3dhcF9saXN0X2xvY2sgKGluIHN3YXBfZnJlZSBldGMncyBzd2FwX2luZm9fZ2V0KQorICogICAgICAgICAgIHN3YXBfbG9jayAoaW4gc3dhcF9kdXBsaWNhdGUsIHN3YXBfaW5mb19nZXQpCiAgKiAgICAgICAgICAgICBtbWxpc3RfbG9jayAoaW4gbW1wdXQsIGRyYWluX21tbGlzdCBhbmQgb3RoZXJzKQotICogICAgICAgICAgICAgc3dhcF9kZXZpY2VfbG9jayAoaW4gc3dhcF9kdXBsaWNhdGUsIHN3YXBfaW5mb19nZXQpCiAgKiAgICAgICAgICAgICBtYXBwaW5nLT5wcml2YXRlX2xvY2sgKGluIF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycykKICAqICAgICAgICAgICAgIGlub2RlX2xvY2sgKGluIHNldF9wYWdlX2RpcnR5J3MgX19tYXJrX2lub2RlX2RpcnR5KQogICogICAgICAgICAgICAgICBzYl9sb2NrICh3aXRoaW4gaW5vZGVfbG9jayBpbiBmcy9mcy13cml0ZWJhY2suYykKQEAgLTI5MCw4ICsyODksNiBAQAogCXB0ZV90ICpwdGU7CiAJaW50IHJlZmVyZW5jZWQgPSAwOwogCi0JaWYgKCFnZXRfbW1fY291bnRlcihtbSwgcnNzKSkKLQkJZ290byBvdXQ7CiAJYWRkcmVzcyA9IHZtYV9hZGRyZXNzKHBhZ2UsIHZtYSk7CiAJaWYgKGFkZHJlc3MgPT0gLUVGQVVMVCkKIAkJZ290byBvdXQ7CkBAIC00NDIsMjIgKzQzOSwxOSBAQAogdm9pZCBwYWdlX2FkZF9hbm9uX3JtYXAoc3RydWN0IHBhZ2UgKnBhZ2UsCiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gdm1hLT5hbm9uX3ZtYTsKLQlwZ29mZl90IGluZGV4OwotCiAJQlVHX09OKFBhZ2VSZXNlcnZlZChwYWdlKSk7Ci0JQlVHX09OKCFhbm9uX3ZtYSk7CiAKIAlpbmNfbW1fY291bnRlcih2bWEtPnZtX21tLCBhbm9uX3Jzcyk7CiAKLQlhbm9uX3ZtYSA9ICh2b2lkICopIGFub25fdm1hICsgUEFHRV9NQVBQSU5HX0FOT047Ci0JaW5kZXggPSAoYWRkcmVzcyAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQ7Ci0JaW5kZXggKz0gdm1hLT52bV9wZ29mZjsKLQlpbmRleCA+Pj0gUEFHRV9DQUNIRV9TSElGVCAtIFBBR0VfU0hJRlQ7Ci0KIAlpZiAoYXRvbWljX2luY19hbmRfdGVzdCgmcGFnZS0+X21hcGNvdW50KSkgewotCQlwYWdlLT5pbmRleCA9IGluZGV4OworCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gdm1hLT5hbm9uX3ZtYTsKKworCQlCVUdfT04oIWFub25fdm1hKTsKKwkJYW5vbl92bWEgPSAodm9pZCAqKSBhbm9uX3ZtYSArIFBBR0VfTUFQUElOR19BTk9OOwogCQlwYWdlLT5tYXBwaW5nID0gKHN0cnVjdCBhZGRyZXNzX3NwYWNlICopIGFub25fdm1hOworCisJCXBhZ2UtPmluZGV4ID0gbGluZWFyX3BhZ2VfaW5kZXgodm1hLCBhZGRyZXNzKTsKKwogCQlpbmNfcGFnZV9zdGF0ZShucl9tYXBwZWQpOwogCX0KIAkvKiBlbHNlIGNoZWNraW5nIHBhZ2UgaW5kZXggYW5kIG1hcHBpbmcgaXMgcmFjeSAqLwpAQCAtNTE4LDggKzUxMiw2IEBACiAJcHRlX3QgcHRldmFsOwogCWludCByZXQgPSBTV0FQX0FHQUlOOwogCi0JaWYgKCFnZXRfbW1fY291bnRlcihtbSwgcnNzKSkKLQkJZ290byBvdXQ7CiAJYWRkcmVzcyA9IHZtYV9hZGRyZXNzKHBhZ2UsIHZtYSk7CiAJaWYgKGFkZHJlc3MgPT0gLUVGQVVMVCkKIAkJZ290byBvdXQ7CkBAIC01MzIsNiArNTI0LDggQEAKIAkgKiBJZiB0aGUgcGFnZSBpcyBtbG9jaygpZCwgd2UgY2Fubm90IHN3YXAgaXQgb3V0LgogCSAqIElmIGl0J3MgcmVjZW50bHkgcmVmZXJlbmNlZCAocGVyaGFwcyBwYWdlX3JlZmVyZW5jZWQKIAkgKiBza2lwcGVkIG92ZXIgdGhpcyBtbSkgdGhlbiB3ZSBzaG91bGQgcmVhY3RpdmF0ZSBpdC4KKwkgKgorCSAqIFBhZ2VzIGJlbG9uZ2luZyB0byBWTV9SRVNFUlZFRCByZWdpb25zIHNob3VsZCBub3QgaGFwcGVuIGhlcmUuCiAJICovCiAJaWYgKCh2bWEtPnZtX2ZsYWdzICYgKFZNX0xPQ0tFRHxWTV9SRVNFUlZFRCkpIHx8CiAJCQlwdGVwX2NsZWFyX2ZsdXNoX3lvdW5nKHZtYSwgYWRkcmVzcywgcHRlKSkgewpAQCAtNzY3LDggKzc2MSw3IEBACiAJCQlpZiAodm1hLT52bV9mbGFncyAmIChWTV9MT0NLRUR8Vk1fUkVTRVJWRUQpKQogCQkJCWNvbnRpbnVlOwogCQkJY3Vyc29yID0gKHVuc2lnbmVkIGxvbmcpIHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwotCQkJd2hpbGUgKGdldF9tbV9jb3VudGVyKHZtYS0+dm1fbW0sIHJzcykgJiYKLQkJCQljdXJzb3IgPCBtYXhfbmxfY3Vyc29yICYmCisJCQl3aGlsZSAoIGN1cnNvciA8IG1heF9ubF9jdXJzb3IgJiYKIAkJCQljdXJzb3IgPCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIHsKIAkJCQl0cnlfdG9fdW5tYXBfY2x1c3RlcihjdXJzb3IsICZtYXBjb3VudCwgdm1hKTsKIAkJCQljdXJzb3IgKz0gQ0xVU1RFUl9TSVpFOwpkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggNWE4MWIxZS4uMWY3YWViMiAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC00NSw3ICs0NSw2IEBACiAjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvbGljeS5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+Ci0jaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0xNzksMTAgKzE3OCw5IEBACiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzaG1lbV9maWxlX29wZXJhdGlvbnM7CiBzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc2htZW1faW5vZGVfb3BlcmF0aW9uczsKIHN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKLXN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CiBzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNobWVtX3ZtX29wczsKIAotc3RhdGljIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvIHNobWVtX2JhY2tpbmdfZGV2X2luZm8gPSB7CitzdGF0aWMgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gc2htZW1fYmFja2luZ19kZXZfaW5mbyAgX19yZWFkX21vc3RseSA9IHsKIAkucmFfcGFnZXMJPSAwLAkvKiBObyByZWFkYWhlYWQgKi8KIAkuY2FwYWJpbGl0aWVzCT0gQkRJX0NBUF9OT19BQ0NUX0RJUlRZIHwgQkRJX0NBUF9OT19XUklURUJBQ0ssCiAJLnVucGx1Z19pb19mbgk9IGRlZmF1bHRfdW5wbHVnX2lvX2ZuLApAQCAtNjY4LDYgKzY2Niw3IEBACiAJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8gPSBTSE1FTV9JKGlub2RlKTsKIAogCWlmIChpbm9kZS0+aV9vcC0+dHJ1bmNhdGUgPT0gc2htZW1fdHJ1bmNhdGUpIHsKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgMCk7CiAJCXNobWVtX3VuYWNjdF9zaXplKGluZm8tPmZsYWdzLCBpbm9kZS0+aV9zaXplKTsKIAkJaW5vZGUtPmlfc2l6ZSA9IDA7CiAJCXNobWVtX3RydW5jYXRlKGlub2RlKTsKQEAgLTExOTUsNiArMTE5NCw3IEBACiAJCWVyciA9IHNobWVtX2dldHBhZ2UoaW5vZGUsIHBnb2ZmLCAmcGFnZSwgc2dwLCBOVUxMKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CisJCS8qIFBhZ2UgbWF5IHN0aWxsIGJlIG51bGwsIGJ1dCBvbmx5IGlmIG5vbmJsb2NrIHdhcyBzZXQuICovCiAJCWlmIChwYWdlKSB7CiAJCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CiAJCQllcnIgPSBpbnN0YWxsX3BhZ2UobW0sIHZtYSwgYWRkciwgcGFnZSwgcHJvdCk7CkBAIC0xMjAyLDcgKzEyMDIsMTAgQEAKIAkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KLQkJfSBlbHNlIGlmIChub25ibG9jaykgeworCQl9IGVsc2UgeworCQkJLyogTm8gcGFnZSB3YXMgZm91bmQganVzdCBiZWNhdXNlIHdlIGNhbid0IHJlYWQgaXQgaW4KKwkJCSAqIG5vdyAoYmVpbmcgaGVyZSBpbXBsaWVzIG5vbmJsb2NrICE9IDApLCBidXQgdGhlIHBhZ2UKKwkJCSAqIG1heSBleGlzdCwgc28gc2V0IHRoZSBQVEUgdG8gZmF1bHQgaXQgaW4gbGF0ZXIuICovCiAgICAgCQkJZXJyID0gaW5zdGFsbF9maWxlX3B0ZShtbSwgdm1hLCBhZGRyLCBwZ29mZiwgcHJvdCk7CiAJCQlpZiAoZXJyKQogCSAgICAJCQlyZXR1cm4gZXJyOwpAQCAtMTI5Niw3ICsxMjk5LDYgQEAKIAogCQlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKIAkJZGVmYXVsdDoKLQkJCWlub2RlLT5pX29wID0gJnNobWVtX3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9uczsKIAkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgbW9kZSwgZGV2KTsKIAkJCWJyZWFrOwogCQljYXNlIFNfSUZSRUc6CkBAIC0xNjA2LDYgKzE2MDgsMTUgQEAKIAlpbnQgZXJyb3IgPSAtRU5PU1BDOwogCiAJaWYgKGlub2RlKSB7CisJCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfaW5pdF9zZWN1cml0eShpbm9kZSwgZGlyLCBOVUxMLCBOVUxMLAorCQkJCQkJICAgICBOVUxMKTsKKwkJaWYgKGVycm9yKSB7CisJCQlpZiAoZXJyb3IgIT0gLUVPUE5PVFNVUFApIHsKKwkJCQlpcHV0KGlub2RlKTsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQllcnJvciA9IDA7CisJCX0KIAkJaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkgewogCQkJaW5vZGUtPmlfZ2lkID0gZGlyLT5pX2dpZDsKIAkJCWlmIChTX0lTRElSKG1vZGUpKQpAQCAtMTYxNSw3ICsxNjI2LDYgQEAKIAkJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOwogCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCQlkZ2V0KGRlbnRyeSk7IC8qIEV4dHJhIGNvdW50IC0gcGluIHRoZSBkZW50cnkgaW4gY29yZSAqLwotCQllcnJvciA9IDA7CiAJfQogCXJldHVybiBlcnJvcjsKIH0KQEAgLTE3NDUsNiArMTc1NSwxNiBAQAogCWlmICghaW5vZGUpCiAJCXJldHVybiAtRU5PU1BDOwogCisJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9pbml0X3NlY3VyaXR5KGlub2RlLCBkaXIsIE5VTEwsIE5VTEwsCisJCQkJCSAgICAgTlVMTCk7CisJaWYgKGVycm9yKSB7CisJCWlmIChlcnJvciAhPSAtRU9QTk9UU1VQUCkgeworCQkJaXB1dChpbm9kZSk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJZXJyb3IgPSAwOworCX0KKwogCWluZm8gPSBTSE1FTV9JKGlub2RlKTsKIAlpbm9kZS0+aV9zaXplID0gbGVuLTE7CiAJaWYgKGxlbiA8PSAoY2hhciAqKWlub2RlIC0gKGNoYXIgKilpbmZvKSB7CkBAIC0xODAwLDEyICsxODIwLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9zeW1saW5rX2lubGluZV9vcGVyYXRpb25zID0gewogCS5yZWFkbGluawk9IGdlbmVyaWNfcmVhZGxpbmssCiAJLmZvbGxvd19saW5rCT0gc2htZW1fZm9sbG93X2xpbmtfaW5saW5lLAotI2lmZGVmIENPTkZJR19UTVBGU19YQVRUUgotCS5zZXR4YXR0ciAgICAgICA9IGdlbmVyaWNfc2V0eGF0dHIsCi0JLmdldHhhdHRyICAgICAgID0gZ2VuZXJpY19nZXR4YXR0ciwKLQkubGlzdHhhdHRyICAgICAgPSBnZW5lcmljX2xpc3R4YXR0ciwKLQkucmVtb3ZleGF0dHIgICAgPSBnZW5lcmljX3JlbW92ZXhhdHRyLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc2htZW1fc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0gewpAQCAtMTgxMywxMiArMTgyNyw2IEBACiAJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKIAkuZm9sbG93X2xpbmsJPSBzaG1lbV9mb2xsb3dfbGluaywKIAkucHV0X2xpbmsJPSBzaG1lbV9wdXRfbGluaywKLSNpZmRlZiBDT05GSUdfVE1QRlNfWEFUVFIKLQkuc2V0eGF0dHIgICAgICAgPSBnZW5lcmljX3NldHhhdHRyLAotCS5nZXR4YXR0ciAgICAgICA9IGdlbmVyaWNfZ2V0eGF0dHIsCi0JLmxpc3R4YXR0ciAgICAgID0gZ2VuZXJpY19saXN0eGF0dHIsCi0JLnJlbW92ZXhhdHRyICAgID0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKLSNlbmRpZgogfTsKIAogc3RhdGljIGludCBzaG1lbV9wYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIGludCAqbW9kZSwgdWlkX3QgKnVpZCwgZ2lkX3QgKmdpZCwgdW5zaWduZWQgbG9uZyAqYmxvY2tzLCB1bnNpZ25lZCBsb25nICppbm9kZXMpCkBAIC0xOTM4LDEyICsxOTQ2LDYgQEAKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKIH0KIAotI2lmZGVmIENPTkZJR19UTVBGU19YQVRUUgotc3RhdGljIHN0cnVjdCB4YXR0cl9oYW5kbGVyICpzaG1lbV94YXR0cl9oYW5kbGVyc1tdOwotI2Vsc2UKLSNkZWZpbmUgc2htZW1feGF0dHJfaGFuZGxlcnMgTlVMTAotI2VuZGlmCi0KIHN0YXRpYyBpbnQgc2htZW1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJICAgIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCiB7CkBAIC0xOTk0LDcgKzE5OTYsNiBAQAogCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gUEFHRV9DQUNIRV9TSElGVDsKIAlzYi0+c19tYWdpYyA9IFRNUEZTX01BR0lDOwogCXNiLT5zX29wID0gJnNobWVtX29wczsKLQlzYi0+c194YXR0ciA9IHNobWVtX3hhdHRyX2hhbmRsZXJzOwogCiAJaW5vZGUgPSBzaG1lbV9nZXRfaW5vZGUoc2IsIFNfSUZESVIgfCBtb2RlLCAwKTsKIAlpZiAoIWlub2RlKQpAQCAtMjA4MywxMiArMjA4NCw2IEBACiBzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc2htZW1faW5vZGVfb3BlcmF0aW9ucyA9IHsKIAkudHJ1bmNhdGUJPSBzaG1lbV90cnVuY2F0ZSwKIAkuc2V0YXR0cgk9IHNobWVtX25vdGlmeV9jaGFuZ2UsCi0jaWZkZWYgQ09ORklHX1RNUEZTX1hBVFRSCi0JLnNldHhhdHRyICAgICAgID0gZ2VuZXJpY19zZXR4YXR0ciwKLQkuZ2V0eGF0dHIgICAgICAgPSBnZW5lcmljX2dldHhhdHRyLAotCS5saXN0eGF0dHIgICAgICA9IGdlbmVyaWNfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0ciAgICA9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKQEAgLTIxMDIsMjEgKzIwOTcsNiBAQAogCS5ybWRpcgkJPSBzaG1lbV9ybWRpciwKIAkubWtub2QJCT0gc2htZW1fbWtub2QsCiAJLnJlbmFtZQkJPSBzaG1lbV9yZW5hbWUsCi0jaWZkZWYgQ09ORklHX1RNUEZTX1hBVFRSCi0JLnNldHhhdHRyICAgICAgID0gZ2VuZXJpY19zZXR4YXR0ciwKLQkuZ2V0eGF0dHIgICAgICAgPSBnZW5lcmljX2dldHhhdHRyLAotCS5saXN0eGF0dHIgICAgICA9IGdlbmVyaWNfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0ciAgICA9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCi0jZW5kaWYKLSNlbmRpZgotfTsKLQotc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9ucyA9IHsKLSNpZmRlZiBDT05GSUdfVE1QRlNfWEFUVFIKLQkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAotCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCi0JLmxpc3R4YXR0cgk9IGdlbmVyaWNfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiAjZW5kaWYKIH07CiAKQEAgLTIxNDIsNDggKzIxMjIsNiBAQAogfTsKIAogCi0jaWZkZWYgQ09ORklHX1RNUEZTX1NFQ1VSSVRZCi0KLXN0YXRpYyBzaXplX3Qgc2htZW1feGF0dHJfc2VjdXJpdHlfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9sZW4sCi0JCQkJCWNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKLXsKLQlyZXR1cm4gc2VjdXJpdHlfaW5vZGVfbGlzdHNlY3VyaXR5KGlub2RlLCBsaXN0LCBsaXN0X2xlbik7Ci19Ci0KLXN0YXRpYyBpbnQgc2htZW1feGF0dHJfc2VjdXJpdHlfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCi17Ci0JaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIHNlY3VyaXR5X2lub2RlX2dldHNlY3VyaXR5KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOwotfQotCi1zdGF0aWMgaW50IHNobWVtX3hhdHRyX3NlY3VyaXR5X3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKLXsKLQlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gc2VjdXJpdHlfaW5vZGVfc2V0c2VjdXJpdHkoaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBzaG1lbV94YXR0cl9zZWN1cml0eV9oYW5kbGVyID0gewotCS5wcmVmaXgJPSBYQVRUUl9TRUNVUklUWV9QUkVGSVgsCi0JLmxpc3QJPSBzaG1lbV94YXR0cl9zZWN1cml0eV9saXN0LAotCS5nZXQJPSBzaG1lbV94YXR0cl9zZWN1cml0eV9nZXQsCi0JLnNldAk9IHNobWVtX3hhdHRyX3NlY3VyaXR5X3NldCwKLX07Ci0KLSNlbmRpZgkvKiBDT05GSUdfVE1QRlNfU0VDVVJJVFkgKi8KLQotI2lmZGVmIENPTkZJR19UTVBGU19YQVRUUgotCi1zdGF0aWMgc3RydWN0IHhhdHRyX2hhbmRsZXIgKnNobWVtX3hhdHRyX2hhbmRsZXJzW10gPSB7Ci0jaWZkZWYgQ09ORklHX1RNUEZTX1NFQ1VSSVRZCi0JJnNobWVtX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsCi0jZW5kaWYKLQlOVUxMCi19OwotCi0jZW5kaWYJLyogQ09ORklHX1RNUEZTX1hBVFRSICovCi0KIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNobWVtX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKIAlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQogewpkaWZmIC0tZ2l0IGEvbW0vc2xhYi5jIGIvbW0vc2xhYi5jCmluZGV4IGM5ZTcwNmQuLjllODc2ZDYgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTc1LDYgKzc1LDE1IEBACiAgKgogICoJQXQgcHJlc2VudCwgZWFjaCBlbmdpbmUgY2FuIGJlIGdyb3dpbmcgYSBjYWNoZS4gIFRoaXMgc2hvdWxkIGJlIGJsb2NrZWQuCiAgKgorICogMTUgTWFyY2ggMjAwNS4gTlVNQSBzbGFiIGFsbG9jYXRvci4KKyAqCVNoYWkgRnVsdGhlaW0gPHNoYWlAc2NhbGV4ODYub3JnPi4KKyAqCVNob2JoaXQgRGF5YWwgPHNob2JoaXRAY2Fsc29mdGluYy5jb20+CisgKglBbG9rIE4gS2F0YXJpYSA8YWxva2tAY2Fsc29mdGluYy5jb20+CisgKglDaHJpc3RvcGggTGFtZXRlciA8Y2hyaXN0b3BoQGxhbWV0ZXIuY29tPgorICoKKyAqCU1vZGlmaWVkIHRoZSBzbGFiIGFsbG9jYXRvciB0byBiZSBub2RlIGF3YXJlIG9uIE5VTUEgc3lzdGVtcy4KKyAqCUVhY2ggbm9kZSBoYXMgaXRzIG93biBsaXN0IG9mIHBhcnRpYWwsIGZyZWUgYW5kIGZ1bGwgc2xhYnMuCisgKglBbGwgb2JqZWN0IGFsbG9jYXRpb25zIGZvciBhIG5vZGUgb2NjdXIgZnJvbSBub2RlIHNwZWNpZmljIHNsYWIgbGlzdHMuCiAgKi8KIAogI2luY2x1ZGUJPGxpbnV4L2NvbmZpZy5oPgpAQCAtOTMsNiArMTAyLDcgQEAKICNpbmNsdWRlCTxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlCTxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUJPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUJPGxpbnV4L25vZGVtYXNrLmg+CiAKICNpbmNsdWRlCTxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUJPGFzbS9jYWNoZWZsdXNoLmg+CkBAIC0xODksNiArMTk5LDcgQEAKICAqIGlzIGxlc3MgdGhhbiA1MTIgKFBBR0VfU0laRTw8MyksIGJ1dCBncmVhdGVyIHRoYW4gMjU2LgogICovCiAKK3R5cGVkZWYgdW5zaWduZWQgaW50IGttZW1fYnVmY3RsX3Q7CiAjZGVmaW5lIEJVRkNUTF9FTkQJKCgoa21lbV9idWZjdGxfdCkofjBVKSktMCkKICNkZWZpbmUgQlVGQ1RMX0ZSRUUJKCgoa21lbV9idWZjdGxfdCkofjBVKSktMSkKICNkZWZpbmUJU0xBQl9MSU1JVAkoKChrbWVtX2J1ZmN0bF90KSh+MFUpKS0yKQpAQCAtMjExLDYgKzIyMiw3IEBACiAJdm9pZAkJCSpzX21lbTsJCS8qIGluY2x1ZGluZyBjb2xvdXIgb2Zmc2V0ICovCiAJdW5zaWduZWQgaW50CQlpbnVzZTsJCS8qIG51bSBvZiBvYmpzIGFjdGl2ZSBpbiBzbGFiICovCiAJa21lbV9idWZjdGxfdAkJZnJlZTsKKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICBub2RlaWQ7CiB9OwogCiAvKgpAQCAtMjM4LDcgKzI1MCw2IEBACiAvKgogICogc3RydWN0IGFycmF5X2NhY2hlCiAgKgotICogUGVyIGNwdSBzdHJ1Y3R1cmVzCiAgKiBQdXJwb3NlOgogICogLSBMSUZPIG9yZGVyaW5nLCB0byBoYW5kIG91dCBjYWNoZS13YXJtIG9iamVjdHMgZnJvbSBfYWxsb2MKICAqIC0gcmVkdWNlIHRoZSBudW1iZXIgb2YgbGlua2VkIGxpc3Qgb3BlcmF0aW9ucwpAQCAtMjUzLDYgKzI2NCwxMyBAQAogCXVuc2lnbmVkIGludCBsaW1pdDsKIAl1bnNpZ25lZCBpbnQgYmF0Y2hjb3VudDsKIAl1bnNpZ25lZCBpbnQgdG91Y2hlZDsKKwlzcGlubG9ja190IGxvY2s7CisJdm9pZCAqZW50cnlbMF07CQkvKgorCQkJCSAqIE11c3QgaGF2ZSB0aGlzIGRlZmluaXRpb24gaW4gaGVyZSBmb3IgdGhlIHByb3BlcgorCQkJCSAqIGFsaWdubWVudCBvZiBhcnJheV9jYWNoZS4gQWxzbyBzaW1wbGlmaWVzIGFjY2Vzc2luZworCQkJCSAqIHRoZSBlbnRyaWVzLgorCQkJCSAqIFswXSBpcyBmb3IgZ2NjIDIuOTUuIEl0IHNob3VsZCByZWFsbHkgYmUgW10uCisJCQkJICovCiB9OwogCiAvKiBib290c3RyYXA6IFRoZSBjYWNoZXMgZG8gbm90IHdvcmsgd2l0aG91dCBjcHVhcnJheXMgYW55bW9yZSwKQEAgLTI2NSwzNCArMjgzLDgzIEBACiB9OwogCiAvKgotICogVGhlIHNsYWIgbGlzdHMgb2YgYWxsIG9iamVjdHMuCi0gKiBIb3BlZnVsbHkgcmVkdWNlIHRoZSBpbnRlcm5hbCBmcmFnbWVudGF0aW9uCi0gKiBOVU1BOiBUaGUgc3BpbmxvY2sgY291bGQgYmUgbW92ZWQgZnJvbSB0aGUga21lbV9jYWNoZV90Ci0gKiBpbnRvIHRoaXMgc3RydWN0dXJlLCB0b28uIEZpZ3VyZSBvdXQgd2hhdCBjYXVzZXMKLSAqIGZld2VyIGNyb3NzLW5vZGUgc3BpbmxvY2sgb3BlcmF0aW9ucy4KKyAqIFRoZSBzbGFiIGxpc3RzIGZvciBhbGwgb2JqZWN0cy4KICAqLwogc3RydWN0IGttZW1fbGlzdDMgewogCXN0cnVjdCBsaXN0X2hlYWQJc2xhYnNfcGFydGlhbDsJLyogcGFydGlhbCBsaXN0IGZpcnN0LCBiZXR0ZXIgYXNtIGNvZGUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXNsYWJzX2Z1bGw7CiAJc3RydWN0IGxpc3RfaGVhZAlzbGFic19mcmVlOwogCXVuc2lnbmVkIGxvbmcJZnJlZV9vYmplY3RzOwotCWludAkJZnJlZV90b3VjaGVkOwogCXVuc2lnbmVkIGxvbmcJbmV4dF9yZWFwOwotCXN0cnVjdCBhcnJheV9jYWNoZQkqc2hhcmVkOworCWludAkJZnJlZV90b3VjaGVkOworCXVuc2lnbmVkIGludCAJZnJlZV9saW1pdDsKKwlzcGlubG9ja190ICAgICAgbGlzdF9sb2NrOworCXN0cnVjdCBhcnJheV9jYWNoZQkqc2hhcmVkOwkvKiBzaGFyZWQgcGVyIG5vZGUgKi8KKwlzdHJ1Y3QgYXJyYXlfY2FjaGUJKiphbGllbjsJLyogb24gb3RoZXIgbm9kZXMgKi8KIH07CiAKLSNkZWZpbmUgTElTVDNfSU5JVChwYXJlbnQpIFwKLQl7IFwKLQkJLnNsYWJzX2Z1bGwJPSBMSVNUX0hFQURfSU5JVChwYXJlbnQuc2xhYnNfZnVsbCksIFwKLQkJLnNsYWJzX3BhcnRpYWwJPSBMSVNUX0hFQURfSU5JVChwYXJlbnQuc2xhYnNfcGFydGlhbCksIFwKLQkJLnNsYWJzX2ZyZWUJPSBMSVNUX0hFQURfSU5JVChwYXJlbnQuc2xhYnNfZnJlZSkgXAotCX0KLSNkZWZpbmUgbGlzdDNfZGF0YShjYWNoZXApIFwKLQkoJihjYWNoZXApLT5saXN0cykKKy8qCisgKiBOZWVkIHRoaXMgZm9yIGJvb3RzdHJhcHBpbmcgYSBwZXIgbm9kZSBhbGxvY2F0b3IuCisgKi8KKyNkZWZpbmUgTlVNX0lOSVRfTElTVFMgKDIgKiBNQVhfTlVNTk9ERVMgKyAxKQorc3RydWN0IGttZW1fbGlzdDMgX19pbml0ZGF0YSBpbml0a21lbV9saXN0M1tOVU1fSU5JVF9MSVNUU107CisjZGVmaW5lCUNBQ0hFX0NBQ0hFIDAKKyNkZWZpbmUJU0laRV9BQyAxCisjZGVmaW5lCVNJWkVfTDMgKDEgKyBNQVhfTlVNTk9ERVMpCiAKLS8qIE5VTUE6IHBlci1ub2RlICovCi0jZGVmaW5lIGxpc3QzX2RhdGFfcHRyKGNhY2hlcCwgcHRyKSBcCi0JCWxpc3QzX2RhdGEoY2FjaGVwKQorLyoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNvbXBsZXRlbHkgb3B0aW1pemVkIGF3YXkgaWYKKyAqIGEgY29uc3RhbnQgaXMgcGFzc2VkIHRvIGl0LiBNb3N0bHkgdGhlIHNhbWUgYXMKKyAqIHdoYXQgaXMgaW4gbGludXgvc2xhYi5oIGV4Y2VwdCBpdCByZXR1cm5zIGFuCisgKiBpbmRleC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaW5kZXhfb2YoY29uc3Qgc2l6ZV90IHNpemUpCit7CisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKSB7CisJCWludCBpID0gMDsKKworI2RlZmluZSBDQUNIRSh4KSBcCisJaWYgKHNpemUgPD14KSBcCisJCXJldHVybiBpOyBcCisJZWxzZSBcCisJCWkrKzsKKyNpbmNsdWRlICJsaW51eC9rbWFsbG9jX3NpemVzLmgiCisjdW5kZWYgQ0FDSEUKKwkJeworCQkJZXh0ZXJuIHZvaWQgX19iYWRfc2l6ZSh2b2lkKTsKKwkJCV9fYmFkX3NpemUoKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBJTkRFWF9BQyBpbmRleF9vZihzaXplb2Yoc3RydWN0IGFycmF5Y2FjaGVfaW5pdCkpCisjZGVmaW5lIElOREVYX0wzIGluZGV4X29mKHNpemVvZihzdHJ1Y3Qga21lbV9saXN0MykpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrbWVtX2xpc3QzX2luaXQoc3RydWN0IGttZW1fbGlzdDMgKnBhcmVudCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmcGFyZW50LT5zbGFic19mdWxsKTsKKwlJTklUX0xJU1RfSEVBRCgmcGFyZW50LT5zbGFic19wYXJ0aWFsKTsKKwlJTklUX0xJU1RfSEVBRCgmcGFyZW50LT5zbGFic19mcmVlKTsKKwlwYXJlbnQtPnNoYXJlZCA9IE5VTEw7CisJcGFyZW50LT5hbGllbiA9IE5VTEw7CisJc3Bpbl9sb2NrX2luaXQoJnBhcmVudC0+bGlzdF9sb2NrKTsKKwlwYXJlbnQtPmZyZWVfb2JqZWN0cyA9IDA7CisJcGFyZW50LT5mcmVlX3RvdWNoZWQgPSAwOworfQorCisjZGVmaW5lIE1BS0VfTElTVChjYWNoZXAsIGxpc3RwLCBzbGFiLCBub2RlaWQpCVwKKwlkbyB7CVwKKwkJSU5JVF9MSVNUX0hFQUQobGlzdHApOwkJXAorCQlsaXN0X3NwbGljZSgmKGNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF0tPnNsYWIpLCBsaXN0cCk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lCU1BS0VfQUxMX0xJU1RTKGNhY2hlcCwgcHRyLCBub2RlaWQpCQkJXAorCWRvIHsJCQkJCVwKKwlNQUtFX0xJU1QoKGNhY2hlcCksICgmKHB0ciktPnNsYWJzX2Z1bGwpLCBzbGFic19mdWxsLCBub2RlaWQpOwlcCisJTUFLRV9MSVNUKChjYWNoZXApLCAoJihwdHIpLT5zbGFic19wYXJ0aWFsKSwgc2xhYnNfcGFydGlhbCwgbm9kZWlkKTsgXAorCU1BS0VfTElTVCgoY2FjaGVwKSwgKCYocHRyKS0+c2xhYnNfZnJlZSksIHNsYWJzX2ZyZWUsIG5vZGVpZCk7CVwKKwl9IHdoaWxlICgwKQogCiAvKgogICoga21lbV9jYWNoZV90CkBAIC0zMDUsMTMgKzM3MiwxMiBAQAogCXN0cnVjdCBhcnJheV9jYWNoZQkqYXJyYXlbTlJfQ1BVU107CiAJdW5zaWduZWQgaW50CQliYXRjaGNvdW50OwogCXVuc2lnbmVkIGludAkJbGltaXQ7Ci0vKiAyKSB0b3VjaGVkIGJ5IGV2ZXJ5IGFsbG9jICYgZnJlZSBmcm9tIHRoZSBiYWNrZW5kICovCi0Jc3RydWN0IGttZW1fbGlzdDMJbGlzdHM7Ci0JLyogTlVNQToga21lbV8zbGlzdF90CSpub2RlbGlzdHNbTUFYX05VTU5PREVTXSAqLworCXVuc2lnbmVkIGludCAJCXNoYXJlZDsKIAl1bnNpZ25lZCBpbnQJCW9ianNpemU7CisvKiAyKSB0b3VjaGVkIGJ5IGV2ZXJ5IGFsbG9jICYgZnJlZSBmcm9tIHRoZSBiYWNrZW5kICovCisJc3RydWN0IGttZW1fbGlzdDMJKm5vZGVsaXN0c1tNQVhfTlVNTk9ERVNdOwogCXVuc2lnbmVkIGludAkgCWZsYWdzOwkvKiBjb25zdGFudCBmbGFncyAqLwogCXVuc2lnbmVkIGludAkJbnVtOwkvKiAjIG9mIG9ianMgcGVyIHNsYWIgKi8KLQl1bnNpZ25lZCBpbnQJCWZyZWVfbGltaXQ7IC8qIHVwcGVyIGxpbWl0IG9mIG9iamVjdHMgaW4gdGhlIGxpc3RzICovCiAJc3BpbmxvY2tfdAkJc3BpbmxvY2s7CiAKIC8qIDMpIGNhY2hlX2dyb3cvc2hyaW5rICovCkBAIC0zNDgsNiArNDE0LDcgQEAKIAl1bnNpZ25lZCBsb25nIAkJZXJyb3JzOwogCXVuc2lnbmVkIGxvbmcJCW1heF9mcmVlYWJsZTsKIAl1bnNpZ25lZCBsb25nCQlub2RlX2FsbG9jczsKKwl1bnNpZ25lZCBsb25nCQlub2RlX2ZyZWVzOwogCWF0b21pY190CQlhbGxvY2hpdDsKIAlhdG9taWNfdAkJYWxsb2NtaXNzOwogCWF0b21pY190CQlmcmVlaGl0OwpAQCAtMzgzLDYgKzQ1MCw3IEBACiAJCQkJfSB3aGlsZSAoMCkKICNkZWZpbmUJU1RBVFNfSU5DX0VSUih4KQkoKHgpLT5lcnJvcnMrKykKICNkZWZpbmUJU1RBVFNfSU5DX05PREVBTExPQ1MoeCkJKCh4KS0+bm9kZV9hbGxvY3MrKykKKyNkZWZpbmUJU1RBVFNfSU5DX05PREVGUkVFUyh4KQkoKHgpLT5ub2RlX2ZyZWVzKyspCiAjZGVmaW5lCVNUQVRTX1NFVF9GUkVFQUJMRSh4LCBpKSBcCiAJCQkJZG8geyBpZiAoKHgpLT5tYXhfZnJlZWFibGUgPCBpKSBcCiAJCQkJCSh4KS0+bWF4X2ZyZWVhYmxlID0gaTsgXApAQCAtNDAxLDYgKzQ2OSw3IEBACiAjZGVmaW5lCVNUQVRTX1NFVF9ISUdIKHgpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUJU1RBVFNfSU5DX0VSUih4KQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lCVNUQVRTX0lOQ19OT0RFQUxMT0NTKHgpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUJU1RBVFNfSU5DX05PREVGUkVFUyh4KQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lCVNUQVRTX1NFVF9GUkVFQUJMRSh4LCBpKSBcCiAJCQkJZG8geyB9IHdoaWxlICgwKQogCkBAIC01MzMsOSArNjAyLDkgQEAKIAogLyogaW50ZXJuYWwgY2FjaGUgb2YgY2FjaGUgZGVzY3JpcHRpb24gb2JqcyAqLwogc3RhdGljIGttZW1fY2FjaGVfdCBjYWNoZV9jYWNoZSA9IHsKLQkubGlzdHMJCT0gTElTVDNfSU5JVChjYWNoZV9jYWNoZS5saXN0cyksCiAJLmJhdGNoY291bnQJPSAxLAogCS5saW1pdAkJPSBCT09UX0NQVUNBQ0hFX0VOVFJJRVMsCisJLnNoYXJlZAkJPSAxLAogCS5vYmpzaXplCT0gc2l6ZW9mKGttZW1fY2FjaGVfdCksCiAJLmZsYWdzCQk9IFNMQUJfTk9fUkVBUCwKIAkuc3BpbmxvY2sJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCkBAIC01NTYsNyArNjI1LDYgQEAKICAqIFNMQUJfUkVDTEFJTV9BQ0NPVU5UIHR1cm5zIHRoaXMgb24gcGVyLXNsYWIKICAqLwogYXRvbWljX3Qgc2xhYl9yZWNsYWltX3BhZ2VzOwotRVhQT1JUX1NZTUJPTChzbGFiX3JlY2xhaW1fcGFnZXMpOwogCiAvKgogICogY2hpY2tlbiBhbmQgZWdnIHByb2JsZW06IGRlbGF5IHRoZSBwZXItY3B1IGFycmF5IGFsbG9jYXRpb24KQEAgLTU2NCw3ICs2MzIsOCBAQAogICovCiBzdGF0aWMgZW51bSB7CiAJTk9ORSwKLQlQQVJUSUFMLAorCVBBUlRJQUxfQUMsCisJUEFSVElBTF9MMywKIAlGVUxMCiB9IGdfY3B1Y2FjaGVfdXA7CiAKQEAgLTU3MywxMSArNjQyLDcgQEAKIHN0YXRpYyB2b2lkIGZyZWVfYmxvY2soa21lbV9jYWNoZV90KiBjYWNoZXAsIHZvaWQqKiBvYmpwcCwgaW50IGxlbik7CiBzdGF0aWMgdm9pZCBlbmFibGVfY3B1Y2FjaGUgKGttZW1fY2FjaGVfdCAqY2FjaGVwKTsKIHN0YXRpYyB2b2lkIGNhY2hlX3JlYXAgKHZvaWQgKnVudXNlZCk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqKmFjX2VudHJ5KHN0cnVjdCBhcnJheV9jYWNoZSAqYWMpCi17Ci0JcmV0dXJuICh2b2lkKiopKGFjKzEpOwotfQorc3RhdGljIGludCBfX25vZGVfc2hyaW5rKGttZW1fY2FjaGVfdCAqY2FjaGVwLCBpbnQgbm9kZSk7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGFycmF5X2NhY2hlICphY19kYXRhKGttZW1fY2FjaGVfdCAqY2FjaGVwKQogewpAQCAtNjAwLDcgKzY2NSw3IEBACiAJCWNzaXplcCsrOwogCiAJLyoKLQkgKiBSZWFsbHkgc3VidGlsZTogVGhlIGxhc3QgZW50cnkgd2l0aCBjcy0+Y3Nfc2l6ZT09VUxPTkdfTUFYCisJICogUmVhbGx5IHN1YnRsZTogVGhlIGxhc3QgZW50cnkgd2l0aCBjcy0+Y3Nfc2l6ZT09VUxPTkdfTUFYCiAJICogaGFzIGNzX3tkbWEsfWNhY2hlcD09TlVMTC4gVGh1cyBubyBzcGVjaWFsIGNhc2UKIAkgKiBmb3IgbGFyZ2Uga21hbGxvYyBjYWxscyByZXF1aXJlZC4KIAkgKi8KQEAgLTY3NSw0OCArNzQwLDE2MCBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBhcnJheV9jYWNoZSAqYWxsb2NfYXJyYXljYWNoZShpbnQgY3B1LCBpbnQgZW50cmllcywKK3N0YXRpYyBzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFsbG9jX2FycmF5Y2FjaGUoaW50IG5vZGUsIGludCBlbnRyaWVzLAogCQkJCQkJaW50IGJhdGNoY291bnQpCiB7CiAJaW50IG1lbXNpemUgPSBzaXplb2Yodm9pZCopKmVudHJpZXMrc2l6ZW9mKHN0cnVjdCBhcnJheV9jYWNoZSk7CiAJc3RydWN0IGFycmF5X2NhY2hlICpuYyA9IE5VTEw7CiAKLQlpZiAoY3B1ID09IC0xKQotCQluYyA9IGttYWxsb2MobWVtc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JZWxzZQotCQluYyA9IGttYWxsb2Nfbm9kZShtZW1zaXplLCBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjcHUpKTsKLQorCW5jID0ga21hbGxvY19ub2RlKG1lbXNpemUsIEdGUF9LRVJORUwsIG5vZGUpOwogCWlmIChuYykgewogCQluYy0+YXZhaWwgPSAwOwogCQluYy0+bGltaXQgPSBlbnRyaWVzOwogCQluYy0+YmF0Y2hjb3VudCA9IGJhdGNoY291bnQ7CiAJCW5jLT50b3VjaGVkID0gMDsKKwkJc3Bpbl9sb2NrX2luaXQoJm5jLT5sb2NrKTsKIAl9CiAJcmV0dXJuIG5jOwogfQogCisjaWZkZWYgQ09ORklHX05VTUEKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFycmF5X2NhY2hlICoqYWxsb2NfYWxpZW5fY2FjaGUoaW50IG5vZGUsIGludCBsaW1pdCkKK3sKKwlzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphY19wdHI7CisJaW50IG1lbXNpemUgPSBzaXplb2Yodm9pZCopKk1BWF9OVU1OT0RFUzsKKwlpbnQgaTsKKworCWlmIChsaW1pdCA+IDEpCisJCWxpbWl0ID0gMTI7CisJYWNfcHRyID0ga21hbGxvY19ub2RlKG1lbXNpemUsIEdGUF9LRVJORUwsIG5vZGUpOworCWlmIChhY19wdHIpIHsKKwkJZm9yX2VhY2hfbm9kZShpKSB7CisJCQlpZiAoaSA9PSBub2RlIHx8ICFub2RlX29ubGluZShpKSkgeworCQkJCWFjX3B0cltpXSA9IE5VTEw7CisJCQkJY29udGludWU7CisJCQl9CisJCQlhY19wdHJbaV0gPSBhbGxvY19hcnJheWNhY2hlKG5vZGUsIGxpbWl0LCAweGJhYWRmMDBkKTsKKwkJCWlmICghYWNfcHRyW2ldKSB7CisJCQkJZm9yIChpLS07IGkgPD0wOyBpLS0pCisJCQkJCWtmcmVlKGFjX3B0cltpXSk7CisJCQkJa2ZyZWUoYWNfcHRyKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gYWNfcHRyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9hbGllbl9jYWNoZShzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphY19wdHIpCit7CisJaW50IGk7CisKKwlpZiAoIWFjX3B0cikKKwkJcmV0dXJuOworCisJZm9yX2VhY2hfbm9kZShpKQorCQlrZnJlZShhY19wdHJbaV0pOworCisJa2ZyZWUoYWNfcHRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZHJhaW5fYWxpZW5fY2FjaGUoa21lbV9jYWNoZV90ICpjYWNoZXAsIHN0cnVjdCBhcnJheV9jYWNoZSAqYWMsIGludCBub2RlKQoreworCXN0cnVjdCBrbWVtX2xpc3QzICpybDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tub2RlXTsKKworCWlmIChhYy0+YXZhaWwpIHsKKwkJc3Bpbl9sb2NrKCZybDMtPmxpc3RfbG9jayk7CisJCWZyZWVfYmxvY2soY2FjaGVwLCBhYy0+ZW50cnksIGFjLT5hdmFpbCk7CisJCWFjLT5hdmFpbCA9IDA7CisJCXNwaW5fdW5sb2NrKCZybDMtPmxpc3RfbG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkcmFpbl9hbGllbl9jYWNoZShrbWVtX2NhY2hlX3QgKmNhY2hlcCwgc3RydWN0IGttZW1fbGlzdDMgKmwzKQoreworCWludCBpPTA7CisJc3RydWN0IGFycmF5X2NhY2hlICphYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkgeworCQlhYyA9IGwzLT5hbGllbltpXTsKKwkJaWYgKGFjKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWMtPmxvY2ssIGZsYWdzKTsKKwkJCV9fZHJhaW5fYWxpZW5fY2FjaGUoY2FjaGVwLCBhYywgaSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhYy0+bG9jaywgZmxhZ3MpOworCQl9CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgYWxsb2NfYWxpZW5fY2FjaGUobm9kZSwgbGltaXQpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZnJlZV9hbGllbl9jYWNoZShhY19wdHIpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZHJhaW5fYWxpZW5fY2FjaGUoY2FjaGVwLCBsMykgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGNwdXVwX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAogCQkJCSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7CiAJbG9uZyBjcHUgPSAobG9uZyloY3B1OwogCWttZW1fY2FjaGVfdCogY2FjaGVwOworCXN0cnVjdCBrbWVtX2xpc3QzICpsMyA9IE5VTEw7CisJaW50IG5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOworCWludCBtZW1zaXplID0gc2l6ZW9mKHN0cnVjdCBrbWVtX2xpc3QzKTsKKwlzdHJ1Y3QgYXJyYXlfY2FjaGUgKm5jID0gTlVMTDsKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBDUFVfVVBfUFJFUEFSRToKIAkJZG93bigmY2FjaGVfY2hhaW5fc2VtKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjYWNoZXAsICZjYWNoZV9jaGFpbiwgbmV4dCkgewotCQkJc3RydWN0IGFycmF5X2NhY2hlICpuYzsKKwkJLyogd2UgbmVlZCB0byBkbyB0aGlzIHJpZ2h0IGluIHRoZSBiZWdpbm5pbmcgc2luY2UKKwkJICogYWxsb2NfYXJyYXljYWNoZSdzIGFyZSBnb2luZyB0byB1c2UgdGhpcyBsaXN0LgorCQkgKiBrbWFsbG9jX25vZGUgYWxsb3dzIHVzIHRvIGFkZCB0aGUgc2xhYiB0byB0aGUgcmlnaHQKKwkJICoga21lbV9saXN0MyBhbmQgbm90IHRoaXMgY3B1J3Mga21lbV9saXN0MworCQkgKi8KIAotCQkJbmMgPSBhbGxvY19hcnJheWNhY2hlKGNwdSwgY2FjaGVwLT5saW1pdCwgY2FjaGVwLT5iYXRjaGNvdW50KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjYWNoZXAsICZjYWNoZV9jaGFpbiwgbmV4dCkgeworCQkJLyogc2V0dXAgdGhlIHNpemU2NCBrbWVtbGlzdCBmb3IgY3B1IGJlZm9yZSB3ZSBjYW4KKwkJCSAqIGJlZ2luIGFueXRoaW5nLiBNYWtlIHN1cmUgc29tZSBvdGhlciBjcHUgb24gdGhpcworCQkJICogbm9kZSBoYXMgbm90IGFscmVhZHkgYWxsb2NhdGVkIHRoaXMKKwkJCSAqLworCQkJaWYgKCFjYWNoZXAtPm5vZGVsaXN0c1tub2RlXSkgeworCQkJCWlmICghKGwzID0ga21hbGxvY19ub2RlKG1lbXNpemUsCisJCQkJCQlHRlBfS0VSTkVMLCBub2RlKSkpCisJCQkJCWdvdG8gYmFkOworCQkJCWttZW1fbGlzdDNfaW5pdChsMyk7CisJCQkJbDMtPm5leHRfcmVhcCA9IGppZmZpZXMgKyBSRUFQVElNRU9VVF9MSVNUMyArCisJCQkJICAoKHVuc2lnbmVkIGxvbmcpY2FjaGVwKSVSRUFQVElNRU9VVF9MSVNUMzsKKworCQkJCWNhY2hlcC0+bm9kZWxpc3RzW25vZGVdID0gbDM7CisJCQl9CisKKwkJCXNwaW5fbG9ja19pcnEoJmNhY2hlcC0+bm9kZWxpc3RzW25vZGVdLT5saXN0X2xvY2spOworCQkJY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0tPmZyZWVfbGltaXQgPQorCQkJCSgxICsgbnJfY3B1c19ub2RlKG5vZGUpKSAqCisJCQkJY2FjaGVwLT5iYXRjaGNvdW50ICsgY2FjaGVwLT5udW07CisJCQlzcGluX3VubG9ja19pcnEoJmNhY2hlcC0+bm9kZWxpc3RzW25vZGVdLT5saXN0X2xvY2spOworCQl9CisKKwkJLyogTm93IHdlIGNhbiBnbyBhaGVhZCB3aXRoIGFsbG9jYXRpbmcgdGhlIHNoYXJlZCBhcnJheSdzCisJCSAgJiBhcnJheSBjYWNoZSdzICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FjaGVwLCAmY2FjaGVfY2hhaW4sIG5leHQpIHsKKwkJCW5jID0gYWxsb2NfYXJyYXljYWNoZShub2RlLCBjYWNoZXAtPmxpbWl0LAorCQkJCQljYWNoZXAtPmJhdGNoY291bnQpOwogCQkJaWYgKCFuYykKIAkJCQlnb3RvIGJhZDsKLQotCQkJc3Bpbl9sb2NrX2lycSgmY2FjaGVwLT5zcGlubG9jayk7CiAJCQljYWNoZXAtPmFycmF5W2NwdV0gPSBuYzsKLQkJCWNhY2hlcC0+ZnJlZV9saW1pdCA9ICgxK251bV9vbmxpbmVfY3B1cygpKSpjYWNoZXAtPmJhdGNoY291bnQKLQkJCQkJCSsgY2FjaGVwLT5udW07Ci0JCQlzcGluX3VubG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwogCisJCQlsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW25vZGVdOworCQkJQlVHX09OKCFsMyk7CisJCQlpZiAoIWwzLT5zaGFyZWQpIHsKKwkJCQlpZiAoIShuYyA9IGFsbG9jX2FycmF5Y2FjaGUobm9kZSwKKwkJCQkJY2FjaGVwLT5zaGFyZWQqY2FjaGVwLT5iYXRjaGNvdW50LAorCQkJCQkweGJhYWRmMDBkKSkpCisJCQkJCWdvdG8gIGJhZDsKKworCQkJCS8qIHdlIGFyZSBzZXJpYWxpc2VkIGZyb20gQ1BVX0RFQUQgb3IKKwkJCQkgIENQVV9VUF9DQU5DRUxMRUQgYnkgdGhlIGNwdWNvbnRyb2wgbG9jayAqLworCQkJCWwzLT5zaGFyZWQgPSBuYzsKKwkJCX0KIAkJfQogCQl1cCgmY2FjaGVfY2hhaW5fc2VtKTsKIAkJYnJlYWs7CkBAIC03MzEsMTMgKzkwOCw1MSBAQAogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FjaGVwLCAmY2FjaGVfY2hhaW4sIG5leHQpIHsKIAkJCXN0cnVjdCBhcnJheV9jYWNoZSAqbmM7CisJCQljcHVtYXNrX3QgbWFzazsKIAorCQkJbWFzayA9IG5vZGVfdG9fY3B1bWFzayhub2RlKTsKIAkJCXNwaW5fbG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwogCQkJLyogY3B1IGlzIGRlYWQ7IG5vIG9uZSBjYW4gYWxsb2MgZnJvbSBpdC4gKi8KIAkJCW5jID0gY2FjaGVwLT5hcnJheVtjcHVdOwogCQkJY2FjaGVwLT5hcnJheVtjcHVdID0gTlVMTDsKLQkJCWNhY2hlcC0+ZnJlZV9saW1pdCAtPSBjYWNoZXAtPmJhdGNoY291bnQ7Ci0JCQlmcmVlX2Jsb2NrKGNhY2hlcCwgYWNfZW50cnkobmMpLCBuYy0+YXZhaWwpOworCQkJbDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tub2RlXTsKKworCQkJaWYgKCFsMykKKwkJCQlnb3RvIHVubG9ja19jYWNoZTsKKworCQkJc3Bpbl9sb2NrKCZsMy0+bGlzdF9sb2NrKTsKKworCQkJLyogRnJlZSBsaW1pdCBmb3IgdGhpcyBrbWVtX2xpc3QzICovCisJCQlsMy0+ZnJlZV9saW1pdCAtPSBjYWNoZXAtPmJhdGNoY291bnQ7CisJCQlpZiAobmMpCisJCQkJZnJlZV9ibG9jayhjYWNoZXAsIG5jLT5lbnRyeSwgbmMtPmF2YWlsKTsKKworCQkJaWYgKCFjcHVzX2VtcHR5KG1hc2spKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZsMy0+bGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB1bmxvY2tfY2FjaGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKwkJCWlmIChsMy0+c2hhcmVkKSB7CisJCQkJZnJlZV9ibG9jayhjYWNoZXAsIGwzLT5zaGFyZWQtPmVudHJ5LAorCQkJCQkJbDMtPnNoYXJlZC0+YXZhaWwpOworCQkJCWtmcmVlKGwzLT5zaGFyZWQpOworCQkJCWwzLT5zaGFyZWQgPSBOVUxMOworCQkJfQorCQkJaWYgKGwzLT5hbGllbikgeworCQkJCWRyYWluX2FsaWVuX2NhY2hlKGNhY2hlcCwgbDMpOworCQkJCWZyZWVfYWxpZW5fY2FjaGUobDMtPmFsaWVuKTsKKwkJCQlsMy0+YWxpZW4gPSBOVUxMOworCQkJfQorCisJCQkvKiBmcmVlIHNsYWJzIGJlbG9uZ2luZyB0byB0aGlzIG5vZGUgKi8KKwkJCWlmIChfX25vZGVfc2hyaW5rKGNhY2hlcCwgbm9kZSkpIHsKKwkJCQljYWNoZXAtPm5vZGVsaXN0c1tub2RlXSA9IE5VTEw7CisJCQkJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOworCQkJCWtmcmVlKGwzKTsKKwkJCX0gZWxzZSB7CisJCQkJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOworCQkJfQordW5sb2NrX2NhY2hlOgogCQkJc3Bpbl91bmxvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKIAkJCWtmcmVlKG5jKTsKIAkJfQpAQCAtNzUzLDYgKzk2OCwyNSBAQAogCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNwdWNhY2hlX25vdGlmaWVyID0geyAmY3B1dXBfY2FsbGJhY2ssIE5VTEwsIDAgfTsKIAorLyoKKyAqIHN3YXAgdGhlIHN0YXRpYyBrbWVtX2xpc3QzIHdpdGgga21hbGxvY2VkIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBpbml0X2xpc3Qoa21lbV9jYWNoZV90ICpjYWNoZXAsIHN0cnVjdCBrbWVtX2xpc3QzICpsaXN0LAorCQlpbnQgbm9kZWlkKQoreworCXN0cnVjdCBrbWVtX2xpc3QzICpwdHI7CisKKwlCVUdfT04oY2FjaGVwLT5ub2RlbGlzdHNbbm9kZWlkXSAhPSBsaXN0KTsKKwlwdHIgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBrbWVtX2xpc3QzKSwgR0ZQX0tFUk5FTCwgbm9kZWlkKTsKKwlCVUdfT04oIXB0cik7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCW1lbWNweShwdHIsIGxpc3QsIHNpemVvZihzdHJ1Y3Qga21lbV9saXN0MykpOworCU1BS0VfQUxMX0xJU1RTKGNhY2hlcCwgcHRyLCBub2RlaWQpOworCWNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF0gPSBwdHI7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCiAvKiBJbml0aWFsaXNhdGlvbi4KICAqIENhbGxlZCBhZnRlciB0aGUgZ2ZwKCkgZnVuY3Rpb25zIGhhdmUgYmVlbiBlbmFibGVkLCBhbmQgYmVmb3JlIHNtcF9pbml0KCkuCiAgKi8KQEAgLTc2MSw2ICs5OTUsMTMgQEAKIAlzaXplX3QgbGVmdF9vdmVyOwogCXN0cnVjdCBjYWNoZV9zaXplcyAqc2l6ZXM7CiAJc3RydWN0IGNhY2hlX25hbWVzICpuYW1lczsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fSU5JVF9MSVNUUzsgaSsrKSB7CisJCWttZW1fbGlzdDNfaW5pdCgmaW5pdGttZW1fbGlzdDNbaV0pOworCQlpZiAoaSA8IE1BWF9OVU1OT0RFUykKKwkJCWNhY2hlX2NhY2hlLm5vZGVsaXN0c1tpXSA9IE5VTEw7CisJfQogCiAJLyoKIAkgKiBGcmFnbWVudGF0aW9uIHJlc2lzdGFuY2Ugb24gbG93IG1lbW9yeSAtIG9ubHkgdXNlIGJpZ2dlcgpAQCAtNzY5LDIxICsxMDEwLDI0IEBACiAJaWYgKG51bV9waHlzcGFnZXMgPiAoMzIgPDwgMjApID4+IFBBR0VfU0hJRlQpCiAJCXNsYWJfYnJlYWtfZ2ZwX29yZGVyID0gQlJFQUtfR0ZQX09SREVSX0hJOwogCi0JCiAJLyogQm9vdHN0cmFwIGlzIHRyaWNreSwgYmVjYXVzZSBzZXZlcmFsIG9iamVjdHMgYXJlIGFsbG9jYXRlZAogCSAqIGZyb20gY2FjaGVzIHRoYXQgZG8gbm90IGV4aXN0IHlldDoKIAkgKiAxKSBpbml0aWFsaXplIHRoZSBjYWNoZV9jYWNoZSBjYWNoZTogaXQgY29udGFpbnMgdGhlIGttZW1fY2FjaGVfdAogCSAqICAgIHN0cnVjdHVyZXMgb2YgYWxsIGNhY2hlcywgZXhjZXB0IGNhY2hlX2NhY2hlIGl0c2VsZjogY2FjaGVfY2FjaGUKIAkgKiAgICBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4KLQkgKiAgICBJbml0aWFsbHkgYW4gX19pbml0IGRhdGEgYXJlYSBpcyB1c2VkIGZvciB0aGUgaGVhZCBhcnJheSwgaXQncwotCSAqICAgIHJlcGxhY2VkIHdpdGggYSBrbWFsbG9jIGFsbG9jYXRlZCBhcnJheSBhdCB0aGUgZW5kIG9mIHRoZSBib290c3RyYXAuCisJICogICAgSW5pdGlhbGx5IGFuIF9faW5pdCBkYXRhIGFyZWEgaXMgdXNlZCBmb3IgdGhlIGhlYWQgYXJyYXkgYW5kIHRoZQorCSAqICAgIGttZW1fbGlzdDMgc3RydWN0dXJlcywgaXQncyByZXBsYWNlZCB3aXRoIGEga21hbGxvYyBhbGxvY2F0ZWQKKwkgKiAgICBhcnJheSBhdCB0aGUgZW5kIG9mIHRoZSBib290c3RyYXAuCiAJICogMikgQ3JlYXRlIHRoZSBmaXJzdCBrbWFsbG9jIGNhY2hlLgotCSAqICAgIFRoZSBrbWVtX2NhY2hlX3QgZm9yIHRoZSBuZXcgY2FjaGUgaXMgYWxsb2NhdGVkIG5vcm1hbGx5LiBBbiBfX2luaXQKLQkgKiAgICBkYXRhIGFyZWEgaXMgdXNlZCBmb3IgdGhlIGhlYWQgYXJyYXkuCi0JICogMykgQ3JlYXRlIHRoZSByZW1haW5pbmcga21hbGxvYyBjYWNoZXMsIHdpdGggbWluaW1hbGx5IHNpemVkIGhlYWQgYXJyYXlzLgorCSAqICAgIFRoZSBrbWVtX2NhY2hlX3QgZm9yIHRoZSBuZXcgY2FjaGUgaXMgYWxsb2NhdGVkIG5vcm1hbGx5LgorCSAqICAgIEFuIF9faW5pdCBkYXRhIGFyZWEgaXMgdXNlZCBmb3IgdGhlIGhlYWQgYXJyYXkuCisJICogMykgQ3JlYXRlIHRoZSByZW1haW5pbmcga21hbGxvYyBjYWNoZXMsIHdpdGggbWluaW1hbGx5IHNpemVkCisJICogICAgaGVhZCBhcnJheXMuCiAJICogNCkgUmVwbGFjZSB0aGUgX19pbml0IGRhdGEgaGVhZCBhcnJheXMgZm9yIGNhY2hlX2NhY2hlIGFuZCB0aGUgZmlyc3QKIAkgKiAgICBrbWFsbG9jIGNhY2hlIHdpdGgga21hbGxvYyBhbGxvY2F0ZWQgYXJyYXlzLgotCSAqIDUpIFJlc2l6ZSB0aGUgaGVhZCBhcnJheXMgb2YgdGhlIGttYWxsb2MgY2FjaGVzIHRvIHRoZWlyIGZpbmFsIHNpemVzLgorCSAqIDUpIFJlcGxhY2UgdGhlIF9faW5pdCBkYXRhIGZvciBrbWVtX2xpc3QzIGZvciBjYWNoZV9jYWNoZSBhbmQKKwkgKiAgICB0aGUgb3RoZXIgY2FjaGUncyB3aXRoIGttYWxsb2MgYWxsb2NhdGVkIG1lbW9yeS4KKwkgKiA2KSBSZXNpemUgdGhlIGhlYWQgYXJyYXlzIG9mIHRoZSBrbWFsbG9jIGNhY2hlcyB0byB0aGVpciBmaW5hbCBzaXplcy4KIAkgKi8KIAogCS8qIDEpIGNyZWF0ZSB0aGUgY2FjaGVfY2FjaGUgKi8KQEAgLTc5Miw2ICsxMDM2LDcgQEAKIAlsaXN0X2FkZCgmY2FjaGVfY2FjaGUubmV4dCwgJmNhY2hlX2NoYWluKTsKIAljYWNoZV9jYWNoZS5jb2xvdXJfb2ZmID0gY2FjaGVfbGluZV9zaXplKCk7CiAJY2FjaGVfY2FjaGUuYXJyYXlbc21wX3Byb2Nlc3Nvcl9pZCgpXSA9ICZpbml0YXJyYXlfY2FjaGUuY2FjaGU7CisJY2FjaGVfY2FjaGUubm9kZWxpc3RzW251bWFfbm9kZV9pZCgpXSA9ICZpbml0a21lbV9saXN0M1tDQUNIRV9DQUNIRV07CiAKIAljYWNoZV9jYWNoZS5vYmpzaXplID0gQUxJR04oY2FjaGVfY2FjaGUub2Jqc2l6ZSwgY2FjaGVfbGluZV9zaXplKCkpOwogCkBAIC04MDksMTUgKzEwNTQsMzMgQEAKIAlzaXplcyA9IG1hbGxvY19zaXplczsKIAluYW1lcyA9IGNhY2hlX25hbWVzOwogCisJLyogSW5pdGlhbGl6ZSB0aGUgY2FjaGVzIHRoYXQgcHJvdmlkZSBtZW1vcnkgZm9yIHRoZSBhcnJheSBjYWNoZQorCSAqIGFuZCB0aGUga21lbV9saXN0MyBzdHJ1Y3R1cmVzIGZpcnN0LgorCSAqIFdpdGhvdXQgdGhpcywgZnVydGhlciBhbGxvY2F0aW9ucyB3aWxsIGJ1ZworCSAqLworCisJc2l6ZXNbSU5ERVhfQUNdLmNzX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKG5hbWVzW0lOREVYX0FDXS5uYW1lLAorCQkJCXNpemVzW0lOREVYX0FDXS5jc19zaXplLCBBUkNIX0tNQUxMT0NfTUlOQUxJR04sCisJCQkJKEFSQ0hfS01BTExPQ19GTEFHUyB8IFNMQUJfUEFOSUMpLCBOVUxMLCBOVUxMKTsKKworCWlmIChJTkRFWF9BQyAhPSBJTkRFWF9MMykKKwkJc2l6ZXNbSU5ERVhfTDNdLmNzX2NhY2hlcCA9CisJCQlrbWVtX2NhY2hlX2NyZWF0ZShuYW1lc1tJTkRFWF9MM10ubmFtZSwKKwkJCQlzaXplc1tJTkRFWF9MM10uY3Nfc2l6ZSwgQVJDSF9LTUFMTE9DX01JTkFMSUdOLAorCQkJCShBUkNIX0tNQUxMT0NfRkxBR1MgfCBTTEFCX1BBTklDKSwgTlVMTCwgTlVMTCk7CisKIAl3aGlsZSAoc2l6ZXMtPmNzX3NpemUgIT0gVUxPTkdfTUFYKSB7Ci0JCS8qIEZvciBwZXJmb3JtYW5jZSwgYWxsIHRoZSBnZW5lcmFsIGNhY2hlcyBhcmUgTDEgYWxpZ25lZC4KKwkJLyoKKwkJICogRm9yIHBlcmZvcm1hbmNlLCBhbGwgdGhlIGdlbmVyYWwgY2FjaGVzIGFyZSBMMSBhbGlnbmVkLgogCQkgKiBUaGlzIHNob3VsZCBiZSBwYXJ0aWN1bGFybHkgYmVuZWZpY2lhbCBvbiBTTVAgYm94ZXMsIGFzIGl0CiAJCSAqIGVsaW1pbmF0ZXMgImZhbHNlIHNoYXJpbmciLgogCQkgKiBOb3RlIGZvciBzeXN0ZW1zIHNob3J0IG9uIG1lbW9yeSByZW1vdmluZyB0aGUgYWxpZ25tZW50IHdpbGwKLQkJICogYWxsb3cgdGlnaHRlciBwYWNraW5nIG9mIHRoZSBzbWFsbGVyIGNhY2hlcy4gKi8KLQkJc2l6ZXMtPmNzX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKG5hbWVzLT5uYW1lLAotCQkJc2l6ZXMtPmNzX3NpemUsIEFSQ0hfS01BTExPQ19NSU5BTElHTiwKLQkJCShBUkNIX0tNQUxMT0NfRkxBR1MgfCBTTEFCX1BBTklDKSwgTlVMTCwgTlVMTCk7CisJCSAqIGFsbG93IHRpZ2h0ZXIgcGFja2luZyBvZiB0aGUgc21hbGxlciBjYWNoZXMuCisJCSAqLworCQlpZighc2l6ZXMtPmNzX2NhY2hlcCkKKwkJCXNpemVzLT5jc19jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZShuYW1lcy0+bmFtZSwKKwkJCQlzaXplcy0+Y3Nfc2l6ZSwgQVJDSF9LTUFMTE9DX01JTkFMSUdOLAorCQkJCShBUkNIX0tNQUxMT0NfRkxBR1MgfCBTTEFCX1BBTklDKSwgTlVMTCwgTlVMTCk7CiAKIAkJLyogSW5jIG9mZi1zbGFiIGJ1ZmN0bCBsaW1pdCB1bnRpbCB0aGUgY2VpbGluZyBpcyBoaXQuICovCiAJCWlmICghKE9GRl9TTEFCKHNpemVzLT5jc19jYWNoZXApKSkgewpAQCAtODM2LDI0ICsxMDk5LDQ3IEBACiAJLyogNCkgUmVwbGFjZSB0aGUgYm9vdHN0cmFwIGhlYWQgYXJyYXlzICovCiAJewogCQl2b2lkICogcHRyOwotCQkKKwogCQlwdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXJyYXljYWNoZV9pbml0KSwgR0ZQX0tFUk5FTCk7CisKIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAkJQlVHX09OKGFjX2RhdGEoJmNhY2hlX2NhY2hlKSAhPSAmaW5pdGFycmF5X2NhY2hlLmNhY2hlKTsKLQkJbWVtY3B5KHB0ciwgYWNfZGF0YSgmY2FjaGVfY2FjaGUpLCBzaXplb2Yoc3RydWN0IGFycmF5Y2FjaGVfaW5pdCkpOworCQltZW1jcHkocHRyLCBhY19kYXRhKCZjYWNoZV9jYWNoZSksCisJCQkJc2l6ZW9mKHN0cnVjdCBhcnJheWNhY2hlX2luaXQpKTsKIAkJY2FjaGVfY2FjaGUuYXJyYXlbc21wX3Byb2Nlc3Nvcl9pZCgpXSA9IHB0cjsKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQorCiAJCXB0ciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcnJheWNhY2hlX2luaXQpLCBHRlBfS0VSTkVMKTsKKwogCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQlCVUdfT04oYWNfZGF0YShtYWxsb2Nfc2l6ZXNbMF0uY3NfY2FjaGVwKSAhPSAmaW5pdGFycmF5X2dlbmVyaWMuY2FjaGUpOwotCQltZW1jcHkocHRyLCBhY19kYXRhKG1hbGxvY19zaXplc1swXS5jc19jYWNoZXApLAorCQlCVUdfT04oYWNfZGF0YShtYWxsb2Nfc2l6ZXNbSU5ERVhfQUNdLmNzX2NhY2hlcCkKKwkJCQkhPSAmaW5pdGFycmF5X2dlbmVyaWMuY2FjaGUpOworCQltZW1jcHkocHRyLCBhY19kYXRhKG1hbGxvY19zaXplc1tJTkRFWF9BQ10uY3NfY2FjaGVwKSwKIAkJCQlzaXplb2Yoc3RydWN0IGFycmF5Y2FjaGVfaW5pdCkpOwotCQltYWxsb2Nfc2l6ZXNbMF0uY3NfY2FjaGVwLT5hcnJheVtzbXBfcHJvY2Vzc29yX2lkKCldID0gcHRyOworCQltYWxsb2Nfc2l6ZXNbSU5ERVhfQUNdLmNzX2NhY2hlcC0+YXJyYXlbc21wX3Byb2Nlc3Nvcl9pZCgpXSA9CisJCQkJCQlwdHI7CiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIAl9CisJLyogNSkgUmVwbGFjZSB0aGUgYm9vdHN0cmFwIGttZW1fbGlzdDMncyAqLworCXsKKwkJaW50IG5vZGU7CisJCS8qIFJlcGxhY2UgdGhlIHN0YXRpYyBrbWVtX2xpc3QzIHN0cnVjdHVyZXMgZm9yIHRoZSBib290IGNwdSAqLworCQlpbml0X2xpc3QoJmNhY2hlX2NhY2hlLCAmaW5pdGttZW1fbGlzdDNbQ0FDSEVfQ0FDSEVdLAorCQkJCW51bWFfbm9kZV9pZCgpKTsKIAotCS8qIDUpIHJlc2l6ZSB0aGUgaGVhZCBhcnJheXMgdG8gdGhlaXIgZmluYWwgc2l6ZXMgKi8KKwkJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgeworCQkJaW5pdF9saXN0KG1hbGxvY19zaXplc1tJTkRFWF9BQ10uY3NfY2FjaGVwLAorCQkJCQkmaW5pdGttZW1fbGlzdDNbU0laRV9BQytub2RlXSwgbm9kZSk7CisKKwkJCWlmIChJTkRFWF9BQyAhPSBJTkRFWF9MMykgeworCQkJCWluaXRfbGlzdChtYWxsb2Nfc2l6ZXNbSU5ERVhfTDNdLmNzX2NhY2hlcCwKKwkJCQkJCSZpbml0a21lbV9saXN0M1tTSVpFX0wzK25vZGVdLAorCQkJCQkJbm9kZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiA2KSByZXNpemUgdGhlIGhlYWQgYXJyYXlzIHRvIHRoZWlyIGZpbmFsIHNpemVzICovCiAJewogCQlrbWVtX2NhY2hlX3QgKmNhY2hlcDsKIAkJZG93bigmY2FjaGVfY2hhaW5fc2VtKTsKQEAgLTg2OSw3ICsxMTU1LDYgQEAKIAkgKiB0aGF0IGluaXRpYWxpemVzIGFjX2RhdGEgZm9yIGFsbCBuZXcgY3B1cwogCSAqLwogCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmY3B1Y2FjaGVfbm90aWZpZXIpOwotCQogCiAJLyogVGhlIHJlYXAgdGltZXJzIGFyZSBzdGFydGVkIGxhdGVyLCB3aXRoIGEgbW9kdWxlIGluaXQgY2FsbDoKIAkgKiBUaGF0IHBhcnQgb2YgdGhlIGtlcm5lbCBpcyBub3QgeWV0IG9wZXJhdGlvbmFsLgpAQCAtODg0LDEwICsxMTY5LDggQEAKIAkgKiBSZWdpc3RlciB0aGUgdGltZXJzIHRoYXQgcmV0dXJuIHVubmVlZGVkCiAJICogcGFnZXMgdG8gZ2ZwLgogCSAqLwotCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKLQkJaWYgKGNwdV9vbmxpbmUoY3B1KSkKLQkJCXN0YXJ0X2NwdV90aW1lcihjcHUpOwotCX0KKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJc3RhcnRfY3B1X3RpbWVyKGNwdSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExNjYsNiArMTQ0OSwyMCBAQAogCX0KIH0KIAorLyogRm9yIHNldHRpbmcgdXAgYWxsIHRoZSBrbWVtX2xpc3QzcyBmb3IgY2FjaGUgd2hvc2Ugb2Jqc2l6ZSBpcyBzYW1lCisgICBhcyBzaXplIG9mIGttZW1fbGlzdDMuICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3VwX2xpc3QzcyhrbWVtX2NhY2hlX3QgKmNhY2hlcCwgaW50IGluZGV4KQoreworCWludCBub2RlOworCisJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgeworCQljYWNoZXAtPm5vZGVsaXN0c1tub2RlXSA9ICZpbml0a21lbV9saXN0M1tpbmRleCtub2RlXTsKKwkJY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0tPm5leHRfcmVhcCA9IGppZmZpZXMgKworCQkJUkVBUFRJTUVPVVRfTElTVDMgKworCQkJKCh1bnNpZ25lZCBsb25nKWNhY2hlcCklUkVBUFRJTUVPVVRfTElTVDM7CisJfQorfQorCiAvKioKICAqIGttZW1fY2FjaGVfY3JlYXRlIC0gQ3JlYXRlIGEgY2FjaGUuCiAgKiBAbmFtZTogQSBzdHJpbmcgd2hpY2ggaXMgdXNlZCBpbiAvcHJvYy9zbGFiaW5mbyB0byBpZGVudGlmeSB0aGlzIGNhY2hlLgpAQCAtMTMxOSw3ICsxNjE2LDcgQEAKIAkJc2l6ZSArPSBCWVRFU19QRVJfV09SRDsKIAl9CiAjaWYgRk9SQ0VEX0RFQlVHICYmIGRlZmluZWQoQ09ORklHX0RFQlVHX1BBR0VBTExPQykKLQlpZiAoc2l6ZSA+IDEyOCAmJiBjYWNoZXAtPnJlYWxsZW4gPiBjYWNoZV9saW5lX3NpemUoKSAmJiBzaXplIDwgUEFHRV9TSVpFKSB7CisJaWYgKHNpemUgPj0gbWFsbG9jX3NpemVzW0lOREVYX0wzKzFdLmNzX3NpemUgJiYgY2FjaGVwLT5yZWFsbGVuID4gY2FjaGVfbGluZV9zaXplKCkgJiYgc2l6ZSA8IFBBR0VfU0laRSkgewogCQljYWNoZXAtPmRiZ2hlYWQgKz0gUEFHRV9TSVpFIC0gc2l6ZTsKIAkJc2l6ZSA9IFBBR0VfU0laRTsKIAl9CkBAIC0xNDIxLDEzICsxNzE4LDkgQEAKIAkJY2FjaGVwLT5nZnBmbGFncyB8PSBHRlBfRE1BOwogCXNwaW5fbG9ja19pbml0KCZjYWNoZXAtPnNwaW5sb2NrKTsKIAljYWNoZXAtPm9ianNpemUgPSBzaXplOwotCS8qIE5VTUEgKi8KLQlJTklUX0xJU1RfSEVBRCgmY2FjaGVwLT5saXN0cy5zbGFic19mdWxsKTsKLQlJTklUX0xJU1RfSEVBRCgmY2FjaGVwLT5saXN0cy5zbGFic19wYXJ0aWFsKTsKLQlJTklUX0xJU1RfSEVBRCgmY2FjaGVwLT5saXN0cy5zbGFic19mcmVlKTsKIAogCWlmIChmbGFncyAmIENGTEdTX09GRl9TTEFCKQotCQljYWNoZXAtPnNsYWJwX2NhY2hlID0ga21lbV9maW5kX2dlbmVyYWxfY2FjaGVwKHNsYWJfc2l6ZSwwKTsKKwkJY2FjaGVwLT5zbGFicF9jYWNoZSA9IGttZW1fZmluZF9nZW5lcmFsX2NhY2hlcChzbGFiX3NpemUsIDB1KTsKIAljYWNoZXAtPmN0b3IgPSBjdG9yOwogCWNhY2hlcC0+ZHRvciA9IGR0b3I7CiAJY2FjaGVwLT5uYW1lID0gbmFtZTsKQEAgLTE0NDMsMTEgKzE3MzYsNDMgQEAKIAkJCSAqIHRoZSBjYWNoZSB0aGF0J3MgdXNlZCBieSBrbWFsbG9jKDI0KSwgb3RoZXJ3aXNlCiAJCQkgKiB0aGUgY3JlYXRpb24gb2YgZnVydGhlciBjYWNoZXMgd2lsbCBCVUcoKS4KIAkJCSAqLwotCQkJY2FjaGVwLT5hcnJheVtzbXBfcHJvY2Vzc29yX2lkKCldID0gJmluaXRhcnJheV9nZW5lcmljLmNhY2hlOwotCQkJZ19jcHVjYWNoZV91cCA9IFBBUlRJQUw7CisJCQljYWNoZXAtPmFycmF5W3NtcF9wcm9jZXNzb3JfaWQoKV0gPQorCQkJCSZpbml0YXJyYXlfZ2VuZXJpYy5jYWNoZTsKKworCQkJLyogSWYgdGhlIGNhY2hlIHRoYXQncyB1c2VkIGJ5CisJCQkgKiBrbWFsbG9jKHNpemVvZihrbWVtX2xpc3QzKSkgaXMgdGhlIGZpcnN0IGNhY2hlLAorCQkJICogdGhlbiB3ZSBuZWVkIHRvIHNldCB1cCBhbGwgaXRzIGxpc3Qzcywgb3RoZXJ3aXNlCisJCQkgKiB0aGUgY3JlYXRpb24gb2YgZnVydGhlciBjYWNoZXMgd2lsbCBCVUcoKS4KKwkJCSAqLworCQkJc2V0X3VwX2xpc3QzcyhjYWNoZXAsIFNJWkVfQUMpOworCQkJaWYgKElOREVYX0FDID09IElOREVYX0wzKQorCQkJCWdfY3B1Y2FjaGVfdXAgPSBQQVJUSUFMX0wzOworCQkJZWxzZQorCQkJCWdfY3B1Y2FjaGVfdXAgPSBQQVJUSUFMX0FDOwogCQl9IGVsc2UgewotCQkJY2FjaGVwLT5hcnJheVtzbXBfcHJvY2Vzc29yX2lkKCldID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFycmF5Y2FjaGVfaW5pdCksR0ZQX0tFUk5FTCk7CisJCQljYWNoZXAtPmFycmF5W3NtcF9wcm9jZXNzb3JfaWQoKV0gPQorCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcnJheWNhY2hlX2luaXQpLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisKKwkJCWlmIChnX2NwdWNhY2hlX3VwID09IFBBUlRJQUxfQUMpIHsKKwkJCQlzZXRfdXBfbGlzdDNzKGNhY2hlcCwgU0laRV9MMyk7CisJCQkJZ19jcHVjYWNoZV91cCA9IFBBUlRJQUxfTDM7CisJCQl9IGVsc2UgeworCQkJCWludCBub2RlOworCQkJCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKKworCQkJCQljYWNoZXAtPm5vZGVsaXN0c1tub2RlXSA9CisJCQkJCQlrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBrbWVtX2xpc3QzKSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCwgbm9kZSk7CisJCQkJCUJVR19PTighY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0pOworCQkJCQlrbWVtX2xpc3QzX2luaXQoY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0pOworCQkJCX0KKwkJCX0KIAkJfQorCQljYWNoZXAtPm5vZGVsaXN0c1tudW1hX25vZGVfaWQoKV0tPm5leHRfcmVhcCA9CisJCQlqaWZmaWVzICsgUkVBUFRJTUVPVVRfTElTVDMgKworCQkJKCh1bnNpZ25lZCBsb25nKWNhY2hlcCklUkVBUFRJTUVPVVRfTElTVDM7CisKIAkJQlVHX09OKCFhY19kYXRhKGNhY2hlcCkpOwogCQlhY19kYXRhKGNhY2hlcCktPmF2YWlsID0gMDsKIAkJYWNfZGF0YShjYWNoZXApLT5saW1pdCA9IEJPT1RfQ1BVQ0FDSEVfRU5UUklFUzsKQEAgLTE0NTUsMTMgKzE3ODAsOCBAQAogCQlhY19kYXRhKGNhY2hlcCktPnRvdWNoZWQgPSAwOwogCQljYWNoZXAtPmJhdGNoY291bnQgPSAxOwogCQljYWNoZXAtPmxpbWl0ID0gQk9PVF9DUFVDQUNIRV9FTlRSSUVTOwotCQljYWNoZXAtPmZyZWVfbGltaXQgPSAoMStudW1fb25saW5lX2NwdXMoKSkqY2FjaGVwLT5iYXRjaGNvdW50Ci0JCQkJCSsgY2FjaGVwLT5udW07CiAJfSAKIAotCWNhY2hlcC0+bGlzdHMubmV4dF9yZWFwID0gamlmZmllcyArIFJFQVBUSU1FT1VUX0xJU1QzICsKLQkJCQkJKCh1bnNpZ25lZCBsb25nKWNhY2hlcCklUkVBUFRJTUVPVVRfTElTVDM7Ci0KIAkvKiBOZWVkIHRoZSBzZW1hcGhvcmUgdG8gYWNjZXNzIHRoZSBjaGFpbi4gKi8KIAlkb3duKCZjYWNoZV9jaGFpbl9zZW0pOwogCXsKQEAgLTE1MTgsMTMgKzE4MzgsMjMgQEAKIHsKICNpZmRlZiBDT05GSUdfU01QCiAJY2hlY2tfaXJxX29mZigpOwotCUJVR19PTihzcGluX3RyeWxvY2soJmNhY2hlcC0+c3BpbmxvY2spKTsKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmNhY2hlcC0+bm9kZWxpc3RzW251bWFfbm9kZV9pZCgpXS0+bGlzdF9sb2NrKTsKICNlbmRpZgogfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfc3BpbmxvY2tfYWNxdWlyZWRfbm9kZShrbWVtX2NhY2hlX3QgKmNhY2hlcCwgaW50IG5vZGUpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCWNoZWNrX2lycV9vZmYoKTsKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmNhY2hlcC0+bm9kZWxpc3RzW25vZGVdLT5saXN0X2xvY2spOworI2VuZGlmCit9CisKICNlbHNlCiAjZGVmaW5lIGNoZWNrX2lycV9vZmYoKQlkbyB7IH0gd2hpbGUoMCkKICNkZWZpbmUgY2hlY2tfaXJxX29uKCkJZG8geyB9IHdoaWxlKDApCiAjZGVmaW5lIGNoZWNrX3NwaW5sb2NrX2FjcXVpcmVkKHgpIGRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBjaGVja19zcGlubG9ja19hY3F1aXJlZF9ub2RlKHgsIHkpIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKIC8qCkBAIC0xNTQ2LDcgKzE4NzYsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBkcmFpbl9hcnJheV9sb2NrZWQoa21lbV9jYWNoZV90KiBjYWNoZXAsCi0JCQkJc3RydWN0IGFycmF5X2NhY2hlICphYywgaW50IGZvcmNlKTsKKwkJCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFjLCBpbnQgZm9yY2UsIGludCBub2RlKTsKIAogc3RhdGljIHZvaWQgZG9fZHJhaW4odm9pZCAqYXJnKQogewpAQCAtMTU1NSw1OSArMTg4NSw4MiBAQAogCiAJY2hlY2tfaXJxX29mZigpOwogCWFjID0gYWNfZGF0YShjYWNoZXApOwotCXNwaW5fbG9jaygmY2FjaGVwLT5zcGlubG9jayk7Ci0JZnJlZV9ibG9jayhjYWNoZXAsICZhY19lbnRyeShhYylbMF0sIGFjLT5hdmFpbCk7Ci0Jc3Bpbl91bmxvY2soJmNhY2hlcC0+c3BpbmxvY2spOworCXNwaW5fbG9jaygmY2FjaGVwLT5ub2RlbGlzdHNbbnVtYV9ub2RlX2lkKCldLT5saXN0X2xvY2spOworCWZyZWVfYmxvY2soY2FjaGVwLCBhYy0+ZW50cnksIGFjLT5hdmFpbCk7CisJc3Bpbl91bmxvY2soJmNhY2hlcC0+bm9kZWxpc3RzW251bWFfbm9kZV9pZCgpXS0+bGlzdF9sb2NrKTsKIAlhYy0+YXZhaWwgPSAwOwogfQogCiBzdGF0aWMgdm9pZCBkcmFpbl9jcHVfY2FjaGVzKGttZW1fY2FjaGVfdCAqY2FjaGVwKQogeworCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKKwlpbnQgbm9kZTsKKwogCXNtcF9jYWxsX2Z1bmN0aW9uX2FsbF9jcHVzKGRvX2RyYWluLCBjYWNoZXApOwogCWNoZWNrX2lycV9vbigpOwogCXNwaW5fbG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwotCWlmIChjYWNoZXAtPmxpc3RzLnNoYXJlZCkKLQkJZHJhaW5fYXJyYXlfbG9ja2VkKGNhY2hlcCwgY2FjaGVwLT5saXN0cy5zaGFyZWQsIDEpOworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpICB7CisJCWwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV07CisJCWlmIChsMykgeworCQkJc3Bpbl9sb2NrKCZsMy0+bGlzdF9sb2NrKTsKKwkJCWRyYWluX2FycmF5X2xvY2tlZChjYWNoZXAsIGwzLT5zaGFyZWQsIDEsIG5vZGUpOworCQkJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOworCQkJaWYgKGwzLT5hbGllbikKKwkJCQlkcmFpbl9hbGllbl9jYWNoZShjYWNoZXAsIGwzKTsKKwkJfQorCX0KIAlzcGluX3VubG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwogfQogCi0KLS8qIE5VTUEgc2hyaW5rIGFsbCBsaXN0M3MgKi8KLXN0YXRpYyBpbnQgX19jYWNoZV9zaHJpbmsoa21lbV9jYWNoZV90ICpjYWNoZXApCitzdGF0aWMgaW50IF9fbm9kZV9zaHJpbmsoa21lbV9jYWNoZV90ICpjYWNoZXAsIGludCBub2RlKQogewogCXN0cnVjdCBzbGFiICpzbGFicDsKKwlzdHJ1Y3Qga21lbV9saXN0MyAqbDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tub2RlXTsKIAlpbnQgcmV0OwogCi0JZHJhaW5fY3B1X2NhY2hlcyhjYWNoZXApOwotCi0JY2hlY2tfaXJxX29uKCk7Ci0Jc3Bpbl9sb2NrX2lycSgmY2FjaGVwLT5zcGlubG9jayk7Ci0KLQlmb3IoOzspIHsKKwlmb3IgKDs7KSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKLQkJcCA9IGNhY2hlcC0+bGlzdHMuc2xhYnNfZnJlZS5wcmV2OwotCQlpZiAocCA9PSAmY2FjaGVwLT5saXN0cy5zbGFic19mcmVlKQorCQlwID0gbDMtPnNsYWJzX2ZyZWUucHJldjsKKwkJaWYgKHAgPT0gJmwzLT5zbGFic19mcmVlKQogCQkJYnJlYWs7CiAKLQkJc2xhYnAgPSBsaXN0X2VudHJ5KGNhY2hlcC0+bGlzdHMuc2xhYnNfZnJlZS5wcmV2LCBzdHJ1Y3Qgc2xhYiwgbGlzdCk7CisJCXNsYWJwID0gbGlzdF9lbnRyeShsMy0+c2xhYnNfZnJlZS5wcmV2LCBzdHJ1Y3Qgc2xhYiwgbGlzdCk7CiAjaWYgREVCVUcKIAkJaWYgKHNsYWJwLT5pbnVzZSkKIAkJCUJVRygpOwogI2VuZGlmCiAJCWxpc3RfZGVsKCZzbGFicC0+bGlzdCk7CiAKLQkJY2FjaGVwLT5saXN0cy5mcmVlX29iamVjdHMgLT0gY2FjaGVwLT5udW07Ci0JCXNwaW5fdW5sb2NrX2lycSgmY2FjaGVwLT5zcGlubG9jayk7CisJCWwzLT5mcmVlX29iamVjdHMgLT0gY2FjaGVwLT5udW07CisJCXNwaW5fdW5sb2NrX2lycSgmbDMtPmxpc3RfbG9jayk7CiAJCXNsYWJfZGVzdHJveShjYWNoZXAsIHNsYWJwKTsKLQkJc3Bpbl9sb2NrX2lycSgmY2FjaGVwLT5zcGlubG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmwzLT5saXN0X2xvY2spOwogCX0KLQlyZXQgPSAhbGlzdF9lbXB0eSgmY2FjaGVwLT5saXN0cy5zbGFic19mdWxsKSB8fAotCQkhbGlzdF9lbXB0eSgmY2FjaGVwLT5saXN0cy5zbGFic19wYXJ0aWFsKTsKLQlzcGluX3VubG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOworCXJldCA9ICFsaXN0X2VtcHR5KCZsMy0+c2xhYnNfZnVsbCkgfHwKKwkJIWxpc3RfZW1wdHkoJmwzLT5zbGFic19wYXJ0aWFsKTsKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IF9fY2FjaGVfc2hyaW5rKGttZW1fY2FjaGVfdCAqY2FjaGVwKQoreworCWludCByZXQgPSAwLCBpID0gMDsKKwlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CisKKwlkcmFpbl9jcHVfY2FjaGVzKGNhY2hlcCk7CisKKwljaGVja19pcnFfb24oKTsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShpKSB7CisJCWwzID0gY2FjaGVwLT5ub2RlbGlzdHNbaV07CisJCWlmIChsMykgeworCQkJc3Bpbl9sb2NrX2lycSgmbDMtPmxpc3RfbG9jayk7CisJCQlyZXQgKz0gX19ub2RlX3NocmluayhjYWNoZXAsIGkpOworCQkJc3Bpbl91bmxvY2tfaXJxKCZsMy0+bGlzdF9sb2NrKTsKKwkJfQorCX0KKwlyZXR1cm4gKHJldCA/IDEgOiAwKTsKK30KKwogLyoqCiAgKiBrbWVtX2NhY2hlX3NocmluayAtIFNocmluayBhIGNhY2hlLgogICogQGNhY2hlcDogVGhlIGNhY2hlIHRvIHNocmluay4KQEAgLTE2NDQsNiArMTk5Nyw3IEBACiBpbnQga21lbV9jYWNoZV9kZXN0cm95KGttZW1fY2FjaGVfdCAqIGNhY2hlcCkKIHsKIAlpbnQgaTsKKwlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CiAKIAlpZiAoIWNhY2hlcCB8fCBpbl9pbnRlcnJ1cHQoKSkKIAkJQlVHKCk7CkBAIC0xNjcxLDE1ICsyMDI1LDE3IEBACiAJaWYgKHVubGlrZWx5KGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX0RFU1RST1lfQllfUkNVKSkKIAkJc3luY2hyb25pemVfcmN1KCk7CiAKLQkvKiBubyBjcHVfb25saW5lIGNoZWNrIHJlcXVpcmVkIGhlcmUgc2luY2Ugd2UgY2xlYXIgdGhlIHBlcmNwdQotCSAqIGFycmF5IG9uIGNwdSBvZmZsaW5lIGFuZCBzZXQgdGhpcyB0byBOVUxMLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspCisJZm9yX2VhY2hfb25saW5lX2NwdShpKQogCQlrZnJlZShjYWNoZXAtPmFycmF5W2ldKTsKIAogCS8qIE5VTUE6IGZyZWUgdGhlIGxpc3QzIHN0cnVjdHVyZXMgKi8KLQlrZnJlZShjYWNoZXAtPmxpc3RzLnNoYXJlZCk7Ci0JY2FjaGVwLT5saXN0cy5zaGFyZWQgPSBOVUxMOworCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpIHsKKwkJaWYgKChsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW2ldKSkgeworCQkJa2ZyZWUobDMtPnNoYXJlZCk7CisJCQlmcmVlX2FsaWVuX2NhY2hlKGwzLT5hbGllbik7CisJCQlrZnJlZShsMyk7CisJCX0KKwl9CiAJa21lbV9jYWNoZV9mcmVlKCZjYWNoZV9jYWNoZSwgY2FjaGVwKTsKIAogCXVubG9ja19jcHVfaG90cGx1ZygpOwpAQCAtMTY4OSw4ICsyMDQ1LDggQEAKIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9kZXN0cm95KTsKIAogLyogR2V0IHRoZSBtZW1vcnkgZm9yIGEgc2xhYiBtYW5hZ2VtZW50IG9iai4gKi8KLXN0YXRpYyBzdHJ1Y3Qgc2xhYiogYWxsb2Nfc2xhYm1nbXQoa21lbV9jYWNoZV90ICpjYWNoZXAsCi0JCQl2b2lkICpvYmpwLCBpbnQgY29sb3VyX29mZiwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGxvY2FsX2ZsYWdzKQorc3RhdGljIHN0cnVjdCBzbGFiKiBhbGxvY19zbGFibWdtdChrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdm9pZCAqb2JqcCwKKwkJCWludCBjb2xvdXJfb2ZmLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgbG9jYWxfZmxhZ3MpCiB7CiAJc3RydWN0IHNsYWIgKnNsYWJwOwogCQpAQCAtMTcyMSw3ICsyMDc3LDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBjYWNoZXAtPm51bTsgaSsrKSB7Ci0JCXZvaWQqIG9ianAgPSBzbGFicC0+c19tZW0rY2FjaGVwLT5vYmpzaXplKmk7CisJCXZvaWQgKm9ianAgPSBzbGFicC0+c19tZW0rY2FjaGVwLT5vYmpzaXplKmk7CiAjaWYgREVCVUcKIAkJLyogbmVlZCB0byBwb2lzb24gdGhlIG9ianM/ICovCiAJCWlmIChjYWNoZXAtPmZsYWdzICYgU0xBQl9QT0lTT04pCkBAIC0xNzk4LDYgKzIxNTQsNyBAQAogCXNpemVfdAkJIG9mZnNldDsKIAl1bnNpZ25lZCBpbnQJIGxvY2FsX2ZsYWdzOwogCXVuc2lnbmVkIGxvbmcJIGN0b3JfZmxhZ3M7CisJc3RydWN0IGttZW1fbGlzdDMgKmwzOwogCiAJLyogQmUgbGF6eSBhbmQgb25seSBjaGVjayBmb3IgdmFsaWQgZmxhZ3MgaGVyZSwKICAJICoga2VlcGluZyBpdCBvdXQgb2YgdGhlIGNyaXRpY2FsIHBhdGggaW4ga21lbV9jYWNoZV9hbGxvYygpLgpAQCAtMTgyOSw2ICsyMTg2LDcgQEAKIAogCXNwaW5fdW5sb2NrKCZjYWNoZXAtPnNwaW5sb2NrKTsKIAorCWNoZWNrX2lycV9vZmYoKTsKIAlpZiAobG9jYWxfZmxhZ3MgJiBfX0dGUF9XQUlUKQogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKQEAgLTE4NDAsOCArMjE5OCw5IEBACiAJICovCiAJa21lbV9mbGFnY2hlY2soY2FjaGVwLCBmbGFncyk7CiAKLQotCS8qIEdldCBtZW0gZm9yIHRoZSBvYmpzLiAqLworCS8qIEdldCBtZW0gZm9yIHRoZSBvYmpzLgorCSAqIEF0dGVtcHQgdG8gYWxsb2NhdGUgYSBwaHlzaWNhbCBwYWdlIGZyb20gJ25vZGVpZCcsCisJICovCiAJaWYgKCEob2JqcCA9IGttZW1fZ2V0cGFnZXMoY2FjaGVwLCBmbGFncywgbm9kZWlkKSkpCiAJCWdvdG8gZmFpbGVkOwogCkBAIC0xODQ5LDYgKzIyMDgsNyBAQAogCWlmICghKHNsYWJwID0gYWxsb2Nfc2xhYm1nbXQoY2FjaGVwLCBvYmpwLCBvZmZzZXQsIGxvY2FsX2ZsYWdzKSkpCiAJCWdvdG8gb3BwczE7CiAKKwlzbGFicC0+bm9kZWlkID0gbm9kZWlkOwogCXNldF9zbGFiX2F0dHIoY2FjaGVwLCBzbGFicCwgb2JqcCk7CiAKIAljYWNoZV9pbml0X29ianMoY2FjaGVwLCBzbGFicCwgY3Rvcl9mbGFncyk7CkBAIC0xODU2LDEzICsyMjE2LDE0IEBACiAJaWYgKGxvY2FsX2ZsYWdzICYgX19HRlBfV0FJVCkKIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAljaGVja19pcnFfb2ZmKCk7Ci0Jc3Bpbl9sb2NrKCZjYWNoZXAtPnNwaW5sb2NrKTsKKwlsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF07CisJc3Bpbl9sb2NrKCZsMy0+bGlzdF9sb2NrKTsKIAogCS8qIE1ha2Ugc2xhYiBhY3RpdmUuICovCi0JbGlzdF9hZGRfdGFpbCgmc2xhYnAtPmxpc3QsICYobGlzdDNfZGF0YShjYWNoZXApLT5zbGFic19mcmVlKSk7CisJbGlzdF9hZGRfdGFpbCgmc2xhYnAtPmxpc3QsICYobDMtPnNsYWJzX2ZyZWUpKTsKIAlTVEFUU19JTkNfR1JPV04oY2FjaGVwKTsKLQlsaXN0M19kYXRhKGNhY2hlcCktPmZyZWVfb2JqZWN0cyArPSBjYWNoZXAtPm51bTsKLQlzcGluX3VubG9jaygmY2FjaGVwLT5zcGlubG9jayk7CisJbDMtPmZyZWVfb2JqZWN0cyArPSBjYWNoZXAtPm51bTsKKwlzcGluX3VubG9jaygmbDMtPmxpc3RfbG9jayk7CiAJcmV0dXJuIDE7CiBvcHBzMToKIAlrbWVtX2ZyZWVwYWdlcyhjYWNoZXAsIG9ianApOwpAQCAtMTk2OCw3ICsyMzI5LDYgQEAKIAlrbWVtX2J1ZmN0bF90IGk7CiAJaW50IGVudHJpZXMgPSAwOwogCQotCWNoZWNrX3NwaW5sb2NrX2FjcXVpcmVkKGNhY2hlcCk7CiAJLyogQ2hlY2sgc2xhYidzIGZyZWVsaXN0IHRvIHNlZSBpZiB0aGlzIG9iaiBpcyB0aGVyZS4gKi8KIAlmb3IgKGkgPSBzbGFicC0+ZnJlZTsgaSAhPSBCVUZDVExfRU5EOyBpID0gc2xhYl9idWZjdGwoc2xhYnApW2ldKSB7CiAJCWVudHJpZXMrKzsKQEAgLTIwMTEsMTAgKzIzNzEsMTEgQEAKIAkJICovCiAJCWJhdGNoY291bnQgPSBCQVRDSFJFRklMTF9MSU1JVDsKIAl9Ci0JbDMgPSBsaXN0M19kYXRhKGNhY2hlcCk7CisJbDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tudW1hX25vZGVfaWQoKV07CiAKLQlCVUdfT04oYWMtPmF2YWlsID4gMCk7Ci0Jc3Bpbl9sb2NrKCZjYWNoZXAtPnNwaW5sb2NrKTsKKwlCVUdfT04oYWMtPmF2YWlsID4gMCB8fCAhbDMpOworCXNwaW5fbG9jaygmbDMtPmxpc3RfbG9jayk7CisKIAlpZiAobDMtPnNoYXJlZCkgewogCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKnNoYXJlZF9hcnJheSA9IGwzLT5zaGFyZWQ7CiAJCWlmIChzaGFyZWRfYXJyYXktPmF2YWlsKSB7CkBAIC0yMDIyLDggKzIzODMsOSBAQAogCQkJCWJhdGNoY291bnQgPSBzaGFyZWRfYXJyYXktPmF2YWlsOwogCQkJc2hhcmVkX2FycmF5LT5hdmFpbCAtPSBiYXRjaGNvdW50OwogCQkJYWMtPmF2YWlsID0gYmF0Y2hjb3VudDsKLQkJCW1lbWNweShhY19lbnRyeShhYyksICZhY19lbnRyeShzaGFyZWRfYXJyYXkpW3NoYXJlZF9hcnJheS0+YXZhaWxdLAotCQkJCQlzaXplb2Yodm9pZCopKmJhdGNoY291bnQpOworCQkJbWVtY3B5KGFjLT5lbnRyeSwKKwkJCQkmKHNoYXJlZF9hcnJheS0+ZW50cnlbc2hhcmVkX2FycmF5LT5hdmFpbF0pLAorCQkJCXNpemVvZih2b2lkKikqYmF0Y2hjb3VudCk7CiAJCQlzaGFyZWRfYXJyYXktPnRvdWNoZWQgPSAxOwogCQkJZ290byBhbGxvY19kb25lOwogCQl9CkBAIC0yMDUwLDcgKzI0MTIsOCBAQAogCQkJU1RBVFNfU0VUX0hJR0goY2FjaGVwKTsKIAogCQkJLyogZ2V0IG9iaiBwb2ludGVyICovCi0JCQlhY19lbnRyeShhYylbYWMtPmF2YWlsKytdID0gc2xhYnAtPnNfbWVtICsgc2xhYnAtPmZyZWUqY2FjaGVwLT5vYmpzaXplOworCQkJYWMtPmVudHJ5W2FjLT5hdmFpbCsrXSA9IHNsYWJwLT5zX21lbSArCisJCQkJc2xhYnAtPmZyZWUqY2FjaGVwLT5vYmpzaXplOwogCiAJCQlzbGFicC0+aW51c2UrKzsKIAkJCW5leHQgPSBzbGFiX2J1ZmN0bChzbGFicClbc2xhYnAtPmZyZWVdOwpAQCAtMjA3MiwxMiArMjQzNSwxMiBAQAogbXVzdF9ncm93OgogCWwzLT5mcmVlX29iamVjdHMgLT0gYWMtPmF2YWlsOwogYWxsb2NfZG9uZToKLQlzcGluX3VubG9jaygmY2FjaGVwLT5zcGlubG9jayk7CisJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOwogCiAJaWYgKHVubGlrZWx5KCFhYy0+YXZhaWwpKSB7CiAJCWludCB4OwotCQl4ID0gY2FjaGVfZ3JvdyhjYWNoZXAsIGZsYWdzLCAtMSk7Ci0JCQorCQl4ID0gY2FjaGVfZ3JvdyhjYWNoZXAsIGZsYWdzLCBudW1hX25vZGVfaWQoKSk7CisKIAkJLy8gY2FjaGVfZ3JvdyBjYW4gcmVlbmFibGUgaW50ZXJydXB0cywgdGhlbiBhYyBjb3VsZCBjaGFuZ2UuCiAJCWFjID0gYWNfZGF0YShjYWNoZXApOwogCQlpZiAoIXggJiYgYWMtPmF2YWlsID09IDApCS8vIG5vIG9iamVjdHMgaW4gc2lnaHQ/IGFib3J0CkBAIC0yMDg3LDcgKzI0NTAsNyBAQAogCQkJZ290byByZXRyeTsKIAl9CiAJYWMtPnRvdWNoZWQgPSAxOwotCXJldHVybiBhY19lbnRyeShhYylbLS1hYy0+YXZhaWxdOworCXJldHVybiBhYy0+ZW50cnlbLS1hYy0+YXZhaWxdOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTIxNTksNDMgKzI1MjIsMTE2IEBACiAJaWYgKGxpa2VseShhYy0+YXZhaWwpKSB7CiAJCVNUQVRTX0lOQ19BTExPQ0hJVChjYWNoZXApOwogCQlhYy0+dG91Y2hlZCA9IDE7Ci0JCW9ianAgPSBhY19lbnRyeShhYylbLS1hYy0+YXZhaWxdOworCQlvYmpwID0gYWMtPmVudHJ5Wy0tYWMtPmF2YWlsXTsKIAl9IGVsc2UgewogCQlTVEFUU19JTkNfQUxMT0NNSVNTKGNhY2hlcCk7CiAJCW9ianAgPSBjYWNoZV9hbGxvY19yZWZpbGwoY2FjaGVwLCBmbGFncyk7CiAJfQogCWxvY2FsX2lycV9yZXN0b3JlKHNhdmVfZmxhZ3MpOwotCW9ianAgPSBjYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2FmdGVyKGNhY2hlcCwgZmxhZ3MsIG9ianAsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJb2JqcCA9IGNhY2hlX2FsbG9jX2RlYnVnY2hlY2tfYWZ0ZXIoY2FjaGVwLCBmbGFncywgb2JqcCwKKwkJCQkJX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwlwcmVmZXRjaHcob2JqcCk7CiAJcmV0dXJuIG9ianA7CiB9CiAKLS8qIAotICogTlVNQTogZGlmZmVyZW50IGFwcHJvYWNoIG5lZWRlZCBpZiB0aGUgc3BpbmxvY2sgaXMgbW92ZWQgaW50bwotICogdGhlIGwzIHN0cnVjdHVyZQorI2lmZGVmIENPTkZJR19OVU1BCisvKgorICogQSBpbnRlcmZhY2UgdG8gZW5hYmxlIHNsYWIgY3JlYXRpb24gb24gbm9kZWlkCiAgKi8KK3N0YXRpYyB2b2lkICpfX2NhY2hlX2FsbG9jX25vZGUoa21lbV9jYWNoZV90ICpjYWNoZXAsIGludCBmbGFncywgaW50IG5vZGVpZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKyAJc3RydWN0IHNsYWIgKnNsYWJwOworIAlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CisgCXZvaWQgKm9iajsKKyAJa21lbV9idWZjdGxfdCBuZXh0OworIAlpbnQgeDsKIAorIAlsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF07CisgCUJVR19PTighbDMpOworCityZXRyeToKKyAJc3Bpbl9sb2NrKCZsMy0+bGlzdF9sb2NrKTsKKyAJZW50cnkgPSBsMy0+c2xhYnNfcGFydGlhbC5uZXh0OworIAlpZiAoZW50cnkgPT0gJmwzLT5zbGFic19wYXJ0aWFsKSB7CisgCQlsMy0+ZnJlZV90b3VjaGVkID0gMTsKKyAJCWVudHJ5ID0gbDMtPnNsYWJzX2ZyZWUubmV4dDsKKyAJCWlmIChlbnRyeSA9PSAmbDMtPnNsYWJzX2ZyZWUpCisgCQkJZ290byBtdXN0X2dyb3c7CisgCX0KKworIAlzbGFicCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBzbGFiLCBsaXN0KTsKKyAJY2hlY2tfc3BpbmxvY2tfYWNxdWlyZWRfbm9kZShjYWNoZXAsIG5vZGVpZCk7CisgCWNoZWNrX3NsYWJwKGNhY2hlcCwgc2xhYnApOworCisgCVNUQVRTX0lOQ19OT0RFQUxMT0NTKGNhY2hlcCk7CisgCVNUQVRTX0lOQ19BQ1RJVkUoY2FjaGVwKTsKKyAJU1RBVFNfU0VUX0hJR0goY2FjaGVwKTsKKworIAlCVUdfT04oc2xhYnAtPmludXNlID09IGNhY2hlcC0+bnVtKTsKKworIAkvKiBnZXQgb2JqIHBvaW50ZXIgKi8KKyAJb2JqID0gIHNsYWJwLT5zX21lbSArIHNsYWJwLT5mcmVlKmNhY2hlcC0+b2Jqc2l6ZTsKKyAJc2xhYnAtPmludXNlKys7CisgCW5leHQgPSBzbGFiX2J1ZmN0bChzbGFicClbc2xhYnAtPmZyZWVdOworI2lmIERFQlVHCisgCXNsYWJfYnVmY3RsKHNsYWJwKVtzbGFicC0+ZnJlZV0gPSBCVUZDVExfRlJFRTsKKyNlbmRpZgorIAlzbGFicC0+ZnJlZSA9IG5leHQ7CisgCWNoZWNrX3NsYWJwKGNhY2hlcCwgc2xhYnApOworIAlsMy0+ZnJlZV9vYmplY3RzLS07CisgCS8qIG1vdmUgc2xhYnAgdG8gY29ycmVjdCBzbGFicCBsaXN0OiAqLworIAlsaXN0X2RlbCgmc2xhYnAtPmxpc3QpOworCisgCWlmIChzbGFicC0+ZnJlZSA9PSBCVUZDVExfRU5EKSB7CisgCQlsaXN0X2FkZCgmc2xhYnAtPmxpc3QsICZsMy0+c2xhYnNfZnVsbCk7CisgCX0gZWxzZSB7CisgCQlsaXN0X2FkZCgmc2xhYnAtPmxpc3QsICZsMy0+c2xhYnNfcGFydGlhbCk7CisgCX0KKworIAlzcGluX3VubG9jaygmbDMtPmxpc3RfbG9jayk7CisgCWdvdG8gZG9uZTsKKworbXVzdF9ncm93OgorIAlzcGluX3VubG9jaygmbDMtPmxpc3RfbG9jayk7CisgCXggPSBjYWNoZV9ncm93KGNhY2hlcCwgZmxhZ3MsIG5vZGVpZCk7CisKKyAJaWYgKCF4KQorIAkJcmV0dXJuIE5VTEw7CisKKyAJZ290byByZXRyeTsKK2RvbmU6CisgCXJldHVybiBvYmo7Cit9CisjZW5kaWYKKworLyoKKyAqIENhbGxlciBuZWVkcyB0byBhY3F1aXJlIGNvcnJlY3Qga21lbV9saXN0J3MgbGlzdF9sb2NrCisgKi8KIHN0YXRpYyB2b2lkIGZyZWVfYmxvY2soa21lbV9jYWNoZV90ICpjYWNoZXAsIHZvaWQgKipvYmpwcCwgaW50IG5yX29iamVjdHMpCiB7CiAJaW50IGk7Ci0KLQljaGVja19zcGlubG9ja19hY3F1aXJlZChjYWNoZXApOwotCi0JLyogTlVNQTogbW92ZSBhZGQgaW50byBsb29wICovCi0JY2FjaGVwLT5saXN0cy5mcmVlX29iamVjdHMgKz0gbnJfb2JqZWN0czsKKwlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CiAJCXZvaWQgKm9ianAgPSBvYmpwcFtpXTsKIAkJc3RydWN0IHNsYWIgKnNsYWJwOwogCQl1bnNpZ25lZCBpbnQgb2JqbnI7CisJCWludCBub2RlaWQgPSAwOwogCiAJCXNsYWJwID0gR0VUX1BBR0VfU0xBQih2aXJ0X3RvX3BhZ2Uob2JqcCkpOworCQlub2RlaWQgPSBzbGFicC0+bm9kZWlkOworCQlsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF07CiAJCWxpc3RfZGVsKCZzbGFicC0+bGlzdCk7CiAJCW9iam5yID0gKG9ianAgLSBzbGFicC0+c19tZW0pIC8gY2FjaGVwLT5vYmpzaXplOworCQljaGVja19zcGlubG9ja19hY3F1aXJlZF9ub2RlKGNhY2hlcCwgbm9kZWlkKTsKIAkJY2hlY2tfc2xhYnAoY2FjaGVwLCBzbGFicCk7CisKKwogI2lmIERFQlVHCiAJCWlmIChzbGFiX2J1ZmN0bChzbGFicClbb2JqbnJdICE9IEJVRkNUTF9GUkVFKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInNsYWI6IGRvdWJsZSBmcmVlIGRldGVjdGVkIGluIGNhY2hlICclcycsIG9ianAgJXAuXG4iLAotCQkJCQkJY2FjaGVwLT5uYW1lLCBvYmpwKTsKKwkJCXByaW50ayhLRVJOX0VSUiAic2xhYjogZG91YmxlIGZyZWUgZGV0ZWN0ZWQgaW4gY2FjaGUgIgorCQkJCQkiJyVzJywgb2JqcCAlcFxuIiwgY2FjaGVwLT5uYW1lLCBvYmpwKTsKIAkJCUJVRygpOwogCQl9CiAjZW5kaWYKQEAgLTIyMDMsMjQgKzI2MzksMjMgQEAKIAkJc2xhYnAtPmZyZWUgPSBvYmpucjsKIAkJU1RBVFNfREVDX0FDVElWRShjYWNoZXApOwogCQlzbGFicC0+aW51c2UtLTsKKwkJbDMtPmZyZWVfb2JqZWN0cysrOwogCQljaGVja19zbGFicChjYWNoZXAsIHNsYWJwKTsKIAogCQkvKiBmaXh1cCBzbGFiIGNoYWlucyAqLwogCQlpZiAoc2xhYnAtPmludXNlID09IDApIHsKLQkJCWlmIChjYWNoZXAtPmxpc3RzLmZyZWVfb2JqZWN0cyA+IGNhY2hlcC0+ZnJlZV9saW1pdCkgewotCQkJCWNhY2hlcC0+bGlzdHMuZnJlZV9vYmplY3RzIC09IGNhY2hlcC0+bnVtOworCQkJaWYgKGwzLT5mcmVlX29iamVjdHMgPiBsMy0+ZnJlZV9saW1pdCkgeworCQkJCWwzLT5mcmVlX29iamVjdHMgLT0gY2FjaGVwLT5udW07CiAJCQkJc2xhYl9kZXN0cm95KGNhY2hlcCwgc2xhYnApOwogCQkJfSBlbHNlIHsKLQkJCQlsaXN0X2FkZCgmc2xhYnAtPmxpc3QsCi0JCQkJJmxpc3QzX2RhdGFfcHRyKGNhY2hlcCwgb2JqcCktPnNsYWJzX2ZyZWUpOworCQkJCWxpc3RfYWRkKCZzbGFicC0+bGlzdCwgJmwzLT5zbGFic19mcmVlKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIFVuY29uZGl0aW9uYWxseSBtb3ZlIGEgc2xhYiB0byB0aGUgZW5kIG9mIHRoZQogCQkJICogcGFydGlhbCBsaXN0IG9uIGZyZWUgLSBtYXhpbXVtIHRpbWUgZm9yIHRoZQogCQkJICogb3RoZXIgb2JqZWN0cyB0byBiZSBmcmVlZCwgdG9vLgogCQkJICovCi0JCQlsaXN0X2FkZF90YWlsKCZzbGFicC0+bGlzdCwKLQkJCQkmbGlzdDNfZGF0YV9wdHIoY2FjaGVwLCBvYmpwKS0+c2xhYnNfcGFydGlhbCk7CisJCQlsaXN0X2FkZF90YWlsKCZzbGFicC0+bGlzdCwgJmwzLT5zbGFic19wYXJ0aWFsKTsKIAkJfQogCX0KIH0KQEAgLTIyMjgsMzYgKzI2NjMsMzggQEAKIHN0YXRpYyB2b2lkIGNhY2hlX2ZsdXNoYXJyYXkoa21lbV9jYWNoZV90ICpjYWNoZXAsIHN0cnVjdCBhcnJheV9jYWNoZSAqYWMpCiB7CiAJaW50IGJhdGNoY291bnQ7CisJc3RydWN0IGttZW1fbGlzdDMgKmwzOwogCiAJYmF0Y2hjb3VudCA9IGFjLT5iYXRjaGNvdW50OwogI2lmIERFQlVHCiAJQlVHX09OKCFiYXRjaGNvdW50IHx8IGJhdGNoY291bnQgPiBhYy0+YXZhaWwpOwogI2VuZGlmCiAJY2hlY2tfaXJxX29mZigpOwotCXNwaW5fbG9jaygmY2FjaGVwLT5zcGlubG9jayk7Ci0JaWYgKGNhY2hlcC0+bGlzdHMuc2hhcmVkKSB7Ci0JCXN0cnVjdCBhcnJheV9jYWNoZSAqc2hhcmVkX2FycmF5ID0gY2FjaGVwLT5saXN0cy5zaGFyZWQ7CisJbDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tudW1hX25vZGVfaWQoKV07CisJc3Bpbl9sb2NrKCZsMy0+bGlzdF9sb2NrKTsKKwlpZiAobDMtPnNoYXJlZCkgeworCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKnNoYXJlZF9hcnJheSA9IGwzLT5zaGFyZWQ7CiAJCWludCBtYXggPSBzaGFyZWRfYXJyYXktPmxpbWl0LXNoYXJlZF9hcnJheS0+YXZhaWw7CiAJCWlmIChtYXgpIHsKIAkJCWlmIChiYXRjaGNvdW50ID4gbWF4KQogCQkJCWJhdGNoY291bnQgPSBtYXg7Ci0JCQltZW1jcHkoJmFjX2VudHJ5KHNoYXJlZF9hcnJheSlbc2hhcmVkX2FycmF5LT5hdmFpbF0sCi0JCQkJCSZhY19lbnRyeShhYylbMF0sCisJCQltZW1jcHkoJihzaGFyZWRfYXJyYXktPmVudHJ5W3NoYXJlZF9hcnJheS0+YXZhaWxdKSwKKwkJCQkJYWMtPmVudHJ5LAogCQkJCQlzaXplb2Yodm9pZCopKmJhdGNoY291bnQpOwogCQkJc2hhcmVkX2FycmF5LT5hdmFpbCArPSBiYXRjaGNvdW50OwogCQkJZ290byBmcmVlX2RvbmU7CiAJCX0KIAl9CiAKLQlmcmVlX2Jsb2NrKGNhY2hlcCwgJmFjX2VudHJ5KGFjKVswXSwgYmF0Y2hjb3VudCk7CisJZnJlZV9ibG9jayhjYWNoZXAsIGFjLT5lbnRyeSwgYmF0Y2hjb3VudCk7CiBmcmVlX2RvbmU6CiAjaWYgU1RBVFMKIAl7CiAJCWludCBpID0gMDsKIAkJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAotCQlwID0gbGlzdDNfZGF0YShjYWNoZXApLT5zbGFic19mcmVlLm5leHQ7Ci0JCXdoaWxlIChwICE9ICYobGlzdDNfZGF0YShjYWNoZXApLT5zbGFic19mcmVlKSkgeworCQlwID0gbDMtPnNsYWJzX2ZyZWUubmV4dDsKKwkJd2hpbGUgKHAgIT0gJihsMy0+c2xhYnNfZnJlZSkpIHsKIAkJCXN0cnVjdCBzbGFiICpzbGFicDsKIAogCQkJc2xhYnAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbGFiLCBsaXN0KTsKQEAgLTIyNjksMTIgKzI3MDYsMTMgQEAKIAkJU1RBVFNfU0VUX0ZSRUVBQkxFKGNhY2hlcCwgaSk7CiAJfQogI2VuZGlmCi0Jc3Bpbl91bmxvY2soJmNhY2hlcC0+c3BpbmxvY2spOworCXNwaW5fdW5sb2NrKCZsMy0+bGlzdF9sb2NrKTsKIAlhYy0+YXZhaWwgLT0gYmF0Y2hjb3VudDsKLQltZW1tb3ZlKCZhY19lbnRyeShhYylbMF0sICZhY19lbnRyeShhYylbYmF0Y2hjb3VudF0sCisJbWVtbW92ZShhYy0+ZW50cnksICYoYWMtPmVudHJ5W2JhdGNoY291bnRdKSwKIAkJCXNpemVvZih2b2lkKikqYWMtPmF2YWlsKTsKIH0KIAorCiAvKgogICogX19jYWNoZV9mcmVlCiAgKiBSZWxlYXNlIGFuIG9iaiBiYWNrIHRvIGl0cyBjYWNoZS4gSWYgdGhlIG9iaiBoYXMgYSBjb25zdHJ1Y3RlZApAQCAtMjI4OSwxNCArMjcyNyw0NiBAQAogCWNoZWNrX2lycV9vZmYoKTsKIAlvYmpwID0gY2FjaGVfZnJlZV9kZWJ1Z2NoZWNrKGNhY2hlcCwgb2JqcCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAorCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGZyZWVpbmcgYSBvYmplY3QgZnJvbSBhbm90aGVyCisJICogbm9kZSB0byB0aGUgYXJyYXkgY2FjaGUgb24gdGhpcyBjcHUuCisJICovCisjaWZkZWYgQ09ORklHX05VTUEKKwl7CisJCXN0cnVjdCBzbGFiICpzbGFicDsKKwkJc2xhYnAgPSBHRVRfUEFHRV9TTEFCKHZpcnRfdG9fcGFnZShvYmpwKSk7CisJCWlmICh1bmxpa2VseShzbGFicC0+bm9kZWlkICE9IG51bWFfbm9kZV9pZCgpKSkgeworCQkJc3RydWN0IGFycmF5X2NhY2hlICphbGllbiA9IE5VTEw7CisJCQlpbnQgbm9kZWlkID0gc2xhYnAtPm5vZGVpZDsKKwkJCXN0cnVjdCBrbWVtX2xpc3QzICpsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW251bWFfbm9kZV9pZCgpXTsKKworCQkJU1RBVFNfSU5DX05PREVGUkVFUyhjYWNoZXApOworCQkJaWYgKGwzLT5hbGllbiAmJiBsMy0+YWxpZW5bbm9kZWlkXSkgeworCQkJCWFsaWVuID0gbDMtPmFsaWVuW25vZGVpZF07CisJCQkJc3Bpbl9sb2NrKCZhbGllbi0+bG9jayk7CisJCQkJaWYgKHVubGlrZWx5KGFsaWVuLT5hdmFpbCA9PSBhbGllbi0+bGltaXQpKQorCQkJCQlfX2RyYWluX2FsaWVuX2NhY2hlKGNhY2hlcCwKKwkJCQkJCQlhbGllbiwgbm9kZWlkKTsKKwkJCQlhbGllbi0+ZW50cnlbYWxpZW4tPmF2YWlsKytdID0gb2JqcDsKKwkJCQlzcGluX3VubG9jaygmYWxpZW4tPmxvY2spOworCQkJfSBlbHNlIHsKKwkJCQlzcGluX2xvY2soJihjYWNoZXAtPm5vZGVsaXN0c1tub2RlaWRdKS0+CisJCQkJCQlsaXN0X2xvY2spOworCQkJCWZyZWVfYmxvY2soY2FjaGVwLCAmb2JqcCwgMSk7CisJCQkJc3Bpbl91bmxvY2soJihjYWNoZXAtPm5vZGVsaXN0c1tub2RlaWRdKS0+CisJCQkJCQlsaXN0X2xvY2spOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJfQorI2VuZGlmCiAJaWYgKGxpa2VseShhYy0+YXZhaWwgPCBhYy0+bGltaXQpKSB7CiAJCVNUQVRTX0lOQ19GUkVFSElUKGNhY2hlcCk7Ci0JCWFjX2VudHJ5KGFjKVthYy0+YXZhaWwrK10gPSBvYmpwOworCQlhYy0+ZW50cnlbYWMtPmF2YWlsKytdID0gb2JqcDsKIAkJcmV0dXJuOwogCX0gZWxzZSB7CiAJCVNUQVRTX0lOQ19GUkVFTUlTUyhjYWNoZXApOwogCQljYWNoZV9mbHVzaGFycmF5KGNhY2hlcCwgYWMpOwotCQlhY19lbnRyeShhYylbYWMtPmF2YWlsKytdID0gb2JqcDsKKwkJYWMtPmVudHJ5W2FjLT5hdmFpbCsrXSA9IG9ianA7CiAJfQogfQogCkBAIC0yMzY2LDgxICsyODM2LDMwIEBACiAgKiBJZGVudGljYWwgdG8ga21lbV9jYWNoZV9hbGxvYywgZXhjZXB0IHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBzbG93CiAgKiBhbmQgY2FuIHNsZWVwLiBBbmQgaXQgd2lsbCBhbGxvY2F0ZSBtZW1vcnkgb24gdGhlIGdpdmVuIG5vZGUsIHdoaWNoCiAgKiBjYW4gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2UgZm9yIGNwdSBib3VuZCBzdHJ1Y3R1cmVzLgorICogTmV3IGFuZCBpbXByb3ZlZDogaXQgd2lsbCBub3cgbWFrZSBzdXJlIHRoYXQgdGhlIG9iamVjdCBnZXRzCisgKiBwdXQgb24gdGhlIGNvcnJlY3Qgbm9kZSBsaXN0IHNvIHRoYXQgdGhlcmUgaXMgbm8gZmFsc2Ugc2hhcmluZy4KICAqLwotdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKGttZW1fY2FjaGVfdCAqY2FjaGVwLCBpbnQgZmxhZ3MsIGludCBub2RlaWQpCit2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoa21lbV9jYWNoZV90ICpjYWNoZXAsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncywgaW50IG5vZGVpZCkKIHsKLQlpbnQgbG9vcDsKLQl2b2lkICpvYmpwOwotCXN0cnVjdCBzbGFiICpzbGFicDsKLQlrbWVtX2J1ZmN0bF90IG5leHQ7CisJdW5zaWduZWQgbG9uZyBzYXZlX2ZsYWdzOworCXZvaWQgKnB0cjsKIAotCWlmIChub2RlaWQgPT0gLTEpCi0JCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlcCwgZmxhZ3MpOworCWlmIChub2RlaWQgPT0gbnVtYV9ub2RlX2lkKCkgfHwgbm9kZWlkID09IC0xKQorCQlyZXR1cm4gX19jYWNoZV9hbGxvYyhjYWNoZXAsIGZsYWdzKTsKIAotCWZvciAobG9vcCA9IDA7O2xvb3ArKykgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICpxOwotCi0JCW9ianAgPSBOVUxMOwotCQljaGVja19pcnFfb24oKTsKLQkJc3Bpbl9sb2NrX2lycSgmY2FjaGVwLT5zcGlubG9jayk7Ci0JCS8qIHdhbGsgdGhyb3VnaCBhbGwgcGFydGlhbCBhbmQgZW1wdHkgc2xhYiBhbmQgZmluZCBvbmUKLQkJICogZnJvbSB0aGUgcmlnaHQgbm9kZSAqLwotCQlsaXN0X2Zvcl9lYWNoKHEsJmNhY2hlcC0+bGlzdHMuc2xhYnNfcGFydGlhbCkgewotCQkJc2xhYnAgPSBsaXN0X2VudHJ5KHEsIHN0cnVjdCBzbGFiLCBsaXN0KTsKLQotCQkJaWYgKHBhZ2VfdG9fbmlkKHZpcnRfdG9fcGFnZShzbGFicC0+c19tZW0pKSA9PSBub2RlaWQgfHwKLQkJCQkJbG9vcCA+IDIpCi0JCQkJZ290byBnb3Rfc2xhYnA7Ci0JCX0KLQkJbGlzdF9mb3JfZWFjaChxLCAmY2FjaGVwLT5saXN0cy5zbGFic19mcmVlKSB7Ci0JCQlzbGFicCA9IGxpc3RfZW50cnkocSwgc3RydWN0IHNsYWIsIGxpc3QpOwotCi0JCQlpZiAocGFnZV90b19uaWQodmlydF90b19wYWdlKHNsYWJwLT5zX21lbSkpID09IG5vZGVpZCB8fAotCQkJCQlsb29wID4gMikKLQkJCQlnb3RvIGdvdF9zbGFicDsKLQkJfQotCQlzcGluX3VubG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwotCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCWlmICghY2FjaGVfZ3JvdyhjYWNoZXAsIGZsYWdzLCBub2RlaWQpKSB7Ci0JCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaWYgKHVubGlrZWx5KCFjYWNoZXAtPm5vZGVsaXN0c1tub2RlaWRdKSkgeworCQkvKiBGYWxsIGJhY2sgdG8gX19jYWNoZV9hbGxvYyBpZiB3ZSBydW4gaW50byB0cm91YmxlICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNsYWI6IG5vdCBhbGxvY2F0aW5nIGluIGluYWN0aXZlIG5vZGUgJWQgZm9yIGNhY2hlICVzXG4iLCBub2RlaWQsIGNhY2hlcC0+bmFtZSk7CisJCXJldHVybiBfX2NhY2hlX2FsbG9jKGNhY2hlcCxmbGFncyk7CiAJfQotZ290X3NsYWJwOgotCS8qIGZvdW5kIG9uZTogYWxsb2NhdGUgb2JqZWN0ICovCi0JY2hlY2tfc2xhYnAoY2FjaGVwLCBzbGFicCk7Ci0JY2hlY2tfc3BpbmxvY2tfYWNxdWlyZWQoY2FjaGVwKTsKIAotCVNUQVRTX0lOQ19BTExPQ0VEKGNhY2hlcCk7Ci0JU1RBVFNfSU5DX0FDVElWRShjYWNoZXApOwotCVNUQVRTX1NFVF9ISUdIKGNhY2hlcCk7Ci0JU1RBVFNfSU5DX05PREVBTExPQ1MoY2FjaGVwKTsKKwljYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2JlZm9yZShjYWNoZXAsIGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZShzYXZlX2ZsYWdzKTsKKwlwdHIgPSBfX2NhY2hlX2FsbG9jX25vZGUoY2FjaGVwLCBmbGFncywgbm9kZWlkKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShzYXZlX2ZsYWdzKTsKKwlwdHIgPSBjYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2FmdGVyKGNhY2hlcCwgZmxhZ3MsIHB0ciwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAotCW9ianAgPSBzbGFicC0+c19tZW0gKyBzbGFicC0+ZnJlZSpjYWNoZXAtPm9ianNpemU7Ci0KLQlzbGFicC0+aW51c2UrKzsKLQluZXh0ID0gc2xhYl9idWZjdGwoc2xhYnApW3NsYWJwLT5mcmVlXTsKLSNpZiBERUJVRwotCXNsYWJfYnVmY3RsKHNsYWJwKVtzbGFicC0+ZnJlZV0gPSBCVUZDVExfRlJFRTsKLSNlbmRpZgotCXNsYWJwLT5mcmVlID0gbmV4dDsKLQljaGVja19zbGFicChjYWNoZXAsIHNsYWJwKTsKLQotCS8qIG1vdmUgc2xhYnAgdG8gY29ycmVjdCBzbGFicCBsaXN0OiAqLwotCWxpc3RfZGVsKCZzbGFicC0+bGlzdCk7Ci0JaWYgKHNsYWJwLT5mcmVlID09IEJVRkNUTF9FTkQpCi0JCWxpc3RfYWRkKCZzbGFicC0+bGlzdCwgJmNhY2hlcC0+bGlzdHMuc2xhYnNfZnVsbCk7Ci0JZWxzZQotCQlsaXN0X2FkZCgmc2xhYnAtPmxpc3QsICZjYWNoZXAtPmxpc3RzLnNsYWJzX3BhcnRpYWwpOwotCi0JbGlzdDNfZGF0YShjYWNoZXApLT5mcmVlX29iamVjdHMtLTsKLQlzcGluX3VubG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwotCi0Jb2JqcCA9IGNhY2hlX2FsbG9jX2RlYnVnY2hlY2tfYWZ0ZXIoY2FjaGVwLCBHRlBfS0VSTkVMLCBvYmpwLAotCQkJCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCXJldHVybiBvYmpwOworCXJldHVybiBwdHI7CiB9CiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2Nfbm9kZSk7CiAKQEAgLTI1MTAsMTEgKzI5MjksMTggQEAKIAlpZiAoIXBkYXRhKQogCQlyZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKLQkJaWYgKCFjcHVfcG9zc2libGUoaSkpCi0JCQljb250aW51ZTsKLQkJcGRhdGEtPnB0cnNbaV0gPSBrbWFsbG9jX25vZGUoc2l6ZSwgR0ZQX0tFUk5FTCwKLQkJCQkJCWNwdV90b19ub2RlKGkpKTsKKwkvKgorCSAqIENhbm5vdCB1c2UgZm9yX2VhY2hfb25saW5lX2NwdSBzaW5jZSBhIGNwdSBtYXkgY29tZSBvbmxpbmUKKwkgKiBhbmQgd2UgaGF2ZSBubyB3YXkgb2YgZmlndXJpbmcgb3V0IGhvdyB0byBmaXggdGhlIGFycmF5CisJICogdGhhdCB3ZSBoYXZlIGFsbG9jYXRlZCB0aGVuLi4uLgorCSAqLworCWZvcl9lYWNoX2NwdShpKSB7CisJCWludCBub2RlID0gY3B1X3RvX25vZGUoaSk7CisKKwkJaWYgKG5vZGVfb25saW5lKG5vZGUpKQorCQkJcGRhdGEtPnB0cnNbaV0gPSBrbWFsbG9jX25vZGUoc2l6ZSwgR0ZQX0tFUk5FTCwgbm9kZSk7CisJCWVsc2UKKwkJCXBkYXRhLT5wdHJzW2ldID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAoIXBkYXRhLT5wdHJzW2ldKQogCQkJZ290byB1bndpbmRfb29tOwpAQCAtMjU1NSwyOSArMjk4MSwyNSBAQAogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2ZyZWUpOwogCiAvKioKLSAqIGtjYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGFycmF5LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgotICogQG46IG51bWJlciBvZiBlbGVtZW50cy4KLSAqIEBzaXplOiBlbGVtZW50IHNpemUuCisgKiBremFsbG9jIC0gYWxsb2NhdGUgbWVtb3J5LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgorICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCiAgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KICAqLwotdm9pZCAqa2NhbGxvYyhzaXplX3Qgbiwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKK3ZvaWQgKmt6YWxsb2Moc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKIHsKLQl2b2lkICpyZXQgPSBOVUxMOwotCi0JaWYgKG4gIT0gMCAmJiBzaXplID4gSU5UX01BWCAvIG4pCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBrbWFsbG9jKG4gKiBzaXplLCBmbGFncyk7CisJdm9pZCAqcmV0ID0ga21hbGxvYyhzaXplLCBmbGFncyk7CiAJaWYgKHJldCkKLQkJbWVtc2V0KHJldCwgMCwgbiAqIHNpemUpOworCQltZW1zZXQocmV0LCAwLCBzaXplKTsKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChrY2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woa3phbGxvYyk7CiAKIC8qKgogICoga2ZyZWUgLSBmcmVlIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeQogICogQG9ianA6IHBvaW50ZXIgcmV0dXJuZWQgYnkga21hbGxvYy4KICAqCisgKiBJZiBAb2JqcCBpcyBOVUxMLCBubyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLgorICoKICAqIERvbid0IGZyZWUgbWVtb3J5IG5vdCBvcmlnaW5hbGx5IGFsbG9jYXRlZCBieSBrbWFsbG9jKCkKICAqIG9yIHlvdSB3aWxsIHJ1biBpbnRvIHRyb3VibGUuCiAgKi8KQEAgLTI2MTAsMTEgKzMwMzIsMTEgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgcGVyY3B1X2RhdGEgKnAgPSAoc3RydWN0IHBlcmNwdV9kYXRhICopICh+KHVuc2lnbmVkIGxvbmcpIG9ianApOwogCi0JZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgewotCQlpZiAoIWNwdV9wb3NzaWJsZShpKSkKLQkJCWNvbnRpbnVlOworCS8qCisJICogV2UgYWxsb2NhdGUgZm9yIGFsbCBjcHVzIHNvIHdlIGNhbm5vdCB1c2UgZm9yIG9ubGluZSBjcHUgaGVyZS4KKwkgKi8KKwlmb3JfZWFjaF9jcHUoaSkKIAkJa2ZyZWUocC0+cHRyc1tpXSk7Ci0JfQogCWtmcmVlKHApOwogfQogRVhQT1JUX1NZTUJPTChmcmVlX3BlcmNwdSk7CkBAIC0yNjMyLDYgKzMwNTQsNjQgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGttZW1fY2FjaGVfbmFtZSk7CiAKKy8qCisgKiBUaGlzIGluaXRpYWxpemVzIGttZW1fbGlzdDMgZm9yIGFsbCBub2Rlcy4KKyAqLworc3RhdGljIGludCBhbGxvY19rbWVtbGlzdChrbWVtX2NhY2hlX3QgKmNhY2hlcCkKK3sKKwlpbnQgbm9kZTsKKwlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CisJaW50IGVyciA9IDA7CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7CisJCXN0cnVjdCBhcnJheV9jYWNoZSAqbmMgPSBOVUxMLCAqbmV3OworCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKipuZXdfYWxpZW4gPSBOVUxMOworI2lmZGVmIENPTkZJR19OVU1BCisJCWlmICghKG5ld19hbGllbiA9IGFsbG9jX2FsaWVuX2NhY2hlKG5vZGUsIGNhY2hlcC0+bGltaXQpKSkKKwkJCWdvdG8gZmFpbDsKKyNlbmRpZgorCQlpZiAoIShuZXcgPSBhbGxvY19hcnJheWNhY2hlKG5vZGUsIChjYWNoZXAtPnNoYXJlZCoKKwkJCQljYWNoZXAtPmJhdGNoY291bnQpLCAweGJhYWRmMDBkKSkpCisJCQlnb3RvIGZhaWw7CisJCWlmICgobDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tub2RlXSkpIHsKKworCQkJc3Bpbl9sb2NrX2lycSgmbDMtPmxpc3RfbG9jayk7CisKKwkJCWlmICgobmMgPSBjYWNoZXAtPm5vZGVsaXN0c1tub2RlXS0+c2hhcmVkKSkKKwkJCQlmcmVlX2Jsb2NrKGNhY2hlcCwgbmMtPmVudHJ5LAorCQkJCQkJCW5jLT5hdmFpbCk7CisKKwkJCWwzLT5zaGFyZWQgPSBuZXc7CisJCQlpZiAoIWNhY2hlcC0+bm9kZWxpc3RzW25vZGVdLT5hbGllbikgeworCQkJCWwzLT5hbGllbiA9IG5ld19hbGllbjsKKwkJCQluZXdfYWxpZW4gPSBOVUxMOworCQkJfQorCQkJbDMtPmZyZWVfbGltaXQgPSAoMSArIG5yX2NwdXNfbm9kZShub2RlKSkqCisJCQkJY2FjaGVwLT5iYXRjaGNvdW50ICsgY2FjaGVwLT5udW07CisJCQlzcGluX3VubG9ja19pcnEoJmwzLT5saXN0X2xvY2spOworCQkJa2ZyZWUobmMpOworCQkJZnJlZV9hbGllbl9jYWNoZShuZXdfYWxpZW4pOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCEobDMgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBrbWVtX2xpc3QzKSwKKwkJCQkJCUdGUF9LRVJORUwsIG5vZGUpKSkKKwkJCWdvdG8gZmFpbDsKKworCQlrbWVtX2xpc3QzX2luaXQobDMpOworCQlsMy0+bmV4dF9yZWFwID0gamlmZmllcyArIFJFQVBUSU1FT1VUX0xJU1QzICsKKwkJCSgodW5zaWduZWQgbG9uZyljYWNoZXApJVJFQVBUSU1FT1VUX0xJU1QzOworCQlsMy0+c2hhcmVkID0gbmV3OworCQlsMy0+YWxpZW4gPSBuZXdfYWxpZW47CisJCWwzLT5mcmVlX2xpbWl0ID0gKDEgKyBucl9jcHVzX25vZGUobm9kZSkpKgorCQkJY2FjaGVwLT5iYXRjaGNvdW50ICsgY2FjaGVwLT5udW07CisJCWNhY2hlcC0+bm9kZWxpc3RzW25vZGVdID0gbDM7CisJfQorCXJldHVybiBlcnI7CitmYWlsOgorCWVyciA9IC1FTk9NRU07CisJcmV0dXJuIGVycjsKK30KKwogc3RydWN0IGNjdXBkYXRlX3N0cnVjdCB7CiAJa21lbV9jYWNoZV90ICpjYWNoZXA7CiAJc3RydWN0IGFycmF5X2NhY2hlICpuZXdbTlJfQ1BVU107CkBAIC0yNjQ0LDcgKzMxMjQsNyBAQAogCiAJY2hlY2tfaXJxX29mZigpOwogCW9sZCA9IGFjX2RhdGEobmV3LT5jYWNoZXApOwotCQorCiAJbmV3LT5jYWNoZXAtPmFycmF5W3NtcF9wcm9jZXNzb3JfaWQoKV0gPSBuZXctPm5ld1tzbXBfcHJvY2Vzc29yX2lkKCldOwogCW5ldy0+bmV3W3NtcF9wcm9jZXNzb3JfaWQoKV0gPSBvbGQ7CiB9CkBAIC0yNjU0LDU0ICszMTM0LDQzIEBACiAJCQkJaW50IHNoYXJlZCkKIHsKIAlzdHJ1Y3QgY2N1cGRhdGVfc3RydWN0IG5ldzsKLQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKm5ld19zaGFyZWQ7Ci0JaW50IGk7CisJaW50IGksIGVycjsKIAogCW1lbXNldCgmbmV3Lm5ldywwLHNpemVvZihuZXcubmV3KSk7Ci0JZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgewotCQlpZiAoY3B1X29ubGluZShpKSkgewotCQkJbmV3Lm5ld1tpXSA9IGFsbG9jX2FycmF5Y2FjaGUoaSwgbGltaXQsIGJhdGNoY291bnQpOwotCQkJaWYgKCFuZXcubmV3W2ldKSB7Ci0JCQkJZm9yIChpLS07IGkgPj0gMDsgaS0tKSBrZnJlZShuZXcubmV3W2ldKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW5ldy5uZXdbaV0gPSBOVUxMOworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQluZXcubmV3W2ldID0gYWxsb2NfYXJyYXljYWNoZShjcHVfdG9fbm9kZShpKSwgbGltaXQsIGJhdGNoY291bnQpOworCQlpZiAoIW5ldy5uZXdbaV0pIHsKKwkJCWZvciAoaS0tOyBpID49IDA7IGktLSkga2ZyZWUobmV3Lm5ld1tpXSk7CisJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KIAluZXcuY2FjaGVwID0gY2FjaGVwOwogCiAJc21wX2NhbGxfZnVuY3Rpb25fYWxsX2NwdXMoZG9fY2N1cGRhdGVfbG9jYWwsICh2b2lkICopJm5ldyk7Ci0JCisKIAljaGVja19pcnFfb24oKTsKIAlzcGluX2xvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKIAljYWNoZXAtPmJhdGNoY291bnQgPSBiYXRjaGNvdW50OwogCWNhY2hlcC0+bGltaXQgPSBsaW1pdDsKLQljYWNoZXAtPmZyZWVfbGltaXQgPSAoMStudW1fb25saW5lX2NwdXMoKSkqY2FjaGVwLT5iYXRjaGNvdW50ICsgY2FjaGVwLT5udW07CisJY2FjaGVwLT5zaGFyZWQgPSBzaGFyZWQ7CiAJc3Bpbl91bmxvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKIAotCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKIAkJc3RydWN0IGFycmF5X2NhY2hlICpjY29sZCA9IG5ldy5uZXdbaV07CiAJCWlmICghY2NvbGQpCiAJCQljb250aW51ZTsKLQkJc3Bpbl9sb2NrX2lycSgmY2FjaGVwLT5zcGlubG9jayk7Ci0JCWZyZWVfYmxvY2soY2FjaGVwLCBhY19lbnRyeShjY29sZCksIGNjb2xkLT5hdmFpbCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY2FjaGVwLT5zcGlubG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmNhY2hlcC0+bm9kZWxpc3RzW2NwdV90b19ub2RlKGkpXS0+bGlzdF9sb2NrKTsKKwkJZnJlZV9ibG9jayhjYWNoZXAsIGNjb2xkLT5lbnRyeSwgY2NvbGQtPmF2YWlsKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjYWNoZXAtPm5vZGVsaXN0c1tjcHVfdG9fbm9kZShpKV0tPmxpc3RfbG9jayk7CiAJCWtmcmVlKGNjb2xkKTsKIAl9Ci0JbmV3X3NoYXJlZCA9IGFsbG9jX2FycmF5Y2FjaGUoLTEsIGJhdGNoY291bnQqc2hhcmVkLCAweGJhYWRmMDBkKTsKLQlpZiAobmV3X3NoYXJlZCkgewotCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKm9sZDsKIAotCQlzcGluX2xvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKLQkJb2xkID0gY2FjaGVwLT5saXN0cy5zaGFyZWQ7Ci0JCWNhY2hlcC0+bGlzdHMuc2hhcmVkID0gbmV3X3NoYXJlZDsKLQkJaWYgKG9sZCkKLQkJCWZyZWVfYmxvY2soY2FjaGVwLCBhY19lbnRyeShvbGQpLCBvbGQtPmF2YWlsKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKLQkJa2ZyZWUob2xkKTsKKwllcnIgPSBhbGxvY19rbWVtbGlzdChjYWNoZXApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGxvY19rbWVtbGlzdCBmYWlsZWQgZm9yICVzLCBlcnJvciAlZC5cbiIsCisJCQkJY2FjaGVwLT5uYW1lLCAtZXJyKTsKKwkJQlVHKCk7CiAJfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3NTksMTEgKzMyMjgsMTEgQEAKIH0KIAogc3RhdGljIHZvaWQgZHJhaW5fYXJyYXlfbG9ja2VkKGttZW1fY2FjaGVfdCAqY2FjaGVwLAotCQkJCXN0cnVjdCBhcnJheV9jYWNoZSAqYWMsIGludCBmb3JjZSkKKwkJCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFjLCBpbnQgZm9yY2UsIGludCBub2RlKQogewogCWludCB0b2ZyZWU7CiAKLQljaGVja19zcGlubG9ja19hY3F1aXJlZChjYWNoZXApOworCWNoZWNrX3NwaW5sb2NrX2FjcXVpcmVkX25vZGUoY2FjaGVwLCBub2RlKTsKIAlpZiAoYWMtPnRvdWNoZWQgJiYgIWZvcmNlKSB7CiAJCWFjLT50b3VjaGVkID0gMDsKIAl9IGVsc2UgaWYgKGFjLT5hdmFpbCkgewpAQCAtMjc3MSw5ICszMjQwLDkgQEAKIAkJaWYgKHRvZnJlZSA+IGFjLT5hdmFpbCkgewogCQkJdG9mcmVlID0gKGFjLT5hdmFpbCsxKS8yOwogCQl9Ci0JCWZyZWVfYmxvY2soY2FjaGVwLCBhY19lbnRyeShhYyksIHRvZnJlZSk7CisJCWZyZWVfYmxvY2soY2FjaGVwLCBhYy0+ZW50cnksIHRvZnJlZSk7CiAJCWFjLT5hdmFpbCAtPSB0b2ZyZWU7Ci0JCW1lbW1vdmUoJmFjX2VudHJ5KGFjKVswXSwgJmFjX2VudHJ5KGFjKVt0b2ZyZWVdLAorCQltZW1tb3ZlKGFjLT5lbnRyeSwgJihhYy0+ZW50cnlbdG9mcmVlXSksCiAJCQkJCXNpemVvZih2b2lkKikqYWMtPmF2YWlsKTsKIAl9CiB9CkBAIC0yNzkyLDYgKzMyNjEsNyBAQAogc3RhdGljIHZvaWQgY2FjaGVfcmVhcCh2b2lkICp1bnVzZWQpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqd2FsazsKKwlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CiAKIAlpZiAoZG93bl90cnlsb2NrKCZjYWNoZV9jaGFpbl9zZW0pKSB7CiAJCS8qIEdpdmUgdXAuIFNldHVwIHRoZSBuZXh0IGl0ZXJhdGlvbi4gKi8KQEAgLTI4MTIsMjcgKzMyODIsMzIgQEAKIAogCQljaGVja19pcnFfb24oKTsKIAotCQlzcGluX2xvY2tfaXJxKCZzZWFyY2hwLT5zcGlubG9jayk7CisJCWwzID0gc2VhcmNocC0+bm9kZWxpc3RzW251bWFfbm9kZV9pZCgpXTsKKwkJaWYgKGwzLT5hbGllbikKKwkJCWRyYWluX2FsaWVuX2NhY2hlKHNlYXJjaHAsIGwzKTsKKwkJc3Bpbl9sb2NrX2lycSgmbDMtPmxpc3RfbG9jayk7CiAKLQkJZHJhaW5fYXJyYXlfbG9ja2VkKHNlYXJjaHAsIGFjX2RhdGEoc2VhcmNocCksIDApOworCQlkcmFpbl9hcnJheV9sb2NrZWQoc2VhcmNocCwgYWNfZGF0YShzZWFyY2hwKSwgMCwKKwkJCQludW1hX25vZGVfaWQoKSk7CiAKLQkJaWYodGltZV9hZnRlcihzZWFyY2hwLT5saXN0cy5uZXh0X3JlYXAsIGppZmZpZXMpKQorCQlpZiAodGltZV9hZnRlcihsMy0+bmV4dF9yZWFwLCBqaWZmaWVzKSkKIAkJCWdvdG8gbmV4dF91bmxvY2s7CiAKLQkJc2VhcmNocC0+bGlzdHMubmV4dF9yZWFwID0gamlmZmllcyArIFJFQVBUSU1FT1VUX0xJU1QzOworCQlsMy0+bmV4dF9yZWFwID0gamlmZmllcyArIFJFQVBUSU1FT1VUX0xJU1QzOwogCi0JCWlmIChzZWFyY2hwLT5saXN0cy5zaGFyZWQpCi0JCQlkcmFpbl9hcnJheV9sb2NrZWQoc2VhcmNocCwgc2VhcmNocC0+bGlzdHMuc2hhcmVkLCAwKTsKKwkJaWYgKGwzLT5zaGFyZWQpCisJCQlkcmFpbl9hcnJheV9sb2NrZWQoc2VhcmNocCwgbDMtPnNoYXJlZCwgMCwKKwkJCQludW1hX25vZGVfaWQoKSk7CiAKLQkJaWYgKHNlYXJjaHAtPmxpc3RzLmZyZWVfdG91Y2hlZCkgewotCQkJc2VhcmNocC0+bGlzdHMuZnJlZV90b3VjaGVkID0gMDsKKwkJaWYgKGwzLT5mcmVlX3RvdWNoZWQpIHsKKwkJCWwzLT5mcmVlX3RvdWNoZWQgPSAwOwogCQkJZ290byBuZXh0X3VubG9jazsKIAkJfQogCi0JCXRvZnJlZSA9IChzZWFyY2hwLT5mcmVlX2xpbWl0KzUqc2VhcmNocC0+bnVtLTEpLyg1KnNlYXJjaHAtPm51bSk7CisJCXRvZnJlZSA9IChsMy0+ZnJlZV9saW1pdCs1KnNlYXJjaHAtPm51bS0xKS8oNSpzZWFyY2hwLT5udW0pOwogCQlkbyB7Ci0JCQlwID0gbGlzdDNfZGF0YShzZWFyY2hwKS0+c2xhYnNfZnJlZS5uZXh0OwotCQkJaWYgKHAgPT0gJihsaXN0M19kYXRhKHNlYXJjaHApLT5zbGFic19mcmVlKSkKKwkJCXAgPSBsMy0+c2xhYnNfZnJlZS5uZXh0OworCQkJaWYgKHAgPT0gJihsMy0+c2xhYnNfZnJlZSkpCiAJCQkJYnJlYWs7CiAKIAkJCXNsYWJwID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc2xhYiwgbGlzdCk7CkBAIC0yODQ1LDEzICszMzIwLDEzIEBACiAJCQkgKiBzZWFyY2hwIGNhbm5vdCBkaXNhcHBlYXIsIHdlIGhvbGQKIAkJCSAqIGNhY2hlX2NoYWluX2xvY2sKIAkJCSAqLwotCQkJc2VhcmNocC0+bGlzdHMuZnJlZV9vYmplY3RzIC09IHNlYXJjaHAtPm51bTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmc2VhcmNocC0+c3BpbmxvY2spOworCQkJbDMtPmZyZWVfb2JqZWN0cyAtPSBzZWFyY2hwLT5udW07CisJCQlzcGluX3VubG9ja19pcnEoJmwzLT5saXN0X2xvY2spOwogCQkJc2xhYl9kZXN0cm95KHNlYXJjaHAsIHNsYWJwKTsKLQkJCXNwaW5fbG9ja19pcnEoJnNlYXJjaHAtPnNwaW5sb2NrKTsKKwkJCXNwaW5fbG9ja19pcnEoJmwzLT5saXN0X2xvY2spOwogCQl9IHdoaWxlKC0tdG9mcmVlID4gMCk7CiBuZXh0X3VubG9jazoKLQkJc3Bpbl91bmxvY2tfaXJxKCZzZWFyY2hwLT5zcGlubG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmbDMtPmxpc3RfbG9jayk7CiBuZXh0OgogCQljb25kX3Jlc2NoZWQoKTsKIAl9CkBAIC0yODg1LDcgKzMzNjAsNyBAQAogCQlzZXFfcHV0cyhtLCAiIDogc2xhYmRhdGEgPGFjdGl2ZV9zbGFicz4gPG51bV9zbGFicz4gPHNoYXJlZGF2YWlsPiIpOwogI2lmIFNUQVRTCiAJCXNlcV9wdXRzKG0sICIgOiBnbG9iYWxzdGF0IDxsaXN0YWxsb2NzPiA8bWF4b2Jqcz4gPGdyb3duPiA8cmVhcGVkPiIKLQkJCQkiIDxlcnJvcj4gPG1heGZyZWVhYmxlPiA8ZnJlZWxpbWl0PiA8bm9kZWFsbG9jcz4iKTsKKwkJCQkiIDxlcnJvcj4gPG1heGZyZWVhYmxlPiA8bm9kZWFsbG9jcz4gPHJlbW90ZWZyZWVzPiIpOwogCQlzZXFfcHV0cyhtLCAiIDogY3B1c3RhdCA8YWxsb2NoaXQ+IDxhbGxvY21pc3M+IDxmcmVlaGl0PiA8ZnJlZW1pc3M+Iik7CiAjZW5kaWYKIAkJc2VxX3B1dGMobSwgJ1xuJyk7CkBAIC0yOTIwLDM5ICszMzk1LDUzIEBACiAJdW5zaWduZWQgbG9uZwlhY3RpdmVfb2JqczsKIAl1bnNpZ25lZCBsb25nCW51bV9vYmpzOwogCXVuc2lnbmVkIGxvbmcJYWN0aXZlX3NsYWJzID0gMDsKLQl1bnNpZ25lZCBsb25nCW51bV9zbGFiczsKLQljb25zdCBjaGFyICpuYW1lOyAKKwl1bnNpZ25lZCBsb25nCW51bV9zbGFicywgZnJlZV9vYmplY3RzID0gMCwgc2hhcmVkX2F2YWlsID0gMDsKKwljb25zdCBjaGFyICpuYW1lOwogCWNoYXIgKmVycm9yID0gTlVMTDsKKwlpbnQgbm9kZTsKKwlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CiAKIAljaGVja19pcnFfb24oKTsKIAlzcGluX2xvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKIAlhY3RpdmVfb2JqcyA9IDA7CiAJbnVtX3NsYWJzID0gMDsKLQlsaXN0X2Zvcl9lYWNoKHEsJmNhY2hlcC0+bGlzdHMuc2xhYnNfZnVsbCkgewotCQlzbGFicCA9IGxpc3RfZW50cnkocSwgc3RydWN0IHNsYWIsIGxpc3QpOwotCQlpZiAoc2xhYnAtPmludXNlICE9IGNhY2hlcC0+bnVtICYmICFlcnJvcikKLQkJCWVycm9yID0gInNsYWJzX2Z1bGwgYWNjb3VudGluZyBlcnJvciI7Ci0JCWFjdGl2ZV9vYmpzICs9IGNhY2hlcC0+bnVtOwotCQlhY3RpdmVfc2xhYnMrKzsKLQl9Ci0JbGlzdF9mb3JfZWFjaChxLCZjYWNoZXAtPmxpc3RzLnNsYWJzX3BhcnRpYWwpIHsKLQkJc2xhYnAgPSBsaXN0X2VudHJ5KHEsIHN0cnVjdCBzbGFiLCBsaXN0KTsKLQkJaWYgKHNsYWJwLT5pbnVzZSA9PSBjYWNoZXAtPm51bSAmJiAhZXJyb3IpCi0JCQllcnJvciA9ICJzbGFic19wYXJ0aWFsIGludXNlIGFjY291bnRpbmcgZXJyb3IiOwotCQlpZiAoIXNsYWJwLT5pbnVzZSAmJiAhZXJyb3IpCi0JCQllcnJvciA9ICJzbGFic19wYXJ0aWFsL2ludXNlIGFjY291bnRpbmcgZXJyb3IiOwotCQlhY3RpdmVfb2JqcyArPSBzbGFicC0+aW51c2U7Ci0JCWFjdGl2ZV9zbGFicysrOwotCX0KLQlsaXN0X2Zvcl9lYWNoKHEsJmNhY2hlcC0+bGlzdHMuc2xhYnNfZnJlZSkgewotCQlzbGFicCA9IGxpc3RfZW50cnkocSwgc3RydWN0IHNsYWIsIGxpc3QpOwotCQlpZiAoc2xhYnAtPmludXNlICYmICFlcnJvcikKLQkJCWVycm9yID0gInNsYWJzX2ZyZWUvaW51c2UgYWNjb3VudGluZyBlcnJvciI7Ci0JCW51bV9zbGFicysrOworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKKwkJbDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tub2RlXTsKKwkJaWYgKCFsMykKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9jaygmbDMtPmxpc3RfbG9jayk7CisKKwkJbGlzdF9mb3JfZWFjaChxLCZsMy0+c2xhYnNfZnVsbCkgeworCQkJc2xhYnAgPSBsaXN0X2VudHJ5KHEsIHN0cnVjdCBzbGFiLCBsaXN0KTsKKwkJCWlmIChzbGFicC0+aW51c2UgIT0gY2FjaGVwLT5udW0gJiYgIWVycm9yKQorCQkJCWVycm9yID0gInNsYWJzX2Z1bGwgYWNjb3VudGluZyBlcnJvciI7CisJCQlhY3RpdmVfb2JqcyArPSBjYWNoZXAtPm51bTsKKwkJCWFjdGl2ZV9zbGFicysrOworCQl9CisJCWxpc3RfZm9yX2VhY2gocSwmbDMtPnNsYWJzX3BhcnRpYWwpIHsKKwkJCXNsYWJwID0gbGlzdF9lbnRyeShxLCBzdHJ1Y3Qgc2xhYiwgbGlzdCk7CisJCQlpZiAoc2xhYnAtPmludXNlID09IGNhY2hlcC0+bnVtICYmICFlcnJvcikKKwkJCQllcnJvciA9ICJzbGFic19wYXJ0aWFsIGludXNlIGFjY291bnRpbmcgZXJyb3IiOworCQkJaWYgKCFzbGFicC0+aW51c2UgJiYgIWVycm9yKQorCQkJCWVycm9yID0gInNsYWJzX3BhcnRpYWwvaW51c2UgYWNjb3VudGluZyBlcnJvciI7CisJCQlhY3RpdmVfb2JqcyArPSBzbGFicC0+aW51c2U7CisJCQlhY3RpdmVfc2xhYnMrKzsKKwkJfQorCQlsaXN0X2Zvcl9lYWNoKHEsJmwzLT5zbGFic19mcmVlKSB7CisJCQlzbGFicCA9IGxpc3RfZW50cnkocSwgc3RydWN0IHNsYWIsIGxpc3QpOworCQkJaWYgKHNsYWJwLT5pbnVzZSAmJiAhZXJyb3IpCisJCQkJZXJyb3IgPSAic2xhYnNfZnJlZS9pbnVzZSBhY2NvdW50aW5nIGVycm9yIjsKKwkJCW51bV9zbGFicysrOworCQl9CisJCWZyZWVfb2JqZWN0cyArPSBsMy0+ZnJlZV9vYmplY3RzOworCQlzaGFyZWRfYXZhaWwgKz0gbDMtPnNoYXJlZC0+YXZhaWw7CisKKwkJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOwogCX0KIAludW1fc2xhYnMrPWFjdGl2ZV9zbGFiczsKIAludW1fb2JqcyA9IG51bV9zbGFicypjYWNoZXAtPm51bTsKLQlpZiAobnVtX29ianMgLSBhY3RpdmVfb2JqcyAhPSBjYWNoZXAtPmxpc3RzLmZyZWVfb2JqZWN0cyAmJiAhZXJyb3IpCisJaWYgKG51bV9vYmpzIC0gYWN0aXZlX29ianMgIT0gZnJlZV9vYmplY3RzICYmICFlcnJvcikKIAkJZXJyb3IgPSAiZnJlZV9vYmplY3RzIGFjY291bnRpbmcgZXJyb3IiOwogCiAJbmFtZSA9IGNhY2hlcC0+bmFtZTsgCkBAIC0yOTY0LDkgKzM0NTMsOSBAQAogCQljYWNoZXAtPm51bSwgKDE8PGNhY2hlcC0+Z2Zwb3JkZXIpKTsKIAlzZXFfcHJpbnRmKG0sICIgOiB0dW5hYmxlcyAlNHUgJTR1ICU0dSIsCiAJCQljYWNoZXAtPmxpbWl0LCBjYWNoZXAtPmJhdGNoY291bnQsCi0JCQljYWNoZXAtPmxpc3RzLnNoYXJlZC0+bGltaXQvY2FjaGVwLT5iYXRjaGNvdW50KTsKLQlzZXFfcHJpbnRmKG0sICIgOiBzbGFiZGF0YSAlNmx1ICU2bHUgJTZ1IiwKLQkJCWFjdGl2ZV9zbGFicywgbnVtX3NsYWJzLCBjYWNoZXAtPmxpc3RzLnNoYXJlZC0+YXZhaWwpOworCQkJY2FjaGVwLT5zaGFyZWQpOworCXNlcV9wcmludGYobSwgIiA6IHNsYWJkYXRhICU2bHUgJTZsdSAlNmx1IiwKKwkJCWFjdGl2ZV9zbGFicywgbnVtX3NsYWJzLCBzaGFyZWRfYXZhaWwpOwogI2lmIFNUQVRTCiAJewkvKiBsaXN0MyBzdGF0cyAqLwogCQl1bnNpZ25lZCBsb25nIGhpZ2ggPSBjYWNoZXAtPmhpZ2hfbWFyazsKQEAgLTI5NzUsMTIgKzM0NjQsMTMgQEAKIAkJdW5zaWduZWQgbG9uZyByZWFwZWQgPSBjYWNoZXAtPnJlYXBlZDsKIAkJdW5zaWduZWQgbG9uZyBlcnJvcnMgPSBjYWNoZXAtPmVycm9yczsKIAkJdW5zaWduZWQgbG9uZyBtYXhfZnJlZWFibGUgPSBjYWNoZXAtPm1heF9mcmVlYWJsZTsKLQkJdW5zaWduZWQgbG9uZyBmcmVlX2xpbWl0ID0gY2FjaGVwLT5mcmVlX2xpbWl0OwogCQl1bnNpZ25lZCBsb25nIG5vZGVfYWxsb2NzID0gY2FjaGVwLT5ub2RlX2FsbG9jczsKKwkJdW5zaWduZWQgbG9uZyBub2RlX2ZyZWVzID0gY2FjaGVwLT5ub2RlX2ZyZWVzOwogCi0JCXNlcV9wcmludGYobSwgIiA6IGdsb2JhbHN0YXQgJTdsdSAlNmx1ICU1bHUgJTRsdSAlNGx1ICU0bHUgJTRsdSAlNGx1IiwKLQkJCQlhbGxvY3MsIGhpZ2gsIGdyb3duLCByZWFwZWQsIGVycm9ycywgCi0JCQkJbWF4X2ZyZWVhYmxlLCBmcmVlX2xpbWl0LCBub2RlX2FsbG9jcyk7CisJCXNlcV9wcmludGYobSwgIiA6IGdsb2JhbHN0YXQgJTdsdSAlNmx1ICU1bHUgJTRsdSBcCisJCQkJJTRsdSAlNGx1ICU0bHUgJTRsdSIsCisJCQkJYWxsb2NzLCBoaWdoLCBncm93biwgcmVhcGVkLCBlcnJvcnMsCisJCQkJbWF4X2ZyZWVhYmxlLCBub2RlX2FsbG9jcywgbm9kZV9mcmVlcyk7CiAJfQogCS8qIGNwdSBzdGF0cyAqLwogCXsKQEAgLTMwNTksOSArMzU0OSwxMCBAQAogCQkJICAgIGJhdGNoY291bnQgPCAxIHx8CiAJCQkgICAgYmF0Y2hjb3VudCA+IGxpbWl0IHx8CiAJCQkgICAgc2hhcmVkIDwgMCkgewotCQkJCXJlcyA9IC1FSU5WQUw7CisJCQkJcmVzID0gMDsKIAkJCX0gZWxzZSB7Ci0JCQkJcmVzID0gZG9fdHVuZV9jcHVjYWNoZShjYWNoZXAsIGxpbWl0LCBiYXRjaGNvdW50LCBzaGFyZWQpOworCQkJCXJlcyA9IGRvX3R1bmVfY3B1Y2FjaGUoY2FjaGVwLCBsaW1pdCwKKwkJCQkJCQliYXRjaGNvdW50LCBzaGFyZWQpOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KQEAgLTMwNzMsMjAgKzM1NjQsMjQgQEAKIH0KICNlbmRpZgogCisvKioKKyAqIGtzaXplIC0gZ2V0IHRoZSBhY3R1YWwgYW1vdW50IG9mIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGEgZ2l2ZW4gb2JqZWN0CisgKiBAb2JqcDogUG9pbnRlciB0byB0aGUgb2JqZWN0CisgKgorICoga21hbGxvYyBtYXkgaW50ZXJuYWxseSByb3VuZCB1cCBhbGxvY2F0aW9ucyBhbmQgcmV0dXJuIG1vcmUgbWVtb3J5CisgKiB0aGFuIHJlcXVlc3RlZC4ga3NpemUoKSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFjdHVhbCBhbW91bnQgb2YKKyAqIG1lbW9yeSBhbGxvY2F0ZWQuIFRoZSBjYWxsZXIgbWF5IHVzZSB0aGlzIGFkZGl0aW9uYWwgbWVtb3J5LCBldmVuIHRob3VnaAorICogYSBzbWFsbGVyIGFtb3VudCBvZiBtZW1vcnkgd2FzIGluaXRpYWxseSBzcGVjaWZpZWQgd2l0aCB0aGUga21hbGxvYyBjYWxsLgorICogVGhlIGNhbGxlciBtdXN0IGd1YXJhbnRlZSB0aGF0IG9ianAgcG9pbnRzIHRvIGEgdmFsaWQgb2JqZWN0IHByZXZpb3VzbHkKKyAqIGFsbG9jYXRlZCB3aXRoIGVpdGhlciBrbWFsbG9jKCkgb3Iga21lbV9jYWNoZV9hbGxvYygpLiBUaGUgb2JqZWN0CisgKiBtdXN0IG5vdCBiZSBmcmVlZCBkdXJpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBjYWxsLgorICovCiB1bnNpZ25lZCBpbnQga3NpemUoY29uc3Qgdm9pZCAqb2JqcCkKIHsKLQlrbWVtX2NhY2hlX3QgKmM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7CisJaWYgKHVubGlrZWx5KG9ianAgPT0gTlVMTCkpCisJCXJldHVybiAwOwogCi0JaWYgKGxpa2VseShvYmpwICE9IE5VTEwpKSB7Ci0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJYyA9IEdFVF9QQUdFX0NBQ0hFKHZpcnRfdG9fcGFnZShvYmpwKSk7Ci0JCXNpemUgPSBrbWVtX2NhY2hlX3NpemUoYyk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gc2l6ZTsKKwlyZXR1cm4gb2JqX3JlYWxsZW4oR0VUX1BBR0VfQ0FDSEUodmlydF90b19wYWdlKG9ianApKSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbW0vc3BhcnNlLmMgYi9tbS9zcGFyc2UuYwppbmRleCBiNTRlMzA0Li4zNDcyNDlhIDEwMDY0NAotLS0gYS9tbS9zcGFyc2UuYworKysgYi9tbS9zcGFyc2UuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKIC8qCkBAIC0xMyw5ICsxNCw2NCBAQAogICoKICAqIDEpIG1lbV9zZWN0aW9uCS0gbWVtb3J5IHNlY3Rpb25zLCBtZW1fbWFwJ3MgZm9yIHZhbGlkIG1lbW9yeQogICovCi1zdHJ1Y3QgbWVtX3NlY3Rpb24gbWVtX3NlY3Rpb25bTlJfTUVNX1NFQ1RJT05TXTsKKyNpZmRlZiBDT05GSUdfU1BBUlNFTUVNX0VYVFJFTUUKK3N0cnVjdCBtZW1fc2VjdGlvbiAqbWVtX3NlY3Rpb25bTlJfU0VDVElPTl9ST09UU10KKwlfX19fY2FjaGVsaW5lX21heGFsaWduZWRfaW5fc21wOworI2Vsc2UKK3N0cnVjdCBtZW1fc2VjdGlvbiBtZW1fc2VjdGlvbltOUl9TRUNUSU9OX1JPT1RTXVtTRUNUSU9OU19QRVJfUk9PVF0KKwlfX19fY2FjaGVsaW5lX21heGFsaWduZWRfaW5fc21wOworI2VuZGlmCiBFWFBPUlRfU1lNQk9MKG1lbV9zZWN0aW9uKTsKIAorI2lmZGVmIENPTkZJR19TUEFSU0VNRU1fRVhUUkVNRQorc3RhdGljIHN0cnVjdCBtZW1fc2VjdGlvbiAqc3BhcnNlX2luZGV4X2FsbG9jKGludCBuaWQpCit7CisJc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGFycmF5X3NpemUgPSBTRUNUSU9OU19QRVJfUk9PVCAqCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBtZW1fc2VjdGlvbik7CisKKwlzZWN0aW9uID0gYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShuaWQpLCBhcnJheV9zaXplKTsKKworCWlmIChzZWN0aW9uKQorCQltZW1zZXQoc2VjdGlvbiwgMCwgYXJyYXlfc2l6ZSk7CisKKwlyZXR1cm4gc2VjdGlvbjsKK30KKworc3RhdGljIGludCBzcGFyc2VfaW5kZXhfaW5pdCh1bnNpZ25lZCBsb25nIHNlY3Rpb25fbnIsIGludCBuaWQpCit7CisJc3RhdGljIHNwaW5sb2NrX3QgaW5kZXhfaW5pdF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCXVuc2lnbmVkIGxvbmcgcm9vdCA9IFNFQ1RJT05fTlJfVE9fUk9PVChzZWN0aW9uX25yKTsKKwlzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb247CisJaW50IHJldCA9IDA7CisKKwlpZiAobWVtX3NlY3Rpb25bcm9vdF0pCisJCXJldHVybiAtRUVYSVNUOworCisJc2VjdGlvbiA9IHNwYXJzZV9pbmRleF9hbGxvYyhuaWQpOworCS8qCisJICogVGhpcyBsb2NrIGtlZXBzIHR3byBkaWZmZXJlbnQgc2VjdGlvbnMgZnJvbQorCSAqIHJlYWxsb2NhdGluZyBmb3IgdGhlIHNhbWUgaW5kZXgKKwkgKi8KKwlzcGluX2xvY2soJmluZGV4X2luaXRfbG9jayk7CisKKwlpZiAobWVtX3NlY3Rpb25bcm9vdF0pIHsKKwkJcmV0ID0gLUVFWElTVDsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtX3NlY3Rpb25bcm9vdF0gPSBzZWN0aW9uOworb3V0OgorCXNwaW5fdW5sb2NrKCZpbmRleF9pbml0X2xvY2spOworCXJldHVybiByZXQ7Cit9CisjZWxzZSAvKiAhU1BBUlNFTUVNX0VYVFJFTUUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNwYXJzZV9pbmRleF9pbml0KHVuc2lnbmVkIGxvbmcgc2VjdGlvbl9uciwgaW50IG5pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiAvKiBSZWNvcmQgYSBtZW1vcnkgYXJlYSBhZ2FpbnN0IGEgbm9kZS4gKi8KIHZvaWQgbWVtb3J5X3ByZXNlbnQoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7CkBAIC0yNCw4ICs4MCwxMyBAQAogCXN0YXJ0ICY9IFBBR0VfU0VDVElPTl9NQVNLOwogCWZvciAocGZuID0gc3RhcnQ7IHBmbiA8IGVuZDsgcGZuICs9IFBBR0VTX1BFUl9TRUNUSU9OKSB7CiAJCXVuc2lnbmVkIGxvbmcgc2VjdGlvbiA9IHBmbl90b19zZWN0aW9uX25yKHBmbik7Ci0JCWlmICghbWVtX3NlY3Rpb25bc2VjdGlvbl0uc2VjdGlvbl9tZW1fbWFwKQotCQkJbWVtX3NlY3Rpb25bc2VjdGlvbl0uc2VjdGlvbl9tZW1fbWFwID0gU0VDVElPTl9NQVJLRURfUFJFU0VOVDsKKwkJc3RydWN0IG1lbV9zZWN0aW9uICptczsKKworCQlzcGFyc2VfaW5kZXhfaW5pdChzZWN0aW9uLCBuaWQpOworCisJCW1zID0gX19ucl90b19zZWN0aW9uKHNlY3Rpb24pOworCQlpZiAoIW1zLT5zZWN0aW9uX21lbV9tYXApCisJCQltcy0+c2VjdGlvbl9tZW1fbWFwID0gU0VDVElPTl9NQVJLRURfUFJFU0VOVDsKIAl9CiB9CiAKQEAgLTg1LDYgKzE0Niw3IEBACiB7CiAJc3RydWN0IHBhZ2UgKm1hcDsKIAlpbnQgbmlkID0gZWFybHlfcGZuX3RvX25pZChzZWN0aW9uX25yX3RvX3BmbihwbnVtKSk7CisJc3RydWN0IG1lbV9zZWN0aW9uICptcyA9IF9fbnJfdG9fc2VjdGlvbihwbnVtKTsKIAogCW1hcCA9IGFsbG9jX3JlbWFwKG5pZCwgc2l6ZW9mKHN0cnVjdCBwYWdlKSAqIFBBR0VTX1BFUl9TRUNUSU9OKTsKIAlpZiAobWFwKQpAQCAtOTYsNyArMTU4LDcgQEAKIAkJcmV0dXJuIG1hcDsKIAogCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQltZW1fc2VjdGlvbltwbnVtXS5zZWN0aW9uX21lbV9tYXAgPSAwOworCW1zLT5zZWN0aW9uX21lbV9tYXAgPSAwOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0xMTQsOCArMTc2LDkgQEAKIAkJCWNvbnRpbnVlOwogCiAJCW1hcCA9IHNwYXJzZV9lYXJseV9tZW1fbWFwX2FsbG9jKHBudW0pOwotCQlpZiAobWFwKQotCQkJc3BhcnNlX2luaXRfb25lX3NlY3Rpb24oJm1lbV9zZWN0aW9uW3BudW1dLCBwbnVtLCBtYXApOworCQlpZiAoIW1hcCkKKwkJCWNvbnRpbnVlOworCQlzcGFyc2VfaW5pdF9vbmVfc2VjdGlvbihfX25yX3RvX3NlY3Rpb24ocG51bSksIHBudW0sIG1hcCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmMKaW5kZXggNGYyNTE3Ny4uYWRiYzJiNCAxMDA2NDQKLS0tIGEvbW0vc3dhcF9zdGF0ZS5jCisrKyBiL21tL3N3YXBfc3RhdGUuYwpAQCAtNjcsOCArNjcsOCBAQAogICogX19hZGRfdG9fc3dhcF9jYWNoZSByZXNlbWJsZXMgYWRkX3RvX3BhZ2VfY2FjaGUgb24gc3dhcHBlcl9zcGFjZSwKICAqIGJ1dCBzZXRzIFN3YXBDYWNoZSBmbGFnIGFuZCBwcml2YXRlIGluc3RlYWQgb2YgbWFwcGluZyBhbmQgaW5kZXguCiAgKi8KLXN0YXRpYyBpbnQgX19hZGRfdG9fc3dhcF9jYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJc3dwX2VudHJ5X3QgZW50cnksIGludCBnZnBfbWFzaykKK3N0YXRpYyBpbnQgX19hZGRfdG9fc3dhcF9jYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3dwX2VudHJ5X3QgZW50cnksCisJCQkgICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKQogewogCWludCBlcnJvcjsKIApAQCAtMTI0LDYgKzEyNCw3IEBACiAJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAlCVUdfT04oIVBhZ2VTd2FwQ2FjaGUocGFnZSkpOwogCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwlCVUdfT04oUGFnZVByaXZhdGUocGFnZSkpOwogCiAJcmFkaXhfdHJlZV9kZWxldGUoJnN3YXBwZXJfc3BhY2UucGFnZV90cmVlLCBwYWdlLT5wcml2YXRlKTsKIAlwYWdlLT5wcml2YXRlID0gMDsKQEAgLTE5NiwxMSArMTk3LDYgQEAKIHsKIAlzd3BfZW50cnlfdCBlbnRyeTsKIAotCUJVR19PTighUGFnZVN3YXBDYWNoZShwYWdlKSk7Ci0JQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKLQlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7Ci0JQlVHX09OKFBhZ2VQcml2YXRlKHBhZ2UpKTsKLSAgCiAJZW50cnkudmFsID0gcGFnZS0+cHJpdmF0ZTsKIAogCXdyaXRlX2xvY2tfaXJxKCZzd2FwcGVyX3NwYWNlLnRyZWVfbG9jayk7CmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCA2MGNkMjRhLi4wMTg0ZjUxIDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCisrKyBiL21tL3N3YXBmaWxlLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CiAKLURFRklORV9TUElOTE9DSyhzd2FwbG9jayk7CitERUZJTkVfU1BJTkxPQ0soc3dhcF9sb2NrKTsKIHVuc2lnbmVkIGludCBucl9zd2FwZmlsZXM7CiBsb25nIHRvdGFsX3N3YXBfcGFnZXM7CiBzdGF0aWMgaW50IHN3YXBfb3ZlcmZsb3c7CkBAIC01MSwxMyArNTEsMTEgQEAKIAogLyoKICAqIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSBiZGV2LT51bnBsdWdfZm4gY2FuIHNsZWVwIGFuZCB3ZSBjYW5ub3QKLSAqIGhvbGQgc3dhcF9saXN0X2xvY2sgd2hpbGUgY2FsbGluZyB0aGUgdW5wbHVnX2ZuLiBBbmQgc3dhcF9saXN0X2xvY2sKKyAqIGhvbGQgc3dhcF9sb2NrIHdoaWxlIGNhbGxpbmcgdGhlIHVucGx1Z19mbi4gQW5kIHN3YXBfbG9jawogICogY2Fubm90IGJlIHR1cm5lZCBpbnRvIGEgc2VtYXBob3JlLgogICovCiBzdGF0aWMgREVDTEFSRV9SV1NFTShzd2FwX3VucGx1Z19zZW0pOwogCi0jZGVmaW5lIFNXQVBGSUxFX0NMVVNURVIgMjU2Ci0KIHZvaWQgc3dhcF91bnBsdWdfaW9fZm4oc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKnVudXNlZF9iZGksIHN0cnVjdCBwYWdlICpwYWdlKQogewogCXN3cF9lbnRyeV90IGVudHJ5OwpAQCAtODQsMTE2ICs4MiwxMzUgQEAKIAl1cF9yZWFkKCZzd2FwX3VucGx1Z19zZW0pOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzY2FuX3N3YXBfbWFwKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKLXsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQkvKiAKLQkgKiBXZSB0cnkgdG8gY2x1c3RlciBzd2FwIHBhZ2VzIGJ5IGFsbG9jYXRpbmcgdGhlbQotCSAqIHNlcXVlbnRpYWxseSBpbiBzd2FwLiAgT25jZSB3ZSd2ZSBhbGxvY2F0ZWQKLQkgKiBTV0FQRklMRV9DTFVTVEVSIHBhZ2VzIHRoaXMgd2F5LCBob3dldmVyLCB3ZSByZXNvcnQgdG8KLQkgKiBmaXJzdC1mcmVlIGFsbG9jYXRpb24sIHN0YXJ0aW5nIGEgbmV3IGNsdXN0ZXIuICBUaGlzCi0JICogcHJldmVudHMgdXMgZnJvbSBzY2F0dGVyaW5nIHN3YXAgcGFnZXMgYWxsIG92ZXIgdGhlIGVudGlyZQotCSAqIHN3YXAgcGFydGl0aW9uLCBzbyB0aGF0IHdlIHJlZHVjZSBvdmVyYWxsIGRpc2sgc2VlayB0aW1lcwotCSAqIGJldHdlZW4gc3dhcCBwYWdlcy4gIC0tIHNjdCAqLwotCWlmIChzaS0+Y2x1c3Rlcl9ucikgewotCQl3aGlsZSAoc2ktPmNsdXN0ZXJfbmV4dCA8PSBzaS0+aGlnaGVzdF9iaXQpIHsKLQkJCW9mZnNldCA9IHNpLT5jbHVzdGVyX25leHQrKzsKLQkJCWlmIChzaS0+c3dhcF9tYXBbb2Zmc2V0XSkKLQkJCQljb250aW51ZTsKLQkJCXNpLT5jbHVzdGVyX25yLS07Ci0JCQlnb3RvIGdvdF9wYWdlOwotCQl9Ci0JfQotCXNpLT5jbHVzdGVyX25yID0gU1dBUEZJTEVfQ0xVU1RFUjsKKyNkZWZpbmUgU1dBUEZJTEVfQ0xVU1RFUgkyNTYKKyNkZWZpbmUgTEFURU5DWV9MSU1JVAkJMjU2CiAKLQkvKiB0cnkgdG8gZmluZCBhbiBlbXB0eSAoZXZlbiBub3QgYWxpZ25lZCkgY2x1c3Rlci4gKi8KLQlvZmZzZXQgPSBzaS0+bG93ZXN0X2JpdDsKLSBjaGVja19uZXh0X2NsdXN0ZXI6Ci0JaWYgKG9mZnNldCtTV0FQRklMRV9DTFVTVEVSLTEgPD0gc2ktPmhpZ2hlc3RfYml0KQotCXsKLQkJdW5zaWduZWQgbG9uZyBucjsKLQkJZm9yIChuciA9IG9mZnNldDsgbnIgPCBvZmZzZXQrU1dBUEZJTEVfQ0xVU1RFUjsgbnIrKykKLQkJCWlmIChzaS0+c3dhcF9tYXBbbnJdKQotCQkJewotCQkJCW9mZnNldCA9IG5yKzE7Ci0JCQkJZ290byBjaGVja19uZXh0X2NsdXN0ZXI7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2Nhbl9zd2FwX21hcChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGxhc3RfaW5fY2x1c3RlcjsKKwlpbnQgbGF0ZW5jeV9yYXRpb24gPSBMQVRFTkNZX0xJTUlUOworCisJLyogCisJICogV2UgdHJ5IHRvIGNsdXN0ZXIgc3dhcCBwYWdlcyBieSBhbGxvY2F0aW5nIHRoZW0gc2VxdWVudGlhbGx5CisJICogaW4gc3dhcC4gIE9uY2Ugd2UndmUgYWxsb2NhdGVkIFNXQVBGSUxFX0NMVVNURVIgcGFnZXMgdGhpcworCSAqIHdheSwgaG93ZXZlciwgd2UgcmVzb3J0IHRvIGZpcnN0LWZyZWUgYWxsb2NhdGlvbiwgc3RhcnRpbmcKKwkgKiBhIG5ldyBjbHVzdGVyLiAgVGhpcyBwcmV2ZW50cyB1cyBmcm9tIHNjYXR0ZXJpbmcgc3dhcCBwYWdlcworCSAqIGFsbCBvdmVyIHRoZSBlbnRpcmUgc3dhcCBwYXJ0aXRpb24sIHNvIHRoYXQgd2UgcmVkdWNlCisJICogb3ZlcmFsbCBkaXNrIHNlZWsgdGltZXMgYmV0d2VlbiBzd2FwIHBhZ2VzLiAgLS0gc2N0CisJICogQnV0IHdlIGRvIG5vdyB0cnkgdG8gZmluZCBhbiBlbXB0eSBjbHVzdGVyLiAgLUFuZHJlYQorCSAqLworCisJc2ktPmZsYWdzICs9IFNXUF9TQ0FOTklORzsKKwlpZiAodW5saWtlbHkoIXNpLT5jbHVzdGVyX25yKSkgeworCQlzaS0+Y2x1c3Rlcl9uciA9IFNXQVBGSUxFX0NMVVNURVIgLSAxOworCQlpZiAoc2ktPnBhZ2VzIC0gc2ktPmludXNlX3BhZ2VzIDwgU1dBUEZJTEVfQ0xVU1RFUikKKwkJCWdvdG8gbG93ZXN0OworCQlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKKworCQlvZmZzZXQgPSBzaS0+bG93ZXN0X2JpdDsKKwkJbGFzdF9pbl9jbHVzdGVyID0gb2Zmc2V0ICsgU1dBUEZJTEVfQ0xVU1RFUiAtIDE7CisKKwkJLyogTG9jYXRlIHRoZSBmaXJzdCBlbXB0eSAodW5hbGlnbmVkKSBjbHVzdGVyICovCisJCWZvciAoOyBsYXN0X2luX2NsdXN0ZXIgPD0gc2ktPmhpZ2hlc3RfYml0OyBvZmZzZXQrKykgeworCQkJaWYgKHNpLT5zd2FwX21hcFtvZmZzZXRdKQorCQkJCWxhc3RfaW5fY2x1c3RlciA9IG9mZnNldCArIFNXQVBGSUxFX0NMVVNURVI7CisJCQllbHNlIGlmIChvZmZzZXQgPT0gbGFzdF9pbl9jbHVzdGVyKSB7CisJCQkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOworCQkJCXNpLT5jbHVzdGVyX25leHQgPSBvZmZzZXQtU1dBUEZJTEVfQ0xVU1RFUi0xOworCQkJCWdvdG8gY2x1c3RlcjsKIAkJCX0KLQkJLyogV2UgZm91bmQgYSBjb21wbGV0bHkgZW1wdHkgY2x1c3Rlciwgc28gc3RhcnQKLQkJICogdXNpbmcgaXQuCi0JCSAqLwotCQlnb3RvIGdvdF9wYWdlOworCQkJaWYgKHVubGlrZWx5KC0tbGF0ZW5jeV9yYXRpb24gPCAwKSkgeworCQkJCWNvbmRfcmVzY2hlZCgpOworCQkJCWxhdGVuY3lfcmF0aW9uID0gTEFURU5DWV9MSU1JVDsKKwkJCX0KKwkJfQorCQlzcGluX2xvY2soJnN3YXBfbG9jayk7CisJCWdvdG8gbG93ZXN0OwogCX0KLQkvKiBObyBsdWNrLCBzbyBub3cgZ28gZmluZWdyaW5lZCBhcyB1c3VhbC4gLUFuZHJlYSAqLwotCWZvciAob2Zmc2V0ID0gc2ktPmxvd2VzdF9iaXQ7IG9mZnNldCA8PSBzaS0+aGlnaGVzdF9iaXQgOyBvZmZzZXQrKykgewotCQlpZiAoc2ktPnN3YXBfbWFwW29mZnNldF0pCi0JCQljb250aW51ZTsKLQkJc2ktPmxvd2VzdF9iaXQgPSBvZmZzZXQrMTsKLQlnb3RfcGFnZToKKworCXNpLT5jbHVzdGVyX25yLS07CitjbHVzdGVyOgorCW9mZnNldCA9IHNpLT5jbHVzdGVyX25leHQ7CisJaWYgKG9mZnNldCA+IHNpLT5oaWdoZXN0X2JpdCkKK2xvd2VzdDoJCW9mZnNldCA9IHNpLT5sb3dlc3RfYml0OworY2hlY2tzOglpZiAoIShzaS0+ZmxhZ3MgJiBTV1BfV1JJVEVPSykpCisJCWdvdG8gbm9fcGFnZTsKKwlpZiAoIXNpLT5oaWdoZXN0X2JpdCkKKwkJZ290byBub19wYWdlOworCWlmICghc2ktPnN3YXBfbWFwW29mZnNldF0pIHsKIAkJaWYgKG9mZnNldCA9PSBzaS0+bG93ZXN0X2JpdCkKIAkJCXNpLT5sb3dlc3RfYml0Kys7CiAJCWlmIChvZmZzZXQgPT0gc2ktPmhpZ2hlc3RfYml0KQogCQkJc2ktPmhpZ2hlc3RfYml0LS07Ci0JCWlmIChzaS0+bG93ZXN0X2JpdCA+IHNpLT5oaWdoZXN0X2JpdCkgeworCQlzaS0+aW51c2VfcGFnZXMrKzsKKwkJaWYgKHNpLT5pbnVzZV9wYWdlcyA9PSBzaS0+cGFnZXMpIHsKIAkJCXNpLT5sb3dlc3RfYml0ID0gc2ktPm1heDsKIAkJCXNpLT5oaWdoZXN0X2JpdCA9IDA7CiAJCX0KIAkJc2ktPnN3YXBfbWFwW29mZnNldF0gPSAxOwotCQlzaS0+aW51c2VfcGFnZXMrKzsKLQkJbnJfc3dhcF9wYWdlcy0tOwotCQlzaS0+Y2x1c3Rlcl9uZXh0ID0gb2Zmc2V0KzE7CisJCXNpLT5jbHVzdGVyX25leHQgPSBvZmZzZXQgKyAxOworCQlzaS0+ZmxhZ3MgLT0gU1dQX1NDQU5OSU5HOwogCQlyZXR1cm4gb2Zmc2V0OwogCX0KLQlzaS0+bG93ZXN0X2JpdCA9IHNpLT5tYXg7Ci0Jc2ktPmhpZ2hlc3RfYml0ID0gMDsKKworCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOworCXdoaWxlICgrK29mZnNldCA8PSBzaS0+aGlnaGVzdF9iaXQpIHsKKwkJaWYgKCFzaS0+c3dhcF9tYXBbb2Zmc2V0XSkgeworCQkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOworCQkJZ290byBjaGVja3M7CisJCX0KKwkJaWYgKHVubGlrZWx5KC0tbGF0ZW5jeV9yYXRpb24gPCAwKSkgeworCQkJY29uZF9yZXNjaGVkKCk7CisJCQlsYXRlbmN5X3JhdGlvbiA9IExBVEVOQ1lfTElNSVQ7CisJCX0KKwl9CisJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOworCWdvdG8gbG93ZXN0OworCitub19wYWdlOgorCXNpLT5mbGFncyAtPSBTV1BfU0NBTk5JTkc7CiAJcmV0dXJuIDA7CiB9CiAKIHN3cF9lbnRyeV90IGdldF9zd2FwX3BhZ2Uodm9pZCkKIHsKLQlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqIHA7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0Jc3dwX2VudHJ5X3QgZW50cnk7Ci0JaW50IHR5cGUsIHdyYXBwZWQgPSAwOworCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTsKKwlwZ29mZl90IG9mZnNldDsKKwlpbnQgdHlwZSwgbmV4dDsKKwlpbnQgd3JhcHBlZCA9IDA7CiAKLQllbnRyeS52YWwgPSAwOwkvKiBPdXQgb2YgbWVtb3J5ICovCi0Jc3dhcF9saXN0X2xvY2soKTsKLQl0eXBlID0gc3dhcF9saXN0Lm5leHQ7Ci0JaWYgKHR5cGUgPCAwKQotCQlnb3RvIG91dDsKKwlzcGluX2xvY2soJnN3YXBfbG9jayk7CiAJaWYgKG5yX3N3YXBfcGFnZXMgPD0gMCkKLQkJZ290byBvdXQ7CisJCWdvdG8gbm9zd2FwOworCW5yX3N3YXBfcGFnZXMtLTsKIAotCXdoaWxlICgxKSB7Ci0JCXAgPSAmc3dhcF9pbmZvW3R5cGVdOwotCQlpZiAoKHAtPmZsYWdzICYgU1dQX0FDVElWRSkgPT0gU1dQX0FDVElWRSkgewotCQkJc3dhcF9kZXZpY2VfbG9jayhwKTsKLQkJCW9mZnNldCA9IHNjYW5fc3dhcF9tYXAocCk7Ci0JCQlzd2FwX2RldmljZV91bmxvY2socCk7Ci0JCQlpZiAob2Zmc2V0KSB7Ci0JCQkJZW50cnkgPSBzd3BfZW50cnkodHlwZSxvZmZzZXQpOwotCQkJCXR5cGUgPSBzd2FwX2luZm9bdHlwZV0ubmV4dDsKLQkJCQlpZiAodHlwZSA8IDAgfHwKLQkJCQkJcC0+cHJpbyAhPSBzd2FwX2luZm9bdHlwZV0ucHJpbykgewotCQkJCQkJc3dhcF9saXN0Lm5leHQgPSBzd2FwX2xpc3QuaGVhZDsKLQkJCQl9IGVsc2UgewotCQkJCQlzd2FwX2xpc3QubmV4dCA9IHR5cGU7Ci0JCQkJfQotCQkJCWdvdG8gb3V0OwotCQkJfQorCWZvciAodHlwZSA9IHN3YXBfbGlzdC5uZXh0OyB0eXBlID49IDAgJiYgd3JhcHBlZCA8IDI7IHR5cGUgPSBuZXh0KSB7CisJCXNpID0gc3dhcF9pbmZvICsgdHlwZTsKKwkJbmV4dCA9IHNpLT5uZXh0OworCQlpZiAobmV4dCA8IDAgfHwKKwkJICAgICghd3JhcHBlZCAmJiBzaS0+cHJpbyAhPSBzd2FwX2luZm9bbmV4dF0ucHJpbykpIHsKKwkJCW5leHQgPSBzd2FwX2xpc3QuaGVhZDsKKwkJCXdyYXBwZWQrKzsKIAkJfQotCQl0eXBlID0gcC0+bmV4dDsKLQkJaWYgKCF3cmFwcGVkKSB7Ci0JCQlpZiAodHlwZSA8IDAgfHwgcC0+cHJpbyAhPSBzd2FwX2luZm9bdHlwZV0ucHJpbykgewotCQkJCXR5cGUgPSBzd2FwX2xpc3QuaGVhZDsKLQkJCQl3cmFwcGVkID0gMTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlpZiAodHlwZSA8IDApCi0JCQkJZ290byBvdXQ7CS8qIG91dCBvZiBzd2FwIHNwYWNlICovCisKKwkJaWYgKCFzaS0+aGlnaGVzdF9iaXQpCisJCQljb250aW51ZTsKKwkJaWYgKCEoc2ktPmZsYWdzICYgU1dQX1dSSVRFT0spKQorCQkJY29udGludWU7CisKKwkJc3dhcF9saXN0Lm5leHQgPSBuZXh0OworCQlvZmZzZXQgPSBzY2FuX3N3YXBfbWFwKHNpKTsKKwkJaWYgKG9mZnNldCkgeworCQkJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CisJCQlyZXR1cm4gc3dwX2VudHJ5KHR5cGUsIG9mZnNldCk7CisJCX0KKwkJbmV4dCA9IHN3YXBfbGlzdC5uZXh0OwogCX0KLW91dDoKLQlzd2FwX2xpc3RfdW5sb2NrKCk7Ci0JcmV0dXJuIGVudHJ5OworCisJbnJfc3dhcF9wYWdlcysrOworbm9zd2FwOgorCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOworCXJldHVybiAoc3dwX2VudHJ5X3QpIHswfTsKIH0KIAogc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICogc3dhcF9pbmZvX2dldChzd3BfZW50cnlfdCBlbnRyeSkKQEAgLTIxNCwxMCArMjMxLDcgQEAKIAkJZ290byBiYWRfb2Zmc2V0OwogCWlmICghcC0+c3dhcF9tYXBbb2Zmc2V0XSkKIAkJZ290byBiYWRfZnJlZTsKLQlzd2FwX2xpc3RfbG9jaygpOwotCWlmIChwLT5wcmlvID4gc3dhcF9pbmZvW3N3YXBfbGlzdC5uZXh0XS5wcmlvKQotCQlzd2FwX2xpc3QubmV4dCA9IHR5cGU7Ci0Jc3dhcF9kZXZpY2VfbG9jayhwKTsKKwlzcGluX2xvY2soJnN3YXBfbG9jayk7CiAJcmV0dXJuIHA7CiAKIGJhZF9mcmVlOgpAQCAtMjM1LDEyICsyNDksNiBAQAogCXJldHVybiBOVUxMOwogfQkKIAotc3RhdGljIHZvaWQgc3dhcF9pbmZvX3B1dChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqIHApCi17Ci0Jc3dhcF9kZXZpY2VfdW5sb2NrKHApOwotCXN3YXBfbGlzdF91bmxvY2soKTsKLX0KLQogc3RhdGljIGludCBzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQogewogCWludCBjb3VudCA9IHAtPnN3YXBfbWFwW29mZnNldF07CkBAIC0yNTMsNiArMjYxLDggQEAKIAkJCQlwLT5sb3dlc3RfYml0ID0gb2Zmc2V0OwogCQkJaWYgKG9mZnNldCA+IHAtPmhpZ2hlc3RfYml0KQogCQkJCXAtPmhpZ2hlc3RfYml0ID0gb2Zmc2V0OworCQkJaWYgKHAtPnByaW8gPiBzd2FwX2luZm9bc3dhcF9saXN0Lm5leHRdLnByaW8pCisJCQkJc3dhcF9saXN0Lm5leHQgPSBwIC0gc3dhcF9pbmZvOwogCQkJbnJfc3dhcF9wYWdlcysrOwogCQkJcC0+aW51c2VfcGFnZXMtLTsKIAkJfQpAQCAtMjcxLDcgKzI4MSw3IEBACiAJcCA9IHN3YXBfaW5mb19nZXQoZW50cnkpOwogCWlmIChwKSB7CiAJCXN3YXBfZW50cnlfZnJlZShwLCBzd3Bfb2Zmc2V0KGVudHJ5KSk7Ci0JCXN3YXBfaW5mb19wdXQocCk7CisJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCX0KIH0KIApAQCAtMjg5LDcgKzI5OSw3IEBACiAJaWYgKHApIHsKIAkJLyogU3VidHJhY3QgdGhlIDEgZm9yIHRoZSBzd2FwIGNhY2hlIGl0c2VsZiAqLwogCQljb3VudCA9IHAtPnN3YXBfbWFwW3N3cF9vZmZzZXQoZW50cnkpXSAtIDE7Ci0JCXN3YXBfaW5mb19wdXQocCk7CisJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCX0KIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0zNDYsNyArMzU2LDcgQEAKIAkJfQogCQl3cml0ZV91bmxvY2tfaXJxKCZzd2FwcGVyX3NwYWNlLnRyZWVfbG9jayk7CiAJfQotCXN3YXBfaW5mb19wdXQocCk7CisJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CiAKIAlpZiAocmV0dmFsKSB7CiAJCXN3YXBfZnJlZShlbnRyeSk7CkBAIC0zNjksNyArMzc5LDcgQEAKIAlpZiAocCkgewogCQlpZiAoc3dhcF9lbnRyeV9mcmVlKHAsIHN3cF9vZmZzZXQoZW50cnkpKSA9PSAxKQogCQkJcGFnZSA9IGZpbmRfdHJ5bG9ja19wYWdlKCZzd2FwcGVyX3NwYWNlLCBlbnRyeS52YWwpOwotCQlzd2FwX2luZm9fcHV0KHApOworCQlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKIAl9CiAJaWYgKHBhZ2UpIHsKIAkJaW50IG9uZV91c2VyOwpAQCAtNTMxLDE3ICs1NDEsMTggQEAKICAqIFNjYW4gc3dhcF9tYXAgZnJvbSBjdXJyZW50IHBvc2l0aW9uIHRvIG5leHQgZW50cnkgc3RpbGwgaW4gdXNlLgogICogUmVjeWNsZSB0byBzdGFydCBvbiByZWFjaGluZyB0aGUgZW5kLCByZXR1cm5pbmcgMCB3aGVuIGVtcHR5LgogICovCi1zdGF0aWMgaW50IGZpbmRfbmV4dF90b191bnVzZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGludCBwcmV2KQorc3RhdGljIHVuc2lnbmVkIGludCBmaW5kX25leHRfdG9fdW51c2Uoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAorCQkJCQl1bnNpZ25lZCBpbnQgcHJldikKIHsKLQlpbnQgbWF4ID0gc2ktPm1heDsKLQlpbnQgaSA9IHByZXY7CisJdW5zaWduZWQgaW50IG1heCA9IHNpLT5tYXg7CisJdW5zaWduZWQgaW50IGkgPSBwcmV2OwogCWludCBjb3VudDsKIAogCS8qCi0JICogTm8gbmVlZCBmb3Igc3dhcF9kZXZpY2VfbG9jayhzaSkgaGVyZTogd2UncmUganVzdCBsb29raW5nCisJICogTm8gbmVlZCBmb3Igc3dhcF9sb2NrIGhlcmU6IHdlJ3JlIGp1c3QgbG9va2luZwogCSAqIGZvciB3aGV0aGVyIGFuIGVudHJ5IGlzIGluIHVzZSwgbm90IG1vZGlmeWluZyBpdDsgZmFsc2UKIAkgKiBoaXRzIGFyZSBva2F5LCBhbmQgc3lzX3N3YXBvZmYoKSBoYXMgYWxyZWFkeSBwcmV2ZW50ZWQgbmV3Ci0JICogYWxsb2NhdGlvbnMgZnJvbSB0aGlzIGFyZWEgKHdoaWxlIGhvbGRpbmcgc3dhcF9saXN0X2xvY2soKSkuCisJICogYWxsb2NhdGlvbnMgZnJvbSB0aGlzIGFyZWEgKHdoaWxlIGhvbGRpbmcgc3dhcF9sb2NrKS4KIAkgKi8KIAlmb3IgKDs7KSB7CiAJCWlmICgrK2kgPj0gbWF4KSB7CkBAIC01NzcsNyArNTg4LDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBzd2NvdW50OwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXN3cF9lbnRyeV90IGVudHJ5OwotCWludCBpID0gMDsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CiAJaW50IHJldHZhbCA9IDA7CiAJaW50IHJlc2V0X292ZXJmbG93ID0gMDsKIAlpbnQgc2htZW07CkBAIC03MzEsOSArNzQyLDkgQEAKIAkJICogcmVwb3J0IHRoZW07IGJ1dCBkbyByZXBvcnQgaWYgd2UgcmVzZXQgU1dBUF9NQVBfTUFYLgogCQkgKi8KIAkJaWYgKCpzd2FwX21hcCA9PSBTV0FQX01BUF9NQVgpIHsKLQkJCXN3YXBfZGV2aWNlX2xvY2soc2kpOworCQkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCQkJKnN3YXBfbWFwID0gMTsKLQkJCXN3YXBfZGV2aWNlX3VubG9jayhzaSk7CisJCQlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKIAkJCXJlc2V0X292ZXJmbG93ID0gMTsKIAkJfQogCkBAIC03OTcsOSArODA4LDkgQEAKIH0KIAogLyoKLSAqIEFmdGVyIGEgc3VjY2Vzc2Z1bCB0cnlfdG9fdW51c2UsIGlmIG5vIHN3YXAgaXMgbm93IGluIHVzZSwgd2Uga25vdyB3ZQotICogY2FuIGVtcHR5IHRoZSBtbWxpc3QuICBzd2FwX2xpc3RfbG9jayBtdXN0IGJlIGhlbGQgb24gZW50cnkgYW5kIGV4aXQuCi0gKiBOb3RlIHRoYXQgbW1saXN0X2xvY2sgbmVzdHMgaW5zaWRlIHN3YXBfbGlzdF9sb2NrLCBhbmQgYW4gbW0gbXVzdCBiZQorICogQWZ0ZXIgYSBzdWNjZXNzZnVsIHRyeV90b191bnVzZSwgaWYgbm8gc3dhcCBpcyBub3cgaW4gdXNlLCB3ZSBrbm93CisgKiB3ZSBjYW4gZW1wdHkgdGhlIG1tbGlzdC4gIHN3YXBfbG9jayBtdXN0IGJlIGhlbGQgb24gZW50cnkgYW5kIGV4aXQuCisgKiBOb3RlIHRoYXQgbW1saXN0X2xvY2sgbmVzdHMgaW5zaWRlIHN3YXBfbG9jaywgYW5kIGFuIG1tIG11c3QgYmUKICAqIGFkZGVkIHRvIHRoZSBtbWxpc3QganVzdCBhZnRlciBwYWdlX2R1cGxpY2F0ZSAtIGJlZm9yZSB3b3VsZCBiZSByYWN5LgogICovCiBzdGF0aWMgdm9pZCBkcmFpbl9tbWxpc3Qodm9pZCkKQEAgLTgzMiw5ICs4NDMsOSBAQAogCQkJCW9mZnNldCA8IChzZS0+c3RhcnRfcGFnZSArIHNlLT5ucl9wYWdlcykpIHsKIAkJCXJldHVybiBzZS0+c3RhcnRfYmxvY2sgKyAob2Zmc2V0IC0gc2UtPnN0YXJ0X3BhZ2UpOwogCQl9Ci0JCWxoID0gc2UtPmxpc3QucHJldjsKKwkJbGggPSBzZS0+bGlzdC5uZXh0OwogCQlpZiAobGggPT0gJnNpcy0+ZXh0ZW50X2xpc3QpCi0JCQlsaCA9IGxoLT5wcmV2OworCQkJbGggPSBsaC0+bmV4dDsKIAkJc2UgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc3dhcF9leHRlbnQsIGxpc3QpOwogCQlzaXMtPmN1cnJfc3dhcF9leHRlbnQgPSBzZTsKIAkJQlVHX09OKHNlID09IHN0YXJ0X3NlKTsJCS8qIEl0ICptdXN0KiBiZSBwcmVzZW50ICovCkBAIC04NTQsMTUgKzg2NSwxMyBAQAogCQlsaXN0X2RlbCgmc2UtPmxpc3QpOwogCQlrZnJlZShzZSk7CiAJfQotCXNpcy0+bnJfZXh0ZW50cyA9IDA7CiB9CiAKIC8qCiAgKiBBZGQgYSBibG9jayByYW5nZSAoYW5kIHRoZSBjb3JyZXNwb25kaW5nIHBhZ2UgcmFuZ2UpIGludG8gdGhpcyBzd2FwZGV2J3MKLSAqIGV4dGVudCBsaXN0LiAgVGhlIGV4dGVudCBsaXN0IGlzIGtlcHQgc29ydGVkIGluIGJsb2NrIG9yZGVyLgorICogZXh0ZW50IGxpc3QuICBUaGUgZXh0ZW50IGxpc3QgaXMga2VwdCBzb3J0ZWQgaW4gcGFnZSBvcmRlci4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJhdGhlciBhc3N1bWVzIHRoYXQgaXQgaXMgY2FsbGVkIGluIGFzY2VuZGluZyBzZWN0b3JfdCBvcmRlci4KLSAqIEl0IGRvZXNuJ3QgbG9vayBmb3IgZXh0ZW50IGNvYWxlc2Npbmcgb3Bwb3J0dW5pdGllcy4KKyAqIFRoaXMgZnVuY3Rpb24gcmF0aGVyIGFzc3VtZXMgdGhhdCBpdCBpcyBjYWxsZWQgaW4gYXNjZW5kaW5nIHBhZ2Ugb3JkZXIuCiAgKi8KIHN0YXRpYyBpbnQKIGFkZF9zd2FwX2V4dGVudChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BhZ2UsCkBAIC04NzIsMTYgKzg4MSwxNSBAQAogCXN0cnVjdCBzd2FwX2V4dGVudCAqbmV3X3NlOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxoOwogCi0JbGggPSBzaXMtPmV4dGVudF9saXN0Lm5leHQ7CS8qIFRoZSBoaWdoZXN0LWFkZHJlc3NlZCBibG9jayAqLwotCXdoaWxlIChsaCAhPSAmc2lzLT5leHRlbnRfbGlzdCkgeworCWxoID0gc2lzLT5leHRlbnRfbGlzdC5wcmV2OwkvKiBUaGUgaGlnaGVzdCBwYWdlIGV4dGVudCAqLworCWlmIChsaCAhPSAmc2lzLT5leHRlbnRfbGlzdCkgewogCQlzZSA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzd2FwX2V4dGVudCwgbGlzdCk7Ci0JCWlmIChzZS0+c3RhcnRfYmxvY2sgKyBzZS0+bnJfcGFnZXMgPT0gc3RhcnRfYmxvY2sgJiYKLQkJICAgIHNlLT5zdGFydF9wYWdlICArIHNlLT5ucl9wYWdlcyA9PSBzdGFydF9wYWdlKSB7CisJCUJVR19PTihzZS0+c3RhcnRfcGFnZSArIHNlLT5ucl9wYWdlcyAhPSBzdGFydF9wYWdlKTsKKwkJaWYgKHNlLT5zdGFydF9ibG9jayArIHNlLT5ucl9wYWdlcyA9PSBzdGFydF9ibG9jaykgewogCQkJLyogTWVyZ2UgaXQgKi8KIAkJCXNlLT5ucl9wYWdlcyArPSBucl9wYWdlczsKIAkJCXJldHVybiAwOwogCQl9Ci0JCWxoID0gbGgtPm5leHQ7CiAJfQogCiAJLyoKQEAgLTg5NCwxNiArOTAyLDggQEAKIAluZXdfc2UtPm5yX3BhZ2VzID0gbnJfcGFnZXM7CiAJbmV3X3NlLT5zdGFydF9ibG9jayA9IHN0YXJ0X2Jsb2NrOwogCi0JbGggPSBzaXMtPmV4dGVudF9saXN0LnByZXY7CS8qIFRoZSBsb3dlc3QgYmxvY2sgKi8KLQl3aGlsZSAobGggIT0gJnNpcy0+ZXh0ZW50X2xpc3QpIHsKLQkJc2UgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc3dhcF9leHRlbnQsIGxpc3QpOwotCQlpZiAoc2UtPnN0YXJ0X2Jsb2NrID4gc3RhcnRfYmxvY2spCi0JCQlicmVhazsKLQkJbGggPSBsaC0+cHJldjsKLQl9Ci0JbGlzdF9hZGRfdGFpbCgmbmV3X3NlLT5saXN0LCBsaCk7Ci0Jc2lzLT5ucl9leHRlbnRzKys7Ci0JcmV0dXJuIDA7CisJbGlzdF9hZGRfdGFpbCgmbmV3X3NlLT5saXN0LCAmc2lzLT5leHRlbnRfbGlzdCk7CisJcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC05MjYsNyArOTI2LDcgQEAKICAqIHJlcXVpcmVtZW50cywgdGhleSBhcmUgc2ltcGx5IHRvc3NlZCBvdXQgLSB3ZSB3aWxsIG5ldmVyIHVzZSB0aG9zZSBibG9ja3MKICAqIGZvciBzd2FwcGluZy4KICAqCi0gKiBGb3IgU19JU1JFRyBzd2FwZmlsZXMgd2UgaG9sZCBpX3NlbSBhY3Jvc3MgdGhlIGxpZmUgb2YgdGhlIHN3YXBvbi4gIFRoaXMKKyAqIEZvciBTX0lTUkVHIHN3YXBmaWxlcyB3ZSBzZXQgU19TV0FQRklMRSBhY3Jvc3MgdGhlIGxpZmUgb2YgdGhlIHN3YXBvbi4gIFRoaXMKICAqIHByZXZlbnRzIHJvb3QgZnJvbSBzaG9vdGluZyBoZXIgZm9vdCBvZmYgYnkgZnRydW5jYXRpbmcgYW4gaW4tdXNlIHN3YXBmaWxlLAogICogd2hpY2ggd2lsbCBzY3JpYmJsZSBvbiB0aGUgZnMuCiAgKgpAQCAtOTM3LDcgKzkzNyw3IEBACiAgKiBUaGlzIGlzIGV4dHJlbWVseSBlZmZlY3RpdmUuICBUaGUgYXZlcmFnZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBpbgogICogbWFwX3N3YXBfcGFnZSgpIGhhcyBiZWVuIG1lYXN1cmVkIGF0IGFib3V0IDAuMyBwZXIgcGFnZS4gIC0gYWtwbS4KICAqLwotc3RhdGljIGludCBzZXR1cF9zd2FwX2V4dGVudHMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcykKK3N0YXRpYyBpbnQgc2V0dXBfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsIHNlY3Rvcl90ICpzcGFuKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJdW5zaWduZWQgYmxvY2tzX3Blcl9wYWdlOwpAQCAtOTQ1LDExICs5NDUsMTUgQEAKIAl1bnNpZ25lZCBibGtiaXRzOwogCXNlY3Rvcl90IHByb2JlX2Jsb2NrOwogCXNlY3Rvcl90IGxhc3RfYmxvY2s7CisJc2VjdG9yX3QgbG93ZXN0X2Jsb2NrID0gLTE7CisJc2VjdG9yX3QgaGlnaGVzdF9ibG9jayA9IDA7CisJaW50IG5yX2V4dGVudHMgPSAwOwogCWludCByZXQ7CiAKIAlpbm9kZSA9IHNpcy0+c3dhcF9maWxlLT5mX21hcHBpbmctPmhvc3Q7CiAJaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKIAkJcmV0ID0gYWRkX3N3YXBfZXh0ZW50KHNpcywgMCwgc2lzLT5tYXgsIDApOworCQkqc3BhbiA9IHNpcy0+cGFnZXM7CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTk5NCwyMiArOTk4LDMyIEBACiAJCQl9CiAJCX0KIAorCQlmaXJzdF9ibG9jayA+Pj0gKFBBR0VfU0hJRlQgLSBibGtiaXRzKTsKKwkJaWYgKHBhZ2Vfbm8pIHsJLyogZXhjbHVkZSB0aGUgaGVhZGVyIHBhZ2UgKi8KKwkJCWlmIChmaXJzdF9ibG9jayA8IGxvd2VzdF9ibG9jaykKKwkJCQlsb3dlc3RfYmxvY2sgPSBmaXJzdF9ibG9jazsKKwkJCWlmIChmaXJzdF9ibG9jayA+IGhpZ2hlc3RfYmxvY2spCisJCQkJaGlnaGVzdF9ibG9jayA9IGZpcnN0X2Jsb2NrOworCQl9CisKIAkJLyoKIAkJICogV2UgZm91bmQgYSBQQUdFX1NJWkUtbGVuZ3RoLCBQQUdFX1NJWkUtYWxpZ25lZCBydW4gb2YgYmxvY2tzCiAJCSAqLwotCQlyZXQgPSBhZGRfc3dhcF9leHRlbnQoc2lzLCBwYWdlX25vLCAxLAotCQkJCWZpcnN0X2Jsb2NrID4+IChQQUdFX1NISUZUIC0gYmxrYml0cykpOwotCQlpZiAocmV0KQorCQlyZXQgPSBhZGRfc3dhcF9leHRlbnQoc2lzLCBwYWdlX25vLCAxLCBmaXJzdF9ibG9jayk7CisJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CisJCW5yX2V4dGVudHMgKz0gcmV0OwogCQlwYWdlX25vKys7CiAJCXByb2JlX2Jsb2NrICs9IGJsb2Nrc19wZXJfcGFnZTsKIHJlcHJvYmU6CiAJCWNvbnRpbnVlOwogCX0KLQlyZXQgPSAwOworCXJldCA9IG5yX2V4dGVudHM7CisJKnNwYW4gPSAxICsgaGlnaGVzdF9ibG9jayAtIGxvd2VzdF9ibG9jazsKIAlpZiAocGFnZV9ubyA9PSAwKQotCQlyZXQgPSAtRUlOVkFMOworCQlwYWdlX25vID0gMTsJLyogZm9yY2UgRW1wdHkgbWVzc2FnZSAqLwogCXNpcy0+bWF4ID0gcGFnZV9ubzsKKwlzaXMtPnBhZ2VzID0gcGFnZV9ubyAtIDE7CiAJc2lzLT5oaWdoZXN0X2JpdCA9IHBhZ2Vfbm8gLSAxOwogZG9uZToKIAlzaXMtPmN1cnJfc3dhcF9leHRlbnQgPSBsaXN0X2VudHJ5KHNpcy0+ZXh0ZW50X2xpc3QucHJldiwKQEAgLTEwNjksNyArMTA4Myw3IEBACiAKIAltYXBwaW5nID0gdmljdGltLT5mX21hcHBpbmc7CiAJcHJldiA9IC0xOwotCXN3YXBfbGlzdF9sb2NrKCk7CisJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCWZvciAodHlwZSA9IHN3YXBfbGlzdC5oZWFkOyB0eXBlID49IDA7IHR5cGUgPSBzd2FwX2luZm9bdHlwZV0ubmV4dCkgewogCQlwID0gc3dhcF9pbmZvICsgdHlwZTsKIAkJaWYgKChwLT5mbGFncyAmIFNXUF9BQ1RJVkUpID09IFNXUF9BQ1RJVkUpIHsKQEAgLTEwODAsMTQgKzEwOTQsMTQgQEAKIAl9CiAJaWYgKHR5cGUgPCAwKSB7CiAJCWVyciA9IC1FSU5WQUw7Ci0JCXN3YXBfbGlzdF91bmxvY2soKTsKKwkJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CiAJCWdvdG8gb3V0X2RwdXQ7CiAJfQogCWlmICghc2VjdXJpdHlfdm1fZW5vdWdoX21lbW9yeShwLT5wYWdlcykpCiAJCXZtX3VuYWNjdF9tZW1vcnkocC0+cGFnZXMpOwogCWVsc2UgewogCQllcnIgPSAtRU5PTUVNOwotCQlzd2FwX2xpc3RfdW5sb2NrKCk7CisJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCQlnb3RvIG91dF9kcHV0OwogCX0KIAlpZiAocHJldiA8IDApIHsKQEAgLTExMDIsMTggKzExMTYsMTUgQEAKIAlucl9zd2FwX3BhZ2VzIC09IHAtPnBhZ2VzOwogCXRvdGFsX3N3YXBfcGFnZXMgLT0gcC0+cGFnZXM7CiAJcC0+ZmxhZ3MgJj0gflNXUF9XUklURU9LOwotCXN3YXBfbGlzdF91bmxvY2soKTsKKwlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKKwogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1NXQVBPRkY7CiAJZXJyID0gdHJ5X3RvX3VudXNlKHR5cGUpOwogCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9TV0FQT0ZGOwogCi0JLyogd2FpdCBmb3IgYW55IHVucGx1ZyBmdW5jdGlvbiB0byBmaW5pc2ggKi8KLQlkb3duX3dyaXRlKCZzd2FwX3VucGx1Z19zZW0pOwotCXVwX3dyaXRlKCZzd2FwX3VucGx1Z19zZW0pOwotCiAJaWYgKGVycikgewogCQkvKiByZS1pbnNlcnQgc3dhcCBzcGFjZSBiYWNrIGludG8gc3dhcF9saXN0ICovCi0JCXN3YXBfbGlzdF9sb2NrKCk7CisJCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKIAkJZm9yIChwcmV2ID0gLTEsIGkgPSBzd2FwX2xpc3QuaGVhZDsgaSA+PSAwOyBwcmV2ID0gaSwgaSA9IHN3YXBfaW5mb1tpXS5uZXh0KQogCQkJaWYgKHAtPnByaW8gPj0gc3dhcF9pbmZvW2ldLnByaW8pCiAJCQkJYnJlYWs7CkBAIC0xMTI1LDIyICsxMTM2LDM0IEBACiAJCW5yX3N3YXBfcGFnZXMgKz0gcC0+cGFnZXM7CiAJCXRvdGFsX3N3YXBfcGFnZXMgKz0gcC0+cGFnZXM7CiAJCXAtPmZsYWdzIHw9IFNXUF9XUklURU9LOwotCQlzd2FwX2xpc3RfdW5sb2NrKCk7CisJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCQlnb3RvIG91dF9kcHV0OwogCX0KKworCS8qIHdhaXQgZm9yIGFueSB1bnBsdWcgZnVuY3Rpb24gdG8gZmluaXNoICovCisJZG93bl93cml0ZSgmc3dhcF91bnBsdWdfc2VtKTsKKwl1cF93cml0ZSgmc3dhcF91bnBsdWdfc2VtKTsKKworCWRlc3Ryb3lfc3dhcF9leHRlbnRzKHApOwogCWRvd24oJnN3YXBvbl9zZW0pOwotCXN3YXBfbGlzdF9sb2NrKCk7CisJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCWRyYWluX21tbGlzdCgpOwotCXN3YXBfZGV2aWNlX2xvY2socCk7CisKKwkvKiB3YWl0IGZvciBhbnlvbmUgc3RpbGwgaW4gc2Nhbl9zd2FwX21hcCAqLworCXAtPmhpZ2hlc3RfYml0ID0gMDsJCS8qIGN1dHMgc2NhbnMgc2hvcnQgKi8KKwl3aGlsZSAocC0+ZmxhZ3MgPj0gU1dQX1NDQU5OSU5HKSB7CisJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOworCX0KKwogCXN3YXBfZmlsZSA9IHAtPnN3YXBfZmlsZTsKIAlwLT5zd2FwX2ZpbGUgPSBOVUxMOwogCXAtPm1heCA9IDA7CiAJc3dhcF9tYXAgPSBwLT5zd2FwX21hcDsKIAlwLT5zd2FwX21hcCA9IE5VTEw7CiAJcC0+ZmxhZ3MgPSAwOwotCWRlc3Ryb3lfc3dhcF9leHRlbnRzKHApOwotCXN3YXBfZGV2aWNlX3VubG9jayhwKTsKLQlzd2FwX2xpc3RfdW5sb2NrKCk7CisJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CiAJdXAoJnN3YXBvbl9zZW0pOwogCXZmcmVlKHN3YXBfbWFwKTsKIAlpbm9kZSA9IG1hcHBpbmctPmhvc3Q7CkBAIC0xMjEzLDcgKzEyMzYsNyBAQAogCiAJZmlsZSA9IHB0ci0+c3dhcF9maWxlOwogCWxlbiA9IHNlcV9wYXRoKHN3YXAsIGZpbGUtPmZfdmZzbW50LCBmaWxlLT5mX2RlbnRyeSwgIiBcdFxuXFwiKTsKLQlzZXFfcHJpbnRmKHN3YXAsICIlKnMlc1x0JWRcdCVsZFx0JWRcbiIsCisJc2VxX3ByaW50Zihzd2FwLCAiJSpzJXNcdCV1XHQldVx0JWRcbiIsCiAJCSAgICAgICBsZW4gPCA0MCA/IDQwIC0gbGVuIDogMSwgIiAiLAogCQkgICAgICAgU19JU0JMSyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSA/CiAJCQkJInBhcnRpdGlvbiIgOiAiZmlsZVx0IiwKQEAgLTEyNzIsNyArMTI5NSw5IEBACiAJc3RhdGljIGludCBsZWFzdF9wcmlvcml0eTsKIAl1bmlvbiBzd2FwX2hlYWRlciAqc3dhcF9oZWFkZXIgPSBOVUxMOwogCWludCBzd2FwX2hlYWRlcl92ZXJzaW9uOwotCWludCBucl9nb29kX3BhZ2VzID0gMDsKKwl1bnNpZ25lZCBpbnQgbnJfZ29vZF9wYWdlcyA9IDA7CisJaW50IG5yX2V4dGVudHMgPSAwOworCXNlY3Rvcl90IHNwYW47CiAJdW5zaWduZWQgbG9uZyBtYXhwYWdlcyA9IDE7CiAJaW50IHN3YXBmaWxlc2l6ZTsKIAl1bnNpZ25lZCBzaG9ydCAqc3dhcF9tYXA7CkBAIC0xMjgyLDcgKzEzMDcsNyBAQAogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwotCXN3YXBfbGlzdF9sb2NrKCk7CisJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCXAgPSBzd2FwX2luZm87CiAJZm9yICh0eXBlID0gMCA7IHR5cGUgPCBucl9zd2FwZmlsZXMgOyB0eXBlKysscCsrKQogCQlpZiAoIShwLT5mbGFncyAmIFNXUF9VU0VEKSkKQEAgLTEzMDEsMTQgKzEzMjYsMTMgQEAKIAkgKiBzd3BfZW50cnlfdCBvciB0aGUgYXJjaGl0ZWN0dXJlIGRlZmluaXRpb24gb2YgYSBzd2FwIHB0ZS4KIAkgKi8KIAlpZiAodHlwZSA+IHN3cF90eXBlKHB0ZV90b19zd3BfZW50cnkoc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkofjBVTCwwKSkpKSkgewotCQlzd2FwX2xpc3RfdW5sb2NrKCk7CisJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKHR5cGUgPj0gbnJfc3dhcGZpbGVzKQogCQlucl9zd2FwZmlsZXMgPSB0eXBlKzE7CiAJSU5JVF9MSVNUX0hFQUQoJnAtPmV4dGVudF9saXN0KTsKIAlwLT5mbGFncyA9IFNXUF9VU0VEOwotCXAtPm5yX2V4dGVudHMgPSAwOwogCXAtPnN3YXBfZmlsZSA9IE5VTEw7CiAJcC0+b2xkX2Jsb2NrX3NpemUgPSAwOwogCXAtPnN3YXBfbWFwID0gTlVMTDsKQEAgLTEzMTYsNyArMTM0MCw2IEBACiAJcC0+aGlnaGVzdF9iaXQgPSAwOwogCXAtPmNsdXN0ZXJfbnIgPSAwOwogCXAtPmludXNlX3BhZ2VzID0gMDsKLQlzcGluX2xvY2tfaW5pdCgmcC0+c2Rldl9sb2NrKTsKIAlwLT5uZXh0ID0gLTE7CiAJaWYgKHN3YXBfZmxhZ3MgJiBTV0FQX0ZMQUdfUFJFRkVSKSB7CiAJCXAtPnByaW8gPQpAQCAtMTMyNCw3ICsxMzQ3LDcgQEAKIAl9IGVsc2UgewogCQlwLT5wcmlvID0gLS1sZWFzdF9wcmlvcml0eTsKIAl9Ci0Jc3dhcF9saXN0X3VubG9jaygpOworCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCW5hbWUgPSBnZXRuYW1lKHNwZWNpYWxmaWxlKTsKIAllcnJvciA9IFBUUl9FUlIobmFtZSk7CiAJaWYgKElTX0VSUihuYW1lKSkgewpAQCAtMTQyNiw2ICsxNDQ5LDggQEAKIAkJfQogCiAJCXAtPmxvd2VzdF9iaXQgID0gMTsKKwkJcC0+Y2x1c3Rlcl9uZXh0ID0gMTsKKwogCQkvKgogCQkgKiBGaW5kIG91dCBob3cgbWFueSBwYWdlcyBhcmUgYWxsb3dlZCBmb3IgYSBzaW5nbGUgc3dhcAogCQkgKiBkZXZpY2UuIFRoZXJlIGFyZSB0d28gbGltaXRpbmcgZmFjdG9yczogMSkgdGhlIG51bWJlciBvZgpAQCAtMTQ0Niw2ICsxNDcxLDEwIEBACiAJCXAtPmhpZ2hlc3RfYml0ID0gbWF4cGFnZXMgLSAxOwogCiAJCWVycm9yID0gLUVJTlZBTDsKKwkJaWYgKCFtYXhwYWdlcykKKwkJCWdvdG8gYmFkX3N3YXA7CisJCWlmIChzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQkJZ290byBiYWRfc3dhcDsKIAkJaWYgKHN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzID4gTUFYX1NXQVBfQkFEUEFHRVMpCiAJCQlnb3RvIGJhZF9zd2FwOwogCQkKQEAgLTE0NzAsMzUgKzE0OTksNDAgQEAKIAkJaWYgKGVycm9yKSAKIAkJCWdvdG8gYmFkX3N3YXA7CiAJfQotCQorCiAJaWYgKHN3YXBmaWxlc2l6ZSAmJiBtYXhwYWdlcyA+IHN3YXBmaWxlc2l6ZSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiU3dhcCBhcmVhIHNob3J0ZXIgdGhhbiBzaWduYXR1cmUgaW5kaWNhdGVzXG4iKTsKIAkJZXJyb3IgPSAtRUlOVkFMOwogCQlnb3RvIGJhZF9zd2FwOwogCX0KKwlpZiAobnJfZ29vZF9wYWdlcykgeworCQlwLT5zd2FwX21hcFswXSA9IFNXQVBfTUFQX0JBRDsKKwkJcC0+bWF4ID0gbWF4cGFnZXM7CisJCXAtPnBhZ2VzID0gbnJfZ29vZF9wYWdlczsKKwkJbnJfZXh0ZW50cyA9IHNldHVwX3N3YXBfZXh0ZW50cyhwLCAmc3Bhbik7CisJCWlmIChucl9leHRlbnRzIDwgMCkgeworCQkJZXJyb3IgPSBucl9leHRlbnRzOworCQkJZ290byBiYWRfc3dhcDsKKwkJfQorCQlucl9nb29kX3BhZ2VzID0gcC0+cGFnZXM7CisJfQogCWlmICghbnJfZ29vZF9wYWdlcykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJFbXB0eSBzd2FwLWZpbGVcbiIpOwogCQllcnJvciA9IC1FSU5WQUw7CiAJCWdvdG8gYmFkX3N3YXA7CiAJfQotCXAtPnN3YXBfbWFwWzBdID0gU1dBUF9NQVBfQkFEOwotCXAtPm1heCA9IG1heHBhZ2VzOwotCXAtPnBhZ2VzID0gbnJfZ29vZF9wYWdlczsKLQotCWVycm9yID0gc2V0dXBfc3dhcF9leHRlbnRzKHApOwotCWlmIChlcnJvcikKLQkJZ290byBiYWRfc3dhcDsKIAogCWRvd24oJnN3YXBvbl9zZW0pOwotCXN3YXBfbGlzdF9sb2NrKCk7Ci0Jc3dhcF9kZXZpY2VfbG9jayhwKTsKKwlzcGluX2xvY2soJnN3YXBfbG9jayk7CiAJcC0+ZmxhZ3MgPSBTV1BfQUNUSVZFOwogCW5yX3N3YXBfcGFnZXMgKz0gbnJfZ29vZF9wYWdlczsKIAl0b3RhbF9zd2FwX3BhZ2VzICs9IG5yX2dvb2RfcGFnZXM7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQWRkaW5nICVkayBzd2FwIG9uICVzLiAgUHJpb3JpdHk6JWQgZXh0ZW50czolZFxuIiwKLQkJbnJfZ29vZF9wYWdlczw8KFBBR0VfU0hJRlQtMTApLCBuYW1lLAotCQlwLT5wcmlvLCBwLT5ucl9leHRlbnRzKTsKKworCXByaW50ayhLRVJOX0lORk8gIkFkZGluZyAldWsgc3dhcCBvbiAlcy4gICIKKwkJCSJQcmlvcml0eTolZCBleHRlbnRzOiVkIGFjcm9zczolbGx1a1xuIiwKKwkJbnJfZ29vZF9wYWdlczw8KFBBR0VfU0hJRlQtMTApLCBuYW1lLCBwLT5wcmlvLAorCQlucl9leHRlbnRzLCAodW5zaWduZWQgbG9uZyBsb25nKXNwYW48PChQQUdFX1NISUZULTEwKSk7CiAKIAkvKiBpbnNlcnQgc3dhcCBzcGFjZSBpbnRvIHN3YXBfbGlzdDogKi8KIAlwcmV2ID0gLTE7CkBAIC0xNTE0LDggKzE1NDgsNyBAQAogCX0gZWxzZSB7CiAJCXN3YXBfaW5mb1twcmV2XS5uZXh0ID0gcCAtIHN3YXBfaW5mbzsKIAl9Ci0Jc3dhcF9kZXZpY2VfdW5sb2NrKHApOwotCXN3YXBfbGlzdF91bmxvY2soKTsKKwlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKIAl1cCgmc3dhcG9uX3NlbSk7CiAJZXJyb3IgPSAwOwogCWdvdG8gb3V0OwpAQCAtMTUyNCwxNiArMTU1NywxNiBAQAogCQlzZXRfYmxvY2tzaXplKGJkZXYsIHAtPm9sZF9ibG9ja19zaXplKTsKIAkJYmRfcmVsZWFzZShiZGV2KTsKIAl9CisJZGVzdHJveV9zd2FwX2V4dGVudHMocCk7CiBiYWRfc3dhcF8yOgotCXN3YXBfbGlzdF9sb2NrKCk7CisJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCXN3YXBfbWFwID0gcC0+c3dhcF9tYXA7CiAJcC0+c3dhcF9maWxlID0gTlVMTDsKIAlwLT5zd2FwX21hcCA9IE5VTEw7CiAJcC0+ZmxhZ3MgPSAwOwogCWlmICghKHN3YXBfZmxhZ3MgJiBTV0FQX0ZMQUdfUFJFRkVSKSkKIAkJKytsZWFzdF9wcmlvcml0eTsKLQlzd2FwX2xpc3RfdW5sb2NrKCk7Ci0JZGVzdHJveV9zd2FwX2V4dGVudHMocCk7CisJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CiAJdmZyZWUoc3dhcF9tYXApOwogCWlmIChzd2FwX2ZpbGUpCiAJCWZpbHBfY2xvc2Uoc3dhcF9maWxlLCBOVUxMKTsKQEAgLTE1NTcsNyArMTU5MCw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgbG9uZyBucl90b19iZV91bnVzZWQgPSAwOwogCi0Jc3dhcF9saXN0X2xvY2soKTsKKwlzcGluX2xvY2soJnN3YXBfbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IG5yX3N3YXBmaWxlczsgaSsrKSB7CiAJCWlmICghKHN3YXBfaW5mb1tpXS5mbGFncyAmIFNXUF9VU0VEKSB8fAogCQkgICAgIChzd2FwX2luZm9baV0uZmxhZ3MgJiBTV1BfV1JJVEVPSykpCkBAIC0xNTY2LDcgKzE1OTksNyBAQAogCX0KIAl2YWwtPmZyZWVzd2FwID0gbnJfc3dhcF9wYWdlcyArIG5yX3RvX2JlX3VudXNlZDsKIAl2YWwtPnRvdGFsc3dhcCA9IHRvdGFsX3N3YXBfcGFnZXMgKyBucl90b19iZV91bnVzZWQ7Ci0Jc3dhcF9saXN0X3VubG9jaygpOworCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogfQogCiAvKgpAQCAtMTU4Nyw3ICsxNjIwLDcgQEAKIAlwID0gdHlwZSArIHN3YXBfaW5mbzsKIAlvZmZzZXQgPSBzd3Bfb2Zmc2V0KGVudHJ5KTsKIAotCXN3YXBfZGV2aWNlX2xvY2socCk7CisJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCWlmIChvZmZzZXQgPCBwLT5tYXggJiYgcC0+c3dhcF9tYXBbb2Zmc2V0XSkgewogCQlpZiAocC0+c3dhcF9tYXBbb2Zmc2V0XSA8IFNXQVBfTUFQX01BWCAtIDEpIHsKIAkJCXAtPnN3YXBfbWFwW29mZnNldF0rKzsKQEAgLTE1OTksNyArMTYzMiw3IEBACiAJCQlyZXN1bHQgPSAxOwogCQl9CiAJfQotCXN3YXBfZGV2aWNlX3VubG9jayhwKTsKKwlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKIG91dDoKIAlyZXR1cm4gcmVzdWx0OwogCkBAIC0xNjE1LDcgKzE2NDgsNyBAQAogfQogCiAvKgotICogc3dhcF9kZXZpY2VfbG9jayBwcmV2ZW50cyBzd2FwX21hcCBiZWluZyBmcmVlZC4gRG9uJ3QgZ3JhYiBhbiBleHRyYQorICogc3dhcF9sb2NrIHByZXZlbnRzIHN3YXBfbWFwIGJlaW5nIGZyZWVkLiBEb24ndCBncmFiIGFuIGV4dHJhCiAgKiByZWZlcmVuY2Ugb24gdGhlIHN3YXBoYW5kbGUsIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIGl0IGJlY29tZXMgdW51c2VkLgogICovCiBpbnQgdmFsaWRfc3dhcGhhbmRsZXMoc3dwX2VudHJ5X3QgZW50cnksIHVuc2lnbmVkIGxvbmcgKm9mZnNldCkKQEAgLTE2MzEsNyArMTY2NCw3IEBACiAJCXRvZmYrKywgaS0tOwogCSpvZmZzZXQgPSB0b2ZmOwogCi0Jc3dhcF9kZXZpY2VfbG9jayhzd2FwZGV2KTsKKwlzcGluX2xvY2soJnN3YXBfbG9jayk7CiAJZG8gewogCQkvKiBEb24ndCByZWFkLWFoZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3dhcCBhcmVhICovCiAJCWlmICh0b2ZmID49IHN3YXBkZXYtPm1heCkKQEAgLTE2NDQsNiArMTY3Nyw2IEBACiAJCXRvZmYrKzsKIAkJcmV0Kys7CiAJfSB3aGlsZSAoLS1pKTsKLQlzd2FwX2RldmljZV91bmxvY2soc3dhcGRldik7CisJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL21tL3ZtYWxsb2MuYyBiL21tL3ZtYWxsb2MuYwppbmRleCA4ZmYxNmExLi4xM2MzZDgyIDEwMDY0NAotLS0gYS9tbS92bWFsbG9jLmMKKysrIGIvbW0vdm1hbGxvYy5jCkBAIC0xNTgsOCArMTU4LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0jZGVmaW5lIElPUkVNQVBfTUFYX09SREVSCSg3ICsgUEFHRV9TSElGVCkJLyogMTI4IHBhZ2VzICovCi0KIHN0cnVjdCB2bV9zdHJ1Y3QgKl9fZ2V0X3ZtX2FyZWEodW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzLAogCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewpAQCAtMzM0LDkgKzMzMiwxMCBAQAogICoJQGFkZHI6CQltZW1vcnkgYmFzZSBhZGRyZXNzCiAgKgogICoJRnJlZSB0aGUgdmlydHVhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5IGFyZWEgc3RhcnRpbmcgYXQgQGFkZHIsIGFzCi0gKglvYnRhaW5lZCBmcm9tIHZtYWxsb2MoKSwgdm1hbGxvY18zMigpIG9yIF9fdm1hbGxvYygpLgorICoJb2J0YWluZWQgZnJvbSB2bWFsbG9jKCksIHZtYWxsb2NfMzIoKSBvciBfX3ZtYWxsb2MoKS4gSWYgQGFkZHIgaXMKKyAqCU5VTEwsIG5vIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCiAgKgotICoJTWF5IG5vdCBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuCisgKglNdXN0IG5vdCBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuCiAgKi8KIHZvaWQgdmZyZWUodm9pZCAqYWRkcikKIHsKQEAgLTM1NCw3ICszNTMsNyBAQAogICoJRnJlZSB0aGUgdmlydHVhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5IGFyZWEgc3RhcnRpbmcgYXQgQGFkZHIsCiAgKgl3aGljaCB3YXMgY3JlYXRlZCBmcm9tIHRoZSBwYWdlIGFycmF5IHBhc3NlZCB0byB2bWFwKCkuCiAgKgotICoJTWF5IG5vdCBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuCisgKglNdXN0IG5vdCBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuCiAgKi8KIHZvaWQgdnVubWFwKHZvaWQgKmFkZHIpCiB7CmRpZmYgLS1naXQgYS9tbS92bXNjYW4uYyBiL21tL3Ztc2Nhbi5jCmluZGV4IGNmZmZlNTAuLmE3NDA3NzggMTAwNjQ0Ci0tLSBhL21tL3Ztc2Nhbi5jCisrKyBiL21tL3Ztc2Nhbi5jCkBAIC04MjIsNiArODIyLDggQEAKIAl1bnNpZ25lZCBsb25nIG5yX2FjdGl2ZTsKIAl1bnNpZ25lZCBsb25nIG5yX2luYWN0aXZlOwogCisJYXRvbWljX2luYygmem9uZS0+cmVjbGFpbV9pbl9wcm9ncmVzcyk7CisKIAkvKgogCSAqIEFkZCBvbmUgdG8gYG5yX3RvX3NjYW4nIGp1c3QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGtlcm5lbCB3aWxsCiAJICogc2xvd2x5IHNpZnQgdGhyb3VnaCB0aGUgYWN0aXZlIGxpc3QuCkBAIC04NjEsNiArODYzLDggQEAKIAl9CiAKIAl0aHJvdHRsZV92bV93cml0ZW91dCgpOworCisJYXRvbWljX2RlYygmem9uZS0+cmVjbGFpbV9pbl9wcm9ncmVzcyk7CiB9CiAKIC8qCkBAIC04OTAsNyArODk0LDcgQEAKIAkJaWYgKHpvbmUtPnByZXNlbnRfcGFnZXMgPT0gMCkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6b25lKSkKKwkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIF9fR0ZQX0hBUkRXQUxMKSkKIAkJCWNvbnRpbnVlOwogCiAJCXpvbmUtPnRlbXBfcHJpb3JpdHkgPSBzYy0+cHJpb3JpdHk7CkBAIC05MDAsOSArOTA0LDcgQEAKIAkJaWYgKHpvbmUtPmFsbF91bnJlY2xhaW1hYmxlICYmIHNjLT5wcmlvcml0eSAhPSBERUZfUFJJT1JJVFkpCiAJCQljb250aW51ZTsJLyogTGV0IGtzd2FwZCBwb2xsIGl0ICovCiAKLQkJYXRvbWljX2luYygmem9uZS0+cmVjbGFpbV9pbl9wcm9ncmVzcyk7CiAJCXNocmlua196b25lKHpvbmUsIHNjKTsKLQkJYXRvbWljX2RlYygmem9uZS0+cmVjbGFpbV9pbl9wcm9ncmVzcyk7CiAJfQogfQogIApAQCAtOTM4LDcgKzk0MCw3IEBACiAJZm9yIChpID0gMDsgem9uZXNbaV0gIT0gTlVMTDsgaSsrKSB7CiAJCXN0cnVjdCB6b25lICp6b25lID0gem9uZXNbaV07CiAKLQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUpKQorCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoem9uZSwgX19HRlBfSEFSRFdBTEwpKQogCQkJY29udGludWU7CiAKIAkJem9uZS0+dGVtcF9wcmlvcml0eSA9IERFRl9QUklPUklUWTsKQEAgLTk4NCw3ICs5ODYsNyBAQAogCWZvciAoaSA9IDA7IHpvbmVzW2ldICE9IDA7IGkrKykgewogCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHpvbmVzW2ldOwogCi0JCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6b25lKSkKKwkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIF9fR0ZQX0hBUkRXQUxMKSkKIAkJCWNvbnRpbnVlOwogCiAJCXpvbmUtPnByZXZfcHJpb3JpdHkgPSB6b25lLT50ZW1wX3ByaW9yaXR5OwpAQCAtMTI1NCw3ICsxMjU2LDcgQEAKIAkJcmV0dXJuOwogCWlmIChwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA8IG9yZGVyKQogCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9IG9yZGVyOwotCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6b25lKSkKKwlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoem9uZSwgX19HRlBfSEFSRFdBTEwpKQogCQlyZXR1cm47CiAJaWYgKCF3YWl0cXVldWVfYWN0aXZlKCZ6b25lLT56b25lX3BnZGF0LT5rc3dhcGRfd2FpdCkpCiAJCXJldHVybjsKQEAgLTEzNTgsMTQgKzEzNjAsMTMgQEAKIAkJc2Muc3dhcF9jbHVzdGVyX21heCA9IFNXQVBfQ0xVU1RFUl9NQVg7CiAKIAkvKiBEb24ndCByZWNsYWltIHRoZSB6b25lIGlmIHRoZXJlIGFyZSBvdGhlciByZWNsYWltZXJzIGFjdGl2ZSAqLwotCWlmICghYXRvbWljX2luY19hbmRfdGVzdCgmem9uZS0+cmVjbGFpbV9pbl9wcm9ncmVzcykpCisJaWYgKGF0b21pY19yZWFkKCZ6b25lLT5yZWNsYWltX2luX3Byb2dyZXNzKSA+IDApCiAJCWdvdG8gb3V0OwogCiAJc2hyaW5rX3pvbmUoem9uZSwgJnNjKTsKIAl0b3RhbF9yZWNsYWltZWQgPSBzYy5ucl9yZWNsYWltZWQ7CiAKICBvdXQ6Ci0JYXRvbWljX2RlYygmem9uZS0+cmVjbGFpbV9pbl9wcm9ncmVzcyk7CiAJcmV0dXJuIHRvdGFsX3JlY2xhaW1lZDsKIH0KIApAQCAtMTM3NSw2ICsxMzc2LDkgQEAKIAlzdHJ1Y3Qgem9uZSAqejsKIAlpbnQgaTsKIAorCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKIAlpZiAobm9kZSA+PSBNQVhfTlVNTk9ERVMgfHwgIW5vZGVfb25saW5lKG5vZGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2NvbmZpZwppbmRleCBjMDdhYWZiLi4yYmRkNTYyIDEwMDY0NAotLS0gYS9uZXQvS2NvbmZpZworKysgYi9uZXQvS2NvbmZpZwpAQCAtMjE1LDYgKzIxNSw3IEBACiBzb3VyY2UgIm5ldC9heDI1L0tjb25maWciCiBzb3VyY2UgIm5ldC9pcmRhL0tjb25maWciCiBzb3VyY2UgIm5ldC9ibHVldG9vdGgvS2NvbmZpZyIKK3NvdXJjZSAibmV0L2llZWU4MDIxMS9LY29uZmlnIgogCiBlbmRpZiAgICMgaWYgTkVUCiBlbmRtZW51ICMgTmV0d29ya2luZwpkaWZmIC0tZ2l0IGEvbmV0L01ha2VmaWxlIGIvbmV0L01ha2VmaWxlCmluZGV4IDdlNmVmZjIuLjRhYTJmNDYgMTAwNjQ0Ci0tLSBhL25ldC9NYWtlZmlsZQorKysgYi9uZXQvTWFrZWZpbGUKQEAgLTQ0LDYgKzQ0LDcgQEAKIG9iai0kKENPTkZJR19WTEFOXzgwMjFRKQkrPSA4MDIxcS8KIG9iai0kKENPTkZJR19JUF9EQ0NQKQkJKz0gZGNjcC8KIG9iai0kKENPTkZJR19JUF9TQ1RQKQkJKz0gc2N0cC8KK29iai0kKENPTkZJR19JRUVFODAyMTEpCQkrPSBpZWVlODAyMTEvCiAKIGlmZXEgKCQoQ09ORklHX05FVCkseSkKIG9iai0kKENPTkZJR19TWVNDVEwpCQkrPSBzeXNjdGxfbmV0Lm8KZGlmZiAtLWdpdCBhL25ldC9hdG0vaW9jdGwuYyBiL25ldC9hdG0vaW9jdGwuYwppbmRleCA0ZGJiNWFmLi5kODkwNTZlIDEwMDY0NAotLS0gYS9uZXQvYXRtL2lvY3RsLmMKKysrIGIvbmV0L2F0bS9pb2N0bC5jCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlICJyZXNvdXJjZXMuaCIKICNpbmNsdWRlICJzaWduYWxpbmcuaCIJCS8qIGZvciBXQUlUSU5HIGFuZCBzaWdkX2F0dGFjaCAqLworI2luY2x1ZGUgImNvbW1vbi5oIgogCiAKIHN0YXRpYyBERUNMQVJFX01VVEVYKGlvY3RsX211dGV4KTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vbXBjLmMgYi9uZXQvYXRtL21wYy5jCmluZGV4IDE3YTgxZWIuLjUyNmQ5NTMgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbXBjLmMKKysrIGIvbmV0L2F0bS9tcGMuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAKIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjcyA9IE5VTEw7IC8qIEZJWE1FICovCiBzdGF0aWMgc3RydWN0IGF0bV9tcG9hX3FvcyAqcW9zX2hlYWQgPSBOVUxMOwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IG1wY190aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihtcGNfdGltZXIsIE5VTEwsIDAsIDApOwogCiAKIHN0YXRpYyBzdHJ1Y3QgbXBvYV9jbGllbnQgKmZpbmRfbXBjX2J5X2l0Zm51bShpbnQgaXRmKQpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYWZfYXgyNS5jIGIvbmV0L2F4MjUvYWZfYXgyNS5jCmluZGV4IGVhNDNkZmIuLmVkNzA1ZGQgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2FmX2F4MjUuYworKysgYi9uZXQvYXgyNS9hZl9heDI1LmMKQEAgLTE4NzQsNiArMTg3NCw3IEBACiBzdGF0aWMgaW50IGF4MjVfaW5mb19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCWF4MjVfY2IgKmF4MjUgPSB2OworCWNoYXIgYnVmWzExXTsKIAlpbnQgazsKIAogCkBAIC0xODg1LDEzICsxODg2LDEzIEBACiAJc2VxX3ByaW50ZihzZXEsICIlOC44bHggJXMgJXMlcyAiLAogCQkgICAobG9uZykgYXgyNSwKIAkJICAgYXgyNS0+YXgyNV9kZXYgPT0gTlVMTD8gIj8/PyIgOiBheDI1LT5heDI1X2Rldi0+ZGV2LT5uYW1lLAotCQkgICBheDJhc2MoJmF4MjUtPnNvdXJjZV9hZGRyKSwKKwkJICAgYXgyYXNjKGJ1ZiwgJmF4MjUtPnNvdXJjZV9hZGRyKSwKIAkJICAgYXgyNS0+aWFtZGlnaT8gIioiOiIiKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYXgyYXNjKCZheDI1LT5kZXN0X2FkZHIpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYXgyYXNjKGJ1ZiwgJmF4MjUtPmRlc3RfYWRkcikpOwogCiAJZm9yIChrPTA7IChheDI1LT5kaWdpcGVhdCAhPSBOVUxMKSAmJiAoayA8IGF4MjUtPmRpZ2lwZWF0LT5uZGlnaSk7IGsrKykgewogCQlzZXFfcHJpbnRmKHNlcSwgIiwlcyVzIiwKLQkJCSAgIGF4MmFzYygmYXgyNS0+ZGlnaXBlYXQtPmNhbGxzW2tdKSwKKwkJCSAgIGF4MmFzYyhidWYsICZheDI1LT5kaWdpcGVhdC0+Y2FsbHNba10pLAogCQkJICAgYXgyNS0+ZGlnaXBlYXQtPnJlcGVhdGVkW2tdPyAiKiI6IiIpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9hZGRyLmMgYi9uZXQvYXgyNS9heDI1X2FkZHIuYwppbmRleCBmNGZhNmRmLi4wMTY0YTE1IDEwMDY0NAotLS0gYS9uZXQvYXgyNS9heDI1X2FkZHIuYworKysgYi9uZXQvYXgyNS9heDI1X2FkZHIuYwpAQCAtMzYsOSArMzYsOCBAQAogLyoKICAqCWF4MjUgLT4gYXNjaWkgY29udmVyc2lvbgogICovCi1jaGFyICpheDJhc2MoYXgyNV9hZGRyZXNzICphKQorY2hhciAqYXgyYXNjKGNoYXIgKmJ1ZiwgYXgyNV9hZGRyZXNzICphKQogewotCXN0YXRpYyBjaGFyIGJ1ZlsxMV07CiAJY2hhciBjLCAqczsKIAlpbnQgbjsKIApAQCAtNjgsMzcgKzY3LDM0IEBACiAvKgogICoJYXNjaWkgLT4gYXgyNSBjb252ZXJzaW9uCiAgKi8KLWF4MjVfYWRkcmVzcyAqYXNjMmF4KGNoYXIgKmNhbGxzaWduKQordm9pZCBhc2MyYXgoYXgyNV9hZGRyZXNzICphZGRyLCBjaGFyICpjYWxsc2lnbikKIHsKLQlzdGF0aWMgYXgyNV9hZGRyZXNzIGFkZHI7CiAJY2hhciAqczsKIAlpbnQgbjsKIAogCWZvciAocyA9IGNhbGxzaWduLCBuID0gMDsgbiA8IDY7IG4rKykgewogCQlpZiAoKnMgIT0gJ1wwJyAmJiAqcyAhPSAnLScpCi0JCQlhZGRyLmF4MjVfY2FsbFtuXSA9ICpzKys7CisJCQlhZGRyLT5heDI1X2NhbGxbbl0gPSAqcysrOwogCQllbHNlCi0JCQlhZGRyLmF4MjVfY2FsbFtuXSA9ICcgJzsKLQkJYWRkci5heDI1X2NhbGxbbl0gPDw9IDE7Ci0JCWFkZHIuYXgyNV9jYWxsW25dICY9IDB4RkU7CisJCQlhZGRyLT5heDI1X2NhbGxbbl0gPSAnICc7CisJCWFkZHItPmF4MjVfY2FsbFtuXSA8PD0gMTsKKwkJYWRkci0+YXgyNV9jYWxsW25dICY9IDB4RkU7CiAJfQogCiAJaWYgKCpzKysgPT0gJ1wwJykgewotCQlhZGRyLmF4MjVfY2FsbFs2XSA9IDB4MDA7Ci0JCXJldHVybiAmYWRkcjsKKwkJYWRkci0+YXgyNV9jYWxsWzZdID0gMHgwMDsKKwkJcmV0dXJuOwogCX0KIAotCWFkZHIuYXgyNV9jYWxsWzZdID0gKnMrKyAtICcwJzsKKwlhZGRyLT5heDI1X2NhbGxbNl0gPSAqcysrIC0gJzAnOwogCiAJaWYgKCpzICE9ICdcMCcpIHsKLQkJYWRkci5heDI1X2NhbGxbNl0gKj0gMTA7Ci0JCWFkZHIuYXgyNV9jYWxsWzZdICs9ICpzKysgLSAnMCc7CisJCWFkZHItPmF4MjVfY2FsbFs2XSAqPSAxMDsKKwkJYWRkci0+YXgyNV9jYWxsWzZdICs9ICpzKysgLSAnMCc7CiAJfQogCi0JYWRkci5heDI1X2NhbGxbNl0gPDw9IDE7Ci0JYWRkci5heDI1X2NhbGxbNl0gJj0gMHgxRTsKLQotCXJldHVybiAmYWRkcjsKKwlhZGRyLT5heDI1X2NhbGxbNl0gPDw9IDE7CisJYWRkci0+YXgyNV9jYWxsWzZdICY9IDB4MUU7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9uZXQvYXgyNS9heDI1X3JvdXRlLmMgYi9uZXQvYXgyNS9heDI1X3JvdXRlLmMKaW5kZXggYzI4ODUyNi4uMjZiNzdkOSAxMDA2NDQKLS0tIGEvbmV0L2F4MjUvYXgyNV9yb3V0ZS5jCisrKyBiL25ldC9heDI1L2F4MjVfcm91dGUuYwpAQCAtMjk4LDYgKzI5OCw4IEBACiAKIHN0YXRpYyBpbnQgYXgyNV9ydF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKKwljaGFyIGJ1ZlsxMV07CisKIAlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCiAJCXNlcV9wdXRzKHNlcSwgImNhbGxzaWduICBkZXYgIG1vZGUgZGlnaXBlYXRlcnNcbiIpOwogCWVsc2UgewpAQCAtMzA4LDcgKzMxMCw3IEBACiAJCWlmIChheDI1Y21wKCZheDI1X3J0LT5jYWxsc2lnbiwgJm51bGxfYXgyNV9hZGRyZXNzKSA9PSAwKQogCQkJY2FsbHNpZ24gPSAiZGVmYXVsdCI7CiAJCWVsc2UKLQkJCWNhbGxzaWduID0gYXgyYXNjKCZheDI1X3J0LT5jYWxsc2lnbik7CisJCQljYWxsc2lnbiA9IGF4MmFzYyhidWYsICZheDI1X3J0LT5jYWxsc2lnbik7CiAKIAkJc2VxX3ByaW50ZihzZXEsICIlLTlzICUtNHMiLAogCQkJY2FsbHNpZ24sCkBAIC0zMjgsNyArMzMwLDggQEAKIAogCQlpZiAoYXgyNV9ydC0+ZGlnaXBlYXQgIT0gTlVMTCkKIAkJCWZvciAoaSA9IDA7IGkgPCBheDI1X3J0LT5kaWdpcGVhdC0+bmRpZ2k7IGkrKykKLQkJCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIGF4MmFzYygmYXgyNV9ydC0+ZGlnaXBlYXQtPmNhbGxzW2ldKSk7CisJCQkJc2VxX3ByaW50ZihzZXEsICIgJXMiLAorCQkJCSAgICAgYXgyYXNjKGJ1ZiwgJmF4MjVfcnQtPmRpZ2lwZWF0LT5jYWxsc1tpXSkpOwogCiAJCXNlcV9wdXRzKHNlcSwgIlxuIik7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV91aWQuYyBiL25ldC9heDI1L2F4MjVfdWlkLmMKaW5kZXggYThiMzgyMi4uZDUzY2M4NiAxMDA2NDQKLS0tIGEvbmV0L2F4MjUvYXgyNV91aWQuYworKysgYi9uZXQvYXgyNS9heDI1X3VpZC5jCkBAIC0xNjgsMTIgKzE2OCwxNCBAQAogCiBzdGF0aWMgaW50IGF4MjVfdWlkX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogeworCWNoYXIgYnVmWzExXTsKKwogCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKIAkJc2VxX3ByaW50ZihzZXEsICJQb2xpY3k6ICVkXG4iLCBheDI1X3VpZF9wb2xpY3kpOwogCWVsc2UgewogCQlzdHJ1Y3QgYXgyNV91aWRfYXNzb2MgKnB0ID0gdjsKIAotCQlzZXFfcHJpbnRmKHNlcSwgIiU2ZCAlc1xuIiwgcHQtPnVpZCwgYXgyYXNjKCZwdC0+Y2FsbCkpOworCQlzZXFfcHJpbnRmKHNlcSwgIiU2ZCAlc1xuIiwgcHQtPnVpZCwgYXgyYXNjKGJ1ZiwgJnB0LT5jYWxsKSk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2NvbXBhdC5jIGIvbmV0L2NvbXBhdC5jCmluZGV4IGQ5OWFiOTYuLmU1OTNkYWMgMTAwNjQ0Ci0tLSBhL25ldC9jb21wYXQuYworKysgYi9uZXQvY29tcGF0LmMKQEAgLTEzNSwxMyArMTM1LDE0IEBACiAgKiB0aHVzIHBsYWNlbWVudCkgb2YgY21zZyBoZWFkZXJzIGFuZCBsZW5ndGggYXJlIGRpZmZlcmVudCBmb3IKICAqIDMyLWJpdCBhcHBzLiAgLURhdmVNCiAgKi8KLWludCBjbXNnaGRyX2Zyb21fdXNlcl9jb21wYXRfdG9fa2VybihzdHJ1Y3QgbXNnaGRyICprbXNnLAoraW50IGNtc2doZHJfZnJvbV91c2VyX2NvbXBhdF90b19rZXJuKHN0cnVjdCBtc2doZHIgKmttc2csIHN0cnVjdCBzb2NrICpzaywKIAkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpzdGFja2J1ZiwgaW50IHN0YWNrYnVmX3NpemUpCiB7CiAJc3RydWN0IGNvbXBhdF9jbXNnaGRyIF9fdXNlciAqdWNtc2c7CiAJc3RydWN0IGNtc2doZHIgKmtjbXNnLCAqa2Ntc2dfYmFzZTsKIAljb21wYXRfc2l6ZV90IHVjbWxlbjsKIAlfX2tlcm5lbF9zaXplX3Qga2NtbGVuLCB0bXA7CisJaW50IGVyciA9IC1FRkFVTFQ7CiAKIAlrY21sZW4gPSAwOwogCWtjbXNnX2Jhc2UgPSBrY21zZyA9IChzdHJ1Y3QgY21zZ2hkciAqKXN0YWNrYnVmOwpAQCAtMTU2LDYgKzE1Nyw3IEBACiAKIAkJdG1wID0gKCh1Y21sZW4gLSBDTVNHX0NPTVBBVF9BTElHTihzaXplb2YoKnVjbXNnKSkpICsKIAkJICAgICAgIENNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSkpOworCQl0bXAgPSBDTVNHX0FMSUdOKHRtcCk7CiAJCWtjbWxlbiArPSB0bXA7CiAJCXVjbXNnID0gY21zZ19jb21wYXRfbnh0aGRyKGttc2csIHVjbXNnLCB1Y21sZW4pOwogCX0KQEAgLTE2NywzMCArMTY5LDM0IEBACiAJICogdW50aWwgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgY29waWVkIG92ZXIgYWxsIG9mIHRoZSBkYXRhCiAJICogZnJvbSB0aGUgdXNlci4KIAkgKi8KLQlpZihrY21sZW4gPiBzdGFja2J1Zl9zaXplKQotCQlrY21zZ19iYXNlID0ga2Ntc2cgPSBrbWFsbG9jKGtjbWxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYoa2Ntc2cgPT0gTlVMTCkKKwlpZiAoa2NtbGVuID4gc3RhY2tidWZfc2l6ZSkKKwkJa2Ntc2dfYmFzZSA9IGtjbXNnID0gc29ja19rbWFsbG9jKHNrLCBrY21sZW4sIEdGUF9LRVJORUwpOworCWlmIChrY21zZyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0JVRlM7CiAKIAkvKiBOb3cgY29weSB0aGVtIG92ZXIgbmVhdGx5LiAqLwogCW1lbXNldChrY21zZywgMCwga2NtbGVuKTsKIAl1Y21zZyA9IENNU0dfQ09NUEFUX0ZJUlNUSERSKGttc2cpOwogCXdoaWxlKHVjbXNnICE9IE5VTEwpIHsKLQkJX19nZXRfdXNlcih1Y21sZW4sICZ1Y21zZy0+Y21zZ19sZW4pOworCQlpZiAoX19nZXRfdXNlcih1Y21sZW4sICZ1Y21zZy0+Y21zZ19sZW4pKQorCQkJZ290byBFZmF1bHQ7CisJCWlmICghQ01TR19DT01QQVRfT0sodWNtbGVuLCB1Y21zZywga21zZykpCisJCQlnb3RvIEVpbnZhbDsKIAkJdG1wID0gKCh1Y21sZW4gLSBDTVNHX0NPTVBBVF9BTElHTihzaXplb2YoKnVjbXNnKSkpICsKIAkJICAgICAgIENNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSkpOworCQlpZiAoKGNoYXIgKilrY21zZ19iYXNlICsga2NtbGVuIC0gKGNoYXIgKilrY21zZyA8IENNU0dfQUxJR04odG1wKSkKKwkJCWdvdG8gRWludmFsOwogCQlrY21zZy0+Y21zZ19sZW4gPSB0bXA7Ci0JCV9fZ2V0X3VzZXIoa2Ntc2ctPmNtc2dfbGV2ZWwsICZ1Y21zZy0+Y21zZ19sZXZlbCk7Ci0JCV9fZ2V0X3VzZXIoa2Ntc2ctPmNtc2dfdHlwZSwgJnVjbXNnLT5jbXNnX3R5cGUpOwotCi0JCS8qIENvcHkgb3ZlciB0aGUgZGF0YS4gKi8KLQkJaWYoY29weV9mcm9tX3VzZXIoQ01TR19EQVRBKGtjbXNnKSwKLQkJCQkgIENNU0dfQ09NUEFUX0RBVEEodWNtc2cpLAotCQkJCSAgKHVjbWxlbiAtIENNU0dfQ09NUEFUX0FMSUdOKHNpemVvZigqdWNtc2cpKSkpKQotCQkJZ290byBvdXRfZnJlZV9lZmF1bHQ7CisJCXRtcCA9IENNU0dfQUxJR04odG1wKTsKKwkJaWYgKF9fZ2V0X3VzZXIoa2Ntc2ctPmNtc2dfbGV2ZWwsICZ1Y21zZy0+Y21zZ19sZXZlbCkgfHwKKwkJICAgIF9fZ2V0X3VzZXIoa2Ntc2ctPmNtc2dfdHlwZSwgJnVjbXNnLT5jbXNnX3R5cGUpIHx8CisJCSAgICBjb3B5X2Zyb21fdXNlcihDTVNHX0RBVEEoa2Ntc2cpLAorCQkJCSAgIENNU0dfQ09NUEFUX0RBVEEodWNtc2cpLAorCQkJCSAgICh1Y21sZW4gLSBDTVNHX0NPTVBBVF9BTElHTihzaXplb2YoKnVjbXNnKSkpKSkKKwkJCWdvdG8gRWZhdWx0OwogCiAJCS8qIEFkdmFuY2UuICovCi0JCWtjbXNnID0gKHN0cnVjdCBjbXNnaGRyICopKChjaGFyICopa2Ntc2cgKyBDTVNHX0FMSUdOKHRtcCkpOworCQlrY21zZyA9IChzdHJ1Y3QgY21zZ2hkciAqKSgoY2hhciAqKWtjbXNnICsgdG1wKTsKIAkJdWNtc2cgPSBjbXNnX2NvbXBhdF9ueHRoZHIoa21zZywgdWNtc2csIHVjbWxlbik7CiAJfQogCkBAIC0xOTksMTAgKzIwNSwxMiBAQAogCWttc2ctPm1zZ19jb250cm9sbGVuID0ga2NtbGVuOwogCXJldHVybiAwOwogCi1vdXRfZnJlZV9lZmF1bHQ6Ci0JaWYoa2Ntc2dfYmFzZSAhPSAoc3RydWN0IGNtc2doZHIgKilzdGFja2J1ZikKLQkJa2ZyZWUoa2Ntc2dfYmFzZSk7Ci0JcmV0dXJuIC1FRkFVTFQ7CitFaW52YWw6CisJZXJyID0gLUVJTlZBTDsKK0VmYXVsdDoKKwlpZiAoa2Ntc2dfYmFzZSAhPSAoc3RydWN0IGNtc2doZHIgKilzdGFja2J1ZikKKwkJc29ja19rZnJlZV9zKHNrLCBrY21zZ19iYXNlLCBrY21sZW4pOworCXJldHVybiBlcnI7CiB9CiAKIGludCBwdXRfY21zZ19jb21wYXQoc3RydWN0IG1zZ2hkciAqa21zZywgaW50IGxldmVsLCBpbnQgdHlwZSwgaW50IGxlbiwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2RzdC5jIGIvbmV0L2NvcmUvZHN0LmMKaW5kZXggMzM0NzkwZC4uNDcwYzA1YiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZHN0LmMKKysrIGIvbmV0L2NvcmUvZHN0LmMKQEAgLTM5LDggKzM5LDcgQEAKIHN0YXRpYyB2b2lkIGRzdF9ydW5fZ2ModW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgdm9pZCBfX19kc3RfZnJlZShzdHJ1Y3QgZHN0X2VudHJ5ICogZHN0KTsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRzdF9nY190aW1lciA9Ci0JVElNRVJfSU5JVElBTElaRVIoZHN0X3J1bl9nYywgRFNUX0dDX01JTiwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGRzdF9nY190aW1lciwgZHN0X3J1bl9nYywgRFNUX0dDX01JTiwgMCk7CiAKIHN0YXRpYyB2b2lkIGRzdF9ydW5fZ2ModW5zaWduZWQgbG9uZyBkdW1teSkKIHsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2V0aHRvb2wuYyBiL25ldC9jb3JlL2V0aHRvb2wuYwppbmRleCAyODljMWI1Li40MDRiNzYxIDEwMDY0NAotLS0gYS9uZXQvY29yZS9ldGh0b29sLmMKKysrIGIvbmV0L2NvcmUvZXRodG9vbC5jCkBAIC02OTUsNyArNjk1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGV0aHRvb2xfZ2V0X3Blcm1fYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICp1c2VyYWRkcikKK3N0YXRpYyBpbnQgZXRodG9vbF9nZXRfcGVybV9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgX191c2VyICp1c2VyYWRkcikKIHsKIAlzdHJ1Y3QgZXRodG9vbF9wZXJtX2FkZHIgZXBhZGRyOwogCXU4ICpkYXRhOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmlsdGVyLmMgYi9uZXQvY29yZS9maWx0ZXIuYwppbmRleCBjZDkxYTI0Li4wNzljMmVkIDEwMDY0NAotLS0gYS9uZXQvY29yZS9maWx0ZXIuYworKysgYi9uZXQvY29yZS9maWx0ZXIuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJCQkJQSA9IG50b2hsKCoodTMyICopcHRyKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCXJldHVybiAwOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0xEfEJQRl9IfEJQRl9BQlM6CiAJCQlrID0gZmVudHJ5LT5rOwogIGxvYWRfaDoKQEAgLTE5MSw3ICsxOTEsNyBAQAogCQkJCUEgPSBudG9ocygqKHUxNiAqKXB0cik7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlyZXR1cm4gMDsKKwkJCWJyZWFrOwogCQljYXNlIEJQRl9MRHxCUEZfQnxCUEZfQUJTOgogCQkJayA9IGZlbnRyeS0+azsKIGxvYWRfYjoKQEAgLTIwMCw3ICsyMDAsNyBAQAogCQkJCUEgPSAqKHU4ICopcHRyOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJcmV0dXJuIDA7CisJCQlicmVhazsKIAkJY2FzZSBCUEZfTER8QlBGX1d8QlBGX0xFTjoKIAkJCUEgPSBza2ItPmxlbjsKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0cG9sbC5jIGIvbmV0L2NvcmUvbmV0cG9sbC5jCmluZGV4IGExYTlhN2EuLjUyNjVkZmQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldHBvbGwuYworKysgYi9uZXQvY29yZS9uZXRwb2xsLmMKQEAgLTY0NSwxMCArNjQ1LDEwIEBACiAKIAkJbnBpbmZvLT5yeF9mbGFncyA9IDA7CiAJCW5waW5mby0+cnhfbnAgPSBOVUxMOwotCQlucGluZm8tPnBvbGxfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwkJc3Bpbl9sb2NrX2luaXQoJm5waW5mby0+cG9sbF9sb2NrKTsKIAkJbnBpbmZvLT5wb2xsX293bmVyID0gLTE7CiAJCW5waW5mby0+dHJpZXMgPSBNQVhfUkVUUklFUzsKLQkJbnBpbmZvLT5yeF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCQlzcGluX2xvY2tfaW5pdCgmbnBpbmZvLT5yeF9sb2NrKTsKIAl9IGVsc2UKIAkJbnBpbmZvID0gbmRldi0+bnBpbmZvOwogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9wa3RnZW4uYyBiL25ldC9jb3JlL3BrdGdlbi5jCmluZGV4IDhlYjA4M2IuLmIzYWQ0OWYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3BrdGdlbi5jCisrKyBiL25ldC9jb3JlL3BrdGdlbi5jCkBAIC01MDMsNyArNTAzLDcgQEAKIHN0YXRpYyBpbnQgcGdfY2xvbmVfc2tiX2QgPSAwOwogc3RhdGljIGludCBkZWJ1ZyA9IDA7CiAKLXN0YXRpYyBzcGlubG9ja190IF90aHJlYWRfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soX3RocmVhZF9sb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqcGt0Z2VuX3RocmVhZHMgPSBOVUxMOwogCiBzdGF0aWMgY2hhciBtb2R1bGVfZm5hbWVbMTI4XTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suYwppbmRleCBjY2QxMGZkLi5hYzYzYjU2IDEwMDY0NAotLS0gYS9uZXQvY29yZS9zb2NrLmMKKysrIGIvbmV0L2NvcmUvc29jay5jCkBAIC0zNDEsMTEgKzM0MSwxMSBAQAogCQkJCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19MSU5HRVIpOwogCQkJZWxzZSB7CiAjaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIpCi0JCQkJaWYgKGxpbmcubF9saW5nZXIgPj0gTUFYX1NDSEVEVUxFX1RJTUVPVVQvSFopCisJCQkJaWYgKCh1bnNpZ25lZCBpbnQpbGluZy5sX2xpbmdlciA+PSBNQVhfU0NIRURVTEVfVElNRU9VVC9IWikKIAkJCQkJc2stPnNrX2xpbmdlcnRpbWUgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKIAkJCQllbHNlCiAjZW5kaWYKLQkJCQkJc2stPnNrX2xpbmdlcnRpbWUgPSBsaW5nLmxfbGluZ2VyICogSFo7CisJCQkJCXNrLT5za19saW5nZXJ0aW1lID0gKHVuc2lnbmVkIGludClsaW5nLmxfbGluZ2VyICogSFo7CiAJCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19MSU5HRVIpOwogCQkJfQogCQkJYnJlYWs7CkBAIC0xNTI5LDYgKzE1MjksOCBAQAogdm9pZCBwcm90b191bnJlZ2lzdGVyKHN0cnVjdCBwcm90byAqcHJvdCkKIHsKIAl3cml0ZV9sb2NrKCZwcm90b19saXN0X2xvY2spOworCWxpc3RfZGVsKCZwcm90LT5ub2RlKTsKKwl3cml0ZV91bmxvY2soJnByb3RvX2xpc3RfbG9jayk7CiAKIAlpZiAocHJvdC0+c2xhYiAhPSBOVUxMKSB7CiAJCWttZW1fY2FjaGVfZGVzdHJveShwcm90LT5zbGFiKTsKQEAgLTE1NTAsOSArMTU1Miw2IEBACiAJCWtmcmVlKG5hbWUpOwogCQlwcm90LT50d3NrX3NsYWIgPSBOVUxMOwogCX0KLQotCWxpc3RfZGVsKCZwcm90LT5ub2RlKTsKLQl3cml0ZV91bmxvY2soJnByb3RvX2xpc3RfbG9jayk7CiB9CiAKIEVYUE9SVF9TWU1CT0wocHJvdG9fdW5yZWdpc3Rlcik7CkBAIC0xNzE5LDggKzE3MTgsOCBAQAogRVhQT1JUX1NZTUJPTChzb2NrX3dtYWxsb2MpOwogRVhQT1JUX1NZTUJPTChzb2NrX2lfdWlkKTsKIEVYUE9SVF9TWU1CT0woc29ja19pX2lubyk7Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAogRVhQT1JUX1NZTUJPTChzeXNjdGxfb3B0bWVtX21heCk7CisjaWZkZWYgQ09ORklHX1NZU0NUTAogRVhQT1JUX1NZTUJPTChzeXNjdGxfcm1lbV9tYXgpOwogRVhQT1JUX1NZTUJPTChzeXNjdGxfd21lbV9tYXgpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvY29yZS93aXJlbGVzcy5jIGIvbmV0L2NvcmUvd2lyZWxlc3MuYwppbmRleCA1Y2FhZTIzLi5kMTdmMTU4IDEwMDY0NAotLS0gYS9uZXQvY29yZS93aXJlbGVzcy5jCisrKyBiL25ldC9jb3JlL3dpcmVsZXNzLmMKQEAgLTU4LDYgKzU4LDEzIEBACiAgKglvIEFkZCB3bWIoKSBpbiBpd19oYW5kbGVyX3NldF9zcHkoKSBmb3Igbm9uLWNvaGVyZW50IGFyY2hzL2NwdXMKICAqIEJhc2VkIG9uIHBhdGNoIGZyb20gUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4gOgogICoJbyBGaXgga2VybmVsIGRhdGEgbGVhayB0byB1c2VyIHNwYWNlIGluIHByaXZhdGUgaGFuZGxlciBoYW5kbGluZworICoKKyAqIHY3IC0gMTguMy4wNSAtIEplYW4gSUkKKyAqCW8gUmVtb3ZlIChzdHJ1Y3QgaXdfcG9pbnQgKiktPnBvaW50ZXIgZnJvbSBldmVudHMgYW5kIHN0cmVhbXMKKyAqCW8gUmVtb3ZlIHNweV9vZmZzZXQgZnJvbSBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYKKyAqCW8gU3RhcnQgZGVwcmVjYXRpbmcgZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMsIG91dHB1dCBhIHdhcm5pbmcKKyAqCW8gSWYgSVdfUVVBTF9EQk0gaXMgc2V0LCBzaG93IGRCbSB2YWx1ZXMgaW4gL3Byb2MvbmV0L3dpcmVsZXNzCisgKglvIERvbid0IGxvb3NlIElOVkFMSUQvREJNIGZsYWdzIHdoZW4gY2xlYXJpbmcgVVBEQVRFRCBmbGFncyAoaXdzdGF0cykKICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5DTFVERVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NDYsMTAgKzQ1MywxNCBAQAogCSAgIChkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5nZXRfd2lyZWxlc3Nfc3RhdHMgIT0gTlVMTCkpCiAJCXJldHVybiBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5nZXRfd2lyZWxlc3Nfc3RhdHMoZGV2KTsKIAotCS8qIE9sZCBsb2NhdGlvbiwgd2lsbCBiZSBwaGFzZWQgb3V0IGluIG5leHQgV0UgKi8KLQlyZXR1cm4gKGRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID8KLQkJZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMoZGV2KSA6Ci0JCShzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqKSBOVUxMKTsKKwkvKiBPbGQgbG9jYXRpb24sIGZpZWxkIHRvIGJlIHJlbW92ZWQgaW4gbmV4dCBXRSAqLworCWlmKGRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogRHJpdmVyIHVzaW5nIG9sZCAvcHJvYy9uZXQvd2lyZWxlc3Mgc3VwcG9ydCwgcGxlYXNlIGZpeCBkcml2ZXIgIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiBkZXYtPmdldF93aXJlbGVzc19zdGF0cyhkZXYpOworCX0KKwkvKiBOb3QgZm91bmQgKi8KKwlyZXR1cm4gKHN0cnVjdCBpd19zdGF0aXN0aWNzICopIE5VTEw7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTU0MSwxNiArNTUyLDE4IEBACiAJCQkgICBkZXYtPm5hbWUsIHN0YXRzLT5zdGF0dXMsIHN0YXRzLT5xdWFsLnF1YWwsCiAJCQkgICBzdGF0cy0+cXVhbC51cGRhdGVkICYgSVdfUVVBTF9RVUFMX1VQREFURUQKIAkJCSAgID8gJy4nIDogJyAnLAotCQkJICAgKChfX3U4KSBzdGF0cy0+cXVhbC5sZXZlbCksCisJCQkgICAoKF9fczMyKSBzdGF0cy0+cXVhbC5sZXZlbCkgLSAKKwkJCSAgICgoc3RhdHMtPnF1YWwudXBkYXRlZCAmIElXX1FVQUxfREJNKSA/IDB4MTAwIDogMCksCiAJCQkgICBzdGF0cy0+cXVhbC51cGRhdGVkICYgSVdfUVVBTF9MRVZFTF9VUERBVEVECiAJCQkgICA/ICcuJyA6ICcgJywKLQkJCSAgICgoX191OCkgc3RhdHMtPnF1YWwubm9pc2UpLAorCQkJICAgKChfX3MzMikgc3RhdHMtPnF1YWwubm9pc2UpIC0gCisJCQkgICAoKHN0YXRzLT5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX0RCTSkgPyAweDEwMCA6IDApLAogCQkJICAgc3RhdHMtPnF1YWwudXBkYXRlZCAmIElXX1FVQUxfTk9JU0VfVVBEQVRFRAogCQkJICAgPyAnLicgOiAnICcsCiAJCQkgICBzdGF0cy0+ZGlzY2FyZC5ud2lkLCBzdGF0cy0+ZGlzY2FyZC5jb2RlLAogCQkJICAgc3RhdHMtPmRpc2NhcmQuZnJhZ21lbnQsIHN0YXRzLT5kaXNjYXJkLnJldHJpZXMsCiAJCQkgICBzdGF0cy0+ZGlzY2FyZC5taXNjLCBzdGF0cy0+bWlzcy5iZWFjb24pOwotCQlzdGF0cy0+cXVhbC51cGRhdGVkID0gMDsKKwkJc3RhdHMtPnF1YWwudXBkYXRlZCAmPSB+SVdfUVVBTF9BTExfVVBEQVRFRDsKIAl9CiB9CiAKQEAgLTU5Myw2ICs2MDYsNyBAQAogCiBpbnQgX19pbml0IHdpcmVsZXNzX3Byb2NfaW5pdCh2b2lkKQogeworCS8qIENyZWF0ZSAvcHJvYy9uZXQvd2lyZWxlc3MgZW50cnkgKi8KIAlpZiAoIXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJ3aXJlbGVzcyIsIFNfSVJVR08sICZ3aXJlbGVzc19zZXFfZm9wcykpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC02MjcsOSArNjQxLDkgQEAKIAkJCQlzaXplb2Yoc3RydWN0IGl3X3N0YXRpc3RpY3MpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCi0JCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHVwZGF0ZSBmbGFnICovCisJCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHVwZGF0ZWQgZmxhZyAqLwogCQlpZih3cnEtPnUuZGF0YS5mbGFncyAhPSAwKQotCQkJc3RhdHMtPnF1YWwudXBkYXRlZCA9IDA7CisJCQlzdGF0cy0+cXVhbC51cGRhdGVkICY9IH5JV19RVUFMX0FMTF9VUERBVEVEOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMTE2MSwxMCArMTE3NSwxMSBAQAogCXN0cnVjdCBpd19ldmVudCAgKmV2ZW50OwkJLyogTWFsbG9jYXRlZCB3aG9sZSBldmVudCAqLwogCWludCBldmVudF9sZW47CQkJCS8qIEl0cyBzaXplICovCiAJaW50IGhkcl9sZW47CQkJCS8qIFNpemUgb2YgdGhlIGV2ZW50IGhlYWRlciAqLworCWludCB3cnF1X29mZiA9IDA7CQkJLyogT2Zmc2V0IGluIHdycXUgKi8KIAkvKiBEb24ndCAib3B0aW1pc2UiIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUsIGl0IHdpbGwgY3Jhc2ggKi8KIAl1bnNpZ25lZAljbWRfaW5kZXg7CQkvKiAqTVVTVCogYmUgdW5zaWduZWQgKi8KIAotCS8qIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIElPQ1RMICovCisJLyogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRXZlbnQgKi8KIAlpZihjbWQgPD0gU0lPQ0lXTEFTVCkgewogCQljbWRfaW5kZXggPSBjbWQgLSBTSU9DSVdGSVJTVDsKIAkJaWYoY21kX2luZGV4IDwgc3RhbmRhcmRfaW9jdGxfbnVtKQpAQCAtMTIwNyw2ICsxMjIyLDggQEAKIAkJLyogQ2FsY3VsYXRlIGV4dHJhX2xlbiAtIGV4dHJhIGlzIE5VTEwgZm9yIHJlc3RyaWN0ZWQgZXZlbnRzICovCiAJCWlmKGV4dHJhICE9IE5VTEwpCiAJCQlleHRyYV9sZW4gPSB3cnF1LT5kYXRhLmxlbmd0aCAqIGRlc2NyLT50b2tlbl9zaXplOworCQkvKiBBbHdheXMgYXQgYW4gb2Zmc2V0IGluIHdycXUgKi8KKwkJd3JxdV9vZmYgPSBJV19FVl9QT0lOVF9PRkY7CiAjaWZkZWYgV0VfRVZFTlRfREVCVUcKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBFdmVudCAweCUwNFgsIHRva2VucyAlZCwgZXh0cmFfbGVuICVkXG4iLCBkZXYtPm5hbWUsIGNtZCwgd3JxdS0+ZGF0YS5sZW5ndGgsIGV4dHJhX2xlbik7CiAjZW5kaWYJLyogV0VfRVZFTlRfREVCVUcgKi8KQEAgLTEyMTcsNyArMTIzNCw3IEBACiAJZXZlbnRfbGVuID0gaGRyX2xlbiArIGV4dHJhX2xlbjsKIAogI2lmZGVmIFdFX0VWRU5UX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBFdmVudCAweCUwNFgsIGhkcl9sZW4gJWQsIGV2ZW50X2xlbiAlZFxuIiwgZGV2LT5uYW1lLCBjbWQsIGhkcl9sZW4sIGV2ZW50X2xlbik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBFdmVudCAweCUwNFgsIGhkcl9sZW4gJWQsIHdycXVfb2ZmICVkLCBldmVudF9sZW4gJWRcbiIsIGRldi0+bmFtZSwgY21kLCBoZHJfbGVuLCB3cnF1X29mZiwgZXZlbnRfbGVuKTsKICNlbmRpZgkvKiBXRV9FVkVOVF9ERUJVRyAqLwogCiAJLyogQ3JlYXRlIHRlbXBvcmFyeSBidWZmZXIgdG8gaG9sZCB0aGUgZXZlbnQgKi8KQEAgLTEyMjgsNyArMTI0NSw3IEBACiAJLyogRmlsbCBldmVudCAqLwogCWV2ZW50LT5sZW4gPSBldmVudF9sZW47CiAJZXZlbnQtPmNtZCA9IGNtZDsKLQltZW1jcHkoJmV2ZW50LT51LCB3cnF1LCBoZHJfbGVuIC0gSVdfRVZfTENQX0xFTik7CisJbWVtY3B5KCZldmVudC0+dSwgKChjaGFyICopIHdycXUpICsgd3JxdV9vZmYsIGhkcl9sZW4gLSBJV19FVl9MQ1BfTEVOKTsKIAlpZihleHRyYSAhPSBOVUxMKQogCQltZW1jcHkoKChjaGFyICopIGV2ZW50KSArIGhkcl9sZW4sIGV4dHJhLCBleHRyYV9sZW4pOwogCkBAIC0xMjQ5LDcgKzEyNjYsNyBAQAogICogTm93LCB0aGUgZHJpdmVyIGNhbiBkZWxlZ2F0ZSB0aGlzIHRhc2sgdG8gV2lyZWxlc3MgRXh0ZW5zaW9ucy4KICAqIEl0IG5lZWRzIHRvIHVzZSB0aG9zZSBzdGFuZGFyZCBzcHkgaXdfaGFuZGxlciBpbiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYsCiAgKiBwdXNoIGRhdGEgdG8gdXMgdmlhIHdpcmVsZXNzX3NweV91cGRhdGUoKSBhbmQgaW5jbHVkZSBzdHJ1Y3QgaXdfc3B5X2RhdGEKLSAqIGluIGl0cyBwcml2YXRlIHBhcnQgKGFuZCBhZHZlcnRpc2UgaXQgaW4gaXdfaGFuZGxlcl9kZWYtPnNweV9vZmZzZXQpLgorICogaW4gaXRzIHByaXZhdGUgcGFydCAoYW5kIGV4cG9ydCBpdCBpbiBuZXRfZGV2aWNlLT53aXJlbGVzc19kYXRhLT5zcHlfZGF0YSkuCiAgKiBPbmUgb2YgdGhlIG1haW4gYWR2YW50YWdlIG9mIGNlbnRyYWxpc2luZyBzcHkgc3VwcG9ydCBoZXJlIGlzIHRoYXQKICAqIGl0IGJlY29tZXMgbXVjaCBlYXNpZXIgdG8gaW1wcm92ZSBhbmQgZXh0ZW5kIGl0IHdpdGhvdXQgaGF2aW5nIHRvIHRvdWNoCiAgKiB0aGUgZHJpdmVycy4gT25lIGV4YW1wbGUgaXMgdGhlIGFkZGl0aW9uIG9mIHRoZSBTcHktVGhyZXNob2xkIGV2ZW50cy4KQEAgLTEyNjYsMTAgKzEyODMsNyBAQAogCS8qIFRoaXMgaXMgdGhlIG5ldyB3YXkgKi8KIAlpZihkZXYtPndpcmVsZXNzX2RhdGEpCiAJCXJldHVybihkZXYtPndpcmVsZXNzX2RhdGEtPnNweV9kYXRhKTsKLQotCS8qIFRoaXMgaXMgdGhlIG9sZCB3YXkuIERvZXNuJ3Qgd29yayBmb3IgbXVsdGktaGVhZGVkIGRyaXZlcnMuCi0JICogSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHZlcnNpb24gb2YgV0UuICovCi0JcmV0dXJuIChkZXYtPnByaXYgKyBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5zcHlfb2Zmc2V0KTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTI4NCwxMCArMTI5OCw2IEBACiAJc3RydWN0IGl3X3NweV9kYXRhICoJc3B5ZGF0YSA9IGdldF9zcHlkYXRhKGRldik7CiAJc3RydWN0IHNvY2thZGRyICoJYWRkcmVzcyA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CiAKLQlpZighZGV2LT53aXJlbGVzc19kYXRhKQotCQkvKiBIZWxwIHVzZXIga25vdyB0aGF0IGRyaXZlciBuZWVkcyB1cGRhdGluZyAqLwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IERyaXZlciB1c2luZyBvbGQvYnVnZ3kgc3B5IHN1cHBvcnQsIHBsZWFzZSBmaXggZHJpdmVyICFcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUpOwogCS8qIE1ha2Ugc3VyZSBkcml2ZXIgaXMgbm90IGJ1Z2d5IG9yIHVzaW5nIHRoZSBvbGQgQVBJICovCiAJaWYoIXNweWRhdGEpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTEzMTgsNyArMTMyOCw3IEBACiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogSVdfTUFYX1NQWSk7CiAKICNpZmRlZiBXRV9TUFlfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIml3X2hhbmRsZXJfc2V0X3NweSgpIDogIG9mZnNldCAlbGQsIHNweWRhdGEgJXAsIG51bSAlZFxuIiwgZGV2LT53aXJlbGVzc19oYW5kbGVycy0+c3B5X29mZnNldCwgc3B5ZGF0YSwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCQlwcmludGsoS0VSTl9ERUJVRyAiaXdfaGFuZGxlcl9zZXRfc3B5KCkgOiAgd2lyZWxlc3NfZGF0YSAlcCwgc3B5ZGF0YSAlcCwgbnVtICVkXG4iLCBkZXYtPndpcmVsZXNzX2RhdGEsIHNweWRhdGEsIHdycXUtPmRhdGEubGVuZ3RoKTsKIAkJZm9yIChpID0gMDsgaSA8IHdycXUtPmRhdGEubGVuZ3RoOyBpKyspCiAJCQlwcmludGsoS0VSTl9ERUJVRwogCQkJICAgICAgICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCBcbiIsCkBAIC0xMzcxLDcgKzEzODEsNyBAQAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIHNweWRhdGEtPnNweV9udW1iZXIpOwogCS8qIFJlc2V0IHVwZGF0ZWQgZmxhZ3MuICovCiAJZm9yKGkgPSAwOyBpIDwgc3B5ZGF0YS0+c3B5X251bWJlcjsgaSsrKQotCQlzcHlkYXRhLT5zcHlfc3RhdFtpXS51cGRhdGVkID0gMDsKKwkJc3B5ZGF0YS0+c3B5X3N0YXRbaV0udXBkYXRlZCAmPSB+SVdfUVVBTF9BTExfVVBEQVRFRDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ4Niw3ICsxNDk2LDcgQEAKIAkJcmV0dXJuOwogCiAjaWZkZWYgV0VfU1BZX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIndpcmVsZXNzX3NweV91cGRhdGUoKSA6ICBvZmZzZXQgJWxkLCBzcHlkYXRhICVwLCBhZGRyZXNzICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5zcHlfb2Zmc2V0LCBzcHlkYXRhLCBhZGRyZXNzWzBdLCBhZGRyZXNzWzFdLCBhZGRyZXNzWzJdLCBhZGRyZXNzWzNdLCBhZGRyZXNzWzRdLCBhZGRyZXNzWzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAid2lyZWxlc3Nfc3B5X3VwZGF0ZSgpIDogIHdpcmVsZXNzX2RhdGEgJXAsIHNweWRhdGEgJXAsIGFkZHJlc3MgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsIGRldi0+d2lyZWxlc3NfZGF0YSwgc3B5ZGF0YSwgYWRkcmVzc1swXSwgYWRkcmVzc1sxXSwgYWRkcmVzc1syXSwgYWRkcmVzc1szXSwgYWRkcmVzc1s0XSwgYWRkcmVzc1s1XSk7CiAjZW5kaWYJLyogV0VfU1BZX0RFQlVHICovCiAKIAkvKiBVcGRhdGUgYWxsIHJlY29yZHMgdGhhdCBtYXRjaCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYyBiL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKaW5kZXggN2JmM2IzYS4uZTA1ZjRmOSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYworKysgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCkBAIC00MywxMiArNDMsMjIgQEAKICNpbmNsdWRlICJjY2lkMy5oIgogCiAvKgotICogUmVhc29uIGZvciBtYXRocyB3aXRoIDEwIGhlcmUgaXMgdG8gYXZvaWQgMzIgYml0IG92ZXJmbG93IHdoZW4gYSBpcyBiaWcuCisgKiBSZWFzb24gZm9yIG1hdGhzIGhlcmUgaXMgdG8gYXZvaWQgMzIgYml0IG92ZXJmbG93IHdoZW4gYSBpcyBiaWcuCisgKiBXaXRoIHRoaXMgd2UgZ2V0IGNsb3NlIHRvIHRoZSBsaW1pdC4KICAqLwogc3RhdGljIGlubGluZSB1MzIgdXNlY3NfZGl2KGNvbnN0IHUzMiBhLCBjb25zdCB1MzIgYikKIHsKLQljb25zdCB1MzIgdG1wID0gYSAqIChVU0VDX1BFUl9TRUMgLyAxMCk7Ci0JcmV0dXJuIGIgPiAyMCA/IHRtcCAvIChiIC8gMTApIDogdG1wOworCWNvbnN0IHUzMiBkaXYgPSBhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvICAgIDEwKSkgPyAgICAxMCA6CisJCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvICAgIDUwKSkgPyAgICA1MCA6CisJCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvICAgMTAwKSkgPyAgIDEwMCA6CisJCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvICAgNTAwKSkgPyAgIDUwMCA6CisJCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvICAxMDAwKSkgPyAgMTAwMCA6CisJCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvICA1MDAwKSkgPyAgNTAwMCA6CisJCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvIDEwMDAwKSkgPyAxMDAwMCA6CisJCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvIDUwMDAwKSkgPyA1MDAwMCA6CisJCQkJCQkJCSAxMDAwMDA7CisJY29uc3QgdTMyIHRtcCA9IGEgKiAoVVNFQ19QRVJfU0VDIC8gZGl2KTsKKwlyZXR1cm4gKGIgPj0gMiAqIGRpdikgPyB0bXAgLyAoYiAvIGRpdikgOiB0bXA7CiB9CiAKIHN0YXRpYyBpbnQgY2NpZDNfZGVidWc7CkBAIC02OCwxMyArNzgsMTEgQEAKIAogc3RhdGljIGludCBjY2lkM19pbml0KHN0cnVjdCBzb2NrICpzaykKIHsKLQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwXG4iLCBkY2NwX3JvbGUoc2spLCBzayk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGNjaWQzX2V4aXQoc3RydWN0IHNvY2sgKnNrKQogewotCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXBcbiIsIGRjY3Bfcm9sZShzayksIHNrKTsKIH0KIAogLyogVEZSQyBzZW5kZXIgc3RhdGVzICovCkBAIC0xMDIsOCArMTEwLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjY2lkM19oY190eF9zZXRfc3RhdGUoc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgZW51bSBjY2lkM19oY190eF9zdGF0ZXMgc3RhdGUpCiB7Ci0Jc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGRwLT5kY2Nwc19oY190eF9jY2lkX3ByaXZhdGU7CisJc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBjY2lkM19oY190eF9zayhzayk7CiAJZW51bSBjY2lkM19oY190eF9zdGF0ZXMgb2xkc3RhdGUgPSBoY3R4LT5jY2lkM2hjdHhfc3RhdGU7CiAKIAljY2lkM19wcl9kZWJ1ZygiJXMoJXApICUtOC44cyAtPiAlc1xuIiwKQEAgLTE0NCw4ICsxNTEsNyBAQAogICovIAogc3RhdGljIHZvaWQgY2NpZDNfaGNfdHhfdXBkYXRlX3goc3RydWN0IHNvY2sgKnNrKQogewotCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBkcC0+ZGNjcHNfaGNfdHhfY2NpZF9wcml2YXRlOworCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwogCiAJLyogVG8gYXZvaWQgbGFyZ2UgZXJyb3IgaW4gY2FsY1ggKi8KIAlpZiAoaGN0eC0+Y2NpZDNoY3R4X3AgPj0gVEZSQ19TTUFMTEVTVF9QKSB7CkBAIC0xNTksNyArMTY1LDcgQEAKIAl9IGVsc2UgewogCQlzdHJ1Y3QgdGltZXZhbCBub3c7CiAKLQkJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCQlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7CiAJICAgICAgIAlpZiAodGltZXZhbF9kZWx0YSgmbm93LCAmaGN0eC0+Y2NpZDNoY3R4X3RfbGQpID49CiAJCSAgICBoY3R4LT5jY2lkM2hjdHhfcnR0KSB7CiAJCQloY3R4LT5jY2lkM2hjdHhfeCA9IG1heF90KHUzMiwgbWluX3QodTMyLCBoY3R4LT5jY2lkM2hjdHhfeF9yZWN2LApAQCAtMTc0LDkgKzE4MCw4IEBACiBzdGF0aWMgdm9pZCBjY2lkM19oY190eF9ub19mZWVkYmFja190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopZGF0YTsKLQlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCXVuc2lnbmVkIGxvbmcgbmV4dF90bW91dCA9IDA7Ci0Jc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBkcC0+ZGNjcHNfaGNfdHhfY2NpZF9wcml2YXRlOworCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwogCiAJYmhfbG9ja19zb2NrKHNrKTsKIAlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkgewpAQCAtMjc0LDIwICsyNzksMjAgQEAKIAkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQogewogCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBkcC0+ZGNjcHNfaGNfdHhfY2NpZF9wcml2YXRlOworCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwogCXN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKm5ld19wYWNrZXQ7CiAJc3RydWN0IHRpbWV2YWwgbm93OwogCWxvbmcgZGVsYXk7CiAJaW50IHJjID0gLUVOT1RDT05OOwogCi0JLyogQ2hlY2sgaWYgcHVyZSBBQ0sgb3IgVGVybWluYXRpbmcqLworCUJVR19PTihoY3R4ID09IE5VTEwgfHwgaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID09IFRGUkNfU1NUQVRFX1RFUk0pOwogCisJLyogQ2hlY2sgaWYgcHVyZSBBQ0sgb3IgVGVybWluYXRpbmcqLwogCS8qCiAJICogWFhYOiBXZSBvbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgREFUQSBhbmQgREFUQUFDSywgb24sIHRoZXNlCiAJICogcGFja2V0cyBjYW4gaGF2ZSB6ZXJvIGxlbmd0aCwgYnV0IHdoeSB0aGUgY29tbWVudCBhYm91dCAicHVyZSBBQ0siPwogCSAqLwotCWlmIChoY3R4ID09IE5VTEwgfHwgbGVuID09IDAgfHwKLQkgICAgaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID09IFRGUkNfU1NUQVRFX1RFUk0pCisJaWYgKHVubGlrZWx5KGxlbiA9PSAwKSkKIAkJZ290byBvdXQ7CiAKIAkvKiBTZWUgaWYgbGFzdCBwYWNrZXQgYWxsb2NhdGVkIHdhcyBub3Qgc2VudCAqLwpAQCAtMjk3LDIzICszMDIsMjAgQEAKIAkJCQkJCSAgICBTTEFCX0FUT01JQyk7CiAKIAkJcmMgPSAtRU5PQlVGUzsKLQkJaWYgKG5ld19wYWNrZXQgPT0gTlVMTCkgewotCQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgbm90IGVub3VnaCBtZW0gdG8gYWRkICIKLQkJCQkgICAgICAgInRvIGhpc3RvcnksIHNlbmQgcmVmdXNlZFxuIiwKLQkJCQkgICAgICAgZGNjcF9yb2xlKHNrKSwgc2spOworCQlpZiAodW5saWtlbHkobmV3X3BhY2tldCA9PSBOVUxMKSkgeworCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogJXMsIHNrPSVwLCBub3QgZW5vdWdoICIKKwkJCQkgICAgICAgIm1lbSB0byBhZGQgdG8gaGlzdG9yeSwgc2VuZCByZWZ1c2VkXG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKIAkJZGNjcF90eF9oaXN0X2FkZF9lbnRyeSgmaGN0eC0+Y2NpZDNoY3R4X2hpc3QsIG5ld19wYWNrZXQpOwogCX0KIAotCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKwlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7CiAKIAlzd2l0Y2ggKGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSkgewogCWNhc2UgVEZSQ19TU1RBVEVfTk9fU0VOVDoKLQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgZmlyc3QgcGFja2V0KCVsbHUpXG4iLAotCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLCBkcC0+ZGNjcHNfZ3NzKTsKLQogCQloY3R4LT5jY2lkM2hjdHhfbm9fZmVlZGJhY2tfdGltZXIuZnVuY3Rpb24gPSBjY2lkM19oY190eF9ub19mZWVkYmFja190aW1lcjsKIAkJaGN0eC0+Y2NpZDNoY3R4X25vX2ZlZWRiYWNrX3RpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpc2s7CiAJCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaGN0eC0+Y2NpZDNoY3R4X25vX2ZlZWRiYWNrX3RpbWVyLApAQCAtMzIxLDcgKzMyMyw3IEBACiAJCWhjdHgtPmNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudAkgPSAwOwogCQloY3R4LT5jY2lkM2hjdHhfdF9sYXN0X3dpbl9jb3VudCA9IG5vdzsKIAkJY2NpZDNfaGNfdHhfc2V0X3N0YXRlKHNrLCBURlJDX1NTVEFURV9OT19GQkFDSyk7Ci0JCWhjdHgtPmNjaWQzaGN0eF90X2lwaSA9IFRGUkNfSU5JVElBTF9USU1FT1VUOworCQloY3R4LT5jY2lkM2hjdHhfdF9pcGkgPSBURlJDX0lOSVRJQUxfSVBJOwogCiAJCS8qIFNldCBub21pbmFsIHNlbmQgdGltZSBmb3IgaW5pdGlhbCBwYWNrZXQgKi8KIAkJaGN0eC0+Y2NpZDNoY3R4X3Rfbm9tID0gbm93OwpAQCAtMzM0LDcgKzMzNiw2IEBACiAJY2FzZSBURlJDX1NTVEFURV9GQkFDSzoKIAkJZGVsYXkgPSAodGltZXZhbF9kZWx0YSgmbm93LCAmaGN0eC0+Y2NpZDNoY3R4X3Rfbm9tKSAtCiAJCSAgICAgICAgIGhjdHgtPmNjaWQzaGN0eF9kZWx0YSk7Ci0JCWNjaWQzX3ByX2RlYnVnKCJzZW5kX3BhY2tldCBkZWxheT0lbGRcbiIsIGRlbGF5KTsKIAkJZGVsYXkgLz0gLTEwMDA7CiAJCS8qIGRpdmlkZSBieSAtMTAwMCBpcyB0byBjb252ZXJ0IHRvIG1zIGFuZCBnZXQgc2lnbiByaWdodCAqLwogCQlyYyA9IGRlbGF5ID4gMCA/IGRlbGF5IDogMDsKQEAgLTM0OCwyOSArMzQ5LDI1IEBACiAJfQogCiAJLyogQ2FuIHdlIHNlbmQ/IGlmIHNvIGFkZCBvcHRpb25zIGFuZCBhZGQgdG8gcGFja2V0IGhpc3RvcnkgKi8KLQlpZiAocmMgPT0gMCkKKwlpZiAocmMgPT0gMCkgeworCQlkcC0+ZGNjcHNfaGNfdHhfaW5zZXJ0X29wdGlvbnMgPSAxOwogCQluZXdfcGFja2V0LT5kY2NwaHR4X2NjdmFsID0KIAkJCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2NjdmFsID0KIAkJCQloY3R4LT5jY2lkM2hjdHhfbGFzdF93aW5fY291bnQ7CisJfQogb3V0OgogCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgY2NpZDNfaGNfdHhfcGFja2V0X3NlbnQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbW9yZSwgaW50IGxlbikKIHsKLQlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwotCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gZHAtPmRjY3BzX2hjX3R4X2NjaWRfcHJpdmF0ZTsKKwljb25zdCBzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOworCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwogCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAotCUJVR19PTihoY3R4ID09IE5VTEwpOworCUJVR19PTihoY3R4ID09IE5VTEwgfHwgaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID09IFRGUkNfU1NUQVRFX1RFUk0pOwogCi0JaWYgKGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSA9PSBURlJDX1NTVEFURV9URVJNKSB7Ci0JCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIHdoaWxlIHN0YXRlIGlzIFRGUkNfU1NUQVRFX1RFUk0hXG4iLAotCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrKTsKLQkJcmV0dXJuOwotCX0KLQotCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKwlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7CiAKIAkvKiBjaGVjayBpZiB3ZSBoYXZlIHNlbnQgYSBkYXRhIHBhY2tldCAqLwogCWlmIChsZW4gPiAwKSB7CkBAIC0zNzgsMTQgKzM3NSwxNCBAQAogCQlzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICpwYWNrZXQ7CiAKIAkJcGFja2V0ID0gZGNjcF90eF9oaXN0X2hlYWQoJmhjdHgtPmNjaWQzaGN0eF9oaXN0KTsKLQkJaWYgKHBhY2tldCA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9DUklUICIlczogcGFja2V0IGRvZXNuJ3QgZXhpc3RzIGluICIKLQkJCQkJICJoaXN0b3J5IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKHVubGlrZWx5KHBhY2tldCA9PSBOVUxMKSkgeworCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogcGFja2V0IGRvZXNuJ3QgIgorCQkJCSAgICAgICAiZXhpc3RzIGluIGhpc3RvcnkhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuOwogCQl9Ci0JCWlmIChwYWNrZXQtPmRjY3BodHhfc2VudCkgewotCQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IG5vIHVuc2VudCBwYWNrZXQgaW4gaGlzdG9yeSFcbiIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJaWYgKHVubGlrZWx5KHBhY2tldC0+ZGNjcGh0eF9zZW50KSkgeworCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogbm8gdW5zZW50IHBhY2tldCBpbiAiCisJCQkJICAgICAgICJoaXN0b3J5IVxuIiwgX19GVU5DVElPTl9fKTsKIAkJCXJldHVybjsKIAkJfQogCQlwYWNrZXQtPmRjY3BodHhfdHN0YW1wID0gbm93OwpAQCAtNDQ1LDI0ICs0NDIsMTggQEAKIAogc3RhdGljIHZvaWQgY2NpZDNfaGNfdHhfcGFja2V0X3JlY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBkcC0+ZGNjcHNfaGNfdHhfY2NpZF9wcml2YXRlOworCWNvbnN0IHN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CisJc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBjY2lkM19oY190eF9zayhzayk7CiAJc3RydWN0IGNjaWQzX29wdGlvbnNfcmVjZWl2ZWQgKm9wdF9yZWN2OwogCXN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKnBhY2tldDsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CiAJdW5zaWduZWQgbG9uZyBuZXh0X3Rtb3V0OyAKIAl1MzIgdF9lbGFwc2VkOwogCXUzMiBwaW52OwogCXUzMiB4X3JlY3Y7CiAJdTMyIHJfc2FtcGxlOwogCi0JaWYgKGhjdHggPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaWYgKGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSA9PSBURlJDX1NTVEFURV9URVJNKSB7Ci0JCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIHJlY2VpdmVkIGEgcGFja2V0IHdoZW4gIgotCQkJICAgICAgICJ0ZXJtaW5hdGluZyFcbiIsIGRjY3Bfcm9sZShzayksIHNrKTsKLQkJcmV0dXJuOwotCX0KKwlCVUdfT04oaGN0eCA9PSBOVUxMIHx8IGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSA9PSBURlJDX1NTVEFURV9URVJNKTsKIAogCS8qIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gQUNLcyAqLwogCWlmICghKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUgPT0gRENDUF9QS1RfQUNLIHx8CkBAIC00NzEsNyArNDYyLDcgQEAKIAogCW9wdF9yZWN2ID0gJmhjdHgtPmNjaWQzaGN0eF9vcHRpb25zX3JlY2VpdmVkOwogCi0JdF9lbGFwc2VkID0gZHAtPmRjY3BzX29wdGlvbnNfcmVjZWl2ZWQuZGNjcG9yX2VsYXBzZWRfdGltZTsKKwl0X2VsYXBzZWQgPSBkcC0+ZGNjcHNfb3B0aW9uc19yZWNlaXZlZC5kY2Nwb3JfZWxhcHNlZF90aW1lICogMTA7CiAJeF9yZWN2ID0gb3B0X3JlY3YtPmNjaWQzb3JfcmVjZWl2ZV9yYXRlOwogCXBpbnYgPSBvcHRfcmVjdi0+Y2NpZDNvcl9sb3NzX2V2ZW50X3JhdGU7CiAKQEAgLTQ4NiwxOSArNDc3LDI0IEBACiAJCS8qIGdldCB0X3JlY3ZkYXRhIGZyb20gaGlzdG9yeSAqLwogCQlwYWNrZXQgPSBkY2NwX3R4X2hpc3RfZmluZF9lbnRyeSgmaGN0eC0+Y2NpZDNoY3R4X2hpc3QsCiAJCQkJCQkgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfYWNrX3NlcSk7Ci0JCWlmIChwYWNrZXQgPT0gTlVMTCkgewotCQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgc2Vxbm8gJWxsdSglcykgZG9lcyd0ICIKLQkJCQkgICAgICAgImV4aXN0IGluIGhpc3RvcnkhXG4iLAotCQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzaywKLQkJCQkgICAgICAgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfYWNrX3NlcSwKLQkJCQkgICAgICAgZGNjcF9wYWNrZXRfbmFtZShEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlKSk7CisJCWlmICh1bmxpa2VseShwYWNrZXQgPT0gTlVMTCkpIHsKKwkJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6ICVzLCBzaz0lcCwgc2Vxbm8gIgorCQkJCSAgICAgICAiJWxsdSglcykgZG9lcyd0IGV4aXN0IGluIGhpc3RvcnkhXG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfYWNrX3NlcSwKKwkJCQlkY2NwX3BhY2tldF9uYW1lKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUpKTsKIAkJCXJldHVybjsKIAkJfQogCiAJCS8qIFVwZGF0ZSBSVFQgKi8KLQkJcl9zYW1wbGUgPSB0aW1ldmFsX25vd19kZWx0YSgmcGFja2V0LT5kY2NwaHR4X3RzdGFtcCk7Ci0JCS8qIEZJWE1FOiAqLwotCQkvLyByX3NhbXBsZSAtPSB1c2Vjc190b19qaWZmaWVzKHRfZWxhcHNlZCAqIDEwKTsKKwkJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOworCQlyX3NhbXBsZSA9IHRpbWV2YWxfZGVsdGEoJm5vdywgJnBhY2tldC0+ZGNjcGh0eF90c3RhbXApOworCQlpZiAodW5saWtlbHkocl9zYW1wbGUgPD0gdF9lbGFwc2VkKSkKKwkJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6IHJfc2FtcGxlPSV1dXMsICIKKwkJCQkgICAgICAgInRfZWxhcHNlZD0ldXVzXG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHJfc2FtcGxlLCB0X2VsYXBzZWQpOworCQllbHNlCisJCQlyX3NhbXBsZSAtPSB0X2VsYXBzZWQ7CiAKIAkJLyogVXBkYXRlIFJUVCBlc3RpbWF0ZSBieSAKIAkJICogSWYgKE5vIGZlZWRiYWNrIHJlY3YpCkBAIC01OTEsMTEgKzU4NywxMSBAQAogCiBzdGF0aWMgdm9pZCBjY2lkM19oY190eF9pbnNlcnRfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JY29uc3Qgc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGRwLT5kY2Nwc19oY190eF9jY2lkX3ByaXZhdGU7CisJY29uc3Qgc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBjY2lkM19oY190eF9zayhzayk7CiAKLQlpZiAoaGN0eCA9PSBOVUxMIHx8ICEoc2stPnNrX3N0YXRlID09IERDQ1BfT1BFTiB8fAotCQkJICAgICAgc2stPnNrX3N0YXRlID09IERDQ1BfUEFSVE9QRU4pKQorCUJVR19PTihoY3R4ID09IE5VTEwpOworCisJaWYgKCEoc2stPnNrX3N0YXRlID09IERDQ1BfT1BFTiB8fCBzay0+c2tfc3RhdGUgPT0gRENDUF9QQVJUT1BFTikpCiAJCXJldHVybjsKIAogCSBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9jY3ZhbCA9IGhjdHgtPmNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudDsKQEAgLTYwNiwxMiArNjAyLDExIEBACiAJCQkJICAgICB1bnNpZ25lZCBjaGFyICp2YWx1ZSkKIHsKIAlpbnQgcmMgPSAwOwotCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBkcC0+ZGNjcHNfaGNfdHhfY2NpZF9wcml2YXRlOworCWNvbnN0IHN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CisJc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBjY2lkM19oY190eF9zayhzayk7CiAJc3RydWN0IGNjaWQzX29wdGlvbnNfcmVjZWl2ZWQgKm9wdF9yZWN2OwogCi0JaWYgKGhjdHggPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisJQlVHX09OKGhjdHggPT0gTlVMTCk7CiAKIAlvcHRfcmVjdiA9ICZoY3R4LT5jY2lkM2hjdHhfb3B0aW9uc19yZWNlaXZlZDsKIApAQCAtNjI1LDEwICs2MjAsMTAgQEAKIAogCXN3aXRjaCAob3B0aW9uKSB7CiAJY2FzZSBURlJDX09QVF9MT1NTX0VWRU5UX1JBVEU6Ci0JCWlmIChsZW4gIT0gNCkgewotCQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgaW52YWxpZCBsZW4gZm9yICIKLQkJCQkgICAgICAgIlRGUkNfT1BUX0xPU1NfRVZFTlRfUkFURVxuIiwKLQkJCQkgICAgICAgZGNjcF9yb2xlKHNrKSwgc2spOworCQlpZiAodW5saWtlbHkobGVuICE9IDQpKSB7CisJCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiAlcywgc2s9JXAsIGludmFsaWQgIgorCQkJCSAgICAgICAibGVuIGZvciBURlJDX09QVF9MT1NTX0VWRU5UX1JBVEVcbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2spOwogCQkJcmMgPSAtRUlOVkFMOwogCQl9IGVsc2UgewogCQkJb3B0X3JlY3YtPmNjaWQzb3JfbG9zc19ldmVudF9yYXRlID0gbnRvaGwoKih1MzIgKil2YWx1ZSk7CkBAIC02NDYsMTAgKzY0MSwxMCBAQAogCQkJICAgICAgIG9wdF9yZWN2LT5jY2lkM29yX2xvc3NfaW50ZXJ2YWxzX2xlbik7CiAJCWJyZWFrOwogCWNhc2UgVEZSQ19PUFRfUkVDRUlWRV9SQVRFOgotCQlpZiAobGVuICE9IDQpIHsKLQkJCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIGludmFsaWQgbGVuIGZvciAiCi0JCQkJICAgICAgICJURlJDX09QVF9SRUNFSVZFX1JBVEVcbiIsCi0JCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrKTsKKwkJaWYgKHVubGlrZWx5KGxlbiAhPSA0KSkgeworCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogJXMsIHNrPSVwLCBpbnZhbGlkICIKKwkJCQkgICAgICAgImxlbiBmb3IgVEZSQ19PUFRfUkVDRUlWRV9SQVRFXG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKIAkJCXJjID0gLUVJTlZBTDsKIAkJfSBlbHNlIHsKIAkJCW9wdF9yZWN2LT5jY2lkM29yX3JlY2VpdmVfcmF0ZSA9IG50b2hsKCoodTMyICopdmFsdWUpOwpAQCAtNjY4LDEzICs2NjMsMTEgQEAKIAlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4OwogCi0JY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcFxuIiwgZGNjcF9yb2xlKHNrKSwgc2spOwotCi0JaGN0eCA9IGRwLT5kY2Nwc19oY190eF9jY2lkX3ByaXZhdGUgPSBrbWFsbG9jKHNpemVvZigqaGN0eCksCi0JCQkJCQkgICAgICBnZnBfYW55KCkpOwotCWlmIChoY3R4ID09IE5VTEwpCisJZHAtPmRjY3BzX2hjX3R4X2NjaWRfcHJpdmF0ZSA9IGttYWxsb2Moc2l6ZW9mKCpoY3R4KSwgZ2ZwX2FueSgpKTsKKwlpZiAoZHAtPmRjY3BzX2hjX3R4X2NjaWRfcHJpdmF0ZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWhjdHggPSBjY2lkM19oY190eF9zayhzayk7CiAJbWVtc2V0KGhjdHgsIDAsIHNpemVvZigqaGN0eCkpOwogCiAJaWYgKGRwLT5kY2Nwc19wYWNrZXRfc2l6ZSA+PSBURlJDX01JTl9QQUNLRVRfU0laRSAmJgpAQCAtNjk2LDkgKzY4OSw4IEBACiBzdGF0aWMgdm9pZCBjY2lkM19oY190eF9leGl0KHN0cnVjdCBzb2NrICpzaykKIHsKIAlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwotCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gZHAtPmRjY3BzX2hjX3R4X2NjaWRfcHJpdmF0ZTsKKwlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGNjaWQzX2hjX3R4X3NrKHNrKTsKIAotCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXBcbiIsIGRjY3Bfcm9sZShzayksIHNrKTsKIAlCVUdfT04oaGN0eCA9PSBOVUxMKTsKIAogCWNjaWQzX2hjX3R4X3NldF9zdGF0ZShzaywgVEZSQ19TU1RBVEVfVEVSTSk7CkBAIC03MzgsOCArNzMwLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjY2lkM19oY19yeF9zZXRfc3RhdGUoc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgZW51bSBjY2lkM19oY19yeF9zdGF0ZXMgc3RhdGUpCiB7Ci0Jc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGRwLT5kY2Nwc19oY19yeF9jY2lkX3ByaXZhdGU7CisJc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBjY2lkM19oY19yeF9zayhzayk7CiAJZW51bSBjY2lkM19oY19yeF9zdGF0ZXMgb2xkc3RhdGUgPSBoY3J4LT5jY2lkM2hjcnhfc3RhdGU7CiAKIAljY2lkM19wcl9kZWJ1ZygiJXMoJXApICUtOC44cyAtPiAlc1xuIiwKQEAgLTc1MSwxNCArNzQyLDE0IEBACiAKIHN0YXRpYyB2b2lkIGNjaWQzX2hjX3J4X3NlbmRfZmVlZGJhY2soc3RydWN0IHNvY2sgKnNrKQogeworCXN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4ID0gY2NpZDNfaGNfcnhfc2soc2spOwogCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBkcC0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlOwogCXN0cnVjdCBkY2NwX3J4X2hpc3RfZW50cnkgKnBhY2tldDsKIAlzdHJ1Y3QgdGltZXZhbCBub3c7CiAKIAljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwXG4iLCBkY2NwX3JvbGUoc2spLCBzayk7CiAKLQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOwogCiAJc3dpdGNoIChoY3J4LT5jY2lkM2hjcnhfc3RhdGUpIHsKIAljYXNlIFRGUkNfUlNUQVRFX05PX0RBVEE6CkBAIC03NjcsMTEgKzc1OCw4IEBACiAJY2FzZSBURlJDX1JTVEFURV9EQVRBOiB7CiAJCWNvbnN0IHUzMiBkZWx0YSA9IHRpbWV2YWxfZGVsdGEoJm5vdywKIAkJCQkJJmhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9mZWVkYmFjayk7Ci0KLQkJaGNyeC0+Y2NpZDNoY3J4X3hfcmVjdiA9IChoY3J4LT5jY2lkM2hjcnhfYnl0ZXNfcmVjdiAqCi0JCQkJCSAgVVNFQ19QRVJfU0VDKTsKLQkJaWYgKGxpa2VseShkZWx0YSA+IDEpKQotCQkJaGNyeC0+Y2NpZDNoY3J4X3hfcmVjdiAvPSBkZWx0YTsKKwkJaGNyeC0+Y2NpZDNoY3J4X3hfcmVjdiA9IHVzZWNzX2RpdihoY3J4LT5jY2lkM2hjcnhfYnl0ZXNfcmVjdiwKKwkJCQkJCSAgIGRlbHRhKTsKIAl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC03ODIsMTAgKzc3MCwxMCBAQAogCX0KIAogCXBhY2tldCA9IGRjY3BfcnhfaGlzdF9maW5kX2RhdGFfcGFja2V0KCZoY3J4LT5jY2lkM2hjcnhfaGlzdCk7Ci0JaWYgKHBhY2tldCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgIiVzOiAlcywgc2s9JXAsIG5vIGRhdGEgcGFja2V0IGluIGhpc3RvcnkhXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzayk7Ci0JCWR1bXBfc3RhY2soKTsKKwlpZiAodW5saWtlbHkocGFja2V0ID09IE5VTEwpKSB7CisJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6ICVzLCBzaz0lcCwgbm8gZGF0YSBwYWNrZXQgIgorCQkJICAgICAgICJpbiBoaXN0b3J5IVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODAxLDE3ICs3ODksMTggQEAKIAkJaGNyeC0+Y2NpZDNoY3J4X3BpbnYgPSB+MDsKIAllbHNlCiAJCWhjcngtPmNjaWQzaGNyeF9waW52ID0gMTAwMDAwMCAvIGhjcngtPmNjaWQzaGNyeF9wOworCWRwLT5kY2Nwc19oY19yeF9pbnNlcnRfb3B0aW9ucyA9IDE7CiAJZGNjcF9zZW5kX2Fjayhzayk7CiB9CiAKIHN0YXRpYyB2b2lkIGNjaWQzX2hjX3J4X2luc2VydF9vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQljb25zdCBzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOworCWNvbnN0IHN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4ID0gY2NpZDNfaGNfcnhfc2soc2spOwogCXUzMiB4X3JlY3YsIHBpbnY7Ci0Jc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBkcC0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlOwogCi0JaWYgKGhjcnggPT0gTlVMTCB8fCAhKHNrLT5za19zdGF0ZSA9PSBEQ0NQX09QRU4gfHwKLQkJCSAgICAgIHNrLT5za19zdGF0ZSA9PSBEQ0NQX1BBUlRPUEVOKSkKKwlCVUdfT04oaGNyeCA9PSBOVUxMKTsKKworCWlmICghKHNrLT5za19zdGF0ZSA9PSBEQ0NQX09QRU4gfHwgc2stPnNrX3N0YXRlID09IERDQ1BfUEFSVE9QRU4pKQogCQlyZXR1cm47CiAKIAlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9jY3ZhbCA9IGhjcngtPmNjaWQzaGNyeF9sYXN0X2NvdW50ZXI7CkBAIC04MzcsOCArODI2LDcgQEAKIAogc3RhdGljIHUzMiBjY2lkM19oY19yeF9jYWxjX2ZpcnN0X2xpKHN0cnVjdCBzb2NrICpzaykKIHsKLQlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwotCXN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4ID0gZHAtPmRjY3BzX2hjX3J4X2NjaWRfcHJpdmF0ZTsKKwlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGNjaWQzX2hjX3J4X3NrKHNrKTsKIAlzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICplbnRyeSwgKm5leHQsICp0YWlsID0gTlVMTDsKIAl1MzIgcnR0LCBkZWx0YSwgeF9yZWN2LCBmdmFsLCBwLCB0bXAyOwogCXN0cnVjdCB0aW1ldmFsIHRzdGFtcCA9IHsgMCwgfTsKQEAgLTg2OSwxNyArODU3LDE3IEBACiAJCX0KIAl9CiAKLQlpZiAoc3RlcCA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgIiVzOiAlcywgc2s9JXAsIHBhY2tldCBoaXN0b3J5IGNvbnRhaW5zIG5vICIKLQkJCQkgImRhdGEgcGFja2V0cyFcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKKwlpZiAodW5saWtlbHkoc3RlcCA9PSAwKSkgeworCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiAlcywgc2s9JXAsIHBhY2tldCBoaXN0b3J5ICIKKwkJCSAgICAgICAiY29udGFpbnMgbm8gZGF0YSBwYWNrZXRzIVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKIAkJcmV0dXJuIH4wOwogCX0KIAotCWlmIChpbnRlcnZhbCA9PSAwKSB7Ci0JCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIENvdWxkIG5vdCBmaW5kIGEgd2luX2NvdW50ICIKLQkJCSAgICAgICAiaW50ZXJ2YWwgPiAwLiBEZWZhdWx0aW5nIHRvIDFcbiIsCi0JCQkgICAgICAgZGNjcF9yb2xlKHNrKSwgc2spOworCWlmICh1bmxpa2VseShpbnRlcnZhbCA9PSAwKSkgeworCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiAlcywgc2s9JXAsIENvdWxkIG5vdCBmaW5kIGEgIgorCQkJICAgICAgICJ3aW5fY291bnQgaW50ZXJ2YWwgPiAwLiBEZWZhdWx0aW5nIHRvIDFcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzayk7CiAJCWludGVydmFsID0gMTsKIAl9CiBmb3VuZDoKQEAgLTg4OSwxMCArODc3LDkgQEAKIAlpZiAocnR0ID09IDApCiAJCXJ0dCA9IDE7CiAKLQlkZWx0YSA9IHRpbWV2YWxfbm93X2RlbHRhKCZoY3J4LT5jY2lkM2hjcnhfdHN0YW1wX2xhc3RfZmVlZGJhY2spOwotCXhfcmVjdiA9IGhjcngtPmNjaWQzaGNyeF9ieXRlc19yZWN2ICogVVNFQ19QRVJfU0VDOwotCWlmIChsaWtlbHkoZGVsdGEgPiAxKSkKLQkJeF9yZWN2IC89IGRlbHRhOworCWRjY3BfdGltZXN0YW1wKHNrLCAmdHN0YW1wKTsKKwlkZWx0YSA9IHRpbWV2YWxfZGVsdGEoJnRzdGFtcCwgJmhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9mZWVkYmFjayk7CisJeF9yZWN2ID0gdXNlY3NfZGl2KGhjcngtPmNjaWQzaGNyeF9ieXRlc19yZWN2LCBkZWx0YSk7CiAKIAl0bXAxID0gKHU2NCl4X3JlY3YgKiAodTY0KXJ0dDsKIAlkb19kaXYodG1wMSwxMDAwMDAwMCk7CkBAIC05MTEsOCArODk4LDcgQEAKIAogc3RhdGljIHZvaWQgY2NpZDNfaGNfcnhfdXBkYXRlX2xpKHN0cnVjdCBzb2NrICpzaywgdTY0IHNlcV9sb3NzLCB1OCB3aW5fbG9zcykKIHsKLQlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwotCXN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4ID0gZHAtPmRjY3BzX2hjX3J4X2NjaWRfcHJpdmF0ZTsKKwlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGNjaWQzX2hjX3J4X3NrKHNrKTsKIAogCWlmIChzZXFfbG9zcyAhPSBEQ0NQX01BWF9TRVFOTyArIDEgJiYKIAkgICAgbGlzdF9lbXB0eSgmaGNyeC0+Y2NpZDNoY3J4X2xpX2hpc3QpKSB7CkBAIC05MjQsMTQgKzkxMCwxNCBAQAogCQlpZiAobGlfdGFpbCA9PSBOVUxMKQogCQkJcmV0dXJuOwogCQlsaV90YWlsLT5kY2NwbGloX2ludGVydmFsID0gY2NpZDNfaGNfcnhfY2FsY19maXJzdF9saShzayk7Ci0JfQotCS8qIEZJWE1FOiBmaW5kIGVuZCBvZiBpbnRlcnZhbCAqLworCX0gZWxzZQorCQkgICAgTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogRklYTUU6IGZpbmQgZW5kIG9mICIKKwkJCQkgICAiaW50ZXJ2YWxcbiIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKIHN0YXRpYyB2b2lkIGNjaWQzX2hjX3J4X2RldGVjdF9sb3NzKHN0cnVjdCBzb2NrICpzaykKIHsKLQlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwotCXN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4ID0gZHAtPmRjY3BzX2hjX3J4X2NjaWRfcHJpdmF0ZTsKKwlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGNjaWQzX2hjX3J4X3NrKHNrKTsKIAl1OCB3aW5fbG9zczsKIAljb25zdCB1NjQgc2VxX2xvc3MgPSBkY2NwX3J4X2hpc3RfZGV0ZWN0X2xvc3MoJmhjcngtPmNjaWQzaGNyeF9oaXN0LAogCQkJCQkJICAgICAgJmhjcngtPmNjaWQzaGNyeF9saV9oaXN0LApAQCAtOTQyLDIyICs5MjgsMTkgQEAKIAogc3RhdGljIHZvaWQgY2NpZDNfaGNfcnhfcGFja2V0X3JlY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBkcC0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlOworCXN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4ID0gY2NpZDNfaGNfcnhfc2soc2spOwogCWNvbnN0IHN0cnVjdCBkY2NwX29wdGlvbnNfcmVjZWl2ZWQgKm9wdF9yZWN2OwogCXN0cnVjdCBkY2NwX3J4X2hpc3RfZW50cnkgKnBhY2tldDsKIAlzdHJ1Y3QgdGltZXZhbCBub3c7CiAJdTggd2luX2NvdW50OwotCXUzMiBwX3ByZXY7CisJdTMyIHBfcHJldiwgcl9zYW1wbGUsIHRfZWxhcHNlZDsKIAlpbnQgaW5zOwogCi0JaWYgKGhjcnggPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JQlVHX09OKCEoaGNyeC0+Y2NpZDNoY3J4X3N0YXRlID09IFRGUkNfUlNUQVRFX05PX0RBVEEgfHwKKwlCVUdfT04oaGNyeCA9PSBOVUxMIHx8CisJICAgICAgICEoaGNyeC0+Y2NpZDNoY3J4X3N0YXRlID09IFRGUkNfUlNUQVRFX05PX0RBVEEgfHwKIAkJIGhjcngtPmNjaWQzaGNyeF9zdGF0ZSA9PSBURlJDX1JTVEFURV9EQVRBKSk7CiAKLQlvcHRfcmVjdiA9ICZkcC0+ZGNjcHNfb3B0aW9uc19yZWNlaXZlZDsKKwlvcHRfcmVjdiA9ICZkY2NwX3NrKHNrKS0+ZGNjcHNfb3B0aW9uc19yZWNlaXZlZDsKIAogCXN3aXRjaCAoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfdHlwZSkgewogCWNhc2UgRENDUF9QS1RfQUNLOgpAQCAtOTY3LDEwICs5NTAsMjQgQEAKIAkJaWYgKG9wdF9yZWN2LT5kY2Nwb3JfdGltZXN0YW1wX2VjaG8gPT0gMCkKIAkJCWJyZWFrOwogCQlwX3ByZXYgPSBoY3J4LT5jY2lkM2hjcnhfcnR0OwotCQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7Ci0JCWhjcngtPmNjaWQzaGNyeF9ydHQgPSB0aW1ldmFsX3VzZWNzKCZub3cpIC0KLQkJCQkgICAgIChvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcF9lY2hvIC0KLQkJCQkgICAgICBvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSkgKiAxMDsKKwkJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOworCQl0aW1ldmFsX3N1Yl91c2Vjcygmbm93LCBvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcF9lY2hvICogMTApOworCQlyX3NhbXBsZSA9IHRpbWV2YWxfdXNlY3MoJm5vdyk7CisJCXRfZWxhcHNlZCA9IG9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lICogMTA7CisKKwkJaWYgKHVubGlrZWx5KHJfc2FtcGxlIDw9IHRfZWxhcHNlZCkpCisJCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiByX3NhbXBsZT0ldXVzLCAiCisJCQkJICAgICAgICJ0X2VsYXBzZWQ9JXV1c1xuIiwKKwkJCQkgICAgICAgX19GVU5DVElPTl9fLCByX3NhbXBsZSwgdF9lbGFwc2VkKTsKKwkJZWxzZQorCQkJcl9zYW1wbGUgLT0gdF9lbGFwc2VkOworCisJCWlmIChoY3J4LT5jY2lkM2hjcnhfc3RhdGUgPT0gVEZSQ19SU1RBVEVfTk9fREFUQSkKKwkJCWhjcngtPmNjaWQzaGNyeF9ydHQgPSByX3NhbXBsZTsKKwkJZWxzZQorCQkJaGNyeC0+Y2NpZDNoY3J4X3J0dCA9IChoY3J4LT5jY2lkM2hjcnhfcnR0ICogOSkgLyAxMCArCisJCQkJCSAgICAgIHJfc2FtcGxlIC8gMTA7CisKIAkJaWYgKHBfcHJldiAhPSBoY3J4LT5jY2lkM2hjcnhfcnR0KQogCQkJY2NpZDNfcHJfZGVidWcoIiVzLCBOZXcgUlRUPSVsdXVzLCBlbGFwc2VkIHRpbWU9JXVcbiIsCiAJCQkJICAgICAgIGRjY3Bfcm9sZShzayksIGhjcngtPmNjaWQzaGNyeF9ydHQsCkBAIC05NzgsMTkgKzk3NSwxNiBAQAogCQlicmVhazsKIAljYXNlIERDQ1BfUEtUX0RBVEE6CiAJCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIG5vdCBEQVRBL0RBVEFBQ0svQUNLIHBhY2tldCglcylcbiIsCi0JCQkgICAgICAgZGNjcF9yb2xlKHNrKSwgc2ssCi0JCQkgICAgICAgZGNjcF9wYWNrZXRfbmFtZShEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlKSk7CisJZGVmYXVsdDogLyogV2UncmUgbm90IGludGVyZXN0ZWQgaW4gb3RoZXIgcGFja2V0IHR5cGVzLCBtb3ZlIGFsb25nICovCiAJCXJldHVybjsKIAl9CiAKLQlwYWNrZXQgPSBkY2NwX3J4X2hpc3RfZW50cnlfbmV3KGNjaWQzX3J4X2hpc3QsIG9wdF9yZWN2LT5kY2Nwb3JfbmRwLAorCXBhY2tldCA9IGRjY3BfcnhfaGlzdF9lbnRyeV9uZXcoY2NpZDNfcnhfaGlzdCwgc2ssIG9wdF9yZWN2LT5kY2Nwb3JfbmRwLAogCQkJCQlza2IsIFNMQUJfQVRPTUlDKTsKLQlpZiAocGFja2V0ID09IE5VTEwpIHsKLQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgTm90IGVub3VnaCBtZW0gdG8gYWRkIHJ4IHBhY2tldCAiCi0JCQkgICAgICAgInRvIGhpc3RvcnkgKGNvbnNpZGVyIGl0IGxvc3QpISIsCi0JCQkgICAgICAgZGNjcF9yb2xlKHNrKSwgc2spOworCWlmICh1bmxpa2VseShwYWNrZXQgPT0gTlVMTCkpIHsKKwkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogJXMsIHNrPSVwLCBOb3QgZW5vdWdoIG1lbSB0byAiCisJCQkJImFkZCByeCBwYWNrZXQgdG8gaGlzdG9yeSwgY29uc2lkZXIgaXQgbG9zdCFcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzayk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEwMTcsNyArMTAxMSw3IEBACiAJCWlmIChpbnMgIT0gMCkKIAkJCWJyZWFrOwogCi0JCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKwkJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOwogCQlpZiAodGltZXZhbF9kZWx0YSgmbm93LCAmaGNyeC0+Y2NpZDNoY3J4X3RzdGFtcF9sYXN0X2FjaykgPj0KIAkJICAgIGhjcngtPmNjaWQzaGNyeF9ydHQpIHsKIAkJCWhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9hY2sgPSBub3c7CkBAIC0xMDU2LDExICsxMDUwLDExIEBACiAKIAljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwXG4iLCBkY2NwX3JvbGUoc2spLCBzayk7CiAKLQloY3J4ID0gZHAtPmRjY3BzX2hjX3J4X2NjaWRfcHJpdmF0ZSA9IGttYWxsb2Moc2l6ZW9mKCpoY3J4KSwKLQkJCQkJCSAgICAgIGdmcF9hbnkoKSk7Ci0JaWYgKGhjcnggPT0gTlVMTCkKKwlkcC0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlID0ga21hbGxvYyhzaXplb2YoKmhjcngpLCBnZnBfYW55KCkpOworCWlmIChkcC0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaGNyeCA9IGNjaWQzX2hjX3J4X3NrKHNrKTsKIAltZW1zZXQoaGNyeCwgMCwgc2l6ZW9mKCpoY3J4KSk7CiAKIAlpZiAoZHAtPmRjY3BzX3BhY2tldF9zaXplID49IFRGUkNfTUlOX1BBQ0tFVF9TSVpFICYmCkBAIC0xMDcyLDIzICsxMDY2LDE4IEBACiAJaGNyeC0+Y2NpZDNoY3J4X3N0YXRlID0gVEZSQ19SU1RBVEVfTk9fREFUQTsKIAlJTklUX0xJU1RfSEVBRCgmaGNyeC0+Y2NpZDNoY3J4X2hpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZoY3J4LT5jY2lkM2hjcnhfbGlfaGlzdCk7Ci0JLyoKLQkgKiBYWFggdGhpcyBzZWVtcyB0byBiZSBwYXJhbm9pZCwgbmVlZCB0byB0aGluayBtb3JlIGFib3V0IHRoaXMsIGZvcgotCSAqIG5vdyBzdGFydCB3aXRoIHNvbWV0aGluZyBkaWZmZXJlbnQgdGhhbiB6ZXJvLiAtYWNtZQotCSAqLwotCWhjcngtPmNjaWQzaGNyeF9ydHQgPSBVU0VDX1BFUl9TRUMgLyA1OworCWRjY3BfdGltZXN0YW1wKHNrLCAmaGNyeC0+Y2NpZDNoY3J4X3RzdGFtcF9sYXN0X2Fjayk7CisJaGNyeC0+Y2NpZDNoY3J4X3RzdGFtcF9sYXN0X2ZlZWRiYWNrID0gaGNyeC0+Y2NpZDNoY3J4X3RzdGFtcF9sYXN0X2FjazsKKwloY3J4LT5jY2lkM2hjcnhfcnR0ID0gNTAwMDsgLyogWFhYIDVtcyBmb3Igbm93Li4uICovCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGNjaWQzX2hjX3J4X2V4aXQoc3RydWN0IHNvY2sgKnNrKQogeworCXN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4ID0gY2NpZDNfaGNfcnhfc2soc2spOwogCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBkcC0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlOwogCi0JY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcFxuIiwgZGNjcF9yb2xlKHNrKSwgc2spOwotCi0JaWYgKGhjcnggPT0gTlVMTCkKLQkJcmV0dXJuOworCUJVR19PTihoY3J4ID09IE5VTEwpOwogCiAJY2NpZDNfaGNfcnhfc2V0X3N0YXRlKHNrLCBURlJDX1JTVEFURV9URVJNKTsKIApAQCAtMTEwNCwxMSArMTA5Myw5IEBACiAKIHN0YXRpYyB2b2lkIGNjaWQzX2hjX3J4X2dldF9pbmZvKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9pbmZvICppbmZvKQogewotCWNvbnN0IHN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0JY29uc3Qgc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBkcC0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlOworCWNvbnN0IHN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4ID0gY2NpZDNfaGNfcnhfc2soc2spOwogCi0JaWYgKGhjcnggPT0gTlVMTCkKLQkJcmV0dXJuOworCUJVR19PTihoY3J4ID09IE5VTEwpOwogCiAJaW5mby0+dGNwaV9jYV9zdGF0ZQk9IGhjcngtPmNjaWQzaGNyeF9zdGF0ZTsKIAlpbmZvLT50Y3BpX29wdGlvbnMJfD0gVENQSV9PUFRfVElNRVNUQU1QUzsKQEAgLTExMTcsMTEgKzExMDQsOSBAQAogCiBzdGF0aWMgdm9pZCBjY2lkM19oY190eF9nZXRfaW5mbyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3BfaW5mbyAqaW5mbykKIHsKLQljb25zdCBzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwotCWNvbnN0IHN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gZHAtPmRjY3BzX2hjX3R4X2NjaWRfcHJpdmF0ZTsKKwljb25zdCBzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGNjaWQzX2hjX3R4X3NrKHNrKTsKIAotCWlmIChoY3R4ID09IE5VTEwpCi0JCXJldHVybjsKKwlCVUdfT04oaGN0eCA9PSBOVUxMKTsKIAogCWluZm8tPnRjcGlfcnRvID0gaGN0eC0+Y2NpZDNoY3R4X3RfcnRvOwogCWluZm8tPnRjcGlfcnR0ID0gaGN0eC0+Y2NpZDNoY3R4X3J0dDsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmggYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5oCmluZGV4IGVlOGNiYWMuLmViMjQ4NzcgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmgKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuaApAQCAtNDgsNiArNDgsOCBAQAogLyogVHdvIHNlY29uZHMgYXMgcGVyIENDSUQzIHNwZWMgKi8KICNkZWZpbmUgVEZSQ19JTklUSUFMX1RJTUVPVVQJICAgKDIgKiBVU0VDX1BFUl9TRUMpCiAKKyNkZWZpbmUgVEZSQ19JTklUSUFMX0lQSQkgICAoVVNFQ19QRVJfU0VDIC8gNCkKKwogLyogSW4gdXNlY3MgLSBoYWxmIHRoZSBzY2hlZHVsaW5nIGdyYW51bGFyaXR5IGFzIHBlciBSRkMzNDQ4IDQuNiAqLwogI2RlZmluZSBURlJDX09QU1lTX0hBTEZfVElNRV9HUkFOICAoVVNFQ19QRVJfU0VDIC8gKDIgKiBIWikpCiAKQEAgLTExNSw3ICsxMTcsNyBAQAogICAJdTY0CQkJY2NpZDNoY3J4X3NlcW5vX2xhc3RfY291bnRlcjo0OCwKIAkJCQljY2lkM2hjcnhfc3RhdGU6OCwKIAkJCQljY2lkM2hjcnhfbGFzdF9jb3VudGVyOjQ7Ci0JdW5zaWduZWQgbG9uZwkJY2NpZDNoY3J4X3J0dDsKKwl1MzIJCQljY2lkM2hjcnhfcnR0OwogICAJdTMyCQkJY2NpZDNoY3J4X3A7CiAgIAl1MzIJCQljY2lkM2hjcnhfYnl0ZXNfcmVjdjsKICAgCXN0cnVjdCB0aW1ldmFsCQljY2lkM2hjcnhfdHN0YW1wX2xhc3RfZmVlZGJhY2s7CkBAIC0xMjgsMTAgKzEzMCwxNCBAQAogICAJdTMyCQkJY2NpZDNoY3J4X3hfcmVjdjsKIH07CiAKLSNkZWZpbmUgY2NpZDNfaGNfdHhfZmllbGQocyxmaWVsZCkgKHMtPmRjY3BzX2hjX3R4X2NjaWRfcHJpdmF0ZSA9PSBOVUxMID8gMCA6IFwKLSAgICAoKHN0cnVjdCBjY2lkM19oY190eF9zb2NrICopcy0+ZGNjcHNfaGNfdHhfY2NpZF9wcml2YXRlKS0+Y2NpZDNoY3R4XyMjZmllbGQpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjY2lkM19oY190eF9zb2NrICpjY2lkM19oY190eF9zayhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCit7CisgICAgcmV0dXJuIGRjY3Bfc2soc2spLT5kY2Nwc19oY190eF9jY2lkX3ByaXZhdGU7Cit9CiAKLSNkZWZpbmUgY2NpZDNfaGNfcnhfZmllbGQocyxmaWVsZCkgKHMtPmRjY3BzX2hjX3J4X2NjaWRfcHJpdmF0ZSA9PSBOVUxMID8gMCA6IFwKLSAgICAoKHN0cnVjdCBjY2lkM19oY19yeF9zb2NrICopcy0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlKS0+Y2NpZDNoY3J4XyMjZmllbGQpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpjY2lkM19oY19yeF9zayhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCit7CisgICAgcmV0dXJuIGRjY3Bfc2soc2spLT5kY2Nwc19oY19yeF9jY2lkX3ByaXZhdGU7Cit9CiAKICNlbmRpZiAvKiBfRENDUF9DQ0lEM19IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL3BhY2tldF9oaXN0b3J5LmggYi9uZXQvZGNjcC9jY2lkcy9saWIvcGFja2V0X2hpc3RvcnkuaAppbmRleCBmYjkwYTkxLi5iMzc1ZWJkIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9saWIvcGFja2V0X2hpc3RvcnkuaAorKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvcGFja2V0X2hpc3RvcnkuaApAQCAtMTM0LDYgKzEzNCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSAqCiAJCSAgICAgZGNjcF9yeF9oaXN0X2VudHJ5X25ldyhzdHJ1Y3QgZGNjcF9yeF9oaXN0ICpoaXN0LAorCQkJCSAgICAgCSAgICBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIAogCQkJCSAgICAgCSAgICBjb25zdCB1MzIgbmRwLCAKIAkJCQkJICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpbykKQEAgLTE0OCw3ICsxNDksNyBAQAogCQllbnRyeS0+ZGNjcGhyeF9jY3ZhbCA9IGRoLT5kY2NwaF9jY3ZhbDsKIAkJZW50cnktPmRjY3BocnhfdHlwZSAgPSBkaC0+ZGNjcGhfdHlwZTsKIAkJZW50cnktPmRjY3BocnhfbmRwICAgPSBuZHA7Ci0JCWRvX2dldHRpbWVvZmRheSgmKGVudHJ5LT5kY2NwaHJ4X3RzdGFtcCkpOworCQlkY2NwX3RpbWVzdGFtcChzaywgJmVudHJ5LT5kY2NwaHJ4X3RzdGFtcCk7CiAJfQogCiAJcmV0dXJuIGVudHJ5OwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvZGNjcC5oIGIvbmV0L2RjY3AvZGNjcC5oCmluZGV4IDMzNDU2YzAuLjk1YzQ2MzAgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2RjY3AuaAorKysgYi9uZXQvZGNjcC9kY2NwLmgKQEAgLTQyNiwxMCArNDI2LDEzIEBACiAJCWRjY3BfYWNrcGt0c19hbGxvYyh1bnNpZ25lZCBpbnQgbGVuLAogCQkJCSAgY29uc3QgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KTsKIGV4dGVybiB2b2lkIGRjY3BfYWNrcGt0c19mcmVlKHN0cnVjdCBkY2NwX2Fja3BrdHMgKmFwKTsKLWV4dGVybiBpbnQgZGNjcF9hY2twa3RzX2FkZChzdHJ1Y3QgZGNjcF9hY2twa3RzICphcCwgdTY0IGFja25vLCB1OCBzdGF0ZSk7CitleHRlcm4gaW50IGRjY3BfYWNrcGt0c19hZGQoc3RydWN0IGRjY3BfYWNrcGt0cyAqYXAsIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKKwkJCSAgICB1NjQgYWNrbm8sIHU4IHN0YXRlKTsKIGV4dGVybiB2b2lkIGRjY3BfYWNrcGt0c19jaGVja19yY3ZfYWNrbm8oc3RydWN0IGRjY3BfYWNrcGt0cyAqYXAsCiAJCQkJCSBzdHJ1Y3Qgc29jayAqc2ssIHU2NCBhY2tubyk7CiAKK2V4dGVybiB2b2lkIGRjY3BfdGltZXN0YW1wKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRpbWV2YWwgKnR2KTsKKwogc3RhdGljIGlubGluZSBzdXNlY29uZHNfdCB0aW1ldmFsX3VzZWNzKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0dikKIHsKIAlyZXR1cm4gdHYtPnR2X3NlYyAqIFVTRUNfUEVSX1NFQyArIHR2LT50dl91c2VjOwpAQCAtNDY4LDE3ICs0NzEsNiBAQAogCX0KIH0KIAotLyoKLSAqIFJldHVybnMgdGhlIGRpZmZlcmVuY2UgaW4gdXNlY3MgYmV0d2VlbiB0aW1ldmFsCi0gKiBwYXNzZWQgaW4gYW5kIGN1cnJlbnQgdGltZQotICovCi1zdGF0aWMgaW5saW5lIHN1c2Vjb25kc190IHRpbWV2YWxfbm93X2RlbHRhKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0dikKLXsKLQlzdHJ1Y3QgdGltZXZhbCBub3c7Ci0JZG9fZ2V0dGltZW9mZGF5KCZub3cpOwotCXJldHVybiB0aW1ldmFsX2RlbHRhKCZub3csIHR2KTsKLX0KLQogI2lmZGVmIENPTkZJR19JUF9EQ0NQX0RFQlVHCiBleHRlcm4gdm9pZCBkY2NwX2Fja3ZlY3Rvcl9wcmludChjb25zdCB1NjQgYWNrbm8sCiAJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZlY3RvciwgaW50IGxlbik7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pbnB1dC5jIGIvbmV0L2RjY3AvaW5wdXQuYwppbmRleCBlZjI5Y2VmLi5jNjBiYzM0IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pbnB1dC5jCisrKyBiL25ldC9kY2NwL2lucHV0LmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogCWlmIChkcC0+ZGNjcHNfb3B0aW9ucy5kY2Nwb19zZW5kX2Fja192ZWN0b3IpIHsKIAkJc3RydWN0IGRjY3BfYWNrcGt0cyAqYXAgPSBkcC0+ZGNjcHNfaGNfcnhfYWNrcGt0czsKIAotCQlpZiAoZGNjcF9hY2twa3RzX2FkZChkcC0+ZGNjcHNfaGNfcnhfYWNrcGt0cywKKwkJaWYgKGRjY3BfYWNrcGt0c19hZGQoZHAtPmRjY3BzX2hjX3J4X2Fja3BrdHMsIHNrLAogCQkJCSAgICAgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLAogCQkJCSAgICAgRENDUF9BQ0tQS1RTX1NUQVRFX1JFQ0VJVkVEKSkgewogCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICJEQ0NQOiBhY2tub3dsZWRnZWFibGUgIgpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJCSAqIERDQ1BfQUNLUEtUU19TVEFURV9FQ05fTUFSS0VECiAJCSAqLwogCQlpZiAoZHAtPmRjY3BzX29wdGlvbnMuZGNjcG9fc2VuZF9hY2tfdmVjdG9yKSB7Ci0JCQlpZiAoZGNjcF9hY2twa3RzX2FkZChkcC0+ZGNjcHNfaGNfcnhfYWNrcGt0cywKKwkJCWlmIChkY2NwX2Fja3BrdHNfYWRkKGRwLT5kY2Nwc19oY19yeF9hY2twa3RzLCBzaywKIAkJCQkJICAgICBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9zZXEsCiAJCQkJCSAgICAgRENDUF9BQ0tQS1RTX1NUQVRFX1JFQ0VJVkVEKSkKIAkJCQlnb3RvIGRpc2NhcmQ7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pcHY0LmMgYi9uZXQvZGNjcC9pcHY0LmMKaW5kZXggM2ZjNzVkYi4uMmFmYWE0NiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaXB2NC5jCisrKyBiL25ldC9kY2NwL2lwdjQuYwpAQCAtNjQxLDE2ICs2NDEsMTIgQEAKIAogCXNrYiA9IGRjY3BfbWFrZV9yZXNldChzaywgc2stPnNrX2RzdF9jYWNoZSwgY29kZSk7CiAJaWYgKHNrYiAhPSBOVUxMKSB7Ci0JCWNvbnN0IHN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CiAJCWNvbnN0IHN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAogCQllcnIgPSBpcF9idWlsZF9hbmRfc2VuZF9wa3Qoc2tiLCBzaywKIAkJCQkJICAgIGluZXQtPnNhZGRyLCBpbmV0LT5kYWRkciwgTlVMTCk7CiAJCWlmIChlcnIgPT0gTkVUX1hNSVRfQ04pCiAJCQllcnIgPSAwOwotCi0JCWNjaWRfaGNfcnhfZXhpdChkcC0+ZGNjcHNfaGNfcnhfY2NpZCwgc2spOwotCQljY2lkX2hjX3R4X2V4aXQoZHAtPmRjY3BzX2hjX3R4X2NjaWQsIHNrKTsKIAl9CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTI0Myw2ICsxMjM5LDcgQEAKIAlzdGF0aWMgaW50IGRjY3BfY3RsX3NvY2tldF9pbml0ID0gMTsKIAogCWRjY3Bfb3B0aW9uc19pbml0KCZkcC0+ZGNjcHNfb3B0aW9ucyk7CisJZG9fZ2V0dGltZW9mZGF5KCZkcC0+ZGNjcHNfZXBvY2gpOwogCiAJaWYgKGRwLT5kY2Nwc19vcHRpb25zLmRjY3BvX3NlbmRfYWNrX3ZlY3RvcikgewogCQlkcC0+ZGNjcHNfaGNfcnhfYWNrcGt0cyA9CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9taW5pc29ja3MuYyBiL25ldC9kY2NwL21pbmlzb2Nrcy5jCmluZGV4IGNlNWRmZjQuLjE4NDYxYmMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL21pbmlzb2Nrcy5jCisrKyBiL25ldC9kY2NwL21pbmlzb2Nrcy5jCkBAIC05Niw2ICs5Niw3IEBACiAJCW5ld2RwLT5kY2Nwc19oY19yeF9hY2twa3RzID0gTlVMTDsKIAkJbmV3ZHAtPmRjY3BzX3JvbGUgPSBEQ0NQX1JPTEVfU0VSVkVSOwogCQluZXdpY3NrLT5pY3NrX3J0byA9IERDQ1BfVElNRU9VVF9JTklUOworCQlkb19nZXR0aW1lb2ZkYXkoJm5ld2RwLT5kY2Nwc19lcG9jaCk7CiAKIAkJaWYgKG5ld2RwLT5kY2Nwc19vcHRpb25zLmRjY3BvX3NlbmRfYWNrX3ZlY3RvcikgewogCQkJbmV3ZHAtPmRjY3BzX2hjX3J4X2Fja3BrdHMgPQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3Avb3B0aW9ucy5jIGIvbmV0L2RjY3Avb3B0aW9ucy5jCmluZGV4IDM4MmM1ODkuLmQ0YzQyNDIgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL29wdGlvbnMuYworKysgYi9uZXQvZGNjcC9vcHRpb25zLmMKQEAgLTcyLDYgKzcyLDcgQEAKIAlzdHJ1Y3QgZGNjcF9vcHRpb25zX3JlY2VpdmVkICpvcHRfcmVjdiA9ICZkcC0+ZGNjcHNfb3B0aW9uc19yZWNlaXZlZDsKIAl1bnNpZ25lZCBjaGFyIG9wdCwgbGVuOwogCXVuc2lnbmVkIGNoYXIgKnZhbHVlOworCXUzMiBlbGFwc2VkX3RpbWU7CiAKIAltZW1zZXQob3B0X3JlY3YsIDAsIHNpemVvZigqb3B0X3JlY3YpKTsKIApAQCAtMTM5LDcgKzE0MCw3IEBACiAJCQlvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcCA9IG50b2hsKCoodTMyICopdmFsdWUpOwogCiAJCQlkcC0+ZGNjcHNfdGltZXN0YW1wX2VjaG8gPSBvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcDsKLQkJCWRvX2dldHRpbWVvZmRheSgmZHAtPmRjY3BzX3RpbWVzdGFtcF90aW1lKTsKKwkJCWRjY3BfdGltZXN0YW1wKHNrLCAmZHAtPmRjY3BzX3RpbWVzdGFtcF90aW1lKTsKIAogCQkJZGNjcF9wcl9kZWJ1ZygiJXNUSU1FU1RBTVA9JXUsIGFja25vPSVsbHVcbiIsCiAJCQkJICAgICAgZGVidWdfcHJlZml4LCBvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcCwKQEAgLTE1OSwxOCArMTYwLDE4IEBACiAJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKIAkJCQkgICAgICBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxKTsKIAotCQkJaWYgKGxlbiA+IDQpIHsKLQkJCQlpZiAobGVuID09IDYpCi0JCQkJCW9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lID0KLQkJCQkJCSBudG9ocygqKHUxNiAqKSh2YWx1ZSArIDQpKTsKLQkJCQllbHNlCi0JCQkJCW9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lID0KLQkJCQkJCSBudG9obCgqKHUzMiAqKSh2YWx1ZSArIDQpKTsKIAotCQkJCWRjY3BfcHJfZGVidWcoIiVzVElNRVNUQU1QX0VDSE8gRUxBUFNFRF9USU1FPSVkXG4iLAotCQkJCSAgICAgIGRlYnVnX3ByZWZpeCwKLQkJCQkgICAgICBvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSk7Ci0JCQl9CisJCQlpZiAobGVuID09IDQpCisJCQkJYnJlYWs7CisKKwkJCWlmIChsZW4gPT0gNikKKwkJCQllbGFwc2VkX3RpbWUgPSBudG9ocygqKHUxNiAqKSh2YWx1ZSArIDQpKTsKKwkJCWVsc2UKKwkJCQllbGFwc2VkX3RpbWUgPSBudG9obCgqKHUzMiAqKSh2YWx1ZSArIDQpKTsKKworCQkJLyogR2l2ZSBwcmVjZWRlbmNlIHRvIHRoZSBiaWdnZXN0IEVMQVBTRURfVElNRSAqLworCQkJaWYgKGVsYXBzZWRfdGltZSA+IG9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lKQorCQkJCW9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lID0gZWxhcHNlZF90aW1lOwogCQkJYnJlYWs7CiAJCWNhc2UgRENDUE9fRUxBUFNFRF9USU1FOgogCQkJaWYgKGxlbiAhPSAyICYmIGxlbiAhPSA0KQpAQCAtMTgwLDE0ICsxODEsMTUgQEAKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKGxlbiA9PSAyKQotCQkJCW9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lID0KLQkJCQkJCQludG9ocygqKHUxNiAqKXZhbHVlKTsKKwkJCQllbGFwc2VkX3RpbWUgPSBudG9ocygqKHUxNiAqKXZhbHVlKTsKIAkJCWVsc2UKLQkJCQlvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSA9Ci0JCQkJCQkJbnRvaGwoKih1MzIgKil2YWx1ZSk7CisJCQkJZWxhcHNlZF90aW1lID0gbnRvaGwoKih1MzIgKil2YWx1ZSk7CisKKwkJCWlmIChlbGFwc2VkX3RpbWUgPiBvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSkKKwkJCQlvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSA9IGVsYXBzZWRfdGltZTsKIAogCQkJZGNjcF9wcl9kZWJ1ZygiJXNFTEFQU0VEX1RJTUU9JWRcbiIsIGRlYnVnX3ByZWZpeCwKLQkJCQkgICAgICBvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSk7CisJCQkJICAgICAgZWxhcHNlZF90aW1lKTsKIAkJCWJyZWFrOwogCQkJLyoKIAkJCSAqIEZyb20gZHJhZnQtaWV0Zi1kY2NwLXNwZWMtMTEudHh0OgpAQCAtMzU5LDkgKzM2MSwxMyBAQAogI2VuZGlmCiAJc3RydWN0IGRjY3BfYWNrcGt0cyAqYXAgPSBkcC0+ZGNjcHNfaGNfcnhfYWNrcGt0czsKIAlpbnQgbGVuID0gYXAtPmRjY3BhcF9idWZfdmVjdG9yX2xlbiArIDI7Ci0JY29uc3QgdTMyIGVsYXBzZWRfdGltZSA9IHRpbWV2YWxfbm93X2RlbHRhKCZhcC0+ZGNjcGFwX3RpbWUpIC8gMTA7CisJc3RydWN0IHRpbWV2YWwgbm93OworCXUzMiBlbGFwc2VkX3RpbWU7CiAJdW5zaWduZWQgY2hhciAqdG8sICpmcm9tOwogCisJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOworCWVsYXBzZWRfdGltZSA9IHRpbWV2YWxfZGVsdGEoJm5vdywgJmFwLT5kY2NwYXBfdGltZSkgLyAxMDsKKwogCWlmIChlbGFwc2VkX3RpbWUgIT0gMCkKIAkJZGNjcF9pbnNlcnRfb3B0aW9uX2VsYXBzZWRfdGltZShzaywgc2tiLCBlbGFwc2VkX3RpbWUpOwogCkBAIC00MjYsMTMgKzQzMiwyOSBAQAogCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBhcC0+ZGNjcGFwX2Fja19hY2tubyk7CiB9CiAKK3ZvaWQgZGNjcF90aW1lc3RhbXAoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGltZXZhbCAqdHYpCit7CisJY29uc3Qgc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKKworCWRvX2dldHRpbWVvZmRheSh0dik7CisJdHYtPnR2X3NlYyAgLT0gZHAtPmRjY3BzX2Vwb2NoLnR2X3NlYzsKKwl0di0+dHZfdXNlYyAtPSBkcC0+ZGNjcHNfZXBvY2gudHZfdXNlYzsKKworCXdoaWxlICh0di0+dHZfdXNlYyA8IDApIHsKKwkJdHYtPnR2X3NlYy0tOworCQl0di0+dHZfdXNlYyArPSBVU0VDX1BFUl9TRUM7CisJfQorfQorCitFWFBPUlRfU1lNQk9MX0dQTChkY2NwX3RpbWVzdGFtcCk7CisKIHZvaWQgZGNjcF9pbnNlcnRfb3B0aW9uX3RpbWVzdGFtcChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHRpbWV2YWwgdHY7CiAJdTMyIG5vdzsKIAkKLQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQlub3cgPSAodHYudHZfc2VjICogVVNFQ19QRVJfU0VDICsgdHYudHZfdXNlYykgLyAxMDsKKwlkY2NwX3RpbWVzdGFtcChzaywgJnR2KTsKKwlub3cgPSB0aW1ldmFsX3VzZWNzKCZ0dikgLyAxMDsKIAkvKiB5ZXMgdGhpcyB3aWxsIG92ZXJmbG93IGJ1dCB0aGF0IGlzIHRoZSBwb2ludCBhcyB3ZSB3YW50IGEKIAkgKiAxMCB1c2VjIDMyIGJpdCB0aW1lciB3aGljaCBtZWFuIGl0IHdyYXBzIGV2ZXJ5IDExLjkgaG91cnMgKi8KIApAQCAtNDUwLDEzICs0NzIsMTcgQEAKIAljb25zdCBjaGFyICpkZWJ1Z19wcmVmaXggPSBkcC0+ZGNjcHNfcm9sZSA9PSBEQ0NQX1JPTEVfQ0xJRU5UID8KIAkJCQkJIkNMSUVOVCBUWCBvcHQ6ICIgOiAic2VydmVyIFRYIG9wdDogIjsKICNlbmRpZgorCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAl1MzIgdHN0YW1wX2VjaG87Ci0JY29uc3QgdTMyIGVsYXBzZWRfdGltZSA9Ci0JCQl0aW1ldmFsX25vd19kZWx0YSgmZHAtPmRjY3BzX3RpbWVzdGFtcF90aW1lKSAvIDEwOwotCWNvbnN0IGludCBlbGFwc2VkX3RpbWVfbGVuID0gZGNjcF9lbGFwc2VkX3RpbWVfbGVuKGVsYXBzZWRfdGltZSk7Ci0JY29uc3QgaW50IGxlbiA9IDYgKyBlbGFwc2VkX3RpbWVfbGVuOworCXUzMiBlbGFwc2VkX3RpbWU7CisJaW50IGxlbiwgZWxhcHNlZF90aW1lX2xlbjsKIAl1bnNpZ25lZCBjaGFyICp0bzsKIAorCWRjY3BfdGltZXN0YW1wKHNrLCAmbm93KTsKKwllbGFwc2VkX3RpbWUgPSB0aW1ldmFsX2RlbHRhKCZub3csICZkcC0+ZGNjcHNfdGltZXN0YW1wX3RpbWUpIC8gMTA7CisJZWxhcHNlZF90aW1lX2xlbiA9IGRjY3BfZWxhcHNlZF90aW1lX2xlbihlbGFwc2VkX3RpbWUpOworCWxlbiA9IDYgKyBlbGFwc2VkX3RpbWVfbGVuOworCiAJaWYgKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX29wdF9sZW4gKyBsZW4gPiBEQ0NQX01BWF9PUFRfTEVOKSB7CiAJCUxJTUlUX05FVERFQlVHKEtFUk5fSU5GTyAiRENDUDogcGFja2V0IHRvbyBzbWFsbCB0byBpbnNlcnQgIgogCQkJCQkgInRpbWVzdGFtcCBlY2hvIVxuIik7CkBAIC01MDUsMTMgKzUzMSwxOCBAQAogCQkgICAgKGRwLT5kY2Nwc19oY19yeF9hY2twa3RzLT5kY2NwYXBfYnVmX2Fja25vICE9CiAJCSAgICAgRENDUF9NQVhfU0VRTk8gKyAxKSkKIAkJCWRjY3BfaW5zZXJ0X29wdGlvbl9hY2tfdmVjdG9yKHNrLCBza2IpOwotCiAJCWlmIChkcC0+ZGNjcHNfdGltZXN0YW1wX2VjaG8gIT0gMCkKIAkJCWRjY3BfaW5zZXJ0X29wdGlvbl90aW1lc3RhbXBfZWNobyhzaywgc2tiKTsKIAl9CiAKLQljY2lkX2hjX3J4X2luc2VydF9vcHRpb25zKGRwLT5kY2Nwc19oY19yeF9jY2lkLCBzaywgc2tiKTsKLQljY2lkX2hjX3R4X2luc2VydF9vcHRpb25zKGRwLT5kY2Nwc19oY190eF9jY2lkLCBzaywgc2tiKTsKKwlpZiAoZHAtPmRjY3BzX2hjX3J4X2luc2VydF9vcHRpb25zKSB7CisJCWNjaWRfaGNfcnhfaW5zZXJ0X29wdGlvbnMoZHAtPmRjY3BzX2hjX3J4X2NjaWQsIHNrLCBza2IpOworCQlkcC0+ZGNjcHNfaGNfcnhfaW5zZXJ0X29wdGlvbnMgPSAwOworCX0KKwlpZiAoZHAtPmRjY3BzX2hjX3R4X2luc2VydF9vcHRpb25zKSB7CisJCWNjaWRfaGNfdHhfaW5zZXJ0X29wdGlvbnMoZHAtPmRjY3BzX2hjX3R4X2NjaWQsIHNrLCBza2IpOworCQlkcC0+ZGNjcHNfaGNfdHhfaW5zZXJ0X29wdGlvbnMgPSAwOworCX0KIAogCS8qIFhYWDogaW5zZXJ0IG90aGVyIG9wdGlvbnMgd2hlbiBhcHByb3ByaWF0ZSAqLwogCkBAIC02MTYsNyArNjQ3LDggQEAKIC8qCiAgKiBJbXBsZW1lbnRzIHRoZSBkcmFmdC1pZXRmLWRjY3Atc3BlYy0xMS50eHQgQXBwZW5kaXggQQogICovCi1pbnQgZGNjcF9hY2twa3RzX2FkZChzdHJ1Y3QgZGNjcF9hY2twa3RzICphcCwgdTY0IGFja25vLCB1OCBzdGF0ZSkKK2ludCBkY2NwX2Fja3BrdHNfYWRkKHN0cnVjdCBkY2NwX2Fja3BrdHMgKmFwLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCisJCSAgICAgdTY0IGFja25vLCB1OCBzdGF0ZSkKIHsKIAkvKgogCSAqIENoZWNrIGF0IHRoZSByaWdodCBwbGFjZXMgaWYgdGhlIGJ1ZmZlciBpcyBmdWxsLCBpZiBpdCBpcywgdGVsbCB0aGUKQEAgLTY5Nyw3ICs3MjksNyBAQAogCX0KIAogCWFwLT5kY2NwYXBfYnVmX2Fja25vID0gYWNrbm87Ci0JZG9fZ2V0dGltZW9mZGF5KCZhcC0+ZGNjcGFwX3RpbWUpOworCWRjY3BfdGltZXN0YW1wKHNrLCAmYXAtPmRjY3BhcF90aW1lKTsKIG91dDoKIAlkY2NwX3ByX2RlYnVnKCIiKTsKIAlkY2NwX2Fja3BrdHNfcHJpbnQoYXApOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3Avb3V0cHV0LmMgYi9uZXQvZGNjcC9vdXRwdXQuYwppbmRleCAyOGRlMTU3Li5lYTZkMGU5IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9vdXRwdXQuYworKysgYi9uZXQvZGNjcC9vdXRwdXQuYwpAQCAtNTIyLDcgKzUyMiw0IEBACiAJCWRjY3BfdHJhbnNtaXRfc2tiKHNrLCBza2JfY2xvbmUoc2tiLCBwcmlvKSk7CiAJfSBlbHNlCiAJCWRjY3BfdHJhbnNtaXRfc2tiKHNrLCBza2IpOwotCi0JY2NpZF9oY19yeF9leGl0KGRwLT5kY2Nwc19oY19yeF9jY2lkLCBzayk7Ci0JY2NpZF9oY190eF9leGl0KGRwLT5kY2Nwc19oY190eF9jY2lkLCBzayk7CiB9CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2FmX2RlY25ldC5jIGIvbmV0L2RlY25ldC9hZl9kZWNuZXQuYwppbmRleCA2MjE2ODBmLi4zNDhmMzZiIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCisrKyBiL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKQEAgLTE4NzYsOCArMTg3NiwyNyBAQAogCXJldHVybiBtc3Nfbm93OwogfQogCisvKiAKKyAqIE4uQi4gV2UgZ2V0IHRoZSB0aW1lb3V0IHdyb25nIGhlcmUsIGJ1dCB0aGVuIHdlIGFsd2F5cyBkaWQgZ2V0IGl0CisgKiB3cm9uZyBiZWZvcmUgYW5kIHRoaXMgaXMgYW5vdGhlciBzdGVwIGFsb25nIHRoZSByb2FkIHRvIGNvcnJlY3RpbmcKKyAqIGl0LiBJdCBvdWdodCB0byBnZXQgdXBkYXRlZCBlYWNoIHRpbWUgd2UgcGFzcyB0aHJvdWdoIHRoZSByb3V0aW5lLAorICogYnV0IGluIHByYWN0aXNlIGl0IHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyIHRvbyBtdWNoIGZvciBub3cuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmRuX2FsbG9jX3NlbmRfcHNrYihzdHJ1Y3Qgc29jayAqc2ssCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGRhdGFsZW4sIGludCBub2Jsb2NrLAorCQkJICAgICAgaW50ICplcnJjb2RlKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBkYXRhbGVuLAorCQkJCQkJICAgbm9ibG9jaywgZXJyY29kZSk7CisJaWYgKHNrYikgeworCQlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9ETkFfUlQpOworCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09VVEdPSU5HOworCX0KKwlyZXR1cm4gc2tiOworfQorCiBzdGF0aWMgaW50IGRuX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCSAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpCisJCSAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOwpAQCAtMTg5Miw3ICsxOTExLDcgQEAKIAlzdHJ1Y3QgZG5fc2tiX2NiICpjYjsKIAlzaXplX3QgbGVuOwogCXVuc2lnbmVkIGNoYXIgZmN0eXBlOwotCWxvbmcgdGltZW8gPSBzb2NrX3NuZHRpbWVvKHNrLCBmbGFncyAmIE1TR19ET05UV0FJVCk7CisJbG9uZyB0aW1lbzsKIAogCWlmIChmbGFncyAmIH4oTVNHX1RSWUhBUkR8TVNHX09PQnxNU0dfRE9OVFdBSVR8TVNHX0VPUnxNU0dfTk9TSUdOQUx8TVNHX01PUkV8TVNHX0NNU0dfQ09NUEFUKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMTkwMCwxOCArMTkxOSwyMSBAQAogCWlmIChhZGRyX2xlbiAmJiAoYWRkcl9sZW4gIT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9kbikpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWxvY2tfc29jayhzayk7CisJdGltZW8gPSBzb2NrX3NuZHRpbWVvKHNrLCBmbGFncyAmIE1TR19ET05UV0FJVCk7CiAJLyoKIAkgKiBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gc3RyZWFtIHNvY2tldHMgYW5kIHNlcXVlbmNlZCBwYWNrZXQKIAkgKiBzb2NrZXRzIGlzIHRoYXQgdGhlIHN0cmVhbSBzb2NrZXRzIGFsd2F5cyBiZWhhdmUgYXMgaWYgTVNHX0VPUgogCSAqIGhhcyBiZWVuIHNldC4KIAkgKi8KIAlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSkgewotCQlpZiAoZmxhZ3MgJiBNU0dfRU9SKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmbGFncyAmIE1TR19FT1IpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQogCQlmbGFncyB8PSBNU0dfRU9SOwogCX0KIAotCWxvY2tfc29jayhzayk7CiAKIAllcnIgPSBkbl9jaGVja19zdGF0ZShzaywgYWRkciwgYWRkcl9sZW4sICZ0aW1lbywgZmxhZ3MpOwogCWlmIChlcnIpCkBAIC0xOTgwLDggKzIwMDIsMTIgQEAKIAogCQkvKgogCQkgKiBHZXQgYSBzdWl0YWJseSBzaXplZCBza2IuCisJCSAqIDY0IGlzIGEgYml0IG9mIGEgaGFjayByZWFsbHksIGJ1dCBpdHMgbGFyZ2VyIHRoYW4gYW55CisJCSAqIGxpbmstbGF5ZXIgaGVhZGVycyBhbmQgaGFzIHNlcnZlZCB1cyB3ZWxsIGFzIGEgZ29vZAorCQkgKiBndWVzcyBhcyB0byB0aGVpciByZWFsIGxlbmd0aC4KIAkJICovCi0JCXNrYiA9IGRuX2FsbG9jX3NlbmRfc2tiKHNrLCAmbGVuLCBmbGFncyAmIE1TR19ET05UV0FJVCwgdGltZW8sICZlcnIpOworCQlza2IgPSBkbl9hbGxvY19zZW5kX3Bza2Ioc2ssIGxlbiArIDY0ICsgRE5fTUFYX05TUF9EQVRBX0hFQURFUiwKKwkJCQkJIGZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKTsKIAogCQlpZiAoZXJyKQogCQkJYnJlYWs7CkBAIC0xOTkxLDcgKzIwMTcsNyBAQAogCiAJCWNiID0gRE5fU0tCX0NCKHNrYik7CiAKLQkJc2tiX3Jlc2VydmUoc2tiLCBETl9NQVhfTlNQX0RBVEFfSEVBREVSKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCA2NCArIEROX01BWF9OU1BfREFUQV9IRUFERVIpOwogCiAJCWlmIChtZW1jcHlfZnJvbWlvdmVjKHNrYl9wdXQoc2tiLCBsZW4pLCBtc2ctPm1zZ19pb3YsIGxlbikpIHsKIAkJCWVyciA9IC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX25zcF9vdXQuYyBiL25ldC9kZWNuZXQvZG5fbnNwX291dC5jCmluZGV4IGUwYmViZjQuLjUzNjMzZDMgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fbnNwX291dC5jCisrKyBiL25ldC9kZWNuZXQvZG5fbnNwX291dC5jCkBAIC0xMzcsNjkgKzEzNyw2IEBACiB9CiAKIC8qCi0gKiBXcmFwcGVyIGZvciB0aGUgYWJvdmUsIGZvciBhbGxvY3Mgb2YgZGF0YSBza2JzLiBXZSB0cnkgYW5kIGdldCB0aGUKLSAqIHdob2xlIHNpemUgdGhhdHMgYmVlbiBhc2tlZCBmb3IgKHBsdXMgMTEgYnl0ZXMgb2YgaGVhZGVyKS4gSWYgdGhpcwotICogZmFpbHMsIHRoZW4gd2UgdHJ5IGZvciBhbnkgc2l6ZSBvdmVyIDE2IGJ5dGVzIGZvciBTT0NLX1NUUkVBTVMuCi0gKi8KLXN0cnVjdCBza19idWZmICpkbl9hbGxvY19zZW5kX3NrYihzdHJ1Y3Qgc29jayAqc2ssIHNpemVfdCAqc2l6ZSwgaW50IG5vYmxvY2ssIGxvbmcgdGltZW8sIGludCAqZXJyKQotewotCWludCBzcGFjZTsKLQlpbnQgbGVuOwotCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCi0JKmVyciA9IDA7Ci0KLQl3aGlsZShza2IgPT0gTlVMTCkgewotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCSplcnIgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikgewotCQkJKmVyciA9IEVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHNrLT5za19lcnIpCi0JCQlicmVhazsKLQotCQlsZW4gPSAqc2l6ZSArIDExOwotCQlzcGFjZSA9IHNrLT5za19zbmRidWYgLSBhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpOwotCi0JCWlmIChzcGFjZSA8IGxlbikgewotCQkJaWYgKChzay0+c2tfc29ja2V0LT50eXBlID09IFNPQ0tfU1RSRUFNKSAmJgotCQkJICAgIChzcGFjZSA+PSAoMTYgKyAxMSkpKQotCQkJCWxlbiA9IHNwYWNlOwotCQl9Ci0KLQkJaWYgKHNwYWNlIDwgbGVuKSB7Ci0JCQlzZXRfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKLQkJCWlmIChub2Jsb2NrKSB7Ci0JCQkJKmVyciA9IEVXT1VMREJMT0NLOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQljbGVhcl9iaXQoU09DS19BU1lOQ19XQUlUREFUQSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKLQkJCVNPQ0tfU0xFRVBfUFJFKHNrKQotCi0JCQlpZiAoKHNrLT5za19zbmRidWYgLSBhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpKSA8Ci0JCQkgICAgbGVuKQotCQkJCXNjaGVkdWxlKCk7Ci0KLQkJCVNPQ0tfU0xFRVBfUE9TVChzaykKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKChza2IgPSBkbl9hbGxvY19za2Ioc2ssIGxlbiwgc2stPnNrX2FsbG9jYXRpb24pKSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0KLQkJKnNpemUgPSBsZW4gLSAxMTsKLQl9Ci0KLQlyZXR1cm4gc2tiOwotfQotCi0vKgogICogQ2FsY3VsYXRlIHBlcnNpc3QgdGltZXIgYmFzZWQgdXBvbiB0aGUgc21vb3RoZWQgcm91bmQKICAqIHRyaXAgdGltZSBhbmQgdGhlIHZhcmlhbmNlLiBCYWNrb2ZmIGFjY29yZGluZyB0byB0aGUKICAqIG5zcF9iYWNrb2ZmW10gYXJyYXkuCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3JvdXRlLmMgYi9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKaW5kZXggMmM5MTVmMy4uMzQwN2YxOSAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCisrKyBiL25ldC9kZWNuZXQvZG5fcm91dGUuYwpAQCAtMTE3LDggKzExNyw3IEBACiBzdGF0aWMgdW5zaWduZWQgZG5fcnRfaGFzaF9tYXNrOwogCiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZG5fcm91dGVfdGltZXI7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZG5fcnRfZmx1c2hfdGltZXIgPQotCQlUSU1FUl9JTklUSUFMSVpFUihkbl9ydW5fZmx1c2gsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihkbl9ydF9mbHVzaF90aW1lciwgZG5fcnVuX2ZsdXNoLCAwLCAwKTsKIGludCBkZWNuZXRfZHN0X2djX2ludGVydmFsID0gMjsKIAogc3RhdGljIHN0cnVjdCBkc3Rfb3BzIGRuX2RzdF9vcHMgPSB7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL0tjb25maWcgYi9uZXQvaWVlZTgwMjExL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiMTZmYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pZWVlODAyMTEvS2NvbmZpZwpAQCAtMCwwICsxLDY4IEBACitjb25maWcgSUVFRTgwMjExCisJdHJpc3RhdGUgIkdlbmVyaWMgSUVFRSA4MDIuMTEgTmV0d29ya2luZyBTdGFjayIKKwktLS1oZWxwLS0tCisJVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgaGFyZHdhcmUgaW5kZXBlbmRlbnQgSUVFRSA4MDIuMTEKKwluZXR3b3JraW5nIHN0YWNrLgorCitjb25maWcgSUVFRTgwMjExX0RFQlVHCisJYm9vbCAiRW5hYmxlIGZ1bGwgZGVidWdnaW5nIG91dHB1dCIKKwlkZXBlbmRzIG9uIElFRUU4MDIxMQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIGRlYnVnIHRyYWNpbmcgb3V0cHV0IGZvciB0aGUKKwkgIGllZWU4MDIxMSBuZXR3b3JrIHN0YWNrLgorCisJICBUaGlzIHdpbGwgcmVzdWx0IGluIHRoZSBrZXJuZWwgbW9kdWxlIGJlaW5nIH43MGsgbGFyZ2VyLiAgWW91CisJICBjYW4gY29udHJvbCB3aGljaCBkZWJ1ZyBvdXRwdXQgaXMgc2VudCB0byB0aGUga2VybmVsIGxvZyBieQorCSAgc2V0dGluZyB0aGUgdmFsdWUgaW4KKworCSAgL3Byb2MvbmV0L2llZWU4MDIxMS9kZWJ1Z19sZXZlbAorCisJICBGb3IgZXhhbXBsZToKKworCSAgJSBlY2hvIDB4MDAwMDBGRk8gPiAvcHJvYy9uZXQvaWVlZTgwMjExL2RlYnVnX2xldmVsCisKKwkgIEZvciBhIGxpc3Qgb2YgdmFsdWVzIHlvdSBjYW4gYXNzaWduIHRvIGRlYnVnX2xldmVsLCB5b3UKKwkgIGNhbiBsb29rIGF0IHRoZSBiaXQgbWFzayB2YWx1ZXMgaW4gPG5ldC9pZWVlODAyMTEuaD4KKworCSAgSWYgeW91IGFyZSBub3QgdHJ5aW5nIHRvIGRlYnVnIG9yIGRldmVsb3AgdGhlIGllZWU4MDIxMQorCSAgc3Vic3lzdGVtLCB5b3UgbW9zdCBsaWtlbHkgd2FudCB0byBzYXkgTiBoZXJlLgorCitjb25maWcgSUVFRTgwMjExX0NSWVBUX1dFUAorCXRyaXN0YXRlICJJRUVFIDgwMi4xMSBXRVAgZW5jcnlwdGlvbiAoODAyLjF4KSIKKwlkZXBlbmRzIG9uIElFRUU4MDIxMQorCXNlbGVjdCBDUllQVE8KKwlzZWxlY3QgQ1JZUFRPX0FSQzQKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJSW5jbHVkZSBzb2Z0d2FyZSBiYXNlZCBjaXBoZXIgc3VpdGVzIGluIHN1cHBvcnQgb2YgSUVFRQorCTgwMi4xMSdzIFdFUC4gIFRoaXMgaXMgbmVlZGVkIGZvciBXRVAgYXMgd2VsbCBhcyA4MDIuMXguCisKKwlUaGlzIGNhbiBiZSBjb21waWxlZCBhcyBhIG1vZHVsZXMgYW5kIGl0IHdpbGwgYmUgY2FsbGVkCisJImllZWU4MDIxMV9jcnlwdF93ZXAiLgorCitjb25maWcgSUVFRTgwMjExX0NSWVBUX0NDTVAKKwl0cmlzdGF0ZSAiSUVFRSA4MDIuMTFpIENDTVAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElFRUU4MDIxMQorCXNlbGVjdCBDUllQVE8KKwlzZWxlY3QgQ1JZUFRPX0FFUworCS0tLWhlbHAtLS0KKwlJbmNsdWRlIHNvZnR3YXJlIGJhc2VkIGNpcGhlciBzdWl0ZXMgaW4gc3VwcG9ydCBvZiBJRUVFIDgwMi4xMWkKKwkoYWthIFRHaSwgV1BBLCBXUEEyLCBXUEEtUFNLLCBldGMuKSBmb3IgdXNlIHdpdGggQ0NNUCBlbmFibGVkCisJbmV0d29ya3MuCisKKwlUaGlzIGNhbiBiZSBjb21waWxlZCBhcyBhIG1vZHVsZXMgYW5kIGl0IHdpbGwgYmUgY2FsbGVkCisJImllZWU4MDIxMV9jcnlwdF9jY21wIi4KKworY29uZmlnIElFRUU4MDIxMV9DUllQVF9US0lQCisJdHJpc3RhdGUgIklFRUUgODAyLjExaSBUS0lQIGVuY3J5cHRpb24iCisJZGVwZW5kcyBvbiBJRUVFODAyMTEKKwlzZWxlY3QgQ1JZUFRPCisJc2VsZWN0IENSWVBUT19NSUNIQUVMX01JQworCS0tLWhlbHAtLS0KKwlJbmNsdWRlIHNvZnR3YXJlIGJhc2VkIGNpcGhlciBzdWl0ZXMgaW4gc3VwcG9ydCBvZiBJRUVFIDgwMi4xMWkKKwkoYWthIFRHaSwgV1BBLCBXUEEyLCBXUEEtUFNLLCBldGMuKSBmb3IgdXNlIHdpdGggVEtJUCBlbmFibGVkCisJbmV0d29ya3MuCisKKwlUaGlzIGNhbiBiZSBjb21waWxlZCBhcyBhIG1vZHVsZXMgYW5kIGl0IHdpbGwgYmUgY2FsbGVkCisJImllZWU4MDIxMV9jcnlwdF90a2lwIi4KKwpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9NYWtlZmlsZSBiL25ldC9pZWVlODAyMTEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjY2FjNQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pZWVlODAyMTEvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorb2JqLSQoQ09ORklHX0lFRUU4MDIxMSkgKz0gaWVlZTgwMjExLm8KK29iai0kKENPTkZJR19JRUVFODAyMTEpICs9IGllZWU4MDIxMV9jcnlwdC5vCitvYmotJChDT05GSUdfSUVFRTgwMjExX0NSWVBUX1dFUCkgKz0gaWVlZTgwMjExX2NyeXB0X3dlcC5vCitvYmotJChDT05GSUdfSUVFRTgwMjExX0NSWVBUX0NDTVApICs9IGllZWU4MDIxMV9jcnlwdF9jY21wLm8KK29iai0kKENPTkZJR19JRUVFODAyMTFfQ1JZUFRfVEtJUCkgKz0gaWVlZTgwMjExX2NyeXB0X3RraXAubworaWVlZTgwMjExLW9ianMgOj0gXAorCWllZWU4MDIxMV9tb2R1bGUubyBcCisJaWVlZTgwMjExX3R4Lm8gXAorCWllZWU4MDIxMV9yeC5vIFwKKwlpZWVlODAyMTFfd3gubworCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWE5ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHRvIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24gPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgorCitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3RBUCBjcnlwdG8iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0byB7CisJc3RydWN0IGxpc3RfaGVhZCBhbGdzOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0byAqaGNyeXB0OworCit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IGZvcmNlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICplbnRyeTsKKworCWZvciAocHRyID0gaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QubmV4dCwgbiA9IHB0ci0+bmV4dDsKKwkgICAgIHB0ciAhPSAmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3Q7IHB0ciA9IG4sIG4gPSBwdHItPm5leHQpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhLCBsaXN0KTsKKworCQlpZiAoYXRvbWljX3JlYWQoJmVudHJ5LT5yZWZjbnQpICE9IDAgJiYgIWZvcmNlKQorCQkJY29udGludWU7CisKKwkJbGlzdF9kZWwocHRyKTsKKworCQlpZiAoZW50cnktPm9wcykgeworCQkJZW50cnktPm9wcy0+ZGVpbml0KGVudHJ5LT5wcml2KTsKKwkJCW1vZHVsZV9wdXQoZW50cnktPm9wcy0+b3duZXIpOworCQl9CisJCWtmcmVlKGVudHJ5KTsKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKGllZWUsIDApOworCWlmICghbGlzdF9lbXB0eSgmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50cmllcyByZW1haW5pbmcgaW4gZGVsYXllZCBjcnlwdCAiCisJCSAgICAgICAiZGVsZXRpb24gbGlzdFxuIiwgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJCWFkZF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCpjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl0bXAgPSAqY3J5cHQ7CisJKmNyeXB0ID0gTlVMTDsKKworCS8qIG11c3Qgbm90IHJ1biBvcHMtPmRlaW5pdCgpIHdoaWxlIHRoZXJlIG1heSBiZSBwZW5kaW5nIGVuY3J5cHQgb3IKKwkgKiBkZWNyeXB0IG9wZXJhdGlvbnMuIFVzZSBhIGxpc3Qgb2YgZGVsYXllZCBkZWluaXRzIHRvIGF2b2lkIG5lZWRpbmcKKwkgKiBsb2NraW5nLiAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmdG1wLT5saXN0LCAmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpOworCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKSkgeworCQlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJYWRkX3RpbWVyKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK2ludCBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnOworCisJaWYgKGhjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlhbGcgPSBrbWFsbG9jKHNpemVvZigqYWxnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFsZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChhbGcsIDAsIHNpemVvZigqYWxnKSk7CisJYWxnLT5vcHMgPSBvcHM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJmFsZy0+bGlzdCwgJmhjcnlwdC0+YWxncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiByZWdpc3RlcmVkIGFsZ29yaXRobSAnJXMnXG4iLAorCSAgICAgICBvcHMtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqZGVsX2FsZyA9IE5VTEw7CisKKwlpZiAoaGNyeXB0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKHB0ciA9IGhjcnlwdC0+YWxncy5uZXh0OyBwdHIgIT0gJmhjcnlwdC0+YWxnczsgcHRyID0gcHRyLT5uZXh0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnID0KKwkJICAgIChzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKilwdHI7CisJCWlmIChhbGctPm9wcyA9PSBvcHMpIHsKKwkJCWxpc3RfZGVsKCZhbGctPmxpc3QpOworCQkJZGVsX2FsZyA9IGFsZzsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGRlbF9hbGcpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdDogdW5yZWdpc3RlcmVkIGFsZ29yaXRobSAiCisJCSAgICAgICAiJyVzJ1xuIiwgb3BzLT5uYW1lKTsKKwkJa2ZyZWUoZGVsX2FsZyk7CisJfQorCisJcmV0dXJuIGRlbF9hbGcgPyAwIDogLTE7Cit9CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICpmb3VuZF9hbGcgPSBOVUxMOworCisJaWYgKGhjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKHB0ciA9IGhjcnlwdC0+YWxncy5uZXh0OyBwdHIgIT0gJmhjcnlwdC0+YWxnczsgcHRyID0gcHRyLT5uZXh0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnID0KKwkJICAgIChzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKilwdHI7CisJCWlmIChzdHJjbXAoYWxnLT5vcHMtPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCWZvdW5kX2FsZyA9IGFsZzsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGZvdW5kX2FsZykKKwkJcmV0dXJuIGZvdW5kX2FsZy0+b3BzOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICppZWVlODAyMTFfY3J5cHRfbnVsbF9pbml0KGludCBrZXlpZHgpCit7CisJcmV0dXJuICh2b2lkICopMTsKK30KK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9jcnlwdF9udWxsX2RlaW5pdCh2b2lkICpwcml2KQoreworfQorCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIGllZWU4MDIxMV9jcnlwdF9udWxsID0geworCS5uYW1lCQkJPSAiTlVMTCIsCisJLmluaXQJCQk9IGllZWU4MDIxMV9jcnlwdF9udWxsX2luaXQsCisJLmRlaW5pdAkJCT0gaWVlZTgwMjExX2NyeXB0X251bGxfZGVpbml0LAorCS5lbmNyeXB0X21wZHUJCT0gTlVMTCwKKwkuZGVjcnlwdF9tcGR1CQk9IE5VTEwsCisJLmVuY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5kZWNyeXB0X21zZHUJCT0gTlVMTCwKKwkuc2V0X2tleQkJPSBOVUxMLAorCS5nZXRfa2V5CQk9IE5VTEwsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSAwLAorCS5leHRyYV9wb3N0Zml4X2xlbgk9IDAsCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGllZWU4MDIxMV9jcnlwdG9faW5pdCh2b2lkKQoreworCWludCByZXQgPSAtRU5PTUVNOworCisJaGNyeXB0ID0ga21hbGxvYyhzaXplb2YoKmhjcnlwdCksIEdGUF9LRVJORUwpOworCWlmICghaGNyeXB0KQorCQlnb3RvIG91dDsKKworCW1lbXNldChoY3J5cHQsIDAsIHNpemVvZigqaGNyeXB0KSk7CisJSU5JVF9MSVNUX0hFQUQoJmhjcnlwdC0+YWxncyk7CisJc3Bpbl9sb2NrX2luaXQoJmhjcnlwdC0+bG9jayk7CisKKwlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X251bGwpOworCWlmIChyZXQgPCAwKSB7CisJCWtmcmVlKGhjcnlwdCk7CisJCWhjcnlwdCA9IE5VTEw7CisJfQorICAgICAgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisKKwlpZiAoaGNyeXB0ID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAocHRyID0gaGNyeXB0LT5hbGdzLm5leHQsIG4gPSBwdHItPm5leHQ7IHB0ciAhPSAmaGNyeXB0LT5hbGdzOworCSAgICAgcHRyID0gbiwgbiA9IHB0ci0+bmV4dCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZyA9CisJCSAgICAoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopcHRyOworCQlsaXN0X2RlbChwdHIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICIKKwkJICAgICAgICInJXMnIChkZWluaXQpXG4iLCBhbGctPm9wcy0+bmFtZSk7CisJCWtmcmVlKGFsZyk7CisJfQorCisJa2ZyZWUoaGNyeXB0KTsKK30KKworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQpOworCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyk7CisKK21vZHVsZV9pbml0KGllZWU4MDIxMV9jcnlwdG9faW5pdCk7Cittb2R1bGVfZXhpdChpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjMTNmNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYwpAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHQ6IGhvc3QtYmFzZWQgQ0NNUCBlbmNyeXB0aW9uIGltcGxlbWVudGF0aW9uIGZvciBIb3N0IEFQIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KKworI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorCitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3QgQVAgY3J5cHQ6IENDTVAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBBRVNfQkxPQ0tfTEVOIDE2CisjZGVmaW5lIENDTVBfSERSX0xFTiA4CisjZGVmaW5lIENDTVBfTUlDX0xFTiA4CisjZGVmaW5lIENDTVBfVEtfTEVOIDE2CisjZGVmaW5lIENDTVBfUE5fTEVOIDYKKworc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgeworCXU4IGtleVtDQ01QX1RLX0xFTl07CisJaW50IGtleV9zZXQ7CisKKwl1OCB0eF9wbltDQ01QX1BOX0xFTl07CisJdTggcnhfcG5bQ0NNUF9QTl9MRU5dOworCisJdTMyIGRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9yczsKKwl1MzIgZG90MTFSU05BU3RhdHNDQ01QUmVwbGF5czsKKwl1MzIgZG90MTFSU05BU3RhdHNDQ01QRGVjcnlwdEVycm9yczsKKworCWludCBrZXlfaWR4OworCisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKKworCS8qIHNjcmF0Y2ggYnVmZmVycyBmb3IgdmlydF90b19wYWdlKCkgKGNyeXB0byBBUEkpICovCisJdTggdHhfYjBbQUVTX0JMT0NLX0xFTl0sIHR4X2JbQUVTX0JMT0NLX0xFTl0sCisJICAgIHR4X2VbQUVTX0JMT0NLX0xFTl0sIHR4X3MwW0FFU19CTE9DS19MRU5dOworCXU4IHJ4X2IwW0FFU19CTE9DS19MRU5dLCByeF9iW0FFU19CTE9DS19MRU5dLCByeF9hW0FFU19CTE9DS19MRU5dOworfTsKKworc3RhdGljIHZvaWQgaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCQkgICAgICAgY29uc3QgdTggcHRbMTZdLCB1OCBjdFsxNl0pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNyYywgZHN0OworCisJc3JjLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocHQpOworCXNyYy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwdCk7CisJc3JjLmxlbmd0aCA9IEFFU19CTE9DS19MRU47CisKKwlkc3QucGFnZSA9IHZpcnRfdG9fcGFnZShjdCk7CisJZHN0Lm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGN0KTsKKwlkc3QubGVuZ3RoID0gQUVTX0JMT0NLX0xFTjsKKworCWNyeXB0b19jaXBoZXJfZW5jcnlwdCh0Zm0sICZkc3QsICZzcmMsIEFFU19CTE9DS19MRU4pOworfQorCitzdGF0aWMgdm9pZCAqaWVlZTgwMjExX2NjbXBfaW5pdChpbnQga2V5X2lkeCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqcHJpdjsKKworCXByaXYgPSBrbWFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9BVE9NSUMpOworCWlmIChwcml2ID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CisJcHJpdi0+a2V5X2lkeCA9IGtleV9pZHg7CisKKwlwcml2LT50Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKCJhZXMiLCAwKTsKKwlpZiAocHJpdi0+dGZtID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF9jY21wOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYWVzXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiBwcml2OworCisgICAgICBmYWlsOgorCWlmIChwcml2KSB7CisJCWlmIChwcml2LT50Zm0pCisJCQljcnlwdG9fZnJlZV90Zm0ocHJpdi0+dGZtKTsKKwkJa2ZyZWUocHJpdik7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9jY21wX2RlaW5pdCh2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpfcHJpdiA9IHByaXY7CisJaWYgKF9wcml2ICYmIF9wcml2LT50Zm0pCisJCWNyeXB0b19mcmVlX3RmbShfcHJpdi0+dGZtKTsKKwlrZnJlZShwcml2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhvcl9ibG9jayh1OCAqIGIsIHU4ICogYSwgc2l6ZV90IGxlbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWJbaV0gXj0gYVtpXTsKK30KKworc3RhdGljIHZvaWQgY2NtcF9pbml0X2Jsb2NrcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgICB1OCAqIHBuLCBzaXplX3QgZGxlbiwgdTggKiBiMCwgdTggKiBhdXRoLCB1OCAqIHMwKQoreworCXU4ICpwb3MsIHFjID0gMDsKKwlzaXplX3QgYWFkX2xlbjsKKwl1MTYgZmM7CisJaW50IGE0X2luY2x1ZGVkLCBxY19pbmNsdWRlZDsKKwl1OCBhYWRbMiAqIEFFU19CTE9DS19MRU5dOworCisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJYTRfaW5jbHVkZWQgPSAoKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PQorCQkgICAgICAgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKTsKKwlxY19pbmNsdWRlZCA9ICgoV0xBTl9GQ19HRVRfVFlQRShmYykgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpICYmCisJCSAgICAgICAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpICYgMHgwOCkpOworCWFhZF9sZW4gPSAyMjsKKwlpZiAoYTRfaW5jbHVkZWQpCisJCWFhZF9sZW4gKz0gNjsKKwlpZiAocWNfaW5jbHVkZWQpIHsKKwkJcG9zID0gKHU4ICopICYgaGRyLT5hZGRyNDsKKwkJaWYgKGE0X2luY2x1ZGVkKQorCQkJcG9zICs9IDY7CisJCXFjID0gKnBvcyAmIDB4MGY7CisJCWFhZF9sZW4gKz0gMjsKKwl9CisKKwkvKiBDQ00gSW5pdGlhbCBCbG9jazoKKwkgKiBGbGFnIChJbmNsdWRlIGF1dGhlbnRpY2F0aW9uIGhlYWRlciwgTT0zICg4LW9jdGV0IE1JQyksCisJICogICAgICAgTD0xICgyLW9jdGV0IERsZW4pKQorCSAqIE5vbmNlOiAweDAwIHwgQTIgfCBQTgorCSAqIERsZW4gKi8KKwliMFswXSA9IDB4NTk7CisJYjBbMV0gPSBxYzsKKwltZW1jcHkoYjAgKyAyLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJbWVtY3B5KGIwICsgOCwgcG4sIENDTVBfUE5fTEVOKTsKKwliMFsxNF0gPSAoZGxlbiA+PiA4KSAmIDB4ZmY7CisJYjBbMTVdID0gZGxlbiAmIDB4ZmY7CisKKwkvKiBBQUQ6CisJICogRkMgd2l0aCBiaXRzIDQuLjYgYW5kIDExLi4xMyBtYXNrZWQgdG8gemVybzsgMTQgaXMgYWx3YXlzIG9uZQorCSAqIEExIHwgQTIgfCBBMworCSAqIFNDIHdpdGggYml0cyA0Li4xNSAoc2VxIykgbWFza2VkIHRvIHplcm8KKwkgKiBBNCAoaWYgcHJlc2VudCkKKwkgKiBRQyAoaWYgcHJlc2VudCkKKwkgKi8KKwlwb3MgPSAodTggKikgaGRyOworCWFhZFswXSA9IDA7CQkvKiBhYWRfbGVuID4+IDggKi8KKwlhYWRbMV0gPSBhYWRfbGVuICYgMHhmZjsKKwlhYWRbMl0gPSBwb3NbMF0gJiAweDhmOworCWFhZFszXSA9IHBvc1sxXSAmIDB4Yzc7CisJbWVtY3B5KGFhZCArIDQsIGhkci0+YWRkcjEsIDMgKiBFVEhfQUxFTik7CisJcG9zID0gKHU4ICopICYgaGRyLT5zZXFfY3RsOworCWFhZFsyMl0gPSBwb3NbMF0gJiAweDBmOworCWFhZFsyM10gPSAwOwkJLyogYWxsIGJpdHMgbWFza2VkICovCisJbWVtc2V0KGFhZCArIDI0LCAwLCA4KTsKKwlpZiAoYTRfaW5jbHVkZWQpCisJCW1lbWNweShhYWQgKyAyNCwgaGRyLT5hZGRyNCwgRVRIX0FMRU4pOworCWlmIChxY19pbmNsdWRlZCkgeworCQlhYWRbYTRfaW5jbHVkZWQgPyAzMCA6IDI0XSA9IHFjOworCQkvKiByZXN0IG9mIFFDIG1hc2tlZCAqLworCX0KKworCS8qIFN0YXJ0IHdpdGggdGhlIGZpcnN0IGJsb2NrIGFuZCBBQUQgKi8KKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGIwLCBhdXRoKTsKKwl4b3JfYmxvY2soYXV0aCwgYWFkLCBBRVNfQkxPQ0tfTEVOKTsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGF1dGgsIGF1dGgpOworCXhvcl9ibG9jayhhdXRoLCAmYWFkW0FFU19CTE9DS19MRU5dLCBBRVNfQkxPQ0tfTEVOKTsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGF1dGgsIGF1dGgpOworCWIwWzBdICY9IDB4MDc7CisJYjBbMTRdID0gYjBbMTVdID0gMDsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGIwLCBzMCk7Cit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZW5jcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqa2V5ID0gcHJpdjsKKwlpbnQgZGF0YV9sZW4sIGksIGJsb2NrcywgbGFzdCwgbGVuOworCXU4ICpwb3MsICptaWM7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwl1OCAqYjAgPSBrZXktPnR4X2IwOworCXU4ICpiID0ga2V5LT50eF9iOworCXU4ICplID0ga2V5LT50eF9lOworCXU4ICpzMCA9IGtleS0+dHhfczA7CisKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBDQ01QX0hEUl9MRU4gfHwKKwkgICAgc2tiX3RhaWxyb29tKHNrYikgPCBDQ01QX01JQ19MRU4gfHwgc2tiLT5sZW4gPCBoZHJfbGVuKQorCQlyZXR1cm4gLTE7CisKKwlkYXRhX2xlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlwb3MgPSBza2JfcHVzaChza2IsIENDTVBfSERSX0xFTik7CisJbWVtbW92ZShwb3MsIHBvcyArIENDTVBfSERSX0xFTiwgaGRyX2xlbik7CisJcG9zICs9IGhkcl9sZW47CisJbWljID0gc2tiX3B1dChza2IsIENDTVBfTUlDX0xFTik7CisKKwlpID0gQ0NNUF9QTl9MRU4gLSAxOworCXdoaWxlIChpID49IDApIHsKKwkJa2V5LT50eF9wbltpXSsrOworCQlpZiAoa2V5LT50eF9wbltpXSAhPSAwKQorCQkJYnJlYWs7CisJCWktLTsKKwl9CisKKwkqcG9zKysgPSBrZXktPnR4X3BuWzVdOworCSpwb3MrKyA9IGtleS0+dHhfcG5bNF07CisJKnBvcysrID0gMDsKKwkqcG9zKysgPSAoa2V5LT5rZXlfaWR4IDw8IDYpIHwgKDEgPDwgNSkgLyogRXh0IElWIGluY2x1ZGVkICovIDsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzNdOworCSpwb3MrKyA9IGtleS0+dHhfcG5bMl07CisJKnBvcysrID0ga2V5LT50eF9wblsxXTsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzBdOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCWNjbXBfaW5pdF9ibG9ja3Moa2V5LT50Zm0sIGhkciwga2V5LT50eF9wbiwgZGF0YV9sZW4sIGIwLCBiLCBzMCk7CisKKwlibG9ja3MgPSAoZGF0YV9sZW4gKyBBRVNfQkxPQ0tfTEVOIC0gMSkgLyBBRVNfQkxPQ0tfTEVOOworCWxhc3QgPSBkYXRhX2xlbiAlIEFFU19CTE9DS19MRU47CisKKwlmb3IgKGkgPSAxOyBpIDw9IGJsb2NrczsgaSsrKSB7CisJCWxlbiA9IChpID09IGJsb2NrcyAmJiBsYXN0KSA/IGxhc3QgOiBBRVNfQkxPQ0tfTEVOOworCQkvKiBBdXRoZW50aWNhdGlvbiAqLworCQl4b3JfYmxvY2soYiwgcG9zLCBsZW4pOworCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYiwgYik7CisJCS8qIEVuY3J5cHRpb24sIHdpdGggY291bnRlciAqLworCQliMFsxNF0gPSAoaSA+PiA4KSAmIDB4ZmY7CisJCWIwWzE1XSA9IGkgJiAweGZmOworCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYjAsIGUpOworCQl4b3JfYmxvY2socG9zLCBlLCBsZW4pOworCQlwb3MgKz0gbGVuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBDQ01QX01JQ19MRU47IGkrKykKKwkJbWljW2ldID0gYltpXSBeIHMwW2ldOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqa2V5ID0gcHJpdjsKKwl1OCBrZXlpZHgsICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwl1OCAqYjAgPSBrZXktPnJ4X2IwOworCXU4ICpiID0ga2V5LT5yeF9iOworCXU4ICphID0ga2V5LT5yeF9hOworCXU4IHBuWzZdOworCWludCBpLCBibG9ja3MsIGxhc3QsIGxlbjsKKwlzaXplX3QgZGF0YV9sZW4gPSBza2ItPmxlbiAtIGhkcl9sZW4gLSBDQ01QX0hEUl9MRU4gLSBDQ01QX01JQ19MRU47CisJdTggKm1pYyA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gQ0NNUF9NSUNfTEVOOworCisJaWYgKHNrYi0+bGVuIDwgaGRyX2xlbiArIENDTVBfSERSX0xFTiArIENDTVBfTUlDX0xFTikgeworCQlrZXktPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycysrOworCQlyZXR1cm4gLTE7CisJfQorCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCXBvcyA9IHNrYi0+ZGF0YSArIGhkcl9sZW47CisJa2V5aWR4ID0gcG9zWzNdOworCWlmICghKGtleWlkeCAmICgxIDw8IDUpKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogcmVjZWl2ZWQgcGFja2V0IHdpdGhvdXQgRXh0SVYiCisJCQkgICAgICAgIiBmbGFnIGZyb20gIiBNQUNfRk1UICJcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQl9CisJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QRm9ybWF0RXJyb3JzKys7CisJCXJldHVybiAtMjsKKwl9CisJa2V5aWR4ID4+PSA2OworCWlmIChrZXktPmtleV9pZHggIT0ga2V5aWR4KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiBSWCB0a2V5LT5rZXlfaWR4PSVkIGZyYW1lICIKKwkJICAgICAgICJrZXlpZHg9JWQgcHJpdj0lcFxuIiwga2V5LT5rZXlfaWR4LCBrZXlpZHgsIHByaXYpOworCQlyZXR1cm4gLTY7CisJfQorCWlmICgha2V5LT5rZXlfc2V0KSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiByZWNlaXZlZCBwYWNrZXQgZnJvbSAiIE1BQ19GTVQKKwkJCSAgICAgICAiIHdpdGgga2V5aWQ9JWQgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29uZmlndXJlZCIKKwkJCSAgICAgICAiIGtleVxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwga2V5aWR4KTsKKwkJfQorCQlyZXR1cm4gLTM7CisJfQorCisJcG5bMF0gPSBwb3NbN107CisJcG5bMV0gPSBwb3NbNl07CisJcG5bMl0gPSBwb3NbNV07CisJcG5bM10gPSBwb3NbNF07CisJcG5bNF0gPSBwb3NbMV07CisJcG5bNV0gPSBwb3NbMF07CisJcG9zICs9IDg7CisKKwlpZiAobWVtY21wKHBuLCBrZXktPnJ4X3BuLCBDQ01QX1BOX0xFTikgPD0gMCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogcmVwbGF5IGRldGVjdGVkOiBTVEE9IiBNQUNfRk1UCisJCQkgICAgICAgIiBwcmV2aW91cyBQTiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkJICAgICAgICJyZWNlaXZlZCBQTiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQkgICAgICAgTUFDX0FSRyhoZHItPmFkZHIyKSwgTUFDX0FSRyhrZXktPnJ4X3BuKSwKKwkJCSAgICAgICBNQUNfQVJHKHBuKSk7CisJCX0KKwkJa2V5LT5kb3QxMVJTTkFTdGF0c0NDTVBSZXBsYXlzKys7CisJCXJldHVybiAtNDsKKwl9CisKKwljY21wX2luaXRfYmxvY2tzKGtleS0+dGZtLCBoZHIsIHBuLCBkYXRhX2xlbiwgYjAsIGEsIGIpOworCXhvcl9ibG9jayhtaWMsIGIsIENDTVBfTUlDX0xFTik7CisKKwlibG9ja3MgPSAoZGF0YV9sZW4gKyBBRVNfQkxPQ0tfTEVOIC0gMSkgLyBBRVNfQkxPQ0tfTEVOOworCWxhc3QgPSBkYXRhX2xlbiAlIEFFU19CTE9DS19MRU47CisKKwlmb3IgKGkgPSAxOyBpIDw9IGJsb2NrczsgaSsrKSB7CisJCWxlbiA9IChpID09IGJsb2NrcyAmJiBsYXN0KSA/IGxhc3QgOiBBRVNfQkxPQ0tfTEVOOworCQkvKiBEZWNyeXB0LCB3aXRoIGNvdW50ZXIgKi8KKwkJYjBbMTRdID0gKGkgPj4gOCkgJiAweGZmOworCQliMFsxNV0gPSBpICYgMHhmZjsKKwkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGIwLCBiKTsKKwkJeG9yX2Jsb2NrKHBvcywgYiwgbGVuKTsKKwkJLyogQXV0aGVudGljYXRpb24gKi8KKwkJeG9yX2Jsb2NrKGEsIHBvcywgbGVuKTsKKwkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGEsIGEpOworCQlwb3MgKz0gbGVuOworCX0KKworCWlmIChtZW1jbXAobWljLCBhLCBDQ01QX01JQ19MRU4pICE9IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IGRlY3J5cHQgZmFpbGVkOiBTVEE9IgorCQkJICAgICAgIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJa2V5LT5kb3QxMVJTTkFTdGF0c0NDTVBEZWNyeXB0RXJyb3JzKys7CisJCXJldHVybiAtNTsKKwl9CisKKwltZW1jcHkoa2V5LT5yeF9wbiwgcG4sIENDTVBfUE5fTEVOKTsKKworCS8qIFJlbW92ZSBoZHIgYW5kIE1JQyAqLworCW1lbW1vdmUoc2tiLT5kYXRhICsgQ0NNUF9IRFJfTEVOLCBza2ItPmRhdGEsIGhkcl9sZW4pOworCXNrYl9wdWxsKHNrYiwgQ0NNUF9IRFJfTEVOKTsKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gQ0NNUF9NSUNfTEVOKTsKKworCXJldHVybiBrZXlpZHg7Cit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfc2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICogc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpkYXRhID0gcHJpdjsKKwlpbnQga2V5aWR4OworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkYXRhLT50Zm07CisKKwlrZXlpZHggPSBkYXRhLT5rZXlfaWR4OworCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKKwlkYXRhLT5rZXlfaWR4ID0ga2V5aWR4OworCWRhdGEtPnRmbSA9IHRmbTsKKwlpZiAobGVuID09IENDTVBfVEtfTEVOKSB7CisJCW1lbWNweShkYXRhLT5rZXksIGtleSwgQ0NNUF9US19MRU4pOworCQlkYXRhLT5rZXlfc2V0ID0gMTsKKwkJaWYgKHNlcSkgeworCQkJZGF0YS0+cnhfcG5bMF0gPSBzZXFbNV07CisJCQlkYXRhLT5yeF9wblsxXSA9IHNlcVs0XTsKKwkJCWRhdGEtPnJ4X3BuWzJdID0gc2VxWzNdOworCQkJZGF0YS0+cnhfcG5bM10gPSBzZXFbMl07CisJCQlkYXRhLT5yeF9wbls0XSA9IHNlcVsxXTsKKwkJCWRhdGEtPnJ4X3BuWzVdID0gc2VxWzBdOworCQl9CisJCWNyeXB0b19jaXBoZXJfc2V0a2V5KGRhdGEtPnRmbSwgZGF0YS0+a2V5LCBDQ01QX1RLX0xFTik7CisJfSBlbHNlIGlmIChsZW4gPT0gMCkKKwkJZGF0YS0+a2V5X3NldCA9IDA7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9nZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKiBzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmRhdGEgPSBwcml2OworCisJaWYgKGxlbiA8IENDTVBfVEtfTEVOKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIWRhdGEtPmtleV9zZXQpCisJCXJldHVybiAwOworCW1lbWNweShrZXksIGRhdGEtPmtleSwgQ0NNUF9US19MRU4pOworCisJaWYgKHNlcSkgeworCQlzZXFbMF0gPSBkYXRhLT50eF9wbls1XTsKKwkJc2VxWzFdID0gZGF0YS0+dHhfcG5bNF07CisJCXNlcVsyXSA9IGRhdGEtPnR4X3BuWzNdOworCQlzZXFbM10gPSBkYXRhLT50eF9wblsyXTsKKwkJc2VxWzRdID0gZGF0YS0+dHhfcG5bMV07CisJCXNlcVs1XSA9IGRhdGEtPnR4X3BuWzBdOworCX0KKworCXJldHVybiBDQ01QX1RLX0xFTjsKK30KKworc3RhdGljIGNoYXIgKmllZWU4MDIxMV9jY21wX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmNjbXAgPSBwcml2OworCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9Q0NNUCBrZXlfc2V0PSVkICIKKwkJICAgICAidHhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAicnhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAiZm9ybWF0X2Vycm9ycz0lZCByZXBsYXlzPSVkIGRlY3J5cHRfZXJyb3JzPSVkXG4iLAorCQkgICAgIGNjbXAtPmtleV9pZHgsIGNjbXAtPmtleV9zZXQsCisJCSAgICAgTUFDX0FSRyhjY21wLT50eF9wbiksIE1BQ19BUkcoY2NtcC0+cnhfcG4pLAorCQkgICAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycywKKwkJICAgICBjY21wLT5kb3QxMVJTTkFTdGF0c0NDTVBSZXBsYXlzLAorCQkgICAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUERlY3J5cHRFcnJvcnMpOworCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X2NjbXAgPSB7CisJLm5hbWUJCQk9ICJDQ01QIiwKKwkuaW5pdAkJCT0gaWVlZTgwMjExX2NjbXBfaW5pdCwKKwkuZGVpbml0CQkJPSBpZWVlODAyMTFfY2NtcF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfY2NtcF9lbmNyeXB0LAorCS5kZWNyeXB0X21wZHUJCT0gaWVlZTgwMjExX2NjbXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IGllZWU4MDIxMV9jY21wX3NldF9rZXksCisJLmdldF9rZXkJCT0gaWVlZTgwMjExX2NjbXBfZ2V0X2tleSwKKwkucHJpbnRfc3RhdHMJCT0gaWVlZTgwMjExX2NjbXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSBDQ01QX0hEUl9MRU4sCisJLmV4dHJhX3Bvc3RmaXhfbGVuCT0gQ0NNUF9NSUNfTEVOLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpZWVlODAyMTFfY3J5cHRvX2NjbXBfaW5pdCh2b2lkKQoreworCXJldHVybiBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X2NjbXApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWVlZTgwMjExX2NyeXB0b19jY21wX2V4aXQodm9pZCkKK3sKKwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfY2NtcCk7Cit9CisKK21vZHVsZV9pbml0KGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KTsKK21vZHVsZV9leGl0KGllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KTsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGY5MTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICogSG9zdCBBUCBjcnlwdDogaG9zdC1iYXNlZCBUS0lQIGVuY3J5cHRpb24gaW1wbGVtZW50YXRpb24gZm9yIEhvc3QgQVAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKworI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KKworI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKK01PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSG9zdCBBUCBjcnlwdDogVEtJUCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSB7CisjZGVmaW5lIFRLSVBfS0VZX0xFTiAzMgorCXU4IGtleVtUS0lQX0tFWV9MRU5dOworCWludCBrZXlfc2V0OworCisJdTMyIHR4X2l2MzI7CisJdTE2IHR4X2l2MTY7CisJdTE2IHR4X3R0YWtbNV07CisJaW50IHR4X3BoYXNlMV9kb25lOworCisJdTMyIHJ4X2l2MzI7CisJdTE2IHJ4X2l2MTY7CisJdTE2IHJ4X3R0YWtbNV07CisJaW50IHJ4X3BoYXNlMV9kb25lOworCXUzMiByeF9pdjMyX25ldzsKKwl1MTYgcnhfaXYxNl9uZXc7CisKKwl1MzIgZG90MTFSU05BU3RhdHNUS0lQUmVwbGF5czsKKwl1MzIgZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzOworCXUzMiBkb3QxMVJTTkFTdGF0c1RLSVBMb2NhbE1JQ0ZhaWx1cmVzOworCisJaW50IGtleV9pZHg7CisKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtX2FyYzQ7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbV9taWNoYWVsOworCisJLyogc2NyYXRjaCBidWZmZXJzIGZvciB2aXJ0X3RvX3BhZ2UoKSAoY3J5cHRvIEFQSSkgKi8KKwl1OCByeF9oZHJbMTZdLCB0eF9oZHJbMTZdOworfTsKKworc3RhdGljIHZvaWQgKmllZWU4MDIxMV90a2lwX2luaXQoaW50IGtleV9pZHgpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnByaXY7CisKKwlwcml2ID0ga21hbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAocHJpdiA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCXByaXYtPmtleV9pZHggPSBrZXlfaWR4OworCisJcHJpdi0+dGZtX2FyYzQgPSBjcnlwdG9fYWxsb2NfdGZtKCJhcmM0IiwgMCk7CisJaWYgKHByaXYtPnRmbV9hcmM0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwcml2LT50Zm1fbWljaGFlbCA9IGNyeXB0b19hbGxvY190Zm0oIm1pY2hhZWxfbWljIiwgMCk7CisJaWYgKHByaXYtPnRmbV9taWNoYWVsID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgbWljaGFlbF9taWNcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIHByaXY7CisKKyAgICAgIGZhaWw6CisJaWYgKHByaXYpIHsKKwkJaWYgKHByaXYtPnRmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnRmbV9taWNoYWVsKTsKKwkJaWYgKHByaXYtPnRmbV9hcmM0KQorCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnRmbV9hcmM0KTsKKwkJa2ZyZWUocHJpdik7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV90a2lwX2RlaW5pdCh2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICpfcHJpdiA9IHByaXY7CisJaWYgKF9wcml2ICYmIF9wcml2LT50Zm1fbWljaGFlbCkKKwkJY3J5cHRvX2ZyZWVfdGZtKF9wcml2LT50Zm1fbWljaGFlbCk7CisJaWYgKF9wcml2ICYmIF9wcml2LT50Zm1fYXJjNCkKKwkJY3J5cHRvX2ZyZWVfdGZtKF9wcml2LT50Zm1fYXJjNCk7CisJa2ZyZWUocHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IFJvdFIxKHUxNiB2YWwpCit7CisJcmV0dXJuICh2YWwgPj4gMSkgfCAodmFsIDw8IDE1KTsKK30KKworc3RhdGljIGlubGluZSB1OCBMbzgodTE2IHZhbCkKK3sKKwlyZXR1cm4gdmFsICYgMHhmZjsKK30KKworc3RhdGljIGlubGluZSB1OCBIaTgodTE2IHZhbCkKK3sKKwlyZXR1cm4gdmFsID4+IDg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IExvMTYodTMyIHZhbCkKK3sKKwlyZXR1cm4gdmFsICYgMHhmZmZmOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBIaTE2KHUzMiB2YWwpCit7CisJcmV0dXJuIHZhbCA+PiAxNjsKK30KKworc3RhdGljIGlubGluZSB1MTYgTWsxNih1OCBoaSwgdTggbG8pCit7CisJcmV0dXJuIGxvIHwgKCgodTE2KSBoaSkgPDwgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IE1rMTZfbGUodTE2ICogdikKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoKnYpOworfQorCitzdGF0aWMgY29uc3QgdTE2IFNib3hbMjU2XSA9IHsKKwkweEM2QTUsIDB4Rjg4NCwgMHhFRTk5LCAweEY2OEQsIDB4RkYwRCwgMHhENkJELCAweERFQjEsIDB4OTE1NCwKKwkweDYwNTAsIDB4MDIwMywgMHhDRUE5LCAweDU2N0QsIDB4RTcxOSwgMHhCNTYyLCAweDRERTYsIDB4RUM5QSwKKwkweDhGNDUsIDB4MUY5RCwgMHg4OTQwLCAweEZBODcsIDB4RUYxNSwgMHhCMkVCLCAweDhFQzksIDB4RkIwQiwKKwkweDQxRUMsIDB4QjM2NywgMHg1RkZELCAweDQ1RUEsIDB4MjNCRiwgMHg1M0Y3LCAweEU0OTYsIDB4OUI1QiwKKwkweDc1QzIsIDB4RTExQywgMHgzREFFLCAweDRDNkEsIDB4NkM1QSwgMHg3RTQxLCAweEY1MDIsIDB4ODM0RiwKKwkweDY4NUMsIDB4NTFGNCwgMHhEMTM0LCAweEY5MDgsIDB4RTI5MywgMHhBQjczLCAweDYyNTMsIDB4MkEzRiwKKwkweDA4MEMsIDB4OTU1MiwgMHg0NjY1LCAweDlENUUsIDB4MzAyOCwgMHgzN0ExLCAweDBBMEYsIDB4MkZCNSwKKwkweDBFMDksIDB4MjQzNiwgMHgxQjlCLCAweERGM0QsIDB4Q0QyNiwgMHg0RTY5LCAweDdGQ0QsIDB4RUE5RiwKKwkweDEyMUIsIDB4MUQ5RSwgMHg1ODc0LCAweDM0MkUsIDB4MzYyRCwgMHhEQ0IyLCAweEI0RUUsIDB4NUJGQiwKKwkweEE0RjYsIDB4NzY0RCwgMHhCNzYxLCAweDdEQ0UsIDB4NTI3QiwgMHhERDNFLCAweDVFNzEsIDB4MTM5NywKKwkweEE2RjUsIDB4Qjk2OCwgMHgwMDAwLCAweEMxMkMsIDB4NDA2MCwgMHhFMzFGLCAweDc5QzgsIDB4QjZFRCwKKwkweEQ0QkUsIDB4OEQ0NiwgMHg2N0Q5LCAweDcyNEIsIDB4OTRERSwgMHg5OEQ0LCAweEIwRTgsIDB4ODU0QSwKKwkweEJCNkIsIDB4QzUyQSwgMHg0RkU1LCAweEVEMTYsIDB4ODZDNSwgMHg5QUQ3LCAweDY2NTUsIDB4MTE5NCwKKwkweDhBQ0YsIDB4RTkxMCwgMHgwNDA2LCAweEZFODEsIDB4QTBGMCwgMHg3ODQ0LCAweDI1QkEsIDB4NEJFMywKKwkweEEyRjMsIDB4NURGRSwgMHg4MEMwLCAweDA1OEEsIDB4M0ZBRCwgMHgyMUJDLCAweDcwNDgsIDB4RjEwNCwKKwkweDYzREYsIDB4NzdDMSwgMHhBRjc1LCAweDQyNjMsIDB4MjAzMCwgMHhFNTFBLCAweEZEMEUsIDB4QkY2RCwKKwkweDgxNEMsIDB4MTgxNCwgMHgyNjM1LCAweEMzMkYsIDB4QkVFMSwgMHgzNUEyLCAweDg4Q0MsIDB4MkUzOSwKKwkweDkzNTcsIDB4NTVGMiwgMHhGQzgyLCAweDdBNDcsIDB4QzhBQywgMHhCQUU3LCAweDMyMkIsIDB4RTY5NSwKKwkweEMwQTAsIDB4MTk5OCwgMHg5RUQxLCAweEEzN0YsIDB4NDQ2NiwgMHg1NDdFLCAweDNCQUIsIDB4MEI4MywKKwkweDhDQ0EsIDB4QzcyOSwgMHg2QkQzLCAweDI4M0MsIDB4QTc3OSwgMHhCQ0UyLCAweDE2MUQsIDB4QUQ3NiwKKwkweERCM0IsIDB4NjQ1NiwgMHg3NDRFLCAweDE0MUUsIDB4OTJEQiwgMHgwQzBBLCAweDQ4NkMsIDB4QjhFNCwKKwkweDlGNUQsIDB4QkQ2RSwgMHg0M0VGLCAweEM0QTYsIDB4MzlBOCwgMHgzMUE0LCAweEQzMzcsIDB4RjI4QiwKKwkweEQ1MzIsIDB4OEI0MywgMHg2RTU5LCAweERBQjcsIDB4MDE4QywgMHhCMTY0LCAweDlDRDIsIDB4NDlFMCwKKwkweEQ4QjQsIDB4QUNGQSwgMHhGMzA3LCAweENGMjUsIDB4Q0FBRiwgMHhGNDhFLCAweDQ3RTksIDB4MTAxOCwKKwkweDZGRDUsIDB4RjA4OCwgMHg0QTZGLCAweDVDNzIsIDB4MzgyNCwgMHg1N0YxLCAweDczQzcsIDB4OTc1MSwKKwkweENCMjMsIDB4QTE3QywgMHhFODlDLCAweDNFMjEsIDB4OTZERCwgMHg2MURDLCAweDBEODYsIDB4MEY4NSwKKwkweEUwOTAsIDB4N0M0MiwgMHg3MUM0LCAweENDQUEsIDB4OTBEOCwgMHgwNjA1LCAweEY3MDEsIDB4MUMxMiwKKwkweEMyQTMsIDB4NkE1RiwgMHhBRUY5LCAweDY5RDAsIDB4MTc5MSwgMHg5OTU4LCAweDNBMjcsIDB4MjdCOSwKKwkweEQ5MzgsIDB4RUIxMywgMHgyQkIzLCAweDIyMzMsIDB4RDJCQiwgMHhBOTcwLCAweDA3ODksIDB4MzNBNywKKwkweDJEQjYsIDB4M0MyMiwgMHgxNTkyLCAweEM5MjAsIDB4ODc0OSwgMHhBQUZGLCAweDUwNzgsIDB4QTU3QSwKKwkweDAzOEYsIDB4NTlGOCwgMHgwOTgwLCAweDFBMTcsIDB4NjVEQSwgMHhENzMxLCAweDg0QzYsIDB4RDBCOCwKKwkweDgyQzMsIDB4MjlCMCwgMHg1QTc3LCAweDFFMTEsIDB4N0JDQiwgMHhBOEZDLCAweDZERDYsIDB4MkMzQSwKK307CisKK3N0YXRpYyBpbmxpbmUgdTE2IF9TXyh1MTYgdikKK3sKKwl1MTYgdCA9IFNib3hbSGk4KHYpXTsKKwlyZXR1cm4gU2JveFtMbzgodildIF4gKCh0IDw8IDgpIHwgKHQgPj4gOCkpOworfQorCisjZGVmaW5lIFBIQVNFMV9MT09QX0NPVU5UIDgKKworc3RhdGljIHZvaWQgdGtpcF9taXhpbmdfcGhhc2UxKHUxNiAqIFRUQUssIGNvbnN0IHU4ICogVEssIGNvbnN0IHU4ICogVEEsCisJCQkgICAgICAgdTMyIElWMzIpCit7CisJaW50IGksIGo7CisKKwkvKiBJbml0aWFsaXplIHRoZSA4MC1iaXQgVFRBSyBmcm9tIFRTQyAoSVYzMikgYW5kIFRBWzAuLjVdICovCisJVFRBS1swXSA9IExvMTYoSVYzMik7CisJVFRBS1sxXSA9IEhpMTYoSVYzMik7CisJVFRBS1syXSA9IE1rMTYoVEFbMV0sIFRBWzBdKTsKKwlUVEFLWzNdID0gTWsxNihUQVszXSwgVEFbMl0pOworCVRUQUtbNF0gPSBNazE2KFRBWzVdLCBUQVs0XSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEhBU0UxX0xPT1BfQ09VTlQ7IGkrKykgeworCQlqID0gMiAqIChpICYgMSk7CisJCVRUQUtbMF0gKz0gX1NfKFRUQUtbNF0gXiBNazE2KFRLWzEgKyBqXSwgVEtbMCArIGpdKSk7CisJCVRUQUtbMV0gKz0gX1NfKFRUQUtbMF0gXiBNazE2KFRLWzUgKyBqXSwgVEtbNCArIGpdKSk7CisJCVRUQUtbMl0gKz0gX1NfKFRUQUtbMV0gXiBNazE2KFRLWzkgKyBqXSwgVEtbOCArIGpdKSk7CisJCVRUQUtbM10gKz0gX1NfKFRUQUtbMl0gXiBNazE2KFRLWzEzICsgal0sIFRLWzEyICsgal0pKTsKKwkJVFRBS1s0XSArPSBfU18oVFRBS1szXSBeIE1rMTYoVEtbMSArIGpdLCBUS1swICsgal0pKSArIGk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0a2lwX21peGluZ19waGFzZTIodTggKiBXRVBTZWVkLCBjb25zdCB1OCAqIFRLLCBjb25zdCB1MTYgKiBUVEFLLAorCQkJICAgICAgIHUxNiBJVjE2KQoreworCS8qIE1ha2UgdGVtcG9yYXJ5IGFyZWEgb3ZlcmxhcCBXRVAgc2VlZCBzbyB0aGF0IHRoZSBmaW5hbCBjb3B5IGNhbiBiZQorCSAqIGF2b2lkZWQgb24gbGl0dGxlIGVuZGlhbiBob3N0cy4gKi8KKwl1MTYgKlBQSyA9ICh1MTYgKikgJiBXRVBTZWVkWzRdOworCisJLyogU3RlcCAxIC0gbWFrZSBjb3B5IG9mIFRUQUsgYW5kIGJyaW5nIGluIFRTQyAqLworCVBQS1swXSA9IFRUQUtbMF07CisJUFBLWzFdID0gVFRBS1sxXTsKKwlQUEtbMl0gPSBUVEFLWzJdOworCVBQS1szXSA9IFRUQUtbM107CisJUFBLWzRdID0gVFRBS1s0XTsKKwlQUEtbNV0gPSBUVEFLWzRdICsgSVYxNjsKKworCS8qIFN0ZXAgMiAtIDk2LWJpdCBiaWplY3RpdmUgbWl4aW5nIHVzaW5nIFMtYm94ICovCisJUFBLWzBdICs9IF9TXyhQUEtbNV0gXiBNazE2X2xlKCh1MTYgKikgJiBUS1swXSkpOworCVBQS1sxXSArPSBfU18oUFBLWzBdIF4gTWsxNl9sZSgodTE2ICopICYgVEtbMl0pKTsKKwlQUEtbMl0gKz0gX1NfKFBQS1sxXSBeIE1rMTZfbGUoKHUxNiAqKSAmIFRLWzRdKSk7CisJUFBLWzNdICs9IF9TXyhQUEtbMl0gXiBNazE2X2xlKCh1MTYgKikgJiBUS1s2XSkpOworCVBQS1s0XSArPSBfU18oUFBLWzNdIF4gTWsxNl9sZSgodTE2ICopICYgVEtbOF0pKTsKKwlQUEtbNV0gKz0gX1NfKFBQS1s0XSBeIE1rMTZfbGUoKHUxNiAqKSAmIFRLWzEwXSkpOworCisJUFBLWzBdICs9IFJvdFIxKFBQS1s1XSBeIE1rMTZfbGUoKHUxNiAqKSAmIFRLWzEyXSkpOworCVBQS1sxXSArPSBSb3RSMShQUEtbMF0gXiBNazE2X2xlKCh1MTYgKikgJiBUS1sxNF0pKTsKKwlQUEtbMl0gKz0gUm90UjEoUFBLWzFdKTsKKwlQUEtbM10gKz0gUm90UjEoUFBLWzJdKTsKKwlQUEtbNF0gKz0gUm90UjEoUFBLWzNdKTsKKwlQUEtbNV0gKz0gUm90UjEoUFBLWzRdKTsKKworCS8qIFN0ZXAgMyAtIGJyaW5nIGluIGxhc3Qgb2YgVEsgYml0cywgYXNzaWduIDI0LWJpdCBXRVAgSVYgdmFsdWUKKwkgKiBXRVBTZWVkWzAuLjJdIGlzIHRyYW5zbWl0dGVkIGFzIFdFUCBJViAqLworCVdFUFNlZWRbMF0gPSBIaTgoSVYxNik7CisJV0VQU2VlZFsxXSA9IChIaTgoSVYxNikgfCAweDIwKSAmIDB4N0Y7CisJV0VQU2VlZFsyXSA9IExvOChJVjE2KTsKKwlXRVBTZWVkWzNdID0gTG84KChQUEtbNV0gXiBNazE2X2xlKCh1MTYgKikgJiBUS1swXSkpID4+IDEpOworCisjaWZkZWYgX19CSUdfRU5ESUFOCisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCVBQS1tpXSA9IChQUEtbaV0gPDwgOCkgfCAoUFBLW2ldID4+IDgpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworCWludCBsZW47CisJdTggcmM0a2V5WzE2XSwgKnBvcywgKmljdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXUzMiBjcmM7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgOCB8fCBza2JfdGFpbHJvb20oc2tiKSA8IDQgfHwKKwkgICAgc2tiLT5sZW4gPCBoZHJfbGVuKQorCQlyZXR1cm4gLTE7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJaWYgKCF0a2V5LT50eF9waGFzZTFfZG9uZSkgeworCQl0a2lwX21peGluZ19waGFzZTEodGtleS0+dHhfdHRhaywgdGtleS0+a2V5LCBoZHItPmFkZHIyLAorCQkJCSAgIHRrZXktPnR4X2l2MzIpOworCQl0a2V5LT50eF9waGFzZTFfZG9uZSA9IDE7CisJfQorCXRraXBfbWl4aW5nX3BoYXNlMihyYzRrZXksIHRrZXktPmtleSwgdGtleS0+dHhfdHRhaywgdGtleS0+dHhfaXYxNik7CisKKwlsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CisJcG9zID0gc2tiX3B1c2goc2tiLCA4KTsKKwltZW1tb3ZlKHBvcywgcG9zICsgOCwgaGRyX2xlbik7CisJcG9zICs9IGhkcl9sZW47CisJaWN2ID0gc2tiX3B1dChza2IsIDQpOworCisJKnBvcysrID0gcmM0a2V5WzBdOworCSpwb3MrKyA9IHJjNGtleVsxXTsKKwkqcG9zKysgPSByYzRrZXlbMl07CisJKnBvcysrID0gKHRrZXktPmtleV9pZHggPDwgNikgfCAoMSA8PCA1KSAvKiBFeHQgSVYgaW5jbHVkZWQgKi8gOworCSpwb3MrKyA9IHRrZXktPnR4X2l2MzIgJiAweGZmOworCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDgpICYgMHhmZjsKKwkqcG9zKysgPSAodGtleS0+dHhfaXYzMiA+PiAxNikgJiAweGZmOworCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDI0KSAmIDB4ZmY7CisKKwljcmMgPSB+Y3JjMzJfbGUofjAsIHBvcywgbGVuKTsKKwlpY3ZbMF0gPSBjcmM7CisJaWN2WzFdID0gY3JjID4+IDg7CisJaWN2WzJdID0gY3JjID4+IDE2OworCWljdlszXSA9IGNyYyA+PiAyNDsKKworCWNyeXB0b19jaXBoZXJfc2V0a2V5KHRrZXktPnRmbV9hcmM0LCByYzRrZXksIDE2KTsKKwlzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7CisJc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKKwlzZy5sZW5ndGggPSBsZW4gKyA0OworCWNyeXB0b19jaXBoZXJfZW5jcnlwdCh0a2V5LT50Zm1fYXJjNCwgJnNnLCAmc2csIGxlbiArIDQpOworCisJdGtleS0+dHhfaXYxNisrOworCWlmICh0a2V5LT50eF9pdjE2ID09IDApIHsKKwkJdGtleS0+dHhfcGhhc2UxX2RvbmUgPSAwOworCQl0a2V5LT50eF9pdjMyKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3RraXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJdTggcmM0a2V5WzE2XTsKKwl1OCBrZXlpZHgsICpwb3M7CisJdTMyIGl2MzI7CisJdTE2IGl2MTY7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwl1OCBpY3ZbNF07CisJdTMyIGNyYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisJaW50IHBsZW47CisKKwlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgOCArIDQpCisJCXJldHVybiAtMTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJfbGVuOworCWtleWlkeCA9IHBvc1szXTsKKwlpZiAoIShrZXlpZHggJiAoMSA8PCA1KSkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlY2VpdmVkIHBhY2tldCB3aXRob3V0IEV4dElWIgorCQkJICAgICAgICIgZmxhZyBmcm9tICIgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQlyZXR1cm4gLTI7CisJfQorCWtleWlkeCA+Pj0gNjsKKwlpZiAodGtleS0+a2V5X2lkeCAhPSBrZXlpZHgpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IFJYIHRrZXktPmtleV9pZHg9JWQgZnJhbWUgIgorCQkgICAgICAgImtleWlkeD0lZCBwcml2PSVwXG4iLCB0a2V5LT5rZXlfaWR4LCBrZXlpZHgsIHByaXYpOworCQlyZXR1cm4gLTY7CisJfQorCWlmICghdGtleS0+a2V5X3NldCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogcmVjZWl2ZWQgcGFja2V0IGZyb20gIiBNQUNfRk1UCisJCQkgICAgICAgIiB3aXRoIGtleWlkPSVkIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNvbmZpZ3VyZWQiCisJCQkgICAgICAgIiBrZXlcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMiksIGtleWlkeCk7CisJCX0KKwkJcmV0dXJuIC0zOworCX0KKwlpdjE2ID0gKHBvc1swXSA8PCA4KSB8IHBvc1syXTsKKwlpdjMyID0gcG9zWzRdIHwgKHBvc1s1XSA8PCA4KSB8IChwb3NbNl0gPDwgMTYpIHwgKHBvc1s3XSA8PCAyNCk7CisJcG9zICs9IDg7CisKKwlpZiAoaXYzMiA8IHRrZXktPnJ4X2l2MzIgfHwKKwkgICAgKGl2MzIgPT0gdGtleS0+cnhfaXYzMiAmJiBpdjE2IDw9IHRrZXktPnJ4X2l2MTYpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiByZXBsYXkgZGV0ZWN0ZWQ6IFNUQT0iIE1BQ19GTVQKKwkJCSAgICAgICAiIHByZXZpb3VzIFRTQyAlMDh4JTA0eCByZWNlaXZlZCBUU0MgIgorCQkJICAgICAgICIlMDh4JTA0eFxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwKKwkJCSAgICAgICB0a2V5LT5yeF9pdjMyLCB0a2V5LT5yeF9pdjE2LCBpdjMyLCBpdjE2KTsKKwkJfQorCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBSZXBsYXlzKys7CisJCXJldHVybiAtNDsKKwl9CisKKwlpZiAoaXYzMiAhPSB0a2V5LT5yeF9pdjMyIHx8ICF0a2V5LT5yeF9waGFzZTFfZG9uZSkgeworCQl0a2lwX21peGluZ19waGFzZTEodGtleS0+cnhfdHRhaywgdGtleS0+a2V5LCBoZHItPmFkZHIyLCBpdjMyKTsKKwkJdGtleS0+cnhfcGhhc2UxX2RvbmUgPSAxOworCX0KKwl0a2lwX21peGluZ19waGFzZTIocmM0a2V5LCB0a2V5LT5rZXksIHRrZXktPnJ4X3R0YWssIGl2MTYpOworCisJcGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbiAtIDEyOworCisJY3J5cHRvX2NpcGhlcl9zZXRrZXkodGtleS0+dGZtX2FyYzQsIHJjNGtleSwgMTYpOworCXNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKKwlzZy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwb3MpOworCXNnLmxlbmd0aCA9IHBsZW4gKyA0OworCWNyeXB0b19jaXBoZXJfZGVjcnlwdCh0a2V5LT50Zm1fYXJjNCwgJnNnLCAmc2csIHBsZW4gKyA0KTsKKworCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBwbGVuKTsKKwlpY3ZbMF0gPSBjcmM7CisJaWN2WzFdID0gY3JjID4+IDg7CisJaWN2WzJdID0gY3JjID4+IDE2OworCWljdlszXSA9IGNyYyA+PiAyNDsKKwlpZiAobWVtY21wKGljdiwgcG9zICsgcGxlbiwgNCkgIT0gMCkgeworCQlpZiAoaXYzMiAhPSB0a2V5LT5yeF9pdjMyKSB7CisJCQkvKiBQcmV2aW91c2x5IGNhY2hlZCBQaGFzZTEgcmVzdWx0IHdhcyBhbHJlYWR5IGxvc3QsIHNvCisJCQkgKiBpdCBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQgZm9yIHRoZSBuZXh0IHBhY2tldC4gKi8KKwkJCXRrZXktPnJ4X3BoYXNlMV9kb25lID0gMDsKKwkJfQorCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogSUNWIGVycm9yIGRldGVjdGVkOiBTVEE9IgorCQkJICAgICAgIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJdGtleS0+ZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzKys7CisJCXJldHVybiAtNTsKKwl9CisKKwkvKiBVcGRhdGUgcmVhbCBjb3VudGVycyBvbmx5IGFmdGVyIE1pY2hhZWwgTUlDIHZlcmlmaWNhdGlvbiBoYXMKKwkgKiBjb21wbGV0ZWQgKi8KKwl0a2V5LT5yeF9pdjMyX25ldyA9IGl2MzI7CisJdGtleS0+cnhfaXYxNl9uZXcgPSBpdjE2OworCisJLyogUmVtb3ZlIElWIGFuZCBJQ1YgKi8KKwltZW1tb3ZlKHNrYi0+ZGF0YSArIDgsIHNrYi0+ZGF0YSwgaGRyX2xlbik7CisJc2tiX3B1bGwoc2tiLCA4KTsKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNCk7CisKKwlyZXR1cm4ga2V5aWR4OworfQorCitzdGF0aWMgaW50IG1pY2hhZWxfbWljKHN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5LCB1OCAqIGtleSwgdTggKiBoZHIsCisJCSAgICAgICB1OCAqIGRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKiBtaWMpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzJdOworCisJaWYgKHRrZXktPnRmbV9taWNoYWVsID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWljaGFlbF9taWM6IHRmbV9taWNoYWVsID09IE5VTExcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXNnWzBdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoaGRyKTsKKwlzZ1swXS5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShoZHIpOworCXNnWzBdLmxlbmd0aCA9IDE2OworCisJc2dbMV0ucGFnZSA9IHZpcnRfdG9fcGFnZShkYXRhKTsKKwlzZ1sxXS5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShkYXRhKTsKKwlzZ1sxXS5sZW5ndGggPSBkYXRhX2xlbjsKKworCWNyeXB0b19kaWdlc3RfaW5pdCh0a2V5LT50Zm1fbWljaGFlbCk7CisJY3J5cHRvX2RpZ2VzdF9zZXRrZXkodGtleS0+dGZtX21pY2hhZWwsIGtleSwgOCk7CisJY3J5cHRvX2RpZ2VzdF91cGRhdGUodGtleS0+dGZtX21pY2hhZWwsIHNnLCAyKTsKKwljcnlwdG9fZGlnZXN0X2ZpbmFsKHRrZXktPnRmbV9taWNoYWVsLCBtaWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1pY2hhZWxfbWljX2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqIGhkcikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyMTE7CisKKwloZHIxMSA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwlzd2l0Y2ggKGxlMTZfdG9fY3B1KGhkcjExLT5mcmFtZV9jdGwpICYKKwkJKElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFMpKSB7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9UT0RTOgorCQltZW1jcHkoaGRyLCBoZHIxMS0+YWRkcjMsIEVUSF9BTEVOKTsJLyogREEgKi8KKwkJbWVtY3B5KGhkciArIEVUSF9BTEVOLCBoZHIxMS0+YWRkcjIsIEVUSF9BTEVOKTsJLyogU0EgKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFM6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMSwgRVRIX0FMRU4pOwkvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOwkvKiBTQSAqLworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOwkvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyNCwgRVRIX0FMRU4pOwkvKiBTQSAqLworCQlicmVhazsKKwljYXNlIDA6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMSwgRVRIX0FMRU4pOwkvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMiwgRVRIX0FMRU4pOwkvKiBTQSAqLworCQlicmVhazsKKwl9CisKKwloZHJbMTJdID0gMDsJCS8qIHByaW9yaXR5ICovCisJaGRyWzEzXSA9IGhkclsxNF0gPSBoZHJbMTVdID0gMDsJLyogcmVzZXJ2ZWQgKi8KK30KKworc3RhdGljIGludCBpZWVlODAyMTFfbWljaGFlbF9taWNfYWRkKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLAorCQkJCSAgICAgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJdTggKnBvczsKKworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IDggfHwgc2tiLT5sZW4gPCBoZHJfbGVuKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJJbnZhbGlkIHBhY2tldCBmb3IgTWljaGFlbCBNSUMgYWRkICIKKwkJICAgICAgICIodGFpbHJvb209JWQgaGRyX2xlbj0lZCBza2ItPmxlbj0lZClcbiIsCisJCSAgICAgICBza2JfdGFpbHJvb20oc2tiKSwgaGRyX2xlbiwgc2tiLT5sZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJbWljaGFlbF9taWNfaGRyKHNrYiwgdGtleS0+dHhfaGRyKTsKKwlwb3MgPSBza2JfcHV0KHNrYiwgOCk7CisJaWYgKG1pY2hhZWxfbWljKHRrZXksICZ0a2V5LT5rZXlbMTZdLCB0a2V5LT50eF9oZHIsCisJCQlza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBwb3MpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxOAorc3RhdGljIHZvaWQgaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCBpbnQga2V5aWR4KQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlzdHJ1Y3QgaXdfbWljaGFlbG1pY2ZhaWx1cmUgZXY7CisKKwkvKiBUT0RPOiBuZWVkZWQgcGFyYW1ldGVyczogY291bnQsIGtleWlkLCBrZXkgdHlwZSwgVFNDICovCisJbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7CisJZXYuZmxhZ3MgPSBrZXlpZHggJiBJV19NSUNGQUlMVVJFX0tFWV9JRDsKKwlpZiAoaGRyLT5hZGRyMVswXSAmIDB4MDEpCisJCWV2LmZsYWdzIHw9IElXX01JQ0ZBSUxVUkVfR1JPVVA7CisJZWxzZQorCQlldi5mbGFncyB8PSBJV19NSUNGQUlMVVJFX1BBSVJXSVNFOworCWV2LnNyY19hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwltZW1jcHkoZXYuc3JjX2FkZHIuc2FfZGF0YSwgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwl3cnF1LmRhdGEubGVuZ3RoID0gc2l6ZW9mKGV2KTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVk1JQ0hBRUxNSUNGQUlMVVJFLCAmd3JxdSwgKGNoYXIgKikmZXYpOworfQorI2VsaWYgV0lSRUxFU1NfRVhUID49IDE1CitzdGF0aWMgdm9pZCBpZWVlODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsIGludCBrZXlpZHgpCit7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWNoYXIgYnVmWzEyOF07CisKKwkvKiBUT0RPOiBuZWVkZWQgcGFyYW1ldGVyczogY291bnQsIGtleWlkLCBrZXkgdHlwZSwgVFNDICovCisJc3ByaW50ZihidWYsICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24oa2V5aWQ9JWQgJXNjYXN0IGFkZHI9IgorCQlNQUNfRk1UICIpIiwga2V5aWR4LCBoZHItPmFkZHIxWzBdICYgMHgwMSA/ICJicm9hZCIgOiAidW5pIiwKKwkJTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1Zik7Cit9CisjZWxzZQkJCQkvKiBXSVJFTEVTU19FWFQgPj0gMTUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkJCQkgaW50IGtleWlkeCkKK3sKK30KKyNlbmRpZgkJCQkvKiBXSVJFTEVTU19FWFQgPj0gMTUgKi8KKworc3RhdGljIGludCBpZWVlODAyMTFfbWljaGFlbF9taWNfdmVyaWZ5KHN0cnVjdCBza19idWZmICpza2IsIGludCBrZXlpZHgsCisJCQkJCWludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwl1OCBtaWNbOF07CisKKwlpZiAoIXRrZXktPmtleV9zZXQpCisJCXJldHVybiAtMTsKKworCW1pY2hhZWxfbWljX2hkcihza2IsIHRrZXktPnJ4X2hkcik7CisJaWYgKG1pY2hhZWxfbWljKHRrZXksICZ0a2V5LT5rZXlbMjRdLCB0a2V5LT5yeF9oZHIsCisJCQlza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBtaWMpKQorCQlyZXR1cm4gLTE7CisJaWYgKG1lbWNtcChtaWMsIHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gOCwgOCkgIT0gMCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWljaGFlbCBNSUMgdmVyaWZpY2F0aW9uIGZhaWxlZCBmb3IgIgorCQkgICAgICAgIk1TRFUgZnJvbSAiIE1BQ19GTVQgIiBrZXlpZHg9JWRcbiIsCisJCSAgICAgICBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIk4vQSIsIE1BQ19BUkcoaGRyLT5hZGRyMiksCisJCSAgICAgICBrZXlpZHgpOworCQlpZiAoc2tiLT5kZXYpCisJCQlpZWVlODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZShza2ItPmRldiwgaGRyLCBrZXlpZHgpOworCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBMb2NhbE1JQ0ZhaWx1cmVzKys7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBVcGRhdGUgVFNDIGNvdW50ZXJzIGZvciBSWCBub3cgdGhhdCB0aGUgcGFja2V0IHZlcmlmaWNhdGlvbiBoYXMKKwkgKiBjb21wbGV0ZWQuICovCisJdGtleS0+cnhfaXYzMiA9IHRrZXktPnJ4X2l2MzJfbmV3OworCXRrZXktPnJ4X2l2MTYgPSB0a2V5LT5yeF9pdjE2X25ldzsKKworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqIHNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJaW50IGtleWlkeDsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gdGtleS0+dGZtX21pY2hhZWw7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTIgPSB0a2V5LT50Zm1fYXJjNDsKKworCWtleWlkeCA9IHRrZXktPmtleV9pZHg7CisJbWVtc2V0KHRrZXksIDAsIHNpemVvZigqdGtleSkpOworCXRrZXktPmtleV9pZHggPSBrZXlpZHg7CisJdGtleS0+dGZtX21pY2hhZWwgPSB0Zm07CisJdGtleS0+dGZtX2FyYzQgPSB0Zm0yOworCWlmIChsZW4gPT0gVEtJUF9LRVlfTEVOKSB7CisJCW1lbWNweSh0a2V5LT5rZXksIGtleSwgVEtJUF9LRVlfTEVOKTsKKwkJdGtleS0+a2V5X3NldCA9IDE7CisJCXRrZXktPnR4X2l2MTYgPSAxOwkvKiBUU0MgaXMgaW5pdGlhbGl6ZWQgdG8gMSAqLworCQlpZiAoc2VxKSB7CisJCQl0a2V5LT5yeF9pdjMyID0gKHNlcVs1XSA8PCAyNCkgfCAoc2VxWzRdIDw8IDE2KSB8CisJCQkgICAgKHNlcVszXSA8PCA4KSB8IHNlcVsyXTsKKwkJCXRrZXktPnJ4X2l2MTYgPSAoc2VxWzFdIDw8IDgpIHwgc2VxWzBdOworCQl9CisJfSBlbHNlIGlmIChsZW4gPT0gMCkKKwkJdGtleS0+a2V5X3NldCA9IDA7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9nZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKiBzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworCisJaWYgKGxlbiA8IFRLSVBfS0VZX0xFTikKKwkJcmV0dXJuIC0xOworCisJaWYgKCF0a2V5LT5rZXlfc2V0KQorCQlyZXR1cm4gMDsKKwltZW1jcHkoa2V5LCB0a2V5LT5rZXksIFRLSVBfS0VZX0xFTik7CisKKwlpZiAoc2VxKSB7CisJCS8qIFJldHVybiB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBsYXN0IHRyYW5zbWl0dGVkIGZyYW1lLiAqLworCQl1MTYgaXYxNiA9IHRrZXktPnR4X2l2MTY7CisJCXUzMiBpdjMyID0gdGtleS0+dHhfaXYzMjsKKwkJaWYgKGl2MTYgPT0gMCkKKwkJCWl2MzItLTsKKwkJaXYxNi0tOworCQlzZXFbMF0gPSB0a2V5LT50eF9pdjE2OworCQlzZXFbMV0gPSB0a2V5LT50eF9pdjE2ID4+IDg7CisJCXNlcVsyXSA9IHRrZXktPnR4X2l2MzI7CisJCXNlcVszXSA9IHRrZXktPnR4X2l2MzIgPj4gODsKKwkJc2VxWzRdID0gdGtleS0+dHhfaXYzMiA+PiAxNjsKKwkJc2VxWzVdID0gdGtleS0+dHhfaXYzMiA+PiAyNDsKKwl9CisKKwlyZXR1cm4gVEtJUF9LRVlfTEVOOworfQorCitzdGF0aWMgY2hhciAqaWVlZTgwMjExX3RraXBfcHJpbnRfc3RhdHMoY2hhciAqcCwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtpcCA9IHByaXY7CisJcCArPSBzcHJpbnRmKHAsICJrZXlbJWRdIGFsZz1US0lQIGtleV9zZXQ9JWQgIgorCQkgICAgICJ0eF9wbj0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkgICAgICJyeF9wbj0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkgICAgICJyZXBsYXlzPSVkIGljdl9lcnJvcnM9JWQgbG9jYWxfbWljX2ZhaWx1cmVzPSVkXG4iLAorCQkgICAgIHRraXAtPmtleV9pZHgsIHRraXAtPmtleV9zZXQsCisJCSAgICAgKHRraXAtPnR4X2l2MzIgPj4gMjQpICYgMHhmZiwKKwkJICAgICAodGtpcC0+dHhfaXYzMiA+PiAxNikgJiAweGZmLAorCQkgICAgICh0a2lwLT50eF9pdjMyID4+IDgpICYgMHhmZiwKKwkJICAgICB0a2lwLT50eF9pdjMyICYgMHhmZiwKKwkJICAgICAodGtpcC0+dHhfaXYxNiA+PiA4KSAmIDB4ZmYsCisJCSAgICAgdGtpcC0+dHhfaXYxNiAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnJ4X2l2MzIgPj4gMjQpICYgMHhmZiwKKwkJICAgICAodGtpcC0+cnhfaXYzMiA+PiAxNikgJiAweGZmLAorCQkgICAgICh0a2lwLT5yeF9pdjMyID4+IDgpICYgMHhmZiwKKwkJICAgICB0a2lwLT5yeF9pdjMyICYgMHhmZiwKKwkJICAgICAodGtpcC0+cnhfaXYxNiA+PiA4KSAmIDB4ZmYsCisJCSAgICAgdGtpcC0+cnhfaXYxNiAmIDB4ZmYsCisJCSAgICAgdGtpcC0+ZG90MTFSU05BU3RhdHNUS0lQUmVwbGF5cywKKwkJICAgICB0a2lwLT5kb3QxMVJTTkFTdGF0c1RLSVBJQ1ZFcnJvcnMsCisJCSAgICAgdGtpcC0+ZG90MTFSU05BU3RhdHNUS0lQTG9jYWxNSUNGYWlsdXJlcyk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3RraXAgPSB7CisJLm5hbWUJCQk9ICJUS0lQIiwKKwkuaW5pdAkJCT0gaWVlZTgwMjExX3RraXBfaW5pdCwKKwkuZGVpbml0CQkJPSBpZWVlODAyMTFfdGtpcF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfdGtpcF9lbmNyeXB0LAorCS5kZWNyeXB0X21wZHUJCT0gaWVlZTgwMjExX3RraXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IGllZWU4MDIxMV9taWNoYWVsX21pY19hZGQsCisJLmRlY3J5cHRfbXNkdQkJPSBpZWVlODAyMTFfbWljaGFlbF9taWNfdmVyaWZ5LAorCS5zZXRfa2V5CQk9IGllZWU4MDIxMV90a2lwX3NldF9rZXksCisJLmdldF9rZXkJCT0gaWVlZTgwMjExX3RraXBfZ2V0X2tleSwKKwkucHJpbnRfc3RhdHMJCT0gaWVlZTgwMjExX3RraXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSA0ICsgNCwJLyogSVYgKyBFeHRJViAqLworCS5leHRyYV9wb3N0Zml4X2xlbgk9IDggKyA0LAkvKiBNSUMgKyBJQ1YgKi8KKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF90a2lwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGllZWU4MDIxMV9jcnlwdG9fdGtpcF9leGl0KHZvaWQpCit7CisJaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3RraXApOworfQorCittb2R1bGVfaW5pdChpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCk7Cittb2R1bGVfZXhpdChpZWVlODAyMTFfY3J5cHRvX3RraXBfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDI1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHQ6IGhvc3QtYmFzZWQgV0VQIGVuY3J5cHRpb24gaW1wbGVtZW50YXRpb24gZm9yIEhvc3QgQVAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3QgQVAgY3J5cHQ6IFdFUCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhIHsKKwl1MzIgaXY7CisjZGVmaW5lIFdFUF9LRVlfTEVOIDEzCisJdTgga2V5W1dFUF9LRVlfTEVOICsgMV07CisJdTgga2V5X2xlbjsKKwl1OCBrZXlfaWR4OworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07Cit9OworCitzdGF0aWMgdm9pZCAqcHJpc20yX3dlcF9pbml0KGludCBrZXlpZHgpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqcHJpdjsKKworCXByaXYgPSBrbWFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9BVE9NSUMpOworCWlmIChwcml2ID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CisJcHJpdi0+a2V5X2lkeCA9IGtleWlkeDsKKworCXByaXYtPnRmbSA9IGNyeXB0b19hbGxvY190Zm0oImFyYzQiLCAwKTsKKwlpZiAocHJpdi0+dGZtID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF93ZXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIHN0YXJ0IFdFUCBJViBmcm9tIGEgcmFuZG9tIHZhbHVlICovCisJZ2V0X3JhbmRvbV9ieXRlcygmcHJpdi0+aXYsIDQpOworCisJcmV0dXJuIHByaXY7CisKKyAgICAgIGZhaWw6CisJaWYgKHByaXYpIHsKKwkJaWYgKHByaXYtPnRmbSkKKwkJCWNyeXB0b19mcmVlX3RmbShwcml2LT50Zm0pOworCQlrZnJlZShwcml2KTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHByaXNtMl93ZXBfZGVpbml0KHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqX3ByaXYgPSBwcml2OworCWlmIChfcHJpdiAmJiBfcHJpdi0+dGZtKQorCQljcnlwdG9fZnJlZV90Zm0oX3ByaXYtPnRmbSk7CisJa2ZyZWUocHJpdik7Cit9CisKKy8qIFBlcmZvcm0gV0VQIGVuY3J5cHRpb24gb24gZ2l2ZW4gc2tiIHRoYXQgaGFzIGF0IGxlYXN0IDQgYnl0ZXMgb2YgaGVhZHJvb20KKyAqIGZvciBJViBhbmQgNCBieXRlcyBvZiB0YWlscm9vbSBmb3IgSUNWLiBCb3RoIElWIGFuZCBJQ1Ygd2lsbCBiZSB0cmFuc21pdHRlZCwKKyAqIHNvIHRoZSBwYXlsb2FkIGxlbmd0aCBpbmNyZWFzZXMgd2l0aCA4IGJ5dGVzLgorICoKKyAqIFdFUCBmcmFtZSBwYXlsb2FkOiBJViArIFRYIGtleSBpZHgsIFJDNChkYXRhKSwgSUNWID0gUkM0KENSQzMyKGRhdGEpKQorICovCitzdGF0aWMgaW50IHByaXNtMl93ZXBfZW5jcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworCXUzMiBjcmMsIGtsZW4sIGxlbjsKKwl1OCBrZXlbV0VQX0tFWV9MRU4gKyAzXTsKKwl1OCAqcG9zLCAqaWN2OworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IDQgfHwgc2tiX3RhaWxyb29tKHNrYikgPCA0IHx8CisJICAgIHNrYi0+bGVuIDwgaGRyX2xlbikKKwkJcmV0dXJuIC0xOworCisJbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOworCXBvcyA9IHNrYl9wdXNoKHNrYiwgNCk7CisJbWVtbW92ZShwb3MsIHBvcyArIDQsIGhkcl9sZW4pOworCXBvcyArPSBoZHJfbGVuOworCisJa2xlbiA9IDMgKyB3ZXAtPmtleV9sZW47CisKKwl3ZXAtPml2Kys7CisKKwkvKiBGbHVocmVyLCBNYW50aW4sIGFuZCBTaGFtaXIgaGF2ZSByZXBvcnRlZCB3ZWFrbmVzc2VzIGluIHRoZSBrZXkKKwkgKiBzY2hlZHVsaW5nIGFsZ29yaXRobSBvZiBSQzQuIEF0IGxlYXN0IElWcyAoS2V5Qnl0ZSArIDMsIDB4ZmYsIE4pCisJICogY2FuIGJlIHVzZWQgdG8gc3BlZWR1cCBhdHRhY2tzLCBzbyBhdm9pZCB1c2luZyB0aGVtLiAqLworCWlmICgod2VwLT5pdiAmIDB4ZmYwMCkgPT0gMHhmZjAwKSB7CisJCXU4IEIgPSAod2VwLT5pdiA+PiAxNikgJiAweGZmOworCQlpZiAoQiA+PSAzICYmIEIgPCBrbGVuKQorCQkJd2VwLT5pdiArPSAweDAxMDA7CisJfQorCisJLyogUHJlcGVuZCAyNC1iaXQgSVYgdG8gUkM0IGtleSBhbmQgVFggZnJhbWUgKi8KKwkqcG9zKysgPSBrZXlbMF0gPSAod2VwLT5pdiA+PiAxNikgJiAweGZmOworCSpwb3MrKyA9IGtleVsxXSA9ICh3ZXAtPml2ID4+IDgpICYgMHhmZjsKKwkqcG9zKysgPSBrZXlbMl0gPSB3ZXAtPml2ICYgMHhmZjsKKwkqcG9zKysgPSB3ZXAtPmtleV9pZHggPDwgNjsKKworCS8qIENvcHkgcmVzdCBvZiB0aGUgV0VQIGtleSAodGhlIHNlY3JldCBwYXJ0KSAqLworCW1lbWNweShrZXkgKyAzLCB3ZXAtPmtleSwgd2VwLT5rZXlfbGVuKTsKKworCS8qIEFwcGVuZCBsaXR0bGUtZW5kaWFuIENSQzMyIGFuZCBlbmNyeXB0IGl0IHRvIHByb2R1Y2UgSUNWICovCisJY3JjID0gfmNyYzMyX2xlKH4wLCBwb3MsIGxlbik7CisJaWN2ID0gc2tiX3B1dChza2IsIDQpOworCWljdlswXSA9IGNyYzsKKwlpY3ZbMV0gPSBjcmMgPj4gODsKKwlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJaWN2WzNdID0gY3JjID4+IDI0OworCisJY3J5cHRvX2NpcGhlcl9zZXRrZXkod2VwLT50Zm0sIGtleSwga2xlbik7CisJc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworCXNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisJc2cubGVuZ3RoID0gbGVuICsgNDsKKwljcnlwdG9fY2lwaGVyX2VuY3J5cHQod2VwLT50Zm0sICZzZywgJnNnLCBsZW4gKyA0KTsKKworCXJldHVybiAwOworfQorCisvKiBQZXJmb3JtIFdFUCBkZWNyeXB0aW9uIG9uIGdpdmVuIGJ1ZmZlci4gQnVmZmVyIGluY2x1ZGVzIHdob2xlIFdFUCBwYXJ0IG9mCisgKiB0aGUgZnJhbWU6IElWICg0IGJ5dGVzKSwgZW5jcnlwdGVkIHBheWxvYWQgKGluY2x1ZGluZyBTTkFQIGhlYWRlciksCisgKiBJQ1YgKDQgYnl0ZXMpLiBsZW4gaW5jbHVkZXMgYm90aCBJViBhbmQgSUNWLgorICoKKyAqIFJldHVybnMgMCBpZiBmcmFtZSB3YXMgZGVjcnlwdGVkIHN1Y2Nlc3NmdWxseSBhbmQgSUNWIHdhcyBjb3JyZWN0IGFuZCAtMSBvbgorICogZmFpbHVyZS4gSWYgZnJhbWUgaXMgT0ssIElWIGFuZCBJQ1Ygd2lsbCBiZSByZW1vdmVkLgorICovCitzdGF0aWMgaW50IHByaXNtMl93ZXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworCXUzMiBjcmMsIGtsZW4sIHBsZW47CisJdTgga2V5W1dFUF9LRVlfTEVOICsgM107CisJdTgga2V5aWR4LCAqcG9zLCBpY3ZbNF07CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCisJaWYgKHNrYi0+bGVuIDwgaGRyX2xlbiArIDgpCisJCXJldHVybiAtMTsKKworCXBvcyA9IHNrYi0+ZGF0YSArIGhkcl9sZW47CisJa2V5WzBdID0gKnBvcysrOworCWtleVsxXSA9ICpwb3MrKzsKKwlrZXlbMl0gPSAqcG9zKys7CisJa2V5aWR4ID0gKnBvcysrID4+IDY7CisJaWYgKGtleWlkeCAhPSB3ZXAtPmtleV9pZHgpCisJCXJldHVybiAtMTsKKworCWtsZW4gPSAzICsgd2VwLT5rZXlfbGVuOworCisJLyogQ29weSByZXN0IG9mIHRoZSBXRVAga2V5ICh0aGUgc2VjcmV0IHBhcnQpICovCisJbWVtY3B5KGtleSArIDMsIHdlcC0+a2V5LCB3ZXAtPmtleV9sZW4pOworCisJLyogQXBwbHkgUkM0IHRvIGRhdGEgYW5kIGNvbXB1dGUgQ1JDMzIgb3ZlciBkZWNyeXB0ZWQgZGF0YSAqLworCXBsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW4gLSA4OworCisJY3J5cHRvX2NpcGhlcl9zZXRrZXkod2VwLT50Zm0sIGtleSwga2xlbik7CisJc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworCXNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisJc2cubGVuZ3RoID0gcGxlbiArIDQ7CisJY3J5cHRvX2NpcGhlcl9kZWNyeXB0KHdlcC0+dGZtLCAmc2csICZzZywgcGxlbiArIDQpOworCisJY3JjID0gfmNyYzMyX2xlKH4wLCBwb3MsIHBsZW4pOworCWljdlswXSA9IGNyYzsKKwlpY3ZbMV0gPSBjcmMgPj4gODsKKwlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJaWN2WzNdID0gY3JjID4+IDI0OworCWlmIChtZW1jbXAoaWN2LCBwb3MgKyBwbGVuLCA0KSAhPSAwKSB7CisJCS8qIElDViBtaXNtYXRjaCAtIGRyb3AgZnJhbWUgKi8KKwkJcmV0dXJuIC0yOworCX0KKworCS8qIFJlbW92ZSBJViBhbmQgSUNWICovCisJbWVtbW92ZShza2ItPmRhdGEgKyA0LCBza2ItPmRhdGEsIGhkcl9sZW4pOworCXNrYl9wdWxsKHNrYiwgNCk7CisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJpc20yX3dlcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKiBzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKworCWlmIChsZW4gPCAwIHx8IGxlbiA+IFdFUF9LRVlfTEVOKQorCQlyZXR1cm4gLTE7CisKKwltZW1jcHkod2VwLT5rZXksIGtleSwgbGVuKTsKKwl3ZXAtPmtleV9sZW4gPSBsZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmlzbTJfd2VwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqIHNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworCisJaWYgKGxlbiA8IHdlcC0+a2V5X2xlbikKKwkJcmV0dXJuIC0xOworCisJbWVtY3B5KGtleSwgd2VwLT5rZXksIHdlcC0+a2V5X2xlbik7CisKKwlyZXR1cm4gd2VwLT5rZXlfbGVuOworfQorCitzdGF0aWMgY2hhciAqcHJpc20yX3dlcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisJcCArPSBzcHJpbnRmKHAsICJrZXlbJWRdIGFsZz1XRVAgbGVuPSVkXG4iLCB3ZXAtPmtleV9pZHgsIHdlcC0+a2V5X2xlbik7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3dlcCA9IHsKKwkubmFtZQkJCT0gIldFUCIsCisJLmluaXQJCQk9IHByaXNtMl93ZXBfaW5pdCwKKwkuZGVpbml0CQkJPSBwcmlzbTJfd2VwX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IHByaXNtMl93ZXBfZW5jcnlwdCwKKwkuZGVjcnlwdF9tcGR1CQk9IHByaXNtMl93ZXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IHByaXNtMl93ZXBfc2V0X2tleSwKKwkuZ2V0X2tleQkJPSBwcmlzbTJfd2VwX2dldF9rZXksCisJLnByaW50X3N0YXRzCQk9IHByaXNtMl93ZXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSA0LAkvKiBJViAqLworCS5leHRyYV9wb3N0Zml4X2xlbgk9IDQsCS8qIElDViAqLworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfd2VwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQodm9pZCkKK3sKKwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfd2VwKTsKK30KKworbW9kdWxlX2luaXQoaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCk7Cittb2R1bGVfZXhpdChpZWVlODAyMTFfY3J5cHRvX3dlcF9leGl0KTsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhNDczNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCkBAIC0wLDAgKzEsMjk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gdGhlIFdFUCBlbmFibGVtZW50IGNvZGUgcHJvdmlkZWQgYnkgdGhlCisgIEhvc3QgQVAgcHJvamVjdCBob3N0YXAtZHJpdmVycyB2MC4xLjMKKyAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgIDxqa21hbGluZUBjYy5odXQuZmk+CisgIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKworICBDb250YWN0IEluZm9ybWF0aW9uOgorICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisKKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CisKK01PRFVMRV9ERVNDUklQVElPTigiODAyLjExIGRhdGEvbWFuYWdlbWVudC9jb250cm9sIHN0YWNrIik7CitNT0RVTEVfQVVUSE9SCisgICAgKCJDb3B5cmlnaHQgKEMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24gPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBEUlZfTkFNRSAiaWVlZTgwMjExIgorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfbmV0d29ya3NfYWxsb2NhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKGllZWUtPm5ldHdvcmtzKQorCQlyZXR1cm4gMDsKKworCWllZWUtPm5ldHdvcmtzID0KKwkgICAga21hbGxvYyhNQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspLAorCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFpZWVlLT5uZXR3b3JrcykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJlYWNvbnNcbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoaWVlZS0+bmV0d29ya3MsIDAsCisJICAgICAgIE1BWF9ORVRXT1JLX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfbmV0d29ya3NfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZiAoIWllZWUtPm5ldHdvcmtzKQorCQlyZXR1cm47CisJa2ZyZWUoaWVlZS0+bmV0d29ya3MpOworCWllZWUtPm5ldHdvcmtzID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9uZXR3b3Jrc19pbml0aWFsaXplKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPm5ldHdvcmtfZnJlZV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+bmV0d29ya19saXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05FVFdPUktfQ09VTlQ7IGkrKykKKwkJbGlzdF9hZGRfdGFpbCgmaWVlZS0+bmV0d29ya3NbaV0ubGlzdCwKKwkJCSAgICAgICZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCk7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19pZWVlODAyMTEoaW50IHNpemVvZl9wcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKworCUlFRUU4MDIxMV9ERUJVR19JTkZPKCJJbml0aWFsaXppbmcuLi5cbiIpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKSArIHNpemVvZl9wcml2KTsKKwlpZiAoIWRldikgeworCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBuZXR3b3JrIGRldmljZS5cbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpZWVlODAyMTFfeG1pdDsKKworCWllZWUtPmRldiA9IGRldjsKKworCWVyciA9IGllZWU4MDIxMV9uZXR3b3Jrc19hbGxvY2F0ZShpZWVlKTsKKwlpZiAoZXJyKSB7CisJCUlFRUU4MDIxMV9FUlJPUigiVW5hYmxlIHRvIGFsbG9jYXRlIGJlYWNvbiBzdG9yYWdlOiAlZFxuIiwgZXJyKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCWllZWU4MDIxMV9uZXR3b3Jrc19pbml0aWFsaXplKGllZWUpOworCisJLyogRGVmYXVsdCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCBpcyBtYXhpbXVtIHBheWxvYWQgc2l6ZSAqLworCWllZWUtPmZ0cyA9IERFRkFVTFRfRlRTOworCWllZWUtPnNjYW5fYWdlID0gREVGQVVMVF9NQVhfU0NBTl9BR0U7CisJaWVlZS0+b3Blbl93ZXAgPSAxOworCisJLyogRGVmYXVsdCB0byBlbmFibGluZyBmdWxsIG9wZW4gV0VQIHdpdGggaG9zdCBiYXNlZCBlbmNyeXB0L2RlY3J5cHQgKi8KKwlpZWVlLT5ob3N0X2VuY3J5cHQgPSAxOworCWllZWUtPmhvc3RfZGVjcnlwdCA9IDE7CisJaWVlZS0+aWVlZTgwMl8xeCA9IDE7CS8qIERlZmF1bHQgdG8gc3VwcG9ydGluZyA4MDIuMXggKi8KKworCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5jcnlwdF9kZWluaXRfbGlzdCk7CisJaW5pdF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWllZWU7CisJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyOworCisJc3Bpbl9sb2NrX2luaXQoJmllZWUtPmxvY2spOworCisJaWVlZS0+d3BhX2VuYWJsZWQgPSAwOworCWllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzID0gMDsKKwlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gMDsKKwlpZWVlLT5wcml2YWN5X2ludm9rZWQgPSAwOworCWllZWUtPmllZWU4MDJfMXggPSAxOworCisJcmV0dXJuIGRldjsKKworICAgICAgZmFpbGVkOgorCWlmIChkZXYpCisJCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisKKwlpbnQgaTsKKworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpOworCWllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhpZWVlLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQgPSBpZWVlLT5jcnlwdFtpXTsKKwkJaWYgKGNyeXB0KSB7CisJCQlpZiAoY3J5cHQtPm9wcykgeworCQkJCWNyeXB0LT5vcHMtPmRlaW5pdChjcnlwdC0+cHJpdik7CisJCQkJbW9kdWxlX3B1dChjcnlwdC0+b3BzLT5vd25lcik7CisJCQl9CisJCQlrZnJlZShjcnlwdCk7CisJCQlpZWVlLT5jcnlwdFtpXSA9IE5VTEw7CisJCX0KKwl9CisKKwlpZWVlODAyMTFfbmV0d29ya3NfZnJlZShpZWVlKTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK3UzMiBpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSAwOworc3RydWN0IHByb2NfZGlyX2VudHJ5ICppZWVlODAyMTFfcHJvYyA9IE5VTEw7CisKK3N0YXRpYyBpbnQgc2hvd19kZWJ1Z19sZXZlbChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXJldHVybiBzbnByaW50ZihwYWdlLCBjb3VudCwgIjB4JTA4WFxuIiwgaWVlZTgwMjExX2RlYnVnX2xldmVsKTsKK30KKworc3RhdGljIGludCBzdG9yZV9kZWJ1Z19sZXZlbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbXSA9ICIweDAwMDAwMDAwIjsKKwljaGFyICpwID0gKGNoYXIgKilidWY7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAoY291bnQgPiBzaXplb2YoYnVmKSAtIDEpCisJCWNvdW50ID0gc2l6ZW9mKGJ1ZikgLSAxOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiBjb3VudDsKKwlidWZbY291bnRdID0gMDsKKwkvKgorCSAqIHdoYXQgYSBGUE9TLi4uICBXaGF0LCBzc2NhbmYoYnVmLCAiJWkiLCAmdmFsKSB3b3VsZCBiZSB0b28KKwkgKiBzY2FyeT8KKwkgKi8KKwlpZiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcgfHwgcFswXSA9PSAneCcgfHwgcFswXSA9PSAnWCcpIHsKKwkJcCsrOworCQlpZiAocFswXSA9PSAneCcgfHwgcFswXSA9PSAnWCcpCisJCQlwKys7CisJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxNik7CisJfSBlbHNlCisJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxMCk7CisJaWYgKHAgPT0gYnVmKQorCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCSAgICAgICAiOiAlcyBpcyBub3QgaW4gaGV4IG9yIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7CisJZWxzZQorCQlpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSB2YWw7CisKKwlyZXR1cm4gc3RybGVuKGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGllZWU4MDIxMV9pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplOworCisJaWVlZTgwMjExX2RlYnVnX2xldmVsID0gZGVidWc7CisJaWVlZTgwMjExX3Byb2MgPSBjcmVhdGVfcHJvY19lbnRyeShEUlZfTkFNRSwgU19JRkRJUiwgcHJvY19uZXQpOworCWlmIChpZWVlODAyMTFfcHJvYyA9PSBOVUxMKSB7CisJCUlFRUU4MDIxMV9FUlJPUigiVW5hYmxlIHRvIGNyZWF0ZSAiIERSVl9OQU1FCisJCQkJIiBwcm9jIGRpcmVjdG9yeVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwllID0gY3JlYXRlX3Byb2NfZW50cnkoImRlYnVnX2xldmVsIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICAgICAgaWVlZTgwMjExX3Byb2MpOworCWlmICghZSkgeworCQlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgcHJvY19uZXQpOworCQlpZWVlODAyMTFfcHJvYyA9IE5VTEw7CisJCXJldHVybiAtRUlPOworCX0KKwllLT5yZWFkX3Byb2MgPSBzaG93X2RlYnVnX2xldmVsOworCWUtPndyaXRlX3Byb2MgPSBzdG9yZV9kZWJ1Z19sZXZlbDsKKwllLT5kYXRhID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWVlZTgwMjExX2V4aXQodm9pZCkKK3sKKwlpZiAoaWVlZTgwMjExX3Byb2MpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRlYnVnX2xldmVsIiwgaWVlZTgwMjExX3Byb2MpOworCQlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgcHJvY19uZXQpOworCQlpZWVlODAyMTFfcHJvYyA9IE5VTEw7CisJfQorfQorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOworCittb2R1bGVfZXhpdChpZWVlODAyMTFfZXhpdCk7Cittb2R1bGVfaW5pdChpZWVlODAyMTFfaW5pdCk7CisjZW5kaWYKKworY29uc3QgY2hhciAqZXNjYXBlX2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCB1OCBlc3NpZF9sZW4pCit7CisJc3RhdGljIGNoYXIgZXNjYXBlZFtJV19FU1NJRF9NQVhfU0laRSAqIDIgKyAxXTsKKwljb25zdCBjaGFyICpzID0gZXNzaWQ7CisJY2hhciAqZCA9IGVzY2FwZWQ7CisKKwlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGVzc2lkLCBlc3NpZF9sZW4pKSB7CisJCW1lbWNweShlc2NhcGVkLCAiPGhpZGRlbj4iLCBzaXplb2YoIjxoaWRkZW4+IikpOworCQlyZXR1cm4gZXNjYXBlZDsKKwl9CisKKwllc3NpZF9sZW4gPSBtaW4oZXNzaWRfbGVuLCAodTgpIElXX0VTU0lEX01BWF9TSVpFKTsKKwl3aGlsZSAoZXNzaWRfbGVuLS0pIHsKKwkJaWYgKCpzID09ICdcMCcpIHsKKwkJCSpkKysgPSAnXFwnOworCQkJKmQrKyA9ICcwJzsKKwkJCXMrKzsKKwkJfSBlbHNlIHsKKwkJCSpkKysgPSAqcysrOworCQl9CisJfQorCSpkID0gJ1wwJzsKKwlyZXR1cm4gZXNjYXBlZDsKK30KKworRVhQT1JUX1NZTUJPTChhbGxvY19pZWVlODAyMTEpOworRVhQT1JUX1NZTUJPTChmcmVlX2llZWU4MDIxMSk7CitFWFBPUlRfU1lNQk9MKGVzY2FwZV9lc3NpZCk7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2RjZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMCwwICsxLDExOTMgQEAKKy8qCisgKiBPcmlnaW5hbCBjb2RlIGJhc2VkIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlcgorICogZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMyAtIGhvc3RhcC5vIG1vZHVsZSwgY29tbW9uIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKworI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9tb25pdG9yX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKworCXNrYi0+ZGV2ID0gaWVlZS0+ZGV2OworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcHVsbChza2IsIGllZWU4MDIxMV9nZXRfaGRybGVuKGZjKSk7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMTFfUkFXKTsKKwltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwluZXRpZl9yeChza2IpOworfQorCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKmllZWU4MDIxMV9mcmFnX2NhY2hlX2ZpbmQoc3RydWN0CisJCQkJCQkJICAgICAgaWVlZTgwMjExX2RldmljZQorCQkJCQkJCSAgICAgICppZWVlLAorCQkJCQkJCSAgICAgIHVuc2lnbmVkIGludCBzZXEsCisJCQkJCQkJICAgICAgdW5zaWduZWQgaW50IGZyYWcsCisJCQkJCQkJICAgICAgdTggKiBzcmMsCisJCQkJCQkJICAgICAgdTggKiBkc3QpCit7CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICplbnRyeTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU47IGkrKykgeworCQllbnRyeSA9ICZpZWVlLT5mcmFnX2NhY2hlW2ldOworCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMICYmCisJCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGVudHJ5LT5maXJzdF9mcmFnX3RpbWUgKyAyICogSFopKSB7CisJCQlJRUVFODAyMTFfREVCVUdfRlJBRygiZXhwaXJpbmcgZnJhZ21lbnQgY2FjaGUgZW50cnkgIgorCQkJCQkgICAgICJzZXE9JXUgbGFzdF9mcmFnPSV1XG4iLAorCQkJCQkgICAgIGVudHJ5LT5zZXEsIGVudHJ5LT5sYXN0X2ZyYWcpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoZW50cnktPnNrYik7CisJCQllbnRyeS0+c2tiID0gTlVMTDsKKwkJfQorCisJCWlmIChlbnRyeS0+c2tiICE9IE5VTEwgJiYgZW50cnktPnNlcSA9PSBzZXEgJiYKKwkJICAgIChlbnRyeS0+bGFzdF9mcmFnICsgMSA9PSBmcmFnIHx8IGZyYWcgPT0gLTEpICYmCisJCSAgICBtZW1jbXAoZW50cnktPnNyY19hZGRyLCBzcmMsIEVUSF9BTEVOKSA9PSAwICYmCisJCSAgICBtZW1jbXAoZW50cnktPmRzdF9hZGRyLCBkc3QsIEVUSF9BTEVOKSA9PSAwKQorCQkJcmV0dXJuIGVudHJ5OworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2ZyYWdfY2FjaGVfZ2V0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwl1MTYgc2M7CisJdW5zaWduZWQgaW50IGZyYWcsIHNlcTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKmVudHJ5OworCisJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOworCWZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisKKwlpZiAoZnJhZyA9PSAwKSB7CisJCS8qIFJlc2VydmUgZW5vdWdoIHNwYWNlIHRvIGZpdCBtYXhpbXVtIGZyYW1lIGxlbmd0aCAqLworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGllZWUtPmRldi0+bXR1ICsKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyKSArCisJCQkJICAgIDggLyogTExDICovICArCisJCQkJICAgIDIgLyogYWxpZ25tZW50ICovICArCisJCQkJICAgIDggLyogV0VQICovICArIEVUSF9BTEVOIC8qIFdEUyAqLyApOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKworCQllbnRyeSA9ICZpZWVlLT5mcmFnX2NhY2hlW2llZWUtPmZyYWdfbmV4dF9pZHhdOworCQlpZWVlLT5mcmFnX25leHRfaWR4Kys7CisJCWlmIChpZWVlLT5mcmFnX25leHRfaWR4ID49IElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTikKKwkJCWllZWUtPmZyYWdfbmV4dF9pZHggPSAwOworCisJCWlmIChlbnRyeS0+c2tiICE9IE5VTEwpCisJCQlkZXZfa2ZyZWVfc2tiX2FueShlbnRyeS0+c2tiKTsKKworCQllbnRyeS0+Zmlyc3RfZnJhZ190aW1lID0gamlmZmllczsKKwkJZW50cnktPnNlcSA9IHNlcTsKKwkJZW50cnktPmxhc3RfZnJhZyA9IGZyYWc7CisJCWVudHJ5LT5za2IgPSBza2I7CisJCW1lbWNweShlbnRyeS0+c3JjX2FkZHIsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGVudHJ5LT5kc3RfYWRkciwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisJCS8qIHJlY2VpdmVkIGEgZnJhZ21lbnQgb2YgYSBmcmFtZSBmb3Igd2hpY2ggdGhlIGhlYWQgZnJhZ21lbnQKKwkJICogc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlY2VpdmVkICovCisJCWVudHJ5ID0gaWVlZTgwMjExX2ZyYWdfY2FjaGVfZmluZChpZWVlLCBzZXEsIGZyYWcsIGhkci0+YWRkcjIsCisJCQkJCQkgIGhkci0+YWRkcjEpOworCQlpZiAoZW50cnkgIT0gTlVMTCkgeworCQkJZW50cnktPmxhc3RfZnJhZyA9IGZyYWc7CisJCQlza2IgPSBlbnRyeS0+c2tiOworCQl9CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgaW50IGllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJdTE2IHNjOworCXVuc2lnbmVkIGludCBzZXE7CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICplbnRyeTsKKworCXNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKwlzZXEgPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKKworCWVudHJ5ID0gaWVlZTgwMjExX2ZyYWdfY2FjaGVfZmluZChpZWVlLCBzZXEsIC0xLCBoZHItPmFkZHIyLAorCQkJCQkgIGhkci0+YWRkcjEpOworCisJaWYgKGVudHJ5ID09IE5VTEwpIHsKKwkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoImNvdWxkIG5vdCBpbnZhbGlkYXRlIGZyYWdtZW50IGNhY2hlICIKKwkJCQkgICAgICJlbnRyeSAoc2VxPSV1KVxuIiwgc2VxKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVudHJ5LT5za2IgPSBOVUxMOworCXJldHVybiAwOworfQorCisjaWZkZWYgTk9UX1lFVAorLyogaWVlZTgwMjExX3J4X2ZyYW1lX21ndG10CisgKgorICogUmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIG1hbmFnZW1lbnQgY29udHJvbCBmcmFtZXMKKyAqCisgKiBDYWxsZWQgYnkgaWVlZTgwMjExX3J4ICovCitzdGF0aWMgaW5saW5lIGludAoraWVlZTgwMjExX3J4X2ZyYW1lX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCQl1MTYgc3R5cGUpCit7CisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNYXN0ZXIgbW9kZSBub3QgeWV0IHN1cHBwb3J0ZWQuXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisvKgorICBob3N0YXBfdXBkYXRlX3N0YV9wcyhpZWVlLCAoc3RydWN0IGhvc3RhcF9pZWVlODAyMTFfaGRyICopCisgIHNrYi0+ZGF0YSk7Ki8KKwl9CisKKwlpZiAoaWVlZS0+aG9zdGFwZCAmJiB0eXBlID09IFdMQU5fRkNfVFlQRV9NR01UKSB7CisJCWlmIChzdHlwZSA9PSBXTEFOX0ZDX1NUWVBFX0JFQUNPTiAmJgorCQkgICAgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisJCQkvKiBQcm9jZXNzIGJlYWNvbiBmcmFtZXMgYWxzbyBpbiBrZXJuZWwgZHJpdmVyIHRvCisJCQkgKiB1cGRhdGUgU1RBKEFQKSB0YWJsZSBzdGF0aXN0aWNzICovCisJCQlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoc2tiMikKKwkJCQlob3N0YXBfcngoc2tiMi0+ZGV2LCBza2IyLCByeF9zdGF0cyk7CisJCX0KKworCQkvKiBzZW5kIG1hbmFnZW1lbnQgZnJhbWVzIHRvIHRoZSB1c2VyIHNwYWNlIGRhZW1vbiBmb3IKKwkJICogcHJvY2Vzc2luZyAqLworCQlpZWVlLT5hcGRldnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJaWVlZS0+YXBkZXZzdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJcHJpc20yX3J4XzgwMjExKGllZWUtPmFwZGV2LCBza2IsIHJ4X3N0YXRzLCBQUklTTTJfUlhfTUdNVCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCWlmICh0eXBlICE9IFdMQU5fRkNfVFlQRV9NR01UICYmIHR5cGUgIT0gV0xBTl9GQ19UWVBFX0NUUkwpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5rbm93biBtYW5hZ2VtZW50IGZyYW1lICIKKwkJCSAgICAgICAiKHR5cGU9MHglMDJ4LCBzdHlwZT0weCUwMngpIGRyb3BwZWRcbiIsCisJCQkgICAgICAgc2tiLT5kZXYtPm5hbWUsIHR5cGUsIHN0eXBlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWhvc3RhcF9yeChza2ItPmRldiwgc2tiLCByeF9zdGF0cyk7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogaG9zdGFwX3J4X2ZyYW1lX21nbXQ6IG1hbmFnZW1lbnQgZnJhbWUgIgorCSAgICAgICAicmVjZWl2ZWQgaW4gbm9uLUhvc3QgQVAgbW9kZVxuIiwgc2tiLT5kZXYtPm5hbWUpOworCXJldHVybiAtMTsKK30KKyNlbmRpZgorCisvKiBTZWUgSUVFRSA4MDIuMUggZm9yIExMQy9TTkFQIGVuY2Fwc3VsYXRpb24vZGVjYXBzdWxhdGlvbiAqLworLyogRXRoZXJuZXQtSUkgc25hcCBoZWFkZXIgKFJGQzEwNDIgZm9yIG1vc3QgRXRoZXJUeXBlcykgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJmYzEwNDJfaGVhZGVyW10gPSB7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworLyogQnJpZGdlLVR1bm5lbCBoZWFkZXIgKGZvciBFdGhlclR5cGVzIEVUSF9QX0FBUlAgYW5kIEVUSF9QX0lQWCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJyaWRnZV90dW5uZWxfaGVhZGVyW10gPQorICAgIHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmOCB9OworLyogTm8gZW5jYXBzdWxhdGlvbiBoZWFkZXIgaWYgRXRoZXJUeXBlIDwgMHg2MDAgKD1sZW5ndGgpICovCisKKy8qIENhbGxlZCBieSBpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdCAqLworc3RhdGljIGludCBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwl1MTYgZmMsIGV0aGVydHlwZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXU4ICpwb3M7CisKKwlpZiAoc2tiLT5sZW4gPCAyNCkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisKKwkvKiBjaGVjayB0aGF0IHRoZSBmcmFtZSBpcyB1bmljYXN0IGZyYW1lIHRvIHVzICovCisJaWYgKChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0KKwkgICAgSUVFRTgwMjExX0ZDVExfVE9EUyAmJgorCSAgICBtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDAgJiYKKwkgICAgbWVtY21wKGhkci0+YWRkcjMsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJCS8qIFRvRFMgZnJhbWUgd2l0aCBvd24gYWRkciBCU1NJRCBhbmQgREEgKi8KKwl9IGVsc2UgaWYgKChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0KKwkJICAgSUVFRTgwMjExX0ZDVExfRlJPTURTICYmCisJCSAgIG1lbWNtcChoZHItPmFkZHIxLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkvKiBGcm9tRFMgZnJhbWUgd2l0aCBvd24gYWRkciBhcyBEQSAqLworCX0gZWxzZQorCQlyZXR1cm4gMDsKKworCWlmIChza2ItPmxlbiA8IDI0ICsgOCkKKwkJcmV0dXJuIDA7CisKKwkvKiBjaGVjayBmb3IgcG9ydCBhY2Nlc3MgZW50aXR5IEV0aGVybmV0IHR5cGUgKi8KKwlwb3MgPSBza2ItPmRhdGEgKyAyNDsKKwlldGhlcnR5cGUgPSAocG9zWzZdIDw8IDgpIHwgcG9zWzddOworCWlmIChldGhlcnR5cGUgPT0gRVRIX1BfUEFFKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSksIGJ5IGllZWU4MDIxMV9yeCAqLworc3RhdGljIGlubGluZSBpbnQKK2llZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCWludCByZXMsIGhkcmxlbjsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpOworCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9DUllQVF9US0lQCisJaWYgKGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzICYmIHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiVEtJUCIpID09IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUS0lQIGNvdW50ZXJtZWFzdXJlczogZHJvcHBlZCAiCisJCQkgICAgICAgInJlY2VpdmVkIHBhY2tldCBmcm9tICIgTUFDX0ZNVCAiXG4iLAorCQkJICAgICAgIGllZWUtPmRldi0+bmFtZSwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gY3J5cHQtPm9wcy0+ZGVjcnlwdF9tcGR1KHNrYiwgaGRybGVuLCBjcnlwdC0+cHJpdik7CisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJSUVFRTgwMjExX0RFQlVHX0RST1AoImRlY3J5cHRpb24gZmFpbGVkIChTQT0iIE1BQ19GTVQKKwkJCQkgICAgICIpIHJlcz0lZFxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwgcmVzKTsKKwkJaWYgKHJlcyA9PSAtMikKKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKCJEZWNyeXB0aW9uIGZhaWxlZCBJQ1YgIgorCQkJCQkgICAgICJtaXNtYXRjaCAoa2V5ICVkKVxuIiwKKwkJCQkJICAgICBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNik7CisJCWllZWUtPmllZWVfc3RhdHMucnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZSsrOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLCBieSBpZWVlODAyMTFfcnggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdF9tc2R1KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCXN0cnVjdCBza19idWZmICpza2IsIGludCBrZXlpZHgsCisJCQkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCWludCByZXMsIGhkcmxlbjsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXNkdSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpOworCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gY3J5cHQtPm9wcy0+ZGVjcnlwdF9tc2R1KHNrYiwga2V5aWR4LCBoZHJsZW4sIGNyeXB0LT5wcml2KTsKKwlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKKwlpZiAocmVzIDwgMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1TRFUgZGVjcnlwdGlvbi9NSUMgdmVyaWZpY2F0aW9uIGZhaWxlZCIKKwkJICAgICAgICIgKFNBPSIgTUFDX0ZNVCAiIGtleWlkeD0lZClcbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIE1BQ19BUkcoaGRyLT5hZGRyMiksIGtleWlkeCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQWxsIHJlY2VpdmVkIGZyYW1lcyBhcmUgc2VudCB0byB0aGlzIGZ1bmN0aW9uLiBAc2tiIGNvbnRhaW5zIHRoZSBmcmFtZSBpbgorICogSUVFRSA4MDIuMTEgZm9ybWF0LCBpLmUuLCBpbiB0aGUgZm9ybWF0IGl0IHdhcyBzZW50IG92ZXIgYWlyLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkuICovCitpbnQgaWVlZTgwMjExX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXNpemVfdCBoZHJsZW47CisJdTE2IGZjLCB0eXBlLCBzdHlwZSwgc2M7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCXVuc2lnbmVkIGludCBmcmFnOworCXU4ICpwYXlsb2FkOworCXUxNiBldGhlcnR5cGU7CisjaWZkZWYgTk9UX1lFVAorCXN0cnVjdCBuZXRfZGV2aWNlICp3ZHMgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2IyID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqd2RzID0gTlVMTDsKKwlpbnQgZnJhbWVfYXV0aG9yaXplZCA9IDA7CisJaW50IGZyb21fYXNzb2NfYXAgPSAwOworCXZvaWQgKnN0YSA9IE5VTEw7CisjZW5kaWYKKwl1OCBkc3RbRVRIX0FMRU5dOworCXU4IHNyY1tFVEhfQUxFTl07CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCA9IE5VTEw7CisJaW50IGtleWlkeCA9IDA7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJc3RhdHMgPSAmaWVlZS0+c3RhdHM7CisKKwlpZiAoc2tiLT5sZW4gPCAxMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogU0tCIGxlbmd0aCA8IDEwXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOworCXN0eXBlID0gV0xBTl9GQ19HRVRfU1RZUEUoZmMpOworCXNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKwlmcmFnID0gV0xBTl9HRVRfU0VRX0ZSQUcoc2MpOworCWhkcmxlbiA9IGllZWU4MDIxMV9nZXRfaGRybGVuKGZjKTsKKworI2lmZGVmIE5PVF9ZRVQKKyNpZiBXSVJFTEVTU19FWFQgPiAxNQorCS8qIFB1dCB0aGlzIGNvZGUgaGVyZSBzbyB0aGF0IHdlIGF2b2lkIGR1cGxpY2F0aW5nIGl0IGluIGFsbAorCSAqIFJ4IHBhdGhzLiAtIEplYW4gSUkgKi8KKyNpZmRlZiBJV19XSVJFTEVTU19TUFkJCS8qIGRlZmluZWQgaW4gaXdfaGFuZGxlci5oICovCisJLyogSWYgc3B5IG1vbml0b3Jpbmcgb24gKi8KKwlpZiAoaWZhY2UtPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSB7CisJCXN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKwkJd3N0YXRzLmxldmVsID0gcnhfc3RhdHMtPnNpZ25hbDsKKwkJd3N0YXRzLm5vaXNlID0gcnhfc3RhdHMtPm5vaXNlOworCQl3c3RhdHMudXBkYXRlZCA9IDY7CS8qIE5vIHF1YWwgdmFsdWUgKi8KKwkJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJCXdpcmVsZXNzX3NweV91cGRhdGUoZGV2LCBoZHItPmFkZHIyLCAmd3N0YXRzKTsKKwl9CisjZW5kaWYJCQkJLyogSVdfV0lSRUxFU1NfU1BZICovCisjZW5kaWYJCQkJLyogV0lSRUxFU1NfRVhUID4gMTUgKi8KKwlob3N0YXBfdXBkYXRlX3J4X3N0YXRzKGxvY2FsLT5hcCwgaGRyLCByeF9zdGF0cyk7CisjZW5kaWYKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE1CisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7CisJCWllZWU4MDIxMV9tb25pdG9yX3J4KGllZWUsIHNrYiwgcnhfc3RhdHMpOworCQlzdGF0cy0+cnhfcGFja2V0cysrOworCQlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCisJaWYgKGllZWUtPmhvc3RfZGVjcnlwdCkgeworCQlpbnQgaWR4ID0gMDsKKwkJaWYgKHNrYi0+bGVuID49IGhkcmxlbiArIDMpCisJCQlpZHggPSBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNjsKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZHhdOworI2lmZGVmIE5PVF9ZRVQKKwkJc3RhID0gTlVMTDsKKworCQkvKiBVc2Ugc3RhdGlvbiBzcGVjaWZpYyBrZXkgdG8gb3ZlcnJpZGUgZGVmYXVsdCBrZXlzIGlmIHRoZQorCQkgKiByZWNlaXZlciBhZGRyZXNzIGlzIGEgdW5pY2FzdCBhZGRyZXNzICgiaW5kaXZpZHVhbCBSQSIpLiBJZgorCQkgKiBiY3J4X3N0YV9rZXkgcGFyYW1ldGVyIGlzIHNldCwgc3RhdGlvbiBzcGVjaWZpYyBrZXkgaXMgdXNlZAorCQkgKiBldmVuIHdpdGggYnJvYWQvbXVsdGljYXN0IHRhcmdldHMgKHRoaXMgaXMgYWdhaW5zdCBJRUVFCisJCSAqIDgwMi4xMSwgYnV0IG1ha2VzIGl0IGVhc2llciB0byB1c2UgZGlmZmVyZW50IGtleXMgd2l0aAorCQkgKiBzdGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IFdFUCBrZXkgbWFwcGluZykuICovCisKKwkJaWYgKCEoaGRyLT5hZGRyMVswXSAmIDB4MDEpIHx8IGxvY2FsLT5iY3J4X3N0YV9rZXkpCisJCQkodm9pZClob3N0YXBfaGFuZGxlX3N0YV9jcnlwdG8obG9jYWwsIGhkciwgJmNyeXB0LAorCQkJCQkJICAgICAgICZzdGEpOworI2VuZGlmCisKKwkJLyogYWxsb3cgTlVMTCBkZWNyeXB0IHRvIGluZGljYXRlIGFuIHN0YXRpb24gc3BlY2lmaWMgb3ZlcnJpZGUKKwkJICogZm9yIGRlZmF1bHQgZW5jcnlwdGlvbiAqLworCQlpZiAoY3J5cHQgJiYgKGNyeXB0LT5vcHMgPT0gTlVMTCB8fAorCQkJICAgICAgY3J5cHQtPm9wcy0+ZGVjcnlwdF9tcGR1ID09IE5VTEwpKQorCQkJY3J5cHQgPSBOVUxMOworCisJCWlmICghY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSkgeworCQkJLyogVGhpcyBzZWVtcyB0byBiZSB0cmlnZ2VyZWQgYnkgc29tZSAobXVsdGljYXN0PykKKwkJCSAqIGZyYW1lcyBmcm9tIG90aGVyIHRoYW4gY3VycmVudCBCU1MsIHNvIGp1c3QgZHJvcCB0aGUKKwkJCSAqIGZyYW1lcyBzaWxlbnRseSBpbnN0ZWFkIG9mIGZpbGxpbmcgc3lzdGVtIGxvZyB3aXRoCisJCQkgKiB0aGVzZSByZXBvcnRzLiAqLworCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoIkRlY3J5cHRpb24gZmFpbGVkIChub3Qgc2V0KSIKKwkJCQkJICAgICAiIChTQT0iIE1BQ19GTVQgIilcbiIsCisJCQkJCSAgICAgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCQlpZWVlLT5pZWVlX3N0YXRzLnJ4X2Rpc2NhcmRzX3VuZGVjcnlwdGFibGUrKzsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCX0KKyNpZmRlZiBOT1RfWUVUCisJaWYgKHR5cGUgIT0gV0xBTl9GQ19UWVBFX0RBVEEpIHsKKwkJaWYgKHR5cGUgPT0gV0xBTl9GQ19UWVBFX01HTVQgJiYgc3R5cGUgPT0gV0xBTl9GQ19TVFlQRV9BVVRIICYmCisJCSAgICBmYyAmIElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCAmJiBpZWVlLT5ob3N0X2RlY3J5cHQgJiYKKwkJICAgIChrZXlpZHggPSBob3N0YXBfcnhfZnJhbWVfZGVjcnlwdChpZWVlLCBza2IsIGNyeXB0KSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBkZWNyeXB0IG1nbXQ6OmF1dGggIgorCQkJICAgICAgICJmcm9tICIgTUFDX0ZNVCAiXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCQkvKiBUT0RPOiBjb3VsZCBpbmZvcm0gaG9zdGFwZCBhYm91dCB0aGlzIHNvIHRoYXQgaXQKKwkJCSAqIGNvdWxkIHNlbmQgYXV0aCBmYWlsdXJlIHJlcG9ydCAqLworCQkJZ290byByeF9kcm9wcGVkOworCQl9CisKKwkJaWYgKGllZWU4MDIxMV9yeF9mcmFtZV9tZ210KGllZWUsIHNrYiwgcnhfc3RhdHMsIHR5cGUsIHN0eXBlKSkKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJZWxzZQorCQkJZ290byByeF9leGl0OworCX0KKyNlbmRpZgorCisJLyogRGF0YSBmcmFtZSAtIGV4dHJhY3Qgc3JjL2RzdCBhZGRyZXNzZXMgKi8KKwlpZiAoc2tiLT5sZW4gPCBJRUVFODAyMTFfM0FERFJfTEVOKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwlzd2l0Y2ggKGZjICYgKElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFMpKSB7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFM6CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyMywgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV80QUREUl9MRU4pCisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyNCwgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIDA6CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCQlicmVhazsKKwl9CisKKyNpZmRlZiBOT1RfWUVUCisJaWYgKGhvc3RhcF9yeF9mcmFtZV93ZHMoaWVlZSwgaGRyLCBmYywgJndkcykpCisJCWdvdG8gcnhfZHJvcHBlZDsKKwlpZiAod2RzKSB7CisJCXNrYi0+ZGV2ID0gZGV2ID0gd2RzOworCQlzdGF0cyA9IGhvc3RhcF9nZXRfc3RhdHMoZGV2KTsKKwl9CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiAmJiAhd2RzICYmCisJICAgIChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0KKwkgICAgSUVFRTgwMjExX0ZDVExfRlJPTURTICYmIGllZWUtPnN0YWRldgorCSAgICAmJiBtZW1jbXAoaGRyLT5hZGRyMiwgaWVlZS0+YXNzb2NfYXBfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJLyogRnJhbWUgZnJvbSBCU1NJRCBvZiB0aGUgQVAgZm9yIHdoaWNoIHdlIGFyZSBhIGNsaWVudCAqLworCQlza2ItPmRldiA9IGRldiA9IGllZWUtPnN0YWRldjsKKwkJc3RhdHMgPSBob3N0YXBfZ2V0X3N0YXRzKGRldik7CisJCWZyb21fYXNzb2NfYXAgPSAxOworCX0KKyNlbmRpZgorCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworI2lmZGVmIE5PVF9ZRVQKKwlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgfHwKKwkgICAgIGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9SRVBFQVQpICYmICFmcm9tX2Fzc29jX2FwKSB7CisJCXN3aXRjaCAoaG9zdGFwX2hhbmRsZV9zdGFfcngoaWVlZSwgZGV2LCBza2IsIHJ4X3N0YXRzLAorCQkJCQkgICAgIHdkcyAhPSBOVUxMKSkgeworCQljYXNlIEFQX1JYX0NPTlRJTlVFX05PVF9BVVRIT1JJWkVEOgorCQkJZnJhbWVfYXV0aG9yaXplZCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBBUF9SWF9DT05USU5VRToKKwkJCWZyYW1lX2F1dGhvcml6ZWQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgQVBfUlhfRFJPUDoKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJY2FzZSBBUF9SWF9FWElUOgorCQkJZ290byByeF9leGl0OworCQl9CisJfQorI2VuZGlmCisKKwkvKiBOdWxsZnVuYyBmcmFtZXMgbWF5IGhhdmUgUFMtYml0IHNldCwgc28gdGhleSBtdXN0IGJlIHBhc3NlZCB0bworCSAqIGhvc3RhcF9oYW5kbGVfc3RhX3J4KCkgYmVmb3JlIGJlaW5nIGRyb3BwZWQgaGVyZS4gKi8KKwlpZiAoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEEgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMICYmCisJICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTCkgeworCQlpZiAoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX05VTExGVU5DKQorCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoIlJYOiBkcm9wcGVkIGRhdGEgZnJhbWUgIgorCQkJCQkgICAgICJ3aXRoIG5vIGRhdGEgKHR5cGU9MHglMDJ4LCAiCisJCQkJCSAgICAgInN1YnR5cGU9MHglMDJ4LCBsZW49JWQpXG4iLAorCQkJCQkgICAgIHR5cGUsIHN0eXBlLCBza2ItPmxlbik7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKwkvKiBza2I6IGhkciArIChwb3NzaWJseSBmcmFnbWVudGVkLCBwb3NzaWJseSBlbmNyeXB0ZWQpIHBheWxvYWQgKi8KKworCWlmIChpZWVlLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSAmJgorCSAgICAoa2V5aWR4ID0gaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHQoaWVlZSwgc2tiLCBjcnlwdCkpIDwgMCkKKwkJZ290byByeF9kcm9wcGVkOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCisJLyogc2tiOiBoZHIgKyAocG9zc2libHkgZnJhZ21lbnRlZCkgcGxhaW50ZXh0IHBheWxvYWQgKi8KKwkvLyBQUjogRklYTUU6IGhvc3RhcCBoYXMgYWRkaXRpb25hbCBjb25kaXRpb25zIGluIHRoZSAiaWYiIGJlbG93OgorCS8vIGllZWUtPmhvc3RfZGVjcnlwdCAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpICYmCisJaWYgKChmcmFnICE9IDAgfHwgKGZjICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSkpIHsKKwkJaW50IGZsZW47CisJCXN0cnVjdCBza19idWZmICpmcmFnX3NrYiA9IGllZWU4MDIxMV9mcmFnX2NhY2hlX2dldChpZWVlLCBoZHIpOworCQlJRUVFODAyMTFfREVCVUdfRlJBRygiUnggRnJhZ21lbnQgcmVjZWl2ZWQgKCV1KVxuIiwgZnJhZyk7CisKKwkJaWYgKCFmcmFnX3NrYikgeworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCB8IElFRUU4MDIxMV9ETF9GUkFHLAorCQkJCQkiUnggY2Fubm90IGdldCBza2IgZnJvbSBmcmFnbWVudCAiCisJCQkJCSJjYWNoZSAobW9yZWZyYWc9JWQgc2VxPSV1IGZyYWc9JXUpXG4iLAorCQkJCQkoZmMgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpICE9IDAsCisJCQkJCVdMQU5fR0VUX1NFUV9TRVEoc2MpLCBmcmFnKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCisJCWZsZW4gPSBza2ItPmxlbjsKKwkJaWYgKGZyYWcgIT0gMCkKKwkJCWZsZW4gLT0gaGRybGVuOworCisJCWlmIChmcmFnX3NrYi0+dGFpbCArIGZsZW4gPiBmcmFnX3NrYi0+ZW5kKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaG9zdCBkZWNyeXB0ZWQgYW5kICIKKwkJCSAgICAgICAicmVhc3NlbWJsZWQgZnJhbWUgZGlkIG5vdCBmaXQgc2tiXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlpZWVlODAyMTFfZnJhZ19jYWNoZV9pbnZhbGlkYXRlKGllZWUsIGhkcik7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKworCQlpZiAoZnJhZyA9PSAwKSB7CisJCQkvKiBjb3B5IGZpcnN0IGZyYWdtZW50IChpbmNsdWRpbmcgZnVsbCBoZWFkZXJzKSBpbnRvCisJCQkgKiBiZWdpbm5pbmcgb2YgdGhlIGZyYWdtZW50IGNhY2hlIHNrYiAqLworCQkJbWVtY3B5KHNrYl9wdXQoZnJhZ19za2IsIGZsZW4pLCBza2ItPmRhdGEsIGZsZW4pOworCQl9IGVsc2UgeworCQkJLyogYXBwZW5kIGZyYW1lIHBheWxvYWQgdG8gdGhlIGVuZCBvZiB0aGUgZnJhZ21lbnQKKwkJCSAqIGNhY2hlIHNrYiAqLworCQkJbWVtY3B5KHNrYl9wdXQoZnJhZ19za2IsIGZsZW4pLCBza2ItPmRhdGEgKyBoZHJsZW4sCisJCQkgICAgICAgZmxlbik7CisJCX0KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJc2tiID0gTlVMTDsKKworCQlpZiAoZmMgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpIHsKKwkJCS8qIG1vcmUgZnJhZ21lbnRzIGV4cGVjdGVkIC0gbGVhdmUgdGhlIHNrYiBpbiBmcmFnbWVudAorCQkJICogY2FjaGUgZm9yIG5vdzsgaXQgd2lsbCBiZSBkZWxpdmVyZWQgdG8gdXBwZXIgbGF5ZXJzCisJCQkgKiBhZnRlciBhbGwgZnJhZ21lbnRzIGhhdmUgYmVlbiByZWNlaXZlZCAqLworCQkJZ290byByeF9leGl0OworCQl9CisKKwkJLyogdGhpcyB3YXMgdGhlIGxhc3QgZnJhZ21lbnQgYW5kIHRoZSBmcmFtZSB3aWxsIGJlCisJCSAqIGRlbGl2ZXJlZCwgc28gcmVtb3ZlIHNrYiBmcm9tIGZyYWdtZW50IGNhY2hlICovCisJCXNrYiA9IGZyYWdfc2tiOworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJCWllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoaWVlZSwgaGRyKTsKKwl9CisKKwkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBNU0RVIHBheWxvYWQ7IHBvc3NpYmx5IHN0aWxsCisJICogZW5jcnlwdGVkL2F1dGhlbnRpY2F0ZWQgKi8KKwlpZiAoaWVlZS0+aG9zdF9kZWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCkgJiYKKwkgICAgaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHRfbXNkdShpZWVlLCBza2IsIGtleWlkeCwgY3J5cHQpKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJaWYgKGNyeXB0ICYmICEoZmMgJiBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpICYmICFpZWVlLT5vcGVuX3dlcCkgeworCQlpZiAoCQkvKmllZWUtPmllZWU4MDJfMXggJiYgKi8KKwkJCSAgIGllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IpKSB7CisJCQkvKiBwYXNzIHVuZW5jcnlwdGVkIEVBUE9MIGZyYW1lcyBldmVuIGlmIGVuY3J5cHRpb24gaXMKKwkJCSAqIGNvbmZpZ3VyZWQgKi8KKwkJfSBlbHNlIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKCJlbmNyeXB0aW9uIGNvbmZpZ3VyZWQsIGJ1dCBSWCAiCisJCQkJCSAgICAgImZyYW1lIG5vdCBlbmNyeXB0ZWQgKFNBPSIgTUFDX0ZNVAorCQkJCQkgICAgICIpXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCX0KKworCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSAmJiAhaWVlZS0+b3Blbl93ZXAgJiYKKwkgICAgIWllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IpKSB7CisJCUlFRUU4MDIxMV9ERUJVR19EUk9QKCJkcm9wcGVkIHVuZW5jcnlwdGVkIFJYIGRhdGEgIgorCQkJCSAgICAgImZyYW1lIGZyb20gIiBNQUNfRk1UCisJCQkJICAgICAiIChkcm9wX3VuZW5jcnlwdGVkPTEpXG4iLAorCQkJCSAgICAgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKwkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBwbGFpbnRleHQgcGF5bG9hZCAqLworCisJcGF5bG9hZCA9IHNrYi0+ZGF0YSArIGhkcmxlbjsKKwlldGhlcnR5cGUgPSAocGF5bG9hZFs2XSA8PCA4KSB8IHBheWxvYWRbN107CisKKyNpZmRlZiBOT1RfWUVUCisJLyogSWYgSUVFRSA4MDIuMVggaXMgdXNlZCwgY2hlY2sgd2hldGhlciB0aGUgcG9ydCBpcyBhdXRob3JpemVkIHRvIHNlbmQKKwkgKiB0aGUgcmVjZWl2ZWQgZnJhbWUuICovCisJaWYgKGllZWUtPmllZWU4MDJfMXggJiYgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCQlpZiAoZXRoZXJ0eXBlID09IEVUSF9QX1BBRSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSWDogSUVFRSA4MDIuMVggZnJhbWVcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWlmIChpZWVlLT5ob3N0YXBkICYmIGllZWUtPmFwZGV2KSB7CisJCQkJLyogU2VuZCBJRUVFIDgwMi4xWCBmcmFtZXMgdG8gdGhlIHVzZXIKKwkJCQkgKiBzcGFjZSBkYWVtb24gZm9yIHByb2Nlc3NpbmcgKi8KKwkJCQlwcmlzbTJfcnhfODAyMTEoaWVlZS0+YXBkZXYsIHNrYiwgcnhfc3RhdHMsCisJCQkJCQlQUklTTTJfUlhfTUdNVCk7CisJCQkJaWVlZS0+YXBkZXZzdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJaWVlZS0+YXBkZXZzdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQlnb3RvIHJ4X2V4aXQ7CisJCQl9CisJCX0gZWxzZSBpZiAoIWZyYW1lX2F1dGhvcml6ZWQpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZHJvcHBlZCBmcmFtZSBmcm9tICIKKwkJCSAgICAgICAidW5hdXRob3JpemVkIHBvcnQgKElFRUUgODAyLjFYKTogIgorCQkJICAgICAgICJldGhlcnR5cGU9MHglMDR4XG4iLCBkZXYtPm5hbWUsIGV0aGVydHlwZSk7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIGNvbnZlcnQgaGRyICsgcG9zc2libGUgTExDIGhlYWRlcnMgaW50byBFdGhlcm5ldCBoZWFkZXIgKi8KKwlpZiAoc2tiLT5sZW4gLSBoZHJsZW4gPj0gOCAmJgorCSAgICAoKG1lbWNtcChwYXlsb2FkLCByZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwICYmCisJICAgICAgZXRoZXJ0eXBlICE9IEVUSF9QX0FBUlAgJiYgZXRoZXJ0eXBlICE9IEVUSF9QX0lQWCkgfHwKKwkgICAgIG1lbWNtcChwYXlsb2FkLCBicmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwKSkgeworCQkvKiByZW1vdmUgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gYW5kCisJCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCisJCXNrYl9wdWxsKHNrYiwgaGRybGVuICsgU05BUF9TSVpFKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBzcmMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBkc3QsIEVUSF9BTEVOKTsKKwl9IGVsc2UgeworCQl1MTYgbGVuOworCQkvKiBMZWF2ZSBFdGhlcm5ldCBoZWFkZXIgcGFydCBvZiBoZHIgYW5kIGZ1bGwgcGF5bG9hZCAqLworCQlza2JfcHVsbChza2IsIGhkcmxlbik7CisJCWxlbiA9IGh0b25zKHNrYi0+bGVuKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgMiksICZsZW4sIDIpOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOworCX0KKworI2lmZGVmIE5PVF9ZRVQKKwlpZiAod2RzICYmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJCSAgICBJRUVFODAyMTFfRkNUTF9UT0RTKSAmJiBza2ItPmxlbiA+PSBFVEhfSExFTiArIEVUSF9BTEVOKSB7CisJCS8qIE5vbi1zdGFuZGFyZCBmcmFtZTogZ2V0IGFkZHI0IGZyb20gaXRzIGJvZ3VzIGxvY2F0aW9uIGFmdGVyCisJCSAqIHRoZSBwYXlsb2FkICovCisJCW1lbWNweShza2ItPmRhdGEgKyBFVEhfQUxFTiwKKwkJICAgICAgIHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIEVUSF9BTEVOKTsKKwl9CisjZW5kaWYKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisjaWZkZWYgTk9UX1lFVAorCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF3ZHMgJiYgaWVlZS0+YXAtPmJyaWRnZV9wYWNrZXRzKSB7CisJCWlmIChkc3RbMF0gJiAweDAxKSB7CisJCQkvKiBjb3B5IG11bHRpY2FzdCBmcmFtZSBib3RoIHRvIHRoZSBoaWdoZXIgbGF5ZXJzIGFuZAorCQkJICogdG8gdGhlIHdpcmVsZXNzIG1lZGlhICovCisJCQlpZWVlLT5hcC0+YnJpZGdlZF9tdWx0aWNhc3QrKzsKKwkJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IyID09IE5VTEwpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBza2JfY2xvbmUgZmFpbGVkIGZvciAiCisJCQkJICAgICAgICJtdWx0aWNhc3QgZnJhbWVcbiIsIGRldi0+bmFtZSk7CisJCX0gZWxzZSBpZiAoaG9zdGFwX2lzX3N0YV9hc3NvYyhpZWVlLT5hcCwgZHN0KSkgeworCQkJLyogc2VuZCBmcmFtZSBkaXJlY3RseSB0byB0aGUgYXNzb2NpYXRlZCBTVEEgdXNpbmcKKwkJCSAqIHdpcmVsZXNzIG1lZGlhIGFuZCBub3QgcGFzc2luZyB0byBoaWdoZXIgbGF5ZXJzICovCisJCQlpZWVlLT5hcC0+YnJpZGdlZF91bmljYXN0Kys7CisJCQlza2IyID0gc2tiOworCQkJc2tiID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChza2IyICE9IE5VTEwpIHsKKwkJLyogc2VuZCB0byB3aXJlbGVzcyBtZWRpYSAqLworCQlza2IyLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzMpOworCQlza2IyLT5tYWMucmF3ID0gc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YTsKKwkJLyogc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YSArIEVUSF9ITEVOOyAqLworCQlza2IyLT5kZXYgPSBkZXY7CisJCWRldl9xdWV1ZV94bWl0KHNrYjIpOworCX0KKyNlbmRpZgorCisJaWYgKHNrYikgeworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsJLyogODAyLjExIGNyYyBub3Qgc3VmZmljaWVudCAqLworCQluZXRpZl9yeChza2IpOworCX0KKworICAgICAgcnhfZXhpdDoKKyNpZmRlZiBOT1RfWUVUCisJaWYgKHN0YSkKKwkJaG9zdGFwX2hhbmRsZV9zdGFfcmVsZWFzZShzdGEpOworI2VuZGlmCisJcmV0dXJuIDE7CisKKyAgICAgIHJ4X2Ryb3BwZWQ6CisJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKworCS8qIFJldHVybmluZyAwIGluZGljYXRlcyB0byBjYWxsZXIgdGhhdCB3ZSBoYXZlIG5vdCBoYW5kbGVkIHRoZSBTS0ItLQorCSAqIHNvIGl0IGlzIHN0aWxsIGFsbG9jYXRlZCBhbmQgY2FuIGJlIHVzZWQgYWdhaW4gYnkgdW5kZXJseWluZworCSAqIGhhcmR3YXJlIGFzIGEgRE1BIHRhcmdldCAqLworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1HTVRfRlJBTUVfRklYRURfUEFSVF9MRU5HVEgJCTB4MjQKKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX29mZG1fcmF0ZSh1OCByYXRlKQoreworCXN3aXRjaCAocmF0ZSAmIH5JRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLKSB7CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xOE1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV80OE1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV81NE1COgorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9uZXR3b3JrX2luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlCisJCQkJCSAqYmVhY29uLAorCQkJCQkgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCQkJCQkgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpCit7CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCWNoYXIgcmF0ZXNfc3RyWzY0XTsKKwljaGFyICpwOworI2VuZGlmCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudDsKKwl1MTYgbGVmdDsKKwl1OCBpOworCisJLyogUHVsbCBvdXQgZml4ZWQgZmllbGQgZGF0YSAqLworCW1lbWNweShuZXR3b3JrLT5ic3NpZCwgYmVhY29uLT5oZWFkZXIuYWRkcjMsIEVUSF9BTEVOKTsKKwluZXR3b3JrLT5jYXBhYmlsaXR5ID0gYmVhY29uLT5jYXBhYmlsaXR5OworCW5ldHdvcmstPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7CisJbmV0d29yay0+dGltZV9zdGFtcFswXSA9IGJlYWNvbi0+dGltZV9zdGFtcFswXTsKKwluZXR3b3JrLT50aW1lX3N0YW1wWzFdID0gYmVhY29uLT50aW1lX3N0YW1wWzFdOworCW5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbCA9IGJlYWNvbi0+YmVhY29uX2ludGVydmFsOworCS8qIFdoZXJlIHRvIHB1bGwgdGhpcz8gYmVhY29uLT5saXN0ZW5faW50ZXJ2YWw7ICovCisJbmV0d29yay0+bGlzdGVuX2ludGVydmFsID0gMHgwQTsKKwluZXR3b3JrLT5yYXRlc19sZW4gPSBuZXR3b3JrLT5yYXRlc19leF9sZW4gPSAwOworCW5ldHdvcmstPmxhc3RfYXNzb2NpYXRlID0gMDsKKwluZXR3b3JrLT5zc2lkX2xlbiA9IDA7CisJbmV0d29yay0+ZmxhZ3MgPSAwOworCW5ldHdvcmstPmF0aW1fd2luZG93ID0gMDsKKworCWlmIChzdGF0cy0+ZnJlcSA9PSBJRUVFODAyMTFfNTJHSFpfQkFORCkgeworCQkvKiBmb3IgQSBiYW5kIChObyBEUyBpbmZvKSAqLworCQluZXR3b3JrLT5jaGFubmVsID0gc3RhdHMtPnJlY2VpdmVkX2NoYW5uZWw7CisJfSBlbHNlCisJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX0NDSzsKKworCW5ldHdvcmstPndwYV9pZV9sZW4gPSAwOworCW5ldHdvcmstPnJzbl9pZV9sZW4gPSAwOworCisJaW5mb19lbGVtZW50ID0gJmJlYWNvbi0+aW5mb19lbGVtZW50OworCWxlZnQgPSBzdGF0cy0+bGVuIC0gKCh2b2lkICopaW5mb19lbGVtZW50IC0gKHZvaWQgKiliZWFjb24pOworCXdoaWxlIChsZWZ0ID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpKSB7CisJCWlmIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyKSArCisJCSAgICBpbmZvX2VsZW1lbnQtPmxlbiA+IGxlZnQpIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOCisJCQkgICAgKCJTQ0FOOiBwYXJzZSBmYWlsZWQ6IGluZm9fZWxlbWVudC0+bGVuICsgMiA+IGxlZnQgOiBpbmZvX2VsZW1lbnQtPmxlbisyPSVaZCBsZWZ0PSVkLlxuIiwKKwkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4gKworCQkJICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpLCBsZWZ0KTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJc3dpdGNoIChpbmZvX2VsZW1lbnQtPmlkKSB7CisJCWNhc2UgTUZJRV9UWVBFX1NTSUQ6CisJCQlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwKKwkJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pKSB7CisJCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19FTVBUWV9FU1NJRDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbmV0d29yay0+c3NpZF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sCisJCQkJCQkodTgpIElXX0VTU0lEX01BWF9TSVpFKTsKKwkJCW1lbWNweShuZXR3b3JrLT5zc2lkLCBpbmZvX2VsZW1lbnQtPmRhdGEsCisJCQkgICAgICAgbmV0d29yay0+c3NpZF9sZW4pOworCQkJaWYgKG5ldHdvcmstPnNzaWRfbGVuIDwgSVdfRVNTSURfTUFYX1NJWkUpCisJCQkJbWVtc2V0KG5ldHdvcmstPnNzaWQgKyBuZXR3b3JrLT5zc2lkX2xlbiwgMCwKKwkJCQkgICAgICAgSVdfRVNTSURfTUFYX1NJWkUgLSBuZXR3b3JrLT5zc2lkX2xlbik7CisKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfU1NJRDogJyVzJyBsZW49JWQuXG4iLAorCQkJCQkgICAgIG5ldHdvcmstPnNzaWQsIG5ldHdvcmstPnNzaWRfbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX1JBVEVTOgorI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCXAgPSByYXRlc19zdHI7CisjZW5kaWYKKwkJCW5ldHdvcmstPnJhdGVzX2xlbiA9CisJCQkgICAgbWluKGluZm9fZWxlbWVudC0+bGVuLCBNQVhfUkFURVNfTEVOR1RIKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19sZW47IGkrKykgeworCQkJCW5ldHdvcmstPnJhdGVzW2ldID0gaW5mb19lbGVtZW50LT5kYXRhW2ldOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCQlwICs9IHNucHJpbnRmKHAsCisJCQkJCSAgICAgIHNpemVvZihyYXRlc19zdHIpIC0gKHAgLQorCQkJCQkJCQkgICByYXRlc19zdHIpLAorCQkJCQkgICAgICAiJTAyWCAiLCBuZXR3b3JrLT5yYXRlc1tpXSk7CisjZW5kaWYKKwkJCQlpZiAoaWVlZTgwMjExX2lzX29mZG1fcmF0ZQorCQkJCSAgICAoaW5mb19lbGVtZW50LT5kYXRhW2ldKSkgeworCQkJCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19PRkRNOworCQkJCQlpZiAoaW5mb19lbGVtZW50LT5kYXRhW2ldICYKKwkJCQkJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spCisJCQkJCQluZXR3b3JrLT5mbGFncyAmPQorCQkJCQkJICAgIH5ORVRXT1JLX0hBU19DQ0s7CisJCQkJfQorCQkJfQorCisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX1JBVEVTOiAnJXMnICglZClcbiIsCisJCQkJCSAgICAgcmF0ZXNfc3RyLCBuZXR3b3JrLT5yYXRlc19sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfUkFURVNfRVg6CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQkJcCA9IHJhdGVzX3N0cjsKKyNlbmRpZgorCQkJbmV0d29yay0+cmF0ZXNfZXhfbGVuID0KKwkJCSAgICBtaW4oaW5mb19lbGVtZW50LT5sZW4sIE1BWF9SQVRFU19FWF9MRU5HVEgpOworCQkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPnJhdGVzX2V4X2xlbjsgaSsrKSB7CisJCQkJbmV0d29yay0+cmF0ZXNfZXhbaV0gPSBpbmZvX2VsZW1lbnQtPmRhdGFbaV07CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQkJCXAgKz0gc25wcmludGYocCwKKwkJCQkJICAgICAgc2l6ZW9mKHJhdGVzX3N0cikgLSAocCAtCisJCQkJCQkJCSAgIHJhdGVzX3N0ciksCisJCQkJCSAgICAgICIlMDJYICIsIG5ldHdvcmstPnJhdGVzW2ldKTsKKyNlbmRpZgorCQkJCWlmIChpZWVlODAyMTFfaXNfb2ZkbV9yYXRlCisJCQkJICAgIChpbmZvX2VsZW1lbnQtPmRhdGFbaV0pKSB7CisJCQkJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX09GRE07CisJCQkJCWlmIChpbmZvX2VsZW1lbnQtPmRhdGFbaV0gJgorCQkJCQkgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSykKKwkJCQkJCW5ldHdvcmstPmZsYWdzICY9CisJCQkJCQkgICAgfk5FVFdPUktfSEFTX0NDSzsKKwkJCQl9CisJCQl9CisKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfUkFURVNfRVg6ICclcycgKCVkKVxuIiwKKwkJCQkJICAgICByYXRlc19zdHIsIG5ldHdvcmstPnJhdGVzX2V4X2xlbik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9EU19TRVQ6CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0RTX1NFVDogJWRcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdKTsKKwkJCWlmIChzdGF0cy0+ZnJlcSA9PSBJRUVFODAyMTFfMjRHSFpfQkFORCkKKwkJCQluZXR3b3JrLT5jaGFubmVsID0gaW5mb19lbGVtZW50LT5kYXRhWzBdOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfRkhfU0VUOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9GSF9TRVQ6IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfQ0ZfU0VUOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9DRl9TRVQ6IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfVElNOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9USU06IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfSUJTU19TRVQ6CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0lCU1NfU0VUOiBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0NIQUxMRU5HRToKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQ0hBTExFTkdFOiBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0dFTkVSSUM6CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0dFTkVSSUM6ICVkIGJ5dGVzXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA+PSA0ICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg1MCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGYyICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDEpIHsKKwkJCQluZXR3b3JrLT53cGFfaWVfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuICsgMiwKKwkJCQkJCQkgIE1BWF9XUEFfSUVfTEVOKTsKKwkJCQltZW1jcHkobmV0d29yay0+d3BhX2llLCBpbmZvX2VsZW1lbnQsCisJCQkJICAgICAgIG5ldHdvcmstPndwYV9pZV9sZW4pOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfUlNOOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9SU046ICVkIGJ5dGVzXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCW5ldHdvcmstPnJzbl9pZV9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4gKyAyLAorCQkJCQkJICBNQVhfV1BBX0lFX0xFTik7CisJCQltZW1jcHkobmV0d29yay0+cnNuX2llLCBpbmZvX2VsZW1lbnQsCisJCQkgICAgICAgbmV0d29yay0+cnNuX2llX2xlbik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oInVuc3VwcG9ydGVkIElFICVkXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+aWQpOworCQkJYnJlYWs7CisJCX0KKworCQlsZWZ0IC09IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpICsKKwkJICAgIGluZm9fZWxlbWVudC0+bGVuOworCQlpbmZvX2VsZW1lbnQgPSAoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKikKKwkJICAgICZpbmZvX2VsZW1lbnQtPmRhdGFbaW5mb19lbGVtZW50LT5sZW5dOworCX0KKworCW5ldHdvcmstPm1vZGUgPSAwOworCWlmIChzdGF0cy0+ZnJlcSA9PSBJRUVFODAyMTFfNTJHSFpfQkFORCkKKwkJbmV0d29yay0+bW9kZSA9IElFRUVfQTsKKwllbHNlIHsKKwkJaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19IQVNfT0ZETSkKKwkJCW5ldHdvcmstPm1vZGUgfD0gSUVFRV9HOworCQlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19DQ0spCisJCQluZXR3b3JrLT5tb2RlIHw9IElFRUVfQjsKKwl9CisKKwlpZiAobmV0d29yay0+bW9kZSA9PSAwKSB7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJGaWx0ZXJlZCBvdXQgJyVzICgiIE1BQ19GTVQgIiknICIKKwkJCQkgICAgICJuZXR3b3JrLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLAorCQkJCQkJICBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQkJICAgICBNQUNfQVJHKG5ldHdvcmstPmJzc2lkKSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQobmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pKQorCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0VNUFRZX0VTU0lEOworCisJbWVtY3B5KCZuZXR3b3JrLT5zdGF0cywgc3RhdHMsIHNpemVvZihuZXR3b3JrLT5zdGF0cykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NhbWVfbmV0d29yayhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnNyYywKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqZHN0KQoreworCS8qIEEgbmV0d29yayBpcyBvbmx5IGEgZHVwbGljYXRlIGlmIHRoZSBjaGFubmVsLCBCU1NJRCwgYW5kIEVTU0lECisJICogYWxsIG1hdGNoLiAgV2UgdHJlYXQgYWxsIDxoaWRkZW4+IHdpdGggdGhlIHNhbWUgQlNTSUQgYW5kIGNoYW5uZWwKKwkgKiBhcyBvbmUgbmV0d29yayAqLworCXJldHVybiAoKHNyYy0+c3NpZF9sZW4gPT0gZHN0LT5zc2lkX2xlbikgJiYKKwkJKHNyYy0+Y2hhbm5lbCA9PSBkc3QtPmNoYW5uZWwpICYmCisJCSFtZW1jbXAoc3JjLT5ic3NpZCwgZHN0LT5ic3NpZCwgRVRIX0FMRU4pICYmCisJCSFtZW1jbXAoc3JjLT5zc2lkLCBkc3QtPnNzaWQsIHNyYy0+c3NpZF9sZW4pKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9uZXR3b3JrKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqZHN0LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpzcmMpCit7CisJbWVtY3B5KCZkc3QtPnN0YXRzLCAmc3JjLT5zdGF0cywgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMpKTsKKwlkc3QtPmNhcGFiaWxpdHkgPSBzcmMtPmNhcGFiaWxpdHk7CisJbWVtY3B5KGRzdC0+cmF0ZXMsIHNyYy0+cmF0ZXMsIHNyYy0+cmF0ZXNfbGVuKTsKKwlkc3QtPnJhdGVzX2xlbiA9IHNyYy0+cmF0ZXNfbGVuOworCW1lbWNweShkc3QtPnJhdGVzX2V4LCBzcmMtPnJhdGVzX2V4LCBzcmMtPnJhdGVzX2V4X2xlbik7CisJZHN0LT5yYXRlc19leF9sZW4gPSBzcmMtPnJhdGVzX2V4X2xlbjsKKworCWRzdC0+bW9kZSA9IHNyYy0+bW9kZTsKKwlkc3QtPmZsYWdzID0gc3JjLT5mbGFnczsKKwlkc3QtPnRpbWVfc3RhbXBbMF0gPSBzcmMtPnRpbWVfc3RhbXBbMF07CisJZHN0LT50aW1lX3N0YW1wWzFdID0gc3JjLT50aW1lX3N0YW1wWzFdOworCisJZHN0LT5iZWFjb25faW50ZXJ2YWwgPSBzcmMtPmJlYWNvbl9pbnRlcnZhbDsKKwlkc3QtPmxpc3Rlbl9pbnRlcnZhbCA9IHNyYy0+bGlzdGVuX2ludGVydmFsOworCWRzdC0+YXRpbV93aW5kb3cgPSBzcmMtPmF0aW1fd2luZG93OworCisJbWVtY3B5KGRzdC0+d3BhX2llLCBzcmMtPndwYV9pZSwgc3JjLT53cGFfaWVfbGVuKTsKKwlkc3QtPndwYV9pZV9sZW4gPSBzcmMtPndwYV9pZV9sZW47CisJbWVtY3B5KGRzdC0+cnNuX2llLCBzcmMtPnJzbl9pZSwgc3JjLT5yc25faWVfbGVuKTsKKwlkc3QtPnJzbl9pZV9sZW4gPSBzcmMtPnJzbl9pZV9sZW47CisKKwlkc3QtPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7CisJLyogZHN0LT5sYXN0X2Fzc29jaWF0ZSBpcyBub3Qgb3ZlcndyaXR0ZW4gKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlCisJCQkJCQkgICAgKmllZWUsCisJCQkJCQkgICAgc3RydWN0CisJCQkJCQkgICAgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlCisJCQkJCQkgICAgKmJlYWNvbiwKKwkJCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzCisJCQkJCQkgICAgKnN0YXRzKQoreworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXR3b3JrOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqdGFyZ2V0OworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqb2xkZXN0ID0gTlVMTDsKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCA9ICZiZWFjb24tPmluZm9fZWxlbWVudDsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlJRUVFODAyMTFfREVCVUdfU0NBTigiJyVzJyAoIiBNQUNfRk1UCisJCQkgICAgICIpOiAlYyVjJWMlYyAlYyVjJWMlYy0lYyVjJWMlYyAlYyVjJWMlY1xuIiwKKwkJCSAgICAgZXNjYXBlX2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwKKwkJCQkJICBpbmZvX2VsZW1lbnQtPmxlbiksCisJCQkgICAgIE1BQ19BUkcoYmVhY29uLT5oZWFkZXIuYWRkcjMpLAorCQkJICAgICAoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDEgPDwgMHhmKSkgPyAnMScgOiAnMCcsCisJCQkgICAgIChiZWFjb24tPmNhcGFiaWxpdHkgJiAoMSA8PCAweGUpKSA/ICcxJyA6ICcwJywKKwkJCSAgICAgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxIDw8IDB4ZCkpID8gJzEnIDogJzAnLAorCQkJICAgICAoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDEgPDwgMHhjKSkgPyAnMScgOiAnMCcsCisJCQkgICAgIChiZWFjb24tPmNhcGFiaWxpdHkgJiAoMSA8PCAweGIpKSA/ICcxJyA6ICcwJywKKwkJCSAgICAgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxIDw8IDB4YSkpID8gJzEnIDogJzAnLAorCQkJICAgICAoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDEgPDwgMHg5KSkgPyAnMScgOiAnMCcsCisJCQkgICAgIChiZWFjb24tPmNhcGFiaWxpdHkgJiAoMSA8PCAweDgpKSA/ICcxJyA6ICcwJywKKwkJCSAgICAgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxIDw8IDB4NykpID8gJzEnIDogJzAnLAorCQkJICAgICAoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDEgPDwgMHg2KSkgPyAnMScgOiAnMCcsCisJCQkgICAgIChiZWFjb24tPmNhcGFiaWxpdHkgJiAoMSA8PCAweDUpKSA/ICcxJyA6ICcwJywKKwkJCSAgICAgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxIDw8IDB4NCkpID8gJzEnIDogJzAnLAorCQkJICAgICAoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDEgPDwgMHgzKSkgPyAnMScgOiAnMCcsCisJCQkgICAgIChiZWFjb24tPmNhcGFiaWxpdHkgJiAoMSA8PCAweDIpKSA/ICcxJyA6ICcwJywKKwkJCSAgICAgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxIDw8IDB4MSkpID8gJzEnIDogJzAnLAorCQkJICAgICAoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDEgPDwgMHgwKSkgPyAnMScgOiAnMCcpOworCisJaWYgKGllZWU4MDIxMV9uZXR3b3JrX2luaXQoaWVlZSwgYmVhY29uLCAmbmV0d29yaywgc3RhdHMpKSB7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJEcm9wcGVkICclcycgKCIgTUFDX0ZNVCAiKSB2aWEgJXMuXG4iLAorCQkJCSAgICAgZXNjYXBlX2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwKKwkJCQkJCSAgaW5mb19lbGVtZW50LT5sZW4pLAorCQkJCSAgICAgTUFDX0FSRyhiZWFjb24tPmhlYWRlci5hZGRyMyksCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci4KKwkJCQkJCSAgICAgICBmcmFtZV9jdGwpID09CisJCQkJICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCA/CisJCQkJICAgICAiUFJPQkUgUkVTUE9OU0UiIDogIkJFQUNPTiIpOworCQlyZXR1cm47CisJfQorCisJLyogVGhlIG5ldHdvcmsgcGFyc2VkIGNvcnJlY3RseSAtLSBzbyBub3cgd2Ugc2NhbiBvdXIga25vd24gbmV0d29ya3MKKwkgKiB0byBzZWUgaWYgd2UgY2FuIGZpbmQgaXQgaW4gb3VyIGxpc3QuCisJICoKKwkgKiBOT1RFOiAgVGhpcyBzZWFyY2ggaXMgZGVmaW5pdGVseSBub3Qgb3B0aW1pemVkLiAgT25jZSBpdHMgZG9pbmcKKwkgKiAgICAgICAgdGhlICJyaWdodCB0aGluZyIgd2UnbGwgb3B0aW1pemUgaXQgZm9yIGVmZmljaWVuY3kgaWYKKwkgKiAgICAgICAgbmVjZXNzYXJ5ICovCisKKwkvKiBTZWFyY2ggZm9yIHRoaXMgZW50cnkgaW4gdGhlIGxpc3QgYW5kIHVwZGF0ZSBpdCBpZiBpdCBpcworCSAqIGFscmVhZHkgdGhlcmUuICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXJnZXQsICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGlzX3NhbWVfbmV0d29yayh0YXJnZXQsICZuZXR3b3JrKSkKKwkJCWJyZWFrOworCisJCWlmICgob2xkZXN0ID09IE5VTEwpIHx8CisJCSAgICAodGFyZ2V0LT5sYXN0X3NjYW5uZWQgPCBvbGRlc3QtPmxhc3Rfc2Nhbm5lZCkpCisJCQlvbGRlc3QgPSB0YXJnZXQ7CisJfQorCisJLyogSWYgd2UgZGlkbid0IGZpbmQgYSBtYXRjaCwgdGhlbiBnZXQgYSBuZXcgbmV0d29yayBzbG90IHRvIGluaXRpYWxpemUKKwkgKiB3aXRoIHRoaXMgYmVhY29uJ3MgaW5mb3JtYXRpb24gKi8KKwlpZiAoJnRhcmdldC0+bGlzdCA9PSAmaWVlZS0+bmV0d29ya19saXN0KSB7CisJCWlmIChsaXN0X2VtcHR5KCZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCkpIHsKKwkJCS8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHNsb3RzLCBleHBpcmUgdGhlIG9sZGVzdCAqLworCQkJbGlzdF9kZWwoJm9sZGVzdC0+bGlzdCk7CisJCQl0YXJnZXQgPSBvbGRlc3Q7CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRXhwaXJlZCAnJXMnICgiIE1BQ19GTVQgIikgZnJvbSAiCisJCQkJCSAgICAgIm5ldHdvcmsgbGlzdC5cbiIsCisJCQkJCSAgICAgZXNjYXBlX2Vzc2lkKHRhcmdldC0+c3NpZCwKKwkJCQkJCQkgIHRhcmdldC0+c3NpZF9sZW4pLAorCQkJCQkgICAgIE1BQ19BUkcodGFyZ2V0LT5ic3NpZCkpOworCQl9IGVsc2UgeworCQkJLyogT3RoZXJ3aXNlIGp1c3QgcHVsbCBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KKwkJCXRhcmdldCA9IGxpc3RfZW50cnkoaWVlZS0+bmV0d29ya19mcmVlX2xpc3QubmV4dCwKKwkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaywgbGlzdCk7CisJCQlsaXN0X2RlbChpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdC5uZXh0KTsKKwkJfQorCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiQWRkaW5nICclcycgKCIgTUFDX0ZNVCAiKSB2aWEgJXMuXG4iLAorCQkJCSAgICAgZXNjYXBlX2Vzc2lkKG5ldHdvcmsuc3NpZCwKKwkJCQkJCSAgbmV0d29yay5zc2lkX2xlbiksCisJCQkJICAgICBNQUNfQVJHKG5ldHdvcmsuYnNzaWQpLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuCisJCQkJCQkgICAgICAgZnJhbWVfY3RsKSA9PQorCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgPworCQkJCSAgICAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKKyNlbmRpZgorCQltZW1jcHkodGFyZ2V0LCAmbmV0d29yaywgc2l6ZW9mKCp0YXJnZXQpKTsKKwkJbGlzdF9hZGRfdGFpbCgmdGFyZ2V0LT5saXN0LCAmaWVlZS0+bmV0d29ya19saXN0KTsKKwl9IGVsc2UgeworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiVXBkYXRpbmcgJyVzJyAoIiBNQUNfRk1UICIpIHZpYSAlcy5cbiIsCisJCQkJICAgICBlc2NhcGVfZXNzaWQodGFyZ2V0LT5zc2lkLAorCQkJCQkJICB0YXJnZXQtPnNzaWRfbGVuKSwKKwkJCQkgICAgIE1BQ19BUkcodGFyZ2V0LT5ic3NpZCksCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci4KKwkJCQkJCSAgICAgICBmcmFtZV9jdGwpID09CisJCQkJICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCA/CisJCQkJICAgICAiUFJPQkUgUkVTUE9OU0UiIDogIkJFQUNPTiIpOworCQl1cGRhdGVfbmV0d29yayh0YXJnZXQsICZuZXR3b3JrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3J4X21ndChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlciwKKwkJICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpCit7CisJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpIHsKKwljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgorCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgQVNTT0NJQVRJT04gUkVTUE9OU0UgKCVkKVxuIiwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQOgorCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgUkVBU1NPQ0lBVElPTiBSRVNQT05TRSAoJWQpXG4iLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQOgorCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgUFJPQkUgUkVTUE9OU0UgKCVkKVxuIiwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJQcm9iZSByZXNwb25zZVxuIik7CisJCWllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKGllZWUsCisJCQkJCQkgKHN0cnVjdAorCQkJCQkJICBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKikKKwkJCQkJCSBoZWFkZXIsIHN0YXRzKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUU4MDIxMV9TVFlQRV9CRUFDT046CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJyZWNlaXZlZCBCRUFDT04gKCVkKVxuIiwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJCZWFjb25cbiIpOworCQlpZWVlODAyMTFfcHJvY2Vzc19wcm9iZV9yZXNwb25zZShpZWVlLAorCQkJCQkJIChzdHJ1Y3QKKwkJCQkJCSAgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopCisJCQkJCQkgaGVhZGVyLCBzdGF0cyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoInJlY2VpdmVkIFVOS05PV04gKCVkKVxuIiwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisJCUlFRUU4MDIxMV9XQVJOSU5HKCIlczogVW5rbm93biBtYW5hZ2VtZW50IHBhY2tldDogJWRcbiIsCisJCQkJICBpZWVlLT5kZXYtPm5hbWUsCisJCQkJICBXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpOworCQlicmVhazsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3J4X21ndCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yeCk7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWFhZmYzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtMCwwICsxLDQyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDAzIC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgorCisvKgorCis4MDIuMTEgRGF0YSBGcmFtZQorCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBGcmFtZSAgfCAgZmNzIHwKKyAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgIHwtLS0tLS0nCitUb3RhbDogMjggbm9uLWRhdGEgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLS0tLS4tLS0tJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgLi0gJ0ZyYW1lIGRhdGEnIGV4cGFuZHMgdG8gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAgICAgICB8CisgICAgICAgVgorICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDEgICB8ICAxICAgfCAgICAxICAgIHwgICAgMyAgICAgfCAgMiAgIHwgIDAtMjMwNCB8CisgICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfAorRGVzYy4gfCBTTkFQIHwgU05BUCB8IENvbnRyb2wgfEV0aCBUdW5uZWx8IFR5cGUgfCBJUCAgICAgIHwKKyAgICAgIHwgRFNBUCB8IFNTQVAgfCAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwgUGFja2V0ICB8CisgICAgICB8IDB4QUEgfCAweEFBIHwweDAzIChVSSl8MHgwMC0wMC1GOHwgICAgICB8ICAgICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgIHwKK1RvdGFsOiA4IG5vbi1kYXRhIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgIGAtLS0tLi0tLS0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAuLSAnSVAgUGFja2V0JyBleHBhbmRzLCBpZiBXRVAgZW5hYmxlZCwgdG8gPC0tJworICAgICAgIHwKKyAgICAgICBWCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICA0ICB8ICAgMC0yMjk2ICB8ICA0ICB8CisgICAgICB8LS0tLS18LS0tLS0tLS0tLS18LS0tLS18CitEZXNjLiB8IElWICB8IEVuY3J5cHRlZCB8IElDViB8CisgICAgICB8ICAgICB8IElQIFBhY2tldCB8ICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCitUb3RhbDogOCBub24tZGF0YSBieXRlcworCis4MDIuMyBFdGhlcm5ldCBEYXRhIEZyYW1lCisKKyAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgICA2ICAgfCAgIDYgICB8ICAyICAgfCAgVmFyaWFibGUgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS0tfC0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLXwKK0Rlc2MuIHwgRGVzdC4gfCBTb3VyY2V8IFR5cGUgfCBJUCBQYWNrZXQgfCAgZmNzIHwKKyAgICAgIHwgIE1BQyAgfCAgTUFDICB8ICAgICAgfCAgICAgICAgICAgfCAgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKK1RvdGFsOiAxOCBub24tZGF0YSBieXRlcworCitJbiB0aGUgZXZlbnQgdGhhdCBmcmFnbWVudGF0aW9uIGlzIHJlcXVpcmVkLCB0aGUgaW5jb21pbmcgcGF5bG9hZCBpcyBzcGxpdCBpbnRvCitOIHBhcnRzIG9mIHNpemUgaWVlZS0+ZnRzLiAgVGhlIGZpcnN0IGZyYWdtZW50IGNvbnRhaW5zIHRoZSBTTkFQIGhlYWRlciBhbmQgdGhlCityZW1haW5pbmcgcGFja2V0cyBhcmUganVzdCBkYXRhLgorCitJZiBlbmNyeXB0aW9uIGlzIGVuYWJsZWQsIGVhY2ggZnJhZ21lbnQgcGF5bG9hZCBzaXplIGlzIHJlZHVjZWQgYnkgZW5vdWdoIHNwYWNlCit0byBhZGQgdGhlIHByZWZpeCBhbmQgcG9zdGZpeCAoSVYgYW5kIElDViB0b3RhbGxpbmcgOCBieXRlcyBpbiB0aGUgY2FzZSBvZiBXRVApCitTbyBpZiB5b3UgaGF2ZSAxNTAwIGJ5dGVzIG9mIHBheWxvYWQgd2l0aCBpZWVlLT5mdHMgc2V0IHRvIDUwMCB3aXRob3V0CitlbmNyeXB0aW9uIGl0IHdpbGwgdGFrZSAzIGZyYW1lcy4gIFdpdGggV0VQIGl0IHdpbGwgdGFrZSA0IGZyYW1lcyBhcyB0aGUKK3BheWxvYWQgb2YgZWFjaCBmcmFtZSBpcyByZWR1Y2VkIHRvIDQ5MiBieXRlcy4KKworKiBTS0IgdmlzdWFsaXphdGlvbgorKgorKiAgLC0gc2tiLT5kYXRhCisqIHwKKyogfCAgICBFVEhFUk5FVCBIRUFERVIgICAgICAgICwtPC0tIFBBWUxPQUQKKyogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDE0IGJ5dGVzIGZyb20gc2tiLT5kYXRhCisqIHwgIDIgYnl0ZXMgZm9yIFR5cGUgLS0+ICxULiB8ICAgICAoc2l6ZW9mIGV0aGhkcikKKyogfCAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyogfCwtRGVzdC4tLS4gLC0tU3JjLi0tLS4gfCB8IHwKKyogfCAgNiBieXRlc3wgfCA2IGJ5dGVzIHwgfCB8IHwKKyogdiAgICAgICAgIHwgfCAgICAgICAgIHwgfCB8IHwKKyogMCAgICAgICAgIHwgdiAgICAgICAxIHwgdiB8IHYgICAgICAgICAgIDIKKyogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1CisqICAgICBeICAgICB8IF4gICAgICAgICB8IF4gfAorKiAgICAgfCAgICAgfCB8ICAgICAgICAgfCB8IHwKKyogICAgIHwgICAgIHwgfCAgICAgICAgIHwgYFQnIDwtLS0tIDIgYnl0ZXMgZm9yIFR5cGUKKyogICAgIHwgICAgIHwgfCAgICAgICAgIHwKKyogICAgIHwgICAgIHwgJy0tLVNOQVAtLScgPC0tLS0tLS0tIDYgYnl0ZXMgZm9yIFNOQVAKKyogICAgIHwgICAgIHwKKyogICAgIGAtSVYtLScgPC0tLS0tLS0tLS0tLS0tLS0tLS0tIDQgYnl0ZXMgZm9yIElWIChXRVApCisqCisqICAgICAgU05BUCBIRUFERVIKKyoKKyovCisKK3N0YXRpYyB1OCBQODAyXzFIX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4ZjggfTsKK3N0YXRpYyB1OCBSRkMxMDQyX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4MDAgfTsKKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX3B1dF9zbmFwKHU4ICogZGF0YSwgdTE2IGhfcHJvdG8pCit7CisJc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciAqc25hcDsKKwl1OCAqb3VpOworCisJc25hcCA9IChzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyICopZGF0YTsKKwlzbmFwLT5kc2FwID0gMHhhYTsKKwlzbmFwLT5zc2FwID0gMHhhYTsKKwlzbmFwLT5jdHJsID0gMHgwMzsKKworCWlmIChoX3Byb3RvID09IDB4ODEzNyB8fCBoX3Byb3RvID09IDB4ODBmMykKKwkJb3VpID0gUDgwMl8xSF9PVUk7CisJZWxzZQorCQlvdWkgPSBSRkMxMDQyX09VSTsKKwlzbmFwLT5vdWlbMF0gPSBvdWlbMF07CisJc25hcC0+b3VpWzFdID0gb3VpWzFdOworCXNuYXAtPm91aVsyXSA9IG91aVsyXTsKKworCSoodTE2ICopIChkYXRhICsgU05BUF9TSVpFKSA9IGh0b25zKGhfcHJvdG8pOworCisJcmV0dXJuIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqZnJhZywgaW50IGhkcl9sZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisJaW50IHJlczsKKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfQ1JZUFRfVEtJUAorCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXI7CisKKwlpZiAoaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgJiYKKwkgICAgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJiBzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIlRLSVAiKSA9PSAwKSB7CisJCWhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWZyYWctPmRhdGE7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVEtJUCBjb3VudGVybWVhc3VyZXM6IGRyb3BwZWQgIgorCQkJICAgICAgICJUWCBwYWNrZXQgdG8gIiBNQUNfRk1UICJcbiIsCisJCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBNQUNfQVJHKGhlYWRlci0+YWRkcjEpKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorI2VuZGlmCisJLyogVG8gZW5jcnlwdCwgZnJhbWUgZm9ybWF0IGlzOgorCSAqIElWICg0IGJ5dGVzKSwgY2xlYXIgcGF5bG9hZCAoaW5jbHVkaW5nIFNOQVApLCBJQ1YgKDQgYnl0ZXMpICovCisKKwkvLyBQUjogRklYTUU6IENvcGllZCBmcm9tIGhvc3RhcC4gQ2hlY2sgZnJhZ21lbnRhdGlvbi9NU0RVL01QRFUgZW5jcnlwdGlvbi4KKwkvKiBIb3N0LWJhc2VkIElFRUUgODAyLjExIGZyYWdtZW50YXRpb24gZm9yIFRYIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLCBzbworCSAqIGNhbGwgYm90aCBNU0RVIGFuZCBNUERVIGVuY3J5cHRpb24gZnVuY3Rpb25zIGZyb20gaGVyZS4gKi8KKwlhdG9taWNfaW5jKCZjcnlwdC0+cmVmY250KTsKKwlyZXMgPSAwOworCWlmIChjcnlwdC0+b3BzLT5lbmNyeXB0X21zZHUpCisJCXJlcyA9IGNyeXB0LT5vcHMtPmVuY3J5cHRfbXNkdShmcmFnLCBoZHJfbGVuLCBjcnlwdC0+cHJpdik7CisJaWYgKHJlcyA9PSAwICYmIGNyeXB0LT5vcHMtPmVuY3J5cHRfbXBkdSkKKwkJcmVzID0gY3J5cHQtPm9wcy0+ZW5jcnlwdF9tcGR1KGZyYWcsIGhkcl9sZW4sIGNyeXB0LT5wcml2KTsKKworCWF0b21pY19kZWMoJmNyeXB0LT5yZWZjbnQpOworCWlmIChyZXMgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbmNyeXB0aW9uIGZhaWxlZDogbGVuPSVkLlxuIiwKKwkJICAgICAgIGllZWUtPmRldi0+bmFtZSwgZnJhZy0+bGVuKTsKKwkJaWVlZS0+aWVlZV9zdGF0cy50eF9kaXNjYXJkcysrOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3R4Yl9mcmVlKHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIpCit7CisJaW50IGk7CisJaWYgKHVubGlrZWx5KCF0eGIpKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IHR4Yi0+bnJfZnJhZ3M7IGkrKykKKwkJaWYgKHR4Yi0+ZnJhZ21lbnRzW2ldKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkodHhiLT5mcmFnbWVudHNbaV0pOworCWtmcmVlKHR4Yik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqaWVlZTgwMjExX2FsbG9jX3R4YihpbnQgbnJfZnJhZ3MsIGludCB0eGJfc2l6ZSwKKwkJCQkJCSBpbnQgZ2ZwX21hc2spCit7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKKwlpbnQgaTsKKwl0eGIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3R4YikgKyAoc2l6ZW9mKHU4ICopICogbnJfZnJhZ3MpLAorCQkgICAgICBnZnBfbWFzayk7CisJaWYgKCF0eGIpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KHR4YiwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdHhiKSk7CisJdHhiLT5ucl9mcmFncyA9IG5yX2ZyYWdzOworCXR4Yi0+ZnJhZ19zaXplID0gdHhiX3NpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZnJhZ3M7IGkrKykgeworCQl0eGItPmZyYWdtZW50c1tpXSA9IGRldl9hbGxvY19za2IodHhiX3NpemUpOworCQlpZiAodW5saWtlbHkoIXR4Yi0+ZnJhZ21lbnRzW2ldKSkgeworCQkJaS0tOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHVubGlrZWx5KGkgIT0gbnJfZnJhZ3MpKSB7CisJCXdoaWxlIChpID49IDApCisJCQlkZXZfa2ZyZWVfc2tiX2FueSh0eGItPmZyYWdtZW50c1tpLS1dKTsKKwkJa2ZyZWUodHhiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB0eGI7Cit9CisKKy8qIFNLQnMgYXJlIGFkZGVkIHRvIHRoZSBpZWVlLT50eF9xdWV1ZS4gKi8KK2ludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqZnJhZ19oZHI7CisJaW50IGksIGJ5dGVzX3Blcl9mcmFnLCBucl9mcmFncywgYnl0ZXNfbGFzdF9mcmFnLCBmcmFnX3NpemU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmaWVlZS0+c3RhdHM7CisJaW50IGV0aGVyX3R5cGUsIGVuY3J5cHQ7CisJaW50IGJ5dGVzLCBmYywgaGRyX2xlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2ZyYWc7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgaGVhZGVyID0gewkvKiBFbnN1cmUgemVybyBpbml0aWFsaXplZCAqLworCQkuZHVyYXRpb25faWQgPSAwLAorCQkuc2VxX2N0bCA9IDAKKwl9OworCXU4IGRlc3RbRVRIX0FMRU5dLCBzcmNbRVRIX0FMRU5dOworCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB0aGVyZSBpcyBubyBkcml2ZXIgaGFuZGxlciB0byB0YWtlIHRoZSBUWEIsIGRvbnQnIGJvdGhlcgorCSAqIGNyZWF0aW5nIGl0Li4uICovCisJaWYgKCFpZWVlLT5oYXJkX3N0YXJ0X3htaXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIHhtaXQgaGFuZGxlci5cbiIsIGllZWUtPmRldi0+bmFtZSk7CisJCWdvdG8gc3VjY2VzczsKKwl9CisKKwlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBTTkFQX1NJWkUgKyBzaXplb2YodTE2KSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNrYiB0b28gc21hbGwgKCVkKS5cbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwkJZ290byBzdWNjZXNzOworCX0KKworCWV0aGVyX3R5cGUgPSBudG9ocygoKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGEpLT5oX3Byb3RvKTsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKworCWVuY3J5cHQgPSAhKGV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFICYmIGllZWUtPmllZWU4MDJfMXgpICYmCisJICAgIGllZWUtPmhvc3RfZW5jcnlwdCAmJiBjcnlwdCAmJiBjcnlwdC0+b3BzOworCisJaWYgKCFlbmNyeXB0ICYmIGllZWUtPmllZWU4MDJfMXggJiYKKwkgICAgaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCAmJiBldGhlcl90eXBlICE9IEVUSF9QX1BBRSkgeworCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQlnb3RvIHN1Y2Nlc3M7CisJfQorCisJLyogU2F2ZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyAqLworCW1lbWNweSgmZGVzdCwgc2tiLT5kYXRhLCBFVEhfQUxFTik7CisJbWVtY3B5KCZzcmMsIHNrYi0+ZGF0YSArIEVUSF9BTEVOLCBFVEhfQUxFTik7CisKKwkvKiBBZHZhbmNlIHRoZSBTS0IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYXlsb2FkICovCisJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCisJLyogRGV0ZXJtaW5lIHRvdGFsIGFtb3VudCBvZiBzdG9yYWdlIHJlcXVpcmVkIGZvciBUWEIgcGFja2V0cyAqLworCWJ5dGVzID0gc2tiLT5sZW4gKyBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKKworCWlmIChlbmNyeXB0KQorCQlmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX0RBVEEgfAorCQkgICAgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEOworCWVsc2UKKwkJZmMgPSBJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9TVFlQRV9EQVRBOworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9UT0RTOworCQkvKiBUbyBEUzogQWRkcjEgPSBCU1NJRCwgQWRkcjIgPSBTQSwKKwkJICAgQWRkcjMgPSBEQSAqLworCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgaWVlZS0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjIsICZzcmMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsICZkZXN0LCBFVEhfQUxFTik7CisJfSBlbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKKwkJLyogbm90IEZyb20vVG8gRFM6IEFkZHIxID0gREEsIEFkZHIyID0gU0EsCisJCSAgIEFkZHIzID0gQlNTSUQgKi8KKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjEsIGRlc3QsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjIsIHNyYywgRVRIX0FMRU4pOworCQltZW1jcHkoJmhlYWRlci5hZGRyMywgaWVlZS0+YnNzaWQsIEVUSF9BTEVOKTsKKwl9CisJaGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KGZjKTsKKwloZHJfbGVuID0gSUVFRTgwMjExXzNBRERSX0xFTjsKKworCS8qIERldGVybWluZSBmcmFnbWVudGF0aW9uIHNpemUgYmFzZWQgb24gZGVzdGluYXRpb24gKG11bHRpY2FzdAorCSAqIGFuZCBicm9hZGNhc3QgYXJlIG5vdCBmcmFnbWVudGVkKSAqLworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSB8fCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkKKwkJZnJhZ19zaXplID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UKKwkJZnJhZ19zaXplID0gaWVlZS0+ZnRzOworCisJLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBwYXlsb2FkIHBlciBmcmFnbWVudC4gIFJlZ2FyZGxlc3Mgb2YgaWYKKwkgKiB0aGlzIHN0YWNrIGlzIHByb3ZpZGluZyB0aGUgZnVsbCA4MDIuMTEgaGVhZGVyLCBvbmUgd2lsbAorCSAqIGV2ZW50dWFsbHkgYmUgYWZmaXhlZCB0byB0aGlzIGZyYWdtZW50IC0tIHNvIHdlIG11c3QgYWNjb3VudCBmb3IKKwkgKiBpdCB3aGVuIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgcGF5bG9hZCBzcGFjZS4gKi8KKwlieXRlc19wZXJfZnJhZyA9IGZyYWdfc2l6ZSAtIElFRUU4MDIxMV8zQUREUl9MRU47CisJaWYgKGllZWUtPmNvbmZpZyAmCisJICAgIChDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTIHwgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUykpCisJCWJ5dGVzX3Blcl9mcmFnIC09IElFRUU4MDIxMV9GQ1NfTEVOOworCisJLyogRWFjaCBmcmFnbWVudCBtYXkgbmVlZCB0byBoYXZlIHJvb20gZm9yIGVuY3J5cHRpb25nIHByZS9wb3N0Zml4ICovCisJaWYgKGVuY3J5cHQpCisJCWJ5dGVzX3Blcl9mcmFnIC09IGNyeXB0LT5vcHMtPmV4dHJhX3ByZWZpeF9sZW4gKworCQkgICAgY3J5cHQtPm9wcy0+ZXh0cmFfcG9zdGZpeF9sZW47CisKKwkvKiBOdW1iZXIgb2YgZnJhZ21lbnRzIGlzIHRoZSB0b3RhbCBieXRlc19wZXJfZnJhZyAvCisJICogcGF5bG9hZF9wZXJfZnJhZ21lbnQgKi8KKwlucl9mcmFncyA9IGJ5dGVzIC8gYnl0ZXNfcGVyX2ZyYWc7CisJYnl0ZXNfbGFzdF9mcmFnID0gYnl0ZXMgJSBieXRlc19wZXJfZnJhZzsKKwlpZiAoYnl0ZXNfbGFzdF9mcmFnKQorCQlucl9mcmFncysrOworCWVsc2UKKwkJYnl0ZXNfbGFzdF9mcmFnID0gYnl0ZXNfcGVyX2ZyYWc7CisKKwkvKiBXaGVuIHdlIGFsbG9jYXRlIHRoZSBUWEIgd2UgYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciB0aGUgcmVzZXJ2ZQorCSAqIGFuZCBmdWxsIGZyYWdtZW50IGJ5dGVzIChieXRlc19wZXJfZnJhZyBkb2Vzbid0IGluY2x1ZGUgcHJlZml4LAorCSAqIHBvc3RmaXgsIGhlYWRlciwgRkNTLCBldGMuKSAqLworCXR4YiA9IGllZWU4MDIxMV9hbGxvY190eGIobnJfZnJhZ3MsIGZyYWdfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKHVubGlrZWx5KCF0eGIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCXR4Yi0+ZW5jcnlwdGVkID0gZW5jcnlwdDsKKwl0eGItPnBheWxvYWRfc2l6ZSA9IGJ5dGVzOworCisJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyBpKyspIHsKKwkJc2tiX2ZyYWcgPSB0eGItPmZyYWdtZW50c1tpXTsKKworCQlpZiAoZW5jcnlwdCkKKwkJCXNrYl9yZXNlcnZlKHNrYl9mcmFnLCBjcnlwdC0+b3BzLT5leHRyYV9wcmVmaXhfbGVuKTsKKworCQlmcmFnX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYl9wdXQoc2tiX2ZyYWcsIGhkcl9sZW4pOworCQltZW1jcHkoZnJhZ19oZHIsICZoZWFkZXIsIGhkcl9sZW4pOworCisJCS8qIElmIHRoaXMgaXMgbm90IHRoZSBsYXN0IGZyYWdtZW50LCB0aGVuIGFkZCB0aGUgTU9SRUZSQUdTCisJCSAqIGJpdCB0byB0aGUgZnJhbWUgY29udHJvbCAqLworCQlpZiAoaSAhPSBucl9mcmFncyAtIDEpIHsKKwkJCWZyYWdfaGRyLT5mcmFtZV9jdGwgPQorCQkJICAgIGNwdV90b19sZTE2KGZjIHwgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKTsKKwkJCWJ5dGVzID0gYnl0ZXNfcGVyX2ZyYWc7CisJCX0gZWxzZSB7CisJCQkvKiBUaGUgbGFzdCBmcmFnbWVudCB0YWtlcyB0aGUgcmVtYWluaW5nIGxlbmd0aCAqLworCQkJYnl0ZXMgPSBieXRlc19sYXN0X2ZyYWc7CisJCX0KKworCQkvKiBQdXQgYSBTTkFQIGhlYWRlciBvbiB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KKwkJaWYgKGkgPT0gMCkgeworCQkJaWVlZTgwMjExX3B1dF9zbmFwKHNrYl9wdXQKKwkJCQkJICAgKHNrYl9mcmFnLCBTTkFQX1NJWkUgKyBzaXplb2YodTE2KSksCisJCQkJCSAgIGV0aGVyX3R5cGUpOworCQkJYnl0ZXMgLT0gU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7CisJCX0KKworCQltZW1jcHkoc2tiX3B1dChza2JfZnJhZywgYnl0ZXMpLCBza2ItPmRhdGEsIGJ5dGVzKTsKKworCQkvKiBBZHZhbmNlIHRoZSBTS0IuLi4gKi8KKwkJc2tiX3B1bGwoc2tiLCBieXRlcyk7CisKKwkJLyogRW5jcnlwdGlvbiByb3V0aW5lIHdpbGwgbW92ZSB0aGUgaGVhZGVyIGZvcndhcmQgaW4gb3JkZXIKKwkJICogdG8gaW5zZXJ0IHRoZSBJViBiZXR3ZWVuIHRoZSBoZWFkZXIgYW5kIHRoZSBwYXlsb2FkICovCisJCWlmIChlbmNyeXB0KQorCQkJaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiX2ZyYWcsIGhkcl9sZW4pOworCQlpZiAoaWVlZS0+Y29uZmlnICYKKwkJICAgIChDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTIHwgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUykpCisJCQlza2JfcHV0KHNrYl9mcmFnLCA0KTsKKwl9CisKKyAgICAgIHN1Y2Nlc3M6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCWlmICh0eGIpIHsKKwkJaWYgKCgqaWVlZS0+aGFyZF9zdGFydF94bWl0KSAodHhiLCBkZXYpID09IDApIHsKKwkJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gdHhiLT5wYXlsb2FkX3NpemU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZWVlODAyMTFfdHhiX2ZyZWUodHhiKTsKKwl9CisKKwlyZXR1cm4gMDsKKworICAgICAgZmFpbGVkOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3RhdHMtPnR4X2Vycm9ycysrOworCXJldHVybiAxOworCit9CisKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3R4Yl9mcmVlKTsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ODgyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC0wLDAgKzEsNDY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgQ29weXJpZ2h0KGMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgV0VQIGVuYWJsZW1lbnQgY29kZSBwcm92aWRlZCBieSB0aGUKKyAgSG9zdCBBUCBwcm9qZWN0IGhvc3RhcC1kcml2ZXJzIHYwLjEuMworICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAgPGprbWFsaW5lQGNjLmh1dC5maT4KKyAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKmllZWU4MDIxMV9tb2Rlc1tdID0geworCSI/IiwgImEiLCAiYiIsICJhYiIsICJnIiwgImFnIiwgImJnIiwgImFiZyIKK307CisKKyNkZWZpbmUgTUFYX0NVU1RPTV9MRU4gNjQKK3N0YXRpYyBpbmxpbmUgY2hhciAqaXB3MjEwMF90cmFuc2xhdGVfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgY2hhciAqc3RhcnQsIGNoYXIgKnN0b3AsCisJCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKK3sKKwljaGFyIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl07CisJY2hhciAqcDsKKwlzdHJ1Y3QgaXdfZXZlbnQgaXdlOworCWludCBpLCBqOworCXU4IG1heF9yYXRlLCByYXRlOworCisJLyogRmlyc3QgZW50cnkgKk1VU1QqIGJlIHRoZSBBUCBNQUMgYWRkcmVzcyAqLworCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbmV0d29yay0+YnNzaWQsIEVUSF9BTEVOKTsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisKKwkvKiBSZW1haW5pbmcgZW50cmllcyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgd2UgcHJvdmlkZSB0aGVtICovCisKKwkvKiBBZGQgdGhlIEVTU0lEICovCisJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwlpd2UudS5kYXRhLmZsYWdzID0gMTsKKwlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0VNUFRZX0VTU0lEKSB7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKCI8aGlkZGVuPiIpOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCAiPGhpZGRlbj4iKTsKKwl9IGVsc2UgeworCQlpd2UudS5kYXRhLmxlbmd0aCA9IG1pbihuZXR3b3JrLT5zc2lkX2xlbiwgKHU4KSAzMik7CisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIG5ldHdvcmstPnNzaWQpOworCX0KKworCS8qIEFkZCB0aGUgcHJvdG9jb2wgbmFtZSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXTkFNRTsKKwlzbnByaW50Zihpd2UudS5uYW1lLCBJRk5BTVNJWiwgIklFRUUgODAyLjExJXMiLAorCQkgaWVlZTgwMjExX21vZGVzW25ldHdvcmstPm1vZGVdKTsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9DSEFSX0xFTik7CisKKwkvKiBBZGQgbW9kZSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKwlpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmIChXTEFOX0NBUEFCSUxJVFlfRVNTIHwgV0xBTl9DQVBBQklMSVRZX0lCU1MpKSB7CisJCWlmIChuZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0VTUykKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwkJZWxzZQorCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworCX0KKworCS8qIEFkZCBmcmVxdWVuY3kvY2hhbm5lbCAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKy8qCWl3ZS51LmZyZXEubSA9IGllZWU4MDIxMV9mcmVxdWVuY3kobmV0d29yay0+Y2hhbm5lbCwgbmV0d29yay0+bW9kZSk7CisJaXdlLnUuZnJlcS5lID0gMzsgKi8KKwlpd2UudS5mcmVxLm0gPSBuZXR3b3JrLT5jaGFubmVsOworCWl3ZS51LmZyZXEuZSA9IDA7CisJaXdlLnUuZnJlcS5pID0gMDsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisKKwkvKiBBZGQgZW5jcnlwdGlvbiBjYXBhYmlsaXR5ICovCisJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJaWYgKG5ldHdvcmstPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkKKwkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCWVsc2UKKwkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgbmV0d29yay0+c3NpZCk7CisKKwkvKiBBZGQgYmFzaWMgYW5kIGV4dGVuZGVkIHJhdGVzICovCisJbWF4X3JhdGUgPSAwOworCXAgPSBjdXN0b207CisJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwgIiBSYXRlcyAoTWIvcyk6ICIpOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgbmV0d29yay0+cmF0ZXNfbGVuOykgeworCQlpZiAoaiA8IG5ldHdvcmstPnJhdGVzX2V4X2xlbiAmJgorCQkgICAgKChuZXR3b3JrLT5yYXRlc19leFtqXSAmIDB4N0YpIDwKKwkJICAgICAobmV0d29yay0+cmF0ZXNbaV0gJiAweDdGKSkpCisJCQlyYXRlID0gbmV0d29yay0+cmF0ZXNfZXhbaisrXSAmIDB4N0Y7CisJCWVsc2UKKwkJCXJhdGUgPSBuZXR3b3JrLT5yYXRlc1tpKytdICYgMHg3RjsKKwkJaWYgKHJhdGUgPiBtYXhfcmF0ZSkKKwkJCW1heF9yYXRlID0gcmF0ZTsKKwkJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJCSAgICAgICIlZCVzICIsIHJhdGUgPj4gMSwgKHJhdGUgJiAxKSA/ICIuNSIgOiAiIik7CisJfQorCWZvciAoOyBqIDwgbmV0d29yay0+cmF0ZXNfZXhfbGVuOyBqKyspIHsKKwkJcmF0ZSA9IG5ldHdvcmstPnJhdGVzX2V4W2pdICYgMHg3RjsKKwkJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJCSAgICAgICIlZCVzICIsIHJhdGUgPj4gMSwgKHJhdGUgJiAxKSA/ICIuNSIgOiAiIik7CisJCWlmIChyYXRlID4gbWF4X3JhdGUpCisJCQltYXhfcmF0ZSA9IHJhdGU7CisJfQorCisJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworCWl3ZS51LmJpdHJhdGUuZml4ZWQgPSBpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwlpd2UudS5iaXRyYXRlLnZhbHVlID0gbWF4X3JhdGUgKiA1MDAwMDA7CisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfUEFSQU1fTEVOKTsKKworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKKwlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7CisKKwkvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCisJLyogVE9ETzogRml4IHRoZXNlIHZhbHVlcy4uLiAqLworCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwlpd2UudS5xdWFsLnF1YWwgPSBuZXR3b3JrLT5zdGF0cy5zaWduYWw7CisJaXdlLnUucXVhbC5sZXZlbCA9IG5ldHdvcmstPnN0YXRzLnJzc2k7CisJaXdlLnUucXVhbC5ub2lzZSA9IG5ldHdvcmstPnN0YXRzLm5vaXNlOworCWl3ZS51LnF1YWwudXBkYXRlZCA9IG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLOworCWlmICghKG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfUlNTSSkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0xFVkVMX0lOVkFMSUQ7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19OT0lTRSkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwpKQorCQlpd2UudS5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9RVUFMX0lOVkFMSUQ7CisKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisKKwlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwlwID0gY3VzdG9tOworCisJaXdlLnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOworCWlmIChpd2UudS5kYXRhLmxlbmd0aCkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKworCWlmIChpZWVlLT53cGFfZW5hYmxlZCAmJiBuZXR3b3JrLT53cGFfaWVfbGVuKSB7CisJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOICogMiArIDMwXTsKKworCQl1OCAqcCA9IGJ1ZjsKKwkJcCArPSBzcHJpbnRmKHAsICJ3cGFfaWU9Iik7CisJCWZvciAoaSA9IDA7IGkgPCBuZXR3b3JrLT53cGFfaWVfbGVuOyBpKyspIHsKKwkJCXAgKz0gc3ByaW50ZihwLCAiJTAyeCIsIG5ldHdvcmstPndwYV9pZVtpXSk7CisJCX0KKworCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKKwl9CisKKwlpZiAoaWVlZS0+d3BhX2VuYWJsZWQgJiYgbmV0d29yay0+cnNuX2llX2xlbikgeworCQljaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTiAqIDIgKyAzMF07CisKKwkJdTggKnAgPSBidWY7CisJCXAgKz0gc3ByaW50ZihwLCAicnNuX2llPSIpOworCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+cnNuX2llX2xlbjsgaSsrKSB7CisJCQlwICs9IHNwcmludGYocCwgIiUwMngiLCBuZXR3b3JrLT5yc25faWVbaV0pOworCQl9CisKKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IElXRVZDVVNUT007CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisJfQorCisJLyogQWRkIEVYVFJBOiBBZ2UgdG8gZGlzcGxheSBzZWNvbmRzIHNpbmNlIGxhc3QgYmVhY29uL3Byb2JlIHJlc3BvbnNlCisJICogZm9yIGdpdmVuIG5ldHdvcmsuICovCisJaXdlLmNtZCA9IElXRVZDVVNUT007CisJcCA9IGN1c3RvbTsKKwlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLAorCQkgICAgICAiIExhc3QgYmVhY29uOiAlbHVtcyBhZ28iLAorCQkgICAgICAoamlmZmllcyAtIG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkgLyAoSFogLyAxMDApKTsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworCisJcmV0dXJuIHN0YXJ0OworfQorCitpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcms7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNoYXIgKmV2ID0gZXh0cmE7CisJY2hhciAqc3RvcCA9IGV2ICsgSVdfU0NBTl9NQVhfREFUQTsKKwlpbnQgaSA9IDA7CisKKwlJRUVFODAyMTFfREVCVUdfV1goIkdldHRpbmcgc2NhblxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShuZXR3b3JrLCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CisJCWkrKzsKKwkJaWYgKGllZWUtPnNjYW5fYWdlID09IDAgfHwKKwkJICAgIHRpbWVfYWZ0ZXIobmV0d29yay0+bGFzdF9zY2FubmVkICsgaWVlZS0+c2Nhbl9hZ2UsIGppZmZpZXMpKQorCQkJZXYgPSBpcHcyMTAwX3RyYW5zbGF0ZV9zY2FuKGllZWUsIGV2LCBzdG9wLCBuZXR3b3JrKTsKKwkJZWxzZQorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk5vdCBzaG93aW5nIG5ldHdvcmsgJyVzICgiCisJCQkJCSAgICAgTUFDX0ZNVCAiKScgZHVlIHRvIGFnZSAoJWx1bXMpLlxuIiwKKwkJCQkJICAgICBlc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwKKwkJCQkJCQkgIG5ldHdvcmstPnNzaWRfbGVuKSwKKwkJCQkJICAgICBNQUNfQVJHKG5ldHdvcmstPmJzc2lkKSwKKwkJCQkJICAgICAoamlmZmllcyAtCisJCQkJCSAgICAgIG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkgLyAoSFogLworCQkJCQkJCQkJMTAwKSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBldiAtIGV4dHJhOworCXdycXUtPmRhdGEuZmxhZ3MgPSAwOworCisJSUVFRTgwMjExX0RFQlVHX1dYKCJleGl0OiAlZCBuZXR3b3JrcyByZXR1cm5lZC5cbiIsIGkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleWJ1ZikKK3sKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICYod3JxdS0+ZW5jb2RpbmcpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisJc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7CisJCS5mbGFncyA9IDAKKwl9OworCWludCBpLCBrZXksIGtleV9wcm92aWRlZCwgbGVuOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0OworCisJSUVFRTgwMjExX0RFQlVHX1dYKCJTRVRfRU5DT0RFXG4iKTsKKworCWtleSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGtleSkgeworCQlpZiAoa2V5ID4gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJa2V5LS07CisJCWtleV9wcm92aWRlZCA9IDE7CisJfSBlbHNlIHsKKwkJa2V5X3Byb3ZpZGVkID0gMDsKKwkJa2V5ID0gaWVlZS0+dHhfa2V5aWR4OworCX0KKworCUlFRUU4MDIxMV9ERUJVR19XWCgiS2V5OiAlZCBbJXNdXG4iLCBrZXksIGtleV9wcm92aWRlZCA/CisJCQkgICAicHJvdmlkZWQiIDogImRlZmF1bHQiKTsKKworCWNyeXB0ID0gJmllZWUtPmNyeXB0W2tleV07CisKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQlpZiAoa2V5X3Byb3ZpZGVkICYmICpjcnlwdCkgeworCQkJSUVFRTgwMjExX0RFQlVHX1dYKCJEaXNhYmxpbmcgZW5jcnlwdGlvbiBvbiBrZXkgJWQuXG4iLAorCQkJCQkgICBrZXkpOworCQkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKwkJfSBlbHNlCisJCQlJRUVFODAyMTFfREVCVUdfV1goIkRpc2FibGluZyBlbmNyeXB0aW9uLlxuIik7CisKKwkJLyogQ2hlY2sgYWxsIHRoZSBrZXlzIHRvIHNlZSBpZiBhbnkgYXJlIHN0aWxsIGNvbmZpZ3VyZWQsCisJCSAqIGFuZCBpZiBubyBrZXkgaW5kZXggd2FzIHByb3ZpZGVkLCBkZS1pbml0IHRoZW0gYWxsICovCisJCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKSB7CisJCQlpZiAoaWVlZS0+Y3J5cHRbaV0gIT0gTlVMTCkgeworCQkJCWlmIChrZXlfcHJvdmlkZWQpCisJCQkJCWJyZWFrOworCQkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLAorCQkJCQkJCSAgICAgICAmaWVlZS0+Y3J5cHRbaV0pOworCQkJfQorCQl9CisKKwkJaWYgKGkgPT0gV0VQX0tFWVMpIHsKKwkJCXNlYy5lbmFibGVkID0gMDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworCQkJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEIHwgU0VDX0xFVkVMOworCQl9CisKKwkJZ290byBkb25lOworCX0KKworCXNlYy5lbmFibGVkID0gMTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CisKKwlpZiAoKmNyeXB0ICE9IE5VTEwgJiYgKCpjcnlwdCktPm9wcyAhPSBOVUxMICYmCisJICAgIHN0cmNtcCgoKmNyeXB0KS0+b3BzLT5uYW1lLCAiV0VQIikgIT0gMCkgeworCQkvKiBjaGFuZ2luZyB0byB1c2UgV0VQOyBkZWluaXQgcHJldmlvdXNseSB1c2VkIGFsZ29yaXRobQorCQkgKiBvbiB0aGlzIGtleSAqLworCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCX0KKworCWlmICgqY3J5cHQgPT0gTlVMTCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKm5ld19jcnlwdDsKKworCQkvKiB0YWtlIFdFUCBpbnRvIHVzZSAqLworCQluZXdfY3J5cHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpKTsKKwkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOworCQlpZiAoIW5ld19jcnlwdC0+b3BzKSB7CisJCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3dlcCIpOworCQkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOworCQl9CisKKwkJaWYgKG5ld19jcnlwdC0+b3BzICYmIHRyeV9tb2R1bGVfZ2V0KG5ld19jcnlwdC0+b3BzLT5vd25lcikpCisJCQluZXdfY3J5cHQtPnByaXYgPSBuZXdfY3J5cHQtPm9wcy0+aW5pdChrZXkpOworCisJCWlmICghbmV3X2NyeXB0LT5vcHMgfHwgIW5ld19jcnlwdC0+cHJpdikgeworCQkJa2ZyZWUobmV3X2NyeXB0KTsKKwkJCW5ld19jcnlwdCA9IE5VTEw7CisKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgaW5pdGlhbGl6ZSBXRVA6ICIKKwkJCSAgICAgICAibG9hZCBtb2R1bGUgaWVlZTgwMjExX2NyeXB0X3dlcFxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCQkqY3J5cHQgPSBuZXdfY3J5cHQ7CisJfQorCisJLyogSWYgYSBuZXcga2V5IHdhcyBwcm92aWRlZCwgc2V0IGl0IHVwICovCisJaWYgKGVycS0+bGVuZ3RoID4gMCkgeworCQlsZW4gPSBlcnEtPmxlbmd0aCA8PSA1ID8gNSA6IDEzOworCQltZW1jcHkoc2VjLmtleXNba2V5XSwga2V5YnVmLCBlcnEtPmxlbmd0aCk7CisJCWlmIChsZW4gPiBlcnEtPmxlbmd0aCkKKwkJCW1lbXNldChzZWMua2V5c1trZXldICsgZXJxLT5sZW5ndGgsIDAsCisJCQkgICAgICAgbGVuIC0gZXJxLT5sZW5ndGgpOworCQlJRUVFODAyMTFfREVCVUdfV1goIlNldHRpbmcga2V5ICVkIHRvICclcycgKCVkOiVkIGJ5dGVzKVxuIiwKKwkJCQkgICBrZXksIGVzY2FwZV9lc3NpZChzZWMua2V5c1trZXldLCBsZW4pLAorCQkJCSAgIGVycS0+bGVuZ3RoLCBsZW4pOworCQlzZWMua2V5X3NpemVzW2tleV0gPSBsZW47CisJCSgqY3J5cHQpLT5vcHMtPnNldF9rZXkoc2VjLmtleXNba2V5XSwgbGVuLCBOVUxMLAorCQkJCSAgICAgICAoKmNyeXB0KS0+cHJpdik7CisJCXNlYy5mbGFncyB8PSAoMSA8PCBrZXkpOworCQkvKiBUaGlzIGVuc3VyZXMgYSBrZXkgd2lsbCBiZSBhY3RpdmF0ZWQgaWYgbm8ga2V5IGlzCisJCSAqIGV4cGxpY2l0ZWx5IHNldCAqLworCQlpZiAoa2V5ID09IHNlYy5hY3RpdmVfa2V5KQorCQkJc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworCX0gZWxzZSB7CisJCWxlbiA9ICgqY3J5cHQpLT5vcHMtPmdldF9rZXkoc2VjLmtleXNba2V5XSwgV0VQX0tFWV9MRU4sCisJCQkJCSAgICAgTlVMTCwgKCpjcnlwdCktPnByaXYpOworCQlpZiAobGVuID09IDApIHsKKwkJCS8qIFNldCBhIGRlZmF1bHQga2V5IG9mIGFsbCAwICovCisJCQlJRUVFODAyMTFfREVCVUdfV1goIlNldHRpbmcga2V5ICVkIHRvIGFsbCB6ZXJvLlxuIiwKKwkJCQkJICAga2V5KTsKKwkJCW1lbXNldChzZWMua2V5c1trZXldLCAwLCAxMyk7CisJCQkoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KHNlYy5rZXlzW2tleV0sIDEzLCBOVUxMLAorCQkJCQkgICAgICAgKCpjcnlwdCktPnByaXYpOworCQkJc2VjLmtleV9zaXplc1trZXldID0gMTM7CisJCQlzZWMuZmxhZ3MgfD0gKDEgPDwga2V5KTsKKwkJfQorCisJCS8qIE5vIGtleSBkYXRhIC0ganVzdCBzZXQgdGhlIGRlZmF1bHQgVFgga2V5IGluZGV4ICovCisJCWlmIChrZXlfcHJvdmlkZWQpIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19XWAorCQkJICAgICgiU2V0dGluZyBrZXkgJWQgdG8gZGVmYXVsdCBUeCBrZXkuXG4iLCBrZXkpOworCQkJaWVlZS0+dHhfa2V5aWR4ID0ga2V5OworCQkJc2VjLmFjdGl2ZV9rZXkgPSBrZXk7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJCX0KKwl9CisKKyAgICAgIGRvbmU6CisJaWVlZS0+b3Blbl93ZXAgPSAhKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCk7CisJc2VjLmF1dGhfbW9kZSA9IGllZWUtPm9wZW5fd2VwID8gV0xBTl9BVVRIX09QRU4gOiBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0FVVEhfTU9ERTsKKwlJRUVFODAyMTFfREVCVUdfV1goIkF1dGg6ICVzXG4iLCBzZWMuYXV0aF9tb2RlID09IFdMQU5fQVVUSF9PUEVOID8KKwkJCSAgICJPUEVOIiA6ICJTSEFSRUQgS0VZIik7CisKKwkvKiBGb3Igbm93IHdlIGp1c3Qgc3VwcG9ydCBXRVAsIHNvIG9ubHkgc2V0IHRoYXQgc2VjdXJpdHkgbGV2ZWwuLi4KKwkgKiBUT0RPOiBXaGVuIFdQQSBpcyBhZGRlZCB0aGlzIGlzIG9uZSBwbGFjZSB0aGF0IG5lZWRzIHRvIGNoYW5nZSAqLworCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7CS8qIDQwIGFuZCAxMDQgYml0IFdFUCAqLworCisJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJaWVlZS0+c2V0X3NlY3VyaXR5KGRldiwgJnNlYyk7CisKKwkvKiBEbyBub3QgcmVzZXQgcG9ydCBpZiBjYXJkIGlzIGluIE1hbmFnZWQgbW9kZSBzaW5jZSByZXNldHRpbmcgd2lsbAorCSAqIGdlbmVyYXRlIG5ldyBJRUVFIDgwMi4xMSBhdXRoZW50aWNhdGlvbiB3aGljaCBtYXkgZW5kIHVwIGluIGxvb3BpbmcKKwkgKiB3aXRoIElFRUUgODAyLjFYLiAgSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAorCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgorCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4gKi8KKwlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCisJICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgorCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmIGllZWUtPnJlc2V0X3BvcnQoZGV2KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlc2V0X3BvcnQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleWJ1ZikKK3sKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICYod3JxdS0+ZW5jb2RpbmcpOworCWludCBsZW4sIGtleTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0OworCisJSUVFRTgwMjExX0RFQlVHX1dYKCJHRVRfRU5DT0RFXG4iKTsKKworCWtleSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGtleSkgeworCQlpZiAoa2V5ID4gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJa2V5LS07CisJfSBlbHNlCisJCWtleSA9IGllZWUtPnR4X2tleWlkeDsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRba2V5XTsKKwllcnEtPmZsYWdzID0ga2V5ICsgMTsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMgPT0gTlVMTCkgeworCQllcnEtPmxlbmd0aCA9IDA7CisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSAhPSAwKSB7CisJCS8qIG9ubHkgV0VQIGlzIHN1cHBvcnRlZCB3aXRoIHdpcmVsZXNzIGV4dGVuc2lvbnMsIHNvIGp1c3QKKwkJICogcmVwb3J0IHRoYXQgZW5jcnlwdGlvbiBpcyB1c2VkICovCisJCWVycS0+bGVuZ3RoID0gMDsKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwkJcmV0dXJuIDA7CisJfQorCisJbGVuID0gY3J5cHQtPm9wcy0+Z2V0X2tleShrZXlidWYsIFdFUF9LRVlfTEVOLCBOVUxMLCBjcnlwdC0+cHJpdik7CisJZXJxLT5sZW5ndGggPSAobGVuID49IDAgPyBsZW4gOiAwKTsKKworCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisKKwlpZiAoaWVlZS0+b3Blbl93ZXApCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CisJZWxzZQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9zY2FuKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9lbmNvZGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2VuY29kZSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hZl9pbmV0LmMgYi9uZXQvaXB2NC9hZl9pbmV0LmMKaW5kZXggYmYxNDdmOC4uYTlkODRmOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWZfaW5ldC5jCisrKyBiL25ldC9pcHY0L2FmX2luZXQuYwpAQCAtMTI0OCwxMSArMTI0OCw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0jaWZkZWYgQ09ORklHX0lQX0ZJQl9UUklFCi1leHRlcm4gaW50ICBmaWJfc3RhdF9wcm9jX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBmaWJfc3RhdF9wcm9jX2V4aXQodm9pZCk7Ci0jZW5kaWYKLQogc3RhdGljIGludCBfX2luaXQgaXB2NF9wcm9jX2luaXQodm9pZCkKIHsKIAlpbnQgcmMgPSAwOwpAQCAtMTI2NSwxOSArMTI2MCwxMSBAQAogCQlnb3RvIG91dF91ZHA7CiAJaWYgKGZpYl9wcm9jX2luaXQoKSkKIAkJZ290byBvdXRfZmliOwotI2lmZGVmIENPTkZJR19JUF9GSUJfVFJJRQotICAgICAgICAgaWYgKGZpYl9zdGF0X3Byb2NfaW5pdCgpKQotICAgICAgICAgICAgICAgICBnb3RvIG91dF9maWJfc3RhdDsKLSNlbmRpZgogCWlmIChpcF9taXNjX3Byb2NfaW5pdCgpKQogCQlnb3RvIG91dF9taXNjOwogb3V0OgogCXJldHVybiByYzsKIG91dF9taXNjOgotI2lmZGVmIENPTkZJR19JUF9GSUJfVFJJRQotIAlmaWJfc3RhdF9wcm9jX2V4aXQoKTsKLW91dF9maWJfc3RhdDoKLSNlbmRpZgogCWZpYl9wcm9jX2V4aXQoKTsKIG91dF9maWI6CiAJdWRwNF9wcm9jX2V4aXQoKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FoNC5jIGIvbmV0L2lwdjQvYWg0LmMKaW5kZXggNTE0Yzg1Yi4uMDM1YWQyYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWg0LmMKKysrIGIvbmV0L2lwdjQvYWg0LmMKQEAgLTI2MywxMCArMjYzLDggQEAKIAogZXJyb3I6CiAJaWYgKGFocCkgewotCQlpZiAoYWhwLT53b3JrX2ljdikKLQkJCWtmcmVlKGFocC0+d29ya19pY3YpOwotCQlpZiAoYWhwLT50Zm0pCi0JCQljcnlwdG9fZnJlZV90Zm0oYWhwLT50Zm0pOworCQlrZnJlZShhaHAtPndvcmtfaWN2KTsKKwkJY3J5cHRvX2ZyZWVfdGZtKGFocC0+dGZtKTsKIAkJa2ZyZWUoYWhwKTsKIAl9CiAJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNzksMTQgKzI3NywxMCBAQAogCWlmICghYWhwKQogCQlyZXR1cm47CiAKLQlpZiAoYWhwLT53b3JrX2ljdikgewotCQlrZnJlZShhaHAtPndvcmtfaWN2KTsKLQkJYWhwLT53b3JrX2ljdiA9IE5VTEw7Ci0JfQotCWlmIChhaHAtPnRmbSkgewotCQljcnlwdG9fZnJlZV90Zm0oYWhwLT50Zm0pOwotCQlhaHAtPnRmbSA9IE5VTEw7Ci0JfQorCWtmcmVlKGFocC0+d29ya19pY3YpOworCWFocC0+d29ya19pY3YgPSBOVUxMOworCWNyeXB0b19mcmVlX3RmbShhaHAtPnRmbSk7CisJYWhwLT50Zm0gPSBOVUxMOwogCWtmcmVlKGFocCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2VzcDQuYyBiL25ldC9pcHY0L2VzcDQuYwppbmRleCBiMzFmZmM1Li4xYjVhMDlkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9lc3A0LmMKKysrIGIvbmV0L2lwdjQvZXNwNC5jCkBAIC0zNDMsMjIgKzM0MywxNCBAQAogCWlmICghZXNwKQogCQlyZXR1cm47CiAKLQlpZiAoZXNwLT5jb25mLnRmbSkgewotCQljcnlwdG9fZnJlZV90Zm0oZXNwLT5jb25mLnRmbSk7Ci0JCWVzcC0+Y29uZi50Zm0gPSBOVUxMOwotCX0KLQlpZiAoZXNwLT5jb25mLml2ZWMpIHsKLQkJa2ZyZWUoZXNwLT5jb25mLml2ZWMpOwotCQllc3AtPmNvbmYuaXZlYyA9IE5VTEw7Ci0JfQotCWlmIChlc3AtPmF1dGgudGZtKSB7Ci0JCWNyeXB0b19mcmVlX3RmbShlc3AtPmF1dGgudGZtKTsKLQkJZXNwLT5hdXRoLnRmbSA9IE5VTEw7Ci0JfQotCWlmIChlc3AtPmF1dGgud29ya19pY3YpIHsKLQkJa2ZyZWUoZXNwLT5hdXRoLndvcmtfaWN2KTsKLQkJZXNwLT5hdXRoLndvcmtfaWN2ID0gTlVMTDsKLQl9CisJY3J5cHRvX2ZyZWVfdGZtKGVzcC0+Y29uZi50Zm0pOworCWVzcC0+Y29uZi50Zm0gPSBOVUxMOworCWtmcmVlKGVzcC0+Y29uZi5pdmVjKTsKKwllc3AtPmNvbmYuaXZlYyA9IE5VTEw7CisJY3J5cHRvX2ZyZWVfdGZtKGVzcC0+YXV0aC50Zm0pOworCWVzcC0+YXV0aC50Zm0gPSBOVUxMOworCWtmcmVlKGVzcC0+YXV0aC53b3JrX2ljdik7CisJZXNwLT5hdXRoLndvcmtfaWN2ID0gTlVMTDsKIAlrZnJlZShlc3ApOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfdHJpZS5jIGIvbmV0L2lwdjQvZmliX3RyaWUuYwppbmRleCBiMmRlYTRlLi4xYjYzYjQ4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9maWJfdHJpZS5jCisrKyBiL25ldC9pcHY0L2ZpYl90cmllLmMKQEAgLTQzLDcgKzQzLDcgQEAKICAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNkZWZpbmUgVkVSU0lPTiAiMC40MDIiCisjZGVmaW5lIFZFUlNJT04gIjAuNDAzIgogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTE2NCw3ICsxNjQsNiBAQAogc3RhdGljIHN0cnVjdCB0bm9kZSAqaW5mbGF0ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0bik7CiBzdGF0aWMgc3RydWN0IHRub2RlICpoYWx2ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0bik7CiBzdGF0aWMgdm9pZCB0bm9kZV9mcmVlKHN0cnVjdCB0bm9kZSAqdG4pOwotc3RhdGljIHZvaWQgdHJpZV9kdW1wX3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHRyaWUgKnQpOwogCiBzdGF0aWMga21lbV9jYWNoZV90ICpmbl9hbGlhc19rbWVtIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgc3RydWN0IHRyaWUgKnRyaWVfbG9jYWwgPSBOVUxMLCAqdHJpZV9tYWluID0gTlVMTDsKQEAgLTE5NzEsMzc4ICsxOTcwLDEzNyBAQAogCXJldHVybiB0YjsKIH0KIAotLyogVHJpZSBkdW1wIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdm9pZCBwdXRzcGFjZV9zZXEoc3RydWN0IHNlcV9maWxlICpzZXEsIGludCBuKQotewotCXdoaWxlIChuLS0pCi0JCXNlcV9wcmludGYoc2VxLCAiICIpOwotfQotCi1zdGF0aWMgdm9pZCBwcmludGJpbl9zZXEoc3RydWN0IHNlcV9maWxlICpzZXEsIHVuc2lnbmVkIGludCB2LCBpbnQgYml0cykKLXsKLQl3aGlsZSAoYml0cy0tKQotCQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgKHYgJiAoMTw8Yml0cykpPyIxIjoiMCIpOwotfQotCi1zdGF0aWMgdm9pZCBwcmludG5vZGVfc2VxKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBpbnQgaW5kZW50LCBzdHJ1Y3Qgbm9kZSAqbiwKLQkJICAgaW50IHBlbmQsIGludCBjaW5kZXgsIGludCBiaXRzKQotewotCXB1dHNwYWNlX3NlcShzZXEsIGluZGVudCk7Ci0JaWYgKElTX0xFQUYobikpCi0JCXNlcV9wcmludGYoc2VxLCAifCIpOwotCWVsc2UKLQkJc2VxX3ByaW50ZihzZXEsICIrIik7Ci0JaWYgKGJpdHMpIHsKLQkJc2VxX3ByaW50ZihzZXEsICIlZC8iLCBjaW5kZXgpOwotCQlwcmludGJpbl9zZXEoc2VxLCBjaW5kZXgsIGJpdHMpOwotCQlzZXFfcHJpbnRmKHNlcSwgIjogIik7Ci0JfSBlbHNlCi0JCXNlcV9wcmludGYoc2VxLCAiPHJvb3Q+OiAiKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiVzOiVwICIsIElTX0xFQUYobik/IkxlYWYiOiJJbnRlcm5hbCBub2RlIiwgbik7Ci0KLQlpZiAoSVNfTEVBRihuKSkgewotCQlzdHJ1Y3QgbGVhZiAqbCA9IChzdHJ1Y3QgbGVhZiAqKW47Ci0JCXN0cnVjdCBmaWJfYWxpYXMgKmZhOwotCQlpbnQgaTsKLQotCQlzZXFfcHJpbnRmKHNlcSwgImtleT0lZC4lZC4lZC4lZFxuIiwKLQkJCSAgIG4tPmtleSA+PiAyNCwgKG4tPmtleSA+PiAxNikgJSAyNTYsIChuLT5rZXkgPj4gOCkgJSAyNTYsIG4tPmtleSAlIDI1Nik7Ci0KLQkJZm9yIChpID0gMzI7IGkgPj0gMDsgaS0tKQotCQkJaWYgKGZpbmRfbGVhZl9pbmZvKCZsLT5saXN0LCBpKSkgewotCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmZhX2hlYWQgPSBnZXRfZmFfaGVhZChsLCBpKTsKLQotCQkJCWlmICghZmFfaGVhZCkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAobGlzdF9lbXB0eShmYV9oZWFkKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlwdXRzcGFjZV9zZXEoc2VxLCBpbmRlbnQrMik7Ci0JCQkJc2VxX3ByaW50ZihzZXEsICJ7LyVkLi4uZHVtcGluZ31cbiIsIGkpOwotCi0JCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZmEsIGZhX2hlYWQsIGZhX2xpc3QpIHsKLQkJCQkJcHV0c3BhY2Vfc2VxKHNlcSwgaW5kZW50KzIpOwotCQkJCQlpZiAoZmEtPmZhX2luZm8gPT0gTlVMTCkgewotCQkJCQkJc2VxX3ByaW50ZihzZXEsICJFcnJvciBmYV9pbmZvPU5VTExcbiIpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGZhLT5mYV9pbmZvLT5maWJfbmggPT0gTlVMTCkgewotCQkJCQkJc2VxX3ByaW50ZihzZXEsICJFcnJvciBfZmliX25oPU5VTExcbiIpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlzZXFfcHJpbnRmKHNlcSwgInt0eXBlPSVkIHNjb3BlPSVkIFRPUz0lZH1cbiIsCi0JCQkJCSAgICAgIGZhLT5mYV90eXBlLAotCQkJCQkgICAgICBmYS0+ZmFfc2NvcGUsCi0JCQkJCSAgICAgIGZhLT5mYV90b3MpOwotCQkJCX0KLQkJCX0KLQl9IGVsc2UgewotCQlzdHJ1Y3QgdG5vZGUgKnRuID0gKHN0cnVjdCB0bm9kZSAqKW47Ci0JCWludCBwbGVuID0gKChzdHJ1Y3QgdG5vZGUgKiluKS0+cG9zOwotCQl0X2tleSBwcmYgPSBNQVNLX1BGWChuLT5rZXksIHBsZW4pOwotCi0JCXNlcV9wcmludGYoc2VxLCAia2V5PSVkLiVkLiVkLiVkLyVkXG4iLAotCQkJICAgcHJmID4+IDI0LCAocHJmID4+IDE2KSAlIDI1NiwgKHByZiA+PiA4KSAlIDI1NiwgcHJmICUgMjU2LCBwbGVuKTsKLQotCQlwdXRzcGFjZV9zZXEoc2VxLCBpbmRlbnQpOyBzZXFfcHJpbnRmKHNlcSwgInwgICAgIik7Ci0JCXNlcV9wcmludGYoc2VxLCAie2tleSBwcmVmaXg9JTA4eC8iLCB0bi0+a2V5ICYgVEtFWV9HRVRfTUFTSygwLCB0bi0+cG9zKSk7Ci0JCXByaW50YmluX3NlcShzZXEsIHRrZXlfZXh0cmFjdF9iaXRzKHRuLT5rZXksIDAsIHRuLT5wb3MpLCB0bi0+cG9zKTsKLQkJc2VxX3ByaW50ZihzZXEsICJ9XG4iKTsKLQkJcHV0c3BhY2Vfc2VxKHNlcSwgaW5kZW50KTsgc2VxX3ByaW50ZihzZXEsICJ8ICAgICIpOwotCQlzZXFfcHJpbnRmKHNlcSwgIntwb3M9JWQiLCB0bi0+cG9zKTsKLQkJc2VxX3ByaW50ZihzZXEsICIgKHNraXA9JWQgYml0cykiLCB0bi0+cG9zIC0gcGVuZCk7Ci0JCXNlcV9wcmludGYoc2VxLCAiIGJpdHM9JWQgKCV1IGNoaWxkcmVuKX1cbiIsIHRuLT5iaXRzLCAoMSA8PCB0bi0+Yml0cykpOwotCQlwdXRzcGFjZV9zZXEoc2VxLCBpbmRlbnQpOyBzZXFfcHJpbnRmKHNlcSwgInwgICAgIik7Ci0JCXNlcV9wcmludGYoc2VxLCAie2VtcHR5PSVkIGZ1bGw9JWR9XG4iLCB0bi0+ZW1wdHlfY2hpbGRyZW4sIHRuLT5mdWxsX2NoaWxkcmVuKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHRyaWVfZHVtcF9zZXEoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCB0cmllICp0KQotewotCXN0cnVjdCBub2RlICpuOwotCWludCBjaW5kZXggPSAwOwotCWludCBpbmRlbnQgPSAxOwotCWludCBwZW5kID0gMDsKLQlpbnQgZGVwdGggPSAwOwotCXN0cnVjdCB0bm9kZSAqdG47Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbiA9IHJjdV9kZXJlZmVyZW5jZSh0LT50cmllKTsKLQlzZXFfcHJpbnRmKHNlcSwgIi0tLS0tLSB0cmllX2R1bXAgb2YgdD0lcCAtLS0tLS1cbiIsIHQpOwotCi0JaWYgKCFuKSB7Ci0JCXNlcV9wcmludGYoc2VxLCAiLS0tLS0tIHRyaWUgaXMgZW1wdHlcbiIpOwotCi0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpbnRub2RlX3NlcShzZXEsIGluZGVudCwgbiwgcGVuZCwgY2luZGV4LCAwKTsKLQotCWlmICghSVNfVE5PREUobikpIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQl0biA9IChzdHJ1Y3QgdG5vZGUgKiluOwotCXBlbmQgPSB0bi0+cG9zK3RuLT5iaXRzOwotCXB1dHNwYWNlX3NlcShzZXEsIGluZGVudCk7IHNlcV9wcmludGYoc2VxLCAiXFwtLVxuIik7Ci0JaW5kZW50ICs9IDM7Ci0JZGVwdGgrKzsKLQotCXdoaWxlICh0biAmJiBjaW5kZXggPCAoMSA8PCB0bi0+Yml0cykpIHsKLQkJc3RydWN0IG5vZGUgKmNoaWxkID0gcmN1X2RlcmVmZXJlbmNlKHRuLT5jaGlsZFtjaW5kZXhdKTsKLQkJaWYgKCFjaGlsZCkKLQkJCWNpbmRleCsrOwotCQllbHNlIHsKLQkJCS8qIEdvdCBhIGNoaWxkICovCi0JCQlwcmludG5vZGVfc2VxKHNlcSwgaW5kZW50LCBjaGlsZCwgcGVuZCwKLQkJCQkgICAgICBjaW5kZXgsIHRuLT5iaXRzKTsKLQotCQkJaWYgKElTX0xFQUYoY2hpbGQpKQotCQkJCWNpbmRleCsrOwotCi0JCQllbHNlIHsKLQkJCQkvKgotCQkJCSAqIE5ldyB0bm9kZS4gRGVjZW5kIG9uZSBsZXZlbAotCQkJCSAqLwotCi0JCQkJZGVwdGgrKzsKLQkJCQluID0gY2hpbGQ7Ci0JCQkJdG4gPSAoc3RydWN0IHRub2RlICopbjsKLQkJCQlwZW5kID0gdG4tPnBvcyt0bi0+Yml0czsKLQkJCQlwdXRzcGFjZV9zZXEoc2VxLCBpbmRlbnQpOwotCQkJCXNlcV9wcmludGYoc2VxLCAiXFwtLVxuIik7Ci0JCQkJaW5kZW50ICs9IDM7Ci0JCQkJY2luZGV4ID0gMDsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFRlc3QgaWYgd2UgYXJlIGRvbmUKLQkJICovCi0KLQkJd2hpbGUgKGNpbmRleCA+PSAoMSA8PCB0bi0+Yml0cykpIHsKLQkJCS8qCi0JCQkgKiBNb3ZlIHVwd2FyZHMgYW5kIHRlc3QgZm9yIHJvb3QKLQkJCSAqIHBvcCBvZmYgYWxsIHRyYXZlcnNlZCAgbm9kZXMKLQkJCSAqLwotCi0JCQlpZiAoTk9ERV9QQVJFTlQodG4pID09IE5VTEwpIHsKLQkJCQl0biA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNpbmRleCA9IHRrZXlfZXh0cmFjdF9iaXRzKHRuLT5rZXksIE5PREVfUEFSRU5UKHRuKS0+cG9zLCBOT0RFX1BBUkVOVCh0biktPmJpdHMpOwotCQkJY2luZGV4Kys7Ci0JCQl0biA9IE5PREVfUEFSRU5UKHRuKTsKLQkJCXBlbmQgPSB0bi0+cG9zICsgdG4tPmJpdHM7Ci0JCQlpbmRlbnQgLT0gMzsKLQkJCWRlcHRoLS07Ci0JCX0KLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdHJpZV9zdGF0ICp0cmllX3N0YXRfbmV3KHZvaWQpCi17Ci0Jc3RydWN0IHRyaWVfc3RhdCAqczsKLQlpbnQgaTsKLQotCXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJpZV9zdGF0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzKQotCQlyZXR1cm4gTlVMTDsKLQotCXMtPnRvdGRlcHRoID0gMDsKLQlzLT5tYXhkZXB0aCA9IDA7Ci0Jcy0+dG5vZGVzID0gMDsKLQlzLT5sZWF2ZXMgPSAwOwotCXMtPm51bGxwb2ludGVycyA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0NISUxEUzsgaSsrKQotCQlzLT5ub2Rlc2l6ZXNbaV0gPSAwOwotCi0JcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdHJpZV9zdGF0ICp0cmllX2NvbGxlY3Rfc3RhdHMoc3RydWN0IHRyaWUgKnQpCi17Ci0Jc3RydWN0IG5vZGUgKm47Ci0Jc3RydWN0IHRyaWVfc3RhdCAqcyA9IHRyaWVfc3RhdF9uZXcoKTsKLQlpbnQgY2luZGV4ID0gMDsKLQlpbnQgcGVuZCA9IDA7Ci0JaW50IGRlcHRoID0gMDsKLQotCWlmICghcykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbiA9IHJjdV9kZXJlZmVyZW5jZSh0LT50cmllKTsKLQotCWlmICghbikKLQkJcmV0dXJuIHM7Ci0KLQlpZiAoSVNfVE5PREUobikpIHsKLQkJc3RydWN0IHRub2RlICp0biA9IChzdHJ1Y3QgdG5vZGUgKiluOwotCQlwZW5kID0gdG4tPnBvcyt0bi0+Yml0czsKLQkJcy0+bm9kZXNpemVzW3RuLT5iaXRzXSsrOwotCQlkZXB0aCsrOwotCi0JCXdoaWxlICh0biAmJiBjaW5kZXggPCAoMSA8PCB0bi0+Yml0cykpIHsKLQkJCXN0cnVjdCBub2RlICpjaCA9IHJjdV9kZXJlZmVyZW5jZSh0bi0+Y2hpbGRbY2luZGV4XSk7Ci0JCQlpZiAoY2gpIHsKLQotCQkJCS8qIEdvdCBhIGNoaWxkICovCi0KLQkJCQlpZiAoSVNfTEVBRih0bi0+Y2hpbGRbY2luZGV4XSkpIHsKLQkJCQkJY2luZGV4Kys7Ci0KLQkJCQkJLyogc3RhdHMgKi8KLQkJCQkJaWYgKGRlcHRoID4gcy0+bWF4ZGVwdGgpCi0JCQkJCQlzLT5tYXhkZXB0aCA9IGRlcHRoOwotCQkJCQlzLT50b3RkZXB0aCArPSBkZXB0aDsKLQkJCQkJcy0+bGVhdmVzKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogTmV3IHRub2RlLiBEZWNlbmQgb25lIGxldmVsCi0JCQkJCSAqLwotCi0JCQkJCXMtPnRub2RlcysrOwotCQkJCQlzLT5ub2Rlc2l6ZXNbdG4tPmJpdHNdKys7Ci0JCQkJCWRlcHRoKys7Ci0KLQkJCQkJbiA9IGNoOwotCQkJCQl0biA9IChzdHJ1Y3QgdG5vZGUgKiluOwotCQkJCQlwZW5kID0gdG4tPnBvcyt0bi0+Yml0czsKLQotCQkJCQljaW5kZXggPSAwOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJY2luZGV4Kys7Ci0JCQkJcy0+bnVsbHBvaW50ZXJzKys7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBUZXN0IGlmIHdlIGFyZSBkb25lCi0JCQkgKi8KLQotCQkJd2hpbGUgKGNpbmRleCA+PSAoMSA8PCB0bi0+Yml0cykpIHsKLQkJCQkvKgotCQkJCSAqIE1vdmUgdXB3YXJkcyBhbmQgdGVzdCBmb3Igcm9vdAotCQkJCSAqIHBvcCBvZmYgYWxsIHRyYXZlcnNlZCAgbm9kZXMKLQkJCQkgKi8KLQotCQkJCWlmIChOT0RFX1BBUkVOVCh0bikgPT0gTlVMTCkgewotCQkJCQl0biA9IE5VTEw7Ci0JCQkJCW4gPSBOVUxMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljaW5kZXggPSB0a2V5X2V4dHJhY3RfYml0cyh0bi0+a2V5LCBOT0RFX1BBUkVOVCh0biktPnBvcywgTk9ERV9QQVJFTlQodG4pLT5iaXRzKTsKLQkJCQl0biA9IE5PREVfUEFSRU5UKHRuKTsKLQkJCQljaW5kZXgrKzsKLQkJCQluID0gKHN0cnVjdCBub2RlICopdG47Ci0JCQkJcGVuZCA9IHRuLT5wb3MrdG4tPmJpdHM7Ci0JCQkJZGVwdGgtLTsKLSAJCQl9Ci0JCX0KLQl9Ci0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQlyZXR1cm4gczsKLX0KLQogI2lmZGVmIENPTkZJR19QUk9DX0ZTCisvKiBEZXB0aCBmaXJzdCBUcmllIHdhbGsgaXRlcmF0b3IgKi8KK3N0cnVjdCBmaWJfdHJpZV9pdGVyIHsKKwlzdHJ1Y3QgdG5vZGUgKnRub2RlOworCXN0cnVjdCB0cmllICp0cmllOworCXVuc2lnbmVkIGluZGV4OworCXVuc2lnbmVkIGRlcHRoOworfTsKIAotc3RhdGljIHN0cnVjdCBmaWJfYWxpYXMgKmZpYl90cmllc3RhdF9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCitzdGF0aWMgc3RydWN0IG5vZGUgKmZpYl90cmllX2dldF9uZXh0KHN0cnVjdCBmaWJfdHJpZV9pdGVyICppdGVyKQogeworCXN0cnVjdCB0bm9kZSAqdG4gPSBpdGVyLT50bm9kZTsKKwl1bnNpZ25lZCBjaW5kZXggPSBpdGVyLT5pbmRleDsKKwlzdHJ1Y3QgdG5vZGUgKnA7CisKKwlwcl9kZWJ1ZygiZ2V0X25leHQgaXRlcj17bm9kZT0lcCBpbmRleD0lZCBkZXB0aD0lZH1cbiIsCisJCSBpdGVyLT50bm9kZSwgaXRlci0+aW5kZXgsIGl0ZXItPmRlcHRoKTsKK3Jlc2NhbjoKKwl3aGlsZSAoY2luZGV4IDwgKDE8PHRuLT5iaXRzKSkgeworCQlzdHJ1Y3Qgbm9kZSAqbiA9IHRub2RlX2dldF9jaGlsZCh0biwgY2luZGV4KTsKKworCQlpZiAobikgeworCQkJaWYgKElTX0xFQUYobikpIHsKKwkJCQlpdGVyLT50bm9kZSA9IHRuOworCQkJCWl0ZXItPmluZGV4ID0gY2luZGV4ICsgMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogcHVzaCBkb3duIG9uZSBsZXZlbCAqLworCQkJCWl0ZXItPnRub2RlID0gKHN0cnVjdCB0bm9kZSAqKSBuOworCQkJCWl0ZXItPmluZGV4ID0gMDsKKwkJCQkrK2l0ZXItPmRlcHRoOworCQkJfQorCQkJcmV0dXJuIG47CisJCX0KKworCQkrK2NpbmRleDsKKwl9CisKKwkvKiBDdXJyZW50IG5vZGUgZXhoYXVzdGVkLCBwb3AgYmFjayB1cCAqLworCXAgPSBOT0RFX1BBUkVOVCh0bik7CisJaWYgKHApIHsKKwkJY2luZGV4ID0gdGtleV9leHRyYWN0X2JpdHModG4tPmtleSwgcC0+cG9zLCBwLT5iaXRzKSsxOworCQl0biA9IHA7CisJCS0taXRlci0+ZGVwdGg7CisJCWdvdG8gcmVzY2FuOworCX0KKworCS8qIGdvdCByb290PyAqLwogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGZpYl9hbGlhcyAqZmliX3RyaWVzdGF0X2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxKQorc3RhdGljIHN0cnVjdCBub2RlICpmaWJfdHJpZV9nZXRfZmlyc3Qoc3RydWN0IGZpYl90cmllX2l0ZXIgKml0ZXIsCisJCQkJICAgICAgIHN0cnVjdCB0cmllICp0KQogeworCXN0cnVjdCBub2RlICpuID0gcmN1X2RlcmVmZXJlbmNlKHQtPnRyaWUpOworCisJaWYgKG4gJiYgSVNfVE5PREUobikpIHsKKwkJaXRlci0+dG5vZGUgPSAoc3RydWN0IHRub2RlICopIG47CisJCWl0ZXItPnRyaWUgPSB0OworCQlpdGVyLT5pbmRleCA9IDA7CisJCWl0ZXItPmRlcHRoID0gMDsKKwkJcmV0dXJuIG47CisJfQogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCAqZmliX3RyaWVzdGF0X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCitzdGF0aWMgdm9pZCB0cmllX2NvbGxlY3Rfc3RhdHMoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0cmllX3N0YXQgKnMpCiB7Ci0JaWYgKCFpcF9maWJfbWFpbl90YWJsZSkKLQkJcmV0dXJuIE5VTEw7CisJc3RydWN0IG5vZGUgKm47CisJc3RydWN0IGZpYl90cmllX2l0ZXIgaXRlcjsKIAotCWlmICgqcG9zKQotCQlyZXR1cm4gZmliX3RyaWVzdGF0X2dldF9uZXh0KHNlcSk7Ci0JZWxzZQotCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwotfQorCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKIAotc3RhdGljIHZvaWQgKmZpYl90cmllc3RhdF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCi17Ci0JKysqcG9zOwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKLQkJcmV0dXJuIGZpYl90cmllc3RhdF9nZXRfZmlyc3Qoc2VxKTsKLQllbHNlCi0JCXJldHVybiBmaWJfdHJpZXN0YXRfZ2V0X25leHQoc2VxKTsKLX0KKwlyY3VfcmVhZF9sb2NrKCk7CisJZm9yIChuID0gZmliX3RyaWVfZ2V0X2ZpcnN0KCZpdGVyLCB0KTsgbjsKKwkgICAgIG4gPSBmaWJfdHJpZV9nZXRfbmV4dCgmaXRlcikpIHsKKwkJaWYgKElTX0xFQUYobikpIHsKKwkJCXMtPmxlYXZlcysrOworCQkJcy0+dG90ZGVwdGggKz0gaXRlci5kZXB0aDsKKwkJCWlmIChpdGVyLmRlcHRoID4gcy0+bWF4ZGVwdGgpCisJCQkJcy0+bWF4ZGVwdGggPSBpdGVyLmRlcHRoOworCQl9IGVsc2UgeworCQkJY29uc3Qgc3RydWN0IHRub2RlICp0biA9IChjb25zdCBzdHJ1Y3QgdG5vZGUgKikgbjsKKwkJCWludCBpOwogCi1zdGF0aWMgdm9pZCBmaWJfdHJpZXN0YXRfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci0KKwkJCXMtPnRub2RlcysrOworCQkJcy0+bm9kZXNpemVzW3RuLT5iaXRzXSsrOworCQkJZm9yIChpID0gMDsgaSA8ICgxPDx0bi0+Yml0cyk7IGkrKykKKwkJCQlpZiAoIXRuLT5jaGlsZFtpXSkKKwkJCQkJcy0+bnVsbHBvaW50ZXJzKys7CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIC8qCiAgKglUaGlzIG91dHB1dHMgL3Byb2MvbmV0L2ZpYl90cmllc3RhdHMKLSAqCi0gKglJdCBhbHdheXMgd29ya3MgaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBtb2RlLgotICoJVGhlIGZvcm1hdCBvZiB0aGUgZmlsZSBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgY2hhbmdlZC4KICAqLwotCi1zdGF0aWMgdm9pZCBjb2xsZWN0X2FuZF9zaG93KHN0cnVjdCB0cmllICp0LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3N0YXRpYyB2b2lkIHRyaWVfc2hvd19zdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHRyaWVfc3RhdCAqc3RhdCkKIHsKLQlpbnQgYnl0ZXMgPSAwOyAvKiBIb3cgbWFueSBieXRlcyBhcmUgdXNlZCwgYSByZWYgaXMgNCBieXRlcyAqLwotCWludCBpLCBtYXgsIHBvaW50ZXJzOwotCXN0cnVjdCB0cmllX3N0YXQgKnN0YXQ7Ci0JaW50IGF2ZGVwdGg7CisJdW5zaWduZWQgaSwgbWF4LCBwb2ludGVycywgYnl0ZXMsIGF2ZGVwdGg7CiAKLQlzdGF0ID0gdHJpZV9jb2xsZWN0X3N0YXRzKHQpOworCWlmIChzdGF0LT5sZWF2ZXMpCisJCWF2ZGVwdGggPSBzdGF0LT50b3RkZXB0aCoxMDAgLyBzdGF0LT5sZWF2ZXM7CisJZWxzZQorCQlhdmRlcHRoID0gMDsKIAotCWJ5dGVzID0gMDsKLQlzZXFfcHJpbnRmKHNlcSwgInRyaWU9JXBcbiIsIHQpOworCXNlcV9wcmludGYoc2VxLCAiXHRBdmVyIGRlcHRoOiAgICAgJWQuJTAyZFxuIiwgYXZkZXB0aCAvIDEwMCwgYXZkZXB0aCAlIDEwMCApOworCXNlcV9wcmludGYoc2VxLCAiXHRNYXggZGVwdGg6ICAgICAgJXVcbiIsIHN0YXQtPm1heGRlcHRoKTsKIAotCWlmIChzdGF0KSB7Ci0JCWlmIChzdGF0LT5sZWF2ZXMpCi0JCQlhdmRlcHRoID0gc3RhdC0+dG90ZGVwdGgqMTAwIC8gc3RhdC0+bGVhdmVzOwotCQllbHNlCi0JCQlhdmRlcHRoID0gMDsKLQkJc2VxX3ByaW50ZihzZXEsICJBdmVyIGRlcHRoOiAlZC4lMDJkXG4iLCBhdmRlcHRoIC8gMTAwLCBhdmRlcHRoICUgMTAwKTsKLQkJc2VxX3ByaW50ZihzZXEsICJNYXggZGVwdGg6ICU0ZFxuIiwgc3RhdC0+bWF4ZGVwdGgpOworCXNlcV9wcmludGYoc2VxLCAiXHRMZWF2ZXM6ICAgICAgICAgJXVcbiIsIHN0YXQtPmxlYXZlcyk7CiAKLQkJc2VxX3ByaW50ZihzZXEsICJMZWF2ZXM6ICVkXG4iLCBzdGF0LT5sZWF2ZXMpOwotCQlieXRlcyArPSBzaXplb2Yoc3RydWN0IGxlYWYpICogc3RhdC0+bGVhdmVzOwotCQlzZXFfcHJpbnRmKHNlcSwgIkludGVybmFsIG5vZGVzOiAlZFxuIiwgc3RhdC0+dG5vZGVzKTsKLQkJYnl0ZXMgKz0gc2l6ZW9mKHN0cnVjdCB0bm9kZSkgKiBzdGF0LT50bm9kZXM7CisJYnl0ZXMgPSBzaXplb2Yoc3RydWN0IGxlYWYpICogc3RhdC0+bGVhdmVzOworCXNlcV9wcmludGYoc2VxLCAiXHRJbnRlcm5hbCBub2RlczogJWRcblx0Iiwgc3RhdC0+dG5vZGVzKTsKKwlieXRlcyArPSBzaXplb2Yoc3RydWN0IHRub2RlKSAqIHN0YXQtPnRub2RlczsKIAotCQltYXggPSBNQVhfQ0hJTERTLTE7CisJbWF4ID0gTUFYX0NISUxEUy0xOworCXdoaWxlIChtYXggPj0gMCAmJiBzdGF0LT5ub2Rlc2l6ZXNbbWF4XSA9PSAwKQorCQltYXgtLTsKIAotCQl3aGlsZSAobWF4ID49IDAgJiYgc3RhdC0+bm9kZXNpemVzW21heF0gPT0gMCkKLQkJCW1heC0tOwotCQlwb2ludGVycyA9IDA7CisJcG9pbnRlcnMgPSAwOworCWZvciAoaSA9IDE7IGkgPD0gbWF4OyBpKyspCisJCWlmIChzdGF0LT5ub2Rlc2l6ZXNbaV0gIT0gMCkgeworCQkJc2VxX3ByaW50ZihzZXEsICIgICVkOiAlZCIsICBpLCBzdGF0LT5ub2Rlc2l6ZXNbaV0pOworCQkJcG9pbnRlcnMgKz0gKDE8PGkpICogc3RhdC0+bm9kZXNpemVzW2ldOworCQl9CisJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlx0UG9pbnRlcnM6ICVkXG4iLCBwb2ludGVycyk7CiAKLQkJZm9yIChpID0gMTsgaSA8PSBtYXg7IGkrKykKLQkJCWlmIChzdGF0LT5ub2Rlc2l6ZXNbaV0gIT0gMCkgewotCQkJCXNlcV9wcmludGYoc2VxLCAiICAlZDogJWQiLCAgaSwgc3RhdC0+bm9kZXNpemVzW2ldKTsKLQkJCQlwb2ludGVycyArPSAoMTw8aSkgKiBzdGF0LT5ub2Rlc2l6ZXNbaV07Ci0JCQl9Ci0JCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKLQkJc2VxX3ByaW50ZihzZXEsICJQb2ludGVyczogJWRcbiIsIHBvaW50ZXJzKTsKLQkJYnl0ZXMgKz0gc2l6ZW9mKHN0cnVjdCBub2RlICopICogcG9pbnRlcnM7Ci0JCXNlcV9wcmludGYoc2VxLCAiTnVsbCBwdHJzOiAlZFxuIiwgc3RhdC0+bnVsbHBvaW50ZXJzKTsKLQkJc2VxX3ByaW50ZihzZXEsICJUb3RhbCBzaXplOiAlZCAga0JcbiIsIGJ5dGVzIC8gMTAyNCk7Ci0KLQkJa2ZyZWUoc3RhdCk7Ci0JfQorCWJ5dGVzICs9IHNpemVvZihzdHJ1Y3Qgbm9kZSAqKSAqIHBvaW50ZXJzOworCXNlcV9wcmludGYoc2VxLCAiTnVsbCBwdHJzOiAlZFxuIiwgc3RhdC0+bnVsbHBvaW50ZXJzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlRvdGFsIHNpemU6ICVkICBrQlxuIiwgKGJ5dGVzICsgMTAyMykgLyAxMDI0KTsKIAogI2lmZGVmIENPTkZJR19JUF9GSUJfVFJJRV9TVEFUUwogCXNlcV9wcmludGYoc2VxLCAiQ291bnRlcnM6XG4tLS0tLS0tLS1cbiIpOwpAQCAtMjM2MCwxNjkgKzIxMTgsMzc3IEBACiAKIHN0YXRpYyBpbnQgZmliX3RyaWVzdGF0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewotCWNoYXIgYmZbMTI4XTsKKwlzdHJ1Y3QgdHJpZV9zdGF0ICpzdGF0OwogCi0JaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7Ci0JCXNlcV9wcmludGYoc2VxLCAiQmFzaWMgaW5mbzogc2l6ZSBvZiBsZWFmOiAlWmQgYnl0ZXMsIHNpemUgb2YgdG5vZGU6ICVaZCBieXRlcy5cbiIsCi0JCQkgICBzaXplb2Yoc3RydWN0IGxlYWYpLCBzaXplb2Yoc3RydWN0IHRub2RlKSk7Ci0JCWlmICh0cmllX2xvY2FsKQotCQkJY29sbGVjdF9hbmRfc2hvdyh0cmllX2xvY2FsLCBzZXEpOworCXN0YXQgPSBrbWFsbG9jKHNpemVvZigqc3RhdCksIEdGUF9LRVJORUwpOworCWlmICghc3RhdCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkJaWYgKHRyaWVfbWFpbikKLQkJCWNvbGxlY3RfYW5kX3Nob3codHJpZV9tYWluLCBzZXEpOwotCX0gZWxzZSB7Ci0JCXNucHJpbnRmKGJmLCBzaXplb2YoYmYpLCAiKlx0JTA4WFx0JTA4WCIsIDIwMCwgNDAwKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkJhc2ljIGluZm86IHNpemUgb2YgbGVhZjogJVpkIGJ5dGVzLCBzaXplIG9mIHRub2RlOiAlWmQgYnl0ZXMuXG4iLAorCQkgICBzaXplb2Yoc3RydWN0IGxlYWYpLCBzaXplb2Yoc3RydWN0IHRub2RlKSk7CiAKLQkJc2VxX3ByaW50ZihzZXEsICIlLTEyN3NcbiIsIGJmKTsKKwlpZiAodHJpZV9sb2NhbCkgeworCQlzZXFfcHJpbnRmKHNlcSwgIkxvY2FsOlxuIik7CisJCXRyaWVfY29sbGVjdF9zdGF0cyh0cmllX2xvY2FsLCBzdGF0KTsKKwkJdHJpZV9zaG93X3N0YXRzKHNlcSwgc3RhdCk7CiAJfQorCisJaWYgKHRyaWVfbWFpbikgeworCQlzZXFfcHJpbnRmKHNlcSwgIk1haW46XG4iKTsKKwkJdHJpZV9jb2xsZWN0X3N0YXRzKHRyaWVfbWFpbiwgc3RhdCk7CisJCXRyaWVfc2hvd19zdGF0cyhzZXEsIHN0YXQpOworCX0KKwlrZnJlZShzdGF0KTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGZpYl90cmllc3RhdF9zZXFfb3BzID0gewotCS5zdGFydCA9IGZpYl90cmllc3RhdF9zZXFfc3RhcnQsCi0JLm5leHQgID0gZmliX3RyaWVzdGF0X3NlcV9uZXh0LAotCS5zdG9wICA9IGZpYl90cmllc3RhdF9zZXFfc3RvcCwKLQkuc2hvdyAgPSBmaWJfdHJpZXN0YXRfc2VxX3Nob3csCi19OwotCiBzdGF0aWMgaW50IGZpYl90cmllc3RhdF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKLQlpbnQgcmMgPSAtRU5PTUVNOwotCi0JcmMgPSBzZXFfb3BlbihmaWxlLCAmZmliX3RyaWVzdGF0X3NlcV9vcHMpOwotCWlmIChyYykKLQkJZ290byBvdXRfa2ZyZWU7Ci0KLQlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotb3V0X2tmcmVlOgotCWdvdG8gb3V0OworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBmaWJfdHJpZXN0YXRfc2VxX3Nob3csIE5VTEwpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWJfdHJpZXN0YXRfc2VxX2ZvcHMgPSB7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWJfdHJpZXN0YXRfZm9wcyA9IHsKIAkub3duZXIJPSBUSElTX01PRFVMRSwKIAkub3Blbgk9IGZpYl90cmllc3RhdF9zZXFfb3BlbiwKIAkucmVhZAk9IHNlcV9yZWFkLAogCS5sbHNlZWsJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi1pbnQgX19pbml0IGZpYl9zdGF0X3Byb2NfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCBub2RlICpmaWJfdHJpZV9nZXRfaWR4KHN0cnVjdCBmaWJfdHJpZV9pdGVyICppdGVyLAorCQkJCSAgICAgIGxvZmZfdCBwb3MpCiB7Ci0JaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgiZmliX3RyaWVzdGF0IiwgU19JUlVHTywgJmZpYl90cmllc3RhdF9zZXFfZm9wcykpCi0JCXJldHVybiAtRU5PTUVNOwotCXJldHVybiAwOwotfQorCWxvZmZfdCBpZHggPSAwOworCXN0cnVjdCBub2RlICpuOwogCi12b2lkIF9faW5pdCBmaWJfc3RhdF9wcm9jX2V4aXQodm9pZCkKLXsKLQlwcm9jX25ldF9yZW1vdmUoImZpYl90cmllc3RhdCIpOwotfQorCWZvciAobiA9IGZpYl90cmllX2dldF9maXJzdChpdGVyLCB0cmllX2xvY2FsKTsKKwkgICAgIG47ICsraWR4LCBuID0gZmliX3RyaWVfZ2V0X25leHQoaXRlcikpIHsKKwkJaWYgKHBvcyA9PSBpZHgpCisJCQlyZXR1cm4gbjsKKwl9CiAKLXN0YXRpYyBzdHJ1Y3QgZmliX2FsaWFzICpmaWJfdHJpZV9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZmliX2FsaWFzICpmaWJfdHJpZV9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKLXsKKwlmb3IgKG4gPSBmaWJfdHJpZV9nZXRfZmlyc3QoaXRlciwgdHJpZV9tYWluKTsKKwkgICAgIG47ICsraWR4LCBuID0gZmliX3RyaWVfZ2V0X25leHQoaXRlcikpIHsKKwkJaWYgKHBvcyA9PSBpZHgpCisJCQlyZXR1cm4gbjsKKwl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkICpmaWJfdHJpZV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQogewotCWlmICghaXBfZmliX21haW5fdGFibGUpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKCpwb3MpCi0JCXJldHVybiBmaWJfdHJpZV9nZXRfbmV4dChzZXEpOwotCWVsc2UKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKCpwb3MgPT0gMCkKIAkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKwlyZXR1cm4gZmliX3RyaWVfZ2V0X2lkeChzZXEtPnByaXZhdGUsICpwb3MgLSAxKTsKIH0KIAogc3RhdGljIHZvaWQgKmZpYl90cmllX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKKwlzdHJ1Y3QgZmliX3RyaWVfaXRlciAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKKwl2b2lkICpsID0gdjsKKwogCSsrKnBvczsKIAlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCi0JCXJldHVybiBmaWJfdHJpZV9nZXRfZmlyc3Qoc2VxKTsKLQllbHNlCi0JCXJldHVybiBmaWJfdHJpZV9nZXRfbmV4dChzZXEpOworCQlyZXR1cm4gZmliX3RyaWVfZ2V0X2lkeChpdGVyLCAwKTsKIAorCXYgPSBmaWJfdHJpZV9nZXRfbmV4dChpdGVyKTsKKwlCVUdfT04odiA9PSBsKTsKKwlpZiAodikKKwkJcmV0dXJuIHY7CisKKwkvKiBjb250aW51ZSBzY2FuIGluIG5leHQgdHJpZSAqLworCWlmIChpdGVyLT50cmllID09IHRyaWVfbG9jYWwpCisJCXJldHVybiBmaWJfdHJpZV9nZXRfZmlyc3QoaXRlciwgdHJpZV9tYWluKTsKKworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBmaWJfdHJpZV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKKwlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotLyoKLSAqCVRoaXMgb3V0cHV0cyAvcHJvYy9uZXQvZmliX3RyaWUuCi0gKgotICoJSXQgYWx3YXlzIHdvcmtzIGluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZS4KLSAqCVRoZSBmb3JtYXQgb2YgdGhlIGZpbGUgaXMgbm90IHN1cHBvc2VkIHRvIGJlIGNoYW5nZWQuCi0gKi8KK3N0YXRpYyB2b2lkIHNlcV9pbmRlbnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGludCBuKQoreworCXdoaWxlIChuLS0gPiAwKSBzZXFfcHV0cyhzZXEsICIgICAiKTsKK30KIAorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpydG5fc2NvcGUoZW51bSBydF9zY29wZV90IHMpCit7CisJc3RhdGljIGNoYXIgYnVmWzMyXTsKKworCXN3aXRjaChzKSB7CisJY2FzZSBSVF9TQ09QRV9VTklWRVJTRTogcmV0dXJuICJ1bml2ZXJzZSI7CisJY2FzZSBSVF9TQ09QRV9TSVRFOglyZXR1cm4gInNpdGUiOworCWNhc2UgUlRfU0NPUEVfTElOSzoJcmV0dXJuICJsaW5rIjsKKwljYXNlIFJUX1NDT1BFX0hPU1Q6CXJldHVybiAiaG9zdCI7CisJY2FzZSBSVF9TQ09QRV9OT1dIRVJFOglyZXR1cm4gIm5vd2hlcmUiOworCWRlZmF1bHQ6CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJzY29wZT0lZCIsIHMpOworCQlyZXR1cm4gYnVmOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnJ0bl90eXBlX25hbWVzW19fUlROX01BWF0gPSB7CisJW1JUTl9VTlNQRUNdID0gIlVOU1BFQyIsCisJW1JUTl9VTklDQVNUXSA9ICJVTklDQVNUIiwKKwlbUlROX0xPQ0FMXSA9ICJMT0NBTCIsCisJW1JUTl9CUk9BRENBU1RdID0gIkJST0FEQ0FTVCIsCisJW1JUTl9BTllDQVNUXSA9ICJBTllDQVNUIiwKKwlbUlROX01VTFRJQ0FTVF0gPSAiTVVMVElDQVNUIiwKKwlbUlROX0JMQUNLSE9MRV0gPSAiQkxBQ0tIT0xFIiwKKwlbUlROX1VOUkVBQ0hBQkxFXSA9ICJVTlJFQUNIQUJMRSIsCisJW1JUTl9QUk9ISUJJVF0gPSAiUFJPSElCSVQiLAorCVtSVE5fVEhST1ddID0gIlRIUk9XIiwKKwlbUlROX05BVF0gPSAiTkFUIiwKKwlbUlROX1hSRVNPTFZFXSA9ICJYUkVTT0xWRSIsCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnJ0bl90eXBlKHVuc2lnbmVkIHQpCit7CisJc3RhdGljIGNoYXIgYnVmWzMyXTsKKworCWlmICh0IDwgX19SVE5fTUFYICYmIHJ0bl90eXBlX25hbWVzW3RdKQorCQlyZXR1cm4gcnRuX3R5cGVfbmFtZXNbdF07CisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgInR5cGUgJWQiLCB0KTsKKwlyZXR1cm4gYnVmOworfQorCisvKiBQcmV0dHkgcHJpbnQgdGhlIHRyaWUgKi8KIHN0YXRpYyBpbnQgZmliX3RyaWVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7Ci0JY2hhciBiZlsxMjhdOworCWNvbnN0IHN0cnVjdCBmaWJfdHJpZV9pdGVyICppdGVyID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBub2RlICpuID0gdjsKIAotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlpZiAodHJpZV9sb2NhbCkKLQkJCXRyaWVfZHVtcF9zZXEoc2VxLCB0cmllX2xvY2FsKTsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXJldHVybiAwOwogCi0JCWlmICh0cmllX21haW4pCi0JCQl0cmllX2R1bXBfc2VxKHNlcSwgdHJpZV9tYWluKTsKKwlpZiAoSVNfVE5PREUobikpIHsKKwkJc3RydWN0IHRub2RlICp0biA9IChzdHJ1Y3QgdG5vZGUgKikgbjsKKwkJdF9rZXkgcHJmID0gbnRvaGwoTUFTS19QRlgodG4tPmtleSwgdG4tPnBvcykpOworCisJCWlmICghTk9ERV9QQVJFTlQobikpIHsKKwkJCWlmIChpdGVyLT50cmllID09IHRyaWVfbG9jYWwpCisJCQkJc2VxX3B1dHMoc2VxLCAiPGxvY2FsPjpcbiIpOworCQkJZWxzZQorCQkJCXNlcV9wdXRzKHNlcSwgIjxtYWluPjpcbiIpOworCQl9IGVsc2UgeworCQkJc2VxX2luZGVudChzZXEsIGl0ZXItPmRlcHRoLTEpOworCQkJc2VxX3ByaW50ZihzZXEsICIgICstLSAlZC4lZC4lZC4lZC8lZFxuIiwKKwkJCQkgICBOSVBRVUFEKHByZiksIHRuLT5wb3MpOworCQl9CiAJfSBlbHNlIHsKLQkJc25wcmludGYoYmYsIHNpemVvZihiZiksCi0JCQkgIipcdCUwOFhcdCUwOFgiLCAyMDAsIDQwMCk7Ci0JCXNlcV9wcmludGYoc2VxLCAiJS0xMjdzXG4iLCBiZik7CisJCXN0cnVjdCBsZWFmICpsID0gKHN0cnVjdCBsZWFmICopIG47CisJCWludCBpOworCQl1MzIgdmFsID0gbnRvaGwobC0+a2V5KTsKKworCQlzZXFfaW5kZW50KHNlcSwgaXRlci0+ZGVwdGgpOworCQlzZXFfcHJpbnRmKHNlcSwgIiAgfC0tICVkLiVkLiVkLiVkXG4iLCBOSVBRVUFEKHZhbCkpOworCQlmb3IgKGkgPSAzMjsgaSA+PSAwOyBpLS0pIHsKKwkJCXN0cnVjdCBsZWFmX2luZm8gKmxpID0gZmluZF9sZWFmX2luZm8oJmwtPmxpc3QsIGkpOworCQkJaWYgKGxpKSB7CisJCQkJc3RydWN0IGZpYl9hbGlhcyAqZmE7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZmEsICZsaS0+ZmFsaCwgZmFfbGlzdCkgeworCQkJCQlzZXFfaW5kZW50KHNlcSwgaXRlci0+ZGVwdGgrMSk7CisJCQkJCXNlcV9wcmludGYoc2VxLCAiICAvJWQgJXMgJXMiLCBpLAorCQkJCQkJICAgcnRuX3Njb3BlKGZhLT5mYV9zY29wZSksCisJCQkJCQkgICBydG5fdHlwZShmYS0+ZmFfdHlwZSkpOworCQkJCQlpZiAoZmEtPmZhX3RvcykKKwkJCQkJCXNlcV9wcmludGYoc2VxLCAidG9zID0lZFxuIiwKKwkJCQkJCQkgICBmYS0+ZmFfdG9zKTsKKwkJCQkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKwkJCQl9CisJCQl9CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBmaWJfdHJpZV9zZXFfb3BzID0gewotCS5zdGFydCA9IGZpYl90cmllX3NlcV9zdGFydCwKLQkubmV4dCAgPSBmaWJfdHJpZV9zZXFfbmV4dCwKLQkuc3RvcCAgPSBmaWJfdHJpZV9zZXFfc3RvcCwKLQkuc2hvdyAgPSBmaWJfdHJpZV9zZXFfc2hvdywKKwkuc3RhcnQgID0gZmliX3RyaWVfc2VxX3N0YXJ0LAorCS5uZXh0ICAgPSBmaWJfdHJpZV9zZXFfbmV4dCwKKwkuc3RvcCAgID0gZmliX3RyaWVfc2VxX3N0b3AsCisJLnNob3cgICA9IGZpYl90cmllX3NlcV9zaG93LAogfTsKIAogc3RhdGljIGludCBmaWJfdHJpZV9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKIAlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBmaWJfdHJpZV9pdGVyICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcykKKwkJZ290byBvdXQ7CiAKIAlyYyA9IHNlcV9vcGVuKGZpbGUsICZmaWJfdHJpZV9zZXFfb3BzKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0X2tmcmVlOwogCi0Jc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcQkgICAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZSA9IHM7CisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOwogb3V0OgogCXJldHVybiByYzsKIG91dF9rZnJlZToKKwlrZnJlZShzKTsKIAlnb3RvIG91dDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmliX3RyaWVfc2VxX2ZvcHMgPSB7Ci0JLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JPSBmaWJfdHJpZV9zZXFfb3BlbiwKLQkucmVhZAk9IHNlcV9yZWFkLAotCS5sbHNlZWsJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2U9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWJfdHJpZV9mb3BzID0geworCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgID0gZmliX3RyaWVfc2VxX29wZW4sCisJLnJlYWQgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGZpYl9mbGFnX3RyYW5zKGludCB0eXBlLCB1MzIgbWFzaywgY29uc3Qgc3RydWN0IGZpYl9pbmZvICpmaSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgdHlwZTJmbGFnc1tSVE5fTUFYICsgMV0gPSB7CisJCVs3XSA9IFJURl9SRUpFQ1QsIFs4XSA9IFJURl9SRUpFQ1QsCisJfTsKKwl1bnNpZ25lZCBmbGFncyA9IHR5cGUyZmxhZ3NbdHlwZV07CisKKwlpZiAoZmkgJiYgZmktPmZpYl9uaC0+bmhfZ3cpCisJCWZsYWdzIHw9IFJURl9HQVRFV0FZOworCWlmIChtYXNrID09IDB4RkZGRkZGRkYpCisJCWZsYWdzIHw9IFJURl9IT1NUOworCWZsYWdzIHw9IFJURl9VUDsKKwlyZXR1cm4gZmxhZ3M7Cit9CisKKy8qCisgKglUaGlzIG91dHB1dHMgL3Byb2MvbmV0L3JvdXRlLgorICoJVGhlIGZvcm1hdCBvZiB0aGUgZmlsZSBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgY2hhbmdlZAorICogCWFuZCBuZWVkcyB0byBiZSBzYW1lIGFzIGZpYl9oYXNoIG91dHB1dCB0byBhdm9pZCBicmVha2luZworICoJbGVnYWN5IHV0aWxpdGllcworICovCitzdGF0aWMgaW50IGZpYl9yb3V0ZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgbGVhZiAqbCA9IHY7CisJaW50IGk7CisJY2hhciBiZlsxMjhdOworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wcmludGYoc2VxLCAiJS0xMjdzXG4iLCAiSWZhY2VcdERlc3RpbmF0aW9uXHRHYXRld2F5ICIKKwkJCSAgICJcdEZsYWdzXHRSZWZDbnRcdFVzZVx0TWV0cmljXHRNYXNrXHRcdE1UVSIKKwkJCSAgICJcdFdpbmRvd1x0SVJUVCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoSVNfVE5PREUobCkpCisJCXJldHVybiAwOworCisJZm9yIChpPTMyOyBpPj0wOyBpLS0pIHsKKwkJc3RydWN0IGxlYWZfaW5mbyAqbGkgPSBmaW5kX2xlYWZfaW5mbygmbC0+bGlzdCwgaSk7CisJCXN0cnVjdCBmaWJfYWxpYXMgKmZhOworCQl1MzIgbWFzaywgcHJlZml4OworCisJCWlmICghbGkpCisJCQljb250aW51ZTsKKworCQltYXNrID0gaW5ldF9tYWtlX21hc2sobGktPnBsZW4pOworCQlwcmVmaXggPSBodG9ubChsLT5rZXkpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGZhLCAmbGktPmZhbGgsIGZhX2xpc3QpIHsKKwkJCWNvbnN0IHN0cnVjdCBmaWJfaW5mbyAqZmkgPSByY3VfZGVyZWZlcmVuY2UoZmEtPmZhX2luZm8pOworCQkJdW5zaWduZWQgZmxhZ3MgPSBmaWJfZmxhZ190cmFucyhmYS0+ZmFfdHlwZSwgbWFzaywgZmkpOworCisJCQlpZiAoZmEtPmZhX3R5cGUgPT0gUlROX0JST0FEQ0FTVAorCQkJICAgIHx8IGZhLT5mYV90eXBlID09IFJUTl9NVUxUSUNBU1QpCisJCQkJY29udGludWU7CisKKwkJCWlmIChmaSkKKwkJCQlzbnByaW50ZihiZiwgc2l6ZW9mKGJmKSwKKwkJCQkJICIlc1x0JTA4WFx0JTA4WFx0JTA0WFx0JWRcdCV1XHQlZFx0JTA4WFx0JWRcdCV1XHQldSIsCisJCQkJCSBmaS0+ZmliX2RldiA/IGZpLT5maWJfZGV2LT5uYW1lIDogIioiLAorCQkJCQkgcHJlZml4LAorCQkJCQkgZmktPmZpYl9uaC0+bmhfZ3csIGZsYWdzLCAwLCAwLAorCQkJCQkgZmktPmZpYl9wcmlvcml0eSwKKwkJCQkJIG1hc2ssCisJCQkJCSAoZmktPmZpYl9hZHZtc3MgPyBmaS0+ZmliX2Fkdm1zcyArIDQwIDogMCksCisJCQkJCSBmaS0+ZmliX3dpbmRvdywKKwkJCQkJIGZpLT5maWJfcnR0ID4+IDMpOworCQkJZWxzZQorCQkJCXNucHJpbnRmKGJmLCBzaXplb2YoYmYpLAorCQkJCQkgIipcdCUwOFhcdCUwOFhcdCUwNFhcdCVkXHQldVx0JWRcdCUwOFhcdCVkXHQldVx0JXUiLAorCQkJCQkgcHJlZml4LCAwLCBmbGFncywgMCwgMCwgMCwKKwkJCQkJIG1hc2ssIDAsIDAsIDApOworCisJCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTI3c1xuIiwgYmYpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZmliX3JvdXRlX3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IGZpYl90cmllX3NlcV9zdGFydCwKKwkubmV4dCAgID0gZmliX3RyaWVfc2VxX25leHQsCisJLnN0b3AgICA9IGZpYl90cmllX3NlcV9zdG9wLAorCS5zaG93ICAgPSBmaWJfcm91dGVfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGZpYl9yb3V0ZV9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBmaWJfdHJpZV9pdGVyICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcykKKwkJZ290byBvdXQ7CisKKwlyYyA9IHNlcV9vcGVuKGZpbGUsICZmaWJfcm91dGVfc2VxX29wcyk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9rZnJlZTsKKworCXNlcQkgICAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZSA9IHM7CisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmliX3JvdXRlX2ZvcHMgPSB7CisJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgPSBmaWJfcm91dGVfc2VxX29wZW4sCisJLnJlYWQgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAogfTsKIAogaW50IF9faW5pdCBmaWJfcHJvY19pbml0KHZvaWQpCiB7Ci0JaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgiZmliX3RyaWUiLCBTX0lSVUdPLCAmZmliX3RyaWVfc2VxX2ZvcHMpKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJmaWJfdHJpZSIsIFNfSVJVR08sICZmaWJfdHJpZV9mb3BzKSkKKwkJZ290byBvdXQxOworCisJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgiZmliX3RyaWVzdGF0IiwgU19JUlVHTywgJmZpYl90cmllc3RhdF9mb3BzKSkKKwkJZ290byBvdXQyOworCisJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgicm91dGUiLCBTX0lSVUdPLCAmZmliX3JvdXRlX2ZvcHMpKQorCQlnb3RvIG91dDM7CisKIAlyZXR1cm4gMDsKKworb3V0MzoKKwlwcm9jX25ldF9yZW1vdmUoImZpYl90cmllc3RhdCIpOworb3V0MjoKKwlwcm9jX25ldF9yZW1vdmUoImZpYl90cmllIik7CitvdXQxOgorCXJldHVybiAtRU5PTUVNOwogfQogCiB2b2lkIF9faW5pdCBmaWJfcHJvY19leGl0KHZvaWQpCiB7CiAJcHJvY19uZXRfcmVtb3ZlKCJmaWJfdHJpZSIpOworCXByb2NfbmV0X3JlbW92ZSgiZmliX3RyaWVzdGF0Iik7CisJcHJvY19uZXRfcmVtb3ZlKCJyb3V0ZSIpOwogfQogCiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRwZWVyLmMgYi9uZXQvaXB2NC9pbmV0cGVlci5jCmluZGV4IGY4NGJhOWMuLjJmYzNmZDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRwZWVyLmMKKysrIGIvbmV0L2lwdjQvaW5ldHBlZXIuYwpAQCAtMTAwLDggKzEwMCw3IEBACiAjZGVmaW5lIFBFRVJfTUFYX0NMRUFOVVBfV09SSyAzMAogCiBzdGF0aWMgdm9pZCBwZWVyX2NoZWNrX2V4cGlyZSh1bnNpZ25lZCBsb25nIGR1bW15KTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBwZWVyX3BlcmlvZGljX3RpbWVyID0KLQlUSU1FUl9JTklUSUFMSVpFUihwZWVyX2NoZWNrX2V4cGlyZSwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHBlZXJfcGVyaW9kaWNfdGltZXIsIHBlZXJfY2hlY2tfZXhwaXJlLCAwLCAwKTsKIAogLyogRXhwb3J0ZWQgZm9yIHN5c2N0bF9uZXRfaXB2NC4gICovCiBpbnQgaW5ldF9wZWVyX2djX21pbnRpbWUgPSAxMCAqIEhaLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYyBiL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKaW5kZXggOWU2ZTY4My4uZTdkMjZkOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYworKysgYi9uZXQvaXB2NC9pcF9mcmFnbWVudC5jCkBAIC00NTcsNyArNDU3LDcgQEAKIAogCWlmIChwc2tiX3B1bGwoc2tiLCBpaGwpID09IE5VTEwpCiAJCWdvdG8gZXJyOwotCWlmIChwc2tiX3RyaW0oc2tiLCBlbmQtb2Zmc2V0KSkKKwlpZiAocHNrYl90cmltX3Jjc3VtKHNrYiwgZW5kLW9mZnNldCkpCiAJCWdvdG8gZXJyOwogCiAJLyogRmluZCBvdXQgd2hpY2ggZnJhZ21lbnRzIGFyZSBpbiBmcm9udCBhbmQgYXQgdGhlIGJhY2sgb2YgdXMKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwY29tcC5jIGIvbmV0L2lwdjQvaXBjb21wLmMKaW5kZXggZGNiN2VlNi4uZmM3MThkZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBjb21wLmMKKysrIGIvbmV0L2lwdjQvaXBjb21wLmMKQEAgLTM0NSw4ICszNDUsNyBAQAogCiAJZm9yX2VhY2hfY3B1KGNwdSkgewogCQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gKnBlcl9jcHVfcHRyKHRmbXMsIGNwdSk7Ci0JCWlmICh0Zm0pCi0JCQljcnlwdG9fZnJlZV90Zm0odGZtKTsKKwkJY3J5cHRvX2ZyZWVfdGZtKHRmbSk7CiAJfQogCWZyZWVfcGVyY3B1KHRmbXMpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBjb25maWcuYyBiL25ldC9pcHY0L2lwY29uZmlnLmMKaW5kZXggNjNlMTA2Ni4uOTUzMTI5ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBjb25maWcuYworKysgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCkBAIC01NCw2ICs1NCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KICNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bmV0L2FycC5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9pcGNvbmZpZy5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCBlMDQ2ZjU1Li4zMGFhOGUyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMzQsNiArMzQsNyBAQAogCiBjb25maWcgSVBfTkZfQ09OTlRSQUNLX01BUksKIAlib29sICAnQ29ubmVjdGlvbiBtYXJrIHRyYWNraW5nIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGNvbm5lY3Rpb24gbWFya3MsIHVzZWQgYnkgdGhlCiAJICBgQ09OTk1BUksnIHRhcmdldCBhbmQgYGNvbm5tYXJrJyBtYXRjaC4gU2ltaWxhciB0byB0aGUgbWFyayB2YWx1ZQpAQCAtODUsNiArODYsMjUgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IFkuCiAKK2NvbmZpZyBJUF9ORl9ORVRCSU9TX05TCisJdHJpc3RhdGUgIk5ldEJJT1MgbmFtZSBzZXJ2aWNlIHByb3RvY29sIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgTmV0QklPUyBuYW1lIHNlcnZpY2UgcmVxdWVzdHMgYXJlIHNlbnQgYXMgYnJvYWRjYXN0IG1lc3NhZ2VzIGZyb20gYW4KKwkgIHVucHJpdmlsZWdlZCBwb3J0IGFuZCByZXNwb25kZWQgdG8gd2l0aCB1bmljYXN0IG1lc3NhZ2VzIHRvIHRoZQorCSAgc2FtZSBwb3J0LiBUaGlzIG1ha2UgdGhlbSBoYXJkIHRvIGZpcmV3YWxsIHByb3Blcmx5IGJlY2F1c2UgY29ubmVjdGlvbgorCSAgdHJhY2tpbmcgZG9lc24ndCBkZWFsIHdpdGggYnJvYWRjYXN0cy4gVGhpcyBoZWxwZXIgdHJhY2tzIGxvY2FsbHkKKwkgIG9yaWdpbmF0aW5nIE5ldEJJT1MgbmFtZSBzZXJ2aWNlIHJlcXVlc3RzIGFuZCB0aGUgY29ycmVzcG9uZGluZworCSAgcmVzcG9uc2VzLiBJdCByZWxpZXMgb24gY29ycmVjdCBJUCBhZGRyZXNzIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmljYWxseQorCSAgbmV0bWFzayBhbmQgYnJvYWRjYXN0IGFkZHJlc3MuIFdoZW4gcHJvcGVybHkgY29uZmlndXJlZCwgdGhlIG91dHB1dAorCSAgb2YgImlwIGFkZHJlc3Mgc2hvdyIgc2hvdWxkIGxvb2sgc2ltaWxhciB0byB0aGlzOgorCisJICAkIGlwIC00IGFkZHJlc3Mgc2hvdyBldGgwCisJICA0OiBldGgwOiA8QlJPQURDQVNULE1VTFRJQ0FTVCxVUD4gbXR1IDE1MDAgcWRpc2MgcGZpZm9fZmFzdCBxbGVuIDEwMDAKKwkgICAgICBpbmV0IDE3Mi4xNi4yLjI1Mi8yNCBicmQgMTcyLjE2LjIuMjU1IHNjb3BlIGdsb2JhbCBldGgwCisJICAKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgSVBfTkZfVEZUUAogCXRyaXN0YXRlICJURlRQIHByb3RvY29sIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZSBiL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQppbmRleCBhN2JkMzhmLi4xYmEwZGI3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCkBAIC0yMSw2ICsyMSw3IEBACiBvYmotJChDT05GSUdfSVBfTkZfVEZUUCkgKz0gaXBfY29ubnRyYWNrX3RmdHAubwogb2JqLSQoQ09ORklHX0lQX05GX0ZUUCkgKz0gaXBfY29ubnRyYWNrX2Z0cC5vCiBvYmotJChDT05GSUdfSVBfTkZfSVJDKSArPSBpcF9jb25udHJhY2tfaXJjLm8KK29iai0kKENPTkZJR19JUF9ORl9ORVRCSU9TX05TKSArPSBpcF9jb25udHJhY2tfbmV0Ymlvc19ucy5vCiAKICMgTkFUIGhlbHBlcnMgCiBvYmotJChDT05GSUdfSVBfTkZfTkFUX0FNQU5EQSkgKz0gaXBfbmF0X2FtYW5kYS5vCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2FtYW5kYS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19hbWFuZGEuYwppbmRleCBiZTRjOWViLi5kYzIwODgxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2FtYW5kYS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfYW1hbmRhLmMKQEAgLTEwOCw2ICsxMDgsNyBAQAogCQl9CiAKIAkJZXhwLT5leHBlY3RmbiA9IE5VTEw7CisJCWV4cC0+ZmxhZ3MgPSAwOwogCiAJCWV4cC0+dHVwbGUuc3JjLmlwID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5pcDsKIAkJZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCA9IDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfY29yZS5jCmluZGV4IGEwNjQ4NjAuLjE5Y2JhMTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfY29yZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfY29yZS5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIAogCiAvKiBpcF9jb25udHJhY2tfZXhwZWN0IGhlbHBlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIHVubGlua19leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3ZvaWQgaXBfY3RfdW5saW5rX2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQogewogCUFTU0VSVF9XUklURV9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CiAJSVBfTkZfQVNTRVJUKCF0aW1lcl9wZW5kaW5nKCZleHAtPnRpbWVvdXQpKTsKQEAgLTIwNywxOCArMjA3LDEyIEBACiAJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKIH0KIAotdm9pZCBfX2lwX2N0X2V4cGVjdF91bmxpbmtfZGVzdHJveShzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQotewotCXVubGlua19leHBlY3QoZXhwKTsKLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotfQotCiBzdGF0aWMgdm9pZCBleHBlY3RhdGlvbl90aW1lZF9vdXQodW5zaWduZWQgbG9uZyB1bF9leHBlY3QpCiB7CiAJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCA9ICh2b2lkICopdWxfZXhwZWN0OwogCiAJd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCXVubGlua19leHBlY3QoZXhwKTsKKwlpcF9jdF91bmxpbmtfZXhwZWN0KGV4cCk7CiAJd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7CiAJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKIH0KQEAgLTI2NCwxMCArMjU4LDE0IEBACiAJCSAgIG1hc3RlciBjdCBuZXZlciBnb3QgY29uZmlybWVkLCB3ZSdkIGhvbGQgYSByZWZlcmVuY2UgdG8gaXQKIAkJICAgYW5kIHdlaXJkIHRoaW5ncyB3b3VsZCBoYXBwZW4gdG8gZnV0dXJlIHBhY2tldHMpLiAqLwogCQlpZiAoaXBfY3RfdHVwbGVfbWFza19jbXAodHVwbGUsICZpLT50dXBsZSwgJmktPm1hc2spCi0JCSAgICAmJiBpc19jb25maXJtZWQoaS0+bWFzdGVyKQotCQkgICAgJiYgZGVsX3RpbWVyKCZpLT50aW1lb3V0KSkgewotCQkJdW5saW5rX2V4cGVjdChpKTsKLQkJCXJldHVybiBpOworCQkgICAgJiYgaXNfY29uZmlybWVkKGktPm1hc3RlcikpIHsKKwkJCWlmIChpLT5mbGFncyAmIElQX0NUX0VYUEVDVF9QRVJNQU5FTlQpIHsKKwkJCQlhdG9taWNfaW5jKCZpLT51c2UpOworCQkJCXJldHVybiBpOworCQkJfSBlbHNlIGlmIChkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7CisJCQkJaXBfY3RfdW5saW5rX2V4cGVjdChpKTsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KIAkJfQogCX0KIAlyZXR1cm4gTlVMTDsKQEAgLTI4NCw3ICsyODIsNyBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGksIHRtcCwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgewogCQlpZiAoaS0+bWFzdGVyID09IGN0ICYmIGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKLQkJCXVubGlua19leHBlY3QoaSk7CisJCQlpcF9jdF91bmxpbmtfZXhwZWN0KGkpOwogCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoaSk7CiAJCX0KIAl9CkBAIC05MjUsNyArOTIzLDcgQEAKIAkvKiBjaG9vc2UgdGhlIHRoZSBvbGRlc3QgZXhwZWN0YXRpb24gdG8gZXZpY3QgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoaSwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgewogCQlpZiAoZXhwZWN0X21hdGNoZXMoaSwgZXhwKSAmJiBkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7Ci0JCQl1bmxpbmtfZXhwZWN0KGkpOworCQkJaXBfY3RfdW5saW5rX2V4cGVjdChpKTsKIAkJCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwogCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoaSk7CiAJCQlyZXR1cm47CkBAIC05MzQsNiArOTMyLDkgQEAKIAl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKIH0KIAorLyogV2UgZG9uJ3QgaW5jcmVhc2UgdGhlIG1hc3RlciBjb25udHJhY2sgcmVmY291bnQgZm9yIG5vbi1mdWxmaWxsZWQKKyAqIGNvbm50cmFja3MuIER1cmluZyB0aGUgY29ubnRyYWNrIGRlc3RydWN0aW9uLCB0aGUgZXhwZWN0YXRpb25zIGFyZSAKKyAqIGFsd2F5cyBraWxsZWQgYmVmb3JlIHRoZSBjb25udHJhY2sgaXRzZWxmICovCiBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhzdHJ1Y3QgaXBfY29ubnRyYWNrICptZSkKIHsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqbmV3OwpAQCAtOTQ0LDE3ICs5NDUsMTQgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCW5ldy0+bWFzdGVyID0gbWU7Ci0JYXRvbWljX2luYygmbmV3LT5tYXN0ZXItPmN0X2dlbmVyYWwudXNlKTsKIAlhdG9taWNfc2V0KCZuZXctPnVzZSwgMSk7CiAJcmV0dXJuIG5ldzsKIH0KIAogdm9pZCBpcF9jb25udHJhY2tfZXhwZWN0X3B1dChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQogewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZleHAtPnVzZSkpIHsKLQkJaXBfY29ubnRyYWNrX3B1dChleHAtPm1hc3Rlcik7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmV4cC0+dXNlKSkKIAkJa21lbV9jYWNoZV9mcmVlKGlwX2Nvbm50cmFja19leHBlY3RfY2FjaGVwLCBleHApOwotCX0KIH0KIAogc3RhdGljIHZvaWQgaXBfY29ubnRyYWNrX2V4cGVjdF9pbnNlcnQoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKQEAgLTk4Miw3ICs5ODAsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShpLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7CiAJCWlmIChpLT5tYXN0ZXIgPT0gbWFzdGVyKSB7CiAJCQlpZiAoZGVsX3RpbWVyKCZpLT50aW1lb3V0KSkgewotCQkJCXVubGlua19leHBlY3QoaSk7CisJCQkJaXBfY3RfdW5saW5rX2V4cGVjdChpKTsKIAkJCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChpKTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMTA5OSw3ICsxMDk3LDcgQEAKIAkvKiBHZXQgcmlkIG9mIGV4cGVjdGF0aW9ucyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShleHAsIHRtcCwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgewogCQlpZiAoZXhwLT5tYXN0ZXItPmhlbHBlciA9PSBtZSAmJiBkZWxfdGltZXIoJmV4cC0+dGltZW91dCkpIHsKLQkJCXVubGlua19leHBlY3QoZXhwKTsKKwkJCWlwX2N0X3VubGlua19leHBlY3QoZXhwKTsKIAkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19mdHAuYwppbmRleCAzYTI2MjdkLi4xYjc5ZWMzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfZnRwLmMKQEAgLTQyMSw2ICs0MjEsNyBAQAogCQkgIHsgMHhGRkZGRkZGRiwgeyAudGNwID0geyAweEZGRkYgfSB9LCAweEZGIH19KTsKIAogCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOworCWV4cC0+ZmxhZ3MgPSAwOwogCiAJLyogTm93LCBOQVQgbWlnaHQgd2FudCB0byBtYW5nbGUgdGhlIHBhY2tldCwgYW5kIHJlZ2lzdGVyIHRoZQogCSAqIChwb3NzaWJseSBjaGFuZ2VkKSBleHBlY3RhdGlvbiBpdHNlbGYuICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2lyYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19pcmMuYwppbmRleCAyNTQzOGVlLi5kN2E4YTk4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2lyYy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaXJjLmMKQEAgLTIyMSw2ICsyMjEsNyBAQAogCQkJCXsgeyAwLCB7IDAgfSB9LAogCQkJCSAgeyAweEZGRkZGRkZGLCB7IC50Y3AgPSB7IDB4RkZGRiB9IH0sIDB4RkYgfX0pOwogCQkJZXhwLT5leHBlY3RmbiA9IE5VTEw7CisJCQlleHAtPmZsYWdzID0gMDsKIAkJCWlmIChpcF9uYXRfaXJjX2hvb2spCiAJCQkJcmV0ID0gaXBfbmF0X2lyY19ob29rKHBza2IsIGN0aW5mbywgCiAJCQkJCQkgICAgICBhZGRyX2JlZ19wIC0gaWJfcHRyLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRiaW9zX25zLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGJpb3NfbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjcyNDY2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRiaW9zX25zLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiAgICAgIE5ldEJJT1MgbmFtZSBzZXJ2aWNlIGJyb2FkY2FzdCBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlcgorICoKKyAqICAgICAgKGMpIDIwMDUgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisvKgorICogICAgICBUaGlzIGhlbHBlciB0cmFja3MgbG9jYWxseSBvcmlnaW5hdGluZyBOZXRCSU9TIG5hbWUgc2VydmljZQorICogICAgICByZXF1ZXN0cyBieSBpc3N1aW5nIHBlcm1hbmVudCBleHBlY3RhdGlvbnMgKHZhbGlkIHVudGlsCisgKiAgICAgIHRpbWluZyBvdXQpIG1hdGNoaW5nIGFsbCByZXBseSBjb25uZWN0aW9ucyBmcm9tIHRoZQorICogICAgICBkZXN0aW5hdGlvbiBuZXR3b3JrLiBUaGUgb25seSBOZXRCSU9TIHNwZWNpZmljIHRoaW5nIGlzCisgKiAgICAgIGFjdHVhbGx5IHRoZSBwb3J0IG51bWJlci4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+CisKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXRCSU9TIG5hbWUgc2VydmljZSBicm9hZGNhc3QgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCB0aW1lb3V0ID0gMzsKK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAidGltZW91dCBmb3IgbWFzdGVyIGNvbm5lY3Rpb24vcmVwbGllcyBpbiBzZWNvbmRzIik7CisKK3N0YXRpYyBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisgICAgICAgICAgICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQoreworCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJc3RydWN0IGlwaGRyICppcGggPSAoKnBza2IpLT5uaC5pcGg7CisJc3RydWN0IHVkcGhkciBfdWgsICp1aDsKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopKCpwc2tiKS0+ZHN0OworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwl1X2ludDMyX3QgbWFzayA9IDA7CisKKwkvKiB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gbG9jYWxseSBnZW5lcmF0ZWQgcGFja2V0cyAqLworCWlmICgoKnBza2IpLT5zayA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlpZiAocnQgPT0gTlVMTCB8fCAhKHJ0LT5ydF9mbGFncyAmIFJUQ0ZfQlJPQURDQVNUKSkKKwkJZ290byBvdXQ7CisJaWYgKENUSU5GTzJESVIoY3RpbmZvKSAhPSBJUF9DVF9ESVJfT1JJR0lOQUwpCisJCWdvdG8gb3V0OworCisJcmN1X3JlYWRfbG9jaygpOworCWluX2RldiA9IF9faW5fZGV2X2dldChydC0+dS5kc3QuZGV2KTsKKwlpZiAoaW5fZGV2ICE9IE5VTEwpIHsKKwkJZm9yX3ByaW1hcnlfaWZhKGluX2RldikgeworCQkJaWYgKGlmYS0+aWZhX2Jyb2FkY2FzdCA9PSBpcGgtPmRhZGRyKSB7CisJCQkJbWFzayA9IGlmYS0+aWZhX21hc2s7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZW5kZm9yX2lmYShpbl9kZXYpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmIChtYXNrID09IDApCisJCWdvdG8gb3V0OworCisJdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIGlwaC0+aWhsICogNCwgc2l6ZW9mKF91aCksICZfdWgpOworCUJVR19PTih1aCA9PSBOVUxMKTsKKworCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpOworCWlmIChleHAgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJbWVtc2V0KCZleHAtPnR1cGxlLCAwLCBzaXplb2YoZXhwLT50dXBsZSkpOworCWV4cC0+dHVwbGUuc3JjLmlwICAgICAgICAgPSBpcGgtPmRhZGRyICYgbWFzazsKKwlleHAtPnR1cGxlLmRzdC5pcCAgICAgICAgID0gaXBoLT5zYWRkcjsKKwlleHAtPnR1cGxlLmRzdC51LnVkcC5wb3J0ID0gdWgtPnNvdXJjZTsKKwlleHAtPnR1cGxlLmRzdC5wcm90b251bSAgID0gSVBQUk9UT19VRFA7CisKKwltZW1zZXQoJmV4cC0+bWFzaywgMCwgc2l6ZW9mKGV4cC0+bWFzaykpOworCWV4cC0+bWFzay5zcmMuaXAgICAgICAgICAgPSBtYXNrOworCWV4cC0+bWFzay5kc3QuaXAgICAgICAgICAgPSAweEZGRkZGRkZGOworCWV4cC0+bWFzay5kc3QudS51ZHAucG9ydCAgPSAweEZGRkY7CisJZXhwLT5tYXNrLmRzdC5wcm90b251bSAgICA9IDB4RkY7CisKKwlleHAtPmV4cGVjdGZuICAgICAgICAgICAgID0gTlVMTDsKKwlleHAtPmZsYWdzICAgICAgICAgICAgICAgID0gSVBfQ1RfRVhQRUNUX1BFUk1BTkVOVDsKKworCWlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApOworCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CisKKwlpcF9jdF9yZWZyZXNoX2FjY3QoY3QsIGN0aW5mbywgTlVMTCwgdGltZW91dCAqIEhaKTsKK291dDoKKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCitzdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgaGVscGVyID0geworCS5uYW1lCQkJPSAibmV0Ymlvcy1ucyIsCisJLnR1cGxlID0geworCQkuc3JjID0geworCQkJLnUgPSB7CisJCQkJLnVkcCA9IHsKKwkJCQkJLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKDEzNyksCisJCQkJfQorCQkJfQorCQl9LAorCQkuZHN0ID0geworCQkJLnByb3RvbnVtCT0gSVBQUk9UT19VRFAsCisJCX0sCisJfSwKKwkubWFzayA9IHsKKwkJLnNyYyA9IHsKKwkJCS51ID0geworCQkJCS51ZHAgPSB7CisJCQkJCS5wb3J0CT0gMHhGRkZGLAorCQkJCX0KKwkJCX0KKwkJfSwKKwkJLmRzdCA9IHsKKwkJCS5wcm90b251bQk9IDB4RkYsCisJCX0sCisJfSwKKwkubWF4X2V4cGVjdGVkCQk9IDEsCisJLm1lCQkJPSBUSElTX01PRFVMRSwKKwkuaGVscAkJCT0gaGVscCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwloZWxwZXIudGltZW91dCA9IHRpbWVvdXQ7CisJcmV0dXJuIGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJmhlbHBlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZoZWxwZXIpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRsaW5rLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGxpbmsuYwppbmRleCBhNGU5Mjc4Li4xNWFlZjM1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGxpbmsuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGxpbmsuYwpAQCAtMTM0OSw4ICsxMzQ5LDEwIEBACiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShleHAsIHRtcCwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwKIAkJCQkJIGxpc3QpIHsKIAkJCWlmIChleHAtPm1hc3Rlci0+aGVscGVyID09IGggCi0JCQkgICAgJiYgZGVsX3RpbWVyKCZleHAtPnRpbWVvdXQpKQotCQkJCV9faXBfY3RfZXhwZWN0X3VubGlua19kZXN0cm95KGV4cCk7CisJCQkgICAgJiYgZGVsX3RpbWVyKCZleHAtPnRpbWVvdXQpKSB7CisJCQkJaXBfY3RfdW5saW5rX2V4cGVjdChleHApOworCQkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CisJCQl9CiAJCX0KIAkJd3JpdGVfdW5sb2NrKCZpcF9jb25udHJhY2tfbG9jayk7CiAJfSBlbHNlIHsKQEAgLTEzNTgsOCArMTM2MCwxMCBAQAogCQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShleHAsIHRtcCwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwKIAkJCQkJIGxpc3QpIHsKLQkJCWlmIChkZWxfdGltZXIoJmV4cC0+dGltZW91dCkpCi0JCQkJX19pcF9jdF9leHBlY3RfdW5saW5rX2Rlc3Ryb3koZXhwKTsKKwkJCWlmIChkZWxfdGltZXIoJmV4cC0+dGltZW91dCkpIHsKKwkJCQlpcF9jdF91bmxpbmtfZXhwZWN0KGV4cCk7CisJCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKwkJCX0KIAkJfQogCQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKIAl9CkBAIC0xNDEzLDYgKzE0MTcsNyBAQAogCX0KIAkKIAlleHAtPmV4cGVjdGZuID0gTlVMTDsKKwlleHAtPmZsYWdzID0gMDsKIAlleHAtPm1hc3RlciA9IGN0OwogCW1lbWNweSgmZXhwLT50dXBsZSwgJnR1cGxlLCBzaXplb2Yoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSkpOwogCW1lbWNweSgmZXhwLT5tYXNrLCAmbWFzaywgc2l6ZW9mKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUpKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3RjcC5jCmluZGV4IGYyM2VmMWYuLjE5ODVhYmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdGNwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b190Y3AuYwpAQCAtMzQ5LDYgKzM0OSw3IEBACiAJcmV0dXJuIDA7CiAKIG5mYXR0cl9mYWlsdXJlOgorCXJlYWRfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7CiAJcmV0dXJuIC0xOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jCmluZGV4IGVlNTg5NWEuLmFlM2UzZTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jCkBAIC05OTgsNyArOTk4LDcgQEAKIEVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQpOwogRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKF9faXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKTsKLUVYUE9SVF9TWU1CT0xfR1BMKF9faXBfY3RfZXhwZWN0X3VubGlua19kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlwX2N0X3VubGlua19leHBlY3QpOwogCiBFWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja190dXBsZV90YWtlbik7CiBFWFBPUlRfU1lNQk9MKGlwX2N0X2dhdGhlcl9mcmFncyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3RmdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfdGZ0cC5jCmluZGV4IGY4ZmYxNzAuLmQyYjU5MDUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfdGZ0cC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfdGZ0cC5jCkBAIC03NSw2ICs3NSw3IEBACiAJCWV4cC0+bWFzay5kc3QudS51ZHAucG9ydCA9IDB4ZmZmZjsKIAkJZXhwLT5tYXNrLmRzdC5wcm90b251bSA9IDB4ZmY7CiAJCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOworCQlleHAtPmZsYWdzID0gMDsKIAogCQlERUJVR1AoImV4cGVjdDogIik7CiAJCURVTVBfVFVQTEUoJmV4cC0+dHVwbGUpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9ydWxlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYwppbmRleCA2MGQ3MGZhLi5jYjY2YjhiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYwpAQCAtMjU1LDYgKzI1NSwyNyBAQAogCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjb25udHJhY2ssICZyYW5nZSwgaG9va251bSk7CiB9CiAKK3Vuc2lnbmVkIGludAorYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpcF9uYXRfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pCit7CisJdV9pbnQzMl90IGlwCisJCT0gKEhPT0syTUFOSVAoaG9va251bSkgPT0gSVBfTkFUX01BTklQX1NSQworCQkgICA/IGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwCisJCSAgIDogY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXApOworCXVfaW50MTZfdCBhbGwKKwkJPSAoSE9PSzJNQU5JUChob29rbnVtKSA9PSBJUF9OQVRfTUFOSVBfU1JDCisJCSAgID8gY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QudS5hbGwKKwkJICAgOiBjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy51LmFsbCk7CisJc3RydWN0IGlwX25hdF9yYW5nZSByYW5nZQorCQk9IHsgSVBfTkFUX1JBTkdFX01BUF9JUFMsIGlwLCBpcCwgeyBhbGwgfSwgeyBhbGwgfSB9OworCisJREVCVUdQKCJBbGxvY2F0aW5nIE5VTEwgYmluZGluZyBmb3IgY29uZmlybWVkICVwICgldS4ldS4ldS4ldSlcbiIsCisJICAgICAgIGNvbm50cmFjaywgTklQUVVBRChpcCkpOworCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjb25udHJhY2ssICZyYW5nZSwgaG9va251bSk7Cit9CisKIGludCBpcF9uYXRfcnVsZV9maW5kKHN0cnVjdCBza19idWZmICoqcHNrYiwKIAkJICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKIAkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCmluZGV4IDg5ZGIwNTIuLjBmZjM2OGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCkBAIC0xMjMsOCArMTIzLDEyIEBACiAJCWlmICghaXBfbmF0X2luaXRpYWxpemVkKGN0LCBtYW5pcHR5cGUpKSB7CiAJCQl1bnNpZ25lZCBpbnQgcmV0OwogCi0JCQkvKiBMT0NBTF9JTiBob29rIGRvZXNuJ3QgaGF2ZSBhIGNoYWluISAgKi8KLQkJCWlmIChob29rbnVtID09IE5GX0lQX0xPQ0FMX0lOKQorCQkJaWYgKHVubGlrZWx5KGlzX2NvbmZpcm1lZChjdCkpKQorCQkJCS8qIE5BVCBtb2R1bGUgd2FzIGxvYWRlZCBsYXRlICovCisJCQkJcmV0ID0gYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChjdCwgaW5mbywKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tudW0pOworCQkJZWxzZSBpZiAoaG9va251bSA9PSBORl9JUF9MT0NBTF9JTikKKwkJCQkvKiBMT0NBTF9JTiBob29rIGRvZXNuJ3QgaGF2ZSBhIGNoYWluISAgKi8KIAkJCQlyZXQgPSBhbGxvY19udWxsX2JpbmRpbmcoY3QsIGluZm8sIGhvb2tudW0pOwogCQkJZWxzZQogCQkJCXJldCA9IGlwX25hdF9ydWxlX2ZpbmQocHNrYiwgaG9va251bSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCmluZGV4IDJkMDVjYWYuLjdkMzg5MTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJbWVtY3B5KCZjLT5jbHVzdGVybWFjLCAmaS0+Y2x1c3Rlcm1hYywgRVRIX0FMRU4pOwogCWMtPm51bV90b3RhbF9ub2RlcyA9IGktPm51bV90b3RhbF9ub2RlczsKIAljLT5udW1fbG9jYWxfbm9kZXMgPSBpLT5udW1fbG9jYWxfbm9kZXM7Ci0JbWVtY3B5KCZjLT5sb2NhbF9ub2RlcywgJmktPmxvY2FsX25vZGVzLCBzaXplb2YoJmMtPmxvY2FsX25vZGVzKSk7CisJbWVtY3B5KCZjLT5sb2NhbF9ub2RlcywgJmktPmxvY2FsX25vZGVzLCBzaXplb2YoYy0+bG9jYWxfbm9kZXMpKTsKIAljLT5oYXNoX21vZGUgPSBpLT5oYXNoX21vZGU7CiAJYy0+aGFzaF9pbml0dmFsID0gaS0+aGFzaF9pbml0dmFsOwogCWF0b21pY19zZXQoJmMtPnJlZmNvdW50LCAxKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCmluZGV4IGYxMTVhODQuLmYwNTcwMjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYwpAQCAtOTIsMTAgKzkyLDcgQEAKIAlmbC5mbF9pcF9zcG9ydCA9IHRjcGgtPmRlc3Q7CiAJZmwuZmxfaXBfZHBvcnQgPSB0Y3BoLT5zb3VyY2U7CiAKLQlpZiAoeGZybV9sb29rdXAoKHN0cnVjdCBkc3RfZW50cnkgKiopJnJ0LCAmZmwsIE5VTEwsIDApKSB7Ci0JCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOwotCQlydCA9IE5VTEw7Ci0JfQorCXhmcm1fbG9va3VwKChzdHJ1Y3QgZHN0X2VudHJ5ICoqKSZydCwgJmZsLCBOVUxMLCAwKTsKIAogCXJldHVybiBydDsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfb3duZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfb3duZXIuYwppbmRleCBjMTg4OWY4Li4wY2VlMjg2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X293bmVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9vd25lci5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcm91dGUuYyBiL25ldC9pcHY0L3JvdXRlLmMKaW5kZXggOGMwYjE0ZS4uODU0OWYyNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcm91dGUuYworKysgYi9uZXQvaXB2NC9yb3V0ZS5jCkBAIC0xNzYwLDYgKzE3NjAsNyBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCisJYXRvbWljX3NldCgmcnRoLT51LmRzdC5fX3JlZmNudCwgMSk7CiAJcnRoLT51LmRzdC5mbGFncz0gRFNUX0hPU1Q7CiAjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQKIAlpZiAocmVzLT5maS0+ZmliX25ocyA+IDEpCkBAIC0xODIwLDcgKzE4MjEsNiBAQAogCWVyciA9IF9fbWtyb3V0ZV9pbnB1dChza2IsIHJlcywgaW5fZGV2LCBkYWRkciwgc2FkZHIsIHRvcywgJnJ0aCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQlhdG9taWNfc2V0KCZydGgtPnUuZHN0Ll9fcmVmY250LCAxKTsKIAogCS8qIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSAqLwogCWhhc2ggPSBydF9oYXNoX2NvZGUoZGFkZHIsIHNhZGRyIF4gKGZsLT5paWYgPDwgNSksIHRvcyk7CkBAIC0xODM0LDggKzE4MzQsOCBAQAogCQkJCSAgIHUzMiBkYWRkciwgdTMyIHNhZGRyLCB1MzIgdG9zKQogewogI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVECi0Jc3RydWN0IHJ0YWJsZSogcnRoID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyIGhvcCwgaG9wY291bnQsIGxhc3Rob3A7CisJc3RydWN0IHJ0YWJsZSogcnRoID0gTlVMTCwgKnJ0cmVzOworCXVuc2lnbmVkIGNoYXIgaG9wLCBob3Bjb3VudDsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAl1bnNpZ25lZCBpbnQgaGFzaDsKIApAQCAtMTg0NCw4ICsxODQ0LDYgQEAKIAllbHNlCiAJCWhvcGNvdW50ID0gMTsKIAotCWxhc3Rob3AgPSBob3Bjb3VudCAtIDE7Ci0KIAkvKiBkaXN0aW5ndWlzaCBiZXR3ZWVuIG11bHRpcGF0aCBhbmQgc2luZ2xlcGF0aCAqLwogCWlmIChob3Bjb3VudCA8IDIpCiAJCXJldHVybiBpcF9ta3JvdXRlX2lucHV0X2RlZihza2IsIHJlcywgZmwsIGluX2RldiwgZGFkZHIsCkBAIC0xODU1LDYgKzE4NTMsMTAgQEAKIAlmb3IgKGhvcCA9IDA7IGhvcCA8IGhvcGNvdW50OyBob3ArKykgewogCQlyZXMtPm5oX3NlbCA9IGhvcDsKIAorCQkvKiBwdXQgcmVmZXJlbmNlIHRvIHByZXZpb3VzIHJlc3VsdCAqLworCQlpZiAoaG9wKQorCQkJaXBfcnRfcHV0KHJ0cmVzKTsKKwogCQkvKiBjcmVhdGUgYSByb3V0aW5nIGNhY2hlIGVudHJ5ICovCiAJCWVyciA9IF9fbWtyb3V0ZV9pbnB1dChza2IsIHJlcywgaW5fZGV2LCBkYWRkciwgc2FkZHIsIHRvcywKIAkJCQkgICAgICAmcnRoKTsKQEAgLTE4NjMsNyArMTg2NSw3IEBACiAKIAkJLyogcHV0IGl0IGludG8gdGhlIGNhY2hlICovCiAJCWhhc2ggPSBydF9oYXNoX2NvZGUoZGFkZHIsIHNhZGRyIF4gKGZsLT5paWYgPDwgNSksIHRvcyk7Ci0JCWVyciA9IHJ0X2ludGVybl9oYXNoKGhhc2gsIHJ0aCwgKHN0cnVjdCBydGFibGUqKikmc2tiLT5kc3QpOworCQllcnIgPSBydF9pbnRlcm5faGFzaChoYXNoLCBydGgsICZydHJlcyk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCkBAIC0xODczLDEzICsxODc1LDggQEAKIAkJCQkgICAgIEZJQl9SRVNfTkVUTUFTSygqcmVzKSwKIAkJCQkgICAgIHJlcy0+cHJlZml4bGVuLAogCQkJCSAgICAgJkZJQl9SRVNfTkgoKnJlcykpOwotCi0JCS8qIG9ubHkgZm9yIHRoZSBsYXN0IGhvcCB0aGUgcmVmZXJlbmNlIGNvdW50IGlzIGhhbmRsZWQKLQkJICogb3V0c2lkZQotCQkgKi8KLQkJaWYgKGhvcCA9PSBsYXN0aG9wKQotCQkJYXRvbWljX3NldCgmKHNrYi0+ZHN0LT5fX3JlZmNudCksIDEpOwogCX0KKwlza2ItPmRzdCA9ICZydHJlcy0+dS5kc3Q7CiAJcmV0dXJuIGVycjsKICNlbHNlIC8qIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVEICAqLwogCXJldHVybiBpcF9ta3JvdXRlX2lucHV0X2RlZihza2IsIHJlcywgZmwsIGluX2RldiwgZGFkZHIsIHNhZGRyLCB0b3MpOwpAQCAtMjIwOCw2ICsyMjA1LDcgQEAKIAkJZ290byBjbGVhbnVwOwogCX0JCQogCisJYXRvbWljX3NldCgmcnRoLT51LmRzdC5fX3JlZmNudCwgMSk7CiAJcnRoLT51LmRzdC5mbGFncz0gRFNUX0hPU1Q7CiAjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQKIAlpZiAocmVzLT5maSkgewpAQCAtMjI5MCw4ICsyMjg4LDYgQEAKIAlpZiAoZXJyID09IDApIHsKIAkJdTMyIHRvcyA9IFJUX0ZMX1RPUyhvbGRmbHApOwogCi0JCWF0b21pY19zZXQoJnJ0aC0+dS5kc3QuX19yZWZjbnQsIDEpOwotCQkKIAkJaGFzaCA9IHJ0X2hhc2hfY29kZShvbGRmbHAtPmZsNF9kc3QsIAogCQkJCSAgICBvbGRmbHAtPmZsNF9zcmMgXiAob2xkZmxwLT5vaWYgPDwgNSksIHRvcyk7CiAJCWVyciA9IHJ0X2ludGVybl9oYXNoKGhhc2gsIHJ0aCwgcnApOwpAQCAtMjMyNiw2ICsyMzIyLDEwIEBACiAJCQlkZXYybmV4dGhvcCA9IEZJQl9SRVNfREVWKCpyZXMpOwogCQkJZGV2X2hvbGQoZGV2Mm5leHRob3ApOwogCisJCQkvKiBwdXQgcmVmZXJlbmNlIHRvIHByZXZpb3VzIHJlc3VsdCAqLworCQkJaWYgKGhvcCkKKwkJCQlpcF9ydF9wdXQoKnJwKTsKKwogCQkJZXJyID0gX19ta3JvdXRlX291dHB1dCgmcnRoLCByZXMsIGZsLCBvbGRmbHAsCiAJCQkJCSAgICAgICBkZXYybmV4dGhvcCwgZmxhZ3MpOwogCkBAIC0yMzUwLDcgKzIzNTAsNiBAQAogCQkJaWYgKGVyciAhPSAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0KLQkJYXRvbWljX3NldCgmKCpycCktPnUuZHN0Ll9fcmVmY250LCAxKTsKIAkJcmV0dXJuIGVycjsKIAl9IGVsc2UgewogCQlyZXR1cm4gaXBfbWtyb3V0ZV9vdXRwdXRfZGVmKHJwLCByZXMsIGZsLCBvbGRmbHAsIGRldl9vdXQsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3AuYyBiL25ldC9pcHY0L3RjcC5jCmluZGV4IDAyZmRkYTYuLmYzZjAwMTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcC5jCisrKyBiL25ldC9pcHY0L3RjcC5jCkBAIC01NTIsOCArNTUyLDcgQEAKIAkJCXRjcF9tYXJrX3B1c2godHAsIHNrYik7CiAJCQlnb3RvIG5ld19zZWdtZW50OwogCQl9Ci0JCWlmIChzay0+c2tfZm9yd2FyZF9hbGxvYyA8IGNvcHkgJiYKLQkJICAgICFza19zdHJlYW1fbWVtX3NjaGVkdWxlKHNrLCBjb3B5LCAwKSkKKwkJaWYgKCFza19zdHJlYW1fd21lbV9zY2hlZHVsZShzaywgY29weSkpCiAJCQlnb3RvIHdhaXRfZm9yX21lbW9yeTsKIAkJCiAJCWlmIChjYW5fY29hbGVzY2UpIHsKQEAgLTc3MCwxOSArNzY5LDIzIEBACiAJCQkJCWlmIChvZmYgPT0gUEFHRV9TSVpFKSB7CiAJCQkJCQlwdXRfcGFnZShwYWdlKTsKIAkJCQkJCVRDUF9QQUdFKHNrKSA9IHBhZ2UgPSBOVUxMOworCQkJCQkJb2ZmID0gMDsKIAkJCQkJfQotCQkJCX0KKwkJCQl9IGVsc2UKKwkJCQkJb2ZmID0gMDsKKworCQkJCWlmIChjb3B5ID4gUEFHRV9TSVpFIC0gb2ZmKQorCQkJCQljb3B5ID0gUEFHRV9TSVpFIC0gb2ZmOworCisJCQkJaWYgKCFza19zdHJlYW1fd21lbV9zY2hlZHVsZShzaywgY29weSkpCisJCQkJCWdvdG8gd2FpdF9mb3JfbWVtb3J5OwogCiAJCQkJaWYgKCFwYWdlKSB7CiAJCQkJCS8qIEFsbG9jYXRlIG5ldyBjYWNoZSBwYWdlLiAqLwogCQkJCQlpZiAoIShwYWdlID0gc2tfc3RyZWFtX2FsbG9jX3BhZ2Uoc2spKSkKIAkJCQkJCWdvdG8gd2FpdF9mb3JfbWVtb3J5OwotCQkJCQlvZmYgPSAwOwogCQkJCX0KIAotCQkJCWlmIChjb3B5ID4gUEFHRV9TSVpFIC0gb2ZmKQotCQkJCQljb3B5ID0gUEFHRV9TSVpFIC0gb2ZmOwotCiAJCQkJLyogVGltZSB0byBjb3B5IGRhdGEuIFdlIGFyZSBjbG9zZSB0bwogCQkJCSAqIHRoZSBlbmQhICovCiAJCQkJZXJyID0gc2tiX2NvcHlfdG9fcGFnZShzaywgZnJvbSwgc2tiLCBwYWdlLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lucHV0LmMgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwppbmRleCAxYWZiMDgwLi4yOTIyMmI5NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKQEAgLTkyMywxNCArOTIzLDYgQEAKIAlpbnQgZmxhZyA9IDA7CiAJaW50IGk7CiAKLQkvKiBTbywgU0FDS3MgZm9yIGFscmVhZHkgc2VudCBsYXJnZSBzZWdtZW50cyB3aWxsIGJlIGxvc3QuCi0JICogTm90IGdvb2QsIGJ1dCBhbHRlcm5hdGl2ZSBpcyB0byByZXNlZ21lbnQgdGhlIHF1ZXVlLiAqLwotCWlmIChzay0+c2tfcm91dGVfY2FwcyAmIE5FVElGX0ZfVFNPKSB7Ci0JCXNrLT5za19yb3V0ZV9jYXBzICY9IH5ORVRJRl9GX1RTTzsKLQkJc29ja19zZXRfZmxhZyhzaywgU09DS19OT19MQVJHRVNFTkQpOwotCQl0cC0+bXNzX2NhY2hlID0gdHAtPm1zc19jYWNoZTsKLQl9Ci0KIAlpZiAoIXRwLT5zYWNrZWRfb3V0KQogCQl0cC0+ZmFja2V0c19vdXQgPSAwOwogCXByaW9yX2ZhY2tldHMgPSB0cC0+ZmFja2V0c19vdXQ7CkBAIC05NzgsMjAgKzk3MCw0MCBAQAogCQkJZmxhZyB8PSBGTEFHX0RBVEFfTE9TVDsKIAogCQlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWUoc2tiLCBzaykgewotCQkJdTggc2Fja2VkID0gVENQX1NLQl9DQihza2IpLT5zYWNrZWQ7Ci0JCQlpbnQgaW5fc2FjazsKKwkJCWludCBpbl9zYWNrLCBwY291bnQ7CisJCQl1OCBzYWNrZWQ7CiAKIAkJCS8qIFRoZSByZXRyYW5zbWlzc2lvbiBxdWV1ZSBpcyBhbHdheXMgaW4gb3JkZXIsIHNvCiAJCQkgKiB3ZSBjYW4gc2hvcnQtY2lyY3VpdCB0aGUgd2FsayBlYXJseS4KIAkJCSAqLwotCQkJaWYoIWJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgZW5kX3NlcSkpCisJCQlpZiAoIWJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgZW5kX3NlcSkpCiAJCQkJYnJlYWs7CiAKLQkJCWZhY2tfY291bnQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJCXBjb3VudCA9IHRjcF9za2JfcGNvdW50KHNrYik7CisKKwkJCWlmIChwY291bnQgPiAxICYmCisJCQkgICAgKGFmdGVyKHN0YXJ0X3NlcSwgVENQX1NLQl9DQihza2IpLT5zZXEpIHx8CisJCQkgICAgIGJlZm9yZShlbmRfc2VxLCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpKSkgeworCQkJCXVuc2lnbmVkIGludCBwa3RfbGVuOworCisJCQkJaWYgKGFmdGVyKHN0YXJ0X3NlcSwgVENQX1NLQl9DQihza2IpLT5zZXEpKQorCQkJCQlwa3RfbGVuID0gKHN0YXJ0X3NlcSAtCisJCQkJCQkgICBUQ1BfU0tCX0NCKHNrYiktPnNlcSk7CisJCQkJZWxzZQorCQkJCQlwa3RfbGVuID0gKGVuZF9zZXEgLQorCQkJCQkJICAgVENQX1NLQl9DQihza2IpLT5zZXEpOworCQkJCWlmICh0Y3BfZnJhZ21lbnQoc2ssIHNrYiwgcGt0X2xlbiwgc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSkpCisJCQkJCWJyZWFrOworCQkJCXBjb3VudCA9IHRjcF9za2JfcGNvdW50KHNrYik7CisJCQl9CisKKwkJCWZhY2tfY291bnQgKz0gcGNvdW50OwogCiAJCQlpbl9zYWNrID0gIWFmdGVyKHN0YXJ0X3NlcSwgVENQX1NLQl9DQihza2IpLT5zZXEpICYmCiAJCQkJIWJlZm9yZShlbmRfc2VxLCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpOwogCisJCQlzYWNrZWQgPSBUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZDsKKwogCQkJLyogQWNjb3VudCBELVNBQ0sgZm9yIHJldHJhbnNtaXR0ZWQgcGFja2V0LiAqLwogCQkJaWYgKChkdXBfc2FjayAmJiBpbl9zYWNrKSAmJgogCQkJICAgIChzYWNrZWQgJiBUQ1BDQl9SRVRSQU5TKSAmJgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX291dHB1dC5jIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCmluZGV4IDc1YjY4MTEuLmMxMGU0NDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKQEAgLTQyOCwxMSArNDI4LDExIEBACiAgKiBwYWNrZXQgdG8gdGhlIGxpc3QuICBUaGlzIHdvbid0IGJlIGNhbGxlZCBmcmVxdWVudGx5LCBJIGhvcGUuIAogICogUmVtZW1iZXIsIHRoZXNlIGFyZSBzdGlsbCBoZWFkZXJsZXNzIFNLQnMgYXQgdGhpcyBwb2ludC4KICAqLwotc3RhdGljIGludCB0Y3BfZnJhZ21lbnQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbGVuLCB1bnNpZ25lZCBpbnQgbXNzX25vdykKK2ludCB0Y3BfZnJhZ21lbnQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbGVuLCB1bnNpZ25lZCBpbnQgbXNzX25vdykKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmZjsKLQlpbnQgbnNpemU7CisJaW50IG5zaXplLCBvbGRfZmFjdG9yOwogCXUxNiBmbGFnczsKIAogCW5zaXplID0gc2tiX2hlYWRsZW4oc2tiKSAtIGxlbjsKQEAgLTQ4NSwyMyArNDg1LDI5IEBACiAJVENQX1NLQl9DQihidWZmKS0+d2hlbiA9IFRDUF9TS0JfQ0Ioc2tiKS0+d2hlbjsKIAlidWZmLT50c3RhbXAgPSBza2ItPnRzdGFtcDsKIAotCWlmIChUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmIFRDUENCX0xPU1QpIHsKLQkJdHAtPmxvc3Rfb3V0IC09IHRjcF9za2JfcGNvdW50KHNrYik7Ci0JCXRwLT5sZWZ0X291dCAtPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwotCX0KKwlvbGRfZmFjdG9yID0gdGNwX3NrYl9wY291bnQoc2tiKTsKIAogCS8qIEZpeCB1cCB0c29fZmFjdG9yIGZvciBib3RoIG9yaWdpbmFsIGFuZCBuZXcgU0tCLiAgKi8KIAl0Y3Bfc2V0X3NrYl90c29fc2Vncyhzaywgc2tiLCBtc3Nfbm93KTsKIAl0Y3Bfc2V0X3NrYl90c29fc2VncyhzaywgYnVmZiwgbXNzX25vdyk7CiAKLQlpZiAoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiBUQ1BDQl9MT1NUKSB7Ci0JCXRwLT5sb3N0X291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwotCQl0cC0+bGVmdF9vdXQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKLQl9CisJLyogSWYgdGhpcyBwYWNrZXQgaGFzIGJlZW4gc2VudCBvdXQgYWxyZWFkeSwgd2UgbXVzdAorCSAqIGFkanVzdCB0aGUgdmFyaW91cyBwYWNrZXQgY291bnRlcnMuCisJICovCisJaWYgKCFiZWZvcmUodHAtPnNuZF9ueHQsIFRDUF9TS0JfQ0IoYnVmZiktPmVuZF9zZXEpKSB7CisJCWludCBkaWZmID0gb2xkX2ZhY3RvciAtIHRjcF9za2JfcGNvdW50KHNrYikgLQorCQkJdGNwX3NrYl9wY291bnQoYnVmZik7CiAKLQlpZiAoVENQX1NLQl9DQihidWZmKS0+c2Fja2VkJlRDUENCX0xPU1QpIHsKLQkJdHAtPmxvc3Rfb3V0ICs9IHRjcF9za2JfcGNvdW50KGJ1ZmYpOwotCQl0cC0+bGVmdF9vdXQgKz0gdGNwX3NrYl9wY291bnQoYnVmZik7CisJCXRwLT5wYWNrZXRzX291dCAtPSBkaWZmOworCQlpZiAoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiBUQ1BDQl9MT1NUKSB7CisJCQl0cC0+bG9zdF9vdXQgLT0gZGlmZjsKKwkJCXRwLT5sZWZ0X291dCAtPSBkaWZmOworCQl9CisJCWlmIChkaWZmID4gMCkgeworCQkJdHAtPmZhY2tldHNfb3V0IC09IGRpZmY7CisJCQlpZiAoKGludCl0cC0+ZmFja2V0c19vdXQgPCAwKQorCQkJCXRwLT5mYWNrZXRzX291dCA9IDA7CisJCX0KIAl9CiAKIAkvKiBMaW5rIEJVRkYgaW50byB0aGUgc2VuZCBxdWV1ZS4gKi8KQEAgLTEzNTAsMTIgKzEzNTYsNiBAQAogCWlmIChiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIHRwLT5zbmRfdW5hKSkgewogCQlpZiAoYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgdHAtPnNuZF91bmEpKQogCQkJQlVHKCk7Ci0KLQkJaWYgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pIHsKLQkJCXNrLT5za19yb3V0ZV9jYXBzICY9IH5ORVRJRl9GX1RTTzsKLQkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfTk9fTEFSR0VTRU5EKTsKLQkJfQotCiAJCWlmICh0Y3BfdHJpbV9oZWFkKHNrLCBza2IsIHRwLT5zbmRfdW5hIC0gVENQX1NLQl9DQihza2IpLT5zZXEpKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTM3MCwyMiArMTM3MCw4IEBACiAJCXJldHVybiAtRUFHQUlOOwogCiAJaWYgKHNrYi0+bGVuID4gY3VyX21zcykgewotCQlpbnQgb2xkX2ZhY3RvciA9IHRjcF9za2JfcGNvdW50KHNrYik7Ci0JCWludCBkaWZmOwotCiAJCWlmICh0Y3BfZnJhZ21lbnQoc2ssIHNrYiwgY3VyX21zcywgY3VyX21zcykpCiAJCQlyZXR1cm4gLUVOT01FTTsgLyogV2UnbGwgdHJ5IGFnYWluIGxhdGVyLiAqLwotCi0JCS8qIE5ldyBTS0IgY3JlYXRlZCwgYWNjb3VudCBmb3IgaXQuICovCi0JCWRpZmYgPSBvbGRfZmFjdG9yIC0gdGNwX3NrYl9wY291bnQoc2tiKSAtCi0JCSAgICAgICB0Y3Bfc2tiX3Bjb3VudChza2ItPm5leHQpOwotCQl0cC0+cGFja2V0c19vdXQgLT0gZGlmZjsKLQotCQlpZiAoZGlmZiA+IDApIHsKLQkJCXRwLT5mYWNrZXRzX291dCAtPSBkaWZmOwotCQkJaWYgKChpbnQpdHAtPmZhY2tldHNfb3V0IDwgMCkKLQkJCQl0cC0+ZmFja2V0c19vdXQgPSAwOwotCQl9CiAJfQogCiAJLyogQ29sbGFwc2UgdHdvIGFkamFjZW50IHBhY2tldHMgaWYgd29ydGh3aGlsZSBhbmQgd2UgY2FuLiAqLwpAQCAtMTk5MywxMiArMTk3OSw2IEBACiAJCQkJVENQX1NLQl9DQihza2IpLT5mbGFncyB8PSBUQ1BDQl9GTEFHX1BTSDsKIAkJCQlpZiAodGNwX2ZyYWdtZW50KHNrLCBza2IsIHNlZ19zaXplLCBtc3MpKQogCQkJCQlyZXR1cm4gLTE7Ci0JCQkJLyogU1dTIG92ZXJyaWRlIHRyaWdnZXJlZCBmb3JjZWQgZnJhZ21lbnRhdGlvbi4KLQkJCQkgKiBEaXNhYmxlIFRTTywgdGhlIGNvbm5lY3Rpb24gaXMgdG9vIHNpY2suICovCi0JCQkJaWYgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pIHsKLQkJCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19OT19MQVJHRVNFTkQpOwotCQkJCQlzay0+c2tfcm91dGVfY2FwcyAmPSB+TkVUSUZfRl9UU087Ci0JCQkJfQogCQkJfSBlbHNlIGlmICghdGNwX3NrYl9wY291bnQoc2tiKSkKIAkJCQl0Y3Bfc2V0X3NrYl90c29fc2Vncyhzaywgc2tiLCBtc3MpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jCmluZGV4IGU1YmVjYTcuLmUwYmQxMDEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcC5jCisrKyBiL25ldC9pcHY0L3VkcC5jCkBAIC0xMTQxLDcgKzExNDEsNyBAQAogCWlmICh1bGVuID4gbGVuIHx8IHVsZW4gPCBzaXplb2YoKnVoKSkKIAkJZ290byBzaG9ydF9wYWNrZXQ7CiAKLQlpZiAocHNrYl90cmltKHNrYiwgdWxlbikpCisJaWYgKHBza2JfdHJpbV9yY3N1bShza2IsIHVsZW4pKQogCQlnb3RvIHNob3J0X3BhY2tldDsKIAogCWlmICh1ZHBfY2hlY2tzdW1faW5pdChza2IsIHVoLCB1bGVuLCBzYWRkciwgZGFkZHIpIDwgMCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IDkzN2FkMzIuLjJmZWEzZjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtMTIzLDggKzEyMyw3IEBACiAKIHN0YXRpYyB2b2lkIGFkZHJjb25mX3ZlcmlmeSh1bnNpZ25lZCBsb25nKTsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGFkZHJfY2hrX3RpbWVyID0KLQkJCVRJTUVSX0lOSVRJQUxJWkVSKGFkZHJjb25mX3ZlcmlmeSwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGFkZHJfY2hrX3RpbWVyLCBhZGRyY29uZl92ZXJpZnksIDAsIDApOwogc3RhdGljIERFRklORV9TUElOTE9DSyhhZGRyY29uZl92ZXJpZnlfbG9jayk7CiAKIHN0YXRpYyB2b2lkIGFkZHJjb25mX2pvaW5fYW55Y2FzdChzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApOwpAQCAtMzU5MywxMCArMzU5Miw4IEBACiAJcnRubF91bmxvY2soKTsKIAogI2lmZGVmIENPTkZJR19JUFY2X1BSSVZBQ1kKLQlpZiAobGlrZWx5KG1kNV90Zm0gIT0gTlVMTCkpIHsKLQkJY3J5cHRvX2ZyZWVfdGZtKG1kNV90Zm0pOwotCQltZDVfdGZtID0gTlVMTDsKLQl9CisJY3J5cHRvX2ZyZWVfdGZtKG1kNV90Zm0pOworCW1kNV90Zm0gPSBOVUxMOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWg2LmMgYi9uZXQvaXB2Ni9haDYuYwppbmRleCAwZWJmYWQ5Li5mMzYyOTczIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9haDYuYworKysgYi9uZXQvaXB2Ni9haDYuYwpAQCAtNDAxLDEwICs0MDEsOCBAQAogCiBlcnJvcjoKIAlpZiAoYWhwKSB7Ci0JCWlmIChhaHAtPndvcmtfaWN2KQotCQkJa2ZyZWUoYWhwLT53b3JrX2ljdik7Ci0JCWlmIChhaHAtPnRmbSkKLQkJCWNyeXB0b19mcmVlX3RmbShhaHAtPnRmbSk7CisJCWtmcmVlKGFocC0+d29ya19pY3YpOworCQljcnlwdG9fZnJlZV90Zm0oYWhwLT50Zm0pOwogCQlrZnJlZShhaHApOwogCX0KIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTQxNywxNCArNDE1LDEwIEBACiAJaWYgKCFhaHApCiAJCXJldHVybjsKIAotCWlmIChhaHAtPndvcmtfaWN2KSB7Ci0JCWtmcmVlKGFocC0+d29ya19pY3YpOwotCQlhaHAtPndvcmtfaWN2ID0gTlVMTDsKLQl9Ci0JaWYgKGFocC0+dGZtKSB7Ci0JCWNyeXB0b19mcmVlX3RmbShhaHAtPnRmbSk7Ci0JCWFocC0+dGZtID0gTlVMTDsKLQl9CisJa2ZyZWUoYWhwLT53b3JrX2ljdik7CisJYWhwLT53b3JrX2ljdiA9IE5VTEw7CisJY3J5cHRvX2ZyZWVfdGZtKGFocC0+dGZtKTsKKwlhaHAtPnRmbSA9IE5VTEw7CiAJa2ZyZWUoYWhwKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZGF0YWdyYW0uYyBiL25ldC9pcHY2L2RhdGFncmFtLmMKaW5kZXggMDE0NjhmYS4uY2M1MTg0MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZGF0YWdyYW0uYworKysgYi9uZXQvaXB2Ni9kYXRhZ3JhbS5jCkBAIC0xNzUsMTAgKzE3NSw4IEBACiAJaWYgKGZpbmFsX3ApCiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBmaW5hbF9wKTsKIAotCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkgewotCQlkc3RfcmVsZWFzZShkc3QpOworCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkKIAkJZ290byBvdXQ7Ci0JfQogCiAJLyogc291cmNlIGFkZHJlc3MgbG9va3VwIGRvbmUgaW4gaXA2X2RzdF9sb29rdXAgKi8KIApAQCAtMzkwLDMyICszODgsMTAxIEBACiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfSE9QTElNSVQsIHNpemVvZihobGltKSwgJmhsaW0pOwogCX0KIAorCWlmIChucC0+cnhvcHQuYml0cy5yeHRjbGFzcykgeworCQlpbnQgdGNsYXNzID0gKG50b2hsKCoodTMyICopc2tiLT5uaC5pcHY2aCkgPj4gMjApICYgMHhmZjsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9UQ0xBU1MsIHNpemVvZih0Y2xhc3MpLCAmdGNsYXNzKTsKKwl9CisKIAlpZiAobnAtPnJ4b3B0LmJpdHMucnhmbG93ICYmICgqKHUzMiopc2tiLT5uaC5yYXcgJiBJUFY2X0ZMT1dJTkZPX01BU0spKSB7CiAJCXUzMiBmbG93aW5mbyA9ICoodTMyKilza2ItPm5oLnJhdyAmIElQVjZfRkxPV0lORk9fTUFTSzsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9GTE9XSU5GTywgc2l6ZW9mKGZsb3dpbmZvKSwgJmZsb3dpbmZvKTsKIAl9CisKKwkvKiBIYkggaXMgYWxsb3dlZCBvbmx5IG9uY2UgKi8KIAlpZiAobnAtPnJ4b3B0LmJpdHMuaG9wb3B0cyAmJiBvcHQtPmhvcCkgewogCQl1OCAqcHRyID0gc2tiLT5uaC5yYXcgKyBvcHQtPmhvcDsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9IT1BPUFRTLCAocHRyWzFdKzEpPDwzLCBwdHIpOwogCX0KLQlpZiAobnAtPnJ4b3B0LmJpdHMuZHN0b3B0cyAmJiBvcHQtPmRzdDApIHsKKworCWlmIChvcHQtPmxhc3RvcHQgJiYKKwkgICAgKG5wLT5yeG9wdC5iaXRzLmRzdG9wdHMgfHwgbnAtPnJ4b3B0LmJpdHMuc3JjcnQpKSB7CisJCS8qCisJCSAqIFNpbGx5IGVub3VnaCwgYnV0IHdlIG5lZWQgdG8gcmVwYXJzZSBpbiBvcmRlciB0bworCQkgKiByZXBvcnQgZXh0ZW5zaW9uIGhlYWRlcnMgKGV4Y2VwdCBmb3IgSGJIKQorCQkgKiBpbiBvcmRlci4KKwkJICoKKwkJICogQWxzbyBub3RlIHRoYXQgSVBWNl9SRUNWUlRIRFJEU1RPUFRTIGlzIE5PVCAKKwkJICogKGFuZCBXSUxMIE5PVCBiZSkgZGVmaW5lZCBiZWNhdXNlCisJCSAqIElQVjZfUkVDVkRTVE9QVFMgaXMgbW9yZSBnZW5lcmljLiAtLXlvc2hmdWppCisJCSAqLworCQl1bnNpZ25lZCBpbnQgb2ZmID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwkJdTggbmV4dGhkciA9IHNrYi0+bmguaXB2NmgtPm5leHRoZHI7CisKKwkJd2hpbGUgKG9mZiA8PSBvcHQtPmxhc3RvcHQpIHsKKwkJCXVuc2lnbmVkIGxlbjsKKwkJCXU4ICpwdHIgPSBza2ItPm5oLnJhdyArIG9mZjsKKworCQkJc3dpdGNoKG5leHRoZHIpIHsKKwkJCWNhc2UgSVBQUk9UT19EU1RPUFRTOgorCQkJCW5leHRoZHIgPSBwdHJbMF07CisJCQkJbGVuID0gKHB0clsxXSArIDEpIDw8IDM7CisJCQkJaWYgKG5wLT5yeG9wdC5iaXRzLmRzdG9wdHMpCisJCQkJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfRFNUT1BUUywgbGVuLCBwdHIpOworCQkJCWJyZWFrOworCQkJY2FzZSBJUFBST1RPX1JPVVRJTkc6CisJCQkJbmV4dGhkciA9IHB0clswXTsKKwkJCQlsZW4gPSAocHRyWzFdICsgMSkgPDwgMzsKKwkJCQlpZiAobnAtPnJ4b3B0LmJpdHMuc3JjcnQpCisJCQkJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfUlRIRFIsIGxlbiwgcHRyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVBQUk9UT19BSDoKKwkJCQluZXh0aGRyID0gcHRyWzBdOworCQkJCWxlbiA9IChwdHJbMV0gKyAxKSA8PCAyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQluZXh0aGRyID0gcHRyWzBdOworCQkJCWxlbiA9IChwdHJbMV0gKyAxKSA8PCAzOworCQkJCWJyZWFrOworCQkJfQorCisJCQlvZmYgKz0gbGVuOworCQl9CisJfQorCisJLyogc29ja2V0IG9wdGlvbnMgaW4gb2xkIHN0eWxlICovCisJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4b2luZm8pIHsKKwkJc3RydWN0IGluNl9wa3RpbmZvIHNyY19pbmZvOworCisJCXNyY19pbmZvLmlwaTZfaWZpbmRleCA9IG9wdC0+aWlmOworCQlpcHY2X2FkZHJfY29weSgmc3JjX2luZm8uaXBpNl9hZGRyLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2XzIyOTJQS1RJTkZPLCBzaXplb2Yoc3JjX2luZm8pLCAmc3JjX2luZm8pOworCX0KKwlpZiAobnAtPnJ4b3B0LmJpdHMucnhvaGxpbSkgeworCQlpbnQgaGxpbSA9IHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdDsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkySE9QTElNSVQsIHNpemVvZihobGltKSwgJmhsaW0pOworCX0KKwlpZiAobnAtPnJ4b3B0LmJpdHMub2hvcG9wdHMgJiYgb3B0LT5ob3ApIHsKKwkJdTggKnB0ciA9IHNrYi0+bmgucmF3ICsgb3B0LT5ob3A7CisJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfMjI5MkhPUE9QVFMsIChwdHJbMV0rMSk8PDMsIHB0cik7CisJfQorCWlmIChucC0+cnhvcHQuYml0cy5vZHN0b3B0cyAmJiBvcHQtPmRzdDApIHsKIAkJdTggKnB0ciA9IHNrYi0+bmgucmF3ICsgb3B0LT5kc3QwOwotCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2X0RTVE9QVFMsIChwdHJbMV0rMSk8PDMsIHB0cik7CisJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfMjI5MkRTVE9QVFMsIChwdHJbMV0rMSk8PDMsIHB0cik7CiAJfQotCWlmIChucC0+cnhvcHQuYml0cy5zcmNydCAmJiBvcHQtPnNyY3J0KSB7CisJaWYgKG5wLT5yeG9wdC5iaXRzLm9zcmNydCAmJiBvcHQtPnNyY3J0KSB7CiAJCXN0cnVjdCBpcHY2X3J0X2hkciAqcnRoZHIgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopKHNrYi0+bmgucmF3ICsgb3B0LT5zcmNydCk7Ci0JCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfUlRIRFIsIChydGhkci0+aGRybGVuKzEpIDw8IDMsIHJ0aGRyKTsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkyUlRIRFIsIChydGhkci0+aGRybGVuKzEpIDw8IDMsIHJ0aGRyKTsKIAl9Ci0JaWYgKG5wLT5yeG9wdC5iaXRzLmRzdG9wdHMgJiYgb3B0LT5kc3QxKSB7CisJaWYgKG5wLT5yeG9wdC5iaXRzLm9kc3RvcHRzICYmIG9wdC0+ZHN0MSkgewogCQl1OCAqcHRyID0gc2tiLT5uaC5yYXcgKyBvcHQtPmRzdDE7Ci0JCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfRFNUT1BUUywgKHB0clsxXSsxKTw8MywgcHRyKTsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkyRFNUT1BUUywgKHB0clsxXSsxKTw8MywgcHRyKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIGludCBkYXRhZ3JhbV9zZW5kX2N0bChzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBmbG93aSAqZmwsCiAJCSAgICAgIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0LAotCQkgICAgICBpbnQgKmhsaW1pdCkKKwkJICAgICAgaW50ICpobGltaXQsIGludCAqdGNsYXNzKQogewogCXN0cnVjdCBpbjZfcGt0aW5mbyAqc3JjX2luZm87CiAJc3RydWN0IGNtc2doZHIgKmNtc2c7CkBAIC00MzgsNiArNTA1LDcgQEAKIAogCQlzd2l0Y2ggKGNtc2ctPmNtc2dfdHlwZSkgewogIAkJY2FzZSBJUFY2X1BLVElORk86CisgCQljYXNlIElQVjZfMjI5MlBLVElORk86CiAgCQkJaWYgKGNtc2ctPmNtc2dfbGVuIDwgQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBpbjZfcGt0aW5mbykpKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlnb3RvIGV4aXRfZjsKQEAgLTQ5Miw2ICs1NjAsNyBAQAogCQkJZmwtPmZsNl9mbG93bGFiZWwgPSBJUFY2X0ZMT1dJTkZPX01BU0sgJiAqKHUzMiAqKUNNU0dfREFUQShjbXNnKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgSVBWNl8yMjkySE9QT1BUUzoKIAkJY2FzZSBJUFY2X0hPUE9QVFM6CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0LT5ob3BvcHQgfHwgY21zZy0+Y21zZ19sZW4gPCBDTVNHX0xFTihzaXplb2Yoc3RydWN0IGlwdjZfb3B0X2hkcikpKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKQEAgLTUxMiw3ICs1ODEsNyBAQAogCQkJb3B0LT5ob3BvcHQgPSBoZHI7CiAJCQlicmVhazsKIAotCQljYXNlIElQVjZfRFNUT1BUUzoKKwkJY2FzZSBJUFY2XzIyOTJEU1RPUFRTOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtc2ctPmNtc2dfbGVuIDwgQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBpcHY2X29wdF9oZHIpKSkgewogCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJZ290byBleGl0X2Y7CkBAIC01MzYsNiArNjA1LDMzIEBACiAJCQlvcHQtPmRzdDFvcHQgPSBoZHI7CiAJCQlicmVhazsKIAorCQljYXNlIElQVjZfRFNUT1BUUzoKKwkJY2FzZSBJUFY2X1JUSERSRFNUT1BUUzoKKwkJCWlmIChjbXNnLT5jbXNnX2xlbiA8IENNU0dfTEVOKHNpemVvZihzdHJ1Y3QgaXB2Nl9vcHRfaGRyKSkpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdF9mOworCQkJfQorCisJCQloZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciAqKUNNU0dfREFUQShjbXNnKTsKKwkJCWxlbiA9ICgoaGRyLT5oZHJsZW4gKyAxKSA8PCAzKTsKKwkJCWlmIChjbXNnLT5jbXNnX2xlbiA8IENNU0dfTEVOKGxlbikpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdF9mOworCQkJfQorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfUkFXKSkgeworCQkJCWVyciA9IC1FUEVSTTsKKwkJCQlnb3RvIGV4aXRfZjsKKwkJCX0KKwkJCWlmIChjbXNnLT5jbXNnX3R5cGUgPT0gSVBWNl9EU1RPUFRTKSB7CisJCQkJb3B0LT5vcHRfZmxlbiArPSBsZW47CisJCQkJb3B0LT5kc3Qxb3B0ID0gaGRyOworCQkJfSBlbHNlIHsKKwkJCQlvcHQtPm9wdF9uZmxlbiArPSBsZW47CisJCQkJb3B0LT5kc3Qwb3B0ID0gaGRyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJUFY2XzIyOTJSVEhEUjoKIAkJY2FzZSBJUFY2X1JUSERSOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtc2ctPmNtc2dfbGVuIDwgQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBpcHY2X3J0X2hkcikpKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKQEAgLTU2OCw3ICs2NjQsNyBAQAogCQkJb3B0LT5vcHRfbmZsZW4gKz0gbGVuOwogCQkJb3B0LT5zcmNydCA9IHJ0aGRyOwogCi0JCQlpZiAob3B0LT5kc3Qxb3B0KSB7CisJCQlpZiAoY21zZy0+Y21zZ190eXBlID09IElQVjZfMjI5MlJUSERSICYmIG9wdC0+ZHN0MW9wdCkgewogCQkJCWludCBkc3RoZHJsZW4gPSAoKG9wdC0+ZHN0MW9wdC0+aGRybGVuKzEpPDwzKTsKIAogCQkJCW9wdC0+b3B0X25mbGVuICs9IGRzdGhkcmxlbjsKQEAgLTU3OSw2ICs2NzUsNyBAQAogCiAJCQlicmVhazsKIAorCQljYXNlIElQVjZfMjI5MkhPUExJTUlUOgogCQljYXNlIElQVjZfSE9QTElNSVQ6CiAJCQlpZiAoY21zZy0+Y21zZ19sZW4gIT0gQ01TR19MRU4oc2l6ZW9mKGludCkpKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKQEAgLTU4OCw2ICs2ODUsMjQgQEAKIAkJCSpobGltaXQgPSAqKGludCAqKUNNU0dfREFUQShjbXNnKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgSVBWNl9UQ0xBU1M6CisJCSAgICB7CisJCQlpbnQgdGM7CisKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlpZiAoY21zZy0+Y21zZ19sZW4gIT0gQ01TR19MRU4oc2l6ZW9mKGludCkpKSB7CisJCQkJZ290byBleGl0X2Y7CisJCQl9CisKKwkJCXRjID0gKihpbnQgKilDTVNHX0RBVEEoY21zZyk7CisJCQlpZiAodGMgPCAwIHx8IHRjID4gMHhmZikKKwkJCQlnb3RvIGV4aXRfZjsKKworCQkJZXJyID0gMDsKKwkJCSp0Y2xhc3MgPSB0YzsKKworCQkJYnJlYWs7CisJCSAgICB9CiAJCWRlZmF1bHQ6CiAJCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJpbnZhbGlkIGNtc2cgdHlwZTogJWRcbiIsCiAJCQkgICAgICAgICAgICAgICBjbXNnLT5jbXNnX3R5cGUpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZXNwNi5jIGIvbmV0L2lwdjYvZXNwNi5jCmluZGV4IGU4YmZmOWQuLjliMjc0NjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2VzcDYuYworKysgYi9uZXQvaXB2Ni9lc3A2LmMKQEAgLTI3NiwyMiArMjc2LDE0IEBACiAJaWYgKCFlc3ApCiAJCXJldHVybjsKIAotCWlmIChlc3AtPmNvbmYudGZtKSB7Ci0JCWNyeXB0b19mcmVlX3RmbShlc3AtPmNvbmYudGZtKTsKLQkJZXNwLT5jb25mLnRmbSA9IE5VTEw7Ci0JfQotCWlmIChlc3AtPmNvbmYuaXZlYykgewotCQlrZnJlZShlc3AtPmNvbmYuaXZlYyk7Ci0JCWVzcC0+Y29uZi5pdmVjID0gTlVMTDsKLQl9Ci0JaWYgKGVzcC0+YXV0aC50Zm0pIHsKLQkJY3J5cHRvX2ZyZWVfdGZtKGVzcC0+YXV0aC50Zm0pOwotCQllc3AtPmF1dGgudGZtID0gTlVMTDsKLQl9Ci0JaWYgKGVzcC0+YXV0aC53b3JrX2ljdikgewotCQlrZnJlZShlc3AtPmF1dGgud29ya19pY3YpOwotCQllc3AtPmF1dGgud29ya19pY3YgPSBOVUxMOwotCX0KKwljcnlwdG9fZnJlZV90Zm0oZXNwLT5jb25mLnRmbSk7CisJZXNwLT5jb25mLnRmbSA9IE5VTEw7CisJa2ZyZWUoZXNwLT5jb25mLml2ZWMpOworCWVzcC0+Y29uZi5pdmVjID0gTlVMTDsKKwljcnlwdG9fZnJlZV90Zm0oZXNwLT5hdXRoLnRmbSk7CisJZXNwLT5hdXRoLnRmbSA9IE5VTEw7CisJa2ZyZWUoZXNwLT5hdXRoLndvcmtfaWN2KTsKKwllc3AtPmF1dGgud29ya19pY3YgPSBOVUxMOwogCWtmcmVlKGVzcCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2V4dGhkcnMuYyBiL25ldC9pcHY2L2V4dGhkcnMuYwppbmRleCA1YmU2ZGEyLi45MjI1NDk1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9leHRoZHJzLmMKKysrIGIvbmV0L2lwdjYvZXh0aGRycy5jCkBAIC0xNjQsNiArMTY0LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAorCW9wdC0+bGFzdG9wdCA9IHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdzsKIAlvcHQtPmRzdDEgPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7CiAKIAlpZiAoaXA2X3BhcnNlX3Rsdih0bHZwcm9jZGVzdG9wdF9sc3QsIHNrYikpIHsKQEAgLTI0Myw2ICsyNDQsNyBAQAogCiBsb29wZWRfYmFjazoKIAlpZiAoaGRyLT5zZWdtZW50c19sZWZ0ID09IDApIHsKKwkJb3B0LT5sYXN0b3B0ID0gc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3OwogCQlvcHQtPnNyY3J0ID0gc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3OwogCQlza2ItPmgucmF3ICs9IChoZHItPmhkcmxlbiArIDEpIDw8IDM7CiAJCW9wdC0+ZHN0MCA9IG9wdC0+ZHN0MTsKQEAgLTQwNCw4ICs0MDYsNyBAQAogCiAJbWVtY3B5KG9wdC0+c3JjcnQsIGhkciwgc2l6ZW9mKCpoZHIpKTsKIAlpcnRoZHIgPSAoc3RydWN0IHJ0MF9oZHIqKW9wdC0+c3JjcnQ7Ci0JLyogT2Jzb2xldGUgZmllbGQsIE1CWiwgd2hlbiBvcmlnaW5hdGVkIGJ5IHVzICovCi0JaXJ0aGRyLT5iaXRtYXAgPSAwOworCWlydGhkci0+cmVzZXJ2ZWQgPSAwOwogCW9wdC0+c3JjcnQtPnNlZ21lbnRzX2xlZnQgPSBuOwogCWZvciAoaT0wOyBpPG47IGkrKykKIAkJbWVtY3B5KGlydGhkci0+YWRkcitpLCBydGhkci0+YWRkcisobi0xLWkpLCAxNik7CkBAIC00NTksMTEgKzQ2MCwxMCBAQAogCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOVFJVTkNBVEVEUEtUUyk7CiAJCWdvdG8gZHJvcDsKIAl9Ci0JaWYgKHBrdF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpIDwgc2tiLT5sZW4pIHsKLQkJX19wc2tiX3RyaW0oc2tiLCBwa3RfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7Ci0JCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKLQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQl9CisKKwlpZiAocHNrYl90cmltX3Jjc3VtKHNrYiwgcGt0X2xlbiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKQorCQlnb3RvIGRyb3A7CisKIAlyZXR1cm4gMTsKIAogZHJvcDoKQEAgLTUzOSwxMCArNTM5LDE1IEBACiAJCQkgIHU4ICpwcm90bywKIAkJCSAgc3RydWN0IGluNl9hZGRyICoqZGFkZHIpCiB7Ci0JaWYgKG9wdC0+c3JjcnQpCisJaWYgKG9wdC0+c3JjcnQpIHsKIAkJaXB2Nl9wdXNoX3J0aGRyKHNrYiwgcHJvdG8sIG9wdC0+c3JjcnQsIGRhZGRyKTsKLQlpZiAob3B0LT5kc3Qwb3B0KQotCQlpcHY2X3B1c2hfZXh0aGRyKHNrYiwgcHJvdG8sIE5FWFRIRFJfREVTVCwgb3B0LT5kc3Qwb3B0KTsKKwkJLyoKKwkJICogSVBWNl9SVEhEUkRTVE9QVFMgaXMgaWdub3JlZAorCQkgKiB1bmxlc3MgSVBWNl9SVEhEUiBpcyBzZXQgKFJGQzM1NDIpLgorCQkgKi8KKwkJaWYgKG9wdC0+ZHN0MG9wdCkKKwkJCWlwdjZfcHVzaF9leHRoZHIoc2tiLCBwcm90bywgTkVYVEhEUl9ERVNULCBvcHQtPmRzdDBvcHQpOworCX0KIAlpZiAob3B0LT5ob3BvcHQpCiAJCWlwdjZfcHVzaF9leHRoZHIoc2tiLCBwcm90bywgTkVYVEhEUl9IT1AsIG9wdC0+aG9wb3B0KTsKIH0KQEAgLTU3MywzICs1NzgsOTcgQEAKIAl9CiAJcmV0dXJuIG9wdDI7CiB9CisKK3N0YXRpYyBpbnQgaXB2Nl9yZW5ld19vcHRpb24odm9pZCAqb2hkciwKKwkJCSAgICAgc3RydWN0IGlwdjZfb3B0X2hkciBfX3VzZXIgKm5ld29wdCwgaW50IG5ld29wdGxlbiwKKwkJCSAgICAgaW50IGluaGVyaXQsCisJCQkgICAgIHN0cnVjdCBpcHY2X29wdF9oZHIgKipoZHIsCisJCQkgICAgIGNoYXIgKipwKQoreworCWlmIChpbmhlcml0KSB7CisJCWlmIChvaGRyKSB7CisJCQltZW1jcHkoKnAsIG9oZHIsIGlwdjZfb3B0bGVuKChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopb2hkcikpOworCQkJKmhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopKnA7CisJCQkqcCArPSBDTVNHX0FMSUdOKGlwdjZfb3B0bGVuKCooc3RydWN0IGlwdjZfb3B0X2hkciAqKiloZHIpKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChuZXdvcHQpIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigqcCwgbmV3b3B0LCBuZXdvcHRsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJKmhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopKnA7CisJCQlpZiAoaXB2Nl9vcHRsZW4oKihzdHJ1Y3QgaXB2Nl9vcHRfaGRyICoqKWhkcikgPiBuZXdvcHRsZW4pCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkqcCArPSBDTVNHX0FMSUdOKG5ld29wdGxlbik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpcHY2X3R4b3B0aW9ucyAqCitpcHY2X3JlbmV3X29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCwKKwkJICAgaW50IG5ld3R5cGUsCisJCSAgIHN0cnVjdCBpcHY2X29wdF9oZHIgX191c2VyICpuZXdvcHQsIGludCBuZXdvcHRsZW4pCit7CisJaW50IHRvdF9sZW4gPSAwOworCWNoYXIgKnA7CisJc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQyOworCWludCBlcnI7CisKKwlpZiAobmV3dHlwZSAhPSBJUFY2X0hPUE9QVFMgJiYgb3B0LT5ob3BvcHQpCisJCXRvdF9sZW4gKz0gQ01TR19BTElHTihpcHY2X29wdGxlbihvcHQtPmhvcG9wdCkpOworCWlmIChuZXd0eXBlICE9IElQVjZfUlRIRFJEU1RPUFRTICYmIG9wdC0+ZHN0MG9wdCkKKwkJdG90X2xlbiArPSBDTVNHX0FMSUdOKGlwdjZfb3B0bGVuKG9wdC0+ZHN0MG9wdCkpOworCWlmIChuZXd0eXBlICE9IElQVjZfUlRIRFIgJiYgb3B0LT5zcmNydCkKKwkJdG90X2xlbiArPSBDTVNHX0FMSUdOKGlwdjZfb3B0bGVuKG9wdC0+c3JjcnQpKTsKKwlpZiAobmV3dHlwZSAhPSBJUFY2X0RTVE9QVFMgJiYgb3B0LT5kc3Qxb3B0KQorCQl0b3RfbGVuICs9IENNU0dfQUxJR04oaXB2Nl9vcHRsZW4ob3B0LT5kc3Qxb3B0KSk7CisJaWYgKG5ld29wdCAmJiBuZXdvcHRsZW4pCisJCXRvdF9sZW4gKz0gQ01TR19BTElHTihuZXdvcHRsZW4pOworCisJaWYgKCF0b3RfbGVuKQorCQlyZXR1cm4gTlVMTDsKKworCW9wdDIgPSBzb2NrX2ttYWxsb2Moc2ssIHRvdF9sZW4sIEdGUF9BVE9NSUMpOworCWlmICghb3B0MikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0JVRlMpOworCisJbWVtc2V0KG9wdDIsIDAsIHRvdF9sZW4pOworCisJb3B0Mi0+dG90X2xlbiA9IHRvdF9sZW47CisJcCA9IChjaGFyICopKG9wdDIgKyAxKTsKKworCWVyciA9IGlwdjZfcmVuZXdfb3B0aW9uKG9wdC0+aG9wb3B0LCBuZXdvcHQsIG5ld29wdGxlbiwKKwkJCQluZXd0eXBlICE9IElQVjZfSE9QT1BUUywKKwkJCQkmb3B0Mi0+aG9wb3B0LCAmcCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBpcHY2X3JlbmV3X29wdGlvbihvcHQtPmRzdDBvcHQsIG5ld29wdCwgbmV3b3B0bGVuLAorCQkJCW5ld3R5cGUgIT0gSVBWNl9SVEhEUkRTVE9QVFMsCisJCQkJJm9wdDItPmRzdDBvcHQsICZwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGlwdjZfcmVuZXdfb3B0aW9uKG9wdC0+c3JjcnQsIG5ld29wdCwgbmV3b3B0bGVuLAorCQkJCW5ld3R5cGUgIT0gSVBWNl9SVEhEUiwKKwkJCQkoc3RydWN0IGlwdjZfb3B0X2hkciAqKilvcHQyLT5zcmNydCwgJnApOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gaXB2Nl9yZW5ld19vcHRpb24ob3B0LT5kc3Qxb3B0LCBuZXdvcHQsIG5ld29wdGxlbiwKKwkJCQluZXd0eXBlICE9IElQVjZfRFNUT1BUUywKKwkJCQkmb3B0Mi0+ZHN0MW9wdCwgJnApOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJb3B0Mi0+b3B0X25mbGVuID0gKG9wdDItPmhvcG9wdCA/IGlwdjZfb3B0bGVuKG9wdDItPmhvcG9wdCkgOiAwKSArCisJCQkgIChvcHQyLT5kc3Qwb3B0ID8gaXB2Nl9vcHRsZW4ob3B0Mi0+ZHN0MG9wdCkgOiAwKSArCisJCQkgIChvcHQyLT5zcmNydCA/IGlwdjZfb3B0bGVuKG9wdDItPnNyY3J0KSA6IDApOworCW9wdDItPm9wdF9mbGVuID0gKG9wdDItPmRzdDFvcHQgPyBpcHY2X29wdGxlbihvcHQyLT5kc3Qxb3B0KSA6IDApOworCisJcmV0dXJuIG9wdDI7CitvdXQ6CisJc29ja19rZnJlZV9zKHNrLCBwLCB0b3RfbGVuKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pY21wLmMgYi9uZXQvaXB2Ni9pY21wLmMKaW5kZXggNTE3NmZjNi4uYjcxODVmYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaWNtcC5jCisrKyBiL25ldC9pcHY2L2ljbXAuYwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJaW50IGlpZiA9IDA7CiAJaW50IGFkZHJfdHlwZSA9IDA7CiAJaW50IGxlbjsKLQlpbnQgaGxpbWl0OworCWludCBobGltaXQsIHRjbGFzczsKIAlpbnQgZXJyID0gMDsKIAogCWlmICgodTgqKWhkciA8IHNrYi0+aGVhZCB8fCAodTgqKShoZHIrMSkgPiBza2ItPnRhaWwpCkBAIC0zNzQsNyArMzc0LDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApKSA8IDApCi0JCWdvdG8gb3V0X2RzdF9yZWxlYXNlOworCQlnb3RvIG91dDsKIAogCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZmbC5mbDZfZHN0KSkKIAkJaGxpbWl0ID0gbnAtPm1jYXN0X2hvcHM7CkBAIC0zODUsNiArMzg1LDEwIEBACiAJaWYgKGhsaW1pdCA8IDApCiAJCWhsaW1pdCA9IGlwdjZfZ2V0X2hvcGxpbWl0KGRzdC0+ZGV2KTsKIAorCXRjbGFzcyA9IG5wLT5jb3JrLnRjbGFzczsKKwlpZiAodGNsYXNzIDwgMCkKKwkJdGNsYXNzID0gMDsKKwogCW1zZy5za2IgPSBza2I7CiAJbXNnLm9mZnNldCA9IHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhOwogCkBAIC00MDAsNyArNDA0LDcgQEAKIAllcnIgPSBpcDZfYXBwZW5kX2RhdGEoc2ssIGljbXB2Nl9nZXRmcmFnLCAmbXNnLAogCQkJICAgICAgbGVuICsgc2l6ZW9mKHN0cnVjdCBpY21wNmhkciksCiAJCQkgICAgICBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSwKLQkJCSAgICAgIGhsaW1pdCwgTlVMTCwgJmZsLCAoc3RydWN0IHJ0Nl9pbmZvKilkc3QsCisJCQkgICAgICBobGltaXQsIHRjbGFzcywgTlVMTCwgJmZsLCAoc3RydWN0IHJ0Nl9pbmZvKilkc3QsCiAJCQkgICAgICBNU0dfRE9OVFdBSVQpOwogCWlmIChlcnIpIHsKIAkJaXA2X2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKQEAgLTQzNCw2ICs0MzgsNyBAQAogCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKIAlpbnQgZXJyID0gMDsKIAlpbnQgaGxpbWl0OworCWludCB0Y2xhc3M7CiAKIAlzYWRkciA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKIApAQCAtNDY0LDcgKzQ2OSw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAJaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKQotCQlnb3RvIG91dF9kc3RfcmVsZWFzZTsKKwkJZ290byBvdXQ7CiAKIAlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmZmwuZmw2X2RzdCkpCiAJCWhsaW1pdCA9IG5wLT5tY2FzdF9ob3BzOwpAQCAtNDc1LDEzICs0ODAsMTcgQEAKIAlpZiAoaGxpbWl0IDwgMCkKIAkJaGxpbWl0ID0gaXB2Nl9nZXRfaG9wbGltaXQoZHN0LT5kZXYpOwogCisJdGNsYXNzID0gbnAtPmNvcmsudGNsYXNzOworCWlmICh0Y2xhc3MgPCAwKQorCQl0Y2xhc3MgPSAwOworCiAJaWRldiA9IGluNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKIAogCW1zZy5za2IgPSBza2I7CiAJbXNnLm9mZnNldCA9IDA7CiAKIAllcnIgPSBpcDZfYXBwZW5kX2RhdGEoc2ssIGljbXB2Nl9nZXRmcmFnLCAmbXNnLCBza2ItPmxlbiArIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpLAotCQkJCXNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpLCBobGltaXQsIE5VTEwsICZmbCwKKwkJCQlzaXplb2Yoc3RydWN0IGljbXA2aGRyKSwgaGxpbWl0LCB0Y2xhc3MsIE5VTEwsICZmbCwKIAkJCQkoc3RydWN0IHJ0Nl9pbmZvKilkc3QsIE1TR19ET05UV0FJVCk7CiAKIAlpZiAoZXJyKSB7CkBAIC00OTYsNyArNTA1LDYgQEAKIG91dF9wdXQ6IAogCWlmIChsaWtlbHkoaWRldiAhPSBOVUxMKSkKIAkJaW42X2Rldl9wdXQoaWRldik7Ci1vdXRfZHN0X3JlbGVhc2U6CiAJZHN0X3JlbGVhc2UoZHN0KTsKIG91dDogCiAJaWNtcHY2X3htaXRfdW5sb2NrKCk7CkBAIC01NDksNyArNTU3LDcgQEAKIAlyZWFkX2xvY2soJnJhd192Nl9sb2NrKTsKIAlpZiAoKHNrID0gc2tfaGVhZCgmcmF3X3Y2X2h0YWJsZVtoYXNoXSkpICE9IE5VTEwpIHsKIAkJd2hpbGUoKHNrID0gX19yYXdfdjZfbG9va3VwKHNrLCBuZXh0aGRyLCBkYWRkciwgc2FkZHIsCi0JCQkJCSAgICBza2ItPmRldi0+aWZpbmRleCkpKSB7CisJCQkJCSAgICBJUDZDQihza2IpLT5paWYpKSkgewogCQkJcmF3djZfZXJyKHNrLCBza2IsIE5VTEwsIHR5cGUsIGNvZGUsIGlubmVyX29mZnNldCwgaW5mbyk7CiAJCQlzayA9IHNrX25leHQoc2spOwogCQl9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmliLmMgYi9uZXQvaXB2Ni9pcDZfZmliLmMKaW5kZXggMTZhZjg3NC4uNGZjYzVhNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2ZpYi5jCisrKyBiL25ldC9pcHY2L2lwNl9maWIuYwpAQCAtOTIsNyArOTIsNyBAQAogCiBzdGF0aWMgX191MzIgcnRfc2VybnVtOwogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgaXA2X2ZpYl90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKGZpYjZfcnVuX2djLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoaXA2X2ZpYl90aW1lciwgZmliNl9ydW5fZ2MsIDAsIDApOwogCiBzdHJ1Y3QgZmliNl93YWxrZXJfdCBmaWI2X3dhbGtlcl9saXN0ID0gewogCS5wcmV2CT0gJmZpYjZfd2Fsa2VyX2xpc3QsCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMgYi9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKaW5kZXggYjZjNzNkYS4uZjg0MWJkZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCisrKyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwpAQCAtNTAsNyArNTAsNyBAQAogc3RhdGljIHN0cnVjdCBpcDZfZmxvd2xhYmVsICpmbF9odFtGTF9IQVNIX01BU0srMV07CiAKIHN0YXRpYyB2b2lkIGlwNl9mbF9nYyh1bnNpZ25lZCBsb25nIGR1bW15KTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBpcDZfZmxfZ2NfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihpcDZfZmxfZ2MsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihpcDZfZmxfZ2NfdGltZXIsIGlwNl9mbF9nYywgMCwgMCk7CiAKIC8qIEZMIGhhc2ggdGFibGUgbG9jazogaXQgcHJvdGVjdHMgb25seSBvZiBHQyAqLwogCkBAIC0yMjUsMTYgKzIyNSwyMCBAQAogCQkJCQkgc3RydWN0IGlwNl9mbG93bGFiZWwgKiBmbCwKIAkJCQkJIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqIGZvcHQpCiB7Ci0Jc3RydWN0IGlwdjZfdHhvcHRpb25zICogZmxfb3B0ID0gZmwtPm9wdDsKKwlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKiBmbF9vcHQgPSBmbCA/IGZsLT5vcHQgOiBOVUxMOwogCi0JaWYgKGZvcHQgPT0gTlVMTCB8fCBmb3B0LT5vcHRfZmxlbiA9PSAwKQotCQlyZXR1cm4gZmxfb3B0OworCWlmIChmb3B0ID09IE5VTEwgfHwgZm9wdC0+b3B0X2ZsZW4gPT0gMCkgeworCQlpZiAoIWZsX29wdCB8fCAhZmxfb3B0LT5kc3Qwb3B0IHx8IGZsX29wdC0+c3JjcnQpCisJCQlyZXR1cm4gZmxfb3B0OworCX0KIAogCWlmIChmbF9vcHQgIT0gTlVMTCkgewogCQlvcHRfc3BhY2UtPmhvcG9wdCA9IGZsX29wdC0+aG9wb3B0OwotCQlvcHRfc3BhY2UtPmRzdDBvcHQgPSBmbF9vcHQtPmRzdDBvcHQ7CisJCW9wdF9zcGFjZS0+ZHN0MG9wdCA9IGZsX29wdC0+c3JjcnQgPyBmbF9vcHQtPmRzdDBvcHQgOiBOVUxMOwogCQlvcHRfc3BhY2UtPnNyY3J0ID0gZmxfb3B0LT5zcmNydDsKIAkJb3B0X3NwYWNlLT5vcHRfbmZsZW4gPSBmbF9vcHQtPm9wdF9uZmxlbjsKKwkJaWYgKGZsX29wdC0+ZHN0MG9wdCAmJiAhZmxfb3B0LT5zcmNydCkKKwkJCW9wdF9zcGFjZS0+b3B0X25mbGVuIC09IGlwdjZfb3B0bGVuKGZsX29wdC0+ZHN0MG9wdCk7CiAJfSBlbHNlIHsKIAkJaWYgKGZvcHQtPm9wdF9uZmxlbiA9PSAwKQogCQkJcmV0dXJuIGZvcHQ7CkBAIC0zMTAsNyArMzE0LDcgQEAKIAkJbXNnLm1zZ19jb250cm9sID0gKHZvaWQqKShmbC0+b3B0KzEpOwogCQlmbG93aS5vaWYgPSAwOwogCi0JCWVyciA9IGRhdGFncmFtX3NlbmRfY3RsKCZtc2csICZmbG93aSwgZmwtPm9wdCwgJmp1bmspOworCQllcnIgPSBkYXRhZ3JhbV9zZW5kX2N0bCgmbXNnLCAmZmxvd2ksIGZsLT5vcHQsICZqdW5rLCAmanVuayk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGRvbmU7CiAJCWVyciA9IC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKaW5kZXggMDFlZjk0Zi4uMmY1ODlmMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X291dHB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJc3RydWN0IGlwdjZoZHIgKmhkcjsKIAl1OCAgcHJvdG8gPSBmbC0+cHJvdG87CiAJaW50IHNlZ19sZW4gPSBza2ItPmxlbjsKLQlpbnQgaGxpbWl0OworCWludCBobGltaXQsIHRjbGFzczsKIAl1MzIgbXR1OwogCiAJaWYgKG9wdCkgewpAQCAtMjAyLDcgKzIwMiw2IEBACiAJICoJRmlsbCBpbiB0aGUgSVB2NiBoZWFkZXIKIAkgKi8KIAotCSoodTMyKiloZHIgPSBodG9ubCgweDYwMDAwMDAwKSB8IGZsLT5mbDZfZmxvd2xhYmVsOwogCWhsaW1pdCA9IC0xOwogCWlmIChucCkKIAkJaGxpbWl0ID0gbnAtPmhvcF9saW1pdDsKQEAgLTIxMSw2ICsyMTAsMTQgQEAKIAlpZiAoaGxpbWl0IDwgMCkKIAkJaGxpbWl0ID0gaXB2Nl9nZXRfaG9wbGltaXQoZHN0LT5kZXYpOwogCisJdGNsYXNzID0gLTE7CisJaWYgKG5wKQorCQl0Y2xhc3MgPSBucC0+dGNsYXNzOworCWlmICh0Y2xhc3MgPCAwKQorCQl0Y2xhc3MgPSAwOworCisJKih1MzIgKiloZHIgPSBodG9ubCgweDYwMDAwMDAwIHwgKHRjbGFzcyA8PCAyMCkpIHwgZmwtPmZsNl9mbG93bGFiZWw7CisKIAloZHItPnBheWxvYWRfbGVuID0gaHRvbnMoc2VnX2xlbik7CiAJaGRyLT5uZXh0aGRyID0gcHJvdG87CiAJaGRyLT5ob3BfbGltaXQgPSBobGltaXQ7CkBAIC03NjIsMTAgKzc2OSwxMSBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBpcDZfYXBwZW5kX2RhdGEoc3RydWN0IHNvY2sgKnNrLCBpbnQgZ2V0ZnJhZyh2b2lkICpmcm9tLCBjaGFyICp0bywgaW50IG9mZnNldCwgaW50IGxlbiwgaW50IG9kZCwgc3RydWN0IHNrX2J1ZmYgKnNrYiksCi0JCSAgICB2b2lkICpmcm9tLCBpbnQgbGVuZ3RoLCBpbnQgdHJhbnNoZHJsZW4sCi0JCSAgICBpbnQgaGxpbWl0LCBzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCwgc3RydWN0IGZsb3dpICpmbCwgc3RydWN0IHJ0Nl9pbmZvICpydCwKLQkJICAgIHVuc2lnbmVkIGludCBmbGFncykKK2ludCBpcDZfYXBwZW5kX2RhdGEoc3RydWN0IHNvY2sgKnNrLCBpbnQgZ2V0ZnJhZyh2b2lkICpmcm9tLCBjaGFyICp0bywKKwlpbnQgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgb2RkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSwKKwl2b2lkICpmcm9tLCBpbnQgbGVuZ3RoLCBpbnQgdHJhbnNoZHJsZW4sCisJaW50IGhsaW1pdCwgaW50IHRjbGFzcywgc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQsIHN0cnVjdCBmbG93aSAqZmwsCisJc3RydWN0IHJ0Nl9pbmZvICpydCwgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CkBAIC04MDMsNiArODExLDcgQEAKIAkJbnAtPmNvcmsucnQgPSBydDsKIAkJaW5ldC0+Y29yay5mbCA9ICpmbDsKIAkJbnAtPmNvcmsuaG9wX2xpbWl0ID0gaGxpbWl0OworCQlucC0+Y29yay50Y2xhc3MgPSB0Y2xhc3M7CiAJCWluZXQtPmNvcmsuZnJhZ3NpemUgPSBtdHUgPSBkc3RfbXR1KHJ0LT51LmRzdC5wYXRoKTsKIAkJaWYgKGRzdF9hbGxmcmFnKHJ0LT51LmRzdC5wYXRoKSkKIAkJCWluZXQtPmNvcmsuZmxhZ3MgfD0gSVBDT1JLX0FMTEZSQUc7CkBAIC0xMDg0LDcgKzEwOTMsOCBAQAogCiAJc2tiLT5uaC5pcHY2aCA9IGhkciA9IChzdHJ1Y3QgaXB2NmhkciopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAJCi0JKih1MzIqKWhkciA9IGZsLT5mbDZfZmxvd2xhYmVsIHwgaHRvbmwoMHg2MDAwMDAwMCk7CisJKih1MzIqKWhkciA9IGZsLT5mbDZfZmxvd2xhYmVsIHwKKwkJICAgICBodG9ubCgweDYwMDAwMDAwIHwgKChpbnQpbnAtPmNvcmsudGNsYXNzIDw8IDIwKSk7CiAKIAlpZiAoc2tiLT5sZW4gPD0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIElQVjZfTUFYUExFTikKIAkJaGRyLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKaW5kZXggMDk2MTM3Mi4uY2Y5NDM3MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwpAQCAtNjczLDExICs2NzMsMTIgQEAKIAogCWlmICgoZHN0ID0gaXA2X3RubF9kc3RfY2hlY2sodCkpICE9IE5VTEwpCiAJCWRzdF9ob2xkKGRzdCk7Ci0JZWxzZQorCWVsc2UgewogCQlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KE5VTEwsICZmbCk7CiAKLQlpZiAoZHN0LT5lcnJvciB8fCB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApIDwgMCkKLQkJZ290byB0eF9lcnJfbGlua19mYWlsdXJlOworCQlpZiAoZHN0LT5lcnJvciB8fCB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApIDwgMCkKKwkJCWdvdG8gdHhfZXJyX2xpbmtfZmFpbHVyZTsKKwl9CiAKIAl0ZGV2ID0gZHN0LT5kZXY7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwY29tcDYuYyBiL25ldC9pcHY2L2lwY29tcDYuYwppbmRleCAxMzUzODNlLi44NWJmYmM2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcGNvbXA2LmMKKysrIGIvbmV0L2lwdjYvaXBjb21wNi5jCkBAIC0zNDEsOCArMzQxLDcgQEAKIAogCWZvcl9lYWNoX2NwdShjcHUpIHsKIAkJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9ICpwZXJfY3B1X3B0cih0Zm1zLCBjcHUpOwotCQlpZiAodGZtKQotCQkJY3J5cHRvX2ZyZWVfdGZtKHRmbSk7CisJCWNyeXB0b19mcmVlX3RmbSh0Zm0pOwogCX0KIAlmcmVlX3BlcmNwdSh0Zm1zKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYyBiL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYwppbmRleCA3NjQ2NmFmLi44NTY3ODczIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKKysrIGIvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCkBAIC0yMTAsMzkgKzIxMCwxMzkgQEAKIAkJcmV0diA9IDA7CiAJCWJyZWFrOwogCi0JY2FzZSBJUFY2X1BLVElORk86CisJY2FzZSBJUFY2X1JFQ1ZQS1RJTkZPOgogCQlucC0+cnhvcHQuYml0cy5yeGluZm8gPSB2YWxib29sOwogCQlyZXR2ID0gMDsKIAkJYnJlYWs7CisJCQorCWNhc2UgSVBWNl8yMjkyUEtUSU5GTzoKKwkJbnAtPnJ4b3B0LmJpdHMucnhvaW5mbyA9IHZhbGJvb2w7CisJCXJldHYgPSAwOworCQlicmVhazsKIAotCWNhc2UgSVBWNl9IT1BMSU1JVDoKKwljYXNlIElQVjZfUkVDVkhPUExJTUlUOgogCQlucC0+cnhvcHQuYml0cy5yeGhsaW0gPSB2YWxib29sOwogCQlyZXR2ID0gMDsKIAkJYnJlYWs7CiAKLQljYXNlIElQVjZfUlRIRFI6CisJY2FzZSBJUFY2XzIyOTJIT1BMSU1JVDoKKwkJbnAtPnJ4b3B0LmJpdHMucnhvaGxpbSA9IHZhbGJvb2w7CisJCXJldHYgPSAwOworCQlicmVhazsKKworCWNhc2UgSVBWNl9SRUNWUlRIRFI6CiAJCWlmICh2YWwgPCAwIHx8IHZhbCA+IDIpCiAJCQlnb3RvIGVfaW52YWw7CiAJCW5wLT5yeG9wdC5iaXRzLnNyY3J0ID0gdmFsOwogCQlyZXR2ID0gMDsKIAkJYnJlYWs7CiAKLQljYXNlIElQVjZfSE9QT1BUUzoKKwljYXNlIElQVjZfMjI5MlJUSERSOgorCQlpZiAodmFsIDwgMCB8fCB2YWwgPiAyKQorCQkJZ290byBlX2ludmFsOworCQlucC0+cnhvcHQuYml0cy5vc3JjcnQgPSB2YWw7CisJCXJldHYgPSAwOworCQlicmVhazsKKworCWNhc2UgSVBWNl9SRUNWSE9QT1BUUzoKIAkJbnAtPnJ4b3B0LmJpdHMuaG9wb3B0cyA9IHZhbGJvb2w7CiAJCXJldHYgPSAwOwogCQlicmVhazsKIAotCWNhc2UgSVBWNl9EU1RPUFRTOgorCWNhc2UgSVBWNl8yMjkySE9QT1BUUzoKKwkJbnAtPnJ4b3B0LmJpdHMub2hvcG9wdHMgPSB2YWxib29sOworCQlyZXR2ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfUkVDVkRTVE9QVFM6CiAJCW5wLT5yeG9wdC5iaXRzLmRzdG9wdHMgPSB2YWxib29sOwogCQlyZXR2ID0gMDsKIAkJYnJlYWs7CiAKKwljYXNlIElQVjZfMjI5MkRTVE9QVFM6CisJCW5wLT5yeG9wdC5iaXRzLm9kc3RvcHRzID0gdmFsYm9vbDsKKwkJcmV0diA9IDA7CisJCWJyZWFrOworCisJY2FzZSBJUFY2X1RDTEFTUzoKKwkJaWYgKHZhbCA8IDAgfHwgdmFsID4gMHhmZikKKwkJCWdvdG8gZV9pbnZhbDsKKwkJbnAtPnRjbGFzcyA9IHZhbDsKKwkJcmV0diA9IDA7CisJCWJyZWFrOworCQkKKwljYXNlIElQVjZfUkVDVlRDTEFTUzoKKwkJbnAtPnJ4b3B0LmJpdHMucnh0Y2xhc3MgPSB2YWxib29sOworCQlyZXR2ID0gMDsKKwkJYnJlYWs7CisKIAljYXNlIElQVjZfRkxPV0lORk86CiAJCW5wLT5yeG9wdC5iaXRzLnJ4ZmxvdyA9IHZhbGJvb2w7CiAJCXJldHYgPSAwOwogCQlicmVhazsKIAotCWNhc2UgSVBWNl9QS1RPUFRJT05TOgorCWNhc2UgSVBWNl9IT1BPUFRTOgorCWNhc2UgSVBWNl9SVEhEUkRTVE9QVFM6CisJY2FzZSBJUFY2X1JUSERSOgorCWNhc2UgSVBWNl9EU1RPUFRTOgorCXsKKwkJc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQ7CisJCWlmIChvcHRsZW4gPT0gMCkKKwkJCW9wdHZhbCA9IDA7CisKKwkJLyogaG9wLWJ5LWhvcCAvIGRlc3RpbmF0aW9uIG9wdGlvbnMgYXJlIHByaXZpbGVnZWQgb3B0aW9uICovCisJCXJldHYgPSAtRVBFUk07CisJCWlmIChvcHRuYW1lICE9IElQVjZfUlRIRFIgJiYgIWNhcGFibGUoQ0FQX05FVF9SQVcpKQorCQkJYnJlYWs7CisKKwkJcmV0diA9IC1FSU5WQUw7CisJCWlmIChvcHRsZW4gJiAweDcgfHwgb3B0bGVuID4gOCAqIDI1NSkKKwkJCWJyZWFrOworCisJCW9wdCA9IGlwdjZfcmVuZXdfb3B0aW9ucyhzaywgbnAtPm9wdCwgb3B0bmFtZSwKKwkJCQkJIChzdHJ1Y3QgaXB2Nl9vcHRfaGRyIF9fdXNlciAqKW9wdHZhbCwKKwkJCQkJIG9wdGxlbik7CisJCWlmIChJU19FUlIob3B0KSkgeworCQkJcmV0diA9IFBUUl9FUlIob3B0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogcm91dGluZyBoZWFkZXIgb3B0aW9uIG5lZWRzIGV4dHJhIGNoZWNrICovCisJCWlmIChvcHRuYW1lID09IElQVjZfUlRIRFIgJiYgb3B0LT5zcmNydCkgeworCQkJc3RydWN0IGlwdjZfcnRfaGRyICpydGhkciA9IG9wdC0+c3JjcnQ7CisJCQlpZiAocnRoZHItPnR5cGUpCisJCQkJZ290byBzdGlja3lfZG9uZTsKKwkJCWlmICgocnRoZHItPmhkcmxlbiAmIDEpIHx8CisJCQkgICAgKHJ0aGRyLT5oZHJsZW4gPj4gMSkgIT0gcnRoZHItPnNlZ21lbnRzX2xlZnQpCisJCQkJZ290byBzdGlja3lfZG9uZTsKKwkJfQorCisJCXJldHYgPSAwOworCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0pIHsKKwkJCWlmIChvcHQpIHsKKwkJCQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwkJCQlpZiAoISgoMSA8PCBzay0+c2tfc3RhdGUpICYKKwkJCQkgICAgICAoVENQRl9MSVNURU4gfCBUQ1BGX0NMT1NFKSkKKwkJCQkgICAgJiYgaW5ldF9zayhzayktPmRhZGRyICE9IExPT1BCQUNLNF9JUFY2KSB7CisJCQkJCXRwLT5leHRfaGVhZGVyX2xlbiA9IG9wdC0+b3B0X2ZsZW4gKyBvcHQtPm9wdF9uZmxlbjsKKwkJCQkJdGNwX3N5bmNfbXNzKHNrLCB0cC0+cG10dV9jb29raWUpOworCQkJCX0KKwkJCX0KKwkJCW9wdCA9IHhjaGcoJm5wLT5vcHQsIG9wdCk7CisJCQlza19kc3RfcmVzZXQoc2spOworCQl9IGVsc2UgeworCQkJd3JpdGVfbG9jaygmc2stPnNrX2RzdF9sb2NrKTsKKwkJCW9wdCA9IHhjaGcoJm5wLT5vcHQsIG9wdCk7CisJCQl3cml0ZV91bmxvY2soJnNrLT5za19kc3RfbG9jayk7CisJCQlza19kc3RfcmVzZXQoc2spOworCQl9CitzdGlja3lfZG9uZToKKwkJaWYgKG9wdCkKKwkJCXNvY2tfa2ZyZWVfcyhzaywgb3B0LCBvcHQtPnRvdF9sZW4pOworCQlicmVhazsKKwl9CisKKwljYXNlIElQVjZfMjI5MlBLVE9QVElPTlM6CiAJewogCQlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCA9IE5VTEw7CiAJCXN0cnVjdCBtc2doZHIgbXNnOwpAQCAtMjc2LDcgKzM3Niw3IEBACiAJCW1zZy5tc2dfY29udHJvbGxlbiA9IG9wdGxlbjsKIAkJbXNnLm1zZ19jb250cm9sID0gKHZvaWQqKShvcHQrMSk7CiAKLQkJcmV0diA9IGRhdGFncmFtX3NlbmRfY3RsKCZtc2csICZmbCwgb3B0LCAmanVuayk7CisJCXJldHYgPSBkYXRhZ3JhbV9zZW5kX2N0bCgmbXNnLCAmZmwsIG9wdCwgJmp1bmssICZqdW5rKTsKIAkJaWYgKHJldHYpCiAJCQlnb3RvIGRvbmU7CiB1cGRhdGU6CkBAIC01MjksNiArNjI5LDE3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK2ludCBpcHY2X2dldHNvY2tvcHRfc3RpY2t5KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwdjZfb3B0X2hkciAqaGRyLAorCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IGxlbikKK3sKKwlpZiAoIWhkcikKKwkJcmV0dXJuIDA7CisJbGVuID0gbWluX3QoaW50LCBsZW4sIGlwdjZfb3B0bGVuKGhkcikpOworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCBoZHIsIGlwdjZfb3B0bGVuKGhkcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gbGVuOworfQorCiBpbnQgaXB2Nl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKQEAgLTU2Nyw3ICs2NzgsNyBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCWNhc2UgSVBWNl9QS1RPUFRJT05TOgorCWNhc2UgSVBWNl8yMjkyUEtUT1BUSU9OUzoKIAl7CiAJCXN0cnVjdCBtc2doZHIgbXNnOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtNjAxLDYgKzcxMiwxNiBAQAogCQkJCWludCBobGltID0gbnAtPm1jYXN0X2hvcHM7CiAJCQkJcHV0X2Ntc2coJm1zZywgU09MX0lQVjYsIElQVjZfSE9QTElNSVQsIHNpemVvZihobGltKSwgJmhsaW0pOwogCQkJfQorCQkJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4b2luZm8pIHsKKwkJCQlzdHJ1Y3QgaW42X3BrdGluZm8gc3JjX2luZm87CisJCQkJc3JjX2luZm8uaXBpNl9pZmluZGV4ID0gbnAtPm1jYXN0X29pZjsKKwkJCQlpcHY2X2FkZHJfY29weSgmc3JjX2luZm8uaXBpNl9hZGRyLCAmbnAtPmRhZGRyKTsKKwkJCQlwdXRfY21zZygmbXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkyUEtUSU5GTywgc2l6ZW9mKHNyY19pbmZvKSwgJnNyY19pbmZvKTsKKwkJCX0KKwkJCWlmIChucC0+cnhvcHQuYml0cy5yeG9obGltKSB7CisJCQkJaW50IGhsaW0gPSBucC0+bWNhc3RfaG9wczsKKwkJCQlwdXRfY21zZygmbXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkySE9QTElNSVQsIHNpemVvZihobGltKSwgJmhsaW0pOworCQkJfQogCQl9CiAJCWxlbiAtPSBtc2cubXNnX2NvbnRyb2xsZW47CiAJCXJldHVybiBwdXRfdXNlcihsZW4sIG9wdGxlbik7CkBAIC02MjUsMjYgKzc0Niw2NyBAQAogCQl2YWwgPSBucC0+aXB2Nm9ubHk7CiAJCWJyZWFrOwogCi0JY2FzZSBJUFY2X1BLVElORk86CisJY2FzZSBJUFY2X1JFQ1ZQS1RJTkZPOgogCQl2YWwgPSBucC0+cnhvcHQuYml0cy5yeGluZm87CiAJCWJyZWFrOwogCi0JY2FzZSBJUFY2X0hPUExJTUlUOgorCWNhc2UgSVBWNl8yMjkyUEtUSU5GTzoKKwkJdmFsID0gbnAtPnJ4b3B0LmJpdHMucnhvaW5mbzsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfUkVDVkhPUExJTUlUOgogCQl2YWwgPSBucC0+cnhvcHQuYml0cy5yeGhsaW07CiAJCWJyZWFrOwogCi0JY2FzZSBJUFY2X1JUSERSOgorCWNhc2UgSVBWNl8yMjkySE9QTElNSVQ6CisJCXZhbCA9IG5wLT5yeG9wdC5iaXRzLnJ4b2hsaW07CisJCWJyZWFrOworCisJY2FzZSBJUFY2X1JFQ1ZSVEhEUjoKIAkJdmFsID0gbnAtPnJ4b3B0LmJpdHMuc3JjcnQ7CiAJCWJyZWFrOwogCisJY2FzZSBJUFY2XzIyOTJSVEhEUjoKKwkJdmFsID0gbnAtPnJ4b3B0LmJpdHMub3NyY3J0OworCQlicmVhazsKKwogCWNhc2UgSVBWNl9IT1BPUFRTOgorCWNhc2UgSVBWNl9SVEhEUkRTVE9QVFM6CisJY2FzZSBJUFY2X1JUSERSOgorCWNhc2UgSVBWNl9EU1RPUFRTOgorCXsKKworCQlsb2NrX3NvY2soc2spOworCQlsZW4gPSBpcHY2X2dldHNvY2tvcHRfc3RpY2t5KHNrLCBucC0+b3B0LT5ob3BvcHQsCisJCQkJCSAgICAgb3B0dmFsLCBsZW4pOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gcHV0X3VzZXIobGVuLCBvcHRsZW4pOworCX0KKworCWNhc2UgSVBWNl9SRUNWSE9QT1BUUzoKIAkJdmFsID0gbnAtPnJ4b3B0LmJpdHMuaG9wb3B0czsKIAkJYnJlYWs7CiAKLQljYXNlIElQVjZfRFNUT1BUUzoKKwljYXNlIElQVjZfMjI5MkhPUE9QVFM6CisJCXZhbCA9IG5wLT5yeG9wdC5iaXRzLm9ob3BvcHRzOworCQlicmVhazsKKworCWNhc2UgSVBWNl9SRUNWRFNUT1BUUzoKIAkJdmFsID0gbnAtPnJ4b3B0LmJpdHMuZHN0b3B0czsKIAkJYnJlYWs7CiAKKwljYXNlIElQVjZfMjI5MkRTVE9QVFM6CisJCXZhbCA9IG5wLT5yeG9wdC5iaXRzLm9kc3RvcHRzOworCQlicmVhazsKKworCWNhc2UgSVBWNl9UQ0xBU1M6CisJCXZhbCA9IG5wLT50Y2xhc3M7CisJCWJyZWFrOworCisJY2FzZSBJUFY2X1JFQ1ZUQ0xBU1M6CisJCXZhbCA9IG5wLT5yeG9wdC5iaXRzLnJ4dGNsYXNzOworCQlicmVhazsKKwogCWNhc2UgSVBWNl9GTE9XSU5GTzoKIAkJdmFsID0gbnAtPnJ4b3B0LmJpdHMucnhmbG93OwogCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25kaXNjLmMgYi9uZXQvaXB2Ni9uZGlzYy5jCmluZGV4IGE3ZWFlMzAuLjU1NWEzMTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25kaXNjLmMKKysrIGIvbmV0L2lwdjYvbmRpc2MuYwpAQCAtNDQ3LDEwICs0NDcsOCBAQAogCQlyZXR1cm47CiAKIAllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCWRzdF9yZWxlYXNlKGRzdCk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybjsKLQl9CiAKIAlpZiAoaW5jX29wdCkgewogCQlpZiAoZGV2LT5hZGRyX2xlbikKQEAgLTUzOSwxMCArNTM3LDggQEAKIAkJcmV0dXJuOwogCiAJZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBOVUxMLCAwKTsKLQlpZiAoZXJyIDwgMCkgewotCQlkc3RfcmVsZWFzZShkc3QpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm47Ci0JfQogCiAJbGVuID0gc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikgKyBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKIAlzZW5kX2xsaW5mbyA9IGRldi0+YWRkcl9sZW4gJiYgIWlwdjZfYWRkcl9hbnkoc2FkZHIpOwpAQCAtNjE2LDEwICs2MTIsOCBAQAogCQlyZXR1cm47CiAKIAllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCWRzdF9yZWxlYXNlKGRzdCk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybjsKLQl9CiAKIAlsZW4gPSBzaXplb2Yoc3RydWN0IGljbXA2aGRyKTsKIAlpZiAoZGV2LT5hZGRyX2xlbikKQEAgLTEzNTMsMTAgKzEzNDcsOCBAQAogCQlyZXR1cm47CiAKIAllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApOwotCWlmIChlcnIpIHsKLQkJZHN0X3JlbGVhc2UoZHN0KTsKKwlpZiAoZXJyKQogCQlyZXR1cm47Ci0JfQogCiAJcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopIGRzdDsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYwppbmRleCAxNDMxNmMzLi5iMDNlODdhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYwpAQCAtMTAwLDExICsxMDAsOCBAQAogCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQoTlVMTCwgJmZsKTsKIAlpZiAoZHN0ID09IE5VTEwpCiAJCXJldHVybjsKLQlpZiAoZHN0LT5lcnJvciB8fAotCSAgICB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApKSB7Ci0JCWRzdF9yZWxlYXNlKGRzdCk7CisJaWYgKGRzdC0+ZXJyb3IgfHwgeGZybV9sb29rdXAoJmRzdCwgJmZsLCBOVUxMLCAwKSkKIAkJcmV0dXJuOwotCX0KIAogCWhoX2xlbiA9IChkc3QtPmRldi0+aGFyZF9oZWFkZXJfbGVuICsgMTUpJn4xNTsKIAluc2tiID0gYWxsb2Nfc2tiKGhoX2xlbiArIDE1ICsgZHN0LT5oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfb3duZXIuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X293bmVyLmMKaW5kZXggOWI5MWRlYy4uNGRlNGNkYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfb3duZXIuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9vd25lci5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfb3duZXIuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jCmluZGV4IGE5NTI2YjcuLjJiYjY3MDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYwpAQCAtMTYxLDggKzE2MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJ0aW5mby0+aGRybGVuID09IGhkcmxlbikgXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgISEocnRpbmZvLT5pbnZmbGFncyAmIElQNlRfUlRfSU5WX0xFTikpKSk7CiAgICAgICAgREVCVUdQKCJyZXMgJTAyWCAlMDJYICUwMlggIiwgCi0gICAgICAgCQkocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfUkVTKSwgKChzdHJ1Y3QgcnQwX2hkciAqKXJoKS0+Yml0bWFwLAotICAgICAgIAkJISgocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfUkVTKSAmJiAoKChzdHJ1Y3QgcnQwX2hkciAqKXJoKS0+Yml0bWFwKSkpOworICAgICAgIAkJKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX1JFUyksICgoc3RydWN0IHJ0MF9oZHIgKilyaCktPnJlc2VydmVkLAorICAgICAgIAkJISgocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfUkVTKSAmJiAoKChzdHJ1Y3QgcnQwX2hkciAqKXJoKS0+cmVzZXJ2ZWQpKSk7CiAKICAgICAgICByZXQgPSAocmggIT0gTlVMTCkKICAgICAgICAJCSYmCkBAIC0xNzksMTIgKzE3OSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISEocnRpbmZvLT5pbnZmbGFncyAmIElQNlRfUlRfSU5WX1RZUCkpKTsKIAogCWlmIChyZXQgJiYgKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX1JFUykpIHsKLQkJdV9pbnQzMl90ICpicCwgX2JpdG1hcDsKLQkJYnAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLAotCQkJCQlwdHIgKyBvZmZzZXRvZihzdHJ1Y3QgcnQwX2hkciwgYml0bWFwKSwKLQkJCQkJc2l6ZW9mKF9iaXRtYXApLCAmX2JpdG1hcCk7CisJCXVfaW50MzJfdCAqcnAsIF9yZXNlcnZlZDsKKwkJcnAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLAorCQkJCQlwdHIgKyBvZmZzZXRvZihzdHJ1Y3QgcnQwX2hkciwgcmVzZXJ2ZWQpLAorCQkJCQlzaXplb2YoX3Jlc2VydmVkKSwgJl9yZXNlcnZlZCk7CiAKLQkJcmV0ID0gKCpicCA9PSAwKTsKKwkJcmV0ID0gKCpycCA9PSAwKTsKIAl9CiAKIAlERUJVR1AoIiMlZCAiLHJ0aW5mby0+YWRkcm5yKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Jhdy5jIGIvbmV0L2lwdjYvcmF3LmMKaW5kZXggN2E1ODYzMi4uNWFhMzY5MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcmF3LmMKKysrIGIvbmV0L2lwdjYvcmF3LmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCWlmIChzayA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAotCXNrID0gX19yYXdfdjZfbG9va3VwKHNrLCBuZXh0aGRyLCBkYWRkciwgc2FkZHIsIHNrYi0+ZGV2LT5pZmluZGV4KTsKKwlzayA9IF9fcmF3X3Y2X2xvb2t1cChzaywgbmV4dGhkciwgZGFkZHIsIHNhZGRyLCBJUDZDQihza2IpLT5paWYpOwogCiAJd2hpbGUgKHNrKSB7CiAJCWRlbGl2ZXJlZCA9IDE7CkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJCQlyYXd2Nl9yY3Yoc2ssIGNsb25lKTsKIAkJfQogCQlzayA9IF9fcmF3X3Y2X2xvb2t1cChza19uZXh0KHNrKSwgbmV4dGhkciwgZGFkZHIsIHNhZGRyLAotCQkJCSAgICAgc2tiLT5kZXYtPmlmaW5kZXgpOworCQkJCSAgICAgSVA2Q0Ioc2tiKS0+aWlmKTsKIAl9CiBvdXQ6CiAJcmVhZF91bmxvY2soJnJhd192Nl9sb2NrKTsKQEAgLTY1NSw2ICs2NTUsNyBAQAogCXN0cnVjdCBmbG93aSBmbDsKIAlpbnQgYWRkcl9sZW4gPSBtc2ctPm1zZ19uYW1lbGVuOwogCWludCBobGltaXQgPSAtMTsKKwlpbnQgdGNsYXNzID0gLTE7CiAJdTE2IHByb3RvOwogCWludCBlcnI7CiAKQEAgLTc0MCw3ICs3NDEsNyBAQAogCQltZW1zZXQob3B0LCAwLCBzaXplb2Yoc3RydWN0IGlwdjZfdHhvcHRpb25zKSk7CiAJCW9wdC0+dG90X2xlbiA9IHNpemVvZihzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMpOwogCi0JCWVyciA9IGRhdGFncmFtX3NlbmRfY3RsKG1zZywgJmZsLCBvcHQsICZobGltaXQpOworCQllcnIgPSBkYXRhZ3JhbV9zZW5kX2N0bChtc2csICZmbCwgb3B0LCAmaGxpbWl0LCAmdGNsYXNzKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWZsNl9zb2NrX3JlbGVhc2UoZmxvd2xhYmVsKTsKIAkJCXJldHVybiBlcnI7CkBAIC03NTUsOCArNzU2LDcgQEAKIAl9CiAJaWYgKG9wdCA9PSBOVUxMKQogCQlvcHQgPSBucC0+b3B0OwotCWlmIChmbG93bGFiZWwpCi0JCW9wdCA9IGZsNl9tZXJnZV9vcHRpb25zKCZvcHRfc3BhY2UsIGZsb3dsYWJlbCwgb3B0KTsKKwlvcHQgPSBmbDZfbWVyZ2Vfb3B0aW9ucygmb3B0X3NwYWNlLCBmbG93bGFiZWwsIG9wdCk7CiAKIAlmbC5wcm90byA9IHByb3RvOwogCXJhd3Y2X3Byb2JlX3Byb3RvX29wdCgmZmwsIG1zZyk7CkBAIC03ODIsMTAgKzc4Miw4IEBACiAJaWYgKGZpbmFsX3ApCiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBmaW5hbF9wKTsKIAotCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkgewotCQlkc3RfcmVsZWFzZShkc3QpOworCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkKIAkJZ290byBvdXQ7Ci0JfQogCiAJaWYgKGhsaW1pdCA8IDApIHsKIAkJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsLmZsNl9kc3QpKQpAQCAtNzk4LDYgKzc5NiwxMiBAQAogCQkJaGxpbWl0ID0gaXB2Nl9nZXRfaG9wbGltaXQoZHN0LT5kZXYpOwogCX0KIAorCWlmICh0Y2xhc3MgPCAwKSB7CisJCXRjbGFzcyA9IG5wLT5jb3JrLnRjbGFzczsKKwkJaWYgKHRjbGFzcyA8IDApCisJCQl0Y2xhc3MgPSAwOworCX0KKwogCWlmIChtc2ctPm1zZ19mbGFncyZNU0dfQ09ORklSTSkKIAkJZ290byBkb19jb25maXJtOwogCkBAIC04MDYsOCArODEwLDkgQEAKIAkJZXJyID0gcmF3djZfc2VuZF9oZHJpbmMoc2ssIG1zZy0+bXNnX2lvdiwgbGVuLCAmZmwsIChzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwgbXNnLT5tc2dfZmxhZ3MpOwogCX0gZWxzZSB7CiAJCWxvY2tfc29jayhzayk7Ci0JCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaXBfZ2VuZXJpY19nZXRmcmFnLCBtc2ctPm1zZ19pb3YsIGxlbiwgMCwKLQkJCQkJaGxpbWl0LCBvcHQsICZmbCwgKHN0cnVjdCBydDZfaW5mbyopZHN0LCBtc2ctPm1zZ19mbGFncyk7CisJCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaXBfZ2VuZXJpY19nZXRmcmFnLCBtc2ctPm1zZ19pb3YsCisJCQlsZW4sIDAsIGhsaW1pdCwgdGNsYXNzLCBvcHQsICZmbCwgKHN0cnVjdCBydDZfaW5mbyopZHN0LAorCQkJbXNnLT5tc2dfZmxhZ3MpOwogCiAJCWlmIChlcnIpCiAJCQlpcDZfZmx1c2hfcGVuZGluZ19mcmFtZXMoc2spOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmVhc3NlbWJseS5jIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCmluZGV4IDlkOWUwNDMuLmU0ZmU5ZWUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYworKysgYi9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKQEAgLTQ3OSwxMiArNDc5LDkgQEAKIAkvKiBQb2ludCBpbnRvIHRoZSBJUCBkYXRhZ3JhbSAnZGF0YScgcGFydC4gKi8KIAlpZiAoIXBza2JfcHVsbChza2IsICh1OCAqKSAoZmhkciArIDEpIC0gc2tiLT5kYXRhKSkKIAkJZ290byBlcnI7Ci0JaWYgKGVuZC1vZmZzZXQgPCBza2ItPmxlbikgewotCQlpZiAocHNrYl90cmltKHNrYiwgZW5kIC0gb2Zmc2V0KSkKLQkJCWdvdG8gZXJyOwotCQlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCi0JCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JfQorCQorCWlmIChwc2tiX3RyaW1fcmNzdW0oc2tiLCBlbmQgLSBvZmZzZXQpKQorCQlnb3RvIGVycjsKIAogCS8qIEZpbmQgb3V0IHdoaWNoIGZyYWdtZW50cyBhcmUgaW4gZnJvbnQgYW5kIGF0IHRoZSBiYWNrIG9mIHVzCiAJICogaW4gdGhlIGNoYWluIG9mIGZyYWdtZW50cyBzbyBmYXIuICBXZSBtdXN0IGtub3cgd2hlcmUgdG8gcHV0CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwppbmRleCA3OTQ3MzRmLi44MDY0M2U2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKQEAgLTYzMiwxMCArNjMyLDggQEAKIAlpZiAoZmluYWxfcCkKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIGZpbmFsX3ApOwogCi0JaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKSB7Ci0JCWRzdF9yZWxlYXNlKGRzdCk7CisJaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKQogCQlnb3RvIGZhaWx1cmU7Ci0JfQogCiAJaWYgKHNhZGRyID09IE5VTEwpIHsKIAkJc2FkZHIgPSAmZmwuZmw2X3NyYzsKQEAgLTg0OSw3ICs4NDcsNyBAQAogCWlmIChkc3QgPT0gTlVMTCkgewogCQlvcHQgPSBucC0+b3B0OwogCQlpZiAob3B0ID09IE5VTEwgJiYKLQkJICAgIG5wLT5yeG9wdC5iaXRzLnNyY3J0ID09IDIgJiYKKwkJICAgIG5wLT5yeG9wdC5iaXRzLm9zcmNydCA9PSAyICYmCiAJCSAgICB0cmVxLT5wa3RvcHRzKSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0b3B0cyA9IHRyZXEtPnBrdG9wdHM7CiAJCQlzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKnJ4b3B0ID0gSVA2Q0IocGt0b3B0cyk7CkBAIC04ODgsNyArODg2LDYgQEAKIAl9CiAKIGRvbmU6Ci0JZHN0X3JlbGVhc2UoZHN0KTsKICAgICAgICAgaWYgKG9wdCAmJiBvcHQgIT0gbnAtPm9wdCkKIAkJc29ja19rZnJlZV9zKHNrLCBvcHQsIG9wdC0+dG90X2xlbik7CiAJcmV0dXJuIGVycjsKQEAgLTkxNSwxMSArOTEyLDEwIEBACiAJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQgPSBJUDZDQihza2IpOwogCiAJaWYgKG5wLT5yeG9wdC5hbGwpIHsKLQkJaWYgKChvcHQtPmhvcCAmJiBucC0+cnhvcHQuYml0cy5ob3BvcHRzKSB8fAotCQkgICAgKChJUFY2X0ZMT1dJTkZPX01BU0smKih1MzIqKXNrYi0+bmgucmF3KSAmJgotCQkgICAgIG5wLT5yeG9wdC5iaXRzLnJ4ZmxvdykgfHwKLQkJICAgIChvcHQtPnNyY3J0ICYmIG5wLT5yeG9wdC5iaXRzLnNyY3J0KSB8fAotCQkgICAgKChvcHQtPmRzdDEgfHwgb3B0LT5kc3QwKSAmJiBucC0+cnhvcHQuYml0cy5kc3RvcHRzKSkKKwkJaWYgKChvcHQtPmhvcCAmJiAobnAtPnJ4b3B0LmJpdHMuaG9wb3B0cyB8fCBucC0+cnhvcHQuYml0cy5vaG9wb3B0cykpIHx8CisJCSAgICAoKElQVjZfRkxPV0lORk9fTUFTSyAmICoodTMyKilza2ItPm5oLnJhdykgJiYgbnAtPnJ4b3B0LmJpdHMucnhmbG93KSB8fAorCQkgICAgKG9wdC0+c3JjcnQgJiYgKG5wLT5yeG9wdC5iaXRzLnNyY3J0IHx8IG5wLT5yeG9wdC5iaXRzLm9zcmNydCkpIHx8CisJCSAgICAoKG9wdC0+ZHN0MSB8fCBvcHQtPmRzdDApICYmIChucC0+cnhvcHQuYml0cy5kc3RvcHRzIHx8IG5wLT5yeG9wdC5iaXRzLm9kc3RvcHRzKSkpCiAJCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xMDAxLDEwICs5OTcsOCBAQAogCS8qIHNrID0gTlVMTCwgYnV0IGl0IGlzIHNhZmUgZm9yIG5vdy4gUlNUIHNvY2tldCByZXF1aXJlZC4gKi8KIAlpZiAoIWlwNl9kc3RfbG9va3VwKE5VTEwsICZidWZmLT5kc3QsICZmbCkpIHsKIAotCQlpZiAoKHhmcm1fbG9va3VwKCZidWZmLT5kc3QsICZmbCwgTlVMTCwgMCkpIDwgMCkgewotCQkJZHN0X3JlbGVhc2UoYnVmZi0+ZHN0KTsKKwkJaWYgKCh4ZnJtX2xvb2t1cCgmYnVmZi0+ZHN0LCAmZmwsIE5VTEwsIDApKSA8IDApCiAJCQlyZXR1cm47Ci0JCX0KIAogCQlpcDZfeG1pdChOVUxMLCBidWZmLCAmZmwsIE5VTEwsIDApOwogCQlUQ1BfSU5DX1NUQVRTX0JIKFRDUF9NSUJfT1VUU0VHUyk7CkBAIC0xMDY4LDEwICsxMDYyLDggQEAKIAlmbC5mbF9pcF9zcG9ydCA9IHQxLT5zb3VyY2U7CiAKIAlpZiAoIWlwNl9kc3RfbG9va3VwKE5VTEwsICZidWZmLT5kc3QsICZmbCkpIHsKLQkJaWYgKCh4ZnJtX2xvb2t1cCgmYnVmZi0+ZHN0LCAmZmwsIE5VTEwsIDApKSA8IDApIHsKLQkJCWRzdF9yZWxlYXNlKGJ1ZmYtPmRzdCk7CisJCWlmICgoeGZybV9sb29rdXAoJmJ1ZmYtPmRzdCwgJmZsLCBOVUxMLCAwKSkgPCAwKQogCQkJcmV0dXJuOwotCQl9CiAJCWlwNl94bWl0KE5VTEwsIGJ1ZmYsICZmbCwgTlVMTCwgMCk7CiAJCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9PVVRTRUdTKTsKIAkJcmV0dXJuOwpAQCAtMTE5MCw4ICsxMTgyLDggQEAKIAlUQ1BfRUNOX2NyZWF0ZV9yZXF1ZXN0KHJlcSwgc2tiLT5oLnRoKTsKIAl0cmVxLT5wa3RvcHRzID0gTlVMTDsKIAlpZiAoaXB2Nl9vcHRfYWNjZXB0ZWQoc2ssIHNrYikgfHwKLQkgICAgbnAtPnJ4b3B0LmJpdHMucnhpbmZvIHx8Ci0JICAgIG5wLT5yeG9wdC5iaXRzLnJ4aGxpbSkgeworCSAgICBucC0+cnhvcHQuYml0cy5yeGluZm8gfHwgbnAtPnJ4b3B0LmJpdHMucnhvaW5mbyB8fAorCSAgICBucC0+cnhvcHQuYml0cy5yeGhsaW0gfHwgbnAtPnJ4b3B0LmJpdHMucnhvaGxpbSkgewogCQlhdG9taWNfaW5jKCZza2ItPnVzZXJzKTsKIAkJdHJlcS0+cGt0b3B0cyA9IHNrYjsKIAl9CkBAIC0xMjg4LDcgKzEyODAsNyBAQAogCWlmIChza19hY2NlcHRxX2lzX2Z1bGwoc2spKQogCQlnb3RvIG91dF9vdmVyZmxvdzsKIAotCWlmIChucC0+cnhvcHQuYml0cy5zcmNydCA9PSAyICYmCisJaWYgKG5wLT5yeG9wdC5iaXRzLm9zcmNydCA9PSAyICYmCiAJICAgIG9wdCA9PSBOVUxMICYmIHRyZXEtPnBrdG9wdHMpIHsKIAkJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpyeG9wdCA9IElQNkNCKHRyZXEtPnBrdG9wdHMpOwogCQlpZiAocnhvcHQtPnNyY3J0KQpAQCAtMTU0NCw5ICsxNTM2LDkgQEAKIAl0cCA9IHRjcF9zayhzayk7CiAJaWYgKFRDUF9TS0JfQ0Iob3B0X3NrYiktPmVuZF9zZXEgPT0gdHAtPnJjdl9ueHQgJiYKIAkgICAgISgoMSA8PCBzay0+c2tfc3RhdGUpICYgKFRDUEZfQ0xPU0UgfCBUQ1BGX0xJU1RFTikpKSB7Ci0JCWlmIChucC0+cnhvcHQuYml0cy5yeGluZm8pCisJCWlmIChucC0+cnhvcHQuYml0cy5yeGluZm8gfHwgbnAtPnJ4b3B0LmJpdHMucnhvaW5mbykKIAkJCW5wLT5tY2FzdF9vaWYgPSBpbmV0Nl9paWYob3B0X3NrYik7Ci0JCWlmIChucC0+cnhvcHQuYml0cy5yeGhsaW0pCisJCWlmIChucC0+cnhvcHQuYml0cy5yeGhsaW0gfHwgbnAtPnJ4b3B0LmJpdHMucnhvaGxpbSkKIAkJCW5wLT5tY2FzdF9ob3BzID0gb3B0X3NrYi0+bmguaXB2NmgtPmhvcF9saW1pdDsKIAkJaWYgKGlwdjZfb3B0X2FjY2VwdGVkKHNrLCBvcHRfc2tiKSkgewogCQkJc2tiX3NldF9vd25lcl9yKG9wdF9za2IsIHNrKTsKQEAgLTE3MzQsNyArMTcyNiw2IEBACiAKIAkJaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKSB7CiAJCQlzay0+c2tfZXJyX3NvZnQgPSAtZXJyOwotCQkJZHN0X3JlbGVhc2UoZHN0KTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIApAQCAtMTc4Nyw3ICsxNzc4LDYgQEAKIAogCQlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApKSA8IDApIHsKIAkJCXNrLT5za19yb3V0ZV9jYXBzID0gMDsKLQkJCWRzdF9yZWxlYXNlKGRzdCk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcC5jIGIvbmV0L2lwdjYvdWRwLmMKaW5kZXggMzkwZDc1MC4uNjliMTQ2OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwLmMKKysrIGIvbmV0L2lwdjYvdWRwLmMKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCX0KIAogCWlmICh1bGVuIDwgc2tiLT5sZW4pIHsKLQkJaWYgKF9fcHNrYl90cmltKHNrYiwgdWxlbikpCisJCWlmIChwc2tiX3RyaW1fcmNzdW0oc2tiLCB1bGVuKSkKIAkJCWdvdG8gZGlzY2FyZDsKIAkJc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7CiAJCWRhZGRyID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOwpAQCAtNjM3LDYgKzYzNyw3IEBACiAJaW50IGFkZHJfbGVuID0gbXNnLT5tc2dfbmFtZWxlbjsKIAlpbnQgdWxlbiA9IGxlbjsKIAlpbnQgaGxpbWl0ID0gLTE7CisJaW50IHRjbGFzcyA9IC0xOwogCWludCBjb3JrcmVxID0gdXAtPmNvcmtmbGFnIHx8IG1zZy0+bXNnX2ZsYWdzJk1TR19NT1JFOwogCWludCBlcnI7CiAKQEAgLTc1OCw3ICs3NTksNyBAQAogCQltZW1zZXQob3B0LCAwLCBzaXplb2Yoc3RydWN0IGlwdjZfdHhvcHRpb25zKSk7CiAJCW9wdC0+dG90X2xlbiA9IHNpemVvZigqb3B0KTsKIAotCQllcnIgPSBkYXRhZ3JhbV9zZW5kX2N0bChtc2csIGZsLCBvcHQsICZobGltaXQpOworCQllcnIgPSBkYXRhZ3JhbV9zZW5kX2N0bChtc2csIGZsLCBvcHQsICZobGltaXQsICZ0Y2xhc3MpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJZmw2X3NvY2tfcmVsZWFzZShmbG93bGFiZWwpOwogCQkJcmV0dXJuIGVycjsKQEAgLTc3Myw4ICs3NzQsNyBAQAogCX0KIAlpZiAob3B0ID09IE5VTEwpCiAJCW9wdCA9IG5wLT5vcHQ7Ci0JaWYgKGZsb3dsYWJlbCkKLQkJb3B0ID0gZmw2X21lcmdlX29wdGlvbnMoJm9wdF9zcGFjZSwgZmxvd2xhYmVsLCBvcHQpOworCW9wdCA9IGZsNl9tZXJnZV9vcHRpb25zKCZvcHRfc3BhY2UsIGZsb3dsYWJlbCwgb3B0KTsKIAogCWZsLT5wcm90byA9IElQUFJPVE9fVURQOwogCWlwdjZfYWRkcl9jb3B5KCZmbC0+Zmw2X2RzdCwgZGFkZHIpOwpAQCAtNzk5LDEwICs3OTksOCBAQAogCWlmIChmaW5hbF9wKQogCQlpcHY2X2FkZHJfY29weSgmZmwtPmZsNl9kc3QsIGZpbmFsX3ApOwogCi0JaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCBmbCwgc2ssIDApKSA8IDApIHsKLQkJZHN0X3JlbGVhc2UoZHN0KTsKKwlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsIGZsLCBzaywgMCkpIDwgMCkKIAkJZ290byBvdXQ7Ci0JfQogCiAJaWYgKGhsaW1pdCA8IDApIHsKIAkJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsLT5mbDZfZHN0KSkKQEAgLTgxNSw2ICs4MTMsMTIgQEAKIAkJCWhsaW1pdCA9IGlwdjZfZ2V0X2hvcGxpbWl0KGRzdC0+ZGV2KTsKIAl9CiAKKwlpZiAodGNsYXNzIDwgMCkgeworCQl0Y2xhc3MgPSBucC0+dGNsYXNzOworCQlpZiAodGNsYXNzIDwgMCkKKwkJCXRjbGFzcyA9IDA7CisJfQorCiAJaWYgKG1zZy0+bXNnX2ZsYWdzJk1TR19DT05GSVJNKQogCQlnb3RvIGRvX2NvbmZpcm07CiBiYWNrX2Zyb21fY29uZmlybToKQEAgLTgzNCw5ICs4MzgsMTAgQEAKIAogZG9fYXBwZW5kX2RhdGE6CiAJdXAtPmxlbiArPSB1bGVuOwotCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaXBfZ2VuZXJpY19nZXRmcmFnLCBtc2ctPm1zZ19pb3YsIHVsZW4sIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwKLQkJCSAgICAgIGhsaW1pdCwgb3B0LCBmbCwgKHN0cnVjdCBydDZfaW5mbyopZHN0LAotCQkJICAgICAgY29ya3JlcSA/IG1zZy0+bXNnX2ZsYWdzfE1TR19NT1JFIDogbXNnLT5tc2dfZmxhZ3MpOworCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaXBfZ2VuZXJpY19nZXRmcmFnLCBtc2ctPm1zZ19pb3YsIHVsZW4sCisJCXNpemVvZihzdHJ1Y3QgdWRwaGRyKSwgaGxpbWl0LCB0Y2xhc3MsIG9wdCwgZmwsCisJCShzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwKKwkJY29ya3JlcSA/IG1zZy0+bXNnX2ZsYWdzfE1TR19NT1JFIDogbXNnLT5tc2dfZmxhZ3MpOwogCWlmIChlcnIpCiAJCXVkcF92Nl9mbHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiAJZWxzZSBpZiAoIWNvcmtyZXEpCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9maWx0ZXIuYyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2ZpbHRlci5jCmluZGV4IDM0M2M1ZDQuLmNhN2QzNTggMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybGFuL2lybGFuX2ZpbHRlci5jCisrKyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2ZpbHRlci5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIAogI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2ZpbHRlci5oPgogCiAvKgogICogRnVuY3Rpb24gaXJsYW5fZmlsdGVyX3JlcXVlc3QgKHNlbGYsIHNrYikKZGlmZiAtLWdpdCBhL25ldC9pcmRhL3Fvcy5jIGIvbmV0L2lyZGEvcW9zLmMKaW5kZXggZGY3MzJkNS4uZGRmYjVjNSAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvcW9zLmMKKysrIGIvbmV0L2lyZGEvcW9zLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxuZXQvaXJkYS9wYXJhbWV0ZXJzLmg+CiAjaW5jbHVkZSA8bmV0L2lyZGEvcW9zLmg+CiAjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcF9mcmFtZS5oPgogCiAvKgogICogTWF4aW11bSB2YWx1ZXMgb2YgdGhlIGJhdWQgcmF0ZSB3ZSBuZWdvY2lhdGUgd2l0aCB0aGUgb3RoZXIgZW5kLgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmsuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmMKaW5kZXggZTA4OWYxNy4uNDlhMzkwMCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmsuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGluay5jCkBAIC0zNDQsMTQgKzM0NCwxNCBAQAogCX0gd2hpbGUobmZubCAmJiBuZm5sLT5za19yZWNlaXZlX3F1ZXVlLnFsZW4pOwogfQogCi12b2lkIF9fZXhpdCBuZm5ldGxpbmtfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IG5mbmV0bGlua19leGl0KHZvaWQpCiB7CiAJcHJpbnRrKCJSZW1vdmluZyBuZXRmaWx0ZXIgTkVUTElOSyBsYXllci5cbiIpOwogCXNvY2tfcmVsZWFzZShuZm5sLT5za19zb2NrZXQpOwogCXJldHVybjsKIH0KIAotaW50IF9faW5pdCBuZm5ldGxpbmtfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgbmZuZXRsaW5rX2luaXQodm9pZCkKIHsKIAlwcmludGsoIk5ldGZpbHRlciBtZXNzYWdlcyB2aWEgTkVUTElOSyB2JXMuXG4iLCBuZnZlcnNpb24pOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYwppbmRleCBlM2E1Mjg1Li5mODFmZThjIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKQEAgLTc2LDE3ICs3Niw2IEBACiAKIHN0YXRpYyBERUZJTkVfUldMT0NLKGluc3RhbmNlc19sb2NrKTsKIAotdV9pbnQ2NF90IGh0b25sbCh1X2ludDY0X3QgaW4pCi17Ci0JdV9pbnQ2NF90IG91dDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodV9pbnQ2NF90KTsgaSsrKQotCQkoKHVfaW50OF90ICopJm91dClbc2l6ZW9mKHVfaW50NjRfdCktMV0gPSAoKHVfaW50OF90ICopJmluKVtpXTsKLQotCXJldHVybiBvdXQ7Ci19Ci0KICNkZWZpbmUgSU5TVEFOQ0VfQlVDS0VUUwkxNgogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGluc3RhbmNlX3RhYmxlW0lOU1RBTkNFX0JVQ0tFVFNdOwogCkBAIC0zODIsNiArMzcxLDEyIEBACiAJCWJyZWFrOwogCQogCWNhc2UgTkZRTkxfQ09QWV9QQUNLRVQ6CisJCWlmIChlbnRyeS0+c2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcgJiYKKwkJICAgICgqZXJycCA9IHNrYl9jaGVja3N1bV9oZWxwKGVudHJ5LT5za2IsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+aW5mby0+b3V0ZGV2ID09IE5VTEwpKSkgeworCQkJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKKwkJCXJldHVybiBOVUxMOworCQl9CiAJCWlmIChxdWV1ZS0+Y29weV9yYW5nZSA9PSAwIAogCQkgICAgfHwgcXVldWUtPmNvcHlfcmFuZ2UgPiBlbnRyeS0+c2tiLT5sZW4pCiAJCQlkYXRhX2xlbiA9IGVudHJ5LT5za2ItPmxlbjsKQEAgLTQ5Nyw4ICs0OTIsOCBAQAogCWlmIChlbnRyeS0+c2tiLT50c3RhbXAub2ZmX3NlYykgewogCQlzdHJ1Y3QgbmZxbmxfbXNnX3BhY2tldF90aW1lc3RhbXAgdHM7CiAKLQkJdHMuc2VjID0gaHRvbmxsKHNrYl90dl9iYXNlLnR2X3NlYyArIGVudHJ5LT5za2ItPnRzdGFtcC5vZmZfc2VjKTsKLQkJdHMudXNlYyA9IGh0b25sbChza2JfdHZfYmFzZS50dl91c2VjICsgZW50cnktPnNrYi0+dHN0YW1wLm9mZl91c2VjKTsKKwkJdHMuc2VjID0gY3B1X3RvX2JlNjQoc2tiX3R2X2Jhc2UudHZfc2VjICsgZW50cnktPnNrYi0+dHN0YW1wLm9mZl9zZWMpOworCQl0cy51c2VjID0gY3B1X3RvX2JlNjQoc2tiX3R2X2Jhc2UudHZfdXNlYyArIGVudHJ5LT5za2ItPnRzdGFtcC5vZmZfdXNlYyk7CiAKIAkJTkZBX1BVVChza2IsIE5GUUFfVElNRVNUQU1QLCBzaXplb2YodHMpLCAmdHMpOwogCX0KQEAgLTY0Nyw3ICs2NDIsNyBAQAogCWlmICghc2tiX21ha2Vfd3JpdGFibGUoJmUtPnNrYiwgZGF0YV9sZW4pKQogCQlyZXR1cm4gLUVOT01FTTsKIAltZW1jcHkoZS0+c2tiLT5kYXRhLCBkYXRhLCBkYXRhX2xlbik7Ci0KKwllLT5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwppbmRleCA2MjQzNWZmLi5hNjRlMWQ1IDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCkBAIC0zOTgsMjQgKzM5OCwxMyBAQAogCWlmIChubF90YWJsZVtwcm90b2NvbF0ucmVnaXN0ZXJlZCAmJgogCSAgICB0cnlfbW9kdWxlX2dldChubF90YWJsZVtwcm90b2NvbF0ubW9kdWxlKSkKIAkJbW9kdWxlID0gbmxfdGFibGVbcHJvdG9jb2xdLm1vZHVsZTsKLQllbHNlCi0JCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CiAJZ3JvdXBzID0gbmxfdGFibGVbcHJvdG9jb2xdLmdyb3VwczsKIAluZXRsaW5rX3VubG9ja190YWJsZSgpOwogCi0JaWYgKGVyciB8fCAoZXJyID0gX19uZXRsaW5rX2NyZWF0ZShzb2NrLCBwcm90b2NvbCkgPCAwKSkKKwlpZiAoKGVyciA9IF9fbmV0bGlua19jcmVhdGUoc29jaywgcHJvdG9jb2wpIDwgMCkpCiAJCWdvdG8gb3V0X21vZHVsZTsKIAogCW5sayA9IG5sa19zayhzb2NrLT5zayk7Ci0KLQlubGstPmdyb3VwcyA9IGttYWxsb2MoTkxHUlBTWihncm91cHMpLCBHRlBfS0VSTkVMKTsKLQlpZiAobmxrLT5ncm91cHMgPT0gTlVMTCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9tb2R1bGU7Ci0JfQotCW1lbXNldChubGstPmdyb3VwcywgMCwgTkxHUlBTWihncm91cHMpKTsKLQlubGstPm5ncm91cHMgPSBncm91cHM7Ci0KIAlubGstPm1vZHVsZSA9IG1vZHVsZTsKIG91dDoKIAlyZXR1cm4gZXJyOwpAQCAtNTM0LDYgKzUyMywyOSBAQAogCW5say0+c3Vic2NyaXB0aW9ucyA9IHN1YnNjcmlwdGlvbnM7CiB9CiAKK3N0YXRpYyBpbnQgbmV0bGlua19hbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7CisJdW5zaWduZWQgaW50IGdyb3VwczsKKwlpbnQgZXJyID0gMDsKKworCW5ldGxpbmtfbG9ja190YWJsZSgpOworCWdyb3VwcyA9IG5sX3RhYmxlW3NrLT5za19wcm90b2NvbF0uZ3JvdXBzOworCWlmICghbmxfdGFibGVbc2stPnNrX3Byb3RvY29sXS5yZWdpc3RlcmVkKQorCQllcnIgPSAtRU5PRU5UOworCW5ldGxpbmtfdW5sb2NrX3RhYmxlKCk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbmxrLT5ncm91cHMgPSBrbWFsbG9jKE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5say0+Z3JvdXBzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChubGstPmdyb3VwcywgMCwgTkxHUlBTWihncm91cHMpKTsKKwlubGstPm5ncm91cHMgPSBncm91cHM7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbmV0bGlua19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJfbGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwpAQCAtNTQ1LDggKzU1NywxNSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIE9ubHkgc3VwZXJ1c2VyIGlzIGFsbG93ZWQgdG8gbGlzdGVuIG11bHRpY2FzdHMgKi8KLQlpZiAobmxhZGRyLT5ubF9ncm91cHMgJiYgIW5ldGxpbmtfY2FwYWJsZShzb2NrLCBOTF9OT05ST09UX1JFQ1YpKQotCQlyZXR1cm4gLUVQRVJNOworCWlmIChubGFkZHItPm5sX2dyb3VwcykgeworCQlpZiAoIW5ldGxpbmtfY2FwYWJsZShzb2NrLCBOTF9OT05ST09UX1JFQ1YpKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKG5say0+Z3JvdXBzID09IE5VTEwpIHsKKwkJCWVyciA9IG5ldGxpbmtfYWxsb2NfZ3JvdXBzKHNrKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KIAogCWlmIChubGstPnBpZCkgewogCQlpZiAobmxhZGRyLT5ubF9waWQgIT0gbmxrLT5waWQpCkBAIC01NTksNyArNTc4LDcgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKCFubGFkZHItPm5sX2dyb3VwcyAmJiAhKHUzMilubGstPmdyb3Vwc1swXSkKKwlpZiAoIW5sYWRkci0+bmxfZ3JvdXBzICYmIChubGstPmdyb3VwcyA9PSBOVUxMIHx8ICEodTMyKW5say0+Z3JvdXBzWzBdKSkKIAkJcmV0dXJuIDA7CiAKIAluZXRsaW5rX3RhYmxlX2dyYWIoKTsKQEAgLTYyMCw3ICs2MzksNyBAQAogCQlubGFkZHItPm5sX2dyb3VwcyA9IG5ldGxpbmtfZ3JvdXBfbWFzayhubGstPmRzdF9ncm91cCk7CiAJfSBlbHNlIHsKIAkJbmxhZGRyLT5ubF9waWQgPSBubGstPnBpZDsKLQkJbmxhZGRyLT5ubF9ncm91cHMgPSBubGstPmdyb3Vwc1swXTsKKwkJbmxhZGRyLT5ubF9ncm91cHMgPSBubGstPmdyb3VwcyA/IG5say0+Z3JvdXBzWzBdIDogMDsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC05NzYsNiArOTk1LDExIEBACiAKIAkJaWYgKCFuZXRsaW5rX2NhcGFibGUoc29jaywgTkxfTk9OUk9PVF9SRUNWKSkKIAkJCXJldHVybiAtRVBFUk07CisJCWlmIChubGstPmdyb3VwcyA9PSBOVUxMKSB7CisJCQllcnIgPSBuZXRsaW5rX2FsbG9jX2dyb3Vwcyhzayk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KIAkJaWYgKCF2YWwgfHwgdmFsIC0gMSA+PSBubGstPm5ncm91cHMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJbmV0bGlua190YWJsZV9ncmFiKCk7CkBAIC0xNDgzLDggKzE1MDcsNyBAQAogCQkJICAgcywKIAkJCSAgIHMtPnNrX3Byb3RvY29sLAogCQkJICAgbmxrLT5waWQsCi0JCQkgICBubGstPmZsYWdzICYgTkVUTElOS19LRVJORUxfU09DS0VUID8KLQkJCQkwIDogKHVuc2lnbmVkIGludClubGstPmdyb3Vwc1swXSwKKwkJCSAgIG5say0+Z3JvdXBzID8gKHUzMilubGstPmdyb3Vwc1swXSA6IDAsCiAJCQkgICBhdG9taWNfcmVhZCgmcy0+c2tfcm1lbV9hbGxvYyksCiAJCQkgICBhdG9taWNfcmVhZCgmcy0+c2tfd21lbV9hbGxvYyksCiAJCQkgICBubGstPmNiLApkaWZmIC0tZ2l0IGEvbmV0L25ldHJvbS9hZl9uZXRyb20uYyBiL25ldC9uZXRyb20vYWZfbmV0cm9tLmMKaW5kZXggNGI1M2RlOS4uZjQ1NzhjNyAxMDA2NDQKLS0tIGEvbmV0L25ldHJvbS9hZl9uZXRyb20uYworKysgYi9uZXQvbmV0cm9tL2FmX25ldHJvbS5jCkBAIC0xMjYxLDYgKzEyNjEsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IG5yX3NvY2sgKm5yOwogCWNvbnN0IGNoYXIgKmRldm5hbWU7CisJY2hhciBidWZbMTFdOwogCiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQogCQlzZXFfcHV0cyhzZXEsCkBAIC0xMjc2LDExICsxMjc3LDExIEBACiAJCWVsc2UKIAkJCWRldm5hbWUgPSBkZXYtPm5hbWU7CiAKLQkJc2VxX3ByaW50ZihzZXEsICIlLTlzICIsIGF4MmFzYygmbnItPnVzZXJfYWRkcikpOwotCQlzZXFfcHJpbnRmKHNlcSwgIiUtOXMgIiwgYXgyYXNjKCZuci0+ZGVzdF9hZGRyKSk7CisJCXNlcV9wcmludGYoc2VxLCAiJS05cyAiLCBheDJhc2MoYnVmLCAmbnItPnVzZXJfYWRkcikpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtOXMgIiwgYXgyYXNjKGJ1ZiwgJm5yLT5kZXN0X2FkZHIpKTsKIAkJc2VxX3ByaW50ZihzZXEsIAogIiUtOXMgJS0zcyAgJTAyWC8lMDJYICUwMlgvJTAyWCAlMmQgJTNkICUzZCAlM2QgJTNsdS8lMDNsdSAlMmx1LyUwMmx1ICUzbHUvJTAzbHUgJTNsdS8lMDNsdSAlMmQvJTAyZCAlM2QgJTVkICU1ZCAlbGRcbiIsCi0JCQlheDJhc2MoJm5yLT5zb3VyY2VfYWRkciksCisJCQlheDJhc2MoYnVmLCAmbnItPnNvdXJjZV9hZGRyKSwKIAkJCWRldm5hbWUsCiAJCQluci0+bXlfaW5kZXgsCiAJCQluci0+bXlfaWQsCmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX2xvb3BiYWNrLmMgYi9uZXQvbmV0cm9tL25yX2xvb3BiYWNrLmMKaW5kZXggMTY1YjJhYi4uZTg1NmFlMSAxMDA2NDQKLS0tIGEvbmV0L25ldHJvbS9ucl9sb29wYmFjay5jCisrKyBiL25ldC9uZXRyb20vbnJfbG9vcGJhY2suYwpAQCAtMTcsNyArMTcsNyBAQAogc3RhdGljIHZvaWQgbnJfbG9vcGJhY2tfdGltZXIodW5zaWduZWQgbG9uZyk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGxvb3BiYWNrX3F1ZXVlOwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGxvb3BiYWNrX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIobnJfbG9vcGJhY2tfdGltZXIsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihsb29wYmFja190aW1lciwgbnJfbG9vcGJhY2tfdGltZXIsIDAsIDApOwogCiB2b2lkIF9faW5pdCBucl9sb29wYmFja19pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX3JvdXRlLmMgYi9uZXQvbmV0cm9tL25yX3JvdXRlLmMKaW5kZXggN2E4NmIzNi4uYjNiOTA5NyAxMDA2NDQKLS0tIGEvbmV0L25ldHJvbS9ucl9yb3V0ZS5jCisrKyBiL25ldC9uZXRyb20vbnJfcm91dGUuYwpAQCAtODgxLDYgKzg4MSw3IEBACiAKIHN0YXRpYyBpbnQgbnJfbm9kZV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogeworCWNoYXIgYnVmWzExXTsKIAlpbnQgaTsKIAogCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKQEAgLTg5MCw3ICs4OTEsNyBAQAogCQlzdHJ1Y3QgbnJfbm9kZSAqbnJfbm9kZSA9IHY7CiAJCW5yX25vZGVfbG9jayhucl9ub2RlKTsKIAkJc2VxX3ByaW50ZihzZXEsICIlLTlzICUtN3MgICVkICVkIiwKLQkJCWF4MmFzYygmbnJfbm9kZS0+Y2FsbHNpZ24pLAorCQkJYXgyYXNjKGJ1ZiwgJm5yX25vZGUtPmNhbGxzaWduKSwKIAkJCShucl9ub2RlLT5tbmVtb25pY1swXSA9PSAnXDAnKSA/ICIqIiA6IG5yX25vZGUtPm1uZW1vbmljLAogCQkJbnJfbm9kZS0+d2hpY2ggKyAxLAogCQkJbnJfbm9kZS0+Y291bnQpOwpAQCAtOTY0LDYgKzk2NSw3IEBACiAKIHN0YXRpYyBpbnQgbnJfbmVpZ2hfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKKwljaGFyIGJ1ZlsxMV07CiAJaW50IGk7CiAKIAlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCkBAIC05NzMsNyArOTc1LDcgQEAKIAogCQlzZXFfcHJpbnRmKHNlcSwgIiUwNWQgJS05cyAlLTRzICAlM2QgICAgJWQgICAlM2QgICAgJTNkIiwKIAkJCW5yX25laWdoLT5udW1iZXIsCi0JCQlheDJhc2MoJm5yX25laWdoLT5jYWxsc2lnbiksCisJCQlheDJhc2MoYnVmLCAmbnJfbmVpZ2gtPmNhbGxzaWduKSwKIAkJCW5yX25laWdoLT5kZXYgPyBucl9uZWlnaC0+ZGV2LT5uYW1lIDogIj8/PyIsCiAJCQlucl9uZWlnaC0+cXVhbGl0eSwKIAkJCW5yX25laWdoLT5sb2NrZWQsCkBAIC05ODMsNyArOTg1LDcgQEAKIAkJaWYgKG5yX25laWdoLT5kaWdpcGVhdCAhPSBOVUxMKSB7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbnJfbmVpZ2gtPmRpZ2lwZWF0LT5uZGlnaTsgaSsrKQogCQkJCXNlcV9wcmludGYoc2VxLCAiICVzIiwgCi0JCQkJCSAgIGF4MmFzYygmbnJfbmVpZ2gtPmRpZ2lwZWF0LT5jYWxsc1tpXSkpOworCQkJCQkgICBheDJhc2MoYnVmLCAmbnJfbmVpZ2gtPmRpZ2lwZWF0LT5jYWxsc1tpXSkpOwogCQl9CiAKIAkJc2VxX3B1dHMoc2VxLCAiXG4iKTsKZGlmZiAtLWdpdCBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCmluZGV4IGJhOTk3MDkuLjg2OTBmMTcgMTAwNjQ0Ci0tLSBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKKysrIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwpAQCAtMTUzNSw4ICsxNTM1LDcgQEAKIHN0YXRpYyB2b2lkIHBhY2tldF9tbV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gdm1hLT52bV9maWxlOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQlzdHJ1Y3Qgc29ja2V0ICogc29jayA9IFNPQ0tFVF9JKGlub2RlKTsKKwlzdHJ1Y3Qgc29ja2V0ICogc29jayA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAkKIAlpZiAoc2spCkBAIC0xNTQ2LDggKzE1NDUsNyBAQAogc3RhdGljIHZvaWQgcGFja2V0X21tX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gdm1hLT52bV9maWxlOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQlzdHJ1Y3Qgc29ja2V0ICogc29jayA9IFNPQ0tFVF9JKGlub2RlKTsKKwlzdHJ1Y3Qgc29ja2V0ICogc29jayA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAkKIAlpZiAoc2spCmRpZmYgLS1naXQgYS9uZXQvcm9zZS9hZl9yb3NlLmMgYi9uZXQvcm9zZS9hZl9yb3NlLmMKaW5kZXggYzZlNTlmOC4uMzA3Nzg3OCAxMDA2NDQKLS0tIGEvbmV0L3Jvc2UvYWZfcm9zZS5jCisrKyBiL25ldC9yb3NlL2FmX3Jvc2UuYwpAQCAtMTM2Myw2ICsxMzYzLDggQEAKIAogc3RhdGljIGludCByb3NlX2luZm9fc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKKwljaGFyIGJ1ZlsxMV07CisKIAlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCiAJCXNlcV9wdXRzKHNlcSwgCiAJCQkgImRlc3RfYWRkciAgZGVzdF9jYWxsIHNyY19hZGRyICAgc3JjX2NhbGwgIGRldiAgIGxjaSBuZWlnaCBzdCB2cyB2ciB2YSAgIHQgIHQxICB0MiAgdDMgIGhiICAgIGlkbGUgU25kLVEgUmN2LVEgaW5vZGVcbiIpOwpAQCAtMTM4MCwxMiArMTM4MiwxMiBAQAogCQkKIAkJc2VxX3ByaW50ZihzZXEsICIlLTEwcyAlLTlzICIsCiAJCQlyb3NlMmFzYygmcm9zZS0+ZGVzdF9hZGRyKSwKLQkJCWF4MmFzYygmcm9zZS0+ZGVzdF9jYWxsKSk7CisJCQlheDJhc2MoYnVmLCAmcm9zZS0+ZGVzdF9jYWxsKSk7CiAKIAkJaWYgKGF4MjVjbXAoJnJvc2UtPnNvdXJjZV9jYWxsLCAmbnVsbF9heDI1X2FkZHJlc3MpID09IDApCiAJCQljYWxsc2lnbiA9ICI/Pz8/Pz8tPyI7CiAJCWVsc2UKLQkJCWNhbGxzaWduID0gYXgyYXNjKCZyb3NlLT5zb3VyY2VfY2FsbCk7CisJCQljYWxsc2lnbiA9IGF4MmFzYyhidWYsICZyb3NlLT5zb3VyY2VfY2FsbCk7CiAKIAkJc2VxX3ByaW50ZihzZXEsCiAJCQkgICAiJS0xMHMgJS05cyAlLTVzICUzLjNYICUwNWQgICVkICAlZCAgJWQgICVkICUzbHUgJTNsdSAlM2x1ICUzbHUgJTNsdSAlM2x1LyUwM2x1ICU1ZCAlNWQgJWxkXG4iLApkaWZmIC0tZ2l0IGEvbmV0L3Jvc2Uvcm9zZV9yb3V0ZS5jIGIvbmV0L3Jvc2Uvcm9zZV9yb3V0ZS5jCmluZGV4IDQ1MTBjZDcuLmU1NTZkOTIgMTAwNjQ0Ci0tLSBhL25ldC9yb3NlL3Jvc2Vfcm91dGUuYworKysgYi9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKQEAgLTg1MSw2ICs4NTEsNyBAQAogCXVuc2lnbmVkIGNoYXIgY2F1c2UsIGRpYWdub3N0aWM7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlpbnQgbGVuLCByZXMgPSAwOworCWNoYXIgYnVmWzExXTsKIAogI2lmIDAKIAlpZiAoY2FsbF9pbl9maXJld2FsbChQRl9ST1NFLCBza2ItPmRldiwgc2tiLT5kYXRhLCBOVUxMLCAmc2tiKSAhPSBGV19BQ0NFUFQpCkBAIC04NzYsNyArODc3LDcgQEAKIAogCWlmIChyb3NlX25laWdoID09IE5VTEwpIHsKIAkJcHJpbnRrKCJyb3NlX3JvdXRlIDogdW5rbm93biBuZWlnaGJvdXIgb3IgZGV2aWNlICVzXG4iLAotCQkgICAgICAgYXgyYXNjKCZheDI1LT5kZXN0X2FkZHIpKTsKKwkJICAgICAgIGF4MmFzYyhidWYsICZheDI1LT5kZXN0X2FkZHIpKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xMTc4LDYgKzExNzksNyBAQAogCiBzdGF0aWMgaW50IHJvc2VfbmVpZ2hfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKKwljaGFyIGJ1ZlsxMV07CiAJaW50IGk7CiAKIAlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCkBAIC0xMTg5LDcgKzExOTEsNyBAQAogCQkvKiBpZiAoIXJvc2VfbmVpZ2gtPmxvb3BiYWNrKSB7ICovCiAJCXNlcV9wcmludGYoc2VxLCAiJTA1ZCAlLTlzICUtNHMgICAlM2QgJTNkICAlM3MgICAgICUzcyAlM2x1ICUzbHUiLAogCQkJICAgcm9zZV9uZWlnaC0+bnVtYmVyLAotCQkJICAgKHJvc2VfbmVpZ2gtPmxvb3BiYWNrKSA/ICJSU0xPT1AtMCIgOiBheDJhc2MoJnJvc2VfbmVpZ2gtPmNhbGxzaWduKSwKKwkJCSAgIChyb3NlX25laWdoLT5sb29wYmFjaykgPyAiUlNMT09QLTAiIDogYXgyYXNjKGJ1ZiwgJnJvc2VfbmVpZ2gtPmNhbGxzaWduKSwKIAkJCSAgIHJvc2VfbmVpZ2gtPmRldiA/IHJvc2VfbmVpZ2gtPmRldi0+bmFtZSA6ICI/Pz8iLAogCQkJICAgcm9zZV9uZWlnaC0+Y291bnQsCiAJCQkgICByb3NlX25laWdoLT51c2UsCkBAIC0xMjAwLDcgKzEyMDIsNyBAQAogCiAJCWlmIChyb3NlX25laWdoLT5kaWdpcGVhdCAhPSBOVUxMKSB7CiAJCQlmb3IgKGkgPSAwOyBpIDwgcm9zZV9uZWlnaC0+ZGlnaXBlYXQtPm5kaWdpOyBpKyspCi0JCQkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBheDJhc2MoJnJvc2VfbmVpZ2gtPmRpZ2lwZWF0LT5jYWxsc1tpXSkpOworCQkJCXNlcV9wcmludGYoc2VxLCAiICVzIiwgYXgyYXNjKGJ1ZiwgJnJvc2VfbmVpZ2gtPmRpZ2lwZWF0LT5jYWxsc1tpXSkpOwogCQl9CiAKIAkJc2VxX3B1dHMoc2VxLCAiXG4iKTsKQEAgLTEyNjAsNiArMTI2Miw4IEBACiAKIHN0YXRpYyBpbnQgcm9zZV9yb3V0ZV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogeworCWNoYXIgYnVmWzExXTsKKwogCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKIAkJc2VxX3B1dHMoc2VxLCAKIAkJCSAibGNpICBhZGRyZXNzICAgICBjYWxsc2lnbiAgIG5laWdoICA8LT4gbGNpICBhZGRyZXNzICAgICBjYWxsc2lnbiAgIG5laWdoXG4iKTsKQEAgLTEyNzEsNyArMTI3NSw3IEBACiAJCQkJICAgIiUzLjNYICAlLTEwcyAgJS05cyAgJTA1ZCAgICAgICIsCiAJCQkJICAgcm9zZV9yb3V0ZS0+bGNpMSwKIAkJCQkgICByb3NlMmFzYygmcm9zZV9yb3V0ZS0+c3JjX2FkZHIpLAotCQkJCSAgIGF4MmFzYygmcm9zZV9yb3V0ZS0+c3JjX2NhbGwpLAorCQkJCSAgIGF4MmFzYyhidWYsICZyb3NlX3JvdXRlLT5zcmNfY2FsbCksCiAJCQkJICAgcm9zZV9yb3V0ZS0+bmVpZ2gxLT5udW1iZXIpOwogCQllbHNlIAogCQkJc2VxX3B1dHMoc2VxLCAKQEAgLTEyODIsNyArMTI4Niw3IEBACiAJCQkJICAgIiUzLjNYICAlLTEwcyAgJS05cyAgJTA1ZFxuIiwKIAkJCQlyb3NlX3JvdXRlLT5sY2kyLAogCQkJCXJvc2UyYXNjKCZyb3NlX3JvdXRlLT5kZXN0X2FkZHIpLAotCQkJCWF4MmFzYygmcm9zZV9yb3V0ZS0+ZGVzdF9jYWxsKSwKKwkJCQlheDJhc2MoYnVmLCAmcm9zZV9yb3V0ZS0+ZGVzdF9jYWxsKSwKIAkJCQlyb3NlX3JvdXRlLT5uZWlnaDItPm51bWJlcik7CiAJCSBlbHNlIAogCQkJIHNlcV9wdXRzKHNlcSwKZGlmZiAtLWdpdCBhL25ldC9yb3NlL3Jvc2Vfc3Vici5jIGIvbmV0L3Jvc2Uvcm9zZV9zdWJyLmMKaW5kZXggYTI5YTNhOS4uMzZhNzc5NCAxMDA2NDQKLS0tIGEvbmV0L3Jvc2Uvcm9zZV9zdWJyLmMKKysrIGIvbmV0L3Jvc2Uvcm9zZV9zdWJyLmMKQEAgLTMzNywxMyArMzM3LDEzIEBACiAJCQkJbWVtY3B5KCZmYWNpbGl0aWVzLT5zb3VyY2VfYWRkciwgcCArIDcsIFJPU0VfQUREUl9MRU4pOwogCQkJCW1lbWNweShjYWxsc2lnbiwgcCArIDEyLCAgIGwgLSAxMCk7CiAJCQkJY2FsbHNpZ25bbCAtIDEwXSA9ICdcMCc7Ci0JCQkJZmFjaWxpdGllcy0+c291cmNlX2NhbGwgPSAqYXNjMmF4KGNhbGxzaWduKTsKKwkJCQlhc2MyYXgoJmZhY2lsaXRpZXMtPnNvdXJjZV9jYWxsLCBjYWxsc2lnbik7CiAJCQl9CiAJCQlpZiAoKnAgPT0gRkFDX0NDSVRUX1NSQ19OU0FQKSB7CiAJCQkJbWVtY3B5KCZmYWNpbGl0aWVzLT5kZXN0X2FkZHIsIHAgKyA3LCBST1NFX0FERFJfTEVOKTsKIAkJCQltZW1jcHkoY2FsbHNpZ24sIHAgKyAxMiwgbCAtIDEwKTsKIAkJCQljYWxsc2lnbltsIC0gMTBdID0gJ1wwJzsKLQkJCQlmYWNpbGl0aWVzLT5kZXN0X2NhbGwgPSAqYXNjMmF4KGNhbGxzaWduKTsKKwkJCQlhc2MyYXgoJmZhY2lsaXRpZXMtPmRlc3RfY2FsbCwgY2FsbHNpZ24pOwogCQkJfQogCQkJcCAgICs9IGwgKyAyOwogCQkJbiAgICs9IGwgKyAyOwpAQCAtNDAwLDYgKzQwMCw3IEBACiB7CiAJdW5zaWduZWQgY2hhciAqcCA9IGJ1ZmZlciArIDE7CiAJY2hhciAqY2FsbHNpZ247CisJY2hhciBidWZbMTFdOwogCWludCBsZW4sIG5iOwogCiAJLyogTmF0aW9uYWwgRmFjaWxpdGllcyAqLwpAQCAtNDU2LDcgKzQ1Nyw3IEBACiAKIAkqcCsrID0gRkFDX0NDSVRUX0RFU1RfTlNBUDsKIAotCWNhbGxzaWduID0gYXgyYXNjKCZyb3NlLT5kZXN0X2NhbGwpOworCWNhbGxzaWduID0gYXgyYXNjKGJ1ZiwgJnJvc2UtPmRlc3RfY2FsbCk7CiAKIAkqcCsrID0gc3RybGVuKGNhbGxzaWduKSArIDEwOwogCSpwKysgPSAoc3RybGVuKGNhbGxzaWduKSArIDkpICogMjsJCS8qID8/PyAqLwpAQCAtNDcxLDcgKzQ3Miw3IEBACiAKIAkqcCsrID0gRkFDX0NDSVRUX1NSQ19OU0FQOwogCi0JY2FsbHNpZ24gPSBheDJhc2MoJnJvc2UtPnNvdXJjZV9jYWxsKTsKKwljYWxsc2lnbiA9IGF4MmFzYyhidWYsICZyb3NlLT5zb3VyY2VfY2FsbCk7CiAKIAkqcCsrID0gc3RybGVuKGNhbGxzaWduKSArIDEwOwogCSpwKysgPSAoc3RybGVuKGNhbGxzaWduKSArIDkpICogMjsJCS8qID8/PyAqLwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9hcGkuYyBiL25ldC9zY2hlZC9zY2hfYXBpLmMKaW5kZXggNzM3NjgxYy4uMzE1NzBiOSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9hcGkuYworKysgYi9uZXQvc2NoZWQvc2NoX2FwaS5jCkBAIC0xMTk0LDcgKzExOTQsNyBAQAogICogd2l0aCAzMi1iaXQgZ2V0X2N5Y2xlcygpLiBTYWZlIHVwIHRvIDRHSHogQ1BVLgogICovCiBzdGF0aWMgdm9pZCBwc2NoZWRfdGljayh1bnNpZ25lZCBsb25nKTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBwc2NoZWRfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihwc2NoZWRfdGljaywgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHBzY2hlZF90aW1lciwgcHNjaGVkX3RpY2ssIDAsIDApOwogCiBzdGF0aWMgdm9pZCBwc2NoZWRfdGljayh1bnNpZ25lZCBsb25nIGR1bW15KQogewpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvZW5kcG9pbnRvbGEuYyBiL25ldC9zY3RwL2VuZHBvaW50b2xhLmMKaW5kZXggZTQ3YWMwZC4uZTIyY2NkNiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvZW5kcG9pbnRvbGEuYworKysgYi9uZXQvc2N0cC9lbmRwb2ludG9sYS5jCkBAIC0xOTMsOCArMTkzLDcgQEAKIAlzY3RwX3VuaGFzaF9lbmRwb2ludChlcCk7CiAKIAkvKiBGcmVlIHVwIHRoZSBITUFDIHRyYW5zZm9ybS4gKi8KLQlpZiAoc2N0cF9zayhlcC0+YmFzZS5zayktPmhtYWMpCi0JCXNjdHBfY3J5cHRvX2ZyZWVfdGZtKHNjdHBfc2soZXAtPmJhc2Uuc2spLT5obWFjKTsKKwlzY3RwX2NyeXB0b19mcmVlX3RmbShzY3RwX3NrKGVwLT5iYXNlLnNrKS0+aG1hYyk7CiAKIAkvKiBDbGVhbnVwLiAqLwogCXNjdHBfaW5xX2ZyZWUoJmVwLT5iYXNlLmlucXVldWUpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc29ja2V0LmMgYi9uZXQvc2N0cC9zb2NrZXQuYwppbmRleCA0NDU0YWZlLi45MWVjOGM5IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zb2NrZXQuYworKysgYi9uZXQvc2N0cC9zb2NrZXQuYwpAQCAtNDE5NCw4ICs0MTk0LDcgQEAKIAlzY3RwX3JlbGVhc2Vfc29jayhzayk7CiAJcmV0dXJuIGVycjsKIGNsZWFudXA6Ci0JaWYgKHRmbSkKLQkJc2N0cF9jcnlwdG9fZnJlZV90Zm0odGZtKTsKKwlzY3RwX2NyeXB0b19mcmVlX3RmbSh0Zm0pOwogCWdvdG8gb3V0OwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zeXNjdGwuYyBiL25ldC9zY3RwL3N5c2N0bC5jCmluZGV4IGRjNDg5MzQuLjc1YjI4ZGQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3N5c2N0bC5jCisrKyBiL25ldC9zY3RwL3N5c2N0bC5jCkBAIC00Miw2ICs0Miw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG5ldC9zY3RwL3N0cnVjdHMuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zY3RwLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAKIHN0YXRpYyBjdGxfaGFuZGxlciBzY3RwX3N5c2N0bF9qaWZmaWVzX21zOwpkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCmluZGV4IDk0ZmU2MzguLmM2OTllOTMgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYworKysgYi9uZXQvc29ja2V0LmMKQEAgLTY2Nyw3ICs2NjcsNyBAQAogCX0KIAlpb2NiLT5wcml2YXRlID0geDsKIAl4LT5raW9jYiA9IGlvY2I7Ci0Jc29jayA9IFNPQ0tFVF9JKGlvY2ItPmtpX2ZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsgCisJc29jayA9IGlvY2ItPmtpX2ZpbHAtPnByaXZhdGVfZGF0YTsgCiAKIAl4LT5hc3luY19tc2cubXNnX25hbWUgPSBOVUxMOwogCXgtPmFzeW5jX21zZy5tc2dfbmFtZWxlbiA9IDA7CkBAIC03MDksNyArNzA5LDcgQEAKIAl9CiAJaW9jYi0+cHJpdmF0ZSA9IHg7CiAJeC0+a2lvY2IgPSBpb2NiOwotCXNvY2sgPSBTT0NLRVRfSShpb2NiLT5raV9maWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7IAorCXNvY2sgPSBpb2NiLT5raV9maWxwLT5wcml2YXRlX2RhdGE7IAogCiAJeC0+YXN5bmNfbXNnLm1zZ19uYW1lID0gTlVMTDsKIAl4LT5hc3luY19tc2cubXNnX25hbWVsZW4gPSAwOwpAQCAtNzMyLDcgKzczMiw3IEBACiAJc3RydWN0IHNvY2tldCAqc29jazsKIAlpbnQgZmxhZ3M7CiAKLQlzb2NrID0gU09DS0VUX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXNvY2sgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlmbGFncyA9ICEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spID8gMCA6IE1TR19ET05UV0FJVDsKIAlpZiAobW9yZSkKQEAgLTc0MSwxNCArNzQxLDE0IEBACiAJcmV0dXJuIHNvY2stPm9wcy0+c2VuZHBhZ2Uoc29jaywgcGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgc29ja19yZWFkdl93cml0ZXYoaW50IHR5cGUsIHN0cnVjdCBpbm9kZSAqIGlub2RlLAorc3RhdGljIGludCBzb2NrX3JlYWR2X3dyaXRldihpbnQgdHlwZSwKIAkJCSAgICAgc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiBpb3YsCiAJCQkgICAgIGxvbmcgY291bnQsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBtc2doZHIgbXNnOwogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CiAKLQlzb2NrID0gU09DS0VUX0koaW5vZGUpOworCXNvY2sgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAltc2cubXNnX25hbWUgPSBOVUxMOwogCW1zZy5tc2dfbmFtZWxlbiA9IDA7CkBAIC03NzUsNyArNzc1LDcgQEAKIAlpbnQgaTsKICAgICAgICAgZm9yIChpID0gMCA7IGkgPCBjb3VudCA7IGkrKykKICAgICAgICAgICAgICAgICB0b3RfbGVuICs9IHZlY3RvcltpXS5pb3ZfbGVuOwotCXJldHVybiBzb2NrX3JlYWR2X3dyaXRldihWRVJJRllfV1JJVEUsIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCXJldHVybiBzb2NrX3JlYWR2X3dyaXRldihWRVJJRllfV1JJVEUsCiAJCQkJIGZpbGUsIHZlY3RvciwgY291bnQsIHRvdF9sZW4pOwogfQogCQpAQCAtNzg2LDcgKzc4Niw3IEBACiAJaW50IGk7CiAgICAgICAgIGZvciAoaSA9IDAgOyBpIDwgY291bnQgOyBpKyspCiAgICAgICAgICAgICAgICAgdG90X2xlbiArPSB2ZWN0b3JbaV0uaW92X2xlbjsKLQlyZXR1cm4gc29ja19yZWFkdl93cml0ZXYoVkVSSUZZX1JFQUQsIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCXJldHVybiBzb2NrX3JlYWR2X3dyaXRldihWRVJJRllfUkVBRCwKIAkJCQkgZmlsZSwgdmVjdG9yLCBjb3VudCwgdG90X2xlbik7CiB9CiAKQEAgLTg0MCw3ICs4NDAsNyBAQAogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBwaWQsIGVycjsKIAotCXNvY2sgPSBTT0NLRVRfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc29jayA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpZiAoY21kID49IFNJT0NERVZQUklWQVRFICYmIGNtZCA8PSAoU0lPQ0RFVlBSSVZBVEUgKyAxNSkpIHsKIAkJZXJyID0gZGV2X2lvY3RsKGNtZCwgYXJncCk7CiAJfSBlbHNlCkBAIC05MzksMTMgKzkzOSwxMyBAQAogCS8qCiAJICoJV2UgY2FuJ3QgcmV0dXJuIGVycm9ycyB0byBwb2xsLCBzbyBpdCdzIGVpdGhlciB5ZXMgb3Igbm8uIAogCSAqLwotCXNvY2sgPSBTT0NLRVRfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc29jayA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlyZXR1cm4gc29jay0+b3BzLT5wb2xsKGZpbGUsIHNvY2ssIHdhaXQpOwogfQogCiBzdGF0aWMgaW50IHNvY2tfbW1hcChzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKIHsKLQlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gU09DS0VUX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlyZXR1cm4gc29jay0+b3BzLT5tbWFwKGZpbGUsIHNvY2ssIHZtYSk7CiB9CkBAIC05OTUsNyArOTk1LDcgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXNvY2sgPSBTT0NLRVRfSShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc29jayA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAogCWlmICgoc2s9c29jay0+c2spID09IE5VTEwpIHsKIAkJa2ZyZWUoZm5hKTsKQEAgLTE3NDUsMTAgKzE3NDUsMTEgQEAKIAkJZ290byBvdXRfZnJlZWlvdjsKIAljdGxfbGVuID0gbXNnX3N5cy5tc2dfY29udHJvbGxlbjsgCiAJaWYgKChNU0dfQ01TR19DT01QQVQgJiBmbGFncykgJiYgY3RsX2xlbikgewotCQllcnIgPSBjbXNnaGRyX2Zyb21fdXNlcl9jb21wYXRfdG9fa2VybigmbXNnX3N5cywgY3RsLCBzaXplb2YoY3RsKSk7CisJCWVyciA9IGNtc2doZHJfZnJvbV91c2VyX2NvbXBhdF90b19rZXJuKCZtc2dfc3lzLCBzb2NrLT5zaywgY3RsLCBzaXplb2YoY3RsKSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9mcmVlaW92OwogCQljdGxfYnVmID0gbXNnX3N5cy5tc2dfY29udHJvbDsKKwkJY3RsX2xlbiA9IG1zZ19zeXMubXNnX2NvbnRyb2xsZW47CiAJfSBlbHNlIGlmIChjdGxfbGVuKSB7CiAJCWlmIChjdGxfbGVuID4gc2l6ZW9mKGN0bCkpCiAJCXsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfY3J5cHRvLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X2NyeXB0by5jCmluZGV4IDVhNzI2NWEuLmVlNmFlNzQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfY3J5cHRvLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9jcnlwdG8uYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJCQkJIiB1bnN1cHBvcnRlZCBjaGVja3N1bSAlZCIsIGNrc3VtdHlwZSk7CiAJCQlnb3RvIG91dDsKIAl9Ci0JaWYgKCEodGZtID0gY3J5cHRvX2FsbG9jX3RmbShja3N1bW5hbWUsIDApKSkKKwlpZiAoISh0Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKGNrc3VtbmFtZSwgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQKSkpCiAJCWdvdG8gb3V0OwogCWNrc3VtLT5sZW4gPSBjcnlwdG9fdGZtX2FsZ19kaWdlc3RzaXplKHRmbSk7CiAJaWYgKChja3N1bS0+ZGF0YSA9IGttYWxsb2MoY2tzdW0tPmxlbiwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCkBAIC0xOTksOCArMTk5LDcgQEAKIAljcnlwdG9fZGlnZXN0X2ZpbmFsKHRmbSwgY2tzdW0tPmRhdGEpOwogCWNvZGUgPSAwOwogb3V0OgotCWlmICh0Zm0pCi0JCWNyeXB0b19mcmVlX3RmbSh0Zm0pOworCWNyeXB0b19mcmVlX3RmbSh0Zm0pOwogCXJldHVybiBjb2RlOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCmluZGV4IGNmNzI2NTEuLjYwNmE4YTggMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCkBAIC0xODUsMTIgKzE4NSw5IEBACiBnc3NfZGVsZXRlX3NlY19jb250ZXh0X2tlcmJlcm9zKHZvaWQgKmludGVybmFsX2N0eCkgewogCXN0cnVjdCBrcmI1X2N0eCAqa2N0eCA9IGludGVybmFsX2N0eDsKIAotCWlmIChrY3R4LT5zZXEpCi0JCWNyeXB0b19mcmVlX3RmbShrY3R4LT5zZXEpOwotCWlmIChrY3R4LT5lbmMpCi0JCWNyeXB0b19mcmVlX3RmbShrY3R4LT5lbmMpOwotCWlmIChrY3R4LT5tZWNoX3VzZWQuZGF0YSkKLQkJa2ZyZWUoa2N0eC0+bWVjaF91c2VkLmRhdGEpOworCWNyeXB0b19mcmVlX3RmbShrY3R4LT5zZXEpOworCWNyeXB0b19mcmVlX3RmbShrY3R4LT5lbmMpOworCWtmcmVlKGtjdHgtPm1lY2hfdXNlZC5kYXRhKTsKIAlrZnJlZShrY3R4KTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jCmluZGV4IGRhZDA1OTkuLjZjOTdkNjEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX21lY2guYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19tZWNoLmMKQEAgLTIxNCwxNCArMjE0LDEwIEBACiBnc3NfZGVsZXRlX3NlY19jb250ZXh0X3Nwa20zKHZvaWQgKmludGVybmFsX2N0eCkgewogCXN0cnVjdCBzcGttM19jdHggKnNjdHggPSBpbnRlcm5hbF9jdHg7CiAKLQlpZihzY3R4LT5kZXJpdmVkX2ludGVnX2tleSkKLQkJY3J5cHRvX2ZyZWVfdGZtKHNjdHgtPmRlcml2ZWRfaW50ZWdfa2V5KTsKLQlpZihzY3R4LT5kZXJpdmVkX2NvbmZfa2V5KQotCQljcnlwdG9fZnJlZV90Zm0oc2N0eC0+ZGVyaXZlZF9jb25mX2tleSk7Ci0JaWYoc2N0eC0+c2hhcmVfa2V5LmRhdGEpCi0JCWtmcmVlKHNjdHgtPnNoYXJlX2tleS5kYXRhKTsKLQlpZihzY3R4LT5tZWNoX3VzZWQuZGF0YSkKLQkJa2ZyZWUoc2N0eC0+bWVjaF91c2VkLmRhdGEpOworCWNyeXB0b19mcmVlX3RmbShzY3R4LT5kZXJpdmVkX2ludGVnX2tleSk7CisJY3J5cHRvX2ZyZWVfdGZtKHNjdHgtPmRlcml2ZWRfY29uZl9rZXkpOworCWtmcmVlKHNjdHgtPnNoYXJlX2tleS5kYXRhKTsKKwlrZnJlZShzY3R4LT5tZWNoX3VzZWQuZGF0YSk7CiAJa2ZyZWUoc2N0eCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwppbmRleCA1YzhmZTNiLi5lMzMwODE5IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCkBAIC0yNTAsNiArMjUwLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBjYWNoZV9kZXRhaWwgcnNpX2NhY2hlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuaGFzaF9zaXplCT0gUlNJX0hBU0hNQVgsCiAJLmhhc2hfdGFibGUgICAgID0gcnNpX3RhYmxlLAogCS5uYW1lICAgICAgICAgICA9ICJhdXRoLnJwY3NlYy5pbml0IiwKQEAgLTQzNiw2ICs0MzcsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGNhY2hlX2RldGFpbCByc2NfY2FjaGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5oYXNoX3NpemUJPSBSU0NfSEFTSE1BWCwKIAkuaGFzaF90YWJsZQk9IHJzY190YWJsZSwKIAkubmFtZQkJPSAiYXV0aC5ycGNzZWMuY29udGV4dCIsCkBAIC0xMDc0LDcgKzEwNzYsOSBAQAogdm9pZAogZ3NzX3N2Y19zaHV0ZG93bih2b2lkKQogewotCWNhY2hlX3VucmVnaXN0ZXIoJnJzY19jYWNoZSk7Ci0JY2FjaGVfdW5yZWdpc3RlcigmcnNpX2NhY2hlKTsKKwlpZiAoY2FjaGVfdW5yZWdpc3RlcigmcnNjX2NhY2hlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJhdXRoX3JwY2dzczogZmFpbGVkIHRvIHVucmVnaXN0ZXIgcnNjIGNhY2hlXG4iKTsKKwlpZiAoY2FjaGVfdW5yZWdpc3RlcigmcnNpX2NhY2hlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJhdXRoX3JwY2dzczogZmFpbGVkIHRvIHVucmVnaXN0ZXIgcnNpIGNhY2hlXG4iKTsKIAlzdmNfYXV0aF91bnJlZ2lzdGVyKFJQQ19BVVRIX0dTUyk7CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2NhY2hlLmMgYi9uZXQvc3VucnBjL2NhY2hlLmMKaW5kZXggOTAwZjViYy4uZjUwOWU5OSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9jYWNoZS5jCisrKyBiL25ldC9zdW5ycGMvY2FjaGUuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJY2QtPnByb2NfZW50ID0gcHJvY19ta2RpcihjZC0+bmFtZSwgcHJvY19uZXRfcnBjKTsKIAlpZiAoY2QtPnByb2NfZW50KSB7CiAJCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKLQkJY2QtPnByb2NfZW50LT5vd25lciA9IFRISVNfTU9EVUxFOworCQljZC0+cHJvY19lbnQtPm93bmVyID0gY2QtPm93bmVyOwogCQljZC0+Y2hhbm5lbF9lbnQgPSBjZC0+Y29udGVudF9lbnQgPSBOVUxMOwogCQkKICAJCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgiZmx1c2giLCBTX0lGUkVHfFNfSVJVU1J8U19JV1VTUiwKQEAgLTE4NSw3ICsxODUsNyBAQAogCQljZC0+Zmx1c2hfZW50ID0gIHA7CiAgCQlpZiAocCkgewogIAkJCXAtPnByb2NfZm9wcyA9ICZjYWNoZV9mbHVzaF9vcGVyYXRpb25zOwotIAkJCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisgCQkJcC0+b3duZXIgPSBjZC0+b3duZXI7CiAgCQkJcC0+ZGF0YSA9IGNkOwogIAkJfQogIApAQCAtMTk1LDcgKzE5NSw3IEBACiAJCQljZC0+Y2hhbm5lbF9lbnQgPSBwOwogCQkJaWYgKHApIHsKIAkJCQlwLT5wcm9jX2ZvcHMgPSAmY2FjaGVfZmlsZV9vcGVyYXRpb25zOwotCQkJCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisJCQkJcC0+b3duZXIgPSBjZC0+b3duZXI7CiAJCQkJcC0+ZGF0YSA9IGNkOwogCQkJfQogCQl9CkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJCWNkLT5jb250ZW50X2VudCA9IHA7CiAgCQkJaWYgKHApIHsKICAJCQkJcC0+cHJvY19mb3BzID0gJmNvbnRlbnRfZmlsZV9vcGVyYXRpb25zOwotIAkJCQlwLT5vd25lciA9IFRISVNfTU9EVUxFOworIAkJCQlwLT5vd25lciA9IGNkLT5vd25lcjsKICAJCQkJcC0+ZGF0YSA9IGNkOwogIAkJCX0KICAJCX0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvcnBjX3BpcGUuYyBiL25ldC9zdW5ycGMvcnBjX3BpcGUuYwppbmRleCBmZTFhNzNjLi5kZWQ2YzYzIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY19waXBlLmMKKysrIGIvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIFVzZXJsYW5kL2tlcm5lbCBpbnRlcmZhY2UgZm9yIHJwY2F1dGhfZ3NzLgogICogQ29kZSBzaGFtZWxlc3NseSBwbGFnaWFyaXplZCBmcm9tIGZzL25mc2QvbmZzY3RsLmMKLSAqIGFuZCBmcy9kcml2ZXJmcy9pbm9kZS5jCisgKiBhbmQgZnMvc3lzZnMvaW5vZGUuYwogICoKICAqIENvcHlyaWdodCAoYykgMjAwMiwgVHJvbmQgTXlrbGVidXN0IDx0cm9uZC5teWtsZWJ1c3RAZnlzLnVpby5ubz4KICAqCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N0YXRzLmMgYi9uZXQvc3VucnBjL3N0YXRzLmMKaW5kZXggOWI2N2RjMS4uNDk3OWYyMiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdGF0cy5jCisrKyBiL25ldC9zdW5ycGMvc3RhdHMuYwpAQCAtMzUsMTMgKzM1LDEzIEBACiAJaW50CQlpLCBqOwogCiAJc2VxX3ByaW50ZihzZXEsCi0JCSJuZXQgJWQgJWQgJWQgJWRcbiIsCisJCSJuZXQgJXUgJXUgJXUgJXVcbiIsCiAJCQlzdGF0cC0+bmV0Y250LAogCQkJc3RhdHAtPm5ldHVkcGNudCwKIAkJCXN0YXRwLT5uZXR0Y3BjbnQsCiAJCQlzdGF0cC0+bmV0dGNwY29ubik7CiAJc2VxX3ByaW50ZihzZXEsCi0JCSJycGMgJWQgJWQgJWRcbiIsCisJCSJycGMgJXUgJXUgJXVcbiIsCiAJCQlzdGF0cC0+cnBjY250LAogCQkJc3RhdHAtPnJwY3JldHJhbnMsCiAJCQlzdGF0cC0+cnBjYXV0aHJlZnJlc2gpOwpAQCAtNTAsMTAgKzUwLDEwIEBACiAJCWNvbnN0IHN0cnVjdCBycGNfdmVyc2lvbiAqdmVycyA9IHByb2ctPnZlcnNpb25baV07CiAJCWlmICghdmVycykKIAkJCWNvbnRpbnVlOwotCQlzZXFfcHJpbnRmKHNlcSwgInByb2MlZCAlZCIsCisJCXNlcV9wcmludGYoc2VxLCAicHJvYyV1ICV1IiwKIAkJCQkJdmVycy0+bnVtYmVyLCB2ZXJzLT5ucnByb2NzKTsKIAkJZm9yIChqID0gMDsgaiA8IHZlcnMtPm5ycHJvY3M7IGorKykKLQkJCXNlcV9wcmludGYoc2VxLCAiICVkIiwKKwkJCXNlcV9wcmludGYoc2VxLCAiICV1IiwKIAkJCQkJdmVycy0+cHJvY3Nbal0ucF9jb3VudCk7CiAJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CiAJfQpAQCAtODMsMTMgKzgzLDEzIEBACiAJaW50CQlpLCBqOwogCiAJc2VxX3ByaW50ZihzZXEsCi0JCSJuZXQgJWQgJWQgJWQgJWRcbiIsCisJCSJuZXQgJXUgJXUgJXUgJXVcbiIsCiAJCQlzdGF0cC0+bmV0Y250LAogCQkJc3RhdHAtPm5ldHVkcGNudCwKIAkJCXN0YXRwLT5uZXR0Y3BjbnQsCiAJCQlzdGF0cC0+bmV0dGNwY29ubik7CiAJc2VxX3ByaW50ZihzZXEsCi0JCSJycGMgJWQgJWQgJWQgJWQgJWRcbiIsCisJCSJycGMgJXUgJXUgJXUgJXUgJXVcbiIsCiAJCQlzdGF0cC0+cnBjY250LAogCQkJc3RhdHAtPnJwY2JhZGZtdCtzdGF0cC0+cnBjYmFkYXV0aCtzdGF0cC0+cnBjYmFkY2xudCwKIAkJCXN0YXRwLT5ycGNiYWRmbXQsCkBAIC05OSw5ICs5OSw5IEBACiAJZm9yIChpID0gMDsgaSA8IHByb2ctPnBnX252ZXJzOyBpKyspIHsKIAkJaWYgKCEodmVycyA9IHByb2ctPnBnX3ZlcnNbaV0pIHx8ICEocHJvYyA9IHZlcnMtPnZzX3Byb2MpKQogCQkJY29udGludWU7Ci0JCXNlcV9wcmludGYoc2VxLCAicHJvYyVkICVkIiwgaSwgdmVycy0+dnNfbnByb2MpOworCQlzZXFfcHJpbnRmKHNlcSwgInByb2MlZCAldSIsIGksIHZlcnMtPnZzX25wcm9jKTsKIAkJZm9yIChqID0gMDsgaiA8IHZlcnMtPnZzX25wcm9jOyBqKyssIHByb2MrKykKLQkJCXNlcV9wcmludGYoc2VxLCAiICVkIiwgcHJvYy0+cGNfY291bnQpOworCQkJc2VxX3ByaW50ZihzZXEsICIgJXUiLCBwcm9jLT5wY19jb3VudCk7CiAJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdW5ycGNfc3ltcy5jIGIvbmV0L3N1bnJwYy9zdW5ycGNfc3ltcy5jCmluZGV4IDYyYTA3MzQuLmVkNDhmZjAgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYworKysgYi9uZXQvc3VucnBjL3N1bnJwY19zeW1zLmMKQEAgLTE3Niw4ICsxNzYsMTAgQEAKIHsKIAl1bnJlZ2lzdGVyX3JwY19waXBlZnMoKTsKIAlycGNfZGVzdHJveV9tZW1wb29sKCk7Ci0JY2FjaGVfdW5yZWdpc3RlcigmYXV0aF9kb21haW5fY2FjaGUpOwotCWNhY2hlX3VucmVnaXN0ZXIoJmlwX21hcF9jYWNoZSk7CisJaWYgKGNhY2hlX3VucmVnaXN0ZXIoJmF1dGhfZG9tYWluX2NhY2hlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJzdW5ycGM6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIGF1dGhfZG9tYWluIGNhY2hlXG4iKTsKKwlpZiAoY2FjaGVfdW5yZWdpc3RlcigmaXBfbWFwX2NhY2hlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJzdW5ycGM6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIGlwX21hcCBjYWNoZVxuIik7CiAjaWZkZWYgUlBDX0RFQlVHCiAJcnBjX3VucmVnaXN0ZXJfc3lzY3RsKCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjYXV0aC5jIGIvbmV0L3N1bnJwYy9zdmNhdXRoLmMKaW5kZXggYmRlODE0Ny4uZGRhNGYwYyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNhdXRoLmMKQEAgLTE0Myw2ICsxNDMsNyBAQAogCiAKIHN0cnVjdCBjYWNoZV9kZXRhaWwgYXV0aF9kb21haW5fY2FjaGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5oYXNoX3NpemUJPSBETl9IQVNITUFYLAogCS5oYXNoX3RhYmxlCT0gYXV0aF9kb21haW5fdGFibGUsCiAJLm5hbWUJCT0gImF1dGguZG9tYWluIiwKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCmluZGV4IGQ2YmFmNmYuLmNhYzJlNzcgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKKysrIGIvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYwpAQCAtMjQyLDYgKzI0Miw3IEBACiAJCiAKIHN0cnVjdCBjYWNoZV9kZXRhaWwgaXBfbWFwX2NhY2hlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuaGFzaF9zaXplCT0gSVBfSEFTSE1BWCwKIAkuaGFzaF90YWJsZQk9IGlwX3RhYmxlLAogCS5uYW1lCQk9ICJhdXRoLnVuaXguaXAiLApkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKaW5kZXggODNjODEzNS4uZmRhNzM3ZCAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYworKysgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCkBAIC03NjUsOCArNzY1LDggQEAKIAlzd2l0Y2ggKHBvbGljeS0+YWN0aW9uKSB7CiAJY2FzZSBYRlJNX1BPTElDWV9CTE9DSzoKIAkJLyogUHJvaGliaXQgdGhlIGZsb3cgKi8KLQkJeGZybV9wb2xfcHV0KHBvbGljeSk7Ci0JCXJldHVybiAtRVBFUk07CisJCWVyciA9IC1FUEVSTTsKKwkJZ290byBlcnJvcjsKIAogCWNhc2UgWEZSTV9QT0xJQ1lfQUxMT1c6CiAJCWlmIChwb2xpY3ktPnhmcm1fbnIgPT0gMCkgewpAQCAtNzgyLDggKzc4Miw4IEBACiAJCSAqLwogCQlkc3QgPSB4ZnJtX2ZpbmRfYnVuZGxlKGZsLCBwb2xpY3ksIGZhbWlseSk7CiAJCWlmIChJU19FUlIoZHN0KSkgewotCQkJeGZybV9wb2xfcHV0KHBvbGljeSk7Ci0JCQlyZXR1cm4gUFRSX0VSUihkc3QpOworCQkJZXJyID0gUFRSX0VSUihkc3QpOworCQkJZ290byBlcnJvcjsKIAkJfQogCiAJCWlmIChkc3QpCmRpZmYgLS1naXQgYS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjNjNzA4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQpAQCAtMCwwICsxLDk5IEBACisjIyMjCisjIGtidWlsZDogR2VuZXJpYyBkZWZpbml0aW9ucworCisjIENvbnZpbmllbnQgdmFyaWFibGVzCitjb21tYSAgIDo9ICwKK2VtcHR5ICAgOj0KK3NwYWNlICAgOj0gJChlbXB0eSkgJChlbXB0eSkKKworIyMjCisjIFRoZSB0ZW1wb3JhcnkgZmlsZSB0byBzYXZlIGdjYyAtTUQgZ2VuZXJhdGVkIGRlcGVuZGVuY2llcyBtdXN0IG5vdAorIyBjb250YWluIGEgY29tbWEKK2RlcGZpbGUgPSAkKHN1YnN0ICQoY29tbWEpLF8sJChARCkvLiQoQEYpLmQpCisKKyMjIworIyBmaWxlY2hrIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGNvbnRlbnQgb2YgYSBnZW5lcmF0ZWQgZmlsZSBpcyB1cGRhdGVkLgorIyBTYW1wbGUgdXNhZ2U6CisjIGRlZmluZSBmaWxlY2hrX3NhbXBsZQorIwllY2hvICRLRVJORUxSRUxFQVNFCisjIGVuZGVmCisjIHZlcnNpb24uaCA6IE1ha2VmaWxlCisjCSQoY2FsbCBmaWxlY2hrLHNhbXBsZSkKKyMgVGhlIHJ1bGUgZGVmaW5lZCBzaGFsbCB3cml0ZSB0byBzdGRvdXQgdGhlIGNvbnRlbnQgb2YgdGhlIG5ldyBmaWxlLgorIyBUaGUgZXhpc3RpbmcgZmlsZSB3aWxsIGJlIGNvbXBhcmVkIHdpdGggdGhlIG5ldyBvbmUuCisjIC0gSWYgbm8gZmlsZSBleGlzdCBpdCBpcyBjcmVhdGVkCisjIC0gSWYgdGhlIGNvbnRlbnQgZGlmZmVyIHRoZSBuZXcgZmlsZSBpcyB1c2VkCisjIC0gSWYgdGhleSBhcmUgZXF1YWwgbm8gY2hhbmdlLCBhbmQgbm8gdGltZXN0YW1wIHVwZGF0ZQorIyAtIHN0ZGluIGlzIHBpcGVkIGluIGZyb20gdGhlIGZpcnN0IHByZXJlcXVpc2l0ZSAoJDwpIHNvIG9uZSBoYXMKKyMgICB0byBzcGVjaWZ5IGEgdmFsaWQgZmlsZSBhcyBmaXJzdCBwcmVyZXF1aXNpdGUgKG9mdGVuIHRoZSBrYnVpbGQgZmlsZSkKK2RlZmluZSBmaWxlY2hrCisJJChRKXNldCAtZTsJCQkJXAorCWVjaG8gJyAgQ0hLICAgICAkQCc7CQkJXAorCW1rZGlyIC1wICQoZGlyICRAKTsJCQlcCisJJChmaWxlY2hrXyQoMSkpIDwgJDwgPiAkQC50bXA7CQlcCisJaWYgWyAtciAkQCBdICYmIGNtcCAtcyAkQCAkQC50bXA7IHRoZW4JXAorCQlybSAtZiAkQC50bXA7CQkJXAorCWVsc2UJCQkJCVwKKwkJZWNobyAnICBVUEQgICAgICRAJzsJCVwKKwkJbXYgLWYgJEAudG1wICRAOwkJXAorCWZpCitlbmRlZgorCisjIyMKKyMgU2hvcnRoYW5kIGZvciAkKFEpJChNQUtFKSAtZiBzY3JpcHRzL01ha2VmaWxlLmJ1aWxkIG9iaj0KKyMgVXNhZ2U6CisjICQoUSkkKE1BS0UpICQoYnVpbGQpPWRpcgorYnVpbGQgOj0gLWYgJChpZiAkKEtCVUlMRF9TUkMpLCQoc3JjdHJlZSkvKXNjcmlwdHMvTWFrZWZpbGUuYnVpbGQgb2JqCisKKyMgSWYgcXVpZXQgaXMgc2V0LCBvbmx5IHByaW50IHNob3J0IHZlcnNpb24gb2YgY29tbWFuZAorY21kID0gQCQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSxcCisgICAgICBlY2hvICcgICQoc3Vic3QgJywnXCcnLCQoJChxdWlldCljbWRfJCgxKSkpJyAmJikgJChjbWRfJCgxKSkKKworIyBBZGQgJChvYmopLyBmb3IgcGF0aHMgdGhhdCBpcyBub3QgYWJzb2x1dGUKK29iamVjdGlmeSA9ICQoZm9yZWFjaCBvLCQoMSksJChpZiAkKGZpbHRlciAvJSwkKG8pKSwkKG8pLCQob2JqKS8kKG8pKSkKKworIyMjCisjIGlmX2NoYW5nZWQgICAgICAtIGV4ZWN1dGUgY29tbWFuZCBpZiBhbnkgcHJlcmVxdWlzaXRlIGlzIG5ld2VyIHRoYW4gCisjICAgICAgICAgICAgICAgICAgIHRhcmdldCwgb3IgY29tbWFuZCBsaW5lIGhhcyBjaGFuZ2VkCisjIGlmX2NoYW5nZWRfZGVwICAtIGFzIGlmX2NoYW5nZWQsIGJ1dCB1c2VzIGZpeGRlcCB0byByZXZlYWwgZGVwZW5kZW5jaWVzCisjICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyB1c2VkIGNvbmZpZyBzeW1ib2xzCisjIGlmX2NoYW5nZWRfcnVsZSAtIGFzIGlmX2NoYW5nZWQgYnV0IGV4ZWN1dGUgcnVsZSBpbnN0ZWFkCisjIFNlZSBEb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0IGZvciBtb3JlIGluZm8KKworaWZuZXEgKCQoS0JVSUxEX05PQ01EREVQKSwxKQorIyBDaGVjayBpZiBib3RoIGFyZ3VtZW50cyBoYXMgc2FtZSBhcmd1bWVudHMuIFJlc3VsdCBpbiBlbXB0eSBzdHJpbmcgaWYgZXF1YWwKKyMgVXNlciBtYXkgb3ZlcnJpZGUgdGhpcyBjaGVjayB1c2luZyBtYWtlIEtCVUlMRF9OT0NNRERFUD0xCithcmctY2hlY2sgPSAkKHN0cmlwICQoZmlsdGVyLW91dCAkKDEpLCAkKDIpKSAkKGZpbHRlci1vdXQgJCgyKSwgJCgxKSkgKQorZW5kaWYKKworIyBlY2hvIGNvbW1hbmQuIFNob3J0IHZlcnNpb24gaXMgJChxdWlldCkgZXF1YWxzIHF1aWV0LCBvdGhlcndpc2UgZnVsbCBjb21tYW5kCitlY2hvLWNtZCA9ICQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSwgXAorCWVjaG8gJyAgJChzdWJzdCAnLCdcJycsJCgkKHF1aWV0KWNtZF8kKDEpKSknOykKKworIyBmdW5jdGlvbiB0byBvbmx5IGV4ZWN1dGUgdGhlIHBhc3NlZCBjb21tYW5kIGlmIG5lY2Vzc2FyeQorIyA+Jzwgc3Vic3RpdHV0aW9uIGlzIGZvciBlY2hvIHRvIHdvcmssID4kPCBzdWJzdGl0dXRpb24gdG8gcHJlc2VydmUgJCB3aGVuIHJlbG9hZGluZyAuY21kIGZpbGUKKyMgbm90ZTogd2hlbiB1c2luZyBpbmxpbmUgcGVybCBzY3JpcHRzIFtwZXJsIC1lICcuLi4kJHQ9MTsuLi4nXSBpbiAkKGNtZF94eHgpIGRvdWJsZSAkJCB5b3VyIHBlcmwgdmFycworIyAKK2lmX2NoYW5nZWQgPSAkKGlmICQoc3RyaXAgJD8gJChjYWxsIGFyZy1jaGVjaywgJChjbWRfJCgxKSksICQoY21kXyRAKSkgKSwgXAorCUBzZXQgLWU7IFwKKwkkKGVjaG8tY21kKSBcCisJJChjbWRfJCgxKSk7IFwKKwllY2hvICdjbWRfJEAgOj0gJChzdWJzdCAkJCwkJCQkLCQoc3Vic3QgJywnXCcnLCQoY21kXyQoMSkpKSknID4gJChARCkvLiQoQEYpLmNtZCkKKworIyBleGVjdXRlIHRoZSBjb21tYW5kIGFuZCBhbHNvIHBvc3Rwcm9jZXNzIGdlbmVyYXRlZCAuZCBkZXBlbmRlbmNpZXMKKyMgZmlsZQoraWZfY2hhbmdlZF9kZXAgPSAkKGlmICQoc3RyaXAgJD8gJChmaWx0ZXItb3V0IEZPUkNFICQod2lsZGNhcmQgJF4pLCReKVwKKwkkKGNhbGwgYXJnLWNoZWNrLCAkKGNtZF8kKDEpKSwgJChjbWRfJEApKSApLCAgICAgICAgICAgICAgICAgIFwKKwlAc2V0IC1lOyBcCisJJChlY2hvLWNtZCkgXAorCSQoY21kXyQoMSkpOyBcCisJc2NyaXB0cy9iYXNpYy9maXhkZXAgJChkZXBmaWxlKSAkQCAnJChzdWJzdCAkJCwkJCQkLCQoc3Vic3QgJywnXCcnLCQoY21kXyQoMSkpKSknID4gJChARCkvLiQoQEYpLnRtcDsgXAorCXJtIC1mICQoZGVwZmlsZSk7IFwKKwltdiAtZiAkKEBEKS8uJChARikudG1wICQoQEQpLy4kKEBGKS5jbWQpCisKKyMgVXNhZ2U6ICQoY2FsbCBpZl9jaGFuZ2VkX3J1bGUsZm9vKQorIyB3aWxsIGNoZWNrIGlmICQoY21kX2ZvbykgY2hhbmdlZCwgb3IgYW55IG9mIHRoZSBwcmVxdWlzaXRlcyBjaGFuZ2VkLAorIyBhbmQgaWYgc28gd2lsbCBleGVjdXRlICQocnVsZV9mb28pCitpZl9jaGFuZ2VkX3J1bGUgPSAkKGlmICQoc3RyaXAgJD8gJChjYWxsIGFyZy1jaGVjaywgJChjbWRfJCgxKSksICQoY21kXyRAKSkgKSxcCisJCQlAc2V0IC1lOyBcCisJCQkkKHJ1bGVfJCgxKSkpCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkIGIvc2NyaXB0cy9NYWtlZmlsZS5idWlsZAppbmRleCA3NmJhNmJlLi41MDZlM2YzIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKQEAgLTEwLDggKzEwLDExIEBACiAjIFJlYWQgLmNvbmZpZyBpZiBpdCBleGlzdCwgb3RoZXJ3aXNlIGlnbm9yZQogLWluY2x1ZGUgLmNvbmZpZwogCi1pbmNsdWRlICQoaWYgJCh3aWxkY2FyZCAkKG9iaikvS2J1aWxkKSwgJChvYmopL0tidWlsZCwgJChvYmopL01ha2VmaWxlKQorIyBUaGUgZmlsZW5hbWUgS2J1aWxkIGhhcyBwcmVjZWRlbmNlIG92ZXIgTWFrZWZpbGUKK2tidWlsZC1kaXIgOj0gJChpZiAkKGZpbHRlciAvJSwkKHNyYykpLCQoc3JjKSwkKHNyY3RyZWUpLyQoc3JjKSkKK2luY2x1ZGUgJChpZiAkKHdpbGRjYXJkICQoa2J1aWxkLWRpcikvS2J1aWxkKSwgJChrYnVpbGQtZGlyKS9LYnVpbGQsICQoa2J1aWxkLWRpcikvTWFrZWZpbGUpCiAKK2luY2x1ZGUgc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQogaW5jbHVkZSBzY3JpcHRzL01ha2VmaWxlLmxpYgogCiBpZmRlZiBob3N0LXByb2dzCkBAIC0xNjksNyArMTcyLDcgQEAKIAkJCS1UICQoQEQpLy50bXBfJChARjoubz0udmVyKTsJCQlcCiAJCXJtIC1mICQoQEQpLy50bXBfJChARikgJChARCkvLnRtcF8kKEBGOi5vPS52ZXIpOwlcCiAJZWxzZQkJCQkJCQkJXAotCQltdiAkKEBEKS8udG1wXyQoQEYpICRAOwkJCQkJXAorCQltdiAtZiAkKEBEKS8udG1wXyQoQEYpICRAOwkJCQlcCiAJZmk7CiBlbmRpZgogCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmNsZWFuIGIvc2NyaXB0cy9NYWtlZmlsZS5jbGVhbgppbmRleCBmZjNlODdkLi44OTc0ZWE1IDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmNsZWFuCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuY2xlYW4KQEAgLTcsNyArNywxNCBAQAogLlBIT05ZOiBfX2NsZWFuCiBfX2NsZWFuOgogCi1pbmNsdWRlICQoaWYgJCh3aWxkY2FyZCAkKG9iaikvS2J1aWxkKSwgJChvYmopL0tidWlsZCwgJChvYmopL01ha2VmaWxlKQorIyBTaG9ydGhhbmQgZm9yICQoUSkkKE1BS0UpIHNjcmlwdHMvTWFrZWZpbGUuY2xlYW4gb2JqPWRpcgorIyBVc2FnZToKKyMgJChRKSQoTUFLRSkgJChjbGVhbik9ZGlyCitjbGVhbiA6PSAtZiAkKGlmICQoS0JVSUxEX1NSQyksJChzcmN0cmVlKS8pc2NyaXB0cy9NYWtlZmlsZS5jbGVhbiBvYmoKKworIyBUaGUgZmlsZW5hbWUgS2J1aWxkIGhhcyBwcmVjZWRlbmNlIG92ZXIgTWFrZWZpbGUKK2tidWlsZC1kaXIgOj0gJChpZiAkKGZpbHRlciAvJSwkKHNyYykpLCQoc3JjKSwkKHNyY3RyZWUpLyQoc3JjKSkKK2luY2x1ZGUgJChpZiAkKHdpbGRjYXJkICQoa2J1aWxkLWRpcikvS2J1aWxkKSwgJChrYnVpbGQtZGlyKS9LYnVpbGQsICQoa2J1aWxkLWRpcikvTWFrZWZpbGUpCiAKICMgRmlndXJlIG91dCB3aGF0IHdlIG5lZWQgdG8gYnVpbGQgZnJvbSB0aGUgdmFyaW91cyB2YXJpYWJsZXMKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTg3LDggKzk0LDMgQEAKICMgSWYgcXVpZXQgaXMgc2V0LCBvbmx5IHByaW50IHNob3J0IHZlcnNpb24gb2YgY29tbWFuZAogCiBjbWQgPSBAJChpZiAkKCQocXVpZXQpY21kXyQoMSkpLGVjaG8gJyAgJCgkKHF1aWV0KWNtZF8kKDEpKScgJiYpICQoY21kXyQoMSkpCi0KLSMgU2hvcnRoYW5kIGZvciAkKFEpJChNQUtFKSBzY3JpcHRzL01ha2VmaWxlLmNsZWFuIG9iaj1kaXIKLSMgVXNhZ2U6Ci0jICQoUSkkKE1BS0UpICQoY2xlYW4pPWRpcgotY2xlYW4gOj0gLWYgJChpZiAkKEtCVUlMRF9TUkMpLCQoc3JjdHJlZSkvKXNjcmlwdHMvTWFrZWZpbGUuY2xlYW4gb2JqCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmhvc3QgYi9zY3JpcHRzL01ha2VmaWxlLmhvc3QKaW5kZXggMjgyMWEyYi4uMmQ1MTk3MCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5ob3N0CisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuaG9zdApAQCAtOTgsNyArOTgsOCBAQAogIyBDcmVhdGUgZXhlY3V0YWJsZSBmcm9tIGEgc2luZ2xlIC5jIGZpbGUKICMgaG9zdC1jc2luZ2xlIC0+IEV4ZWN1dGFibGUKIHF1aWV0X2NtZF9ob3N0LWNzaW5nbGUgCT0gSE9TVENDICAkQAotICAgICAgY21kX2hvc3QtY3NpbmdsZQk9ICQoSE9TVENDKSAkKGhvc3RjX2ZsYWdzKSAkKEhPU1RfTE9BRExJQkVTKSAtbyAkQCAkPAorICAgICAgY21kX2hvc3QtY3NpbmdsZQk9ICQoSE9TVENDKSAkKGhvc3RjX2ZsYWdzKSAtbyAkQCAkPCBcCisJICAJJChIT1NUX0xPQURMSUJFUykgJChIT1NUTE9BRExJQkVTXyQoQEYpKQogJChob3N0LWNzaW5nbGUpOiAlOiAlLmMgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsaG9zdC1jc2luZ2xlKQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmxpYiBiL3NjcmlwdHMvTWFrZWZpbGUubGliCmluZGV4IDdjZjc1Y2MuLjBmODFkY2YgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUubGliCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUubGliCkBAIC0xLDEzICsxLDMgQEAKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIGtidWlsZDogR2VuZXJpYyBkZWZpbml0aW9ucwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBTdGFuZGFyZCB2YXJzCi0KLWNvbW1hICAgOj0gLAotZW1wdHkgICA6PQotc3BhY2UgICA6PSAkKGVtcHR5KSAkKGVtcHR5KQotCiAjIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgLSB0byBiZSByZW1vdmVkLi4uCiBleHRyYS15CSs9ICQoRVhUUkFfVEFSR0VUUykKICMgRmlndXJlIG91dCB3aGF0IHdlIG5lZWQgdG8gYnVpbGQgZnJvbSB0aGUgdmFyaW91cyB2YXJpYWJsZXMKQEAgLTg0LDEwICs3NCw2IEBACiBzdWJkaXIteW0JOj0gJChhZGRwcmVmaXggJChvYmopLywkKHN1YmRpci15bSkpCiBvYmotZGlycwk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQob2JqLWRpcnMpKQogCi0jIFRoZSB0ZW1wb3JhcnkgZmlsZSB0byBzYXZlIGdjYyAtTUQgZ2VuZXJhdGVkIGRlcGVuZGVuY2llcyBtdXN0IG5vdAotIyBjb250YWluIGEgY29tbWEKLWRlcGZpbGUgPSAkKHN1YnN0ICQoY29tbWEpLF8sJChARCkvLiQoQEYpLmQpCi0KICMgVGhlc2UgZmxhZ3MgYXJlIG5lZWRlZCBmb3IgbW9kdmVyc2lvbnMgYW5kIGNvbXBpbGluZywgc28gd2UgZGVmaW5lIHRoZW0gaGVyZQogIyBhbHJlYWR5CiAjICQobW9kbmFtZV9mbGFncykgI2RlZmluZXMgS0JVSUxEX01PRE5BTUUgYXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBpdCB3aWxsIApAQCAtMTc5LDg5ICsxNjUsNCBAQAogcXVpZXRfY21kX2d6aXAgPSBHWklQICAgICRACiBjbWRfZ3ppcCA9IGd6aXAgLWYgLTkgPCAkPCA+ICRACiAKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIEdlbmVyaWMgc3R1ZmYKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWlmbmVxICgkKEtCVUlMRF9OT0NNRERFUCksMSkKLSMgQ2hlY2sgaWYgYm90aCBhcmd1bWVudHMgaGFzIHNhbWUgYXJndW1lbnRzLiBSZXN1bHQgaW4gZW1wdHkgc3RyaW5nIGlmIGVxdWFsCi0jIFVzZXIgbWF5IG92ZXJyaWRlIHRoaXMgY2hlY2sgdXNpbmcgbWFrZSBLQlVJTERfTk9DTURERVA9MQotYXJnLWNoZWNrID0gJChzdHJpcCAkKGZpbHRlci1vdXQgJCgxKSwgJCgyKSkgJChmaWx0ZXItb3V0ICQoMiksICQoMSkpICkKLQotZW5kaWYKLQotIyBlY2hvIGNvbW1hbmQuIFNob3J0IHZlcnNpb24gaXMgJChxdWlldCkgZXF1YWxzIHF1aWV0LCBvdGhlcndpc2UgZnVsbCBjb21tYW5kCi1lY2hvLWNtZCA9ICQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSwgXAotCWVjaG8gJyAgJChzdWJzdCAnLCdcJycsJCgkKHF1aWV0KWNtZF8kKDEpKSknOykKLQotIyBmdW5jdGlvbiB0byBvbmx5IGV4ZWN1dGUgdGhlIHBhc3NlZCBjb21tYW5kIGlmIG5lY2Vzc2FyeQotIyA+Jzwgc3Vic3RpdHV0aW9uIGlzIGZvciBlY2hvIHRvIHdvcmssID4kPCBzdWJzdGl0dXRpb24gdG8gcHJlc2VydmUgJCB3aGVuIHJlbG9hZGluZyAuY21kIGZpbGUKLSMgbm90ZTogd2hlbiB1c2luZyBpbmxpbmUgcGVybCBzY3JpcHRzIFtwZXJsIC1lICcuLi4kJHQ9MTsuLi4nXSBpbiAkKGNtZF94eHgpIGRvdWJsZSAkJCB5b3VyIHBlcmwgdmFycwotIyAKLWlmX2NoYW5nZWQgPSAkKGlmICQoc3RyaXAgJD8gJChjYWxsIGFyZy1jaGVjaywgJChjbWRfJCgxKSksICQoY21kXyRAKSkgKSwgXAotCUBzZXQgLWU7IFwKLQkkKGVjaG8tY21kKSBcCi0JJChjbWRfJCgxKSk7IFwKLQllY2hvICdjbWRfJEAgOj0gJChzdWJzdCAkJCwkJCQkLCQoc3Vic3QgJywnXCcnLCQoY21kXyQoMSkpKSknID4gJChARCkvLiQoQEYpLmNtZCkKLQotCi0jIGV4ZWN1dGUgdGhlIGNvbW1hbmQgYW5kIGFsc28gcG9zdHByb2Nlc3MgZ2VuZXJhdGVkIC5kIGRlcGVuZGVuY2llcwotIyBmaWxlCi0KLWlmX2NoYW5nZWRfZGVwID0gJChpZiAkKHN0cmlwICQ/ICQoZmlsdGVyLW91dCBGT1JDRSAkKHdpbGRjYXJkICReKSwkXilcCi0JJChjYWxsIGFyZy1jaGVjaywgJChjbWRfJCgxKSksICQoY21kXyRAKSkgKSwgICAgICAgICAgICAgICAgICBcCi0JQHNldCAtZTsgXAotCSQoZWNoby1jbWQpIFwKLQkkKGNtZF8kKDEpKTsgXAotCXNjcmlwdHMvYmFzaWMvZml4ZGVwICQoZGVwZmlsZSkgJEAgJyQoc3Vic3QgJCQsJCQkJCwkKHN1YnN0ICcsJ1wnJywkKGNtZF8kKDEpKSkpJyA+ICQoQEQpLy4kKEBGKS50bXA7IFwKLQlybSAtZiAkKGRlcGZpbGUpOyBcCi0JbXYgLWYgJChARCkvLiQoQEYpLnRtcCAkKEBEKS8uJChARikuY21kKQotCi0jIFVzYWdlOiAkKGNhbGwgaWZfY2hhbmdlZF9ydWxlLGZvbykKLSMgd2lsbCBjaGVjayBpZiAkKGNtZF9mb28pIGNoYW5nZWQsIG9yIGFueSBvZiB0aGUgcHJlcXVpc2l0ZXMgY2hhbmdlZCwKLSMgYW5kIGlmIHNvIHdpbGwgZXhlY3V0ZSAkKHJ1bGVfZm9vKQotCi1pZl9jaGFuZ2VkX3J1bGUgPSAkKGlmICQoc3RyaXAgJD8gJChjYWxsIGFyZy1jaGVjaywgJChjbWRfJCgxKSksICQoY21kXyRAKSkgKSxcCi0JCQlAc2V0IC1lOyBcCi0JCQkkKHJ1bGVfJCgxKSkpCi0KLSMgSWYgcXVpZXQgaXMgc2V0LCBvbmx5IHByaW50IHNob3J0IHZlcnNpb24gb2YgY29tbWFuZAotCi1jbWQgPSBAJChpZiAkKCQocXVpZXQpY21kXyQoMSkpLGVjaG8gJyAgJChzdWJzdCAnLCdcJycsJCgkKHF1aWV0KWNtZF8kKDEpKSknICYmKSAkKGNtZF8kKDEpKQotCi0jCSQoY2FsbCBkZXNjZW5kLDxkaXI+LDx0YXJnZXQ+KQotIwlSZWN1cnNpdmVseSBjYWxsIGEgc3ViLW1ha2UgaW4gPGRpcj4gd2l0aCB0YXJnZXQgPHRhcmdldD4gCi0jIFVzYWdlIGlzIGRlcHJlY2F0ZWQsIGJlY2F1c2UgbWFrZSBkbyBub3Qgc2VlIHRoaXMgYXMgYW4gaW52b2NhdGlvbiBvZiBtYWtlLgotZGVzY2VuZCA9JChRKSQoTUFLRSkgLWYgJChpZiAkKEtCVUlMRF9TUkMpLCQoc3JjdHJlZSkvKXNjcmlwdHMvTWFrZWZpbGUuYnVpbGQgb2JqPSQoMSkgJCgyKQotCi0jIFNob3J0aGFuZCBmb3IgJChRKSQoTUFLRSkgLWYgc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBvYmo9Ci0jIFVzYWdlOgotIyAkKFEpJChNQUtFKSAkKGJ1aWxkKT1kaXIKLWJ1aWxkIDo9IC1mICQoaWYgJChLQlVJTERfU1JDKSwkKHNyY3RyZWUpLylzY3JpcHRzL01ha2VmaWxlLmJ1aWxkIG9iagotCi0jIGZpbGVjaGsgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgY29udGVudCBvZiBhIGdlbmVyYXRlZCBmaWxlIGlzIHVwZGF0ZWQuCi0jIFNhbXBsZSB1c2FnZToKLSMgZGVmaW5lIGZpbGVjaGtfc2FtcGxlCi0jCWVjaG8gJEtFUk5FTFJFTEVBU0UKLSMgZW5kZWYKLSMgdmVyc2lvbi5oIDogTWFrZWZpbGUKLSMJJChjYWxsIGZpbGVjaGssc2FtcGxlKQotIyBUaGUgcnVsZSBkZWZpbmVkIHNoYWxsIHdyaXRlIHRvIHN0ZG91dCB0aGUgY29udGVudCBvZiB0aGUgbmV3IGZpbGUuCi0jIFRoZSBleGlzdGluZyBmaWxlIHdpbGwgYmUgY29tcGFyZWQgd2l0aCB0aGUgbmV3IG9uZS4KLSMgLSBJZiBubyBmaWxlIGV4aXN0IGl0IGlzIGNyZWF0ZWQKLSMgLSBJZiB0aGUgY29udGVudCBkaWZmZXIgdGhlIG5ldyBmaWxlIGlzIHVzZWQKLSMgLSBJZiB0aGV5IGFyZSBlcXVhbCBubyBjaGFuZ2UsIGFuZCBubyB0aW1lc3RhbXAgdXBkYXRlCi0KLWRlZmluZSBmaWxlY2hrCi0JJChRKXNldCAtZTsJCQkJXAotCWVjaG8gJyAgQ0hLICAgICAkQCc7CQkJXAotCW1rZGlyIC1wICQoZGlyICRAKTsJCQlcCi0JJChmaWxlY2hrXyQoMSkpICQoMikgPiAkQC50bXA7CQlcCi0JaWYgWyAtciAkQCBdICYmIGNtcCAtcyAkQCAkQC50bXA7IHRoZW4JXAotCQlybSAtZiAkQC50bXA7CQkJXAotCWVsc2UJCQkJCVwKLQkJZWNobyAnICBVUEQgICAgICRAJzsJCVwKLQkJbXYgLWYgJEAudG1wICRAOwkJXAotCWZpCi1lbmRlZgogCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLm1vZGluc3QgYi9zY3JpcHRzL01ha2VmaWxlLm1vZGluc3QKaW5kZXggODVkNjQ5NC4uMjNmZDFiZCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5tb2RpbnN0CisrKyBiL3NjcmlwdHMvTWFrZWZpbGUubW9kaW5zdApAQCAtNSw3ICs1LDcgQEAKIC5QSE9OWTogX19tb2RpbnN0CiBfX21vZGluc3Q6CiAKLWluY2x1ZGUgc2NyaXB0cy9NYWtlZmlsZS5saWIKK2luY2x1ZGUgc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQogCiAjCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdCBiL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdAppbmRleCA5NGI1NTBlLi4wYzRmM2E5IDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CkBAIC0zNiw2ICszNiw3IEBACiBfbW9kcG9zdDogX19tb2Rwb3N0CiAKIGluY2x1ZGUgLmNvbmZpZworaW5jbHVkZSBzY3JpcHRzL0tidWlsZC5pbmNsdWRlCiBpbmNsdWRlIHNjcmlwdHMvTWFrZWZpbGUubGliCiAKIHN5bXZlcmZpbGUgOj0gJChvYmp0cmVlKS9Nb2R1bGUuc3ltdmVycwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25tYWtlaGFzaC5jIGIvc2NyaXB0cy9jb25tYWtlaGFzaC5jCmluZGV4IDkzZGQyM2YyLi5lMGM2ODkxIDEwMDY0NAotLS0gYS9zY3JpcHRzL2Nvbm1ha2VoYXNoLmMKKysrIGIvc2NyaXB0cy9jb25tYWtlaGFzaC5jCkBAIC0zMyw3ICszMyw3IEBACiAKIGludCBnZXR1bmljb2RlKGNoYXIgKipwMCkKIHsKLSAgdW5zaWduZWQgY2hhciAqcCA9ICpwMDsKKyAgY2hhciAqcCA9ICpwMDsKIAogICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCiAgICAgcCsrOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rYWxsc3ltcy5jIGIvc2NyaXB0cy9rYWxsc3ltcy5jCmluZGV4IGQzZDJlNTMuLmQ1OTE1NzggMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2FsbHN5bXMuYworKysgYi9zY3JpcHRzL2thbGxzeW1zLmMKQEAgLTI0LDc1ICsyNCwzNyBAQAogICoKICAqLwogCisjZGVmaW5lIF9HTlVfU09VUkNFCisKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAKLS8qIG1heGltdW0gdG9rZW4gbGVuZ3RoIHVzZWQuIEl0IGRvZXNuJ3QgcGF5IHRvIGluY3JlYXNlIGl0IGEgbG90LCBiZWNhdXNlCi0gKiB2ZXJ5IGxvbmcgc3Vic3RyaW5ncyBwcm9iYWJseSBkb24ndCByZXBlYXQgdGhlbXNlbHZlcyB0b28gb2Z0ZW4uICovCi0jZGVmaW5lIE1BWF9UT0tfU0laRQkJMTEKICNkZWZpbmUgS1NZTV9OQU1FX0xFTgkJMTI3CiAKLS8qIHdlIHVzZSBvbmx5IGEgc3Vic2V0IG9mIHRoZSBjb21wbGV0ZSBzeW1ib2wgdGFibGUgdG8gZ2F0aGVyIHRoZSB0b2tlbiBjb3VudCwKLSAqIHRvIHNwZWVkIHVwIGNvbXByZXNzaW9uLCBhdCB0aGUgZXhwZW5zZSBvZiBhIGxpdHRsZSBjb21wcmVzc2lvbiByYXRpbyAqLwotI2RlZmluZSBXT1JLSU5HX1NFVAkJMTAyNAotCi0vKiBmaXJzdCBmaW5kIHRoZSBiZXN0IHRva2VuIG9ubHkgb24gdGhlIGxpc3Qgb2YgdG9rZW5zIHRoYXQgd291bGQgcHJvZml0IG1vcmUKLSAqIHRoYW4gR09PRF9CQURfVEhSRVNIT0xELiBPbmx5IGlmIHRoaXMgbGlzdCBpcyBlbXB0eSBnbyB0byB0aGUgImJhZCIgbGlzdC4KLSAqIEluY3JlYXNpbmcgdGhpcyB2YWx1ZSB3aWxsIHB1dCBsZXNzIHRva2VucyBvbiB0aGUgImdvb2QiIGxpc3QsIHNvIHRoZSBzZWFyY2gKLSAqIGlzIGZhc3Rlci4gSG93ZXZlciwgaWYgdGhlIGdvb2QgbGlzdCBydW5zIG91dCBvZiB0b2tlbnMsIHdlIG11c3QgcGFpbmZ1bGx5Ci0gKiBzZWFyY2ggdGhlIGJhZCBsaXN0LiAqLwotI2RlZmluZSBHT09EX0JBRF9USFJFU0hPTEQJMTAKLQotLyogdG9rZW4gaGFzaCBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIEhBU0hfQklUUwkJMTgKLSNkZWZpbmUgSEFTSF9UQUJMRV9TSVpFCQkoMSA8PCBIQVNIX0JJVFMpCi0jZGVmaW5lIEhBU0hfTUFTSwkJKEhBU0hfVEFCTEVfU0laRSAtIDEpCi0jZGVmaW5lIEhBU0hfQkFTRV9PRkZTRVQJMjE2NjEzNjI2MVUKLSNkZWZpbmUgSEFTSF9GT0xEKGEpCQkoKGEpJihIQVNIX01BU0spKQotCi0vKiBmbGFncyB0byBtYXJrIHN5bWJvbHMgKi8KLSNkZWZpbmUgU1lNX0ZMQUdfVkFMSUQJCTEKLSNkZWZpbmUgU1lNX0ZMQUdfU0FNUExFRAkyCiAKIHN0cnVjdCBzeW1fZW50cnkgewogCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyOwotCWNoYXIgdHlwZTsKLQl1bnNpZ25lZCBjaGFyIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgbGVuOworCXVuc2lnbmVkIGludCBsZW47CiAJdW5zaWduZWQgY2hhciAqc3ltOwogfTsKIAogCiBzdGF0aWMgc3RydWN0IHN5bV9lbnRyeSAqdGFibGU7Ci1zdGF0aWMgaW50IHNpemUsIGNudDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGFibGVfc2l6ZSwgdGFibGVfY250Owogc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBfc3RleHQsIF9ldGV4dCwgX3Npbml0dGV4dCwgX2Vpbml0dGV4dCwgX3NleHRyYXRleHQsIF9lZXh0cmF0ZXh0Owogc3RhdGljIGludCBhbGxfc3ltYm9scyA9IDA7CiBzdGF0aWMgY2hhciBzeW1ib2xfcHJlZml4X2NoYXIgPSAnXDAnOwogCi1zdHJ1Y3QgdG9rZW4gewotCXVuc2lnbmVkIGNoYXIgZGF0YVtNQVhfVE9LX1NJWkVdOwotCXVuc2lnbmVkIGNoYXIgbGVuOwotCS8qIHByb2ZpdDogdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIGJlIHNhdmVkIGJ5IGluc2VydGluZyB0aGlzCi0JICogdG9rZW4gaW50byB0aGUgdGFibGUgKi8KLQlpbnQgcHJvZml0OwotCXN0cnVjdCB0b2tlbiAqbmV4dDsJLyogbmV4dCB0b2tlbiBvbiB0aGUgaGFzaCBsaXN0ICovCi0Jc3RydWN0IHRva2VuICpyaWdodDsJLyogbmV4dCB0b2tlbiBvbiB0aGUgZ29vZC9iYWQgbGlzdCAqLwotCXN0cnVjdCB0b2tlbiAqbGVmdDsgICAgLyogcHJldmlvdXMgdG9rZW4gb24gdGhlIGdvb2QvYmFkIGxpc3QgKi8KLQlzdHJ1Y3QgdG9rZW4gKnNtYWxsZXI7IC8qIHRva2VuIHRoYXQgaXMgbGVzcyBvbmUgbGV0dGVyIHRoYW4gdGhpcyBvbmUgKi8KLQl9OwotCi1zdHJ1Y3QgdG9rZW4gYmFkX2hlYWQsIGdvb2RfaGVhZDsKLXN0cnVjdCB0b2tlbiAqaGFzaF90YWJsZVtIQVNIX1RBQkxFX1NJWkVdOworaW50IHRva2VuX3Byb2ZpdFsweDEwMDAwXTsKIAogLyogdGhlIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHJlc3Npb24gKi8KLXVuc2lnbmVkIGNoYXIgYmVzdF90YWJsZVsyNTZdW01BWF9UT0tfU0laRSsxXTsKK3Vuc2lnbmVkIGNoYXIgYmVzdF90YWJsZVsyNTZdWzJdOwogdW5zaWduZWQgY2hhciBiZXN0X3RhYmxlX2xlblsyNTZdOwogCiAKLXN0YXRpYyB2b2lkCi11c2FnZSh2b2lkKQorc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKIHsKIAlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBrYWxsc3ltcyBbLS1hbGwtc3ltYm9sc10gWy0tc3ltYm9sLXByZWZpeD08cHJlZml4IGNoYXI+XSA8IGluLm1hcCA+IG91dC5TXG4iKTsKIAlleGl0KDEpOwpAQCAtMTAyLDIxICs2NCwxOSBAQAogICogVGhpcyBpZ25vcmVzIHRoZSBpbnRlbnNlbHkgYW5ub3lpbmcgIm1hcHBpbmcgc3ltYm9scyIgZm91bmQKICAqIGluIEFSTSBFTEYgZmlsZXM6ICRhLCAkdCBhbmQgJGQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1pc19hcm1fbWFwcGluZ19zeW1ib2woY29uc3QgY2hhciAqc3RyKQorc3RhdGljIGlubGluZSBpbnQgaXNfYXJtX21hcHBpbmdfc3ltYm9sKGNvbnN0IGNoYXIgKnN0cikKIHsKIAlyZXR1cm4gc3RyWzBdID09ICckJyAmJiBzdHJjaHIoImF0ZCIsIHN0clsxXSkKIAkgICAgICAgJiYgKHN0clsyXSA9PSAnXDAnIHx8IHN0clsyXSA9PSAnLicpOwogfQogCi1zdGF0aWMgaW50Ci1yZWFkX3N5bWJvbChGSUxFICppbiwgc3RydWN0IHN5bV9lbnRyeSAqcykKK3N0YXRpYyBpbnQgcmVhZF9zeW1ib2woRklMRSAqaW4sIHN0cnVjdCBzeW1fZW50cnkgKnMpCiB7CiAJY2hhciBzdHJbNTAwXTsKLQljaGFyICpzeW07CisJY2hhciAqc3ltLCBzdHlwZTsKIAlpbnQgcmM7CiAKLQlyYyA9IGZzY2FuZihpbiwgIiVsbHggJWMgJTQ5OXNcbiIsICZzLT5hZGRyLCAmcy0+dHlwZSwgc3RyKTsKKwlyYyA9IGZzY2FuZihpbiwgIiVsbHggJWMgJTQ5OXNcbiIsICZzLT5hZGRyLCAmc3R5cGUsIHN0cik7CiAJaWYgKHJjICE9IDMpIHsKIAkJaWYgKHJjICE9IEVPRikgewogCQkJLyogc2tpcCBsaW5lICovCkBAIC0xNDMsNyArMTAzLDcgQEAKIAkJX3NleHRyYXRleHQgPSBzLT5hZGRyOwogCWVsc2UgaWYgKHN0cmNtcChzeW0sICJfZWV4dHJhdGV4dCIpID09IDApCiAJCV9lZXh0cmF0ZXh0ID0gcy0+YWRkcjsKLQllbHNlIGlmICh0b3VwcGVyKHMtPnR5cGUpID09ICdBJykKKwllbHNlIGlmICh0b3VwcGVyKHN0eXBlKSA9PSAnQScpCiAJewogCQkvKiBLZWVwIHRoZXNlIHVzZWZ1bCBhYnNvbHV0ZSBzeW1ib2xzICovCiAJCWlmIChzdHJjbXAoc3ltLCAiX19rZXJuZWxfc3lzY2FsbF92aWFfYnJlYWsiKSAmJgpAQCAtMTUzLDIyICsxMTMsMjQgQEAKIAkJCXJldHVybiAtMTsKIAogCX0KLQllbHNlIGlmICh0b3VwcGVyKHMtPnR5cGUpID09ICdVJyB8fAorCWVsc2UgaWYgKHRvdXBwZXIoc3R5cGUpID09ICdVJyB8fAogCQkgaXNfYXJtX21hcHBpbmdfc3ltYm9sKHN5bSkpCiAJCXJldHVybiAtMTsKKwkvKiBleGNsdWRlIGFsc28gTUlQUyBFTEYgbG9jYWwgc3ltYm9scyAoJEwxMjMgaW5zdGVhZCBvZiAuTDEyMykgKi8KKwllbHNlIGlmIChzdHJbMF0gPT0gJyQnKQorCQlyZXR1cm4gLTE7CiAKIAkvKiBpbmNsdWRlIHRoZSB0eXBlIGZpZWxkIGluIHRoZSBzeW1ib2wgbmFtZSwgc28gdGhhdCBpdCBnZXRzCiAJICogY29tcHJlc3NlZCB0b2dldGhlciAqLwogCXMtPmxlbiA9IHN0cmxlbihzdHIpICsgMTsKLQlzLT5zeW0gPSAoY2hhciAqKSBtYWxsb2Mocy0+bGVuICsgMSk7Ci0Jc3RyY3B5KHMtPnN5bSArIDEsIHN0cik7Ci0Jcy0+c3ltWzBdID0gcy0+dHlwZTsKKwlzLT5zeW0gPSBtYWxsb2Mocy0+bGVuICsgMSk7CisJc3RyY3B5KChjaGFyICopcy0+c3ltICsgMSwgc3RyKTsKKwlzLT5zeW1bMF0gPSBzdHlwZTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1zeW1ib2xfdmFsaWQoc3RydWN0IHN5bV9lbnRyeSAqcykKK3N0YXRpYyBpbnQgc3ltYm9sX3ZhbGlkKHN0cnVjdCBzeW1fZW50cnkgKnMpCiB7CiAJLyogU3ltYm9scyB3aGljaCB2YXJ5IGJldHdlZW4gcGFzc2VzLiAgUGFzc2VzIDEgYW5kIDIgbXVzdCBoYXZlCiAJICogaWRlbnRpY2FsIHN5bWJvbCBsaXN0cy4gIFRoZSBrYWxsc3ltc18qIHN5bWJvbHMgYmVsb3cgYXJlIG9ubHkgYWRkZWQKQEAgLTIwNywzNyArMTY5LDM2IEBACiAJCSAqIG1vdmUgdGhlbiB0aGV5IG1heSBnZXQgZHJvcHBlZCBpbiBwYXNzIDIsIHdoaWNoIGJyZWFrcyB0aGUKIAkJICoga2FsbHN5bXMgcnVsZXMuCiAJCSAqLwotCQlpZiAoKHMtPmFkZHIgPT0gX2V0ZXh0ICYmIHN0cmNtcChzLT5zeW0gKyBvZmZzZXQsICJfZXRleHQiKSkgfHwKLQkJICAgIChzLT5hZGRyID09IF9laW5pdHRleHQgJiYgc3RyY21wKHMtPnN5bSArIG9mZnNldCwgIl9laW5pdHRleHQiKSkgfHwKLQkJICAgIChzLT5hZGRyID09IF9lZXh0cmF0ZXh0ICYmIHN0cmNtcChzLT5zeW0gKyBvZmZzZXQsICJfZWV4dHJhdGV4dCIpKSkKKwkJaWYgKChzLT5hZGRyID09IF9ldGV4dCAmJiBzdHJjbXAoKGNoYXIqKXMtPnN5bSArIG9mZnNldCwgIl9ldGV4dCIpKSB8fAorCQkgICAgKHMtPmFkZHIgPT0gX2Vpbml0dGV4dCAmJiBzdHJjbXAoKGNoYXIqKXMtPnN5bSArIG9mZnNldCwgIl9laW5pdHRleHQiKSkgfHwKKwkJICAgIChzLT5hZGRyID09IF9lZXh0cmF0ZXh0ICYmIHN0cmNtcCgoY2hhciopcy0+c3ltICsgb2Zmc2V0LCAiX2VleHRyYXRleHQiKSkpCiAJCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBFeGNsdWRlIHN5bWJvbHMgd2hpY2ggdmFyeSBiZXR3ZWVuIHBhc3Nlcy4gKi8KLQlpZiAoc3Ryc3RyKHMtPnN5bSArIG9mZnNldCwgIl9jb21waWxlZC4iKSkKKwlpZiAoc3Ryc3RyKChjaGFyICopcy0+c3ltICsgb2Zmc2V0LCAiX2NvbXBpbGVkLiIpKQogCQlyZXR1cm4gMDsKIAogCWZvciAoaSA9IDA7IHNwZWNpYWxfc3ltYm9sc1tpXTsgaSsrKQotCQlpZiggc3RyY21wKHMtPnN5bSArIG9mZnNldCwgc3BlY2lhbF9zeW1ib2xzW2ldKSA9PSAwICkKKwkJaWYoIHN0cmNtcCgoY2hhciAqKXMtPnN5bSArIG9mZnNldCwgc3BlY2lhbF9zeW1ib2xzW2ldKSA9PSAwICkKIAkJCXJldHVybiAwOwogCiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkCi1yZWFkX21hcChGSUxFICppbikKK3N0YXRpYyB2b2lkIHJlYWRfbWFwKEZJTEUgKmluKQogewogCXdoaWxlICghZmVvZihpbikpIHsKLQkJaWYgKGNudCA+PSBzaXplKSB7Ci0JCQlzaXplICs9IDEwMDAwOwotCQkJdGFibGUgPSByZWFsbG9jKHRhYmxlLCBzaXplb2YoKnRhYmxlKSAqIHNpemUpOworCQlpZiAodGFibGVfY250ID49IHRhYmxlX3NpemUpIHsKKwkJCXRhYmxlX3NpemUgKz0gMTAwMDA7CisJCQl0YWJsZSA9IHJlYWxsb2ModGFibGUsIHNpemVvZigqdGFibGUpICogdGFibGVfc2l6ZSk7CiAJCQlpZiAoIXRhYmxlKSB7CiAJCQkJZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5XG4iKTsKIAkJCQlleGl0ICgxKTsKIAkJCX0KIAkJfQotCQlpZiAocmVhZF9zeW1ib2woaW4sICZ0YWJsZVtjbnRdKSA9PSAwKQotCQkJY250Kys7CisJCWlmIChyZWFkX3N5bWJvbChpbiwgJnRhYmxlW3RhYmxlX2NudF0pID09IDApCisJCQl0YWJsZV9jbnQrKzsKIAl9CiB9CiAKQEAgLTI4MSwxMCArMjQyLDkgQEAKIAlyZXR1cm4gdG90YWw7CiB9CiAKLXN0YXRpYyB2b2lkCi13cml0ZV9zcmModm9pZCkKK3N0YXRpYyB2b2lkIHdyaXRlX3NyYyh2b2lkKQogewotCWludCBpLCBrLCBvZmYsIHZhbGlkOworCXVuc2lnbmVkIGludCBpLCBrLCBvZmY7CiAJdW5zaWduZWQgaW50IGJlc3RfaWR4WzI1Nl07CiAJdW5zaWduZWQgaW50ICptYXJrZXJzOwogCWNoYXIgYnVmW0tTWU1fTkFNRV9MRU4rMV07CkBAIC0zMDEsMzMgKzI2MSwyNCBAQAogCXByaW50ZigiLmRhdGFcbiIpOwogCiAJb3V0cHV0X2xhYmVsKCJrYWxsc3ltc19hZGRyZXNzZXMiKTsKLQl2YWxpZCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7Ci0JCWlmICh0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1ZBTElEKSB7Ci0JCQlwcmludGYoIlx0UFRSXHQlI2xseFxuIiwgdGFibGVbaV0uYWRkcik7Ci0JCQl2YWxpZCsrOwotCQl9CisJZm9yIChpID0gMDsgaSA8IHRhYmxlX2NudDsgaSsrKSB7CisJCXByaW50ZigiXHRQVFJcdCUjbGx4XG4iLCB0YWJsZVtpXS5hZGRyKTsKIAl9CiAJcHJpbnRmKCJcbiIpOwogCiAJb3V0cHV0X2xhYmVsKCJrYWxsc3ltc19udW1fc3ltcyIpOwotCXByaW50ZigiXHRQVFJcdCVkXG4iLCB2YWxpZCk7CisJcHJpbnRmKCJcdFBUUlx0JWRcbiIsIHRhYmxlX2NudCk7CiAJcHJpbnRmKCJcbiIpOwogCiAJLyogdGFibGUgb2Ygb2Zmc2V0IG1hcmtlcnMsIHRoYXQgZ2l2ZSB0aGUgb2Zmc2V0IGluIHRoZSBjb21wcmVzc2VkIHN0cmVhbQogCSAqIGV2ZXJ5IDI1NiBzeW1ib2xzICovCi0JbWFya2VycyA9ICh1bnNpZ25lZCBpbnQgKikgbWFsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpKigodmFsaWQgKyAyNTUpIC8gMjU2KSk7CisJbWFya2VycyA9ICh1bnNpZ25lZCBpbnQgKikgbWFsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpICogKCh0YWJsZV9jbnQgKyAyNTUpIC8gMjU2KSk7CiAKIAlvdXRwdXRfbGFiZWwoImthbGxzeW1zX25hbWVzIik7Ci0JdmFsaWQgPSAwOwogCW9mZiA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7Ci0KLQkJaWYgKCF0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1ZBTElEKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCh2YWxpZCAmIDB4RkYpID09IDApCi0JCQltYXJrZXJzW3ZhbGlkID4+IDhdID0gb2ZmOworCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9jbnQ7IGkrKykgeworCQlpZiAoKGkgJiAweEZGKSA9PSAwKQorCQkJbWFya2Vyc1tpID4+IDhdID0gb2ZmOwogCiAJCXByaW50ZigiXHQuYnl0ZSAweCUwMngiLCB0YWJsZVtpXS5sZW4pOwogCQlmb3IgKGsgPSAwOyBrIDwgdGFibGVbaV0ubGVuOyBrKyspCkBAIC0zMzUsMTIgKzI4NiwxMSBAQAogCQlwcmludGYoIlxuIik7CiAKIAkJb2ZmICs9IHRhYmxlW2ldLmxlbiArIDE7Ci0JCXZhbGlkKys7CiAJfQogCXByaW50ZigiXG4iKTsKIAogCW91dHB1dF9sYWJlbCgia2FsbHN5bXNfbWFya2VycyIpOwotCWZvciAoaSA9IDA7IGkgPCAoKHZhbGlkICsgMjU1KSA+PiA4KTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCAoKHRhYmxlX2NudCArIDI1NSkgPj4gOCk7IGkrKykKIAkJcHJpbnRmKCJcdFBUUlx0JWRcbiIsIG1hcmtlcnNbaV0pOwogCXByaW50ZigiXG4iKTsKIApAQCAtMzUwLDcgKzMwMCw3IEBACiAJb2ZmID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKIAkJYmVzdF9pZHhbaV0gPSBvZmY7Ci0JCWV4cGFuZF9zeW1ib2woYmVzdF90YWJsZVtpXSxiZXN0X3RhYmxlX2xlbltpXSxidWYpOworCQlleHBhbmRfc3ltYm9sKGJlc3RfdGFibGVbaV0sIGJlc3RfdGFibGVfbGVuW2ldLCBidWYpOwogCQlwcmludGYoIlx0LmFzY2l6XHRcIiVzXCJcbiIsIGJ1Zik7CiAJCW9mZiArPSBzdHJsZW4oYnVmKSArIDE7CiAJfQpAQCAtMzY1LDE1MyArMzE1LDEzIEBACiAKIC8qIHRhYmxlIGxvb2t1cCBjb21wcmVzc2lvbiBmdW5jdGlvbnMgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVoYXNoX3Rva2VuKHVuc2lnbmVkIGludCBoYXNoLCB1bnNpZ25lZCBjaGFyIGRhdGEpCi17Ci0JcmV0dXJuICgoaGFzaCAqIDE2Nzc3NjE5KSBeIGRhdGEpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfdG9rZW4odW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKLXsKLQl1bnNpZ25lZCBpbnQgaGFzaD1IQVNIX0JBU0VfT0ZGU0VUOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQloYXNoID0gcmVoYXNoX3Rva2VuKGhhc2gsIGRhdGFbaV0pOwotCi0JcmV0dXJuIEhBU0hfRk9MRChoYXNoKTsKLX0KLQotLyogZmluZCBhIHRva2VuIGdpdmVuIGl0cyBkYXRhIGFuZCBoYXNoIHZhbHVlICovCi1zdGF0aWMgc3RydWN0IHRva2VuICpmaW5kX3Rva2VuX2hhc2godW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbiwgdW5zaWduZWQgaW50IGhhc2gpCi17Ci0Jc3RydWN0IHRva2VuICpwdHI7Ci0KLQlwdHIgPSBoYXNoX3RhYmxlW2hhc2hdOwotCi0Jd2hpbGUgKHB0cikgewotCQlpZiAoKHB0ci0+bGVuID09IGxlbikgJiYgKG1lbWNtcChwdHItPmRhdGEsIGRhdGEsIGxlbikgPT0gMCkpCi0JCQlyZXR1cm4gcHRyOwotCQlwdHI9cHRyLT5uZXh0OwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5zZXJ0X3Rva2VuX2luX2dyb3VwKHN0cnVjdCB0b2tlbiAqaGVhZCwgc3RydWN0IHRva2VuICpwdHIpCi17Ci0JcHRyLT5yaWdodCA9IGhlYWQtPnJpZ2h0OwotCXB0ci0+cmlnaHQtPmxlZnQgPSBwdHI7Ci0JaGVhZC0+cmlnaHQgPSBwdHI7Ci0JcHRyLT5sZWZ0ID0gaGVhZDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV90b2tlbl9mcm9tX2dyb3VwKHN0cnVjdCB0b2tlbiAqcHRyKQotewotCXB0ci0+bGVmdC0+cmlnaHQgPSBwdHItPnJpZ2h0OwotCXB0ci0+cmlnaHQtPmxlZnQgPSBwdHItPmxlZnQ7Ci19Ci0KLQotLyogYnVpbGQgdGhlIGNvdW50cyBmb3IgYWxsIHRoZSB0b2tlbnMgdGhhdCBzdGFydCB3aXRoICJkYXRhIiwgYW5kIGhhdmUgbGVuZ2h0cwotICogZnJvbSAyIHRvICJsZW4iICovCi1zdGF0aWMgdm9pZCBsZWFybl90b2tlbih1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKQotewotCXN0cnVjdCB0b2tlbiAqcHRyLCpsYXN0X3B0cjsKLQlpbnQgaSwgbmV3cHJvZml0OwotCXVuc2lnbmVkIGludCBoYXNoID0gSEFTSF9CQVNFX09GRlNFVDsKLQl1bnNpZ25lZCBpbnQgaGFzaGVzW01BWF9UT0tfU0laRSArIDFdOwotCi0JaWYgKGxlbiA+IE1BWF9UT0tfU0laRSkKLQkJbGVuID0gTUFYX1RPS19TSVpFOwotCi0JLyogY2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgaGFzaCB2YWx1ZXMgZm9yIGFsbCB0aGUgc3ViLXRva2VucyAqLwotCWhhc2ggPSByZWhhc2hfdG9rZW4oaGFzaCwgZGF0YVswXSk7Ci0JZm9yIChpID0gMjsgaSA8PSBsZW47IGkrKykgewotCQloYXNoID0gcmVoYXNoX3Rva2VuKGhhc2gsIGRhdGFbaS0xXSk7Ci0JCWhhc2hlc1tpXSA9IEhBU0hfRk9MRChoYXNoKTsKLQl9Ci0KLQlsYXN0X3B0ciA9IE5VTEw7Ci0JcHRyID0gTlVMTDsKLQotCWZvciAoaSA9IGxlbjsgaSA+PSAyOyBpLS0pIHsKLQkJaGFzaCA9IGhhc2hlc1tpXTsKLQotCQlpZiAoIXB0cikgcHRyID0gZmluZF90b2tlbl9oYXNoKGRhdGEsIGksIGhhc2gpOwotCi0JCWlmICghcHRyKSB7Ci0JCQkvKiBjcmVhdGUgYSBuZXcgdG9rZW4gZW50cnkgKi8KLQkJCXB0ciA9IChzdHJ1Y3QgdG9rZW4gKikgbWFsbG9jKHNpemVvZigqcHRyKSk7Ci0KLQkJCW1lbWNweShwdHItPmRhdGEsIGRhdGEsIGkpOwotCQkJcHRyLT5sZW4gPSBpOwotCi0JCQkvKiB3aGVuIHdlIGNyZWF0ZSBhbiBlbnRyeSwgaXQncyBwcm9maXQgaXMgMCBiZWNhdXNlCi0JCQkgKiB3ZSBhbHNvIHRha2UgaW50byBhY2NvdW50IHRoZSBzaXplIG9mIHRoZSB0b2tlbiBvbgotCQkJICogdGhlIGNvbXByZXNzZWQgdGFibGUuIFdlIHRoZW4gc3VidHJhY3QgR09PRF9CQURfVEhSRVNIT0xECi0JCQkgKiBzbyB0aGF0IHRoZSB0ZXN0IHRvIHNlZSBpZiB0aGlzIHRva2VuIGJlbG9uZ3MgdG8KLQkJCSAqIHRoZSBnb29kIG9yIGJhZCBsaXN0LCBpcyBhIGNvbXBhcmlzb24gdG8gemVybyAqLwotCQkJcHRyLT5wcm9maXQgPSAtR09PRF9CQURfVEhSRVNIT0xEOwotCi0JCQlwdHItPm5leHQgPSBoYXNoX3RhYmxlW2hhc2hdOwotCQkJaGFzaF90YWJsZVtoYXNoXSA9IHB0cjsKLQotCQkJaW5zZXJ0X3Rva2VuX2luX2dyb3VwKCZiYWRfaGVhZCwgcHRyKTsKLQotCQkJcHRyLT5zbWFsbGVyID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCW5ld3Byb2ZpdCA9IHB0ci0+cHJvZml0ICsgKHB0ci0+bGVuIC0gMSk7Ci0JCQkvKiBjaGVjayB0byBzZWUgaWYgdGhpcyB0b2tlbiBuZWVkcyB0byBiZSBtb3ZlZCB0byBhCi0JCQkgKiBkaWZmZXJlbnQgbGlzdCAqLwotCQkJaWYoKHB0ci0+cHJvZml0IDwgMCkgJiYgKG5ld3Byb2ZpdCA+PSAwKSkgewotCQkJCXJlbW92ZV90b2tlbl9mcm9tX2dyb3VwKHB0cik7Ci0JCQkJaW5zZXJ0X3Rva2VuX2luX2dyb3VwKCZnb29kX2hlYWQscHRyKTsKLQkJCX0KLQkJCXB0ci0+cHJvZml0ID0gbmV3cHJvZml0OwotCQl9Ci0KLQkJaWYgKGxhc3RfcHRyKSBsYXN0X3B0ci0+c21hbGxlciA9IHB0cjsKLQkJbGFzdF9wdHIgPSBwdHI7Ci0KLQkJcHRyID0gcHRyLT5zbWFsbGVyOwotCX0KLX0KLQotLyogZGVjcmVhc2UgdGhlIGNvdW50cyBmb3IgYWxsIHRoZSB0b2tlbnMgdGhhdCBzdGFydCB3aXRoICJkYXRhIiwgYW5kIGhhdmUgbGVuZ2h0cwotICogZnJvbSAyIHRvICJsZW4iLiBUaGlzIGZ1bmN0aW9uIGlzIG11Y2ggc2ltcGxlciB0aGFuIGxlYXJuX3Rva2VuIGJlY2F1c2Ugd2UgaGF2ZQotICogbW9yZSBndWFyYW50ZWVzICh0aG8gdG9rZW5zIGV4aXN0LCB0aGUgLT5zbWFsbGVyIHBvaW50ZXIgaXMgc2V0LCBldGMuKQotICogVGhlIHR3byBzZXBhcmF0ZSBmdW5jdGlvbnMgZXhpc3Qgb25seSBiZWNhdXNlIG9mIGNvbXByZXNzaW9uIHBlcmZvcm1hbmNlICovCi1zdGF0aWMgdm9pZCBmb3JnZXRfdG9rZW4odW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKLXsKLQlzdHJ1Y3QgdG9rZW4gKnB0cjsKLQlpbnQgaSwgbmV3cHJvZml0OwotCXVuc2lnbmVkIGludCBoYXNoPTA7Ci0KLQlpZiAobGVuID4gTUFYX1RPS19TSVpFKSBsZW4gPSBNQVhfVE9LX1NJWkU7Ci0KLQloYXNoID0gaGFzaF90b2tlbihkYXRhLCBsZW4pOwotCXB0ciA9IGZpbmRfdG9rZW5faGFzaChkYXRhLCBsZW4sIGhhc2gpOwotCi0JZm9yIChpID0gbGVuOyBpID49IDI7IGktLSkgewotCi0JCW5ld3Byb2ZpdCA9IHB0ci0+cHJvZml0IC0gKHB0ci0+bGVuIC0gMSk7Ci0JCWlmICgocHRyLT5wcm9maXQgPj0gMCkgJiYgKG5ld3Byb2ZpdCA8IDApKSB7Ci0JCQlyZW1vdmVfdG9rZW5fZnJvbV9ncm91cChwdHIpOwotCQkJaW5zZXJ0X3Rva2VuX2luX2dyb3VwKCZiYWRfaGVhZCwgcHRyKTsKLQkJfQotCQlwdHItPnByb2ZpdD1uZXdwcm9maXQ7Ci0KLQkJcHRyPXB0ci0+c21hbGxlcjsKLQl9Ci19Ci0KIC8qIGNvdW50IGFsbCB0aGUgcG9zc2libGUgdG9rZW5zIGluIGEgc3ltYm9sICovCiBzdGF0aWMgdm9pZCBsZWFybl9zeW1ib2wodW5zaWduZWQgY2hhciAqc3ltYm9sLCBpbnQgbGVuKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykKLQkJbGVhcm5fdG9rZW4oc3ltYm9sICsgaSwgbGVuIC0gaSk7CisJCXRva2VuX3Byb2ZpdFsgc3ltYm9sW2ldICsgKHN5bWJvbFtpICsgMV0gPDwgOCkgXSsrOwogfQogCiAvKiBkZWNyZWFzZSB0aGUgY291bnQgZm9yIGFsbCB0aGUgcG9zc2libGUgdG9rZW5zIGluIGEgc3ltYm9sICovCkBAIC01MjAsMTE3ICszMzAsOTAgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspCi0JCWZvcmdldF90b2tlbihzeW1ib2wgKyBpLCBsZW4gLSBpKTsKKwkJdG9rZW5fcHJvZml0WyBzeW1ib2xbaV0gKyAoc3ltYm9sW2kgKyAxXSA8PCA4KSBdLS07CiB9CiAKLS8qIHNldCBhbGwgdGhlIHN5bWJvbCBmbGFncyBhbmQgZG8gdGhlIGluaXRpYWwgdG9rZW4gY291bnQgKi8KKy8qIHJlbW92ZSBhbGwgdGhlIGludmFsaWQgc3ltYm9scyBmcm9tIHRoZSB0YWJsZSBhbmQgZG8gdGhlIGluaXRpYWwgdG9rZW4gY291bnQgKi8KIHN0YXRpYyB2b2lkIGJ1aWxkX2luaXRpYWxfdG9rX3RhYmxlKHZvaWQpCiB7Ci0JaW50IGksIHVzZV9pdCwgdmFsaWQ7CisJdW5zaWduZWQgaW50IGksIHBvczsKIAotCXZhbGlkID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKLQkJdGFibGVbaV0uZmxhZ3MgPSAwOworCXBvcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IHRhYmxlX2NudDsgaSsrKSB7CiAJCWlmICggc3ltYm9sX3ZhbGlkKCZ0YWJsZVtpXSkgKSB7Ci0JCQl0YWJsZVtpXS5mbGFncyB8PSBTWU1fRkxBR19WQUxJRDsKLQkJCXZhbGlkKys7CisJCQlpZiAocG9zICE9IGkpCisJCQkJdGFibGVbcG9zXSA9IHRhYmxlW2ldOworCQkJbGVhcm5fc3ltYm9sKHRhYmxlW3Bvc10uc3ltLCB0YWJsZVtwb3NdLmxlbik7CisJCQlwb3MrKzsKIAkJfQogCX0KLQotCXVzZV9pdCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7Ci0KLQkJLyogc3Vic2FtcGxlIHRoZSBhdmFpbGFibGUgc3ltYm9scy4gVGhpcyBtZXRob2QgaXMgYWxtb3N0IGxpa2UKLQkJICogYSBCcmVzZW5oYW0ncyBhbGdvcml0aG0gdG8gZ2V0IHVuaWZvcm1seSBkaXN0cmlidXRlZCBzYW1wbGVzCi0JCSAqIGFjcm9zcyB0aGUgc3ltYm9sIHRhYmxlICovCi0JCWlmICh0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1ZBTElEKSB7Ci0KLQkJCXVzZV9pdCArPSBXT1JLSU5HX1NFVDsKLQotCQkJaWYgKHVzZV9pdCA+PSB2YWxpZCkgewotCQkJCXRhYmxlW2ldLmZsYWdzIHw9IFNZTV9GTEFHX1NBTVBMRUQ7Ci0JCQkJdXNlX2l0IC09IHZhbGlkOwotCQkJfQotCQl9Ci0JCWlmICh0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1NBTVBMRUQpCi0JCQlsZWFybl9zeW1ib2wodGFibGVbaV0uc3ltLCB0YWJsZVtpXS5sZW4pOwotCX0KKwl0YWJsZV9jbnQgPSBwb3M7CiB9CiAKIC8qIHJlcGxhY2UgYSBnaXZlbiB0b2tlbiBpbiBhbGwgdGhlIHZhbGlkIHN5bWJvbHMuIFVzZSB0aGUgc2FtcGxlZCBzeW1ib2xzCiAgKiB0byB1cGRhdGUgdGhlIGNvdW50cyAqLwotc3RhdGljIHZvaWQgY29tcHJlc3Nfc3ltYm9scyh1bnNpZ25lZCBjaGFyICpzdHIsIGludCB0bGVuLCBpbnQgaWR4KQorc3RhdGljIHZvaWQgY29tcHJlc3Nfc3ltYm9scyh1bnNpZ25lZCBjaGFyICpzdHIsIGludCBpZHgpCiB7Ci0JaW50IGksIGxlbiwgbGVhcm4sIHNpemU7Ci0JdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBpbnQgaSwgbGVuLCBzaXplOworCXVuc2lnbmVkIGNoYXIgKnAxLCAqcDI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKLQotCQlpZiAoISh0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1ZBTElEKSkgY29udGludWU7CisJZm9yIChpID0gMDsgaSA8IHRhYmxlX2NudDsgaSsrKSB7CiAKIAkJbGVuID0gdGFibGVbaV0ubGVuOwotCQlsZWFybiA9IDA7Ci0JCXAgPSB0YWJsZVtpXS5zeW07CisJCXAxID0gdGFibGVbaV0uc3ltOworCisJCS8qIGZpbmQgdGhlIHRva2VuIG9uIHRoZSBzeW1ib2wgKi8KKwkJcDIgPSBtZW1tZW0ocDEsIGxlbiwgc3RyLCAyKTsKKwkJaWYgKCFwMikgY29udGludWU7CisKKwkJLyogZGVjcmVhc2UgdGhlIGNvdW50cyBmb3IgdGhpcyBzeW1ib2wncyB0b2tlbnMgKi8KKwkJZm9yZ2V0X3N5bWJvbCh0YWJsZVtpXS5zeW0sIGxlbik7CisKKwkJc2l6ZSA9IGxlbjsKIAogCQlkbyB7CisJCQkqcDIgPSBpZHg7CisJCQlwMisrOworCQkJc2l6ZSAtPSAocDIgLSBwMSk7CisJCQltZW1tb3ZlKHAyLCBwMiArIDEsIHNpemUpOworCQkJcDEgPSBwMjsKKwkJCWxlbi0tOworCisJCQlpZiAoc2l6ZSA8IDIpIGJyZWFrOworCiAJCQkvKiBmaW5kIHRoZSB0b2tlbiBvbiB0aGUgc3ltYm9sICovCi0JCQlwID0gKHVuc2lnbmVkIGNoYXIgKikgc3Ryc3RyKChjaGFyICopIHAsIChjaGFyICopIHN0cik7Ci0JCQlpZiAoIXApIGJyZWFrOworCQkJcDIgPSBtZW1tZW0ocDEsIHNpemUsIHN0ciwgMik7CiAKLQkJCWlmICghbGVhcm4pIHsKLQkJCQkvKiBpZiB0aGlzIHN5bWJvbCB3YXMgdXNlZCB0byBjb3VudCwgZGVjcmVhc2UgaXQgKi8KLQkJCQlpZiAodGFibGVbaV0uZmxhZ3MgJiBTWU1fRkxBR19TQU1QTEVEKQotCQkJCQlmb3JnZXRfc3ltYm9sKHRhYmxlW2ldLnN5bSwgbGVuKTsKLQkJCQlsZWFybiA9IDE7Ci0JCQl9CisJCX0gd2hpbGUgKHAyKTsKIAotCQkJKnAgPSBpZHg7Ci0JCQlzaXplID0gKGxlbiAtIChwIC0gdGFibGVbaV0uc3ltKSkgLSB0bGVuICsgMTsKLQkJCW1lbW1vdmUocCArIDEsIHAgKyB0bGVuLCBzaXplKTsKLQkJCXArKzsKLQkJCWxlbiAtPSB0bGVuIC0gMTsKKwkJdGFibGVbaV0ubGVuID0gbGVuOwogCi0JCX0gd2hpbGUgKHNpemUgPj0gdGxlbik7Ci0KLQkJaWYobGVhcm4pIHsKLQkJCXRhYmxlW2ldLmxlbiA9IGxlbjsKLQkJCS8qIGlmIHRoaXMgc3ltYm9sIHdhcyB1c2VkIHRvIGNvdW50LCBsZWFybiBpdCBhZ2FpbiAqLwotCQkJaWYodGFibGVbaV0uZmxhZ3MgJiBTWU1fRkxBR19TQU1QTEVEKQotCQkJCWxlYXJuX3N5bWJvbCh0YWJsZVtpXS5zeW0sIGxlbik7Ci0JCX0KKwkJLyogaW5jcmVhc2UgdGhlIGNvdW50cyBmb3IgdGhpcyBzeW1ib2wncyBuZXcgdG9rZW5zICovCisJCWxlYXJuX3N5bWJvbCh0YWJsZVtpXS5zeW0sIGxlbik7CiAJfQogfQogCiAvKiBzZWFyY2ggdGhlIHRva2VuIHdpdGggdGhlIG1heGltdW0gcHJvZml0ICovCi1zdGF0aWMgc3RydWN0IHRva2VuICpmaW5kX2Jlc3RfdG9rZW4odm9pZCkKK3N0YXRpYyBpbnQgZmluZF9iZXN0X3Rva2VuKHZvaWQpCiB7Ci0Jc3RydWN0IHRva2VuICpwdHIsKmJlc3QsKmhlYWQ7Ci0JaW50IGJlc3Rwcm9maXQ7CisJaW50IGksIGJlc3QsIGJlc3Rwcm9maXQ7CiAKIAliZXN0cHJvZml0PS0xMDAwMDsKKwliZXN0ID0gMDsKIAotCS8qIGZhaWxzYWZlOiBpZiB0aGUgImdvb2QiIGxpc3QgaXMgZW1wdHkgc2VhcmNoIGZyb20gdGhlICJiYWQiIGxpc3QgKi8KLQlpZihnb29kX2hlYWQucmlnaHQgPT0gJmdvb2RfaGVhZCkgaGVhZCA9ICZiYWRfaGVhZDsKLQllbHNlIGhlYWQgPSAmZ29vZF9oZWFkOwotCi0JcHRyID0gaGVhZC0+cmlnaHQ7Ci0JYmVzdCA9IE5VTEw7Ci0Jd2hpbGUgKHB0ciAhPSBoZWFkKSB7Ci0JCWlmIChwdHItPnByb2ZpdCA+IGJlc3Rwcm9maXQpIHsKLQkJCWJlc3Rwcm9maXQgPSBwdHItPnByb2ZpdDsKLQkJCWJlc3QgPSBwdHI7CisJZm9yIChpID0gMDsgaSA8IDB4MTAwMDA7IGkrKykgeworCQlpZiAodG9rZW5fcHJvZml0W2ldID4gYmVzdHByb2ZpdCkgeworCQkJYmVzdCA9IGk7CisJCQliZXN0cHJvZml0ID0gdG9rZW5fcHJvZml0W2ldOwogCQl9Ci0JCXB0ciA9IHB0ci0+cmlnaHQ7CiAJfQotCiAJcmV0dXJuIGJlc3Q7CiB9CiAKIC8qIHRoaXMgaXMgdGhlIGNvcmUgb2YgdGhlIGFsZ29yaXRobTogY2FsY3VsYXRlIHRoZSAiYmVzdCIgdGFibGUgKi8KIHN0YXRpYyB2b2lkIG9wdGltaXplX3Jlc3VsdCh2b2lkKQogewotCXN0cnVjdCB0b2tlbiAqYmVzdDsKLQlpbnQgaTsKKwlpbnQgaSwgYmVzdDsKIAogCS8qIHVzaW5nIHRoZSAnXDAnIHN5bWJvbCBsYXN0IGFsbG93cyBjb21wcmVzc19zeW1ib2xzIHRvIHVzZSBzdGFuZGFyZAogCSAqIGZhc3Qgc3RyaW5nIGZ1bmN0aW9ucyAqLwpAQCAtNjQ0LDE0ICs0MjcsMTIgQEAKIAkJCWJlc3QgPSBmaW5kX2Jlc3RfdG9rZW4oKTsKIAogCQkJLyogcGxhY2UgaXQgaW4gdGhlICJiZXN0IiB0YWJsZSAqLwotCQkJYmVzdF90YWJsZV9sZW5baV0gPSBiZXN0LT5sZW47Ci0JCQltZW1jcHkoYmVzdF90YWJsZVtpXSwgYmVzdC0+ZGF0YSwgYmVzdF90YWJsZV9sZW5baV0pOwotCQkJLyogemVybyB0ZXJtaW5hdGUgdGhlIHRva2VuIHNvIHRoYXQgd2UgY2FuIHVzZSBzdHJzdHIKLQkJCSAgIGluIGNvbXByZXNzX3N5bWJvbHMgKi8KLQkJCWJlc3RfdGFibGVbaV1bYmVzdF90YWJsZV9sZW5baV1dPSdcMCc7CisJCQliZXN0X3RhYmxlX2xlbltpXSA9IDI7CisJCQliZXN0X3RhYmxlW2ldWzBdID0gYmVzdCAmIDB4RkY7CisJCQliZXN0X3RhYmxlW2ldWzFdID0gKGJlc3QgPj4gOCkgJiAweEZGOwogCiAJCQkvKiByZXBsYWNlIHRoaXMgdG9rZW4gaW4gYWxsIHRoZSB2YWxpZCBzeW1ib2xzICovCi0JCQljb21wcmVzc19zeW1ib2xzKGJlc3RfdGFibGVbaV0sIGJlc3RfdGFibGVfbGVuW2ldLCBpKTsKKwkJCWNvbXByZXNzX3N5bWJvbHMoYmVzdF90YWJsZVtpXSwgaSk7CiAJCX0KIAl9CiB9CkBAIC02NTksMzkgKzQ0MCwyOCBAQAogLyogc3RhcnQgYnkgcGxhY2luZyB0aGUgc3ltYm9scyB0aGF0IGFyZSBhY3R1YWxseSB1c2VkIG9uIHRoZSB0YWJsZSAqLwogc3RhdGljIHZvaWQgaW5zZXJ0X3JlYWxfc3ltYm9sc19pbl90YWJsZSh2b2lkKQogewotCWludCBpLCBqLCBjOworCXVuc2lnbmVkIGludCBpLCBqLCBjOwogCiAJbWVtc2V0KGJlc3RfdGFibGUsIDAsIHNpemVvZihiZXN0X3RhYmxlKSk7CiAJbWVtc2V0KGJlc3RfdGFibGVfbGVuLCAwLCBzaXplb2YoYmVzdF90YWJsZV9sZW4pKTsKIAotCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgewotCQlpZiAodGFibGVbaV0uZmxhZ3MgJiBTWU1fRkxBR19WQUxJRCkgewotCQkJZm9yIChqID0gMDsgaiA8IHRhYmxlW2ldLmxlbjsgaisrKSB7Ci0JCQkJYyA9IHRhYmxlW2ldLnN5bVtqXTsKLQkJCQliZXN0X3RhYmxlW2NdWzBdPWM7Ci0JCQkJYmVzdF90YWJsZV9sZW5bY109MTsKLQkJCX0KKwlmb3IgKGkgPSAwOyBpIDwgdGFibGVfY250OyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IHRhYmxlW2ldLmxlbjsgaisrKSB7CisJCQljID0gdGFibGVbaV0uc3ltW2pdOworCQkJYmVzdF90YWJsZVtjXVswXT1jOworCQkJYmVzdF90YWJsZV9sZW5bY109MTsKIAkJfQogCX0KIH0KIAogc3RhdGljIHZvaWQgb3B0aW1pemVfdG9rZW5fdGFibGUodm9pZCkKIHsKLQltZW1zZXQoaGFzaF90YWJsZSwgMCwgc2l6ZW9mKGhhc2hfdGFibGUpKTsKLQotCWdvb2RfaGVhZC5sZWZ0ID0gJmdvb2RfaGVhZDsKLQlnb29kX2hlYWQucmlnaHQgPSAmZ29vZF9oZWFkOwotCi0JYmFkX2hlYWQubGVmdCA9ICZiYWRfaGVhZDsKLQliYWRfaGVhZC5yaWdodCA9ICZiYWRfaGVhZDsKLQogCWJ1aWxkX2luaXRpYWxfdG9rX3RhYmxlKCk7CiAKIAlpbnNlcnRfcmVhbF9zeW1ib2xzX2luX3RhYmxlKCk7CiAKIAkvKiBXaGVuIHZhbGlkIHN5bWJvbCBpcyBub3QgcmVnaXN0ZXJlZCwgZXhpdCB0byBlcnJvciAqLwotCWlmIChnb29kX2hlYWQubGVmdCA9PSBnb29kX2hlYWQucmlnaHQgJiYKLQkgICAgYmFkX2hlYWQubGVmdCA9PSBiYWRfaGVhZC5yaWdodCkgeworCWlmICghdGFibGVfY250KSB7CiAJCWZwcmludGYoc3RkZXJyLCAiTm8gdmFsaWQgc3ltYm9sLlxuIik7CiAJCWV4aXQoMSk7CiAJfQpAQCAtNzAwLDggKzQ3MCw3IEBACiB9CiAKIAotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKIAlpZiAoYXJnYyA+PSAyKSB7CiAJCWludCBpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCmluZGV4IDA5YWJiODkuLjJmY2IyNDQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQorKysgYi9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKQEAgLTI3LDggKzI3LDIwIEBACiAJeGdldHRleHQgLS1kZWZhdWx0LWRvbWFpbj1saW51eCBcCiAgICAgICAgICAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKICAgICAgICAgICAtLWZpbGVzLWZyb209c2NyaXB0cy9rY29uZmlnL1BPVEZJTEVTLmluIFwKLQktbyBzY3JpcHRzL2tjb25maWcvbGludXgucG90Ci0Jc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dCBhcmNoLyQoQVJDSCkvS2NvbmZpZyA+PiBzY3JpcHRzL2tjb25maWcvbGludXgucG90CisgICAgICAgICAgLS1vdXRwdXQgc2NyaXB0cy9rY29uZmlnL2NvbmZpZy5wb3QKKwkkKFEpbG4gLWZzIEtjb25maWdfaTM4NiBhcmNoL3VtL0tjb25maWdfYXJjaAorCSQoUSlmb3IgaSBpbiBgbHMgYXJjaC9gOyBcCisJZG8gXAorCSAgc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dCBhcmNoLyQkaS9LY29uZmlnIFwKKwkgICAgfCBtc2d1bmlxIC1vIHNjcmlwdHMva2NvbmZpZy9saW51eF8kJHtpfS5wb3Q7IFwKKwlkb25lCisJJChRKW1zZ2NhdCBzY3JpcHRzL2tjb25maWcvY29uZmlnLnBvdCBcCisJICBgZmluZCBzY3JpcHRzL2tjb25maWcvIC10eXBlIGYgLW5hbWUgbGludXhfKi5wb3RgIFwKKwkgIC0tb3V0cHV0IHNjcmlwdHMva2NvbmZpZy9saW51eF9yYXcucG90CisJJChRKW1zZ3VuaXEgLS1zb3J0LWJ5LWZpbGUgc2NyaXB0cy9rY29uZmlnL2xpbnV4X3Jhdy5wb3QgXAorCSAgICAtLW91dHB1dCBzY3JpcHRzL2tjb25maWcvbGludXgucG90CisJJChRKXJtIC1mIGFyY2gvdW0vS2NvbmZpZ19hcmNoCisJJChRKXJtIC1mIHNjcmlwdHMva2NvbmZpZy9saW51eF8qLnBvdCBzY3JpcHRzL2tjb25maWcvY29uZmlnLnBvdAogCiAuUEhPTlk6IHJhbmRjb25maWcgYWxseWVzY29uZmlnIGFsbG5vY29uZmlnIGFsbG1vZGNvbmZpZyBkZWZjb25maWcKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dC5jIGIvc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dC5jCmluZGV4IDFjODhkN2MuLmFiZWU1NWMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9reGdldHRleHQuYworKysgYi9zY3JpcHRzL2tjb25maWcva3hnZXR0ZXh0LmMKQEAgLTE0LDYgKzE0LDExIEBACiB7CiAJY2hhciAqYmZwID0gYmY7CiAJaW50IG11bHRpbGluZSA9IHN0cmNocih0ZXh0LCAnXG4nKSAhPSBOVUxMOworCWludCBlb2wgPSAwOworCWludCB0ZXh0bGVuID0gc3RybGVuKHRleHQpOworCisJaWYgKCh0ZXh0bGVuID4gMCkgJiYgKHRleHRbdGV4dGxlbi0xXSA9PSAnXG4nKSkKKwkJZW9sID0gMTsKIAogCSpiZnArKyA9ICciJzsKIAktLWxlbjsKQEAgLTQzLDcgKzQ4LDcgQEAKIAkJLS1sZW47CiAJfQogCi0JaWYgKG11bHRpbGluZSkKKwlpZiAobXVsdGlsaW5lICYmIGVvbCkKIAkJYmZwIC09IDM7CiAKIAkqYmZwKysgPSAnIic7CkBAIC0xNzksNyArMTg0LDExIEBACiB7CiAJc3RydWN0IGZpbGVfbGluZSAqZmwgPSBzZWxmLT5maWxlczsKIAotCXByaW50ZigiXG4jOiAlczolZCIsIGZsLT5maWxlLCBmbC0+bGluZW5vKTsKKwlwdXRjaGFyKCdcbicpOworCWlmIChzZWxmLT5vcHRpb24gIT0gTlVMTCkKKwkJcHJpbnRmKCIjICVzOjAwMDAwXG4iLCBzZWxmLT5vcHRpb24pOworCisJcHJpbnRmKCIjOiAlczolZCIsIGZsLT5maWxlLCBmbC0+bGluZW5vKTsKIAlmbCA9IGZsLT5uZXh0OwogCiAJd2hpbGUgKGZsICE9IE5VTEwpIHsKQEAgLTE4Nyw5ICsxOTYsNiBAQAogCQlmbCA9IGZsLT5uZXh0OwogCX0KIAotCWlmIChzZWxmLT5vcHRpb24gIT0gTlVMTCkKLQkJcHJpbnRmKCIsICVzOjAwMDAwIiwgc2VsZi0+b3B0aW9uKTsKLQogCXB1dGNoYXIoJ1xuJyk7CiB9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sa2MuaCBiL3NjcmlwdHMva2NvbmZpZy9sa2MuaAppbmRleCA4Yjg0YzQyLi5jM2QyNTc4IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbGtjLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2xrYy5oCkBAIC01OSw3ICs1OSw3IEBACiB2b2lkIG1lbnVfZW5kX2VudHJ5KHZvaWQpOwogdm9pZCBtZW51X2FkZF9kZXAoc3RydWN0IGV4cHIgKmRlcCk7CiBzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb3AoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZXhwciwgc3RydWN0IGV4cHIgKmRlcCk7Ci12b2lkIG1lbnVfYWRkX3Byb21wdChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpkZXApOworc3RydWN0IHByb3BlcnR5ICptZW51X2FkZF9wcm9tcHQoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZGVwKTsKIHZvaWQgbWVudV9hZGRfZXhwcihlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqZXhwciwgc3RydWN0IGV4cHIgKmRlcCk7CiB2b2lkIG1lbnVfYWRkX3N5bWJvbChlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBleHByICpkZXApOwogdm9pZCBtZW51X2ZpbmFsaXplKHN0cnVjdCBtZW51ICpwYXJlbnQpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL21lbnUuYyBiL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKaW5kZXggOGM1OWIyMS4uNWNmYTZjNCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL21lbnUuYworKysgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCkBAIC0xMzYsOSArMTM2LDkgQEAKIAlyZXR1cm4gcHJvcDsKIH0KIAotdm9pZCBtZW51X2FkZF9wcm9tcHQoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZGVwKQorc3RydWN0IHByb3BlcnR5ICptZW51X2FkZF9wcm9tcHQoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZGVwKQogewotCW1lbnVfYWRkX3Byb3AodHlwZSwgcHJvbXB0LCBOVUxMLCBkZXApOworCXJldHVybiBtZW51X2FkZF9wcm9wKHR5cGUsIHByb21wdCwgTlVMTCwgZGVwKTsKIH0KIAogdm9pZCBtZW51X2FkZF9leHByKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBleHByICpleHByLCBzdHJ1Y3QgZXhwciAqZGVwKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQgYi9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZAppbmRleCBmMTYzZDhkLi5mZjRmY2MwIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZAorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZApAQCAtMTUzMSw3ICsxNTMxLDcgQEAKIAogICAgIHsKIAltZW51X2FkZF9lbnRyeShOVUxMKTsKLQltZW51X2FkZF9wcm9wKFBfTUVOVSwgeXl2c3BbLTFdLnN0cmluZywgTlVMTCwgTlVMTCk7CisJbWVudV9hZGRfcHJvbXB0KFBfTUVOVSwgeXl2c3BbLTFdLnN0cmluZywgTlVMTCk7CiAJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6bWVudVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CiA7fQogICAgIGJyZWFrOwpAQCAtMTU4Niw3ICsxNTg2LDcgQEAKIAogICAgIHsKIAltZW51X2FkZF9lbnRyeShOVUxMKTsKLQltZW51X2FkZF9wcm9wKFBfQ09NTUVOVCwgeXl2c3BbLTFdLnN0cmluZywgTlVMTCwgTlVMTCk7CisJbWVudV9hZGRfcHJvbXB0KFBfQ09NTUVOVCwgeXl2c3BbLTFdLnN0cmluZywgTlVMTCk7CiAJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Y29tbWVudFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CiA7fQogICAgIGJyZWFrOwpAQCAtMTY0MCw3ICsxNjQwLDcgQEAKICAgY2FzZSA4NjoKIAogICAgIHsKLQltZW51X2FkZF9wcm9wKFBfUFJPTVBULCB5eXZzcFstMV0uc3RyaW5nLCBOVUxMLCB5eXZzcFswXS5leHByKTsKKwltZW51X2FkZF9wcm9tcHQoUF9QUk9NUFQsIHl5dnNwWy0xXS5zdHJpbmcsIHl5dnNwWzBdLmV4cHIpOwogO30KICAgICBicmVhazsKIApAQCAtMTkyNSw3ICsxOTI1LDcgQEAKIAlzeW1faW5pdCgpOwogCW1lbnVfaW5pdCgpOwogCW1vZHVsZXNfc3ltID0gc3ltX2xvb2t1cCgiTU9EVUxFUyIsIDApOwotCXJvb3RtZW51LnByb21wdCA9IG1lbnVfYWRkX3Byb3AoUF9NRU5VLCAiTGludXggS2VybmVsIENvbmZpZ3VyYXRpb24iLCBOVUxMLCBOVUxMKTsKKwlyb290bWVudS5wcm9tcHQgPSBtZW51X2FkZF9wcm9tcHQoUF9NRU5VLCAiTGludXggS2VybmVsIENvbmZpZ3VyYXRpb24iLCBOVUxMKTsKIAogCS8vemNvbmZkZWJ1ZyA9IDE7CiAJemNvbmZwYXJzZSgpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkgYi9zY3JpcHRzL2tjb25maWcvemNvbmYueQppbmRleCA1NDQ2MGY4Li5lMWEwZjQ1IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvemNvbmYueQorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYueQpAQCAtMzQyLDcgKzM0Miw3IEBACiBtZW51OiBUX01FTlUgcHJvbXB0IFRfRU9MCiB7CiAJbWVudV9hZGRfZW50cnkoTlVMTCk7Ci0JbWVudV9hZGRfcHJvcChQX01FTlUsICQyLCBOVUxMLCBOVUxMKTsKKwltZW51X2FkZF9wcm9tcHQoUF9NRU5VLCAkMiwgTlVMTCk7CiAJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6bWVudVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CiB9OwogCkBAIC0zOTIsNyArMzkyLDcgQEAKIGNvbW1lbnQ6IFRfQ09NTUVOVCBwcm9tcHQgVF9FT0wKIHsKIAltZW51X2FkZF9lbnRyeShOVUxMKTsKLQltZW51X2FkZF9wcm9wKFBfQ09NTUVOVCwgJDIsIE5VTEwsIE5VTEwpOworCW1lbnVfYWRkX3Byb21wdChQX0NPTU1FTlQsICQyLCBOVUxMKTsKIAlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpjb21tZW50XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKIH07CiAKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCSAgLyogZW1wdHkgKi8KIAl8IHByb21wdCBpZl9leHByCiB7Ci0JbWVudV9hZGRfcHJvcChQX1BST01QVCwgJDEsIE5VTEwsICQyKTsKKwltZW51X2FkZF9wcm9tcHQoUF9QUk9NUFQsICQxLCAkMik7CiB9OwogCiBwcm9tcHQ6CSAgVF9XT1JECkBAIC00ODcsNyArNDg3LDcgQEAKIAlzeW1faW5pdCgpOwogCW1lbnVfaW5pdCgpOwogCW1vZHVsZXNfc3ltID0gc3ltX2xvb2t1cCgiTU9EVUxFUyIsIDApOwotCXJvb3RtZW51LnByb21wdCA9IG1lbnVfYWRkX3Byb3AoUF9NRU5VLCAiTGludXggS2VybmVsIENvbmZpZ3VyYXRpb24iLCBOVUxMLCBOVUxMKTsKKwlyb290bWVudS5wcm9tcHQgPSBtZW51X2FkZF9wcm9tcHQoUF9NRU5VLCAiTGludXggS2VybmVsIENvbmZpZ3VyYXRpb24iLCBOVUxMKTsKIAogCS8vemNvbmZkZWJ1ZyA9IDE7CiAJemNvbmZwYXJzZSgpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rZXJuZWwtZG9jIGIvc2NyaXB0cy9rZXJuZWwtZG9jCmluZGV4IDA4MzVkYzIuLjhhYWY3NGUgMTAwNzU1Ci0tLSBhL3NjcmlwdHMva2VybmVsLWRvYworKysgYi9zY3JpcHRzL2tlcm5lbC1kb2MKQEAgLTE2NjUsMTEgKzE2NjUsMTcgQEAKIH0KIAogc3ViIHByb2Nlc3NfZmlsZSgkKSB7Ci0gICAgbXkgKCRmaWxlKSA9ICIkRU5WeydTUkNUUkVFJ31AXyI7CisgICAgbXkgJGZpbGU7CiAgICAgbXkgJGlkZW50aWZpZXI7CiAgICAgbXkgJGZ1bmM7CiAgICAgbXkgJGluaXRpYWxfc2VjdGlvbl9jb3VudGVyID0gJHNlY3Rpb25fY291bnRlcjsKIAorICAgIGlmIChkZWZpbmVkKCRFTlZ7J1NSQ1RSRUUnfSkpIHsKKwkkZmlsZSA9ICIkRU5WeydTUkNUUkVFJ30iIC4gIi8iIC4gIkBfIjsKKyAgICB9CisgICAgZWxzZSB7CisJJGZpbGUgPSAiQF8iOworICAgIH0KICAgICBpZiAoZGVmaW5lZCgkc291cmNlX21hcHskZmlsZX0pKSB7CiAJJGZpbGUgPSAkc291cmNlX21hcHskZmlsZX07CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9seGRpYWxvZy9kaWFsb2cuaCBiL3NjcmlwdHMvbHhkaWFsb2cvZGlhbG9nLmgKaW5kZXggYzU3MTU0OC4uZWI2M2UxYiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9seGRpYWxvZy9kaWFsb2cuaAorKysgYi9zY3JpcHRzL2x4ZGlhbG9nL2RpYWxvZy5oCkBAIC0xNjMsNyArMTYzLDcgQEAKIGludCBkaWFsb2dfY2hlY2tsaXN0IChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LAogCQlpbnQgd2lkdGgsIGludCBsaXN0X2hlaWdodCwgaW50IGl0ZW1fbm8sCiAJCWNvbnN0IGNoYXIgKiBjb25zdCAqIGl0ZW1zLCBpbnQgZmxhZyk7Ci1leHRlcm4gdW5zaWduZWQgY2hhciBkaWFsb2dfaW5wdXRfcmVzdWx0W107CitleHRlcm4gY2hhciBkaWFsb2dfaW5wdXRfcmVzdWx0W107CiBpbnQgZGlhbG9nX2lucHV0Ym94IChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LAogCQlpbnQgd2lkdGgsIGNvbnN0IGNoYXIgKmluaXQpOwogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x4ZGlhbG9nL2lucHV0Ym94LmMgYi9zY3JpcHRzL2x4ZGlhbG9nL2lucHV0Ym94LmMKaW5kZXggZmE3YmViYy4uMDc0ZDJkNiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9seGRpYWxvZy9pbnB1dGJveC5jCisrKyBiL3NjcmlwdHMvbHhkaWFsb2cvaW5wdXRib3guYwpAQCAtMjEsNyArMjEsNyBAQAogCiAjaW5jbHVkZSAiZGlhbG9nLmgiCiAKLXVuc2lnbmVkIGNoYXIgZGlhbG9nX2lucHV0X3Jlc3VsdFtNQVhfTEVOICsgMV07CitjaGFyIGRpYWxvZ19pbnB1dF9yZXN1bHRbTUFYX0xFTiArIDFdOwogCiAvKgogICogIFByaW50IHRoZSB0ZXJtaW5hdGlvbiBidXR0b25zCkBAIC00OCw3ICs0OCw3IEBACiB7CiAgICAgaW50IGksIHgsIHksIGJveF95LCBib3hfeCwgYm94X3dpZHRoOwogICAgIGludCBpbnB1dF94ID0gMCwgc2Nyb2xsID0gMCwga2V5ID0gMCwgYnV0dG9uID0gLTE7Ci0gICAgdW5zaWduZWQgY2hhciAqaW5zdHIgPSBkaWFsb2dfaW5wdXRfcmVzdWx0OworICAgIGNoYXIgKmluc3RyID0gZGlhbG9nX2lucHV0X3Jlc3VsdDsKICAgICBXSU5ET1cgKmRpYWxvZzsKIAogICAgIC8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta2NvbXBpbGVfaCBiL3NjcmlwdHMvbWtjb21waWxlX2gKaW5kZXggOGQxMThkMS4uZDdiOGEzOCAxMDA3NTUKLS0tIGEvc2NyaXB0cy9ta2NvbXBpbGVfaAorKysgYi9zY3JpcHRzL21rY29tcGlsZV9oCkBAIC0xLDcgKzEsOCBAQAogVEFSR0VUPSQxCiBBUkNIPSQyCiBTTVA9JDMKLUNDPSQ0CitQUkVFTVBUPSQ0CitDQz0kNQogCiAjIElmIGNvbXBpbGUuaCBleGlzdHMgYWxyZWFkeSBhbmQgd2UgZG9uJ3Qgb3duIGF1dG9jb25mLmgKICMgKGkuZS4gd2UncmUgbm90IHRoZSBzYW1lIHVzZXIgd2hvIGRpZCBtYWtlICpjb25maWcpLCBkb24ndApAQCAtMjYsOCArMjcsMTAgQEAKIAogCiBVVFNfVkVSU0lPTj0iIyRWRVJTSU9OIgotaWYgWyAtbiAiJFNNUCIgXSA7IHRoZW4gVVRTX1ZFUlNJT049IiRVVFNfVkVSU0lPTiBTTVAiOyBmaQotVVRTX1ZFUlNJT049IiRVVFNfVkVSU0lPTiBgTENfQUxMPUMgTEFORz1DIGRhdGVgIgorQ09ORklHX0ZMQUdTPSIiCitpZiBbIC1uICIkU01QIiBdIDsgdGhlbiBDT05GSUdfRkxBR1M9IlNNUCI7IGZpCitpZiBbIC1uICIkUFJFRU1QVCIgXSA7IHRoZW4gQ09ORklHX0ZMQUdTPSIkQ09ORklHX0ZMQUdTIFBSRUVNUFQiOyBmaQorVVRTX1ZFUlNJT049IiRVVFNfVkVSU0lPTiAkQ09ORklHX0ZMQUdTIGBMQ19BTEw9QyBMQU5HPUMgZGF0ZWAiCiAKICMgVHJ1bmNhdGUgdG8gbWF4aW11bSBsZW5ndGgKIApAQCAtMzcsNyArNDAsOCBAQAogIyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBjb21waWxlLmgKIAogKCBlY2hvIC9cKiBUaGlzIGZpbGUgaXMgYXV0byBnZW5lcmF0ZWQsIHZlcnNpb24gJFZFUlNJT04gXCovCi0KKyAgaWYgWyAtbiAiJENPTkZJR19GTEFHUyIgXSA7IHRoZW4gZWNobyAiLyogJENPTkZJR19GTEFHUyAqLyI7IGZpCisgIAogICBlY2hvIFwjZGVmaW5lIFVUU19NQUNISU5FIFwiJEFSQ0hcIgogCiAgIGVjaG8gXCNkZWZpbmUgVVRTX1ZFUlNJT04gXCJgZWNobyAkVVRTX1ZFUlNJT04gfCAkVVRTX1RSVU5DQVRFYFwiCmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9zdW12ZXJzaW9uLmMgYi9zY3JpcHRzL21vZC9zdW12ZXJzaW9uLmMKaW5kZXggMTExMjM0Ny4uNDMyNzFhMSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2Qvc3VtdmVyc2lvbi5jCisrKyBiL3NjcmlwdHMvbW9kL3N1bXZlcnNpb24uYwpAQCAtMjUyLDkgKzI1Miw5IEBACiB9CiAKIC8qIEZJWE1FOiBIYW5kbGUgLnMgZmlsZXMgZGlmZmVyZW50bHkgKGVnLiAjIHN0YXJ0cyBjb21tZW50cykgLS1SUiAqLwotc3RhdGljIGludCBwYXJzZV9maWxlKGNvbnN0IHNpZ25lZCBjaGFyICpmbmFtZSwgc3RydWN0IG1kNF9jdHggKm1kKQorc3RhdGljIGludCBwYXJzZV9maWxlKGNvbnN0IGNoYXIgKmZuYW1lLCBzdHJ1Y3QgbWQ0X2N0eCAqbWQpCiB7Ci0Jc2lnbmVkIGNoYXIgKmZpbGU7CisJY2hhciAqZmlsZTsKIAl1bnNpZ25lZCBsb25nIGksIGxlbjsKIAogCWZpbGUgPSBncmFiX2ZpbGUoZm5hbWUsICZsZW4pOwpAQCAtMzMyLDcgKzMzMiw3IEBACiAJICAgU3VtIGFsbCBmaWxlcyBpbiB0aGUgc2FtZSBkaXIgb3Igc3ViZGlycy4KIAkqLwogCXdoaWxlICgobGluZSA9IGdldF9uZXh0X2xpbmUoJnBvcywgZmlsZSwgZmxlbikpICE9IE5VTEwpIHsKLQkJc2lnbmVkIGNoYXIqIHAgPSBsaW5lOworCQljaGFyKiBwID0gbGluZTsKIAkJaWYgKHN0cm5jbXAobGluZSwgImRlcHNfIiwgc2l6ZW9mKCJkZXBzXyIpLTEpID09IDApIHsKIAkJCWNoZWNrX2ZpbGVzID0gMTsKIAkJCWNvbnRpbnVlOwpAQCAtNDU4LDcgKzQ1OCw3IEBACiAJY2xvc2UoZmQpOwogfQogCi1zdGF0aWMgaW50IHN0cmlwX3Jjc19jcmFwKHNpZ25lZCBjaGFyICp2ZXJzaW9uKQorc3RhdGljIGludCBzdHJpcF9yY3NfY3JhcChjaGFyICp2ZXJzaW9uKQogewogCXVuc2lnbmVkIGludCBsZW4sIGZ1bGxfbGVuOwogCmRpZmYgLS1naXQgYS9zY3JpcHRzL3BhY2thZ2UvTWFrZWZpbGUgYi9zY3JpcHRzL3BhY2thZ2UvTWFrZWZpbGUKaW5kZXggM2IxZjJlZi4uZjNlN2U4ZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9wYWNrYWdlL01ha2VmaWxlCisrKyBiL3NjcmlwdHMvcGFja2FnZS9NYWtlZmlsZQpAQCAtNTksNyArNTksNyBAQAogCSQoQ09ORklHX1NIRUxMKSAkKE1LU1BFQykgcHJlYnVpbHQgPiAkQAogCQogYmlucnBtLXBrZzogJChvYmp0cmVlKS9iaW5rZXJuZWwuc3BlYwotCSQoTUFLRSkKKwkkKE1BS0UpIEtCVUlMRF9TUkM9CiAJc2V0IC1lOyBcCiAJJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9ta3ZlcnNpb24gPiAkKG9ianRyZWUpLy50bXBfdmVyc2lvbgogCXNldCAtZTsgXApAQCAtNzQsMTYgKzc0LDMwIEBACiAjCiAuUEhPTlk6IGRlYi1wa2cKIGRlYi1wa2c6Ci0JJChNQUtFKQorCSQoTUFLRSkgS0JVSUxEX1NSQz0KIAkkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKIAogY2xlYW4tZGlycyArPSAkKG9ianRyZWUpL2RlYmlhbi8KIAogCisjIHRhcmJhbGwgdGFyZ2V0cworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5QSE9OWTogdGFyJXBrZwordGFyJXBrZzoKKwkkKE1BS0UpCisJJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9wYWNrYWdlL2J1aWxkdGFyICRACisKK2NsZWFuLWRpcnMgKz0gJChvYmp0cmVlKS90YXItaW5zdGFsbC8KKworCiAjIEhlbHAgdGV4dCBkaXNwbGF5ZWQgd2hlbiBleGVjdXRpbmcgJ21ha2UgaGVscCcKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBoZWxwOgotCUBlY2hvICAnICBycG0tcGtnICAgICAgICAgLSBCdWlsZCB0aGUga2VybmVsIGFzIGFuIFJQTSBwYWNrYWdlJwotCUBlY2hvICAnICBiaW5ycG0tcGtnICAgICAgLSBCdWlsZCBhbiBycG0gcGFja2FnZSBjb250YWluaW5nIHRoZSBjb21waWxlZCBrZXJuZWwgJiBtb2R1bGVzJwotCUBlY2hvICAnICBkZWItcGtnICAgICAgICAgLSBCdWlsZCB0aGUga2VybmVsIGFzIGFuIGRlYiBwYWNrYWdlJworCUBlY2hvICcgIHJwbS1wa2cgICAgICAgICAtIEJ1aWxkIHRoZSBrZXJuZWwgYXMgYW4gUlBNIHBhY2thZ2UnCisJQGVjaG8gJyAgYmlucnBtLXBrZyAgICAgIC0gQnVpbGQgYW4gcnBtIHBhY2thZ2UgY29udGFpbmluZyB0aGUgY29tcGlsZWQga2VybmVsJworCUBlY2hvICcgICAgICAgICAgICAgICAgICAgIGFuZCBtb2R1bGVzJworCUBlY2hvICcgIGRlYi1wa2cgICAgICAgICAtIEJ1aWxkIHRoZSBrZXJuZWwgYXMgYW4gZGViIHBhY2thZ2UnCisJQGVjaG8gJyAgdGFyLXBrZyAgICAgICAgIC0gQnVpbGQgdGhlIGtlcm5lbCBhcyBhbiB1bmNvbXByZXNzZWQgdGFyYmFsbCcKKwlAZWNobyAnICB0YXJnei1wa2cgICAgICAgLSBCdWlsZCB0aGUga2VybmVsIGFzIGEgZ3ppcCBjb21wcmVzc2VkIHRhcmJhbGwnCisJQGVjaG8gJyAgdGFyYnoyLXBrZyAgICAgIC0gQnVpbGQgdGhlIGtlcm5lbCBhcyBhIGJ6aXAyIGNvbXByZXNzZWQgdGFyYmFsbCcKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViIGIvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViCmluZGV4IGMyNzliNjMuLjZlZGIyOWYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgorKysgYi9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKQEAgLTE0LDE4ICsxNCwzOCBAQAogIyBTb21lIHZhcmlhYmxlcyBhbmQgc2V0dGluZ3MgdXNlZCB0aHJvdWdob3V0IHRoZSBzY3JpcHQKIHZlcnNpb249JEtFUk5FTFJFTEVBU0UKIHRtcGRpcj0iJG9ianRyZWUvZGViaWFuL3RtcCIKK3BhY2thZ2VuYW1lPWxpbnV4LSR2ZXJzaW9uCisKK2lmIFsgIiRBUkNIIiA9PSAidW0iIF0gOyB0aGVuCisJcGFja2FnZW5hbWU9dXNlci1tb2RlLWxpbnV4LSR2ZXJzaW9uCitmaQogCiAjIFNldHVwIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlCiBybSAtcmYgIiR0bXBkaXIiCiBta2RpciAtcCAiJHRtcGRpci9ERUJJQU4iICIkdG1wZGlyL2xpYiIgIiR0bXBkaXIvYm9vdCIKK2lmIFsgIiRBUkNIIiA9PSAidW0iIF0gOyB0aGVuCisJbWtkaXIgLXAgIiR0bXBkaXIvdXNyL2xpYi91bWwvbW9kdWxlcy8kdmVyc2lvbiIgIiR0bXBkaXIvdXNyL3NoYXJlL2RvYy8kcGFja2FnZW5hbWUiICIkdG1wZGlyL3Vzci9iaW4iCitmaQogCiAjIEJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBrZXJuZWwKLWNwIFN5c3RlbS5tYXAgIiR0bXBkaXIvYm9vdC9TeXN0ZW0ubWFwLSR2ZXJzaW9uIgotY3AgLmNvbmZpZyAiJHRtcGRpci9ib290L2NvbmZpZy0kdmVyc2lvbiIKLWNwICRLQlVJTERfSU1BR0UgIiR0bXBkaXIvYm9vdC92bWxpbnV6LSR2ZXJzaW9uIgoraWYgWyAiJEFSQ0giID09ICJ1bSIgXSA7IHRoZW4KKwkkTUFLRSBsaW51eAorCWNwIFN5c3RlbS5tYXAgIiR0bXBkaXIvdXNyL2xpYi91bWwvbW9kdWxlcy8kdmVyc2lvbi9TeXN0ZW0ubWFwIgorCWNwIC5jb25maWcgIiR0bXBkaXIvdXNyL3NoYXJlL2RvYy8kcGFja2FnZW5hbWUvY29uZmlnIgorCWd6aXAgIiR0bXBkaXIvdXNyL3NoYXJlL2RvYy8kcGFja2FnZW5hbWUvY29uZmlnIgorCWNwICRLQlVJTERfSU1BR0UgIiR0bXBkaXIvdXNyL2Jpbi9saW51eC0kdmVyc2lvbiIKK2Vsc2UgCisJY3AgU3lzdGVtLm1hcCAiJHRtcGRpci9ib290L1N5c3RlbS5tYXAtJHZlcnNpb24iCisJY3AgLmNvbmZpZyAiJHRtcGRpci9ib290L2NvbmZpZy0kdmVyc2lvbiIKKwljcCAkS0JVSUxEX0lNQUdFICIkdG1wZGlyL2Jvb3Qvdm1saW51ei0kdmVyc2lvbiIKK2ZpCiAKIGlmIGdyZXAgLXEgJ15DT05GSUdfTU9EVUxFUz15JyAuY29uZmlnIDsgdGhlbgotCUlOU1RBTExfTU9EX1BBVEg9IiR0bXBkaXIiIG1ha2UgbW9kdWxlc19pbnN0YWxsCisJSU5TVEFMTF9NT0RfUEFUSD0iJHRtcGRpciIgbWFrZSBLQlVJTERfU1JDPSBtb2R1bGVzX2luc3RhbGwKKwlpZiBbICIkQVJDSCIgPT0gInVtIiBdIDsgdGhlbgorCQltdiAiJHRtcGRpci9saWIvbW9kdWxlcy8kdmVyc2lvbiIvKiAiJHRtcGRpci91c3IvbGliL3VtbC9tb2R1bGVzLyR2ZXJzaW9uLyIKKwkJcm1kaXIgIiR0bXBkaXIvbGliL21vZHVsZXMvJHZlcnNpb24iCisJZmkKIGZpCiAKICMgSW5zdGFsbCB0aGUgbWFpbnRhaW5lciBzY3JpcHRzCkBAIC01Myw2ICs3Myw4IEBACiBFT0YKIAogIyBHZW5lcmF0ZSBhIGNvbnRyb2wgZmlsZQoraWYgWyAiJEFSQ0giID09ICJ1bSIgXTsgdGhlbgorCiBjYXQgPDxFT0YgPiBkZWJpYW4vY29udHJvbAogU291cmNlOiBsaW51eAogU2VjdGlvbjogYmFzZQpAQCAtNjAsMTIgKzgyLDM0IEBACiBNYWludGFpbmVyOiAkbmFtZQogU3RhbmRhcmRzLVZlcnNpb246IDMuNi4xCiAKLVBhY2thZ2U6IGxpbnV4LSR2ZXJzaW9uCitQYWNrYWdlOiAkcGFja2FnZW5hbWUKK0FyY2hpdGVjdHVyZTogYW55CitEZXNjcmlwdGlvbjogVXNlciBNb2RlIExpbnV4IGtlcm5lbCwgdmVyc2lvbiAkdmVyc2lvbgorIFVzZXItbW9kZSBMaW51eCBpcyBhIHBvcnQgb2YgdGhlIExpbnV4IGtlcm5lbCB0byBpdHMgb3duIHN5c3RlbSBjYWxsCisgaW50ZXJmYWNlLiAgSXQgcHJvdmlkZXMgYSBraW5kIG9mIHZpcnR1YWwgbWFjaGluZSwgd2hpY2ggcnVucyBMaW51eAorIGFzIGEgdXNlciBwcm9jZXNzIHVuZGVyIGFub3RoZXIgTGludXgga2VybmVsLiAgVGhpcyBpcyB1c2VmdWwgZm9yCisga2VybmVsIGRldmVsb3BtZW50LCBzYW5kYm94ZXMsIGphaWxzLCBleHBlcmltZW50YXRpb24sIGFuZAorIG1hbnkgb3RoZXIgdGhpbmdzLgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIExpbnV4IGtlcm5lbCwgbW9kdWxlcyBhbmQgY29ycmVzcG9uZGluZyBvdGhlcgorIGZpbGVzIHZlcnNpb24gJHZlcnNpb24KK0VPRgorCitlbHNlCitjYXQgPDxFT0YgPiBkZWJpYW4vY29udHJvbAorU291cmNlOiBsaW51eAorU2VjdGlvbjogYmFzZQorUHJpb3JpdHk6IG9wdGlvbmFsCitNYWludGFpbmVyOiAkbmFtZQorU3RhbmRhcmRzLVZlcnNpb246IDMuNi4xCisKK1BhY2thZ2U6ICRwYWNrYWdlbmFtZQogQXJjaGl0ZWN0dXJlOiBhbnkKIERlc2NyaXB0aW9uOiBMaW51eCBrZXJuZWwsIHZlcnNpb24gJHZlcnNpb24KICBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIExpbnV4IGtlcm5lbCwgbW9kdWxlcyBhbmQgY29ycmVzcG9uZGluZyBvdGhlcgotIGZpbGVzIHZlcnNpb24gJHZlcnNpb24uCisgZmlsZXMgdmVyc2lvbiAkdmVyc2lvbgogRU9GCitmaQogCiAjIEZpeCBzb21lIG93bmVyc2hpcCBhbmQgcGVybWlzc2lvbnMKIGNob3duIC1SIHJvb3Q6cm9vdCAiJHRtcGRpciIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGFja2FnZS9idWlsZHRhciBiL3NjcmlwdHMvcGFja2FnZS9idWlsZHRhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGZmZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9wYWNrYWdlL2J1aWxkdGFyCkBAIC0wLDAgKzEsMTExIEBACisjIS9iaW4vc2gKKworIworIyBidWlsZHRhciAwLjAuMworIworIyAoQykgMjAwNC0yMDA1IGJ5IEphbi1CZW5lZGljdCBHbGF3IDxqYmdsYXdAbHVnLW93bC5kZT4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBjb21waWxlIGEgdGFyYmFsbCBmcm9tIHRoZSBjdXJyZW50bHkKKyMgcHJlcGFyZWQga2VybmVsLiBCYXNlZCB1cG9uIHRoZSBidWlsZGRlYiBzY3JpcHQgZnJvbQorIyBXaWNoZXJ0IEFra2VybWFuIDx3aWNoZXJ0QHdpZ2d5Lm5ldD4uCisjCisKK3NldCAtZQorCisjCisjIFNvbWUgdmFyaWFibGVzIGFuZCBzZXR0aW5ncyB1c2VkIHRocm91Z2hvdXQgdGhlIHNjcmlwdAorIwordmVyc2lvbj0iJHtWRVJTSU9OfS4ke1BBVENITEVWRUx9LiR7U1VCTEVWRUx9JHtFWFRSQVZFUlNJT059JHtFWFRSQU5BTUV9IgordG1wZGlyPSIke29ianRyZWV9L3Rhci1pbnN0YWxsIgordGFyYmFsbD0iJHtvYmp0cmVlfS9saW51eC0ke3ZlcnNpb259LnRhciIKKworCisjCisjIEZpZ3VyZSBvdXQgaG93IHRvIGNvbXByZXNzLCBpZiByZXF1ZXN0ZWQgYXQgYWxsCisjCitjYXNlICIkezF9IiBpbgorCXRhci1wa2cpCisJCWNvbXByZXNzPSJjYXQiCisJCWZpbGVfZXh0PSIiCisJCTs7CisJdGFyZ3otcGtnKQorCQljb21wcmVzcz0iZ3ppcCAtYzkiCisJCWZpbGVfZXh0PSIuZ3oiCisJCTs7CisJdGFyYnoyLXBrZykKKwkJY29tcHJlc3M9ImJ6aXAyIC1jOSIKKwkJZmlsZV9leHQ9Ii5iejIiCisJCTs7CisJKikKKwkJZWNobyAiVW5rbm93biB0YXJiYWxsIHRhcmdldCBcIiR7MX1cIiByZXF1ZXN0ZWQsIHBsZWFzZSBhZGQgaXQgdG8gJHswfS4iID4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworCisjCisjIENsZWFuLXVwIGFuZCByZS1jcmVhdGUgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkKKyMKK3JtIC1yZiAtLSAiJHt0bXBkaXJ9IgorbWtkaXIgLXAgLS0gIiR7dG1wZGlyfS9ib290IgorCisKKyMKKyMgVHJ5IHRvIGluc3RhbGwgbW9kdWxlcworIworaWYgISBtYWtlIElOU1RBTExfTU9EX1BBVEg9IiR7dG1wZGlyfSIgbW9kdWxlc19pbnN0YWxsOyB0aGVuCisJZWNobyAiIiA+JjIKKwllY2hvICJJZ25vcmluZyBlcnJvciBhdCBtb2R1bGVfaW5zdGFsbCB0aW1lLCBzaW5jZSB0aGF0IGNvdWxkIGJlIiA+JjIKKwllY2hvICJhIHJlc3VsdCBvZiBtaXNzaW5nIGxvY2FsIG1vZHV0aWxzL21vZHVsZS1pbml0LXRvb2xzLCIgPiYyCisJZWNobyAib3IgeW91IGp1c3QgZGlkbid0IGNvbXBpbGUgaW4gbW9kdWxlIHN1cHBvcnQgYXQgYWxsLi4uIiA+JjIKKwllY2hvICIiID4mMgorZmkKKworCisjCisjIEluc3RhbGwgYmFzaWMga2VybmVsIGZpbGVzCisjCitjcCAtdiAtLSBTeXN0ZW0ubWFwICIke3RtcGRpcn0vYm9vdC9TeXN0ZW0ubWFwLSR7dmVyc2lvbn0iCitjcCAtdiAtLSAuY29uZmlnICIke3RtcGRpcn0vYm9vdC9jb25maWctJHt2ZXJzaW9ufSIKK2NwIC12IC0tIHZtbGludXggIiR7dG1wZGlyfS9ib290L3ZtbGludXgtJHt2ZXJzaW9ufSIKKworCisjCisjIEluc3RhbGwgYXJjaC1zcGVjaWZpYyBrZXJuZWwgaW1hZ2UocykKKyMKK2Nhc2UgIiR7QVJDSH0iIGluCisJaTM4NikKKwkJWyAtZiBhcmNoL2kzODYvYm9vdC9iekltYWdlIF0gJiYgY3AgLXYgLS0gYXJjaC9pMzg2L2Jvb3QvYnpJbWFnZSAiJHt0bXBkaXJ9L2Jvb3Qvdm1saW51ei0ke3ZlcnNpb259IgorCQk7OworCWFscGhhKQorCQlbIC1mIGFyY2gvYWxwaGEvYm9vdC92bWxpbnV4Lmd6IF0gJiYgY3AgLXYgLS0gYXJjaC9hbHBoYS9ib290L3ZtbGludXguZ3ogIiR7dG1wZGlyfS9ib290L3ZtbGludXotJHt2ZXJzaW9ufSIKKwkJOzsKKwl2YXgpCisJCVsgLWYgdm1saW51eC5TWVMgXSAmJiBjcCAtdiAtLSB2bWxpbnV4LlNZUyAiJHt0bXBkaXJ9L2Jvb3Qvdm1saW51eC0ke3ZlcnNpb259LlNZUyIKKwkJWyAtZiB2bWxpbnV4LmRzayBdICYmIGNwIC12IC0tIHZtbGludXguZHNrICIke3RtcGRpcn0vYm9vdC92bWxpbnV4LSR7dmVyc2lvbn0uZHNrIgorCQk7OworCSopCisJCVsgLWYgIiR7S0JVSUxEX0lNQUdFfSIgXSAmJiBjcCAtdiAtLSAiJHtLQlVJTERfSU1BR0V9IiAiJHt0bXBkaXJ9L2Jvb3Qvdm1saW51eC1rYnVpbGQtJHt2ZXJzaW9ufSIKKwkJZWNobyAiIiA+JjIKKwkJZWNobyAnKiogKiogKiogIFdBUk5JTkcgICoqICoqICoqJyA+JjIKKwkJZWNobyAiIiA+JjIKKwkJZWNobyAiWW91ciBhcmNoaXRlY3R1cmUgZGlkIG5vdCBkZWZpbmUgYW55IGFyY2hpdGVjdHVyZS1kZXBlbmRhbnQgZmlsZXMiID4mMgorCQllY2hvICJ0byBiZSBwbGFjZWQgaW50byB0aGUgdGFyYmFsbC4gUGxlYXNlIGFkZCB0aG9zZSB0byAkezB9IC4uLiIgPiYyCisJCWVjaG8gIiIgPiYyCisJCXNsZWVwIDUKKwkJOzsKK2VzYWMKKworCisjCisjIENyZWF0ZSB0aGUgdGFyYmFsbAorIworKAorCWNkICIke3RtcGRpcn0iCisJdGFyIGNmIC0gLiB8ICR7Y29tcHJlc3N9ID4gIiR7dGFyYmFsbH0ke2ZpbGVfZXh0fSIKKykKKworZWNobyAiVGFyYmFsbCBzdWNjZXNzZnVsbHkgY3JlYXRlZCBpbiAke3RhcmJhbGx9JHtmaWxlX2V4dH0iCisKK2V4aXQgMAorCmRpZmYgLS1naXQgYS9zY3JpcHRzL3BhY2thZ2UvbWtzcGVjIGIvc2NyaXB0cy9wYWNrYWdlL21rc3BlYwppbmRleCA2ZTdhNThmLi4wYjEwMzg3IDEwMDc1NQotLS0gYS9zY3JpcHRzL3BhY2thZ2UvbWtzcGVjCisrKyBiL3NjcmlwdHMvcGFja2FnZS9ta3NwZWMKQEAgLTYyLDEwICs2MiwxOSBAQAogZmkKIAogZWNobyAiJWluc3RhbGwiCitlY2hvICIlaWZhcmNoIGlhNjQiCitlY2hvICdta2RpciAtcCAkUlBNX0JVSUxEX1JPT1QvYm9vdC9lZmkgJFJQTV9CVUlMRF9ST09UL2xpYiAkUlBNX0JVSUxEX1JPT1QvbGliL21vZHVsZXMnCitlY2hvICIlZWxzZSIKIGVjaG8gJ21rZGlyIC1wICRSUE1fQlVJTERfUk9PVC9ib290ICRSUE1fQlVJTERfUk9PVC9saWIgJFJQTV9CVUlMRF9ST09UL2xpYi9tb2R1bGVzJworZWNobyAiJWVuZGlmIgogCiBlY2hvICdJTlNUQUxMX01PRF9QQVRIPSRSUE1fQlVJTERfUk9PVCBtYWtlICV7X3NtcF9tZmxhZ3N9IG1vZHVsZXNfaW5zdGFsbCcKK2VjaG8gIiVpZmFyY2ggaWE2NCIKK2VjaG8gJ2NwICRLQlVJTERfSU1BR0UgJFJQTV9CVUlMRF9ST09UJyIvYm9vdC9lZmkvdm1saW51ei0kS0VSTkVMUkVMRUFTRSIKK2VjaG8gJ2xuIC1zICciZWZpL3ZtbGludXotJEtFUk5FTFJFTEVBU0UiICckUlBNX0JVSUxEX1JPT1QnIi9ib290LyIKK2VjaG8gIiVlbHNlIgogZWNobyAnY3AgJEtCVUlMRF9JTUFHRSAkUlBNX0JVSUxEX1JPT1QnIi9ib290L3ZtbGludXotJEtFUk5FTFJFTEVBU0UiCitlY2hvICIlZW5kaWYiCiAKIGVjaG8gJ2NwIFN5c3RlbS5tYXAgJFJQTV9CVUlMRF9ST09UJyIvYm9vdC9TeXN0ZW0ubWFwLSRLRVJORUxSRUxFQVNFIgogCmRpZmYgLS1naXQgYS9zY3JpcHRzL3JlZmVyZW5jZV9kaXNjYXJkZWQucGwgYi9zY3JpcHRzL3JlZmVyZW5jZV9kaXNjYXJkZWQucGwKaW5kZXggZDVjYWJiOC4uYzJkNTQxNCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9yZWZlcmVuY2VfZGlzY2FyZGVkLnBsCisrKyBiL3NjcmlwdHMvcmVmZXJlbmNlX2Rpc2NhcmRlZC5wbApAQCAtOTEsMTEgKzkxLDcgQEAKIAkJICAgICAkZnJvbSAhfiAvXC5leGl0XC5kYXRhJC8gJiYKIAkJICAgICAkZnJvbSAhfiAvXC5hbHRpbnN0cnVjdGlvbnMkLyAmJgogCQkgICAgICRmcm9tICF+IC9cLnBkciQvICYmCi0JCSAgICAgJGZyb20gIX4gL1wuZGVidWdfaW5mbyQvICYmCi0JCSAgICAgJGZyb20gIX4gL1wuZGVidWdfYXJhbmdlcyQvICYmCi0JCSAgICAgJGZyb20gIX4gL1wuZGVidWdfcmFuZ2VzJC8gJiYKLQkJICAgICAkZnJvbSAhfiAvXC5kZWJ1Z19saW5lJC8gJiYKLQkJICAgICAkZnJvbSAhfiAvXC5kZWJ1Z19mcmFtZSQvICYmCisJCSAgICAgJGZyb20gIX4gL1wuZGVidWdfLiokLyAmJgogCQkgICAgICRmcm9tICF+IC9cLmV4aXRjYWxsXC5leGl0JC8gJiYKIAkJICAgICAkZnJvbSAhfiAvXC5laF9mcmFtZSQvICYmCiAJCSAgICAgJGZyb20gIX4gL1wuc3RhYiQvKSkgewpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9yZWZlcmVuY2VfaW5pdC5wbCBiL3NjcmlwdHMvcmVmZXJlbmNlX2luaXQucGwKaW5kZXggOWEyNDA4NC4uN2Y2OTYwYiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9yZWZlcmVuY2VfaW5pdC5wbAorKysgYi9zY3JpcHRzL3JlZmVyZW5jZV9pbml0LnBsCkBAIC05OCw2ICs5OCw3IEBACiAJCSAgICAgJGZyb20gIX4gL1wucGRyJC8gJiYKIAkJICAgICAkZnJvbSAhfiAvXF9fcGFyYW0kLyAmJgogCQkgICAgICRmcm9tICF+IC9cLmFsdGluc3RydWN0aW9ucy8gJiYKKwkJICAgICAkZnJvbSAhfiAvXC5laF9mcmFtZS8gJiYKIAkJICAgICAkZnJvbSAhfiAvXC5kZWJ1Z18vKSkgewogCQkJcHJpbnRmKCJFcnJvcjogJXMgJXMgcmVmZXJzIHRvICVzXG4iLCAkb2JqZWN0LCAkZnJvbSwgJGxpbmUpOwogCQl9CmRpZmYgLS1naXQgYS9zY3JpcHRzL3NldGxvY2FsdmVyc2lvbiBiL3NjcmlwdHMvc2V0bG9jYWx2ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODA1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3NldGxvY2FsdmVyc2lvbgpAQCAtMCwwICsxLDU2IEBACisjIS91c3IvYmluL3BlcmwKKyMgQ29weXJpZ2h0IDIwMDQgLSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPiAgR1BMIHYyCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgRGlnZXN0OjpNRDU7CityZXF1aXJlIDUuMDA2OworCitpZiAoQEFSR1YgIT0gMSkgeworCXByaW50IDw8RU9UOworVXNhZ2U6IHNldGxvY2FsdmVyc2lvbiA8c3JjdHJlZT4KK0VPVAorCWV4aXQoMSk7Cit9CisKK215ICgkc3JjdHJlZSkgPSBAQVJHVjsKK2NoZGlyKCRzcmN0cmVlKTsKKworbXkgQExPQ0FMVkVSU0lPTlMgPSAoKTsKKworIyBXZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgdG8gdHJ5IGFuZCBkZXRlcm1pbmUgaWYgdGhpcworIyByZXBvc2l0b3J5IGlzIGF0IGEgVmVyc2lvbiBib3VuZGFyeSAoaS5lLCAyLjYuMTAgdnMgMi42LjEwICsgc29tZSBwYXRjaGVzKSBXZQorIyBjdXJyZW50bHkgYXNzdW1lIHRoYXQgYWxsIG1lYW5pbmdmdWwgdmVyc2lvbiBib3VuZGFyaWVzIGFyZSBtYXJrZWQgYnkgYSB0YWcuCisjIFdlIGRvbid0IGNhcmUgd2hhdCB0aGUgdGFnIGlzLCBqdXN0IHRoYXQgc29tZXRoaW5nIGV4aXN0cy4KKworIyBHaXQvQ29naXRvIHN0b3JlIHRoZSB0b3Atb2YtdHJlZSAiY29tbWl0IiBpbiAuZ2l0L0hFQUQKKyMgQSBsaXN0IG9mIGtub3duIHRhZ3Mgc2l0cyBpbiAuZ2l0L3JlZnMvdGFncy8KKyMKKyMgVGhlIHNpbXBsZSB0cmljayBoZXJlIGlzIHRvIGp1c3QgY29tcGFyZSB0aGUgdHdvIG9mIHRoZXNlLCBhbmQgaWYgd2UgZ2V0IGEKKyMgbWF0Y2gsIHJldHVybiBub3RoaW5nLCBvdGhlcndpc2UsIHJldHVybiBhIHN1YnNldCBvZiB0aGUgU0hBLTEgaGFzaCBpbgorIyAuZ2l0L0hFQUQKKworc3ViIGRvX2dpdF9jaGVja3MgeworCW9wZW4oSCwiPC5naXQvSEVBRCIpIG9yIHJldHVybjsKKwlteSAkaGVhZCA9IDxIPjsKKwljaG9tcCAkaGVhZDsKKwljbG9zZShIKTsKKworCW9wZW5kaXIoRCwiLmdpdC9yZWZzL3RhZ3MiKSBvciByZXR1cm47CisJZm9yZWFjaCBteSAkdGFnZmlsZSAoZ3JlcCAhL15cLnsxLDJ9JC8sIHJlYWRkaXIoRCkpIHsKKwkJb3BlbihGLCI8LmdpdC9yZWZzL3RhZ3MvIiAuICR0YWdmaWxlKSBvciByZXR1cm47CisJCW15ICR0YWcgPSA8Rj47CisJCWNob21wICR0YWc7CisJCWNsb3NlKEYpOworCQlyZXR1cm4gaWYgKCR0YWcgZXEgJGhlYWQpOworCX0KKwljbG9zZWRpcihEKTsKKworCXB1c2ggQExPQ0FMVkVSU0lPTlMsICJnIiAuIHN1YnN0cigkaGVhZCwwLDgpOworfQorCitpZiAoIC1kICIuZ2l0IikgeworCWRvX2dpdF9jaGVja3MoKTsKK30KKworcHJpbnRmICItJXNcbiIsIGpvaW4oIi0iLEBMT0NBTFZFUlNJT05TKSBpZiAoc2NhbGFyIEBMT0NBTFZFUlNJT05TID4gMCk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Zlcl9saW51eCBiL3NjcmlwdHMvdmVyX2xpbnV4CmluZGV4IGEyOGMyNzkuLmJlYjQzZWY3IDEwMDc1NQotLS0gYS9zY3JpcHRzL3Zlcl9saW51eAorKysgYi9zY3JpcHRzL3Zlcl9saW51eApAQCAtMjUsOSArMjUsMTEgQEAKICcvQkZEL3twcmludCAiYmludXRpbHMgICAgICAgICAgICAgICIsJE5GfSBcCiAvXkdOVS97cHJpbnQgImJpbnV0aWxzICAgICAgICAgICAgICAiLCQ0fScKIAotZmRmb3JtYXQgLS12ZXJzaW9uIHwgYXdrIC1GXC0gJ3twcmludCAidXRpbC1saW51eCAgICAgICAgICAgICIsICRORn0nCitlY2hvIC1uICJ1dGlsLWxpbnV4ICAgICAgICAgICAgICIKK2ZkZm9ybWF0IC0tdmVyc2lvbiB8IGF3ayAne3ByaW50ICRORn0nIHwgc2VkIC1lIHMvXnV0aWwtbGludXgtLy8gLWUgcy9cKSQvLwogCi1tb3VudCAtLXZlcnNpb24gfCBhd2sgLUZcLSAne3ByaW50ICJtb3VudCAgICAgICAgICAgICAgICAgIiwgJE5GfScKK2VjaG8gLW4gIm1vdW50ICAgICAgICAgICAgICAgICAgIgorbW91bnQgLS12ZXJzaW9uIHwgYXdrICd7cHJpbnQgJE5GfScgfCBzZWQgLWUgcy9ebW91bnQtLy8gLWUgcy9cKSQvLwogCiBkZXBtb2QgLVYgIDI+JjEgfCBhd2sgJ05SPT0xIHtwcmludCAibW9kdWxlLWluaXQtdG9vbHMgICAgICIsJE5GfScKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvZHVtbXkuYyBiL3NlY3VyaXR5L2R1bW15LmMKaW5kZXggNmZmODg3NS4uOTYyM2E2MSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvZHVtbXkuYworKysgYi9zZWN1cml0eS9kdW1teS5jCkBAIC0yNTgsMzEgKzI1OCwyNCBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIGludCBkdW1teV9pbm9kZV9pbml0X3NlY3VyaXR5IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgICAgICBjaGFyICoqbmFtZSwgdm9pZCAqKnZhbHVlLCBzaXplX3QgKmxlbikKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKIHN0YXRpYyBpbnQgZHVtbXlfaW5vZGVfY3JlYXRlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkgICAgICAgaW50IG1hc2spCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bW15X2lub2RlX3Bvc3RfY3JlYXRlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JCQkJICAgICBpbnQgbWFzaykKLXsKLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyBpbnQgZHVtbXlfaW5vZGVfbGluayAoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZHVtbXlfaW5vZGVfcG9zdF9saW5rIChzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAotCQkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKLXsKLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyBpbnQgZHVtbXlfaW5vZGVfdW5saW5rIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJcmV0dXJuIDA7CkBAIC0yOTQsMjQgKzI4NywxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkdW1teV9pbm9kZV9wb3N0X3N5bWxpbmsgKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQotewotCXJldHVybjsKLX0KLQogc3RhdGljIGludCBkdW1teV9pbm9kZV9ta2RpciAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJICAgICAgaW50IG1hc2spCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bW15X2lub2RlX3Bvc3RfbWtkaXIgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCQkgICAgaW50IG1hc2spCi17Ci0JcmV0dXJuOwotfQotCiBzdGF0aWMgaW50IGR1bW15X2lub2RlX3JtZGlyIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJcmV0dXJuIDA7CkBAIC0zMjMsMTIgKzMwNCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bW15X2lub2RlX3Bvc3RfbWtub2QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCQkgICAgaW50IG1vZGUsIGRldl90IGRldikKLXsKLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyBpbnQgZHVtbXlfaW5vZGVfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSwKIAkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAogCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2lub2RlLApAQCAtMzM3LDE0ICszMTIsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkdW1teV9pbm9kZV9wb3N0X3JlbmFtZSAoc3RydWN0IGlub2RlICpvbGRfaW5vZGUsCi0JCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAotCQkJCSAgICAgc3RydWN0IGlub2RlICpuZXdfaW5vZGUsCi0JCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQotewotCXJldHVybjsKLX0KLQogc3RhdGljIGludCBkdW1teV9pbm9kZV9yZWFkbGluayAoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXJldHVybiAwOwpAQCAtODg2LDIwICs4NTMsMTUgQEAKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIHNiX3Bvc3RfcGl2b3Ryb290KTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIGlub2RlX2FsbG9jX3NlY3VyaXR5KTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIGlub2RlX2ZyZWVfc2VjdXJpdHkpOworCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfaW5pdF9zZWN1cml0eSk7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9jcmVhdGUpOwotCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfcG9zdF9jcmVhdGUpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfbGluayk7Ci0Jc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9wb3N0X2xpbmspOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfdW5saW5rKTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIGlub2RlX3N5bWxpbmspOwotCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfcG9zdF9zeW1saW5rKTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIGlub2RlX21rZGlyKTsKLQlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIGlub2RlX3Bvc3RfbWtkaXIpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfcm1kaXIpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfbWtub2QpOwotCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfcG9zdF9ta25vZCk7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9yZW5hbWUpOwotCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfcG9zdF9yZW5hbWUpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfcmVhZGxpbmspOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfZm9sbG93X2xpbmspOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfcGVybWlzc2lvbik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWNsdmwuYyBiL3NlY3VyaXR5L3NlY2x2bC5jCmluZGV4IGM4ZTg3YjIuLjk2YjFmMjEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlY2x2bC5jCisrKyBiL3NlY3VyaXR5L3NlY2x2bC5jCkBAIC0zMjEsNyArMzIxLDcgQEAKIAkJCSAgICAgICJieXRlcy5cbiIsIGxlbiwgUEFHRV9TSVpFKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXRmbSA9IGNyeXB0b19hbGxvY190Zm0oInNoYTEiLCAwKTsKKwl0Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKCJzaGExIiwgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQKTsKIAlpZiAodGZtID09IE5VTEwpIHsKIAkJc2VjbHZsX3ByaW50aygwLCBLRVJOX0VSUiwKIAkJCSAgICAgICJGYWlsZWQgdG8gbG9hZCB0cmFuc2Zvcm0gZm9yIFNIQTFcbiIpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYyBiL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKaW5kZXggNDUxNTAyNC4uY2Y2MDIwZiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCkBAIC00OTAsNyArNDkwLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGF2Y19wcmludF9pcHY2X2FkZHIoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsCi0JCQkJICAgICAgIHN0cnVjdCBpbjZfYWRkciAqYWRkciwgdTE2IHBvcnQsCisJCQkJICAgICAgIHN0cnVjdCBpbjZfYWRkciAqYWRkciwgX19iZTE2IHBvcnQsCiAJCQkJICAgICAgIGNoYXIgKm5hbWUxLCBjaGFyICpuYW1lMikKIHsKIAlpZiAoIWlwdjZfYWRkcl9hbnkoYWRkcikpCkBAIC01MDEsNyArNTAxLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGF2Y19wcmludF9pcHY0X2FkZHIoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIHUzMiBhZGRyLAotCQkJCSAgICAgICB1MTYgcG9ydCwgY2hhciAqbmFtZTEsIGNoYXIgKm5hbWUyKQorCQkJCSAgICAgICBfX2JlMTYgcG9ydCwgY2hhciAqbmFtZTEsIGNoYXIgKm5hbWUyKQogewogCWlmIChhZGRyKQogCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiICVzPSVkLiVkLiVkLiVkIiwgbmFtZTEsIE5JUFFVQUQoYWRkcikpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCmluZGV4IDg2NDFmODguLmY0MGM4MjIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKQEAgLTEyNjUsODUgKzEyNjUsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBTZXQgdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgb24gYSBuZXdseSBjcmVhdGVkIGZpbGUuICovCi1zdGF0aWMgaW50IHBvc3RfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLAotCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQotewotCi0Jc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjOwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqZHNlYzsKLQlzdHJ1Y3Qgc3VwZXJibG9ja19zZWN1cml0eV9zdHJ1Y3QgKnNic2VjOwotCXUzMiBuZXdzaWQ7Ci0JY2hhciAqY29udGV4dDsKLQl1bnNpZ25lZCBpbnQgbGVuOwotCWludCByYzsKLQotCXRzZWMgPSBjdXJyZW50LT5zZWN1cml0eTsKLQlkc2VjID0gZGlyLT5pX3NlY3VyaXR5OwotCXNic2VjID0gZGlyLT5pX3NiLT5zX3NlY3VyaXR5OwotCi0JaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7Ci0JaWYgKCFpbm9kZSkgewotCQkvKiBTb21lIGZpbGUgc3lzdGVtIHR5cGVzIChlLmcuIE5GUykgbWF5IG5vdCBpbnN0YW50aWF0ZQotCQkgICBhIGRlbnRyeSBmb3IgYWxsIGNyZWF0ZSBvcGVyYXRpb25zIChlLmcuIHN5bWxpbmspLAotCQkgICBzbyB3ZSBoYXZlIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGUgaW5vZGUgaXMgbm9uLU5VTEwuICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBvc3RfY3JlYXRlOiAgbm8gaW5vZGUsIGRpciAoZGV2PSVzLCAiCi0JCSAgICAgICAiaW5vPSVsZClcbiIsIGRpci0+aV9zYi0+c19pZCwgZGlyLT5pX2lubyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICh0c2VjLT5jcmVhdGVfc2lkICYmIHNic2VjLT5iZWhhdmlvciAhPSBTRUNVUklUWV9GU19VU0VfTU5UUE9JTlQpIHsKLQkJbmV3c2lkID0gdHNlYy0+Y3JlYXRlX3NpZDsKLQl9IGVsc2UgewotCQlyYyA9IHNlY3VyaXR5X3RyYW5zaXRpb25fc2lkKHRzZWMtPnNpZCwgZHNlYy0+c2lkLAotCQkJCQkgICAgIGlub2RlX21vZGVfdG9fc2VjdXJpdHlfY2xhc3MoaW5vZGUtPmlfbW9kZSksCi0JCQkJCSAgICAgJm5ld3NpZCk7Ci0JCWlmIChyYykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicG9zdF9jcmVhdGU6ICAiCi0JCQkgICAgICAgInNlY3VyaXR5X3RyYW5zaXRpb25fc2lkIGZhaWxlZCwgcmM9JWQgKGRldj0lcyAiCi0JCQkgICAgICAgImlubz0lbGQpXG4iLAotCQkJICAgICAgIC1yYywgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0KLQlyYyA9IGlub2RlX3NlY3VyaXR5X3NldF9zaWQoaW5vZGUsIG5ld3NpZCk7Ci0JaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBvc3RfY3JlYXRlOiAgaW5vZGVfc2VjdXJpdHlfc2V0X3NpZCAiCi0JCSAgICAgICAiZmFpbGVkLCByYz0lZCAoZGV2PSVzIGlubz0lbGQpXG4iLAotCQkgICAgICAgLXJjLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChzYnNlYy0+YmVoYXZpb3IgPT0gU0VDVVJJVFlfRlNfVVNFX1hBVFRSICYmCi0JICAgIGlub2RlLT5pX29wLT5zZXR4YXR0cikgewotCQkvKiBVc2UgZXh0ZW5kZWQgYXR0cmlidXRlcy4gKi8KLQkJcmMgPSBzZWN1cml0eV9zaWRfdG9fY29udGV4dChuZXdzaWQsICZjb250ZXh0LCAmbGVuKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJwb3N0X2NyZWF0ZTogIHNpZF90b19jb250ZXh0ICIKLQkJCSAgICAgICAiZmFpbGVkLCByYz0lZCAoZGV2PSVzIGlubz0lbGQpXG4iLAotCQkJICAgICAgIC1yYywgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJZG93bigmaW5vZGUtPmlfc2VtKTsKLQkJcmMgPSBpbm9kZS0+aV9vcC0+c2V0eGF0dHIoZGVudHJ5LAotCQkJCQkgICBYQVRUUl9OQU1FX1NFTElOVVgsCi0JCQkJCSAgIGNvbnRleHQsIGxlbiwgMCk7Ci0JCXVwKCZpbm9kZS0+aV9zZW0pOwotCQlrZnJlZShjb250ZXh0KTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicG9zdF9jcmVhdGU6ICBzZXR4YXR0ciBmYWlsZWQsICIKLQkJCSAgICAgICAicmM9JWQgKGRldj0lcyBpbm89JWxkKVxuIiwKLQkJCSAgICAgICAtcmMsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQogLyogSG9vayBmdW5jdGlvbnMgYmVnaW4gaGVyZS4gKi8KIAogc3RhdGljIGludCBzZWxpbnV4X3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBhcmVudCwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKQEAgLTE2NzMsNiArMTU5NCw3IEBACiAJc3RydWN0IGF2Y19hdWRpdF9kYXRhIGFkOwogCXN0cnVjdCBmaWxlICpmaWxlLCAqZGV2bnVsbCA9IE5VTEw7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5OworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAJbG9uZyBqID0gLTE7CiAKIAlpZiAodHR5KSB7CkBAIC0xNzA2LDkgKzE2MjgsMTAgQEAKIAogCQlqKys7CiAJCWkgPSBqICogX19ORkRCSVRTOwotCQlpZiAoaSA+PSBmaWxlcy0+bWF4X2ZkcyB8fCBpID49IGZpbGVzLT5tYXhfZmRzZXQpCisJCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOworCQlpZiAoaSA+PSBmZHQtPm1heF9mZHMgfHwgaSA+PSBmZHQtPm1heF9mZHNldCkKIAkJCWJyZWFrOwotCQlzZXQgPSBmaWxlcy0+b3Blbl9mZHMtPmZkc19iaXRzW2pdOworCQlzZXQgPSBmZHQtPm9wZW5fZmRzLT5mZHNfYml0c1tqXTsKIAkJaWYgKCFzZXQpCiAJCQljb250aW51ZTsKIAkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwpAQCAtMTcyOSw3ICsxNjUyLDcgQEAKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9CiAJCQkJCWlmIChkZXZudWxsKSB7Ci0JCQkJCQlhdG9taWNfaW5jKCZkZXZudWxsLT5mX2NvdW50KTsKKwkJCQkJCXJjdXJlZl9pbmMoJmRldm51bGwtPmZfY291bnQpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJZGV2bnVsbCA9IGRlbnRyeV9vcGVuKGRnZXQoc2VsaW51eF9udWxsKSwgbW50Z2V0KHNlbGludXhmc19tb3VudCksIE9fUkRXUik7CiAJCQkJCQlpZiAoIWRldm51bGwpIHsKQEAgLTIwMTgsMTYgKzE5NDEsNjYgQEAKIAlpbm9kZV9mcmVlX3NlY3VyaXR5KGlub2RlKTsKIH0KIAorc3RhdGljIGludCBzZWxpbnV4X2lub2RlX2luaXRfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsCisJCQkJICAgICAgIGNoYXIgKipuYW1lLCB2b2lkICoqdmFsdWUsCisJCQkJICAgICAgIHNpemVfdCAqbGVuKQoreworCXN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYzsKKwlzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0ICpkc2VjOworCXN0cnVjdCBzdXBlcmJsb2NrX3NlY3VyaXR5X3N0cnVjdCAqc2JzZWM7CisJc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYzsKKwl1MzIgbmV3c2lkLCBjbGVuOworCWludCByYzsKKwljaGFyICpuYW1lcCA9IE5VTEwsICpjb250ZXh0OworCisJdHNlYyA9IGN1cnJlbnQtPnNlY3VyaXR5OworCWRzZWMgPSBkaXItPmlfc2VjdXJpdHk7CisJc2JzZWMgPSBkaXItPmlfc2ItPnNfc2VjdXJpdHk7CisJaXNlYyA9IGlub2RlLT5pX3NlY3VyaXR5OworCisJaWYgKHRzZWMtPmNyZWF0ZV9zaWQgJiYgc2JzZWMtPmJlaGF2aW9yICE9IFNFQ1VSSVRZX0ZTX1VTRV9NTlRQT0lOVCkgeworCQluZXdzaWQgPSB0c2VjLT5jcmVhdGVfc2lkOworCX0gZWxzZSB7CisJCXJjID0gc2VjdXJpdHlfdHJhbnNpdGlvbl9zaWQodHNlYy0+c2lkLCBkc2VjLT5zaWQsCisJCQkJCSAgICAgaW5vZGVfbW9kZV90b19zZWN1cml0eV9jbGFzcyhpbm9kZS0+aV9tb2RlKSwKKwkJCQkJICAgICAmbmV3c2lkKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogICIKKwkJCSAgICAgICAic2VjdXJpdHlfdHJhbnNpdGlvbl9zaWQgZmFpbGVkLCByYz0lZCAoZGV2PSVzICIKKwkJCSAgICAgICAiaW5vPSVsZClcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLAorCQkJICAgICAgIC1yYywgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlpbm9kZV9zZWN1cml0eV9zZXRfc2lkKGlub2RlLCBuZXdzaWQpOworCisJaWYgKG5hbWUpIHsKKwkJbmFtZXAgPSBrc3RyZHVwKFhBVFRSX1NFTElOVVhfU1VGRklYLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuYW1lcCkKKwkJCXJldHVybiAtRU5PTUVNOworCQkqbmFtZSA9IG5hbWVwOworCX0KKworCWlmICh2YWx1ZSAmJiBsZW4pIHsKKwkJcmMgPSBzZWN1cml0eV9zaWRfdG9fY29udGV4dChuZXdzaWQsICZjb250ZXh0LCAmY2xlbik7CisJCWlmIChyYykgeworCQkJa2ZyZWUobmFtZXApOworCQkJcmV0dXJuIHJjOworCQl9CisJCSp2YWx1ZSA9IGNvbnRleHQ7CisJCSpsZW4gPSBjbGVuOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHNlbGludXhfaW5vZGVfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtYXNrKQogewogCXJldHVybiBtYXlfY3JlYXRlKGRpciwgZGVudHJ5LCBTRUNDTEFTU19GSUxFKTsKIH0KIAotc3RhdGljIHZvaWQgc2VsaW51eF9pbm9kZV9wb3N0X2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbWFzaykKLXsKLQlwb3N0X2NyZWF0ZShkaXIsIGRlbnRyeSk7Ci19Ci0KIHN0YXRpYyBpbnQgc2VsaW51eF9pbm9kZV9saW5rKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQogewogCWludCByYzsKQEAgLTIwMzgsMTEgKzIwMTEsNiBAQAogCXJldHVybiBtYXlfbGluayhkaXIsIG9sZF9kZW50cnksIE1BWV9MSU5LKTsKIH0KIAotc3RhdGljIHZvaWQgc2VsaW51eF9pbm9kZV9wb3N0X2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKLXsKLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyBpbnQgc2VsaW51eF9pbm9kZV91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlpbnQgcmM7CkBAIC0yMDU4LDIxICsyMDI2LDExIEBACiAJcmV0dXJuIG1heV9jcmVhdGUoZGlyLCBkZW50cnksIFNFQ0NMQVNTX0xOS19GSUxFKTsKIH0KIAotc3RhdGljIHZvaWQgc2VsaW51eF9pbm9kZV9wb3N0X3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQlwb3N0X2NyZWF0ZShkaXIsIGRlbnRyeSk7Ci19Ci0KIHN0YXRpYyBpbnQgc2VsaW51eF9pbm9kZV9ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbWFzaykKIHsKIAlyZXR1cm4gbWF5X2NyZWF0ZShkaXIsIGRlbnRyeSwgU0VDQ0xBU1NfRElSKTsKIH0KIAotc3RhdGljIHZvaWQgc2VsaW51eF9pbm9kZV9wb3N0X21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtYXNrKQotewotCXBvc3RfY3JlYXRlKGRpciwgZGVudHJ5KTsKLX0KLQogc3RhdGljIGludCBzZWxpbnV4X2lub2RlX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJcmV0dXJuIG1heV9saW5rKGRpciwgZGVudHJ5LCBNQVlfUk1ESVIpOwpAQCAtMjA4OSwyMyArMjA0NywxMiBAQAogCXJldHVybiBtYXlfY3JlYXRlKGRpciwgZGVudHJ5LCBpbm9kZV9tb2RlX3RvX3NlY3VyaXR5X2NsYXNzKG1vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgc2VsaW51eF9pbm9kZV9wb3N0X21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBkZXZfdCBkZXYpCi17Ci0JcG9zdF9jcmVhdGUoZGlyLCBkZW50cnkpOwotfQotCiBzdGF0aWMgaW50IHNlbGludXhfaW5vZGVfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZSwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKIHsKIAlyZXR1cm4gbWF5X3JlbmFtZShvbGRfaW5vZGUsIG9sZF9kZW50cnksIG5ld19pbm9kZSwgbmV3X2RlbnRyeSk7CiB9CiAKLXN0YXRpYyB2b2lkIHNlbGludXhfaW5vZGVfcG9zdF9yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfaW5vZGUsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQotewotCXJldHVybjsKLX0KLQogc3RhdGljIGludCBzZWxpbnV4X2lub2RlX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlyZXR1cm4gZGVudHJ5X2hhc19wZXJtKGN1cnJlbnQsIE5VTEwsIGRlbnRyeSwgRklMRV9fUkVBRCk7CkBAIC00Mjk4LDIwICs0MjQ1LDE1IEBACiAKIAkuaW5vZGVfYWxsb2Nfc2VjdXJpdHkgPQkJc2VsaW51eF9pbm9kZV9hbGxvY19zZWN1cml0eSwKIAkuaW5vZGVfZnJlZV9zZWN1cml0eSA9CQlzZWxpbnV4X2lub2RlX2ZyZWVfc2VjdXJpdHksCisJLmlub2RlX2luaXRfc2VjdXJpdHkgPQkJc2VsaW51eF9pbm9kZV9pbml0X3NlY3VyaXR5LAogCS5pbm9kZV9jcmVhdGUgPQkJCXNlbGludXhfaW5vZGVfY3JlYXRlLAotCS5pbm9kZV9wb3N0X2NyZWF0ZSA9CQlzZWxpbnV4X2lub2RlX3Bvc3RfY3JlYXRlLAogCS5pbm9kZV9saW5rID0JCQlzZWxpbnV4X2lub2RlX2xpbmssCi0JLmlub2RlX3Bvc3RfbGluayA9CQlzZWxpbnV4X2lub2RlX3Bvc3RfbGluaywKIAkuaW5vZGVfdW5saW5rID0JCQlzZWxpbnV4X2lub2RlX3VubGluaywKIAkuaW5vZGVfc3ltbGluayA9CQlzZWxpbnV4X2lub2RlX3N5bWxpbmssCi0JLmlub2RlX3Bvc3Rfc3ltbGluayA9CQlzZWxpbnV4X2lub2RlX3Bvc3Rfc3ltbGluaywKIAkuaW5vZGVfbWtkaXIgPQkJCXNlbGludXhfaW5vZGVfbWtkaXIsCi0JLmlub2RlX3Bvc3RfbWtkaXIgPQkJc2VsaW51eF9pbm9kZV9wb3N0X21rZGlyLAogCS5pbm9kZV9ybWRpciA9CQkJc2VsaW51eF9pbm9kZV9ybWRpciwKIAkuaW5vZGVfbWtub2QgPQkJCXNlbGludXhfaW5vZGVfbWtub2QsCi0JLmlub2RlX3Bvc3RfbWtub2QgPQkJc2VsaW51eF9pbm9kZV9wb3N0X21rbm9kLAogCS5pbm9kZV9yZW5hbWUgPQkJCXNlbGludXhfaW5vZGVfcmVuYW1lLAotCS5pbm9kZV9wb3N0X3JlbmFtZSA9CQlzZWxpbnV4X2lub2RlX3Bvc3RfcmVuYW1lLAogCS5pbm9kZV9yZWFkbGluayA9CQlzZWxpbnV4X2lub2RlX3JlYWRsaW5rLAogCS5pbm9kZV9mb2xsb3dfbGluayA9CQlzZWxpbnV4X2lub2RlX2ZvbGxvd19saW5rLAogCS5pbm9kZV9wZXJtaXNzaW9uID0JCXNlbGludXhfaW5vZGVfcGVybWlzc2lvbiwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlY3VyaXR5LmgKaW5kZXggNzFjMGExOS4uNWYwMTZjOSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlY3VyaXR5LmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlY3VyaXR5LmgKQEAgLTIzLDEwICsyMywxMSBAQAogI2RlZmluZSBQT0xJQ1lEQl9WRVJTSU9OX05MQ0xBU1MJMTgKICNkZWZpbmUgUE9MSUNZREJfVkVSU0lPTl9WQUxJREFURVRSQU5TCTE5CiAjZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fTUxTCQkxOQorI2RlZmluZSBQT0xJQ1lEQl9WRVJTSU9OX0FWVEFCCQkyMAogCiAvKiBSYW5nZSBvZiBwb2xpY3kgdmVyc2lvbnMgd2UgdW5kZXJzdGFuZCovCiAjZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fTUlOICAgUE9MSUNZREJfVkVSU0lPTl9CQVNFCi0jZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fTUFYICAgUE9MSUNZREJfVkVSU0lPTl9NTFMKKyNkZWZpbmUgUE9MSUNZREJfVkVSU0lPTl9NQVggICBQT0xJQ1lEQl9WRVJTSU9OX0FWVEFCCiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9CT09UUEFSQU0KIGV4dGVybiBpbnQgc2VsaW51eF9lbmFibGVkOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9hdnRhYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9hdnRhYi5jCmluZGV4IGYyMzhjMDMuLmRkZTA5NGYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvYXZ0YWIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2F2dGFiLmMKQEAgLTU4LDYgKzU4LDcgQEAKIHsKIAlpbnQgaHZhbHVlOwogCXN0cnVjdCBhdnRhYl9ub2RlICpwcmV2LCAqY3VyLCAqbmV3bm9kZTsKKwl1MTYgc3BlY2lmaWVkID0ga2V5LT5zcGVjaWZpZWQgJiB+KEFWVEFCX0VOQUJMRUR8QVZUQUJfRU5BQkxFRF9PTEQpOwogCiAJaWYgKCFoKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY5LDcgKzcwLDcgQEAKIAkJaWYgKGtleS0+c291cmNlX3R5cGUgPT0gY3VyLT5rZXkuc291cmNlX3R5cGUgJiYKIAkJICAgIGtleS0+dGFyZ2V0X3R5cGUgPT0gY3VyLT5rZXkudGFyZ2V0X3R5cGUgJiYKIAkJICAgIGtleS0+dGFyZ2V0X2NsYXNzID09IGN1ci0+a2V5LnRhcmdldF9jbGFzcyAmJgotCQkgICAgKGRhdHVtLT5zcGVjaWZpZWQgJiBjdXItPmRhdHVtLnNwZWNpZmllZCkpCisJCSAgICAoc3BlY2lmaWVkICYgY3VyLT5rZXkuc3BlY2lmaWVkKSkKIAkJCXJldHVybiAtRUVYSVNUOwogCQlpZiAoa2V5LT5zb3VyY2VfdHlwZSA8IGN1ci0+a2V5LnNvdXJjZV90eXBlKQogCQkJYnJlYWs7CkBAIC05OCw2ICs5OSw3IEBACiB7CiAJaW50IGh2YWx1ZTsKIAlzdHJ1Y3QgYXZ0YWJfbm9kZSAqcHJldiwgKmN1ciwgKm5ld25vZGU7CisJdTE2IHNwZWNpZmllZCA9IGtleS0+c3BlY2lmaWVkICYgfihBVlRBQl9FTkFCTEVEfEFWVEFCX0VOQUJMRURfT0xEKTsKIAogCWlmICghaCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMDgsNyArMTEwLDcgQEAKIAkJaWYgKGtleS0+c291cmNlX3R5cGUgPT0gY3VyLT5rZXkuc291cmNlX3R5cGUgJiYKIAkJICAgIGtleS0+dGFyZ2V0X3R5cGUgPT0gY3VyLT5rZXkudGFyZ2V0X3R5cGUgJiYKIAkJICAgIGtleS0+dGFyZ2V0X2NsYXNzID09IGN1ci0+a2V5LnRhcmdldF9jbGFzcyAmJgotCQkgICAgKGRhdHVtLT5zcGVjaWZpZWQgJiBjdXItPmRhdHVtLnNwZWNpZmllZCkpCisJCSAgICAoc3BlY2lmaWVkICYgY3VyLT5rZXkuc3BlY2lmaWVkKSkKIAkJCWJyZWFrOwogCQlpZiAoa2V5LT5zb3VyY2VfdHlwZSA8IGN1ci0+a2V5LnNvdXJjZV90eXBlKQogCQkJYnJlYWs7CkBAIC0xMjUsMTAgKzEyNywxMSBAQAogCXJldHVybiBuZXdub2RlOwogfQogCi1zdHJ1Y3QgYXZ0YWJfZGF0dW0gKmF2dGFiX3NlYXJjaChzdHJ1Y3QgYXZ0YWIgKmgsIHN0cnVjdCBhdnRhYl9rZXkgKmtleSwgaW50IHNwZWNpZmllZCkKK3N0cnVjdCBhdnRhYl9kYXR1bSAqYXZ0YWJfc2VhcmNoKHN0cnVjdCBhdnRhYiAqaCwgc3RydWN0IGF2dGFiX2tleSAqa2V5KQogewogCWludCBodmFsdWU7CiAJc3RydWN0IGF2dGFiX25vZGUgKmN1cjsKKwl1MTYgc3BlY2lmaWVkID0ga2V5LT5zcGVjaWZpZWQgJiB+KEFWVEFCX0VOQUJMRUR8QVZUQUJfRU5BQkxFRF9PTEQpOwogCiAJaWYgKCFoKQogCQlyZXR1cm4gTlVMTDsKQEAgLTEzOCw3ICsxNDEsNyBAQAogCQlpZiAoa2V5LT5zb3VyY2VfdHlwZSA9PSBjdXItPmtleS5zb3VyY2VfdHlwZSAmJgogCQkgICAga2V5LT50YXJnZXRfdHlwZSA9PSBjdXItPmtleS50YXJnZXRfdHlwZSAmJgogCQkgICAga2V5LT50YXJnZXRfY2xhc3MgPT0gY3VyLT5rZXkudGFyZ2V0X2NsYXNzICYmCi0JCSAgICAoc3BlY2lmaWVkICYgY3VyLT5kYXR1bS5zcGVjaWZpZWQpKQorCQkgICAgKHNwZWNpZmllZCAmIGN1ci0+a2V5LnNwZWNpZmllZCkpCiAJCQlyZXR1cm4gJmN1ci0+ZGF0dW07CiAKIAkJaWYgKGtleS0+c291cmNlX3R5cGUgPCBjdXItPmtleS5zb3VyY2VfdHlwZSkKQEAgLTE1OSwxMCArMTYyLDExIEBACiAgKiBjb25qdW5jdGlvbiB3aXRoIGF2dGFiX3NlYXJjaF9uZXh0X25vZGUoKQogICovCiBzdHJ1Y3QgYXZ0YWJfbm9kZSoKLWF2dGFiX3NlYXJjaF9ub2RlKHN0cnVjdCBhdnRhYiAqaCwgc3RydWN0IGF2dGFiX2tleSAqa2V5LCBpbnQgc3BlY2lmaWVkKQorYXZ0YWJfc2VhcmNoX25vZGUoc3RydWN0IGF2dGFiICpoLCBzdHJ1Y3QgYXZ0YWJfa2V5ICprZXkpCiB7CiAJaW50IGh2YWx1ZTsKIAlzdHJ1Y3QgYXZ0YWJfbm9kZSAqY3VyOworCXUxNiBzcGVjaWZpZWQgPSBrZXktPnNwZWNpZmllZCAmIH4oQVZUQUJfRU5BQkxFRHxBVlRBQl9FTkFCTEVEX09MRCk7CiAKIAlpZiAoIWgpCiAJCXJldHVybiBOVUxMOwpAQCAtMTcyLDcgKzE3Niw3IEBACiAJCWlmIChrZXktPnNvdXJjZV90eXBlID09IGN1ci0+a2V5LnNvdXJjZV90eXBlICYmCiAJCSAgICBrZXktPnRhcmdldF90eXBlID09IGN1ci0+a2V5LnRhcmdldF90eXBlICYmCiAJCSAgICBrZXktPnRhcmdldF9jbGFzcyA9PSBjdXItPmtleS50YXJnZXRfY2xhc3MgJiYKLQkJICAgIChzcGVjaWZpZWQgJiBjdXItPmRhdHVtLnNwZWNpZmllZCkpCisJCSAgICAoc3BlY2lmaWVkICYgY3VyLT5rZXkuc3BlY2lmaWVkKSkKIAkJCXJldHVybiBjdXI7CiAKIAkJaWYgKGtleS0+c291cmNlX3R5cGUgPCBjdXItPmtleS5zb3VyY2VfdHlwZSkKQEAgLTE5NiwxMSArMjAwLDEyIEBACiAJaWYgKCFub2RlKQogCQlyZXR1cm4gTlVMTDsKIAorCXNwZWNpZmllZCAmPSB+KEFWVEFCX0VOQUJMRUR8QVZUQUJfRU5BQkxFRF9PTEQpOwogCWZvciAoY3VyID0gbm9kZS0+bmV4dDsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKIAkJaWYgKG5vZGUtPmtleS5zb3VyY2VfdHlwZSA9PSBjdXItPmtleS5zb3VyY2VfdHlwZSAmJgogCQkgICAgbm9kZS0+a2V5LnRhcmdldF90eXBlID09IGN1ci0+a2V5LnRhcmdldF90eXBlICYmCiAJCSAgICBub2RlLT5rZXkudGFyZ2V0X2NsYXNzID09IGN1ci0+a2V5LnRhcmdldF9jbGFzcyAmJgotCQkgICAgKHNwZWNpZmllZCAmIGN1ci0+ZGF0dW0uc3BlY2lmaWVkKSkKKwkJICAgIChzcGVjaWZpZWQgJiBjdXItPmtleS5zcGVjaWZpZWQpKQogCQkJcmV0dXJuIGN1cjsKIAogCQlpZiAobm9kZS0+a2V5LnNvdXJjZV90eXBlIDwgY3VyLT5rZXkuc291cmNlX3R5cGUpCkBAIC0yNzgsNzYgKzI4MywxMjkgQEAKIAkgICAgICAgbWF4X2NoYWluX2xlbik7CiB9CiAKLWludCBhdnRhYl9yZWFkX2l0ZW0odm9pZCAqZnAsIHN0cnVjdCBhdnRhYl9kYXR1bSAqYXZkYXR1bSwgc3RydWN0IGF2dGFiX2tleSAqYXZrZXkpCitzdGF0aWMgdWludDE2X3Qgc3BlY19vcmRlcltdID0geworCUFWVEFCX0FMTE9XRUQsCisJQVZUQUJfQVVESVRERU5ZLAorCUFWVEFCX0FVRElUQUxMT1csCisJQVZUQUJfVFJBTlNJVElPTiwKKwlBVlRBQl9DSEFOR0UsCisJQVZUQUJfTUVNQkVSCit9OworCitpbnQgYXZ0YWJfcmVhZF9pdGVtKHZvaWQgKmZwLCB1MzIgdmVycywgc3RydWN0IGF2dGFiICphLAorCSAgICAgICAgICAgIGludCAoKmluc2VydGYpKHN0cnVjdCBhdnRhYiAqYSwgc3RydWN0IGF2dGFiX2tleSAqaywKKwkJCQkgICBzdHJ1Y3QgYXZ0YWJfZGF0dW0gKmQsIHZvaWQgKnApLAorCQkgICAgdm9pZCAqcCkKIHsKLQl1MzIgYnVmWzddOwotCXUzMiBpdGVtcywgaXRlbXMyOwotCWludCByYzsKKwlfX2xlMTYgYnVmMTZbNF07CisJdTE2IGVuYWJsZWQ7CisJX19sZTMyIGJ1ZjMyWzddOworCXUzMiBpdGVtcywgaXRlbXMyLCB2YWw7CisJc3RydWN0IGF2dGFiX2tleSBrZXk7CisJc3RydWN0IGF2dGFiX2RhdHVtIGRhdHVtOworCWludCBpLCByYzsKIAotCW1lbXNldChhdmtleSwgMCwgc2l6ZW9mKHN0cnVjdCBhdnRhYl9rZXkpKTsKLQltZW1zZXQoYXZkYXR1bSwgMCwgc2l6ZW9mKHN0cnVjdCBhdnRhYl9kYXR1bSkpOworCW1lbXNldCgma2V5LCAwLCBzaXplb2Yoc3RydWN0IGF2dGFiX2tleSkpOworCW1lbXNldCgmZGF0dW0sIDAsIHNpemVvZihzdHJ1Y3QgYXZ0YWJfZGF0dW0pKTsKIAotCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7CisJaWYgKHZlcnMgPCBQT0xJQ1lEQl9WRVJTSU9OX0FWVEFCKSB7CisJCXJjID0gbmV4dF9lbnRyeShidWYzMiwgZnAsIHNpemVvZih1MzIpKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzZWN1cml0eTogYXZ0YWI6IHRydW5jYXRlZCBlbnRyeVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaXRlbXMyID0gbGUzMl90b19jcHUoYnVmMzJbMF0pOworCQlpZiAoaXRlbXMyID4gQVJSQVlfU0laRShidWYzMikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2VjdXJpdHk6IGF2dGFiOiBlbnRyeSBvdmVyZmxvd1xuIik7CisJCQlyZXR1cm4gLTE7CisKKwkJfQorCQlyYyA9IG5leHRfZW50cnkoYnVmMzIsIGZwLCBzaXplb2YodTMyKSppdGVtczIpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiBhdnRhYjogdHJ1bmNhdGVkIGVudHJ5XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpdGVtcyA9IDA7CisKKwkJdmFsID0gbGUzMl90b19jcHUoYnVmMzJbaXRlbXMrK10pOworCQlrZXkuc291cmNlX3R5cGUgPSAodTE2KXZhbDsKKwkJaWYgKGtleS5zb3VyY2VfdHlwZSAhPSB2YWwpIHsKKwkJCXByaW50aygic2VjdXJpdHk6IGF2dGFiOiB0cnVuY2F0ZWQgc291cmNlIHR5cGVcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXZhbCA9IGxlMzJfdG9fY3B1KGJ1ZjMyW2l0ZW1zKytdKTsKKwkJa2V5LnRhcmdldF90eXBlID0gKHUxNil2YWw7CisJCWlmIChrZXkudGFyZ2V0X3R5cGUgIT0gdmFsKSB7CisJCQlwcmludGsoInNlY3VyaXR5OiBhdnRhYjogdHJ1bmNhdGVkIHRhcmdldCB0eXBlXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl2YWwgPSBsZTMyX3RvX2NwdShidWYzMltpdGVtcysrXSk7CisJCWtleS50YXJnZXRfY2xhc3MgPSAodTE2KXZhbDsKKwkJaWYgKGtleS50YXJnZXRfY2xhc3MgIT0gdmFsKSB7CisJCQlwcmludGsoInNlY3VyaXR5OiBhdnRhYjogdHJ1bmNhdGVkIHRhcmdldCBjbGFzc1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl2YWwgPSBsZTMyX3RvX2NwdShidWYzMltpdGVtcysrXSk7CisJCWVuYWJsZWQgPSAodmFsICYgQVZUQUJfRU5BQkxFRF9PTEQpID8gQVZUQUJfRU5BQkxFRCA6IDA7CisKKwkJaWYgKCEodmFsICYgKEFWVEFCX0FWIHwgQVZUQUJfVFlQRSkpKSB7CisJCQlwcmludGsoInNlY3VyaXR5OiBhdnRhYjogbnVsbCBlbnRyeVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKCh2YWwgJiBBVlRBQl9BVikgJiYKKwkJICAgICh2YWwgJiBBVlRBQl9UWVBFKSkgeworCQkJcHJpbnRrKCJzZWN1cml0eTogYXZ0YWI6IGVudHJ5IGhhcyBib3RoIGFjY2VzcyB2ZWN0b3JzIGFuZCB0eXBlc1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNwZWNfb3JkZXIpL3NpemVvZih1MTYpOyBpKyspIHsKKwkJCWlmICh2YWwgJiBzcGVjX29yZGVyW2ldKSB7CisJCQkJa2V5LnNwZWNpZmllZCA9IHNwZWNfb3JkZXJbaV0gfCBlbmFibGVkOworCQkJCWRhdHVtLmRhdGEgPSBsZTMyX3RvX2NwdShidWYzMltpdGVtcysrXSk7CisJCQkJcmMgPSBpbnNlcnRmKGEsICZrZXksICZkYXR1bSwgcCk7CisJCQkJaWYgKHJjKSByZXR1cm4gcmM7CisJCQl9CisJCX0KKworCQlpZiAoaXRlbXMgIT0gaXRlbXMyKSB7CisJCQlwcmludGsoInNlY3VyaXR5OiBhdnRhYjogZW50cnkgb25seSBoYWQgJWQgaXRlbXMsIGV4cGVjdGVkICVkXG4iLCBpdGVtczIsIGl0ZW1zKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IG5leHRfZW50cnkoYnVmMTYsIGZwLCBzaXplb2YodTE2KSo0KTsKIAlpZiAocmMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2VjdXJpdHk6IGF2dGFiOiB0cnVuY2F0ZWQgZW50cnlcbiIpOwotCQlnb3RvIGJhZDsKKwkJcHJpbnRrKCJzZWN1cml0eTogYXZ0YWI6IHRydW5jYXRlZCBlbnRyeVxuIik7CisJCXJldHVybiAtMTsKIAl9Ci0JaXRlbXMyID0gbGUzMl90b19jcHUoYnVmWzBdKTsKLQlpZiAoaXRlbXMyID4gQVJSQVlfU0laRShidWYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2VjdXJpdHk6IGF2dGFiOiBlbnRyeSBvdmVyZmxvd1xuIik7Ci0JCWdvdG8gYmFkOwotCX0KLQlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikqaXRlbXMyKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2VjdXJpdHk6IGF2dGFiOiB0cnVuY2F0ZWQgZW50cnlcbiIpOwotCQlnb3RvIGJhZDsKLQl9CisKIAlpdGVtcyA9IDA7Ci0JYXZrZXktPnNvdXJjZV90eXBlID0gbGUzMl90b19jcHUoYnVmW2l0ZW1zKytdKTsKLQlhdmtleS0+dGFyZ2V0X3R5cGUgPSBsZTMyX3RvX2NwdShidWZbaXRlbXMrK10pOwotCWF2a2V5LT50YXJnZXRfY2xhc3MgPSBsZTMyX3RvX2NwdShidWZbaXRlbXMrK10pOwotCWF2ZGF0dW0tPnNwZWNpZmllZCA9IGxlMzJfdG9fY3B1KGJ1ZltpdGVtcysrXSk7Ci0JaWYgKCEoYXZkYXR1bS0+c3BlY2lmaWVkICYgKEFWVEFCX0FWIHwgQVZUQUJfVFlQRSkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2VjdXJpdHk6IGF2dGFiOiBudWxsIGVudHJ5XG4iKTsKLQkJZ290byBiYWQ7Ci0JfQotCWlmICgoYXZkYXR1bS0+c3BlY2lmaWVkICYgQVZUQUJfQVYpICYmCi0JICAgIChhdmRhdHVtLT5zcGVjaWZpZWQgJiBBVlRBQl9UWVBFKSkgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiBhdnRhYjogZW50cnkgaGFzIGJvdGggYWNjZXNzIHZlY3RvcnMgYW5kIHR5cGVzXG4iKTsKLQkJZ290byBiYWQ7Ci0JfQotCWlmIChhdmRhdHVtLT5zcGVjaWZpZWQgJiBBVlRBQl9BVikgewotCQlpZiAoYXZkYXR1bS0+c3BlY2lmaWVkICYgQVZUQUJfQUxMT1dFRCkKLQkJCWF2dGFiX2FsbG93ZWQoYXZkYXR1bSkgPSBsZTMyX3RvX2NwdShidWZbaXRlbXMrK10pOwotCQlpZiAoYXZkYXR1bS0+c3BlY2lmaWVkICYgQVZUQUJfQVVESVRERU5ZKQotCQkJYXZ0YWJfYXVkaXRkZW55KGF2ZGF0dW0pID0gbGUzMl90b19jcHUoYnVmW2l0ZW1zKytdKTsKLQkJaWYgKGF2ZGF0dW0tPnNwZWNpZmllZCAmIEFWVEFCX0FVRElUQUxMT1cpCi0JCQlhdnRhYl9hdWRpdGFsbG93KGF2ZGF0dW0pID0gbGUzMl90b19jcHUoYnVmW2l0ZW1zKytdKTsKLQl9IGVsc2UgewotCQlpZiAoYXZkYXR1bS0+c3BlY2lmaWVkICYgQVZUQUJfVFJBTlNJVElPTikKLQkJCWF2dGFiX3RyYW5zaXRpb24oYXZkYXR1bSkgPSBsZTMyX3RvX2NwdShidWZbaXRlbXMrK10pOwotCQlpZiAoYXZkYXR1bS0+c3BlY2lmaWVkICYgQVZUQUJfQ0hBTkdFKQotCQkJYXZ0YWJfY2hhbmdlKGF2ZGF0dW0pID0gbGUzMl90b19jcHUoYnVmW2l0ZW1zKytdKTsKLQkJaWYgKGF2ZGF0dW0tPnNwZWNpZmllZCAmIEFWVEFCX01FTUJFUikKLQkJCWF2dGFiX21lbWJlcihhdmRhdHVtKSA9IGxlMzJfdG9fY3B1KGJ1ZltpdGVtcysrXSk7Ci0JfQotCWlmIChpdGVtcyAhPSBpdGVtczIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzZWN1cml0eTogYXZ0YWI6IGVudHJ5IG9ubHkgaGFkICVkIGl0ZW1zLCBleHBlY3RlZCAlZFxuIiwKLQkJICAgICAgIGl0ZW1zMiwgaXRlbXMpOwotCQlnb3RvIGJhZDsKLQl9CisJa2V5LnNvdXJjZV90eXBlID0gbGUxNl90b19jcHUoYnVmMTZbaXRlbXMrK10pOworCWtleS50YXJnZXRfdHlwZSA9IGxlMTZfdG9fY3B1KGJ1ZjE2W2l0ZW1zKytdKTsKKwlrZXkudGFyZ2V0X2NsYXNzID0gbGUxNl90b19jcHUoYnVmMTZbaXRlbXMrK10pOworCWtleS5zcGVjaWZpZWQgPSBsZTE2X3RvX2NwdShidWYxNltpdGVtcysrXSk7CiAKLQlyZXR1cm4gMDsKLWJhZDoKLQlyZXR1cm4gLTE7CisJcmMgPSBuZXh0X2VudHJ5KGJ1ZjMyLCBmcCwgc2l6ZW9mKHUzMikpOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKCJzZWN1cml0eTogYXZ0YWI6IHRydW5jYXRlZCBlbnRyeVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJZGF0dW0uZGF0YSA9IGxlMzJfdG9fY3B1KCpidWYzMik7CisJcmV0dXJuIGluc2VydGYoYSwgJmtleSwgJmRhdHVtLCBwKTsKIH0KIAotaW50IGF2dGFiX3JlYWQoc3RydWN0IGF2dGFiICphLCB2b2lkICpmcCwgdTMyIGNvbmZpZykKK3N0YXRpYyBpbnQgYXZ0YWJfaW5zZXJ0ZihzdHJ1Y3QgYXZ0YWIgKmEsIHN0cnVjdCBhdnRhYl9rZXkgKmssCisJCQkgc3RydWN0IGF2dGFiX2RhdHVtICpkLCB2b2lkICpwKQoreworCXJldHVybiBhdnRhYl9pbnNlcnQoYSwgaywgZCk7Cit9CisKK2ludCBhdnRhYl9yZWFkKHN0cnVjdCBhdnRhYiAqYSwgdm9pZCAqZnAsIHUzMiB2ZXJzKQogewogCWludCByYzsKLQlzdHJ1Y3QgYXZ0YWJfa2V5IGF2a2V5OwotCXN0cnVjdCBhdnRhYl9kYXR1bSBhdmRhdHVtOwotCXUzMiBidWZbMV07CisJX19sZTMyIGJ1ZlsxXTsKIAl1MzIgbmVsLCBpOwogCiAKQEAgLTM2MywxNiArNDIxLDE0IEBACiAJCWdvdG8gYmFkOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgbmVsOyBpKyspIHsKLQkJaWYgKGF2dGFiX3JlYWRfaXRlbShmcCwgJmF2ZGF0dW0sICZhdmtleSkpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gYmFkOwotCQl9Ci0JCXJjID0gYXZ0YWJfaW5zZXJ0KGEsICZhdmtleSwgJmF2ZGF0dW0pOworCQlyYyA9IGF2dGFiX3JlYWRfaXRlbShmcCx2ZXJzLCBhLCBhdnRhYl9pbnNlcnRmLCBOVUxMKTsKIAkJaWYgKHJjKSB7CiAJCQlpZiAocmMgPT0gLUVOT01FTSkKIAkJCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiBhdnRhYjogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCQlpZiAocmMgPT0gLUVFWElTVCkKKwkJCWVsc2UgaWYgKHJjID09IC1FRVhJU1QpCiAJCQkJcHJpbnRrKEtFUk5fRVJSICJzZWN1cml0eTogYXZ0YWI6IGR1cGxpY2F0ZSBlbnRyeVxuIik7CisJCQllbHNlCisJCQkJcmMgPSAtRUlOVkFMOwogCQkJZ290byBiYWQ7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL2F2dGFiLmggYi9zZWN1cml0eS9zZWxpbnV4L3NzL2F2dGFiLmgKaW5kZXggNTE5ZDRmNi4uMGE5MGQ5MyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9hdnRhYi5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvYXZ0YWIuaApAQCAtMjEsMTIgKzIxLDkgQEAKICNkZWZpbmUgX1NTX0FWVEFCX0hfCiAKIHN0cnVjdCBhdnRhYl9rZXkgewotCXUzMiBzb3VyY2VfdHlwZTsJLyogc291cmNlIHR5cGUgKi8KLQl1MzIgdGFyZ2V0X3R5cGU7CS8qIHRhcmdldCB0eXBlICovCi0JdTMyIHRhcmdldF9jbGFzczsJLyogdGFyZ2V0IG9iamVjdCBjbGFzcyAqLwotfTsKLQotc3RydWN0IGF2dGFiX2RhdHVtIHsKKwl1MTYgc291cmNlX3R5cGU7CS8qIHNvdXJjZSB0eXBlICovCisJdTE2IHRhcmdldF90eXBlOwkvKiB0YXJnZXQgdHlwZSAqLworCXUxNiB0YXJnZXRfY2xhc3M7CS8qIHRhcmdldCBvYmplY3QgY2xhc3MgKi8KICNkZWZpbmUgQVZUQUJfQUxMT1dFRCAgICAgMQogI2RlZmluZSBBVlRBQl9BVURJVEFMTE9XICAyCiAjZGVmaW5lIEFWVEFCX0FVRElUREVOWSAgIDQKQEAgLTM1LDE1ICszMiwxMyBAQAogI2RlZmluZSBBVlRBQl9NRU1CRVIgICAgIDMyCiAjZGVmaW5lIEFWVEFCX0NIQU5HRSAgICAgNjQKICNkZWZpbmUgQVZUQUJfVFlQRSAgICAgICAoQVZUQUJfVFJBTlNJVElPTiB8IEFWVEFCX01FTUJFUiB8IEFWVEFCX0NIQU5HRSkKLSNkZWZpbmUgQVZUQUJfRU5BQkxFRCAgICAweDgwMDAwMDAwIC8qIHJlc2VydmVkIGZvciB1c2VkIGluIGNvbmRfYXZ0YWIgKi8KLQl1MzIgc3BlY2lmaWVkOwkvKiB3aGF0IGZpZWxkcyBhcmUgc3BlY2lmaWVkICovCi0JdTMyIGRhdGFbM107CS8qIGFjY2VzcyB2ZWN0b3JzIG9yIHR5cGVzICovCi0jZGVmaW5lIGF2dGFiX2FsbG93ZWQoeCkgKHgpLT5kYXRhWzBdCi0jZGVmaW5lIGF2dGFiX2F1ZGl0ZGVueSh4KSAoeCktPmRhdGFbMV0KLSNkZWZpbmUgYXZ0YWJfYXVkaXRhbGxvdyh4KSAoeCktPmRhdGFbMl0KLSNkZWZpbmUgYXZ0YWJfdHJhbnNpdGlvbih4KSAoeCktPmRhdGFbMF0KLSNkZWZpbmUgYXZ0YWJfY2hhbmdlKHgpICh4KS0+ZGF0YVsxXQotI2RlZmluZSBhdnRhYl9tZW1iZXIoeCkgKHgpLT5kYXRhWzJdCisjZGVmaW5lIEFWVEFCX0VOQUJMRURfT0xEICAgIDB4ODAwMDAwMDAgLyogcmVzZXJ2ZWQgZm9yIHVzZWQgaW4gY29uZF9hdnRhYiAqLworI2RlZmluZSBBVlRBQl9FTkFCTEVEICAgIDB4ODAwMCAvKiByZXNlcnZlZCBmb3IgdXNlZCBpbiBjb25kX2F2dGFiICovCisJdTE2IHNwZWNpZmllZDsJLyogd2hhdCBmaWVsZCBpcyBzcGVjaWZpZWQgKi8KK307CisKK3N0cnVjdCBhdnRhYl9kYXR1bSB7CisJdTMyIGRhdGE7IC8qIGFjY2VzcyB2ZWN0b3Igb3IgdHlwZSB2YWx1ZSAqLwogfTsKIAogc3RydWN0IGF2dGFiX25vZGUgewpAQCAtNTgsMTcgKzUzLDIxIEBACiB9OwogCiBpbnQgYXZ0YWJfaW5pdChzdHJ1Y3QgYXZ0YWIgKik7Ci1zdHJ1Y3QgYXZ0YWJfZGF0dW0gKmF2dGFiX3NlYXJjaChzdHJ1Y3QgYXZ0YWIgKmgsIHN0cnVjdCBhdnRhYl9rZXkgKmssIGludCBzcGVjaWZpZWQpOworc3RydWN0IGF2dGFiX2RhdHVtICphdnRhYl9zZWFyY2goc3RydWN0IGF2dGFiICpoLCBzdHJ1Y3QgYXZ0YWJfa2V5ICprKTsKIHZvaWQgYXZ0YWJfZGVzdHJveShzdHJ1Y3QgYXZ0YWIgKmgpOwogdm9pZCBhdnRhYl9oYXNoX2V2YWwoc3RydWN0IGF2dGFiICpoLCBjaGFyICp0YWcpOwogCi1pbnQgYXZ0YWJfcmVhZF9pdGVtKHZvaWQgKmZwLCBzdHJ1Y3QgYXZ0YWJfZGF0dW0gKmF2ZGF0dW0sIHN0cnVjdCBhdnRhYl9rZXkgKmF2a2V5KTsKLWludCBhdnRhYl9yZWFkKHN0cnVjdCBhdnRhYiAqYSwgdm9pZCAqZnAsIHUzMiBjb25maWcpOworaW50IGF2dGFiX3JlYWRfaXRlbSh2b2lkICpmcCwgdWludDMyX3QgdmVycywgc3RydWN0IGF2dGFiICphLAorCQkgICAgaW50ICgqaW5zZXJ0KShzdHJ1Y3QgYXZ0YWIgKmEsIHN0cnVjdCBhdnRhYl9rZXkgKmssCisJCQkJICBzdHJ1Y3QgYXZ0YWJfZGF0dW0gKmQsIHZvaWQgKnApLAorCQkgICAgdm9pZCAqcCk7CisKK2ludCBhdnRhYl9yZWFkKHN0cnVjdCBhdnRhYiAqYSwgdm9pZCAqZnAsIHUzMiB2ZXJzKTsKIAogc3RydWN0IGF2dGFiX25vZGUgKmF2dGFiX2luc2VydF9ub251bmlxdWUoc3RydWN0IGF2dGFiICpoLCBzdHJ1Y3QgYXZ0YWJfa2V5ICprZXksCiAJCQkJCSAgc3RydWN0IGF2dGFiX2RhdHVtICpkYXR1bSk7CiAKLXN0cnVjdCBhdnRhYl9ub2RlICphdnRhYl9zZWFyY2hfbm9kZShzdHJ1Y3QgYXZ0YWIgKmgsIHN0cnVjdCBhdnRhYl9rZXkgKmtleSwgaW50IHNwZWNpZmllZCk7CitzdHJ1Y3QgYXZ0YWJfbm9kZSAqYXZ0YWJfc2VhcmNoX25vZGUoc3RydWN0IGF2dGFiICpoLCBzdHJ1Y3QgYXZ0YWJfa2V5ICprZXkpOwogCiBzdHJ1Y3QgYXZ0YWJfbm9kZSAqYXZ0YWJfc2VhcmNoX25vZGVfbmV4dChzdHJ1Y3QgYXZ0YWJfbm9kZSAqbm9kZSwgaW50IHNwZWNpZmllZCk7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYwppbmRleCBlMjA1N2Y1Li5kYWYyODgwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jCkBAIC0xMDAsMTggKzEwMCwxOCBAQAogCQkvKiB0dXJuIHRoZSBydWxlcyBvbiBvciBvZmYgKi8KIAkJZm9yIChjdXIgPSBub2RlLT50cnVlX2xpc3Q7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKIAkJCWlmIChuZXdfc3RhdGUgPD0gMCkgewotCQkJCWN1ci0+bm9kZS0+ZGF0dW0uc3BlY2lmaWVkICY9IH5BVlRBQl9FTkFCTEVEOworCQkJCWN1ci0+bm9kZS0+a2V5LnNwZWNpZmllZCAmPSB+QVZUQUJfRU5BQkxFRDsKIAkJCX0gZWxzZSB7Ci0JCQkJY3VyLT5ub2RlLT5kYXR1bS5zcGVjaWZpZWQgfD0gQVZUQUJfRU5BQkxFRDsKKwkJCQljdXItPm5vZGUtPmtleS5zcGVjaWZpZWQgfD0gQVZUQUJfRU5BQkxFRDsKIAkJCX0KIAkJfQogCiAJCWZvciAoY3VyID0gbm9kZS0+ZmFsc2VfbGlzdDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgewogCQkJLyogLTEgb3IgMSAqLwogCQkJaWYgKG5ld19zdGF0ZSkgewotCQkJCWN1ci0+bm9kZS0+ZGF0dW0uc3BlY2lmaWVkICY9IH5BVlRBQl9FTkFCTEVEOworCQkJCWN1ci0+bm9kZS0+a2V5LnNwZWNpZmllZCAmPSB+QVZUQUJfRU5BQkxFRDsKIAkJCX0gZWxzZSB7Ci0JCQkJY3VyLT5ub2RlLT5kYXR1bS5zcGVjaWZpZWQgfD0gQVZUQUJfRU5BQkxFRDsKKwkJCQljdXItPm5vZGUtPmtleS5zcGVjaWZpZWQgfD0gQVZUQUJfRU5BQkxFRDsKIAkJCX0KIAkJfQogCX0KQEAgLTIxNiw3ICsyMTYsOCBAQAogewogCWNoYXIgKmtleSA9IE5VTEw7CiAJc3RydWN0IGNvbmRfYm9vbF9kYXR1bSAqYm9vbGRhdHVtOwotCXUzMiBidWZbM10sIGxlbjsKKwlfX2xlMzIgYnVmWzNdOworCXUzMiBsZW47CiAJaW50IHJjOwogCiAJYm9vbGRhdHVtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNvbmRfYm9vbF9kYXR1bSksIEdGUF9LRVJORUwpOwpAQCAtMjUyLDIxICsyNTMsMTA0IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IGNvbmRfcmVhZF9hdl9saXN0KHN0cnVjdCBwb2xpY3lkYiAqcCwgdm9pZCAqZnAsIHN0cnVjdCBjb25kX2F2X2xpc3QgKipyZXRfbGlzdCwKLQkJCSAgICAgc3RydWN0IGNvbmRfYXZfbGlzdCAqb3RoZXIpCitzdHJ1Y3QgY29uZF9pbnNlcnRmX2RhdGEKIHsKLQlzdHJ1Y3QgY29uZF9hdl9saXN0ICpsaXN0LCAqbGFzdCA9IE5VTEwsICpjdXI7Ci0Jc3RydWN0IGF2dGFiX2tleSBrZXk7Ci0Jc3RydWN0IGF2dGFiX2RhdHVtIGRhdHVtOworCXN0cnVjdCBwb2xpY3lkYiAqcDsKKwlzdHJ1Y3QgY29uZF9hdl9saXN0ICpvdGhlcjsKKwlzdHJ1Y3QgY29uZF9hdl9saXN0ICpoZWFkOworCXN0cnVjdCBjb25kX2F2X2xpc3QgKnRhaWw7Cit9OworCitzdGF0aWMgaW50IGNvbmRfaW5zZXJ0ZihzdHJ1Y3QgYXZ0YWIgKmEsIHN0cnVjdCBhdnRhYl9rZXkgKmssIHN0cnVjdCBhdnRhYl9kYXR1bSAqZCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBjb25kX2luc2VydGZfZGF0YSAqZGF0YSA9IHB0cjsKKwlzdHJ1Y3QgcG9saWN5ZGIgKnAgPSBkYXRhLT5wOworCXN0cnVjdCBjb25kX2F2X2xpc3QgKm90aGVyID0gZGF0YS0+b3RoZXIsICpsaXN0LCAqY3VyOwogCXN0cnVjdCBhdnRhYl9ub2RlICpub2RlX3B0cjsKLQlpbnQgcmM7Ci0JdTMyIGJ1ZlsxXSwgaSwgbGVuOwogCXU4IGZvdW5kOwogCisKKwkvKgorCSAqIEZvciB0eXBlIHJ1bGVzIHdlIGhhdmUgdG8gbWFrZSBjZXJ0YWluIHRoZXJlIGFyZW4ndCBhbnkKKwkgKiBjb25mbGljdGluZyBydWxlcyBieSBzZWFyY2hpbmcgdGhlIHRlX2F2dGFiIGFuZCB0aGUKKwkgKiBjb25kX3RlX2F2dGFiLgorCSAqLworCWlmIChrLT5zcGVjaWZpZWQgJiBBVlRBQl9UWVBFKSB7CisJCWlmIChhdnRhYl9zZWFyY2goJnAtPnRlX2F2dGFiLCBrKSkgeworCQkJcHJpbnRrKCJzZWN1cml0eTogdHlwZSBydWxlIGFscmVhZHkgZXhpc3RzIG91dHNpZGUgb2YgYSBjb25kaXRpb25hbC4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCS8qCisJCSAqIElmIHdlIGFyZSByZWFkaW5nIHRoZSBmYWxzZSBsaXN0IG90aGVyIHdpbGwgYmUgYSBwb2ludGVyIHRvCisJCSAqIHRoZSB0cnVlIGxpc3QuIFdlIGNhbiBoYXZlIGR1cGxpY2F0ZSBlbnRyaWVzIGlmIHRoZXJlIGlzIG9ubHkKKwkJICogMSBvdGhlciBlbnRyeSBhbmQgaXQgaXMgaW4gb3VyIHRydWUgbGlzdC4KKwkJICoKKwkJICogSWYgd2UgYXJlIHJlYWRpbmcgdGhlIHRydWUgbGlzdCAob3RoZXIgPT0gTlVMTCkgdGhlcmUgc2hvdWxkbid0CisJCSAqIGJlIGFueSBvdGhlciBlbnRyaWVzLgorCQkgKi8KKwkJaWYgKG90aGVyKSB7CisJCQlub2RlX3B0ciA9IGF2dGFiX3NlYXJjaF9ub2RlKCZwLT50ZV9jb25kX2F2dGFiLCBrKTsKKwkJCWlmIChub2RlX3B0cikgeworCQkJCWlmIChhdnRhYl9zZWFyY2hfbm9kZV9uZXh0KG5vZGVfcHRyLCBrLT5zcGVjaWZpZWQpKSB7CisJCQkJCXByaW50aygic2VjdXJpdHk6IHRvbyBtYW55IGNvbmZsaWN0aW5nIHR5cGUgcnVsZXMuIik7CisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCQlmb3VuZCA9IDA7CisJCQkJZm9yIChjdXIgPSBvdGhlcjsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworCQkJCQlpZiAoY3VyLT5ub2RlID09IG5vZGVfcHRyKSB7CisJCQkJCQlmb3VuZCA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIWZvdW5kKSB7CisJCQkJCXByaW50aygic2VjdXJpdHk6IGNvbmZsaWN0aW5nIHR5cGUgcnVsZXMuXG4iKTsKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGF2dGFiX3NlYXJjaCgmcC0+dGVfY29uZF9hdnRhYiwgaykpIHsKKwkJCQlwcmludGsoInNlY3VyaXR5OiBjb25mbGljdGluZyB0eXBlIHJ1bGVzIHdoZW4gYWRkaW5nIHR5cGUgcnVsZSBmb3IgdHJ1ZS5cbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJfQorCisJbm9kZV9wdHIgPSBhdnRhYl9pbnNlcnRfbm9udW5pcXVlKCZwLT50ZV9jb25kX2F2dGFiLCBrLCBkKTsKKwlpZiAoIW5vZGVfcHRyKSB7CisJCXByaW50aygic2VjdXJpdHk6IGNvdWxkIG5vdCBpbnNlcnQgcnVsZS4iKTsKKwkJZ290byBlcnI7CisJfQorCisJbGlzdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25kX2F2X2xpc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxpc3QpCisJCWdvdG8gZXJyOworCW1lbXNldChsaXN0LCAwLCBzaXplb2YoKmxpc3QpKTsKKworCWxpc3QtPm5vZGUgPSBub2RlX3B0cjsKKwlpZiAoIWRhdGEtPmhlYWQpCisJCWRhdGEtPmhlYWQgPSBsaXN0OworCWVsc2UKKwkJZGF0YS0+dGFpbC0+bmV4dCA9IGxpc3Q7CisJZGF0YS0+dGFpbCA9IGxpc3Q7CisJcmV0dXJuIDA7CisKK2VycjoKKwljb25kX2F2X2xpc3RfZGVzdHJveShkYXRhLT5oZWFkKTsKKwlkYXRhLT5oZWFkID0gTlVMTDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgY29uZF9yZWFkX2F2X2xpc3Qoc3RydWN0IHBvbGljeWRiICpwLCB2b2lkICpmcCwgc3RydWN0IGNvbmRfYXZfbGlzdCAqKnJldF9saXN0LCBzdHJ1Y3QgY29uZF9hdl9saXN0ICpvdGhlcikKK3sKKwlpbnQgaSwgcmM7CisJX19sZTMyIGJ1ZlsxXTsKKwl1MzIgbGVuOworCXN0cnVjdCBjb25kX2luc2VydGZfZGF0YSBkYXRhOworCiAJKnJldF9saXN0ID0gTlVMTDsKIAogCWxlbiA9IDA7Ci0JcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZiBidWYpOworCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIC0xOwogCkBAIC0yNzUsNzkgKzM1OSwxOSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlkYXRhLnAgPSBwOworCWRhdGEub3RoZXIgPSBvdGhlcjsKKwlkYXRhLmhlYWQgPSBOVUxMOworCWRhdGEudGFpbCA9IE5VTEw7CiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmIChhdnRhYl9yZWFkX2l0ZW0oZnAsICZkYXR1bSwgJmtleSkpCi0JCQlnb3RvIGVycjsKLQotCQkvKgotCQkgKiBGb3IgdHlwZSBydWxlcyB3ZSBoYXZlIHRvIG1ha2UgY2VydGFpbiB0aGVyZSBhcmVuJ3QgYW55Ci0JCSAqIGNvbmZsaWN0aW5nIHJ1bGVzIGJ5IHNlYXJjaGluZyB0aGUgdGVfYXZ0YWIgYW5kIHRoZQotCQkgKiBjb25kX3RlX2F2dGFiLgotCQkgKi8KLQkJaWYgKGRhdHVtLnNwZWNpZmllZCAmIEFWVEFCX1RZUEUpIHsKLQkJCWlmIChhdnRhYl9zZWFyY2goJnAtPnRlX2F2dGFiLCAma2V5LCBBVlRBQl9UWVBFKSkgewotCQkJCXByaW50aygic2VjdXJpdHk6IHR5cGUgcnVsZSBhbHJlYWR5IGV4aXN0cyBvdXRzaWRlIG9mIGEgY29uZGl0aW9uYWwuIik7Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCQkvKgotCQkJICogSWYgd2UgYXJlIHJlYWRpbmcgdGhlIGZhbHNlIGxpc3Qgb3RoZXIgd2lsbCBiZSBhIHBvaW50ZXIgdG8KLQkJCSAqIHRoZSB0cnVlIGxpc3QuIFdlIGNhbiBoYXZlIGR1cGxpY2F0ZSBlbnRyaWVzIGlmIHRoZXJlIGlzIG9ubHkKLQkJCSAqIDEgb3RoZXIgZW50cnkgYW5kIGl0IGlzIGluIG91ciB0cnVlIGxpc3QuCi0JCQkgKgotCQkJICogSWYgd2UgYXJlIHJlYWRpbmcgdGhlIHRydWUgbGlzdCAob3RoZXIgPT0gTlVMTCkgdGhlcmUgc2hvdWxkbid0Ci0JCQkgKiBiZSBhbnkgb3RoZXIgZW50cmllcy4KLQkJCSAqLwotCQkJaWYgKG90aGVyKSB7Ci0JCQkJbm9kZV9wdHIgPSBhdnRhYl9zZWFyY2hfbm9kZSgmcC0+dGVfY29uZF9hdnRhYiwgJmtleSwgQVZUQUJfVFlQRSk7Ci0JCQkJaWYgKG5vZGVfcHRyKSB7Ci0JCQkJCWlmIChhdnRhYl9zZWFyY2hfbm9kZV9uZXh0KG5vZGVfcHRyLCBBVlRBQl9UWVBFKSkgewotCQkJCQkJcHJpbnRrKCJzZWN1cml0eTogdG9vIG1hbnkgY29uZmxpY3RpbmcgdHlwZSBydWxlcy4iKTsKLQkJCQkJCWdvdG8gZXJyOwotCQkJCQl9Ci0JCQkJCWZvdW5kID0gMDsKLQkJCQkJZm9yIChjdXIgPSBvdGhlcjsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgewotCQkJCQkJaWYgKGN1ci0+bm9kZSA9PSBub2RlX3B0cikgewotCQkJCQkJCWZvdW5kID0gMTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJCQlwcmludGsoInNlY3VyaXR5OiBjb25mbGljdGluZyB0eXBlIHJ1bGVzLiIpOwotCQkJCQkJZ290byBlcnI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChhdnRhYl9zZWFyY2goJnAtPnRlX2NvbmRfYXZ0YWIsICZrZXksIEFWVEFCX1RZUEUpKSB7Ci0JCQkJCXByaW50aygic2VjdXJpdHk6IGNvbmZsaWN0aW5nIHR5cGUgcnVsZXMgd2hlbiBhZGRpbmcgdHlwZSBydWxlIGZvciB0cnVlLiIpOwotCQkJCQlnb3RvIGVycjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbm9kZV9wdHIgPSBhdnRhYl9pbnNlcnRfbm9udW5pcXVlKCZwLT50ZV9jb25kX2F2dGFiLCAma2V5LCAmZGF0dW0pOwotCQlpZiAoIW5vZGVfcHRyKSB7Ci0JCQlwcmludGsoInNlY3VyaXR5OiBjb3VsZCBub3QgaW5zZXJ0IHJ1bGUuIik7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCWxpc3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZF9hdl9saXN0KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbGlzdCkKLQkJCWdvdG8gZXJyOwotCQltZW1zZXQobGlzdCwgMCwgc2l6ZW9mKHN0cnVjdCBjb25kX2F2X2xpc3QpKTsKLQotCQlsaXN0LT5ub2RlID0gbm9kZV9wdHI7Ci0JCWlmIChpID09IDApCi0JCQkqcmV0X2xpc3QgPSBsaXN0OwotCQllbHNlCi0JCQlsYXN0LT5uZXh0ID0gbGlzdDsKLQkJbGFzdCA9IGxpc3Q7CisJCXJjID0gYXZ0YWJfcmVhZF9pdGVtKGZwLCBwLT5wb2xpY3l2ZXJzLCAmcC0+dGVfY29uZF9hdnRhYiwgY29uZF9pbnNlcnRmLCAmZGF0YSk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKIAogCX0KIAorCSpyZXRfbGlzdCA9IGRhdGEuaGVhZDsKIAlyZXR1cm4gMDsKLWVycjoKLQljb25kX2F2X2xpc3RfZGVzdHJveSgqcmV0X2xpc3QpOwotCSpyZXRfbGlzdCA9IE5VTEw7Ci0JcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW50IGV4cHJfaXN2YWxpZChzdHJ1Y3QgcG9saWN5ZGIgKnAsIHN0cnVjdCBjb25kX2V4cHIgKmV4cHIpCkBAIC0zNjYsNyArMzkwLDggQEAKIAogc3RhdGljIGludCBjb25kX3JlYWRfbm9kZShzdHJ1Y3QgcG9saWN5ZGIgKnAsIHN0cnVjdCBjb25kX25vZGUgKm5vZGUsIHZvaWQgKmZwKQogewotCXUzMiBidWZbMl0sIGxlbiwgaTsKKwlfX2xlMzIgYnVmWzJdOworCXUzMiBsZW4sIGk7CiAJaW50IHJjOwogCXN0cnVjdCBjb25kX2V4cHIgKmV4cHIgPSBOVUxMLCAqbGFzdCA9IE5VTEw7CiAKQEAgLTQyNCw3ICs0NDksOCBAQAogaW50IGNvbmRfcmVhZF9saXN0KHN0cnVjdCBwb2xpY3lkYiAqcCwgdm9pZCAqZnApCiB7CiAJc3RydWN0IGNvbmRfbm9kZSAqbm9kZSwgKmxhc3QgPSBOVUxMOwotCXUzMiBidWZbMV0sIGksIGxlbjsKKwlfX2xlMzIgYnVmWzFdOworCXUzMiBpLCBsZW47CiAJaW50IHJjOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZiBidWYpOwpAQCAtNDUyLDYgKzQ3OCw3IEBACiAJcmV0dXJuIDA7CiBlcnI6CiAJY29uZF9saXN0X2Rlc3Ryb3kocC0+Y29uZF9saXN0KTsKKwlwLT5jb25kX2xpc3QgPSBOVUxMOwogCXJldHVybiAtMTsKIH0KIApAQCAtNDY1LDIyICs0OTIsMjIgQEAKIAlpZighY3RhYiB8fCAha2V5IHx8ICFhdmQpCiAJCXJldHVybjsKIAotCWZvcihub2RlID0gYXZ0YWJfc2VhcmNoX25vZGUoY3RhYiwga2V5LCBBVlRBQl9BVik7IG5vZGUgIT0gTlVMTDsKLQkJCQlub2RlID0gYXZ0YWJfc2VhcmNoX25vZGVfbmV4dChub2RlLCBBVlRBQl9BVikpIHsKLQkJaWYgKCAoX191MzIpIChBVlRBQl9BTExPV0VEfEFWVEFCX0VOQUJMRUQpID09Ci0JCSAgICAgKG5vZGUtPmRhdHVtLnNwZWNpZmllZCAmIChBVlRBQl9BTExPV0VEfEFWVEFCX0VOQUJMRUQpKSkKLQkJCWF2ZC0+YWxsb3dlZCB8PSBhdnRhYl9hbGxvd2VkKCZub2RlLT5kYXR1bSk7Ci0JCWlmICggKF9fdTMyKSAoQVZUQUJfQVVESVRERU5ZfEFWVEFCX0VOQUJMRUQpID09Ci0JCSAgICAgKG5vZGUtPmRhdHVtLnNwZWNpZmllZCAmIChBVlRBQl9BVURJVERFTll8QVZUQUJfRU5BQkxFRCkpKQorCWZvcihub2RlID0gYXZ0YWJfc2VhcmNoX25vZGUoY3RhYiwga2V5KTsgbm9kZSAhPSBOVUxMOworCQkJCW5vZGUgPSBhdnRhYl9zZWFyY2hfbm9kZV9uZXh0KG5vZGUsIGtleS0+c3BlY2lmaWVkKSkgeworCQlpZiAoICh1MTYpIChBVlRBQl9BTExPV0VEfEFWVEFCX0VOQUJMRUQpID09CisJCSAgICAgKG5vZGUtPmtleS5zcGVjaWZpZWQgJiAoQVZUQUJfQUxMT1dFRHxBVlRBQl9FTkFCTEVEKSkpCisJCQlhdmQtPmFsbG93ZWQgfD0gbm9kZS0+ZGF0dW0uZGF0YTsKKwkJaWYgKCAodTE2KSAoQVZUQUJfQVVESVRERU5ZfEFWVEFCX0VOQUJMRUQpID09CisJCSAgICAgKG5vZGUtPmtleS5zcGVjaWZpZWQgJiAoQVZUQUJfQVVESVRERU5ZfEFWVEFCX0VOQUJMRUQpKSkKIAkJCS8qIFNpbmNlIGEgJzAnIGluIGFuIGF1ZGl0ZGVueSBtYXNrIHJlcHJlc2VudHMgYQogCQkJICogcGVybWlzc2lvbiB3ZSBkbyBOT1Qgd2FudCB0byBhdWRpdCAoZG9udGF1ZGl0KSwgd2UgdXNlCiAJCQkgKiB0aGUgJyYnIG9wZXJhbmQgdG8gZW5zdXJlIHRoYXQgYWxsICcwJ3MgaW4gdGhlIG1hc2sKIAkJCSAqIGFyZSByZXRhaW5lZCAobXVjaCB1bmxpa2UgdGhlIGFsbG93IGFuZCBhdWRpdGFsbG93IGNhc2VzKS4KIAkJCSAqLwotCQkJYXZkLT5hdWRpdGRlbnkgJj0gYXZ0YWJfYXVkaXRkZW55KCZub2RlLT5kYXR1bSk7Ci0JCWlmICggKF9fdTMyKSAoQVZUQUJfQVVESVRBTExPV3xBVlRBQl9FTkFCTEVEKSA9PQotCQkgICAgIChub2RlLT5kYXR1bS5zcGVjaWZpZWQgJiAoQVZUQUJfQVVESVRBTExPV3xBVlRBQl9FTkFCTEVEKSkpCi0JCQlhdmQtPmF1ZGl0YWxsb3cgfD0gYXZ0YWJfYXVkaXRhbGxvdygmbm9kZS0+ZGF0dW0pOworCQkJYXZkLT5hdWRpdGRlbnkgJj0gbm9kZS0+ZGF0dW0uZGF0YTsKKwkJaWYgKCAodTE2KSAoQVZUQUJfQVVESVRBTExPV3xBVlRBQl9FTkFCTEVEKSA9PQorCQkgICAgIChub2RlLT5rZXkuc3BlY2lmaWVkICYgKEFWVEFCX0FVRElUQUxMT1d8QVZUQUJfRU5BQkxFRCkpKQorCQkJYXZkLT5hdWRpdGFsbG93IHw9IG5vZGUtPmRhdHVtLmRhdGE7CiAJfQogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMKaW5kZXggZDhjZTljYy4uZDUxNTE1NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMKQEAgLTE5Niw4ICsxOTYsOSBAQAogewogCWludCByYzsKIAlzdHJ1Y3QgZWJpdG1hcF9ub2RlICpuLCAqbDsKLQl1MzIgYnVmWzNdLCBtYXBzaXplLCBjb3VudCwgaTsKLQl1NjQgbWFwOworCV9fbGUzMiBidWZbM107CisJdTMyIG1hcHNpemUsIGNvdW50LCBpOworCV9fbGU2NCBtYXA7CiAKIAllYml0bWFwX2luaXQoZSk7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5oIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmgKaW5kZXggNDcxMzcwMi4uOGJmNDEwNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmgKQEAgLTMyLDExICszMiw0MSBAQAogI2RlZmluZSBlYml0bWFwX2xlbmd0aChlKSAoKGUpLT5oaWdoYml0KQogI2RlZmluZSBlYml0bWFwX3N0YXJ0Yml0KGUpICgoZSktPm5vZGUgPyAoZSktPm5vZGUtPnN0YXJ0Yml0IDogMCkKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZWJpdG1hcF9zdGFydChzdHJ1Y3QgZWJpdG1hcCAqZSwKKwkJCQkJIHN0cnVjdCBlYml0bWFwX25vZGUgKipuKQoreworCSpuID0gZS0+bm9kZTsKKwlyZXR1cm4gZWJpdG1hcF9zdGFydGJpdChlKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGViaXRtYXBfaW5pdChzdHJ1Y3QgZWJpdG1hcCAqZSkKIHsKIAltZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGViaXRtYXBfbmV4dChzdHJ1Y3QgZWJpdG1hcF9ub2RlICoqbiwKKwkJCQkJdW5zaWduZWQgaW50IGJpdCkKK3sKKwlpZiAoKGJpdCA9PSAoKCpuKS0+c3RhcnRiaXQgKyBNQVBTSVpFIC0gMSkpICYmCisJICAgICgqbiktPm5leHQpIHsKKwkJKm4gPSAoKm4pLT5uZXh0OworCQlyZXR1cm4gKCpuKS0+c3RhcnRiaXQ7CisJfQorCisJcmV0dXJuIChiaXQrMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGViaXRtYXBfbm9kZV9nZXRfYml0KHN0cnVjdCBlYml0bWFwX25vZGUgKiBuLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYml0KQoreworCWlmIChuLT5tYXAgJiAoTUFQQklUIDw8IChiaXQgLSBuLT5zdGFydGJpdCkpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBlYml0bWFwX2Zvcl9lYWNoX2JpdChlLCBuLCBiaXQpIFwKKwlmb3IgKGJpdCA9IGViaXRtYXBfc3RhcnQoZSwgJm4pOyBiaXQgPCBlYml0bWFwX2xlbmd0aChlKTsgYml0ID0gZWJpdG1hcF9uZXh0KCZuLCBiaXQpKSBcCisKIGludCBlYml0bWFwX2NtcChzdHJ1Y3QgZWJpdG1hcCAqZTEsIHN0cnVjdCBlYml0bWFwICplMik7CiBpbnQgZWJpdG1hcF9jcHkoc3RydWN0IGViaXRtYXAgKmRzdCwgc3RydWN0IGViaXRtYXAgKnNyYyk7CiBpbnQgZWJpdG1hcF9jb250YWlucyhzdHJ1Y3QgZWJpdG1hcCAqZTEsIHN0cnVjdCBlYml0bWFwICplMik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuYwppbmRleCBkNGMzMmMzLi5hYWVmYWMyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMKQEAgLTI3LDYgKzI3LDcgQEAKIGludCBtbHNfY29tcHV0ZV9jb250ZXh0X2xlbihzdHJ1Y3QgY29udGV4dCAqIGNvbnRleHQpCiB7CiAJaW50IGksIGwsIGxlbiwgcmFuZ2U7CisJc3RydWN0IGViaXRtYXBfbm9kZSAqbm9kZTsKIAogCWlmICghc2VsaW51eF9tbHNfZW5hYmxlZCkKIAkJcmV0dXJuIDA7CkBAIC0zNiwyNCArMzcsMjQgQEAKIAkJcmFuZ2UgPSAwOwogCQlsZW4gKz0gc3RybGVuKHBvbGljeWRiLnBfc2Vuc192YWxfdG9fbmFtZVtjb250ZXh0LT5yYW5nZS5sZXZlbFtsXS5zZW5zIC0gMV0pOwogCi0JCWZvciAoaSA9IDE7IGkgPD0gZWJpdG1hcF9sZW5ndGgoJmNvbnRleHQtPnJhbmdlLmxldmVsW2xdLmNhdCk7IGkrKykgewotCQkJaWYgKGViaXRtYXBfZ2V0X2JpdCgmY29udGV4dC0+cmFuZ2UubGV2ZWxbbF0uY2F0LCBpIC0gMSkpIHsKKwkJZWJpdG1hcF9mb3JfZWFjaF9iaXQoJmNvbnRleHQtPnJhbmdlLmxldmVsW2xdLmNhdCwgbm9kZSwgaSkgeworCQkJaWYgKGViaXRtYXBfbm9kZV9nZXRfYml0KG5vZGUsIGkpKSB7CiAJCQkJaWYgKHJhbmdlKSB7CiAJCQkJCXJhbmdlKys7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAotCQkJCWxlbiArPSBzdHJsZW4ocG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbaSAtIDFdKSArIDE7CisJCQkJbGVuICs9IHN0cmxlbihwb2xpY3lkYi5wX2NhdF92YWxfdG9fbmFtZVtpXSkgKyAxOwogCQkJCXJhbmdlKys7CiAJCQl9IGVsc2UgewogCQkJCWlmIChyYW5nZSA+IDEpCi0JCQkJCWxlbiArPSBzdHJsZW4ocG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbaSAtIDJdKSArIDE7CisJCQkJCWxlbiArPSBzdHJsZW4ocG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbaSAtIDFdKSArIDE7CiAJCQkJcmFuZ2UgPSAwOwogCQkJfQogCQl9CiAJCS8qIEhhbmRsZSBjYXNlIHdoZXJlIGxhc3QgY2F0ZWdvcnkgaXMgdGhlIGVuZCBvZiByYW5nZSAqLwogCQlpZiAocmFuZ2UgPiAxKQotCQkJbGVuICs9IHN0cmxlbihwb2xpY3lkYi5wX2NhdF92YWxfdG9fbmFtZVtpIC0gMl0pICsgMTsKKwkJCWxlbiArPSBzdHJsZW4ocG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbaSAtIDFdKSArIDE7CiAKIAkJaWYgKGwgPT0gMCkgewogCQkJaWYgKG1sc19sZXZlbF9lcSgmY29udGV4dC0+cmFuZ2UubGV2ZWxbMF0sCkBAIC03Nyw2ICs3OCw3IEBACiB7CiAJY2hhciAqc2NvbnRleHRwOwogCWludCBpLCBsLCByYW5nZSwgd3JvdGVfc2VwOworCXN0cnVjdCBlYml0bWFwX25vZGUgKm5vZGU7CiAKIAlpZiAoIXNlbGludXhfbWxzX2VuYWJsZWQpCiAJCXJldHVybjsKQEAgLTk0LDggKzk2LDggQEAKIAkJc2NvbnRleHRwICs9IHN0cmxlbihwb2xpY3lkYi5wX3NlbnNfdmFsX3RvX25hbWVbY29udGV4dC0+cmFuZ2UubGV2ZWxbbF0uc2VucyAtIDFdKTsKIAogCQkvKiBjYXRlZ29yaWVzICovCi0JCWZvciAoaSA9IDE7IGkgPD0gZWJpdG1hcF9sZW5ndGgoJmNvbnRleHQtPnJhbmdlLmxldmVsW2xdLmNhdCk7IGkrKykgewotCQkJaWYgKGViaXRtYXBfZ2V0X2JpdCgmY29udGV4dC0+cmFuZ2UubGV2ZWxbbF0uY2F0LCBpIC0gMSkpIHsKKwkJZWJpdG1hcF9mb3JfZWFjaF9iaXQoJmNvbnRleHQtPnJhbmdlLmxldmVsW2xdLmNhdCwgbm9kZSwgaSkgeworCQkJaWYgKGViaXRtYXBfbm9kZV9nZXRfYml0KG5vZGUsIGkpKSB7CiAJCQkJaWYgKHJhbmdlKSB7CiAJCQkJCXJhbmdlKys7CiAJCQkJCWNvbnRpbnVlOwpAQCAtMTA2LDggKzEwOCw4IEBACiAJCQkJCXdyb3RlX3NlcCA9IDE7CiAJCQkJfSBlbHNlCiAJCQkJCSpzY29udGV4dHArKyA9ICcsJzsKLQkJCQlzdHJjcHkoc2NvbnRleHRwLCBwb2xpY3lkYi5wX2NhdF92YWxfdG9fbmFtZVtpIC0gMV0pOwotCQkJCXNjb250ZXh0cCArPSBzdHJsZW4ocG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbaSAtIDFdKTsKKwkJCQlzdHJjcHkoc2NvbnRleHRwLCBwb2xpY3lkYi5wX2NhdF92YWxfdG9fbmFtZVtpXSk7CisJCQkJc2NvbnRleHRwICs9IHN0cmxlbihwb2xpY3lkYi5wX2NhdF92YWxfdG9fbmFtZVtpXSk7CiAJCQkJcmFuZ2UrKzsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKHJhbmdlID4gMSkgewpAQCAtMTE2LDggKzExOCw4IEBACiAJCQkJCWVsc2UKIAkJCQkJCSpzY29udGV4dHArKyA9ICcsJzsKIAotCQkJCQlzdHJjcHkoc2NvbnRleHRwLCBwb2xpY3lkYi5wX2NhdF92YWxfdG9fbmFtZVtpIC0gMl0pOwotCQkJCQlzY29udGV4dHAgKz0gc3RybGVuKHBvbGljeWRiLnBfY2F0X3ZhbF90b19uYW1lW2kgLSAyXSk7CisJCQkJCXN0cmNweShzY29udGV4dHAsIHBvbGljeWRiLnBfY2F0X3ZhbF90b19uYW1lW2kgLSAxXSk7CisJCQkJCXNjb250ZXh0cCArPSBzdHJsZW4ocG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbaSAtIDFdKTsKIAkJCQl9CiAJCQkJcmFuZ2UgPSAwOwogCQkJfQpAQCAtMTMwLDggKzEzMiw4IEBACiAJCQllbHNlCiAJCQkJKnNjb250ZXh0cCsrID0gJywnOwogCi0JCQlzdHJjcHkoc2NvbnRleHRwLCBwb2xpY3lkYi5wX2NhdF92YWxfdG9fbmFtZVtpIC0gMl0pOwotCQkJc2NvbnRleHRwICs9IHN0cmxlbihwb2xpY3lkYi5wX2NhdF92YWxfdG9fbmFtZVtpIC0gMl0pOworCQkJc3RyY3B5KHNjb250ZXh0cCwgcG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbaSAtIDFdKTsKKwkJCXNjb250ZXh0cCArPSBzdHJsZW4ocG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbaSAtIDFdKTsKIAkJfQogCiAJCWlmIChsID09IDApIHsKQEAgLTE1Nyw2ICsxNTksNyBAQAogewogCXN0cnVjdCBsZXZlbF9kYXR1bSAqbGV2ZGF0dW07CiAJc3RydWN0IHVzZXJfZGF0dW0gKnVzcmRhdHVtOworCXN0cnVjdCBlYml0bWFwX25vZGUgKm5vZGU7CiAJaW50IGksIGw7CiAKIAlpZiAoIXNlbGludXhfbWxzX2VuYWJsZWQpCkBAIC0xNzksMTEgKzE4MiwxMSBAQAogCQlpZiAoIWxldmRhdHVtKQogCQkJcmV0dXJuIDA7CiAKLQkJZm9yIChpID0gMTsgaSA8PSBlYml0bWFwX2xlbmd0aCgmYy0+cmFuZ2UubGV2ZWxbbF0uY2F0KTsgaSsrKSB7Ci0JCQlpZiAoZWJpdG1hcF9nZXRfYml0KCZjLT5yYW5nZS5sZXZlbFtsXS5jYXQsIGkgLSAxKSkgeworCQllYml0bWFwX2Zvcl9lYWNoX2JpdCgmYy0+cmFuZ2UubGV2ZWxbbF0uY2F0LCBub2RlLCBpKSB7CisJCQlpZiAoZWJpdG1hcF9ub2RlX2dldF9iaXQobm9kZSwgaSkpIHsKIAkJCQlpZiAoaSA+IHAtPnBfY2F0cy5ucHJpbSkKIAkJCQkJcmV0dXJuIDA7Ci0JCQkJaWYgKCFlYml0bWFwX2dldF9iaXQoJmxldmRhdHVtLT5sZXZlbC0+Y2F0LCBpIC0gMSkpCisJCQkJaWYgKCFlYml0bWFwX2dldF9iaXQoJmxldmRhdHVtLT5sZXZlbC0+Y2F0LCBpKSkKIAkJCQkJLyoKIAkJCQkJICogQ2F0ZWdvcnkgbWF5IG5vdCBiZSBhc3NvY2lhdGVkIHdpdGgKIAkJCQkJICogc2Vuc2l0aXZpdHkgaW4gbG93IGxldmVsLgpAQCAtNDY4LDYgKzQ3MSw3IEBACiAJc3RydWN0IGxldmVsX2RhdHVtICpsZXZkYXR1bTsKIAlzdHJ1Y3QgY2F0X2RhdHVtICpjYXRkYXR1bTsKIAlzdHJ1Y3QgZWJpdG1hcCBiaXRtYXA7CisJc3RydWN0IGViaXRtYXBfbm9kZSAqbm9kZTsKIAlpbnQgbCwgaTsKIAogCWlmICghc2VsaW51eF9tbHNfZW5hYmxlZCkKQEAgLTQ4MiwxMiArNDg2LDEyIEBACiAJCWMtPnJhbmdlLmxldmVsW2xdLnNlbnMgPSBsZXZkYXR1bS0+bGV2ZWwtPnNlbnM7CiAKIAkJZWJpdG1hcF9pbml0KCZiaXRtYXApOwotCQlmb3IgKGkgPSAxOyBpIDw9IGViaXRtYXBfbGVuZ3RoKCZjLT5yYW5nZS5sZXZlbFtsXS5jYXQpOyBpKyspIHsKLQkJCWlmIChlYml0bWFwX2dldF9iaXQoJmMtPnJhbmdlLmxldmVsW2xdLmNhdCwgaSAtIDEpKSB7CisJCWViaXRtYXBfZm9yX2VhY2hfYml0KCZjLT5yYW5nZS5sZXZlbFtsXS5jYXQsIG5vZGUsIGkpIHsKKwkJCWlmIChlYml0bWFwX25vZGVfZ2V0X2JpdChub2RlLCBpKSkgewogCQkJCWludCByYzsKIAogCQkJCWNhdGRhdHVtID0gaGFzaHRhYl9zZWFyY2gobmV3cC0+cF9jYXRzLnRhYmxlLAotCQkJCSAgICAgICAgIAlvbGRwLT5wX2NhdF92YWxfdG9fbmFtZVtpIC0gMV0pOworCQkJCSAgICAgICAgIAlvbGRwLT5wX2NhdF92YWxfdG9fbmFtZVtpXSk7CiAJCQkJaWYgKCFjYXRkYXR1bSkKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJcmMgPSBlYml0bWFwX3NldF9iaXQoJmJpdG1hcCwgY2F0ZGF0dW0tPnZhbHVlIC0gMSwgMSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKaW5kZXggNzg1YzMzYy4uMGE3NTgzMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYwpAQCAtOTEsNiArOTEsMTEgQEAKIAkJLnN5bV9udW0gICAgICAgID0gU1lNX05VTSwKIAkJLm9jb25fbnVtICAgICAgID0gT0NPTl9OVU0sCiAJfSwKKwl7CisJCS52ZXJzaW9uICAgICAgICA9IFBPTElDWURCX1ZFUlNJT05fQVZUQUIsCisJCS5zeW1fbnVtICAgICAgICA9IFNZTV9OVU0sCisJCS5vY29uX251bSAgICAgICA9IE9DT05fTlVNLAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBvbGljeWRiX2NvbXBhdF9pbmZvICpwb2xpY3lkYl9sb29rdXBfY29tcGF0KGludCB2ZXJzaW9uKQpAQCAtNTg0LDYgKzU4OSw5IEBACiAJc3RydWN0IG9jb250ZXh0ICpjLCAqY3RtcDsKIAlzdHJ1Y3QgZ2VuZnMgKmcsICpndG1wOwogCWludCBpOworCXN0cnVjdCByb2xlX2FsbG93ICpyYSwgKmxyYSA9IE5VTEw7CisJc3RydWN0IHJvbGVfdHJhbnMgKnRyLCAqbHRyID0gTlVMTDsKKwlzdHJ1Y3QgcmFuZ2VfdHJhbnMgKnJ0LCAqbHJ0ID0gTlVMTDsKIAogCWZvciAoaSA9IDA7IGkgPCBTWU1fTlVNOyBpKyspIHsKIAkJaGFzaHRhYl9tYXAocC0+c3ltdGFiW2ldLnRhYmxlLCBkZXN0cm95X2ZbaV0sIE5VTEwpOwpAQCAtNjI0LDYgKzYzMiwyOCBAQAogCiAJY29uZF9wb2xpY3lkYl9kZXN0cm95KHApOwogCisJZm9yICh0ciA9IHAtPnJvbGVfdHI7IHRyOyB0ciA9IHRyLT5uZXh0KSB7CisJCWlmIChsdHIpIGtmcmVlKGx0cik7CisJCWx0ciA9IHRyOworCX0KKwlpZiAobHRyKSBrZnJlZShsdHIpOworCisJZm9yIChyYSA9IHAtPnJvbGVfYWxsb3c7IHJhOyByYSA9IHJhIC0+IG5leHQpIHsKKwkJaWYgKGxyYSkga2ZyZWUobHJhKTsKKwkJbHJhID0gcmE7CisJfQorCWlmIChscmEpIGtmcmVlKGxyYSk7CisKKwlmb3IgKHJ0ID0gcC0+cmFuZ2VfdHI7IHJ0OyBydCA9IHJ0IC0+IG5leHQpIHsKKwkJaWYgKGxydCkga2ZyZWUobHJ0KTsKKwkJbHJ0ID0gcnQ7CisJfQorCWlmIChscnQpIGtmcmVlKGxydCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcC0+cF90eXBlcy5ucHJpbTsgaSsrKQorCQllYml0bWFwX2Rlc3Ryb3koJnAtPnR5cGVfYXR0cl9tYXBbaV0pOworCWtmcmVlKHAtPnR5cGVfYXR0cl9tYXApOworCiAJcmV0dXJuOwogfQogCkBAIC03MTQsNyArNzQ0LDggQEAKICAqLwogc3RhdGljIGludCBtbHNfcmVhZF9yYW5nZV9oZWxwZXIoc3RydWN0IG1sc19yYW5nZSAqciwgdm9pZCAqZnApCiB7Ci0JdTMyIGJ1ZlsyXSwgaXRlbXM7CisJX19sZTMyIGJ1ZlsyXTsKKwl1MzIgaXRlbXM7CiAJaW50IHJjOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKTsKQEAgLTc3NSw3ICs4MDYsNyBAQAogCQkJCSAgICAgc3RydWN0IHBvbGljeWRiICpwLAogCQkJCSAgICAgdm9pZCAqZnApCiB7Ci0JdTMyIGJ1ZlszXTsKKwlfX2xlMzIgYnVmWzNdOwogCWludCByYzsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YgYnVmKTsKQEAgLTgxNSw3ICs4NDYsOCBAQAogCWNoYXIgKmtleSA9IE5VTEw7CiAJc3RydWN0IHBlcm1fZGF0dW0gKnBlcmRhdHVtOwogCWludCByYzsKLQl1MzIgYnVmWzJdLCBsZW47CisJX19sZTMyIGJ1ZlsyXTsKKwl1MzIgbGVuOwogCiAJcGVyZGF0dW0gPSBrbWFsbG9jKHNpemVvZigqcGVyZGF0dW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBlcmRhdHVtKSB7CkBAIC04NTUsNyArODg3LDggQEAKIHsKIAljaGFyICprZXkgPSBOVUxMOwogCXN0cnVjdCBjb21tb25fZGF0dW0gKmNvbWRhdHVtOwotCXUzMiBidWZbNF0sIGxlbiwgbmVsOworCV9fbGUzMiBidWZbNF07CisJdTMyIGxlbiwgbmVsOwogCWludCBpLCByYzsKIAogCWNvbWRhdHVtID0ga21hbGxvYyhzaXplb2YoKmNvbWRhdHVtKSwgR0ZQX0tFUk5FTCk7CkBAIC05MDksNyArOTQyLDggQEAKIHsKIAlzdHJ1Y3QgY29uc3RyYWludF9ub2RlICpjLCAqbGM7CiAJc3RydWN0IGNvbnN0cmFpbnRfZXhwciAqZSwgKmxlOwotCXUzMiBidWZbM10sIG5leHByOworCV9fbGUzMiBidWZbM107CisJdTMyIG5leHByOwogCWludCByYywgaSwgaiwgZGVwdGg7CiAKIAlsYyA9IE5VTEw7CkBAIC05OTMsNyArMTAyNyw4IEBACiB7CiAJY2hhciAqa2V5ID0gTlVMTDsKIAlzdHJ1Y3QgY2xhc3NfZGF0dW0gKmNsYWRhdHVtOwotCXUzMiBidWZbNl0sIGxlbiwgbGVuMiwgbmNvbnMsIG5lbDsKKwlfX2xlMzIgYnVmWzZdOworCXUzMiBsZW4sIGxlbjIsIG5jb25zLCBuZWw7CiAJaW50IGksIHJjOwogCiAJY2xhZGF0dW0gPSBrbWFsbG9jKHNpemVvZigqY2xhZGF0dW0pLCBHRlBfS0VSTkVMKTsKQEAgLTEwODcsNyArMTEyMiw4IEBACiAJY2hhciAqa2V5ID0gTlVMTDsKIAlzdHJ1Y3Qgcm9sZV9kYXR1bSAqcm9sZTsKIAlpbnQgcmM7Ci0JdTMyIGJ1ZlsyXSwgbGVuOworCV9fbGUzMiBidWZbMl07CisJdTMyIGxlbjsKIAogCXJvbGUgPSBrbWFsbG9jKHNpemVvZigqcm9sZSksIEdGUF9LRVJORUwpOwogCWlmICghcm9sZSkgewpAQCAtMTE0Nyw3ICsxMTgzLDggQEAKIAljaGFyICprZXkgPSBOVUxMOwogCXN0cnVjdCB0eXBlX2RhdHVtICp0eXBkYXR1bTsKIAlpbnQgcmM7Ci0JdTMyIGJ1ZlszXSwgbGVuOworCV9fbGUzMiBidWZbM107CisJdTMyIGxlbjsKIAogCXR5cGRhdHVtID0ga21hbGxvYyhzaXplb2YoKnR5cGRhdHVtKSxHRlBfS0VSTkVMKTsKIAlpZiAoIXR5cGRhdHVtKSB7CkBAIC0xMTkxLDcgKzEyMjgsNyBAQAogICovCiBzdGF0aWMgaW50IG1sc19yZWFkX2xldmVsKHN0cnVjdCBtbHNfbGV2ZWwgKmxwLCB2b2lkICpmcCkKIHsKLQl1MzIgYnVmWzFdOworCV9fbGUzMiBidWZbMV07CiAJaW50IHJjOwogCiAJbWVtc2V0KGxwLCAwLCBzaXplb2YoKmxwKSk7CkBAIC0xMjE5LDcgKzEyNTYsOCBAQAogCWNoYXIgKmtleSA9IE5VTEw7CiAJc3RydWN0IHVzZXJfZGF0dW0gKnVzcmRhdHVtOwogCWludCByYzsKLQl1MzIgYnVmWzJdLCBsZW47CisJX19sZTMyIGJ1ZlsyXTsKKwl1MzIgbGVuOwogCiAJdXNyZGF0dW0gPSBrbWFsbG9jKHNpemVvZigqdXNyZGF0dW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVzcmRhdHVtKSB7CkBAIC0xMjczLDcgKzEzMTEsOCBAQAogCWNoYXIgKmtleSA9IE5VTEw7CiAJc3RydWN0IGxldmVsX2RhdHVtICpsZXZkYXR1bTsKIAlpbnQgcmM7Ci0JdTMyIGJ1ZlsyXSwgbGVuOworCV9fbGUzMiBidWZbMl07CisJdTMyIGxlbjsKIAogCWxldmRhdHVtID0ga21hbGxvYyhzaXplb2YoKmxldmRhdHVtKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFsZXZkYXR1bSkgewpAQCAtMTMyNCw3ICsxMzYzLDggQEAKIAljaGFyICprZXkgPSBOVUxMOwogCXN0cnVjdCBjYXRfZGF0dW0gKmNhdGRhdHVtOwogCWludCByYzsKLQl1MzIgYnVmWzNdLCBsZW47CisJX19sZTMyIGJ1ZlszXTsKKwl1MzIgbGVuOwogCiAJY2F0ZGF0dW0gPSBrbWFsbG9jKHNpemVvZigqY2F0ZGF0dW0pLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWNhdGRhdHVtKSB7CkBAIC0xMzg3LDcgKzE0MjcsOCBAQAogCXN0cnVjdCBvY29udGV4dCAqbCwgKmMsICpuZXdjOwogCXN0cnVjdCBnZW5mcyAqZ2VuZnNfcCwgKmdlbmZzLCAqbmV3Z2VuZnM7CiAJaW50IGksIGosIHJjOwotCXUzMiBidWZbOF0sIGxlbiwgbGVuMiwgY29uZmlnLCBucHJpbSwgbmVsLCBuZWwyOworCV9fbGUzMiBidWZbOF07CisJdTMyIGxlbiwgbGVuMiwgY29uZmlnLCBucHJpbSwgbmVsLCBuZWwyOwogCWNoYXIgKnBvbGljeWRiX3N0cjsKIAlzdHJ1Y3QgcG9saWN5ZGJfY29tcGF0X2luZm8gKmluZm87CiAJc3RydWN0IHJhbmdlX3RyYW5zICpydCwgKmxydDsKQEAgLTE0MDMsMTcgKzE0NDQsMTQgQEAKIAlpZiAocmMgPCAwKQogCQlnb3RvIGJhZDsKIAotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JCWJ1ZltpXSA9IGxlMzJfdG9fY3B1KGJ1ZltpXSk7Ci0KLQlpZiAoYnVmWzBdICE9IFBPTElDWURCX01BR0lDKSB7CisJaWYgKGxlMzJfdG9fY3B1KGJ1ZlswXSkgIT0gUE9MSUNZREJfTUFHSUMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzZWN1cml0eTogIHBvbGljeWRiIG1hZ2ljIG51bWJlciAweCV4IGRvZXMgIgogCQkgICAgICAgIm5vdCBtYXRjaCBleHBlY3RlZCBtYWdpYyBudW1iZXIgMHgleFxuIiwKLQkJICAgICAgIGJ1ZlswXSwgUE9MSUNZREJfTUFHSUMpOworCQkgICAgICAgbGUzMl90b19jcHUoYnVmWzBdKSwgUE9MSUNZREJfTUFHSUMpOwogCQlnb3RvIGJhZDsKIAl9CiAKLQlsZW4gPSBidWZbMV07CisJbGVuID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAlpZiAobGVuICE9IHN0cmxlbihQT0xJQ1lEQl9TVFJJTkcpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAic2VjdXJpdHk6ICBwb2xpY3lkYiBzdHJpbmcgbGVuZ3RoICVkIGRvZXMgbm90ICIKIAkJICAgICAgICJtYXRjaCBleHBlY3RlZCBsZW5ndGggJVp1XG4iLApAQCAtMTQ0OCwxOSArMTQ4NiwxNyBAQAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSo0KTsKIAlpZiAocmMgPCAwKQogCQlnb3RvIGJhZDsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQlidWZbaV0gPSBsZTMyX3RvX2NwdShidWZbaV0pOwogCi0JcC0+cG9saWN5dmVycyA9IGJ1ZlswXTsKKwlwLT5wb2xpY3l2ZXJzID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAlpZiAocC0+cG9saWN5dmVycyA8IFBPTElDWURCX1ZFUlNJT05fTUlOIHx8CiAJICAgIHAtPnBvbGljeXZlcnMgPiBQT0xJQ1lEQl9WRVJTSU9OX01BWCkgewogCSAgICAJcHJpbnRrKEtFUk5fRVJSICJzZWN1cml0eTogIHBvbGljeWRiIHZlcnNpb24gJWQgZG9lcyBub3QgbWF0Y2ggIgogCSAgICAJICAgICAgICJteSB2ZXJzaW9uIHJhbmdlICVkLSVkXG4iLAotCSAgICAJICAgICAgIGJ1ZlswXSwgUE9MSUNZREJfVkVSU0lPTl9NSU4sIFBPTElDWURCX1ZFUlNJT05fTUFYKTsKKwkgICAgCSAgICAgICBsZTMyX3RvX2NwdShidWZbMF0pLCBQT0xJQ1lEQl9WRVJTSU9OX01JTiwgUE9MSUNZREJfVkVSU0lPTl9NQVgpOwogCSAgICAJZ290byBiYWQ7CiAJfQogCi0JaWYgKChidWZbMV0gJiBQT0xJQ1lEQl9DT05GSUdfTUxTKSkgeworCWlmICgobGUzMl90b19jcHUoYnVmWzFdKSAmIFBPTElDWURCX0NPTkZJR19NTFMpKSB7CiAJCWlmIChzc19pbml0aWFsaXplZCAmJiAhc2VsaW51eF9tbHNfZW5hYmxlZCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3Qgc3dpdGNoIGJldHdlZW4gbm9uLU1MUyBhbmQgTUxTICIKIAkJCSAgICAgICAicG9saWNpZXNcbiIpOwpAQCAtMTQ4OSw5ICsxNTI1LDExIEBACiAJCWdvdG8gYmFkOwogCX0KIAotCWlmIChidWZbMl0gIT0gaW5mby0+c3ltX251bSB8fCBidWZbM10gIT0gaW5mby0+b2Nvbl9udW0pIHsKKwlpZiAobGUzMl90b19jcHUoYnVmWzJdKSAhPSBpbmZvLT5zeW1fbnVtIHx8CisJCWxlMzJfdG9fY3B1KGJ1ZlszXSkgIT0gaW5mby0+b2Nvbl9udW0pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzZWN1cml0eTogIHBvbGljeWRiIHRhYmxlIHNpemVzICglZCwlZCkgZG8gIgotCQkgICAgICAgIm5vdCBtYXRjaCBtaW5lICglZCwlZClcbiIsIGJ1ZlsyXSwgYnVmWzNdLAorCQkgICAgICAgIm5vdCBtYXRjaCBtaW5lICglZCwlZClcbiIsIGxlMzJfdG9fY3B1KGJ1ZlsyXSksCisJCQlsZTMyX3RvX2NwdShidWZbM10pLAogCQkgICAgICAgaW5mby0+c3ltX251bSwgaW5mby0+b2Nvbl9udW0pOwogCQlnb3RvIGJhZDsKIAl9CkBAIC0xNTExLDcgKzE1NDksNyBAQAogCQlwLT5zeW10YWJbaV0ubnByaW0gPSBucHJpbTsKIAl9CiAKLQlyYyA9IGF2dGFiX3JlYWQoJnAtPnRlX2F2dGFiLCBmcCwgY29uZmlnKTsKKwlyYyA9IGF2dGFiX3JlYWQoJnAtPnRlX2F2dGFiLCBmcCwgcC0+cG9saWN5dmVycyk7CiAJaWYgKHJjKQogCQlnb3RvIGJhZDsKIApAQCAtMTgyNSw2ICsxODYzLDIxIEBACiAJCX0KIAl9CiAKKwlwLT50eXBlX2F0dHJfbWFwID0ga21hbGxvYyhwLT5wX3R5cGVzLm5wcmltKnNpemVvZihzdHJ1Y3QgZWJpdG1hcCksIEdGUF9LRVJORUwpOworCWlmICghcC0+dHlwZV9hdHRyX21hcCkKKwkJZ290byBiYWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgcC0+cF90eXBlcy5ucHJpbTsgaSsrKSB7CisJCWViaXRtYXBfaW5pdCgmcC0+dHlwZV9hdHRyX21hcFtpXSk7CisJCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fQVZUQUIpIHsKKwkJCWlmIChlYml0bWFwX3JlYWQoJnAtPnR5cGVfYXR0cl9tYXBbaV0sIGZwKSkKKwkJCQlnb3RvIGJhZDsKKwkJfQorCQkvKiBhZGQgdGhlIHR5cGUgaXRzZWxmIGFzIHRoZSBkZWdlbmVyYXRlIGNhc2UgKi8KKwkJaWYgKGViaXRtYXBfc2V0X2JpdCgmcC0+dHlwZV9hdHRyX21hcFtpXSwgaSwgMSkpCisJCQkJZ290byBiYWQ7CisJfQorCiAJcmMgPSAwOwogb3V0OgogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuaCBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuaAppbmRleCAyNDcwZTJhLi5iMTM0MDcxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5oCkBAIC0yMzcsNiArMjM3LDkgQEAKIAkvKiByYW5nZSB0cmFuc2l0aW9ucyAqLwogCXN0cnVjdCByYW5nZV90cmFucyAqcmFuZ2VfdHI7CiAKKwkvKiB0eXBlIC0+IGF0dHJpYnV0ZSByZXZlcnNlIG1hcHBpbmcgKi8KKwlzdHJ1Y3QgZWJpdG1hcCAqdHlwZV9hdHRyX21hcDsKKwogCXVuc2lnbmVkIGludCBwb2xpY3l2ZXJzOwogfTsKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCmluZGV4IDAxNDEyMDQuLjkyYjg5ZGMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKQEAgLTI2Niw4ICsyNjYsMTEgQEAKIAlzdHJ1Y3QgY29uc3RyYWludF9ub2RlICpjb25zdHJhaW50OwogCXN0cnVjdCByb2xlX2FsbG93ICpyYTsKIAlzdHJ1Y3QgYXZ0YWJfa2V5IGF2a2V5OwotCXN0cnVjdCBhdnRhYl9kYXR1bSAqYXZkYXR1bTsKKwlzdHJ1Y3QgYXZ0YWJfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgY2xhc3NfZGF0dW0gKnRjbGFzc19kYXR1bTsKKwlzdHJ1Y3QgZWJpdG1hcCAqc2F0dHIsICp0YXR0cjsKKwlzdHJ1Y3QgZWJpdG1hcF9ub2RlICpzbm9kZSwgKnRub2RlOworCXVuc2lnbmVkIGludCBpLCBqOwogCiAJLyoKIAkgKiBSZW1hcCBleHRlbmRlZCBOZXRsaW5rIGNsYXNzZXMgZm9yIG9sZCBwb2xpY3kgdmVyc2lvbnMuCkBAIC0zMDAsMjEgKzMwMywzNCBAQAogCSAqIElmIGEgc3BlY2lmaWMgdHlwZSBlbmZvcmNlbWVudCBydWxlIHdhcyBkZWZpbmVkIGZvcgogCSAqIHRoaXMgcGVybWlzc2lvbiBjaGVjaywgdGhlbiB1c2UgaXQuCiAJICovCi0JYXZrZXkuc291cmNlX3R5cGUgPSBzY29udGV4dC0+dHlwZTsKLQlhdmtleS50YXJnZXRfdHlwZSA9IHRjb250ZXh0LT50eXBlOwogCWF2a2V5LnRhcmdldF9jbGFzcyA9IHRjbGFzczsKLQlhdmRhdHVtID0gYXZ0YWJfc2VhcmNoKCZwb2xpY3lkYi50ZV9hdnRhYiwgJmF2a2V5LCBBVlRBQl9BVik7Ci0JaWYgKGF2ZGF0dW0pIHsKLQkJaWYgKGF2ZGF0dW0tPnNwZWNpZmllZCAmIEFWVEFCX0FMTE9XRUQpCi0JCQlhdmQtPmFsbG93ZWQgPSBhdnRhYl9hbGxvd2VkKGF2ZGF0dW0pOwotCQlpZiAoYXZkYXR1bS0+c3BlY2lmaWVkICYgQVZUQUJfQVVESVRERU5ZKQotCQkJYXZkLT5hdWRpdGRlbnkgPSBhdnRhYl9hdWRpdGRlbnkoYXZkYXR1bSk7Ci0JCWlmIChhdmRhdHVtLT5zcGVjaWZpZWQgJiBBVlRBQl9BVURJVEFMTE9XKQotCQkJYXZkLT5hdWRpdGFsbG93ID0gYXZ0YWJfYXVkaXRhbGxvdyhhdmRhdHVtKTsKLQl9CisJYXZrZXkuc3BlY2lmaWVkID0gQVZUQUJfQVY7CisJc2F0dHIgPSAmcG9saWN5ZGIudHlwZV9hdHRyX21hcFtzY29udGV4dC0+dHlwZSAtIDFdOworCXRhdHRyID0gJnBvbGljeWRiLnR5cGVfYXR0cl9tYXBbdGNvbnRleHQtPnR5cGUgLSAxXTsKKwllYml0bWFwX2Zvcl9lYWNoX2JpdChzYXR0ciwgc25vZGUsIGkpIHsKKwkJaWYgKCFlYml0bWFwX25vZGVfZ2V0X2JpdChzbm9kZSwgaSkpCisJCQljb250aW51ZTsKKwkJZWJpdG1hcF9mb3JfZWFjaF9iaXQodGF0dHIsIHRub2RlLCBqKSB7CisJCQlpZiAoIWViaXRtYXBfbm9kZV9nZXRfYml0KHRub2RlLCBqKSkKKwkJCQljb250aW51ZTsKKwkJCWF2a2V5LnNvdXJjZV90eXBlID0gaSArIDE7CisJCQlhdmtleS50YXJnZXRfdHlwZSA9IGogKyAxOworCQkJZm9yIChub2RlID0gYXZ0YWJfc2VhcmNoX25vZGUoJnBvbGljeWRiLnRlX2F2dGFiLCAmYXZrZXkpOworCQkJICAgICBub2RlICE9IE5VTEw7CisJCQkgICAgIG5vZGUgPSBhdnRhYl9zZWFyY2hfbm9kZV9uZXh0KG5vZGUsIGF2a2V5LnNwZWNpZmllZCkpIHsKKwkJCQlpZiAobm9kZS0+a2V5LnNwZWNpZmllZCA9PSBBVlRBQl9BTExPV0VEKQorCQkJCQlhdmQtPmFsbG93ZWQgfD0gbm9kZS0+ZGF0dW0uZGF0YTsKKwkJCQllbHNlIGlmIChub2RlLT5rZXkuc3BlY2lmaWVkID09IEFWVEFCX0FVRElUQUxMT1cpCisJCQkJCWF2ZC0+YXVkaXRhbGxvdyB8PSBub2RlLT5kYXR1bS5kYXRhOworCQkJCWVsc2UgaWYgKG5vZGUtPmtleS5zcGVjaWZpZWQgPT0gQVZUQUJfQVVESVRERU5ZKQorCQkJCQlhdmQtPmF1ZGl0ZGVueSAmPSBub2RlLT5kYXR1bS5kYXRhOworCQkJfQogCi0JLyogQ2hlY2sgY29uZGl0aW9uYWwgYXYgdGFibGUgZm9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgKi8KLQljb25kX2NvbXB1dGVfYXYoJnBvbGljeWRiLnRlX2NvbmRfYXZ0YWIsICZhdmtleSwgYXZkKTsKKwkJCS8qIENoZWNrIGNvbmRpdGlvbmFsIGF2IHRhYmxlIGZvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zICovCisJCQljb25kX2NvbXB1dGVfYXYoJnBvbGljeWRiLnRlX2NvbmRfYXZ0YWIsICZhdmtleSwgYXZkKTsKKworCQl9CisJfQogCiAJLyoKIAkgKiBSZW1vdmUgYW55IHBlcm1pc3Npb25zIHByb2hpYml0ZWQgYnkgYSBjb25zdHJhaW50ICh0aGlzIGluY2x1ZGVzCkBAIC03OTcsNyArODEzLDYgQEAKIAlzdHJ1Y3QgYXZ0YWJfa2V5IGF2a2V5OwogCXN0cnVjdCBhdnRhYl9kYXR1bSAqYXZkYXR1bTsKIAlzdHJ1Y3QgYXZ0YWJfbm9kZSAqbm9kZTsKLQl1bnNpZ25lZCBpbnQgdHlwZV9jaGFuZ2UgPSAwOwogCWludCByYyA9IDA7CiAKIAlpZiAoIXNzX2luaXRpYWxpemVkKSB7CkBAIC04NjIsMzMgKzg3NywyMyBAQAogCWF2a2V5LnNvdXJjZV90eXBlID0gc2NvbnRleHQtPnR5cGU7CiAJYXZrZXkudGFyZ2V0X3R5cGUgPSB0Y29udGV4dC0+dHlwZTsKIAlhdmtleS50YXJnZXRfY2xhc3MgPSB0Y2xhc3M7Ci0JYXZkYXR1bSA9IGF2dGFiX3NlYXJjaCgmcG9saWN5ZGIudGVfYXZ0YWIsICZhdmtleSwgQVZUQUJfVFlQRSk7CisJYXZrZXkuc3BlY2lmaWVkID0gc3BlY2lmaWVkOworCWF2ZGF0dW0gPSBhdnRhYl9zZWFyY2goJnBvbGljeWRiLnRlX2F2dGFiLCAmYXZrZXkpOwogCiAJLyogSWYgbm8gcGVybWFuZW50IHJ1bGUsIGFsc28gY2hlY2sgZm9yIGVuYWJsZWQgY29uZGl0aW9uYWwgcnVsZXMgKi8KIAlpZighYXZkYXR1bSkgewotCQlub2RlID0gYXZ0YWJfc2VhcmNoX25vZGUoJnBvbGljeWRiLnRlX2NvbmRfYXZ0YWIsICZhdmtleSwgc3BlY2lmaWVkKTsKKwkJbm9kZSA9IGF2dGFiX3NlYXJjaF9ub2RlKCZwb2xpY3lkYi50ZV9jb25kX2F2dGFiLCAmYXZrZXkpOwogCQlmb3IgKDsgbm9kZSAhPSBOVUxMOyBub2RlID0gYXZ0YWJfc2VhcmNoX25vZGVfbmV4dChub2RlLCBzcGVjaWZpZWQpKSB7Ci0JCQlpZiAobm9kZS0+ZGF0dW0uc3BlY2lmaWVkICYgQVZUQUJfRU5BQkxFRCkgeworCQkJaWYgKG5vZGUtPmtleS5zcGVjaWZpZWQgJiBBVlRBQl9FTkFCTEVEKSB7CiAJCQkJYXZkYXR1bSA9ICZub2RlLT5kYXR1bTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCX0KIAotCXR5cGVfY2hhbmdlID0gKGF2ZGF0dW0gJiYgKGF2ZGF0dW0tPnNwZWNpZmllZCAmIHNwZWNpZmllZCkpOwotCWlmICh0eXBlX2NoYW5nZSkgeworCWlmIChhdmRhdHVtKSB7CiAJCS8qIFVzZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlIHRyYW5zaXRpb24vbWVtYmVyL2NoYW5nZSBydWxlLiAqLwotCQlzd2l0Y2ggKHNwZWNpZmllZCkgewotCQljYXNlIEFWVEFCX1RSQU5TSVRJT046Ci0JCQluZXdjb250ZXh0LnR5cGUgPSBhdnRhYl90cmFuc2l0aW9uKGF2ZGF0dW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVZUQUJfTUVNQkVSOgotCQkJbmV3Y29udGV4dC50eXBlID0gYXZ0YWJfbWVtYmVyKGF2ZGF0dW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVZUQUJfQ0hBTkdFOgotCQkJbmV3Y29udGV4dC50eXBlID0gYXZ0YWJfY2hhbmdlKGF2ZGF0dW0pOwotCQkJYnJlYWs7Ci0JCX0KKwkJbmV3Y29udGV4dC50eXBlID0gYXZkYXR1bS0+ZGF0YTsKIAl9CiAKIAkvKiBDaGVjayBmb3IgY2xhc3Mtc3BlY2lmaWMgY2hhbmdlcy4gKi8KQEAgLTE1MDIsNiArMTUwNyw3IEBACiAJc3RydWN0IHVzZXJfZGF0dW0gKnVzZXI7CiAJc3RydWN0IHJvbGVfZGF0dW0gKnJvbGU7CiAJc3RydWN0IGF2X2RlY2lzaW9uIGF2ZDsKKwlzdHJ1Y3QgZWJpdG1hcF9ub2RlICpybm9kZSwgKnRub2RlOwogCWludCByYyA9IDAsIGksIGo7CiAKIAlpZiAoIXNzX2luaXRpYWxpemVkKSB7CkBAIC0xNTMyLDEzICsxNTM4LDEzIEBACiAJfQogCW1lbXNldChteXNpZHMsIDAsIG1heG5lbCpzaXplb2YoKm15c2lkcykpOwogCi0JZm9yIChpID0gZWJpdG1hcF9zdGFydGJpdCgmdXNlci0+cm9sZXMpOyBpIDwgZWJpdG1hcF9sZW5ndGgoJnVzZXItPnJvbGVzKTsgaSsrKSB7Ci0JCWlmICghZWJpdG1hcF9nZXRfYml0KCZ1c2VyLT5yb2xlcywgaSkpCisJZWJpdG1hcF9mb3JfZWFjaF9iaXQoJnVzZXItPnJvbGVzLCBybm9kZSwgaSkgeworCQlpZiAoIWViaXRtYXBfbm9kZV9nZXRfYml0KHJub2RlLCBpKSkKIAkJCWNvbnRpbnVlOwogCQlyb2xlID0gcG9saWN5ZGIucm9sZV92YWxfdG9fc3RydWN0W2ldOwogCQl1c2VyY29uLnJvbGUgPSBpKzE7Ci0JCWZvciAoaiA9IGViaXRtYXBfc3RhcnRiaXQoJnJvbGUtPnR5cGVzKTsgaiA8IGViaXRtYXBfbGVuZ3RoKCZyb2xlLT50eXBlcyk7IGorKykgewotCQkJaWYgKCFlYml0bWFwX2dldF9iaXQoJnJvbGUtPnR5cGVzLCBqKSkKKwkJZWJpdG1hcF9mb3JfZWFjaF9iaXQoJnJvbGUtPnR5cGVzLCB0bm9kZSwgaikgeworCQkJaWYgKCFlYml0bWFwX25vZGVfZ2V0X2JpdCh0bm9kZSwgaikpCiAJCQkJY29udGludWU7CiAJCQl1c2VyY29uLnR5cGUgPSBqKzE7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9NYWtlZmlsZSBiL3NvdW5kL2FybS9NYWtlZmlsZQppbmRleCAxMDNmMTM2Li40ZWY2ZGQwIDEwMDY0NAotLS0gYS9zb3VuZC9hcm0vTWFrZWZpbGUKKysrIGIvc291bmQvYXJtL01ha2VmaWxlCkBAIC0yLDEyICsyLDE0IEBACiAjIE1ha2VmaWxlIGZvciBBTFNBCiAjCiAKLXNuZC1zYTExeHgtdWRhMTM0MS1vYmpzIDo9IHNhMTF4eC11ZGExMzQxLm8KLXNuZC1hYWNpLW9ianMJCQk6PSBhYWNpLm8gZGV2ZG1hLm8KLXNuZC1weGEyeHgtcGNtLW9ianMgOj0gcHhhMnh4LXBjbS5vCi1zbmQtcHhhMnh4LWFjOTctb2JqcyA6PSBweGEyeHgtYWM5Ny5vCi0KIG9iai0kKENPTkZJR19TTkRfU0ExMVhYX1VEQTEzNDEpICs9IHNuZC1zYTExeHgtdWRhMTM0MS5vIAorc25kLXNhMTF4eC11ZGExMzQxLW9ianMJCTo9IHNhMTF4eC11ZGExMzQxLm8KKwogb2JqLSQoQ09ORklHX1NORF9BUk1BQUNJKQkrPSBzbmQtYWFjaS5vCi1vYmotJChDT05GSUdfU05EX1BYQTJYWF9QQ00pICs9IHNuZC1weGEyeHgtcGNtLm8KLW9iai0kKENPTkZJR19TTkRfUFhBMlhYX0FDOTcpICs9IHNuZC1weGEyeHgtYWM5Ny5vCitzbmQtYWFjaS1vYmpzCQkJOj0gYWFjaS5vIGRldmRtYS5vCisKK29iai0kKENPTkZJR19TTkRfUFhBMlhYX1BDTSkJKz0gc25kLXB4YTJ4eC1wY20ubworc25kLXB4YTJ4eC1wY20tb2JqcwkJOj0gcHhhMnh4LXBjbS5vCisKK29iai0kKENPTkZJR19TTkRfUFhBMlhYX0FDOTcpCSs9IHNuZC1weGEyeHgtYWM5Ny5vCitzbmQtcHhhMnh4LWFjOTctb2JqcwkJOj0gcHhhMnh4LWFjOTcubwpkaWZmIC0tZ2l0IGEvc291bmQvYXJtL2FhY2kuYyBiL3NvdW5kL2FybS9hYWNpLmMKaW5kZXggMDhjYzNkZC4uOTg4NzcwMyAxMDA2NDQKLS0tIGEvc291bmQvYXJtL2FhY2kuYworKysgYi9zb3VuZC9hcm0vYWFjaS5jCkBAIC04MjEsNyArODIxLDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgYWFjaV9zaXplX2ZpZm8oc3RydWN0IGFhY2kgKmFhY2kpCiB7Ci0Jdm9pZCAqYmFzZSA9IGFhY2ktPmJhc2UgKyBBQUNJX0NTQ0gxOworCXZvaWQgX19pb21lbSAqYmFzZSA9IGFhY2ktPmJhc2UgKyBBQUNJX0NTQ0gxOwogCWludCBpOwogCiAJd3JpdGVsKFRYQ1JfRkVOIHwgVFhDUl9UU1oxNiB8IFRYQ1JfVFhFTiwgYmFzZSArIEFBQ0lfVFhDUik7CkBAIC04NzcsNyArODc3LDcgQEAKIAlhYWNpLT5wbGF5YmFjay5maWZvID0gYWFjaS0+YmFzZSArIEFBQ0lfRFIxOwogCiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQl2b2lkICpiYXNlID0gYWFjaS0+YmFzZSArIGkgKiAweDE0OworCQl2b2lkIF9faW9tZW0gKmJhc2UgPSBhYWNpLT5iYXNlICsgaSAqIDB4MTQ7CiAKIAkJd3JpdGVsKDAsIGJhc2UgKyBBQUNJX0lFKTsKIAkJd3JpdGVsKDAsIGJhc2UgKyBBQUNJX1RYQ1IpOwpkaWZmIC0tZ2l0IGEvc291bmQvYXJtL2FhY2kuaCBiL3NvdW5kL2FybS9hYWNpLmgKaW5kZXggZDc1MmU2NC4uYjJmOTY5YiAxMDA2NDQKLS0tIGEvc291bmQvYXJtL2FhY2kuaAorKysgYi9zb3VuZC9hcm0vYWFjaS5oCkBAIC0yMDAsOCArMjAwLDggQEAKIAogCiBzdHJ1Y3QgYWFjaV9ydW50aW1lIHsKLQl2b2lkCQkJKmJhc2U7Ci0Jdm9pZAkJCSpmaWZvOworCXZvaWQJCQlfX2lvbWVtICpiYXNlOworCXZvaWQJCQlfX2lvbWVtICpmaWZvOwogCiAJc3RydWN0IGFjOTdfcGNtCQkqcGNtOwogCWludAkJCXBjbV9vcGVuOwpAQCAtMjIzLDcgKzIyMyw3IEBACiBzdHJ1Y3QgYWFjaSB7CiAJc3RydWN0IGFtYmFfZGV2aWNlCSpkZXY7CiAJc25kX2NhcmRfdAkJKmNhcmQ7Ci0Jdm9pZAkJCSpiYXNlOworCXZvaWQJCQlfX2lvbWVtICpiYXNlOwogCXVuc2lnbmVkIGludAkJZmlmb3NpemU7CiAKIAkvKiBBQyc5NyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvYXJtL3B4YTJ4eC1hYzk3LmMgYi9zb3VuZC9hcm0vcHhhMnh4LWFjOTcuYwppbmRleCA0NjA1MjMwLi4yOTQ1MGJlIDEwMDY0NAotLS0gYS9zb3VuZC9hcm0vcHhhMnh4LWFjOTcuYworKysgYi9zb3VuZC9hcm0vcHhhMnh4LWFjOTcuYwpAQCAtMTMyLDkgKzEzMiw5IEBACiAJCXVkZWxheSgxMCk7CiAJCUdDUiB8PSBHQ1JfV0FSTV9SU1Q7CiAJCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19BTFRfRk5fMl9PVVQpOwotCQl1ZGVsYXkoNTApOworCQl1ZGVsYXkoNTAwKTsKICNlbHNlCi0JCUdDUiB8PSBHQ1JfV0FSTV9SU1R8R0NSX1BSSVJEWV9JRU58R0NSX1NFQ1JEWV9JRU47OworCQlHQ1IgfD0gR0NSX1dBUk1fUlNUfEdDUl9QUklSRFlfSUVOfEdDUl9TRUNSRFlfSUVOOwogCQl3YWl0X2V2ZW50X3RpbWVvdXQoZ3NyX3dxLCBnc3JfYml0cyAmIChHU1JfUENSIHwgR1NSX1NDUiksIDEpOwogI2VuZGlmCQkJCiAKQEAgLTI2MSw3ICsyNjEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB4YTJ4eF9hYzk3X2RvX3Jlc3VtZShzbmRfY2FyZF90ICpjYXJkLCB1bnNpZ25lZCBpbnQgc3RhdGUpCitzdGF0aWMgaW50IHB4YTJ4eF9hYzk3X2RvX3Jlc3VtZShzbmRfY2FyZF90ICpjYXJkKQogewogCWlmIChjYXJkLT5wb3dlcl9zdGF0ZSAhPSBTTkRSVl9DVExfUE9XRVJfRDApIHsKIAkJcHhhMnh4X2F1ZGlvX29wc190ICpwbGF0Zm9ybV9vcHMgPSBjYXJkLT5kZXYtPnBsYXRmb3JtX2RhdGE7CkBAIC0yNzUsMTMgKzI3NSwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB4YTJ4eF9hYzk3X3N1c3BlbmQoc3RydWN0IGRldmljZSAqX2RldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpCitzdGF0aWMgaW50IHB4YTJ4eF9hYzk3X3N1c3BlbmQoc3RydWN0IGRldmljZSAqX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlLCB1MzIgbGV2ZWwpCiB7CiAJc25kX2NhcmRfdCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChjYXJkICYmIGxldmVsID09IFNVU1BFTkRfRElTQUJMRSkKLQkJcmV0ID0gcHhhMnh4X2FjOTdfZG9fc3VzcGVuZChjYXJkLCBTTkRSVl9DVExfUE9XRVJfRDNjb2xkKTsKKwkJcmV0ID0gcHhhMnh4X2FjOTdfZG9fc3VzcGVuZChjYXJkLCBQTVNHX1NVU1BFTkQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI5Miw3ICsyOTIsNyBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKGNhcmQgJiYgbGV2ZWwgPT0gUkVTVU1FX0VOQUJMRSkKLQkJcmV0ID0gcHhhMnh4X2FjOTdfZG9fcmVzdW1lKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EMCk7CisJCXJldCA9IHB4YTJ4eF9hYzk3X2RvX3Jlc3VtZShjYXJkKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL21lbWFsbG9jLmMgYi9zb3VuZC9jb3JlL21lbWFsbG9jLmMKaW5kZXggMDIxMzI1Ni4uMzlhNTRhNCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9tZW1hbGxvYy5jCisrKyBiL3NvdW5kL2NvcmUvbWVtYWxsb2MuYwpAQCAtNTEyLDcgKzUxMiw3IEBACiAgKiBwcm9jIGZpbGUgaW50ZXJmYWNlCiAgKi8KICNkZWZpbmUgU05EX01FTV9QUk9DX0ZJTEUJImRyaXZlci9zbmQtcGFnZS1hbGxvYyIKLXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqc25kX21lbV9wcm9jOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqc25kX21lbV9wcm9jOwogCiBzdGF0aWMgaW50IHNuZF9tZW1fcHJvY19yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQkJICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQpAQCAtNjU1LDggKzY1NSw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzbmRfbWVtX2V4aXQodm9pZCkKIHsKLQlpZiAoc25kX21lbV9wcm9jKQotCQlyZW1vdmVfcHJvY19lbnRyeShTTkRfTUVNX1BST0NfRklMRSwgTlVMTCk7CisJcmVtb3ZlX3Byb2NfZW50cnkoU05EX01FTV9QUk9DX0ZJTEUsIE5VTEwpOwogCWZyZWVfYWxsX3Jlc2VydmVkX3BhZ2VzKCk7CiAJaWYgKHNuZF9hbGxvY2F0ZWRfcGFnZXMgPiAwKQogCQlwcmludGsoS0VSTl9FUlIgInNuZC1tYWxsb2M6IE1lbW9yeSBsZWFrPyAgcGFnZXMgbm90IGZyZWVkID0gJWxpXG4iLCBzbmRfYWxsb2NhdGVkX3BhZ2VzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvbWVtb3J5LmMgYi9zb3VuZC9jb3JlL21lbW9yeS5jCmluZGV4IGY2ODk1NTcuLjI5MWI0NzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvbWVtb3J5LmMKKysrIGIvc291bmQvY29yZS9tZW1vcnkuYwpAQCAtNTYsNyArNTYsNyBAQAogI2RlZmluZSBWTUFMTE9DX01BR0lDIDB4ODc2NTQzMjAKIHN0YXRpYyBzbmRfaW5mb19lbnRyeV90ICpzbmRfbWVtb3J5X2luZm9fZW50cnk7CiAKLXZvaWQgc25kX21lbW9yeV9pbml0KHZvaWQpCit2b2lkIF9faW5pdCBzbmRfbWVtb3J5X2luaXQodm9pZCkKIHsKIAlzbmRfYWxsb2Nfa21hbGxvYyA9IDA7CiAJc25kX2FsbG9jX3ZtYWxsb2MgPSAwOwpAQCAtMTE2LDE1ICsxMTYsMjEgQEAKIAlyZXR1cm4gX3NuZF9rbWFsbG9jKHNpemUsIGZsYWdzKTsKIH0KIAordm9pZCAqc25kX2hpZGRlbl9remFsbG9jKHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpCit7CisJdm9pZCAqcmV0ID0gX3NuZF9rbWFsbG9jKHNpemUsIGZsYWdzKTsKKwlpZiAocmV0KQorCQltZW1zZXQocmV0LCAwLCBzaXplKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzbmRfaGlkZGVuX2t6YWxsb2MpOworCiB2b2lkICpzbmRfaGlkZGVuX2tjYWxsb2Moc2l6ZV90IG4sIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpCiB7CiAJdm9pZCAqcmV0ID0gTlVMTDsKIAlpZiAobiAhPSAwICYmIHNpemUgPiBJTlRfTUFYIC8gbikKIAkJcmV0dXJuIHJldDsKLQlyZXQgPSBfc25kX2ttYWxsb2MobiAqIHNpemUsIGZsYWdzKTsKLQlpZiAocmV0KQotCQltZW1zZXQocmV0LCAwLCBuICogc2l6ZSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc25kX2hpZGRlbl9remFsbG9jKG4gKiBzaXplLCBmbGFncyk7CiB9CiAKIHZvaWQgc25kX2hpZGRlbl9rZnJlZShjb25zdCB2b2lkICpvYmopCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMgYi9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMKaW5kZXggZGU3NDQ0Yy4uYTEzYmQ3YiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCisrKyBiL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYwpAQCAtMTcwNSwxMyArMTcwNSwxMiBAQAogCQlpZiAoc25kX3BjbV9ydW5uaW5nKHN1YnN0cmVhbSkpCiAJCQlzbmRfcGNtX3N0b3Aoc3Vic3RyZWFtLCBTTkRSVl9QQ01fU1RBVEVfU0VUVVApOwogCQlzbmRfcGNtX3N0cmVhbV91bmxvY2tfaXJxKHN1YnN0cmVhbSk7Ci0JCWlmIChzdWJzdHJlYW0tPm9wZW5fZmxhZykgeworCQlpZiAoc3Vic3RyZWFtLT5mZmlsZSAhPSBOVUxMKSB7CiAJCQlpZiAoc3Vic3RyZWFtLT5vcHMtPmh3X2ZyZWUgIT0gTlVMTCkKIAkJCQlzdWJzdHJlYW0tPm9wcy0+aHdfZnJlZShzdWJzdHJlYW0pOwogCQkJc3Vic3RyZWFtLT5vcHMtPmNsb3NlKHN1YnN0cmVhbSk7Ci0JCQlzdWJzdHJlYW0tPm9wZW5fZmxhZyA9IDA7CisJCQlzdWJzdHJlYW0tPmZmaWxlID0gTlVMTDsKIAkJfQotCQlzdWJzdHJlYW0tPmZmaWxlID0gTlVMTDsKIAkJc25kX3BjbV9vc3NfcmVsZWFzZV9zdWJzdHJlYW0oc3Vic3RyZWFtKTsKIAkJc25kX3BjbV9yZWxlYXNlX3N1YnN0cmVhbShzdWJzdHJlYW0pOwogCX0KQEAgLTE3NzgsMTQgKzE3NzcsMTMgQEAKIAkJCXNuZF9wY21fb3NzX3JlbGVhc2VfZmlsZShwY21fb3NzX2ZpbGUpOwogCQkJcmV0dXJuIGVycjsKIAkJfQotCQlwc3Vic3RyZWFtLT5vcGVuX2ZsYWcgPSAxOworCQlwc3Vic3RyZWFtLT5mZmlsZSA9IGZpbGU7CiAJCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludHNfY29tcGxldGUocHN1YnN0cmVhbSk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlzbmRfcHJpbnRkKCJzbmRfcGNtX2h3X2NvbnN0cmFpbnRfY29tcGxldGUgZmFpbGVkXG4iKTsKIAkJCXNuZF9wY21fb3NzX3JlbGVhc2VfZmlsZShwY21fb3NzX2ZpbGUpOwogCQkJcmV0dXJuIGVycjsKIAkJfQotCQlwc3Vic3RyZWFtLT5mZmlsZSA9IGZpbGU7CiAJCXNuZF9wY21fb3NzX2luaXRfc3Vic3RyZWFtKHBzdWJzdHJlYW0sIHBzZXR1cCwgbWlub3IpOwogCX0KIAlpZiAoY3N1YnN0cmVhbSAhPSBOVUxMKSB7CkBAIC0xODAwLDE0ICsxNzk4LDEzIEBACiAJCQlzbmRfcGNtX29zc19yZWxlYXNlX2ZpbGUocGNtX29zc19maWxlKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KLQkJY3N1YnN0cmVhbS0+b3Blbl9mbGFnID0gMTsKKwkJY3N1YnN0cmVhbS0+ZmZpbGUgPSBmaWxlOwogCQllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRzX2NvbXBsZXRlKGNzdWJzdHJlYW0pOwogCQlpZiAoZXJyIDwgMCkgewogCQkJc25kX3ByaW50ZCgic25kX3BjbV9od19jb25zdHJhaW50X2NvbXBsZXRlIGZhaWxlZFxuIik7CiAJCQlzbmRfcGNtX29zc19yZWxlYXNlX2ZpbGUocGNtX29zc19maWxlKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KLQkJY3N1YnN0cmVhbS0+ZmZpbGUgPSBmaWxlOwogCQlzbmRfcGNtX29zc19pbml0X3N1YnN0cmVhbShjc3Vic3RyZWFtLCBjc2V0dXAsIG1pbm9yKTsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX2NvbXBhdC5jIGIvc291bmQvY29yZS9wY21fY29tcGF0LmMKaW5kZXggMzkyMGJmMC4uNGI2MzA3ZCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fY29tcGF0LmMKKysrIGIvc291bmQvY29yZS9wY21fY29tcGF0LmMKQEAgLTEwMywxMCArMTAzLDI0IEBACiAJdW5zaWduZWQgY2hhciByZXNlcnZlZFs2NF07CiB9OwogCisvKiByZWNhbGN1YXRlIHRoZSBib3VuZGFyeSB3aXRoaW4gMzJiaXQgKi8KK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCByZWNhbGN1bGF0ZV9ib3VuZGFyeShzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSkKK3sKKwlzbmRfcGNtX3VmcmFtZXNfdCBib3VuZGFyeTsKKworCWlmICghIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQorCQlyZXR1cm4gMDsKKwlib3VuZGFyeSA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCXdoaWxlIChib3VuZGFyeSAqIDIgPD0gMHg3ZmZmZmZmZlVMIC0gcnVudGltZS0+YnVmZmVyX3NpemUpCisJCWJvdW5kYXJ5ICo9IDI7CisJcmV0dXJuIGJvdW5kYXJ5OworfQorCiBzdGF0aWMgaW50IHNuZF9wY21faW9jdGxfc3dfcGFyYW1zX2NvbXBhdChzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCiAJCQkJCSAgc3RydWN0IHNuZHJ2X3BjbV9zd19wYXJhbXMzMiBfX3VzZXIgKnNyYykKIHsKIAlzbmRfcGNtX3N3X3BhcmFtc190IHBhcmFtczsKKwlzbmRfcGNtX3VmcmFtZXNfdCBib3VuZGFyeTsKIAlpbnQgZXJyOwogCiAJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKQEAgLTEyMCwxMCArMTM0LDE3IEBACiAJICAgIGdldF91c2VyKHBhcmFtcy5zaWxlbmNlX3RocmVzaG9sZCwgJnNyYy0+c2lsZW5jZV90aHJlc2hvbGQpIHx8CiAJICAgIGdldF91c2VyKHBhcmFtcy5zaWxlbmNlX3NpemUsICZzcmMtPnNpbGVuY2Vfc2l6ZSkpCiAJCXJldHVybiAtRUZBVUxUOworCS8qCisJICogQ2hlY2sgc2lsZW50X3NpemUgcGFyYW1ldGVyLiAgU2luY2Ugd2UgaGF2ZSA2NGJpdCBib3VuZGFyeSwKKwkgKiBzaWxlbmNlX3NpemUgbXVzdCBiZSBjb21wYXJlZCB3aXRoIHRoZSAzMmJpdCBib3VuZGFyeS4KKwkgKi8KKwlib3VuZGFyeSA9IHJlY2FsY3VsYXRlX2JvdW5kYXJ5KHN1YnN0cmVhbS0+cnVudGltZSk7CisJaWYgKGJvdW5kYXJ5ICYmIHBhcmFtcy5zaWxlbmNlX3NpemUgPj0gYm91bmRhcnkpCisJCXBhcmFtcy5zaWxlbmNlX3NpemUgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJvdW5kYXJ5OwogCWVyciA9IHNuZF9wY21fc3dfcGFyYW1zKHN1YnN0cmVhbSwgJnBhcmFtcyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JaWYgKHB1dF91c2VyKHBhcmFtcy5ib3VuZGFyeSwgJnNyYy0+Ym91bmRhcnkpKQorCWlmIChib3VuZGFyeSAmJiBwdXRfdXNlcihib3VuZGFyeSwgJnNyYy0+Ym91bmRhcnkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTk5LDE2ICsyMjAsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qIHJlY2FsY3VhdGUgdGhlIGJvdW5kYXJ5IHdpdGhpbiAzMmJpdCAqLwotc3RhdGljIHZvaWQgcmVjYWxjdWxhdGVfYm91bmRhcnkoc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUpCi17Ci0JaWYgKCEgcnVudGltZS0+YnVmZmVyX3NpemUpCi0JCXJldHVybjsKLQlydW50aW1lLT5ib3VuZGFyeSA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwotCXdoaWxlIChydW50aW1lLT5ib3VuZGFyeSAqIDIgPD0gMHg3ZmZmZmZmZlVMIC0gcnVudGltZS0+YnVmZmVyX3NpemUpCi0JCXJ1bnRpbWUtPmJvdW5kYXJ5ICo9IDI7Ci19Ci0KIC8qIGJvdGggZm9yIEhXX1BBUkFNUyBhbmQgSFdfUkVGSU5FICovCiBzdGF0aWMgaW50IHNuZF9wY21faW9jdGxfaHdfcGFyYW1zX2NvbXBhdChzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0sCiAJCQkJCSAgaW50IHJlZmluZSwgCkBAIC0yNDEsOCArMjUyLDExIEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JaWYgKCEgcmVmaW5lKQotCQlyZWNhbGN1bGF0ZV9ib3VuZGFyeShydW50aW1lKTsKKwlpZiAoISByZWZpbmUpIHsKKwkJdW5zaWduZWQgaW50IG5ld19ib3VuZGFyeSA9IHJlY2FsY3VsYXRlX2JvdW5kYXJ5KHJ1bnRpbWUpOworCQlpZiAobmV3X2JvdW5kYXJ5KQorCQkJcnVudGltZS0+Ym91bmRhcnkgPSBuZXdfYm91bmRhcnk7CisJfQogIGVycm9yOgogCWtmcmVlKGRhdGEpOwogCXJldHVybiBlcnI7CkBAIC0zODAsNiArMzk0LDcgQEAKIAl1MzIgc2ZsYWdzOwogCXN0cnVjdCBzbmRydl9wY21fbW1hcF9jb250cm9sIHNjb250cm9sOwogCXN0cnVjdCBzbmRydl9wY21fbW1hcF9zdGF0dXMgc3N0YXR1czsKKwlzbmRfcGNtX3VmcmFtZXNfdCBib3VuZGFyeTsKIAlpbnQgZXJyOwogCiAJc25kX2Fzc2VydChydW50aW1lLCByZXR1cm4gLUVJTlZBTCk7CkBAIC0zOTUsMTcgKzQxMCwyMSBAQAogCX0KIAlzdGF0dXMgPSBydW50aW1lLT5zdGF0dXM7CiAJY29udHJvbCA9IHJ1bnRpbWUtPmNvbnRyb2w7CisJYm91bmRhcnkgPSByZWNhbGN1bGF0ZV9ib3VuZGFyeShydW50aW1lKTsKKwlpZiAoISBib3VuZGFyeSkKKwkJYm91bmRhcnkgPSAweDdmZmZmZmZmOwogCXNuZF9wY21fc3RyZWFtX2xvY2tfaXJxKHN1YnN0cmVhbSk7CisJLyogRklYTUU6IHdlIHNob3VsZCBjb25zaWRlciB0aGUgYm91bmRhcnkgZm9yIHRoZSBzeW5jIGZyb20gYXBwICovCiAJaWYgKCEoc2ZsYWdzICYgU05EUlZfUENNX1NZTkNfUFRSX0FQUEwpKQogCQljb250cm9sLT5hcHBsX3B0ciA9IHNjb250cm9sLmFwcGxfcHRyOwogCWVsc2UKLQkJc2NvbnRyb2wuYXBwbF9wdHIgPSBjb250cm9sLT5hcHBsX3B0cjsKKwkJc2NvbnRyb2wuYXBwbF9wdHIgPSBjb250cm9sLT5hcHBsX3B0ciAlIGJvdW5kYXJ5OwogCWlmICghKHNmbGFncyAmIFNORFJWX1BDTV9TWU5DX1BUUl9BVkFJTF9NSU4pKQogCQljb250cm9sLT5hdmFpbF9taW4gPSBzY29udHJvbC5hdmFpbF9taW47CiAJZWxzZQogCQlzY29udHJvbC5hdmFpbF9taW4gPSBjb250cm9sLT5hdmFpbF9taW47CiAJc3N0YXR1cy5zdGF0ZSA9IHN0YXR1cy0+c3RhdGU7Ci0Jc3N0YXR1cy5od19wdHIgPSBzdGF0dXMtPmh3X3B0cjsKKwlzc3RhdHVzLmh3X3B0ciA9IHN0YXR1cy0+aHdfcHRyICUgYm91bmRhcnk7CiAJc3N0YXR1cy50c3RhbXAgPSBzdGF0dXMtPnRzdGFtcDsKIAlzc3RhdHVzLnN1c3BlbmRlZF9zdGF0ZSA9IHN0YXR1cy0+c3VzcGVuZGVkX3N0YXRlOwogCXNuZF9wY21fc3RyZWFtX3VubG9ja19pcnEoc3Vic3RyZWFtKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX2xpYi5jIGIvc291bmQvY29yZS9wY21fbGliLmMKaW5kZXggYzViZmQwOS4uMDA4MjkxNCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbGliLmMKKysrIGIvc291bmQvY29yZS9wY21fbGliLmMKQEAgLTE1ODQsOCArMTU4NCw4IEBACiAJcmV0dXJuIHNuZF9wY21faHdfcGFyYW1fdmFsdWUocGFyYW1zLCB2YXIsIE5VTEwpOwogfQogCi1pbnQgX3NuZF9wY21faHdfcGFyYW1fbWFzayhzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsCi0JCQkgICBzbmRfcGNtX2h3X3BhcmFtX3QgdmFyLCBjb25zdCBzbmRfbWFza190ICp2YWwpCitzdGF0aWMgaW50IF9zbmRfcGNtX2h3X3BhcmFtX21hc2soc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLAorCQkJCSAgc25kX3BjbV9od19wYXJhbV90IHZhciwgY29uc3Qgc25kX21hc2tfdCAqdmFsKQogewogCWludCBjaGFuZ2VkOwogCWFzc2VydChod19pc19tYXNrKHZhcikpOwpAQCAtMjA2Myw3ICsyMDYzLDcgQEAKIAkJaWYgKCgoYXZhaWwgPCBydW50aW1lLT5jb250cm9sLT5hdmFpbF9taW4gJiYgc2l6ZSA+IGF2YWlsKSB8fAogCQkgICAoc2l6ZSA+PSBydW50aW1lLT54ZmVyX2FsaWduICYmIGF2YWlsIDwgcnVudGltZS0+eGZlcl9hbGlnbikpKSB7CiAJCQl3YWl0X3F1ZXVlX3Qgd2FpdDsKLQkJCWVudW0geyBSRUFEWSwgU0lHTkFMRUQsIEVSUk9SLCBTVVNQRU5ERUQsIEVYUElSRUQgfSBzdGF0ZTsKKwkJCWVudW0geyBSRUFEWSwgU0lHTkFMRUQsIEVSUk9SLCBTVVNQRU5ERUQsIEVYUElSRUQsIERST1BQRUQgfSBzdGF0ZTsKIAkJCWxvbmcgdG91dDsKIAogCQkJaWYgKG5vbmJsb2NrKSB7CkBAIC0yMDk3LDYgKzIwOTcsOSBAQAogCQkJCWNhc2UgU05EUlZfUENNX1NUQVRFX1NVU1BFTkRFRDoKIAkJCQkJc3RhdGUgPSBTVVNQRU5ERUQ7CiAJCQkJCWdvdG8gX2VuZF9sb29wOworCQkJCWNhc2UgU05EUlZfUENNX1NUQVRFX1NFVFVQOgorCQkJCQlzdGF0ZSA9IERST1BQRUQ7CisJCQkJCWdvdG8gX2VuZF9sb29wOwogCQkJCWRlZmF1bHQ6CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTIxMjMsNiArMjEyNiw5IEBACiAJCQkJc25kX3ByaW50ZCgicGxheWJhY2sgd3JpdGUgZXJyb3IgKERNQSBvciBJUlEgdHJvdWJsZT8pXG4iKTsKIAkJCQllcnIgPSAtRUlPOwogCQkJCWdvdG8gX2VuZF91bmxvY2s7CisJCQljYXNlIERST1BQRUQ6CisJCQkJZXJyID0gLUVCQURGRDsKKwkJCQlnb3RvIF9lbmRfdW5sb2NrOwogCQkJZGVmYXVsdDoKIAkJCQlicmVhazsKIAkJCX0KQEAgLTIzNTksNyArMjM2NSw3IEBACiAJCX0gZWxzZSBpZiAoKGF2YWlsIDwgcnVudGltZS0+Y29udHJvbC0+YXZhaWxfbWluICYmIHNpemUgPiBhdmFpbCkgfHwKIAkJCSAgIChzaXplID49IHJ1bnRpbWUtPnhmZXJfYWxpZ24gJiYgYXZhaWwgPCBydW50aW1lLT54ZmVyX2FsaWduKSkgewogCQkJd2FpdF9xdWV1ZV90IHdhaXQ7Ci0JCQllbnVtIHsgUkVBRFksIFNJR05BTEVELCBFUlJPUiwgU1VTUEVOREVELCBFWFBJUkVEIH0gc3RhdGU7CisJCQllbnVtIHsgUkVBRFksIFNJR05BTEVELCBFUlJPUiwgU1VTUEVOREVELCBFWFBJUkVELCBEUk9QUEVEIH0gc3RhdGU7CiAJCQlsb25nIHRvdXQ7CiAKIAkJCWlmIChub25ibG9jaykgewpAQCAtMjM5NCw2ICsyNDAwLDkgQEAKIAkJCQkJZ290byBfZW5kX2xvb3A7CiAJCQkJY2FzZSBTTkRSVl9QQ01fU1RBVEVfRFJBSU5JTkc6CiAJCQkJCWdvdG8gX19kcmFpbmluZzsKKwkJCQljYXNlIFNORFJWX1BDTV9TVEFURV9TRVRVUDoKKwkJCQkJc3RhdGUgPSBEUk9QUEVEOworCQkJCQlnb3RvIF9lbmRfbG9vcDsKIAkJCQlkZWZhdWx0OgogCQkJCQlicmVhazsKIAkJCQl9CkBAIC0yNDIwLDYgKzI0MjksOSBAQAogCQkJCXNuZF9wcmludGQoImNhcHR1cmUgcmVhZCBlcnJvciAoRE1BIG9yIElSUSB0cm91YmxlPylcbiIpOwogCQkJCWVyciA9IC1FSU87CiAJCQkJZ290byBfZW5kX3VubG9jazsKKwkJCWNhc2UgRFJPUFBFRDoKKwkJCQllcnIgPSAtRUJBREZEOworCQkJCWdvdG8gX2VuZF91bmxvY2s7CiAJCQlkZWZhdWx0OgogCQkJCWJyZWFrOwogCQkJfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbmF0aXZlLmMgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwppbmRleCAxMGMyYzk4Li4wM2MxNzE1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYworKysgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwpAQCAtMTAyNSw3ICsxMDI1LDcgQEAKIAlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzbmRfcGNtX3RyaWdnZXJfdHN0YW1wKHN1YnN0cmVhbSk7CiAJaWYgKHN1YnN0cmVhbS0+dGltZXIpCi0JCXNuZF90aW1lcl9ub3RpZnkoc3Vic3RyZWFtLT50aW1lciwgU05EUlZfVElNRVJfRVZFTlRfTVBBVVNFLCAmcnVudGltZS0+dHJpZ2dlcl90c3RhbXApOworCQlzbmRfdGltZXJfbm90aWZ5KHN1YnN0cmVhbS0+dGltZXIsIFNORFJWX1RJTUVSX0VWRU5UX01TVVNQRU5ELCAmcnVudGltZS0+dHJpZ2dlcl90c3RhbXApOwogCXJ1bnRpbWUtPnN0YXR1cy0+c3VzcGVuZGVkX3N0YXRlID0gcnVudGltZS0+c3RhdHVzLT5zdGF0ZTsKIAlydW50aW1lLT5zdGF0dXMtPnN0YXRlID0gU05EUlZfUENNX1NUQVRFX1NVU1BFTkRFRDsKIAlzbmRfcGNtX3RpY2tfc2V0KHN1YnN0cmVhbSwgMCk7CkBAIC0xMTE1LDcgKzExMTUsNyBAQAogCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXNuZF9wY21fdHJpZ2dlcl90c3RhbXAoc3Vic3RyZWFtKTsKIAlpZiAoc3Vic3RyZWFtLT50aW1lcikKLQkJc25kX3RpbWVyX25vdGlmeShzdWJzdHJlYW0tPnRpbWVyLCBTTkRSVl9USU1FUl9FVkVOVF9NQ09OVElOVUUsICZydW50aW1lLT50cmlnZ2VyX3RzdGFtcCk7CisJCXNuZF90aW1lcl9ub3RpZnkoc3Vic3RyZWFtLT50aW1lciwgU05EUlZfVElNRVJfRVZFTlRfTVJFU1VNRSwgJnJ1bnRpbWUtPnRyaWdnZXJfdHN0YW1wKTsKIAlydW50aW1lLT5zdGF0dXMtPnN0YXRlID0gcnVudGltZS0+c3RhdHVzLT5zdXNwZW5kZWRfc3RhdGU7CiAJaWYgKHJ1bnRpbWUtPnNsZWVwX21pbikKIAkJc25kX3BjbV90aWNrX3ByZXBhcmUoc3Vic3RyZWFtKTsKQEAgLTE5NjcsMTMgKzE5NjcsMTIgQEAKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXN0ciA9IHN1YnN0cmVhbS0+cHN0cjsKIAlzbmRfcGNtX3VubGluayhzdWJzdHJlYW0pOwotCWlmIChzdWJzdHJlYW0tPm9wZW5fZmxhZykgeworCWlmIChzdWJzdHJlYW0tPmZmaWxlICE9IE5VTEwpIHsKIAkJaWYgKHN1YnN0cmVhbS0+b3BzLT5od19mcmVlICE9IE5VTEwpCiAJCQlzdWJzdHJlYW0tPm9wcy0+aHdfZnJlZShzdWJzdHJlYW0pOwogCQlzdWJzdHJlYW0tPm9wcy0+Y2xvc2Uoc3Vic3RyZWFtKTsKLQkJc3Vic3RyZWFtLT5vcGVuX2ZsYWcgPSAwOworCQlzdWJzdHJlYW0tPmZmaWxlID0gTlVMTDsKIAl9Ci0Jc3Vic3RyZWFtLT5mZmlsZSA9IE5VTEw7CiAJc25kX3BjbV9yZW1vdmVfZmlsZShzdHIsIHBjbV9maWxlKTsKIAlzbmRfcGNtX3JlbGVhc2Vfc3Vic3RyZWFtKHN1YnN0cmVhbSk7CiAJa2ZyZWUocGNtX2ZpbGUpOwpAQCAtMjAyMiwxOCArMjAyMSwxNSBAQAogCQlzbmRfcGNtX3JlbGVhc2VfZmlsZShwY21fZmlsZSk7CiAJCXJldHVybiBlcnI7CiAJfQotCXN1YnN0cmVhbS0+b3Blbl9mbGFnID0gMTsKKwlzdWJzdHJlYW0tPmZmaWxlID0gZmlsZTsKIAogCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludHNfY29tcGxldGUoc3Vic3RyZWFtKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRkKCJzbmRfcGNtX2h3X2NvbnN0cmFpbnRzX2NvbXBsZXRlIGZhaWxlZFxuIik7Ci0JCXN1YnN0cmVhbS0+b3BzLT5jbG9zZShzdWJzdHJlYW0pOwogCQlzbmRfcGNtX3JlbGVhc2VfZmlsZShwY21fZmlsZSk7CiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc3Vic3RyZWFtLT5mZmlsZSA9IGZpbGU7Ci0KIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBwY21fZmlsZTsKIAkqcnBjbV9maWxlID0gcGNtX2ZpbGU7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NvdW5kX29zcy5jIGIvc291bmQvY29yZS9zb3VuZF9vc3MuYwppbmRleCBkZTM5ZDIxLi5lNDAxYzY3IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NvdW5kX29zcy5jCisrKyBiL3NvdW5kL2NvcmUvc291bmRfb3NzLmMKQEAgLTk4LDYgKzk4LDcgQEAKIAlpbnQgY2lkeCA9IFNORFJWX01JTk9SX09TU19DQVJEKG1pbm9yKTsKIAlpbnQgdHJhY2syID0gLTE7CiAJaW50IHJlZ2lzdGVyMSA9IC0xLCByZWdpc3RlcjIgPSAtMTsKKwlzdHJ1Y3QgZGV2aWNlICpjYXJkZGV2ID0gTlVMTDsKIAogCWlmIChtaW5vciA8IDApCiAJCXJldHVybiBtaW5vcjsKQEAgLTEyMSwxMSArMTIyLDEzIEBACiAJCXRyYWNrMiA9IFNORFJWX01JTk9SX09TUyhjaWR4LCBTTkRSVl9NSU5PUl9PU1NfRE1NSURJMSk7CiAJCWJyZWFrOwogCX0KLQlyZWdpc3RlcjEgPSByZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKHJlZy0+Zl9vcHMsIG1pbm9yKTsKKwlpZiAoY2FyZCkKKwkJY2FyZGRldiA9IGNhcmQtPmRldjsKKwlyZWdpc3RlcjEgPSByZWdpc3Rlcl9zb3VuZF9zcGVjaWFsX2RldmljZShyZWctPmZfb3BzLCBtaW5vciwgY2FyZGRldik7CiAJaWYgKHJlZ2lzdGVyMSAhPSBtaW5vcikKIAkJZ290byBfX2VuZDsKIAlpZiAodHJhY2syID49IDApIHsKLQkJcmVnaXN0ZXIyID0gcmVnaXN0ZXJfc291bmRfc3BlY2lhbChyZWctPmZfb3BzLCB0cmFjazIpOworCQlyZWdpc3RlcjIgPSByZWdpc3Rlcl9zb3VuZF9zcGVjaWFsX2RldmljZShyZWctPmZfb3BzLCB0cmFjazIsIGNhcmRkZXYpOwogCQlpZiAocmVnaXN0ZXIyICE9IHRyYWNrMikKIAkJCWdvdG8gX19lbmQ7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS90aW1lci5jIGIvc291bmQvY29yZS90aW1lci5jCmluZGV4IGNmYWNjZDQuLjQxMDRmNmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvdGltZXIuYworKysgYi9zb3VuZC9jb3JlL3RpbWVyLmMKQEAgLTc5OSwxMyArNzk5LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBzbmRfdGltZXJfZGV2X2ZyZWUoc25kX2RldmljZV90ICpkZXZpY2UpCitzdGF0aWMgaW50IHNuZF90aW1lcl9kZXZfZnJlZShzbmRfZGV2aWNlX3QgKmRldmljZSkKIHsKIAlzbmRfdGltZXJfdCAqdGltZXIgPSBkZXZpY2UtPmRldmljZV9kYXRhOwogCXJldHVybiBzbmRfdGltZXJfZnJlZSh0aW1lcik7CiB9CiAKLWludCBzbmRfdGltZXJfZGV2X3JlZ2lzdGVyKHNuZF9kZXZpY2VfdCAqZGV2KQorc3RhdGljIGludCBzbmRfdGltZXJfZGV2X3JlZ2lzdGVyKHNuZF9kZXZpY2VfdCAqZGV2KQogewogCXNuZF90aW1lcl90ICp0aW1lciA9IGRldi0+ZGV2aWNlX2RhdGE7CiAJc25kX3RpbWVyX3QgKnRpbWVyMTsKQEAgLTg4MCw5ICs4ODAsMTEgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKIAogCXNuZF9ydW50aW1lX2NoZWNrKHRpbWVyLT5ody5mbGFncyAmIFNORFJWX1RJTUVSX0hXX1NMQVZFLCByZXR1cm4pOwkKLQlzbmRfYXNzZXJ0KGV2ZW50ID49IFNORFJWX1RJTUVSX0VWRU5UX01TVEFSVCAmJiBldmVudCA8PSBTTkRSVl9USU1FUl9FVkVOVF9NUEFVU0UsIHJldHVybik7CisJc25kX2Fzc2VydChldmVudCA+PSBTTkRSVl9USU1FUl9FVkVOVF9NU1RBUlQgJiYgZXZlbnQgPD0gU05EUlZfVElNRVJfRVZFTlRfTVJFU1VNRSwgcmV0dXJuKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdGltZXItPmxvY2ssIGZsYWdzKTsKLQlpZiAoZXZlbnQgPT0gU05EUlZfVElNRVJfRVZFTlRfTVNUQVJUIHx8IGV2ZW50ID09IFNORFJWX1RJTUVSX0VWRU5UX01DT05USU5VRSkgeworCWlmIChldmVudCA9PSBTTkRSVl9USU1FUl9FVkVOVF9NU1RBUlQgfHwKKwkgICAgZXZlbnQgPT0gU05EUlZfVElNRVJfRVZFTlRfTUNPTlRJTlVFIHx8CisJICAgIGV2ZW50ID09IFNORFJWX1RJTUVSX0VWRU5UX01SRVNVTUUpIHsKIAkJaWYgKHRpbWVyLT5ody5jX3Jlc29sdXRpb24pCiAJCQlyZXNvbHV0aW9uID0gdGltZXItPmh3LmNfcmVzb2x1dGlvbih0aW1lcik7CiAJCWVsc2UKQEAgLTE1NTUsMTAgKzE1NTcsMTQgQEAKIAkJCSAgICAgICgxPDxTTkRSVl9USU1FUl9FVkVOVF9TVE9QKXwKIAkJCSAgICAgICgxPDxTTkRSVl9USU1FUl9FVkVOVF9DT05USU5VRSl8CiAJCQkgICAgICAoMTw8U05EUlZfVElNRVJfRVZFTlRfUEFVU0UpfAorCQkJICAgICAgKDE8PFNORFJWX1RJTUVSX0VWRU5UX1NVU1BFTkQpfAorCQkJICAgICAgKDE8PFNORFJWX1RJTUVSX0VWRU5UX1JFU1VNRSl8CiAJCQkgICAgICAoMTw8U05EUlZfVElNRVJfRVZFTlRfTVNUQVJUKXwKIAkJCSAgICAgICgxPDxTTkRSVl9USU1FUl9FVkVOVF9NU1RPUCl8CiAJCQkgICAgICAoMTw8U05EUlZfVElNRVJfRVZFTlRfTUNPTlRJTlVFKXwKLQkJCSAgICAgICgxPDxTTkRSVl9USU1FUl9FVkVOVF9NUEFVU0UpKSkgeworCQkJICAgICAgKDE8PFNORFJWX1RJTUVSX0VWRU5UX01QQVVTRSl8CisJCQkgICAgICAoMTw8U05EUlZfVElNRVJfRVZFTlRfTVNVU1BFTkQpfAorCQkJICAgICAgKDE8PFNORFJWX1RJTUVSX0VWRU5UX01SRVNVTUUpKSkgewogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIF9lbmQ7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy92eC92eF9taXhlci5jIGIvc291bmQvZHJpdmVycy92eC92eF9taXhlci5jCmluZGV4IGYwMGM4ODguLjE5ZmM2OGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvdngvdnhfbWl4ZXIuYworKysgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X21peGVyLmMKQEAgLTc5NiwxNCArNzk2LDE0IEBACiAKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3QgdnhfY29udHJvbF9pZWM5NThfbWFzayA9IHsKIAkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCi0JLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAogCS5uYW1lID0JCVNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxNQVNLKSwKIAkuaW5mbyA9CQl2eF9pZWM5NThfaW5mbywJLyogc2hhcmVkICovCiAJLmdldCA9CQl2eF9pZWM5NThfbWFza19nZXQsCiB9OwogCiBzdGF0aWMgc25kX2tjb250cm9sX25ld190IHZ4X2NvbnRyb2xfaWVjOTU4ID0gewotCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKIAkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLAogCS5pbmZvID0gICAgICAgICB2eF9pZWM5NThfaW5mbywKIAkuZ2V0ID0gICAgICAgICAgdnhfaWVjOTU4X2dldCwKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvdngvdnhfcGNtLmMgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X3BjbS5jCmluZGV4IGFmMzgxYjEuLmQ0YmVjZjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvdngvdnhfcGNtLmMKKysrIGIvc291bmQvZHJpdmVycy92eC92eF9wY20uYwpAQCAtNTQ5LDggKzU0OSw4IEBACiAKIHN0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3QgdnhfcGNtX3BsYXliYWNrX2h3ID0gewogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJCQkgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIC8qfCovCisJCQkJIC8qU05EUlZfUENNX0lORk9fUkVTVU1FKi8pLAogCS5mb3JtYXRzID0JCS8qU05EUlZfUENNX0ZNVEJJVF9VOCB8Ki8gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUsCiAJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAogCS5yYXRlX21pbiA9CQk1MDAwLApAQCAtOTQ5LDggKzk0OSw4IEBACiAKIHN0YXRpYyBzbmRfcGNtX2hhcmR3YXJlX3QgdnhfcGNtX2NhcHR1cmVfaHcgPSB7CiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8IFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAorCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8IFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgLyp8Ki8KKwkJCQkgLypTTkRSVl9QQ01fSU5GT19SRVNVTUUqLyksCiAJLmZvcm1hdHMgPQkJLypTTkRSVl9QQ01fRk1UQklUX1U4IHwqLyBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSwKIAkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCiAJLnJhdGVfbWluID0JCTUwMDAsCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvS2NvbmZpZyBiL3NvdW5kL2lzYS9LY29uZmlnCmluZGV4IGJlNGVhNjAuLjVjMzk0ODMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9LY29uZmlnCisrKyBiL3NvdW5kL2lzYS9LY29uZmlnCkBAIC0xNSw3ICsxNSw4IEBACiAKIGNvbmZpZyBTTkRfQUQxODE2QQogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBTb3VuZFBvcnQgQUQxODE2QSIKLQlkZXBlbmRzIG9uIFNORCAmJiBJU0FQTlAKKwlkZXBlbmRzIG9uIFNORCAmJiBQTlAgJiYgSVNBCisJc2VsZWN0IElTQVBOUAogCXNlbGVjdCBTTkRfT1BMM19MSUIKIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCiAJc2VsZWN0IFNORF9QQ00KQEAgLTgwLDcgKzgxLDggQEAKIAogY29uZmlnIFNORF9FUzk2OAogCXRyaXN0YXRlICJHZW5lcmljIEVTUyBFUzk2OCBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkQgJiYgSVNBUE5QCisJZGVwZW5kcyBvbiBTTkQgJiYgUE5QICYmIElTQQorCXNlbGVjdCBJU0FQTlAKIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCkBAIC0xNjAsNyArMTYyLDcgQEAKIAogY29uZmlnIFNORF9JTlRFUldBVkUKIAl0cmlzdGF0ZSAiQU1EIEludGVyV2F2ZSwgR3JhdmlzIFVsdHJhU291bmQgUG5QIgotCWRlcGVuZHMgb24gU05ECisJZGVwZW5kcyBvbiBTTkQgJiYgUE5QICYmIElTQQogCXNlbGVjdCBTTkRfUkFXTUlESQogCXNlbGVjdCBTTkRfQ1M0MjMxX0xJQgogCXNlbGVjdCBTTkRfR1VTX1NZTlRICkBAIC0xNzUsNyArMTc3LDcgQEAKIAogY29uZmlnIFNORF9JTlRFUldBVkVfU1RCCiAJdHJpc3RhdGUgIkFNRCBJbnRlcldhdmUgKyBURUE2MzMwVCAoVWx0cmFTb3VuZCAzMi1Qcm8pIgotCWRlcGVuZHMgb24gU05ECisJZGVwZW5kcyBvbiBTTkQgJiYgUE5QICYmIElTQQogCXNlbGVjdCBTTkRfUkFXTUlESQogCXNlbGVjdCBTTkRfQ1M0MjMxX0xJQgogCXNlbGVjdCBTTkRfR1VTX1NZTlRICkBAIC0yOTEsNyArMjkzLDggQEAKIAogY29uZmlnIFNORF9BTFMxMDAKIAl0cmlzdGF0ZSAiQXZhbmNlIExvZ2ljIEFMUzEwMC9BTFMxMjAiCi0JZGVwZW5kcyBvbiBTTkQgJiYgSVNBUE5QCisJZGVwZW5kcyBvbiBTTkQgJiYgUE5QICYmIElTQQorCXNlbGVjdCBJU0FQTlAKIAlzZWxlY3QgU05EX09QTDNfTElCCiAJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAogCXNlbGVjdCBTTkRfUENNCkBAIC0zMDQsNyArMzA3LDggQEAKIAogY29uZmlnIFNORF9BWlQyMzIwCiAJdHJpc3RhdGUgIkF6dGVjaCBTeXN0ZW1zIEFaVDIzMjAiCi0JZGVwZW5kcyBvbiBTTkQgJiYgSVNBUE5QCisJZGVwZW5kcyBvbiBTTkQgJiYgUE5QICYmIElTQQorCXNlbGVjdCBJU0FQTlAKIAlzZWxlY3QgU05EX09QTDNfTElCCiAJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAogCXNlbGVjdCBTTkRfQ1M0MjMxX0xJQgpAQCAtMzI4LDcgKzMzMiw4IEBACiAKIGNvbmZpZyBTTkRfRFQwMTlYCiAJdHJpc3RhdGUgIkRpYW1vbmQgVGVjaG5vbG9naWVzIERULTAxOVgsIEF2YW5jZSBMb2dpYyBBTFMtMDA3IgotCWRlcGVuZHMgb24gU05EICYmIElTQVBOUAorCWRlcGVuZHMgb24gU05EICYmIFBOUCAmJiBJU0EKKwlzZWxlY3QgSVNBUE5QCiAJc2VsZWN0IFNORF9PUEwzX0xJQgogCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKIAlzZWxlY3QgU05EX1BDTQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jIGIvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jCmluZGV4IDU2MzI5NmQuLjBlYjQ0MmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYworKysgYi9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhLmMKQEAgLTUzLDYgKzUzLDcgQEAKIHN0YXRpYyBpbnQgbXB1X2lycVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lSUTsJLyogUG5wIHNldHVwICovCiBzdGF0aWMgaW50IGRtYTFbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9ETUE7CS8qIFBuUCBzZXR1cCAqLwogc3RhdGljIGludCBkbWEyW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRE1BOwkvKiBQblAgc2V0dXAgKi8KK3N0YXRpYyBpbnQgY2xvY2tmcmVxW1NORFJWX0NBUkRTXTsKIAogbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBhZDE4MTZhIGJhc2VkIHNvdW5kY2FyZC4iKTsKQEAgLTc0LDYgKzc1LDggQEAKIE1PRFVMRV9QQVJNX0RFU0MoZG1hMSwgIjFzdCBETUEgIyBmb3IgYWQxODE2YSBkcml2ZXIuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoZG1hMiwgaW50LCBOVUxMLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZG1hMiwgIjJuZCBETUEgIyBmb3IgYWQxODE2YSBkcml2ZXIuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoY2xvY2tmcmVxLCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhjbG9ja2ZyZXEsICJDbG9jayBmcmVxdWVuY3kgZm9yIGFkMTgxNmEgZHJpdmVyIChkZWZhdWx0ID0gMCkuIik7CiAKIHN0cnVjdCBzbmRfY2FyZF9hZDE4MTZhIHsKIAlzdHJ1Y3QgcG5wX2RldiAqZGV2OwpAQCAtMjA5LDYgKzIxMiw4IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnJvcjsKIAl9CisJaWYgKGNsb2NrZnJlcVtkZXZdID49IDUwMDAgJiYgY2xvY2tmcmVxW2Rldl0gPD0gMTAwMDAwKQorCQljaGlwLT5jbG9ja19mcmVxID0gY2xvY2tmcmVxW2Rldl07CiAKIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiQUQxODE2QSIpOwogCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJBREkgU291bmRQb3J0IEFEMTgxNkEiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmFfbGliLmMgYi9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhX2xpYi5jCmluZGV4IDYyNWIyZWZmLi5hZTg2MDM2IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhX2xpYi5jCisrKyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmFfbGliLmMKQEAgLTIzNCw3ICsyMzQsNyBAQAogCWFkMTgxNmFfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBzaXplLCByYXRlOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKIApAQCAtMjQ1LDcgKzI0NSwxMCBAQAogCXNuZF9kbWFfcHJvZ3JhbShjaGlwLT5kbWExLCBydW50aW1lLT5kbWFfYWRkciwgc2l6ZSwKIAkJCURNQV9NT0RFX1dSSVRFIHwgRE1BX0FVVE9JTklUKTsKIAotCXNuZF9hZDE4MTZhX3dyaXRlKGNoaXAsIEFEMTgxNkFfUExBWUJBQ0tfU0FNUExFX1JBVEUsIHJ1bnRpbWUtPnJhdGUpOworCXJhdGUgPSBydW50aW1lLT5yYXRlOworCWlmIChjaGlwLT5jbG9ja19mcmVxKQorCQlyYXRlID0gKHJhdGUgKiAzMzAwMCkgLyBjaGlwLT5jbG9ja19mcmVxOworCXNuZF9hZDE4MTZhX3dyaXRlKGNoaXAsIEFEMTgxNkFfUExBWUJBQ0tfU0FNUExFX1JBVEUsIHJhdGUpOwogCXNuZF9hZDE4MTZhX291dF9tYXNrKGNoaXAsIEFEMTgxNkFfUExBWUJBQ0tfQ09ORklHLAogCQlBRDE4MTZBX0ZNVF9BTEwgfCBBRDE4MTZBX0ZNVF9TVEVSRU8sCiAJCXNuZF9hZDE4MTZhX2dldF9mb3JtYXQoY2hpcCwgcnVudGltZS0+Zm9ybWF0LApAQCAtMjYzLDcgKzI2Niw3IEBACiAJYWQxODE2YV90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IHNpemUsIHJhdGU7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bG9jaywgZmxhZ3MpOwogCkBAIC0yNzQsNyArMjc3LDEwIEBACiAJc25kX2RtYV9wcm9ncmFtKGNoaXAtPmRtYTIsIHJ1bnRpbWUtPmRtYV9hZGRyLCBzaXplLAogCQkJRE1BX01PREVfUkVBRCB8IERNQV9BVVRPSU5JVCk7CiAKLQlzbmRfYWQxODE2YV93cml0ZShjaGlwLCBBRDE4MTZBX0NBUFRVUkVfU0FNUExFX1JBVEUsIHJ1bnRpbWUtPnJhdGUpOworCXJhdGUgPSBydW50aW1lLT5yYXRlOworCWlmIChjaGlwLT5jbG9ja19mcmVxKQorCQlyYXRlID0gKHJhdGUgKiAzMzAwMCkgLyBjaGlwLT5jbG9ja19mcmVxOworCXNuZF9hZDE4MTZhX3dyaXRlKGNoaXAsIEFEMTgxNkFfQ0FQVFVSRV9TQU1QTEVfUkFURSwgcmF0ZSk7CiAJc25kX2FkMTgxNmFfb3V0X21hc2soY2hpcCwgQUQxODE2QV9DQVBUVVJFX0NPTkZJRywKIAkJQUQxODE2QV9GTVRfQUxMIHwgQUQxODE2QV9GTVRfU1RFUkVPLAogCQlzbmRfYWQxODE2YV9nZXRfZm9ybWF0KGNoaXAsIHJ1bnRpbWUtPmZvcm1hdCwKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4X2xpYi5jIGIvc291bmQvaXNhL2FkMTg0OC9hZDE4NDhfbGliLmMKaW5kZXggOGZiM2RiMS4uYmM2NDJkYyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FkMTg0OC9hZDE4NDhfbGliLmMKKysrIGIvc291bmQvaXNhL2FkMTg0OC9hZDE4NDhfbGliLmMKQEAgLTExOTYsNiArMTE5Niw3IEBACiAJCQkucHV0ID0gc25kX2FkMTg0OF9wdXRfZG91YmxlLAogCQl9LAogCQlbQUQxODQ4X01JWF9DQVBUVVJFXSA9IHsKKwkJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkJLmluZm8gPSBzbmRfYWQxODQ4X2luZm9fbXV4LAogCQkJLmdldCA9IHNuZF9hZDE4NDhfZ2V0X211eCwKIAkJCS5wdXQgPSBzbmRfYWQxODQ4X3B1dF9tdXgsCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvY21pODMzMC5jIGIvc291bmQvaXNhL2NtaTgzMzAuYwppbmRleCA0Njc3NmNjLi4xZmNlOGI5IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvY21pODMzMC5jCisrKyBiL3NvdW5kL2lzYS9jbWk4MzMwLmMKQEAgLTE5NCw4ICsxOTQsOCBAQAogQUQxODQ4X1NJTkdMRSgiM0QgQ29udHJvbCAtIFN3aXRjaCIsIDAsIENNSTgzMzBfUk1VWDNELCA1LCAxLCAxKSwKIEFEMTg0OF9TSU5HTEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMCwgQ01JODMzMF9PVVRQVVRWT0wsIDMsIDMsIDApLAogQUQxODQ4X1NJTkdMRSgiRk0gUGxheWJhY2sgU3dpdGNoIiwgMCwgQ01JODMzMF9SRUNNVVgsIDMsIDEsIDEpLAotQUQxODQ4X1NJTkdMRSgiSUVDOTU4IElucHV0IENhcHR1cmUgU3dpdGNoIiwgMCwgQ01JODMzMF9STVVYM0QsIDcsIDEsIDEpLAotQUQxODQ4X1NJTkdMRSgiSUVDOTU4IElucHV0IFBsYXliYWNrIFN3aXRjaCIsIDAsIENNSTgzMzBfTVVURU1VWCwgNywgMSwgMSksCitBRDE4NDhfU0lOR0xFKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiSW5wdXQgIixDQVBUVVJFLFNXSVRDSCksIDAsIENNSTgzMzBfUk1VWDNELCA3LCAxLCAxKSwKK0FEMTg0OF9TSU5HTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJJbnB1dCAiLFBMQVlCQUNLLFNXSVRDSCksIDAsIENNSTgzMzBfTVVURU1VWCwgNywgMSwgMSksCiB9OwogCiAjaWZkZWYgRU5BQkxFX1NCX01JWEVSCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzMV9saWIuYyBiL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxX2xpYi5jCmluZGV4IDNlN2EyYTMuLjMxOTk5NDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxX2xpYi5jCisrKyBiL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxX2xpYi5jCkBAIC0xMzQ2LDYgKzEzNDYsOCBAQAogCWludCByZWc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKKwlpZiAoY2hpcC0+cGNtKQorCQlzbmRfcGNtX3N1c3BlbmRfYWxsKGNoaXAtPnBjbSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJZm9yIChyZWcgPSAwOyByZWcgPCAzMjsgcmVnKyspCiAJCWNoaXAtPmltYWdlW3JlZ10gPSBzbmRfY3M0MjMxX2luKGNoaXAsIHJlZyk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2d1c19pby5jIGIvc291bmQvaXNhL2d1cy9ndXNfaW8uYwppbmRleCAzMzdiMGUyLi4yM2UxYjVmMSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2d1cy9ndXNfaW8uYworKysgYi9zb3VuZC9pc2EvZ3VzL2d1c19pby5jCkBAIC0yNjksOCArMjY5LDkgQEAKIAogI2VuZGlmICAvKiAgMCAgKi8KIAotdW5zaWduZWQgaW50IHNuZF9nZjFfaV9yZWFkX2FkZHIoc25kX2d1c19jYXJkX3QgKiBndXMsCi0JCQkJIHVuc2lnbmVkIGNoYXIgcmVnLCBzaG9ydCB3XzE2Yml0KQorI2lmZGVmIENPTkZJR19TTkRfREVCVUcKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2dmMV9pX3JlYWRfYWRkcihzbmRfZ3VzX2NhcmRfdCAqIGd1cywKKwkJCQkJdW5zaWduZWQgY2hhciByZWcsIHNob3J0IHdfMTZiaXQpCiB7CiAJdW5zaWduZWQgaW50IHJlczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjgwLDYgKzI4MSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzLT5yZWdfbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXM7CiB9CisjZW5kaWYKIAogLyoKIApkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wbDNzYTIuYyBiL3NvdW5kL2lzYS9vcGwzc2EyLmMKaW5kZXggOTVjN2IzZS4uNzViZDZlYyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL29wbDNzYTIuYworKysgYi9zb3VuZC9pc2Evb3BsM3NhMi5jCkBAIC0xNDUsNiArMTQ1LDE0IEBACiAKICNpZmRlZiBDT05GSUdfUE5QCiAKK3N0YXRpYyBzdHJ1Y3QgcG5wX2RldmljZV9pZCBzbmRfb3BsM3NhMl9wbnBiaW9zaWRzW10gPSB7CisJeyAuaWQgPSAiWU1IMDAyMSIgfSwKKwl7IC5pZCA9ICJOTVgyMjEwIiB9LAkvKiBHYXRld2F5IFNvbG8gMjUwMCAqLworCXsgLmlkID0gIiIgfQkJLyogZW5kICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBucCwgc25kX29wbDNzYTJfcG5wYmlvc2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkIHNuZF9vcGwzc2EyX3BucGlkc1tdID0gewogCS8qIFlhbWFoYSBZTUY3MTlFLVMgKEdlbml1cyBTb3VuZCBNYWtlciAzRFgpICovCiAJeyAuaWQgPSAiWU1IMDAyMCIsIC5kZXZzID0geyB7ICJZTUgwMDIxIiB9IH0gfSwKQEAgLTU2OCwyMCArNTc2LDE4IEBACiAKICNpZmRlZiBDT05GSUdfUE5QCiBzdGF0aWMgaW50IF9faW5pdCBzbmRfb3BsM3NhMl9wbnAoaW50IGRldiwgb3BsM3NhMl90ICpjaGlwLAotCQkJCSAgc3RydWN0IHBucF9jYXJkX2xpbmsgKmNhcmQsCi0JCQkJICBjb25zdCBzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkICppZCkKKwkJCQkgIHN0cnVjdCBwbnBfZGV2ICpwZGV2LAorCQkJCSAgaW50IGlzYXBucCkKIHsKLQlzdHJ1Y3QgcG5wX2RldiAqcGRldjsKLQlzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogY2ZnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSksIEdGUF9LRVJORUwpOworCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiBjZmc7CiAJaW50IGVycjsKIAorCWlmICghaXNhcG5wICYmIHBucF9kZXZpY2VfaXNfaXNhcG5wKHBkZXYpKQorCQlyZXR1cm4gLUVOT0VOVDsJLyogd2UgaGF2ZSBhbm90aGVyIHByb2NlZHVyZSAtIGNhcmQgKi8KKworCWNmZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNmZykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JcGRldiA9IGNoaXAtPmRldiA9IHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKGNhcmQsIGlkLT5kZXZzWzBdLmlkLCBOVUxMKTsKLQlpZiAoY2hpcC0+ZGV2ID09IE5VTEwpIHsKLQkJa2ZyZWUoY2ZnKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CiAJLyogUG5QIGluaXRpYWxpemF0aW9uICovCiAJcG5wX2luaXRfcmVzb3VyY2VfdGFibGUoY2ZnKTsKIAlpZiAoc2JfcG9ydFtkZXZdICE9IFNORFJWX0FVVE9fUE9SVCkKQEAgLTYwMSw3ICs2MDcsNyBAQAogCWlmIChpcnFbZGV2XSAhPSBTTkRSVl9BVVRPX0lSUSkKIAkJcG5wX3Jlc291cmNlX2NoYW5nZSgmY2ZnLT5pcnFfcmVzb3VyY2VbMF0sIGlycVtkZXZdLCAxKTsKIAllcnIgPSBwbnBfbWFudWFsX2NvbmZpZ19kZXYocGRldiwgY2ZnLCAwKTsKLQlpZiAoZXJyIDwgMCkKKwlpZiAoZXJyIDwgMCAmJiBpc2FwbnApCiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIlBuUCBtYW51YWwgcmVzb3VyY2VzIGFyZSBpbnZhbGlkLCB1c2luZyBhdXRvIGNvbmZpZ1xuIik7CiAJZXJyID0gcG5wX2FjdGl2YXRlX2RldihwZGV2KTsKIAlpZiAoZXJyIDwgMCkgewpAQCAtNjE3LDEzICs2MjMsMzEgQEAKIAlkbWExW2Rldl0gPSBwbnBfZG1hKHBkZXYsIDApOwogCWRtYTJbZGV2XSA9IHBucF9kbWEocGRldiwgMSk7CiAJaXJxW2Rldl0gPSBwbnBfaXJxKHBkZXYsIDApOwotCXNuZF9wcmludGRkKCJQblAgT1BMMy1TQTogc2IgcG9ydD0weCVseCwgd3NzIHBvcnQ9MHglbHgsIGZtIHBvcnQ9MHglbHgsIG1pZGkgcG9ydD0weCVseFxuIiwKLQkJc2JfcG9ydFtkZXZdLCB3c3NfcG9ydFtkZXZdLCBmbV9wb3J0W2Rldl0sIG1pZGlfcG9ydFtkZXZdKTsKLQlzbmRfcHJpbnRkZCgiUG5QIE9QTDMtU0E6IGNvbnRyb2wgcG9ydD0weCVseCwgZG1hMT0laSwgZG1hMj0laSwgaXJxPSVpXG4iLAotCQlwb3J0W2Rldl0sIGRtYTFbZGV2XSwgZG1hMltkZXZdLCBpcnFbZGV2XSk7CisJc25kX3ByaW50ZGQoIiVzUG5QIE9QTDMtU0E6IHNiIHBvcnQ9MHglbHgsIHdzcyBwb3J0PTB4JWx4LCBmbSBwb3J0PTB4JWx4LCBtaWRpIHBvcnQ9MHglbHhcbiIsCisJCXBucF9kZXZpY2VfaXNfcG5wYmlvcyhwZGV2KSA/ICJCSU9TIiA6ICJJU0EiLCBzYl9wb3J0W2Rldl0sIHdzc19wb3J0W2Rldl0sIGZtX3BvcnRbZGV2XSwgbWlkaV9wb3J0W2Rldl0pOworCXNuZF9wcmludGRkKCIlc1BuUCBPUEwzLVNBOiBjb250cm9sIHBvcnQ9MHglbHgsIGRtYTE9JWksIGRtYTI9JWksIGlycT0laVxuIiwKKwkJcG5wX2RldmljZV9pc19wbnBiaW9zKHBkZXYpID8gIkJJT1MiIDogIklTQSIsIHBvcnRbZGV2XSwgZG1hMVtkZXZdLCBkbWEyW2Rldl0sIGlycVtkZXZdKTsKIAlrZnJlZShjZmcpOworCWNoaXAtPmRldiA9IHBkZXY7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbnQgX19pbml0IHNuZF9vcGwzc2EyX2NwbnAoaW50IGRldiwgb3BsM3NhMl90ICpjaGlwLAorCQkJCSAgIHN0cnVjdCBwbnBfY2FyZF9saW5rICpjYXJkLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBwbnBfZGV2ICpwZGV2OworCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiBjZmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWNmZykKKwkJcmV0dXJuIC1FTk9NRU07CisJcGRldiA9IHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKGNhcmQsIGlkLT5kZXZzWzBdLmlkLCBOVUxMKTsKKwlpZiAocGRldiA9PSBOVUxMKSB7CisJCWtmcmVlKGNmZyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJldHVybiBzbmRfb3BsM3NhMl9wbnAoZGV2LCBjaGlwLCBwZGV2LCAxKTsKK30KICNlbmRpZiAvKiBDT05GSUdfUE5QICovCiAKIHN0YXRpYyBpbnQgc25kX29wbDNzYTJfZnJlZShvcGwzc2EyX3QgKmNoaXApCkBAIC02NDUsNiArNjY5LDcgQEAKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgc25kX29wbDNzYTJfcHJvYmUoaW50IGRldiwKKwkJCQkgICAgICAgc3RydWN0IHBucF9kZXYgKnBkZXYsCiAJCQkJICAgICAgIHN0cnVjdCBwbnBfY2FyZF9saW5rICpwY2FyZCwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBucF9jYXJkX2RldmljZV9pZCAqcGlkKQogewpAQCAtNjk1LDggKzcyMCwxMyBAQAogCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKSkgPCAwKQogCQlnb3RvIF9fZXJyb3I7CiAjaWZkZWYgQ09ORklHX1BOUAotCWlmIChpc2FwbnBbZGV2XSkgewotCQlpZiAoKGVyciA9IHNuZF9vcGwzc2EyX3BucChkZXYsIGNoaXAsIHBjYXJkLCBwaWQpKSA8IDApCisJaWYgKHBkZXYpIHsKKwkJaWYgKChlcnIgPSBzbmRfb3BsM3NhMl9wbnAoZGV2LCBjaGlwLCBwZGV2LCAwKSkgPCAwKQorCQkJZ290byBfX2Vycm9yOworCQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOworCX0KKwlpZiAocGNhcmQpIHsKKwkJaWYgKChlcnIgPSBzbmRfb3BsM3NhMl9jcG5wKGRldiwgY2hpcCwgcGNhcmQsIHBpZCkpIDwgMCkKIAkJCWdvdG8gX19lcnJvcjsKIAkJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAJfQpAQCAtNzY4LDcgKzc5OCw5IEBACiAJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKQogCQlnb3RvIF9fZXJyb3I7CiAKLQlpZiAocGNhcmQpCisJaWYgKHBkZXYpCisJCXBucF9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKwllbHNlIGlmIChwY2FyZCkKIAkJcG5wX3NldF9jYXJkX2RydmRhdGEocGNhcmQsIGNhcmQpOwogCWVsc2UKIAkJc25kX29wbDNzYTJfbGVnYWN5W2Rldl0gPSBjYXJkOwpAQCAtNzgwLDggKzgxMiw4IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE5QCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfb3BsM3NhMl9wbnBfZGV0ZWN0KHN0cnVjdCBwbnBfY2FyZF9saW5rICpjYXJkLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IHBucF9jYXJkX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfb3BsM3NhMl9wbnBfZGV0ZWN0KHN0cnVjdCBwbnBfZGV2ICpwZGV2LAorCQkJCQkgICAgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmlkKQogewogICAgICAgICBzdGF0aWMgaW50IGRldjsKICAgICAgICAgaW50IHJlczsKQEAgLTc4OSw3ICs4MjEsNyBAQAogICAgICAgICBmb3IgKCA7IGRldiA8IFNORFJWX0NBUkRTOyBkZXYrKykgewogICAgICAgICAgICAgICAgIGlmICghZW5hYmxlW2Rldl0gfHwgIWlzYXBucFtkZXZdKQogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgcmVzID0gc25kX29wbDNzYTJfcHJvYmUoZGV2LCBjYXJkLCBpZCk7CisgICAgICAgICAgICAgICAgcmVzID0gc25kX29wbDNzYTJfcHJvYmUoZGV2LCBwZGV2LCBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgICAgICBpZiAocmVzIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgICAgICAgZGV2Kys7CkBAIC03OTgsNyArODMwLDQwIEBACiAgICAgICAgIHJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgc25kX29wbDNzYTJfcG5wX3JlbW92ZShzdHJ1Y3QgcG5wX2NhcmRfbGluayAqIHBjYXJkKQorc3RhdGljIHZvaWQgX19kZXZleGl0IHNuZF9vcGwzc2EyX3BucF9yZW1vdmUoc3RydWN0IHBucF9kZXYgKiBwZGV2KQoreworCXNuZF9jYXJkX3QgKmNhcmQgPSAoc25kX2NhcmRfdCAqKSBwbnBfZ2V0X2RydmRhdGEocGRldik7CisgICAgICAgIAorCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJc25kX2NhcmRfZnJlZV9pbl90aHJlYWQoY2FyZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG5wX2RyaXZlciBvcGwzc2EyX3BucF9kcml2ZXIgPSB7CisJLm5hbWUgPSAib3BsM3NhMi1wbnBiaW9zIiwKKwkuaWRfdGFibGUgPSBzbmRfb3BsM3NhMl9wbnBiaW9zaWRzLAorCS5wcm9iZSA9IHNuZF9vcGwzc2EyX3BucF9kZXRlY3QsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9vcGwzc2EyX3BucF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX29wbDNzYTJfcG5wX2NkZXRlY3Qoc3RydWN0IHBucF9jYXJkX2xpbmsgKmNhcmQsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IHBucF9jYXJkX2RldmljZV9pZCAqaWQpCit7CisgICAgICAgIHN0YXRpYyBpbnQgZGV2OworICAgICAgICBpbnQgcmVzOworCisgICAgICAgIGZvciAoIDsgZGV2IDwgU05EUlZfQ0FSRFM7IGRldisrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFlbmFibGVbZGV2XSB8fCAhaXNhcG5wW2Rldl0pCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICByZXMgPSBzbmRfb3BsM3NhMl9wcm9iZShkZXYsIE5VTEwsIGNhcmQsIGlkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgZGV2Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbmRfb3BsM3NhMl9wbnBfY3JlbW92ZShzdHJ1Y3QgcG5wX2NhcmRfbGluayAqIHBjYXJkKQogewogCXNuZF9jYXJkX3QgKmNhcmQgPSAoc25kX2NhcmRfdCAqKSBwbnBfZ2V0X2NhcmRfZHJ2ZGF0YShwY2FyZCk7CiAgICAgICAgIApAQCAtODEwLDggKzg3NSw4IEBACiAJLmZsYWdzID0gUE5QX0RSSVZFUl9SRVNfRElTQUJMRSwKIAkubmFtZSA9ICJvcGwzc2EyIiwKIAkuaWRfdGFibGUgPSBzbmRfb3BsM3NhMl9wbnBpZHMsCi0JLnByb2JlID0gc25kX29wbDNzYTJfcG5wX2RldGVjdCwKLQkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX29wbDNzYTJfcG5wX3JlbW92ZSksCisJLnByb2JlID0gc25kX29wbDNzYTJfcG5wX2NkZXRlY3QsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9vcGwzc2EyX3BucF9jcmVtb3ZlKSwKIH07CiAjZW5kaWYgLyogQ09ORklHX1BOUCAqLwogCkBAIC04MjYsMTAgKzg5MSwxMSBAQAogCQlpZiAoaXNhcG5wW2Rldl0pCiAJCQljb250aW51ZTsKICNlbmRpZgotCQlpZiAoc25kX29wbDNzYTJfcHJvYmUoZGV2LCBOVUxMLCBOVUxMKSA+PSAwKQorCQlpZiAoc25kX29wbDNzYTJfcHJvYmUoZGV2LCBOVUxMLCBOVUxMLCBOVUxMKSA+PSAwKQogCQkJY2FyZHMrKzsKIAl9CiAjaWZkZWYgQ09ORklHX1BOUAorCWNhcmRzICs9IHBucF9yZWdpc3Rlcl9kcml2ZXIoJm9wbDNzYTJfcG5wX2RyaXZlcik7CiAJY2FyZHMgKz0gcG5wX3JlZ2lzdGVyX2NhcmRfZHJpdmVyKCZvcGwzc2EyX3BucGNfZHJpdmVyKTsKICNlbmRpZgogCWlmICghY2FyZHMpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjE2X2NzcC5jIGIvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMKaW5kZXggYjYyOTIwZS4uZDY0NzkwYiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMKKysrIGIvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMKQEAgLTQyLDggKzQyLDYgQEAKICNlbHNlCiAjZGVmaW5lIENTUF9IRFJfVkFMVUUoYSxiLGMsZCkJKChkKSB8ICgoYyk8PDgpIHwgKChiKTw8MTYpIHwgKChhKTw8MjQpKQogI2VuZGlmCi0jZGVmaW5lIExFX1NIT1JUKHYpCQlsZTE2X3RvX2NwdSh2KQotI2RlZmluZSBMRV9JTlQodikJCWxlMzJfdG9fY3B1KHYpCiAKICNkZWZpbmUgUklGRl9IRUFERVIJQ1NQX0hEUl9WQUxVRSgnUicsICdJJywgJ0YnLCAnRicpCiAjZGVmaW5lIENTUF9fSEVBREVSCUNTUF9IRFJfVkFMVUUoJ0MnLCAnUycsICdQJywgJyAnKQpAQCAtNTYsMjAgKzU0LDIwIEBACiAvKgogICogUklGRiBkYXRhIGZvcm1hdAogICovCi10eXBlZGVmIHN0cnVjdCByaWZmX2hlYWRlciB7CitzdHJ1Y3QgcmlmZl9oZWFkZXIgewogCV9fdTMyIG5hbWU7CiAJX191MzIgbGVuOwotfSByaWZmX2hlYWRlcl90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZGVzY19oZWFkZXIgewotCXJpZmZfaGVhZGVyX3QgaW5mbzsKK3N0cnVjdCBkZXNjX2hlYWRlciB7CisJc3RydWN0IHJpZmZfaGVhZGVyIGluZm87CiAJX191MTYgZnVuY19ucjsKIAlfX3UxNiBWT0NfdHlwZTsKIAlfX3UxNiBmbGFnc19wbGF5X3JlYzsKIAlfX3UxNiBmbGFnc18xNmJpdF84Yml0OwogCV9fdTE2IGZsYWdzX3N0ZXJlb19tb25vOwogCV9fdTE2IGZsYWdzX3JhdGVzOwotfSBkZXNjX2hlYWRlcl90OworfTsKIAogLyoKICAqIHByb3RvdHlwZXMKQEAgLTMwMiw5ICszMDAsOSBAQAogCXVuc2lnbmVkIGNoYXIgX191c2VyICpkYXRhX2VuZDsKIAl1bnNpZ25lZCBzaG9ydCBmdW5jX25yID0gMDsKIAotCXJpZmZfaGVhZGVyX3QgZmlsZV9oLCBpdGVtX2gsIGNvZGVfaDsKKwlzdHJ1Y3QgcmlmZl9oZWFkZXIgZmlsZV9oLCBpdGVtX2gsIGNvZGVfaDsKIAlfX3UzMiBpdGVtX3R5cGU7Ci0JZGVzY19oZWFkZXJfdCBmdW5jZGVzY19oOworCXN0cnVjdCBkZXNjX2hlYWRlciBmdW5jZGVzY19oOwogCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyOwpAQCAtMzE2LDEyICszMTQsMTIgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmZpbGVfaCwgZGF0YV9wdHIsIHNpemVvZihmaWxlX2gpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJaWYgKChmaWxlX2gubmFtZSAhPSBSSUZGX0hFQURFUikgfHwKLQkgICAgKExFX0lOVChmaWxlX2gubGVuKSA+PSBTTkRSVl9TQl9DU1BfTUFYX01JQ1JPQ09ERV9GSUxFX1NJWkUgLSBzaXplb2YoZmlsZV9oKSkpIHsKKwkgICAgKGxlMzJfdG9fY3B1KGZpbGVfaC5sZW4pID49IFNORFJWX1NCX0NTUF9NQVhfTUlDUk9DT0RFX0ZJTEVfU0laRSAtIHNpemVvZihmaWxlX2gpKSkgewogCQlzbmRfcHJpbnRkKCIlczogSW52YWxpZCBSSUZGIGhlYWRlclxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRhdGFfcHRyICs9IHNpemVvZihmaWxlX2gpOwotCWRhdGFfZW5kID0gZGF0YV9wdHIgKyBMRV9JTlQoZmlsZV9oLmxlbik7CisJZGF0YV9lbmQgPSBkYXRhX3B0ciArIGxlMzJfdG9fY3B1KGZpbGVfaC5sZW4pOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZpdGVtX3R5cGUsIGRhdGFfcHRyLCBzaXplb2YoaXRlbV90eXBlKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMzMxLDcgKzMyOSw3IEBACiAJfQogCWRhdGFfcHRyICs9IHNpemVvZiAoaXRlbV90eXBlKTsKIAotCWZvciAoOyBkYXRhX3B0ciA8IGRhdGFfZW5kOyBkYXRhX3B0ciArPSBMRV9JTlQoaXRlbV9oLmxlbikpIHsKKwlmb3IgKDsgZGF0YV9wdHIgPCBkYXRhX2VuZDsgZGF0YV9wdHIgKz0gbGUzMl90b19jcHUoaXRlbV9oLmxlbikpIHsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZpdGVtX2gsIGRhdGFfcHRyLCBzaXplb2YoaXRlbV9oKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJZGF0YV9wdHIgKz0gc2l6ZW9mKGl0ZW1faCk7CkBAIC0zNDQsNyArMzQyLDcgQEAKIAkJY2FzZSBGVU5DX0hFQURFUjoKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmZnVuY2Rlc2NfaCwgZGF0YV9wdHIgKyBzaXplb2YoaXRlbV90eXBlKSwgc2l6ZW9mKGZ1bmNkZXNjX2gpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWZ1bmNfbnIgPSBMRV9TSE9SVChmdW5jZGVzY19oLmZ1bmNfbnIpOworCQkJZnVuY19uciA9IGxlMTZfdG9fY3B1KGZ1bmNkZXNjX2guZnVuY19ucik7CiAJCQlicmVhazsKIAkJY2FzZSBDT0RFX0hFQURFUjoKIAkJCWlmIChmdW5jX25yICE9IGluZm8uZnVuY19yZXEpCkBAIC0zNzAsMTEgKzM2OCwxMSBAQAogCQkJCWlmIChjb2RlX2gubmFtZSAhPSBJTklUX0hFQURFUikKIAkJCQkJYnJlYWs7CiAJCQkJZGF0YV9wdHIgKz0gc2l6ZW9mKGNvZGVfaCk7Ci0JCQkJZXJyID0gc25kX3NiX2NzcF9sb2FkX3VzZXIocCwgZGF0YV9wdHIsIExFX0lOVChjb2RlX2gubGVuKSwKKwkJCQllcnIgPSBzbmRfc2JfY3NwX2xvYWRfdXNlcihwLCBkYXRhX3B0ciwgbGUzMl90b19jcHUoY29kZV9oLmxlbiksCiAJCQkJCQkgICAgICBTTkRSVl9TQl9DU1BfTE9BRF9JTklUQkxPQ0spOwogCQkJCWlmIChlcnIpCiAJCQkJCXJldHVybiBlcnI7Ci0JCQkJZGF0YV9wdHIgKz0gTEVfSU5UKGNvZGVfaC5sZW4pOworCQkJCWRhdGFfcHRyICs9IGxlMzJfdG9fY3B1KGNvZGVfaC5sZW4pOwogCQkJfQogCQkJLyogbWFpbiBtaWNyb2NvZGUgYmxvY2sgKi8KIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmY29kZV9oLCBkYXRhX3B0ciwgc2l6ZW9mKGNvZGVfaCkpKQpAQCAtMzg2LDE3ICszODQsMTcgQEAKIAkJCX0KIAkJCWRhdGFfcHRyICs9IHNpemVvZihjb2RlX2gpOwogCQkJZXJyID0gc25kX3NiX2NzcF9sb2FkX3VzZXIocCwgZGF0YV9wdHIsCi0JCQkJCQkgICBMRV9JTlQoY29kZV9oLmxlbiksIDApOworCQkJCQkJICAgbGUzMl90b19jcHUoY29kZV9oLmxlbiksIDApOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOwogCiAJCQkvKiBmaWxsIGluIGNvZGVjIGhlYWRlciAqLwogCQkJc3RybGNweShwLT5jb2RlY19uYW1lLCBpbmZvLmNvZGVjX25hbWUsIHNpemVvZihwLT5jb2RlY19uYW1lKSk7CiAJCQlwLT5mdW5jX25yID0gZnVuY19ucjsKLQkJCXAtPm1vZGUgPSBMRV9TSE9SVChmdW5jZGVzY19oLmZsYWdzX3BsYXlfcmVjKTsKLQkJCXN3aXRjaCAoTEVfU0hPUlQoZnVuY2Rlc2NfaC5WT0NfdHlwZSkpIHsKKwkJCXAtPm1vZGUgPSBsZTE2X3RvX2NwdShmdW5jZGVzY19oLmZsYWdzX3BsYXlfcmVjKTsKKwkJCXN3aXRjaCAobGUxNl90b19jcHUoZnVuY2Rlc2NfaC5WT0NfdHlwZSkpIHsKIAkJCWNhc2UgMHgwMDAxOgkvKiBRU291bmQgZGVjb2RlciAqLwotCQkJCWlmIChMRV9TSE9SVChmdW5jZGVzY19oLmZsYWdzX3BsYXlfcmVjKSA9PSBTTkRSVl9TQl9DU1BfTU9ERV9EU1BfV1JJVEUpIHsKKwkJCQlpZiAobGUxNl90b19jcHUoZnVuY2Rlc2NfaC5mbGFnc19wbGF5X3JlYykgPT0gU05EUlZfU0JfQ1NQX01PREVfRFNQX1dSSVRFKSB7CiAJCQkJCWlmIChzbmRfc2JfcXNvdW5kX2J1aWxkKHApID09IDApCiAJCQkJCQkvKiBzZXQgUVNvdW5kIGZsYWcgYW5kIGNsZWFyIGFsbCBvdGhlciBtb2RlIGZsYWdzICovCiAJCQkJCQlwLT5tb2RlID0gU05EUlZfU0JfQ1NQX01PREVfUVNPVU5EOwpAQCAtNDI2LDEyICs0MjQsMTIgQEAKIAkJCQlwLT5tb2RlID0gMDsKIAkJCQlzbmRfcHJpbnRkKCIlczogVW5zdXBwb3J0ZWQgQ1NQIGNvZGVjIHR5cGU6IDB4JTA0eFxuIiwKIAkJCQkJICAgX19GVU5DVElPTl9fLAotCQkJCQkgICBMRV9TSE9SVChmdW5jZGVzY19oLlZPQ190eXBlKSk7CisJCQkJCSAgIGxlMTZfdG9fY3B1KGZ1bmNkZXNjX2guVk9DX3R5cGUpKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KLQkJCXAtPmFjY19jaGFubmVscyA9IExFX1NIT1JUKGZ1bmNkZXNjX2guZmxhZ3Nfc3RlcmVvX21vbm8pOwotCQkJcC0+YWNjX3dpZHRoID0gTEVfU0hPUlQoZnVuY2Rlc2NfaC5mbGFnc18xNmJpdF84Yml0KTsKLQkJCXAtPmFjY19yYXRlcyA9IExFX1NIT1JUKGZ1bmNkZXNjX2guZmxhZ3NfcmF0ZXMpOworCQkJcC0+YWNjX2NoYW5uZWxzID0gbGUxNl90b19jcHUoZnVuY2Rlc2NfaC5mbGFnc19zdGVyZW9fbW9ubyk7CisJCQlwLT5hY2Nfd2lkdGggPSBsZTE2X3RvX2NwdShmdW5jZGVzY19oLmZsYWdzXzE2Yml0XzhiaXQpOworCQkJcC0+YWNjX3JhdGVzID0gbGUxNl90b19jcHUoZnVuY2Rlc2NfaC5mbGFnc19yYXRlcyk7CiAKIAkJCS8qIERlY291cGxlIENTUCBmcm9tIElSUSBhbmQgRE1BUkVRIGxpbmVzICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+Y2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjE2X21haW4uYyBiL3NvdW5kL2lzYS9zYi9zYjE2X21haW4uYwppbmRleCBhNmEwZmE1Li5hOTllNjQyIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2Ivc2IxNl9tYWluLmMKKysrIGIvc291bmQvaXNhL3NiL3NiMTZfbWFpbi5jCkBAIC03MjksNyArNzI5LDcgQEAKIH0KIAogc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfc2IxNl9kbWFfY29udHJvbCA9IHsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfQ0FSRCwKIAkubmFtZSA9ICIxNi1iaXQgRE1BIEFsbG9jYXRpb24iLAogCS5pbmZvID0gc25kX3NiMTZfZG1hX2NvbnRyb2xfaW5mbywKIAkuZ2V0ID0gc25kX3NiMTZfZG1hX2NvbnRyb2xfZ2V0LApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21pZGlidWYuYyBiL3NvdW5kL29zcy9taWRpYnVmLmMKaW5kZXggYjI2NzZmYS4uNjk4MjU1NiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL21pZGlidWYuYworKysgYi9zb3VuZC9vc3MvbWlkaWJ1Zi5jCkBAIC01MCw3ICs1MCw3IEBACiBzdGF0aWMgdm9pZCBtaWRpX3BvbGwodW5zaWduZWQgbG9uZyBkdW1teSk7CiAKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHBvbGxfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihtaWRpX3BvbGwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihwb2xsX3RpbWVyLCBtaWRpX3BvbGwsIDAsIDApOwogCiBzdGF0aWMgdm9sYXRpbGUgaW50IG9wZW5fZGV2czsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvb3MuaCBiL3NvdW5kL29zcy9vcy5oCmluZGV4IGQ2Yjk2MjkuLjgwZGNlMzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9vcy5oCisrKyBiL3NvdW5kL29zcy9vcy5oCkBAIC0xOSw5ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaWZkZWYgX19hbHBoYV9fCi0jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KLSNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9za2VsZXRvbi5jIGIvc291bmQvb3NzL3NrZWxldG9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZWE3ODMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL3NrZWxldG9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqCVBDSSBzb3VuZCBza2VsZXRvbiBleGFtcGxlCi0gKgotICoJKGMpIDE5OTggUmVkIEhhdCBTb2Z0d2FyZQotICoKLSAqCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgCi0gKgl0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgCi0gKglyZWZlcmVuY2UuCi0gKgotICoJVGhpcyBleGFtcGxlIGlzIGRlc2lnbmVkIHRvIGJlIGJ1aWx0IGluIHRoZSBsaW51eC9kcml2ZXJzL3NvdW5kCi0gKglkaXJlY3RvcnkgYXMgcGFydCBvZiBhIGtlcm5lbCBidWlsZC4gVGhlIGV4YW1wbGUgaXMgbW9kdWxhciBvbmx5Ci0gKglkcm9wIG1lIGEgbm90ZSBvbmNlIHlvdSBoYXZlIGEgd29ya2luZyBtb2R1bGFyIGRyaXZlciBhbmQgd2FudAotICoJdG8gaW50ZWdyYXRlIGl0IHdpdGggdGhlIG1haW4gY29kZS4KLSAqCQktLSBBbGFuIDxhbGFuQHJlZGhhdC5jb20+Ci0gKgotICoJVGhpcyBpcyBhIGZpcnN0IGRyYWZ0LiBQbGVhc2UgcmVwb3J0IGFueSBlcnJvcnMsIGNvcnJlY3Rpb25zIG9yCi0gKglpbXByb3ZlbWVudHMgdG8gbWUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKLQotLyoKLSAqCURlZmluZSBvdXIgUENJIHZlbmRvciBJRCBoZXJlCi0gKi8KLSAKLSNpZm5kZWYgUENJX1ZFTkRPUl9NWUlERU5UCi0jZGVmaW5lIFBDSV9WRU5ET1JfTVlJREVOVAkJCTB4MTI1RAotCi0vKgotICoJUENJIGlkZW50aXR5IGZvciB0aGUgY2FyZC4KLSAqLwotIAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01ZSURFTlRfTVlDQVJEMQkJMHgxOTY5Ci0jZW5kaWYKLQotI2RlZmluZSBDQVJEX05BTUUJIkV4YW1wbGVXYXZlIDNEIFBybyBVbHRyYSBUaGluZ3lXb3RzaXQiCi0KLSNkZWZpbmUgTUFYX0NBUkRTCTgKLQotLyoKLSAqCUVhY2ggYWRkcmVzc19pbmZvIG9iamVjdCBob2xkcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9mCi0gKglvdXIgY2FyZCByZXNvdXJjZXMuIEluIHRoaXMgY2FzZSB0aGUgTVNTIGVtdWxhdGlvbiBvZiBvdXIKLSAqCWZpY3RpY2lvdXMgY2FyZC4gSXRzIHVzZWQgdG8gbWFuYWdlIGFuZCBhdHRhY2ggdGhpbmdzLgotICovCi0gCi1zdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbwltc3NfZGF0YVtNQVhfQ0FSRFNdOwotc3RhdGljIGludCAJCQljYXJkczsKLQotLyoKLSAqCUluc3RhbGwgdGhlIGFjdHVhbCBjYXJkLiBUaGlzIGlzIGFuIGV4YW1wbGUKLSAqLwotCi1zdGF0aWMgaW50IG15Y2FyZF9pbnN0YWxsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCi17Ci0JaW50IGlvYmFzZTsKLQlpbnQgbXNzYmFzZTsKLQlpbnQgbXB1YmFzZTsKLQl1OCB4OwotCXUxNiB3OwotCXUzMiB2OwotCWludCBpOwotCWludCBkbWE7Ci0KLQkvKgotCSAqCU91ciBpbWFnaW5hcnkgY29kZSBoYXMgaXRzIEkvTyBvbiBQQ0kgYWRkcmVzcyAwLCBhCi0JICoJTVNTIG9uIFBDSSBhZGRyZXNzIDEgYW5kIGFuIE1QVSBvbiBhZGRyZXNzIDIKLQkgKgotCSAqCUZvciB0aGUgZXhhbXBsZSB3ZSB3aWxsIG9ubHkgaW5pdGlhbGlzZSB0aGUgTVNTCi0JICovCi0JIAkKLQlpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKLQltc3NiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMSk7Ci0JbXB1YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDIpOwotCQotCS8qCi0JICoJUmVzZXQgdGhlIGJvYXJkCi0JICovCi0JIAotCS8qCi0JICoJV2FpdCBmb3IgY29tcGxldGlvbi4gdWRlbGF5KCkgd2FpdHMgaW4gbWljcm9zZWNvbmRzCi0JICovCi0JIAotCXVkZWxheSgxMDApOwotCQotCS8qCi0JICoJT2sgY2FyZCByZWFkeS4gQmVnaW4gc2V0dXAgcHJvcGVyLiBZb3UgbWlnaHQgZm9yIGV4YW1wbGUKLQkgKglsb2FkIHRoZSBmaXJtd2FyZSBoZXJlCi0JICovCi0JCi0JZG1hID0gY2FyZF9zcGVjaWZpY19tYWdpYyhpb2FkZHIpOwotCQotCS8qCi0JICoJVHVybiBvbiBsZWdhY3kgbW9kZSAoZXhhbXBsZSksIFRoZXJlIGFyZSBhbHNvIGJ5dGUgYW5kCi0JICoJZHdvcmQgKDMyYml0KSBQQ0kgY29uZmlndXJhdGlvbiBmdW5jdGlvbiBjYWxscwotCSAqLwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpZGV2LCAweDQwLCAmdyk7Ci0JdyY9figxPDwxNSk7CQkJLyogbGVnYWN5IGRlY29kZSBvbiAqLwotCXd8PSgxPDwxNCk7CQkJLyogUmVzZXJ2ZWQgd3JpdGUgYXMgMSBpbiB0aGlzIGNhc2UgKi8KLQl3fD0oMTw8Myl8KDE8PDEpfCgxPDwwKTsJLyogU0Igb24gLCBGTSBvbiwgTVBVIG9uICovCi0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgMHg0MCwgdyk7Ci0JCi0JLyoKLQkgKglMZXQgdGhlIHVzZXIga25vdyB3ZSBmb3VuZCBoaXMgdG95LgotCSAqLwotCSAKLQlwcmludGsoS0VSTl9JTkZPICJQcm9ncmFtbWVkICJDQVJEX05BTUUiIGF0IDB4JVggdG8gbGVnYWN5IG1vZGUuXG4iLAotCQlpb2Jhc2UpOwotCQkKLQkvKgotCSAqCU5vdyBzZXQgaXQgdXAgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXJkCi0JICovCi0JIAotCW1zc19kYXRhW2NhcmRzXS5pb19iYXNlID0gbXNzYmFzZTsKLQltc3NfZGF0YVtjYXJkc10uaXJxID0gcGNpZGV2LT5pcnE7Ci0JbXNzX2RhdGFbY2FyZHNdLmRtYSA9IGRtYTsKLQkKLQkvKgotCSAqCUNoZWNrIHRoZXJlIGlzIGFuIE1TUyBwcmVzZW50Ci0JICovCi0KLQlpZihhZDE4NDhfZGV0ZWN0KG1zc2Jhc2UsIE5VTEwsIG1zc19kYXRhW2NhcmRzXS5vc3ApPT0wKQotCQlyZXR1cm4gMDsKLQkJCi0JLyoKLQkgKglJbml0aWFsaXplIGl0Ci0JICovCi0JIAotCW1zc19kYXRhW2NhcmRzXS5zbG90c1szXSA9IGFkMTg0OF9pbml0KCJNeUNhcmQgTVNTIDE2Yml0IiwgCi0JCQltc3NiYXNlLAotCQkJbXNzX2RhdGFbY2FyZHNdLmlycSwKLQkJCW1zc19kYXRhW2NhcmRzXS5kbWEsCi0JCQltc3NfZGF0YVtjYXJkc10uZG1hLAotCQkJMCwKLQkJCTAsCi0JCQlUSElTX01PRFVMRSk7Ci0KLQljYXJkcysrOwkKLQlyZXR1cm4gMTsKLX0KLQotCi0vKgotICogCVRoaXMgbG9vcCB3YWxrcyB0aGUgUENJIGNvbmZpZ3VyYXRpb24gZGF0YWJhc2UgYW5kIGZpbmRzIHdoZXJlCi0gKgl0aGUgc291bmQgY2FyZHMgYXJlLgotICovCi0gCi1pbnQgaW5pdF9teWNhcmQodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2PU5VTEw7Ci0JaW50IGNvdW50PTA7Ci0JCQotCXdoaWxlKChwY2lkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9NWUlERU5ULCBQQ0lfREVWSUNFX0lEX01ZSURFTlRfTVlDQVJEMSwgcGNpZGV2KSkhPU5VTEwpCi0JewotCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkKLQkJCWNvbnRpbnVlOwotCQljb3VudCs9bXljYXJkX2luc3RhbGwocGNpZGV2KTsKLQkJaWYoY291bnQpCi0JCQlyZXR1cm4gMDsKLQkJaWYoY291bnQ9PU1BWF9DQVJEUykKLQkJCWJyZWFrOwotCX0KLQkKLQlpZihjb3VudD09MCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIG9yIGtlcm5lbCBsb2FkcyB0aGUgCi0gKgltb2R1bGUgaW50byBtZW1vcnkuCi0gKi8KLQotCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlpZihpbml0X215Y2FyZCgpPDApCi0JewotCQlwcmludGsoS0VSTl9FUlIgIk5vICJDQVJEX05BTUUiIGNhcmRzIGZvdW5kLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICoJVGhpcyBpcyBjYWxsZWQgd2hlbiBpdCBpcyByZW1vdmVkLiBJdCB3aWxsIG9ubHkgYmUgcmVtb3ZlZCAKLSAqCXdoZW4gaXRzIHVzZSBjb3VudCBpcyAwLgotICovCi0gCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JZm9yKGk9MDtpPCBjYXJkczsgaSsrKQotCXsKLQkJLyoKLQkJICoJRnJlZSBhdHRhY2hlZCByZXNvdXJjZXMKLQkJICovCi0JCSAKLQkJYWQxODQ4X3VubG9hZChtc3NfZGF0YVtpXS5pb19iYXNlLAotCQkJICAgICAgbXNzX2RhdGFbaV0uaXJxLAotCQkJICAgICAgbXNzX2RhdGFbaV0uZG1hLAotCQkJICAgICAgbXNzX2RhdGFbaV0uZG1hLAotCQkJICAgICAgMCk7Ci0JCS8qCi0JCSAqCUFuZCBkaXNjb25uZWN0IHRoZSBkZXZpY2UgZnJvbSB0aGUga2VybmVsCi0JCSAqLwotCQlzb3VuZF91bmxvYWRfYXVkaW9kZXZpY2UobXNzX2RhdGFbaV0uc2xvdHNbM10pOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NvdW5kY2FyZC5jIGIvc291bmQvb3NzL3NvdW5kY2FyZC5jCmluZGV4IGE2ODZiZTkuLjk1ZmE4MWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9zb3VuZGNhcmQuYworKysgYi9zb3VuZC9vc3Mvc291bmRjYXJkLmMKQEAgLTY4MSw4ICs2ODEsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzZXFfdGltZXIgPQotCQlUSU1FUl9JTklUSUFMSVpFUihkb19zZXF1ZW5jZXJfdGltZXIsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihzZXFfdGltZXIsIGRvX3NlcXVlbmNlcl90aW1lciwgMCwgMCk7CiAKIHZvaWQgcmVxdWVzdF9zb3VuZF90aW1lcihpbnQgY291bnQpCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc3lzX3RpbWVyLmMgYi9zb3VuZC9vc3Mvc3lzX3RpbWVyLmMKaW5kZXggNmFmZTI5Yi4uYzlkMDQ1MSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3N5c190aW1lci5jCisrKyBiL3NvdW5kL29zcy9zeXNfdGltZXIuYwpAQCAtMjgsOCArMjgsNyBAQAogCiBzdGF0aWMgdm9pZCAgICAgcG9sbF9kZWZfdG1yKHVuc2lnbmVkIGxvbmcgZHVtbXkpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKLQotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRlZl90bXIgPSBUSU1FUl9JTklUSUFMSVpFUihwb2xsX2RlZl90bXIsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihkZWZfdG1yLCBwb2xsX2RlZl90bXIsIDAsIDApOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogdG1yMnRpY2tzKGludCB0bXJfdmFsdWUpCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdWFydDY4NTAuYyBiL3NvdW5kL29zcy91YXJ0Njg1MC5jCmluZGV4IGJlMDBjZjEuLjc0YWU3NWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy91YXJ0Njg1MC5jCisrKyBiL3NvdW5kL29zcy91YXJ0Njg1MC5jCkBAIC03OCw4ICs3OCw3IEBACiBzdGF0aWMgdm9pZCBwb2xsX3VhcnQ2ODUwKHVuc2lnbmVkIGxvbmcgZHVtbXkpOwogCiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB1YXJ0Njg1MF90aW1lciA9Ci0JCVRJTUVSX0lOSVRJQUxJWkVSKHBvbGxfdWFydDY4NTAsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUih1YXJ0Njg1MF90aW1lciwgcG9sbF91YXJ0Njg1MCwgMCwgMCk7CiAKIHN0YXRpYyB2b2lkIHVhcnQ2ODUwX2lucHV0X2xvb3Aodm9pZCkKIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9LY29uZmlnIGIvc291bmQvcGNpL0tjb25maWcKaW5kZXggMjZiNDJiYi4uMWU0NTg5MTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9LY29uZmlnCisrKyBiL3NvdW5kL3BjaS9LY29uZmlnCkBAIC0xLDExICsxLDE1IEBACiAjIEFMU0EgUENJIGRyaXZlcnMKIAotbWVudSAiUENJIGRldmljZXMiCi0JZGVwZW5kcyBvbiBTTkQhPW4gJiYgUENJCi0KIGNvbmZpZyBTTkRfQUM5N19DT0RFQwogCXRyaXN0YXRlCiAJc2VsZWN0IFNORF9QQ00KKwlzZWxlY3QgU05EX0FDOTdfQlVTCisKK2NvbmZpZyBTTkRfQUM5N19CVVMKKwl0cmlzdGF0ZQorCittZW51ICJQQ0kgZGV2aWNlcyIKKwlkZXBlbmRzIG9uIFNORCE9biAmJiBQQ0kKIAogY29uZmlnIFNORF9BTEk1NDUxCiAJdHJpc3RhdGUgIkFMaSBNNTQ1MSBQQ0kgQXVkaW8gQ29udHJvbGxlciIKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L01ha2VmaWxlIGIvc291bmQvcGNpL2FjOTcvTWFrZWZpbGUKaW5kZXggM2MzMjIyMS4uNzdiMzQ4MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FjOTcvTWFrZWZpbGUKKysrIGIvc291bmQvcGNpL2FjOTcvTWFrZWZpbGUKQEAgLTEwLDkgKzEwLDExIEBACiBlbmRpZgogCiBzbmQtYWs0NTMxLWNvZGVjLW9ianMgOj0gYWs0NTMxX2NvZGVjLm8KK3NuZC1hYzk3LWJ1cy1vYmpzIDo9IGFjOTdfYnVzLm8KIAogIyBUb3BsZXZlbCBNb2R1bGUgRGVwZW5kZW5jeQogb2JqLSQoQ09ORklHX1NORF9BQzk3X0NPREVDKSArPSBzbmQtYWM5Ny1jb2RlYy5vCiBvYmotJChDT05GSUdfU05EX0VOUzEzNzApICs9IHNuZC1hazQ1MzEtY29kZWMubworb2JqLSQoQ09ORklHX1NORF9BQzk3X0JVUykgKz0gc25kLWFjOTctYnVzLm8KIAogb2JqLW0gOj0gJChzb3J0ICQob2JqLW0pKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvYWM5N19idXMuYyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3ZjhiOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfYnVzLmMKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpbnV4IGRyaXZlciBtb2RlbCBBQzk3IGJ1cyBpbnRlcmZhY2UKKyAqCisgKiBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqIENyZWF0ZWQ6CUphbiAxNCwgMjAwNQorICogQ29weXJpZ2h0OgkoQykgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisvKgorICogQ29kZWMgZmFtaWxpZXMgaGF2ZSBuYW1lcyBzZXBlcmF0ZWQgYnkgY29tbWFzLCBzbyB3ZSBzZWFyY2ggZm9yIGFuCisgKiBpbmRpdmlkdWFsIGNvZGVjIG5hbWUgd2l0aGluIHRoZSBmYW1pbHkgc3RyaW5nLiAKKyAqLworc3RhdGljIGludCBhYzk3X2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJcmV0dXJuIChzdHJzdHIoZGV2LT5idXNfaWQsIGRydi0+bmFtZSkgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYWM5N19idXNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkZXYtPmRyaXZlciAmJiBkZXYtPmRyaXZlci0+c3VzcGVuZCkgeworCQlyZXQgPSBkZXYtPmRyaXZlci0+c3VzcGVuZChkZXYsIHN0YXRlLCBTVVNQRU5EX0RJU0FCTEUpOworCQlpZiAocmV0ID09IDApCisJCQlyZXQgPSBkZXYtPmRyaXZlci0+c3VzcGVuZChkZXYsIHN0YXRlLCBTVVNQRU5EX1NBVkVfU1RBVEUpOworCQlpZiAocmV0ID09IDApCisJCQlyZXQgPSBkZXYtPmRyaXZlci0+c3VzcGVuZChkZXYsIHN0YXRlLCBTVVNQRU5EX1BPV0VSX0RPV04pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFjOTdfYnVzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGV2LT5kcml2ZXIgJiYgZGV2LT5kcml2ZXItPnJlc3VtZSkgeworCQlyZXQgPSBkZXYtPmRyaXZlci0+cmVzdW1lKGRldiwgUkVTVU1FX1BPV0VSX09OKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gZGV2LT5kcml2ZXItPnJlc3VtZShkZXYsIFJFU1VNRV9SRVNUT1JFX1NUQVRFKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gZGV2LT5kcml2ZXItPnJlc3VtZShkZXYsIFJFU1VNRV9FTkFCTEUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgYnVzX3R5cGUgYWM5N19idXNfdHlwZSA9IHsKKwkubmFtZQkJPSAiYWM5NyIsCisJLm1hdGNoCQk9IGFjOTdfYnVzX21hdGNoLAorCS5zdXNwZW5kCT0gYWM5N19idXNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFjOTdfYnVzX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFjOTdfYnVzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZhYzk3X2J1c190eXBlKTsKK30KKworc3Vic3lzX2luaXRjYWxsKGFjOTdfYnVzX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWM5N19idXNfZXhpdCh2b2lkKQoreworCWJ1c191bnJlZ2lzdGVyKCZhYzk3X2J1c190eXBlKTsKK30KKworbW9kdWxlX2V4aXQoYWM5N19idXNfZXhpdCk7CisKK0VYUE9SVF9TWU1CT0woYWM5N19idXNfdHlwZSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYwppbmRleCA2OTgzZWVhLi41NTAxZjQ0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCkBAIC0xNTcsNiArMTU3LDcgQEAKIHsgMHg1NDUyNDEyMywgMHhmZmZmZmZmZiwgIlRSMjg2MDIiLAkJTlVMTCwJCU5VTEwgfSwgLy8gb25seSBndWVzcyAtLWprIFtUUjI4MDIzID0gZU1pY3JvIEVNMjgwMjMgKG5ldyBDVDEyOTcpXQogeyAweDU0NTg0ZTIwLCAweGZmZmZmZmZmLCAiVExDMzIwQUQ5eEMiLAlOVUxMLAkJTlVMTCB9LAogeyAweDU2NDk0MTYxLCAweGZmZmZmZmZmLCAiVklBMTYxMkEiLAkJTlVMTCwJCU5VTEwgfSwgLy8gbW9kaWZpZWQgSUNFMTIzMiB3aXRoIFMvUERJRgoreyAweDU2NDk0MTcwLCAweGZmZmZmZmZmLCAiVklBMTYxN0EiLAkJcGF0Y2hfdnQxNjE3YSwJTlVMTCB9LCAvLyBtb2RpZmllZCBWVDE2MTYgd2l0aCBTL1BESUYKIHsgMHg1NzQ1NDMwMSwgMHhmZmZmZmZmZiwgIlc4Mzk3MUQiLAkJTlVMTCwJCU5VTEwgfSwKIHsgMHg1NzRkNGMwMCwgMHhmZmZmZmZmZiwgIldNOTcwMUEiLAkJTlVMTCwJCU5VTEwgfSwKIHsgMHg1NzRkNEMwMywgMHhmZmZmZmZmZiwgIldNOTcwMyxXTTk3MDcsV005NzA4LFdNOTcxNyIsIHBhdGNoX3dvbGZzb24wMywgTlVMTH0sCkBAIC0xMzA3LDE2ICsxMzA4LDE4IEBACiAJfQogCQogCS8qIGJ1aWxkIG1hc3RlciB0b25lIGNvbnRyb2xzICovCi0JaWYgKHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfTUFTVEVSX1RPTkUpKSB7Ci0JCWZvciAoaWR4ID0gMDsgaWR4IDwgMjsgaWR4KyspIHsKLQkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCA9IHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xzX3RvbmVbaWR4XSwgYWM5NykpKSA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWlmIChhYzk3LT5pZCA9PSBBQzk3X0lEX1lNRjc1MykgewotCQkJCWtjdGwtPnByaXZhdGVfdmFsdWUgJj0gfigweGZmIDw8IDE2KTsKLQkJCQlrY3RsLT5wcml2YXRlX3ZhbHVlIHw9IDcgPDwgMTY7CisJaWYgKCEoYWM5Ny0+ZmxhZ3MgJiBBQzk3X0hBU19OT19UT05FKSkgeworCQlpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19NQVNURVJfVE9ORSkpIHsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgMjsgaWR4KyspIHsKKwkJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwgPSBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc190b25lW2lkeF0sIGFjOTcpKSkgPCAwKQorCQkJCQlyZXR1cm4gZXJyOworCQkJCWlmIChhYzk3LT5pZCA9PSBBQzk3X0lEX1lNRjc1MykgeworCQkJCQlrY3RsLT5wcml2YXRlX3ZhbHVlICY9IH4oMHhmZiA8PCAxNik7CisJCQkJCWtjdGwtPnByaXZhdGVfdmFsdWUgfD0gNyA8PCAxNjsKKwkJCQl9CiAJCQl9CisJCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X01BU1RFUl9UT05FLCAweDBmMGYpOwogCQl9Ci0JCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfTUFTVEVSX1RPTkUsIDB4MGYwZik7CiAJfQogCQogCS8qIGJ1aWxkIFBDIFNwZWFrZXIgY29udHJvbHMgKi8KQEAgLTEzMzksMTEgKzEzNDIsMTMgQEAKIAl9CiAJCiAJLyogYnVpbGQgTUlDIGNvbnRyb2xzICovCi0JaWYgKHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfTUlDKSkgewotCQlpZiAoKGVyciA9IHNuZF9hYzk3X2NtaXhfbmV3KGNhcmQsICJNaWMgUGxheWJhY2siLCBBQzk3X01JQywgYWM5NykpIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfbWljX2Jvb3N0LCBhYzk3KSkpIDwgMCkKLQkJCXJldHVybiBlcnI7CisJaWYgKCEoYWM5Ny0+ZmxhZ3MgJiBBQzk3X0hBU19OT19NSUMpKSB7CisJCWlmIChzbmRfYWM5N190cnlfdm9sdW1lX21peChhYzk3LCBBQzk3X01JQykpIHsKKwkJCWlmICgoZXJyID0gc25kX2FjOTdfY21peF9uZXcoY2FyZCwgIk1pYyBQbGF5YmFjayIsIEFDOTdfTUlDLCBhYzk3KSkgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xzX21pY19ib29zdCwgYWM5NykpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQogCX0KIAogCS8qIGJ1aWxkIExpbmUgY29udHJvbHMgKi8KQEAgLTE0MDIsMTIgKzE0MDcsMTQgQEAKIAkJfQogCQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1BDTSwgaW5pdF92YWwpOwogCX0gZWxzZSB7Ci0JCWlmIChhYzk3LT5mbGFncyAmIEFDOTdfSEFTX05PX1BDTV9WT0wpCi0JCQllcnIgPSBzbmRfYWM5N19jbXV0ZV9uZXcoY2FyZCwgIlBDTSBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X1BDTSwgYWM5Nyk7Ci0JCWVsc2UKLQkJCWVyciA9IHNuZF9hYzk3X2NtaXhfbmV3KGNhcmQsICJQQ00gUGxheWJhY2siLCBBQzk3X1BDTSwgYWM5Nyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKKwkJaWYgKCEoYWM5Ny0+ZmxhZ3MgJiBBQzk3X0hBU19OT19TVERfUENNKSkgeworCQkJaWYgKGFjOTctPmZsYWdzICYgQUM5N19IQVNfTk9fUENNX1ZPTCkKKwkJCQllcnIgPSBzbmRfYWM5N19jbXV0ZV9uZXcoY2FyZCwgIlBDTSBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X1BDTSwgYWM5Nyk7CisJCQllbHNlCisJCQkJZXJyID0gc25kX2FjOTdfY21peF9uZXcoY2FyZCwgIlBDTSBQbGF5YmFjayIsIEFDOTdfUENNLCBhYzk3KTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KIAl9CiAKIAkvKiBidWlsZCBDYXB0dXJlIGNvbnRyb2xzICovCkBAIC0xODA3LDYgKzE4MTQsMzkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogc3RvcCBubyBkZXYgcmVsZWFzZSB3YXJuaW5nICovCitzdGF0aWMgdm9pZCBhYzk3X2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKiBkZXYpCit7Cit9CisKKy8qIHJlZ2lzdGVyIGFjOTcgY29kZWMgdG8gYnVzICovCitzdGF0aWMgaW50IHNuZF9hYzk3X2Rldl9yZWdpc3RlcihzbmRfZGV2aWNlX3QgKmRldmljZSkKK3sKKwlhYzk3X3QgKmFjOTcgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCWludCBlcnI7CisKKwlhYzk3LT5kZXYuYnVzID0gJmFjOTdfYnVzX3R5cGU7CisJYWM5Ny0+ZGV2LnBhcmVudCA9IGFjOTctPmJ1cy0+Y2FyZC0+ZGV2OworCWFjOTctPmRldi5wbGF0Zm9ybV9kYXRhID0gYWM5NzsKKwlhYzk3LT5kZXYucmVsZWFzZSA9IGFjOTdfZGV2aWNlX3JlbGVhc2U7CisJc25wcmludGYoYWM5Ny0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJjYXJkJWQtJWQiLCBhYzk3LT5idXMtPmNhcmQtPm51bWJlciwgYWM5Ny0+bnVtKTsKKwlpZiAoKGVyciA9IGRldmljZV9yZWdpc3RlcigmYWM5Ny0+ZGV2KSkgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIkNhbid0IHJlZ2lzdGVyIGFjOTcgYnVzXG4iKTsKKwkJYWM5Ny0+ZGV2LmJ1cyA9IE5VTEw7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCisvKiB1bnJlZ2lzdGVyIGFjOTcgY29kZWMgKi8KK3N0YXRpYyBpbnQgc25kX2FjOTdfZGV2X3VucmVnaXN0ZXIoc25kX2RldmljZV90ICpkZXZpY2UpCit7CisJYWM5N190ICphYzk3ID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlpZiAoYWM5Ny0+ZGV2LmJ1cykKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJmFjOTctPmRldik7CisJcmV0dXJuIHNuZF9hYzk3X2ZyZWUoYWM5Nyk7Cit9CisKIC8qIGJ1aWxkX29wcyB0byBkbyBub3RoaW5nICovCiBzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1aWxkX29wcyBudWxsX2J1aWxkX29wczsKIApAQCAtMTg0MCw2ICsxODgwLDggQEAKIAljb25zdCBhYzk3X2NvZGVjX2lkX3QgKnBpZDsKIAlzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CiAJCS5kZXZfZnJlZSA9CXNuZF9hYzk3X2Rldl9mcmVlLAorCQkuZGV2X3JlZ2lzdGVyID0Jc25kX2FjOTdfZGV2X3JlZ2lzdGVyLAorCQkuZGV2X3VucmVnaXN0ZXIgPQlzbmRfYWM5N19kZXZfdW5yZWdpc3RlciwKIAl9OwogCiAJc25kX2Fzc2VydChyYWM5NyAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CkBAIC0yNTM5LDggKzI1ODEsNiBAQAogewogCWludCByZXN1bHQ7CiAKLQlzbmRfYXNzZXJ0KHF1aXJrLCByZXR1cm4gLUVJTlZBTCk7Ci0KIAkvKiBxdWlyayBvdmVycmlkZW4/ICovCiAJaWYgKG92ZXJyaWRlICYmIHN0cmNtcChvdmVycmlkZSwgIi0xIikgJiYgc3RyY21wKG92ZXJyaWRlLCAiZGVmYXVsdCIpKSB7CiAJCXJlc3VsdCA9IGFwcGx5X3F1aXJrX3N0cihhYzk3LCBvdmVycmlkZSk7CkBAIC0yNTQ5LDYgKzI1ODksOSBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAorCWlmICghIHF1aXJrKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWZvciAoOyBxdWlyay0+c3VidmVuZG9yOyBxdWlyaysrKSB7CiAJCWlmIChxdWlyay0+c3VidmVuZG9yICE9IGFjOTctPnN1YnN5c3RlbV92ZW5kb3IpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYwppbmRleCA2NmVkYzg1Li5iNTg0MTcyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jCkBAIC0zNzAsMTQxICszNzAsMzg3IEBACiAgKiAgYWRkZWQgc3VwcG9ydCBmb3IgV005NzA1LFdNOTcwOCxXTTk3MDksV005NzEwLFdNOTcxMSxXTTk3MTIgYW5kIFdNOTcxNy4KICAqLwogCi1pbnQgcGF0Y2hfd29sZnNvbjAzKGFjOTdfdCAqIGFjOTcpCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHdtOTd4eF9zbmRfYWM5N19jb250cm9sc1tdID0geworQUM5N19ET1VCTEUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIEFDOTdfV005N1hYX0ZNSVhFUl9WT0wsIDgsIDAsIDMxLCAxKSwKK0FDOTdfU0lOR0xFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X1dNOTdYWF9GTUlYRVJfVk9MLCAxNSwgMSwgMSksCit9OworCitzdGF0aWMgaW50IHBhdGNoX3dvbGZzb25fd205NzAzX3NwZWNpZmljKGFjOTdfdCAqIGFjOTcpCiB7CiAJLyogVGhpcyBpcyBrbm93biB0byB3b3JrIGZvciB0aGUgVmlld1NvbmljIFZpZXdQYWQgMTAwMAotCSAgIFJhbmRvbHBoIEJlbnRzb24gPGJlbnRzb25AaG9sbXNqb2VuLmNvbT4gKi8KLQotCS8vIFdNOTcwMy85NzA3Lzk3MDgvOTcxNwotCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfV005N1hYX0ZNSVhFUl9WT0wsIDB4MDgwOCk7Ci0Jc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDB4ODAwMCk7CisJICogUmFuZG9scGggQmVudHNvbiA8YmVudHNvbkBob2xtc2pvZW4uY29tPgorCSAqIFdNOTcwMy85NzA3Lzk3MDgvOTcxNyAKKwkgKi8KKwlpbnQgZXJyLCBpOworCQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtOTd4eF9zbmRfYWM5N19jb250cm9scyk7IGkrKykgeworCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGFjOTctPmJ1cy0+Y2FyZCwgc25kX2FjOTdfY25ldygmd205N3h4X3NuZF9hYzk3X2NvbnRyb2xzW2ldLCBhYzk3KSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsICBBQzk3X1dNOTdYWF9GTUlYRVJfVk9MLCAweDA4MDgpOwogCXJldHVybiAwOwogfQotICAKKworc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idWlsZF9vcHMgcGF0Y2hfd29sZnNvbl93bTk3MDNfb3BzID0geworCS5idWlsZF9zcGVjaWZpYyA9IHBhdGNoX3dvbGZzb25fd205NzAzX3NwZWNpZmljLAorfTsKKworaW50IHBhdGNoX3dvbGZzb24wMyhhYzk3X3QgKiBhYzk3KQoreworCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF93b2xmc29uX3dtOTcwM19vcHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgd205NzA0X3NuZF9hYzk3X2NvbnRyb2xzW10gPSB7CitBQzk3X0RPVUJMRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgQUM5N19XTTk3WFhfRk1JWEVSX1ZPTCwgOCwgMCwgMzEsIDEpLAorQUM5N19TSU5HTEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIEFDOTdfV005N1hYX0ZNSVhFUl9WT0wsIDE1LCAxLCAxKSwKK0FDOTdfRE9VQkxFKCJSZWFyIFBsYXliYWNrIFZvbHVtZSIsIEFDOTdfV005NzA0X1JNSVhFUl9WT0wsIDgsIDAsIDMxLCAxKSwKK0FDOTdfU0lOR0xFKCJSZWFyIFBsYXliYWNrIFN3aXRjaCIsIEFDOTdfV005NzA0X1JNSVhFUl9WT0wsIDE1LCAxLCAxKSwKK0FDOTdfRE9VQkxFKCJSZWFyIERBQyBWb2x1bWUiLCBBQzk3X1dNOTcwNF9SUENNX1ZPTCwgOCwgMCwgMzEsIDEpLAorQUM5N19ET1VCTEUoIlN1cnJvdW5kIFZvbHVtZSIsIEFDOTdfU1VSUk9VTkRfTUFTVEVSLCA4LCAwLCAzMSwgMSksCit9OworCitzdGF0aWMgaW50IHBhdGNoX3dvbGZzb25fd205NzA0X3NwZWNpZmljKGFjOTdfdCAqIGFjOTcpCit7CisJaW50IGVyciwgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTk3MDRfc25kX2FjOTdfY29udHJvbHMpOyBpKyspIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChhYzk3LT5idXMtPmNhcmQsIHNuZF9hYzk3X2NuZXcoJndtOTcwNF9zbmRfYWM5N19jb250cm9sc1tpXSwgYWM5NykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwkvKiBwYXRjaCBmb3IgRFZEIG5vaXNlICovCisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19XTTk3MDRfVEVTVCwgMHgwMjAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idWlsZF9vcHMgcGF0Y2hfd29sZnNvbl93bTk3MDRfb3BzID0geworCS5idWlsZF9zcGVjaWZpYyA9IHBhdGNoX3dvbGZzb25fd205NzA0X3NwZWNpZmljLAorfTsKKwogaW50IHBhdGNoX3dvbGZzb24wNChhYzk3X3QgKiBhYzk3KQogewotCS8vIFdNOTcwNE0vOTcwNFEKLQkvLyBzZXQgZnJvbnQgYW5kIHJlYXIgbWl4ZXIgdm9sdW1lCi0Jc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19XTTk3WFhfRk1JWEVSX1ZPTCwgMHgwODA4KTsKLQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1dNOTcwNF9STUlYRVJfVk9MLCAweDA4MDgpOwotCQotCS8vIHBhdGNoIGZvciBEVkQgbm9pc2UKLQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1dNOTcwNF9URVNULCAweDAyMDApOwotIAotCS8vIGluaXQgdm9sCi0Jc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19XTTk3MDRfUlBDTV9WT0wsIDB4MDgwOCk7Ci0gCi0JLy8gc2V0IHJlYXIgc3Vycm91bmQgdm9sdW1lCi0Jc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19TVVJST1VORF9NQVNURVIsIDB4MDAwMCk7CisJLyogV005NzA0TS85NzA0USAqLworCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF93b2xmc29uX3dtOTcwNF9vcHM7CiAJcmV0dXJuIDA7CiB9Ci0gIAorCitzdGF0aWMgaW50IHBhdGNoX3dvbGZzb25fd205NzA1X3NwZWNpZmljKGFjOTdfdCAqIGFjOTcpCit7CisJaW50IGVyciwgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTk3eHhfc25kX2FjOTdfY29udHJvbHMpOyBpKyspIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChhYzk3LT5idXMtPmNhcmQsIHNuZF9hYzk3X2NuZXcoJndtOTd4eF9zbmRfYWM5N19jb250cm9sc1tpXSwgYWM5NykpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCAgMHg3MiwgMHgwODA4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idWlsZF9vcHMgcGF0Y2hfd29sZnNvbl93bTk3MDVfb3BzID0geworCS5idWlsZF9zcGVjaWZpYyA9IHBhdGNoX3dvbGZzb25fd205NzA1X3NwZWNpZmljLAorfTsKKwogaW50IHBhdGNoX3dvbGZzb24wNShhYzk3X3QgKiBhYzk3KQogewotCS8vIFdNOTcwNSwgV005NzEwCi0JLy8gc2V0IGZyb250IG1peGVyIHZvbHVtZQotCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfV005N1hYX0ZNSVhFUl9WT0wsIDB4MDgwOCk7CisJLyogV005NzA1LCBXTTk3MTAgKi8KKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfd29sZnNvbl93bTk3MDVfb3BzOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3QgY2hhciogd205NzExX2FsY19zZWxlY3RbXSA9IHsiTm9uZSIsICJMZWZ0IiwgIlJpZ2h0IiwgIlN0ZXJlbyJ9Oworc3RhdGljIGNvbnN0IGNoYXIqIHdtOTcxMV9hbGNfbWl4W10gPSB7IlN0ZXJlbyIsICJSaWdodCIsICJMZWZ0IiwgIk5vbmUifTsKK3N0YXRpYyBjb25zdCBjaGFyKiB3bTk3MTFfb3V0M19zcmNbXSA9IHsiTGVmdCIsICJWUkVGIiwgIkxlZnQgKyBSaWdodCIsICJNb25vIn07CitzdGF0aWMgY29uc3QgY2hhciogd205NzExX291dDNfbHJzcmNbXSA9IHsiTWFzdGVyIE1peCIsICJIZWFkcGhvbmUgTWl4In07CitzdGF0aWMgY29uc3QgY2hhciogd205NzExX3JlY19hZGNbXSA9IHsiU3RlcmVvIiwgIkxlZnQiLCAiUmlnaHQiLCAiTXV0ZSJ9Oworc3RhdGljIGNvbnN0IGNoYXIqIHdtOTcxMV9iYXNlW10gPSB7IkxpbmVhciBDb250cm9sIiwgIkFkYXB0aXZlIEJvb3N0In07CitzdGF0aWMgY29uc3QgY2hhciogd205NzExX3JlY19nYWluW10gPSB7IisxLjVkQiBTdGVwcyIsICIrMC43NWRCIFN0ZXBzIn07CitzdGF0aWMgY29uc3QgY2hhciogd205NzExX21pY1tdID0geyJNaWMgMSIsICJEaWZmZXJlbnRpYWwiLCAiTWljIDIiLCAiU3RlcmVvIn07CitzdGF0aWMgY29uc3QgY2hhciogd205NzExX3JlY19zZWxbXSA9IAorCXsiTWljIDEiLCAiTkMiLCAiTkMiLCAiTWFzdGVyIE1peCIsICJMaW5lIiwgIkhlYWRwaG9uZSBNaXgiLCAiUGhvbmUgTWl4IiwgIlBob25lIn07CitzdGF0aWMgY29uc3QgY2hhciogd205NzExX25nX3R5cGVbXSA9IHsiQ29uc3RhbnQgR2FpbiIsICJNdXRlIn07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWM5N19lbnVtIHdtOTcxMV9lbnVtW10gPSB7CitBQzk3X0VOVU1fU0lOR0xFKEFDOTdfUENJX1NWSUQsIDE0LCA0LCB3bTk3MTFfYWxjX3NlbGVjdCksCitBQzk3X0VOVU1fU0lOR0xFKEFDOTdfVklERU8sIDEwLCA0LCB3bTk3MTFfYWxjX21peCksCitBQzk3X0VOVU1fU0lOR0xFKEFDOTdfQVVYLCA5LCA0LCB3bTk3MTFfb3V0M19zcmMpLAorQUM5N19FTlVNX1NJTkdMRShBQzk3X0FVWCwgOCwgMiwgd205NzExX291dDNfbHJzcmMpLAorQUM5N19FTlVNX1NJTkdMRShBQzk3X1JFQ19TRUwsIDEyLCA0LCB3bTk3MTFfcmVjX2FkYyksCitBQzk3X0VOVU1fU0lOR0xFKEFDOTdfTUFTVEVSX1RPTkUsIDE1LCAyLCB3bTk3MTFfYmFzZSksCitBQzk3X0VOVU1fRE9VQkxFKEFDOTdfUkVDX0dBSU4sIDE0LCA2LCAyLCB3bTk3MTFfcmVjX2dhaW4pLAorQUM5N19FTlVNX1NJTkdMRShBQzk3X01JQywgNSwgNCwgd205NzExX21pYyksCitBQzk3X0VOVU1fRE9VQkxFKEFDOTdfUkVDX1NFTCwgOCwgMCwgOCwgd205NzExX3JlY19zZWwpLAorQUM5N19FTlVNX1NJTkdMRShBQzk3X1BDSV9TVklELCA1LCAyLCB3bTk3MTFfbmdfdHlwZSksCit9OworCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHdtOTcxMV9zbmRfYWM5N19jb250cm9sc1tdID0geworQUM5N19TSU5HTEUoIkFMQyBUYXJnZXQgVm9sdW1lIiwgQUM5N19DT0RFQ19DTEFTU19SRVYsIDEyLCAxNSwgMCksCitBQzk3X1NJTkdMRSgiQUxDIEhvbGQgVGltZSIsIEFDOTdfQ09ERUNfQ0xBU1NfUkVWLCA4LCAxNSwgMCksCitBQzk3X1NJTkdMRSgiQUxDIERlY2F5IFRpbWUiLCBBQzk3X0NPREVDX0NMQVNTX1JFViwgNCwgMTUsIDApLAorQUM5N19TSU5HTEUoIkFMQyBBdHRhY2sgVGltZSIsIEFDOTdfQ09ERUNfQ0xBU1NfUkVWLCAwLCAxNSwgMCksCitBQzk3X0VOVU0oIkFMQyBGdW5jdGlvbiIsIHdtOTcxMV9lbnVtWzBdKSwKK0FDOTdfU0lOR0xFKCJBTEMgTWF4IFZvbHVtZSIsIEFDOTdfUENJX1NWSUQsIDExLCA3LCAxKSwKK0FDOTdfU0lOR0xFKCJBTEMgWkMgVGltZW91dCIsIEFDOTdfUENJX1NWSUQsIDksIDMsIDEpLAorQUM5N19TSU5HTEUoIkFMQyBaQyBTd2l0Y2giLCBBQzk3X1BDSV9TVklELCA4LCAxLCAwKSwKK0FDOTdfU0lOR0xFKCJBTEMgTkcgU3dpdGNoIiwgQUM5N19QQ0lfU1ZJRCwgNywgMSwgMCksCitBQzk3X0VOVU0oIkFMQyBORyBUeXBlIiwgd205NzExX2VudW1bOV0pLAorQUM5N19TSU5HTEUoIkFMQyBORyBUaHJlc2hvbGQiLCBBQzk3X1BDSV9TVklELCAwLCAzMSwgMSksCisKK0FDOTdfU0lOR0xFKCJTaWRlIFRvbmUgU3dpdGNoIiwgQUM5N19WSURFTywgMTUsIDEsIDEpLAorQUM5N19TSU5HTEUoIlNpZGUgVG9uZSBWb2x1bWUiLCBBQzk3X1ZJREVPLCAxMiwgNywgMSksCitBQzk3X0VOVU0oIkFMQyBIZWFkcGhvbmUgTXV4Iiwgd205NzExX2VudW1bMV0pLAorQUM5N19TSU5HTEUoIkFMQyBIZWFkcGhvbmUgVm9sdW1lIiwgQUM5N19WSURFTywgNywgNywgMSksCisKK0FDOTdfU0lOR0xFKCJPdXQzIFN3aXRjaCIsIEFDOTdfQVVYLCAxNSwgMSwgMSksCitBQzk3X1NJTkdMRSgiT3V0MyBaQyBTd2l0Y2giLCBBQzk3X0FVWCwgNywgMSwgMSksCitBQzk3X0VOVU0oIk91dDMgTXV4Iiwgd205NzExX2VudW1bMl0pLAorQUM5N19FTlVNKCJPdXQzIExSIE11eCIsIHdtOTcxMV9lbnVtWzNdKSwKK0FDOTdfU0lOR0xFKCJPdXQzIFZvbHVtZSIsIEFDOTdfQVVYLCAwLCAzMSwgMSksCisKK0FDOTdfU0lOR0xFKCJCZWVwIHRvIEhlYWRwaG9uZSBTd2l0Y2giLCBBQzk3X1BDX0JFRVAsIDE1LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJCZWVwIHRvIEhlYWRwaG9uZSBWb2x1bWUiLCBBQzk3X1BDX0JFRVAsIDEyLCA3LCAxKSwKK0FDOTdfU0lOR0xFKCJCZWVwIHRvIFNpZGUgVG9uZSBTd2l0Y2giLCBBQzk3X1BDX0JFRVAsIDExLCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJCZWVwIHRvIFNpZGUgVG9uZSBWb2x1bWUiLCBBQzk3X1BDX0JFRVAsIDgsIDcsIDEpLAorQUM5N19TSU5HTEUoIkJlZXAgdG8gUGhvbmUgU3dpdGNoIiwgQUM5N19QQ19CRUVQLCA3LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJCZWVwIHRvIFBob25lIFZvbHVtZSIsIEFDOTdfUENfQkVFUCwgNCwgNywgMSksCisKK0FDOTdfU0lOR0xFKCJBdXggdG8gSGVhZHBob25lIFN3aXRjaCIsIEFDOTdfQ0QsIDE1LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJBdXggdG8gSGVhZHBob25lIFZvbHVtZSIsIEFDOTdfQ0QsIDEyLCA3LCAxKSwKK0FDOTdfU0lOR0xFKCJBdXggdG8gU2lkZSBUb25lIFN3aXRjaCIsIEFDOTdfQ0QsIDExLCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJBdXggdG8gU2lkZSBUb25lIFZvbHVtZSIsIEFDOTdfQ0QsIDgsIDcsIDEpLAorQUM5N19TSU5HTEUoIkF1eCB0byBQaG9uZSBTd2l0Y2giLCBBQzk3X0NELCA3LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJBdXggdG8gUGhvbmUgVm9sdW1lIiwgQUM5N19DRCwgNCwgNywgMSksCisKK0FDOTdfU0lOR0xFKCJQaG9uZSB0byBIZWFkcGhvbmUgU3dpdGNoIiwgQUM5N19QSE9ORSwgMTUsIDEsIDEpLAorQUM5N19TSU5HTEUoIlBob25lIHRvIE1hc3RlciBTd2l0Y2giLCBBQzk3X1BIT05FLCAxNCwgMSwgMSksCisKK0FDOTdfU0lOR0xFKCJMaW5lIHRvIEhlYWRwaG9uZSBTd2l0Y2giLCBBQzk3X0xJTkUsIDE1LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJMaW5lIHRvIE1hc3RlciBTd2l0Y2giLCBBQzk3X0xJTkUsIDE0LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJMaW5lIHRvIFBob25lIFN3aXRjaCIsIEFDOTdfTElORSwgMTMsIDEsIDEpLAorCitBQzk3X1NJTkdMRSgiUENNIFBsYXliYWNrIHRvIEhlYWRwaG9uZSBTd2l0Y2giLCBBQzk3X1BDTSwgMTUsIDEsIDEpLAorQUM5N19TSU5HTEUoIlBDTSBQbGF5YmFjayB0byBNYXN0ZXIgU3dpdGNoIiwgQUM5N19QQ00sIDE0LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJQQ00gUGxheWJhY2sgdG8gUGhvbmUgU3dpdGNoIiwgQUM5N19QQ00sIDEzLCAxLCAxKSwKKworQUM5N19TSU5HTEUoIkNhcHR1cmUgMjBkQiBCb29zdCBTd2l0Y2giLCBBQzk3X1JFQ19TRUwsIDE0LCAxLCAwKSwKK0FDOTdfRU5VTSgiQ2FwdHVyZSB0byBQaG9uZSBNdXgiLCB3bTk3MTFfZW51bVs0XSksCitBQzk3X1NJTkdMRSgiQ2FwdHVyZSB0byBQaG9uZSAyMGRCIEJvb3N0IFN3aXRjaCIsIEFDOTdfUkVDX1NFTCwgMTEsIDEsIDEpLAorQUM5N19FTlVNKCJDYXB0dXJlIFNlbGVjdCIsIHdtOTcxMV9lbnVtWzhdKSwKKworQUM5N19TSU5HTEUoIjNEIFVwcGVyIEN1dC1vZmYgU3dpdGNoIiwgQUM5N18zRF9DT05UUk9MLCA1LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCIzRCBMb3dlciBDdXQtb2ZmIFN3aXRjaCIsIEFDOTdfM0RfQ09OVFJPTCwgNCwgMSwgMSksCisKK0FDOTdfRU5VTSgiQmFzcyBDb250cm9sIiwgd205NzExX2VudW1bNV0pLAorQUM5N19TSU5HTEUoIkJhc3MgQ3V0LW9mZiBTd2l0Y2giLCBBQzk3X01BU1RFUl9UT05FLCAxMiwgMSwgMSksCitBQzk3X1NJTkdMRSgiVG9uZSBDdXQtb2ZmIFN3aXRjaCIsIEFDOTdfTUFTVEVSX1RPTkUsIDQsIDEsIDEpLAorQUM5N19TSU5HTEUoIlBsYXliYWNrIEF0dGVudWF0ZSAoLTZkQikgU3dpdGNoIiwgQUM5N19NQVNURVJfVE9ORSwgNiwgMSwgMCksCisKK0FDOTdfU0lOR0xFKCJBREMgU3dpdGNoIiwgQUM5N19SRUNfR0FJTiwgMTUsIDEsIDEpLAorQUM5N19FTlVNKCJDYXB0dXJlIFZvbHVtZSBTdGVwcyIsIHdtOTcxMV9lbnVtWzZdKSwKK0FDOTdfRE9VQkxFKCJDYXB0dXJlIFZvbHVtZSIsIEFDOTdfUkVDX0dBSU4sIDgsIDAsIDE1LCAxKSwKK0FDOTdfU0lOR0xFKCJDYXB0dXJlIFpDIFN3aXRjaCIsIEFDOTdfUkVDX0dBSU4sIDcsIDEsIDApLAorCitBQzk3X1NJTkdMRSgiTWljIDEgdG8gUGhvbmUgU3dpdGNoIiwgQUM5N19NSUMsIDE0LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJNaWMgMiB0byBQaG9uZSBTd2l0Y2giLCBBQzk3X01JQywgMTMsIDEsIDEpLAorQUM5N19FTlVNKCJNaWMgU2VsZWN0IFNvdXJjZSIsIHdtOTcxMV9lbnVtWzddKSwKK0FDOTdfU0lOR0xFKCJNaWMgMSBWb2x1bWUiLCBBQzk3X01JQywgOCwgMzIsIDEpLAorQUM5N19TSU5HTEUoIk1pYyAyMGRCIEJvb3N0IFN3aXRjaCIsIEFDOTdfTUlDLCA3LCAxLCAwKSwKKworQUM5N19TSU5HTEUoIk1hc3RlciBaQyBTd2l0Y2giLCBBQzk3X01BU1RFUiwgNywgMSwgMCksCitBQzk3X1NJTkdMRSgiSGVhZHBob25lIFpDIFN3aXRjaCIsIEFDOTdfSEVBRFBIT05FLCA3LCAxLCAwKSwKK0FDOTdfU0lOR0xFKCJNb25vIFpDIFN3aXRjaCIsIEFDOTdfTUFTVEVSX01PTk8sIDcsIDEsIDApLAorfTsKKworc3RhdGljIGludCBwYXRjaF93b2xmc29uX3dtOTcxMV9zcGVjaWZpYyhhYzk3X3QgKiBhYzk3KQoreworCWludCBlcnIsIGk7CisJCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod205NzExX3NuZF9hYzk3X2NvbnRyb2xzKTsgaSsrKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoYWM5Ny0+YnVzLT5jYXJkLCBzbmRfYWM5N19jbmV3KCZ3bTk3MTFfc25kX2FjOTdfY29udHJvbHNbaV0sIGFjOTcpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgIEFDOTdfQ09ERUNfQ0xBU1NfUkVWLCAweDA4MDgpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsICBBQzk3X1BDSV9TVklELCAweDA4MDgpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsICBBQzk3X1ZJREVPLCAweDA4MDgpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsICBBQzk3X0FVWCwgMHgwODA4KTsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCAgQUM5N19QQ19CRUVQLCAweDA4MDgpOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsICBBQzk3X0NELCAweDAwMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1aWxkX29wcyBwYXRjaF93b2xmc29uX3dtOTcxMV9vcHMgPSB7CisJLmJ1aWxkX3NwZWNpZmljID0gcGF0Y2hfd29sZnNvbl93bTk3MTFfc3BlY2lmaWMsCit9OworCiBpbnQgcGF0Y2hfd29sZnNvbjExKGFjOTdfdCAqIGFjOTcpCiB7Ci0JLy8gV005NzExLCBXTTk3MTIKLQkvLyBzZXQgb3V0MyB2b2x1bWUKLQlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1dNOTcxMV9PVVQzVk9MLCAweDA4MDgpOworCS8qIFdNOTcxMSwgV005NzEyICovCisJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3dvbGZzb25fd205NzExX29wczsKKworCWFjOTctPmZsYWdzIHw9IEFDOTdfSEFTX05PX1JFQ19HQUlOIHwgQUM5N19TVEVSRU9fTVVURVMgfCBBQzk3X0hBU19OT19NSUMgfAorCQlBQzk3X0hBU19OT19QQ19CRUVQIHwgQUM5N19IQVNfTk9fVklERU8gfCBBQzk3X0hBU19OT19DRDsKKwkKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIqIHdtOTcxM19taWNfbWl4ZXJbXSA9IHsiU3RlcmVvIiwgIk1pYzEiLCAiTWljMiIsICJNdXRlIn07CitzdGF0aWMgY29uc3QgY2hhciogd205NzEzX21pY19taXhlcltdID0geyJTdGVyZW8iLCAiTWljIDEiLCAiTWljIDIiLCAiTXV0ZSJ9Owogc3RhdGljIGNvbnN0IGNoYXIqIHdtOTcxM19yZWNfbXV4W10gPSB7IlN0ZXJlbyIsICJMZWZ0IiwgIlJpZ2h0IiwgIk11dGUifTsKLXN0YXRpYyBjb25zdCBjaGFyKiB3bTk3MTNfcmVjX3NyY19sW10gPSB7Ik1pYzEiLCAiTWljMiIsICJMaW5lIEwiLCAiTW9ubyBJbiIsICJIUCBNaXggTCIsICJTcGsgTWl4IiwgIk1vbm8gTWl4IiwgIlpoIn07Ci1zdGF0aWMgY29uc3QgY2hhciogd205NzEzX3JlY19zcmNfcltdID0geyJNaWMxIiwgIk1pYzIiLCAiTGluZSBSIiwgIk1vbm8gSW4iLCAiSFAgTWl4IFIiLCAiU3BrIE1peCIsICJNb25vIE1peCIsICJaaCJ9Oworc3RhdGljIGNvbnN0IGNoYXIqIHdtOTcxM19yZWNfc3JjW10gPSAKKwl7Ik1pYyAxIiwgIk1pYyAyIiwgIkxpbmUiLCAiTW9ubyBJbiIsICJIZWFkcGhvbmUgTWl4IiwgIk1hc3RlciBNaXgiLCAKKwkiTW9ubyBNaXgiLCAiWmgifTsKK3N0YXRpYyBjb25zdCBjaGFyKiB3bTk3MTNfcmVjX2dhaW5bXSA9IHsiKzEuNWRCIFN0ZXBzIiwgIiswLjc1ZEIgU3RlcHMifTsKK3N0YXRpYyBjb25zdCBjaGFyKiB3bTk3MTNfYWxjX3NlbGVjdFtdID0geyJOb25lIiwgIkxlZnQiLCAiUmlnaHQiLCAiU3RlcmVvIn07CitzdGF0aWMgY29uc3QgY2hhciogd205NzEzX21vbm9fcGdhW10gPSB7IlZtaWQiLCAiWmgiLCAiTW9ubyBNaXgiLCAiSW52IDEifTsKK3N0YXRpYyBjb25zdCBjaGFyKiB3bTk3MTNfc3BrX3BnYVtdID0gCisJeyJWbWlkIiwgIlpoIiwgIkhlYWRwaG9uZSBNaXgiLCAiTWFzdGVyIE1peCIsICJJbnYiLCAiTkMiLCAiTkMiLCAiTkMifTsKK3N0YXRpYyBjb25zdCBjaGFyKiB3bTk3MTNfaHBfcGdhW10gPSB7IlZtaWQiLCAiWmgiLCAiSGVhZHBob25lIE1peCIsICJOQyJ9Oworc3RhdGljIGNvbnN0IGNoYXIqIHdtOTcxM19vdXQzX3BnYVtdID0geyJWbWlkIiwgIlpoIiwgIkludiAxIiwgIk5DIn07CitzdGF0aWMgY29uc3QgY2hhciogd205NzEzX291dDRfcGdhW10gPSB7IlZtaWQiLCAiWmgiLCAiSW52IDIiLCAiTkMifTsKK3N0YXRpYyBjb25zdCBjaGFyKiB3bTk3MTNfZGFjX2ludltdID0gCisJeyJPZmYiLCAiTW9ubyBNaXgiLCAiTWFzdGVyIE1peCIsICJIZWFkcGhvbmUgTWl4IEwiLCAiSGVhZHBob25lIE1peCBSIiwgCisJIkhlYWRwaG9uZSBNaXggTW9ubyIsICJOQyIsICJWbWlkIn07CitzdGF0aWMgY29uc3QgY2hhciogd205NzEzX2Jhc2VbXSA9IHsiTGluZWFyIENvbnRyb2wiLCAiQWRhcHRpdmUgQm9vc3QifTsKK3N0YXRpYyBjb25zdCBjaGFyKiB3bTk3MTNfbmdfdHlwZVtdID0geyJDb25zdGFudCBHYWluIiwgIk11dGUifTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhYzk3X2VudW0gd205NzEzX2VudW1bXSA9IHsKIEFDOTdfRU5VTV9TSU5HTEUoQUM5N19MSU5FLCAzLCA0LCB3bTk3MTNfbWljX21peGVyKSwKIEFDOTdfRU5VTV9TSU5HTEUoQUM5N19WSURFTywgMTQsIDQsIHdtOTcxM19yZWNfbXV4KSwKIEFDOTdfRU5VTV9TSU5HTEUoQUM5N19WSURFTywgOSwgNCwgd205NzEzX3JlY19tdXgpLAotQUM5N19FTlVNX1NJTkdMRShBQzk3X1ZJREVPLCAzLCA4LCB3bTk3MTNfcmVjX3NyY19sKSwKLUFDOTdfRU5VTV9TSU5HTEUoQUM5N19WSURFTywgMCwgOCwgd205NzEzX3JlY19zcmNfciksCitBQzk3X0VOVU1fRE9VQkxFKEFDOTdfVklERU8sIDMsIDAsIDgsIHdtOTcxM19yZWNfc3JjKSwKK0FDOTdfRU5VTV9ET1VCTEUoQUM5N19DRCwgMTQsIDYsIDIsIHdtOTcxM19yZWNfZ2FpbiksCitBQzk3X0VOVU1fU0lOR0xFKEFDOTdfUENJX1NWSUQsIDE0LCA0LCB3bTk3MTNfYWxjX3NlbGVjdCksCitBQzk3X0VOVU1fU0lOR0xFKEFDOTdfUkVDX0dBSU4sIDE0LCA0LCB3bTk3MTNfbW9ub19wZ2EpLAorQUM5N19FTlVNX0RPVUJMRShBQzk3X1JFQ19HQUlOLCAxMSwgOCwgOCwgd205NzEzX3Nwa19wZ2EpLAorQUM5N19FTlVNX0RPVUJMRShBQzk3X1JFQ19HQUlOLCA2LCA0LCA0LCB3bTk3MTNfaHBfcGdhKSwKK0FDOTdfRU5VTV9TSU5HTEUoQUM5N19SRUNfR0FJTiwgMiwgNCwgd205NzEzX291dDNfcGdhKSwKK0FDOTdfRU5VTV9TSU5HTEUoQUM5N19SRUNfR0FJTiwgMCwgNCwgd205NzEzX291dDRfcGdhKSwKK0FDOTdfRU5VTV9ET1VCTEUoQUM5N19SRUNfR0FJTl9NSUMsIDEzLCAxMCwgOCwgd205NzEzX2RhY19pbnYpLAorQUM5N19FTlVNX1NJTkdMRShBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTUsIDIsIHdtOTcxM19iYXNlKSwKK0FDOTdfRU5VTV9TSU5HTEUoQUM5N19QQ0lfU1ZJRCwgNSwgMiwgd205NzEzX25nX3R5cGUpLAogfTsKIAotc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCB3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX2xpbmVfaW5bXSA9IHsKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgd20xM19zbmRfYWM5N19jb250cm9sc1tdID0gewogQUM5N19ET1VCTEUoIkxpbmUgSW4gVm9sdW1lIiwgQUM5N19QQ19CRUVQLCA4LCAwLCAzMSwgMSksCi1BQzk3X1NJTkdMRSgiTGluZSBJbiB0byBIZWFkcGhvbmUgTXV0ZSIsIEFDOTdfUENfQkVFUCwgMTUsIDEsIDEpLAotQUM5N19TSU5HTEUoIkxpbmUgSW4gdG8gU3BlYWtlciBNdXRlIiwgQUM5N19QQ19CRUVQLCAxNCwgMSwgMSksCi1BQzk3X1NJTkdMRSgiTGluZSBJbiB0byBNb25vIE11dGUiLCBBQzk3X1BDX0JFRVAsIDEzLCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJMaW5lIEluIHRvIEhlYWRwaG9uZSBTd2l0Y2giLCBBQzk3X1BDX0JFRVAsIDE1LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJMaW5lIEluIHRvIE1hc3RlciBTd2l0Y2giLCBBQzk3X1BDX0JFRVAsIDE0LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJMaW5lIEluIHRvIE1vbm8gU3dpdGNoIiwgQUM5N19QQ19CRUVQLCAxMywgMSwgMSksCisKK0FDOTdfRE9VQkxFKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgQUM5N19QSE9ORSwgOCwgMCwgMzEsIDEpLAorQUM5N19TSU5HTEUoIlBDTSBQbGF5YmFjayB0byBIZWFkcGhvbmUgU3dpdGNoIiwgQUM5N19QSE9ORSwgMTUsIDEsIDEpLAorQUM5N19TSU5HTEUoIlBDTSBQbGF5YmFjayB0byBNYXN0ZXIgU3dpdGNoIiwgQUM5N19QSE9ORSwgMTQsIDEsIDEpLAorQUM5N19TSU5HTEUoIlBDTSBQbGF5YmFjayB0byBNb25vIFN3aXRjaCIsIEFDOTdfUEhPTkUsIDEzLCAxLCAxKSwKKworQUM5N19TSU5HTEUoIk1pYyAxIFZvbHVtZSIsIEFDOTdfTUlDLCA4LCAzMSwgMSksCitBQzk3X1NJTkdMRSgiTWljIDIgVm9sdW1lIiwgQUM5N19NSUMsIDAsIDMxLCAxKSwKK0FDOTdfU0lOR0xFKCJNaWMgMSB0byBNb25vIFN3aXRjaCIsIEFDOTdfTElORSwgNywgMSwgMSksCitBQzk3X1NJTkdMRSgiTWljIDIgdG8gTW9ubyBTd2l0Y2giLCBBQzk3X0xJTkUsIDYsIDEsIDEpLAorQUM5N19TSU5HTEUoIk1pYyBCb29zdCAoKzIwZEIpIFN3aXRjaCIsIEFDOTdfTElORSwgNSwgMSwgMCksCitBQzk3X0VOVU0oIk1pYyB0byBIZWFkcGhvbmUgTXV4Iiwgd205NzEzX2VudW1bMF0pLAorQUM5N19TSU5HTEUoIk1pYyBIZWFkcGhvbmUgTWl4ZXIgVm9sdW1lIiwgQUM5N19MSU5FLCAwLCA3LCAxKSwKKworQUM5N19TSU5HTEUoIkNhcHR1cmUgU3dpdGNoIiwgQUM5N19DRCwgMTUsIDEsIDEpLAorQUM5N19FTlVNKCJDYXB0dXJlIFZvbHVtZSBTdGVwcyIsIHdtOTcxM19lbnVtWzRdKSwKK0FDOTdfRE9VQkxFKCJDYXB0dXJlIFZvbHVtZSIsIEFDOTdfQ0QsIDgsIDAsIDE1LCAwKSwKK0FDOTdfU0lOR0xFKCJDYXB0dXJlIFpDIFN3aXRjaCIsIEFDOTdfQ0QsIDcsIDEsIDApLAorCitBQzk3X0VOVU0oIkNhcHR1cmUgdG8gSGVhZHBob25lIE11eCIsIHdtOTcxM19lbnVtWzFdKSwKK0FDOTdfU0lOR0xFKCJDYXB0dXJlIHRvIEhlYWRwaG9uZSBWb2x1bWUiLCBBQzk3X1ZJREVPLCAxMSwgNywgMSksCitBQzk3X0VOVU0oIkNhcHR1cmUgdG8gTW9ubyBNdXgiLCB3bTk3MTNfZW51bVsyXSksCitBQzk3X1NJTkdMRSgiQ2FwdHVyZSB0byBNb25vIEJvb3N0ICgrMjBkQikgU3dpdGNoIiwgQUM5N19WSURFTywgOCwgMSwgMCksCitBQzk3X1NJTkdMRSgiQ2FwdHVyZSBBREMgQm9vc3QgKCsyMGRCKSBTd2l0Y2giLCBBQzk3X1ZJREVPLCA2LCAxLCAwKSwKK0FDOTdfRU5VTSgiQ2FwdHVyZSBTZWxlY3QiLCB3bTk3MTNfZW51bVszXSksCisKK0FDOTdfU0lOR0xFKCJBTEMgVGFyZ2V0IFZvbHVtZSIsIEFDOTdfQ09ERUNfQ0xBU1NfUkVWLCAxMiwgMTUsIDApLAorQUM5N19TSU5HTEUoIkFMQyBIb2xkIFRpbWUiLCBBQzk3X0NPREVDX0NMQVNTX1JFViwgOCwgMTUsIDApLAorQUM5N19TSU5HTEUoIkFMQyBEZWNheSBUaW1lICIsIEFDOTdfQ09ERUNfQ0xBU1NfUkVWLCA0LCAxNSwgMCksCitBQzk3X1NJTkdMRSgiQUxDIEF0dGFjayBUaW1lIiwgQUM5N19DT0RFQ19DTEFTU19SRVYsIDAsIDE1LCAwKSwKK0FDOTdfRU5VTSgiQUxDIEZ1bmN0aW9uIiwgd205NzEzX2VudW1bNV0pLAorQUM5N19TSU5HTEUoIkFMQyBNYXggVm9sdW1lIiwgQUM5N19QQ0lfU1ZJRCwgMTEsIDcsIDApLAorQUM5N19TSU5HTEUoIkFMQyBaQyBUaW1lb3V0IiwgQUM5N19QQ0lfU1ZJRCwgOSwgMywgMCksCitBQzk3X1NJTkdMRSgiQUxDIFpDIFN3aXRjaCIsIEFDOTdfUENJX1NWSUQsIDgsIDEsIDApLAorQUM5N19TSU5HTEUoIkFMQyBORyBTd2l0Y2giLCBBQzk3X1BDSV9TVklELCA3LCAxLCAwKSwKK0FDOTdfRU5VTSgiQUxDIE5HIFR5cGUiLCB3bTk3MTNfZW51bVsxM10pLAorQUM5N19TSU5HTEUoIkFMQyBORyBUaHJlc2hvbGQiLCBBQzk3X1BDSV9TVklELCAwLCAzMSwgMCksCisKK0FDOTdfRE9VQkxFKCJNYXN0ZXIgWkMgU3dpdGNoIiwgQUM5N19NQVNURVIsIDE0LCA2LCAxLCAwKSwKK0FDOTdfRE9VQkxFKCJIZWFkcGhvbmUgWkMgU3dpdGNoIiwgQUM5N19IRUFEUEhPTkUsIDE0LCA2LCAxLCAwKSwKK0FDOTdfRE9VQkxFKCJPdXQzLzQgWkMgU3dpdGNoIiwgQUM5N19NQVNURVJfTU9OTywgMTQsIDYsIDEsIDApLAorQUM5N19TSU5HTEUoIk1hc3RlciBSaWdodCBTd2l0Y2giLCBBQzk3X01BU1RFUiwgNywgMSwgMSksCitBQzk3X1NJTkdMRSgiSGVhZHBob25lIFJpZ2h0IFN3aXRjaCIsIEFDOTdfSEVBRFBIT05FLCA3LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJPdXQzLzQgUmlnaHQgU3dpdGNoIiwgQUM5N19NQVNURVJfTU9OTywgNywgMSwgMSksCisKK0FDOTdfU0lOR0xFKCJNb25vIEluIHRvIEhlYWRwaG9uZSBTd2l0Y2giLCBBQzk3X01BU1RFUl9UT05FLCAxNSwgMSwgMSksCitBQzk3X1NJTkdMRSgiTW9ubyBJbiB0byBNYXN0ZXIgU3dpdGNoIiwgQUM5N19NQVNURVJfVE9ORSwgMTQsIDEsIDEpLAorQUM5N19TSU5HTEUoIk1vbm8gSW4gVm9sdW1lIiwgQUM5N19NQVNURVJfVE9ORSwgOCwgMzEsIDEpLAorQUM5N19TSU5HTEUoIk1vbm8gU3dpdGNoIiwgQUM5N19NQVNURVJfVE9ORSwgNywgMSwgMSksCitBQzk3X1NJTkdMRSgiTW9ubyBaQyBTd2l0Y2giLCBBQzk3X01BU1RFUl9UT05FLCA2LCAxLCAwKSwKK0FDOTdfU0lOR0xFKCJNb25vIFZvbHVtZSIsIEFDOTdfTUFTVEVSX1RPTkUsIDAsIDMxLCAxKSwKKworQUM5N19TSU5HTEUoIlBDIEJlZXAgdG8gSGVhZHBob25lIFN3aXRjaCIsIEFDOTdfQVVYLCAxNSwgMSwgMSksCitBQzk3X1NJTkdMRSgiUEMgQmVlcCB0byBIZWFkcGhvbmUgVm9sdW1lIiwgQUM5N19BVVgsIDEyLCA3LCAxKSwKK0FDOTdfU0lOR0xFKCJQQyBCZWVwIHRvIE1hc3RlciBTd2l0Y2giLCBBQzk3X0FVWCwgMTEsIDEsIDEpLAorQUM5N19TSU5HTEUoIlBDIEJlZXAgdG8gTWFzdGVyIFZvbHVtZSIsIEFDOTdfQVVYLCA4LCA3LCAxKSwKK0FDOTdfU0lOR0xFKCJQQyBCZWVwIHRvIE1vbm8gU3dpdGNoIiwgQUM5N19BVVgsIDcsIDEsIDEpLAorQUM5N19TSU5HTEUoIlBDIEJlZXAgdG8gTW9ubyBWb2x1bWUiLCBBQzk3X0FVWCwgNCwgNywgMSksCisKK0FDOTdfU0lOR0xFKCJWb2ljZSB0byBIZWFkcGhvbmUgU3dpdGNoIiwgQUM5N19QQ00sIDE1LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJWb2ljZSB0byBIZWFkcGhvbmUgVm9sdW1lIiwgQUM5N19QQ00sIDEyLCA3LCAxKSwKK0FDOTdfU0lOR0xFKCJWb2ljZSB0byBNYXN0ZXIgU3dpdGNoIiwgQUM5N19QQ00sIDExLCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJWb2ljZSB0byBNYXN0ZXIgVm9sdW1lIiwgQUM5N19QQ00sIDgsIDcsIDEpLAorQUM5N19TSU5HTEUoIlZvaWNlIHRvIE1vbm8gU3dpdGNoIiwgQUM5N19QQ00sIDcsIDEsIDEpLAorQUM5N19TSU5HTEUoIlZvaWNlIHRvIE1vbm8gVm9sdW1lIiwgQUM5N19QQ00sIDQsIDcsIDEpLAorCitBQzk3X1NJTkdMRSgiQXV4IHRvIEhlYWRwaG9uZSBTd2l0Y2giLCBBQzk3X1JFQ19TRUwsIDE1LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJBdXggdG8gSGVhZHBob25lIFZvbHVtZSIsIEFDOTdfUkVDX1NFTCwgMTIsIDcsIDEpLAorQUM5N19TSU5HTEUoIkF1eCB0byBNYXN0ZXIgU3dpdGNoIiwgQUM5N19SRUNfU0VMLCAxMSwgMSwgMSksCitBQzk3X1NJTkdMRSgiQXV4IHRvIE1hc3RlciBWb2x1bWUiLCBBQzk3X1JFQ19TRUwsIDgsIDcsIDEpLAorQUM5N19TSU5HTEUoIkF1eCB0byBNb25vIFN3aXRjaCIsIEFDOTdfUkVDX1NFTCwgNywgMSwgMSksCitBQzk3X1NJTkdMRSgiQXV4IHRvIE1vbm8gVm9sdW1lIiwgQUM5N19SRUNfU0VMLCA0LCA3LCAxKSwKKworQUM5N19FTlVNKCJNb25vIElucHV0IE11eCIsIHdtOTcxM19lbnVtWzZdKSwKK0FDOTdfRU5VTSgiTWFzdGVyIElucHV0IE11eCIsIHdtOTcxM19lbnVtWzddKSwKK0FDOTdfRU5VTSgiSGVhZHBob25lIElucHV0IE11eCIsIHdtOTcxM19lbnVtWzhdKSwKK0FDOTdfRU5VTSgiT3V0IDMgSW5wdXQgTXV4Iiwgd205NzEzX2VudW1bOV0pLAorQUM5N19FTlVNKCJPdXQgNCBJbnB1dCBNdXgiLCB3bTk3MTNfZW51bVsxMF0pLAorCitBQzk3X0VOVU0oIkJhc3MgQ29udHJvbCIsIHdtOTcxM19lbnVtWzEyXSksCitBQzk3X1NJTkdMRSgiQmFzcyBDdXQtb2ZmIFN3aXRjaCIsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCAxMiwgMSwgMSksCitBQzk3X1NJTkdMRSgiVG9uZSBDdXQtb2ZmIFN3aXRjaCIsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCA0LCAxLCAxKSwKK0FDOTdfU0lOR0xFKCJQbGF5YmFjayBBdHRlbnVhdGUgKC02ZEIpIFN3aXRjaCIsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCA2LCAxLCAwKSwKK0FDOTdfU0lOR0xFKCJCYXNzIFZvbHVtZSIsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCA4LCAxNSwgMSksCitBQzk3X1NJTkdMRSgiVG9uZSBWb2x1bWUiLCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMCwgMTUsIDEpLAogfTsKIAotc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCB3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX2RhY1tdID0gewotQUM5N19ET1VCTEUoIkRBQyBWb2x1bWUiLCBBQzk3X1BIT05FLCA4LCAwLCAzMSwgMSksCi1BQzk3X1NJTkdMRSgiREFDIHRvIEhlYWRwaG9uZSBNdXRlIiwgQUM5N19QSE9ORSwgMTUsIDEsIDEpLAotQUM5N19TSU5HTEUoIkRBQyB0byBTcGVha2VyIE11dGUiLCBBQzk3X1BIT05FLCAxNCwgMSwgMSksCi1BQzk3X1NJTkdMRSgiREFDIHRvIE1vbm8gTXV0ZSIsIEFDOTdfUEhPTkUsIDEzLCAxLCAxKSwKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgd20xM19zbmRfYWM5N19jb250cm9sc18zZFtdID0geworQUM5N19FTlVNKCJJbnYgSW5wdXQgTXV4Iiwgd205NzEzX2VudW1bMTFdKSwKK0FDOTdfU0lOR0xFKCIzRCBVcHBlciBDdXQtb2ZmIFN3aXRjaCIsIEFDOTdfUkVDX0dBSU5fTUlDLCA1LCAxLCAwKSwKK0FDOTdfU0lOR0xFKCIzRCBMb3dlciBDdXQtb2ZmIFN3aXRjaCIsIEFDOTdfUkVDX0dBSU5fTUlDLCA0LCAxLCAwKSwKK0FDOTdfU0lOR0xFKCIzRCBEZXB0aCIsIEFDOTdfUkVDX0dBSU5fTUlDLCAwLCAxNSwgMSksCiB9OwogCi1zdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHdtMTNfc25kX2FjOTdfY29udHJvbHNfbWljW10gPSB7Ci1BQzk3X1NJTkdMRSgiTUlDQSBWb2x1bWUiLCBBQzk3X01JQywgOCwgMzEsIDEpLAotQUM5N19TSU5HTEUoIk1JQ0IgVm9sdW1lIiwgQUM5N19NSUMsIDAsIDMxLCAxKSwKLUFDOTdfU0lOR0xFKCJNSUNBIHRvIE1vbm8gTXV0ZSIsIEFDOTdfTElORSwgNywgMSwgMSksCi1BQzk3X1NJTkdMRSgiTUlDQiB0byBNb25vIE11dGUiLCBBQzk3X0xJTkUsIDYsIDEsIDEpLAotQUM5N19TSU5HTEUoIk1JQyBCb29zdCAoKzIwZEIpIiwgQUM5N19MSU5FLCA1LCAxLCAxKSwKLUFDOTdfRU5VTSgiTUlDIEhlYWRwaG9uZSBSb3V0aW5nIiwgd205NzEzX2VudW1bMF0pLAotQUM5N19TSU5HTEUoIk1JQyBIZWFkcGhvbmUgTWl4ZXIgVm9sdW1lIiwgQUM5N19MSU5FLCAwLCA3LCAxKQotfTsKLQotc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCB3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX2FkY1tdID0gewotQUM5N19TSU5HTEUoIkFEQyBNdXRlIiwgQUM5N19DRCwgMTUsIDEsIDEpLAotQUM5N19ET1VCTEUoIkdhaW4gU3RlcCBTaXplICgxLjVkQi8wLjc1ZEIpIiwgQUM5N19DRCwgMTQsIDYsIDEsIDEpLAotQUM5N19ET1VCTEUoIkFEQyBWb2x1bWUiLEFDOTdfQ0QsIDgsIDAsIDE1LCAwKSwKLUFDOTdfU0lOR0xFKCJBREMgWmVybyBDcm9zcyIsIEFDOTdfQ0QsIDcsIDEsIDEpLAotfTsKLQotc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCB3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX3JlY3NlbFtdID0gewotQUM5N19FTlVNKCJSZWNvcmQgdG8gSGVhZHBob25lIFBhdGgiLCB3bTk3MTNfZW51bVsxXSksCi1BQzk3X1NJTkdMRSgiUmVjb3JkIHRvIEhlYWRwaG9uZSBWb2x1bWUiLCBBQzk3X1ZJREVPLCAxMSwgNywgMCksCi1BQzk3X0VOVU0oIlJlY29yZCB0byBNb25vIFBhdGgiLCB3bTk3MTNfZW51bVsyXSksCi1BQzk3X1NJTkdMRSgiUmVjb3JkIHRvIE1vbm8gQm9vc3QgKCsyMGRCKSIsIEFDOTdfVklERU8sIDgsIDEsIDApLAotQUM5N19TSU5HTEUoIlJlY29yZCBBREMgQm9vc3QgKCsyMGRCKSIsIEFDOTdfVklERU8sIDYsIDEsIDApLAotQUM5N19FTlVNKCJSZWNvcmQgU2VsZWN0IExlZnQiLCB3bTk3MTNfZW51bVszXSksCi1BQzk3X0VOVU0oIlJlY29yZCBTZWxlY3QgUmlnaHQiLCB3bTk3MTNfZW51bVs0XSksCi19Oworc3RhdGljIGludCBwYXRjaF93b2xmc29uX3dtOTcxM18zZCAoYWM5N190ICogYWM5NykKK3sKKwlpbnQgZXJyLCBpOworICAgIAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtMTNfc25kX2FjOTdfY29udHJvbHNfM2QpOyBpKyspIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChhYzk3LT5idXMtPmNhcmQsIHNuZF9hYzk3X2NuZXcoJndtMTNfc25kX2FjOTdfY29udHJvbHNfM2RbaV0sIGFjOTcpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbnQgcGF0Y2hfd29sZnNvbl93bTk3MTNfc3BlY2lmaWMoYWM5N190ICogYWM5NykKIHsKIAlpbnQgZXJyLCBpOwogCQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtMTNfc25kX2FjOTdfY29udHJvbHNfbGluZV9pbik7IGkrKykgewotCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGFjOTctPmJ1cy0+Y2FyZCwgc25kX2FjOTdfY25ldygmd20xM19zbmRfYWM5N19jb250cm9sc19saW5lX2luW2ldLCBhYzk3KSkpIDwgMCkKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTEzX3NuZF9hYzk3X2NvbnRyb2xzKTsgaSsrKSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoYWM5Ny0+YnVzLT5jYXJkLCBzbmRfYWM5N19jbmV3KCZ3bTEzX3NuZF9hYzk3X2NvbnRyb2xzW2ldLCBhYzk3KSkpIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQogCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfUENfQkVFUCwgMHgwODA4KTsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX2RhYyk7IGkrKykgewotCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGFjOTctPmJ1cy0+Y2FyZCwgc25kX2FjOTdfY25ldygmd20xM19zbmRfYWM5N19jb250cm9sc19kYWNbaV0sIGFjOTcpKSkgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9CiAJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19QSE9ORSwgMHgwODA4KTsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX21pYyk7IGkrKykgewotCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGFjOTctPmJ1cy0+Y2FyZCwgc25kX2FjOTdfY25ldygmd20xM19zbmRfYWM5N19jb250cm9sc19taWNbaV0sIGFjOTcpKSkgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9CiAJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19NSUMsIDB4MDgwOCk7CiAJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19MSU5FLCAweDAwZGEpOwotCQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtMTNfc25kX2FjOTdfY29udHJvbHNfYWRjKTsgaSsrKSB7Ci0JCWlmICgoZXJyID0gc25kX2N0bF9hZGQoYWM5Ny0+YnVzLT5jYXJkLCBzbmRfYWM5N19jbmV3KCZ3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX2FkY1tpXSwgYWM5NykpKSA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KIAlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0NELCAweDA4MDgpOwotCQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtMTNfc25kX2FjOTdfY29udHJvbHNfcmVjc2VsKTsgaSsrKSB7Ci0JCWlmICgoZXJyID0gc25kX2N0bF9hZGQoYWM5Ny0+YnVzLT5jYXJkLCBzbmRfYWM5N19jbmV3KCZ3bTEzX3NuZF9hYzk3X2NvbnRyb2xzX3JlY3NlbFtpXSwgYWM5NykpKSA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KIAlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X1ZJREVPLCAweGQ2MTIpOwogCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfUkVDX0dBSU4sIDB4MWJhMCk7Ci0JCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUyNSw2ICs3NzEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1aWxkX29wcyBwYXRjaF93b2xmc29uX3dtOTcxM19vcHMgPSB7CiAJLmJ1aWxkX3NwZWNpZmljID0gcGF0Y2hfd29sZnNvbl93bTk3MTNfc3BlY2lmaWMsCisJLmJ1aWxkXzNkID0gcGF0Y2hfd29sZnNvbl93bTk3MTNfM2QsCiAjaWZkZWYgQ09ORklHX1BNCQogCS5zdXNwZW5kID0gcGF0Y2hfd29sZnNvbl93bTk3MTNfc3VzcGVuZCwKIAkucmVzdW1lID0gcGF0Y2hfd29sZnNvbl93bTk3MTNfcmVzdW1lCkBAIC01MzMsMTAgKzc4MCwxMyBAQAogCiBpbnQgcGF0Y2hfd29sZnNvbjEzKGFjOTdfdCAqIGFjOTcpCiB7CisJLyogV005NzEzLCBXTTk3MTQgKi8KIAlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfd29sZnNvbl93bTk3MTNfb3BzOwogCiAJYWM5Ny0+ZmxhZ3MgfD0gQUM5N19IQVNfTk9fUkVDX0dBSU4gfCBBQzk3X1NURVJFT19NVVRFUyB8IEFDOTdfSEFTX05PX1BIT05FIHwKLQkJQUM5N19IQVNfTk9fUENfQkVFUCB8IEFDOTdfSEFTX05PX1ZJREVPIHwgQUM5N19IQVNfTk9fQ0Q7CisJCUFDOTdfSEFTX05PX1BDX0JFRVAgfCBBQzk3X0hBU19OT19WSURFTyB8IEFDOTdfSEFTX05PX0NEIHwgQUM5N19IQVNfTk9fVE9ORSB8CisJCUFDOTdfSEFTX05PX1NURF9QQ007CisgICAgCWFjOTctPnNjYXBzICY9IH5BQzk3X1NDQVBfTU9ERU07CiAKIAlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0VYVEVOREVEX01JRCwgMHhkYTAwKTsKIAlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0VYVEVOREVEX01TVEFUVVMsIDB4MzgxMCk7CkBAIC0xMzc5LDYgKzE2MjksNyBAQAogCXUzMiBzdWJpZCA9ICgodTMyKWFjOTctPnN1YnN5c3RlbV92ZW5kb3IgPDwgMTYpIHwgYWM5Ny0+c3Vic3lzdGVtX2RldmljZTsKIAlzd2l0Y2ggKHN1YmlkKSB7CiAJY2FzZSAweDEwM2MwODkwOiAvKiBIUCBuYzYwMDAgKi8KKwljYXNlIDB4MTAzYzA5OWM6IC8qIEhQIG54NjExMCAqLwogCWNhc2UgMHgxMDNjMDA2ZDogLyogSFAgbng5MTA1ICovCiAJY2FzZSAweDE3MzQwMDg4OiAvKiBGU0MgU2NlbmljLVcgKi8KIAkJLyogZW5hYmxlIGhlYWRwaG9uZSBqYWNrIHNlbnNlICovCkBAIC0xNzA2LDcgKzE5NTcsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19zcGRpZl9jb250cm9sc19hbGM2NTBbXSA9IHsKLSAgICAgICAgQUM5N19TSU5HTEUoIklFQzk1OCBDYXB0dXJlIFN3aXRjaCIsIEFDOTdfQUxDNjUwX01VTFRJQ0gsIDExLCAxLCAwKSwKKyAgICAgICAgQUM5N19TSU5HTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLENBUFRVUkUsU1dJVENIKSwgQUM5N19BTEM2NTBfTVVMVElDSCwgMTEsIDEsIDApLAogICAgICAgICBBQzk3X1NJTkdMRSgiQW5hbG9nIHRvIElFQzk1OCBPdXRwdXQiLCBBQzk3X0FMQzY1MF9NVUxUSUNILCAxMiwgMSwgMCksCiAJLyogZGlzYWJsZSB0aGlzIGNvbnRyb2xzIHNpbmNlIGl0IGRvZXNuJ3Qgd29yayBhcyBleHBlY3RlZCAqLwogCS8qIEFDOTdfU0lOR0xFKCJJRUM5NTggSW5wdXQgTW9uaXRvciIsIEFDOTdfQUxDNjUwX01VTFRJQ0gsIDEzLCAxLCAwKSwgKi8KQEAgLTE4NDksMTIgKzIxMDAsMTIgQEAKIH0KIAogc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19zcGRpZl9jb250cm9sc19hbGM2NTVbXSA9IHsKLSAgICAgICAgQUM5N19QQUdFX1NJTkdMRSgiSUVDOTU4IENhcHR1cmUgU3dpdGNoIiwgQUM5N19BTEM2NTBfTVVMVElDSCwgMTEsIDEsIDAsIDApLAorICAgICAgICBBQzk3X1BBR0VfU0lOR0xFKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixDQVBUVVJFLFNXSVRDSCksIEFDOTdfQUxDNjUwX01VTFRJQ0gsIDExLCAxLCAwLCAwKSwKIAkvKiBkaXNhYmxlIHRoaXMgY29udHJvbHMgc2luY2UgaXQgZG9lc24ndCB3b3JrIGFzIGV4cGVjdGVkICovCiAgICAgICAgIC8qIEFDOTdfUEFHRV9TSU5HTEUoIklFQzk1OCBJbnB1dCBNb25pdG9yIiwgQUM5N19BTEM2NTBfTVVMVElDSCwgMTQsIDEsIDAsIDApLCAqLwogCXsKIAkJLmlmYWNlICA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSAgID0gIklFQzk1OCBQbGF5YmFjayBSb3V0ZSIsCisJCS5uYW1lICAgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTk9ORSkgIlJvdXRlIiwKIAkJLmluZm8gICA9IGFsYzY1NV9pZWM5NThfcm91dGVfaW5mbywKIAkJLmdldCAgICA9IGFsYzY1NV9pZWM5NThfcm91dGVfZ2V0LAogCQkucHV0ICAgID0gYWxjNjU1X2llYzk1OF9yb3V0ZV9wdXQsCkBAIC0yNDE2LDYgKzI2NjcsMTYgQEAKIH0KIAogLyoKKyAqIFZUMTYxN0EgY29kZWMKKyAqLworaW50IHBhdGNoX3Z0MTYxN2EoYWM5N190ICogYWM5NykKK3sKKwlhYzk3LT5leHRfaWQgfD0gQUM5N19FSV9TUERJRjsJLyogZm9yY2UgdGhlIGRldGVjdGlvbiBvZiBzcGRpZiAqLworCWFjOTctPnJhdGVzW0FDOTdfUkFURVNfU1BESUZdID0gU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMDsKKwlyZXR1cm4gMDsKK30KKworLyoKICAqLwogc3RhdGljIHZvaWQgaXQyNjQ2X3VwZGF0ZV9qYWNrcyhhYzk3X3QgKmFjOTcpCiB7CkBAIC0yNDMzLDcgKzI2OTQsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWM5N19zcGRpZl9jb250cm9sc19pdDI2NDZbXSA9IHsKLQlBQzk3X1NJTkdMRSgiSUVDOTU4IENhcHR1cmUgU3dpdGNoIiwgMHg3NiwgMTEsIDEsIDApLAorCUFDOTdfU0lOR0xFKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixDQVBUVVJFLFNXSVRDSCksIDB4NzYsIDExLCAxLCAwKSwKIAlBQzk3X1NJTkdMRSgiQW5hbG9nIHRvIElFQzk1OCBPdXRwdXQiLCAweDc2LCAxMiwgMSwgMCksCiAJQUM5N19TSU5HTEUoIklFQzk1OCBJbnB1dCBNb25pdG9yIiwgMHg3NiwgMTMsIDEsIDApLAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guaCBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guaAppbmRleCA3YjczNzdkLi5lYzE4MTEzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmgKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5oCkBAIC01Niw1ICs1Niw2IEBACiBpbnQgcGF0Y2hfY205NzYxKGFjOTdfdCAqIGFjOTcpOwogaW50IHBhdGNoX2NtOTc4MChhYzk3X3QgKiBhYzk3KTsKIGludCBwYXRjaF92dDE2MTYoYWM5N190ICogYWM5Nyk7CitpbnQgcGF0Y2hfdnQxNjE3YShhYzk3X3QgKiBhYzk3KTsKIGludCBwYXRjaF9pdDI2NDYoYWM5N190ICogYWM5Nyk7CiBpbnQgbXBhdGNoX3NpMzAzNihhYzk3X3QgKiBhYzk3KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwppbmRleCBmMDhhZTcxZi4uNDk0MzI5OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCisrKyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwpAQCAtMTg0Miw3ICsxODQyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGFsaV9wY21fZGVzY3JpcHRpb24gYWxpX3BjbXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYWxpX3BjbV9kZXNjcmlwdGlvbiBhbGlfcGNtc1tdID0gewogCXsgIkFMSSA1NDUxIiwgQUxJX0NIQU5ORUxTLCAxLCAmc25kX2FsaV9wbGF5YmFja19vcHMsICZzbmRfYWxpX2NhcHR1cmVfb3BzIH0sCiAJeyAiQUxJIDU0NTEgbW9kZW0iLCAxLCAxLCAmc25kX2FsaV9tb2RlbV9wbGF5YmFja19vcHMsICZzbmRfYWxpX21vZGVtX2NhcHR1cmVfb3BzIH0KIH07CkBAIC0xOTU5LDkgKzE5NTksOSBAQAogc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfYWxpNTQ1MV9taXhlcl9zcGRpZltdIF9fZGV2aW5pdGRhdGEgPSB7CiAJLyogc3BkaWYgYXBsYXliYWNrIHN3aXRjaCAqLwogCS8qIEZJWE1FOiAiSUVDOTU4IFBsYXliYWNrIFN3aXRjaCIgbWF5IGNvbmZsaWN0IHdpdGggb25lIG9uIGFjOTdfY29kZWMgKi8KLQlBTEk1NDUxX1NQRElGKCJJRUM5NTggT3V0cHV0IHN3aXRjaCIsIDAsIDApLAorCUFMSTU0NTFfU1BESUYoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJPdXRwdXQgIixOT05FLFNXSVRDSCksIDAsIDApLAogCS8qIHNwZGlmIG91dCB0byBzcGRpZiBjaGFubmVsICovCi0JQUxJNTQ1MV9TUERJRigiSUVDOTU4IENoYW5uZWwgT3V0cHV0IFN3aXRjaCIsIDAsIDEpLAorCUFMSTU0NTFfU1BESUYoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJDaGFubmVsIE91dHB1dCAiLE5PTkUsU1dJVENIKSwgMCwgMSksCiAJLyogc3BkaWYgaW4gZnJvbSBzcGRpZiBjaGFubmVsICovCiAJQUxJNTQ1MV9TUERJRihTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsQ0FQVFVSRSxTV0lUQ0gpLCAwLCAyKQogfTsKQEAgLTIyNDksNyArMjI0OSw3IEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JaWYgKChjb2RlYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpjb2RlYyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJaWYgKChjb2RlYyA9IGt6YWxsb2Moc2l6ZW9mKCpjb2RlYyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXRpaXhwLmMgYi9zb3VuZC9wY2kvYXRpaXhwLmMKaW5kZXggY2FmYWI0YS4uMTg4ZGYwOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F0aWl4cC5jCisrKyBiL3NvdW5kL3BjaS9hdGlpeHAuYwpAQCAtMjQ4LDYgKzI0OCw3IEBACiAJdW5zaWduZWQgaW50IHBlcmlvZF9ieXRlcywgcGVyaW9kczsKIAlpbnQgb3BlbmVkOwogCWludCBydW5uaW5nOworCWludCBzdXNwZW5kZWQ7CiAJaW50IHBjbV9vcGVuX2ZsYWc7CiAJaW50IGFjOTdfcGNtX3R5cGU7CS8qIGluZGV4ICMgb2YgYWM5N19wY20gdG8gYWNjZXNzLCAtMSA9IG5vdCB1c2VkICovCiAJdW5zaWduZWQgaW50IHNhdmVkX2N1cnB0cjsKQEAgLTY5OSwxMiArNzAwLDE4IEBACiAJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKIAkJZG1hLT5vcHMtPmVuYWJsZV90cmFuc2ZlcihjaGlwLCAxKTsKIAkJZG1hLT5ydW5uaW5nID0gMTsKKwkJZG1hLT5zdXNwZW5kZWQgPSAwOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKIAkJZG1hLT5vcHMtPmVuYWJsZV90cmFuc2ZlcihjaGlwLCAwKTsKIAkJZG1hLT5ydW5uaW5nID0gMDsKKwkJZG1hLT5zdXNwZW5kZWQgPSBjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTk3NSw2ICs5ODIsNyBAQAogewogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAogCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCkBAIC0xNDE5LDcgKzE0MjcsNyBAQAogCXNuZF9hdGlpeHBfYWNsaW5rX2Rvd24oY2hpcCk7CiAJc25kX2F0aWl4cF9jaGlwX3N0b3AoY2hpcCk7CiAKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGNoaXAtPnBjaSwgMyk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShjaGlwLT5wY2ksIFBDSV9EM2hvdCk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDMwLDcgKzE0MzgsNyBAQAogCWludCBpOwogCiAJcGNpX2VuYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGNoaXAtPnBjaSwgMCk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShjaGlwLT5wY2ksIFBDSV9EMCk7CiAJcGNpX3NldF9tYXN0ZXIoY2hpcC0+cGNpKTsKIAogCXNuZF9hdGlpeHBfYWNsaW5rX3Jlc2V0KGNoaXApOwpAQCAtMTQ0Myw3ICsxNDUxLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX0FUSV9QQ01ERVZTOyBpKyspCiAJCWlmIChjaGlwLT5wY21kZXZzW2ldKSB7CiAJCQlhdGlpeHBfZG1hX3QgKmRtYSA9ICZjaGlwLT5kbWFzW2ldOwotCQkJaWYgKGRtYS0+c3Vic3RyZWFtICYmIGRtYS0+cnVubmluZykgeworCQkJaWYgKGRtYS0+c3Vic3RyZWFtICYmIGRtYS0+c3VzcGVuZGVkKSB7CiAJCQkJZG1hLT5vcHMtPmVuYWJsZV9kbWEoY2hpcCwgMSk7CiAJCQkJd3JpdGVsKCh1MzIpZG1hLT5kZXNjX2J1Zi5hZGRyIHwgQVRJX1JFR19MSU5LUFRSX0VOLAogCQkJCSAgICAgICBjaGlwLT5yZW1hcF9hZGRyICsgZG1hLT5vcHMtPmxscF9vZmZzZXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfcGNtLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9wY20uYwppbmRleCAwNGRjZWZkLi4zOGJkMmI1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9wY20uYworKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9wY20uYwpAQCAtMzMsNyArMzMsNyBAQAogLyogaGFyZHdhcmUgZGVmaW5pdGlvbiAqLwogc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfdm9ydGV4X3BsYXliYWNrX2h3X2FkYiA9IHsKIAkuaW5mbyA9Ci0JICAgIChTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fUkVTVU1FIHwKKwkgICAgKFNORFJWX1BDTV9JTkZPX01NQVAgfCAvKiBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfCAqLwogCSAgICAgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJICAgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKIAkuZm9ybWF0cyA9CkBAIC01OCw3ICs1OCw3IEBACiAjaWZuZGVmIENISVBfQVU4ODIwCiBzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF92b3J0ZXhfcGxheWJhY2tfaHdfYTNkID0gewogCS5pbmZvID0KLQkgICAgKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCSAgICAoU05EUlZfUENNX0lORk9fTU1BUCB8IC8qIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8ICovCiAJICAgICBTTkRSVl9QQ01fSU5GT19QQVVTRSB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkgICAgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAogCS5mb3JtYXRzID0KQEAgLTc4LDcgKzc4LDcgQEAKICNlbmRpZgogc3RhdGljIHNuZF9wY21faGFyZHdhcmVfdCBzbmRfdm9ydGV4X3BsYXliYWNrX2h3X3NwZGlmID0gewogCS5pbmZvID0KLQkgICAgKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCSAgICAoU05EUlZfUENNX0lORk9fTU1BUCB8IC8qIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8ICovCiAJICAgICBTTkRSVl9QQ01fSU5GT19QQVVTRSB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkgICAgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAogCS5mb3JtYXRzID0KQEAgLTIyMCw4ICsyMjAsMTAgQEAKIAkJICAgIHZvcnRleF9hZGJfYWxsb2Nyb3V0ZShjaGlwLCAtMSwKIAkJCQkJICBwYXJhbXNfY2hhbm5lbHMoaHdfcGFyYW1zKSwKIAkJCQkJICBzdWJzdHJlYW0tPnN0cmVhbSwgdHlwZSk7Ci0JCWlmIChkbWEgPCAwKQorCQlpZiAoZG1hIDwgMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5sb2NrKTsKIAkJCXJldHVybiBkbWE7CisJCX0KIAkJc3RyZWFtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGEgPSAmY2hpcC0+ZG1hX2FkYltkbWFdOwogCQlzdHJlYW0tPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAkJLyogU2V0dXAgQnVmZmVycy4gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYwppbmRleCA5NWMyODkyLi43ZTI3YmZjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKKysrIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCkBAIC0xODgsNiArMTg4LDE0IEBACiAJICAgLm5hbWUgICA9ICJNU0kgSzhOIERpYW1vbmQgTUIgW1NCMDQzOF0iLAogCSAgIC5ncGlvX3R5cGUgPSAxLAogCSAgIC5pMmNfYWRjID0gMSB9ICwKKwkgLyogU2h1dHRsZSBYUEMgU0QzMVAgd2hpY2ggaGFzIGFuIG9uYm9hcmQgQ3JlYXRpdmUgTGFicyBTb3VuZCBCbGFzdGVyIExpdmUhIDI0LWJpdCBFQVgKKwkgICogaGlnaC1kZWZpbml0aW9uIDcuMSBhdWRpbyBwcm9jZXNzb3IiLgorCSAgKiBBZGRlZCB1c2luZyBpbmZvIGZyb20gYW5kcmV3dmVnYW4gaW4gYWxzYSBidWcgIzEyOTgKKwkgICovCisJIHsgLnNlcmlhbCA9IDB4MzAzODEyOTcsCisJICAgLm5hbWUgICA9ICJTaHV0dGxlIFhQQyBTRDMxUCBbU0QzMVBdIiwKKwkgICAuZ3Bpb190eXBlID0gMSwKKwkgICAuaTJjX2FkYyA9IDEgfSAsCiAJIHsgLnNlcmlhbCA9IDAsCiAJICAgLm5hbWUgICA9ICJBdWRpZ3lMUyBbVW5rbm93bl0iIH0KIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9taXhlci5jIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWl4ZXIuYwppbmRleCAwZTVlOWNlLi5iNmI4ODgyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9taXhlci5jCisrKyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21peGVyLmMKQEAgLTI5Nyw3ICsyOTcsNyBAQAogc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfY2EwMTA2X3NwZGlmX21hc2tfY29udHJvbCA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAotICAgICAgICAuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAgICAgICAgIC5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTUFTSyksCiAJLmNvdW50ID0JNCwKICAgICAgICAgLmluZm8gPSAgICAgICAgIHNuZF9jYTAxMDZfc3BkaWZfaW5mbywKQEAgLTMwNiw3ICszMDYsNyBAQAogCiBzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9jYTAxMDZfc3BkaWZfY29udHJvbCA9CiB7Ci0gICAgICAgIC5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorICAgICAgICAuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAgICAgICAgIC5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssREVGQVVMVCksCiAJLmNvdW50ID0JNCwKICAgICAgICAgLmluZm8gPSAgICAgICAgIHNuZF9jYTAxMDZfc3BkaWZfaW5mbywKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jbWlwY2kuYyBiL3NvdW5kL3BjaS9jbWlwY2kuYwppbmRleCBmNWE0YWMxLi5iMDk4YjUxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY21pcGNpLmMKKysrIGIvc291bmQvcGNpL2NtaXBjaS5jCkBAIC0xMDI5LDcgKzEwMjksNyBAQAogc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfY21pcGNpX3NwZGlmX21hc2sgX19kZXZpbml0ZGF0YSA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAotCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKIAkubmFtZSA9CQlTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssQ09OX01BU0spLAogCS5pbmZvID0JCXNuZF9jbWlwY2lfc3BkaWZfbWFza19pbmZvLAogCS5nZXQgPQkJc25kX2NtaXBjaV9zcGRpZl9tYXNrX2dldCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4LmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eC5jCmluZGV4IGRiMjEyZWMuLmI5ZmZmNGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4LmMKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHguYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJCXJldHVybiBlcnI7CiAJfQogI2VuZGlmCi0JaWYgKChlcnIgPSBzbmRfY3M0Nnh4X21peGVyKGNoaXApKSA8IDApIHsKKwlpZiAoKGVyciA9IHNuZF9jczQ2eHhfbWl4ZXIoY2hpcCwgMikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jIGIvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMKaW5kZXggZmYyOGFmMS4uNGIwNTIxNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMKQEAgLTEyNDMsOCArMTI0Myw4IEBACiB7CiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwKIAkJCQkgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfCAKLQkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiAvKnwqLworCQkJCSAvKlNORFJWX1BDTV9JTkZPX1JFU1VNRSovKSwKIAkuZm9ybWF0cyA9CQkoU05EUlZfUENNX0ZNVEJJVF9TOCB8IFNORFJWX1BDTV9GTVRCSVRfVTggfAogCQkJCSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwKIAkJCQkgU05EUlZfUENNX0ZNVEJJVF9VMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1UxNl9CRSksCkBAIC0xMjY1LDggKzEyNjUsOCBAQAogewogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiAvKnwqLworCQkJCSAvKlNORFJWX1BDTV9JTkZPX1JFU1VNRSovKSwKIAkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKIAkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCiAJLnJhdGVfbWluID0JCTU1MDAsCkBAIC0yMjMxLDcgKzIyMzEsNyBAQAogfSwKIHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkubmFtZSA9ICJJRUM5NTggT3V0cHV0IFN3aXRjaCIsCisJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIk91dHB1dCAiLE5PTkUsU1dJVENIKSwKIAkuaW5mbyA9IHNuZF9taXhlcl9ib29sZWFuX2luZm8sCiAJLmdldCA9IHNuZF9jczQ2eHhfaWVjOTU4X2dldCwKIAkucHV0ID0gc25kX2NzNDZ4eF9pZWM5NThfcHV0LApAQCAtMjIzOSw3ICsyMjM5LDcgQEAKIH0sCiB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLm5hbWUgPSAiSUVDOTU4IElucHV0IFN3aXRjaCIsCisJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIklucHV0ICIsTk9ORSxTV0lUQ0gpLAogCS5pbmZvID0gc25kX21peGVyX2Jvb2xlYW5faW5mbywKIAkuZ2V0ID0gc25kX2NzNDZ4eF9pZWM5NThfZ2V0LAogCS5wdXQgPSBzbmRfY3M0Nnh4X2llYzk1OF9wdXQsCkBAIC0yMjQ5LDcgKzIyNDksNyBAQAogLyogSW5wdXQgSUVDOTU4IHZvbHVtZSBkb2VzIG5vdCB3b3JrIGZvciB0aGUgbW9tZW50LiAoQmVubnkpICovCiB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLm5hbWUgPSAiSUVDOTU4IElucHV0IFZvbHVtZSIsCisJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIklucHV0ICIsTk9ORSxWT0xVTUUpLAogCS5pbmZvID0gc25kX2NzNDZ4eF92b2xfaW5mbywKIAkuZ2V0ID0gc25kX2NzNDZ4eF92b2xfaWVjOTU4X2dldCwKIAkucHV0ID0gc25kX2NzNDZ4eF92b2xfaWVjOTU4X3B1dCwKQEAgLTI0NDAsNyArMjQ0MCw3IEBACiAJcmV0dXJuIC1FTlhJTzsKIH0KIAotaW50IF9fZGV2aW5pdCBzbmRfY3M0Nnh4X21peGVyKGNzNDZ4eF90ICpjaGlwKQoraW50IF9fZGV2aW5pdCBzbmRfY3M0Nnh4X21peGVyKGNzNDZ4eF90ICpjaGlwLCBpbnQgc3BkaWZfZGV2aWNlKQogewogCXNuZF9jYXJkX3QgKmNhcmQgPSBjaGlwLT5jYXJkOwogCXNuZF9jdGxfZWxlbV9pZF90IGlkOwpAQCAtMjQ3Niw2ICsyNDc2LDggQEAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoc25kX2NzNDZ4eF9jb250cm9scyk7IGlkeCsrKSB7CiAJCXNuZF9rY29udHJvbF90ICprY3RsOwogCQlrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfY3M0Nnh4X2NvbnRyb2xzW2lkeF0sIGNoaXApOworCQlpZiAoa2N0bCAmJiBrY3RsLT5pZC5pZmFjZSA9PSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00pCisJCQlrY3RsLT5pZC5kZXZpY2UgPSBzcGRpZl9kZXZpY2U7CiAJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jCmluZGV4IGIxNzE0MmMuLmZjMzc3YzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMKQEAgLTE0OSw3ICsxNDksNyBAQAogCQl9CiAJfQogCi0JaWYgKChlcnIgPSBzbmRfZW11MTBrMV9taXhlcihlbXUpKSA8IDApIHsKKwlpZiAoKGVyciA9IHNuZF9lbXUxMGsxX21peGVyKGVtdSwgMCwgMykpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKaW5kZXggNzQ2YjUxZS4uZTY5ZDViNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKQEAgLTc0MSwxMiArNzQxLDIwIEBACiAJIC5lbXUxMGsxX2NoaXAgPSAxLAogCSAuYWM5N19jaGlwID0gMSwKIAkgLnNibGl2ZTUxID0gMX0gLAorCS8qIFRlc3RlZCBieSBUaG9tYXMgWmVoZXRiYXVlciAyN3RoIEF1ZyAyMDA1ICovCisJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDIsIC5zdWJzeXN0ZW0gPSAweDgwNjUxMTAyLAorCSAuZHJpdmVyID0gIkVNVTEwSzEiLCAubmFtZSA9ICJTQiBMaXZlIDUuMSBbU0IwMjIwXSIsIAorCSAuaWQgPSAiTGl2ZSIsCisJIC5lbXUxMGsxX2NoaXAgPSAxLAorCSAuYWM5N19jaGlwID0gMSwKKwkgLnNibGl2ZTUxID0gMX0gLAogCXsudmVuZG9yID0gMHgxMTAyLCAuZGV2aWNlID0gMHgwMDAyLCAuc3Vic3lzdGVtID0gMHg4MDY0MTEwMiwKIAkgLmRyaXZlciA9ICJFTVUxMEsxIiwgLm5hbWUgPSAiU0IgTGl2ZSA1LjEiLCAKIAkgLmlkID0gIkxpdmUiLAogCSAuZW11MTBrMV9jaGlwID0gMSwKIAkgLmFjOTdfY2hpcCA9IDEsCiAJIC5zYmxpdmU1MSA9IDF9ICwKKwkvKiBUZXN0ZWQgYnkgYWxzYSBidWd0cmFjayB1c2VyICJodXMiIDEydGggU2VwdCAyMDA1ICovCiAJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDIsIC5zdWJzeXN0ZW0gPSAweDgwNjExMTAyLAogCSAuZHJpdmVyID0gIkVNVTEwSzEiLCAubmFtZSA9ICJTQkxpdmUhIFBsYXllciA1LjEgW1NCMDA2MF0iLCAKIAkgLmlkID0gIkxpdmUiLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKaW5kZXggZTkwYzVkZGQuLjUyYzc4MjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwpAQCAtMTE4Myw3ICsxMTgzLDcgQEAKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2VtdTEwazF4X3NwZGlmX21hc2tfY29udHJvbCA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAotCS5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAogCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTUFTSyksCiAJLmNvdW50ID0JMywKIAkuaW5mbyA9ICAgICAgICAgc25kX2VtdTEwazF4X3NwZGlmX2luZm8sCkBAIC0xMTkyLDcgKzExOTIsNyBAQAogCiBzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9lbXUxMGsxeF9zcGRpZl9jb250cm9sID0KIHsKLQkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxERUZBVUxUKSwKIAkuY291bnQgPQkzLAogCS5pbmZvID0gICAgICAgICBzbmRfZW11MTBrMXhfc3BkaWZfaW5mbywKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdWZ4LmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jCmluZGV4IDA1MjlmYjIuLjYzN2M1NTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdWZ4LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11ZnguYwpAQCAtMTE1OSwxMiArMTE1OSwxMiBAQAogIAkvKiBPcHRpY2FsIFNQRElGIFBsYXliYWNrIFZvbHVtZSAqLwogCUFfQUREX1ZPTFVNRV9JTihzdGVyZW9fbWl4LCBncHIsIEFfRVhUSU5fT1BUX1NQRElGX0wpOwogCUFfQUREX1ZPTFVNRV9JTihzdGVyZW9fbWl4KzEsIGdwcisxLCBBX0VYVElOX09QVF9TUERJRl9SKTsKLQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLCAiSUVDOTU4IE9wdGljYWwgUGxheWJhY2sgVm9sdW1lIiwgZ3ByLCAwKTsKKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLCBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIk9wdGljYWwgIixQTEFZQkFDSyxWT0xVTUUpLCBncHIsIDApOwogCWdwciArPSAyOwogCS8qIE9wdGljYWwgU1BESUYgQ2FwdHVyZSBWb2x1bWUgKi8KIAlBX0FERF9WT0xVTUVfSU4oY2FwdHVyZSwgZ3ByLCBBX0VYVElOX09QVF9TUERJRl9MKTsKIAlBX0FERF9WT0xVTUVfSU4oY2FwdHVyZSsxLCBncHIrMSwgQV9FWFRJTl9PUFRfU1BESUZfUik7Ci0Jc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbCgmY29udHJvbHNbbmN0bCsrXSwgIklFQzk1OCBPcHRpY2FsIENhcHR1cmUgVm9sdW1lIiwgZ3ByLCAwKTsKKwlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLCBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIk9wdGljYWwgIixDQVBUVVJFLFZPTFVNRSksIGdwciwgMCk7CiAJZ3ByICs9IDI7CiAKIAkvKiBMaW5lMiBQbGF5YmFjayBWb2x1bWUgKi8KQEAgLTEzODksNyArMTM4OSw3IEBACiAJCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9FWFRPVVQoQV9FWFRPVVRfRlJPTlRfTCArIHopLCBBX0dQUih0bXAgKyAwKSwgQV9HUFIodG1wICsgMSksIEFfQ18wMDAwMDAwMCk7CiAJCX0KIAl9Ci0Jc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fb25vZmZfY29udHJvbChjb250cm9scyArIG5jdGwrKywgIklFQzk1OCBPcHRpY2FsIFJhdyBQbGF5YmFjayBTd2l0Y2giLCBncHIsIDApOworCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX29ub2ZmX2NvbnRyb2woY29udHJvbHMgKyBuY3RsKyssIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiT3B0aWNhbCBSYXcgIixQTEFZQkFDSyxTV0lUQ0gpLCBncHIsIDApOwogCWdwciArPSAyOwogCQogCUFfUFVUX1NURVJFT19PVVRQVVQoQV9FWFRPVVRfUkVBUl9MLCBBX0VYVE9VVF9SRUFSX1IsIHBsYXliYWNrKzIgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyk7CkBAIC0xNzE2LDcgKzE3MTYsNyBAQAogCQkvKiBJRUM5NTggVFRMIFBsYXliYWNrIFZvbHVtZSAqLwogCQlmb3IgKHogPSAwOyB6IDwgMjsgeisrKQogCQkJVk9MVU1FX0FERElOKGljb2RlLCAmcHRyLCBwbGF5YmFjayArIHosIEVYVElOX1NQRElGX0NEX0wgKyB6LCBncHIgKyB6KTsKLQkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbChjb250cm9scyArIGkrKywgIklFQzk1OCBUVEwgUGxheWJhY2sgVm9sdW1lIiwgZ3ByLCAwKTsKKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbChjb250cm9scyArIGkrKywgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJUVEwgIixQTEFZQkFDSyxWT0xVTUUpLCBncHIsIDApOwogCQlncHIgKz0gMjsKIAkKIAkJLyogSUVDOTU4IFRUTCBDYXB0dXJlIFZvbHVtZSArIFN3aXRjaCAqLwpAQCAtMTcyNCw4ICsxNzI0LDggQEAKIAkJCVNXSVRDSF9JTihpY29kZSwgJnB0ciwgdG1wICsgMCwgRVhUSU5fU1BESUZfQ0RfTCArIHosIGdwciArIDIgKyB6KTsKIAkJCVZPTFVNRV9BREQoaWNvZGUsICZwdHIsIGNhcHR1cmUgKyB6LCB0bXAgKyAwLCBncHIgKyB6KTsKIAkJfQotCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiSUVDOTU4IFRUTCBDYXB0dXJlIFZvbHVtZSIsIGdwciwgMCk7Ci0JCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX29ub2ZmX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJJRUM5NTggVFRMIENhcHR1cmUgU3dpdGNoIiwgZ3ByICsgMiwgMCk7CisJCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woY29udHJvbHMgKyBpKyssIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiVFRMICIsQ0FQVFVSRSxWT0xVTUUpLCBncHIsIDApOworCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19vbm9mZl9jb250cm9sKGNvbnRyb2xzICsgaSsrLCBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIlRUTCAiLENBUFRVUkUsU1dJVENIKSwgZ3ByICsgMiwgMCk7CiAJCWdwciArPSA0OwogCX0KIAkKQEAgLTE3NTAsNyArMTc1MCw3IEBACiAJCS8qIElFQzk1OCBPcHRpY2FsIFBsYXliYWNrIFZvbHVtZSAqLwogCQlmb3IgKHogPSAwOyB6IDwgMjsgeisrKQogCQkJVk9MVU1FX0FERElOKGljb2RlLCAmcHRyLCBwbGF5YmFjayArIHosIEVYVElOX1RPU0xJTktfTCArIHosIGdwciArIHopOwotCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiSUVDOTU4IExpdmVEcml2ZSBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDApOworCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKGNvbnRyb2xzICsgaSsrLCBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIkxpdmVEcml2ZSAiLFBMQVlCQUNLLFZPTFVNRSksIGdwciwgMCk7CiAJCWdwciArPSAyOwogCQogCQkvKiBJRUM5NTggT3B0aWNhbCBDYXB0dXJlIFZvbHVtZSAqLwpAQCAtMTc1OCw4ICsxNzU4LDggQEAKIAkJCVNXSVRDSF9JTihpY29kZSwgJnB0ciwgdG1wICsgMCwgRVhUSU5fVE9TTElOS19MICsgeiwgZ3ByICsgMiArIHopOwogCQkJVk9MVU1FX0FERChpY29kZSwgJnB0ciwgY2FwdHVyZSArIHosIHRtcCArIDAsIGdwciArIHopOwogCQl9Ci0JCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJJRUM5NTggTGl2ZURyaXZlIENhcHR1cmUgVm9sdW1lIiwgZ3ByLCAwKTsKLQkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fb25vZmZfY29udHJvbChjb250cm9scyArIGkrKywgIklFQzk1OCBMaXZlRHJpdmUgQ2FwdHVyZSBTd2l0Y2giLCBncHIgKyAyLCAwKTsKKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbChjb250cm9scyArIGkrKywgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJMaXZlRHJpdmUgIixDQVBUVVJFLFZPTFVNRSksIGdwciwgMCk7CisJCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX29ub2ZmX2NvbnRyb2woY29udHJvbHMgKyBpKyssIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiTGl2ZURyaXZlICIsQ0FQVFVSRSxTV0lUQ0gpLCBncHIgKyAyLCAwKTsKIAkJZ3ByICs9IDQ7CiAJfQogCQpAQCAtMTc4NCw3ICsxNzg0LDcgQEAKIAkJLyogSUVDOTU4IENvYXggUGxheWJhY2sgVm9sdW1lICovCiAJCWZvciAoeiA9IDA7IHogPCAyOyB6KyspCiAJCQlWT0xVTUVfQURESU4oaWNvZGUsICZwdHIsIHBsYXliYWNrICsgeiwgRVhUSU5fQ09BWF9TUERJRl9MICsgeiwgZ3ByICsgeik7Ci0JCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woY29udHJvbHMgKyBpKyssICJJRUM5NTggQ29heGlhbCBQbGF5YmFjayBWb2x1bWUiLCBncHIsIDApOworCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKGNvbnRyb2xzICsgaSsrLCBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIkNvYXhpYWwgIixQTEFZQkFDSyxWT0xVTUUpLCBncHIsIDApOwogCQlncHIgKz0gMjsKIAkKIAkJLyogSUVDOTU4IENvYXggQ2FwdHVyZSBWb2x1bWUgKyBTd2l0Y2ggKi8KQEAgLTE3OTIsOCArMTc5Miw4IEBACiAJCQlTV0lUQ0hfSU4oaWNvZGUsICZwdHIsIHRtcCArIDAsIEVYVElOX0NPQVhfU1BESUZfTCArIHosIGdwciArIDIgKyB6KTsKIAkJCVZPTFVNRV9BREQoaWNvZGUsICZwdHIsIGNhcHR1cmUgKyB6LCB0bXAgKyAwLCBncHIgKyB6KTsKIAkJfQotCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiSUVDOTU4IENvYXhpYWwgQ2FwdHVyZSBWb2x1bWUiLCBncHIsIDApOwotCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19vbm9mZl9jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiSUVDOTU4IENvYXhpYWwgQ2FwdHVyZSBTd2l0Y2giLCBncHIgKyAyLCAwKTsKKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbChjb250cm9scyArIGkrKywgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJDb2F4aWFsICIsQ0FQVFVSRSxWT0xVTUUpLCBncHIsIDApOworCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19vbm9mZl9jb250cm9sKGNvbnRyb2xzICsgaSsrLCBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIkNvYXhpYWwgIixDQVBUVVJFLFNXSVRDSCksIGdwciArIDIsIDApOwogCQlncHIgKz0gNDsKIAl9CiAJCkBAIC0xOTIwLDcgKzE5MjAsNyBAQAogI2VuZGlmCiAJCX0KIAotCQlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19vbm9mZl9jb250cm9sKGNvbnRyb2xzICsgaSsrLCAiSUVDOTU4IE9wdGljYWwgUmF3IFBsYXliYWNrIFN3aXRjaCIsIGdwciwgMCk7CisJCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX29ub2ZmX2NvbnRyb2woY29udHJvbHMgKyBpKyssIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiT3B0aWNhbCBSYXcgIixQTEFZQkFDSyxTV0lUQ0gpLCBncHIsIDApOwogCQlncHIgKz0gMjsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1peGVyLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVtaXhlci5jCmluZGV4IDZiZTgyYzUuLmQ3MWE3MmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1peGVyLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYwpAQCAtMTgxLDcgKzE4MSw3IEBACiBzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9lbXUxMGsxX3NwZGlmX21hc2tfY29udHJvbCA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAotCS5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAogCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTUFTSyksCiAJLmNvdW50ID0JNCwKIAkuaW5mbyA9ICAgICAgICAgc25kX2VtdTEwazFfc3BkaWZfaW5mbywKQEAgLTE5MCw3ICsxOTAsNyBAQAogCiBzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9lbXUxMGsxX3NwZGlmX2NvbnRyb2wgPQogewotCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKIAkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLAogCS5jb3VudCA9CTQsCiAJLmluZm8gPSAgICAgICAgIHNuZF9lbXUxMGsxX3NwZGlmX2luZm8sCkBAIC0yOTUsNyArMjk1LDcgQEAKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2VtdTEwazFfc2VuZF9yb3V0aW5nX2NvbnRyb2wgPQogewogCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFLAotCS5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAogCS5uYW1lID0gICAgICAgICAiRU1VMTBLMSBQQ00gU2VuZCBSb3V0aW5nIiwKIAkuY291bnQgPQkzMiwKIAkuaW5mbyA9ICAgICAgICAgc25kX2VtdTEwazFfc2VuZF9yb3V0aW5nX2luZm8sCkBAIC0zNjQsNyArMzY0LDcgQEAKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2VtdTEwazFfc2VuZF92b2x1bWVfY29udHJvbCA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUsCi0JLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAJLm5hbWUgPSAgICAgICAgICJFTVUxMEsxIFBDTSBTZW5kIFZvbHVtZSIsCiAJLmNvdW50ID0JMzIsCiAJLmluZm8gPSAgICAgICAgIHNuZF9lbXUxMGsxX3NlbmRfdm9sdW1lX2luZm8sCkBAIC00MjcsNyArNDI3LDcgQEAKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2VtdTEwazFfYXR0bl9jb250cm9sID0KIHsKIAkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRSwKLQkuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKIAkubmFtZSA9ICAgICAgICAgIkVNVTEwSzEgUENNIFZvbHVtZSIsCiAJLmNvdW50ID0JMzIsCiAJLmluZm8gPSAgICAgICAgIHNuZF9lbXUxMGsxX2F0dG5faW5mbywKQEAgLTczNyw3ICs3MzcsOCBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCi1pbnQgX19kZXZpbml0IHNuZF9lbXUxMGsxX21peGVyKGVtdTEwazFfdCAqZW11KQoraW50IF9fZGV2aW5pdCBzbmRfZW11MTBrMV9taXhlcihlbXUxMGsxX3QgKmVtdSwKKwkJCQlpbnQgcGNtX2RldmljZSwgaW50IG11bHRpX2RldmljZSkKIHsKIAlpbnQgZXJyLCBwY207CiAJc25kX2tjb250cm9sX3QgKmtjdGw7CkBAIC04NTIsMjkgKzg1MywzNSBAQAogCiAJaWYgKChrY3RsID0gZW11LT5jdGxfc2VuZF9yb3V0aW5nID0gc25kX2N0bF9uZXcxKCZzbmRfZW11MTBrMV9zZW5kX3JvdXRpbmdfY29udHJvbCwgZW11KSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CisJa2N0bC0+aWQuZGV2aWNlID0gcGNtX2RldmljZTsKIAlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKIAkJcmV0dXJuIGVycjsKIAlpZiAoKGtjdGwgPSBlbXUtPmN0bF9zZW5kX3ZvbHVtZSA9IHNuZF9jdGxfbmV3MSgmc25kX2VtdTEwazFfc2VuZF92b2x1bWVfY29udHJvbCwgZW11KSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CisJa2N0bC0+aWQuZGV2aWNlID0gcGNtX2RldmljZTsKIAlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKIAkJcmV0dXJuIGVycjsKIAlpZiAoKGtjdGwgPSBlbXUtPmN0bF9hdHRuID0gc25kX2N0bF9uZXcxKCZzbmRfZW11MTBrMV9hdHRuX2NvbnRyb2wsIGVtdSkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOworCWtjdGwtPmlkLmRldmljZSA9IHBjbV9kZXZpY2U7CiAJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCiAJCXJldHVybiBlcnI7CiAKIAlpZiAoKGtjdGwgPSBlbXUtPmN0bF9lZnhfc2VuZF9yb3V0aW5nID0gc25kX2N0bF9uZXcxKCZzbmRfZW11MTBrMV9lZnhfc2VuZF9yb3V0aW5nX2NvbnRyb2wsIGVtdSkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOworCWtjdGwtPmlkLmRldmljZSA9IG11bHRpX2RldmljZTsKIAlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKIAkJcmV0dXJuIGVycjsKIAkKIAlpZiAoKGtjdGwgPSBlbXUtPmN0bF9lZnhfc2VuZF92b2x1bWUgPSBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMGsxX2VmeF9zZW5kX3ZvbHVtZV9jb250cm9sLCBlbXUpKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKKwlrY3RsLT5pZC5kZXZpY2UgPSBtdWx0aV9kZXZpY2U7CiAJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCiAJCXJldHVybiBlcnI7CiAJCiAJaWYgKChrY3RsID0gZW11LT5jdGxfZWZ4X2F0dG4gPSBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMGsxX2VmeF9hdHRuX2NvbnRyb2wsIGVtdSkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOworCWtjdGwtPmlkLmRldmljZSA9IG11bHRpX2RldmljZTsKIAlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSkKIAkJcmV0dXJuIGVycjsKIApAQCAtOTI0LDEwICs5MzEsMTQgQEAKIAkJLyogc2IgbGl2ZSEgYW5kIGF1ZGlneSAqLwogCQlpZiAoKGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMGsxX3NwZGlmX21hc2tfY29udHJvbCwgZW11KSkgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoIWVtdS0+YXVkaWd5KQorCQkJa2N0bC0+aWQuZGV2aWNlID0gZW11LT5wY21fZWZ4LT5kZXZpY2U7CiAJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpKQogCQkJcmV0dXJuIGVycjsKIAkJaWYgKChrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfZW11MTBrMV9zcGRpZl9jb250cm9sLCBlbXUpKSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmICghZW11LT5hdWRpZ3kpCisJCQlrY3RsLT5pZC5kZXZpY2UgPSBlbXUtPnBjbV9lZngtPmRldmljZTsKIAkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKSkpCiAJCQlyZXR1cm4gZXJyOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11cGNtLmMKaW5kZXggNTIwYjk5YS4uOWMzNWY2ZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11cGNtLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11cGNtLmMKQEAgLTE2ODIsNiArMTY4Miw3IEBACiBpbnQgX19kZXZpbml0IHNuZF9lbXUxMGsxX3BjbV9lZngoZW11MTBrMV90ICogZW11LCBpbnQgZGV2aWNlLCBzbmRfcGNtX3QgKiogcnBjbSkKIHsKIAlzbmRfcGNtX3QgKnBjbTsKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKIAlpbnQgZXJyOwogCiAJaWYgKHJwY20pCkBAIC0xNzE0LDcgKzE3MTUsMTEgQEAKIAkJZW11LT5lZnhfdm9pY2VzX21hc2tbMF0gPSAweGZmZmYwMDAwOwogCQllbXUtPmVmeF92b2ljZXNfbWFza1sxXSA9IDA7CiAJfQotCXNuZF9jdGxfYWRkKGVtdS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfZW11MTBrMV9wY21fZWZ4X3ZvaWNlc19tYXNrLCBlbXUpKTsKKwlrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfZW11MTBrMV9wY21fZWZ4X3ZvaWNlc19tYXNrLCBlbXUpOworCWlmICgha2N0bCkKKwkJcmV0dXJuIC1FTk9NRU07CisJa2N0bC0+aWQuZGV2aWNlID0gZGV2aWNlOworCXNuZF9jdGxfYWRkKGVtdS0+Y2FyZCwga2N0bCk7CiAKIAlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKGVtdS0+cGNpKSwgNjQqMTAyNCwgNjQqMTAyNCk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbnMxMzcwLmMgYi9zb3VuZC9wY2kvZW5zMTM3MC5jCmluZGV4IDc4YTgxZjMuLmYwNmI5NWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbnMxMzcwLmMKKysrIGIvc291bmQvcGNpL2VuczEzNzAuYwpAQCAtMTQ0NCw3ICsxNDQ0LDcgQEAKIAogLyogc3BkaWYgY29udHJvbHMgKi8KIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2VzMTM3MV9taXhlcl9zcGRpZltdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JRVMxMzcxX1NQRElGKCJJRUM5NTggUGxheWJhY2sgU3dpdGNoIiksCisJRVMxMzcxX1NQRElGKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxTV0lUQ0gpKSwKIAl7CiAJCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKIAkJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ZtODAxLmMgYi9zb3VuZC9wY2kvZm04MDEuYwppbmRleCBmZjEwZTYzLi4zNmIyZjYyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZm04MDEuYworKysgYi9zb3VuZC9wY2kvZm04MDEuYwpAQCAtMTE1NSwxMCArMTE1NSwxMCBAQAogc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfZm04MDFfY29udHJvbHNfbXVsdGlbXSBfX2RldmluaXRkYXRhID0gewogRk04MDFfU0lOR0xFKCJBQzk3IDJjaC0+NGNoIENvcHkgU3dpdGNoIiwgRk04MDFfQ09ERUNfQ1RSTCwgNywgMSwgMCksCiBGTTgwMV9TSU5HTEUoIkFDOTcgMTgtYml0IFN3aXRjaCIsIEZNODAxX0NPREVDX0NUUkwsIDEwLCAxLCAwKSwKLUZNODAxX1NJTkdMRSgiSUVDOTU4IENhcHR1cmUgU3dpdGNoIiwgRk04MDFfSTJTX01PREUsIDgsIDEsIDApLAotRk04MDFfU0lOR0xFKCJJRUM5NTggUmF3IERhdGEgUGxheWJhY2sgU3dpdGNoIiwgRk04MDFfSTJTX01PREUsIDksIDEsIDApLAotRk04MDFfU0lOR0xFKCJJRUM5NTggUmF3IERhdGEgQ2FwdHVyZSBTd2l0Y2giLCBGTTgwMV9JMlNfTU9ERSwgMTAsIDEsIDApLAotRk04MDFfU0lOR0xFKCJJRUM5NTggUGxheWJhY2sgU3dpdGNoIiwgRk04MDFfR0VOX0NUUkwsIDIsIDEsIDApLAorRk04MDFfU0lOR0xFKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixDQVBUVVJFLFNXSVRDSCksIEZNODAxX0kyU19NT0RFLCA4LCAxLCAwKSwKK0ZNODAxX1NJTkdMRShTTkRSVl9DVExfTkFNRV9JRUM5NTgoIlJhdyBEYXRhICIsUExBWUJBQ0ssU1dJVENIKSwgRk04MDFfSTJTX01PREUsIDksIDEsIDApLAorRk04MDFfU0lOR0xFKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiUmF3IERhdGEgIixDQVBUVVJFLFNXSVRDSCksIEZNODAxX0kyU19NT0RFLCAxMCwgMSwgMCksCitGTTgwMV9TSU5HTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLFNXSVRDSCksIEZNODAxX0dFTl9DVFJMLCAyLCAxLCAwKSwKIH07CiAKIHN0YXRpYyB2b2lkIHNuZF9mbTgwMV9taXhlcl9mcmVlX2FjOTdfYnVzKGFjOTdfYnVzX3QgKmJ1cykKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCmluZGV4IGJkOGNiMzMuLmRkZmI1ZmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUKKysrIGIvc291bmQvcGNpL2hkYS9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKIHNuZC1oZGEtaW50ZWwtb2JqcyA6PSBoZGFfaW50ZWwubwotc25kLWhkYS1jb2RlYy1vYmpzIDo9IGhkYV9jb2RlYy5vIGhkYV9nZW5lcmljLm8gcGF0Y2hfcmVhbHRlay5vIHBhdGNoX2NtZWRpYS5vIHBhdGNoX2FuYWxvZy5vIHBhdGNoX3NpZ21hdGVsLm8KK3NuZC1oZGEtY29kZWMtb2JqcyA6PSBoZGFfY29kZWMubyBoZGFfZ2VuZXJpYy5vIHBhdGNoX3JlYWx0ZWsubyBwYXRjaF9jbWVkaWEubyBwYXRjaF9hbmFsb2cubyBwYXRjaF9zaWdtYXRlbC5vIHBhdGNoX3NpMzA1NC5vCiBpZmRlZiBDT05GSUdfUFJPQ19GUwogc25kLWhkYS1jb2RlYy1vYmpzICs9IGhkYV9wcm9jLm8KIGVuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYwppbmRleCBlMmNmMDIzLi4yMGY3NzYyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKQEAgLTQzMiwyMiArNDMyLDI2IEBACiB9CiAKIC8qCi0gKiBsb29rIGZvciBhbiBBRkcgbm9kZQotICoKLSAqIHJldHVybiAwIGlmIG5vdCBmb3VuZAorICogbG9vayBmb3IgYW4gQUZHIGFuZCBNRkcgbm9kZXMKICAqLwotc3RhdGljIGludCBsb29rX2Zvcl9hZmdfbm9kZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3N0YXRpYyB2b2lkIHNldHVwX2ZnX25vZGVzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCWludCBpLCB0b3RhbF9ub2RlczsKIAloZGFfbmlkX3QgbmlkOwogCiAJdG90YWxfbm9kZXMgPSBzbmRfaGRhX2dldF9zdWJfbm9kZXMoY29kZWMsIEFDX05PREVfUk9PVCwgJm5pZCk7CiAJZm9yIChpID0gMDsgaSA8IHRvdGFsX25vZGVzOyBpKyssIG5pZCsrKSB7Ci0JCWlmICgoc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9GVU5DVElPTl9UWVBFKSAmIDB4ZmYpID09Ci0JCSAgICBBQ19HUlBfQVVESU9fRlVOQ1RJT04pCi0JCQlyZXR1cm4gbmlkOworCQlzd2l0Y2goKHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfRlVOQ1RJT05fVFlQRSkgJiAweGZmKSkgeworCQljYXNlIEFDX0dSUF9BVURJT19GVU5DVElPTjoKKwkJCWNvZGVjLT5hZmcgPSBuaWQ7CisJCQlicmVhazsKKwkJY2FzZSBBQ19HUlBfTU9ERU1fRlVOQ1RJT046CisJCQljb2RlYy0+bWZnID0gbmlkOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCX0KLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTUwNywxMCArNTExLDkgQEAKIAljb2RlYy0+c3Vic3lzdGVtX2lkID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBBQ19OT0RFX1JPT1QsIEFDX1BBUl9TVUJTWVNURU1fSUQpOwogCWNvZGVjLT5yZXZpc2lvbl9pZCA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgQUNfTk9ERV9ST09ULCBBQ19QQVJfUkVWX0lEKTsKIAotCS8qIEZJWE1FOiBzdXBwb3J0IGZvciBtdWx0aXBsZSBBRkdzPyAqLwotCWNvZGVjLT5hZmcgPSBsb29rX2Zvcl9hZmdfbm9kZShjb2RlYyk7Ci0JaWYgKCEgY29kZWMtPmFmZykgewotCQlzbmRfcHJpbnRkZCgiaGRhX2NvZGVjOiBubyBBRkcgbm9kZSBmb3VuZFxuIik7CisJc2V0dXBfZmdfbm9kZXMoY29kZWMpOworCWlmICghIGNvZGVjLT5hZmcgJiYgISBjb2RlYy0+bWZnKSB7CisJCXNuZF9wcmludGRkKCJoZGFfY29kZWM6IG5vIEFGRyBvciBNRkcgbm9kZSBmb3VuZFxuIik7CiAJCXNuZF9oZGFfY29kZWNfZnJlZShjb2RlYyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTc0OSwxMiArNzUyLDE0IEBACiAJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwogCWludCBjaGFuZ2UgPSAwOwogCi0JaWYgKGNocyAmIDEpCisJaWYgKGNocyAmIDEpIHsKIAkJY2hhbmdlID0gc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCBuaWQsIDAsIGRpciwgaWR4LAogCQkJCQkJICAweDdmLCAqdmFscCk7CisJCXZhbHArKzsKKwl9CiAJaWYgKGNocyAmIDIpCiAJCWNoYW5nZSB8PSBzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIG5pZCwgMSwgZGlyLCBpZHgsCi0JCQkJCQkgICAweDdmLCB2YWxwWzFdKTsKKwkJCQkJCSAgIDB4N2YsICp2YWxwKTsKIAlyZXR1cm4gY2hhbmdlOwogfQogCkBAIC03OTYsMTIgKzgwMSwxNSBAQAogCWxvbmcgKnZhbHAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKIAlpbnQgY2hhbmdlID0gMDsKIAotCWlmIChjaHMgJiAxKQorCWlmIChjaHMgJiAxKSB7CiAJCWNoYW5nZSA9IHNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgbmlkLCAwLCBkaXIsIGlkeCwKIAkJCQkJCSAgMHg4MCwgKnZhbHAgPyAwIDogMHg4MCk7CisJCXZhbHArKzsKKwl9CiAJaWYgKGNocyAmIDIpCiAJCWNoYW5nZSB8PSBzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIG5pZCwgMSwgZGlyLCBpZHgsCi0JCQkJCQkgICAweDgwLCB2YWxwWzFdID8gMCA6IDB4ODApOworCQkJCQkJICAgMHg4MCwgKnZhbHAgPyAwIDogMHg4MCk7CisJCiAJcmV0dXJuIGNoYW5nZTsKIH0KIApAQCAtMTE1NSw4ICsxMTYzLDE2IEBACiAvKgogICogc3RyZWFtIGZvcm1hdHMKICAqLwotc3RhdGljIHVuc2lnbmVkIGludCByYXRlX2JpdHNbXVszXSA9IHsKK3N0cnVjdCBoZGFfcmF0ZV90YmwgeworCXVuc2lnbmVkIGludCBoejsKKwl1bnNpZ25lZCBpbnQgYWxzYV9iaXRzOworCXVuc2lnbmVkIGludCBoZGFfZm10OworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcmF0ZV90YmwgcmF0ZV9iaXRzW10gPSB7CiAJLyogcmF0ZSBpbiBIeiwgQUxTQSByYXRlIGJpdG1hc2ssIEhEQSBmb3JtYXQgdmFsdWUgKi8KKworCS8qIGF1dG9kZXRlY3RlZCB2YWx1ZSB1c2VkIGluIHNuZF9oZGFfcXVlcnlfc3VwcG9ydGVkX3BjbSAqLwogCXsgODAwMCwgU05EUlZfUENNX1JBVEVfODAwMCwgMHgwNTAwIH0sIC8qIDEvNiB4IDQ4ICovCiAJeyAxMTAyNSwgU05EUlZfUENNX1JBVEVfMTEwMjUsIDB4NDMwMCB9LCAvKiAxLzQgeCA0NCAqLwogCXsgMTYwMDAsIFNORFJWX1BDTV9SQVRFXzE2MDAwLCAweDAyMDAgfSwgLyogMS8zIHggNDggKi8KQEAgLTExNjgsNyArMTE4NCwxMSBAQAogCXsgOTYwMDAsIFNORFJWX1BDTV9SQVRFXzk2MDAwLCAweDA4MDAgfSwgLyogMiB4IDQ4ICovCiAJeyAxNzY0MDAsIFNORFJWX1BDTV9SQVRFXzE3NjQwMCwgMHg1ODAwIH0sLyogNCB4IDQ0ICovCiAJeyAxOTIwMDAsIFNORFJWX1BDTV9SQVRFXzE5MjAwMCwgMHgxODAwIH0sIC8qIDQgeCA0OCAqLwotCXsgMCB9CisKKwkvKiBub3QgYXV0b2RldGVjdGVkIHZhbHVlICovCisJeyA5NjAwLCBTTkRSVl9QQ01fUkFURV9LTk9ULCAweDA0MDAgfSwgLyogMS81IHggNDggKi8KKworCXsgMCB9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiAKIC8qKgpAQCAtMTE5MCwxMiArMTIxMCwxMiBAQAogCWludCBpOwogCXVuc2lnbmVkIGludCB2YWwgPSAwOwogCi0JZm9yIChpID0gMDsgcmF0ZV9iaXRzW2ldWzBdOyBpKyspCi0JCWlmIChyYXRlX2JpdHNbaV1bMF0gPT0gcmF0ZSkgewotCQkJdmFsID0gcmF0ZV9iaXRzW2ldWzJdOworCWZvciAoaSA9IDA7IHJhdGVfYml0c1tpXS5oejsgaSsrKQorCQlpZiAocmF0ZV9iaXRzW2ldLmh6ID09IHJhdGUpIHsKKwkJCXZhbCA9IHJhdGVfYml0c1tpXS5oZGFfZm10OwogCQkJYnJlYWs7CiAJCX0KLQlpZiAoISByYXRlX2JpdHNbaV1bMF0pIHsKKwlpZiAoISByYXRlX2JpdHNbaV0uaHopIHsKIAkJc25kX3ByaW50ZGQoImludmFsaWQgcmF0ZSAlZFxuIiwgcmF0ZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTEyNTgsOSArMTI3OCw5IEBACiAKIAlpZiAocmF0ZXNwKSB7CiAJCXUzMiByYXRlcyA9IDA7Ci0JCWZvciAoaSA9IDA7IHJhdGVfYml0c1tpXVswXTsgaSsrKSB7CisJCWZvciAoaSA9IDA7IHJhdGVfYml0c1tpXS5oejsgaSsrKSB7CiAJCQlpZiAodmFsICYgKDEgPDwgaSkpCi0JCQkJcmF0ZXMgfD0gcmF0ZV9iaXRzW2ldWzFdOworCQkJCXJhdGVzIHw9IHJhdGVfYml0c1tpXS5hbHNhX2JpdHM7CiAJCX0KIAkJKnJhdGVzcCA9IHJhdGVzOwogCX0KQEAgLTEzNTIsMTMgKzEzNzIsMTMgQEAKIAl9CiAKIAlyYXRlID0gZm9ybWF0ICYgMHhmZjAwOwotCWZvciAoaSA9IDA7IHJhdGVfYml0c1tpXVswXTsgaSsrKQotCQlpZiAocmF0ZV9iaXRzW2ldWzJdID09IHJhdGUpIHsKKwlmb3IgKGkgPSAwOyByYXRlX2JpdHNbaV0uaHo7IGkrKykKKwkJaWYgKHJhdGVfYml0c1tpXS5oZGFfZm10ID09IHJhdGUpIHsKIAkJCWlmICh2YWwgJiAoMSA8PCBpKSkKIAkJCQlicmVhazsKIAkJCXJldHVybiAwOwogCQl9Ci0JaWYgKCEgcmF0ZV9iaXRzW2ldWzBdKQorCWlmICghIHJhdGVfYml0c1tpXS5oeikKIAkJcmV0dXJuIDA7CiAKIAlzdHJlYW0gPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX1NUUkVBTSk7CkBAIC0xNTQxLDggKzE1NjEsMTEgQEAKIAkJZm9yIChjID0gdGJsOyBjLT5tb2RlbG5hbWUgfHwgYy0+cGNpX3N1YnZlbmRvcjsgYysrKSB7CiAJCQlpZiAoYy0+cGNpX3N1YnZlbmRvciA9PSBzdWJzeXN0ZW1fdmVuZG9yICYmCiAJCQkgICAgKCEgYy0+cGNpX3N1YmRldmljZSAvKiBhbGwgbWF0Y2ggKi98fAotCQkJICAgICAoYy0+cGNpX3N1YmRldmljZSA9PSBzdWJzeXN0ZW1fZGV2aWNlKSkpCisJCQkgICAgIChjLT5wY2lfc3ViZGV2aWNlID09IHN1YnN5c3RlbV9kZXZpY2UpKSkgeworCQkJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBQQ0kgJXg6JXgsIGNvZGVjIGNvbmZpZyAlZCBpcyBzZWxlY3RlZFxuIiwKKwkJCQkJICAgIHN1YnN5c3RlbV92ZW5kb3IsIHN1YnN5c3RlbV9kZXZpY2UsIGMtPmNvbmZpZyk7CiAJCQkJcmV0dXJuIGMtPmNvbmZpZzsKKwkJCX0KIAkJfQogCX0KIAlyZXR1cm4gLTE7CkBAIC0xODAzLDExICsxODI2LDI1IEBACiAJCQkJY2ZnLT5saW5lX291dF9waW5zW2pdID0gbmlkOwogCQkJfQogCi0JLyogU3dhcCBzdXJyb3VuZCBhbmQgQ0xGRTogdGhlIGFzc29jaWF0aW9uIG9yZGVyIGlzIGZyb250L0NMRkUvc3Vyci9iYWNrICovCi0JaWYgKGNmZy0+bGluZV9vdXRzID49IDMpIHsKKwkvKiBSZW9yZGVyIHRoZSBzdXJyb3VuZCBjaGFubmVscworCSAqIEFMU0Egc2VxdWVuY2UgaXMgZnJvbnQvc3Vyci9jbGZlL3NpZGUKKwkgKiBIREEgc2VxdWVuY2UgaXM6CisJICogICAgNC1jaDogZnJvbnQvc3VyciAgPT4gIE9LIGFzIGl0IGlzCisJICogICAgNi1jaDogZnJvbnQvY2xmZS9zdXJyCisJICogICAgOC1jaDogZnJvbnQvY2xmZS9zaWRlL3N1cnIKKwkgKi8KKwlzd2l0Y2ggKGNmZy0+bGluZV9vdXRzKSB7CisJY2FzZSAzOgogCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbMV07CiAJCWNmZy0+bGluZV9vdXRfcGluc1sxXSA9IGNmZy0+bGluZV9vdXRfcGluc1syXTsKIAkJY2ZnLT5saW5lX291dF9waW5zWzJdID0gbmlkOworCQlicmVhazsKKwljYXNlIDQ6CisJCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1sxXTsKKwkJY2ZnLT5saW5lX291dF9waW5zWzFdID0gY2ZnLT5saW5lX291dF9waW5zWzNdOworCQljZmctPmxpbmVfb3V0X3BpbnNbM10gPSBjZmctPmxpbmVfb3V0X3BpbnNbMl07CisJCWNmZy0+bGluZV9vdXRfcGluc1syXSA9IG5pZDsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaAppbmRleCBkZDBkOTlkLi42M2EyOWE4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKQEAgLTUxNCw2ICs1MTQsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogbGlzdCBwb2ludCAqLwogCiAJaGRhX25pZF90IGFmZzsJLyogQUZHIG5vZGUgaWQgKi8KKwloZGFfbmlkX3QgbWZnOwkvKiBNRkcgbm9kZSBpZCAqLwogCiAJLyogaWRzICovCiAJdTMyIHZlbmRvcl9pZDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYwppbmRleCAyZDA0NmFiLi4xMjI5MjI3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jCkBAIC04ODEsNiArODgxLDExIEBACiAJc3RydWN0IGhkYV9nc3BlYyAqc3BlYzsKIAlpbnQgZXJyOwogCisJaWYoIWNvZGVjLT5hZmcpIHsKKwkJc25kX3ByaW50ZGQoImhkYV9nZW5lcmljOiBubyBnZW5lcmljIG1vZGVtIHlldFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCXNwZWMgPSBrY2FsbG9jKDEsIHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwogCWlmIChzcGVjID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoZGFfZ2VuZXJpYzogY2FuJ3QgYWxsb2NhdGUgc3BlY1xuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwppbmRleCAyODhhYjA3Li4xNTEwN2RmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKQEAgLTcxLDcgKzcxLDkgQEAKIAkJCSAie0ludGVsLCBFU0IyfSwiCiAJCQkgIntBVEksIFNCNDUwfSwiCiAJCQkgIntWSUEsIFZUODI1MX0sIgotCQkJICJ7VklBLCBWVDgyMzdBfX0iKTsKKwkJCSAie1ZJQSwgVlQ4MjM3QX0sIgorCQkJICJ7U2lTLCBTSVM5NjZ9LCIKKwkJCSAie1VMSSwgTTU0NjF9fSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBIREEgZHJpdmVyIik7CiAKICNkZWZpbmUgU0ZYCSJoZGEtaW50ZWw6ICIKQEAgLTE0MSw5ICsxNDMsMjQgQEAKICAqLwogCiAvKiBtYXggbnVtYmVyIG9mIFNEcyAqLwotI2RlZmluZSBNQVhfSUNINl9ERVYJCTgKKy8qIElDSCwgQVRJIGFuZCBWSUEgaGF2ZSA0IHBsYXliYWNrIGFuZCA0IGNhcHR1cmUgKi8KKyNkZWZpbmUgSUNINl9DQVBUVVJFX0lOREVYCTAKKyNkZWZpbmUgSUNINl9OVU1fQ0FQVFVSRQk0CisjZGVmaW5lIElDSDZfUExBWUJBQ0tfSU5ERVgJNAorI2RlZmluZSBJQ0g2X05VTV9QTEFZQkFDSwk0CisKKy8qIFVMSSBoYXMgNiBwbGF5YmFjayBhbmQgNSBjYXB0dXJlICovCisjZGVmaW5lIFVMSV9DQVBUVVJFX0lOREVYCTAKKyNkZWZpbmUgVUxJX05VTV9DQVBUVVJFCQk1CisjZGVmaW5lIFVMSV9QTEFZQkFDS19JTkRFWAk1CisjZGVmaW5lIFVMSV9OVU1fUExBWUJBQ0sJNgorCisvKiB0aGlzIG51bWJlciBpcyBzdGF0aWNhbGx5IGRlZmluZWQgZm9yIHNpbXBsaWNpdHkgKi8KKyNkZWZpbmUgTUFYX0FaWF9ERVYJCTE2CisKIC8qIG1heCBudW1iZXIgb2YgZnJhZ21lbnRzIC0gd2UgbWF5IHVzZSBtb3JlIGlmIGFsbG9jYXRpbmcgbW9yZSBwYWdlcyBmb3IgQkRMICovCi0jZGVmaW5lIEFaWF9NQVhfRlJBRwkJKFBBR0VfU0laRSAvIChNQVhfSUNINl9ERVYgKiAxNikpCisjZGVmaW5lIEJETF9TSVpFCQlQQUdFX0FMSUdOKDgxOTIpCisjZGVmaW5lIEFaWF9NQVhfRlJBRwkJKEJETF9TSVpFIC8gKE1BWF9BWlhfREVWICogMTYpKQogLyogbWF4IGJ1ZmZlciBzaXplIC0gbm8gaC93IGxpbWl0LCB5b3UgY2FuIGluY3JlYXNlIGFzIHlvdSBsaWtlICovCiAjZGVmaW5lIEFaWF9NQVhfQlVGX1NJWkUJKDEwMjQqMTAyNCoxMDI0KQogLyogbWF4IG51bWJlciBvZiBQQ00gZGV2aWNzIHBlciBjYXJkICovCkBAIC0yMDAsNyArMjE3LDYgQEAKIH07CiAKIC8qIERlZmluZXMgZm9yIEFUSSBIRCBBdWRpbyBzdXBwb3J0IGluIFNCNDUwIHNvdXRoIGJyaWRnZSAqLwotI2RlZmluZSBBVElfU0I0NTBfSERBVURJT19QQ0lfREVWSUNFX0lEICAgICAweDQzN2IKICNkZWZpbmUgQVRJX1NCNDUwX0hEQVVESU9fTUlTQ19DTlRSMl9BRERSICAgMHg0MgogI2RlZmluZSBBVElfU0I0NTBfSERBVURJT19FTkFCTEVfU05PT1AgICAgICAweDAyCiAKQEAgLTI1OCw2ICsyNzQsMTQgQEAKIAlzbmRfY2FyZF90ICpjYXJkOwogCXN0cnVjdCBwY2lfZGV2ICpwY2k7CiAKKwkvKiBjaGlwIHR5cGUgc3BlY2lmaWMgKi8KKwlpbnQgZHJpdmVyX3R5cGU7CisJaW50IHBsYXliYWNrX3N0cmVhbXM7CisJaW50IHBsYXliYWNrX2luZGV4X29mZnNldDsKKwlpbnQgY2FwdHVyZV9zdHJlYW1zOworCWludCBjYXB0dXJlX2luZGV4X29mZnNldDsKKwlpbnQgbnVtX3N0cmVhbXM7CisKIAkvKiBwY2kgcmVzb3VyY2VzICovCiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCXZvaWQgX19pb21lbSAqcmVtYXBfYWRkcjsKQEAgLTI2Nyw4ICsyOTEsOCBAQAogCXNwaW5sb2NrX3QgcmVnX2xvY2s7CiAJc3RydWN0IHNlbWFwaG9yZSBvcGVuX211dGV4OwogCi0JLyogc3RyZWFtcyAqLwotCWF6eF9kZXZfdCBhenhfZGV2W01BWF9JQ0g2X0RFVl07CisJLyogc3RyZWFtcyAoeCBudW1fc3RyZWFtcykgKi8KKwlhenhfZGV2X3QgKmF6eF9kZXY7CiAKIAkvKiBQQ00gKi8KIAl1bnNpZ25lZCBpbnQgcGNtX2RldnM7CkBAIC0yOTIsNiArMzE2LDIzIEBACiAJdW5zaWduZWQgaW50IGluaXRpYWxpemVkOiAxOwogfTsKIAorLyogZHJpdmVyIHR5cGVzICovCitlbnVtIHsKKwlBWlhfRFJJVkVSX0lDSCwKKwlBWlhfRFJJVkVSX0FUSSwKKwlBWlhfRFJJVkVSX1ZJQSwKKwlBWlhfRFJJVkVSX1NJUywKKwlBWlhfRFJJVkVSX1VMSSwKK307CisKK3N0YXRpYyBjaGFyICpkcml2ZXJfc2hvcnRfbmFtZXNbXSBfX2RldmluaXRkYXRhID0geworCVtBWlhfRFJJVkVSX0lDSF0gPSAiSERBIEludGVsIiwKKwlbQVpYX0RSSVZFUl9BVEldID0gIkhEQSBBVEkgU0IiLAorCVtBWlhfRFJJVkVSX1ZJQV0gPSAiSERBIFZJQSBWVDgyeHgiLAorCVtBWlhfRFJJVkVSX1NJU10gPSAiSERBIFNJUzk2NiIsCisJW0FaWF9EUklWRVJfVUxJXSA9ICJIREEgVUxJIE01NDYxIgorfTsKKwogLyoKICAqIG1hY3JvcyBmb3IgZWFzeSB1c2UKICAqLwpAQCAtMzYwLDYgKzQwMSw4IEBACiAJYXp4X3dyaXRlbChjaGlwLCBDT1JCTEJBU0UsICh1MzIpY2hpcC0+Y29yYi5hZGRyKTsKIAlhenhfd3JpdGVsKGNoaXAsIENPUkJVQkFTRSwgdXBwZXJfMzJiaXQoY2hpcC0+Y29yYi5hZGRyKSk7CiAKKwkvKiBzZXQgdGhlIGNvcmIgc2l6ZSB0byAyNTYgZW50cmllcyAoVUxJIHJlcXVpcmVzIGV4cGxpY2l0bHkpICovCisJYXp4X3dyaXRlYihjaGlwLCBDT1JCU0laRSwgMHgwMik7CiAJLyogc2V0IHRoZSBjb3JiIHdyaXRlIHBvaW50ZXIgdG8gMCAqLwogCWF6eF93cml0ZXcoY2hpcCwgQ09SQldQLCAwKTsKIAkvKiByZXNldCB0aGUgY29yYiBodyByZWFkIHBvaW50ZXIgKi8KQEAgLTM3Myw2ICs0MTYsOCBAQAogCWF6eF93cml0ZWwoY2hpcCwgUklSQkxCQVNFLCAodTMyKWNoaXAtPnJpcmIuYWRkcik7CiAJYXp4X3dyaXRlbChjaGlwLCBSSVJCVUJBU0UsIHVwcGVyXzMyYml0KGNoaXAtPnJpcmIuYWRkcikpOwogCisJLyogc2V0IHRoZSByaXJiIHNpemUgdG8gMjU2IGVudHJpZXMgKFVMSSByZXF1aXJlcyBleHBsaWNpdGx5KSAqLworCWF6eF93cml0ZWIoY2hpcCwgUklSQlNJWkUsIDB4MDIpOwogCS8qIHJlc2V0IHRoZSByaXJiIGh3IHdyaXRlIHBvaW50ZXIgKi8KIAlhenhfd3JpdGV3KGNoaXAsIFJJUkJXUCwgSUNINl9SQlJXUF9DTFIpOwogCS8qIHNldCBOPTEsIGdldCBSSVJCIHJlc3BvbnNlIGludGVycnVwdCBmb3IgbmV3IGVudHJ5ICovCkBAIC01OTYsNyArNjQxLDcgQEAKIAlpbnQgaTsKIAogCS8qIGRpc2FibGUgaW50ZXJydXB0cyBpbiBzdHJlYW0gZGVzY3JpcHRvciAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSUNINl9ERVY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3RyZWFtczsgaSsrKSB7CiAJCWF6eF9kZXZfdCAqYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOwogCQlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX0NUTCwKIAkJCSAgICAgIGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9DVEwpICYgflNEX0lOVF9NQVNLKTsKQEAgLTYxNiw3ICs2NjEsNyBAQAogCWludCBpOwogCiAJLyogY2xlYXIgc3RyZWFtIHN0YXR1cyAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSUNINl9ERVY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3RyZWFtczsgaSsrKSB7CiAJCWF6eF9kZXZfdCAqYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOwogCQlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX1NUUywgU0RfSU5UX01BU0spOwogCX0KQEAgLTY4Niw4ICs3MzEsNyBAQAogCX0KIAogCS8qIEZvciBBVEkgU0I0NTAgYXphbGlhIEhEIGF1ZGlvLCB3ZSBuZWVkIHRvIGVuYWJsZSBzbm9vcCAqLwotCWlmIChjaGlwLT5wY2ktPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FUSSAmJiAKLQkgICAgY2hpcC0+cGNpLT5kZXZpY2UgPT0gQVRJX1NCNDUwX0hEQVVESU9fUENJX0RFVklDRV9JRCkgeworCWlmIChjaGlwLT5kcml2ZXJfdHlwZSA9PSBBWlhfRFJJVkVSX0FUSSkgewogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShjaGlwLT5wY2ksIEFUSV9TQjQ1MF9IREFVRElPX01JU0NfQ05UUjJfQUREUiwgCiAJCQkJICAgICAmYXRpX21pc2NfY250bDIpOwogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBBVElfU0I0NTBfSERBVURJT19NSVNDX0NOVFIyX0FERFIsIApAQCAtNzE0LDcgKzc1OCw3IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAJCi0JZm9yIChpID0gMDsgaSA8IE1BWF9JQ0g2X0RFVjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKIAkJYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOwogCQlpZiAoc3RhdHVzICYgYXp4X2Rldi0+c2RfaW50X3N0YV9tYXNrKSB7CiAJCQlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX1NUUywgU0RfSU5UX01BU0spOwpAQCAtODc5LDkgKzkyMywxNSBAQAogLyogYXNzaWduIGEgc3RyZWFtIGZvciB0aGUgUENNICovCiBzdGF0aWMgaW5saW5lIGF6eF9kZXZfdCAqYXp4X2Fzc2lnbl9kZXZpY2UoYXp4X3QgKmNoaXAsIGludCBzdHJlYW0pCiB7Ci0JaW50IGRldiwgaTsKLQlkZXYgPSBzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IDQgOiAwOwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGRldisrKQorCWludCBkZXYsIGksIG51bXM7CisJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWRldiA9IGNoaXAtPnBsYXliYWNrX2luZGV4X29mZnNldDsKKwkJbnVtcyA9IGNoaXAtPnBsYXliYWNrX3N0cmVhbXM7CisJfSBlbHNlIHsKKwkJZGV2ID0gY2hpcC0+Y2FwdHVyZV9pbmRleF9vZmZzZXQ7CisJCW51bXMgPSBjaGlwLT5jYXB0dXJlX3N0cmVhbXM7CisJfQorCWZvciAoaSA9IDA7IGkgPCBudW1zOyBpKyssIGRldisrKQogCQlpZiAoISBjaGlwLT5henhfZGV2W2Rldl0ub3BlbmVkKSB7CiAJCQljaGlwLT5henhfZGV2W2Rldl0ub3BlbmVkID0gMTsKIAkJCXJldHVybiAmY2hpcC0+YXp4X2RldltkZXZdOwpAQCAtODk5LDggKzk0OSw4IEBACiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIC8qfCovCisJCQkJIC8qU05EUlZfUENNX0lORk9fUkVTVU1FKi8pLAogCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAogCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80ODAwMCwKIAkucmF0ZV9taW4gPQkJNDgwMDAsCkBAIC0xMDQ5LDYgKzEwOTksNyBAQAogCQlhenhfZGV2LT5ydW5uaW5nID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CiAJCWF6eF9zdHJlYW1fc3RvcChjaGlwLCBhenhfZGV2KTsKIAkJYXp4X2Rldi0+cnVubmluZyA9IDA7CkBAIC0xMDU4LDYgKzExMDksNyBAQAogCX0KIAlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCWlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSCB8fAorCSAgICBjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORCB8fAogCSAgICBjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RPUCkgewogCQlpbnQgdGltZW91dCA9IDUwMDA7CiAJCXdoaWxlIChhenhfc2RfcmVhZGIoYXp4X2RldiwgU0RfQ1RMKSAmIFNEX0NUTF9ETUFfU1RBUlQgJiYgLS10aW1lb3V0KQpAQCAtMTEzNiw2ICsxMTg4LDcgQEAKIAkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAogCQkJCQkgICAgICAxMDI0ICogNjQsIDEwMjQgKiAxMjgpOwogCWNoaXAtPnBjbVtwY21fZGV2XSA9IHBjbTsKKwljaGlwLT5wY21fZGV2cyA9IHBjbV9kZXYgKyAxOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTg2LDcgKzEyMzksNyBAQAogCS8qIGluaXRpYWxpemUgZWFjaCBzdHJlYW0gKGFrYSBkZXZpY2UpCiAJICogYXNzaWduIHRoZSBzdGFydGluZyBiZGwgYWRkcmVzcyB0byBlYWNoIHN0cmVhbSAoZGV2aWNlKSBhbmQgaW5pdGlhbGl6ZQogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSUNINl9ERVY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3RyZWFtczsgaSsrKSB7CiAJCXVuc2lnbmVkIGludCBvZmYgPSBzaXplb2YodTMyKSAqIChpICogQVpYX01BWF9GUkFHICogNCk7CiAJCWF6eF9kZXZfdCAqYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOwogCQlhenhfZGV2LT5iZGwgPSAodTMyICopKGNoaXAtPmJkbC5hcmVhICsgb2ZmKTsKQEAgLTEyNDUsNyArMTI5OCw3IEBACiAJaWYgKGNoaXAtPmluaXRpYWxpemVkKSB7CiAJCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhfSUNINl9ERVY7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspCiAJCQlhenhfc3RyZWFtX3N0b3AoY2hpcCwgJmNoaXAtPmF6eF9kZXZbaV0pOwogCiAJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwpAQCAtMTI2MSwxMCArMTMxNCwxMCBAQAogCiAJCS8qIHdhaXQgYSBsaXR0bGUgZm9yIGludGVycnVwdHMgdG8gZmluaXNoICovCiAJCW1zbGVlcCgxKTsKLQotCQlpb3VubWFwKGNoaXAtPnJlbWFwX2FkZHIpOwogCX0KIAorCWlmIChjaGlwLT5yZW1hcF9hZGRyKQorCQlpb3VubWFwKGNoaXAtPnJlbWFwX2FkZHIpOwogCWlmIChjaGlwLT5pcnEgPj0gMCkKIAkJZnJlZV9pcnEoY2hpcC0+aXJxLCAodm9pZCopY2hpcCk7CiAKQEAgLTEyNzYsNiArMTMyOSw3IEBACiAJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+cG9zYnVmKTsKIAlwY2lfcmVsZWFzZV9yZWdpb25zKGNoaXAtPnBjaSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CisJa2ZyZWUoY2hpcC0+YXp4X2Rldik7CiAJa2ZyZWUoY2hpcCk7CiAKIAlyZXR1cm4gMDsKQEAgLTEyOTAsNyArMTM0NCw4IEBACiAgKiBjb25zdHJ1Y3RvcgogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhenhfY3JlYXRlKHNuZF9jYXJkX3QgKmNhcmQsIHN0cnVjdCBwY2lfZGV2ICpwY2ksCi0JCQkJaW50IHBvc2ZpeCwgYXp4X3QgKipyY2hpcCkKKwkJCQlpbnQgcG9zZml4LCBpbnQgZHJpdmVyX3R5cGUsCisJCQkJYXp4X3QgKipyY2hpcCkKIHsKIAlhenhfdCAqY2hpcDsKIAlpbnQgZXJyID0gMDsKQEAgLTEzMTYsOSArMTM3MSwyMCBAQAogCWNoaXAtPmNhcmQgPSBjYXJkOwogCWNoaXAtPnBjaSA9IHBjaTsKIAljaGlwLT5pcnEgPSAtMTsKKwljaGlwLT5kcml2ZXJfdHlwZSA9IGRyaXZlcl90eXBlOwogCiAJY2hpcC0+cG9zaXRpb25fZml4ID0gcG9zZml4OwogCisjaWYgQklUU19QRVJfTE9ORyAhPSA2NAorCS8qIEZpeCB1cCBiYXNlIGFkZHJlc3Mgb24gVUxJIE01NDYxICovCisJaWYgKGNoaXAtPmRyaXZlcl90eXBlID09IEFaWF9EUklWRVJfVUxJKSB7CisJCXUxNiB0bXAzOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIDB4NDAsICZ0bXAzKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgMHg0MCwgdG1wMyB8IDB4MTApOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaSwgUENJX0JBU0VfQUREUkVTU18xLCAwKTsKKwl9CisjZW5kaWYKKwogCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksICJJQ0ggSEQgYXVkaW8iKSkgPCAwKSB7CiAJCWtmcmVlKGNoaXApOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKQEAgLTEzNDQsMTYgKzE0MTAsMzcgQEAKIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOwogCisJc3dpdGNoIChjaGlwLT5kcml2ZXJfdHlwZSkgeworCWNhc2UgQVpYX0RSSVZFUl9VTEk6CisJCWNoaXAtPnBsYXliYWNrX3N0cmVhbXMgPSBVTElfTlVNX1BMQVlCQUNLOworCQljaGlwLT5jYXB0dXJlX3N0cmVhbXMgPSBVTElfTlVNX0NBUFRVUkU7CisJCWNoaXAtPnBsYXliYWNrX2luZGV4X29mZnNldCA9IFVMSV9QTEFZQkFDS19JTkRFWDsKKwkJY2hpcC0+Y2FwdHVyZV9pbmRleF9vZmZzZXQgPSBVTElfQ0FQVFVSRV9JTkRFWDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2hpcC0+cGxheWJhY2tfc3RyZWFtcyA9IElDSDZfTlVNX1BMQVlCQUNLOworCQljaGlwLT5jYXB0dXJlX3N0cmVhbXMgPSBJQ0g2X05VTV9DQVBUVVJFOworCQljaGlwLT5wbGF5YmFja19pbmRleF9vZmZzZXQgPSBJQ0g2X1BMQVlCQUNLX0lOREVYOworCQljaGlwLT5jYXB0dXJlX2luZGV4X29mZnNldCA9IElDSDZfQ0FQVFVSRV9JTkRFWDsKKwkJYnJlYWs7CisJfQorCWNoaXAtPm51bV9zdHJlYW1zID0gY2hpcC0+cGxheWJhY2tfc3RyZWFtcyArIGNoaXAtPmNhcHR1cmVfc3RyZWFtczsKKwljaGlwLT5henhfZGV2ID0ga2NhbGxvYyhjaGlwLT5udW1fc3RyZWFtcywgc2l6ZW9mKCpjaGlwLT5henhfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEgY2hpcC0+YXp4X2RldikgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWFsbG9jIGF6eF9kZXZcbiIpOworCQlnb3RvIGVycm91dDsKKwl9CisKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBCREwgZm9yIGVhY2ggc3RyZWFtICovCiAJaWYgKChlcnIgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAotCQkJCSAgICAgICBQQUdFX1NJWkUsICZjaGlwLT5iZGwpKSA8IDApIHsKKwkJCQkgICAgICAgQkRMX1NJWkUsICZjaGlwLT5iZGwpKSA8IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggImNhbm5vdCBhbGxvY2F0ZSBCRExcbiIpOwogCQlnb3RvIGVycm91dDsKIAl9CiAJaWYgKGNoaXAtPnBvc2l0aW9uX2ZpeCA9PSBQT1NfRklYX1BPU0JVRikgewogCQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KIAkJaWYgKChlcnIgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAotCQkJCQkgICAgICAgTUFYX0lDSDZfREVWICogOCwgJmNoaXAtPnBvc2J1ZikpIDwgMCkgeworCQkJCQkgICAgICAgY2hpcC0+bnVtX3N0cmVhbXMgKiA4LCAmY2hpcC0+cG9zYnVmKSkgPCAwKSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiY2Fubm90IGFsbG9jYXRlIHBvc2J1ZlxuIik7CiAJCQlnb3RvIGVycm91dDsKIAkJfQpAQCAtMTM4Miw2ICsxNDY5LDEwIEBACiAJCWdvdG8gZXJyb3V0OwogCX0KIAorCXN0cmNweShjYXJkLT5kcml2ZXIsICJIREEtSW50ZWwiKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCBkcml2ZXJfc2hvcnRfbmFtZXNbY2hpcC0+ZHJpdmVyX3R5cGVdKTsKKwlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHggaXJxICVpIiwgY2FyZC0+c2hvcnRuYW1lLCBjaGlwLT5hZGRyLCBjaGlwLT5pcnEpOworCiAJKnJjaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIApAQCAtMTQxMCwxNSArMTUwMSwxMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpZiAoKGVyciA9IGF6eF9jcmVhdGUoY2FyZCwgcGNpLCBwb3NpdGlvbl9maXhbZGV2XSwgJmNoaXApKSA8IDApIHsKKwlpZiAoKGVyciA9IGF6eF9jcmVhdGUoY2FyZCwgcGNpLCBwb3NpdGlvbl9maXhbZGV2XSwgcGNpX2lkLT5kcml2ZXJfZGF0YSwKKwkJCSAgICAgICZjaGlwKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc3RyY3B5KGNhcmQtPmRyaXZlciwgIkhEQS1JbnRlbCIpOwotCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJIREEgSW50ZWwiKTsKLQlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHggaXJxICVpIiwgY2FyZC0+c2hvcnRuYW1lLCBjaGlwLT5hZGRyLCBjaGlwLT5pcnEpOwotCiAJLyogY3JlYXRlIGNvZGVjIGluc3RhbmNlcyAqLwogCWlmICgoZXJyID0gYXp4X2NvZGVjX2NyZWF0ZShjaGlwLCBtb2RlbFtkZXZdKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CkBAIC0xNDU5LDEyICsxNTQ3LDEzIEBACiAKIC8qIFBDSSBJRHMgKi8KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhenhfaWRzW10gPSB7Ci0JeyAweDgwODYsIDB4MjY2OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LCAvKiBJQ0g2ICovCi0JeyAweDgwODYsIDB4MjdkOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LCAvKiBJQ0g3ICovCi0JeyAweDgwODYsIDB4MjY5YSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LCAvKiBFU0IyICovCi0JeyAweDEwMDIsIDB4NDM3YiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LCAvKiBBVEkgU0I0NTAgKi8KLQl7IDB4MTEwNiwgMHgzMjg4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sIC8qIFZJQSBWVDgyNTEvVlQ4MjM3QSAqLwotCXsgMHgxMGI5LCAweDU0NjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwgLyogQUxJIDU0NjE/ICovCisJeyAweDgwODYsIDB4MjY2OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9JQ0ggfSwgLyogSUNINiAqLworCXsgMHg4MDg2LCAweDI3ZDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFaWF9EUklWRVJfSUNIIH0sIC8qIElDSDcgKi8KKwl7IDB4ODA4NiwgMHgyNjlhLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBWlhfRFJJVkVSX0lDSCB9LCAvKiBFU0IyICovCisJeyAweDEwMDIsIDB4NDM3YiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVEkgfSwgLyogQVRJIFNCNDUwICovCisJeyAweDExMDYsIDB4MzI4OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9WSUEgfSwgLyogVklBIFZUODI1MS9WVDgyMzdBICovCisJeyAweDEwMzksIDB4NzUwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9TSVMgfSwgLyogU0lTOTY2ICovCisJeyAweDEwYjksIDB4NTQ2MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9VTEkgfSwgLyogVUxJIE01NDYxICovCiAJeyAwLCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGF6eF9pZHMpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfcGF0Y2guaCBiL3NvdW5kL3BjaS9oZGEvaGRhX3BhdGNoLmgKaW5kZXggYTVkZTY4NC4uYWNhZWYzYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfcGF0Y2guaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9wYXRjaC5oCkBAIC0xMCwxMSArMTAsMTQgQEAKIGV4dGVybiBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF9hbmFsb2dbXTsKIC8qIFNpZ21hVGVsIGNvZGVjcyAqLwogZXh0ZXJuIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X3NpZ21hdGVsW107CisvKiBTaUxhYnMgMzA1NC8zMDU1IG1vZGVtIGNvZGVjcyAqLworZXh0ZXJuIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X3NpMzA1NFtdOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgKmhkYV9wcmVzZXRfdGFibGVzW10gPSB7CiAJc25kX2hkYV9wcmVzZXRfcmVhbHRlaywKIAlzbmRfaGRhX3ByZXNldF9jbWVkaWEsCiAJc25kX2hkYV9wcmVzZXRfYW5hbG9nLAogCXNuZF9oZGFfcHJlc2V0X3NpZ21hdGVsLAorCXNuZF9oZGFfcHJlc2V0X3NpMzA1NCwKIAlOVUxMCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKaW5kZXggMmZkMDViYi4uYmNlYjgzYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCkBAIC01NzIsNyArNTcyLDcgQEAKIAl9LAogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIklFQzk1OCBQbGF5YmFjayBSb3V0ZSIsCisJCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLE5PTkUpICJSb3V0ZSIsCiAJCS5pbmZvID0gYWQxOTgzX3NwZGlmX3JvdXRlX2luZm8sCiAJCS5nZXQgPSBhZDE5ODNfc3BkaWZfcm91dGVfZ2V0LAogCQkucHV0ID0gYWQxOTgzX3NwZGlmX3JvdXRlX3B1dCwKQEAgLTcwNSw3ICs3MDUsNyBAQAogCS8qIGlkZW50aWNhbCB3aXRoIEFEMTk4MyAqLwogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIklFQzk1OCBQbGF5YmFjayBSb3V0ZSIsCisJCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLE5PTkUpICJSb3V0ZSIsCiAJCS5pbmZvID0gYWQxOTgzX3NwZGlmX3JvdXRlX2luZm8sCiAJCS5nZXQgPSBhZDE5ODNfc3BkaWZfcm91dGVfZ2V0LAogCQkucHV0ID0gYWQxOTgzX3NwZGlmX3JvdXRlX3B1dCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jCmluZGV4IDg2ZjE5NWYuLjA3ZmI0ZjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYwpAQCAtNjQ3LDYgKzY0Nyw3IEBACiAJeyAubW9kZWxuYW1lID0gIm1pbl9mcCIsIC5jb25maWcgPSBDTUlfTUlOX0ZQIH0sCiAJeyAubW9kZWxuYW1lID0gImZ1bGwiLCAuY29uZmlnID0gQ01JX0ZVTEwgfSwKIAl7IC5tb2RlbG5hbWUgPSAiZnVsbF9kaWciLCAuY29uZmlnID0gQ01JX0ZVTExfRElHIH0sCisJeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDgxM2QsIC5jb25maWcgPSBDTUlfRlVMTF9ESUcgfSwgLyogQVNVUyBQNUFEMiAqLwogCXsgLm1vZGVsbmFtZSA9ICJhbGxvdXQiLCAuY29uZmlnID0gQ01JX0FMTE9VVCB9LAogCXsgLm1vZGVsbmFtZSA9ICJhdXRvIiwgLmNvbmZpZyA9IENNSV9BVVRPIH0sCiAJe30gLyogdGVybWluYXRvciAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwppbmRleCA5Yjg1Njk5Li5lZWI5MDBhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwpAQCAtNjg3LDYgKzY4NywxMiBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKKy8qIGFkZGl0aW9uYWwgbWl4ZXJzIHRvIGFsYzg4MF9hc3VzX21peGVyICovCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IGFsYzg4MF9wY2JlZXBfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OwogCiAvKgogICogYnVpbGQgY29udHJvbCBlbGVtZW50cwpAQCAtMTUyNCw2ICsxNTMwLDcgQEAKIAkvKiBCYWNrIDMgamFjayBwbHVzIDEgU1BESUYgb3V0IGphY2ssIGZyb250IDIgamFjayAqLwogCXsgLm1vZGVsbmFtZSA9ICIzc3RhY2stZGlnb3V0IiwgLmNvbmZpZyA9IEFMQzg4MF8zU1RfRElHIH0sCiAJeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUzMDgsIC5jb25maWcgPSBBTEM4ODBfM1NUX0RJRyB9LAorCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMjUsIC5wY2lfc3ViZGV2aWNlID0gMHgwMDcwLCAuY29uZmlnID0gQUxDODgwXzNTVF9ESUcgfSwKIAogCS8qIEJhY2sgMyBqYWNrIHBsdXMgMSBTUERJRiBvdXQgamFjaywgZnJvbnQgMiBqYWNrIChJbnRlcm5hbCBhZGQgQXV4LUluKSovCiAJeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUzMDUsIC5jb25maWcgPSBBTEM4ODBfM1NUX0RJRyB9LApAQCAtMTczNCw3ICsxNzQxLDcgQEAKIAkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCiAJfSwKIAlbQUxDODgwX1VOSVdJTExfRElHXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgwX2FzdXNfbWl4ZXIgfSwKKwkJLm1peGVycyA9IHsgYWxjODgwX2FzdXNfbWl4ZXIsIGFsYzg4MF9wY2JlZXBfbWl4ZXIgfSwKIAkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywgYWxjODgwX3Bpbl9hc3VzX2luaXRfdmVyYnMgfSwKIAkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19kYWNfbmlkcyksCiAJCS5kYWNfbmlkcyA9IGFsYzg4MF9hc3VzX2RhY19uaWRzLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaTMwNTQuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2kzMDU0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyNzBkMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2kzMDU0LmMKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBVbml2ZXJzYWwgSW50ZXJmYWNlIGZvciBJbnRlbCBIaWdoIERlZmluaXRpb24gQXVkaW8gQ29kZWMKKyAqCisgKiBIRCBhdWRpbyBpbnRlcmZhY2UgcGF0Y2ggZm9yIFNpbGljb24gTGFicyAzMDU0LzUgbW9kZW0gY29kZWMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU2FzaGEgS2hhcHlvcnNreSA8c2FzaGFrQHNtbGluay5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlICJoZGFfY29kZWMuaCIKKyNpbmNsdWRlICJoZGFfbG9jYWwuaCIKKworCisvKiBzaTMwNTQgdmVyYnMgKi8KKyNkZWZpbmUgU0kzMDU0X1ZFUkJfUkVBRF9OT0RFICAweDkwMAorI2RlZmluZSBTSTMwNTRfVkVSQl9XUklURV9OT0RFIDB4MTAwCisKKy8qIHNpMzA1NCBub2RlcyAocmVnaXN0ZXJzKSAqLworI2RlZmluZSBTSTMwNTRfRVhURU5ERURfTUlEICAgIDIKKyNkZWZpbmUgU0kzMDU0X0xJTkVfUkFURSAgICAgICAzCisjZGVmaW5lIFNJMzA1NF9MSU5FX0xFVkVMICAgICAgNAorI2RlZmluZSBTSTMwNTRfR1BJT19DRkcgICAgICAgIDUKKyNkZWZpbmUgU0kzMDU0X0dQSU9fUE9MQVJJVFkgICA2CisjZGVmaW5lIFNJMzA1NF9HUElPX1NUSUNLWSAgICAgNworI2RlZmluZSBTSTMwNTRfR1BJT19XQUtFVVAgICAgIDgKKyNkZWZpbmUgU0kzMDU0X0dQSU9fU1RBVFVTICAgICA5CisjZGVmaW5lIFNJMzA1NF9HUElPX0NPTlRST0wgICAxMAorI2RlZmluZSBTSTMwNTRfTUlTQ19BRkUgICAgICAgMTEKKyNkZWZpbmUgU0kzMDU0X0NISVBJRCAgICAgICAgIDEyCisjZGVmaW5lIFNJMzA1NF9MSU5FX0NGRzEgICAgICAxMworI2RlZmluZSBTSTMwNTRfTElORV9TVEFUVVMgICAgMTQKKyNkZWZpbmUgU0kzMDU0X0RDX1RFUk1JTkFUSU9OIDE1CisjZGVmaW5lIFNJMzA1NF9MSU5FX0NPTkZJRyAgICAxNgorI2RlZmluZSBTSTMwNTRfQ0FMTFBST0dfQVRUICAgMTcKKyNkZWZpbmUgU0kzMDU0X1NRX0NPTlRST0wgICAgIDE4CisjZGVmaW5lIFNJMzA1NF9NSVNDX0NPTlRST0wgICAxOQorI2RlZmluZSBTSTMwNTRfUklOR19DVFJMMSAgICAgMjAKKyNkZWZpbmUgU0kzMDU0X1JJTkdfQ1RSTDIgICAgIDIxCisKKy8qIGV4dGVuZGVkIE1JRCAqLworI2RlZmluZSBTSTMwNTRfTUVJX1JFQURZIDB4ZgorCisvKiBsaW5lIGxldmVsICovCisjZGVmaW5lIFNJMzA1NF9BVEFHX01BU0sgMHgwMGYwCisjZGVmaW5lIFNJMzA1NF9EVEFHX01BU0sgMHhmMDAwCisKKy8qIEdQSU8gYml0cyAqLworI2RlZmluZSBTSTMwNTRfR1BJT19PSCAgICAweDAwMDEKKyNkZWZpbmUgU0kzMDU0X0dQSU9fQ0lEICAgMHgwMDAyCisKKy8qIGNoaXBpZCBhbmQgcmV2aXNpb25zICovCisjZGVmaW5lIFNJMzA1NF9DSElQSURfQ09ERUNfUkVWX01BU0sgMHgwMDBmCisjZGVmaW5lIFNJMzA1NF9DSElQSURfREFBX1JFVl9NQVNLICAgMHgwMGYwCisjZGVmaW5lIFNJMzA1NF9DSElQSURfSU5URVJOQVRJT05BTCAgMHgwMTAwCisjZGVmaW5lIFNJMzA1NF9DSElQSURfREFBX0lEICAgICAgICAgMHgwZjAwCisjZGVmaW5lIFNJMzA1NF9DSElQSURfQ09ERUNfSUQgICAgICAoMTw8MTIpCisKKy8qIHNpMzA1NCBjb2RlYyByZWdpc3RlcnMgKG5vZGVzKSBhY2Nlc3MgbWFjcm9zICovCisjZGVmaW5lIEdFVF9SRUcoY29kZWMscmVnKSAoc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLHJlZywwLFNJMzA1NF9WRVJCX1JFQURfTk9ERSwwKSkKKyNkZWZpbmUgU0VUX1JFRyhjb2RlYyxyZWcsdmFsKSAoc25kX2hkYV9jb2RlY193cml0ZShjb2RlYyxyZWcsMCxTSTMwNTRfVkVSQl9XUklURV9OT0RFLHZhbCkpCisKKworc3RydWN0IHNpMzA1NF9zcGVjIHsKKwl1bnNpZ25lZCBpbnRlcm5hdGlvbmFsOworCXN0cnVjdCBoZGFfcGNtIHBjbTsKK307CisKKworLyoKKyAqIE1vZGVtIG1peGVyCisgKi8KKworI2RlZmluZSBQUklWQVRFX1ZBTFVFKHJlZyxtYXNrKSAoKHJlZzw8MTYpfChtYXNrJjB4ZmZmZikpCisjZGVmaW5lIFBSSVZBVEVfUkVHKHZhbCkgKCh2YWw+PjE2KSYweGZmZmYpCisjZGVmaW5lIFBSSVZBVEVfTUFTSyh2YWwpICh2YWwmMHhmZmZmKQorCitzdGF0aWMgaW50IHNpMzA1NF9zd2l0Y2hfaW5mbyhzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsCisJCSAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpMzA1NF9zd2l0Y2hfZ2V0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwKKwkJICAgICAgICAgICAgICAgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnV2YWx1ZSkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1MTYgcmVnICA9IFBSSVZBVEVfUkVHKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwl1MTYgbWFzayA9IFBSSVZBVEVfTUFTSyhrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJdXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKEdFVF9SRUcoY29kZWMsIHJlZykpICYgbWFzayA/IDEgOiAwIDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaTMwNTRfc3dpdGNoX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsCisJCSAgICAgICAgICAgICAgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1dmFsdWUpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdTE2IHJlZyAgPSBQUklWQVRFX1JFRyhrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJdTE2IG1hc2sgPSBQUklWQVRFX01BU0soa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCWlmICh1dmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCVNFVF9SRUcoY29kZWMsIHJlZywgKEdFVF9SRUcoY29kZWMsIHJlZykpIHwgbWFzayk7CisJZWxzZQorCQlTRVRfUkVHKGNvZGVjLCByZWcsIChHRVRfUkVHKGNvZGVjLCByZWcpKSAmIH5tYXNrKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBTSTMwNTRfS0NPTlRST0woa25hbWUscmVnLG1hc2spIHsgXAorCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCisJLm5hbWUgPSBrbmFtZSwgXAorCS5pbmZvID0gc2kzMDU0X3N3aXRjaF9pbmZvLCBcCisJLmdldCAgPSBzaTMwNTRfc3dpdGNoX2dldCwgXAorCS5wdXQgID0gc2kzMDU0X3N3aXRjaF9wdXQsIFwKKwkucHJpdmF0ZV92YWx1ZSA9IFBSSVZBVEVfVkFMVUUocmVnLG1hc2spLCBcCit9CisJCQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNpMzA1NF9tb2RlbV9taXhlcltdID0geworCVNJMzA1NF9LQ09OVFJPTCgiT2ZmLWhvb2sgU3dpdGNoIiwgU0kzMDU0X0dQSU9fQ09OVFJPTCwgU0kzMDU0X0dQSU9fT0gpLAorCVNJMzA1NF9LQ09OVFJPTCgiQ2FsbGVyIElEIFN3aXRjaCIsIFNJMzA1NF9HUElPX0NPTlRST0wsIFNJMzA1NF9HUElPX0NJRCksCisJe30KK307CisKK3N0YXRpYyBpbnQgc2kzMDU0X2J1aWxkX2NvbnRyb2xzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBzbmRfaGRhX2FkZF9uZXdfY3Rscyhjb2RlYywgc2kzMDU0X21vZGVtX21peGVyKTsKK30KKworCisvKgorICogUENNIGNhbGxiYWNrcworICovCisKK3N0YXRpYyBpbnQgc2kzMDU0X3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkgICAgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAorCQkJICAgICAgdW5zaWduZWQgaW50IGZvcm1hdCwKKwkJCSAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwl1MTYgdmFsOworCisJU0VUX1JFRyhjb2RlYywgU0kzMDU0X0xJTkVfUkFURSwgc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKTsKKwl2YWwgPSBHRVRfUkVHKGNvZGVjLCBTSTMwNTRfTElORV9MRVZFTCk7CisJdmFsICY9IDB4ZmYgPDwgKDggKiAoc3Vic3RyZWFtLT5zdHJlYW0gIT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykpOworCXZhbCB8PSAoKHN0cmVhbV90YWcgJiAweGYpIDw8IDQpIDw8ICg4ICogKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spKTsKKwlTRVRfUkVHKGNvZGVjLCBTSTMwNTRfTElORV9MRVZFTCwgdmFsKTsKKworCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBoaW5mby0+bmlkLAorCQkJCSAgIHN0cmVhbV90YWcsIDAsIGZvcm1hdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2kzMDU0X3BjbV9vcGVuKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgICBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc3RhdGljIHVuc2lnbmVkIGludCByYXRlc1tdID0geyA4MDAwLCA5NjAwLCAxNjAwMCB9OworCXN0YXRpYyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdF90IGh3X2NvbnN0cmFpbnRzX3JhdGVzID0geworCQkuY291bnQgPSBBUlJBWV9TSVpFKHJhdGVzKSwKKwkJLmxpc3QgPSByYXRlcywKKwkJLm1hc2sgPSAwLAorCX07CisJc3Vic3RyZWFtLT5ydW50aW1lLT5ody5wZXJpb2RfYnl0ZXNfbWluID0gODA7CisJcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHN1YnN0cmVhbS0+cnVudGltZSwgMCwKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAmaHdfY29uc3RyYWludHNfcmF0ZXMpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gc2kzMDU0X3BjbSA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDEsCisJLmNoYW5uZWxzX21heCA9IDEsCisJLm5pZCA9IDB4MSwKKwkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwfFNORFJWX1BDTV9SQVRFXzE2MDAwfFNORFJWX1BDTV9SQVRFX0tOT1QsCisJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkubWF4YnBzID0gMTYsCisJLm9wcyA9IHsKKwkJLm9wZW4gPSBzaTMwNTRfcGNtX29wZW4sCisJCS5wcmVwYXJlID0gc2kzMDU0X3BjbV9wcmVwYXJlLAorCX0sCit9OworCisKK3N0YXRpYyBpbnQgc2kzMDU0X2J1aWxkX3BjbXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNpMzA1NF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGhkYV9wY20gKmluZm8gPSAmc3BlYy0+cGNtOworCXNpMzA1NF9wY20ubmlkID0gY29kZWMtPm1mZzsKKwljb2RlYy0+bnVtX3BjbXMgPSAxOworCWNvZGVjLT5wY21faW5mbyA9IGluZm87CisJaW5mby0+bmFtZSA9ICJTaTMwNTQgTW9kZW0iOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IHNpMzA1NF9wY207CisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gID0gc2kzMDU0X3BjbTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogSW5pdCBwYXJ0CisgKi8KKworc3RhdGljIGludCBzaTMwNTRfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc2kzMDU0X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1bnNpZ25lZCB3YWl0X2NvdW50OworCXUxNiB2YWw7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBBQ19OT0RFX1JPT1QsIDAsIEFDX1ZFUkJfU0VUX0NPREVDX1JFU0VULCAwKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+bWZnLCAwLCBBQ19WRVJCX1NFVF9TVFJFQU1fRk9STUFULCAwKTsKKwlTRVRfUkVHKGNvZGVjLCBTSTMwNTRfTElORV9SQVRFLCA5NjAwKTsKKwlTRVRfUkVHKGNvZGVjLCBTSTMwNTRfTElORV9MRVZFTCwgU0kzMDU0X0RUQUdfTUFTS3xTSTMwNTRfQVRBR19NQVNLKTsKKwlTRVRfUkVHKGNvZGVjLCBTSTMwNTRfRVhURU5ERURfTUlELCAwKTsKKworCXdhaXRfY291bnQgPSAxMDsKKwlkbyB7CisJCW1zbGVlcCgyKTsKKwkJdmFsID0gR0VUX1JFRyhjb2RlYywgU0kzMDU0X0VYVEVOREVEX01JRCk7CisJfSB3aGlsZSAoKHZhbCAmIFNJMzA1NF9NRUlfUkVBRFkpICE9IFNJMzA1NF9NRUlfUkVBRFkgJiYgd2FpdF9jb3VudC0tKTsKKworCWlmKCh2YWwmU0kzMDU0X01FSV9SRUFEWSkgIT0gU0kzMDU0X01FSV9SRUFEWSkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzaTMwNTQ6IGNhbm5vdCBpbml0aWFsaXplLiBFWFQgTUlEID0gJTA0eFxuIiwgdmFsKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJU0VUX1JFRyhjb2RlYywgU0kzMDU0X0dQSU9fUE9MQVJJVFksIDB4ZmZmZik7CisJU0VUX1JFRyhjb2RlYywgU0kzMDU0X0dQSU9fQ0ZHLCAweDApOworCVNFVF9SRUcoY29kZWMsIFNJMzA1NF9NSVNDX0FGRSwgMCk7CisJU0VUX1JFRyhjb2RlYywgU0kzMDU0X0xJTkVfQ0ZHMSwweDIwMCk7CisKKwlpZigoR0VUX1JFRyhjb2RlYyxTSTMwNTRfTElORV9TVEFUVVMpICYgKDE8PDYpKSA9PSAwKSB7CisJCXNuZF9wcmludGQoIkxpbmsgRnJhbWUgRGV0ZWN0KEZEVCkgaXMgbm90IHJlYWR5IChsaW5lIHN0YXR1czogJTA0eClcbiIsCisJCQkJR0VUX1JFRyhjb2RlYyxTSTMwNTRfTElORV9TVEFUVVMpKTsKKwl9CisKKwlzcGVjLT5pbnRlcm5hdGlvbmFsID0gR0VUX1JFRyhjb2RlYywgU0kzMDU0X0NISVBJRCkgJiBTSTMwNTRfQ0hJUElEX0lOVEVSTkFUSU9OQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2kzMDU0X2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJa2ZyZWUoY29kZWMtPnNwZWMpOworfQorCisKKy8qCisgKi8KKworc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfb3BzIHNpMzA1NF9wYXRjaF9vcHMgPSB7CisJLmJ1aWxkX2NvbnRyb2xzID0gc2kzMDU0X2J1aWxkX2NvbnRyb2xzLAorCS5idWlsZF9wY21zID0gc2kzMDU0X2J1aWxkX3BjbXMsCisJLmluaXQgPSBzaTMwNTRfaW5pdCwKKwkuZnJlZSA9IHNpMzA1NF9mcmVlLAorI2lmZGVmIENPTkZJR19QTQorCS8vLnN1c3BlbmQgPSBzaTMwNTRfc3VzcGVuZCwKKwkucmVzdW1lID0gc2kzMDU0X2luaXQsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfc2kzMDU0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzaTMwNTRfc3BlYyAqc3BlYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNwZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY29kZWMtPnNwZWMgPSBzcGVjOworCWNvZGVjLT5wYXRjaF9vcHMgPSBzaTMwNTRfcGF0Y2hfb3BzOworCXJldHVybiAwOworfQorCisvKgorICogcGF0Y2ggZW50cmllcworICovCitzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF9zaTMwNTRbXSA9IHsKKyAJeyAuaWQgPSAweDE2M2MzMTU1LCAubmFtZSA9ICJTaTMwNTQiLCAucGF0Y2ggPSBwYXRjaF9zaTMwNTQgfSwKKwl7fQorfTsKKwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMKaW5kZXggZWIyMGY3My4uMzlmYmU2NiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5jCkBAIC02MTgsMTUgKzYxOCwxNSBAQAogICovCiAKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfZGVsdGExMDEwX3dvcmRjbG9ja19zZWxlY3QgX19kZXZpbml0ZGF0YSA9Ci1JQ0UxNzEyX0dQSU8oU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLCAiV29yZCBDbG9jayBTeW5jIiwgMCwgSUNFMTcxMl9ERUxUQV9XT1JEX0NMT0NLX1NFTEVDVCwgMSwgMCk7CitJQ0UxNzEyX0dQSU8oU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsICJXb3JkIENsb2NrIFN5bmMiLCAwLCBJQ0UxNzEyX0RFTFRBX1dPUkRfQ0xPQ0tfU0VMRUNULCAxLCAwKTsKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfZGVsdGExMDEwbHRfd29yZGNsb2NrX3NlbGVjdCBfX2RldmluaXRkYXRhID0KLUlDRTE3MTJfR1BJTyhTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sICJXb3JkIENsb2NrIFN5bmMiLCAwLCBJQ0UxNzEyX0RFTFRBXzEwMTBMVF9XT1JEQ0xPQ0ssIDEsIDApOworSUNFMTcxMl9HUElPKFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAiV29yZCBDbG9jayBTeW5jIiwgMCwgSUNFMTcxMl9ERUxUQV8xMDEwTFRfV09SRENMT0NLLCAxLCAwKTsKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfZGVsdGExMDEwX3dvcmRjbG9ja19zdGF0dXMgX19kZXZpbml0ZGF0YSA9Ci1JQ0UxNzEyX0dQSU8oU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLCAiV29yZCBDbG9jayBTdGF0dXMiLCAwLCBJQ0UxNzEyX0RFTFRBX1dPUkRfQ0xPQ0tfU1RBVFVTLCAxLCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSk7CitJQ0UxNzEyX0dQSU8oU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsICJXb3JkIENsb2NrIFN0YXR1cyIsIDAsIElDRTE3MTJfREVMVEFfV09SRF9DTE9DS19TVEFUVVMsIDEsIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFKTsKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfZGVsdGFkaW8yNDk2X3NwZGlmX2luX3NlbGVjdCBfX2RldmluaXRkYXRhID0KLUlDRTE3MTJfR1BJTyhTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sICJJRUM5NTggSW5wdXQgT3B0aWNhbCIsIDAsIElDRTE3MTJfREVMVEFfU1BESUZfSU5QVVRfU0VMRUNULCAwLCAwKTsKK0lDRTE3MTJfR1BJTyhTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgIklFQzk1OCBJbnB1dCBPcHRpY2FsIiwgMCwgSUNFMTcxMl9ERUxUQV9TUERJRl9JTlBVVF9TRUxFQ1QsIDAsIDApOwogc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfaWNlMTcxMl9kZWx0YV9zcGRpZl9pbl9zdGF0dXMgX19kZXZpbml0ZGF0YSA9Ci1JQ0UxNzEyX0dQSU8oU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLCAiRGVsdGEgSUVDOTU4IElucHV0IFN0YXR1cyIsIDAsIElDRTE3MTJfREVMVEFfU1BESUZfSU5fU1RBVCwgMSwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUpOworSUNFMTcxMl9HUElPKFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAiRGVsdGEgSUVDOTU4IElucHV0IFN0YXR1cyIsIDAsIElDRTE3MTJfREVMVEFfU1BESUZfSU5fU1RBVCwgMSwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUpOwogCiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX2RlbHRhX2FkZF9jb250cm9scyhpY2UxNzEyX3QgKmljZSkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYwppbmRleCBhMjU0NWE1Li5iOTdmNTBkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCkBAIC0xNDIyLDcgKzE0MjIsNyBAQAogCiBzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9pY2UxNzEyX211bHRpX2NhcHR1cmVfc3BkaWZfc3dpdGNoIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLm5hbWUgPSAiSUVDOTU4IE11bHRpIENhcHR1cmUgU3dpdGNoIiwKKwkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiTXVsdGkgIixDQVBUVVJFLFNXSVRDSCksCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX2luZm8sCiAJLmdldCA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl9zd2l0Y2hfZ2V0LAogCS5wdXQgPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX3B1dCwKQEAgLTE0NDEsNyArMTQ0MSw3IEBACiAKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfbXVsdGlfY2FwdHVyZV9zcGRpZl92b2x1bWUgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkubmFtZSA9ICJJRUM5NTggTXVsdGkgQ2FwdHVyZSBWb2x1bWUiLAorCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJNdWx0aSAiLENBUFRVUkUsVk9MVU1FKSwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl92b2x1bWVfaW5mbywKIAkuZ2V0ID0gc25kX2ljZTE3MTJfcHJvX21peGVyX3ZvbHVtZV9nZXQsCiAJLnB1dCA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl92b2x1bWVfcHV0LApAQCAtMTcxNSw3ICsxNzE1LDcgQEAKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfc3BkaWZfbWFza2MgX19kZXZpbml0ZGF0YSA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAotCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKIAkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLENPTl9NQVNLKSwKIAkuaW5mbyA9CQlzbmRfaWNlMTcxMl9zcGRpZl9pbmZvLAogCS5nZXQgPQkJc25kX2ljZTE3MTJfc3BkaWZfbWFza2NfZ2V0LApAQCAtMTcyNCw3ICsxNzI0LDcgQEAKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX2ljZTE3MTJfc3BkaWZfbWFza3AgX19kZXZpbml0ZGF0YSA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAotCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKIAkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLFBST19NQVNLKSwKIAkuaW5mbyA9CQlzbmRfaWNlMTcxMl9zcGRpZl9pbmZvLAogCS5nZXQgPQkJc25kX2ljZTE3MTJfc3BkaWZfbWFza3BfZ2V0LApAQCAtMjIwMyw3ICsyMjAzLDcgQEAKIAogc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfaWNlMTcxMl9taXhlcl9wcm9fc3BkaWZfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkubmFtZSA9ICJJRUM5NTggUGxheWJhY2sgUm91dGUiLAorCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLE5PTkUpICJSb3V0ZSIsCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fcm91dGVfaW5mbywKIAkuZ2V0ID0gc25kX2ljZTE3MTJfcHJvX3JvdXRlX3NwZGlmX2dldCwKIAkucHV0ID0gc25kX2ljZTE3MTJfcHJvX3JvdXRlX3NwZGlmX3B1dCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwppbmRleCA3OWI1ZjEyLi5jN2FmNWU1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCkBAIC0xNDE0LDcgKzE0MTQsNyBAQAogc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfdnQxNzI0X3NwZGlmX21hc2tjIF9fZGV2aW5pdGRhdGEgPQogewogCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKLQkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxDT05fTUFTSyksCiAJLmluZm8gPQkJc25kX3Z0MTcyNF9zcGRpZl9pbmZvLAogCS5nZXQgPQkJc25kX3Z0MTcyNF9zcGRpZl9tYXNrY19nZXQsCkBAIC0xNDIzLDcgKzE0MjMsNyBAQAogc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzbmRfdnQxNzI0X3NwZGlmX21hc2twIF9fZGV2aW5pdGRhdGEgPQogewogCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKLQkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxQUk9fTUFTSyksCiAJLmluZm8gPQkJc25kX3Z0MTcyNF9zcGRpZl9pbmZvLAogCS5nZXQgPQkJc25kX3Z0MTcyNF9zcGRpZl9tYXNrcF9nZXQsCkBAIC0xNDY2LDcgKzE0NjYsNyBAQAogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS8qIEZJWE1FOiB0aGUgZm9sbG93aW5nIGNvbmZsaWN0IHdpdGggSUVDOTU4IFBsYXliYWNrIFJvdXRlICovCiAJLy8gLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxTV0lUQ0gpLAotCS5uYW1lID0gICAgICAgICAiSUVDOTU4IE91dHB1dCBTd2l0Y2giLAorCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIk91dHB1dCAiLE5PTkUsU1dJVENIKSwKIAkuaW5mbyA9CQlzbmRfdnQxNzI0X3NwZGlmX3N3X2luZm8sCiAJLmdldCA9CQlzbmRfdnQxNzI0X3NwZGlmX3N3X2dldCwKIAkucHV0ID0JCXNuZF92dDE3MjRfc3BkaWZfc3dfcHV0CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaW50ZWw4eDAuYyBiL3NvdW5kL3BjaS9pbnRlbDh4MC5jCmluZGV4IGQ3YWYzZTQuLjdiNTQ4NDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jCisrKyBiL3NvdW5kL3BjaS9pbnRlbDh4MC5jCkBAIC0zODksNiArMzg5LDcgQEAKIAlzdHJ1Y3QgYWM5N19wY20gKnBjbTsKIAlpbnQgcGNtX29wZW5fZmxhZzsKIAl1bnNpZ25lZCBpbnQgcGFnZV9hdHRyX2NoYW5nZWQ6IDE7CisJdW5zaWduZWQgaW50IHN1c3BlbmRlZDogMTsKIH0gaWNoZGV2X3Q7CiAKIHR5cGVkZWYgc3RydWN0IF9zbmRfaW50ZWw4eDAgaW50ZWw4eDBfdDsKQEAgLTg2MiwxMiArODYzLDE2IEBACiAJdW5zaWduZWQgbG9uZyBwb3J0ID0gaWNoZGV2LT5yZWdfb2Zmc2V0OwogCiAJc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCQlpY2hkZXYtPnN1c3BlbmRlZCA9IDA7CisJCS8qIGZhbGx0aHJ1ICovCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKIAkJdmFsID0gSUNIX0lPQ0UgfCBJQ0hfU1RBUlRCTTsKIAkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwkJaWNoZGV2LT5zdXNwZW5kZWQgPSAxOworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAkJdmFsID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgpAQCAtODk5LDkgKzkwNCwxMSBAQAogCiAJdmFsID0gaWdldGR3b3JkKGNoaXAsIElDSFJFRyhBTElfRE1BQ1IpKTsKIAlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCQlpY2hkZXYtPnN1c3BlbmRlZCA9IDA7CisJCS8qIGZhbGx0aHJ1ICovCiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CiAJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CiAJCQkvKiBjbGVhciBGSUZPIGZvciBzeW5jaHJvbml6YXRpb24gb2YgY2hhbm5lbHMgKi8KIAkJCWZpZm8gPSBpZ2V0ZHdvcmQoY2hpcCwgZmlmb3JlZ1tpY2hkZXYtPmFsaV9zbG90IC8gNF0pOwpAQCAtOTEzLDkgKzkyMCwxMSBAQAogCQl2YWwgJj0gfigxIDw8IChpY2hkZXYtPmFsaV9zbG90ICsgMTYpKTsgLyogY2xlYXIgUEFVU0UgZmxhZyAqLwogCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9ETUFDUiksIHZhbCB8ICgxIDw8IGljaGRldi0+YWxpX3Nsb3QpKTsgLyogc3RhcnQgRE1BICovCiAJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwkJaWNoZGV2LT5zdXNwZW5kZWQgPSAxOworCQkvKiBmYWxsdGhydSAqLwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgogCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9ETUFDUiksIHZhbCB8ICgxIDw8IChpY2hkZXYtPmFsaV9zbG90ICsgMTYpKSk7IC8qIHBhdXNlICovCiAJCWlwdXRieXRlKGNoaXAsIHBvcnQgKyBJQ0hfUkVHX09GRl9DUiwgMCk7CiAJCXdoaWxlIChpZ2V0Ynl0ZShjaGlwLCBwb3J0ICsgSUNIX1JFR19PRkZfQ1IpKQpAQCAtOTk0LDYgKzEwMDMsOCBAQAogewogCXVuc2lnbmVkIGludCBjbnQ7CiAJaW50IGRibCA9IHJ1bnRpbWUtPnJhdGUgPiA0ODAwMDsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKIAlzd2l0Y2ggKGNoaXAtPmRldmljZV90eXBlKSB7CiAJY2FzZSBERVZJQ0VfQUxJOgogCQljbnQgPSBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEFMSV9TQ1IpKTsKQEAgLTEwMzcsNiArMTA0OCw3IEBACiAJCWlwdXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9DTlQpLCBjbnQpOwogCQlicmVhazsKIAl9CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgc25kX2ludGVsOHgwX3BjbV9wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCkBAIC0xMDQ4LDE1ICsxMDYwLDEyIEBACiAJaWNoZGV2LT5waHlzYnVmID0gcnVudGltZS0+ZG1hX2FkZHI7CiAJaWNoZGV2LT5zaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CiAJaWNoZGV2LT5mcmFnc2l6ZSA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOwotCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKIAlpZiAoaWNoZGV2LT5pY2hkID09IElDSERfUENNT1VUKSB7CiAJCXNuZF9pbnRlbDh4MF9zZXR1cF9wY21fb3V0KGNoaXAsIHJ1bnRpbWUpOwotCQlpZiAoY2hpcC0+ZGV2aWNlX3R5cGUgPT0gREVWSUNFX0lOVEVMX0lDSDQpIHsKKwkJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0KQogCQkJaWNoZGV2LT5wb3Nfc2hpZnQgPSAocnVudGltZS0+c2FtcGxlX2JpdHMgPiAxNikgPyAyIDogMTsKLQkJfQogCX0KIAlzbmRfaW50ZWw4eDBfc2V0dXBfcGVyaW9kcyhjaGlwLCBpY2hkZXYpOwotCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xODE3LDYgKzE4MjYsMTggQEAKIAl9LAogCXsKIAkJLnN1YnZlbmRvciA9IDB4MTAzYywKKwkJLnN1YmRldmljZSA9IDB4MDkzNCwKKwkJLm5hbWUgPSAiSFAgbng4MjIwIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfTVVURV9MRUQKKwl9LAorCXsKKwkJLnN1YnZlbmRvciA9IDB4MTAzYywKKwkJLnN1YmRldmljZSA9IDB4MDk5YywKKwkJLm5hbWUgPSAiSFAgbng2MTEwIiwJLyogQUQxOTgxQiAqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSAweDEwM2MsCiAJCS5zdWJkZXZpY2UgPSAweDEyOWQsCiAJCS5uYW1lID0gIkhQIHh3ODAwMCIsCiAJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKQEAgLTE4NzAsNiArMTg5MSwxMiBAQAogCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCiAJfSwKIAl7CisJCS5zdWJ2ZW5kb3IgPSAweDEwY2YsCisJCS5zdWJkZXZpY2UgPSAweDEyZWMsCisJCS5uYW1lID0gIkZ1aml0c3UtU2llbWVucyA0MDEwIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJewogCQkuc3VidmVuZG9yID0gMHgxMGYxLAogCQkuc3ViZGV2aWNlID0gMHgyNjY1LAogCQkubmFtZSA9ICJGdWppdHN1LVNpZW1lbnMgQ2Vsc2l1cyIsCS8qIEFEMTk4MT8gKi8KQEAgLTI0MjQsNiArMjQ1MSwyMCBAQAogCQl9CiAJfQogCisJLyogcmVzdW1lIHN0YXR1cyAqLworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5iZGJhcnNfY291bnQ7IGkrKykgeworCQlpY2hkZXZfdCAqaWNoZGV2ID0gJmNoaXAtPmljaGRbaV07CisJCXVuc2lnbmVkIGxvbmcgcG9ydCA9IGljaGRldi0+cmVnX29mZnNldDsKKwkJaWYgKCEgaWNoZGV2LT5zdWJzdHJlYW0gfHwgISBpY2hkZXYtPnN1c3BlbmRlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaWNoZGV2LT5pY2hkID09IElDSERfUENNT1VUKQorCQkJc25kX2ludGVsOHgwX3NldHVwX3BjbV9vdXQoY2hpcCwgaWNoZGV2LT5zdWJzdHJlYW0tPnJ1bnRpbWUpOworCQlpcHV0ZHdvcmQoY2hpcCwgcG9ydCArIElDSF9SRUdfT0ZGX0JEQkFSLCBpY2hkZXYtPmJkYmFyX2FkZHIpOworCQlpcHV0Ynl0ZShjaGlwLCBwb3J0ICsgSUNIX1JFR19PRkZfTFZJLCBpY2hkZXYtPmx2aSk7CisJCWlwdXRieXRlKGNoaXAsIHBvcnQgKyBJQ0hfUkVHX09GRl9DSVYsIGljaGRldi0+Y2l2KTsKKwkJaXB1dGJ5dGUoY2hpcCwgcG9ydCArIGljaGRldi0+cm9mZl9zciwgSUNIX0ZJRk9FIHwgSUNIX0JDSVMgfCBJQ0hfTFZCQ0kpOworCX0KKwogCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19QTSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYwppbmRleCA3OWQ4ZWRhLi5kMmFhOWM4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYworKysgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYwpAQCAtMjA2Nyw3ICsyMDY3LDcgQEAKICAgICAgICAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgewkJCQkJCQkJCQkJXAogICAgICAgICAgICAgICAgIC5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURSwJXAotICAgICAgICAgICAgICAgIC5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCQkJCQlcCisgICAgICAgICAgICAgICAgLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAkJCQkJXAogICAgICAgICAgICAgICAgIC5uYW1lID0JCWNfbmFtZSAiIE1vbml0b3IgUGhhc2UgSW52ZXJ0IiwJCQkJCVwKICAgICAgICAgICAgICAgICAuaW5mbyA9CQlzbmRfa29yZzEyMTJfY29udHJvbF9waGFzZV9pbmZvLAkJCQlcCiAgICAgICAgICAgICAgICAgLmdldCA9CQlzbmRfa29yZzEyMTJfY29udHJvbF9waGFzZV9nZXQsCQkJCQlcCkBAIC0yMDgyLDcgKzIwODIsNyBAQAogICAgICAgICBNT05fTUlYRVIoNCwgIkFEQVQtNSIpLCBNT05fTUlYRVIoNSwgIkFEQVQtNiIpLCBNT05fTUlYRVIoNiwgIkFEQVQtNyIpLCBNT05fTUlYRVIoNywgIkFEQVQtOCIpLAogCXsKICAgICAgICAgICAgICAgICAuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfV1JJVEUsCi0gICAgICAgICAgICAgICAgLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKyAgICAgICAgICAgICAgICAuaWZhY2UgPSAgICAgICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAgICAgICAgICAgICAgICAgLm5hbWUgPQkJIlN5bmMgU291cmNlIiwKICAgICAgICAgICAgICAgICAuaW5mbyA9CQlzbmRfa29yZzEyMTJfY29udHJvbF9zeW5jX2luZm8sCiAgICAgICAgICAgICAgICAgLmdldCA9CQlzbmRfa29yZzEyMTJfY29udHJvbF9zeW5jX2dldCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jIGIvc291bmQvcGNpL25tMjU2L25tMjU2LmMKaW5kZXggN2ViMjBiOC4uMmJiZWIxMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL25tMjU2L25tMjU2LmMKKysrIGIvc291bmQvcGNpL25tMjU2L25tMjU2LmMKQEAgLTE4OSw2ICsxODksNyBAQAogCW5tMjU2X3QgKmNoaXA7CiAJc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtOwogCWludCBydW5uaW5nOworCWludCBzdXNwZW5kZWQ7CiAJCiAJdTMyIGJ1ZjsJLyogb2Zmc2V0IGZyb20gY2hpcC0+YnVmZmVyICovCiAJaW50IGJ1ZnNpemU7CS8qIGJ1ZmZlciBzaXplIGluIGJ5dGVzICovCkBAIC0yMzEsOCArMjMyLDEwIEBACiAJaW50IG1peGVyX3N0YXR1c19tYXNrOwkJLyogYml0IG1hc2sgdG8gdGVzdCB0aGUgbWl4ZXIgc3RhdHVzICovCiAKIAlpbnQgaXJxOworCWludCBpcnFfYWNrczsKIAlpcnFyZXR1cm5fdCAoKmludGVycnVwdCkoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwogCWludCBiYWRpbnRyY291bnQ7CQkvKiBjb3VudGVyIHRvIGNoZWNrIGJvZ3VzIGludGVycnVwdHMgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGlycV9tdXRleDsKIAogCW5tMjU2X3N0cmVhbV90IHN0cmVhbXNbMl07CiAKQEAgLTQ2NCw2ICs0NjcsMzcgQEAKIAl9CiB9CiAKKy8qIGFjcXVpcmUgaW50ZXJydXB0ICovCitzdGF0aWMgaW50IHNuZF9ubTI1Nl9hY3F1aXJlX2lycShubTI1Nl90ICpjaGlwKQoreworCWRvd24oJmNoaXAtPmlycV9tdXRleCk7CisJaWYgKGNoaXAtPmlycSA8IDApIHsKKwkJaWYgKHJlcXVlc3RfaXJxKGNoaXAtPnBjaS0+aXJxLCBjaGlwLT5pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVHxTQV9TSElSUSwKKwkJCQljaGlwLT5jYXJkLT5kcml2ZXIsICh2b2lkKiljaGlwKSkgeworCQkJc25kX3ByaW50aygidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBjaGlwLT5wY2ktPmlycSk7CisJCQl1cCgmY2hpcC0+aXJxX211dGV4KTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJY2hpcC0+aXJxID0gY2hpcC0+cGNpLT5pcnE7CisJfQorCWNoaXAtPmlycV9hY2tzKys7CisJdXAoJmNoaXAtPmlycV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlbGVhc2UgaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBzbmRfbm0yNTZfcmVsZWFzZV9pcnEobm0yNTZfdCAqY2hpcCkKK3sKKwlkb3duKCZjaGlwLT5pcnFfbXV0ZXgpOworCWlmIChjaGlwLT5pcnFfYWNrcyA+IDApCisJCWNoaXAtPmlycV9hY2tzLS07CisJaWYgKGNoaXAtPmlycV9hY2tzID09IDAgJiYgY2hpcC0+aXJxID49IDApIHsKKwkJZnJlZV9pcnEoY2hpcC0+aXJxLCAodm9pZCopY2hpcCk7CisJCWNoaXAtPmlycSA9IC0xOworCX0KKwl1cCgmY2hpcC0+aXJxX211dGV4KTsKK30KKwogLyoKICAqIHN0YXJ0IC8gc3RvcAogICovCkBAIC01MzgsMTUgKzU3MiwxOSBAQAogCiAJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCQlzLT5zdXNwZW5kZWQgPSAwOworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CiAJCWlmICghIHMtPnJ1bm5pbmcpIHsKIAkJCXNuZF9ubTI1Nl9wbGF5YmFja19zdGFydChjaGlwLCBzLCBzdWJzdHJlYW0pOwogCQkJcy0+cnVubmluZyA9IDE7CiAJCX0KIAkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwkJcy0+c3VzcGVuZGVkID0gMTsKKwkJLyogZmFsbHRocnUgKi8KKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CiAJCWlmIChzLT5ydW5uaW5nKSB7CiAJCQlzbmRfbm0yNTZfcGxheWJhY2tfc3RvcChjaGlwKTsKIAkJCXMtPnJ1bm5pbmcgPSAwOwpAQCAtODE4LDYgKzg1Niw4IEBACiB7CiAJbm0yNTZfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAorCWlmIChzbmRfbm0yNTZfYWNxdWlyZV9pcnEoY2hpcCkgPCAwKQorCQlyZXR1cm4gLUVCVVNZOwogCXNuZF9ubTI1Nl9zZXR1cF9zdHJlYW0oY2hpcCwgJmNoaXAtPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10sCiAJCQkgICAgICAgc3Vic3RyZWFtLCAmc25kX25tMjU2X3BsYXliYWNrKTsKIAlyZXR1cm4gMDsKQEAgLTgyOCw2ICs4NjgsOCBAQAogewogCW5tMjU2X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAKKwlpZiAoc25kX25tMjU2X2FjcXVpcmVfaXJxKGNoaXApIDwgMCkKKwkJcmV0dXJuIC1FQlVTWTsKIAlzbmRfbm0yNTZfc2V0dXBfc3RyZWFtKGNoaXAsICZjaGlwLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0sCiAJCQkgICAgICAgc3Vic3RyZWFtLCAmc25kX25tMjU2X2NhcHR1cmUpOwogCXJldHVybiAwOwpAQCAtODM5LDYgKzg4MSw5IEBACiBzdGF0aWMgaW50CiBzbmRfbm0yNTZfcGxheWJhY2tfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQogeworCW5tMjU2X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzbmRfbm0yNTZfcmVsZWFzZV9pcnEoY2hpcCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg0Niw2ICs4OTEsOSBAQAogc3RhdGljIGludAogc25kX25tMjU2X2NhcHR1cmVfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQogeworCW5tMjU2X3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlzbmRfbm0yNTZfcmVsZWFzZV9pcnEoY2hpcCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkxNSwxOCArOTYzLDE2IEBACiBzdGF0aWMgdm9pZAogc25kX25tMjU2X2luaXRfY2hpcChubTI1Nl90ICpjaGlwKQogewotCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKIAkvKiBSZXNldCBldmVyeXRoaW5nLiAqLwogCXNuZF9ubTI1Nl93cml0ZWIoY2hpcCwgMHgwLCAweDExKTsKIAlzbmRfbm0yNTZfd3JpdGV3KGNoaXAsIDB4MjE0LCAwKTsKIAkvKiBzdG9wIHNvdW5kcy4uICovCiAJLy9zbmRfbm0yNTZfcGxheWJhY2tfc3RvcChjaGlwKTsKIAkvL3NuZF9ubTI1Nl9jYXB0dXJlX3N0b3AoY2hpcCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiB9CiAKIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgaXJxcmV0dXJuX3QKIHNuZF9ubTI1Nl9pbnRyX2NoZWNrKG5tMjU2X3QgKmNoaXApCiB7CiAJaWYgKGNoaXAtPmJhZGludHJjb3VudCsrID4gMTAwMCkgewpAQCAtOTQ3LDcgKzk5Myw5IEBACiAJCWlmIChjaGlwLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ucnVubmluZykKIAkJCXNuZF9ubTI1Nl9jYXB0dXJlX3N0b3AoY2hpcCk7CiAJCWNoaXAtPmJhZGludHJjb3VudCA9IDA7CisJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CisJcmV0dXJuIElSUV9OT05FOwogfQogCiAvKiAKQEAgLTk2OSwxMCArMTAxNyw4IEBACiAJc3RhdHVzID0gc25kX25tMjU2X3JlYWR3KGNoaXAsIE5NX0lOVF9SRUcpOwogCiAJLyogTm90IG91cnMuICovCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCXNuZF9ubTI1Nl9pbnRyX2NoZWNrKGNoaXApOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQorCWlmIChzdGF0dXMgPT0gMCkKKwkJcmV0dXJuIHNuZF9ubTI1Nl9pbnRyX2NoZWNrKGNoaXApOwogCiAJY2hpcC0+YmFkaW50cmNvdW50ID0gMDsKIApAQCAtMTAzNiwxMCArMTA4Miw4IEBACiAJc3RhdHVzID0gc25kX25tMjU2X3JlYWRsKGNoaXAsIE5NX0lOVF9SRUcpOwogCiAJLyogTm90IG91cnMuICovCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCXNuZF9ubTI1Nl9pbnRyX2NoZWNrKGNoaXApOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQorCWlmIChzdGF0dXMgPT0gMCkKKwkJcmV0dXJuIHNuZF9ubTI1Nl9pbnRyX2NoZWNrKGNoaXApOwogCiAJY2hpcC0+YmFkaW50cmNvdW50ID0gMDsKIApAQCAtMTE5Miw3ICsxMjM2LDcgQEAKIAkJQUM5N19QQ19CRUVQLCBBQzk3X1BIT05FLCBBQzk3X01JQywgQUM5N19MSU5FLCBBQzk3X0NELAogCQlBQzk3X1ZJREVPLCBBQzk3X0FVWCwgQUM5N19QQ00sIEFDOTdfUkVDX1NFTCwKIAkJQUM5N19SRUNfR0FJTiwgQUM5N19HRU5FUkFMX1BVUlBPU0UsIEFDOTdfM0RfQ09OVFJPTCwKLQkJQUM5N19FWFRFTkRFRF9JRCwKKwkJLypBQzk3X0VYVEVOREVEX0lELCovCiAJCUFDOTdfVkVORE9SX0lEMSwgQUM5N19WRU5ET1JfSUQyLAogCQktMQogCX07CkBAIC0xMjA2LDYgKzEyNTAsNyBAQAogCWZvciAoaSA9IDA7IG1peGVyX3JlZ3NbaV0gPj0gMDsgaSsrKQogCQlzZXRfYml0KG1peGVyX3JlZ3NbaV0sIGFjOTcucmVnX2FjY2Vzc2VkKTsKIAlhYzk3LnByaXZhdGVfZGF0YSA9IGNoaXA7CisJcGJ1cy0+bm9fdnJhID0gMTsKIAllcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmNoaXAtPmFjOTcpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtMTI4MSw2ICsxMzI2LDcgQEAKIHN0YXRpYyBpbnQgbm0yNTZfcmVzdW1lKHNuZF9jYXJkX3QgKmNhcmQpCiB7CiAJbm0yNTZfdCAqY2hpcCA9IGNhcmQtPnBtX3ByaXZhdGVfZGF0YTsKKwlpbnQgaTsKIAogCS8qIFBlcmZvcm0gYSBmdWxsIHJlc2V0IG9uIHRoZSBoYXJkd2FyZSAqLwogCXBjaV9lbmFibGVfZGV2aWNlKGNoaXAtPnBjaSk7CkBAIC0xMjg5LDYgKzEzMzUsMTUgQEAKIAkvKiByZXN0b3JlIGFjOTcgKi8KIAlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5Nyk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW5tMjU2X3N0cmVhbV90ICpzID0gJmNoaXAtPnN0cmVhbXNbaV07CisJCWlmIChzLT5zdWJzdHJlYW0gJiYgcy0+c3VzcGVuZGVkKSB7CisJCQlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJCQlzbmRfbm0yNTZfc2V0X2Zvcm1hdChjaGlwLCBzLCBzLT5zdWJzdHJlYW0pOworCQkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KQEAgLTEzNjAsNiArMTQxNSw3IEBACiAJY2hpcC0+dXNlX2NhY2hlID0gdXNlY2FjaGU7CiAJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKIAljaGlwLT5pcnEgPSAtMTsKKwlpbml0X01VVEVYKCZjaGlwLT5pcnFfbXV0ZXgpOwogCiAJY2hpcC0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5idWZzaXplID0gcGxheV9idWZzaXplOwogCWNoaXAtPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5idWZzaXplID0gY2FwdF9idWZzaXplOwpAQCAtMTQ3MCwxNSArMTUyNiw2IEBACiAJCWNoaXAtPmNvZWZmX2J1ZltTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gYWRkcjsKIAl9CiAKLQkvKiBhY3F1aXJlIGludGVycnVwdCAqLwotCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgY2hpcC0+aW50ZXJydXB0LCBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsCi0JCQljYXJkLT5kcml2ZXIsICh2b2lkKiljaGlwKSkgewotCQllcnIgPSAtRUJVU1k7Ci0JCXNuZF9wcmludGsoInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwotCQlnb3RvIF9fZXJyb3I7Ci0JfQotCWNoaXAtPmlycSA9IHBjaS0+aXJxOwotCiAJLyogRml4ZWQgc2V0dGluZy4gKi8KIAljaGlwLT5taXhlcl9iYXNlID0gTk1fTUlYRVJfT0ZGU0VUOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lMzIuYyBiL3NvdW5kL3BjaS9ybWUzMi5jCmluZGV4IGI3YjU1NGQuLjQ1NmJlMzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWUzMi5jCisrKyBiL3NvdW5kL3BjaS9ybWUzMi5jCkBAIC0xOTAwLDcgKzE5MDAsNyBAQAogCX0sCiAJewogCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCi0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAJCS5uYW1lID0JU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLCBQTEFZQkFDSywgQ09OX01BU0spLAogCQkuaW5mbyA9CXNuZF9ybWUzMl9jb250cm9sX3NwZGlmX21hc2tfaW5mbywKIAkJLmdldCA9CXNuZF9ybWUzMl9jb250cm9sX3NwZGlmX21hc2tfZ2V0LApAQCAtMTkwOCw3ICsxOTA4LDcgQEAKIAl9LAogCXsKIAkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAogCQkubmFtZSA9CVNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIiwgUExBWUJBQ0ssIFBST19NQVNLKSwKIAkJLmluZm8gPQlzbmRfcm1lMzJfY29udHJvbF9zcGRpZl9tYXNrX2luZm8sCiAJCS5nZXQgPQlzbmRfcm1lMzJfY29udHJvbF9zcGRpZl9tYXNrX2dldCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5Ni5jIGIvc291bmQvcGNpL3JtZTk2LmMKaW5kZXggMTBjNGY0NS4uOTY0NWU5MCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2LmMKKysrIGIvc291bmQvcGNpL3JtZTk2LmMKQEAgLTIyNjYsNyArMjI2Niw3IEBACiB9LAogewogCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKLQkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLENPTl9NQVNLKSwKIAkuaW5mbyA9CQlzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9tYXNrX2luZm8sCiAJLmdldCA9CQlzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9tYXNrX2dldCwKQEAgLTIyNzYsNyArMjI3Niw3IEBACiB9LAogewogCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKLQkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLFBST19NQVNLKSwKIAkuaW5mbyA9CQlzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9tYXNrX2luZm8sCiAJLmdldCA9CQlzbmRfcm1lOTZfY29udHJvbF9zcGRpZl9tYXNrX2dldCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwppbmRleCA3OTY2MjFkLi42Njk0ODY2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCkBAIC0xNTI0LDcgKzE1MjQsNyBAQAogfQogCiAjZGVmaW5lIEhEU1BfU1BESUZfSU4oeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sICBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCiAgIC5uYW1lID0geG5hbWUsIFwKICAgLmluZGV4ID0geGluZGV4LCBcCiAgIC5pbmZvID0gc25kX2hkc3BfaW5mb19zcGRpZl9pbiwgXApAQCAtMTU4NCw3ICsxNTg0LDcgQEAKIH0KIAogI2RlZmluZSBIRFNQX1NQRElGX09VVCh4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAogICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fc3BkaWZfYml0cywgXAogICAuZ2V0ID0gc25kX2hkc3BfZ2V0X3NwZGlmX291dCwgLnB1dCA9IHNuZF9oZHNwX3B1dF9zcGRpZl9vdXQgfQogCkBAIC0xNjM4LDcgKzE2MzgsNyBAQAogfQogCiAjZGVmaW5lIEhEU1BfU1BESUZfUFJPRkVTU0lPTkFMKHhuYW1lLCB4aW5kZXgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCiAgIC5pbmZvID0gc25kX2hkc3BfaW5mb19zcGRpZl9iaXRzLCBcCiAgIC5nZXQgPSBzbmRfaGRzcF9nZXRfc3BkaWZfcHJvZmVzc2lvbmFsLCAucHV0ID0gc25kX2hkc3BfcHV0X3NwZGlmX3Byb2Zlc3Npb25hbCB9CiAKQEAgLTE2ODMsNyArMTY4Myw3IEBACiB9CiAKICNkZWZpbmUgSERTUF9TUERJRl9FTVBIQVNJUyh4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAogICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fc3BkaWZfYml0cywgXAogICAuZ2V0ID0gc25kX2hkc3BfZ2V0X3NwZGlmX2VtcGhhc2lzLCAucHV0ID0gc25kX2hkc3BfcHV0X3NwZGlmX2VtcGhhc2lzIH0KIApAQCAtMTcyOCw3ICsxNzI4LDcgQEAKIH0KIAogI2RlZmluZSBIRFNQX1NQRElGX05PTl9BVURJTyh4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAogICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fc3BkaWZfYml0cywgXAogICAuZ2V0ID0gc25kX2hkc3BfZ2V0X3NwZGlmX25vbmF1ZGlvLCAucHV0ID0gc25kX2hkc3BfcHV0X3NwZGlmX25vbmF1ZGlvIH0KIApAQCAtMTc3Myw3ICsxNzczLDcgQEAKIH0KIAogI2RlZmluZSBIRFNQX1NQRElGX1NBTVBMRV9SQVRFKHhuYW1lLCB4aW5kZXgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLm5hbWUgPSB4bmFtZSwgXAogICAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELCBcCkBAIC0xODM0LDcgKzE4MzQsNyBAQAogfQogCiAjZGVmaW5lIEhEU1BfU1lTVEVNX1NBTVBMRV9SQVRFKHhuYW1lLCB4aW5kZXgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLm5hbWUgPSB4bmFtZSwgXAogICAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELCBcCkBAIC0xODU4LDcgKzE4NTgsNyBAQAogfQogCiAjZGVmaW5lIEhEU1BfQVVUT1NZTkNfU0FNUExFX1JBVEUoeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLm5hbWUgPSB4bmFtZSwgXAogICAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELCBcCkBAIC0xOTE4LDcgKzE5MTgsNyBAQAogfQogCiAjZGVmaW5lIEhEU1BfU1lTVEVNX0NMT0NLX01PREUoeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAogICAubmFtZSA9IHhuYW1lLCBcCiAgIC5pbmRleCA9IHhpbmRleCwgXAogICAuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsIFwKQEAgLTE5NTgsNyArMTk1OCw3IEBACiB9CiAKICNkZWZpbmUgSERTUF9DTE9DS19TT1VSQ0UoeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLm5hbWUgPSB4bmFtZSwgXAogICAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmluZm8gPSBzbmRfaGRzcF9pbmZvX2Nsb2NrX3NvdXJjZSwgXApAQCAtMjEyNCw3ICsyMTI0LDcgQEAKIH0KIAogI2RlZmluZSBIRFNQX0RBX0dBSU4oeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAogICAubmFtZSA9IHhuYW1lLCBcCiAgIC5pbmRleCA9IHhpbmRleCwgXAogICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fZGFfZ2FpbiwgXApAQCAtMjIxMCw3ICsyMjEwLDcgQEAKIH0KIAogI2RlZmluZSBIRFNQX0FEX0dBSU4oeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAogICAubmFtZSA9IHhuYW1lLCBcCiAgIC5pbmRleCA9IHhpbmRleCwgXAogICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fYWRfZ2FpbiwgXApAQCAtMjI5Niw3ICsyMjk2LDcgQEAKIH0KIAogI2RlZmluZSBIRFNQX1BIT05FX0dBSU4oeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAogICAubmFtZSA9IHhuYW1lLCBcCiAgIC5pbmRleCA9IHhpbmRleCwgXAogICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fcGhvbmVfZ2FpbiwgXApAQCAtMjM4Miw3ICsyMzgyLDcgQEAKIH0KIAogI2RlZmluZSBIRFNQX1hMUl9CUkVBS09VVF9DQUJMRSh4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCiAgIC5uYW1lID0geG5hbWUsIFwKICAgLmluZGV4ID0geGluZGV4LCBcCiAgIC5pbmZvID0gc25kX2hkc3BfaW5mb194bHJfYnJlYWtvdXRfY2FibGUsIFwKQEAgLTI0NDcsNyArMjQ0Nyw3IEBACiAgICBTd2l0Y2hpbmcgdGhpcyBvbiBkZXNhY3RpdmF0ZXMgZXh0ZXJuYWwgQURBVAogKi8KICNkZWZpbmUgSERTUF9BRUIoeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAogICAubmFtZSA9IHhuYW1lLCBcCiAgIC5pbmRleCA9IHhpbmRleCwgXAogICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fYWViLCBcCkBAIC0yNTA4LDcgKzI1MDgsNyBAQAogfQogCiAjZGVmaW5lIEhEU1BfUFJFRl9TWU5DX1JFRih4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCiAgIC5uYW1lID0geG5hbWUsIFwKICAgLmluZGV4ID0geGluZGV4LCBcCiAgIC5pbmZvID0gc25kX2hkc3BfaW5mb19wcmVmX3N5bmNfcmVmLCBcCkBAIC0yNjQxLDcgKzI2NDEsNyBAQAogfQogCiAjZGVmaW5lIEhEU1BfQVVUT1NZTkNfUkVGKHhuYW1lLCB4aW5kZXgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLm5hbWUgPSB4bmFtZSwgXAogICAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELCBcCkBAIC0yNjk3LDcgKzI2OTcsNyBAQAogfQogCiAjZGVmaW5lIEhEU1BfTElORV9PVVQoeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAogICAubmFtZSA9IHhuYW1lLCBcCiAgIC5pbmRleCA9IHhpbmRleCwgXAogICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fbGluZV9vdXQsIFwKQEAgLTI3NTcsNyArMjc1Nyw3IEBACiB9CiAKICNkZWZpbmUgSERTUF9QUkVDSVNFX1BPSU5URVIoeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9DQVJELCBcCiAgIC5uYW1lID0geG5hbWUsIFwKICAgLmluZGV4ID0geGluZGV4LCBcCiAgIC5pbmZvID0gc25kX2hkc3BfaW5mb19wcmVjaXNlX3BvaW50ZXIsIFwKQEAgLTI4MTEsNyArMjgxMSw3IEBACiB9CiAKICNkZWZpbmUgSERTUF9VU0VfTUlESV9UQVNLTEVUKHhuYW1lLCB4aW5kZXgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfQ0FSRCwgXAogICAubmFtZSA9IHhuYW1lLCBcCiAgIC5pbmRleCA9IHhpbmRleCwgXAogICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fdXNlX21pZGlfdGFza2xldCwgXApAQCAtMjg2OCw2ICsyODY4LDcgQEAKIHsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKICAgLm5hbWUgPSB4bmFtZSwgXAogICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmRldmljZSA9IDAsIFwKICAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBcCiAJCSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsIFwKICAgLmluZm8gPSBzbmRfaGRzcF9pbmZvX21peGVyLCBcCkBAIC0yOTM5LDcgKzI5NDAsNyBAQAogfQogCiAjZGVmaW5lIEhEU1BfV0NfU1lOQ19DSEVDSyh4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCiAgIC5uYW1lID0geG5hbWUsIFwKICAgLmluZGV4ID0geGluZGV4LCBcCiAgIC5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwgXApAQCAtMjk4Myw3ICsyOTg0LDcgQEAKIH0KIAogI2RlZmluZSBIRFNQX1NQRElGX1NZTkNfQ0hFQ0soeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAogICAubmFtZSA9IHhuYW1lLCBcCiAgIC5pbmRleCA9IHhpbmRleCwgXAogICAuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsIFwKQEAgLTMwMTUsNyArMzAxNiw3IEBACiB9CiAKICNkZWZpbmUgSERTUF9BREFUU1lOQ19TWU5DX0NIRUNLKHhuYW1lLCB4aW5kZXgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLm5hbWUgPSB4bmFtZSwgXAogICAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLCBcCkBAIC0zMDQ2LDcgKzMwNDcsNyBAQAogfQogCiAjZGVmaW5lIEhEU1BfQURBVF9TWU5DX0NIRUNLIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLCBcCiAgIC5pbmZvID0gc25kX2hkc3BfaW5mb19zeW5jX2NoZWNrLCBcCiAgIC5nZXQgPSBzbmRfaGRzcF9nZXRfYWRhdF9zeW5jX2NoZWNrIFwKQEAgLTMxMTksNyArMzEyMCw3IEBACiB9LAogewogCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKLQkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLENPTl9NQVNLKSwKIAkuaW5mbyA9CQlzbmRfaGRzcF9jb250cm9sX3NwZGlmX21hc2tfaW5mbywKIAkuZ2V0ID0JCXNuZF9oZHNwX2NvbnRyb2xfc3BkaWZfbWFza19nZXQsCkBAIC0zMTI5LDcgKzMxMzAsNyBAQAogfSwKIHsKIAkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCi0JLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAogCS5uYW1lID0JCVNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxQUk9fTUFTSyksCiAJLmluZm8gPQkJc25kX2hkc3BfY29udHJvbF9zcGRpZl9tYXNrX2luZm8sCiAJLmdldCA9CQlzbmRfaGRzcF9jb250cm9sX3NwZGlmX21hc2tfZ2V0LApAQCAtMzE0Niw4ICszMTQ3LDYgQEAKIC8qICdTYW1wbGUgQ2xvY2sgU291cmNlJyBjb21wbGllcyB3aXRoIHRoZSBhbHNhIGNvbnRyb2wgbmFtaW5nIHNjaGVtZSAqLyAKIEhEU1BfQ0xPQ0tfU09VUkNFKCJTYW1wbGUgQ2xvY2sgU291cmNlIiwgMCksCiB7Ci0JLyogRklYTUU6IHNob3VsZCBiZSBQQ00gb3IgTUlYRVI/ICovCi0JLyogLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLCAqLwogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIlNhbXBsZSBDbG9jayBTb3VyY2UgTG9ja2luZyIsCiAJLmluZm8gPSBzbmRfaGRzcF9pbmZvX2Nsb2NrX3NvdXJjZV9sb2NrLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKaW5kZXggOWU4NmQwZS4uNWQ3ODZkMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCkBAIC02NSw3ICs2NSw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZS9kaXNhYmxlIHNwZWNpZmljIEhEU1BNIHNvdW5kY2FyZHMuIik7CiAKIG1vZHVsZV9wYXJhbV9hcnJheShwcmVjaXNlX3B0ciwgYm9vbCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHByZWNpc2VfcHRyLCAiRW5hYmxlIHByZWNpc2UgcG9pbnRlciwgb3IgZGlzYWJsZS4iKTsKK01PRFVMRV9QQVJNX0RFU0MocHJlY2lzZV9wdHIsICJFbmFibGUgb3IgZGlzYWJsZSBwcmVjaXNlIHBvaW50ZXIuIik7CiAKIG1vZHVsZV9wYXJhbV9hcnJheShsaW5lX291dHNfbW9uaXRvciwgYm9vbCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxpbmVfb3V0c19tb25pdG9yLApAQCAtMTEwNCwxNCArMTEwNCwxNCBAQAogCXJldHVybiAwOwogfQogCi1zbmRfcmF3bWlkaV9vcHNfdCBzbmRfaGRzcG1fbWlkaV9vdXRwdXQgPQorc3RhdGljIHNuZF9yYXdtaWRpX29wc190IHNuZF9oZHNwbV9taWRpX291dHB1dCA9CiB7CiAJLm9wZW4gPQkJc25kX2hkc3BtX21pZGlfb3V0cHV0X29wZW4sCiAJLmNsb3NlID0Jc25kX2hkc3BtX21pZGlfb3V0cHV0X2Nsb3NlLAogCS50cmlnZ2VyID0Jc25kX2hkc3BtX21pZGlfb3V0cHV0X3RyaWdnZXIsCiB9OwogCi1zbmRfcmF3bWlkaV9vcHNfdCBzbmRfaGRzcG1fbWlkaV9pbnB1dCA9CitzdGF0aWMgc25kX3Jhd21pZGlfb3BzX3Qgc25kX2hkc3BtX21pZGlfaW5wdXQgPQogewogCS5vcGVuID0JCXNuZF9oZHNwbV9taWRpX2lucHV0X29wZW4sCiAJLmNsb3NlID0Jc25kX2hkc3BtX21pZGlfaW5wdXRfY2xvc2UsCkBAIC0xMTY4LDcgKzExNjgsNyBAQAogLyogZ2V0IHRoZSBzeXN0ZW0gc2FtcGxlIHJhdGUgd2hpY2ggaXMgc2V0ICovCiAKICNkZWZpbmUgSERTUE1fU1lTVEVNX1NBTVBMRV9SQVRFKHhuYW1lLCB4aW5kZXgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLm5hbWUgPSB4bmFtZSwgXAogICAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELCBcCkBAIC0xMTk1LDcgKzExOTUsNyBAQAogfQogCiAjZGVmaW5lIEhEU1BNX0FVVE9TWU5DX1NBTVBMRV9SQVRFKHhuYW1lLCB4aW5kZXgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCiAgIC5uYW1lID0geG5hbWUsIFwKICAgLmluZGV4ID0geGluZGV4LCBcCiAgIC5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwgXApAQCAtMTI2NCw3ICsxMjY0LDcgQEAKIH0KIAogI2RlZmluZSBIRFNQTV9TWVNURU1fQ0xPQ0tfTU9ERSh4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCiAgIC5uYW1lID0geG5hbWUsIFwKICAgLmluZGV4ID0geGluZGV4LCBcCiAgIC5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwgXApAQCAtMTMxMCw3ICsxMzEwLDcgQEAKIH0KIAogI2RlZmluZSBIRFNQTV9DTE9DS19TT1VSQ0UoeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLm5hbWUgPSB4bmFtZSwgXAogICAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmluZm8gPSBzbmRfaGRzcG1faW5mb19jbG9ja19zb3VyY2UsIFwKQEAgLTE0NTcsNyArMTQ1Nyw3IEBACiB9CiAKICNkZWZpbmUgSERTUE1fUFJFRl9TWU5DX1JFRih4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCiAgIC5uYW1lID0geG5hbWUsIFwKICAgLmluZGV4ID0geGluZGV4LCBcCiAgIC5pbmZvID0gc25kX2hkc3BtX2luZm9fcHJlZl9zeW5jX3JlZiwgXApAQCAtMTU0Nyw3ICsxNTQ3LDcgQEAKIH0KIAogI2RlZmluZSBIRFNQTV9BVVRPU1lOQ19SRUYoeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAogICAubmFtZSA9IHhuYW1lLCBcCiAgIC5pbmRleCA9IHhpbmRleCwgXAogICAuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsIFwKQEAgLTE2MDQsNyArMTYwNCw3IEBACiB9CiAKICNkZWZpbmUgSERTUE1fTElORV9PVVQoeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAogICAubmFtZSA9IHhuYW1lLCBcCiAgIC5pbmRleCA9IHhpbmRleCwgXAogICAuaW5mbyA9IHNuZF9oZHNwbV9pbmZvX2xpbmVfb3V0LCBcCkBAIC0xNjY4LDcgKzE2NjgsNyBAQAogfQogCiAjZGVmaW5lIEhEU1BNX1RYXzY0KHhuYW1lLCB4aW5kZXgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLm5hbWUgPSB4bmFtZSwgXAogICAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmluZm8gPSBzbmRfaGRzcG1faW5mb190eF82NCwgXApAQCAtMTczMSw3ICsxNzMxLDcgQEAKIH0KIAogI2RlZmluZSBIRFNQTV9DX1RNUyh4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCiAgIC5uYW1lID0geG5hbWUsIFwKICAgLmluZGV4ID0geGluZGV4LCBcCiAgIC5pbmZvID0gc25kX2hkc3BtX2luZm9fY190bXMsIFwKQEAgLTE3OTQsNyArMTc5NCw3IEBACiB9CiAKICNkZWZpbmUgSERTUE1fU0FGRV9NT0RFKHhuYW1lLCB4aW5kZXgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLm5hbWUgPSB4bmFtZSwgXAogICAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmluZm8gPSBzbmRfaGRzcG1faW5mb19zYWZlX21vZGUsIFwKQEAgLTE4NTcsNyArMTg1Nyw3IEBACiB9CiAKICNkZWZpbmUgSERTUE1fSU5QVVRfU0VMRUNUKHhuYW1lLCB4aW5kZXgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLm5hbWUgPSB4bmFtZSwgXAogICAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmluZm8gPSBzbmRfaGRzcG1faW5mb19pbnB1dF9zZWxlY3QsIFwKQEAgLTE5NDEsNiArMTk0MSw3IEBACiB7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCiAgIC5uYW1lID0geG5hbWUsIFwKICAgLmluZGV4ID0geGluZGV4LCBcCisgIC5kZXZpY2UgPSAwLCBcCiAgIC5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwgXAogCQkgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLCBcCiAgIC5pbmZvID0gc25kX2hkc3BtX2luZm9fbWl4ZXIsIFwKQEAgLTIxMjQsNyArMjEyNSw3IEBACiB9CiAKICNkZWZpbmUgSERTUE1fV0NfU1lOQ19DSEVDSyh4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCiAgIC5uYW1lID0geG5hbWUsIFwKICAgLmluZGV4ID0geGluZGV4LCBcCiAgIC5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwgXApAQCAtMjE3MCw3ICsyMTcxLDcgQEAKIAogCiAjZGVmaW5lIEhEU1BNX01BRElfU1lOQ19DSEVDSyh4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCiAgIC5uYW1lID0geG5hbWUsIFwKICAgLmluZGV4ID0geGluZGV4LCBcCiAgIC5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwgXApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jIGIvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCmluZGV4IDFiYzlkMGQuLjhlZTRkNmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKQEAgLTg5Myw3ICs4OTMsNyBAQAogfQogCiAjZGVmaW5lIFJNRTk2NTJfQURBVDFfSU4oeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCiAgIC5pbmZvID0gc25kX3JtZTk2NTJfaW5mb19hZGF0MV9pbiwgXAogICAuZ2V0ID0gc25kX3JtZTk2NTJfZ2V0X2FkYXQxX2luLCBcCiAgIC5wdXQgPSBzbmRfcm1lOTY1Ml9wdXRfYWRhdDFfaW4gfQpAQCAtOTcxLDcgKzk3MSw3IEBACiB9CiAKICNkZWZpbmUgUk1FOTY1Ml9TUERJRl9JTih4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmluZm8gPSBzbmRfcm1lOTY1Ml9pbmZvX3NwZGlmX2luLCBcCiAgIC5nZXQgPSBzbmRfcm1lOTY1Ml9nZXRfc3BkaWZfaW4sIC5wdXQgPSBzbmRfcm1lOTY1Ml9wdXRfc3BkaWZfaW4gfQogCkBAIC0xMDQyLDcgKzEwNDIsNyBAQAogfQogCiAjZGVmaW5lIFJNRTk2NTJfU1BESUZfT1VUKHhuYW1lLCB4aW5kZXgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAogICAuaW5mbyA9IHNuZF9ybWU5NjUyX2luZm9fc3BkaWZfb3V0LCBcCiAgIC5nZXQgPSBzbmRfcm1lOTY1Ml9nZXRfc3BkaWZfb3V0LCAucHV0ID0gc25kX3JtZTk2NTJfcHV0X3NwZGlmX291dCB9CiAKQEAgLTExMTAsNyArMTExMCw3IEBACiB9CiAKICNkZWZpbmUgUk1FOTY1Ml9TWU5DX01PREUoeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCiAgIC5pbmZvID0gc25kX3JtZTk2NTJfaW5mb19zeW5jX21vZGUsIFwKICAgLmdldCA9IHNuZF9ybWU5NjUyX2dldF9zeW5jX21vZGUsIC5wdXQgPSBzbmRfcm1lOTY1Ml9wdXRfc3luY19tb2RlIH0KIApAQCAtMTE5NSw3ICsxMTk1LDcgQEAKIH0KIAogI2RlZmluZSBSTUU5NjUyX1NZTkNfUFJFRih4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmluZm8gPSBzbmRfcm1lOTY1Ml9pbmZvX3N5bmNfcHJlZiwgXAogICAuZ2V0ID0gc25kX3JtZTk2NTJfZ2V0X3N5bmNfcHJlZiwgLnB1dCA9IHNuZF9ybWU5NjUyX3B1dF9zeW5jX3ByZWYgfQogCkBAIC0xMzQwLDcgKzEzNDAsNyBAQAogfQogCiAjZGVmaW5lIFJNRTk2NTJfUEFTU1RIUlUoeG5hbWUsIHhpbmRleCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCiAgIC5pbmZvID0gc25kX3JtZTk2NTJfaW5mb19wYXNzdGhydSwgXAogICAucHV0ID0gc25kX3JtZTk2NTJfcHV0X3Bhc3N0aHJ1LCBcCiAgIC5nZXQgPSBzbmRfcm1lOTY1Ml9nZXRfcGFzc3RocnUgfQpAQCAtMTM4Niw3ICsxMzg2LDcgQEAKIC8qIFJlYWQtb25seSBzd2l0Y2hlcyAqLwogCiAjZGVmaW5lIFJNRTk2NTJfU1BESUZfUkFURSh4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLCBcCiAgIC5pbmZvID0gc25kX3JtZTk2NTJfaW5mb19zcGRpZl9yYXRlLCBcCiAgIC5nZXQgPSBzbmRfcm1lOTY1Ml9nZXRfc3BkaWZfcmF0ZSB9CkBAIC0xNDExLDcgKzE0MTEsNyBAQAogfQogCiAjZGVmaW5lIFJNRTk2NTJfQURBVF9TWU5DKHhuYW1lLCB4aW5kZXgsIHhpZHgpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAogICAuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsIFwKICAgLmluZm8gPSBzbmRfcm1lOTY1Ml9pbmZvX2FkYXRfc3luYywgXAogICAuZ2V0ID0gc25kX3JtZTk2NTJfZ2V0X2FkYXRfc3luYywgLnByaXZhdGVfdmFsdWUgPSB4aWR4IH0KQEAgLTE0NDcsNyArMTQ0Nyw3IEBACiB9CiAKICNkZWZpbmUgUk1FOTY1Ml9UQ19WQUxJRCh4bmFtZSwgeGluZGV4KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKICAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLCBcCiAgIC5pbmZvID0gc25kX3JtZTk2NTJfaW5mb190Y192YWxpZCwgXAogICAuZ2V0ID0gc25kX3JtZTk2NTJfZ2V0X3RjX3ZhbGlkIH0KQEAgLTE1NDUsNyArMTU0NSw3IEBACiB9LAogewogCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKLQkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLENPTl9NQVNLKSwKIAkuaW5mbyA9CQlzbmRfcm1lOTY1Ml9jb250cm9sX3NwZGlmX21hc2tfaW5mbywKIAkuZ2V0ID0JCXNuZF9ybWU5NjUyX2NvbnRyb2xfc3BkaWZfbWFza19nZXQsCkBAIC0xNTU1LDcgKzE1NTUsNyBAQAogfSwKIHsKIAkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCi0JLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAogCS5uYW1lID0JCVNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxQUk9fTUFTSyksCiAJLmluZm8gPQkJc25kX3JtZTk2NTJfY29udHJvbF9zcGRpZl9tYXNrX2luZm8sCiAJLmdldCA9CQlzbmRfcm1lOTY1Ml9jb250cm9sX3NwZGlmX21hc2tfZ2V0LApAQCAtMTU2OCw3ICsxNTY4LDcgQEAKIFJNRTk2NTJfU1lOQ19NT0RFKCJTeW5jIE1vZGUiLCAwKSwKIFJNRTk2NTJfU1lOQ19QUkVGKCJQcmVmZXJyZWQgU3luYyBTb3VyY2UiLCAwKSwKIHsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiQ2hhbm5lbHMgVGhydSIsCiAJLmluZGV4ID0gMCwKIAkuaW5mbyA9IHNuZF9ybWU5NjUyX2luZm9fdGhydSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKaW5kZXggMjlkODliZmIuLmYzMGQ5ZDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCkBAIC0xNjg5LDcgKzE2ODksNyBAQAogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgLyogfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUgKi8pLAogCS5mb3JtYXRzID0JCShTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAogCQkJCSBTTkRSVl9QQ01fRk1UQklUX1M4IHwgU05EUlZfUENNX0ZNVEJJVF9VMTZfTEUpLAogCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKQEAgLTE3MTQsNyArMTcxNCw3IEBACiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfCBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUIHwKLQkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAorCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSAvKiB8IFNORFJWX1BDTV9JTkZPX1JFU1VNRSAqLyksCiAJLmZvcm1hdHMgPQkJKFNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CiAJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzggfCBTTkRSVl9QQ01fRk1UQklUX1UxNl9MRSksCiAJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLApAQCAtMTczOSw3ICsxNzM5LDcgQEAKIAkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKIAkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8IFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8IFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIC8qIHwgU05EUlZfUENNX0lORk9fUkVTVU1FICovKSwKIAkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKIAkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDgwMDAsCiAJLnJhdGVfbWluID0JCTQ4MDAwLApAQCAtMTc2Myw3ICsxNzYzLDcgQEAKIAkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKIAkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8IFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8IFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCisJCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIC8qIHwgU05EUlZfUENNX0lORk9fUkVTVU1FICovKSwKIAkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKIAkucmF0ZXMgPQkJKFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfAogCQkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCksCkBAIC0xNzg0LDcgKzE3ODQsNyBAQAogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgLyogfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUgKi8pLAogCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAogCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80ODAwMCwKIAkucmF0ZV9taW4gPQkJNDgwMDAsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCA0ODg5NjAwLi41NmM2ZTUyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTY2MywxMCArNjYzLDEyIEBACiAJCXZhbCA9IDA7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgogCQl2YWwgfD0gVklBX1JFR19DVFJMX1NUQVJUOwogCQl2aWFkZXYtPnJ1bm5pbmcgPSAxOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgogCQl2YWwgPSBWSUFfUkVHX0NUUkxfVEVSTUlOQVRFOwogCQl2aWFkZXYtPnJ1bm5pbmcgPSAwOwogCQlicmVhazsKQEAgLTkyOSwxMiArOTMxLDEyIEBACiAKIAlpZiAoKHJhdGVfY2hhbmdlZCA9IHZpYV9sb2NrX3JhdGUoJmNoaXAtPnJhdGVzWzBdLCBhYzk3X3JhdGUpKSA8IDApCiAJCXJldHVybiByYXRlX2NoYW5nZWQ7Ci0JaWYgKHJhdGVfY2hhbmdlZCkgeworCWlmIChyYXRlX2NoYW5nZWQpCiAJCXNuZF9hYzk3X3NldF9yYXRlKGNoaXAtPmFjOTcsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFLAogCQkJCSAgY2hpcC0+bm9fdnJhID8gNDgwMDAgOiBydW50aW1lLT5yYXRlKTsKLQkJc25kX2FjOTdfc2V0X3JhdGUoY2hpcC0+YWM5NywgQUM5N19TUERJRiwKLQkJCQkgIGNoaXAtPm5vX3ZyYSA/IDQ4MDAwIDogcnVudGltZS0+cmF0ZSk7Ci0JfQorCWlmIChjaGlwLT5zcGRpZl9vbiAmJiB2aWFkZXYtPnJlZ19vZmZzZXQgPT0gMHgzMCkKKwkJc25kX2FjOTdfc2V0X3JhdGUoY2hpcC0+YWM5NywgQUM5N19TUERJRiwgcnVudGltZS0+cmF0ZSk7CisKIAlpZiAocnVudGltZS0+cmF0ZSA9PSA0ODAwMCkKIAkJcmJpdHMgPSAweGZmZmZmOwogCWVsc2UKQEAgLTEwMzUsNyArMTAzNyw3IEBACiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJCSAvKiBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfCAqLwogCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSksCiAJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAogCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80ODAwMCwKQEAgLTE0ODQsNyArMTQ4Niw3IEBACiB9CiAKIHN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc25kX3ZpYTgyMzNfZHhzM19zcGRpZl9jb250cm9sIF9fZGV2aW5pdGRhdGEgPSB7Ci0JLm5hbWUgPSAiSUVDOTU4IE91dHB1dCBTd2l0Y2giLAorCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJPdXRwdXQgIixOT05FLFNXSVRDSCksCiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLmluZm8gPSBzbmRfdmlhODIzM19keHMzX3NwZGlmX2luZm8sCiAJLmdldCA9IHNuZF92aWE4MjMzX2R4czNfc3BkaWZfZ2V0LApAQCAtMjE1Myw2ICsyMTU1LDcgQEAKIAkJeyAuc3VidmVuZG9yID0gMHgxMDE5LCAuc3ViZGV2aWNlID0gMHgwYTgxLCAuYWN0aW9uID0gVklBX0RYU19OT19WUkEgfSwgLyogRUNTIEs3VlRBMyB2OC4wICovCiAJCXsgLnN1YnZlbmRvciA9IDB4MTAxOSwgLnN1YmRldmljZSA9IDB4MGE4NSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEVDUyBMN1ZNTTIgKi8KIAkJeyAuc3VidmVuZG9yID0gMHgxMDI1LCAuc3ViZGV2aWNlID0gMHgwMDMzLCAuYWN0aW9uID0gVklBX0RYU19OT19WUkEgfSwgLyogQWNlciBJbnNwaXJlIDEzNTNMTSAqLworCQl7IC5zdWJ2ZW5kb3IgPSAweDEwMjUsIC5zdWJkZXZpY2UgPSAweDAwNDYsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBBY2VyIEFzcGlyZSAxNTI0IFdMTWkgKi8KIAkJeyAuc3VidmVuZG9yID0gMHgxMDQzLCAuc3ViZGV2aWNlID0gMHg4MDk1LCAuYWN0aW9uID0gVklBX0RYU19OT19WUkEgfSwgLyogQVNVUyBBN1Y4WCAoRklYTUU6IHBvc3NpYmx5IFZJQV9EWFNfRU5BQkxFPykqLwogCQl7IC5zdWJ2ZW5kb3IgPSAweDEwNDMsIC5zdWJkZXZpY2UgPSAweDgwYTEsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBBU1VTIEE3VjgtWCAqLwogCQl7IC5zdWJ2ZW5kb3IgPSAweDEwNDMsIC5zdWJkZXZpY2UgPSAweDgwYjAsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBBU1VTIEE3VjYwMCAmIEs4ViovIApAQCAtMjE2OCwxMCArMjE3MSwxMiBAQAogCQl7IC5zdWJ2ZW5kb3IgPSAweDEyOTcsIC5zdWJkZXZpY2UgPSAweGMxNjAsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBTaHV0dGxlIFNLNDFHICovCiAJCXsgLnN1YnZlbmRvciA9IDB4MTQ1OCwgLnN1YmRldmljZSA9IDB4YTAwMiwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIEdpZ2FieXRlIEdBLTdWQVhQICovCiAJCXsgLnN1YnZlbmRvciA9IDB4MTQ2MiwgLnN1YmRldmljZSA9IDB4MDA4MCwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIE1TSSBLOFQgTmVvLUZJUzJSICovCisJCXsgLnN1YnZlbmRvciA9IDB4MTQ2MiwgLnN1YmRldmljZSA9IDB4MDQzMCwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIE1TSSA3MTQyIChLOE1NLVYpICovCiAJCXsgLnN1YnZlbmRvciA9IDB4MTQ2MiwgLnN1YmRldmljZSA9IDB4MzgwMCwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIE1TSSBLVDI2NiAqLwogCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweDU5MDEsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBNU0kgS1Q2IERlbHRhLVNSICovCiAJCXsgLnN1YnZlbmRvciA9IDB4MTQ2MiwgLnN1YmRldmljZSA9IDB4NzAyMywgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIE1TSSBLOFQgTmVvMi1GSSAqLwogCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweDcxMjAsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBNU0kgS1Q0ViAqLworCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweDcxNDIsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBNU0kgSzhNTS1WICovCiAJCXsgLnN1YnZlbmRvciA9IDB4MTQ3YiwgLnN1YmRldmljZSA9IDB4MTQwMSwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIEFCSVQgS0Q3KC1SQUlEKSAqLwogCQl7IC5zdWJ2ZW5kb3IgPSAweDE0N2IsIC5zdWJkZXZpY2UgPSAweDE0MTEsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBBQklUIFZBLTIwICovCiAJCXsgLnN1YnZlbmRvciA9IDB4MTQ3YiwgLnN1YmRldmljZSA9IDB4MTQxMywgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIEFCSVQgS1Y4IFBybyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKaW5kZXggNGE5Nzc5Yy4uNTg3MmQ0MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYworKysgYi9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCkBAIC01MjEsNiArNTIxLDcgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CiAJCXZhbCB8PSBWSUFfUkVHX0NUUkxfU1RBUlQ7CiAJCXZpYWRldi0+cnVubmluZyA9IDE7CiAJCWJyZWFrOwpAQCAtNjk3LDcgKzY5OCw3IEBACiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJCSAvKiBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfCAqLwogCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSksCiAJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAogCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV9LTk9ULApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCmluZGV4IGQ1NGY4OGEuLjA1NDgzNjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYworKysgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKQEAgLTMyMSw2ICszMjEsMjYgQEAKIAkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoeXBjbS0+c3Vic3RyZWFtKTsKIAkJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCQl9CisKKwkJaWYgKHVubGlrZWx5KHlwY20tPnVwZGF0ZV9wY21fdm9sKSkgeworCQkJdW5zaWduZWQgaW50IHN1YnMgPSB5cGNtLT5zdWJzdHJlYW0tPm51bWJlcjsKKwkJCXVuc2lnbmVkIGludCBuZXh0X2JhbmsgPSAxIC0gY2hpcC0+YWN0aXZlX2Jhbms7CisJCQlzbmRfeW1mcGNpX3BsYXliYWNrX2JhbmtfdCAqYmFuazsKKwkJCXUzMiB2b2x1bWU7CisJCQkKKwkJCWJhbmsgPSAmdm9pY2UtPmJhbmtbbmV4dF9iYW5rXTsKKwkJCXZvbHVtZSA9IGNwdV90b19sZTMyKGNoaXAtPnBjbV9taXhlcltzdWJzXS5sZWZ0IDw8IDE1KTsKKwkJCWJhbmstPmxlZnRfZ2Fpbl9lbmQgPSB2b2x1bWU7CisJCQlpZiAoeXBjbS0+b3V0cHV0X3JlYXIpCisJCQkJYmFuay0+ZWZmMl9nYWluX2VuZCA9IHZvbHVtZTsKKwkJCWlmICh5cGNtLT52b2ljZXNbMV0pCisJCQkJYmFuayA9ICZ5cGNtLT52b2ljZXNbMV0tPmJhbmtbbmV4dF9iYW5rXTsKKwkJCXZvbHVtZSA9IGNwdV90b19sZTMyKGNoaXAtPnBjbV9taXhlcltzdWJzXS5yaWdodCA8PCAxNSk7CisJCQliYW5rLT5yaWdodF9nYWluX2VuZCA9IHZvbHVtZTsKKwkJCWlmICh5cGNtLT5vdXRwdXRfcmVhcikKKwkJCQliYW5rLT5lZmYzX2dhaW5fZW5kID0gdm9sdW1lOworCQkJeXBjbS0+dXBkYXRlX3BjbV92b2wtLTsKKwkJfQogCX0KIAlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogfQpAQCAtNDUxLDg3ICs0NzEsNzQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc25kX3ltZnBjaV9wY21faW5pdF92b2ljZSh5bWZwY2lfdm9pY2VfdCAqdm9pY2UsIGludCBzdGVyZW8sCi0JCQkJICAgICAgaW50IHJhdGUsIGludCB3XzE2LCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGVuZCwKLQkJCQkgICAgICBpbnQgb3V0cHV0X2Zyb250LCBpbnQgb3V0cHV0X3JlYXIpCitzdGF0aWMgdm9pZCBzbmRfeW1mcGNpX3BjbV9pbml0X3ZvaWNlKHltZnBjaV9wY21fdCAqeXBjbSwgdW5zaWduZWQgaW50IHZvaWNlaWR4LAorCQkJCSAgICAgIHNuZF9wY21fcnVudGltZV90ICpydW50aW1lLAorCQkJCSAgICAgIGludCBoYXNfcGNtX3ZvbHVtZSkKIHsKKwl5bWZwY2lfdm9pY2VfdCAqdm9pY2UgPSB5cGNtLT52b2ljZXNbdm9pY2VpZHhdOwogCXUzMiBmb3JtYXQ7Ci0JdTMyIGRlbHRhID0gc25kX3ltZnBjaV9jYWxjX2RlbHRhKHJhdGUpOwotCXUzMiBscGZRID0gc25kX3ltZnBjaV9jYWxjX2xwZlEocmF0ZSk7Ci0JdTMyIGxwZksgPSBzbmRfeW1mcGNpX2NhbGNfbHBmSyhyYXRlKTsKKwl1MzIgZGVsdGEgPSBzbmRfeW1mcGNpX2NhbGNfZGVsdGEocnVudGltZS0+cmF0ZSk7CisJdTMyIGxwZlEgPSBzbmRfeW1mcGNpX2NhbGNfbHBmUShydW50aW1lLT5yYXRlKTsKKwl1MzIgbHBmSyA9IHNuZF95bWZwY2lfY2FsY19scGZLKHJ1bnRpbWUtPnJhdGUpOwogCXNuZF95bWZwY2lfcGxheWJhY2tfYmFua190ICpiYW5rOwogCXVuc2lnbmVkIGludCBuYmFuazsKKwl1MzIgdm9sX2xlZnQsIHZvbF9yaWdodDsKKwl1OCB1c2VfbGVmdCwgdXNlX3JpZ2h0OwogCiAJc25kX2Fzc2VydCh2b2ljZSAhPSBOVUxMLCByZXR1cm4pOwotCWZvcm1hdCA9IChzdGVyZW8gPyAweDAwMDEwMDAwIDogMCkgfCAod18xNiA/IDAgOiAweDgwMDAwMDAwKTsKKwlpZiAocnVudGltZS0+Y2hhbm5lbHMgPT0gMSkgeworCQl1c2VfbGVmdCA9IDE7CisJCXVzZV9yaWdodCA9IDE7CisJfSBlbHNlIHsKKwkJdXNlX2xlZnQgPSAodm9pY2VpZHggJiAxKSA9PSAwOworCQl1c2VfcmlnaHQgPSAhdXNlX2xlZnQ7CisJfQorCWlmIChoYXNfcGNtX3ZvbHVtZSkgeworCQl2b2xfbGVmdCA9IGNwdV90b19sZTMyKHlwY20tPmNoaXAtPnBjbV9taXhlcgorCQkJCSAgICAgICBbeXBjbS0+c3Vic3RyZWFtLT5udW1iZXJdLmxlZnQgPDwgMTUpOworCQl2b2xfcmlnaHQgPSBjcHVfdG9fbGUzMih5cGNtLT5jaGlwLT5wY21fbWl4ZXIKKwkJCQkJW3lwY20tPnN1YnN0cmVhbS0+bnVtYmVyXS5yaWdodCA8PCAxNSk7CisJfSBlbHNlIHsKKwkJdm9sX2xlZnQgPSBjcHVfdG9fbGUzMigweDQwMDAwMDAwKTsKKwkJdm9sX3JpZ2h0ID0gY3B1X3RvX2xlMzIoMHg0MDAwMDAwMCk7CisJfQorCWZvcm1hdCA9IHJ1bnRpbWUtPmNoYW5uZWxzID09IDIgPyAweDAwMDEwMDAwIDogMDsKKwlpZiAoc25kX3BjbV9mb3JtYXRfd2lkdGgocnVudGltZS0+Zm9ybWF0KSA9PSA4KQorCQlmb3JtYXQgfD0gMHg4MDAwMDAwMDsKKwlpZiAocnVudGltZS0+Y2hhbm5lbHMgPT0gMiAmJiAodm9pY2VpZHggJiAxKSAhPSAwKQorCQlmb3JtYXQgfD0gMTsKIAlmb3IgKG5iYW5rID0gMDsgbmJhbmsgPCAyOyBuYmFuaysrKSB7CiAJCWJhbmsgPSAmdm9pY2UtPmJhbmtbbmJhbmtdOworCQltZW1zZXQoYmFuaywgMCwgc2l6ZW9mKCpiYW5rKSk7CiAJCWJhbmstPmZvcm1hdCA9IGNwdV90b19sZTMyKGZvcm1hdCk7Ci0JCWJhbmstPmxvb3BfZGVmYXVsdCA9IDA7Ci0JCWJhbmstPmJhc2UgPSBjcHVfdG9fbGUzMihhZGRyKTsKLQkJYmFuay0+bG9vcF9zdGFydCA9IDA7Ci0JCWJhbmstPmxvb3BfZW5kID0gY3B1X3RvX2xlMzIoZW5kKTsKLQkJYmFuay0+bG9vcF9mcmFjID0gMDsKLQkJYmFuay0+ZWdfZ2Fpbl9lbmQgPSBjcHVfdG9fbGUzMigweDQwMDAwMDAwKTsKKwkJYmFuay0+YmFzZSA9IGNwdV90b19sZTMyKHJ1bnRpbWUtPmRtYV9hZGRyKTsKKwkJYmFuay0+bG9vcF9lbmQgPSBjcHVfdG9fbGUzMih5cGNtLT5idWZmZXJfc2l6ZSk7CiAJCWJhbmstPmxwZlEgPSBjcHVfdG9fbGUzMihscGZRKTsKLQkJYmFuay0+c3RhdHVzID0gMDsKLQkJYmFuay0+bnVtX29mX2ZyYW1lcyA9IDA7Ci0JCWJhbmstPmxvb3BfY291bnQgPSAwOwotCQliYW5rLT5zdGFydCA9IDA7Ci0JCWJhbmstPnN0YXJ0X2ZyYWMgPSAwOwogCQliYW5rLT5kZWx0YSA9CiAJCWJhbmstPmRlbHRhX2VuZCA9IGNwdV90b19sZTMyKGRlbHRhKTsKIAkJYmFuay0+bHBmSyA9CiAJCWJhbmstPmxwZktfZW5kID0gY3B1X3RvX2xlMzIobHBmSyk7Ci0JCWJhbmstPmVnX2dhaW4gPSBjcHVfdG9fbGUzMigweDQwMDAwMDAwKTsKLQkJYmFuay0+bHBmRDEgPQotCQliYW5rLT5scGZEMiA9IDA7CisJCWJhbmstPmVnX2dhaW4gPQorCQliYW5rLT5lZ19nYWluX2VuZCA9IGNwdV90b19sZTMyKDB4NDAwMDAwMDApOwogCi0JCWJhbmstPmxlZnRfZ2FpbiA9IAotCQliYW5rLT5yaWdodF9nYWluID0KLQkJYmFuay0+bGVmdF9nYWluX2VuZCA9Ci0JCWJhbmstPnJpZ2h0X2dhaW5fZW5kID0KLQkJYmFuay0+ZWZmMV9nYWluID0KLQkJYmFuay0+ZWZmMl9nYWluID0KLQkJYmFuay0+ZWZmM19nYWluID0KLQkJYmFuay0+ZWZmMV9nYWluX2VuZCA9Ci0JCWJhbmstPmVmZjJfZ2Fpbl9lbmQgPQotCQliYW5rLT5lZmYzX2dhaW5fZW5kID0gMDsKLQotCQlpZiAoIXN0ZXJlbykgewotCQkJaWYgKG91dHB1dF9mcm9udCkgewotCQkJCWJhbmstPmxlZnRfZ2FpbiA9IAorCQlpZiAoeXBjbS0+b3V0cHV0X2Zyb250KSB7CisJCQlpZiAodXNlX2xlZnQpIHsKKwkJCQliYW5rLT5sZWZ0X2dhaW4gPQorCQkJCWJhbmstPmxlZnRfZ2Fpbl9lbmQgPSB2b2xfbGVmdDsKKwkJCX0KKwkJCWlmICh1c2VfcmlnaHQpIHsKIAkJCQliYW5rLT5yaWdodF9nYWluID0KLQkJCQliYW5rLT5sZWZ0X2dhaW5fZW5kID0KLQkJCQliYW5rLT5yaWdodF9nYWluX2VuZCA9IGNwdV90b19sZTMyKDB4NDAwMDAwMDApOworCQkJCWJhbmstPnJpZ2h0X2dhaW5fZW5kID0gdm9sX3JpZ2h0OwogCQkJfQotCQkJaWYgKG91dHB1dF9yZWFyKSB7CisJCX0KKwkJaWYgKHlwY20tPm91dHB1dF9yZWFyKSB7CisJCQlpZiAodXNlX2xlZnQpIHsKIAkJCQliYW5rLT5lZmYyX2dhaW4gPQotCQkJCWJhbmstPmVmZjJfZ2Fpbl9lbmQgPQorCQkJCWJhbmstPmVmZjJfZ2Fpbl9lbmQgPSB2b2xfbGVmdDsKKwkJCX0KKwkJCWlmICh1c2VfcmlnaHQpIHsKIAkJCQliYW5rLT5lZmYzX2dhaW4gPQotCQkJCWJhbmstPmVmZjNfZ2Fpbl9lbmQgPSBjcHVfdG9fbGUzMigweDQwMDAwMDAwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChvdXRwdXRfZnJvbnQpIHsKLQkJCQlpZiAoKHZvaWNlLT5udW1iZXIgJiAxKSA9PSAwKSB7Ci0JCQkJCWJhbmstPmxlZnRfZ2FpbiA9Ci0JCQkJCWJhbmstPmxlZnRfZ2Fpbl9lbmQgPSBjcHVfdG9fbGUzMigweDQwMDAwMDAwKTsKLQkJCQl9IGVsc2UgewotCQkJCQliYW5rLT5mb3JtYXQgfD0gY3B1X3RvX2xlMzIoMSk7Ci0JCQkJCWJhbmstPnJpZ2h0X2dhaW4gPQotCQkJCQliYW5rLT5yaWdodF9nYWluX2VuZCA9IGNwdV90b19sZTMyKDB4NDAwMDAwMDApOwotCQkJCX0KLQkJCX0KLQkJCWlmIChvdXRwdXRfcmVhcikgewotCQkJCWlmICgodm9pY2UtPm51bWJlciAmIDEpID09IDApIHsKLQkJCQkJYmFuay0+ZWZmM19nYWluID0KLQkJCQkJYmFuay0+ZWZmM19nYWluX2VuZCA9IGNwdV90b19sZTMyKDB4NDAwMDAwMDApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJhbmstPmZvcm1hdCB8PSBjcHVfdG9fbGUzMigxKTsKLQkJCQkJYmFuay0+ZWZmMl9nYWluID0KLQkJCQkJYmFuay0+ZWZmMl9nYWluX2VuZCA9IGNwdV90b19sZTMyKDB4NDAwMDAwMDApOwotCQkJCX0KKwkJCQliYW5rLT5lZmYzX2dhaW5fZW5kID0gdm9sX3JpZ2h0OwogCQkJfQogCQl9CiAJfQpAQCAtNjEzLDcgKzYyMCw3IEBACiAKIHN0YXRpYyBpbnQgc25kX3ltZnBjaV9wbGF5YmFja19wcmVwYXJlKHNuZF9wY21fc3Vic3RyZWFtX3QgKiBzdWJzdHJlYW0pCiB7Ci0JLy8geW1mcGNpX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJeW1mcGNpX3BjbV90ICp5cGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGludCBudm9pY2U7CkBAIC02MjMsMTQgKzYzMCw4IEBACiAJeXBjbS0+cGVyaW9kX3BvcyA9IDA7CiAJeXBjbS0+bGFzdF9wb3MgPSAwOwogCWZvciAobnZvaWNlID0gMDsgbnZvaWNlIDwgcnVudGltZS0+Y2hhbm5lbHM7IG52b2ljZSsrKQotCQlzbmRfeW1mcGNpX3BjbV9pbml0X3ZvaWNlKHlwY20tPnZvaWNlc1tudm9pY2VdLAotCQkJCQkgIHJ1bnRpbWUtPmNoYW5uZWxzID09IDIsCi0JCQkJCSAgcnVudGltZS0+cmF0ZSwKLQkJCQkJICBzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDE2LAotCQkJCQkgIHJ1bnRpbWUtPmRtYV9hZGRyLAotCQkJCQkgIHlwY20tPmJ1ZmZlcl9zaXplLAotCQkJCQkgIHlwY20tPm91dHB1dF9mcm9udCwKLQkJCQkJICB5cGNtLT5vdXRwdXRfcmVhcik7CisJCXNuZF95bWZwY2lfcGNtX2luaXRfdm9pY2UoeXBjbSwgbnZvaWNlLCBydW50aW1lLAorCQkJCQkgIHN1YnN0cmVhbS0+cGNtID09IGNoaXAtPnBjbSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg4Miw2ICs4ODMsNyBAQAogCXltZnBjaV90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXltZnBjaV9wY21fdCAqeXBjbTsKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKIAlpbnQgZXJyOwogCQogCWlmICgoZXJyID0gc25kX3ltZnBjaV9wbGF5YmFja19vcGVuXzEoc3Vic3RyZWFtKSkgPCAwKQpAQCAtODk1LDYgKzg5NywxMCBAQAogCQljaGlwLT5yZWFyX29wZW5lZCsrOwogCX0KIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKworCWtjdGwgPSBjaGlwLT5wY21fbWl4ZXJbc3Vic3RyZWFtLT5udW1iZXJdLmN0bDsKKwlrY3RsLT52ZFswXS5hY2Nlc3MgJj0gflNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKKwlzbmRfY3RsX25vdGlmeShjaGlwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLCAma2N0bC0+aWQpOwogCXJldHVybiAwOwogfQogCkBAIC05ODcsNiArOTkzLDcgQEAKIHsKIAl5bWZwY2lfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAl5bWZwY2lfcGNtX3QgKnlwY20gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzbmRfa2NvbnRyb2xfdCAqa2N0bDsKIAogCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKIAlpZiAoeXBjbS0+b3V0cHV0X3JlYXIgJiYgY2hpcC0+cmVhcl9vcGVuZWQgPiAwKSB7CkBAIC05OTQsNiArMTAwMSw5IEBACiAJCXltZnBjaV9jbG9zZV9leHRlbnNpb24oY2hpcCk7CiAJfQogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWtjdGwgPSBjaGlwLT5wY21fbWl4ZXJbc3Vic3RyZWFtLT5udW1iZXJdLmN0bDsKKwlrY3RsLT52ZFswXS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOworCXNuZF9jdGxfbm90aWZ5KGNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX0lORk8sICZrY3RsLT5pZCk7CiAJcmV0dXJuIHNuZF95bWZwY2lfcGxheWJhY2tfY2xvc2VfMShzdWJzdHJlYW0pOwogfQogCkBAIC0xNjY1LDYgKzE2NzUsNjYgQEAKIAkucHJpdmF0ZV92YWx1ZSA9IDIsCiB9OwogCisvKgorICogUENNIHZvaWNlIHZvbHVtZQorICovCisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9wY21fdm9sX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLAorCQkJCSAgIHNuZF9jdGxfZWxlbV9pbmZvX3QgKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAweDgwMDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3ltZnBjaV9wY21fdm9sX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsCisJCQkJICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdWNvbnRyb2wpCit7CisJeW1mcGNpX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHN1YnMgPSBrY29udHJvbC0+aWQuc3ViZGV2aWNlOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjaGlwLT5wY21fbWl4ZXJbc3Vic10ubGVmdDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGNoaXAtPnBjbV9taXhlcltzdWJzXS5yaWdodDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfeW1mcGNpX3BjbV92b2xfcHV0KHNuZF9rY29udHJvbF90ICprY29udHJvbCwKKwkJCQkgIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp1Y29udHJvbCkKK3sKKwl5bWZwY2lfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgc3VicyA9IGtjb250cm9sLT5pZC5zdWJkZXZpY2U7CisJc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gIT0gY2hpcC0+cGNtX21peGVyW3N1YnNdLmxlZnQgfHwKKwkgICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gIT0gY2hpcC0+cGNtX21peGVyW3N1YnNdLnJpZ2h0KSB7CisJCWNoaXAtPnBjbV9taXhlcltzdWJzXS5sZWZ0ID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJCWNoaXAtPnBjbV9taXhlcltzdWJzXS5yaWdodCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCisJCXN1YnN0cmVhbSA9IChzbmRfcGNtX3N1YnN0cmVhbV90ICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT52b2ljZV9sb2NrLCBmbGFncyk7CisJCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUgJiYgc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGEpIHsKKwkJCXltZnBjaV9wY21fdCAqeXBjbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCQkJeXBjbS0+dXBkYXRlX3BjbV92b2wgPSAyOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnZvaWNlX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF95bWZwY2lfcGNtX3ZvbHVtZSBfX2RldmluaXRkYXRhID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9ICJQQ00gUGxheWJhY2sgVm9sdW1lIiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRSwKKwkuaW5mbyA9IHNuZF95bWZwY2lfcGNtX3ZvbF9pbmZvLAorCS5nZXQgPSBzbmRfeW1mcGNpX3BjbV92b2xfZ2V0LAorCS5wdXQgPSBzbmRfeW1mcGNpX3BjbV92b2xfcHV0LAorfTsKKwogCiAvKgogICogIE1peGVyIHJvdXRpbmVzCkBAIC0xNjg2LDYgKzE3NTYsNyBAQAogewogCWFjOTdfdGVtcGxhdGVfdCBhYzk3OwogCXNuZF9rY29udHJvbF90ICprY3RsOworCXNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbTsKIAl1bnNpZ25lZCBpbnQgaWR4OwogCWludCBlcnI7CiAJc3RhdGljIGFjOTdfYnVzX29wc190IG9wcyA9IHsKQEAgLTE3MzksNiArMTgxMCwyMyBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAKKwkvKiBwZXItdm9pY2Ugdm9sdW1lICovCisJc3Vic3RyZWFtID0gY2hpcC0+cGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDMyOyArK2lkeCkgeworCQlrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfeW1mcGNpX3BjbV92b2x1bWUsIGNoaXApOworCQlpZiAoIWtjdGwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJa2N0bC0+aWQuZGV2aWNlID0gY2hpcC0+cGNtLT5kZXZpY2U7CisJCWtjdGwtPmlkLnN1YmRldmljZSA9IGlkeDsKKwkJa2N0bC0+cHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKXN1YnN0cmVhbTsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBrY3RsKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJY2hpcC0+cGNtX21peGVyW2lkeF0ubGVmdCA9IDB4ODAwMDsKKwkJY2hpcC0+cGNtX21peGVyW2lkeF0ucmlnaHQgPSAweDgwMDA7CisJCWNoaXAtPnBjbV9taXhlcltpZHhdLmN0bCA9IGtjdGw7CisJCXN1YnN0cmVhbSA9IHN1YnN0cmVhbS0+bmV4dDsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwppbmRleCAzYTgyMTYxLi4xZThmMTZiIDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYworKysgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwpAQCAtMjk3LDYgKzI5Nyw3IEBACiAJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOwogCiAJY2hpcC0+ZGV2ID0gJmhhbmRsZV90b19kZXYobGluay0+aGFuZGxlKTsKKwlzbmRfY2FyZF9zZXRfZGV2KGNoaXAtPmNhcmQsIGNoaXAtPmRldik7CiAKIAlpZiAoc25kX3Z4cG9ja2V0X2Fzc2lnbl9yZXNvdXJjZXMoY2hpcCwgbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpIDwgMCkKIAkJZ290byBmYWlsZWQ7CkBAIC0zNzYsNyArMzc3LDcgQEAKIAogLyoKICAqLwotc3RhdGljIGRldl9saW5rX3QgKnZ4cF9hdHRhY2godm9pZCkKK3N0YXRpYyBkZXZfbGlua190ICp2eHBvY2tldF9hdHRhY2godm9pZCkKIHsKIAlzbmRfY2FyZF90ICpjYXJkOwogCXN0cnVjdCBzbmRfdnhwb2NrZXQgKnZ4cDsKQEAgLTQwNyw3ICs0MDgsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQl2eHAtPmluZGV4ID0gaW5kZXhbaV07CisJdnhwLT5pbmRleCA9IGk7CiAJY2FyZF9hbGxvYyB8PSAxIDw8IGk7CiAKIAkvKiBDaGFpbiBkcml2ZXJzICovCkBAIC00MTcsNyArNDE4LDcgQEAKIAlyZXR1cm4gJnZ4cC0+bGluazsKIH0KIAotc3RhdGljIHZvaWQgdnhwX2RldGFjaChkZXZfbGlua190ICpsaW5rKQorc3RhdGljIHZvaWQgdnhwb2NrZXRfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCiB7CiAJc3RydWN0IHNuZF92eHBvY2tldCAqdnhwOwogCXZ4X2NvcmVfdCAqY2hpcDsKQEAgLTQ1OCw4ICs0NTksOSBAQAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJzbmQtdnhwb2NrZXQiLAogCX0sCi0JLmF0dGFjaAkJPSB2eHBfYXR0YWNoLAotCS5kZXRhY2gJCT0gdnhwX2RldGFjaCwKKwkuYXR0YWNoCQk9IHZ4cG9ja2V0X2F0dGFjaCwKKwkuZGV0YWNoCQk9IHZ4cG9ja2V0X2RldGFjaCwKKwkuZXZlbnQJCT0gdnhwb2NrZXRfZXZlbnQsCiAJLmlkX3RhYmxlCT0gdnhwX2lkcywKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvdW5kX2NvcmUuYyBiL3NvdW5kL3NvdW5kX2NvcmUuYwppbmRleCAyMWE2OWUwLi45NTRmOTk0IDEwMDY0NAotLS0gYS9zb3VuZC9zb3VuZF9jb3JlLmMKKysrIGIvc291bmQvc291bmRfY29yZS5jCkBAIC0xNTMsNyArMTUzLDcgQEAKICAqCWxpc3QuIEFjcXVpcmVzIGxvY2tzIGFzIG5lZWRlZAogICovCiAKLXN0YXRpYyBpbnQgc291bmRfaW5zZXJ0X3VuaXQoc3RydWN0IHNvdW5kX3VuaXQgKipsaXN0LCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLCBpbnQgaW5kZXgsIGludCBsb3csIGludCB0b3AsIGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSkKK3N0YXRpYyBpbnQgc291bmRfaW5zZXJ0X3VuaXQoc3RydWN0IHNvdW5kX3VuaXQgKipsaXN0LCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLCBpbnQgaW5kZXgsIGludCBsb3csIGludCB0b3AsIGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSwgc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBzb3VuZF91bml0ICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKIAlpbnQgcjsKQEAgLTE3NSw3ICsxNzUsNyBAQAogCWRldmZzX21rX2NkZXYoTUtERVYoU09VTkRfTUFKT1IsIHMtPnVuaXRfbWlub3IpLAogCQkJU19JRkNIUiB8IG1vZGUsIHMtPm5hbWUpOwogCWNsYXNzX2RldmljZV9jcmVhdGUoc291bmRfY2xhc3MsIE1LREVWKFNPVU5EX01BSk9SLCBzLT51bml0X21pbm9yKSwKLQkJCQlOVUxMLCBzLT5uYW1lKzYpOworCQkJICAgIGRldiwgcy0+bmFtZSs2KTsKIAlyZXR1cm4gcjsKIAogIGZhaWw6CkBAIC0yMjcsMTYgKzIyNywxOCBAQAogc3RhdGljIHN0cnVjdCBzb3VuZF91bml0ICpjaGFpbnNbU09VTkRfU1RFUF07CiAKIC8qKgotICoJcmVnaXN0ZXJfc291bmRfc3BlY2lhbCAtIHJlZ2lzdGVyIGEgc3BlY2lhbCBzb3VuZCBub2RlCisgKglyZWdpc3Rlcl9zb3VuZF9zcGVjaWFsX2RldmljZSAtIHJlZ2lzdGVyIGEgc3BlY2lhbCBzb3VuZCBub2RlCiAgKglAZm9wczogRmlsZSBvcGVyYXRpb25zIGZvciB0aGUgZHJpdmVyCiAgKglAdW5pdDogVW5pdCBudW1iZXIgdG8gYWxsb2NhdGUKKyAqICAgICAgQGRldjogZGV2aWNlIHBvaW50ZXIKICAqCiAgKglBbGxvY2F0ZSBhIHNwZWNpYWwgc291bmQgZGV2aWNlIGJ5IG1pbm9yIG51bWJlciBmcm9tIHRoZSBzb3VuZAogICoJc3Vic3lzdGVtLiBUaGUgYWxsb2NhdGVkIG51bWJlciBpcyByZXR1cm5lZCBvbiBzdWNjZXMuIE9uIGZhaWx1cmUKICAqCWEgbmVnYXRpdmUgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4KICAqLwogIAotaW50IHJlZ2lzdGVyX3NvdW5kX3NwZWNpYWwoc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywgaW50IHVuaXQpCitpbnQgcmVnaXN0ZXJfc291bmRfc3BlY2lhbF9kZXZpY2Uoc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywgaW50IHVuaXQsCisJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJY29uc3QgaW50IGNoYWluID0gdW5pdCAlIFNPVU5EX1NURVA7CiAJaW50IG1heF91bml0ID0gMTI4ICsgY2hhaW47CkBAIC0yOTQsOSArMjk2LDE2IEBACiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gc291bmRfaW5zZXJ0X3VuaXQoJmNoYWluc1tjaGFpbl0sIGZvcHMsIC0xLCB1bml0LCBtYXhfdW5pdCwKLQkJCQkgbmFtZSwgU19JUlVTUiB8IFNfSVdVU1IpOworCQkJCSBuYW1lLCBTX0lSVVNSIHwgU19JV1VTUiwgZGV2KTsKIH0KICAKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfc291bmRfc3BlY2lhbF9kZXZpY2UpOworCitpbnQgcmVnaXN0ZXJfc291bmRfc3BlY2lhbChzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLCBpbnQgdW5pdCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfc291bmRfc3BlY2lhbF9kZXZpY2UoZm9wcywgdW5pdCwgTlVMTCk7Cit9CisKIEVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfc291bmRfc3BlY2lhbCk7CiAKIC8qKgpAQCAtMzEyLDcgKzMyMSw3IEBACiBpbnQgcmVnaXN0ZXJfc291bmRfbWl4ZXIoc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywgaW50IGRldikKIHsKIAlyZXR1cm4gc291bmRfaW5zZXJ0X3VuaXQoJmNoYWluc1swXSwgZm9wcywgZGV2LCAwLCAxMjgsCi0JCQkJICJtaXhlciIsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKwkJCQkgIm1peGVyIiwgU19JUlVTUiB8IFNfSVdVU1IsIE5VTEwpOwogfQogCiBFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX3NvdW5kX21peGVyKTsKQEAgLTMzMCw3ICszMzksNyBAQAogaW50IHJlZ2lzdGVyX3NvdW5kX21pZGkoc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywgaW50IGRldikKIHsKIAlyZXR1cm4gc291bmRfaW5zZXJ0X3VuaXQoJmNoYWluc1syXSwgZm9wcywgZGV2LCAyLCAxMzAsCi0JCQkJICJtaWRpIiwgU19JUlVTUiB8IFNfSVdVU1IpOworCQkJCSAibWlkaSIsIFNfSVJVU1IgfCBTX0lXVVNSLCBOVUxMKTsKIH0KIAogRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9zb3VuZF9taWRpKTsKQEAgLTM1Niw3ICszNjUsNyBAQAogaW50IHJlZ2lzdGVyX3NvdW5kX2RzcChzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLCBpbnQgZGV2KQogewogCXJldHVybiBzb3VuZF9pbnNlcnRfdW5pdCgmY2hhaW5zWzNdLCBmb3BzLCBkZXYsIDMsIDEzMSwKLQkJCQkgImRzcCIsIFNfSVdVU1IgfCBTX0lSVVNSKTsKKwkJCQkgImRzcCIsIFNfSVdVU1IgfCBTX0lSVVNSLCBOVUxMKTsKIH0KIAogRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9zb3VuZF9kc3ApOwpAQCAtMzc1LDcgKzM4NCw3IEBACiBpbnQgcmVnaXN0ZXJfc291bmRfc3ludGgoc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywgaW50IGRldikKIHsKIAlyZXR1cm4gc291bmRfaW5zZXJ0X3VuaXQoJmNoYWluc1s5XSwgZm9wcywgZGV2LCA5LCAxMzcsCi0JCQkJICJzeW50aCIsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKwkJCQkgInN5bnRoIiwgU19JUlVTUiB8IFNfSVdVU1IsIE5VTEwpOwogfQogCiBFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX3NvdW5kX3N5bnRoKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9zeW50aC5jIGIvc291bmQvc3ludGgvZW11eC9lbXV4X3N5bnRoLmMKaW5kZXggZjEzYjAzOC4uNzUxYmYxMiAxMDA2NDQKLS0tIGEvc291bmQvc3ludGgvZW11eC9lbXV4X3N5bnRoLmMKKysrIGIvc291bmQvc3ludGgvZW11eC9lbXV4X3N5bnRoLmMKQEAgLTk4LDcgKzk4LDYgQEAKIAkJdnAgPSBlbXUtPm9wcy5nZXRfdm9pY2UoZW11LCBwb3J0KTsKIAkJaWYgKHZwID09IE5VTEwgfHwgdnAtPmNoIDwgMCkKIAkJCWNvbnRpbnVlOwotCQlzbmRfYXNzZXJ0KHZwLT5lbXUgIT0gTlVMTCAmJiB2cC0+aHcgIT0gTlVMTCwgcmV0dXJuKTsKIAkJaWYgKFNUQVRFX0lTX1BMQVlJTkcodnAtPnN0YXRlKSkKIAkJCWVtdS0+b3BzLnRlcm1pbmF0ZSh2cCk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JhdWRpby5jIGIvc291bmQvdXNiL3VzYmF1ZGlvLmMKaW5kZXggODI5OGM0Ni4uYmZiZWM1OCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzYmF1ZGlvLmMKKysrIGIvc291bmQvdXNiL3VzYmF1ZGlvLmMKQEAgLTQxLDEwICs0MSwxMiBAQAogI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CkBAIC03OSw3ICs4MSw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKHZpZCwgIlZlbmRvciBJRCBmb3IgdGhlIFVTQiBhdWRpbyBkZXZpY2UuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkocGlkLCBpbnQsIE5VTEwsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwaWQsICJQcm9kdWN0IElEIGZvciB0aGUgVVNCIGF1ZGlvIGRldmljZS4iKTsKLW1vZHVsZV9wYXJhbShucnBhY2tzLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKG5ycGFja3MsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5ycGFja3MsICJNYXguIG51bWJlciBvZiBwYWNrZXRzIHBlciBVUkIuIik7CiBtb2R1bGVfcGFyYW0oYXN5bmNfdW5saW5rLCBib29sLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYXN5bmNfdW5saW5rLCAiVXNlIGFzeW5jIHVubGluayBtb2RlLiIpOwpAQCAtOTcsNyArOTksNyBAQAogCiAjZGVmaW5lIE1BWF9QQUNLUwkxMAogI2RlZmluZSBNQVhfUEFDS1NfSFMJKE1BWF9QQUNLUyAqIDgpCS8qIGluIGhpZ2ggc3BlZWQgbW9kZSAqLwotI2RlZmluZSBNQVhfVVJCUwk1CS8qIG1heC4gMjBtcyBsb25nIHBhY2tldHMgKi8KKyNkZWZpbmUgTUFYX1VSQlMJOAogI2RlZmluZSBTWU5DX1VSQlMJNAkvKiBhbHdheXMgZm91ciB1cmJzIGZvciBzeW5jICovCiAjZGVmaW5lIE1JTl9QQUNLU19VUkIJMQkvKiBtaW5pbXVtIDEgcGFja2V0IHBlciB1cmIgKi8KIApAQCAtMTI2LDExICsxMjgsMTAgQEAKIAogc3RydWN0IHNuZF91cmJfY3R4IHsKIAlzdHJ1Y3QgdXJiICp1cmI7CisJdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplOwkvKiBzaXplIG9mIGRhdGEgYnVmZmVyLCBpZiBkYXRhIFVSQiAqLwogCXNuZF91c2Jfc3Vic3RyZWFtX3QgKnN1YnM7CiAJaW50IGluZGV4OwkvKiBpbmRleCBmb3IgdXJiIGFycmF5ICovCiAJaW50IHBhY2tldHM7CS8qIG51bWJlciBvZiBwYWNrZXRzIHBlciB1cmIgKi8KLQlpbnQgdHJhbnNmZXI7CS8qIHRyYW5zZmVycmVkIHNpemUgKi8KLQljaGFyICpidWY7CS8qIGJ1ZmZlciBmb3IgY2FwdHVyZSAqLwogfTsKIAogc3RydWN0IHNuZF91cmJfb3BzIHsKQEAgLTE2NSwxMiArMTY2LDExIEBACiAJdW5zaWduZWQgaW50IGN1cmZyYW1lc2l6ZTsJLyogY3VycmVudCBwYWNrZXQgc2l6ZSBpbiBmcmFtZXMgKGZvciBjYXB0dXJlKSAqLwogCXVuc2lnbmVkIGludCBmaWxsX21heDogMTsJLyogZmlsbCBtYXggcGFja2V0IHNpemUgYWx3YXlzICovCiAJdW5zaWduZWQgaW50IGZtdF90eXBlOwkJLyogVVNCIGF1ZGlvIGZvcm1hdCB0eXBlICgxLTMpICovCisJdW5zaWduZWQgaW50IHBhY2tzX3Blcl9tczsJLyogcGFja2V0cyBwZXIgbWlsbGlzZWNvbmQgKGZvciBwbGF5YmFjaykgKi8KIAogCXVuc2lnbmVkIGludCBydW5uaW5nOiAxOwkvKiBydW5uaW5nIHN0YXR1cyAqLwogCi0JdW5zaWduZWQgaW50IGh3cHRyOwkJCS8qIGZyZWUgZnJhbWUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAob25seSBmb3IgcGxheWJhY2spICovCiAJdW5zaWduZWQgaW50IGh3cHRyX2RvbmU7CQkJLyogcHJvY2Vzc2VkIGZyYW1lIHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQl1bnNpZ25lZCBpbnQgdHJhbnNmZXJfc2NoZWQ7CQkvKiBzY2hlZHVsZWQgZnJhbWVzIHNpbmNlIGxhc3QgcGVyaW9kIChmb3IgcGxheWJhY2spICovCiAJdW5zaWduZWQgaW50IHRyYW5zZmVyX2RvbmU7CQkvKiBwcm9jZXNzZWQgZnJhbWVzIHNpbmNlIGxhc3QgcGVyaW9kIHVwZGF0ZSAqLwogCXVuc2lnbmVkIGxvbmcgYWN0aXZlX21hc2s7CS8qIGJpdG1hc2sgb2YgYWN0aXZlIHVyYnMgKi8KIAl1bnNpZ25lZCBsb25nIHVubGlua19tYXNrOwkvKiBiaXRtYXNrIG9mIHVubGlua2VkIHVyYnMgKi8KQEAgLTE3OCwxMyArMTc4LDE0IEBACiAJdW5zaWduZWQgaW50IG51cmJzOwkJCS8qICMgdXJicyAqLwogCXNuZF91cmJfY3R4X3QgZGF0YXVyYltNQVhfVVJCU107CS8qIGRhdGEgdXJiIHRhYmxlICovCiAJc25kX3VyYl9jdHhfdCBzeW5jdXJiW1NZTkNfVVJCU107CS8qIHN5bmMgdXJiIHRhYmxlICovCi0JY2hhciBzeW5jYnVmW1NZTkNfVVJCUyAqIDRdOwkvKiBzeW5jIGJ1ZmZlcjsgaXQncyBzbyBzbWFsbCAtIGxldCdzIGdldCBzdGF0aWMgKi8KLQljaGFyICp0bXBidWY7CQkJLyogdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgcGxheWJhY2sgKi8KKwljaGFyICpzeW5jYnVmOwkJCQkvKiBzeW5jIGJ1ZmZlciBmb3IgYWxsIHN5bmMgVVJCcyAqLworCWRtYV9hZGRyX3Qgc3luY19kbWE7CQkJLyogRE1BIGFkZHJlc3Mgb2Ygc3luY2J1ZiAqLwogCiAJdTY0IGZvcm1hdHM7CQkJLyogZm9ybWF0IGJpdG1hc2tzIChhbGwgb3InZWQpICovCiAJdW5zaWduZWQgaW50IG51bV9mb3JtYXRzOwkJLyogbnVtYmVyIG9mIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzIChsaXN0KSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZm10X2xpc3Q7CS8qIGZvcm1hdCBsaXN0ICovCiAJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBzdGFydF9wZXJpb2RfZWxhcHNlZDsJLyogZm9yIHN0YXJ0IHRyaWdnZXIgKi8KIAogCXN0cnVjdCBzbmRfdXJiX29wcyBvcHM7CQkvKiBjYWxsYmFja3MgKG11c3QgYmUgZmlsbGVkIGF0IGluaXQpICovCiB9OwpAQCAtMzExLDI3ICszMTIsMTcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJaW50IGksIG9mZnM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzbmRfdXJiX2N0eF90ICpjdHggPSAoc25kX3VyYl9jdHhfdCAqKXVyYi0+Y29udGV4dDsKIAogCW9mZnMgPSAwOwogCXVyYi0+ZGV2ID0gY3R4LT5zdWJzLT5kZXY7IC8qIHdlIG5lZWQgdG8gc2V0IHRoaXMgYXQgZWFjaCB0aW1lICovCi0JdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IDA7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN1YnMtPmxvY2ssIGZsYWdzKTsKIAlmb3IgKGkgPSAwOyBpIDwgY3R4LT5wYWNrZXRzOyBpKyspIHsKIAkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgPSBvZmZzOwogCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IHN1YnMtPmN1cnBhY2tzaXplOwogCQlvZmZzICs9IHN1YnMtPmN1cnBhY2tzaXplOwotCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzKys7Ci0JCXN1YnMtPnRyYW5zZmVyX3NjaGVkICs9IHN1YnMtPmN1cmZyYW1lc2l6ZTsKLQkJaWYgKHN1YnMtPnRyYW5zZmVyX3NjaGVkID49IHJ1bnRpbWUtPnBlcmlvZF9zaXplKSB7Ci0JCQlzdWJzLT50cmFuc2Zlcl9zY2hlZCAtPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKLQkJCWJyZWFrOwotCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN1YnMtPmxvY2ssIGZsYWdzKTsKLQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGN0eC0+YnVmOwogCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IG9mZnM7CisJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IGN0eC0+cGFja2V0czsKICNpZiAwIC8vIGZvciBjaGVjawogCWlmICghIHVyYi0+YmFuZHdpZHRoKSB7CiAJCWludCBidXN0aW1lOwpAQCAtMzU5LDYgKzM1MCw3IEBACiAJdW5zaWduZWQgY2hhciAqY3A7CiAJaW50IGk7CiAJdW5zaWduZWQgaW50IHN0cmlkZSwgbGVuLCBvbGRwdHI7CisJaW50IHBlcmlvZF9lbGFwc2VkID0gMDsKIAogCXN0cmlkZSA9IHJ1bnRpbWUtPmZyYW1lX2JpdHMgPj4gMzsKIApAQCAtMzc4LDYgKzM3MCwxMCBAQAogCQlpZiAoc3Vicy0+aHdwdHJfZG9uZSA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKIAkJCXN1YnMtPmh3cHRyX2RvbmUgLT0gcnVudGltZS0+YnVmZmVyX3NpemU7CiAJCXN1YnMtPnRyYW5zZmVyX2RvbmUgKz0gbGVuOworCQlpZiAoc3Vicy0+dHJhbnNmZXJfZG9uZSA+PSBydW50aW1lLT5wZXJpb2Rfc2l6ZSkgeworCQkJc3Vicy0+dHJhbnNmZXJfZG9uZSAtPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKwkJCXBlcmlvZF9lbGFwc2VkID0gMTsKKwkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJzLT5sb2NrLCBmbGFncyk7CiAJCS8qIGNvcHkgYSBkYXRhIGNodW5rICovCiAJCWlmIChvbGRwdHIgKyBsZW4gPiBydW50aW1lLT5idWZmZXJfc2l6ZSkgewpAQCAtMzg4LDE1ICszODQsOSBAQAogCQl9IGVsc2UgewogCQkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhICsgb2xkcHRyICogc3RyaWRlLCBjcCwgbGVuICogc3RyaWRlKTsKIAkJfQotCQkvKiB1cGRhdGUgdGhlIHBvaW50ZXIsIGNhbGwgY2FsbGJhY2sgaWYgbmVjZXNzYXJ5ICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdWJzLT5sb2NrLCBmbGFncyk7Ci0JCWlmIChzdWJzLT50cmFuc2Zlcl9kb25lID49IHJ1bnRpbWUtPnBlcmlvZF9zaXplKSB7Ci0JCQlzdWJzLT50cmFuc2Zlcl9kb25lIC09IHJ1bnRpbWUtPnBlcmlvZF9zaXplOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOwotCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzLT5wY21fc3Vic3RyZWFtKTsKLQkJfSBlbHNlCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJzLT5sb2NrLCBmbGFncyk7CiAJfQorCWlmIChwZXJpb2RfZWxhcHNlZCkKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzLT5wY21fc3Vic3RyZWFtKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDkyLDEyICs0ODIsMTAgQEAKIC8qCiAgKiBwcmVwYXJlIHVyYiBmb3IgcGxheWJhY2sgZGF0YSBwaXBlCiAgKgotICogd2UgY29weSB0aGUgZGF0YSBkaXJlY3RseSBmcm9tIHRoZSBwY20gYnVmZmVyLgotICogdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gYmUgY29waWVkIGlzIGhlbGQgaW4gaHdwdHIgZmllbGQuCi0gKiBzaW5jZSBhIHVyYiBjYW4gaGFuZGxlIG9ubHkgYSBzaW5nbGUgbGluZWFyIGJ1ZmZlciwgaWYgdGhlIHRvdGFsCi0gKiB0cmFuc2ZlcnJlZCBhcmVhIG92ZXJmbG93cyB0aGUgYnVmZmVyIGJvdW5kYXJ5LCB3ZSBjYW5ub3Qgc2VuZAotICogaXQgZGlyZWN0bHkgZnJvbSB0aGUgYnVmZmVyLiAgdGh1cyB0aGUgZGF0YSBpcyBvbmNlIGNvcGllZCB0bwotICogYSB0ZW1wb3JhcnkgYnVmZmVyIGFuZCB1cmIgcG9pbnRzIHRvIHRoYXQuCisgKiBTaW5jZSBhIFVSQiBjYW4gaGFuZGxlIG9ubHkgYSBzaW5nbGUgbGluZWFyIGJ1ZmZlciwgd2UgbXVzdCB1c2UgZG91YmxlCisgKiBidWZmZXJpbmcgd2hlbiB0aGUgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBvdmVyZmxvd3MgdGhlIGJ1ZmZlciBib3VuZGFyeS4KKyAqIFRvIGF2b2lkIGluY29uc2lzdGVuY2llcyB3aGVuIHVwZGF0aW5nIGh3cHRyX2RvbmUsIHdlIHVzZSBkb3VibGUgYnVmZmVyaW5nCisgKiBmb3IgYWxsIFVSQnMuCiAgKi8KIHN0YXRpYyBpbnQgcHJlcGFyZV9wbGF5YmFja191cmIoc25kX3VzYl9zdWJzdHJlYW1fdCAqc3VicywKIAkJCQlzbmRfcGNtX3J1bnRpbWVfdCAqcnVudGltZSwKQEAgLTUwNiw2ICs0OTQsNyBAQAogCWludCBpLCBzdHJpZGUsIG9mZnM7CiAJdW5zaWduZWQgaW50IGNvdW50czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwZXJpb2RfZWxhcHNlZCA9IDA7CiAJc25kX3VyYl9jdHhfdCAqY3R4ID0gKHNuZF91cmJfY3R4X3QgKil1cmItPmNvbnRleHQ7CiAKIAlzdHJpZGUgPSBydW50aW1lLT5mcmFtZV9iaXRzID4+IDM7CkBAIC01MzAsODAgKzUxOSw4NSBAQAogCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IGNvdW50cyAqIHN0cmlkZTsKIAkJb2ZmcyArPSBjb3VudHM7CiAJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMrKzsKLQkJc3Vicy0+dHJhbnNmZXJfc2NoZWQgKz0gY291bnRzOwotCQlpZiAoc3Vicy0+dHJhbnNmZXJfc2NoZWQgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKLQkJCXN1YnMtPnRyYW5zZmVyX3NjaGVkIC09IHJ1bnRpbWUtPnBlcmlvZF9zaXplOworCQlzdWJzLT50cmFuc2Zlcl9kb25lICs9IGNvdW50czsKKwkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKKwkJCXN1YnMtPnRyYW5zZmVyX2RvbmUgLT0gcnVudGltZS0+cGVyaW9kX3NpemU7CisJCQlwZXJpb2RfZWxhcHNlZCA9IDE7CiAJCQlpZiAoc3Vicy0+Zm10X3R5cGUgPT0gVVNCX0ZPUk1BVF9UWVBFX0lJKSB7Ci0JCQkJaWYgKHN1YnMtPnRyYW5zZmVyX3NjaGVkID4gMCkgewotCQkJCQkvKiBGSVhNRTogZmlsbC1tYXggbW9kZSBpcyBub3Qgc3VwcG9ydGVkIHlldCAqLwotCQkJCQlvZmZzIC09IHN1YnMtPnRyYW5zZmVyX3NjaGVkOwotCQkJCQljb3VudHMgLT0gc3Vicy0+dHJhbnNmZXJfc2NoZWQ7Ci0JCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoID0gY291bnRzICogc3RyaWRlOwotCQkJCQlzdWJzLT50cmFuc2Zlcl9zY2hlZCA9IDA7CisJCQkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPiAwKSB7CisJCQkJCS8qIEZJWE1FOiBmaWxsLW1heCBtb2RlIGlzIG5vdAorCQkJCQkgKiBzdXBwb3J0ZWQgeWV0ICovCisJCQkJCW9mZnMgLT0gc3Vicy0+dHJhbnNmZXJfZG9uZTsKKwkJCQkJY291bnRzIC09IHN1YnMtPnRyYW5zZmVyX2RvbmU7CisJCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoID0KKwkJCQkJCWNvdW50cyAqIHN0cmlkZTsKKwkJCQkJc3Vicy0+dHJhbnNmZXJfZG9uZSA9IDA7CiAJCQkJfQogCQkJCWkrKzsKIAkJCQlpZiAoaSA8IGN0eC0+cGFja2V0cykgewogCQkJCQkvKiBhZGQgYSB0cmFuc2ZlciBkZWxpbWl0ZXIgKi8KLQkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgPSBvZmZzICogc3RyaWRlOworCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldCA9CisJCQkJCQlvZmZzICogc3RyaWRlOwogCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IDA7CiAJCQkJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMrKzsKIAkJCQl9CisJCQkJYnJlYWs7CiAJCQl9Ci0JCQlicmVhazsKICAJCX0KKwkJLyogZmluaXNoIGF0IHRoZSBmcmFtZSBib3VuZGFyeSBhdC9hZnRlciB0aGUgcGVyaW9kIGJvdW5kYXJ5ICovCisJCWlmIChwZXJpb2RfZWxhcHNlZCAmJgorCQkgICAgKGkgJiAoc3Vicy0+cGFja3NfcGVyX21zIC0gMSkpID09IHN1YnMtPnBhY2tzX3Blcl9tcyAtIDEpCisJCQlicmVhazsKIAl9Ci0JaWYgKHN1YnMtPmh3cHRyICsgb2ZmcyA+IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSB7Ci0JCS8qIGVyciwgdGhlIHRyYW5zZmVycmVkIGFyZWEgZ29lcyBvdmVyIGJ1ZmZlciBib3VuZGFyeS4KLQkJICogY29weSB0aGUgZGF0YSB0byB0aGUgdGVtcCBidWZmZXIuCi0JCSAqLwotCQlpbnQgbGVuOwotCQlsZW4gPSBydW50aW1lLT5idWZmZXJfc2l6ZSAtIHN1YnMtPmh3cHRyOwotCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHN1YnMtPnRtcGJ1ZjsKLQkJbWVtY3B5KHN1YnMtPnRtcGJ1ZiwgcnVudGltZS0+ZG1hX2FyZWEgKyBzdWJzLT5od3B0ciAqIHN0cmlkZSwgbGVuICogc3RyaWRlKTsKLQkJbWVtY3B5KHN1YnMtPnRtcGJ1ZiArIGxlbiAqIHN0cmlkZSwgcnVudGltZS0+ZG1hX2FyZWEsIChvZmZzIC0gbGVuKSAqIHN0cmlkZSk7Ci0JCXN1YnMtPmh3cHRyICs9IG9mZnM7Ci0JCXN1YnMtPmh3cHRyIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCWlmIChzdWJzLT5od3B0cl9kb25lICsgb2ZmcyA+IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSB7CisJCS8qIGVyciwgdGhlIHRyYW5zZmVycmVkIGFyZWEgZ29lcyBvdmVyIGJ1ZmZlciBib3VuZGFyeS4gKi8KKwkJdW5zaWduZWQgaW50IGxlbiA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gc3Vicy0+aHdwdHJfZG9uZTsKKwkJbWVtY3B5KHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkgICAgICAgcnVudGltZS0+ZG1hX2FyZWEgKyBzdWJzLT5od3B0cl9kb25lICogc3RyaWRlLAorCQkgICAgICAgbGVuICogc3RyaWRlKTsKKwkJbWVtY3B5KHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgbGVuICogc3RyaWRlLAorCQkgICAgICAgcnVudGltZS0+ZG1hX2FyZWEsCisJCSAgICAgICAob2ZmcyAtIGxlbikgKiBzdHJpZGUpOwogCX0gZWxzZSB7Ci0JCS8qIHNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KLQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBydW50aW1lLT5kbWFfYXJlYSArIHN1YnMtPmh3cHRyICogc3RyaWRlOwotCQlzdWJzLT5od3B0ciArPSBvZmZzOwotCQlpZiAoc3Vicy0+aHdwdHIgPT0gcnVudGltZS0+YnVmZmVyX3NpemUpCi0JCQlzdWJzLT5od3B0ciA9IDA7CisJCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJICAgICAgIHJ1bnRpbWUtPmRtYV9hcmVhICsgc3Vicy0+aHdwdHJfZG9uZSAqIHN0cmlkZSwKKwkJICAgICAgIG9mZnMgKiBzdHJpZGUpOwogCX0KKwlzdWJzLT5od3B0cl9kb25lICs9IG9mZnM7CisJaWYgKHN1YnMtPmh3cHRyX2RvbmUgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpCisJCXN1YnMtPmh3cHRyX2RvbmUgLT0gcnVudGltZS0+YnVmZmVyX3NpemU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOwogCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IG9mZnMgKiBzdHJpZGU7Ci0JY3R4LT50cmFuc2ZlciA9IG9mZnM7Ci0KKwlpZiAocGVyaW9kX2VsYXBzZWQpIHsKKwkJaWYgKGxpa2VseShzdWJzLT5ydW5uaW5nKSkKKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vicy0+cGNtX3N1YnN0cmVhbSk7CisJCWVsc2UKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnN1YnMtPnN0YXJ0X3BlcmlvZF9lbGFwc2VkKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBwcm9jZXNzIGFmdGVyIHBsYXliYWNrIGRhdGEgY29tcGxldGUKLSAqCi0gKiB1cGRhdGUgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGNhbGwgY2FsbGJhY2sgaWYgYSBwZXJpb2QgaXMgcHJvY2Vzc2VkLgorICogLSBub3RoaW5nIHRvIGRvCiAgKi8KIHN0YXRpYyBpbnQgcmV0aXJlX3BsYXliYWNrX3VyYihzbmRfdXNiX3N1YnN0cmVhbV90ICpzdWJzLAogCQkJICAgICAgIHNuZF9wY21fcnVudGltZV90ICpydW50aW1lLAogCQkJICAgICAgIHN0cnVjdCB1cmIgKnVyYikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNuZF91cmJfY3R4X3QgKmN0eCA9IChzbmRfdXJiX2N0eF90ICopdXJiLT5jb250ZXh0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN1YnMtPmxvY2ssIGZsYWdzKTsKLQlzdWJzLT50cmFuc2Zlcl9kb25lICs9IGN0eC0+dHJhbnNmZXI7Ci0Jc3Vicy0+aHdwdHJfZG9uZSArPSBjdHgtPnRyYW5zZmVyOwotCWN0eC0+dHJhbnNmZXIgPSAwOwotCWlmIChzdWJzLT5od3B0cl9kb25lID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQotCQlzdWJzLT5od3B0cl9kb25lIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwotCWlmIChzdWJzLT50cmFuc2Zlcl9kb25lID49IHJ1bnRpbWUtPnBlcmlvZF9zaXplKSB7Ci0JCXN1YnMtPnRyYW5zZmVyX2RvbmUgLT0gcnVudGltZS0+cGVyaW9kX3NpemU7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN1YnMtPmxvY2ssIGZsYWdzKTsKLQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzLT5wY21fc3Vic3RyZWFtKTsKLQl9IGVsc2UKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCisvKgorICogRGVsYXkgdGhlIHNuZF9wY21fcGVyaW9kX2VsYXBzZWQoKSBjYWxsIHVudGlsIGFmdGVyIHRoZSBzdGFydCB0cmlnZ2VyCisgKiBjYWxsYmFjayBzbyB0aGF0IHdlJ3JlIG5vdCBsb25nZXIgaW4gdGhlIHN1YnN0cmVhbSdzIGxvY2suCisgKi8KK3N0YXRpYyB2b2lkIHN0YXJ0X3BlcmlvZF9lbGFwc2VkKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzbmRfdXNiX3N1YnN0cmVhbV90ICpzdWJzID0gKHNuZF91c2Jfc3Vic3RyZWFtX3QgKilkYXRhOworCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vicy0+cGNtX3N1YnN0cmVhbSk7Cit9CisKIAogLyoKICAqLwpAQCAtNjgzLDYgKzY3Nyw0MiBAQAogfQogCiAKKy8qIGdldCB0aGUgcGh5c2ljYWwgcGFnZSBwb2ludGVyIGF0IHRoZSBnaXZlbiBvZmZzZXQgKi8KK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqc25kX3BjbV9nZXRfdm1hbGxvY19wYWdlKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnMsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJdm9pZCAqcGFnZXB0ciA9IHN1YnMtPnJ1bnRpbWUtPmRtYV9hcmVhICsgb2Zmc2V0OworCXJldHVybiB2bWFsbG9jX3RvX3BhZ2UocGFnZXB0cik7Cit9CisKKy8qIGFsbG9jYXRlIHZpcnR1YWwgYnVmZmVyOyBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlICovCitzdGF0aWMgaW50IHNuZF9wY21fYWxsb2Nfdm1hbGxvY19idWZmZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vicywgc2l6ZV90IHNpemUpCit7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzLT5ydW50aW1lOworCWlmIChydW50aW1lLT5kbWFfYXJlYSkgeworCQlpZiAocnVudGltZS0+ZG1hX2J5dGVzID49IHNpemUpCisJCQlyZXR1cm4gMDsgLyogYWxyZWFkeSBsYXJnZSBlbm91Z2ggKi8KKwkJdmZyZWVfbm9jaGVjayhydW50aW1lLT5kbWFfYXJlYSk7CisJfQorCXJ1bnRpbWUtPmRtYV9hcmVhID0gdm1hbGxvY19ub2NoZWNrKHNpemUpOworCWlmICghIHJ1bnRpbWUtPmRtYV9hcmVhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlydW50aW1lLT5kbWFfYnl0ZXMgPSBzaXplOworCXJldHVybiAwOworfQorCisvKiBmcmVlIHZpcnR1YWwgYnVmZmVyOyBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlICovCitzdGF0aWMgaW50IHNuZF9wY21fZnJlZV92bWFsbG9jX2J1ZmZlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzKQoreworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vicy0+cnVudGltZTsKKwlpZiAocnVudGltZS0+ZG1hX2FyZWEpIHsKKwkJdmZyZWVfbm9jaGVjayhydW50aW1lLT5kbWFfYXJlYSk7CisJCXJ1bnRpbWUtPmRtYV9hcmVhID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwogLyoKICAqIHVubGluayBhY3RpdmUgdXJicy4KICAqLwpAQCAtNzA1LDEwICs3MzUsOSBAQAogCQlpZiAodGVzdF9iaXQoaSwgJnN1YnMtPmFjdGl2ZV9tYXNrKSkgewogCQkJaWYgKCEgdGVzdF9hbmRfc2V0X2JpdChpLCAmc3Vicy0+dW5saW5rX21hc2spKSB7CiAJCQkJc3RydWN0IHVyYiAqdSA9IHN1YnMtPmRhdGF1cmJbaV0udXJiOwotCQkJCWlmIChhc3luYykgewotCQkJCQl1LT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOworCQkJCWlmIChhc3luYykKIAkJCQkJdXNiX3VubGlua191cmIodSk7Ci0JCQkJfSBlbHNlCisJCQkJZWxzZQogCQkJCQl1c2Jfa2lsbF91cmIodSk7CiAJCQl9CiAJCX0KQEAgLTcxOCwxMCArNzQ3LDkgQEAKIAkJCWlmICh0ZXN0X2JpdChpKzE2LCAmc3Vicy0+YWN0aXZlX21hc2spKSB7CiAgCQkJCWlmICghIHRlc3RfYW5kX3NldF9iaXQoaSsxNiwgJnN1YnMtPnVubGlua19tYXNrKSkgewogCQkJCQlzdHJ1Y3QgdXJiICp1ID0gc3Vicy0+c3luY3VyYltpXS51cmI7Ci0JCQkJCWlmIChhc3luYykgewotCQkJCQkJdS0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsKKwkJCQkJaWYgKGFzeW5jKQogCQkJCQkJdXNiX3VubGlua191cmIodSk7Ci0JCQkJCX0gZWxzZQorCQkJCQllbHNlCiAJCQkJCQl1c2Jfa2lsbF91cmIodSk7CiAJCQkJfQogCQkJfQpAQCAtODI0LDggKzg1MiwxNCBAQAogICovCiBzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX3VzYl9wY21fcG9pbnRlcihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCiB7Ci0Jc25kX3VzYl9zdWJzdHJlYW1fdCAqc3VicyA9IChzbmRfdXNiX3N1YnN0cmVhbV90ICopc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JcmV0dXJuIHN1YnMtPmh3cHRyX2RvbmU7CisJc25kX3VzYl9zdWJzdHJlYW1fdCAqc3ViczsKKwlzbmRfcGNtX3VmcmFtZXNfdCBod3B0cl9kb25lOworCQorCXN1YnMgPSAoc25kX3VzYl9zdWJzdHJlYW1fdCAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXNwaW5fbG9jaygmc3Vicy0+bG9jayk7CisJaHdwdHJfZG9uZSA9IHN1YnMtPmh3cHRyX2RvbmU7CisJc3Bpbl91bmxvY2soJnN1YnMtPmxvY2spOworCXJldHVybiBod3B0cl9kb25lOwogfQogCiAKQEAgLTg1OCwxMSArODkyLDEzIEBACiBzdGF0aWMgdm9pZCByZWxlYXNlX3VyYl9jdHgoc25kX3VyYl9jdHhfdCAqdSkKIHsKIAlpZiAodS0+dXJiKSB7CisJCWlmICh1LT5idWZmZXJfc2l6ZSkKKwkJCXVzYl9idWZmZXJfZnJlZSh1LT5zdWJzLT5kZXYsIHUtPmJ1ZmZlcl9zaXplLAorCQkJCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkJdS0+dXJiLT50cmFuc2Zlcl9kbWEpOwogCQl1c2JfZnJlZV91cmIodS0+dXJiKTsKIAkJdS0+dXJiID0gTlVMTDsKIAl9Ci0Ja2ZyZWUodS0+YnVmKTsKLQl1LT5idWYgPSBOVUxMOwogfQogCiAvKgpAQCAtODgwLDggKzkxNiw5IEBACiAJCXJlbGVhc2VfdXJiX2N0eCgmc3Vicy0+ZGF0YXVyYltpXSk7CiAJZm9yIChpID0gMDsgaSA8IFNZTkNfVVJCUzsgaSsrKQogCQlyZWxlYXNlX3VyYl9jdHgoJnN1YnMtPnN5bmN1cmJbaV0pOwotCWtmcmVlKHN1YnMtPnRtcGJ1Zik7Ci0Jc3Vicy0+dG1wYnVmID0gTlVMTDsKKwl1c2JfYnVmZmVyX2ZyZWUoc3Vicy0+ZGV2LCBTWU5DX1VSQlMgKiA0LAorCQkJc3Vicy0+c3luY2J1Ziwgc3Vicy0+c3luY19kbWEpOworCXN1YnMtPnN5bmNidWYgPSBOVUxMOwogCXN1YnMtPm51cmJzID0gMDsKIH0KIApAQCAtODkzLDcgKzkzMCw3IEBACiB7CiAJdW5zaWduZWQgaW50IG1heHNpemUsIG4sIGk7CiAJaW50IGlzX3BsYXliYWNrID0gc3Vicy0+ZGlyZWN0aW9uID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7Ci0JdW5zaWduZWQgaW50IG5wYWNrc1tNQVhfVVJCU10sIHVyYl9wYWNrcywgdG90YWxfcGFja3M7CisJdW5zaWduZWQgaW50IG5wYWNrc1tNQVhfVVJCU10sIHVyYl9wYWNrcywgdG90YWxfcGFja3MsIHBhY2tzX3Blcl9tczsKIAogCS8qIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5IGluIDE2LjE2IGZvcm1hdCAqLwogCWlmIChzbmRfdXNiX2dldF9zcGVlZChzdWJzLT5kZXYpID09IFVTQl9TUEVFRF9GVUxMKQpAQCAtOTIwLDI0ICs5NTcsNDAgQEAKIAllbHNlCiAJCXN1YnMtPmN1cnBhY2tzaXplID0gbWF4c2l6ZTsKIAotCWlmIChzbmRfdXNiX2dldF9zcGVlZChzdWJzLT5kZXYpID09IFVTQl9TUEVFRF9GVUxMKQotCQl1cmJfcGFja3MgPSBucnBhY2tzOworCWlmIChzbmRfdXNiX2dldF9zcGVlZChzdWJzLT5kZXYpID09IFVTQl9TUEVFRF9ISUdIKQorCQlwYWNrc19wZXJfbXMgPSA4ID4+IHN1YnMtPmRhdGFpbnRlcnZhbDsKIAllbHNlCi0JCXVyYl9wYWNrcyA9IChucnBhY2tzICogOCkgPj4gc3Vicy0+ZGF0YWludGVydmFsOworCQlwYWNrc19wZXJfbXMgPSAxOworCXN1YnMtPnBhY2tzX3Blcl9tcyA9IHBhY2tzX3Blcl9tczsKIAotCS8qIGFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgcGxheWJhY2sgKi8KIAlpZiAoaXNfcGxheWJhY2spIHsKLQkJc3Vicy0+dG1wYnVmID0ga21hbGxvYyhtYXhzaXplICogdXJiX3BhY2tzLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCEgc3Vicy0+dG1wYnVmKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWFsbG9jIHRtcGJ1ZlxuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCX0KKwkJdXJiX3BhY2tzID0gbnJwYWNrczsKKwkJdXJiX3BhY2tzID0gbWF4KHVyYl9wYWNrcywgKHVuc2lnbmVkIGludClNSU5fUEFDS1NfVVJCKTsKKwkJdXJiX3BhY2tzID0gbWluKHVyYl9wYWNrcywgKHVuc2lnbmVkIGludClNQVhfUEFDS1MpOworCX0gZWxzZQorCQl1cmJfcGFja3MgPSAxOworCXVyYl9wYWNrcyAqPSBwYWNrc19wZXJfbXM7CiAKIAkvKiBkZWNpZGUgaG93IG1hbnkgcGFja2V0cyB0byBiZSB1c2VkICovCi0JdG90YWxfcGFja3MgPSAocGVyaW9kX2J5dGVzICsgbWF4c2l6ZSAtIDEpIC8gbWF4c2l6ZTsKLQlpZiAodG90YWxfcGFja3MgPCAyICogTUlOX1BBQ0tTX1VSQikKLQkJdG90YWxfcGFja3MgPSAyICogTUlOX1BBQ0tTX1VSQjsKKwlpZiAoaXNfcGxheWJhY2spIHsKKwkJdW5zaWduZWQgaW50IG1pbnNpemU7CisJCS8qIGRldGVybWluZSBob3cgc21hbGwgYSBwYWNrZXQgY2FuIGJlICovCisJCW1pbnNpemUgPSAoc3Vicy0+ZnJlcW4gPj4gKDE2IC0gc3Vicy0+ZGF0YWludGVydmFsKSkKKwkJCSAgKiAoZnJhbWVfYml0cyA+PiAzKTsKKwkJLyogd2l0aCBzeW5jIGZyb20gZGV2aWNlLCBhc3N1bWUgaXQgY2FuIGJlIDEyJSBsb3dlciAqLworCQlpZiAoc3Vicy0+c3luY3BpcGUpCisJCQltaW5zaXplIC09IG1pbnNpemUgPj4gMzsKKwkJbWluc2l6ZSA9IG1heChtaW5zaXplLCAxdSk7CisJCXRvdGFsX3BhY2tzID0gKHBlcmlvZF9ieXRlcyArIG1pbnNpemUgLSAxKSAvIG1pbnNpemU7CisJCS8qIHJvdW5kIHVwIHRvIG11bHRpcGxlIG9mIHBhY2tzX3Blcl9tcyAqLworCQl0b3RhbF9wYWNrcyA9ICh0b3RhbF9wYWNrcyArIHBhY2tzX3Blcl9tcyAtIDEpCisJCQkJJiB+KHBhY2tzX3Blcl9tcyAtIDEpOworCQkvKiB3ZSBuZWVkIGF0IGxlYXN0IHR3byBVUkJzIGZvciBxdWV1ZWluZyAqLworCQlpZiAodG90YWxfcGFja3MgPCAyICogTUlOX1BBQ0tTX1VSQiAqIHBhY2tzX3Blcl9tcykKKwkJCXRvdGFsX3BhY2tzID0gMiAqIE1JTl9QQUNLU19VUkIgKiBwYWNrc19wZXJfbXM7CisJfSBlbHNlIHsKKwkJdG90YWxfcGFja3MgPSBNQVhfVVJCUyAqIHVyYl9wYWNrczsKKwl9CiAJc3Vicy0+bnVyYnMgPSAodG90YWxfcGFja3MgKyB1cmJfcGFja3MgLSAxKSAvIHVyYl9wYWNrczsKIAlpZiAoc3Vicy0+bnVyYnMgPiBNQVhfVVJCUykgewogCQkvKiB0b28gbXVjaC4uLiAqLwpAQCAtOTU2LDcgKzEwMDksNyBAQAogCQlzdWJzLT5udXJicyA9IDI7CiAJCW5wYWNrc1swXSA9ICh0b3RhbF9wYWNrcyArIDEpIC8gMjsKIAkJbnBhY2tzWzFdID0gdG90YWxfcGFja3MgLSBucGFja3NbMF07Ci0JfSBlbHNlIGlmIChucGFja3Nbc3Vicy0+bnVyYnMtMV0gPCBNSU5fUEFDS1NfVVJCKSB7CisJfSBlbHNlIGlmIChucGFja3Nbc3Vicy0+bnVyYnMtMV0gPCBNSU5fUEFDS1NfVVJCICogcGFja3NfcGVyX21zKSB7CiAJCS8qIHRoZSBsYXN0IHBhY2tldCBpcyB0b28gc21hbGwuLiAqLwogCQlpZiAoc3Vicy0+bnVyYnMgPiAyKSB7CiAJCQkvKiBtZXJnZSB0byB0aGUgZmlyc3Qgb25lICovCkBAIC05NzUsMjcgKzEwMjgsMjAgQEAKIAkJc25kX3VyYl9jdHhfdCAqdSA9ICZzdWJzLT5kYXRhdXJiW2ldOwogCQl1LT5pbmRleCA9IGk7CiAJCXUtPnN1YnMgPSBzdWJzOwotCQl1LT50cmFuc2ZlciA9IDA7CiAJCXUtPnBhY2tldHMgPSBucGFja3NbaV07CisJCXUtPmJ1ZmZlcl9zaXplID0gbWF4c2l6ZSAqIHUtPnBhY2tldHM7CiAJCWlmIChzdWJzLT5mbXRfdHlwZSA9PSBVU0JfRk9STUFUX1RZUEVfSUkpCiAJCQl1LT5wYWNrZXRzKys7IC8qIGZvciB0cmFuc2ZlciBkZWxpbWl0ZXIgKi8KLQkJaWYgKCEgaXNfcGxheWJhY2spIHsKLQkJCS8qIGFsbG9jYXRlIGEgY2FwdHVyZSBidWZmZXIgcGVyIHVyYiAqLwotCQkJdS0+YnVmID0ga21hbGxvYyhtYXhzaXplICogdS0+cGFja2V0cywgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoISB1LT5idWYpIHsKLQkJCQlyZWxlYXNlX3N1YnN0cmVhbV91cmJzKHN1YnMsIDApOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQl9CiAJCXUtPnVyYiA9IHVzYl9hbGxvY191cmIodS0+cGFja2V0cywgR0ZQX0tFUk5FTCk7Ci0JCWlmICghIHUtPnVyYikgewotCQkJcmVsZWFzZV9zdWJzdHJlYW1fdXJicyhzdWJzLCAwKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCXUtPnVyYi0+ZGV2ID0gc3Vicy0+ZGV2OworCQlpZiAoISB1LT51cmIpCisJCQlnb3RvIG91dF9vZl9tZW1vcnk7CisJCXUtPnVyYi0+dHJhbnNmZXJfYnVmZmVyID0KKwkJCXVzYl9idWZmZXJfYWxsb2Moc3Vicy0+ZGV2LCB1LT5idWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCwKKwkJCQkJICZ1LT51cmItPnRyYW5zZmVyX2RtYSk7CisJCWlmICghIHUtPnVyYi0+dHJhbnNmZXJfYnVmZmVyKQorCQkJZ290byBvdXRfb2ZfbWVtb3J5OwogCQl1LT51cmItPnBpcGUgPSBzdWJzLT5kYXRhcGlwZTsKLQkJdS0+dXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKLQkJdS0+dXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IHUtPnBhY2tldHM7CisJCXUtPnVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVAgfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAkJdS0+dXJiLT5pbnRlcnZhbCA9IDEgPDwgc3Vicy0+ZGF0YWludGVydmFsOwogCQl1LT51cmItPmNvbnRleHQgPSB1OwogCQl1LT51cmItPmNvbXBsZXRlID0gc25kX3VzYl9jb21wbGV0ZV9jYWxsYmFjayhzbmRfY29tcGxldGVfdXJiKTsKQEAgLTEwMDMsMjEgKzEwNDksMjQgQEAKIAogCWlmIChzdWJzLT5zeW5jcGlwZSkgewogCQkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzeW5jIHVyYnMgKi8KKwkJc3Vicy0+c3luY2J1ZiA9IHVzYl9idWZmZXJfYWxsb2Moc3Vicy0+ZGV2LCBTWU5DX1VSQlMgKiA0LAorCQkJCQkJIEdGUF9LRVJORUwsICZzdWJzLT5zeW5jX2RtYSk7CisJCWlmICghIHN1YnMtPnN5bmNidWYpCisJCQlnb3RvIG91dF9vZl9tZW1vcnk7CiAJCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykgewogCQkJc25kX3VyYl9jdHhfdCAqdSA9ICZzdWJzLT5zeW5jdXJiW2ldOwogCQkJdS0+aW5kZXggPSBpOwogCQkJdS0+c3VicyA9IHN1YnM7CiAJCQl1LT5wYWNrZXRzID0gMTsKIAkJCXUtPnVyYiA9IHVzYl9hbGxvY191cmIoMSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoISB1LT51cmIpIHsKLQkJCQlyZWxlYXNlX3N1YnN0cmVhbV91cmJzKHN1YnMsIDApOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQorCQkJaWYgKCEgdS0+dXJiKQorCQkJCWdvdG8gb3V0X29mX21lbW9yeTsKIAkJCXUtPnVyYi0+dHJhbnNmZXJfYnVmZmVyID0gc3Vicy0+c3luY2J1ZiArIGkgKiA0OworCQkJdS0+dXJiLT50cmFuc2Zlcl9kbWEgPSBzdWJzLT5zeW5jX2RtYSArIGkgKiA0OwogCQkJdS0+dXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gNDsKLQkJCXUtPnVyYi0+ZGV2ID0gc3Vicy0+ZGV2OwogCQkJdS0+dXJiLT5waXBlID0gc3Vicy0+c3luY3BpcGU7Ci0JCQl1LT51cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQkJdS0+dXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUCB8CisJCQkJCQkgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAJCQl1LT51cmItPm51bWJlcl9vZl9wYWNrZXRzID0gMTsKIAkJCXUtPnVyYi0+aW50ZXJ2YWwgPSAxIDw8IHN1YnMtPnN5bmNpbnRlcnZhbDsKIAkJCXUtPnVyYi0+Y29udGV4dCA9IHU7CkBAIC0xMDI1LDYgKzEwNzQsMTAgQEAKIAkJfQogCX0KIAlyZXR1cm4gMDsKKworb3V0X29mX21lbW9yeToKKwlyZWxlYXNlX3N1YnN0cmVhbV91cmJzKHN1YnMsIDApOworCXJldHVybiAtRU5PTUVNOwogfQogCiAKQEAgLTEyOTMsNyArMTM0Niw4IEBACiAJdW5zaWduZWQgaW50IGNoYW5uZWxzLCByYXRlLCBmb3JtYXQ7CiAJaW50IHJldCwgY2hhbmdlZDsKIAotCXJldCA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CisJcmV0ID0gc25kX3BjbV9hbGxvY192bWFsbG9jX2J1ZmZlcihzdWJzdHJlYW0sCisJCQkJCSAgIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTEzNDksNyArMTQwMyw3IEBACiAJc3Vicy0+Y3VyX3JhdGUgPSAwOwogCXN1YnMtPnBlcmlvZF9ieXRlcyA9IDA7CiAJcmVsZWFzZV9zdWJzdHJlYW1fdXJicyhzdWJzLCAwKTsKLQlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCXJldHVybiBzbmRfcGNtX2ZyZWVfdm1hbGxvY19idWZmZXIoc3Vic3RyZWFtKTsKIH0KIAogLyoKQEAgLTEzNzIsOSArMTQyNiw3IEBACiAJc3Vicy0+Y3VyZnJhbWVzaXplID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIHN1YnMtPmN1cnBhY2tzaXplKTsKIAogCS8qIHJlc2V0IHRoZSBwb2ludGVyICovCi0Jc3Vicy0+aHdwdHIgPSAwOwogCXN1YnMtPmh3cHRyX2RvbmUgPSAwOwotCXN1YnMtPnRyYW5zZmVyX3NjaGVkID0gMDsKIAlzdWJzLT50cmFuc2Zlcl9kb25lID0gMDsKIAlzdWJzLT5waGFzZSA9IDA7CiAKQEAgLTEzOTAsNyArMTQ0Miw3IEBACiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAotCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKKwkuYnVmZmVyX2J5dGVzX21heCA9CSgyNTYqMTAyNCksCiAJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKIAkucGVyaW9kX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCiAJLnBlcmlvZHNfbWluID0JCTIsCkBAIC0xNDAyLDcgKzE0NTQsNyBAQAogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKLQkuYnVmZmVyX2J5dGVzX21heCA9CSgxMjgqMTAyNCksCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMjU2KjEwMjQpLAogCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCiAJLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAogCS5wZXJpb2RzX21pbiA9CQkyLApAQCAtMTc5NCw2ICsxODQ2LDcgQEAKIAkucHJlcGFyZSA9CXNuZF91c2JfcGNtX3ByZXBhcmUsCiAJLnRyaWdnZXIgPQlzbmRfdXNiX3BjbV90cmlnZ2VyLAogCS5wb2ludGVyID0Jc25kX3VzYl9wY21fcG9pbnRlciwKKwkucGFnZSA9CQlzbmRfcGNtX2dldF92bWFsbG9jX3BhZ2UsCiB9OwogCiBzdGF0aWMgc25kX3BjbV9vcHNfdCBzbmRfdXNiX2NhcHR1cmVfb3BzID0gewpAQCAtMTgwNSw2ICsxODU4LDcgQEAKIAkucHJlcGFyZSA9CXNuZF91c2JfcGNtX3ByZXBhcmUsCiAJLnRyaWdnZXIgPQlzbmRfdXNiX3BjbV90cmlnZ2VyLAogCS5wb2ludGVyID0Jc25kX3VzYl9wY21fcG9pbnRlciwKKwkucGFnZSA9CQlzbmRfcGNtX2dldF92bWFsbG9jX3BhZ2UsCiB9OwogCiAKQEAgLTIwMjEsNiArMjA3NSw5IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmc3Vicy0+Zm10X2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZzdWJzLT5sb2NrKTsKKwlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXRhc2tsZXRfaW5pdCgmc3Vicy0+c3RhcnRfcGVyaW9kX2VsYXBzZWQsIHN0YXJ0X3BlcmlvZF9lbGFwc2VkLAorCQkJICAgICAodW5zaWduZWQgbG9uZylzdWJzKTsKIAogCXN1YnMtPnN0cmVhbSA9IGFzOwogCXN1YnMtPmRpcmVjdGlvbiA9IHN0cmVhbTsKQEAgLTIwMjksMTAgKzIwODYsNiBAQAogCQlzdWJzLT5vcHMgPSBhdWRpb191cmJfb3BzW3N0cmVhbV07CiAJZWxzZQogCQlzdWJzLT5vcHMgPSBhdWRpb191cmJfb3BzX2hpZ2hfc3BlZWRbc3RyZWFtXTsKLQlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlcyhhcy0+cGNtLT5zdHJlYW1zW3N0cmVhbV0uc3Vic3RyZWFtLAotCQkJCSAgICAgIFNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVMsCi0JCQkJICAgICAgc25kX2RtYV9jb250aW51b3VzX2RhdGEoR0ZQX0tFUk5FTCksCi0JCQkJICAgICAgNjQgKiAxMDI0LCAxMjggKiAxMDI0KTsKIAlzbmRfcGNtX3NldF9vcHMoYXMtPnBjbSwgc3RyZWFtLAogCQkJc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPwogCQkJJnNuZF91c2JfcGxheWJhY2tfb3BzIDogJnNuZF91c2JfY2FwdHVyZV9vcHMpOwpAQCAtMjA3OCw3ICsyMTMxLDYgQEAKIAlzbmRfdXNiX3N0cmVhbV90ICpzdHJlYW0gPSBwY20tPnByaXZhdGVfZGF0YTsKIAlpZiAoc3RyZWFtKSB7CiAJCXN0cmVhbS0+cGNtID0gTlVMTDsKLQkJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7CiAJCXNuZF91c2JfYXVkaW9fc3RyZWFtX2ZyZWUoc3RyZWFtKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXNibWlkaS5jIGIvc291bmQvdXNiL3VzYm1pZGkuYwppbmRleCA1Nzc4YTliLi45M2RlZGRlIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNibWlkaS5jCisrKyBiL3NvdW5kL3VzYi91c2JtaWRpLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgpAQCAtNTYsNiArNTcsMTIgQEAKICAqLwogLyogI2RlZmluZSBEVU1QX1BBQ0tFVFMgKi8KIAorLyoKKyAqIGhvdyBsb25nIHRvIHdhaXQgYWZ0ZXIgc29tZSBVU0IgZXJyb3JzLCBzbyB0aGF0IGtodWJkIGNhbiBkaXNjb25uZWN0KCkgdXMKKyAqIHdpdGhvdXQgdG9vIG1hbnkgc3B1cmlvdXMgZXJyb3JzCisgKi8KKyNkZWZpbmUgRVJST1JfREVMQVlfSklGRklFUyAoSFogLyAxMCkKKwogCiBNT0RVTEVfQVVUSE9SKCJDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVVNCIEF1ZGlvL01JREkgaGVscGVyIG1vZHVsZSIpOwpAQCAtMTAwLDYgKzEwNyw3IEBACiAJc25kX3Jhd21pZGlfdCogcm1pZGk7CiAJc3RydWN0IHVzYl9wcm90b2NvbF9vcHMqIHVzYl9wcm90b2NvbF9vcHM7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB0aW1lcl9saXN0IGVycm9yX3RpbWVyOwogCiAJc3RydWN0IHNuZF91c2JfbWlkaV9lbmRwb2ludCB7CiAJCXNuZF91c2JfbWlkaV9vdXRfZW5kcG9pbnRfdCAqb3V0OwpAQCAtMTQxLDcgKzE0OSw4IEBACiAJc3RydWN0IHVzYm1pZGlfaW5fcG9ydCB7CiAJCXNuZF9yYXdtaWRpX3N1YnN0cmVhbV90KiBzdWJzdHJlYW07CiAJfSBwb3J0c1sweDEwXTsKLQlpbnQgc2Vlbl9mNTsKKwl1OCBzZWVuX2Y1OworCXU4IGVycm9yX3Jlc3VibWl0OwogCWludCBjdXJyZW50X3BvcnQ7CiB9OwogCkBAIC0xNjcsMTQgKzE3NiwyMiBAQAogICovCiBzdGF0aWMgaW50IHNuZF91c2JtaWRpX3VyYl9lcnJvcihpbnQgc3RhdHVzKQogewotCWlmIChzdGF0dXMgPT0gLUVOT0VOVCkKLQkJcmV0dXJuIHN0YXR1czsgLyoga2lsbGVkICovCi0JaWYgKHN0YXR1cyA9PSAtRUlMU0VRIHx8Ci0JICAgIHN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAotCSAgICBzdGF0dXMgPT0gLUVUSU1FRE9VVCkKLQkJcmV0dXJuIC1FTk9ERVY7IC8qIGRldmljZSByZW1vdmVkL3NodXRkb3duICovCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAidXJiIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKLQlyZXR1cm4gMDsgLyogY29udGludWUgKi8KKwlzd2l0Y2ggKHN0YXR1cykgeworCS8qIG1hbnVhbGx5IHVubGlua2VkLCBvciBkZXZpY2UgZ29uZSAqLworCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVTSFVURE9XTjoKKwljYXNlIC1FTk9ERVY6CisJCXJldHVybiAtRU5PREVWOworCS8qIGVycm9ycyB0aGF0IG1pZ2h0IG9jY3VyIGR1cmluZyB1bnBsdWdnaW5nICovCisJY2FzZSAtRVBST1RPOiAgICAvKiBFSENJICovCisJY2FzZSAtRVRJTUVET1VUOiAvKiBPSENJICovCisJY2FzZSAtRUlMU0VROiAgICAvKiBVSENJICovCisJCXJldHVybiAtRUlPOworCWRlZmF1bHQ6CisJCXNuZF9wcmludGsoS0VSTl9FUlIgInVyYiBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisJCXJldHVybiAwOyAvKiBjb250aW51ZSAqLworCX0KIH0KIAogLyoKQEAgLTIxOCw4ICsyMzUsMTUgQEAKIAkJZXAtPnVtaWRpLT51c2JfcHJvdG9jb2xfb3BzLT5pbnB1dChlcCwgdXJiLT50cmFuc2Zlcl9idWZmZXIsCiAJCQkJCQkgICB1cmItPmFjdHVhbF9sZW5ndGgpOwogCX0gZWxzZSB7Ci0JCWlmIChzbmRfdXNibWlkaV91cmJfZXJyb3IodXJiLT5zdGF0dXMpIDwgMCkKKwkJaW50IGVyciA9IHNuZF91c2JtaWRpX3VyYl9lcnJvcih1cmItPnN0YXR1cyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlpZiAoZXJyICE9IC1FTk9ERVYpIHsKKwkJCQllcC0+ZXJyb3JfcmVzdWJtaXQgPSAxOworCQkJCW1vZF90aW1lcigmZXAtPnVtaWRpLT5lcnJvcl90aW1lciwKKwkJCQkJICBqaWZmaWVzICsgRVJST1JfREVMQVlfSklGRklFUyk7CisJCQl9CiAJCQlyZXR1cm47CisJCX0KIAl9CiAKIAlpZiAodXNiX3BpcGVfbmVlZHNfcmVzdWJtaXQodXJiLT5waXBlKSkgewpAQCAtMjM2LDggKzI2MCwxMyBAQAogCWVwLT51cmJfYWN0aXZlID0gMDsKIAlzcGluX3VubG9jaygmZXAtPmJ1ZmZlcl9sb2NrKTsKIAlpZiAodXJiLT5zdGF0dXMgPCAwKSB7Ci0JCWlmIChzbmRfdXNibWlkaV91cmJfZXJyb3IodXJiLT5zdGF0dXMpIDwgMCkKKwkJaW50IGVyciA9IHNuZF91c2JtaWRpX3VyYl9lcnJvcih1cmItPnN0YXR1cyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlpZiAoZXJyICE9IC1FTk9ERVYpCisJCQkJbW9kX3RpbWVyKCZlcC0+dW1pZGktPmVycm9yX3RpbWVyLAorCQkJCQkgIGppZmZpZXMgKyBFUlJPUl9ERUxBWV9KSUZGSUVTKTsKIAkJCXJldHVybjsKKwkJfQogCX0KIAlzbmRfdXNibWlkaV9kb19vdXRwdXQoZXApOwogfQpAQCAtMjc2LDYgKzMwNSwyNCBAQAogCXNuZF91c2JtaWRpX2RvX291dHB1dChlcCk7CiB9CiAKKy8qIGNhbGxlZCBhZnRlciB0cmFuc2ZlcnMgaGFkIGJlZW4gaW50ZXJydXB0ZWQgZHVlIHRvIHNvbWUgVVNCIGVycm9yICovCitzdGF0aWMgdm9pZCBzbmRfdXNibWlkaV9lcnJvcl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc25kX3VzYl9taWRpX3QgKnVtaWRpID0gKHNuZF91c2JfbWlkaV90ICopZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNSURJX01BWF9FTkRQT0lOVFM7ICsraSkgeworCQlzbmRfdXNiX21pZGlfaW5fZW5kcG9pbnRfdCAqaW4gPSB1bWlkaS0+ZW5kcG9pbnRzW2ldLmluOworCQlpZiAoaW4gJiYgaW4tPmVycm9yX3Jlc3VibWl0KSB7CisJCQlpbi0+ZXJyb3JfcmVzdWJtaXQgPSAwOworCQkJaW4tPnVyYi0+ZGV2ID0gdW1pZGktPmNoaXAtPmRldjsKKwkJCXNuZF91c2JtaWRpX3N1Ym1pdF91cmIoaW4tPnVyYiwgR0ZQX0FUT01JQyk7CisJCX0KKwkJaWYgKHVtaWRpLT5lbmRwb2ludHNbaV0ub3V0KQorCQkJc25kX3VzYm1pZGlfZG9fb3V0cHV0KHVtaWRpLT5lbmRwb2ludHNbaV0ub3V0KTsKKwl9Cit9CisKIC8qIGhlbHBlciBmdW5jdGlvbiB0byBzZW5kIHN0YXRpYyBkYXRhIHRoYXQgbWF5IG5vdCBETUEtYWJsZSAqLwogc3RhdGljIGludCBzZW5kX2J1bGtfc3RhdGljX2RhdGEoc25kX3VzYl9taWRpX291dF9lbmRwb2ludF90KiBlcCwKIAkJCQkgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikKQEAgLTU5NCwxNyArNjQxLDIwIEBACiBzdGF0aWMgdm9pZCBzbmRfdXNibWlkaV9lbWFnaWNfaW5wdXQoc25kX3VzYl9taWRpX2luX2VuZHBvaW50X3QqIGVwLAogCQkJCSAgICAgdWludDhfdCogYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCkKIHsKLQkvKiBpZ25vcmUgcGFkZGluZyBieXRlcyBhdCBlbmQgb2YgYnVmZmVyICovCi0Jd2hpbGUgKGJ1ZmZlcl9sZW5ndGggPiAwICYmIGJ1ZmZlcltidWZmZXJfbGVuZ3RoIC0gMV0gPT0gMHhmZikKLQkJLS1idWZmZXJfbGVuZ3RoOworCWludCBpOworCisJLyogRkYgaW5kaWNhdGVzIGVuZCBvZiB2YWxpZCBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7ICsraSkKKwkJaWYgKGJ1ZmZlcltpXSA9PSAweGZmKSB7CisJCQlidWZmZXJfbGVuZ3RoID0gaTsKKwkJCWJyZWFrOworCQl9CiAKIAkvKiBoYW5kbGUgRjUgYXQgZW5kIG9mIGxhc3QgYnVmZmVyICovCiAJaWYgKGVwLT5zZWVuX2Y1KQogCQlnb3RvIHN3aXRjaF9wb3J0OwogCiAJd2hpbGUgKGJ1ZmZlcl9sZW5ndGggPiAwKSB7Ci0JCWludCBpOwotCiAJCS8qIGRldGVybWluZSBzaXplIG9mIGRhdGEgdW50aWwgbmV4dCBGNSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgKytpKQogCQkJaWYgKGJ1ZmZlcltpXSA9PSAweGY1KQpAQCAtNjcxLDYgKzcyMSwxMCBAQAogCQkJCWJyZWFrOwogCQl9CiAJfQorCWlmIChidWZfZnJlZSA8IGVwLT5tYXhfdHJhbnNmZXIgJiYgYnVmX2ZyZWUgPiAwKSB7CisJCSpidWYgPSAweGZmOworCQktLWJ1Zl9mcmVlOworCX0KIAllcC0+dXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gZXAtPm1heF90cmFuc2ZlciAtIGJ1Zl9mcmVlOwogfQogCkBAIC03NjUsNyArODE5LDEwIEBACiBzdGF0aWMgdm9pZCBzbmRfdXNibWlkaV9pbl9lbmRwb2ludF9kZWxldGUoc25kX3VzYl9taWRpX2luX2VuZHBvaW50X3QqIGVwKQogewogCWlmIChlcC0+dXJiKSB7Ci0JCWtmcmVlKGVwLT51cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJCXVzYl9idWZmZXJfZnJlZShlcC0+dW1pZGktPmNoaXAtPmRldiwKKwkJCQllcC0+dXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJCWVwLT51cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQllcC0+dXJiLT50cmFuc2Zlcl9kbWEpOwogCQl1c2JfZnJlZV91cmIoZXAtPnVyYik7CiAJfQogCWtmcmVlKGVwKTsKQEAgLTc5OSw3ICs4NTYsOCBAQAogCWVsc2UKIAkJcGlwZSA9IHVzYl9yY3ZidWxrcGlwZSh1bWlkaS0+Y2hpcC0+ZGV2LCBlcF9pbmZvLT5pbl9lcCk7CiAJbGVuZ3RoID0gdXNiX21heHBhY2tldCh1bWlkaS0+Y2hpcC0+ZGV2LCBwaXBlLCAwKTsKLQlidWZmZXIgPSBrbWFsbG9jKGxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJYnVmZmVyID0gdXNiX2J1ZmZlcl9hbGxvYyh1bWlkaS0+Y2hpcC0+ZGV2LCBsZW5ndGgsIEdGUF9LRVJORUwsCisJCQkJICAmZXAtPnVyYi0+dHJhbnNmZXJfZG1hKTsKIAlpZiAoIWJ1ZmZlcikgewogCQlzbmRfdXNibWlkaV9pbl9lbmRwb2ludF9kZWxldGUoZXApOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTgxMiw2ICs4NzAsNyBAQAogCQl1c2JfZmlsbF9idWxrX3VyYihlcC0+dXJiLCB1bWlkaS0+Y2hpcC0+ZGV2LCBwaXBlLCBidWZmZXIsIGxlbmd0aCwKIAkJCQkgIHNuZF91c2JfY29tcGxldGVfY2FsbGJhY2soc25kX3VzYm1pZGlfaW5fdXJiX2NvbXBsZXRlKSwKIAkJCQkgIGVwKTsKKwllcC0+dXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCiAJcmVwLT5pbiA9IGVwOwogCXJldHVybiAwOwpAQCAtODMyLDEwICs4OTEsMTAgQEAKICAqLwogc3RhdGljIHZvaWQgc25kX3VzYm1pZGlfb3V0X2VuZHBvaW50X2RlbGV0ZShzbmRfdXNiX21pZGlfb3V0X2VuZHBvaW50X3QqIGVwKQogewotCWlmIChlcC0+dGFza2xldC5mdW5jKQotCQl0YXNrbGV0X2tpbGwoJmVwLT50YXNrbGV0KTsKIAlpZiAoZXAtPnVyYikgewotCQlrZnJlZShlcC0+dXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQl1c2JfYnVmZmVyX2ZyZWUoZXAtPnVtaWRpLT5jaGlwLT5kZXYsIGVwLT5tYXhfdHJhbnNmZXIsCisJCQkJZXAtPnVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCWVwLT51cmItPnRyYW5zZmVyX2RtYSk7CiAJCXVzYl9mcmVlX3VyYihlcC0+dXJiKTsKIAl9CiAJa2ZyZWUoZXApOwpAQCAtODY3LDcgKzkyNiw4IEBACiAJLyogd2UgbmV2ZXIgdXNlIGludGVycnVwdCBvdXRwdXQgcGlwZXMgKi8KIAlwaXBlID0gdXNiX3NuZGJ1bGtwaXBlKHVtaWRpLT5jaGlwLT5kZXYsIGVwX2luZm8tPm91dF9lcCk7CiAJZXAtPm1heF90cmFuc2ZlciA9IHVzYl9tYXhwYWNrZXQodW1pZGktPmNoaXAtPmRldiwgcGlwZSwgMSk7Ci0JYnVmZmVyID0ga21hbGxvYyhlcC0+bWF4X3RyYW5zZmVyLCBHRlBfS0VSTkVMKTsKKwlidWZmZXIgPSB1c2JfYnVmZmVyX2FsbG9jKHVtaWRpLT5jaGlwLT5kZXYsIGVwLT5tYXhfdHJhbnNmZXIsCisJCQkJICBHRlBfS0VSTkVMLCAmZXAtPnVyYi0+dHJhbnNmZXJfZG1hKTsKIAlpZiAoIWJ1ZmZlcikgewogCQlzbmRfdXNibWlkaV9vdXRfZW5kcG9pbnRfZGVsZXRlKGVwKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC04NzUsNiArOTM1LDcgQEAKIAl1c2JfZmlsbF9idWxrX3VyYihlcC0+dXJiLCB1bWlkaS0+Y2hpcC0+ZGV2LCBwaXBlLCBidWZmZXIsCiAJCQkgIGVwLT5tYXhfdHJhbnNmZXIsCiAJCQkgIHNuZF91c2JfY29tcGxldGVfY2FsbGJhY2soc25kX3VzYm1pZGlfb3V0X3VyYl9jb21wbGV0ZSksIGVwKTsKKwllcC0+dXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCiAJc3Bpbl9sb2NrX2luaXQoJmVwLT5idWZmZXJfbG9jayk7CiAJdGFza2xldF9pbml0KCZlcC0+dGFza2xldCwgc25kX3VzYm1pZGlfb3V0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKWVwKTsKQEAgLTkxOCw4ICs5NzksMTEgQEAKIAlpbnQgaTsKIAogCXVtaWRpID0gbGlzdF9lbnRyeShwLCBzbmRfdXNiX21pZGlfdCwgbGlzdCk7CisJZGVsX3RpbWVyX3N5bmMoJnVtaWRpLT5lcnJvcl90aW1lcik7CiAJZm9yIChpID0gMDsgaSA8IE1JRElfTUFYX0VORFBPSU5UUzsgKytpKSB7CiAJCXNuZF91c2JfbWlkaV9lbmRwb2ludF90KiBlcCA9ICZ1bWlkaS0+ZW5kcG9pbnRzW2ldOworCQlpZiAoZXAtPm91dCkKKwkJCXRhc2tsZXRfa2lsbCgmZXAtPm91dC0+dGFza2xldCk7CiAJCWlmIChlcC0+b3V0ICYmIGVwLT5vdXQtPnVyYikgewogCQkJdXNiX2tpbGxfdXJiKGVwLT5vdXQtPnVyYik7CiAJCQlpZiAodW1pZGktPnVzYl9wcm90b2NvbF9vcHMtPmZpbmlzaF9vdXRfZW5kcG9pbnQpCkBAIC0xNDgwLDYgKzE1NDQsOSBAQAogCXVtaWRpLT5pZmFjZSA9IGlmYWNlOwogCXVtaWRpLT5xdWlyayA9IHF1aXJrOwogCXVtaWRpLT51c2JfcHJvdG9jb2xfb3BzID0gJnNuZF91c2JtaWRpX3N0YW5kYXJkX29wczsKKwlpbml0X3RpbWVyKCZ1bWlkaS0+ZXJyb3JfdGltZXIpOworCXVtaWRpLT5lcnJvcl90aW1lci5mdW5jdGlvbiA9IHNuZF91c2JtaWRpX2Vycm9yX3RpbWVyOworCXVtaWRpLT5lcnJvcl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpdW1pZGk7CiAKIAkvKiBkZXRlY3QgdGhlIGVuZHBvaW50KHMpIHRvIHVzZSAqLwogCW1lbXNldChlbmRwb2ludHMsIDAsIHNpemVvZihlbmRwb2ludHMpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91c3gyeWh3ZGVwcGNtLmMgYi9zb3VuZC91c2IvdXN4MnkvdXN4Mnlod2RlcHBjbS5jCmluZGV4IGVmMjgwNjEyLi5kMDE5OWM0IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXN4MnkvdXN4Mnlod2RlcHBjbS5jCisrKyBiL3NvdW5kL3VzYi91c3gyeS91c3gyeWh3ZGVwcGNtLmMKQEAgLTYyNCw3ICs2MjQsNyBAQAogCQlmb3IgKHMgPSAwOyBzIDwgMjsgKytzKSB7CiAJCQlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW07CiAJCQlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc10uc3Vic3RyZWFtOwotCQkJaWYgKHN1YnN0cmVhbSAmJiBzdWJzdHJlYW0tPm9wZW5fZmxhZykKKwkJCWlmIChzdWJzdHJlYW0gJiYgc3Vic3RyZWFtLT5mZmlsZSAhPSBOVUxMKQogCQkJCWVyciA9IC1FQlVTWTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL3Vzci9LY29uZmlnIGIvdXNyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3MjdmMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9LY29uZmlnCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgQ29uZmlndXJhdGlvbiBmb3IgaW5pdHJhbWZzCisjCisKK2NvbmZpZyBJTklUUkFNRlNfU09VUkNFCisJc3RyaW5nICJJbml0cmFtZnMgc291cmNlIGZpbGUocykiCisJZGVmYXVsdCAiIgorCWhlbHAKKwkgIFRoaXMgY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBjcGlvIGFyY2hpdmUgd2l0aCBhIC5jcGlvIHN1ZmZpeCBvciBhCisJICBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcyBhbmQgZmlsZXMgZm9yIGJ1aWxkaW5nIHRoZQorCSAgaW5pdHJhbWZzIGltYWdlLiAgQSBjcGlvIGFyY2hpdmUgc2hvdWxkIGNvbnRhaW4gYSBmaWxlc3lzdGVtIGFyY2hpdmUKKwkgIHRvIGJlIHVzZWQgYXMgYW4gaW5pdHJhbWZzIGltYWdlLiAgRGlyZWN0b3JpZXMgc2hvdWxkIGNvbnRhaW4gYQorCSAgZmlsZXN5c3RlbSBsYXlvdXQgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGluaXRyYW1mcyBpbWFnZS4gIEZpbGVzCisJICBzaG91bGQgY29udGFpbiBlbnRyaWVzIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IGRlc2NyaWJlZCBieSB0aGUKKwkgICJ1c3IvZ2VuX2luaXRfY3BpbyIgcHJvZ3JhbSBpbiB0aGUga2VybmVsIHRyZWUuCisKKwkgIFdoZW4gbXVsdGlwbGUgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGFyZSBzcGVjaWZpZWQgdGhlbiB0aGUKKwkgIGluaXRyYW1mcyBpbWFnZSB3aWxsIGJlIHRoZSBhZ2dyZWdhdGUgb2YgYWxsIG9mIHRoZW0uCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2Vhcmx5LXVzZXJzcGFjZS9SRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KKworCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgbGVhdmUgaXQgYmxhbmsuCisKK2NvbmZpZyBJTklUUkFNRlNfUk9PVF9VSUQKKwlpbnQgIlVzZXIgSUQgdG8gbWFwIHRvIDAgKHVzZXIgcm9vdCkiCisJZGVwZW5kcyBvbiBJTklUUkFNRlNfU09VUkNFIT0iIgorCWRlZmF1bHQgIjAiCisJaGVscAorCSAgVGhpcyBzZXR0aW5nIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgSU5JVFJBTUZTX1NPVVJDRSBpcworCSAgY29udGFpbnMgYSBkaXJlY3RvcnkuICBTZXR0aW5nIHRoaXMgdXNlciBJRCAoVUlEKSB0byBzb21ldGhpbmcKKwkgIG90aGVyIHRoYW4gIjAiIHdpbGwgY2F1c2UgYWxsIGZpbGVzIG93bmVkIGJ5IHRoYXQgVUlEIHRvIGJlCisJICBvd25lZCBieSB1c2VyIHJvb3QgaW4gdGhlIGluaXRpYWwgcmFtZGlzayBpbWFnZS4KKworCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgbGVhdmUgaXQgc2V0IHRvICIwIi4KKworY29uZmlnIElOSVRSQU1GU19ST09UX0dJRAorCWludCAiR3JvdXAgSUQgdG8gbWFwIHRvIDAgKGdyb3VwIHJvb3QpIgorCWRlcGVuZHMgb24gSU5JVFJBTUZTX1NPVVJDRSE9IiIKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIFRoaXMgc2V0dGluZyBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIElOSVRSQU1GU19TT1VSQ0UgaXMKKwkgIGNvbnRhaW5zIGEgZGlyZWN0b3J5LiAgU2V0dGluZyB0aGlzIGdyb3VwIElEIChHSUQpIHRvIHNvbWV0aGluZworCSAgb3RoZXIgdGhhbiAiMCIgd2lsbCBjYXVzZSBhbGwgZmlsZXMgb3duZWQgYnkgdGhhdCBHSUQgdG8gYmUKKwkgIG93bmVkIGJ5IGdyb3VwIHJvb3QgaW4gdGhlIGluaXRpYWwgcmFtZGlzayBpbWFnZS4KKworCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgbGVhdmUgaXQgc2V0IHRvICIwIi4KZGlmZiAtLWdpdCBhL3Vzci9NYWtlZmlsZSBiL3Vzci9NYWtlZmlsZQppbmRleCAyNDhkNTU1Li5lMjEyOWNiIDEwMDY0NAotLS0gYS91c3IvTWFrZWZpbGUKKysrIGIvdXNyL01ha2VmaWxlCkBAIC0yNyw3ICsyNyw3IEBACiBmaWxlY2hrX2luaXRyYW1mc19saXN0ID0gJChDT05GSUdfU0hFTEwpIFwKICAkKHNyY3RyZWUpL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoICQoZ2VuX2luaXRyYW1mc19hcmdzKSAkKHF1b3RlZml4ZWRfaW5pdHJhbWZzX3NvdXJjZSkKIAotJChvYmopL2luaXRyYW1mc19saXN0OiBGT1JDRQorJChvYmopL2luaXRyYW1mc19saXN0OiAkKG9iaikvTWFrZWZpbGUgRk9SQ0UKIAkkKGNhbGwgZmlsZWNoayxpbml0cmFtZnNfbGlzdCkKIAogcXVpZXRfY21kX2NwaW8gPSBDUElPICAgICRACg==